ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggODBlNzFmYy4uNTRlMTc0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnCkBAIC02NSw4ICs2NSw2IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FzdXNfb2xlZC9LY29uZmlnIgpAQCAtNzksMTQgKzc3LDE0IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9taW1pby9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9mcm9udGllci9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RyZWFtL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RzdC9LY29uZmlnIgpAQCAtMTI3LDYgKzEyNSwxNiBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3N0cmlwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2FybGFuL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggNzcxOWQwNC4uMDY5ODY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtMTUsMTggKzE1LDE3IEBACiBvYmotJChDT05GSUdfT1RVUykJCSs9IG90dXMvCiBvYmotJChDT05GSUdfUlQyODYwKQkJKz0gcnQyODYwLwogb2JqLSQoQ09ORklHX1JUMjg3MCkJCSs9IHJ0Mjg3MC8KLW9iai0kKENPTkZJR19SVDMwOTApCQkrPSBydDMwOTAvCiBvYmotJChDT05GSUdfQ09NRURJKQkJKz0gY29tZWRpLwogb2JqLSQoQ09ORklHX0FTVVNfT0xFRCkJCSs9IGFzdXNfb2xlZC8KIG9iai0kKENPTkZJR19QQU5FTCkJCSs9IHBhbmVsLwogb2JqLSQoQ09ORklHX0FMVEVSQV9QQ0lFX0NIRE1BKQkrPSBhbHRwY2llY2hkbWEvCi1vYmotJChDT05GSUdfUlRMODE4N1NFKQkJKz0gcnRsODE4N3NlLworb2JqLSQoQ09ORklHX1I4MTg3U0UpCQkrPSBydGw4MTg3c2UvCiBvYmotJChDT05GSUdfUlRMODE5MlNVKQkJKz0gcnRsODE5MnN1Lworb2JqLSQoQ09ORklHX1JUTDgxOTJVKQkJKz0gcnRsODE5MnUvCiBvYmotJChDT05GSUdfUlRMODE5MkUpCQkrPSBydGw4MTkyZS8KIG9iai0kKENPTkZJR19JTlBVVF9NSU1JTykJKz0gbWltaW8vCiBvYmotJChDT05GSUdfVFJBTlpQT1JUKQkJKz0gZnJvbnRpZXIvCi1vYmotJChDT05GSUdfQU5EUk9JRCkJCSs9IGFuZHJvaWQvCi1vYmotJChDT05GSUdfQU5EUk9JRCkJCSs9IGRyZWFtLworb2JqLSQoQ09ORklHX0RSRUFNKQkJKz0gZHJlYW0vCiBvYmotJChDT05GSUdfRFNUKQkJKz0gZHN0Lwogb2JqLSQoQ09ORklHX1BPSE1FTEZTKQkJKz0gcG9obWVsZnMvCiBvYmotJChDT05GSUdfQjNERkcpCQkrPSBiM2RmZy8KQEAgLTQ0LDYgKzQzLDExIEBACiBvYmotJChDT05GSUdfUkFSX1JFR0lTVEVSKQkrPSByYXIvCiBvYmotJChDT05GSUdfRFhfU0VQKQkJKz0gc2VwLwogb2JqLSQoQ09ORklHX0lJTykJCSs9IGlpby8KK29iai0kKENPTkZJR19SQU1aU1dBUCkJCSs9IHJhbXpzd2FwLworb2JqLSQoQ09ORklHX1dMQUdTNDlfSDIpCSs9IHdsYWdzNDlfaDIvCitvYmotJChDT05GSUdfV0xBR1M0OV9IMjUpCSs9IHdsYWdzNDlfaDI1Lworb2JqLSQoQ09ORklHX0JBVE1BTl9BRFYpCSs9IGJhdG1hbi1hZHYvCitvYmotJChDT05GSUdfU0FNU1VOR19MQVBUT1ApCSs9IHNhbXN1bmctbGFwdG9wLwogb2JqLSQoQ09ORklHX1NUUklQKQkJKz0gc3RyaXAvCiBvYmotJChDT05GSUdfQVJMQU4pCQkrPSBhcmxhbi8KIG9iai0kKENPTkZJR19XQVZFTEFOKQkJKz0gd2F2ZWxhbi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvYWx0cGNpZWNoZG1hL2FsdHBjaWVjaGRtYS5jCmluZGV4IGUwYzViYTQuLjJmMDdkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbHRwY2llY2hkbWEvYWx0cGNpZWNoZG1hLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FsdHBjaWVjaGRtYS9hbHRwY2llY2hkbWEuYwpAQCAtMjEyLDcgKzIxMiw3IEBACiAJaW50IG1zaV9lbmFibGVkOwogCS8qIHdoZXRoZXIgdGhpcyBkcml2ZXIgY291bGQgb2J0YWluIHRoZSByZWdpb25zICovCiAJaW50IGdvdF9yZWdpb25zOwotCS8qIGlycSBsaW5lIHN1Y2Nlc2Z1bGx5IHJlcXVlc3RlZCBieSB0aGlzIGRyaXZlciwgLTEgb3RoZXJ3aXNlICovCisJLyogaXJxIGxpbmUgc3VjY2Vzc2Z1bGx5IHJlcXVlc3RlZCBieSB0aGlzIGRyaXZlciwgLTEgb3RoZXJ3aXNlICovCiAJaW50IGlycV9saW5lOwogCS8qIGJvYXJkIHJldmlzaW9uICovCiAJdTggcmV2aXNpb247CkBAIC0zMzYsNyArMzM2LDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkJBUlslZF0gbWFwcGVkIGF0IDB4JXAgd2l0aCBsZW5ndGggJWx1KC8lbHUpLlxuIiwgaSwKIAkJYXBlLT5iYXJbaV0sIGJhcl9taW5fbGVuW2ldLCBiYXJfbGVuZ3RoKTsKIAl9Ci0JLyogc3VjY2VzZnVsbHkgbWFwcGVkIGFsbCByZXF1aXJlZCBCQVIgcmVnaW9ucyAqLworCS8qIHN1Y2Nlc3NmdWxseSBtYXBwZWQgYWxsIHJlcXVpcmVkIEJBUiByZWdpb25zICovCiAJcmMgPSAwOwogCWdvdG8gc3VjY2VzczsKIGZhaWw6CkBAIC05MTEsNyArOTExLDcgQEAKIAkvKiBwZXJmb3JtIERNQSBlbmdpbmVzIGxvb3AgYmFjayB0ZXN0ICovCiAJcmMgPSBkbWFfdGVzdChhcGUsIGRldik7CiAJKHZvaWQpcmM7Ci0JLyogc3VjY2VzZnVsbHkgdG9vayB0aGUgZGV2aWNlICovCisJLyogc3VjY2Vzc2Z1bGx5IHRvb2sgdGhlIGRldmljZSAqLwogCXJjID0gMDsKIAlwcmludGsoS0VSTl9ERUJVRyAicHJvYmUoKSBzdWNjZXNzZnVsLlxuIik7CiAJZ290byBlbmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2NzU2My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotbWVudSAiQW5kcm9pZCIKLQotY29uZmlnIEFORFJPSUQKLQlib29sICJBbmRyb2lkIERyaXZlcnMiCi0JZGVwZW5kcyBvbiBCUk9LRU4KLQlkZWZhdWx0IE4KLQktLS1oZWxwLS0tCi0JICBFbmFibGUgc3VwcG9ydCBmb3IgdmFyaW91cyBkcml2ZXJzIG5lZWRlZCBvbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybQotCi1pZiBBTkRST0lECi0KLWNvbmZpZyBBTkRST0lEX0JJTkRFUl9JUEMKLQlib29sICJBbmRyb2lkIEJpbmRlciBJUEMgRHJpdmVyIgotCWRlZmF1bHQgbgotCi1jb25maWcgQU5EUk9JRF9MT0dHRVIKLQl0cmlzdGF0ZSAiQW5kcm9pZCBsb2cgZHJpdmVyIgotCWRlZmF1bHQgbgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRQotCWJvb2wgIkFuZHJvaWQgUkFNIGJ1ZmZlciBjb25zb2xlIgotCWRlZmF1bHQgbgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FTkFCTEVfVkVSQk9TRQotCWJvb2wgIkVuYWJsZSB2ZXJib3NlIGNvbnNvbGUgbWVzc2FnZXMgb24gQW5kcm9pZCBSQU0gY29uc29sZSIKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIEFORFJPSURfUkFNX0NPTlNPTEUKLQotbWVudWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQlib29sICJBbmRyb2lkIFJBTSBDb25zb2xlIEVuYWJsZSBlcnJvciBjb3JyZWN0aW9uIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRQotCWRlcGVuZHMgb24gIUFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCXNlbGVjdCBSRUVEX1NPTE9NT04KLQlzZWxlY3QgUkVFRF9TT0xPTU9OX0VOQzgKLQlzZWxlY3QgUkVFRF9TT0xPTU9OX0RFQzgKLQotaWYgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fREFUQV9TSVpFCi0JaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIERhdGEgZGF0YSBzaXplIgotCWRlZmF1bHQgMTI4Ci0JaGVscAotCSAgTXVzdCBiZSBhIHBvd2VyIG9mIDIuCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fRUNDX1NJWkUKLQlpbnQgIkFuZHJvaWQgUkFNIENvbnNvbGUgRUNDIHNpemUiCi0JZGVmYXVsdCAxNgotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFCi0JaW50ICJBbmRyb2lkIFJBTSBDb25zb2xlIFN5bWJvbCBzaXplIgotCWRlZmF1bHQgOAotCi1jb25maWcgQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1BPTFlOT01JQUwKLQloZXggIkFuZHJvaWQgUkFNIENvbnNvbGUgUG9seW5vbWlhbCIKLQlkZWZhdWx0IDB4MTkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDQpCi0JZGVmYXVsdCAweDI5IGlmIChBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fU1lNQk9MX1NJWkUgPSA1KQotCWRlZmF1bHQgMHg2MSBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gNikKLQlkZWZhdWx0IDB4ODkgaWYgKEFORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9TWU1CT0xfU0laRSA9IDcpCi0JZGVmYXVsdCAweDExZCBpZiAoQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFID0gOCkKLQotZW5kaWYgIyBBTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQotY29uZmlnIEFORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCWJvb2wgIlN0YXJ0IEFuZHJvaWQgUkFNIGNvbnNvbGUgZWFybHkiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIKLQloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgdmlydHVhbCBhZGRyZXNzIgotCWRlZmF1bHQgMAotCWRlcGVuZHMgb24gQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi0KLWNvbmZpZyBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUKLQloZXggIkFuZHJvaWQgUkFNIGNvbnNvbGUgYnVmZmVyIHNpemUiCi0JZGVmYXVsdCAwCi0JZGVwZW5kcyBvbiBBTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKLQotY29uZmlnIEFORFJPSURfVElNRURfT1VUUFVUCi0JYm9vbCAiVGltZWQgb3V0cHV0IGNsYXNzIGRyaXZlciIKLQlkZWZhdWx0IHkKLQotY29uZmlnIEFORFJPSURfVElNRURfR1BJTwotCXRyaXN0YXRlICJBbmRyb2lkIHRpbWVkIGdwaW8gZHJpdmVyIgotCWRlcGVuZHMgb24gR0VORVJJQ19HUElPICYmIEFORFJPSURfVElNRURfT1VUUFVUCi0JZGVmYXVsdCBuCi0KLWNvbmZpZyBBTkRST0lEX0xPV19NRU1PUllfS0lMTEVSCi0JYm9vbCAiQW5kcm9pZCBMb3cgTWVtb3J5IEtpbGxlciIKLQlkZWZhdWx0IE4KLQktLS1oZWxwLS0tCi0JICBSZWdpc3RlciBwcm9jZXNzZXMgdG8gYmUga2lsbGVkIHdoZW4gbWVtb3J5IGlzIGxvdwotCi1lbmRpZiAjIGlmIEFORFJPSUQKLQotZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwNTdlNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotb2JqLSQoQ09ORklHX0FORFJPSURfQklOREVSX0lQQykJKz0gYmluZGVyLm8KLW9iai0kKENPTkZJR19BTkRST0lEX0xPR0dFUikJCSs9IGxvZ2dlci5vCi1vYmotJChDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRSkJKz0gcmFtX2NvbnNvbGUubwotb2JqLSQoQ09ORklHX0FORFJPSURfVElNRURfT1VUUFVUKQkrPSB0aW1lZF9vdXRwdXQubwotb2JqLSQoQ09ORklHX0FORFJPSURfVElNRURfR1BJTykJKz0gdGltZWRfZ3Bpby5vCi1vYmotJChDT05GSUdfQU5EUk9JRF9MT1dfTUVNT1JZX0tJTExFUikJKz0gbG93bWVtb3J5a2lsbGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTljNWJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UT0RPOgotCS0gY2hlY2twYXRjaC5wbCBjbGVhbnVwcwotCS0gc3BhcnNlIGZpeGVzCi0JLSByZW5hbWUgZmlsZXMgdG8gYmUgbm90IHNvICJnZW5lcmljIgotCS0gbWFrZSBzdXJlIHRoaW5ncyBidWlsZCBhcyBtb2R1bGVzIHByb3Blcmx5Ci0JLSBhZGQgcHJvcGVyIGFyY2ggZGVwZW5kYW5jaWVzIGFzIG5lZWRlZAotCS0gYXVkaXQgdXNlcnNwYWNlIGludGVyZmFjZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHNhbmUKLQotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6Ci1CcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2JpbmRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDEwZDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzY3ICswLDAgQEAKLS8qIGJpbmRlci5jCi0gKgotICogQW5kcm9pZCBJUEMgU3Vic3lzdGVtCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvZmR0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgImJpbmRlci5oIgotCi1zdGF0aWMgREVGSU5FX01VVEVYKGJpbmRlcl9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoYmluZGVyX2RlZmVycmVkX2xvY2spOwotCi1zdGF0aWMgSExJU1RfSEVBRChiaW5kZXJfcHJvY3MpOwotc3RhdGljIEhMSVNUX0hFQUQoYmluZGVyX2RlZmVycmVkX2xpc3QpOwotc3RhdGljIEhMSVNUX0hFQUQoYmluZGVyX2RlYWRfbm9kZXMpOwotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdDsKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jOwotc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2NvbnRleHRfbWdyX25vZGU7Ci1zdGF0aWMgdWlkX3QgYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IC0xOwotc3RhdGljIGludCBiaW5kZXJfbGFzdF9pZDsKLQotc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi0vKiBUaGlzIGlzIG9ubHkgZGVmaW5lZCBpbiBpbmNsdWRlL2FzbS1hcm0vc2l6ZXMuaCAqLwotI2lmbmRlZiBTWl8xSwotI2RlZmluZSBTWl8xSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAotI2VuZGlmCi0KLSNpZm5kZWYgU1pfNE0KLSNkZWZpbmUgU1pfNE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAKLSNlbmRpZgotCi0jZGVmaW5lIEZPUkJJRERFTl9NTUFQX0ZMQUdTICAgICAgICAgICAgICAgIChWTV9XUklURSkKLQotI2RlZmluZSBCSU5ERVJfU01BTExfQlVGX1NJWkUgKFBBR0VfU0laRSAqIDY0KQotCi1lbnVtIHsKLQlCSU5ERVJfREVCVUdfVVNFUl9FUlJPUiAgICAgICAgICAgICA9IDFVIDw8IDAsCi0JQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiAgICAgPSAxVSA8PCAxLAotCUJJTkRFUl9ERUJVR19ERUFEX1RSQU5TQUNUSU9OICAgICAgID0gMVUgPDwgMiwKLQlCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSAgICAgICAgICAgICA9IDFVIDw8IDMsCi0JQklOREVSX0RFQlVHX0RFQURfQklOREVSICAgICAgICAgICAgPSAxVSA8PCA0LAotCUJJTkRFUl9ERUJVR19ERUFUSF9OT1RJRklDQVRJT04gICAgID0gMVUgPDwgNSwKLQlCSU5ERVJfREVCVUdfUkVBRF9XUklURSAgICAgICAgICAgICA9IDFVIDw8IDYsCi0JQklOREVSX0RFQlVHX1VTRVJfUkVGUyAgICAgICAgICAgICAgPSAxVSA8PCA3LAotCUJJTkRFUl9ERUJVR19USFJFQURTICAgICAgICAgICAgICAgID0gMVUgPDwgOCwKLQlCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04gICAgICAgICAgICA9IDFVIDw8IDksCi0JQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OX0NPTVBMRVRFICAgPSAxVSA8PCAxMCwKLQlCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIgICAgICAgICAgICA9IDFVIDw8IDExLAotCUJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTICAgICAgICAgID0gMVUgPDwgMTIsCi0JQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQyAgICAgICAgICAgPSAxVSA8PCAxMywKLQlCSU5ERVJfREVCVUdfUFJJT1JJVFlfQ0FQICAgICAgICAgICA9IDFVIDw8IDE0LAotCUJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMgICAgID0gMVUgPDwgMTUsCi19Owotc3RhdGljIHVpbnQzMl90IGJpbmRlcl9kZWJ1Z19tYXNrID0gQklOREVSX0RFQlVHX1VTRVJfRVJST1IgfAotCUJJTkRFUl9ERUJVR19GQUlMRURfVFJBTlNBQ1RJT04gfCBCSU5ERVJfREVCVUdfREVBRF9UUkFOU0FDVElPTjsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19tYXNrLCBiaW5kZXJfZGVidWdfbWFzaywgdWludCwgU19JV1VTUiB8IFNfSVJVR08pOwotCi1zdGF0aWMgaW50IGJpbmRlcl9kZWJ1Z19ub19sb2NrOwotbW9kdWxlX3BhcmFtX25hbWVkKHByb2Nfbm9fbG9jaywgYmluZGVyX2RlYnVnX25vX2xvY2ssIGJvb2wsIFNfSVdVU1IgfCBTX0lSVUdPKTsKLQotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGJpbmRlcl91c2VyX2Vycm9yX3dhaXQpOwotc3RhdGljIGludCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yOwotCi1zdGF0aWMgaW50IGJpbmRlcl9zZXRfc3RvcF9vbl91c2VyX2Vycm9yKGNvbnN0IGNoYXIgKnZhbCwKLQkJCQkJIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQotewotCWludCByZXQ7Ci0JcmV0ID0gcGFyYW1fc2V0X2ludCh2YWwsIGtwKTsKLQlpZiAoYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpCi0JCXdha2VfdXAoJmJpbmRlcl91c2VyX2Vycm9yX3dhaXQpOwotCXJldHVybiByZXQ7Ci19Ci1tb2R1bGVfcGFyYW1fY2FsbChzdG9wX29uX3VzZXJfZXJyb3IsIGJpbmRlcl9zZXRfc3RvcF9vbl91c2VyX2Vycm9yLAotCXBhcmFtX2dldF9pbnQsICZiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yLCBTX0lXVVNSIHwgU19JUlVHTyk7Ci0KLSNkZWZpbmUgYmluZGVyX2RlYnVnKG1hc2ssIHguLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGJpbmRlcl9kZWJ1Z19tYXNrICYgbWFzaykgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyB4KTsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgYmluZGVyX3VzZXJfZXJyb3IoeC4uLikgXAotCWRvIHsgXAotCQlpZiAoYmluZGVyX2RlYnVnX21hc2sgJiBCSU5ERVJfREVCVUdfVVNFUl9FUlJPUikgXAotCQkJcHJpbnRrKEtFUk5fSU5GTyB4KTsgXAotCQlpZiAoYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvcikgXAotCQkJYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA9IDI7IFwKLQl9IHdoaWxlICgwKQotCi1lbnVtIGJpbmRlcl9zdGF0X3R5cGVzIHsKLQlCSU5ERVJfU1RBVF9QUk9DLAotCUJJTkRFUl9TVEFUX1RIUkVBRCwKLQlCSU5ERVJfU1RBVF9OT0RFLAotCUJJTkRFUl9TVEFUX1JFRiwKLQlCSU5ERVJfU1RBVF9ERUFUSCwKLQlCSU5ERVJfU1RBVF9UUkFOU0FDVElPTiwKLQlCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURSwKLQlCSU5ERVJfU1RBVF9DT1VOVAotfTsKLQotc3RydWN0IGJpbmRlcl9zdGF0cyB7Ci0JaW50IGJyW19JT0NfTlIoQlJfRkFJTEVEX1JFUExZKSArIDFdOwotCWludCBiY1tfSU9DX05SKEJDX0RFQURfQklOREVSX0RPTkUpICsgMV07Ci0JaW50IG9ial9jcmVhdGVkW0JJTkRFUl9TVEFUX0NPVU5UXTsKLQlpbnQgb2JqX2RlbGV0ZWRbQklOREVSX1NUQVRfQ09VTlRdOwotfTsKLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfc3RhdHMgYmluZGVyX3N0YXRzOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmluZGVyX3N0YXRzX2RlbGV0ZWQoZW51bSBiaW5kZXJfc3RhdF90eXBlcyB0eXBlKQotewotCWJpbmRlcl9zdGF0cy5vYmpfZGVsZXRlZFt0eXBlXSsrOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmluZGVyX3N0YXRzX2NyZWF0ZWQoZW51bSBiaW5kZXJfc3RhdF90eXBlcyB0eXBlKQotewotCWJpbmRlcl9zdGF0cy5vYmpfY3JlYXRlZFt0eXBlXSsrOwotfQotCi1zdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSB7Ci0JaW50IGRlYnVnX2lkOwotCWludCBjYWxsX3R5cGU7Ci0JaW50IGZyb21fcHJvYzsKLQlpbnQgZnJvbV90aHJlYWQ7Ci0JaW50IHRhcmdldF9oYW5kbGU7Ci0JaW50IHRvX3Byb2M7Ci0JaW50IHRvX3RocmVhZDsKLQlpbnQgdG9fbm9kZTsKLQlpbnQgZGF0YV9zaXplOwotCWludCBvZmZzZXRzX3NpemU7Ci19Owotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2cgewotCWludCBuZXh0OwotCWludCBmdWxsOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5IGVudHJ5WzMyXTsKLX07Ci1zdGF0aWMgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2cgYmluZGVyX3RyYW5zYWN0aW9uX2xvZzsKLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZDsKLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICpiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2FkZCgKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nKQotewotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5ICplOwotCWUgPSAmbG9nLT5lbnRyeVtsb2ctPm5leHRdOwotCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKLQlsb2ctPm5leHQrKzsKLQlpZiAobG9nLT5uZXh0ID09IEFSUkFZX1NJWkUobG9nLT5lbnRyeSkpIHsKLQkJbG9nLT5uZXh0ID0gMDsKLQkJbG9nLT5mdWxsID0gMTsKLQl9Ci0JcmV0dXJuIGU7Ci19Ci0KLXN0cnVjdCBiaW5kZXJfd29yayB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKLQllbnVtIHsKLQkJQklOREVSX1dPUktfVFJBTlNBQ1RJT04gPSAxLAotCQlCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURSwKLQkJQklOREVSX1dPUktfTk9ERSwKLQkJQklOREVSX1dPUktfREVBRF9CSU5ERVIsCi0JCUJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUiwKLQkJQklOREVSX1dPUktfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OLAotCX0gdHlwZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfbm9kZSB7Ci0JaW50IGRlYnVnX2lkOwotCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXVuaW9uIHsKLQkJc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKLQkJc3RydWN0IGhsaXN0X25vZGUgZGVhZF9ub2RlOwotCX07Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBobGlzdF9oZWFkIHJlZnM7Ci0JaW50IGludGVybmFsX3N0cm9uZ19yZWZzOwotCWludCBsb2NhbF93ZWFrX3JlZnM7Ci0JaW50IGxvY2FsX3N0cm9uZ19yZWZzOwotCXZvaWQgX191c2VyICpwdHI7Ci0Jdm9pZCBfX3VzZXIgKmNvb2tpZTsKLQl1bnNpZ25lZCBoYXNfc3Ryb25nX3JlZjoxOwotCXVuc2lnbmVkIHBlbmRpbmdfc3Ryb25nX3JlZjoxOwotCXVuc2lnbmVkIGhhc193ZWFrX3JlZjoxOwotCXVuc2lnbmVkIHBlbmRpbmdfd2Vha19yZWY6MTsKLQl1bnNpZ25lZCBoYXNfYXN5bmNfdHJhbnNhY3Rpb246MTsKLQl1bnNpZ25lZCBhY2NlcHRfZmRzOjE7Ci0JdW5zaWduZWQgbWluX3ByaW9yaXR5Ojg7Ci0Jc3RydWN0IGxpc3RfaGVhZCBhc3luY190b2RvOwotfTsKLQotc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggewotCXN0cnVjdCBiaW5kZXJfd29yayB3b3JrOwotCXZvaWQgX191c2VyICpjb29raWU7Ci19OwotCi1zdHJ1Y3QgYmluZGVyX3JlZiB7Ci0JLyogTG9va3VwcyBuZWVkZWQ6ICovCi0JLyogICBub2RlICsgcHJvYyA9PiByZWYgKHRyYW5zYWN0aW9uKSAqLwotCS8qICAgZGVzYyArIHByb2MgPT4gcmVmICh0cmFuc2FjdGlvbiwgaW5jL2RlYyByZWYpICovCi0JLyogICBub2RlID0+IHJlZnMgKyBwcm9jcyAocHJvYyBleGl0KSAqLwotCWludCBkZWJ1Z19pZDsKLQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlX2Rlc2M7Ci0Jc3RydWN0IHJiX25vZGUgcmJfbm9kZV9ub2RlOwotCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZW50cnk7Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQl1aW50MzJfdCBkZXNjOwotCWludCBzdHJvbmc7Ci0JaW50IHdlYWs7Ci0Jc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoOwotfTsKLQotc3RydWN0IGJpbmRlcl9idWZmZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7IC8qIGZyZWUgYW5kIGFsbG9jYXRlZCBlbnRyaWVzIGJ5IGFkZGVzc3MgKi8KLQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOyAvKiBmcmVlIGVudHJ5IGJ5IHNpemUgb3IgYWxsb2NhdGVkIGVudHJ5ICovCi0JCQkJLyogYnkgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGZyZWU6MTsKLQl1bnNpZ25lZCBhbGxvd191c2VyX2ZyZWU6MTsKLQl1bnNpZ25lZCBhc3luY190cmFuc2FjdGlvbjoxOwotCXVuc2lnbmVkIGRlYnVnX2lkOjI5OwotCi0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdHJhbnNhY3Rpb247Ci0KLQlzdHJ1Y3QgYmluZGVyX25vZGUgKnRhcmdldF9ub2RlOwotCXNpemVfdCBkYXRhX3NpemU7Ci0Jc2l6ZV90IG9mZnNldHNfc2l6ZTsKLQl1aW50OF90IGRhdGFbMF07Ci19OwotCi1lbnVtIGJpbmRlcl9kZWZlcnJlZF9zdGF0ZSB7Ci0JQklOREVSX0RFRkVSUkVEX1BVVF9GSUxFUyAgICA9IDB4MDEsCi0JQklOREVSX0RFRkVSUkVEX0ZMVVNIICAgICAgICA9IDB4MDIsCi0JQklOREVSX0RFRkVSUkVEX1JFTEVBU0UgICAgICA9IDB4MDQsCi19OwotCi1zdHJ1Y3QgYmluZGVyX3Byb2MgewotCXN0cnVjdCBobGlzdF9ub2RlIHByb2Nfbm9kZTsKLQlzdHJ1Y3QgcmJfcm9vdCB0aHJlYWRzOwotCXN0cnVjdCByYl9yb290IG5vZGVzOwotCXN0cnVjdCByYl9yb290IHJlZnNfYnlfZGVzYzsKLQlzdHJ1Y3QgcmJfcm9vdCByZWZzX2J5X25vZGU7Ci0JaW50IHBpZDsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBkZWZlcnJlZF93b3JrX25vZGU7Ci0JaW50IGRlZmVycmVkX3dvcms7Ci0Jdm9pZCAqYnVmZmVyOwotCXB0cmRpZmZfdCB1c2VyX2J1ZmZlcl9vZmZzZXQ7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ1ZmZlcnM7Ci0Jc3RydWN0IHJiX3Jvb3QgZnJlZV9idWZmZXJzOwotCXN0cnVjdCByYl9yb290IGFsbG9jYXRlZF9idWZmZXJzOwotCXNpemVfdCBmcmVlX2FzeW5jX3NwYWNlOwotCi0Jc3RydWN0IHBhZ2UgKipwYWdlczsKLQlzaXplX3QgYnVmZmVyX3NpemU7Ci0JdWludDMyX3QgYnVmZmVyX2ZyZWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0b2RvOwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGl2ZXJlZF9kZWF0aDsKLQlpbnQgbWF4X3RocmVhZHM7Ci0JaW50IHJlcXVlc3RlZF90aHJlYWRzOwotCWludCByZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkOwotCWludCByZWFkeV90aHJlYWRzOwotCWxvbmcgZGVmYXVsdF9wcmlvcml0eTsKLX07Ci0KLWVudW0gewotCUJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCAgPSAweDAxLAotCUJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCAgICAgPSAweDAyLAotCUJJTkRFUl9MT09QRVJfU1RBVEVfRVhJVEVEICAgICAgPSAweDA0LAotCUJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRCAgICAgPSAweDA4LAotCUJJTkRFUl9MT09QRVJfU1RBVEVfV0FJVElORyAgICAgPSAweDEwLAotCUJJTkRFUl9MT09QRVJfU1RBVEVfTkVFRF9SRVRVUk4gPSAweDIwCi19OwotCi1zdHJ1Y3QgYmluZGVyX3RocmVhZCB7Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7Ci0JaW50IHBpZDsKLQlpbnQgbG9vcGVyOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uX3N0YWNrOwotCXN0cnVjdCBsaXN0X2hlYWQgdG9kbzsKLQl1aW50MzJfdCByZXR1cm5fZXJyb3I7IC8qIFdyaXRlIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUgaW4gcmVhZCBidWYgKi8KLQl1aW50MzJfdCByZXR1cm5fZXJyb3IyOyAvKiBXcml0ZSBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlIGluIHJlYWQgKi8KLQkJLyogYnVmZmVyLiBVc2VkIHdoZW4gc2VuZGluZyBhIHJlcGx5IHRvIGEgZGVhZCBwcm9jZXNzIHRoYXQgKi8KLQkJLyogd2UgYXJlIGFsc28gd2FpdGluZyBvbiAqLwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7Ci0Jc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gewotCWludCBkZWJ1Z19pZDsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgd29yazsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqZnJvbTsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpmcm9tX3BhcmVudDsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnRvX3Byb2M7Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRvX3RocmVhZDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0b19wYXJlbnQ7Ci0JdW5zaWduZWQgbmVlZF9yZXBseToxOwotCS8qIHVuc2lnbmVkIGlzX2RlYWQ6MTsgKi8JLyogbm90IHVzZWQgYXQgdGhlIG1vbWVudCAqLwotCi0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQl1bnNpZ25lZCBpbnQJY29kZTsKLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0JbG9uZwlwcmlvcml0eTsKLQlsb25nCXNhdmVkX3ByaW9yaXR5OwotCXVpZF90CXNlbmRlcl9ldWlkOwotfTsKLQotc3RhdGljIHZvaWQKLWJpbmRlcl9kZWZlcl93b3JrKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgZW51bSBiaW5kZXJfZGVmZXJyZWRfc3RhdGUgZGVmZXIpOwotCi0vKgotICogY29waWVkIGZyb20gZ2V0X3VudXNlZF9mZF9mbGFncwotICovCi1pbnQgdGFza19nZXRfdW51c2VkX2ZkX2ZsYWdzKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IGZsYWdzKQotewotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gcHJvYy0+ZmlsZXM7Ci0JaW50IGZkLCBlcnJvcjsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCXVuc2lnbmVkIGxvbmcgcmxpbV9jdXI7Ci0JdW5zaWduZWQgbG9uZyBpcnFzOwotCi0JaWYgKGZpbGVzID09IE5VTEwpCi0JCXJldHVybiAtRVNSQ0g7Ci0KLQllcnJvciA9IC1FTUZJTEU7Ci0Jc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQotcmVwZWF0OgotCWZkdCA9IGZpbGVzX2ZkdGFibGUoZmlsZXMpOwotCWZkID0gZmluZF9uZXh0X3plcm9fYml0KGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzLCBmZHQtPm1heF9mZHMsCi0JCQkJZmlsZXMtPm5leHRfZmQpOwotCi0JLyoKLQkgKiBOLkIuIEZvciBjbG9uZSB0YXNrcyBzaGFyaW5nIGEgZmlsZXMgc3RydWN0dXJlLCB0aGlzIHRlc3QKLQkgKiB3aWxsIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkLgotCSAqLwotCXJsaW1fY3VyID0gMDsKLQlpZiAobG9ja190YXNrX3NpZ2hhbmQocHJvYy0+dHNrLCAmaXJxcykpIHsKLQkJcmxpbV9jdXIgPSBwcm9jLT50c2stPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cjsKLQkJdW5sb2NrX3Rhc2tfc2lnaGFuZChwcm9jLT50c2ssICZpcnFzKTsKLQl9Ci0JaWYgKGZkID49IHJsaW1fY3VyKQotCQlnb3RvIG91dDsKLQotCS8qIERvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBmZCBhcnJheSBvciBmZCBzZXQ/ICAqLwotCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBmZCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoZXJyb3IpIHsKLQkJLyoKLQkJICogSWYgd2UgbmVlZGVkIHRvIGV4cGFuZCB0aGUgZnMgYXJyYXkgd2UKLQkJICogbWlnaHQgaGF2ZSBibG9ja2VkIC0gdHJ5IGFnYWluLgotCQkgKi8KLQkJZXJyb3IgPSAtRU1GSUxFOwotCQlnb3RvIHJlcGVhdDsKLQl9Ci0KLQlGRF9TRVQoZmQsIGZkdC0+b3Blbl9mZHMpOwotCWlmIChmbGFncyAmIE9fQ0xPRVhFQykKLQkJRkRfU0VUKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwotCWVsc2UKLQkJRkRfQ0xSKGZkLCBmZHQtPmNsb3NlX29uX2V4ZWMpOwotCWZpbGVzLT5uZXh0X2ZkID0gZmQgKyAxOwotI2lmIDEKLQkvKiBTYW5pdHkgY2hlY2sgKi8KLQlpZiAoZmR0LT5mZFtmZF0gIT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJnZXRfdW51c2VkX2ZkOiBzbG90ICVkIG5vdCBOVUxMIVxuIiwgZmQpOwotCQlmZHQtPmZkW2ZkXSA9IE5VTEw7Ci0JfQotI2VuZGlmCi0JZXJyb3IgPSBmZDsKLQotb3V0OgotCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBjb3BpZWQgZnJvbSBmZF9pbnN0YWxsCi0gKi8KLXN0YXRpYyB2b2lkIHRhc2tfZmRfaW5zdGFsbCgKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBwcm9jLT5maWxlczsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCi0JaWYgKGZpbGVzID09IE5VTEwpCi0JCXJldHVybjsKLQotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JQlVHX09OKGZkdC0+ZmRbZmRdICE9IE5VTEwpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihmZHQtPmZkW2ZkXSwgZmlsZSk7Ci0Jc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOwotfQotCi0vKgotICogY29waWVkIGZyb20gX19wdXRfdW51c2VkX2ZkIGluIG9wZW4uYwotICovCi1zdGF0aWMgdm9pZCBfX3B1dF91bnVzZWRfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIHVuc2lnbmVkIGludCBmZCkKLXsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JX19GRF9DTFIoZmQsIGZkdC0+b3Blbl9mZHMpOwotCWlmIChmZCA8IGZpbGVzLT5uZXh0X2ZkKQotCQlmaWxlcy0+bmV4dF9mZCA9IGZkOwotfQotCi0vKgotICogY29waWVkIGZyb20gc3lzX2Nsb3NlCi0gKi8KLXN0YXRpYyBsb25nIHRhc2tfY2xvc2VfZmQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLCB1bnNpZ25lZCBpbnQgZmQpCi17Ci0Jc3RydWN0IGZpbGUgKmZpbHA7Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBwcm9jLT5maWxlczsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCWludCByZXR2YWw7Ci0KLQlpZiAoZmlsZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FU1JDSDsKLQotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JaWYgKGZkID49IGZkdC0+bWF4X2ZkcykKLQkJZ290byBvdXRfdW5sb2NrOwotCWZpbHAgPSBmZHQtPmZkW2ZkXTsKLQlpZiAoIWZpbHApCi0JCWdvdG8gb3V0X3VubG9jazsKLQlyY3VfYXNzaWduX3BvaW50ZXIoZmR0LT5mZFtmZF0sIE5VTEwpOwotCUZEX0NMUihmZCwgZmR0LT5jbG9zZV9vbl9leGVjKTsKLQlfX3B1dF91bnVzZWRfZmQoZmlsZXMsIGZkKTsKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JcmV0dmFsID0gZmlscF9jbG9zZShmaWxwLCBmaWxlcyk7Ci0KLQkvKiBjYW4ndCByZXN0YXJ0IGNsb3NlIHN5c2NhbGwgYmVjYXVzZSBmaWxlIHRhYmxlIGVudHJ5IHdhcyBjbGVhcmVkICovCi0JaWYgKHVubGlrZWx5KHJldHZhbCA9PSAtRVJFU1RBUlRTWVMgfHwKLQkJICAgICByZXR2YWwgPT0gLUVSRVNUQVJUTk9JTlRSIHx8Ci0JCSAgICAgcmV0dmFsID09IC1FUkVTVEFSVE5PSEFORCB8fAotCQkgICAgIHJldHZhbCA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSkKLQkJcmV0dmFsID0gLUVJTlRSOwotCi0JcmV0dXJuIHJldHZhbDsKLQotb3V0X3VubG9jazoKLQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JcmV0dXJuIC1FQkFERjsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3NldF9uaWNlKGxvbmcgbmljZSkKLXsKLQlsb25nIG1pbl9uaWNlOwotCWlmIChjYW5fbmljZShjdXJyZW50LCBuaWNlKSkgewotCQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIG5pY2UpOwotCQlyZXR1cm47Ci0JfQotCW1pbl9uaWNlID0gMjAgLSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX05JQ0VdLnJsaW1fY3VyOwotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUFJJT1JJVFlfQ0FQLAotCQkgICAgICJiaW5kZXI6ICVkOiBuaWNlIHZhbHVlICVsZCBub3QgYWxsb3dlZCB1c2UgIgotCQkgICAgICIlbGQgaW5zdGVhZFxuIiwgY3VycmVudC0+cGlkLCBuaWNlLCBtaW5fbmljZSk7Ci0Jc2V0X3VzZXJfbmljZShjdXJyZW50LCBtaW5fbmljZSk7Ci0JaWYgKG1pbl9uaWNlIDwgMjApCi0JCXJldHVybjsKLQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBSTElNSVRfTklDRSBub3Qgc2V0XG4iLCBjdXJyZW50LT5waWQpOwotfQotCi1zdGF0aWMgc2l6ZV90IGJpbmRlcl9idWZmZXJfc2l6ZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCi17Ci0JaWYgKGxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKQotCQlyZXR1cm4gcHJvYy0+YnVmZmVyICsgcHJvYy0+YnVmZmVyX3NpemUgLSAodm9pZCAqKWJ1ZmZlci0+ZGF0YTsKLQllbHNlCi0JCXJldHVybiAoc2l6ZV90KWxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAotCQkJc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KSAtIChzaXplX3QpYnVmZmVyLT5kYXRhOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkgICAgICBzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqbmV3X2J1ZmZlcikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcHJvYy0+ZnJlZV9idWZmZXJzLnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQlzaXplX3QgYnVmZmVyX3NpemU7Ci0Jc2l6ZV90IG5ld19idWZmZXJfc2l6ZTsKLQotCUJVR19PTighbmV3X2J1ZmZlci0+ZnJlZSk7Ci0KLQluZXdfYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgbmV3X2J1ZmZlcik7Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogYWRkIGZyZWUgYnVmZmVyLCBzaXplICV6ZCwgIgotCQkgICAgICJhdCAlcFxuIiwgcHJvYy0+cGlkLCBuZXdfYnVmZmVyX3NpemUsIG5ld19idWZmZXIpOwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlidWZmZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKLQkJQlVHX09OKCFidWZmZXItPmZyZWUpOwotCi0JCWJ1ZmZlcl9zaXplID0gYmluZGVyX2J1ZmZlcl9zaXplKHByb2MsIGJ1ZmZlcik7Ci0KLQkJaWYgKG5ld19idWZmZXJfc2l6ZSA8IGJ1ZmZlcl9zaXplKQotCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UKLQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQl9Ci0JcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmZyZWVfYnVmZmVycyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9pbnNlcnRfYWxsb2NhdGVkX2J1ZmZlcihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXdfYnVmZmVyKQotewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycy5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7Ci0KLQlCVUdfT04obmV3X2J1ZmZlci0+ZnJlZSk7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCWJ1ZmZlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKLQotCQlpZiAobmV3X2J1ZmZlciA8IGJ1ZmZlcikKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQllbHNlIGlmIChuZXdfYnVmZmVyID4gYnVmZmVyKQotCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlCVUcoKTsKLQl9Ci0JcmJfbGlua19ub2RlKCZuZXdfYnVmZmVyLT5yYl9ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbmV3X2J1ZmZlci0+cmJfbm9kZSwgJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpiaW5kZXJfYnVmZmVyX2xvb2t1cChzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCQkgIHZvaWQgX191c2VyICp1c2VyX3B0cikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHByb2MtPmFsbG9jYXRlZF9idWZmZXJzLnJiX25vZGU7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqa2Vybl9wdHI7Ci0KLQlrZXJuX3B0ciA9IHVzZXJfcHRyIC0gcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0Ci0JCS0gb2Zmc2V0b2Yoc3RydWN0IGJpbmRlcl9idWZmZXIsIGRhdGEpOwotCi0Jd2hpbGUgKG4pIHsKLQkJYnVmZmVyID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIHJiX25vZGUpOwotCQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKLQotCQlpZiAoa2Vybl9wdHIgPCBidWZmZXIpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoa2Vybl9wdHIgPiBidWZmZXIpCi0JCQluID0gbi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBidWZmZXI7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsIGludCBhbGxvY2F0ZSwKLQkJCQkgICAgdm9pZCAqc3RhcnQsIHZvaWQgKmVuZCwKLQkJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jdm9pZCAqcGFnZV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgdXNlcl9wYWdlX2FkZHI7Ci0Jc3RydWN0IHZtX3N0cnVjdCB0bXBfYXJlYTsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2U7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogJXMgcGFnZXMgJXAtJXBcbiIsIHByb2MtPnBpZCwKLQkJICAgICBhbGxvY2F0ZSA/ICJhbGxvY2F0ZSIgOiAiZnJlZSIsIHN0YXJ0LCBlbmQpOwotCi0JaWYgKGVuZCA8PSBzdGFydCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodm1hKQotCQltbSA9IE5VTEw7Ci0JZWxzZQotCQltbSA9IGdldF90YXNrX21tKHByb2MtPnRzayk7Ci0KLQlpZiAobW0pIHsKLQkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQkJdm1hID0gcHJvYy0+dm1hOwotCX0KLQotCWlmIChhbGxvY2F0ZSA9PSAwKQotCQlnb3RvIGZyZWVfcmFuZ2U7Ci0KLQlpZiAodm1hID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCB0byAiCi0JCSAgICAgICAibWFwIHBhZ2VzIGluIHVzZXJzcGFjZSwgbm8gdm1hXG4iLCBwcm9jLT5waWQpOwotCQlnb3RvIGVycl9ub192bWE7Ci0JfQotCi0JZm9yIChwYWdlX2FkZHIgPSBzdGFydDsgcGFnZV9hZGRyIDwgZW5kOyBwYWdlX2FkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCWludCByZXQ7Ci0JCXN0cnVjdCBwYWdlICoqcGFnZV9hcnJheV9wdHI7Ci0JCXBhZ2UgPSAmcHJvYy0+cGFnZXNbKHBhZ2VfYWRkciAtIHByb2MtPmJ1ZmZlcikgLyBQQUdFX1NJWkVdOwotCi0JCUJVR19PTigqcGFnZSk7Ci0JCSpwYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7Ci0JCWlmICgqcGFnZSA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgZmFpbGVkICIKLQkJCSAgICAgICAiZm9yIHBhZ2UgYXQgJXBcbiIsIHByb2MtPnBpZCwgcGFnZV9hZGRyKTsKLQkJCWdvdG8gZXJyX2FsbG9jX3BhZ2VfZmFpbGVkOwotCQl9Ci0JCXRtcF9hcmVhLmFkZHIgPSBwYWdlX2FkZHI7Ci0JCXRtcF9hcmVhLnNpemUgPSBQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyogZ3VhcmQgcGFnZT8gKi87Ci0JCXBhZ2VfYXJyYXlfcHRyID0gcGFnZTsKLQkJcmV0ID0gbWFwX3ZtX2FyZWEoJnRtcF9hcmVhLCBQQUdFX0tFUk5FTCwgJnBhZ2VfYXJyYXlfcHRyKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6ICVkOiBiaW5kZXJfYWxsb2NfYnVmIGZhaWxlZCAiCi0JCQkgICAgICAgInRvIG1hcCBwYWdlIGF0ICVwIGluIGtlcm5lbFxuIiwKLQkJCSAgICAgICBwcm9jLT5waWQsIHBhZ2VfYWRkcik7Ci0JCQlnb3RvIGVycl9tYXBfa2VybmVsX2ZhaWxlZDsKLQkJfQotCQl1c2VyX3BhZ2VfYWRkciA9Ci0JCQkodWludHB0cl90KXBhZ2VfYWRkciArIHByb2MtPnVzZXJfYnVmZmVyX29mZnNldDsKLQkJcmV0ID0gdm1faW5zZXJ0X3BhZ2Uodm1hLCB1c2VyX3BhZ2VfYWRkciwgcGFnZVswXSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBmYWlsZWQgIgotCQkJICAgICAgICJ0byBtYXAgcGFnZSBhdCAlbHggaW4gdXNlcnNwYWNlXG4iLAotCQkJICAgICAgIHByb2MtPnBpZCwgdXNlcl9wYWdlX2FkZHIpOwotCQkJZ290byBlcnJfdm1faW5zZXJ0X3BhZ2VfZmFpbGVkOwotCQl9Ci0JCS8qIHZtX2luc2VydF9wYWdlIGRvZXMgbm90IHNlZW0gdG8gaW5jcmVtZW50IHRoZSByZWZjb3VudCAqLwotCX0KLQlpZiAobW0pIHsKLQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JCW1tcHV0KG1tKTsKLQl9Ci0JcmV0dXJuIDA7Ci0KLWZyZWVfcmFuZ2U6Ci0JZm9yIChwYWdlX2FkZHIgPSBlbmQgLSBQQUdFX1NJWkU7IHBhZ2VfYWRkciA+PSBzdGFydDsKLQkgICAgIHBhZ2VfYWRkciAtPSBQQUdFX1NJWkUpIHsKLQkJcGFnZSA9ICZwcm9jLT5wYWdlc1socGFnZV9hZGRyIC0gcHJvYy0+YnVmZmVyKSAvIFBBR0VfU0laRV07Ci0JCWlmICh2bWEpCi0JCQl6YXBfcGFnZV9yYW5nZSh2bWEsICh1aW50cHRyX3QpcGFnZV9hZGRyICsKLQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQsIFBBR0VfU0laRSwgTlVMTCk7Ci1lcnJfdm1faW5zZXJ0X3BhZ2VfZmFpbGVkOgotCQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyLCBQQUdFX1NJWkUpOwotZXJyX21hcF9rZXJuZWxfZmFpbGVkOgotCQlfX2ZyZWVfcGFnZSgqcGFnZSk7Ci0JCSpwYWdlID0gTlVMTDsKLWVycl9hbGxvY19wYWdlX2ZhaWxlZDoKLQkJOwotCX0KLWVycl9ub192bWE6Ci0JaWYgKG1tKSB7Ci0JCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCQltbXB1dChtbSk7Ci0JfQotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJpbmRlcl9hbGxvY19idWYoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJCQkgICAgICBzaXplX3QgZGF0YV9zaXplLAotCQkJCQkgICAgICBzaXplX3Qgb2Zmc2V0c19zaXplLCBpbnQgaXNfYXN5bmMpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5mcmVlX2J1ZmZlcnMucmJfbm9kZTsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCXNpemVfdCBidWZmZXJfc2l6ZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqYmVzdF9maXQgPSBOVUxMOwotCXZvaWQgKmhhc19wYWdlX2FkZHI7Ci0Jdm9pZCAqZW5kX3BhZ2VfYWRkcjsKLQlzaXplX3Qgc2l6ZTsKLQotCWlmIChwcm9jLT52bWEgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYsIG5vIHZtYVxuIiwKLQkJICAgICAgIHByb2MtPnBpZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNpemUgPSBBTElHTihkYXRhX3NpemUsIHNpemVvZih2b2lkICopKSArCi0JCUFMSUdOKG9mZnNldHNfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOwotCi0JaWYgKHNpemUgPCBkYXRhX3NpemUgfHwgc2l6ZSA8IG9mZnNldHNfc2l6ZSkgewotCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDogZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkic2l6ZSAlemQtJXpkXG4iLCBwcm9jLT5waWQsIGRhdGFfc2l6ZSwgb2Zmc2V0c19zaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGlzX2FzeW5jICYmCi0JICAgIHByb2MtPmZyZWVfYXN5bmNfc3BhY2UgPCBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSkgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJCSAgICAgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQiCi0JCQkgICAgICJmYWlsZWQsIG5vIGFzeW5jIHNwYWNlIGxlZnRcbiIsIHByb2MtPnBpZCwgc2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXdoaWxlIChuKSB7Ci0JCWJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKLQkJQlVHX09OKCFidWZmZXItPmZyZWUpOwotCQlidWZmZXJfc2l6ZSA9IGJpbmRlcl9idWZmZXJfc2l6ZShwcm9jLCBidWZmZXIpOwotCi0JCWlmIChzaXplIDwgYnVmZmVyX3NpemUpIHsKLQkJCWJlc3RfZml0ID0gbjsKLQkJCW4gPSBuLT5yYl9sZWZ0OwotCQl9IGVsc2UgaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQliZXN0X2ZpdCA9IG47Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYmVzdF9maXQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZmFpbGVkLCAiCi0JCSAgICAgICAibm8gYWRkcmVzcyBzcGFjZVxuIiwgcHJvYy0+cGlkLCBzaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuID09IE5VTEwpIHsKLQkJYnVmZmVyID0gcmJfZW50cnkoYmVzdF9maXQsIHN0cnVjdCBiaW5kZXJfYnVmZmVyLCByYl9ub2RlKTsKLQkJYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKLQl9Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0JVRkZFUl9BTExPQywKLQkJICAgICAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCBnb3QgYnVmZiIKLQkJICAgICAiZXIgJXAgc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgc2l6ZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7Ci0KLQloYXNfcGFnZV9hZGRyID0KLQkJKHZvaWQgKikoKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhICsgYnVmZmVyX3NpemUpICYgUEFHRV9NQVNLKTsKLQlpZiAobiA9PSBOVUxMKSB7Ci0JCWlmIChzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKSArIDQgPj0gYnVmZmVyX3NpemUpCi0JCQlidWZmZXJfc2l6ZSA9IHNpemU7IC8qIG5vIHJvb20gZm9yIG90aGVyIGJ1ZmZlcnMgKi8KLQkJZWxzZQotCQkJYnVmZmVyX3NpemUgPSBzaXplICsgc2l6ZW9mKHN0cnVjdCBiaW5kZXJfYnVmZmVyKTsKLQl9Ci0JZW5kX3BhZ2VfYWRkciA9Ci0JCSh2b2lkICopUEFHRV9BTElHTigodWludHB0cl90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKTsKLQlpZiAoZW5kX3BhZ2VfYWRkciA+IGhhc19wYWdlX2FkZHIpCi0JCWVuZF9wYWdlX2FkZHIgPSBoYXNfcGFnZV9hZGRyOwotCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMSwKLQkgICAgKHZvaWQgKilQQUdFX0FMSUdOKCh1aW50cHRyX3QpYnVmZmVyLT5kYXRhKSwgZW5kX3BhZ2VfYWRkciwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCi0JcmJfZXJhc2UoYmVzdF9maXQsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOwotCWJ1ZmZlci0+ZnJlZSA9IDA7Ci0JYmluZGVyX2luc2VydF9hbGxvY2F0ZWRfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Ci0JaWYgKGJ1ZmZlcl9zaXplICE9IHNpemUpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKm5ld19idWZmZXIgPSAodm9pZCAqKWJ1ZmZlci0+ZGF0YSArIHNpemU7Ci0JCWxpc3RfYWRkKCZuZXdfYnVmZmVyLT5lbnRyeSwgJmJ1ZmZlci0+ZW50cnkpOwotCQluZXdfYnVmZmVyLT5mcmVlID0gMTsKLQkJYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBuZXdfYnVmZmVyKTsKLQl9Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCSAgICAgImJpbmRlcjogJWQ6IGJpbmRlcl9hbGxvY19idWYgc2l6ZSAlemQgZ290ICIKLQkJICAgICAiJXBcbiIsIHByb2MtPnBpZCwgc2l6ZSwgYnVmZmVyKTsKLQlidWZmZXItPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKLQlidWZmZXItPm9mZnNldHNfc2l6ZSA9IG9mZnNldHNfc2l6ZTsKLQlidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uID0gaXNfYXN5bmM7Ci0JaWYgKGlzX2FzeW5jKSB7Ci0JCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgLT0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DX0FTWU5DLAotCQkJICAgICAiYmluZGVyOiAlZDogYmluZGVyX2FsbG9jX2J1ZiBzaXplICV6ZCAiCi0JCQkgICAgICJhc3luYyBmcmVlICV6ZFxuIiwgcHJvYy0+cGlkLCBzaXplLAotCQkJICAgICBwcm9jLT5mcmVlX2FzeW5jX3NwYWNlKTsKLQl9Ci0KLQlyZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgdm9pZCAqYnVmZmVyX3N0YXJ0X3BhZ2Uoc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlyZXR1cm4gKHZvaWQgKikoKHVpbnRwdHJfdClidWZmZXIgJiBQQUdFX01BU0spOwotfQotCi1zdGF0aWMgdm9pZCAqYnVmZmVyX2VuZF9wYWdlKHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuICh2b2lkICopKCgodWludHB0cl90KShidWZmZXIgKyAxKSAtIDEpICYgUEFHRV9NQVNLKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJICAgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqcHJldiwgKm5leHQgPSBOVUxMOwotCWludCBmcmVlX3BhZ2VfZW5kID0gMTsKLQlpbnQgZnJlZV9wYWdlX3N0YXJ0ID0gMTsKLQotCUJVR19PTihwcm9jLT5idWZmZXJzLm5leHQgPT0gJmJ1ZmZlci0+ZW50cnkpOwotCXByZXYgPSBsaXN0X2VudHJ5KGJ1ZmZlci0+ZW50cnkucHJldiwgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKLQlCVUdfT04oIXByZXYtPmZyZWUpOwotCWlmIChidWZmZXJfZW5kX3BhZ2UocHJldikgPT0gYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSkgewotCQlmcmVlX3BhZ2Vfc3RhcnQgPSAwOwotCQlpZiAoYnVmZmVyX2VuZF9wYWdlKHByZXYpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKQotCQkJZnJlZV9wYWdlX2VuZCA9IDA7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJICAgICAiYmluZGVyOiAlZDogbWVyZ2UgZnJlZSwgYnVmZmVyICVwICIKLQkJCSAgICAgInNoYXJlIHBhZ2Ugd2l0aCAlcFxuIiwgcHJvYy0+cGlkLCBidWZmZXIsIHByZXYpOwotCX0KLQotCWlmICghbGlzdF9pc19sYXN0KCZidWZmZXItPmVudHJ5LCAmcHJvYy0+YnVmZmVycykpIHsKLQkJbmV4dCA9IGxpc3RfZW50cnkoYnVmZmVyLT5lbnRyeS5uZXh0LAotCQkJCSAgc3RydWN0IGJpbmRlcl9idWZmZXIsIGVudHJ5KTsKLQkJaWYgKGJ1ZmZlcl9zdGFydF9wYWdlKG5leHQpID09IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpKSB7Ci0JCQlmcmVlX3BhZ2VfZW5kID0gMDsKLQkJCWlmIChidWZmZXJfc3RhcnRfcGFnZShuZXh0KSA9PQotCQkJICAgIGJ1ZmZlcl9zdGFydF9wYWdlKGJ1ZmZlcikpCi0JCQkJZnJlZV9wYWdlX3N0YXJ0ID0gMDsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkJCSAgICAgImJpbmRlcjogJWQ6IG1lcmdlIGZyZWUsIGJ1ZmZlciIKLQkJCQkgICAgICIgJXAgc2hhcmUgcGFnZSB3aXRoICVwXG4iLCBwcm9jLT5waWQsCi0JCQkJICAgICBidWZmZXIsIHByZXYpOwotCQl9Ci0JfQotCWxpc3RfZGVsKCZidWZmZXItPmVudHJ5KTsKLQlpZiAoZnJlZV9wYWdlX3N0YXJ0IHx8IGZyZWVfcGFnZV9lbmQpIHsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkgICAgICJiaW5kZXI6ICVkOiBtZXJnZSBmcmVlLCBidWZmZXIgJXAgZG8gIgotCQkJICAgICAibm90IHNoYXJlIHBhZ2UlcyVzIHdpdGggd2l0aCAlcCBvciAlcFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCBidWZmZXIsIGZyZWVfcGFnZV9zdGFydCA/ICIiIDogIiBlbmQiLAotCQkJICAgICBmcmVlX3BhZ2VfZW5kID8gIiIgOiAiIHN0YXJ0IiwgcHJldiwgbmV4dCk7Ci0JCWJpbmRlcl91cGRhdGVfcGFnZV9yYW5nZShwcm9jLCAwLCBmcmVlX3BhZ2Vfc3RhcnQgPwotCQkJYnVmZmVyX3N0YXJ0X3BhZ2UoYnVmZmVyKSA6IGJ1ZmZlcl9lbmRfcGFnZShidWZmZXIpLAotCQkJKGZyZWVfcGFnZV9lbmQgPyBidWZmZXJfZW5kX3BhZ2UoYnVmZmVyKSA6Ci0JCQlidWZmZXJfc3RhcnRfcGFnZShidWZmZXIpKSArIFBBR0VfU0laRSwgTlVMTCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfZnJlZV9idWYoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIpCi17Ci0Jc2l6ZV90IHNpemUsIGJ1ZmZlcl9zaXplOwotCi0JYnVmZmVyX3NpemUgPSBiaW5kZXJfYnVmZmVyX3NpemUocHJvYywgYnVmZmVyKTsKLQotCXNpemUgPSBBTElHTihidWZmZXItPmRhdGFfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpICsKLQkJQUxJR04oYnVmZmVyLT5vZmZzZXRzX3NpemUsIHNpemVvZih2b2lkICopKTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfQlVGRkVSX0FMTE9DLAotCQkgICAgICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgJXAgc2l6ZSAlemQgYnVmZmVyIgotCQkgICAgICJfc2l6ZSAlemRcbiIsIHByb2MtPnBpZCwgYnVmZmVyLCBzaXplLCBidWZmZXJfc2l6ZSk7Ci0KLQlCVUdfT04oYnVmZmVyLT5mcmVlKTsKLQlCVUdfT04oc2l6ZSA+IGJ1ZmZlcl9zaXplKTsKLQlCVUdfT04oYnVmZmVyLT50cmFuc2FjdGlvbiAhPSBOVUxMKTsKLQlCVUdfT04oKHZvaWQgKilidWZmZXIgPCBwcm9jLT5idWZmZXIpOwotCUJVR19PTigodm9pZCAqKWJ1ZmZlciA+IHByb2MtPmJ1ZmZlciArIHByb2MtPmJ1ZmZlcl9zaXplKTsKLQotCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uKSB7Ci0JCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgKz0gc2l6ZSArIHNpemVvZihzdHJ1Y3QgYmluZGVyX2J1ZmZlcik7Ci0KLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0NfQVNZTkMsCi0JCQkgICAgICJiaW5kZXI6ICVkOiBiaW5kZXJfZnJlZV9idWYgc2l6ZSAlemQgIgotCQkJICAgICAiYXN5bmMgZnJlZSAlemRcbiIsIHByb2MtPnBpZCwgc2l6ZSwKLQkJCSAgICAgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7Ci0JfQotCi0JYmluZGVyX3VwZGF0ZV9wYWdlX3JhbmdlKHByb2MsIDAsCi0JCSh2b2lkICopUEFHRV9BTElHTigodWludHB0cl90KWJ1ZmZlci0+ZGF0YSksCi0JCSh2b2lkICopKCgodWludHB0cl90KWJ1ZmZlci0+ZGF0YSArIGJ1ZmZlcl9zaXplKSAmIFBBR0VfTUFTSyksCi0JCU5VTEwpOwotCXJiX2VyYXNlKCZidWZmZXItPnJiX25vZGUsICZwcm9jLT5hbGxvY2F0ZWRfYnVmZmVycyk7Ci0JYnVmZmVyLT5mcmVlID0gMTsKLQlpZiAoIWxpc3RfaXNfbGFzdCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpKSB7Ci0JCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpuZXh0ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5Lm5leHQsCi0JCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOwotCQlpZiAobmV4dC0+ZnJlZSkgewotCQkJcmJfZXJhc2UoJm5leHQtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOwotCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBuZXh0KTsKLQkJfQotCX0KLQlpZiAocHJvYy0+YnVmZmVycy5uZXh0ICE9ICZidWZmZXItPmVudHJ5KSB7Ci0JCXN0cnVjdCBiaW5kZXJfYnVmZmVyICpwcmV2ID0gbGlzdF9lbnRyeShidWZmZXItPmVudHJ5LnByZXYsCi0JCQkJCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciwgZW50cnkpOwotCQlpZiAocHJldi0+ZnJlZSkgewotCQkJYmluZGVyX2RlbGV0ZV9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOwotCQkJcmJfZXJhc2UoJnByZXYtPnJiX25vZGUsICZwcm9jLT5mcmVlX2J1ZmZlcnMpOwotCQkJYnVmZmVyID0gcHJldjsKLQkJfQotCX0KLQliaW5kZXJfaW5zZXJ0X2ZyZWVfYnVmZmVyKHByb2MsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9nZXRfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHZvaWQgX191c2VyICpwdHIpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSBwcm9jLT5ub2Rlcy5yYl9ub2RlOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQotCXdoaWxlIChuKSB7Ci0JCW5vZGUgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOwotCi0JCWlmIChwdHIgPCBub2RlLT5wdHIpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAocHRyID4gbm9kZS0+cHRyKQotCQkJbiA9IG4tPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlyZXR1cm4gbm9kZTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9uZXdfbm9kZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgIHZvaWQgX191c2VyICpwdHIsCi0JCQkJCSAgIHZvaWQgX191c2VyICpjb29raWUpCi17Ci0Jc3RydWN0IHJiX25vZGUgKipwID0gJnByb2MtPm5vZGVzLnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQlub2RlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX25vZGUsIHJiX25vZGUpOwotCi0JCWlmIChwdHIgPCBub2RlLT5wdHIpCi0JCQlwID0gJigqcCktPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKHB0ciA+IG5vZGUtPnB0cikKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLQotCW5vZGUgPSBremFsbG9jKHNpemVvZigqbm9kZSksIEdGUF9LRVJORUwpOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX05PREUpOwotCXJiX2xpbmtfbm9kZSgmbm9kZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5vZGUtPnJiX25vZGUsICZwcm9jLT5ub2Rlcyk7Ci0Jbm9kZS0+ZGVidWdfaWQgPSArK2JpbmRlcl9sYXN0X2lkOwotCW5vZGUtPnByb2MgPSBwcm9jOwotCW5vZGUtPnB0ciA9IHB0cjsKLQlub2RlLT5jb29raWUgPSBjb29raWU7Ci0Jbm9kZS0+d29yay50eXBlID0gQklOREVSX1dPUktfTk9ERTsKLQlJTklUX0xJU1RfSEVBRCgmbm9kZS0+d29yay5lbnRyeSk7Ci0JSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmFzeW5jX3RvZG8pOwotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJICAgICAiYmluZGVyOiAlZDolZCBub2RlICVkIHUlcCBjJXAgY3JlYXRlZFxuIiwKLQkJICAgICBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsCi0JCSAgICAgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOwotCXJldHVybiBub2RlOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9pbmNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCwKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0KQotewotCWlmIChzdHJvbmcpIHsKLQkJaWYgKGludGVybmFsKSB7Ci0JCQlpZiAodGFyZ2V0X2xpc3QgPT0gTlVMTCAmJgotCQkJICAgIG5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzID09IDAgJiYKLQkJCSAgICAhKG5vZGUgPT0gYmluZGVyX2NvbnRleHRfbWdyX25vZGUgJiYKLQkJCSAgICBub2RlLT5oYXNfc3Ryb25nX3JlZikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogaW52YWxpZCBpbmMgc3Ryb25nICIKLQkJCQkJIm5vZGUgZm9yICVkXG4iLCBub2RlLT5kZWJ1Z19pZCk7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcysrOwotCQl9IGVsc2UKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7Ci0JCWlmICghbm9kZS0+aGFzX3N0cm9uZ19yZWYgJiYgdGFyZ2V0X2xpc3QpIHsKLQkJCWxpc3RfZGVsX2luaXQoJm5vZGUtPndvcmsuZW50cnkpOwotCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFpbnRlcm5hbCkKLQkJCW5vZGUtPmxvY2FsX3dlYWtfcmVmcysrOwotCQlpZiAoIW5vZGUtPmhhc193ZWFrX3JlZiAmJiBsaXN0X2VtcHR5KCZub2RlLT53b3JrLmVudHJ5KSkgewotCQkJaWYgKHRhcmdldF9saXN0ID09IE5VTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogaW52YWxpZCBpbmMgd2VhayBub2RlICIKLQkJCQkJImZvciAlZFxuIiwgbm9kZS0+ZGVidWdfaWQpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgdGFyZ2V0X2xpc3QpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9kZWNfbm9kZShzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUsIGludCBzdHJvbmcsIGludCBpbnRlcm5hbCkKLXsKLQlpZiAoc3Ryb25nKSB7Ci0JCWlmIChpbnRlcm5hbCkKLQkJCW5vZGUtPmludGVybmFsX3N0cm9uZ19yZWZzLS07Ci0JCWVsc2UKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLS07Ci0JCWlmIChub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyB8fCBub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcykKLQkJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWlmICghaW50ZXJuYWwpCi0JCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMtLTsKLQkJaWYgKG5vZGUtPmxvY2FsX3dlYWtfcmVmcyB8fCAhaGxpc3RfZW1wdHkoJm5vZGUtPnJlZnMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCWlmIChub2RlLT5wcm9jICYmIChub2RlLT5oYXNfc3Ryb25nX3JlZiB8fCBub2RlLT5oYXNfd2Vha19yZWYpKSB7Ci0JCWlmIChsaXN0X2VtcHR5KCZub2RlLT53b3JrLmVudHJ5KSkgewotCQkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+d29yay5lbnRyeSwgJm5vZGUtPnByb2MtPnRvZG8pOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZub2RlLT5wcm9jLT53YWl0KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgJiYgIW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzICYmCi0JCSAgICAhbm9kZS0+bG9jYWxfd2Vha19yZWZzKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZub2RlLT53b3JrLmVudHJ5KTsKLQkJCWlmIChub2RlLT5wcm9jKSB7Ci0JCQkJcmJfZXJhc2UoJm5vZGUtPnJiX25vZGUsICZub2RlLT5wcm9jLT5ub2Rlcyk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkJCQkgICAgICJiaW5kZXI6IHJlZmxlc3Mgbm9kZSAlZCBkZWxldGVkXG4iLAotCQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGxpc3RfZGVsKCZub2RlLT5kZWFkX25vZGUpOwotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCQkJICAgICAiYmluZGVyOiBkZWFkIG5vZGUgJWQgZGVsZXRlZFxuIiwKLQkJCQkJICAgICBub2RlLT5kZWJ1Z19pZCk7Ci0JCQl9Ci0JCQlrZnJlZShub2RlKTsKLQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX05PREUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBiaW5kZXJfcmVmICpiaW5kZXJfZ2V0X3JlZihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSB1aW50MzJfdCBkZXNjKQotewotCXN0cnVjdCByYl9ub2RlICpuID0gcHJvYy0+cmVmc19ieV9kZXNjLnJiX25vZGU7Ci0Jc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQotCXdoaWxlIChuKSB7Ci0JCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOwotCi0JCWlmIChkZXNjIDwgcmVmLT5kZXNjKQotCQkJbiA9IG4tPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGRlc2MgPiByZWYtPmRlc2MpCi0JCQluID0gbi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiByZWY7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IGJpbmRlcl9yZWYgKmJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQkJCSAgc3RydWN0IGJpbmRlcl9ub2RlICpub2RlKQotewotCXN0cnVjdCByYl9ub2RlICpuOwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT5yZWZzX2J5X25vZGUucmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmLCAqbmV3X3JlZjsKLQotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9ub2RlKTsKLQotCQlpZiAobm9kZSA8IHJlZi0+bm9kZSkKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAobm9kZSA+IHJlZi0+bm9kZSkKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiByZWY7Ci0JfQotCW5ld19yZWYgPSBremFsbG9jKHNpemVvZigqcmVmKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5ld19yZWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfUkVGKTsKLQluZXdfcmVmLT5kZWJ1Z19pZCA9ICsrYmluZGVyX2xhc3RfaWQ7Ci0JbmV3X3JlZi0+cHJvYyA9IHByb2M7Ci0JbmV3X3JlZi0+bm9kZSA9IG5vZGU7Ci0JcmJfbGlua19ub2RlKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXdfcmVmLT5yYl9ub2RlX25vZGUsICZwcm9jLT5yZWZzX2J5X25vZGUpOwotCi0JbmV3X3JlZi0+ZGVzYyA9IChub2RlID09IGJpbmRlcl9jb250ZXh0X21ncl9ub2RlKSA/IDAgOiAxOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5yZWZzX2J5X2Rlc2MpOyBuICE9IE5VTEw7IG4gPSByYl9uZXh0KG4pKSB7Ci0JCXJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLCByYl9ub2RlX2Rlc2MpOwotCQlpZiAocmVmLT5kZXNjID4gbmV3X3JlZi0+ZGVzYykKLQkJCWJyZWFrOwotCQluZXdfcmVmLT5kZXNjID0gcmVmLT5kZXNjICsgMTsKLQl9Ci0KLQlwID0gJnByb2MtPnJlZnNfYnlfZGVzYy5yYl9ub2RlOwotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJcmVmID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmluZGVyX3JlZiwgcmJfbm9kZV9kZXNjKTsKLQotCQlpZiAobmV3X3JlZi0+ZGVzYyA8IHJlZi0+ZGVzYykKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAobmV3X3JlZi0+ZGVzYyA+IHJlZi0+ZGVzYykKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCUJVRygpOwotCX0KLQlyYl9saW5rX25vZGUoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ld19yZWYtPnJiX25vZGVfZGVzYywgJnByb2MtPnJlZnNfYnlfZGVzYyk7Ci0JaWYgKG5vZGUpIHsKLQkJaGxpc3RfYWRkX2hlYWQoJm5ld19yZWYtPm5vZGVfZW50cnksICZub2RlLT5yZWZzKTsKLQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkgICAgICJiaW5kZXI6ICVkIG5ldyByZWYgJWQgZGVzYyAlZCBmb3IgIgotCQkJICAgICAibm9kZSAlZFxuIiwgcHJvYy0+cGlkLCBuZXdfcmVmLT5kZWJ1Z19pZCwKLQkJCSAgICAgbmV3X3JlZi0+ZGVzYywgbm9kZS0+ZGVidWdfaWQpOwotCX0gZWxzZSB7Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCSAgICAgImJpbmRlcjogJWQgbmV3IHJlZiAlZCBkZXNjICVkIGZvciAiCi0JCQkgICAgICJkZWFkIG5vZGVcbiIsIHByb2MtPnBpZCwgbmV3X3JlZi0+ZGVidWdfaWQsCi0JCQkgICAgICBuZXdfcmVmLT5kZXNjKTsKLQl9Ci0JcmV0dXJuIG5ld19yZWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9kZWxldGVfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYpCi17Ci0JYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19JTlRFUk5BTF9SRUZTLAotCQkgICAgICJiaW5kZXI6ICVkIGRlbGV0ZSByZWYgJWQgZGVzYyAlZCBmb3IgIgotCQkgICAgICJub2RlICVkXG4iLCByZWYtPnByb2MtPnBpZCwgcmVmLT5kZWJ1Z19pZCwKLQkJICAgICByZWYtPmRlc2MsIHJlZi0+bm9kZS0+ZGVidWdfaWQpOwotCi0JcmJfZXJhc2UoJnJlZi0+cmJfbm9kZV9kZXNjLCAmcmVmLT5wcm9jLT5yZWZzX2J5X2Rlc2MpOwotCXJiX2VyYXNlKCZyZWYtPnJiX25vZGVfbm9kZSwgJnJlZi0+cHJvYy0+cmVmc19ieV9ub2RlKTsKLQlpZiAocmVmLT5zdHJvbmcpCi0JCWJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIDEsIDEpOwotCWhsaXN0X2RlbCgmcmVmLT5ub2RlX2VudHJ5KTsKLQliaW5kZXJfZGVjX25vZGUocmVmLT5ub2RlLCAwLCAxKTsKLQlpZiAocmVmLT5kZWF0aCkgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJICAgICAiYmluZGVyOiAlZCBkZWxldGUgcmVmICVkIGRlc2MgJWQgIgotCQkJICAgICAiaGFzIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcmVmLT5wcm9jLT5waWQsCi0JCQkgICAgIHJlZi0+ZGVidWdfaWQsIHJlZi0+ZGVzYyk7Ci0JCWxpc3RfZGVsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5KTsKLQkJa2ZyZWUocmVmLT5kZWF0aCk7Ci0JCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKLQl9Ci0Ja2ZyZWUocmVmKTsKLQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9SRUYpOwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9pbmNfcmVmKHN0cnVjdCBiaW5kZXJfcmVmICpyZWYsIGludCBzdHJvbmcsCi0JCQkgIHN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0KQotewotCWludCByZXQ7Ci0JaWYgKHN0cm9uZykgewotCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgewotCQkJcmV0ID0gYmluZGVyX2luY19ub2RlKHJlZi0+bm9kZSwgMSwgMSwgdGFyZ2V0X2xpc3QpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JCXJlZi0+c3Ryb25nKys7Ci0JfSBlbHNlIHsKLQkJaWYgKHJlZi0+d2VhayA9PSAwKSB7Ci0JCQlyZXQgPSBiaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCAwLCAxLCB0YXJnZXRfbGlzdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmVmLT53ZWFrKys7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYmluZGVyX2RlY19yZWYoc3RydWN0IGJpbmRlcl9yZWYgKnJlZiwgaW50IHN0cm9uZykKLXsKLQlpZiAoc3Ryb25nKSB7Ci0JCWlmIChyZWYtPnN0cm9uZyA9PSAwKSB7Ci0JCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZCBpbnZhbGlkIGRlYyBzdHJvbmcsICIKLQkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAotCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAotCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZWYtPnN0cm9uZy0tOwotCQlpZiAocmVmLT5zdHJvbmcgPT0gMCkgewotCQkJaW50IHJldDsKLQkJCXJldCA9IGJpbmRlcl9kZWNfbm9kZShyZWYtPm5vZGUsIHN0cm9uZywgMSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocmVmLT53ZWFrID09IDApIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkIGludmFsaWQgZGVjIHdlYWssICIKLQkJCQkJICAicmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkXG4iLAotCQkJCQkgIHJlZi0+cHJvYy0+cGlkLCByZWYtPmRlYnVnX2lkLAotCQkJCQkgIHJlZi0+ZGVzYywgcmVmLT5zdHJvbmcsIHJlZi0+d2Vhayk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZWYtPndlYWstLTsKLQl9Ci0JaWYgKHJlZi0+c3Ryb25nID09IDAgJiYgcmVmLT53ZWFrID09IDApCi0JCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9wb3BfdHJhbnNhY3Rpb24oc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQsCi0JCQkJICAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkKLXsKLQlpZiAodGFyZ2V0X3RocmVhZCkgewotCQlCVUdfT04odGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gdCk7Ci0JCUJVR19PTih0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZnJvbSAhPSB0YXJnZXRfdGhyZWFkKTsKLQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPQotCQkJdGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2stPmZyb21fcGFyZW50OwotCQl0LT5mcm9tID0gTlVMTDsKLQl9Ci0JdC0+bmVlZF9yZXBseSA9IDA7Ci0JaWYgKHQtPmJ1ZmZlcikKLQkJdC0+YnVmZmVyLT50cmFuc2FjdGlvbiA9IE5VTEw7Ci0Ja2ZyZWUodCk7Ci0JYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCwKLQkJCQkgICAgIHVpbnQzMl90IGVycm9yX2NvZGUpCi17Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQ7Ci0JQlVHX09OKHQtPmZsYWdzICYgVEZfT05FX1dBWSk7Ci0Jd2hpbGUgKDEpIHsKLQkJdGFyZ2V0X3RocmVhZCA9IHQtPmZyb207Ci0JCWlmICh0YXJnZXRfdGhyZWFkKSB7Ci0JCQlpZiAodGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LICYmCi0JCQkgICB0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IyID09IEJSX09LKSB7Ci0JCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yMiA9Ci0JCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcjsKLQkJCQl0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKLQkJCX0KLQkJCWlmICh0YXJnZXRfdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0spIHsKLQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiYmluZGVyOiBzZW5kIGZhaWxlZCByZXBseSBmb3IgIgotCQkJCQkgICAgICJ0cmFuc2FjdGlvbiAlZCB0byAlZDolZFxuIiwKLQkJCQkJICAgICAgdC0+ZGVidWdfaWQsIHRhcmdldF90aHJlYWQtPnByb2MtPnBpZCwKLQkJCQkJICAgICAgdGFyZ2V0X3RocmVhZC0+cGlkKTsKLQotCQkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7Ci0JCQkJdGFyZ2V0X3RocmVhZC0+cmV0dXJuX2Vycm9yID0gZXJyb3JfY29kZTsKLQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRhcmdldF90aHJlYWQtPndhaXQpOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogcmVwbHkgZmFpbGVkLCB0YXJnZXQgIgotCQkJCQkidGhyZWFkLCAlZDolZCwgaGFzIGVycm9yIGNvZGUgJWQgIgotCQkJCQkiYWxyZWFkeVxuIiwgdGFyZ2V0X3RocmVhZC0+cHJvYy0+cGlkLAotCQkJCQl0YXJnZXRfdGhyZWFkLT5waWQsCi0JCQkJCXRhcmdldF90aHJlYWQtPnJldHVybl9lcnJvcik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpuZXh0ID0gdC0+ZnJvbV9wYXJlbnQ7Ci0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgImJpbmRlcjogc2VuZCBmYWlsZWQgcmVwbHkgIgotCQkJCSAgICAgImZvciB0cmFuc2FjdGlvbiAlZCwgdGFyZ2V0IGRlYWRcbiIsCi0JCQkJICAgICB0LT5kZWJ1Z19pZCk7Ci0KLQkJCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgdCk7Ci0JCQlpZiAobmV4dCA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUiwKLQkJCQkJICAgICAiYmluZGVyOiByZXBseSBmYWlsZWQsIgotCQkJCQkgICAgICIgbm8gdGFyZ2V0IHRocmVhZCBhdCByb290XG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0ID0gbmV4dDsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBRF9CSU5ERVIsCi0JCQkJICAgICAiYmluZGVyOiByZXBseSBmYWlsZWQsIG5vIHRhcmdldCAiCi0JCQkJICAgICAidGhyZWFkIC0tIHJldHJ5ICVkXG4iLCB0LT5kZWJ1Z19pZCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXIsCi0JCQkJCSAgICAgIHNpemVfdCAqZmFpbGVkX2F0KQotewotCXNpemVfdCAqb2ZmcCwgKm9mZl9lbmQ7Ci0JaW50IGRlYnVnX2lkID0gYnVmZmVyLT5kZWJ1Z19pZDsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCSAgICAgImJpbmRlcjogJWQgYnVmZmVyIHJlbGVhc2UgJWQsIHNpemUgJXpkLSV6ZCwgZmFpbGVkIGF0ICVwXG4iLAotCQkgICAgIHByb2MtPnBpZCwgYnVmZmVyLT5kZWJ1Z19pZCwKLQkJICAgICBidWZmZXItPmRhdGFfc2l6ZSwgYnVmZmVyLT5vZmZzZXRzX3NpemUsIGZhaWxlZF9hdCk7Ci0KLQlpZiAoYnVmZmVyLT50YXJnZXRfbm9kZSkKLQkJYmluZGVyX2RlY19ub2RlKGJ1ZmZlci0+dGFyZ2V0X25vZGUsIDEsIDApOwotCi0Jb2ZmcCA9IChzaXplX3QgKikoYnVmZmVyLT5kYXRhICsgQUxJR04oYnVmZmVyLT5kYXRhX3NpemUsIHNpemVvZih2b2lkICopKSk7Ci0JaWYgKGZhaWxlZF9hdCkKLQkJb2ZmX2VuZCA9IGZhaWxlZF9hdDsKLQllbHNlCi0JCW9mZl9lbmQgPSAodm9pZCAqKW9mZnAgKyBidWZmZXItPm9mZnNldHNfc2l6ZTsKLQlmb3IgKDsgb2ZmcCA8IG9mZl9lbmQ7IG9mZnArKykgewotCQlzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICpmcDsKLQkJaWYgKCpvZmZwID4gYnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSB8fAotCQkgICAgYnVmZmVyLT5kYXRhX3NpemUgPCBzaXplb2YoKmZwKSB8fAotCQkgICAgIUlTX0FMSUdORUQoKm9mZnAsIHNpemVvZih2b2lkICopKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkIgotCQkJCQkib2Zmc2V0ICV6ZCwgc2l6ZSAlemRcbiIsIGRlYnVnX2lkLAotCQkJCQkqb2ZmcCwgYnVmZmVyLT5kYXRhX3NpemUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKShidWZmZXItPmRhdGEgKyAqb2ZmcCk7Ci0JCXN3aXRjaCAoZnAtPnR5cGUpIHsKLQkJY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0JCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKLQkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IGJpbmRlcl9nZXRfbm9kZShwcm9jLCBmcC0+YmluZGVyKTsKLQkJCWlmIChub2RlID09IE5VTEwpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogdHJhbnNhY3Rpb24gcmVsZWFzZSAlZCIKLQkJCQkgICAgICAgIiBiYWQgbm9kZSAlcFxuIiwgZGVidWdfaWQsIGZwLT5iaW5kZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkgICAgICIgICAgICAgIG5vZGUgJWQgdSVwXG4iLAotCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0cik7Ci0JCQliaW5kZXJfZGVjX25vZGUobm9kZSwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfQklOREVSLCAwKTsKLQkJfSBicmVhazsKLQkJY2FzZSBCSU5ERVJfVFlQRV9IQU5ETEU6Ci0JCWNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCBmcC0+aGFuZGxlKTsKLQkJCWlmIChyZWYgPT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiB0cmFuc2FjdGlvbiByZWxlYXNlICVkIgotCQkJCSAgICAgICAiIGJhZCBoYW5kbGUgJWxkXG4iLCBkZWJ1Z19pZCwKLQkJCQkgICAgICAgZnAtPmhhbmRsZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgcmVmICVkIGRlc2MgJWQgKG5vZGUgJWQpXG4iLAotCQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQkJCWJpbmRlcl9kZWNfcmVmKHJlZiwgZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFKTsKLQkJfSBicmVhazsKLQotCQljYXNlIEJJTkRFUl9UWVBFX0ZEOgotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkgICAgICIgICAgICAgIGZkICVsZFxuIiwgZnAtPmhhbmRsZSk7Ci0JCQlpZiAoZmFpbGVkX2F0KQotCQkJCXRhc2tfY2xvc2VfZmQocHJvYywgZnAtPmhhbmRsZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IHRyYW5zYWN0aW9uIHJlbGVhc2UgJWQgYmFkICIKLQkJCSAgICAgICAib2JqZWN0IHR5cGUgJWx4XG4iLCBkZWJ1Z19pZCwgZnAtPnR5cGUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsCi0JCQkgICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCSAgICAgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgKnRyLCBpbnQgcmVwbHkpCi17Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnRjb21wbGV0ZTsKLQlzaXplX3QgKm9mZnAsICpvZmZfZW5kOwotCXN0cnVjdCBiaW5kZXJfcHJvYyAqdGFyZ2V0X3Byb2M7Ci0Jc3RydWN0IGJpbmRlcl90aHJlYWQgKnRhcmdldF90aHJlYWQgPSBOVUxMOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRhcmdldF9saXN0OwotCXdhaXRfcXVldWVfaGVhZF90ICp0YXJnZXRfd2FpdDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICppbl9yZXBseV90byA9IE5VTEw7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmU7Ci0JdWludDMyX3QgcmV0dXJuX2Vycm9yOwotCi0JZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nKTsKLQllLT5jYWxsX3R5cGUgPSByZXBseSA/IDIgOiAhISh0ci0+ZmxhZ3MgJiBURl9PTkVfV0FZKTsKLQllLT5mcm9tX3Byb2MgPSBwcm9jLT5waWQ7Ci0JZS0+ZnJvbV90aHJlYWQgPSB0aHJlYWQtPnBpZDsKLQllLT50YXJnZXRfaGFuZGxlID0gdHItPnRhcmdldC5oYW5kbGU7Ci0JZS0+ZGF0YV9zaXplID0gdHItPmRhdGFfc2l6ZTsKLQllLT5vZmZzZXRzX3NpemUgPSB0ci0+b2Zmc2V0c19zaXplOwotCi0JaWYgKHJlcGx5KSB7Ci0JCWluX3JlcGx5X3RvID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKLQkJaWYgKGluX3JlcGx5X3RvID09IE5VTEwpIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCi0JCQkJCSAgIndpdGggbm8gdHJhbnNhY3Rpb24gc3RhY2tcbiIsCi0JCQkJCSAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQlnb3RvIGVycl9lbXB0eV9jYWxsX3N0YWNrOwotCQl9Ci0JCWJpbmRlcl9zZXRfbmljZShpbl9yZXBseV90by0+c2F2ZWRfcHJpb3JpdHkpOwotCQlpZiAoaW5fcmVwbHlfdG8tPnRvX3RocmVhZCAhPSB0aHJlYWQpIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCi0JCQkJIndpdGggYmFkIHRyYW5zYWN0aW9uIHN0YWNrLCIKLQkJCQkiIHRyYW5zYWN0aW9uICVkIGhhcyB0YXJnZXQgJWQ6JWRcbiIsCi0JCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgaW5fcmVwbHlfdG8tPmRlYnVnX2lkLAotCQkJCWluX3JlcGx5X3RvLT50b19wcm9jID8KLQkJCQlpbl9yZXBseV90by0+dG9fcHJvYy0+cGlkIDogMCwKLQkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkID8KLQkJCQlpbl9yZXBseV90by0+dG9fdGhyZWFkLT5waWQgOiAwKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWluX3JlcGx5X3RvID0gTlVMTDsKLQkJCWdvdG8gZXJyX2JhZF9jYWxsX3N0YWNrOwotCQl9Ci0JCXRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgPSBpbl9yZXBseV90by0+dG9fcGFyZW50OwotCQl0YXJnZXRfdGhyZWFkID0gaW5fcmVwbHlfdG8tPmZyb207Ci0JCWlmICh0YXJnZXRfdGhyZWFkID09IE5VTEwpIHsKLQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7Ci0JCQlnb3RvIGVycl9kZWFkX2JpbmRlcjsKLQkJfQotCQlpZiAodGFyZ2V0X3RocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2sgIT0gaW5fcmVwbHlfdG8pIHsKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB0cmFuc2FjdGlvbiAiCi0JCQkJIndpdGggYmFkIHRhcmdldCB0cmFuc2FjdGlvbiBzdGFjayAlZCwgIgotCQkJCSJleHBlY3RlZCAlZFxuIiwKLQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCXRhcmdldF90aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID8KLQkJCQl0YXJnZXRfdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjay0+ZGVidWdfaWQgOiAwLAotCQkJCWluX3JlcGx5X3RvLT5kZWJ1Z19pZCk7Ci0JCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQlpbl9yZXBseV90byA9IE5VTEw7Ci0JCQl0YXJnZXRfdGhyZWFkID0gTlVMTDsKLQkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOwotCQl9Ci0JCXRhcmdldF9wcm9jID0gdGFyZ2V0X3RocmVhZC0+cHJvYzsKLQl9IGVsc2UgewotCQlpZiAodHItPnRhcmdldC5oYW5kbGUpIHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlyZWYgPSBiaW5kZXJfZ2V0X3JlZihwcm9jLCB0ci0+dGFyZ2V0LmhhbmRsZSk7Ci0JCQlpZiAocmVmID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgIgotCQkJCQkidHJhbnNhY3Rpb24gdG8gaW52YWxpZCBoYW5kbGVcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9pbnZhbGlkX3RhcmdldF9oYW5kbGU7Ci0JCQl9Ci0JCQl0YXJnZXRfbm9kZSA9IHJlZi0+bm9kZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldF9ub2RlID0gYmluZGVyX2NvbnRleHRfbWdyX25vZGU7Ci0JCQlpZiAodGFyZ2V0X25vZGUgPT0gTlVMTCkgewotCQkJCXJldHVybl9lcnJvciA9IEJSX0RFQURfUkVQTFk7Ci0JCQkJZ290byBlcnJfbm9fY29udGV4dF9tZ3Jfbm9kZTsKLQkJCX0KLQkJfQotCQllLT50b19ub2RlID0gdGFyZ2V0X25vZGUtPmRlYnVnX2lkOwotCQl0YXJnZXRfcHJvYyA9IHRhcmdldF9ub2RlLT5wcm9jOwotCQlpZiAodGFyZ2V0X3Byb2MgPT0gTlVMTCkgewotCQkJcmV0dXJuX2Vycm9yID0gQlJfREVBRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2RlYWRfYmluZGVyOwotCQl9Ci0JCWlmICghKHRyLT5mbGFncyAmIFRGX09ORV9XQVkpICYmIHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2spIHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRtcDsKLQkJCXRtcCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7Ci0JCQlpZiAodG1wLT50b190aHJlYWQgIT0gdGhyZWFkKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IG5ldyAiCi0JCQkJCSJ0cmFuc2FjdGlvbiB3aXRoIGJhZCB0cmFuc2FjdGlvbiBzdGFjayIKLQkJCQkJIiwgdHJhbnNhY3Rpb24gJWQgaGFzIHRhcmdldCAlZDolZFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgdG1wLT5kZWJ1Z19pZCwKLQkJCQkJdG1wLT50b19wcm9jID8gdG1wLT50b19wcm9jLT5waWQgOiAwLAotCQkJCQl0bXAtPnRvX3RocmVhZCA/Ci0JCQkJCXRtcC0+dG9fdGhyZWFkLT5waWQgOiAwKTsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfYmFkX2NhbGxfc3RhY2s7Ci0JCQl9Ci0JCQl3aGlsZSAodG1wKSB7Ci0JCQkJaWYgKHRtcC0+ZnJvbSAmJiB0bXAtPmZyb20tPnByb2MgPT0gdGFyZ2V0X3Byb2MpCi0JCQkJCXRhcmdldF90aHJlYWQgPSB0bXAtPmZyb207Ci0JCQkJdG1wID0gdG1wLT5mcm9tX3BhcmVudDsKLQkJCX0KLQkJfQotCX0KLQlpZiAodGFyZ2V0X3RocmVhZCkgewotCQllLT50b190aHJlYWQgPSB0YXJnZXRfdGhyZWFkLT5waWQ7Ci0JCXRhcmdldF9saXN0ID0gJnRhcmdldF90aHJlYWQtPnRvZG87Ci0JCXRhcmdldF93YWl0ID0gJnRhcmdldF90aHJlYWQtPndhaXQ7Ci0JfSBlbHNlIHsKLQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X3Byb2MtPnRvZG87Ci0JCXRhcmdldF93YWl0ID0gJnRhcmdldF9wcm9jLT53YWl0OwotCX0KLQllLT50b19wcm9jID0gdGFyZ2V0X3Byb2MtPnBpZDsKLQotCS8qIFRPRE86IHJldXNlIGluY29taW5nIHRyYW5zYWN0aW9uIGZvciByZXBseSAqLwotCXQgPSBremFsbG9jKHNpemVvZigqdCksIEdGUF9LRVJORUwpOwotCWlmICh0ID09IE5VTEwpIHsKLQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQlnb3RvIGVycl9hbGxvY190X2ZhaWxlZDsKLQl9Ci0JYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotCi0JdGNvbXBsZXRlID0ga3phbGxvYyhzaXplb2YoKnRjb21wbGV0ZSksIEdGUF9LRVJORUwpOwotCWlmICh0Y29tcGxldGUgPT0gTlVMTCkgewotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2FsbG9jX3Rjb21wbGV0ZV9mYWlsZWQ7Ci0JfQotCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLQotCXQtPmRlYnVnX2lkID0gKytiaW5kZXJfbGFzdF9pZDsKLQllLT5kZWJ1Z19pZCA9IHQtPmRlYnVnX2lkOwotCi0JaWYgKHJlcGx5KQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19SRVBMWSAlZCAtPiAlZDolZCwgIgotCQkJICAgICAiZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAotCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfdGhyZWFkLT5waWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKLQllbHNlCi0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX1RSQU5TQUNUSU9OICVkIC0+ICIKLQkJCSAgICAgIiVkIC0gbm9kZSAlZCwgZGF0YSAlcC0lcCBzaXplICV6ZC0lemRcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHQtPmRlYnVnX2lkLAotCQkJICAgICB0YXJnZXRfcHJvYy0+cGlkLCB0YXJnZXRfbm9kZS0+ZGVidWdfaWQsCi0JCQkgICAgIHRyLT5kYXRhLnB0ci5idWZmZXIsIHRyLT5kYXRhLnB0ci5vZmZzZXRzLAotCQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKLQotCWlmICghcmVwbHkgJiYgISh0ci0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKLQkJdC0+ZnJvbSA9IHRocmVhZDsKLQllbHNlCi0JCXQtPmZyb20gPSBOVUxMOwotCXQtPnNlbmRlcl9ldWlkID0gcHJvYy0+dHNrLT5jcmVkLT5ldWlkOwotCXQtPnRvX3Byb2MgPSB0YXJnZXRfcHJvYzsKLQl0LT50b190aHJlYWQgPSB0YXJnZXRfdGhyZWFkOwotCXQtPmNvZGUgPSB0ci0+Y29kZTsKLQl0LT5mbGFncyA9IHRyLT5mbGFnczsKLQl0LT5wcmlvcml0eSA9IHRhc2tfbmljZShjdXJyZW50KTsKLQl0LT5idWZmZXIgPSBiaW5kZXJfYWxsb2NfYnVmKHRhcmdldF9wcm9jLCB0ci0+ZGF0YV9zaXplLAotCQl0ci0+b2Zmc2V0c19zaXplLCAhcmVwbHkgJiYgKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpOwotCWlmICh0LT5idWZmZXIgPT0gTlVMTCkgewotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2JpbmRlcl9hbGxvY19idWZfZmFpbGVkOwotCX0KLQl0LT5idWZmZXItPmFsbG93X3VzZXJfZnJlZSA9IDA7Ci0JdC0+YnVmZmVyLT5kZWJ1Z19pZCA9IHQtPmRlYnVnX2lkOwotCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSB0OwotCXQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUgPSB0YXJnZXRfbm9kZTsKLQlpZiAodGFyZ2V0X25vZGUpCi0JCWJpbmRlcl9pbmNfbm9kZSh0YXJnZXRfbm9kZSwgMSwgMCwgTlVMTCk7Ci0KLQlvZmZwID0gKHNpemVfdCAqKSh0LT5idWZmZXItPmRhdGEgKyBBTElHTih0ci0+ZGF0YV9zaXplLCBzaXplb2Yodm9pZCAqKSkpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHQtPmJ1ZmZlci0+ZGF0YSwgdHItPmRhdGEucHRyLmJ1ZmZlciwgdHItPmRhdGFfc2l6ZSkpIHsKLQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkiZGF0YSBwdHJcbiIsIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2NvcHlfZGF0YV9mYWlsZWQ7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihvZmZwLCB0ci0+ZGF0YS5wdHIub2Zmc2V0cywgdHItPm9mZnNldHNfc2l6ZSkpIHsKLQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkib2Zmc2V0cyBwdHJcbiIsIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCWdvdG8gZXJyX2NvcHlfZGF0YV9mYWlsZWQ7Ci0JfQotCWlmICghSVNfQUxJR05FRCh0ci0+b2Zmc2V0c19zaXplLCBzaXplb2Yoc2l6ZV90KSkpIHsKLQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggIgotCQkJImludmFsaWQgb2Zmc2V0cyBzaXplLCAlemRcbiIsCi0JCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCB0ci0+b2Zmc2V0c19zaXplKTsKLQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQlnb3RvIGVycl9iYWRfb2Zmc2V0OwotCX0KLQlvZmZfZW5kID0gKHZvaWQgKilvZmZwICsgdHItPm9mZnNldHNfc2l6ZTsKLQlmb3IgKDsgb2ZmcCA8IG9mZl9lbmQ7IG9mZnArKykgewotCQlzdHJ1Y3QgZmxhdF9iaW5kZXJfb2JqZWN0ICpmcDsKLQkJaWYgKCpvZmZwID4gdC0+YnVmZmVyLT5kYXRhX3NpemUgLSBzaXplb2YoKmZwKSB8fAotCQkgICAgdC0+YnVmZmVyLT5kYXRhX3NpemUgPCBzaXplb2YoKmZwKSB8fAotCQkgICAgIUlTX0FMSUdORUQoKm9mZnAsIHNpemVvZih2b2lkICopKSkgewotCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290IHRyYW5zYWN0aW9uIHdpdGggIgotCQkJCSJpbnZhbGlkIG9mZnNldCwgJXpkXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsICpvZmZwKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2JhZF9vZmZzZXQ7Ci0JCX0KLQkJZnAgPSAoc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCAqKSh0LT5idWZmZXItPmRhdGEgKyAqb2ZmcCk7Ci0JCXN3aXRjaCAoZnAtPnR5cGUpIHsKLQkJY2FzZSBCSU5ERVJfVFlQRV9CSU5ERVI6Ci0JCWNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6IHsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgZnAtPmJpbmRlcik7Ci0JCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJbm9kZSA9IGJpbmRlcl9uZXdfbm9kZShwcm9jLCBmcC0+YmluZGVyLCBmcC0+Y29va2llKTsKLQkJCQlpZiAobm9kZSA9PSBOVUxMKSB7Ci0JCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQkJZ290byBlcnJfYmluZGVyX25ld19ub2RlX2ZhaWxlZDsKLQkJCQl9Ci0JCQkJbm9kZS0+bWluX3ByaW9yaXR5ID0gZnAtPmZsYWdzICYgRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLOwotCQkJCW5vZGUtPmFjY2VwdF9mZHMgPSAhIShmcC0+ZmxhZ3MgJiBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTKTsKLQkJCX0KLQkJCWlmIChmcC0+Y29va2llICE9IG5vZGUtPmNvb2tpZSkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIHNlbmRpbmcgdSVwICIKLQkJCQkJIm5vZGUgJWQsIGNvb2tpZSBtaXNtYXRjaCAlcCAhPSAlcFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJZnAtPmJpbmRlciwgbm9kZS0+ZGVidWdfaWQsCi0JCQkJCWZwLT5jb29raWUsIG5vZGUtPmNvb2tpZSk7Ci0JCQkJZ290byBlcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOwotCQkJfQotCQkJcmVmID0gYmluZGVyX2dldF9yZWZfZm9yX25vZGUodGFyZ2V0X3Byb2MsIG5vZGUpOwotCQkJaWYgKHJlZiA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlX2ZhaWxlZDsKLQkJCX0KLQkJCWlmIChmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIpCi0JCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9IQU5ETEU7Ci0JCQllbHNlCi0JCQkJZnAtPnR5cGUgPSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTsKLQkJCWZwLT5oYW5kbGUgPSByZWYtPmRlc2M7Ci0JCQliaW5kZXJfaW5jX3JlZihyZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwKLQkJCQkgICAgICAgJnRocmVhZC0+dG9kbyk7Ci0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJICAgICAiICAgICAgICBub2RlICVkIHUlcCAtPiByZWYgJWQgZGVzYyAlZFxuIiwKLQkJCQkgICAgIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIHJlZi0+ZGVidWdfaWQsCi0JCQkJICAgICByZWYtPmRlc2MpOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9UWVBFX0hBTkRMRToKLQkJY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRTogewotCQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIGZwLT5oYW5kbGUpOwotCQkJaWYgKHJlZiA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgZ290ICIKLQkJCQkJInRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCAiCi0JCQkJCSJoYW5kbGUsICVsZFxuIiwgcHJvYy0+cGlkLAotCQkJCQl0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2JpbmRlcl9nZXRfcmVmX2ZhaWxlZDsKLQkJCX0KLQkJCWlmIChyZWYtPm5vZGUtPnByb2MgPT0gdGFyZ2V0X3Byb2MpIHsKLQkJCQlpZiAoZnAtPnR5cGUgPT0gQklOREVSX1RZUEVfSEFORExFKQotCQkJCQlmcC0+dHlwZSA9IEJJTkRFUl9UWVBFX0JJTkRFUjsKLQkJCQllbHNlCi0JCQkJCWZwLT50eXBlID0gQklOREVSX1RZUEVfV0VBS19CSU5ERVI7Ci0JCQkJZnAtPmJpbmRlciA9IHJlZi0+bm9kZS0+cHRyOwotCQkJCWZwLT5jb29raWUgPSByZWYtPm5vZGUtPmNvb2tpZTsKLQkJCQliaW5kZXJfaW5jX25vZGUocmVmLT5ub2RlLCBmcC0+dHlwZSA9PSBCSU5ERVJfVFlQRV9CSU5ERVIsIDAsIE5VTEwpOwotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT04sCi0JCQkJCSAgICAgIiAgICAgICAgcmVmICVkIGRlc2MgJWQgLT4gbm9kZSAlZCB1JXBcbiIsCi0JCQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkLAotCQkJCQkgICAgIHJlZi0+bm9kZS0+cHRyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RydWN0IGJpbmRlcl9yZWYgKm5ld19yZWY7Ci0JCQkJbmV3X3JlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHRhcmdldF9wcm9jLCByZWYtPm5vZGUpOwotCQkJCWlmIChuZXdfcmVmID09IE5VTEwpIHsKLQkJCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCQlnb3RvIGVycl9iaW5kZXJfZ2V0X3JlZl9mb3Jfbm9kZV9mYWlsZWQ7Ci0JCQkJfQotCQkJCWZwLT5oYW5kbGUgPSBuZXdfcmVmLT5kZXNjOwotCQkJCWJpbmRlcl9pbmNfcmVmKG5ld19yZWYsIGZwLT50eXBlID09IEJJTkRFUl9UWVBFX0hBTkRMRSwgTlVMTCk7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19UUkFOU0FDVElPTiwKLQkJCQkJICAgICAiICAgICAgICByZWYgJWQgZGVzYyAlZCAtPiByZWYgJWQgZGVzYyAlZCAobm9kZSAlZClcbiIsCi0JCQkJCSAgICAgcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLCBuZXdfcmVmLT5kZWJ1Z19pZCwKLQkJCQkJICAgICBuZXdfcmVmLT5kZXNjLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQkJCX0KLQkJfSBicmVhazsKLQotCQljYXNlIEJJTkRFUl9UWVBFX0ZEOiB7Ci0JCQlpbnQgdGFyZ2V0X2ZkOwotCQkJc3RydWN0IGZpbGUgKmZpbGU7Ci0KLQkJCWlmIChyZXBseSkgewotCQkJCWlmICghKGluX3JlcGx5X3RvLT5mbGFncyAmIFRGX0FDQ0VQVF9GRFMpKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCByZXBseSB3aXRoIGZkLCAlbGQsIGJ1dCB0YXJnZXQgZG9lcyBub3QgYWxsb3cgZmRzXG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQkJZ290byBlcnJfZmRfbm90X2FsbG93ZWQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghdGFyZ2V0X25vZGUtPmFjY2VwdF9mZHMpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBmZCwgJWxkLCBidXQgdGFyZ2V0IGRvZXMgbm90IGFsbG93IGZkc1xuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZnAtPmhhbmRsZSk7Ci0JCQkJcmV0dXJuX2Vycm9yID0gQlJfRkFJTEVEX1JFUExZOwotCQkJCWdvdG8gZXJyX2ZkX25vdF9hbGxvd2VkOwotCQkJfQotCi0JCQlmaWxlID0gZmdldChmcC0+aGFuZGxlKTsKLQkJCWlmIChmaWxlID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBnb3QgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIGZkLCAlbGRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT5oYW5kbGUpOwotCQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCQlnb3RvIGVycl9mZ2V0X2ZhaWxlZDsKLQkJCX0KLQkJCXRhcmdldF9mZCA9IHRhc2tfZ2V0X3VudXNlZF9mZF9mbGFncyh0YXJnZXRfcHJvYywgT19DTE9FWEVDKTsKLQkJCWlmICh0YXJnZXRfZmQgPCAwKSB7Ci0JCQkJZnB1dChmaWxlKTsKLQkJCQlyZXR1cm5fZXJyb3IgPSBCUl9GQUlMRURfUkVQTFk7Ci0JCQkJZ290byBlcnJfZ2V0X3VudXNlZF9mZF9mYWlsZWQ7Ci0JCQl9Ci0JCQl0YXNrX2ZkX2luc3RhbGwodGFyZ2V0X3Byb2MsIHRhcmdldF9mZCwgZmlsZSk7Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJCSAgICAgIiAgICAgICAgZmQgJWxkIC0+ICVkXG4iLCBmcC0+aGFuZGxlLCB0YXJnZXRfZmQpOwotCQkJLyogVE9ETzogZnB1dD8gKi8KLQkJCWZwLT5oYW5kbGUgPSB0YXJnZXRfZmQ7Ci0JCX0gYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIGdvdCB0cmFuc2FjdGlvIgotCQkJCSJuIHdpdGggaW52YWxpZCBvYmplY3QgdHlwZSwgJWx4XG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGZwLT50eXBlKTsKLQkJCXJldHVybl9lcnJvciA9IEJSX0ZBSUxFRF9SRVBMWTsKLQkJCWdvdG8gZXJyX2JhZF9vYmplY3RfdHlwZTsKLQkJfQotCX0KLQlpZiAocmVwbHkpIHsKLQkJQlVHX09OKHQtPmJ1ZmZlci0+YXN5bmNfdHJhbnNhY3Rpb24gIT0gMCk7Ci0JCWJpbmRlcl9wb3BfdHJhbnNhY3Rpb24odGFyZ2V0X3RocmVhZCwgaW5fcmVwbHlfdG8pOwotCX0gZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7Ci0JCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDApOwotCQl0LT5uZWVkX3JlcGx5ID0gMTsKLQkJdC0+ZnJvbV9wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOwotCQl0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID0gdDsKLQl9IGVsc2UgewotCQlCVUdfT04odGFyZ2V0X25vZGUgPT0gTlVMTCk7Ci0JCUJVR19PTih0LT5idWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICE9IDEpOwotCQlpZiAodGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbikgewotCQkJdGFyZ2V0X2xpc3QgPSAmdGFyZ2V0X25vZGUtPmFzeW5jX3RvZG87Ci0JCQl0YXJnZXRfd2FpdCA9IE5VTEw7Ci0JCX0gZWxzZQotCQkJdGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbiA9IDE7Ci0JfQotCXQtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOwotCWxpc3RfYWRkX3RhaWwoJnQtPndvcmsuZW50cnksIHRhcmdldF9saXN0KTsKLQl0Y29tcGxldGUtPnR5cGUgPSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURTsKLQlsaXN0X2FkZF90YWlsKCZ0Y29tcGxldGUtPmVudHJ5LCAmdGhyZWFkLT50b2RvKTsKLQlpZiAodGFyZ2V0X3dhaXQpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSh0YXJnZXRfd2FpdCk7Ci0JcmV0dXJuOwotCi1lcnJfZ2V0X3VudXNlZF9mZF9mYWlsZWQ6Ci1lcnJfZmdldF9mYWlsZWQ6Ci1lcnJfZmRfbm90X2FsbG93ZWQ6Ci1lcnJfYmluZGVyX2dldF9yZWZfZm9yX25vZGVfZmFpbGVkOgotZXJyX2JpbmRlcl9nZXRfcmVmX2ZhaWxlZDoKLWVycl9iaW5kZXJfbmV3X25vZGVfZmFpbGVkOgotZXJyX2JhZF9vYmplY3RfdHlwZToKLWVycl9iYWRfb2Zmc2V0OgotZXJyX2NvcHlfZGF0YV9mYWlsZWQ6Ci0JYmluZGVyX3RyYW5zYWN0aW9uX2J1ZmZlcl9yZWxlYXNlKHRhcmdldF9wcm9jLCB0LT5idWZmZXIsIG9mZnApOwotCXQtPmJ1ZmZlci0+dHJhbnNhY3Rpb24gPSBOVUxMOwotCWJpbmRlcl9mcmVlX2J1Zih0YXJnZXRfcHJvYywgdC0+YnVmZmVyKTsKLWVycl9iaW5kZXJfYWxsb2NfYnVmX2ZhaWxlZDoKLQlrZnJlZSh0Y29tcGxldGUpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLWVycl9hbGxvY190Y29tcGxldGVfZmFpbGVkOgotCWtmcmVlKHQpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OKTsKLWVycl9hbGxvY190X2ZhaWxlZDoKLWVycl9iYWRfY2FsbF9zdGFjazoKLWVycl9lbXB0eV9jYWxsX3N0YWNrOgotZXJyX2RlYWRfYmluZGVyOgotZXJyX2ludmFsaWRfdGFyZ2V0X2hhbmRsZToKLWVycl9ub19jb250ZXh0X21ncl9ub2RlOgotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRkFJTEVEX1RSQU5TQUNUSU9OLAotCQkgICAgICJiaW5kZXI6ICVkOiVkIHRyYW5zYWN0aW9uIGZhaWxlZCAlZCwgc2l6ZSAlemQtJXpkXG4iLAotCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHJldHVybl9lcnJvciwKLQkJICAgICB0ci0+ZGF0YV9zaXplLCB0ci0+b2Zmc2V0c19zaXplKTsKLQotCXsKLQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmZlOwotCQlmZSA9IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfYWRkKCZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZCk7Ci0JCSpmZSA9ICplOwotCX0KLQotCUJVR19PTih0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyk7Ci0JaWYgKGluX3JlcGx5X3RvKSB7Ci0JCXRocmVhZC0+cmV0dXJuX2Vycm9yID0gQlJfVFJBTlNBQ1RJT05fQ09NUExFVEU7Ci0JCWJpbmRlcl9zZW5kX2ZhaWxlZF9yZXBseShpbl9yZXBseV90bywgcmV0dXJuX2Vycm9yKTsKLQl9IGVsc2UKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSByZXR1cm5fZXJyb3I7Ci19Ci0KLWludCBiaW5kZXJfdGhyZWFkX3dyaXRlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCXZvaWQgX191c2VyICpidWZmZXIsIGludCBzaXplLCBzaWduZWQgbG9uZyAqY29uc3VtZWQpCi17Ci0JdWludDMyX3QgY21kOwotCXZvaWQgX191c2VyICpwdHIgPSBidWZmZXIgKyAqY29uc3VtZWQ7Ci0Jdm9pZCBfX3VzZXIgKmVuZCA9IGJ1ZmZlciArIHNpemU7Ci0KLQl3aGlsZSAocHRyIDwgZW5kICYmIHRocmVhZC0+cmV0dXJuX2Vycm9yID09IEJSX09LKSB7Ci0JCWlmIChnZXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYmMpKSB7Ci0JCQliaW5kZXJfc3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOwotCQkJcHJvYy0+c3RhdHMuYmNbX0lPQ19OUihjbWQpXSsrOwotCQkJdGhyZWFkLT5zdGF0cy5iY1tfSU9DX05SKGNtZCldKys7Ci0JCX0KLQkJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBCQ19JTkNSRUZTOgotCQljYXNlIEJDX0FDUVVJUkU6Ci0JCWNhc2UgQkNfUkVMRUFTRToKLQkJY2FzZSBCQ19ERUNSRUZTOiB7Ci0JCQl1aW50MzJfdCB0YXJnZXQ7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOwotCQkJY29uc3QgY2hhciAqZGVidWdfc3RyaW5nOwotCi0JCQlpZiAoZ2V0X3VzZXIodGFyZ2V0LCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHRhcmdldCA9PSAwICYmIGJpbmRlcl9jb250ZXh0X21ncl9ub2RlICYmCi0JCQkgICAgKGNtZCA9PSBCQ19JTkNSRUZTIHx8IGNtZCA9PSBCQ19BQ1FVSVJFKSkgewotCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmX2Zvcl9ub2RlKHByb2MsCi0JCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3Jfbm9kZSk7Ci0JCQkJaWYgKHJlZi0+ZGVzYyAhPSB0YXJnZXQpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6IgotCQkJCQkJIiVkIHRyaWVkIHRvIGFjcXVpcmUgIgotCQkJCQkJInJlZmVyZW5jZSB0byBkZXNjIDAsICIKLQkJCQkJCSJnb3QgJWQgaW5zdGVhZFxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCQlyZWYtPmRlc2MpOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXJlZiA9IGJpbmRlcl9nZXRfcmVmKHByb2MsIHRhcmdldCk7Ci0JCQlpZiAocmVmID09IE5VTEwpIHsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCByZWZjb3UiCi0JCQkJCSJudCBjaGFuZ2Ugb24gaW52YWxpZCByZWYgJWRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRhcmdldCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNtZCkgewotCQkJY2FzZSBCQ19JTkNSRUZTOgotCQkJCWRlYnVnX3N0cmluZyA9ICJJbmNSZWZzIjsKLQkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDAsIE5VTEwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQ19BQ1FVSVJFOgotCQkJCWRlYnVnX3N0cmluZyA9ICJBY3F1aXJlIjsKLQkJCQliaW5kZXJfaW5jX3JlZihyZWYsIDEsIE5VTEwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQ19SRUxFQVNFOgotCQkJCWRlYnVnX3N0cmluZyA9ICJSZWxlYXNlIjsKLQkJCQliaW5kZXJfZGVjX3JlZihyZWYsIDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQ19ERUNSRUZTOgotCQkJZGVmYXVsdDoKLQkJCQlkZWJ1Z19zdHJpbmcgPSAiRGVjUmVmcyI7Ci0JCQkJYmluZGVyX2RlY19yZWYocmVmLCAwKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVVNFUl9SRUZTLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgcmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkIGZvciBub2RlICVkXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgZGVidWdfc3RyaW5nLCByZWYtPmRlYnVnX2lkLAotCQkJCSAgICAgcmVmLT5kZXNjLCByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQkNfSU5DUkVGU19ET05FOgotCQljYXNlIEJDX0FDUVVJUkVfRE9ORTogewotCQkJdm9pZCBfX3VzZXIgKm5vZGVfcHRyOwotCQkJdm9pZCAqY29va2llOwotCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlOwotCi0JCQlpZiAoZ2V0X3VzZXIobm9kZV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCWlmIChnZXRfdXNlcihjb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCW5vZGUgPSBiaW5kZXJfZ2V0X25vZGUocHJvYywgbm9kZV9wdHIpOwotCQkJaWYgKG5vZGUgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKLQkJCQkJIiVzIHUlcCBubyBtYXRjaFxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJY21kID09IEJDX0lOQ1JFRlNfRE9ORSA/Ci0JCQkJCSJCQ19JTkNSRUZTX0RPTkUiIDoKLQkJCQkJIkJDX0FDUVVJUkVfRE9ORSIsCi0JCQkJCW5vZGVfcHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjb29raWUgIT0gbm9kZS0+Y29va2llKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgJXMgdSVwIG5vZGUgJWQiCi0JCQkJCSIgY29va2llIG1pc21hdGNoICVwICE9ICVwXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQljbWQgPT0gQkNfSU5DUkVGU19ET05FID8KLQkJCQkJIkJDX0lOQ1JFRlNfRE9ORSIgOiAiQkNfQUNRVUlSRV9ET05FIiwKLQkJCQkJbm9kZV9wdHIsIG5vZGUtPmRlYnVnX2lkLAotCQkJCQljb29raWUsIG5vZGUtPmNvb2tpZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY21kID09IEJDX0FDUVVJUkVfRE9ORSkgewotCQkJCWlmIChub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPT0gMCkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCAiCi0JCQkJCQkiQkNfQUNRVUlSRV9ET05FIG5vZGUgJWQgaGFzICIKLQkJCQkJCSJubyBwZW5kaW5nIGFjcXVpcmUgcmVxdWVzdFxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsCi0JCQkJCQlub2RlLT5kZWJ1Z19pZCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9PSAwKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICIKLQkJCQkJCSJCQ19JTkNSRUZTX0RPTkUgbm9kZSAlZCBoYXMgIgotCQkJCQkJIm5vIHBlbmRpbmcgaW5jcmVmcyByZXF1ZXN0XG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCW5vZGUtPmRlYnVnX2lkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCW5vZGUtPnBlbmRpbmdfd2Vha19yZWYgPSAwOwotCQkJfQotCQkJYmluZGVyX2RlY19ub2RlKG5vZGUsIGNtZCA9PSBCQ19BQ1FVSVJFX0RPTkUsIDApOwotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19VU0VSX1JFRlMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyBub2RlICVkIGxzICVkIGx3ICVkXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkgICAgIGNtZCA9PSBCQ19JTkNSRUZTX0RPTkUgPyAiQkNfSU5DUkVGU19ET05FIiA6ICJCQ19BQ1FVSVJFX0RPTkUiLAotCQkJCSAgICAgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLCBub2RlLT5sb2NhbF93ZWFrX3JlZnMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBCQ19BVFRFTVBUX0FDUVVJUkU6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQVRURU1QVF9BQ1FVSVJFIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNhc2UgQkNfQUNRVUlSRV9SRVNVTFQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQkNfQUNRVUlSRV9SRVNVTFQgbm90IHN1cHBvcnRlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQljYXNlIEJDX0ZSRUVfQlVGRkVSOiB7Ci0JCQl2b2lkIF9fdXNlciAqZGF0YV9wdHI7Ci0JCQlzdHJ1Y3QgYmluZGVyX2J1ZmZlciAqYnVmZmVyOwotCi0JCQlpZiAoZ2V0X3VzZXIoZGF0YV9wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQotCQkJYnVmZmVyID0gYmluZGVyX2J1ZmZlcl9sb29rdXAocHJvYywgZGF0YV9wdHIpOwotCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgotCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG5vIG1hdGNoXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBkYXRhX3B0cik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWJ1ZmZlci0+YWxsb3dfdXNlcl9mcmVlKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgIgotCQkJCQkiQkNfRlJFRV9CVUZGRVIgdSVwIG1hdGNoZWQgIgotCQkJCQkidW5yZXR1cm5lZCBidWZmZXJcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfRlJFRV9CVUZGRVIsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19GUkVFX0JVRkZFUiB1JXAgZm91bmQgYnVmZmVyICVkIGZvciAlcyB0cmFuc2FjdGlvblxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGRhdGFfcHRyLCBidWZmZXItPmRlYnVnX2lkLAotCQkJCSAgICAgYnVmZmVyLT50cmFuc2FjdGlvbiA/ICJhY3RpdmUiIDogImZpbmlzaGVkIik7Ci0KLQkJCWlmIChidWZmZXItPnRyYW5zYWN0aW9uKSB7Ci0JCQkJYnVmZmVyLT50cmFuc2FjdGlvbi0+YnVmZmVyID0gTlVMTDsKLQkJCQlidWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCX0KLQkJCWlmIChidWZmZXItPmFzeW5jX3RyYW5zYWN0aW9uICYmIGJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKLQkJCQlCVUdfT04oIWJ1ZmZlci0+dGFyZ2V0X25vZGUtPmhhc19hc3luY190cmFuc2FjdGlvbik7Ci0JCQkJaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlci0+dGFyZ2V0X25vZGUtPmFzeW5jX3RvZG8pKQotCQkJCQlidWZmZXItPnRhcmdldF9ub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24gPSAwOwotCQkJCWVsc2UKLQkJCQkJbGlzdF9tb3ZlX3RhaWwoYnVmZmVyLT50YXJnZXRfbm9kZS0+YXN5bmNfdG9kby5uZXh0LCAmdGhyZWFkLT50b2RvKTsKLQkJCX0KLQkJCWJpbmRlcl90cmFuc2FjdGlvbl9idWZmZXJfcmVsZWFzZShwcm9jLCBidWZmZXIsIE5VTEwpOwotCQkJYmluZGVyX2ZyZWVfYnVmKHByb2MsIGJ1ZmZlcik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgQkNfVFJBTlNBQ1RJT046Ci0JCWNhc2UgQkNfUkVQTFk6IHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0ciwgcHRyLCBzaXplb2YodHIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodHIpOwotCQkJYmluZGVyX3RyYW5zYWN0aW9uKHByb2MsIHRocmVhZCwgJnRyLCBjbWQgPT0gQkNfUkVQTFkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIEJDX1JFR0lTVEVSX0xPT1BFUjoKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVEhSRUFEUywKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX1JFR0lTVEVSX0xPT1BFUlxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSB7Ci0JCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9JTlZBTElEOwotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkIEVSUk9SOiIKLQkJCQkJIiBCQ19SRUdJU1RFUl9MT09QRVIgY2FsbGVkICIKLQkJCQkJImFmdGVyIEJDX0VOVEVSX0xPT1BFUlxuIiwKLQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCk7Ci0JCQl9IGVsc2UgaWYgKHByb2MtPnJlcXVlc3RlZF90aHJlYWRzID09IDApIHsKLQkJCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX0lOVkFMSUQ7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgRVJST1I6IgotCQkJCQkiIEJDX1JFR0lTVEVSX0xPT1BFUiBjYWxsZWQgIgotCQkJCQkid2l0aG91dCByZXF1ZXN0XG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMtLTsKLQkJCQlwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkKys7Ci0JCQl9Ci0JCQl0aHJlYWQtPmxvb3BlciB8PSBCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBCQ19FTlRFUl9MT09QRVI6Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RIUkVBRFMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19FTlRFUl9MT09QRVJcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCWlmICh0aHJlYWQtPmxvb3BlciAmIEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCkgewotCQkJCXRocmVhZC0+bG9vcGVyIHw9IEJJTkRFUl9MT09QRVJfU1RBVEVfSU5WQUxJRDsKLQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjoiCi0JCQkJCSIgQkNfRU5URVJfTE9PUEVSIGNhbGxlZCBhZnRlciAiCi0JCQkJCSJCQ19SRUdJU1RFUl9MT09QRVJcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJfQotCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgQkNfRVhJVF9MT09QRVI6Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RIUkVBRFMsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCQ19FWElUX0xPT1BFUlxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9FWElURUQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OOgotCQljYXNlIEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewotCQkJdWludDMyX3QgdGFyZ2V0OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmICpyZWY7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCAqZGVhdGg7Ci0KLQkJCWlmIChnZXRfdXNlcih0YXJnZXQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJcmVmID0gYmluZGVyX2dldF9yZWYocHJvYywgdGFyZ2V0KTsKLQkJCWlmIChyZWYgPT0gTlVMTCkgewotCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiVkICVzICIKLQkJCQkJImludmFsaWQgcmVmICVkXG4iLAotCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkLAotCQkJCQljbWQgPT0gQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gPwotCQkJCQkiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iIDoKLQkJCQkJIkJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiIsCi0JCQkJCXRhcmdldCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBVEhfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgJXAgcmVmICVkIGRlc2MgJWQgcyAlZCB3ICVkIGZvciBub2RlICVkXG4iLAotCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkgICAgIGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTiA/Ci0JCQkJICAgICAiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04iIDoKLQkJCQkgICAgICJCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04iLAotCQkJCSAgICAgY29va2llLCByZWYtPmRlYnVnX2lkLCByZWYtPmRlc2MsCi0JCQkJICAgICByZWYtPnN0cm9uZywgcmVmLT53ZWFrLCByZWYtPm5vZGUtPmRlYnVnX2lkKTsKLQotCQkJaWYgKGNtZCA9PSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTikgewotCQkJCWlmIChyZWYtPmRlYXRoKSB7Ci0JCQkJCWJpbmRlcl91c2VyX2Vycm9yKCJiaW5kZXI6ICVkOiUiCi0JCQkJCQkiZCBCQ19SRVFVRVNUX0RFQVRIX05PVEkiCi0JCQkJCQkiRklDQVRJT04gZGVhdGggbm90aWZpYyIKLQkJCQkJCSJhdGlvbiBhbHJlYWR5IHNldFxuIiwKLQkJCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVhdGggPSBremFsbG9jKHNpemVvZigqZGVhdGgpLCBHRlBfS0VSTkVMKTsKLQkJCQlpZiAoZGVhdGggPT0gTlVMTCkgewotCQkJCQl0aHJlYWQtPnJldHVybl9lcnJvciA9IEJSX0VSUk9SOwotCQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0ZBSUxFRF9UUkFOU0FDVElPTiwKLQkJCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgIgotCQkJCQkJICAgICAiQkNfUkVRVUVTVF9ERUFUSF9OT1RJRklDQVRJT04gZmFpbGVkXG4iLAotCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJpbmRlcl9zdGF0c19jcmVhdGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKLQkJCQlJTklUX0xJU1RfSEVBRCgmZGVhdGgtPndvcmsuZW50cnkpOwotCQkJCWRlYXRoLT5jb29raWUgPSBjb29raWU7Ci0JCQkJcmVmLT5kZWF0aCA9IGRlYXRoOwotCQkJCWlmIChyZWYtPm5vZGUtPnByb2MgPT0gTlVMTCkgewotCQkJCQlyZWYtPmRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19ERUFEX0JJTkRFUjsKLQkJCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKLQkJCQkJCWxpc3RfYWRkX3RhaWwoJnJlZi0+ZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbGlzdF9hZGRfdGFpbCgmcmVmLT5kZWF0aC0+d29yay5lbnRyeSwgJnByb2MtPnRvZG8pOwotCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZi0+ZGVhdGggPT0gTlVMTCkgewotCQkJCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolIgotCQkJCQkJImQgQkNfQ0xFQVJfREVBVEhfTk9USUZJIgotCQkJCQkJIkNBVElPTiBkZWF0aCBub3RpZmljYXQiCi0JCQkJCQkiaW9uIG5vdCBhY3RpdmVcbiIsCi0JCQkJCQlwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlYXRoID0gcmVmLT5kZWF0aDsKLQkJCQlpZiAoZGVhdGgtPmNvb2tpZSAhPSBjb29raWUpIHsKLQkJCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JSIKLQkJCQkJCSJkIEJDX0NMRUFSX0RFQVRIX05PVElGSSIKLQkJCQkJCSJDQVRJT04gZGVhdGggbm90aWZpY2F0IgotCQkJCQkJImlvbiBjb29raWUgbWlzbWF0Y2ggIgotCQkJCQkJIiVwICE9ICVwXG4iLAotCQkJCQkJcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkJCWRlYXRoLT5jb29raWUsIGNvb2tpZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZWYtPmRlYXRoID0gTlVMTDsKLQkJCQlpZiAobGlzdF9lbXB0eSgmZGVhdGgtPndvcmsuZW50cnkpKSB7Ci0JCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT047Ci0JCQkJCWlmICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfCBCSU5ERVJfTE9PUEVSX1NUQVRFX0VOVEVSRUQpKSB7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnRocmVhZC0+dG9kbyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZkZWF0aC0+d29yay5lbnRyeSwgJnByb2MtPnRvZG8pOwotCQkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcm9jLT53YWl0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUJVR19PTihkZWF0aC0+d29yay50eXBlICE9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSKTsKLQkJCQkJZGVhdGgtPndvcmsudHlwZSA9IEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQkNfREVBRF9CSU5ERVJfRE9ORTogewotCQkJc3RydWN0IGJpbmRlcl93b3JrICp3OwotCQkJdm9pZCBfX3VzZXIgKmNvb2tpZTsKLQkJCXN0cnVjdCBiaW5kZXJfcmVmX2RlYXRoICpkZWF0aCA9IE5VTEw7Ci0JCQlpZiAoZ2V0X3VzZXIoY29va2llLCAodm9pZCBfX3VzZXIgKiBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlwdHIgKz0gc2l6ZW9mKHZvaWQgKik7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgsIGVudHJ5KSB7Ci0JCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKnRtcF9kZWF0aCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCwgd29yayk7Ci0JCQkJaWYgKHRtcF9kZWF0aC0+Y29va2llID09IGNvb2tpZSkgewotCQkJCQlkZWF0aCA9IHRtcF9kZWF0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19ERUFEX0JJTkRFUiwKLQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIEJDX0RFQURfQklOREVSX0RPTkUgJXAgZm91bmQgJXBcbiIsCi0JCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBjb29raWUsIGRlYXRoKTsKLQkJCWlmIChkZWF0aCA9PSBOVUxMKSB7Ci0JCQkJYmluZGVyX3VzZXJfZXJyb3IoImJpbmRlcjogJWQ6JWQgQkNfREVBRCIKLQkJCQkJIl9CSU5ERVJfRE9ORSAlcCBub3QgZm91bmRcbiIsCi0JCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNvb2tpZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWxpc3RfZGVsX2luaXQoJmRlYXRoLT53b3JrLmVudHJ5KTsKLQkJCWlmIChkZWF0aC0+d29yay50eXBlID09IEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUikgewotCQkJCWRlYXRoLT53b3JrLnR5cGUgPSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT047Ci0JCQkJaWYgKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8IEJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpIHsKLQkJCQkJbGlzdF9hZGRfdGFpbCgmZGVhdGgtPndvcmsuZW50cnksICZ0aHJlYWQtPnRvZG8pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxpc3RfYWRkX3RhaWwoJmRlYXRoLT53b3JrLmVudHJ5LCAmcHJvYy0+dG9kbyk7Ci0JCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7Ci0JCQkJfQotCQkJfQotCQl9IGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogJWQ6JWQgdW5rbm93biBjb21tYW5kICVkXG4iLAotCQkJICAgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGNtZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQkqY29uc3VtZWQgPSBwdHIgLSBidWZmZXI7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIGJpbmRlcl9zdGF0X2JyKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJICAgIHVpbnQzMl90IGNtZCkKLXsKLQlpZiAoX0lPQ19OUihjbWQpIDwgQVJSQVlfU0laRShiaW5kZXJfc3RhdHMuYnIpKSB7Ci0JCWJpbmRlcl9zdGF0cy5icltfSU9DX05SKGNtZCldKys7Ci0JCXByb2MtPnN0YXRzLmJyW19JT0NfTlIoY21kKV0rKzsKLQkJdGhyZWFkLT5zdGF0cy5icltfSU9DX05SKGNtZCldKys7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9oYXNfcHJvY193b3JrKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQotewotCXJldHVybiAhbGlzdF9lbXB0eSgmcHJvYy0+dG9kbykgfHwKLQkJKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTik7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2hhc190aHJlYWRfd29yayhzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkKQotewotCXJldHVybiAhbGlzdF9lbXB0eSgmdGhyZWFkLT50b2RvKSB8fCB0aHJlYWQtPnJldHVybl9lcnJvciAhPSBCUl9PSyB8fAotCQkodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKTsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfdGhyZWFkX3JlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jLAotCQkJICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCwKLQkJCSAgICAgIHZvaWQgIF9fdXNlciAqYnVmZmVyLCBpbnQgc2l6ZSwKLQkJCSAgICAgIHNpZ25lZCBsb25nICpjb25zdW1lZCwgaW50IG5vbl9ibG9jaykKLXsKLQl2b2lkIF9fdXNlciAqcHRyID0gYnVmZmVyICsgKmNvbnN1bWVkOwotCXZvaWQgX191c2VyICplbmQgPSBidWZmZXIgKyBzaXplOwotCi0JaW50IHJldCA9IDA7Ci0JaW50IHdhaXRfZm9yX3Byb2Nfd29yazsKLQotCWlmICgqY29uc3VtZWQgPT0gMCkgewotCQlpZiAocHV0X3VzZXIoQlJfTk9PUCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0JfQotCi1yZXRyeToKLQl3YWl0X2Zvcl9wcm9jX3dvcmsgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrID09IE5VTEwgJiYKLQkJCQlsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pOwotCi0JaWYgKHRocmVhZC0+cmV0dXJuX2Vycm9yICE9IEJSX09LICYmIHB0ciA8IGVuZCkgewotCQlpZiAodGhyZWFkLT5yZXR1cm5fZXJyb3IyICE9IEJSX09LKSB7Ci0JCQlpZiAocHV0X3VzZXIodGhyZWFkLT5yZXR1cm5fZXJyb3IyLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHB0ciA9PSBlbmQpCi0JCQkJZ290byBkb25lOwotCQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0gQlJfT0s7Ci0JCX0KLQkJaWYgKHB1dF91c2VyKHRocmVhZC0+cmV0dXJuX2Vycm9yLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKLQkJZ290byBkb25lOwotCX0KLQotCi0JdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HOwotCWlmICh3YWl0X2Zvcl9wcm9jX3dvcmspCi0JCXByb2MtPnJlYWR5X3RocmVhZHMrKzsKLQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKLQlpZiAod2FpdF9mb3JfcHJvY193b3JrKSB7Ci0JCWlmICghKHRocmVhZC0+bG9vcGVyICYgKEJJTkRFUl9MT09QRVJfU1RBVEVfUkVHSVNURVJFRCB8Ci0JCQkJCUJJTkRFUl9MT09QRVJfU1RBVEVfRU5URVJFRCkpKSB7Ci0JCQliaW5kZXJfdXNlcl9lcnJvcigiYmluZGVyOiAlZDolZCBFUlJPUjogVGhyZWFkIHdhaXRpbmcgIgotCQkJCSJmb3IgcHJvY2VzcyB3b3JrIGJlZm9yZSBjYWxsaW5nIEJDX1JFR0lTVEVSXyIKLQkJCQkiTE9PUEVSIG9yIEJDX0VOVEVSX0xPT1BFUiAoc3RhdGUgJXgpXG4iLAotCQkJCXByb2MtPnBpZCwgdGhyZWFkLT5waWQsIHRocmVhZC0+bG9vcGVyKTsKLQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LAotCQkJCQkJIGJpbmRlcl9zdG9wX29uX3VzZXJfZXJyb3IgPCAyKTsKLQkJfQotCQliaW5kZXJfc2V0X25pY2UocHJvYy0+ZGVmYXVsdF9wcmlvcml0eSk7Ci0JCWlmIChub25fYmxvY2spIHsKLQkJCWlmICghYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSkKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQl9IGVsc2UKLQkJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUocHJvYy0+d2FpdCwgYmluZGVyX2hhc19wcm9jX3dvcmsocHJvYywgdGhyZWFkKSk7Ci0JfSBlbHNlIHsKLQkJaWYgKG5vbl9ibG9jaykgewotCQkJaWYgKCFiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCi0JCQkJcmV0ID0gLUVBR0FJTjsKLQkJfSBlbHNlCi0JCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhyZWFkLT53YWl0LCBiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpOwotCX0KLQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0JaWYgKHdhaXRfZm9yX3Byb2Nfd29yaykKLQkJcHJvYy0+cmVhZHlfdGhyZWFkcy0tOwotCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX1dBSVRJTkc7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jd2hpbGUgKDEpIHsKLQkJdWludDMyX3QgY21kOwotCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEgdHI7Ci0JCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQkJc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCA9IE5VTEw7Ci0KLQkJaWYgKCFsaXN0X2VtcHR5KCZ0aHJlYWQtPnRvZG8pKQotCQkJdyA9IGxpc3RfZmlyc3RfZW50cnkoJnRocmVhZC0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7Ci0JCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZwcm9jLT50b2RvKSAmJiB3YWl0X2Zvcl9wcm9jX3dvcmspCi0JCQl3ID0gbGlzdF9maXJzdF9lbnRyeSgmcHJvYy0+dG9kbywgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7Ci0JCWVsc2UgewotCQkJaWYgKHB0ciAtIGJ1ZmZlciA9PSA0ICYmICEodGhyZWFkLT5sb29wZXIgJiBCSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOKSkgLyogbm8gZGF0YSBhZGRlZCAqLwotCQkJCWdvdG8gcmV0cnk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlbmQgLSBwdHIgPCBzaXplb2YodHIpICsgNCkKLQkJCWJyZWFrOwotCi0JCXN3aXRjaCAody0+dHlwZSkgewotCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OOiB7Ci0JCQl0ID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24sIHdvcmspOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7Ci0JCQljbWQgPSBCUl9UUkFOU0FDVElPTl9DT01QTEVURTsKLQkJCWlmIChwdXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilwdHIpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcHRyICs9IHNpemVvZih1aW50MzJfdCk7Ci0KLQkJCWJpbmRlcl9zdGF0X2JyKHByb2MsIHRocmVhZCwgY21kKTsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVFJBTlNBQ1RJT05fQ09NUExFVEUsCi0JCQkJICAgICAiYmluZGVyOiAlZDolZCBCUl9UUkFOU0FDVElPTl9DT01QTEVURVxuIiwKLQkJCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCi0JCQlsaXN0X2RlbCgmdy0+ZW50cnkpOwotCQkJa2ZyZWUodyk7Ci0JCQliaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJfU1RBVF9UUkFOU0FDVElPTl9DT01QTEVURSk7Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1dPUktfTk9ERTogewotCQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBiaW5kZXJfbm9kZSwgd29yayk7Ci0JCQl1aW50MzJfdCBjbWQgPSBCUl9OT09QOwotCQkJY29uc3QgY2hhciAqY21kX25hbWU7Ci0JCQlpbnQgc3Ryb25nID0gbm9kZS0+aW50ZXJuYWxfc3Ryb25nX3JlZnMgfHwgbm9kZS0+bG9jYWxfc3Ryb25nX3JlZnM7Ci0JCQlpbnQgd2VhayA9ICFobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykgfHwgbm9kZS0+bG9jYWxfd2Vha19yZWZzIHx8IHN0cm9uZzsKLQkJCWlmICh3ZWFrICYmICFub2RlLT5oYXNfd2Vha19yZWYpIHsKLQkJCQljbWQgPSBCUl9JTkNSRUZTOwotCQkJCWNtZF9uYW1lID0gIkJSX0lOQ1JFRlMiOwotCQkJCW5vZGUtPmhhc193ZWFrX3JlZiA9IDE7Ci0JCQkJbm9kZS0+cGVuZGluZ193ZWFrX3JlZiA9IDE7Ci0JCQkJbm9kZS0+bG9jYWxfd2Vha19yZWZzKys7Ci0JCQl9IGVsc2UgaWYgKHN0cm9uZyAmJiAhbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKLQkJCQljbWQgPSBCUl9BQ1FVSVJFOwotCQkJCWNtZF9uYW1lID0gIkJSX0FDUVVJUkUiOwotCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMTsKLQkJCQlub2RlLT5wZW5kaW5nX3N0cm9uZ19yZWYgPSAxOwotCQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7Ci0JCQl9IGVsc2UgaWYgKCFzdHJvbmcgJiYgbm9kZS0+aGFzX3N0cm9uZ19yZWYpIHsKLQkJCQljbWQgPSBCUl9SRUxFQVNFOwotCQkJCWNtZF9uYW1lID0gIkJSX1JFTEVBU0UiOwotCQkJCW5vZGUtPmhhc19zdHJvbmdfcmVmID0gMDsKLQkJCX0gZWxzZSBpZiAoIXdlYWsgJiYgbm9kZS0+aGFzX3dlYWtfcmVmKSB7Ci0JCQkJY21kID0gQlJfREVDUkVGUzsKLQkJCQljbWRfbmFtZSA9ICJCUl9ERUNSRUZTIjsKLQkJCQlub2RlLT5oYXNfd2Vha19yZWYgPSAwOwotCQkJfQotCQkJaWYgKGNtZCAhPSBCUl9OT09QKSB7Ci0JCQkJaWYgKHB1dF91c2VyKGNtZCwgKHVpbnQzMl90IF9fdXNlciAqKXB0cikpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5wdHIsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCQkJCWlmIChwdXRfdXNlcihub2RlLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJcHRyICs9IHNpemVvZih2b2lkICopOwotCi0JCQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwotCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfVVNFUl9SRUZTLAotCQkJCQkgICAgICJiaW5kZXI6ICVkOiVkICVzICVkIHUlcCBjJXBcbiIsCi0JCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgY21kX25hbWUsIG5vZGUtPmRlYnVnX2lkLCBub2RlLT5wdHIsIG5vZGUtPmNvb2tpZSk7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKLQkJCQlpZiAoIXdlYWsgJiYgIXN0cm9uZykgewotCQkJCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0lOVEVSTkFMX1JFRlMsCi0JCQkJCQkgICAgICJiaW5kZXI6ICVkOiVkIG5vZGUgJWQgdSVwIGMlcCBkZWxldGVkXG4iLAotCQkJCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkLCBub2RlLT5kZWJ1Z19pZCwKLQkJCQkJCSAgICAgbm9kZS0+cHRyLCBub2RlLT5jb29raWUpOwotCQkJCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKLQkJCQkJa2ZyZWUobm9kZSk7Ci0JCQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX05PREUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfSU5URVJOQUxfUkVGUywKLQkJCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgbm9kZSAlZCB1JXAgYyVwIHN0YXRlIHVuY2hhbmdlZFxuIiwKLQkJCQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwKLQkJCQkJCSAgICAgbm9kZS0+Y29va2llKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gYnJlYWs7Ci0JCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6Ci0JCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5EX0NMRUFSOgotCQljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjogewotCQkJc3RydWN0IGJpbmRlcl9yZWZfZGVhdGggKmRlYXRoOwotCQkJdWludDMyX3QgY21kOwotCi0JCQlkZWF0aCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYmluZGVyX3JlZl9kZWF0aCwgd29yayk7Ci0JCQlpZiAody0+dHlwZSA9PSBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT04pCi0JCQkJY21kID0gQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkU7Ci0JCQllbHNlCi0JCQkJY21kID0gQlJfREVBRF9CSU5ERVI7Ci0JCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2YodWludDMyX3QpOwotCQkJaWYgKHB1dF91c2VyKGRlYXRoLT5jb29raWUsICh2b2lkICogX191c2VyICopcHRyKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXB0ciArPSBzaXplb2Yodm9pZCAqKTsKLQkJCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfREVBVEhfTk9USUZJQ0FUSU9OLAotCQkJCSAgICAgImJpbmRlcjogJWQ6JWQgJXMgJXBcbiIsCi0JCQkJICAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCQkgICAgICBjbWQgPT0gQlJfREVBRF9CSU5ERVIgPwotCQkJCSAgICAgICJCUl9ERUFEX0JJTkRFUiIgOgotCQkJCSAgICAgICJCUl9DTEVBUl9ERUFUSF9OT1RJRklDQVRJT05fRE9ORSIsCi0JCQkJICAgICAgZGVhdGgtPmNvb2tpZSk7Ci0KLQkJCWlmICh3LT50eXBlID09IEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTikgewotCQkJCWxpc3RfZGVsKCZ3LT5lbnRyeSk7Ci0JCQkJa2ZyZWUoZGVhdGgpOwotCQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX0RFQVRIKTsKLQkJCX0gZWxzZQotCQkJCWxpc3RfbW92ZSgmdy0+ZW50cnksICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgpOwotCQkJaWYgKGNtZCA9PSBCUl9ERUFEX0JJTkRFUikKLQkJCQlnb3RvIGRvbmU7IC8qIERFQURfQklOREVSIG5vdGlmaWNhdGlvbnMgY2FuIGNhdXNlIHRyYW5zYWN0aW9ucyAqLwotCQl9IGJyZWFrOwotCQl9Ci0KLQkJaWYgKCF0KQotCQkJY29udGludWU7Ci0KLQkJQlVHX09OKHQtPmJ1ZmZlciA9PSBOVUxMKTsKLQkJaWYgKHQtPmJ1ZmZlci0+dGFyZ2V0X25vZGUpIHsKLQkJCXN0cnVjdCBiaW5kZXJfbm9kZSAqdGFyZ2V0X25vZGUgPSB0LT5idWZmZXItPnRhcmdldF9ub2RlOwotCQkJdHIudGFyZ2V0LnB0ciA9IHRhcmdldF9ub2RlLT5wdHI7Ci0JCQl0ci5jb29raWUgPSAgdGFyZ2V0X25vZGUtPmNvb2tpZTsKLQkJCXQtPnNhdmVkX3ByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOwotCQkJaWYgKHQtPnByaW9yaXR5IDwgdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSAmJgotCQkJICAgICEodC0+ZmxhZ3MgJiBURl9PTkVfV0FZKSkKLQkJCQliaW5kZXJfc2V0X25pY2UodC0+cHJpb3JpdHkpOwotCQkJZWxzZSBpZiAoISh0LT5mbGFncyAmIFRGX09ORV9XQVkpIHx8Ci0JCQkJIHQtPnNhdmVkX3ByaW9yaXR5ID4gdGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSkKLQkJCQliaW5kZXJfc2V0X25pY2UodGFyZ2V0X25vZGUtPm1pbl9wcmlvcml0eSk7Ci0JCQljbWQgPSBCUl9UUkFOU0FDVElPTjsKLQkJfSBlbHNlIHsKLQkJCXRyLnRhcmdldC5wdHIgPSBOVUxMOwotCQkJdHIuY29va2llID0gTlVMTDsKLQkJCWNtZCA9IEJSX1JFUExZOwotCQl9Ci0JCXRyLmNvZGUgPSB0LT5jb2RlOwotCQl0ci5mbGFncyA9IHQtPmZsYWdzOwotCQl0ci5zZW5kZXJfZXVpZCA9IHQtPnNlbmRlcl9ldWlkOwotCi0JCWlmICh0LT5mcm9tKSB7Ci0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNlbmRlciA9IHQtPmZyb20tPnByb2MtPnRzazsKLQkJCXRyLnNlbmRlcl9waWQgPSB0YXNrX3RnaWRfbnJfbnMoc2VuZGVyLAotCQkJCQkJCWN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQl0ci5zZW5kZXJfcGlkID0gMDsKLQkJfQotCi0JCXRyLmRhdGFfc2l6ZSA9IHQtPmJ1ZmZlci0+ZGF0YV9zaXplOwotCQl0ci5vZmZzZXRzX3NpemUgPSB0LT5idWZmZXItPm9mZnNldHNfc2l6ZTsKLQkJdHIuZGF0YS5wdHIuYnVmZmVyID0gKHZvaWQgKil0LT5idWZmZXItPmRhdGEgKwotCQkJCQlwcm9jLT51c2VyX2J1ZmZlcl9vZmZzZXQ7Ci0JCXRyLmRhdGEucHRyLm9mZnNldHMgPSB0ci5kYXRhLnB0ci5idWZmZXIgKwotCQkJCQlBTElHTih0LT5idWZmZXItPmRhdGFfc2l6ZSwKLQkJCQkJICAgIHNpemVvZih2b2lkICopKTsKLQotCQlpZiAocHV0X3VzZXIoY21kLCAodWludDMyX3QgX191c2VyICopcHRyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdHIgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQkJaWYgKGNvcHlfdG9fdXNlcihwdHIsICZ0ciwgc2l6ZW9mKHRyKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcHRyICs9IHNpemVvZih0cik7Ci0KLQkJYmluZGVyX3N0YXRfYnIocHJvYywgdGhyZWFkLCBjbWQpOwotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1RSQU5TQUNUSU9OLAotCQkJICAgICAiYmluZGVyOiAlZDolZCAlcyAlZCAlZDolZCwgY21kICVkIgotCQkJICAgICAic2l6ZSAlemQtJXpkIHB0ciAlcC0lcFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCSAgICAgKGNtZCA9PSBCUl9UUkFOU0FDVElPTikgPyAiQlJfVFJBTlNBQ1RJT04iIDoKLQkJCSAgICAgIkJSX1JFUExZIiwKLQkJCSAgICAgdC0+ZGVidWdfaWQsIHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5waWQgOiAwLAotCQkJICAgICB0LT5mcm9tID8gdC0+ZnJvbS0+cGlkIDogMCwgY21kLAotCQkJICAgICB0LT5idWZmZXItPmRhdGFfc2l6ZSwgdC0+YnVmZmVyLT5vZmZzZXRzX3NpemUsCi0JCQkgICAgIHRyLmRhdGEucHRyLmJ1ZmZlciwgdHIuZGF0YS5wdHIub2Zmc2V0cyk7Ci0KLQkJbGlzdF9kZWwoJnQtPndvcmsuZW50cnkpOwotCQl0LT5idWZmZXItPmFsbG93X3VzZXJfZnJlZSA9IDE7Ci0JCWlmIChjbWQgPT0gQlJfVFJBTlNBQ1RJT04gJiYgISh0LT5mbGFncyAmIFRGX09ORV9XQVkpKSB7Ci0JCQl0LT50b19wYXJlbnQgPSB0aHJlYWQtPnRyYW5zYWN0aW9uX3N0YWNrOwotCQkJdC0+dG9fdGhyZWFkID0gdGhyZWFkOwotCQkJdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9IHQ7Ci0JCX0gZWxzZSB7Ci0JCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCWtmcmVlKHQpOwotCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfVFJBTlNBQ1RJT04pOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotZG9uZToKLQotCSpjb25zdW1lZCA9IHB0ciAtIGJ1ZmZlcjsKLQlpZiAocHJvYy0+cmVxdWVzdGVkX3RocmVhZHMgKyBwcm9jLT5yZWFkeV90aHJlYWRzID09IDAgJiYKLQkgICAgcHJvYy0+cmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZCA8IHByb2MtPm1heF90aHJlYWRzICYmCi0JICAgICh0aHJlYWQtPmxvb3BlciAmIChCSU5ERVJfTE9PUEVSX1NUQVRFX1JFR0lTVEVSRUQgfAotCSAgICAgQklOREVSX0xPT1BFUl9TVEFURV9FTlRFUkVEKSkgLyogdGhlIHVzZXItc3BhY2UgY29kZSBmYWlscyB0byAqLwotCSAgICAgLypzcGF3biBhIG5ldyB0aHJlYWQgaWYgd2UgbGVhdmUgdGhpcyBvdXQgKi8pIHsKLQkJcHJvYy0+cmVxdWVzdGVkX3RocmVhZHMrKzsKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19USFJFQURTLAotCQkJICAgICAiYmluZGVyOiAlZDolZCBCUl9TUEFXTl9MT09QRVJcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQpOwotCQlpZiAocHV0X3VzZXIoQlJfU1BBV05fTE9PUEVSLCAodWludDMyX3QgX191c2VyICopYnVmZmVyKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3JlbGVhc2Vfd29yayhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQotewotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKLQkJdyA9IGxpc3RfZmlyc3RfZW50cnkobGlzdCwgc3RydWN0IGJpbmRlcl93b3JrLCBlbnRyeSk7Ci0JCWxpc3RfZGVsX2luaXQoJnctPmVudHJ5KTsKLQkJc3dpdGNoICh3LT50eXBlKSB7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046IHsKLQkJCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7Ci0KLQkJCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7Ci0JCQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSAmJiAhKHQtPmZsYWdzICYgVEZfT05FX1dBWSkpCi0JCQkJYmluZGVyX3NlbmRfZmFpbGVkX3JlcGx5KHQsIEJSX0RFQURfUkVQTFkpOwotCQl9IGJyZWFrOwotCQljYXNlIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OX0NPTVBMRVRFOiB7Ci0JCQlrZnJlZSh3KTsKLQkJCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OX0NPTVBMRVRFKTsKLQkJfSBicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqYmluZGVyX2dldF90aHJlYWQoc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwcm9jLT50aHJlYWRzLnJiX25vZGU7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCXRocmVhZCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJpbmRlcl90aHJlYWQsIHJiX25vZGUpOwotCi0JCWlmIChjdXJyZW50LT5waWQgPCB0aHJlYWQtPnBpZCkKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoY3VycmVudC0+cGlkID4gdGhyZWFkLT5waWQpCi0JCQlwID0gJigqcCktPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0JaWYgKCpwID09IE5VTEwpIHsKLQkJdGhyZWFkID0ga3phbGxvYyhzaXplb2YoKnRocmVhZCksIEdGUF9LRVJORUwpOwotCQlpZiAodGhyZWFkID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYmluZGVyX3N0YXRzX2NyZWF0ZWQoQklOREVSX1NUQVRfVEhSRUFEKTsKLQkJdGhyZWFkLT5wcm9jID0gcHJvYzsKLQkJdGhyZWFkLT5waWQgPSBjdXJyZW50LT5waWQ7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRocmVhZC0+d2FpdCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZ0aHJlYWQtPnRvZG8pOwotCQlyYl9saW5rX25vZGUoJnRocmVhZC0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQkJcmJfaW5zZXJ0X2NvbG9yKCZ0aHJlYWQtPnJiX25vZGUsICZwcm9jLT50aHJlYWRzKTsKLQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IgPSBCUl9PSzsKLQkJdGhyZWFkLT5yZXR1cm5fZXJyb3IyID0gQlJfT0s7Ci0JfQotCXJldHVybiB0aHJlYWQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX2ZyZWVfdGhyZWFkKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywKLQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfdGhyZWFkICp0aHJlYWQpCi17Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICpzZW5kX3JlcGx5ID0gTlVMTDsKLQlpbnQgYWN0aXZlX3RyYW5zYWN0aW9ucyA9IDA7Ci0KLQlyYl9lcmFzZSgmdGhyZWFkLT5yYl9ub2RlLCAmcHJvYy0+dGhyZWFkcyk7Ci0JdCA9IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7Ci0JaWYgKHQgJiYgdC0+dG9fdGhyZWFkID09IHRocmVhZCkKLQkJc2VuZF9yZXBseSA9IHQ7Ci0Jd2hpbGUgKHQpIHsKLQkJYWN0aXZlX3RyYW5zYWN0aW9ucysrOwotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfVFJBTlNBQ1RJT04sCi0JCQkgICAgICJiaW5kZXI6IHJlbGVhc2UgJWQ6JWQgdHJhbnNhY3Rpb24gJWQgIgotCQkJICAgICAiJXMsIHN0aWxsIGFjdGl2ZVxuIiwgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwKLQkJCSAgICAgdC0+ZGVidWdfaWQsCi0JCQkgICAgICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSA/ICJpbiIgOiAib3V0Iik7Ci0KLQkJaWYgKHQtPnRvX3RocmVhZCA9PSB0aHJlYWQpIHsKLQkJCXQtPnRvX3Byb2MgPSBOVUxMOwotCQkJdC0+dG9fdGhyZWFkID0gTlVMTDsKLQkJCWlmICh0LT5idWZmZXIpIHsKLQkJCQl0LT5idWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCQl0LT5idWZmZXIgPSBOVUxMOwotCQkJfQotCQkJdCA9IHQtPnRvX3BhcmVudDsKLQkJfSBlbHNlIGlmICh0LT5mcm9tID09IHRocmVhZCkgewotCQkJdC0+ZnJvbSA9IE5VTEw7Ci0JCQl0ID0gdC0+ZnJvbV9wYXJlbnQ7Ci0JCX0gZWxzZQotCQkJQlVHKCk7Ci0JfQotCWlmIChzZW5kX3JlcGx5KQotCQliaW5kZXJfc2VuZF9mYWlsZWRfcmVwbHkoc2VuZF9yZXBseSwgQlJfREVBRF9SRVBMWSk7Ci0JYmluZGVyX3JlbGVhc2Vfd29yaygmdGhyZWFkLT50b2RvKTsKLQlrZnJlZSh0aHJlYWQpOwotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1RIUkVBRCk7Ci0JcmV0dXJuIGFjdGl2ZV90cmFuc2FjdGlvbnM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmluZGVyX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkID0gTlVMTDsKLQlpbnQgd2FpdF9mb3JfcHJvY193b3JrOwotCi0JbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCXRocmVhZCA9IGJpbmRlcl9nZXRfdGhyZWFkKHByb2MpOwotCi0Jd2FpdF9mb3JfcHJvY193b3JrID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjayA9PSBOVUxMICYmCi0JCWxpc3RfZW1wdHkoJnRocmVhZC0+dG9kbykgJiYgdGhyZWFkLT5yZXR1cm5fZXJyb3IgPT0gQlJfT0s7Ci0JbXV0ZXhfdW5sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlpZiAod2FpdF9mb3JfcHJvY193b3JrKSB7Ci0JCWlmIChiaW5kZXJfaGFzX3Byb2Nfd29yayhwcm9jLCB0aHJlYWQpKQotCQkJcmV0dXJuIFBPTExJTjsKLQkJcG9sbF93YWl0KGZpbHAsICZwcm9jLT53YWl0LCB3YWl0KTsKLQkJaWYgKGJpbmRlcl9oYXNfcHJvY193b3JrKHByb2MsIHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCX0gZWxzZSB7Ci0JCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCQlwb2xsX3dhaXQoZmlscCwgJnRocmVhZC0+d2FpdCwgd2FpdCk7Ci0JCWlmIChiaW5kZXJfaGFzX3RocmVhZF93b3JrKHRocmVhZCkpCi0JCQlyZXR1cm4gUE9MTElOOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgYmluZGVyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkOwotCXVuc2lnbmVkIGludCBzaXplID0gX0lPQ19TSVpFKGNtZCk7Ci0Jdm9pZCBfX3VzZXIgKnVidWYgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0KLQkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9pb2N0bDogJWQ6JWQgJXggJWx4XG4iLCBwcm9jLT5waWQsIGN1cnJlbnQtPnBpZCwgY21kLCBhcmcpOyovCi0KLQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYmluZGVyX3VzZXJfZXJyb3Jfd2FpdCwgYmluZGVyX3N0b3Bfb25fdXNlcl9lcnJvciA8IDIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0JdGhyZWFkID0gYmluZGVyX2dldF90aHJlYWQocHJvYyk7Ci0JaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBCSU5ERVJfV1JJVEVfUkVBRDogewotCQlzdHJ1Y3QgYmluZGVyX3dyaXRlX3JlYWQgYndyOwotCQlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYndyLCB1YnVmLCBzaXplb2YoYndyKSkpIHsKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX1JFQURfV1JJVEUsCi0JCQkgICAgICJiaW5kZXI6ICVkOiVkIHdyaXRlICVsZCBhdCAlMDhseCwgcmVhZCAlbGQgYXQgJTA4bHhcbiIsCi0JCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkLT5waWQsIGJ3ci53cml0ZV9zaXplLCBid3Iud3JpdGVfYnVmZmVyLAotCQkJICAgICBid3IucmVhZF9zaXplLCBid3IucmVhZF9idWZmZXIpOwotCi0JCWlmIChid3Iud3JpdGVfc2l6ZSA+IDApIHsKLQkJCXJldCA9IGJpbmRlcl90aHJlYWRfd3JpdGUocHJvYywgdGhyZWFkLCAodm9pZCBfX3VzZXIgKilid3Iud3JpdGVfYnVmZmVyLCBid3Iud3JpdGVfc2l6ZSwgJmJ3ci53cml0ZV9jb25zdW1lZCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWJ3ci5yZWFkX2NvbnN1bWVkID0gMDsKLQkJCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkKLQkJCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJfQotCQlpZiAoYndyLnJlYWRfc2l6ZSA+IDApIHsKLQkJCXJldCA9IGJpbmRlcl90aHJlYWRfcmVhZChwcm9jLCB0aHJlYWQsICh2b2lkIF9fdXNlciAqKWJ3ci5yZWFkX2J1ZmZlciwgYndyLnJlYWRfc2l6ZSwgJmJ3ci5yZWFkX2NvbnN1bWVkLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJnByb2MtPnRvZG8pKQotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJvYy0+d2FpdCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgJmJ3ciwgc2l6ZW9mKGJ3cikpKQotCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0JCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfUkVBRF9XUklURSwKLQkJCSAgICAgImJpbmRlcjogJWQ6JWQgd3JvdGUgJWxkIG9mICVsZCwgcmVhZCByZXR1cm4gJWxkIG9mICVsZFxuIiwKLQkJCSAgICAgcHJvYy0+cGlkLCB0aHJlYWQtPnBpZCwgYndyLndyaXRlX2NvbnN1bWVkLCBid3Iud3JpdGVfc2l6ZSwKLQkJCSAgICAgYndyLnJlYWRfY29uc3VtZWQsIGJ3ci5yZWFkX3NpemUpOwotCQlpZiAoY29weV90b191c2VyKHVidWYsICZid3IsIHNpemVvZihid3IpKSkgewotCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIEJJTkRFUl9TRVRfTUFYX1RIUkVBRFM6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmcHJvYy0+bWF4X3RocmVhZHMsIHVidWYsIHNpemVvZihwcm9jLT5tYXhfdGhyZWFkcykpKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBCSU5ERVJfU0VUX0NPTlRFWFRfTUdSOgotCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgIT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJiaW5kZXI6IEJJTkRFUl9TRVRfQ09OVEVYVF9NR1IgYWxyZWFkeSBzZXRcbiIpOwotCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKGJpbmRlcl9jb250ZXh0X21ncl91aWQgIT0gLTEpIHsKLQkJCWlmIChiaW5kZXJfY29udGV4dF9tZ3JfdWlkICE9IGN1cnJlbnQtPmNyZWQtPmV1aWQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgImJpbmRlcjogQklOREVSX1NFVF8iCi0JCQkJICAgICAgICJDT05URVhUX01HUiBiYWQgdWlkICVkICE9ICVkXG4iLAotCQkJCSAgICAgICBjdXJyZW50LT5jcmVkLT5ldWlkLAotCQkJCSAgICAgICBiaW5kZXJfY29udGV4dF9tZ3JfdWlkKTsKLQkJCQlyZXQgPSAtRVBFUk07Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJYmluZGVyX2NvbnRleHRfbWdyX3VpZCA9IGN1cnJlbnQtPmNyZWQtPmV1aWQ7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlID0gYmluZGVyX25ld19ub2RlKHByb2MsIE5VTEwsIE5VTEwpOwotCQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5sb2NhbF93ZWFrX3JlZnMrKzsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPmxvY2FsX3N0cm9uZ19yZWZzKys7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfc3Ryb25nX3JlZiA9IDE7Ci0JCWJpbmRlcl9jb250ZXh0X21ncl9ub2RlLT5oYXNfd2Vha19yZWYgPSAxOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9USFJFQURfRVhJVDoKLQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19USFJFQURTLCAiYmluZGVyOiAlZDolZCBleGl0XG4iLAotCQkJICAgICBwcm9jLT5waWQsIHRocmVhZC0+cGlkKTsKLQkJYmluZGVyX2ZyZWVfdGhyZWFkKHByb2MsIHRocmVhZCk7Ci0JCXRocmVhZCA9IE5VTEw7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1ZFUlNJT046Ci0JCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBlcnI7Ci0JCX0KLQkJaWYgKHB1dF91c2VyKEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04sICYoKHN0cnVjdCBiaW5kZXJfdmVyc2lvbiAqKXVidWYpLT5wcm90b2NvbF92ZXJzaW9uKSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXQgPSAwOwotZXJyOgotCWlmICh0aHJlYWQpCi0JCXRocmVhZC0+bG9vcGVyICY9IH5CSU5ERVJfTE9PUEVSX1NUQVRFX05FRURfUkVUVVJOOwotCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShiaW5kZXJfdXNlcl9lcnJvcl93YWl0LCBiaW5kZXJfc3RvcF9vbl91c2VyX2Vycm9yIDwgMik7Ci0JaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQotCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXI6ICVkOiVkIGlvY3RsICV4ICVseCByZXR1cm5lZCAlZFxuIiwgcHJvYy0+cGlkLCBjdXJyZW50LT5waWQsIGNtZCwgYXJnLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcjogJWQgb3BlbiB2bSBhcmVhICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwKLQkJICAgICBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAotCQkgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpOwotCWR1bXBfc3RhY2soKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX3ZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcjogJWQgY2xvc2Ugdm0gYXJlYSAlbHgtJWx4ICglbGQgSykgdm1hICVseCBwYWdlcCAlbHhcbiIsCi0JCSAgICAgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwKLQkJICAgICAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAvIFNaXzFLLCB2bWEtPnZtX2ZsYWdzLAotCQkgICAgICh1bnNpZ25lZCBsb25nKXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpKTsKLQlwcm9jLT52bWEgPSBOVUxMOwotCWJpbmRlcl9kZWZlcl93b3JrKHByb2MsIEJJTkRFUl9ERUZFUlJFRF9QVVRfRklMRVMpOwotfQotCi1zdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGJpbmRlcl92bV9vcHMgPSB7Ci0JLm9wZW4gPSBiaW5kZXJfdm1hX29wZW4sCi0JLmNsb3NlID0gYmluZGVyX3ZtYV9jbG9zZSwKLX07Ci0KLXN0YXRpYyBpbnQgYmluZGVyX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY29uc3QgY2hhciAqZmFpbHVyZV9zdHJpbmc7Ci0Jc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsKLQotCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+IFNaXzRNKQotCQl2bWEtPnZtX2VuZCA9IHZtYS0+dm1fc3RhcnQgKyBTWl80TTsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwKLQkJICAgICAiYmluZGVyX21tYXA6ICVkICVseC0lbHggKCVsZCBLKSB2bWEgJWx4IHBhZ2VwICVseFxuIiwKLQkJICAgICBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLAotCQkgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gU1pfMUssIHZtYS0+dm1fZmxhZ3MsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkpOwotCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBGT1JCSURERU5fTU1BUF9GTEFHUykgewotCQlyZXQgPSAtRVBFUk07Ci0JCWZhaWx1cmVfc3RyaW5nID0gImJhZCB2bV9mbGFncyI7Ci0JCWdvdG8gZXJyX2JhZF9hcmc7Ci0JfQotCXZtYS0+dm1fZmxhZ3MgPSAodm1hLT52bV9mbGFncyB8IFZNX0RPTlRDT1BZKSAmIH5WTV9NQVlXUklURTsKLQotCWlmIChwcm9jLT5idWZmZXIpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlmYWlsdXJlX3N0cmluZyA9ICJhbHJlYWR5IG1hcHBlZCI7Ci0JCWdvdG8gZXJyX2FscmVhZHlfbWFwcGVkOwotCX0KLQotCWFyZWEgPSBnZXRfdm1fYXJlYSh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIFZNX0lPUkVNQVApOwotCWlmIChhcmVhID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiZ2V0X3ZtX2FyZWEiOwotCQlnb3RvIGVycl9nZXRfdm1fYXJlYV9mYWlsZWQ7Ci0JfQotCXByb2MtPmJ1ZmZlciA9IGFyZWEtPmFkZHI7Ci0JcHJvYy0+dXNlcl9idWZmZXJfb2Zmc2V0ID0gdm1hLT52bV9zdGFydCAtICh1aW50cHRyX3QpcHJvYy0+YnVmZmVyOwotCi0jaWZkZWYgQ09ORklHX0NQVV9DQUNIRV9WSVBUCi0JaWYgKGNhY2hlX2lzX3ZpcHRfYWxpYXNpbmcoKSkgewotCQl3aGlsZSAoQ0FDSEVfQ09MT1VSKCh2bWEtPnZtX3N0YXJ0IF4gKHVpbnQzMl90KXByb2MtPmJ1ZmZlcikpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJiaW5kZXJfbW1hcDogJWQgJWx4LSVseCBtYXBzICVwIGJhZCBhbGlnbm1lbnRcbiIsIHByb2MtPnBpZCwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHByb2MtPmJ1ZmZlcik7Ci0JCQl2bWEtPnZtX3N0YXJ0ICs9IFBBR0VfU0laRTsKLQkJfQotCX0KLSNlbmRpZgotCXByb2MtPnBhZ2VzID0ga3phbGxvYyhzaXplb2YocHJvYy0+cGFnZXNbMF0pICogKCh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpIC8gUEFHRV9TSVpFKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHByb2MtPnBhZ2VzID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiYWxsb2MgcGFnZSBhcnJheSI7Ci0JCWdvdG8gZXJyX2FsbG9jX3BhZ2VzX2ZhaWxlZDsKLQl9Ci0JcHJvYy0+YnVmZmVyX3NpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0KLQl2bWEtPnZtX29wcyA9ICZiaW5kZXJfdm1fb3BzOwotCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gcHJvYzsKLQotCWlmIChiaW5kZXJfdXBkYXRlX3BhZ2VfcmFuZ2UocHJvYywgMSwgcHJvYy0+YnVmZmVyLCBwcm9jLT5idWZmZXIgKyBQQUdFX1NJWkUsIHZtYSkpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZmFpbHVyZV9zdHJpbmcgPSAiYWxsb2Mgc21hbGwgYnVmIjsKLQkJZ290byBlcnJfYWxsb2Nfc21hbGxfYnVmX2ZhaWxlZDsKLQl9Ci0JYnVmZmVyID0gcHJvYy0+YnVmZmVyOwotCUlOSVRfTElTVF9IRUFEKCZwcm9jLT5idWZmZXJzKTsKLQlsaXN0X2FkZCgmYnVmZmVyLT5lbnRyeSwgJnByb2MtPmJ1ZmZlcnMpOwotCWJ1ZmZlci0+ZnJlZSA9IDE7Ci0JYmluZGVyX2luc2VydF9mcmVlX2J1ZmZlcihwcm9jLCBidWZmZXIpOwotCXByb2MtPmZyZWVfYXN5bmNfc3BhY2UgPSBwcm9jLT5idWZmZXJfc2l6ZSAvIDI7Ci0JYmFycmllcigpOwotCXByb2MtPmZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdChjdXJyZW50KTsKLQlwcm9jLT52bWEgPSB2bWE7Ci0KLQkvKnByaW50ayhLRVJOX0lORk8gImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4IG1hcHMgJXBcbiIsCi0JCSBwcm9jLT5waWQsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZW5kLCBwcm9jLT5idWZmZXIpOyovCi0JcmV0dXJuIDA7Ci0KLWVycl9hbGxvY19zbWFsbF9idWZfZmFpbGVkOgotCWtmcmVlKHByb2MtPnBhZ2VzKTsKLQlwcm9jLT5wYWdlcyA9IE5VTEw7Ci1lcnJfYWxsb2NfcGFnZXNfZmFpbGVkOgotCXZmcmVlKHByb2MtPmJ1ZmZlcik7Ci0JcHJvYy0+YnVmZmVyID0gTlVMTDsKLWVycl9nZXRfdm1fYXJlYV9mYWlsZWQ6Ci1lcnJfYWxyZWFkeV9tYXBwZWQ6Ci1lcnJfYmFkX2FyZzoKLQlwcmludGsoS0VSTl9FUlIgImJpbmRlcl9tbWFwOiAlZCAlbHgtJWx4ICVzIGZhaWxlZCAlZFxuIiwKLQkgICAgICAgcHJvYy0+cGlkLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCwgZmFpbHVyZV9zdHJpbmcsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKm5vZHAsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQotCWJpbmRlcl9kZWJ1ZyhCSU5ERVJfREVCVUdfT1BFTl9DTE9TRSwgImJpbmRlcl9vcGVuOiAlZDolZFxuIiwKLQkJICAgICBjdXJyZW50LT5ncm91cF9sZWFkZXItPnBpZCwgY3VycmVudC0+cGlkKTsKLQotCXByb2MgPSBremFsbG9jKHNpemVvZigqcHJvYyksIEdGUF9LRVJORUwpOwotCWlmIChwcm9jID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWdldF90YXNrX3N0cnVjdChjdXJyZW50KTsKLQlwcm9jLT50c2sgPSBjdXJyZW50OwotCUlOSVRfTElTVF9IRUFEKCZwcm9jLT50b2RvKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcm9jLT53YWl0KTsKLQlwcm9jLT5kZWZhdWx0X3ByaW9yaXR5ID0gdGFza19uaWNlKGN1cnJlbnQpOwotCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQliaW5kZXJfc3RhdHNfY3JlYXRlZChCSU5ERVJfU1RBVF9QUk9DKTsKLQlobGlzdF9hZGRfaGVhZCgmcHJvYy0+cHJvY19ub2RlLCAmYmluZGVyX3Byb2NzKTsKLQlwcm9jLT5waWQgPSBjdXJyZW50LT5ncm91cF9sZWFkZXItPnBpZDsKLQlJTklUX0xJU1RfSEVBRCgmcHJvYy0+ZGVsaXZlcmVkX2RlYXRoKTsKLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBwcm9jOwotCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCi0JaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKSB7Ci0JCWNoYXIgc3RyYnVmWzExXTsKLQkJc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwgIiV1IiwgcHJvYy0+cGlkKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoc3RyYnVmLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyk7Ci0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoc3RyYnVmLCBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYywKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY19wcm9jLCBwcm9jKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JYmluZGVyX2RlZmVyX3dvcmsocHJvYywgQklOREVSX0RFRkVSUkVEX0ZMVVNIKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiaW5kZXJfZGVmZXJyZWRfZmx1c2goc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCByYl9ub2RlICpuOwotCWludCB3YWtlX2NvdW50ID0gMDsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpIHsKLQkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKLQkJdGhyZWFkLT5sb29wZXIgfD0gQklOREVSX0xPT1BFUl9TVEFURV9ORUVEX1JFVFVSTjsKLQkJaWYgKHRocmVhZC0+bG9vcGVyICYgQklOREVSX0xPT1BFUl9TVEFURV9XQUlUSU5HKSB7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnRocmVhZC0+d2FpdCk7Ci0JCQl3YWtlX2NvdW50Kys7Ci0JCX0KLQl9Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmcHJvYy0+d2FpdCk7Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcl9mbHVzaDogJWQgd29rZSAlZCB0aHJlYWRzXG4iLCBwcm9jLT5waWQsCi0JCSAgICAgd2FrZV9jb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICpub2RwLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9wcm9jKSB7Ci0JCWNoYXIgc3RyYnVmWzExXTsKLQkJc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwgIiV1IiwgcHJvYy0+cGlkKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoc3RyYnVmLCBiaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyk7Ci0JfQotCi0JYmluZGVyX2RlZmVyX3dvcmsocHJvYywgQklOREVSX0RFRkVSUkVEX1JFTEVBU0UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJpbmRlcl9kZWZlcnJlZF9yZWxlYXNlKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYykKLXsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JaW50IHRocmVhZHMsIG5vZGVzLCBpbmNvbWluZ19yZWZzLCBvdXRnb2luZ19yZWZzLCBidWZmZXJzLCBhY3RpdmVfdHJhbnNhY3Rpb25zLCBwYWdlX2NvdW50OwotCi0JQlVHX09OKHByb2MtPnZtYSk7Ci0JQlVHX09OKHByb2MtPmZpbGVzKTsKLQotCWhsaXN0X2RlbCgmcHJvYy0+cHJvY19ub2RlKTsKLQlpZiAoYmluZGVyX2NvbnRleHRfbWdyX25vZGUgJiYgYmluZGVyX2NvbnRleHRfbWdyX25vZGUtPnByb2MgPT0gcHJvYykgewotCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJICAgICAiYmluZGVyX3JlbGVhc2U6ICVkIGNvbnRleHRfbWdyX25vZGUgZ29uZVxuIiwKLQkJCSAgICAgcHJvYy0+cGlkKTsKLQkJYmluZGVyX2NvbnRleHRfbWdyX25vZGUgPSBOVUxMOwotCX0KLQotCXRocmVhZHMgPSAwOwotCWFjdGl2ZV90cmFuc2FjdGlvbnMgPSAwOwotCXdoaWxlICgobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl90aHJlYWQgKnRocmVhZCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfdGhyZWFkLCByYl9ub2RlKTsKLQkJdGhyZWFkcysrOwotCQlhY3RpdmVfdHJhbnNhY3Rpb25zICs9IGJpbmRlcl9mcmVlX3RocmVhZChwcm9jLCB0aHJlYWQpOwotCX0KLQlub2RlcyA9IDA7Ci0JaW5jb21pbmdfcmVmcyA9IDA7Ci0Jd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPm5vZGVzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9ub2RlICpub2RlID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9ub2RlLCByYl9ub2RlKTsKLQotCQlub2RlcysrOwotCQlyYl9lcmFzZSgmbm9kZS0+cmJfbm9kZSwgJnByb2MtPm5vZGVzKTsKLQkJbGlzdF9kZWxfaW5pdCgmbm9kZS0+d29yay5lbnRyeSk7Ci0JCWlmIChobGlzdF9lbXB0eSgmbm9kZS0+cmVmcykpIHsKLQkJCWtmcmVlKG5vZGUpOwotCQkJYmluZGVyX3N0YXRzX2RlbGV0ZWQoQklOREVSX1NUQVRfTk9ERSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmOwotCQkJaW50IGRlYXRoID0gMDsKLQotCQkJbm9kZS0+cHJvYyA9IE5VTEw7Ci0JCQlub2RlLT5sb2NhbF9zdHJvbmdfcmVmcyA9IDA7Ci0JCQlub2RlLT5sb2NhbF93ZWFrX3JlZnMgPSAwOwotCQkJaGxpc3RfYWRkX2hlYWQoJm5vZGUtPmRlYWRfbm9kZSwgJmJpbmRlcl9kZWFkX25vZGVzKTsKLQotCQkJaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KSB7Ci0JCQkJaW5jb21pbmdfcmVmcysrOwotCQkJCWlmIChyZWYtPmRlYXRoKSB7Ci0JCQkJCWRlYXRoKys7Ci0JCQkJCWlmIChsaXN0X2VtcHR5KCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5KSkgewotCQkJCQkJcmVmLT5kZWF0aC0+d29yay50eXBlID0gQklOREVSX1dPUktfREVBRF9CSU5ERVI7Ci0JCQkJCQlsaXN0X2FkZF90YWlsKCZyZWYtPmRlYXRoLT53b3JrLmVudHJ5LCAmcmVmLT5wcm9jLT50b2RvKTsKLQkJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVmLT5wcm9jLT53YWl0KTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlCVUcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX0RFQURfQklOREVSLAotCQkJCSAgICAgImJpbmRlcjogbm9kZSAlZCBub3cgZGVhZCwgIgotCQkJCSAgICAgInJlZnMgJWQsIGRlYXRoICVkXG4iLCBub2RlLT5kZWJ1Z19pZCwKLQkJCQkgICAgIGluY29taW5nX3JlZnMsIGRlYXRoKTsKLQkJfQotCX0KLQlvdXRnb2luZ19yZWZzID0gMDsKLQl3aGlsZSAoKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9yZWYgKnJlZiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfcmVmLAotCQkJCQkJICByYl9ub2RlX2Rlc2MpOwotCQlvdXRnb2luZ19yZWZzKys7Ci0JCWJpbmRlcl9kZWxldGVfcmVmKHJlZik7Ci0JfQotCWJpbmRlcl9yZWxlYXNlX3dvcmsoJnByb2MtPnRvZG8pOwotCWJ1ZmZlcnMgPSAwOwotCi0Jd2hpbGUgKChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKSkpIHsKLQkJc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfYnVmZmVyLAotCQkJCQkJCXJiX25vZGUpOwotCQl0ID0gYnVmZmVyLT50cmFuc2FjdGlvbjsKLQkJaWYgKHQpIHsKLQkJCXQtPmJ1ZmZlciA9IE5VTEw7Ci0JCQlidWZmZXItPnRyYW5zYWN0aW9uID0gTlVMTDsKLQkJCXByaW50ayhLRVJOX0VSUiAiYmluZGVyOiByZWxlYXNlIHByb2MgJWQsICIKLQkJCSAgICAgICAidHJhbnNhY3Rpb24gJWQsIG5vdCBmcmVlZFxuIiwKLQkJCSAgICAgICBwcm9jLT5waWQsIHQtPmRlYnVnX2lkKTsKLQkJCS8qQlVHKCk7Ki8KLQkJfQotCQliaW5kZXJfZnJlZV9idWYocHJvYywgYnVmZmVyKTsKLQkJYnVmZmVycysrOwotCX0KLQotCWJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRFUl9TVEFUX1BST0MpOwotCi0JcGFnZV9jb3VudCA9IDA7Ci0JaWYgKHByb2MtPnBhZ2VzKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgcHJvYy0+YnVmZmVyX3NpemUgLyBQQUdFX1NJWkU7IGkrKykgewotCQkJaWYgKHByb2MtPnBhZ2VzW2ldKSB7Ci0JCQkJYmluZGVyX2RlYnVnKEJJTkRFUl9ERUJVR19CVUZGRVJfQUxMT0MsCi0JCQkJCSAgICAgImJpbmRlcl9yZWxlYXNlOiAlZDogIgotCQkJCQkgICAgICJwYWdlICVkIGF0ICVwIG5vdCBmcmVlZFxuIiwKLQkJCQkJICAgICBwcm9jLT5waWQsIGksCi0JCQkJCSAgICAgcHJvYy0+YnVmZmVyICsgaSAqIFBBR0VfU0laRSk7Ci0JCQkJX19mcmVlX3BhZ2UocHJvYy0+cGFnZXNbaV0pOwotCQkJCXBhZ2VfY291bnQrKzsKLQkJCX0KLQkJfQotCQlrZnJlZShwcm9jLT5wYWdlcyk7Ci0JCXZmcmVlKHByb2MtPmJ1ZmZlcik7Ci0JfQotCi0JcHV0X3Rhc2tfc3RydWN0KHByb2MtPnRzayk7Ci0KLQliaW5kZXJfZGVidWcoQklOREVSX0RFQlVHX09QRU5fQ0xPU0UsCi0JCSAgICAgImJpbmRlcl9yZWxlYXNlOiAlZCB0aHJlYWRzICVkLCBub2RlcyAlZCAocmVmICVkKSwgIgotCQkgICAgICJyZWZzICVkLCBhY3RpdmUgdHJhbnNhY3Rpb25zICVkLCBidWZmZXJzICVkLCAiCi0JCSAgICAgInBhZ2VzICVkXG4iLAotCQkgICAgIHByb2MtPnBpZCwgdGhyZWFkcywgbm9kZXMsIGluY29taW5nX3JlZnMsIG91dGdvaW5nX3JlZnMsCi0JCSAgICAgYWN0aXZlX3RyYW5zYWN0aW9ucywgYnVmZmVycywgcGFnZV9jb3VudCk7Ci0KLQlrZnJlZShwcm9jKTsKLX0KLQotc3RhdGljIHZvaWQgYmluZGVyX2RlZmVycmVkX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKLQotCWludCBkZWZlcjsKLQlkbyB7Ci0JCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQkJbXV0ZXhfbG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotCQlpZiAoIWhsaXN0X2VtcHR5KCZiaW5kZXJfZGVmZXJyZWRfbGlzdCkpIHsKLQkJCXByb2MgPSBobGlzdF9lbnRyeShiaW5kZXJfZGVmZXJyZWRfbGlzdC5maXJzdCwKLQkJCQkJc3RydWN0IGJpbmRlcl9wcm9jLCBkZWZlcnJlZF93b3JrX25vZGUpOwotCQkJaGxpc3RfZGVsX2luaXQoJnByb2MtPmRlZmVycmVkX3dvcmtfbm9kZSk7Ci0JCQlkZWZlciA9IHByb2MtPmRlZmVycmVkX3dvcms7Ci0JCQlwcm9jLT5kZWZlcnJlZF93b3JrID0gMDsKLQkJfSBlbHNlIHsKLQkJCXByb2MgPSBOVUxMOwotCQkJZGVmZXIgPSAwOwotCQl9Ci0JCW11dGV4X3VubG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotCi0JCWZpbGVzID0gTlVMTDsKLQkJaWYgKGRlZmVyICYgQklOREVSX0RFRkVSUkVEX1BVVF9GSUxFUykgewotCQkJZmlsZXMgPSBwcm9jLT5maWxlczsKLQkJCWlmIChmaWxlcykKLQkJCQlwcm9jLT5maWxlcyA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoZGVmZXIgJiBCSU5ERVJfREVGRVJSRURfRkxVU0gpCi0JCQliaW5kZXJfZGVmZXJyZWRfZmx1c2gocHJvYyk7Ci0KLQkJaWYgKGRlZmVyICYgQklOREVSX0RFRkVSUkVEX1JFTEVBU0UpCi0JCQliaW5kZXJfZGVmZXJyZWRfcmVsZWFzZShwcm9jKTsgLyogZnJlZXMgcHJvYyAqLwotCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCQlpZiAoZmlsZXMpCi0JCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKLQl9IHdoaWxlIChwcm9jKTsKLX0KLXN0YXRpYyBERUNMQVJFX1dPUksoYmluZGVyX2RlZmVycmVkX3dvcmssIGJpbmRlcl9kZWZlcnJlZF9mdW5jKTsKLQotc3RhdGljIHZvaWQKLWJpbmRlcl9kZWZlcl93b3JrKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgZW51bSBiaW5kZXJfZGVmZXJyZWRfc3RhdGUgZGVmZXIpCi17Ci0JbXV0ZXhfbG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwotCXByb2MtPmRlZmVycmVkX3dvcmsgfD0gZGVmZXI7Ci0JaWYgKGhsaXN0X3VuaGFzaGVkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUpKSB7Ci0JCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUsCi0JCQkJJmJpbmRlcl9kZWZlcnJlZF9saXN0KTsKLQkJc2NoZWR1bGVfd29yaygmYmluZGVyX2RlZmVycmVkX3dvcmspOwotCX0KLQltdXRleF91bmxvY2soJmJpbmRlcl9kZWZlcnJlZF9sb2NrKTsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl90cmFuc2FjdGlvbihjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAotCQkJCSAgICAgIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQpCi17Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJIiVzICVkOiAlcCBmcm9tICVkOiVkIHRvICVkOiVkIGNvZGUgJXggIgotCQkJImZsYWdzICV4IHByaSAlbGQgciVkIiwKLQkJCXByZWZpeCwgdC0+ZGVidWdfaWQsIHQsCi0JCQl0LT5mcm9tID8gdC0+ZnJvbS0+cHJvYy0+cGlkIDogMCwKLQkJCXQtPmZyb20gPyB0LT5mcm9tLT5waWQgOiAwLAotCQkJdC0+dG9fcHJvYyA/IHQtPnRvX3Byb2MtPnBpZCA6IDAsCi0JCQl0LT50b190aHJlYWQgPyB0LT50b190aHJlYWQtPnBpZCA6IDAsCi0JCQl0LT5jb2RlLCB0LT5mbGFncywgdC0+cHJpb3JpdHksIHQtPm5lZWRfcmVwbHkpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCWlmICh0LT5idWZmZXIgPT0gTlVMTCkgewotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgYnVmZmVyIGZyZWVcbiIpOwotCQlyZXR1cm4gYnVmOwotCX0KLQlpZiAodC0+YnVmZmVyLT50YXJnZXRfbm9kZSkgewotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgbm9kZSAlZCIsCi0JCQkJdC0+YnVmZmVyLT50YXJnZXRfbm9kZS0+ZGVidWdfaWQpOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JfQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiBzaXplICV6ZDolemQgZGF0YSAlcFxuIiwKLQkJCXQtPmJ1ZmZlci0+ZGF0YV9zaXplLCB0LT5idWZmZXItPm9mZnNldHNfc2l6ZSwKLQkJCXQtPmJ1ZmZlci0+ZGF0YSk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9idWZmZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByZWZpeCwKLQkJCQkgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcikKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyAlZDogJXAgc2l6ZSAlemQ6JXpkICVzXG4iLAotCQkJcHJlZml4LCBidWZmZXItPmRlYnVnX2lkLCBidWZmZXItPmRhdGEsCi0JCQlidWZmZXItPmRhdGFfc2l6ZSwgYnVmZmVyLT5vZmZzZXRzX3NpemUsCi0JCQlidWZmZXItPnRyYW5zYWN0aW9uID8gImFjdGl2ZSIgOiAiZGVsaXZlcmVkIik7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl93b3JrKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBjaGFyICpwcmVmaXgsCi0JCQkgICAgICAgY29uc3QgY2hhciAqdHJhbnNhY3Rpb25fcHJlZml4LAotCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfd29yayAqdykKLXsKLQlzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdDsKLQotCXN3aXRjaCAody0+dHlwZSkgewotCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046Ci0JCXQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiwgd29yayk7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwgdHJhbnNhY3Rpb25fcHJlZml4LCB0KTsKLQkJYnJlYWs7Ci0JY2FzZSBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURToKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIlc3RyYW5zYWN0aW9uIGNvbXBsZXRlXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX05PREU6Ci0JCW5vZGUgPSBjb250YWluZXJfb2Yodywgc3RydWN0IGJpbmRlcl9ub2RlLCB3b3JrKTsKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXNub2RlIHdvcmsgJWQ6IHUlcCBjJXBcbiIsCi0JCQkJcHJlZml4LCBub2RlLT5kZWJ1Z19pZCwgbm9kZS0+cHRyLAotCQkJCW5vZGUtPmNvb2tpZSk7Ci0JCWJyZWFrOwotCWNhc2UgQklOREVSX1dPUktfREVBRF9CSU5ERVI6Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzaGFzIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX0RFQURfQklOREVSX0FORF9DTEVBUjoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIlc2hhcyBjbGVhcmVkIGRlYWQgYmluZGVyXG4iLCBwcmVmaXgpOwotCQlicmVhazsKLQljYXNlIEJJTkRFUl9XT1JLX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTjoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCSIlc2hhcyBjbGVhcmVkIGRlYXRoIG5vdGlmaWNhdGlvblxuIiwgcHJlZml4KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiJXN1bmtub3duIHdvcms6IHR5cGUgJWRcbiIsCi0JCQkJcHJlZml4LCB3LT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBidWY7Ci19Ci0KLXN0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdGhyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJCSBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdGhyZWFkLAotCQkJCSBpbnQgcHJpbnRfYWx3YXlzKQotewotCXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQ7Ci0Jc3RydWN0IGJpbmRlcl93b3JrICp3OwotCWNoYXIgKnN0YXJ0X2J1ZiA9IGJ1ZjsKLQljaGFyICpoZWFkZXJfYnVmOwotCi0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICB0aHJlYWQgJWQ6IGwgJTAyeFxuIiwKLQkJCXRocmVhZC0+cGlkLCB0aHJlYWQtPmxvb3Blcik7Ci0JaGVhZGVyX2J1ZiA9IGJ1ZjsKLQl0ID0gdGhyZWFkLT50cmFuc2FjdGlvbl9zdGFjazsKLQl3aGlsZSAodCkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlpZiAodC0+ZnJvbSA9PSB0aHJlYWQpIHsKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbihidWYsIGVuZCwKLQkJCQkJCSIgICAgb3V0Z29pbmcgdHJhbnNhY3Rpb24iLCB0KTsKLQkJCXQgPSB0LT5mcm9tX3BhcmVudDsKLQkJfSBlbHNlIGlmICh0LT50b190aHJlYWQgPT0gdGhyZWFkKSB7Ci0JCQlidWYgPSBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb24oYnVmLCBlbmQsCi0JCQkJCQkiICAgIGluY29taW5nIHRyYW5zYWN0aW9uIiwgdCk7Ci0JCQl0ID0gdC0+dG9fcGFyZW50OwotCQl9IGVsc2UgewotCQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uKGJ1ZiwgZW5kLAotCQkJCQkJIiAgICBiYWQgdHJhbnNhY3Rpb24iLCB0KTsKLQkJCXQgPSBOVUxMOwotCQl9Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnRocmVhZC0+dG9kbywgZW50cnkpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3dvcmsoYnVmLCBlbmQsICIgICAgIiwKLQkJCQkJIiAgICBwZW5kaW5nIHRyYW5zYWN0aW9uIiwgdyk7Ci0JfQotCWlmICghcHJpbnRfYWx3YXlzICYmIGJ1ZiA9PSBoZWFkZXJfYnVmKQotCQlidWYgPSBzdGFydF9idWY7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9ub2RlKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmluZGVyX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IGJpbmRlcl9yZWYgKnJlZjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQlpbnQgY291bnQ7Ci0KLQljb3VudCA9IDA7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmVmLCBwb3MsICZub2RlLT5yZWZzLCBub2RlX2VudHJ5KQotCQljb3VudCsrOwotCi0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJIiAgbm9kZSAlZDogdSVwIGMlcCBocyAlZCBodyAlZCBscyAlZCBsdyAlZCAiCi0JCQkiaXMgJWQgaXcgJWQiLAotCQkJbm9kZS0+ZGVidWdfaWQsIG5vZGUtPnB0ciwgbm9kZS0+Y29va2llLAotCQkJbm9kZS0+aGFzX3N0cm9uZ19yZWYsIG5vZGUtPmhhc193ZWFrX3JlZiwKLQkJCW5vZGUtPmxvY2FsX3N0cm9uZ19yZWZzLCBub2RlLT5sb2NhbF93ZWFrX3JlZnMsCi0JCQlub2RlLT5pbnRlcm5hbF9zdHJvbmdfcmVmcywgY291bnQpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCWlmIChjb3VudCkgewotCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgcHJvYyIpOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlZiwgcG9zLCAmbm9kZS0+cmVmcywgbm9kZV9lbnRyeSkgewotCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICVkIiwgcmVmLT5wcm9jLT5waWQpOwotCQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCX0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJcbiIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJm5vZGUtPmFzeW5jX3RvZG8sIGVudHJ5KSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl93b3JrKGJ1ZiwgZW5kLCAiICAgICIsCi0JCQkJCSIgICAgcGVuZGluZyBhc3luYyB0cmFuc2FjdGlvbiIsIHcpOwotCX0KLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY2hhciAqcHJpbnRfYmluZGVyX3JlZihjaGFyICpidWYsIGNoYXIgKmVuZCwgc3RydWN0IGJpbmRlcl9yZWYgKnJlZikKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkiICByZWYgJWQ6IGRlc2MgJWQgJXNub2RlICVkIHMgJWQgdyAlZCBkICVwXG4iLAotCQkJcmVmLT5kZWJ1Z19pZCwgcmVmLT5kZXNjLAotCQkJcmVmLT5ub2RlLT5wcm9jID8gIiIgOiAiZGVhZCAiLCByZWYtPm5vZGUtPmRlYnVnX2lkLAotCQkJcmVmLT5zdHJvbmcsIHJlZi0+d2VhaywgcmVmLT5kZWF0aCk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJICAgICAgIHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywgaW50IHByaW50X2FsbCkKLXsKLQlzdHJ1Y3QgYmluZGVyX3dvcmsgKnc7Ci0Jc3RydWN0IHJiX25vZGUgKm47Ci0JY2hhciAqc3RhcnRfYnVmID0gYnVmOwotCWNoYXIgKmhlYWRlcl9idWY7Ci0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJwcm9jICVkXG4iLCBwcm9jLT5waWQpOwotCWhlYWRlcl9idWYgPSBidWY7Ci0KLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+dGhyZWFkcyk7Ci0JICAgICBuICE9IE5VTEwgJiYgYnVmIDwgZW5kOwotCSAgICAgbiA9IHJiX25leHQobikpCi0JCWJ1ZiA9IHByaW50X2JpbmRlcl90aHJlYWQoYnVmLCBlbmQsCi0JCQkJCSAgcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl90aHJlYWQsCi0JCQkJCQkgICByYl9ub2RlKSwgcHJpbnRfYWxsKTsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+bm9kZXMpOwotCSAgICAgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsKLQkgICAgIG4gPSByYl9uZXh0KG4pKSB7Ci0JCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBiaW5kZXJfbm9kZSwKLQkJCQkJCSAgICByYl9ub2RlKTsKLQkJaWYgKHByaW50X2FsbCB8fCBub2RlLT5oYXNfYXN5bmNfdHJhbnNhY3Rpb24pCi0JCQlidWYgPSBwcmludF9iaW5kZXJfbm9kZShidWYsIGVuZCwgbm9kZSk7Ci0JfQotCWlmIChwcmludF9hbGwpIHsKLQkJZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPnJlZnNfYnlfZGVzYyk7Ci0JCSAgICAgbiAhPSBOVUxMICYmIGJ1ZiA8IGVuZDsKLQkJICAgICBuID0gcmJfbmV4dChuKSkKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl9yZWYoYnVmLCBlbmQsCi0JCQkJCSAgICAgICByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX3JlZiwKLQkJCQkJCQlyYl9ub2RlX2Rlc2MpKTsKLQl9Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsKLQkgICAgIG4gIT0gTlVMTCAmJiBidWYgPCBlbmQ7Ci0JICAgICBuID0gcmJfbmV4dChuKSkKLQkJYnVmID0gcHJpbnRfYmluZGVyX2J1ZmZlcihidWYsIGVuZCwgIiAgYnVmZmVyIiwKLQkJCQkJICByYl9lbnRyeShuLCBzdHJ1Y3QgYmluZGVyX2J1ZmZlciwKLQkJCQkJCSAgIHJiX25vZGUpKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT50b2RvLCBlbnRyeSkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfd29yayhidWYsIGVuZCwgIiAgIiwKLQkJCQkJIiAgcGVuZGluZyB0cmFuc2FjdGlvbiIsIHcpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcsICZwcm9jLT5kZWxpdmVyZWRfZGVhdGgsIGVudHJ5KSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwKLQkJCQkiICBoYXMgZGVsaXZlcmVkIGRlYWQgYmluZGVyXG4iKTsKLQkJYnJlYWs7Ci0JfQotCWlmICghcHJpbnRfYWxsICYmIGJ1ZiA9PSBoZWFkZXJfYnVmKQotCQlidWYgPSBzdGFydF9idWY7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmJpbmRlcl9yZXR1cm5fc3RyaW5nc1tdID0gewotCSJCUl9FUlJPUiIsCi0JIkJSX09LIiwKLQkiQlJfVFJBTlNBQ1RJT04iLAotCSJCUl9SRVBMWSIsCi0JIkJSX0FDUVVJUkVfUkVTVUxUIiwKLQkiQlJfREVBRF9SRVBMWSIsCi0JIkJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFIiwKLQkiQlJfSU5DUkVGUyIsCi0JIkJSX0FDUVVJUkUiLAotCSJCUl9SRUxFQVNFIiwKLQkiQlJfREVDUkVGUyIsCi0JIkJSX0FUVEVNUFRfQUNRVUlSRSIsCi0JIkJSX05PT1AiLAotCSJCUl9TUEFXTl9MT09QRVIiLAotCSJCUl9GSU5JU0hFRCIsCi0JIkJSX0RFQURfQklOREVSIiwKLQkiQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUiLAotCSJCUl9GQUlMRURfUkVQTFkiCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqYmluZGVyX2NvbW1hbmRfc3RyaW5nc1tdID0gewotCSJCQ19UUkFOU0FDVElPTiIsCi0JIkJDX1JFUExZIiwKLQkiQkNfQUNRVUlSRV9SRVNVTFQiLAotCSJCQ19GUkVFX0JVRkZFUiIsCi0JIkJDX0lOQ1JFRlMiLAotCSJCQ19BQ1FVSVJFIiwKLQkiQkNfUkVMRUFTRSIsCi0JIkJDX0RFQ1JFRlMiLAotCSJCQ19JTkNSRUZTX0RPTkUiLAotCSJCQ19BQ1FVSVJFX0RPTkUiLAotCSJCQ19BVFRFTVBUX0FDUVVJUkUiLAotCSJCQ19SRUdJU1RFUl9MT09QRVIiLAotCSJCQ19FTlRFUl9MT09QRVIiLAotCSJCQ19FWElUX0xPT1BFUiIsCi0JIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKLQkiQkNfREVBRF9CSU5ERVJfRE9ORSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiaW5kZXJfb2Jqc3RhdF9zdHJpbmdzW10gPSB7Ci0JInByb2MiLAotCSJ0aHJlYWQiLAotCSJub2RlIiwKLQkicmVmIiwKLQkiZGVhdGgiLAotCSJ0cmFuc2FjdGlvbiIsCi0JInRyYW5zYWN0aW9uX2NvbXBsZXRlIgotfTsKLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9zdGF0cyhjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcHJlZml4LAotCQkJCXN0cnVjdCBiaW5kZXJfc3RhdHMgKnN0YXRzKQotewotCWludCBpOwotCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPmJjKSAhPQotCQkJQVJSQVlfU0laRShiaW5kZXJfY29tbWFuZF9zdHJpbmdzKSk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMtPmJjKTsgaSsrKSB7Ci0JCWlmIChzdGF0cy0+YmNbaV0pCi0JCQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIlcyVzOiAlZFxuIiwgcHJlZml4LAotCQkJCQliaW5kZXJfY29tbWFuZF9zdHJpbmdzW2ldLAotCQkJCQlzdGF0cy0+YmNbaV0pOwotCQlpZiAoYnVmID49IGVuZCkKLQkJCXJldHVybiBidWY7Ci0JfQotCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoc3RhdHMtPmJyKSAhPQotCQkJQVJSQVlfU0laRShiaW5kZXJfcmV0dXJuX3N0cmluZ3MpKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0cy0+YnIpOyBpKyspIHsKLQkJaWYgKHN0YXRzLT5icltpXSkKLQkJCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiVzJXM6ICVkXG4iLCBwcmVmaXgsCi0JCQkJCWJpbmRlcl9yZXR1cm5fc3RyaW5nc1tpXSwgc3RhdHMtPmJyW2ldKTsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlyZXR1cm4gYnVmOwotCX0KLQotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0KLQkJCUFSUkFZX1NJWkUoYmluZGVyX29ianN0YXRfc3RyaW5ncykpOwotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKHN0YXRzLT5vYmpfY3JlYXRlZCkgIT0KLQkJCUFSUkFZX1NJWkUoc3RhdHMtPm9ial9kZWxldGVkKSk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHMtPm9ial9jcmVhdGVkKTsgaSsrKSB7Ci0JCWlmIChzdGF0cy0+b2JqX2NyZWF0ZWRbaV0gfHwgc3RhdHMtPm9ial9kZWxldGVkW2ldKQotCQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLAotCQkJCQkiJXMlczogYWN0aXZlICVkIHRvdGFsICVkXG4iLCBwcmVmaXgsCi0JCQkJCWJpbmRlcl9vYmpzdGF0X3N0cmluZ3NbaV0sCi0JCQkJCXN0YXRzLT5vYmpfY3JlYXRlZFtpXSAtCi0JCQkJCQlzdGF0cy0+b2JqX2RlbGV0ZWRbaV0sCi0JCQkJCXN0YXRzLT5vYmpfY3JlYXRlZFtpXSk7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJcmV0dXJuIGJ1ZjsKLQl9Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKnByaW50X2JpbmRlcl9wcm9jX3N0YXRzKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJCSAgICAgc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jKQotewotCXN0cnVjdCBiaW5kZXJfd29yayAqdzsKLQlzdHJ1Y3QgcmJfbm9kZSAqbjsKLQlpbnQgY291bnQsIHN0cm9uZywgd2VhazsKLQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgInByb2MgJWRcbiIsIHByb2MtPnBpZCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JY291bnQgPSAwOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT50aHJlYWRzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKLQkJY291bnQrKzsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHRocmVhZHM6ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICByZXF1ZXN0ZWQgdGhyZWFkczogJWQrJWQvJWRcbiIKLQkJCSIgIHJlYWR5IHRocmVhZHMgJWRcbiIKLQkJCSIgIGZyZWUgYXN5bmMgc3BhY2UgJXpkXG4iLCBwcm9jLT5yZXF1ZXN0ZWRfdGhyZWFkcywKLQkJCXByb2MtPnJlcXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQsIHByb2MtPm1heF90aHJlYWRzLAotCQkJcHJvYy0+cmVhZHlfdGhyZWFkcywgcHJvYy0+ZnJlZV9hc3luY19zcGFjZSk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0JY291bnQgPSAwOwotCWZvciAobiA9IHJiX2ZpcnN0KCZwcm9jLT5ub2Rlcyk7IG4gIT0gTlVMTDsgbiA9IHJiX25leHQobikpCi0JCWNvdW50Kys7Ci0JYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiICBub2RlczogJWRcbiIsIGNvdW50KTsKLQlpZiAoYnVmID49IGVuZCkKLQkJcmV0dXJuIGJ1ZjsKLQljb3VudCA9IDA7Ci0Jc3Ryb25nID0gMDsKLQl3ZWFrID0gMDsKLQlmb3IgKG4gPSByYl9maXJzdCgmcHJvYy0+cmVmc19ieV9kZXNjKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkgewotCQlzdHJ1Y3QgYmluZGVyX3JlZiAqcmVmID0gcmJfZW50cnkobiwgc3RydWN0IGJpbmRlcl9yZWYsCi0JCQkJCQkgIHJiX25vZGVfZGVzYyk7Ci0JCWNvdW50Kys7Ci0JCXN0cm9uZyArPSByZWYtPnN0cm9uZzsKLQkJd2VhayArPSByZWYtPndlYWs7Ci0JfQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgIiAgcmVmczogJWQgcyAlZCB3ICVkXG4iLAotCQkJY291bnQsIHN0cm9uZywgd2Vhayk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0KLQljb3VudCA9IDA7Ci0JZm9yIChuID0gcmJfZmlyc3QoJnByb2MtPmFsbG9jYXRlZF9idWZmZXJzKTsgbiAhPSBOVUxMOyBuID0gcmJfbmV4dChuKSkKLQkJY291bnQrKzsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIGJ1ZmZlcnM6ICVkXG4iLCBjb3VudCk7Ci0JaWYgKGJ1ZiA+PSBlbmQpCi0JCXJldHVybiBidWY7Ci0KLQljb3VudCA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJvYy0+dG9kbywgZW50cnkpIHsKLQkJc3dpdGNoICh3LT50eXBlKSB7Ci0JCWNhc2UgQklOREVSX1dPUktfVFJBTlNBQ1RJT046Ci0JCQljb3VudCsrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICIgIHBlbmRpbmcgdHJhbnNhY3Rpb25zOiAlZFxuIiwgY291bnQpOwotCWlmIChidWYgPj0gZW5kKQotCQlyZXR1cm4gYnVmOwotCi0JYnVmID0gcHJpbnRfYmluZGVyX3N0YXRzKGJ1ZiwgZW5kLCAiICAiLCAmcHJvYy0+c3RhdHMpOwotCi0JcmV0dXJuIGJ1ZjsKLX0KLQotCi1zdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2Nfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCXN0cnVjdCBiaW5kZXJfbm9kZSAqbm9kZTsKLQlpbnQgbGVuID0gMDsKLQljaGFyICpidWYgPSBwYWdlOwotCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0JaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChkb19sb2NrKQotCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsICJiaW5kZXIgc3RhdGU6XG4iKTsKLQotCWlmICghaGxpc3RfZW1wdHkoJmJpbmRlcl9kZWFkX25vZGVzKSkKLQkJYnVmICs9IHNucHJpbnRmKGJ1ZiwgZW5kIC0gYnVmLCAiZGVhZCBub2RlczpcbiIpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIHBvcywgJmJpbmRlcl9kZWFkX25vZGVzLCBkZWFkX25vZGUpIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX25vZGUoYnVmLCBlbmQsIG5vZGUpOwotCX0KLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb2MsIHBvcywgJmJpbmRlcl9wcm9jcywgcHJvY19ub2RlKSB7Ci0JCWlmIChidWYgPj0gZW5kKQotCQkJYnJlYWs7Ci0JCWJ1ZiA9IHByaW50X2JpbmRlcl9wcm9jKGJ1ZiwgZW5kLCBwcm9jLCAxKTsKLQl9Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCWlmIChidWYgPiBwYWdlICsgUEFHRV9TSVpFKQotCQlidWYgPSBwYWdlICsgUEFHRV9TSVpFOwotCi0JKnN0YXJ0ID0gcGFnZSArIG9mZjsKLQotCWxlbiA9IGJ1ZiAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY19zdGF0cyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJpbmRlcl9wcm9jICpwcm9jOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciAqcCA9IHBhZ2U7Ci0JaW50IGRvX2xvY2sgPSAhYmluZGVyX2RlYnVnX25vX2xvY2s7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChkb19sb2NrKQotCQltdXRleF9sb2NrKCZiaW5kZXJfbG9jayk7Ci0KLQlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSwgImJpbmRlciBzdGF0czpcbiIpOwotCi0JcCA9IHByaW50X2JpbmRlcl9zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCAiIiwgJmJpbmRlcl9zdGF0cyk7Ci0KLQlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgewotCQlpZiAocCA+PSBwYWdlICsgUEFHRV9TSVpFKQotCQkJYnJlYWs7Ci0JCXAgPSBwcmludF9iaW5kZXJfcHJvY19zdGF0cyhwLCBwYWdlICsgUEFHRV9TSVpFLCBwcm9jKTsKLQl9Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCWlmIChwID4gcGFnZSArIFBBR0VfU0laRSkKLQkJcCA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0KLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCi0JbGVuID0gcCAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOwotCWludCBsZW4gPSAwOwotCWNoYXIgKmJ1ZiA9IHBhZ2U7Ci0JY2hhciAqZW5kID0gcGFnZSArIFBBR0VfU0laRTsKLQlpbnQgZG9fbG9jayA9ICFiaW5kZXJfZGVidWdfbm9fbG9jazsKLQotCWlmIChvZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKGRvX2xvY2spCi0JCW11dGV4X2xvY2soJmJpbmRlcl9sb2NrKTsKLQotCWJ1ZiArPSBzbnByaW50ZihidWYsIGVuZCAtIGJ1ZiwgImJpbmRlciB0cmFuc2FjdGlvbnM6XG4iKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShwcm9jLCBwb3MsICZiaW5kZXJfcHJvY3MsIHByb2Nfbm9kZSkgewotCQlpZiAoYnVmID49IGVuZCkKLQkJCWJyZWFrOwotCQlidWYgPSBwcmludF9iaW5kZXJfcHJvYyhidWYsIGVuZCwgcHJvYywgMCk7Ci0JfQotCWlmIChkb19sb2NrKQotCQltdXRleF91bmxvY2soJmJpbmRlcl9sb2NrKTsKLQlpZiAoYnVmID4gcGFnZSArIFBBR0VfU0laRSkKLQkJYnVmID0gcGFnZSArIFBBR0VfU0laRTsKLQotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0KLQlsZW4gPSBidWYgLSBwYWdlOwotCWlmIChsZW4gPiBvZmYpCi0JCWxlbiAtPSBvZmY7Ci0JZWxzZQotCQlsZW4gPSAwOwotCi0JcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OwotfQotCi1zdGF0aWMgaW50IGJpbmRlcl9yZWFkX3Byb2NfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MgPSBkYXRhOwotCWludCBsZW4gPSAwOwotCWNoYXIgKnAgPSBwYWdlOwotCWludCBkb19sb2NrID0gIWJpbmRlcl9kZWJ1Z19ub19sb2NrOwotCi0JaWYgKG9mZikKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZG9fbG9jaykKLQkJbXV0ZXhfbG9jaygmYmluZGVyX2xvY2spOwotCXAgKz0gc25wcmludGYocCwgUEFHRV9TSVpFLCAiYmluZGVyIHByb2Mgc3RhdGU6XG4iKTsKLQlwID0gcHJpbnRfYmluZGVyX3Byb2MocCwgcGFnZSArIFBBR0VfU0laRSwgcHJvYywgMSk7Ci0JaWYgKGRvX2xvY2spCi0JCW11dGV4X3VubG9jaygmYmluZGVyX2xvY2spOwotCi0JaWYgKHAgPiBwYWdlICsgUEFHRV9TSVpFKQotCQlwID0gcGFnZSArIFBBR0VfU0laRTsKLQkqc3RhcnQgPSBwYWdlICsgb2ZmOwotCi0JbGVuID0gcCAtIHBhZ2U7Ci0JaWYgKGxlbiA+IG9mZikKLQkJbGVuIC09IG9mZjsKLQllbHNlCi0JCWxlbiA9IDA7Ci0KLQlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7Ci19Ci0KLXN0YXRpYyBjaGFyICpwcmludF9iaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5KGNoYXIgKmJ1ZiwgY2hhciAqZW5kLAotCQkJCQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeSAqZSkKLXsKLQlidWYgKz0gc25wcmludGYoYnVmLCBlbmQgLSBidWYsCi0JCQkiJWQ6ICVzIGZyb20gJWQ6JWQgdG8gJWQ6JWQgbm9kZSAlZCBoYW5kbGUgJWQgIgotCQkJInNpemUgJWQ6JWRcbiIsCi0JCQllLT5kZWJ1Z19pZCwgKGUtPmNhbGxfdHlwZSA9PSAyKSA/ICJyZXBseSIgOgotCQkJKChlLT5jYWxsX3R5cGUgPT0gMSkgPyAiYXN5bmMiIDogImNhbGwgIiksIGUtPmZyb21fcHJvYywKLQkJCWUtPmZyb21fdGhyZWFkLCBlLT50b19wcm9jLCBlLT50b190aHJlYWQsIGUtPnRvX25vZGUsCi0JCQllLT50YXJnZXRfaGFuZGxlLCBlLT5kYXRhX3NpemUsIGUtPm9mZnNldHNfc2l6ZSk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGludCBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZygKLQljaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZyAqbG9nID0gZGF0YTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaTsKLQljaGFyICpidWYgPSBwYWdlOwotCWNoYXIgKmVuZCA9IHBhZ2UgKyBQQUdFX1NJWkU7Ci0KLQlpZiAob2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmIChsb2ctPmZ1bGwpIHsKLQkJZm9yIChpID0gbG9nLT5uZXh0OyBpIDwgQVJSQVlfU0laRShsb2ctPmVudHJ5KTsgaSsrKSB7Ci0JCQlpZiAoYnVmID49IGVuZCkKLQkJCQlicmVhazsKLQkJCWJ1ZiA9IHByaW50X2JpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkoYnVmLCBlbmQsCi0JCQkJCQkJCSZsb2ctPmVudHJ5W2ldKTsKLQkJfQotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbG9nLT5uZXh0OyBpKyspIHsKLQkJaWYgKGJ1ZiA+PSBlbmQpCi0JCQlicmVhazsKLQkJYnVmID0gcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRyeShidWYsIGVuZCwKLQkJCQkJCQkgJmxvZy0+ZW50cnlbaV0pOwotCX0KLQotCSpzdGFydCA9IHBhZ2UgKyBvZmY7Ci0KLQlsZW4gPSBidWYgLSBwYWdlOwotCWlmIChsZW4gPiBvZmYpCi0JCWxlbiAtPSBvZmY7Ci0JZWxzZQotCQlsZW4gPSAwOwotCi0JcmV0dXJuIGxlbiA8IGNvdW50ID8gbGVuICA6IGNvdW50OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiaW5kZXJfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkucG9sbCA9IGJpbmRlcl9wb2xsLAotCS51bmxvY2tlZF9pb2N0bCA9IGJpbmRlcl9pb2N0bCwKLQkubW1hcCA9IGJpbmRlcl9tbWFwLAotCS5vcGVuID0gYmluZGVyX29wZW4sCi0JLmZsdXNoID0gYmluZGVyX2ZsdXNoLAotCS5yZWxlYXNlID0gYmluZGVyX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgYmluZGVyX21pc2NkZXYgPSB7Ci0JLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAotCS5uYW1lID0gImJpbmRlciIsCi0JLmZvcHMgPSAmYmluZGVyX2ZvcHMKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJpbmRlcl9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCWJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290ID0gcHJvY19ta2RpcigiYmluZGVyIiwgTlVMTCk7Ci0JaWYgKGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290KQotCQliaW5kZXJfcHJvY19kaXJfZW50cnlfcHJvYyA9IHByb2NfbWtkaXIoInByb2MiLAotCQkJCQkJYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpOwotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmJpbmRlcl9taXNjZGV2KTsKLQlpZiAoYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QpIHsKLQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdGUiLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY19zdGF0ZSwKLQkJCQkgICAgICAgTlVMTCk7Ci0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzIiwKLQkJCQkgICAgICAgU19JUlVHTywKLQkJCQkgICAgICAgYmluZGVyX3Byb2NfZGlyX2VudHJ5X3Jvb3QsCi0JCQkJICAgICAgIGJpbmRlcl9yZWFkX3Byb2Nfc3RhdHMsCi0JCQkJICAgICAgIE5VTEwpOwotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ0cmFuc2FjdGlvbnMiLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbnMsCi0JCQkJICAgICAgIE5VTEwpOwotCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ0cmFuc2FjdGlvbl9sb2ciLAotCQkJCSAgICAgICBTX0lSVUdPLAotCQkJCSAgICAgICBiaW5kZXJfcHJvY19kaXJfZW50cnlfcm9vdCwKLQkJCQkgICAgICAgYmluZGVyX3JlYWRfcHJvY190cmFuc2FjdGlvbl9sb2csCi0JCQkJICAgICAgICZiaW5kZXJfdHJhbnNhY3Rpb25fbG9nKTsKLQkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZmFpbGVkX3RyYW5zYWN0aW9uX2xvZyIsCi0JCQkJICAgICAgIFNfSVJVR08sCi0JCQkJICAgICAgIGJpbmRlcl9wcm9jX2Rpcl9lbnRyeV9yb290LAotCQkJCSAgICAgICBiaW5kZXJfcmVhZF9wcm9jX3RyYW5zYWN0aW9uX2xvZywKLQkJCQkgICAgICAgJmJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZmFpbGVkKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGJpbmRlcl9pbml0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvYmluZGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzYWUxYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9iaW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIEJhc2VkIG9uLCBidXQgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCwgdGhlIG9yaWdpbmFsCi0gKiBPcGVuQmluZGVyLm9yZyBiaW5kZXIgZHJpdmVyIGludGVyZmFjZSwgd2hpY2ggaXM6Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1IFBhbG1zb3VyY2UsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9CSU5ERVJfSAotI2RlZmluZSBfTElOVVhfQklOREVSX0gKLQotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0KLSNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCi0JKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKLSNkZWZpbmUgQl9UWVBFX0xBUkdFIDB4ODUKLQotZW51bSB7Ci0JQklOREVSX1RZUEVfQklOREVSCT0gQl9QQUNLX0NIQVJTKCdzJywgJ2InLCAnKicsIEJfVFlQRV9MQVJHRSksCi0JQklOREVSX1RZUEVfV0VBS19CSU5ERVIJPSBCX1BBQ0tfQ0hBUlMoJ3cnLCAnYicsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9IQU5ETEUJPSBCX1BBQ0tfQ0hBUlMoJ3MnLCAnaCcsICcqJywgQl9UWVBFX0xBUkdFKSwKLQlCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRQk9IEJfUEFDS19DSEFSUygndycsICdoJywgJyonLCBCX1RZUEVfTEFSR0UpLAotCUJJTkRFUl9UWVBFX0ZECQk9IEJfUEFDS19DSEFSUygnZicsICdkJywgJyonLCBCX1RZUEVfTEFSR0UpLAotfTsKLQotZW51bSB7Ci0JRkxBVF9CSU5ERVJfRkxBR19QUklPUklUWV9NQVNLID0gMHhmZiwKLQlGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTID0gMHgxMDAsCi19OwotCi0vKgotICogVGhpcyBpcyB0aGUgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgQmluZGVyIG9iamVjdCBmb3IgdHJhbnNmZXIKLSAqIGJldHdlZW4gcHJvY2Vzc2VzLiAgVGhlICdvZmZzZXRzJyBzdXBwbGllZCBhcyBwYXJ0IG9mIGEgYmluZGVyIHRyYW5zYWN0aW9uCi0gKiBjb250YWlucyBvZmZzZXRzIGludG8gdGhlIGRhdGEgd2hlcmUgdGhlc2Ugc3RydWN0dXJlcyBvY2N1ci4gIFRoZSBCaW5kZXIKLSAqIGRyaXZlciB0YWtlcyBjYXJlIG9mIHJlLXdyaXRpbmcgdGhlIHN0cnVjdHVyZSB0eXBlIGFuZCBkYXRhIGFzIGl0IG1vdmVzCi0gKiBiZXR3ZWVuIHByb2Nlc3Nlcy4KLSAqLwotc3RydWN0IGZsYXRfYmluZGVyX29iamVjdCB7Ci0JLyogOCBieXRlcyBmb3IgbGFyZ2VfZmxhdF9oZWFkZXIuICovCi0JdW5zaWduZWQgbG9uZwkJdHlwZTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCS8qIDggYnl0ZXMgb2YgZGF0YS4gKi8KLQl1bmlvbiB7Ci0JCXZvaWQJCSpiaW5kZXI7CS8qIGxvY2FsIG9iamVjdCAqLwotCQlzaWduZWQgbG9uZwloYW5kbGU7CQkvKiByZW1vdGUgb2JqZWN0ICovCi0JfTsKLQotCS8qIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGxvY2FsIG9iamVjdCAqLwotCXZvaWQJCQkqY29va2llOwotfTsKLQotLyoKLSAqIE9uIDY0LWJpdCBwbGF0Zm9ybXMgd2hlcmUgdXNlciBjb2RlIG1heSBydW4gaW4gMzItYml0cyB0aGUgZHJpdmVyIG11c3QKLSAqIHRyYW5zbGF0ZSB0aGUgYnVmZmVyIChhbmQgbG9jYWwgYmluZGVyKSBhZGRyZXNzZXMgYXByb3ByaWF0ZWx5LgotICovCi0KLXN0cnVjdCBiaW5kZXJfd3JpdGVfcmVhZCB7Ci0Jc2lnbmVkIGxvbmcJd3JpdGVfc2l6ZTsJLyogYnl0ZXMgdG8gd3JpdGUgKi8KLQlzaWduZWQgbG9uZwl3cml0ZV9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCi0JdW5zaWduZWQgbG9uZwl3cml0ZV9idWZmZXI7Ci0Jc2lnbmVkIGxvbmcJcmVhZF9zaXplOwkvKiBieXRlcyB0byByZWFkICovCi0Jc2lnbmVkIGxvbmcJcmVhZF9jb25zdW1lZDsJLyogYnl0ZXMgY29uc3VtZWQgYnkgZHJpdmVyICovCi0JdW5zaWduZWQgbG9uZwlyZWFkX2J1ZmZlcjsKLX07Ci0KLS8qIFVzZSB3aXRoIEJJTkRFUl9WRVJTSU9OLCBkcml2ZXIgZmlsbHMgaW4gZmllbGRzLiAqLwotc3RydWN0IGJpbmRlcl92ZXJzaW9uIHsKLQkvKiBkcml2ZXIgcHJvdG9jb2wgdmVyc2lvbiAtLSBpbmNyZW1lbnQgd2l0aCBpbmNvbXBhdGlibGUgY2hhbmdlICovCi0Jc2lnbmVkIGxvbmcJcHJvdG9jb2xfdmVyc2lvbjsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdmVyc2lvbi4gKi8KLSNkZWZpbmUgQklOREVSX0NVUlJFTlRfUFJPVE9DT0xfVkVSU0lPTiA3Ci0KLSNkZWZpbmUgQklOREVSX1dSSVRFX1JFQUQgICAJCV9JT1dSKCdiJywgMSwgc3RydWN0IGJpbmRlcl93cml0ZV9yZWFkKQotI2RlZmluZQlCSU5ERVJfU0VUX0lETEVfVElNRU9VVAkJX0lPVygnYicsIDMsIGludDY0X3QpCi0jZGVmaW5lCUJJTkRFUl9TRVRfTUFYX1RIUkVBRFMJCV9JT1coJ2InLCA1LCBzaXplX3QpCi0jZGVmaW5lCUJJTkRFUl9TRVRfSURMRV9QUklPUklUWQlfSU9XKCdiJywgNiwgaW50KQotI2RlZmluZQlCSU5ERVJfU0VUX0NPTlRFWFRfTUdSCQlfSU9XKCdiJywgNywgaW50KQotI2RlZmluZQlCSU5ERVJfVEhSRUFEX0VYSVQJCV9JT1coJ2InLCA4LCBpbnQpCi0jZGVmaW5lIEJJTkRFUl9WRVJTSU9OCQkJX0lPV1IoJ2InLCA5LCBzdHJ1Y3QgYmluZGVyX3ZlcnNpb24pCi0KLS8qCi0gKiBOT1RFOiBUd28gc3BlY2lhbCBlcnJvciBjb2RlcyB5b3Ugc2hvdWxkIGNoZWNrIGZvciB3aGVuIGNhbGxpbmcKLSAqIGluIHRvIHRoZSBkcml2ZXIgYXJlOgotICoKLSAqIEVJTlRSIC0tIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJ1cHRlZC4gIFRoaXMgc2hvdWxkIGJlCi0gKiBoYW5kbGVkIGJ5IHJldHJ5aW5nIHRoZSBpb2N0bCgpIHVudGlsIGEgZGlmZmVyZW50IGVycm9yIGNvZGUKLSAqIGlzIHJldHVybmVkLgotICoKLSAqIEVDT05OUkVGVVNFRCAtLSBUaGUgZHJpdmVyIGlzIG5vIGxvbmdlciBhY2NlcHRpbmcgb3BlcmF0aW9ucwotICogZnJvbSB5b3VyIHByb2Nlc3MuICBUaGF0IGlzLCB0aGUgcHJvY2VzcyBpcyBiZWluZyBkZXN0cm95ZWQuCi0gKiBZb3Ugc2hvdWxkIGhhbmRsZSB0aGlzIGJ5IGV4aXRpbmcgZnJvbSB5b3VyIHByb2Nlc3MuICBOb3RlCi0gKiB0aGF0IG9uY2UgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLCBhbGwgZnVydGhlciBjYWxscyB0bwotICogdGhlIGRyaXZlciBmcm9tIGFueSB0aHJlYWQgd2lsbCByZXR1cm4gdGhpcyBzYW1lIGNvZGUuCi0gKi8KLQotZW51bSB0cmFuc2FjdGlvbl9mbGFncyB7Ci0JVEZfT05FX1dBWQk9IDB4MDEsCS8qIHRoaXMgaXMgYSBvbmUtd2F5IGNhbGw6IGFzeW5jLCBubyByZXR1cm4gKi8KLQlURl9ST09UX09CSkVDVAk9IDB4MDQsCS8qIGNvbnRlbnRzIGFyZSB0aGUgY29tcG9uZW50J3Mgcm9vdCBvYmplY3QgKi8KLQlURl9TVEFUVVNfQ09ERQk9IDB4MDgsCS8qIGNvbnRlbnRzIGFyZSBhIDMyLWJpdCBzdGF0dXMgY29kZSAqLwotCVRGX0FDQ0VQVF9GRFMJPSAweDEwLAkvKiBhbGxvdyByZXBsaWVzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyAqLwotfTsKLQotc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhIHsKLQkvKiBUaGUgZmlyc3QgdHdvIGFyZSBvbmx5IHVzZWQgZm9yIGJjVFJBTlNBQ1RJT04gYW5kIGJyVFJBTlNBQ1RJT04sCi0JICogaWRlbnRpZnlpbmcgdGhlIHRhcmdldCBhbmQgY29udGVudHMgb2YgdGhlIHRyYW5zYWN0aW9uLgotCSAqLwotCXVuaW9uIHsKLQkJc2l6ZV90CWhhbmRsZTsJLyogdGFyZ2V0IGRlc2NyaXB0b3Igb2YgY29tbWFuZCB0cmFuc2FjdGlvbiAqLwotCQl2b2lkCSpwdHI7CS8qIHRhcmdldCBkZXNjcmlwdG9yIG9mIHJldHVybiB0cmFuc2FjdGlvbiAqLwotCX0gdGFyZ2V0OwotCXZvaWQJCSpjb29raWU7CS8qIHRhcmdldCBvYmplY3QgY29va2llICovCi0JdW5zaWduZWQgaW50CWNvZGU7CQkvKiB0cmFuc2FjdGlvbiBjb21tYW5kICovCi0KLQkvKiBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2FjdGlvbi4gKi8KLQl1bnNpZ25lZCBpbnQJZmxhZ3M7Ci0JcGlkX3QJCXNlbmRlcl9waWQ7Ci0JdWlkX3QJCXNlbmRlcl9ldWlkOwotCXNpemVfdAkJZGF0YV9zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSAqLwotCXNpemVfdAkJb2Zmc2V0c19zaXplOwkvKiBudW1iZXIgb2YgYnl0ZXMgb2Ygb2Zmc2V0cyAqLwotCi0JLyogSWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBpbmxpbmUsIHRoZSBkYXRhIGltbWVkaWF0ZWx5Ci0JICogZm9sbG93cyBoZXJlOyBvdGhlcndpc2UsIGl0IGVuZHMgd2l0aCBhIHBvaW50ZXIgdG8KLQkgKiB0aGUgZGF0YSBidWZmZXIuCi0JICovCi0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJLyogdHJhbnNhY3Rpb24gZGF0YSAqLwotCQkJY29uc3Qgdm9pZAkqYnVmZmVyOwotCQkJLyogb2Zmc2V0cyBmcm9tIGJ1ZmZlciB0byBmbGF0X2JpbmRlcl9vYmplY3Qgc3RydWN0cyAqLwotCQkJY29uc3Qgdm9pZAkqb2Zmc2V0czsKLQkJfSBwdHI7Ci0JCXVpbnQ4X3QJYnVmWzhdOwotCX0gZGF0YTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSB7Ci0Jdm9pZCAqcHRyOwotCXZvaWQgKmNvb2tpZTsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX2Rlc2MgewotCWludCBwcmlvcml0eTsKLQlpbnQgZGVzYzsKLX07Ci0KLXN0cnVjdCBiaW5kZXJfcHJpX3B0cl9jb29raWUgewotCWludCBwcmlvcml0eTsKLQl2b2lkICpwdHI7Ci0Jdm9pZCAqY29va2llOwotfTsKLQotZW51bSBCaW5kZXJEcml2ZXJSZXR1cm5Qcm90b2NvbCB7Ci0JQlJfRVJST1IgPSBfSU9SKCdyJywgMCwgaW50KSwKLQkvKgotCSAqIGludDogZXJyb3IgY29kZQotCSAqLwotCi0JQlJfT0sgPSBfSU8oJ3InLCAxKSwKLQkvKiBObyBwYXJhbWV0ZXJzISAqLwotCi0JQlJfVFJBTlNBQ1RJT04gPSBfSU9SKCdyJywgMiwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKSwKLQlCUl9SRVBMWSA9IF9JT1IoJ3InLCAzLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCS8qCi0JICogYmluZGVyX3RyYW5zYWN0aW9uX2RhdGE6IHRoZSByZWNlaXZlZCBjb21tYW5kLgotCSAqLwotCi0JQlJfQUNRVUlSRV9SRVNVTFQgPSBfSU9SKCdyJywgNCwgaW50KSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50OiAwIGlmIHRoZSBsYXN0IGJjQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiBFbHNlIHRoZSByZW1vdGUgb2JqZWN0IGhhcyBhY3F1aXJlZCBhIHByaW1hcnkgcmVmZXJlbmNlLgotCSAqLwotCi0JQlJfREVBRF9SRVBMWSA9IF9JTygncicsIDUpLAotCS8qCi0JICogVGhlIHRhcmdldCBvZiB0aGUgbGFzdCB0cmFuc2FjdGlvbiAoZWl0aGVyIGEgYmNUUkFOU0FDVElPTiBvcgotCSAqIGEgYmNBVFRFTVBUX0FDUVVJUkUpIGlzIG5vIGxvbmdlciB3aXRoIHVzLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLQotCUJSX1RSQU5TQUNUSU9OX0NPTVBMRVRFID0gX0lPKCdyJywgNiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLi4uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxhc3QgdHJhbnNhY3Rpb24gcmVxdWVzdGVkCi0JICogKGluY2x1ZGluZyByZXBsaWVzKS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2VudCBldmVuIGZvcgotCSAqIGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMuCi0JICovCi0KLQlCUl9JTkNSRUZTID0gX0lPUigncicsIDcsIHN0cnVjdCBiaW5kZXJfcHRyX2Nvb2tpZSksCi0JQlJfQUNRVUlSRSA9IF9JT1IoJ3InLCA4LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCUJSX1JFTEVBU0UgPSBfSU9SKCdyJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCUl9ERUNSRUZTID0gX0lPUigncicsIDEwLCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOglwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUgZm9yIGJpbmRlcgotCSAqLwotCi0JQlJfQVRURU1QVF9BQ1FVSVJFID0gX0lPUigncicsIDExLCBzdHJ1Y3QgYmluZGVyX3ByaV9wdHJfY29va2llKSwKLQkvKgotCSAqIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkCi0JICogaW50Oglwcmlvcml0eQotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJSX05PT1AgPSBfSU8oJ3InLCAxMiksCi0JLyoKLQkgKiBObyBwYXJhbWV0ZXJzLiAgRG8gbm90aGluZyBhbmQgZXhhbWluZSB0aGUgbmV4dCBjb21tYW5kLiAgSXQgZXhpc3RzCi0JICogcHJpbWFyaWx5IHNvIHRoYXQgd2UgY2FuIHJlcGxhY2UgaXQgd2l0aCBhIEJSX1NQQVdOX0xPT1BFUiBjb21tYW5kLgotCSAqLwotCi0JQlJfU1BBV05fTE9PUEVSID0gX0lPKCdyJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4gIFRoZSBkcml2ZXIgaGFzIGRldGVybWluZWQgdGhhdCBhIHByb2Nlc3MgaGFzIG5vCi0JICogdGhyZWFkcyB3YWl0aW5nIHRvIHNlcnZpY2UgaW5jb21taW5nIHRyYW5zYWN0aW9ucy4gIFdoZW4gYSBwcm9jZXNzCi0JICogcmVjZWl2ZXMgdGhpcyBjb21tYW5kLCBpdCBtdXN0IHNwYXduIGEgbmV3IHNlcnZpY2UgdGhyZWFkIGFuZAotCSAqIHJlZ2lzdGVyIGl0IHZpYSBiY0VOVEVSX0xPT1BFUi4KLQkgKi8KLQotCUJSX0ZJTklTSEVEID0gX0lPKCdyJywgMTQpLAotCS8qCi0JICogbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKLQkgKiBzdG9wIHRocmVhZHBvb2wgdGhyZWFkCi0JICovCi0KLQlCUl9ERUFEX0JJTkRFUiA9IF9JT1IoJ3InLCAxNSwgdm9pZCAqKSwKLQkvKgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0JQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkUgPSBfSU9SKCdyJywgMTYsIHZvaWQgKiksCi0JLyoKLQkgKiB2b2lkICo6IGNvb2tpZQotCSAqLwotCi0JQlJfRkFJTEVEX1JFUExZID0gX0lPKCdyJywgMTcpLAotCS8qCi0JICogVGhlIHRoZSBsYXN0IHRyYW5zYWN0aW9uIChlaXRoZXIgYSBiY1RSQU5TQUNUSU9OIG9yCi0JICogYSBiY0FUVEVNUFRfQUNRVUlSRSkgZmFpbGVkIChlLmcuIG91dCBvZiBtZW1vcnkpLiAgTm8gcGFyYW1ldGVycy4KLQkgKi8KLX07Ci0KLWVudW0gQmluZGVyRHJpdmVyQ29tbWFuZFByb3RvY29sIHsKLQlCQ19UUkFOU0FDVElPTiA9IF9JT1coJ2MnLCAwLCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2RhdGEpLAotCUJDX1JFUExZID0gX0lPVygnYycsIDEsIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSksCi0JLyoKLQkgKiBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YTogdGhlIHNlbnQgY29tbWFuZC4KLQkgKi8KLQotCUJDX0FDUVVJUkVfUkVTVUxUID0gX0lPVygnYycsIDIsIGludCksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogIDAgaWYgdGhlIGxhc3QgQlJfQVRURU1QVF9BQ1FVSVJFIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KLQkgKiBFbHNlIHlvdSBoYXZlIGFjcXVpcmVkIGEgcHJpbWFyeSByZWZlcmVuY2Ugb24gdGhlIG9iamVjdC4KLQkgKi8KLQotCUJDX0ZSRUVfQlVGRkVSID0gX0lPVygnYycsIDMsIGludCksCi0JLyoKLQkgKiB2b2lkICo6IHB0ciB0byB0cmFuc2FjdGlvbiBkYXRhIHJlY2VpdmVkIG9uIGEgcmVhZAotCSAqLwotCi0JQkNfSU5DUkVGUyA9IF9JT1coJ2MnLCA0LCBpbnQpLAotCUJDX0FDUVVJUkUgPSBfSU9XKCdjJywgNSwgaW50KSwKLQlCQ19SRUxFQVNFID0gX0lPVygnYycsIDYsIGludCksCi0JQkNfREVDUkVGUyA9IF9JT1coJ2MnLCA3LCBpbnQpLAotCS8qCi0JICogaW50OglkZXNjcmlwdG9yCi0JICovCi0KLQlCQ19JTkNSRUZTX0RPTkUgPSBfSU9XKCdjJywgOCwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQlCQ19BQ1FVSVJFX0RPTkUgPSBfSU9XKCdjJywgOSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llIGZvciBiaW5kZXIKLQkgKi8KLQotCUJDX0FUVEVNUFRfQUNRVUlSRSA9IF9JT1coJ2MnLCAxMCwgc3RydWN0IGJpbmRlcl9wcmlfZGVzYyksCi0JLyoKLQkgKiBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqIGludDogcHJpb3JpdHkKLQkgKiBpbnQ6IGRlc2NyaXB0b3IKLQkgKi8KLQotCUJDX1JFR0lTVEVSX0xPT1BFUiA9IF9JTygnYycsIDExKSwKLQkvKgotCSAqIE5vIHBhcmFtZXRlcnMuCi0JICogUmVnaXN0ZXIgYSBzcGF3bmVkIGxvb3BlciB0aHJlYWQgd2l0aCB0aGUgZGV2aWNlLgotCSAqLwotCi0JQkNfRU5URVJfTE9PUEVSID0gX0lPKCdjJywgMTIpLAotCUJDX0VYSVRfTE9PUEVSID0gX0lPKCdjJywgMTMpLAotCS8qCi0JICogTm8gcGFyYW1ldGVycy4KLQkgKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIHNlbnQgYXMgYW4gYXBwbGljYXRpb24tbGV2ZWwgdGhyZWFkCi0JICogZW50ZXJzIGFuZCBleGl0cyB0aGUgYmluZGVyIGxvb3AsIHJlc3BlY3RpdmVseS4gIFRoZXkgYXJlCi0JICogdXNlZCBzbyB0aGUgYmluZGVyIGNhbiBoYXZlIGFuIGFjY3VyYXRlIGNvdW50IG9mIHRoZSBudW1iZXIKLQkgKiBvZiBsb29waW5nIHRocmVhZHMgaXQgaGFzIGF2YWlsYWJsZS4KLQkgKi8KLQotCUJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OID0gX0lPVygnYycsIDE0LCBzdHJ1Y3QgYmluZGVyX3B0cl9jb29raWUpLAotCS8qCi0JICogdm9pZCAqOiBwdHIgdG8gYmluZGVyCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLQotCUJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTiA9IF9JT1coJ2MnLCAxNSwgc3RydWN0IGJpbmRlcl9wdHJfY29va2llKSwKLQkvKgotCSAqIHZvaWQgKjogcHRyIHRvIGJpbmRlcgotCSAqIHZvaWQgKjogY29va2llCi0JICovCi0KLQlCQ19ERUFEX0JJTkRFUl9ET05FID0gX0lPVygnYycsIDE2LCB2b2lkICopLAotCS8qCi0JICogdm9pZCAqOiBjb29raWUKLQkgKi8KLX07Ci0KLSNlbmRpZiAvKiBfTElOVVhfQklOREVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMGI0NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb2dnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKgotICogZHJpdmVycy9taXNjL2xvZ2dlci5jCi0gKgotICogQSBMb2dnaW5nIFN1YnN5c3RlbQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFJvYmVydCBMb3ZlIDxybG92ZUBnb29nbGUuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgImxvZ2dlci5oIgotCi0jaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgotCi0vKgotICogc3RydWN0IGxvZ2dlcl9sb2cgLSByZXByZXNlbnRzIGEgc3BlY2lmaWMgbG9nLCBzdWNoIGFzICdtYWluJyBvciAncmFkaW8nCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgbGl2ZXMgZnJvbSBtb2R1bGUgaW5zZXJ0aW9uIHVudGlsIG1vZHVsZSByZW1vdmFsLCBzbyBpdCBkb2VzCi0gKiBub3QgbmVlZCBhZGRpdGlvbmFsIHJlZmVyZW5jZSBjb3VudGluZy4gVGhlIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlCi0gKiBtdXRleCAnbXV0ZXgnLgotICovCi1zdHJ1Y3QgbG9nZ2VyX2xvZyB7Ci0JdW5zaWduZWQgY2hhciAJCSpidWZmZXI7LyogdGhlIHJpbmcgYnVmZmVyIGl0c2VsZiAqLwotCXN0cnVjdCBtaXNjZGV2aWNlCW1pc2M7CS8qIG1pc2MgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgbG9nICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJd3E7CS8qIHdhaXQgcXVldWUgZm9yIHJlYWRlcnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXJlYWRlcnM7IC8qIHRoaXMgbG9nJ3MgcmVhZGVycyAqLwotCXN0cnVjdCBtdXRleAkJbXV0ZXg7CS8qIG11dGV4IHByb3RlY3RpbmcgYnVmZmVyICovCi0Jc2l6ZV90CQkJd19vZmY7CS8qIGN1cnJlbnQgd3JpdGUgaGVhZCBvZmZzZXQgKi8KLQlzaXplX3QJCQloZWFkOwkvKiBuZXcgcmVhZGVycyBzdGFydCBoZXJlICovCi0Jc2l6ZV90CQkJc2l6ZTsJLyogc2l6ZSBvZiB0aGUgbG9nICovCi19OwotCi0vKgotICogc3RydWN0IGxvZ2dlcl9yZWFkZXIgLSBhIGxvZ2dpbmcgZGV2aWNlIG9wZW4gZm9yIHJlYWRpbmcKLSAqCi0gKiBUaGlzIG9iamVjdCBsaXZlcyBmcm9tIG9wZW4gdG8gcmVsZWFzZSwgc28gd2UgZG9uJ3QgbmVlZCBhZGRpdGlvbmFsCi0gKiByZWZlcmVuY2UgY291bnRpbmcuIFRoZSBzdHJ1Y3R1cmUgaXMgcHJvdGVjdGVkIGJ5IGxvZy0+bXV0ZXguCi0gKi8KLXN0cnVjdCBsb2dnZXJfcmVhZGVyIHsKLQlzdHJ1Y3QgbG9nZ2VyX2xvZwkqbG9nOwkvKiBhc3NvY2lhdGVkIGxvZyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJLyogZW50cnkgaW4gbG9nZ2VyX2xvZydzIGxpc3QgKi8KLQlzaXplX3QJCQlyX29mZjsJLyogY3VycmVudCByZWFkIGhlYWQgb2Zmc2V0ICovCi19OwotCi0vKiBsb2dnZXJfb2Zmc2V0IC0gcmV0dXJucyBpbmRleCAnbicgaW50byB0aGUgbG9nIHZpYSAob3B0aW1pemVkKSBtb2R1bHVzICovCi0jZGVmaW5lIGxvZ2dlcl9vZmZzZXQobikJKChuKSAmIChsb2ctPnNpemUgLSAxKSkKLQotLyoKLSAqIGZpbGVfZ2V0X2xvZyAtIEdpdmVuIGEgZmlsZSBzdHJ1Y3R1cmUsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBsb2cKLSAqCi0gKiBUaGlzIGlzbid0IGFlc3RoZXRpYy4gV2UgaGF2ZSBzZXZlcmFsIGdvYWxzOgotICoKLSAqIAkxKSBOZWVkIHRvIHF1aWNrbHkgb2J0YWluIHRoZSBhc3NvY2lhdGVkIGxvZyBkdXJpbmcgYW4gSS9PIG9wZXJhdGlvbgotICogCTIpIFJlYWRlcnMgbmVlZCB0byBtYWludGFpbiBzdGF0ZSAobG9nZ2VyX3JlYWRlcikKLSAqIAkzKSBXcml0ZXJzIG5lZWQgdG8gYmUgdmVyeSBmYXN0IChvcGVuKCkgc2hvdWxkIGJlIGEgbmVhciBuby1vcCkKLSAqCi0gKiBJbiB0aGUgcmVhZGVyIGNhc2UsIHdlIGNhbiB0cml2aWFsbHkgZ28gZmlsZS0+bG9nZ2VyX3JlYWRlci0+bG9nZ2VyX2xvZy4KLSAqIEZvciBhIHdyaXRlciwgd2UgZG9uJ3Qgd2FudCB0byBtYWludGFpbiBhIGxvZ2dlcl9yZWFkZXIsIHNvIHdlIGp1c3QgZ28KLSAqIGZpbGUtPmxvZ2dlcl9sb2cuIFRodXMgd2hhdCBmaWxlLT5wcml2YXRlX2RhdGEgcG9pbnRzIGF0IGRlcGVuZHMgb24gd2hldGhlcgotICogb3Igbm90IHRoZSBmaWxlIHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFRoaXMgZnVuY3Rpb24gaGlkZXMgdGhhdCBkaXJ0aW5lc3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxvZ2dlcl9sb2cgKmZpbGVfZ2V0X2xvZyhzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQlzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCQlyZXR1cm4gcmVhZGVyLT5sb2c7Ci0JfSBlbHNlCi0JCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGE7Ci19Ci0KLS8qCi0gKiBnZXRfZW50cnlfbGVuIC0gR3JhYnMgdGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZCBvZiB0aGUgbmV4dCBlbnRyeSBzdGFydGluZwotICogZnJvbSAnb2ZmJy4KLSAqCi0gKiBDYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgotICovCi1zdGF0aWMgX191MzIgZ2V0X2VudHJ5X2xlbihzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nLCBzaXplX3Qgb2ZmKQotewotCV9fdTE2IHZhbDsKLQotCXN3aXRjaCAobG9nLT5zaXplIC0gb2ZmKSB7Ci0JY2FzZSAxOgotCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDEpOwotCQltZW1jcHkoKChjaGFyICopICZ2YWwpICsgMSwgbG9nLT5idWZmZXIsIDEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltZW1jcHkoJnZhbCwgbG9nLT5idWZmZXIgKyBvZmYsIDIpOwotCX0KLQotCXJldHVybiBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkgKyB2YWw7Ci19Ci0KLS8qCi0gKiBkb19yZWFkX2xvZ190b191c2VyIC0gcmVhZHMgZXhhY3RseSAnY291bnQnIGJ5dGVzIGZyb20gJ2xvZycgaW50byB0aGUKLSAqIHVzZXItc3BhY2UgYnVmZmVyICdidWYnLiBSZXR1cm5zICdjb3VudCcgb24gc3VjY2Vzcy4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGRvX3JlYWRfbG9nX3RvX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKLQkJCQkgICBzdHJ1Y3QgbG9nZ2VyX3JlYWRlciAqcmVhZGVyLAotCQkJCSAgIGNoYXIgX191c2VyICpidWYsCi0JCQkJICAgc2l6ZV90IGNvdW50KQotewotCXNpemVfdCBsZW47Ci0KLQkvKgotCSAqIFdlIHJlYWQgZnJvbSB0aGUgbG9nIGluIHR3byBkaXNqb2ludCBvcGVyYXRpb25zLiBGaXJzdCwgd2UgcmVhZCBmcm9tCi0JICogdGhlIGN1cnJlbnQgcmVhZCBoZWFkIG9mZnNldCB1cCB0byAnY291bnQnIGJ5dGVzIG9yIHRvIHRoZSBlbmQgb2YKLQkgKiB0aGUgbG9nLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0JICovCi0JbGVuID0gbWluKGNvdW50LCBsb2ctPnNpemUgLSByZWFkZXItPnJfb2ZmKTsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgbG9nLT5idWZmZXIgKyByZWFkZXItPnJfb2ZmLCBsZW4pKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qCi0JICogU2Vjb25kLCB3ZSByZWFkIGFueSByZW1haW5pbmcgYnl0ZXMsIHN0YXJ0aW5nIGJhY2sgYXQgdGhlIGhlYWQgb2YKLQkgKiB0aGUgbG9nLgotCSAqLwotCWlmIChjb3VudCAhPSBsZW4pCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmICsgbGVuLCBsb2ctPmJ1ZmZlciwgY291bnQgLSBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZWFkZXItPnJfb2ZmID0gbG9nZ2VyX29mZnNldChyZWFkZXItPnJfb2ZmICsgY291bnQpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogbG9nZ2VyX3JlYWQgLSBvdXIgbG9nJ3MgcmVhZCgpIG1ldGhvZAotICoKLSAqIEJlaGF2aW9yOgotICoKLSAqIAktIE9fTk9OQkxPQ0sgd29ya3MKLSAqIAktIElmIHRoZXJlIGFyZSBubyBsb2cgZW50cmllcyB0byByZWFkLCBibG9ja3MgdW50aWwgbG9nIGlzIHdyaXR0ZW4gdG8KLSAqIAktIEF0b21pY2FsbHkgcmVhZHMgZXhhY3RseSBvbmUgbG9nIGVudHJ5Ci0gKgotICogT3B0aW1hbCByZWFkIHNpemUgaXMgTE9HR0VSX0VOVFJZX01BWF9MRU4uIFdpbGwgc2V0IGVycm5vIHRvIEVJTlZBTCBpZiByZWFkCi0gKiBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIGhvbGQgbmV4dCBlbnRyeS4KLSAqLwotc3RhdGljIHNzaXplX3QgbG9nZ2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxvZ2dlcl9sb2cgKmxvZyA9IHJlYWRlci0+bG9nOwotCXNzaXplX3QgcmV0OwotCURFRklORV9XQUlUKHdhaXQpOwotCi1zdGFydDoKLQl3aGlsZSAoMSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJmxvZy0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwotCi0JCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCQlyZXQgPSAobG9nLT53X29mZiA9PSByZWFkZXItPnJfb2ZmKTsKLQkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKLQkJaWYgKCFyZXQpCi0JCQlicmVhazsKLQotCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0ID0gLUVJTlRSOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzY2hlZHVsZSgpOwotCX0KLQotCWZpbmlzaF93YWl0KCZsb2ctPndxLCAmd2FpdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCi0JLyogaXMgdGhlcmUgc3RpbGwgc29tZXRoaW5nIHRvIHJlYWQgb3IgZGlkIHdlIHJhY2U/ICovCi0JaWYgKHVubGlrZWx5KGxvZy0+d19vZmYgPT0gcmVhZGVyLT5yX29mZikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZsb2ctPm11dGV4KTsKLQkJZ290byBzdGFydDsKLQl9Ci0KLQkvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG5leHQgZW50cnkgKi8KLQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7Ci0JaWYgKGNvdW50IDwgcmV0KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGdldCBleGFjdGx5IG9uZSBlbnRyeSBmcm9tIHRoZSBsb2cgKi8KLQlyZXQgPSBkb19yZWFkX2xvZ190b191c2VyKGxvZywgcmVhZGVyLCBidWYsIHJldCk7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGdldF9uZXh0X2VudHJ5IC0gcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHZhbGlkIGVudHJ5IGF0IGxlYXN0ICdsZW4nCi0gKiBieXRlcyBhZnRlciAnb2ZmJy4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGxvZy0+bXV0ZXguCi0gKi8KLXN0YXRpYyBzaXplX3QgZ2V0X25leHRfZW50cnkoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IG9mZiwgc2l6ZV90IGxlbikKLXsKLQlzaXplX3QgY291bnQgPSAwOwotCi0JZG8gewotCQlzaXplX3QgbnIgPSBnZXRfZW50cnlfbGVuKGxvZywgb2ZmKTsKLQkJb2ZmID0gbG9nZ2VyX29mZnNldChvZmYgKyBucik7Ci0JCWNvdW50ICs9IG5yOwotCX0gd2hpbGUgKGNvdW50IDwgbGVuKTsKLQotCXJldHVybiBvZmY7Ci19Ci0KLS8qCi0gKiBjbG9ja19pbnRlcnZhbCAtIGlzIGEgPCBjIDwgYiBpbiBtb2Qtc3BhY2U/IFB1dCBhbm90aGVyIHdheSwgZG9lcyB0aGUgbGluZQotICogZnJvbSBhIHRvIGIgY3Jvc3MgYz8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2xvY2tfaW50ZXJ2YWwoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QgYykKLXsKLQlpZiAoYiA8IGEpIHsKLQkJaWYgKGEgPCBjIHx8IGIgPj0gYykKLQkJCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCWlmIChhIDwgYyAmJiBiID49IGMpCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGZpeF91cF9yZWFkZXJzIC0gd2FsayB0aGUgbGlzdCBvZiBhbGwgcmVhZGVycyBhbmQgImZpeCB1cCIgYW55IHdobyB3ZXJlCi0gKiBsYXBwZWQgYnkgdGhlIHdyaXRlcjsgYWxzbyBkbyB0aGUgc2FtZSBmb3IgdGhlIGRlZmF1bHQgInN0YXJ0IGhlYWQiLgotICogV2UgZG8gdGhpcyBieSAicHVsbGluZyBmb3J3YXJkIiB0aGUgcmVhZGVycyBhbmQgc3RhcnQgaGVhZCB0byB0aGUgZmlyc3QKLSAqIGVudHJ5IGFmdGVyIHRoZSBuZXcgd3JpdGUgaGVhZC4KLSAqCi0gKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KLSAqLwotc3RhdGljIHZvaWQgZml4X3VwX3JlYWRlcnMoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywgc2l6ZV90IGxlbikKLXsKLQlzaXplX3Qgb2xkID0gbG9nLT53X29mZjsKLQlzaXplX3QgbmV3ID0gbG9nZ2VyX29mZnNldChvbGQgKyBsZW4pOwotCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7Ci0KLQlpZiAoY2xvY2tfaW50ZXJ2YWwob2xkLCBuZXcsIGxvZy0+aGVhZCkpCi0JCWxvZy0+aGVhZCA9IGdldF9uZXh0X2VudHJ5KGxvZywgbG9nLT5oZWFkLCBsZW4pOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWFkZXIsICZsb2ctPnJlYWRlcnMsIGxpc3QpCi0JCWlmIChjbG9ja19pbnRlcnZhbChvbGQsIG5ldywgcmVhZGVyLT5yX29mZikpCi0JCQlyZWFkZXItPnJfb2ZmID0gZ2V0X25leHRfZW50cnkobG9nLCByZWFkZXItPnJfb2ZmLCBsZW4pOwotfQotCi0vKgotICogZG9fd3JpdGVfbG9nIC0gd3JpdGVzICdsZW4nIGJ5dGVzIGZyb20gJ2J1ZicgdG8gJ2xvZycKLSAqCi0gKiBUaGUgY2FsbGVyIG5lZWRzIHRvIGhvbGQgbG9nLT5tdXRleC4KLSAqLwotc3RhdGljIHZvaWQgZG9fd3JpdGVfbG9nKHN0cnVjdCBsb2dnZXJfbG9nICpsb2csIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBtaW4oY291bnQsIGxvZy0+c2l6ZSAtIGxvZy0+d19vZmYpOwotCW1lbWNweShsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKTsKLQotCWlmIChjb3VudCAhPSBsZW4pCi0JCW1lbWNweShsb2ctPmJ1ZmZlciwgYnVmICsgbGVuLCBjb3VudCAtIGxlbik7Ci0KLQlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOwotCi19Ci0KLS8qCi0gKiBkb193cml0ZV9sb2dfdXNlciAtIHdyaXRlcyAnbGVuJyBieXRlcyBmcm9tIHRoZSB1c2VyLXNwYWNlIGJ1ZmZlciAnYnVmJyB0bwotICogdGhlIGxvZyAnbG9nJwotICoKLSAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gaG9sZCBsb2ctPm11dGV4LgotICoKLSAqIFJldHVybnMgJ2NvdW50JyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIoc3RydWN0IGxvZ2dlcl9sb2cgKmxvZywKLQkJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc2l6ZV90IGxlbjsKLQotCWxlbiA9IG1pbihjb3VudCwgbG9nLT5zaXplIC0gbG9nLT53X29mZik7Ci0JaWYgKGxlbiAmJiBjb3B5X2Zyb21fdXNlcihsb2ctPmJ1ZmZlciArIGxvZy0+d19vZmYsIGJ1ZiwgbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoY291bnQgIT0gbGVuKQotCQlpZiAoY29weV9mcm9tX3VzZXIobG9nLT5idWZmZXIsIGJ1ZiArIGxlbiwgY291bnQgLSBsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlsb2ctPndfb2ZmID0gbG9nZ2VyX29mZnNldChsb2ctPndfb2ZmICsgY291bnQpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKgotICogbG9nZ2VyX2Fpb193cml0ZSAtIG91ciB3cml0ZSBtZXRob2QsIGltcGxlbWVudGluZyBzdXBwb3J0IGZvciB3cml0ZSgpLAotICogd3JpdGV2KCksIGFuZCBhaW9fd3JpdGUoKS4gV3JpdGVzIGFyZSBvdXIgZmFzdCBwYXRoLCBhbmQgd2UgdHJ5IHRvIG9wdGltaXplCi0gKiB0aGVtIGFib3ZlIGFsbCBlbHNlLgotICovCi1zc2l6ZV90IGxvZ2dlcl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwcG9zKQotewotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coaW9jYi0+a2lfZmlscCk7Ci0Jc2l6ZV90IG9yaWcgPSBsb2ctPndfb2ZmOwotCXN0cnVjdCBsb2dnZXJfZW50cnkgaGVhZGVyOwotCXN0cnVjdCB0aW1lc3BlYyBub3c7Ci0Jc3NpemVfdCByZXQgPSAwOwotCi0Jbm93ID0gY3VycmVudF9rZXJuZWxfdGltZSgpOwotCi0JaGVhZGVyLnBpZCA9IGN1cnJlbnQtPnRnaWQ7Ci0JaGVhZGVyLnRpZCA9IGN1cnJlbnQtPnBpZDsKLQloZWFkZXIuc2VjID0gbm93LnR2X3NlYzsKLQloZWFkZXIubnNlYyA9IG5vdy50dl9uc2VjOwotCWhlYWRlci5sZW4gPSBtaW5fdChzaXplX3QsIGlvY2ItPmtpX2xlZnQsIExPR0dFUl9FTlRSWV9NQVhfUEFZTE9BRCk7Ci0KLQkvKiBudWxsIHdyaXRlcyBzdWNjZWVkLCByZXR1cm4gemVybyAqLwotCWlmICh1bmxpa2VseSghaGVhZGVyLmxlbikpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0KLQkvKgotCSAqIEZpeCB1cCBhbnkgcmVhZGVycywgcHVsbGluZyB0aGVtIGZvcndhcmQgdG8gdGhlIGZpcnN0IHJlYWRhYmxlCi0JICogZW50cnkgYWZ0ZXIgKHdoYXQgd2lsbCBiZSkgdGhlIG5ldyB3cml0ZSBvZmZzZXQuIFdlIGRvIHRoaXMgbm93Ci0JICogYmVjYXVzZSBpZiB3ZSBwYXJ0aWFsbHkgZmFpbCwgd2UgY2FuIGVuZCB1cCB3aXRoIGNsb2JiZXJlZCBsb2cKLQkgKiBlbnRyaWVzIHRoYXQgZW5jcm9hY2ggb24gcmVhZGFibGUgYnVmZmVyLgotCSAqLwotCWZpeF91cF9yZWFkZXJzKGxvZywgc2l6ZW9mKHN0cnVjdCBsb2dnZXJfZW50cnkpICsgaGVhZGVyLmxlbik7Ci0KLQlkb193cml0ZV9sb2cobG9nLCAmaGVhZGVyLCBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpOwotCi0Jd2hpbGUgKG5yX3NlZ3MtLSA+IDApIHsKLQkJc2l6ZV90IGxlbjsKLQkJc3NpemVfdCBucjsKLQotCQkvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIG9mIHRoaXMgdmVjdG9yIHdlIGNhbiBrZWVwICovCi0JCWxlbiA9IG1pbl90KHNpemVfdCwgaW92LT5pb3ZfbGVuLCBoZWFkZXIubGVuIC0gcmV0KTsKLQotCQkvKiB3cml0ZSBvdXQgdGhpcyBzZWdtZW50J3MgcGF5bG9hZCAqLwotCQluciA9IGRvX3dyaXRlX2xvZ19mcm9tX3VzZXIobG9nLCBpb3YtPmlvdl9iYXNlLCBsZW4pOwotCQlpZiAodW5saWtlbHkobnIgPCAwKSkgewotCQkJbG9nLT53X29mZiA9IG9yaWc7Ci0JCQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCQkJcmV0dXJuIG5yOwotCQl9Ci0KLQkJaW92Kys7Ci0JCXJldCArPSBucjsKLQl9Ci0KLQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCi0JLyogd2FrZSB1cCBhbnkgYmxvY2tlZCByZWFkZXJzICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2ctPndxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqZ2V0X2xvZ19mcm9tX21pbm9yKGludCk7Ci0KLS8qCi0gKiBsb2dnZXJfb3BlbiAtIHRoZSBsb2cncyBvcGVuKCkgZmlsZSBvcGVyYXRpb24KLSAqCi0gKiBOb3RlIGhvdyBuZWFyIGEgbm8tb3AgdGhpcyBpcyBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQotICovCi1zdGF0aWMgaW50IGxvZ2dlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2c7Ci0JaW50IHJldDsKLQotCXJldCA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlsb2cgPSBnZXRfbG9nX2Zyb21fbWlub3IoTUlOT1IoaW5vZGUtPmlfcmRldikpOwotCWlmICghbG9nKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCXN0cnVjdCBsb2dnZXJfcmVhZGVyICpyZWFkZXI7Ci0KLQkJcmVhZGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxvZ2dlcl9yZWFkZXIpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyZWFkZXIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyZWFkZXItPmxvZyA9IGxvZzsKLQkJSU5JVF9MSVNUX0hFQUQoJnJlYWRlci0+bGlzdCk7Ci0KLQkJbXV0ZXhfbG9jaygmbG9nLT5tdXRleCk7Ci0JCXJlYWRlci0+cl9vZmYgPSBsb2ctPmhlYWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJnJlYWRlci0+bGlzdCwgJmxvZy0+cmVhZGVycyk7Ci0JCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmVhZGVyOwotCX0gZWxzZQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBsb2c7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGxvZ2dlcl9yZWxlYXNlIC0gdGhlIGxvZydzIHJlbGVhc2UgZmlsZSBvcGVyYXRpb24KLSAqCi0gKiBOb3RlIHRoaXMgaXMgYSB0b3RhbCBuby1vcCBpbiB0aGUgd3JpdGUtb25seSBjYXNlLiBLZWVwIGl0IHRoYXQgd2F5IQotICovCi1zdGF0aWMgaW50IGxvZ2dlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaWdub3JlZCwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJbGlzdF9kZWwoJnJlYWRlci0+bGlzdCk7Ci0JCWtmcmVlKHJlYWRlcik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBsb2dnZXJfcG9sbCAtIHRoZSBsb2cncyBwb2xsIGZpbGUgb3BlcmF0aW9uLCBmb3IgcG9sbC9zZWxlY3QvZXBvbGwKLSAqCi0gKiBOb3RlIHdlIGFsd2F5cyByZXR1cm4gUE9MTE9VVCwgYmVjYXVzZSB5b3UgY2FuIGFsd2F5cyB3cml0ZSgpIHRvIHRoZSBsb2cuCi0gKiBOb3RlIGFsc28gdGhhdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGEgcmV0dXJuIHZhbHVlIG9mIFBPTExJTiBkb2VzIG5vdAotICogZ3VhcmFudGVlIHRoYXQgdGhlIGxvZyBpcyByZWFkYWJsZSB3aXRob3V0IGJsb2NraW5nLCBhcyB0aGVyZSBpcyBhIHNtYWxsCi0gKiBjaGFuY2UgdGhhdCB0aGUgd3JpdGVyIGNhbiBsYXAgdGhlIHJlYWRlciBpbiB0aGUgaW50ZXJpbSBiZXR3ZWVuIHBvbGwoKQotICogcmV0dXJuaW5nIGFuZCB0aGUgcmVhZCgpIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbG9nZ2VyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0Jc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQlzdHJ1Y3QgbG9nZ2VyX2xvZyAqbG9nOwotCXVuc2lnbmVkIGludCByZXQgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQotCQlyZXR1cm4gcmV0OwotCi0JcmVhZGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWxvZyA9IHJlYWRlci0+bG9nOwotCi0JcG9sbF93YWl0KGZpbGUsICZsb2ctPndxLCB3YWl0KTsKLQotCW11dGV4X2xvY2soJmxvZy0+bXV0ZXgpOwotCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCi0JCXJldCB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCW11dGV4X3VubG9jaygmbG9nLT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgbG9uZyBsb2dnZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBsb2dnZXJfbG9nICpsb2cgPSBmaWxlX2dldF9sb2coZmlsZSk7Ci0Jc3RydWN0IGxvZ2dlcl9yZWFkZXIgKnJlYWRlcjsKLQlsb25nIHJldCA9IC1FTk9UVFk7Ci0KLQltdXRleF9sb2NrKCZsb2ctPm11dGV4KTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBMT0dHRVJfR0VUX0xPR19CVUZfU0laRToKLQkJcmV0ID0gbG9nLT5zaXplOwotCQlicmVhazsKLQljYXNlIExPR0dFUl9HRVRfTE9HX0xFTjoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpIHsKLQkJCXJldCA9IC1FQkFERjsKLQkJCWJyZWFrOwotCQl9Ci0JCXJlYWRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJaWYgKGxvZy0+d19vZmYgPj0gcmVhZGVyLT5yX29mZikKLQkJCXJldCA9IGxvZy0+d19vZmYgLSByZWFkZXItPnJfb2ZmOwotCQllbHNlCi0JCQlyZXQgPSAobG9nLT5zaXplIC0gcmVhZGVyLT5yX29mZikgKyBsb2ctPndfb2ZmOwotCQlicmVhazsKLQljYXNlIExPR0dFUl9HRVRfTkVYVF9FTlRSWV9MRU46Ci0JCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7Ci0JCQlyZXQgPSAtRUJBREY7Ci0JCQlicmVhazsKLQkJfQotCQlyZWFkZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCWlmIChsb2ctPndfb2ZmICE9IHJlYWRlci0+cl9vZmYpCi0JCQlyZXQgPSBnZXRfZW50cnlfbGVuKGxvZywgcmVhZGVyLT5yX29mZik7Ci0JCWVsc2UKLQkJCXJldCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgTE9HR0VSX0ZMVVNIX0xPRzoKLQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7Ci0JCQlyZXQgPSAtRUJBREY7Ci0JCQlicmVhazsKLQkJfQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlYWRlciwgJmxvZy0+cmVhZGVycywgbGlzdCkKLQkJCXJlYWRlci0+cl9vZmYgPSBsb2ctPndfb2ZmOwotCQlsb2ctPmhlYWQgPSBsb2ctPndfb2ZmOwotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soJmxvZy0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG9nZ2VyX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLnJlYWQgPSBsb2dnZXJfcmVhZCwKLQkuYWlvX3dyaXRlID0gbG9nZ2VyX2Fpb193cml0ZSwKLQkucG9sbCA9IGxvZ2dlcl9wb2xsLAotCS51bmxvY2tlZF9pb2N0bCA9IGxvZ2dlcl9pb2N0bCwKLQkuY29tcGF0X2lvY3RsID0gbG9nZ2VyX2lvY3RsLAotCS5vcGVuID0gbG9nZ2VyX29wZW4sCi0JLnJlbGVhc2UgPSBsb2dnZXJfcmVsZWFzZSwKLX07Ci0KLS8qCi0gKiBEZWZpbmVzIGEgbG9nIHN0cnVjdHVyZSB3aXRoIG5hbWUgJ05BTUUnIGFuZCBhIHNpemUgb2YgJ1NJWkUnIGJ5dGVzLCB3aGljaAotICogbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgZ3JlYXRlciB0aGFuIExPR0dFUl9FTlRSWV9NQVhfTEVOLCBhbmQgbGVzcyB0aGFuCi0gKiBMT05HX01BWCBtaW51cyBMT0dHRVJfRU5UUllfTUFYX0xFTi4KLSAqLwotI2RlZmluZSBERUZJTkVfTE9HR0VSX0RFVklDRShWQVIsIE5BTUUsIFNJWkUpIFwKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIF9idWZfICMjIFZBUltTSVpFXTsgXAotc3RhdGljIHN0cnVjdCBsb2dnZXJfbG9nIFZBUiA9IHsgXAotCS5idWZmZXIgPSBfYnVmXyAjIyBWQVIsIFwKLQkubWlzYyA9IHsgXAotCQkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsIFwKLQkJLm5hbWUgPSBOQU1FLCBcCi0JCS5mb3BzID0gJmxvZ2dlcl9mb3BzLCBcCi0JCS5wYXJlbnQgPSBOVUxMLCBcCi0JfSwgXAotCS53cSA9IF9fV0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKFZBUiAud3EpLCBcCi0JLnJlYWRlcnMgPSBMSVNUX0hFQURfSU5JVChWQVIgLnJlYWRlcnMpLCBcCi0JLm11dGV4ID0gX19NVVRFWF9JTklUSUFMSVpFUihWQVIgLm11dGV4KSwgXAotCS53X29mZiA9IDAsIFwKLQkuaGVhZCA9IDAsIFwKLQkuc2l6ZSA9IFNJWkUsIFwKLX07Ci0KLURFRklORV9MT0dHRVJfREVWSUNFKGxvZ19tYWluLCBMT0dHRVJfTE9HX01BSU4sIDY0KjEwMjQpCi1ERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfZXZlbnRzLCBMT0dHRVJfTE9HX0VWRU5UUywgMjU2KjEwMjQpCi1ERUZJTkVfTE9HR0VSX0RFVklDRShsb2dfcmFkaW8sIExPR0dFUl9MT0dfUkFESU8sIDY0KjEwMjQpCi0KLXN0YXRpYyBzdHJ1Y3QgbG9nZ2VyX2xvZyAqZ2V0X2xvZ19mcm9tX21pbm9yKGludCBtaW5vcikKLXsKLQlpZiAobG9nX21haW4ubWlzYy5taW5vciA9PSBtaW5vcikKLQkJcmV0dXJuICZsb2dfbWFpbjsKLQlpZiAobG9nX2V2ZW50cy5taXNjLm1pbm9yID09IG1pbm9yKQotCQlyZXR1cm4gJmxvZ19ldmVudHM7Ci0JaWYgKGxvZ19yYWRpby5taXNjLm1pbm9yID09IG1pbm9yKQotCQlyZXR1cm4gJmxvZ19yYWRpbzsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9sb2coc3RydWN0IGxvZ2dlcl9sb2cgKmxvZykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmbG9nLT5taXNjKTsKLQlpZiAodW5saWtlbHkocmV0KSkgewotCQlwcmludGsoS0VSTl9FUlIgImxvZ2dlcjogZmFpbGVkIHRvIHJlZ2lzdGVyIG1pc2MgIgotCQkgICAgICAgImRldmljZSBmb3IgbG9nICclcychXG4iLCBsb2ctPm1pc2MubmFtZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAibG9nZ2VyOiBjcmVhdGVkICVsdUsgbG9nICclcydcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBsb2ctPnNpemUgPj4gMTAsIGxvZy0+bWlzYy5uYW1lKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBsb2dnZXJfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBpbml0X2xvZygmbG9nX21haW4pOwotCWlmICh1bmxpa2VseShyZXQpKQotCQlnb3RvIG91dDsKLQotCXJldCA9IGluaXRfbG9nKCZsb2dfZXZlbnRzKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBpbml0X2xvZygmbG9nX3JhZGlvKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJZ290byBvdXQ7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotZGV2aWNlX2luaXRjYWxsKGxvZ2dlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvZ2dlci5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NjI0MzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG9nZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBpbmNsdWRlL2xpbnV4L2xvZ2dlci5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IFJvYmVydCBMb3ZlIDxybG92ZUBhbmRyb2lkLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9MT0dHRVJfSAotI2RlZmluZSBfTElOVVhfTE9HR0VSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLQotc3RydWN0IGxvZ2dlcl9lbnRyeSB7Ci0JX191MTYJCWxlbjsJLyogbGVuZ3RoIG9mIHRoZSBwYXlsb2FkICovCi0JX191MTYJCV9fcGFkOwkvKiBubyBtYXR0ZXIgd2hhdCwgd2UgZ2V0IDIgYnl0ZXMgb2YgcGFkZGluZyAqLwotCV9fczMyCQlwaWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHBpZCAqLwotCV9fczMyCQl0aWQ7CS8qIGdlbmVyYXRpbmcgcHJvY2VzcydzIHRpZCAqLwotCV9fczMyCQlzZWM7CS8qIHNlY29uZHMgc2luY2UgRXBvY2ggKi8KLQlfX3MzMgkJbnNlYzsJLyogbmFub3NlY29uZHMgKi8KLQljaGFyCQltc2dbMF07CS8qIHRoZSBlbnRyeSdzIHBheWxvYWQgKi8KLX07Ci0KLSNkZWZpbmUgTE9HR0VSX0xPR19SQURJTwkibG9nX3JhZGlvIgkvKiByYWRpby1yZWxhdGVkIG1lc3NhZ2VzICovCi0jZGVmaW5lIExPR0dFUl9MT0dfRVZFTlRTCSJsb2dfZXZlbnRzIgkvKiBzeXN0ZW0vaGFyZHdhcmUgZXZlbnRzICovCi0jZGVmaW5lIExPR0dFUl9MT0dfTUFJTgkJImxvZ19tYWluIgkvKiBldmVyeXRoaW5nIGVsc2UgKi8KLQotI2RlZmluZSBMT0dHRVJfRU5UUllfTUFYX0xFTgkJKDQqMTAyNCkKLSNkZWZpbmUgTE9HR0VSX0VOVFJZX01BWF9QQVlMT0FECVwKLQkoTE9HR0VSX0VOVFJZX01BWF9MRU4gLSBzaXplb2Yoc3RydWN0IGxvZ2dlcl9lbnRyeSkpCi0KLSNkZWZpbmUgX19MT0dHRVJJTwkweEFFCi0KLSNkZWZpbmUgTE9HR0VSX0dFVF9MT0dfQlVGX1NJWkUJCV9JTyhfX0xPR0dFUklPLCAxKSAvKiBzaXplIG9mIGxvZyAqLwotI2RlZmluZSBMT0dHRVJfR0VUX0xPR19MRU4JCV9JTyhfX0xPR0dFUklPLCAyKSAvKiB1c2VkIGxvZyBsZW4gKi8KLSNkZWZpbmUgTE9HR0VSX0dFVF9ORVhUX0VOVFJZX0xFTglfSU8oX19MT0dHRVJJTywgMykgLyogbmV4dCBlbnRyeSBsZW4gKi8KLSNkZWZpbmUgTE9HR0VSX0ZMVVNIX0xPRwkJX0lPKF9fTE9HR0VSSU8sIDQpIC8qIGZsdXNoIGxvZyAqLwotCi0jZW5kaWYgLyogX0xJTlVYX0xPR0dFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9sb3dtZW1vcnlraWxsZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzVkMjgxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qIGRyaXZlcnMvbWlzYy9sb3dtZW1vcnlraWxsZXIuYwotICoKLSAqIFRoZSBsb3dtZW1vcnlraWxsZXIgZHJpdmVyIGxldHMgdXNlci1zcGFjZSBzcGVjaWZ5IGEgc2V0IG9mIG1lbW9yeSB0aHJlc2hvbGRzCi0gKiB3aGVyZSBwcm9jZXNzZXMgd2l0aCBhIHJhbmdlIG9mIG9vbV9hZGogdmFsdWVzIHdpbGwgZ2V0IGtpbGxlZC4gU3BlY2lmeSB0aGUKLSAqIG1pbmltdW0gb29tX2FkaiB2YWx1ZXMgaW4gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvYWRqIGFuZCB0aGUKLSAqIG51bWJlciBvZiBmcmVlIHBhZ2VzIGluIC9zeXMvbW9kdWxlL2xvd21lbW9yeWtpbGxlci9wYXJhbWV0ZXJzL21pbmZyZWUuIEJvdGgKLSAqIGZpbGVzIHRha2UgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBudW1iZXJzIGluIGFzY2VuZGluZyBvcmRlci4KLSAqCi0gKiBGb3IgZXhhbXBsZSwgd3JpdGUgIjAsOCIgdG8gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvYWRqIGFuZAotICogIjEwMjQsNDA5NiIgdG8gL3N5cy9tb2R1bGUvbG93bWVtb3J5a2lsbGVyL3BhcmFtZXRlcnMvbWluZnJlZSB0byBraWxsIHByb2Nlc3NlcwotICogd2l0aCBhIG9vbV9hZGogdmFsdWUgb2YgOCBvciBoaWdoZXIgd2hlbiB0aGUgZnJlZSBtZW1vcnkgZHJvcHMgYmVsb3cgNDA5NiBwYWdlcwotICogYW5kIGtpbGwgcHJvY2Vzc2VzIHdpdGggYSBvb21fYWRqIHZhbHVlIG9mIDAgb3IgaGlnaGVyIHdoZW4gdGhlIGZyZWUgbWVtb3J5Ci0gKiBkcm9wcyBiZWxvdyAxMDI0IHBhZ2VzLgotICoKLSAqIFRoZSBkcml2ZXIgY29uc2lkZXJzIG1lbW9yeSB1c2VkIGZvciBjYWNoZXMgdG8gYmUgZnJlZSwgYnV0IGlmIGEgbGFyZ2UKLSAqIHBlcmNlbnRhZ2Ugb2YgdGhlIGNhY2hlZCBtZW1vcnkgaXMgbG9ja2VkIHRoaXMgY2FuIGJlIHZlcnkgaW5hY2N1cmF0ZQotICogYW5kIHByb2Nlc3NlcyBtYXkgbm90IGdldCBraWxsZWQgdW50aWwgdGhlIG5vcm1hbCBvb20ga2lsbGVyIGlzIHRyaWdnZXJlZC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9vb20uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi1zdGF0aWMgdWludDMyX3QgbG93bWVtX2RlYnVnX2xldmVsID0gMjsKLXN0YXRpYyBpbnQgbG93bWVtX2Fkals2XSA9IHsKLQkwLAotCTEsCi0JNiwKLQkxMiwKLX07Ci1zdGF0aWMgaW50IGxvd21lbV9hZGpfc2l6ZSA9IDQ7Ci1zdGF0aWMgc2l6ZV90IGxvd21lbV9taW5mcmVlWzZdID0gewotCTMgKiA1MTIsCS8qIDZNQiAqLwotCTIgKiAxMDI0LAkvKiA4TUIgKi8KLQk0ICogMTAyNCwJLyogMTZNQiAqLwotCTE2ICogMTAyNCwJLyogNjRNQiAqLwotfTsKLXN0YXRpYyBpbnQgbG93bWVtX21pbmZyZWVfc2l6ZSA9IDQ7Ci0KLSNkZWZpbmUgbG93bWVtX3ByaW50KGxldmVsLCB4Li4uKQkJCVwKLQlkbyB7CQkJCQkJXAotCQlpZiAobG93bWVtX2RlYnVnX2xldmVsID49IChsZXZlbCkpCVwKLQkJCXByaW50ayh4KTsJCQlcCi0JfSB3aGlsZSAoMCkKLQotc3RhdGljIGludCBsb3dtZW1fc2hyaW5rKGludCBucl90b19zY2FuLCBnZnBfdCBnZnBfbWFzaykKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpzZWxlY3RlZCA9IE5VTEw7Ci0JaW50IHJlbSA9IDA7Ci0JaW50IHRhc2tzaXplOwotCWludCBpOwotCWludCBtaW5fYWRqID0gT09NX0FESlVTVF9NQVggKyAxOwotCWludCBzZWxlY3RlZF90YXNrc2l6ZSA9IDA7Ci0JaW50IHNlbGVjdGVkX29vbV9hZGo7Ci0JaW50IGFycmF5X3NpemUgPSBBUlJBWV9TSVpFKGxvd21lbV9hZGopOwotCWludCBvdGhlcl9mcmVlID0gZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRlJFRV9QQUdFUyk7Ci0JaW50IG90aGVyX2ZpbGUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX1BBR0VTKTsKLQotCWlmIChsb3dtZW1fYWRqX3NpemUgPCBhcnJheV9zaXplKQotCQlhcnJheV9zaXplID0gbG93bWVtX2Fkal9zaXplOwotCWlmIChsb3dtZW1fbWluZnJlZV9zaXplIDwgYXJyYXlfc2l6ZSkKLQkJYXJyYXlfc2l6ZSA9IGxvd21lbV9taW5mcmVlX3NpemU7Ci0JZm9yIChpID0gMDsgaSA8IGFycmF5X3NpemU7IGkrKykgewotCQlpZiAob3RoZXJfZnJlZSA8IGxvd21lbV9taW5mcmVlW2ldICYmCi0JCSAgICBvdGhlcl9maWxlIDwgbG93bWVtX21pbmZyZWVbaV0pIHsKLQkJCW1pbl9hZGogPSBsb3dtZW1fYWRqW2ldOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG5yX3RvX3NjYW4gPiAwKQotCQlsb3dtZW1fcHJpbnQoMywgImxvd21lbV9zaHJpbmsgJWQsICV4LCBvZnJlZSAlZCAlZCwgbWEgJWRcbiIsCi0JCQkgICAgIG5yX3RvX3NjYW4sIGdmcF9tYXNrLCBvdGhlcl9mcmVlLCBvdGhlcl9maWxlLAotCQkJICAgICBtaW5fYWRqKTsKLQlyZW0gPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9BQ1RJVkVfQU5PTikgKwotCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9BQ1RJVkVfRklMRSkgKwotCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9JTkFDVElWRV9BTk9OKSArCi0JCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0lOQUNUSVZFX0ZJTEUpOwotCWlmIChucl90b19zY2FuIDw9IDAgfHwgbWluX2FkaiA9PSBPT01fQURKVVNUX01BWCArIDEpIHsKLQkJbG93bWVtX3ByaW50KDUsICJsb3dtZW1fc2hyaW5rICVkLCAleCwgcmV0dXJuICVkXG4iLAotCQkJICAgICBucl90b19zY2FuLCBnZnBfbWFzaywgcmVtKTsKLQkJcmV0dXJuIHJlbTsKLQl9Ci0Jc2VsZWN0ZWRfb29tX2FkaiA9IG1pbl9hZGo7Ci0KLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCWZvcl9lYWNoX3Byb2Nlc3MocCkgewotCQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKLQkJaW50IG9vbV9hZGo7Ci0KLQkJdGFza19sb2NrKHApOwotCQltbSA9IHAtPm1tOwotCQlpZiAoIW1tKSB7Ci0JCQl0YXNrX3VubG9jayhwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCW9vbV9hZGogPSBtbS0+b29tX2FkajsKLQkJaWYgKG9vbV9hZGogPCBtaW5fYWRqKSB7Ci0JCQl0YXNrX3VubG9jayhwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXRhc2tzaXplID0gZ2V0X21tX3JzcyhtbSk7Ci0JCXRhc2tfdW5sb2NrKHApOwotCQlpZiAodGFza3NpemUgPD0gMCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChvb21fYWRqIDwgc2VsZWN0ZWRfb29tX2FkaikKLQkJCQljb250aW51ZTsKLQkJCWlmIChvb21fYWRqID09IHNlbGVjdGVkX29vbV9hZGogJiYKLQkJCSAgICB0YXNrc2l6ZSA8PSBzZWxlY3RlZF90YXNrc2l6ZSkKLQkJCQljb250aW51ZTsKLQkJfQotCQlzZWxlY3RlZCA9IHA7Ci0JCXNlbGVjdGVkX3Rhc2tzaXplID0gdGFza3NpemU7Ci0JCXNlbGVjdGVkX29vbV9hZGogPSBvb21fYWRqOwotCQlsb3dtZW1fcHJpbnQoMiwgInNlbGVjdCAlZCAoJXMpLCBhZGogJWQsIHNpemUgJWQsIHRvIGtpbGxcbiIsCi0JCQkgICAgIHAtPnBpZCwgcC0+Y29tbSwgb29tX2FkaiwgdGFza3NpemUpOwotCX0KLQlpZiAoc2VsZWN0ZWQpIHsKLQkJbG93bWVtX3ByaW50KDEsICJzZW5kIHNpZ2tpbGwgdG8gJWQgKCVzKSwgYWRqICVkLCBzaXplICVkXG4iLAotCQkJICAgICBzZWxlY3RlZC0+cGlkLCBzZWxlY3RlZC0+Y29tbSwKLQkJCSAgICAgc2VsZWN0ZWRfb29tX2Fkaiwgc2VsZWN0ZWRfdGFza3NpemUpOwotCQlmb3JjZV9zaWcoU0lHS0lMTCwgc2VsZWN0ZWQpOwotCQlyZW0gLT0gc2VsZWN0ZWRfdGFza3NpemU7Ci0JfQotCWxvd21lbV9wcmludCg0LCAibG93bWVtX3NocmluayAlZCwgJXgsIHJldHVybiAlZFxuIiwKLQkJICAgICBucl90b19zY2FuLCBnZnBfbWFzaywgcmVtKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJlbTsKLX0KLQotc3RhdGljIHN0cnVjdCBzaHJpbmtlciBsb3dtZW1fc2hyaW5rZXIgPSB7Ci0JLnNocmluayA9IGxvd21lbV9zaHJpbmssCi0JLnNlZWtzID0gREVGQVVMVF9TRUVLUyAqIDE2Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBsb3dtZW1faW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbG93bWVtX2V4aXQodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX3Nocmlua2VyKCZsb3dtZW1fc2hyaW5rZXIpOwotfQotCi1tb2R1bGVfcGFyYW1fbmFtZWQoY29zdCwgbG93bWVtX3Nocmlua2VyLnNlZWtzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChhZGosIGxvd21lbV9hZGosIGludCwgJmxvd21lbV9hZGpfc2l6ZSwKLQkJCSBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQobWluZnJlZSwgbG93bWVtX21pbmZyZWUsIHVpbnQsICZsb3dtZW1fbWluZnJlZV9zaXplLAotCQkJIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbG93bWVtX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci0KLW1vZHVsZV9pbml0KGxvd21lbV9pbml0KTsKLW1vZHVsZV9leGl0KGxvd21lbV9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvcmFtX2NvbnNvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxOGE1OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9yYW1fY29uc29sZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qIGRyaXZlcnMvYW5kcm9pZC9yYW1fY29uc29sZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotI2luY2x1ZGUgPGxpbnV4L3JzbGliLmg+Ci0jZW5kaWYKLQotc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciB7Ci0JdWludDMyX3QgICAgc2lnOwotCXVpbnQzMl90ICAgIHN0YXJ0OwotCXVpbnQzMl90ICAgIHNpemU7Ci0JdWludDhfdCAgICAgZGF0YVswXTsKLX07Ci0KLSNkZWZpbmUgUkFNX0NPTlNPTEVfU0lHICgweDQzNDc0MjQ0KSAvKiBEQkdDICovCi0KLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9JTklUCi1zdGF0aWMgY2hhciBfX2luaXRkYXRhCi0JcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlcltDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FQVJMWV9TSVpFXTsKLSNlbmRpZgotc3RhdGljIGNoYXIgKnJhbV9jb25zb2xlX29sZF9sb2c7Ci1zdGF0aWMgc2l6ZV90IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZTsKLQotc3RhdGljIHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKnJhbV9jb25zb2xlX2J1ZmZlcjsKLXN0YXRpYyBzaXplX3QgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotc3RhdGljIGNoYXIgKnJhbV9jb25zb2xlX3Bhcl9idWZmZXI7Ci1zdGF0aWMgc3RydWN0IHJzX2NvbnRyb2wgKnJhbV9jb25zb2xlX3JzX2RlY29kZXI7Ci1zdGF0aWMgaW50IHJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlczsKLXN0YXRpYyBpbnQgcmFtX2NvbnNvbGVfYmFkX2Jsb2NrczsKLSNkZWZpbmUgRUNDX0JMT0NLX1NJWkUgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9EQVRBX1NJWkUKLSNkZWZpbmUgRUNDX1NJWkUgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTl9FQ0NfU0laRQotI2RlZmluZSBFQ0NfU1lNU0laRSBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OX1NZTUJPTF9TSVpFCi0jZGVmaW5lIEVDQ19QT0xZIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT05fUE9MWU5PTUlBTAotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQU5EUk9JRF9SQU1fQ09OU09MRV9FUlJPUl9DT1JSRUNUSU9OCi1zdGF0aWMgdm9pZCByYW1fY29uc29sZV9lbmNvZGVfcnM4KHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKmVjYykKLXsKLQlpbnQgaTsKLQl1aW50MTZfdCBwYXJbRUNDX1NJWkVdOwotCS8qIEluaXRpYWxpemUgdGhlIHBhcml0eSBidWZmZXIgKi8KLQltZW1zZXQocGFyLCAwLCBzaXplb2YocGFyKSk7Ci0JZW5jb2RlX3JzOChyYW1fY29uc29sZV9yc19kZWNvZGVyLCBkYXRhLCBsZW4sIHBhciwgMCk7Ci0JZm9yIChpID0gMDsgaSA8IEVDQ19TSVpFOyBpKyspCi0JCWVjY1tpXSA9IHBhcltpXTsKLX0KLQotc3RhdGljIGludCByYW1fY29uc29sZV9kZWNvZGVfcnM4KHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKmVjYykKLXsKLQlpbnQgaTsKLQl1aW50MTZfdCBwYXJbRUNDX1NJWkVdOwotCWZvciAoaSA9IDA7IGkgPCBFQ0NfU0laRTsgaSsrKQotCQlwYXJbaV0gPSBlY2NbaV07Ci0JcmV0dXJuIGRlY29kZV9yczgocmFtX2NvbnNvbGVfcnNfZGVjb2RlciwgZGF0YSwgcGFyLCBsZW4sCi0JCQkJTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcmFtX2NvbnNvbGVfdXBkYXRlKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIgPSByYW1fY29uc29sZV9idWZmZXI7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXVpbnQ4X3QgKmJ1ZmZlcl9lbmQgPSBidWZmZXItPmRhdGEgKyByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQl1aW50OF90ICpibG9jazsKLQl1aW50OF90ICpwYXI7Ci0JaW50IHNpemUgPSBFQ0NfQkxPQ0tfU0laRTsKLSNlbmRpZgotCW1lbWNweShidWZmZXItPmRhdGEgKyBidWZmZXItPnN0YXJ0LCBzLCBjb3VudCk7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCWJsb2NrID0gYnVmZmVyLT5kYXRhICsgKGJ1ZmZlci0+c3RhcnQgJiB+KEVDQ19CTE9DS19TSVpFIC0gMSkpOwotCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKwotCSAgICAgIChidWZmZXItPnN0YXJ0IC8gRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7Ci0JZG8gewotCQlpZiAoYmxvY2sgKyBFQ0NfQkxPQ0tfU0laRSA+IGJ1ZmZlcl9lbmQpCi0JCQlzaXplID0gYnVmZmVyX2VuZCAtIGJsb2NrOwotCQlyYW1fY29uc29sZV9lbmNvZGVfcnM4KGJsb2NrLCBzaXplLCBwYXIpOwotCQlibG9jayArPSBFQ0NfQkxPQ0tfU0laRTsKLQkJcGFyICs9IEVDQ19TSVpFOwotCX0gd2hpbGUgKGJsb2NrIDwgYnVmZmVyLT5kYXRhICsgYnVmZmVyLT5zdGFydCArIGNvdW50KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCByYW1fY29uc29sZV91cGRhdGVfaGVhZGVyKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciA9IHJhbV9jb25zb2xlX2J1ZmZlcjsKLQl1aW50OF90ICpwYXI7Ci0JcGFyID0gcmFtX2NvbnNvbGVfcGFyX2J1ZmZlciArCi0JICAgICAgRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLCBFQ0NfQkxPQ0tfU0laRSkgKiBFQ0NfU0laRTsKLQlyYW1fY29uc29sZV9lbmNvZGVfcnM4KCh1aW50OF90ICopYnVmZmVyLCBzaXplb2YoKmJ1ZmZlciksIHBhcik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXJhbV9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb25zb2xlLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0JaW50IHJlbTsKLQlzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICpidWZmZXIgPSByYW1fY29uc29sZV9idWZmZXI7Ci0KLQlpZiAoY291bnQgPiByYW1fY29uc29sZV9idWZmZXJfc2l6ZSkgewotCQlzICs9IGNvdW50IC0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0JCWNvdW50ID0gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0JfQotCXJlbSA9IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplIC0gYnVmZmVyLT5zdGFydDsKLQlpZiAocmVtIDwgY291bnQpIHsKLQkJcmFtX2NvbnNvbGVfdXBkYXRlKHMsIHJlbSk7Ci0JCXMgKz0gcmVtOwotCQljb3VudCAtPSByZW07Ci0JCWJ1ZmZlci0+c3RhcnQgPSAwOwotCQlidWZmZXItPnNpemUgPSByYW1fY29uc29sZV9idWZmZXJfc2l6ZTsKLQl9Ci0JcmFtX2NvbnNvbGVfdXBkYXRlKHMsIGNvdW50KTsKLQotCWJ1ZmZlci0+c3RhcnQgKz0gY291bnQ7Ci0JaWYgKGJ1ZmZlci0+c2l6ZSA8IHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplKQotCQlidWZmZXItPnNpemUgKz0gY291bnQ7Ci0JcmFtX2NvbnNvbGVfdXBkYXRlX2hlYWRlcigpOwotfQotCi1zdGF0aWMgc3RydWN0IGNvbnNvbGUgcmFtX2NvbnNvbGUgPSB7Ci0JLm5hbWUJPSAicmFtIiwKLQkud3JpdGUJPSByYW1fY29uc29sZV93cml0ZSwKLQkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIgfCBDT05fRU5BQkxFRCwKLQkuaW5kZXgJPSAtMSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcmFtX2NvbnNvbGVfc2F2ZV9vbGQoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlciAqYnVmZmVyLCBjaGFyICpkZXN0KQotewotCXNpemVfdCBvbGRfbG9nX3NpemUgPSBidWZmZXItPnNpemU7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCXVpbnQ4X3QgKmJsb2NrOwotCXVpbnQ4X3QgKnBhcjsKLQljaGFyIHN0cmJ1Zls4MF07Ci0JaW50IHN0cmJ1Zl9sZW47Ci0KLQlibG9jayA9IGJ1ZmZlci0+ZGF0YTsKLQlwYXIgPSByYW1fY29uc29sZV9wYXJfYnVmZmVyOwotCXdoaWxlIChibG9jayA8IGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+c2l6ZSkgewotCQlpbnQgbnVtZXJyOwotCQlpbnQgc2l6ZSA9IEVDQ19CTE9DS19TSVpFOwotCQlpZiAoYmxvY2sgKyBzaXplID4gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpCi0JCQlzaXplID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgLSBibG9jazsKLQkJbnVtZXJyID0gcmFtX2NvbnNvbGVfZGVjb2RlX3JzOChibG9jaywgc2l6ZSwgcGFyKTsKLQkJaWYgKG51bWVyciA+IDApIHsKLSNpZiAwCi0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZXJyb3IgaW4gYmxvY2sgJXAsICVkXG4iLAotCQkJICAgICAgIGJsb2NrLCBudW1lcnIpOwotI2VuZGlmCi0JCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgKz0gbnVtZXJyOwotCQl9IGVsc2UgaWYgKG51bWVyciA8IDApIHsKLSNpZiAwCi0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogdW5jb3JyZWN0YWJsZSBlcnJvciBpbiAiCi0JCQkgICAgICAgImJsb2NrICVwXG4iLCBibG9jayk7Ci0jZW5kaWYKLQkJCXJhbV9jb25zb2xlX2JhZF9ibG9ja3MrKzsKLQkJfQotCQlibG9jayArPSBFQ0NfQkxPQ0tfU0laRTsKLQkJcGFyICs9IEVDQ19TSVpFOwotCX0KLQlpZiAocmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzIHx8IHJhbV9jb25zb2xlX2JhZF9ibG9ja3MpCi0JCXN0cmJ1Zl9sZW4gPSBzbnByaW50ZihzdHJidWYsIHNpemVvZihzdHJidWYpLAotCQkJIlxuJWQgQ29ycmVjdGVkIGJ5dGVzLCAlZCB1bnJlY292ZXJhYmxlIGJsb2Nrc1xuIiwKLQkJCXJhbV9jb25zb2xlX2NvcnJlY3RlZF9ieXRlcywgcmFtX2NvbnNvbGVfYmFkX2Jsb2Nrcyk7Ci0JZWxzZQotCQlzdHJidWZfbGVuID0gc25wcmludGYoc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSwKLQkJCQkgICAgICAiXG5ObyBlcnJvcnMgZGV0ZWN0ZWRcbiIpOwotCWlmIChzdHJidWZfbGVuID49IHNpemVvZihzdHJidWYpKQotCQlzdHJidWZfbGVuID0gc2l6ZW9mKHN0cmJ1ZikgLSAxOwotCW9sZF9sb2dfc2l6ZSArPSBzdHJidWZfbGVuOwotI2VuZGlmCi0KLQlpZiAoZGVzdCA9PSBOVUxMKSB7Ci0JCWRlc3QgPSBrbWFsbG9jKG9sZF9sb2dfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChkZXN0ID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlyYW1fY29uc29sZV9vbGRfbG9nID0gZGVzdDsKLQlyYW1fY29uc29sZV9vbGRfbG9nX3NpemUgPSBvbGRfbG9nX3NpemU7Ci0JbWVtY3B5KHJhbV9jb25zb2xlX29sZF9sb2csCi0JICAgICAgICZidWZmZXItPmRhdGFbYnVmZmVyLT5zdGFydF0sIGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+c3RhcnQpOwotCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nICsgYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5zdGFydCwKLQkgICAgICAgJmJ1ZmZlci0+ZGF0YVswXSwgYnVmZmVyLT5zdGFydCk7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCW1lbWNweShyYW1fY29uc29sZV9vbGRfbG9nICsgb2xkX2xvZ19zaXplIC0gc3RyYnVmX2xlbiwKLQkgICAgICAgc3RyYnVmLCBzdHJidWZfbGVuKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9pbml0KHN0cnVjdCByYW1fY29uc29sZV9idWZmZXIgKmJ1ZmZlciwKLQkJCQkgICBzaXplX3QgYnVmZmVyX3NpemUsIGNoYXIgKm9sZF9idWYpCi17Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRVJST1JfQ09SUkVDVElPTgotCWludCBudW1lcnI7Ci0JdWludDhfdCAqcGFyOwotI2VuZGlmCi0JcmFtX2NvbnNvbGVfYnVmZmVyID0gYnVmZmVyOwotCXJhbV9jb25zb2xlX2J1ZmZlcl9zaXplID0KLQkJYnVmZmVyX3NpemUgLSBzaXplb2Yoc3RydWN0IHJhbV9jb25zb2xlX2J1ZmZlcik7Ci0KLQlpZiAocmFtX2NvbnNvbGVfYnVmZmVyX3NpemUgPiBidWZmZXJfc2l6ZSkgewotCQlwcl9lcnIoInJhbV9jb25zb2xlOiBidWZmZXIgJXAsIGludmFsaWQgc2l6ZSAlenUsICIKLQkJICAgICAgICJkYXRhc2l6ZSAlenVcbiIsIGJ1ZmZlciwgYnVmZmVyX3NpemUsCi0JCSAgICAgICByYW1fY29uc29sZV9idWZmZXJfc2l6ZSk7Ci0JCXJldHVybiAwOwotCX0KLQotI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VSUk9SX0NPUlJFQ1RJT04KLQlyYW1fY29uc29sZV9idWZmZXJfc2l6ZSAtPSAoRElWX1JPVU5EX1VQKHJhbV9jb25zb2xlX2J1ZmZlcl9zaXplLAotCQkJCQkJRUNDX0JMT0NLX1NJWkUpICsgMSkgKiBFQ0NfU0laRTsKLQotCWlmIChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSA+IGJ1ZmZlcl9zaXplKSB7Ci0JCXByX2VycigicmFtX2NvbnNvbGU6IGJ1ZmZlciAlcCwgaW52YWxpZCBzaXplICV6dSwgIgotCQkgICAgICAgIm5vbi1lY2MgZGF0YXNpemUgJXp1XG4iLAotCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYW1fY29uc29sZV9wYXJfYnVmZmVyID0gYnVmZmVyLT5kYXRhICsgcmFtX2NvbnNvbGVfYnVmZmVyX3NpemU7Ci0KLQotCS8qIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3QgaXMgMAotCSAqIHByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHJvb3RzID0gMQotCSAqLwotCXJhbV9jb25zb2xlX3JzX2RlY29kZXIgPSBpbml0X3JzKEVDQ19TWU1TSVpFLCBFQ0NfUE9MWSwgMCwgMSwgRUNDX1NJWkUpOwotCWlmIChyYW1fY29uc29sZV9yc19kZWNvZGVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IGluaXRfcnMgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmFtX2NvbnNvbGVfY29ycmVjdGVkX2J5dGVzID0gMDsKLQlyYW1fY29uc29sZV9iYWRfYmxvY2tzID0gMDsKLQotCXBhciA9IHJhbV9jb25zb2xlX3Bhcl9idWZmZXIgKwotCSAgICAgIERJVl9ST1VORF9VUChyYW1fY29uc29sZV9idWZmZXJfc2l6ZSwgRUNDX0JMT0NLX1NJWkUpICogRUNDX1NJWkU7Ci0KLQludW1lcnIgPSByYW1fY29uc29sZV9kZWNvZGVfcnM4KGJ1ZmZlciwgc2l6ZW9mKCpidWZmZXIpLCBwYXIpOwotCWlmIChudW1lcnIgPiAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBlcnJvciBpbiBoZWFkZXIsICVkXG4iLCBudW1lcnIpOwotCQlyYW1fY29uc29sZV9jb3JyZWN0ZWRfYnl0ZXMgKz0gbnVtZXJyOwotCX0gZWxzZSBpZiAobnVtZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAicmFtX2NvbnNvbGU6IHVuY29ycmVjdGFibGUgZXJyb3IgaW4gaGVhZGVyXG4iKTsKLQkJcmFtX2NvbnNvbGVfYmFkX2Jsb2NrcysrOwotCX0KLSNlbmRpZgotCi0JaWYgKGJ1ZmZlci0+c2lnID09IFJBTV9DT05TT0xFX1NJRykgewotCQlpZiAoYnVmZmVyLT5zaXplID4gcmFtX2NvbnNvbGVfYnVmZmVyX3NpemUKLQkJICAgIHx8IGJ1ZmZlci0+c3RhcnQgPiBidWZmZXItPnNpemUpCi0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgaW52YWxpZCAiCi0JCQkgICAgICAgImJ1ZmZlciwgc2l6ZSAlZCwgc3RhcnQgJWRcbiIsCi0JCQkgICAgICAgYnVmZmVyLT5zaXplLCBidWZmZXItPnN0YXJ0KTsKLQkJZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJyYW1fY29uc29sZTogZm91bmQgZXhpc3RpbmcgYnVmZmVyLCAiCi0JCQkgICAgICAgInNpemUgJWQsIHN0YXJ0ICVkXG4iLAotCQkJICAgICAgIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5zdGFydCk7Ci0JCQlyYW1fY29uc29sZV9zYXZlX29sZChidWZmZXIsIG9sZF9idWYpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmFtX2NvbnNvbGU6IG5vIHZhbGlkIGRhdGEgaW4gYnVmZmVyICIKLQkJICAgICAgICIoc2lnID0gMHglMDh4KVxuIiwgYnVmZmVyLT5zaWcpOwotCX0KLQotCWJ1ZmZlci0+c2lnID0gUkFNX0NPTlNPTEVfU0lHOwotCWJ1ZmZlci0+c3RhcnQgPSAwOwotCWJ1ZmZlci0+c2l6ZSA9IDA7Ci0KLQlyZWdpc3Rlcl9jb25zb2xlKCZyYW1fY29uc29sZSk7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRU5BQkxFX1ZFUkJPU0UKLQljb25zb2xlX3ZlcmJvc2UoKTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotc3RhdGljIGludCBfX2luaXQgcmFtX2NvbnNvbGVfZWFybHlfaW5pdCh2b2lkKQotewotCXJldHVybiByYW1fY29uc29sZV9pbml0KChzdHJ1Y3QgcmFtX2NvbnNvbGVfYnVmZmVyICopCi0JCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0FERFIsCi0JCUNPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX1NJWkUsCi0JCXJhbV9jb25zb2xlX29sZF9sb2dfaW5pdF9idWZmZXIpOwotfQotI2Vsc2UKLXN0YXRpYyBpbnQgcmFtX2NvbnNvbGVfZHJpdmVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKLQlzaXplX3Qgc3RhcnQ7Ci0Jc2l6ZV90IGJ1ZmZlcl9zaXplOwotCXZvaWQgKmJ1ZmZlcjsKLQotCWlmIChyZXMgPT0gTlVMTCB8fCBwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEgfHwKLQkgICAgIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGludmFsaWQgcmVzb3VyY2UsICVwICVkIGZsYWdzICIKLQkJICAgICAgICIlbHhcbiIsIHJlcywgcGRldi0+bnVtX3Jlc291cmNlcywgcmVzID8gcmVzLT5mbGFncyA6IDApOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlidWZmZXJfc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7Ci0Jc3RhcnQgPSByZXMtPnN0YXJ0OwotCXByaW50ayhLRVJOX0lORk8gInJhbV9jb25zb2xlOiBnb3QgYnVmZmVyIGF0ICV6eCwgc2l6ZSAlenhcbiIsCi0JICAgICAgIHN0YXJ0LCBidWZmZXJfc2l6ZSk7Ci0JYnVmZmVyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBidWZmZXJfc2l6ZSk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBtYXAgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcmV0dXJuIHJhbV9jb25zb2xlX2luaXQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgTlVMTC8qIGFsbG9jYXRlICovKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmFtX2NvbnNvbGVfZHJpdmVyID0gewotCS5wcm9iZSA9IHJhbV9jb25zb2xlX2RyaXZlcl9wcm9iZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSAicmFtX2NvbnNvbGUiLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9tb2R1bGVfaW5pdCh2b2lkKQotewotCWludCBlcnI7Ci0JZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZyYW1fY29uc29sZV9kcml2ZXIpOwotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHNzaXplX3QgcmFtX2NvbnNvbGVfcmVhZF9vbGQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQotewotCWxvZmZfdCBwb3MgPSAqb2Zmc2V0OwotCXNzaXplX3QgY291bnQ7Ci0KLQlpZiAocG9zID49IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSkKLQkJcmV0dXJuIDA7Ci0KLQljb3VudCA9IG1pbihsZW4sIChzaXplX3QpKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSAtIHBvcykpOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCByYW1fY29uc29sZV9vbGRfbG9nICsgcG9zLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JKm9mZnNldCArPSBjb3VudDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbV9jb25zb2xlX2ZpbGVfb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5yZWFkID0gcmFtX2NvbnNvbGVfcmVhZF9vbGQsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByYW1fY29uc29sZV9sYXRlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OwotCi0JaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0jaWZkZWYgQ09ORklHX0FORFJPSURfUkFNX0NPTlNPTEVfRUFSTFlfSU5JVAotCXJhbV9jb25zb2xlX29sZF9sb2cgPSBrbWFsbG9jKHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHJhbV9jb25zb2xlX29sZF9sb2cgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJyYW1fY29uc29sZTogZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3Igb2xkIGxvZ1xuIik7Ci0JCXJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZSA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkocmFtX2NvbnNvbGVfb2xkX2xvZywKLQkgICAgICAgcmFtX2NvbnNvbGVfb2xkX2xvZ19pbml0X2J1ZmZlciwgcmFtX2NvbnNvbGVfb2xkX2xvZ19zaXplKTsKLSNlbmRpZgotCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImxhc3Rfa21zZyIsIFNfSUZSRUcgfCBTX0lSVUdPLCBOVUxMKTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicmFtX2NvbnNvbGU6IGZhaWxlZCB0byBjcmVhdGUgcHJvYyBlbnRyeVxuIik7Ci0JCWtmcmVlKHJhbV9jb25zb2xlX29sZF9sb2cpOwotCQlyYW1fY29uc29sZV9vbGRfbG9nID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZW50cnktPnByb2NfZm9wcyA9ICZyYW1fY29uc29sZV9maWxlX29wczsKLQllbnRyeS0+c2l6ZSA9IHJhbV9jb25zb2xlX29sZF9sb2dfc2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFX0VBUkxZX0lOSVQKLWNvbnNvbGVfaW5pdGNhbGwocmFtX2NvbnNvbGVfZWFybHlfaW5pdCk7Ci0jZWxzZQotbW9kdWxlX2luaXQocmFtX2NvbnNvbGVfbW9kdWxlX2luaXQpOwotI2VuZGlmCi1sYXRlX2luaXRjYWxsKHJhbV9jb25zb2xlX2xhdGVfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3Y2RhYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9ncGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogZHJpdmVycy9taXNjL3RpbWVkX2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogTWlrZSBMb2Nrd29vZCA8bG9ja3dvb2RAYW5kcm9pZC5jb20+Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlICJ0aW1lZF9vdXRwdXQuaCIKLSNpbmNsdWRlICJ0aW1lZF9ncGlvLmgiCi0KLQotc3RydWN0IHRpbWVkX2dwaW9fZGF0YSB7Ci0Jc3RydWN0IHRpbWVkX291dHB1dF9kZXYgZGV2OwotCXN0cnVjdCBocnRpbWVyIHRpbWVyOwotCXNwaW5sb2NrX3QgbG9jazsKLQl1bnNpZ25lZCAJZ3BpbzsKLQlpbnQgCQltYXhfdGltZW91dDsKLQl1OCAJCWFjdGl2ZV9sb3c7Ci19OwotCi1zdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgZ3Bpb190aW1lcl9mdW5jKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpkYXRhID0KLQkJY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhLCB0aW1lcik7Ci0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+Z3BpbywgZGF0YS0+YWN0aXZlX2xvdyA/IDEgOiAwKTsKLQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ3Bpb19nZXRfdGltZShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqZGV2KQotewotCXN0cnVjdCB0aW1lZF9ncGlvX2RhdGEJKmRhdGEgPQotCQljb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhLCBkZXYpOwotCi0JaWYgKGhydGltZXJfYWN0aXZlKCZkYXRhLT50aW1lcikpIHsKLQkJa3RpbWVfdCByID0gaHJ0aW1lcl9nZXRfcmVtYWluaW5nKCZkYXRhLT50aW1lcik7Ci0JCXN0cnVjdCB0aW1ldmFsIHQgPSBrdGltZV90b190aW1ldmFsKHIpOwotCQlyZXR1cm4gdC50dl9zZWMgKiAxMDAwICsgdC50dl91c2VjIC8gMTAwMDsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdwaW9fZW5hYmxlKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhCSpkYXRhID0KLQkJY29udGFpbmVyX29mKGRldiwgc3RydWN0IHRpbWVkX2dwaW9fZGF0YSwgZGV2KTsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGNhbmNlbCBwcmV2aW91cyB0aW1lciBhbmQgc2V0IEdQSU8gYWNjb3JkaW5nIHRvIHZhbHVlICovCi0JaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoZGF0YS0+Z3BpbywgZGF0YS0+YWN0aXZlX2xvdyA/ICF2YWx1ZSA6ICEhdmFsdWUpOwotCi0JaWYgKHZhbHVlID4gMCkgewotCQlpZiAodmFsdWUgPiBkYXRhLT5tYXhfdGltZW91dCkKLQkJCXZhbHVlID0gZGF0YS0+bWF4X3RpbWVvdXQ7Ci0KLQkJaHJ0aW1lcl9zdGFydCgmZGF0YS0+dGltZXIsCi0JCQlrdGltZV9zZXQodmFsdWUgLyAxMDAwLCAodmFsdWUgJSAxMDAwKSAqIDEwMDAwMDApLAotCQkJSFJUSU1FUl9NT0RFX1JFTCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IHRpbWVkX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB0aW1lZF9ncGlvICpjdXJfZ3BpbzsKLQlzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhICpncGlvX2RhdGEsICpncGlvX2RhdDsKLQlpbnQgaSwgaiwgcmV0ID0gMDsKLQotCWlmICghcGRhdGEpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlncGlvX2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGltZWRfZ3Bpb19kYXRhKSAqIHBkYXRhLT5udW1fZ3Bpb3MsCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWdwaW9fZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKSB7Ci0JCWN1cl9ncGlvID0gJnBkYXRhLT5ncGlvc1tpXTsKLQkJZ3Bpb19kYXQgPSAmZ3Bpb19kYXRhW2ldOwotCi0JCWhydGltZXJfaW5pdCgmZ3Bpb19kYXQtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsCi0JCQkJSFJUSU1FUl9NT0RFX1JFTCk7Ci0JCWdwaW9fZGF0LT50aW1lci5mdW5jdGlvbiA9IGdwaW9fdGltZXJfZnVuYzsKLQkJc3Bpbl9sb2NrX2luaXQoJmdwaW9fZGF0LT5sb2NrKTsKLQotCQlncGlvX2RhdC0+ZGV2Lm5hbWUgPSBjdXJfZ3Bpby0+bmFtZTsKLQkJZ3Bpb19kYXQtPmRldi5nZXRfdGltZSA9IGdwaW9fZ2V0X3RpbWU7Ci0JCWdwaW9fZGF0LT5kZXYuZW5hYmxlID0gZ3Bpb19lbmFibGU7Ci0JCXJldCA9IHRpbWVkX291dHB1dF9kZXZfcmVnaXN0ZXIoJmdwaW9fZGF0LT5kZXYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQl0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoJmdwaW9fZGF0YVtpXS5kZXYpOwotCQkJa2ZyZWUoZ3Bpb19kYXRhKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlncGlvX2RhdC0+Z3BpbyA9IGN1cl9ncGlvLT5ncGlvOwotCQlncGlvX2RhdC0+bWF4X3RpbWVvdXQgPSBjdXJfZ3Bpby0+bWF4X3RpbWVvdXQ7Ci0JCWdwaW9fZGF0LT5hY3RpdmVfbG93ID0gY3VyX2dwaW8tPmFjdGl2ZV9sb3c7Ci0JCWdwaW9fZGlyZWN0aW9uX291dHB1dChncGlvX2RhdC0+Z3BpbywgZ3Bpb19kYXQtPmFjdGl2ZV9sb3cpOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0aW1lZF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB0aW1lZF9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHRpbWVkX2dwaW9fZGF0YSAqZ3Bpb19kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9ncGlvczsgaSsrKQotCQl0aW1lZF9vdXRwdXRfZGV2X3VucmVnaXN0ZXIoJmdwaW9fZGF0YVtpXS5kZXYpOwotCi0Ja2ZyZWUoZ3Bpb19kYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aW1lZF9ncGlvX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gdGltZWRfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlCQk9IHRpbWVkX2dwaW9fcmVtb3ZlLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQkJPSBUSU1FRF9HUElPX05BTUUsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgdGltZWRfZ3Bpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGltZWRfZ3Bpb19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGltZWRfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbWVkX2dwaW9fZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodGltZWRfZ3Bpb19pbml0KTsKLW1vZHVsZV9leGl0KHRpbWVkX2dwaW9fZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBncGlvIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfZ3Bpby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUxNWY4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIGluY2x1ZGUvbGludXgvdGltZWRfZ3Bpby5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotKi8KLQotI2lmbmRlZiBfTElOVVhfVElNRURfR1BJT19ICi0jZGVmaW5lIF9MSU5VWF9USU1FRF9HUElPX0gKLQotI2RlZmluZSBUSU1FRF9HUElPX05BTUUgInRpbWVkLWdwaW8iCi0KLXN0cnVjdCB0aW1lZF9ncGlvIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIAlncGlvOwotCWludAkJbWF4X3RpbWVvdXQ7Ci0JdTggCQlhY3RpdmVfbG93OwotfTsKLQotc3RydWN0IHRpbWVkX2dwaW9fcGxhdGZvcm1fZGF0YSB7Ci0JaW50IAkJbnVtX2dwaW9zOwotCXN0cnVjdCB0aW1lZF9ncGlvICpncGlvczsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdGltZWRfb3V0cHV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNzkxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKiBkcml2ZXJzL21pc2MvdGltZWRfb3V0cHV0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IE1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlICJ0aW1lZF9vdXRwdXQuaCIKLQotc3RhdGljIHN0cnVjdCBjbGFzcyAqdGltZWRfb3V0cHV0X2NsYXNzOwotc3RhdGljIGF0b21pY190IGRldmljZV9jb3VudDsKLQotc3RhdGljIHNzaXplX3QgZW5hYmxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICp0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJlbWFpbmluZyA9IHRkZXYtPmdldF90aW1lKHRkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlbWFpbmluZyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGVuYWJsZV9zdG9yZSgKLQkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqdGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCB2YWx1ZTsKLQotCXNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSk7Ci0JdGRldi0+ZW5hYmxlKHRkZXYsIHZhbHVlKTsKLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgZW5hYmxlX3Nob3csIGVuYWJsZV9zdG9yZSk7Ci0KLXN0YXRpYyBpbnQgY3JlYXRlX3RpbWVkX291dHB1dF9jbGFzcyh2b2lkKQotewotCWlmICghdGltZWRfb3V0cHV0X2NsYXNzKSB7Ci0JCXRpbWVkX291dHB1dF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInRpbWVkX291dHB1dCIpOwotCQlpZiAoSVNfRVJSKHRpbWVkX291dHB1dF9jbGFzcykpCi0JCQlyZXR1cm4gUFRSX0VSUih0aW1lZF9vdXRwdXRfY2xhc3MpOwotCQlhdG9taWNfc2V0KCZkZXZpY2VfY291bnQsIDApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1pbnQgdGltZWRfb3V0cHV0X2Rldl9yZWdpc3RlcihzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqdGRldikKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCF0ZGV2IHx8ICF0ZGV2LT5uYW1lIHx8ICF0ZGV2LT5lbmFibGUgfHwgIXRkZXYtPmdldF90aW1lKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGNyZWF0ZV90aW1lZF9vdXRwdXRfY2xhc3MoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXRkZXYtPmluZGV4ID0gYXRvbWljX2luY19yZXR1cm4oJmRldmljZV9jb3VudCk7Ci0JdGRldi0+ZGV2ID0gZGV2aWNlX2NyZWF0ZSh0aW1lZF9vdXRwdXRfY2xhc3MsIE5VTEwsCi0JCU1LREVWKDAsIHRkZXYtPmluZGV4KSwgTlVMTCwgdGRldi0+bmFtZSk7Ci0JaWYgKElTX0VSUih0ZGV2LT5kZXYpKQotCQlyZXR1cm4gUFRSX0VSUih0ZGV2LT5kZXYpOwotCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKHRkZXYtPmRldiwgJmRldl9hdHRyX2VuYWJsZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2NyZWF0ZV9maWxlOwotCi0JZGV2X3NldF9kcnZkYXRhKHRkZXYtPmRldiwgdGRldik7Ci0JdGRldi0+c3RhdGUgPSAwOwotCXJldHVybiAwOwotCi1lcnJfY3JlYXRlX2ZpbGU6Ci0JZGV2aWNlX2Rlc3Ryb3kodGltZWRfb3V0cHV0X2NsYXNzLCBNS0RFVigwLCB0ZGV2LT5pbmRleCkpOwotCXByaW50ayhLRVJOX0VSUiAidGltZWRfb3V0cHV0OiBGYWlsZWQgdG8gcmVnaXN0ZXIgZHJpdmVyICVzXG4iLAotCQkJdGRldi0+bmFtZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwodGltZWRfb3V0cHV0X2Rldl9yZWdpc3Rlcik7Ci0KLXZvaWQgdGltZWRfb3V0cHV0X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICp0ZGV2KQotewotCWRldmljZV9yZW1vdmVfZmlsZSh0ZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGUpOwotCWRldmljZV9kZXN0cm95KHRpbWVkX291dHB1dF9jbGFzcywgTUtERVYoMCwgdGRldi0+aW5kZXgpKTsKLQlkZXZfc2V0X2RydmRhdGEodGRldi0+ZGV2LCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRpbWVkX291dHB1dF9kZXZfdW5yZWdpc3Rlcik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRpbWVkX291dHB1dF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNyZWF0ZV90aW1lZF9vdXRwdXRfY2xhc3MoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRpbWVkX291dHB1dF9leGl0KHZvaWQpCi17Ci0JY2xhc3NfZGVzdHJveSh0aW1lZF9vdXRwdXRfY2xhc3MpOwotfQotCi1tb2R1bGVfaW5pdCh0aW1lZF9vdXRwdXRfaW5pdCk7Ci1tb2R1bGVfZXhpdCh0aW1lZF9vdXRwdXRfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIk1pa2UgTG9ja3dvb2QgPGxvY2t3b29kQGFuZHJvaWQuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJ0aW1lZCBvdXRwdXQgY2xhc3MgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90aW1lZF9vdXRwdXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzkwN2FiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RpbWVkX291dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogaW5jbHVkZS9saW51eC90aW1lZF9vdXRwdXQuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSovCi0KLSNpZm5kZWYgX0xJTlVYX1RJTUVEX09VVFBVVF9ICi0jZGVmaW5lIF9MSU5VWF9USU1FRF9PVVRQVVRfSAotCi1zdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiB7Ci0JY29uc3QgY2hhcgkqbmFtZTsKLQotCS8qIGVuYWJsZSB0aGUgb3V0cHV0IGFuZCBzZXQgdGhlIHRpbWVyICovCi0Jdm9pZAkoKmVuYWJsZSkoc3RydWN0IHRpbWVkX291dHB1dF9kZXYgKnNkZXYsIGludCB0aW1lb3V0KTsKLQotCS8qIHJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyByZW1haW5pbmcgb24gdGhlIHRpbWVyICovCi0JaW50CQkoKmdldF90aW1lKShzdHJ1Y3QgdGltZWRfb3V0cHV0X2RldiAqc2Rldik7Ci0KLQkvKiBwcml2YXRlIGRhdGEgKi8KLQlzdHJ1Y3QgZGV2aWNlCSpkZXY7Ci0JaW50CQlpbmRleDsKLQlpbnQJCXN0YXRlOwotfTsKLQotZXh0ZXJuIGludCB0aW1lZF9vdXRwdXRfZGV2X3JlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYpOwotZXh0ZXJuIHZvaWQgdGltZWRfb3V0cHV0X2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB0aW1lZF9vdXRwdXRfZGV2ICpkZXYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iM2RmZy9iM2RmZy5jIGIvZHJpdmVycy9zdGFnaW5nL2IzZGZnL2IzZGZnLmMKaW5kZXggY2RhMjZiYjQuLjRhNDNjNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iM2RmZy9iM2RmZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iM2RmZy9iM2RmZy5jCkBAIC00NjgsNyArNDY4LDYgQEAKIAogc3RhdGljIGludCBlbmFibGVfdHJhbnNtaXNzaW9uKHN0cnVjdCBiM2RmZ19kZXYgKmZnZGV2KQogewotCXUxNiBjb21tYW5kOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmZnZGV2LT5wZGV2LT5kZXY7CiAKQEAgLTQ4MCwxNyArNDc5LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyoKLQkgKiBDaGVjayB3ZSdyZSBhIGJ1cyBtYXN0ZXIuCi0JICogVE9ETzogSSB0aGluayB3ZSBjYW4gcmVtb3ZlIHRoaXMgaGF2aW5nIGFkZGVkIHRoZSBwY2lfc2V0X21hc3RlciBjYWxsCi0JICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZmdkZXYtPnBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7Ci0JaWYgKCEoY29tbWFuZCAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKLQkJZGV2X2VycihkZXYsICJub3QgYSBidXMgbWFzdGVyLCBmb3JjZS1lbmFibGluZ1xuIik7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChmZ2Rldi0+cGRldiwgUENJX0NPTU1BTkQsCi0JCQljb21tYW5kIHwgUENJX0NPTU1BTkRfTUFTVEVSKTsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmdkZXYtPmJ1ZmZlcl9sb2NrLCBmbGFncyk7CiAKIAkvKiBIYW5kbGUgcmFjaW5nIGVuYWJsZV90cmFuc21pc3Npb24gY2FsbHMuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9DSEFOR0VMT0cgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9DSEFOR0VMT0cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExODE2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0NIQU5HRUxPRwpAQCAtMCwwICsxLDM3IEBACitiYXRtYW4tYWR2IDAuMjoKKworKiBzdXBwb3J0IGxhdGVzdCBrZXJuZWxzICgyLjYuMjAgLSAyLjYuMzEpCisqIHRlbXBvcmFyeSByb3V0aW5nIGxvb3BzIC8gVFRMIGNvZGUgYnVnIC8gZ2hvc3QgZW50cmllcyBpbiBvcmlnaW5hdG9yIHRhYmxlIGZpeGVkCisqIGludGVybmFsIHBhY2tldCBxdWV1ZSBmb3IgcGFja2V0IGFnZ3JlZ2F0aW9uICYgdHJhbnNtaXNzaW9uIHJldHJ5IChBUlEpCisgIGZvciBwYXlsb2FkIGJyb2FkY2FzdHMgYWRkZWQKKyogaW50ZXJmYWNlIGRldGVjdGlvbiBjb252ZXJ0ZWQgdG8gZXZlbnQgYmFzZWQgaGFuZGxpbmcgdG8gYXZvaWQgdGltZXJzCisqIG1ham9yIGxpbnV4IGNvZGluZyBzdHlsZSBhZGp1c3RtZW50cyBhcHBsaWVkCisqIGFsbCBrZXJuZWwgdmVyc2lvbiBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyBoYXMgYmVlbiBtb3ZlZCB0byBjb21wYXQuaAorKiB1c2UgcmFuZG9tIGV0aGVybmV0IGFkZHJlc3MgZ2VuZXJhdG9yIGZyb20gdGhlIGtlcm5lbAorKiAvc3lzL21vZHVsZS9iYXRtYW5fYWR2L3ZlcnNpb24gdG8gZXhwb3J0IGtlcm5lbCBtb2R1bGUgdmVyc2lvbgorKiB2aXM6IHNlY29uZGFyeSBpbnRlcmZhY2UgZXhwb3J0IGZvciBkb3QgZHJhdyBmb3JtYXQgKyBKU09OIG91dHB1dCBmb3JtYXQgYWRkZWQKKyogbWFueSBidWdzIChhbGlnbm1lbnQgaXNzdWVzLCByYWNlIGNvbmRpdGlvbnMsIGRlYWRsb2NrcywgZXRjKSBzcXVhc2hlZAorCisgLS0gU2F0LCAwNyBOb3YgMjAwOSAxNTo0NDozMSArMDEwMAorCitiYXRtYW4tYWR2IDAuMToKKworKiBzdXBwb3J0IGxhdGVzdCBrZXJuZWxzICgyLjYuMjAgLSAyLjYuMjgpCisqIExPVFMgb2YgY2xlYW51cDogbG9ja2luZywgc3RhY2sgdXNhZ2UsIG1lbW9yeSBsZWFrcworKiBDaGFuZ2UgRXRoZXJ0eXBlIGZyb20gMHgwODQyIHRvIDB4NDMwNQorICB1bnJlZ2lzdGVyZWQgYXQgSUVFRSwgaWYgeW91IHdhbnQgdG8gc3BvbnNvciBhbiBvZmZpY2lhbCBFdGhlcnR5cGUgKCQyNTAwKQorICBwbGVhc2UgY29udGFjdCB1cworCisgLS0gU3VuLCAyOCBEZWMgMjAwOCAwMDo0NDozMSArMDEwMAorCitiYXRtYW4tYWR2IDAuMS1iZXRhOgorCisqIGxheWVyIDIgbWVzaGluZyBiYXNlZCBvbiBCQVRNQU4gVFEgYWxnb3JpdGhtIGluIGtlcm5lbGxhbmQKKyogb3BlcmF0ZXMgb24gYW55IGV0aGVybmV0IGxpa2UgaW50ZXJmYWNlCisqIHN1cHBvcnRzIElQdjQsIElQdjYsIERIQ1AsIGV0YworKiBpcyBjb250cm9sbGVkIHZpYSAvcHJvYy9uZXQvYmF0bWFuLWFkdi8KKyogYnJpZGdpbmcgdmlhIGJyY3RsIGlzIHN1cHBvcnRlZAorKiBpbnRlcmZhY2Ugd2F0Y2hkb2cgKGludGVyZmFjZXMgY2FuIGJlIChkZSlhY3RpdmF0ZWQgZHluYW1pY2FsbHkpCisqIG9mZmVycyBpbnRlZ3JhdGVkIHZpcyBzZXJ2ZXIgd2hpY2ggbWVzaGVzL3N5bmNzIHdpdGggb3RoZXIgdmlzIHNlcnZlcnMgaW4gcmFuZ2UKKworIC0tIE1vbiwgMDUgTWF5IDIwMDggMTQ6MTA6MDQgKzAyMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzQyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgQi5BLlQuTS5BLk4gbWVzaGluZyBwcm90b2NvbAorIworCitjb25maWcgQkFUTUFOX0FEVgorCXRyaXN0YXRlICJCLkEuVC5NLkEuTi4gQWR2YW5jZWQgTWVzaGluZyBQcm90b2NvbCIKKyAgICAgICAgZGVmYXVsdCBuCisJLS0taGVscC0tLQorCisgICAgICAgIEIuQS5ULk0uQS5OLiAoYmV0dGVyIGFwcHJvYWNoIHRvIG1vYmlsZSBhZC1ob2MgbmV0d29ya2luZykgaXMKKyAgICAgICAgYSByb3V0aW5nIHByb3RvY29sIGZvciBtdWx0aS1ob3AgYWQtaG9jIG1lc2ggbmV0d29ya3MuIFRoZQorICAgICAgICBuZXR3b3JrcyBtYXkgYmUgd2lyZWQgb3Igd2lyZWxlc3MuIFNlZQorICAgICAgICBodHRwOi8vd3d3Lm9wZW4tbWVzaC5vcmcvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCB1c2VyIHNwYWNlCisgICAgICAgIHRvb2xzLgorCitjb25maWcgQkFUTUFOX0RFQlVHCisJYm9vbCAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIEJBVE1BTiAhPSBuCisJaGVscAorCisJICBUaGlzIGlzIGFuIG9wdGlvbiBmb3IgdXNlIGJ5IGRldmVsb3BlcnM7IG1vc3QgcGVvcGxlIHNob3VsZAorCSAgc2F5IE4gaGVyZS4gVGhpcyBlbmFibGVzIGNvbXBpbGF0aW9uIG9mIHN1cHBvcnQgZm9yCisJICBvdXRwdXR0aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsIGxvZy4gVGhlCisJICBvdXRwdXQgaXMgY29udHJvbGxlZCB2aWEgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgZGVidWcuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkYTg3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyMKKyMgTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQQorIworCitvYmotbSArPSBiYXRtYW4tYWR2Lm8KK2JhdG1hbi1hZHYtb2JqcyA6PSBtYWluLm8gcHJvYy5vIHNlbmQubyByb3V0aW5nLm8gc29mdC1pbnRlcmZhY2UubyBkZXZpY2UubyB0cmFuc2xhdGlvbi10YWJsZS5vIGJpdGFycmF5Lm8gaGFzaC5vIHJpbmdfYnVmZmVyLm8gdmlzLm8gaGFyZC1pbnRlcmZhY2UubyBhZ2dyZWdhdGlvbi5vIGxvZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhZjM5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1JFQURNRQpAQCAtMCwwICsxLDEyNSBAQAorW3N0YXRlOiAwNy0xMS0yMDA5XQorCitCQVRNQU4tQURWCistLS0tLS0tLS0tCisKK0JhdG1hbi1hZHZhbmNlZCBpcyBhIG5ldyBhcHByb2FjaCB0byB3aXJlbGVzcyBuZXR3b3JraW5nIHdoaWNoIGRvZXMgbm8gbG9uZ2VyCitvcGVyYXRlIG9uIHRoZSBJUCBiYXNpcy4gVW5saWtlIEIuQS5ULk0uQS5OLCB3aGljaCBleGNoYW5nZXMgaW5mb3JtYXRpb24KK3VzaW5nIFVEUCBwYWNrZXRzIGFuZCBzZXRzIHJvdXRpbmcgdGFibGVzLCBiYXRtYW4tYWR2YW5jZWQgb3BlcmF0ZXMgb24gSVNPL09TSQorTGF5ZXIgMiBvbmx5IGFuZCB1c2VzIGFuZCByb3V0ZXMgKG9yIGJldHRlcjogYnJpZGdlcykgRXRoZXJuZXQgRnJhbWVzLiBJdAorZW11bGF0ZXMgYSB2aXJ0dWFsIG5ldHdvcmsgc3dpdGNoIG9mIGFsbCBub2RlcyBwYXJ0aWNpcGF0aW5nLiBUaGVyZWZvcmUgYWxsCitub2RlcyBhcHBlYXIgdG8gYmUgbGluayBsb2NhbCwgdGh1cyBhbGwgaGlnaGVyIG9wZXJhdGluZyBwcm90b2NvbHMgd29uJ3QgYmUKK2FmZmVjdGVkIGJ5IGFueSBjaGFuZ2VzIHdpdGhpbiB0aGUgbmV0d29yay4gWW91IGNhbiBydW4gYWxtb3N0IGFueSBwcm90b2NvbAorYWJvdmUgQi5BLlQuTS5BLk4uIEFkdmFuY2VkLCBwcm9taW5lbnQgZXhhbXBsZXMgYXJlOiBJUHY0LCBJUHY2LCBESENQLCBJUFguCisKK1RoaXMgaXMgYmF0bWFuLWFkdmFuY2VkIGltcGxlbWVudGVkIGFzIExpbnV4IGtlcm5lbCBkcml2ZXIuIEl0IGRvZXMgbm90IGRlcGVuZAorb24gYW55IG5ldHdvcmsgKG90aGVyKSBkcml2ZXIsIGFuZCBjYW4gYmUgdXNlZCBvbiB3aWZpIGFzIHdlbGwgYXMgZXRoZXJuZXQsCit2cG4sIGV0YyAuLi4gKGFueXRoaW5nIHdpdGggZXRoZXJuZXQtc3R5bGUgbGF5ZXIgMikuCitJdCBjb21waWxlcyBhZ2FpbnN0IGFuZCBzaG91bGQgd29yayB3aXRoIExpbnV4IDIuNi4yMCAtIDIuNi4zMS4gU3VwcG9ydGluZyBvbGRlcgordmVyc2lvbnMgaXMgbm90IHBsYW5uZWQsIGJ1dCBpdCdzIHByb2JhYmx5IGVhc3kgdG8gYmFja3BvcnQgaXQuIElmIHlvdSB3b3JrIG9uIGEKK2JhY2twb3J0LCBmZWVsIGZyZWUgdG8gY29udGFjdCB1cy4gIDotKQorCitDT01QSUxFCistLS0tLS0tCitUbyBjb21waWxlIGFnYWluc3QgeW91ciBjdXJyZW50bHkgaW5zdGFsbGVkIGtlcm5lbCwganVzdCB0eXBlOgorCisjIG1ha2UKKworaWYgeW91IHdhbnQgdG8gY29tcGlsZSBhZ2FpbnN0IHNvbWUgb3RoZXIga2VybmVsLCB1c2U6CisKKyMgbWFrZSBLRVJORUxQQVRIPS9wYXRoL3RvL2tlcm5lbAorCitVU0FHRQorLS0tLS0KKworaW5zbW9kIHRoZSBiYXRtYW4tYWR2LmtvIGluIHlvdXIga2VybmVsOgorCisjIGluc21vZCBiYXRtYW4tYWR2LmtvCisKK3RoZSBtb2R1bGUgaXMgbm93IHdhaXRpbmcgZm9yIGFjdGl2YXRpb24uIFlvdSBtdXN0IGFkZCBzb21lIGludGVyZmFjZXMKK29uIHdoaWNoIGJhdG1hbiBjYW4gb3BlcmF0ZS4gRWFjaCBpbnRlcmZhY2UgbXVzdCBiZSBhZGRlZCBzZXBhcmF0ZWx5OgorCisjIGVjaG8gd2xhbjAgPiAvcHJvYy9uZXQvYmF0bWFuLWFkdi9pbnRlcmZhY2VzCisKKyggIyBlY2hvIHdsYW4xID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcyApCisoICMgZWNobyBldGgwID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcyApCisoIC4uLiApCisKK05vdyBiYXRtYW4gc3RhcnRzIGJyb2FkY2FzdGluZyBvbiB0aGlzIGludGVyZmFjZS4KK1lvdSBjYW4gbm93IHZpZXcgdGhlIHRhYmxlIG9mIG9yaWdpbmF0b3JzIChtZXNoIHBhcnRpY2lwYW50cykgd2l0aDoKKworIyBjYXQgL3Byb2MvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvcnMKKworVGhlIG1vZHVsZSB3aWxsIGNyZWF0ZSBhIG5ldyBpbnRlcmZhY2UgImJhdDAiLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhCityZWd1bGFyIGludGVyZmFjZToKKworIyBpZmNvbmZpZyBiYXQwIGluZXQgMTkyLjE2OC4wLjEgdXAKKyMgcGluZyAxOTIuMTY4LjAuMgorLi4uCisKK0lmIHlvdSB3YW50IHRvcG9sb2d5IHZpc3VhbGl6YXRpb24sIHlvdXIgbWVzaG5vZGUgbXVzdCBiZSBjb25maWd1cmVkCithcyBWSVMtc2VydmVyOgorCisjIGVjaG8gInNlcnZlciIgPiAvcHJvYy9uZXQvYmF0bWFuLWFkdi92aXMKKworRWFjaCBub2RlIGlzIGVpdGhlciBjb25maWd1cmVkIGFzICJzZXJ2ZXIiIG9yIGFzICJjbGllbnQiIChkZWZhdWx0OgorImNsaWVudCIpLiBDbGllbnRzIHNlbmQgdGhlaXIgdG9wb2xvZ3kgZGF0YSB0byB0aGUgc2VydmVyIG5leHQgdG8gdGhlbSwKK2FuZCBzZXJ2ZXIgc3luY2hyb25pemUgd2l0aCBvdGhlciBzZXJ2ZXJzLiBJZiB0aGVyZSBpcyBubyBzZXJ2ZXIKK2NvbmZpZ3VyZWQgKGRlZmF1bHQpIHdpdGhpbiB0aGUgbWVzaCwgbm8gdG9wb2xvZ3kgaW5mb3JtYXRpb24gd2lsbCBiZQordHJhbnNtaXR0ZWQuIFdpdGggdGhlc2UgInN5bmNocm9uaXppbmcgc2VydmVycyIsIHRoZXJlIGNhbiBiZSAxIG9yCittb3JlIHZpcyBzZXJ2ZXJzIHNoYXJpbmcgdGhlIHNhbWUgKG9yIGF0IGxlYXN0IHZlcnkgc2ltaWxhcikgZGF0YS4KKworV2hlbiBjb25maWd1cmVkIGFzIHNlcnZlciwgeW91IGNhbiBnZXQgYSB0b3BvbG9neSBzbmFwc2hvdCBvZiB5b3VyIG1lc2g6CisKKyMgY2F0IC9wcm9jL25ldC9iYXRtYW4tYWR2L3ZpcworCitUaGlzIG91dHB1dCBmb3JtYXQgaXMgYSBncmFwaHZpeiBmb3JtYXR0ZWQgdGV4dCBmaWxlIHdoaWNoIGNhbiBiZQorcHJvY2Vzc2VkIHdpdGggZ3JhcGh2aXotdG9vbHMgbGlrZSBkb3QuCitUaGUgbGFiZWxzIGFyZSBzaW1pbGFyL2NvbXBhdGlibGUgdG8gdGhlIEVUWCBtZXRyaWMsIDEuMCBtZWFucyBwZXJmZWN0Citjb25uZWN0aW9uICgxMDAlKSwgMi4wIG1lYW5zIDUwJSwgMy4wIG1lYW5zIDMzJSBhbmQgc28gb24uCisKK0FsdGVybmF0aXZlbHksIGEgSlNPTiBvdXRwdXQgZm9ybWF0IGlzIGF2YWlsYWJsZS4gVGhlIGZvcm1hdCBjYW4gYmUgc2V0Cit1c2luZyBieSB3cml0aW5nIGVpdGhlciAiZG90X2RyYXciIG9yICJqc29uIiBpbnRvIHRoZSB2aXNfZm9ybWF0IGZpbGUuCisiZG90X2RyYXciIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCisKK2VjaG8gImpzb24iID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvdmlzX2Zvcm1hdAorCitJbiB2ZXJ5IG1vYmlsZSBzY2VuYXJpb3MsIHlvdSBtaWdodCB3YW50IHRvIGFkanVzdCB0aGUgb3JpZ2luYXRvcgoraW50ZXJ2YWwgdG8gYSBsb3dlciB2YWx1ZS4gVGhpcyB3aWxsIG1ha2UgdGhlIG1lc2ggbW9yZSByZXNwb25zaXZlIHRvCit0b3BvbG9neSBjaGFuZ2VzLCBidXQgd2lsbCBhbHNvIGluY3JlYXNlIHRoZSBvdmVyaGVhZC4gUGxlYXNlIG1ha2Ugc3VyZQordGhhdCBhbGwgbm9kZXMgaW4geW91ciBtZXNoIHVzZSB0aGUgc2FtZSBpbnRlcnZhbC4gVGhlIGRlZmF1bHQgdmFsdWUKK2lzIDEwMDAgbXMgKDEgc2Vjb25kKS4KKworIyBlY2hvIDEwMDAgPiAvcHJvYy9uZXQvYmF0bWFuLWFkdi9vcmlnX2ludGVydmFsCisKK1RvIGRlYWN0aXZhdGUgYmF0bWFuLCBkbzoKKworIyBlY2hvICIiID4gL3Byb2MvbmV0L2JhdG1hbi1hZHYvaW50ZXJmYWNlcworCitCQVRDVEwKKy0tLS0tLQorCitCLkEuVC5NLkEuTi4gIGFkdmFuY2VkICBvcGVyYXRlcyBvbiBsYXllciAyIGFuZCB0aHVzIGFsbCBob3N0cyBwYXJ0aWNpLQorcGF0aW5nIGluIHRoZSB2aXJ0dWFsIHN3aXRjaCBhcmUgY29tcGxldGVseSB0cmFuc3BhcmVudCBmb3IgYWxsICBwcm90by0KK2NvbHMgYWJvdmUgbGF5ZXIgMi4gVGhlcmVmb3JlIHRoZSBjb21tb24gZGlhZ25vc2lzIHRvb2xzIGRvIG5vdCB3b3JrIGFzCitleHBlY3RlZC4gVG8gb3ZlcmNvbWUgdGhlc2UgcHJvYmxlbXMgYmF0Y3RsIHdhcyBjcmVhdGVkLiBBdCB0aGUgIG1vbWVudAordGhlICBiYXRjdGwgY29udGFpbnMgcGluZywgdHJhY2Vyb3V0ZSwgdGNwZHVtcCBhbmQgaW50ZXJmYWNlcyB0byB0aGUKK2tlcm5lbCBtb2R1bGUgc2V0dGluZ3MuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBtYW5wYWdlIChtYW4gYmF0Y3RsKS4KKworYmF0Y3RsIGlzIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3Lm9wZW4tbWVzaC5uZXQvCisKK0NPTlRBQ1QKKy0tLS0tLS0KKworUGxlYXNlIHNlbmQgdXMgY29tbWVudHMsIGV4cGVyaWVuY2VzLCBxdWVzdGlvbnMsIGFueXRoaW5nIDopCisKK0lSQzogICAgICAgICAgICAgI2JhdG1hbiBvbiBpcmMuZnJlZW5vZGUub3JnCitNYWlsaW5nLWxpc3Q6ICAgIGIuYS50Lm0uYS5uQG9wZW4tbWVzaC5uZXQKKyhzdWJzY3JpcHRpb24gYXQgaHR0cHM6Ly9saXN0Lm9wZW4tbWVzaC5uZXQvbW0vbGlzdGluZm8vYi5hLnQubS5hLm4gKQorCitZb3UgY2FuIGFsc28gY29udGFjdCB0aGUgQXV0aG9yczoKKworTWFyZWsgTGluZG5lciA8bGluZG5lcl9tYXJla0B5YWhvby5kZT4KK1NpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2ZGNmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L1RPRE8KQEAgLTAsMCArMSw1MSBAQAorPT4gcHJvYyBpbnRlcmZhY2UKKyogaW1wbGVtZW50IG5ldyBpbnRlcmZhY2UgdG8gYWRkL2RlbGV0ZSBpbnRlcmZhY2VzIGFuZCBzZXR0aW5nIG9wdGlvbnMKKyogL3Byb2Mvc3lzL25ldC9iYXRtYW4tYWR2LyBhcyBtYWluIGZvbGRlcgorKiBpbiBpbnRlcmZhY2VzLyBsaXN0IGV2ZXJ5IGF2YWlsYWJsZSBpbnRlcmZhY2Ugb2YgdGhlIGhvc3QKKyogZWFjaCBpbnRlcmZhY2VzLyRpZmFjZS8gY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKy0+IGVuYWJsZSAoZGVmOiAwKSBbYWRkL3JlbW92ZSB0aGlzIGludGVyZmFjZSB0byBiYXRtYW4tYWR2XQorLT4gb2dtX2ludGVydmFsIChkZWY6IDEwMDApIFtvZ20gaW50ZXJ2YWwgb2YgdGhhdCBpbnRlcmZhY2VdCistPiBjb250ZXh0IChkZWY6IGJhdDApIFtsYXRlciB3ZSB3YW50IHRvIHN1cHBvcnQgbXVsdGlwbGUgbWVzaCBpbnN0YW5jZXMgdmlhCistPiBiYXQwL2JhdDEvYmF0Mi8uLl0KKy0+IHN0YXR1cyAocmVhZC1vbmx5KSBbb3V0cHV0cyB0aGUgaW50ZXJmYWNlIHN0YXR1cyBmcm9tIGJhdG1hbidzCistPiBwZXJzcGVjdGl2ZV0KKyogaW4gbWVzaC9iYXRYLyBsaXN0IGV2ZXJ5IGF2YWlsYWJsZSBtZXNoIHN1Ym5ldAorLT4gdmlzX3NlcnZlciAoZGVmOiAwKSBbZW5hYmxlL2Rpc2FibGUgdmlzIHNlcnZlciBmb3IgdGhhdCBtZXNoXQorLT4gdmlzX2RhdGEgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIHZpcyBkYXRhIGluIGEgcmF3IGZvcm1hdF0KKy0+IGFnZ3JlZ2F0ZV9vZ20gKGRlZjogMSkgW2VuYWJsZS9kaXNhYmxlIG9nbSBhZ2dyZWdhdGlvbiBmb3IgdGhhdCBtZXNoXQorLT4gb3JpZ2luYXRvcnMgKHJlYWQtb25seSkgW291dHB1dHMgdGhlIG9yaWdpbmF0b3IgdGFibGVdCistPiB0cmFuc3RhYmxlX2dsb2JhbCAocmVhZC1vbmx5KSBbb3V0cHV0cyB0aGUgZ2xvYmFsIHRyYW5zbGF0aW9uIHRhYmxlXQorLT4gdHJhbnN0YWJsZV9sb2NhbCAocmVhZC1vbmx5KSBbb3V0cHV0cyB0aGUgbG9jYWwgdHJhbnNsYXRpb24gdGFibGVdCisKKz0+IHZpcyAicmF3IiBkYXRhIG91dHB1dAorKiB0aGUgcmF3IGZvcm1hdCBzaGFsbCByZXBsYWNlIGRvdCBkcmF3IC8ganNvbiB0byBvZmZlciBhIG5ldXRyYWwgdGhhdCBjYW4KKyogYmUgY29udmVydGVkCisqIHRoZSBmb3JtYXQgKGNvbW1hIHNlcGVyYXRlZCBlbnRyaWVzKToKKy0+ICJtYWMiIC0+IG1hYyBhZGRyZXNzIG9mIGFuIG9yaWdpbmF0b3IgKGVhY2ggbGluZSBiZWdpbnMgd2l0aCBpdCkKKy0+ICJUUSBtYWMgdmFsdWUiIC0+IHNyYyBtYWMncyBsaW5rIHF1YWxpdHkgdG93YXJkcyBtYWMgYWRkcmVzcworLT4gIkhOQSBtYWMiIC0+IEhOQSBhbm5vdW5jZWQgYnkgc291cmNlIG1hYworLT4gIlBSSU1BUlkiIC0+IHRoaXMgaXMgYSBwcmltYXJ5IGludGVyZmFjZQorLT4gIlNFQyBtYWMiIC0+IHNlY29uZGFyeSBtYWMgYWRkcmVzcyBvZiBzb3VyY2UgKHJlcXVpcmVzIHByZWNlZWRpbmcKKy0+IFBSSU1BUlkpCisKKz0+IGxvZ2dpbmcKKyogdGhlIGxvZyBsZXZlbCBMT0dfVFlQRV9DUklULCBMT0dfVFlQRV9XQVJOICYgTE9HX1RZUEVfTk9USUNFIHdpbGwgYmUKKyogdW5pZmllZCB0byB1c2UgcHJpbnRrCisqIExPR19UWVBFX0JBVE1BTiAmIExPR19UWVBFX1JPVVRFUyB3aWxsIGFsc28gdXNlIHByaW50ayBidXQgb25seSBhZnRlciB0aGUKKyogaW50ZXJuYWwgZGVidWcgbGV2ZWwgaGFzIGJlZW4gcmFpc2VkCisqIHRoZSBpbnRlcm5hbCBkZWJ1ZyBsZXZlbCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgYSBtb2R1bGUgcGFyYW1ldGVyIChkZWJ1ZykKKyogb3IgYXQgcnVuIHRpbWUgdmlhIC9zeXMvbW9kdWxlL2JhdG1hbi1hZHYvcGFyYW1ldGVycy9kZWJ1ZworKiBtYWtlIHVzZSBvZiBwcmludGsgJXBNIHN1cHBvcnQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIG1hYyBhZGRyZXNzZXMKKyogbWFudWFsbHkKKworPT4gc3RyaXAgb3V0IGFsbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHN1cHBvcnQgdG8gb2xkZXIga2VybmVscworICAgKG9ubHkgZm91bmQgaW4gY29tcGF0LmgpCisKKz0+IGZpeCBjaGVja3BhdGNoLnBsIGVycm9ycworCitQbGVhc2Ugc2VuZCBhbGwgcGF0Y2hlcyB0bzoKKwlNYXJlayBMaW5kbmVyIDxsaW5kbmVyX21hcmVrQHlhaG9vLmRlPgorCVNpbW9uIFd1bmRlcmxpY2ggPHNpd3VAaHJ6LnR1LWNoZW1uaXR6LmRlPgorCUFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KKwliLmEudC5tLmEubkBsaXN0cy5vcGVuLW1lc2gubmV0CisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmU2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5jCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisKKy8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgaG5hIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIHBhY2tldCAqLworc3RhdGljIGludCBobmFfbGVuKHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0KQoreworCXJldHVybiBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU47Cit9CisKKy8qIHJldHVybiB0cnVlIGlmIG5ld19wYWNrZXQgY2FuIGJlIGFnZ3JlZ2F0ZWQgd2l0aCBmb3J3X3BhY2tldCAqLworc3RhdGljIGJvb2wgY2FuX2FnZ3JlZ2F0ZV93aXRoKHN0cnVjdCBiYXRtYW5fcGFja2V0ICpuZXdfYmF0bWFuX3BhY2tldCwKKwkJCSAgICAgICBpbnQgcGFja2V0X2xlbiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNlbmRfdGltZSwKKwkJCSAgICAgICBib29sIGRpcmVjdGxpbmssCisJCQkgICAgICAgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsCisJCQkgICAgICAgc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKK3sKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCA9CisJCShzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWZvcndfcGFja2V0LT5wYWNrZXRfYnVmZjsKKwlpbnQgYWdncmVnYXRlZF9ieXRlcyA9IGZvcndfcGFja2V0LT5wYWNrZXRfbGVuICsgcGFja2V0X2xlbjsKKworCS8qKgorCSAqIHdlIGNhbiBhZ2dyZWdhdGUgdGhlIGN1cnJlbnQgcGFja2V0IHRvIHRoaXMgYWdncmVnYXRlZCBwYWNrZXQKKwkgKiBpZjoKKwkgKgorCSAqIC0gdGhlIHNlbmQgdGltZSBpcyB3aXRoaW4gb3VyIE1BWF9BR0dSRUdBVElPTl9NUyB0aW1lCisJICogLSB0aGUgcmVzdWx0aW5nIHBhY2tldCB3b250IGJlIGJpZ2dlciB0aGFuCisJICogICBNQVhfQUdHUkVHQVRJT05fQllURVMKKwkgKi8KKworCWlmICh0aW1lX2JlZm9yZShzZW5kX3RpbWUsIGZvcndfcGFja2V0LT5zZW5kX3RpbWUpICYmCisJICAgIChhZ2dyZWdhdGVkX2J5dGVzIDw9IE1BWF9BR0dSRUdBVElPTl9CWVRFUykpIHsKKworCQkvKioKKwkJICogY2hlY2sgYWdncmVnYXRpb24gY29tcGF0aWJpbGl0eQorCQkgKiAtPiBkaXJlY3QgbGluayBwYWNrZXRzIGFyZSBicm9hZGNhc3RlZCBvbgorCQkgKiAgICB0aGVpciBpbnRlcmZhY2Ugb25seQorCQkgKiAtPiBhZ2dyZWdhdGUgcGFja2V0IGlmIHRoZSBjdXJyZW50IHBhY2tldCBpcworCQkgKiAgICBhICJnbG9iYWwiIHBhY2tldCBhcyB3ZWxsIGFzIHRoZSBiYXNlCisJCSAqICAgIHBhY2tldAorCQkgKi8KKworCQkvKiBwYWNrZXRzIHdpdGhvdXQgZGlyZWN0IGxpbmsgZmxhZyBhbmQgaGlnaCBUVEwKKwkJICogYXJlIGZsb29kZWQgdGhyb3VnaCB0aGUgbmV0ICAqLworCQlpZiAoKCFkaXJlY3RsaW5rKSAmJgorCQkgICAgKCEoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LKSkgJiYKKwkJICAgIChiYXRtYW5fcGFja2V0LT50dGwgIT0gMSkgJiYKKworCQkgICAgLyogb3duIHBhY2tldHMgb3JpZ2luYXRpbmcgbm9uLXByaW1hcnkKKwkJICAgICAqIGludGVyZmFjZXMgbGVhdmUgb25seSB0aGF0IGludGVyZmFjZSAqLworCQkgICAgKCghZm9yd19wYWNrZXQtPm93bikgfHwKKwkJICAgICAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9udW0gPT0gMCkpKQorCQkJcmV0dXJuIHRydWU7CisKKwkJLyogaWYgdGhlIGluY29taW5nIHBhY2tldCBpcyBzZW50IHZpYSB0aGlzIG9uZQorCQkgKiBpbnRlcmZhY2Ugb25seSAtIHdlIHN0aWxsIGNhbiBhZ2dyZWdhdGUgKi8KKwkJaWYgKChkaXJlY3RsaW5rKSAmJgorCQkgICAgKG5ld19iYXRtYW5fcGFja2V0LT50dGwgPT0gMSkgJiYKKwkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKQorCQkJcmV0dXJuIHRydWU7CisKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIGNyZWF0ZSBhIG5ldyBhZ2dyZWdhdGVkIHBhY2tldCBhbmQgYWRkIHRoaXMgcGFja2V0IHRvIGl0ICovCitzdGF0aWMgdm9pZCBuZXdfYWdncmVnYXRlZF9wYWNrZXQodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsCisJCQkgICBpbnQgcGFja2V0X2xlbiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lLAorCQkJICAgYm9vbCBkaXJlY3RfbGluaywKKwkJCSAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nLAorCQkJICAgaW50IG93bl9wYWNrZXQpCit7CisJc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyOworCisJZm9yd19wYWNrZXRfYWdnciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXRfYWdncikKKwkJcmV0dXJuOworCisJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2J1ZmYgPSBrbWFsbG9jKE1BWF9BR0dSRUdBVElPTl9CWVRFUywKKwkJCQkJCUdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2J1ZmYpIHsKKwkJa2ZyZWUoZm9yd19wYWNrZXRfYWdncik7CisJCXJldHVybjsKKwl9CisKKwlJTklUX0hMSVNUX05PREUoJmZvcndfcGFja2V0X2FnZ3ItPmxpc3QpOworCisJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47CisJbWVtY3B5KGZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9idWZmLAorCSAgICAgICBwYWNrZXRfYnVmZiwKKwkgICAgICAgZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbik7CisKKwlmb3J3X3BhY2tldF9hZ2dyLT5vd24gPSBvd25fcGFja2V0OworCWZvcndfcGFja2V0X2FnZ3ItPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7CisJZm9yd19wYWNrZXRfYWdnci0+bnVtX3BhY2tldHMgPSAwOworCWZvcndfcGFja2V0X2FnZ3ItPmRpcmVjdF9saW5rX2ZsYWdzID0gMDsKKwlmb3J3X3BhY2tldF9hZ2dyLT5zZW5kX3RpbWUgPSBzZW5kX3RpbWU7CisKKwkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLworCWlmIChkaXJlY3RfbGluaykKKwkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0gMTsKKworCS8qIGFkZCBuZXcgcGFja2V0IHRvIHBhY2tldCBsaXN0ICovCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZmb3J3X3BhY2tldF9hZ2dyLT5saXN0LCAmZm9yd19iYXRfbGlzdCk7CisJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisKKwkvKiBzdGFydCB0aW1lciBmb3IgdGhpcyBwYWNrZXQgKi8KKwlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXRfYWdnci0+ZGVsYXllZF93b3JrLAorCQkJICBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLAorCQkJICAgJmZvcndfcGFja2V0X2FnZ3ItPmRlbGF5ZWRfd29yaywKKwkJCSAgIHNlbmRfdGltZSAtIGppZmZpZXMpOworfQorCisvKiBhZ2dyZWdhdGUgYSBuZXcgcGFja2V0IGludG8gdGhlIGV4aXN0aW5nIGFnZ3JlZ2F0aW9uICovCitzdGF0aWMgdm9pZCBhZ2dyZWdhdGUoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldF9hZ2dyLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKKwkJICAgICAgaW50IHBhY2tldF9sZW4sCisJCSAgICAgIGJvb2wgZGlyZWN0X2xpbmspCit7CisJbWVtY3B5KChmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfYnVmZiArIGZvcndfcGFja2V0X2FnZ3ItPnBhY2tldF9sZW4pLAorCSAgICAgICBwYWNrZXRfYnVmZiwgcGFja2V0X2xlbik7CisJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiArPSBwYWNrZXRfbGVuOworCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzKys7CisKKwkvKiBzYXZlIHBhY2tldCBkaXJlY3QgbGluayBmbGFnIHN0YXR1cyAqLworCWlmIChkaXJlY3RfbGluaykKKwkJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgfD0KKwkJCSgxIDw8IGZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzKTsKK30KKwordm9pZCBhZGRfYmF0X3BhY2tldF90b19saXN0KHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLCBpbnQgcGFja2V0X2xlbiwKKwkJCSAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZywgY2hhciBvd25fcGFja2V0LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgc2VuZF90aW1lKQoreworCS8qKgorCSAqIF9hZ2dyIC0+IHBvaW50ZXIgdG8gdGhlIHBhY2tldCB3ZSB3YW50IHRvIGFnZ3JlZ2F0ZSB3aXRoCisJICogX3BvcyAtPiBwb2ludGVyIHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgcXVldWUKKwkgKi8KKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0X2FnZ3IgPSBOVUxMLCAqZm9yd19wYWNrZXRfcG9zID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wX25vZGU7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQgPQorCQkoc3RydWN0IGJhdG1hbl9wYWNrZXQgKilwYWNrZXRfYnVmZjsKKwlib29sIGRpcmVjdF9saW5rID0gYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8gMSA6IDA7CisKKwkvKiBmaW5kIHBvc2l0aW9uIGZvciB0aGUgcGFja2V0IGluIHRoZSBmb3J3YXJkIHF1ZXVlICovCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCS8qIG93biBwYWNrZXRzIGFyZSBub3QgdG8gYmUgYWdncmVnYXRlZCAqLworCWlmICgoYXRvbWljX3JlYWQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQpKSAmJiAoIW93bl9wYWNrZXQpKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZvcndfcGFja2V0X3BvcywgdG1wX25vZGUsICZmb3J3X2JhdF9saXN0LAorCQkJCSAgICAgbGlzdCkgeworCQkJaWYgKGNhbl9hZ2dyZWdhdGVfd2l0aChiYXRtYW5fcGFja2V0LAorCQkJCQkgICAgICAgcGFja2V0X2xlbiwKKwkJCQkJICAgICAgIHNlbmRfdGltZSwKKwkJCQkJICAgICAgIGRpcmVjdF9saW5rLAorCQkJCQkgICAgICAgaWZfaW5jb21pbmcsCisJCQkJCSAgICAgICBmb3J3X3BhY2tldF9wb3MpKSB7CisJCQkJZm9yd19wYWNrZXRfYWdnciA9IGZvcndfcGFja2V0X3BvczsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIG5vdGhpbmcgdG8gYWdncmVnYXRlIHdpdGggLSBlaXRoZXIgYWdncmVnYXRpb24gZGlzYWJsZWQgb3Igbm8KKwkgKiBzdWl0YWJsZSBhZ2dyZWdhdGlvbiBwYWNrZXQgZm91bmQgKi8KKwlpZiAoZm9yd19wYWNrZXRfYWdnciA9PSBOVUxMKSB7CisJCS8qIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBjYW4gcnVuIHdpdGhvdXQgdGhlIGxvY2sgKi8KKwkJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisJCW5ld19hZ2dyZWdhdGVkX3BhY2tldChwYWNrZXRfYnVmZiwgcGFja2V0X2xlbiwKKwkJCQkgICAgICBzZW5kX3RpbWUsIGRpcmVjdF9saW5rLAorCQkJCSAgICAgIGlmX2luY29taW5nLCBvd25fcGFja2V0KTsKKwl9IGVsc2UgeworCQlhZ2dyZWdhdGUoZm9yd19wYWNrZXRfYWdnciwKKwkJCSAgcGFja2V0X2J1ZmYsIHBhY2tldF9sZW4sCisJCQkgIGRpcmVjdF9saW5rKTsKKwkJc3Bpbl91bmxvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisJfQorfQorCisvKiB1bnBhY2sgdGhlIGFnZ3JlZ2F0ZWQgcGFja2V0cyBhbmQgcHJvY2VzcyB0aGVtIG9uZSBieSBvbmUgKi8KK3ZvaWQgcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCB1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwKKwkJCSAgICAgaW50IHBhY2tldF9sZW4sIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OworCWludCBidWZmX3BvcyA9IDA7CisJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7CisKKwliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopcGFja2V0X2J1ZmY7CisKKwl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsIHBhY2tldF9sZW4sCisJCQkJIGJhdG1hbl9wYWNrZXQtPm51bV9obmEpKSB7CisKKwkJLyogbmV0d29yayB0byBob3N0IG9yZGVyIGZvciBvdXIgMTZiaXQgc2Vxbm8sIGFuZCB0aGUKKwkJICAgb3JpZ19pbnRlcnZhbC4gKi8KKwkJYmF0bWFuX3BhY2tldC0+c2Vxbm8gPSBudG9ocyhiYXRtYW5fcGFja2V0LT5zZXFubyk7CisKKwkJaG5hX2J1ZmYgPSBwYWNrZXRfYnVmZiArIGJ1ZmZfcG9zICsgQkFUX1BBQ0tFVF9MRU47CisJCXJlY2VpdmVfYmF0X3BhY2tldChldGhoZHIsIGJhdG1hbl9wYWNrZXQsCisJCQkJICAgaG5hX2J1ZmYsIGhuYV9sZW4oYmF0bWFuX3BhY2tldCksCisJCQkJICAgaWZfaW5jb21pbmcpOworCisJCWJ1ZmZfcG9zICs9IEJBVF9QQUNLRVRfTEVOICsgaG5hX2xlbihiYXRtYW5fcGFja2V0KTsKKwkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKQorCQkJKHBhY2tldF9idWZmICsgYnVmZl9wb3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2FnZ3JlZ2F0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYThkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9hZ2dyZWdhdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorCisvKiBpcyB0aGVyZSBhbm90aGVyIGFnZ3JlZ2F0ZWQgcGFja2V0IGhlcmU/ICovCitzdGF0aWMgaW5saW5lIGludCBhZ2dyZWdhdGVkX3BhY2tldChpbnQgYnVmZl9wb3MsIGludCBwYWNrZXRfbGVuLCBpbnQgbnVtX2huYSkKK3sKKwlpbnQgbmV4dF9idWZmX3BvcyA9IGJ1ZmZfcG9zICsgQkFUX1BBQ0tFVF9MRU4gKyAobnVtX2huYSAqIEVUSF9BTEVOKTsKKworCXJldHVybiAobmV4dF9idWZmX3BvcyA8PSBwYWNrZXRfbGVuKSAmJgorCQkobmV4dF9idWZmX3BvcyA8PSBNQVhfQUdHUkVHQVRJT05fQllURVMpOworfQorCit2b2lkIGFkZF9iYXRfcGFja2V0X3RvX2xpc3QodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuLAorCQkJICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX291dGdvaW5nLCBjaGFyIG93bl9wYWNrZXQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpOwordm9pZCByZWNlaXZlX2FnZ3JfYmF0X3BhY2tldChzdHJ1Y3QgZXRoaGRyICpldGhoZHIsIHVuc2lnbmVkIGNoYXIgKnBhY2tldF9idWZmLAorCQkJICAgICBpbnQgcGFja2V0X2xlbiwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2N2Y1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIFNpbW9uIFd1bmRlcmxpY2gsIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgImJpdGFycmF5LmgiCisjaW5jbHVkZSAibG9nLmgiCisKKy8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGdpdmVuIHNlcV9iaXRzIGluZGljYXRlcyB0cnVlCisgKiBhbmQgY3Vycl9zZXFubyBpcyB3aXRoaW4gcmFuZ2Ugb2YgbGFzdF9zZXFubyAqLwordWludDhfdCBnZXRfYml0X3N0YXR1cyhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCB1aW50MTZfdCBsYXN0X3NlcW5vLAorCQkgICAgICAgdWludDE2X3QgY3Vycl9zZXFubykKK3sKKwlpbnQxNl90IGRpZmYsIHdvcmRfb2Zmc2V0LCB3b3JkX251bTsKKworCWRpZmYgPSBsYXN0X3NlcW5vIC0gY3Vycl9zZXFubzsKKwlpZiAoZGlmZiA8IDAgfHwgZGlmZiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiB3aGljaCB3b3JkICovCisJCXdvcmRfbnVtID0gKGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vKSAvIFdPUkRfQklUX1NJWkU7CisJCS8qIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBzZWxlY3RlZCB3b3JkICovCisJCXdvcmRfb2Zmc2V0ID0gKGxhc3Rfc2Vxbm8gLSBjdXJyX3NlcW5vKSAlIFdPUkRfQklUX1NJWkU7CisKKwkJaWYgKHNlcV9iaXRzW3dvcmRfbnVtXSAmIDEgPDwgd29yZF9vZmZzZXQpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKiB0dXJuIGNvcnJlc3BvbmRpbmcgYml0IG9uLCBzbyB3ZSBjYW4gcmVtZW1iZXIgdGhhdCB3ZSBnb3QgdGhlIHBhY2tldCAqLwordm9pZCBiaXRfbWFyayhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCit7CisJaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07CisKKwkvKiBpZiB0b28gb2xkLCBqdXN0IGRyb3AgaXQgKi8KKwlpZiAobiA8IDAgfHwgbiA+PSBUUV9MT0NBTF9XSU5ET1dfU0laRSkKKwkJcmV0dXJuOworCisJLyogd2hpY2ggd29yZCAqLworCXdvcmRfbnVtID0gbiAvIFdPUkRfQklUX1NJWkU7CisJLyogd2hpY2ggcG9zaXRpb24gaW4gdGhlIHNlbGVjdGVkIHdvcmQgKi8KKwl3b3JkX29mZnNldCA9IG4gJSBXT1JEX0JJVF9TSVpFOworCisJc2VxX2JpdHNbd29yZF9udW1dIHw9IDEgPDwgd29yZF9vZmZzZXQ7CS8qIHR1cm4gdGhlIHBvc2l0aW9uIG9uICovCit9CisKKy8qIHNoaWZ0IHRoZSBwYWNrZXQgYXJyYXkgYnkgbiBwbGFjZXMuICovCit2b2lkIGJpdF9zaGlmdChUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pCit7CisJaW50MzJfdCB3b3JkX29mZnNldCwgd29yZF9udW07CisJaW50MzJfdCBpOworCisJaWYgKG4gPD0gMCkKKwkJcmV0dXJuOworCisJd29yZF9vZmZzZXQgPSBuICUgV09SRF9CSVRfU0laRTsvKiBzaGlmdCBob3cgbXVjaCBpbnNpZGUgZWFjaCB3b3JkICovCisJd29yZF9udW0gPSBuIC8gV09SRF9CSVRfU0laRTsJLyogc2hpZnQgb3ZlciBob3cgbXVjaCAoZnVsbCkgd29yZHMgKi8KKworCWZvciAoaSA9IE5VTV9XT1JEUyAtIDE7IGkgPiB3b3JkX251bTsgaS0tKSB7CisJCS8qIGdvaW5nIGZyb20gb2xkIHRvIG5ldywgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSBkYXRhIHdlIGNvcHkKKwkJICogZnJvbS4KKwkJICoKKwkJICogbGVmdCBpcyBoaWdoLCByaWdodCBpcyBsb3c6IEZFREMgQkE5OCA3NjU0IDMyMTAKKwkJICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eIF5eCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dnZ2CisJCSAqIF5eXl4gPSBmcm9tLCB2dnZ2diA9dG8sIHdlJ2QgaGF2ZSB3b3JkX251bT09MSBhbmQKKwkJICogd29yZF9vZmZzZXQ9PVdPUkRfQklUX1NJWkUvMiA/Pz8/PyBpbiB0aGlzIGV4YW1wbGUuCisJCSAqICg9MjQgYml0cykKKwkJICoKKwkJICogb3VyIGRlc2lyZWQgb3V0cHV0IHdvdWxkIGJlOiA5ODc2IDU0MzIgMTAwMCAwMDAwCisJCSAqICovCisKKwkJc2VxX2JpdHNbaV0gPQorCQkJKHNlcV9iaXRzW2kgLSB3b3JkX251bV0gPDwgd29yZF9vZmZzZXQpICsKKwkJCS8qIHRha2UgdGhlIGxvd2VyIHBvcnQgZnJvbSB0aGUgbGVmdCBoYWxmLCBzaGlmdCBpdCBsZWZ0CisJCQkgKiB0byBpdHMgZmluYWwgcG9zaXRpb24gKi8KKwkJCShzZXFfYml0c1tpIC0gd29yZF9udW0gLSAxXSA+PgorCQkJIChXT1JEX0JJVF9TSVpFLXdvcmRfb2Zmc2V0KSk7CisJCS8qIGFuZCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmlnaHQgaGFsZiBhbmQgc2hpZnQgaXQgbGVmdCB0bworCQkgKiBpdCdzIHBvc2l0aW9uICovCisJCS8qIGZvciBvdXIgZXhhbXBsZSB0aGF0IHdvdWxkIGJlOiB3b3JkWzBdID0gOTgwMCArIDAwNzYgPQorCQkgKiA5ODc2ICovCisJfQorCS8qIG5vdyBmb3Igb3VyIGxhc3Qgd29yZCwgaT09d29yZF9udW0sIHdlIG9ubHkgaGF2ZSB0aGUgaXQncyAibGVmdCIKKwkgKiBoYWxmLiB0aGF0J3MgdGhlIDEwMDAgd29yZCBpbiBvdXIgZXhhbXBsZS4qLworCisJc2VxX2JpdHNbaV0gPSAoc2VxX2JpdHNbaSAtIHdvcmRfbnVtXSA8PCB3b3JkX29mZnNldCk7CisKKwkvKiBwYWQgdGhlIHJlc3Qgd2l0aCAwLCBpZiB0aGVyZSBpcyBhbnl0aGluZyAqLworCWktLTsKKworCWZvciAoOyBpID49IDA7IGktLSkKKwkJc2VxX2JpdHNbaV0gPSAwOworfQorCisKKy8qIHJlY2VpdmUgYW5kIHByb2Nlc3Mgb25lIHBhY2tldCwgcmV0dXJucyAxIGlmIHJlY2VpdmVkIHNlcV9udW0gaXMgY29uc2lkZXJlZAorICogbmV3LCAwIGlmIG9sZCAgKi8KK2NoYXIgYml0X2dldF9wYWNrZXQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MTZfdCBzZXFfbnVtX2RpZmYsCisJCSAgICBpbnQ4X3Qgc2V0X21hcmspCit7CisJaW50IGk7CisKKwkvKiB3ZSBhbHJlYWR5IGdvdCBhIHNlcXVlbmNlIG51bWJlciBoaWdoZXIgdGhhbiB0aGlzIG9uZSwgc28gd2UganVzdAorCSAqIG1hcmsgaXQuIHRoaXMgc2hvdWxkIHdyYXAgYXJvdW5kIHRoZSBpbnRlZ2VyIGp1c3QgZmluZSAqLworCWlmICgoc2VxX251bV9kaWZmIDwgMCkgJiYgKHNlcV9udW1fZGlmZiA+PSAtVFFfTE9DQUxfV0lORE9XX1NJWkUpKSB7CisJCWlmIChzZXRfbWFyaykKKwkJCWJpdF9tYXJrKHNlcV9iaXRzLCAtc2VxX251bV9kaWZmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogaXQgc2VlbXMgd2UgbWlzc2VkIGEgbG90IG9mIHBhY2tldHMgb3IgdGhlIG90aGVyIGhvc3QgcmVzdGFydGVkICovCisJaWYgKChzZXFfbnVtX2RpZmYgPiBUUV9MT0NBTF9XSU5ET1dfU0laRSkgfHwKKwkgICAgKHNlcV9udW1fZGlmZiA8IC1UUV9MT0NBTF9XSU5ET1dfU0laRSkpIHsKKworCQlpZiAoc2VxX251bV9kaWZmID4gVFFfTE9DQUxfV0lORE9XX1NJWkUpCisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLAorCQkJCSAgIldlIG1pc3NlZCBhIGxvdCBvZiBwYWNrZXRzICglaSkgIVxuIiwKKwkJCQkgIHNlcV9udW1fZGlmZi0xKTsKKworCQlpZiAoLXNlcV9udW1fZGlmZiA+IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQorCQkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwKKwkJCQkgICJPdGhlciBob3N0IHByb2JhYmx5IHJlc3RhcnRlZCAhXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1dPUkRTOyBpKyspCisJCQlzZXFfYml0c1tpXSA9IDA7CisKKwkJaWYgKHNldF9tYXJrKQorCQkJc2VxX2JpdHNbMF0gPSAxOyAgLyogd2Ugb25seSBoYXZlIHRoZSBsYXRlc3QgcGFja2V0ICovCisJfSBlbHNlIHsKKwkJYml0X3NoaWZ0KHNlcV9iaXRzLCBzZXFfbnVtX2RpZmYpOworCisJCWlmIChzZXRfbWFyaykKKwkJCWJpdF9tYXJrKHNlcV9iaXRzLCAwKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogY291bnQgdGhlIGhhbW1pbmcgd2VpZ2h0LCBob3cgbWFueSBnb29kIHBhY2tldHMgZGlkIHdlIHJlY2VpdmU/IGp1c3QgY291bnQKKyAqIHRoZSAxJ3MuIFRoZSBpbm5lciBsb29wIHVzZXMgdGhlIEtlcm5pZ2hhbiBhbGdvcml0aG0sIHNlZQorICogaHR0cDovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9+c2VhbmRlci9iaXRoYWNrcy5odG1sI0NvdW50Qml0c1NldEtlcm5pZ2hhbgorICovCitpbnQgYml0X3BhY2tldF9jb3VudChUWVBFX09GX1dPUkQgKnNlcV9iaXRzKQoreworCWludCBpLCBoYW1taW5nID0gMDsKKwlUWVBFX09GX1dPUkQgd29yZDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fV09SRFM7IGkrKykgeworCQl3b3JkID0gc2VxX2JpdHNbaV07CisKKwkJd2hpbGUgKHdvcmQpIHsKKwkJCXdvcmQgJj0gd29yZC0xOworCQkJaGFtbWluZysrOworCQl9CisJfQorCXJldHVybiBoYW1taW5nOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvYml0YXJyYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3MmRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2JpdGFycmF5LmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKworLyogeW91IHNob3VsZCBjaG9vc2Ugc29tZXRoaW5nIGJpZywgaWYgeW91IGRvbid0IHdhbnQgdG8gd2FzdGUgY3B1ICovCisjZGVmaW5lIFRZUEVfT0ZfV09SRCB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFdPUkRfQklUX1NJWkUgKHNpemVvZihUWVBFX09GX1dPUkQpICogOCkKKworLyogcmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgZ2l2ZW4gc2VxX2JpdHMgaW5kaWNhdGVzIHRydWUKKyAqIGFuZCBjdXJyX3NlcW5vIGlzIHdpdGhpbiByYW5nZSBvZiBsYXN0X3NlcW5vICovCit1aW50OF90IGdldF9iaXRfc3RhdHVzKFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIHVpbnQxNl90IGxhc3Rfc2Vxbm8sCisJCQkJCSAgIHVpbnQxNl90IGN1cnJfc2Vxbm8pOworCisvKiB0dXJuIGNvcnJlc3BvbmRpbmcgYml0IG9uLCBzbyB3ZSBjYW4gcmVtZW1iZXIgdGhhdCB3ZSBnb3QgdGhlIHBhY2tldCAqLwordm9pZCBiaXRfbWFyayhUWVBFX09GX1dPUkQgKnNlcV9iaXRzLCBpbnQzMl90IG4pOworCisvKiBzaGlmdCB0aGUgcGFja2V0IGFycmF5IGJ5IG4gcGxhY2VzLiAqLwordm9pZCBiaXRfc2hpZnQoVFlQRV9PRl9XT1JEICpzZXFfYml0cywgaW50MzJfdCBuKTsKKworCisvKiByZWNlaXZlIGFuZCBwcm9jZXNzIG9uZSBwYWNrZXQsIHJldHVybnMgMSBpZiByZWNlaXZlZCBzZXFfbnVtIGlzIGNvbnNpZGVyZWQKKyAqIG5ldywgMCBpZiBvbGQgICovCitjaGFyIGJpdF9nZXRfcGFja2V0KFRZUEVfT0ZfV09SRCAqc2VxX2JpdHMsIGludDE2X3Qgc2VxX251bV9kaWZmLAorCQkJCQlpbnQ4X3Qgc2V0X21hcmspOworCisvKiBjb3VudCB0aGUgaGFtbWluZyB3ZWlnaHQsIGhvdyBtYW55IGdvb2QgcGFja2V0cyBkaWQgd2UgcmVjZWl2ZT8gKi8KK2ludCAgYml0X3BhY2tldF9jb3VudChUWVBFX09GX1dPUkQgKnNlcV9iaXRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlMGE0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2NvbXBhdC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFjcm9zIGZvciBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKKyAqIG9mIHRoZSBMaW51eCBrZXJuZWwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogTElOVVhfVkVSU0lPTl9DT0RFICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyMikKKworI2RlZmluZSBza2Jfc2V0X25ldHdvcmtfaGVhZGVyKF9za2IsIF9vZmZzZXQpIFwKKwlkbyB7IChfc2tiKS0+bmgucmF3ID0gKF9za2IpLT5kYXRhICsgKF9vZmZzZXQpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHNrYl9yZXNldF9tYWNfaGVhZGVyKF9za2IpIFwKKwlkbyB7IChfc2tiKS0+bWFjLnJhdyA9IChfc2tiKS0+ZGF0YTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJbGlzdF9lbnRyeSgocHRyKS0+bmV4dCwgdHlwZSwgbWVtYmVyKQorCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjIpICovCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI2KQorCisjZGVmaW5lIGRldmljZV9jcmVhdGUoX2NscywgX3BhcmVudCwgX2RldnQsIF9kZXZpY2UsIF9mbXQpIFwKKwljbGFzc19kZXZpY2VfY3JlYXRlKF9jbHMsIF9wYXJlbnQsIF9kZXZ0LCBfZGV2aWNlLCBfZm10KQorCisjZGVmaW5lIGRldmljZV9kZXN0cm95KF9jbHMsIF9kZXZpY2UpIFwKKwljbGFzc19kZXZpY2VfZGVzdHJveShfY2xzLCBfZGV2aWNlKQorCisjZWxzZQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjcpCisKKyNkZWZpbmUgZGV2aWNlX2NyZWF0ZShfY2xzLCBfcGFyZW50LCBfZGV2dCwgX2RldmljZSwgX2ZtdCkgXAorCWRldmljZV9jcmVhdGVfZHJ2ZGF0YShfY2xzLCBfcGFyZW50LCBfZGV2dCwgX2RldmljZSwgX2ZtdCkKKworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI3KSAqLworCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjYpICovCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyMykKKworI2RlZmluZSBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMod3EpIGNhbmNlbF9yZWFybWluZ19kZWxheWVkX3dvcmsod3EpCisKKyNlbmRpZiAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyMykgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAyNSkKKyNkZWZpbmUgc3RyaWN0X3N0cnRvdWwoY3AsIGJhc2UsIHJlcykgXAorCSh7IFwKKwlpbnQgcmV0ID0gMDsgXAorCWNoYXIgKmVuZHA7IFwKKwkqcmVzID0gc2ltcGxlX3N0cnRvdWwoY3AsICZlbmRwLCBiYXNlKTsgXAorCWlmIChjcCA9PSBlbmRwKSBcCisJCXJldCA9IC1FSU5WQUw7IFwKKwlyZXQ7IFwKK30pCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNiwgMjUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlN2QxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9kZXZpY2UuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiZGV2aWNlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorCisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmJhdG1hbl9jbGFzczsKKworc3RhdGljIGludCBNYWpvcjsJLyogTWFqb3IgbnVtYmVyIGFzc2lnbmVkIHRvIG91ciBkZXZpY2UgZHJpdmVyICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHMgPSB7CisJLm9wZW4gPSBiYXRfZGV2aWNlX29wZW4sCisJLnJlbGVhc2UgPSBiYXRfZGV2aWNlX3JlbGVhc2UsCisJLnJlYWQgPSBiYXRfZGV2aWNlX3JlYWQsCisJLndyaXRlID0gYmF0X2RldmljZV93cml0ZSwKKwkucG9sbCA9IGJhdF9kZXZpY2VfcG9sbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudF9oYXNoWzI1Nl07CisKK3ZvaWQgYmF0X2RldmljZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWRldmljZV9jbGllbnRfaGFzaFtpXSA9IE5VTEw7Cit9CisKK2ludCBiYXRfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJaW50IHRtcF9tYWpvcjsKKworCWlmIChNYWpvcikKKwkJcmV0dXJuIDE7CisKKwkvKiByZWdpc3RlciBvdXIgZGV2aWNlIC0ga2VybmVsIGFzc2lnbnMgYSBmcmVlIG1ham9yIG51bWJlciAqLworCXRtcF9tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBEUklWRVJfREVWSUNFLCAmZm9wcyk7CisJaWYgKHRtcF9tYWpvciA8IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJSZWdpc3RlcmluZyB0aGUgY2hhcmFjdGVyIGRldmljZSBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCSAgdG1wX21ham9yKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYmF0bWFuX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiYmF0bWFuLWFkdiIpOworCisJaWYgKElTX0VSUihiYXRtYW5fY2xhc3MpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ291bGQgbm90IHJlZ2lzdGVyIGNsYXNzICdiYXRtYW4tYWR2JyBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZpY2VfY3JlYXRlKGJhdG1hbl9jbGFzcywgTlVMTCwgTUtERVYodG1wX21ham9yLCAwKSwgTlVMTCwKKwkJICAgICAgImJhdG1hbi1hZHYiKTsKKworCU1ham9yID0gdG1wX21ham9yOworCXJldHVybiAxOworfQorCit2b2lkIGJhdF9kZXZpY2VfZGVzdHJveSh2b2lkKQoreworCWlmICghTWFqb3IpCisJCXJldHVybjsKKworCWRldmljZV9kZXN0cm95KGJhdG1hbl9jbGFzcywgTUtERVYoTWFqb3IsIDApKTsKKwljbGFzc19kZXN0cm95KGJhdG1hbl9jbGFzcyk7CisKKwkvKiBVbnJlZ2lzdGVyIHRoZSBkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX2NocmRldihNYWpvciwgRFJJVkVSX0RFVklDRSk7CisKKwlNYWpvciA9IDA7Cit9CisKK2ludCBiYXRfZGV2aWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQ7CisKKwlkZXZpY2VfY2xpZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9jbGllbnQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2aWNlX2NsaWVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaWYgKCFkZXZpY2VfY2xpZW50X2hhc2hbaV0pIHsKKwkJCWRldmljZV9jbGllbnRfaGFzaFtpXSA9IGRldmljZV9jbGllbnQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkZXZpY2VfY2xpZW50X2hhc2hbaV0gIT0gZGV2aWNlX2NsaWVudCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkVycm9yIC0gY2FuJ3QgYWRkIGFub3RoZXIgcGFja2V0IGNsaWVudDogbWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyByZWFjaGVkIFxuIik7CisJCWtmcmVlKGRldmljZV9jbGllbnQpOworCQlyZXR1cm4gLUVYRlVMTDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCk7CisJZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuID0gMDsKKwlkZXZpY2VfY2xpZW50LT5pbmRleCA9IGk7CisJZGV2aWNlX2NsaWVudC0+bG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGRldmljZV9jbGllbnQtPmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldmljZV9jbGllbnQtPnF1ZXVlX3dhaXQpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2aWNlX2NsaWVudDsKKworCWluY19tb2R1bGVfY291bnQoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJhdF9kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCA9CisJCShzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlX3BhY2tldCAqZGV2aWNlX3BhY2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X3BvcywgKmxpc3RfcG9zX3RtcDsKKworCXNwaW5fbG9jaygmZGV2aWNlX2NsaWVudC0+bG9jayk7CisKKwkvKiBmb3IgYWxsIHBhY2tldHMgaW4gdGhlIHF1ZXVlIC4uLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X3BvcywgbGlzdF9wb3NfdG1wLCAmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCkgeworCQlkZXZpY2VfcGFja2V0ID0gbGlzdF9lbnRyeShsaXN0X3BvcywKKwkJCQkJICAgc3RydWN0IGRldmljZV9wYWNrZXQsIGxpc3QpOworCisJCWxpc3RfZGVsKGxpc3RfcG9zKTsKKwkJa2ZyZWUoZGV2aWNlX3BhY2tldCk7CisJfQorCisJZGV2aWNlX2NsaWVudF9oYXNoW2RldmljZV9jbGllbnQtPmluZGV4XSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJa2ZyZWUoZGV2aWNlX2NsaWVudCk7CisJZGVjX21vZHVsZV9jb3VudCgpOworCisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgYmF0X2RldmljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQlsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmRldmljZV9jbGllbnQgPQorCQkoc3RydWN0IGRldmljZV9jbGllbnQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldmljZV9wYWNrZXQgKmRldmljZV9wYWNrZXQ7CisJaW50IGVycm9yOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgKGRldmljZV9jbGllbnQtPnF1ZXVlX2xlbiA9PSAwKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKCFidWYpIHx8IChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldmljZV9jbGllbnQtPnF1ZXVlX3dhaXQsCisJCQkJCSBkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4pOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzcGluX2xvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJZGV2aWNlX3BhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJmRldmljZV9jbGllbnQtPnF1ZXVlX2xpc3QsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX3BhY2tldCwgbGlzdCk7CisJbGlzdF9kZWwoJmRldmljZV9wYWNrZXQtPmxpc3QpOworCWRldmljZV9jbGllbnQtPnF1ZXVlX2xlbi0tOworCisJc3Bpbl91bmxvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJZXJyb3IgPSBfX2NvcHlfdG9fdXNlcihidWYsICZkZXZpY2VfcGFja2V0LT5pY21wX3BhY2tldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSk7CisKKwlrZnJlZShkZXZpY2VfcGFja2V0KTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpOworfQorCitzc2l6ZV90IGJhdF9kZXZpY2Vfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmLAorCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KKwkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpY21wX3BhY2tldCBpY21wX3BhY2tldDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCisJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6IGludmFsaWQgcGFja2V0IHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZiwgc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZpY21wX3BhY2tldCwgYnVmZiwgc2l6ZW9mKGljbXBfcGFja2V0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGljbXBfcGFja2V0LnBhY2tldF90eXBlICE9IEJBVF9JQ01QKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gY2hhciBkZXZpY2U6IGdvdCBib2d1cyBwYWNrZXQgdHlwZSAoZXhwZWN0ZWQ6IEJBVF9JQ01QKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpY21wX3BhY2tldC5tc2dfdHlwZSAhPSBFQ0hPX1JFUVVFU1QpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSBjaGFyIGRldmljZTogZ290IGJvZ3VzIG1lc3NhZ2UgdHlwZSAoZXhwZWN0ZWQ6IEVDSE9fUkVRVUVTVClcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpY21wX3BhY2tldC51aWQgPSBkZXZpY2VfY2xpZW50LT5pbmRleDsKKworCWlmIChpY21wX3BhY2tldC52ZXJzaW9uICE9IENPTVBBVF9WRVJTSU9OKSB7CisJCWljbXBfcGFja2V0Lm1zZ190eXBlID0gUEFSQU1FVEVSX1BST0JMRU07CisJCWljbXBfcGFja2V0LnR0bCA9IENPTVBBVF9WRVJTSU9OOworCQliYXRfZGV2aWNlX2FkZF9wYWNrZXQoZGV2aWNlX2NsaWVudCwgJmljbXBfcGFja2V0KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9BQ1RJVkUpCisJCWdvdG8gZHN0X3VucmVhY2g7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC5kc3QpKTsKKworCWlmICghb3JpZ19ub2RlKQorCQlnb3RvIHVubG9jazsKKworCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCisJCWdvdG8gdW5sb2NrOworCisJYmF0bWFuX2lmID0gb3JpZ19ub2RlLT5iYXRtYW5faWY7CisKKwlpZiAoIWJhdG1hbl9pZikKKwkJZ290byB1bmxvY2s7CisKKwltZW1jcHkoaWNtcF9wYWNrZXQub3JpZywKKwkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwKKwkgICAgICAgRVRIX0FMRU4pOworCisJc2VuZF9yYXdfcGFja2V0KCh1bnNpZ25lZCBjaGFyICopJmljbXBfcGFja2V0LAorCQkJc2l6ZW9mKHN0cnVjdCBpY21wX3BhY2tldCksCisJCQliYXRtYW5faWYsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJZ290byBvdXQ7CisKK3VubG9jazoKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworZHN0X3VucmVhY2g6CisJaWNtcF9wYWNrZXQubXNnX3R5cGUgPSBERVNUSU5BVElPTl9VTlJFQUNIQUJMRTsKKwliYXRfZGV2aWNlX2FkZF9wYWNrZXQoZGV2aWNlX2NsaWVudCwgJmljbXBfcGFja2V0KTsKK291dDoKKwlyZXR1cm4gbGVuOworfQorCit1bnNpZ25lZCBpbnQgYmF0X2RldmljZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50ID0KKwkJKHN0cnVjdCBkZXZpY2VfY2xpZW50ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZkZXZpY2VfY2xpZW50LT5xdWV1ZV93YWl0LCB3YWl0KTsKKworCWlmIChkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4gPiAwKQorCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiAwOworfQorCit2b2lkIGJhdF9kZXZpY2VfYWRkX3BhY2tldChzdHJ1Y3QgZGV2aWNlX2NsaWVudCAqZGV2aWNlX2NsaWVudCwKKwkJCSAgIHN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQpCit7CisJc3RydWN0IGRldmljZV9wYWNrZXQgKmRldmljZV9wYWNrZXQ7CisKKwlkZXZpY2VfcGFja2V0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZV9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKKworCWlmICghZGV2aWNlX3BhY2tldCkKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJmRldmljZV9wYWNrZXQtPmxpc3QpOworCW1lbWNweSgmZGV2aWNlX3BhY2tldC0+aWNtcF9wYWNrZXQsIGljbXBfcGFja2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGljbXBfcGFja2V0KSk7CisKKwlzcGluX2xvY2soJmRldmljZV9jbGllbnQtPmxvY2spOworCisJLyogd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2sgdGhlIGRldmljZV9jbGllbnQgY291bGQgaGF2ZSBiZWVuCisJICogZGVsZXRlZCAqLworCWlmICghZGV2aWNlX2NsaWVudF9oYXNoW2ljbXBfcGFja2V0LT51aWRdKSB7CisJCXNwaW5fdW5sb2NrKCZkZXZpY2VfY2xpZW50LT5sb2NrKTsKKwkJa2ZyZWUoZGV2aWNlX3BhY2tldCk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZkZXZpY2VfcGFja2V0LT5saXN0LCAmZGV2aWNlX2NsaWVudC0+cXVldWVfbGlzdCk7CisJZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuKys7CisKKwlpZiAoZGV2aWNlX2NsaWVudC0+cXVldWVfbGVuID4gMTAwKSB7CisJCWRldmljZV9wYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkZXZpY2VfY2xpZW50LT5xdWV1ZV9saXN0LAorCQkJCQkJIHN0cnVjdCBkZXZpY2VfcGFja2V0LCBsaXN0KTsKKworCQlsaXN0X2RlbCgmZGV2aWNlX3BhY2tldC0+bGlzdCk7CisJCWtmcmVlKGRldmljZV9wYWNrZXQpOworCQlkZXZpY2VfY2xpZW50LT5xdWV1ZV9sZW4tLTsKKwl9CisKKwlzcGluX3VubG9jaygmZGV2aWNlX2NsaWVudC0+bG9jayk7CisKKwl3YWtlX3VwKCZkZXZpY2VfY2xpZW50LT5xdWV1ZV93YWl0KTsKK30KKwordm9pZCBiYXRfZGV2aWNlX3JlY2VpdmVfcGFja2V0KHN0cnVjdCBpY21wX3BhY2tldCAqaWNtcF9wYWNrZXQpCit7CisJc3RydWN0IGRldmljZV9jbGllbnQgKmhhc2ggPSBkZXZpY2VfY2xpZW50X2hhc2hbaWNtcF9wYWNrZXQtPnVpZF07CisKKwlpZiAoaGFzaCkKKwkJYmF0X2RldmljZV9hZGRfcGFja2V0KGhhc2gsIGljbXBfcGFja2V0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjMGY0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2RldmljZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAidHlwZXMuaCIKKwordm9pZCBiYXRfZGV2aWNlX2luaXQodm9pZCk7CitpbnQgYmF0X2RldmljZV9zZXR1cCh2b2lkKTsKK3ZvaWQgYmF0X2RldmljZV9kZXN0cm95KHZvaWQpOworaW50IGJhdF9kZXZpY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgYmF0X2RldmljZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3NzaXplX3QgYmF0X2RldmljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQlsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBiYXRfZGV2aWNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZiwKKwkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZik7Cit1bnNpZ25lZCBpbnQgYmF0X2RldmljZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3ZvaWQgYmF0X2RldmljZV9hZGRfcGFja2V0KHN0cnVjdCBkZXZpY2VfY2xpZW50ICpkZXZpY2VfY2xpZW50LAorCQkJICAgc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldCk7Cit2b2lkIGJhdF9kZXZpY2VfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGljbXBfcGFja2V0ICppY21wX3BhY2tldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWEzNWRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisKKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKK3N0YXRpYyBjaGFyIGF2YWlsX2lmczsKK3N0YXRpYyBjaGFyIGFjdGl2ZV9pZnM7CisKK3N0YXRpYyB2b2lkIGhhcmRpZl9mcmVlX2ludGVyZmFjZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSk7CisKK3N0YXRpYyBzdHJ1Y3QgYmF0bWFuX2lmICpnZXRfYmF0bWFuX2lmX2J5X25hbWUoY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoc3RybmNtcChiYXRtYW5faWYtPmRldiwgbmFtZSwgSUZOQU1TSVopID09IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwliYXRtYW5faWYgPSBOVUxMOworCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGJhdG1hbl9pZjsKK30KKworaW50IGhhcmRpZl9taW5fbXR1KHZvaWQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCS8qIGFsbG93IGJpZyBmcmFtZXMgaWYgYWxsIGRldmljZXMgYXJlIGNhcGFibGUgdG8gZG8gc28KKwkgKiAoaGF2ZSBNVFUgPiAxNTAwICsgQkFUX0hFQURFUl9MRU4pICovCisJaW50IG1pbl9tdHUgPSBFVEhfREFUQV9MRU47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoKGJhdG1hbl9pZi0+aWZfYWN0aXZlID09IElGX0FDVElWRSkgfHwKKwkJICAgIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9UT19CRV9BQ1RJVkFURUQpKQorCQkJbWluX210dSA9IE1JTihiYXRtYW5faWYtPm5ldF9kZXYtPm10dSAtIEJBVF9IRUFERVJfTEVOLAorCQkJCSAgICAgIG1pbl9tdHUpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBtaW5fbXR1OworfQorCitzdGF0aWMgdm9pZCBjaGVja19rbm93bl9tYWNfYWRkcih1aW50OF90ICphZGRyKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwljaGFyIG1hY19zdHJpbmdbRVRIX1NUUl9MRU5dOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpICYmCisJCSAgICAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIGFkZHIpKQorCQkJY29udGludWU7CisKKwkJYWRkcl90b19zdHJpbmcobWFjX3N0cmluZywgYWRkcik7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiVGhlIG5ld2x5IGFkZGVkIG1hYyBhZGRyZXNzICglcykgYWxyZWFkeSBleGlzdHMgb246ICVzXG4iLAorCQkgICAgICAgICAgbWFjX3N0cmluZywgYmF0bWFuX2lmLT5kZXYpOworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGtlZXAgbWFjIGFkZHJlc3NlcyB1bmlxdWUgdG8gYXZvaWQgcHJvYmxlbXMhXG4iKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKy8qIGFkanVzdHMgdGhlIE1UVSBpZiBhIG5ldyBpbnRlcmZhY2Ugd2l0aCBhIHNtYWxsZXIgTVRVIGFwcGVhcmVkLiAqLwordm9pZCB1cGRhdGVfbWluX210dSh2b2lkKQoreworCWludCBtaW5fbXR1OworCisJbWluX210dSA9IGhhcmRpZl9taW5fbXR1KCk7CisJaWYgKHNvZnRfZGV2aWNlLT5tdHUgIT0gbWluX210dSkKKwkJc29mdF9kZXZpY2UtPm10dSA9IG1pbl9tdHU7Cit9CisKKy8qIGNoZWNrcyBpZiB0aGUgaW50ZXJmYWNlIGlzIHVwLiAocmV0dXJucyAxIGlmIGl0IGlzKSAqLworc3RhdGljIGludCBoYXJkaWZfaXNfaW50ZXJmYWNlX3VwKGNoYXIgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKworCS8qKgorCSAqIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbnRlcmZhY2UgaW4gb3VyIGludGVyZmFjZSBsaXN0IGFuZAorCSAqIHRoZSBjdXJyZW50IGludGVyZmFjZSBpcyBub3QgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGFuZAorCSAqIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpcyBub3QgdXAgYW5kCisJICogdGhlIHByaW1hcnkgaW50ZXJmYWNlIGhhcyBuZXZlciBiZWVuIHVwIC0gZG9uJ3QgYWN0aXZhdGUgYW55CisJICogc2Vjb25kYXJ5IGludGVyZmFjZSAhCisJICovCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCghbGlzdF9lbXB0eSgmaWZfbGlzdCkpICYmCisJICAgIHN0cm5jbXAoKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+ZGV2LCBkZXYsIElGTkFNU0laKSAmJgorCSAgICAhKCgoc3RydWN0IGJhdG1hbl9pZiAqKWlmX2xpc3QubmV4dCktPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUpICYmCisJICAgICEoKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+aWZfYWN0aXZlID09IElGX1RPX0JFX0FDVElWQVRFRCkgJiYKKwkgICAgKCFtYWluX2lmX3dhc191cCgpKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJZ290byBlbmQ7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJbmV0X2RldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGRldik7CisjZWxzZQorCW5ldF9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoZGV2KTsKKyNlbmRpZgorCWlmICghbmV0X2RldikKKwkJZ290byBlbmQ7CisKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCisJCWdvdG8gZmFpbHVyZTsKKworCWRldl9wdXQobmV0X2Rldik7CisJcmV0dXJuIDE7CisKK2ZhaWx1cmU6CisJZGV2X3B1dChuZXRfZGV2KTsKK2VuZDoKKwlyZXR1cm4gMDsKK30KKworLyogZGVhY3RpdmF0ZXMgdGhlIGludGVyZmFjZS4gKi8KK3ZvaWQgaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfQUNUSVZFKQorCQlyZXR1cm47CisKKwlpZiAoYmF0bWFuX2lmLT5yYXdfc29jaykKKwkJc29ja19yZWxlYXNlKGJhdG1hbl9pZi0+cmF3X3NvY2spOworCisJLyoqCisJICogYmF0bWFuX2lmLT5uZXRfZGV2IGhhcyBiZWVuIGFjcXVpcmVkIGJ5IGRldl9nZXRfYnlfbmFtZSgpIGluCisJICogcHJvY19pbnRlcmZhY2VzX3dyaXRlKCkgYW5kIGhhcyB0byBiZSB1bnJlZmVyZW5jZWQuCisJICovCisKKwlpZiAoYmF0bWFuX2lmLT5uZXRfZGV2KQorCQlkZXZfcHV0KGJhdG1hbl9pZi0+bmV0X2Rldik7CisKKwliYXRtYW5faWYtPnJhd19zb2NrID0gTlVMTDsKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBOVUxMOworCisJYmF0bWFuX2lmLT5pZl9hY3RpdmUgPSBJRl9JTkFDVElWRTsKKwlhY3RpdmVfaWZzLS07CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiSW50ZXJmYWNlIGRlYWN0aXZhdGVkOiAlc1xuIiwKKwkgICAgICAgICAgYmF0bWFuX2lmLT5kZXYpOworfQorCisvKiAocmUpYWN0aXZhdGUgZ2l2ZW4gaW50ZXJmYWNlLiAqLworc3RhdGljIHZvaWQgaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZShzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJc3RydWN0IHNvY2thZGRyX2xsIGJpbmRfYWRkcjsKKwlpbnQgcmV0dmFsOworCisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0lOQUNUSVZFKQorCQlyZXR1cm47CisKKyNpZmRlZiBfX05FVF9ORVRfTkFNRVNQQUNFX0gKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBiYXRtYW5faWYtPmRldik7CisjZWxzZQorCWJhdG1hbl9pZi0+bmV0X2RldiA9IGRldl9nZXRfYnlfbmFtZShiYXRtYW5faWYtPmRldik7CisjZW5kaWYKKwlpZiAoIWJhdG1hbl9pZi0+bmV0X2RldikKKwkJZ290byBkZXZfZXJyOworCisJcmV0dmFsID0gc29ja19jcmVhdGVfa2VybihQRl9QQUNLRVQsIFNPQ0tfUkFXLAorCQkJCSAgX19jb25zdGFudF9odG9ucyhFVEhfUF9CQVRNQU4pLAorCQkJCSAgJmJhdG1hbl9pZi0+cmF3X3NvY2spOworCisJaWYgKHJldHZhbCA8IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJDYW4ndCBjcmVhdGUgcmF3IHNvY2tldDogJWlcbiIsCisJCQkgIHJldHZhbCk7CisJCWdvdG8gc29ja19lcnI7CisJfQorCisJYmluZF9hZGRyLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJYmluZF9hZGRyLnNsbF9pZmluZGV4ID0gYmF0bWFuX2lmLT5uZXRfZGV2LT5pZmluZGV4OworCWJpbmRfYWRkci5zbGxfcHJvdG9jb2wgPSAwOwkvKiBpcyBzZXQgYnkgdGhlIGtlcm5lbCAqLworCisJcmV0dmFsID0ga2VybmVsX2JpbmQoYmF0bWFuX2lmLT5yYXdfc29jaywKKwkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZiaW5kX2FkZHIsIHNpemVvZihiaW5kX2FkZHIpKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgY3JlYXRlIGJpbmQgcmF3IHNvY2tldDogJWlcbiIsCisJCQkgIHJldHZhbCk7CisJCWdvdG8gYmluZF9lcnI7CisJfQorCisJY2hlY2tfa25vd25fbWFjX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcik7CisKKwliYXRtYW5faWYtPnJhd19zb2NrLT5zay0+c2tfdXNlcl9kYXRhID0KKwkJYmF0bWFuX2lmLT5yYXdfc29jay0+c2stPnNrX2RhdGFfcmVhZHk7CisJYmF0bWFuX2lmLT5yYXdfc29jay0+c2stPnNrX2RhdGFfcmVhZHkgPSBiYXRtYW5fZGF0YV9yZWFkeTsKKworCWFkZHJfdG9fc3RyaW5nKGJhdG1hbl9pZi0+YWRkcl9zdHIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpOworCisJbWVtY3B5KCgoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikpLT5vcmlnLAorCSAgICAgICBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCgoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZikpLT5wcmV2X3NlbmRlciwKKwkgICAgICAgYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJYmF0bWFuX2lmLT5pZl9hY3RpdmUgPSBJRl9UT19CRV9BQ1RJVkFURUQ7CisJYWN0aXZlX2lmcysrOworCisJLyogc2F2ZSB0aGUgbWFjIGFkZHJlc3MgaWYgaXQgaXMgb3VyIHByaW1hcnkgaW50ZXJmYWNlICovCisJaWYgKGJhdG1hbl9pZi0+aWZfbnVtID09IDApCisJCXNldF9tYWluX2lmX2FkZHIoYmF0bWFuX2lmLT5uZXRfZGV2LT5kZXZfYWRkcik7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiSW50ZXJmYWNlIGFjdGl2YXRlZDogJXNcbiIsCisJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKworCXJldHVybjsKKworYmluZF9lcnI6CisJc29ja19yZWxlYXNlKGJhdG1hbl9pZi0+cmF3X3NvY2spOworc29ja19lcnI6CisJZGV2X3B1dChiYXRtYW5faWYtPm5ldF9kZXYpOworZGV2X2VycjoKKwliYXRtYW5faWYtPnJhd19zb2NrID0gTlVMTDsKKwliYXRtYW5faWYtPm5ldF9kZXYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoYXJkaWZfZnJlZV9pbnRlcmZhY2Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGJhdG1hbl9pZiwgcmN1KTsKKworCWtmcmVlKGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYpOworCWtmcmVlKGJhdG1hbl9pZi0+ZGV2KTsKKwlrZnJlZShiYXRtYW5faWYpOworfQorCisvKioKKyAqIGNhbGxlZCBieQorICogIC0gZWNobyAnJyA+IC9wcm9jLy4uLi9pbnRlcmZhY2VzCisgKiAgLSBtb2Rwcm9iZSAtciBiYXRtYW4tYWR2LWNvcmUKKyAqLworLyogcmVtb3ZlcyBhbmQgZnJlZXMgYWxsIGludGVyZmFjZXMgKi8KK3ZvaWQgaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKHZvaWQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gTlVMTDsKKworCWF2YWlsX2lmcyA9IDA7CisKKwkvKiBubyBsb2NrIG5lZWRlZCAtIHdlIGRvbid0IGRlbGV0ZSBzb21ld2hlcmUgZWxzZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCisJCWxpc3RfZGVsX3JjdSgmYmF0bWFuX2lmLT5saXN0KTsKKworCQkvKiBmaXJzdCBkZWFjdGl2YXRlIGludGVyZmFjZSAqLworCQlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfSU5BQ1RJVkUpCisJCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKworCQljYWxsX3JjdSgmYmF0bWFuX2lmLT5yY3UsIGhhcmRpZl9mcmVlX2ludGVyZmFjZSk7CisJfQorfQorCitzdGF0aWMgaW50IHJlc2l6ZV9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50IGlmX251bSkKK3sKKwl2b2lkICpkYXRhX3B0cjsKKworCWRhdGFfcHRyID0ga21hbGxvYygoaWZfbnVtICsgMSkgKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUywKKwkJCSAgIEdGUF9BVE9NSUMpOworCWlmICghZGF0YV9wdHIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJDYW4ndCByZXNpemUgb3JpZzogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1jcHkoZGF0YV9wdHIsIG9yaWdfbm9kZS0+YmNhc3Rfb3duLAorCSAgICAgICBpZl9udW0gKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUyk7CisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd24pOworCW9yaWdfbm9kZS0+YmNhc3Rfb3duID0gZGF0YV9wdHI7CisKKwlkYXRhX3B0ciA9IGttYWxsb2MoKGlmX251bSArIDEpICogc2l6ZW9mKHVpbnQ4X3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRhdGFfcHRyKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgcmVzaXplIG9yaWc6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KGRhdGFfcHRyLCBvcmlnX25vZGUtPmJjYXN0X293bl9zdW0sIGlmX251bSAqIHNpemVvZih1aW50OF90KSk7CisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKTsKKwlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBkYXRhX3B0cjsKKworCXJldHVybiAwOworfQorCisKKy8qIGFkZHMgYW4gaW50ZXJmYWNlIHRoZSBpbnRlcmZhY2UgbGlzdCBhbmQgYWN0aXZhdGUgaXQsIGlmIHBvc3NpYmxlICovCitpbnQgaGFyZGlmX2FkZF9pbnRlcmZhY2UoY2hhciAqZGV2LCBpbnQgaWZfbnVtKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKworCWJhdG1hbl9pZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiYXRtYW5faWYpLCBHRlBfS0VSTkVMKTsKKworCWlmICghYmF0bWFuX2lmKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSAoJXMpOiBvdXQgb2YgbWVtb3J5XG4iLCBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJYmF0bWFuX2lmLT5yYXdfc29jayA9IE5VTEw7CisJYmF0bWFuX2lmLT5uZXRfZGV2ID0gTlVMTDsKKworCWlmICgoaWZfbnVtID09IDApICYmIChudW1faG5hID4gMCkpCisJCWJhdG1hbl9pZi0+cGFja2V0X2xlbiA9IEJBVF9QQUNLRVRfTEVOICsgbnVtX2huYSAqIEVUSF9BTEVOOworCWVsc2UKKwkJYmF0bWFuX2lmLT5wYWNrZXRfbGVuID0gQkFUX1BBQ0tFVF9MRU47CisKKwliYXRtYW5faWYtPnBhY2tldF9idWZmID0ga21hbGxvYyhiYXRtYW5faWYtPnBhY2tldF9sZW4sIEdGUF9LRVJORUwpOworCisJaWYgKCFiYXRtYW5faWYtPnBhY2tldF9idWZmKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLCAiQ2FuJ3QgYWRkIGludGVyZmFjZSBwYWNrZXQgKCVzKTogb3V0IG9mIG1lbW9yeVxuIiwgZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0bWFuX2lmLT5pZl9udW0gPSBpZl9udW07CisJYmF0bWFuX2lmLT5kZXYgPSBkZXY7CisJYmF0bWFuX2lmLT5pZl9hY3RpdmUgPSBJRl9JTkFDVElWRTsKKwlJTklUX1JDVV9IRUFEKCZiYXRtYW5faWYtPnJjdSk7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiQWRkaW5nIGludGVyZmFjZTogJXNcbiIsIGRldik7CisJYXZhaWxfaWZzKys7CisKKwlJTklUX0xJU1RfSEVBRCgmYmF0bWFuX2lmLT5saXN0KTsKKworCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikoYmF0bWFuX2lmLT5wYWNrZXRfYnVmZik7CisJYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUgPSBCQVRfUEFDS0VUOworCWJhdG1hbl9wYWNrZXQtPnZlcnNpb24gPSBDT01QQVRfVkVSU0lPTjsKKwliYXRtYW5fcGFja2V0LT5mbGFncyA9IDB4MDA7CisJYmF0bWFuX3BhY2tldC0+dHRsID0gKGJhdG1hbl9pZi0+aWZfbnVtID4gMCA/IDIgOiBUVEwpOworCWJhdG1hbl9wYWNrZXQtPmZsYWdzID0gMDsKKwliYXRtYW5fcGFja2V0LT50cSA9IFRRX01BWF9WQUxVRTsKKwliYXRtYW5fcGFja2V0LT5udW1faG5hID0gMDsKKworCWlmIChiYXRtYW5faWYtPnBhY2tldF9sZW4gIT0gQkFUX1BBQ0tFVF9MRU4pIHsKKwkJdW5zaWduZWQgY2hhciAqaG5hX2J1ZmY7CisJCWludCBobmFfbGVuOworCisJCWhuYV9idWZmID0gYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiArIEJBVF9QQUNLRVRfTEVOOworCQlobmFfbGVuID0gYmF0bWFuX2lmLT5wYWNrZXRfbGVuIC0gQkFUX1BBQ0tFVF9MRU47CisJCWJhdG1hbl9wYWNrZXQtPm51bV9obmEgPSBobmFfbG9jYWxfZmlsbF9idWZmZXIoaG5hX2J1ZmYsCisJCQkJCQkJICAgICAgIGhuYV9sZW4pOworCX0KKworCWF0b21pY19zZXQoJmJhdG1hbl9pZi0+c2Vxbm8sIDEpOworCisJLyogcmVzaXplIGFsbCBvcmlnIG5vZGVzIGJlY2F1c2Ugb3JpZ19ub2RlLT5iY2FzdF9vd24oX3N1bSkgZGVwZW5kIG9uCisJICogaWZfbnVtICovCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKG9yaWdfaGFzaCwgaGFzaGl0KSkpIHsKKwkJb3JpZ19ub2RlID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCWlmIChyZXNpemVfb3JpZyhvcmlnX25vZGUsIGlmX251bSkgPT0gLTEpIHsKKwkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwlpZiAoIWhhcmRpZl9pc19pbnRlcmZhY2VfdXAoYmF0bWFuX2lmLT5kZXYpKQorCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIk5vdCB1c2luZyBpbnRlcmZhY2UgJXMgKHJldHJ5aW5nIGxhdGVyKTogaW50ZXJmYWNlIG5vdCBhY3RpdmVcbiIsIGJhdG1hbl9pZi0+ZGV2KTsKKwllbHNlCisJCWhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKworCWxpc3RfYWRkX3RhaWxfcmN1KCZiYXRtYW5faWYtPmxpc3QsICZpZl9saXN0KTsKKworCS8qIGJlZ2luIHNlbmRpbmcgb3JpZ2luYXRvciBtZXNzYWdlcyBvbiB0aGF0IGludGVyZmFjZSAqLworCXNjaGVkdWxlX293bl9wYWNrZXQoYmF0bWFuX2lmKTsKKwlyZXR1cm4gMTsKKworb3V0OgorCWlmIChiYXRtYW5faWYtPnBhY2tldF9idWZmKQorCQlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKKwlrZnJlZShiYXRtYW5faWYpOworCWtmcmVlKGRldik7CisJcmV0dXJuIC0xOworfQorCitjaGFyIGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSh2b2lkKQoreworCXJldHVybiBhY3RpdmVfaWZzOworfQorCitzdGF0aWMgaW50IGhhcmRfaWZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiA9IGdldF9iYXRtYW5faWZfYnlfbmFtZShkZXYtPm5hbWUpOworCisJaWYgKCFiYXRtYW5faWYpCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0dPSU5HX0RPV046CisJY2FzZSBORVRERVZfRE9XTjoKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQloYXJkaWZfZGVhY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVVA6CisJCWhhcmRpZl9hY3RpdmF0ZV9pbnRlcmZhY2UoYmF0bWFuX2lmKTsKKwkJaWYgKChhdG9taWNfcmVhZCgmbW9kdWxlX3N0YXRlKSA9PSBNT0RVTEVfSU5BQ1RJVkUpICYmCisJCSAgICAoaGFyZGlmX2dldF9hY3RpdmVfaWZfbnVtKCkgPiAwKSkgeworCQkJYWN0aXZhdGVfbW9kdWxlKCk7CisJCX0KKwkJYnJlYWs7CisJLyogTkVUREVWX0NIQU5HRUFERFIgLSBtYWMgYWRkcmVzcyBjaGFuZ2UgLSB3aGF0IGFyZSB3ZSBkb2luZyBoZXJlID8gKi8KKwlkZWZhdWx0OgorCQkvKiBkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgImhhcmRfaWZfZXZlbnQ6ICVzICVpXG4iLCBkZXYtPm5hbWUsIGV2ZW50KTsgKi8KKwkJYnJlYWs7CisJfTsKKworCXVwZGF0ZV9taW5fbXR1KCk7CisKK291dDoKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0cnVjdCBub3RpZmllcl9ibG9jayBoYXJkX2lmX25vdGlmaWVyID0geworICAgICAgICAubm90aWZpZXJfY2FsbCA9IGhhcmRfaWZfZXZlbnQsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyMzU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNkZWZpbmUgSUZfSU5BQ1RJVkUgMAorI2RlZmluZSBJRl9BQ1RJVkUgMQorLyogI2RlZmluZSBJRl9UT19CRV9ERUFDVElWQVRFRCAyIC0gbm90IG5lZWRlZCBhbnltb3JlICovCisjZGVmaW5lIElGX1RPX0JFX0FDVElWQVRFRCAzCisKK2V4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaGFyZF9pZl9ub3RpZmllcjsKKwordm9pZCBoYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXModm9pZCk7CitpbnQgaGFyZGlmX2FkZF9pbnRlcmZhY2UoY2hhciAqZGV2LCBpbnQgaWZfbnVtKTsKK3ZvaWQgaGFyZGlmX2RlYWN0aXZhdGVfaW50ZXJmYWNlKHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7CitjaGFyIGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSh2b2lkKTsKK3ZvaWQgaGFyZGlmX2NoZWNrX2ludGVyZmFjZXNfc3RhdHVzKHZvaWQpOwordm9pZCBoYXJkaWZfY2hlY2tfaW50ZXJmYWNlc19zdGF0dXNfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2ludCBoYXJkaWZfbWluX210dSh2b2lkKTsKK3ZvaWQgdXBkYXRlX21pbl9tdHUodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjYjRhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2hhc2guYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorCisvKiBjbGVhcnMgdGhlIGhhc2ggKi8KK3ZvaWQgaGFzaF9pbml0KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKK3sKKwlpbnQgaTsKKworCWhhc2gtPmVsZW1lbnRzID0gMDsKKworCWZvciAoaSA9IDAgOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKQorCQloYXNoLT50YWJsZVtpXSA9IE5VTEw7Cit9CisKKy8qIHJlbW92ZSB0aGUgaGFzaCBzdHJ1Y3R1cmUuIGlmIGhhc2hkYXRhX2ZyZWVfY2IgIT0gTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGhhc2guICBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZQorICogZWxlbWVudHMsIG1lbW9yeSBtaWdodCBiZSBsZWFrZWQuICovCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaGFzaGRhdGFfZnJlZV9jYiBmcmVlX2NiKQoreworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldCwgKmxhc3RfYnVja2V0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgeworCQlidWNrZXQgPSBoYXNoLT50YWJsZVtpXTsKKworCQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKKwkJCWlmIChmcmVlX2NiICE9IE5VTEwpCisJCQkJZnJlZV9jYihidWNrZXQtPmRhdGEpOworCisJCQlsYXN0X2J1Y2tldCA9IGJ1Y2tldDsKKwkJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwkJCWtmcmVlKGxhc3RfYnVja2V0KTsKKwkJfQorCX0KKworCWhhc2hfZGVzdHJveShoYXNoKTsKK30KKworLyogZnJlZSBvbmx5IHRoZSBoYXNodGFibGUgYW5kIHRoZSBoYXNoIGl0c2VsZi4gKi8KK3ZvaWQgaGFzaF9kZXN0cm95KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCkKK3sKKwlrZnJlZShoYXNoLT50YWJsZSk7CisJa2ZyZWUoaGFzaCk7Cit9CisKKy8qIGl0ZXJhdGUgdGhvdWdoIHRoZSBoYXNoLiBmaXJzdCBlbGVtZW50IGlzIHNlbGVjdGVkIHdpdGggaXRlcl9pbiBOVUxMLiAgdXNlCisgKiB0aGUgcmV0dXJuZWQgaXRlcmF0b3IgdG8gYWNjZXNzIHRoZSBlbGVtZW50cyB1bnRpbCBoYXNoX2l0X3QgcmV0dXJucyBOVUxMLiAqLworc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKKwkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyX2luKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKml0ZXI7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybiBOVUxMOworCisJaWYgKGl0ZXJfaW4gPT0gTlVMTCkgeworCQlpdGVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhhc2hfaXRfdCksIEdGUF9BVE9NSUMpOworCQlpdGVyLT5pbmRleCA9IC0xOworCQlpdGVyLT5idWNrZXQgPSBOVUxMOworCQlpdGVyLT5wcmV2X2J1Y2tldCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaXRlciA9IGl0ZXJfaW47CisJfQorCisJLyogc2FuaXR5IGNoZWNrcyBmaXJzdCAoaWYgb3VyIGJ1Y2tldCBnb3QgZGVsZXRlZCBpbiB0aGUgbGFzdAorCSAqIGl0ZXJhdGlvbik6ICovCisJaWYgKGl0ZXItPmJ1Y2tldCAhPSBOVUxMKSB7CisJCWlmIChpdGVyLT5maXJzdF9idWNrZXQgIT0gTlVMTCkgeworCQkJLyogd2UncmUgb24gdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGl0IGdvdCByZW1vdmVkIGFmdGVyCisJCQkgKiB0aGUgbGFzdCBpdGVyYXRpb24uICovCisJCQlpZiAoKCppdGVyLT5maXJzdF9idWNrZXQpICE9IGl0ZXItPmJ1Y2tldCkgeworCQkJCS8qIHRoZXJlIGFyZSBzdGlsbCBvdGhlciBlbGVtZW50cyBpbiB0aGUgbGlzdCAqLworCQkJCWlmICgoKml0ZXItPmZpcnN0X2J1Y2tldCkgIT0gTlVMTCkgeworCQkJCQlpdGVyLT5wcmV2X2J1Y2tldCA9IE5VTEw7CisJCQkJCWl0ZXItPmJ1Y2tldCA9ICgqaXRlci0+Zmlyc3RfYnVja2V0KTsKKwkJCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0KKwkJCQkJCSZoYXNoLT50YWJsZVtpdGVyLT5pbmRleF07CisJCQkJCXJldHVybiBpdGVyOworCQkJCX0gZWxzZSB7CisJCQkJCWl0ZXItPmJ1Y2tldCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGl0ZXItPnByZXZfYnVja2V0ICE9IE5VTEwpIHsKKwkJCS8qCisJCQkqIHdlJ3JlIG5vdCBvbiB0aGUgZmlyc3QgZWxlbWVudCwgYW5kIHRoZSBidWNrZXQgZ290CisJCQkqIHJlbW92ZWQgYWZ0ZXIgdGhlIGxhc3QgaXRlcmF0aW9uLiAgdGhlIGxhc3QgYnVja2V0J3MKKwkJCSogbmV4dCBwb2ludGVyIGlzIG5vdCBwb2ludGluZyB0byBvdXIgYWN0dWFsIGJ1Y2tldAorCQkJKiBhbnltb3JlLiAgc2VsZWN0IHRoZSBuZXh0LgorCQkJKi8KKwkJCWlmIChpdGVyLT5wcmV2X2J1Y2tldC0+bmV4dCAhPSBpdGVyLT5idWNrZXQpCisJCQkJaXRlci0+YnVja2V0ID0gaXRlci0+cHJldl9idWNrZXQ7CisJCX0KKwl9CisKKwkvKiBub3cgYXMgd2UgYXJlIHNhbmUsIHNlbGVjdCB0aGUgbmV4dCBvbmUgaWYgdGhlcmUgaXMgc29tZSAqLworCWlmIChpdGVyLT5idWNrZXQgIT0gTlVMTCkgeworCQlpZiAoaXRlci0+YnVja2V0LT5uZXh0ICE9IE5VTEwpIHsKKwkJCWl0ZXItPnByZXZfYnVja2V0ID0gaXRlci0+YnVja2V0OworCQkJaXRlci0+YnVja2V0ID0gaXRlci0+YnVja2V0LT5uZXh0OworCQkJaXRlci0+Zmlyc3RfYnVja2V0ID0gTlVMTDsKKwkJCXJldHVybiBpdGVyOworCQl9CisJfQorCisJLyogaWYgbm90IHJldHVybmVkIHlldCwgd2UndmUgcmVhY2hlZCB0aGUgbGFzdCBvbmUgb24gdGhlIGluZGV4IGFuZCBoYXZlCisJICogdG8gc2VhcmNoIGZvcndhcmQgKi8KKwlpdGVyLT5pbmRleCsrOworCS8qIGdvIHRocm91Z2ggdGhlIGVudHJpZXMgb2YgdGhlIGhhc2ggdGFibGUgKi8KKwl3aGlsZSAoaXRlci0+aW5kZXggPCBoYXNoLT5zaXplKSB7CisJCWlmICgoaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdKSAhPSBOVUxMKSB7CisJCQlpdGVyLT5wcmV2X2J1Y2tldCA9IE5VTEw7CisJCQlpdGVyLT5idWNrZXQgPSBoYXNoLT50YWJsZVtpdGVyLT5pbmRleF07CisJCQlpdGVyLT5maXJzdF9idWNrZXQgPSAmaGFzaC0+dGFibGVbaXRlci0+aW5kZXhdOworCQkJcmV0dXJuIGl0ZXI7CisJCX0gZWxzZSB7CisJCQlpdGVyLT5pbmRleCsrOworCQl9CisJfQorCisJLyogbm90aGluZyB0byBpdGVyYXRlIG92ZXIgYW55bW9yZSAqLworCWtmcmVlKGl0ZXIpOworCXJldHVybiBOVUxMOworfQorCisvKiBhbGxvY2F0ZXMgYW5kIGNsZWFycyB0aGUgaGFzaCAqLworc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX25ldyhpbnQgc2l6ZSwgaGFzaGRhdGFfY29tcGFyZV9jYiBjb21wYXJlLAorCQkJICAgICBoYXNoZGF0YV9jaG9vc2VfY2IgY2hvb3NlKQoreworCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaDsKKworCWhhc2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGFzaHRhYmxlX3QpICwgR0ZQX0FUT01JQyk7CisKKwlpZiAoaGFzaCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWhhc2gtPnNpemUgPSBzaXplOworCWhhc2gtPnRhYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVsZW1lbnRfdCAqKSAqIHNpemUsIEdGUF9BVE9NSUMpOworCisJaWYgKGhhc2gtPnRhYmxlID09IE5VTEwpIHsKKwkJa2ZyZWUoaGFzaCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWhhc2hfaW5pdChoYXNoKTsKKworCWhhc2gtPmNvbXBhcmUgPSBjb21wYXJlOworCWhhc2gtPmNob29zZSA9IGNob29zZTsKKworCXJldHVybiBoYXNoOworfQorCisvKiBhZGRzIGRhdGEgdG8gdGhlIGhhc2h0YWJsZS4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCitpbnQgaGFzaF9hZGQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB2b2lkICpkYXRhKQoreworCWludCBpbmRleDsKKwlzdHJ1Y3QgZWxlbWVudF90ICpidWNrZXQsICpwcmV2X2J1Y2tldCA9IE5VTEw7CisKKwlpZiAoIWhhc2gpCisJCXJldHVybiAtMTsKKworCWluZGV4ID0gaGFzaC0+Y2hvb3NlKGRhdGEsIGhhc2gtPnNpemUpOworCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2luZGV4XTsKKworCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgeworCQlpZiAoaGFzaC0+Y29tcGFyZShidWNrZXQtPmRhdGEsIGRhdGEpKQorCQkJcmV0dXJuIC0xOworCisJCXByZXZfYnVja2V0ID0gYnVja2V0OworCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJfQorCisJLyogZm91bmQgdGhlIHRhaWwgb2YgdGhlIGxpc3QsIGFkZCBuZXcgZWxlbWVudCAqLworCWJ1Y2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbGVtZW50X3QpLCBHRlBfQVRPTUlDKTsKKworCWlmIChidWNrZXQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJYnVja2V0LT5kYXRhID0gZGF0YTsKKwlidWNrZXQtPm5leHQgPSBOVUxMOworCisJLyogYW5kIGxpbmsgaXQgKi8KKwlpZiAocHJldl9idWNrZXQgPT0gTlVMTCkKKwkJaGFzaC0+dGFibGVbaW5kZXhdID0gYnVja2V0OworCWVsc2UKKwkJcHJldl9idWNrZXQtPm5leHQgPSBidWNrZXQ7CisKKwloYXNoLT5lbGVtZW50cysrOworCXJldHVybiAwOworfQorCisvKiBmaW5kcyBkYXRhLCBiYXNlZCBvbiB0aGUga2V5IGluIGtleWRhdGEuIHJldHVybnMgdGhlIGZvdW5kIGRhdGEgb24gc3VjY2VzcywKKyAqIG9yIE5VTEwgb24gZXJyb3IgKi8KK3ZvaWQgKmhhc2hfZmluZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmtleWRhdGEpCit7CisJaW50IGluZGV4OworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKKworCWlmICghaGFzaCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbmRleCA9IGhhc2gtPmNob29zZShrZXlkYXRhICwgaGFzaC0+c2l6ZSk7CisJYnVja2V0ID0gaGFzaC0+dGFibGVbaW5kZXhdOworCisJd2hpbGUgKGJ1Y2tldCAhPSBOVUxMKSB7CisJCWlmIChoYXNoLT5jb21wYXJlKGJ1Y2tldC0+ZGF0YSwga2V5ZGF0YSkpCisJCQlyZXR1cm4gYnVja2V0LT5kYXRhOworCisJCWJ1Y2tldCA9IGJ1Y2tldC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogcmVtb3ZlIGJ1Y2tldCAodGhpcyBtaWdodCBiZSB1c2VkIGluIGhhc2hfaXRlcmF0ZSgpIGlmIHlvdSBhbHJlYWR5IGZvdW5kIHRoZQorICogYnVja2V0IHlvdSB3YW50IHRvIGRlbGV0ZSBhbmQgZG9uJ3QgbmVlZCB0aGUgb3ZlcmhlYWQgdG8gZmluZCBpdCBhZ2FpbiB3aXRoCisgKiBoYXNoX3JlbW92ZSgpLiBCdXQgdXN1YWxseSwgeW91IGRvbid0IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIGFzIGl0CisgKiBmaWRkbGVzIHdpdGggaGFzaC1pbnRlcm5hbHMuICovCit2b2lkICpoYXNoX3JlbW92ZV9idWNrZXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoX2l0X3QpCit7CisJdm9pZCAqZGF0YV9zYXZlOworCisJZGF0YV9zYXZlID0gaGFzaF9pdF90LT5idWNrZXQtPmRhdGE7CisKKwlpZiAoaGFzaF9pdF90LT5wcmV2X2J1Y2tldCAhPSBOVUxMKQorCQloYXNoX2l0X3QtPnByZXZfYnVja2V0LT5uZXh0ID0gaGFzaF9pdF90LT5idWNrZXQtPm5leHQ7CisJZWxzZSBpZiAoaGFzaF9pdF90LT5maXJzdF9idWNrZXQgIT0gTlVMTCkKKwkJKCpoYXNoX2l0X3QtPmZpcnN0X2J1Y2tldCkgPSBoYXNoX2l0X3QtPmJ1Y2tldC0+bmV4dDsKKworCWtmcmVlKGhhc2hfaXRfdC0+YnVja2V0KTsKKwloYXNoLT5lbGVtZW50cy0tOworCisJcmV0dXJuIGRhdGFfc2F2ZTsKK30KKworLyogcmVtb3ZlcyBkYXRhIGZyb20gaGFzaCwgaWYgZm91bmQuIHJldHVybnMgcG9pbnRlciBkbyBkYXRhIG9uIHN1Y2Nlc3MsIHNvIHlvdQorICogY2FuIHJlbW92ZSB0aGUgdXNlZCBzdHJ1Y3R1cmUgeW91cnNlbGYsIG9yIE5VTEwgb24gZXJyb3IgLiAgZGF0YSBjb3VsZCBiZSB0aGUKKyAqIHN0cnVjdHVyZSB5b3UgdXNlIHdpdGgganVzdCB0aGUga2V5IGZpbGxlZCwgd2UganVzdCBuZWVkIHRoZSBrZXkgZm9yCisgKiBjb21wYXJpbmcuICovCit2b2lkICpoYXNoX3JlbW92ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhhc2hfaXRfdCBoYXNoX2l0X3Q7CisKKwloYXNoX2l0X3QuaW5kZXggPSBoYXNoLT5jaG9vc2UoZGF0YSwgaGFzaC0+c2l6ZSk7CisJaGFzaF9pdF90LmJ1Y2tldCA9IGhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF07CisJaGFzaF9pdF90LnByZXZfYnVja2V0ID0gTlVMTDsKKworCXdoaWxlIChoYXNoX2l0X3QuYnVja2V0ICE9IE5VTEwpIHsKKwkJaWYgKGhhc2gtPmNvbXBhcmUoaGFzaF9pdF90LmJ1Y2tldC0+ZGF0YSwgZGF0YSkpIHsKKwkJCWhhc2hfaXRfdC5maXJzdF9idWNrZXQgPQorCQkJCShoYXNoX2l0X3QuYnVja2V0ID09CisJCQkJIGhhc2gtPnRhYmxlW2hhc2hfaXRfdC5pbmRleF0gPworCQkJCSAmaGFzaC0+dGFibGVbaGFzaF9pdF90LmluZGV4XSA6IE5VTEwpOworCQkJcmV0dXJuIGhhc2hfcmVtb3ZlX2J1Y2tldChoYXNoLCAmaGFzaF9pdF90KTsKKwkJfQorCisJCWhhc2hfaXRfdC5wcmV2X2J1Y2tldCA9IGhhc2hfaXRfdC5idWNrZXQ7CisJCWhhc2hfaXRfdC5idWNrZXQgPSBoYXNoX2l0X3QuYnVja2V0LT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiByZXNpemUgdGhlIGhhc2gsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBoYXNoIG9yIE5VTEwgb24KKyAqIGVycm9yLiByZW1vdmVzIHRoZSBvbGQgaGFzaCBvbiBzdWNjZXNzLiAqLworc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX3Jlc2l6ZShzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIGludCBzaXplKQoreworCXN0cnVjdCBoYXNodGFibGVfdCAqbmV3X2hhc2g7CisJc3RydWN0IGVsZW1lbnRfdCAqYnVja2V0OworCWludCBpOworCisJLyogaW5pdGlhbGl6ZSBhIG5ldyBoYXNoIHdpdGggdGhlIG5ldyBzaXplICovCisJbmV3X2hhc2ggPSBoYXNoX25ldyhzaXplLCBoYXNoLT5jb21wYXJlLCBoYXNoLT5jaG9vc2UpOworCisJaWYgKG5ld19oYXNoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogY29weSB0aGUgZWxlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CisJCWJ1Y2tldCA9IGhhc2gtPnRhYmxlW2ldOworCisJCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgeworCQkJaGFzaF9hZGQobmV3X2hhc2gsIGJ1Y2tldC0+ZGF0YSk7CisJCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJCX0KKwl9CisKKwkvKiByZW1vdmUgaGFzaCBhbmQgZXZlbnR1YWwgb3ZlcmZsb3cgYnVja2V0cyBidXQgbm90IHRoZSBjb250ZW50CisJICogaXRzZWxmLiAqLworCWhhc2hfZGVsZXRlKGhhc2gsIE5VTEwpOworCisJcmV0dXJuIG5ld19oYXNoOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvaGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNjBmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9oYXNoLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0JBVE1BTl9IQVNIX0gKKyNkZWZpbmUgX0JBVE1BTl9IQVNIX0gKKwordHlwZWRlZiBpbnQgKCpoYXNoZGF0YV9jb21wYXJlX2NiKSh2b2lkICosIHZvaWQgKik7Cit0eXBlZGVmIGludCAoKmhhc2hkYXRhX2Nob29zZV9jYikodm9pZCAqLCBpbnQpOwordHlwZWRlZiB2b2lkICgqaGFzaGRhdGFfZnJlZV9jYikodm9pZCAqKTsKKworc3RydWN0IGVsZW1lbnRfdCB7CisJdm9pZCAqZGF0YTsJCS8qIHBvaW50ZXIgdG8gdGhlIGRhdGEgKi8KKwlzdHJ1Y3QgZWxlbWVudF90ICpuZXh0OwkvKiBvdmVyZmxvdyBidWNrZXQgcG9pbnRlciAqLworfTsKKworc3RydWN0IGhhc2hfaXRfdCB7CisJaW50IGluZGV4OworCXN0cnVjdCBlbGVtZW50X3QgKmJ1Y2tldDsKKwlzdHJ1Y3QgZWxlbWVudF90ICpwcmV2X2J1Y2tldDsKKwlzdHJ1Y3QgZWxlbWVudF90ICoqZmlyc3RfYnVja2V0OworfTsKKworc3RydWN0IGhhc2h0YWJsZV90IHsKKwlzdHJ1Y3QgZWxlbWVudF90ICoqdGFibGU7ICAgLyogdGhlIGhhc2h0YWJsZSBpdHNlbGYsIHdpdGggdGhlIGJ1Y2tldHMgKi8KKwlpbnQgZWxlbWVudHM7CQkgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHJlZ2lzdGVyZWQgKi8KKwlpbnQgc2l6ZTsJCSAgICAvKiBzaXplIG9mIGhhc2h0YWJsZSAqLworCWhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZTsvKiBjYWxsYmFjayB0byBhIGNvbXBhcmUgZnVuY3Rpb24uICBzaG91bGQKKwkJCQkgICAgICogY29tcGFyZSAyIGVsZW1lbnQgZGF0YXMgZm9yIHRoZWlyIGtleXMsCisJCQkJICAgICAqIHJldHVybiAwIGlmIHNhbWUgYW5kIG5vdCAwIGlmIG5vdAorCQkJCSAgICAgKiBzYW1lICovCisJaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZTsgIC8qIHRoZSBoYXNoZnVuY3Rpb24sIHNob3VsZCByZXR1cm4gYW4gaW5kZXgKKwkJCQkgICAgICogYmFzZWQgb24gdGhlIGtleSBpbiB0aGUgZGF0YSBvZiB0aGUgZmlyc3QKKwkJCQkgICAgICogYXJndW1lbnQgYW5kIHRoZSBzaXplIHRoZSBzZWNvbmQgKi8KK307CisKKy8qIGNsZWFycyB0aGUgaGFzaCAqLwordm9pZCBoYXNoX2luaXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKTsKKworLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KK3N0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUsIGhhc2hkYXRhX2NvbXBhcmVfY2IgY29tcGFyZSwKKwkJCSAgICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSk7CisKKy8qIHJlbW92ZSBidWNrZXQgKHRoaXMgbWlnaHQgYmUgdXNlZCBpbiBoYXNoX2l0ZXJhdGUoKSBpZiB5b3UgYWxyZWFkeSBmb3VuZCB0aGUKKyAqIGJ1Y2tldCB5b3Ugd2FudCB0byBkZWxldGUgYW5kIGRvbid0IG5lZWQgdGhlIG92ZXJoZWFkIHRvIGZpbmQgaXQgYWdhaW4gd2l0aAorICogaGFzaF9yZW1vdmUoKS4gIEJ1dCB1c3VhbGx5LCB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhpcyBmdW5jdGlvbiwgYXMgaXQKKyAqIGZpZGRsZXMgd2l0aCBoYXNoLWludGVybmFscy4gKi8KK3ZvaWQgKmhhc2hfcmVtb3ZlX2J1Y2tldChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHN0cnVjdCBoYXNoX2l0X3QgKmhhc2hfaXRfdCk7CisKKy8qIHJlbW92ZSB0aGUgaGFzaCBzdHJ1Y3R1cmUuIGlmIGhhc2hkYXRhX2ZyZWVfY2IgIT0gTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBlbGVtZW50cyBpbnNpZGUgb2YgdGhlIGhhc2guICBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZQorICogZWxlbWVudHMsIG1lbW9yeSBtaWdodCBiZSBsZWFrZWQuICovCit2b2lkIGhhc2hfZGVsZXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgaGFzaGRhdGFfZnJlZV9jYiBmcmVlX2NiKTsKKworLyogZnJlZSBvbmx5IHRoZSBoYXNodGFibGUgYW5kIHRoZSBoYXNoIGl0c2VsZi4gKi8KK3ZvaWQgaGFzaF9kZXN0cm95KHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7CisKKy8qIGFkZHMgZGF0YSB0byB0aGUgaGFzaHRhYmxlLiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgKi8KK2ludCBoYXNoX2FkZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsIHZvaWQgKmRhdGEpOworCisvKiByZW1vdmVzIGRhdGEgZnJvbSBoYXNoLCBpZiBmb3VuZC4gcmV0dXJucyBwb2ludGVyIGRvIGRhdGEgb24gc3VjY2Vzcywgc28geW91CisgKiBjYW4gcmVtb3ZlIHRoZSB1c2VkIHN0cnVjdHVyZSB5b3Vyc2VsZiwgb3IgTlVMTCBvbiBlcnJvciAuICBkYXRhIGNvdWxkIGJlIHRoZQorICogc3RydWN0dXJlIHlvdSB1c2Ugd2l0aCBqdXN0IHRoZSBrZXkgZmlsbGVkLCB3ZSBqdXN0IG5lZWQgdGhlIGtleSBmb3IKKyAqIGNvbXBhcmluZy4gKi8KK3ZvaWQgKmhhc2hfcmVtb3ZlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqZGF0YSk7CisKKy8qIGZpbmRzIGRhdGEsIGJhc2VkIG9uIHRoZSBrZXkgaW4ga2V5ZGF0YS4gcmV0dXJucyB0aGUgZm91bmQgZGF0YSBvbiBzdWNjZXNzLAorICogb3IgTlVMTCBvbiBlcnJvciAqLwordm9pZCAqaGFzaF9maW5kKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwgdm9pZCAqa2V5ZGF0YSk7CisKKy8qIHJlc2l6ZSB0aGUgaGFzaCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgbmV3IGhhc2ggb3IgTlVMTCBvbgorICogZXJyb3IuIHJlbW92ZXMgdGhlIG9sZCBoYXNoIG9uIHN1Y2Nlc3MgKi8KK3N0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9yZXNpemUoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCBpbnQgc2l6ZSk7CisKKy8qIGl0ZXJhdGUgdGhvdWdoIHRoZSBoYXNoLiBmaXJzdCBlbGVtZW50IGlzIHNlbGVjdGVkIHdpdGggaXRlcl9pbiBOVUxMLiAgdXNlCisgKiB0aGUgcmV0dXJuZWQgaXRlcmF0b3IgdG8gYWNjZXNzIHRoZSBlbGVtZW50cyB1bnRpbCBoYXNoX2l0X3QgcmV0dXJucyBOVUxMLiAqLworc3RydWN0IGhhc2hfaXRfdCAqaGFzaF9pdGVyYXRlKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCwKKwkJCSAgICAgICBzdHJ1Y3QgaGFzaF9pdF90ICppdGVyX2luKTsKKworLyogcHJpbnQgdGhlIGhhc2ggdGFibGUgZm9yIGRlYnVnZ2luZyAqLwordm9pZCBoYXNoX2RlYnVnKHN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YzdmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJsb2cuaCIKKworI2RlZmluZSBMT0dfQlVGX01BU0sgKGxvZ19idWZfbGVuLTEpCisjZGVmaW5lIExPR19CVUYoaWR4KSAobG9nX2J1ZlsoaWR4KSAmIExPR19CVUZfTUFTS10pCisKK3N0YXRpYyBjaGFyIGxvZ19idWZbTE9HX0JVRl9MRU5dOworc3RhdGljIGludCBsb2dfYnVmX2xlbiA9IExPR19CVUZfTEVOOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9nX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9nX2VuZDsKK3VpbnQ4X3QgbG9nX2xldmVsOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvZ2J1Zl9sb2NrKTsKKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2xvZ19vcGVyYXRpb25zID0geworCS5vcGVuICAgICAgICAgICA9IGxvZ19vcGVuLAorCS5yZWxlYXNlICAgICAgICA9IGxvZ19yZWxlYXNlLAorCS5yZWFkICAgICAgICAgICA9IGxvZ19yZWFkLAorCS53cml0ZSAgICAgICAgICA9IGxvZ193cml0ZSwKKwkucG9sbCAgICAgICAgICAgPSBsb2dfcG9sbCwKK307CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsb2dfd2FpdCk7CisKK3N0YXRpYyB2b2lkIGVtaXRfbG9nX2NoYXIoY2hhciBjKQoreworCUxPR19CVUYobG9nX2VuZCkgPSBjOworCWxvZ19lbmQrKzsKKworCWlmIChsb2dfZW5kIC0gbG9nX3N0YXJ0ID4gbG9nX2J1Zl9sZW4pCisJCWxvZ19zdGFydCA9IGxvZ19lbmQgLSBsb2dfYnVmX2xlbjsKK30KKworc3RhdGljIGludCBmZGVidWdfbG9nKGNoYXIgKmZtdCwgLi4uKQoreworCWludCBwcmludGVkX2xlbjsKKwljaGFyICpwOworCXZhX2xpc3QgYXJnczsKKwlzdGF0aWMgY2hhciBkZWJ1Z19sb2dfYnVmWzI1Nl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRlZF9sZW4gPSB2c2NucHJpbnRmKGRlYnVnX2xvZ19idWYsIHNpemVvZihkZWJ1Z19sb2dfYnVmKSwgZm10LAorCQkJCSBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlmb3IgKHAgPSBkZWJ1Z19sb2dfYnVmOyAqcCAhPSAwOyBwKyspCisJCWVtaXRfbG9nX2NoYXIoKnApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXAoJmxvZ193YWl0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGVidWdfbG9nKGludCB0eXBlLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldHZhbCA9IDA7CisJY2hhciB0bXBfbG9nX2J1ZlsyNTZdOworCisJLyogb25seSBjcml0aWNhbCBpbmZvcm1hdGlvbiBnZXQgaW50byB0aGUgb2ZmaWNpYWwga2VybmVsIGxvZyAqLworCWlmICh0eXBlID09IExPR19UWVBFX0NSSVQpIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNjbnByaW50Zih0bXBfbG9nX2J1Ziwgc2l6ZW9mKHRtcF9sb2dfYnVmKSwgZm10LCBhcmdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiAlcyIsIHRtcF9sb2dfYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKworCWlmICgodHlwZSA9PSBMT0dfVFlQRV9DUklUKSB8fCAobG9nX2xldmVsICYgdHlwZSkpIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNjbnByaW50Zih0bXBfbG9nX2J1Ziwgc2l6ZW9mKHRtcF9sb2dfYnVmKSwgZm10LCBhcmdzKTsKKwkJZmRlYnVnX2xvZygiWyUxMHVdICVzIiwgKGppZmZpZXMgLyBIWiksIHRtcF9sb2dfYnVmKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBsb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbmNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlkZWNfbW9kdWxlX2NvdW50KCk7CisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgbG9nX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZXJyb3IsIGkgPSAwOworCWNoYXIgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIShsb2dfZW5kIC0gbG9nX3N0YXJ0KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKCFidWYpIHx8IChjb3VudCA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobG9nX3dhaXQsIChsb2dfc3RhcnQgLSBsb2dfZW5kKSk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKCghZXJyb3IpICYmIChsb2dfc3RhcnQgIT0gbG9nX2VuZCkgJiYgKGkgPCBjb3VudCkpIHsKKwkJYyA9IExPR19CVUYobG9nX3N0YXJ0KTsKKworCQlsb2dfc3RhcnQrKzsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJCWVycm9yID0gX19wdXRfdXNlcihjLCBidWYpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJCWJ1ZisrOworCQlpKys7CisKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOworCisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIGk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3NzaXplX3QgbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSAgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKwordW5zaWduZWQgaW50IGxvZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXBvbGxfd2FpdChmaWxlLCAmbG9nX3dhaXQsIHdhaXQpOworCisJaWYgKGxvZ19lbmQgLSBsb2dfc3RhcnQpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGUzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9sb2cuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2dfb3BlcmF0aW9uczsKK2V4dGVybiB1aW50OF90IGxvZ19sZXZlbDsKKworaW50IGRlYnVnX2xvZyhpbnQgdHlwZSwgY2hhciAqZm10LCAuLi4pOworaW50IGxvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBsb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Citzc2l6ZV90IGxvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCSBsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBsb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJICBsb2ZmX3QgKnBwb3MpOwordW5zaWduZWQgaW50IGxvZ19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjg5YmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvbWFpbi5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJwcm9jLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicm91dGluZy5oIgorI2luY2x1ZGUgInNlbmQuaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInZpcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RydWN0IGxpc3RfaGVhZCBpZl9saXN0Oworc3RydWN0IGhsaXN0X2hlYWQgZm9yd19iYXRfbGlzdDsKK3N0cnVjdCBobGlzdF9oZWFkIGZvcndfYmNhc3RfbGlzdDsKK3N0cnVjdCBoYXNodGFibGVfdCAqb3JpZ19oYXNoOworCitERUZJTkVfU1BJTkxPQ0sob3JpZ19oYXNoX2xvY2spOworREVGSU5FX1NQSU5MT0NLKGZvcndfYmF0X2xpc3RfbG9jayk7CitERUZJTkVfU1BJTkxPQ0soZm9yd19iY2FzdF9saXN0X2xvY2spOworCithdG9taWNfdCBvcmlnaW5hdG9yX2ludGVydmFsOworYXRvbWljX3QgdmlzX2ludGVydmFsOworYXRvbWljX3QgYWdncmVnYXRpb25fZW5hYmxlZDsKK2ludDE2X3QgbnVtX2huYTsKK2ludDE2X3QgbnVtX2lmczsKKworc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfZGV2aWNlOworCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkX3Rhc2s7CisKK3Vuc2lnbmVkIGNoYXIgYnJvYWRjYXN0QWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworYXRvbWljX3QgbW9kdWxlX3N0YXRlOworCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmF0X2V2ZW50X3dvcmtxdWV1ZTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCUlOSVRfTElTVF9IRUFEKCZpZl9saXN0KTsKKwlJTklUX0hMSVNUX0hFQUQoJmZvcndfYmF0X2xpc3QpOworCUlOSVRfSExJU1RfSEVBRCgmZm9yd19iY2FzdF9saXN0KTsKKworCWF0b21pY19zZXQoJm1vZHVsZV9zdGF0ZSwgTU9EVUxFX0lOQUNUSVZFKTsKKworCWF0b21pY19zZXQoJm9yaWdpbmF0b3JfaW50ZXJ2YWwsIDEwMDApOworCWF0b21pY19zZXQoJnZpc19pbnRlcnZhbCwgMTAwMCk7LyogVE9ETzogcmFpc2UgdGhpcyBsYXRlciwgdGhpcyBpcyBvbmx5CisJCQkJCSAqIGZvciBkZWJ1Z2dpbmcgbm93LiAqLworCWF0b21pY19zZXQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQsIDEpOworCisJLyogdGhlIG5hbWUgc2hvdWxkIG5vdCBiZSBsb25nZXIgdGhhbiAxMCBjaGFycyAtIHNlZQorCSAqIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNjM0LyAqLworCWJhdF9ldmVudF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmF0X2V2ZW50cyIpOworCisJaWYgKCFiYXRfZXZlbnRfd29ya3F1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IHNldHVwX3Byb2NmcygpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJYmF0X2RldmljZV9pbml0KCk7CisKKwkvKiBpbml0aWFsaXplIGxheWVyIDIgaW50ZXJmYWNlICovCisJc29mdF9kZXZpY2UgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikgLCAiYmF0JWQiLAorCQkJCSAgIGludGVyZmFjZV9zZXR1cCk7CisKKwlpZiAoIXNvZnRfZGV2aWNlKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiVW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBiYXRtYW4gaW50ZXJmYWNlXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KHNvZnRfZGV2aWNlKTsKKworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHRoZSBiYXRtYW4gaW50ZXJmYWNlOiAlaVxuIiwgcmV0dmFsKTsKKwkJZ290byBmcmVlX3NvZnRfZGV2aWNlOworCX0KKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaGFyZF9pZl9ub3RpZmllcik7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCAlcyVzIChjb21wYXRpYmlsaXR5IHZlcnNpb24gJWkpIGxvYWRlZCBcbiIsCisJICAgICAgICAgIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwgQ09NUEFUX1ZFUlNJT04pOworCisJcmV0dXJuIDA7CisKK2ZyZWVfc29mdF9kZXZpY2U6CisJZnJlZV9uZXRkZXYoc29mdF9kZXZpY2UpOworCXNvZnRfZGV2aWNlID0gTlVMTDsKK2VuZDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXNodXRkb3duX21vZHVsZSgpOworCisJaWYgKHNvZnRfZGV2aWNlKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KHNvZnRfZGV2aWNlKTsKKwkJc29mdF9kZXZpY2UgPSBOVUxMOworCX0KKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZoYXJkX2lmX25vdGlmaWVyKTsKKwljbGVhbnVwX3Byb2NmcygpOworCisJZGVzdHJveV93b3JrcXVldWUoYmF0X2V2ZW50X3dvcmtxdWV1ZSk7CisJYmF0X2V2ZW50X3dvcmtxdWV1ZSA9IE5VTEw7Cit9CisKKy8qIGFjdGl2YXRlcyB0aGUgbW9kdWxlLCBjcmVhdGVzIGJhdCBkZXZpY2UsIHN0YXJ0cyB0aW1lciAuLi4gKi8KK3ZvaWQgYWN0aXZhdGVfbW9kdWxlKHZvaWQpCit7CisJaWYgKG9yaWdpbmF0b3JfaW5pdCgpIDwgMSkKKwkJZ290byBlcnI7CisKKwlpZiAoaG5hX2xvY2FsX2luaXQoKSA8IDEpCisJCWdvdG8gZXJyOworCisJaWYgKGhuYV9nbG9iYWxfaW5pdCgpIDwgMSkKKwkJZ290byBlcnI7CisKKwlobmFfbG9jYWxfYWRkKHNvZnRfZGV2aWNlLT5kZXZfYWRkcik7CisKKwlpZiAoYmF0X2RldmljZV9zZXR1cCgpIDwgMSkKKwkJZ290byBlbmQ7CisKKwlpZiAodmlzX2luaXQoKSA8IDEpCisJCWdvdG8gZXJyOworCisJLyogKHJlKXN0YXJ0IGtlcm5lbCB0aHJlYWQgZm9yIHBhY2tldCBwcm9jZXNzaW5nICovCisJaWYgKCFrdGhyZWFkX3Rhc2spIHsKKwkJa3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4ocGFja2V0X3JlY3ZfdGhyZWFkLCBOVUxMLCAiYmF0bWFuLWFkdiIpOworCisJCWlmIChJU19FUlIoa3RocmVhZF90YXNrKSkgeworCQkJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJVbmFibGUgdG8gc3RhcnQgcGFja2V0IHJlY2VpdmUgdGhyZWFkXG4iKTsKKwkJCWt0aHJlYWRfdGFzayA9IE5VTEw7CisJCX0KKwl9CisKKwl1cGRhdGVfbWluX210dSgpOworCWF0b21pY19zZXQoJm1vZHVsZV9zdGF0ZSwgTU9EVUxFX0FDVElWRSk7CisJZ290byBlbmQ7CisKK2VycjoKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1lc2ggaW5mb3JtYXRpb24gc3RydWN0dXJlczogb3V0IG9mIG1lbSA/XG4iKTsKKwlzaHV0ZG93bl9tb2R1bGUoKTsKK2VuZDoKKwlyZXR1cm47Cit9CisKKy8qIHNodXRzIGRvd24gdGhlIHdob2xlIG1vZHVsZS4qLwordm9pZCBzaHV0ZG93bl9tb2R1bGUodm9pZCkKK3sKKwlhdG9taWNfc2V0KCZtb2R1bGVfc3RhdGUsIE1PRFVMRV9ERUFDVElWQVRJTkcpOworCisJcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpOworCWZsdXNoX3dvcmtxdWV1ZShiYXRfZXZlbnRfd29ya3F1ZXVlKTsKKworCXZpc19xdWl0KCk7CisKKwkvKiBkZWFjdGl2YXRlIGtlcm5lbCB0aHJlYWQgZm9yIHBhY2tldCBwcm9jZXNzaW5nIChpZiBydW5uaW5nKSAqLworCWlmIChrdGhyZWFkX3Rhc2spIHsKKwkJYXRvbWljX3NldCgmZXhpdF9jb25kLCAxKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0aHJlYWRfd2FpdCk7CisJCWt0aHJlYWRfc3RvcChrdGhyZWFkX3Rhc2spOworCisJCWt0aHJlYWRfdGFzayA9IE5VTEw7CisJfQorCisJb3JpZ2luYXRvcl9mcmVlKCk7CisKKwlobmFfbG9jYWxfZnJlZSgpOworCWhuYV9nbG9iYWxfZnJlZSgpOworCisJc3luY2hyb25pemVfbmV0KCk7CisJYmF0X2RldmljZV9kZXN0cm95KCk7CisKKwloYXJkaWZfcmVtb3ZlX2ludGVyZmFjZXMoKTsKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwlhdG9taWNfc2V0KCZtb2R1bGVfc3RhdGUsIE1PRFVMRV9JTkFDVElWRSk7Cit9CisKK3ZvaWQgaW5jX21vZHVsZV9jb3VudCh2b2lkKQoreworCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKK30KKwordm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpCit7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK2ludCBhZGRyX3RvX3N0cmluZyhjaGFyICpidWZmLCB1aW50OF90ICphZGRyKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKK30KKworLyogcmV0dXJucyAxIGlmIHRoZXkgYXJlIHRoZSBzYW1lIG9yaWdpbmF0b3IgKi8KKworaW50IGNvbXBhcmVfb3JpZyh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpCit7CisJcmV0dXJuIChtZW1jbXAoZGF0YTEsIGRhdGEyLCBFVEhfQUxFTikgPT0gMCA/IDEgOiAwKTsKK30KKworLyogaGFzaGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLworLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KK2ludCBjaG9vc2Vfb3JpZyh2b2lkICpkYXRhLCBpbnQzMl90IHNpemUpCit7CisJdW5zaWduZWQgY2hhciAqa2V5ID0gZGF0YTsKKwl1aW50MzJfdCBoYXNoID0gMDsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaGFzaCArPSBrZXlbaV07CisJCWhhc2ggKz0gKGhhc2ggPDwgMTApOworCQloYXNoIF49IChoYXNoID4+IDYpOworCX0KKworCWhhc2ggKz0gKGhhc2ggPDwgMyk7CisJaGFzaCBePSAoaGFzaCA+PiAxMSk7CisJaGFzaCArPSAoaGFzaCA8PCAxNSk7CisKKwlyZXR1cm4gaGFzaCAlIHNpemU7Cit9CisKK2ludCBpc19teV9tYWModWludDhfdCAqYWRkcikKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhdG1hbl9pZiwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKChiYXRtYW5faWYtPm5ldF9kZXYpICYmCisJCSAgICAoY29tcGFyZV9vcmlnKGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIGFkZHIpKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKKworfQorCitpbnQgaXNfYmNhc3QodWludDhfdCAqYWRkcikKK3sKKwlyZXR1cm4gKGFkZHJbMF0gPT0gKHVpbnQ4X3QpMHhmZikgJiYgKGFkZHJbMV0gPT0gKHVpbnQ4X3QpMHhmZik7Cit9CisKK2ludCBpc19tY2FzdCh1aW50OF90ICphZGRyKQoreworCXJldHVybiAqYWRkciAmIDB4MDE7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShEUklWRVJfREVWSUNFKTsKKyNpZmRlZiBSRVZJU0lPTl9WRVJTSU9OCitNT0RVTEVfVkVSU0lPTihTT1VSQ0VfVkVSU0lPTiAiLSIgUkVWSVNJT05fVkVSU0lPTik7CisjZWxzZQorTU9EVUxFX1ZFUlNJT04oU09VUkNFX1ZFUlNJT04pOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjYjZiNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L21haW4uaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKy8qIEtlcm5lbCBQcm9ncmFtbWluZyAqLworI2RlZmluZSBMSU5VWAorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk1hcmVrIExpbmRuZXIgPGxpbmRuZXJfbWFyZWtAeWFob28uZGU+LCBTaW1vbiBXdW5kZXJsaWNoIDxzaXd1QGhyei50dS1jaGVtbml0ei5kZT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICAgIkIuQS5ULk0uQS5OLiBhZHZhbmNlZCIKKyNkZWZpbmUgRFJJVkVSX0RFVklDRSAiYmF0bWFuLWFkdiIKKworI2RlZmluZSBTT1VSQ0VfVkVSU0lPTiAiMC4yLjEtYmV0YSIKKworCisvKiBCLkEuVC5NLkEuTi4gcGFyYW1ldGVycyAqLworCisjZGVmaW5lIFRRX01BWF9WQUxVRSAyNTUKKyNkZWZpbmUgSklUVEVSIDIwCisjZGVmaW5lIFRUTCA1MAkJICAgICAgICAgIC8qIFRpbWUgVG8gTGl2ZSBvZiBicm9hZGNhc3QgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUFYX0FERFIgMTYJICAgICAgICAgIC8qIG51bWJlciBvZiBpbnRlcmZhY2VzIHdoaWNoIGNhbiBiZSBhZGRlZCB0bworCQkJCSAgICogYmF0bWFuLiAqLworCisjZGVmaW5lIFBVUkdFX1RJTUVPVVQgMjAwMDAwICAgICAgLyogcHVyZ2Ugb3JpZ2luYXRvcnMgYWZ0ZXIgdGltZSBpbiBtcyBpZiBubworCQkJCSAgICogdmFsaWQgcGFja2V0IGNvbWVzIGluIC0+IFRPRE86IGNoZWNrCisJCQkJICAgKiBpbmZsdWVuY2Ugb24gVFFfTE9DQUxfV0lORE9XX1NJWkUgKi8KKyNkZWZpbmUgTE9DQUxfSE5BX1RJTUVPVVQgMzYwMDAwMAorCisjZGVmaW5lIFRRX0xPQ0FMX1dJTkRPV19TSVpFIDY0ICAgLyogc2xpZGluZyBwYWNrZXQgcmFuZ2Ugb2YgcmVjZWl2ZWQgb3JpZ2luYXRvcgorCQkJCSAgICogbWVzc2FnZXMgaW4gc3F1ZW5jZSBudW1iZXJzIChzaG91bGQgYmUgYQorCQkJCSAgICogbXVsdGlwbGUgb2Ygb3VyIHdvcmQgc2l6ZSkgKi8KKyNkZWZpbmUgVFFfR0xPQkFMX1dJTkRPV19TSVpFIDUKKyNkZWZpbmUgVFFfTE9DQUxfQklEUkVDVF9TRU5EX01JTklNVU0gMQorI2RlZmluZSBUUV9MT0NBTF9CSURSRUNUX1JFQ1ZfTUlOSU1VTSAxCisjZGVmaW5lIFRRX1RPVEFMX0JJRFJFQ1RfTElNSVQgMQorCisjZGVmaW5lIFRRX0hPUF9QRU5BTFRZIDEwCisKKyNkZWZpbmUgTlVNX1dPUkRTIChUUV9MT0NBTF9XSU5ET1dfU0laRSAvIFdPUkRfQklUX1NJWkUpCisKKyNkZWZpbmUgUEFDS0JVRkZfU0laRSAyMDAwCisjZGVmaW5lIExPR19CVUZfTEVOIDgxOTIJICAvKiBoYXMgdG8gYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEVUSF9TVFJfTEVOIDIwCisKKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX0JZVEVTIDUxMiAvKiBzaG91bGQgbm90IGJlIGJpZ2dlciB0aGFuIDUxMiBieXRlcyBvcgorCQkJCSAgICogY2hhbmdlIHRoZSBzaXplIG9mCisJCQkJICAgKiBmb3J3X3BhY2tldC0+ZGlyZWN0X2xpbmtfZmxhZ3MgKi8KKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX01TIDEwMAorCisjZGVmaW5lIE1PRFVMRV9JTkFDVElWRSAwCisjZGVmaW5lIE1PRFVMRV9BQ1RJVkUgMQorI2RlZmluZSBNT0RVTEVfREVBQ1RJVkFUSU5HIDIKKworCisvKgorICogTG9nZ2luZworICovCisKKyNkZWZpbmUgTE9HX1RZUEVfQ1JJVCAwCQkvKiBoaWdoZXN0IHByaW9yaXR5IGZvciBmYXRhbCBlcnJvcnMgc3VjaCBhcworCQkJCSAqIGJsb2NrZWQgc29ja2V0cyAvIGZhaWxlZCBwYWNrZXQgZGVsaXZlcnkgLworCQkJCSAqIHByb2dyYW1taW5nIGVycm9ycyAqLworI2RlZmluZSBMT0dfVFlQRV9XQVJOIDEJCS8qIHdhcm5pbmdzIGZvciBzbWFsbCBlcnJvcnMgbGlrZSB3cm9uZyB1c2VyCisJCQkJICogaW5wdXQgLyBkYW1hZ2VkIHBhY2tldHMgLyBldGMgKi8KKyNkZWZpbmUgTE9HX1RZUEVfTk9USUNFIDIJLyogbm90aWNlIGluZm9ybWF0aW9uIGZvciBuZXcgaW50ZXJmYWNlcyAvCisJCQkJICogY2hhbmdlZCBzZXR0aW5ncyAvIG5ldyBvcmlnaW5hdG9ycyAvIGV0YyAqLworI2RlZmluZSBMT0dfVFlQRV9CQVRNQU4gNAkvKiBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0aW5nIC8gZmxvb2RpbmcgLworCQkJCSAqIGJyb2FkY2FzdGluZyAvIGV0YyAqLworI2RlZmluZSBMT0dfVFlQRV9ST1VURVMgOAkvKiByb3V0ZSBvciBobmEgYWRkZWQgLyBjaGFuZ2VkIC8gZGVsZXRlZCAqLworI2RlZmluZSBMT0dfVFlQRV9DUklUX05BTUUJImNyaXRpY2FsIgorI2RlZmluZSBMT0dfVFlQRV9XQVJOX05BTUUJIndhcm5pbmdzIgorI2RlZmluZSBMT0dfVFlQRV9OT1RJQ0VfTkFNRQkibm90aWNlcyIKKyNkZWZpbmUgTE9HX1RZUEVfQkFUTUFOX05BTUUJImJhdG1hbiIKKyNkZWZpbmUgTE9HX1RZUEVfUk9VVEVTX05BTUUJInJvdXRlcyIKKworLyoKKyAqICBWaXMKKyAqLworCisvKiAjZGVmaW5lIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCisvKgorICogS2VybmVsIGhlYWRlcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4JLyogbXV0ZXggKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogbmVlZGVkIGJ5IGFsbCBtb2R1bGVzICovCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CS8qIG5ldGRldmljZSAqLworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIGV0aGVybmV0IGhlYWRlciAqLworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4JCS8qIHBvbGxfdGFibGUgKi8KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CS8qIGtlcm5lbCB0aHJlYWRzICovCisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CS8qIHNjaGVkdWxlIHR5cGVzICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CS8qIHdvcmtxdWV1ZSAqLworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CQkvKiBzdHJ1Y3Qgc29jayAqLworI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjaWZuZGVmIFJFVklTSU9OX1ZFUlNJT04KKyNkZWZpbmUgUkVWSVNJT05fVkVSU0lPTl9TVFIgIiIKKyNlbHNlCisjZGVmaW5lIFJFVklTSU9OX1ZFUlNJT05fU1RSICIgIlJFVklTSU9OX1ZFUlNJT04KKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBpZl9saXN0OworZXh0ZXJuIHN0cnVjdCBobGlzdF9oZWFkIGZvcndfYmF0X2xpc3Q7CitleHRlcm4gc3RydWN0IGhsaXN0X2hlYWQgZm9yd19iY2FzdF9saXN0OworZXh0ZXJuIHN0cnVjdCBoYXNodGFibGVfdCAqb3JpZ19oYXNoOworCitleHRlcm4gc3BpbmxvY2tfdCBvcmlnX2hhc2hfbG9jazsKK2V4dGVybiBzcGlubG9ja190IGZvcndfYmF0X2xpc3RfbG9jazsKK2V4dGVybiBzcGlubG9ja190IGZvcndfYmNhc3RfbGlzdF9sb2NrOworCitleHRlcm4gYXRvbWljX3Qgb3JpZ2luYXRvcl9pbnRlcnZhbDsKK2V4dGVybiBhdG9taWNfdCB2aXNfaW50ZXJ2YWw7CitleHRlcm4gYXRvbWljX3QgYWdncmVnYXRpb25fZW5hYmxlZDsKK2V4dGVybiBpbnQxNl90IG51bV9obmE7CitleHRlcm4gaW50MTZfdCBudW1faWZzOworCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfZGV2aWNlOworCitleHRlcm4gdW5zaWduZWQgY2hhciBicm9hZGNhc3RBZGRyW107CitleHRlcm4gYXRvbWljX3QgbW9kdWxlX3N0YXRlOworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiYXRfZXZlbnRfd29ya3F1ZXVlOworCit2b2lkIGFjdGl2YXRlX21vZHVsZSh2b2lkKTsKK3ZvaWQgc2h1dGRvd25fbW9kdWxlKHZvaWQpOwordm9pZCBpbmNfbW9kdWxlX2NvdW50KHZvaWQpOwordm9pZCBkZWNfbW9kdWxlX2NvdW50KHZvaWQpOworaW50IGFkZHJfdG9fc3RyaW5nKGNoYXIgKmJ1ZmYsIHVpbnQ4X3QgKmFkZHIpOworaW50IGNvbXBhcmVfb3JpZyh2b2lkICpkYXRhMSwgdm9pZCAqZGF0YTIpOworaW50IGNob29zZV9vcmlnKHZvaWQgKmRhdGEsIGludDMyX3Qgc2l6ZSk7CitpbnQgaXNfbXlfbWFjKHVpbnQ4X3QgKmFkZHIpOworaW50IGlzX2JjYXN0KHVpbnQ4X3QgKmFkZHIpOworaW50IGlzX21jYXN0KHVpbnQ4X3QgKmFkZHIpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyN2NhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3BhY2tldC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjZGVmaW5lIEVUSF9QX0JBVE1BTiAgMHg0MzA1CS8qIHVub2ZmaWNpYWwvbm90IHJlZ2lzdGVyZWQgRXRoZXJ0eXBlICovCisKKyNkZWZpbmUgQkFUX1BBQ0tFVCAgICAweDAxCisjZGVmaW5lIEJBVF9JQ01QICAgICAgMHgwMgorI2RlZmluZSBCQVRfVU5JQ0FTVCAgIDB4MDMKKyNkZWZpbmUgQkFUX0JDQVNUICAgICAweDA0CisjZGVmaW5lIEJBVF9WSVMgICAgICAgMHgwNQorCisvKiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgYmF0Y3RsIHdoaWNoIG5lZWRzIHRoZXNlIGRlZmluZXMgKi8KKyNkZWZpbmUgQ09NUEFUX1ZFUlNJT04gOAorI2RlZmluZSBESVJFQ1RMSU5LIDB4NDAKKyNkZWZpbmUgVklTX1NFUlZFUiAweDIwCisKKy8qIElDTVAgbWVzc2FnZSB0eXBlcyAqLworI2RlZmluZSBFQ0hPX1JFUExZIDAKKyNkZWZpbmUgREVTVElOQVRJT05fVU5SRUFDSEFCTEUgMworI2RlZmluZSBFQ0hPX1JFUVVFU1QgOAorI2RlZmluZSBUVExfRVhDRUVERUQgMTEKKyNkZWZpbmUgUEFSQU1FVEVSX1BST0JMRU0gMTIKKworLyogdmlzIGRlZmluZXMgKi8KKyNkZWZpbmUgVklTX1RZUEVfU0VSVkVSX1NZTkMJCTAKKyNkZWZpbmUgVklTX1RZUEVfQ0xJRU5UX1VQREFURQkJMQorCitzdHJ1Y3QgYmF0bWFuX3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgZmxhZ3M7ICAgIC8qIDB4NDA6IERJUkVDVExJTksgZmxhZywgMHgyMCBWSVNfU0VSVkVSIGZsYWcuLi4gKi8KKwl1aW50OF90ICB0cTsKKwl1aW50MTZfdCBzZXFubzsKKwl1aW50OF90ICBvcmlnWzZdOworCXVpbnQ4X3QgIHByZXZfc2VuZGVyWzZdOworCXVpbnQ4X3QgIHR0bDsKKwl1aW50OF90ICBudW1faG5hOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBCQVRfUEFDS0VUX0xFTiBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpCisKK3N0cnVjdCBpY21wX3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgbXNnX3R5cGU7IC8qIHNlZSBJQ01QIG1lc3NhZ2UgdHlwZXMgYWJvdmUgKi8KKwl1aW50OF90ICB0dGw7CisJdWludDhfdCAgZHN0WzZdOworCXVpbnQ4X3QgIG9yaWdbNl07CisJdWludDE2X3Qgc2Vxbm87CisJdWludDhfdCAgdWlkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVuaWNhc3RfcGFja2V0IHsKKwl1aW50OF90ICBwYWNrZXRfdHlwZTsKKwl1aW50OF90ICB2ZXJzaW9uOyAgLyogYmF0bWFuIHZlcnNpb24gZmllbGQgKi8KKwl1aW50OF90ICBkZXN0WzZdOworCXVpbnQ4X3QgIHR0bDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBiY2FzdF9wYWNrZXQgeworCXVpbnQ4X3QgIHBhY2tldF90eXBlOworCXVpbnQ4X3QgIHZlcnNpb247ICAvKiBiYXRtYW4gdmVyc2lvbiBmaWVsZCAqLworCXVpbnQ4X3QgIG9yaWdbNl07CisJdWludDE2X3Qgc2Vxbm87Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdmlzX3BhY2tldCB7CisJdWludDhfdCAgcGFja2V0X3R5cGU7CisJdWludDhfdCAgdmVyc2lvbjsgICAgICAgIC8qIGJhdG1hbiB2ZXJzaW9uIGZpZWxkICovCisJdWludDhfdCAgdmlzX3R5cGU7CSAvKiB3aGljaCB0eXBlIG9mIHZpcy1wYXJ0aWNpcGFudCBzZW50IHRoaXM/ICovCisJdWludDhfdCAgc2Vxbm87CQkgLyogc2VxdWVuY2UgbnVtYmVyICovCisJdWludDhfdCAgZW50cmllczsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGJlaGluZCB0aGlzIHN0cnVjdCAqLworCXVpbnQ4X3QgIHR0bDsJCSAvKiBUVEwgKi8KKwl1aW50OF90ICB2aXNfb3JpZ1s2XTsJIC8qIG9yaWdpbmF0b3IgdGhhdCBpbmZvcm1zIGFib3V0IGl0cworCQkJCSAgKiBuZWlnaGJvdXJzICovCisJdWludDhfdCAgdGFyZ2V0X29yaWdbNl07IC8qIHdobyBzaG91bGQgcmVjZWl2ZSB0aGlzIHBhY2tldCAqLworCXVpbnQ4X3QgIHNlbmRlcl9vcmlnWzZdOyAvKiB3aG8gc2VudCBvciByZWJyb2FkY2FzdGVkIHRoaXMgcGFja2V0ICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzNkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmMKQEAgLTAsMCArMSw5NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInByb2MuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInZpcy5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCitzdGF0aWMgdWludDhfdCB2aXNfZm9ybWF0ID0gRE9UX0RSQVc7CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYmF0bWFuX2RpciwgKnByb2NfaW50ZXJmYWNlX2ZpbGU7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX29yaWdfaW50ZXJ2YWxfZmlsZSwgKnByb2Nfb3JpZ2luYXRvcnNfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbG9nX2ZpbGUsICpwcm9jX2xvZ19sZXZlbF9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY190cmFuc3RfbG9jYWxfZmlsZTsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfdHJhbnN0X2dsb2JhbF9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY192aXNfZmlsZSwgKnByb2NfdmlzX2Zvcm1hdF9maWxlOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19hZ2dyX2ZpbGU7CisKK3N0YXRpYyBpbnQgcHJvY19pbnRlcmZhY2VzX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkgeworCQlzZXFfcHJpbnRmKHNlcSwgIlslOHNdICVzICVzIFxuIiwKKwkJCSAgIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUgPworCQkJICAgICJhY3RpdmUiIDogImluYWN0aXZlIiksCisJCQkgICBiYXRtYW5faWYtPmRldiwKKwkJCSAgIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9BQ1RJVkUgPworCQkJICAgIGJhdG1hbl9pZi0+YWRkcl9zdHIgOiAiICIpKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX2ludGVyZmFjZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19pbnRlcmZhY2VzX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX2ludGVyZmFjZXNfd3JpdGUoc3RydWN0IGZpbGUgKmluc3RhbmNlLAorCQkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWZmZXIsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqZGF0YSkKK3sKKwljaGFyICppZl9zdHJpbmcsICpjb2xvbl9wdHIgPSBOVUxMLCAqY3JfcHRyID0gTlVMTDsKKwlpbnQgbm90X2NvcGllZCA9IDAsIGlmX251bSA9IDA7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmID0gTlVMTDsKKworCWlmX3N0cmluZyA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCisJaWYgKCFpZl9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvdW50ID4gSUZOQU1TSVogLSAxKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9XQVJOLAorCQkJICAiQ2FuJ3QgYWRkIGludGVyZmFjZTogZGV2aWNlIG5hbWUgaXMgdG9vIGxvbmdcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlub3RfY29waWVkID0gY29weV9mcm9tX3VzZXIoaWZfc3RyaW5nLCB1c2VyYnVmZmVyLCBjb3VudCk7CisJaWZfc3RyaW5nW2NvdW50IC0gbm90X2NvcGllZCAtIDFdID0gMDsKKworCWNvbG9uX3B0ciA9IHN0cmNocihpZl9zdHJpbmcsICc6Jyk7CisJaWYgKGNvbG9uX3B0cikKKwkJKmNvbG9uX3B0ciA9IDA7CisKKwlpZiAoIWNvbG9uX3B0cikgeworCQljcl9wdHIgPSBzdHJjaHIoaWZfc3RyaW5nLCAnXG4nKTsKKwkJaWYgKGNyX3B0cikKKwkJCSpjcl9wdHIgPSAwOworCX0KKworCWlmIChzdHJsZW4oaWZfc3RyaW5nKSA9PSAwKSB7CisJCXNodXRkb3duX21vZHVsZSgpOworCQludW1faWZzID0gMDsKKwkJZ290byBlbmQ7CisJfQorCisJLyogYWRkIGludGVyZmFjZSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChzdHJuY21wKGJhdG1hbl9pZi0+ZGV2LCBpZl9zdHJpbmcsIGNvdW50KSA9PSAwKSB7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkdpdmVuIGludGVyZmFjZSBpcyBhbHJlYWR5IGFjdGl2ZTogJXNcbiIsIGlmX3N0cmluZyk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCWdvdG8gZW5kOworCisJCX0KKworCQlpZl9udW0rKzsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwloYXJkaWZfYWRkX2ludGVyZmFjZShpZl9zdHJpbmcsIGlmX251bSk7CisKKwlpZiAoKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpID09IE1PRFVMRV9JTkFDVElWRSkgJiYKKwkgICAgKGhhcmRpZl9nZXRfYWN0aXZlX2lmX251bSgpID4gMCkpCisJCWFjdGl2YXRlX21vZHVsZSgpOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsaXN0X2VtcHR5KCZpZl9saXN0KSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJZ290byBlbmQ7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJbnVtX2lmcyA9IGlmX251bSArIDE7CisJcmV0dXJuIGNvdW50OworCitlbmQ6CisJa2ZyZWUoaWZfc3RyaW5nKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19vcmlnX2ludGVydmFsX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzZXFfcHJpbnRmKHNlcSwgIiVpXG4iLCBhdG9taWNfcmVhZCgmb3JpZ2luYXRvcl9pbnRlcnZhbCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2Nfb3JpZ19pbnRlcnZhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqaW50ZXJ2YWxfc3RyaW5nOworCWludCBub3RfY29waWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wOworCWludCByZXR2YWw7CisKKwlpbnRlcnZhbF9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghaW50ZXJ2YWxfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdF9jb3BpZWQgPSBjb3B5X2Zyb21fdXNlcihpbnRlcnZhbF9zdHJpbmcsIGJ1ZmZlciwgY291bnQpOworCWludGVydmFsX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlyZXR2YWwgPSBzdHJpY3Rfc3RydG91bChpbnRlcnZhbF9zdHJpbmcsIDEwLCAmb3JpZ2luYXRvcl9pbnRlcnZhbF90bXApOworCWlmIChyZXR2YWwpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJOZXcgb3JpZ2luYXRvciBpbnRlcnZhbCBpbnZhbGlkXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wIDw9IEpJVFRFUiAqIDIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sCisJCQkgICJOZXcgb3JpZ2luYXRvciBpbnRlcnZhbCB0b28gc21hbGw6ICVpIChtaW46ICVpKVxuIiwKKwkJCSAgb3JpZ2luYXRvcl9pbnRlcnZhbF90bXAsIEpJVFRFUiAqIDIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLAorCQkgICJDaGFuZ2luZyBvcmlnaW5hdG9yIGludGVydmFsIGZyb206ICVpIHRvOiAlaVxuIiwKKwkJICBhdG9taWNfcmVhZCgmb3JpZ2luYXRvcl9pbnRlcnZhbCksIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wKTsKKworCWF0b21pY19zZXQoJm9yaWdpbmF0b3JfaW50ZXJ2YWwsIG9yaWdpbmF0b3JfaW50ZXJ2YWxfdG1wKTsKKworZW5kOgorCWtmcmVlKGludGVydmFsX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2Nfb3JpZ19pbnRlcnZhbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX29yaWdfaW50ZXJ2YWxfcmVhZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19vcmlnaW5hdG9yc19yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CisJaW50IGJhdG1hbl9jb3VudCA9IDA7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIHJvdXRlcl9zdHJbRVRIX1NUUl9MRU5dOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChsaXN0X2VtcHR5KCZpZl9saXN0KSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gZGlzYWJsZWQgLSBwbGVhc2Ugc3BlY2lmeSBpbnRlcmZhY2VzIHRvIGVuYWJsZSBpdCBcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJc2VxX3ByaW50ZihzZXEsICJCQVRNQU4gZGlzYWJsZWQgLSBwcmltYXJ5IGludGVyZmFjZSBub3QgYWN0aXZlIFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiICAlLTE0cyAoJXMvJWkpICUxN3MgWyUxMHNdOiAlMjBzIC4uLiBbQi5BLlQuTS5BLk4uIGFkdiAlcyVzLCBNYWluSUYvTUFDOiAlcy8lc10gXG4iLAorCQkgICAiT3JpZ2luYXRvciIsICIjIiwgVFFfTUFYX1ZBTFVFLCAiTmV4dGhvcCIsICJvdXRnb2luZ0lGIiwKKwkJICAgIlBvdGVudGlhbCBuZXh0aG9wcyIsIFNPVVJDRV9WRVJTSU9OLCBSRVZJU0lPTl9WRVJTSU9OX1NUUiwKKwkJICAgKChzdHJ1Y3QgYmF0bWFuX2lmICopaWZfbGlzdC5uZXh0KS0+ZGV2LAorCQkgICAoKHN0cnVjdCBiYXRtYW5faWYgKilpZl9saXN0Lm5leHQpLT5hZGRyX3N0cik7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCWlmICghb3JpZ19ub2RlLT5yb3V0ZXIpCisJCQljb250aW51ZTsKKworCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA9PSAwKQorCQkJY29udGludWU7CisKKwkJYmF0bWFuX2NvdW50Kys7CisKKwkJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG9yaWdfbm9kZS0+b3JpZyk7CisJCWFkZHJfdG9fc3RyaW5nKHJvdXRlcl9zdHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMTdzICAoJTNpKSAlMTdzIFslMTBzXToiLAorCQkJICAgb3JpZ19zdHIsIG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcsCisJCQkgICByb3V0ZXJfc3RyLCBvcmlnX25vZGUtPnJvdXRlci0+aWZfaW5jb21pbmctPmRldik7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgbmVpZ2hfbm9kZS0+YWRkcik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlMTdzICglM2kpIiwKKwkJCQkgICBvcmlnX3N0ciwgbmVpZ2hfbm9kZS0+dHFfYXZnKTsKKwkJfQorCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwlpZiAoYmF0bWFuX2NvdW50ID09IDApCisJCXNlcV9wcmludGYoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLiBcbiIpOworCitlbmQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19vcmlnaW5hdG9yc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX29yaWdpbmF0b3JzX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHByb2NfbG9nX2xldmVsX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKworCXNlcV9wcmludGYoc2VxLCAiW3hdICVzICglZClcbiIsIExPR19UWVBFX0NSSVRfTkFNRSwgTE9HX1RZUEVfQ1JJVCk7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzICglZClcbiIsCisJCSAgIChMT0dfVFlQRV9XQVJOICYgbG9nX2xldmVsKSA/ICd4JyA6ICcgJywKKwkJICAgTE9HX1RZUEVfV0FSTl9OQU1FLCBMT0dfVFlQRV9XQVJOKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlslY10gJXMgKCVkKVxuIiwKKwkJICAgKExPR19UWVBFX05PVElDRSAmIGxvZ19sZXZlbCkgPyAneCcgOiAnICcsCisJCSAgIExPR19UWVBFX05PVElDRV9OQU1FLCBMT0dfVFlQRV9OT1RJQ0UpOworCXNlcV9wcmludGYoc2VxLCAiWyVjXSAlcyAoJWQpXG4iLAorCQkgICAoTE9HX1RZUEVfQkFUTUFOICYgbG9nX2xldmVsKSA/ICd4JyA6ICcgJywKKwkJICAgTE9HX1RZUEVfQkFUTUFOX05BTUUsIExPR19UWVBFX0JBVE1BTik7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzICglZClcbiIsCisJCSAgIChMT0dfVFlQRV9ST1VURVMgJiBsb2dfbGV2ZWwpID8gJ3gnIDogJyAnLAorCQkgICBMT0dfVFlQRV9ST1VURVNfTkFNRSwgTE9HX1RZUEVfUk9VVEVTKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX2xvZ19sZXZlbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2xvZ19sZXZlbF9yZWFkLCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19sb2dfbGV2ZWxfd3JpdGUoc3RydWN0IGZpbGUgKmluc3RhbmNlLAorCQkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmRhdGEpCit7CisJY2hhciAqbG9nX2xldmVsX3N0cmluZywgKnRva3B0ciwgKmNwOworCWludCBmaW5pc2hlZCwgbm90X2NvcGllZCA9IDA7CisJdW5zaWduZWQgbG9uZyBsb2dfbGV2ZWxfdG1wID0gMDsKKworCWxvZ19sZXZlbF9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghbG9nX2xldmVsX3N0cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlub3RfY29waWVkID0gY29weV9mcm9tX3VzZXIobG9nX2xldmVsX3N0cmluZywgdXNlcmJ1ZmZlciwgY291bnQpOworCWxvZ19sZXZlbF9zdHJpbmdbY291bnQgLSBub3RfY29waWVkIC0gMV0gPSAwOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGxvZ19sZXZlbF9zdHJpbmcsIDEwLCAmbG9nX2xldmVsX3RtcCkgPCAwKSB7CisJCS8qIHdhcyBub3QgYSBudW1iZXIsIGRvaW5nIHRleHR1YWwgcGFyc2luZyAqLworCQlsb2dfbGV2ZWxfdG1wID0gMDsKKwkJdG9rcHRyID0gbG9nX2xldmVsX3N0cmluZzsKKworCQlmb3IgKGNwID0gbG9nX2xldmVsX3N0cmluZywgZmluaXNoZWQgPSAwOyAhZmluaXNoZWQ7IGNwKyspIHsKKwkJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlIDA6CisJCQkJZmluaXNoZWQgPSAxOworCQkJY2FzZSAnICc6CisJCQljYXNlICdcbic6CisJCQljYXNlICdcdCc6CisJCQkJKmNwID0gMDsKKwkJCQkvKiBjb21wYXJlICovCisJCQkJaWYgKHN0cmNtcCh0b2twdHIsIExPR19UWVBFX1dBUk5fTkFNRSkgPT0gMCkKKwkJCQkJbG9nX2xldmVsX3RtcCB8PSBMT0dfVFlQRV9XQVJOOworCQkJCWlmIChzdHJjbXAodG9rcHRyLCBMT0dfVFlQRV9OT1RJQ0VfTkFNRSkgPT0gMCkKKwkJCQkJbG9nX2xldmVsX3RtcCB8PSBMT0dfVFlQRV9OT1RJQ0U7CisJCQkJaWYgKHN0cmNtcCh0b2twdHIsIExPR19UWVBFX0JBVE1BTl9OQU1FKSA9PSAwKQorCQkJCQlsb2dfbGV2ZWxfdG1wIHw9IExPR19UWVBFX0JBVE1BTjsKKwkJCQlpZiAoc3RyY21wKHRva3B0ciwgTE9HX1RZUEVfUk9VVEVTX05BTUUpID09IDApCisJCQkJCWxvZ19sZXZlbF90bXAgfD0gTE9HX1RZUEVfUk9VVEVTOworCQkJCXRva3B0ciA9IGNwICsgMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQl9CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX0NSSVQsICJDaGFuZ2luZyBsb2dfbGV2ZWwgZnJvbTogJWkgdG86ICVpXG4iLAorCQkgIGxvZ19sZXZlbCwgbG9nX2xldmVsX3RtcCk7CisJbG9nX2xldmVsID0gbG9nX2xldmVsX3RtcDsKKworCWtmcmVlKGxvZ19sZXZlbF9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX3RyYW5zdF9sb2NhbF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyg0MDk2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmlmX2xpc3QpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlzZXFfcHJpbnRmKHNlcSwgIkJBVE1BTiBkaXNhYmxlZCAtIHBsZWFzZSBzcGVjaWZ5IGludGVyZmFjZXMgdG8gZW5hYmxlIGl0IFxuIik7CisJCWdvdG8gZW5kOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJc2VxX3ByaW50ZihzZXEsICJMb2NhbGx5IHJldHJpZXZlZCBhZGRyZXNzZXMgKGZyb20gJXMpIGFubm91bmNlZCB2aWEgSE5BOlxuIiwgc29mdF9kZXZpY2UtPm5hbWUpOworCisJaG5hX2xvY2FsX2ZpbGxfYnVmZmVyX3RleHQoYnVmLCA0MDk2KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmKTsKKworZW5kOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfbG9jYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY190cmFuc3RfbG9jYWxfcmVhZCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfZ2xvYmFsX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwljaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jKDQwOTYsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAobGlzdF9lbXB0eSgmaWZfbGlzdCkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXNlcV9wcmludGYoc2VxLCAiQkFUTUFOIGRpc2FibGVkIC0gcGxlYXNlIHNwZWNpZnkgaW50ZXJmYWNlcyB0byBlbmFibGUgaXQgXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisKKwlzZXFfcHJpbnRmKHNlcSwgIkdsb2JhbGx5IGFubm91bmNlZCBITkFzIHJlY2VpdmVkIHZpYSB0aGUgbWVzaCAodHJhbnNsYXRpb24gdGFibGUpOlxuIik7CisKKwlobmFfZ2xvYmFsX2ZpbGxfYnVmZmVyX3RleHQoYnVmLCA0MDk2KTsKKwlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmKTsKKworZW5kOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190cmFuc3RfZ2xvYmFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdHJhbnN0X2dsb2JhbF9yZWFkLCBOVUxMKTsKK30KKworLyogaW5zZXJ0IGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIG9mIG9uZSBvcmlnaW5hdG9yICovCisKK3N0YXRpYyB2b2lkIHByb2NfdmlzX2luc2VydF9pbnRlcmZhY2UoY29uc3QgdWludDhfdCAqaW50ZXJmYWNlLAorCQkJCSAgICAgIHN0cnVjdCB2aXNfaWZfbGlzdCAqKmlmX2VudHJ5LAorCQkJCSAgICAgIGJvb2wgcHJpbWFyeSkKK3sKKwkvKiBEaWQgd2UgZ2V0IGFuIGVtcHR5IGxpc3Q/ICh0aGVuIGluc2VydCBpbWVkaWF0ZWx5KSAqLworCWlmKCppZl9lbnRyeSA9PSBOVUxMKSB7CisJCSppZl9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaWZfbGlzdCksIEdGUF9LRVJORUwpOworCQlpZiAoKmlmX2VudHJ5ID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJKCppZl9lbnRyeSktPnByaW1hcnkgPSBwcmltYXJ5OworCQkoKmlmX2VudHJ5KS0+bmV4dCA9IE5VTEw7CisJCW1lbWNweSgoKmlmX2VudHJ5KS0+YWRkciwgaW50ZXJmYWNlLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJc3RydWN0IHZpc19pZl9saXN0ICpoZWFkX2lmX2VudHJ5ID0gKmlmX2VudHJ5OworCQkvKiBEbyB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBpbnRlcmZhY2UgaW4gb3VyIGxpc3Q/ICovCisJCXdoaWxlICghY29tcGFyZV9vcmlnKCgqaWZfZW50cnkpLT5hZGRyLCAodm9pZCAqKWludGVyZmFjZSkpIHsKKworCQkJLyogT3IgZGlkIHdlIHJlYWNoIHRoZSBlbmQgKHRoZW4gYXBwZW5kIHRoZSBpbnRlcmZhY2UpICovCisJCQlpZiAoKCppZl9lbnRyeSktPm5leHQgPT0gTlVMTCkgeworCQkJCSgqaWZfZW50cnkpLT5uZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpc19pZl9saXN0KSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCgqaWZfZW50cnkpLT5uZXh0ID09IE5VTEwpCisJCQkJCXJldHVybjsKKworCQkJCW1lbWNweSgoKmlmX2VudHJ5KS0+bmV4dC0+YWRkciwgaW50ZXJmYWNlLCBFVEhfQUxFTik7CisJCQkJKCppZl9lbnRyeSktPm5leHQtPnByaW1hcnkgPSBwcmltYXJ5OworCQkJCSgqaWZfZW50cnkpLT5uZXh0LT5uZXh0ID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCSppZl9lbnRyeSA9ICgqaWZfZW50cnkpLT5uZXh0OworCQl9CisJCS8qIFJld2luZCB0aGUgbGlzdCB0byBpdHMgaGVhZCAqLworCQkqaWZfZW50cnkgPSBoZWFkX2lmX2VudHJ5OworCX0KK30KKy8qIHJlYWQgYW4gZW50cnkgICovCisKK3N0YXRpYyB2b2lkIHByb2NfdmlzX3JlYWRfZW50cnkoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyeSwKKwkJCQlzdHJ1Y3QgdmlzX2lmX2xpc3QgKippZl9lbnRyeSwKKwkJCQl1aW50OF90ICp2aXNfb3JpZywKKwkJCQl1aW50OF90IGN1cnJlbnRfZm9ybWF0LAorCQkJCXVpbnQ4X3QgZmlyc3RfbGluZSkKK3sKKwljaGFyIGZyb21bNDBdOworCWNoYXIgdG9bNDBdOworCWludCBpbnRfcGFydCwgZnJhY19wYXJ0OworCisJYWRkcl90b19zdHJpbmcodG8sIGVudHJ5LT5kZXN0KTsKKwlpZiAoZW50cnktPnF1YWxpdHkgPT0gMCkgeworI2lmbmRlZiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQKKwkJcHJvY192aXNfaW5zZXJ0X2ludGVyZmFjZSh2aXNfb3JpZywgaWZfZW50cnksIHRydWUpOworI2VuZGlmIC8qIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCQlhZGRyX3RvX3N0cmluZyhmcm9tLCB2aXNfb3JpZyk7CisJCWlmIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykgeworCQkJc2VxX3ByaW50ZihzZXEsICJcdFwiJXNcIiAtPiBcIiVzXCIgW2xhYmVsPVwiSE5BXCJdXG4iLAorCQkJCSAgIGZyb20sIHRvKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICIlc1x0eyByb3V0ZXIgOiBcIiVzXCIsIGdhdGV3YXkgICA6IFwiJXNcIiwgbGFiZWwgOiBcIkhOQVwiIH0iLAorCQkJCSAgIChmaXJzdF9saW5lID8gIiIgOiAiLFxuIiksIGZyb20sIHRvKTsKKwkJfQorCX0gZWxzZSB7CisjaWZuZGVmIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRAorCQlwcm9jX3Zpc19pbnNlcnRfaW50ZXJmYWNlKGVudHJ5LT5zcmMsIGlmX2VudHJ5LCBjb21wYXJlX29yaWcoZW50cnktPnNyYywgdmlzX29yaWcpKTsKKyNlbmRpZiAvKiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQgKi8KKwkJYWRkcl90b19zdHJpbmcoZnJvbSwgZW50cnktPnNyYyk7CisKKwkJLyoga2VybmVsIGhhcyBubyBwcmludGYtc3VwcG9ydCBmb3IgJWY/IGl0J2QgYmUgYmV0dGVyIHRvIHJldHVybgorCQkgKiB0aGlzIGluIGZsb2F0LiAqLworCisJCWludF9wYXJ0ID0gVFFfTUFYX1ZBTFVFIC8gZW50cnktPnF1YWxpdHk7CisJCWZyYWNfcGFydCA9IDEwMDAgKiBUUV9NQVhfVkFMVUUgLyBlbnRyeS0+cXVhbGl0eSAtIGludF9wYXJ0ICogMTAwMDsKKworCQlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpIHsKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICJcdFwiJXNcIiAtPiBcIiVzXCIgW2xhYmVsPVwiJWQuJWRcIl1cbiIsCisJCQkJICAgZnJvbSwgdG8sIGludF9wYXJ0LCBmcmFjX3BhcnQpOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihzZXEsCisJCQkJICAgIiVzXHR7IHJvdXRlciA6IFwiJXNcIiwgbmVpZ2hib3VyIDogXCIlc1wiLCBsYWJlbCA6ICVkLiVkIH0iLAorCQkJCSAgIChmaXJzdF9saW5lID8gIiIgOiAiLFxuIiksIGZyb20sIHRvLCBpbnRfcGFydCwgZnJhY19wYXJ0KTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW50IHByb2NfdmlzX3JlYWQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKmVudHJpZXM7CisJc3RydWN0IHZpc19pZl9saXN0ICppZl9lbnRyaWVzID0gTlVMTDsKKwlpbnQgaTsKKwl1aW50OF90IGN1cnJlbnRfZm9ybWF0LCBmaXJzdF9saW5lID0gMTsKKyNpZm5kZWYgVklTX1NVQkNMVVNURVJTX0RJU0FCTEVECisJY2hhciB0bXBfYWRkcl9zdHJbRVRIX1NUUl9MRU5dOworCXN0cnVjdCB2aXNfaWZfbGlzdCAqdG1wX2lmX25leHQ7CisjZW5kaWYgLyogVklTX1NVQkNMVVNURVJTX0RJU0FCTEVEICovCisKKwljdXJyZW50X2Zvcm1hdCA9IHZpc19mb3JtYXQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKGxpc3RfZW1wdHkoJmlmX2xpc3QpIHx8ICghaXNfdmlzX3NlcnZlcigpKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJaWYgKGN1cnJlbnRfZm9ybWF0ID09IERPVF9EUkFXKQorCQkJc2VxX3ByaW50ZihzZXEsICJkaWdyYXBoIHtcbn1cbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykKKwkJc2VxX3ByaW50ZihzZXEsICJkaWdyYXBoIHtcbiIpOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKHZpc19oYXNoLCBoYXNoaXQpKSkgeworCQlpbmZvID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCWVudHJpZXMgPSAoc3RydWN0IHZpc19pbmZvX2VudHJ5ICopCisJCQkoKGNoYXIgKilpbmZvICsgc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbykpOworCisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWNrZXQuZW50cmllczsgaSsrKSB7CisJCQlwcm9jX3Zpc19yZWFkX2VudHJ5KHNlcSwgJmVudHJpZXNbaV0sICZpZl9lbnRyaWVzLAorCQkJCQkgICAgaW5mby0+cGFja2V0LnZpc19vcmlnLAorCQkJCQkgICAgY3VycmVudF9mb3JtYXQsIGZpcnN0X2xpbmUpOworCQkJaWYgKGZpcnN0X2xpbmUpCisJCQkJZmlyc3RfbGluZSA9IDA7CisJCX0KKworI2lmbmRlZiBWSVNfU1VCQ0xVU1RFUlNfRElTQUJMRUQKKwkJLyogR2VuZXJhdGUgc3ViZ3JhcGhzIGZyb20gdGhlIGNvbGxlY3RlZCBpdGVtcyAqLworCQlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpIHsKKworCQkJYWRkcl90b19zdHJpbmcodG1wX2FkZHJfc3RyLCBpbmZvLT5wYWNrZXQudmlzX29yaWcpOworCQkJc2VxX3ByaW50ZihzZXEsICJcdHN1YmdyYXBoIFwiY2x1c3Rlcl8lc1wiIHtcbiIsIHRtcF9hZGRyX3N0cik7CisJCQl3aGlsZSAoaWZfZW50cmllcyAhPSBOVUxMKSB7CisKKwkJCQlhZGRyX3RvX3N0cmluZyh0bXBfYWRkcl9zdHIsIGlmX2VudHJpZXMtPmFkZHIpOworCQkJCWlmIChpZl9lbnRyaWVzLT5wcmltYXJ5KQorCQkJCQlzZXFfcHJpbnRmKHNlcSwgIlx0XHRcIiVzXCIgW3BlcmlwaGVyaWVzPTJdXG4iLCB0bXBfYWRkcl9zdHIpOworCQkJCWVsc2UKKwkJCQkJc2VxX3ByaW50ZihzZXEsICJcdFx0XCIlc1wiXG4iLCB0bXBfYWRkcl9zdHIpOworCisJCQkJLyogLi4uIGFuZCBlbXB0eSB0aGUgbGlzdCB3aGlsZSBkb2luZyB0aGlzICovCisJCQkJdG1wX2lmX25leHQgPSBpZl9lbnRyaWVzLT5uZXh0OworCQkJCWtmcmVlKGlmX2VudHJpZXMpOworCQkJCWlmX2VudHJpZXMgPSB0bXBfaWZfbmV4dDsKKwkJCX0KKwkJCXNlcV9wcmludGYoc2VxLCAiXHR9XG4iKTsKKwkJfQorI2VuZGlmIC8qIFZJU19TVUJDTFVTVEVSU19ESVNBQkxFRCAqLworCX0KKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7CisKKwlpZiAoY3VycmVudF9mb3JtYXQgPT0gRE9UX0RSQVcpCisJCXNlcV9wcmludGYoc2VxLCAifVxuIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CitlbmQ6CisJcmV0dXJuIDA7Cit9CisKKy8qIHNldHRpbmcgdGhlIG1vZGUgb2YgdGhlIHZpcyBzZXJ2ZXIgYnkgdGhlIHVzZXIgKi8KK3N0YXRpYyBzc2l6ZV90IHByb2NfdmlzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnZpc19tb2RlX3N0cmluZzsKKwlpbnQgbm90X2NvcGllZCA9IDA7CisKKwl2aXNfbW9kZV9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghdmlzX21vZGVfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5vdF9jb3BpZWQgPSBjb3B5X2Zyb21fdXNlcih2aXNfbW9kZV9zdHJpbmcsIGJ1ZmZlciwgY291bnQpOworCXZpc19tb2RlX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlpZiAoc3RyY21wKHZpc19tb2RlX3N0cmluZywgImNsaWVudCIpID09IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIlNldHRpbmcgVklTIG1vZGUgdG8gY2xpZW50XG4iKTsKKwkJdmlzX3NldF9tb2RlKFZJU19UWVBFX0NMSUVOVF9VUERBVEUpOworCX0gZWxzZSBpZiAoc3RyY21wKHZpc19tb2RlX3N0cmluZywgInNlcnZlciIpID09IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIlNldHRpbmcgVklTIG1vZGUgdG8gc2VydmVyXG4iKTsKKwkJdmlzX3NldF9tb2RlKFZJU19UWVBFX1NFUlZFUl9TWU5DKTsKKwl9IGVsc2UKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJVbmtub3duIFZJUyBtb2RlOiAlc1xuIiwKKwkJCSAgdmlzX21vZGVfc3RyaW5nKTsKKworCWtmcmVlKHZpc19tb2RlX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2NfdmlzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdmlzX3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHByb2NfdmlzX2Zvcm1hdF9yZWFkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCit7CisJdWludDhfdCBjdXJyZW50X2Zvcm1hdCA9IHZpc19mb3JtYXQ7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlslY10gJXNcbiIsCisJCSAgIChjdXJyZW50X2Zvcm1hdCA9PSBET1RfRFJBVykgPyAneCcgOiAnICcsCisJCSAgIFZJU19GT1JNQVRfRERfTkFNRSk7CisJc2VxX3ByaW50ZihzZXEsICJbJWNdICVzXG4iLAorCQkgICAoY3VycmVudF9mb3JtYXQgPT0gSlNPTikgPyAneCcgOiAnICcsCisJCSAgIFZJU19GT1JNQVRfSlNPTl9OQU1FKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX3Zpc19mb3JtYXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY192aXNfZm9ybWF0X3JlYWQsIE5VTEwpOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX3Zpc19mb3JtYXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqdmlzX2Zvcm1hdF9zdHJpbmc7CisJaW50IG5vdF9jb3BpZWQgPSAwOworCisJdmlzX2Zvcm1hdF9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghdmlzX2Zvcm1hdF9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJbm90X2NvcGllZCA9IGNvcHlfZnJvbV91c2VyKHZpc19mb3JtYXRfc3RyaW5nLCBidWZmZXIsIGNvdW50KTsKKwl2aXNfZm9ybWF0X3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlpZiAoc3RyY21wKHZpc19mb3JtYXRfc3RyaW5nLCBWSVNfRk9STUFUX0REX05BTUUpID09IDApIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIlNldHRpbmcgVklTIG91dHB1dCBmb3JtYXQgdG86ICVzXG4iLAorCQkJICBWSVNfRk9STUFUX0REX05BTUUpOworCQl2aXNfZm9ybWF0ID0gRE9UX0RSQVc7CisJfSBlbHNlIGlmIChzdHJjbXAodmlzX2Zvcm1hdF9zdHJpbmcsIFZJU19GT1JNQVRfSlNPTl9OQU1FKSA9PSAwKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJTZXR0aW5nIFZJUyBvdXRwdXQgZm9ybWF0IHRvOiAlc1xuIiwKKwkJCSAgVklTX0ZPUk1BVF9KU09OX05BTUUpOworCQl2aXNfZm9ybWF0ID0gSlNPTjsKKwl9IGVsc2UKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sICJVbmtub3duIFZJUyBvdXRwdXQgZm9ybWF0OiAlc1xuIiwKKwkJCSAgdmlzX2Zvcm1hdF9zdHJpbmcpOworCisJa2ZyZWUodmlzX2Zvcm1hdF9zdHJpbmcpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwcm9jX2FnZ3JfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXNlcV9wcmludGYoc2VxLCAiJWlcbiIsIGF0b21pY19yZWFkKCZhZ2dyZWdhdGlvbl9lbmFibGVkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgcHJvY19hZ2dyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmFnZ3Jfc3RyaW5nOworCWludCBub3RfY29waWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wOworCisJYWdncl9zdHJpbmcgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKworCWlmICghYWdncl9zdHJpbmcpCisJCXJldHVybiAtRU5PTUVNOworCisJbm90X2NvcGllZCA9IGNvcHlfZnJvbV91c2VyKGFnZ3Jfc3RyaW5nLCBidWZmZXIsIGNvdW50KTsKKwlhZ2dyX3N0cmluZ1tjb3VudCAtIG5vdF9jb3BpZWQgLSAxXSA9IDA7CisKKwlzdHJpY3Rfc3RydG91bChhZ2dyX3N0cmluZywgMTAsICZhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCk7CisKKwlpZiAoKGFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wICE9IDApICYmIChhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCAhPSAxKSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfV0FSTiwgIkFnZ3JlZ2F0aW9uIGNhbiBvbmx5IGJlIGVuYWJsZWQgKDEpIG9yIGRpc2FibGVkICgwKSwgZ2l2ZW4gdmFsdWU6ICVsaVxuIiwgYWdncmVnYXRpb25fZW5hYmxlZF90bXApOworCQlnb3RvIGVuZDsKKwl9CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiQ2hhbmdpbmcgYWdncmVnYXRpb24gZnJvbTogJXMgKCVpKSB0bzogJXMgKCVsaSlcbiIsCisJCSAgKGF0b21pY19yZWFkKCZhZ2dyZWdhdGlvbl9lbmFibGVkKSA9PSAxID8KKwkJICAgImVuYWJsZWQiIDogImRpc2FibGVkIiksCisJCSAgYXRvbWljX3JlYWQoJmFnZ3JlZ2F0aW9uX2VuYWJsZWQpLAorCQkgIChhZ2dyZWdhdGlvbl9lbmFibGVkX3RtcCA9PSAxID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksCisJCSAgYWdncmVnYXRpb25fZW5hYmxlZF90bXApOworCisJYXRvbWljX3NldCgmYWdncmVnYXRpb25fZW5hYmxlZCwgKHVuc2lnbmVkKWFnZ3JlZ2F0aW9uX2VuYWJsZWRfdG1wKTsKK2VuZDoKKwlrZnJlZShhZ2dyX3N0cmluZyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHByb2NfYWdncl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2FnZ3JfcmVhZCwgTlVMTCk7Cit9CisKKy8qIHNhdGlzZnlpbmcgZGlmZmVyZW50IHByb3RvdHlwZXMgLi4uICovCitzdGF0aWMgc3NpemVfdCBwcm9jX2R1bW15X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19hZ2dyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb2NfYWdncl9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX2FnZ3Jfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdmlzX2Zvcm1hdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3Zpc19mb3JtYXRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY192aXNfZm9ybWF0X3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Zpc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3Zpc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS53cml0ZQkJPSBwcm9jX3Zpc193cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19vcmlnaW5hdG9yc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX29yaWdpbmF0b3JzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfZHVtbXlfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdHJhbnN0X2xvY2FsX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHByb2NfdHJhbnN0X2xvY2FsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2NfZHVtbXlfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdHJhbnN0X2dsb2JhbF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX3RyYW5zdF9nbG9iYWxfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19kdW1teV93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2dfbGV2ZWxfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY19sb2dfbGV2ZWxfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19sb2dfbGV2ZWxfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW50ZXJmYWNlc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwcm9jX2ludGVyZmFjZXNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19pbnRlcmZhY2VzX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29yaWdfaW50ZXJ2YWxfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gcHJvY19vcmlnX2ludGVydmFsX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHByb2Nfb3JpZ19pbnRlcnZhbF93cml0ZSwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKwordm9pZCBjbGVhbnVwX3Byb2Nmcyh2b2lkKQoreworCWlmIChwcm9jX3RyYW5zdF9nbG9iYWxfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9HTE9CQUwsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY190cmFuc3RfbG9jYWxfZmlsZSkKKwkJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9MT0NBTCwgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2xvZ19maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfTE9HLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfbG9nX2xldmVsX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9MT0dfTEVWRUwsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY19vcmlnaW5hdG9yc19maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfT1JJR0lOQVRPUlMsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY19vcmlnX2ludGVydmFsX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9PUklHX0lOVEVSVkFMLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfaW50ZXJmYWNlX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9JTlRFUkZBQ0VTLCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfdmlzX2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9WSVMsIHByb2NfYmF0bWFuX2Rpcik7CisKKwlpZiAocHJvY192aXNfZm9ybWF0X2ZpbGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9WSVNfRk9STUFULCBwcm9jX2JhdG1hbl9kaXIpOworCisJaWYgKHByb2NfYWdncl9maWxlKQorCQlyZW1vdmVfcHJvY19lbnRyeShQUk9DX0ZJTEVfQUdHUiwgcHJvY19iYXRtYW5fZGlyKTsKKworCWlmIChwcm9jX2JhdG1hbl9kaXIpCisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfUk9PVF9ESVIsIGluaXRfbmV0LnByb2NfbmV0KTsKKyNlbHNlCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfUk9PVF9ESVIsIHByb2NfbmV0KTsKKyNlbmRpZgorfQorCitpbnQgc2V0dXBfcHJvY2ZzKHZvaWQpCit7CisjaWZkZWYgX19ORVRfTkVUX05BTUVTUEFDRV9ICisJcHJvY19iYXRtYW5fZGlyID0gcHJvY19ta2RpcihQUk9DX1JPT1RfRElSLCBpbml0X25ldC5wcm9jX25ldCk7CisjZWxzZQorCXByb2NfYmF0bWFuX2RpciA9IHByb2NfbWtkaXIoUFJPQ19ST09UX0RJUiwgcHJvY19uZXQpOworI2VuZGlmCisKKwlpZiAoIXByb2NfYmF0bWFuX2RpcikgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzJyBmb2xkZXIgZmFpbGVkXG4iLCBQUk9DX1JPT1RfRElSKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19pbnRlcmZhY2VfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9JTlRFUkZBQ0VTLAorCQkJCQkJU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCQlwcm9jX2JhdG1hbl9kaXIpOworCWlmIChwcm9jX2ludGVyZmFjZV9maWxlKSB7CisJCXByb2NfaW50ZXJmYWNlX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX2ludGVyZmFjZXNfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX0lOVEVSRkFDRVMpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX29yaWdfaW50ZXJ2YWxfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9PUklHX0lOVEVSVkFMLAorCQkJCQkJICAgIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJCQkJICAgIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2Nfb3JpZ19pbnRlcnZhbF9maWxlKSB7CisJCXByb2Nfb3JpZ19pbnRlcnZhbF9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY19vcmlnX2ludGVydmFsX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9PUklHX0lOVEVSVkFMKTsKKwkJY2xlYW51cF9wcm9jZnMoKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcHJvY19sb2dfbGV2ZWxfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9MT0dfTEVWRUwsCisJCQkJCQlTX0lXVVNSIHwgU19JUlVHTywKKwkJCQkJCXByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfbG9nX2xldmVsX2ZpbGUpIHsKKwkJcHJvY19sb2dfbGV2ZWxfZmlsZS0+cHJvY19mb3BzID0gJnByb2NfbG9nX2xldmVsX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9MT0dfTEVWRUwpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX29yaWdpbmF0b3JzX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfT1JJR0lOQVRPUlMsCisJCQkJCQkgIFNfSVJVR08sIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2Nfb3JpZ2luYXRvcnNfZmlsZSkgeworCQlwcm9jX29yaWdpbmF0b3JzX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX29yaWdpbmF0b3JzX2ZvcHM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfUk9PVF9ESVIsIFBST0NfRklMRV9PUklHSU5BVE9SUyk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfbG9nX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfTE9HLAorCQkJCQkgIFNfSVJVR08sIHByb2NfYmF0bWFuX2Rpcik7CisJaWYgKHByb2NfbG9nX2ZpbGUpIHsKKwkJcHJvY19sb2dfZmlsZS0+cHJvY19mb3BzID0gJnByb2NfbG9nX29wZXJhdGlvbnM7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXRtYW4tYWR2OiBSZWdpc3RlcmluZyB0aGUgJy9wcm9jL25ldC8lcy8lcycgZmlsZSBmYWlsZWRcbiIsIFBST0NfRklMRV9MT0csIFBST0NfRklMRV9HQVRFV0FZUyk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfdHJhbnN0X2xvY2FsX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0ZJTEVfVFJBTlNUX0xPQ0FMLAorCQkJCQkJICAgU19JUlVHTywgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY190cmFuc3RfbG9jYWxfZmlsZSkgeworCQlwcm9jX3RyYW5zdF9sb2NhbF9maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY190cmFuc3RfbG9jYWxfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1RSQU5TVF9MT0NBTCk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfdHJhbnN0X2dsb2JhbF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1RSQU5TVF9HTE9CQUwsCisJCQkJCQkgICAgU19JUlVHTywgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY190cmFuc3RfZ2xvYmFsX2ZpbGUpIHsKKwkJcHJvY190cmFuc3RfZ2xvYmFsX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX3RyYW5zdF9nbG9iYWxfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1RSQU5TVF9HTE9CQUwpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX3Zpc19maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1ZJUywgU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCSAgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY192aXNfZmlsZSkgeworCQlwcm9jX3Zpc19maWxlLT5wcm9jX2ZvcHMgPSAmcHJvY192aXNfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1ZJUyk7CisJCWNsZWFudXBfcHJvY2ZzKCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByb2NfdmlzX2Zvcm1hdF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19GSUxFX1ZJU19GT1JNQVQsCisJCQkJCQkgU19JV1VTUiB8IFNfSVJVR08sCisJCQkJCQkgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY192aXNfZm9ybWF0X2ZpbGUpIHsKKwkJcHJvY192aXNfZm9ybWF0X2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX3Zpc19mb3JtYXRfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX1ZJU19GT1JNQVQpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlwcm9jX2FnZ3JfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRklMRV9BR0dSLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCQkJICAgcHJvY19iYXRtYW5fZGlyKTsKKwlpZiAocHJvY19hZ2dyX2ZpbGUpIHsKKwkJcHJvY19hZ2dyX2ZpbGUtPnByb2NfZm9wcyA9ICZwcm9jX2FnZ3JfZm9wczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImJhdG1hbi1hZHY6IFJlZ2lzdGVyaW5nIHRoZSAnL3Byb2MvbmV0LyVzLyVzJyBmaWxlIGZhaWxlZFxuIiwgUFJPQ19ST09UX0RJUiwgUFJPQ19GSUxFX0FHR1IpOworCQljbGVhbnVwX3Byb2NmcygpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkM2VmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Byb2MuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjZGVmaW5lIFBST0NfUk9PVF9ESVIgImJhdG1hbi1hZHYiCisjZGVmaW5lIFBST0NfRklMRV9JTlRFUkZBQ0VTICJpbnRlcmZhY2VzIgorI2RlZmluZSBQUk9DX0ZJTEVfT1JJR19JTlRFUlZBTCAib3JpZ19pbnRlcnZhbCIKKyNkZWZpbmUgUFJPQ19GSUxFX09SSUdJTkFUT1JTICJvcmlnaW5hdG9ycyIKKyNkZWZpbmUgUFJPQ19GSUxFX0dBVEVXQVlTICJnYXRld2F5cyIKKyNkZWZpbmUgUFJPQ19GSUxFX0xPRyAibG9nIgorI2RlZmluZSBQUk9DX0ZJTEVfTE9HX0xFVkVMICJsb2dfbGV2ZWwiCisjZGVmaW5lIFBST0NfRklMRV9UUkFOU1RfTE9DQUwgInRyYW5zdGFibGVfbG9jYWwiCisjZGVmaW5lIFBST0NfRklMRV9UUkFOU1RfR0xPQkFMICJ0cmFuc3RhYmxlX2dsb2JhbCIKKyNkZWZpbmUgUFJPQ19GSUxFX1ZJUyAidmlzIgorI2RlZmluZSBQUk9DX0ZJTEVfVklTX0ZPUk1BVCAidmlzX2Zvcm1hdCIKKyNkZWZpbmUgUFJPQ19GSUxFX0FHR1IgImFnZ3JlZ2F0ZV9vZ20iCisKK3ZvaWQgY2xlYW51cF9wcm9jZnModm9pZCk7CitpbnQgc2V0dXBfcHJvY2ZzKHZvaWQpOworCisvKiBXaGlsZSBzY2FubmluZyBmb3IgdmlzLWVudHJpZXMgb2YgYSBwYXJ0aWN1bGFyIHZpcy1vcmlnaW5hdG9yCisgKiB0aGlzIGxpc3QgY29sbGVjdHMgaXRzIGludGVyZmFjZXMgdG8gY3JlYXRlIGEgc3ViZ3JhcGgvY2x1c3RlcgorICogb3V0IG9mIHRoZW0gbGF0ZXIKKyAqLworc3RydWN0IHZpc19pZl9saXN0IHsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCWJvb2wgcHJpbWFyeTsKKwlzdHJ1Y3QgdmlzX2lmX2xpc3QgKm5leHQ7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxYzg5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAicmluZ19idWZmZXIuaCIKKwordm9pZCByaW5nX2J1ZmZlcl9zZXQodWludDhfdCBscV9yZWN2W10sIHVpbnQ4X3QgKmxxX2luZGV4LCB1aW50OF90IHZhbHVlKQoreworCWxxX3JlY3ZbKmxxX2luZGV4XSA9IHZhbHVlOworCSpscV9pbmRleCA9ICgqbHFfaW5kZXggKyAxKSAlIFRRX0dMT0JBTF9XSU5ET1dfU0laRTsKK30KKwordWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pCit7CisJdWludDhfdCAqcHRyOworCXVpbnQxNl90IGNvdW50ID0gMCwgaSA9IDAsIHN1bSA9IDA7CisKKwlwdHIgPSBscV9yZWN2OworCisJd2hpbGUgKGkgPCBUUV9HTE9CQUxfV0lORE9XX1NJWkUpIHsKKwkJaWYgKCpwdHIgIT0gMCkgeworCQkJY291bnQrKzsKKwkJCXN1bSArPSAqcHRyOworCQl9CisKKwkJaSsrOworCQlwdHIrKzsKKwl9CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKHVpbnQ4X3QpKHN1bSAvIGNvdW50KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JpbmdfYnVmZmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MzliYTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yaW5nX2J1ZmZlci5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCit2b2lkIHJpbmdfYnVmZmVyX3NldCh1aW50OF90IGxxX3JlY3ZbXSwgdWludDhfdCAqbHFfaW5kZXgsIHVpbnQ4X3QgdmFsdWUpOwordWludDhfdCByaW5nX2J1ZmZlcl9hdmcodWludDhfdCBscV9yZWN2W10pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvcm91dGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmMKQEAgLTAsMCArMSwxMDEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworCisKKworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJzZW5kLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgImRldmljZS5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAicmluZ19idWZmZXIuaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgorI2luY2x1ZGUgImNvbXBhdC5oIgorCisKKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodGhyZWFkX3dhaXQpOworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHB1cmdlX29yaWdfd3EsIHB1cmdlX29yaWcpOworCitzdGF0aWMgYXRvbWljX3QgZGF0YV9yZWFkeV9jb25kOworYXRvbWljX3QgZXhpdF9jb25kOworCitzdGF0aWMgdm9pZCBzdGFydF9wdXJnZV90aW1lcih2b2lkKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayhiYXRfZXZlbnRfd29ya3F1ZXVlLCAmcHVyZ2Vfb3JpZ193cSwgMSAqIEhaKTsKK30KKworaW50IG9yaWdpbmF0b3JfaW5pdCh2b2lkKQoreworCWlmIChvcmlnX2hhc2gpCisJCXJldHVybiAxOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJb3JpZ19oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKKworCWlmICghb3JpZ19oYXNoKQorCQlnb3RvIGVycjsKKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJc3RhcnRfcHVyZ2VfdGltZXIoKTsKKwlyZXR1cm4gMTsKKworZXJyOgorCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb3JpZ2luYXRvcl9mcmVlKHZvaWQpCit7CisJaWYgKCFvcmlnX2hhc2gpCisJCXJldHVybjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHVyZ2Vfb3JpZ193cSk7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwloYXNoX2RlbGV0ZShvcmlnX2hhc2gsIGZyZWVfb3JpZ19ub2RlKTsKKwlvcmlnX2hhc2ggPSBOVUxMOworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hfbm9kZSAqY3JlYXRlX25laWdoYm9yKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19uZWlnaF9ub2RlLCB1aW50OF90ICpuZWlnaCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCit7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiQ3JlYXRpbmcgbmV3IGxhc3QtaG9wIG5laWdoYm91ciBvZiBvcmlnaW5hdG9yXG4iKTsKKworCW5laWdoX25vZGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmVpZ2hfbm9kZSksIEdGUF9BVE9NSUMpOworCW1lbXNldChuZWlnaF9ub2RlLCAwLCBzaXplb2Yoc3RydWN0IG5laWdoX25vZGUpKTsKKwlJTklUX0xJU1RfSEVBRCgmbmVpZ2hfbm9kZS0+bGlzdCk7CisKKwltZW1jcHkobmVpZ2hfbm9kZS0+YWRkciwgbmVpZ2gsIEVUSF9BTEVOKTsKKwluZWlnaF9ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25laWdoX25vZGU7CisJbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPSBpZl9pbmNvbWluZzsKKworCWxpc3RfYWRkX3RhaWwoJm5laWdoX25vZGUtPmxpc3QsICZvcmlnX25vZGUtPm5laWdoX2xpc3QpOworCXJldHVybiBuZWlnaF9ub2RlOworfQorCit2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9wb3MsICpsaXN0X3Bvc190bXA7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX25vZGU7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlID0gKHN0cnVjdCBvcmlnX25vZGUgKilkYXRhOworCisJLyogZm9yIGFsbCBuZWlnaGJvdXJzIHRvd2FyZHMgdGhpcyBvcmlnaW5hdG9yIC4uLiAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0X3BvcywgbGlzdF9wb3NfdG1wLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0KSB7CisJCW5laWdoX25vZGUgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLCBzdHJ1Y3QgbmVpZ2hfbm9kZSwgbGlzdCk7CisKKwkJbGlzdF9kZWwobGlzdF9wb3MpOworCQlrZnJlZShuZWlnaF9ub2RlKTsKKwl9CisKKwlobmFfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZSwgIm9yaWdpbmF0b3IgdGltZWQgb3V0Iik7CisKKwlrZnJlZShvcmlnX25vZGUtPmJjYXN0X293bik7CisJa2ZyZWUob3JpZ19ub2RlLT5iY2FzdF9vd25fc3VtKTsKKwlrZnJlZShvcmlnX25vZGUpOworfQorCisvKiB0aGlzIGZ1bmN0aW9uIGZpbmRzIG9yIGNyZWF0ZXMgYW4gb3JpZ2luYXRvciBlbnRyeSBmb3IgdGhlIGdpdmVuIGFkZHJlc3MgaWYgaXQgZG9lcyBub3QgZXhpdHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JpZ19ub2RlICpnZXRfb3JpZ19ub2RlKHVpbnQ4X3QgKmFkZHIpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl07CisKKwlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBhZGRyKSk7CisKKwlpZiAob3JpZ19ub2RlICE9IE5VTEwpCisJCXJldHVybiBvcmlnX25vZGU7CisKKwlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgYWRkcik7CisJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkNyZWF0aW5nIG5ldyBvcmlnaW5hdG9yOiAlcyBcbiIsIG9yaWdfc3RyKTsKKworCW9yaWdfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvcmlnX25vZGUpLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQob3JpZ19ub2RlLCAwLCBzaXplb2Yoc3RydWN0IG9yaWdfbm9kZSkpOworCUlOSVRfTElTVF9IRUFEKCZvcmlnX25vZGUtPm5laWdoX2xpc3QpOworCisJbWVtY3B5KG9yaWdfbm9kZS0+b3JpZywgYWRkciwgRVRIX0FMRU4pOworCW9yaWdfbm9kZS0+cm91dGVyID0gTlVMTDsKKwlvcmlnX25vZGUtPmJhdG1hbl9pZiA9IE5VTEw7CisJb3JpZ19ub2RlLT5obmFfYnVmZiA9IE5VTEw7CisKKwlvcmlnX25vZGUtPmJjYXN0X293biA9IGttYWxsb2MobnVtX2lmcyAqIHNpemVvZihUWVBFX09GX1dPUkQpICogTlVNX1dPUkRTLCBHRlBfQVRPTUlDKTsKKwltZW1zZXQob3JpZ19ub2RlLT5iY2FzdF9vd24sIDAsIG51bV9pZnMgKiBzaXplb2YoVFlQRV9PRl9XT1JEKSAqIE5VTV9XT1JEUyk7CisKKwlvcmlnX25vZGUtPmJjYXN0X293bl9zdW0gPSBrbWFsbG9jKG51bV9pZnMgKiBzaXplb2YodWludDhfdCksIEdGUF9BVE9NSUMpOworCW1lbXNldChvcmlnX25vZGUtPmJjYXN0X293bl9zdW0sIDAsIG51bV9pZnMgKiBzaXplb2YodWludDhfdCkpOworCisJaGFzaF9hZGQob3JpZ19oYXNoLCBvcmlnX25vZGUpOworCisJaWYgKG9yaWdfaGFzaC0+ZWxlbWVudHMgKiA0ID4gb3JpZ19oYXNoLT5zaXplKSB7CisJCXN3YXBoYXNoID0gaGFzaF9yZXNpemUob3JpZ19oYXNoLCBvcmlnX2hhc2gtPnNpemUgKiAyKTsKKworCQlpZiAoc3dhcGhhc2ggPT0gTlVMTCkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGRuJ3QgcmVzaXplIG9yaWcgaGFzaCB0YWJsZSBcbiIpOworCQllbHNlCisJCQlvcmlnX2hhc2ggPSBzd2FwaGFzaDsKKwl9CisKKwlyZXR1cm4gb3JpZ19ub2RlOworfQorCit2b2lkIHNsaWRlX293bl9iY2FzdF93aW5kb3coc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKQoreworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCisJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKG9yaWdfaGFzaCwgaGFzaGl0KSkpIHsKKwkJb3JpZ19ub2RlID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisKKwkJYml0X2dldF9wYWNrZXQoKFRZUEVfT0ZfV09SRCAqKSYob3JpZ19ub2RlLT5iY2FzdF9vd25bYmF0bWFuX2lmLT5pZl9udW0gKiBOVU1fV09SRFNdKSwgMSwgMCk7CisJCW9yaWdfbm9kZS0+YmNhc3Rfb3duX3N1bVtiYXRtYW5faWYtPmlmX251bV0gPSBiaXRfcGFja2V0X2NvdW50KChUWVBFX09GX1dPUkQgKikmKG9yaWdfbm9kZS0+YmNhc3Rfb3duW2JhdG1hbl9pZi0+aWZfbnVtICogTlVNX1dPUkRTXSkpOworCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yb3V0ZXMoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4pCit7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIG5laWdoX3N0cltFVEhfU1RSX0xFTl0sIHJvdXRlcl9zdHJbRVRIX1NUUl9MRU5dOworCisJaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gbmVpZ2hfbm9kZSkgeworCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgb3JpZ19ub2RlLT5vcmlnKTsKKworCQkvKiByb3V0ZSBkZWxldGVkICovCisJCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkgJiYgKG5laWdoX25vZGUgPT0gTlVMTCkpIHsKKworCQkJZGVidWdfbG9nKExPR19UWVBFX1JPVVRFUywgIkRlbGV0aW5nIHJvdXRlIHRvd2FyZHM6ICVzXG4iLCBvcmlnX3N0cik7CisJCQlobmFfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZSwgIm9yaWdpbmF0b3IgdGltZWQgb3V0Iik7CisKKwkJLyogcm91dGUgYWRkZWQgKi8KKwkJfSBlbHNlIGlmICgob3JpZ19ub2RlLT5yb3V0ZXIgPT0gTlVMTCkgJiYgKG5laWdoX25vZGUgIT0gTlVMTCkpIHsKKworCQkJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJBZGRpbmcgcm91dGUgdG93YXJkczogJXMgKHZpYSAlcylcbiIsIG9yaWdfc3RyLCBuZWlnaF9zdHIpOworCQkJaG5hX2dsb2JhbF9hZGRfb3JpZyhvcmlnX25vZGUsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOworCisJCS8qIHJvdXRlIGNoYW5nZWQgKi8KKwkJfSBlbHNlIHsKKworCQkJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwkJCWFkZHJfdG9fc3RyaW5nKHJvdXRlcl9zdHIsIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDaGFuZ2luZyByb3V0ZSB0b3dhcmRzOiAlcyAobm93IHZpYSAlcyAtIHdhcyB2aWEgJXMpXG4iLCBvcmlnX3N0ciwgbmVpZ2hfc3RyLCByb3V0ZXJfc3RyKTsKKworCQl9CisKKwkJaWYgKG5laWdoX25vZGUgIT0gTlVMTCkKKwkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmID0gbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmc7CisJCWVsc2UKKwkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmID0gTlVMTDsKKworCQlvcmlnX25vZGUtPnJvdXRlciA9IG5laWdoX25vZGU7CisKKwkvKiBtYXkgYmUganVzdCBITkEgY2hhbmdlZCAqLworCX0gZWxzZSB7CisKKwkJaWYgKChobmFfYnVmZl9sZW4gIT0gb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pIHx8ICgoaG5hX2J1ZmZfbGVuID4gMCkgJiYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID4gMCkgJiYgKG1lbWNtcChvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgaG5hX2J1ZmZfbGVuKSAhPSAwKSkpIHsKKworCQkJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID4gMCkKKwkJCQlobmFfZ2xvYmFsX2RlbF9vcmlnKG9yaWdfbm9kZSwgIm9yaWdpbmF0b3IgY2hhbmdlZCBobmEiKTsKKworCQkJaWYgKChobmFfYnVmZl9sZW4gPiAwKSAmJiAoaG5hX2J1ZmYgIT0gTlVMTCkpCisJCQkJaG5hX2dsb2JhbF9hZGRfb3JpZyhvcmlnX25vZGUsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4pOworCisJCX0KKworCX0KK30KKworc3RhdGljIGludCBpc0JpZGlyZWN0aW9uYWxOZWlnaChzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUsIHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbmVpZ2hfbm9kZSwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlID0gTlVMTCwgKnRtcF9uZWlnaF9ub2RlID0gTlVMTDsKKwljaGFyIG9yaWdfc3RyW0VUSF9TVFJfTEVOXSwgbmVpZ2hfc3RyW0VUSF9TVFJfTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHRvdGFsX2NvdW50OworCisJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIG9yaWdfbm9kZS0+b3JpZyk7CisJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBvcmlnX25laWdoX25vZGUtPm9yaWcpOworCisJaWYgKG9yaWdfbm9kZSA9PSBvcmlnX25laWdoX25vZGUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmICh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKQorCQkJCW5laWdoX25vZGUgPSB0bXBfbmVpZ2hfbm9kZTsKKwkJfQorCisJCWlmIChuZWlnaF9ub2RlID09IE5VTEwpCisJCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLCBvcmlnX25laWdoX25vZGUtPm9yaWcsIGlmX2luY29taW5nKTsKKworCQluZWlnaF9ub2RlLT5sYXN0X3ZhbGlkID0gamlmZmllczsKKwl9IGVsc2UgeworCQkvKiBmaW5kIHBhY2tldCBjb3VudCBvZiBjb3JyZXNwb25kaW5nIG9uZSBob3AgbmVpZ2hib3IgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbmVpZ2hfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBvcmlnX25laWdoX25vZGUtPm9yaWcpICYmICh0bXBfbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcgPT0gaWZfaW5jb21pbmcpKQorCQkJCW5laWdoX25vZGUgPSB0bXBfbmVpZ2hfbm9kZTsKKwkJfQorCisJCWlmIChuZWlnaF9ub2RlID09IE5VTEwpCisJCQluZWlnaF9ub2RlID0gY3JlYXRlX25laWdoYm9yKG9yaWdfbmVpZ2hfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLCBvcmlnX25laWdoX25vZGUtPm9yaWcsIGlmX2luY29taW5nKTsKKwl9CisKKwlvcmlnX25vZGUtPmxhc3RfdmFsaWQgPSBqaWZmaWVzOworCisJLyogcGF5IGF0dGVudGlvbiB0byBub3QgZ2V0IGEgdmFsdWUgYmlnZ2VyIHRoYW4gMTAwICUgKi8KKwl0b3RhbF9jb3VudCA9IChvcmlnX25laWdoX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0gPiBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCA/IG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IDogb3JpZ19uZWlnaF9ub2RlLT5iY2FzdF9vd25fc3VtW2lmX2luY29taW5nLT5pZl9udW1dKTsKKworCS8qIGlmIHdlIGhhdmUgdG9vIGZldyBwYWNrZXRzICh0b28gbGVzcyBkYXRhKSB3ZSBzZXQgdHFfb3duIHRvIHplcm8gKi8KKwkvKiBpZiB3ZSByZWNlaXZlIHRvbyBmZXcgcGFja2V0cyBpdCBpcyBub3QgY29uc2lkZXJlZCBiaWRpcmVjdGlvbmFsICovCisJaWYgKCh0b3RhbF9jb3VudCA8IFRRX0xPQ0FMX0JJRFJFQ1RfU0VORF9NSU5JTVVNKSB8fCAobmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPCBUUV9MT0NBTF9CSURSRUNUX1JFQ1ZfTUlOSU1VTSkpCisJCW9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duID0gMDsKKwllbHNlCisJCS8qIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50IGlzIG5ldmVyIHplcm8gYXMgd2Ugb25seSBwdXJnZSBvbGQgaW5mb3JtYXRpb24gd2hlbiBnZXR0aW5nIG5ldyBpbmZvcm1hdGlvbiAqLworCQlvcmlnX25laWdoX25vZGUtPnRxX293biA9IChUUV9NQVhfVkFMVUUgKiB0b3RhbF9jb3VudCkgLyBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudDsKKworCS8qCisJICogMSAtICgoMS14KSAqKiAzKSwgbm9ybWFsaXplZCB0byBUUV9NQVhfVkFMVUUKKwkgKiB0aGlzIGRvZXMgYWZmZWN0IHRoZSBuZWFybHktc3ltbWV0cmljIGxpbmtzIG9ubHkgYSBsaXR0bGUsCisJICogYnV0IHB1bmlzaGVzIGFzeW1tZXRyaWMgbGlua3MgbW9yZS4KKwkgKiB0aGlzIHdpbGwgZ2l2ZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgVFFfTUFYX1ZBTFVFCisJICovCisJb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHkgPSBUUV9NQVhfVkFMVUUgLSAoVFFfTUFYX1ZBTFVFICoKKwkJCShUUV9MT0NBTF9XSU5ET1dfU0laRSAtIG5laWdoX25vZGUtPnJlYWxfcGFja2V0X2NvdW50KSAqCisJCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgLSBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCkgKgorCQkJKFRRX0xPQ0FMX1dJTkRPV19TSVpFIC0gbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQpKSAvCisJCQkoVFFfTE9DQUxfV0lORE9XX1NJWkUgKiBUUV9MT0NBTF9XSU5ET1dfU0laRSAqIFRRX0xPQ0FMX1dJTkRPV19TSVpFKTsKKworCWJhdG1hbl9wYWNrZXQtPnRxID0gKChiYXRtYW5fcGFja2V0LT50cSAqIG9yaWdfbmVpZ2hfbm9kZS0+dHFfb3duICogb3JpZ19uZWlnaF9ub2RlLT50cV9hc3ltX3BlbmFsdHkpIC8gKFRRX01BWF9WQUxVRSAqICBUUV9NQVhfVkFMVUUpKTsKKworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJiaWRpcmVjdGlvbmFsOiBvcmlnID0gJS0xNXMgbmVpZ2ggPSAlLTE1cyA9PiBvd25fYmNhc3QgPSAlMmksIHJlYWwgcmVjdiA9ICUyaSwgbG9jYWwgdHE6ICUzaSwgYXN5bV9wZW5hbHR5OiAlM2ksIHRvdGFsIHRxOiAlM2kgXG4iLAorCQkgIG9yaWdfc3RyLCBuZWlnaF9zdHIsIHRvdGFsX2NvdW50LCBuZWlnaF9ub2RlLT5yZWFsX3BhY2tldF9jb3VudCwgb3JpZ19uZWlnaF9ub2RlLT50cV9vd24sIG9yaWdfbmVpZ2hfbm9kZS0+dHFfYXN5bV9wZW5hbHR5LCBiYXRtYW5fcGFja2V0LT50cSk7CisKKwkvKiBpZiBsaW5rIGhhcyB0aGUgbWluaW11bSByZXF1aXJlZCB0cmFuc21pc3Npb24gcXVhbGl0eSBjb25zaWRlciBpdCBiaWRpcmVjdGlvbmFsICovCisJaWYgKGJhdG1hbl9wYWNrZXQtPnRxID49IFRRX1RPVEFMX0JJRFJFQ1RfTElNSVQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgc3RydWN0IGV0aGhkciAqZXRoaGRyLCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLCBjaGFyIGlzX2R1cGxpY2F0ZSkKK3sKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSA9IE5VTEwsICp0bXBfbmVpZ2hfbm9kZSA9IE5VTEw7CisJaW50IHRtcF9obmFfYnVmZl9sZW47CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAidXBkYXRlX29yaWdpbmF0b3IoKTogU2VhcmNoaW5nIGFuZCB1cGRhdGluZyBvcmlnaW5hdG9yIGVudHJ5IG9mIHJlY2VpdmVkIHBhY2tldCBcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJiAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkgeworCQkJbmVpZ2hfbm9kZSA9IHRtcF9uZWlnaF9ub2RlOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNfZHVwbGljYXRlKQorCQkJY29udGludWU7CisKKwkJcmluZ19idWZmZXJfc2V0KHRtcF9uZWlnaF9ub2RlLT50cV9yZWN2LCAmdG1wX25laWdoX25vZGUtPnRxX2luZGV4LCAwKTsKKwkJdG1wX25laWdoX25vZGUtPnRxX2F2ZyA9IHJpbmdfYnVmZmVyX2F2Zyh0bXBfbmVpZ2hfbm9kZS0+dHFfcmVjdik7CisJfQorCisJaWYgKG5laWdoX25vZGUgPT0gTlVMTCkKKwkJbmVpZ2hfbm9kZSA9IGNyZWF0ZV9uZWlnaGJvcihvcmlnX25vZGUsIGdldF9vcmlnX25vZGUoZXRoaGRyLT5oX3NvdXJjZSksIGV0aGhkci0+aF9zb3VyY2UsIGlmX2luY29taW5nKTsKKwllbHNlCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJVcGRhdGluZyBleGlzdGluZyBsYXN0LWhvcCBuZWlnaGJvdXIgb2Ygb3JpZ2luYXRvclxuIik7CisKKwlvcmlnX25vZGUtPmZsYWdzID0gYmF0bWFuX3BhY2tldC0+ZmxhZ3M7CisJbmVpZ2hfbm9kZS0+bGFzdF92YWxpZCA9IGppZmZpZXM7CisKKwlyaW5nX2J1ZmZlcl9zZXQobmVpZ2hfbm9kZS0+dHFfcmVjdiwgJm5laWdoX25vZGUtPnRxX2luZGV4LCBiYXRtYW5fcGFja2V0LT50cSk7CisJbmVpZ2hfbm9kZS0+dHFfYXZnID0gcmluZ19idWZmZXJfYXZnKG5laWdoX25vZGUtPnRxX3JlY3YpOworCisJaWYgKCFpc19kdXBsaWNhdGUpIHsKKwkJb3JpZ19ub2RlLT5sYXN0X3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKKwkJbmVpZ2hfbm9kZS0+bGFzdF90dGwgPSBiYXRtYW5fcGFja2V0LT50dGw7CisJfQorCisJdG1wX2huYV9idWZmX2xlbiA9IChobmFfYnVmZl9sZW4gPiBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4gPyBiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4gOiBobmFfYnVmZl9sZW4pOworCisJLyogaWYgdGhpcyBuZWlnaGJvciBhbHJlYWR5IGlzIG91ciBuZXh0IGhvcCB0aGVyZSBpcyBub3RoaW5nIHRvIGNoYW5nZSAqLworCWlmIChvcmlnX25vZGUtPnJvdXRlciA9PSBuZWlnaF9ub2RlKQorCQlnb3RvIHVwZGF0ZV9obmE7CisKKwkvKiBpZiB0aGlzIG5laWdoYm9yIGRvZXMgbm90IG9mZmVyIGEgYmV0dGVyIFRRIHdlIHdvbid0IGNvbnNpZGVyIGl0ICovCisJaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYKKwkgICAgKG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmcgPiBuZWlnaF9ub2RlLT50cV9hdmcpKQorCQlnb3RvIHVwZGF0ZV9obmE7CisKKwkvKiBpZiB0aGUgVFEgaXMgdGhlIHNhbWUgYW5kIHRoZSBsaW5rIG5vdCBtb3JlIHN5bWV0cmljIHdlIHdvbid0IGNvbnNpZGVyIGl0IGVpdGhlciAqLworCWlmICgob3JpZ19ub2RlLT5yb3V0ZXIpICYmCisJICAgICAoKG5laWdoX25vZGUtPnRxX2F2ZyA9PSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnKSAmJgorCSAgICAgKG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0gPj0KKwkgICAgICBuZWlnaF9ub2RlLT5vcmlnX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0pKSkKKwkJZ290byB1cGRhdGVfaG5hOworCisJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIG5laWdoX25vZGUsIGhuYV9idWZmLCB0bXBfaG5hX2J1ZmZfbGVuKTsKKwlyZXR1cm47CisKK3VwZGF0ZV9obmE6CisJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIG9yaWdfbm9kZS0+cm91dGVyLCBobmFfYnVmZiwgdG1wX2huYV9idWZmX2xlbik7CisJcmV0dXJuOworfQorCitzdGF0aWMgY2hhciBjb3VudF9yZWFsX3BhY2tldHMoc3RydWN0IGV0aGhkciAqZXRoaGRyLCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwgc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmcpCit7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBuZWlnaF9ub2RlICp0bXBfbmVpZ2hfbm9kZTsKKwljaGFyIGlzX2R1cGxpY2F0ZSA9IDA7CisKKworCW9yaWdfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0bWFuX3BhY2tldC0+b3JpZyk7CisJaWYgKG9yaWdfbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXBfbmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCisJCWlmICghaXNfZHVwbGljYXRlKQorCQkJaXNfZHVwbGljYXRlID0gZ2V0X2JpdF9zdGF0dXModG1wX25laWdoX25vZGUtPnJlYWxfYml0cywgb3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8sIGJhdG1hbl9wYWNrZXQtPnNlcW5vKTsKKworCQlpZiAoY29tcGFyZV9vcmlnKHRtcF9uZWlnaF9ub2RlLT5hZGRyLCBldGhoZHItPmhfc291cmNlKSAmJiAodG1wX25laWdoX25vZGUtPmlmX2luY29taW5nID09IGlmX2luY29taW5nKSkKKwkJCWJpdF9nZXRfcGFja2V0KHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMsIGJhdG1hbl9wYWNrZXQtPnNlcW5vIC0gb3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8sIDEpOworCQllbHNlCisJCQliaXRfZ2V0X3BhY2tldCh0bXBfbmVpZ2hfbm9kZS0+cmVhbF9iaXRzLCBiYXRtYW5fcGFja2V0LT5zZXFubyAtIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCAwKTsKKworCQl0bXBfbmVpZ2hfbm9kZS0+cmVhbF9wYWNrZXRfY291bnQgPSBiaXRfcGFja2V0X2NvdW50KHRtcF9uZWlnaF9ub2RlLT5yZWFsX2JpdHMpOworCX0KKworCWlmICghaXNfZHVwbGljYXRlKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJ1cGRhdGluZyBsYXN0X3NlcW5vOiBvbGQgJWQsIG5ldyAlZCBcbiIsIG9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vLCBiYXRtYW5fcGFja2V0LT5zZXFubyk7CisJCW9yaWdfbm9kZS0+bGFzdF9yZWFsX3NlcW5vID0gYmF0bWFuX3BhY2tldC0+c2Vxbm87CisJfQorCisJcmV0dXJuIGlzX2R1cGxpY2F0ZTsKK30KKwordm9pZCByZWNlaXZlX2JhdF9wYWNrZXQoc3RydWN0IGV0aGhkciAqZXRoaGRyLCBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsIGludCBobmFfYnVmZl9sZW4sIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25laWdoX25vZGUsICpvcmlnX25vZGU7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl0sIHByZXZfc2VuZGVyX3N0cltFVEhfU1RSX0xFTl0sIG5laWdoX3N0cltFVEhfU1RSX0xFTl07CisJY2hhciBoYXNfZGlyZWN0bGlua19mbGFnOworCWNoYXIgaXNfbXlfYWRkciA9IDAsIGlzX215X29yaWcgPSAwLCBpc19teV9vbGRvcmlnID0gMCwgaXNfYnJvYWRjYXN0ID0gMCwgaXNfYmlkaXJlY3Rpb25hbCwgaXNfc2luZ2xlX2hvcF9uZWlnaCwgaXNfZHVwbGljYXRlOworCXVuc2lnbmVkIHNob3J0IGlmX2luY29taW5nX3NlcW5vOworCisJLyogU2lsZW50bHkgZHJvcCB3aGVuIHRoZSBiYXRtYW4gcGFja2V0IGlzIGFjdHVhbGx5IG5vdCBhIGNvcnJlY3QgcGFja2V0LgorCSAqCisJICogVGhpcyBtaWdodCBoYXBwZW4gaWYgYSBwYWNrZXQgaXMgcGFkZGVkIChlLmcuIEV0aGVybmV0IGhhcyBhCisJICogbWluaW11bSBmcmFtZSBsZW5ndGggb2YgNjQgYnl0ZSkgYW5kIHRoZSBhZ2dyZWdhdGlvbiBpbnRlcnByZXRzCisJICogaXQgYXMgYW4gYWRkaXRpb25hbCBsZW5ndGguCisJICoKKwkgKiBUT0RPOiBBIG1vcmUgc2FuZSBzb2x1dGlvbiB3b3VsZCBiZSB0byBoYXZlIGEgYml0IGluIHRoZSBiYXRtYW5fcGFja2V0CisJICogdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHBhY2tldCBpcyB0aGUgbGFzdCBwYWNrZXQgaW4gYW4gYWdncmVnYXRpb24uCisJICogSGVyZSB3ZSBleHBlY3QgdGhhdCB0aGUgcGFkZGluZyBpcyBhbHdheXMgemVybyAob3Igbm90IDB4MDEpCisJICovCisJaWYgKGJhdG1hbl9wYWNrZXQtPnBhY2tldF90eXBlICE9IEJBVF9QQUNLRVQpCisJCXJldHVybjsKKworCS8qIGNvdWxkIGJlIGNoYW5nZWQgYnkgc2NoZWR1bGVfb3duX3BhY2tldCgpICovCisJaWZfaW5jb21pbmdfc2Vxbm8gPSBhdG9taWNfcmVhZCgmaWZfaW5jb21pbmctPnNlcW5vKTsKKworCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKKwlhZGRyX3RvX3N0cmluZyhwcmV2X3NlbmRlcl9zdHIsIGJhdG1hbl9wYWNrZXQtPnByZXZfc2VuZGVyKTsKKwlhZGRyX3RvX3N0cmluZyhuZWlnaF9zdHIsIGV0aGhkci0+aF9zb3VyY2UpOworCisJaGFzX2RpcmVjdGxpbmtfZmxhZyA9IChiYXRtYW5fcGFja2V0LT5mbGFncyAmIERJUkVDVExJTksgPyAxIDogMCk7CisKKwlpc19zaW5nbGVfaG9wX25laWdoID0gKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLCBiYXRtYW5fcGFja2V0LT5vcmlnKSA/IDEgOiAwKTsKKworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJSZWNlaXZlZCBCQVRNQU4gcGFja2V0IHZpYSBOQjogJXMsIElGOiAlcyBbJXNdIChmcm9tIE9HOiAlcywgdmlhIHByZXYgT0c6ICVzLCBzZXFubyAlZCwgdHEgJWQsIFRUTCAlZCwgViAlZCwgSURGICVkKSBcbiIsIG5laWdoX3N0ciwgaWZfaW5jb21pbmctPmRldiwgaWZfaW5jb21pbmctPmFkZHJfc3RyLCBvcmlnX3N0ciwgcHJldl9zZW5kZXJfc3RyLCBiYXRtYW5fcGFja2V0LT5zZXFubywgYmF0bWFuX3BhY2tldC0+dHEsIGJhdG1hbl9wYWNrZXQtPnR0bCwgYmF0bWFuX3BhY2tldC0+dmVyc2lvbiwgaGFzX2RpcmVjdGxpbmtfZmxhZyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSAhPSBJRl9BQ1RJVkUpCisJCQljb250aW51ZTsKKworCQlpZiAoY29tcGFyZV9vcmlnKGV0aGhkci0+aF9zb3VyY2UsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQorCQkJaXNfbXlfYWRkciA9IDE7CisKKwkJaWYgKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyKSkKKwkJCWlzX215X29yaWcgPSAxOworCisJCWlmIChjb21wYXJlX29yaWcoYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIsIGJhdG1hbl9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIpKQorCQkJaXNfbXlfb2xkb3JpZyA9IDE7CisKKwkJaWYgKGNvbXBhcmVfb3JpZyhldGhoZHItPmhfc291cmNlLCBicm9hZGNhc3RBZGRyKSkKKwkJCWlzX2Jyb2FkY2FzdCA9IDE7CisJfQorCisJaWYgKGJhdG1hbl9wYWNrZXQtPnZlcnNpb24gIT0gQ09NUEFUX1ZFUlNJT04pIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBpbmNvbXBhdGlibGUgYmF0bWFuIHZlcnNpb24gKCVpKSBcbiIsIGJhdG1hbl9wYWNrZXQtPnZlcnNpb24pOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX215X2FkZHIpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiByZWNlaXZlZCBteSBvd24gYnJvYWRjYXN0IChzZW5kZXI6ICVzKSBcbiIsIG5laWdoX3N0cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfYnJvYWRjYXN0KSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogaWdub3JpbmcgYWxsIHBhY2tldHMgd2l0aCBicm9hZGNhc3Qgc291cmNlIGFkZHIgKHNlbmRlcjogJXMpIFxuIiwgbmVpZ2hfc3RyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpc19teV9vcmlnKSB7CisJCW9yaWdfbmVpZ2hfbm9kZSA9IGdldF9vcmlnX25vZGUoZXRoaGRyLT5oX3NvdXJjZSk7CisKKwkJLyogbmVpZ2hib3VyIGhhcyB0byBpbmRpY2F0ZSBkaXJlY3QgbGluayBhbmQgaXQgaGFzIHRvIGNvbWUgdmlhIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSAqLworCQkvKiBpZiByZWNlaXZlZCBzZXFubyBlcXVhbHMgbGFzdCBzZW5kIHNlcW5vIHNhdmUgbmV3IHNlcW5vIGZvciBiaWRpcmVjdGlvbmFsIGNoZWNrICovCisJCWlmIChoYXNfZGlyZWN0bGlua19mbGFnICYmIGNvbXBhcmVfb3JpZyhpZl9pbmNvbWluZy0+bmV0X2Rldi0+ZGV2X2FkZHIsIGJhdG1hbl9wYWNrZXQtPm9yaWcpICYmCisJCQkJICAoYmF0bWFuX3BhY2tldC0+c2Vxbm8gLSBpZl9pbmNvbWluZ19zZXFubyArIDIgPT0gMCkpIHsKKwkJCWJpdF9tYXJrKChUWVBFX09GX1dPUkQgKikmKG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duW2lmX2luY29taW5nLT5pZl9udW0gKiBOVU1fV09SRFNdKSwgMCk7CisJCQlvcmlnX25laWdoX25vZGUtPmJjYXN0X293bl9zdW1baWZfaW5jb21pbmctPmlmX251bV0gPSBiaXRfcGFja2V0X2NvdW50KChUWVBFX09GX1dPUkQgKikmKG9yaWdfbmVpZ2hfbm9kZS0+YmNhc3Rfb3duW2lmX2luY29taW5nLT5pZl9udW0gKiBOVU1fV09SRFNdKSk7CisJCX0KKworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IG9yaWdpbmF0b3IgcGFja2V0IGZyb20gbXlzZWxmICh2aWEgbmVpZ2hib3VyKSBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGJhdG1hbl9wYWNrZXQtPnRxID09IDApIHsKKwkJY291bnRfcmVhbF9wYWNrZXRzKGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOworCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogb3JpZ2luYXRvciBwYWNrZXQgd2l0aCB0cSBlcXVhbCAwIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfbXlfb2xkb3JpZykgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGlnbm9yaW5nIGFsbCByZWJyb2FkY2FzdCBlY2hvcyAoc2VuZGVyOiAlcykgXG4iLCBuZWlnaF9zdHIpOworCQlyZXR1cm47CisJfQorCisJaXNfZHVwbGljYXRlID0gY291bnRfcmVhbF9wYWNrZXRzKGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcpOworCisJb3JpZ19ub2RlID0gZ2V0X29yaWdfbm9kZShiYXRtYW5fcGFja2V0LT5vcmlnKTsKKwlpZiAob3JpZ19ub2RlID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGF2b2lkIHRlbXBvcmFyeSByb3V0aW5nIGxvb3BzICovCisJaWYgKChvcmlnX25vZGUtPnJvdXRlcikgJiYgKG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlcikgJiYKKwkgICAgKGNvbXBhcmVfb3JpZyhvcmlnX25vZGUtPnJvdXRlci0+YWRkciwgYmF0bWFuX3BhY2tldC0+cHJldl9zZW5kZXIpKSAmJgorCSAgICAhKGNvbXBhcmVfb3JpZyhiYXRtYW5fcGFja2V0LT5vcmlnLCBiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlcikpICYmCisJICAgIChjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIG9yaWdfbm9kZS0+cm91dGVyLT5vcmlnX25vZGUtPnJvdXRlci0+YWRkcikpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogaWdub3JpbmcgYWxsIHJlYnJvYWRjYXN0IHBhY2tldHMgdGhhdCBtYXkgbWFrZSBtZSBsb29wIChzZW5kZXI6ICVzKSBcbiIsIG5laWdoX3N0cik7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBzZW5kZXIgaXMgYSBkaXJlY3QgbmVpZ2hib3IgdGhlIHNlbmRlciBtYWMgZXF1YWxzIG9yaWdpbmF0b3IgbWFjICovCisJb3JpZ19uZWlnaF9ub2RlID0gKGlzX3NpbmdsZV9ob3BfbmVpZ2ggPyBvcmlnX25vZGUgOiBnZXRfb3JpZ19ub2RlKGV0aGhkci0+aF9zb3VyY2UpKTsKKwlpZiAob3JpZ19uZWlnaF9ub2RlID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGRyb3AgcGFja2V0IGlmIHNlbmRlciBpcyBub3QgYSBkaXJlY3QgbmVpZ2hib3IgYW5kIGlmIHdlIGRvbid0IHJvdXRlIHRvd2FyZHMgaXQgKi8KKwlpZiAoIWlzX3NpbmdsZV9ob3BfbmVpZ2ggJiYgKG9yaWdfbmVpZ2hfbm9kZS0+cm91dGVyID09IE5VTEwpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogT0dNIHZpYSB1bmtub3duIG5laWdoYm9yISBcbiIpOworCQlyZXR1cm47CisJfQorCisJaXNfYmlkaXJlY3Rpb25hbCA9IGlzQmlkaXJlY3Rpb25hbE5laWdoKG9yaWdfbm9kZSwgb3JpZ19uZWlnaF9ub2RlLCBiYXRtYW5fcGFja2V0LCBpZl9pbmNvbWluZyk7CisKKwkvKiB1cGRhdGUgcmFua2luZyBpZiBpdCBpcyBub3QgYSBkdXBsaWNhdGUgb3IgaGFzIHRoZSBzYW1lIHNlcW5vIGFuZCBzaW1pbGFyIHR0bCBhcyB0aGUgbm9uLWR1cGxpY2F0ZSAqLworCWlmIChpc19iaWRpcmVjdGlvbmFsICYmICghaXNfZHVwbGljYXRlIHx8CisJCSgob3JpZ19ub2RlLT5sYXN0X3JlYWxfc2Vxbm8gPT0gYmF0bWFuX3BhY2tldC0+c2Vxbm8pICYmCisJCQkob3JpZ19ub2RlLT5sYXN0X3R0bCAtIDMgPD0gYmF0bWFuX3BhY2tldC0+dHRsKSkpKQorCQl1cGRhdGVfb3JpZyhvcmlnX25vZGUsIGV0aGhkciwgYmF0bWFuX3BhY2tldCwgaWZfaW5jb21pbmcsIGhuYV9idWZmLCBobmFfYnVmZl9sZW4sIGlzX2R1cGxpY2F0ZSk7CisKKwkvKiBpcyBzaW5nbGUgaG9wIChkaXJlY3QpIG5laWdoYm91ciAqLworCWlmIChpc19zaW5nbGVfaG9wX25laWdoKSB7CisKKwkJLyogbWFyayBkaXJlY3QgbGluayBvbiBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwkJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsIDEsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOworCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJGb3J3YXJkaW5nIHBhY2tldDogcmVicm9hZGNhc3QgbmVpZ2hib3VyIHBhY2tldCB3aXRoIGRpcmVjdCBsaW5rIGZsYWcgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIG11bHRpaG9wIG9yaWdpbmF0b3IgKi8KKwlpZiAoIWlzX2JpZGlyZWN0aW9uYWwpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIkRyb3AgcGFja2V0OiBub3QgcmVjZWl2ZWQgdmlhIGJpZGlyZWN0aW9uYWwgbGlua1xuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaXNfZHVwbGljYXRlKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJEcm9wIHBhY2tldDogZHVwbGljYXRlIHBhY2tldCByZWNlaXZlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRm9yd2FyZGluZyBwYWNrZXQ6IHJlYnJvYWRjYXN0IG9yaWdpbmF0b3IgcGFja2V0IFxuIik7CisJc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQob3JpZ19ub2RlLCBldGhoZHIsIGJhdG1hbl9wYWNrZXQsIDAsIGhuYV9idWZmX2xlbiwgaWZfaW5jb21pbmcpOworfQorCit2b2lkIHB1cmdlX29yaWcoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfcG9zLCAqbGlzdF9wb3NfdG1wOworCXN0cnVjdCBoYXNoX2l0X3QgKmhhc2hpdCA9IE5VTEw7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9ub2RlLCAqYmVzdF9uZWlnaF9ub2RlOworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dLCBuZWlnaF9zdHJbRVRIX1NUUl9MRU5dLCBuZWlnaF9wdXJnZWQ7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCS8qIGZvciBhbGwgb3JpZ2lucy4uLiAqLworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUob3JpZ19oYXNoLCBoYXNoaXQpKSkgeworCisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgb3JpZ19ub2RlLT5vcmlnKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBvcmlnX25vZGUtPmxhc3RfdmFsaWQgKyAoKDIgKiBQVVJHRV9USU1FT1VUICogSFopIC8gMTAwMCkpKSB7CisKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJPcmlnaW5hdG9yIHRpbWVvdXQ6IG9yaWdpbmF0b3IgJXMsIGxhc3RfdmFsaWQgJXUgXG4iLCBvcmlnX3N0ciwgKG9yaWdfbm9kZS0+bGFzdF92YWxpZCAvIEhaKSk7CisKKwkJCWhhc2hfcmVtb3ZlX2J1Y2tldChvcmlnX2hhc2gsIGhhc2hpdCk7CisJCQlmcmVlX29yaWdfbm9kZShvcmlnX25vZGUpOworCisJCX0gZWxzZSB7CisKKwkJCWJlc3RfbmVpZ2hfbm9kZSA9IE5VTEw7CisJCQluZWlnaF9wdXJnZWQgPSAwOworCisJCQkvKiBmb3IgYWxsIG5laWdoYm91cnMgdG93YXJkcyB0aGlzIG9yaWdpbmF0b3IgLi4uICovCisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9wb3MsIGxpc3RfcG9zX3RtcCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCkgeworCQkJCW5laWdoX25vZGUgPSBsaXN0X2VudHJ5KGxpc3RfcG9zLCBzdHJ1Y3QgbmVpZ2hfbm9kZSwgbGlzdCk7CisKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBuZWlnaF9ub2RlLT5sYXN0X3ZhbGlkICsgKChQVVJHRV9USU1FT1VUICogSFopIC8gMTAwMCkpKSB7CisKKwkJCQkJYWRkcl90b19zdHJpbmcobmVpZ2hfc3RyLCBuZWlnaF9ub2RlLT5hZGRyKTsKKwkJCQkJZGVidWdfbG9nKExPR19UWVBFX0JBVE1BTiwgIk5laWdoYm91ciB0aW1lb3V0OiBvcmlnaW5hdG9yICVzLCBuZWlnaGJvdXI6ICVzLCBsYXN0X3ZhbGlkICV1IFxuIiwgb3JpZ19zdHIsIG5laWdoX3N0ciwgKG5laWdoX25vZGUtPmxhc3RfdmFsaWQgLyBIWikpOworCisJCQkJCW5laWdoX3B1cmdlZCA9IDE7CisJCQkJCWxpc3RfZGVsKGxpc3RfcG9zKTsKKwkJCQkJa2ZyZWUobmVpZ2hfbm9kZSk7CisKKwkJCQl9IGVsc2UgeworCisJCQkJCWlmICgoYmVzdF9uZWlnaF9ub2RlID09IE5VTEwpIHx8IChuZWlnaF9ub2RlLT50cV9hdmcgPiBiZXN0X25laWdoX25vZGUtPnRxX2F2ZykpCisJCQkJCQliZXN0X25laWdoX25vZGUgPSBuZWlnaF9ub2RlOworCisJCQkJfQorCisJCQl9CisKKwkJCWlmIChuZWlnaF9wdXJnZWQpCisJCQkJdXBkYXRlX3JvdXRlcyhvcmlnX25vZGUsIGJlc3RfbmVpZ2hfbm9kZSwgb3JpZ19ub2RlLT5obmFfYnVmZiwgb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pOworCisJCX0KKworCX0KKworCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisKKwlzdGFydF9wdXJnZV90aW1lcigpOworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfcmF3X3BhY2tldChzdHJ1Y3Qgc29ja2V0ICpyYXdfc29jaywgdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfYnVmZl9sZW4pCit7CisJc3RydWN0IGt2ZWMgaW92OworCXN0cnVjdCBtc2doZHIgbXNnOworCisJaW92Lmlvdl9iYXNlID0gcGFja2V0X2J1ZmY7CisJaW92Lmlvdl9sZW4gPSBwYWNrZXRfYnVmZl9sZW47CisKKwltc2cubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlUOwkvKiBub24tYmxvY2tpbmcgKi8KKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKworCXJldHVybiBrZXJuZWxfcmVjdm1zZyhyYXdfc29jaywgJm1zZywgJmlvdiwgMSwgcGFja2V0X2J1ZmZfbGVuLCBNU0dfRE9OVFdBSVQpOworfQorCitpbnQgcGFja2V0X3JlY3ZfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXN0cnVjdCBldGhoZHIgKmV0aGhkcjsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKwlzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKnVuaWNhc3RfcGFja2V0OworCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKKwlzdHJ1Y3QgaWNtcF9wYWNrZXQgKmljbXBfcGFja2V0OworCXN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0OworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgc3JjX3N0cltFVEhfU1RSX0xFTl0sIGRzdF9zdHJbRVRIX1NUUl9MRU5dOworCWludCB2aXNfaW5mb19sZW47CisJaW50IHJlc3VsdDsKKworCWF0b21pY19zZXQoJmRhdGFfcmVhZHlfY29uZCwgMCk7CisJYXRvbWljX3NldCgmZXhpdF9jb25kLCAwKTsKKwlwYWNrZXRfYnVmZiA9IGttYWxsb2MoUEFDS0JVRkZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWNrZXRfYnVmZikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwgIkNvdWxkIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBhY2tldCBidWZmZXIuIDooXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlICgoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgJiYgKCFhdG9taWNfcmVhZCgmZXhpdF9jb25kKSkpIHsKKworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhyZWFkX3dhaXQsIChhdG9taWNfcmVhZCgmZGF0YV9yZWFkeV9jb25kKSB8fCBhdG9taWNfcmVhZCgmZXhpdF9jb25kKSkpOworCisJCWF0b21pY19zZXQoJmRhdGFfcmVhZHlfY29uZCwgMCk7CisKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBhdG9taWNfcmVhZCgmZXhpdF9jb25kKSkKKwkJCWJyZWFrOworCisJCS8qIHdlIG9ubHkgd2FudCB0byBzYWZlbHkgdHJhdmVyc2UgdGhlIGxpc3QsIGhhcmQtaW50ZXJmYWNlcworCQkgKiB3b24ndCBiZSBkZWxldGVkIGFueXdheSBhcyBsb25nIGFzIHRoaXMgdGhyZWFkIHJ1bnMuICovCisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKworCQkJcmVzdWx0ID0gLTE7CisKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkgeworCQkJCQlpZiAoYmF0bWFuX2lmLT5pZl9hY3RpdmUgIT0gSUZfVE9fQkVfQUNUSVZBVEVEKQorCQkJCQkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwKKwkJCQkJCSAgICAgICAgICAiQ291bGQgbm90IHJlYWQgZnJvbSBkZWFjdGl2YXRlZCBpbnRlcmZhY2UgJXMhXG4iLAorCQkJCQkJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKworCQkJCQlpZiAoYmF0bWFuX2lmLT5yYXdfc29jaykKKwkJCQkJCXJlY2VpdmVfcmF3X3BhY2tldChiYXRtYW5faWYtPnJhd19zb2NrLCBwYWNrZXRfYnVmZiwgUEFDS0JVRkZfU0laRSk7CisJCQkJCXJlc3VsdCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXJlc3VsdCA9IHJlY2VpdmVfcmF3X3BhY2tldChiYXRtYW5faWYtPnJhd19zb2NrLCBwYWNrZXRfYnVmZiwgUEFDS0JVRkZfU0laRSk7CisJCQkJaWYgKHJlc3VsdCA8PSAwKQorCQkJCQlicmVhazsKKworCQkJCWlmIChyZXN1bHQgPCBzaXplb2Yoc3RydWN0IGV0aGhkcikgKyAyKQorCQkJCQljb250aW51ZTsKKworCQkJCWV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopcGFja2V0X2J1ZmY7CisJCQkJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJCQlpZiAoYmF0bWFuX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgeworCQkJCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAiRHJvcCBwYWNrZXQ6IGluY29tcGF0aWJsZSBiYXRtYW4gdmVyc2lvbiAoJWkpIFxuIiwgYmF0bWFuX3BhY2tldC0+dmVyc2lvbik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXN3aXRjaCAoYmF0bWFuX3BhY2tldC0+cGFja2V0X3R5cGUpIHsKKwkJCQkvKiBiYXRtYW4gb3JpZ2luYXRvciBwYWNrZXQgKi8KKwkJCQljYXNlIEJBVF9QQUNLRVQ6CisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBpbmRpY2F0aW9uIGJ1dCB1bmljYXN0IHJlY2lwaWVudCAqLworCQkJCQlpZiAoIWlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IGF0IGxlYXN0IG9uZSBiYXRtYW4gcGFja2V0IGFzIHBheWxvYWQgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJcmVjZWl2ZV9hZ2dyX2JhdF9wYWNrZXQoZXRoaGRyLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBiYXRtYW5faWYpOworCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJCQkJCWJyZWFrOworCisJCQkJLyogYmF0bWFuIGljbXAgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfSUNNUDoKKwkJCQkJLyogcGFja2V0IHdpdGggdW5pY2FzdCBpbmRpY2F0aW9uIGJ1dCBicm9hZGNhc3QgcmVjaXBpZW50ICovCisJCQkJCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBwYWNrZXQgd2l0aCBicm9hZGNhc3Qgc2VuZGVyIGFkZHJlc3MgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9zb3VyY2UpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJLyogbm90IGZvciBtZSAqLworCQkJCQlpZiAoIWlzX215X21hYyhldGhoZHItPmhfZGVzdCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgaWNtcF9wYWNrZXQpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJaWNtcF9wYWNrZXQgPSAoc3RydWN0IGljbXBfcGFja2V0ICopKHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCQkJCQkvKiBwYWNrZXQgZm9yIG1lICovCisJCQkJCWlmIChpc19teV9tYWMoaWNtcF9wYWNrZXQtPmRzdCkpIHsKKworCQkJCQkJLyogYWRkIGRhdGEgdG8gZGV2aWNlIHF1ZXVlICovCisJCQkJCQlpZiAoaWNtcF9wYWNrZXQtPm1zZ190eXBlICE9IEVDSE9fUkVRVUVTVCkgeworCQkJCQkJCWJhdF9kZXZpY2VfcmVjZWl2ZV9wYWNrZXQoaWNtcF9wYWNrZXQpOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCisJCQkJCQkvKiBhbnN3ZXIgZWNobyByZXF1ZXN0IChwaW5nKSAqLworCQkJCQkJLyogZ2V0IHJvdXRpbmcgaW5mb3JtYXRpb24gKi8KKwkJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQkJb3JpZ19ub2RlID0gKChzdHJ1Y3Qgb3JpZ19ub2RlICopaGFzaF9maW5kKG9yaWdfaGFzaCwgaWNtcF9wYWNrZXQtPm9yaWcpKTsKKworCQkJCQkJaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmICE9IE5VTEwpICYmIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgeworCisJCQkJCQkJbWVtY3B5KGljbXBfcGFja2V0LT5kc3QsIGljbXBfcGFja2V0LT5vcmlnLCBFVEhfQUxFTik7CisJCQkJCQkJbWVtY3B5KGljbXBfcGFja2V0LT5vcmlnLCBldGhoZHItPmhfZGVzdCwgRVRIX0FMRU4pOworCQkJCQkJCWljbXBfcGFja2V0LT5tc2dfdHlwZSA9IEVDSE9fUkVQTFk7CisJCQkJCQkJaWNtcF9wYWNrZXQtPnR0bCA9IFRUTDsKKworCQkJCQkJCXNlbmRfcmF3X3BhY2tldChwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCQkgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJCSAgICAgICAgICAgICAgICBvcmlnX25vZGUtPmJhdG1hbl9pZiwKKwkJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCisJCQkJCQl9CisKKwkJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCQljb250aW51ZTsKKworCQkJCQl9CisKKwkJCQkJLyogVFRMIGV4Y2VlZGVkICovCisJCQkJCWlmIChpY21wX3BhY2tldC0+dHRsIDwgMikgeworCisJCQkJCQlhZGRyX3RvX3N0cmluZyhzcmNfc3RyLCBpY21wX3BhY2tldC0+b3JpZyk7CisJCQkJCQlhZGRyX3RvX3N0cmluZyhkc3Rfc3RyLCBpY21wX3BhY2tldC0+ZHN0KTsKKworCQkJCQkJZGVidWdfbG9nKExPR19UWVBFX05PVElDRSwgIkVycm9yIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgZnJvbSAlcyB0byAlczogdHRsIGV4Y2VlZGVkXG4iLCBzcmNfc3RyLCBkc3Rfc3RyKTsKKworCQkJCQkJLyogc2VuZCBUVEwgZXhjZWVkZWQgaWYgcGFja2V0IGlzIGFuIGVjaG8gcmVxdWVzdCAodHJhY2Vyb3V0ZSkgKi8KKwkJCQkJCWlmIChpY21wX3BhY2tldC0+bXNnX3R5cGUgIT0gRUNIT19SRVFVRVNUKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkvKiBnZXQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCQkJCQkJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC0+b3JpZykpOworCisJCQkJCQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5iYXRtYW5faWYgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpKSB7CisKKwkJCQkJCQltZW1jcHkoaWNtcF9wYWNrZXQtPmRzdCwgaWNtcF9wYWNrZXQtPm9yaWcsIEVUSF9BTEVOKTsKKwkJCQkJCQltZW1jcHkoaWNtcF9wYWNrZXQtPm9yaWcsIGV0aGhkci0+aF9kZXN0LCBFVEhfQUxFTik7CisJCQkJCQkJaWNtcF9wYWNrZXQtPm1zZ190eXBlID0gVFRMX0VYQ0VFREVEOworCQkJCQkJCWljbXBfcGFja2V0LT50dGwgPSBUVEw7CisKKwkJCQkJCQlzZW5kX3Jhd19wYWNrZXQocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkJICAgICAgICAgICAgICAgIHJlc3VsdCAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKworCQkJCQkJfQorCisJCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQkJY29udGludWU7CisKKwkJCQkJfQorCisJCQkJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCBpY21wX3BhY2tldC0+ZHN0KSk7CisKKwkJCQkJaWYgKChvcmlnX25vZGUgIT0gTlVMTCkgJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmICE9IE5VTEwpICYmIChvcmlnX25vZGUtPnJvdXRlciAhPSBOVUxMKSkgeworCisJCQkJCQkvKiBkZWNyZW1lbnQgdHRsICovCisJCQkJCQlpY21wX3BhY2tldC0+dHRsLS07CisKKwkJCQkJCS8qIHJvdXRlIGl0ICovCisJCQkJCQlzZW5kX3Jhd19wYWNrZXQocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkgICAgICAgICAgICAgICAgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCQkJICAgICAgICAgICAgICAgIG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyKTsKKwkJCQkJfQorCisJCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCWJyZWFrOworCisJCQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KKwkJCQljYXNlIEJBVF9VTklDQVNUOgorCQkJCQkvKiBwYWNrZXQgd2l0aCB1bmljYXN0IGluZGljYXRpb24gYnV0IGJyb2FkY2FzdCByZWNpcGllbnQgKi8KKwkJCQkJaWYgKGlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBub3QgZm9yIG1lICovCisJCQkJCWlmICghaXNfbXlfbWFjKGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIGRyb3AgcGFja2V0IGlmIGl0IGhhcyBub3QgbmVjZXNzYXJ5IG1pbmltdW0gc2l6ZSAqLworCQkJCQlpZiAocmVzdWx0IDwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgc2l6ZW9mKHN0cnVjdCB1bmljYXN0X3BhY2tldCkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKikocGFja2V0X2J1ZmYgKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJCQkJCS8qIHBhY2tldCBmb3IgbWUgKi8KKwkJCQkJaWYgKGlzX215X21hYyh1bmljYXN0X3BhY2tldC0+ZGVzdCkpIHsKKworCQkJCQkJaW50ZXJmYWNlX3J4KHNvZnRfZGV2aWNlLCBwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpLCByZXN1bHQgLSBzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSk7CisJCQkJCQljb250aW51ZTsKKworCQkJCQl9CisKKwkJCQkJLyogVFRMIGV4Y2VlZGVkICovCisJCQkJCWlmICh1bmljYXN0X3BhY2tldC0+dHRsIDwgMikgeworCQkJCQkJYWRkcl90b19zdHJpbmcoc3JjX3N0ciwgKChzdHJ1Y3QgZXRoaGRyICopKHVuaWNhc3RfcGFja2V0ICsgMSkpLT5oX3NvdXJjZSk7CisJCQkJCQlhZGRyX3RvX3N0cmluZyhkc3Rfc3RyLCB1bmljYXN0X3BhY2tldC0+ZGVzdCk7CisKKwkJCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9OT1RJQ0UsICJFcnJvciAtIGNhbid0IHNlbmQgcGFja2V0IGZyb20gJXMgdG8gJXM6IHR0bCBleGNlZWRlZFxuIiwgc3JjX3N0ciwgZHN0X3N0cik7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCQkJCXNwaW5fbG9jaygmb3JpZ19oYXNoX2xvY2spOworCQkJCQlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKiloYXNoX2ZpbmQob3JpZ19oYXNoLCB1bmljYXN0X3BhY2tldC0+ZGVzdCkpOworCisJCQkJCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmIChvcmlnX25vZGUtPmJhdG1hbl9pZiAhPSBOVUxMKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKKwkJCQkJCS8qIGRlY3JlbWVudCB0dGwgKi8KKwkJCQkJCXVuaWNhc3RfcGFja2V0LT50dGwtLTsKKworCQkJCQkJLyogcm91dGUgaXQgKi8KKwkJCQkJCXNlbmRfcmF3X3BhY2tldChwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwKKwkJCQkJCSAgICAgICAgICAgICAgICByZXN1bHQgLSBzaXplb2Yoc3RydWN0IGV0aGhkciksCisJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJCQkgICAgICAgICAgICAgICAgb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCQkJCQl9CisKKwkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkvKiBicm9hZGNhc3QgcGFja2V0ICovCisJCQkJY2FzZSBCQVRfQkNBU1Q6CisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBpbmRpY2F0aW9uIGJ1dCB1bmljYXN0IHJlY2lwaWVudCAqLworCQkJCQlpZiAoIWlzX2JjYXN0KGV0aGhkci0+aF9kZXN0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHBhY2tldCB3aXRoIGJyb2FkY2FzdCBzZW5kZXIgYWRkcmVzcyAqLworCQkJCQlpZiAoaXNfYmNhc3QoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KKwkJCQkJaWYgKHJlc3VsdCA8IHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIGlnbm9yZSBicm9hZGNhc3RzIHNlbnQgYnkgbXlzZWxmICovCisJCQkJCWlmIChpc19teV9tYWMoZXRoaGRyLT5oX3NvdXJjZSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQliY2FzdF9wYWNrZXQgPSAoc3RydWN0IGJjYXN0X3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJCQkJLyogaWdub3JlIGJyb2FkY2FzdHMgb3JpZ2luYXRlZCBieSBteXNlbGYgKi8KKwkJCQkJaWYgKGlzX215X21hYyhiY2FzdF9wYWNrZXQtPm9yaWcpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJc3Bpbl9sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChvcmlnX2hhc2gsIGJjYXN0X3BhY2tldC0+b3JpZykpOworCisJCQkJCWlmIChvcmlnX25vZGUgPT0gTlVMTCkgeworCQkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLyogY2hlY2sgZmxvb2QgaGlzdG9yeSAqLworCQkJCQlpZiAoZ2V0X2JpdF9zdGF0dXMob3JpZ19ub2RlLT5iY2FzdF9iaXRzLCBvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8sIG50b2hzKGJjYXN0X3BhY2tldC0+c2Vxbm8pKSkgeworCQkJCQkJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLyogbWFyayBicm9hZGNhc3QgaW4gZmxvb2QgaGlzdG9yeSAqLworCQkJCQlpZiAoYml0X2dldF9wYWNrZXQob3JpZ19ub2RlLT5iY2FzdF9iaXRzLCBudG9ocyhiY2FzdF9wYWNrZXQtPnNlcW5vKSAtIG9yaWdfbm9kZS0+bGFzdF9iY2FzdF9zZXFubywgMSkpCisJCQkJCQlvcmlnX25vZGUtPmxhc3RfYmNhc3Rfc2Vxbm8gPSBudG9ocyhiY2FzdF9wYWNrZXQtPnNlcW5vKTsKKworCQkJCQlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJCQkJCS8qIGJyb2FkY2FzdCBmb3IgbWUgKi8KKwkJCQkJaW50ZXJmYWNlX3J4KHNvZnRfZGV2aWNlLCBwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSwgcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpIC0gc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKTsKKworCQkJCQkvKiByZWJyb2FkY2FzdCBwYWNrZXQgKi8KKwkJCQkJYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHBhY2tldF9idWZmICsgc2l6ZW9mKHN0cnVjdCBldGhoZHIpLAorCQkJCQkJCQkJcmVzdWx0IC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworCQkJCQlicmVhazsKKworCQkJCS8qIHZpcyBwYWNrZXQgKi8KKwkJCQljYXNlIEJBVF9WSVM6CisJCQkJCS8qIGRyb3AgaWYgdG9vIHNob3J0LiAqLworCQkJCQlpZiAocmVzdWx0IDwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgc2l6ZW9mKHN0cnVjdCB2aXNfcGFja2V0KSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIG5vdCBmb3IgbWUgKi8KKwkJCQkJaWYgKCFpc19teV9tYWMoZXRoaGRyLT5oX2Rlc3QpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJdmlzX3BhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKShwYWNrZXRfYnVmZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJCQkJCXZpc19pbmZvX2xlbiA9IHJlc3VsdCAgLSBzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBzaXplb2Yoc3RydWN0IHZpc19wYWNrZXQpOworCisJCQkJCS8qIGlnbm9yZSBvd24gcGFja2V0cyAqLworCQkJCQlpZiAoaXNfbXlfbWFjKHZpc19wYWNrZXQtPnZpc19vcmlnKSkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCWlmIChpc19teV9tYWModmlzX3BhY2tldC0+c2VuZGVyX29yaWcpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJc3dpdGNoICh2aXNfcGFja2V0LT52aXNfdHlwZSkgeworCQkJCQljYXNlIFZJU19UWVBFX1NFUlZFUl9TWU5DOgorCQkJCQkJcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQodmlzX3BhY2tldCwgdmlzX2luZm9fbGVuKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgVklTX1RZUEVfQ0xJRU5UX1VQREFURToKKwkJCQkJCXJlY2VpdmVfY2xpZW50X3VwZGF0ZV9wYWNrZXQodmlzX3BhY2tldCwgdmlzX2luZm9fbGVuKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CS8qIGlnbm9yZSB1bmtub3duIHBhY2tldCAqLworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKChyZXN1bHQgPCAwKSAmJiAocmVzdWx0ICE9IC1FQUdBSU4pKQorCQkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGQgbm90IHJlY2VpdmUgcGFja2V0IGZyb20gaW50ZXJmYWNlICVzOiAlaVxuIiwgYmF0bWFuX2lmLT5kZXYsIHJlc3VsdCk7CisKKwkJCS8qIGxvY2sgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworCQkJcmN1X3JlYWRfbG9jaygpOworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCisJfQorCWtmcmVlKHBhY2tldF9idWZmKTsKKworCS8qIGRvIG5vdCBleGl0IHVudGlsIGt0aHJlYWRfc3RvcCgpIGlzIGFjdHVhbGx5IGNhbGxlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgd2FpdCBmb3IgdXMKKwkgKiBmb3JldmVyLiAqLworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlzY2hlZHVsZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmF0bWFuX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQoreworCXZvaWQgKCpkYXRhX3JlYWR5KShzdHJ1Y3Qgc29jayAqLCBpbnQpID0gc2stPnNrX3VzZXJfZGF0YTsKKworCWRhdGFfcmVhZHkoc2ssIGxlbik7CisKKwlhdG9taWNfc2V0KCZkYXRhX3JlYWR5X2NvbmQsIDEpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdGhyZWFkX3dhaXQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9yb3V0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyM2VhOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3JvdXRpbmcuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisKK2V4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCB0aHJlYWRfd2FpdDsKK2V4dGVybiBhdG9taWNfdCBleGl0X2NvbmQ7CisKK2ludCBvcmlnaW5hdG9yX2luaXQodm9pZCk7Cit2b2lkIGZyZWVfb3JpZ19ub2RlKHZvaWQgKmRhdGEpOwordm9pZCBvcmlnaW5hdG9yX2ZyZWUodm9pZCk7Cit2b2lkIHNsaWRlX293bl9iY2FzdF93aW5kb3coc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmKTsKK3ZvaWQgYmF0bWFuX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKTsKK3ZvaWQgcHVyZ2Vfb3JpZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworaW50IHBhY2tldF9yZWN2X3RocmVhZCh2b2lkICpkYXRhKTsKK3ZvaWQgcmVjZWl2ZV9iYXRfcGFja2V0KHN0cnVjdCBldGhoZHIgKmV0aGhkciwgc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQsIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuLCBzdHJ1Y3QgYmF0bWFuX2lmICppZl9pbmNvbWluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyNDc5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NlbmQuYwpAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgInJvdXRpbmcuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgorI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJ2aXMuaCIKKyNpbmNsdWRlICJhZ2dyZWdhdGlvbi5oIgorCisjaW5jbHVkZSAiY29tcGF0LmgiCisKKy8qIGFwcGx5IGhvcCBwZW5hbHR5IGZvciBhIG5vcm1hbCBsaW5rICovCitzdGF0aWMgdWludDhfdCBob3BfcGVuYWx0eShjb25zdCB1aW50OF90IHRxKQoreworCXJldHVybiAodHEgKiAoVFFfTUFYX1ZBTFVFIC0gVFFfSE9QX1BFTkFMVFkpKSAvIChUUV9NQVhfVkFMVUUpOworfQorCisvKiB3aGVuIGRvIHdlIHNjaGVkdWxlIG91ciBvd24gcGFja2V0IHRvIGJlIHNlbnQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG93bl9zZW5kX3RpbWUodm9pZCkKK3sKKwlyZXR1cm4gamlmZmllcyArCisJCSgoKGF0b21pY19yZWFkKCZvcmlnaW5hdG9yX2ludGVydmFsKSAtIEpJVFRFUiArCisJCSAgIChyYW5kb20zMigpICUgMipKSVRURVIpKSAqIEhaKSAvIDEwMDApOworfQorCisvKiB3aGVuIGRvIHdlIHNjaGVkdWxlIGEgZm9yd2FyZGVkIHBhY2tldCB0byBiZSBzZW50ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmb3J3YXJkX3NlbmRfdGltZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2VuZF90aW1lID0gamlmZmllczsgLyogU3RhcnRpbmcgbm93IHBsdXMuLi4gKi8KKworCWlmIChhdG9taWNfcmVhZCgmYWdncmVnYXRpb25fZW5hYmxlZCkpCisJCXNlbmRfdGltZSArPSAoKChNQVhfQUdHUkVHQVRJT05fTVMgLSAoSklUVEVSLzIpICsKKwkJCQkocmFuZG9tMzIoKSAlIEpJVFRFUikpICogSFopIC8gMTAwMCk7CisJZWxzZQorCQlzZW5kX3RpbWUgKz0gKCgocmFuZG9tMzIoKSAlIChKSVRURVIvMikpICogSFopIC8gMTAwMCk7CisKKwlyZXR1cm4gc2VuZF90aW1lOworfQorCisvKiBzZW5kcyBhIHJhdyBwYWNrZXQuICovCit2b2lkIHNlbmRfcmF3X3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrX2J1ZmYsIGludCBwYWNrX2J1ZmZfbGVuLAorCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgdWludDhfdCAqZHN0X2FkZHIpCit7CisJc3RydWN0IGV0aGhkciAqZXRoaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJldHZhbDsKKwljaGFyICpkYXRhOworCisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJcmV0dXJuOworCisJaWYgKCEoYmF0bWFuX2lmLT5uZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJZGVidWdfbG9nKExPR19UWVBFX1dBUk4sCisJCSAgICAgICAgICJJbnRlcmZhY2UgJXMgaXMgbm90IHVwIC0gY2FuJ3Qgc2VuZCBwYWNrZXQgdmlhIHRoYXQgaW50ZXJmYWNlIChJRl9UT19CRV9ERUFDVElWQVRFRCB3YXMgaGVyZSkgIVxuIiwKKwkJICAgICAgICAgIGJhdG1hbl9pZi0+ZGV2KTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IocGFja19idWZmX2xlbiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisJaWYgKCFza2IpCisJCXJldHVybjsKKwlkYXRhID0gc2tiX3B1dChza2IsIHBhY2tfYnVmZl9sZW4gKyBzaXplb2Yoc3RydWN0IGV0aGhkcikpOworCisJbWVtY3B5KGRhdGEgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksIHBhY2tfYnVmZiwgcGFja19idWZmX2xlbik7CisKKwlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKSBkYXRhOworCW1lbWNweShldGhoZHItPmhfc291cmNlLCBiYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGV0aGhkci0+aF9kZXN0LCBkc3RfYWRkciwgRVRIX0FMRU4pOworCWV0aGhkci0+aF9wcm90byA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQkFUTUFOKTsKKworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIEVUSF9ITEVOKTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0JBVE1BTik7CisJc2tiLT5kZXYgPSBiYXRtYW5faWYtPm5ldF9kZXY7CisKKwkvKiBkZXZfcXVldWVfeG1pdCgpIHJldHVybnMgYSBuZWdhdGl2ZSByZXN1bHQgb24gZXJyb3IuCSBIb3dldmVyIG9uCisJICogY29uZ2VzdGlvbiBhbmQgdHJhZmZpYyBzaGFwaW5nLCBpdCBkcm9wcyBhbmQgcmV0dXJucyBORVRfWE1JVF9EUk9QCisJICogKHdoaWNoIGlzID4gMCkuIFRoaXMgd2lsbCBub3QgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gKi8KKwlyZXR2YWwgPSBkZXZfcXVldWVfeG1pdChza2IpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwKKwkJICAgICAgICAgICJDYW4ndCB3cml0ZSB0byByYXcgc29ja2V0IChJRl9UT19CRV9ERUFDVElWQVRFRCB3YXMgaGVyZSk6ICVpXG4iLAorCQkgICAgICAgICAgcmV0dmFsKTsKK30KKworLyogU2VuZCBhIHBhY2tldCB0byBhIGdpdmVuIGludGVyZmFjZSAqLworc3RhdGljIHZvaWQgc2VuZF9wYWNrZXRfdG9faWYoc3RydWN0IGZvcndfcGFja2V0ICpmb3J3X3BhY2tldCwKKwkJCSAgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwljaGFyICpmd2Rfc3RyOworCXVpbnQ4X3QgcGFja2V0X251bTsKKwlpbnQxNl90IGJ1ZmZfcG9zOworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0OworCWNoYXIgb3JpZ19zdHJbRVRIX1NUUl9MRU5dOworCisJaWYgKGJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJcmV0dXJuOworCisJcGFja2V0X251bSA9IGJ1ZmZfcG9zID0gMDsKKwliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopCisJCShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpOworCisJLyogYWRqdXN0IGFsbCBmbGFncyBhbmQgbG9nIHBhY2tldHMgKi8KKwl3aGlsZSAoYWdncmVnYXRlZF9wYWNrZXQoYnVmZl9wb3MsCisJCQkJIGZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJCSBiYXRtYW5fcGFja2V0LT5udW1faG5hKSkgeworCisJCS8qIHdlIG1pZ2h0IGhhdmUgYWdncmVnYXRlZCBkaXJlY3QgbGluayBwYWNrZXRzIHdpdGggYW4KKwkJICogb3JkaW5hcnkgYmFzZSBwYWNrZXQgKi8KKwkJaWYgKChmb3J3X3BhY2tldC0+ZGlyZWN0X2xpbmtfZmxhZ3MgJiAoMSA8PCBwYWNrZXRfbnVtKSkgJiYKKwkJICAgIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPT0gYmF0bWFuX2lmKSkKKwkJCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IERJUkVDVExJTks7CisJCWVsc2UKKwkJCWJhdG1hbl9wYWNrZXQtPmZsYWdzICY9IH5ESVJFQ1RMSU5LOworCisJCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBiYXRtYW5fcGFja2V0LT5vcmlnKTsKKwkJZndkX3N0ciA9IChwYWNrZXRfbnVtID4gMCA/ICJGb3J3YXJkaW5nIiA6IChmb3J3X3BhY2tldC0+b3duID8KKwkJCQkJCQkgICAgIlNlbmRpbmcgb3duIiA6CisJCQkJCQkJICAgICJGb3J3YXJkaW5nIikpOworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLAorCQkJICAiJXMgJXNwYWNrZXQgKG9yaWdpbmF0b3IgJXMsIHNlcW5vICVkLCBUUSAlZCwgVFRMICVkLCBJREYgJXMpIG9uIGludGVyZmFjZSAlcyBbJXNdXG4iLAorCQkJICBmd2Rfc3RyLAorCQkJICAocGFja2V0X251bSA+IDAgPyAiYWdncmVnYXRlZCAiIDogIiIpLAorCQkJICBvcmlnX3N0ciwgbnRvaHMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAorCQkJICBiYXRtYW5fcGFja2V0LT50cSwgYmF0bWFuX3BhY2tldC0+dHRsLAorCQkJICAoYmF0bWFuX3BhY2tldC0+ZmxhZ3MgJiBESVJFQ1RMSU5LID8KKwkJCSAgICJvbiIgOiAib2ZmIiksCisJCQkgIGJhdG1hbl9pZi0+ZGV2LCBiYXRtYW5faWYtPmFkZHJfc3RyKTsKKworCQlidWZmX3BvcyArPSBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpICsKKwkJCShiYXRtYW5fcGFja2V0LT5udW1faG5hICogRVRIX0FMRU4pOworCQlwYWNrZXRfbnVtKys7CisJCWJhdG1hbl9wYWNrZXQgPSAoc3RydWN0IGJhdG1hbl9wYWNrZXQgKikKKwkJCShmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYgKyBidWZmX3Bvcyk7CisJfQorCisJc2VuZF9yYXdfcGFja2V0KGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiwKKwkJCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJYmF0bWFuX2lmLCBicm9hZGNhc3RBZGRyKTsKK30KKworLyogc2VuZCBhIGJhdG1hbiBwYWNrZXQgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0ID0KKwkJKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopKGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZik7CisJY2hhciBvcmlnX3N0cltFVEhfU1RSX0xFTl07CisJdW5zaWduZWQgY2hhciBkaXJlY3RsaW5rID0gKGJhdG1hbl9wYWNrZXQtPmZsYWdzICYgRElSRUNUTElOSyA/IDEgOiAwKTsKKworCWlmICghZm9yd19wYWNrZXQtPmlmX2luY29taW5nKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULAorCQkJICAiRXJyb3IgLSBjYW4ndCBmb3J3YXJkIHBhY2tldDogaW5jb21pbmcgaWZhY2Ugbm90IHNwZWNpZmllZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9hY3RpdmUgIT0gSUZfQUNUSVZFKQorCQlyZXR1cm47CisKKwlhZGRyX3RvX3N0cmluZyhvcmlnX3N0ciwgYmF0bWFuX3BhY2tldC0+b3JpZyk7CisKKwkvKiBtdWx0aWhvbWVkIHBlZXIgYXNzdW1lZCAqLworCS8qIG5vbi1wcmltYXJ5IE9HTXMgYXJlIG9ubHkgYnJvYWRjYXN0ZWQgb24gdGhlaXIgaW50ZXJmYWNlICovCisJaWYgKChkaXJlY3RsaW5rICYmIChiYXRtYW5fcGFja2V0LT50dGwgPT0gMSkpIHx8CisJICAgIChmb3J3X3BhY2tldC0+b3duICYmIChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmlmX251bSA+IDApKSkgeworCisJCS8qIEZJWE1FOiB3aGF0IGFib3V0IGFnZ3JlZ2F0ZWQgcGFja2V0cyA/ICovCisJCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sCisJCQkgICIlcyBwYWNrZXQgKG9yaWdpbmF0b3IgJXMsIHNlcW5vICVkLCBUVEwgJWQpIG9uIGludGVyZmFjZSAlcyBbJXNdXG4iLAorCQkJICAoZm9yd19wYWNrZXQtPm93biA/ICJTZW5kaW5nIG93biIgOiAiRm9yd2FyZGluZyIpLAorCQkJICBvcmlnX3N0ciwgbnRvaHMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pLAorCQkJICBiYXRtYW5fcGFja2V0LT50dGwsIGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+ZGV2LAorCQkJICBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPmFkZHJfc3RyKTsKKworCQlzZW5kX3Jhd19wYWNrZXQoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmLAorCQkJCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuLAorCQkJCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZywKKwkJCQlicm9hZGNhc3RBZGRyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGJyb2FkY2FzdCBvbiBldmVyeSBpbnRlcmZhY2UgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoYmF0bWFuX2lmLCAmaWZfbGlzdCwgbGlzdCkKKwkJc2VuZF9wYWNrZXRfdG9faWYoZm9yd19wYWNrZXQsIGJhdG1hbl9pZik7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYnVpbGRfYmF0bWFuX3BhY2tldChzdHJ1Y3QgYmF0bWFuX2lmICpiYXRtYW5faWYpCit7CisJaW50IG5ld19sZW47CisJdW5zaWduZWQgY2hhciAqbmV3X2J1ZmY7CisJc3RydWN0IGJhdG1hbl9wYWNrZXQgKmJhdG1hbl9wYWNrZXQ7CisKKwluZXdfbGVuID0gc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArIChudW1faG5hICogRVRIX0FMRU4pOworCW5ld19idWZmID0ga21hbGxvYyhuZXdfbGVuLCBHRlBfQVRPTUlDKTsKKworCS8qIGtlZXAgb2xkIGJ1ZmZlciBpZiBrbWFsbG9jIHNob3VsZCBmYWlsICovCisJaWYgKG5ld19idWZmKSB7CisJCW1lbWNweShuZXdfYnVmZiwgYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF0bWFuX3BhY2tldCkpOworCQliYXRtYW5fcGFja2V0ID0gKHN0cnVjdCBiYXRtYW5fcGFja2V0ICopbmV3X2J1ZmY7CisKKwkJYmF0bWFuX3BhY2tldC0+bnVtX2huYSA9IGhuYV9sb2NhbF9maWxsX2J1ZmZlcigKKwkJCW5ld19idWZmICsgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSwKKwkJCW5ld19sZW4gLSBzaXplb2Yoc3RydWN0IGJhdG1hbl9wYWNrZXQpKTsKKworCQlrZnJlZShiYXRtYW5faWYtPnBhY2tldF9idWZmKTsKKwkJYmF0bWFuX2lmLT5wYWNrZXRfYnVmZiA9IG5ld19idWZmOworCQliYXRtYW5faWYtPnBhY2tldF9sZW4gPSBuZXdfbGVuOworCX0KK30KKwordm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZikKK3sKKwl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKKwlzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldDsKKworCS8qKgorCSAqIHRoZSBpbnRlcmZhY2UgZ2V0cyBhY3RpdmF0ZWQgaGVyZSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgYmV0d2VlbgorCSAqIHRoZSBtb21lbnQgb2YgYWN0aXZhdGluZyB0aGUgaW50ZXJmYWNlIGluCisJICogaGFyZGlmX2FjdGl2YXRlX2ludGVyZmFjZSgpIHdoZXJlIHRoZSBvcmlnaW5hdG9yIG1hYyBpcyBzZXQgYW5kCisJICogb3V0ZGF0ZWQgcGFja2V0cyAoZXNwZWNpYWxseSB1bmluaXRpYWxpemVkIG1hYyBhZGRyZXNzZXMpIGluIHRoZQorCSAqIHBhY2tldCBxdWV1ZQorCSAqLworCWlmIChiYXRtYW5faWYtPmlmX2FjdGl2ZSA9PSBJRl9UT19CRV9BQ1RJVkFURUQpCisJCWJhdG1hbl9pZi0+aWZfYWN0aXZlID0gSUZfQUNUSVZFOworCisJLyogaWYgbG9jYWwgaG5hIGhhcyBjaGFuZ2VkIGFuZCBpbnRlcmZhY2UgaXMgYSBwcmltYXJ5IGludGVyZmFjZSAqLworCWlmICgoYXRvbWljX3JlYWQoJmhuYV9sb2NhbF9jaGFuZ2VkKSkgJiYgKGJhdG1hbl9pZi0+aWZfbnVtID09IDApKQorCQlyZWJ1aWxkX2JhdG1hbl9wYWNrZXQoYmF0bWFuX2lmKTsKKworCS8qKgorCSAqIE5PVEU6IHBhY2tldF9idWZmIG1pZ2h0IGp1c3QgaGF2ZSBiZWVuIHJlLWFsbG9jYXRlZCBpbgorCSAqIHJlYnVpbGRfYmF0bWFuX3BhY2tldCgpCisJICovCisJYmF0bWFuX3BhY2tldCA9IChzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqKWJhdG1hbl9pZi0+cGFja2V0X2J1ZmY7CisKKwkvKiBjaGFuZ2Ugc2VxdWVuY2UgbnVtYmVyIHRvIG5ldHdvcmsgb3JkZXIgKi8KKwliYXRtYW5fcGFja2V0LT5zZXFubyA9IGh0b25zKCh1aW50MTZfdClhdG9taWNfcmVhZCgmYmF0bWFuX2lmLT5zZXFubykpOworCisJaWYgKGlzX3Zpc19zZXJ2ZXIoKSkKKwkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSBWSVNfU0VSVkVSOworCWVsc2UKKwkJYmF0bWFuX3BhY2tldC0+ZmxhZ3MgPSAwOworCisJLyogY291bGQgYmUgcmVhZCBieSByZWNlaXZlX2JhdF9wYWNrZXQoKSAqLworCWF0b21pY19pbmMoJmJhdG1hbl9pZi0+c2Vxbm8pOworCisJc2xpZGVfb3duX2JjYXN0X3dpbmRvdyhiYXRtYW5faWYpOworCXNlbmRfdGltZSA9IG93bl9zZW5kX3RpbWUoKTsKKwlhZGRfYmF0X3BhY2tldF90b19saXN0KGJhdG1hbl9pZi0+cGFja2V0X2J1ZmYsCisJCQkgICAgICAgYmF0bWFuX2lmLT5wYWNrZXRfbGVuLCBiYXRtYW5faWYsIDEsIHNlbmRfdGltZSk7Cit9CisKK3ZvaWQgc2NoZWR1bGVfZm9yd2FyZF9wYWNrZXQoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJICAgICBzdHJ1Y3QgZXRoaGRyICpldGhoZHIsCisJCQkgICAgIHN0cnVjdCBiYXRtYW5fcGFja2V0ICpiYXRtYW5fcGFja2V0LAorCQkJICAgICB1aW50OF90IGRpcmVjdGxpbmssIGludCBobmFfYnVmZl9sZW4sCisJCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nKQoreworCXVuc2lnbmVkIGNoYXIgaW5fdHEsIGluX3R0bCwgdHFfYXZnID0gMDsKKwl1bnNpZ25lZCBsb25nIHNlbmRfdGltZTsKKworCWlmIChiYXRtYW5fcGFja2V0LT50dGwgPD0gMSkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAidHRsIGV4Y2VlZGVkIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbl90cSA9IGJhdG1hbl9wYWNrZXQtPnRxOworCWluX3R0bCA9IGJhdG1hbl9wYWNrZXQtPnR0bDsKKworCWJhdG1hbl9wYWNrZXQtPnR0bC0tOworCW1lbWNweShiYXRtYW5fcGFja2V0LT5wcmV2X3NlbmRlciwgZXRoaGRyLT5oX3NvdXJjZSwgRVRIX0FMRU4pOworCisJLyogcmVicm9hZGNhc3QgdHEgb2Ygb3VyIGJlc3QgcmFua2luZyBuZWlnaGJvciB0byBlbnN1cmUgdGhlIHJlYnJvYWRjYXN0CisJICogb2Ygb3VyIGJlc3QgdHEgdmFsdWUgKi8KKwlpZiAoKG9yaWdfbm9kZS0+cm91dGVyKSAmJiAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyAhPSAwKSkgeworCisJCS8qIHJlYnJvYWRjYXN0IG9nbSBvZiBiZXN0IHJhbmtpbmcgbmVpZ2hib3IgYXMgaXMgKi8KKwkJaWYgKCFjb21wYXJlX29yaWcob3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIsIGV0aGhkci0+aF9zb3VyY2UpKSB7CisJCQliYXRtYW5fcGFja2V0LT50cSA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7CisKKwkJCWlmIChvcmlnX25vZGUtPnJvdXRlci0+bGFzdF90dGwpCisJCQkJYmF0bWFuX3BhY2tldC0+dHRsID0gb3JpZ19ub2RlLT5yb3V0ZXItPmxhc3RfdHRsIC0gMTsKKwkJfQorCisJCXRxX2F2ZyA9IG9yaWdfbm9kZS0+cm91dGVyLT50cV9hdmc7CisJfQorCisJLyogYXBwbHkgaG9wIHBlbmFsdHkgKi8KKwliYXRtYW5fcGFja2V0LT50cSA9IGhvcF9wZW5hbHR5KGJhdG1hbl9wYWNrZXQtPnRxKTsKKworCWRlYnVnX2xvZyhMT0dfVFlQRV9CQVRNQU4sICJGb3J3YXJkaW5nIHBhY2tldDogdHFfb3JpZzogJWksIHRxX2F2ZzogJWksIHRxX2Zvcnc6ICVpLCB0dGxfb3JpZzogJWksIHR0bF9mb3J3OiAlaSBcbiIsCisJCSAgaW5fdHEsIHRxX2F2ZywgYmF0bWFuX3BhY2tldC0+dHEsIGluX3R0bCAtIDEsCisJCSAgYmF0bWFuX3BhY2tldC0+dHRsKTsKKworCWJhdG1hbl9wYWNrZXQtPnNlcW5vID0gaHRvbnMoYmF0bWFuX3BhY2tldC0+c2Vxbm8pOworCisJaWYgKGRpcmVjdGxpbmspCisJCWJhdG1hbl9wYWNrZXQtPmZsYWdzIHw9IERJUkVDVExJTks7CisJZWxzZQorCQliYXRtYW5fcGFja2V0LT5mbGFncyAmPSB+RElSRUNUTElOSzsKKworCXNlbmRfdGltZSA9IGZvcndhcmRfc2VuZF90aW1lKCk7CisJYWRkX2JhdF9wYWNrZXRfdG9fbGlzdCgodW5zaWduZWQgY2hhciAqKWJhdG1hbl9wYWNrZXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXRtYW5fcGFja2V0KSArIGhuYV9idWZmX2xlbiwKKwkJCSAgICAgICBpZl9pbmNvbWluZywgMCwgc2VuZF90aW1lKTsKK30KKworc3RhdGljIHZvaWQgZm9yd19wYWNrZXRfZnJlZShzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQoreworCWtmcmVlKGZvcndfcGFja2V0LT5wYWNrZXRfYnVmZik7CisJa2ZyZWUoZm9yd19wYWNrZXQpOworfQorCitzdGF0aWMgdm9pZCBfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzZW5kX3RpbWUpCit7CisJSU5JVF9ITElTVF9OT0RFKCZmb3J3X3BhY2tldC0+bGlzdCk7CisKKwkvKiBhZGQgbmV3IHBhY2tldCB0byBwYWNrZXQgbGlzdCAqLworCXNwaW5fbG9jaygmZm9yd19iY2FzdF9saXN0X2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZmb3J3X3BhY2tldC0+bGlzdCwgJmZvcndfYmNhc3RfbGlzdCk7CisJc3Bpbl91bmxvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworCS8qIHN0YXJ0IHRpbWVyIGZvciB0aGlzIHBhY2tldCAqLworCUlOSVRfREVMQVlFRF9XT1JLKCZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrLAorCQkJICBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldCk7CisJcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZmb3J3X3BhY2tldC0+ZGVsYXllZF93b3JrLAorCQkJICAgc2VuZF90aW1lKTsKK30KKwordm9pZCBhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QodW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmYsIGludCBwYWNrZXRfbGVuKQoreworCXN0cnVjdCBmb3J3X3BhY2tldCAqZm9yd19wYWNrZXQ7CisKKwlmb3J3X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOworCWlmICghZm9yd19wYWNrZXQpCisJCXJldHVybjsKKworCWZvcndfcGFja2V0LT5wYWNrZXRfYnVmZiA9IGttYWxsb2MocGFja2V0X2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYpCisJCXJldHVybjsKKworCWZvcndfcGFja2V0LT5wYWNrZXRfbGVuID0gcGFja2V0X2xlbjsKKwltZW1jcHkoZm9yd19wYWNrZXQtPnBhY2tldF9idWZmLCBwYWNrZXRfYnVmZiwgZm9yd19wYWNrZXQtPnBhY2tldF9sZW4pOworCisJLyogaG93IG9mdGVuIGRpZCB3ZSBzZW5kIHRoZSBiY2FzdCBwYWNrZXQgPyAqLworCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7CisKKwlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGZvcndfcGFja2V0LCAxKTsKK30KKwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJhdG1hbl9pZiAqYmF0bWFuX2lmOworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KKwkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOworCisJc3Bpbl9sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisJaGxpc3RfZGVsKCZmb3J3X3BhY2tldC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworCS8qIHJlYnJvYWRjYXN0IHBhY2tldCAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYXRtYW5faWYsICZpZl9saXN0LCBsaXN0KSB7CisJCXNlbmRfcmF3X3BhY2tldChmb3J3X3BhY2tldC0+cGFja2V0X2J1ZmYsCisJCQkJZm9yd19wYWNrZXQtPnBhY2tldF9sZW4sCisJCQkJYmF0bWFuX2lmLCBicm9hZGNhc3RBZGRyKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMrKzsKKworCS8qIGlmIHdlIHN0aWxsIGhhdmUgc29tZSBtb3JlIGJjYXN0cyB0byBzZW5kIGFuZCB3ZSBhcmUgbm90IHNodXR0aW5nCisJICogZG93biAqLworCWlmICgoZm9yd19wYWNrZXQtPm51bV9wYWNrZXRzIDwgMykgJiYKKwkgICAgKGF0b21pY19yZWFkKCZtb2R1bGVfc3RhdGUpICE9IE1PRFVMRV9ERUFDVElWQVRJTkcpKQorCQlfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KGZvcndfcGFja2V0LCAoKDUgKiBIWikgLyAxMDAwKSk7CisJZWxzZQorCQlmb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKK30KKwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmRlbGF5ZWRfd29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0ID0KKwkJY29udGFpbmVyX29mKGRlbGF5ZWRfd29yaywgc3RydWN0IGZvcndfcGFja2V0LCBkZWxheWVkX3dvcmspOworCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCisJc2VuZF9wYWNrZXQoZm9yd19wYWNrZXQpOworCisJLyoqCisJICogd2UgaGF2ZSB0byBoYXZlIGF0IGxlYXN0IG9uZSBwYWNrZXQgaW4gdGhlIHF1ZXVlCisJICogdG8gZGV0ZXJtaW5lIHRoZSBxdWV1ZXMgd2FrZSB1cCB0aW1lIHVubGVzcyB3ZSBhcmUKKwkgKiBzaHV0dGluZyBkb3duCisJICovCisJaWYgKChmb3J3X3BhY2tldC0+b3duKSAmJgorCSAgICAoYXRvbWljX3JlYWQoJm1vZHVsZV9zdGF0ZSkgIT0gTU9EVUxFX0RFQUNUSVZBVElORykpCisJCXNjaGVkdWxlX293bl9wYWNrZXQoZm9yd19wYWNrZXQtPmlmX2luY29taW5nKTsKKworCWZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOworfQorCit2b2lkIHB1cmdlX291dHN0YW5kaW5nX3BhY2tldHModm9pZCkKK3sKKwlzdHJ1Y3QgZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OworCXN0cnVjdCBobGlzdF9ub2RlICp0bXBfbm9kZSwgKnNhZmVfdG1wX25vZGU7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfQkFUTUFOLCAicHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cygpXG4iKTsKKworCS8qIGZyZWUgYmNhc3QgbGlzdCAqLworCXNwaW5fbG9jaygmZm9yd19iY2FzdF9saXN0X2xvY2spOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm9yd19wYWNrZXQsIHRtcF9ub2RlLCBzYWZlX3RtcF9ub2RlLAorCQkJCSAgJmZvcndfYmNhc3RfbGlzdCwgbGlzdCkgeworCisJCXNwaW5fdW5sb2NrKCZmb3J3X2JjYXN0X2xpc3RfbG9jayk7CisKKwkJLyoqCisJCSAqIHNlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCisJCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0CisJCSAqLworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOworCQlzcGluX2xvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmZvcndfYmNhc3RfbGlzdF9sb2NrKTsKKworCS8qIGZyZWUgYmF0bWFuIHBhY2tldCBsaXN0ICovCisJc3Bpbl9sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm9yd19wYWNrZXQsIHRtcF9ub2RlLCBzYWZlX3RtcF9ub2RlLAorCQkJCSAgJmZvcndfYmF0X2xpc3QsIGxpc3QpIHsKKworCQlzcGluX3VubG9jaygmZm9yd19iYXRfbGlzdF9sb2NrKTsKKworCQkvKioKKwkJICogc2VuZF9vdXRzdGFuZGluZ19iYXRfcGFja2V0KCkgd2lsbCBsb2NrIHRoZSBsaXN0IHRvCisJCSAqIGRlbGV0ZSB0aGUgaXRlbSBmcm9tIHRoZSBsaXN0CisJCSAqLworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmspOworCQlzcGluX2xvY2soJmZvcndfYmF0X2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZmb3J3X2JhdF9saXN0X2xvY2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc2VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDUwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zZW5kLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lciwgU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCit2b2lkIHNlbmRfb3duX3BhY2tldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHNlbmRfcmF3X3BhY2tldCh1bnNpZ25lZCBjaGFyICpwYWNrX2J1ZmYsIGludCBwYWNrX2J1ZmZfbGVuLAorCQkgICAgIHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZiwgdWludDhfdCAqZHN0X2FkZHIpOwordm9pZCBzY2hlZHVsZV9vd25fcGFja2V0KHN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZik7Cit2b2lkIHNjaGVkdWxlX2ZvcndhcmRfcGFja2V0KHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCSAgICAgc3RydWN0IGV0aGhkciAqZXRoaGRyLAorCQkJICAgICBzdHJ1Y3QgYmF0bWFuX3BhY2tldCAqYmF0bWFuX3BhY2tldCwKKwkJCSAgICAgdWludDhfdCBkaXJlY3RsaW5rLCBpbnQgaG5hX2J1ZmZfbGVuLAorCQkJICAgICBzdHJ1Y3QgYmF0bWFuX2lmICppZl9vdXRnb2luZyk7Cit2b2lkIGFkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdCh1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZiwgaW50IHBhY2tldF9sZW4pOwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBzZW5kX291dHN0YW5kaW5nX2JhdF9wYWNrZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgcHVyZ2Vfb3V0c3RhbmRpbmdfcGFja2V0cyh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDNmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgorI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAiY29tcGF0LmgiCisKK3N0YXRpYyB1aW50MTZfdCBiY2FzdF9zZXFubyA9IDE7IC8qIGdpdmUgb3duIGJjYXN0IG1lc3NhZ2VzIHNlcSBudW1iZXJzIHRvIGF2b2lkCisJCQkJICAqIGJyb2FkY2FzdCBzdG9ybXMgKi8KK3N0YXRpYyBpbnQzMl90IHNrYl9wYWNrZXRzOworc3RhdGljIGludDMyX3Qgc2tiX2JhZF9wYWNrZXRzOworc3RhdGljIGludDMyX3QgbG9ja19kcm9wcGVkOworCit1bnNpZ25lZCBjaGFyIG1haW5JZkFkZHJbRVRIX0FMRU5dOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFpbklmQWRkcl9kZWZhdWx0W0VUSF9BTEVOXTsKK3N0YXRpYyBpbnQgYmF0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCk7CitzdGF0aWMgdm9pZCBiYXRfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKTsKK3N0YXRpYyB1MzIgYmF0X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJhdF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKTsKK3N0YXRpYyB1MzIgYmF0X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHUzMiBiYXRfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJhdF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYmF0X2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBiYXRfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGJhdF9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsID0gYmF0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gYmF0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X2xpbmsgPSBiYXRfZ2V0X2xpbmssCisJLmdldF9yeF9jc3VtID0gYmF0X2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bSA9IGJhdF9zZXRfcnhfY3N1bQorfTsKKwordm9pZCBzZXRfbWFpbl9pZl9hZGRyKHVpbnQ4X3QgKmFkZHIpCit7CisJbWVtY3B5KG1haW5JZkFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKK30KKworaW50IG1haW5faWZfd2FzX3VwKHZvaWQpCit7CisJcmV0dXJuIChtZW1jbXAobWFpbklmQWRkciwgbWFpbklmQWRkcl9kZWZhdWx0LCBFVEhfQUxFTikgIT0gMCA/IDEgOiAwKTsKK30KKworc3RhdGljIGludCBteV9za2JfcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCByZXN1bHQgPSAwOworCisJc2tiX3BhY2tldHMrKzsKKwlpZiAoc2tiLT5kYXRhIC0gbGVuIDwgc2tiLT5oZWFkKSB7CisJCXNrYl9iYWRfcGFja2V0cysrOworCQlyZXN1bHQgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgbGVuLCAwLCBHRlBfQVRPTUlDKTsKKworCQlpZiAocmVzdWx0IDwgMCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCisJc2tiX3B1c2goc2tiLCBsZW4pOworCXJldHVybiAwOworfQorCisjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiYXRfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gPSBpbnRlcmZhY2Vfb3BlbiwKKwkubmRvX3N0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZSwKKwkubmRvX2dldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0cywKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHUsCisJLm5kb19zdGFydF94bWl0ID0gaW50ZXJmYWNlX3R4LAorCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyCit9OworI2VuZGlmCisKK3ZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIGRldl9hZGRyW0VUSF9BTEVOXTsKKworCWV0aGVyX3NldHVwKGRldik7CisKKyNpZmRlZiBIQVZFX05FVF9ERVZJQ0VfT1BTCisJZGV2LT5uZXRkZXZfb3BzID0gJmJhdF9uZXRkZXZfb3BzOworI2Vsc2UKKwlkZXYtPm9wZW4gPSBpbnRlcmZhY2Vfb3BlbjsKKwlkZXYtPnN0b3AgPSBpbnRlcmZhY2VfcmVsZWFzZTsKKwlkZXYtPmdldF9zdGF0cyA9IGludGVyZmFjZV9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGludGVyZmFjZV9zZXRfbWFjX2FkZHI7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaW50ZXJmYWNlX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpbnRlcmZhY2VfdHg7CisjZW5kaWYKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKworCWRldi0+bXR1ID0gaGFyZGlmX21pbl9tdHUoKTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEJBVF9IRUFERVJfTEVOOyAvKiByZXNlcnZlIG1vcmUgc3BhY2UgaW4gdGhlCisJCQkJCQkqIHNrYnVmZiBmb3Igb3VyIGhlYWRlciAqLworCisJLyogZ2VuZXJhdGUgcmFuZG9tIGFkZHJlc3MgKi8KKwlyYW5kb21fZXRoZXJfYWRkcihkZXZfYWRkcik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGRldl9hZGRyLCBzaXplb2YoZGV2LT5kZXZfYWRkcikpOworCisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmJhdF9ldGh0b29sX29wcyk7CisKKwltZW1zZXQocHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBiYXRfcHJpdikpOworfQorCitpbnQgaW50ZXJmYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitpbnQgaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppbnRlcmZhY2Vfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK2ludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJcmV0dXJuIC1FQlVTWTsKK30KKworaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCS8qIGNoZWNrIHJhbmdlcyAqLworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IGhhcmRpZl9taW5fbXR1KCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKworCXJldHVybiAwOworfQorCitpbnQgaW50ZXJmYWNlX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVuaWNhc3RfcGFja2V0ICp1bmljYXN0X3BhY2tldDsKKwlzdHJ1Y3QgYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7CisJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOworCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBiYXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGRhdGFfbGVuID0gc2tiLT5sZW47CisKKwlpZiAoYXRvbWljX3JlYWQoJm1vZHVsZV9zdGF0ZSkgIT0gTU9EVUxFX0FDVElWRSkKKwkJZ290byBkcm9wcGVkOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLyogVE9ETzogY2hlY2sgdGhpcyBmb3IgbG9ja3MgKi8KKwlobmFfbG9jYWxfYWRkKGV0aGhkci0+aF9zb3VyY2UpOworCisJLyogZXRoZXJuZXQgcGFja2V0IHNob3VsZCBiZSBicm9hZGNhc3RlZCAqLworCWlmIChpc19iY2FzdChldGhoZHItPmhfZGVzdCkgfHwgaXNfbWNhc3QoZXRoaGRyLT5oX2Rlc3QpKSB7CisKKwkJaWYgKG15X3NrYl9wdXNoKHNrYiwgc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKSA8IDApCisJCQlnb3RvIGRyb3BwZWQ7CisKKwkJYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7CisKKwkJYmNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisKKwkJLyogYmF0bWFuIHBhY2tldCB0eXBlOiBicm9hZGNhc3QgKi8KKwkJYmNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9CQ0FTVDsKKworCQkvKiBodyBhZGRyZXNzIG9mIGZpcnN0IGludGVyZmFjZSBpcyB0aGUgb3JpZyBtYWMgYmVjYXVzZSBvbmx5CisJCSAqIHRoaXMgbWFjIGlzIGtub3duIHRocm91Z2hvdXQgdGhlIG1lc2ggKi8KKwkJbWVtY3B5KGJjYXN0X3BhY2tldC0+b3JpZywgbWFpbklmQWRkciwgRVRIX0FMRU4pOworCQkvKiBzZXQgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlciAqLworCQliY2FzdF9wYWNrZXQtPnNlcW5vID0gaHRvbnMoYmNhc3Rfc2Vxbm8pOworCisJCWJjYXN0X3NlcW5vKys7CisKKwkJLyogYnJvYWRjYXN0IHBhY2tldCAqLworCQlhZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiB1bmljYXN0IHBhY2tldCAqLworCX0gZWxzZSB7CisKKwkJLyogc2ltcGx5IHNwaW5fbG9jaygpaW5nIGNhbiBkZWFkbG9jayB3aGVuIHRoZSBsb2NrIGlzIGFscmVhZHkKKwkJICogaG9sZC4gKi8KKwkJLyogVE9ETzogZGVmZXIgdGhlIHdvcmsgaW4gYSB3b3JraW5nIHF1ZXVlIGluc3RlYWQgb2YKKwkJICogZHJvcHBpbmcgKi8KKwkJaWYgKCFzcGluX3RyeWxvY2soJm9yaWdfaGFzaF9sb2NrKSkgeworCQkJbG9ja19kcm9wcGVkKys7CisJCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLCAiJWQgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2UgbG9jayB3YXMgaG9sZFxuIiwgbG9ja19kcm9wcGVkKTsKKwkJCWdvdG8gZHJvcHBlZDsKKwkJfQorCisJCS8qIGdldCByb3V0aW5nIGluZm9ybWF0aW9uICovCisJCW9yaWdfbm9kZSA9ICgoc3RydWN0IG9yaWdfbm9kZSAqKWhhc2hfZmluZChvcmlnX2hhc2gsCisJCQkJCQkJICAgZXRoaGRyLT5oX2Rlc3QpKTsKKworCQkvKiBjaGVjayBmb3IgaG5hIGhvc3QgKi8KKwkJaWYgKCFvcmlnX25vZGUpCisJCQlvcmlnX25vZGUgPSB0cmFuc3RhYmxlX3NlYXJjaChldGhoZHItPmhfZGVzdCk7CisKKwkJaWYgKChvcmlnX25vZGUpICYmCisJCSAgICAob3JpZ19ub2RlLT5iYXRtYW5faWYpICYmCisJCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIpKSB7CisJCQlpZiAobXlfc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSkgPCAwKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQl1bmljYXN0X3BhY2tldCA9IChzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQgKilza2ItPmRhdGE7CisKKwkJCXVuaWNhc3RfcGFja2V0LT52ZXJzaW9uID0gQ09NUEFUX1ZFUlNJT047CisJCQkvKiBiYXRtYW4gcGFja2V0IHR5cGU6IHVuaWNhc3QgKi8KKwkJCXVuaWNhc3RfcGFja2V0LT5wYWNrZXRfdHlwZSA9IEJBVF9VTklDQVNUOworCQkJLyogc2V0IHVuaWNhc3QgdHRsICovCisJCQl1bmljYXN0X3BhY2tldC0+dHRsID0gVFRMOworCQkJLyogY29weSB0aGUgZGVzdGluYXRpb24gZm9yIGZhc3RlciByb3V0aW5nICovCisJCQltZW1jcHkodW5pY2FzdF9wYWNrZXQtPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCisJCQkvKiBuZXRfZGV2IHdvbid0IGJlIGF2YWlsYWJsZSB3aGVuIG5vdCBhY3RpdmUgKi8KKwkJCWlmIChvcmlnX25vZGUtPmJhdG1hbl9pZi0+aWZfYWN0aXZlICE9IElGX0FDVElWRSkKKwkJCQlnb3RvIHVubG9jazsKKworCQkJc2VuZF9yYXdfcGFja2V0KHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJCW9yaWdfbm9kZS0+YmF0bWFuX2lmLAorCQkJCQlvcmlnX25vZGUtPnJvdXRlci0+YWRkcik7CisJCX0gZWxzZSB7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJfQorCisJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGRhdGFfbGVuOworCWdvdG8gZW5kOworCit1bmxvY2s6CisJc3Bpbl91bmxvY2soJm9yaWdfaGFzaF9sb2NrKTsKK2Ryb3BwZWQ6CisJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworZW5kOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCit2b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIGludCBwYWNrZXRfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGJhdF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbik7CisKKwlpZiAoIXNrYikgeworCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0X2xlbiksIHBhY2tldCwgcGFja2V0X2xlbik7CisKKwkvKiBXcml0ZSBtZXRhZGF0YSwgYW5kIHRoZW4gcGFzcyB0byB0aGUgcmVjZWl2ZSBsZXZlbCAqLworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXRfbGVuOworCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCW5ldGlmX3J4KHNrYik7CisKK291dDoKKwlyZXR1cm47Cit9CisKKy8qIGV0aHRvb2wgKi8KK3N0YXRpYyBpbnQgYmF0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwljbWQtPnN1cHBvcnRlZCA9IDA7CisJY21kLT5hZHZlcnRpc2luZyA9IDA7CisJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwljbWQtPnBoeV9hZGRyZXNzID0gMDsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmF0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiQi5BLlQuTS5BLk4uIGFkdmFuY2VkIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIFNPVVJDRV9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgImJhdG1hbiIpOworfQorCitzdGF0aWMgdTMyIGJhdF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyB2b2lkIGJhdF9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXJldHVybjsKK30KKworc3RhdGljIHUzMiBiYXRfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHUzMiBiYXRfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiYXRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1ZTI3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKK3ZvaWQgc2V0X21haW5faWZfYWRkcih1aW50OF90ICphZGRyKTsKK2ludCBtYWluX2lmX3dhc191cCh2b2lkKTsKK3ZvaWQgaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGludGVyZmFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGludGVyZmFjZV9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmludGVyZmFjZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBpbnRlcmZhY2Vfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworaW50IGludGVyZmFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK2ludCBpbnRlcmZhY2VfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGludGVyZmFjZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIGludCBwYWNrZXRfbGVuKTsKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbWFpbklmQWRkcltdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxOTBlMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKQEAgLTAsMCArMSw0NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBCLkEuVC5NLkEuTi4gY29udHJpYnV0b3JzOgorICoKKyAqIE1hcmVrIExpbmRuZXIsIFNpbW9uIFd1bmRlcmxpY2gKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RydWN0IGhhc2h0YWJsZV90ICpobmFfbG9jYWxfaGFzaDsKK3N0YXRpYyBzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhuYV9nbG9iYWxfaGFzaDsKK2F0b21pY190IGhuYV9sb2NhbF9jaGFuZ2VkOworCitERUZJTkVfU1BJTkxPQ0soaG5hX2xvY2FsX2hhc2hfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGhuYV9nbG9iYWxfaGFzaF9sb2NrKTsKKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKGhuYV9sb2NhbF9wdXJnZV93cSwgaG5hX2xvY2FsX3B1cmdlKTsKKworc3RhdGljIHZvaWQgaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKHZvaWQpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGJhdF9ldmVudF93b3JrcXVldWUsICZobmFfbG9jYWxfcHVyZ2Vfd3EsIDEwICogSFopOworfQorCitpbnQgaG5hX2xvY2FsX2luaXQodm9pZCkKK3sKKwlpZiAoaG5hX2xvY2FsX2hhc2gpCisJCXJldHVybiAxOworCisJaG5hX2xvY2FsX2hhc2ggPSBoYXNoX25ldygxMjgsIGNvbXBhcmVfb3JpZywgY2hvb3NlX29yaWcpOworCisJaWYgKCFobmFfbG9jYWxfaGFzaCkKKwkJcmV0dXJuIDA7CisKKwlhdG9taWNfc2V0KCZobmFfbG9jYWxfY2hhbmdlZCwgMCk7CisJaG5hX2xvY2FsX3N0YXJ0X3RpbWVyKCk7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCBobmFfbG9jYWxfYWRkKHVpbnQ4X3QgKmFkZHIpCit7CisJc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5OworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCXN0cnVjdCBoYXNodGFibGVfdCAqc3dhcGhhc2g7CisJY2hhciBobmFfc3RyW0VUSF9TVFJfTEVOXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlobmFfbG9jYWxfZW50cnkgPQorCQkoKHN0cnVjdCBobmFfbG9jYWxfZW50cnkgKiloYXNoX2ZpbmQoaG5hX2xvY2FsX2hhc2gsIGFkZHIpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlpZiAoaG5hX2xvY2FsX2VudHJ5ICE9IE5VTEwpIHsKKwkJaG5hX2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4gPSBqaWZmaWVzOworCQlyZXR1cm47CisJfQorCisJYWRkcl90b19zdHJpbmcoaG5hX3N0ciwgYWRkcik7CisKKwkvKiBvbmx5IGFubm91bmNlIGFzIG1hbnkgaG9zdHMgYXMgcG9zc2libGUgaW4gdGhlIGJhdG1hbi1wYWNrZXQgYW5kCisJICAgc3BhY2UgaW4gYmF0bWFuX3BhY2tldC0+bnVtX2huYSBUaGF0IGFsc28gc2hvdWxkIGdpdmUgYSBsaW1pdCB0bworCSAgIE1BQy1mbG9vZGluZy4gKi8KKwlpZiAoKG51bV9obmEgKyAxID4gKEVUSF9EQVRBX0xFTiAtIEJBVF9QQUNLRVRfTEVOKSAvIEVUSF9BTEVOKSB8fAorCSAgICAobnVtX2huYSArIDEgPiAyNTUpKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDYW4ndCBhZGQgbmV3IGxvY2FsIGhuYSBlbnRyeSAoJXMpOiBudW1iZXIgb2YgbG9jYWwgaG5hIGVudHJpZXMgZXhjZWVkcyBwYWNrZXQgc2l6ZSBcbiIsIGhuYV9zdHIpOworCQlyZXR1cm47CisJfQorCisJZGVidWdfbG9nKExPR19UWVBFX1JPVVRFUywgIkNyZWF0aW5nIG5ldyBsb2NhbCBobmEgZW50cnk6ICVzIFxuIiwKKwkJICBobmFfc3RyKTsKKworCWhuYV9sb2NhbF9lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBobmFfbG9jYWxfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWhuYV9sb2NhbF9lbnRyeSkKKwkJcmV0dXJuOworCisJbWVtY3B5KGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOworCWhuYV9sb2NhbF9lbnRyeS0+bGFzdF9zZWVuID0gamlmZmllczsKKworCS8qIHRoZSBiYXRtYW4gaW50ZXJmYWNlIG1hYyBhZGRyZXNzIHNob3VsZCBuZXZlciBiZSBwdXJnZWQgKi8KKwlpZiAoY29tcGFyZV9vcmlnKGFkZHIsIHNvZnRfZGV2aWNlLT5kZXZfYWRkcikpCisJCWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UgPSAxOworCWVsc2UKKwkJaG5hX2xvY2FsX2VudHJ5LT5uZXZlcl9wdXJnZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaGFzaF9hZGQoaG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeSk7CisJbnVtX2huYSsrOworCWF0b21pY19zZXQoJmhuYV9sb2NhbF9jaGFuZ2VkLCAxKTsKKworCWlmIChobmFfbG9jYWxfaGFzaC0+ZWxlbWVudHMgKiA0ID4gaG5hX2xvY2FsX2hhc2gtPnNpemUpIHsKKwkJc3dhcGhhc2ggPSBoYXNoX3Jlc2l6ZShobmFfbG9jYWxfaGFzaCwKKwkJCQkgICAgICAgaG5hX2xvY2FsX2hhc2gtPnNpemUgKiAyKTsKKworCQlpZiAoc3dhcGhhc2ggPT0gTlVMTCkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGRuJ3QgcmVzaXplIGxvY2FsIGhuYSBoYXNoIHRhYmxlIFxuIik7CisJCWVsc2UKKwkJCWhuYV9sb2NhbF9oYXNoID0gc3dhcGhhc2g7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBnbG9iYWwgaGFzaCBpZiBwcmVzZW50ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlobmFfZ2xvYmFsX2VudHJ5ID0KKwkJKChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGFkZHIpKTsKKworCWlmIChobmFfZ2xvYmFsX2VudHJ5ICE9IE5VTEwpCisJCV9obmFfZ2xvYmFsX2RlbF9vcmlnKGhuYV9nbG9iYWxfZW50cnksICJsb2NhbCBobmEgcmVjZWl2ZWQiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7Cit9CisKK2ludCBobmFfbG9jYWxfZmlsbF9idWZmZXIodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisKKwkJaWYgKGJ1ZmZfbGVuIDwgKGkgKyAxKSAqIEVUSF9BTEVOKQorCQkJYnJlYWs7CisKKwkJaG5hX2xvY2FsX2VudHJ5ID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCW1lbWNweShidWZmICsgKGkgKiBFVEhfQUxFTiksIGhuYV9sb2NhbF9lbnRyeS0+YWRkciwgRVRIX0FMRU4pOworCisJCWkrKzsKKwl9CisKKwkvKiBpZiB3ZSBkaWQgbm90IGdldCBhbGwgbmV3IGxvY2FsIGhuYXMgc2VlIHlvdSBuZXh0IHRpbWUgIDstKSAqLworCWlmIChpID09IG51bV9obmEpCisJCWF0b21pY19zZXQoJmhuYV9sb2NhbF9jaGFuZ2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpOworfQorCitpbnQgaG5hX2xvY2FsX2ZpbGxfYnVmZmVyX3RleHQodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCWludCBieXRlc193cml0dGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisKKwkJaWYgKGJ1ZmZfbGVuIDwgYnl0ZXNfd3JpdHRlbiArIEVUSF9TVFJfTEVOICsgNCkKKwkJCWJyZWFrOworCisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCWJ5dGVzX3dyaXR0ZW4gKz0gc25wcmludGYoYnVmZiArIGJ5dGVzX3dyaXR0ZW4sIEVUSF9TVFJfTEVOICsgNCwKKwkJCQkJICAiICogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzBdLAorCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkclsxXSwKKwkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbMl0sCisJCQkJCSAgaG5hX2xvY2FsX2VudHJ5LT5hZGRyWzNdLAorCQkJCQkgIGhuYV9sb2NhbF9lbnRyeS0+YWRkcls0XSwKKwkJCQkJICBobmFfbG9jYWxfZW50cnktPmFkZHJbNV0pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBieXRlc193cml0dGVuOworfQorCitzdGF0aWMgdm9pZCBfaG5hX2xvY2FsX2RlbCh2b2lkICpkYXRhKQoreworCWtmcmVlKGRhdGEpOworCW51bV9obmEtLTsKKwlhdG9taWNfc2V0KCZobmFfbG9jYWxfY2hhbmdlZCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGhuYV9sb2NhbF9kZWwoc3RydWN0IGhuYV9sb2NhbF9lbnRyeSAqaG5hX2xvY2FsX2VudHJ5LAorCQkJICBjaGFyICptZXNzYWdlKQoreworCWNoYXIgaG5hX3N0cltFVEhfU1RSX0xFTl07CisKKwlhZGRyX3RvX3N0cmluZyhobmFfc3RyLCBobmFfbG9jYWxfZW50cnktPmFkZHIpOworCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJEZWxldGluZyBsb2NhbCBobmEgZW50cnkgKCVzKTogJXMgXG4iLAorCQkgIGhuYV9zdHIsIG1lc3NhZ2UpOworCisJaGFzaF9yZW1vdmUoaG5hX2xvY2FsX2hhc2gsIGhuYV9sb2NhbF9lbnRyeS0+YWRkcik7CisJX2huYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5KTsKK30KKwordm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCXRpbWVvdXQgPSBobmFfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiArCisJCQkoKExPQ0FMX0hOQV9USU1FT1VUIC8gMTAwMCkgKiBIWik7CisJCWlmICgoIWhuYV9sb2NhbF9lbnRyeS0+bmV2ZXJfcHVyZ2UpICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJaG5hX2xvY2FsX2RlbChobmFfbG9jYWxfZW50cnksICJhZGRyZXNzIHRpbWVkIG91dCIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlobmFfbG9jYWxfc3RhcnRfdGltZXIoKTsKK30KKwordm9pZCBobmFfbG9jYWxfZnJlZSh2b2lkKQoreworCWlmICghaG5hX2xvY2FsX2hhc2gpCisJCXJldHVybjsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaG5hX2xvY2FsX3B1cmdlX3dxKTsKKwloYXNoX2RlbGV0ZShobmFfbG9jYWxfaGFzaCwgX2huYV9sb2NhbF9kZWwpOworCWhuYV9sb2NhbF9oYXNoID0gTlVMTDsKK30KKworaW50IGhuYV9nbG9iYWxfaW5pdCh2b2lkKQoreworCWlmIChobmFfZ2xvYmFsX2hhc2gpCisJCXJldHVybiAxOworCisJaG5hX2dsb2JhbF9oYXNoID0gaGFzaF9uZXcoMTI4LCBjb21wYXJlX29yaWcsIGNob29zZV9vcmlnKTsKKworCWlmICghaG5hX2dsb2JhbF9oYXNoKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCit2b2lkIGhuYV9nbG9iYWxfYWRkX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJIHVuc2lnbmVkIGNoYXIgKmhuYV9idWZmLCBpbnQgaG5hX2J1ZmZfbGVuKQoreworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCXN0cnVjdCBobmFfbG9jYWxfZW50cnkgKmhuYV9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaHRhYmxlX3QgKnN3YXBoYXNoOworCWNoYXIgaG5hX3N0cltFVEhfU1RSX0xFTl0sIG9yaWdfc3RyW0VUSF9TVFJfTEVOXTsKKwlpbnQgaG5hX2J1ZmZfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAqaG5hX3B0cjsKKworCWFkZHJfdG9fc3RyaW5nKG9yaWdfc3RyLCBvcmlnX25vZGUtPm9yaWcpOworCisJd2hpbGUgKChobmFfYnVmZl9jb3VudCArIDEpICogRVRIX0FMRU4gPD0gaG5hX2J1ZmZfbGVuKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJCWhuYV9wdHIgPSBobmFfYnVmZiArIChobmFfYnVmZl9jb3VudCAqIEVUSF9BTEVOKTsKKwkJaG5hX2dsb2JhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqKQorCQkJaGFzaF9maW5kKGhuYV9nbG9iYWxfaGFzaCwgaG5hX3B0cik7CisKKwkJaWYgKGhuYV9nbG9iYWxfZW50cnkgPT0gTlVMTCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQkJaG5hX2dsb2JhbF9lbnRyeSA9CisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkpLAorCQkJCQlHRlBfQVRPTUlDKTsKKworCQkJaWYgKCFobmFfZ2xvYmFsX2VudHJ5KQorCQkJCWJyZWFrOworCisJCQltZW1jcHkoaG5hX2dsb2JhbF9lbnRyeS0+YWRkciwgaG5hX3B0ciwgRVRIX0FMRU4pOworCisJCQlhZGRyX3RvX3N0cmluZyhobmFfc3RyLCBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyKTsKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9ST1VURVMsICJDcmVhdGluZyBuZXcgZ2xvYmFsIGhuYSBlbnRyeTogJXMgKHZpYSAlcylcbiIsIGhuYV9zdHIsIG9yaWdfc3RyKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJCQloYXNoX2FkZChobmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZW50cnkpOworCisJCX0KKworCQlobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPSBvcmlnX25vZGU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwkJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBsb2NhbCBoYXNoIGlmIHByZXNlbnQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQlobmFfcHRyID0gaG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7CisJCWhuYV9sb2NhbF9lbnRyeSA9IChzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICopCisJCQloYXNoX2ZpbmQoaG5hX2xvY2FsX2hhc2gsIGhuYV9wdHIpOworCisJCWlmIChobmFfbG9jYWxfZW50cnkgIT0gTlVMTCkKKwkJCWhuYV9sb2NhbF9kZWwoaG5hX2xvY2FsX2VudHJ5LCAiZ2xvYmFsIGhuYSByZWNlaXZlZCIpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9sb2NhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKworCQlobmFfYnVmZl9jb3VudCsrOworCX0KKworCW9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID0gaG5hX2J1ZmZfbGVuOworCisJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID4gMCkgeworCQlvcmlnX25vZGUtPmhuYV9idWZmID0ga21hbGxvYyhvcmlnX25vZGUtPmhuYV9idWZmX2xlbiwKKwkJCQkJICAgICAgR0ZQX0FUT01JQyk7CisJCW1lbWNweShvcmlnX25vZGUtPmhuYV9idWZmLCBobmFfYnVmZiwgb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pOworCX0gZWxzZSB7CisJCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaWYgKGhuYV9nbG9iYWxfaGFzaC0+ZWxlbWVudHMgKiA0ID4gaG5hX2dsb2JhbF9oYXNoLT5zaXplKSB7CisJCXN3YXBoYXNoID0gaGFzaF9yZXNpemUoaG5hX2dsb2JhbF9oYXNoLAorCQkJCSAgICAgICBobmFfZ2xvYmFsX2hhc2gtPnNpemUgKiAyKTsKKworCQlpZiAoc3dhcGhhc2ggPT0gTlVMTCkKKwkJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ291bGRuJ3QgcmVzaXplIGdsb2JhbCBobmEgaGFzaCB0YWJsZSBcbiIpOworCQllbHNlCisJCQlobmFfZ2xvYmFsX2hhc2ggPSBzd2FwaGFzaDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworfQorCitpbnQgaG5hX2dsb2JhbF9maWxsX2J1ZmZlcl90ZXh0KHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbikKK3sKKwlzdHJ1Y3QgaG5hX2dsb2JhbF9lbnRyeSAqaG5hX2dsb2JhbF9lbnRyeTsKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCWludCBieXRlc193cml0dGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKGhuYV9nbG9iYWxfaGFzaCwgaGFzaGl0KSkpIHsKKwkJaWYgKGJ1ZmZfbGVuIDwgYnl0ZXNfd3JpdHRlbiArICgyICogRVRIX1NUUl9MRU4pICsgMTApCisJCQlicmVhazsKKworCQlobmFfZ2xvYmFsX2VudHJ5ID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisKKwkJYnl0ZXNfd3JpdHRlbiArPSBzbnByaW50ZihidWZmICsgYnl0ZXNfd3JpdHRlbiwKKwkJCQkJICAoMiAqIEVUSF9TVFJfTEVOKSArIDEwLAorCQkJCQkgICIgKiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB2aWEgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbMF0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkclsxXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzJdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPmFkZHJbM10sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcls0XSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5hZGRyWzVdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1swXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbMV0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzJdLAorCQkJCQkgIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZ1szXSwKKwkJCQkJICBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPm9yaWdbNF0sCisJCQkJCSAgaG5hX2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnWzVdKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJ5dGVzX3dyaXR0ZW47Cit9CisKK3ZvaWQgX2huYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKmhuYV9nbG9iYWxfZW50cnksCisJCQkgIGNoYXIgKm1lc3NhZ2UpCit7CisJY2hhciBobmFfc3RyW0VUSF9TVFJfTEVOXSwgb3JpZ19zdHJbRVRIX1NUUl9MRU5dOworCisJYWRkcl90b19zdHJpbmcob3JpZ19zdHIsIGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZyk7CisJYWRkcl90b19zdHJpbmcoaG5hX3N0ciwgaG5hX2dsb2JhbF9lbnRyeS0+YWRkcik7CisKKwlkZWJ1Z19sb2coTE9HX1RZUEVfUk9VVEVTLCAiRGVsZXRpbmcgZ2xvYmFsIGhuYSBlbnRyeSAlcyAodmlhICVzKTogJXMgXG4iLCBobmFfc3RyLCBvcmlnX3N0ciwgbWVzc2FnZSk7CisKKwloYXNoX3JlbW92ZShobmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZW50cnktPmFkZHIpOworCWtmcmVlKGhuYV9nbG9iYWxfZW50cnkpOworfQorCit2b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKQoreworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCWludCBobmFfYnVmZl9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICpobmFfcHRyOworCisJaWYgKG9yaWdfbm9kZS0+aG5hX2J1ZmZfbGVuID09IDApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKChobmFfYnVmZl9jb3VudCArIDEpICogRVRIX0FMRU4gPD0gb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4pIHsKKwkJaG5hX3B0ciA9IG9yaWdfbm9kZS0+aG5hX2J1ZmYgKyAoaG5hX2J1ZmZfY291bnQgKiBFVEhfQUxFTik7CisJCWhuYV9nbG9iYWxfZW50cnkgPSAoc3RydWN0IGhuYV9nbG9iYWxfZW50cnkgKikKKwkJCWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGhuYV9wdHIpOworCisJCWlmICgoaG5hX2dsb2JhbF9lbnRyeSAhPSBOVUxMKSAmJgorCQkgICAgKGhuYV9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9PSBvcmlnX25vZGUpKQorCQkJX2huYV9nbG9iYWxfZGVsX29yaWcoaG5hX2dsb2JhbF9lbnRyeSwgbWVzc2FnZSk7CisKKwkJaG5hX2J1ZmZfY291bnQrKzsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfZ2xvYmFsX2hhc2hfbG9jaywgZmxhZ3MpOworCisJb3JpZ19ub2RlLT5obmFfYnVmZl9sZW4gPSAwOworCWtmcmVlKG9yaWdfbm9kZS0+aG5hX2J1ZmYpOworCW9yaWdfbm9kZS0+aG5hX2J1ZmYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBobmFfZ2xvYmFsX2RlbCh2b2lkICpkYXRhKQoreworCWtmcmVlKGRhdGEpOworfQorCit2b2lkIGhuYV9nbG9iYWxfZnJlZSh2b2lkKQoreworCWlmICghaG5hX2dsb2JhbF9oYXNoKQorCQlyZXR1cm47CisKKwloYXNoX2RlbGV0ZShobmFfZ2xvYmFsX2hhc2gsIGhuYV9nbG9iYWxfZGVsKTsKKwlobmFfZ2xvYmFsX2hhc2ggPSBOVUxMOworfQorCitzdHJ1Y3Qgb3JpZ19ub2RlICp0cmFuc3RhYmxlX3NlYXJjaCh1aW50OF90ICphZGRyKQoreworCXN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2dsb2JhbF9oYXNoX2xvY2ssIGZsYWdzKTsKKwlobmFfZ2xvYmFsX2VudHJ5ID0gKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICopCisJCWhhc2hfZmluZChobmFfZ2xvYmFsX2hhc2gsIGFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhuYV9nbG9iYWxfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlpZiAoaG5hX2dsb2JhbF9lbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBobmFfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RhODExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisKK2ludCBobmFfbG9jYWxfaW5pdCh2b2lkKTsKK3ZvaWQgaG5hX2xvY2FsX2FkZCh1aW50OF90ICphZGRyKTsKK2ludCBobmFfbG9jYWxfZmlsbF9idWZmZXIodW5zaWduZWQgY2hhciAqYnVmZiwgaW50IGJ1ZmZfbGVuKTsKK2ludCBobmFfbG9jYWxfZmlsbF9idWZmZXJfdGV4dCh1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgYnVmZl9sZW4pOwordm9pZCBobmFfbG9jYWxfcHVyZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgaG5hX2xvY2FsX2ZyZWUodm9pZCk7CitpbnQgaG5hX2dsb2JhbF9pbml0KHZvaWQpOwordm9pZCBobmFfZ2xvYmFsX2FkZF9vcmlnKHN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSwgdW5zaWduZWQgY2hhciAqaG5hX2J1ZmYsCisJCQkgaW50IGhuYV9idWZmX2xlbik7CitpbnQgaG5hX2dsb2JhbF9maWxsX2J1ZmZlcl90ZXh0KHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBidWZmX2xlbik7Cit2b2lkIF9obmFfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBobmFfZ2xvYmFsX2VudHJ5ICpobmFfZ2xvYmFsX2VudHJ5LAorCQkJICBjaGFyICpvcmlnX3N0cik7Cit2b2lkIGhuYV9nbG9iYWxfZGVsX29yaWcoc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjaGFyICptZXNzYWdlKTsKK3ZvaWQgaG5hX2dsb2JhbF9mcmVlKHZvaWQpOworc3RydWN0IG9yaWdfbm9kZSAqdHJhbnN0YWJsZV9zZWFyY2godWludDhfdCAqYWRkcik7CisKK2V4dGVybiBzcGlubG9ja190IGhuYV9sb2NhbF9oYXNoX2xvY2s7CitleHRlcm4gc3RydWN0IGhhc2h0YWJsZV90ICpobmFfbG9jYWxfaGFzaDsKK2V4dGVybiBhdG9taWNfdCBobmFfbG9jYWxfY2hhbmdlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGVmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi90eXBlcy5oCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgQi5BLlQuTS5BLk4uIGNvbnRyaWJ1dG9yczoKKyAqCisgKiBNYXJlayBMaW5kbmVyLCBTaW1vbiBXdW5kZXJsaWNoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqCisgKi8KKworCisKKworCisjaWZuZGVmIFRZUEVTX0gKKyNkZWZpbmUgVFlQRVNfSAorCisjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAiYml0YXJyYXkuaCIKKworI2RlZmluZSBCQVRfSEVBREVSX0xFTiAoc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgKChzaXplb2Yoc3RydWN0IHVuaWNhc3RfcGFja2V0KSA+IHNpemVvZihzdHJ1Y3QgYmNhc3RfcGFja2V0KSA/IHNpemVvZihzdHJ1Y3QgdW5pY2FzdF9wYWNrZXQpIDogc2l6ZW9mKHN0cnVjdCBiY2FzdF9wYWNrZXQpKSkpCisKKworc3RydWN0IGJhdG1hbl9pZiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludDE2X3QgaWZfbnVtOworCWNoYXIgKmRldjsKKwljaGFyIGlmX2FjdGl2ZTsKKwljaGFyIGFkZHJfc3RyW0VUSF9TVFJfTEVOXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3Qgc29ja2V0ICpyYXdfc29jazsKKwlhdG9taWNfdCBzZXFubzsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXRfYnVmZjsKKwlpbnQgcGFja2V0X2xlbjsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCit9OworCitzdHJ1Y3Qgb3JpZ19ub2RlIHsgICAgICAgICAgICAgICAvKiBzdHJ1Y3R1cmUgZm9yIG9yaWdfbGlzdCBtYWludGFpbmluZyBub2RlcyBvZiBtZXNoICovCisJdWludDhfdCBvcmlnW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRtYW5faWYgKmJhdG1hbl9pZjsKKwlUWVBFX09GX1dPUkQgKmJjYXN0X293bjsKKwl1aW50OF90ICpiY2FzdF9vd25fc3VtOworCXVpbnQ4X3QgdHFfb3duOworCWludCB0cV9hc3ltX3BlbmFsdHk7CisJdW5zaWduZWQgbG9uZyBsYXN0X3ZhbGlkOyAgICAgICAgLyogd2hlbiBsYXN0IHBhY2tldCBmcm9tIHRoaXMgbm9kZSB3YXMgcmVjZWl2ZWQgKi8KKy8qCXVpbnQ4X3QgIGd3ZmxhZ3M7ICAgICAgKiBmbGFncyByZWxhdGVkIHRvIGdhdGV3YXkgZnVuY3Rpb25zOiBnYXRld2F5IGNsYXNzICovCisJdWludDhfdCAgZmxhZ3M7ICAgIAkJLyogZm9yIG5vdyBvbmx5IFZJU19TRVJWRVIgZmxhZy4gKi8KKwl1bnNpZ25lZCBjaGFyICpobmFfYnVmZjsKKwlpbnQxNl90ICBobmFfYnVmZl9sZW47CisJdWludDE2X3QgbGFzdF9yZWFsX3NlcW5vOyAgIC8qIGxhc3QgYW5kIGJlc3Qga25vd24gc3F1ZW5jZSBudW1iZXIgKi8KKwl1aW50OF90IGxhc3RfdHRsOyAgICAgICAgIC8qIHR0bCBvZiBsYXN0IHJlY2VpdmVkIHBhY2tldCAqLworCVRZUEVfT0ZfV09SRCBiY2FzdF9iaXRzW05VTV9XT1JEU107CisJdWludDE2X3QgbGFzdF9iY2FzdF9zZXFubzsgIC8qIGxhc3QgYnJvYWRjYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCBieSB0aGlzIGhvc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG5laWdoX2xpc3Q7Cit9OworCitzdHJ1Y3QgbmVpZ2hfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07CisJdWludDhfdCByZWFsX3BhY2tldF9jb3VudDsKKwl1aW50OF90IHRxX3JlY3ZbVFFfR0xPQkFMX1dJTkRPV19TSVpFXTsKKwl1aW50OF90IHRxX2luZGV4OworCXVpbnQ4X3QgdHFfYXZnOworCXVpbnQ4X3QgbGFzdF90dGw7CisJdW5zaWduZWQgbG9uZyBsYXN0X3ZhbGlkOyAgICAgICAgICAgIC8qIHdoZW4gbGFzdCBwYWNrZXQgdmlhIHRoaXMgbmVpZ2hib3VyIHdhcyByZWNlaXZlZCAqLworCVRZUEVfT0ZfV09SRCByZWFsX2JpdHNbTlVNX1dPUkRTXTsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGJhdG1hbl9pZiAqaWZfaW5jb21pbmc7Cit9OworCitzdHJ1Y3QgYmF0X3ByaXYgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworc3RydWN0IGRldmljZV9jbGllbnQgeworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVfbGlzdDsKKwl1bnNpZ25lZCBpbnQgcXVldWVfbGVuOworCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJc3BpbmxvY2tfdCBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlX3dhaXQ7Cit9OworCitzdHJ1Y3QgZGV2aWNlX3BhY2tldCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpY21wX3BhY2tldCBpY21wX3BhY2tldDsKK307CisKK3N0cnVjdCBobmFfbG9jYWxfZW50cnkgeworCXVpbnQ4X3QgYWRkcltFVEhfQUxFTl07CisJdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47CisJY2hhciBuZXZlcl9wdXJnZTsKK307CisKK3N0cnVjdCBobmFfZ2xvYmFsX2VudHJ5IHsKKwl1aW50OF90IGFkZHJbRVRIX0FMRU5dOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKK307CisKK3N0cnVjdCBmb3J3X3BhY2tldCB7ICAgICAgICAgICAgICAgLyogc3RydWN0dXJlIGZvciBmb3J3X2xpc3QgbWFpbnRhaW5pbmcgcGFja2V0cyB0byBiZSBzZW5kL2ZvcndhcmRlZCAqLworCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBzZW5kX3RpbWU7CisJdWludDhfdCBvd247CisJdW5zaWduZWQgY2hhciAqcGFja2V0X2J1ZmY7CisJdWludDE2X3QgcGFja2V0X2xlbjsKKwl1aW50MzJfdCBkaXJlY3RfbGlua19mbGFnczsKKwl1aW50OF90IG51bV9wYWNrZXRzOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZGVsYXllZF93b3JrOworCXN0cnVjdCBiYXRtYW5faWYgKmlmX2luY29taW5nOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9iYXRtYW4tYWR2L3Zpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzlhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuYwpAQCAtMCwwICsxLDU2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAic2VuZC5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCisjaW5jbHVkZSAidmlzLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJjb21wYXQuaCIKKworc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKK0RFRklORV9TUElOTE9DSyh2aXNfaGFzaF9sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKm15X3Zpc19pbmZvOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc2VuZF9saXN0OwkvKiBhbHdheXMgbG9ja2VkIHdpdGggdmlzX2hhc2hfbG9jayAqLworCitzdGF0aWMgdm9pZCBzdGFydF92aXNfdGltZXIodm9pZCk7CisKKy8qIGZyZWUgdGhlIGluZm8gKi8KK3N0YXRpYyB2b2lkIGZyZWVfaW5mbyh2b2lkICpkYXRhKQoreworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbyA9IGRhdGE7CisJc3RydWN0IHJlY3ZsaXN0X25vZGUgKmVudHJ5LCAqdG1wOworCisJbGlzdF9kZWxfaW5pdCgmaW5mby0+c2VuZF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHRtcCwgJmluZm8tPnJlY3ZfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCQlrZnJlZShlbnRyeSk7CisJfQorCWtmcmVlKGluZm8pOworfQorCisvKiBzZXQgdGhlIG1vZGUgb2YgdGhlIHZpc3VhbGl6YXRpb24gdG8gY2xpZW50IG9yIHNlcnZlciAqLwordm9pZCB2aXNfc2V0X21vZGUoaW50IG1vZGUpCit7CisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKworCWlmIChteV92aXNfaW5mbyAhPSBOVUxMKQorCQlteV92aXNfaW5mby0+cGFja2V0LnZpc190eXBlID0gbW9kZTsKKworCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKK30KKworLyogaXNfdmlzX3NlcnZlcigpLCBsb2NrZWQgb3V0c2lkZSAqLworc3RhdGljIGludCBpc192aXNfc2VydmVyX2xvY2tlZCh2b2lkKQoreworCWlmIChteV92aXNfaW5mbyAhPSBOVUxMKQorCQlpZiAobXlfdmlzX2luZm8tPnBhY2tldC52aXNfdHlwZSA9PSBWSVNfVFlQRV9TRVJWRVJfU1lOQykKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdldCB0aGUgY3VycmVudCBzZXQgbW9kZSAqLworaW50IGlzX3Zpc19zZXJ2ZXIodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmdmlzX2hhc2hfbG9jayk7CisJcmV0ID0gaXNfdmlzX3NlcnZlcl9sb2NrZWQoKTsKKwlzcGluX3VubG9jaygmdmlzX2hhc2hfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb21wYXJlIHR3byB2aXMgcGFja2V0cywgdXNlZCBieSB0aGUgaGFzaGluZyBhbGdvcml0aG0gKi8KK3N0YXRpYyBpbnQgdmlzX2luZm9fY21wKHZvaWQgKmRhdGExLCB2b2lkICpkYXRhMikKK3sKKwlzdHJ1Y3QgdmlzX2luZm8gKmQxLCAqZDI7CisJZDEgPSBkYXRhMTsKKwlkMiA9IGRhdGEyOworCXJldHVybiBjb21wYXJlX29yaWcoZDEtPnBhY2tldC52aXNfb3JpZywgZDItPnBhY2tldC52aXNfb3JpZyk7Cit9CisKKy8qIGhhc2ggZnVuY3Rpb24gdG8gY2hvb3NlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSBvZiBnaXZlbiBzaXplICovCisvKiBoYXNoIGFsZ29yaXRobSBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFzaF90YWJsZSAqLworc3RhdGljIGludCB2aXNfaW5mb19jaG9vc2Uodm9pZCAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IHZpc19pbmZvICp2aXNfaW5mbyA9IGRhdGE7CisJdW5zaWduZWQgY2hhciAqa2V5OworCXVpbnQzMl90IGhhc2ggPSAwOworCXNpemVfdCBpOworCisJa2V5ID0gdmlzX2luZm8tPnBhY2tldC52aXNfb3JpZzsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQloYXNoICs9IGtleVtpXTsKKwkJaGFzaCArPSAoaGFzaCA8PCAxMCk7CisJCWhhc2ggXj0gKGhhc2ggPj4gNik7CisJfQorCisJaGFzaCArPSAoaGFzaCA8PCAzKTsKKwloYXNoIF49IChoYXNoID4+IDExKTsKKwloYXNoICs9IChoYXNoIDw8IDE1KTsKKworCXJldHVybiBoYXNoICUgc2l6ZTsKK30KKworLyogdHJpZXMgdG8gYWRkIG9uZSBlbnRyeSB0byB0aGUgcmVjZWl2ZSBsaXN0LiAqLworc3RhdGljIHZvaWQgcmVjdl9saXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpyZWN2X2xpc3QsIGNoYXIgKm1hYykKK3sKKwlzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSAqZW50cnk7CisJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCW1lbWNweShlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKTsKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgcmVjdl9saXN0KTsKK30KKworLyogcmV0dXJucyAxIGlmIHRoaXMgbWFjIGlzIGluIHRoZSByZWN2X2xpc3QgKi8KK3N0YXRpYyBpbnQgcmVjdl9saXN0X2lzX2luKHN0cnVjdCBsaXN0X2hlYWQgKnJlY3ZfbGlzdCwgY2hhciAqbWFjKQoreworCXN0cnVjdCByZWN2bGlzdF9ub2RlICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHJlY3ZfbGlzdCwgbGlzdCkgeworCQlpZiAobWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdHJ5IHRvIGFkZCB0aGUgcGFja2V0IHRvIHRoZSB2aXNfaGFzaC4gcmV0dXJuIE5VTEwgaWYgaW52YWxpZCAoZS5nLiB0b28gb2xkLAorICogYnJva2VuLi4gKS4gIHZpcyBoYXNoIG11c3QgYmUgbG9ja2VkIG91dHNpZGUuICBpc19uZXcgaXMgc2V0IHdoZW4gdGhlIHBhY2tldAorICogaXMgbmV3ZXIgdGhhbiBvbGQgZW50cmllcyBpbiB0aGUgaGFzaC4gKi8KK3N0YXRpYyBzdHJ1Y3QgdmlzX2luZm8gKmFkZF9wYWNrZXQoc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsCisJCQkJICAgaW50IHZpc19pbmZvX2xlbiwgaW50ICppc19uZXcpCit7CisJc3RydWN0IHZpc19pbmZvICppbmZvLCAqb2xkX2luZm87CisJc3RydWN0IHZpc19pbmZvIHNlYXJjaF9lbGVtOworCisJKmlzX25ldyA9IDA7CisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKHZpc19oYXNoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJLyogc2VlIGlmIHRoZSBwYWNrZXQgaXMgYWxyZWFkeSBpbiB2aXNfaGFzaCAqLworCW1lbWNweShzZWFyY2hfZWxlbS5wYWNrZXQudmlzX29yaWcsIHZpc19wYWNrZXQtPnZpc19vcmlnLCBFVEhfQUxFTik7CisJb2xkX2luZm8gPSBoYXNoX2ZpbmQodmlzX2hhc2gsICZzZWFyY2hfZWxlbSk7CisKKwlpZiAob2xkX2luZm8gIT0gTlVMTCkgeworCQlpZiAodmlzX3BhY2tldC0+c2Vxbm8gLSBvbGRfaW5mby0+cGFja2V0LnNlcW5vIDw9IDApIHsKKwkJCWlmIChvbGRfaW5mby0+cGFja2V0LnNlcW5vID09IHZpc19wYWNrZXQtPnNlcW5vKSB7CisJCQkJcmVjdl9saXN0X2FkZCgmb2xkX2luZm8tPnJlY3ZfbGlzdCwKKwkJCQkJICAgICAgdmlzX3BhY2tldC0+c2VuZGVyX29yaWcpOworCQkJCXJldHVybiBvbGRfaW5mbzsKKwkJCX0gZWxzZSB7CisJCQkJLyogbmV3ZXIgcGFja2V0IGlzIGFscmVhZHkgaW4gaGFzaC4gKi8KKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQkvKiByZW1vdmUgb2xkIGVudHJ5ICovCisJCWhhc2hfcmVtb3ZlKHZpc19oYXNoLCBvbGRfaW5mbyk7CisJCWZyZWVfaW5mbyhvbGRfaW5mbyk7CisJfQorCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbykgKyB2aXNfaW5mb19sZW4sIEdGUF9BVE9NSUMpOworCWlmIChpbmZvID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPnNlbmRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPnJlY3ZfbGlzdCk7CisJaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXM7CisJbWVtY3B5KCZpbmZvLT5wYWNrZXQsIHZpc19wYWNrZXQsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKyB2aXNfaW5mb19sZW4pOworCisJLyogaW5pdGlhbGl6ZSBhbmQgYWRkIG5ldyBwYWNrZXQuICovCisJKmlzX25ldyA9IDE7CisKKwkvKiByZXBhaXIgaWYgZW50cmllcyBpcyBsb25nZXIgdGhhbiBwYWNrZXQuICovCisJaWYgKGluZm8tPnBhY2tldC5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSkgPiB2aXNfaW5mb19sZW4pCisJCWluZm8tPnBhY2tldC5lbnRyaWVzID0gdmlzX2luZm9fbGVuIC8gc2l6ZW9mKHN0cnVjdCB2aXNfaW5mb19lbnRyeSk7CisKKwlyZWN2X2xpc3RfYWRkKCZpbmZvLT5yZWN2X2xpc3QsIGluZm8tPnBhY2tldC5zZW5kZXJfb3JpZyk7CisKKwkvKiB0cnkgdG8gYWRkIGl0ICovCisJaWYgKGhhc2hfYWRkKHZpc19oYXNoLCBpbmZvKSA8IDApIHsKKwkJLyogZGlkIG5vdCB3b3JrIChmb3Igc29tZSByZWFzb24pICovCisJCWZyZWVfaW5mbyhpbmZvKTsKKwkJaW5mbyA9IE5VTEw7CisJfQorCisJcmV0dXJuIGluZm87Cit9CisKKy8qIGhhbmRsZSB0aGUgc2VydmVyIHN5bmMgcGFja2V0LCBmb3J3YXJkIGlmIG5lZWRlZC4gKi8KK3ZvaWQgcmVjZWl2ZV9zZXJ2ZXJfc3luY19wYWNrZXQoc3RydWN0IHZpc19wYWNrZXQgKnZpc19wYWNrZXQsIGludCB2aXNfaW5mb19sZW4pCit7CisJc3RydWN0IHZpc19pbmZvICppbmZvOworCWludCBpc19uZXc7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCWluZm8gPSBhZGRfcGFja2V0KHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbiwgJmlzX25ldyk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJZ290byBlbmQ7CisKKwkvKiBvbmx5IGlmIHdlIGFyZSBzZXJ2ZXIgb3Vyc2VsdmVzIGFuZCBwYWNrZXQgaXMgbmV3ZXIgdGhhbiB0aGUgb25lIGluCisJICogaGFzaC4qLworCWlmIChpc192aXNfc2VydmVyX2xvY2tlZCgpICYmIGlzX25ldykgeworCQltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5zZW5kX2xpc3QpKQorCQkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c2VuZF9saXN0LCAmc2VuZF9saXN0KTsKKwl9CitlbmQ6CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworfQorCisvKiBoYW5kbGUgYW4gaW5jb21pbmcgY2xpZW50IHVwZGF0ZSBwYWNrZXQgYW5kIHNjaGVkdWxlIGZvcndhcmQgaWYgbmVlZGVkLiAqLwordm9pZCByZWNlaXZlX2NsaWVudF91cGRhdGVfcGFja2V0KHN0cnVjdCB2aXNfcGFja2V0ICp2aXNfcGFja2V0LAorCQkJCSAgaW50IHZpc19pbmZvX2xlbikKK3sKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm87CisJaW50IGlzX25ldzsKKworCS8qIGNsaWVudHMgc2hhbGwgbm90IGJyb2FkY2FzdC4gKi8KKwlpZiAoaXNfYmNhc3QodmlzX3BhY2tldC0+dGFyZ2V0X29yaWcpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCWluZm8gPSBhZGRfcGFja2V0KHZpc19wYWNrZXQsIHZpc19pbmZvX2xlbiwgJmlzX25ldyk7CisJaWYgKGluZm8gPT0gTlVMTCkKKwkJZ290byBlbmQ7CisJLyogbm90ZSB0aGF0IG91dGRhdGVkIHBhY2tldHMgd2lsbCBiZSBkcm9wcGVkIGF0IHRoaXMgcG9pbnQuICovCisKKworCS8qIHNlbmQgb25seSBpZiB3ZSdyZSB0aGUgdGFyZ2V0IHNlcnZlciBvciAuLi4gKi8KKwlpZiAoaXNfdmlzX3NlcnZlcl9sb2NrZWQoKSAmJgorCSAgICBpc19teV9tYWMoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnKSAmJgorCSAgICBpc19uZXcpIHsKKwkJaW5mby0+cGFja2V0LnZpc190eXBlID0gVklTX1RZUEVfU0VSVkVSX1NZTkM7CS8qIHVwZ3JhZGUhICovCisJCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIGJyb2FkY2FzdEFkZHIsIEVUSF9BTEVOKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmluZm8tPnNlbmRfbGlzdCkpCisJCQlsaXN0X2FkZF90YWlsKCZpbmZvLT5zZW5kX2xpc3QsICZzZW5kX2xpc3QpOworCisJCS8qIC4uLiB3ZSdyZSBub3QgdGhlIHJlY2lwaWVudCAoYW5kIHRodXMgbmVlZCB0byBmb3J3YXJkKS4gKi8KKwl9IGVsc2UgaWYgKCFpc19teV9tYWMoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnKSkgeworCQlpZiAobGlzdF9lbXB0eSgmaW5mby0+c2VuZF9saXN0KSkKKwkJCWxpc3RfYWRkX3RhaWwoJmluZm8tPnNlbmRfbGlzdCwgJnNlbmRfbGlzdCk7CisJfQorZW5kOgorCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKK30KKworLyogV2FsayB0aGUgb3JpZ2luYXRvcnMgYW5kIGZpbmQgdGhlIFZJUyBzZXJ2ZXIgd2l0aCB0aGUgYmVzdCB0cS4gU2V0IHRoZSBwYWNrZXQKKyAqIGFkZHJlc3MgdG8gaXRzIGFkZHJlc3MgYW5kIHJldHVybiB0aGUgYmVzdF90cS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBvcmlnaW5hdG9yIGhhc2ggbG9ja2VkICovCitzdGF0aWMgaW50IGZpbmRfYmVzdF92aXNfc2VydmVyKHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaGFzaF9pdF90ICpoYXNoaXQgPSBOVUxMOworCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlpbnQgYmVzdF90cSA9IC0xOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlpZiAoKG9yaWdfbm9kZSAhPSBOVUxMKSAmJgorCQkgICAgKG9yaWdfbm9kZS0+cm91dGVyICE9IE5VTEwpICYmCisJCSAgICAob3JpZ19ub2RlLT5mbGFncyAmIFZJU19TRVJWRVIpICYmCisJCSAgICAob3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA+IGJlc3RfdHEpKSB7CisJCQliZXN0X3RxID0gb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZzsKKwkJCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIG9yaWdfbm9kZS0+b3JpZywKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfdHE7Cit9CisKKy8qIFJldHVybiB0cnVlIGlmIHRoZSB2aXMgcGFja2V0IGlzIGZ1bGwuICovCitzdGF0aWMgYm9vbCB2aXNfcGFja2V0X2Z1bGwoc3RydWN0IHZpc19pbmZvICppbmZvKQoreworCWlmIChpbmZvLT5wYWNrZXQuZW50cmllcyArIDEgPgorCSAgICAoMTAwMCAtIHNpemVvZihzdHJ1Y3QgdmlzX2luZm8pKSAvIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIGdlbmVyYXRlcyBhIHBhY2tldCBvZiBvd24gdmlzIGRhdGEsCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgaWYgbm8gcGFja2V0IGNvdWxkIGJlIGdlbmVyYXRlZCAqLworc3RhdGljIGludCBnZW5lcmF0ZV92aXNfcGFja2V0KHZvaWQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IHZpc19pbmZvICppbmZvID0gKHN0cnVjdCB2aXNfaW5mbyAqKW15X3Zpc19pbmZvOworCXN0cnVjdCB2aXNfaW5mb19lbnRyeSAqZW50cnksICplbnRyeV9hcnJheTsKKwlzdHJ1Y3QgaG5hX2xvY2FsX2VudHJ5ICpobmFfbG9jYWxfZW50cnk7CisJaW50IGJlc3RfdHEgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXM7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwltZW1jcHkoaW5mby0+cGFja2V0LnRhcmdldF9vcmlnLCBicm9hZGNhc3RBZGRyLCBFVEhfQUxFTik7CisJaW5mby0+cGFja2V0LnR0bCA9IFRUTDsKKwlpbmZvLT5wYWNrZXQuc2Vxbm8rKzsKKwlpbmZvLT5wYWNrZXQuZW50cmllcyA9IDA7CisKKwlpZiAoIWlzX3Zpc19zZXJ2ZXJfbG9ja2VkKCkpIHsKKwkJYmVzdF90cSA9IGZpbmRfYmVzdF92aXNfc2VydmVyKGluZm8pOworCQlpZiAoYmVzdF90cSA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJaGFzaGl0ID0gTlVMTDsKKworCWVudHJ5X2FycmF5ID0gKHN0cnVjdCB2aXNfaW5mb19lbnRyeSAqKQorCQkoKGNoYXIgKilpbmZvICsgc2l6ZW9mKHN0cnVjdCB2aXNfaW5mbykpOworCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQlpZiAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTAorCQkJJiYgY29tcGFyZV9vcmlnKG9yaWdfbm9kZS0+cm91dGVyLT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpCisJCQkmJiBvcmlnX25vZGUtPmJhdG1hbl9pZgorCQkJJiYgKG9yaWdfbm9kZS0+YmF0bWFuX2lmLT5pZl9hY3RpdmUgPT0gSUZfQUNUSVZFKQorCQkgICAgJiYgb3JpZ19ub2RlLT5yb3V0ZXItPnRxX2F2ZyA+IDApIHsKKworCQkJLyogZmlsbCBvbmUgZW50cnkgaW50byBidWZmZXIuICovCisJCQllbnRyeSA9ICZlbnRyeV9hcnJheVtpbmZvLT5wYWNrZXQuZW50cmllc107CisJCQltZW1jcHkoZW50cnktPnNyYywgb3JpZ19ub2RlLT5iYXRtYW5faWYtPm5ldF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoZW50cnktPmRlc3QsIG9yaWdfbm9kZS0+b3JpZywgRVRIX0FMRU4pOworCQkJZW50cnktPnF1YWxpdHkgPSBvcmlnX25vZGUtPnJvdXRlci0+dHFfYXZnOworCQkJaW5mby0+cGFja2V0LmVudHJpZXMrKzsKKworCQkJaWYgKHZpc19wYWNrZXRfZnVsbChpbmZvKSkgeworCQkJCXNwaW5fdW5sb2NrKCZvcmlnX2hhc2hfbG9jayk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworCisJaGFzaGl0ID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaG5hX2xvY2FsX2hhc2hfbG9jaywgZmxhZ3MpOworCXdoaWxlIChOVUxMICE9IChoYXNoaXQgPSBoYXNoX2l0ZXJhdGUoaG5hX2xvY2FsX2hhc2gsIGhhc2hpdCkpKSB7CisJCWhuYV9sb2NhbF9lbnRyeSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCQllbnRyeSA9ICZlbnRyeV9hcnJheVtpbmZvLT5wYWNrZXQuZW50cmllc107CisJCW1lbXNldChlbnRyeS0+c3JjLCAwLCBFVEhfQUxFTik7CisJCW1lbWNweShlbnRyeS0+ZGVzdCwgaG5hX2xvY2FsX2VudHJ5LT5hZGRyLCBFVEhfQUxFTik7CisJCWVudHJ5LT5xdWFsaXR5ID0gMDsgLyogMCBtZWFucyBITkEgKi8KKwkJaW5mby0+cGFja2V0LmVudHJpZXMrKzsKKworCQlpZiAodmlzX3BhY2tldF9mdWxsKGluZm8pKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZobmFfbG9jYWxfaGFzaF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1cmdlX3Zpc19wYWNrZXRzKHZvaWQpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3QgdmlzX2luZm8gKmluZm87CisKKwl3aGlsZSAoTlVMTCAhPSAoaGFzaGl0ID0gaGFzaF9pdGVyYXRlKHZpc19oYXNoLCBoYXNoaXQpKSkgeworCQlpbmZvID0gaGFzaGl0LT5idWNrZXQtPmRhdGE7CisJCWlmIChpbmZvID09IG15X3Zpc19pbmZvKQkvKiBuZXZlciBwdXJnZSBvd24gZGF0YS4gKi8KKwkJCWNvbnRpbnVlOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkJICAgICAgIGluZm8tPmZpcnN0X3NlZW4gKyAoVklTX1RJTUVPVVQvMTAwMCkqSFopKSB7CisJCQloYXNoX3JlbW92ZV9idWNrZXQodmlzX2hhc2gsIGhhc2hpdCk7CisJCQlmcmVlX2luZm8oaW5mbyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJyb2FkY2FzdF92aXNfcGFja2V0KHN0cnVjdCB2aXNfaW5mbyAqaW5mbywgaW50IHBhY2tldF9sZW5ndGgpCit7CisJc3RydWN0IGhhc2hfaXRfdCAqaGFzaGl0ID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKworCS8qIHNlbmQgdG8gYWxsIHJvdXRlcnMgaW4gcmFuZ2UuICovCisJd2hpbGUgKE5VTEwgIT0gKGhhc2hpdCA9IGhhc2hfaXRlcmF0ZShvcmlnX2hhc2gsIGhhc2hpdCkpKSB7CisJCW9yaWdfbm9kZSA9IGhhc2hpdC0+YnVja2V0LT5kYXRhOworCisJCS8qIGlmIGl0J3MgYSB2aXMgc2VydmVyIGFuZCByZWFjaGFibGUsIHNlbmQgaXQuICovCisJCWlmIChvcmlnX25vZGUgJiYKKwkJICAgIChvcmlnX25vZGUtPmZsYWdzICYgVklTX1NFUlZFUikgJiYKKwkJICAgIG9yaWdfbm9kZS0+YmF0bWFuX2lmICYmCisJCSAgICBvcmlnX25vZGUtPnJvdXRlcikgeworCisJCQkvKiBkb24ndCBzZW5kIGl0IGlmIHdlIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHBhY2tldCBmcm9tCisJCQkgKiB0aGlzIG5vZGUuICovCisJCQlpZiAocmVjdl9saXN0X2lzX2luKCZpbmZvLT5yZWN2X2xpc3QsIG9yaWdfbm9kZS0+b3JpZykpCisJCQkJY29udGludWU7CisKKwkJCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsCisJCQkgICAgICAgb3JpZ19ub2RlLT5vcmlnLCBFVEhfQUxFTik7CisKKwkJCXNlbmRfcmF3X3BhY2tldCgodW5zaWduZWQgY2hhciAqKSAmaW5mby0+cGFja2V0LAorCQkJCQlwYWNrZXRfbGVuZ3RoLAorCQkJCQlvcmlnX25vZGUtPmJhdG1hbl9pZiwKKwkJCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCQl9CisJfQorCW1lbWNweShpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcsIGJyb2FkY2FzdEFkZHIsIEVUSF9BTEVOKTsKKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB1bmljYXN0X3Zpc19wYWNrZXQoc3RydWN0IHZpc19pbmZvICppbmZvLCBpbnQgcGFja2V0X2xlbmd0aCkKK3sKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CisKKwlzcGluX2xvY2soJm9yaWdfaGFzaF9sb2NrKTsKKwlvcmlnX25vZGUgPSAoKHN0cnVjdCBvcmlnX25vZGUgKikKKwkJICAgICBoYXNoX2ZpbmQob3JpZ19oYXNoLCBpbmZvLT5wYWNrZXQudGFyZ2V0X29yaWcpKTsKKworCWlmICgob3JpZ19ub2RlICE9IE5VTEwpICYmCisJICAgIChvcmlnX25vZGUtPmJhdG1hbl9pZiAhPSBOVUxMKSAmJgorCSAgICAob3JpZ19ub2RlLT5yb3V0ZXIgIT0gTlVMTCkpIHsKKwkJc2VuZF9yYXdfcGFja2V0KCh1bnNpZ25lZCBjaGFyICopICZpbmZvLT5wYWNrZXQsIHBhY2tldF9sZW5ndGgsCisJCQkJb3JpZ19ub2RlLT5iYXRtYW5faWYsCisJCQkJb3JpZ19ub2RlLT5yb3V0ZXItPmFkZHIpOworCX0KKwlzcGluX3VubG9jaygmb3JpZ19oYXNoX2xvY2spOworfQorCisvKiBvbmx5IHNlbmQgb25lIHZpcyBwYWNrZXQuIGNhbGxlZCBmcm9tIHNlbmRfdmlzX3BhY2tldHMoKSAqLworc3RhdGljIHZvaWQgc2VuZF92aXNfcGFja2V0KHN0cnVjdCB2aXNfaW5mbyAqaW5mbykKK3sKKwlpbnQgcGFja2V0X2xlbmd0aDsKKworCWlmIChpbmZvLT5wYWNrZXQudHRsIDwgMikgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfTk9USUNFLAorCQkJICAiRXJyb3IgLSBjYW4ndCBzZW5kIHZpcyBwYWNrZXQ6IHR0bCBleGNlZWRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1jcHkoaW5mby0+cGFja2V0LnNlbmRlcl9vcmlnLCBtYWluSWZBZGRyLCBFVEhfQUxFTik7CisJaW5mby0+cGFja2V0LnR0bC0tOworCisJcGFja2V0X2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdmlzX3BhY2tldCkgKworCQlpbmZvLT5wYWNrZXQuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmlzX2luZm9fZW50cnkpOworCisJaWYgKGlzX2JjYXN0KGluZm8tPnBhY2tldC50YXJnZXRfb3JpZykpCisJCWJyb2FkY2FzdF92aXNfcGFja2V0KGluZm8sIHBhY2tldF9sZW5ndGgpOworCWVsc2UKKwkJdW5pY2FzdF92aXNfcGFja2V0KGluZm8sIHBhY2tldF9sZW5ndGgpOworCWluZm8tPnBhY2tldC50dGwrKzsgLyogcmVzdG9yZSBUVEwgKi8KK30KKworLyogY2FsbGVkIGZyb20gdGltZXI7IHNlbmQgKGFuZCBtYXliZSBnZW5lcmF0ZSkgdmlzIHBhY2tldC4gKi8KK3N0YXRpYyB2b2lkIHNlbmRfdmlzX3BhY2tldHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2aXNfaW5mbyAqaW5mbywgKnRlbXA7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCXB1cmdlX3Zpc19wYWNrZXRzKCk7CisKKwlpZiAoZ2VuZXJhdGVfdmlzX3BhY2tldCgpID09IDApCisJCS8qIHNjaGVkdWxlIGlmIGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJbGlzdF9hZGRfdGFpbCgmbXlfdmlzX2luZm8tPnNlbmRfbGlzdCwgJnNlbmRfbGlzdCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW5mbywgdGVtcCwgJnNlbmRfbGlzdCwgc2VuZF9saXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmluZm8tPnNlbmRfbGlzdCk7CisJCXNlbmRfdmlzX3BhY2tldChpbmZvKTsKKwl9CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworCXN0YXJ0X3Zpc190aW1lcigpOworfQorc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHZpc190aW1lcl93cSwgc2VuZF92aXNfcGFja2V0cyk7CisKKy8qIGluaXQgdGhlIHZpcyBzZXJ2ZXIuIHRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gaWZfbGlzdCBpcyBhbHJlYWR5CisgKiBpbml0aWFsaXplZCAoZS5nLiBiYXQwIGlzIGluaXRpYWxpemVkLCBpbnRlcmZhY2VzIGhhdmUgYmVlbiBhZGRlZCkgKi8KK2ludCB2aXNfaW5pdCh2b2lkKQoreworCWlmICh2aXNfaGFzaCkKKwkJcmV0dXJuIDE7CisKKwlzcGluX2xvY2soJnZpc19oYXNoX2xvY2spOworCisJdmlzX2hhc2ggPSBoYXNoX25ldygyNTYsIHZpc19pbmZvX2NtcCwgdmlzX2luZm9fY2hvb3NlKTsKKwlpZiAoIXZpc19oYXNoKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ2FuJ3QgaW5pdGlhbGl6ZSB2aXNfaGFzaFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCW15X3Zpc19pbmZvID0ga21hbGxvYygxMDAwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW15X3Zpc19pbmZvKSB7CisJCWRlYnVnX2xvZyhMT0dfVFlQRV9DUklULCAiQ2FuJ3QgaW5pdGlhbGl6ZSB2aXMgcGFja2V0XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogcHJlZmlsbCB0aGUgdmlzIGluZm8gKi8KKwlteV92aXNfaW5mby0+Zmlyc3Rfc2VlbiA9IGppZmZpZXMgLSBhdG9taWNfcmVhZCgmdmlzX2ludGVydmFsKTsKKwlJTklUX0xJU1RfSEVBRCgmbXlfdmlzX2luZm8tPnJlY3ZfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm15X3Zpc19pbmZvLT5zZW5kX2xpc3QpOworCW15X3Zpc19pbmZvLT5wYWNrZXQudmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOworCW15X3Zpc19pbmZvLT5wYWNrZXQucGFja2V0X3R5cGUgPSBCQVRfVklTOworCW15X3Zpc19pbmZvLT5wYWNrZXQudmlzX3R5cGUgPSBWSVNfVFlQRV9DTElFTlRfVVBEQVRFOworCW15X3Zpc19pbmZvLT5wYWNrZXQudHRsID0gVFRMOworCW15X3Zpc19pbmZvLT5wYWNrZXQuc2Vxbm8gPSAwOworCW15X3Zpc19pbmZvLT5wYWNrZXQuZW50cmllcyA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmc2VuZF9saXN0KTsKKworCW1lbWNweShteV92aXNfaW5mby0+cGFja2V0LnZpc19vcmlnLCBtYWluSWZBZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KG15X3Zpc19pbmZvLT5wYWNrZXQuc2VuZGVyX29yaWcsIG1haW5JZkFkZHIsIEVUSF9BTEVOKTsKKworCWlmIChoYXNoX2FkZCh2aXNfaGFzaCwgbXlfdmlzX2luZm8pIDwgMCkgeworCQlkZWJ1Z19sb2coTE9HX1RZUEVfQ1JJVCwKKwkJCSAgIkNhbid0IGFkZCBvd24gdmlzIHBhY2tldCBpbnRvIGhhc2hcbiIpOworCQlmcmVlX2luZm8obXlfdmlzX2luZm8pOwkvKiBub3QgaW4gaGFzaCwgbmVlZCB0byByZW1vdmUgaXQKKwkJCQkJICogbWFudWFsbHkuICovCisJCWdvdG8gZXJyOworCX0KKworCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwlzdGFydF92aXNfdGltZXIoKTsKKwlyZXR1cm4gMTsKKworZXJyOgorCXNwaW5fdW5sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwl2aXNfcXVpdCgpOworCXJldHVybiAwOworfQorCisvKiBzaHV0ZG93biB2aXMtc2VydmVyICovCit2b2lkIHZpc19xdWl0KHZvaWQpCit7CisJaWYgKCF2aXNfaGFzaCkKKwkJcmV0dXJuOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ2aXNfdGltZXJfd3EpOworCisJc3Bpbl9sb2NrKCZ2aXNfaGFzaF9sb2NrKTsKKwkvKiBwcm9wZXJseSByZW1vdmUsIGtpbGwgdGltZXJzIC4uLiAqLworCWhhc2hfZGVsZXRlKHZpc19oYXNoLCBmcmVlX2luZm8pOworCXZpc19oYXNoID0gTlVMTDsKKwlteV92aXNfaW5mbyA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnZpc19oYXNoX2xvY2spOworfQorCisvKiBzY2hlZHVsZSBwYWNrZXRzIGZvciAocmUpdHJhbnNtaXNzaW9uICovCitzdGF0aWMgdm9pZCBzdGFydF92aXNfdGltZXIodm9pZCkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0X2V2ZW50X3dvcmtxdWV1ZSwgJnZpc190aW1lcl93cSwKKwkJCSAgIChhdG9taWNfcmVhZCgmdmlzX2ludGVydmFsKS8xMDAwKSAqIEhaKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmF0bWFuLWFkdi92aXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZmYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JhdG1hbi1hZHYvdmlzLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEIuQS5ULk0uQS5OLiBjb250cmlidXRvcnM6CisgKgorICogU2ltb24gV3VuZGVybGljaCwgTWFyZWsgTGluZG5lcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKgorICovCisKKyNkZWZpbmUgVklTX1RJTUVPVVQJCTIwMDAwMAorI2RlZmluZSBWSVNfRk9STUFUX0REX05BTUUJImRvdF9kcmF3IgorI2RlZmluZSBWSVNfRk9STUFUX0pTT05fTkFNRQkianNvbiIKKworc3RydWN0IHZpc19pbmZvIHsKKwl1bnNpZ25lZCBsb25nICAgICAgIGZpcnN0X3NlZW47CisJc3RydWN0IGxpc3RfaGVhZCAgICByZWN2X2xpc3Q7CisJCQkgICAgLyogbGlzdCBvZiBzZXJ2ZXItbmVpZ2hib3JzIHdlIHJlY2VpdmVkIGEgdmlzLXBhY2tldAorCQkJICAgICAqIGZyb20uICB3ZSBzaG91bGQgbm90IHJlcGx5IHRvIHRoZW0uICovCisJc3RydWN0IGxpc3RfaGVhZCBzZW5kX2xpc3Q7CisJLyogdGhpcyBwYWNrZXQgbWlnaHQgYmUgcGFydCBvZiB0aGUgdmlzIHNlbmQgcXVldWUuICovCisJc3RydWN0IHZpc19wYWNrZXQgcGFja2V0OworCS8qIHZpc19pbmZvIG1heSBmb2xsb3cgaGVyZSovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdmlzX2luZm9fZW50cnkgeworCXVpbnQ4X3QgIHNyY1tFVEhfQUxFTl07CisJdWludDhfdCAgZGVzdFtFVEhfQUxFTl07CisJdWludDhfdCAgcXVhbGl0eTsJLyogcXVhbGl0eSA9IDAgbWVhbnMgSE5BICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcmVjdmxpc3Rfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVpbnQ4X3QgbWFjW0VUSF9BTEVOXTsKK307CisKK2VudW0gdmlzX2Zvcm1hdHMgeworCURPVF9EUkFXLAorCUpTT04sCit9OworCitleHRlcm4gc3RydWN0IGhhc2h0YWJsZV90ICp2aXNfaGFzaDsKK2V4dGVybiBzcGlubG9ja190IHZpc19oYXNoX2xvY2s7CisKK3ZvaWQgdmlzX3NldF9tb2RlKGludCBtb2RlKTsKK2ludCBpc192aXNfc2VydmVyKHZvaWQpOwordm9pZCByZWNlaXZlX3NlcnZlcl9zeW5jX3BhY2tldChzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKKwkJCQlpbnQgdmlzX2luZm9fbGVuKTsKK3ZvaWQgcmVjZWl2ZV9jbGllbnRfdXBkYXRlX3BhY2tldChzdHJ1Y3QgdmlzX3BhY2tldCAqdmlzX3BhY2tldCwKKwkJCQkgIGludCB2aXNfaW5mb19sZW4pOworaW50IHZpc19pbml0KHZvaWQpOwordm9pZCB2aXNfcXVpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaS5oCmluZGV4IDk1N2I2NDAuLmNjYzVjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGkuaApAQCAtMjQsMTAgKzI0LDYgQEAKICNpZm5kZWYgX0NPTUVESV9ICiAjZGVmaW5lIF9DT01FRElfSAogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KICNkZWZpbmUgQ09NRURJX01BSk9SVkVSU0lPTgkwCiAjZGVmaW5lIENPTUVESV9NSU5PUlZFUlNJT04JNwogI2RlZmluZSBDT01FRElfTUlDUk9WRVJTSU9OCTc2CkBAIC04NzEsOCArODY3LDQgQEAKIAkJQU1QTENfRElPX0dBVF9SRVNFUlZFRDcKIAl9OwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCiAjZW5kaWYgLyogX0NPTUVESV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuYwppbmRleCA5ODEwZTM3Li5hOWZkY2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmMKQEAgLTI3LDE2ICsyNywxMiBAQAogI2RlZmluZSBfX05PX1ZFUlNJT05fXwogI2luY2x1ZGUgImNvbWVkaS5oIgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlICJjb21lZGlfY29tcGF0MzIuaCIKIAogI2lmZGVmIENPTkZJR19DT01QQVQKIAotI2lmbmRlZiBIQVZFX0NPTVBBVF9JT0NUTAotI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4JLyogZm9yICh1bilyZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24gKi8KLSNlbmRpZgotCiAjZGVmaW5lIENPTUVESTMyX0NIQU5JTkZPIF9JT1IoQ0lPLCAzLCBzdHJ1Y3QgY29tZWRpMzJfY2hhbmluZm9fc3RydWN0KQogI2RlZmluZSBDT01FREkzMl9SQU5HRUlORk8gX0lPUihDSU8sIDgsIHN0cnVjdCBjb21lZGkzMl9yYW5nZWluZm9fc3RydWN0KQogLyogTi5CLiBDT01FREkzMl9DTUQgYW5kIENPTUVESV9DTUQgb3VnaHQgdG8gdXNlIF9JT1dSLCBub3QgX0lPUi4KQEAgLTEwMSwyMiArOTcsOSBAQAogCWlmICghZmlsZS0+Zl9vcCkKIAkJcmV0dXJuIC1FTk9UVFk7CiAKLSNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCi0JaWYgKGZpbGUtPmZfb3AtPnVubG9ja2VkX2lvY3RsKSB7Ci0JCWludCByYyA9IChpbnQpKCpmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bCkgKGZpbGUsIGNtZCwgYXJnKTsKLQkJaWYgKHJjID09IC1FTk9JT0NUTENNRCkKLQkJCXJjID0gLUVOT1RUWTsKLQkJcmV0dXJuIHJjOwotCX0KLSNlbmRpZgotCWlmIChmaWxlLT5mX29wLT5pb2N0bCkgewotCQlpbnQgcmM7Ci0JCWxvY2tfa2VybmVsKCk7Ci0JCXJjID0gKCpmaWxlLT5mX29wLT5pb2N0bCkgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAotCQkJCQkgICBmaWxlLCBjbWQsIGFyZyk7Ci0JCXVubG9ja19rZXJuZWwoKTsKLQkJcmV0dXJuIHJjOwotCX0KKwlpZiAoZmlsZS0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpCisJCXJldHVybiBmaWxlLT5mX29wLT51bmxvY2tlZF9pb2N0bChmaWxlLCBjbWQsIGFyZyk7CisKIAlyZXR1cm4gLUVOT1RUWTsKIH0KIApAQCAtMTg2LDggKzE2OSw4IEBACiB9CiAKIC8qIENvcHkgMzItYml0IGNtZCBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGNtZCBzdHJ1Y3R1cmUuICovCi1zdGF0aWMgaW50IGdldF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqIGNtZCwKLQkJCSAgc3RydWN0IGNvbWVkaTMyX2NtZF9zdHJ1Y3QgX191c2VyICogY21kMzIpCitzdGF0aWMgaW50IGdldF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqY21kLAorCQkJICBzdHJ1Y3QgY29tZWRpMzJfY21kX3N0cnVjdCBfX3VzZXIgKmNtZDMyKQogewogCWludCBlcnI7CiAJdW5pb24gewpAQCAtMjM3LDggKzIyMCw4IEBACiB9CiAKIC8qIENvcHkgbmF0aXZlIGNtZCBzdHJ1Y3R1cmUgdG8gMzItYml0IGNtZCBzdHJ1Y3R1cmUuICovCi1zdGF0aWMgaW50IHB1dF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGkzMl9jbWRfc3RydWN0IF9fdXNlciAqIGNtZDMyLAotCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCBfX3VzZXIgKiBjbWQpCitzdGF0aWMgaW50IHB1dF9jb21wYXRfY21kKHN0cnVjdCBjb21lZGkzMl9jbWRfc3RydWN0IF9fdXNlciAqY21kMzIsCisJCQkgIHN0cnVjdCBjb21lZGlfY21kIF9fdXNlciAqY21kKQogewogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IHRlbXA7CkBAIC0zMjgsOCArMzExLDggQEAKIH0KIAogLyogQ29weSAzMi1iaXQgaW5zbiBzdHJ1Y3R1cmUgdG8gbmF0aXZlIGluc24gc3RydWN0dXJlLiAqLwotc3RhdGljIGludCBnZXRfY29tcGF0X2luc24oc3RydWN0IGNvbWVkaV9pbnNuIF9fdXNlciAqIGluc24sCi0JCQkgICBzdHJ1Y3QgY29tZWRpMzJfaW5zbl9zdHJ1Y3QgX191c2VyICogaW5zbjMyKQorc3RhdGljIGludCBnZXRfY29tcGF0X2luc24oc3RydWN0IGNvbWVkaV9pbnNuIF9fdXNlciAqaW5zbiwKKwkJCSAgIHN0cnVjdCBjb21lZGkzMl9pbnNuX3N0cnVjdCBfX3VzZXIgKmluc24zMikKIHsKIAlpbnQgZXJyOwogCXVuaW9uIHsKQEAgLTM3Miw5ICszNTUsOSBAQAogCWluc25saXN0MzIgPSBjb21wYXRfcHRyKGFyZyk7CiAKIAkvKiBHZXQgMzItYml0IGluc25saXN0IHN0cnVjdHVyZS4gICovCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGluc25saXN0MzIsIHNpemVvZigqaW5zbmxpc3QzMikpKSB7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGluc25saXN0MzIsIHNpemVvZigqaW5zbmxpc3QzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAllcnIgPSAwOwogCWVyciB8PSBfX2dldF91c2VyKG5faW5zbnMsICZpbnNubGlzdDMyLT5uX2luc25zKTsKIAllcnIgfD0gX19nZXRfdXNlcih1cHRyLCAmaW5zbmxpc3QzMi0+aW5zbnMpOwpAQCAtMzg3LDkgKzM3MCw5IEBACiAJCQkJCSAgICAgaW5zbltuX2luc25zXSkpOwogCiAJLyogU2V0IG5hdGl2ZSBpbnNubGlzdCBzdHJ1Y3R1cmUuICovCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAmcy0+aW5zbmxpc3QsIHNpemVvZihzLT5pbnNubGlzdCkpKSB7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAmcy0+aW5zbmxpc3QsIHNpemVvZihzLT5pbnNubGlzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAllcnIgfD0gX19wdXRfdXNlcihuX2luc25zLCAmcy0+aW5zbmxpc3Qubl9pbnNucyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoJnMtPmluc25bMF0sICZzLT5pbnNubGlzdC5pbnNucyk7CiAJaWYgKGVycikKQEAgLTQ3Miw4ICs0NTUsNiBAQAogCXJldHVybiByYzsKIH0KIAotI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCS8qIGRlZmluZWQgaW4gPGxpbnV4L2ZzLmg+IDIuNi4xMSBvbndhcmRzICovCi0KIC8qIGNvbXBhdF9pb2N0bCBmaWxlIG9wZXJhdGlvbi4gKi8KIC8qIFJldHVybnMgLUVOT0lPQ1RMQ01EIGZvciB1bnJlY29nbmlzZWQgaW9jdGwgY29kZXMuICovCiBsb25nIGNvbWVkaV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtNDgxLDEwNiArNDYyLDQgQEAKIAlyZXR1cm4gcmF3X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKIH0KIAotI2Vsc2UgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KLQotLyoKLSAqIEJyYWluLWRlYWQgaW9jdGwgY29tcGF0aWJpbGl0eSBmb3IgMi42LjEwIGFuZCBlYXJsaWVyLgotICoKLSAqIEl0J3MgYnJhaW4tZGVhZCBiZWNhdXNlIGNtZCBudW1iZXJzIG5lZWQgdG8gYmUgdW5pcXVlIHN5c3RlbS13aWRlIQotICogVGhlIGNvbWVkaSBkcml2ZXIgY291bGQgZW5kIHVwIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSBpb2N0bHMgZm9yIG5vbi1Db21lZGkKLSAqIGRldmljZXMgYmVjYXVzZSBpdCByZWdpc3RlcmVkIHRoZSBzeXN0ZW0td2lkZSBjbWQgY29kZSBmaXJzdC4gIFNpbWlsYXJseSwKLSAqIGFub3RoZXIgZHJpdmVyIGNvdWxkIGVuZCB1cCBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgaW9jdGxzIGZvciBhIENvbWVkaQotICogZGV2aWNlIGJlY2F1c2UgaXQgcmVnaXN0ZXJlZCB0aGUgY21kIGNvZGUgZmlyc3QuICBDaGFvcyBlbnN1ZXMuCi0gKi8KLQotLyogSGFuZGxlciBmb3IgYWxsIDMyLWJpdCBpb2N0bCBjb2RlcyByZWdpc3RlcmVkIGJ5IHRoaXMgZHJpdmVyLiAqLwotc3RhdGljIGludCBtYXBwZWRfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKLQkJCXN0cnVjdCBmaWxlICpmaWxlKQotewotCWludCByYzsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgQ29tZWRpIGRldmljZS4gKi8KLQlpZiAoaW1ham9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSAhPSBDT01FRElfTUFKT1IpCi0JCXJldHVybiAtRU5PVFRZOwotCi0JcmMgPSByYXdfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCS8qIERvIG5vdCByZXR1cm4gLUVOT0lPQ1RMQ01ELiAqLwotCWlmIChyYyA9PSAtRU5PSU9DVExDTUQpCi0JCXJjID0gLUVOT1RUWTsKLQotCXJldHVybiByYzsKLX0KLQotc3RydWN0IGlvY3RsMzJfbWFwIHsKLQl1bnNpZ25lZCBpbnQgY21kOwotCWludCAoKmhhbmRsZXIpICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZywKLQkJCXN0cnVjdCBmaWxlICopOwotCWludCByZWdpc3RlcmVkOwotfTsKLQotc3RhdGljIHN0cnVjdCBpb2N0bDMyX21hcCBjb21lZGlfaW9jdGwzMl9tYXBbXSA9IHsKLQl7Q09NRURJX0RFVkNPTkZJRywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0RFVklORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9TVUJESU5GTywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0JVRkNPTkZJRywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJX0JVRklORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESV9MT0NLLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfVU5MT0NLLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfQ0FOQ0VMLCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FRElfUE9MTCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfQ0hBTklORk8sIG1hcHBlZF9pb2N0bCwgMH0sCi0Je0NPTUVESTMyX1JBTkdFSU5GTywgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfQ01ELCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FREkzMl9DTURURVNULCBtYXBwZWRfaW9jdGwsIDB9LAotCXtDT01FREkzMl9JTlNOTElTVCwgbWFwcGVkX2lvY3RsLCAwfSwKLQl7Q09NRURJMzJfSU5TTiwgbWFwcGVkX2lvY3RsLCAwfSwKLX07Ci0KLSNkZWZpbmUgTlVNX0lPQ1RMMzJfTUFQUyBBUlJBWV9TSVpFKGNvbWVkaV9pb2N0bDMyX21hcCkKLQotLyogUmVnaXN0ZXIgc3lzdGVtLXdpZGUgMzItYml0IGlvY3RsIGhhbmRsZXJzLiAqLwotdm9pZCBjb21lZGlfcmVnaXN0ZXJfaW9jdGwzMih2b2lkKQotewotCWludCBuLCByYzsKLQotCWZvciAobiA9IDA7IG4gPCBOVU1fSU9DVEwzMl9NQVBTOyBuKyspIHsKLQkJcmMgPSByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24oY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCwKLQkJCQkJCSBjb21lZGlfaW9jdGwzMl9tYXBbbl0uaGFuZGxlcik7Ci0JCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJjb21lZGk6IGZhaWxlZCB0byByZWdpc3RlciAzMi1iaXQgIgotCQkJICAgICAgICJjb21wYXRpYmxlIGlvY3RsIGhhbmRsZXIgZm9yIDB4JVggLSAiCi0JCQkgICAgICAgImV4cGVjdCBiYWQgdGhpbmdzIHRvIGhhcHBlbiFcbiIsCi0JCQkgICAgICAgY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCk7Ci0JCX0KLQkJY29tZWRpX2lvY3RsMzJfbWFwW25dLnJlZ2lzdGVyZWQgPSAhcmM7Ci0JfQotfQotCi0vKiBVbnJlZ2lzdGVyIHN5c3RlbS13aWRlIDMyLWJpdCBpb2N0bCB0cmFuc2xhdGlvbnMuICovCi12b2lkIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIodm9pZCkKLXsKLQlpbnQgbiwgcmM7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgTlVNX0lPQ1RMMzJfTUFQUzsgbisrKSB7Ci0JCWlmIChjb21lZGlfaW9jdGwzMl9tYXBbbl0ucmVnaXN0ZXJlZCkgewotCQkJcmMgPSB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihjb21lZGlfaW9jdGwzMl9tYXAKLQkJCQkJCQkgICBbbl0uY21kLAotCQkJCQkJCSAgIGNvbWVkaV9pb2N0bDMyX21hcAotCQkJCQkJCSAgIFtuXS5oYW5kbGVyKTsKLQkJCWlmIChyYykgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiY29tZWRpOiBmYWlsZWQgdG8gdW5yZWdpc3RlciAzMi1iaXQgIgotCQkJCSAgICAgICAiY29tcGF0aWJsZSBpb2N0bCBoYW5kbGVyIGZvciAweCVYIC0gIgotCQkJCSAgICAgICAiZXhwZWN0IGtlcm5lbCBPb3BzIVxuIiwKLQkJCQkgICAgICAgY29tZWRpX2lvY3RsMzJfbWFwW25dLmNtZCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbWVkaV9pb2N0bDMyX21hcFtuXS5yZWdpc3RlcmVkID0gMDsKLQkJCX0KLQkJfQotCX0KLX0KLQotI2VuZGlmIC8qIEhBVkVfQ09NUEFUX0lPQ1RMICovCi0KICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfY29tcGF0MzIuaAppbmRleCBmZDBmOGEzLi4wMzQwYTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9jb21wYXQzMi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2NvbXBhdDMyLmgKQEAgLTI4LDMwICsyOCwxNiBAQAogI2RlZmluZSBfQ09NRURJX0NPTVBBVDMyX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CQkvKiBGb3IgSEFWRV9DT01QQVRfSU9DVEwgYW5kIEhBVkVfVU5MT0NLRURfSU9DVEwgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCi0jaWZkZWYgSEFWRV9DT01QQVRfSU9DVEwKLQogZXh0ZXJuIGxvbmcgY29tZWRpX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZyk7Ci0jZGVmaW5lIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKLQotI2Vsc2UgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KLQotI2RlZmluZSBjb21lZGlfY29tcGF0X2lvY3RsIDAJLyogTlVMTCAqLwotZXh0ZXJuIHZvaWQgY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIodm9pZCk7Ci1leHRlcm4gdm9pZCBjb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKHZvaWQpOwotCi0jZW5kaWYgLyogSEFWRV9DT01QQVRfSU9DVEwgKi8KIAogI2Vsc2UgLyogQ09ORklHX0NPTVBBVCAqLwogCiAjZGVmaW5lIGNvbWVkaV9jb21wYXRfaW9jdGwgMAkvKiBOVUxMICovCi0jZGVmaW5lIGNvbWVkaV9yZWdpc3Rlcl9pb2N0bDMyKCkgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGNvbWVkaV91bnJlZ2lzdGVyX2lvY3RsMzIoKSBkbyB7fSB3aGlsZSAoMCkKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCmluZGV4IGFhYWQ3NmUuLjgxMTc3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKQEAgLTExMCwxMyArMTEwLDggQEAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9tYXhfd3JpdGVfYnVmZmVyX2tiOwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3dyaXRlX2J1ZmZlcl9rYjsKIAotI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKIHN0YXRpYyBsb25nIGNvbWVkaV91bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotI2Vsc2UKLXN0YXRpYyBpbnQgY29tZWRpX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi0jZW5kaWYKIHsKIAljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAJc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KQEAgLTE4NjcsMTQgKzE4NjIsOCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbWVkaV9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAotI2lmZGVmIEhBVkVfVU5MT0NLRURfSU9DVEwKIAkudW5sb2NrZWRfaW9jdGwgPSBjb21lZGlfdW5sb2NrZWRfaW9jdGwsCi0jZWxzZQotCS5pb2N0bCA9IGNvbWVkaV9pb2N0bCwKLSNlbmRpZgotI2lmZGVmIEhBVkVfQ09NUEFUX0lPQ1RMCiAJLmNvbXBhdF9pb2N0bCA9IGNvbWVkaV9jb21wYXRfaW9jdGwsCi0jZW5kaWYKIAkub3BlbiA9IGNvbWVkaV9vcGVuLAogCS5yZWxlYXNlID0gY29tZWRpX2Nsb3NlLAogCS5yZWFkID0gY29tZWRpX3JlYWQsCkBAIC0xOTU5LDggKzE5NDgsNiBAQAogCQl9CiAJfQogCi0JY29tZWRpX3JlZ2lzdGVyX2lvY3RsMzIoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xOTc3LDggKzE5NjQsNiBAQAogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihDT01FRElfTUFKT1IsIDApLCBDT01FRElfTlVNX01JTk9SUyk7CiAKIAljb21lZGlfcHJvY19jbGVhbnVwKCk7Ci0KLQljb21lZGlfdW5yZWdpc3Rlcl9pb2N0bDMyKCk7CiB9CiAKIG1vZHVsZV9pbml0KGNvbWVkaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCmluZGV4IGU4YTVmN2QuLmViZGNjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaApAQCAtNDksNyArNDksOCBAQAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBDT01FRElfVkVSU0lPTihhLCBiLCBjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQotI2RlZmluZSBDT01FRElfVkVSU0lPTl9DT0RFIENPTUVESV9WRVJTSU9OKENPTUVESV9NQUpPUlZFUlNJT04sIENPTUVESV9NSU5PUlZFUlNJT04sIENPTUVESV9NSUNST1ZFUlNJT04pCisjZGVmaW5lIENPTUVESV9WRVJTSU9OX0NPREUgQ09NRURJX1ZFUlNJT04oQ09NRURJX01BSk9SVkVSU0lPTiwgXAorCUNPTUVESV9NSU5PUlZFUlNJT04sIENPTUVESV9NSUNST1ZFUlNJT04pCiAjZGVmaW5lIENPTUVESV9SRUxFQVNFIFZFUlNJT04KIAogI2RlZmluZSBDT01FRElfSU5JVENMRUFOVVBfTk9NT0RVTEUoeCkJCQkJCVwKQEAgLTU4LDEyICs1OSwxMiBAQAogCXN0YXRpYyB2b2lkIF9fZXhpdCB4ICMjIF9jbGVhbnVwX21vZHVsZSh2b2lkKQkJCVwKIAkJe2NvbWVkaV9kcml2ZXJfdW5yZWdpc3RlcigmKHgpKTsgfSAJCQlcCiAJbW9kdWxlX2luaXQoeCAjIyBfaW5pdF9tb2R1bGUpOwkJCQkJXAotCW1vZHVsZV9leGl0KHggIyMgX2NsZWFudXBfbW9kdWxlKTsJCQkJCVwKKwltb2R1bGVfZXhpdCh4ICMjIF9jbGVhbnVwX21vZHVsZSk7CiAKICNkZWZpbmUgQ09NRURJX01PRFVMRV9NQUNST1MJCQkJCQlcCiAJTU9EVUxFX0FVVEhPUigiQ29tZWRpIGh0dHA6Ly93d3cuY29tZWRpLm9yZyIpOwkJXAogCU1PRFVMRV9ERVNDUklQVElPTigiQ29tZWRpIGxvdy1sZXZlbCBkcml2ZXIiKTsJCQlcCi0JTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwkJCQkJCVwKKwlNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNkZWZpbmUgQ09NRURJX0lOSVRDTEVBTlVQKHgpCQkJCQkJXAogCUNPTUVESV9NT0RVTEVfTUFDUk9TCQlcCkBAIC03NSw3ICs3Niw4IEBACiAJeyBcCiAJCXJldHVybiBjb21lZGlfcGNpX2F1dG9fY29uZmlnKGRldiwgY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZSk7IFwKIAl9IFwKLQlzdGF0aWMgdm9pZCBfX2RldmV4aXQgY29tZWRpX2RyaXZlciAjIyBfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KSBcCisJc3RhdGljIHZvaWQgX19kZXZleGl0IGNvbWVkaV9kcml2ZXIgIyMgX3BjaV9yZW1vdmUoXAorCQlzdHJ1Y3QgcGNpX2RldiAqZGV2KSBcCiAJeyBcCiAJCWNvbWVkaV9wY2lfYXV0b191bmNvbmZpZyhkZXYpOyBcCiAJfSBcCkBAIC05MSw3ICs5Myw4IEBACiAJCXJldHZhbCA9IGNvbWVkaV9kcml2ZXJfcmVnaXN0ZXIoJmNvbWVkaV9kcml2ZXIpOyBcCiAJCWlmIChyZXR2YWwgPCAwKSBcCiAJCQlyZXR1cm4gcmV0dmFsOyBcCi0JCWNvbWVkaV9kcml2ZXIgIyMgX3BjaV9kcml2ZXIubmFtZSA9IChjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAorCQkJY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlci5uYW1lID0gXAorCQkJCShjaGFyICopY29tZWRpX2RyaXZlci5kcml2ZXJfbmFtZTsgXAogCQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY29tZWRpX2RyaXZlciAjIyBfcGNpX2RyaXZlcik7IFwKIAl9IFwKIAlzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpX2RyaXZlciAjIyBfY2xlYW51cF9tb2R1bGUodm9pZCkgXApAQCAtMTcwLDE0ICsxNzMsMTUgQEAKIAkJCSAgIHN0cnVjdCBjb21lZGlfY21kICopOwogCWludCAoKnBvbGwpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKIAlpbnQgKCpjYW5jZWwpIChzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsKLQkvKiBpbnQgKCpkb19sb2NrKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwotCS8qIGludCAoKmRvX3VubG9jaykoc3RydWN0IGNvbWVkaV9kZXZpY2UgKixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKwkvKiBpbnQgKCpkb19sb2NrKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqKTsgKi8KKwkvKiBpbnQgKCpkb191bmxvY2spKHN0cnVjdCBjb21lZGlfZGV2aWNlICosIFwKKwkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICopOyAqLwogCiAJLyogY2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBjaGFuZ2VzICovCi0JaW50ICgqYnVmX2NoYW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LAotCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiBzLCB1bnNpZ25lZCBsb25nIG5ld19zaXplKTsKKwlpbnQgKCpidWZfY2hhbmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCB1bnNpZ25lZCBsb25nIG5ld19zaXplKTsKIAotCXZvaWQgKCptdW5nZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqIHMsCisJdm9pZCAoKm11bmdlKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCSAgICAgICB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzLAogCQkgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NoYW5faW5kZXgpOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGFzeW5jX2RtYV9kaXI7CkBAIC0xOTgsMTYgKzIwMiwyMiBAQAogCiAJdm9pZCAqcHJlYWxsb2NfYnVmOwkvKiBwcmUtYWxsb2NhdGVkIGJ1ZmZlciAqLwogCXVuc2lnbmVkIGludCBwcmVhbGxvY19idWZzejsJLyogYnVmZmVyIHNpemUsIGluIGJ5dGVzICovCi0Jc3RydWN0IGNvbWVkaV9idWZfcGFnZSAqYnVmX3BhZ2VfbGlzdDsJLyogdmlydHVhbCBhbmQgZG1hIGFkZHJlc3Mgb2YgZWFjaCBwYWdlICovCisJLyogdmlydHVhbCBhbmQgZG1hIGFkZHJlc3Mgb2YgZWFjaCBwYWdlICovCisJc3RydWN0IGNvbWVkaV9idWZfcGFnZSAqYnVmX3BhZ2VfbGlzdDsKIAl1bnNpZ25lZCBuX2J1Zl9wYWdlczsJLyogbnVtIGVsZW1lbnRzIGluIGJ1Zl9wYWdlX2xpc3QgKi8KIAogCXVuc2lnbmVkIGludCBtYXhfYnVmc2l6ZTsJLyogbWF4aW11bSBidWZmZXIgc2l6ZSwgYnl0ZXMgKi8KLQl1bnNpZ25lZCBpbnQgbW1hcF9jb3VudDsJLyogY3VycmVudCBudW1iZXIgb2YgbW1hcHMgb2YgcHJlYWxsb2NfYnVmICovCisJLyogY3VycmVudCBudW1iZXIgb2YgbW1hcHMgb2YgcHJlYWxsb2NfYnVmICovCisJdW5zaWduZWQgaW50IG1tYXBfY291bnQ7CiAKLQl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKHdyaXRlIGNvbXBsZXRlZCkgKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKGFsbG9jYXRlZCBmb3Igd3JpdGluZykgKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfY291bnQ7CS8qIGJ5dGUgY291bnQgZm9yIHJlYWRlciAocmVhZCBjb21wbGV0ZWQpICovCi0JdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2FsbG9jX2NvdW50OwkvKiBieXRlIGNvdW50IGZvciByZWFkZXIgKGFsbG9jYXRlZCBmb3IgcmVhZGluZykgKi8KKwkvKiBieXRlIGNvdW50IGZvciB3cml0ZXIgKHdyaXRlIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3dyaXRlX2NvdW50OworCS8qIGJ5dGUgY291bnQgZm9yIHdyaXRlciAoYWxsb2NhdGVkIGZvciB3cml0aW5nKSAqLworCXVuc2lnbmVkIGludCBidWZfd3JpdGVfYWxsb2NfY291bnQ7CisJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChyZWFkIGNvbXBsZXRlZCkgKi8KKwl1bnNpZ25lZCBpbnQgYnVmX3JlYWRfY291bnQ7CisJLyogYnl0ZSBjb3VudCBmb3IgcmVhZGVyIChhbGxvY2F0ZWQgZm9yIHJlYWRpbmcpICovCisJdW5zaWduZWQgaW50IGJ1Zl9yZWFkX2FsbG9jX2NvdW50OwogCiAJdW5zaWduZWQgaW50IGJ1Zl93cml0ZV9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHdyaXRlciAqLwogCXVuc2lnbmVkIGludCBidWZfcmVhZF9wdHI7CS8qIGJ1ZmZlciBtYXJrZXIgZm9yIHJlYWRlciAqLwpAQCAtMjMzLDcgKzI0Myw3IEBACiAJaW50ICgqY2JfZnVuYykgKHVuc2lnbmVkIGludCBmbGFncywgdm9pZCAqKTsKIAl2b2lkICpjYl9hcmc7CiAKLQlpbnQgKCppbnR0cmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICogcywKKwlpbnQgKCppbnR0cmlnKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQl1bnNpZ25lZCBpbnQgeCk7CiB9OwogCkBAIC0yODMsOCArMjkzLDggQEAKIAogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICphc3luY19xdWV1ZTsKIAotCXZvaWQgKCpvcGVuKSAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKiBkZXYpOwotCXZvaWQgKCpjbG9zZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICogZGV2KTsKKwl2b2lkICgqb3BlbikgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOworCXZvaWQgKCpjbG9zZSkgKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwogfTsKIAogc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvIHsKQEAgLTMxOCw5ICszMjgsOCBAQAogCiBzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyh1bnNpZ25lZCBtaW5vcik7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKmNvbWVkaV9nZXRfcmVhZF9zdWJkZXZpY2UoY29uc3Qgc3RydWN0Ci0JCQkJCQkJCSBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbwotCQkJCQkJCQkgKmluZm8pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3JlYWRfc3ViZGV2aWNlKAorCWNvbnN0IHN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqaW5mbykKIHsKIAlpZiAoaW5mby0+cmVhZF9zdWJkZXZpY2UpCiAJCXJldHVybiBpbmZvLT5yZWFkX3N1YmRldmljZTsKQEAgLTMyOSw5ICszMzgsOCBAQAogCXJldHVybiBpbmZvLT5kZXZpY2UtPnJlYWRfc3ViZGV2OwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpjb21lZGlfZ2V0X3dyaXRlX3N1YmRldmljZShjb25zdCBzdHJ1Y3QKLQkJCQkJCQkJICBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbwotCQkJCQkJCQkgICppbmZvKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqY29tZWRpX2dldF93cml0ZV9zdWJkZXZpY2UoCisJY29uc3Qgc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICppbmZvKQogewogCWlmIChpbmZvLT53cml0ZV9zdWJkZXZpY2UpCiAJCXJldHVybiBpbmZvLT53cml0ZV9zdWJkZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCmluZGV4IGRjNTNhZWUuLmMyYTYzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHV2aXJ0X3RvX2t2YShwZ2RfdCAqIHBnZCwgdW5zaWduZWQgbG9uZyBhZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXZpcnRfdG9fa3ZhKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRyKQogewogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMFVMOwogCXBtZF90ICpwbWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaAppbmRleCBjMmVhMmQ5Li4wYmIzNWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjUzLmgKQEAgLTIwNiw3ICsyMDYsOCBAQAogCX0KIAogCSpuYW5vc2VjID0gZGl2MSAqIGRpdjIgKiBpODI1M19vc2NfYmFzZTsKLQkqZDEgPSBkaXYxICYgMHhmZmZmOwkvKiAgbWFza2luZyBpcyBkb25lIHNpbmNlIGNvdW50ZXIgbWFwcyB6ZXJvIHRvIDB4MTAwMDAgKi8KKwkvKiAgbWFza2luZyBpcyBkb25lIHNpbmNlIGNvdW50ZXIgbWFwcyB6ZXJvIHRvIDB4MTAwMDAgKi8KKwkqZDEgPSBkaXYxICYgMHhmZmZmOwogCSpkMiA9IGRpdjIgJiAweGZmZmY7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKaW5kZXggMGE1MDg2NC4uMTBmNDg4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NS5jCkBAIC0xMzIsNiArMTMyLDcgQEAKIAogCWNvbWVkaV9ldmVudChkZXYsIHMpOwogfQorRVhQT1JUX1NZTUJPTChzdWJkZXZfODI1NV9pbnRlcnJ1cHQpOwogCiBzdGF0aWMgaW50IHN1YmRldl84MjU1X2NiKGludCBkaXIsIGludCBwb3J0LCBpbnQgZGF0YSwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0xNzksMTUgKzE4MCwxNCBAQAogCXVuc2lnbmVkIGludCBiaXRzOwogCiAJbWFzayA9IDEgPDwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKG1hc2sgJiAweDAwMDBmZikgeworCWlmIChtYXNrICYgMHgwMDAwZmYpCiAJCWJpdHMgPSAweDAwMDBmZjsKLQl9IGVsc2UgaWYgKG1hc2sgJiAweDAwZmYwMCkgeworCWVsc2UgaWYgKG1hc2sgJiAweDAwZmYwMCkKIAkJYml0cyA9IDB4MDBmZjAwOwotCX0gZWxzZSBpZiAobWFzayAmIDB4MGYwMDAwKSB7CisJZWxzZSBpZiAobWFzayAmIDB4MGYwMDAwKQogCQliaXRzID0gMHgwZjAwMDA7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWJpdHMgPSAweGYwMDAwMDsKLQl9CiAKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKIAljYXNlIElOU05fQ09ORklHX0RJT19JTlBVVDoKQEAgLTMzMywxMSArMzMzLDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJQ0FMTEJBQ0tfQVJHID0gYXJnOwotCWlmIChjYiA9PSBOVUxMKSB7CisJaWYgKGNiID09IE5VTEwpCiAJCUNBTExCQUNLX0ZVTkMgPSBzdWJkZXZfODI1NV9jYjsKLQl9IGVsc2UgeworCWVsc2UKIAkJQ0FMTEJBQ0tfRlVOQyA9IGNiOwotCX0KIAlzLT5pbnNuX2JpdHMgPSBzdWJkZXZfODI1NV9pbnNuOwogCXMtPmluc25fY29uZmlnID0gc3ViZGV2XzgyNTVfaW5zbl9jb25maWc7CiAKQEAgLTM0Nyw2ICszNDYsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2luaXQpOwogCiBpbnQgc3ViZGV2XzgyNTVfaW5pdF9pcnEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgaW50ICgqY2IpIChpbnQsIGludCwgaW50LCB1bnNpZ25lZCBsb25nKSwKQEAgLTM2Niw2ICszNjYsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2luaXRfaXJxKTsKIAogdm9pZCBzdWJkZXZfODI1NV9jbGVhbnVwKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewpAQCAtMzc4LDYgKzM3OSw3IEBACiAJCWtmcmVlKHMtPnByaXZhdGUpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0woc3ViZGV2XzgyNTVfY2xlYW51cCk7CiAKIC8qCiAKQEAgLTQ0OCw4ICs0NTAsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLUVYUE9SVF9TWU1CT0woc3ViZGV2XzgyNTVfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2luaXRfaXJxKTsKLUVYUE9SVF9TWU1CT0woc3ViZGV2XzgyNTVfY2xlYW51cCk7Ci1FWFBPUlRfU1lNQk9MKHN1YmRldl84MjU1X2ludGVycnVwdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWNsNzIyNWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hY2w3MjI1Yi5jCmluZGV4IGMzNjUyZWYuLmUyMGMzNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hY2w3MjI1Yi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hY2w3MjI1Yi5jCkBAIC05NCwxMCArOTQsMTEgQEAKIAogCWlvYmFzZSA9IGl0LT5vcHRpb25zWzBdOwogCWlvcmFuZ2UgPSB0aGlzX2JvYXJkLT5pb19yYW5nZTsKLQlwcmludGsoImNvbWVkaSVkOiBhY2w3MjI1YjogYm9hcmQ9JXMgMHglMDR4ICIsIGRldi0+bWlub3IsCisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGFjbDcyMjViOiBib2FyZD0lcyAweCUwNHhcbiIsIGRldi0+bWlub3IsCiAJICAgICAgIHRoaXNfYm9hcmQtPm5hbWUsIGlvYmFzZSk7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIGlvcmFuZ2UsICJhY2w3MjI1YiIpKSB7Ci0JCXByaW50aygiSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiByZXF1ZXN0X3JlZ2lvbiBmYWlsZWQgLSBJL08gcG9ydCBjb25mbGljdFxuIiwKKwkJCWRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJZGV2LT5ib2FyZF9uYW1lID0gdGhpc19ib2FyZC0+bmFtZTsKQEAgLTEzNywxNCArMTM4LDEyIEBACiAJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKIAlzLT5wcml2YXRlID0gKHZvaWQgKilBQ0w3MjI1X0RJX0xPOwogCi0JcHJpbnRrKCJcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWNsNzIyNWJfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7Ci0JcHJpbnRrKCJjb21lZGklZDogYWNsNzIyNWI6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGFjbDcyMjViOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldi0+aW9iYXNlKQogCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmlvYmFzZSwgdGhpc19ib2FyZC0+aW9fcmFuZ2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9DaHJvbm8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfQ2hyb25vLmMKaW5kZXggY2NiMTA5YS4uMGFmMTJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9DaHJvbm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0Nocm9uby5jCkBAIC0xMzg2LDggKzEzODYsNyBAQAogCQkJCS8qIFRlc3QgdGhlIHRpbW91dCBwYXJhbWV0ZXIgKi8KIAkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkJCWlmICgodWlfVGltZU91dCA+PSAwKQotCQkJCQkmJiAodWlfVGltZU91dCA8PSA2NTUzNVVMKSkgeworCQkJCWlmICh1aV9UaW1lT3V0IDw9IDY1NTM1VUwpIHsKIAogCQkJCQlmb3IgKDs7KSB7CiAJCQkgIC8qKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9JTkNDUFQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfSU5DQ1BULmMKaW5kZXggNmMwOTJlZi4uYTE1Yzk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9JTkNDUFQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX0lOQ0NQVC5jCkBAIC0zODA3LDcgKzM4MDcsNyBAQAogCQkJc19Nb2R1bGVJbmZvW2JfTW9kdWxOYnJdLgogCQkJc19TaWVtZW5zQ291bnRlckluZm8uc19Jbml0RmxhZy5iX0NvdW50ZXJJbml0ID09IDEpIHsKIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkvKiBUZXN0IGlmIGZyZXF1ZW5jeSBtZXN1cmVtZW50IGluaXRpYWxpc2VkICovCisJCQkvKiBUZXN0IGlmIGZyZXF1ZW5jeSBtZWFzdXJlbWVudCBpbml0aWFsaXNlZCAqLwogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCQkJaWYgKGRldnByaXYtPgpAQCAtMzk1Myw3ICszOTUzLDcgQEAKIAkJCXNfTW9kdWxlSW5mb1tiX01vZHVsTmJyXS4KIAkJCXNfU2llbWVuc0NvdW50ZXJJbmZvLnNfSW5pdEZsYWcuYl9Db3VudGVySW5pdCA9PSAxKSB7CiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQkJLyogVGVzdCBpZiBmcmVxdWVuY3kgbWVzdXJlbWVudCBpbml0aWFsaXNlZCAqLworCQkJLyogVGVzdCBpZiBmcmVxdWVuY3kgbWVhc3VyZW1lbnQgaW5pdGlhbGlzZWQgKi8KIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCWlmIChkZXZwcml2LT4KQEAgLTUxNjYsNyArNTE2Niw3IEBACiAJCQlzX01vZHVsZUluZm9bYl9Nb2R1bE5icl0uCiAJCQlzX1NpZW1lbnNDb3VudGVySW5mby5zX0luaXRGbGFnLmJfQ291bnRlckluaXQgPT0gMSkgewogCSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCS8qIFRlc3QgaWYgZnJlcXVlbmN5IG1lc3VyZW1lbnQgaW5pdGlhbGlzZWQgKi8KKwkJCS8qIFRlc3QgaWYgZnJlcXVlbmN5IG1lYXN1cmVtZW50IGluaXRpYWxpc2VkICovCiAJICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJCQlpZiAoZGV2cHJpdi0+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9BUENJMTcxMF9Ub3IuYwppbmRleCA0MzE5OGFhLi43ZTEyNTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL0FQQ0kxNzEwX1Rvci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvQVBDSTE3MTBfVG9yLmMKQEAgLTE4MDgsNyArMTgwOCw3IEBACiAJCQkJCQkJCQkyKSB7CiAJCQkJCQkJCQlpZiAoZHdfU3RhdHVzICYgNCkgewogCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0JCQkJCQkJCQkJLyogVG9yIGNvdW50ZXIgb3dlcmZsb3cgKi8KKwkJCQkJCQkJCQkvKiBUb3IgY291bnRlciBvdmVyZmxvdyAqLwogCQkJCS8qKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAkJCQkJCQkJCQkqcGJfVG9yQ291bnRlclN0YXR1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9hZGRpX2NvbW1vbi5oCmluZGV4IGVkZDY1N2IuLjNhYjI3Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvYWRkaV9jb21tb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2FkZGlfY29tbW9uLmgKQEAgLTgyLDcgKzgyLDcgQEAKIAogCWludCBpX05ickRpQ2hhbm5lbDsJLyogIE51bWJlciBvZiBESSBjaGFubmVscyAqLwogCWludCBpX05ickRvQ2hhbm5lbDsJLyogIE51bWJlciBvZiBETyBjaGFubmVscyAqLwotCWludCBpX0RvTWF4ZGF0YTsJLyogIGRhdGEgdG8gc2V0IGFsbCBjaGFuZWxzIGhpZ2ggKi8KKwlpbnQgaV9Eb01heGRhdGE7CS8qICBkYXRhIHRvIHNldCBhbGwgY2hhbm5lbHMgaGlnaCAqLwogCiAJaW50IGlfTmJyVFRMQ2hhbm5lbDsJLyogIE51bWJlciBvZiBUVEwgY2hhbm5lbHMgKi8KIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcHJfVFRMUmFuZ2VsaXN0OwkvKiByYW5nZWxpc3QgZm9yIFRUTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTAzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTAzMi5jCmluZGV4IGU5MDIxY2QuLjcyM2E5N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTEwMzIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxMDMyLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXVuc2lnbmVkIGludCB1aV9UbXBWYWx1ZSA9IDA7CiAJdW5zaWduZWQgaW50IHVpX0NoYW5uZWw7CiAJdWlfQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmICh1aV9DaGFubmVsID49IDAgJiYgdWlfQ2hhbm5lbCA8PSAzMSkgeworCWlmICh1aV9DaGFubmVsIDw9IDMxKSB7CiAJCXVpX1RtcFZhbHVlID0gKHVuc2lnbmVkIGludCkgaW5sKGRldnByaXYtPmlvYmFzZSArIEFQQ0kxMDMyX0RJR0lUQUxfSVApOwogLyoKICogc2luY2Ugb25seSAxIGNoYW5uZWwgcmVxZCB0byBicmluZyBpdCB0byBsYXN0IGJpdCBpdCBpcyByb3RhdGVkIDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MDAuYwppbmRleCAyMzZiOGEzLi4zNmI5MjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUwMC5jCkBAIC05NjgsNyArOTY4LDcgQEAKIAogCXN3aXRjaCAoZGF0YVswXSkgewogCWNhc2UgMDoKLQkJaWYgKHVpX0NoYW5uZWwgPj0gMCAmJiB1aV9DaGFubmVsIDw9IDE1KSB7CisJCWlmICh1aV9DaGFubmVsIDw9IDE1KSB7CiAJCQl1aV9UbXBWYWx1ZSA9CiAJCQkJKHVuc2lnbmVkIGludCkgaW53KGRldnByaXYtPmlfSW9iYXNlQWRkb24gKwogCQkJCUFQQ0kxNTAwX0RJR0lUQUxfSVApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTUxNi5jCmluZGV4IDM4NDE2MzUuLjg2NmViOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1MTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTE2LmMKQEAgLTc5LDcgKzc5LDcgQEAKIAl1bnNpZ25lZCBpbnQgdWlfVG1wVmFsdWUgPSAwOwogCXVuc2lnbmVkIGludCB1aV9DaGFubmVsOwogCXVpX0NoYW5uZWwgPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKLQlpZiAodWlfQ2hhbm5lbCA+PSAwICYmIHVpX0NoYW5uZWwgPD0gNykgeworCWlmICh1aV9DaGFubmVsIDw9IDcpIHsKIAkJdWlfVG1wVmFsdWUgPSAodW5zaWduZWQgaW50KSBpbncoZGV2cHJpdi0+aW9iYXNlICsgQVBDSTE1MTZfRElHSVRBTF9JUCk7CiAJCS8qICAgc2luY2Ugb25seSAxIGNoYW5uZWwgcmVxZCAgdG8gYnJpbmcgaXQgdG8gbGFzdCBiaXQgaXQgaXMgcm90YXRlZCAqLwogCQkvKiAgIDggKyhjaGFuIC0gMSkgdGltZXMgdGhlbiBBTkRlZCB3aXRoIDEgZm9yIGxhc3QgYml0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMTU2NC5jCmluZGV4IDNhNDdjMzAuLjNhZTY2M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTE1NjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kxNTY0LmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCXVuc2lnbmVkIGludCB1aV9DaGFubmVsOwogCiAJdWlfQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmICh1aV9DaGFubmVsID49IDAgJiYgdWlfQ2hhbm5lbCA8PSAzMSkgeworCWlmICh1aV9DaGFubmVsIDw9IDMxKSB7CiAJCXVpX1RtcFZhbHVlID0KIAkJCSh1bnNpZ25lZCBpbnQpIGlubChkZXZwcml2LT5pX0lvYmFzZUFtY2MgKyBBUENJMTU2NF9ESUdJVEFMX0lQKTsKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMDE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMDE2LmMKaW5kZXggNDU3OTE3Zi4uZDM0OGNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjAxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIwMTYuYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJdW5zaWduZWQgaW50IHVpX05vT2ZDaGFubmVsOwogCXVuc2lnbmVkIGludCB1aV9UZW1wLCB1aV9UZW1wMTsKIAl1aV9Ob09mQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmICgodWlfTm9PZkNoYW5uZWwgPCAwKSB8fCAodWlfTm9PZkNoYW5uZWwgPiAxNSkpIHsKKwlpZiAodWlfTm9PZkNoYW5uZWwgPiAxNSkgewogCQljb21lZGlfZXJyb3IoZGV2LAogCQkJIkludmFsaWQgQ2hhbm5lbCBOdW1iZXJzICEhISwgQ2hhbm5lbCBOdW1iZXJzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJdW5zaWduZWQgaW50IHVpX1RlbXA7CiAJdW5zaWduZWQgaW50IHVpX05vT2ZDaGFubmVsOwogCXVpX05vT2ZDaGFubmVsID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaWYgKCh1aV9Ob09mQ2hhbm5lbCA8IDApIHx8ICh1aV9Ob09mQ2hhbm5lbCA+IDE1KSkgeworCWlmICh1aV9Ob09mQ2hhbm5lbCA+IDE1KSB7CiAJCWNvbWVkaV9lcnJvcihkZXYsCiAJCQkiSW52YWxpZCBDaGFubmVsIE51bWJlcnMgISEhLCBDaGFubmVsIE51bWJlcnMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDE1XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kyMjAwLmMKaW5kZXggYTg1M2M2Mi4uYWExNTlkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMjIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTIyMDAuYwpAQCAtNzksNyArNzksNyBAQAogCXVuc2lnbmVkIGludCB1aV9UbXBWYWx1ZSA9IDA7CiAJdW5zaWduZWQgaW50IHVpX0NoYW5uZWw7CiAJdWlfQ2hhbm5lbCA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmICh1aV9DaGFubmVsID49IDAgJiYgdWlfQ2hhbm5lbCA8PSA3KSB7CisJaWYgKHVpX0NoYW5uZWwgPD0gNykgewogCQl1aV9UbXBWYWx1ZSA9ICh1bnNpZ25lZCBpbnQpIGludyhkZXZwcml2LT5pb2Jhc2UgKyBBUENJMjIwMF9ESUdJVEFMX0lQKTsKIAkJKmRhdGEgPSAodWlfVG1wVmFsdWUgPj4gdWlfQ2hhbm5lbCkgJiAweDE7CiAJfQkJCS8qIGlmKHVpX0NoYW5uZWwgPj0gMCAmJiB1aV9DaGFubmVsIDw9NykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMxMjAuYwppbmRleCAxNjljZWU0Li4xNzJmYmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMTIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzEyMC5jCkBAIC0xNDY4LDcgKzE0NjgsNyBAQAogCWludF9hbWNjID0gaW5sKGRldnByaXYtPmlfSW9iYXNlQW1jYyArIEFNQ0NfT1BfUkVHX0lOVENTUik7CS8qICBnZXQgQU1DQyBpbnQgcmVnaXN0ZXIgKi8KIAogCWlmICgoIWludF9kYXEpICYmICghKGludF9hbWNjICYgQU5ZX1M1OTNYX0lOVCkpKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3cgc291cmNlIik7CisJCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZSIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMzUwLDcgKzIzNTAsNyBAQAogCXVpX0NoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsJLyogIGNoYW5uZWwgc3BlY2lmaWVkICovCiAKIAkvKiB0aGlzX2JvYXJkLT5pX2h3ZHJ2X0luc25SZWFkRGlnaXRhbElucHV0KGRldix1aV9DaGFuLGRhdGEpOyAqLwotCWlmICh1aV9DaGFuID49IDAgJiYgdWlfQ2hhbiA8PSAzKSB7CisJaWYgKHVpX0NoYW4gPD0gMykgewogCQl1aV9UbXBWYWx1ZSA9ICh1bnNpZ25lZCBpbnQpIGludyhkZXZwcml2LT5pb2Jhc2UgKyBBUENJMzEyMF9SRF9TVEFUVVMpOwogCiAvKgpAQCAtMjUzOSw4ICsyNTM5LDcgQEAKIAkJCSJOb3QgYSB2YWxpZCBEYXRhICEhISAsRGF0YSBzaG91bGQgYmUgMSBvciAwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmICgodWlfTm9PZkNoYW5uZWwgPiAodGhpc19ib2FyZC0+aV9OYnJEb0NoYW5uZWwgLSAxKSkKLQkJfHwgKHVpX05vT2ZDaGFubmVsIDwgMCkpIHsKKwlpZiAodWlfTm9PZkNoYW5uZWwgPiB0aGlzX2JvYXJkLT5pX05ickRvQ2hhbm5lbCAtIDEpIHsKIAkJY29tZWRpX2Vycm9yKGRldiwKIAkJCSJUaGlzIGJvYXJkIGRvZXNuJ3QgaGF2ZSBzcGVjaWZpZWQgY2hhbm5lbCAhISEgXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzMjAwLmMKaW5kZXggMDEwNjk3Zi4uOThjMjM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzIwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTMyMDAuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJaWYgKHNfQm9hcmRJbmZvc1tkZXYtPm1pbm9yXS5pX0Nvbm5lY3Rpb25UeXBlID09IDEpIHsKIAkJLyogaWYgZGlmZiAqLwogCi0JCWlmICgodWlfQ2hhbm5lbF9udW0gPj0gMCkgJiYgKHVpX0NoYW5uZWxfbnVtIDw9IDEpKQorCQlpZiAodWlfQ2hhbm5lbF9udW0gPD0gMSkKIAkJCWlfRGlmZkNoYW5uZWwgPSB1aV9DaGFubmVsX251bSwgaV9Nb2R1bGUgPSAwOwogCQllbHNlIGlmICgodWlfQ2hhbm5lbF9udW0gPj0gMikgJiYgKHVpX0NoYW5uZWxfbnVtIDw9IDMpKQogCQkJaV9EaWZmQ2hhbm5lbCA9IHVpX0NoYW5uZWxfbnVtIC0gMiwgaV9Nb2R1bGUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCmluZGV4IGVmMjFmMDMuLjdiMzhkMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKQEAgLTcyNCw3ICs3MjQsNyBAQAogCQlBUENJMzUwMV9UQ1dfSVJRKSAmIDB4MTsKIAogCWlmICgoIXVpX1RpbWVyX0FPV2F0Y2hkb2cpKSB7Ci0JCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3cgc291cmNlIik7CisJCWNvbWVkaV9lcnJvcihkZXYsICJJUlEgZnJvbSB1bmtub3duIHNvdXJjZSIpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzeHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzeHh4LmMKaW5kZXggMzM4NzI3OC4uMWQxZTVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpM3h4eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpLWRhdGEvaHdkcnZfYXBjaTN4eHguYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCQkvKiBUZXN0IHRoZSBjb252ZXJ0IHRpbWUgdmFsdWUgKi8KIAkgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkJaWYgKChkd19SZWxvYWRWYWx1ZSA+PSAwKSAmJiAoZHdfUmVsb2FkVmFsdWUgPD0gNjU1MzUpKSB7CisJCQlpZiAoZHdfUmVsb2FkVmFsdWUgPD0gNjU1MzUpIHsKIAkJCQlkd19UZXN0UmVsb2FkVmFsdWUgPSBkd19SZWxvYWRWYWx1ZTsKIAogCQkJCWlmIChiX1RpbWVCYXNlID09IDEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNjIwOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMKaW5kZXggOGUxYmVmYy4uNjkyNWZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMKQEAgLTEzMyw5ICsxMzMsMTEgQEAKIHN0YXRpYyBpbnQgcGNpNjIwOF9hb19yaW5zbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKTsKLS8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCisvKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fYml0cyAoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKyAqIAkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCiAvKiBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKTsgKi8KLS8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KKy8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKyAqIAkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCiAvKiBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sdW5zaWduZWQgaW50ICpkYXRhKTsgKi8KIAogLyoKQEAgLTE1MSw3ICsxNTMsNyBAQAogCWludCByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBpb19iYXNlOwogCi0JcHJpbnRrKCJjb21lZGklZDogcGNpNjIwODogIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjaTYyMDg6ICIsIGRldi0+bWlub3IpOwogCiAJcmV0dmFsID0gYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgcGNpNjIwOF9wcml2YXRlKSk7CiAJaWYgKHJldHZhbCA8IDApCkBAIC0xOTUsNyArMTk3LDcgQEAKIAkvKiBzLT5pbnNuX2JpdHMgPSBwY2k2MjA4X2Rpb19pbnNuX2JpdHM7ICovCiAJLyogcy0+aW5zbl9jb25maWcgPSBwY2k2MjA4X2Rpb19pbnNuX2NvbmZpZzsgKi8KIAotCXByaW50aygiYXR0YWNoZWRcbiIpOworCXByaW50ayhLRVJOX0lORk8gImF0dGFjaGVkXG4iKTsKIAogCXJldHVybiAxOwogfQpAQCAtMjEwLDEyICsyMTIsMTEgQEAKICAqLwogc3RhdGljIGludCBwY2k2MjA4X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IHBjaTYyMDg6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IHBjaTYyMDg6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5wY2lfZGV2KSB7Ci0JCWlmIChkZXYtPmlvYmFzZSkgeworCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQljb21lZGlfcGNpX2Rpc2FibGUoZGV2cHJpdi0+cGNpX2Rldik7Ci0JCX0KIAkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CiAJfQogCkBAIC0yNjYsNyArMjY3LDggQEAKICAqIHVzZWZ1bCB0byBhcHBsaWNhdGlvbnMgaWYgeW91IGltcGxlbWVudCB0aGUgaW5zbl9iaXRzIGludGVyZmFjZS4KICAqIFRoaXMgYWxsb3dzIHBhY2tlZCByZWFkaW5nL3dyaXRpbmcgb2YgdGhlIERJTyBjaGFubmVscy4gIFRoZQogICogY29tZWRpIGNvcmUgY2FuIGNvbnZlcnQgYmV0d2VlbiBpbnNuX2JpdHMgYW5kIGluc25fcmVhZC93cml0ZSAqLwotLyogc3RhdGljIGludCBwY2k2MjA4X2Rpb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldixzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgKi8KKy8qIHN0YXRpYyBpbnQgcGNpNjIwOF9kaW9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisgKiAJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLwogLyogc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgKi8KIC8qIHsgKi8KIC8qIGlmKGluc24tPm4hPTIpcmV0dXJuIC1FSU5WQUw7ICovCkBAIC0yOTAsNyArMjkyLDggQEAKIC8qIHJldHVybiAyOyAqLwogLyogfSAqLwogCi0vKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsICovCisvKiBzdGF0aWMgaW50IHBjaTYyMDhfZGlvX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisgKiAJCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCAqLwogLyogc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLHVuc2lnbmVkIGludCAqZGF0YSkgKi8KIC8qIHsgKi8KIC8qIGludCBjaGFuPUNSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOyAqLwpAQCAtMzIwLDEwICszMjMsMTYgQEAKIAkgICAgIHBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgewogCQlpZiAocGNpX2Rldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQURMSU5LKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwY2k2MjA4X2JvYXJkcyk7IGkrKykgewotCQkJCWlmIChwY2k2MjA4X2JvYXJkc1tpXS5kZXZfaWQgPT0gcGNpX2Rldi0+ZGV2aWNlKSB7Ci0JCQkJCS8qICB3YXMgYSBwYXJ0aWN1bGFyIGJ1cy9zbG90IHJlcXVlc3RlZD8gKi8KKwkJCQlpZiAocGNpNjIwOF9ib2FyZHNbaV0uZGV2X2lkID09CisJCQkJCXBjaV9kZXYtPmRldmljZSkgeworCQkJCQkvKgorCQkJCQkgKiB3YXMgYSBwYXJ0aWN1bGFyIGJ1cy9zbG90IHJlcXVlc3RlZD8KKwkJCQkJKi8KIAkJCQkJaWYgKChidXMgIT0gMCkgfHwgKHNsb3QgIT0gMCkpIHsKLQkJCQkJCS8qICBhcmUgd2Ugb24gdGhlIHdyb25nIGJ1cy9zbG90PyAqLworCQkJCQkJLyoKKwkJCQkJCSAqIGFyZSB3ZSBvbiB0aGUKKwkJCQkJCSAqIHdyb25nIGJ1cy9zbG90PworCQkJCQkJKi8KIAkJCQkJCWlmIChwY2lfZGV2LT5idXMtPm51bWJlcgogCQkJCQkJICAgICE9IGJ1cyB8fAogCQkJCQkJICAgIFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKQpAQCAtMzM4LDggKzM0Nyw5IEBACiAJCX0KIAl9CiAKLQlwcmludGsoImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAotCSAgICAgICBkZXYtPm1pbm9yLCBidXMsIHNsb3QpOworCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgIgorCQkJIihyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAorCQkJZGV2LT5taW5vciwgYnVzLCBzbG90KTsKIAlyZXR1cm4gLUVJTzsKIAogZm91bmQ6CkBAIC0zNjgsMTcgKzM3OCwyMCBAQAogCiAJLyogIEVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMgKi8KIAlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpX2RldiwgUENJNjIwOF9EUklWRVJfTkFNRSkgPCAwKSB7Ci0JCXByaW50awotCQkgICAgKCJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCi0JCSAgICAgZGV2X21pbm9yKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlICIKKwkJCSJhbmQgcmVxdWVzdCByZWdpb25zXG4iLAorCQkJZGV2X21pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCS8qICBSZWFkIGxvY2FsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzIFtQQ0lfQkFTRV9BRERSRVNTICMxXS4gKi8KKwkvKiBSZWFkIGxvY2FsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwkgKiBiYXNlIGFkZHJlc3MgW1BDSV9CQVNFX0FERFJFU1MgIzFdLgorCSAqLwogCWxjcl9pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDEpOwogCWxjcl9pb19yYW5nZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMSk7CiAKLQlwcmludGsoImNvbWVkaSVkOiBsb2NhbCBjb25maWcgcmVnaXN0ZXJzIGF0IGFkZHJlc3MgMHglNGx4IFsweCU0bHhdXG4iLAotCSAgICAgICBkZXZfbWlub3IsIGxjcl9pb19iYXNlLCBsY3JfaW9fcmFuZ2UpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBsb2NhbCBjb25maWcgcmVnaXN0ZXJzIGF0IGFkZHJlc3MiCisJCQkiIDB4JTRseCBbMHglNGx4XVxuIiwKKwkJCWRldl9taW5vciwgbGNyX2lvX2Jhc2UsIGxjcl9pb19yYW5nZSk7CiAKIAkvKiAgUmVhZCBQQ0k2MjA4IHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyBbUENJX0JBU0VfQUREUkVTUyAjMl0uICovCiAJaW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzI5Ni5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3Mjk2LmMKaW5kZXggNGRlNmZhZC4uODYwMjg2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3Mjk2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3Mjk2LmMKQEAgLTgyLDggKzgyLDcgQEAKIAlpbnQgYnVzLCBzbG90OwogCWludCByZXQ7CiAKLQlwcmludGsoImNvbWVkaTogYXR0ZW1wdCB0byBhdHRhY2guLi5cbiIpOwotCXByaW50aygiY29tZWRpJWQ6IGFkbF9wY2k3NDMyXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogYXR0YWNoIGFkbF9wY2k3NDMyXG4iLCBkZXYtPm1pbm9yKTsKIAogCWRldi0+Ym9hcmRfbmFtZSA9ICJwY2k3NDMyIjsKIAlidXMgPSBpdC0+b3B0aW9uc1swXTsKQEAgLTExMCwxNCArMTA5LDE0IEBACiAJCQl9CiAJCQlkZXZwcml2LT5wY2lfZGV2ID0gcGNpZGV2OwogCQkJaWYgKGNvbWVkaV9wY2lfZW5hYmxlKHBjaWRldiwgImFkbF9wY2k3Mjk2IikgPCAwKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgICgiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLAorCQkJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLAogCQkJCSAgICAgZGV2LT5taW5vcik7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9CiAKIAkJCWRldi0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMik7Ci0JCQlwcmludGsoImNvbWVkaTogYmFzZSBhZGRyICU0bHhcbiIsIGRldi0+aW9iYXNlKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaTogYmFzZSBhZGRyICU0bHhcbiIsCisJCQkJZGV2LT5pb2Jhc2UpOwogCiAJCQkvKiAgZm91ciA4MjU1IGRpZ2l0YWwgaW8gc3ViZGV2aWNlcyAqLwogCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CkBAIC0xNDUsMjUgKzE0NCwyNSBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAotCQkJcHJpbnRrKCJhdHRhY2hlZFxuIik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpJWQ6IGFkbF9wY2k3NDMyIGF0dGFjaGVkXG4iLAorCQkJCWRldi0+bWlub3IpOwogCiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAotCXByaW50aygiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKIAkgICAgICAgZGV2LT5taW5vciwgYnVzLCBzbG90KTsKIAlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIGludCBhZGxfcGNpNzI5Nl9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBwY2k3NDMyOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwY2k3NDMyOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+cGNpX2RldikgewotCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJaWYgKGRldi0+aW9iYXNlKQogCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOwotCQl9CiAJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOwogCX0KIAkvKiAgZGV0YWNoIGZvdXIgODI1NSBkaWdpdGFsIGlvIHN1YmRldmljZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpNzQzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3NDMyLmMKaW5kZXggZTA4NDRjNi4uYjVhOTQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3NDMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k3NDMyLmMKQEAgLTkwLDggKzkwLDcgQEAKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlpbnQgYnVzLCBzbG90OwogCi0JcHJpbnRrKCJjb21lZGk6IGF0dGVtcHQgdG8gYXR0YWNoLi4uXG4iKTsKLQlwcmludGsoImNvbWVkaSVkOiBhZGxfcGNpNzQzMlxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGF0dGFjaCBhZGxfcGNpNzQzMlxuIiwgZGV2LT5taW5vcik7CiAKIAlkZXYtPmJvYXJkX25hbWUgPSAicGNpNzQzMiI7CiAJYnVzID0gaXQtPm9wdGlvbnNbMF07CkBAIC0xMTgsMTMgKzExNywxMyBAQAogCQkJfQogCQkJZGV2cHJpdi0+cGNpX2RldiA9IHBjaWRldjsKIAkJCWlmIChjb21lZGlfcGNpX2VuYWJsZShwY2lkZXYsICJhZGxfcGNpNzQzMiIpIDwgMCkgewotCQkJCXByaW50awotCQkJCSAgICAoImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKKwkJCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9uc1xuIiwKIAkJCQkgICAgIGRldi0+bWlub3IpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJZGV2LT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKLQkJCXByaW50aygiY29tZWRpOiBiYXNlIGFkZHIgJTRseFxuIiwgZGV2LT5pb2Jhc2UpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBiYXNlIGFkZHIgJTRseFxuIiwKKwkJCQlkZXYtPmlvYmFzZSk7CiAKIAkJCXMgPSBkZXYtPnN1YmRldmljZXMgKyAwOwogCQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOwpAQCAtMTQ4LDI1ICsxNDcsMjQgQEAKIAkJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJCQlzLT5pbnNuX2JpdHMgPSBhZGxfcGNpNzQzMl9kb19pbnNuX2JpdHM7CiAKLQkJCXByaW50aygiY29tZWRpOiBhdHRhY2hlZFxuIik7Ci0KKwkJCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGklZDogYWRsX3BjaTc0MzIgYXR0YWNoZWRcbiIsCisJCQkJZGV2LT5taW5vcik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAotCXByaW50aygiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3QgOiAlZC8lZClcbiIsCisJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogbm8gc3VwcG9ydGVkIGJvYXJkIGZvdW5kISAocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwKIAkgICAgICAgZGV2LT5taW5vciwgYnVzLCBzbG90KTsKIAlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIGludCBhZGxfcGNpNzQzMl9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBwY2k3NDMyOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwY2k3NDMyOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+cGNpX2RldikgewotCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJaWYgKGRldi0+aW9iYXNlKQogCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOwotCQl9CiAJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOwogCX0KIApAQCAtMTc4LDggKzE3Niw4IEBACiAJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXByaW50aygiY29tZWRpOiBwY2k3NDMyX2RvX2luc25fYml0cyBjYWxsZWRcbiIpOwotCXByaW50aygiY29tZWRpOiBkYXRhMDogJTh4IGRhdGExOiAlOHhcbiIsIGRhdGFbMF0sIGRhdGFbMV0pOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IHBjaTc0MzJfZG9faW5zbl9iaXRzIGNhbGxlZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogZGF0YTA6ICU4eCBkYXRhMTogJTh4XG4iLCBkYXRhWzBdLCBkYXRhWzFdKTsKIAogCWlmIChpbnNuLT5uICE9IDIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg4LDcgKzE4Niw3IEBACiAJCXMtPnN0YXRlICY9IH5kYXRhWzBdOwogCQlzLT5zdGF0ZSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOwogCi0JCXByaW50aygiY29tZWRpOiBvdXQ6ICU4eCBvbiBpb2Jhc2UgJTRseFxuIiwgcy0+c3RhdGUsCisJCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IG91dDogJTh4IG9uIGlvYmFzZSAlNGx4XG4iLCBzLT5zdGF0ZSwKIAkJICAgICAgIGRldi0+aW9iYXNlICsgUENJNzQzMl9ETyk7CiAJCW91dGwocy0+c3RhdGUgJiAweGZmZmZmZmZmLCBkZXYtPmlvYmFzZSArIFBDSTc0MzJfRE8pOwogCX0KQEAgLTIwMCwxNCArMTk4LDE0IEBACiAJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQogewotCXByaW50aygiY29tZWRpOiBwY2k3NDMyX2RpX2luc25fYml0cyBjYWxsZWRcbiIpOwotCXByaW50aygiY29tZWRpOiBkYXRhMDogJTh4IGRhdGExOiAlOHhcbiIsIGRhdGFbMF0sIGRhdGFbMV0pOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IHBjaTc0MzJfZGlfaW5zbl9iaXRzIGNhbGxlZFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaTogZGF0YTA6ICU4eCBkYXRhMTogJTh4XG4iLCBkYXRhWzBdLCBkYXRhWzFdKTsKIAogCWlmIChpbnNuLT5uICE9IDIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGF0YVsxXSA9IGlubChkZXYtPmlvYmFzZSArIFBDSTc0MzJfREkpICYgMHhmZmZmZmZmZjsKLQlwcmludGsoImNvbWVkaTogZGF0YTEgJTh4XG4iLCBkYXRhWzFdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBkYXRhMSAlOHhcbiIsIGRhdGFbMV0pOwogCiAJcmV0dXJuIDI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTgxNjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jCmluZGV4IDQzNzQ1ZWMuLmRhMjU2YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpODE2NC5jCkBAIC0zNSw2ICszNSw3IEBACiAqLwogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJjb21lZGlfcGNpLmgiCkBAIC0xMjgsOCArMTI5LDggQEAKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlpbnQgYnVzLCBzbG90OwogCi0JcHJpbnRrKCJjb21lZGk6IGF0dGVtcHQgdG8gYXR0YWNoLi4uXG4iKTsKLQlwcmludGsoImNvbWVkaSVkOiBhZGxfcGNpODE2NFxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpOiBhdHRlbXB0IHRvIGF0dGFjaC4uLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IGFkbF9wY2k4MTY0XG4iLCBkZXYtPm1pbm9yKTsKIAogCWRldi0+Ym9hcmRfbmFtZSA9ICJwY2k4MTY0IjsKIAlidXMgPSBpdC0+b3B0aW9uc1swXTsKQEAgLTE1MCwxOSArMTUxLDE4IEBACiAJCQlpZiAoYnVzIHx8IHNsb3QpIHsKIAkJCQkvKiByZXF1ZXN0ZWQgcGFydGljdWxhciBidXMvc2xvdCAqLwogCQkJCWlmIChwY2lkZXYtPmJ1cy0+bnVtYmVyICE9IGJ1cwotCQkJCSAgICB8fCBQQ0lfU0xPVChwY2lkZXYtPmRldmZuKSAhPSBzbG90KSB7CisJCQkJCXx8IFBDSV9TTE9UKHBjaWRldi0+ZGV2Zm4pICE9IHNsb3QpCiAJCQkJCWNvbnRpbnVlOwotCQkJCX0KIAkJCX0KIAkJCWRldnByaXYtPnBjaV9kZXYgPSBwY2lkZXY7CiAJCQlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpZGV2LCAiYWRsX3BjaTgxNjQiKSA8IDApIHsKLQkJCQlwcmludGsKLQkJCQkgICAgKCJjb21lZGklZDogRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnNcbiIsCi0JCQkJICAgICBkZXYtPm1pbm9yKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgImNvbWVkaSVkOiBGYWlsZWQgdG8gZW5hYmxlICIKKwkJCQkiUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zXG4iLCBkZXYtPm1pbm9yKTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJCWRldi0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMik7Ci0JCQlwcmludGsoImNvbWVkaTogYmFzZSBhZGRyICU0bHhcbiIsIGRldi0+aW9iYXNlKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGk6IGJhc2UgYWRkciAlNGx4XG4iLAorCQkJCSAgIGRldi0+aW9iYXNlKTsKIAogCQkJcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CiAJCQlzLT50eXBlID0gQ09NRURJX1NVQkRfUFJPQzsKQEAgLTIwNCwyNSArMjA0LDI0IEBACiAJCQlzLT5pbnNuX3JlYWQgPSBhZGxfcGNpODE2NF9pbnNuX3JlYWRfYnVmMTsKIAkJCXMtPmluc25fd3JpdGUgPSBhZGxfcGNpODE2NF9pbnNuX3dyaXRlX2J1ZjE7CiAKLQkJCXByaW50aygiY29tZWRpOiBhdHRhY2hlZFxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJjb21lZGk6IGF0dGFjaGVkXG4iKTsKIAogCQkJcmV0dXJuIDE7CiAJCX0KIAl9CiAKLQlwcmludGsoImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90IDogJWQvJWQpXG4iLAotCSAgICAgICBkZXYtPm1pbm9yLCBidXMsIHNsb3QpOworCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEiCisJCSAgICIocmVxLiBidXMvc2xvdCA6ICVkLyVkKVxuIiwgZGV2LT5taW5vciwgYnVzLCBzbG90KTsKIAlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIGludCBhZGxfcGNpODE2NF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBwY2k4MTY0OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBwY2k4MTY0OiByZW1vdmVcbiIsIGRldi0+bWlub3IpOwogCiAJaWYgKGRldnByaXYgJiYgZGV2cHJpdi0+cGNpX2RldikgewotCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJaWYgKGRldi0+aW9iYXNlKQogCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOwotCQl9CiAJCXBjaV9kZXZfcHV0KGRldnByaXYtPnBjaV9kZXYpOwogCX0KIApAQCAtMjY3LDggKzI2Niw5IEBACiAJfQogCiAJZGF0YVswXSA9IGludyhkZXYtPmlvYmFzZSArIGF4aXNfcmVnICsgb2Zmc2V0KTsKLQlwcmludGsoImNvbWVkaTogcGNpODE2NCAlcyByZWFkIC0+ICUwNFg6JTA0WCBvbiBheGlzICVzXG4iLCBhY3Rpb24sCi0JICAgICAgIGRhdGFbMF0sIGRhdGFbMV0sIGF4aXNuYW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBwY2k4MTY0ICVzIHJlYWQgLT4gIgorCQkJCQkJICAiJTA0WDolMDRYIG9uIGF4aXMgJXNcbiIsCisJCQkJYWN0aW9uLCBkYXRhWzBdLCBkYXRhWzFdLCBheGlzbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQgYWRsX3BjaTgxNjRfaW5zbl9yZWFkX21zdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTM0Nyw4ICszNDcsOSBAQAogCiAJb3V0dyhkYXRhWzBdLCBkZXYtPmlvYmFzZSArIGF4aXNfcmVnICsgb2Zmc2V0KTsKIAotCXByaW50aygiY29tZWRpOiBwY2k4MTY0ICVzIHdyaXRlIC0+ICUwNFg6JTA0WCBvbiBheGlzICVzXG4iLCBhY3Rpb24sCi0JICAgICAgIGRhdGFbMF0sIGRhdGFbMV0sIGF4aXNuYW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpOiBwY2k4MTY0ICVzIHdyaXRlIC0+ICIKKwkJCQkJCSIlMDRYOiUwNFggb24gYXhpcyAlc1xuIiwKKwkJCQlhY3Rpb24sIGRhdGFbMF0sIGRhdGFbMV0sIGF4aXNuYW1lKTsKIAogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCmluZGV4IDFlZTRiNmEuLjc5MWVhODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCkBAIC03ODAsNyArNzgwLDcgQEAKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcCwgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCiAJLyogc3RlcCAxOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwppbmRleCBmMGFlNGMwLi45NTFlNTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwpAQCAtODMwLDcgKzgzMCw3IEBACiBzdGF0aWMgaW50IHBjaTE3MXhfYWlfZG9jbWRfYW5kX21vZGUoaW50IG1vZGUsIHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEsIGRpdmlzb3IyOworCXVuc2lnbmVkIGludCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAl1bnNpZ25lZCBpbnQgc2VnbGVuOwogCiAJRFBSSU5USygiYWR2X3BjaTE3MTAgRURCRzogQkdOOiBwY2kxNzF4X2FpX2RvY21kX2FuZF9tb2RlKCVkLC4uLilcbiIsCkBAIC05MzQsNyArOTM0LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcCwgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCiAJRFBSSU5USygiYWR2X3BjaTE3MTAgRURCRzogQkdOOiBwY2kxNzF4X2FpX2NtZHRlc3QoLi4uKVxuIik7CiAjaWZkZWYgUENJMTcxWF9FWFRERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjYzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYwppbmRleCBjNjJhN2UxLi4xNTgwOGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyNjMuYwpAQCAtMTE3LDcgKzExNyw4IEBACiAKIC8qIHRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4gIElmCiAgICBzZXZlcmFsIGhhcmR3YXJlIGRyaXZlcnMga2VlcCBzaW1pbGFyIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0dXJlLAotICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2Ugc3RydWN0LiAgKi8KKyAgIGZlZWwgZnJlZSB0byBzdWdnZXN0IG1vdmluZyB0aGUgdmFyaWFibGUgdG8gdGhlIHN0cnVjdCBjb21lZGlfZGV2aWNlIHN0cnVjdC4KKyovCiAjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0kKIHN0cnVjdCBwYzI2M19wcml2YXRlIHsKIAkvKiBQQ0kgZGV2aWNlLiAqLwpAQCAtMjgxLDcgKzI4Miw4IEBACiAJCXJldCA9IGNvbWVkaV9wY2lfZW5hYmxlKHBjaV9kZXYsIFBDMjYzX0RSSVZFUl9OQU1FKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJjb21lZGklZDogZXJyb3IhIGNhbm5vdCBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zIVxuIiwKKwkJCSAgICAgICAiY29tZWRpJWQ6IGVycm9yISBjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2UgYW5kICIKKwkJCQkicmVxdWVzdCByZWdpb25zIVxuIiwKIAkJCSAgICAgICBkZXYtPm1pbm9yKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTI5MCw5ICsyOTIsOCBAQAogI2VuZGlmCiAJewogCQlyZXQgPSBwYzI2M19yZXF1ZXN0X3JlZ2lvbihkZXYtPm1pbm9yLCBpb2Jhc2UsIFBDMjYzX0lPX1NJWkUpOwotCQlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCX0KIAl9CiAJZGV2LT5pb2Jhc2UgPSBpb2Jhc2U7CiAKQEAgLTM1MCwyMSArMzUxLDE4IEBACiAJICAgICAgIFBDMjYzX0RSSVZFUl9OQU1FKTsKIAogI2lmZGVmIENPTkZJR19DT01FRElfUENJCi0JaWYgKGRldnByaXYpCisJaWYgKGRldnByaXYpIHsKICNlbmRpZgotCXsKICNpZmRlZiBDT05GSUdfQ09NRURJX1BDSQogCQlpZiAoZGV2cHJpdi0+cGNpX2RldikgewotCQkJaWYgKGRldi0+aW9iYXNlKSB7CisJCQlpZiAoZGV2LT5pb2Jhc2UpCiAJCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaV9kZXYpOwotCQkJfQogCQkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpX2Rldik7CiAJCX0gZWxzZQogI2VuZGlmCiAJCXsKLQkJCWlmIChkZXYtPmlvYmFzZSkgeworCQkJaWYgKGRldi0+aW9iYXNlKQogCQkJCXJlbGVhc2VfcmVnaW9uKGRldi0+aW9iYXNlLCBQQzI2M19JT19TSVpFKTsKLQkJCX0KIAkJfQogCX0KIAlpZiAoZGV2LT5ib2FyZF9uYW1lKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IDM5OTIzY2IuLmJjMzc1ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC0zNzIsNyArMzcyLDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CkBAIC00NTIsNyArNDUyLDcgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCXVuc2lnbmVkIGludCBkaXYxLCBkaXYyOworCQl1bnNpZ25lZCBpbnQgZGl2MSA9IDAsIGRpdjIgPSAwOwogCiAJCXRtcCA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoMTAwLCAmZGl2MSwgJmRpdjIsCkBAIC00NjIsNyArNDYyLDcgQEAKIAkJCWVycisrOwogCX0KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCXVuc2lnbmVkIGludCBkaXYxLCBkaXYyOworCQl1bnNpZ25lZCBpbnQgZGl2MSA9IDAsIGRpdjIgPSAwOwogCiAJCXRtcCA9IGNtZC0+Y29udmVydF9hcmc7CiAJCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoMTAwLCAmZGl2MSwgJmRpdjIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKaW5kZXggN2E1ZDQ2ZS4uNzgyMzU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSCiAJICAgICYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRpby5jCmluZGV4IDA5ZTZlM2IuLjdkYWFkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGlvLmMKQEAgLTEwOSwxMiArMTA5LDEyIEBACiAgICBzZXZlcmFsIGhhcmR3YXJlIGRyaXZlcnMga2VlcCBzaW1pbGFyIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0dXJlLAogICAgZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2Ugc3RydWN0LiAgKi8KIHN0cnVjdCBwY2lkaW9fcHJpdmF0ZSB7Ci0JaW50IGRhdGE7CQkvKiAgY3VyZW50bHkgdW51c2VkICovCisJaW50IGRhdGE7CQkvKiAgY3VycmVudGx5IHVudXNlZCAqLwogCiAJLyogd291bGQgYmUgdXNlZnVsIGZvciBhIFBDSSBkZXZpY2UgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKIAotCS8qIHVzZWQgZm9yIERPIHJlYWRiYWNrLCBjdXJlbnRseSB1bnVzZWQgKi8KKwkvKiB1c2VkIGZvciBETyByZWFkYmFjaywgY3VycmVudGx5IHVudXNlZCAqLwogCXVuc2lnbmVkIGludCBkb19yZWFkYmFja1s0XTsJLyogdXAgdG8gNCB1bnNpZ25lZCBpbnQgc3VmZmljZSB0byBob2xkIDk2IGJpdHMgZm9yIFBDSS1ESU85NiAqLwogCiAJdW5zaWduZWQgbG9uZyBkaW9fcmVnX2Jhc2U7CS8qICBhZGRyZXNzIG9mIHBvcnQgQSBvZiB0aGUgZmlyc3QgODI1NSBjaGlwIG9uIGJvYXJkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmMKaW5kZXggZjc4MTE1NC4uNjNiZTYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfZmMuYwpAQCAtNTMsNyArNTMsNyBAQAogCiAJcmV0dmFsID0gY29tZWRpX2J1Zl93cml0ZV9hbGxvYyhhc3luYywgbnVtX2J5dGVzKTsKIAlpZiAocmV0dmFsICE9IG51bV9ieXRlcykgewotCQlwcmludGsoImNvbWVkaTogYnVmZmVyIG92ZXJydW5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGk6IGJ1ZmZlciBvdmVycnVuXG4iKTsKIAkJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfT1ZFUkZMT1c7CiAJCXJldHVybiAwOwogCX0KQEAgLTY1LDcgKzY1LDYgQEAKIAogCXJldHVybiBudW1fYnl0ZXM7CiB9Ci0KIEVYUE9SVF9TWU1CT0woY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcik7CiAKIHVuc2lnbmVkIGludCBjZmNfcmVhZF9hcnJheV9mcm9tX2J1ZmZlcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqc3ViZCwKQEAgLTg0LDcgKzgzLDYgQEAKIAogCXJldHVybiBudW1fYnl0ZXM7CiB9Ci0KIEVYUE9SVF9TWU1CT0woY2ZjX3JlYWRfYXJyYXlfZnJvbV9idWZmZXIpOwogCiB1bnNpZ25lZCBpbnQgY2ZjX2hhbmRsZV9ldmVudHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTEwMiw3ICsxMDAsNiBAQAogCiAJcmV0dXJuIGV2ZW50czsKIH0KLQogRVhQT1JUX1NZTUJPTChjZmNfaGFuZGxlX2V2ZW50cyk7CiAKIE1PRFVMRV9BVVRIT1IoIkZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCmluZGV4IGFlZWMxZWUuLjlkYjlhNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYwpAQCAtNjI5LDcgKzYyOSw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCmluZGV4IDAzNjRiYmYuLmUxYjczNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19USU1FUiAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfRVhUKQogCQllcnIrKzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCmluZGV4IGE0Yzk2YzAuLjk5Y2EyOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKQEAgLTc3Nyw3ICs3NzcsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CkBAIC0xMDUwLDcgKzEwNTAsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c3RvcF9zcmMgIT0gVFJJR19DT1VOVCAmJiBjbWQtPnN0b3Bfc3JjICE9IFRSSUdfTk9ORSkKIAkJZXJyKys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKaW5kZXggMGJiMzAxNi4uNTFmMTJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAogc3RhdGljIGludCBocGRpX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpOwogc3RhdGljIGludCBocGRpX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKLXZvaWQgYWJvcnRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKK3N0YXRpYyB2b2lkIGFib3J0X2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCk7CiBzdGF0aWMgaW50IGhwZGlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKTsKIHN0YXRpYyBpbnQgaHBkaV9jbWRfdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKTsKQEAgLTExMCw3ICsxMTAsOCBAQAogaW50IGNvbW1hbmRfY2hhbm5lbF92YWxpZCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKIAlpZiAoY2hhbm5lbCA9PSAwIHx8IGNoYW5uZWwgPiA2KSB7Ci0JCXByaW50aygiZ3NjX2hwZGk6IGJ1ZyEgaW52YWxpZCBjYWJsZSBjb21tYW5kIGNoYW5uZWxcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiZ3NjX2hwZGk6IGJ1ZyEgaW52YWxpZCBjYWJsZSBjb21tYW5kIGNoYW5uZWxcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC0xNDIsNyArMTQzLDggQEAKIAlSWF9GSUZPX1JFU0VUX0JJVCA9IDB4NCwKIAlUWF9FTkFCTEVfQklUID0gMHgxMCwKIAlSWF9FTkFCTEVfQklUID0gMHgyMCwKLQlERU1BTkRfRE1BX0RJUkVDVElPTl9UWF9CSVQgPSAweDQwLAkvKiBmb3IgY2hhbm5lbCAwLCBjaGFubmVsIDEgY2FuIG9ubHkgdHJhbnNtaXQgKHdoZW4gcHJlc2VudCkgKi8KKwlERU1BTkRfRE1BX0RJUkVDVElPTl9UWF9CSVQgPSAweDQwLAorCQkvKiBmb3IgY2ggMCwgY2ggMSBjYW4gb25seSB0cmFuc21pdCAod2hlbiBwcmVzZW50KSAqLwogCUxJTkVfVkFMSURfT05fU1RBVFVTX1ZBTElEX0JJVCA9IDB4ODAsCiAJU1RBUlRfVFhfQklUID0gMHgxMCwKIAlDQUJMRV9USFJPVFRMRV9FTkFCTEVfQklUID0gMHgyMCwKQEAgLTQyMCw5ICs0MjIsMTEgQEAKIAliaXRzIHw9IFBMWF9ETUFfRU5fUkVBRFlJTl9CSVQ7CiAJLyogIGVuYWJsZSBkbWEgY2hhaW5pbmcgKi8KIAliaXRzIHw9IFBMWF9FTl9DSEFJTl9CSVQ7Ci0JLyogIGVuYWJsZSBpbnRlcnJ1cHQgb24gZG1hIGRvbmUgKHByb2JhYmx5IGRvbid0IG5lZWQgdGhpcywgc2luY2UgY2hhaW4gbmV2ZXIgZmluaXNoZXMpICovCisJLyogIGVuYWJsZSBpbnRlcnJ1cHQgb24gZG1hIGRvbmUKKwkgKiAgKHByb2JhYmx5IGRvbid0IG5lZWQgdGhpcywgc2luY2UgY2hhaW4gbmV2ZXIgZmluaXNoZXMpICovCiAJYml0cyB8PSBQTFhfRU5fRE1BX0RPTkVfSU5UUl9CSVQ7Ci0JLyogIGRvbid0IGluY3JlbWVudCBsb2NhbCBhZGRyZXNzIGR1cmluZyB0cmFuc2ZlcnMgKHdlIGFyZSB0cmFuc2ZlcnJpbmcgZnJvbSBhIGZpeGVkIGZpZm8gcmVnaXN0ZXIpICovCisJLyogIGRvbid0IGluY3JlbWVudCBsb2NhbCBhZGRyZXNzIGR1cmluZyB0cmFuc2ZlcnMKKwkgKiAgKHdlIGFyZSB0cmFuc2ZlcnJpbmcgZnJvbSBhIGZpeGVkIGZpZm8gcmVnaXN0ZXIpICovCiAJYml0cyB8PSBQTFhfTE9DQUxfQUREUl9DT05TVF9CSVQ7CiAJLyogIHJvdXRlIGRtYSBpbnRlcnJ1cHQgdG8gcGNpIGJ1cyAqLwogCWJpdHMgfD0gUExYX0RNQV9JTlRSX1BDSV9CSVQ7CkBAIC01NjAsNyArNTY0LDcgQEAKIAlpbnQgaTsKIAlpbnQgcmV0dmFsOwogCi0JcHJpbnRrKCJjb21lZGklZDogZ3NjX2hwZGlcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiBnc2NfaHBkaVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3QgaHBkaV9wcml2YXRlKSkgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU4OCwxMSArNTkyLDEyIEBACiAJCX0gd2hpbGUgKHBjaWRldiAhPSBOVUxMKTsKIAl9CiAJaWYgKGRldi0+Ym9hcmRfcHRyID09IE5VTEwpIHsKLQkJcHJpbnRrKCJnc2NfaHBkaTogbm8gaHBkaSBjYXJkIGZvdW5kXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ3NjX2hwZGk6IG5vIGhwZGkgY2FyZCBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCXByaW50aygiZ3NjX2hwZGk6IGZvdW5kICVzIG9uIGJ1cyAlaSwgc2xvdCAlaVxuIiwgYm9hcmQoZGV2KS0+bmFtZSwKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJnc2NfaHBkaTogZm91bmQgJXMgb24gYnVzICVpLCBzbG90ICVpXG4iLCBib2FyZChkZXYpLT5uYW1lLAogCSAgICAgICBwY2lkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwY2lkZXYtPmRldmZuKSk7CiAKIAlpZiAoY29tZWRpX3BjaV9lbmFibGUocGNpZGV2LCBkcml2ZXJfaHBkaS5kcml2ZXJfbmFtZSkpIHsKQEAgLTYxOCw3ICs2MjMsNyBAQAogCSAgICBpb3JlbWFwKHByaXYoZGV2KS0+aHBkaV9waHlzX2lvYmFzZSwKIAkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LCBIUERJX0JBRERSSU5ERVgpKTsKIAlpZiAoIXByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UgfHwgIXByaXYoZGV2KS0+aHBkaV9pb2Jhc2UpIHsKLQkJcHJpbnRrKCIgZmFpbGVkIHRvIHJlbWFwIGlvIG1lbW9yeVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBmYWlsZWQgdG8gcmVtYXAgaW8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC02MzAsMTIgKzYzNSwxMyBAQAogCS8qICBnZXQgaXJxICovCiAJaWYgKHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBoYW5kbGVfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKIAkJCWRyaXZlcl9ocGRpLmRyaXZlcl9uYW1lLCBkZXYpKSB7Ci0JCXByaW50aygiIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJXVcbiIsIHBjaWRldi0+aXJxKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBwY2lkZXYtPmlycSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlkZXYtPmlycSA9IHBjaWRldi0+aXJxOwogCi0JcHJpbnRrKCIgaXJxICV1XG4iLCBkZXYtPmlycSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiIGlycSAldVxuIiwgZGV2LT5pcnEpOwogCiAJLyogIGFsb2NhdGUgcGNpIGRtYSBidWZmZXJzICovCiAJZm9yIChpID0gMDsgaSA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7CkBAIC02NTMsNyArNjU5LDggQEAKIAkJCQkJCSAgICZwcml2KGRldiktPgogCQkJCQkJICAgZG1hX2Rlc2NfcGh5c19hZGRyKTsKIAlpZiAocHJpdihkZXYpLT5kbWFfZGVzY19waHlzX2FkZHIgJiAweGYpIHsKLQkJcHJpbnRrKCIgZG1hIGRlc2NyaXB0b3JzIG5vdCBxdWFkLXdvcmQgYWxpZ25lZCAoYnVnKVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIgZG1hIGRlc2NyaXB0b3JzIG5vdCBxdWFkLXdvcmQgYWxpZ25lZCAoYnVnKVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNjcyLDQyICs2NzksMzkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCXByaW50aygiY29tZWRpJWQ6IGdzY19ocGRpOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiBnc2NfaHBkaTogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXYtPmlycSkKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JaWYgKHByaXYoZGV2KSkgewotCQlpZiAocHJpdihkZXYpLT5od19kZXYpIHsKLQkJCWlmIChwcml2KGRldiktPnBseDkwODBfaW9iYXNlKSB7Ci0JCQkJZGlzYWJsZV9wbHhfaW50ZXJydXB0cyhkZXYpOwotCQkJCWlvdW5tYXAoKHZvaWQgKilwcml2KGRldiktPnBseDkwODBfaW9iYXNlKTsKLQkJCX0KLQkJCWlmIChwcml2KGRldiktPmhwZGlfaW9iYXNlKQotCQkJCWlvdW5tYXAoKHZvaWQgKilwcml2KGRldiktPmhwZGlfaW9iYXNlKTsKLQkJCS8qICBmcmVlIHBjaSBkbWEgYnVmZmVycyAqLwotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9ETUFfQlVGRkVSUzsgaSsrKSB7Ci0JCQkJaWYgKHByaXYoZGV2KS0+ZGlvX2J1ZmZlcltpXSkKLQkJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2KGRldiktPmh3X2RldiwKLQkJCQkJCQkgICAgRE1BX0JVRkZFUl9TSVpFLAotCQkJCQkJCSAgICBwcml2KGRldiktPgotCQkJCQkJCSAgICBkaW9fYnVmZmVyW2ldLAotCQkJCQkJCSAgICBwcml2Ci0JCQkJCQkJICAgIChkZXYpLT5kaW9fYnVmZmVyX3BoeXNfYWRkcgotCQkJCQkJCSAgICBbaV0pOwotCQkJfQotCQkJLyogIGZyZWUgZG1hIGRlc2NyaXB0b3JzICovCi0JCQlpZiAocHJpdihkZXYpLT5kbWFfZGVzYykKLQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYoZGV2KS0+aHdfZGV2LAotCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKQotCQkJCQkJICAgICogTlVNX0RNQV9ERVNDUklQVE9SUywKLQkJCQkJCSAgICBwcml2KGRldiktPmRtYV9kZXNjLAotCQkJCQkJICAgIHByaXYoZGV2KS0+Ci0JCQkJCQkgICAgZG1hX2Rlc2NfcGh5c19hZGRyKTsKLQkJCWlmIChwcml2KGRldiktPmhwZGlfcGh5c19pb2Jhc2UpIHsKLQkJCQljb21lZGlfcGNpX2Rpc2FibGUocHJpdihkZXYpLT5od19kZXYpOwotCQkJfQotCQkJcGNpX2Rldl9wdXQocHJpdihkZXYpLT5od19kZXYpOworCWlmICgocHJpdihkZXYpKSAmJiAocHJpdihkZXYpLT5od19kZXYpKSB7CisJCWlmIChwcml2KGRldiktPnBseDkwODBfaW9iYXNlKSB7CisJCQlkaXNhYmxlX3BseF9pbnRlcnJ1cHRzKGRldik7CisJCQlpb3VubWFwKCh2b2lkICopcHJpdihkZXYpLT5wbHg5MDgwX2lvYmFzZSk7CiAJCX0KKwkJaWYgKHByaXYoZGV2KS0+aHBkaV9pb2Jhc2UpCisJCQlpb3VubWFwKCh2b2lkICopcHJpdihkZXYpLT5ocGRpX2lvYmFzZSk7CisJCS8qICBmcmVlIHBjaSBkbWEgYnVmZmVycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0RNQV9CVUZGRVJTOyBpKyspIHsKKwkJCWlmIChwcml2KGRldiktPmRpb19idWZmZXJbaV0pCisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2KGRldiktPmh3X2RldiwKKwkJCQkJCSAgICBETUFfQlVGRkVSX1NJWkUsCisJCQkJCQkgICAgcHJpdihkZXYpLT4KKwkJCQkJCSAgICBkaW9fYnVmZmVyW2ldLAorCQkJCQkJICAgIHByaXYKKwkJCQkJCSAgICAoZGV2KS0+ZGlvX2J1ZmZlcl9waHlzX2FkZHIKKwkJCQkJCSAgICBbaV0pOworCQl9CisJCS8qICBmcmVlIGRtYSBkZXNjcmlwdG9ycyAqLworCQlpZiAocHJpdihkZXYpLT5kbWFfZGVzYykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdihkZXYpLT5od19kZXYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHBseF9kbWFfZGVzYykKKwkJCQkJICAgICogTlVNX0RNQV9ERVNDUklQVE9SUywKKwkJCQkJICAgIHByaXYoZGV2KS0+ZG1hX2Rlc2MsCisJCQkJCSAgICBwcml2KGRldiktPgorCQkJCQkgICAgZG1hX2Rlc2NfcGh5c19hZGRyKTsKKwkJaWYgKHByaXYoZGV2KS0+aHBkaV9waHlzX2lvYmFzZSkKKwkJCWNvbWVkaV9wY2lfZGlzYWJsZShwcml2KGRldiktPmh3X2Rldik7CisJCXBjaV9kZXZfcHV0KHByaXYoZGV2KS0+aHdfZGV2KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC04MTAsMTUgKzgxNCwxNiBAQAogCWlmIChlcnIpCiAJCXJldHVybiA0OwogCi0JaWYgKGNtZC0+Y2hhbmxpc3QpIHsKLQkJZm9yIChpID0gMTsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKLQkJCWlmIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbaV0pICE9IGkpIHsKLQkJCQkvKiAgWFhYIGNvdWxkIHN1cHBvcnQgOCBjaGFubmVscyBvciAxNiBjaGFubmVscyAqLwotCQkJCWNvbWVkaV9lcnJvcihkZXYsCi0JCQkJCSAgICAgImNoYW5saXN0IG11c3QgYmUgY2hhbm5lbHMgMCB0byAzMSBpbiBvcmRlciIpOwotCQkJCWVycisrOwotCQkJCWJyZWFrOwotCQkJfQorCWlmICghY21kLT5jaGFubGlzdCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgeworCQlpZiAoQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKSAhPSBpKSB7CisJCQkvKiAgWFhYIGNvdWxkIHN1cHBvcnQgOCBvciAxNiBjaGFubmVscyAqLworCQkJY29tZWRpX2Vycm9yKGRldiwKKwkJCQkgICAgICJjaGFubGlzdCBtdXN0IGJlIGNoIDAgdG8gMzEgaW4gb3JkZXIiKTsKKwkJCWVycisrOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTgzMSw5ICs4MzYsOSBAQAogc3RhdGljIGludCBocGRpX2NtZF90ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0JaWYgKHByaXYoZGV2KS0+ZGlvX2NvbmZpZ19vdXRwdXQpIHsKKwlpZiAocHJpdihkZXYpLT5kaW9fY29uZmlnX291dHB1dCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlCisJZWxzZQogCQlyZXR1cm4gZGlfY21kX3Rlc3QoZGV2LCBzLCBjbWQpOwogfQogCkBAIC04OTksOSArOTA0LDkgQEAKIAogc3RhdGljIGludCBocGRpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKLQlpZiAocHJpdihkZXYpLT5kaW9fY29uZmlnX291dHB1dCkgeworCWlmIChwcml2KGRldiktPmRpb19jb25maWdfb3V0cHV0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UKKwllbHNlCiAJCXJldHVybiBkaV9jbWQoZGV2LCBzKTsKIH0KIApAQCAtOTYzLDE0ICs5NjgsMTIgQEAKIAl1aW50OF90IGRtYTBfc3RhdHVzLCBkbWExX3N0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFkZXYtPmF0dGFjaGVkKSB7CisJaWYgKCFkZXYtPmF0dGFjaGVkKQogCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQogCiAJcGx4X3N0YXR1cyA9IHJlYWRsKHByaXYoZGV2KS0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfSU5UUkNTX1JFRyk7Ci0JaWYgKChwbHhfc3RhdHVzICYgKElDU19ETUEwX0EgfCBJQ1NfRE1BMV9BIHwgSUNTX0xJQSkpID09IDApIHsKKwlpZiAoKHBseF9zdGF0dXMgJiAoSUNTX0RNQTBfQSB8IElDU19ETUExX0EgfCBJQ1NfTElBKSkgPT0gMCkKIAkJcmV0dXJuIElSUV9OT05FOwotCX0KIAogCWhwZGlfaW50cl9zdGF0dXMgPSByZWFkbChwcml2KGRldiktPmhwZGlfaW9iYXNlICsgSU5URVJSVVBUX1NUQVRVU19SRUcpOwogCWhwZGlfYm9hcmRfc3RhdHVzID0gcmVhZGwocHJpdihkZXYpLT5ocGRpX2lvYmFzZSArIEJPQVJEX1NUQVRVU19SRUcpOwpAQCAtOTkwLDkgKzk5Myw4IEBACiAJCSAgICAgICBwcml2KGRldiktPnBseDkwODBfaW9iYXNlICsgUExYX0RNQTBfQ1NfUkVHKTsKIAogCQlERUJVR19QUklOVCgiZG1hMCBzdGF0dXMgMHgleFxuIiwgZG1hMF9zdGF0dXMpOwotCQlpZiAoZG1hMF9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkgeworCQlpZiAoZG1hMF9zdGF0dXMgJiBQTFhfRE1BX0VOX0JJVCkKIAkJCWRyYWluX2RtYV9idWZmZXJzKGRldiwgMCk7Ci0JCX0KIAkJREVCVUdfUFJJTlQoIiBjbGVhcmVkIGRtYSBjaDAgaW50ZXJydXB0XG4iKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwpAQCAtMTA0Miw3ICsxMDQ0LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQgYWJvcnRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQorc3RhdGljIHZvaWQgYWJvcnRfZG1hKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjaGFubmVsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwppbmRleCA3YTY3ZmZmLi5mYTBlNDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCkBAIC00Niw3ICs0Niw3IEBACiAKIE9wdGlvbnM6CiAgWzBdIC0gUENJIGJ1cyBudW1iZXIgLSBpZiBidXMgbnVtYmVyIGFuZCBzbG90IG51bWJlciBhcmUgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZHJpdmVyIHNlYXJjaCBmb3IgZmlyc3QgdW51c2VkIGNhcmQKKwkJCXRoZW4gZHJpdmVyIHNlYXJjaCBmb3IgZmlyc3QgdW51c2VkIGNhcmQKICBbMV0gLSBQQ0kgc2xvdCBudW1iZXIKICovCiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCURhdGEgJiBTdHJ1Y3R1cmUgZGVjbGFyYXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNpX2xpc3RfYnVpbGRlZCA9IDA7CS8qPjAgbGlzdCBvZiBjYXJkIGlzIGtub3duICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNpX2xpc3RfYnVpbGRlZDsJLyo+MCBsaXN0IG9mIGNhcmQgaXMga25vd24gKi8KIAogc3RydWN0IGJvYXJkdHlwZSB7CiAJY29uc3QgY2hhciAqbmFtZTsJLyogIGRyaXZlciBuYW1lICovCkBAIC0xNzYsMTMgKzE3NiwxMyBAQAogI2RlZmluZSBuX2JvYXJkdHlwZXMgKHNpemVvZihib2FyZHR5cGVzKS9zaXplb2Yoc3RydWN0IGJvYXJkdHlwZSkpCiAKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBkcml2ZXJfaWNwX211bHRpID0gewotZHJpdmVyX25hbWU6ImljcF9tdWx0aSIsCi1tb2R1bGU6VEhJU19NT0RVTEUsCi1hdHRhY2g6aWNwX211bHRpX2F0dGFjaCwKLWRldGFjaDppY3BfbXVsdGlfZGV0YWNoLAotbnVtX25hbWVzOm5fYm9hcmR0eXBlcywKLWJvYXJkX25hbWU6JmJvYXJkdHlwZXNbMF0ubmFtZSwKLW9mZnNldDpzaXplb2Yoc3RydWN0IGJvYXJkdHlwZSksCitkcml2ZXJfbmFtZTogImljcF9tdWx0aSIsCittb2R1bGUgOiBUSElTX01PRFVMRSwKK2F0dGFjaCA6IGljcF9tdWx0aV9hdHRhY2gsCitkZXRhY2ggOiBpY3BfbXVsdGlfZGV0YWNoLAorbnVtX25hbWVzIDogbl9ib2FyZHR5cGVzLAorYm9hcmRfbmFtZSA6ICZib2FyZHR5cGVzWzBdLm5hbWUsCitvZmZzZXQgOiBzaXplb2Yoc3RydWN0IGJvYXJkdHlwZSksCiB9OwogCiBDT01FRElfSU5JVENMRUFOVVAoZHJpdmVyX2ljcF9tdWx0aSk7CkBAIC0yMzQsMTggKzIzNCwxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9haQorTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9haQogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgaW5wdXQuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2luZ2xlIGFuYWxvZ3VlIGlucHV0LgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgaW5wdXQgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBhbmFsb2d1ZSBpbnB1dCBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC0yNTYsNyArMjU2LDcgQEAKIAlpbnQgbiwgdGltZW91dDsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiaWNwIG11bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pXG4iKTsKICNlbmRpZgogCS8qICBEaXNhYmxlIEEvRCBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdCAqLwogCWRldnByaXYtPkludEVuYWJsZSAmPSB+QURDX1JFQURZOwpAQCAtMjY2LDExICsyNjYsMTEgQEAKIAlkZXZwcml2LT5JbnRTdGF0dXMgfD0gQURDX1JFQURZOwogCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOwogCi0JLyogIFNldCB1cCBhcHByb3ByaWF0ZSBjaGFubmVsLCBtb2RlIGFuZCByYW5nZSBkYXRhLCBmb3Igc3BlY2lmaWVkIGNoYW5uZWwgKi8KKwkvKiAgU2V0IHVwIGFwcHJvcHJpYXRlIGNoYW5uZWwsIG1vZGUgYW5kIHJhbmdlIGRhdGEsIGZvciBzcGVjaWZpZWQgY2ggKi8KIAlzZXR1cF9jaGFubmVsX2xpc3QoZGV2LCBzLCAmaW5zbi0+Y2hhbnNwZWMsIDEpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3BfbXVsdGkgQSBTVD0lNHggSU89JXBcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcgImljcF9tdWx0aSBBIFNUPSU0eCBJTz0lcFxuIiwKIAkgICAgICAgcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSwKIAkgICAgICAgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKTsKICNlbmRpZgpAQCAtMjgzLDE0ICsyODMsMTQgQEAKIAkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzICY9IH5BRENfU1Q7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQkJcHJpbnRrKCJpY3AgbXVsdGkgQiBuPSVkIFNUPSU0eFxuIiwgbiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImljcCBtdWx0aSBCIG49JWQgU1Q9JTR4XG4iLCBuLAogCQkgICAgICAgcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSk7CiAjZW5kaWYKIAogCQl1ZGVsYXkoMSk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQkJcHJpbnRrKCJpY3AgbXVsdGkgQyBuPSVkIFNUPSU0eFxuIiwgbiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImljcCBtdWx0aSBDIG49JWQgU1Q9JTR4XG4iLCBuLAogCQkgICAgICAgcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9BRENfQ1NSKSk7CiAjZW5kaWYKIApAQCAtMzAzLDcgKzMwMyw4IEBACiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKIAkJCWlmICghKHRpbWVvdXQgJSAxMCkpCi0JCQkJcHJpbnRrKCJpY3AgbXVsdGkgRCBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiaWNwIG11bHRpIEQgbj0lZCB0bT0lZCBTVD0lNHhcbiIsIG4sCiAJCQkJICAgICAgIHRpbWVvdXQsCiAJCQkJICAgICAgIHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKwogCQkJCQkgICAgIElDUF9NVUxUSV9BRENfQ1NSKSk7CkBAIC0zMjgsOSArMzI5LDkgQEAKIAkJZGF0YVtuXSA9IDA7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQkJcHJpbnRrCi0JCSAgICAoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKSBuPSVkXG4iLAotCQkgICAgIG4pOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fcmVhZF9haSguLi4pIG49JWRcbiIsCisJCSAgICAgIG4pOwogI2VuZGlmCiAJCXJldHVybiAtRVRJTUU7CiAKQEAgLTM0OCw3ICszNDksOCBAQAogCXdyaXRldyhkZXZwcml2LT5JbnRTdGF0dXMsIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfSU5UX1NUQVQpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9yZWFkX2FpKC4uLikgbj0lZFxuIiwgbik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9pbnNuX3JlYWRfYWkoLi4uKSBuPSVkXG4iLCBuKTsKICNlbmRpZgogCXJldHVybiBuOwogfQpAQCAtMzU2LDE4ICszNTgsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2FvCitOYW1lOglpY3BfbXVsdGlfaW5zbl93cml0ZV9hbwogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgc2luZ2xlIGFuYWxvZ3VlIG91dHB1dC4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgc2luZ2xlIGFuYWxvZ3VlIG91dHB1dC4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC0zNzgsNyArMzgwLDggQEAKIAlpbnQgbiwgY2hhbiwgcmFuZ2UsIHRpbWVvdXQ7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX3dyaXRlX2FvKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pXG4iKTsKICNlbmRpZgogCS8qICBEaXNhYmxlIEQvQSBjb252ZXJzaW9uIHJlYWR5IGludGVycnVwdCAqLwogCWRldnByaXYtPkludEVuYWJsZSAmPSB+REFDX1JFQURZOwpAQCAtNDA0LDcgKzQwNyw4IEBACiAJd3JpdGV3KGRldnByaXYtPkRhY0NtZFN0YXR1cywgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9EQUNfQ1NSKTsKIAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJLyogIFdhaXQgZm9yIGFuYWxvZ3VlIG91dHB1dCBkYXRhIHJlZ2lzdGVyIHRvIGJlIHJlYWR5IGZvciBuZXcgZGF0YSwgb3IgZ2V0IGZlZCB1cCB3YWl0aW5nICovCisJCS8qICBXYWl0IGZvciBhbmFsb2d1ZSBvdXRwdXQgZGF0YSByZWdpc3RlciB0byBiZQorCQkgKiAgcmVhZHkgZm9yIG5ldyBkYXRhLCBvciBnZXQgZmVkIHVwIHdhaXRpbmcgKi8KIAkJdGltZW91dCA9IDEwMDsKIAkJd2hpbGUgKHRpbWVvdXQtLSkgewogCQkJaWYgKCEocmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCkBAIC00MTMsNyArNDE3LDggQEAKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwogCQkJaWYgKCEodGltZW91dCAlIDEwKSkKLQkJCQlwcmludGsoImljcCBtdWx0aSBBIG49JWQgdG09JWQgU1Q9JTR4XG4iLCBuLAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICJpY3AgbXVsdGkgQSBuPSVkIHRtPSVkIFNUPSU0eFxuIiwgbiwKIAkJCQkgICAgICAgdGltZW91dCwKIAkJCQkgICAgICAgcmVhZHcoZGV2cHJpdi0+aW9fYWRkciArCiAJCQkJCSAgICAgSUNQX01VTFRJX0RBQ19DU1IpKTsKQEAgLTQzOCw4ICs0NDMsOCBAQAogCQlkZXZwcml2LT5hb19kYXRhW2NoYW5dID0gMDsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCQlwcmludGsKLQkJICAgICgiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKSBuPSVkXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl93cml0ZV9hbyguLi4pIG49JWRcbiIsCiAJCSAgICAgbik7CiAjZW5kaWYKIAkJcmV0dXJuIC1FVElNRTsKQEAgLTQ1OSw3ICs0NjQsOCBAQAogCX0KIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKSBuPSVkXG4iLCBuKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX2luc25fd3JpdGVfYW8oLi4uKSBuPSVkXG4iLCBuKTsKICNlbmRpZgogCXJldHVybiBuOwogfQpAQCAtNDY3LDE4ICs0NzMsMTggQEAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCU5hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfYW8KK05hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfYW8KIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2luZ2xlIGFuYWxvZ3VlIG91dHB1dC4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzaW5nbGUgYW5hbG9ndWUgb3V0cHV0LgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTUwMSwxOCArNTA3LDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl9iaXRzX2RpCitOYW1lOglpY3BfbXVsdGlfaW5zbl9iaXRzX2RpCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgZGlnaXRhbCBpbnB1dHMuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBkaWdpdGFsIGlucHV0cy4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCisJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGFuYWxvZ3VlIG91dHB1dCBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC01MjgsMTggKzUzNCwxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fYml0c19kbworTmFtZToJaWNwX211bHRpX2luc25fYml0c19kbwogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBhcHByb3ByaWF0ZSBkaWdpdGFsIG91dHB1dHMuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgZGlnaXRhbCBvdXRwdXRzLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcwlQb2ludGVyIHRvIGN1cnJlbnQgc3ViZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgotCQl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gYW5hbG9ndWUgb3V0cHV0IGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTU0OCwxNCArNTU0LDE0IEBACiAJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImljcCBtdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9pbnNuX2JpdHNfZG8oLi4uKVxuIik7CiAjZW5kaWYKIAogCWlmIChkYXRhWzBdKSB7CiAJCXMtPnN0YXRlICY9IH5kYXRhWzBdOwogCQlzLT5zdGF0ZSB8PSAoZGF0YVswXSAmIGRhdGFbMV0pOwogCi0JCXByaW50aygiRGlnaXRhbCBvdXRwdXRzID0gJTR4IFxuIiwgcy0+c3RhdGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiRGlnaXRhbCBvdXRwdXRzID0gJTR4IFxuIiwgcy0+c3RhdGUpOwogCiAJCXdyaXRldyhzLT5zdGF0ZSwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ETyk7CiAJfQpAQCAtNTYzLDcgKzU2OSw3IEBACiAJZGF0YVsxXSA9IHJlYWR3KGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfREkpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJpY3AgbXVsdGkgRURCRzogRU5EOiBpY3BfbXVsdGlfaW5zbl9iaXRzX2RvKC4uLilcbiIpOwogI2VuZGlmCiAJcmV0dXJuIDI7CiB9CkBAIC01NzEsMTggKzU3NywxOCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2luc25fcmVhZF9jdHIKK05hbWU6CWljcF9tdWx0aV9pbnNuX3JlYWRfY3RyCiAKLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBzcGVjaWZpZWQgY291bnRlci4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KLQkJdW5zaWduZWQgaW50ICpkYXRhCQlQb2ludGVyIHRvIGNvdW50ZXIgZGF0YQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24JUG9pbnRlciB0byBjdXJyZW50IGNvbWVkaSBpbnN0cnVjdGlvbgorCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKIAotCVJldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAorUmV0dXJuczppbnQJCQlObXViZXIgb2YgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTU5NiwxOCArNjAyLDE4IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfaW5zbl93cml0ZV9jdHIKK05hbWU6CWljcF9tdWx0aV9pbnNuX3dyaXRlX2N0cgogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gd3JpdGUgdG8gdGhlIHNwZWNpZmllZCBjb3VudGVyLgorRGVzY3JpcHRpb246CisJVGhpcyBmdW5jdGlvbiB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGNvdW50ZXIuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbglQb2ludGVyIHRvIGN1cnJlbnQgY29tZWRpIGluc3RydWN0aW9uCi0JCXVuc2lnbmVkIGludCAqZGF0YQkJUG9pbnRlciB0byBjb3VudGVyIGRhdGEKK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuCVBvaW50ZXIgdG8gY3VycmVudCBjb21lZGkgaW5zdHJ1Y3Rpb24KKwl1bnNpZ25lZCBpbnQgKmRhdGEJCVBvaW50ZXIgdG8gY291bnRlciBkYXRhCiAKLQlSZXR1cm5zOmludAkJCU5tdWJlciBvZiBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQKK1JldHVybnM6aW50CQkJTm11YmVyIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC02MjIsMTUgKzYyOCwxNSBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpCitOYW1lOglpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBhbGwKLQkJaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIGljcCBtdWx0aSBib2FyZC4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIGFsbAorCWludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBpY3AgbXVsdGkgYm9hcmQuCiAKLQlQYXJhbWV0ZXJzOgotCQlpbnQgaXJxCi0JCXZvaWQgKmQJCQlQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlCitQYXJhbWV0ZXJzOgorCWludCBpcnEKKwl2b2lkICpkCQkJUG9pbnRlciB0byBjdXJyZW50IGRldmljZQogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCkBAIC02NDAsNyArNjQ2LDggQEAKIAlpbnQgaW50X25vOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogQkdOOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoJWQsLi4uKVxuIiwKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IEJHTjogaW50ZXJydXB0X3NlcnZpY2VfaWNwX211bHRpKCVkLC4uLilcbiIsCiAJICAgICAgIGlycSk7CiAjZW5kaWYKIApAQCAtNjUxLDcgKzY1OCw4IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogI2lmZGVmIElDUF9NVUxUSV9FWFRERUJVRwotCXByaW50aygiaWNwIG11bHRpIEVEQkc6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSgpIFNUOiAlNHhcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoKSBTVDogJTR4XG4iLAogCSAgICAgICByZWFkdyhkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9TVEFUKSk7CiAjZW5kaWYKIApAQCAtNjc5LDcgKzY4Nyw4IEBACiAJfQogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogRU5EOiBpbnRlcnJ1cHRfc2VydmljZV9pY3BfbXVsdGkoLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImljcCBtdWx0aSBFREJHOiBFTkQ6IGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSguLi4pXG4iKTsKICNlbmRpZgogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTY4OCwyMCArNjk3LDIwIEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOgljaGVja19jaGFubmVsX2xpc3QKK05hbWU6CWNoZWNrX2NoYW5uZWxfbGlzdAogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBjaGFubmVsIGxpc3QsIHByb3ZpZGVkIGJ5IHVzZXIKLQkJaXMgYnVpbHQgY29ycmVjdGx5CitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY2hhbm5lbCBsaXN0LCBwcm92aWRlZCBieSB1c2VyCisJaXMgYnVpbHQgY29ycmVjdGx5CiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCi0JCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCi0JCXVuc2lnbmVkIGludCAqY2hhbmxpc3QJUG9pbnRlciB0byBwYWNrZWQgY2hhbm5lbCBsaXN0Ci0JCXVuc2lnbmVkIGludCBuX2NoYW4JTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KK1BhcmFtZXRlcnM6CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQorCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzCVBvaW50ZXIgdG8gY3VycmVudCBzdWJkZXZpY2Ugc3RydWN0dXJlCisJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKKwl1bnNpZ25lZCBpbnQgbl9jaGFuCU51bWJlciBvZiBjaGFubmVscyB0byBzY2FuCiAKLQlSZXR1cm5zOmludCAwID0gZmFpbHVyZQotCQkgICAgMSA9IHN1Y2Nlc3MKK1JldHVybnM6aW50IDAgPSBmYWlsdXJlCisJICAgIDEgPSBzdWNjZXNzCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTcxMiw3ICs3MjEsOCBAQAogCXVuc2lnbmVkIGludCBpOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogIGNoZWNrX2NoYW5uZWxfbGlzdCguLi4sJWQpXG4iLCBuX2NoYW4pOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogIGNoZWNrX2NoYW5uZWxfbGlzdCguLi4sJWQpXG4iLCBuX2NoYW4pOwogI2VuZGlmCiAJLyogIENoZWNrIHRoYXQgd2UgYXQgbGVhc3QgaGF2ZSBvbmUgY2hhbm5lbCB0byBjaGVjayAqLwogCWlmIChuX2NoYW4gPCAxKSB7CkBAIC03MjUsNyArNzM1LDcgQEAKIAkJaWYgKENSX0FSRUYoY2hhbmxpc3RbaV0pID09IEFSRUZfRElGRikgewogCQkJaWYgKENSX0NIQU4oY2hhbmxpc3RbaV0pID4gdGhpc19ib2FyZC0+bl9haWNoYW5kKSB7CiAJCQkJY29tZWRpX2Vycm9yKGRldiwKLQkJCQkJICAgICAiSW5jb3JyZWN0IGRpZmZlcmVudGlhbCBhaSBjaGFubmVsIG51bWJlciIpOworCQkJCQkgICAgICJJbmNvcnJlY3QgZGlmZmVyZW50aWFsIGFpIGNoLW5yIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC03NDMsMjAgKzc1MywyMCBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJc2V0dXBfY2hhbm5lbF9saXN0CitOYW1lOglzZXR1cF9jaGFubmVsX2xpc3QKIAotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgc2VsZWN0aW9uLAotCQlkaWZmZXJlbnRpYWwgaW5wdXQgbW9kZSBhbmQgcmFuZ2UgYml0cyBpbiB0aGUgQURDIENvbW1hbmQvCi0JCVN0YXR1cyByZWdpc3Rlci4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBzZWxlY3Rpb24sCisJZGlmZmVyZW50aWFsIGlucHV0IG1vZGUgYW5kIHJhbmdlIGJpdHMgaW4gdGhlIEFEQyBDb21tYW5kLworCVN0YXR1cyByZWdpc3Rlci4KIAotCVBhcmFtZXRlcnM6Ci0JCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IHNldmljZSBzdHJ1Y3R1cmUKLQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKLQkJdW5zaWduZWQgaW50ICpjaGFubGlzdAlQb2ludGVyIHRvIHBhY2tlZCBjaGFubmVsIGxpc3QKLQkJdW5zaWduZWQgaW50IG5fY2hhbglOdW1iZXIgb2YgY2hhbm5lbHMgdG8gc2NhbgorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMJUG9pbnRlciB0byBjdXJyZW50IHN1YmRldmljZSBzdHJ1Y3R1cmUKKwl1bnNpZ25lZCBpbnQgKmNoYW5saXN0CVBvaW50ZXIgdG8gcGFja2VkIGNoYW5uZWwgbGlzdAorCXVuc2lnbmVkIGludCBuX2NoYW4JTnVtYmVyIG9mIGNoYW5uZWxzIHRvIHNjYW4KIAotCVJldHVybnM6Vm9pZAorUmV0dXJuczpWb2lkCiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KQEAgLTc2OCw3ICs3NzgsOCBAQAogCXVuc2lnbmVkIGludCBkaWZmOwogCiAjaWZkZWYgSUNQX01VTFRJX0VYVERFQlVHCi0JcHJpbnRrKCJpY3AgbXVsdGkgRURCRzogIHNldHVwX2NoYW5uZWxfbGlzdCguLi4sJWQpXG4iLCBuX2NoYW4pOworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJpY3AgbXVsdGkgRURCRzogIHNldHVwX2NoYW5uZWxfbGlzdCguLi4sJWQpXG4iLCBuX2NoYW4pOwogI2VuZGlmCiAJZGV2cHJpdi0+YWN0X2NoYW5saXN0X2xlbiA9IG5fY2hhbjsKIAlkZXZwcml2LT5hY3RfY2hhbmxpc3RfcG9zID0gMDsKQEAgLTc4Niw3ICs3OTcsOCBAQAogCQkJY2hhbnByb2cgJj0gMHgwMDBmOwogCQl9CiAKLQkJLyogIENsZWFyIGNoYW5uZWwsIHJhbmdlIGFuZCBpbnB1dCBtb2RlIGJpdHMgaW4gQS9EIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCisJCS8qICBDbGVhciBjaGFubmVsLCByYW5nZSBhbmQgaW5wdXQgbW9kZSBiaXRzCisJCSAqICBpbiBBL0QgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KIAkJZGV2cHJpdi0+QWRjQ21kU3RhdHVzICY9IDB4ZjAwZjsKIAogCQkvKiAgU2V0IGNoYW5uZWwgbnVtYmVyIGFuZCBkaWZmZXJlbnRpYWwgbW9kZSBzdGF0dXMgYml0ICovCkBAIC04MDgsNyArODIwLDggQEAKIAkJICAgICAgIGRldnByaXYtPmlvX2FkZHIgKyBJQ1BfTVVMVElfQURDX0NTUik7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQkJcHJpbnRrKCJHUzogJTJkLiBbJTR4XT0lNHggJTR4XG4iLCBpLCBjaGFucHJvZywgcmFuZ2UsCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiR1M6ICUyZC4gWyU0eF09JTR4ICU0eFxuIiwgaSwgY2hhbnByb2csIHJhbmdlLAogCQkgICAgICAgZGV2cHJpdi0+YWN0X2NoYW5saXN0W2ldKTsKICNlbmRpZgogCX0KQEAgLTgxOCwxNSArODMxLDE1IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLQlOYW1lOglpY3BfbXVsdGlfcmVzZXQKK05hbWU6CWljcF9tdWx0aV9yZXNldAogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBpY3AgbXVsdGkgZGV2aWNlIHRvIGEgJ3NhZmUnIHN0YXRlCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgaWNwIG11bHRpIGRldmljZSB0byBhICdzYWZlJyBzdGF0ZQogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgc2V2aWNlIHN0cnVjdHVyZQorUGFyYW1ldGVyczoKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBzZXZpY2Ugc3RydWN0dXJlCiAKLQlSZXR1cm5zOmludAkwID0gc3VjY2VzcworUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtODM1LDcgKzg0OCw4IEBACiAJdW5zaWduZWQgaW50IGk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcF9tdWx0aSBFREJHOiBCR046IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwX211bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX3Jlc2V0KC4uLilcbiIpOwogI2VuZGlmCiAJLyogIENsZWFyIElOVCBlbmFibGVzIGFuZCByZXF1ZXN0cyAqLwogCXdyaXRldygwLCBkZXZwcml2LT5pb19hZGRyICsgSUNQX01VTFRJX0lOVF9FTik7CkBAIC04NjYsNyArODgwLDggQEAKIAl3cml0ZXcoMCwgZGV2cHJpdi0+aW9fYWRkciArIElDUF9NVUxUSV9ETyk7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9yZXNldCguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiaWNwIG11bHRpIEVEQkc6IEVORDogaWNwX211bHRpX3Jlc2V0KC4uLilcbiIpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CkBAIC04NzQsMTcgKzg4OSwxNyBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2F0dGFjaAorTmFtZToJaWNwX211bHRpX2F0dGFjaAogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCBhbGwgdGhlIGFwcHJvcHJpYXRlIGRhdGEgZm9yIHRoZSBjdXJyZW50Ci0JCWRldmljZS4KK0Rlc2NyaXB0aW9uOgorCVRoaXMgZnVuY3Rpb24gc2V0cyB1cCBhbGwgdGhlIGFwcHJvcHJpYXRlIGRhdGEgZm9yIHRoZSBjdXJyZW50CisJZGV2aWNlLgogCi0JUGFyYW1ldGVyczoKLQkJc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldglQb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdHVyZQotCQlzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBjb25maWd1cmF0aW9uCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKKwlzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBjb25maWd1cmF0aW9uCiAKLQlSZXR1cm5zOmludAkwID0gc3VjY2VzcworUmV0dXJuczppbnQJMCA9IHN1Y2Nlc3MKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwpAQCAtODk4LDcgKzkxMyw4IEBACiAJcmVzb3VyY2Vfc2l6ZV90IGlvX2FkZHJbNV0sIGlvYmFzZTsKIAl1bnNpZ25lZCBjaGFyIHBjaV9idXMsIHBjaV9zbG90LCBwY2lfZnVuYzsKIAotCXByaW50aygiaWNwX211bHRpIEVEQkc6IEJHTjogaWNwX211bHRpX2F0dGFjaCguLi4pXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJpY3BfbXVsdGkgRURCRzogQkdOOiBpY3BfbXVsdGlfYXR0YWNoKC4uLilcbiIpOwogCiAJLyogIEFsb2NhdGUgcHJpdmF0ZSBkYXRhIHN0b3JhZ2Ugc3BhY2UgKi8KIAlyZXQgPSBhbGxvY19wcml2YXRlKGRldiwgc2l6ZW9mKHN0cnVjdCBpY3BfbXVsdGlfcHJpdmF0ZSkpOwpAQCAtOTE2LDcgKzkzMiw4IEBACiAJCSAgICApOwogCX0KIAotCXByaW50aygiQW5uZSdzIGNvbWVkaSVkOiBpY3BfbXVsdGk6IGJvYXJkPSVzIiwgZGV2LT5taW5vciwKKwlwcmludGsoS0VSTl9XQVJOSU5HCisJICAgICAgICJBbm5lJ3MgY29tZWRpJWQ6IGljcF9tdWx0aTogYm9hcmQ9JXMiLCBkZXYtPm1pbm9yLAogCSAgICAgICB0aGlzX2JvYXJkLT5uYW1lKTsKIAogCWNhcmQgPSBzZWxlY3RfYW5kX2FsbG9jX3BjaV9jYXJkKFBDSV9WRU5ET1JfSURfSUNQLApAQCAtOTMwLDI0ICs5NDcsMjYgQEAKIAogCWlmICgocGNpX2NhcmRfZGF0YShjYXJkLCAmcGNpX2J1cywgJnBjaV9zbG90LCAmcGNpX2Z1bmMsICZpb19hZGRyWzBdLAogCQkJICAgJmlycSkpIDwgMCkgewotCQlwcmludGsoIiAtIENhbid0IGdldCBjb25maWd1cmF0aW9uIGRhdGEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIC0gQ2FuJ3QgZ2V0IGNvbmZpZ3VyYXRpb24gZGF0YSFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlpb2Jhc2UgPSBpb19hZGRyWzJdOwogCWRldnByaXYtPnBoeXNfaW9iYXNlID0gaW9iYXNlOwogCi0JcHJpbnRrKCIsIGI6czpmPSVkOiVkOiVkLCBpbz0weCU4bGx4IFxuIiwgcGNpX2J1cywgcGNpX3Nsb3QsIHBjaV9mdW5jLAorCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIiwgYjpzOmY9JWQ6JWQ6JWQsIGlvPTB4JThsbHggXG4iLCBwY2lfYnVzLCBwY2lfc2xvdCwgcGNpX2Z1bmMsCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaW9iYXNlKTsKIAogCWRldnByaXYtPmlvX2FkZHIgPSBpb3JlbWFwKGlvYmFzZSwgSUNQX01VTFRJX1NJWkUpOwogCiAJaWYgKGRldnByaXYtPmlvX2FkZHIgPT0gTlVMTCkgewotCQlwcmludGsoImlvcmVtYXAgZmFpbGVkLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvcmVtYXAgZmFpbGVkLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoIjB4JTA4bGx4IG1hcHBlZCB0byAlcCwgIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpb2Jhc2UsCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIjB4JTA4bGx4IG1hcHBlZCB0byAlcCwgIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylpb2Jhc2UsCiAJICAgICAgIGRldnByaXYtPmlvX2FkZHIpOwogI2VuZGlmCiAKQEAgLTk3NSwyMCArOTk0LDIwIEBACiAJCWlmIChpcnEpIHsKIAkJCWlmIChyZXF1ZXN0X2lycShpcnEsIGludGVycnVwdF9zZXJ2aWNlX2ljcF9tdWx0aSwKIAkJCQkJSVJRRl9TSEFSRUQsICJJbm92YSBJY3AgTXVsdGkiLCBkZXYpKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgICgiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICV1LCBESVNBQkxJTkcgSVQiLAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgInVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIERJU0FCTElORyBJVCIsCiAJCQkJICAgICBpcnEpOwogCQkJCWlycSA9IDA7CS8qIENhbid0IHVzZSBJUlEgKi8KIAkJCX0gZWxzZQotCQkJCXByaW50aygiLCBpcnE9JXUiLCBpcnEpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiwgaXJxPSV1IiwgaXJxKTsKIAkJfSBlbHNlCi0JCQlwcmludGsoIiwgSVJRIGRpc2FibGVkIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIsIElSUSBkaXNhYmxlZCIpOwogCX0gZWxzZQogCQlpcnEgPSAwOwogCiAJZGV2LT5pcnEgPSBpcnE7CiAKLQlwcmludGsoIi5cbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIi5cbiIpOwogCiAJc3ViZGV2ID0gMDsKIApAQCAtMTA2Myw3ICsxMDgyLDcgQEAKIAlkZXZwcml2LT52YWxpZCA9IDE7CiAKICNpZmRlZiBJQ1BfTVVMVElfRVhUREVCVUcKLQlwcmludGsoImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgImljcCBtdWx0aSBFREJHOiBFTkQ6IGljcF9tdWx0aV9hdHRhY2goLi4uKVxuIik7CiAjZW5kaWYKIAogCXJldHVybiAwOwpAQCAtMTA3MiwxNiArMTA5MSwxNiBAQAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JTmFtZToJaWNwX211bHRpX2RldGFjaAorTmFtZToJaWNwX211bHRpX2RldGFjaAogCi0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYWxsIHRoZSByZXNvdXJjZXMgdXNlZCBieSB0aGUgY3VycmVudAotCQlkZXZpY2UuCitEZXNjcmlwdGlvbjoKKwlUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFsbCB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnQKKwlkZXZpY2UuCiAKLQlQYXJhbWV0ZXJzOgotCQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2CVBvaW50ZXIgdG8gY3VycmVudCBkZXZpY2Ugc3RydWN0dXJlCitQYXJhbWV0ZXJzOgorCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYJUG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3R1cmUKIAotCVJldHVybnM6aW50CTAgPSBzdWNjZXNzCitSZXR1cm5zOmludAkwID0gc3VjY2VzcwogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2lpX3BjaTIwa2MuYwppbmRleCAyNGRmMjQ1Li5lMjZjMWI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWlfcGNpMjBrYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9paV9wY2kyMGtjLmMKQEAgLTIzLDcgKzIzLDggQEAKICAqCW5vIGV4dGVybiB0cmlnZ2VyIGltcGxlbWVudGVkCiAgKgogICoJTk9UIFdPUktJTkcgKGJ1dCBzb29uKSBvbmx5IDQgb24tYm9hcmQgZGlmZmVyZW50aWFsIGNoYW5uZWxzIHN1cHBvcnRlZAotICoJTk9UIFdPUktJTkcgKGJ1dCBzb29uKSBvbmx5IE9ORSBkaS1wb3J0IGFuZCBPTkUgZG8tcG9ydCBzdXBwb3J0ZWQgaW5zdGVhZCBvZiA0IGRpZ2l0YWwgcG9ydHMKKyAqCU5PVCBXT1JLSU5HIChidXQgc29vbikgb25seSBPTkUgZGktcG9ydCBhbmQgT05FIGRvLXBvcnQgc3VwcG9ydGVkCisgKgkJCSAgICAgICBpbnN0ZWFkIG9mIDQgZGlnaXRhbCBwb3J0cwogICoJZGktcG9ydCA9PSBQb3J0IDAKICAqCWRvLXBvcnQgPT0gUG9ydCAxCiAgKgpAQCAtNjMsMTcgKzY0LDE3IEBACiAKIG9wdGlvbnMgZm9yIFBDSS0yMDAwNk06CiAgIGZpcnN0OiAgIEFuYWxvZyBvdXRwdXQgY2hhbm5lbCAwIHJhbmdlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAwICBiaXBvbGFyIDEwICAoLTEwViAtLSArMTBWKQotICAgICAgICAgICAgIDEgIHVuaXBvbGFyIDEwICAoMFYgLS0gKzEwVikKLSAgICAgICAgICAgICAyICBiaXBvbGFyIDUgICgtNVYgLS0gNVYpCisJICAgICAwICBiaXBvbGFyIDEwICAoLTEwViAtLSArMTBWKQorCSAgICAgMSAgdW5pcG9sYXIgMTAgICgwViAtLSArMTBWKQorCSAgICAgMiAgYmlwb2xhciA1ICAoLTVWIC0tIDVWKQogICBzZWNvbmQ6ICBBbmFsb2cgb3V0cHV0IGNoYW5uZWwgMSByYW5nZSBjb25maWd1cmF0aW9uCiAKIG9wdGlvbnMgZm9yIFBDSS0yMDM0MU06CiAgIGZpcnN0OiAgIEFuYWxvZyBpbnB1dCBnYWluIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAwICAxCi0gICAgICAgICAgICAgMSAgMTAKLSAgICAgICAgICAgICAyICAxMDAKLSAgICAgICAgICAgICAzICAyMDAKKwkgICAgIDAgIDEKKwkgICAgIDEgIDEwCisJICAgICAyICAxMDAKKwkgICAgIDMgIDIwMAogKi8KIAogLyogWFhYIG5lZWRzIHRvIHVzZSBpb3JlbWFwKCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAyLjQga2VybmVscy4gIFNob3VsZCBhbHNvCkBAIC05NSwxMiArOTYsMTIgQEAKICNkZWZpbmUgUENJMjAwMDBfRElPXzMJCQkweGMxCiAjZGVmaW5lIFBDSTIwMDAwX0RJT19DT05UUk9MXzAxCQkweDgzCS8qIHBvcnQgMCwgMSBjb250cm9sICovCiAjZGVmaW5lIFBDSTIwMDAwX0RJT19DT05UUk9MXzIzCQkweGMzCS8qIHBvcnQgMiwgMyBjb250cm9sICovCi0jZGVmaW5lIFBDSTIwMDAwX0RJT19CVUZGRVIJCTB4ODIJLyogYnVmZmVyIGRpcmVjdGlvbiBhbmQgZW5hYmxlICovCisjZGVmaW5lIFBDSTIwMDAwX0RJT19CVUZGRVIJCTB4ODIJLyogYnVmZmVyIGRpcmVjdGlvbiAmIGVuYWJsZSAqLwogI2RlZmluZSBQQ0kyMDAwMF9ESU9fRU9DCQkweGVmCS8qIGV2ZW4gcG9ydCwgY29udHJvbCBvdXRwdXQgKi8KICNkZWZpbmUgUENJMjAwMDBfRElPX09PQwkJMHhmZAkvKiBvZGQgcG9ydCwgY29udHJvbCBvdXRwdXQgKi8KICNkZWZpbmUgUENJMjAwMDBfRElPX0VJQwkJMHg5MAkvKiBldmVuIHBvcnQsIGNvbnRyb2wgaW5wdXQgKi8KICNkZWZpbmUgUENJMjAwMDBfRElPX09JQwkJMHg4MgkvKiBvZGQgcG9ydCwgY29udHJvbCBpbnB1dCAqLwotI2RlZmluZSBESU9fQ0FORAkJCTB4MTIJLyogYW5kIGJpdCAxLCBiaXQgNCBvZiBjb250cm9sICovCisjZGVmaW5lIERJT19DQU5ECQkJMHgxMgkvKiBhbmQgYml0IDEgJiA0IG9mIGNvbnRyb2wgKi8KICNkZWZpbmUgRElPX0JFCQkJCTB4MDEJLyogYnVmZmVyOiBwb3J0IGVuYWJsZSAqLwogI2RlZmluZSBESU9fQk8JCQkJMHgwNAkvKiBidWZmZXI6IG91dHB1dCAqLwogI2RlZmluZSBESU9fQkkJCQkJMHgwNQkvKiBidWZmZXI6IGlucHV0ICovCkBAIC0xMzcsNyArMTM4LDggQEAKIAl2b2lkICppb2Jhc2U7CiAJc3RydWN0IHsKIAkJdm9pZCAqaW9iYXNlOwotCQljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYW9fcmFuZ2VfbGlzdFsyXTsJLyogcmFuZ2Ugb2YgY2hhbm5lbHMgb2YgYW8gbW9kdWxlICovCisJCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV9saXN0WzJdOworCQkJCQkvKiByYW5nZSBvZiBjaGFubmVscyBvZiBhbyBtb2R1bGUgKi8KIAkJdW5zaWduZWQgaW50IGxhc3RfZGF0YVsyXTsKIAl9IHBjaTIwMDA2OwogCXN0cnVjdCB7CkBAIC0yMjQsMTQgKzIyNiwxMyBAQAogCiAJLyogQ2hlY2sgUENJLTIwMDAxIEMtMkEgQ2FycmllciBCb2FyZCBJRCAqLwogCWlmICgocmVhZGIoZGV2cHJpdi0+aW9hZGRyKSAmIFBDSTIwMDAwX0lEKSAhPSBQQ0kyMDAwMF9JRCkgewotCQlwcmludGsoImNvbWVkaSVkOiBpaV9wY2kyMGtjIiwgZGV2LT5taW5vcik7Ci0JCXByaW50awotCQkgICAgKCIgUENJLTIwMDAxIEMtMkEgQ2FycmllciBCb2FyZCBhdCBiYXNlPTB4JXAgbm90IGZvdW5kICFcbiIsCi0JCSAgICAgZGV2cHJpdi0+aW9hZGRyKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29tZWRpJWQ6IGlpX3BjaTIwa2MgUENJLTIwMDAxIgorCQkgICAgICAgIiBDLTJBIENhcnJpZXIgQm9hcmQgYXQgYmFzZT0weCVwIG5vdCBmb3VuZCAhXG4iLAorCQkgICAgICAgZGV2LT5taW5vciwgZGV2cHJpdi0+aW9hZGRyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXByaW50aygiY29tZWRpJWQ6XG4iLCBkZXYtPm1pbm9yKTsKLQlwcmludGsoImlpX3BjaTIwa2M6IFBDSS0yMDAwMSBDLTJBIGF0IGJhc2U9MHglcFxuIiwgZGV2cHJpdi0+aW9hZGRyKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogaWlfcGNpMjBrYzogUENJLTIwMDAxIEMtMkEgYXQgYmFzZT0weCVwXG4iLAorCSAgICAgICBkZXYtPm1pbm9yLCBkZXZwcml2LT5pb2FkZHIpOwogCiAJZm9yIChpID0gMDsgaSA8IFBDSTIwMDAwX01PRFVMRVM7IGkrKykgewogCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgaTsKQEAgLTI0NCwyMSArMjQ1LDIzIEBACiAJCQkgICAgZGV2cHJpdi0+aW9hZGRyICsgKGkgKyAxKSAqIFBDSTIwMDAwX09GRlNFVDsKIAkJCXBjaTIwMDA2X2luaXQoZGV2LCBzLCBpdC0+b3B0aW9uc1syICogaSArIDJdLAogCQkJCSAgICAgIGl0LT5vcHRpb25zWzIgKiBpICsgM10pOwotCQkJcHJpbnRrKCJjb21lZGklZDogaWlfcGNpMjBrYyIsIGRldi0+bWlub3IpOwotCQkJcHJpbnRrKCIgUENJLTIwMDA2IG1vZHVsZSBpbiBzbG90ICVkIFxuIiwgaSArIDEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIKKwkJCSAgICAgICAiaWlfcGNpMjBrYyBQQ0ktMjAwMDYgbW9kdWxlIGluIHNsb3QgJWQgXG4iLAorCQkJICAgICAgIGRldi0+bWlub3IsIGkgKyAxKTsKIAkJCWJyZWFrOwogCQljYXNlIFBDSTIwMzQxX0lEOgogCQkJc2RwLT5wY2kyMDM0MS5pb2Jhc2UgPQogCQkJICAgIGRldnByaXYtPmlvYWRkciArIChpICsgMSkgKiBQQ0kyMDAwMF9PRkZTRVQ7CiAJCQlwY2kyMDM0MV9pbml0KGRldiwgcywgaXQtPm9wdGlvbnNbMiAqIGkgKyAyXSwKIAkJCQkgICAgICBpdC0+b3B0aW9uc1syICogaSArIDNdKTsKLQkJCXByaW50aygiY29tZWRpJWQ6IGlpX3BjaTIwa2MiLCBkZXYtPm1pbm9yKTsKLQkJCXByaW50aygiIFBDSS0yMDM0MSBtb2R1bGUgaW4gc2xvdCAlZCBcbiIsIGkgKyAxKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiCisJCQkgICAgICAgImlpX3BjaTIwa2MgUENJLTIwMzQxIG1vZHVsZSBpbiBzbG90ICVkIFxuIiwKKwkJCSAgICAgICBkZXYtPm1pbm9yLCBpICsgMSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXByaW50awotCQkJICAgICgiaWlfcGNpMjBrYzogdW5rbm93biBtb2R1bGUgY29kZSAweCUwMnggaW4gc2xvdCAlZDogbW9kdWxlIGRpc2FibGVkXG4iLAotCQkJICAgICBpZCwgaSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpaV9wY2kyMGtjOiB1bmtub3duIG1vZHVsZSAiCisJCQkgICAgICAgImNvZGUgMHglMDJ4IGluIHNsb3QgJWQ6IG1vZHVsZSBkaXNhYmxlZFxuIiwKKwkJCSAgICAgICBpZCwgaSk7IC8qIFhYWCB0aGlzIGxvb2tzIGxpa2UgYSBidWchIGkgKyAxID8/ICovCiAJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBQQ0kyMHh4eF9FTVBUWV9JRDoKIAkJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CkBAIC0yNzQsNyArMjc3LDcgQEAKIAogc3RhdGljIGludCBwY2kyMHh4eF9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKLQlwcmludGsoImNvbWVkaSVkOiBwY2kyMHh4eDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogcGNpMjB4eHg6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzOSw3ICszNDIsOCBAQAogCXVuc2lnbmVkIGludCBib2FyZGRhdGE7CiAKIAlzZHAtPnBjaTIwMDA2Lmxhc3RfZGF0YVtDUl9DSEFOKGluc24tPmNoYW5zcGVjKV0gPSBkYXRhWzBdOwotCWJvYXJkZGF0YSA9ICgoKHVuc2lnbmVkIGludClkYXRhWzBdICsgMHg4MDAwKSAmIDB4ZmZmZik7CS8qIGNvbWVkaS1kYXRhIC0+IGJvYXJkLWRhdGEgKi8KKwlib2FyZGRhdGEgPSAoKCh1bnNpZ25lZCBpbnQpZGF0YVswXSArIDB4ODAwMCkgJiAweGZmZmYpOworCQkJCQkJLyogY29tZWRpLWRhdGEgLT4gYm9hcmQtZGF0YSAqLwogCWxvID0gKGJvYXJkZGF0YSAmIDB4ZmYpOwogCWhpID0gKChib2FyZGRhdGEgPj4gOCkgJiAweGZmKTsKIApAQCAtMzU1LDcgKzM1OSw4IEBACiAJCXdyaXRlYigweDAwLCBzZHAtPmlvYmFzZSArIFBDSTIwMDA2X1NUUk9CRTEpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIiBjb21lZGklZDogcGNpMjB4eHg6IGFvIGNoYW5uZWwgRXJyb3IhXG4iLCBkZXYtPm1pbm9yKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiBjb21lZGklZDogcGNpMjB4eHg6IGFvIGNoYW5uZWwgRXJyb3IhXG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zNzMsOCArMzc4LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX2JpcG9sYXIwXzUgPSB7IDEsIHtCSVBfUkFOR0UoMC41KX0gfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wNSA9IHsgMSwge0JJUF9SQU5HRSgwLjA1KX0gfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV9iaXBvbGFyMF8wMjUgPQotICAgIHsgMSwge0JJUF9SQU5HRSgwLjAyNSl9IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfYmlwb2xhcjBfMDI1ID0geyAxLCB7QklQX1JBTkdFKDAuMDI1KX0gfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpjb25zdCBwY2kyMDM0MV9yYW5nZXNbXSA9IHsKIAkmcmFuZ2VfYmlwb2xhcjUsCkBAIC00NDcsOSArNDUxLDEwIEBACiAJCQllb2MgPSByZWFkYihzZHAtPmlvYmFzZSArIFBDSTIwMzQxX1NUQVRVU19SRUcpOwogCQl9CiAJCWlmIChqID49IDEwMCkgewotCQkJcHJpbnRrCi0JCQkgICAgKCJjb21lZGklZDogIHBjaTIweHh4OiBBSSBpbnRlcnJ1cHQgY2hhbm5lbCAlaSBwb2xsaW5nIGV4aXQgIVxuIiwKLQkJCSAgICAgZGV2LT5taW5vciwgaSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImNvbWVkaSVkOiAgcGNpMjB4eHg6ICIKKwkJCSAgICAgICAiQUkgaW50ZXJydXB0IGNoYW5uZWwgJWkgcG9sbGluZyBleGl0ICFcbiIsCisJCQkgICAgICAgZGV2LT5taW5vciwgaSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlsbyA9IHJlYWRiKHNkcC0+aW9iYXNlICsgUENJMjAzNDFfTERBVEEpOwpAQCAtNTAyLDIwICs1MDcsMTggQEAKIAlpbnQgbWFzaywgYml0czsKIAogCW1hc2sgPSAxIDw8IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCWlmIChtYXNrICYgMHgwMDAwMDBmZikgeworCWlmIChtYXNrICYgMHgwMDAwMDBmZikKIAkJYml0cyA9IDB4MDAwMDAwZmY7Ci0JfSBlbHNlIGlmIChtYXNrICYgMHgwMDAwZmYwMCkgeworCWVsc2UgaWYgKG1hc2sgJiAweDAwMDBmZjAwKQogCQliaXRzID0gMHgwMDAwZmYwMDsKLQl9IGVsc2UgaWYgKG1hc2sgJiAweDAwZmYwMDAwKSB7CisJZWxzZSBpZiAobWFzayAmIDB4MDBmZjAwMDApCiAJCWJpdHMgPSAweDAwZmYwMDAwOwotCX0gZWxzZSB7CisJZWxzZQogCQliaXRzID0gMHhmZjAwMDAwMDsKLQl9Ci0JaWYgKGRhdGFbMF0pIHsKKwlpZiAoZGF0YVswXSkKIAkJcy0+aW9fYml0cyB8PSBiaXRzOwotCX0gZWxzZSB7CisJZWxzZQogCQlzLT5pb19iaXRzICY9IH5iaXRzOwotCX0KIAlwY2kyMHh4eF9kaW9fY29uZmlnKGRldiwgcyk7CiAKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCmluZGV4IGMxNDVlODIuLjczYjA0NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYwpAQCAtMTkyLDEyICsxOTIsMTQgQEAKIAkJCX0KIAkJfQogCX0KLQlwcmludGsoImNvbWVkaSVkOiBubyBzdXBwb3J0ZWQgYm9hcmQgZm91bmQhIChyZXEuIGJ1cy9zbG90OiAlZC8lZClcbiIsCisJcHJpbnRrKEtFUk5fV0FSTklORworCSAgICAgICAiY29tZWRpJWQ6IG5vIHN1cHBvcnRlZCBib2FyZCBmb3VuZCEgKHJlcS4gYnVzL3Nsb3Q6ICVkLyVkKVxuIiwKIAkgICAgICAgZGV2LT5taW5vciwgaXQtPm9wdGlvbnNbMF0sIGl0LT5vcHRpb25zWzFdKTsKIAlyZXR1cm4gLUVJTzsKIAogZm91bmQ6Ci0JcHJpbnRrKCJjb21lZGklZDogZm91bmQgJXMgYXQgUENJIGJ1cyAlZCwgc2xvdCAlZFxuIiwgZGV2LT5taW5vciwKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICJjb21lZGklZDogZm91bmQgJXMgYXQgUENJIGJ1cyAlZCwgc2xvdCAlZFxuIiwgZGV2LT5taW5vciwKIAkgICAgICAgYm9hcmQtPm5hbWUsIHBjaV9kZXZpY2UtPmJ1cy0+bnVtYmVyLAogCSAgICAgICBQQ0lfU0xPVChwY2lfZGV2aWNlLT5kZXZmbikpOwogCWRldnByaXYtPnBjaWRldiA9IHBjaV9kZXZpY2U7CkBAIC0yMDYsOSArMjA4LDkgQEAKIAkvKiBlbmFibGUgUENJIGRldmljZSBhbmQgcmVxdWVzdCByZWdpb25zICovCiAJZXJyb3IgPSBjb21lZGlfcGNpX2VuYWJsZShwY2lfZGV2aWNlLCBDTlRfRFJJVkVSX05BTUUpOwogCWlmIChlcnJvciA8IDApIHsKLQkJcHJpbnRrCi0JCSAgICAoImNvbWVkaSVkOiBmYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UgYW5kIHJlcXVlc3QgcmVnaW9ucyFcbiIsCi0JCSAgICAgZGV2LT5taW5vcik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSVkOiAiCisJCSAgICAgICAiZmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlIGFuZCByZXF1ZXN0IHJlZ2lvbnMhXG4iLAorCQkgICAgICAgZGV2LT5taW5vcik7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTIzOSw3ICsyNDEsOCBAQAogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyAweDIwKTsKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgMHg0MCk7CiAKLQlwcmludGsoImNvbWVkaSVkOiAiIENOVF9EUklWRVJfTkFNRSAiIGF0dGFjaGVkLlxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICIgQ05UX0RSSVZFUl9OQU1FICIgYXR0YWNoZWQuXG4iLAorCSAgICAgICBkZXYtPm1pbm9yKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ4LDExICsyNTEsMTEgQEAKIHN0YXRpYyBpbnQgY250X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWlmIChkZXZwcml2ICYmIGRldnByaXYtPnBjaWRldikgewotCQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwkJaWYgKGRldi0+aW9iYXNlKQogCQkJY29tZWRpX3BjaV9kaXNhYmxlKGRldnByaXYtPnBjaWRldik7Ci0JCX0KIAkJcGNpX2Rldl9wdXQoZGV2cHJpdi0+cGNpZGV2KTsKIAl9Ci0JcHJpbnRrKCJjb21lZGklZDogIiBDTlRfRFJJVkVSX05BTUUgIiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiAiIENOVF9EUklWRVJfTkFNRSAiIHJlbW92ZVxuIiwKKwkgICAgICAgZGV2LT5taW5vcik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKaW5kZXggNjA3OTkxMy4uOGI5ZmEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwpAQCAtODQwLDcgKzg0MCw3IEBACiAJCSAgICAgICAiY29tZWRpJWQ6IG1lNDAwMDogeGlsaW54X2Rvd25sb2FkKCk6IERPTkUgZmxhZyBpcyBub3Qgc2V0XG4iLAogCQkgICAgICAgZGV2LT5taW5vcik7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBEb3dubG9hZCBub3Qgc3VjY2VzZnVsXG4iLAorCQkgICAgICAgImNvbWVkaSVkOiBtZTQwMDA6IHhpbGlueF9kb3dubG9hZCgpOiBEb3dubG9hZCBub3Qgc3VjY2Vzc2Z1bFxuIiwKIAkJICAgICAgIGRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVJTzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYwppbmRleCBlNjUyZjNiLi4xODhmNTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKQEAgLTY0LDYgKzY0LDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RydWN0IG1pdGVfc3RydWN0ICptaXRlX2RldmljZXM7CitFWFBPUlRfU1lNQk9MKG1pdGVfZGV2aWNlcyk7CiAKICNkZWZpbmUgVE9QX09GX1BBR0UoeCkgKCh4KXwofihQQUdFX01BU0spKSkKIApAQCAtODAsNyArODEsNyBAQAogCiAJCQltaXRlID0ga3phbGxvYyhzaXplb2YoKm1pdGUpLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghbWl0ZSkgewotCQkJCXByaW50aygibWl0ZTogYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAibWl0ZTogYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQkJCXBjaV9kZXZfcHV0KHBjaWRldik7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtOTksMTQgKzEwMCwxNCBAQAogCiBzdGF0aWMgdm9pZCBkdW1wX2NoaXBfc2lnbmF0dXJlKHUzMiBjc2lncl9iaXRzKQogewotCXByaW50awotCSAgICAoIm1pdGU6IHZlcnNpb24gPSAlaSwgdHlwZSA9ICVpLCBtaXRlIG1vZGUgPSAlaSwgaW50ZXJmYWNlIG1vZGUgPSAlaVxuIiwKLQkgICAgIG1pdGVfY3NpZ3JfdmVyc2lvbihjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl90eXBlKGNzaWdyX2JpdHMpLAotCSAgICAgbWl0ZV9jc2lncl9tbW9kZShjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl9pbW9kZShjc2lncl9iaXRzKSk7Ci0JcHJpbnRrCi0JICAgICgibWl0ZTogbnVtIGNoYW5uZWxzID0gJWksIHdyaXRlIHBvc3QgZmlmbyBkZXB0aCA9ICVpLCB3aW5zID0gJWksIGlvd2lucyA9ICVpXG4iLAotCSAgICAgbWl0ZV9jc2lncl9kbWFjKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3dwZGVwKGNzaWdyX2JpdHMpLAotCSAgICAgbWl0ZV9jc2lncl93aW5zKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX2lvd2lucyhjc2lncl9iaXRzKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAibWl0ZTogdmVyc2lvbiA9ICVpLCB0eXBlID0gJWksIG1pdGUgbW9kZSA9ICVpLCIKKwkgICAgICAgImludGVyZmFjZSBtb2RlID0gJWlcbiIsCisJICAgICAgIG1pdGVfY3NpZ3JfdmVyc2lvbihjc2lncl9iaXRzKSwgbWl0ZV9jc2lncl90eXBlKGNzaWdyX2JpdHMpLAorCSAgICAgICBtaXRlX2NzaWdyX21tb2RlKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX2ltb2RlKGNzaWdyX2JpdHMpKTsKKwlwcmludGsoS0VSTl9JTkZPICJtaXRlOiBudW0gY2hhbm5lbHMgPSAlaSwgd3JpdGUgcG9zdCBmaWZvIGRlcHRoID0gJWksIgorCSAgICAgICAid2lucyA9ICVpLCBpb3dpbnMgPSAlaVxuIiwKKwkgICAgICAgbWl0ZV9jc2lncl9kbWFjKGNzaWdyX2JpdHMpLCBtaXRlX2NzaWdyX3dwZGVwKGNzaWdyX2JpdHMpLAorCSAgICAgICBtaXRlX2NzaWdyX3dpbnMoY3NpZ3JfYml0cyksIG1pdGVfY3NpZ3JfaW93aW5zKGNzaWdyX2JpdHMpKTsKIH0KIAogdW5zaWduZWQgbWl0ZV9maWZvX3NpemUoc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLCB1bnNpZ25lZCBjaGFubmVsKQpAQCAtMTI2LDcgKzEyNyw3IEBACiAJdW5zaWduZWQgdW5rbm93bl9kbWFfYnVyc3RfYml0czsKIAogCWlmIChjb21lZGlfcGNpX2VuYWJsZShtaXRlLT5wY2lkZXYsICJtaXRlIikpIHsKLQkJcHJpbnRrKCJlcnJvciBlbmFibGluZyBtaXRlIGFuZCByZXF1ZXN0aW5nIGlvIHJlZ2lvbnNcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGVuYWJsaW5nIG1pdGUgYW5kIHJlcXVlc3RpbmcgaW8gcmVnaW9uc1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAlwY2lfc2V0X21hc3RlcihtaXRlLT5wY2lkZXYpOwpAQCAtMTM1LDI3ICsxMzYsMzAgQEAKIAltaXRlLT5taXRlX3BoeXNfYWRkciA9IGFkZHI7CiAJbWl0ZS0+bWl0ZV9pb19hZGRyID0gaW9yZW1hcChhZGRyLCBQQ0lfTUlURV9TSVpFKTsKIAlpZiAoIW1pdGUtPm1pdGVfaW9fYWRkcikgewotCQlwcmludGsoImZhaWxlZCB0byByZW1hcCBtaXRlIGlvIG1lbW9yeSBhZGRyZXNzXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVtYXAgbWl0ZSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwcmludGsoIk1JVEU6MHglMDhsbHggbWFwcGVkIHRvICVwICIsCisJcHJpbnRrKEtFUk5fSU5GTyAiTUlURToweCUwOGxseCBtYXBwZWQgdG8gJXAgIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltaXRlLT5taXRlX3BoeXNfYWRkciwgbWl0ZS0+bWl0ZV9pb19hZGRyKTsKIAogCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQobWl0ZS0+cGNpZGV2LCAxKTsKIAltaXRlLT5kYXFfcGh5c19hZGRyID0gYWRkcjsKIAlsZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKG1pdGUtPnBjaWRldiwgMSk7Ci0JLyogIEluIGNhc2Ugb2YgYSA2NjB4IGJvYXJkLCBEQVEgc2l6ZSBpcyA4ayBpbnN0ZWFkIG9mIDRrIChzZWUgYXMgc2hvd24gYnkgbHNwY2kgb3V0cHV0KSAqLworCS8qCisJICogSW4gY2FzZSBvZiBhIDY2MHggYm9hcmQsIERBUSBzaXplIGlzIDhrIGluc3RlYWQgb2YgNGsKKwkgKiAoc2VlIGFzIHNob3duIGJ5IGxzcGNpIG91dHB1dCkKKwkgKi8KIAltaXRlLT5kYXFfaW9fYWRkciA9IGlvcmVtYXAobWl0ZS0+ZGFxX3BoeXNfYWRkciwgbGVuZ3RoKTsKIAlpZiAoIW1pdGUtPmRhcV9pb19hZGRyKSB7Ci0JCXByaW50aygiZmFpbGVkIHRvIHJlbWFwIGRhcSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlbWFwIGRhcSBpbyBtZW1vcnkgYWRkcmVzc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlwcmludGsoIkRBUToweCUwOGxseCBtYXBwZWQgdG8gJXBcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiREFROjB4JTA4bGx4IG1hcHBlZCB0byAlcFxuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyltaXRlLT5kYXFfcGh5c19hZGRyLCBtaXRlLT5kYXFfaW9fYWRkcik7CiAKIAlpZiAodXNlX2lvZHdic3JfMSkgewogCQl3cml0ZWwoMCwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSKTsKLQkJcHJpbnRrKCJtaXRlOiB1c2luZyBJL08gV2luZG93IEJhc2UgU2l6ZSByZWdpc3RlciAxXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibWl0ZTogdXNpbmcgSS9PIFdpbmRvdyBCYXNlIFNpemUgcmVnaXN0ZXIgMVxuIik7CiAJCXdyaXRlbChtaXRlLT5kYXFfcGh5c19hZGRyIHwgV0VOQUIgfAogCQkgICAgICAgTUlURV9JT0RXQlNSXzFfV1NJWkVfYml0cyhsZW5ndGgpLAogCQkgICAgICAgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9JT0RXQlNSXzEpOwpAQCAtMTY0LDExICsxNjgsMTIgQEAKIAkJd3JpdGVsKG1pdGUtPmRhcV9waHlzX2FkZHIgfCBXRU5BQiwKIAkJICAgICAgIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfSU9EV0JTUik7CiAJfQotCS8qIG1ha2Ugc3VyZSBkbWEgYnVyc3RzIHdvcmsuICBJIGdvdCB0aGlzIGZyb20gcnVubmluZyBhIGJ1cyBhbmFseXplcgotCSAgIG9uIGEgcHhpLTYyODEgYW5kIGEgcHhpLTY3MTMuICA2NzEzIHBvd2VyZWQgdXAgd2l0aCByZWdpc3RlciB2YWx1ZQotCSAgIG9mIDB4NjFmIGFuZCBidXJzdHMgd29ya2VkLiAgNjI4MSBwb3dlcmVkIHVwIHdpdGggcmVnaXN0ZXIgdmFsdWUgb2YKLQkgICAweDFmIGFuZCBidXJzdHMgZGlkbid0IHdvcmsuICBUaGUgTkkgd2luZG93cyBkcml2ZXIgcmVhZHMgdGhlIHJlZ2lzdGVyLAotCSAgIHRoZW4gZG9lcyBhIGJpdHdpc2Utb3Igb2YgMHg2MDAgd2l0aCBpdCBhbmQgd3JpdGVzIGl0IGJhY2suCisJLyoKKwkgKiBtYWtlIHN1cmUgZG1hIGJ1cnN0cyB3b3JrLiBJIGdvdCB0aGlzIGZyb20gcnVubmluZyBhIGJ1cyBhbmFseXplcgorCSAqIG9uIGEgcHhpLTYyODEgYW5kIGEgcHhpLTY3MTMuIDY3MTMgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlCisJICogb2YgMHg2MWYgYW5kIGJ1cnN0cyB3b3JrZWQuIDYyODEgcG93ZXJlZCB1cCB3aXRoIHJlZ2lzdGVyIHZhbHVlIG9mCisJICogMHgxZiBhbmQgYnVyc3RzIGRpZG4ndCB3b3JrLiBUaGUgTkkgd2luZG93cyBkcml2ZXIgcmVhZHMgdGhlCisJICogcmVnaXN0ZXIsIHRoZW4gZG9lcyBhIGJpdHdpc2Utb3Igb2YgMHg2MDAgd2l0aCBpdCBhbmQgd3JpdGVzIGl0IGJhY2suCiAJICovCiAJdW5rbm93bl9kbWFfYnVyc3RfYml0cyA9CiAJICAgIHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfVU5LTk9XTl9ETUFfQlVSU1RfUkVHKTsKQEAgLTE3OSw5ICsxODQsOSBAQAogCWNzaWdyX2JpdHMgPSByZWFkbChtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX0NTSUdSKTsKIAltaXRlLT5udW1fY2hhbm5lbHMgPSBtaXRlX2NzaWdyX2RtYWMoY3NpZ3JfYml0cyk7CiAJaWYgKG1pdGUtPm51bV9jaGFubmVscyA+IE1BWF9NSVRFX0RNQV9DSEFOTkVMUykgewotCQlwcmludGsKLQkJICAgICgibWl0ZTogYnVnPyBjaGlwIGNsYWltcyB0byBoYXZlICVpIGRtYSBjaGFubmVscy4gIFNldHRpbmcgdG8gJWkuXG4iLAotCQkgICAgIG1pdGUtPm51bV9jaGFubmVscywgTUFYX01JVEVfRE1BX0NIQU5ORUxTKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWl0ZTogYnVnPyBjaGlwIGNsYWltcyB0byBoYXZlICVpIGRtYSAiCisJCSAgICAgICAiY2hhbm5lbHMuIFNldHRpbmcgdG8gJWkuXG4iLAorCQkgICAgICAgbWl0ZS0+bnVtX2NoYW5uZWxzLCBNQVhfTUlURV9ETUFfQ0hBTk5FTFMpOwogCQltaXRlLT5udW1fY2hhbm5lbHMgPSBNQVhfTUlURV9ETUFfQ0hBTk5FTFM7CiAJfQogCWR1bXBfY2hpcF9zaWduYXR1cmUoY3NpZ3JfYml0cyk7CkBAIC0xOTQsMTYgKzE5OSwxOCBAQAogCQkgICAgICAgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9DSENSKGkpKTsKIAl9CiAJbWl0ZS0+Zmlmb19zaXplID0gbWl0ZV9maWZvX3NpemUobWl0ZSwgMCk7Ci0JcHJpbnRrKCJtaXRlOiBmaWZvIHNpemUgaXMgJWkuXG4iLCBtaXRlLT5maWZvX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gIm1pdGU6IGZpZm8gc2l6ZSBpcyAlaS5cbiIsIG1pdGUtPmZpZm9fc2l6ZSk7CiAJbWl0ZS0+dXNlZCA9IDE7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9zZXR1cDIpOwogCiBpbnQgbWl0ZV9zZXR1cChzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUpCiB7CiAJcmV0dXJuIG1pdGVfc2V0dXAyKG1pdGUsIDApOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3NldHVwKTsKIAogdm9pZCBtaXRlX2NsZWFudXAodm9pZCkKIHsKQEAgLTIzOCwyMiArMjQ1LDIzIEBACiAKIAltaXRlLT51c2VkID0gMDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV91bnNldHVwKTsKIAogdm9pZCBtaXRlX2xpc3RfZGV2aWNlcyh2b2lkKQogewogCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwgKm5leHQ7CiAKLQlwcmludGsoIkF2YWlsYWJsZSBOSSBkZXZpY2UgSURzOiIpOworCXByaW50ayhLRVJOX0lORk8gIkF2YWlsYWJsZSBOSSBkZXZpY2UgSURzOiIpOwogCWlmIChtaXRlX2RldmljZXMpCiAJCWZvciAobWl0ZSA9IG1pdGVfZGV2aWNlczsgbWl0ZTsgbWl0ZSA9IG5leHQpIHsKIAkJCW5leHQgPSBtaXRlLT5uZXh0OwotCQkJcHJpbnRrKCIgMHglMDR4IiwgbWl0ZV9kZXZpY2VfaWQobWl0ZSkpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiIDB4JTA0eCIsIG1pdGVfZGV2aWNlX2lkKG1pdGUpKTsKIAkJCWlmIChtaXRlLT51c2VkKQotCQkJCXByaW50aygiKHVzZWQpIik7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiKHVzZWQpIik7CiAJCX0KLQlwcmludGsoIlxuIik7Ci0KKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2xpc3RfZGV2aWNlcyk7CiAKIHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKHN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZSwKIAkJCQkJCSAgIHN0cnVjdApAQCAtMjY1LDcgKzI3Myw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbWl0ZV9jaGFubmVsICpjaGFubmVsID0gTlVMTDsKIAotCS8qICBzcGluIGxvY2sgc28gbWl0ZV9yZWxlYXNlX2NoYW5uZWwgY2FuIGJlIGNhbGxlZCBzYWZlbHkgZnJvbSBpbnRlcnJ1cHRzICovCisJLyogc3BpbiBsb2NrIHNvIG1pdGVfcmVsZWFzZV9jaGFubmVsIGNhbiBiZSBjYWxsZWQgc2FmZWx5CisJICogZnJvbSBpbnRlcnJ1cHRzCisJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1pdGUtPmxvY2ssIGZsYWdzKTsKIAlmb3IgKGkgPSBtaW5fY2hhbm5lbDsgaSA8PSBtYXhfY2hhbm5lbDsgKytpKSB7CiAJCWlmIChtaXRlLT5jaGFubmVsX2FsbG9jYXRlZFtpXSA9PSAwKSB7CkBAIC0yNzgsNiArMjg4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNoYW5uZWw7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKTsKIAogdm9pZCBtaXRlX3JlbGVhc2VfY2hhbm5lbChzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC0yODksOCArMzAwLDEwIEBACiAJaWYgKG1pdGUtPmNoYW5uZWxfYWxsb2NhdGVkW21pdGVfY2hhbi0+Y2hhbm5lbF0pIHsKIAkJbWl0ZV9kbWFfZGlzYXJtKG1pdGVfY2hhbik7CiAJCW1pdGVfZG1hX3Jlc2V0KG1pdGVfY2hhbik7Ci0vKiBkaXNhYmxlIGFsbCBjaGFubmVsJ3MgaW50ZXJydXB0cyAoZG8gaXQgYWZ0ZXIgZGlzYXJtL3Jlc2V0IHNvCi1NSVRFX0NIQ1IgcmVnIGlzbid0IGNoYW5nZWQgd2hpbGUgZG1hIGlzIHN0aWxsIGFjdGl2ZSEpICovCisJLyoKKwkgKiBkaXNhYmxlIGFsbCBjaGFubmVsJ3MgaW50ZXJydXB0cyAoZG8gaXQgYWZ0ZXIgZGlzYXJtL3Jlc2V0IHNvCisJICogTUlURV9DSENSIHJlZyBpc24ndCBjaGFuZ2VkIHdoaWxlIGRtYSBpcyBzdGlsbCBhY3RpdmUhKQorCSAqLwogCQl3cml0ZWwoQ0hDUl9DTFJfRE1BX0lFIHwgQ0hDUl9DTFJfTElOS1BfSUUgfAogCQkgICAgICAgQ0hDUl9DTFJfU0FSX0lFIHwgQ0hDUl9DTFJfRE9ORV9JRSB8CiAJCSAgICAgICBDSENSX0NMUl9NUkRZX0lFIHwgQ0hDUl9DTFJfRFJEWV9JRSB8CkBAIC0zMDIsNiArMzE1LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3JlbGVhc2VfY2hhbm5lbCk7CiAKIHZvaWQgbWl0ZV9kbWFfYXJtKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTMxMCw4ICszMjQsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJTURQUklOVEsoIm1pdGVfZG1hX2FybSBjaCVpXG4iLCBjaGFubmVsKTsKLQkvKiBtZW1vcnkgYmFycmllciBpcyBpbnRlbmRlZCB0byBpbnN1cmUgYW55IHR3aWRkbGluZyB3aXRoIHRoZSBidWZmZXIKLQkgICBpcyBkb25lIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBtaXRlIHRvIGFybSBkbWEgdHJhbnNmZXIgKi8KKwkvKgorCSAqIG1lbW9yeSBiYXJyaWVyIGlzIGludGVuZGVkIHRvIGluc3VyZSBhbnkgdHdpZGRsaW5nIHdpdGggdGhlIGJ1ZmZlcgorCSAqIGlzIGRvbmUgYmVmb3JlIHdyaXRpbmcgdG8gdGhlIG1pdGUgdG8gYXJtIGRtYSB0cmFuc2ZlcgorCSAqLwogCXNtcF9tYigpOwogCS8qIGFybSAqLwogCWNob3IgPSBDSE9SX1NUQVJUOwpAQCAtMzIyLDYgKzMzOCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWl0ZS0+bG9jaywgZmxhZ3MpOwogLyogICAgICAgbWl0ZV9kbWFfdGNyKG1pdGUsIGNoYW5uZWwpOyAqLwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2RtYV9hcm0pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM1NCw3ICszNzEsNyBAQAogCQkJICAgICAgIG5fbGlua3MgKiBzaXplb2Yoc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3IpLAogCQkJICAgICAgICZyaW5nLT5kZXNjcmlwdG9yc19kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyaW5nLT5kZXNjcmlwdG9ycykgewotCQlwcmludGsoIm1pdGU6IHJpbmcgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaXRlOiByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlyaW5nLT5uX2xpbmtzID0gbl9saW5rczsKQEAgLTM3MCwxMSArMzg3LDE0IEBACiAJfQogCXJpbmctPmRlc2NyaXB0b3JzW25fbGlua3MgLSAxXS5uZXh0ID0KIAkgICAgY3B1X3RvX2xlMzIocmluZy0+ZGVzY3JpcHRvcnNfZG1hX2FkZHIpOwotCS8qIGJhcnJpZXIgaXMgbWVhbnQgdG8gaW5zdXJlIHRoYXQgYWxsIHRoZSB3cml0ZXMgdG8gdGhlIGRtYSBkZXNjcmlwdG9ycwotCSAgIGhhdmUgY29tcGxldGVkIGJlZm9yZSB0aGUgZG1hIGNvbnRyb2xsZXIgaXMgY29tbWFuZGVkIHRvIHJlYWQgdGhlbSAqLworCS8qCisJICogYmFycmllciBpcyBtZWFudCB0byBpbnN1cmUgdGhhdCBhbGwgdGhlIHdyaXRlcyB0byB0aGUgZG1hIGRlc2NyaXB0b3JzCisJICogaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHRoZSBkbWEgY29udHJvbGxlciBpcyBjb21tYW5kZWQgdG8gcmVhZCB0aGVtCisJICovCiAJc21wX3dtYigpOwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2J1Zl9jaGFuZ2UpOwogCiB2b2lkIG1pdGVfcHJlcF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAogCQkgICB1bnNpZ25lZCBpbnQgbnVtX2RldmljZV9iaXRzLCB1bnNpZ25lZCBpbnQgbnVtX21lbW9yeV9iaXRzKQpAQCAtMzk1LDE2ICs0MTUsMTkgQEAKIAkgKiBMaW5rIENvbXBsZXRlIEludGVycnVwdDogaW50ZXJydXB0IGV2ZXJ5IHRpbWUgYSBsaW5rCiAJICogaW4gTUlURV9SSU5HIGlzIGNvbXBsZXRlZC4gVGhpcyBjYW4gZ2VuZXJhdGUgYSBsb3Qgb2YKIAkgKiBleHRyYSBpbnRlcnJ1cHRzLCBidXQgcmlnaHQgbm93IHdlIHVwZGF0ZSB0aGUgdmFsdWVzCi0JICogb2YgYnVmX2ludF9wdHIgYW5kIGJ1Zl9pbnRfY291bnQgYXQgZWFjaCBpbnRlcnJ1cHQuICBBCisJICogb2YgYnVmX2ludF9wdHIgYW5kIGJ1Zl9pbnRfY291bnQgYXQgZWFjaCBpbnRlcnJ1cHQuIEEKIAkgKiBiZXR0ZXIgbWV0aG9kIGlzIHRvIHBvbGwgdGhlIE1JVEUgYmVmb3JlIGVhY2ggdXNlcgogCSAqICJyZWFkKCkiIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZS4KIAkgKi8KIAljaGNyIHw9IENIQ1JfU0VUX0xDX0lFOwogCWlmIChudW1fbWVtb3J5X2JpdHMgPT0gMzIgJiYgbnVtX2RldmljZV9iaXRzID09IDE2KSB7Ci0JCS8qIERvaW5nIGEgY29tYmluZWQgMzIgYW5kIDE2IGJpdCBieXRlc3dhcCBnZXRzIHRoZSAxNiBiaXQgc2FtcGxlcyBpbnRvIHRoZSBmaWZvIGluIHRoZSByaWdodCBvcmRlci4KLQkJICAgVGVzdGVkIGRvaW5nIDMyIGJpdCBtZW1vcnkgdG8gMTYgYml0IGRldmljZSB0cmFuc2ZlcnMgdG8gdGhlIGFuYWxvZyBvdXQgb2YgYSBweGktNjI4MSwKLQkJICAgd2hpY2ggaGFzIG1pdGUgdmVyc2lvbiA9IDEsIHR5cGUgPSA0LiAgVGhpcyBhbHNvIHdvcmtzIGZvciBkbWEgcmVhZHMgZnJvbSB0aGUgY291bnRlcnMKLQkJICAgb24gZS1zZXJpZXMgYm9hcmRzLiAgKi8KKwkJLyoKKwkJICogRG9pbmcgYSBjb21iaW5lZCAzMiBhbmQgMTYgYml0IGJ5dGVzd2FwIGdldHMgdGhlIDE2IGJpdAorCQkgKiBzYW1wbGVzIGludG8gdGhlIGZpZm8gaW4gdGhlIHJpZ2h0IG9yZGVyLiBUZXN0ZWQgZG9pbmcgMzIgYml0CisJCSAqIG1lbW9yeSB0byAxNiBiaXQgZGV2aWNlIHRyYW5zZmVycyB0byB0aGUgYW5hbG9nIG91dCBvZiBhCisJCSAqIHB4aS02MjgxLCB3aGljaCBoYXMgbWl0ZSB2ZXJzaW9uID0gMSwgdHlwZSA9IDQuIFRoaXMgYWxzbworCQkgKiB3b3JrcyBmb3IgZG1hIHJlYWRzIGZyb20gdGhlIGNvdW50ZXJzIG9uIGUtc2VyaWVzIGJvYXJkcy4KKwkJICovCiAJCWNoY3IgfD0gQ0hDUl9CWVRFX1NXQVBfREVWSUNFIHwgQ0hDUl9CWVRFX1NXQVBfTUVNT1JZOwogCX0KIAlpZiAobWl0ZV9jaGFuLT5kaXIgPT0gQ09NRURJX0lOUFVUKQpAQCAtNDI1LDcgKzQ0OCw4IEBACiAJCW1jciB8PSBDUl9QU0laRTMyOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIm1pdGU6IGJ1ZyEgaW52YWxpZCBtZW0gYml0IHdpZHRoIGZvciBkbWEgdHJhbnNmZXJcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaXRlOiBidWchIGludmFsaWQgbWVtIGJpdCB3aWR0aCBmb3IgZG1hICIKKwkJICAgICAgICJ0cmFuc2ZlclxuIik7CiAJCWJyZWFrOwogCX0KIAl3cml0ZWwobWNyLCBtaXRlLT5taXRlX2lvX2FkZHIgKyBNSVRFX01DUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKQEAgLTQ0NCw3ICs0NjgsOCBAQAogCQlkY3IgfD0gQ1JfUFNJWkUzMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJtaXRlOiBidWchIGludmFsaWQgZGV2IGJpdCB3aWR0aCBmb3IgZG1hIHRyYW5zZmVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWl0ZTogYnVnISBpbnZhbGlkIGRldiBiaXQgd2lkdGggZm9yIGRtYSAiCisJCSAgICAgICAidHJhbnNmZXJcbiIpOwogCQlicmVhazsKIAl9CiAJd3JpdGVsKGRjciwgbWl0ZS0+bWl0ZV9pb19hZGRyICsgTUlURV9EQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSk7CkBAIC00NjIsNiArNDg3LDcgQEAKIAogCU1EUFJJTlRLKCJleGl0IG1pdGVfcHJlcF9kbWFcbiIpOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3ByZXBfZG1hKTsKIAogdTMyIG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTQ2OSw0OCArNDk1LDUzIEBACiAJcmV0dXJuIHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfREFSKG1pdGVfY2hhbi0+Y2hhbm5lbCkpOwogfQogCi11MzIgbWl0ZV9ieXRlc19pbl90cmFuc2l0KHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCit1MzIgbWl0ZV9ieXRlc19pbl90cmFuc2l0KHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKIAlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUgPSBtaXRlX2NoYW4tPm1pdGU7CiAJcmV0dXJuIHJlYWRsKG1pdGUtPm1pdGVfaW9fYWRkciArCiAJCSAgICAgTUlURV9GQ1IobWl0ZV9jaGFuLT5jaGFubmVsKSkgJiAweDAwMDAwMEZGOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX2luX3RyYW5zaXQpOwogCi0vKiAgcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlIHRvIG1lbW9yeSAqLwotdTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKKy8qIHJldHVybnMgbG93ZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkgKi8KK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKIAl1MzIgZGV2aWNlX2J5dGVfY291bnQ7CiAKIAlkZXZpY2VfYnl0ZV9jb3VudCA9IG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbik7CiAJcmV0dXJuIGRldmljZV9ieXRlX2NvdW50IC0gbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfbGIpOwogCi0vKiAgcmV0dXJucyB1cHBlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIGZyb20gZGV2aWNlIHRvIG1lbW9yeSAqLwotdTMyIG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqIG1pdGVfY2hhbikKKy8qIHJldHVybnMgdXBwZXIgYm91bmQgZm9yIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBmcm9tIGRldmljZSB0byBtZW1vcnkgKi8KK3UzMiBtaXRlX2J5dGVzX3dyaXR0ZW5fdG9fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKIAl1MzIgaW5fdHJhbnNpdF9jb3VudDsKIAogCWluX3RyYW5zaXRfY291bnQgPSBtaXRlX2J5dGVzX2luX3RyYW5zaXQobWl0ZV9jaGFuKTsKIAlyZXR1cm4gbWl0ZV9kZXZpY2VfYnl0ZXNfdHJhbnNmZXJyZWQobWl0ZV9jaGFuKSAtIGluX3RyYW5zaXRfY291bnQ7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIpOwogCi0vKiAgcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgZm9yIHRyYW5zZmVyIHRvIGRldmljZSAqLwotdTMyIG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYihzdHJ1Y3QgbWl0ZV9jaGFubmVsICogbWl0ZV9jaGFuKQorLyogcmV0dXJucyBsb3dlciBib3VuZCBmb3IgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBtZW1vcnkgdG8gZGV2aWNlICovCit1MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X2xiKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKIAl1MzIgZGV2aWNlX2J5dGVfY291bnQ7CiAKIAlkZXZpY2VfYnl0ZV9jb3VudCA9IG1pdGVfZGV2aWNlX2J5dGVzX3RyYW5zZmVycmVkKG1pdGVfY2hhbik7CiAJcmV0dXJuIGRldmljZV9ieXRlX2NvdW50ICsgbWl0ZV9ieXRlc19pbl90cmFuc2l0KG1pdGVfY2hhbik7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfcmVhZF9mcm9tX21lbW9yeV9sYik7CiAKLS8qICByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIG1lbW9yeSBmb3IgdHJhbnNmZXIgdG8gZGV2aWNlICovCi11MzIgbWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKHN0cnVjdCBtaXRlX2NoYW5uZWwgKiBtaXRlX2NoYW4pCisvKiByZXR1cm5zIHVwcGVyIGJvdW5kIGZvciBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIG1lbW9yeSB0byBkZXZpY2UgKi8KK3UzMiBtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewogCXUzMiBpbl90cmFuc2l0X2NvdW50OwogCiAJaW5fdHJhbnNpdF9jb3VudCA9IG1pdGVfYnl0ZXNfaW5fdHJhbnNpdChtaXRlX2NoYW4pOwogCXJldHVybiBtaXRlX2RldmljZV9ieXRlc190cmFuc2ZlcnJlZChtaXRlX2NoYW4pICsgaW5fdHJhbnNpdF9jb3VudDsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc19yZWFkX2Zyb21fbWVtb3J5X3ViKTsKIAogdW5zaWduZWQgbWl0ZV9kbWFfdGNyKHN0cnVjdCBtaXRlX2NoYW5uZWwgKm1pdGVfY2hhbikKIHsKQEAgLTUyNSw2ICs1NTYsNyBAQAogCiAJcmV0dXJuIHRjcjsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9kbWFfdGNyKTsKIAogdm9pZCBtaXRlX2RtYV9kaXNhcm0oc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuKQogewpAQCAtNTM1LDYgKzU2Nyw3IEBACiAJY2hvciA9IENIT1JfQUJPUlQ7CiAJd3JpdGVsKGNob3IsIG1pdGUtPm1pdGVfaW9fYWRkciArIE1JVEVfQ0hPUihtaXRlX2NoYW4tPmNoYW5uZWwpKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9kbWFfZGlzYXJtKTsKIAogaW50IG1pdGVfc3luY19pbnB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAogCQkJc3RydWN0IGNvbWVkaV9hc3luYyAqYXN5bmMpCkBAIC01NDQsNyArNTc3LDcgQEAKIAljb25zdCB1bnNpZ25lZCBieXRlc19wZXJfc2NhbiA9IGNmY19ieXRlc19wZXJfc2Nhbihhc3luYy0+c3ViZGV2aWNlKTsKIAogCW9sZF9hbGxvY19jb3VudCA9IGFzeW5jLT5idWZfd3JpdGVfYWxsb2NfY291bnQ7Ci0JLyogIHdyaXRlIGFsbG9jIGFzIG11Y2ggYXMgd2UgY2FuICovCisJLyogd3JpdGUgYWxsb2MgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KIAljb21lZGlfYnVmX3dyaXRlX2FsbG9jKGFzeW5jLCBhc3luYy0+cHJlYWxsb2NfYnVmc3opOwogCiAJbmJ5dGVzID0gbWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYihtaXRlX2NoYW4pOwpAQCAtNTcxLDYgKzYwNCw3IEBACiAJYXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfQkxPQ0s7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfc3luY19pbnB1dF9kbWEpOwogCiBpbnQgbWl0ZV9zeW5jX291dHB1dF9kbWEoc3RydWN0IG1pdGVfY2hhbm5lbCAqbWl0ZV9jaGFuLAogCQkJIHN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jKQpAQCAtNTkzLDcgKzYyNyw3IEBACiAJICAgIChpbnQpKG5ieXRlc191YiAtIHN0b3BfY291bnQpID4gMCkKIAkJbmJ5dGVzX3ViID0gc3RvcF9jb3VudDsKIAlpZiAoKGludCkobmJ5dGVzX3ViIC0gb2xkX2FsbG9jX2NvdW50KSA+IDApIHsKLQkJcHJpbnRrKCJtaXRlOiBETUEgdW5kZXJydW5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgIm1pdGU6IERNQSB1bmRlcnJ1blxuIik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX09WRVJGTE9XOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNjA3LDYgKzY0MSw3IEBACiAJfQogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChtaXRlX3N5bmNfb3V0cHV0X2RtYSk7CiAKIHVuc2lnbmVkIG1pdGVfZ2V0X3N0YXR1cyhzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC02MjUsNiArNjYwLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9nZXRfc3RhdHVzKTsKIAogaW50IG1pdGVfZG9uZShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pCiB7CkBAIC02MzgsNiArNjc0LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaXRlLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGRvbmU7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZG9uZSk7CiAKICNpZmRlZiBERUJVR19NSVRFCiAKQEAgLTcxOSw0NiArNzU2LDUxIEBACiAJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKIAl1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwogCi0JcHJpbnRrKCJtaXRlX2R1bXBfcmVncyBjaCVpXG4iLCBtaXRlX2NoYW4tPmNoYW5uZWwpOwotCXByaW50aygibWl0ZSBhZGRyZXNzIGlzICA9MHglMDhseFxuIiwgbWl0ZV9pb19hZGRyKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZV9kdW1wX3JlZ3MgY2glaVxuIiwgbWl0ZV9jaGFuLT5jaGFubmVsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBhZGRyZXNzIGlzICA9MHglMDhseFxuIiwgbWl0ZV9pb19hZGRyKTsKIAogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0NIT1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tDSE9SXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsIHRlbXAgPQotCSAgICAgICByZWFkbChhZGRyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0NIT1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwKKwkgICAgICAgdGVtcCA9IHJlYWRsKGFkZHIpKTsKIAltaXRlX2RlY29kZShtaXRlX0NIT1Jfc3RyaW5ncywgdGVtcCk7CiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hDUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0NIQ1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9Ci0JICAgICAgIHJlYWRsKGFkZHIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbQ0hDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLAorCSAgICAgICB0ZW1wID0gcmVhZGwoYWRkcikpOwogCW1pdGVfZGVjb2RlKG1pdGVfQ0hDUl9zdHJpbmdzLCB0ZW1wKTsKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9UQ1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tUQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOwotCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX01DUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW01DUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW1RDUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLAogCSAgICAgICByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfTUNSKGNoYW5uZWwpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tNQ1JdIGF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsCisJICAgICAgIHRlbXAgPSByZWFkbChhZGRyKSk7CiAJbWl0ZV9kZWNvZGUobWl0ZV9NQ1Jfc3RyaW5ncywgdGVtcCk7CiAKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9NQVIoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tNQVJdIGF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOwotCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0RDUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0RDUl0gYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW01BUl0gYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLAogCSAgICAgICByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfRENSKGNoYW5uZWwpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tEQ1JdIGF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsCisJICAgICAgIHRlbXAgPSByZWFkbChhZGRyKSk7CiAJbWl0ZV9kZWNvZGUobWl0ZV9EQ1Jfc3RyaW5ncywgdGVtcCk7CiAJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfREFSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbREFSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsIHJlYWRsKGFkZHIpKTsKLQlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9MS0NSKGNoYW5uZWwpOwotCXByaW50aygibWl0ZSBzdGF0dXNbTEtDUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLCB0ZW1wID0KKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbREFSXSBhdCAweCUwOGx4ID0weCUwOHhcbiIsIGFkZHIsCiAJICAgICAgIHJlYWRsKGFkZHIpKTsKKwlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9MS0NSKGNoYW5uZWwpOworCXByaW50ayhLRVJOX0RFQlVHICJtaXRlIHN0YXR1c1tMS0NSXWF0IDB4JTA4bHggPTB4JTA4bHhcbiIsIGFkZHIsCisJICAgICAgIHRlbXAgPSByZWFkbChhZGRyKSk7CiAJbWl0ZV9kZWNvZGUobWl0ZV9MS0NSX3N0cmluZ3MsIHRlbXApOwogCWFkZHIgPSBtaXRlX2lvX2FkZHIgKyBNSVRFX0xLQVIoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tMS0FSXWF0IDB4JTA4bHggPTB4JTA4eFxuIiwgYWRkciwgcmVhZGwoYWRkcikpOwotCi0JYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hTUihjaGFubmVsKTsKLQlwcmludGsoIm1pdGUgc3RhdHVzW0NIU1JdYXQgMHglMDhseCA9MHglMDhseFxuIiwgYWRkciwgdGVtcCA9CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0xLQVJdYXQgMHglMDhseCA9MHglMDh4XG4iLCBhZGRyLAogCSAgICAgICByZWFkbChhZGRyKSk7CisJYWRkciA9IG1pdGVfaW9fYWRkciArIE1JVEVfQ0hTUihjaGFubmVsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWl0ZSBzdGF0dXNbQ0hTUl1hdCAweCUwOGx4ID0weCUwOGx4XG4iLCBhZGRyLAorCSAgICAgICB0ZW1wID0gcmVhZGwoYWRkcikpOwogCW1pdGVfZGVjb2RlKG1pdGVfQ0hTUl9zdHJpbmdzLCB0ZW1wKTsKIAlhZGRyID0gbWl0ZV9pb19hZGRyICsgTUlURV9GQ1IoY2hhbm5lbCk7Ci0JcHJpbnRrKCJtaXRlIHN0YXR1c1tGQ1JdIGF0IDB4JTA4bHggPTB4JTA4eFxuXG4iLCBhZGRyLCByZWFkbChhZGRyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1pdGUgc3RhdHVzW0ZDUl0gYXQgMHglMDhseCA9MHglMDh4XG5cbiIsIGFkZHIsCisJICAgICAgIHJlYWRsKGFkZHIpKTsKIH0KK0VYUE9SVF9TWU1CT0wobWl0ZV9kdW1wX3JlZ3MpOwogCiBzdGF0aWMgdm9pZCBtaXRlX2RlY29kZShjaGFyICoqYml0X3N0ciwgdW5zaWduZWQgaW50IGJpdHMpCiB7CkBAIC03NjYsMTAgKzgwOCwxMSBAQAogCiAJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmIChiaXRzICYgKDEgPDwgaSkpCi0JCQlwcmludGsoIiAlcyIsIGJpdF9zdHJbaV0pOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlcyIsIGJpdF9zdHJbaV0pOwogCX0KLQlwcmludGsoIlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiB9CitFWFBPUlRfU1lNQk9MKG1pdGVfZGVjb2RlKTsKICNlbmRpZgogCiAjaWZkZWYgTU9EVUxFCkBAIC03ODUsMzYgKzgyOCw0IEBACiB7CiAJbWl0ZV9jbGVhbnVwKCk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wobWl0ZV9kbWFfdGNyKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9kbWFfYXJtKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9kbWFfZGlzYXJtKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9zeW5jX2lucHV0X2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfc3luY19vdXRwdXRfZG1hKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9zZXR1cCk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfc2V0dXAyKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV91bnNldHVwKTsKLSNpZiAwCi1FWFBPUlRfU1lNQk9MKG1pdGVfa3ZtZW1fc2VnbWVudF9sb2FkKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9sbF9mcm9tX2t2bWVtKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9zZXRyZWdzKTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTChtaXRlX2RldmljZXMpOwotRVhQT1JUX1NZTUJPTChtaXRlX2xpc3RfZGV2aWNlcyk7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9yZWxlYXNlX2NoYW5uZWwpOwotRVhQT1JUX1NZTUJPTChtaXRlX3ByZXBfZG1hKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9idWZfY2hhbmdlKTsKLUVYUE9SVF9TWU1CT0wobWl0ZV9ieXRlc193cml0dGVuX3RvX21lbW9yeV9sYik7Ci1FWFBPUlRfU1lNQk9MKG1pdGVfYnl0ZXNfd3JpdHRlbl90b19tZW1vcnlfdWIpOwotRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfbGIpOwotRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX3JlYWRfZnJvbV9tZW1vcnlfdWIpOwotRVhQT1JUX1NZTUJPTChtaXRlX2J5dGVzX2luX3RyYW5zaXQpOwotRVhQT1JUX1NZTUJPTChtaXRlX2dldF9zdGF0dXMpOwotRVhQT1JUX1NZTUJPTChtaXRlX2RvbmUpOwotI2lmZGVmIERFQlVHX01JVEUKLUVYUE9SVF9TWU1CT0wobWl0ZV9kZWNvZGUpOwotRVhQT1JUX1NZTUJPTChtaXRlX2R1bXBfcmVncyk7Ci0jZW5kaWYKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaAppbmRleCAwNTE4ZmFkLi45ZDUwNDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKQEAgLTE2MywxMyArMTYzLDYgQEAKIHVuc2lnbmVkIG1pdGVfZ2V0X3N0YXR1cyhzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwogaW50IG1pdGVfZG9uZShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4pOwogCi0jaWYgMAotdW5zaWduZWQgbG9uZyBtaXRlX2xsX2Zyb21fa3ZtZW0oc3RydWN0IG1pdGVfc3RydWN0ICptaXRlLAotCQkJCSBzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYywgaW50IGxlbik7Ci12b2lkIG1pdGVfc2V0cmVncyhzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGUsIHVuc2lnbmVkIGxvbmcgbGxfc3RhcnQsIGludCBjaGFuLAotCQkgIGludCBkaXIpOwotI2VuZGlmCi0KIHZvaWQgbWl0ZV9wcmVwX2RtYShzdHJ1Y3QgbWl0ZV9jaGFubmVsICptaXRlX2NoYW4sCiAJCSAgIHVuc2lnbmVkIGludCBudW1fZGV2aWNlX2JpdHMsIHVuc2lnbmVkIGludCBudW1fbWVtb3J5X2JpdHMpOwogaW50IG1pdGVfYnVmX2NoYW5nZShzdHJ1Y3QgbWl0ZV9kbWFfZGVzY3JpcHRvcl9yaW5nICpyaW5nLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tdWx0aXEzLmMKaW5kZXggNWQ2YWY5Yy4uNmIyMmYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL211bHRpcTMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXVsdGlxMy5jCkBAIC0xNDQsOSArMTQ0LDggQEAKIAlpbnQgaTsKIAlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCi0JZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspCiAJCWRhdGFbaV0gPSBkZXZwcml2LT5hb19yZWFkYmFja1tjaGFuXTsKLQl9CiAKIAlyZXR1cm4gaTsKIH0KQEAgLTI1MywyMCArMjUyLDIwIEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAKIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKLQlwcmludGsoImNvbWVkaSVkOiBtdWx0aXEzOiAweCUwNGx4ICIsIGRldi0+bWlub3IsIGlvYmFzZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IG11bHRpcTM6IDB4JTA0bHggIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgTVVMVElRM19TSVpFLCAibXVsdGlxMyIpKSB7Ci0JCXByaW50aygiY29tZWRpJWQ6IEkvTyBwb3J0IGNvbmZsaWN0XG4iLCBkZXYtPm1pbm9yKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogSS9PIHBvcnQgY29uZmxpY3RcbiIsIGRldi0+bWlub3IpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlkZXYtPmlvYmFzZSA9IGlvYmFzZTsKIAogCWlycSA9IGl0LT5vcHRpb25zWzFdOwotCWlmIChpcnEpIHsKLQkJcHJpbnRrKCJjb21lZGklZDogaXJxID0gJXUgaWdub3JlZFxuIiwgZGV2LT5taW5vciwgaXJxKTsKLQl9IGVsc2UgewotCQlwcmludGsoImNvbWVkaSVkOiBubyBpcnFcbiIsIGRldi0+bWlub3IpOwotCX0KKwlpZiAoaXJxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogaXJxID0gJXUgaWdub3JlZFxuIiwKKwkJCWRldi0+bWlub3IsIGlycSk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogbm8gaXJxXG4iLCBkZXYtPm1pbm9yKTsKIAlkZXYtPmJvYXJkX25hbWUgPSAibXVsdGlxMyI7CiAJcmVzdWx0ID0gYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDUpOwogCWlmIChyZXN1bHQgPCAwKQpAQCAtMzMwLDE0ICszMjksMTIgQEAKIAogc3RhdGljIGludCBtdWx0aXEzX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IG11bHRpcTM6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6IG11bHRpcTM6IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKLQlpZiAoZGV2LT5pb2Jhc2UpIHsKKwlpZiAoZGV2LT5pb2Jhc2UpCiAJCXJlbGVhc2VfcmVnaW9uKGRldi0+aW9iYXNlLCBNVUxUSVEzX1NJWkUpOwotCX0KLQlpZiAoZGV2LT5pcnEpIHsKKwlpZiAoZGV2LT5pcnEpCiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMKaW5kZXggYjM3ZWYzNy4uNjUzYjRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jCkBAIC0yNzMsNyArMjczLDggQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAotCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCisJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kICovCisJLyogICAgICAgICBhcmUgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDI7CkBAIC0zNzcsNyArMzc4LDcgQEAKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAlpbnQgcmV0OwogCi0JcHJpbnRrKCJjb21lZGklZDogbmk2NTI3OiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBuaTY1MjdcbiIsIGRldi0+bWlub3IpOwogCiAJcmV0ID0gYWxsb2NfcHJpdmF0ZShkZXYsIHNpemVvZihzdHJ1Y3Qgbmk2NTI3X3ByaXZhdGUpKTsKIAlpZiAocmV0IDwgMCkKQEAgLTM4OSwxNCArMzkwLDEzIEBACiAKIAlyZXQgPSBtaXRlX3NldHVwKGRldnByaXYtPm1pdGUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiZXJyb3Igc2V0dGluZyB1cCBtaXRlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGk6IGVycm9yIHNldHRpbmcgdXAgbWl0ZVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJZGV2LT5ib2FyZF9uYW1lID0gdGhpc19ib2FyZC0+bmFtZTsKLQlwcmludGsoIiAlcyIsIGRldi0+Ym9hcmRfbmFtZSk7Ci0KLQlwcmludGsoIiBJRD0weCUwMngiLCByZWFkYihkZXZwcml2LT5taXRlLT5kYXFfaW9fYWRkciArIElEX1JlZ2lzdGVyKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpIGJvYXJkOiAlcywgSUQ9MHglMDJ4XG4iLCBkZXYtPmJvYXJkX25hbWUsCisJCXJlYWRiKGRldnByaXYtPm1pdGUtPmRhcV9pb19hZGRyICsgSURfUmVnaXN0ZXIpKTsKIAogCXJldCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCAzKTsKIAlpZiAocmV0IDwgMCkKQEAgLTQxNSw3ICs0MTUsNyBAQAogCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ETzsKIAlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CiAJcy0+bl9jaGFuID0gMjQ7Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsJLyogRklYTUU6IGFjdHVhbGx5IGNvbmR1Y3RhbmNlICovCisJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsgIC8qIEZJWE1FOiBhY3R1YWxseSBjb25kdWN0YW5jZSAqLwogCXMtPm1heGRhdGEgPSAxOwogCXMtPmluc25fYml0cyA9IG5pNjUyN19kb19pbnNuX2JpdHM7CiAKQEAgLTQ0MiwzMCArNDQyLDI1IEBACiAKIAlyZXQgPSByZXF1ZXN0X2lycShtaXRlX2lycShkZXZwcml2LT5taXRlKSwgbmk2NTI3X2ludGVycnVwdCwKIAkJCSAgSVJRRl9TSEFSRUQsICJuaTY1MjciLCBkZXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50aygiIGlycSBub3QgYXZhaWxhYmxlIik7Ci0JfSBlbHNlCisJaWYgKHJldCA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbWVkaSBpNjUyNyBpcnEgbm90IGF2YWlsYWJsZVxuIik7CisJZWxzZQogCQlkZXYtPmlycSA9IG1pdGVfaXJxKGRldnByaXYtPm1pdGUpOwogCi0JcHJpbnRrKCJcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbmk2NTI3X2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCWlmIChkZXZwcml2ICYmIGRldnByaXYtPm1pdGUgJiYgZGV2cHJpdi0+bWl0ZS0+ZGFxX2lvX2FkZHIpIHsKKwlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5taXRlICYmIGRldnByaXYtPm1pdGUtPmRhcV9pb19hZGRyKQogCQl3cml0ZWIoMHgwMCwKIAkJICAgICAgIGRldnByaXYtPm1pdGUtPmRhcV9pb19hZGRyICsgTWFzdGVyX0ludGVycnVwdF9Db250cm9sKTsKLQl9CiAKLQlpZiAoZGV2LT5pcnEpIHsKKwlpZiAoZGV2LT5pcnEpCiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCX0KIAotCWlmIChkZXZwcml2ICYmIGRldnByaXYtPm1pdGUpIHsKKwlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5taXRlKQogCQltaXRlX3Vuc2V0dXAoZGV2cHJpdi0+bWl0ZSk7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC00OTEsNyArNDg2LDcgQEAKIAkJCX0KIAkJfQogCX0KLQlwcmludGsoIm5vIGRldmljZSBmb3VuZFxuIik7CisJcHJpbnRrKEtFUk5fRVJSICJjb21lZGkgNjUyNzogbm8gZGV2aWNlIGZvdW5kXG4iKTsKIAltaXRlX2xpc3RfZGV2aWNlcygpOwogCXJldHVybiAtRUlPOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYwppbmRleCA4YWRiMjM3Li4zNzc4NTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYW8uYwpAQCAtMzIsNyArMzIsOCBAQAogICBbMF0gLSBJL08gcG9ydCBiYXNlIGFkZHJlc3MKICAgWzFdIC0gSVJRICh1bnVzZWQpCiAgIFsyXSAtIERNQSAodW51c2VkKQotICBbM10gLSBhbmFsb2cgb3V0cHV0IHJhbmdlLCBzZXQgYnkganVtcGVycyBvbiBoYXJkd2FyZSAoMCBmb3IgLTEwIHRvIDEwViBiaXBvbGFyLCAxIGZvciAwViB0byAxMFYgdW5pcG9sYXIpCisgIFszXSAtIGFuYWxvZyBvdXRwdXQgcmFuZ2UsIHNldCBieSBqdW1wZXJzIG9uIGhhcmR3YXJlICgwIGZvciAtMTAgdG8gMTBWCisJYmlwb2xhciwgMSBmb3IgMFYgdG8gMTBWIHVuaXBvbGFyKQogCiAqLwogLyoKQEAgLTQzMSw5ICs0MzIsOCBAQAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewogCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKQogCQlkYXRhW2ldID0gMDsJLyogWFhYICovCi0JfQogCXJldHVybiBpbnNuLT5uOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCmluZGV4IDkwMTgzM2QuLmNmNGYyNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCkBAIC0yMDAsOCArMjAwLDggQEAKIAllbnVtIHsgZGFjXzJjb21wLCBkYWNfc3RyYWlnaHQgfSBkYWMwX2NvZGluZywgZGFjMV9jb2Rpbmc7CiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX3R5cGVfbGlzdFsyXTsKIAl1bnNpZ25lZCBpbnQgYW9fcmVhZGJhY2tbMl07Ci0JdW5zaWduZWQgaW50IGNvbV9yZWdfMV9zdGF0ZTsJLyogY3VycmVudCBzdGF0ZSBvZiBjb21tYW5kIHJlZ2lzdGVyIDEgKi8KLQl1bnNpZ25lZCBpbnQgY29tX3JlZ18yX3N0YXRlOwkvKiBjdXJyZW50IHN0YXRlIG9mIGNvbW1hbmQgcmVnaXN0ZXIgMiAqLworCXVuc2lnbmVkIGludCBjb21fcmVnXzFfc3RhdGU7IC8qIGN1cnJlbnQgc3RhdGUgb2YgY29tbWFuZCByZWdpc3RlciAxICovCisJdW5zaWduZWQgaW50IGNvbV9yZWdfMl9zdGF0ZTsgLyogY3VycmVudCBzdGF0ZSBvZiBjb21tYW5kIHJlZ2lzdGVyIDIgKi8KIH07CiAKIHN0YXRpYyB2b2lkIHJlc2V0X2NvdW50ZXJzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCkBAIC0yNzksNyArMjc5LDkgQEAKIAlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcyA9IGRldi0+c3ViZGV2aWNlcyArIDA7CiAKLS8qIHByaW50aygiYXRtaW8xNmRfaW50ZXJydXB0IVxuIik7ICovCisjaWZkZWYgREVCVUcxCisJcHJpbnRrKEtFUk5fREVCVUcgImF0bWlvMTZkX2ludGVycnVwdCFcbiIpOworI2VuZGlmCiAKIAljb21lZGlfYnVmX3B1dChzLT5hc3luYywgaW53KGRldi0+aW9iYXNlICsgQURfRklGT19SRUcpKTsKIApAQCAtMjkzLDcgKzI5NSw3IEBACiB7CiAJaW50IGVyciA9IDAsIHRtcDsKICNpZmRlZiBERUJVRzEKLQlwcmludGsoImF0bWlvMTZkX2FpX2NtZHRlc3RcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJhdG1pbzE2ZF9haV9jbWR0ZXN0XG4iKTsKICNlbmRpZgogCS8qIG1ha2Ugc3VyZSB0cmlnZ2VycyBhcmUgdmFsaWQgKi8KIAl0bXAgPSBjbWQtPnN0YXJ0X3NyYzsKQEAgLTMyNCw4ICszMjYsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICYgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSKQpAQCAtMzk3LDcgKzM5OSw3IEBACiAJdW5zaWduZWQgaW50IHNhbXBsZV9jb3VudCwgdG1wLCBjaGFuLCBnYWluOwogCWludCBpOwogI2lmZGVmIERFQlVHMQotCXByaW50aygiYXRtaW8xNmRfYWlfY21kXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXRtaW8xNmRfYWlfY21kXG4iKTsKICNlbmRpZgogCS8qIFRoaXMgaXMgc2xvd2x5IGJlY29taW5nIGEgd29ya2luZyBjb21tYW5kIGludGVyZmFjZS4gKgogCSAqIEl0IGlzIHN0aWxsIHViZXItZXhwZXJpbWVudGFsICovCkBAIC00MzYsMTAgKzQzOCwxMCBAQAogCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X2FyZyA8IDY1NTM2MDAwMCkgewogCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMTAwX0tIWjsKIAkJdGltZXIgPSBjbWQtPmNvbnZlcnRfYXJnIC8gMTAwMDA7Ci0JfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfYXJnIDw9IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMCAqLyApIHsKKwl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9hcmcgPD0gMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwICovKSB7CiAJCWJhc2VfY2xvY2sgPSBDTE9DS18xMF9LSFo7CiAJCXRpbWVyID0gY21kLT5jb252ZXJ0X2FyZyAvIDEwMDAwMDsKLQl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9hcmcgPD0gMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwMCAqLyApIHsKKwl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9hcmcgPD0gMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwMCAqLykgewogCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMV9LSFo7CiAJCXRpbWVyID0gY21kLT5jb252ZXJ0X2FyZyAvIDEwMDAwMDA7CiAJfQpAQCAtNTA0LDEwICs1MDYsMTAgQEAKIAkJfSBlbHNlIGlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgNjU1MzYwMDAwKSB7CiAJCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMTAwX0tIWjsKIAkJCXRpbWVyID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEwMDAwOwotCQl9IGVsc2UgaWYgKGNtZC0+c2Nhbl9iZWdpbl9hcmcgPCAweGZmZmZmZmZmIC8qIDY1NTM2MDAwMDAgKi8gKSB7CisJCX0gZWxzZSBpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDB4ZmZmZmZmZmYgLyogNjU1MzYwMDAwMCAqLykgewogCQkJYmFzZV9jbG9jayA9IENMT0NLXzEwX0tIWjsKIAkJCXRpbWVyID0gY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEwMDAwMDsKLQkJfSBlbHNlIGlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwMCAqLyApIHsKKwkJfSBlbHNlIGlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMHhmZmZmZmZmZiAvKiA2NTUzNjAwMDAwMCAqLykgewogCQkJYmFzZV9jbG9jayA9IENMT0NLXzFfS0haOwogCQkJdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMDsKIAkJfQpAQCAtNTU5LDcgKzU2MSw3IEBACiAJaW50IHN0YXR1czsKIAogI2lmZGVmIERFQlVHMQotCXByaW50aygiYXRtaW8xNmRfYWlfaW5zbl9yZWFkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXRtaW8xNmRfYWlfaW5zbl9yZWFkXG4iKTsKICNlbmRpZgogCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlnYWluID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwpAQCAtNTgwLDE5ICs1ODIsMTggQEAKIAkJCS8qIGNoZWNrIGNvbnZlcnNpb24gc3RhdHVzICovCiAJCQlzdGF0dXMgPSBpbncoZGV2LT5pb2Jhc2UgKyBTVEFUX1JFRyk7CiAjaWZkZWYgREVCVUcxCi0JCQlwcmludGsoInN0YXR1cz0leFxuIiwgc3RhdHVzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzdGF0dXM9JXhcbiIsIHN0YXR1cyk7CiAjZW5kaWYKIAkJCWlmIChzdGF0dXMgJiBTVEFUX0FEX0NPTlZBVkFJTCkgewogCQkJCS8qIHJlYWQgdGhlIGRhdGEgbm93ICovCiAJCQkJZGF0YVtpXSA9IGludyhkZXYtPmlvYmFzZSArIEFEX0ZJRk9fUkVHKTsKIAkJCQkvKiBjaGFuZ2UgdG8gdHdvJ3MgY29tcGxlbWVudCBpZiBuZWVkIGJlICovCi0JCQkJaWYgKGRldnByaXYtPmFkY19jb2RpbmcgPT0gYWRjXzJjb21wKSB7CisJCQkJaWYgKGRldnByaXYtPmFkY19jb2RpbmcgPT0gYWRjXzJjb21wKQogCQkJCQlkYXRhW2ldIF49IDB4ODAwOwotCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChzdGF0dXMgJiBTVEFUX0FEX09WRVJGTE9XKSB7Ci0JCQkJcHJpbnRrKCJhdG1pbzE2ZDogYS9kIEZJRk8gb3ZlcmZsb3dcbiIpOworCQkJCXByaW50ayhLRVJOX0lORk8gImF0bWlvMTZkOiBhL2QgRklGTyBvdmVyZmxvd1xuIik7CiAJCQkJb3V0dygwLCBkZXYtPmlvYmFzZSArIEFEX0NMRUFSX1JFRyk7CiAKIAkJCQlyZXR1cm4gLUVUSU1FOwpAQCAtNjAwLDcgKzYwMSw3IEBACiAJCX0KIAkJLyogZW5kIHdhaXRpbmcsIG5vdyBjaGVjayBpZiBpdCB0aW1lZCBvdXQgKi8KIAkJaWYgKHQgPT0gQVRNSU8xNkRfVElNRU9VVCkgewotCQkJcHJpbnRrKCJhdG1pbzE2ZDogdGltZW91dFxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJhdG1pbzE2ZDogdGltZW91dFxuIik7CiAKIAkJCXJldHVybiAtRVRJTUU7CiAJCX0KQEAgLTYxNSwxMyArNjE2LDExIEBACiB7CiAJaW50IGk7CiAjaWZkZWYgREVCVUcxCi0JcHJpbnRrKCJhdG1pbzE2ZF9hb19pbnNuX3JlYWRcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJhdG1pbzE2ZF9hb19pbnNuX3JlYWRcbiIpOwogI2VuZGlmCiAKLQlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKIAkJZGF0YVtpXSA9IGRldnByaXYtPmFvX3JlYWRiYWNrW0NSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpXTsKLQl9Ci0KIAlyZXR1cm4gaTsKIH0KIApAQCAtNjMzLDcgKzYzMiw3IEBACiAJaW50IGNoYW47CiAJaW50IGQ7CiAjaWZkZWYgREVCVUcxCi0JcHJpbnRrKCJhdG1pbzE2ZF9hb19pbnNuX3dyaXRlXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYXRtaW8xNmRfYW9faW5zbl93cml0ZVxuIik7CiAjZW5kaWYKIAogCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKQEAgLTY0MiwxNSArNjQxLDEzIEBACiAJCWQgPSBkYXRhW2ldOwogCQlzd2l0Y2ggKGNoYW4pIHsKIAkJY2FzZSAwOgotCQkJaWYgKGRldnByaXYtPmRhYzBfY29kaW5nID09IGRhY18yY29tcCkgeworCQkJaWYgKGRldnByaXYtPmRhYzBfY29kaW5nID09IGRhY18yY29tcCkKIAkJCQlkIF49IDB4ODAwOwotCQkJfQogCQkJb3V0dyhkLCBkZXYtPmlvYmFzZSArIERBQzBfUkVHKTsKIAkJCWJyZWFrOwogCQljYXNlIDE6Ci0JCQlpZiAoZGV2cHJpdi0+ZGFjMV9jb2RpbmcgPT0gZGFjXzJjb21wKSB7CisJCQlpZiAoZGV2cHJpdi0+ZGFjMV9jb2RpbmcgPT0gZGFjXzJjb21wKQogCQkJCWQgXj0gMHg4MDA7Ci0JCQl9CiAJCQlvdXR3KGQsIGRldi0+aW9iYXNlICsgREFDMV9SRUcpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC03MDUsMjkgKzcwMiwyOSBAQAogLyoKICAgIG9wdGlvbnNbMF0gLSBJL08gcG9ydAogICAgb3B0aW9uc1sxXSAtIE1JTyBpcnEKLSAgICAgICAgICAgICAgICAwID09IG5vIGlycQotICAgICAgICAgICAgICAgIE4gPT0gaXJxIE4gezMsNCw1LDYsNyw5LDEwLDExLDEyLDE0LDE1fQorCQkwID09IG5vIGlycQorCQlOID09IGlycSBOIHszLDQsNSw2LDcsOSwxMCwxMSwxMiwxNCwxNX0KICAgIG9wdGlvbnNbMl0gLSBESU8gaXJxCi0gICAgICAgICAgICAgICAgMCA9PSBubyBpcnEKLSAgICAgICAgICAgICAgICBOID09IGlycSBOIHszLDQsNSw2LDcsOX0KKwkJMCA9PSBubyBpcnEKKwkJTiA9PSBpcnEgTiB7Myw0LDUsNiw3LDl9CiAgICBvcHRpb25zWzNdIC0gRE1BMSBjaGFubmVsCi0gICAgICAgICAgICAgICAgMCA9PSBubyBETUEKLSAgICAgICAgICAgICAgICBOID09IERNQSBOIHs1LDYsN30KKwkJMCA9PSBubyBETUEKKwkJTiA9PSBETUEgTiB7NSw2LDd9CiAgICBvcHRpb25zWzRdIC0gRE1BMiBjaGFubmVsCi0gICAgICAgICAgICAgICAgMCA9PSBubyBETUEKLSAgICAgICAgICAgICAgICBOID09IERNQSBOIHs1LDYsN30KKwkJMCA9PSBubyBETUEKKwkJTiA9PSBETUEgTiB7NSw2LDd9CiAKICAgIG9wdGlvbnNbNV0gLSBhL2QgbXV4Ci0gICAJMD1kaWZmZXJlbnRpYWwsIDE9c2luZ2xlCisJMD1kaWZmZXJlbnRpYWwsIDE9c2luZ2xlCiAgICBvcHRpb25zWzZdIC0gYS9kIHJhbmdlCi0gICAJMD1iaXBvbGFyMTAsIDE9Ymlwb2xhcjUsIDI9dW5pcG9sYXIxMAorCTA9Ymlwb2xhcjEwLCAxPWJpcG9sYXI1LCAyPXVuaXBvbGFyMTAKIAogICAgb3B0aW9uc1s3XSAtIGRhYzAgcmFuZ2UKLSAgIAkwPWJpcG9sYXIsIDE9dW5pcG9sYXIKKwkwPWJpcG9sYXIsIDE9dW5pcG9sYXIKICAgIG9wdGlvbnNbOF0gLSBkYWMwIHJlZmVyZW5jZQotICAgIDA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwKKwkwPWludGVybmFsLCAxPWV4dGVybmFsCiAgICBvcHRpb25zWzldIC0gZGFjMCBjb2RpbmcKLSAgIAkwPTIncyBjb21wLCAxPXN0cmFpZ2h0IGJpbmFyeQorCTA9MidzIGNvbXAsIDE9c3RyYWlnaHQgYmluYXJ5CiAKICAgIG9wdGlvbnNbMTBdIC0gZGFjMSByYW5nZQogICAgb3B0aW9uc1sxMV0gLSBkYWMxIHJlZmVyZW5jZQpAQCAtNzQ1LDcgKzc0Miw3IEBACiAKIAkvKiBtYWtlIHN1cmUgdGhlIGFkZHJlc3MgcmFuZ2UgaXMgZnJlZSBhbmQgYWxsb2NhdGUgaXQgKi8KIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKLQlwcmludGsoImNvbWVkaSVkOiBhdG1pbzE2ZDogMHglMDRseCAiLCBkZXYtPm1pbm9yLCBpb2Jhc2UpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhdG1pbzE2ZDogMHglMDRseCAiLCBkZXYtPm1pbm9yLCBpb2Jhc2UpOwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBBVE1JTzE2RF9TSVpFLCAibmlfYXRtaW8xNmQiKSkgewogCQlwcmludGsoIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKIAkJcmV0dXJuIC1FSU87CkBAIC03NzIsMTMgKzc2OSwxMyBAQAogCiAJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYXRtaW8xNmRfaW50ZXJydXB0LCAwLCAiYXRtaW8xNmQiLCBkZXYpOwogCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKCJmYWlsZWQgdG8gYWxsb2NhdGUgaXJxICV1XG4iLCBpcnEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiZmFpbGVkIHRvIGFsbG9jYXRlIGlycSAldVxuIiwgaXJxKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJZGV2LT5pcnEgPSBpcnE7Ci0JCXByaW50aygiKCBpcnEgPSAldSApXG4iLCBpcnEpOworCQlwcmludGsoS0VSTl9JTkZPICIoIGlycSA9ICV1IClcbiIsIGlycSk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKCIoIG5vIGlycSApIik7CisJCXByaW50ayhLRVJOX0lORk8gIiggbm8gaXJxICkiKTsKIAl9CiAKIAkvKiBzZXQgZGV2aWNlIG9wdGlvbnMgKi8KQEAgLTg1NSwxMSArODUyLDEwIEBACiAKIAkvKiA4MjU1IHN1YmRldmljZSAqLwogCXMrKzsKLQlpZiAoYm9hcmR0eXBlLT5oYXNfODI1NSkgeworCWlmIChib2FyZHR5cGUtPmhhc184MjU1KQogCQlzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgZGV2LT5pb2Jhc2UpOwotCX0gZWxzZSB7CisJZWxzZQogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwotCX0KIAogLyogZG9uJ3QgeWV0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBjb3VudGVyL3RpbWVycyAqLwogI2lmIDAKQEAgLTg3Niw3ICs4NzIsNyBAQAogCiBzdGF0aWMgaW50IGF0bWlvMTZkX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXByaW50aygiY29tZWRpJWQ6IGF0bWlvMTZkOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0lORk8gImNvbWVkaSVkOiBhdG1pbzE2ZDogcmVtb3ZlXG4iLCBkZXYtPm1pbm9yKTsKIAogCWlmIChkZXYtPnN1YmRldmljZXMgJiYgYm9hcmR0eXBlLT5oYXNfODI1NSkKIAkJc3ViZGV2XzgyNTVfY2xlYW51cChkZXYsIGRldi0+c3ViZGV2aWNlcyArIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaAppbmRleCA4MjU5NjM0Li40MjJjZWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaApAQCAtMzgsMTkgKzM4LDI3IEBACiAJaW50IGRldmljZV9pZDsJCS8qICBkZXZpY2UgaWQgZm9yIHBjaSBhbmQgcGNtY2lhIGJvYXJkcyAqLwogCWludCBhaV9zcGVlZDsJCS8qICBtYXhpbXVtIGlucHV0IHNwZWVkIGluIG5hbm9zZWNvbmRzICovCiAJZW51bSBsYWJwY19idXN0eXBlIGJ1c3R5cGU7CS8qICBJU0EvUENJL2V0Yy4gKi8KLQllbnVtIGxhYnBjX3JlZ2lzdGVyX2xheW91dCByZWdpc3Rlcl9sYXlvdXQ7CS8qICAxMjAwIGhhcyBleHRyYSByZWdpc3RlcnMgY29tcGFyZWQgdG8gcGMrICovCisKKwkvKiAgMTIwMCBoYXMgZXh0cmEgcmVnaXN0ZXJzIGNvbXBhcmVkIHRvIHBjKyAqLworCWVudW0gbGFicGNfcmVnaXN0ZXJfbGF5b3V0IHJlZ2lzdGVyX2xheW91dDsKIAlpbnQgaGFzX2FvOwkJLyogIGhhcyBhbmFsb2cgb3V0cHV0IHRydWUvZmFsc2UgKi8KIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdGFibGU7CiAJY29uc3QgaW50ICphaV9yYW5nZV9jb2RlOwogCWNvbnN0IGludCAqYWlfcmFuZ2VfaXNfdW5pcG9sYXI7Ci0JdW5zaWduZWQgYWlfc2Nhbl91cDoxOwkvKiAgYm9hcmQgY2FuIGF1dG8gc2NhbiB1cCBpbiBhaSBjaGFubmVscywgbm90IGp1c3QgZG93biAqLwotCXVuc2lnbmVkIG1lbW9yeV9tYXBwZWRfaW86MTsJLyogdXNlcyBtZW1vcnkgbWFwcGVkIGlvIGluc3RlYWQgb2YgaW9wb3J0cyAqLworCisJLyogIGJvYXJkIGNhbiBhdXRvIHNjYW4gdXAgaW4gYWkgY2hhbm5lbHMsIG5vdCBqdXN0IGRvd24gKi8KKwl1bnNpZ25lZCBhaV9zY2FuX3VwOjE7CisKKwkvKiB1c2VzIG1lbW9yeSBtYXBwZWQgaW8gaW5zdGVhZCBvZiBpb3BvcnRzICovCisJdW5zaWduZWQgbWVtb3J5X21hcHBlZF9pbzoxOwogfTsKIAogc3RydWN0IGxhYnBjX3ByaXZhdGUgewogCXN0cnVjdCBtaXRlX3N0cnVjdCAqbWl0ZTsJLyogIGZvciBtaXRlIGNoaXAgb24gcGNpLTEyMDAgKi8KLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgY291bnQ7CS8qIG51bWJlciBvZiBkYXRhIHBvaW50cyBsZWZ0IHRvIGJlIHRha2VuICovCi0JdW5zaWduZWQgaW50IGFvX3ZhbHVlW05VTV9BT19DSEFOXTsJLyogIHNvZnR3YXJlIGNvcHkgb2YgYW5hbG9nIG91dHB1dCB2YWx1ZXMgKi8KKwkvKiAgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGxlZnQgdG8gYmUgdGFrZW4gKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgY291bnQ7CisJLyogIHNvZnR3YXJlIGNvcHkgb2YgYW5hbG9nIG91dHB1dCB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBpbnQgYW9fdmFsdWVbTlVNX0FPX0NIQU5dOwogCS8qICBzb2Z0d2FyZSBjb3B5cyBvZiBiaXRzIHdyaXR0ZW4gdG8gY29tbWFuZCByZWdpc3RlcnMgKi8KIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29tbWFuZDFfYml0czsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29tbWFuZDJfYml0czsKQEAgLTYxLDE2ICs2OSwzNCBAQAogCS8qICBzdG9yZSBsYXN0IHJlYWQgb2YgYm9hcmQgc3RhdHVzIHJlZ2lzdGVycyAqLwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCBzdGF0dXMxX2JpdHM7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50IHN0YXR1czJfYml0czsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcl9hMDsJLyogdmFsdWUgdG8gbG9hZCBpbnRvIGJvYXJkJ3MgY291bnRlciBhMCAoY29udmVyc2lvbiBwYWNpbmcpIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yX2IwOwkvKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGIwIChtYXN0ZXIpIGZvciB0aW1lZCBjb252ZXJzaW9ucyAqLwotCXVuc2lnbmVkIGludCBkaXZpc29yX2IxOwkvKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGIxIChzY2FuIHBhY2luZykgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCisJLyoKKwkgKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGEwIChjb252ZXJzaW9uIHBhY2luZykgZm9yIHRpbWVkCisJICogY29udmVyc2lvbnMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZGl2aXNvcl9hMDsKKwkvKgorCSAqIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYjAgKG1hc3RlcikgZm9yIHRpbWVkIGNvbnZlcnNpb25zCisJICovCisJdW5zaWduZWQgaW50IGRpdmlzb3JfYjA7CisJLyoKKwkgKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGIxIChzY2FuIHBhY2luZykgZm9yIHRpbWVkCisJICogY29udmVyc2lvbnMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZGl2aXNvcl9iMTsKIAl1bnNpZ25lZCBpbnQgZG1hX2NoYW47CS8qICBkbWEgY2hhbm5lbCB0byB1c2UgKi8KIAl1MTYgKmRtYV9idWZmZXI7CS8qICBidWZmZXIgYWkgd2lsbCBkbWEgaW50byAqLwotCXVuc2lnbmVkIGludCBkbWFfdHJhbnNmZXJfc2l6ZTsJLyogIHRyYW5zZmVyIHNpemUgaW4gYnl0ZXMgZm9yIGN1cnJlbnQgdHJhbnNmZXIgKi8KLQllbnVtIHRyYW5zZmVyX3R5cGUgY3VycmVudF90cmFuc2ZlcjsJLyogIHdlIGFyZSB1c2luZyBkbWEvZmlmby1oYWxmLWZ1bGwvZXRjLiAqLwotCXVuc2lnbmVkIGludCBlZXByb21fZGF0YVtFRVBST01fU0laRV07CS8qICBzdG9yZXMgY29udGVudHMgb2YgYm9hcmQncyBlZXByb20gKi8KLQl1bnNpZ25lZCBpbnQgY2FsZGFjWzE2XTsJLyogIHN0b3JlcyBzZXR0aW5ncyBvZiBjYWxpYnJhdGlvbiBkYWNzICovCi0JLyogIGZ1bmN0aW9uIHBvaW50ZXJzIHNvIHdlIGNhbiB1c2UgaW5iL291dGIgb3IgcmVhZGIvd3JpdGViIGFzIGFwcHJvcHJpYXRlICovCisJLyogdHJhbnNmZXIgc2l6ZSBpbiBieXRlcyBmb3IgY3VycmVudCB0cmFuc2ZlciAqLworCXVuc2lnbmVkIGludCBkbWFfdHJhbnNmZXJfc2l6ZTsKKwkvKiB3ZSBhcmUgdXNpbmcgZG1hL2ZpZm8taGFsZi1mdWxsL2V0Yy4gKi8KKwllbnVtIHRyYW5zZmVyX3R5cGUgY3VycmVudF90cmFuc2ZlcjsKKwkvKiBzdG9yZXMgY29udGVudHMgb2YgYm9hcmQncyBlZXByb20gKi8KKwl1bnNpZ25lZCBpbnQgZWVwcm9tX2RhdGFbRUVQUk9NX1NJWkVdOworCS8qIHN0b3JlcyBzZXR0aW5ncyBvZiBjYWxpYnJhdGlvbiBkYWNzICovCisJdW5zaWduZWQgaW50IGNhbGRhY1sxNl07CisJLyoKKwkgKiBmdW5jdGlvbiBwb2ludGVycyBzbyB3ZSBjYW4gdXNlIGluYi9vdXRiIG9yIHJlYWRiL3dyaXRlYiBhcworCSAqIGFwcHJvcHJpYXRlCisJICovCiAJdW5zaWduZWQgaW50ICgqcmVhZF9ieXRlKSAodW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIAl2b2lkICgqd3JpdGVfYnl0ZSkgKHVuc2lnbmVkIGludCBieXRlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMKaW5kZXggN2Q1MTRiMy4uMGI5NjNiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NzLmMKQEAgLTU5LDggKzU5LDcgQEAKIAogKi8KIAotI3VuZGVmIExBQlBDX0RFQlVHCi0JCQkgICAgLyogI2RlZmluZSBMQUJQQ19ERUJVRyAqLy8qICBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzICovCisjdW5kZWYgTEFCUENfREVCVUcgIC8qIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKQEAgLTc3LDE0ICs3NiwxNSBAQAogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KIAotc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlICpwY21jaWFfY3VyX2RldiA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBjbWNpYV9jdXJfZGV2OwogCiBzdGF0aWMgaW50IGxhYnBjX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxhYnBjX2JvYXJkX3N0cnVjdCBsYWJwY19jc19ib2FyZHNbXSA9IHsKIAl7CiAJIC5uYW1lID0gImRhcWNhcmQtMTIwMCIsCi0JIC5kZXZpY2VfaWQgPSAweDEwMywJLyogIDB4MTBiIGlzIG1hbnVmYWN0dXJlciBpZCwgMHgxMDMgaXMgZGV2aWNlIGlkICovCisJIC5kZXZpY2VfaWQgPSAweDEwMywJLyogMHgxMGIgaXMgbWFudWZhY3R1cmVyIGlkLAorCQkJCSAgIDB4MTAzIGlzIGRldmljZSBpZCAqLwogCSAuYWlfc3BlZWQgPSAxMDAwMCwKIAkgLmJ1c3R5cGUgPSBwY21jaWFfYnVzdHlwZSwKIAkgLnJlZ2lzdGVyX2xheW91dCA9IGxhYnBjXzEyMDBfbGF5b3V0LApAQCAtMjczLDkgKzI3Myw4IEBACiAJCWxhYnBjX3JlbGVhc2UobGluayk7CiAJfQogCi0JLyogVGhpcyBwb2ludHMgdG8gdGhlIHBhcmVudCBsb2NhbF9pbmZvX3Qgc3RydWN0ICovCi0JaWYgKGxpbmstPnByaXYpCi0JCWtmcmVlKGxpbmstPnByaXYpOworCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBwYXJlbnQgbG9jYWxfaW5mb190IHN0cnVjdCAobWF5IGJlIG51bGwpICovCisJa2ZyZWUobGluay0+cHJpdik7CiAKIH0JCQkJLyogbGFicGNfY3NfZGV0YWNoICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCmluZGV4IDc1M2VlMDUuLmQ2ZDQ5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwpAQCAtMjIwNyw3ICsyMjA3LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX05PVyAmJgogCSAgICBjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0lOVCAmJiBjbWQtPnN0YXJ0X3NyYyAhPSBUUklHX0VYVCkKIAkJZXJyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKaW5kZXggZDY5MmY0Yi4uZGM0ODQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwpAQCAtMjUwLDkgKzI1MCw4IEBACiAKIAkvKiBQQ01DSUEgbGF5ZXIgZnJlZXMgdGhlIElPIHJlZ2lvbiAqLwogCi0JaWYgKGRldi0+aXJxKSB7CisJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5Myw5ICsyOTIsOCBAQAogewogCURQUklOVEsoImNzX2RldGFjaChsaW5rPSVwKVxuIiwgbGluayk7CiAKLQlpZiAobGluay0+ZGV2X25vZGUpIHsKKwlpZiAobGluay0+ZGV2X25vZGUpCiAJCWNzX3JlbGVhc2UobGluayk7Ci0JfQogfQogCiBzdGF0aWMgaW50IG1pb19jc19zdXNwZW5kKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQpAQCAtMzg3LDkgKzM4NSw4IEBACiAJCX0KIAkJcHJpbnRrKCJcbiIpOwogCQlwcmludGsoIiBib2FyZCBmaW5nZXJwcmludCAod2luZG93ZWQpOiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKIAkJCXByaW50aygiIDB4JTA0eCIsIHdpbl9pbihpKSk7Ci0JCX0KIAkJcHJpbnRrKCJcbiIpOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCmluZGV4IGQ1NDQ2OTguLjJkODhhNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKQEAgLTc5NSw3ICs3OTUsNyBAQAogCiAJLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAotCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCisJLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlICovCiAJaWYgKGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfTk9XICYmIGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfSU5UKQogCQllcnIrKzsKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKaW5kZXggZGQ5ZGIwNi4uNDkxNDc4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYwpAQCAtNDA3LDYgKzQwNyw3IEBACiAJCSAqICAweGI0ID0gU2VsZWN0IENvdW50ZXIgMiB8IExTQi9NU0IgfCBNb2RlPTIgfCBCaW5hcnkKIAkJICovCiAKKwkJdGltZXIxID0gdGltZXIyID0gMDsKIAkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihpODI1M19vc2NfYmFzZSwgJnRpbWVyMSwgJnRpbWVyMiwKIAkJCQkJICAmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJICBUUklHX1JPVU5EX05FQVJFU1QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jCmluZGV4IGNjYWRkMDkuLjZhMWE5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMKQEAgLTM5LDI3ICszOSwyNyBAQAogICAgIE9wdGlvbnMgZm9yIFBDTC03MjY6CiAgICAgIFswXSAtIElPIEJhc2UKICAgICAgWzJdLi4uWzddIC0gRC9BIG91dHB1dCByYW5nZSBmb3IgY2hhbm5lbCAxLTY6Ci0gICAgICAgICAgICAgICAwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsIDM6ICsvLTEwViwKLQkgICAgICAgNDogNC0yMG1BLCA1OiB1bmtub3duIChleHRlcm5hbCByZWZlcmVuY2UpCisJCTA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwgMzogKy8tMTBWLAorCQk0OiA0LTIwbUEsIDU6IHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogICAgIE9wdGlvbnMgZm9yIFBDTC03Mjc6CiAgICAgIFswXSAtIElPIEJhc2UKICAgICAgWzJdLi4uWzEzXSAtIEQvQSBvdXRwdXQgcmFuZ2UgZm9yIGNoYW5uZWwgMS0xMjoKLSAgICAgICAgICAgICAgIDA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwKLQkgICAgICAgMzogNC0yMG1BCisJCTA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwKKwkJMzogNC0yMG1BCiAKICAgICBPcHRpb25zIGZvciBQQ0wtNzI4IGFuZCBBQ0wtNjEyODoKICAgICAgWzBdIC0gSU8gQmFzZQogICAgICBbMl0sIFszXSAtIEQvQSBvdXRwdXQgcmFuZ2UgZm9yIGNoYW5uZWwgMSBhbmQgMjoKLSAgICAgICAgICAgICAgIDA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwgMzogKy8tMTBWLAotCSAgICAgICA0OiA0LTIwbUEsIDU6IDAtMjBtQQorCQkwOiAwLTVWLCAxOiAwLTEwViwgMjogKy8tNVYsIDM6ICsvLTEwViwKKwkJNDogNC0yMG1BLCA1OiAwLTIwbUEKIAogICAgIE9wdGlvbnMgZm9yIEFDTC02MTI2OgogICAgICBbMF0gLSBJTyBCYXNlCiAgICAgIFsxXSAtIElSUSAoMD1kaXNhYmxlLCAzLCA1LCA2LCA3LCA5LCAxMCwgMTEsIDEyLCAxNSkgKGN1cnJlbnRseSBpZ25vcmVkKQogICAgICBbMl0uLi5bN10gLSBEL0Egb3V0cHV0IHJhbmdlIGZvciBjaGFubmVsIDEtNjoKLSAgICAgICAgICAgICAgIDA6IDAtNVYsIDE6IDAtMTBWLCAyOiArLy01ViwgMzogKy8tMTBWLAotCSAgICAgICA0OiA0LTIwbUEKKwkJMDogMC01ViwgMTogMC0xMFYsIDI6ICsvLTVWLCAzOiArLy0xMFYsCisJCTQ6IDQtMjBtQQogKi8KIAogLyoKQEAgLTEyNyw3ICsxMjcsOCBAQAogCWludCBkaV9sbzsKIAlpbnQgZG9faGk7CiAJaW50IGRvX2xvOwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpjb25zdCAqcmFuZ2VfdHlwZV9saXN0OwkvKiAgbGlzdCBvZiBzdXBwb3J0ZWQgcmFuZ2VzICovCisJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmNvbnN0ICpyYW5nZV90eXBlX2xpc3Q7CisJLyogIGxpc3Qgb2Ygc3VwcG9ydGVkIHJhbmdlcyAqLwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2w3MjZfYm9hcmQgYm9hcmR0eXBlc1tdID0gewpAQCAtMjA0LDkgKzIwNSw4IEBACiAJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAlpbnQgbjsKIAotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKKwlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKQogCQlkYXRhW25dID0gZGV2cHJpdi0+YW9fcmVhZGJhY2tbY2hhbl07Ci0JfQogCXJldHVybiBuOwogfQogCkBAIC0yNTYsMTAgKzI1NiwxMCBAQAogCiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07CiAJaW9yYW5nZSA9IHRoaXNfYm9hcmQtPmlvX3JhbmdlOwotCXByaW50aygiY29tZWRpJWQ6IHBjbDcyNjogYm9hcmQ9JXMsIDB4JTAzbHggIiwgZGV2LT5taW5vciwKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjb21lZGklZDogcGNsNzI2OiBib2FyZD0lcywgMHglMDNseCAiLCBkZXYtPm1pbm9yLAogCSAgICAgICB0aGlzX2JvYXJkLT5uYW1lLCBpb2Jhc2UpOwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBpb3JhbmdlLCAicGNsNzI2IikpIHsKLQkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkkvTyBwb3J0IGNvbmZsaWN0XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0yODMsMTYgKzI4MywxNiBAQAogCQlkZXZwcml2LT5maXJzdF9jaGFuID0gMjsKIAkJaWYgKGlycSkgewkvKiB3ZSB3YW50IHRvIHVzZSBJUlEgKi8KIAkJCWlmICgoKDEgPDwgaXJxKSAmIGJvYXJkdHlwZXNbYm9hcmRdLklSUWJpdHMpID09IDApIHsKLQkJCQlwcmludGsKLQkJCQkgICAgKCIsIElSUSAlZCBpcyBvdXQgb2YgYWxsb3dlZCByYW5nZSwgRElTQUJMSU5HIElUIiwKLQkJCQkgICAgIGlycSk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiLCBJUlEgJWQgaXMgb3V0IG9mIGFsbG93ZWQgcmFuZ2UsIgorCQkJCQkiIERJU0FCTElORyBJVCIsIGlycSk7CiAJCQkJaXJxID0gMDsJLyogQmFkIElSUSAqLwogCQkJfSBlbHNlIHsKIAkJCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBpbnRlcnJ1cHRfcGNsODE4LCAwLAogCQkJCQkJInBjbDcyNiIsIGRldikpIHsKLQkJCQkJcHJpbnRrCi0JCQkJCSAgICAoIiwgdW5hYmxlIHRvIGFsbG9jYXRlIElSUSAlZCwgRElTQUJMSU5HIElUIiwKLQkJCQkJICAgICBpcnEpOworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkiLCB1bmFibGUgdG8gYWxsb2NhdGUgSVJRICVkLCIKKwkJCQkJCSIgRElTQUJMSU5HIElUIiwgaXJxKTsKIAkJCQkJaXJxID0gMDsJLyogQ2FuJ3QgdXNlIElSUSAqLwogCQkJCX0gZWxzZSB7CiAJCQkJCXByaW50aygiLCBpcnE9JWQiLCBpcnEpOwpAQCAtMzcyLDkgKzM3Miw4IEBACiAvKiBwcmludGsoImNvbWVkaSVkOiBwY2w3MjY6IHJlbW92ZVxuIixkZXYtPm1pbm9yKTsgKi8KIAogI2lmZGVmIEFDTDYxMjZfSVJRCi0JaWYgKGRldi0+aXJxKSB7CisJaWYgKGRldi0+aXJxKQogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQl9CiAjZW5kaWYKIAogCWlmIChkZXYtPmlvYmFzZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwppbmRleCAwYjUxYTQ4Li4wYTViYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgIDU9QS9EIGlucHV0IHJhbmdlIGlzICsvLTAuMzEyNVYKICAgWzVdIC0gMD1EL0Egb3V0cHV0cyAwLTVWICAoaW50ZXJuYWwgcmVmZXJlbmNlIC01VikKICAgICAgICAgMT1EL0Egb3V0cHV0cyAwLTEwViAoaW50ZXJuYWwgcmVmZXJlbmNlIC0xMFYpCi0gICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93IChleHRlcm5hbCByZWZlcmVuY2UpCisgICAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiBPcHRpb25zIGZvciBQQ0wtODEyUEcsIEFDTC04MTEyUEc6CiAgIFswXSAtIElPIEJhc2UKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgMT1BL0QgaGF2ZSBtYXggKy8tMTBWIGlucHV0CiAgIFs1XSAtIDA9RC9BIG91dHB1dHMgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgIDE9RC9BIG91dHB1dHMgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotICAgICAgICAyPUQvQSBvdXRwdXRzIHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorICAgICAgICAyPUQvQSBvdXRwdXRzIHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogT3B0aW9ucyBmb3IgQUNMLTgxMTJERy9IRywgQS04MjJQR0wvUEdILCBBLTgyM1BHTC9QR0gsIEFDTC04MjE2LCBBLTgyNlBHOgogICBbMF0gLSBJTyBCYXNlCkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgIDE9QS9EIGNoYW5uZWxzIGFyZSBESUZGCiAgIFs1XSAtIDA9RC9BIG91dHB1dHMgMC01ViAgKGludGVybmFsIHJlZmVyZW5jZSAtNVYpCiAgICAgICAgIDE9RC9BIG91dHB1dHMgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotICAgICAgICAyPUQvQSBvdXRwdXRzIHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorICAgICAgICAyPUQvQSBvdXRwdXRzIHVua25vd24gKGV4dGVybmFsIHJlZmVyZW5jZSkKIAogT3B0aW9ucyBmb3IgQS04MjFQR0wvUEdIOgogICBbMF0gLSBJTyBCYXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKaW5kZXggZmEyNDE0NS4uODUyZmUyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJaW50IG5fZGljaGFuOwkJLyogIG51bSBvZiBESSBjaGFucyAqLwogCWludCBuX2RvY2hhbjsJCS8qICBudW0gb2YgRE8gY2hhbnMgKi8KIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdHlwZTsJLyogIGRlZmF1bHQgQS9EIHJhbmdlbGlzdCAqLwotCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICphb19yYW5nZV90eXBlOwkvKiAgZGFmYXVsdCBEL0EgcmFuZ2VsaXN0ICovCisJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX3R5cGU7CS8qICBkZWZhdWx0IEQvQSByYW5nZWxpc3QgKi8KIAl1bnNpZ25lZCBpbnQgaW9fcmFuZ2U7CS8qICBsZW4gb2YgSU8gc3BhY2UgKi8KIAl1bnNpZ25lZCBpbnQgSVJRYml0czsJLyogIGFsbG93ZWQgaW50ZXJydXB0cyAqLwogCXVuc2lnbmVkIGludCBETUFiaXRzOwkvKiAgYWxsb3dlZCBETUEgY2hhbnMgKi8KQEAgLTQ0NSw3ICs0NDUsNyBAQAogCQljb21lZGlfZXJyb3IoZGV2LCAiYmFkIElSUSEiKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KLQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93IHNvdXJjZSEiKTsKKwljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93biBzb3VyY2UhIik7CiAJcmV0dXJuIElSUV9OT05FOwogfQogCkBAIC00NzIsNyArNDcyLDcgQEAKIAkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcCwgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCB0bXAsIGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCiAJREVCVUcocHJpbnRrKCJwY2w4MTYgcGNsODEyX2FpX2NtZHRlc3RcbiIpOyBwY2w4MTZfY21kdGVzdF9vdXQoLTEsIGNtZCk7CiAJICAgICk7CkBAIC00ODgsNyArNDg4LDkgQEAKIAlpZiAoIWNtZC0+c2Nhbl9iZWdpbl9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9iZWdpbl9zcmMpCiAJCWVycisrOwogCi0JaWYgKCEoY21kLT5jb252ZXJ0X3NyYyAmIChUUklHX0VYVCB8IFRSSUdfVElNRVIpKSkKKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19FWFQgfCBUUklHX1RJTUVSOworCWlmICghY21kLT5jb252ZXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5jb252ZXJ0X3NyYykKIAkJZXJyKys7CiAKIAl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYwppbmRleCBlOTUyMjliLi5kMDQ4MTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgICAgMSwgMTA9QS9EIGlucHV0IC0xMFYuLisxMFYKICAgICBbNV0gLSAwLCAgNT1EL0Egb3V0cHV0IDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAgIDEsIDEwPUQvQSBvdXRwdXQgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotCSAgMiAgICA9RC9BIG91dHB1dCB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKwkgIDIgICAgPUQvQSBvdXRwdXQgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiAgICBPcHRpb25zIGZvciBQQ0wtODE4LCBQQ0wtODE4SDoKICAgICBbMF0gLSBJTyBCYXNlCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgICAgICAgIDE9IDFNSHogY2xvY2sgZm9yIDgyNTQKICAgICBbNF0gLSAwLCAgNT1EL0Egb3V0cHV0IDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAgIDEsIDEwPUQvQSBvdXRwdXQgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotCSAgMiAgICA9RC9BIG91dHB1dCB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKwkgIDIgICAgPUQvQSBvdXRwdXQgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiAgICBPcHRpb25zIGZvciBQQ0wtODE4SEQsIFBDTC04MThIRzoKICAgICBbMF0gLSBJTyBCYXNlCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICAgIDE9IDFNSHogY2xvY2sgZm9yIDgyNTQKICAgICBbNF0gLSAwLCAgNT1EL0Egb3V0cHV0IDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAgIDEsIDEwPUQvQSBvdXRwdXQgMC0xMFYgKGludGVybmFsIHJlZmVyZW5jZSAtMTBWKQotICAgCSAgMiAgICA9RC9BIG91dHB1dCB1bmtub3cgKGV4dGVybmFsIHJlZmVyZW5jZSkKKyAgIAkgIDIgICAgPUQvQSBvdXRwdXQgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogCiAgICBPcHRpb25zIGZvciBQQ0wtNzE4OgogICAgIFswXSAtIElPIEJhc2UKQEAgLTkyLDcgKzkyLDcgQEAKIAkgICAgIDEwPQkgICAgIHVzZXIgZGVmaW5lZCB1bmlwb2xhcgogICAgIFs1XSAtIDAsICA1PUQvQSBvdXRwdXRzIDAtNVYgIChpbnRlcm5hbCByZWZlcmVuY2UgLTVWKQogICAgICAgICAgIDEsIDEwPUQvQSBvdXRwdXRzIDAtMTBWIChpbnRlcm5hbCByZWZlcmVuY2UgLTEwVikKLQkgICAgICAyPUQvQSBvdXRwdXRzIHVua25vdyAoZXh0ZXJuYWwgcmVmZXJlbmNlKQorCSAgICAgIDI9RC9BIG91dHB1dHMgdW5rbm93biAoZXh0ZXJuYWwgcmVmZXJlbmNlKQogICAgIFs2XSAtIDAsIDYwPW1heCAgNjBrSHogQS9EIHNhbXBsaW5nCiAgICAgICAgICAgMSwxMDA9bWF4IDEwMGtIeiBBL0Qgc2FtcGxpbmcgKFBDTC03MTggd2l0aCBPcHRpb24gMDAxIGluc3RhbGxlZCkKIApAQCAtODc2LDcgKzg3Niw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93IHNvdXJjZSEiKTsKKwljb21lZGlfZXJyb3IoZGV2LCAiSVJRIGZyb20gdW5rbm93biBzb3VyY2UhIik7CiAJcmV0dXJuIElSUV9OT05FOwogfQogCkBAIC05NzAsNyArOTcwLDcgQEAKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKLQlpbnQgZGl2aXNvcjEsIGRpdmlzb3IyOworCWludCBkaXZpc29yMSA9IDAsIGRpdmlzb3IyID0gMDsKIAl1bnNpZ25lZCBpbnQgc2VnbGVuOwogCiAJcHJpbnRrKCJwY2w4MThfYWlfY21kX21vZGUoKVxuIik7CkBAIC0xMDg5LDcgKzEwODksNyBAQAogc3RhdGljIGludCBwY2w4MThfYW9fbW9kZTEzKGludCBtb2RlLCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLCBjb21lZGlfdHJpZyAqIGl0KQogewotCWludCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IGRpdmlzb3IxID0gMCwgZGl2aXNvcjIgPSAwOwogCiAJaWYgKCFkZXYtPmlycSkgewogCQljb21lZGlfZXJyb3IoZGV2LCAiSVJRIG5vdCBkZWZpbmVkISIpOwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKIAkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAlpbnQgZXJyID0gMDsKLQlpbnQgdG1wLCBkaXZpc29yMSwgZGl2aXNvcjI7CisJaW50IHRtcCwgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKIAkvKiBzdGVwIDE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbV9jb21tb24uYwppbmRleCBlYmQ5ODM4Li41MmMyYTY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbV9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtX2NvbW1vbi5jCkBAIC00MSw3ICs0MSw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKLQkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLworCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZAorCSAqIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIAogCS8qIHRoZXNlIHRlc3RzIGFyZSB0cnVlIGlmIG1vcmUgdGhhbiBvbmUgX3NyYyBiaXQgaXMgc2V0ICovCiAJaWYgKChjbWQtPnN0YXJ0X3NyYyAmIChjbWQtPnN0YXJ0X3NyYyAtIDEpKSAhPSAwKQpAQCAtMTA3LDUgKzEwOCw0IEBACiAKIAlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTChjb21lZGlfcGNtX2NtZHRlc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCmluZGV4IGQ4MTJjMmMuLjM1YmE5MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKQEAgLTMyLDggKzMyLDEwIEBACiBmb3VyIHN1YmRldmljZXM6CiAgIHN1YmRldmljZSAwIC0gMTYgY2hhbm5lbHMgb2YgMTYtYml0IEFJCiAgIHN1YmRldmljZSAxIC0gOCBjaGFubmVscyBvZiAxNi1iaXQgQU8KLSAgc3ViZGV2aWNlIDIgLSBmaXJzdCAyNCBjaGFubmVscyBvZiB0aGUgNDggY2hhbm5lbCBvZiBESU8gKHdpdGggZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0IHN1cHBvcnQpCi0gIHN1YmRldmljZSAzIC0gbGFzdCAyNCBjaGFubmVscyBvZiB0aGUgNDggY2hhbm5lbCBESU8gKG5vIGludGVycnVwdCBzdXBwb3J0IGZvciB0aGlzIGJhbmsgb2YgY2hhbm5lbHMpCisgIHN1YmRldmljZSAyIC0gZmlyc3QgMjQgY2hhbm5lbHMgb2YgdGhlIDQ4IGNoYW5uZWwgb2YgRElPCisJKHdpdGggZWRnZS10cmlnZ2VyZWQgaW50ZXJydXB0IHN1cHBvcnQpCisgIHN1YmRldmljZSAzIC0gbGFzdCAyNCBjaGFubmVscyBvZiB0aGUgNDggY2hhbm5lbCBESU8KKwkobm8gaW50ZXJydXB0IHN1cHBvcnQgZm9yIHRoaXMgYmFuayBvZiBjaGFubmVscykKIAogICBTb21lIG5vdGVzOgogCkBAIC03MCw3ICs3Miw4IEBACiAKIENvbmZpZ3VyYXRpb24gT3B0aW9uczoKICAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCi0gIFsxXSAtIElSUSAob3B0aW9uYWwgLS0gZm9yIGVkZ2UtZGV0ZWN0IGludGVycnVwdCBzdXBwb3J0IG9ubHksIGxlYXZlIG91dCBpZiB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZlYXR1cmUpCisgIFsxXSAtIElSUSAob3B0aW9uYWwgLS0gZm9yIGVkZ2UtZGV0ZWN0IGludGVycnVwdCBzdXBwb3J0IG9ubHksCisJbGVhdmUgb3V0IGlmIHlvdSBkb24ndCBuZWVkIHRoaXMgZmVhdHVyZSkKICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTExNSw5ICsxMTgsMTEgQEAKICNkZWZpbmUgUkVHX1BPUlQ0IDB4NAogI2RlZmluZSBSRUdfUE9SVDUgMHg1CiAjZGVmaW5lIFJFR19JTlRfUEVORElORyAweDYKLSNkZWZpbmUgUkVHX1BBR0VMT0NLIDB4NwkvKiBwYWdlIHNlbGVjdG9yIHJlZ2lzdGVyLCB1cHBlciAyIGJpdHMgc2VsZWN0IGEgcGFnZQotCQkJCSAgIGFuZCBiaXRzIDAtNSBhcmUgdXNlZCB0byAnbG9jayBkb3duJyBhIHBhcnRpY3VsYXIKLQkJCQkgICBwb3J0IGFib3ZlIHRvIG1ha2UgaXQgcmVhZG9ubHkuICAqLworI2RlZmluZSBSRUdfUEFHRUxPQ0sgMHg3CS8qCisJCQkJICogcGFnZSBzZWxlY3RvciByZWdpc3RlciwgdXBwZXIgMiBiaXRzIHNlbGVjdAorCQkJCSAqIGEgcGFnZSBhbmQgYml0cyAwLTUgYXJlIHVzZWQgdG8gJ2xvY2sgZG93bicKKwkJCQkgKiBhIHBhcnRpY3VsYXIgcG9ydCBhYm92ZSB0byBtYWtlIGl0IHJlYWRvbmx5LgorCQkJCSAqLwogI2RlZmluZSBSRUdfUE9MMCAweDgKICNkZWZpbmUgUkVHX1BPTDEgMHg5CiAjZGVmaW5lIFJFR19QT0wyIDB4QQpAQCAtMTM0LDcgKzEzOSw3IEBACiAjZGVmaW5lIFJFR19QQUdFX0JJVE9GRlNFVCA2CiAjZGVmaW5lIFJFR19MT0NLX0JJVE9GRlNFVCAwCiAjZGVmaW5lIFJFR19QQUdFX01BU0sgKH4oKDB4MTw8UkVHX1BBR0VfQklUT0ZGU0VUKS0xKSkKLSNkZWZpbmUgUkVHX0xPQ0tfTUFTSyB+KFJFR19QQUdFX01BU0spCisjZGVmaW5lIFJFR19MT0NLX01BU0sgKH4oUkVHX1BBR0VfTUFTSykpCiAjZGVmaW5lIFBBR0VfUE9MIDEKICNkZWZpbmUgUEFHRV9FTkFCIDIKICNkZWZpbmUgUEFHRV9JTlRfSUQgMwpAQCAtMTY4LDEzICsxNzMsMTIgQEAKIAljb21lZGlfaW5zbl9mbl90IGFpX3JpbnNuLCBhb19yaW5zbiwgYW9fd2luc247CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VzX2FpID0KLSAgICB7IDQsIHtSQU5HRSgtNS4sIDUuKSwgUkFOR0UoLTEwLiwgMTAuKSwgUkFOR0UoMC4sIDUuKSwgUkFOR0UoMC4sCi0JCQkJCQkJCSAxMC4pfQorc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlc19haSA9IHsKKwk0LCB7UkFOR0UoLTUuLCA1LiksIFJBTkdFKC0xMC4sIDEwLiksIFJBTkdFKDAuLCA1LiksIFJBTkdFKDAuLCAxMC4pfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlc19hbyA9Ci0gICAgeyA2LCB7UkFOR0UoMC4sIDUuKSwgUkFOR0UoMC4sIDEwLiksIFJBTkdFKC01LiwgNS4pLCBSQU5HRSgtMTAuLCAxMC4pLAorc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlc19hbyA9IHsKKwk2LCB7UkFOR0UoMC4sIDUuKSwgUkFOR0UoMC4sIDEwLiksIFJBTkdFKC01LiwgNS4pLCBSQU5HRSgtMTAuLCAxMC4pLAogCSAgUkFOR0UoLTIuNSwgMi41KSwgUkFOR0UoLTIuNSwgNy41KX0KIH07CiAKQEAgLTIwNCw3ICsyMDgsOCBAQAogc3RydWN0IHBjbW1pb19zdWJkZXZfcHJpdmF0ZSB7CiAKIAl1bmlvbiB7Ci0JCS8qIGZvciBESU86IG1hcHBpbmcgb2YgaGFsZndvcmRzIChieXRlcykgaW4gcG9ydC9jaGFuYXJyYXkgdG8gaW9iYXNlICovCisJCS8qIGZvciBESU86IG1hcHBpbmcgb2YgaGFsZndvcmRzIChieXRlcykKKwkJICAgaW4gcG9ydC9jaGFuYXJyYXkgdG8gaW9iYXNlICovCiAJCXVuc2lnbmVkIGxvbmcgaW9iYXNlc1tQT1JUU19QRVJfU1VCREVWXTsKIAogCQkvKiBmb3IgQUkvQU8gKi8KQEAgLTIxNSwxNSArMjIwLDMxIEBACiAKIAkJCS8qIFRoZSBiZWxvdyBpcyBvbmx5IHVzZWQgZm9yIGludHIgc3ViZGV2aWNlcyAqLwogCQkJc3RydWN0IHsKLQkJCQlpbnQgYXNpYzsJLyogaWYgbm9uLW5lZ2F0aXZlLCB0aGlzIHN1YmRldiBoYXMgYW4gaW50ZXJydXB0IGFzaWMgKi8KLQkJCQlpbnQgZmlyc3RfY2hhbjsJLyogaWYgbm9ubmVnYXRpdmUsIHRoZSBmaXJzdCBjaGFubmVsIGlkIGZvcgotCQkJCQkJICAgaW50ZXJydXB0cy4gKi8KLQkJCQlpbnQgbnVtX2FzaWNfY2hhbnM7CS8qIHRoZSBudW1iZXIgb2YgYXNpYyBjaGFubmVscyBpbiB0aGlzIHN1YmRldgotCQkJCQkJCSAgIHRoYXQgaGF2ZSBpbnRlcnJ1dHBzICovCi0JCQkJaW50IGFzaWNfY2hhbjsJLyogaWYgbm9ubmVnYXRpdmUsIHRoZSBmaXJzdCBjaGFubmVsIGlkIHdpdGgKLQkJCQkJCSAgIHJlc3BlY3QgdG8gdGhlIGFzaWMgdGhhdCBoYXMgaW50ZXJydXB0cyAqLwotCQkJCWludCBlbmFibGVkX21hc2s7CS8qIHN1YmRldi1yZWxhdGl2ZSBjaGFubmVsIG1hc2sgZm9yIGNoYW5uZWxzCi0JCQkJCQkJICAgd2UgYXJlIGludGVyZXN0ZWQgaW4gKi8KKwkJCQkvKgorCQkJCSAqIGlmIG5vbi1uZWdhdGl2ZSwgdGhpcyBzdWJkZXYgaGFzIGFuCisJCQkJICogaW50ZXJydXB0IGFzaWMKKwkJCQkgKi8KKwkJCQlpbnQgYXNpYzsKKwkJCQkvKgorCQkJCSAqIGlmIG5vbm5lZ2F0aXZlLCB0aGUgZmlyc3QgY2hhbm5lbCBpZCBmb3IKKwkJCQkgKiBpbnRlcnJ1cHRzLgorCQkJCSAqLworCQkJCWludCBmaXJzdF9jaGFuOworCQkJCS8qCisJCQkJICogdGhlIG51bWJlciBvZiBhc2ljIGNoYW5uZWxzIGluIHRoaXMgc3ViZGV2CisJCQkJICogdGhhdCBoYXZlIGludGVycnV0cHMKKwkJCQkgKi8KKwkJCQlpbnQgbnVtX2FzaWNfY2hhbnM7CisJCQkJLyoKKwkJCQkgKiBpZiBub25uZWdhdGl2ZSwgdGhlIGZpcnN0IGNoYW5uZWwgaWQgd2l0aAorCQkJCSAqIHJlc3BlY3QgdG8gdGhlIGFzaWMgdGhhdCBoYXMgaW50ZXJydXB0cworCQkJCSAqLworCQkJCWludCBhc2ljX2NoYW47CisJCQkJLyoKKwkJCQkgKiBzdWJkZXYtcmVsYXRpdmUgY2hhbm5lbCBtYXNrIGZvciBjaGFubmVscworCQkJCSAqIHdlIGFyZSBpbnRlcmVzdGVkIGluCisJCQkJICovCisJCQkJaW50IGVuYWJsZWRfbWFzazsKIAkJCQlpbnQgYWN0aXZlOwogCQkJCWludCBzdG9wX2NvdW50OwogCQkJCWludCBjb250aW51b3VzOwpAQCAtMjMxLDIwICsyNTIsMjUgQEAKIAkJCX0gaW50cjsKIAkJfSBkaW87CiAJCXN0cnVjdCB7Ci0JCQl1bnNpZ25lZCBpbnQgc2hhZG93X3NhbXBsZXNbOF07CS8qIHRoZSBsYXN0IHVuc2lnbmVkIGludCBkYXRhIHdyaXR0ZW4gKi8KKwkJCS8qIHRoZSBsYXN0IHVuc2lnbmVkIGludCBkYXRhIHdyaXR0ZW4gKi8KKwkJCXVuc2lnbmVkIGludCBzaGFkb3dfc2FtcGxlc1s4XTsKIAkJfSBhbzsKIAl9OwogfTsKIAotLyogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKLSAgIHNldmVyYWwgaGFyZHdhcmUgZHJpdmVycyBrZWVwIHNpbWlsYXIgaW5mb3JtYXRpb24gaW4gdGhpcyBzdHJ1Y3R1cmUsCi0gICBmZWVsIGZyZWUgdG8gc3VnZ2VzdCBtb3ZpbmcgdGhlIHZhcmlhYmxlIHRvIHRoZSBzdHJ1Y3QgY29tZWRpX2RldmljZSBzdHJ1Y3QuICAqLworLyoKKyAqIHRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4gIElmCisgKiBzZXZlcmFsIGhhcmR3YXJlIGRyaXZlcnMga2VlcCBzaW1pbGFyIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0dXJlLAorICogZmVlbCBmcmVlIHRvIHN1Z2dlc3QgbW92aW5nIHRoZSB2YXJpYWJsZSB0byB0aGUgc3RydWN0IGNvbWVkaV9kZXZpY2Ugc3RydWN0LgorICovCiBzdHJ1Y3QgcGNtbWlvX3ByaXZhdGUgewogCS8qIHN0dWZmIGZvciBESU8gKi8KIAlzdHJ1Y3QgewogCQl1bnNpZ25lZCBjaGFyIHBhZ2Vsb2NrOwkvKiBjdXJyZW50IHBhZ2UgYW5kIGxvY2sgKi8KLQkJdW5zaWduZWQgY2hhciBwb2xbTlVNX1BBR0VEX1JFR1NdOwkvKiBzaGFkb3cgb2YgUE9MeCByZWdpc3RlcnMgKi8KLQkJdW5zaWduZWQgY2hhciBlbmFiW05VTV9QQUdFRF9SRUdTXTsJLyogc2hhZG93IG9mIEVOQUJ4IHJlZ2lzdGVycyAqLworCQkvKiBzaGFkb3cgb2YgUE9MeCByZWdpc3RlcnMgKi8KKwkJdW5zaWduZWQgY2hhciBwb2xbTlVNX1BBR0VEX1JFR1NdOworCQkvKiBzaGFkb3cgb2YgRU5BQnggcmVnaXN0ZXJzICovCisJCXVuc2lnbmVkIGNoYXIgZW5hYltOVU1fUEFHRURfUkVHU107CiAJCWludCBudW07CiAJCXVuc2lnbmVkIGxvbmcgaW9iYXNlOwogCQl1bnNpZ25lZCBpbnQgaXJxOwpAQCAtMzEyLDcgKzMzOCw4IEBACiAJCQkgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpOwogCiAvKiBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHNwZWNpZmljcyBvZiB0aGlzIGRldmljZSdzIHJlZ2lzdGVycyAqLwotc3RhdGljIHZvaWQgaW5pdF9hc2ljcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsJLyogc2V0cyB1cC9jbGVhcnMgQVNJQyBjaGlwcyB0byBkZWZhdWx0cyAqLworLyogc2V0cyB1cC9jbGVhcnMgQVNJQyBjaGlwcyB0byBkZWZhdWx0cyAqLworc3RhdGljIHZvaWQgaW5pdF9hc2ljcyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHN3aXRjaF9wYWdlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBhc2ljLCBpbnQgcGFnZSk7CiAjaWZkZWYgbm90dXNlZAogc3RhdGljIHZvaWQgbG9ja19wb3J0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBhc2ljLCBpbnQgcG9ydCk7CkBAIC0zNjcsOSArMzk0LDExIEBACiAJCWRldnByaXYtPmFzaWNzW2FzaWNdLm51bSA9IGFzaWM7CiAJCWRldnByaXYtPmFzaWNzW2FzaWNdLmlvYmFzZSA9CiAJCSAgICBkZXYtPmlvYmFzZSArIDE2ICsgYXNpYyAqIEFTSUNfSU9TSVpFOwotCQlkZXZwcml2LT5hc2ljc1thc2ljXS5pcnEgPSAwOwkvKiB0aGlzIGdldHMgYWN0dWFsbHkgc2V0IGF0IHRoZSBlbmQgb2YKLQkJCQkJCSAgIHRoaXMgZnVuY3Rpb24gd2hlbiB3ZQotCQkJCQkJICAgcmVxdWVzdF9pcnFzICovCisJCS8qCisJCSAqIHRoaXMgZ2V0cyBhY3R1YWxseSBzZXQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uIHdoZW4gd2UKKwkJICogcmVxdWVzdF9pcnFzCisJCSAqLworCQlkZXZwcml2LT5hc2ljc1thc2ljXS5pcnEgPSAwOwogCQlzcGluX2xvY2tfaW5pdCgmZGV2cHJpdi0+YXNpY3NbYXNpY10uc3BpbmxvY2spOwogCX0KIApAQCAtNDYzLDcgKzQ5MiwxMCBAQAogCQkJaWYgKHRoaXNhc2ljX2NoYW5jdCA8CiAJCQkgICAgQ0hBTlNfUEVSX1BPUlQgKiBJTlRSX1BPUlRTX1BFUl9BU0lDCiAJCQkgICAgJiYgc3VicHJpdi0+ZGlvLmludHIuYXNpYyA8IDApIHsKLQkJCQkvKiB0aGlzIGlzIGFuIGludGVycnVwdCBzdWJkZXZpY2UsIHNvIHNldHVwIHRoZSBzdHJ1Y3QgKi8KKwkJCQkvKgorCQkJCSAqIHRoaXMgaXMgYW4gaW50ZXJydXB0IHN1YmRldmljZSwKKwkJCQkgKiBzbyBzZXR1cCB0aGUgc3RydWN0CisJCQkJICovCiAJCQkJc3VicHJpdi0+ZGlvLmludHIuYXNpYyA9IGFzaWM7CiAJCQkJc3VicHJpdi0+ZGlvLmludHIuYWN0aXZlID0gMDsKIAkJCQlzdWJwcml2LT5kaW8uaW50ci5zdG9wX2NvdW50ID0gMDsKQEAgLTQ4NCw3ICs1MTYsMTEgQEAKIAkJY2hhbnNfbGVmdCAtPSBzLT5uX2NoYW47CiAKIAkJaWYgKCFjaGFuc19sZWZ0KSB7Ci0JCQlhc2ljID0gMDsJLyogcmVzZXQgdGhlIGFzaWMgdG8gb3VyIGZpcnN0IGFzaWMsIHRvIGRvIGludHIgc3ViZGV2cyAqLworCQkJLyoKKwkJCSAqIHJlc2V0IHRoZSBhc2ljIHRvIG91ciBmaXJzdCBhc2ljLAorCQkJICogdG8gZG8gaW50ciBzdWJkZXZzCisJCQkgKi8KKwkJCWFzaWMgPSAwOwogCQkJcG9ydCA9IDA7CiAJCX0KIApAQCAtNTA3LDggKzU0MywxMCBAQAogCQlkZXZwcml2LT5hc2ljc1thc2ljXS5pcnEgPSBpcnFbYXNpY107CiAJfQogCi0JZGV2LT5pcnEgPSBpcnFbMF07CS8qIGdyci4uIHdpc2ggY29tZWRpIGRldiBzdHJ1Y3Qgc3VwcG9ydGVkIG11bHRpcGxlCi0JCQkJICAgaXJxcy4uICovCisJZGV2LT5pcnEgPSBpcnFbMF07CS8qCisJCQkJICogZ3JyLi4gd2lzaCBjb21lZGkgZGV2IHN0cnVjdCBzdXBwb3J0ZWQKKwkJCQkgKiBtdWx0aXBsZSBpcnFzLi4KKwkJCQkgKi8KIAogCWlmIChpcnFbMF0pIHsKIAkJcHJpbnRrKCJpcnE6ICV1ICIsIGlycVswXSk7CkBAIC02MDQsOSArNjQyLDE0IEBACiAjZW5kaWYKIAogCQlpZiAod3JpdGVfbWFza19ieXRlKSB7Ci0JCQkvKiB0aGlzIGJ5dGUgaGFzIHNvbWUgd3JpdGVfYml0cyAtLSBzbyBzZXQgdGhlIG91dHB1dCBsaW5lcyAqLwotCQkJYnl0ZSAmPSB+d3JpdGVfbWFza19ieXRlOwkvKiBjbGVhciBiaXRzIGZvciB3cml0ZSBtYXNrICovCi0JCQlieXRlIHw9IH5kYXRhX2J5dGUgJiB3cml0ZV9tYXNrX2J5dGU7CS8qIHNldCB0byBpbnZlcnRlZCBkYXRhX2J5dGUgKi8KKwkJCS8qCisJCQkgKiB0aGlzIGJ5dGUgaGFzIHNvbWUgd3JpdGVfYml0cworCQkJICogLS0gc28gc2V0IHRoZSBvdXRwdXQgbGluZXMKKwkJCSAqLworCQkJLyogY2xlYXIgYml0cyBmb3Igd3JpdGUgbWFzayAqLworCQkJYnl0ZSAmPSB+d3JpdGVfbWFza19ieXRlOworCQkJLyogc2V0IHRvIGludmVydGVkIGRhdGFfYnl0ZSAqLworCQkJYnl0ZSB8PSB+ZGF0YV9ieXRlICYgd3JpdGVfbWFza19ieXRlOwogCQkJLyogV3JpdGUgb3V0IHRoZSBuZXcgZGlnaXRhbCBvdXRwdXQgc3RhdGUgKi8KIAkJCW91dGIoYnl0ZSwgaW9hZGRyKTsKIAkJfQpAQCAtNjcwLDkgKzcxMywxMSBAQAogCQlieXRlICY9IH4oMSA8PCBiaXRfbm8pOwogCQkJCS8qKjwgc2V0IGlucHV0IGNoYW5uZWwgdG8gJzAnICovCiAKLQkJLyogd3JpdGUgb3V0IGJ5dGUgLS0gdGhpcyBpcyB0aGUgb25seSB0aW1lIHdlIGFjdHVhbGx5IGFmZmVjdCB0aGUKLQkJICAgaGFyZHdhcmUgYXMgYWxsIGNoYW5uZWxzIGFyZSBpbXBsaWNpdGx5IG91dHB1dCAtLSBidXQgaW5wdXQKLQkJICAgY2hhbm5lbHMgYXJlIHNldCB0byBmbG9hdC1oaWdoICovCisJCS8qCisJCSAqIHdyaXRlIG91dCBieXRlIC0tIHRoaXMgaXMgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBhZmZlY3QKKwkJICogdGhlIGhhcmR3YXJlIGFzIGFsbCBjaGFubmVscyBhcmUgaW1wbGljaXRseSBvdXRwdXQKKwkJICogLS0gYnV0IGlucHV0IGNoYW5uZWxzIGFyZSBzZXQgdG8gZmxvYXQtaGlnaAorCQkgKi8KIAkJb3V0YihieXRlLCBpb2FkZHIpOwogCiAJCS8qIHNhdmUgdG8gaW9fYml0cyAqLwpAQCAtNzI2LDggKzc3MSw4IEBACiAJCSAgIG91dGIoMHhmZiwgYmFzZWFkZHIgKyBSRUdfRU5BQjApOyAqLwogCQkvKiBFTkQgREVCVUcgKi8KIAotCQlzd2l0Y2hfcGFnZShkZXYsIGFzaWMsIDApOwkvKiBzd2l0Y2ggYmFjayB0byBkZWZhdWx0IHBhZ2UgMCAqLwotCisJCS8qIHN3aXRjaCBiYWNrIHRvIGRlZmF1bHQgcGFnZSAwICovCisJCXN3aXRjaF9wYWdlKGRldiwgYXNpYywgMCk7CiAJfQogfQogCkBAIC04MDYsNyArODUxLDEwIEBACiAJCQkJCQkJUkVHX0lOVF9JRDAgKyBwb3J0KTsKIAogCQkJCQkJaWYgKGlvX2xpbmVzX3dpdGhfZWRnZXMpCi0JCQkJCQkJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKwkJCQkJCQkvKgorCQkJCQkJCSAqIGNsZWFyIHBlbmRpbmcKKwkJCQkJCQkgKiBpbnRlcnJ1cHQKKwkJCQkJCQkgKi8KIAkJCQkJCQlvdXRiKDAsIGlvYmFzZSArCiAJCQkJCQkJICAgICBSRUdfSU5UX0lEMCArCiAJCQkJCQkJICAgICBwb3J0KTsKQEAgLTgyNSwxNCArODczLDIxIEBACiAKIAkJCWlmICh0cmlnZ2VyZWQpIHsKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKLQkJCQkvKiBUT0RPIGhlcmU6IGRpc3BhdGNoIGlvIGxpbmVzIHRvIHN1YmRldnMgd2l0aCBjb21tYW5kcy4uICovCisJCQkJLyoKKwkJCQkgKiBUT0RPIGhlcmU6IGRpc3BhdGNoIGlvIGxpbmVzIHRvIHN1YmRldnMKKwkJCQkgKiB3aXRoIGNvbW1hbmRzLi4KKwkJCQkgKi8KIAkJCQlwcmludGsKIAkJCQkgICAgKCJQQ01NSU8gREVCVUc6IGdvdCBlZGdlIGRldGVjdCBpbnRlcnJ1cHQgJWQgYXNpYyAlZCB3aGljaF9jaGFuczogJTA2eFxuIiwKIAkJCQkgICAgIGlycSwgYXNpYywgdHJpZ2dlcmVkKTsKIAkJCQlmb3IgKHMgPSBkZXYtPnN1YmRldmljZXMgKyAyOwogCQkJCSAgICAgcyA8IGRldi0+c3ViZGV2aWNlcyArIGRldi0+bl9zdWJkZXZpY2VzOwogCQkJCSAgICAgKytzKSB7Ci0JCQkJCWlmIChzdWJwcml2LT5kaW8uaW50ci5hc2ljID09IGFzaWMpIHsJLyogdGhpcyBpcyBhbiBpbnRlcnJ1cHQgc3ViZGV2LCBhbmQgaXQgbWF0Y2hlcyB0aGlzIGFzaWMhICovCisJCQkJCS8qCisJCQkJCSAqIHRoaXMgaXMgYW4gaW50ZXJydXB0IHN1YmRldiwKKwkJCQkJICogYW5kIGl0IG1hdGNoZXMgdGhpcyBhc2ljIQorCQkJCQkgKi8KKwkJCQkJaWYgKHN1YnByaXYtPmRpby5pbnRyLmFzaWMgPT0gYXNpYykgewogCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJCQkJCXVuc2lnbmVkIG9sZGV2ZW50czsKIApAQCAtODY3LDkgKzkyMiw4IEBACiAJCQkJCQkJCSAgICAgbiA8IGxlbjsKIAkJCQkJCQkJICAgICBuKyspIHsKIAkJCQkJCQkJCWNoID0gQ1JfQ0hBTihzLT5hc3luYy0+Y21kLmNoYW5saXN0W25dKTsKLQkJCQkJCQkJCWlmIChteXRyaWcgJiAoMVUgPDwgY2gpKSB7CisJCQkJCQkJCQlpZiAobXl0cmlnICYgKDFVIDw8IGNoKSkKIAkJCQkJCQkJCQl2YWwgfD0gKDFVIDw8IG4pOwotCQkJCQkJCQkJfQogCQkJCQkJCQl9CiAJCQkJCQkJCS8qIFdyaXRlIHRoZSBzY2FuIHRvIHRoZSBidWZmZXIuICovCiAJCQkJCQkJCWlmIChjb21lZGlfYnVmX3B1dChzLT5hc3luYywgKChzaG9ydCAqKSZ2YWwpWzBdKQpAQCAtODc3LDggKzkzMSw3IEBACiAJCQkJCQkJCSAgICBjb21lZGlfYnVmX3B1dAogCQkJCQkJCQkgICAgKHMtPmFzeW5jLAogCQkJCQkJCQkgICAgICgoc2hvcnQgKikKLQkJCQkJCQkJICAgICAgJnZhbClbMV0pKQotCQkJCQkJCQl7CisJCQkJCQkJCSAgICAgICZ2YWwpWzFdKSkgewogCQkJCQkJCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSAoQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VPUyk7CiAJCQkJCQkJCX0gZWxzZSB7CiAJCQkJCQkJCQkvKiBPdmVyZmxvdyEgU3RvcCBhY3F1aXNpdGlvbiEhICovCkBAIC05ODEsOSArMTAzNCwxNiBAQAogCQkJIDEpIDw8IHN1YnByaXYtPmRpby5pbnRyLmZpcnN0X2NoYW47CiAJCXN1YnByaXYtPmRpby5pbnRyLmVuYWJsZWRfbWFzayA9IGJpdHM7CiAKLQkJewkJLyogdGhlIGJlbG93IGNvZGUgY29uZmlndXJlcyB0aGUgYm9hcmQgdG8gdXNlIGEgc3BlY2lmaWMgSVJRIGZyb20gMC0xNS4gKi8KKwkJeworCQkJLyoKKwkJCSAqIHRoZSBiZWxvdyBjb2RlIGNvbmZpZ3VyZXMgdGhlIGJvYXJkCisJCQkgKiB0byB1c2UgYSBzcGVjaWZpYyBJUlEgZnJvbSAwLTE1LgorCQkJICovCiAJCQl1bnNpZ25lZCBjaGFyIGI7Ci0JCQkvKiBzZXQgcmVzb3VyY2UgZW5hYmxlIHJlZ2lzdGVyIHRvIGVuYWJsZSBJUlEgb3BlcmF0aW9uICovCisJCQkvKgorCQkJICogc2V0IHJlc291cmNlIGVuYWJsZSByZWdpc3RlcgorCQkJICogdG8gZW5hYmxlIElSUSBvcGVyYXRpb24KKwkJCSAqLwogCQkJb3V0YigxIDw8IDQsIGRldi0+aW9iYXNlICsgMyk7CiAJCQkvKiBzZXQgYml0cyAwLTMgb2YgYiB0byB0aGUgaXJxIG51bWJlciBmcm9tIDAtMTUgKi8KIAkJCWIgPSBkZXYtPmlycSAmICgoMSA8PCA0KSAtIDEpOwpAQCAtMTAzNywxNCArMTA5NywxMiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnByaXYtPmRpby5pbnRyLnNwaW5sb2NrLCBmbGFncyk7CiAJcy0+YXN5bmMtPmludHRyaWcgPSAwOwotCWlmIChzdWJwcml2LT5kaW8uaW50ci5hY3RpdmUpIHsKKwlpZiAoc3VicHJpdi0+ZGlvLmludHIuYWN0aXZlKQogCQlldmVudCA9IHBjbW1pb19zdGFydF9pbnRyKGRldiwgcyk7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN1YnByaXYtPmRpby5pbnRyLnNwaW5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXZlbnQpIHsKKwlpZiAoZXZlbnQpCiAJCWNvbWVkaV9ldmVudChkZXYsIHMpOwotCX0KIAogCXJldHVybiAxOwogfQpAQCAtMTA4Niw5ICsxMTQ0LDggQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3VicHJpdi0+ZGlvLmludHIuc3BpbmxvY2ssIGZsYWdzKTsKIAotCWlmIChldmVudCkgeworCWlmIChldmVudCkKIAkJY29tZWRpX2V2ZW50KGRldiwgcyk7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTM2LDE3ICsxMTkzLDMyIEBACiAJCXNob3J0IHNhbXBsZSwgYWRjX2FkanVzdCA9IDA7CiAKIAkJaWYgKGNoYW4gPiA3KQotCQkJY2hhbiAtPSA4LCBpb29mZnNldCA9IDQ7CS8qIHVzZSB0aGUgc2Vjb25kIGR3b3JkIGZvciBjaGFubmVscyA+IDcgKi8KKwkJCWNoYW4gLT0gOCwgaW9vZmZzZXQgPSA0OwkvKgorCQkJCQkJCSAqIHVzZSB0aGUgc2Vjb25kIGR3b3JkCisJCQkJCQkJICogZm9yIGNoYW5uZWxzID4gNworCQkJCQkJCSAqLwogCiAJCWlmIChhcmVmICE9IEFSRUZfRElGRikgewogCQkJYXJlZiA9IEFSRUZfR1JPVU5EOwotCQkJY29tbWFuZF9ieXRlIHw9IDEgPDwgNzsJLyogc2V0IGJpdCA3IHRvIGluZGljYXRlIHNpbmdsZS1lbmRlZCAqLworCQkJY29tbWFuZF9ieXRlIHw9IDEgPDwgNzsJLyoKKwkJCQkJCSAqIHNldCBiaXQgNyB0byBpbmRpY2F0ZQorCQkJCQkJICogc2luZ2xlLWVuZGVkCisJCQkJCQkgKi8KIAkJfQogCQlpZiAocmFuZ2UgPCAyKQotCQkJYWRjX2FkanVzdCA9IDB4ODAwMDsJLyogYmlwb2xhciByYW5nZXMgKC01LDUgLi4gLTEwLDEwIG5lZWQgdG8gYmUgYWRqdXN0ZWQgLS0gdGhhdCBpcy4uIHRoZXkgbmVlZCB0byB3cmFwIGFyb3VuZCBieSBhZGRpbmcgMHg4MDAwICovCisJCQlhZGNfYWRqdXN0ID0gMHg4MDAwOwkvKgorCQkJCQkJICogYmlwb2xhciByYW5nZXMKKwkJCQkJCSAqICgtNSw1IC4uIC0xMCwxMCBuZWVkIHRvIGJlCisJCQkJCQkgKiBhZGp1c3RlZCAtLSB0aGF0IGlzLi4gdGhleQorCQkJCQkJICogbmVlZCB0byB3cmFwIGFyb3VuZCBieQorCQkJCQkJICogYWRkaW5nIDB4ODAwMAorCQkJCQkJICovCiAKIAkJaWYgKGNoYW4gJSAyKSB7Ci0JCQljb21tYW5kX2J5dGUgfD0gMSA8PCA2OwkvKiBvZGQtbnVtYmVyZWQgY2hhbm5lbHMgaGF2ZSBiaXQgNiBzZXQgKi8KKwkJCWNvbW1hbmRfYnl0ZSB8PSAxIDw8IDY7CS8qCisJCQkJCQkgKiBvZGQtbnVtYmVyZWQgY2hhbm5lbHMKKwkJCQkJCSAqIGhhdmUgYml0IDYgc2V0CisJCQkJCQkgKi8KIAkJfQogCiAJCS8qIHNlbGVjdCB0aGUgY2hhbm5lbCwgYml0cyA0LTUgPT0gY2hhbi8yICovCkBAIC0xMTU2LDE2ICsxMjI4LDIyIEBACiAJCWNvbW1hbmRfYnl0ZSB8PSAocmFuZ2UgJiAweDMpIDw8IDI7CiAKIAkJLyogbmVlZCB0byBkbyB0aGlzIHR3aWNlIHRvIG1ha2Ugc3VyZSBtdXggc2V0dGxlZCAqLwotCQlvdXRiKGNvbW1hbmRfYnl0ZSwgaW9iYXNlICsgaW9vZmZzZXQgKyAyKTsJLyogY2hhbi9yYW5nZS9hcmVmIHNlbGVjdCAqLworCQkvKiBjaGFuL3JhbmdlL2FyZWYgc2VsZWN0ICovCisJCW91dGIoY29tbWFuZF9ieXRlLCBpb2Jhc2UgKyBpb29mZnNldCArIDIpOwogCi0JCWFkY193YWl0X3JlYWR5KGlvYmFzZSArIGlvb2Zmc2V0KTsJLyogd2FpdCBmb3IgdGhlIGFkYyB0byBzYXkgaXQgZmluaXNlZCB0aGUgY29udmVyc2lvbiAqLworCQkvKiB3YWl0IGZvciB0aGUgYWRjIHRvIHNheSBpdCBmaW5pc2VkIHRoZSBjb252ZXJzaW9uICovCisJCWFkY193YWl0X3JlYWR5KGlvYmFzZSArIGlvb2Zmc2V0KTsKIAotCQlvdXRiKGNvbW1hbmRfYnl0ZSwgaW9iYXNlICsgaW9vZmZzZXQgKyAyKTsJLyogc2VsZWN0IHRoZSBjaGFuL3JhbmdlL2FyZWYgQUdBSU4gKi8KKwkJLyogc2VsZWN0IHRoZSBjaGFuL3JhbmdlL2FyZWYgQUdBSU4gKi8KKwkJb3V0Yihjb21tYW5kX2J5dGUsIGlvYmFzZSArIGlvb2Zmc2V0ICsgMik7CiAKIAkJYWRjX3dhaXRfcmVhZHkoaW9iYXNlICsgaW9vZmZzZXQpOwogCi0JCXNhbXBsZSA9IGluYihpb2Jhc2UgKyBpb29mZnNldCArIDApOwkvKiByZWFkIGRhdGEgbG8gYnl0ZSAqLwotCQlzYW1wbGUgfD0gaW5iKGlvYmFzZSArIGlvb2Zmc2V0ICsgMSkgPDwgODsJLyogcmVhZCBkYXRhIGhpIGJ5dGUgKi8KKwkJLyogcmVhZCBkYXRhIGxvIGJ5dGUgKi8KKwkJc2FtcGxlID0gaW5iKGlvYmFzZSArIGlvb2Zmc2V0ICsgMCk7CisKKwkJLyogcmVhZCBkYXRhIGhpIGJ5dGUgKi8KKwkJc2FtcGxlIHw9IGluYihpb2Jhc2UgKyBpb29mZnNldCArIDEpIDw8IDg7CiAJCXNhbXBsZSArPSBhZGNfYWRqdXN0OwkvKiBhZGp1c3RtZW50IC4uIG11bmdlIGRhdGEgKi8KIAkJZGF0YVtuXSA9IHNhbXBsZTsKIAl9CkBAIC0xMjI3LDE1ICsxMzA1LDI0IEBACiAKIAkJCXdhaXRfZGFjX3JlYWR5KGlvYmFzZSArIGlvb2Zmc2V0KTsKIAotCQkJb3V0YihkYXRhW25dICYgMHhmZiwgaW9iYXNlICsgaW9vZmZzZXQgKyAwKTsJLyogbG93IG9yZGVyIGJ5dGUgKi8KLQkJCW91dGIoKGRhdGFbbl0gPj4gOCkgJiAweGZmLCBpb2Jhc2UgKyBpb29mZnNldCArIDEpOwkvKiBoaWdoIG9yZGVyIGJ5dGUgKi8KLQkJCWNvbW1hbmRfYnl0ZSA9IDB4NzAgfCAoY2hhbiA8PCAxKTsJLyogc2V0IGJpdCA0IG9mIGNvbW1hbmQgYnl0ZSB0byBpbmRpY2F0ZSBkYXRhIGlzIGxvYWRlZCBhbmQgdHJpZ2dlciBjb252ZXJzaW9uICovCisJCQkvKiBsb3cgb3JkZXIgYnl0ZSAqLworCQkJb3V0YihkYXRhW25dICYgMHhmZiwgaW9iYXNlICsgaW9vZmZzZXQgKyAwKTsKKworCQkJLyogaGlnaCBvcmRlciBieXRlICovCisJCQlvdXRiKChkYXRhW25dID4+IDgpICYgMHhmZiwgaW9iYXNlICsgaW9vZmZzZXQgKyAxKTsKKworCQkJLyoKKwkJCSAqIHNldCBiaXQgNCBvZiBjb21tYW5kIGJ5dGUgdG8gaW5kaWNhdGUKKwkJCSAqIGRhdGEgaXMgbG9hZGVkIGFuZCB0cmlnZ2VyIGNvbnZlcnNpb24KKwkJCSAqLworCQkJY29tbWFuZF9ieXRlID0gMHg3MCB8IChjaGFuIDw8IDEpOwogCQkJLyogdHJpZ2dlciBjb252ZXJpb24gKi8KIAkJCW91dGIoY29tbWFuZF9ieXRlLCBpb2Jhc2UgKyBpb29mZnNldCArIDIpOwogCiAJCQl3YWl0X2RhY19yZWFkeShpb2Jhc2UgKyBpb29mZnNldCk7CiAKLQkJCXN1YnByaXYtPmFvLnNoYWRvd19zYW1wbGVzW2NoYW5dID0gZGF0YVtuXTsJLyogc2F2ZSB0byBzaGFkb3cgcmVnaXN0ZXIgZm9yIGFvX3JpbnNuICovCisJCQkvKiBzYXZlIHRvIHNoYWRvdyByZWdpc3RlciBmb3IgYW9fcmluc24gKi8KKwkJCXN1YnByaXYtPmFvLnNoYWRvd19zYW1wbGVzW2NoYW5dID0gZGF0YVtuXTsKIAkJfQogCX0KIAlyZXR1cm4gbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYwppbmRleCA1MjU2ZmQ5Li4zMzI1ZjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCkBAIC00ODksNyArNDg5LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVykKIAkJZXJyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKaW5kZXggZjM1Y2NlNS4uODYyNjY1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtMTc2OCw3ICsxNzY4LDcgQEAKIAogCS8qIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlCiAJICAgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkgewogCQllcnIrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCmluZGV4IDgwZDI3ODcuLmZkZDdhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwpAQCAtMTkyNiw3ICsxOTI2LDcgQEAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkKIAkgICBjb21wYXRpYmxlICovCiAKLQkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLworCS8qIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVAogCSAgICAmJiBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKaW5kZXggMWQwNDkyMi4uZDAyNzQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCkBAIC03NiwxNCArNzYsNiBAQAogI2RlZmluZSBGQUxTRSAgICgwKQogI2VuZGlmCiAKLSNpZiAhZGVmaW5lZChFWFRFUk4pCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgRVhURVJOIGV4dGVybiAiQyIKLSNlbHNlCi0jZGVmaW5lIEVYVEVSTiBleHRlcm4KLSNlbmRpZgotI2VuZGlmCi0KICNpZiAhZGVmaW5lZChJTkxJTkUpCiAjZGVmaW5lIElOTElORSBzdGF0aWMgX19pbmxpbmUKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKaW5kZXggODJhYTg2ZS4uZGIzN2RjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCkBAIC0xMjUsMTQgKzEyNSw5IEBACiAKIHN0YXRpYyBsb25nIHR0eV9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgb3AsIHVuc2lnbmVkIGxvbmcgcGFyYW0pCiB7Ci0jaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAotCWlmIChmLT5mX29wLT51bmxvY2tlZF9pb2N0bCkgeworCWlmIChmLT5mX29wLT51bmxvY2tlZF9pb2N0bCkKIAkJcmV0dXJuIGYtPmZfb3AtPnVubG9ja2VkX2lvY3RsKGYsIG9wLCBwYXJhbSk7Ci0JfQotI2VuZGlmCi0JaWYgKGYtPmZfb3AtPmlvY3RsKSB7Ci0JCXJldHVybiBmLT5mX29wLT5pb2N0bChmLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZiwgb3AsIHBhcmFtKTsKLQl9CisKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIApAQCAtNDA5LDggKzQwNCw4IEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IGNvbmZpZ190IHsKIAotCQkJaW50IGtpbmQ7Ci0JCQlpbnQgYml0czsKKwkJCXNob3J0IGludCBraW5kOworCQkJc2hvcnQgaW50IGJpdHM7CiAJCQlpbnQgbWluOwogCQkJaW50IG1heDsKIAkJfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2tlbC5jCmluZGV4IDNkZWU2MmEuLmFiYTU3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9za2VsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NrZWwuYwpAQCAtMzk5LDcgKzM5OSw3IEBACiAKIAkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCi0JLyogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KKwkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQpCiAJCWVycisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCmluZGV4IGRmY2QxMmIuLjA2YzAyMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKQEAgLTEsNCArMSw0IEBACi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4yIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjIuMyIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQmVybmQgUG9yciwgQmVybmRQb3JyQGYycy5jb20iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJTdGlybGluZy9JVEwgVVNCLURVWCAtLSBCZXJuZC5Qb3JyQGYycy5jb20iCiAvKgpAQCAtODAsNiArODAsNyBAQAogICogMi4wOiAgUFdNIHNlZW1zIHRvIGJlIHN0YWJsZSBhbmQgaXMgbm90IGludGVyZmVyaW5nIHdpdGggdGhlIG90aGVyIGZ1bmN0aW9ucwogICogMi4xOiAgY2hhbmdlZCBQV00gQVBJCiAgKiAyLjI6ICBhZGRlZCBmaXJtd2FyZSBrZXJuZWwgcmVxdWVzdCB0byBmaXggYW4gdWRldiBwcm9ibGVtCisgKiAyLjM6ICBjb3JyZWN0ZWQgYSBidWcgaW4gYnVsayB0aW1lb3V0cyB3aGljaCB3ZXJlIGZhciB0b28gc2hvcnQKICAqCiAgKi8KIApAQCAtMTAxLDggKzEwMiw4IEBACiAKICNkZWZpbmUgQk9BUkROQU1FICJ1c2JkdXgiCiAKLS8qIHRpbWVvdXQgZm9yIHRoZSBVU0ItdHJhbnNmZXIgKi8KLSNkZWZpbmUgRVpUSU1FT1VUIDMwCisvKiB0aW1lb3V0IGZvciB0aGUgVVNCLXRyYW5zZmVyIGluIG1zKi8KKyNkZWZpbmUgQlVMS19USU1FT1VUIDEwMDAKIAogLyogY29uc3RhbnRzIGZvciAiZmlybXdhcmUiIHVwbG9hZCBhbmQgZG93bmxvYWQgKi8KICNkZWZpbmUgVVNCRFVYU1VCX0ZJUk1XQVJFIDB4QTAKQEAgLTc1MCw3ICs3NTEsNyBAQAogCQkJCSAgLyogTGVuZ3RoICovCiAJCQkJICAxLAogCQkJCSAgLyogVGltZW91dCAqLwotCQkJCSAgRVpUSU1FT1VUKTsKKwkJCQkgIEJVTEtfVElNRU9VVCk7CiAJaWYgKGVycmNvZGUgPCAwKSB7CiAJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCiAJCQkiY29tZWRpXzogY29udHJvbCBtc2cgZmFpbGVkIChzdGFydClcbiIpOwpAQCAtNzgwLDcgKzc4MSw3IEBACiAJCQkJICAvKiBMZW5ndGggKi8KIAkJCQkgIDEsCiAJCQkJICAvKiBUaW1lb3V0ICovCi0JCQkJICBFWlRJTUVPVVQpOworCQkJCSAgQlVMS19USU1FT1VUKTsKIAlpZiAoZXJyY29kZSA8IDApIHsKIAkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKIAkJCSJjb21lZGlfOiBjb250cm9sIG1zZyBmYWlsZWQgKHN0b3ApXG4iKTsKQEAgLTgxMCw3ICs4MTEsNyBAQAogCQkJCSAgLyogbGVuZ3RoICovCiAJCQkJICBsZW4sCiAJCQkJICAvKiB0aW1lb3V0ICovCi0JCQkJICBFWlRJTUVPVVQpOworCQkJCSAgQlVMS19USU1FT1VUKTsKIAlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpXzogcmVzdWx0PSVkXG4iLCBlcnJjb2RlKTsKIAlpZiAoZXJyY29kZSA8IDApIHsKIAkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaV86IHVwbG9hZCBmYWlsZWRcbiIpOwpAQCAtOTc5LDcgKzk4MCw3IEBACiAKIAkvKgogCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCi0JICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKKwkgKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUKIAkgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVyAmJgogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRVhUICYmCkBAIC0xMTEwLDcgKzExMTEsNyBAQAogCQkJICAgICAgdXNiX3NuZGJ1bGtwaXBlKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCiAJCQkJCSAgICAgIENPTU1BTkRfT1VUX0VQKSwKIAkJCSAgICAgIHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHMsIFNJWkVPRkRVWEJVRkZFUiwKLQkJCSAgICAgICZuc2VudCwgMTApOworCQkJICAgICAgJm5zZW50LCBCVUxLX1RJTUVPVVQpOwogCWlmIChyZXN1bHQgPCAwKQogCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgogCQkJImNvdWxkIG5vdCB0cmFuc21pdCBkdXhfY29tbWFuZCB0byB0aGUgdXNiLWRldmljZSwgIgpAQCAtMTEzMCw3ICsxMTMxLDcgQEAKIAkJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKIAkJCQkJCSAgICAgIENPTU1BTkRfSU5fRVApLAogCQkJCSAgICAgIHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyLCBTSVpFSU5TTkJVRiwKLQkJCQkgICAgICAmbnJlYywgMSk7CisJCQkJICAgICAgJm5yZWMsIEJVTEtfVElNRU9VVCk7CiAJCWlmIChyZXN1bHQgPCAwKSB7CiAJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgogCQkJCSJpbnNuOiBVU0IgZXJyb3IgJWQgd2hpbGUgcmVjZWl2aW5nIERVWCBjb21tYW5kIgpAQCAtMTU1Nyw3ICsxNTU4LDcgQEAKIAogCS8qCiAJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUKLQkgKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGlibGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQorCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQogCSAqLwogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCiAJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdm1rODB4eC5jCmluZGV4IGMzMzUwNDAuLmMzNGEwYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3ZtazgweHguYwpAQCAtNzYsMTggKzc2LDE4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdm1rODB4eF9pZF90YWJsZVtdID0gewotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAwKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA1NX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDU1MDEpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDU1fSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4NTUwMiksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAzKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA1NX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjEpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2MiksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYzKSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjQpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2NSksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAotCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY2KSwuZHJpdmVyX2luZm8gPSBERVZJQ0VfVk1LODA2MX0sCi0Je1VTQl9ERVZJQ0UoMHgxMGNmLCAweDgwNjcpLC5kcml2ZXJfaW5mbyA9IERFVklDRV9WTUs4MDYxfSwKLQl7VVNCX0RFVklDRSgweDEwY2YsIDB4ODA2OCksLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAwKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAxKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg1NTAzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNTV9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYxKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYyKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDYzKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY0KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY1KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY2KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY3KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAorCXtVU0JfREVWSUNFKDB4MTBjZiwgMHg4MDY4KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1ZNSzgwNjF9LAogCXt9CQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKaW5kZXggOGFjZWFlNS4uNjdmNjg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKQEAgLTE1MjEsNyArMTUyMSw3IEBACiAJLnJlc3VtZSA9IE5VTEwsCiB9OwogCi1zdGF0aWMgaW50IGN4MjU4MjFfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY3gyNTgyMV9pbml0KHZvaWQpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmN4MjU4MjFfZGV2bGlzdCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiY3gyNTgyMSBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCkBAIC0xNTMwLDcgKzE1MzAsNyBAQAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeDI1ODIxX3BjaV9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBjeDI1ODIxX2Zpbmkodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBjeDI1ODIxX2Zpbmkodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN4MjU4MjFfcGNpX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnCmluZGV4IDUyYmQxODcuLjRhZmEwODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9LY29uZmlnCkBAIC0xLDMgKzEsNyBAQAorY29uZmlnIERSRUFNCisgICAgICAgdHJpc3RhdGUgIkhUQyBEcmVhbSBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMgb24gQlJPS0VOCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3Yzg4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9UT0RPCkBAIC0wLDAgKzEsMTQgQEAKKyogcmVtb3ZlIHN1cHBvcnQgZm9yIHdha2Vsb2NrcyBzaW5jZSB0aG9zZSBhcmUgbm90IGluIG1haW5saW5lCisKKyogY2FtZXJhIGRyaXZlciB1c2VzIG9sZCBWNEwgQVBJCisKKyogY29kaW5nIHN0eWxlIGluIHNvbWUgcGxhY2VzIGlzIGxhY2tpbmcKKworKiBncGlvX2lucHV0LmMgaGFzIHNvbWUgZmVhdHVyZXMgbWF0cml4X2tleXBhZCBsYWNrcy4gVGhleSBzaG91bGQgYmUKK21lcmdlZCB0byBncGlvX2lucHV0LCB3aXRoIGdwaW9faW5wdXQuYyByZW1vdmVkCisKKyogcG1lbSBwcm92aWRlcyBpbnRlcmZhY2UgZm9yIHVzZXJzcGFjZS4gTmVlZHMgdG8gYmUgcmV2aWV3ZWQgYXQgbGVhc3QuCisKKyogaXQgaXMgcHJvYmFibHkgcG9zc2libGUgdG8gc2ltcGxpZnkgdG91Y2hzY3JlZW4gZHJpdmVyIHVzaW5nIHRocmVhZGVkX2lycSdzLgorCisqIHRvdWNoc2NyZWVuIGRyaXZlciBzaG91bGQgYmUgc3dpdGNoZWQgdG8gb2ZpY2lhbCBtdWx0aXRvdWNoIEFQSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fY2FtZXJhLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYwppbmRleCA4ODE2NTk5Li43ZDkzODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV9jYW1lcmEuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC0xNTk3LDcgKzE1OTgsNiBAQAogCQlNU01fRFJBSU5fUVVFVUUoc3luYywgcGljdF9mcmFtZV9xKTsKIAogCQlzeW5jLT5zY3RybC5zX3JlbGVhc2UoKTsKLQkJd2FrZV91bmxvY2soJnN5bmMtPndha2VfbG9jayk7CiAKIAkJc3luYy0+YXBwc19pZCA9IE5VTEw7CiAJCUNEQkcoIm1zbV9yZWxlYXNlIGNvbXBsZXRlZCFcbiIpOwpAQCAtMTgwNiw3ICsxODA2LDYgQEAKIAlzeW5jLT5hcHBzX2lkID0gYXBwc19pZDsKIAogCWlmICghc3luYy0+b3BlbmNudCkgewotCQl3YWtlX2xvY2soJnN5bmMtPndha2VfbG9jayk7CiAKIAkJbXNtX2NhbXZmZV9mbl9pbml0KCZzeW5jLT52ZmVmbiwgc3luYyk7CiAJCWlmIChzeW5jLT52ZmVmbi52ZmVfaW5pdCkgewpAQCAtMjA0NCw4ICsyMDQzLDYgQEAKIAlJTklUX0xJU1RfSEVBRCgmc3luYy0+cGljdF9mcmFtZV9xKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzeW5jLT5waWN0X2ZyYW1lX3dhaXQpOwogCi0Jd2FrZV9sb2NrX2luaXQoJnN5bmMtPndha2VfbG9jaywgV0FLRV9MT0NLX0lETEUsICJtc21fY2FtZXJhIik7Ci0KIAlyYyA9IG1zbV9jYW1pb19wcm9iZV9vbihwZGV2KTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CkBAIC0yMDU4LDcgKzIwNTUsNiBAQAogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKCJtc21fY2FtZXJhOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAlc1xuIiwKIAkJCXN5bmMtPnNkYXRhLT5zZW5zb3JfbmFtZSk7Ci0JCXdha2VfbG9ja19kZXN0cm95KCZzeW5jLT53YWtlX2xvY2spOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0yMDcwLDcgKzIwNjYsNiBAQAogCiBzdGF0aWMgaW50IG1zbV9zeW5jX2Rlc3Ryb3koc3RydWN0IG1zbV9zeW5jICpzeW5jKQogewotCXdha2VfbG9ja19kZXN0cm95KCZzeW5jLT53YWtlX2xvY2spOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV92ZmU3eC5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2NhbWVyYS9tc21fdmZlN3guYwppbmRleCA1ZGU5NmM1Li4zM2FiM2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vY2FtZXJhL21zbV92ZmU3eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9jYW1lcmEvbXNtX3ZmZTd4LmMKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXNtX2Fkc3AuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfcG1lbS5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2Fkc3AuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dlbmVyaWNfZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dlbmVyaWNfZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjRkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ2VuZXJpY19ncGlvLmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qIGFyY2gvYXJtL21hY2gtbXNtL2dlbmVyaWNfZ3Bpby5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjaW5jbHVkZSAiZ3Bpb19jaGlwLmgiCisKKyNkZWZpbmUgR1BJT19OVU1fVE9fQ0hJUF9JTkRFWChncGlvKSAoKGdwaW8pPj41KQorCitzdHJ1Y3QgZ3Bpb19zdGF0ZSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVmY291bnQ7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdwaW9fY2hpcHNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGdwaW9fY2hpcF9saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwICoqZ3Bpb19jaGlwX2FycmF5Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3Bpb19jaGlwX2FycmF5X3NpemU7CisKK2ludCByZWdpc3Rlcl9ncGlvX2NoaXAoc3RydWN0IGdwaW9fY2hpcCAqbmV3X2dwaW9fY2hpcCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvX2NoaXA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgaW50IGNoaXBfYXJyYXlfc3RhcnRfaW5kZXgsIGNoaXBfYXJyYXlfZW5kX2luZGV4OworCisJbmV3X2dwaW9fY2hpcC0+c3RhdGUgPSBremFsbG9jKChuZXdfZ3Bpb19jaGlwLT5lbmQgKyAxIC0gbmV3X2dwaW9fY2hpcC0+c3RhcnQpICogc2l6ZW9mKG5ld19ncGlvX2NoaXAtPnN0YXRlWzBdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ld19ncGlvX2NoaXAtPnN0YXRlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3Rlcl9ncGlvX2NoaXA6IGZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcF9hcnJheV9zdGFydF9pbmRleCA9IEdQSU9fTlVNX1RPX0NISVBfSU5ERVgobmV3X2dwaW9fY2hpcC0+c3RhcnQpOworCWNoaXBfYXJyYXlfZW5kX2luZGV4ID0gR1BJT19OVU1fVE9fQ0hJUF9JTkRFWChuZXdfZ3Bpb19jaGlwLT5lbmQpOworCWlmIChjaGlwX2FycmF5X2VuZF9pbmRleCA+PSBncGlvX2NoaXBfYXJyYXlfc2l6ZSkgeworCQlzdHJ1Y3QgZ3Bpb19jaGlwICoqbmV3X2dwaW9fY2hpcF9hcnJheTsKKwkJdW5zaWduZWQgbG9uZyBuZXdfZ3Bpb19jaGlwX2FycmF5X3NpemUgPSBjaGlwX2FycmF5X2VuZF9pbmRleCArIDE7CisKKwkJbmV3X2dwaW9fY2hpcF9hcnJheSA9IGttYWxsb2MobmV3X2dwaW9fY2hpcF9hcnJheV9zaXplICogc2l6ZW9mKG5ld19ncGlvX2NoaXBfYXJyYXlbMF0pLCBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19ncGlvX2NoaXBfYXJyYXkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3Rlcl9ncGlvX2NoaXA6IGZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGdwaW9fY2hpcF9hcnJheV9zaXplOyBpKyspCisJCQluZXdfZ3Bpb19jaGlwX2FycmF5W2ldID0gZ3Bpb19jaGlwX2FycmF5W2ldOworCQlmb3IgKGkgPSBncGlvX2NoaXBfYXJyYXlfc2l6ZTsgaSA8IG5ld19ncGlvX2NoaXBfYXJyYXlfc2l6ZTsgaSsrKQorCQkJbmV3X2dwaW9fY2hpcF9hcnJheVtpXSA9IE5VTEw7CisJCWdwaW9fY2hpcF9hcnJheSA9IG5ld19ncGlvX2NoaXBfYXJyYXk7CisJCWdwaW9fY2hpcF9hcnJheV9zaXplID0gbmV3X2dwaW9fY2hpcF9hcnJheV9zaXplOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwaW9fY2hpcCwgJmdwaW9fY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChncGlvX2NoaXAtPnN0YXJ0ID4gbmV3X2dwaW9fY2hpcC0+ZW5kKSB7CisJCQlsaXN0X2FkZF90YWlsKCZuZXdfZ3Bpb19jaGlwLT5saXN0LCAmZ3Bpb19jaGlwLT5saXN0KTsKKwkJCWdvdG8gYWRkZWQ7CisJCX0KKwkJaWYgKGdwaW9fY2hpcC0+ZW5kID49IG5ld19ncGlvX2NoaXAtPnN0YXJ0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInJlZ2lzdGVyX2dwaW9fc291cmNlICV1LSV1IG92ZXJsYXBzIHdpdGggJXUtJXVcbiIsCisJCQkgICAgICAgbmV3X2dwaW9fY2hpcC0+c3RhcnQsIG5ld19ncGlvX2NoaXAtPmVuZCwKKwkJCSAgICAgICBncGlvX2NoaXAtPnN0YXJ0LCBncGlvX2NoaXAtPmVuZCk7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKwlsaXN0X2FkZF90YWlsKCZuZXdfZ3Bpb19jaGlwLT5saXN0LCAmZ3Bpb19jaGlwX2xpc3QpOworYWRkZWQ6CisJZm9yIChpID0gY2hpcF9hcnJheV9zdGFydF9pbmRleDsgaSA8PSBjaGlwX2FycmF5X2VuZF9pbmRleDsgaSsrKSB7CisJCWlmIChncGlvX2NoaXBfYXJyYXlbaV0gPT0gTlVMTCB8fCBncGlvX2NoaXBfYXJyYXlbaV0tPnN0YXJ0ID4gbmV3X2dwaW9fY2hpcC0+c3RhcnQpCisJCQlncGlvX2NoaXBfYXJyYXlbaV0gPSBuZXdfZ3Bpb19jaGlwOworCX0KK2ZhaWxlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJaWYgKGVycikKKwkJa2ZyZWUobmV3X2dwaW9fY2hpcC0+c3RhdGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwICpnZXRfZ3Bpb19jaGlwX2xvY2tlZCh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKworCWkgPSBHUElPX05VTV9UT19DSElQX0lOREVYKGdwaW8pOworCWlmIChpID49IGdwaW9fY2hpcF9hcnJheV9zaXplKQorCQlyZXR1cm4gTlVMTDsKKwljaGlwID0gZ3Bpb19jaGlwX2FycmF5W2ldOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbShjaGlwLCAmZ3Bpb19jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGdwaW8gPCBjaGlwLT5zdGFydCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoZ3BpbyA8PSBjaGlwLT5lbmQpCisJCQlyZXR1cm4gY2hpcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9ncGlvKHVuc2lnbmVkIGludCBncGlvLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjaGlwX2luZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXAgPT0gTlVMTCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJY2hpcF9pbmRleCA9IGdwaW8gLSBjaGlwLT5zdGFydDsKKwlpZiAoY2hpcC0+c3RhdGVbY2hpcF9pbmRleF0ucmVmY291bnQgPT0gMCkgeworCQljaGlwLT5jb25maWd1cmUoY2hpcCwgZ3BpbywgZmxhZ3MpOworCQljaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5mbGFncyA9IGZsYWdzOworCQljaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5yZWZjb3VudCsrOworCX0gZWxzZSBpZiAoKGZsYWdzICYgSVJRRl9TSEFSRUQpICYmIChjaGlwLT5zdGF0ZVtjaGlwX2luZGV4XS5mbGFncyAmIElSUUZfU0hBUkVEKSkKKwkJY2hpcC0+c3RhdGVbY2hpcF9pbmRleF0ucmVmY291bnQrKzsKKwllbHNlCisJCWVyciA9IC1FQlVTWTsKK2VycjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBncGlvLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlyZXR1cm4gcmVxdWVzdF9ncGlvKGdwaW8sIDApOworfQorRVhQT1JUX1NZTUJPTChncGlvX3JlcXVlc3QpOworCit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjaGlwX2luZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwljaGlwID0gZ2V0X2dwaW9fY2hpcF9sb2NrZWQoZ3Bpbyk7CisJaWYgKGNoaXApIHsKKwkJY2hpcF9pbmRleCA9IGdwaW8gLSBjaGlwLT5zdGFydDsKKwkJY2hpcC0+c3RhdGVbY2hpcF9pbmRleF0ucmVmY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChncGlvX2ZyZWUpOworCitzdGF0aWMgaW50IGdwaW9fZ2V0X2lycV9udW0odW5zaWduZWQgaW50IGdwaW8sIHVuc2lnbmVkIGludCAqaXJxcCwgdW5zaWduZWQgbG9uZyAqaXJxbnVtZmxhZ3NwKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPmdldF9pcnFfbnVtKQorCQlyZXQgPSBjaGlwLT5nZXRfaXJxX251bShjaGlwLCBncGlvLCBpcnFwLCBpcnFudW1mbGFnc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgZ3BpbykKK3sKKwlpbnQgcmV0LCBpcnE7CisJcmV0ID0gZ3Bpb19nZXRfaXJxX251bShncGlvLCAmaXJxLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBpcnE7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fdG9faXJxKTsKKworaW50IGdwaW9fY29uZmlndXJlKHVuc2lnbmVkIGludCBncGlvLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwKQorCQlyZXQgPSBjaGlwLT5jb25maWd1cmUoY2hpcCwgZ3BpbywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChncGlvX2NvbmZpZ3VyZSk7CisKK2ludCBncGlvX2RpcmVjdGlvbl9pbnB1dCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiBncGlvX2NvbmZpZ3VyZShncGlvLCBHUElPRl9JTlBVVCk7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2lucHV0KTsKKworaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCit7CisJZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworCXJldHVybiBncGlvX2NvbmZpZ3VyZShncGlvLCBHUElPRl9EUklWRV9PVVRQVVQpOworfQorRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOworCitpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgZ3BpbykKK3sKKwlpbnQgcmV0ID0gLUVOT1RTVVBQOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCWNoaXAgPSBnZXRfZ3Bpb19jaGlwX2xvY2tlZChncGlvKTsKKwlpZiAoY2hpcCAmJiBjaGlwLT5yZWFkKQorCQlyZXQgPSBjaGlwLT5yZWFkKGNoaXAsIGdwaW8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fY2hpcHNfbG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1ZSk7CisKK3ZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgZ3BpbywgaW50IG9uKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPndyaXRlKQorCQlyZXQgPSBjaGlwLT53cml0ZShjaGlwLCBncGlvLCBvbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChncGlvX3NldF92YWx1ZSk7CisKK2ludCBncGlvX3JlYWRfZGV0ZWN0X3N0YXR1cyh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlpbnQgcmV0ID0gLUVOT1RTVVBQOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCWNoaXAgPSBnZXRfZ3Bpb19jaGlwX2xvY2tlZChncGlvKTsKKwlpZiAoY2hpcCAmJiBjaGlwLT5yZWFkX2RldGVjdF9zdGF0dXMpCisJCXJldCA9IGNoaXAtPnJlYWRfZGV0ZWN0X3N0YXR1cyhjaGlwLCBncGlvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ3Bpb19yZWFkX2RldGVjdF9zdGF0dXMpOworCitpbnQgZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKHVuc2lnbmVkIGludCBncGlvKQoreworCWludCByZXQgPSAtRU5PVFNVUFA7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2NoaXBzX2xvY2ssIGlycV9mbGFncyk7CisJY2hpcCA9IGdldF9ncGlvX2NoaXBfbG9ja2VkKGdwaW8pOworCWlmIChjaGlwICYmIGNoaXAtPmNsZWFyX2RldGVjdF9zdGF0dXMpCisJCXJldCA9IGNoaXAtPmNsZWFyX2RldGVjdF9zdGF0dXMoY2hpcCwgZ3Bpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19jaGlwc19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGdwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19ldmVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9fZXZlbnQuYwppbmRleCA4YjY0YzFlLi5lNjBlMmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19ldmVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2V2ZW50LmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2Vhcmx5c3VzcGVuZC5oPgorCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2V2ZW50Lmg+CkBAIC0yMyw3ICsyMyw2IEBACiBzdHJ1Y3QgZ3Bpb19ldmVudCB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCWNvbnN0IHN0cnVjdCBncGlvX2V2ZW50X3BsYXRmb3JtX2RhdGEgKmluZm87Ci0Jc3RydWN0IGVhcmx5X3N1c3BlbmQgZWFybHlfc3VzcGVuZDsKIAl2b2lkICpzdGF0ZVswXTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2lucHV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19pbnB1dC5jCmluZGV4IDdlMzA3ZjIuLjA2MzhlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9ncGlvX2lucHV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9faW5wdXQuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAKIGVudW0gewogCURFQk9VTkNFX1VOU1RBQkxFICAgICA9IEJJVCgwKSwJLyogR290IGlycSwgd2hpbGUgZGVib3VuY2luZyAqLwpAQCAtNDQsNyArNDMsNiBAQAogCWludCB1c2VfaXJxOwogCWludCBkZWJvdW5jZV9jb3VudDsKIAlzcGlubG9ja190IGlycV9sb2NrOwotCXN0cnVjdCB3YWtlX2xvY2sgd2FrZV9sb2NrOwogCXN0cnVjdCBncGlvX2tleV9zdGF0ZSBrZXlfc3RhdGVbMF07CiB9OwogCkBAIC0xNDMsOCArMTQxLDYgQEAKIAkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZHMtPmluZm8tPmRlYm91bmNlX3RpbWUsIEhSVElNRVJfTU9ERV9SRUwpOwogCWVsc2UgaWYgKCFkcy0+dXNlX2lycSkKIAkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZHMtPmluZm8tPnBvbGxfdGltZSwgSFJUSU1FUl9NT0RFX1JFTCk7Ci0JZWxzZQotCQl3YWtlX3VubG9jaygmZHMtPndha2VfbG9jayk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcy0+aXJxX2xvY2ssIGlycWZsYWdzKTsKIApAQCAtMTcwLDcgKzE2Niw2IEBACiAJCWlmIChrcy0+ZGVib3VuY2UgJiBERUJPVU5DRV9XQUlUX0lSUSkgewogCQkJa3MtPmRlYm91bmNlID0gREVCT1VOQ0VfVU5LTk9XTjsKIAkJCWlmIChkcy0+ZGVib3VuY2VfY291bnQrKyA9PSAwKSB7Ci0JCQkJd2FrZV9sb2NrKCZkcy0+d2FrZV9sb2NrKTsKIAkJCQlocnRpbWVyX3N0YXJ0KAogCQkJCQkmZHMtPnRpbWVyLCBkcy0+aW5mby0+ZGVib3VuY2VfdGltZSwKIAkJCQkJSFJUSU1FUl9NT0RFX1JFTCk7CkBAIC0yNzcsNyArMjcyLDYgQEAKIAkJZHMtPmRlYm91bmNlX2NvdW50ID0gZGktPmtleW1hcF9zaXplOwogCQlkcy0+aW5wdXRfZGV2ID0gaW5wdXRfZGV2OwogCQlkcy0+aW5mbyA9IGRpOwotCQl3YWtlX2xvY2tfaW5pdCgmZHMtPndha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJncGlvX2lucHV0Iik7CiAJCXNwaW5fbG9ja19pbml0KCZkcy0+aXJxX2xvY2spOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkaS0+a2V5bWFwX3NpemU7IGkrKykgewpAQCAtMzM2LDcgKzMzMCw2IEBACiBlcnJfZ3Bpb19yZXF1ZXN0X2ZhaWxlZDoKIAkJOwogCX0KLQl3YWtlX2xvY2tfZGVzdHJveSgmZHMtPndha2VfbG9jayk7CiAJa2ZyZWUoZHMpOwogZXJyX2RzX2FsbG9jX2ZhaWxlZDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL2dwaW9fbWF0cml4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYwppbmRleCBjMWY0NzY1Li43OTZkZTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vZ3Bpb19tYXRyaXguYwpAQCAtMTgsMTMgKzE4LDExIEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpb19ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgogCiBzdHJ1Y3QgZ3Bpb19rcCB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCXN0cnVjdCBncGlvX2V2ZW50X21hdHJpeF9pbmZvICprZXlwYWRfaW5mbzsKIAlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2VfbG9jazsKIAlpbnQgY3VycmVudF9vdXRwdXQ7CiAJdW5zaWduZWQgaW50IHVzZV9pcnE6MTsKIAl1bnNpZ25lZCBpbnQga2V5X3N0YXRlX2NoYW5nZWQ6MTsKQEAgLTE5OSw3ICsxOTcsNiBAQAogCX0KIAlmb3IgKGluID0gMDsgaW4gPCBtaS0+bmlucHV0czsgaW4rKykKIAkJZW5hYmxlX2lycShncGlvX3RvX2lycShtaS0+aW5wdXRfZ3Bpb3NbaW5dKSk7Ci0Jd2FrZV91bmxvY2soJmtwLT53YWtlX2xvY2spOwogCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKIH0KIApAQCAtMjIyLDcgKzIxOSw2IEBACiAJCWVsc2UKIAkJCWdwaW9fZGlyZWN0aW9uX2lucHV0KG1pLT5vdXRwdXRfZ3Bpb3NbaV0pOwogCX0KLQl3YWtlX2xvY2soJmtwLT53YWtlX2xvY2spOwogCWhydGltZXJfc3RhcnQoJmtwLT50aW1lciwga3RpbWVfc2V0KDAsIDApLCBIUlRJTUVSX01PREVfUkVMKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0zNjMsNyArMzU5LDYgQEAKIAogCQlocnRpbWVyX2luaXQoJmtwLT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAkJa3AtPnRpbWVyLmZ1bmN0aW9uID0gZ3Bpb19rZXlwYWRfdGltZXJfZnVuYzsKLQkJd2FrZV9sb2NrX2luaXQoJmtwLT53YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCAiZ3Bpb19rcCIpOwogCQllcnIgPSBncGlvX2tleXBhZF9yZXF1ZXN0X2lycXMoa3ApOwogCQlrcC0+dXNlX2lycSA9IGVyciA9PSAwOwogCkBAIC0zNzEsOCArMzY2LDYgQEAKIAkJCSJpbiAlcyBtb2RlXG4iLCBpbnB1dF9kZXYtPm5hbWUsCiAJCQlrcC0+dXNlX2lycSA/ICJpbnRlcnJ1cHQiIDogInBvbGxpbmciKTsKIAotCQlpZiAoa3AtPnVzZV9pcnEpCi0JCQl3YWtlX2xvY2soJmtwLT53YWtlX2xvY2spOwogCQlocnRpbWVyX3N0YXJ0KCZrcC0+dGltZXIsIGt0aW1lX3NldCgwLCAwKSwgSFJUSU1FUl9NT0RFX1JFTCk7CiAKIAkJcmV0dXJuIDA7CkBAIC0zODYsNyArMzc5LDYgQEAKIAkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKG1pLT5pbnB1dF9ncGlvc1tpXSksIGtwKTsKIAogCWhydGltZXJfY2FuY2VsKCZrcC0+dGltZXIpOwotCXdha2VfbG9ja19kZXN0cm95KCZrcC0+d2FrZV9sb2NrKTsKIAlmb3IgKGkgPSBtaS0+bm91dHB1dHMgLSAxOyBpID49IDA7IGktLSkgewogZXJyX2dwaW9fZGlyZWN0aW9uX2lucHV0X2ZhaWxlZDoKIAkJZ3Bpb19mcmVlKG1pLT5pbnB1dF9ncGlvc1tpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcG1lbS5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3BtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWY2NDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3BtZW0uYwpAQCAtMCwwICsxLDEzMzUgQEAKKy8qIGRyaXZlcnMvYW5kcm9pZC9wbWVtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNkZWZpbmUgUE1FTV9NQVhfREVWSUNFUyAxMAorI2RlZmluZSBQTUVNX01BWF9PUkRFUiAxMjgKKyNkZWZpbmUgUE1FTV9NSU5fQUxMT0MgUEFHRV9TSVpFCisKKyNkZWZpbmUgUE1FTV9ERUJVRyAxCisKKy8qIGluZGljYXRlcyB0aGF0IGEgcmVmZXJuY2UgdG8gdGhpcyBmaWxlIGhhcyBiZWVuIHRha2VuIHZpYSBnZXRfcG1lbV9maWxlLAorICogdGhlIGZpbGUgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCB1bnRpbCBwdXRfcG1lbV9maWxlIGlzIGNhbGxlZCAqLworI2RlZmluZSBQTUVNX0ZMQUdTX0JVU1kgMHgxCisvKiBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgc3ViYWxsb2NhdGlvbiBvZiBhIGxhcmdlciBtYXN0ZXIgcmFuZ2UgKi8KKyNkZWZpbmUgUE1FTV9GTEFHU19DT05ORUNURUQgMHgxIDw8IDEKKy8qIGluZGljYXRlcyB0aGlzIGlzIGEgbWFzdGVyIGFuZCBub3QgYSBzdWIgYWxsb2NhdGlvbiBhbmQgdGhhdCBpdCBpcyBtbWFwZWQgKi8KKyNkZWZpbmUgUE1FTV9GTEFHU19NQVNURVJNQVAgMHgxIDw8IDIKKy8qIHN1Ym1hcCBhbmQgdW5zdWJtYXAgZmxhZ3MgaW5kaWNhdGU6CisgKiAwMDogc3VicmVnaW9uIGhhcyBuZXZlciBiZWVuIG1tYXBlZAorICogMTA6IHN1YnJlZ2lvbiBoYXMgYmVlbiBtbWFwZWQsIHJlZmVyZW5jZSB0byB0aGUgbW0gd2FzIHRha2VuCisgKiAxMTogc3VicmV0aW9uIGhhcyBiZW4gcmVsZWFzZWQsIHJlZmVybmVjZSB0byB0aGUgbW0gc3RpbGwgaGVsZAorICogMDE6IHN1YnJldGlvbiBoYXMgYmVlbiByZWxlYXNlZCwgcmVmZXJlbmNlIHRvIHRoZSBtbSBoYXMgYmVlbiByZWxlYXNlZAorICovCisjZGVmaW5lIFBNRU1fRkxBR1NfU1VCTUFQIDB4MSA8PCAzCisjZGVmaW5lIFBNRU1fRkxBR1NfVU5TVUJNQVAgMHgxIDw8IDQKKworCitzdHJ1Y3QgcG1lbV9kYXRhIHsKKwkvKiBpbiBhbGxvYyBtb2RlOiBhbiBpbmRleCBpbnRvIHRoZSBiaXRtYXAKKwkgKiBpbiBub19hbGxvYyBtb2RlOiB0aGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGlvbiAqLworCWludCBpbmRleDsKKwkvKiBzZWUgZmxhZ3MgYWJvdmUgZm9yIGRlc2NyaXB0aW9ucyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKwkvKiBwcm90ZWN0cyB0aGlzIGRhdGEgZmllbGQsIGlmIHRoZSBtbV9tbWFwIHNlbSB3aWxsIGJlIGhlbGQgYXQgdGhlCisJICogc2FtZSB0aW1lIGFzIHRoaXMgc2VtLCB0aGUgbW0gc2VtIG11c3QgYmUgdGFrZW4gZmlyc3QgKGFzIHRoaXMgaXMKKwkgKiB0aGUgb3JkZXIgZm9yIHZtYV9vcGVuIGFuZCB2bWFfY2xvc2Ugb3BzICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBzZW07CisJLyogaW5mbyBhYm91dCB0aGUgbW1hcGluZyBwcm9jZXNzICovCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJLyogdGFzayBzdHJ1Y3Qgb2YgdGhlIG1hcHBpbmcgcHJvY2VzcyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwkvKiBwcm9jZXNzIGlkIG9mIHRlaCBtYXBwaW5nIHByb2Nlc3MgKi8KKwlwaWRfdCBwaWQ7CisJLyogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBtYXN0ZXIgKi8KKwlpbnQgbWFzdGVyX2ZkOworCS8qIGZpbGUgc3RydWN0IG9mIHRoZSBtYXN0ZXIgKi8KKwlzdHJ1Y3QgZmlsZSAqbWFzdGVyX2ZpbGU7CisJLyogYSBsaXN0IG9mIGN1cnJlbnRseSBhdmFpbGFibGUgcmVnaW9ucyBpZiB0aGlzIGlzIGEgc3ViYWxsb2NhdGlvbiAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVnaW9uX2xpc3Q7CisJLyogYSBsaW5rZWQgbGlzdCBvZiBkYXRhIHNvIHdlIGNhbiBhY2Nlc3MgdGhlbSBmb3IgZGVidWdnaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworI2lmIFBNRU1fREVCVUcKKwlpbnQgcmVmOworI2VuZGlmCit9OworCitzdHJ1Y3QgcG1lbV9iaXRzIHsKKwl1bnNpZ25lZCBhbGxvY2F0ZWQ6MTsJCS8qIDEgaWYgYWxsb2NhdGVkLCAwIGlmIGZyZWUgKi8KKwl1bnNpZ25lZCBvcmRlcjo3OwkJLyogc2l6ZSBvZiB0aGUgcmVnaW9uIGluIHBtZW0gc3BhY2UgKi8KK307CisKK3N0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlIHsKKwlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgUE1FTV9ERUJVR19NU0dTIDAKKyNpZiBQTUVNX0RFQlVHX01TR1MKKyNkZWZpbmUgRExPRyhmbXQsYXJncy4uLikgXAorCWRvIHsgcHJpbnRrKEtFUk5fSU5GTyAiWyVzOiVzOiVkXSAiZm10LCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fLCBcCisJCSAgICAjI2FyZ3MpOyB9IFwKKwl3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERMT0coeC4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RydWN0IHBtZW1faW5mbyB7CisJc3RydWN0IG1pc2NkZXZpY2UgZGV2OworCS8qIHBoeXNpY2FsIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJlbWFwZWQgcG1lbSBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwkvKiB2aXR1YWwgc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmVtYXBlZCBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgY2hhciBfX2lvbWVtICp2YmFzZTsKKwkvKiB0b3RhbCBzaXplIG9mIHRoZSBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBzaXplOworCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwbWVtIHNwYWNlICovCisJdW5zaWduZWQgbG9uZyBudW1fZW50cmllczsKKwkvKiBwZm4gb2YgdGhlIGdhcmJhZ2UgcGFnZSBpbiBtZW1vcnkgKi8KKwl1bnNpZ25lZCBsb25nIGdhcmJhZ2VfcGZuOworCS8qIGluZGV4IG9mIHRoZSBnYXJiYWdlIHBhZ2UgaW4gdGhlIHBtZW0gc3BhY2UgKi8KKwlpbnQgZ2FyYmFnZV9pbmRleDsKKwkvKiB0aGUgYml0bWFwIGZvciB0aGUgcmVnaW9uIGluZGljYXRpbmcgd2hpY2ggZW50cmllcyBhcmUgYWxsb2NhdGVkCisJICogYW5kIHdoaWNoIGFyZSBmcmVlICovCisJc3RydWN0IHBtZW1fYml0cyAqYml0bWFwOworCS8qIGluZGljYXRlcyB0aGUgcmVnaW9uIHNob3VsZCBub3QgYmUgbWFuYWdlZCB3aXRoIGFuIGFsbG9jYXRvciAqLworCXVuc2lnbmVkIG5vX2FsbG9jYXRvcjsKKwkvKiBpbmRpY2F0ZXMgbWFwcyBvZiB0aGlzIHJlZ2lvbiBzaG91bGQgYmUgY2FjaGVkLCBpZiBhIG1peCBvZgorCSAqIGNhY2hlZCBhbmQgdW5jYWNoZWQgaXMgZGVzaXJlZCwgc2V0IHRoaXMgYW5kIG9wZW4gdGhlIGRldmljZSB3aXRoCisJICogT19TWU5DIHRvIGdldCBhbiB1bmNhY2hlZCByZWdpb24gKi8KKwl1bnNpZ25lZCBjYWNoZWQ7CisJdW5zaWduZWQgYnVmZmVyZWQ7CisJLyogaW4gbm9fYWxsb2NhdG9yIG1vZGUgdGhlIGZpcnN0IG1hcHBlciBnZXRzIHRoZSB3aG9sZSBzcGFjZSBhbmQgc2V0cworCSAqIHRoaXMgZmxhZyAqLworCXVuc2lnbmVkIGFsbG9jYXRlZDsKKwkvKiBmb3IgZGVidWdnaW5nLCBjcmVhdGVzIGEgbGlzdCBvZiBwbWVtIGZpbGUgc3RydWN0cywgdGhlCisJICogZGF0YV9saXN0X3NlbSBzaG91bGQgYmUgdGFrZW4gYmVmb3JlIHBtZW1fZGF0YS0+c2VtIGlmIGJvdGggYXJlCisJICogbmVlZGVkICovCisJc3RydWN0IHNlbWFwaG9yZSBkYXRhX2xpc3Rfc2VtOworCXN0cnVjdCBsaXN0X2hlYWQgZGF0YV9saXN0OworCS8qIHBtZW1fc2VtIHByb3RlY3RzIHRoZSBiaXRtYXAgYXJyYXkKKwkgKiBhIHdyaXRlIGxvY2sgc2hvdWxkIGJlIGhlbGQgd2hlbiBtb2RpZnlpbmcgZW50cmllcyBpbiBiaXRtYXAKKwkgKiBhIHJlYWQgbG9jayBzaG91bGQgYmUgaGVsZCB3aGVuIHJlYWRpbmcgZGF0YSBmcm9tIGJpdHMgb3IKKwkgKiBkZXJlZmVyZW5jaW5nIGEgcG9pbnRlciBpbnRvIGJpdG1hcAorCSAqCisJICogcG1lbV9kYXRhLT5zZW0gcHJvdGVjdHMgdGhlIHBtZW0gZGF0YSBvZiBhIHBhcnRpY3VsYXIgZmlsZQorCSAqIE1hbnkgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZSB0aGUgcG1lbV9kYXRhLT5zZW0gaGF2ZSBhIG5vbi0KKwkgKiBsb2NraW5nIHZlcnNpb24gZm9yIHdoZW4gdGhlIGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhhdCBzZW0uCisJICoKKwkgKiBJRiBZT1UgVEFLRSBCT1RIIExPQ0tTIFRBS0UgVEhFTSBJTiBUSElTIE9SREVSOgorCSAqIGRvd24ocG1lbV9kYXRhLT5zZW0pID0+IGRvd24oYml0bWFwX3NlbSkKKwkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGJpdG1hcF9zZW07CisKKwlsb25nICgqaW9jdGwpKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisJaW50ICgqcmVsZWFzZSkoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworfTsKKworc3RhdGljIHN0cnVjdCBwbWVtX2luZm8gcG1lbVtQTUVNX01BWF9ERVZJQ0VTXTsKK3N0YXRpYyBpbnQgaWRfY291bnQ7CisKKyNkZWZpbmUgUE1FTV9JU19GUkVFKGlkLCBpbmRleCkgIShwbWVtW2lkXS5iaXRtYXBbaW5kZXhdLmFsbG9jYXRlZCkKKyNkZWZpbmUgUE1FTV9PUkRFUihpZCwgaW5kZXgpIHBtZW1baWRdLmJpdG1hcFtpbmRleF0ub3JkZXIKKyNkZWZpbmUgUE1FTV9CVUREWV9JTkRFWChpZCwgaW5kZXgpIChpbmRleCBeICgxIDw8IFBNRU1fT1JERVIoaWQsIGluZGV4KSkpCisjZGVmaW5lIFBNRU1fTkVYVF9JTkRFWChpZCwgaW5kZXgpIChpbmRleCArICgxIDw8IFBNRU1fT1JERVIoaWQsIGluZGV4KSkpCisjZGVmaW5lIFBNRU1fT0ZGU0VUKGluZGV4KSAoaW5kZXggKiBQTUVNX01JTl9BTExPQykKKyNkZWZpbmUgUE1FTV9TVEFSVF9BRERSKGlkLCBpbmRleCkgKFBNRU1fT0ZGU0VUKGluZGV4KSArIHBtZW1baWRdLmJhc2UpCisjZGVmaW5lIFBNRU1fTEVOKGlkLCBpbmRleCkgKCgxIDw8IFBNRU1fT1JERVIoaWQsIGluZGV4KSkgKiBQTUVNX01JTl9BTExPQykKKyNkZWZpbmUgUE1FTV9FTkRfQUREUihpZCwgaW5kZXgpIChQTUVNX1NUQVJUX0FERFIoaWQsIGluZGV4KSArIFwKKwlQTUVNX0xFTihpZCwgaW5kZXgpKQorI2RlZmluZSBQTUVNX1NUQVJUX1ZBRERSKGlkLCBpbmRleCkgKFBNRU1fT0ZGU0VUKGlkLCBpbmRleCkgKyBwbWVtW2lkXS52YmFzZSkKKyNkZWZpbmUgUE1FTV9FTkRfVkFERFIoaWQsIGluZGV4KSAoUE1FTV9TVEFSVF9WQUREUihpZCwgaW5kZXgpICsgXAorCVBNRU1fTEVOKGlkLCBpbmRleCkpCisjZGVmaW5lIFBNRU1fUkVWT0tFRChkYXRhKSAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1JFVk9LRUQpCisjZGVmaW5lIFBNRU1fSVNfUEFHRV9BTElHTkVEKGFkZHIpICghKChhZGRyKSAmICh+UEFHRV9NQVNLKSkpCisjZGVmaW5lIFBNRU1fSVNfU1VCTUFQKGRhdGEpICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1NVQk1BUCkgJiYgXAorCSghKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19VTlNVQk1BUCkpKQorCitzdGF0aWMgaW50IHBtZW1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50IHBtZW1fbW1hcChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CitzdGF0aWMgaW50IHBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgbG9uZyBwbWVtX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG1lbV9mb3BzID0geworCS5yZWxlYXNlID0gcG1lbV9yZWxlYXNlLAorCS5tbWFwID0gcG1lbV9tbWFwLAorCS5vcGVuID0gcG1lbV9vcGVuLAorCS51bmxvY2tlZF9pb2N0bCA9IHBtZW1faW9jdGwsCit9OworCitzdGF0aWMgaW50IGdldF9pZChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gTUlOT1IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldik7Cit9CisKK3N0YXRpYyBpbnQgaXNfcG1lbV9maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpZDsKKworCWlmICh1bmxpa2VseSghZmlsZSB8fCAhZmlsZS0+Zl9kZW50cnkgfHwgIWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIDA7CisJaWQgPSBnZXRfaWQoZmlsZSk7CisJaWYgKHVubGlrZWx5KGlkID49IFBNRU1fTUFYX0RFVklDRVMpKQorCQlyZXR1cm4gMDsKKwlpZiAodW5saWtlbHkoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldiAhPQorCSAgICAgTUtERVYoTUlTQ19NQUpPUiwgcG1lbVtpZF0uZGV2Lm1pbm9yKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhc19hbGxvY2F0aW9uKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGE7CisJLyogY2hlY2sgaXNfcG1lbV9maWxlIGZpcnN0IGlmIG5vdCBhY2Nlc3NlZCB2aWEgcG1lbV9maWxlX29wcyAqLworCisJaWYgKHVubGlrZWx5KCFmaWxlLT5wcml2YXRlX2RhdGEpKQorCQlyZXR1cm4gMDsKKwlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHVubGlrZWx5KGRhdGEtPmluZGV4IDwgMCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGlzX21hc3Rlcl9vd25lcihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqbWFzdGVyX2ZpbGU7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgcHV0X25lZWRlZCwgcmV0ID0gMDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkKKwkJcmV0dXJuIDA7CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChQTUVNX0ZMQUdTX01BU1RFUk1BUCAmIGRhdGEtPmZsYWdzKQorCQlyZXR1cm4gMTsKKwltYXN0ZXJfZmlsZSA9IGZnZXRfbGlnaHQoZGF0YS0+bWFzdGVyX2ZkLCAmcHV0X25lZWRlZCk7CisJaWYgKG1hc3Rlcl9maWxlICYmIGRhdGEtPm1hc3Rlcl9maWxlID09IG1hc3Rlcl9maWxlKQorCQlyZXQgPSAxOworCWZwdXRfbGlnaHQobWFzdGVyX2ZpbGUsIHB1dF9uZWVkZWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9mcmVlKGludCBpZCwgaW50IGluZGV4KQoreworCS8qIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgd3JpdGUgbG9jayBvbiBwbWVtX3NlbSEgKi8KKwlpbnQgYnVkZHksIGN1cnIgPSBpbmRleDsKKwlETE9HKCJpbmRleCAlZFxuIiwgaW5kZXgpOworCisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikgeworCQlwbWVtW2lkXS5hbGxvY2F0ZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyogY2xlYW4gdXAgdGhlIGJpdG1hcCwgbWVyZ2luZyBhbnkgYnVkZGllcyAqLworCXBtZW1baWRdLmJpdG1hcFtjdXJyXS5hbGxvY2F0ZWQgPSAwOworCS8qIGZpbmQgYSBzbG90cyBidWRkeSBCdWRkeSMgPSBTbG90IyBeICgxIDw8IG9yZGVyKQorCSAqIGlmIHRoZSBidWRkeSBpcyBhbHNvIGZyZWUgbWVyZ2UgdGhlbQorCSAqIHJlcGVhdCB1bnRpbCB0aGUgYnVkZHkgaXMgbm90IGZyZWUgb3IgZW5kIG9mIHRoZSBiaXRtYXAgaXMgcmVhY2hlZAorCSAqLworCWRvIHsKKwkJYnVkZHkgPSBQTUVNX0JVRERZX0lOREVYKGlkLCBjdXJyKTsKKwkJaWYgKFBNRU1fSVNfRlJFRShpZCwgYnVkZHkpICYmCisJCQkJUE1FTV9PUkRFUihpZCwgYnVkZHkpID09IFBNRU1fT1JERVIoaWQsIGN1cnIpKSB7CisJCQlQTUVNX09SREVSKGlkLCBidWRkeSkrKzsKKwkJCVBNRU1fT1JERVIoaWQsIGN1cnIpKys7CisJCQljdXJyID0gbWluKGJ1ZGR5LCBjdXJyKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoY3VyciA8IHBtZW1baWRdLm51bV9lbnRyaWVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbWVtX3Jldm9rZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSk7CisKK3N0YXRpYyBpbnQgcG1lbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqZWx0LCAqZWx0MjsKKwlpbnQgaWQgPSBnZXRfaWQoZmlsZSksIHJldCA9IDA7CisKKworCWRvd24oJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCS8qIGlmIHRoaXMgZmlsZSBpcyBhIG1hc3RlciwgcmV2b2tlIGFsbCB0aGUgbWVtb3J5IGluIHRoZSBjb25uZWN0ZWQKKwkgKiAgZmlsZXMgKi8KKwlpZiAoUE1FTV9GTEFHU19NQVNURVJNQVAgJiBkYXRhLT5mbGFncykgeworCQlzdHJ1Y3QgcG1lbV9kYXRhICpzdWJfZGF0YTsKKwkJbGlzdF9mb3JfZWFjaChlbHQsICZwbWVtW2lkXS5kYXRhX2xpc3QpIHsKKwkJCXN1Yl9kYXRhID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX2RhdGEsIGxpc3QpOworCQkJZG93bl9yZWFkKCZzdWJfZGF0YS0+c2VtKTsKKwkJCWlmIChQTUVNX0lTX1NVQk1BUChzdWJfZGF0YSkgJiYKKwkJCSAgICBmaWxlID09IHN1Yl9kYXRhLT5tYXN0ZXJfZmlsZSkgeworCQkJCXVwX3JlYWQoJnN1Yl9kYXRhLT5zZW0pOworCQkJCXBtZW1fcmV2b2tlKGZpbGUsIHN1Yl9kYXRhKTsKKwkJCX0gIGVsc2UKKwkJCQl1cF9yZWFkKCZzdWJfZGF0YS0+c2VtKTsKKwkJfQorCX0KKwlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7CisJdXAoJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCisKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCisJLyogaWYgaXRzIG5vdCBhIGNvbmVuY3RlZCBmaWxlIGFuZCBpdCBoYXMgYW4gYWxsb2NhdGlvbiwgZnJlZSBpdCAqLworCWlmICghKFBNRU1fRkxBR1NfQ09OTkVDVEVEICYgZGF0YS0+ZmxhZ3MpICYmIGhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisJCWRvd25fd3JpdGUoJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCQlyZXQgPSBwbWVtX2ZyZWUoaWQsIGRhdGEtPmluZGV4KTsKKwkJdXBfd3JpdGUoJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCX0KKworCS8qIGlmIHRoaXMgZmlsZSBpcyBhIHN1Ym1hcCAobWFwcGVkLCBjb25uZWN0ZWQgZmlsZSksIGRvd25yZWYgdGhlCisJICogdGFzayBzdHJ1Y3QgKi8KKwlpZiAoUE1FTV9GTEFHU19TVUJNQVAgJiBkYXRhLT5mbGFncykKKwkJaWYgKGRhdGEtPnRhc2spIHsKKwkJCXB1dF90YXNrX3N0cnVjdChkYXRhLT50YXNrKTsKKwkJCWRhdGEtPnRhc2sgPSBOVUxMOworCQl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVsdCwgZWx0MiwgJmRhdGEtPnJlZ2lvbl9saXN0KSB7CisJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWx0KTsKKwkJa2ZyZWUocmVnaW9uX25vZGUpOworCX0KKwlCVUdfT04oIWxpc3RfZW1wdHkoJmRhdGEtPnJlZ2lvbl9saXN0KSk7CisKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwlrZnJlZShkYXRhKTsKKwlpZiAocG1lbVtpZF0ucmVsZWFzZSkKKwkJcmV0ID0gcG1lbVtpZF0ucmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtZW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKwlpbnQgcmV0ID0gMDsKKworCURMT0coImN1cnJlbnQgJXUgZmlsZSAlcCglZClcbiIsIGN1cnJlbnQtPnBpZCwgZmlsZSwgZmlsZV9jb3VudChmaWxlKSk7CisJLyogc2V0dXAgZmlsZS0+cHJpdmF0ZV9kYXRhIHRvIGluZGljYXRlIGl0cyB1bm1hcHBlZCAqLworCS8qICB5b3UgY2FuIG9ubHkgb3BlbiBhIHBtZW0gZGV2aWNlIG9uZSB0aW1lICovCisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSAhPSBOVUxMKQorCQlyZXR1cm4gLTE7CisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbWVtX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKCJwbWVtOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwbWVtIG1ldGFkYXRhLiIpOworCQlyZXR1cm4gLTE7CisJfQorCWRhdGEtPmZsYWdzID0gMDsKKwlkYXRhLT5pbmRleCA9IC0xOworCWRhdGEtPnRhc2sgPSBOVUxMOworCWRhdGEtPnZtYSA9IE5VTEw7CisJZGF0YS0+cGlkID0gMDsKKwlkYXRhLT5tYXN0ZXJfZmlsZSA9IE5VTEw7CisjaWYgUE1FTV9ERUJVRworCWRhdGEtPnJlZiA9IDA7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+cmVnaW9uX2xpc3QpOworCWluaXRfcndzZW0oJmRhdGEtPnNlbSk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5saXN0KTsKKworCWRvd24oJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCWxpc3RfYWRkKCZkYXRhLT5saXN0LCAmcG1lbVtpZF0uZGF0YV9saXN0KTsKKwl1cCgmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcG1lbV9vcmRlcih1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgaTsKKworCWxlbiA9IChsZW4gKyBQTUVNX01JTl9BTExPQyAtIDEpL1BNRU1fTUlOX0FMTE9DOworCWxlbi0tOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobGVuKSo4OyBpKyspCisJCWlmIChsZW4gPj4gaSA9PSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9hbGxvY2F0ZShpbnQgaWQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCS8qIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgd3JpdGUgbG9jayBvbiBwbWVtX3NlbSEgKi8KKwkvKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcGRhdGFbXSBlbnRyeSAqLworCWludCBjdXJyID0gMDsKKwlpbnQgZW5kID0gcG1lbVtpZF0ubnVtX2VudHJpZXM7CisJaW50IGJlc3RfZml0ID0gLTE7CisJdW5zaWduZWQgbG9uZyBvcmRlciA9IHBtZW1fb3JkZXIobGVuKTsKKworCWlmIChwbWVtW2lkXS5ub19hbGxvY2F0b3IpIHsKKwkJRExPRygibm8gYWxsb2NhdG9yIik7CisJCWlmICgobGVuID4gcG1lbVtpZF0uc2l6ZSkgfHwgcG1lbVtpZF0uYWxsb2NhdGVkKQorCQkJcmV0dXJuIC0xOworCQlwbWVtW2lkXS5hbGxvY2F0ZWQgPSAxOworCQlyZXR1cm4gbGVuOworCX0KKworCWlmIChvcmRlciA+IFBNRU1fTUFYX09SREVSKQorCQlyZXR1cm4gLTE7CisJRExPRygib3JkZXIgJWx4XG4iLCBvcmRlcik7CisKKwkvKiBsb29rIHRocm91Z2ggdGhlIGJpdG1hcDoKKwkgKiAJaWYgeW91IGZpbmQgYSBmcmVlIHNsb3Qgb2YgdGhlIGNvcnJlY3Qgb3JkZXIgdXNlIGl0CisJICogCW90aGVyd2lzZSwgdXNlIHRoZSBiZXN0IGZpdCAoc21hbGxlc3Qgd2l0aCBzaXplID4gb3JkZXIpIHNsb3QKKwkgKi8KKwl3aGlsZSAoY3VyciA8IGVuZCkgeworCQlpZiAoUE1FTV9JU19GUkVFKGlkLCBjdXJyKSkgeworCQkJaWYgKFBNRU1fT1JERVIoaWQsIGN1cnIpID09ICh1bnNpZ25lZCBjaGFyKW9yZGVyKSB7CisJCQkJLyogc2V0IHRoZSBub3QgZnJlZSBiaXQgYW5kIGNsZWFyIG90aGVycyAqLworCQkJCWJlc3RfZml0ID0gY3VycjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChQTUVNX09SREVSKGlkLCBjdXJyKSA+ICh1bnNpZ25lZCBjaGFyKW9yZGVyICYmCisJCQkgICAgKGJlc3RfZml0IDwgMCB8fAorCQkJICAgICBQTUVNX09SREVSKGlkLCBjdXJyKSA8IFBNRU1fT1JERVIoaWQsIGJlc3RfZml0KSkpCisJCQkJYmVzdF9maXQgPSBjdXJyOworCQl9CisJCWN1cnIgPSBQTUVNX05FWFRfSU5ERVgoaWQsIGN1cnIpOworCX0KKworCS8qIGlmIGJlc3RfZml0IDwgMCwgdGhlcmUgYXJlIG5vIHN1aXRhYmxlIHNsb3RzLAorCSAqIHJldHVybiBhbiBlcnJvcgorCSAqLworCWlmIChiZXN0X2ZpdCA8IDApIHsKKwkJcHJpbnRrKCJwbWVtOiBubyBzcGFjZSBsZWZ0IHRvIGFsbG9jYXRlIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBub3cgcGFydGl0aW9uIHRoZSBiZXN0IGZpdDoKKwkgKiAJc3BsaXQgdGhlIHNsb3QgaW50byAyIGJ1ZGRpZXMgb2Ygb3JkZXIgLSAxCisJICogCXJlcGVhdCB1bnRpbCB0aGUgc2xvdCBpcyBvZiB0aGUgY29ycmVjdCBvcmRlcgorCSAqLworCXdoaWxlIChQTUVNX09SREVSKGlkLCBiZXN0X2ZpdCkgPiAodW5zaWduZWQgY2hhcilvcmRlcikgeworCQlpbnQgYnVkZHk7CisJCVBNRU1fT1JERVIoaWQsIGJlc3RfZml0KSAtPSAxOworCQlidWRkeSA9IFBNRU1fQlVERFlfSU5ERVgoaWQsIGJlc3RfZml0KTsKKwkJUE1FTV9PUkRFUihpZCwgYnVkZHkpID0gUE1FTV9PUkRFUihpZCwgYmVzdF9maXQpOworCX0KKwlwbWVtW2lkXS5iaXRtYXBbYmVzdF9maXRdLmFsbG9jYXRlZCA9IDE7CisJcmV0dXJuIGJlc3RfZml0OworfQorCitzdGF0aWMgcGdwcm90X3QgcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHBncHJvdF90IHZtYV9wcm90KQoreworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKyNpZmRlZiBwZ3Byb3Rfbm9uY2FjaGVkCisJaWYgKHBtZW1baWRdLmNhY2hlZCA9PSAwIHx8IGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpCisJCXJldHVybiBwZ3Byb3Rfbm9uY2FjaGVkKHZtYV9wcm90KTsKKyNlbmRpZgorI2lmZGVmIHBncHJvdF9leHRfYnVmZmVyZWQKKwllbHNlIGlmIChwbWVtW2lkXS5idWZmZXJlZCkKKwkJcmV0dXJuIHBncHJvdF9leHRfYnVmZmVyZWQodm1hX3Byb3QpOworI2VuZGlmCisJcmV0dXJuIHZtYV9wcm90OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbWVtX3N0YXJ0X2FkZHIoaW50IGlkLCBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhKQoreworCWlmIChwbWVtW2lkXS5ub19hbGxvY2F0b3IpCisJCXJldHVybiBQTUVNX1NUQVJUX0FERFIoaWQsIDApOworCWVsc2UKKwkJcmV0dXJuIFBNRU1fU1RBUlRfQUREUihpZCwgZGF0YS0+aW5kZXgpOworCit9CisKK3N0YXRpYyB2b2lkICpwbWVtX3N0YXJ0X3ZhZGRyKGludCBpZCwgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gcG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKSAtIHBtZW1baWRdLmJhc2UgKyBwbWVtW2lkXS52YmFzZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcG1lbV9sZW4oaW50IGlkLCBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhKQoreworCWlmIChwbWVtW2lkXS5ub19hbGxvY2F0b3IpCisJCXJldHVybiBkYXRhLT5pbmRleDsKKwllbHNlCisJCXJldHVybiBQTUVNX0xFTihpZCwgZGF0YS0+aW5kZXgpOworfQorCitzdGF0aWMgaW50IHBtZW1fbWFwX2dhcmJhZ2UoaW50IGlkLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCSAgICBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgaSwgZ2FyYmFnZV9wYWdlcyA9IGxlbiA+PiBQQUdFX1NISUZUOworCisJdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQIHwgVk1fU0hBUkVEIHwgVk1fV1JJVEU7CisJZm9yIChpID0gMDsgaSA8IGdhcmJhZ2VfcGFnZXM7IGkrKykgeworCQlpZiAodm1faW5zZXJ0X3Bmbih2bWEsIHZtYS0+dm1fc3RhcnQgKyBvZmZzZXQgKyAoaSAqIFBBR0VfU0laRSksCisJCSAgICBwbWVtW2lkXS5nYXJiYWdlX3BmbikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV91bm1hcF9wZm5fcmFuZ2UoaW50IGlkLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQl1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgZ2FyYmFnZV9wYWdlczsKKwlETE9HKCJ1bm1hcCBvZmZzZXQgJWx4IGxlbiAlbHhcbiIsIG9mZnNldCwgbGVuKTsKKworCUJVR19PTighUE1FTV9JU19QQUdFX0FMSUdORUQobGVuKSk7CisKKwlnYXJiYWdlX3BhZ2VzID0gbGVuID4+IFBBR0VfU0hJRlQ7CisJemFwX3BhZ2VfcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0ICsgb2Zmc2V0LCBsZW4sIE5VTEwpOworCXBtZW1fbWFwX2dhcmJhZ2UoaWQsIHZtYSwgZGF0YSwgb2Zmc2V0LCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtZW1fbWFwX3Bmbl9yYW5nZShpbnQgaWQsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgc3RydWN0IHBtZW1fZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlETE9HKCJtYXAgb2Zmc2V0ICVseCBsZW4gJWx4XG4iLCBvZmZzZXQsIGxlbik7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRCh2bWEtPnZtX3N0YXJ0KSk7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRCh2bWEtPnZtX2VuZCkpOworCUJVR19PTighUE1FTV9JU19QQUdFX0FMSUdORUQobGVuKSk7CisJQlVHX09OKCFQTUVNX0lTX1BBR0VfQUxJR05FRChvZmZzZXQpKTsKKworCWlmIChpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0ICsgb2Zmc2V0LAorCQkocG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKSArIG9mZnNldCkgPj4gUEFHRV9TSElGVCwKKwkJbGVuLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtZW1fcmVtYXBfcGZuX3JhbmdlKGludCBpZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgICBzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCS8qIGhvbGQgdGhlIG1tIHNlbXAgZm9yIHRoZSB2bWEgeW91IGFyZSBtb2RpZnlpbmcgd2hlbiB5b3UgY2FsbCB0aGlzICovCisJQlVHX09OKCF2bWEpOworCXphcF9wYWdlX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCArIG9mZnNldCwgbGVuLCBOVUxMKTsKKwlyZXR1cm4gcG1lbV9tYXBfcGZuX3JhbmdlKGlkLCB2bWEsIGRhdGEsIG9mZnNldCwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgcG1lbV92bWFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKwkvKiB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBjb3B5aW5nIHBtZW0KKwkgKiByYW5nZXMgdmlhIGZvcmsgKi8KKwlCVUdfT04oIWhhc19hbGxvY2F0aW9uKGZpbGUpKTsKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCS8qIHJlbWFwIHRoZSBnYXJiYWdlIHBhZ2VzLCBmb3JrZXJzIGRvbid0IGdldCBhY2Nlc3MgdG8gdGhlIGRhdGEgKi8KKwlwbWVtX3VubWFwX3Bmbl9yYW5nZShpZCwgdm1hLCBkYXRhLCAwLCB2bWEtPnZtX3N0YXJ0IC0gdm1hLT52bV9lbmQpOworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworfQorCitzdGF0aWMgdm9pZCBwbWVtX3ZtYV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJRExPRygiY3VycmVudCAldSBwcGlkICV1IGZpbGUgJXAgY291bnQgJWRcbiIsIGN1cnJlbnQtPnBpZCwKKwkgICAgIGN1cnJlbnQtPnBhcmVudC0+cGlkLCBmaWxlLCBmaWxlX2NvdW50KGZpbGUpKTsKKwlpZiAodW5saWtlbHkoIWlzX3BtZW1fZmlsZShmaWxlKSB8fCAhaGFzX2FsbG9jYXRpb24oZmlsZSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBtZW06IHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLCB5b3UgYXJlICIKKwkJICAgICAgICJjbG9zaW5nIGEgdm0gYmFja2luZyBhbiBhbGxvY2F0aW9uIHRoYXQgZG9lc24ndCAiCisJCSAgICAgICAiZXhpc3QhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCWlmIChkYXRhLT52bWEgPT0gdm1hKSB7CisJCWRhdGEtPnZtYSA9IE5VTEw7CisJCWlmICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX0NPTk5FQ1RFRCkgJiYKKwkJICAgIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfU1VCTUFQKSkKKwkJCWRhdGEtPmZsYWdzIHw9IFBNRU1fRkxBR1NfVU5TVUJNQVA7CisJfQorCS8qIHRoZSBrZXJuZWwgaXMgZ29pbmcgdG8gZnJlZSB0aGlzIHZtYSBub3cgYW55d2F5ICovCisJdXBfd3JpdGUoJmRhdGEtPnNlbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgdm1fb3BzID0geworCS5vcGVuID0gcG1lbV92bWFfb3BlbiwKKwkuY2xvc2UgPSBwbWVtX3ZtYV9jbG9zZSwKK307CisKK3N0YXRpYyBpbnQgcG1lbV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIHZtYV9zaXplID0gIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpbnQgcmV0ID0gMCwgaWQgPSBnZXRfaWQoZmlsZSk7CisKKwlpZiAodm1hLT52bV9wZ29mZiB8fCAhUE1FTV9JU19QQUdFX0FMSUdORUQodm1hX3NpemUpKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9FUlIgInBtZW06IG1tYXBzIG11c3QgYmUgYXQgb2Zmc2V0IHplcm8sIGFsaWduZWQiCisJCQkJIiBhbmQgYSBtdWx0aXBsZSBvZiBwYWdlc19zaXplLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJLyogY2hlY2sgdGhpcyBmaWxlIGlzbid0IGFscmVhZHkgbW1hcGVkLCBmb3Igc3VibWFwcyBjaGVjayB0aGlzIGZpbGUKKwkgKiBoYXMgbmV2ZXIgYmVlbiBtbWFwZWQgKi8KKwlpZiAoKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19NQVNURVJNQVApIHx8CisJICAgIChkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfU1VCTUFQKSB8fAorCSAgICAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1VOU1VCTUFQKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fRVJSICJwbWVtOiB5b3UgY2FuIG9ubHkgbW1hcCBhIHBtZW0gZmlsZSBvbmNlLCAiCisJCSAgICAgICAidGhpcyBmaWxlIGlzIGFscmVhZHkgbW1hcGVkLiAleFxuIiwgZGF0YS0+ZmxhZ3MpOworI2VuZGlmCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCS8qIGlmIGZpbGUtPnByaXZhdGVfZGF0YSA9PSB1bmFsbG9jZWQsIGFsbG9jKi8KKwlpZiAoZGF0YSAmJiBkYXRhLT5pbmRleCA9PSAtMSkgeworCQlkb3duX3dyaXRlKCZwbWVtW2lkXS5iaXRtYXBfc2VtKTsKKwkJaW5kZXggPSBwbWVtX2FsbG9jYXRlKGlkLCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpOworCQl1cF93cml0ZSgmcG1lbVtpZF0uYml0bWFwX3NlbSk7CisJCWRhdGEtPmluZGV4ID0gaW5kZXg7CisJfQorCS8qIGVpdGhlciBubyBzcGFjZSB3YXMgYXZhaWxhYmxlIG9yIGFuIGVycm9yIG9jY3VyZWQgKi8KKwlpZiAoIWhhc19hbGxvY2F0aW9uKGZpbGUpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXByaW50aygicG1lbTogY291bGQgbm90IGZpbmQgYWxsb2NhdGlvbiBmb3IgbWFwLlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKHBtZW1fbGVuKGlkLCBkYXRhKSA8IHZtYV9zaXplKSB7CisjaWYgUE1FTV9ERUJVRworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwbWVtOiBtbWFwIHNpemUgWyVsdV0gZG9lcyBub3QgbWF0Y2giCisJCSAgICAgICAic2l6ZSBvZiBiYWNraW5nIHJlZ2lvbiBbJWx1XS5cbiIsIHZtYV9zaXplLAorCQkgICAgICAgcG1lbV9sZW4oaWQsIGRhdGEpKTsKKyNlbmRpZgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXZtYS0+dm1fcGdvZmYgPSBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpID4+IFBBR0VfU0hJRlQ7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX0NPTk5FQ1RFRCkgeworCQlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVsdDsKKwkJaWYgKHBtZW1fbWFwX2dhcmJhZ2UoaWQsIHZtYSwgZGF0YSwgMCwgdm1hX3NpemUpKSB7CisJCQlwcmludGsoInBtZW06IG1tYXAgZmFpbGVkIGluIGtlcm5lbCFcbiIpOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJbGlzdF9mb3JfZWFjaChlbHQsICZkYXRhLT5yZWdpb25fbGlzdCkgeworCQkJcmVnaW9uX25vZGUgPSBsaXN0X2VudHJ5KGVsdCwgc3RydWN0IHBtZW1fcmVnaW9uX25vZGUsCisJCQkJCQkgbGlzdCk7CisJCQlETE9HKCJyZW1hcHBpbmcgZmlsZTogJXAgJWx4ICVseFxuIiwgZmlsZSwKKwkJCQlyZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCwKKwkJCQlyZWdpb25fbm9kZS0+cmVnaW9uLmxlbik7CisJCQlpZiAocG1lbV9yZW1hcF9wZm5fcmFuZ2UoaWQsIHZtYSwgZGF0YSwKKwkJCQkJCSByZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCwKKwkJCQkJCSByZWdpb25fbm9kZS0+cmVnaW9uLmxlbikpIHsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwkJZGF0YS0+ZmxhZ3MgfD0gUE1FTV9GTEFHU19TVUJNQVA7CisJCWdldF90YXNrX3N0cnVjdChjdXJyZW50LT5ncm91cF9sZWFkZXIpOworCQlkYXRhLT50YXNrID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOworCQlkYXRhLT52bWEgPSB2bWE7CisjaWYgUE1FTV9ERUJVRworCQlkYXRhLT5waWQgPSBjdXJyZW50LT5waWQ7CisjZW5kaWYKKwkJRExPRygic3VibW1hcHBlZCBmaWxlICVwIHZtYSAlcCBwaWQgJXVcbiIsIGZpbGUsIHZtYSwKKwkJICAgICBjdXJyZW50LT5waWQpOworCX0gZWxzZSB7CisJCWlmIChwbWVtX21hcF9wZm5fcmFuZ2UoaWQsIHZtYSwgZGF0YSwgMCwgdm1hX3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiBtbWFwIGZhaWxlZCBpbiBrZXJuZWwhXG4iKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRhdGEtPmZsYWdzIHw9IFBNRU1fRkxBR1NfTUFTVEVSTUFQOworCQlkYXRhLT5waWQgPSBjdXJyZW50LT5waWQ7CisJfQorCXZtYS0+dm1fb3BzID0gJnZtX29wczsKK2Vycm9yOgorCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBhcGkgZm9yIGFjY2Vzc2luZyBwbWVtIHJlZ2lvbnMgYnkgb3RoZXIgZHJpdmVycworICogZnJvbSBpbnNpZGUgdGhlIGtlcm5lbCAqLworaW50IGdldF9wbWVtX3VzZXJfYWRkcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyAqc3RhcnQsCisJCSAgIHVuc2lnbmVkIGxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogcmVxdWVzdGVkIHBtZW0gZGF0YSBmcm9tIGludmFsaWQiCisJCQkJICAiZmlsZS5cbiIpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRvd25fcmVhZCgmZGF0YS0+c2VtKTsKKwlpZiAoZGF0YS0+dm1hKSB7CisJCSpzdGFydCA9IGRhdGEtPnZtYS0+dm1fc3RhcnQ7CisJCSpsZW4gPSBkYXRhLT52bWEtPnZtX2VuZCAtIGRhdGEtPnZtYS0+dm1fc3RhcnQ7CisJfSBlbHNlIHsKKwkJKnN0YXJ0ID0gMDsKKwkJKmxlbiA9IDA7CisJfQorCXVwX3JlYWQoJmRhdGEtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcG1lbV9hZGRyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nICpzdGFydCwKKwkJICB1bnNpZ25lZCBsb25nICp2c3RhcnQsIHVuc2lnbmVkIGxvbmcgKmxlbikKK3sKKwlzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhOworCWludCBpZDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChkYXRhLT5pbmRleCA9PSAtMSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogcmVxdWVzdGVkIHBtZW0gZGF0YSBmcm9tIGZpbGUgd2l0aCBubyAiCisJCSAgICAgICAiYWxsb2NhdGlvbi5cbiIpOworCQlyZXR1cm4gLTE7CisjZW5kaWYKKwl9CisJaWQgPSBnZXRfaWQoZmlsZSk7CisKKwlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJKnN0YXJ0ID0gcG1lbV9zdGFydF9hZGRyKGlkLCBkYXRhKTsKKwkqbGVuID0gcG1lbV9sZW4oaWQsIGRhdGEpOworCSp2c3RhcnQgPSAodW5zaWduZWQgbG9uZylwbWVtX3N0YXJ0X3ZhZGRyKGlkLCBkYXRhKTsKKwl1cF9yZWFkKCZkYXRhLT5zZW0pOworI2lmIFBNRU1fREVCVUcKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCWRhdGEtPnJlZisrOworCXVwX3dyaXRlKCZkYXRhLT5zZW0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcG1lbV9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKnZzdGFydCwKKwkJICB1bnNpZ25lZCBsb25nICpsZW4sIHN0cnVjdCBmaWxlICoqZmlscCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAodW5saWtlbHkoZmlsZSA9PSBOVUxMKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiByZXF1ZXN0ZWQgZGF0YSBmcm9tIGZpbGUgZGVzY3JpcHRvciAiCisJCSAgICAgICAidGhhdCBkb2Vzbid0IGV4aXN0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGdldF9wbWVtX2FkZHIoZmlsZSwgc3RhcnQsIHZzdGFydCwgbGVuKSkKKwkJZ290byBlbmQ7CisKKwlpZiAoZmlscCkKKwkJKmZpbHAgPSBmaWxlOworCXJldHVybiAwOworZW5kOgorCWZwdXQoZmlsZSk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIHB1dF9wbWVtX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgaWQ7CisKKwlpZiAoIWlzX3BtZW1fZmlsZShmaWxlKSkKKwkJcmV0dXJuOworCWlkID0gZ2V0X2lkKGZpbGUpOworCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyNpZiBQTUVNX0RFQlVHCisJZG93bl93cml0ZSgmZGF0YS0+c2VtKTsKKwlpZiAoZGF0YS0+cmVmID09IDApIHsKKwkJcHJpbnRrKCJwbWVtOiBwbWVtX3B1dCA+IHBtZW1fZ2V0ICVzIChwaWQgJWQpXG4iLAorCQkgICAgICAgcG1lbVtpZF0uZGV2Lm5hbWUsIGRhdGEtPnBpZCk7CisJCUJVRygpOworCX0KKwlkYXRhLT5yZWYtLTsKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKyNlbmRpZgorCWZwdXQoZmlsZSk7Cit9CisKK3ZvaWQgZmx1c2hfcG1lbV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgaWQ7CisJdm9pZCAqdmFkZHI7CisJc3RydWN0IHBtZW1fcmVnaW9uX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdDsKKwl2b2lkICpmbHVzaF9zdGFydCwgKmZsdXNoX2VuZDsKKworCWlmICghaXNfcG1lbV9maWxlKGZpbGUpIHx8ICFoYXNfYWxsb2NhdGlvbihmaWxlKSkgeworCQlyZXR1cm47CisJfQorCisJaWQgPSBnZXRfaWQoZmlsZSk7CisJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICghcG1lbVtpZF0uY2FjaGVkKQorCQlyZXR1cm47CisKKwlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJdmFkZHIgPSBwbWVtX3N0YXJ0X3ZhZGRyKGlkLCBkYXRhKTsKKwkvKiBpZiB0aGlzIGlzbid0IGEgc3VibW1hcHBlZCBmaWxlLCBmbHVzaCB0aGUgd2hvbGUgdGhpbmcgKi8KKwlpZiAodW5saWtlbHkoIShkYXRhLT5mbGFncyAmIFBNRU1fRkxBR1NfQ09OTkVDVEVEKSkpIHsKKwkJZG1hY19mbHVzaF9yYW5nZSh2YWRkciwgdmFkZHIgKyBwbWVtX2xlbihpZCwgZGF0YSkpOworCQlnb3RvIGVuZDsKKwl9CisJLyogb3RoZXJ3aXNlLCBmbHVzaCB0aGUgcmVnaW9uIG9mIHRoZSBmaWxlIHdlIGFyZSBkcmF3aW5nICovCisJbGlzdF9mb3JfZWFjaChlbHQsICZkYXRhLT5yZWdpb25fbGlzdCkgeworCQlyZWdpb25fbm9kZSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwgbGlzdCk7CisJCWlmICgob2Zmc2V0ID49IHJlZ2lvbl9ub2RlLT5yZWdpb24ub2Zmc2V0KSAmJgorCQkgICAgKChvZmZzZXQgKyBsZW4pIDw9IChyZWdpb25fbm9kZS0+cmVnaW9uLm9mZnNldCArCisJCQlyZWdpb25fbm9kZS0+cmVnaW9uLmxlbikpKSB7CisJCQlmbHVzaF9zdGFydCA9IHZhZGRyICsgcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQ7CisJCQlmbHVzaF9lbmQgPSBmbHVzaF9zdGFydCArIHJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuOworCQkJZG1hY19mbHVzaF9yYW5nZShmbHVzaF9zdGFydCwgZmx1c2hfZW5kKTsKKwkJCWJyZWFrOworCQl9CisJfQorZW5kOgorCXVwX3JlYWQoJmRhdGEtPnNlbSk7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9jb25uZWN0KHVuc2lnbmVkIGxvbmcgY29ubmVjdCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwbWVtX2RhdGEgKnNyY19kYXRhOworCXN0cnVjdCBmaWxlICpzcmNfZmlsZTsKKwlpbnQgcmV0ID0gMCwgcHV0X25lZWRlZDsKKworCWRvd25fd3JpdGUoJmRhdGEtPnNlbSk7CisJLyogcmV0cmlldmUgdGhlIHNyYyBmaWxlIGFuZCBjaGVjayBpdCBpcyBhIHBtZW0gZmlsZSB3aXRoIGFuIGFsbG9jICovCisJc3JjX2ZpbGUgPSBmZ2V0X2xpZ2h0KGNvbm5lY3QsICZwdXRfbmVlZGVkKTsKKwlETE9HKCJjb25uZWN0ICVwIHRvICVwXG4iLCBmaWxlLCBzcmNfZmlsZSk7CisJaWYgKCFzcmNfZmlsZSkgeworCQlwcmludGsoInBtZW06IHNyYyBmaWxlIG5vdCBmb3VuZCFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9ub19maWxlOworCX0KKwlpZiAodW5saWtlbHkoIWlzX3BtZW1fZmlsZShzcmNfZmlsZSkgfHwgIWhhc19hbGxvY2F0aW9uKHNyY19maWxlKSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogc3JjIGZpbGUgaXMgbm90IGEgcG1lbSBmaWxlIG9yIGhhcyBubyAiCisJCSAgICAgICAiYWxsb2MhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfYmFkX2ZpbGU7CisJfQorCXNyY19kYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilzcmNfZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGhhc19hbGxvY2F0aW9uKGZpbGUpICYmIChkYXRhLT5pbmRleCAhPSBzcmNfZGF0YS0+aW5kZXgpKSB7CisJCXByaW50aygicG1lbTogZmlsZSBpcyBhbHJlYWR5IG1hcHBlZCBidXQgZG9lc24ndCBtYXRjaCB0aGlzIgorCQkgICAgICAgIiBzcmNfZmlsZSFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9iYWRfZmlsZTsKKwl9CisJZGF0YS0+aW5kZXggPSBzcmNfZGF0YS0+aW5kZXg7CisJZGF0YS0+ZmxhZ3MgfD0gUE1FTV9GTEFHU19DT05ORUNURUQ7CisJZGF0YS0+bWFzdGVyX2ZkID0gY29ubmVjdDsKKwlkYXRhLT5tYXN0ZXJfZmlsZSA9IHNyY19maWxlOworCitlcnJfYmFkX2ZpbGU6CisJZnB1dF9saWdodChzcmNfZmlsZSwgcHV0X25lZWRlZCk7CitlcnJfbm9fZmlsZToKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwbWVtX3VubG9ja19kYXRhX2FuZF9tbShzdHJ1Y3QgcG1lbV9kYXRhICpkYXRhLAorCQkJCSAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwlpZiAobW0gIT0gTlVMTCkgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KK30KKworc3RhdGljIGludCBwbWVtX2xvY2tfZGF0YV9hbmRfbW0oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEsCisJCQkJIHN0cnVjdCBtbV9zdHJ1Y3QgKipsb2NrZWRfbW0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCSpsb2NrZWRfbW0gPSBOVUxMOworbG9ja19tbToKKwlkb3duX3JlYWQoJmRhdGEtPnNlbSk7CisJaWYgKFBNRU1fSVNfU1VCTUFQKGRhdGEpKSB7CisJCW1tID0gZ2V0X3Rhc2tfbW0oZGF0YS0+dGFzayk7CisJCWlmICghbW0pIHsKKyNpZiBQTUVNX0RFQlVHCisJCQlwcmludGsoInBtZW06IGNhbid0IHJlbWFwIHRhc2sgaXMgZ29uZSFcbiIpOworI2VuZGlmCisJCQl1cF9yZWFkKCZkYXRhLT5zZW0pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXVwX3JlYWQoJmRhdGEtPnNlbSk7CisKKwlpZiAobW0pCisJCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwlkb3duX3dyaXRlKCZkYXRhLT5zZW0pOworCS8qIGNoZWNrIHRoYXQgdGhlIGZpbGUgZGlkbid0IGdldCBtbWFwZWQgYmVmb3JlIHdlIGNvdWxkIHRha2UgdGhlCisJICogZGF0YSBzZW0sIHRoaXMgc2hvdWxkIGJlIHNhZmUgYi9jIHlvdSBjYW4gb25seSBzdWJtYXAgZWFjaCBmaWxlCisJICogb25jZSAqLworCWlmIChQTUVNX0lTX1NVQk1BUChkYXRhKSAmJiAhbW0pIHsKKwkJcG1lbV91bmxvY2tfZGF0YV9hbmRfbW0oZGF0YSwgbW0pOworCQl1cF93cml0ZSgmZGF0YS0+c2VtKTsKKwkJZ290byBsb2NrX21tOworCX0KKwkvKiBub3cgY2hlY2sgdGhhdCB2bWEubW0gaXMgc3RpbGwgdGhlcmUsIGl0IGNvdWxkIGhhdmUgYmVlbgorCSAqIGRlbGV0ZWQgYnkgdm1hX2Nsb3NlIGJlZm9yZSB3ZSBjb3VsZCBnZXQgdGhlIGRhdGEtPnNlbSAqLworCWlmICgoZGF0YS0+ZmxhZ3MgJiBQTUVNX0ZMQUdTX1VOU1VCTUFQKSAmJiAobW0gIT0gTlVMTCkpIHsKKwkJLyogbWlnaHQgYXMgd2VsbCByZWxlYXNlIHRoaXMgKi8KKwkJaWYgKGRhdGEtPmZsYWdzICYgUE1FTV9GTEFHU19TVUJNQVApIHsKKwkJCXB1dF90YXNrX3N0cnVjdChkYXRhLT50YXNrKTsKKwkJCWRhdGEtPnRhc2sgPSBOVUxMOworCQkJLyogbG93ZXIgdGhlIHN1Ym1hcCBmbGFnIHRvIHNob3cgdGhlIG1tIGlzIGdvbmUgKi8KKwkJCWRhdGEtPmZsYWdzICY9IH4oUE1FTV9GTEFHU19TVUJNQVApOworCQl9CisJCXBtZW1fdW5sb2NrX2RhdGFfYW5kX21tKGRhdGEsIG1tKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqbG9ja2VkX21tID0gbW07CisJcmV0dXJuIHJldDsKK30KKworaW50IHBtZW1fcmVtYXAoc3RydWN0IHBtZW1fcmVnaW9uICpyZWdpb24sIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICB1bnNpZ25lZCBvcGVyYXRpb24pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CisJaW50IGlkID0gZ2V0X2lkKGZpbGUpOworCXN0cnVjdCBwbWVtX2RhdGEgKmRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIHBtZW0gcmVnaW9uIG11c3QgYmUgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRyeSAqLworCWlmICh1bmxpa2VseSghUE1FTV9JU19QQUdFX0FMSUdORUQocmVnaW9uLT5vZmZzZXQpIHx8CisJCSAhUE1FTV9JU19QQUdFX0FMSUdORUQocmVnaW9uLT5sZW4pKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKCJwbWVtOiByZXF1ZXN0IGZvciB1bmFsaWduZWQgcG1lbSBzdWJhbGxvY2F0aW9uICIKKwkJICAgICAgICIlbHggJWx4XG4iLCByZWdpb24tPm9mZnNldCwgcmVnaW9uLT5sZW4pOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGlmIHVzZXJzcGFjZSByZXF1ZXN0cyBhIHJlZ2lvbiBvZiBsZW4gMCwgdGhlcmUncyBub3RoaW5nIHRvIGRvICovCisJaWYgKHJlZ2lvbi0+bGVuID09IDApCisJCXJldHVybiAwOworCisJLyogbG9jayB0aGUgbW0gYW5kIGRhdGEgKi8KKwlyZXQgPSBwbWVtX2xvY2tfZGF0YV9hbmRfbW0oZmlsZSwgZGF0YSwgJm1tKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKworCS8qIG9ubHkgdGhlIG93bmVyIG9mIHRoZSBtYXN0ZXIgZmlsZSBjYW4gcmVtYXAgdGhlIGNsaWVudCBmZHMKKwkgKiB0aGF0IGJhY2sgaW4gaXQgKi8KKwlpZiAoIWlzX21hc3Rlcl9vd25lcihmaWxlKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKCJwbWVtOiByZW1hcCByZXF1ZXN0ZWQgZnJvbSBub24tbWFzdGVyIHByb2Nlc3NcbiIpOworI2VuZGlmCisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGNoZWNrIHRoYXQgdGhlIHJlcXVlc3RlZCByYW5nZSBpcyB3aXRoaW4gdGhlIHNyYyBhbGxvY2F0aW9uICovCisJaWYgKHVubGlrZWx5KChyZWdpb24tPm9mZnNldCA+IHBtZW1fbGVuKGlkLCBkYXRhKSkgfHwKKwkJICAgICAocmVnaW9uLT5sZW4gPiBwbWVtX2xlbihpZCwgZGF0YSkpIHx8CisJCSAgICAgKHJlZ2lvbi0+b2Zmc2V0ICsgcmVnaW9uLT5sZW4gPiBwbWVtX2xlbihpZCwgZGF0YSkpKSkgeworI2lmIFBNRU1fREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1lbTogc3ViYWxsb2MgZG9lc24ndCBmaXQgaW4gc3JjX2ZpbGUhXG4iKTsKKyNlbmRpZgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAob3BlcmF0aW9uID09IFBNRU1fTUFQKSB7CisJCXJlZ2lvbl9ub2RlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBtZW1fcmVnaW9uX25vZGUpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVnaW9uX25vZGUpIHsKKwkJCXJldCA9IC1FTk9NRU07CisjaWYgUE1FTV9ERUJVRworCQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gc3BhY2UgdG8gYWxsb2NhdGUgbWV0YWRhdGEhIik7CisjZW5kaWYKKwkJCWdvdG8gZXJyOworCQl9CisJCXJlZ2lvbl9ub2RlLT5yZWdpb24gPSAqcmVnaW9uOworCQlsaXN0X2FkZCgmcmVnaW9uX25vZGUtPmxpc3QsICZkYXRhLT5yZWdpb25fbGlzdCk7CisJfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gUE1FTV9VTk1BUCkgeworCQlpbnQgZm91bmQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZWx0LCBlbHQyLCAmZGF0YS0+cmVnaW9uX2xpc3QpIHsKKwkJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQsIHN0cnVjdCBwbWVtX3JlZ2lvbl9ub2RlLAorCQkJCSAgICAgIGxpc3QpOworCQkJaWYgKHJlZ2lvbi0+bGVuID09IDAgfHwKKwkJCSAgICAocmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQgPT0gcmVnaW9uLT5vZmZzZXQgJiYKKwkJCSAgICByZWdpb25fbm9kZS0+cmVnaW9uLmxlbiA9PSByZWdpb24tPmxlbikpIHsKKwkJCQlsaXN0X2RlbChlbHQpOworCQkJCWtmcmVlKHJlZ2lvbl9ub2RlKTsKKwkJCQlmb3VuZCA9IDE7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkgeworI2lmIFBNRU1fREVCVUcKKwkJCXByaW50aygicG1lbTogVW5tYXAgcmVnaW9uIGRvZXMgbm90IG1hcCBhbnkgbWFwcGVkICIKKwkJCQkicmVnaW9uISIpOworI2VuZGlmCisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZiAoZGF0YS0+dm1hICYmIFBNRU1fSVNfU1VCTUFQKGRhdGEpKSB7CisJCWlmIChvcGVyYXRpb24gPT0gUE1FTV9NQVApCisJCQlyZXQgPSBwbWVtX3JlbWFwX3Bmbl9yYW5nZShpZCwgZGF0YS0+dm1hLCBkYXRhLAorCQkJCQkJICAgcmVnaW9uLT5vZmZzZXQsIHJlZ2lvbi0+bGVuKTsKKwkJZWxzZSBpZiAob3BlcmF0aW9uID09IFBNRU1fVU5NQVApCisJCQlyZXQgPSBwbWVtX3VubWFwX3Bmbl9yYW5nZShpZCwgZGF0YS0+dm1hLCBkYXRhLAorCQkJCQkJICAgcmVnaW9uLT5vZmZzZXQsIHJlZ2lvbi0+bGVuKTsKKwl9CisKK2VycjoKKwlwbWVtX3VubG9ja19kYXRhX2FuZF9tbShkYXRhLCBtbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcG1lbV9yZXZva2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwbWVtX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHBtZW1fcmVnaW9uX25vZGUgKnJlZ2lvbl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBOVUxMOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKwlpbnQgcmV0ID0gMDsKKworCWRhdGEtPm1hc3Rlcl9maWxlID0gTlVMTDsKKwlyZXQgPSBwbWVtX2xvY2tfZGF0YV9hbmRfbW0oZmlsZSwgZGF0YSwgJm1tKTsKKwkvKiBpZiBsb2NrX2RhdGFfYW5kX21tIGZhaWxzIGVpdGhlciB0aGUgdGFzayB0aGF0IG1hcHBlZCB0aGUgZmQsIG9yCisJICogdGhlIHZtYSB0aGF0IG1hcHBlZCBpdCBoYXZlIGFscmVhZHkgZ29uZSBhd2F5LCBub3RoaW5nIG1vcmUKKwkgKiBuZWVkcyB0byBiZSBkb25lICovCisJaWYgKHJldCkKKwkJcmV0dXJuOworCS8qIHVubWFwIGV2ZXJ5dGhpbmcgKi8KKwkvKiBkZWxldGUgdGhlIHJlZ2lvbnMgYW5kIHJlZ2lvbiBsaXN0IG5vdGhpbmcgaXMgbWFwcGVkIGFueSBtb3JlICovCisJaWYgKGRhdGEtPnZtYSkKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGVsdCwgZWx0MiwgJmRhdGEtPnJlZ2lvbl9saXN0KSB7CisJCQlyZWdpb25fbm9kZSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwKKwkJCQkJCSBsaXN0KTsKKwkJCXBtZW1fdW5tYXBfcGZuX3JhbmdlKGlkLCBkYXRhLT52bWEsIGRhdGEsCisJCQkJCSAgICAgcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQsCisJCQkJCSAgICAgcmVnaW9uX25vZGUtPnJlZ2lvbi5sZW4pOworCQkJbGlzdF9kZWwoZWx0KTsKKwkJCWtmcmVlKHJlZ2lvbl9ub2RlKTsKKwl9CisJLyogZGVsZXRlIHRoZSBtYXN0ZXIgZmlsZSAqLworCXBtZW1fdW5sb2NrX2RhdGFfYW5kX21tKGRhdGEsIG1tKTsKK30KKworc3RhdGljIHZvaWQgcG1lbV9nZXRfc2l6ZShzdHJ1Y3QgcG1lbV9yZWdpb24gKnJlZ2lvbiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBpZCA9IGdldF9pZChmaWxlKTsKKworCWlmICghaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKKwkJcmVnaW9uLT5vZmZzZXQgPSAwOworCQlyZWdpb24tPmxlbiA9IDA7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlyZWdpb24tPm9mZnNldCA9IHBtZW1fc3RhcnRfYWRkcihpZCwgZGF0YSk7CisJCXJlZ2lvbi0+bGVuID0gcG1lbV9sZW4oaWQsIGRhdGEpOworCX0KKwlETE9HKCJvZmZzZXQgJWx4IGxlbiAlbHhcbiIsIHJlZ2lvbi0+b2Zmc2V0LCByZWdpb24tPmxlbik7Cit9CisKKworc3RhdGljIGxvbmcgcG1lbV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlpbnQgaWQgPSBnZXRfaWQoZmlsZSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUE1FTV9HRVRfUEhZUzoKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCURMT0coImdldF9waHlzXG4iKTsKKwkJCWlmICghaGFzX2FsbG9jYXRpb24oZmlsZSkpIHsKKwkJCQlyZWdpb24ub2Zmc2V0ID0gMDsKKwkJCQlyZWdpb24ubGVuID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZGF0YSA9IChzdHJ1Y3QgcG1lbV9kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJCXJlZ2lvbi5vZmZzZXQgPSBwbWVtX3N0YXJ0X2FkZHIoaWQsIGRhdGEpOworCQkJCXJlZ2lvbi5sZW4gPSBwbWVtX2xlbihpZCwgZGF0YSk7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICJwbWVtOiByZXF1ZXN0IGZvciBwaHlzaWNhbCBhZGRyZXNzIG9mIHBtZW0gcmVnaW9uICIKKwkJCQkJImZyb20gcHJvY2VzcyAlZC5cbiIsIGN1cnJlbnQtPnBpZCk7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJlZ2lvbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBQTUVNX01BUDoKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVnaW9uLCAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCQlzaXplb2Yoc3RydWN0IHBtZW1fcmVnaW9uKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlyZXR1cm4gcG1lbV9yZW1hcCgmcmVnaW9uLCBmaWxlLCBQTUVNX01BUCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQTUVNX1VOTUFQOgorCQl7CisJCQlzdHJ1Y3QgcG1lbV9yZWdpb24gcmVnaW9uOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZyZWdpb24sICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSAoc3RydWN0IHBtZW1fZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkJCXJldHVybiBwbWVtX3JlbWFwKCZyZWdpb24sIGZpbGUsIFBNRU1fVU5NQVApOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFBNRU1fR0VUX1NJWkU6CisJCXsKKwkJCXN0cnVjdCBwbWVtX3JlZ2lvbiByZWdpb247CisJCQlETE9HKCJnZXRfc2l6ZVxuIik7CisJCQlwbWVtX2dldF9zaXplKCZyZWdpb24sIGZpbGUpOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZyZWdpb24sCisJCQkJCQlzaXplb2Yoc3RydWN0IHBtZW1fcmVnaW9uKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUE1FTV9HRVRfVE9UQUxfU0laRToKKwkJeworCQkJc3RydWN0IHBtZW1fcmVnaW9uIHJlZ2lvbjsKKwkJCURMT0coImdldCB0b3RhbCBzaXplXG4iKTsKKwkJCXJlZ2lvbi5vZmZzZXQgPSAwOworCQkJZ2V0X2lkKGZpbGUpOworCQkJcmVnaW9uLmxlbiA9IHBtZW1baWRdLnNpemU7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnJlZ2lvbiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcG1lbV9yZWdpb24pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBQTUVNX0FMTE9DQVRFOgorCQl7CisJCQlpZiAoaGFzX2FsbG9jYXRpb24oZmlsZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlkYXRhID0gKHN0cnVjdCBwbWVtX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlkYXRhLT5pbmRleCA9IHBtZW1fYWxsb2NhdGUoaWQsIGFyZyk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUE1FTV9DT05ORUNUOgorCQlETE9HKCJjb25uZWN0XG4iKTsKKwkJcmV0dXJuIHBtZW1fY29ubmVjdChhcmcsIGZpbGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAocG1lbVtpZF0uaW9jdGwpCisJCQlyZXR1cm4gcG1lbVtpZF0uaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBQTUVNX0RFQlVHCitzdGF0aWMgc3NpemVfdCBkZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlYnVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsdCwgKmVsdDI7CisJc3RydWN0IHBtZW1fZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSAqcmVnaW9uX25vZGU7CisJaW50IGlkID0gKGludClmaWxlLT5wcml2YXRlX2RhdGE7CisJY29uc3QgaW50IGRlYnVnX2J1Zm1heCA9IDQwOTY7CisJc3RhdGljIGNoYXIgYnVmZmVyWzQwOTZdOworCWludCBuID0gMDsKKworCURMT0coImRlYnVnIG9wZW5cbiIpOworCW4gPSBzY25wcmludGYoYnVmZmVyLCBkZWJ1Z19idWZtYXgsCisJCSAgICAgICJwaWQgIzogbWFwcGVkIHJlZ2lvbnMgKG9mZnNldCwgbGVuKSAob2Zmc2V0LGxlbikuLi5cbiIpOworCisJZG93bigmcG1lbVtpZF0uZGF0YV9saXN0X3NlbSk7CisJbGlzdF9mb3JfZWFjaChlbHQsICZwbWVtW2lkXS5kYXRhX2xpc3QpIHsKKwkJZGF0YSA9IGxpc3RfZW50cnkoZWx0LCBzdHJ1Y3QgcG1lbV9kYXRhLCBsaXN0KTsKKwkJZG93bl9yZWFkKCZkYXRhLT5zZW0pOworCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLCAicGlkICV1OiIsCisJCQkJZGF0YS0+cGlkKTsKKwkJbGlzdF9mb3JfZWFjaChlbHQyLCAmZGF0YS0+cmVnaW9uX2xpc3QpIHsKKwkJCXJlZ2lvbl9ub2RlID0gbGlzdF9lbnRyeShlbHQyLCBzdHJ1Y3QgcG1lbV9yZWdpb25fbm9kZSwKKwkJCQkgICAgICBsaXN0KTsKKwkJCW4gKz0gc2NucHJpbnRmKGJ1ZmZlciArIG4sIGRlYnVnX2J1Zm1heCAtIG4sCisJCQkJCSIoJWx4LCVseCkgIiwKKwkJCQkJcmVnaW9uX25vZGUtPnJlZ2lvbi5vZmZzZXQsCisJCQkJCXJlZ2lvbl9ub2RlLT5yZWdpb24ubGVuKTsKKwkJfQorCQluICs9IHNjbnByaW50ZihidWZmZXIgKyBuLCBkZWJ1Z19idWZtYXggLSBuLCAiXG4iKTsKKwkJdXBfcmVhZCgmZGF0YS0+c2VtKTsKKwl9CisJdXAoJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCisJbisrOworCWJ1ZmZlcltuXSA9IDA7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGJ1ZmZlciwgbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2ZvcHMgPSB7CisJLnJlYWQgPSBkZWJ1Z19yZWFkLAorCS5vcGVuID0gZGVidWdfb3BlbiwKK307CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBwbWVtX2RldiA9IHsKKwkubmFtZSA9ICJwbWVtIiwKKwkuZm9wcyA9ICZwbWVtX2ZvcHMsCit9OworI2VuZGlmCisKK2ludCBwbWVtX3NldHVwKHN0cnVjdCBhbmRyb2lkX3BtZW1fcGxhdGZvcm1fZGF0YSAqcGRhdGEsCisJICAgICAgIGxvbmcgKCppb2N0bCkoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKSwKKwkgICAgICAgaW50ICgqcmVsZWFzZSkoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopKQoreworCWludCBlcnIgPSAwOworCWludCBpLCBpbmRleCA9IDA7CisJaW50IGlkID0gaWRfY291bnQ7CisJaWRfY291bnQrKzsKKworCXBtZW1baWRdLm5vX2FsbG9jYXRvciA9IHBkYXRhLT5ub19hbGxvY2F0b3I7CisJcG1lbVtpZF0uY2FjaGVkID0gcGRhdGEtPmNhY2hlZDsKKwlwbWVtW2lkXS5idWZmZXJlZCA9IHBkYXRhLT5idWZmZXJlZDsKKwlwbWVtW2lkXS5iYXNlID0gcGRhdGEtPnN0YXJ0OworCXBtZW1baWRdLnNpemUgPSBwZGF0YS0+c2l6ZTsKKwlwbWVtW2lkXS5pb2N0bCA9IGlvY3RsOworCXBtZW1baWRdLnJlbGVhc2UgPSByZWxlYXNlOworCWluaXRfcndzZW0oJnBtZW1baWRdLmJpdG1hcF9zZW0pOworCWluaXRfTVVURVgoJnBtZW1baWRdLmRhdGFfbGlzdF9zZW0pOworCUlOSVRfTElTVF9IRUFEKCZwbWVtW2lkXS5kYXRhX2xpc3QpOworCXBtZW1baWRdLmRldi5uYW1lID0gcGRhdGEtPm5hbWU7CisJcG1lbVtpZF0uZGV2Lm1pbm9yID0gaWQ7CisJcG1lbVtpZF0uZGV2LmZvcHMgPSAmcG1lbV9mb3BzOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlZCBpbml0XG4iLCBwZGF0YS0+bmFtZSwgcGRhdGEtPmNhY2hlZCk7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZwbWVtW2lkXS5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byByZWdpc3RlciBwbWVtIGRyaXZlciFcbiIpOworCQlnb3RvIGVycl9jYW50X3JlZ2lzdGVyX2RldmljZTsKKwl9CisJcG1lbVtpZF0ubnVtX2VudHJpZXMgPSBwbWVtW2lkXS5zaXplIC8gUE1FTV9NSU5fQUxMT0M7CisKKwlwbWVtW2lkXS5iaXRtYXAgPSBrbWFsbG9jKHBtZW1baWRdLm51bV9lbnRyaWVzICoKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcG1lbV9iaXRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbWVtW2lkXS5iaXRtYXApCisJCWdvdG8gZXJyX25vX21lbV9mb3JfbWV0YWRhdGE7CisKKwltZW1zZXQocG1lbVtpZF0uYml0bWFwLCAwLCBzaXplb2Yoc3RydWN0IHBtZW1fYml0cykgKgorCQkJCQkgIHBtZW1baWRdLm51bV9lbnRyaWVzKTsKKworCWZvciAoaSA9IHNpemVvZihwbWVtW2lkXS5udW1fZW50cmllcykgKiA4IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKChwbWVtW2lkXS5udW1fZW50cmllcykgJiAgMTw8aSkgeworCQkJUE1FTV9PUkRFUihpZCwgaW5kZXgpID0gaTsKKwkJCWluZGV4ID0gUE1FTV9ORVhUX0lOREVYKGlkLCBpbmRleCk7CisJCX0KKwl9CisKKwlpZiAocG1lbVtpZF0uY2FjaGVkKQorCQlwbWVtW2lkXS52YmFzZSA9IGlvcmVtYXBfY2FjaGVkKHBtZW1baWRdLmJhc2UsCisJCQkJCQlwbWVtW2lkXS5zaXplKTsKKyNpZmRlZiBpb3JlbWFwX2V4dF9idWZmZXJlZAorCWVsc2UgaWYgKHBtZW1baWRdLmJ1ZmZlcmVkKQorCQlwbWVtW2lkXS52YmFzZSA9IGlvcmVtYXBfZXh0X2J1ZmZlcmVkKHBtZW1baWRdLmJhc2UsCisJCQkJCQkgICAgICBwbWVtW2lkXS5zaXplKTsKKyNlbmRpZgorCWVsc2UKKwkJcG1lbVtpZF0udmJhc2UgPSBpb3JlbWFwKHBtZW1baWRdLmJhc2UsIHBtZW1baWRdLnNpemUpOworCisJaWYgKHBtZW1baWRdLnZiYXNlID09IDApCisJCWdvdG8gZXJyb3JfY2FudF9yZW1hcDsKKworCXBtZW1baWRdLmdhcmJhZ2VfcGZuID0gcGFnZV90b19wZm4oYWxsb2NfcGFnZShHRlBfS0VSTkVMKSk7CisJaWYgKHBtZW1baWRdLm5vX2FsbG9jYXRvcikKKwkJcG1lbVtpZF0uYWxsb2NhdGVkID0gMDsKKworI2lmIFBNRU1fREVCVUcKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKHBkYXRhLT5uYW1lLCBTX0lGUkVHIHwgU19JUlVHTywgTlVMTCwgKHZvaWQgKilpZCwKKwkJCSAgICAmZGVidWdfZm9wcyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK2Vycm9yX2NhbnRfcmVtYXA6CisJa2ZyZWUocG1lbVtpZF0uYml0bWFwKTsKK2Vycl9ub19tZW1fZm9yX21ldGFkYXRhOgorCW1pc2NfZGVyZWdpc3RlcigmcG1lbVtpZF0uZGV2KTsKK2Vycl9jYW50X3JlZ2lzdGVyX2RldmljZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcG1lbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhbmRyb2lkX3BtZW1fcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlpZiAoIXBkZXYgfHwgIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gcHJvYmUgcG1lbSFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJcmV0dXJuIHBtZW1fc2V0dXAocGRhdGEsIE5VTEwsIE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgcG1lbV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaWQgPSBwZGV2LT5pZDsKKwlfX2ZyZWVfcGFnZShwZm5fdG9fcGFnZShwbWVtW2lkXS5nYXJiYWdlX3BmbikpOworCW1pc2NfZGVyZWdpc3RlcigmcG1lbVtpZF0uZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG1lbV9kcml2ZXIgPSB7CisJLnByb2JlID0gcG1lbV9wcm9iZSwKKwkucmVtb3ZlID0gcG1lbV9yZW1vdmUsCisJLmRyaXZlciA9IHsgLm5hbWUgPSAiYW5kcm9pZF9wbWVtIiB9Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHBtZW1faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBtZW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBtZW1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZwbWVtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBtZW1faW5pdCk7Cittb2R1bGVfZXhpdChwbWVtX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYWRzcC5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3Fkc3A1L2Fkc3AuYwppbmRleCBkMDk2NDU2Li45MDY5NTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYWRzcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hZHNwLmMKQEAgLTMyLDE2ICszMiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KIAotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgYWRzcF93YWtlX2xvY2s7CiBzdGF0aWMgaW5saW5lIHZvaWQgcHJldmVudF9zdXNwZW5kKHZvaWQpCiB7Ci0Jd2FrZV9sb2NrKCZhZHNwX3dha2VfbG9jayk7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWxsb3dfc3VzcGVuZCh2b2lkKQogewotCXdha2VfdW5sb2NrKCZhZHNwX3dha2VfbG9jayk7CiB9CiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMTA0Niw3ICsxMDQyLDYgQEAKIAogCXByX2luZm8oImFkc3A6IHByb2JlXG4iKTsKIAotCXdha2VfbG9ja19pbml0KCZhZHNwX3dha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJhZHNwIik7CiAjaWYgQ09ORklHX01TTV9BTVNTX1ZFUlNJT04gPj0gNjM1MAogCWFkc3BfaW5mby5pbml0X2luZm9fcHRyID0ga3phbGxvYygKIAkJKHNpemVvZihzdHJ1Y3QgYWRzcF9ydG9zX21wX210b2FfaW5pdF9pbmZvX3R5cGUpKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYXVkaW9fb3V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vcWRzcDUvYXVkaW9fb3V0LmMKaW5kZXggZDFhZGNmNi4uZGY4N2NhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3Fkc3A1L2F1ZGlvX291dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9xZHNwNS9hdWRpb19vdXQuYwpAQCAtMzgsOCArMzgsNiBAQAogI2luY2x1ZGUgPG1hY2gvcWRzcDUvcWRzcDVhdWRwcGNtZGkuaD4KICNpbmNsdWRlIDxtYWNoL3Fkc3A1L3Fkc3A1YXVkcHBtc2cuaD4KIAotI2luY2x1ZGUgPG1hY2gvaHRjX3B3cnNpbmsuaD4KLQogI2luY2x1ZGUgImV2bG9nLmgiCiAKICNkZWZpbmUgTE9HX0FVRElPX0VWRU5UUyAxCkBAIC0yNjAsNyArMjU4LDYgQEAKIAl9CiAKIAlhdWRpby0+ZW5hYmxlZCA9IDE7Ci0JaHRjX3B3cnNpbmtfc2V0KFBXUlNJTktfQVVESU8sIDEwMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY5NSw3ICs2OTIsNiBAQAogCWF1ZGlvX2ZsdXNoKGF1ZGlvKTsKIAlhdWRpby0+b3BlbmVkID0gMDsKIAltdXRleF91bmxvY2soJmF1ZGlvLT5sb2NrKTsKLQlodGNfcHdyc2lua19zZXQoUFdSU0lOS19BVURJTywgMCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3FtaS5jIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMKaW5kZXggZDRlN2Q4OC4uNjg3ZGIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcW1pLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX3NtZC5oPgpAQCAtNzQsNyArNzMsNiBAQAogCiAJc21kX2NoYW5uZWxfdCAqY2g7CiAJY29uc3QgY2hhciAqY2hfbmFtZTsKLQlzdHJ1Y3Qgd2FrZV9sb2NrIHdha2VfbG9jazsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCBvcGVuX3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJlYWRfd29yazsKQEAgLTkwLDcgKzg4LDYgQEAKIAltdXRleF9pbml0KCZjdHh0LT5sb2NrKTsKIAlJTklUX1dPUksoJmN0eHQtPnJlYWRfd29yaywgcW1pX3JlYWRfd29yayk7CiAJSU5JVF9XT1JLKCZjdHh0LT5vcGVuX3dvcmssIHFtaV9vcGVuX3dvcmspOwotCXdha2VfbG9ja19pbml0KCZjdHh0LT53YWtlX2xvY2ssIFdBS0VfTE9DS19TVVNQRU5ELCBjdHh0LT5taXNjLm5hbWUpOwogCWN0eHQtPmN0bF90eG5faWQgPSAxOwogCWN0eHQtPndkc190eG5faWQgPSAxOwogCWN0eHQtPndkc19idXN5ID0gMTsKQEAgLTQ1NCw3ICs0NTEsNiBAQAogCQlicmVhazsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjdHh0LT5sb2NrKTsKLQogCXdha2VfdXAoJnFtaV93YWl0X3F1ZXVlKTsKIH0KIApAQCAtNTA5LDcgKzUwNSw2IEBACiAJCWludCBzejsKIAkJc3ogPSBzbWRfY3VyX3BhY2tldF9zaXplKGN0eHQtPmNoKTsKIAkJaWYgKChzeiA+IDApICYmIChzeiA8PSBzbWRfcmVhZF9hdmFpbChjdHh0LT5jaCkpKSB7Ci0JCQl3YWtlX2xvY2tfdGltZW91dCgmY3R4dC0+d2FrZV9sb2NrLCBIWiAvIDIpOwogCQkJcXVldWVfd29yayhxbWlfd3EsICZjdHh0LT5yZWFkX3dvcmspOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfcnBjcm91dGVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYwppbmRleCBkNGE0YTg4Li41YWMyY2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3dha2Vsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC05Niw3ICs5NSw2IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNtZF9sb2NrKTsKIAogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpycGNyb3V0ZXJfd29ya3F1ZXVlOwotc3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgcnBjcm91dGVyX3dha2VfbG9jazsKIHN0YXRpYyBpbnQgcnBjcm91dGVyX25lZWRfbGVuOwogCiBzdGF0aWMgYXRvbWljX3QgbmV4dF94aWQgPSBBVE9NSUNfSU5JVCgxKTsKQEAgLTI5MCw3ICsyODgsNiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVwdC0+d2FpdF9xKTsKIAlJTklUX0xJU1RfSEVBRCgmZXB0LT5yZWFkX3EpOwogCXNwaW5fbG9ja19pbml0KCZlcHQtPnJlYWRfcV9sb2NrKTsKLQl3YWtlX2xvY2tfaW5pdCgmZXB0LT5yZWFkX3Ffd2FrZV9sb2NrLCBXQUtFX0xPQ0tfU1VTUEVORCwgInJwY19yZWFkIik7CiAJSU5JVF9MSVNUX0hFQUQoJmVwdC0+aW5jb21wbGV0ZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWxfZW5kcG9pbnRzX2xvY2ssIGZsYWdzKTsKQEAgLTMxMyw3ICszMTAsNiBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCXdha2VfbG9ja19kZXN0cm95KCZlcHQtPnJlYWRfcV93YWtlX2xvY2spOwogCWxpc3RfZGVsKCZlcHQtPmxpc3QpOwogCWtmcmVlKGVwdCk7CiAJcmV0dXJuIDA7CkBAIC01NDAsOCArNTM2LDYgQEAKIAlpZiAoZXZlbnQgIT0gU01EX0VWRU5UX0RBVEEpCiAJCXJldHVybjsKIAotCWlmIChzbWRfcmVhZF9hdmFpbChzbWRfY2hhbm5lbCkgPj0gcnBjcm91dGVyX25lZWRfbGVuKQotCQl3YWtlX2xvY2soJnJwY3JvdXRlcl93YWtlX2xvY2spOwogCXdha2VfdXAoJnNtZF93YWl0KTsKIH0KIApAQCAtNTc2LDcgKzU3MCw2IEBACiAJCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcnBjcm91dGVyX25lZWRfbGVuID0gbGVuOwotCQl3YWtlX3VubG9jaygmcnBjcm91dGVyX3dha2VfbG9jayk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtZF9sb2NrLCBmbGFncyk7CiAKIC8vCQlwcmludGsoInJyX3JlYWQ6IHdhaXRpbmcgKCVkKVxuIiwgbGVuKTsKQEAgLTY3Niw3ICs2NjksNiBAQAogCiBwYWNrZXRfY29tcGxldGU6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwdC0+cmVhZF9xX2xvY2ssIGZsYWdzKTsKLQl3YWtlX2xvY2soJmVwdC0+cmVhZF9xX3dha2VfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmcGt0LT5saXN0LCAmZXB0LT5yZWFkX3EpOwogCXdha2VfdXAoJmVwdC0+d2FpdF9xKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcHQtPnJlYWRfcV9sb2NrLCBmbGFncyk7CkBAIC02OTksNyArNjkxLDYgQEAKIGZhaWxfaW86CiBmYWlsX2RhdGE6CiAJcHJpbnRrKEtFUk5fRVJSICJycGNfcm91dGVyIGhhcyBkaWVkXG4iKTsKLQl3YWtlX3VubG9jaygmcnBjcm91dGVyX3dha2VfbG9jayk7CiB9CiAKIHZvaWQgbXNtX3JwY19zZXR1cF9yZXEoc3RydWN0IHJwY19yZXF1ZXN0X2hkciAqaGRyLCB1aW50MzJfdCBwcm9nLApAQCAtMTA2MSw4ICsxMDUyLDYgQEAKIAkJcmV0dXJuIC1FVE9PU01BTEw7CiAJfQogCWxpc3RfZGVsKCZwa3QtPmxpc3QpOwotCWlmIChsaXN0X2VtcHR5KCZlcHQtPnJlYWRfcSkpCi0JCXdha2VfdW5sb2NrKCZlcHQtPnJlYWRfcV93YWtlX2xvY2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwdC0+cmVhZF9xX2xvY2ssIGZsYWdzKTsKIAogCXJjID0gcGt0LT5sZW5ndGg7CkBAIC0xMjI5LDcgKzEyMTgsNiBAQAogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbmV3c2VydmVyX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNtZF93YWl0KTsKLQl3YWtlX2xvY2tfaW5pdCgmcnBjcm91dGVyX3dha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsICJTTURfUlBDQ0FMTCIpOwogCiAJcnBjcm91dGVyX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJycGNyb3V0ZXIiKTsKIAlpZiAoIXJwY3JvdXRlcl93b3JrcXVldWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF9ycGNyb3V0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oCmluZGV4IGE3NDE2YTIuLjg2YWI5OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zbWQvc21kX3JwY3JvdXRlci5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWtlbG9jay5oPgogCiAjaW5jbHVkZSA8bWFjaC9tc21fc21kLmg+CiAjaW5jbHVkZSA8bWFjaC9tc21fcnBjcm91dGVyLmg+CkBAIC0xNDQsNyArMTQzLDYgQEAKIAkvKiBjb21wbGV0ZSBwYWNrZXRzIHdhaXRpbmcgdG8gYmUgcmVhZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgcmVhZF9xOwogCXNwaW5sb2NrX3QgcmVhZF9xX2xvY2s7Ci0Jc3RydWN0IHdha2VfbG9jayByZWFkX3Ffd2FrZV9sb2NrOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsKIAl1bnNpZ25lZCBmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RyZWFtL3NtZC9zbWRfdHR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYwppbmRleCAyZWRkOWQxLi5mNDA5NDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc21kL3NtZF90dHkuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FrZWxvY2suaD4KIAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KQEAgLTM0LDcgKzMzLDYgQEAKIHN0cnVjdCBzbWRfdHR5X2luZm8gewogCXNtZF9jaGFubmVsX3QgKmNoOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RydWN0IHdha2VfbG9jayB3YWtlX2xvY2s7CiAJaW50IG9wZW5fY291bnQ7CiB9OwogCkBAIC02OSw3ICs2Nyw2IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIk9PUFMgLSBzbWRfdHR5X2J1ZmZlciBtaXNtYXRjaD8hIik7CiAJCX0KIAotCQl3YWtlX2xvY2tfdGltZW91dCgmaW5mby0+d2FrZV9sb2NrLCBIWiAvIDIpOwogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCX0KIApAQCAtOTUsNyArOTIsNiBAQAogCWluZm8gPSBzbWRfdHR5ICsgbjsKIAogCW11dGV4X2xvY2soJnNtZF90dHlfbG9jayk7Ci0Jd2FrZV9sb2NrX2luaXQoJmluZm8tPndha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQsIG5hbWUpOwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwogCiAJaWYgKGluZm8tPm9wZW5fY291bnQrKyA9PSAwKSB7CkBAIC0xMjIsNyArMTE4LDYgQEAKIAlpZiAoLS1pbmZvLT5vcGVuX2NvdW50ID09IDApIHsKIAkJaW5mby0+dHR5ID0gMDsKIAkJdHR5LT5kcml2ZXJfZGF0YSA9IDA7Ci0JCXdha2VfbG9ja19kZXN0cm95KCZpbmZvLT53YWtlX2xvY2spOwogCQlpZiAoaW5mby0+Y2gpIHsKIAkJCXNtZF9jbG9zZShpbmZvLT5jaCk7CiAJCQlpbmZvLT5jaCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHJlYW0vc3luYXB0aWNzX2kyY19ybWkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jCmluZGV4IGFlNjk2ZDMuLjRkZTZiYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kcmVhbS9zeW5hcHRpY3NfaTJjX3JtaS5jCkBAIC0zNzksNiArMzc5LDEyIEBACiAJCWdvdG8gZXJyX2NoZWNrX2Z1bmN0aW9uYWxpdHlfZmFpbGVkOwogCX0KIAorCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKSB7CisJCXByX2Vycigic3luYXB0aWNzX3RzX3Byb2JlOiBuZWVkIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2NoZWNrX2Z1bmN0aW9uYWxpdHlfZmFpbGVkOworCX0KKwogCXRzID0ga3phbGxvYyhzaXplb2YoKnRzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRzID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvY3J5cHRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2NyeXB0by5jCmluZGV4IDcyNTBmOTAuLjM1MTI5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvY3J5cHRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9jcnlwdG8uYwpAQCAtNjQsNyArNjQsOCBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmRzdF9pbml0X2NpcGhlcihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCwgdTggKmtleSkKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmRzdF9pbml0X2NpcGhlcihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCwKKwkJdTggKmtleSkKIHsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKmNpcGhlcjsKQEAgLTEwNSw3ICsxMDYsNyBAQAogewogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpPTA7IGk8ZS0+cGFnZV9udW07ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgZS0+cGFnZV9udW07ICsraSkKIAkJX19mcmVlX3BhZ2UoZS0+cGFnZXNbaV0pOwogCWtmcmVlKGUtPnBhZ2VzKTsKIH0KQEAgLTExOCw3ICsxMTksNyBAQAogCWlmICghZS0+cGFnZXMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpPTA7IGk8bnVtOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKIAkJZS0+cGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoIWUtPnBhZ2VzW2ldKQogCQkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZXM7CkBAIC0xMzksNyArMTQwLDggQEAKICAqIEluaXRpYWxpemUgY3J5cHRvIGVuZ2luZSBmb3IgZ2l2ZW4gbm9kZS4KICAqIFNldHVwIGNpcGhlci9oYXNoLCBrZXlzLCBwb29sIG9mIHRocmVhZHMgYW5kIHByaXZhdGUgZGF0YS4KICAqLwotc3RhdGljIGludCBkc3RfY3J5cHRvX2VuZ2luZV9pbml0KHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwgc3RydWN0IGRzdF9ub2RlICpuKQorc3RhdGljIGludCBkc3RfY3J5cHRvX2VuZ2luZV9pbml0KHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKKwkJc3RydWN0IGRzdF9ub2RlICpuKQogewogCWludCBlcnI7CiAJc3RydWN0IGRzdF9jcnlwdG9fY3RsICpjdGwgPSAmbi0+Y3J5cHRvOwpAQCAtMTk4LDggKzIwMCw3IEBACiAvKgogICogV2FpdGluZyBmb3IgY2lwaGVyIHByb2Nlc3NpbmcgdG8gYmUgY29tcGxldGVkLgogICovCi1zdHJ1Y3QgZHN0X2NyeXB0b19jb21wbGV0aW9uCi17CitzdHJ1Y3QgZHN0X2NyeXB0b19jb21wbGV0aW9uIHsKIAlzdHJ1Y3QgY29tcGxldGlvbgkJY29tcGxldGU7CiAJaW50CQkJCWVycm9yOwogfTsKQEAgLTIzNywxNyArMjM4LDE3IEBACiAJCWVyciA9IGNyeXB0b19hYmxrY2lwaGVyX2RlY3J5cHQocmVxKTsKIAogCXN3aXRjaCAoZXJyKSB7Ci0JCWNhc2UgLUVJTlBST0dSRVNTOgotCQljYXNlIC1FQlVTWToKLQkJCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjLmNvbXBsZXRlLAotCQkJCQl0aW1lb3V0KTsKLQkJCWlmICghZXJyKQotCQkJCWVyciA9IC1FVElNRURPVVQ7Ci0JCQllbHNlCi0JCQkJZXJyID0gYy5lcnJvcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJY2FzZSAtRUlOUFJPR1JFU1M6CisJY2FzZSAtRUJVU1k6CisJCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZjLmNvbXBsZXRlLAorCQkJCXRpbWVvdXQpOworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FVElNRURPVVQ7CisJCWVsc2UKKwkJCWVyciA9IGMuZXJyb3I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC0yNjMsNyArMjY0LDcgQEAKICAqIHRlbXBvcmFyeSBzdG9yYWdlLCB3aGljaCBpcyB0aGVuIGJlaW5nIHNlbnQgdG8gdGhlIHJlbW90ZSBwZWVyLgogICovCiBzdGF0aWMgaW50IGRzdF90cmFuc19pdGVyX291dChzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKLQkJaW50ICgqIGl0ZXJhdG9yKSAoc3RydWN0IGRzdF9jcnlwdG9fZW5naW5lICplLAorCQlpbnQgKCppdGVyYXRvcikgKHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKIAkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAogCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMpKQogewpAQCAtMjg2LDcgKzI4Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZHN0X3RyYW5zX2l0ZXJfaW4oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCi0JCWludCAoKiBpdGVyYXRvcikgKHN0cnVjdCBkc3RfY3J5cHRvX2VuZ2luZSAqZSwKKwkJaW50ICgqaXRlcmF0b3IpIChzdHJ1Y3QgZHN0X2NyeXB0b19lbmdpbmUgKmUsCiAJCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKIAkJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjKSkKIHsKQEAgLTQxMSw5ICs0MTIsOSBAQAogICogSW5pdGlhbGl6ZSBjcnlwdG8gZW5naW5lIGZvciBnaXZlbiBub2RlOiBzdG9yZSBrZXlzLCBjcmVhdGUgcG9vbAogICogb2YgdGhyZWFkcywgaW5pdGlhbGl6ZSBlYWNoIG9uZS4KICAqCi0gKiBFYWNoIHRocmVhZCBoYXMgdW5pcXVlIElELCBidXQgMCBhbmQgMSBhcmUgcmVzZXJ2ZWQgZm9yIHJlY2VpdmluZyBhbmQgYWNjZXB0aW5nCi0gKiB0aHJlYWRzIChpZiBleHBvcnQgbm9kZSksIHNvIElEcyBjb3VsZCBzdGFydCBmcm9tIDIsIGJ1dCBzdGFydGluZyB0aGVtCi0gKiBmcm9tIDEwIGFsbG93cyBlYXNpbHkgdW5kZXJzdGFuZCB3aGF0IHRoaXMgdGhyZWFkIGlzIGZvci4KKyAqIEVhY2ggdGhyZWFkIGhhcyB1bmlxdWUgSUQsIGJ1dCAwIGFuZCAxIGFyZSByZXNlcnZlZCBmb3IgcmVjZWl2aW5nIGFuZAorICogYWNjZXB0aW5nIHRocmVhZHMgKGlmIGV4cG9ydCBub2RlKSwgc28gSURzIGNvdWxkIHN0YXJ0IGZyb20gMiwgYnV0IHN0YXJ0aW5nCisgKiB0aGVtIGZyb20gMTAgYWxsb3dzIGVhc2lseSB1bmRlcnN0YW5kIHdoYXQgdGhpcyB0aHJlYWQgaXMgZm9yLgogICovCiBpbnQgZHN0X25vZGVfY3J5cHRvX2luaXQoc3RydWN0IGRzdF9ub2RlICpuLCBzdHJ1Y3QgZHN0X2NyeXB0b19jdGwgKmN0bCkKIHsKQEAgLTQzNiwxMCArNDM3LDEwIEBACiAJfQogCW1lbWNweSgmbi0+Y3J5cHRvLCBjdGwsIHNpemVvZihzdHJ1Y3QgZHN0X2NyeXB0b19jdGwpKTsKIAotCWZvciAoaT0wOyBpPGN0bC0+dGhyZWFkX251bTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGN0bC0+dGhyZWFkX251bTsgKytpKSB7CiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLWNyeXB0by0lZCIsIG4tPm5hbWUsIGkpOwogCQkvKiBVbmlxdWUgaWRzLi4uICovCi0JCWVyciA9IHRocmVhZF9wb29sX2FkZF93b3JrZXIobi0+cG9vbCwgbmFtZSwgaSsxMCwKKwkJZXJyID0gdGhyZWFkX3Bvb2xfYWRkX3dvcmtlcihuLT5wb29sLCBuYW1lLCBpICsgMTAsCiAJCQlkc3RfY3J5cHRvX3RocmVhZF9pbml0LCBkc3RfY3J5cHRvX3RocmVhZF9jbGVhbnVwLCBuKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX291dF9mcmVlX3RocmVhZHM7CkBAIC00OTYsOCArNDk3LDggQEAKIAkJCQlidi0+YnZfbGVuLCBidi0+YnZfb2Zmc2V0KTsKIAogCQlwID0ga21hcChidi0+YnZfcGFnZSkgKyBidi0+YnZfb2Zmc2V0OwotCQlmb3IgKGk9MDsgaTxidi0+YnZfbGVuOyArK2kpCi0JCQlwcmludGsoIiUwMnggIiwgcFtpXSk7CisJCWZvciAoaSA9IDA7IGkgPCBidi0+YnZfbGVuOyArK2kpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAiLCBwW2ldKTsKIAkJa3VubWFwKGJ2LT5idl9wYWdlKTsKIAkJcHJpbnRrKCJcbiIpOwogCX0KQEAgLTUzMiw3ICs1MzMsNyBAQAogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiaW86ICVsbHUvJXUsIHJ3OiAlbHUsIGhhc2g6ICIsCiAJCQkJX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsCiAJCQkJYmlvLT5iaV9zaXplLCBiaW9fZGF0YV9kaXIoYmlvKSk7Ci0JCQlmb3IgKGk9MDsgaTxjcnlwdG9faGFzaF9kaWdlc3RzaXplKGUtPmhhc2gpOyArK2kpCisJCQlmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKQogCQkJCQlwcmludGsoIiUwMnggIiwgaGFzaFtpXSk7CiAJCQlwcmludGsoIlxuIik7CiAJCX0KQEAgLTU3Miw5ICs1NzMsOSBAQAogCQkJdW5zaWduZWQgaW50IGk7CiAKIAkJCXByaW50aygiLCByZWN2L2NhbGM6ICIpOwotCQkJZm9yIChpPTA7IGk8Y3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShlLT5oYXNoKTsgKytpKQogCQkJCXByaW50aygiJTAyeC8lMDJ4ICIsIHJlY3ZfaGFzaFtpXSwgaGFzaFtpXSk7Ci0JCQl9CisKIAkJfQogCQlwcmludGsoIlxuIik7CiAjZW5kaWYKQEAgLTY4MCw4ICs2ODEsOSBAQAogCXN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKnAgPSBiaW8tPmJpX3ByaXZhdGU7CiAJaW50IGVycjsKIAotCWRwcmludGsoIiVzOiBlOiAlcCwgZGF0YTogJXAsIGJpbzogJWxsdS8ldSwgZGlyOiAlbHUuXG4iLCBfX2Z1bmNfXywKLQkJZSwgZS0+ZGF0YSwgKHU2NCliaW8tPmJpX3NlY3RvciwgYmlvLT5iaV9zaXplLCBiaW9fZGF0YV9kaXIoYmlvKSk7CisJZHByaW50aygiJXM6IGU6ICVwLCBkYXRhOiAlcCwgYmlvOiAlbGx1LyV1LCBkaXI6ICVsdS5cbiIsCisJCQlfX2Z1bmNfXywgZSwgZS0+ZGF0YSwgKHU2NCliaW8tPmJpX3NlY3RvciwKKwkJCWJpby0+Ymlfc2l6ZSwgYmlvX2RhdGFfZGlyKGJpbykpOwogCiAJZS0+ZW5jID0gKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpOwogCWUtPml2ID0gcC0+Y21kLmlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2RzdC9kY29yZS5jCmluZGV4IGMyNGU0ZTAuLmZkNWJkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvZGNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2Rjb3JlLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCQkgKiBiaW9fcndfZmxhZ2dlZChiaW8sIEJJT19SV19ESVNDQVJEKSBvbmx5LCB3aGljaCBkb2VzIG5vdAogCQkgKiB3b3JrIGluIHRoaXMgY2FzZS4KIAkJICovCi0JCS8vZXJyID0gLUVPUE5PVFNVUFA7CisJCS8qIGVyciA9IC1FT1BOT1RTVVBQOyAqLwogCQllcnIgPSAwOwogCQlnb3RvIGVuZF9pbzsKIAl9CkBAIC0xOTcsNyArMTk3LDggQEAKIAluLT5kaXNrLT5mb3BzID0gJmRzdF9ibGtfb3BzOwogCW4tPmRpc2stPnF1ZXVlID0gbi0+cXVldWU7CiAJbi0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gbjsKLQlzbnByaW50ZihuLT5kaXNrLT5kaXNrX25hbWUsIHNpemVvZihuLT5kaXNrLT5kaXNrX25hbWUpLCAiZHN0LSVzIiwgbi0+bmFtZSk7CisJc25wcmludGYobi0+ZGlzay0+ZGlza19uYW1lLCBzaXplb2Yobi0+ZGlzay0+ZGlza19uYW1lKSwKKwkJCSJkc3QtJXMiLCBuLT5uYW1lKTsKIAogCXJldHVybiAwOwogCkBAIC0yNDYsNyArMjQ3LDggQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXUuJXUuJXUuJXU6JWRcbiIsCiAJCQlOSVBRVUFEKHNpbi0+c2luX2FkZHIuc19hZGRyKSwgbnRvaHMoc2luLT5zaW5fcG9ydCkpOwogCX0gZWxzZSBpZiAoZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmluZm8tPm5ldC5hZGRyOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCSZpbmZvLT5uZXQuYWRkcjsKIAkJcmV0dXJuIHNwcmludGYoYnVmLAogCQkJIiVwaTY6JWRcbiIsCiAJCQkmc2luLT5zaW42X2FkZHIsIG50b2hzKHNpbi0+c2luNl9wb3J0KSk7CkBAIC0yNjEsNyArMjYzLDcgQEAKIAkJc3ogLT0gc2l6ZTsKIAkJYnVmICs9IHNpemU7CiAKLQkJZm9yIChpPTA7IGk8YWRkcmxlbjsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGRybGVuOyArK2kpIHsKIAkJCWlmIChzeiA8IDMpCiAJCQkJYnJlYWs7CiAKQEAgLTI4Niw3ICsyODgsNyBAQAogewogCWludCBlcnIsIGk7CiAKLQlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRzdF9ub2RlX2F0dHJzKTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHN0X25vZGVfYXR0cnMpOyArK2kpIHsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZuLT5pbmZvLT5kZXZpY2UsCiAJCQkJJmRzdF9ub2RlX2F0dHJzW2ldKTsKIAkJaWYgKGVycikKQEAgLTMwNiw3ICszMDgsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpPTA7IGk8QVJSQVlfU0laRShkc3Rfbm9kZV9hdHRycyk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkc3Rfbm9kZV9hdHRycyk7ICsraSkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZuLT5pbmZvLT5kZXZpY2UsCiAJCQkJJmRzdF9ub2RlX2F0dHJzW2ldKTsKIH0KQEAgLTM1OCw3ICszNjAsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkc3RfaGFzaChjaGFyICpzdHIsIHVuc2lnbmVkIGludCBzaXplKQogewotCXJldHVybiAoamhhc2goc3RyLCBzaXplLCAwKSAlIGRzdF9oYXNodGFibGVfc2l6ZSk7CisJcmV0dXJuIGpoYXNoKHN0ciwgc2l6ZSwgMCkgJSBkc3RfaGFzaHRhYmxlX3NpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGRzdF9ub2RlX3JlbW92ZShzdHJ1Y3QgZHN0X25vZGUgKm4pCkBAIC02NDEsNyArNjQzLDggQEAKIAlkc3Rfbm9kZV9zZXRfc2l6ZShuKTsKIAlhZGRfZGlzayhuLT5kaXNrKTsKIAotCWRwcmludGsoIkRTVDogc3RhcnRlZCByZW1vdGUgbm9kZSAnJXMnLCBtaW5vcjogJWQuXG4iLCBuLT5uYW1lLCBuLT5kaXNrLT5maXJzdF9taW5vcik7CisJZHByaW50aygiRFNUOiBzdGFydGVkIHJlbW90ZSBub2RlICclcycsIG1pbm9yOiAlZC5cbiIsCisJCQluLT5uYW1lLCBuLT5kaXNrLT5maXJzdF9taW5vcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0MCw3ICs3NDMsOCBAQAogCSAqIGNvdW50ZXIgd2lsbCBiZSBlcXVhbCB0byAxKSwKIAkgKiBhbmQgc3Vic2VxdWVudCBkc3Rfbm9kZV9wdXQoKSBjYWxscyB3aWxsIGZyZWUgdGhlIG5vZGUuCiAJICovCi0JZHByaW50aygiJXM6IGdvaW5nIHRvIHNsZWVwIHdpdGggJWQgcmVmY250LlxuIiwgX19mdW5jX18sIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpKTsKKwlkcHJpbnRrKCIlczogZ29pbmcgdG8gc2xlZXAgd2l0aCAlZCByZWZjbnQuXG4iLAorCQkJX19mdW5jX18sIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpKTsKIAl3YWl0X2V2ZW50KG4tPndhaXQsIGF0b21pY19yZWFkKCZuLT5yZWZjbnQpIDw9IDIpOwogCiAJZHN0X25vZGVfcHV0KG4pOwpAQCAtOTIxLDcgKzkyNSw3IEBACiAJaWYgKCFkc3RfaGFzaHRhYmxlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaT0wOyBpPGRzdF9oYXNodGFibGVfc2l6ZTsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBkc3RfaGFzaHRhYmxlX3NpemU7ICsraSkKIAkJSU5JVF9MSVNUX0hFQUQoJmRzdF9oYXNodGFibGVbaV0pOwogCiAJcmV0dXJuIDA7CkBAIC05MzIsNyArOTM2LDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgZHN0X25vZGUgKm4sICp0bXA7CiAKLQlmb3IgKGk9MDsgaTxkc3RfaGFzaHRhYmxlX3NpemU7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBkc3RfaGFzaHRhYmxlX3NpemU7ICsraSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobiwgdG1wLCAmZHN0X2hhc2h0YWJsZVtpXSwgbm9kZV9lbnRyeSkgewogCQkJZHN0X25vZGVfcmVtb3ZlX3VubG9hZChuKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RzdC9leHBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvZXhwb3J0LmMKaW5kZXggNGZiZDg0OC4uYzMyNDIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9leHBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L2V4cG9ydC5jCkBAIC01Myw3ICs1Myw4IEBACiAgKiBpdHMgcGVybWlzc2lvbnMgYXJlIGNoZWNrZWQgaW4gYSBzZWN1cml0eSBhdHRyaWJ1dGVzIGFuZCBzZW50CiAgKiBiYWNrLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGRzdF9jaGVja19wZXJtaXNzaW9ucyhzdHJ1Y3QgZHN0X3N0YXRlICptYWluLCBzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHN0X2NoZWNrX3Blcm1pc3Npb25zKHN0cnVjdCBkc3Rfc3RhdGUgKm1haW4sCisJCXN0cnVjdCBkc3Rfc3RhdGUgKnN0KQogewogCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IG1haW4tPm5vZGU7CiAJc3RydWN0IGRzdF9zZWN1cmUgKnNlbnRyeTsKQEAgLTczLDkgKzc0LDkgQEAKIAogCQkvKgogCQkgKiBUaGlzICcyJyBiZWxvdyBpcyBhIHBvcnQgZmllbGQuIFRoaXMgbWF5IGJlIHZlcnkgd3JvbmcgdG8gZG8KLQkJICogaW4gYXRhbGsgZm9yIGV4YW1wbGUgdGhvdWdoLiBJZiB0aGVyZSB3aWxsIGJlIGFueSBuZWVkIHRvIGV4dGVudAotCQkgKiBwcm90b2NvbCB0byBzb21ldGhpbmcgZWxzZSwgSSBjYW4gY3JlYXRlIHBlci1mYW1pbHkgaGVscGVycyBhbmQKLQkJICogdXNlIHRoZW0gaW5zdGVhZCBvZiB0aGlzIG1lbWNtcC4KKwkJICogaW4gYXRhbGsgZm9yIGV4YW1wbGUgdGhvdWdoLiBJZiB0aGVyZSB3aWxsIGJlIGFueSBuZWVkCisJCSAqIHRvIGV4dGVudCBwcm90b2NvbCB0byBzb21ldGhpbmcgZWxzZSwgSSBjYW4gY3JlYXRlCisJCSAqIHBlci1mYW1pbHkgaGVscGVycyBhbmQgdXNlIHRoZW0gaW5zdGVhZCBvZiB0aGlzIG1lbWNtcC4KIAkJICovCiAJCWlmIChtZW1jbXAocy0+YWRkci5zYV9kYXRhICsgMiwgc2EtPnNhX2RhdGEgKyAyLAogCQkJCQlzYS0+c2FfZGF0YV9sZW4gLSAyKSkKQEAgLTEyNSw4ICsxMjYsOCBAQAogCQkJCSAqIE1hZ2ljIEhaPyBQb2xsaW5nIGNoZWNrIGFib3ZlIGlzIG5vdCBzYWZlIGluCiAJCQkJICogYWxsIGNhc2VzIChsaWtlIHNvY2tldCByZXNldCBpbiBCSCBjb250ZXh0KSwKIAkJCQkgKiBzbyBpdCBpcyBzaW1wbGVyIGp1c3QgdG8gcG9zdHBvbmUgaXQgdG8gdGhlCi0JCQkJICogcHJvY2VzcyBjb250ZXh0IGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHNwZWNpYWwKLQkJCQkgKiBsb2NraW5nIHRoZXJlLgorCQkJCSAqIHByb2Nlc3MgY29udGV4dCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZworCQkJCSAqIHNwZWNpYWwgbG9ja2luZyB0aGVyZS4KIAkJCQkgKi8KIAkJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKIAkJCX0KQEAgLTIwMiw3ICsyMDMsNyBAQAogICogc28gdG8gcGxheSBnb29kIHdpdGggYWxsIGNhc2VzIHdlIGp1c3QgcXVldWUgQklPIGludG8gdGhlIHF1ZXVlCiAgKiBhbmQgd2FrZSB1cCBwcm9jZXNzaW5nIHRocmVhZCwgd2hpY2ggZ2V0cyBjb21wbGV0ZWQgcmVxdWVzdCBhbmQKICAqIHNlbmQgKGVuY3J5cHRpbmcgaWYgbmVlZGVkKSBpdCBiYWNrIHRvIHRoZSBjbGllbnQgKGlmIGl0IHdhcyBhIHJlYWQKLSAqIHJlcXVlc3QpLCBvciBzZW5kcyBiYWNrIHJlcGx5IHRoYXQgd3JpdGluZyBzdWNjZXNmdWxseSBjb21wbGV0ZWQuCisgKiByZXF1ZXN0KSwgb3Igc2VuZHMgYmFjayByZXBseSB0aGF0IHdyaXRpbmcgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KICAqLwogc3RhdGljIGludCBkc3RfZXhwb3J0X3Byb2Nlc3NfcmVxdWVzdF9xdWV1ZShzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKIHsKQEAgLTI3Miw4ICsyNzMsOCBAQAogCQkJaWYgKHApCiAJCQkJYmlvX3B1dChwLT5iaW8pOwogCi0JCQlkcHJpbnRrKCIlczogc3Q6ICVwLCByZWZjbnQ6ICVkLCBsaXN0X2VtcHR5OiAlZCwgcDogJXAuXG4iLAotCQkJCV9fZnVuY19fLCBzdCwgYXRvbWljX3JlYWQoJnN0LT5yZWZjbnQpLAorCQkJZHByaW50aygiJXM6IHN0OiAlcCwgcmVmY250OiAlZCwgbGlzdF9lbXB0eTogJWQsIHA6ICIKKwkJCQkiJXAuXG4iLCBfX2Z1bmNfXywgc3QsIGF0b21pY19yZWFkKCZzdC0+cmVmY250KSwKIAkJCQlsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSwgcCk7CiAJCX0KIAl9CkBAIC0zMDMsOSArMzA0LDkgQEAKIAkJaWYgKCFlcnIpIHsKIAkJCXdoaWxlIChuLT50cmFuc19zY2FuX3RpbWVvdXQpIHsKIAkJCQllcnIgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChzdC0+dGhyZWFkX3dhaXQsCi0JCQkJCQkhbGlzdF9lbXB0eSgmc3QtPnJlcXVlc3RfbGlzdCkgfHwKLQkJCQkJCSFuLT50cmFuc19zY2FuX3RpbWVvdXQgfHwKLQkJCQkJCXN0LT5uZWVkX2V4aXQsCisJCQkJCSFsaXN0X2VtcHR5KCZzdC0+cmVxdWVzdF9saXN0KSB8fAorCQkJCQkhbi0+dHJhbnNfc2Nhbl90aW1lb3V0IHx8CisJCQkJCXN0LT5uZWVkX2V4aXQsCiAJCQkJCUhaKTsKIAogCQkJCWlmICghbi0+dHJhbnNfc2Nhbl90aW1lb3V0IHx8IHN0LT5uZWVkX2V4aXQpCkBAIC0zNDEsOCArMzQyLDkgQEAKIGludCBkc3Rfc3RhcnRfZXhwb3J0KHN0cnVjdCBkc3Rfbm9kZSAqbikKIHsKIAlpZiAobGlzdF9lbXB0eSgmbi0+c2VjdXJpdHlfbGlzdCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJZb3UgYXJlIHRyeWluZyB0byBleHBvcnQgbm9kZSAnJXMnIHdpdGhvdXQgc2VjdXJpdHkgYXR0cmlidXRlcy5cbiIKLQkJCQkiTm8gY2xpZW50cyB3aWxsIGJlIGFsbG93ZWQgdG8gY29ubmVjdC4gRXhpdGluZy5cbiIsIG4tPm5hbWUpOworCQlwcmludGsoS0VSTl9FUlIgIllvdSBhcmUgdHJ5aW5nIHRvIGV4cG9ydCBub2RlICclcycgIgorCQkJCSJ3aXRob3V0IHNlY3VyaXR5IGF0dHJpYnV0ZXMuXG5ObyBjbGllbnRzIHdpbGwgIgorCQkJCSJiZSBhbGxvd2VkIHRvIGNvbm5lY3QuIEV4aXRpbmcuXG4iLCBuLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiBkc3Rfbm9kZV90cmFuc19pbml0KG4sIHNpemVvZihzdHJ1Y3QgZHN0X2V4cG9ydF9wcml2KSk7CkBAIC01NTIsNyArNTU0LDggQEAKIAlpZiAoIWJpbykKIAkJZ290byBlcnJfb3V0X2V4aXQ7CiAKLQlwcml2ID0gKHN0cnVjdCBkc3RfZXhwb3J0X3ByaXYgKikoKCh2b2lkICopYmlvKSAtIHNpemVvZiAoc3RydWN0IGRzdF9leHBvcnRfcHJpdikpOworCXByaXYgPSAoc3RydWN0IGRzdF9leHBvcnRfcHJpdiAqKSgoKHZvaWQgKiliaW8pIC0KKwkJCXNpemVvZiAoc3RydWN0IGRzdF9leHBvcnRfcHJpdikpOwogCiAJcHJpdi0+c3RhdGUgPSBkc3Rfc3RhdGVfZ2V0KHN0KTsKIAlwcml2LT5iaW8gPSBiaW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3N0YXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZHN0L3N0YXRlLmMKaW5kZXggZDA1N2U1Mi4uMDJhMDVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RzdC9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kc3Qvc3RhdGUuYwpAQCAtMzAsMTMgKzMwLDEzIEBACiAgKiBQb2xsaW5nIG1hY2hpbmVyeS4KICAqLwogCi1zdHJ1Y3QgZHN0X3BvbGxfaGVscGVyCi17Ci0JcG9sbF90YWJsZSAJCXB0Oworc3RydWN0IGRzdF9wb2xsX2hlbHBlciB7CisJcG9sbF90YWJsZQkJcHQ7CiAJc3RydWN0IGRzdF9zdGF0ZQkqc3Q7CiB9OwogCi1zdGF0aWMgaW50IGRzdF9xdWV1ZV93YWtlKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3N0YXRpYyBpbnQgZHN0X3F1ZXVlX3dha2Uod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLAorCQlpbnQgc3luYywgdm9pZCAqa2V5KQogewogCXN0cnVjdCBkc3Rfc3RhdGUgKnN0ID0gY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCBkc3Rfc3RhdGUsIHdhaXQpOwogCkBAIC05Miw3ICs5Miw3IEBACiAJbXNnLm1zZ19uYW1lbGVuID0gMDsKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IChibG9jayk/TVNHX1dBSVRBTEw6TVNHX0RPTlRXQUlUOworCW1zZy5tc2dfZmxhZ3MgPSAoYmxvY2spID8gTVNHX1dBSVRBTEwgOiBNU0dfRE9OVFdBSVQ7CiAKIAllcnIgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBpb3YuaW92X2xlbiwKIAkJCW1zZy5tc2dfZmxhZ3MpOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJbXNnLm1zZ19uYW1lbGVuID0gMDsKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IE1TR19XQUlUQUxMIHwgKG1vcmUpP01TR19NT1JFOjA7CisJbXNnLm1zZ19mbGFncyA9IE1TR19XQUlUQUxMIHwgKG1vcmUgPyBNU0dfTU9SRSA6IDApOwogCiAJZXJyID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJmlvdiwgMSwgaW92Lmlvdl9sZW4pOwogCWlmIChlcnIgIT0gc2l6ZSkgewpAQCAtMjE3LDggKzIxNyw4IEBACiB7CiAJaWYgKHNrLT5vcHMtPmZhbWlseSA9PSBBRl9JTkVUKSB7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhOwotCQlwcmludGsoS0VSTl9JTkZPICIlcyAldS4ldS4ldS4ldTolZC5cbiIsCi0JCQlzdHIsIE5JUFFVQUQoc2luLT5zaW5fYWRkci5zX2FkZHIpLCBudG9ocyhzaW4tPnNpbl9wb3J0KSk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzICV1LiV1LiV1LiV1OiVkLlxuIiwgc3RyLAorCQkJTklQUVVBRChzaW4tPnNpbl9hZGRyLnNfYWRkciksIG50b2hzKHNpbi0+c2luX3BvcnQpKTsKIAl9IGVsc2UgaWYgKHNrLT5vcHMtPmZhbWlseSA9PSBBRl9JTkVUNikgewogCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhOwogCQlwcmludGsoS0VSTl9JTkZPICIlcyAlcGk2OiVkIiwKQEAgLTI3MSwxMyArMjcxLDEzIEBACiAgKiBTdGF0ZSByZXNldCBpcyB1c2VkIHRvIHJlY29ubmVjdCB0byB0aGUgcmVtb3RlIHBlZXIuCiAgKiBNYXkgZmFpbCwgYnV0IHdobyBjYXJlcywgd2Ugd2lsbCB0cnkgYWdhaW4gbGF0ZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGlubGluZSBkc3Rfc3RhdGVfcmVzZXRfbm9sb2NrKHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQorc3RhdGljIGlubGluZSB2b2lkIGRzdF9zdGF0ZV9yZXNldF9ub2xvY2soc3RydWN0IGRzdF9zdGF0ZSAqc3QpCiB7CiAJZHN0X3N0YXRlX2V4aXRfY29ubmVjdGVkKHN0KTsKIAlkc3Rfc3RhdGVfaW5pdF9jb25uZWN0ZWQoc3QpOwogfQogCi1zdGF0aWMgdm9pZCBpbmxpbmUgZHN0X3N0YXRlX3Jlc2V0KHN0cnVjdCBkc3Rfc3RhdGUgKnN0KQorc3RhdGljIGlubGluZSB2b2lkIGRzdF9zdGF0ZV9yZXNldChzdHJ1Y3QgZHN0X3N0YXRlICpzdCkKIHsKIAlkc3Rfc3RhdGVfbG9jayhzdCk7CiAJZHN0X3N0YXRlX3Jlc2V0X25vbG9jayhzdCk7CkBAIC0zMzUsOSArMzM1LDExIEBACiAKIAkJY21kLT5jbWQgPSBfX2NwdV90b19iZTMyKERTVF9QSU5HKTsKIAotCQllcnIgPSBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdC0+c29ja2V0LCBjbWQsIHNpemVvZihzdHJ1Y3QgZHN0X2NtZCksIDApOworCQllcnIgPSBkc3RfZGF0YV9zZW5kX2hlYWRlcihzdC0+c29ja2V0LCBjbWQsCisJCQkJc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSwgMCk7CiAJfQotCWRwcmludGsoIiVzOiBzdDogJXAsIHNvY2tldDogJXAsIGVycjogJWQuXG4iLCBfX2Z1bmNfXywgc3QsIHN0LT5zb2NrZXQsIGVycik7CisJZHByaW50aygiJXM6IHN0OiAlcCwgc29ja2V0OiAlcCwgZXJyOiAlZC5cbiIsIF9fZnVuY19fLAorCQkJc3QsIHN0LT5zb2NrZXQsIGVycik7CiAJZHN0X3N0YXRlX3VubG9jayhzdCk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMzkwLDggKzM5Miw3IEBACiAJCWVyciA9IC1FQ09OTlJFU0VUOwogCQlkc3Rfc3RhdGVfbG9jayhzdCk7CiAKLQkJaWYgKAkJc3QtPnNvY2tldCAmJgotCQkJCShzdC0+cmVhZF9zb2NrZXQgPT0gc3QtPnNvY2tldCkgJiYKKwkJaWYgKHN0LT5zb2NrZXQgJiYgKHN0LT5yZWFkX3NvY2tldCA9PSBzdC0+c29ja2V0KSAmJgogCQkJCShyZXZlbnRzICYgUE9MTElOKSkgewogCQkJZXJyID0gZHN0X2RhdGFfcmVjdl9yYXcoc3QsIGRhdGEsIHNpemUpOwogCQkJaWYgKGVyciA+IDApIHsKQEAgLTQwMiw4ICs0MDMsOSBAQAogCQl9CiAKIAkJaWYgKHJldmVudHMgJiBlcnJfbWFzayB8fCAhc3QtPnNvY2tldCkgewotCQkJZHByaW50aygiJXM6IHJldmVudHM6ICV4LCBzb2NrZXQ6ICVwLCBzaXplOiAldSwgZXJyOiAlZC5cbiIsCi0JCQkJCV9fZnVuY19fLCByZXZlbnRzLCBzdC0+c29ja2V0LCBzaXplLCBlcnIpOworCQkJZHByaW50aygiJXM6IHJldmVudHM6ICV4LCBzb2NrZXQ6ICVwLCBzaXplOiAldSwgIgorCQkJCQkiZXJyOiAlZC5cbiIsIF9fZnVuY19fLCByZXZlbnRzLAorCQkJCQlzdC0+c29ja2V0LCBzaXplLCBlcnIpOwogCQkJZXJyID0gLUVDT05OUkVTRVQ7CiAJCX0KIApAQCAtNDQwLDcgKzQ0Miw4IEBACiAvKgogICogUmVjZWl2ZSBibG9jayBJTyBmcm9tIHRoZSBuZXR3b3JrLgogICovCi1zdGF0aWMgaW50IGRzdF9yZWN2X2JpbyhzdHJ1Y3QgZHN0X3N0YXRlICpzdCwgc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSkKK3N0YXRpYyBpbnQgZHN0X3JlY3ZfYmlvKHN0cnVjdCBkc3Rfc3RhdGUgKnN0LCBzdHJ1Y3QgYmlvICpiaW8sCisJCXVuc2lnbmVkIGludCB0b3RhbF9zaXplKQogewogCXN0cnVjdCBiaW9fdmVjICpidjsKIAlpbnQgaSwgZXJyOwpAQCAtNDUwLDkgKzQ1MywxMCBAQAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKIAkJc3ogPSBtaW4odG90YWxfc2l6ZSwgYnYtPmJ2X2xlbik7CiAKLQkJZHByaW50aygiJXM6IGJpbzogJWxsdS8ldSwgdG90YWw6ICV1LCBsZW46ICV1LCBzejogJXUsIG9mZjogJXUuXG4iLAotCQkJX19mdW5jX18sICh1NjQpYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSwgdG90YWxfc2l6ZSwKLQkJCWJ2LT5idl9sZW4sIHN6LCBidi0+YnZfb2Zmc2V0KTsKKwkJZHByaW50aygiJXM6IGJpbzogJWxsdS8ldSwgdG90YWw6ICV1LCBsZW46ICV1LCBzejogJXUsICIKKwkJCQkib2ZmOiAldS5cbiIsIF9fZnVuY19fLCAodTY0KWJpby0+Ymlfc2VjdG9yLAorCQkJCWJpby0+Ymlfc2l6ZSwgdG90YWxfc2l6ZSwgYnYtPmJ2X2xlbiwgc3osCisJCQkJYnYtPmJ2X29mZnNldCk7CiAKIAkJZGF0YSA9IGttYXAoYnYtPmJ2X3BhZ2UpICsgYnYtPmJ2X29mZnNldDsKIAkJZXJyID0gZHN0X2RhdGFfcmVjdihzdCwgZGF0YSwgc3opOwpAQCAtNTkwLDcgKzU5NCw4IEBACiAJCQljbWQtPmZsYWdzLCBjbWQtPnJ3KTsKIAogCS8qCi0JICogVGhpcyBzaG91bGQgY2F0Y2ggcHJvdG9jb2wgYnJlYWthZ2UgYW5kIHJhbmRvbSBnYXJiYWdlIGluc3RlYWQgb2YgY29tbWFuZHMuCisJICogVGhpcyBzaG91bGQgY2F0Y2ggcHJvdG9jb2wgYnJlYWthZ2UgYW5kIHJhbmRvbSBnYXJiYWdlCisJICogaW5zdGVhZCBvZiBjb21tYW5kcy4KIAkgKi8KIAlpZiAodW5saWtlbHkoY21kLT5jc2l6ZSA+IHN0LT5zaXplIC0gc2l6ZW9mKHN0cnVjdCBkc3RfY21kKSkpIHsKIAkJZXJyID0gLUVCQURNU0c7CkBAIC01OTksMjAgKzYwNCwyMCBAQAogCiAJZXJyID0gLUVQUk9UTzsKIAlzd2l0Y2ggKGNtZC0+Y21kKSB7Ci0JCWNhc2UgRFNUX0lPX1JFU1BPTlNFOgotCQkJZXJyID0gZHN0X3Byb2Nlc3NfaW9fcmVzcG9uc2Uoc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNUX0lPOgotCQkJZXJyID0gZHN0X3Byb2Nlc3NfaW8oc3QpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNUX0NGRzoKLQkJCWVyciA9IGRzdF9wcm9jZXNzX2NmZyhzdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBEU1RfUElORzoKLQkJCWVyciA9IDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCWNhc2UgRFNUX0lPX1JFU1BPTlNFOgorCQllcnIgPSBkc3RfcHJvY2Vzc19pb19yZXNwb25zZShzdCk7CisJCWJyZWFrOworCWNhc2UgRFNUX0lPOgorCQllcnIgPSBkc3RfcHJvY2Vzc19pbyhzdCk7CisJCWJyZWFrOworCWNhc2UgRFNUX0NGRzoKKwkJZXJyID0gZHN0X3Byb2Nlc3NfY2ZnKHN0KTsKKwkJYnJlYWs7CisJY2FzZSBEU1RfUElORzoKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiBvdXRfZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdGhyZWFkX3Bvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvdGhyZWFkX3Bvb2wuYwppbmRleCA3YmVkNGU4Li4yOWE4MmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3RocmVhZF9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90aHJlYWRfcG9vbC5jCkBAIC0zMCw4ICszMCw3IEBACiAgKiBXaGVuIGFjdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQsIHRocmVhZCBjYW4gbm90IGJlIHVzZWQgYnkgb3RoZXIgdXNlcnMsCiAgKiBpbnN0ZWFkIHRoZXkgd2lsbCBzbGVlcCB1bnRpbCB0aGVyZSBpcyBmcmVlIHRocmVhZCB0byBwaWNrIHRoZWlyIHdvcmsuCiAgKi8KLXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIKLXsKK3N0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgewogCXN0cnVjdCBsaXN0X2hlYWQJd29ya2VyX2VudHJ5OwogCiAJc3RydWN0IHRhc2tfc3RydWN0CSp0aHJlYWQ7CkBAIC00OCw4ICs0Nyw4IEBACiAJdm9pZAkJCSpwcml2YXRlOwogCXZvaWQJCQkqc2NoZWR1bGVfZGF0YTsKIAotCWludAkJCSgqIGFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqc2NoZWR1bGVfZGF0YSk7Ci0Jdm9pZAkJCSgqIGNsZWFudXApKHZvaWQgKnByaXZhdGUpOworCWludAkJCSgqYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpzY2hlZHVsZV9kYXRhKTsKKwl2b2lkCQkJKCpjbGVhbnVwKSh2b2lkICpwcml2YXRlKTsKIH07CiAKIHN0YXRpYyB2b2lkIHRocmVhZF9wb29sX2V4aXRfd29ya2VyKHN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncpCkBAIC0xMTYsMTAgKzExNSwxMiBAQAogCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncgPSBOVUxMOwogCiAJd2hpbGUgKCF3ICYmIHAtPnRocmVhZF9udW0pIHsKLQkJd2FpdF9ldmVudChwLT53YWl0LCAhbGlzdF9lbXB0eSgmcC0+cmVhZHlfbGlzdCkgfHwgIXAtPnRocmVhZF9udW0pOworCQl3YWl0X2V2ZW50KHAtPndhaXQsICFsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSB8fAorCQkJCSFwLT50aHJlYWRfbnVtKTsKIAogCQlkcHJpbnRrKCIlczogbG9ja2luZyBsaXN0X2VtcHR5OiAlZCwgdGhyZWFkX251bTogJWQuXG4iLAotCQkJCV9fZnVuY19fLCBsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSwgcC0+dGhyZWFkX251bSk7CisJCQkJX19mdW5jX18sIGxpc3RfZW1wdHkoJnAtPnJlYWR5X2xpc3QpLAorCQkJCXAtPnRocmVhZF9udW0pOwogCiAJCW11dGV4X2xvY2soJnAtPnRocmVhZF9sb2NrKTsKIAkJaWYgKCFsaXN0X2VtcHR5KCZwLT5yZWFkeV9saXN0KSkgewpAQCAtMTI3LDggKzEyOCw5IEBACiAJCQkJCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIsCiAJCQkJCXdvcmtlcl9lbnRyeSk7CiAKLQkJCWRwcmludGsoIiVzOiBkZWxldGluZyB3OiAlcCwgdGhyZWFkX251bTogJWQsIGxpc3Q6ICVwIFslcC4lcF0uXG4iLAotCQkJCQlfX2Z1bmNfXywgdywgcC0+dGhyZWFkX251bSwgJnAtPnJlYWR5X2xpc3QsCisJCQlkcHJpbnRrKCIlczogZGVsZXRpbmcgdzogJXAsIHRocmVhZF9udW06ICVkLCAiCisJCQkJCSJsaXN0OiAlcCBbJXAuJXBdLlxuIiwgX19mdW5jX18sCisJCQkJCXcsIHAtPnRocmVhZF9udW0sICZwLT5yZWFkeV9saXN0LAogCQkJCQlwLT5yZWFkeV9saXN0LnByZXYsIHAtPnJlYWR5X2xpc3QubmV4dCk7CiAKIAkJCXAtPnRocmVhZF9udW0tLTsKQEAgLTE4Miw4ICsxODQsOCBAQAogaW50IHRocmVhZF9wb29sX2FkZF93b3JrZXIoc3RydWN0IHRocmVhZF9wb29sICpwLAogCQljaGFyICpuYW1lLAogCQl1bnNpZ25lZCBpbnQgaWQsCi0JCXZvaWQgKigqIGluaXQpKHZvaWQgKnByaXZhdGUpLAotCQl2b2lkICgqIGNsZWFudXApKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICooKmluaXQpKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICgqY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCiAJCXZvaWQgKnByaXZhdGUpCiB7CiAJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdzsKQEAgLTI0Myw4ICsyNDUsOCBAQAogICogVGhleSB3aWxsIGhhdmUgc2VxdWVudGlhbCBJRHMgc3RhcnRlZCBmcm9tIHplcm8uCiAgKi8KIHN0cnVjdCB0aHJlYWRfcG9vbCAqdGhyZWFkX3Bvb2xfY3JlYXRlKGludCBudW0sIGNoYXIgKm5hbWUsCi0JCXZvaWQgKigqIGluaXQpKHZvaWQgKnByaXZhdGUpLAotCQl2b2lkICgqIGNsZWFudXApKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICooKmluaXQpKHZvaWQgKnByaXZhdGUpLAorCQl2b2lkICgqY2xlYW51cCkodm9pZCAqcHJpdmF0ZSksCiAJCXZvaWQgKnByaXZhdGUpCiB7CiAJc3RydWN0IHRocmVhZF9wb29sX3dvcmtlciAqdywgKnRtcDsKQEAgLTI2Miw3ICsyNjQsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwLT5hY3RpdmVfbGlzdCk7CiAJcC0+dGhyZWFkX251bSA9IDA7CiAKLQlmb3IgKGk9MDsgaTxudW07ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBudW07ICsraSkgewogCQllcnIgPSB0aHJlYWRfcG9vbF9hZGRfd29ya2VyKHAsIG5hbWUsIGksIGluaXQsCiAJCQkJY2xlYW51cCwgcHJpdmF0ZSk7CiAJCWlmIChlcnIpCkBAIC0yODcsOCArMjg5LDggQEAKICAqIHByaXZhdGUgZGF0YS4KICAqLwogaW50IHRocmVhZF9wb29sX3NjaGVkdWxlX3ByaXZhdGUoc3RydWN0IHRocmVhZF9wb29sICpwLAotCQlpbnQgKCogc2V0dXApKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAotCQlpbnQgKCogYWN0aW9uKSh2b2lkICpwcml2YXRlLCB2b2lkICpkYXRhKSwKKwkJaW50ICgqc2V0dXApKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAorCQlpbnQgKCphY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAogCQl2b2lkICpkYXRhLCBsb25nIHRpbWVvdXQsIHZvaWQgKmlkKQogewogCXN0cnVjdCB0aHJlYWRfcG9vbF93b3JrZXIgKncsICp0bXAsICp3b3JrZXIgPSBOVUxMOwpAQCAtMzIxLDcgKzMyMyw4IEBACiAJCQkJdy0+aGFzX2RhdGEgPSAxOwogCQkJCXdha2VfdXAoJnctPndhaXQpOwogCQkJfSBlbHNlIHsKLQkJCQlsaXN0X21vdmVfdGFpbCgmdy0+d29ya2VyX2VudHJ5LCAmcC0+cmVhZHlfbGlzdCk7CisJCQkJbGlzdF9tb3ZlX3RhaWwoJnctPndvcmtlcl9lbnRyeSwKKwkJCQkJCSZwLT5yZWFkeV9saXN0KTsKIAkJCX0KIAogCQkJYnJlYWs7CkBAIC0zMzYsOCArMzM5LDggQEAKICAqIFNjaGVkdWxlIGV4ZWN1dGlvbiBvbiBhcmJpdHJhcnkgdGhyZWFkIGZyb20gdGhlIHBvb2wuCiAgKi8KIGludCB0aHJlYWRfcG9vbF9zY2hlZHVsZShzdHJ1Y3QgdGhyZWFkX3Bvb2wgKnAsCi0JCWludCAoKiBzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCi0JCWludCAoKiBhY3Rpb24pKHZvaWQgKnByaXZhdGUsIHZvaWQgKmRhdGEpLAorCQlpbnQgKCpzZXR1cCkodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCisJCWludCAoKmFjdGlvbikodm9pZCAqcHJpdmF0ZSwgdm9pZCAqZGF0YSksCiAJCXZvaWQgKmRhdGEsIGxvbmcgdGltZW91dCkKIHsKIAlyZXR1cm4gdGhyZWFkX3Bvb2xfc2NoZWR1bGVfcHJpdmF0ZShwLCBzZXR1cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kc3QvdHJhbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kc3QvdHJhbnMuYwppbmRleCA1NTdkMzcyLi4xYzM2YTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZHN0L3RyYW5zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RzdC90cmFucy5jCkBAIC01OCw3ICs1OCw3IEBACiAJfQogCiAJZHByaW50aygiJXM6ICVzIHRyYW5zYWN0aW9uOiBpZDogJWxsdS5cbiIsIF9fZnVuY19fLAotCQkJKHJldCk/ImZvdW5kIjoibm90IGZvdW5kIiwgZ2VuKTsKKwkJCShyZXQpID8gImZvdW5kIiA6ICJub3QgZm91bmQiLCBnZW4pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg4LDkgKzg4LDkgQEAKIAogCW5ldy0+c2VuZF90aW1lID0gamlmZmllczsKIAlpZiAocmV0KSB7Ci0JCXByaW50aygiJXM6IGV4aXN0OiBvbGQ6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCBzZW5kX3RpbWU6ICVsdSwgIgotCQkJCSJuZXc6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCBzZW5kX3RpbWU6ICVsdS5cbiIsCi0JCQlfX2Z1bmNfXywKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGlzdDogb2xkOiBnZW46ICVsbHUsIGJpbzogJWxsdS8ldSwgIgorCQkJInNlbmRfdGltZTogJWx1LCBuZXc6IGdlbjogJWxsdSwgYmlvOiAlbGx1LyV1LCAiCisJCQkic2VuZF90aW1lOiAlbHUuXG4iLCBfX2Z1bmNfXywKIAkJCXJldC0+Z2VuLCAodTY0KXJldC0+YmlvLT5iaV9zZWN0b3IsCiAJCQlyZXQtPmJpby0+Ymlfc2l6ZSwgcmV0LT5zZW5kX3RpbWUsCiAJCQluZXctPmdlbiwgKHU2NCluZXctPmJpby0+Ymlfc2VjdG9yLApAQCAtMjA2LDcgKzIwNiw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRzdF90cmFuc19zY2FuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgZHN0X25vZGUgKm4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRzdF9ub2RlLCB0cmFuc193b3JrLndvcmspOworCXN0cnVjdCBkc3Rfbm9kZSAqbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZHN0X25vZGUsCisJCQl0cmFuc193b3JrLndvcmspOwogCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOwogCXN0cnVjdCBkc3RfdHJhbnMgKnQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbi0+dHJhbnNfc2Nhbl90aW1lb3V0OwpAQCAtMjQ2LDggKzI0Nyw4IEBACiAJbXV0ZXhfdW5sb2NrKCZuLT50cmFuc19sb2NrKTsKIAogCS8qCi0JICogSWYgbm8gdGltZW91dCBzcGVjaWZpZWQgdGhlbiBzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBleGl0aW5nIHByb2Nlc3MsCi0JICogc28gbm8gbmVlZCB0byByZXNjaGVkdWxlIHNjYW5uaW5nIHByb2Nlc3MgYWdhaW4uCisJICogSWYgbm8gdGltZW91dCBzcGVjaWZpZWQgdGhlbiBzeXN0ZW0gaXMgaW4gdGhlIG1pZGRsZSBvZiBleGl0aW5nCisJICogcHJvY2Vzcywgc28gbm8gbmVlZCB0byByZXNjaGVkdWxlIHNjYW5uaW5nIHByb2Nlc3MgYWdhaW4uCiAJICovCiAJaWYgKHRpbWVvdXQpIHsKIAkJaWYgKCFudW0pCkBAIC0zMTMsNyArMzE0LDggQEAKIAlpZiAoIW4tPnRyYW5zX2NhY2hlKQogCQlnb3RvIGVycl9vdXRfZXhpdDsKIAotCW4tPnRyYW5zX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woZHN0X21lbXBvb2xfbnVtLCBuLT50cmFuc19jYWNoZSk7CisJbi0+dHJhbnNfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChkc3RfbWVtcG9vbF9udW0sCisJCQluLT50cmFuc19jYWNoZSk7CiAJaWYgKCFuLT50cmFuc19wb29sKQogCQlnb3RvIGVycl9vdXRfY2FjaGVfZGVzdHJveTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2FkZHJlc3NfbWFwLmgKaW5kZXggMmMzZDY1YS4uNmRhODQzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9hZGRyZXNzX21hcC5oCkBAIC0xOTgsMjAgKzE5OCwxMCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgdHhkbWEgcGFja2V0IHJpbmcgbnVtYmVyIG9mIGRlc2NyaXB0b3IgcmVnIGluIHR4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDEwMEMKKyAqCisgKiAzMS0xMDogdW51c2VkCisgKiA5LTA6IHByIG5kZXMKICAqLwotdHlwZWRlZiB1bmlvbiBfVFhETUFfUFJfTlVNX0RFU190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjI7CS8qIGJpdHMgMTAtMzEgKi8KLQkJdTMyIHByX25kZXM6MTA7CS8qIGJpdHMgMC05ICovCi0jZWxzZQotCQl1MzIgcHJfbmRlczoxMDsJLyogYml0cyAwLTkgKi8KLQkJdTMyIHVudXNlZDoyMjsJLyogYml0cyAxMC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWERNQV9QUl9OVU1fREVTX3QsICpQVFhETUFfUFJfTlVNX0RFU190OwotCiAKICNkZWZpbmUgRVRfRE1BMTBfTUFTSwkJMHgzRkYJLyogMTAgYml0IG1hc2sgZm9yIERNQTEwVyB0eXBlcyAqLwogI2RlZmluZSBFVF9ETUExMF9XUkFQCQkweDQwMApAQCAtMjYxLDcgKzI1MSw3IEBACiAJdTMyIGNzcjsJCQkvKiAgMHgxMDAwICovCiAJdTMyIHByX2Jhc2VfaGk7CQkJLyogIDB4MTAwNCAqLwogCXUzMiBwcl9iYXNlX2xvOwkJCS8qICAweDEwMDggKi8KLQlUWERNQV9QUl9OVU1fREVTX3QgcHJfbnVtX2RlczsJLyogIDB4MTAwQyAqLworCXUzMiBwcl9udW1fZGVzOwkJCS8qICAweDEwMEMgKi8KIAl1MzIgdHhxX3dyX2FkZHI7CQkvKiAgMHgxMDEwICovCiAJdTMyIHR4cV93cl9hZGRyX2V4dDsJCS8qICAweDEwMTQgKi8KIAl1MzIgdHhxX3JkX2FkZHI7CQkvKiAgMHgxMDE4ICovCkBAIC0zNDksMzYgKzMzOSwxOCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgbnVtYmVyIG9mIHBhY2tldHMgZG9uZSByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMEMKKyAqCisgKiAzMS04OiB1bnVzZWQKKyAqIDctMDogbnVtIGRvbmUKICAqLwotdHlwZWRlZiB1bmlvbiBfUlhETUFfTlVNX1BLVF9ET05FX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyNDsJLyogYml0cyA4LTMxICovCi0JCXUzMiBudW1fZG9uZTo4OwkvKiBiaXRzIDAtNyAqLwotI2Vsc2UKLQkJdTMyIG51bV9kb25lOjg7CS8qIGJpdHMgMC03ICovCi0JCXUzMiB1bnVzZWQ6MjQ7CS8qIGJpdHMgOC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9OVU1fUEtUX0RPTkVfdCwgKlBSWERNQV9OVU1fUEtUX0RPTkVfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgbWF4IHBhY2tldCB0aW1lIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAxMAorICoKKyAqIDMxLTE4OiB1bnVzZWQKKyAqIDE3LTA6IHRpbWUgZG9uZQogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9NQVhfUEtUX1RJTUVfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjE0OwkJLyogYml0cyAxOC0zMSAqLwotCQl1MzIgdGltZV9kb25lOjE4OwkvKiBiaXRzIDAtMTcgKi8KLSNlbHNlCi0JCXUzMiB0aW1lX2RvbmU6MTg7CS8qIGJpdHMgMC0xNyAqLwotCQl1MzIgdW51c2VkOjE0OwkJLyogYml0cyAxOC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9NQVhfUEtUX1RJTUVfdCwgKlBSWERNQV9NQVhfUEtUX1RJTUVfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcnggcXVldWUgcmVhZCBhZGRyZXNzIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcApAQCAtNDEzLDkxICszODUsNDQgQEAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMjgKKyAqCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBwc3IgbmRlcwogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9QU1JfTlVNX0RFU190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjA7CQkvKiBiaXRzIDEyLTMxICovCi0JCXUzMiBwc3JfbmRlczoxMjsJLyogYml0IDAtMTEgKi8KLSNlbHNlCi0JCXUzMiBwc3JfbmRlczoxMjsJLyogYml0IDAtMTEgKi8KLQkJdTMyIHVudXNlZDoyMDsJCS8qIGJpdHMgMTItMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfUFNSX05VTV9ERVNfdCwgKlBSWERNQV9QU1JfTlVNX0RFU190OwogCiAvKgogICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgYXZhaWxhYmxlIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMkMKKyAqCisgKiAzMS0xMzogdW51c2VkCisgKiAxMjogcHNyIGF2YWlsIHdyYXAKKyAqIDExLTA6IHBzciBhdmFpbAogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9QU1JfQVZBSUxfT0ZGU0VUX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoxOTsJCS8qIGJpdHMgMTMtMzEgKi8KLQkJdTMyIHBzcl9hdmFpbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcHNyX2F2YWlsOjEyOwkvKiBiaXQgMC0xMSAqLwotI2Vsc2UKLQkJdTMyIHBzcl9hdmFpbDoxMjsJLyogYml0IDAtMTEgKi8KLQkJdTMyIHBzcl9hdmFpbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgdW51c2VkOjE5OwkJLyogYml0cyAxMy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfQVZBSUxfT0ZGU0VUX3QsICpQUlhETUFfUFNSX0FWQUlMX09GRlNFVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgZnVsbCBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDMwCisgKgorICogMzEtMTM6IHVudXNlZAorICogMTI6IHBzciBmdWxsIHdyYXAKKyAqIDExLTA6IHBzciBmdWxsCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9GVUxMX09GRlNFVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MTk7CQkvKiBiaXRzIDEzLTMxICovCi0JCXUzMiBwc3JfZnVsbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcHNyX2Z1bGw6MTI7CS8qIGJpdCAwLTExICovCi0jZWxzZQotCQl1MzIgcHNyX2Z1bGw6MTI7CS8qIGJpdCAwLTExICovCi0JCXUzMiBwc3JfZnVsbF93cmFwOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgdW51c2VkOjE5OwkJLyogYml0cyAxMy0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBSWERNQV9QU1JfRlVMTF9PRkZTRVRfdCwgKlBSWERNQV9QU1JfRlVMTF9PRkZTRVRfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIGFjY2VzcyBpbmRleCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzQKKyAqCisgKiAzMS01OiB1bnVzZWQKKyAqIDQtMDogcHNyX2FpCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9BQ0NFU1NfSU5ERVhfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLQkJdTMyIHBzcl9haTo1OwkvKiBiaXRzIDAtNCAqLwotI2Vsc2UKLQkJdTMyIHBzcl9haTo1OwkvKiBiaXRzIDAtNCAqLwotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfUFNSX0FDQ0VTU19JTkRFWF90LCAqUFJYRE1BX1BTUl9BQ0NFU1NfSU5ERVhfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIG1pbmltdW0gZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzgKKyAqCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBwc3JfbWluCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX1BTUl9NSU5fREVTX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMDsJLyogYml0cyAxMi0zMSAqLwotCQl1MzIgcHNyX21pbjoxMjsJLyogYml0cyAwLTExICovCi0jZWxzZQotCQl1MzIgcHNyX21pbjoxMjsJLyogYml0cyAwLTExICovCi0JCXUzMiB1bnVzZWQ6MjA7CS8qIGJpdHMgMTItMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfUFNSX01JTl9ERVNfdCwgKlBSWERNQV9QU1JfTUlOX0RFU190OwogCiAvKgogICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIGJhc2UgbG8gYWRkcmVzcyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKQEAgLTUxNCw2ICs0MzksOSBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKICAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNDQKKyAqCisgKiAzMS0xMDogdW51c2VkCisgKiA5LTA6IGZiciBuZGVzYwogICovCiB0eXBlZGVmIHVuaW9uIF9SWERNQV9GQlJfTlVNX0RFU190IHsKIAl1MzIgdmFsdWU7CkBAIC01NDMsMzYgKzQ3MSwxOCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgY2FjaGUgMCBmdWxsIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNTAKKyAqCisgKiAzMS01OiB1bnVzZWQKKyAqIDQtMDogZmJjIHJkaQogICovCi10eXBlZGVmIHVuaW9uIF9SWERNQV9GQkNfUkRfSU5ERVhfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLQkJdTMyIGZiY19yZGk6NTsJLyogYml0IDAtNCAqLwotI2Vsc2UKLQkJdTMyIGZiY19yZGk6NTsJLyogYml0IDAtNCAqLwotCQl1MzIgdW51c2VkOjI3OwkvKiBiaXRzIDUtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhETUFfRkJDX1JEX0lOREVYX3QsICpQUlhETUFfRkJDX1JEX0lOREVYX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMCBtaW5pbXVtIGRlc2NyaXB0b3IgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDU0CisgKgorICogMzEtMTA6IHVudXNlZAorICogOS0wOiBmYnIgbWluCiAgKi8KLXR5cGVkZWYgdW5pb24gX1JYRE1BX0ZCUl9NSU5fREVTX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoyMjsJLyogYml0cyAxMC0zMSAqLwotCQl1MzIgZmJyX21pbjoxMDsJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBmYnJfbWluOjEwOwkvKiBiaXRzIDAtOSAqLwotCQl1MzIgdW51c2VkOjIyOwkvKiBiaXRzIDEwLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFJYRE1BX0ZCUl9NSU5fREVTX3QsICpQUlhETUFfRkJSX01JTl9ERVNfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIGJhc2UgYWRkcmVzcyBsbyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKQEAgLTYxOCwzMiArNTI4LDMyIEBACiAJUlhETUFfQ1NSX3QgY3NyOwkJCQkvKiAgMHgyMDAwICovCiAJdTMyIGRtYV93Yl9iYXNlX2xvOwkJCQkvKiAgMHgyMDA0ICovCiAJdTMyIGRtYV93Yl9iYXNlX2hpOwkJCQkvKiAgMHgyMDA4ICovCi0JUlhETUFfTlVNX1BLVF9ET05FX3QgbnVtX3BrdF9kb25lOwkJLyogIDB4MjAwQyAqLwotCVJYRE1BX01BWF9QS1RfVElNRV90IG1heF9wa3RfdGltZTsJCS8qICAweDIwMTAgKi8KKwl1MzIgbnVtX3BrdF9kb25lOwkJCQkvKiAgMHgyMDBDICovCisJdTMyIG1heF9wa3RfdGltZTsJCQkJLyogIDB4MjAxMCAqLwogCXUzMiByeHFfcmRfYWRkcjsJCQkJLyogIDB4MjAxNCAqLwotCXUzMiByeHFfcmRfYWRkcl9leHQ7CQkJLyogIDB4MjAxOCAqLworCXUzMiByeHFfcmRfYWRkcl9leHQ7CQkJCS8qICAweDIwMTggKi8KIAl1MzIgcnhxX3dyX2FkZHI7CQkJCS8qICAweDIwMUMgKi8KIAl1MzIgcHNyX2Jhc2VfbG87CQkJCS8qICAweDIwMjAgKi8KIAl1MzIgcHNyX2Jhc2VfaGk7CQkJCS8qICAweDIwMjQgKi8KLQlSWERNQV9QU1JfTlVNX0RFU190IHBzcl9udW1fZGVzOwkJLyogIDB4MjAyOCAqLwotCVJYRE1BX1BTUl9BVkFJTF9PRkZTRVRfdCBwc3JfYXZhaWxfb2Zmc2V0OwkvKiAgMHgyMDJDICovCi0JUlhETUFfUFNSX0ZVTExfT0ZGU0VUX3QgcHNyX2Z1bGxfb2Zmc2V0OwkvKiAgMHgyMDMwICovCi0JUlhETUFfUFNSX0FDQ0VTU19JTkRFWF90IHBzcl9hY2Nlc3NfaW5kZXg7CS8qICAweDIwMzQgKi8KLQlSWERNQV9QU1JfTUlOX0RFU190IHBzcl9taW5fZGVzOwkJLyogIDB4MjAzOCAqLworCXUzMiBwc3JfbnVtX2RlczsJCQkJLyogIDB4MjAyOCAqLworCXUzMiBwc3JfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDJDICovCisJdTMyIHBzcl9mdWxsX29mZnNldDsJCQkJLyogIDB4MjAzMCAqLworCXUzMiBwc3JfYWNjZXNzX2luZGV4OwkJCQkvKiAgMHgyMDM0ICovCisJdTMyIHBzcl9taW5fZGVzOwkJCQkvKiAgMHgyMDM4ICovCiAJdTMyIGZicjBfYmFzZV9sbzsJCQkJLyogIDB4MjAzQyAqLwogCXUzMiBmYnIwX2Jhc2VfaGk7CQkJCS8qICAweDIwNDAgKi8KLQlSWERNQV9GQlJfTlVNX0RFU190IGZicjBfbnVtX2RlczsJCS8qICAweDIwNDQgKi8KLQl1MzIgZmJyMF9hdmFpbF9vZmZzZXQ7CQkJLyogIDB4MjA0OCAqLwotCXUzMiBmYnIwX2Z1bGxfb2Zmc2V0OwkJCS8qICAweDIwNEMgKi8KLQlSWERNQV9GQkNfUkRfSU5ERVhfdCBmYnIwX3JkX2luZGV4OwkJLyogIDB4MjA1MCAqLwotCVJYRE1BX0ZCUl9NSU5fREVTX3QgZmJyMF9taW5fZGVzOwkJLyogIDB4MjA1NCAqLworCXUzMiBmYnIwX251bV9kZXM7CQkJCS8qICAweDIwNDQgKi8KKwl1MzIgZmJyMF9hdmFpbF9vZmZzZXQ7CQkJCS8qICAweDIwNDggKi8KKwl1MzIgZmJyMF9mdWxsX29mZnNldDsJCQkJLyogIDB4MjA0QyAqLworCXUzMiBmYnIwX3JkX2luZGV4OwkJCQkvKiAgMHgyMDUwICovCisJdTMyIGZicjBfbWluX2RlczsJCQkJLyogIDB4MjA1NCAqLwogCXUzMiBmYnIxX2Jhc2VfbG87CQkJCS8qICAweDIwNTggKi8KIAl1MzIgZmJyMV9iYXNlX2hpOwkJCQkvKiAgMHgyMDVDICovCi0JUlhETUFfRkJSX05VTV9ERVNfdCBmYnIxX251bV9kZXM7CQkvKiAgMHgyMDYwICovCi0JdTMyIGZicjFfYXZhaWxfb2Zmc2V0OwkJCS8qICAweDIwNjQgKi8KLQl1MzIgZmJyMV9mdWxsX29mZnNldDsJCQkvKiAgMHgyMDY4ICovCi0JUlhETUFfRkJDX1JEX0lOREVYX3QgZmJyMV9yZF9pbmRleDsJCS8qICAweDIwNkMgKi8KLQlSWERNQV9GQlJfTUlOX0RFU190IGZicjFfbWluX2RlczsJCS8qICAweDIwNzAgKi8KKwl1MzIgZmJyMV9udW1fZGVzOwkJCQkvKiAgMHgyMDYwICovCisJdTMyIGZicjFfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDY0ICovCisJdTMyIGZicjFfZnVsbF9vZmZzZXQ7CQkJCS8qICAweDIwNjggKi8KKwl1MzIgZmJyMV9yZF9pbmRleDsJCQkJLyogIDB4MjA2QyAqLworCXUzMiBmYnIxX21pbl9kZXM7CQkJCS8qICAweDIwNzAgKi8KIH0gUlhETUFfdCwgKlBSWERNQV90OwogCiAvKiBFTkQgT0YgUlhETUEgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KQEAgLTY4NSwyMyArNTk1LDExIEBACiAvKgogICogc3RydWN0dXJlIGZvciBzaGFkb3cgcG9pbnRlciByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMDQKKyAqIDMxLTI3OiByZXNlcnZlZAorICogMjYtMTY6IHR4cSByZCBwdHIKKyAqIDE1LTExOiByZXNlcnZlZAorICogMTAtMDogdHhxIHdyIHB0cgogICovCi10eXBlZGVmIHVuaW9uIF9UWE1BQ19TSEFET1dfUFRSX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkMjo1OwkvKiBiaXRzIDI3LTMxICovCi0JCXUzMiB0eHFfcmRfcHRyOjExOwkvKiBiaXRzIDE2LTI2ICovCi0JCXUzMiByZXNlcnZlZDo1OwkJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgdHhxX3dyX3B0cjoxMTsJLyogYml0cyAwLTEwICovCi0jZWxzZQotCQl1MzIgdHhxX3dyX3B0cjoxMTsJLyogYml0cyAwLTEwICovCi0JCXUzMiByZXNlcnZlZDo1OwkJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgdHhxX3JkX3B0cjoxMTsJLyogYml0cyAxNi0yNiAqLwotCQl1MzIgcmVzZXJ2ZWQyOjU7CS8qIGJpdHMgMjctMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gVFhNQUNfU0hBRE9XX1BUUl90LCAqUFRYTUFDX1NIQURPV19QVFJfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgZXJyb3IgY291bnQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCkBAIC03MjcsNTkgKzYyNSwyNiBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgbWF4IGZpbGwgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDBDCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBtYXggZmlsbAogICovCi10eXBlZGVmIHVuaW9uIF9UWE1BQ19NQVhfRklMTF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MjA7CQkvKiBiaXRzIDEyLTMxICovCi0JCXUzMiBtYXhfZmlsbDoxMjsJLyogYml0cyAwLTExICovCi0jZWxzZQotCQl1MzIgbWF4X2ZpbGw6MTI7CS8qIGJpdHMgMC0xMSAqLwotCQl1MzIgdW51c2VkOjIwOwkJLyogYml0cyAxMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWE1BQ19NQVhfRklMTF90LCAqUFRYTUFDX01BWF9GSUxMX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIGNmIHBhcmFtZXRlciByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMTAKKyAqIDMxLTE2OiBjZmVwCisgKiAxNS0wOiBjZnB0CiAgKi8KLXR5cGVkZWYgdW5pb24gX1RYTUFDX0NGX1BBUkFNX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIGNmZXA6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLQkJdTMyIGNmcHQ6MTY7CS8qIGJpdHMgMC0xNSAqLwotI2Vsc2UKLQkJdTMyIGNmcHQ6MTY7CS8qIGJpdHMgMC0xNSAqLwotCQl1MzIgY2ZlcDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWE1BQ19DRl9QQVJBTV90LCAqUFRYTUFDX0NGX1BBUkFNX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIHR4IHRlc3QgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDE0CisgKiAzMS0xNzogdW51c2VkCisgKiAxNjogcmVzZXJ2ZWQxCisgKiAxNTogdHh0ZXN0X2VuCisgKiAxNC0xMTogdW51c2VkCisgKiAxMC0wOiB0eHEgdGVzdCBwb2ludGVyCiAgKi8KLXR5cGVkZWYgdW5pb24gX1RYTUFDX1RYVEVTVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQyOjE1OwkJLyogYml0cyAxNy0zMSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgdHh0ZXN0X2VuOjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgdW51c2VkMTo0OwkJLyogYml0cyAxMS0xNCAqLwotCQl1MzIgdHhxdGVzdF9wdHI6MTE7CS8qIGJpdHMgMC0xMSAqLwotI2Vsc2UKLQkJdTMyIHR4cXRlc3RfcHRyOjExOwkvKiBiaXRzIDAtMTAgKi8KLQkJdTMyIHVudXNlZDE6NDsJCS8qIGJpdHMgMTEtMTQgKi8KLQkJdTMyIHR4dGVzdF9lbjoxOwkvKiBiaXQgMTUgKi8KLQkJdTMyIHJlc2VydmVkMToxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHVudXNlZDI6MTU7CQkvKiBiaXRzIDE3LTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IFRYTUFDX1RYVEVTVF90LCAqUFRYTUFDX1RYVEVTVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBlcnJvciByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKQEAgLTg0NiwzNSArNzExLDI1IEBACiAvKgogICogc3RydWN0dXJlIGZvciBlcnJvciBpbnRlcnJ1cHQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDIwCisgKgorICogMzEtMjogdW51c2VkCisgKiAxOiBicF9yZXEKKyAqIDA6IGJwX3hvbnhvZmYKICAqLwotdHlwZWRlZiB1bmlvbiBfVFhNQUNfQ1BfQ1RSTF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6MzA7CQkvKiBiaXRzIDItMzEgKi8KLQkJdTMyIGJwX3JlcToxOwkJLyogYml0IDEgKi8KLQkJdTMyIGJwX3hvbnhvZmY6MTsJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiBicF94b254b2ZmOjE7CS8qIGJpdCAwICovCi0JCXUzMiBicF9yZXE6MTsJCS8qIGJpdCAxICovCi0JCXUzMiB1bnVzZWQ6MzA7CQkvKiBiaXRzIDItMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gVFhNQUNfQlBfQ1RSTF90LCAqUFRYTUFDX0JQX0NUUkxfdDsKIAogLyoKICAqIFR4IE1BQyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX1RYTUFDX3QgewkJLyogTG9jYXRpb246ICovCiAJVFhNQUNfQ1RMX3QgY3RsOwkJLyogIDB4MzAwMCAqLwotCVRYTUFDX1NIQURPV19QVFJfdCBzaGFkb3dfcHRyOwkvKiAgMHgzMDA0ICovCisJdTMyIHNoYWRvd19wdHI7CQkJLyogIDB4MzAwNCAqLwogCVRYTUFDX0VSUl9DTlRfdCBlcnJfY250OwkvKiAgMHgzMDA4ICovCi0JVFhNQUNfTUFYX0ZJTExfdCBtYXhfZmlsbDsJLyogIDB4MzAwQyAqLwotCVRYTUFDX0NGX1BBUkFNX3QgY2ZfcGFyYW07CS8qICAweDMwMTAgKi8KLQlUWE1BQ19UWFRFU1RfdCB0eF90ZXN0OwkJLyogIDB4MzAxNCAqLworCXUzMiBtYXhfZmlsbDsJCQkvKiAgMHgzMDBDICovCisJdTMyIGNmX3BhcmFtOwkJCS8qICAweDMwMTAgKi8KKwl1MzIgdHhfdGVzdDsJCQkvKiAgMHgzMDE0ICovCiAJVFhNQUNfRVJSX3QgZXJyOwkJLyogIDB4MzAxOCAqLwogCVRYTUFDX0VSUl9JTlRfdCBlcnJfaW50OwkvKiAgMHgzMDFDICovCi0JVFhNQUNfQlBfQ1RSTF90IGJwX2N0cmw7CS8qICAweDMwMjAgKi8KKwl1MzIgYnBfY3RybDsJCQkvKiAgMHgzMDIwICovCiB9IFRYTUFDX3QsICpQVFhNQUNfdDsKIAogLyogRU5EIE9GIFRYTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCkBAIC0xMzA4LDE1NyArMTE2Myw3NyBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiAjMSByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwMAorICoKKyAqIDMxOiBzb2Z0IHJlc2V0CisgKiAzMDogc2ltIHJlc2V0CisgKiAyOS0yMDogcmVzZXJ2ZWQKKyAqIDE5OiByZXNldCByeCBtYworICogMTg6IHJlc2V0IHR4IG1jCisgKiAxNzogcmVzZXQgcnggZnVuYworICogMTY6IHJlc2V0IHR4IGZuYworICogMTUtOTogcmVzZXJ2ZWQKKyAqIDg6IGxvb3BiYWNrCisgKiA3LTY6IHJlc2VydmVkCisgKiA1OiByeCBmbG93CisgKiA0OiB0eCBmbG93CisgKiAzOiBzeW5jZCByeCBlbgorICogMjogcnggZW5hYmxlCisgKiAxOiBzeW5jZCB0eCBlbgorICogMDogdHggZW5hYmxlCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19DRkcxX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHNvZnRfcmVzZXQ6MTsJCS8qIGJpdCAzMSAqLwotCQl1MzIgc2ltX3Jlc2V0OjE7CQkvKiBiaXQgMzAgKi8KLQkJdTMyIHJlc2VydmVkMzoxMDsJCS8qIGJpdHMgMjAtMjkgKi8KLQkJdTMyIHJlc2V0X3J4X21jOjE7CQkvKiBiaXQgMTkgKi8KLQkJdTMyIHJlc2V0X3R4X21jOjE7CQkvKiBiaXQgMTggKi8KLQkJdTMyIHJlc2V0X3J4X2Z1bjoxOwkvKiBiaXQgMTcgKi8KLQkJdTMyIHJlc2V0X3R4X2Z1bjoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHJlc2VydmVkMjo3OwkJLyogYml0cyA5LTE1ICovCi0JCXUzMiBsb29wX2JhY2s6MTsJCS8qIGJpdCA4ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgNi03ICovCi0JCXUzMiByeF9mbG93OjE7CQkvKiBiaXQgNSAqLwotCQl1MzIgdHhfZmxvdzoxOwkJLyogYml0IDQgKi8KLQkJdTMyIHN5bmNkX3J4X2VuOjE7CQkvKiBiaXQgMyAqLwotCQl1MzIgcnhfZW5hYmxlOjE7CQkvKiBiaXQgMiAqLwotCQl1MzIgc3luY2RfdHhfZW46MTsJCS8qIGJpdCAxICovCi0JCXUzMiB0eF9lbmFibGU6MTsJCS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgdHhfZW5hYmxlOjE7CQkvKiBiaXQgMCAqLwotCQl1MzIgc3luY2RfdHhfZW46MTsJCS8qIGJpdCAxICovCi0JCXUzMiByeF9lbmFibGU6MTsJCS8qIGJpdCAyICovCi0JCXUzMiBzeW5jZF9yeF9lbjoxOwkJLyogYml0IDMgKi8KLQkJdTMyIHR4X2Zsb3c6MTsJCS8qIGJpdCA0ICovCi0JCXUzMiByeF9mbG93OjE7CQkvKiBiaXQgNSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDYtNyAqLwotCQl1MzIgbG9vcF9iYWNrOjE7CQkvKiBiaXQgOCAqLwotCQl1MzIgcmVzZXJ2ZWQyOjc7CQkvKiBiaXRzIDktMTUgKi8KLQkJdTMyIHJlc2V0X3R4X2Z1bjoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHJlc2V0X3J4X2Z1bjoxOwkvKiBiaXQgMTcgKi8KLQkJdTMyIHJlc2V0X3R4X21jOjE7CQkvKiBiaXQgMTggKi8KLQkJdTMyIHJlc2V0X3J4X21jOjE7CQkvKiBiaXQgMTkgKi8KLQkJdTMyIHJlc2VydmVkMzoxMDsJCS8qIGJpdHMgMjAtMjkgKi8KLQkJdTMyIHNpbV9yZXNldDoxOwkJLyogYml0IDMwICovCi0JCXUzMiBzb2Z0X3Jlc2V0OjE7CQkvKiBiaXQgMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX0NGRzFfdCwgKlBNQUNfQ0ZHMV90OworCisjZGVmaW5lIENGRzFfTE9PUEJBQ0sJMHgwMDAwMDEwMAorI2RlZmluZSBDRkcxX1JYX0ZMT1cJMHgwMDAwMDAyMAorI2RlZmluZSBDRkcxX1RYX0ZMT1cJMHgwMDAwMDAxMAorI2RlZmluZSBDRkcxX1JYX0VOQUJMRQkweDAwMDAwMDA0CisjZGVmaW5lIENGRzFfVFhfRU5BQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZHMV9XQUlUCTB4MDAwMDAwMEEJLyogUlggJiBUWCBzeW5jZCAqLwogCiAvKgogICogc3RydWN0dXJlIGZvciBjb25maWd1cmF0aW9uICMyIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDA0CisgKiAzMS0xNjogcmVzZXJ2ZWQKKyAqIDE1LTEyOiBwcmVhbWJsZQorICogMTEtMTA6IHJlc2VydmVkCisgKiA5LTg6IGlmIG1vZGUKKyAqIDctNjogcmVzZXJ2ZWQKKyAqIDU6IGh1Z2UgZnJhbWUKKyAqIDQ6IGxlbmd0aCBjaGVjaworICogMzogdW5kZWZpbmVkCisgKiAyOiBwYWQgY3JjCisgKiAxOiBjcmMgZW5hYmxlCisgKiAwOiBmdWxsIGR1cGxleAogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfQ0ZHMl90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDM6MTY7CQkvKiBiaXRzIDE2LTMxICovCi0JCXUzMiBwcmVhbWJsZV9sZW46NDsJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQyOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiBpZl9tb2RlOjI7CQkvKiBiaXRzIDgtOSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDYtNyAqLwotCQl1MzIgaHVnZV9mcmFtZToxOwkJLyogYml0IDUgKi8KLQkJdTMyIGxlbl9jaGVjazoxOwkJLyogYml0IDQgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIHBhZF9jcmM6MTsJCS8qIGJpdCAyICovCi0JCXUzMiBjcmNfZW5hYmxlOjE7CQkvKiBiaXQgMSAqLwotCQl1MzIgZnVsbF9kdXBsZXg6MTsJCS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgZnVsbF9kdXBsZXg6MTsJCS8qIGJpdCAwICovCi0JCXUzMiBjcmNfZW5hYmxlOjE7CQkvKiBiaXQgMSAqLwotCQl1MzIgcGFkX2NyYzoxOwkJLyogYml0IDIgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIGxlbl9jaGVjazoxOwkJLyogYml0IDQgKi8KLQkJdTMyIGh1Z2VfZnJhbWU6MTsJCS8qIGJpdCA1ICovCi0JCXUzMiByZXNlcnZlZDE6MjsJCS8qIGJpdHMgNi03ICovCi0JCXUzMiBpZl9tb2RlOjI7CQkvKiBiaXRzIDgtOSAqLwotCQl1MzIgcmVzZXJ2ZWQyOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiBwcmVhbWJsZV9sZW46NDsJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQzOjE2OwkJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfQ0ZHMl90LCAqUE1BQ19DRkcyX3Q7CisKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgSW50ZXJwYWNrZXQgZ2FwIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDA4Ci0gKi8KLXR5cGVkZWYgdW5pb24gX01BQ19JUEdfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6MTsJCS8qIGJpdCAzMSAqLwotCQl1MzIgbm9uX0IyQl9pcGdfMTo3OwkvKiBiaXRzIDI0LTMwICovCi0JCXUzMiB1bmRlZmluZWQyOjE7CQkvKiBiaXQgMjMgKi8KLQkJdTMyIG5vbl9CMkJfaXBnXzI6NzsJLyogYml0cyAxNi0yMiAqLwotCQl1MzIgbWluX2lmZ19lbmZvcmNlOjg7CS8qIGJpdHMgOC0xNSAqLwotCQl1MzIgdW5kZWZpbmVkMToxOwkJLyogYml0IDcgKi8KLQkJdTMyIEIyQl9pcGc6NzsJCS8qIGJpdHMgMC02ICovCi0jZWxzZQotCQl1MzIgQjJCX2lwZzo3OwkJLyogYml0cyAwLTYgKi8KLQkJdTMyIHVuZGVmaW5lZDE6MTsJCS8qIGJpdCA3ICovCi0JCXUzMiBtaW5faWZnX2VuZm9yY2U6ODsJLyogYml0cyA4LTE1ICovCi0JCXUzMiBub25fQjJCX2lwZ18yOjc7CS8qIGJpdHMgMTYtMjIgKi8KLQkJdTMyIHVuZGVmaW5lZDI6MTsJCS8qIGJpdCAyMyAqLwotCQl1MzIgbm9uX0IyQl9pcGdfMTo3OwkvKiBiaXRzIDI0LTMwICovCi0JCXUzMiByZXNlcnZlZDoxOwkJLyogYml0IDMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19JUEdfdCwgKlBNQUNfSVBHX3Q7Ci0KLS8qCisgKgorICogMzE6IHJlc2VydmVkCisgKiAzMC0yNDogbm9uIEIyQiBpcGcgMQorICogMjM6IHVuZGVmaW5lZAorICogMjItMTY6IG5vbiBCMkIgaXBnIDIKKyAqIDE1LTg6IE1pbiBpZmcgZW5mb3JjZQorICogNy0wOiBCMkIgaXBnCisgKgogICogc3RydWN0dXJlIGZvciBoYWxmIGR1cGxleCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwQworICogMzEtMjQ6IHJlc2VydmVkCisgKiAyMy0yMDogQWx0IEJFQiB0cnVuYworICogMTk6IEFsdCBCRUIgZW5hYmxlCisgKiAxODogQlAgbm8gYmFja29mZgorICogMTc6IG5vIGJhY2tvZmYKKyAqIDE2OiBleGNlc3MgZGVmZXIKKyAqIDE1LTEyOiByZS14bWl0IG1heAorICogMTEtMTA6IHJlc2VydmVkCisgKiA5LTA6IGNvbGxpc2lvbiB3aW5kb3cKICAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX0hGRFBfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQyOjg7CQkvKiBiaXRzIDI0LTMxICovCi0JCXUzMiBhbHRfYmViX3RydW5jOjQ7CS8qIGJpdHMgMjMtMjAgKi8KLQkJdTMyIGFsdF9iZWJfZW5hYmxlOjE7CS8qIGJpdCAxOSAqLwotCQl1MzIgYnBfbm9fYmFja29mZjoxOwkvKiBiaXQgMTggKi8KLQkJdTMyIG5vX2JhY2tvZmY6MTsJCS8qIGJpdCAxNyAqLwotCQl1MzIgZXhjZXNzX2RlZmVyOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgcmV4bWl0X21heDo0OwkJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQxOjI7CQkvKiBiaXRzIDEwLTExICovCi0JCXUzMiBjb2xsX3dpbmRvdzoxMDsJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBjb2xsX3dpbmRvdzoxMDsJLyogYml0cyAwLTkgKi8KLQkJdTMyIHJlc2VydmVkMToyOwkJLyogYml0cyAxMC0xMSAqLwotCQl1MzIgcmV4bWl0X21heDo0OwkJLyogYml0cyAxMi0xNSAqLwotCQl1MzIgZXhjZXNzX2RlZmVyOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgbm9fYmFja29mZjoxOwkJLyogYml0IDE3ICovCi0JCXUzMiBicF9ub19iYWNrb2ZmOjE7CS8qIGJpdCAxOCAqLwotCQl1MzIgYWx0X2JlYl9lbmFibGU6MTsJLyogYml0IDE5ICovCi0JCXUzMiBhbHRfYmViX3RydW5jOjQ7CS8qIGJpdHMgMjMtMjAgKi8KLQkJdTMyIHJlc2VydmVkMjo4OwkJLyogYml0cyAyNC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfSEZEUF90LCAqUE1BQ19IRkRQX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIE1heGltdW0gRnJhbWUgTGVuZ3RoIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDEwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDEwOiBiaXRzIDAtMTUgaG9sZCB0aGUgbGVuZ3RoLgogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfTUFYX0ZNX0xFTl90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotCQl1MzIgbWF4X2xlbjoxNjsJLyogYml0cyAwLTE1ICovCi0jZWxzZQotCQl1MzIgbWF4X2xlbjoxNjsJLyogYml0cyAwLTE1ICovCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfTUFYX0ZNX0xFTl90LCAqUE1BQ19NQVhfRk1fTEVOX3Q7CiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIFJlc2VydmUgMSByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgpAQCAtMTQ2OSwxODYgKzEyNDQsODcgQEAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIFRlc3QgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KICAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMUMKKyAqIHRlc3Q6IGJpdHMgMC0yLCByZXN0IHVudXNlZAogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfVEVTVF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiB1bnVzZWQ6Mjk7CS8qIGJpdHMgMy0zMSAqLwotCQl1MzIgbWFjX3Rlc3Q6MzsJLyogYml0cyAwLTIgKi8KLSNlbHNlCi0JCXUzMiBtYWNfdGVzdDozOwkvKiBiaXRzIDAtMiAqLwotCQl1MzIgdW51c2VkOjI5OwkvKiBiaXRzIDMtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX1RFU1RfdCwgKlBNQUNfVEVTVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDIwCisgKgorICogMzE6IHJlc2V0IE1JSSBtZ210CisgKiAzMC02OiB1bnVzZWQKKyAqIDU6IHNjYW4gYXV0byBpbmNyZW1lbnQKKyAqIDQ6IHByZWFtYmxlIHN1cHJlc3MKKyAqIDM6IHVuZGVmaW5lZAorICogMi0wOiBtZ210IGNsb2NrIHJlc2V0CiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0NGR190IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNldF9taWlfbWdtdDoxOwkvKiBiaXQgMzEgKi8KLQkJdTMyIHJlc2VydmVkOjI1OwkJLyogYml0cyA2LTMwICovCi0JCXUzMiBzY2FuX2F1dG9faW5jcmVtdDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgcHJlYW1ibGVfc3VwcHJlc3M6MTsJLyogYml0IDQgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIG1nbXRfY2xrX3Jlc2V0OjM7CS8qIGJpdHMgMC0yICovCi0jZWxzZQotCQl1MzIgbWdtdF9jbGtfcmVzZXQ6MzsJLyogYml0cyAwLTIgKi8KLQkJdTMyIHVuZGVmaW5lZDoxOwkJLyogYml0IDMgKi8KLQkJdTMyIHByZWFtYmxlX3N1cHByZXNzOjE7CS8qIGJpdCA0ICovCi0JCXUzMiBzY2FuX2F1dG9faW5jcmVtdDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MjU7CQkvKiBiaXRzIDYtMzAgKi8KLQkJdTMyIHJlc2V0X21paV9tZ210OjE7CS8qIGJpdCAzMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9DRkdfdCwgKlBNSUlfTUdNVF9DRkdfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQ29tbWFuZCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyNAorICogYml0IDE6IHNjYW4gY3ljbGUKKyAqIGJpdCAwOiByZWFkIGN5Y2xlCiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX0NNRF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNlcnZlZDozMDsJLyogYml0cyAyLTMxICovCi0JCXUzMiBzY2FuX2N5Y2xlOjE7CS8qIGJpdCAxICovCi0JCXUzMiByZWFkX2N5Y2xlOjE7CS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgcmVhZF9jeWNsZToxOwkvKiBiaXQgMCAqLwotCQl1MzIgc2Nhbl9jeWNsZToxOwkvKiBiaXQgMSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MzA7CS8qIGJpdHMgMi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9DTURfdCwgKlBNSUlfTUdNVF9DTURfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQWRkcmVzcyByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyOAorICogMzEtMTM6IHJlc2VydmVkCisgKiAxMi04OiBwaHkgYWRkcgorICogNy01OiByZXNlcnZlZAorICogNC0wOiByZWdpc3RlcgogICovCi10eXBlZGVmIHVuaW9uIF9NSUlfTUdNVF9BRERSX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkMjoxOTsJLyogYml0IDEzLTMxICovCi0JCXUzMiBwaHlfYWRkcjo1OwkvKiBiaXRzIDgtMTIgKi8KLQkJdTMyIHJlc2VydmVkMTozOwkvKiBiaXRzIDUtNyAqLwotCQl1MzIgcmVnX2FkZHI6NTsJLyogYml0cyAwLTQgKi8KLSNlbHNlCi0JCXUzMiByZWdfYWRkcjo1OwkvKiBiaXRzIDAtNCAqLwotCQl1MzIgcmVzZXJ2ZWQxOjM7CS8qIGJpdHMgNS03ICovCi0JCXUzMiBwaHlfYWRkcjo1OwkvKiBiaXRzIDgtMTIgKi8KLQkJdTMyIHJlc2VydmVkMjoxOTsJLyogYml0IDEzLTMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1JSV9NR01UX0FERFJfdCwgKlBNSUlfTUdNVF9BRERSX3Q7CisKKyNkZWZpbmUgTUlJX0FERFIocGh5LHJlZykJKChwaHkpIDw8IDggfCAocmVnKSkKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQ29udHJvbCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyQworICogMzEtMTY6IHJlc2VydmVkCisgKiAxNS0wOiBwaHkgY29udHJvbAogICovCi10eXBlZGVmIHVuaW9uIF9NSUlfTUdNVF9DVFJMX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHJlc2VydmVkOjE2OwkvKiBiaXRzIDE2LTMxICovCi0JCXUzMiBwaHlfY3RybDoxNjsJLyogYml0cyAwLTE1ICovCi0jZWxzZQotCQl1MzIgcGh5X2N0cmw6MTY7CS8qIGJpdHMgMC0xNSAqLwotCQl1MzIgcmVzZXJ2ZWQ6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUlJX01HTVRfQ1RSTF90LCAqUE1JSV9NR01UX0NUUkxfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgU3RhdHVzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDMwCisgKiAzMS0xNjogcmVzZXJ2ZWQKKyAqIDE1LTA6IHBoeSBjb250cm9sCiAgKi8KLXR5cGVkZWYgdW5pb24gX01JSV9NR01UX1NUQVRfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6MTY7CS8qIGJpdHMgMTYtMzEgKi8KLQkJdTMyIHBoeV9zdGF0OjE2OwkvKiBiaXRzIDAtMTUgKi8KLSNlbHNlCi0JCXUzMiBwaHlfc3RhdDoxNjsJLyogYml0cyAwLTE1ICovCi0JCXUzMiByZXNlcnZlZDoxNjsJLyogYml0cyAxNi0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNSUlfTUdNVF9TVEFUX3QsICpQTUlJX01HTVRfU1RBVF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBJbmRpY2F0b3JzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDM0CisgKiAzMS0zOiByZXNlcnZlZAorICogMjogbm90IHZhbGlkCisgKiAxOiBzY2FubmluZworICogMDogYnVzeQogICovCi10eXBlZGVmIHVuaW9uIF9NSUlfTUdNVF9JTkRJQ0FUT1JfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgcmVzZXJ2ZWQ6Mjk7CS8qIGJpdHMgMy0zMSAqLwotCQl1MzIgbm90X3ZhbGlkOjE7CS8qIGJpdCAyICovCi0JCXUzMiBzY2FubmluZzoxOwkvKiBiaXQgMSAqLwotCQl1MzIgYnVzeToxOwkvKiBiaXQgMCAqLwotI2Vsc2UKLQkJdTMyIGJ1c3k6MTsJLyogYml0IDAgKi8KLQkJdTMyIHNjYW5uaW5nOjE7CS8qIGJpdCAxICovCi0JCXUzMiBub3RfdmFsaWQ6MTsJLyogYml0IDIgKi8KLQkJdTMyIHJlc2VydmVkOjI5OwkvKiBiaXRzIDMtMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUlJX01HTVRfSU5ESUNBVE9SX3QsICpQTUlJX01HTVRfSU5ESUNBVE9SX3Q7CisKKyNkZWZpbmUgTUdNVF9CVVNZCTB4MDAwMDAwMDEJLyogYnVzeSAqLworI2RlZmluZSBNR01UX1dBSVQJMHgwMDAwMDAwNQkvKiBidXN5IHwgbm90IHZhbGlkICovCiAKIC8qCiAgKiBzdHJ1Y3R1cmUgZm9yIEludGVyZmFjZSBDb250cm9sIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCiAgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDM4CisgKgorICogMzE6IHJlc2V0IGlmIG1vZHVsZQorICogMzAtMjg6IHJlc2VydmVkCisgKiAyNzogdGJpIG1vZGUKKyAqIDI2OiBnaGQgbW9kZQorICogMjU6IGxoZCBtb2RlCisgKiAyNDogcGh5IG1vZGUKKyAqIDIzOiByZXNldCBwZXIgbWlpCisgKiAyMi0xNzogcmVzZXJ2ZWQKKyAqIDE2OiBzcGVlZAorICogMTU6IHJlc2V0IHBlMTAweAorICogMTQtMTE6IHJlc2VydmVkCisgKiAxMDogZm9yY2UgcXVpZXQKKyAqIDk6IG5vIGNpcGhlcgorICogODogZGlzYWJsZSBsaW5rIGZhaWwKKyAqIDc6IHJlc2V0IGdwc2kKKyAqIDYtMTogcmVzZXJ2ZWQKKyAqIDA6IGVuYWJsZSBqYWJiZXIgcHJvdGVjdGlvbgogICovCi10eXBlZGVmIHVuaW9uIF9NQUNfSUZfQ1RSTF90IHsKLQl1MzIgdmFsdWU7Ci0Jc3RydWN0IHsKLSNpZmRlZiBfQklUX0ZJRUxEU19IVE9MCi0JCXUzMiByZXNldF9pZl9tb2R1bGU6MTsJLyogYml0IDMxICovCi0JCXUzMiByZXNlcnZlZDQ6MzsJCS8qIGJpdCAyOC0zMCAqLwotCQl1MzIgdGJpX21vZGU6MTsJCS8qIGJpdCAyNyAqLwotCQl1MzIgZ2hkX21vZGU6MTsJCS8qIGJpdCAyNiAqLwotCQl1MzIgbGhkX21vZGU6MTsJCS8qIGJpdCAyNSAqLwotCQl1MzIgcGh5X21vZGU6MTsJCS8qIGJpdCAyNCAqLwotCQl1MzIgcmVzZXRfcGVyX21paToxOwkvKiBiaXQgMjMgKi8KLQkJdTMyIHJlc2VydmVkMzo2OwkJLyogYml0cyAxNy0yMiAqLwotCQl1MzIgc3BlZWQ6MTsJCS8qIGJpdCAxNiAqLwotCQl1MzIgcmVzZXRfcGUxMDB4OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmVzZXJ2ZWQyOjQ7CQkvKiBiaXRzIDExLTE0ICovCi0JCXUzMiBmb3JjZV9xdWlldDoxOwkJLyogYml0IDEwICovCi0JCXUzMiBub19jaXBoZXI6MTsJCS8qIGJpdCA5ICovCi0JCXUzMiBkaXNhYmxlX2xpbmtfZmFpbDoxOwkvKiBiaXQgOCAqLwotCQl1MzIgcmVzZXRfZ3BzaToxOwkJLyogYml0IDcgKi8KLQkJdTMyIHJlc2VydmVkMTo2OwkJLyogYml0cyAxLTYgKi8KLQkJdTMyIGVuYWJfamFiX3Byb3RlY3Q6MTsJLyogYml0IDAgKi8KLSNlbHNlCi0JCXUzMiBlbmFiX2phYl9wcm90ZWN0OjE7CS8qIGJpdCAwICovCi0JCXUzMiByZXNlcnZlZDE6NjsJCS8qIGJpdHMgMS02ICovCi0JCXUzMiByZXNldF9ncHNpOjE7CQkvKiBiaXQgNyAqLwotCQl1MzIgZGlzYWJsZV9saW5rX2ZhaWw6MTsJLyogYml0IDggKi8KLQkJdTMyIG5vX2NpcGhlcjoxOwkJLyogYml0IDkgKi8KLQkJdTMyIGZvcmNlX3F1aWV0OjE7CQkvKiBiaXQgMTAgKi8KLQkJdTMyIHJlc2VydmVkMjo0OwkJLyogYml0cyAxMS0xNCAqLwotCQl1MzIgcmVzZXRfcGUxMDB4OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgc3BlZWQ6MTsJCS8qIGJpdCAxNiAqLwotCQl1MzIgcmVzZXJ2ZWQzOjY7CQkvKiBiaXRzIDE3LTIyICovCi0JCXUzMiByZXNldF9wZXJfbWlpOjE7CS8qIGJpdCAyMyAqLwotCQl1MzIgcGh5X21vZGU6MTsJCS8qIGJpdCAyNCAqLwotCQl1MzIgbGhkX21vZGU6MTsJCS8qIGJpdCAyNSAqLwotCQl1MzIgZ2hkX21vZGU6MTsJCS8qIGJpdCAyNiAqLwotCQl1MzIgdGJpX21vZGU6MTsJCS8qIGJpdCAyNyAqLwotCQl1MzIgcmVzZXJ2ZWQ0OjM7CQkvKiBiaXQgMjgtMzAgKi8KLQkJdTMyIHJlc2V0X2lmX21vZHVsZToxOwkvKiBiaXQgMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gTUFDX0lGX0NUUkxfdCwgKlBNQUNfSUZfQ1RSTF90OwogCiAvKgogICogc3RydWN0dXJlIGZvciBJbnRlcmZhY2UgU3RhdHVzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCkBAIC0xNzI5LDIxICsxNDA1LDIxIEBACiAgKiBNQUMgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCiAgKi8KIHR5cGVkZWYgc3RydWN0IF9NQUNfdCB7CQkJCQkvKiBMb2NhdGlvbjogKi8KLQlNQUNfQ0ZHMV90IGNmZzE7CQkJCS8qICAweDUwMDAgKi8KLQlNQUNfQ0ZHMl90IGNmZzI7CQkJCS8qICAweDUwMDQgKi8KLQlNQUNfSVBHX3QgaXBnOwkJCQkJLyogIDB4NTAwOCAqLwotCU1BQ19IRkRQX3QgaGZkcDsJCQkJLyogIDB4NTAwQyAqLwotCU1BQ19NQVhfRk1fTEVOX3QgbWF4X2ZtX2xlbjsJCQkvKiAgMHg1MDEwICovCisJdTMyIGNmZzE7CQkJCQkvKiAgMHg1MDAwICovCisJdTMyIGNmZzI7CQkJCQkvKiAgMHg1MDA0ICovCisJdTMyIGlwZzsJCQkJCS8qICAweDUwMDggKi8KKwl1MzIgaGZkcDsJCQkJCS8qICAweDUwMEMgKi8KKwl1MzIgbWF4X2ZtX2xlbjsJCQkJCS8qICAweDUwMTAgKi8KIAl1MzIgcnN2MTsJCQkJCS8qICAweDUwMTQgKi8KIAl1MzIgcnN2MjsJCQkJCS8qICAweDUwMTggKi8KLQlNQUNfVEVTVF90IG1hY190ZXN0OwkJCQkvKiAgMHg1MDFDICovCi0JTUlJX01HTVRfQ0ZHX3QgbWlpX21nbXRfY2ZnOwkJCS8qICAweDUwMjAgKi8KLQlNSUlfTUdNVF9DTURfdCBtaWlfbWdtdF9jbWQ7CQkJLyogIDB4NTAyNCAqLwotCU1JSV9NR01UX0FERFJfdCBtaWlfbWdtdF9hZGRyOwkJCS8qICAweDUwMjggKi8KLQlNSUlfTUdNVF9DVFJMX3QgbWlpX21nbXRfY3RybDsJCQkvKiAgMHg1MDJDICovCi0JTUlJX01HTVRfU1RBVF90IG1paV9tZ210X3N0YXQ7CQkJLyogIDB4NTAzMCAqLwotCU1JSV9NR01UX0lORElDQVRPUl90IG1paV9tZ210X2luZGljYXRvcjsJLyogIDB4NTAzNCAqLwotCU1BQ19JRl9DVFJMX3QgaWZfY3RybDsJCQkJLyogIDB4NTAzOCAqLworCXUzMiBtYWNfdGVzdDsJCQkJCS8qICAweDUwMUMgKi8KKwl1MzIgbWlpX21nbXRfY2ZnOwkJCQkvKiAgMHg1MDIwICovCisJdTMyIG1paV9tZ210X2NtZDsJCQkJLyogIDB4NTAyNCAqLworCXUzMiBtaWlfbWdtdF9hZGRyOwkJCQkvKiAgMHg1MDI4ICovCisJdTMyIG1paV9tZ210X2N0cmw7CQkJCS8qICAweDUwMkMgKi8KKwl1MzIgbWlpX21nbXRfc3RhdDsJCQkJLyogIDB4NTAzMCAqLworCXUzMiBtaWlfbWdtdF9pbmRpY2F0b3I7CQkJCS8qICAweDUwMzQgKi8KKwl1MzIgaWZfY3RybDsJCQkJCS8qICAweDUwMzggKi8KIAlNQUNfSUZfU1RBVF90IGlmX3N0YXQ7CQkJCS8qICAweDUwM0MgKi8KIAlNQUNfU1RBVElPTl9BRERSMV90IHN0YXRpb25fYWRkcl8xOwkJLyogIDB4NTA0MCAqLwogCU1BQ19TVEFUSU9OX0FERFIyX3Qgc3RhdGlvbl9hZGRyXzI7CQkvKiAgMHg1MDQ0ICovCkBAIC0xNzU2LDEyMCArMTQzMiw2MCBAQAogLyoKICAqIHN0cnVjdHVyZSBmb3IgQ2FycnkgUmVnaXN0ZXIgT25lIGFuZCBpdCdzIE1hc2sgUmVnaXN0ZXIgcmVnIGxvY2F0ZWQgaW4gbWFjCiAgKiBzdGF0IGFkZHJlc3MgbWFwIGFkZHJlc3MgMHg2MTMwIGFuZCAweDYxMzguCisgKgorICogMzE6IHRyNjQKKyAqIDMwOiB0cjEyNworICogMjk6IHRyMjU1CisgKiAyODogdHI1MTEKKyAqIDI3OiB0cjFrCisgKiAyNjogdHJtYXgKKyAqIDI1OiB0cm1ndgorICogMjQtMTc6IHVudXNlZAorICogMTY6IHJieXQKKyAqIDE1OiBycGt0CisgKiAxNDogcmZjcworICogMTM6IHJtY2EKKyAqIDEyOiByYmNhCisgKiAxMTogcnhjZgorICogMTA6IHJ4cGYKKyAqIDk6IHJ4dW8KKyAqIDg6IHJhbG4KKyAqIDc6IHJmbHIKKyAqIDY6IHJjZGUKKyAqIDU6IHJjc2UKKyAqIDQ6IHJ1bmQKKyAqIDM6IHJvdnIKKyAqIDI6IHJmcmcKKyAqIDE6IHJqYnIKKyAqIDA6IHJkcnAKICAqLwotdHlwZWRlZiB1bmlvbiBfTUFDX1NUQVRfUkVHXzFfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdHI2NDoxOwkvKiBiaXQgMzEgKi8KLQkJdTMyIHRyMTI3OjE7CS8qIGJpdCAzMCAqLwotCQl1MzIgdHIyNTU6MTsJLyogYml0IDI5ICovCi0JCXUzMiB0cjUxMToxOwkvKiBiaXQgMjggKi8KLQkJdTMyIHRyMWs6MTsJLyogYml0IDI3ICovCi0JCXUzMiB0cm1heDoxOwkvKiBiaXQgMjYgKi8KLQkJdTMyIHRybWd2OjE7CS8qIGJpdCAyNSAqLwotCQl1MzIgdW51c2VkOjg7CS8qIGJpdHMgMTctMjQgKi8KLQkJdTMyIHJieXQ6MTsJLyogYml0IDE2ICovCi0JCXUzMiBycGt0OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmZjczoxOwkvKiBiaXQgMTQgKi8KLQkJdTMyIHJtY2E6MTsJLyogYml0IDEzICovCi0JCXUzMiByYmNhOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcnhjZjoxOwkvKiBiaXQgMTEgKi8KLQkJdTMyIHJ4cGY6MTsJLyogYml0IDEwICovCi0JCXUzMiByeHVvOjE7CS8qIGJpdCA5ICovCi0JCXUzMiByYWxuOjE7CS8qIGJpdCA4ICovCi0JCXUzMiByZmxyOjE7CS8qIGJpdCA3ICovCi0JCXUzMiByY2RlOjE7CS8qIGJpdCA2ICovCi0JCXUzMiByY3NlOjE7CS8qIGJpdCA1ICovCi0JCXUzMiBydW5kOjE7CS8qIGJpdCA0ICovCi0JCXUzMiByb3ZyOjE7CS8qIGJpdCAzICovCi0JCXUzMiByZnJnOjE7CS8qIGJpdCAyICovCi0JCXUzMiByamJyOjE7CS8qIGJpdCAxICovCi0JCXUzMiByZHJwOjE7CS8qIGJpdCAwICovCi0jZWxzZQotCQl1MzIgcmRycDoxOwkvKiBiaXQgMCAqLwotCQl1MzIgcmpicjoxOwkvKiBiaXQgMSAqLwotCQl1MzIgcmZyZzoxOwkvKiBiaXQgMiAqLwotCQl1MzIgcm92cjoxOwkvKiBiaXQgMyAqLwotCQl1MzIgcnVuZDoxOwkvKiBiaXQgNCAqLwotCQl1MzIgcmNzZToxOwkvKiBiaXQgNSAqLwotCQl1MzIgcmNkZToxOwkvKiBiaXQgNiAqLwotCQl1MzIgcmZscjoxOwkvKiBiaXQgNyAqLwotCQl1MzIgcmFsbjoxOwkvKiBiaXQgOCAqLwotCQl1MzIgcnh1bzoxOwkvKiBiaXQgOSAqLwotCQl1MzIgcnhwZjoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIHJ4Y2Y6MTsJLyogYml0IDExICovCi0JCXUzMiByYmNhOjE7CS8qIGJpdCAxMiAqLwotCQl1MzIgcm1jYToxOwkvKiBiaXQgMTMgKi8KLQkJdTMyIHJmY3M6MTsJLyogYml0IDE0ICovCi0JCXUzMiBycGt0OjE7CS8qIGJpdCAxNSAqLwotCQl1MzIgcmJ5dDoxOwkvKiBiaXQgMTYgKi8KLQkJdTMyIHVudXNlZDo4OwkvKiBiaXRzIDE3LTI0ICovCi0JCXUzMiB0cm1ndjoxOwkvKiBiaXQgMjUgKi8KLQkJdTMyIHRybWF4OjE7CS8qIGJpdCAyNiAqLwotCQl1MzIgdHIxazoxOwkvKiBiaXQgMjcgKi8KLQkJdTMyIHRyNTExOjE7CS8qIGJpdCAyOCAqLwotCQl1MzIgdHIyNTU6MTsJLyogYml0IDI5ICovCi0JCXUzMiB0cjEyNzoxOwkvKiBiaXQgMzAgKi8KLQkJdTMyIHRyNjQ6MTsJLyogYml0IDMxICovCi0jZW5kaWYKLQl9IGJpdHM7Ci19IE1BQ19TVEFUX1JFR18xX3QsICpQTUFDX1NUQVRfUkVHXzFfdDsKIAogLyoKICAqIHN0cnVjdHVyZSBmb3IgQ2FycnkgUmVnaXN0ZXIgVHdvIE1hc2sgUmVnaXN0ZXIgcmVnIGluIG1hYyBzdGF0IGFkZHJlc3MgbWFwLgogICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NjEzQworICoKKyAqIDMxLTIwOiB1bnVzZWQKKyAqIDE5OiB0amJyCisgKiAxODogdGZjcworICogMTc6IHR4Y2YKKyAqIDE2OiB0b3ZyCisgKiAxNTogdHVuZAorICogMTQ6IHRyZmcKKyAqIDEzOiB0Ynl0CisgKiAxMjogdHBrdAorICogMTE6IHRtY2EKKyAqIDEwOiB0YmNhCisgKiA5OiB0eHBmCisgKiA4OiB0ZGZyCisgKiA3OiB0ZWRmCisgKiA2OiB0c2NsCisgKiA1OiB0bWNsCisgKiA0OiB0bGNsCisgKiAzOiB0eGNsCisgKiAyOiB0bmNsCisgKiAxOiB0cGZoCisgKiAwOiB0ZHJwCiAgKi8KLXR5cGVkZWYgdW5pb24gX01BQ19TVEFUX1JFR18yX3QgewotCXUzMiB2YWx1ZTsKLQlzdHJ1Y3QgewotI2lmZGVmIF9CSVRfRklFTERTX0hUT0wKLQkJdTMyIHVudXNlZDoxMjsJLyogYml0IDIwLTMxICovCi0JCXUzMiB0amJyOjE7CS8qIGJpdCAxOSAqLwotCQl1MzIgdGZjczoxOwkvKiBiaXQgMTggKi8KLQkJdTMyIHR4Y2Y6MTsJLyogYml0IDE3ICovCi0JCXUzMiB0b3ZyOjE7CS8qIGJpdCAxNiAqLwotCQl1MzIgdHVuZDoxOwkvKiBiaXQgMTUgKi8KLQkJdTMyIHRmcmc6MTsJLyogYml0IDE0ICovCi0JCXUzMiB0Ynl0OjE7CS8qIGJpdCAxMyAqLwotCQl1MzIgdHBrdDoxOwkvKiBiaXQgMTIgKi8KLQkJdTMyIHRtY2E6MTsJLyogYml0IDExICovCi0JCXUzMiB0YmNhOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgdHhwZjoxOwkvKiBiaXQgOSAqLwotCQl1MzIgdGRmcjoxOwkvKiBiaXQgOCAqLwotCQl1MzIgdGVkZjoxOwkvKiBiaXQgNyAqLwotCQl1MzIgdHNjbDoxOwkvKiBiaXQgNiAqLwotCQl1MzIgdG1jbDoxOwkvKiBiaXQgNSAqLwotCQl1MzIgdGxjbDoxOwkvKiBiaXQgNCAqLwotCQl1MzIgdHhjbDoxOwkvKiBiaXQgMyAqLwotCQl1MzIgdG5jbDoxOwkvKiBiaXQgMiAqLwotCQl1MzIgdHBmaDoxOwkvKiBiaXQgMSAqLwotCQl1MzIgdGRycDoxOwkvKiBiaXQgMCAqLwotI2Vsc2UKLQkJdTMyIHRkcnA6MTsJLyogYml0IDAgKi8KLQkJdTMyIHRwZmg6MTsJLyogYml0IDEgKi8KLQkJdTMyIHRuY2w6MTsJLyogYml0IDIgKi8KLQkJdTMyIHR4Y2w6MTsJLyogYml0IDMgKi8KLQkJdTMyIHRsY2w6MTsJLyogYml0IDQgKi8KLQkJdTMyIHRtY2w6MTsJLyogYml0IDUgKi8KLQkJdTMyIHRzY2w6MTsJLyogYml0IDYgKi8KLQkJdTMyIHRlZGY6MTsJLyogYml0IDcgKi8KLQkJdTMyIHRkZnI6MTsJLyogYml0IDggKi8KLQkJdTMyIHR4cGY6MTsJLyogYml0IDkgKi8KLQkJdTMyIHRiY2E6MTsJLyogYml0IDEwICovCi0JCXUzMiB0bWNhOjE7CS8qIGJpdCAxMSAqLwotCQl1MzIgdHBrdDoxOwkvKiBiaXQgMTIgKi8KLQkJdTMyIHRieXQ6MTsJLyogYml0IDEzICovCi0JCXUzMiB0ZnJnOjE7CS8qIGJpdCAxNCAqLwotCQl1MzIgdHVuZDoxOwkvKiBiaXQgMTUgKi8KLQkJdTMyIHRvdnI6MTsJLyogYml0IDE2ICovCi0JCXUzMiB0eGNmOjE7CS8qIGJpdCAxNyAqLwotCQl1MzIgdGZjczoxOwkvKiBiaXQgMTggKi8KLQkJdTMyIHRqYnI6MTsJLyogYml0IDE5ICovCi0JCXUzMiB1bnVzZWQ6MTI7CS8qIGJpdCAyMC0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBNQUNfU1RBVF9SRUdfMl90LCAqUE1BQ19TVEFUX1JFR18yX3Q7CiAKIC8qCiAgKiBNQUMgU1RBVFMgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCkBAIC0yMDEwLDE2ICsxNjI2LDE2IEBACiAJdTMyIFRGcmc7CQkJLyogIDB4NjEyQyAqLwogCiAJLyogQ2FycnkgUmVnaXN0ZXIgT25lIFJlZ2lzdGVyICovCi0JTUFDX1NUQVRfUkVHXzFfdCBDYXJyeTE7CS8qICAweDYxMzAgKi8KKwl1MzIgQ2FycnkxOwkJCS8qICAweDYxMzAgKi8KIAogCS8qIENhcnJ5IFJlZ2lzdGVyIFR3byBSZWdpc3RlciAqLwotCU1BQ19TVEFUX1JFR18yX3QgQ2FycnkyOwkvKiAgMHg2MTM0ICovCisJdTMyIENhcnJ5MjsJCQkvKiAgMHg2MTM0ICovCiAKIAkvKiBDYXJyeSBSZWdpc3RlciBPbmUgTWFzayBSZWdpc3RlciAqLwotCU1BQ19TVEFUX1JFR18xX3QgQ2FycnkxTTsJLyogIDB4NjEzOCAqLworCXUzMiBDYXJyeTFNOwkJCS8qICAweDYxMzggKi8KIAogCS8qIENhcnJ5IFJlZ2lzdGVyIFR3byBNYXNrIFJlZ2lzdGVyICovCi0JTUFDX1NUQVRfUkVHXzJfdCBDYXJyeTJNOwkvKiAgMHg2MTNDICovCisJdTMyIENhcnJ5Mk07CQkJLyogIDB4NjEzQyAqLwogfSBNQUNfU1RBVF90LCAqUE1BQ19TVEFUX3Q7CiAKIC8qIEVORCBPRiBNQUMgU1RBVCBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYwppbmRleCBjODUzYTJjLi5iY2NhMWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYwpAQCAtOTUsMTk4ICs5NSwxMjAgQEAKICNpbmNsdWRlICJldDEzMTBfdHguaCIKIAogCi0vKgotICogRUVQUk9NIERlZmluZXMKLSAqLwogCi0vKiBMQkNJRiBSZWdpc3RlciBHcm91cHMgKGFkZHJlc3NlZCB2aWEgMzItYml0IG9mZnNldHMpICovCi0jZGVmaW5lIExCQ0lGX0RXT1JEMF9HUk9VUF9PRkZTRVQgICAgICAgMHhBQwotI2RlZmluZSBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VUICAgICAgIDB4QjAKK3N0YXRpYyBpbnQgZWVwcm9tX3dhaXRfcmVhZHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiAqc3RhdHVzKQoreworCXUzMiByZWc7CisJaW50IGk7CiAKLS8qIExCQ0lGIFJlZ2lzdGVycyAoYWRkcmVzc2VkIHZpYSA4LWJpdCBvZmZzZXRzKSAqLwotI2RlZmluZSBMQkNJRl9BRERSRVNTX1JFR0lTVEVSX09GRlNFVCAgIDB4QUMKLSNkZWZpbmUgTEJDSUZfREFUQV9SRUdJU1RFUl9PRkZTRVQgICAgICAweEIwCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VUICAgMHhCMQotI2RlZmluZSBMQkNJRl9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgIDB4QjIKKwkvKgorCSAqIDEuIENoZWNrIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBmb3IgYml0cyA2ICYgMzoyIGFsbCBlcXVhbCB0byAwIGFuZAorCSAqICAgIGJpdHMgNywxOjAgYm90aCBlcXVhbCB0byAxLCBhdCBsZWFzdCBvbmNlIGFmdGVyIHJlc2V0LgorCSAqICAgIFN1YnNlcXVlbnQgb3BlcmF0aW9ucyBuZWVkIG9ubHkgdG8gY2hlY2sgdGhhdCBiaXRzIDE6MCBhcmUgZXF1YWwKKwkgKiAgICB0byAxIHByaW9yIHRvIHN0YXJ0aW5nIGEgc2luZ2xlIGJ5dGUgcmVhZC93cml0ZQorCSAqLwogCi0vKiBMQkNJRiBDb250cm9sIFJlZ2lzdGVyIEJpdHMgKi8KLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9TRVFVRU5USUFMX1JFQUQgICAweDAxCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfUEFHRV9XUklURSAgICAgICAgMHgwMgotI2RlZmluZSBMQkNJRl9DT05UUk9MX1VOVVNFRDEgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9FRVBST01fUkVMT0FEICAgICAweDA4Ci0jZGVmaW5lIExCQ0lGX0NPTlRST0xfVU5VU0VEMiAgICAgICAgICAgMHgxMAotI2RlZmluZSBMQkNJRl9DT05UUk9MX1RXT19CWVRFX0FERFIgICAgIDB4MjAKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9JMkNfV1JJVEUgICAgICAgICAweDQwCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFICAgICAgMHg4MAorCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBpKyspIHsKKwkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVAsICZyZWcpKQorCQkJcmV0dXJuIC1FSU87CiAKLS8qIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBCaXRzICovCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgICAgMHgwMQotI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0FDS19FUlJPUiAgICAgICAgICAweDA0Ci0jZGVmaW5lIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SICAgICAgMHgwOAotI2RlZmluZSBMQkNJRl9TVEFUVVNfVU5VU0VEICAgICAgICAgICAgIDB4MzAKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0NIRUNLU1VNX0VSUk9SICAgICAweDQwCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19FRVBST01fUFJFU0VOVCAgICAgMHg4MAorCQkvKiBJMkMgaWRsZSBhbmQgUGh5IFF1ZXVlIEF2YWlsIGJvdGggdHJ1ZSAqLworCQlpZiAoKHJlZyAmIDB4MzAwMCkgPT0gMHgzMDAwKSB7CisJCQlpZiAoc3RhdHVzKQorCQkJCSpzdGF0dXMgPSByZWc7CisJCQlyZXR1cm4gcmVnICYgMHhGRjsKKwkJfQorCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KIAotLyogTWlzY2VsbGFuZW91cyBDb25zdHJhaW50cyAqLwotI2RlZmluZSBNQVhfTlVNX1JFR0lTVEVSX1BPTExTICAgICAgICAgIDEwMDAKLSNkZWZpbmUgTUFYX05VTV9XUklURV9SRVRSSUVTICAgICAgICAgICAyCi0KLS8qCi0gKiBEZWZpbmUgbWFjcm9zIHRoYXQgYWxsb3cgaW5kaXZpZHVhbCByZWdpc3RlciB2YWx1ZXMgdG8gYmUgZXh0cmFjdGVkIGZyb20gYQotICogRFdPUkQxIHJlZ2lzdGVyIGdyb3VwaW5nCi0gKi8KLSNkZWZpbmUgRVhUUkFDVF9EQVRBX1JFR0lTVEVSKHgpICAgICh1OCkoeCAmIDB4RkYpCi0jZGVmaW5lIEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKHgpICAodTgpKCh4ID4+IDE2KSAmIDB4RkYpCi0jZGVmaW5lIEVYVFJBQ1RfQ09OVFJPTF9SRUcoeCkgICAgICAodTgpKCh4ID4+IDgpICYgMHhGRikKIAogLyoqCi0gKiBFZXByb21Xcml0ZUJ5dGUgLSBXcml0ZSBhIGJ5dGUgdG8gdGhlIEVUMTMxMCdzIEVFUFJPTQorICogZWVwcm9tX3dyaXRlIC0gV3JpdGUgYSBieXRlIHRvIHRoZSBFVDEzMTAncyBFRVBST00KICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQGFkZHI6IHRoZSBhZGRyZXNzIHRvIHdyaXRlCiAgKiBAZGF0YTogdGhlIHZhbHVlIHRvIHdyaXRlCiAgKgotICogUmV0dXJucyBTVUNDRVNTIG9yIEZBSUxVUkUKKyAqIFJldHVybnMgMSBmb3IgYSBzdWNjZXNzZnVsIHdyaXRlLgogICovCi1pbnQgRWVwcm9tV3JpdGVCeXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHUzMiBhZGRyLCB1OCBkYXRhKQorc3RhdGljIGludCBlZXByb21fd3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTMyIGFkZHIsIHU4IGRhdGEpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBldGRldi0+cGRldjsKLQlpbnQgaW5kZXg7CisJaW50IGluZGV4ID0gMDsKIAlpbnQgcmV0cmllczsKIAlpbnQgZXJyID0gMDsKIAlpbnQgaTJjX3dhY2sgPSAwOwogCWludCB3cml0ZW9rID0gMDsKLQl1OCBjb250cm9sOwotCXU4IHN0YXR1cyA9IDA7Ci0JdTMyIGR3b3JkMSA9IDA7CisJdTMyIHN0YXR1czsKIAl1MzIgdmFsID0gMDsKIAogCS8qCi0JICogVGhlIGZvbGxvd2luZyBleGNlcnB0IGlzIGZyb20gIlNlcmlhbCBFRVBST00gSFcgRGVzaWduCi0JICogU3BlY2lmaWNhdGlvbiIgVmVyc2lvbiAwLjkyICg5LzIwLzIwMDQpOgotCSAqCi0JICogU2luZ2xlIEJ5dGUgV3JpdGVzCi0JICoKIAkgKiBGb3IgYW4gRUVQUk9NLCBhbiBJMkMgc2luZ2xlIGJ5dGUgd3JpdGUgaXMgZGVmaW5lZCBhcyBhIFNUQVJUCiAJICogY29uZGl0aW9uIGZvbGxvd2VkIGJ5IHRoZSBkZXZpY2UgYWRkcmVzcywgRUVQUk9NIGFkZHJlc3MsIG9uZSBieXRlCiAJICogb2YgZGF0YSBhbmQgYSBTVE9QIGNvbmRpdGlvbi4gIFRoZSBTVE9QIGNvbmRpdGlvbiB3aWxsIHRyaWdnZXIgdGhlCiAJICogRUVQUk9NJ3MgaW50ZXJuYWxseSB0aW1lZCB3cml0ZSBjeWNsZSB0byB0aGUgbm9udm9sYXRpbGUgbWVtb3J5LgogCSAqIEFsbCBpbnB1dHMgYXJlIGRpc2FibGVkIGR1cmluZyB0aGlzIHdyaXRlIGN5Y2xlIGFuZCB0aGUgRUVQUk9NIHdpbGwKIAkgKiBub3QgcmVzcG9uZCB0byBhbnkgYWNjZXNzIHVudGlsIHRoZSBpbnRlcm5hbCB3cml0ZSBpcyBjb21wbGV0ZS4KLQkgKiBUaGUgc3RlcHMgdG8gZXhlY3V0ZSBhIHNpbmdsZSBieXRlIHdyaXRlIGFyZSBhcyBmb2xsb3dzOgotCSAqCi0JICogMS4gQ2hlY2sgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIGZvciBiaXRzIDYgJiAzOjIgYWxsIGVxdWFsIHRvIDAgYW5kCi0JICogICAgYml0cyA3LDE6MCBib3RoIGVxdWFsIHRvIDEsIGF0IGxlYXN0IG9uY2UgYWZ0ZXIgcmVzZXQuCi0JICogICAgU3Vic2VxdWVudCBvcGVyYXRpb25zIG5lZWQgb25seSB0byBjaGVjayB0aGF0IGJpdHMgMTowIGFyZQotCSAqICAgIGVxdWFsIHRvIDEgcHJpb3IgdG8gc3RhcnRpbmcgYSBzaW5nbGUgYnl0ZSB3cml0ZS4KLQkgKgorCSAqLworCisJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSAvKgogCSAqIDIuIFdyaXRlIHRvIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyOiAgYml0IDc9MSwgYml0IDY9MSwgYml0IDM9MCwKIAkgKiAgICBhbmQgYml0cyAxOjAgYm90aCA9MC4gIEJpdCA1IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZQogCSAqICAgIHR5cGUgb2YgRUVQUk9NIGJlaW5nIGFjY2Vzc2VkICgxPXR3byBieXRlIGFkZHJlc3NpbmcsIDA9b25lCiAJICogICAgYnl0ZSBhZGRyZXNzaW5nKS4KLQkgKgotCSAqIDMuIFdyaXRlIHRoZSBhZGRyZXNzIHRvIHRoZSBMQkNJRiBBZGRyZXNzIFJlZ2lzdGVyLgotCSAqCi0JICogNC4gV3JpdGUgdGhlIGRhdGEgdG8gdGhlIExCQ0lGIERhdGEgUmVnaXN0ZXIgKHRoZSBJMkMgd3JpdGUgd2lsbAotCSAqICAgIGJlZ2luKS4KLQkgKgotCSAqIDUuIE1vbml0b3IgYml0IDE6MCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiBiaXRzIDE6MCBhcmUKLQkgKiAgICBib3RoIGVxdWFsIHRvIDEsIHRoZSBJMkMgd3JpdGUgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIGludGVybmFsCi0JICogICAgd3JpdGUgY3ljbGUgb2YgdGhlIEVFUFJPTSBpcyBhYm91dCB0byBzdGFydC4gKGJpdHMgMTowID0gMDEgaXMKLQkgKiAgICBhIGxlZ2FsIHN0YXRlIHdoaWxlIHdhaXRpbmcgZnJvbSBib3RoIGVxdWFsIHRvIDEsIGJ1dCBiaXRzCi0JICogICAgMTowID0gMTAgaXMgaW52YWxpZCBhbmQgaW1wbGllcyB0aGF0IHNvbWV0aGluZyBpcyBicm9rZW4pLgotCSAqCi0JICogNi4gQ2hlY2sgYml0IDMgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmICBlcXVhbCB0byAxLCBhbgotCSAqICAgIGVycm9yIGhhcyBvY2N1cnJlZC4KLQkgKgotCSAqIDcuIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiBlcXVhbCB0byAxIGFuIEFDSwotCSAqICAgIGVycm9yIGhhcyBvY2N1cnJlZCBvbiB0aGUgYWRkcmVzcyBwaGFzZSBvZiB0aGUgd3JpdGUuICBUaGlzCi0JICogICAgY291bGQgYmUgZHVlIHRvIGFuIGFjdHVhbCBoYXJkd2FyZSBmYWlsdXJlIG9yIHRoZSBFRVBST00gbWF5Ci0JICogICAgc3RpbGwgYmUgaW4gaXRzIGludGVybmFsIHdyaXRlIGN5Y2xlIGZyb20gYSBwcmV2aW91cyB3cml0ZS4KLQkgKiAgICBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZSByZXBlYXRlZCBsYXRlci4KLQkgKgotCSAqIDguIFNldCBiaXQgNiBvZiB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlciA9IDAuIElmIGFub3RoZXIgd3JpdGUgaXMKLQkgKiAgICByZXF1aXJlZCwgZ28gdG8gc3RlcCAxLgogCSAqLwotCi0JLyogU3RlcCAxOiAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fUkVHSVNURVJfUE9MTFM7IGluZGV4KyspIHsKLQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VULAotCQkJCQkgICZkd29yZDEpKSB7Ci0JCQllcnIgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUihkd29yZDEpOwotCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMICYmCi0JCQlzdGF0dXMgJiBMQkNJRl9TVEFUVVNfSTJDX0lETEUpCi0JCQkvKiBiaXRzIDE6MCBhcmUgZXF1YWwgdG8gMSAqLwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCi0JCXJldHVybiBGQUlMVVJFOwotCi0JLyogU3RlcCAyOiAqLwotCWNvbnRyb2wgPSAwOwotCWNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgfCBMQkNJRl9DT05UUk9MX0kyQ19XUklURTsKLQotCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUl9PRkZTRVQsCi0JCQkJICBjb250cm9sKSkgewotCQlyZXR1cm4gRkFJTFVSRTsKLQl9CisJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSLAorCQkJTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgfCBMQkNJRl9DT05UUk9MX0kyQ19XUklURSkpCisJCXJldHVybiAtRUlPOwogCiAJaTJjX3dhY2sgPSAxOwogCiAJLyogUHJlcGFyZSBFRVBST00gYWRkcmVzcyBmb3IgU3RlcCAzICovCiAKIAlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgTUFYX05VTV9XUklURV9SRVRSSUVTOyByZXRyaWVzKyspIHsKLQkJLyogU3RlcCAzOiovCi0JCWlmIChwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0FERFJFU1NfUkVHSVNURVJfT0ZGU0VULAotCQkJCQkgICBhZGRyKSkgeworCQkvKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAqLworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKIAkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU3RlcCA0OiAqLwotCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0RBVEFfUkVHSVNURVJfT0ZGU0VULAotCQkJCQkgIGRhdGEpKSB7CisJCS8qCisJCSAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBMQkNJRiBEYXRhIFJlZ2lzdGVyICh0aGUgSTJDIHdyaXRlCisJCSAqIHdpbGwgYmVnaW4pLgorCQkgKi8KKwkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9EQVRBX1JFR0lTVEVSLCBkYXRhKSkKIAkJCWJyZWFrOwotCQl9CisJCS8qCisJCSAqIE1vbml0b3IgYml0IDE6MCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiBiaXRzCisJCSAqIDE6MCBhcmUgYm90aCBlcXVhbCB0byAxLCB0aGUgSTJDIHdyaXRlIGhhcyBjb21wbGV0ZWQgYW5kIHRoZQorCQkgKiBpbnRlcm5hbCB3cml0ZSBjeWNsZSBvZiB0aGUgRUVQUk9NIGlzIGFib3V0IHRvIHN0YXJ0LgorCQkgKiAoYml0cyAxOjAgPSAwMSBpcyBhIGxlZ2FsIHN0YXRlIHdoaWxlIHdhaXRpbmcgZnJvbSBib3RoCisJCSAqIGVxdWFsIHRvIDEsIGJ1dCBiaXRzIDE6MCA9IDEwIGlzIGludmFsaWQgYW5kIGltcGxpZXMgdGhhdAorCQkgKiBzb21ldGhpbmcgaXMgYnJva2VuKS4KKwkJICovCisJCWVyciA9IGVlcHJvbV93YWl0X3JlYWR5KHBkZXYsICZzdGF0dXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiAwOwogCi0JCS8qIFN0ZXAgNTogKi8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaW5kZXgrKykgewotCQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKLQkJCQkJCSAgTEJDSUZfRFdPUkQxX0dST1VQX09GRlNFVCwKLQkJCQkJCSAgJmR3b3JkMSkpIHsKLQkJCQllcnIgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzdGF0dXMgPSBFWFRSQUNUX1NUQVRVU19SRUdJU1RFUihkd29yZDEpOwotCi0JCQlpZiAoc3RhdHVzICYgTEJDSUZfU1RBVFVTX1BIWV9RVUVVRV9BVkFJTCAmJgotCQkJCXN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkgewotCQkJCS8qIEkyQyB3cml0ZSBjb21wbGV0ZSAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCisJCS8qCisJCSAqIENoZWNrIGJpdCAzIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiAgZXF1YWwgdG8gMSwKKwkJICogYW4gZXJyb3IgaGFzIG9jY3VycmVkLkRvbid0IGJyZWFrIGhlcmUgaWYgd2UgYXJlIHJldmlzaW9uCisJCSAqIDEsIHRoaXMgaXMgc28gd2UgZG8gYSBibGluZCB3cml0ZSBmb3IgbG9hZCBidWcuCisJCSAqLworCQlpZiAoKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SKQorCQkJJiYgZXRkZXYtPnBkZXYtPnJldmlzaW9uID09IDApCiAJCQlicmVhazsKIAogCQkvKgotCQkgKiBTdGVwIDY6IERvbid0IGJyZWFrIGhlcmUgaWYgd2UgYXJlIHJldmlzaW9uIDEsIHRoaXMgaXMKLQkJICoJICAgc28gd2UgZG8gYSBibGluZCB3cml0ZSBmb3IgbG9hZCBidWcuCisJCSAqIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiBlcXVhbCB0byAxIGFuCisJCSAqIEFDSyBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIGFkZHJlc3MgcGhhc2Ugb2YgdGhlIHdyaXRlLgorCQkgKiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhbiBhY3R1YWwgaGFyZHdhcmUgZmFpbHVyZSBvciB0aGUKKwkJICogRUVQUk9NIG1heSBzdGlsbCBiZSBpbiBpdHMgaW50ZXJuYWwgd3JpdGUgY3ljbGUgZnJvbSBhCisJCSAqIHByZXZpb3VzIHdyaXRlLiBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZQorCQkgICpyZXBlYXRlZCBsYXRlci4KIAkJICovCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfR0VORVJBTF9FUlJPUgotCQkgICAgJiYgZXRkZXYtPnBkZXYtPnJldmlzaW9uID09IDApIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU3RlcCA3ICovCiAJCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SKSB7CiAJCQkvKgogCQkJICogVGhpcyBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUKQEAgLTMwMiwxNTQgKzIyNCwxNjAgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogU3RlcCA4OiAqLworCS8qCisJICogU2V0IGJpdCA2IG9mIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyID0gMC4KKwkgKi8KIAl1ZGVsYXkoMTApOwotCWluZGV4ID0gMDsKLQl3aGlsZSAoaTJjX3dhY2spIHsKLQkJY29udHJvbCAmPSB+TEJDSUZfQ09OVFJPTF9JMkNfV1JJVEU7CiAKLQkJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSX09GRlNFVCwKLQkJCQkJICBjb250cm9sKSkgeworCXdoaWxlIChpMmNfd2FjaykgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVIsCisJCQlMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSkpCiAJCQl3cml0ZW9rID0gMDsKLQkJfQogCiAJCS8qIERvIHJlYWQgdW50aWwgaW50ZXJuYWwgQUNLX0VSUk9SIGdvZXMgYXdheSBtZWFuaW5nIHdyaXRlCiAJCSAqIGNvbXBsZXRlZAogCQkgKi8KIAkJZG8gewogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LAotCQkJCQkgICAgICAgTEJDSUZfQUREUkVTU19SRUdJU1RFUl9PRkZTRVQsCisJCQkJCSAgICAgICBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLAogCQkJCQkgICAgICAgYWRkcik7CiAJCQlkbyB7CiAJCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsCi0JCQkJCUxCQ0lGX0RBVEFfUkVHSVNURVJfT0ZGU0VULCAmdmFsKTsKKwkJCQkJTEJDSUZfREFUQV9SRUdJU1RFUiwgJnZhbCk7CiAJCQl9IHdoaWxlICgodmFsICYgMHgwMDAxMDAwMCkgPT0gMCk7CiAJCX0gd2hpbGUgKHZhbCAmIDB4MDAwNDAwMDApOwogCi0JCWNvbnRyb2wgPSBFWFRSQUNUX0NPTlRST0xfUkVHKHZhbCk7Ci0KLQkJaWYgKGNvbnRyb2wgIT0gMHhDMCB8fCBpbmRleCA9PSAxMDAwMCkKKwkJaWYgKCh2YWwgJiAweEZGMDApICE9IDB4QzAwMCB8fCBpbmRleCA9PSAxMDAwMCkKIAkJCWJyZWFrOwotCiAJCWluZGV4Kys7CiAJfQotCi0JcmV0dXJuIHdyaXRlb2sgPyBTVUNDRVNTIDogRkFJTFVSRTsKKwlyZXR1cm4gd3JpdGVvayA/IDAgOiAtRUlPOwogfQogCiAvKioKLSAqIEVlcHJvbVJlYWRCeXRlIC0gUmVhZCBhIGJ5dGUgZnJvbSB0aGUgRVQxMzEwJ3MgRUVQUk9NCisgKiBlZXByb21fcmVhZCAtIFJlYWQgYSBieXRlIGZyb20gdGhlIEVUMTMxMCdzIEVFUFJPTQogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKiBAYWRkcjogdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0byByZWFkCiAgKiBAcGRhdGE6IGEgcG9pbnRlciB0byBhIGJ5dGUgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSByZWFkCiAgKiBAZWVwcm9tX2lkOiB0aGUgSUQgb2YgdGhlIEVFUFJPTQogICogQGFkZHJtb2RlOiBob3cgdGhlIEVFUFJPTSBpcyB0byBiZSBhY2Nlc3NlZAogICoKLSAqIFJldHVybnMgU1VDQ0VTUyBvciBGQUlMVVJFCisgKiBSZXR1cm5zIDEgZm9yIGEgc3VjY2Vzc2Z1bCByZWFkCiAgKi8KLWludCBFZXByb21SZWFkQnl0ZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MzIgYWRkciwgdTggKnBkYXRhKQorc3RhdGljIGludCBlZXByb21fcmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MzIgYWRkciwgdTggKnBkYXRhKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZXRkZXYtPnBkZXY7Ci0JaW50IGluZGV4OwotCWludCBlcnIgPSAwOwotCXU4IGNvbnRyb2w7Ci0JdTggc3RhdHVzID0gMDsKLQl1MzIgZHdvcmQxID0gMDsKKwlpbnQgZXJyOworCXUzMiBzdGF0dXM7CiAKIAkvKgotCSAqIFRoZSBmb2xsb3dpbmcgZXhjZXJwdCBpcyBmcm9tICJTZXJpYWwgRUVQUk9NIEhXIERlc2lnbgotCSAqIFNwZWNpZmljYXRpb24iIFZlcnNpb24gMC45MiAoOS8yMC8yMDA0KToKLQkgKgotCSAqIFNpbmdsZSBCeXRlIFJlYWRzCi0JICoKIAkgKiBBIHNpbmdsZSBieXRlIHJlYWQgaXMgc2ltaWxhciB0byB0aGUgc2luZ2xlIGJ5dGUgd3JpdGUsIHdpdGggdGhlCiAJICogZXhjZXB0aW9uIG9mIHRoZSBkYXRhIGZsb3c6Ci0JICoKLQkgKiAxLiBDaGVjayBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIgZm9yIGJpdHMgNiAmIDM6MiBhbGwgZXF1YWwgdG8gMCBhbmQKLQkgKiAgICBiaXRzIDcsMTowIGJvdGggZXF1YWwgdG8gMSwgYXQgbGVhc3Qgb25jZSBhZnRlciByZXNldC4KLQkgKiAgICBTdWJzZXF1ZW50IG9wZXJhdGlvbnMgbmVlZCBvbmx5IHRvIGNoZWNrIHRoYXQgYml0cyAxOjAgYXJlIGVxdWFsCi0JICogICAgdG8gMSBwcmlvciB0byBzdGFydGluZyBhIHNpbmdsZSBieXRlIHJlYWQuCi0JICoKLQkgKiAyLiBXcml0ZSB0byB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlcjogIGJpdCA3PTEsIGJpdCA2PTAsIGJpdCAzPTAsCi0JICogICAgYW5kIGJpdHMgMTowIGJvdGggPTAuICBCaXQgNSBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgdHlwZQotCSAqICAgIG9mIEVFUFJPTSBiZWluZyBhY2Nlc3NlZCAoMT10d28gYnl0ZSBhZGRyZXNzaW5nLCAwPW9uZSBieXRlCi0JICogICAgYWRkcmVzc2luZykuCi0JICoKLQkgKiAzLiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAoSTJDIHJlYWQgd2lsbAotCSAqICAgIGJlZ2luKS4KLQkgKgotCSAqIDQuIE1vbml0b3IgYml0IDAgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIFdoZW4gPTEsIEkyQyByZWFkCi0JICogICAgaXMgY29tcGxldGUuIChpZiBiaXQgMSA9MSBhbmQgYml0IDAgc3RheXMgPTAsIGEgaGFyZHdhcmUgZmFpbHVyZQotCSAqICAgIGhhcyBvY2N1cnJlZCkuCi0JICoKLQkgKiA1LiBDaGVjayBiaXQgMiBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgSWYgPTEsIHRoZW4gYW4gZXJyb3IKLQkgKiAgICBoYXMgb2NjdXJyZWQuICBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJldHVybmVkIGZyb20gdGhlIFBIWSBtYXkKLQkgKiAgICBiZSBpbnZhbGlkLgotCSAqCi0JICogNi4gUmVnYXJkbGVzcyBvZiBlcnJvciBzdGF0dXMsIHJlYWQgZGF0YSBieXRlIGZyb20gTEJDSUYgRGF0YQotCSAqICAgIFJlZ2lzdGVyLiAgSWYgYW5vdGhlciBieXRlIGlzIHJlcXVpcmVkLCBnbyB0byBzdGVwIDEuCiAJICovCiAKLQkvKiBTdGVwIDE6ICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaW5kZXgrKykgewotCQkvKiBSZWFkIHJlZ2lzdGVycyBncm91cGVkIGluIERXT1JEMSAqLwotCQlpZiAocGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIExCQ0lGX0RXT1JEMV9HUk9VUF9PRkZTRVQsCi0JCQkJCSAgJmR3b3JkMSkpIHsKLQkJCWVyciA9IDE7Ci0JCQlicmVhazsKLQkJfQorCWVyciA9IGVlcHJvbV93YWl0X3JlYWR5KHBkZXYsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisgCS8qCisJICogV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0wLCBiaXQgMz0wLAorCSAqIGFuZCBiaXRzIDE6MCBib3RoID0wLiAgQml0IDUgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUKKwkgKiBvZiBFRVBST00gYmVpbmcgYWNjZXNzZWQgKDE9dHdvIGJ5dGUgYWRkcmVzc2luZywgMD1vbmUgYnl0ZQorCSAqIGFkZHJlc3NpbmcpLgorCSAqLworCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiwKKwkJCQkgIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFKSkKKwkJcmV0dXJuIC1FSU87CisJLyoKKwkgKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAoSTJDIHJlYWQgd2lsbAorCSAqIGJlZ2luKS4KKwkgKi8KKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKKwkJcmV0dXJuIC1FSU87CisJLyoKKwkgKiBNb25pdG9yIGJpdCAwIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuID0gMSwgSTJDIHJlYWQKKwkgKiBpcyBjb21wbGV0ZS4gKGlmIGJpdCAxID0xIGFuZCBiaXQgMCBzdGF5cyA9IDAsIGEgaGFyZHdhcmUgZmFpbHVyZQorCSAqIGhhcyBvY2N1cnJlZCkuCisJICovCisJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgJnN0YXR1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJLyoKKwkgKiBSZWdhcmRsZXNzIG9mIGVycm9yIHN0YXR1cywgcmVhZCBkYXRhIGJ5dGUgZnJvbSBMQkNJRiBEYXRhCisJICogUmVnaXN0ZXIuCisJICovCisJKnBkYXRhID0gZXJyOworCS8qCisJICogQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmID0gMSwKKwkgKiB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KKwkgKi8KKwlyZXR1cm4gKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpID8gLUVJTyA6IDA7Cit9CiAKLQkJc3RhdHVzID0gRVhUUkFDVF9TVEFUVVNfUkVHSVNURVIoZHdvcmQxKTsKK2ludCBldDEzMXhfaW5pdF9lZXByb20oc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGV0ZGV2LT5wZGV2OworCXU4IGVlc3RhdHVzOwogCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfUEhZX1FVRVVFX0FWQUlMICYmCi0JCSAgICBzdGF0dXMgJiBMQkNJRl9TVEFUVVNfSTJDX0lETEUpIHsKLQkJCS8qIGJpdHMgMTowIGFyZSBlcXVhbCB0byAxICovCi0JCQlicmVhazsKLQkJfQorCS8qIFdlIGZpcnN0IG5lZWQgdG8gY2hlY2sgdGhlIEVFUFJPTSBTdGF0dXMgY29kZSBsb2NhdGVkIGF0IG9mZnNldAorCSAqIDB4QjIgb2YgY29uZmlnIHNwYWNlCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLAorCQkJCSAgICAgICZlZXN0YXR1cyk7CisKKwkvKiBUSElTIElTIEEgV09SS0FST1VORDoKKwkgKiBJIG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHR3aWNlIHRvIGdldCBteSBjYXJkIGluIGEKKwkgKiBMRyBNMSBFeHByZXNzIER1YWwgcnVubmluZy4gSSB0cmllZCBhbHNvIGEgbXNsZWVwIGJlZm9yZSB0aGlzCisJICogZnVuY3Rpb24sIGJlY2F1c2UgSSB0aG91Z3RoIHRoZXJlIGNvdWxkIGJlIHNvbWUgdGltZSBjb25kaWRpb25zCisJICogYnV0IGl0IGRpZG4ndCB3b3JrLiBDYWxsIHRoZSB3aG9sZSBmdW5jdGlvbiB0d2ljZSBhbHNvIHdvcmsuCisJICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUywgJmVlc3RhdHVzKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCSAgICAgICAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgRUVQUk9NIFN0YXR1c1xuIik7CisJCXJldHVybiAtRUlPOwogCX0KIAotCWlmIChlcnIgfHwgKGluZGV4ID49IE1BWF9OVU1fUkVHSVNURVJfUE9MTFMpKQotCQlyZXR1cm4gRkFJTFVSRTsKKwkvKiBEZXRlcm1pbmUgaWYgdGhlIGVycm9yKHMpIHdlIGNhcmUgYWJvdXQgYXJlIHByZXNlbnQuIElmIHRoZXkgYXJlCisJICogcHJlc2VudCB3ZSBuZWVkIHRvIGZhaWwuCisJICovCisJaWYgKGVlc3RhdHVzICYgMHg0QykgeworCQlpbnQgd3JpdGVfZmFpbGVkID0gMDsKKwkJaWYgKHBkZXYtPnJldmlzaW9uID09IDB4MDEpIHsKKwkJCWludAlpOworCQkJc3RhdGljIGNvbnN0IHU4IGVlZGF0YVs0XSA9IHsgMHhGRSwgMHgxMywgMHgxMCwgMHhGRiB9OwogCi0JLyogU3RlcCAyOiAqLwotCWNvbnRyb2wgPSAwOwotCWNvbnRyb2wgfD0gTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEU7Ci0KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVJfT0ZGU0VULAotCQkJCSAgY29udHJvbCkpIHsKLQkJcmV0dXJuIEZBSUxVUkU7Ci0JfQotCi0JLyogU3RlcCAzOiAqLwotCi0JaWYgKHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfQUREUkVTU19SRUdJU1RFUl9PRkZTRVQsCi0JCQkJICAgYWRkcikpIHsKLQkJcmV0dXJuIEZBSUxVUkU7Ci0JfQotCi0JLyogU3RlcCA0OiAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fUkVHSVNURVJfUE9MTFM7IGluZGV4KyspIHsKLQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVBfT0ZGU0VULAotCQkJCQkgICZkd29yZDEpKSB7Ci0JCQllcnIgPSAxOwotCQkJYnJlYWs7CisJCQkvKiBSZS13cml0ZSB0aGUgZmlyc3QgNCBieXRlcyBpZiB3ZSBoYXZlIGFuIGVlcHJvbQorCQkJICogcHJlc2VudCBhbmQgdGhlIHJldmlzaW9uIGlkIGlzIDEsIHRoaXMgZml4ZXMgdGhlCisJCQkgKiBjb3JydXB0aW9uIHNlZW4gd2l0aCAxMzEwIEIgU2lsaWNvbgorCQkJICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJCWlmIChlZXByb21fd3JpdGUoZXRkZXYsIGksIGVlZGF0YVtpXSkgPCAwKQorCQkJCQl3cml0ZV9mYWlsZWQgPSAxOwogCQl9CisJCWlmIChwZGV2LT5yZXZpc2lvbiAgIT0gMHgwMSB8fCB3cml0ZV9mYWlsZWQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgICAiRmF0YWwgRUVQUk9NIFN0YXR1cyBFcnJvciAtIDB4JTA0eFxuIiwgZWVzdGF0dXMpOwogCi0JCXN0YXR1cyA9IEVYVFJBQ1RfU1RBVFVTX1JFR0lTVEVSKGR3b3JkMSk7Ci0KLQkJaWYgKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwKLQkJICAgICYmIHN0YXR1cyAmIExCQ0lGX1NUQVRVU19JMkNfSURMRSkgewotCQkJLyogSTJDIHJlYWQgY29tcGxldGUgKi8KLQkJCWJyZWFrOworCQkJLyogVGhpcyBlcnJvciBjb3VsZCBtZWFuIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yCisJCQkgKiByZWFkaW5nIHRoZSBlZXByb20gb3IgdGhhdCB0aGUgZWVwcm9tIGRvZXNuJ3QgZXhpc3QuCisJCQkgKiBXZSB3aWxsIHRyZWF0IGVhY2ggY2FzZSB0aGUgc2FtZSBhbmQgbm90IHRyeSB0byBnYXRoZXIKKwkJCSAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBub3JtYWxseSB3b3VsZCBjb21lIGZyb20gdGhlCisJCQkgKiBlZXByb20sIGxpa2UgTUFDIEFkZHJlc3MKKwkJCSAqLworCQkJZXRkZXYtPmhhc19lZXByb20gPSAwOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CisJZXRkZXYtPmhhc19lZXByb20gPSAxOwogCi0JaWYgKGVyciB8fCAoaW5kZXggPj0gTUFYX05VTV9SRUdJU1RFUl9QT0xMUykpCi0JCXJldHVybiBGQUlMVVJFOworCS8qIFJlYWQgdGhlIEVFUFJPTSBmb3IgaW5mb3JtYXRpb24gcmVnYXJkaW5nIExFRCBiZWhhdmlvci4gUmVmZXIgdG8KKwkgKiBFVDEzMTBfcGh5LmMsIGV0MTMxeF94Y3ZyX2luaXQoKSwgZm9yIGl0cyB1c2UuCisJICovCisJZWVwcm9tX3JlYWQoZXRkZXYsIDB4NzAsICZldGRldi0+ZWVwcm9tRGF0YVswXSk7CisJZWVwcm9tX3JlYWQoZXRkZXYsIDB4NzEsICZldGRldi0+ZWVwcm9tRGF0YVsxXSk7CiAKLQkvKiBTdGVwIDY6ICovCi0JKnBkYXRhID0gRVhUUkFDVF9EQVRBX1JFR0lTVEVSKGR3b3JkMSk7CisJaWYgKGV0ZGV2LT5lZXByb21EYXRhWzBdICE9IDB4Y2QpCisJCS8qIERpc2FibGUgYWxsIG9wdGlvbmFsIGZlYXR1cmVzICovCisJCWV0ZGV2LT5lZXByb21EYXRhWzFdID0gMHgwMDsKIAotCXJldHVybiAoc3RhdHVzICYgTEJDSUZfU1RBVFVTX0FDS19FUlJPUikgPyBGQUlMVVJFIDogU1VDQ0VTUzsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2VlcHJvbS5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmgKaW5kZXggZDhhYzlhMC4uNmE2YzZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmgKQEAgLTYxLDE3ICs2MSw0MyBAQAogCiAjaW5jbHVkZSAiZXQxMzEwX2FkZHJlc3NfbWFwLmgiCiAKLSNpZm5kZWYgU1VDQ0VTUwotI2RlZmluZSBTVUNDRVNTCQkwCi0jZGVmaW5lIEZBSUxVUkUJCTEKLSNlbmRpZgorLyoKKyAqIEVFUFJPTSBEZWZpbmVzCisgKi8KKworLyogTEJDSUYgUmVnaXN0ZXIgR3JvdXBzIChhZGRyZXNzZWQgdmlhIDMyLWJpdCBvZmZzZXRzKSAqLworI2RlZmluZSBMQkNJRl9EV09SRDBfR1JPVVAgICAgICAgMHhBQworI2RlZmluZSBMQkNJRl9EV09SRDFfR1JPVVAgICAgICAgMHhCMAorCisvKiBMQkNJRiBSZWdpc3RlcnMgKGFkZHJlc3NlZCB2aWEgOC1iaXQgb2Zmc2V0cykgKi8KKyNkZWZpbmUgTEJDSUZfQUREUkVTU19SRUdJU1RFUiAgIDB4QUMKKyNkZWZpbmUgTEJDSUZfREFUQV9SRUdJU1RFUiAgICAgIDB4QjAKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiAgIDB4QjEKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX1JFR0lTVEVSICAgIDB4QjIKKworLyogTEJDSUYgQ29udHJvbCBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIExCQ0lGX0NPTlRST0xfU0VRVUVOVElBTF9SRUFEICAgMHgwMQorI2RlZmluZSBMQkNJRl9DT05UUk9MX1BBR0VfV1JJVEUgICAgICAgIDB4MDIKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9FRVBST01fUkVMT0FEICAgICAweDA4CisjZGVmaW5lIExCQ0lGX0NPTlRST0xfVFdPX0JZVEVfQUREUiAgICAgMHgyMAorI2RlZmluZSBMQkNJRl9DT05UUk9MX0kyQ19XUklURSAgICAgICAgIDB4NDAKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgICAgICAweDgwCisKKy8qIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgICAgMHgwMQorI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0FDS19FUlJPUiAgICAgICAgICAweDA0CisjZGVmaW5lIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SICAgICAgMHgwOAorI2RlZmluZSBMQkNJRl9TVEFUVVNfQ0hFQ0tTVU1fRVJST1IgICAgIDB4NDAKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0VFUFJPTV9QUkVTRU5UICAgICAweDgwCisKKy8qIE1pc2NlbGxhbmVvdXMgQ29uc3RyYWludHMgKi8KKyNkZWZpbmUgTUFYX05VTV9SRUdJU1RFUl9QT0xMUyAgICAgICAgICAxMDAwCisjZGVmaW5lIE1BWF9OVU1fV1JJVEVfUkVUUklFUyAgICAgICAgICAgMgogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCiBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXI7CiAKLWludDMyX3QgRWVwcm9tV3JpdGVCeXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTMyIHVuQWRkcmVzcywKLQkJCXU4IGJEYXRhKTsKLWludDMyX3QgRWVwcm9tUmVhZEJ5dGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1MzIgdW5BZGRyZXNzLAotCQkJdTggKnBiRGF0YSk7CitpbnQgZXQxMzF4X2luaXRfZWVwcm9tKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwogCiAjZW5kaWYgLyogX0VUMTMxMF9FRVBST01fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX21hYy5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMKaW5kZXggZjgxZTFjYi4uYjhhMWYyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfbWFjLmMKQEAgLTEwMSw0MSArMTAxLDI3IEBACiAJc3RydWN0IF9NQUNfdCBfX2lvbWVtICpwTWFjID0gJmV0ZGV2LT5yZWdzLT5tYWM7CiAJTUFDX1NUQVRJT05fQUREUjFfdCBzdGF0aW9uMTsKIAlNQUNfU1RBVElPTl9BRERSMl90IHN0YXRpb24yOwotCU1BQ19JUEdfdCBpcGc7Ci0JTUFDX0hGRFBfdCBoZmRwOwotCU1JSV9NR01UX0NGR190IG1paV9tZ210X2NmZzsKKwl1MzIgaXBnOwogCiAJLyogRmlyc3Qgd2UgbmVlZCB0byByZXNldCBldmVyeXRoaW5nLiAgV3JpdGUgdG8gTUFDIGNvbmZpZ3VyYXRpb24KIAkgKiByZWdpc3RlciAxIHRvIHBlcmZvcm0gcmVzZXQuCiAJICovCi0Jd3JpdGVsKDB4QzAwRjAwMDAsICZwTWFjLT5jZmcxLnZhbHVlKTsKKwl3cml0ZWwoMHhDMDBGMDAwMCwgJnBNYWMtPmNmZzEpOwogCiAJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIEludGVyLXBhY2tldCBnYXAgcmVnaXN0ZXIgKi8KLQlpcGcuYml0cy5ub25fQjJCX2lwZ18xID0gMHgzODsJCS8qIDU4ZCAqLwotCWlwZy5iaXRzLm5vbl9CMkJfaXBnXzIgPSAweDU4OwkJLyogODhkICovCi0JaXBnLmJpdHMubWluX2lmZ19lbmZvcmNlID0gMHg1MDsJLyogODBkICovCi0JaXBnLmJpdHMuQjJCX2lwZyA9IDB4NjA7CQkvKiA5NmQgKi8KLQl3cml0ZWwoaXBnLnZhbHVlLCAmcE1hYy0+aXBnLnZhbHVlKTsKKwlpcGcgPSAweDM4MDA1ODYwOwkJLyogSVBHMSAweDM4IElQRzIgMHg1OCBCMkIgMHg2MCAqLworCWlwZyB8PSAweDUwIDw8IDg7CQkvKiBpZmcgZW5mb3JjZSAweDUwICovCisJd3JpdGVsKGlwZywgJnBNYWMtPmlwZyk7CiAKIAkvKiBOZXh0IGxldHMgY29uZmlndXJlIHRoZSBNQUMgSGFsZiBEdXBsZXggcmVnaXN0ZXIgKi8KLQloZmRwLmJpdHMuYWx0X2JlYl90cnVuYyA9IDB4QTsKLQloZmRwLmJpdHMuYWx0X2JlYl9lbmFibGUgPSAweDA7Ci0JaGZkcC5iaXRzLmJwX25vX2JhY2tvZmYgPSAweDA7Ci0JaGZkcC5iaXRzLm5vX2JhY2tvZmYgPSAweDA7Ci0JaGZkcC5iaXRzLmV4Y2Vzc19kZWZlciA9IDB4MTsKLQloZmRwLmJpdHMucmV4bWl0X21heCA9IDB4RjsKLQloZmRwLmJpdHMuY29sbF93aW5kb3cgPSAweDM3OwkJLyogNTVkICovCi0Jd3JpdGVsKGhmZHAudmFsdWUsICZwTWFjLT5oZmRwLnZhbHVlKTsKKwkvKiBCRUIgdHJ1bmMgMHhBLCBFeCBEZWZlciwgUmV4bWl0IDB4RiBDb2xsIDB4MzcgKi8KKwl3cml0ZWwoMHgwMEExRjAzNywgJnBNYWMtPmhmZHApOwogCiAJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIEludGVyZmFjZSBDb250cm9sIHJlZ2lzdGVyICovCi0Jd3JpdGVsKDAsICZwTWFjLT5pZl9jdHJsLnZhbHVlKTsKKwl3cml0ZWwoMCwgJnBNYWMtPmlmX2N0cmwpOwogCiAJLyogTGV0J3MgbW92ZSBvbiB0byBzZXR0aW5nIHVwIHRoZSBtaWkgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uICovCi0JbWlpX21nbXRfY2ZnLmJpdHMucmVzZXRfbWlpX21nbXQgPSAwOwotCW1paV9tZ210X2NmZy5iaXRzLnNjYW5fYXV0b19pbmNyZW10ID0gMDsKLQltaWlfbWdtdF9jZmcuYml0cy5wcmVhbWJsZV9zdXBwcmVzcyA9IDA7Ci0JbWlpX21nbXRfY2ZnLmJpdHMubWdtdF9jbGtfcmVzZXQgPSAweDc7Ci0Jd3JpdGVsKG1paV9tZ210X2NmZy52YWx1ZSwgJnBNYWMtPm1paV9tZ210X2NmZy52YWx1ZSk7CisJd3JpdGVsKDB4MDcsICZwTWFjLT5taWlfbWdtdF9jZmcpOwkvKiBDbG9jayByZXNldCAweDcgKi8KIAogCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBTdGF0aW9uIEFkZHJlc3MgcmVnaXN0ZXIuICBUaGVzZQogCSAqIHZhbHVlcyBhcmUgcmVhZCBmcm9tIHRoZSBFRVBST00gZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZCBzdG9yZWQKQEAgLTE2MCwxMCArMTQ2LDEwIEBACiAJICogUGFja2V0cyBsYXJnZXIgdGhhbiAoUmVnaXN0cnlKdW1ib1BhY2tldCkgdGhhdCBkbyBub3QgY29udGFpbiBhCiAJICogVkxBTiBJRCB3aWxsIGJlIGRyb3BwZWQgYnkgdGhlIFJ4IGZ1bmN0aW9uLgogCSAqLwotCXdyaXRlbChldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCArIDQsICZwTWFjLT5tYXhfZm1fbGVuLnZhbHVlKTsKKwl3cml0ZWwoZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgKyA0LCAmcE1hYy0+bWF4X2ZtX2xlbik7CiAKIAkvKiBjbGVhciBvdXQgTUFDIGNvbmZpZyByZXNldCAqLwotCXdyaXRlbCgwLCAmcE1hYy0+Y2ZnMS52YWx1ZSk7CisJd3JpdGVsKDAsICZwTWFjLT5jZmcxKTsKIH0KIAogLyoqCkBAIC0xNzQsNzkgKzE2MCw2MiBAQAogewogCWludDMyX3QgZGVsYXkgPSAwOwogCXN0cnVjdCBfTUFDX3QgX19pb21lbSAqcE1hYyA9ICZldGRldi0+cmVncy0+bWFjOwotCU1BQ19DRkcxX3QgY2ZnMTsKLQlNQUNfQ0ZHMl90IGNmZzI7Ci0JTUFDX0lGX0NUUkxfdCBpZmN0cmw7CisJdTMyIGNmZzE7CisJdTMyIGNmZzI7CisJdTMyIGlmY3RybDsKIAlUWE1BQ19DVExfdCBjdGw7CiAKIAljdGwudmFsdWUgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPnR4bWFjLmN0bC52YWx1ZSk7Ci0JY2ZnMS52YWx1ZSA9IHJlYWRsKCZwTWFjLT5jZmcxLnZhbHVlKTsKLQljZmcyLnZhbHVlID0gcmVhZGwoJnBNYWMtPmNmZzIudmFsdWUpOwotCWlmY3RybC52YWx1ZSA9IHJlYWRsKCZwTWFjLT5pZl9jdHJsLnZhbHVlKTsKKwljZmcxID0gcmVhZGwoJnBNYWMtPmNmZzEpOworCWNmZzIgPSByZWFkbCgmcE1hYy0+Y2ZnMik7CisJaWZjdHJsID0gcmVhZGwoJnBNYWMtPmlmX2N0cmwpOwogCisJLyogU2V0IHVwIHRoZSBpZiBtb2RlIGJpdHMgKi8KKwljZmcyICY9IH4weDMwMDsKIAlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwMDBNQlBTKSB7Ci0JCWNmZzIuYml0cy5pZl9tb2RlID0gMHgyOwotCQlpZmN0cmwuYml0cy5waHlfbW9kZSA9IDB4MDsKKwkJY2ZnMiB8PSAweDIwMDsKKwkJLyogUGh5IG1vZGUgYml0ICovCisJCWlmY3RybCAmPSB+KDEgPDwgMjQpOwogCX0gZWxzZSB7Ci0JCWNmZzIuYml0cy5pZl9tb2RlID0gMHgxOwotCQlpZmN0cmwuYml0cy5waHlfbW9kZSA9IDB4MTsKKwkJY2ZnMiB8PSAweDEwMDsKKwkJaWZjdHJsIHw9ICgxIDw8IDI0KTsKIAl9CiAKIAkvKiBXZSBuZWVkIHRvIGVuYWJsZSBSeC9UeCAqLwotCWNmZzEuYml0cy5yeF9lbmFibGUgPSAweDE7Ci0JY2ZnMS5iaXRzLnR4X2VuYWJsZSA9IDB4MTsKLQotCS8qIFNldCB1cCBmbG93IGNvbnRyb2wgKi8KLQljZmcxLmJpdHMudHhfZmxvdyA9IDB4MTsKLQotCWlmICgoZXRkZXYtPkZsb3dDb250cm9sID09IFJ4T25seSkgfHwKLQkgICAgKGV0ZGV2LT5GbG93Q29udHJvbCA9PSBCb3RoKSkgewotCQljZmcxLmJpdHMucnhfZmxvdyA9IDB4MTsKLQl9IGVsc2UgewotCQljZmcxLmJpdHMucnhfZmxvdyA9IDB4MDsKLQl9Ci0KKwljZmcxIHw9IENGRzFfUlhfRU5BQkxFfENGRzFfVFhfRU5BQkxFfENGRzFfVFhfRkxPVzsKIAkvKiBJbml0aWFsaXplIGxvb3AgYmFjayB0byBvZmYgKi8KLQljZmcxLmJpdHMubG9vcF9iYWNrID0gMDsKLQotCXdyaXRlbChjZmcxLnZhbHVlLCAmcE1hYy0+Y2ZnMS52YWx1ZSk7CisJY2ZnMSAmPSB+KENGRzFfTE9PUEJBQ0t8Q0ZHMV9SWF9GTE9XKTsKKwlpZiAoZXRkZXYtPkZsb3dDb250cm9sID09IFJ4T25seSB8fCBldGRldi0+Rmxvd0NvbnRyb2wgPT0gQm90aCkKKwkJY2ZnMSB8PSBDRkcxX1JYX0ZMT1c7CisJd3JpdGVsKGNmZzEsICZwTWFjLT5jZmcxKTsKIAogCS8qIE5vdyB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIE1BQyBDb25maWd1cmF0aW9uIDIgcmVnaXN0ZXIgKi8KLQljZmcyLmJpdHMucHJlYW1ibGVfbGVuID0gMHg3OwotCWNmZzIuYml0cy5odWdlX2ZyYW1lID0gMHgwOwotCS8qIExFTkdUSCBGSUVMRCBDSEVDS0lORyBiaXQ0OiBTZXQgdGhpcyBiaXQgdG8gY2F1c2UgdGhlIE1BQyB0byBjaGVjawotCSAqIHRoZSBmcmFtZSdzIGxlbmd0aCBmaWVsZCB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgYWN0dWFsIGRhdGEKLQkgKiBmaWVsZCBsZW5ndGguIENsZWFyIHRoaXMgYml0IGlmIG5vIGxlbmd0aCBmaWVsZCBjaGVja2luZyBpcwotCSAqIGRlc2lyZWQuIEl0cyBkZWZhdWx0IGlzIDAuCi0JICovCi0JY2ZnMi5iaXRzLmxlbl9jaGVjayA9IDB4MTsKKwkvKiBwcmVhbWJsZSA3LCBjaGVjayBsZW5ndGgsIGh1Z2UgZnJhbWUgb2ZmLCBwYWQgY3JjLCBjcmMgZW5hYmxlCisJICAgZnVsbCBkdXBsZXggb2ZmICovCisJY2ZnMiB8PSAweDcwMTY7CisJY2ZnMiAmPSB+MHgwMDIxOwogCi0JaWYgKGV0ZGV2LT5SZWdpc3RyeVBoeUxvb3BiayA9PSBmYWxzZSkgewotCQljZmcyLmJpdHMucGFkX2NyYyA9IDB4MTsKLQkJY2ZnMi5iaXRzLmNyY19lbmFibGUgPSAweDE7Ci0JfSBlbHNlIHsKLQkJY2ZnMi5iaXRzLnBhZF9jcmMgPSAwOwotCQljZmcyLmJpdHMuY3JjX2VuYWJsZSA9IDA7Ci0JfQorCS8qIFR1cm4gb24gZHVwbGV4IGlmIG5lZWRlZCAqLworCWlmIChldGRldi0+ZHVwbGV4X21vZGUpCisJCWNmZzIgfD0gMHgwMTsKIAotCS8qIDEgLSBmdWxsIGR1cGxleCwgMCAtIGhhbGYtZHVwbGV4ICovCi0JY2ZnMi5iaXRzLmZ1bGxfZHVwbGV4ID0gZXRkZXYtPmR1cGxleF9tb2RlOwotCWlmY3RybC5iaXRzLmdoZF9tb2RlID0gIWV0ZGV2LT5kdXBsZXhfbW9kZTsKKwlpZmN0cmwgJj0gfigxIDw8IDI2KTsKKwlpZiAoIWV0ZGV2LT5kdXBsZXhfbW9kZSkKKwkJaWZjdHJsIHw9ICgxPDwyNik7CS8qIEVuYWJsZSBnaGQgKi8KIAotCXdyaXRlbChpZmN0cmwudmFsdWUsICZwTWFjLT5pZl9jdHJsLnZhbHVlKTsKLQl3cml0ZWwoY2ZnMi52YWx1ZSwgJnBNYWMtPmNmZzIudmFsdWUpOworCXdyaXRlbChpZmN0cmwsICZwTWFjLT5pZl9jdHJsKTsKKwl3cml0ZWwoY2ZnMiwgJnBNYWMtPmNmZzIpOwogCiAJZG8gewogCQl1ZGVsYXkoMTApOwogCQlkZWxheSsrOwotCQljZmcxLnZhbHVlID0gcmVhZGwoJnBNYWMtPmNmZzEudmFsdWUpOwotCX0gd2hpbGUgKCghY2ZnMS5iaXRzLnN5bmNkX3J4X2VuIHx8ICFjZmcxLmJpdHMuc3luY2RfdHhfZW4pICYmCi0JCQkJCQkJCSBkZWxheSA8IDEwMCk7CisJCWNmZzEgPSByZWFkbCgmcE1hYy0+Y2ZnMSk7CisJfSB3aGlsZSAoKGNmZzEgJiBDRkcxX1dBSVQpICE9IENGRzFfV0FJVCAmJiBkZWxheSA8IDEwMCk7CiAKIAlpZiAoZGVsYXkgPT0gMTAwKSB7CiAJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkgICAgIlN5bmNkIGJpdHMgZGlkIG5vdCByZXNwb25kIGNvcnJlY3RseSBjZmcxIHdvcmQgMHglMDh4XG4iLAotCQkJY2ZnMS52YWx1ZSk7CisJCQljZmcxKTsKIAl9CiAKIAkvKiBFbmFibGUgVFhNQUMgKi8KQEAgLTQwMiwxMDYgKzM3MSw0NyBAQAogdm9pZCBDb25maWdUeE1hY1JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKIAlzdHJ1Y3QgX1RYTUFDX3QgX19pb21lbSAqcFR4TWFjID0gJmV0ZGV2LT5yZWdzLT50eG1hYzsKLQlUWE1BQ19DRl9QQVJBTV90IExvY2FsOwogCiAJLyogV2UgbmVlZCB0byB1cGRhdGUgdGhlIENvbnRyb2wgRnJhbWUgUGFyYW1ldGVycwogCSAqIGNmcHQgLSBjb250cm9sIGZyYW1lIHBhdXNlIHRpbWVyIHNldCB0byA2NCAoMHg0MCkKIAkgKiBjZmVwIC0gY29udHJvbCBmcmFtZSBleHRlbmRlZCBwYXVzZSB0aW1lciBzZXQgdG8gMHgwCiAJICovCi0JaWYgKGV0ZGV2LT5GbG93Q29udHJvbCA9PSBOb25lKSB7Ci0JCXdyaXRlbCgwLCAmcFR4TWFjLT5jZl9wYXJhbS52YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJTG9jYWwuYml0cy5jZnB0ID0gMHg0MDsKLQkJTG9jYWwuYml0cy5jZmVwID0gMHgwOwotCQl3cml0ZWwoTG9jYWwudmFsdWUsICZwVHhNYWMtPmNmX3BhcmFtLnZhbHVlKTsKLQl9CisJaWYgKGV0ZGV2LT5GbG93Q29udHJvbCA9PSBOb25lKQorCQl3cml0ZWwoMCwgJnBUeE1hYy0+Y2ZfcGFyYW0pOworCWVsc2UKKwkJd3JpdGVsKDB4NDAsICZwVHhNYWMtPmNmX3BhcmFtKTsKIH0KIAogdm9pZCBDb25maWdNYWNTdGF0UmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCXN0cnVjdCBfTUFDX1NUQVRfdCBfX2lvbWVtICpwRGV2TWFjU3RhdCA9CisJc3RydWN0IF9NQUNfU1RBVF90IF9faW9tZW0gKm1hY3N0YXQgPQogCQkmZXRkZXYtPnJlZ3MtPm1hY1N0YXQ7CiAKIAkvKiBOZXh0IHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBhbGwgdGhlIE1BQ19TVEFUIHJlZ2lzdGVycyB0byB6ZXJvIG9uCiAJICogdGhlIGRldmljZS4KIAkgKi8KLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRmNzKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SQWxuKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRmxyKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRHJwKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SQ2RlKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5ST3ZyKTsKLQl3cml0ZWwoMCwgJnBEZXZNYWNTdGF0LT5SRnJnKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJGY3MpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkFsbik7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5SRmxyKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJEcnApOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+UkNkZSk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5ST3ZyKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlJGcmcpOwogCi0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VFNjbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VERmcik7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VE1jbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VExjbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VE5jbCk7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VE92cik7Ci0Jd3JpdGVsKDAsICZwRGV2TWFjU3RhdC0+VFVuZCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UU2NsKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlREZnIpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+VE1jbCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UTGNsKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPlROY2wpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+VE92cik7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5UVW5kKTsKIAogCS8qIFVubWFzayBhbnkgY291bnRlcnMgdGhhdCB3ZSB3YW50IHRvIHRyYWNrIHRoZSBvdmVyZmxvdyBvZi4KIAkgKiBJbml0aWFsbHkgdGhpcyB3aWxsIGJlIGFsbCBjb3VudGVycy4gIEl0IG1heSBiZWNvbWUgY2xlYXIgbGF0ZXIKIAkgKiB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNrIGFsbCBjb3VudGVycy4KIAkgKi8KLQl7Ci0JCU1BQ19TVEFUX1JFR18xX3QgQ2FycnkxTSA9IHsgMHhmZmZmZmZmZiB9OwotCi0JCUNhcnJ5MU0uYml0cy5yZHJwID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJqYnIgPSAxOwotCQlDYXJyeTFNLmJpdHMucmZyZyA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5yb3ZyID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJ1bmQgPSAxOwotCQlDYXJyeTFNLmJpdHMucmNzZSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yY2RlID0gMDsKLQkJQ2FycnkxTS5iaXRzLnJmbHIgPSAwOwotCQlDYXJyeTFNLmJpdHMucmFsbiA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5yeHVvID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJ4cGYgPSAxOwotCQlDYXJyeTFNLmJpdHMucnhjZiA9IDE7Ci0JCUNhcnJ5MU0uYml0cy5yYmNhID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJtY2EgPSAxOwotCQlDYXJyeTFNLmJpdHMucmZjcyA9IDA7Ci0JCUNhcnJ5MU0uYml0cy5ycGt0ID0gMTsKLQkJQ2FycnkxTS5iaXRzLnJieXQgPSAxOwotCQlDYXJyeTFNLmJpdHMudHJtZ3YgPSAxOwotCQlDYXJyeTFNLmJpdHMudHJtYXggPSAxOwotCQlDYXJyeTFNLmJpdHMudHIxayA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjUxMSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjI1NSA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjEyNyA9IDE7Ci0JCUNhcnJ5MU0uYml0cy50cjY0ID0gMTsKLQotCQl3cml0ZWwoQ2FycnkxTS52YWx1ZSwgJnBEZXZNYWNTdGF0LT5DYXJyeTFNLnZhbHVlKTsKLQl9Ci0KLQl7Ci0JCU1BQ19TVEFUX1JFR18yX3QgQ2FycnkyTSA9IHsgMHhmZmZmZmZmZiB9OwotCi0JCUNhcnJ5Mk0uYml0cy50ZHJwID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRwZmggPSAxOwotCQlDYXJyeTJNLmJpdHMudG5jbCA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50eGNsID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRsY2wgPSAwOwotCQlDYXJyeTJNLmJpdHMudG1jbCA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50c2NsID0gMDsKLQkJQ2FycnkyTS5iaXRzLnRlZGYgPSAxOwotCQlDYXJyeTJNLmJpdHMudGRmciA9IDA7Ci0JCUNhcnJ5Mk0uYml0cy50eHBmID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRiY2EgPSAxOwotCQlDYXJyeTJNLmJpdHMudG1jYSA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50cGt0ID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRieXQgPSAxOwotCQlDYXJyeTJNLmJpdHMudGZyZyA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50dW5kID0gMDsKLQkJQ2FycnkyTS5iaXRzLnRvdnIgPSAwOwotCQlDYXJyeTJNLmJpdHMudHhjZiA9IDE7Ci0JCUNhcnJ5Mk0uYml0cy50ZmNzID0gMTsKLQkJQ2FycnkyTS5iaXRzLnRqYnIgPSAxOwotCi0JCXdyaXRlbChDYXJyeTJNLnZhbHVlLCAmcERldk1hY1N0YXQtPkNhcnJ5Mk0udmFsdWUpOwotCX0KKwl3cml0ZWwoMHhGRkZGQkUzMiwgJm1hY3N0YXQtPkNhcnJ5MU0pOworCXdyaXRlbCgweEZGRkU3RThCLCAmbWFjc3RhdC0+Q2FycnkyTSk7CiB9CiAKIHZvaWQgQ29uZmlnRmxvd0NvbnRyb2woc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKQEAgLTUwOSwyOCArNDE5LDI4IEBACiAJaWYgKGV0ZGV2LT5kdXBsZXhfbW9kZSA9PSAwKSB7CiAJCWV0ZGV2LT5GbG93Q29udHJvbCA9IE5vbmU7CiAJfSBlbHNlIHsKLQkJY2hhciBSZW1vdGVQYXVzZSwgUmVtb3RlQXN5bmNQYXVzZTsKKwkJY2hhciByZW1vdGVfcGF1c2UsIHJlbW90ZV9hc3luY19wYXVzZTsKIAogCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCi0JCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTAsICZSZW1vdGVQYXVzZSk7CisJCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTAsICZyZW1vdGVfcGF1c2UpOwogCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTEsCi0JCQkJICAgICAgJlJlbW90ZUFzeW5jUGF1c2UpOworCQkJCSAgICAgICZyZW1vdGVfYXN5bmNfcGF1c2UpOwogCi0JCWlmICgoUmVtb3RlUGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSAmJgotCQkgICAgKFJlbW90ZUFzeW5jUGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSkgeworCQlpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCisJCSAgICAocmVtb3RlX2FzeW5jX3BhdXNlID09IFRSVUVQSFlfQklUX1NFVCkpIHsKIAkJCWV0ZGV2LT5GbG93Q29udHJvbCA9IGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sOwotCQl9IGVsc2UgaWYgKChSZW1vdGVQYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCi0JCQkgICAoUmVtb3RlQXN5bmNQYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKKwkJfSBlbHNlIGlmICgocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQklUX1NFVCkgJiYKKwkJCSAgIChyZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpKSB7CiAJCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKIAkJCQlldGRldi0+Rmxvd0NvbnRyb2wgPSBCb3RoOwogCQkJZWxzZQogCQkJCWV0ZGV2LT5GbG93Q29udHJvbCA9IE5vbmU7Ci0JCX0gZWxzZSBpZiAoKFJlbW90ZVBhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSAmJgotCQkJICAgKFJlbW90ZUFzeW5jUGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpKSB7CisJCX0gZWxzZSBpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikgJiYKKwkJCSAgIChyZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9CSVRfQ0xFQVIpKSB7CiAJCQlldGRldi0+Rmxvd0NvbnRyb2wgPSBOb25lOwotCQl9IGVsc2Ugey8qIGlmIChSZW1vdGVQYXVzZSA9PSBUUlVFUEhZX0NMRUFSX0JJVCAmJgotCQkJICAgICAgIFJlbW90ZUFzeW5jUGF1c2UgPT0gVFJVRVBIWV9TRVRfQklUKSAqLworCQl9IGVsc2Ugey8qIGlmIChyZW1vdGVfcGF1c2UgPT0gVFJVRVBIWV9DTEVBUl9CSVQgJiYKKwkJCSAgICAgICByZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9TRVRfQklUKSAqLwogCQkJaWYgKGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCiAJCQkJZXRkZXYtPkZsb3dDb250cm9sID0gUnhPbmx5OwogCQkJZWxzZQpAQCAtNTQ2LDI1ICs0NTYsMjUgQEAKIHZvaWQgVXBkYXRlTWFjU3RhdEhvc3RDb3VudGVycyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewogCXN0cnVjdCBfY2Vfc3RhdHNfdCAqc3RhdHMgPSAmZXRkZXYtPlN0YXRzOwotCXN0cnVjdCBfTUFDX1NUQVRfdCBfX2lvbWVtICpwRGV2TWFjU3RhdCA9CisJc3RydWN0IF9NQUNfU1RBVF90IF9faW9tZW0gKm1hY3N0YXQgPQogCQkmZXRkZXYtPnJlZ3MtPm1hY1N0YXQ7CiAKLQlzdGF0cy0+Y29sbGlzaW9ucyArPSByZWFkbCgmcERldk1hY1N0YXQtPlROY2wpOwotCXN0YXRzLT5maXJzdF9jb2xsaXNpb24gKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UU2NsKTsKLQlzdGF0cy0+dHhfZGVmZXJyZWQgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5URGZyKTsKLQlzdGF0cy0+ZXhjZXNzaXZlX2NvbGxpc2lvbnMgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UTWNsKTsKLQlzdGF0cy0+bGF0ZV9jb2xsaXNpb25zICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+VExjbCk7Ci0Jc3RhdHMtPnR4X3VmbG8gKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5UVW5kKTsKLQlzdGF0cy0+bWF4X3BrdF9lcnJvciArPSByZWFkbCgmcERldk1hY1N0YXQtPlRPdnIpOworCXN0YXRzLT5jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT5UTmNsKTsKKwlzdGF0cy0+Zmlyc3RfY29sbGlzaW9uICs9IHJlYWRsKCZtYWNzdGF0LT5UU2NsKTsKKwlzdGF0cy0+dHhfZGVmZXJyZWQgKz0gcmVhZGwoJm1hY3N0YXQtPlREZnIpOworCXN0YXRzLT5leGNlc3NpdmVfY29sbGlzaW9ucyArPSByZWFkbCgmbWFjc3RhdC0+VE1jbCk7CisJc3RhdHMtPmxhdGVfY29sbGlzaW9ucyArPSByZWFkbCgmbWFjc3RhdC0+VExjbCk7CisJc3RhdHMtPnR4X3VmbG8gKz0gcmVhZGwoJm1hY3N0YXQtPlRVbmQpOworCXN0YXRzLT5tYXhfcGt0X2Vycm9yICs9IHJlYWRsKCZtYWNzdGF0LT5UT3ZyKTsKIAotCXN0YXRzLT5hbGlnbm1lbnRfZXJyICs9IHJlYWRsKCZwRGV2TWFjU3RhdC0+UkFsbik7Ci0Jc3RhdHMtPmNyY19lcnIgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SQ2RlKTsKLQlzdGF0cy0+bm9yY3ZidWYgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SRHJwKTsKLQlzdGF0cy0+cnhfb3ZfZmxvdyArPSByZWFkbCgmcERldk1hY1N0YXQtPlJPdnIpOwotCXN0YXRzLT5jb2RlX3Zpb2xhdGlvbnMgKz0gcmVhZGwoJnBEZXZNYWNTdGF0LT5SRmNzKTsKLQlzdGF0cy0+bGVuZ3RoX2VyciArPSByZWFkbCgmcERldk1hY1N0YXQtPlJGbHIpOworCXN0YXRzLT5hbGlnbm1lbnRfZXJyICs9IHJlYWRsKCZtYWNzdGF0LT5SQWxuKTsKKwlzdGF0cy0+Y3JjX2VyciArPSByZWFkbCgmbWFjc3RhdC0+UkNkZSk7CisJc3RhdHMtPm5vcmN2YnVmICs9IHJlYWRsKCZtYWNzdGF0LT5SRHJwKTsKKwlzdGF0cy0+cnhfb3ZfZmxvdyArPSByZWFkbCgmbWFjc3RhdC0+Uk92cik7CisJc3RhdHMtPmNvZGVfdmlvbGF0aW9ucyArPSByZWFkbCgmbWFjc3RhdC0+UkZjcyk7CisJc3RhdHMtPmxlbmd0aF9lcnIgKz0gcmVhZGwoJm1hY3N0YXQtPlJGbHIpOwogCi0Jc3RhdHMtPm90aGVyX2Vycm9ycyArPSByZWFkbCgmcERldk1hY1N0YXQtPlJGcmcpOworCXN0YXRzLT5vdGhlcl9lcnJvcnMgKz0gcmVhZGwoJm1hY3N0YXQtPlJGcmcpOwogfQogCiAvKioKQEAgLTU3NywxNyArNDg3LDE3IEBACiAgKi8KIHZvaWQgSGFuZGxlTWFjU3RhdEludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCU1BQ19TVEFUX1JFR18xX3QgQ2FycnkxOwotCU1BQ19TVEFUX1JFR18yX3QgQ2FycnkyOworCXUzMiBDYXJyeTE7CisJdTMyIENhcnJ5MjsKIAogCS8qIFJlYWQgdGhlIGludGVycnVwdCBiaXRzIGZyb20gdGhlIHJlZ2lzdGVyKHMpLiAgVGhlc2UgYXJlIENsZWFyIE9uCiAJICogV3JpdGUuCiAJICovCi0JQ2FycnkxLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5MS52YWx1ZSk7Ci0JQ2FycnkyLnZhbHVlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5Mi52YWx1ZSk7CisJQ2FycnkxID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5MSk7CisJQ2FycnkyID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNTdGF0LkNhcnJ5Mik7CiAKLQl3cml0ZWwoQ2FycnkxLnZhbHVlLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkxLnZhbHVlKTsKLQl3cml0ZWwoQ2FycnkyLnZhbHVlLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkyLnZhbHVlKTsKKwl3cml0ZWwoQ2FycnkxLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkxKTsKKwl3cml0ZWwoQ2FycnkyLCAmZXRkZXYtPnJlZ3MtPm1hY1N0YXQuQ2FycnkyKTsKIAogCS8qIFdlIG5lZWQgdG8gZG8gdXBkYXRlIHRoZSBob3N0IGNvcHkgb2YgYWxsIHRoZSBNQUNfU1RBVCBjb3VudGVycy4KIAkgKiBGb3IgZWFjaCBjb3VudGVyLCBjaGVjayBpdCdzIG92ZXJmbG93IGJpdC4gIElmIHRoZSBvdmVyZmxvdyBiaXQgaXMKQEAgLTU5NSwzMyArNTA1LDMzIEBACiAJICogcmV2b2x1dGlvbiBvZiB0aGUgY291bnRlci4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB0aGUgY291bnRlcgogCSAqIGJsb2NrIGluZGljYXRlcyB0aGF0IG9uZSBvZiB0aGUgY291bnRlcnMgaGFzIHdyYXBwZWQuCiAJICovCi0JaWYgKENhcnJ5MS5iaXRzLnJmY3MpCisJaWYgKENhcnJ5MSAmICgxIDw8IDE0KSkKIAkJZXRkZXYtPlN0YXRzLmNvZGVfdmlvbGF0aW9ucyArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTEuYml0cy5yYWxuKQorCWlmIChDYXJyeTEgJiAoMSA8PCA4KSkKIAkJZXRkZXYtPlN0YXRzLmFsaWdubWVudF9lcnIgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkxLmJpdHMucmZscikKKwlpZiAoQ2FycnkxICYgKDEgPDwgNykpCiAJCWV0ZGV2LT5TdGF0cy5sZW5ndGhfZXJyICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5MS5iaXRzLnJmcmcpCisJaWYgKENhcnJ5MSAmICgxIDw8IDIpKQogCQlldGRldi0+U3RhdHMub3RoZXJfZXJyb3JzICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKENhcnJ5MS5iaXRzLnJjZGUpCisJaWYgKENhcnJ5MSAmICgxIDw8IDYpKQogCQlldGRldi0+U3RhdHMuY3JjX2VyciArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTEuYml0cy5yb3ZyKQorCWlmIChDYXJyeTEgJiAoMSA8PCAzKSkKIAkJZXRkZXYtPlN0YXRzLnJ4X292X2Zsb3cgKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKLQlpZiAoQ2FycnkxLmJpdHMucmRycCkKKwlpZiAoQ2FycnkxICYgKDEgPDwgMCkpCiAJCWV0ZGV2LT5TdGF0cy5ub3JjdmJ1ZiArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChDYXJyeTIuYml0cy50b3ZyKQorCWlmIChDYXJyeTIgJiAoMSA8PCAxNikpCiAJCWV0ZGV2LT5TdGF0cy5tYXhfcGt0X2Vycm9yICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnR1bmQpCisJaWYgKENhcnJ5MiAmICgxIDw8IDE1KSkKIAkJZXRkZXYtPlN0YXRzLnR4X3VmbG8gKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudHNjbCkKKwlpZiAoQ2FycnkyICYgKDEgPDwgNikpCiAJCWV0ZGV2LT5TdGF0cy5maXJzdF9jb2xsaXNpb24gKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoQ2FycnkyLmJpdHMudGRmcikKKwlpZiAoQ2FycnkyICYgKDEgPDwgOCkpCiAJCWV0ZGV2LT5TdGF0cy50eF9kZWZlcnJlZCArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChDYXJyeTIuYml0cy50bWNsKQorCWlmIChDYXJyeTIgJiAoMSA8PCA1KSkKIAkJZXRkZXYtPlN0YXRzLmV4Y2Vzc2l2ZV9jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnRsY2wpCisJaWYgKENhcnJ5MiAmICgxIDw8IDQpKQogCQlldGRldi0+U3RhdHMubGF0ZV9jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKENhcnJ5Mi5iaXRzLnRuY2wpCisJaWYgKENhcnJ5MiAmICgxIDw8IDIpKQogCQlldGRldi0+U3RhdHMuY29sbGlzaW9ucyArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jCmluZGV4IGRkMTk5YmQuLjZlY2FkNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5jCkBAIC05OCwyMzggKzk4LDQ5OCBAQAogI2luY2x1ZGUgImV0MTMxMF9tYWMuaCIKIAogLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHdpdGggbG9jYWwgc2NvcGUgKi8KLXN0YXRpYyBpbnQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KTsKIAogLyoqCiAgKiBQaHlNaVJlYWQgLSBSZWFkIGZyb20gdGhlIFBIWSB0aHJvdWdoIHRoZSBNSUkgSW50ZXJmYWNlIG9uIHRoZSBNQUMKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqIEB4Y3ZyQWRkcjogdGhlIGFkZHJlc3Mgb2YgdGhlIHRyYW5zY2lldmVyCiAgKiBAeGN2clJlZzogdGhlIHJlZ2lzdGVyIHRvIHJlYWQKICAqIEB2YWx1ZTogcG9pbnRlciB0byBhIDE2LWJpdCB2YWx1ZSBpbiB3aGljaCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1pbnQgUGh5TWlSZWFkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdWludDhfdCB4Y3ZyQWRkciwKLQkgICAgICB1aW50OF90IHhjdnJSZWcsIHVpbnQxNl90ICp2YWx1ZSkKK2ludCBQaHlNaVJlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTggeGN2ckFkZHIsCisJICAgICAgdTggeGN2clJlZywgdTE2ICp2YWx1ZSkKIHsKLQlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKm1hYyA9ICZhZGFwdGVyLT5yZWdzLT5tYWM7CisJc3RydWN0IF9NQUNfdCBfX2lvbWVtICptYWMgPSAmZXRkZXYtPnJlZ3MtPm1hYzsKIAlpbnQgc3RhdHVzID0gMDsKLQl1aW50MzJfdCBkZWxheTsKLQlNSUlfTUdNVF9BRERSX3QgbWlpQWRkcjsKLQlNSUlfTUdNVF9DTURfdCBtaWlDbWQ7Ci0JTUlJX01HTVRfSU5ESUNBVE9SX3QgbWlpSW5kaWNhdG9yOworCXUzMiBkZWxheTsKKwl1MzIgbWlpQWRkcjsKKwl1MzIgbWlpQ21kOworCXUzMiBtaWlJbmRpY2F0b3I7CiAKIAkvKiBTYXZlIGEgbG9jYWwgY29weSBvZiB0aGUgcmVnaXN0ZXJzIHdlIGFyZSBkZWFsaW5nIHdpdGggc28gd2UgY2FuCiAJICogc2V0IHRoZW0gYmFjawogCSAqLwotCW1paUFkZHIudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyLnZhbHVlKTsKLQltaWlDbWQudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCW1paUFkZHIgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyKTsKKwltaWlDbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOwogCiAJLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byByZWFkIGZyb20gb24gdGhlIGNvcnJlY3QgUEhZICovCi0JewotCQlNSUlfTUdNVF9BRERSX3QgbWlpX21nbXRfYWRkciA9IHsgMCB9OwotCi0JCW1paV9tZ210X2FkZHIuYml0cy5waHlfYWRkciA9IHhjdnJBZGRyOwotCQltaWlfbWdtdF9hZGRyLmJpdHMucmVnX2FkZHIgPSB4Y3ZyUmVnOwotCQl3cml0ZWwobWlpX21nbXRfYWRkci52YWx1ZSwgJm1hYy0+bWlpX21nbXRfYWRkci52YWx1ZSk7Ci0JfQorCXdyaXRlbChNSUlfQUREUih4Y3ZyQWRkciwgeGN2clJlZyksICZtYWMtPm1paV9tZ210X2FkZHIpOwogCiAJLyogS2ljayB0aGUgcmVhZCBjeWNsZSBvZmYgKi8KIAlkZWxheSA9IDA7CiAKLQl3cml0ZWwoMHgxLCAmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCXdyaXRlbCgweDEsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAlkbyB7CiAJCXVkZWxheSg1MCk7CiAJCWRlbGF5Kys7Ci0JCW1paUluZGljYXRvci52YWx1ZSA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvci52YWx1ZSk7Ci0JfSB3aGlsZSAoKG1paUluZGljYXRvci5iaXRzLm5vdF92YWxpZCB8fCBtaWlJbmRpY2F0b3IuYml0cy5idXN5KSAmJgotCQkgZGVsYXkgPCA1MCk7CisJCW1paUluZGljYXRvciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvcik7CisJfSB3aGlsZSAoKG1paUluZGljYXRvciAmIE1HTVRfV0FJVCkgJiYgZGVsYXkgPCA1MCk7CiAKIAkvKiBJZiB3ZSBoaXQgdGhlIG1heCBkZWxheSwgd2UgY291bGQgbm90IHJlYWQgdGhlIHJlZ2lzdGVyICovCi0JaWYgKGRlbGF5ID49IDUwKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJaWYgKGRlbGF5ID09IDUwKSB7CisJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkJICAgICJ4Y3ZyUmVnIDB4JTA4eCBjb3VsZCBub3QgYmUgcmVhZFxuIiwgeGN2clJlZyk7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJzdGF0dXMgaXMgIDB4JTA4eFxuIiwKLQkJCSAgICBtaWlJbmRpY2F0b3IudmFsdWUpOworCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwgInN0YXR1cyBpcyAgMHglMDh4XG4iLAorCQkJICAgIG1paUluZGljYXRvcik7CiAKIAkJc3RhdHVzID0gLUVJTzsKIAl9CiAKIAkvKiBJZiB3ZSBoaXQgaGVyZSB3ZSB3ZXJlIGFibGUgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgYW5kIHdlIG5lZWQgdG8KLQkgKiByZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBjYWxsZXIKLQkgKi8KLQkvKiBUT0RPOiBtYWtlIHRoaXMgc3R1ZmYgYSBzaW1wbGUgcmVhZHcoKT8hICovCi0JewotCQlNSUlfTUdNVF9TVEFUX3QgbWlpX21nbXRfc3RhdDsKLQotCQltaWlfbWdtdF9zdGF0LnZhbHVlID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfc3RhdC52YWx1ZSk7Ci0JCSp2YWx1ZSA9ICh1aW50MTZfdCkgbWlpX21nbXRfc3RhdC5iaXRzLnBoeV9zdGF0OwotCX0KKwkgKiByZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBjYWxsZXIgKi8KKwkqdmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9zdGF0KSAmIDB4RkZGRjsKIAogCS8qIFN0b3AgdGhlIHJlYWQgb3BlcmF0aW9uICovCi0Jd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAkvKiBzZXQgdGhlIHJlZ2lzdGVycyB3ZSB0b3VjaGVkIGJhY2sgdG8gdGhlIHN0YXRlIGF0IHdoaWNoIHdlIGVudGVyZWQKIAkgKiB0aGlzIGZ1bmN0aW9uCiAJICovCi0Jd3JpdGVsKG1paUFkZHIudmFsdWUsICZtYWMtPm1paV9tZ210X2FkZHIudmFsdWUpOwotCXdyaXRlbChtaWlDbWQudmFsdWUsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKG1paUFkZHIsICZtYWMtPm1paV9tZ210X2FkZHIpOworCXdyaXRlbChtaWlDbWQsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKICAqIE1pV3JpdGUgLSBXcml0ZSB0byBhIFBIWSByZWdpc3RlciB0aHJvdWdoIHRoZSBNSUkgaW50ZXJmYWNlIG9mIHRoZSBNQUMKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqIEB4Y3ZyUmVnOiB0aGUgcmVnaXN0ZXIgdG8gcmVhZAogICogQHZhbHVlOiAxNi1iaXQgdmFsdWUgdG8gd3JpdGUKICAqCisgKiBGSVhNRTogb25lIGNhbGxlciBpbiBuZXRkZXYgc3RpbGwKKyAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLWludCBNaVdyaXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdWludDhfdCB4Y3ZyUmVnLCB1aW50MTZfdCB2YWx1ZSkKK2ludCBNaVdyaXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHU4IHhjdnJSZWcsIHUxNiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgX01BQ190IF9faW9tZW0gKm1hYyA9ICZhZGFwdGVyLT5yZWdzLT5tYWM7CisJc3RydWN0IF9NQUNfdCBfX2lvbWVtICptYWMgPSAmZXRkZXYtPnJlZ3MtPm1hYzsKIAlpbnQgc3RhdHVzID0gMDsKLQl1aW50OF90IHhjdnJBZGRyID0gYWRhcHRlci0+U3RhdHMueGN2cl9hZGRyOwotCXVpbnQzMl90IGRlbGF5OwotCU1JSV9NR01UX0FERFJfdCBtaWlBZGRyOwotCU1JSV9NR01UX0NNRF90IG1paUNtZDsKLQlNSUlfTUdNVF9JTkRJQ0FUT1JfdCBtaWlJbmRpY2F0b3I7CisJdTggeGN2ckFkZHIgPSBldGRldi0+U3RhdHMueGN2cl9hZGRyOworCXUzMiBkZWxheTsKKwl1MzIgbWlpQWRkcjsKKwl1MzIgbWlpQ21kOworCXUzMiBtaWlJbmRpY2F0b3I7CiAKIAkvKiBTYXZlIGEgbG9jYWwgY29weSBvZiB0aGUgcmVnaXN0ZXJzIHdlIGFyZSBkZWFsaW5nIHdpdGggc28gd2UgY2FuCiAJICogc2V0IHRoZW0gYmFjawogCSAqLwotCW1paUFkZHIudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyLnZhbHVlKTsKLQltaWlDbWQudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQudmFsdWUpOworCW1paUFkZHIgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyKTsKKwltaWlDbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOwogCiAJLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKTsKKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKIAogCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byB3cml0ZSB0byBvbiB0aGUgY29ycmVjdCBQSFkgKi8KLQl7Ci0JCU1JSV9NR01UX0FERFJfdCBtaWlfbWdtdF9hZGRyOwotCi0JCW1paV9tZ210X2FkZHIuYml0cy5waHlfYWRkciA9IHhjdnJBZGRyOwotCQltaWlfbWdtdF9hZGRyLmJpdHMucmVnX2FkZHIgPSB4Y3ZyUmVnOwotCQl3cml0ZWwobWlpX21nbXRfYWRkci52YWx1ZSwgJm1hYy0+bWlpX21nbXRfYWRkci52YWx1ZSk7Ci0JfQorCXdyaXRlbChNSUlfQUREUih4Y3ZyQWRkciwgeGN2clJlZyksICZtYWMtPm1paV9tZ210X2FkZHIpOwogCiAJLyogQWRkIHRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBtYWMgKi8KLQl3cml0ZWwodmFsdWUsICZtYWMtPm1paV9tZ210X2N0cmwudmFsdWUpOworCXdyaXRlbCh2YWx1ZSwgJm1hYy0+bWlpX21nbXRfY3RybCk7CiAJZGVsYXkgPSAwOwogCiAJZG8gewogCQl1ZGVsYXkoNTApOwogCQlkZWxheSsrOwotCQltaWlJbmRpY2F0b3IudmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9pbmRpY2F0b3IudmFsdWUpOwotCX0gd2hpbGUgKG1paUluZGljYXRvci5iaXRzLmJ1c3kgJiYgZGVsYXkgPCAxMDApOworCQltaWlJbmRpY2F0b3IgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9pbmRpY2F0b3IpOworCX0gd2hpbGUgKChtaWlJbmRpY2F0b3IgJiBNR01UX0JVU1kpICYmIGRlbGF5IDwgMTAwKTsKIAogCS8qIElmIHdlIGhpdCB0aGUgbWF4IGRlbGF5LCB3ZSBjb3VsZCBub3Qgd3JpdGUgdGhlIHJlZ2lzdGVyICovCiAJaWYgKGRlbGF5ID09IDEwMCkgewotCQl1aW50MTZfdCBUZW1wVmFsdWU7CisJCXUxNiBUZW1wVmFsdWU7CiAKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCSAgICAieGN2clJlZyAweCUwOHggY291bGQgbm90IGJlIHdyaXR0ZW4iLCB4Y3ZyUmVnKTsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwgInN0YXR1cyBpcyAgMHglMDh4XG4iLAotCQkJICAgIG1paUluZGljYXRvci52YWx1ZSk7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJjb21tYW5kIGlzICAweCUwOHhcbiIsCi0JCQkgICAgcmVhZGwoJm1hYy0+bWlpX21nbXRfY21kLnZhbHVlKSk7CisJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LCAic3RhdHVzIGlzICAweCUwOHhcbiIsCisJCQkgICAgbWlpSW5kaWNhdG9yKTsKKwkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsICJjb21tYW5kIGlzICAweCUwOHhcbiIsCisJCQkgICAgcmVhZGwoJm1hYy0+bWlpX21nbXRfY21kKSk7CiAKLQkJTWlSZWFkKGFkYXB0ZXIsIHhjdnJSZWcsICZUZW1wVmFsdWUpOworCQlNaVJlYWQoZXRkZXYsIHhjdnJSZWcsICZUZW1wVmFsdWUpOwogCiAJCXN0YXR1cyA9IC1FSU87CiAJfQotCiAJLyogU3RvcCB0aGUgd3JpdGUgb3BlcmF0aW9uICovCi0Jd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAkvKiBzZXQgdGhlIHJlZ2lzdGVycyB3ZSB0b3VjaGVkIGJhY2sgdG8gdGhlIHN0YXRlIGF0IHdoaWNoIHdlIGVudGVyZWQKIAkgKiB0aGlzIGZ1bmN0aW9uCiAJICovCi0Jd3JpdGVsKG1paUFkZHIudmFsdWUsICZtYWMtPm1paV9tZ210X2FkZHIudmFsdWUpOwotCXdyaXRlbChtaWlDbWQudmFsdWUsICZtYWMtPm1paV9tZ210X2NtZC52YWx1ZSk7CisJd3JpdGVsKG1paUFkZHIsICZtYWMtPm1paV9tZ210X2FkZHIpOworCXdyaXRlbChtaWlDbWQsICZtYWMtPm1paV9tZ210X2NtZCk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKioKICAqIGV0MTMxeF94Y3ZyX2ZpbmQgLSBGaW5kIHRoZSBQSFkgSUQKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1pbnQgZXQxMzF4X3hjdnJfZmluZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCitpbnQgZXQxMzF4X3hjdnJfZmluZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCWludCBzdGF0dXMgPSAtRU5PREVWOwotCXVpbnQ4X3QgeGN2cl9hZGRyOworCXU4IHhjdnJfYWRkcjsKIAlNSV9JRFIxX3QgaWRyMTsKIAlNSV9JRFIyX3QgaWRyMjsKLQl1aW50MzJfdCB4Y3ZyX2lkOworCXUzMiB4Y3ZyX2lkOwogCiAJLyogV2UgbmVlZCB0byBnZXQgeGN2ciBpZCBhbmQgYWRkcmVzcyB3ZSBqdXN0IGdldCB0aGUgZmlyc3Qgb25lICovCiAJZm9yICh4Y3ZyX2FkZHIgPSAwOyB4Y3ZyX2FkZHIgPCAzMjsgeGN2cl9hZGRyKyspIHsKIAkJLyogUmVhZCB0aGUgSUQgZnJvbSB0aGUgUEhZICovCi0JCVBoeU1pUmVhZChhZGFwdGVyLCB4Y3ZyX2FkZHIsCi0JCQkgICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjEpLAorCQlQaHlNaVJlYWQoZXRkZXYsIHhjdnJfYWRkciwKKwkJCSAgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjEpLAogCQkJICAmaWRyMS52YWx1ZSk7Ci0JCVBoeU1pUmVhZChhZGFwdGVyLCB4Y3ZyX2FkZHIsCi0JCQkgICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjIpLAorCQlQaHlNaVJlYWQoZXRkZXYsIHhjdnJfYWRkciwKKwkJCSAgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlkcjIpLAogCQkJICAmaWRyMi52YWx1ZSk7CiAKLQkJeGN2cl9pZCA9ICh1aW50MzJfdCkgKChpZHIxLnZhbHVlIDw8IDE2KSB8IGlkcjIudmFsdWUpOworCQl4Y3ZyX2lkID0gKHUzMikgKChpZHIxLnZhbHVlIDw8IDE2KSB8IGlkcjIudmFsdWUpOwogCi0JCWlmICgoaWRyMS52YWx1ZSAhPSAwKSAmJiAoaWRyMS52YWx1ZSAhPSAweGZmZmYpKSB7Ci0JCQlhZGFwdGVyLT5TdGF0cy54Y3ZyX2lkID0geGN2cl9pZDsKLQkJCWFkYXB0ZXItPlN0YXRzLnhjdnJfYWRkciA9IHhjdnJfYWRkcjsKLQotCQkJc3RhdHVzID0gMDsKLQkJCWJyZWFrOworCQlpZiAoaWRyMS52YWx1ZSAhPSAwICYmIGlkcjEudmFsdWUgIT0gMHhmZmZmKSB7CisJCQlldGRldi0+U3RhdHMueGN2cl9pZCA9IHhjdnJfaWQ7CisJCQlldGRldi0+U3RhdHMueGN2cl9hZGRyID0geGN2cl9hZGRyOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwordm9pZCBFVDEzMTBfUGh5UmVzZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKK3sKKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgMHg4MDAwKTsKK30KKworLyoqCisgKglFVDEzMTBfUGh5UG93ZXJEb3duCS0JUEhZIHBvd2VyIGNvbnRyb2wKKyAqCUBldGRldjogZGV2aWNlIHRvIGNvbnRyb2wKKyAqCUBkb3duOiB0cnVlIGZvciBvZmYvZmFsc2UgZm9yIGJhY2sgb24KKyAqCisgKglvbmUgaHVuZHJlZCwgdGVuLCBvbmUgdGhvdXNhbmQgbWVncworICoJSG93IHdvdWxkIHlvdSBsaWtlIHRvIGhhdmUgeW91ciBMQU4gYWNjZXNzZWQKKyAqCUNhbid0IHlvdSBzZWUgdGhhdCB0aGlzIGNvZGUgcHJvY2Vzc2VkCisgKglQaHkgcG93ZXIsIHBoeSBwb3dlci4uCisgKi8KKwordm9pZCBFVDEzMTBfUGh5UG93ZXJEb3duKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIGJvb2wgZG93bikKK3sKKwl1MTYgZGF0YTsKKworCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKKwlkYXRhICY9IH4weDA4MDA7CS8qIFBvd2VyIFVQICovCisJaWYgKGRvd24pIC8qIFBvd2VyIERPV04gKi8KKwkJZGF0YSB8PSAweDA4MDA7CisJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOworfQorCisvKioKKyAqCUVUMTMwX1BoeUF1dG9ORWcJLQlhdXRvbmVnb3RpYXRlIGNvbnRyb2wKKyAqCUBldGRldjogZGV2aWNlIHRvIGNvbnRyb2wKKyAqCUBlbmFiZTogYXV0b25lZyBvbi9vZmYKKyAqCisgKglTZXQgdXAgdGhlIGF1dG9uZWdvdGlhdGlvbiBzdGF0ZSBhY2NvcmRpbmcgdG8gd2hldGhlciB3ZSB3aWxsIGJlCisgKgluZWdvdGlhdGluZyB0aGUgc3RhdGUgb3IgZm9yY2luZyBhIHNwZWVkLgorICovCisKK3N0YXRpYyB2b2lkIEVUMTMxMF9QaHlBdXRvTmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIGJvb2wgZW5hYmxlKQoreworCXUxNiBkYXRhOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gfjB4MTAwMDsJLyogQXV0b25lZ290aWF0aW9uIE9GRiAqLworCWlmIChlbmFibGUpCisJCWRhdGEgfD0gMHgxMDAwOwkJLyogQXV0b25lZ290aWF0aW9uIE9OICovCisJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOworfQorCisvKioKKyAqCUVUMTMwX1BoeUR1cGxleE1vZGUJLQlkdXBsZXggY29udHJvbAorICoJQGV0ZGV2OiBkZXZpY2UgdG8gY29udHJvbAorICoJQGR1cGxleDogZHVwbGV4IG9uL29mZgorICoKKyAqCVNldCB1cCB0aGUgZHVwbGV4IHN0YXRlIG9uIHRoZSBQSFkKKyAqLworCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5RHVwbGV4TW9kZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgZHVwbGV4KQoreworCXUxNiBkYXRhOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCWRhdGEgJj0gfjB4MTAwOwkJLyogU2V0IEhhbGYgRHVwbGV4ICovCisJaWYgKGR1cGxleCA9PSBUUlVFUEhZX0RVUExFWF9GVUxMKQorCQlkYXRhIHw9IDB4MTAwOwkvKiBTZXQgRnVsbCBEdXBsZXggKi8KKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQ09OVFJPTCwgZGF0YSk7Cit9CisKKy8qKgorICoJRVQxMzBfUGh5U3BlZWRTZWxlY3QJLQlzcGVlZCBjb250cm9sCisgKglAZXRkZXY6IGRldmljZSB0byBjb250cm9sCisgKglAZHVwbGV4OiBkdXBsZXggb24vb2ZmCisgKgorICoJU2V0IHRoZSBzcGVlZCBvZiBvdXIgUEhZLgorICovCisKK3N0YXRpYyB2b2lkIEVUMTMxMF9QaHlTcGVlZFNlbGVjdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgc3BlZWQpCit7CisJdTE2IGRhdGE7CisJc3RhdGljIGNvbnN0IHUxNiBiaXRzWzNdPXsweDAwMDAsIDB4MjAwMCwgMHgwMDQwfTsKKworCS8qIFJlYWQgdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyICovCisJTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOworCS8qIENsZWFyIGFsbCBTcGVlZCBzZXR0aW5ncyAoQml0cyA2LCAxMykgKi8KKwlkYXRhICY9IH4weDIwNDA7CisJLyogV3JpdGUgYmFjayB0aGUgbmV3IHNwZWVkICovCisJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEgfCBiaXRzW3NwZWVkXSk7Cit9CisKKy8qKgorICoJRVQxMzEwX1BoeUxpbmtTdGF0dXMJLQlyZWFkIGxpbmsgc3RhdGUKKyAqCUBldGRldjogZGV2aWNlIHRvIHJlYWQKKyAqCUBsaW5rX3N0YXR1czogcmVwb3J0ZWQgbGluayBzdGF0ZQorICoJQGF1dG9uZWc6IHJlcG9ydGVkIGF1dG9uZWdvdGlhdGlvbiBzdGF0ZSAoY29tcGxldGUvaW5jb21wbGV0ZS9kaXNhYmxlZCkKKyAqCUBsaW5rc3BlZWQ6IHJldHVybmVkbGluayBzcGVlZCBpbiB1c2UKKyAqCUBkdXBsZXhfbW9kZTogcmVwb3J0ZWQgaGFsZi9mdWxsIGR1cGxleCBzdGF0ZQorICoJQG1kaV9tZGl4OiBub3QgeWV0IHdvcmtpbmcKKyAqCUBtYXN0ZXJzbGF2ZTogcmVwb3J0IHdoZXRoZXIgd2UgYXJlIG1hc3RlciBvciBzbGF2ZQorICoJQHBvbGFyaXR5OiBsaW5rIHBvbGFyaXR5CisgKgorICoJSSBjYW4gcmVhZCB5b3VyIGxhbiBsaWtlIGEgbWFnYXppbmUKKyAqCUkgc2VlIGlmIHlvdXIgdXAKKyAqCUkga25vdyB5b3VyIGxpbmsgc3BlZWQKKyAqCUkgc2VlIGFsbCB0aGUgc2V0dGluZyB0aGF0IHlvdSdkIHJhdGhlciBrZWVwCisgKi8KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUxpbmtTdGF0dXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCSAgdTggKmxpbmtfc3RhdHVzLAorCQkJICB1MzIgKmF1dG9uZWcsCisJCQkgIHUzMiAqbGlua3NwZWVkLAorCQkJICB1MzIgKmR1cGxleF9tb2RlLAorCQkJICB1MzIgKm1kaV9tZGl4LAorCQkJICB1MzIgKm1hc3RlcnNsYXZlLCB1MzIgKnBvbGFyaXR5KQoreworCXUxNiBtaXN0YXR1cyA9IDA7CisJdTE2IGlzMTAwMEJhc2VUID0gMDsKKwl1MTYgdm1pX3BoeXN0YXR1cyA9IDA7CisJdTE2IGNvbnRyb2wgPSAwOworCisJTWlSZWFkKGV0ZGV2LCBQSFlfU1RBVFVTLCAmbWlzdGF0dXMpOworCU1pUmVhZChldGRldiwgUEhZXzEwMDBfU1RBVFVTLCAmaXMxMDAwQmFzZVQpOworCU1pUmVhZChldGRldiwgUEhZX1BIWV9TVEFUVVMsICZ2bWlfcGh5c3RhdHVzKTsKKwlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmY29udHJvbCk7CisKKwkqbGlua19zdGF0dXMgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDA0MCkgPyAxIDogMDsKKwkqYXV0b25lZyA9IChjb250cm9sICYgMHgxMDAwKSA/ICgodm1pX3BoeXN0YXR1cyAmIDB4MDAyMCkgPworCQkJCQkgICAgVFJVRVBIWV9BTkVHX0NPTVBMRVRFIDoKKwkJCQkJICAgIFRSVUVQSFlfQU5FR19OT1RfQ09NUExFVEUpIDoKKwkJICAgIFRSVUVQSFlfQU5FR19ESVNBQkxFRDsKKwkqbGlua3NwZWVkID0gKHZtaV9waHlzdGF0dXMgJiAweDAzMDApID4+IDg7CisJKmR1cGxleF9tb2RlID0gKHZtaV9waHlzdGF0dXMgJiAweDAwODApID4+IDc7CisJLyogTk9URTogTmVlZCB0byBjb21wbGV0ZSB0aGlzICovCisJKm1kaV9tZGl4ID0gMDsKKworCSptYXN0ZXJzbGF2ZSA9IChpczEwMDBCYXNlVCAmIDB4NDAwMCkgPworCQkJVFJVRVBIWV9DRkdfTUFTVEVSIDogVFJVRVBIWV9DRkdfU0xBVkU7CisJKnBvbGFyaXR5ID0gKHZtaV9waHlzdGF0dXMgJiAweDA0MDApID8KKwkJCVRSVUVQSFlfUE9MQVJJVFlfSU5WRVJURUQgOiBUUlVFUEhZX1BPTEFSSVRZX05PUk1BTDsKK30KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUFuZE9yUmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCisJCQl1MTYgcmVnbnVtLCB1MTYgYW5kTWFzaywgdTE2IG9yTWFzaykKK3sKKwl1MTYgcmVnOworCisJTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOworCXJlZyAmPSBhbmRNYXNrOworCXJlZyB8PSBvck1hc2s7CisJTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcpOworfQorCisvKiBTdGlsbCB1c2VkIGZyb20gX21hYyAgZm9yIEJJVF9SRUFEICovCit2b2lkIEVUMTMxMF9QaHlBY2Nlc3NNaUJpdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgYWN0aW9uLAorCQkJICAgdTE2IHJlZ251bSwgdTE2IGJpdG51bSwgdTggKnZhbHVlKQoreworCXUxNiByZWc7CisJdTE2IG1hc2sgPSAweDAwMDEgPDwgYml0bnVtOworCisJLyogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyICovCisJTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFRSVUVQSFlfQklUX1JFQUQ6CisJCSp2YWx1ZSA9IChyZWcgJiBtYXNrKSA+PiBiaXRudW07CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0JJVF9TRVQ6CisJCU1pV3JpdGUoZXRkZXYsIHJlZ251bSwgcmVnIHwgbWFzayk7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0JJVF9DTEVBUjoKKwkJTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcgJiB+bWFzayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCQkgIHUxNiBkdXBsZXgpCit7CisJdTE2IGRhdGE7CisKKwkvKiBSZWFkIHRoZSBQSFkgMTAwMCBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAqLworCU1pUmVhZChldGRldiwgUEhZXzEwMDBfQ09OVFJPTCwgJmRhdGEpOworCisJLyogQ2xlYXIgQml0cyA4LDkgKi8KKwlkYXRhICY9IH4weDAzMDA7CisKKwlzd2l0Y2ggKGR1cGxleCkgeworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6CisJCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgorCQkvKiBTZXQgQml0IDkgKi8KKwkJZGF0YSB8PSAweDAyMDA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKKwkJLyogU2V0IEJpdCA4ICovCisJCWRhdGEgfD0gMHgwMTAwOworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6CisJZGVmYXVsdDoKKwkJZGF0YSB8PSAweDAzMDA7CisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLworCU1pV3JpdGUoZXRkZXYsIFBIWV8xMDAwX0NPTlRST0wsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCQkgdTE2IGR1cGxleCkKK3sKKwl1MTYgZGF0YTsKKworCS8qIFJlYWQgdGhlIEF1dG9uZWdvdGlhdGlvbiBSZWdpc3RlciAoMTAvMTAwKSAqLworCU1pUmVhZChldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgJmRhdGEpOworCisJLyogQ2xlYXIgYml0cyA3LDggKi8KKwlkYXRhICY9IH4weDAxODA7CisKKwlzd2l0Y2ggKGR1cGxleCkgeworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6CisJCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgorCQkvKiBTZXQgQml0IDggKi8KKwkJZGF0YSB8PSAweDAxMDA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKKwkJLyogU2V0IEJpdCA3ICovCisJCWRhdGEgfD0gMHgwMDgwOworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6CisJZGVmYXVsdDoKKwkJLyogU2V0IEJpdHMgNyw4ICovCisJCWRhdGEgfD0gMHgwMTgwOworCQlicmVhazsKKwl9CisKKwkvKiBXcml0ZSBiYWNrIGFkdmVydGlzZW1lbnQgKi8KKwlNaVdyaXRlKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKKwkJCQl1MTYgZHVwbGV4KQoreworCXUxNiBkYXRhOworCisJLyogUmVhZCB0aGUgQXV0b25lZ290aWF0aW9uIFJlZ2lzdGVyICgxMC8xMDApICovCisJTWlSZWFkKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCAmZGF0YSk7CisKKwkvKiBDbGVhciBiaXRzIDUsNiAqLworCWRhdGEgJj0gfjB4MDA2MDsKKworCXN3aXRjaCAoZHVwbGV4KSB7CisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKKwkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLworCQlicmVhazsKKworCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6CisJCS8qIFNldCBCaXQgNiAqLworCQlkYXRhIHw9IDB4MDA0MDsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgorCQkvKiBTZXQgQml0IDUgKi8KKwkJZGF0YSB8PSAweDAwMjA7CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKKwlkZWZhdWx0OgorCQkvKiBTZXQgQml0cyA1LDYgKi8KKwkJZGF0YSB8PSAweDAwNjA7CisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLworCU1pV3JpdGUoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsIGRhdGEpOwogfQogCiAvKioKICAqIGV0MTMxeF9zZXRwaHlfbm9ybWFsIC0gU2V0IFBIWSBmb3Igbm9ybWFsIG9wZXJhdGlvbi4KLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKiBVc2VkIGJ5IFBvd2VyIE1hbmFnZW1lbnQgdG8gZm9yY2UgdGhlIFBIWSBpbnRvIDEwIEJhc2UgVCBoYWxmLWR1cGxleCBtb2RlLAogICogd2hlbiBnb2luZyB0byBEMyBpbiBXT0wgbW9kZS4gQWxzbyB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBzZXQgdGhlCiAgKiBQSFkgZm9yIG5vcm1hbCBvcGVyYXRpb24uCiAgKi8KLWludCBldDEzMXhfc2V0cGh5X25vcm1hbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit2b2lkIGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JaW50IHN0YXR1czsKLQogCS8qIE1ha2Ugc3VyZSB0aGUgUEhZIGlzIHBvd2VyZWQgdXAgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGFkYXB0ZXIsIDApOwotCXN0YXR1cyA9IGV0MTMxeF94Y3ZyX2luaXQoYWRhcHRlcik7Ci0JcmV0dXJuIHN0YXR1czsKKwlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKKwlldDEzMXhfeGN2cl9pbml0KGV0ZGV2KTsKIH0KIAorCiAvKioKICAqIGV0MTMxeF94Y3ZyX2luaXQgLSBJbml0IHRoZSBwaHkgaWYgd2UgYXJlIHNldHRpbmcgaXQgaW50byBmb3JjZSBtb2RlCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKICAqLwotc3RhdGljIGludCBldDEzMXhfeGN2cl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGV0MTMxeF94Y3ZyX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlpbnQgc3RhdHVzID0gMDsKIAlNSV9JTVJfdCBpbXI7CiAJTUlfSVNSX3QgaXNyOwogCU1JX0xDUjJfdCBsY3IyOwogCiAJLyogWmVybyBvdXQgdGhlIGFkYXB0ZXIgc3RydWN0dXJlIHZhcmlhYmxlIHJlcHJlc2VudGluZyBCTVNSICovCi0JYWRhcHRlci0+Qm1zci52YWx1ZSA9IDA7CisJZXRkZXYtPkJtc3IudmFsdWUgPSAwOwogCi0JTWlSZWFkKGFkYXB0ZXIsICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlzciksICZpc3IudmFsdWUpOwotCi0JTWlSZWFkKGFkYXB0ZXIsICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGltciksICZpbXIudmFsdWUpOworCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGlzciksICZpc3IudmFsdWUpOworCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihNSV9SRUdTX3QsIGltciksICZpbXIudmFsdWUpOwogCiAJLyogU2V0IHRoZSBsaW5rIHN0YXR1cyBpbnRlcnJ1cHQgb25seS4gIEJhZCBiZWhhdmlvciB3aGVuIGxpbmsgc3RhdHVzCiAJICogYW5kIGF1dG8gbmVnIGFyZSBzZXQsIHdlIHJ1biBpbnRvIGEgbmVzdGVkIGludGVycnVwdCBwcm9ibGVtCkBAIC0zMzgsNyArNTk4LDcgQEAKIAlpbXIuYml0cy5saW5rX3N0YXR1cyA9IDB4MTsKIAlpbXIuYml0cy5hdXRvbmVnX3N0YXR1cyA9IDB4MTsKIAotCU1pV3JpdGUoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgaW1yKSwgaW1yLnZhbHVlKTsKKwlNaVdyaXRlKGV0ZGV2LCAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgaW1yKSwgaW1yLnZhbHVlKTsKIAogCS8qIFNldCB0aGUgTEVEIGJlaGF2aW9yIHN1Y2ggdGhhdCBMRUQgMSBpbmRpY2F0ZXMgc3BlZWQgKG9mZiA9CiAJICogMTBNYml0cywgYmxpbmsgPSAxMDBNYml0cywgb24gPSAxMDAwTWJpdHMpIGFuZCBMRUQgMiBpbmRpY2F0ZXMKQEAgLTM0OCwxMTEgKzYwOCwxMzggQEAKIAkgKiB2ZW5kb3JzOyBUaGUgTEVEIGJlaGF2aW9yIGlzIG5vdyBkZXRlcm1pbmVkIGJ5IHZlbmRvciBkYXRhIGluIHRoZQogCSAqIEVFUFJPTS4gSG93ZXZlciwgdGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIHRoZSBkZWZhdWx0LgogCSAqLwotCWlmICgoYWRhcHRlci0+ZWVwcm9tRGF0YVsxXSAmIDB4NCkgPT0gMCkgewotCQlNaVJlYWQoYWRhcHRlciwgKHVpbnQ4X3QpIG9mZnNldG9mKE1JX1JFR1NfdCwgbGNyMiksCisJaWYgKChldGRldi0+ZWVwcm9tRGF0YVsxXSAmIDB4NCkgPT0gMCkgeworCQlNaVJlYWQoZXRkZXYsICh1OCkgb2Zmc2V0b2YoTUlfUkVHU190LCBsY3IyKSwKIAkJICAgICAgICZsY3IyLnZhbHVlKTsKLQkJaWYgKChhZGFwdGVyLT5lZXByb21EYXRhWzFdICYgMHg4KSA9PSAwKQorCQlpZiAoKGV0ZGV2LT5lZXByb21EYXRhWzFdICYgMHg4KSA9PSAwKQogCQkJbGNyMi5iaXRzLmxlZF90eF9yeCA9IDB4MzsKIAkJZWxzZQogCQkJbGNyMi5iaXRzLmxlZF90eF9yeCA9IDB4NDsKIAkJbGNyMi5iaXRzLmxlZF9saW5rID0gMHhhOwotCQlNaVdyaXRlKGFkYXB0ZXIsICh1aW50OF90KSBvZmZzZXRvZihNSV9SRUdTX3QsIGxjcjIpLAorCQlNaVdyaXRlKGV0ZGV2LCAodTgpIG9mZnNldG9mKE1JX1JFR1NfdCwgbGNyMiksCiAJCQlsY3IyLnZhbHVlKTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBnbyBpbnRvIGEgZm9yY2UgbW9kZSBhbmQgc2V0IGl0ICovCi0JaWYgKGFkYXB0ZXItPkFpRm9yY2VTcGVlZCA9PSAwICYmIGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMCkgewotCQlpZiAoKGFkYXB0ZXItPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gVHhPbmx5KSB8fAotCQkgICAgKGFkYXB0ZXItPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkpIHsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAorCWlmIChldGRldi0+QWlGb3JjZVNwZWVkID09IDAgJiYgZXRkZXYtPkFpRm9yY2VEcHggPT0gMCkgeworCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gVHhPbmx5IHx8CisJCSAgICBldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKQorCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAogCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDExLCBOVUxMKTsKLQkJfSBlbHNlIHsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAorCQllbHNlCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJCSAgICAgIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMSwgTlVMTCk7Ci0JCX0KIAotCQlpZiAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSB7Ci0JCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKKwkJaWYgKGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCiAJCQkJCSAgICAgIFRSVUVQSFlfQklUX1NFVCwgNCwgMTAsIE5VTEwpOwotCQl9IGVsc2UgewotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKIAkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKLQkJfQogCiAJCS8qIFNldCB0aGUgcGh5IHRvIGF1dG9uZWdvdGlhdGlvbiAqLwotCQlFVDEzMTBfUGh5QXV0b05lZyhhZGFwdGVyLCB0cnVlKTsKKwkJRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIHRydWUpOwogCiAJCS8qIE5PVEUgLSBEbyB3ZSBuZWVkIHRoaXM/ICovCi0JCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLCBUUlVFUEhZX0JJVF9TRVQsIDAsIDksIE5VTEwpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0gZWxzZSB7Ci0JCUVUMTMxMF9QaHlBdXRvTmVnKGFkYXB0ZXIsIGZhbHNlKTsKLQotCQkvKiBTZXQgdG8gdGhlIGNvcnJlY3QgZm9yY2UgbW9kZS4gKi8KLQkJaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggIT0gMSkgewotCQkJaWYgKChhZGFwdGVyLT5SZWdpc3RyeUZsb3dDb250cm9sID09IFR4T25seSkgfHwKLQkJCSAgICAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSkgewotCQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMSwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJfSBlbHNlIHsKLQkJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKLQkJCQkJCSAgICAgIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMSwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQkJfQotCi0JCQlpZiAoYWRhcHRlci0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBCb3RoKSB7Ci0JCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGFkYXB0ZXIsCi0JCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDEwLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQl9IGVsc2UgewotCQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoYWRhcHRlciwKLQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChhZGFwdGVyLAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTEsIE5VTEwpOwotCQl9Ci0KLQkJc3dpdGNoIChhZGFwdGVyLT5BaUZvcmNlU3BlZWQpIHsKLQkJY2FzZSAxMDoKLQkJCWlmIChhZGFwdGVyLT5BaUZvcmNlRHB4ID09IDEpCi0JCQkJVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlIGlmIChhZGFwdGVyLT5BaUZvcmNlRHB4ID09IDIpCi0JCQkJVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJVFBBTF9TZXRQaHkxMEZvcmNlKGFkYXB0ZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTAwOgotCQkJaWYgKGFkYXB0ZXItPkFpRm9yY2VEcHggPT0gMSkKLQkJCQlUUEFMX1NldFBoeTEwMEhhbGZEdXBsZXgoYWRhcHRlcik7Ci0JCQllbHNlIGlmIChhZGFwdGVyLT5BaUZvcmNlRHB4ID09IDIpCi0JCQkJVFBBTF9TZXRQaHkxMDBGdWxsRHVwbGV4KGFkYXB0ZXIpOwotCQkJZWxzZQotCQkJCVRQQUxfU2V0UGh5MTAwRm9yY2UoYWRhcHRlcik7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDAwOgotCQkJVFBBTF9TZXRQaHkxMDAwRnVsbER1cGxleChhZGFwdGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1czsKKwkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LCBUUlVFUEhZX0JJVF9TRVQsIDAsIDksIE5VTEwpOworCQlyZXR1cm47CiAJfQorCisJRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIGZhbHNlKTsKKworCS8qIFNldCB0byB0aGUgY29ycmVjdCBmb3JjZSBtb2RlLiAqLworCWlmIChldGRldi0+QWlGb3JjZURweCAhPSAxKSB7CisJCWlmIChldGRldi0+UmVnaXN0cnlGbG93Q29udHJvbCA9PSBUeE9ubHkgfHwKKwkJICAgIGV0ZGV2LT5SZWdpc3RyeUZsb3dDb250cm9sID09IEJvdGgpCisJCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCisJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMSwgTlVMTCk7CisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKKworCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5Rmxvd0NvbnRyb2wgPT0gQm90aCkKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMCwgTlVMTCk7CisJCWVsc2UKKwkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKKwkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKKwl9IGVsc2UgeworCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMCwgTlVMTCk7CisJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKKwl9CisJRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7CisJc3dpdGNoIChldGRldi0+QWlGb3JjZVNwZWVkKSB7CisJY2FzZSAxMDoKKwkJLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOworCQlpZiAoZXRkZXYtPkFpRm9yY2VEcHggPT0gMSkgeworCQkJLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCisJCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwKKwkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKKwkJfSBlbHNlIGlmIChldGRldi0+QWlGb3JjZURweCA9PSAyKSB7CisJCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LAorCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCisJCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOworCQkJLyogRGlzYWJsZSByZXN0IG9mIHRoZSBhZHZlcnRpc2VtZW50cyAqLworCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsCisJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKKwkJCS8qIEZvcmNlIDEwIE1icHMgKi8KKwkJCUVUMTMxMF9QaHlTcGVlZFNlbGVjdChldGRldiwgVFJVRVBIWV9TUEVFRF8xME1CUFMpOworCQkJLyogRm9yY2UgRnVsbCBkdXBsZXggKi8KKwkJCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDEwMDoKKwkJLyogZmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCWlmIChldGRldi0+QWlGb3JjZURweCA9PSAxKSB7CisJCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwKKwkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKKwkJCS8qIFNldCBzcGVlZCAqLworCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOworCQl9IGVsc2UgaWYgKGV0ZGV2LT5BaUZvcmNlRHB4ID09IDIpIHsKKwkJCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLworCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LAorCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCisJCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOworCQkJLyogRGlzYWJsZSBvdGhlciBhZHZlcnRpc2VtZW50ICovCisJCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsCisJCQkJCQlUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCQkvKiBGb3JjZSAxMDAgTWJwcyAqLworCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOworCQkJLyogRm9yY2UgRnVsbCBkdXBsZXggKi8KKwkJCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDEwMDA6CisJCS8qIGZpcnN0IHdlIG5lZWQgdG8gdHVybiBvZmYgYWxsIG90aGVyIGFkdmVydGlzZW1lbnQgKi8KKwkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7CisJCS8qIHNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLworCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7CisJCWJyZWFrOworCX0KKwlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKIH0KIAogdm9pZCBldDEzMXhfTWlpX2NoZWNrKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCiAJCSAgICAgIE1JX0JNU1JfdCBibXNyLCBNSV9CTVNSX3QgYm1zcl9pbnRzKQogewotCXVpbnQ4X3QgbGlua19zdGF0dXM7Ci0JdWludDMyX3QgYXV0b25lZ19zdGF0dXM7Ci0JdWludDMyX3Qgc3BlZWQ7Ci0JdWludDMyX3QgZHVwbGV4OwotCXVpbnQzMl90IG1kaV9tZGl4OwotCXVpbnQzMl90IG1hc3RlcnNsYXZlOwotCXVpbnQzMl90IHBvbGFyaXR5OworCXU4IGxpbmtfc3RhdHVzOworCXUzMiBhdXRvbmVnX3N0YXR1czsKKwl1MzIgc3BlZWQ7CisJdTMyIGR1cGxleDsKKwl1MzIgbWRpX21kaXg7CisJdTMyIG1hc3RlcnNsYXZlOworCXUzMiBwb2xhcml0eTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGJtc3JfaW50cy5iaXRzLmxpbmtfc3RhdHVzKSB7CkBAIC00NjksOSArNzU2LDcgQEAKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPkxvY2ssIGZsYWdzKTsKIAotCQkJLyogRG9uJ3QgaW5kaWNhdGUgc3RhdGUgaWYgd2UncmUgaW4gbG9vcGJhY2sgbW9kZSAqLwotCQkJaWYgKGV0ZGV2LT5SZWdpc3RyeVBoeUxvb3BiayA9PSBmYWxzZSkKLQkJCQluZXRpZl9jYXJyaWVyX29uKGV0ZGV2LT5uZXRkZXYpOworCQkJbmV0aWZfY2Fycmllcl9vbihldGRldi0+bmV0ZGV2KTsKIAkJfSBlbHNlIHsKIAkJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkJICAgICJMaW5rIGRvd24gLSBjYWJsZSBwcm9ibGVtID9cbiIpOwpAQCAtNDgxLDcgKzc2Niw3IEBACiAJCQkJICogVHJ1ZVBIWT8KIAkJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShldGRldi0+aFRydWVQaHksIDApID09IEVNSV9UUlVFUEhZX0ExM08pIHsKIAkJCQkgKi8KLQkJCQl1aW50MTZfdCBSZWdpc3RlcjE4OworCQkJCXUxNiBSZWdpc3RlcjE4OwogCiAJCQkJTWlSZWFkKGV0ZGV2LCAweDEyLCAmUmVnaXN0ZXIxOCk7CiAJCQkJTWlXcml0ZShldGRldiwgMHgxMiwgUmVnaXN0ZXIxOCB8IDB4NCk7CkBAIC01MDQsMTEgKzc4OSw3IEBACiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPkxvY2ssCiAJCQkJCQkgICAgICAgZmxhZ3MpOwogCi0JCQkJLyogT25seSBpbmRpY2F0ZSBzdGF0ZSBpZiB3ZSdyZSBpbiBsb29wYmFjawotCQkJCSAqIG1vZGUKLQkJCQkgKi8KLQkJCQlpZiAoZXRkZXYtPlJlZ2lzdHJ5UGh5TG9vcGJrID09IGZhbHNlKQotCQkJCQluZXRpZl9jYXJyaWVyX29mZihldGRldi0+bmV0ZGV2KTsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihldGRldi0+bmV0ZGV2KTsKIAkJCX0KIAogCQkJZXRkZXYtPmxpbmtzcGVlZCA9IDA7CkBAIC01NjEsNyArODQyLDcgQEAKIAkJCQkgKiBUcnVlUEhZPwogCQkJCSAqICYmIFRSVV9RdWVyeUNvcmVUeXBlKGV0ZGV2LT5oVHJ1ZVBoeSwgMCk9PSBFTUlfVFJVRVBIWV9BMTNPKSB7CiAJCQkJICovCi0JCQkJdWludDE2X3QgUmVnaXN0ZXIxODsKKwkJCQl1MTYgUmVnaXN0ZXIxODsKIAogCQkJCU1pUmVhZChldGRldiwgMHgxMiwgJlJlZ2lzdGVyMTgpOwogCQkJCU1pV3JpdGUoZXRkZXYsIDB4MTIsIFJlZ2lzdGVyMTggfCAweDQpOwpAQCAtNTgzLDIxMiArODY0LDEzIEBACiAJfQogfQogCi0vKioKLSAqIFRQQUxfU2V0UGh5MTBIYWxmRHVwbGV4IC0gRm9yY2UgdGhlIHBoeSBpbnRvIDEwIEJhc2UgVCBIYWxmIER1cGxleCBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEFsc28gc2V0cyB0aGUgTUFDIHNvIGl0IGlzIHN5bmNkIHVwIHByb3Blcmx5Ci0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTBGdWxsRHVwbGV4IC0gRm9yY2UgdGhlIHBoeSBpbnRvIDEwIEJhc2UgVCBGdWxsIER1cGxleCBtb2RlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEFsc28gc2V0cyB0aGUgTUFDIHNvIGl0IGlzIHN5bmNkIHVwIHByb3Blcmx5Ci0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTBGb3JjZSAtIEZvcmNlIEJhc2UtVCBGRCBtb2RlIFdJVEhPVVQgdXNpbmcgYXV0b25lZ290aWF0aW9uCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEZvcmNlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogUG93ZXIgZG93biBQSFkgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAxKTsKLQotCS8qIERpc2FibGUgYXV0b25lZyAqLwotCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCBmYWxzZSk7Ci0KLQkvKiBEaXNhYmxlIGFsbCBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBGb3JjZSAxMCBNYnBzICovCi0JRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwTUJQUyk7Ci0KLQkvKiBGb3JjZSBGdWxsIGR1cGxleCAqLwotCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTAwSGFsZkR1cGxleCAtIEZvcmNlIDEwMCBCYXNlIFQgSGFsZiBEdXBsZXggbW9kZS4KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBBbHNvIHNldHMgdGhlIE1BQyBzbyBpdCBpcyBzeW5jZCB1cCBwcm9wZXJseS4KLSAqLwotdm9pZCBUUEFMX1NldFBoeTEwMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogZmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKLQotCS8qIFNldCBzcGVlZCAqLwotCUVUMTMxMF9QaHlTcGVlZFNlbGVjdChldGRldiwgVFJVRVBIWV9TUEVFRF8xMDBNQlBTKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTAwRnVsbER1cGxleCAtIEZvcmNlIDEwMCBCYXNlIFQgRnVsbCBEdXBsZXggbW9kZS4KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBBbHNvIHNldHMgdGhlIE1BQyBzbyBpdCBpcyBzeW5jZCB1cCBwcm9wZXJseQotICovCi12b2lkIFRQQUxfU2V0UGh5MTAwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBGaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCi0JLyogUG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHkxMDBGb3JjZSAtIEZvcmNlIDEwMCBCYXNlVCBGRCBtb2RlIFdJVEhPVVQgdXNpbmcgYXV0b25lZ290aWF0aW9uCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMDBGb3JjZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBEaXNhYmxlIGF1dG9uZWcgKi8KLQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOwotCi0JLyogRGlzYWJsZSBhbGwgYWR2ZXJ0aXNlbWVudCAqLwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogRm9yY2UgMTAwIE1icHMgKi8KLQlFVDEzMTBfUGh5U3BlZWRTZWxlY3QoZXRkZXYsIFRSVUVQSFlfU1BFRURfMTAwTUJQUyk7Ci0KLQkvKiBGb3JjZSBGdWxsIGR1cGxleCAqLwotCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0vKioKLSAqIFRQQUxfU2V0UGh5MTAwMEZ1bGxEdXBsZXggLSBGb3JjZSAxMDAwIEJhc2UgVCBGdWxsIER1cGxleCBtb2RlCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogQWxzbyBzZXRzIHRoZSBNQUMgc28gaXQgaXMgc3luY2QgdXAgcHJvcGVybHkuCi0gKi8KLXZvaWQgVFBBTF9TZXRQaHkxMDAwRnVsbER1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKiBmaXJzdCB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGFsbCBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCi0JLyogc2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCi0JLyogcG93ZXIgdXAgUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMCk7Ci19Ci0KLS8qKgotICogVFBBTF9TZXRQaHlBdXRvTmVnIC0gU2V0IHBoeSB0byBhdXRvbmVnb3RpYXRpb24gbW9kZS4KLSAqIEBldGRldjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBUUEFMX1NldFBoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBQb3dlciBkb3duIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDEpOwotCi0JLyogVHVybiBvbiBhZHZlcnRpc2VtZW50IG9mIGFsbCBjYXBhYmlsaXRpZXMgKi8KLQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEgpOwotCi0JRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USCk7Ci0KLQlpZiAoZXRkZXYtPnBkZXYtPmRldmljZSAhPSBFVDEzMVhfUENJX0RFVklDRV9JRF9GQVNUKQotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7Ci0JZWxzZQotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0KLQkvKiBNYWtlIHN1cmUgYXV0by1uZWcgaXMgT04gKGl0IGlzIGRpc2FibGVkIGluIEZPUkNFIG1vZGVzKSAqLwotCUVUMTMxMF9QaHlBdXRvTmVnKGV0ZGV2LCB0cnVlKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotfQotCi0KIC8qCiAgKiBUaGUgcm91dGluZXMgd2hpY2ggZm9sbG93IHByb3ZpZGUgbG93LWxldmVsIGFjY2VzcyB0byB0aGUgUEhZLCBhbmQgYXJlIHVzZWQKICAqIHByaW1hcmlseSBieSB0aGUgcm91dGluZXMgYWJvdmUgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIGZldyBwbGFjZXMgZWxzZXdoZXJlCiAgKiBpbiB0aGUgZHJpdmVyIHdoZXJlIHRoaXMgbGV2ZWwgb2YgYWNjZXNzIGlzIHJlcXVpcmVkKS4KICAqLwogCi1zdGF0aWMgY29uc3QgdWludDE2X3QgQ29uZmlnUGh5WzI1XVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1MTYgQ29uZmlnUGh5WzI1XVsyXSA9IHsKIAkvKiBSZWcgICAgICBWYWx1ZSAgICAgIFJlZ2lzdGVyICovCiAJLyogQWRkciAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCXsweDg4MEIsIDB4MDkyNn0sCS8qIEFmZUlmQ3JlZzRCMTAwME1zYnMgKi8KQEAgLTgzMSw3ICs5MTMsNyBAQAogLyogY29uZGVuc2VkIHZlcnNpb24gb2YgdGhlIHBoeSBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCiB2b2lkIEVUMTMxMF9QaHlJbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JdWludDE2X3QgZGF0YSwgaW5kZXg7CisJdTE2IGRhdGEsIGluZGV4OwogCiAJaWYgKGV0ZGV2ID09IE5VTEwpCiAJCXJldHVybjsKQEAgLTg5NiwzMDQgKzk3OCwzIEBACiAJTWlXcml0ZShldGRldiwgUEhZX01QSFlfQ09OVFJPTF9SRUcsIDB4MDAwMik7CiB9CiAKLXZvaWQgRVQxMzEwX1BoeVJlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIDB4ODAwMCk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeVBvd2VyRG93bihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBib29sIGRvd24pCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQotCWlmIChkb3duID09IGZhbHNlKSB7Ci0JCS8qIFBvd2VyIFVQICovCi0JCWRhdGEgJj0gfjB4MDgwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCS8qIFBvd2VyIERPV04gKi8KLQkJZGF0YSB8PSAweDA4MDA7Ci0JCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLQl9Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgYm9vbCBlbmFibGUpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQotCWlmIChlbmFibGUgPT0gdHJ1ZSkgewotCQkvKiBBdXRvbmVnb3RpYXRpb24gT04gKi8KLQkJZGF0YSB8PSAweDEwMDA7Ci0JCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLQl9IGVsc2UgewotCQkvKiBBdXRvbmVnb3RpYXRpb24gT0ZGICovCi0JCWRhdGEgJj0gfjB4MTAwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0KLX0KLQotdm9pZCBFVDEzMTBfUGh5RHVwbGV4TW9kZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1aW50MTZfdCBkdXBsZXgpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQotCWlmIChkdXBsZXggPT0gVFJVRVBIWV9EVVBMRVhfRlVMTCkgewotCQkvKiBTZXQgRnVsbCBEdXBsZXggKi8KLQkJZGF0YSB8PSAweDEwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCS8qIFNldCBIYWxmIER1cGxleCAqLwotCQlkYXRhICY9IH4weDEwMDsKLQkJTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotCX0KLX0KLQotdm9pZCBFVDEzMTBfUGh5U3BlZWRTZWxlY3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdWludDE2X3Qgc3BlZWQpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCS8qIFJlYWQgdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOwotCi0JLyogQ2xlYXIgYWxsIFNwZWVkIHNldHRpbmdzIChCaXRzIDYsIDEzKSAqLwotCWRhdGEgJj0gfjB4MjA0MDsKLQotCS8qIFJlc2V0IHRoZSBzcGVlZCBiaXRzIGJhc2VkIG9uIHVzZXIgc2VsZWN0aW9uICovCi0Jc3dpdGNoIChzcGVlZCkgewotCWNhc2UgVFJVRVBIWV9TUEVFRF8xME1CUFM6Ci0JCS8qIEJpdHMgYWxyZWFkeSBjbGVhcmVkIGFib3ZlLCBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX1NQRUVEXzEwME1CUFM6Ci0JCS8qIDEwME0gPT0gU2V0IGJpdCAxMyAqLwotCQlkYXRhIHw9IDB4MjAwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfU1BFRURfMTAwME1CUFM6Ci0JZGVmYXVsdDoKLQkJZGF0YSB8PSAweDAwNDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdyaXRlIGJhY2sgdGhlIG5ldyBzcGVlZCAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLX0KLQotdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJICB1aW50MTZfdCBkdXBsZXgpCi17Ci0JdWludDE2X3QgZGF0YTsKLQotCS8qIFJlYWQgdGhlIFBIWSAxMDAwIEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfMTAwMF9DT05UUk9MLCAmZGF0YSk7Ci0KLQkvKiBDbGVhciBCaXRzIDgsOSAqLwotCWRhdGEgJj0gfjB4MDMwMDsKLQotCXN3aXRjaCAoZHVwbGV4KSB7Ci0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKLQkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6Ci0JCS8qIFNldCBCaXQgOSAqLwotCQlkYXRhIHw9IDB4MDIwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgotCQkvKiBTZXQgQml0IDggKi8KLQkJZGF0YSB8PSAweDAxMDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKLQlkZWZhdWx0OgotCQlkYXRhIHw9IDB4MDMwMDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCi0JTWlXcml0ZShldGRldiwgUEhZXzEwMDBfQ09OVFJPTCwgZGF0YSk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJIHVpbnQxNl90IGR1cGxleCkKLXsKLQl1aW50MTZfdCBkYXRhOwotCi0JLyogUmVhZCB0aGUgQXV0b25lZ290aWF0aW9uIFJlZ2lzdGVyICgxMC8xMDApICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCAmZGF0YSk7Ci0KLQkvKiBDbGVhciBiaXRzIDcsOCAqLwotCWRhdGEgJj0gfjB4MDE4MDsKLQotCXN3aXRjaCAoZHVwbGV4KSB7Ci0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKLQkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6Ci0JCS8qIFNldCBCaXQgOCAqLwotCQlkYXRhIHw9IDB4MDEwMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgotCQkvKiBTZXQgQml0IDcgKi8KLQkJZGF0YSB8PSAweDAwODA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKLQlkZWZhdWx0OgotCQkvKiBTZXQgQml0cyA3LDggKi8KLQkJZGF0YSB8PSAweDAxODA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsIGRhdGEpOwotfQotCi12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJdWludDE2X3QgZHVwbGV4KQotewotCXVpbnQxNl90IGRhdGE7Ci0KLQkvKiBSZWFkIHRoZSBBdXRvbmVnb3RpYXRpb24gUmVnaXN0ZXIgKDEwLzEwMCkgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsICZkYXRhKTsKLQotCS8qIENsZWFyIGJpdHMgNSw2ICovCi0JZGF0YSAmPSB+MHgwMDYwOwotCi0Jc3dpdGNoIChkdXBsZXgpIHsKLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9OT05FOgotCQkvKiBEdXBsZXggYWxyZWFkeSBjbGVhcmVkLCBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTDoKLQkJLyogU2V0IEJpdCA2ICovCi0JCWRhdGEgfD0gMHgwMDQwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEY6Ci0JCS8qIFNldCBCaXQgNSAqLwotCQlkYXRhIHw9IDB4MDAyMDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIOgotCWRlZmF1bHQ6Ci0JCS8qIFNldCBCaXRzIDUsNiAqLwotCQlkYXRhIHw9IDB4MDA2MDsKLQkJYnJlYWs7Ci0JfQotCi0JLyogV3JpdGUgYmFjayBhZHZlcnRpc2VtZW50ICovCi0JTWlXcml0ZShldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgZGF0YSk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUxpbmtTdGF0dXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCSAgdWludDhfdCAqbGlua19zdGF0dXMsCi0JCQkgIHVpbnQzMl90ICphdXRvbmVnLAotCQkJICB1aW50MzJfdCAqbGlua3NwZWVkLAotCQkJICB1aW50MzJfdCAqZHVwbGV4X21vZGUsCi0JCQkgIHVpbnQzMl90ICptZGlfbWRpeCwKLQkJCSAgdWludDMyX3QgKm1hc3RlcnNsYXZlLCB1aW50MzJfdCAqcG9sYXJpdHkpCi17Ci0JdWludDE2X3QgbWlzdGF0dXMgPSAwOwotCXVpbnQxNl90IGlzMTAwMEJhc2VUID0gMDsKLQl1aW50MTZfdCB2bWlfcGh5c3RhdHVzID0gMDsKLQl1aW50MTZfdCBjb250cm9sID0gMDsKLQotCU1pUmVhZChldGRldiwgUEhZX1NUQVRVUywgJm1pc3RhdHVzKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV8xMDAwX1NUQVRVUywgJmlzMTAwMEJhc2VUKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9QSFlfU1RBVFVTLCAmdm1pX3BoeXN0YXR1cyk7Ci0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmNvbnRyb2wpOwotCi0JaWYgKGxpbmtfc3RhdHVzKSB7Ci0JCSpsaW5rX3N0YXR1cyA9Ci0JCSAgICAodW5zaWduZWQgY2hhcikoKHZtaV9waHlzdGF0dXMgJiAweDAwNDApID8gMSA6IDApOwotCX0KLQotCWlmIChhdXRvbmVnKSB7Ci0JCSphdXRvbmVnID0KLQkJICAgIChjb250cm9sICYgMHgxMDAwKSA/ICgodm1pX3BoeXN0YXR1cyAmIDB4MDAyMCkgPwotCQkJCQkgICAgVFJVRVBIWV9BTkVHX0NPTVBMRVRFIDoKLQkJCQkJICAgIFRSVUVQSFlfQU5FR19OT1RfQ09NUExFVEUpIDoKLQkJICAgIFRSVUVQSFlfQU5FR19ESVNBQkxFRDsKLQl9Ci0KLQlpZiAobGlua3NwZWVkKQotCQkqbGlua3NwZWVkID0gKHZtaV9waHlzdGF0dXMgJiAweDAzMDApID4+IDg7Ci0KLQlpZiAoZHVwbGV4X21vZGUpCi0JCSpkdXBsZXhfbW9kZSA9ICh2bWlfcGh5c3RhdHVzICYgMHgwMDgwKSA+PiA3OwotCi0JaWYgKG1kaV9tZGl4KQotCQkvKiBOT1RFOiBOZWVkIHRvIGNvbXBsZXRlIHRoaXMgKi8KLQkJKm1kaV9tZGl4ID0gMDsKLQotCWlmIChtYXN0ZXJzbGF2ZSkgewotCQkqbWFzdGVyc2xhdmUgPQotCQkgICAgKGlzMTAwMEJhc2VUICYgMHg0MDAwKSA/IFRSVUVQSFlfQ0ZHX01BU1RFUiA6Ci0JCSAgICBUUlVFUEhZX0NGR19TTEFWRTsKLQl9Ci0KLQlpZiAocG9sYXJpdHkpIHsKLQkJKnBvbGFyaXR5ID0KLQkJICAgICh2bWlfcGh5c3RhdHVzICYgMHgwNDAwKSA/IFRSVUVQSFlfUE9MQVJJVFlfSU5WRVJURUQgOgotCQkgICAgVFJVRVBIWV9QT0xBUklUWV9OT1JNQUw7Ci0JfQotfQotCi12b2lkIEVUMTMxMF9QaHlBbmRPclJlZyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LAotCQkJdWludDE2X3QgcmVnbnVtLCB1aW50MTZfdCBhbmRNYXNrLCB1aW50MTZfdCBvck1hc2spCi17Ci0JdWludDE2X3QgcmVnOwotCi0JLyogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOwotCi0JLyogQXBwbHkgdGhlIEFORCBtYXNrICovCi0JcmVnICY9IGFuZE1hc2s7Ci0KLQkvKiBBcHBseSB0aGUgT1IgbWFzayAqLwotCXJlZyB8PSBvck1hc2s7Ci0KLQkvKiBXcml0ZSB0aGUgdmFsdWUgYmFjayB0byB0aGUgcmVnaXN0ZXIgKi8KLQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeUFjY2Vzc01pQml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHVpbnQxNl90IGFjdGlvbiwKLQkJCSAgIHVpbnQxNl90IHJlZ251bSwgdWludDE2X3QgYml0bnVtLCB1aW50OF90ICp2YWx1ZSkKLXsKLQl1aW50MTZfdCByZWc7Ci0JdWludDE2X3QgbWFzayA9IDA7Ci0KLQkvKiBDcmVhdGUgYSBtYXNrIHRvIGlzb2xhdGUgdGhlIHJlcXVlc3RlZCBiaXQgKi8KLQltYXNrID0gMHgwMDAxIDw8IGJpdG51bTsKLQotCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCByZWdpc3RlciAqLwotCU1pUmVhZChldGRldiwgcmVnbnVtLCAmcmVnKTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBUUlVFUEhZX0JJVF9SRUFEOgotCQlpZiAodmFsdWUgIT0gTlVMTCkKLQkJCSp2YWx1ZSA9IChyZWcgJiBtYXNrKSA+PiBiaXRudW07Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0JJVF9TRVQ6Ci0JCXJlZyB8PSBtYXNrOwotCQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0JJVF9DTEVBUjoKLQkJcmVnICY9IH5tYXNrOwotCQlNaVdyaXRlKGV0ZGV2LCByZWdudW0sIHJlZyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaAppbmRleCAwODA2NTZjLi43NThiOWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaApAQCAtNjEsOSArNjEsNiBAQAogCiAjaW5jbHVkZSAiZXQxMzEwX2FkZHJlc3NfbWFwLmgiCiAKLSNkZWZpbmUgVFJVRVBIWV9TVUNDRVNTIDAKLSNkZWZpbmUgVFJVRVBIWV9GQUlMVVJFIDEKLQogLyogTUkgUmVnaXN0ZXIgQWRkcmVzc2VzICovCiAjZGVmaW5lIE1JX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTUlfU1RBVFVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMQpAQCAtNzQyLDI1ICs3MzksMTUgQEAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBldDEzMXhfYWRhcHRlcjsKIAotLyogT1MgU3BlY2lmaWMgRnVuY3Rpb25zKi8KLXZvaWQgVFBBTF9TZXRQaHkxMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMEZvcmNlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqcEFkYXB0ZXIpOwotdm9pZCBUUEFMX1NldFBoeTEwMEhhbGZEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHkxMDBGdWxsRHVwbGV4KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIFRQQUxfU2V0UGh5MTAwRm9yY2Uoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIFRQQUxfU2V0UGh5MTAwMEZ1bGxEdXBsZXgoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgVFBBTF9TZXRQaHlBdXRvTmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci0KIC8qIFByb3RvdHlwZXMgZm9yIEVUMTMxMF9waHkuYyAqLwogaW50IGV0MTMxeF94Y3ZyX2ZpbmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLWludCBldDEzMXhfc2V0cGh5X25vcm1hbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotaW50MzJfdCBQaHlNaVJlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAotCSAgICAgICB1OCB4Y3ZyQWRkciwgdTggeGN2clJlZywgdTE2ICp2YWx1ZSk7Cit2b2lkIGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiAKIC8qIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBiZWNhdXNlIGV0MTMxeF9hZGFwdGVyIGlzIG5vdCBhbHdheXMKICAqIGRlZmluZWQKICAqLworaW50IFBoeU1pUmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHhjdnJBZGRyLAorCSAgICAgIHU4IHhjdnJSZWcsIHUxNiAqdmFsdWUpOwogI2RlZmluZSBNaVJlYWQoYWRhcHRlciwgeGN2clJlZywgdmFsdWUpIFwKIAlQaHlNaVJlYWQoKGFkYXB0ZXIpLCAoYWRhcHRlciktPlN0YXRzLnhjdnJfYWRkciwgKHhjdnJSZWcpLCAodmFsdWUpKQogCkBAIC04NjAsMjQgKzg0Nyw4IEBACiB2b2lkIEVUMTMxMF9QaHlJbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIEVUMTMxMF9QaHlSZXNldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBFVDEzMTBfUGh5UG93ZXJEb3duKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBkb3duKTsKLXZvaWQgRVQxMzEwX1BoeUF1dG9OZWcoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSk7Ci12b2lkIEVUMTMxMF9QaHlEdXBsZXhNb2RlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlTcGVlZFNlbGVjdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBzcGVlZCk7CiB2b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJIHUxNiBkdXBsZXgpOwotdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJdTE2IGR1cGxleCk7Ci12b2lkIEVUMTMxMF9QaHlMaW5rU3RhdHVzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgdTggKkxpbmtfc3RhdHVzLAotCQkJICB1MzIgKmF1dG9uZWcsCi0JCQkgIHUzMiAqbGlua3NwZWVkLAotCQkJICB1MzIgKmR1cGxleF9tb2RlLAotCQkJICB1MzIgKm1kaV9tZGl4LAotCQkJICB1MzIgKm1hc3RlcnNsYXZlLCB1MzIgKnBvbGFyaXR5KTsKLXZvaWQgRVQxMzEwX1BoeUFuZE9yUmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCXUxNiByZWdudW0sIHUxNiBhbmRNYXNrLCB1MTYgb3JNYXNrKTsKIHZvaWQgRVQxMzEwX1BoeUFjY2Vzc01pQml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKIAkJCSAgIHUxNiBhY3Rpb24sCiAJCQkgICB1MTYgcmVnbnVtLCB1MTYgYml0bnVtLCB1OCAqdmFsdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmMKaW5kZXggMTBlMjFkYi4uM2RkYzliMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jCkBAIC0xMDYsOSArMTA2LDkgQEAKICAqLwogaW50IGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQl1aW50MzJfdCBPdXRlckxvb3AsIElubmVyTG9vcDsKLQl1aW50MzJfdCBidWZzaXplOwotCXVpbnQzMl90IHBrdFN0YXRSaW5nU2l6ZSwgRkJSQ2h1bmtTaXplOworCXUzMiBpLCBqOworCXUzMiBidWZzaXplOworCXUzMiBwa3RTdGF0UmluZ1NpemUsIEZCUkNodW5rU2l6ZTsKIAlSWF9SSU5HX3QgKnJ4X3Jpbmc7CiAKIAkvKiBTZXR1cCBzb21lIGNvbnZlbmllbmNlIHBvaW50ZXJzICovCkBAIC0yMjcsMTEgKzIyNywxMSBAQAogCQkJCQlyeF9yaW5nLT5GYnIwb2Zmc2V0KTsKICNlbmRpZgogCi0JZm9yIChPdXRlckxvb3AgPSAwOyBPdXRlckxvb3AgPCAocnhfcmluZy0+RmJyMU51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsKLQkgICAgIE91dGVyTG9vcCsrKSB7Ci0JCXVpbnQ2NF90IEZicjFPZmZzZXQ7Ci0JCXVpbnQ2NF90IEZicjFUZW1wUGE7Ci0JCXVpbnQzMl90IEZicjFBbGlnbjsKKwlmb3IgKGkgPSAwOyBpIDwgKHJ4X3JpbmctPkZicjFOdW1FbnRyaWVzIC8gRkJSX0NIVU5LUyk7CisJICAgICBpKyspIHsKKwkJdTY0IEZicjFPZmZzZXQ7CisJCXU2NCBGYnIxVGVtcFBhOworCQl1MzIgRmJyMUFsaWduOwogCiAJCS8qIFRoaXMgY29kZSBhbGxvY2F0ZXMgYW4gYXJlYSBvZiBtZW1vcnkgYmlnIGVub3VnaCBmb3IgTgogCQkgKiBmcmVlIGJ1ZmZlcnMgKyAoYnVmZmVyX3NpemUgLSAxKSBzbyB0aGF0IHRoZSBidWZmZXJzIGNhbgpAQCAtMjQ3LDM5ICsyNDcsMzkgQEAKIAogCQlGQlJDaHVua1NpemUgPQogCQkgICAgKEZCUl9DSFVOS1MgKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxQWxpZ24gLSAxOwotCQlyeF9yaW5nLT5GYnIxTWVtVmFbT3V0ZXJMb29wXSA9CisJCXJ4X3JpbmctPkZicjFNZW1WYVtpXSA9CiAJCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBGQlJDaHVua1NpemUsCi0JCQkJCSAmcnhfcmluZy0+RmJyMU1lbVBhW091dGVyTG9vcF0pOworCQkJCQkgJnJ4X3JpbmctPkZicjFNZW1QYVtpXSk7CiAKLQkJaWYgKCFyeF9yaW5nLT5GYnIxTWVtVmFbT3V0ZXJMb29wXSkgeworCQlpZiAoIXJ4X3JpbmctPkZicjFNZW1WYVtpXSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIkNvdWxkIG5vdCBhbGxvYyBtZW1vcnlcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQkvKiBTZWUgTk9URSBpbiAiU2F2ZSBQaHlzaWNhbCBBZGRyZXNzIiBjb21tZW50IGFib3ZlICovCi0JCUZicjFUZW1wUGEgPSByeF9yaW5nLT5GYnIxTWVtUGFbT3V0ZXJMb29wXTsKKwkJRmJyMVRlbXBQYSA9IHJ4X3JpbmctPkZicjFNZW1QYVtpXTsKIAogCQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAogCQkJCQkgICAgICAmRmJyMVRlbXBQYSwKIAkJCQkJICAgICAgJkZicjFPZmZzZXQsIChGYnIxQWxpZ24gLSAxKSk7CiAKLQkJZm9yIChJbm5lckxvb3AgPSAwOyBJbm5lckxvb3AgPCBGQlJfQ0hVTktTOyBJbm5lckxvb3ArKykgewotCQkJdWludDMyX3QgaW5kZXggPSAoT3V0ZXJMb29wICogRkJSX0NIVU5LUykgKyBJbm5lckxvb3A7CisJCWZvciAoaiA9IDA7IGogPCBGQlJfQ0hVTktTOyBqKyspIHsKKwkJCXUzMiBpbmRleCA9IChpICogRkJSX0NIVU5LUykgKyBqOwogCiAJCQkvKiBTYXZlIHRoZSBWaXJ0dWFsIGFkZHJlc3Mgb2YgdGhpcyBpbmRleCBmb3IgcXVpY2sKIAkJCSAqIGFjY2VzcyBsYXRlcgogCQkJICovCiAJCQlyeF9yaW5nLT5GYnJbMV0tPlZhW2luZGV4XSA9Ci0JCQkgICAgKHVpbnQ4X3QgKikgcnhfcmluZy0+RmJyMU1lbVZhW091dGVyTG9vcF0gKwotCQkJICAgIChJbm5lckxvb3AgKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxT2Zmc2V0OworCQkJICAgICh1aW50OF90ICopIHJ4X3JpbmctPkZicjFNZW1WYVtpXSArCisJCQkgICAgKGogKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxT2Zmc2V0OwogCiAJCQkvKiBub3cgc3RvcmUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW4gdGhlIGRlc2NyaXB0b3IKIAkJCSAqIHNvIHRoZSBkZXZpY2UgY2FuIGFjY2VzcyBpdAogCQkJICovCiAJCQlyeF9yaW5nLT5GYnJbMV0tPlBBSGlnaFtpbmRleF0gPQotCQkJICAgICh1aW50MzJfdCkgKEZicjFUZW1wUGEgPj4gMzIpOwotCQkJcnhfcmluZy0+RmJyWzFdLT5QQUxvd1tpbmRleF0gPSAodWludDMyX3QpIEZicjFUZW1wUGE7CisJCQkgICAgKHUzMikgKEZicjFUZW1wUGEgPj4gMzIpOworCQkJcnhfcmluZy0+RmJyWzFdLT5QQUxvd1tpbmRleF0gPSAodTMyKSBGYnIxVGVtcFBhOwogCiAJCQlGYnIxVGVtcFBhICs9IHJ4X3JpbmctPkZicjFCdWZmZXJTaXplOwogCkBAIC0yOTIsNDAgKzI5Miw0MCBAQAogCiAjaWZkZWYgVVNFX0ZCUjAKIAkvKiBTYW1lIGZvciBGQlIwIChpZiBpbiB1c2UpICovCi0JZm9yIChPdXRlckxvb3AgPSAwOyBPdXRlckxvb3AgPCAocnhfcmluZy0+RmJyME51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsKLQkgICAgIE91dGVyTG9vcCsrKSB7Ci0JCXVpbnQ2NF90IEZicjBPZmZzZXQ7Ci0JCXVpbnQ2NF90IEZicjBUZW1wUGE7CisJZm9yIChpID0gMDsgaSA8IChyeF9yaW5nLT5GYnIwTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOworCSAgICAgaSsrKSB7CisJCXU2NCBGYnIwT2Zmc2V0OworCQl1NjQgRmJyMFRlbXBQYTsKIAogCQlGQlJDaHVua1NpemUgPSAoKEZCUl9DSFVOS1MgKyAxKSAqIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplKSAtIDE7Ci0JCXJ4X3JpbmctPkZicjBNZW1WYVtPdXRlckxvb3BdID0KKwkJcnhfcmluZy0+RmJyME1lbVZhW2ldID0KIAkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIEZCUkNodW5rU2l6ZSwKLQkJCQkJICZyeF9yaW5nLT5GYnIwTWVtUGFbT3V0ZXJMb29wXSk7CisJCQkJCSAmcnhfcmluZy0+RmJyME1lbVBhW2ldKTsKIAotCQlpZiAoIXJ4X3JpbmctPkZicjBNZW1WYVtPdXRlckxvb3BdKSB7CisJCWlmICghcnhfcmluZy0+RmJyME1lbVZhW2ldKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJIkNvdWxkIG5vdCBhbGxvYyBtZW1vcnlcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQkvKiBTZWUgTk9URSBpbiAiU2F2ZSBQaHlzaWNhbCBBZGRyZXNzIiBjb21tZW50IGFib3ZlICovCi0JCUZicjBUZW1wUGEgPSByeF9yaW5nLT5GYnIwTWVtUGFbT3V0ZXJMb29wXTsKKwkJRmJyMFRlbXBQYSA9IHJ4X3JpbmctPkZicjBNZW1QYVtpXTsKIAogCQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAogCQkJCQkgICAgICAmRmJyMFRlbXBQYSwKIAkJCQkJICAgICAgJkZicjBPZmZzZXQsCiAJCQkJCSAgICAgIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplIC0gMSk7CiAKLQkJZm9yIChJbm5lckxvb3AgPSAwOyBJbm5lckxvb3AgPCBGQlJfQ0hVTktTOyBJbm5lckxvb3ArKykgewotCQkJdWludDMyX3QgaW5kZXggPSAoT3V0ZXJMb29wICogRkJSX0NIVU5LUykgKyBJbm5lckxvb3A7CisJCWZvciAoaiA9IDA7IGogPCBGQlJfQ0hVTktTOyBqKyspIHsKKwkJCXUzMiBpbmRleCA9IChpICogRkJSX0NIVU5LUykgKyBqOwogCiAJCQlyeF9yaW5nLT5GYnJbMF0tPlZhW2luZGV4XSA9Ci0JCQkgICAgKHVpbnQ4X3QgKikgcnhfcmluZy0+RmJyME1lbVZhW091dGVyTG9vcF0gKwotCQkJICAgIChJbm5lckxvb3AgKiByeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSkgKyBGYnIwT2Zmc2V0OworCQkJICAgICh1aW50OF90ICopIHJ4X3JpbmctPkZicjBNZW1WYVtpXSArCisJCQkgICAgKGogKiByeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSkgKyBGYnIwT2Zmc2V0OwogCiAJCQlyeF9yaW5nLT5GYnJbMF0tPlBBSGlnaFtpbmRleF0gPQotCQkJICAgICh1aW50MzJfdCkgKEZicjBUZW1wUGEgPj4gMzIpOwotCQkJcnhfcmluZy0+RmJyWzBdLT5QQUxvd1tpbmRleF0gPSAodWludDMyX3QpIEZicjBUZW1wUGE7CisJCQkgICAgKHUzMikgKEZicjBUZW1wUGEgPj4gMzIpOworCQkJcnhfcmluZy0+RmJyWzBdLT5QQUxvd1tpbmRleF0gPSAodTMyKSBGYnIwVGVtcFBhOwogCiAJCQlGYnIwVGVtcFBhICs9IHJ4X3JpbmctPkZicjBCdWZmZXJTaXplOwogCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkgICAgc2l6ZW9mKFBLVF9TVEFUX0RFU0NfdCkgKiBhZGFwdGVyLT5SeFJpbmcuUHNyTnVtRW50cmllczsKIAogCXJ4X3JpbmctPnBQU1JpbmdWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgIHBrdFN0YXRSaW5nU2l6ZSArIDB4MGZmZiwKKwkJCQkJCSAgcGt0U3RhdFJpbmdTaXplLAogCQkJCQkJICAmcnhfcmluZy0+cFBTUmluZ1BhKTsKIAogCWlmICghcnhfcmluZy0+cFBTUmluZ1ZhKSB7CkBAIC0zNTAsNDUgKzM1MCwyNiBAQAogCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgUGFja2V0IFN0YXR1cyBSaW5nXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCXByaW50aygiUFNSICVseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHJ4X3JpbmctPnBQU1JpbmdQYSk7CiAKLQkvKiBTYXZlIHBoeXNpY2FsIGFkZHJlc3MKLQkgKgorCS8qCiAJICogTk9URSA6IHBjaV9hbGxvY19jb25zaXN0ZW50KCksIHVzZWQgYWJvdmUgdG8gYWxsb2MgRE1BIHJlZ2lvbnMsCiAJICogQUxXQVlTIHJldHVybnMgU0FDICgzMi1iaXQpIGFkZHJlc3Nlcy4gSWYgREFDICg2NC1iaXQpIGFkZHJlc3NlcwogCSAqIGFyZSBldmVyIHJldHVybmVkLCBtYWtlIHN1cmUgdGhlIGhpZ2ggcGFydCBpcyByZXRyaWV2ZWQgaGVyZSBiZWZvcmUKIAkgKiBzdG9yaW5nIHRoZSBhZGp1c3RlZCBhZGRyZXNzLgogCSAqLwotCXJ4X3JpbmctPnBQU1JpbmdSZWFsUGEgPSByeF9yaW5nLT5wUFNSaW5nUGE7Ci0KLQkvKiBBbGlnbiBQYWNrZXQgU3RhdHVzIFJpbmcgb24gYSA0SyBib3VuZGFyeSAqLwotCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJICAgICAgJnJ4X3JpbmctPnBQU1JpbmdSZWFsUGEsCi0JCQkJICAgICAgJnJ4X3JpbmctPnBQU1JpbmdPZmZzZXQsIDB4MEZGRik7Ci0KLQlyeF9yaW5nLT5wUFNSaW5nVmEgPSAodm9pZCAqKSgodWludDhfdCAqKSByeF9yaW5nLT5wUFNSaW5nVmEgKwotCQkJCSAgICAgIHJ4X3JpbmctPnBQU1JpbmdPZmZzZXQpOwogCiAJLyogQWxsb2NhdGUgYW4gYXJlYSBvZiBtZW1vcnkgZm9yIHdyaXRlYmFjayBvZiBzdGF0dXMgaW5mb3JtYXRpb24gKi8KIAlyeF9yaW5nLT5wUnhTdGF0dXNWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgICAgc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSArCi0JCQkJCQkgICAgMHg3LCAmcnhfcmluZy0+cFJ4U3RhdHVzUGEpOworCQkJCQkJICAgIHNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCksCisJCQkJCQkgICAgJnJ4X3JpbmctPnBSeFN0YXR1c1BhKTsKIAlpZiAoIXJ4X3JpbmctPnBSeFN0YXR1c1ZhKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFN0YXR1cyBCbG9ja1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQotCS8qIFNhdmUgcGh5c2ljYWwgYWRkcmVzcyAqLwotCXJ4X3JpbmctPlJ4U3RhdHVzUmVhbFBBID0gcnhfcmluZy0+cFJ4U3RhdHVzUGE7Ci0KLQkvKiBBbGlnbiB3cml0ZSBiYWNrIG9uIGFuIDggYnl0ZSBib3VuZGFyeSAqLwotCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJICAgICAgJnJ4X3JpbmctPlJ4U3RhdHVzUmVhbFBBLAotCQkJCSAgICAgICZyeF9yaW5nLT5SeFN0YXR1c09mZnNldCwgMHgwNyk7Ci0KLQlyeF9yaW5nLT5wUnhTdGF0dXNWYSA9ICh2b2lkICopKCh1aW50OF90ICopIHJ4X3JpbmctPnBSeFN0YXR1c1ZhICsKLQkJCQkJcnhfcmluZy0+UnhTdGF0dXNPZmZzZXQpOwogCXJ4X3JpbmctPk51bVJmZCA9IE5JQ19ERUZBVUxUX05VTV9SRkQ7CisJcHJpbnRrKCJQUlMgJWx4XG4iLCAodW5zaWduZWQgbG9uZylyeF9yaW5nLT5wUnhTdGF0dXNQYSk7CiAKIAkvKiBSZWN2CiAJICogcGNpX3Bvb2xfY3JlYXRlIGluaXRpYWxpemVzIGEgbG9va2FzaWRlIGxpc3QuIEFmdGVyIHN1Y2Nlc3NmdWwKQEAgLTQwOSw3ICszOTAsNiBAQAogCSAqIGxpc3RzIG5vdy4KIAkgKi8KIAlJTklUX0xJU1RfSEVBRCgmcnhfcmluZy0+UmVjdkxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZyeF9yaW5nLT5SZWN2UGVuZGluZ0xpc3QpOwogCXJldHVybiAwOwogfQogCkBAIC00MTksMTAgKzM5OSwxMCBAQAogICovCiB2b2lkIGV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewotCXVpbnQzMl90IGluZGV4OwotCXVpbnQzMl90IGJ1ZnNpemU7Ci0JdWludDMyX3QgcGt0U3RhdFJpbmdTaXplOwotCVBNUF9SRkQgcE1wUmZkOworCXUzMiBpbmRleDsKKwl1MzIgYnVmc2l6ZTsKKwl1MzIgcGt0U3RhdFJpbmdTaXplOworCVBNUF9SRkQgcmZkOwogCVJYX1JJTkdfdCAqcnhfcmluZzsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KQEAgLTQzMiwxOCArNDEyLDEyIEBACiAJV0FSTl9PTihyeF9yaW5nLT5uUmVhZHlSZWN2ICE9IHJ4X3JpbmctPk51bVJmZCk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4X3JpbmctPlJlY3ZMaXN0KSkgewotCQlwTXBSZmQgPSAoTVBfUkZEICopIGxpc3RfZW50cnkocnhfcmluZy0+UmVjdkxpc3QubmV4dCwKKwkJcmZkID0gKE1QX1JGRCAqKSBsaXN0X2VudHJ5KHJ4X3JpbmctPlJlY3ZMaXN0Lm5leHQsCiAJCQkJCSAgICAgICBNUF9SRkQsIGxpc3Rfbm9kZSk7CiAKLQkJbGlzdF9kZWwoJnBNcFJmZC0+bGlzdF9ub2RlKTsKLQkJZXQxMzF4X3JmZF9yZXNvdXJjZXNfZnJlZShhZGFwdGVyLCBwTXBSZmQpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmcnhfcmluZy0+UmVjdlBlbmRpbmdMaXN0KSkgewotCQlwTXBSZmQgPSAoTVBfUkZEICopIGxpc3RfZW50cnkocnhfcmluZy0+UmVjdlBlbmRpbmdMaXN0Lm5leHQsCi0JCQkJCSAgICAgICBNUF9SRkQsIGxpc3Rfbm9kZSk7Ci0JCWxpc3RfZGVsKCZwTXBSZmQtPmxpc3Rfbm9kZSk7Ci0JCWV0MTMxeF9yZmRfcmVzb3VyY2VzX2ZyZWUoYWRhcHRlciwgcE1wUmZkKTsKKwkJbGlzdF9kZWwoJnJmZC0+bGlzdF9ub2RlKTsKKwkJcmZkLT5QYWNrZXQgPSBOVUxMOworCQlrbWVtX2NhY2hlX2ZyZWUoYWRhcHRlci0+UnhSaW5nLlJlY3ZMb29rYXNpZGUsIHJmZCk7CiAJfQogCiAJLyogRnJlZSBGcmVlIEJ1ZmZlciBSaW5nIDEgKi8KQEAgLTQ1Miw3ICs0MjYsNyBAQAogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPAogCQkgICAgIChyeF9yaW5nLT5GYnIxTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOyBpbmRleCsrKSB7CiAJCQlpZiAocnhfcmluZy0+RmJyMU1lbVZhW2luZGV4XSkgewotCQkJCXVpbnQzMl90IEZicjFBbGlnbjsKKwkJCQl1MzIgRmJyMUFsaWduOwogCiAJCQkJaWYgKHJ4X3JpbmctPkZicjFCdWZmZXJTaXplID4gNDA5NikKIAkJCQkJRmJyMUFsaWduID0gNDA5NjsKQEAgLTUyMywxNCArNDk3LDEwIEBACiAKIAkvKiBGcmVlIFBhY2tldCBTdGF0dXMgUmluZyAqLwogCWlmIChyeF9yaW5nLT5wUFNSaW5nVmEpIHsKLQkJcnhfcmluZy0+cFBTUmluZ1ZhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikgcnhfcmluZy0+cFBTUmluZ1ZhIC0KLQkJCQkJICAgICAgcnhfcmluZy0+cFBTUmluZ09mZnNldCk7Ci0KIAkJcGt0U3RhdFJpbmdTaXplID0KIAkJICAgIHNpemVvZihQS1RfU1RBVF9ERVNDX3QpICogYWRhcHRlci0+UnhSaW5nLlBzck51bUVudHJpZXM7CiAKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCSAgICBwa3RTdGF0UmluZ1NpemUgKyAweDBmZmYsCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcGt0U3RhdFJpbmdTaXplLAogCQkJCSAgICByeF9yaW5nLT5wUFNSaW5nVmEsIHJ4X3JpbmctPnBQU1JpbmdQYSk7CiAKIAkJcnhfcmluZy0+cFBTUmluZ1ZhID0gTlVMTDsKQEAgLTUzOCwxMSArNTA4LDggQEAKIAogCS8qIEZyZWUgYXJlYSBvZiBtZW1vcnkgZm9yIHRoZSB3cml0ZWJhY2sgb2Ygc3RhdHVzIGluZm9ybWF0aW9uICovCiAJaWYgKHJ4X3JpbmctPnBSeFN0YXR1c1ZhKSB7Ci0JCXJ4X3JpbmctPnBSeFN0YXR1c1ZhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikKLQkJCQlyeF9yaW5nLT5wUnhTdGF0dXNWYSAtIHJ4X3JpbmctPlJ4U3RhdHVzT2Zmc2V0KTsKLQogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJc2l6ZW9mKFJYX1NUQVRVU19CTE9DS190KSArIDB4NywKKwkJCQlzaXplb2YoUlhfU1RBVFVTX0JMT0NLX3QpLAogCQkJCXJ4X3JpbmctPnBSeFN0YXR1c1ZhLCByeF9yaW5nLT5wUnhTdGF0dXNQYSk7CiAKIAkJcnhfcmluZy0+cFJ4U3RhdHVzVmEgPSBOVUxMOwpAQCAtNTc4LDQ5ICs1NDUsNDMgQEAKIGludCBldDEzMXhfaW5pdF9yZWN2KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzID0gLUVOT01FTTsKLQlQTVBfUkZEIHBNcFJmZCA9IE5VTEw7Ci0JdWludDMyX3QgUmZkQ291bnQ7Ci0JdWludDMyX3QgVG90YWxOdW1SZmQgPSAwOworCVBNUF9SRkQgcmZkID0gTlVMTDsKKwl1MzIgcmZkY3Q7CisJdTMyIG51bXJmZCA9IDA7CiAJUlhfUklOR190ICpyeF9yaW5nID0gTlVMTDsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KIAlyeF9yaW5nID0gKFJYX1JJTkdfdCAqKSAmYWRhcHRlci0+UnhSaW5nOwogCiAJLyogU2V0dXAgZWFjaCBSRkQgKi8KLQlmb3IgKFJmZENvdW50ID0gMDsgUmZkQ291bnQgPCByeF9yaW5nLT5OdW1SZmQ7IFJmZENvdW50KyspIHsKLQkJcE1wUmZkID0gKE1QX1JGRCAqKSBrbWVtX2NhY2hlX2FsbG9jKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsCisJZm9yIChyZmRjdCA9IDA7IHJmZGN0IDwgcnhfcmluZy0+TnVtUmZkOyByZmRjdCsrKSB7CisJCXJmZCA9IChNUF9SRkQgKikga21lbV9jYWNoZV9hbGxvYyhyeF9yaW5nLT5SZWN2TG9va2FzaWRlLAogCQkJCQkJICAgICBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CiAKLQkJaWYgKCFwTXBSZmQpIHsKKwkJaWYgKCFyZmQpIHsKIAkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCQkgICJDb3VsZG4ndCBhbGxvYyBSRkQgb3V0IG9mIGttZW1fY2FjaGVcbiIpOwogCQkJc3RhdHVzID0gLUVOT01FTTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc3RhdHVzID0gZXQxMzF4X3JmZF9yZXNvdXJjZXNfYWxsb2MoYWRhcHRlciwgcE1wUmZkKTsKLQkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJICAiQ291bGRuJ3QgYWxsb2MgcGFja2V0IGZvciBSRkRcbiIpOwotCQkJa21lbV9jYWNoZV9mcmVlKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsIHBNcFJmZCk7Ci0JCQljb250aW51ZTsKLQkJfQorCQlyZmQtPlBhY2tldCA9IE5VTEw7CiAKIAkJLyogQWRkIHRoaXMgUkZEIHRvIHRoZSBSZWN2TGlzdCAqLwotCQlsaXN0X2FkZF90YWlsKCZwTXBSZmQtPmxpc3Rfbm9kZSwgJnJ4X3JpbmctPlJlY3ZMaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcmZkLT5saXN0X25vZGUsICZyeF9yaW5nLT5SZWN2TGlzdCk7CiAKIAkJLyogSW5jcmVtZW50IGJvdGggdGhlIGF2YWlsYWJsZSBSRkQncywgYW5kIHRoZSB0b3RhbCBSRkQncy4gKi8KIAkJcnhfcmluZy0+blJlYWR5UmVjdisrOwotCQlUb3RhbE51bVJmZCsrOworCQludW1yZmQrKzsKIAl9CiAKLQlpZiAoVG90YWxOdW1SZmQgPiBOSUNfTUlOX05VTV9SRkQpCisJaWYgKG51bXJmZCA+IE5JQ19NSU5fTlVNX1JGRCkKIAkJc3RhdHVzID0gMDsKIAotCXJ4X3JpbmctPk51bVJmZCA9IFRvdGFsTnVtUmZkOworCXJ4X3JpbmctPk51bVJmZCA9IG51bXJmZDsKIAogCWlmIChzdGF0dXMgIT0gMCkgewotCQlrbWVtX2NhY2hlX2ZyZWUocnhfcmluZy0+UmVjdkxvb2thc2lkZSwgcE1wUmZkKTsKKwkJa21lbV9jYWNoZV9mcmVlKHJ4X3JpbmctPlJlY3ZMb29rYXNpZGUsIHJmZCk7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSAgIkFsbG9jYXRpb24gcHJvYmxlbXMgaW4gZXQxMzF4X2luaXRfcmVjdlxuIik7CiAJfQpAQCAtNjI4LDQxICs1ODksMTYgQEAKIH0KIAogLyoqCi0gKiBldDEzMXhfcmZkX3Jlc291cmNlc19hbGxvYwotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqIEBwTXBSZmQ6IHBvaW50ZXIgdG8gYSBSRkQKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQotICovCi1pbnQgZXQxMzF4X3JmZF9yZXNvdXJjZXNfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBNUF9SRkQgKnBNcFJmZCkKLXsKLQlwTXBSZmQtPlBhY2tldCA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfcmZkX3Jlc291cmNlc19mcmVlIC0gRnJlZSB0aGUgcGFja2V0IGFsbG9jYXRlZCBmb3IgdGhlIGdpdmVuIFJGRAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqIEBwTXBSZmQ6IHBvaW50ZXIgdG8gYSBSRkQKLSAqLwotdm9pZCBldDEzMXhfcmZkX3Jlc291cmNlc19mcmVlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgTVBfUkZEICpwTXBSZmQpCi17Ci0JcE1wUmZkLT5QYWNrZXQgPSBOVUxMOwotCWttZW1fY2FjaGVfZnJlZShhZGFwdGVyLT5SeFJpbmcuUmVjdkxvb2thc2lkZSwgcE1wUmZkKTsKLX0KLQotLyoqCiAgKiBDb25maWdSeERtYVJlZ3MgLSBTdGFydCBvZiBSeF9ETUEgaW5pdCBzZXF1ZW5jZQogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQogICovCiB2b2lkIENvbmZpZ1J4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewogCXN0cnVjdCBfUlhETUFfdCBfX2lvbWVtICpyeF9kbWEgPSAmZXRkZXYtPnJlZ3MtPnJ4ZG1hOwotCXN0cnVjdCBfcnhfcmluZ190ICpwUnhMb2NhbCA9ICZldGRldi0+UnhSaW5nOworCXN0cnVjdCBfcnhfcmluZ190ICpyeF9sb2NhbCA9ICZldGRldi0+UnhSaW5nOwogCVBGQlJfREVTQ190IGZicl9lbnRyeTsKLQl1aW50MzJfdCBlbnRyeTsKLQlSWERNQV9QU1JfTlVNX0RFU190IHBzcl9udW1fZGVzOworCXUzMiBlbnRyeTsKKwl1MzIgcHNyX251bV9kZXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEhhbHQgUlhETUEgdG8gcGVyZm9ybSB0aGUgcmVjb25maWd1cmUuICAqLwpAQCAtNjc1LDM2ICs2MTEsMzUgQEAKIAkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUKIAkgKiBiZWZvcmUgc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KIAkgKi8KLQl3cml0ZWwoKHVpbnQzMl90KSAocFJ4TG9jYWwtPlJ4U3RhdHVzUmVhbFBBID4+IDMyKSwKKwl3cml0ZWwoKHUzMikgKCh1NjQpcnhfbG9jYWwtPnBSeFN0YXR1c1BhID4+IDMyKSwKIAkgICAgICAgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfaGkpOwotCXdyaXRlbCgodWludDMyX3QpIHBSeExvY2FsLT5SeFN0YXR1c1JlYWxQQSwgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfbG8pOworCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+cFJ4U3RhdHVzUGEsICZyeF9kbWEtPmRtYV93Yl9iYXNlX2xvKTsKIAotCW1lbXNldChwUnhMb2NhbC0+cFJ4U3RhdHVzVmEsIDAsIHNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCkpOworCW1lbXNldChyeF9sb2NhbC0+cFJ4U3RhdHVzVmEsIDAsIHNpemVvZihSWF9TVEFUVVNfQkxPQ0tfdCkpOwogCiAJLyogU2V0IHRoZSBhZGRyZXNzIGFuZCBwYXJhbWV0ZXJzIG9mIHRoZSBwYWNrZXQgc3RhdHVzIHJpbmcgaW50byB0aGUKIAkgKiAxMzEwJ3MgcmVnaXN0ZXJzCiAJICovCi0Jd3JpdGVsKCh1aW50MzJfdCkgKHBSeExvY2FsLT5wUFNSaW5nUmVhbFBhID4+IDMyKSwKKwl3cml0ZWwoKHUzMikgKCh1NjQpcnhfbG9jYWwtPnBQU1JpbmdQYSA+PiAzMiksCiAJICAgICAgICZyeF9kbWEtPnBzcl9iYXNlX2hpKTsKLQl3cml0ZWwoKHVpbnQzMl90KSBwUnhMb2NhbC0+cFBTUmluZ1JlYWxQYSwgJnJ4X2RtYS0+cHNyX2Jhc2VfbG8pOwotCXdyaXRlbChwUnhMb2NhbC0+UHNyTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPnBzcl9udW1fZGVzLnZhbHVlKTsKLQl3cml0ZWwoMCwgJnJ4X2RtYS0+cHNyX2Z1bGxfb2Zmc2V0LnZhbHVlKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPnBQU1JpbmdQYSwgJnJ4X2RtYS0+cHNyX2Jhc2VfbG8pOworCXdyaXRlbChyeF9sb2NhbC0+UHNyTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPnBzcl9udW1fZGVzKTsKKwl3cml0ZWwoMCwgJnJ4X2RtYS0+cHNyX2Z1bGxfb2Zmc2V0KTsKIAotCXBzcl9udW1fZGVzLnZhbHVlID0gcmVhZGwoJnJ4X2RtYS0+cHNyX251bV9kZXMudmFsdWUpOwotCXdyaXRlbCgocHNyX251bV9kZXMuYml0cy5wc3JfbmRlcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSKSAvIDEwMCwKLQkgICAgICAgJnJ4X2RtYS0+cHNyX21pbl9kZXMudmFsdWUpOworCXBzcl9udW1fZGVzID0gcmVhZGwoJnJ4X2RtYS0+cHNyX251bV9kZXMpICYgMHhGRkY7CisJd3JpdGVsKChwc3JfbnVtX2RlcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSKSAvIDEwMCwKKwkgICAgICAgJnJ4X2RtYS0+cHNyX21pbl9kZXMpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiAKIAkvKiBUaGVzZSBsb2NhbCB2YXJpYWJsZXMgdHJhY2sgdGhlIFBTUiBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KLQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbCA9IDA7Ci0JcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGxfd3JhcCA9IDA7CisJcnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsID0gMDsKIAogCS8qIE5vdydzIHRoZSBiZXN0IHRpbWUgdG8gaW5pdGlhbGl6ZSBGQlIxIGNvbnRlbnRzICovCi0JZmJyX2VudHJ5ID0gKFBGQlJfREVTQ190KSBwUnhMb2NhbC0+cEZicjFSaW5nVmE7Ci0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgcFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzOyBlbnRyeSsrKSB7Ci0JCWZicl9lbnRyeS0+YWRkcl9oaSA9IHBSeExvY2FsLT5GYnJbMV0tPlBBSGlnaFtlbnRyeV07Ci0JCWZicl9lbnRyeS0+YWRkcl9sbyA9IHBSeExvY2FsLT5GYnJbMV0tPlBBTG93W2VudHJ5XTsKKwlmYnJfZW50cnkgPSAoUEZCUl9ERVNDX3QpIHJ4X2xvY2FsLT5wRmJyMVJpbmdWYTsKKwlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCByeF9sb2NhbC0+RmJyMU51bUVudHJpZXM7IGVudHJ5KyspIHsKKwkJZmJyX2VudHJ5LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclsxXS0+UEFIaWdoW2VudHJ5XTsKKwkJZmJyX2VudHJ5LT5hZGRyX2xvID0gcnhfbG9jYWwtPkZiclsxXS0+UEFMb3dbZW50cnldOwogCQlmYnJfZW50cnktPndvcmQyLmJpdHMuYmkgPSBlbnRyeTsKIAkJZmJyX2VudHJ5Kys7CiAJfQpAQCAtNzEyLDM5ICs2NDcsMzkgQEAKIAkvKiBTZXQgdGhlIGFkZHJlc3MgYW5kIHBhcmFtZXRlcnMgb2YgRnJlZSBidWZmZXIgcmluZyAxIChhbmQgMCBpZgogCSAqIHJlcXVpcmVkKSBpbnRvIHRoZSAxMzEwJ3MgcmVnaXN0ZXJzCiAJICovCi0Jd3JpdGVsKCh1aW50MzJfdCkgKHBSeExvY2FsLT5GYnIxUmVhbHBhID4+IDMyKSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2hpKTsKLQl3cml0ZWwoKHVpbnQzMl90KSBwUnhMb2NhbC0+RmJyMVJlYWxwYSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2xvKTsKLQl3cml0ZWwocFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+ZmJyMV9udW1fZGVzLnZhbHVlKTsKKwl3cml0ZWwoKHUzMikgKHJ4X2xvY2FsLT5GYnIxUmVhbHBhID4+IDMyKSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2hpKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPkZicjFSZWFscGEsICZyeF9kbWEtPmZicjFfYmFzZV9sbyk7CisJd3JpdGVsKHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPmZicjFfbnVtX2Rlcyk7CiAJd3JpdGVsKEVUX0RNQTEwX1dSQVAsICZyeF9kbWEtPmZicjFfZnVsbF9vZmZzZXQpOwogCiAJLyogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGZyZWUgYnVmZmVyIHJpbmcgMSBmdWxsIHBvc2l0aW9uLCBzbyBpdAogCSAqIGhhcyB0byBtYXRjaCB0aGUgYWJvdmUuCiAJICovCi0JcFJ4TG9jYWwtPmxvY2FsX0ZicjFfZnVsbCA9IEVUX0RNQTEwX1dSQVA7Ci0Jd3JpdGVsKCgocFJ4TG9jYWwtPkZicjFOdW1FbnRyaWVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCkgLyAxMDApIC0gMSwKLQkgICAgICAgJnJ4X2RtYS0+ZmJyMV9taW5fZGVzLnZhbHVlKTsKKwlyeF9sb2NhbC0+bG9jYWxfRmJyMV9mdWxsID0gRVRfRE1BMTBfV1JBUDsKKwl3cml0ZWwoKChyeF9sb2NhbC0+RmJyMU51bUVudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAorCSAgICAgICAmcnhfZG1hLT5mYnIxX21pbl9kZXMpOwogCiAjaWZkZWYgVVNFX0ZCUjAKIAkvKiBOb3cncyB0aGUgYmVzdCB0aW1lIHRvIGluaXRpYWxpemUgRkJSMCBjb250ZW50cyAqLwotCWZicl9lbnRyeSA9IChQRkJSX0RFU0NfdCkgcFJ4TG9jYWwtPnBGYnIwUmluZ1ZhOwotCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHBSeExvY2FsLT5GYnIwTnVtRW50cmllczsgZW50cnkrKykgewotCQlmYnJfZW50cnktPmFkZHJfaGkgPSBwUnhMb2NhbC0+RmJyWzBdLT5QQUhpZ2hbZW50cnldOwotCQlmYnJfZW50cnktPmFkZHJfbG8gPSBwUnhMb2NhbC0+RmJyWzBdLT5QQUxvd1tlbnRyeV07CisJZmJyX2VudHJ5ID0gKFBGQlJfREVTQ190KSByeF9sb2NhbC0+cEZicjBSaW5nVmE7CisJZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgcnhfbG9jYWwtPkZicjBOdW1FbnRyaWVzOyBlbnRyeSsrKSB7CisJCWZicl9lbnRyeS0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBSGlnaFtlbnRyeV07CisJCWZicl9lbnRyeS0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBTG93W2VudHJ5XTsKIAkJZmJyX2VudHJ5LT53b3JkMi5iaXRzLmJpID0gZW50cnk7CiAJCWZicl9lbnRyeSsrOwogCX0KIAotCXdyaXRlbCgodWludDMyX3QpIChwUnhMb2NhbC0+RmJyMFJlYWxwYSA+PiAzMiksICZyeF9kbWEtPmZicjBfYmFzZV9oaSk7Ci0Jd3JpdGVsKCh1aW50MzJfdCkgcFJ4TG9jYWwtPkZicjBSZWFscGEsICZyeF9kbWEtPmZicjBfYmFzZV9sbyk7Ci0Jd3JpdGVsKHBSeExvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPmZicjBfbnVtX2Rlcy52YWx1ZSk7CisJd3JpdGVsKCh1MzIpIChyeF9sb2NhbC0+RmJyMFJlYWxwYSA+PiAzMiksICZyeF9kbWEtPmZicjBfYmFzZV9oaSk7CisJd3JpdGVsKCh1MzIpIHJ4X2xvY2FsLT5GYnIwUmVhbHBhLCAmcnhfZG1hLT5mYnIwX2Jhc2VfbG8pOworCXdyaXRlbChyeF9sb2NhbC0+RmJyME51bUVudHJpZXMgLSAxLCAmcnhfZG1hLT5mYnIwX251bV9kZXMpOwogCXdyaXRlbChFVF9ETUExMF9XUkFQLCAmcnhfZG1hLT5mYnIwX2Z1bGxfb2Zmc2V0KTsKIAogCS8qIFRoaXMgdmFyaWFibGUgdHJhY2tzIHRoZSBmcmVlIGJ1ZmZlciByaW5nIDAgZnVsbCBwb3NpdGlvbiwgc28gaXQKIAkgKiBoYXMgdG8gbWF0Y2ggdGhlIGFib3ZlLgogCSAqLwotCXBSeExvY2FsLT5sb2NhbF9GYnIwX2Z1bGwgPSBFVF9ETUExMF9XUkFQOwotCXdyaXRlbCgoKHBSeExvY2FsLT5GYnIwTnVtRW50cmllcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUlgpIC8gMTAwKSAtIDEsCi0JICAgICAgICZyeF9kbWEtPmZicjBfbWluX2Rlcy52YWx1ZSk7CisJcnhfbG9jYWwtPmxvY2FsX0ZicjBfZnVsbCA9IEVUX0RNQTEwX1dSQVA7CisJd3JpdGVsKCgocnhfbG9jYWwtPkZicjBOdW1FbnRyaWVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCkgLyAxMDApIC0gMSwKKwkgICAgICAgJnJ4X2RtYS0+ZmJyMF9taW5fZGVzKTsKICNlbmRpZgogCiAJLyogUHJvZ3JhbSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2Ugd2lsbCByZWNlaXZlIGJlZm9yZSBnZW5lcmF0aW5nIGFuCkBAIC03NTIsMTQgKzY4NywxNCBAQAogCSAqIEZvciB2ZXJzaW9uIEIgc2lsaWNvbiwgdGhpcyB2YWx1ZSBnZXRzIHVwZGF0ZWQgb25jZSBhdXRvbmVnIGlzCiAJICpjb21wbGV0ZS4KIAkgKi8KLQl3cml0ZWwoUEFSTV9SWF9OVU1fQlVGU19ERUYsICZyeF9kbWEtPm51bV9wa3RfZG9uZS52YWx1ZSk7CisJd3JpdGVsKFBBUk1fUlhfTlVNX0JVRlNfREVGLCAmcnhfZG1hLT5udW1fcGt0X2RvbmUpOwogCiAJLyogVGhlICJ0aW1lX2RvbmUiIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSB0byBjb2FsZXNjZSBpbnRlcnJ1cHRzCiAJICogYWZ0ZXIgYSBnaXZlbiB0aW1lIHBlcmlvZCwgYnV0IHJhdGhlciBpcyBnaXZpbmcgdXMgYW4gaW50ZXJydXB0CiAJICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGhhdmUgcmVjZWl2ZWQgcGFja2V0cy4KIAkgKiBUaGlzIHZhbHVlIGdldHMgdXBkYXRlZCBvbmNlIGF1dG9uZWcgaXMgY29tcGxldGUuCiAJICovCi0Jd3JpdGVsKFBBUk1fUlhfVElNRV9JTlRfREVGLCAmcnhfZG1hLT5tYXhfcGt0X3RpbWUudmFsdWUpOworCXdyaXRlbChQQVJNX1JYX1RJTUVfSU5UX0RFRiwgJnJ4X2RtYS0+bWF4X3BrdF90aW1lKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5SY3ZMb2NrLCBmbGFncyk7CiB9CkBAIC03NzUsOCArNzEwLDggQEAKIAkgKi8KIAlpZiAoKGV0ZGV2LT5saW5rc3BlZWQgPT0gVFJVRVBIWV9TUEVFRF8xMDBNQlBTKSB8fAogCSAgICAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwTUJQUykpIHsKLQkJd3JpdGVsKDAsICZldGRldi0+cmVncy0+cnhkbWEubWF4X3BrdF90aW1lLnZhbHVlKTsKLQkJd3JpdGVsKDEsICZldGRldi0+cmVncy0+cnhkbWEubnVtX3BrdF9kb25lLnZhbHVlKTsKKwkJd3JpdGVsKDAsICZldGRldi0+cmVncy0+cnhkbWEubWF4X3BrdF90aW1lKTsKKwkJd3JpdGVsKDEsICZldGRldi0+cmVncy0+cnhkbWEubnVtX3BrdF9kb25lKTsKIAl9CiB9CiAKQEAgLTgwNyw0MCArNzQyLDM1IEBACiAgKi8KIHZvaWQgZXQxMzF4X3J4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlpZiAoZXRkZXYtPlJlZ2lzdHJ5UGh5TG9vcGJrKQotCQkvKiBSeERNQSBpcyBkaXNhYmxlZCBmb3IgbG9vcGJhY2sgb3BlcmF0aW9uLiAqLwotCQl3cml0ZWwoMHgxLCAmZXRkZXYtPnJlZ3MtPnJ4ZG1hLmNzci52YWx1ZSk7Ci0JZWxzZSB7CiAJLyogU2V0dXAgdGhlIHJlY2VpdmUgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIG5vcm1hbCBvcGVyYXRpb24gKi8KLQkJUlhETUFfQ1NSX3QgY3NyID0geyAwIH07CisJUlhETUFfQ1NSX3QgY3NyID0geyAwIH07CiAKLQkJY3NyLmJpdHMuZmJyMV9lbmFibGUgPSAxOwotCQlpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA0MDk2KQotCQkJY3NyLmJpdHMuZmJyMV9zaXplID0gMTsKLQkJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA4MTkyKQotCQkJY3NyLmJpdHMuZmJyMV9zaXplID0gMjsKLQkJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSAxNjM4NCkKLQkJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDM7CisJY3NyLmJpdHMuZmJyMV9lbmFibGUgPSAxOworCWlmIChldGRldi0+UnhSaW5nLkZicjFCdWZmZXJTaXplID09IDQwOTYpCisJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDE7CisJZWxzZSBpZiAoZXRkZXYtPlJ4UmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA4MTkyKQorCQljc3IuYml0cy5mYnIxX3NpemUgPSAyOworCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMUJ1ZmZlclNpemUgPT0gMTYzODQpCisJCWNzci5iaXRzLmZicjFfc2l6ZSA9IDM7CiAjaWZkZWYgVVNFX0ZCUjAKLQkJY3NyLmJpdHMuZmJyMF9lbmFibGUgPSAxOwotCQlpZiAoZXRkZXYtPlJ4UmluZy5GYnIwQnVmZmVyU2l6ZSA9PSAyNTYpCi0JCQljc3IuYml0cy5mYnIwX3NpemUgPSAxOwotCQllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDUxMikKLQkJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDI7Ci0JCWVsc2UgaWYgKGV0ZGV2LT5SeFJpbmcuRmJyMEJ1ZmZlclNpemUgPT0gMTAyNCkKLQkJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDM7CisJY3NyLmJpdHMuZmJyMF9lbmFibGUgPSAxOworCWlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDI1NikKKwkJY3NyLmJpdHMuZmJyMF9zaXplID0gMTsKKwllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDUxMikKKwkJY3NyLmJpdHMuZmJyMF9zaXplID0gMjsKKwllbHNlIGlmIChldGRldi0+UnhSaW5nLkZicjBCdWZmZXJTaXplID09IDEwMjQpCisJCWNzci5iaXRzLmZicjBfc2l6ZSA9IDM7CiAjZW5kaWYKLQkJd3JpdGVsKGNzci52YWx1ZSwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IudmFsdWUpOworCXdyaXRlbChjc3IudmFsdWUsICZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKIAorCWNzci52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKKwlpZiAoY3NyLmJpdHMuaGFsdF9zdGF0dXMgIT0gMCkgeworCQl1ZGVsYXkoNSk7CiAJCWNzci52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKIAkJaWYgKGNzci5iaXRzLmhhbHRfc3RhdHVzICE9IDApIHsKLQkJCXVkZWxheSg1KTsKLQkJCWNzci52YWx1ZSA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyLnZhbHVlKTsKLQkJCWlmIChjc3IuYml0cy5oYWx0X3N0YXR1cyAhPSAwKSB7Ci0JCQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkJIlJYIERtYSBmYWlsZWQgdG8gZXhpdCBoYWx0IHN0YXRlLiAgQ1NSIDB4JTA4eFxuIiwKLQkJCQkJY3NyLnZhbHVlKTsKLQkJCX0KKwkJCWRldl9lcnIoJmV0ZGV2LT5wZGV2LT5kZXYsCisJCQkgICAgIlJYIERtYSBmYWlsZWQgdG8gZXhpdCBoYWx0IHN0YXRlLiAgQ1NSIDB4JTA4eFxuIiwKKwkJCQljc3IudmFsdWUpOwogCQl9CiAJfQogfQpAQCAtODQ5LDcgKzc3OSw3IEBACiAgKiBuaWNfcnhfcGt0cyAtIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKICAqCi0gKiBSZXR1cm5zIHBNcFJmZCwgYSBwb2ludGVyIHRvIG91ciBNUFJGRC4KKyAqIFJldHVybnMgcmZkLCBhIHBvaW50ZXIgdG8gb3VyIE1QUkZELgogICoKICAqIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzLCB1c2luZyBjb21wbGV0aW9uIHJpbmcKICAqIElmIHBhY2tldHMgYXJlIGF2YWlsYWJsZSwgaXQgZ2V0cyBhbiBSRkQgZnJvbSB0aGUgUmVjdkxpc3QsIGF0dGFjaGVzCkBAIC04NTgsMTE5ICs3ODgsMTIyIEBACiAgKi8KIFBNUF9SRkQgbmljX3J4X3BrdHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlzdHJ1Y3QgX3J4X3JpbmdfdCAqcFJ4TG9jYWwgPSAmZXRkZXYtPlJ4UmluZzsKLQlQUlhfU1RBVFVTX0JMT0NLX3QgcFJ4U3RhdHVzQmxvY2s7Ci0JUFBLVF9TVEFUX0RFU0NfdCBwUFNSRW50cnk7Ci0JUE1QX1JGRCBwTXBSZmQ7Ci0JdWludDMyX3QgbkluZGV4OwotCXVpbnQ4X3QgKnBCdWZWYTsKKwlzdHJ1Y3QgX3J4X3JpbmdfdCAqcnhfbG9jYWwgPSAmZXRkZXYtPlJ4UmluZzsKKwlQUlhfU1RBVFVTX0JMT0NLX3Qgc3RhdHVzOworCVBQS1RfU1RBVF9ERVNDX3QgcHNyOworCVBNUF9SRkQgcmZkOworCXUzMiBpOworCXVpbnQ4X3QgKmJ1ZjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0JdWludDhfdCByaW5nSW5kZXg7Ci0JdWludDE2X3QgYnVmZmVySW5kZXg7Ci0JdWludDMyX3QgbG9jYWxMZW47CisJdWludDhfdCByaW5kZXg7CisJdWludDE2X3QgYmluZGV4OworCXUzMiBsZW47CiAJUEtUX1NUQVRfREVTQ19XT1JEMF90IFdvcmQwOwogCiAJLyogUlggU3RhdHVzIGJsb2NrIGlzIHdyaXR0ZW4gYnkgdGhlIERNQSBlbmdpbmUgcHJpb3IgdG8gZXZlcnkKIAkgKiBpbnRlcnJ1cHQuIEl0IGNvbnRhaW5zIHRoZSBuZXh0IHRvIGJlIHVzZWQgZW50cnkgaW4gdGhlIFBhY2tldAogCSAqIFN0YXR1cyBSaW5nLCBhbmQgYWxzbyB0aGUgdHdvIEZyZWUgQnVmZmVyIHJpbmdzLgogCSAqLwotCXBSeFN0YXR1c0Jsb2NrID0gKFBSWF9TVEFUVVNfQkxPQ0tfdCkgcFJ4TG9jYWwtPnBSeFN0YXR1c1ZhOworCXN0YXR1cyA9IChQUlhfU1RBVFVTX0JMT0NLX3QpIHJ4X2xvY2FsLT5wUnhTdGF0dXNWYTsKIAotCWlmIChwUnhTdGF0dXNCbG9jay0+V29yZDEuYml0cy5QU1JvZmZzZXQgPT0KLQkJCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsICYmCi0JCQlwUnhTdGF0dXNCbG9jay0+V29yZDEuYml0cy5QU1J3cmFwID09Ci0JCQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbF93cmFwKSB7CisJLyogRklYTUU6IHRpZHkgbGF0ZXIgd2hlbiBjb252ZXJzaW9ucyBjb21wbGV0ZSAqLworCWlmIChzdGF0dXMtPldvcmQxLmJpdHMuUFNSb2Zmc2V0ID09CisJCQkocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHhGRkYpICYmCisJCQlzdGF0dXMtPldvcmQxLmJpdHMuUFNSd3JhcCA9PQorCQkJKChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgPj4gMTIpICYgMSkpIHsKIAkJLyogTG9va3MgbGlrZSB0aGlzIHJpbmcgaXMgbm90IHVwZGF0ZWQgeWV0ICovCiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIFRoZSBwYWNrZXQgc3RhdHVzIHJpbmcgaW5kaWNhdGVzIHRoYXQgZGF0YSBpcyBhdmFpbGFibGUuICovCi0JcFBTUkVudHJ5ID0gKFBQS1RfU1RBVF9ERVNDX3QpIChwUnhMb2NhbC0+cFBTUmluZ1ZhKSArCi0JCQlwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwuYml0cy5wc3JfZnVsbDsKKwlwc3IgPSAoUFBLVF9TVEFUX0RFU0NfdCkgKHJ4X2xvY2FsLT5wUFNSaW5nVmEpICsKKwkJCShyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJiAweEZGRik7CiAKIAkvKiBHcmFiIGFueSBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIG9uY2UgdGhlIFBTUiBpcwogCSAqIGFkdmFuY2VkLCBzaW5jZSB3ZSBjYW4gbm8gbG9uZ2VyIHJlbHkgb24gdGhlIG1lbW9yeSBiZWluZwogCSAqIGFjY3VyYXRlCiAJICovCi0JbG9jYWxMZW4gPSBwUFNSRW50cnktPndvcmQxLmJpdHMubGVuZ3RoOwotCXJpbmdJbmRleCA9ICh1aW50OF90KSBwUFNSRW50cnktPndvcmQxLmJpdHMucmk7Ci0JYnVmZmVySW5kZXggPSAodWludDE2X3QpIHBQU1JFbnRyeS0+d29yZDEuYml0cy5iaTsKLQlXb3JkMCA9IHBQU1JFbnRyeS0+d29yZDA7CisJbGVuID0gcHNyLT53b3JkMS5iaXRzLmxlbmd0aDsKKwlyaW5kZXggPSAodWludDhfdCkgcHNyLT53b3JkMS5iaXRzLnJpOworCWJpbmRleCA9ICh1aW50MTZfdCkgcHNyLT53b3JkMS5iaXRzLmJpOworCVdvcmQwID0gcHNyLT53b3JkMDsKIAogCS8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSB1c2VkIHRoaXMgUFNSIGVudHJ5LiAqLwotCWlmICgrK3BSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsID4KLQkgICAgcFJ4TG9jYWwtPlBzck51bUVudHJpZXMgLSAxKSB7Ci0JCXBSeExvY2FsLT5sb2NhbF9wc3JfZnVsbC5iaXRzLnBzcl9mdWxsID0gMDsKLQkJcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGxfd3JhcCBePSAxOworCS8qIEZJWE1FIHdyYXAgMTIgKi8KKwlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgPSAocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICsgMSkgJiAweEZGRjsKKwlpZiAocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICA+IHJ4X2xvY2FsLT5Qc3JOdW1FbnRyaWVzIC0gMSkgeworCQkvKiBDbGVhciBwc3IgZnVsbCBhbmQgdG9nZ2xlIHRoZSB3cmFwIGJpdCAqLworCQlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJj0gIDB4RkZGOworCQlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgXj0gMHgxMDAwOwogCX0KIAotCXdyaXRlbChwUnhMb2NhbC0+bG9jYWxfcHNyX2Z1bGwudmFsdWUsCi0JICAgICAgICZldGRldi0+cmVncy0+cnhkbWEucHNyX2Z1bGxfb2Zmc2V0LnZhbHVlKTsKKwl3cml0ZWwocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsLAorCSAgICAgICAmZXRkZXYtPnJlZ3MtPnJ4ZG1hLnBzcl9mdWxsX29mZnNldCk7CiAKICNpZm5kZWYgVVNFX0ZCUjAKLQlpZiAocmluZ0luZGV4ICE9IDEpIHsKKwlpZiAocmluZGV4ICE9IDEpIHsKIAkJcmV0dXJuIE5VTEw7CiAJfQogI2VuZGlmCiAKICNpZmRlZiBVU0VfRkJSMAotCWlmIChyaW5nSW5kZXggPiAxIHx8Ci0JCShyaW5nSW5kZXggPT0gMCAmJgotCQlidWZmZXJJbmRleCA+IHBSeExvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpIHx8Ci0JCShyaW5nSW5kZXggPT0gMSAmJgotCQlidWZmZXJJbmRleCA+IHBSeExvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpKQorCWlmIChyaW5kZXggPiAxIHx8CisJCShyaW5kZXggPT0gMCAmJgorCQliaW5kZXggPiByeF9sb2NhbC0+RmJyME51bUVudHJpZXMgLSAxKSB8fAorCQkocmluZGV4ID09IDEgJiYKKwkJYmluZGV4ID4gcnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSkpCiAjZWxzZQotCWlmIChyaW5nSW5kZXggIT0gMSB8fAotCQlidWZmZXJJbmRleCA+IHBSeExvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpCisJaWYgKHJpbmRleCAhPSAxIHx8CisJCWJpbmRleCA+IHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpCiAjZW5kaWYKIAl7CiAJCS8qIElsbGVnYWwgYnVmZmVyIG9yIHJpbmcgaW5kZXggY2Fubm90IGJlIHVzZWQgYnkgUy9XKi8KIAkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKIAkJCSAgIk5JQ1J4UGt0cyBQU1IgRW50cnkgJWQgaW5kaWNhdGVzICIKIAkJCSAgImxlbmd0aCBvZiAlZCBhbmQvb3IgYmFkIGJpKCVkKVxuIiwKLQkJCSAgcFJ4TG9jYWwtPmxvY2FsX3Bzcl9mdWxsLmJpdHMucHNyX2Z1bGwsCi0JCQkgIGxvY2FsTGVuLCBidWZmZXJJbmRleCk7CisJCQkgIHJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmIDB4RkZGLAorCQkJICBsZW4sIGJpbmRleCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIEdldCBhbmQgZmlsbCB0aGUgUkZELiAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCi0JcE1wUmZkID0gTlVMTDsKLQllbGVtZW50ID0gcFJ4TG9jYWwtPlJlY3ZMaXN0Lm5leHQ7Ci0JcE1wUmZkID0gKFBNUF9SRkQpIGxpc3RfZW50cnkoZWxlbWVudCwgTVBfUkZELCBsaXN0X25vZGUpOworCXJmZCA9IE5VTEw7CisJZWxlbWVudCA9IHJ4X2xvY2FsLT5SZWN2TGlzdC5uZXh0OworCXJmZCA9IChQTVBfUkZEKSBsaXN0X2VudHJ5KGVsZW1lbnQsIE1QX1JGRCwgbGlzdF9ub2RlKTsKIAotCWlmIChwTXBSZmQgPT0gTlVMTCkgeworCWlmIChyZmQgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlsaXN0X2RlbCgmcE1wUmZkLT5saXN0X25vZGUpOwotCXBSeExvY2FsLT5uUmVhZHlSZWN2LS07CisJbGlzdF9kZWwoJnJmZC0+bGlzdF9ub2RlKTsKKwlyeF9sb2NhbC0+blJlYWR5UmVjdi0tOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlJjdkxvY2ssIGZsYWdzKTsKIAotCXBNcFJmZC0+YnVmZmVyaW5kZXggPSBidWZmZXJJbmRleDsKLQlwTXBSZmQtPnJpbmdpbmRleCA9IHJpbmdJbmRleDsKKwlyZmQtPmJ1ZmZlcmluZGV4ID0gYmluZGV4OworCXJmZC0+cmluZ2luZGV4ID0gcmluZGV4OwogCiAJLyogSW4gVjEgc2lsaWNvbiwgdGhlcmUgaXMgYSBidWcgd2hpY2ggc2NyZXdzIHVwIGZpbHRlcmluZyBvZgogCSAqIHJ1bnQgcGFja2V0cy4gIFRoZXJlZm9yZSBydW50IHBhY2tldCBmaWx0ZXJpbmcgaXMgZGlzYWJsZWQKIAkgKiBpbiB0aGUgTUFDIGFuZCB0aGUgcGFja2V0cyBhcmUgZHJvcHBlZCBoZXJlLiAgVGhleSBhcmUKIAkgKiBhbHNvIGNvdW50ZWQgaGVyZS4KIAkgKi8KLQlpZiAobG9jYWxMZW4gPCAoTklDX01JTl9QQUNLRVRfU0laRSArIDQpKSB7CisJaWYgKGxlbiA8IChOSUNfTUlOX1BBQ0tFVF9TSVpFICsgNCkpIHsKIAkJZXRkZXYtPlN0YXRzLm90aGVyX2Vycm9ycysrOwotCQlsb2NhbExlbiA9IDA7CisJCWxlbiA9IDA7CiAJfQogCi0JaWYgKGxvY2FsTGVuKSB7CisJaWYgKGxlbikgewogCQlpZiAoZXRkZXYtPlJlcGxpY2FQaHlMb29wYmsgPT0gMSkgewotCQkJcEJ1ZlZhID0gcFJ4TG9jYWwtPkZicltyaW5nSW5kZXhdLT5WYVtidWZmZXJJbmRleF07CisJCQlidWYgPSByeF9sb2NhbC0+RmJyW3JpbmRleF0tPlZhW2JpbmRleF07CiAKLQkJCWlmIChtZW1jbXAoJnBCdWZWYVs2XSwgJmV0ZGV2LT5DdXJyZW50QWRkcmVzc1swXSwKKwkJCWlmIChtZW1jbXAoJmJ1Zls2XSwgJmV0ZGV2LT5DdXJyZW50QWRkcmVzc1swXSwKIAkJCQkgICBFVEhfQUxFTikgPT0gMCkgewotCQkJCWlmIChtZW1jbXAoJnBCdWZWYVs0Ml0sICJSZXBsaWNhIHBhY2tldCIsCisJCQkJaWYgKG1lbWNtcCgmYnVmWzQyXSwgIlJlcGxpY2EgcGFja2V0IiwKIAkJCQkJICAgRVRIX0hMRU4pKSB7CiAJCQkJCWV0ZGV2LT5SZXBsaWNhUGh5TG9vcGJrUEYgPSAxOwogCQkJCX0KQEAgLTk5MCwyOCArOTIzLDI4IEBACiAJCQlpZiAoKGV0ZGV2LT5QYWNrZXRGaWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfTVVMVElDQVNUKQogCQkJICAgICYmICEoZXRkZXYtPlBhY2tldEZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUykKIAkJCSAgICAmJiAhKGV0ZGV2LT5QYWNrZXRGaWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkpIHsKLQkJCQlwQnVmVmEgPSBwUnhMb2NhbC0+RmJyW3JpbmdJbmRleF0tPgotCQkJCQkJVmFbYnVmZmVySW5kZXhdOworCQkJCWJ1ZiA9IHJ4X2xvY2FsLT5GYnJbcmluZGV4XS0+CisJCQkJCQlWYVtiaW5kZXhdOwogCiAJCQkJLyogTG9vcCB0aHJvdWdoIG91ciBsaXN0IHRvIHNlZSBpZiB0aGUKIAkJCQkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoaXMgcGFja2V0CiAJCQkJICogbWF0Y2hlcyBvbmUgaW4gb3VyIGxpc3QuCiAJCQkJICovCi0JCQkJZm9yIChuSW5kZXggPSAwOwotCQkJCSAgICAgbkluZGV4IDwgZXRkZXYtPk1DQWRkcmVzc0NvdW50OwotCQkJCSAgICAgbkluZGV4KyspIHsKLQkJCQkJaWYgKHBCdWZWYVswXSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtuSW5kZXhdWzBdCi0JCQkJCSAgICAmJiBwQnVmVmFbMV0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XVsxXQotCQkJCQkgICAgJiYgcEJ1ZlZhWzJdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W25JbmRleF1bMl0KLQkJCQkJICAgICYmIHBCdWZWYVszXSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtuSW5kZXhdWzNdCi0JCQkJCSAgICAmJiBwQnVmVmFbNF0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XVs0XQotCQkJCQkgICAgJiYgcEJ1ZlZhWzVdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W25JbmRleF1bNV0pIHsKKwkJCQlmb3IgKGkgPSAwOworCQkJCSAgICAgaSA8IGV0ZGV2LT5NQ0FkZHJlc3NDb3VudDsKKwkJCQkgICAgIGkrKykgeworCQkJCQlpZiAoYnVmWzBdID09CisJCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzBdCisJCQkJCSAgICAmJiBidWZbMV0gPT0KKwkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bMV0KKwkJCQkJICAgICYmIGJ1ZlsyXSA9PQorCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVsyXQorCQkJCQkgICAgJiYgYnVmWzNdID09CisJCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzNdCisJCQkJCSAgICAmJiBidWZbNF0gPT0KKwkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bNF0KKwkJCQkJICAgICYmIGJ1Zls1XSA9PQorCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVs1XSkgewogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQl9CkBAIC0xMDI0LDExICs5NTcsMTEgQEAKIAkJCQkgKiBzbyB3ZSBmcmVlIG91ciBSRkQgd2hlbiB3ZSByZXR1cm4KIAkJCQkgKiBmcm9tIHRoaXMgZnVuY3Rpb24uCiAJCQkJICovCi0JCQkJaWYgKG5JbmRleCA9PSBldGRldi0+TUNBZGRyZXNzQ291bnQpCi0JCQkJCWxvY2FsTGVuID0gMDsKKwkJCQlpZiAoaSA9PSBldGRldi0+TUNBZGRyZXNzQ291bnQpCisJCQkJCWxlbiA9IDA7CiAJCQl9CiAKLQkJCWlmIChsb2NhbExlbiA+IDApCisJCQlpZiAobGVuID4gMCkKIAkJCQlldGRldi0+U3RhdHMubXVsdGlyY3YrKzsKIAkJfSBlbHNlIGlmIChXb3JkMC52YWx1ZSAmIEFMQ0FURUxfQlJPQURDQVNUX1BLVCkKIAkJCWV0ZGV2LT5TdGF0cy5icmRjc3RyY3YrKzsKQEAgLTEwNDEsMjQgKzk3NCwyNCBAQAogCQkJZXRkZXYtPlN0YXRzLnVuaXJjdisrOwogCX0KIAotCWlmIChsb2NhbExlbiA+IDApIHsKKwlpZiAobGVuID4gMCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAotCQkvKiBwTXBSZmQtPlBhY2tldFNpemUgPSBsb2NhbExlbiAtIDQ7ICovCi0JCXBNcFJmZC0+UGFja2V0U2l6ZSA9IGxvY2FsTGVuOworCQkvKiByZmQtPlBhY2tldFNpemUgPSBsZW4gLSA0OyAqLworCQlyZmQtPlBhY2tldFNpemUgPSBsZW47CiAKLQkJc2tiID0gZGV2X2FsbG9jX3NrYihwTXBSZmQtPlBhY2tldFNpemUgKyAyKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihyZmQtPlBhY2tldFNpemUgKyAyKTsKIAkJaWYgKCFza2IpIHsKIAkJCWRldl9lcnIoJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAiQ291bGRuJ3QgYWxsb2MgYW4gU0tCIGZvciBSeFxuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCi0JCWV0ZGV2LT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gcE1wUmZkLT5QYWNrZXRTaXplOworCQlldGRldi0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IHJmZC0+UGFja2V0U2l6ZTsKIAotCQltZW1jcHkoc2tiX3B1dChza2IsIHBNcFJmZC0+UGFja2V0U2l6ZSksCi0JCSAgICAgICBwUnhMb2NhbC0+RmJyW3JpbmdJbmRleF0tPlZhW2J1ZmZlckluZGV4XSwKLQkJICAgICAgIHBNcFJmZC0+UGFja2V0U2l6ZSk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcmZkLT5QYWNrZXRTaXplKSwKKwkJICAgICAgIHJ4X2xvY2FsLT5GYnJbcmluZGV4XS0+VmFbYmluZGV4XSwKKwkJICAgICAgIHJmZC0+UGFja2V0U2l6ZSk7CiAKIAkJc2tiLT5kZXYgPSBldGRldi0+bmV0ZGV2OwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBldGRldi0+bmV0ZGV2KTsKQEAgLTEwNjYsMTEgKzk5OSwxMSBAQAogCiAJCW5ldGlmX3J4KHNrYik7CiAJfSBlbHNlIHsKLQkJcE1wUmZkLT5QYWNrZXRTaXplID0gMDsKKwkJcmZkLT5QYWNrZXRTaXplID0gMDsKIAl9CiAKLQluaWNfcmV0dXJuX3JmZChldGRldiwgcE1wUmZkKTsKLQlyZXR1cm4gcE1wUmZkOworCW5pY19yZXR1cm5fcmZkKGV0ZGV2LCByZmQpOworCXJldHVybiByZmQ7CiB9CiAKIC8qKgpAQCAtMTA4MSwyMSArMTAxNCw4IEBACiAgKi8KIHZvaWQgZXQxMzF4X3Jlc2V0X3JlY3Yoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlQTVBfUkZEIHBNcFJmZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCiAJV0FSTl9PTihsaXN0X2VtcHR5KCZldGRldi0+UnhSaW5nLlJlY3ZMaXN0KSk7CiAKLQkvKiBUYWtlIGFsbCB0aGUgUkZEJ3MgZnJvbSB0aGUgcGVuZGluZyBsaXN0LCBhbmQgc3RpY2sgdGhlbSBvbiB0aGUKLQkgKiBSZWN2TGlzdC4KLQkgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmV0ZGV2LT5SeFJpbmcuUmVjdlBlbmRpbmdMaXN0KSkgewotCQllbGVtZW50ID0gZXRkZXYtPlJ4UmluZy5SZWN2UGVuZGluZ0xpc3QubmV4dDsKLQotCQlwTXBSZmQgPSAoUE1QX1JGRCkgbGlzdF9lbnRyeShlbGVtZW50LCBNUF9SRkQsIGxpc3Rfbm9kZSk7Ci0KLQkJbGlzdF9tb3ZlX3RhaWwoJnBNcFJmZC0+bGlzdF9ub2RlLCAmZXRkZXYtPlJ4UmluZy5SZWN2TGlzdCk7Ci0JfQogfQogCiAvKioKQEAgLTExMDYsMjcgKzEwMjYsMjEgQEAKICAqLwogdm9pZCBldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JUE1QX1JGRCBwTXBSZmQgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpQYWNrZXRBcnJheVtOVU1fUEFDS0VUU19IQU5ETEVEXTsKLQlQTVBfUkZEIFJGREZyZWVBcnJheVtOVU1fUEFDS0VUU19IQU5ETEVEXTsKLQl1aW50MzJfdCBQYWNrZXRBcnJheUNvdW50ID0gMDsKLQl1aW50MzJfdCBQYWNrZXRzVG9IYW5kbGU7Ci0JdWludDMyX3QgUGFja2V0RnJlZUNvdW50ID0gMDsKLQlib29sIFRlbXBVbmZpbmlzaGVkUmVjID0gZmFsc2U7Ci0KLQlQYWNrZXRzVG9IYW5kbGUgPSBOVU1fUEFDS0VUU19IQU5ETEVEOworCVBNUF9SRkQgcmZkID0gTlVMTDsKKwl1MzIgY291bnQgPSAwOworCWJvb2wgZG9uZSA9IHRydWU7CiAKIAkvKiBQcm9jZXNzIHVwIHRvIGF2YWlsYWJsZSBSRkQncyAqLwotCXdoaWxlIChQYWNrZXRBcnJheUNvdW50IDwgUGFja2V0c1RvSGFuZGxlKSB7CisJd2hpbGUgKGNvdW50IDwgTlVNX1BBQ0tFVFNfSEFORExFRCkgewogCQlpZiAobGlzdF9lbXB0eSgmZXRkZXYtPlJ4UmluZy5SZWN2TGlzdCkpIHsKIAkJCVdBUk5fT04oZXRkZXYtPlJ4UmluZy5uUmVhZHlSZWN2ICE9IDApOwotCQkJVGVtcFVuZmluaXNoZWRSZWMgPSB0cnVlOworCQkJZG9uZSA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KIAotCQlwTXBSZmQgPSBuaWNfcnhfcGt0cyhldGRldik7CisJCXJmZCA9IG5pY19yeF9wa3RzKGV0ZGV2KTsKIAotCQlpZiAocE1wUmZkID09IE5VTEwpCisJCWlmIChyZmQgPT0gTlVMTCkKIAkJCWJyZWFrOwogCiAJCS8qIERvIG5vdCByZWNlaXZlIGFueSBwYWNrZXRzIHVudGlsIGEgZmlsdGVyIGhhcyBiZWVuIHNldC4KQEAgLTExMzYsNyArMTA1MCw3IEBACiAJCSAqLwogCQlpZiAoIWV0ZGV2LT5QYWNrZXRGaWx0ZXIgfHwKIAkJICAgICEoZXRkZXYtPkZsYWdzICYgZk1QX0FEQVBURVJfTElOS19ERVRFQ1RJT04pIHx8Ci0JCSAgICBwTXBSZmQtPlBhY2tldFNpemUgPT0gMCkgeworCQkgICAgcmZkLT5QYWNrZXRTaXplID09IDApIHsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTExNDQsMzUgKzEwNTgsMjAgQEAKIAkJZXRkZXYtPlN0YXRzLmlwYWNrZXRzKys7CiAKIAkJLyogU2V0IHRoZSBzdGF0dXMgb24gdGhlIHBhY2tldCwgZWl0aGVyIHJlc291cmNlcyBvciBzdWNjZXNzICovCi0JCWlmIChldGRldi0+UnhSaW5nLm5SZWFkeVJlY3YgPj0gUkZEX0xPV19XQVRFUl9NQVJLKSB7Ci0JCQkvKiBQdXQgdGhpcyBSRkQgb24gdGhlIHBlbmRpbmcgbGlzdAotCQkJICoKLQkJCSAqIE5PVEU6IG5pY19yeF9wa3RzKCkgYWJvdmUgaXMgYWxyZWFkeSByZXR1cm5pbmcgdGhlCi0JCQkgKiBSRkQgdG8gdGhlIFJlY3ZMaXN0LCBzbyBkb24ndCBhZGRpdGlvbmFsbHkgZG8gdGhhdAotCQkJICogaGVyZS4KLQkJCSAqIEJlc2lkZXMsIHdlIGRvbid0IHJlYWxseSBuZWVkIChhdCB0aGlzIHBvaW50KSB0aGUKLQkJCSAqIHBlbmRpbmcgbGlzdCBhbnl3YXkuCi0JCQkgKi8KLQkJfSBlbHNlIHsKLQkJCVJGREZyZWVBcnJheVtQYWNrZXRGcmVlQ291bnRdID0gcE1wUmZkOwotCQkJUGFja2V0RnJlZUNvdW50Kys7Ci0KKwkJaWYgKGV0ZGV2LT5SeFJpbmcublJlYWR5UmVjdiA8IFJGRF9MT1dfV0FURVJfTUFSSykgewogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgICJSRkQncyBhcmUgcnVubmluZyBvdXRcbiIpOwogCQl9Ci0KLQkJUGFja2V0QXJyYXlbUGFja2V0QXJyYXlDb3VudF0gPSBwTXBSZmQtPlBhY2tldDsKLQkJUGFja2V0QXJyYXlDb3VudCsrOworCQljb3VudCsrOwogCX0KIAotCWlmICgoUGFja2V0QXJyYXlDb3VudCA9PSBOVU1fUEFDS0VUU19IQU5ETEVEKSB8fCBUZW1wVW5maW5pc2hlZFJlYykgeworCWlmIChjb3VudCA9PSBOVU1fUEFDS0VUU19IQU5ETEVEIHx8ICFkb25lKSB7CiAJCWV0ZGV2LT5SeFJpbmcuVW5maW5pc2hlZFJlY2VpdmVzID0gdHJ1ZTsKIAkJd3JpdGVsKFBBUk1fVFhfVElNRV9JTlRfREVGICogTkFOT19JTl9BX01JQ1JPLAogCQkgICAgICAgJmV0ZGV2LT5yZWdzLT5nbG9iYWwud2F0Y2hkb2dfdGltZXIpOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCS8qIFdhdGNoZG9nIHRpbWVyIHdpbGwgZGlzYWJsZSBpdHNlbGYgaWYgYXBwcm9wcmlhdGUuICovCiAJCWV0ZGV2LT5SeFJpbmcuVW5maW5pc2hlZFJlY2VpdmVzID0gZmFsc2U7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBidW1wX2Zicih1MzIgKmZiciwgdTMyIGxpbWl0KQpAQCAtMTE5NiwxNCArMTA5NSwxNCBAQAogLyoqCiAgKiBOSUNSZXR1cm5SRkQgLSBSZWN5Y2xlIGEgUkZEIGFuZCBwdXQgaXQgYmFjayBvbnRvIHRoZSByZWNlaXZlIGxpc3QKICAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICogQHBNcFJmZDogcG9pbnRlciB0byB0aGUgUkZECisgKiBAcmZkOiBwb2ludGVyIHRvIHRoZSBSRkQKICAqLwotdm9pZCBuaWNfcmV0dXJuX3JmZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBQTVBfUkZEIHBNcFJmZCkKK3ZvaWQgbmljX3JldHVybl9yZmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgUE1QX1JGRCByZmQpCiB7CiAJc3RydWN0IF9yeF9yaW5nX3QgKnJ4X2xvY2FsID0gJmV0ZGV2LT5SeFJpbmc7CiAJc3RydWN0IF9SWERNQV90IF9faW9tZW0gKnJ4X2RtYSA9ICZldGRldi0+cmVncy0+cnhkbWE7Ci0JdWludDE2X3QgYmkgPSBwTXBSZmQtPmJ1ZmZlcmluZGV4OwotCXVpbnQ4X3QgcmkgPSBwTXBSZmQtPnJpbmdpbmRleDsKKwl1aW50MTZfdCBiaSA9IHJmZC0+YnVmZmVyaW5kZXg7CisJdWludDhfdCByaSA9IHJmZC0+cmluZ2luZGV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBXZSBkb24ndCB1c2UgYW55IG9mIHRoZSBPT0IgZGF0YSBiZXNpZGVzIHN0YXR1cy4gT3RoZXJ3aXNlLCB3ZQpAQCAtMTIxNyw3ICsxMTE2LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5GYnJMb2NrLCBmbGFncyk7CiAKIAkJaWYgKHJpID09IDEpIHsKLQkJCVBGQlJfREVTQ190IHBOZXh0RGVzYyA9CisJCQlQRkJSX0RFU0NfdCBuZXh0ID0KIAkJCSAgICAoUEZCUl9ERVNDX3QpIChyeF9sb2NhbC0+cEZicjFSaW5nVmEpICsKIAkJCSAgICBJTkRFWDEwKHJ4X2xvY2FsLT5sb2NhbF9GYnIxX2Z1bGwpOwogCkBAIC0xMjI1LDkgKzExMjQsOSBAQAogCQkJICogdGhlIFBBIC8gQnVmZmVyIEluZGV4IGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIGludG8KIAkJCSAqIHRoZSBvbGRlc3QgKG5leHQgdG8gYmUgZnJlZWQpRkJSIGVudHJ5CiAJCQkgKi8KLQkJCXBOZXh0RGVzYy0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5GYnJbMV0tPlBBSGlnaFtiaV07Ci0JCQlwTmV4dERlc2MtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzFdLT5QQUxvd1tiaV07Ci0JCQlwTmV4dERlc2MtPndvcmQyLnZhbHVlID0gYmk7CisJCQluZXh0LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclsxXS0+UEFIaWdoW2JpXTsKKwkJCW5leHQtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzFdLT5QQUxvd1tiaV07CisJCQluZXh0LT53b3JkMi52YWx1ZSA9IGJpOwogCiAJCQl3cml0ZWwoYnVtcF9mYnIoJnJ4X2xvY2FsLT5sb2NhbF9GYnIxX2Z1bGwsCiAJCQkJcnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSksCkBAIC0xMjM1LDcgKzExMzQsNyBAQAogCQl9CiAjaWZkZWYgVVNFX0ZCUjAKIAkJZWxzZSB7Ci0JCQlQRkJSX0RFU0NfdCBwTmV4dERlc2MgPQorCQkJUEZCUl9ERVNDX3QgbmV4dCA9CiAJCQkgICAgKFBGQlJfREVTQ190KSByeF9sb2NhbC0+cEZicjBSaW5nVmEgKwogCQkJICAgIElOREVYMTAocnhfbG9jYWwtPmxvY2FsX0ZicjBfZnVsbCk7CiAKQEAgLTEyNDMsOSArMTE0Miw5IEBACiAJCQkgKiB0aGUgUEEgLyBCdWZmZXIgSW5kZXggZm9yIHRoZSByZXR1cm5lZCBidWZmZXIgaW50bwogCQkJICogdGhlIG9sZGVzdCAobmV4dCB0byBiZSBmcmVlZCkgRkJSIGVudHJ5CiAJCQkgKi8KLQkJCXBOZXh0RGVzYy0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5GYnJbMF0tPlBBSGlnaFtiaV07Ci0JCQlwTmV4dERlc2MtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzBdLT5QQUxvd1tiaV07Ci0JCQlwTmV4dERlc2MtPndvcmQyLnZhbHVlID0gYmk7CisJCQluZXh0LT5hZGRyX2hpID0gcnhfbG9jYWwtPkZiclswXS0+UEFIaWdoW2JpXTsKKwkJCW5leHQtPmFkZHJfbG8gPSByeF9sb2NhbC0+RmJyWzBdLT5QQUxvd1tiaV07CisJCQluZXh0LT53b3JkMi52YWx1ZSA9IGJpOwogCiAJCQl3cml0ZWwoYnVtcF9mYnIoJnJ4X2xvY2FsLT5sb2NhbF9GYnIwX2Z1bGwsCiAJCQkJCXJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpLApAQCAtMTI2Miw3ICsxMTYxLDcgQEAKIAkgKiBvdXIgbGlzdAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnBNcFJmZC0+bGlzdF9ub2RlLCAmcnhfbG9jYWwtPlJlY3ZMaXN0KTsKKwlsaXN0X2FkZF90YWlsKCZyZmQtPmxpc3Rfbm9kZSwgJnJ4X2xvY2FsLT5SZWN2TGlzdCk7CiAJcnhfbG9jYWwtPm5SZWFkeVJlY3YrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+UmN2TG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguaAppbmRleCA3MmE1MjI5Li42OTUxNDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3J4LmgKQEAgLTIwOSwzNiArMjA5LDI2IEBACiAvKiBUeXBlZGVmcyBmb3IgdGhlIFJYIERNQSBzdGF0dXMgd29yZCAqLwogCiAvKgotICogUlhTVEFUX1dPUkQwX3Qgc3RydWN0dXJlIGhvbGRzIHBhcnQgb2YgdGhlIHN0YXR1cyBiaXRzIG9mIHRoZSBSeCBETUEgZW5naW5lCisgKiByeCBzdGF0dXMgd29yZCAwIGhvbGRzIHBhcnQgb2YgdGhlIHN0YXR1cyBiaXRzIG9mIHRoZSBSeCBETUEgZW5naW5lCiAgKiB0aGF0IGdldCBjb3BpZWQgb3V0IHRvIG1lbW9yeSBieSB0aGUgRVQtMTMxMC4gIFdvcmQgMCBpcyBhIDMyIGJpdCB3b3JkCi0gKiB3aGljaGNvbnRhaW5zIEZyZWUgQnVmZmVyIHJpbmcgMCBhbmQgMSBhdmFpbGFibGUgb2Zmc2V0LgorICogd2hpY2ggY29udGFpbnMgdGhlIEZyZWUgQnVmZmVyIHJpbmcgMCBhbmQgMSBhdmFpbGFibGUgb2Zmc2V0LgorICoKKyAqIGJpdCAwLTkgRkJSMSBvZmZzZXQKKyAqIGJpdCAxMCBXcmFwIGZsYWcgZm9yIEZCUjEKKyAqIGJpdCAxNi0yNSBGQlIwIG9mZnNldAorICogYml0IDI2IFdyYXAgZmxhZyBmb3IgRkJSMAogICovCi10eXBlZGVmIHVuaW9uIF9yeHN0YXRfd29yZDBfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgRkJSMXVudXNlZDo1OwkvKiBiaXRzIDI3LTMxICovCi0JCXUzMiBGQlIxd3JhcDoxOwkvKiBiaXQgMjYgKi8KLQkJdTMyIEZCUjFvZmZzZXQ6MTA7CS8qIGJpdHMgMTYtMjUgKi8KLQkJdTMyIEZCUjB1bnVzZWQ6NTsJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgRkJSMHdyYXA6MTsJLyogYml0IDEwICovCi0JCXUzMiBGQlIwb2Zmc2V0OjEwOwkvKiBiaXRzIDAtOSAqLwotI2Vsc2UKLQkJdTMyIEZCUjBvZmZzZXQ6MTA7CS8qIGJpdHMgMC05ICovCi0JCXUzMiBGQlIwd3JhcDoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIEZCUjB1bnVzZWQ6NTsJLyogYml0cyAxMS0xNSAqLwotCQl1MzIgRkJSMW9mZnNldDoxMDsJLyogYml0cyAxNi0yNSAqLwotCQl1MzIgRkJSMXdyYXA6MTsJLyogYml0IDI2ICovCi0JCXUzMiBGQlIxdW51c2VkOjU7CS8qIGJpdHMgMjctMzEgKi8KLSNlbmRpZgotCX0gYml0czsKLX0gUlhTVEFUX1dPUkQwX3QsICpQUlhTVEFUX1dPUkQwX3Q7CiAKIC8qCiAgKiBSWFNUQVRfV09SRDFfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKICAqIHRoYXQgZ2V0IGNvcGllZCBvdXQgdG8gbWVtb3J5IGJ5IHRoZSBFVC0xMzEwLiAgV29yZCAzIGlzIGEgMzIgYml0IHdvcmQKICAqIHdoaWNoIGNvbnRhaW5zIHRoZSBQYWNrZXQgU3RhdHVzIFJpbmcgYXZhaWxhYmxlIG9mZnNldC4KICAqLworCisjZGVmaW5lIFJYU1RBVDFfT0ZGU0VUCTE2CisjZGVmaW5lIFJYU1RBVDFfTUFTSwkweEZGRgorI2RlZmluZSBSWFNUQVQxX1dSQVAJMHgxMDAwMDAwMAorCiB0eXBlZGVmIHVuaW9uIF9yeHN0YXRfd29yZDFfdCB7CiAJdTMyIHZhbHVlOwogCXN0cnVjdCB7CkBAIC0yNjEsNyArMjUxLDcgQEAKICAqIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvIGJ5IDB4MTAxYyAvIDB4MTAyMAogICovCiB0eXBlZGVmIHN0cnVjdCBfcnhfc3RhdHVzX2Jsb2NrX3QgewotCVJYU1RBVF9XT1JEMF90IFdvcmQwOworCXUzMiBXb3JkMDsKIAlSWFNUQVRfV09SRDFfdCBXb3JkMTsKIH0gUlhfU1RBVFVTX0JMT0NLX3QsICpQUlhfU1RBVFVTX0JMT0NLX3Q7CiAKQEAgLTI4MiwxNSArMjcyLDYgQEAKIH0gZVJYX0lOVEVSUlVQVF9TVEFURV90LCAqUGVSWF9JTlRFUlJVUFRfU1RBVEVfdDsKIAogLyoKLSAqIFN0cnVjdHVyZSB0byBob2xkIHRoZSBza2IncyBpbiBhIGxpc3QKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgcnhfc2tiX2xpc3RfZWxlbSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBza2JfbGlzdF9lbGVtOwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLX0gUlhfU0tCX0xJU1RfRUxFTSwgKlBSWF9TS0JfTElTVF9FTEVNOwotCi0vKgogICogUlhfUklOR190IGlzIHNydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgYWRhcHRvcidzIGxvY2FsIHJlZmVyZW5jZShzKSB0byB0aGUKICAqIHJpbmdzCiAgKi8KQEAgLTMxOSwyMSArMzAwLDE2IEBACiAKIAl2b2lkICpwUFNSaW5nVmE7CiAJZG1hX2FkZHJfdCBwUFNSaW5nUGE7Ci0JdWludDY0X3QgcFBTUmluZ1JlYWxQYTsKLQl1aW50NjRfdCBwUFNSaW5nT2Zmc2V0OwotCVJYRE1BX1BTUl9GVUxMX09GRlNFVF90IGxvY2FsX3Bzcl9mdWxsOworCXUzMiBsb2NhbF9wc3JfZnVsbDsKIAl1MzIgUHNyTnVtRW50cmllczsKIAogCXZvaWQgKnBSeFN0YXR1c1ZhOwogCWRtYV9hZGRyX3QgcFJ4U3RhdHVzUGE7Ci0JdWludDY0X3QgUnhTdGF0dXNSZWFsUEE7Ci0JdWludDY0X3QgUnhTdGF0dXNPZmZzZXQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZCdWZmZXJQb29sOwogCiAJLyogUkVDViAqLwogCXN0cnVjdCBsaXN0X2hlYWQgUmVjdkxpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBSZWN2UGVuZGluZ0xpc3Q7CiAJdTMyIG5SZWFkeVJlY3Y7CiAKIAl1MzIgTnVtUmZkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmMKaW5kZXggOTRmNzc1Mi4uOTc3ZThiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCkBAIC05NCwxMyArOTQsMTEgQEAKICNpbmNsdWRlICJldDEzMTBfdHguaCIKIAogCi1zdGF0aWMgdm9pZCBldDEzMXhfdXBkYXRlX3RjYl9saXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwotc3RhdGljIHZvaWQgZXQxMzF4X2NoZWNrX3NlbmRfd2FpdF9saXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpOwogc3RhdGljIGlubGluZSB2b2lkIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJCSAgIFBNUF9UQ0IgcE1wVGNiKTsKKwkJCQkJICAgc3RydWN0IHRjYiAqdGNiKTsKIHN0YXRpYyBpbnQgZXQxMzF4X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KTsKLXN0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIFBNUF9UQ0IgcE1wVGNiKTsKK3N0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHN0cnVjdCB0Y2IgKnRjYik7CiAKIC8qKgogICogZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MKQEAgLTExNywxMiArMTE1LDEyIEBACiBpbnQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCBkZXNjX3NpemUgPSAwOwotCVRYX1JJTkdfdCAqdHhfcmluZyA9ICZhZGFwdGVyLT5UeFJpbmc7CisJc3RydWN0IHR4X3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFRDQidzIChUcmFuc21pdCBDb250cm9sIEJsb2NrKSAqLwotCWFkYXB0ZXItPlR4UmluZy5NcFRjYk1lbSA9IChNUF9UQ0IgKilrY2FsbG9jKE5VTV9UQ0IsIHNpemVvZihNUF9UQ0IpLAotCQkJCQkJICAgICAgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOwotCWlmICghYWRhcHRlci0+VHhSaW5nLk1wVGNiTWVtKSB7CisJYWRhcHRlci0+dHhfcmluZy50Y2JfcmluZyA9IChzdHJ1Y3QgdGNiICopCisJCWtjYWxsb2MoTlVNX1RDQiwgc2l6ZW9mKHN0cnVjdCB0Y2IpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJaWYgKCFhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFRDQnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xMzAsMTIgKzEyOCwxMyBAQAogCS8qIEFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSBUeCBkZXNjcmlwdG9yIHJpbmcsIGFuZCBhbGxvY2F0ZQogCSAqIHNvbWUgZXh0cmEgc28gdGhhdCB0aGUgcmluZyBjYW4gYmUgYWxpZ25lZCBvbiBhIDRrIGJvdW5kYXJ5LgogCSAqLwotCWRlc2Nfc2l6ZSA9IChzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKSArIDQwOTYgLSAxOwotCXR4X3JpbmctPnBUeERlc2NSaW5nVmEgPQotCSAgICAoUFRYX0RFU0NfRU5UUllfdCkgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgZGVzY19zaXplLAotCQkJCQkJICAgICZ0eF9yaW5nLT5wVHhEZXNjUmluZ1BhKTsKLQlpZiAoIWFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFR4IFJpbmdcbiIpOworCWRlc2Nfc2l6ZSA9IChzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogTlVNX0RFU0NfUEVSX1JJTkdfVFgpICsgNDA5NiAtIDE7CisJdHhfcmluZy0+dHhfZGVzY19yaW5nID0KKwkgICAgKHN0cnVjdCB0eF9kZXNjICopIHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGRlc2Nfc2l6ZSwKKwkJCQkJCSAgICAmdHhfcmluZy0+dHhfZGVzY19yaW5nX3BhKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFR4IFJpbmdcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTE0NiwzNSArMTQ1LDE1IEBACiAJICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQogCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCiAJICovCi0JdHhfcmluZy0+cFR4RGVzY1JpbmdBZGp1c3RlZFBhID0gdHhfcmluZy0+cFR4RGVzY1JpbmdQYTsKLQotCS8qIEFsaWduIFR4IERlc2NyaXB0b3IgUmluZyBvbiBhIDRrICgweDEwMDApIGJ5dGUgYm91bmRhcnkgKi8KLQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAotCQkJCSAgICAgICZ0eF9yaW5nLT5wVHhEZXNjUmluZ0FkanVzdGVkUGEsCi0JCQkJICAgICAgJnR4X3JpbmctPlR4RGVzY09mZnNldCwgMHgwRkZGKTsKLQotCXR4X3JpbmctPnBUeERlc2NSaW5nVmEgKz0gdHhfcmluZy0+VHhEZXNjT2Zmc2V0OwotCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVHggc3RhdHVzIGJsb2NrICovCi0JdHhfcmluZy0+cFR4U3RhdHVzVmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgIHNpemVvZihUWF9TVEFUVVNfQkxPQ0tfdCksCi0JCQkJCQkgICAgJnR4X3JpbmctPnBUeFN0YXR1c1BhKTsKLQlpZiAoIWFkYXB0ZXItPlR4UmluZy5wVHhTdGF0dXNQYSkgeworCXR4X3JpbmctPnR4X3N0YXR1cyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCisJCQkJCQkgICAgc2l6ZW9mKHUzMiksCisJCQkJCQkgICAgJnR4X3JpbmctPnR4X3N0YXR1c19wYSk7CisJaWYgKCFhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1c19wYSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgVHggc3RhdHVzIGJsb2NrXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhIGR1bW15IGJ1ZmZlciAqLwotCXR4X3JpbmctPnBUeER1bW15QmxrVmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgICAgTklDX01JTl9QQUNLRVRfU0laRSwKLQkJCQkJCSAgICAgICZ0eF9yaW5nLT5wVHhEdW1teUJsa1BhKTsKLQlpZiAoIWFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1BhKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBUeCBkdW1teSBidWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg4LDc2ICsxNjcsNTkgQEAKIHsKIAlpbnQgZGVzY19zaXplID0gMDsKIAotCWlmIChhZGFwdGVyLT5UeFJpbmcucFR4RGVzY1JpbmdWYSkgeworCWlmIChhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZykgewogCQkvKiBGcmVlIG1lbW9yeSByZWxhdGluZyB0byBUeCByaW5ncyBoZXJlICovCi0JCWFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhIC09IGFkYXB0ZXItPlR4UmluZy5UeERlc2NPZmZzZXQ7Ci0KLQkJZGVzY19zaXplID0KLQkJICAgIChzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKSArIDQwOTYgLSAxOwotCisJCWRlc2Nfc2l6ZSA9IChzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogTlVNX0RFU0NfUEVSX1JJTkdfVFgpCisJCQkJCQkJCSsgNDA5NiAtIDE7CiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKIAkJCQkgICAgZGVzY19zaXplLAotCQkJCSAgICBhZGFwdGVyLT5UeFJpbmcucFR4RGVzY1JpbmdWYSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeERlc2NSaW5nUGEpOwotCi0JCWFkYXB0ZXItPlR4UmluZy5wVHhEZXNjUmluZ1ZhID0gTlVMTDsKKwkJCQkgICAgYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcsCisJCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nX3BhKTsKKwkJYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcgPSBOVUxMOwogCX0KIAogCS8qIEZyZWUgbWVtb3J5IGZvciB0aGUgVHggc3RhdHVzIGJsb2NrICovCi0JaWYgKGFkYXB0ZXItPlR4UmluZy5wVHhTdGF0dXNWYSkgeworCWlmIChhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1cykgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJICAgIHNpemVvZihUWF9TVEFUVVNfQkxPQ0tfdCksCi0JCQkJICAgIGFkYXB0ZXItPlR4UmluZy5wVHhTdGF0dXNWYSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1BhKTsKKwkJCQkgICAgc2l6ZW9mKHUzMiksCisJCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzLAorCQkJCSAgICBhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1c19wYSk7CiAKLQkJYWRhcHRlci0+VHhSaW5nLnBUeFN0YXR1c1ZhID0gTlVMTDsKKwkJYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXMgPSBOVUxMOwogCX0KLQotCS8qIEZyZWUgbWVtb3J5IGZvciB0aGUgZHVtbXkgYnVmZmVyICovCi0JaWYgKGFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1ZhKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgTklDX01JTl9QQUNLRVRfU0laRSwKLQkJCQkgICAgYWRhcHRlci0+VHhSaW5nLnBUeER1bW15QmxrVmEsCi0JCQkJICAgIGFkYXB0ZXItPlR4UmluZy5wVHhEdW1teUJsa1BhKTsKLQotCQlhZGFwdGVyLT5UeFJpbmcucFR4RHVtbXlCbGtWYSA9IE5VTEw7Ci0JfQotCi0JLyogRnJlZSB0aGUgbWVtb3J5IGZvciBNUF9UQ0Igc3RydWN0dXJlcyAqLwotCWtmcmVlKGFkYXB0ZXItPlR4UmluZy5NcFRjYk1lbSk7CisJLyogRnJlZSB0aGUgbWVtb3J5IGZvciB0aGUgdGNiIHN0cnVjdHVyZXMgKi8KKwlrZnJlZShhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nKTsKIH0KIAogLyoqCiAgKiBDb25maWdUeERtYVJlZ3MgLSBTZXQgdXAgdGhlIHR4IGRtYSBzZWN0aW9uIG9mIHRoZSBKQUdDb3JlLgogICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSB0cmFuc21pdCBlbmdpbmUgd2l0aCB0aGUgcmluZyBidWZmZXJzIHdlIGhhdmUgY3JlYXRlZAorICogYW5kIHByZXBhcmUgaXQgZm9yIHVzZS4KICAqLwogdm9pZCBDb25maWdUeERtYVJlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKIAlzdHJ1Y3QgX1RYRE1BX3QgX19pb21lbSAqdHhkbWEgPSAmZXRkZXYtPnJlZ3MtPnR4ZG1hOwogCiAJLyogTG9hZCB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZy4gKi8KLQl3cml0ZWwoKHVpbnQzMl90KSAoZXRkZXYtPlR4UmluZy5wVHhEZXNjUmluZ0FkanVzdGVkUGEgPj4gMzIpLAorCXdyaXRlbCgodTMyKSAoKHU2NClldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmdfcGEgPj4gMzIpLAogCSAgICAgICAmdHhkbWEtPnByX2Jhc2VfaGkpOwotCXdyaXRlbCgodWludDMyX3QpIGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdBZGp1c3RlZFBhLAorCXdyaXRlbCgodTMyKSBldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmdfcGEsCiAJICAgICAgICZ0eGRtYS0+cHJfYmFzZV9sbyk7CiAKIAkvKiBJbml0aWFsaXNlIHRoZSB0cmFuc21pdCBETUEgZW5naW5lICovCi0Jd3JpdGVsKE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0gMSwgJnR4ZG1hLT5wcl9udW1fZGVzLnZhbHVlKTsKKwl3cml0ZWwoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxLCAmdHhkbWEtPnByX251bV9kZXMpOwogCi0JLyogTG9hZCB0aGUgY29tcGxldGlvbiB3cml0ZWJhY2sgcGh5c2ljYWwgYWRkcmVzcwotCSAqCi0JICogTk9URTogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKLQkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCi0JICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQotCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCi0JICovCi0Jd3JpdGVsKDAsICZ0eGRtYS0+ZG1hX3diX2Jhc2VfaGkpOwotCXdyaXRlbChldGRldi0+VHhSaW5nLnBUeFN0YXR1c1BhLCAmdHhkbWEtPmRtYV93Yl9iYXNlX2xvKTsKKwkvKiBMb2FkIHRoZSBjb21wbGV0aW9uIHdyaXRlYmFjayBwaHlzaWNhbCBhZGRyZXNzICovCisJd3JpdGVsKCh1MzIpKCh1NjQpZXRkZXYtPnR4X3JpbmcudHhfc3RhdHVzX3BhID4+IDMyKSwKKwkJCQkJCSZ0eGRtYS0+ZG1hX3diX2Jhc2VfaGkpOworCXdyaXRlbCgodTMyKWV0ZGV2LT50eF9yaW5nLnR4X3N0YXR1c19wYSwgJnR4ZG1hLT5kbWFfd2JfYmFzZV9sbyk7CiAKLQltZW1zZXQoZXRkZXYtPlR4UmluZy5wVHhTdGF0dXNWYSwgMCwgc2l6ZW9mKFRYX1NUQVRVU19CTE9DS190KSk7CisJKmV0ZGV2LT50eF9yaW5nLnR4X3N0YXR1cyA9IDA7CiAKIAl3cml0ZWwoMCwgJnR4ZG1hLT5zZXJ2aWNlX3JlcXVlc3QpOwotCWV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCA9IDA7CisJZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggPSAwOwogfQogCiAvKioKQEAgLTI3OSwxNiArMjQxLDExIEBACiAgKi8KIHZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQl1MzIgY3NyID0gRVRfVFhETUFfU05HTF9FUEtUOwotCWlmIChldGRldi0+UmVnaXN0cnlQaHlMb29wYmspCi0JCS8qIFR4RE1BIGlzIGRpc2FibGVkIGZvciBsb29wYmFjayBvcGVyYXRpb24uICovCi0JCWNzciB8PSBFVF9UWERNQV9DU1JfSEFMVDsKLQllbHNlCi0JCS8qIFNldHVwIHRoZSB0cmFuc21pdCBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3Igbm9ybWFsCi0JCSAqIG9wZXJhdGlvbgotCQkgKi8KLQkJY3NyIHw9IFBBUk1fRE1BX0NBQ0hFX0RFRiA8PCBFVF9UWERNQV9DQUNIRV9TSElGVDsKLQl3cml0ZWwoY3NyLCAmZXRkZXYtPnJlZ3MtPnR4ZG1hLmNzcik7CisJLyogU2V0dXAgdGhlIHRyYW5zbWl0IGRtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZvciBub3JtYWwKKwkgKiBvcGVyYXRpb24KKwkgKi8KKwl3cml0ZWwoRVRfVFhETUFfU05HTF9FUEtUfChQQVJNX0RNQV9DQUNIRV9ERUYgPDwgRVRfVFhETUFfQ0FDSEVfU0hJRlQpLAorCQkJCQkmZXRkZXYtPnJlZ3MtPnR4ZG1hLmNzcik7CiB9CiAKIC8qKgpAQCAtMjk3LDM5ICsyNTQsMzIgQEAKICAqLwogdm9pZCBldDEzMXhfaW5pdF9zZW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlQTVBfVENCIHBNcFRjYjsKLQl1aW50MzJfdCBUY2JDb3VudDsKLQlUWF9SSU5HX3QgKnR4X3Jpbmc7CisJc3RydWN0IHRjYiAqdGNiOworCXUzMiBjdDsKKwlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZzsKIAogCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KLQl0eF9yaW5nID0gJmFkYXB0ZXItPlR4UmluZzsKLQlwTXBUY2IgPSBhZGFwdGVyLT5UeFJpbmcuTXBUY2JNZW07CisJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXRjYiA9IGFkYXB0ZXItPnR4X3JpbmcudGNiX3Jpbmc7CiAKLQl0eF9yaW5nLT5UQ0JSZWFkeVF1ZXVlSGVhZCA9IHBNcFRjYjsKKwl0eF9yaW5nLT50Y2JfcWhlYWQgPSB0Y2I7CisKKwltZW1zZXQodGNiLCAwLCBzaXplb2Yoc3RydWN0IHRjYikgKiBOVU1fVENCKTsKIAogCS8qIEdvIHRocm91Z2ggYW5kIHNldCB1cCBlYWNoIFRDQiAqLwotCWZvciAoVGNiQ291bnQgPSAwOyBUY2JDb3VudCA8IE5VTV9UQ0I7IFRjYkNvdW50KyspIHsKLQkJbWVtc2V0KHBNcFRjYiwgMCwgc2l6ZW9mKE1QX1RDQikpOwotCisJZm9yIChjdCA9IDA7IGN0KysgPCBOVU1fVENCOyB0Y2IrKykKIAkJLyogU2V0IHRoZSBsaW5rIHBvaW50ZXIgaW4gSFcgVENCIHRvIHRoZSBuZXh0IFRDQiBpbiB0aGUKLQkJICogY2hhaW4uICBJZiB0aGlzIGlzIHRoZSBsYXN0IFRDQiBpbiB0aGUgY2hhaW4sIGFsc28gc2V0IHRoZQotCQkgKiB0YWlsIHBvaW50ZXIuCisJCSAqIGNoYWluCiAJCSAqLwotCQlpZiAoVGNiQ291bnQgPCBOVU1fVENCIC0gMSkgewotCQkJcE1wVGNiLT5OZXh0ID0gcE1wVGNiICsgMTsKLQkJfSBlbHNlIHsKLQkJCXR4X3JpbmctPlRDQlJlYWR5UXVldWVUYWlsID0gcE1wVGNiOwotCQkJcE1wVGNiLT5OZXh0ID0gKFBNUF9UQ0IpIE5VTEw7Ci0JCX0KKwkJdGNiLT5uZXh0ID0gdGNiICsgMTsKIAotCQlwTXBUY2IrKzsKLQl9Ci0KKwkvKiBTZXQgdGhlICB0YWlsIHBvaW50ZXIgKi8KKwl0Y2ItLTsKKwl0eF9yaW5nLT50Y2JfcXRhaWwgPSB0Y2I7CisJdGNiLT5uZXh0ID0gTlVMTDsKIAkvKiBDdXJyIHNlbmQgcXVldWUgc2hvdWxkIG5vdyBiZSBlbXB0eSAqLwotCXR4X3JpbmctPkN1cnJTZW5kSGVhZCA9IChQTVBfVENCKSBOVUxMOwotCXR4X3JpbmctPkN1cnJTZW5kVGFpbCA9IChQTVBfVENCKSBOVUxMOwotCi0JSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPlR4UmluZy5TZW5kV2FpdFF1ZXVlKTsKKwl0eF9yaW5nLT5zZW5kX2hlYWQgPSBOVUxMOworCXR4X3JpbmctPnNlbmRfdGFpbCA9IE5VTEw7CiB9CiAKIC8qKgpAQCAtMzUyLDkgKzMwMiw4IEBACiAJICogdG8gVHgsIHNvIHRoZSBQYWNrZXRDb3VudCBhbmQgaXQncyBhcnJheSB1c2VkIG1ha2VzIG5vIHNlbnNlIGhlcmUKIAkgKi8KIAotCS8qIFF1ZXVlIGlzIG5vdCBlbXB0eSBvciBUQ0IgaXMgbm90IGF2YWlsYWJsZSAqLwotCWlmICghbGlzdF9lbXB0eSgmZXRkZXYtPlR4UmluZy5TZW5kV2FpdFF1ZXVlKSB8fAotCSAgICBNUF9UQ0JfUkVTT1VSQ0VTX05PVF9BVkFJTEFCTEUoZXRkZXYpKSB7CisJLyogVENCIGlzIG5vdCBhdmFpbGFibGUgKi8KKwlpZiAoZXRkZXYtPnR4X3JpbmcudXNlZCA+PSBOVU1fVENCKSB7CiAJCS8qIE5PVEU6IElmIHRoZXJlJ3MgYW4gZXJyb3Igb24gc2VuZCwgbm8gbmVlZCB0byBxdWV1ZSB0aGUKIAkJICogcGFja2V0IHVuZGVyIExpbnV4OyBpZiB3ZSBqdXN0IHNlbmQgYW4gZXJyb3IgdXAgdG8gdGhlCiAJCSAqIG5ldGlmIGxheWVyLCBpdCB3aWxsIHJlc2VuZCB0aGUgc2tiIHRvIHVzLgpAQCAtMzY0LDI3ICszMTMsMTUgQEAKIAkJLyogV2UgbmVlZCB0byBzZWUgaWYgdGhlIGxpbmsgaXMgdXA7IGlmIGl0J3Mgbm90LCBtYWtlIHRoZQogCQkgKiBuZXRpZiBsYXllciB0aGluayB3ZSdyZSBnb29kIGFuZCBkcm9wIHRoZSBwYWNrZXQKIAkJICovCi0JCS8qCi0JCSAqIGlmKCBNUF9TSE9VTERfRkFJTF9TRU5EKCBldGRldiApIHx8Ci0JCSAqICBldGRldi0+RHJpdmVyTm9QaHlBY2Nlc3MgKQotCQkgKi8KLQkJaWYgKE1QX1NIT1VMRF9GQUlMX1NFTkQoZXRkZXYpIHx8IGV0ZGV2LT5Ecml2ZXJOb1BoeUFjY2VzcwotCQkgICAgfHwgIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQlpZiAoKGV0ZGV2LT5GbGFncyAmIGZNUF9BREFQVEVSX0ZBSUxfU0VORF9NQVNLKSB8fAorCQkJCQkhbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJc2tiID0gTlVMTDsKIAogCQkJZXRkZXYtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CiAJCX0gZWxzZSB7CiAJCQlzdGF0dXMgPSBldDEzMXhfc2VuZF9wYWNrZXQoc2tiLCBldGRldik7Ci0KLQkJCWlmIChzdGF0dXMgPT0gLUVOT01FTSkgewotCi0JCQkJLyogTk9URTogSWYgdGhlcmUncyBhbiBlcnJvciBvbiBzZW5kLCBubyBuZWVkCi0JCQkJICogdG8gcXVldWUgdGhlIHBhY2tldCB1bmRlciBMaW51eDsgaWYgd2UganVzdAotCQkJCSAqIHNlbmQgYW4gZXJyb3IgdXAgdG8gdGhlIG5ldGlmIGxheWVyLCBpdAotCQkJCSAqIHdpbGwgcmVzZW5kIHRoZSBza2IgdG8gdXMuCi0JCQkJICovCi0JCQl9IGVsc2UgaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlpZiAoc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IC1FTk9NRU0pIHsKIAkJCQkvKiBPbiBhbnkgb3RoZXIgZXJyb3IsIG1ha2UgbmV0aWYgdGhpbmsgd2UncmUKIAkJCQkgKiBPSyBhbmQgZHJvcCB0aGUgcGFja2V0CiAJCQkJICovCkBAIC00MDksODcgKzM0Niw4MyBAQAogc3RhdGljIGludCBldDEzMXhfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCiB7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JUE1QX1RDQiBwTXBUY2IgPSBOVUxMOwotCXVpbnQxNl90ICpzaGJ1ZnZhOworCWludCBzdGF0dXM7CisJc3RydWN0IHRjYiAqdGNiID0gTlVMTDsKKwl1MTYgKnNoYnVmdmE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEFsbCBwYWNrZXRzIG11c3QgaGF2ZSBhdCBsZWFzdCBhIE1BQyBhZGRyZXNzIGFuZCBhIHByb3RvY29sIHR5cGUgKi8KLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgeworCWlmIChza2ItPmxlbiA8IEVUSF9ITEVOKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAkvKiBHZXQgYSBUQ0IgZm9yIHRoaXMgcGFja2V0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkOworCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZDsKIAotCWlmIChwTXBUY2IgPT0gTlVMTCkgeworCWlmICh0Y2IgPT0gTlVMTCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkID0gcE1wVGNiLT5OZXh0OworCWV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYi0+bmV4dDsKIAotCWlmIChldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkID09IE5VTEwpCi0JCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwgPSBOVUxMOworCWlmIChldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPT0gTlVMTCkKKwkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsID0gTlVMTDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2ItPlBhY2tldExlbmd0aCA9IHNrYi0+bGVuOwotCXBNcFRjYi0+UGFja2V0ID0gc2tiOworCXRjYi0+c2tiID0gc2tiOwogCi0JaWYgKChza2ItPmRhdGEgIT0gTlVMTCkgJiYgKChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pID49IDYpKSB7Ci0JCXNoYnVmdmEgPSAodWludDE2X3QgKikgc2tiLT5kYXRhOworCWlmIChza2ItPmRhdGEgIT0gTlVMTCAmJiBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4gPj0gNikgeworCQlzaGJ1ZnZhID0gKHUxNiAqKSBza2ItPmRhdGE7CiAKIAkJaWYgKChzaGJ1ZnZhWzBdID09IDB4ZmZmZikgJiYKIAkJICAgIChzaGJ1ZnZhWzFdID09IDB4ZmZmZikgJiYgKHNoYnVmdmFbMl0gPT0gMHhmZmZmKSkgewotCQkJcE1wVGNiLT5GbGFncyB8PSBmTVBfREVTVF9CUk9BRDsKKwkJCXRjYi0+ZmxhZ3MgfD0gZk1QX0RFU1RfQlJPQUQ7CiAJCX0gZWxzZSBpZiAoKHNoYnVmdmFbMF0gJiAweDMpID09IDB4MDAwMSkgewotCQkJcE1wVGNiLT5GbGFncyB8PSAgZk1QX0RFU1RfTVVMVEk7CisJCQl0Y2ItPmZsYWdzIHw9ICBmTVBfREVTVF9NVUxUSTsKIAkJfQogCX0KIAotCXBNcFRjYi0+TmV4dCA9IE5VTEw7CisJdGNiLT5uZXh0ID0gTlVMTDsKIAogCS8qIENhbGwgdGhlIE5JQyBzcGVjaWZpYyBzZW5kIGhhbmRsZXIuICovCi0JaWYgKHN0YXR1cyA9PSAwKQotCQlzdGF0dXMgPSBuaWNfc2VuZF9wYWNrZXQoZXRkZXYsIHBNcFRjYik7CisJc3RhdHVzID0gbmljX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwogCiAJaWYgKHN0YXR1cyAhPSAwKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwogCi0JCWlmIChldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsKSB7Ci0JCQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsLT5OZXh0ID0gcE1wVGNiOwotCQl9IGVsc2UgeworCQlpZiAoZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsKQorCQkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsLT5uZXh0ID0gdGNiOworCQllbHNlCiAJCQkvKiBBcHBhcmVudGx5IHJlYWR5IFEgaXMgZW1wdHkuICovCi0JCQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVIZWFkID0gcE1wVGNiOwotCQl9CisJCQlldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPSB0Y2I7CiAKLQkJZXRkZXYtPlR4UmluZy5UQ0JSZWFkeVF1ZXVlVGFpbCA9IHBNcFRjYjsKKwkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsID0gdGNiOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KLQlXQVJOX09OKGV0ZGV2LT5UeFJpbmcubkJ1c3lTZW5kID4gTlVNX1RDQik7CisJV0FSTl9PTihldGRldi0+dHhfcmluZy51c2VkID4gTlVNX1RDQik7CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICogbmljX3NlbmRfcGFja2V0IC0gTklDIHNwZWNpZmljIHNlbmQgaGFuZGxlciBmb3IgdmVyc2lvbiBCIHNpbGljb24uCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqIEBwTXBUY2I6IHBvaW50ZXIgdG8gTVBfVENCCisgKiBAdGNiOiBwb2ludGVyIHRvIHN0cnVjdCB0Y2IKICAqCiAgKiBSZXR1cm5zIDAgb3IgZXJybm8uCiAgKi8KLXN0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIFBNUF9UQ0IgcE1wVGNiKQorc3RhdGljIGludCBuaWNfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgc3RydWN0IHRjYiAqdGNiKQogewotCXVpbnQzMl90IGxvb3BJbmRleDsKLQlUWF9ERVNDX0VOVFJZX3QgQ3VyRGVzY1syNF07Ci0JdWludDMyX3QgRnJhZ21lbnROdW1iZXIgPSAwOwotCXVpbnQzMl90IHRoaXNjb3B5LCByZW1haW5kZXI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBQYWNrZXQgPSBwTXBUY2ItPlBhY2tldDsKLQl1aW50MzJfdCBGcmFnTGlzdENvdW50ID0gc2tiX3NoaW5mbyhwUGFja2V0KS0+bnJfZnJhZ3MgKyAxOwotCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKnBGcmFnTGlzdCA9ICZza2Jfc2hpbmZvKHBQYWNrZXQpLT5mcmFnc1swXTsKKwl1MzIgaTsKKwlzdHJ1Y3QgdHhfZGVzYyBkZXNjWzI0XTsJLyogMjQgeCAxNiBieXRlICovCisJdTMyIGZyYWcgPSAwOworCXUzMiB0aGlzY29weSwgcmVtYWluZGVyOworCXN0cnVjdCBza19idWZmICpza2IgPSB0Y2ItPnNrYjsKKwl1MzIgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKwlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFncyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBQYXJ0IG9mIHRoZSBvcHRpbWl6YXRpb25zIG9mIHRoaXMgc2VuZCByb3V0aW5lIHJlc3RyaWN0IHVzIHRvCkBAIC01MDAsMTcgKzQzMywxNiBAQAogCSAqIG51bWJlciBvZiBmcmFnbWVudHMuIElmIG5lZWRlZCwgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwKIAkgKiBhbHRob3VnaCBpdCBpcyBsZXNzIGVmZmljaWVudC4KIAkgKi8KLQlpZiAoRnJhZ0xpc3RDb3VudCA+IDIzKSB7CisJaWYgKG5yX2ZyYWdzID4gMjMpCiAJCXJldHVybiAtRUlPOwotCX0KIAotCW1lbXNldChDdXJEZXNjLCAwLCBzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIChGcmFnTGlzdENvdW50ICsgMSkpOworCW1lbXNldChkZXNjLCAwLCBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogKG5yX2ZyYWdzICsgMSkpOwogCi0JZm9yIChsb29wSW5kZXggPSAwOyBsb29wSW5kZXggPCBGcmFnTGlzdENvdW50OyBsb29wSW5kZXgrKykgeworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CiAJCS8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0aGlzIGVsZW1lbnQsIGxldHMgZ2V0IGEKIAkJICogZGVzY3JpcHRvciBmcm9tIHRoZSByaW5nIGFuZCBnZXQgdGhlIG5lY2Vzc2FyeSBkYXRhCiAJCSAqLwotCQlpZiAobG9vcEluZGV4ID09IDApIHsKKwkJaWYgKGkgPT0gMCkgewogCQkJLyogSWYgdGhlIGZyYWdtZW50cyBhcmUgc21hbGxlciB0aGFuIGEgc3RhbmRhcmQgTVRVLAogCQkJICogdGhlbiBtYXAgdGhlbSB0byBhIHNpbmdsZSBkZXNjcmlwdG9yIGluIHRoZSBUeAogCQkJICogRGVzYyByaW5nLiBIb3dldmVyLCBpZiB0aGV5J3JlIGxhcmdlciwgYXMgaXMKQEAgLTUyMCwxNjYgKzQ1MiwxNjQgQEAKIAkJCSAqIFRoaXMgd2lsbCB3b3JrIHVudGlsIHdlIGRldGVybWluZSB3aHkgdGhlIGhhcmR3YXJlCiAJCQkgKiBkb2Vzbid0IHNlZW0gdG8gbGlrZSBsYXJnZSBmcmFnbWVudHMuCiAJCQkgKi8KLQkJCWlmICgocFBhY2tldC0+bGVuIC0gcFBhY2tldC0+ZGF0YV9sZW4pIDw9IDE1MTQpIHsKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS5EYXRhQnVmZmVyUHRySGlnaCA9IDA7Ci0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy4KLQkJCQkgICAgbGVuZ3RoX2luX2J5dGVzID0KLQkJCQkgICAgcFBhY2tldC0+bGVuIC0gcFBhY2tldC0+ZGF0YV9sZW47CisJCQlpZiAoKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgPD0gMTUxNCkgeworCQkJCWRlc2NbZnJhZ10uYWRkcl9oaSA9IDA7CisJCQkJLyogTG93IDE2Yml0cyBhcmUgbGVuZ3RoLCBoaWdoIGlzIHZsYW4gYW5kCisJCQkJICAgdW51c2VkIGN1cnJlbnRseSBzbyB6ZXJvICovCisJCQkJZGVzY1tmcmFnXS5sZW5fdmxhbiA9CisJCQkJCXNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKIAogCQkJCS8qIE5PVEU6IEhlcmUsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIGZyb20KIAkJCQkgKiBwY2lfbWFwX3NpbmdsZSgpIGlzIGltcGxpY2l0bHkgY2FzdCBhcyBhCi0JCQkJICogdWludDMyX3QuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCisJCQkJICogdTMyLiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQogCQkJCSAqIDY0LWJpdCwgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkKIAkJCQkgKiBwY2lfbWFwX3NpbmdsZSgpIGlzIGFsd2F5cyAzMi1iaXQKIAkJCQkgKiBhZGRyZXNzYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgcGNpL2RtYQogCQkJCSAqIHN1YnN5c3RlbSkKIAkJCQkgKi8KLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyKytdLkRhdGFCdWZmZXJQdHJMb3cgPQorCQkJCWRlc2NbZnJhZysrXS5hZGRyX2xvID0KIAkJCQkgICAgcGNpX21hcF9zaW5nbGUoZXRkZXYtPnBkZXYsCi0JCQkJCQkgICBwUGFja2V0LT5kYXRhLAotCQkJCQkJICAgcFBhY2tldC0+bGVuIC0KLQkJCQkJCSAgIHBQYWNrZXQtPmRhdGFfbGVuLAorCQkJCQkJICAgc2tiLT5kYXRhLAorCQkJCQkJICAgc2tiLT5sZW4gLQorCQkJCQkJICAgc2tiLT5kYXRhX2xlbiwKIAkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJfSBlbHNlIHsKLQkJCQlDdXJEZXNjW0ZyYWdtZW50TnVtYmVyXS5EYXRhQnVmZmVyUHRySGlnaCA9IDA7Ci0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy4KLQkJCQkgICAgbGVuZ3RoX2luX2J5dGVzID0KLQkJCQkgICAgKChwUGFja2V0LT5sZW4gLSBwUGFja2V0LT5kYXRhX2xlbikgLyAyKTsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOworCQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCSAgICAoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSAvIDI7CiAKIAkJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCiAJCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYQotCQkJCSAqIHVpbnQzMl90LiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQorCQkJCSAqIHUzMi4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKIAkJCQkgKiA2NC1iaXQsIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5CiAJCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBhbHdheXMgMzItYml0CiAJCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEKIAkJCQkgKiBzdWJzeXN0ZW0pCiAJCQkJICovCi0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcisrXS5EYXRhQnVmZmVyUHRyTG93ID0KKwkJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9CiAJCQkJICAgIHBjaV9tYXBfc2luZ2xlKGV0ZGV2LT5wZGV2LAotCQkJCQkJICAgcFBhY2tldC0+ZGF0YSwKLQkJCQkJCSAgICgocFBhY2tldC0+bGVuIC0KLQkJCQkJCSAgICAgcFBhY2tldC0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICBza2ItPmRhdGEsCisJCQkJCQkgICAoKHNrYi0+bGVuIC0KKwkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKIAkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXJdLkRhdGFCdWZmZXJQdHJIaWdoID0gMDsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOwogCi0JCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy4KLQkJCQkgICAgbGVuZ3RoX2luX2J5dGVzID0KLQkJCQkgICAgKChwUGFja2V0LT5sZW4gLSBwUGFja2V0LT5kYXRhX2xlbikgLyAyKTsKKwkJCQlkZXNjW2ZyYWddLmxlbl92bGFuID0KKwkJCQkgICAgKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgLyAyOwogCiAJCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQogCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEKLQkJCQkgKiB1aW50MzJfdC4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKKwkJCQkgKiB1MzIuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCiAJCQkJICogNjQtYml0LCB0aGUgYWRkcmVzcyByZXR1cm5lZCBieQogCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgYWx3YXlzIDMyLWJpdAogCQkJCSAqIGFkZHJlc3NhYmxlIChhcyBkZWZpbmVkIGJ5IHRoZSBwY2kvZG1hCiAJCQkJICogc3Vic3lzdGVtKQogCQkJCSAqLwotCQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIrK10uRGF0YUJ1ZmZlclB0ckxvdyA9CisJCQkJZGVzY1tmcmFnKytdLmFkZHJfbG8gPQogCQkJCSAgICBwY2lfbWFwX3NpbmdsZShldGRldi0+cGRldiwKLQkJCQkJCSAgIHBQYWNrZXQtPmRhdGEgKwotCQkJCQkJICAgKChwUGFja2V0LT5sZW4gLQotCQkJCQkJICAgICBwUGFja2V0LT5kYXRhX2xlbikgLyAyKSwKLQkJCQkJCSAgICgocFBhY2tldC0+bGVuIC0KLQkJCQkJCSAgICAgcFBhY2tldC0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICBza2ItPmRhdGEgKworCQkJCQkJICAgKChza2ItPmxlbiAtCisJCQkJCQkgICAgIHNrYi0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICAoKHNrYi0+bGVuIC0KKwkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKIAkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQkJfQogCQl9IGVsc2UgewotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0uRGF0YUJ1ZmZlclB0ckhpZ2ggPSAwOwotCQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlcl0ud29yZDIuYml0cy5sZW5ndGhfaW5fYnl0ZXMgPQotCQkJICAgIHBGcmFnTGlzdFtsb29wSW5kZXggLSAxXS5zaXplOworCQkJZGVzY1tmcmFnXS5hZGRyX2hpID0gMDsKKwkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCQlmcmFnc1tpIC0gMV0uc2l6ZTsKIAogCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQotCQkJICogcGNpX21hcF9wYWdlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEgdWludDMyX3QuCisJCQkgKiBwY2lfbWFwX3BhZ2UoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYSB1MzIuCiAJCQkgKiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZSA2NC1iaXQsIHRoZSBhZGRyZXNzCiAJCQkgKiByZXR1cm5lZCBieSBwY2lfbWFwX3BhZ2UoKSBpcyBhbHdheXMgMzItYml0CiAJCQkgKiBhZGRyZXNzYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgcGNpL2RtYSBzdWJzeXN0ZW0pCiAJCQkgKi8KLQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIrK10uRGF0YUJ1ZmZlclB0ckxvdyA9CisJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9CiAJCQkgICAgcGNpX21hcF9wYWdlKGV0ZGV2LT5wZGV2LAotCQkJCQkgcEZyYWdMaXN0W2xvb3BJbmRleCAtIDFdLnBhZ2UsCi0JCQkJCSBwRnJhZ0xpc3RbbG9vcEluZGV4IC0gMV0ucGFnZV9vZmZzZXQsCi0JCQkJCSBwRnJhZ0xpc3RbbG9vcEluZGV4IC0gMV0uc2l6ZSwKKwkJCQkJIGZyYWdzW2kgLSAxXS5wYWdlLAorCQkJCQkgZnJhZ3NbaSAtIDFdLnBhZ2Vfb2Zmc2V0LAorCQkJCQkgZnJhZ3NbaSAtIDFdLnNpemUsCiAJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKIAkJfQogCX0KIAotCWlmIChGcmFnbWVudE51bWJlciA9PSAwKQorCWlmIChmcmFnID09IDApCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGV0ZGV2LT5saW5rc3BlZWQgPT0gVFJVRVBIWV9TUEVFRF8xMDAwTUJQUykgewotCQlpZiAoKytldGRldi0+VHhSaW5nLlR4UGFja2V0c1NpbmNlTGFzdGludGVycnVwdCA9PQotCQkgICAgUEFSTV9UWF9OVU1fQlVGU19ERUYpIHsKLQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIgLSAxXS53b3JkMy52YWx1ZSA9IDB4NTsKLQkJCWV0ZGV2LT5UeFJpbmcuVHhQYWNrZXRzU2luY2VMYXN0aW50ZXJydXB0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCUN1ckRlc2NbRnJhZ21lbnROdW1iZXIgLSAxXS53b3JkMy52YWx1ZSA9IDB4MTsKKwkJaWYgKCsrZXRkZXYtPnR4X3Jpbmcuc2luY2VfaXJxID09IFBBUk1fVFhfTlVNX0JVRlNfREVGKSB7CisJCQkvKiBMYXN0IGVsZW1lbnQgJiBJbnRlcnJ1cHQgZmxhZyAqLworCQkJZGVzY1tmcmFnIC0gMV0uZmxhZ3MgPSAweDU7CisJCQlldGRldi0+dHhfcmluZy5zaW5jZV9pcnEgPSAwOworCQl9IGVsc2UgeyAvKiBMYXN0IGVsZW1lbnQgKi8KKwkJCWRlc2NbZnJhZyAtIDFdLmZsYWdzID0gMHgxOwogCQl9Ci0JfSBlbHNlIHsKLQkJQ3VyRGVzY1tGcmFnbWVudE51bWJlciAtIDFdLndvcmQzLnZhbHVlID0gMHg1OwotCX0KKwl9IGVsc2UKKwkJZGVzY1tmcmFnIC0gMV0uZmxhZ3MgPSAweDU7CiAKLQlDdXJEZXNjWzBdLndvcmQzLmJpdHMuZiA9IDE7CisJZGVzY1swXS5mbGFncyB8PSAyOwkvKiBGaXJzdCBlbGVtZW50IGZsYWcgKi8KIAotCXBNcFRjYi0+V3JJbmRleFN0YXJ0ID0gZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kOwotCXBNcFRjYi0+UGFja2V0U3RhbGVDb3VudCA9IDA7CisJdGNiLT5pbmRleF9zdGFydCA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4OworCXRjYi0+c3RhbGUgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5TZW5kSFdMb2NrLCBmbGFncyk7CiAKIAl0aGlzY29weSA9IE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0KLQkJCQlJTkRFWDEwKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCk7CisJCQkJSU5ERVgxMChldGRldi0+dHhfcmluZy5zZW5kX2lkeCk7CiAKLQlpZiAodGhpc2NvcHkgPj0gRnJhZ21lbnROdW1iZXIpIHsKKwlpZiAodGhpc2NvcHkgPj0gZnJhZykgewogCQlyZW1haW5kZXIgPSAwOwotCQl0aGlzY29weSA9IEZyYWdtZW50TnVtYmVyOworCQl0aGlzY29weSA9IGZyYWc7CiAJfSBlbHNlIHsKLQkJcmVtYWluZGVyID0gRnJhZ21lbnROdW1iZXIgLSB0aGlzY29weTsKKwkJcmVtYWluZGVyID0gZnJhZyAtIHRoaXNjb3B5OwogCX0KIAotCW1lbWNweShldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEgKwotCSAgICAgICBJTkRFWDEwKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCksIEN1ckRlc2MsCi0JICAgICAgIHNpemVvZihUWF9ERVNDX0VOVFJZX3QpICogdGhpc2NvcHkpOworCW1lbWNweShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcgKworCSAgICAgICBJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSwgZGVzYywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHRoaXNjb3B5KTsKIAotCWFkZF8xMGJpdCgmZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kLCB0aGlzY29weSk7CisJYWRkXzEwYml0KCZldGRldi0+dHhfcmluZy5zZW5kX2lkeCwgdGhpc2NvcHkpOwogCi0JaWYgKElOREVYMTAoZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kKT09IDAgfHwKLQkgICAgSU5ERVgxMChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQpID09IE5VTV9ERVNDX1BFUl9SSU5HX1RYKSB7Ci0JICAgICAJZXRkZXYtPlR4UmluZy50eERtYVJlYWR5VG9TZW5kICY9IH5FVF9ETUExMF9NQVNLOwotCSAgICAgCWV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCBePSBFVF9ETUExMF9XUkFQOworCWlmIChJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSAwIHx8CisJCSAgICBJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSBOVU1fREVTQ19QRVJfUklOR19UWCkgeworCQlldGRldi0+dHhfcmluZy5zZW5kX2lkeCAmPSB+RVRfRE1BMTBfTUFTSzsKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggXj0gRVRfRE1BMTBfV1JBUDsKIAl9CiAKIAlpZiAocmVtYWluZGVyKSB7Ci0JCW1lbWNweShldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEsCi0JCSAgICAgICBDdXJEZXNjICsgdGhpc2NvcHksCi0JCSAgICAgICBzaXplb2YoVFhfREVTQ19FTlRSWV90KSAqIHJlbWFpbmRlcik7CisJCW1lbWNweShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcsCisJCSAgICAgICBkZXNjICsgdGhpc2NvcHksCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogcmVtYWluZGVyKTsKIAotCQlhZGRfMTBiaXQoJmV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCwgcmVtYWluZGVyKTsKKwkJYWRkXzEwYml0KCZldGRldi0+dHhfcmluZy5zZW5kX2lkeCwgcmVtYWluZGVyKTsKIAl9CiAKLQlpZiAoSU5ERVgxMChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQpID09IDApIHsKLQkJaWYgKGV0ZGV2LT5UeFJpbmcudHhEbWFSZWFkeVRvU2VuZCkKLQkJCXBNcFRjYi0+V3JJbmRleCA9IE5VTV9ERVNDX1BFUl9SSU5HX1RYIC0gMTsKKwlpZiAoSU5ERVgxMChldGRldi0+dHhfcmluZy5zZW5kX2lkeCkgPT0gMCkgeworCQlpZiAoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgpCisJCQl0Y2ItPmluZGV4ID0gTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxOwogCQllbHNlCi0JCQlwTXBUY2ItPldySW5kZXg9IEVUX0RNQTEwX1dSQVAgfCAoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxKTsKKwkJCXRjYi0+aW5kZXggPSBFVF9ETUExMF9XUkFQfChOVU1fREVTQ19QRVJfUklOR19UWCAtIDEpOwogCX0gZWxzZQotCQlwTXBUY2ItPldySW5kZXggPSBldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQgLSAxOworCQl0Y2ItPmluZGV4ID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggLSAxOwogCiAJc3Bpbl9sb2NrKCZldGRldi0+VENCU2VuZFFMb2NrKTsKIAotCWlmIChldGRldi0+VHhSaW5nLkN1cnJTZW5kVGFpbCkKLQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwtPk5leHQgPSBwTXBUY2I7CisJaWYgKGV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbCkKKwkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsLT5uZXh0ID0gdGNiOwogCWVsc2UKLQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQgPSBwTXBUY2I7CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYjsKIAotCWV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRUYWlsID0gcE1wVGNiOworCWV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbCA9IHRjYjsKIAotCVdBUk5fT04ocE1wVGNiLT5OZXh0ICE9IE5VTEwpOworCVdBUk5fT04odGNiLT5uZXh0ICE9IE5VTEwpOwogCi0JZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQrKzsKKwlldGRldi0+dHhfcmluZy51c2VkKys7CiAKIAlzcGluX3VubG9jaygmZXRkZXYtPlRDQlNlbmRRTG9jayk7CiAKIAkvKiBXcml0ZSB0aGUgbmV3IHdyaXRlIHBvaW50ZXIgYmFjayB0byB0aGUgZGV2aWNlLiAqLwotCXdyaXRlbChldGRldi0+VHhSaW5nLnR4RG1hUmVhZHlUb1NlbmQsCisJd3JpdGVsKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4LAogCSAgICAgICAmZXRkZXYtPnJlZ3MtPnR4ZG1hLnNlcnZpY2VfcmVxdWVzdCk7CiAKIAkvKiBGb3IgR2lnIG9ubHksIHdlIHVzZSBUeCBJbnRlcnJ1cHQgY29hbGVzY2luZy4gIEVuYWJsZSB0aGUgc29mdHdhcmUKQEAgLTY5Niw3MiArNjI2LDcxIEBACiAKIAogLyoqCi0gKiBldDEzMXhfZnJlZV9zZW5kX3BhY2tldCAtIFJlY3ljbGUgYSBNUF9UQ0IsIGNvbXBsZXRlIHRoZSBwYWNrZXQgaWYgbmVjZXNzYXJ5CisgKiBldDEzMXhfZnJlZV9zZW5kX3BhY2tldCAtIFJlY3ljbGUgYSBzdHJ1Y3QgdGNiCiAgKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqIEBwTXBUY2I6IHBvaW50ZXIgdG8gTVBfVENCCisgKiBAdGNiOiBwb2ludGVyIHRvIHN0cnVjdCB0Y2IKICAqCisgKiBDb21wbGV0ZSB0aGUgcGFja2V0IGlmIG5lY2Vzc2FyeQogICogQXNzdW1wdGlvbiAtIFNlbmQgc3BpbmxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKICAqLwogaW5saW5lIHZvaWQgZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkJCQlQTVBfVENCIHBNcFRjYikKKwkJCQkJCXN0cnVjdCB0Y2IgKnRjYikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVRYX0RFU0NfRU5UUllfdCAqZGVzYyA9IE5VTEw7CisJc3RydWN0IHR4X2Rlc2MgKmRlc2MgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZldGRldi0+bmV0X3N0YXRzOwogCi0JaWYgKHBNcFRjYi0+RmxhZ3MgJiBmTVBfREVTVF9CUk9BRCkKKwlpZiAodGNiLT5mbGFncyAmIGZNUF9ERVNUX0JST0FEKQogCQlhdG9taWNfaW5jKCZldGRldi0+U3RhdHMuYnJkY3N0eG10KTsKLQllbHNlIGlmIChwTXBUY2ItPkZsYWdzICYgZk1QX0RFU1RfTVVMVEkpCisJZWxzZSBpZiAodGNiLT5mbGFncyAmIGZNUF9ERVNUX01VTFRJKQogCQlhdG9taWNfaW5jKCZldGRldi0+U3RhdHMubXVsdGl4bXQpOwogCWVsc2UKIAkJYXRvbWljX2luYygmZXRkZXYtPlN0YXRzLnVuaXhtdCk7CiAKLQlpZiAocE1wVGNiLT5QYWNrZXQpIHsKLQkJc3RhdHMtPnR4X2J5dGVzICs9IHBNcFRjYi0+UGFja2V0LT5sZW47CisJaWYgKHRjYi0+c2tiKSB7CisJCXN0YXRzLT50eF9ieXRlcyArPSB0Y2ItPnNrYi0+bGVuOwogCiAJCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgVFggZGVzY3JpcHRvcnMgb24gdGhlIHJpbmcKIAkJICogY29ycmVzcG9uZGluZyB0byB0aGlzIHBhY2tldCBhbmQgdW1hcCB0aGUgZnJhZ21lbnRzCiAJCSAqIHRoZXkgcG9pbnQgdG8KIAkJICovCiAJCWRvIHsKLQkJCWRlc2MgPQotCQkJICAgIChUWF9ERVNDX0VOVFJZX3QgKikgKGV0ZGV2LT5UeFJpbmcucFR4RGVzY1JpbmdWYSArCi0JCQkgICAgCUlOREVYMTAocE1wVGNiLT5XckluZGV4U3RhcnQpKTsKKwkJCWRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKikoZXRkZXYtPnR4X3JpbmcudHhfZGVzY19yaW5nICsKKwkJCQkJCUlOREVYMTAodGNiLT5pbmRleF9zdGFydCkpOwogCiAJCQlwY2lfdW5tYXBfc2luZ2xlKGV0ZGV2LT5wZGV2LAotCQkJCQkgZGVzYy0+RGF0YUJ1ZmZlclB0ckxvdywKLQkJCQkJIGRlc2MtPndvcmQyLnZhbHVlLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJIGRlc2MtPmFkZHJfbG8sCisJCQkJCSBkZXNjLT5sZW5fdmxhbiwgUENJX0RNQV9UT0RFVklDRSk7CiAKLQkJCWFkZF8xMGJpdCgmcE1wVGNiLT5XckluZGV4U3RhcnQsIDEpOwotCQkJaWYgKElOREVYMTAocE1wVGNiLT5XckluZGV4U3RhcnQpID49Ci0JCQkgICAgTlVNX0RFU0NfUEVSX1JJTkdfVFgpIHsKLQkJCSAgICAJcE1wVGNiLT5XckluZGV4U3RhcnQgJj0gfkVUX0RNQTEwX01BU0s7Ci0JCQkgICAgCXBNcFRjYi0+V3JJbmRleFN0YXJ0IF49IEVUX0RNQTEwX1dSQVA7CisJCQlhZGRfMTBiaXQoJnRjYi0+aW5kZXhfc3RhcnQsIDEpOworCQkJaWYgKElOREVYMTAodGNiLT5pbmRleF9zdGFydCkgPj0KKwkJCQkJCQlOVU1fREVTQ19QRVJfUklOR19UWCkgeworCQkJCXRjYi0+aW5kZXhfc3RhcnQgJj0gfkVUX0RNQTEwX01BU0s7CisJCQkJdGNiLT5pbmRleF9zdGFydCBePSBFVF9ETUExMF9XUkFQOwogCQkJfQotCQl9IHdoaWxlIChkZXNjICE9IChldGRldi0+VHhSaW5nLnBUeERlc2NSaW5nVmEgKwotCQkJCUlOREVYMTAocE1wVGNiLT5XckluZGV4KSkpOworCQl9IHdoaWxlIChkZXNjICE9IChldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcgKworCQkJCUlOREVYMTAodGNiLT5pbmRleCkpKTsKIAotCQlkZXZfa2ZyZWVfc2tiX2FueShwTXBUY2ItPlBhY2tldCk7CisJCWRldl9rZnJlZV9za2JfYW55KHRjYi0+c2tiKTsKIAl9CiAKLQltZW1zZXQocE1wVGNiLCAwLCBzaXplb2YoTVBfVENCKSk7CisJbWVtc2V0KHRjYiwgMCwgc2l6ZW9mKHN0cnVjdCB0Y2IpKTsKIAogCS8qIEFkZCB0aGUgVENCIHRvIHRoZSBSZWFkeSBRICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7CiAKIAlldGRldi0+U3RhdHMub3BhY2tldHMrKzsKIAotCWlmIChldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsKSB7Ci0JCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZVRhaWwtPk5leHQgPSBwTXBUY2I7Ci0JfSBlbHNlIHsKKwlpZiAoZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsKQorCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwtPm5leHQgPSB0Y2I7CisJZWxzZQogCQkvKiBBcHBhcmVudGx5IHJlYWR5IFEgaXMgZW1wdHkuICovCi0JCWV0ZGV2LT5UeFJpbmcuVENCUmVhZHlRdWV1ZUhlYWQgPSBwTXBUY2I7Ci0JfQorCQlldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPSB0Y2I7CiAKLQlldGRldi0+VHhSaW5nLlRDQlJlYWR5UXVldWVUYWlsID0gcE1wVGNiOworCWV0ZGV2LT50eF9yaW5nLnRjYl9xdGFpbCA9IHRjYjsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7Ci0JV0FSTl9PTihldGRldi0+VHhSaW5nLm5CdXN5U2VuZCA8IDApOworCVdBUk5fT04oZXRkZXYtPnR4X3JpbmcudXNlZCA8IDApOwogfQogCiAvKioKQEAgLTc3Miw1MiArNzAxLDQwIEBACiAgKi8KIHZvaWQgZXQxMzF4X2ZyZWVfYnVzeV9zZW5kX3BhY2tldHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKIHsKLQlQTVBfVENCIHBNcFRjYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgdGNiICp0Y2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBGcmVlQ291bnRlciA9IDA7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmV0ZGV2LT5UeFJpbmcuU2VuZFdhaXRRdWV1ZSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5TZW5kV2FpdExvY2ssIGZsYWdzKTsKLQotCQlldGRldi0+VHhSaW5nLm5XYWl0U2VuZC0tOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+U2VuZFdhaXRMb2NrLCBmbGFncyk7Ci0KLQkJZW50cnkgPSBldGRldi0+VHhSaW5nLlNlbmRXYWl0UXVldWUubmV4dDsKLQl9Ci0KLQlldGRldi0+VHhSaW5nLm5XYWl0U2VuZCA9IDA7CisJdTMyIGZyZWVkID0gMDsKIAogCS8qIEFueSBwYWNrZXRzIGJlaW5nIHNlbnQ/IENoZWNrIHRoZSBmaXJzdCBUQ0Igb24gdGhlIHNlbmQgbGlzdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7CiAKLQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAKLQl3aGlsZSAoKHBNcFRjYiAhPSBOVUxMKSAmJiAoRnJlZUNvdW50ZXIgPCBOVU1fVENCKSkgewotCQlQTVBfVENCIHBOZXh0ID0gcE1wVGNiLT5OZXh0OworCXdoaWxlICh0Y2IgIT0gTlVMTCAmJiBmcmVlZCA8IE5VTV9UQ0IpIHsKKwkJc3RydWN0IHRjYiAqbmV4dCA9IHRjYi0+bmV4dDsKIAotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZCA9IHBOZXh0OworCQlldGRldi0+dHhfcmluZy5zZW5kX2hlYWQgPSBuZXh0OwogCi0JCWlmIChwTmV4dCA9PSBOVUxMKQotCQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwgPSBOVUxMOworCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKIAotCQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZC0tOworCQlldGRldi0+dHhfcmluZy51c2VkLS07CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JCUZyZWVDb3VudGVyKys7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCBwTXBUY2IpOworCQlmcmVlZCsrOworCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCQl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7CiAJfQogCi0JV0FSTl9PTihGcmVlQ291bnRlciA9PSBOVU1fVENCKTsKKwlXQVJOX09OKGZyZWVkID09IE5VTV9UQ0IpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQgPSAwOworCWV0ZGV2LT50eF9yaW5nLnVzZWQgPSAwOwogfQogCiAvKioKQEAgLTgzMSw5OSArNzQ4LDU2IEBACiAgKi8KIHZvaWQgZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQogewotCS8qIE1hcmsgYXMgY29tcGxldGVkIGFueSBwYWNrZXRzIHdoaWNoIGhhdmUgYmVlbiBzZW50IGJ5IHRoZSBkZXZpY2UuICovCi0JZXQxMzF4X3VwZGF0ZV90Y2JfbGlzdChldGRldik7Ci0KLQkvKiBJZiB3ZSBxdWV1ZWQgYW55IHRyYW5zbWl0cyBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIGFueSBUQ0JzIGVhcmxpZXIsCi0JICogZGVxdWV1ZSBhbmQgc2VuZCB0aG9zZSBwYWNrZXRzIG5vdywgYXMgbG9uZyBhcyB3ZSBoYXZlIGZyZWUgVENCcy4KLQkgKi8KLQlldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3QoZXRkZXYpOwotfQotCi0vKioKLSAqIGV0MTMxeF91cGRhdGVfdGNiX2xpc3QgLSBIZWxwZXIgcm91dGluZSBmb3IgU2VuZCBJbnRlcnJ1cHQgaGFuZGxlcgotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gKgotICogUmUtY2xhaW1zIHRoZSBzZW5kIHJlc291cmNlcyBhbmQgY29tcGxldGVzIHNlbmRzLiAgQ2FuIGFsc28gYmUgY2FsbGVkIGFzCi0gKiBwYXJ0IG9mIHRoZSBOSUMgc2VuZCByb3V0aW5lIHdoZW4gdGhlICJTZXJ2aWNlQ29tcGxldGUiIGluZGljYXRpb24gaGFzCi0gKiB3cmFwcGVkLgotICovCi1zdGF0aWMgdm9pZCBldDEzMXhfdXBkYXRlX3RjYl9saXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgU2VydmljZUNvbXBsZXRlOwotCVBNUF9UQ0IgcE1wVGNiOworCXUzMiBzZXJ2aWNlZDsKKwlzdHJ1Y3QgdGNiICp0Y2I7CiAJdTMyIGluZGV4OwogCi0JU2VydmljZUNvbXBsZXRlID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT50eGRtYS5OZXdTZXJ2aWNlQ29tcGxldGUpOwotCWluZGV4ID0gSU5ERVgxMChTZXJ2aWNlQ29tcGxldGUpOworCXNlcnZpY2VkID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT50eGRtYS5OZXdTZXJ2aWNlQ29tcGxldGUpOworCWluZGV4ID0gSU5ERVgxMChzZXJ2aWNlZCk7CiAKIAkvKiBIYXMgdGhlIHJpbmcgd3JhcHBlZD8gIFByb2Nlc3MgYW55IGRlc2NyaXB0b3JzIHRoYXQgZG8gbm90IGhhdmUKIAkgKiB0aGUgc2FtZSAid3JhcCIgaW5kaWNhdG9yIGFzIHRoZSBjdXJyZW50IGNvbXBsZXRpb24gaW5kaWNhdG9yCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAotCXBNcFRjYiA9IGV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRIZWFkOworCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZDsKIAotCXdoaWxlIChwTXBUY2IgJiYKLQkgICAgICAgKChTZXJ2aWNlQ29tcGxldGUgXiBwTXBUY2ItPldySW5kZXgpICYgRVRfRE1BMTBfV1JBUCkgJiYKLQkgICAgICAgaW5kZXggPCBJTkRFWDEwKHBNcFRjYi0+V3JJbmRleCkpIHsKLQkJZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQtLTsKLQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQgPSBwTXBUY2ItPk5leHQ7Ci0JCWlmIChwTXBUY2ItPk5leHQgPT0gTlVMTCkKLQkJCWV0ZGV2LT5UeFJpbmcuQ3VyclNlbmRUYWlsID0gTlVMTDsKKwl3aGlsZSAodGNiICYmCisJICAgICAgICgoc2VydmljZWQgXiB0Y2ItPmluZGV4KSAmIEVUX0RNQTEwX1dSQVApICYmCisJICAgICAgIGluZGV4IDwgSU5ERVgxMCh0Y2ItPmluZGV4KSkgeworCQlldGRldi0+dHhfcmluZy51c2VkLS07CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYi0+bmV4dDsKKwkJaWYgKHRjYi0+bmV4dCA9PSBOVUxMKQorCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCBwTXBUY2IpOworCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAogCQkvKiBHb3RvIHRoZSBuZXh0IHBhY2tldCAqLwotCQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwkJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCX0KLQl3aGlsZSAocE1wVGNiICYmCi0JICAgICAgICEoKFNlcnZpY2VDb21wbGV0ZSBeIHBNcFRjYi0+V3JJbmRleCkgJiBFVF9ETUExMF9XUkFQKQotCSAgICAgICAmJiBpbmRleCA+IChwTXBUY2ItPldySW5kZXggJiBFVF9ETUExMF9NQVNLKSkgewotCQlldGRldi0+VHhSaW5nLm5CdXN5U2VuZC0tOwotCQlldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZCA9IHBNcFRjYi0+TmV4dDsKLQkJaWYgKHBNcFRjYi0+TmV4dCA9PSBOVUxMKQotCQkJZXRkZXYtPlR4UmluZy5DdXJyU2VuZFRhaWwgPSBOVUxMOworCXdoaWxlICh0Y2IgJiYKKwkgICAgICAgISgoc2VydmljZWQgXiB0Y2ItPmluZGV4KSAmIEVUX0RNQTEwX1dSQVApCisJICAgICAgICYmIGluZGV4ID4gKHRjYi0+aW5kZXggJiBFVF9ETUExMF9NQVNLKSkgeworCQlldGRldi0+dHhfcmluZy51c2VkLS07CisJCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYi0+bmV4dDsKKwkJaWYgKHRjYi0+bmV4dCA9PSBOVUxMKQorCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCBwTXBUY2IpOworCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIAogCQkvKiBHb3RvIHRoZSBuZXh0IHBhY2tldCAqLwotCQlwTXBUY2IgPSBldGRldi0+VHhSaW5nLkN1cnJTZW5kSGVhZDsKKwkJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCX0KIAogCS8qIFdha2UgdXAgdGhlIHF1ZXVlIHdoZW4gd2UgaGl0IGEgbG93LXdhdGVyIG1hcmsgKi8KLQlpZiAoZXRkZXYtPlR4UmluZy5uQnVzeVNlbmQgPD0gKE5VTV9UQ0IgLyAzKSkKKwlpZiAoZXRkZXYtPnR4X3JpbmcudXNlZCA8PSBOVU1fVENCIC8gMykKIAkJbmV0aWZfd2FrZV9xdWV1ZShldGRldi0+bmV0ZGV2KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKIH0KIAotLyoqCi0gKiBldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3QgLSBIZWxwZXIgcm91dGluZSBmb3IgdGhlIGludGVycnVwdCBoYW5kbGVyCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqCi0gKiBUYWtlcyBwYWNrZXRzIGZyb20gdGhlIHNlbmQgd2FpdCBxdWV1ZSBhbmQgcG9zdHMgdGhlbSB0byB0aGUgZGV2aWNlIChpZgotICogcm9vbSBhdmFpbGFibGUpLgotICovCi1zdGF0aWMgdm9pZCBldDEzMXhfY2hlY2tfc2VuZF93YWl0X2xpc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5TZW5kV2FpdExvY2ssIGZsYWdzKTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmZXRkZXYtPlR4UmluZy5TZW5kV2FpdFF1ZXVlKSAmJgotCQkJCU1QX1RDQl9SRVNPVVJDRVNfQVZBSUxBQkxFKGV0ZGV2KSkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLQotCQllbnRyeSA9IGV0ZGV2LT5UeFJpbmcuU2VuZFdhaXRRdWV1ZS5uZXh0OwotCi0JCWV0ZGV2LT5UeFJpbmcubldhaXRTZW5kLS07Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlNlbmRXYWl0TG9jaywgZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3R4LmgKaW5kZXggYWQwMzcyMS4uNGYwZWE4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5oCkBAIC02MywxNjcgKzYzLDg5IEBACiAvKiBUeXBlZGVmcyBmb3IgVHggRGVzY3JpcHRvciBSaW5nICovCiAKIC8qCi0gKiBUWERFU0NfV09SRDJfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yCi0gKiByaW5nIGZvciB0aGUgRVQtMTMxMAorICogd29yZCAyIG9mIHRoZSBjb250cm9sIGJpdHMgaW4gdGhlIFR4IERlc2NyaXB0b3IgcmluZyBmb3IgdGhlIEVULTEzMTAKKyAqCisgKiAwLTE1OiBsZW5ndGggb2YgcGFja2V0CisgKiAxNi0yNzogVkxBTiB0YWcKKyAqIDI4OiBWTEFOIENGSQorICogMjktMzE6IFZMQU4gcHJpb3JpdHkKKyAqCisgKiB3b3JkIDMgb2YgdGhlIGNvbnRyb2wgYml0cyBpbiB0aGUgVHggRGVzY3JpcHRvciByaW5nIGZvciB0aGUgRVQtMTMxMAorICoKKyAqIDA6IGxhc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZQorICogMTogZmlyc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZQorICogMjogaW50ZXJydXB0IHRoZSBwcm9jZXNzb3Igd2hlbiB0aGlzIHBrdCBzZW50CisgKiAzOiBDb250cm9sIHdvcmQgLSBubyBwYWNrZXQgZGF0YQorICogNDogSXNzdWUgaGFsZi1kdXBsZXggYmFja3ByZXNzdXJlIDogWE9OL1hPRkYKKyAqIDU6IHNlbmQgcGF1c2UgZnJhbWUKKyAqIDY6IFR4IGZyYW1lIGhhcyBlcnJvcgorICogNzogYXBwZW5kIENSQworICogODogTUFDIG92ZXJyaWRlCisgKiA5OiBwYWQgcGFja2V0CisgKiAxMDogUGFja2V0IGlzIGEgSHVnZSBwYWNrZXQKKyAqIDExOiBhcHBlbmQgVkxBTiB0YWcKKyAqIDEyOiBJUCBjaGVja3N1bSBhc3Npc3QKKyAqIDEzOiBUQ1AgY2hlY2tzdW0gYXNzaXN0CisgKiAxNDogVURQIGNoZWNrc3VtIGFzc2lzdAogICovCi10eXBlZGVmIHVuaW9uIF90eGRlc2Nfd29yZDJfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdmxhbl9wcmlvOjM7CQkvKiBiaXRzIDI5LTMxKFZMQU4gcHJpb3JpdHkpICovCi0JCXUzMiB2bGFuX2NmaToxOwkJLyogYml0IDI4KGNmaSkgKi8KLQkJdTMyIHZsYW5fdGFnOjEyOwkJLyogYml0cyAxNi0yNyhWTEFOIHRhZykgKi8KLQkJdTMyIGxlbmd0aF9pbl9ieXRlczoxNjsJLyogYml0cyAgMC0xNShwYWNrZXQgbGVuZ3RoKSAqLwotI2Vsc2UKLQkJdTMyIGxlbmd0aF9pbl9ieXRlczoxNjsJLyogYml0cyAgMC0xNShwYWNrZXQgbGVuZ3RoKSAqLwotCQl1MzIgdmxhbl90YWc6MTI7CQkvKiBiaXRzIDE2LTI3KFZMQU4gdGFnKSAqLwotCQl1MzIgdmxhbl9jZmk6MTsJCS8qIGJpdCAyOChjZmkpICovCi0JCXUzMiB2bGFuX3ByaW86MzsJCS8qIGJpdHMgMjktMzEoVkxBTiBwcmlvcml0eSkgKi8KLSNlbmRpZgkvKiBfQklUX0ZJRUxEU19IVE9MICovCi0JfSBiaXRzOwotfSBUWERFU0NfV09SRDJfdCwgKlBUWERFU0NfV09SRDJfdDsKKworLyogc3RydWN0IHR4X2Rlc2MgcmVwcmVzZW50cyBlYWNoIGRlc2NyaXB0b3Igb24gdGhlIHJpbmcgKi8KK3N0cnVjdCB0eF9kZXNjIHsKKwl1MzIgYWRkcl9oaTsKKwl1MzIgYWRkcl9sbzsKKwl1MzIgbGVuX3ZsYW47CS8qIGNvbnRyb2wgd29yZHMgaG93IHRvIHhtaXQgdGhlICovCisJdTMyIGZsYWdzOwkvKiBkYXRhIChkZXRhaWxlZCBhYm92ZSkgKi8KK307CiAKIC8qCi0gKiBUWERFU0NfV09SRDNfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yCi0gKiByaW5nIGZvciB0aGUgRVQtMTMxMAorICogVGhlIHN0YXR1cyBvZiB0aGUgVHggRE1BIGVuZ2luZSBpdCBzaXRzIGluIGZyZWUgbWVtb3J5LCBhbmQgaXMgcG9pbnRlZCB0bworICogYnkgMHgxMDFjIC8gMHgxMDIwLiBUaGlzIGlzIGEgRE1BMTAgdHlwZQogICovCi10eXBlZGVmIHVuaW9uIF90eGRlc2Nfd29yZDNfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjE3OwkvKiBiaXRzIDE1LTMxICovCi0JCXUzMiB1ZHBhOjE7CS8qIGJpdCAxNChVRFAgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgdGNwYToxOwkvKiBiaXQgMTMoVENQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIGlwYToxOwkJLyogYml0IDEyKElQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIHZsYW46MTsJLyogYml0IDExKGFwcGVuZCBWTEFOIHRhZykgKi8KLQkJdTMyIGhwOjE7CQkvKiBiaXQgMTAoUGFja2V0IGlzIGEgSHVnZSBwYWNrZXQpICovCi0JCXUzMiBwcDoxOwkJLyogYml0ICA5KHBhZCBwYWNrZXQpICovCi0JCXUzMiBtYWM6MTsJCS8qIGJpdCAgOChNQUMgb3ZlcnJpZGUpICovCi0JCXUzMiBjcmM6MTsJCS8qIGJpdCAgNyhhcHBlbmQgQ1JDKSAqLwotCQl1MzIgZToxOwkJLyogYml0ICA2KFR4IGZyYW1lIGhhcyBlcnJvcikgKi8KLQkJdTMyIHBmOjE7CQkvKiBiaXQgIDUoc2VuZCBwYXVzZSBmcmFtZSkgKi8KLQkJdTMyIGJwOjE7CQkvKiBiaXQgIDQoSXNzdWUgaGFsZi1kdXBsZXggYmFja3ByZXNzdXJlIChYT04vWE9GRikgKi8KLQkJdTMyIGN3OjE7CQkvKiBiaXQgIDMoQ29udHJvbCB3b3JkIC0gbm8gcGFja2V0IGRhdGEpICovCi0JCXUzMiBpcjoxOwkJLyogYml0ICAyKGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gdGhpcyBwa3Qgc2VudCkgKi8KLQkJdTMyIGY6MTsJCS8qIGJpdCAgMShmaXJzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlKSAqLwotCQl1MzIgbDoxOwkJLyogYml0ICAwKGxhc3QgcGFja2V0IGluIHRoZSBzZXF1ZW5jZSkgKi8KLSNlbHNlCi0JCXUzMiBsOjE7CQkvKiBiaXQgIDAobGFzdCBwYWNrZXQgaW4gdGhlIHNlcXVlbmNlKSAqLwotCQl1MzIgZjoxOwkJLyogYml0ICAxKGZpcnN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UpICovCi0JCXUzMiBpcjoxOwkJLyogYml0ICAyKGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gdGhpcyBwa3Qgc2VudCkgKi8KLQkJdTMyIGN3OjE7CQkvKiBiaXQgIDMoQ29udHJvbCB3b3JkIC0gbm8gcGFja2V0IGRhdGEpICovCi0JCXUzMiBicDoxOwkJLyogYml0ICA0KElzc3VlIGhhbGYtZHVwbGV4IGJhY2twcmVzc3VyZSAoWE9OL1hPRkYpICovCi0JCXUzMiBwZjoxOwkJLyogYml0ICA1KHNlbmQgcGF1c2UgZnJhbWUpICovCi0JCXUzMiBlOjE7CQkvKiBiaXQgIDYoVHggZnJhbWUgaGFzIGVycm9yKSAqLwotCQl1MzIgY3JjOjE7CQkvKiBiaXQgIDcoYXBwZW5kIENSQykgKi8KLQkJdTMyIG1hYzoxOwkJLyogYml0ICA4KE1BQyBvdmVycmlkZSkgKi8KLQkJdTMyIHBwOjE7CQkvKiBiaXQgIDkocGFkIHBhY2tldCkgKi8KLQkJdTMyIGhwOjE7CQkvKiBiaXQgMTAoUGFja2V0IGlzIGEgSHVnZSBwYWNrZXQpICovCi0JCXUzMiB2bGFuOjE7CS8qIGJpdCAxMShhcHBlbmQgVkxBTiB0YWcpICovCi0JCXUzMiBpcGE6MTsJCS8qIGJpdCAxMihJUCBjaGVja3N1bSBhc3Npc3QpICovCi0JCXUzMiB0Y3BhOjE7CS8qIGJpdCAxMyhUQ1AgY2hlY2tzdW0gYXNzaXN0KSAqLwotCQl1MzIgdWRwYToxOwkvKiBiaXQgMTQoVURQIGNoZWNrc3VtIGFzc2lzdCkgKi8KLQkJdTMyIHVudXNlZDoxNzsJLyogYml0cyAxNS0zMSAqLwotI2VuZGlmCS8qIF9CSVRfRklFTERTX0hUT0wgKi8KLQl9IGJpdHM7Ci19IFRYREVTQ19XT1JEM190LCAqUFRYREVTQ19XT1JEM190OwogCi0vKiBUWF9ERVNDX0VOVFJZX3QgaXMgc3J1Y3R1cmUgcmVwcmVzZW50aW5nIGVhY2ggZGVzY3JpcHRvciBvbiB0aGUgcmluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfZW50cnlfdCB7Ci0JdTMyIERhdGFCdWZmZXJQdHJIaWdoOwotCXUzMiBEYXRhQnVmZmVyUHRyTG93OwotCVRYREVTQ19XT1JEMl90IHdvcmQyOwkvKiBjb250cm9sIHdvcmRzIGhvdyB0byB4bWl0IHRoZSAqLwotCVRYREVTQ19XT1JEM190IHdvcmQzOwkvKiBkYXRhIChkZXRhaWxlZCBhYm92ZSkgKi8KLX0gVFhfREVTQ19FTlRSWV90LCAqUFRYX0RFU0NfRU5UUllfdDsKKy8qIFRDQiAoVHJhbnNtaXQgQ29udHJvbCBCbG9jazogSG9zdCBTaWRlKSAqLworc3RydWN0IHRjYiB7CisJc3RydWN0IHRjYiAqbmV4dDsJLyogTmV4dCBlbnRyeSBpbiByaW5nICovCisJdTMyIGZsYWdzOwkJLyogT3VyIGZsYWdzIGZvciB0aGUgcGFja2V0ICovCisJdTMyIGNvdW50OwkJLyogVXNlZCB0byBzcG90IHN0dWNrL2xvc3QgcGFja2V0cyAqLworCXUzMiBzdGFsZTsJCS8qIFVzZWQgdG8gc3BvdCBzdHVjay9sb3N0IHBhY2tldHMgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwkvKiBOZXR3b3JrIHNrYiB3ZSBhcmUgdGllZCB0byAqLworCXUzMiBpbmRleDsJCS8qIFJpbmcgaW5kZXhlcyAqLworCXUzMiBpbmRleF9zdGFydDsKK307CiAKLQotLyogVHlwZWRlZnMgZm9yIFR4IERNQSBlbmdpbmUgc3RhdHVzIHdyaXRlYmFjayAqLwotCi0vKgotICogVFhfU1RBVFVTX0JMT0NLX3QgaXMgc3J1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgdGhlIFR4IERNQSBlbmdpbmUKLSAqIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvIGJ5IDB4MTAxYyAvIDB4MTAyMAotICovCi10eXBlZGVmIHVuaW9uIF90eF9zdGF0dXNfYmxvY2tfdCB7Ci0JdTMyIHZhbHVlOwotCXN0cnVjdCB7Ci0jaWZkZWYgX0JJVF9GSUVMRFNfSFRPTAotCQl1MzIgdW51c2VkOjIxOwkJLyogYml0cyAxMS0zMSAqLwotCQl1MzIgc2Vydl9jcGxfd3JhcDoxOwkvKiBiaXQgMTAgKi8KLQkJdTMyIHNlcnZfY3BsOjEwOwkJLyogYml0cyAwLTkgKi8KLSNlbHNlCi0JCXUzMiBzZXJ2X2NwbDoxMDsJCS8qIGJpdHMgMC05ICovCi0JCXUzMiBzZXJ2X2NwbF93cmFwOjE7CS8qIGJpdCAxMCAqLwotCQl1MzIgdW51c2VkOjIxOwkJLyogYml0cyAxMS0zMSAqLwotI2VuZGlmCi0JfSBiaXRzOwotfSBUWF9TVEFUVVNfQkxPQ0tfdCwgKlBUWF9TVEFUVVNfQkxPQ0tfdDsKLQotLyogVENCIChUcmFuc21pdCBDb250cm9sIEJsb2NrKSAqLwotdHlwZWRlZiBzdHJ1Y3QgX01QX1RDQiB7Ci0Jc3RydWN0IF9NUF9UQ0IgKk5leHQ7Ci0JdTMyIEZsYWdzOwotCXUzMiBDb3VudDsKLQl1MzIgUGFja2V0U3RhbGVDb3VudDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqUGFja2V0OwotCXUzMiBQYWNrZXRMZW5ndGg7Ci0JdTMyIFdySW5kZXg7Ci0JdTMyIFdySW5kZXhTdGFydDsKLX0gTVBfVENCLCAqUE1QX1RDQjsKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgdGhlIHNrYidzIGluIGEgbGlzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgdHhfc2tiX2xpc3RfZWxlbSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBza2JfbGlzdF9lbGVtOwotCXN0cnVjdCBza19idWZmICpza2I7Ci19IFRYX1NLQl9MSVNUX0VMRU0sICpQVFhfU0tCX0xJU1RfRUxFTTsKLQotLyogVFhfUklOR190IGlzIHNydWN0dXJlIHJlcHJlc2VudGluZyBvdXIgbG9jYWwgcmVmZXJlbmNlKHMpIHRvIHRoZSByaW5nICovCi10eXBlZGVmIHN0cnVjdCBfdHhfcmluZ190IHsKKy8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgb3VyIGxvY2FsIHJlZmVyZW5jZShzKSB0byB0aGUgcmluZyAqLworc3RydWN0IHR4X3JpbmcgewogCS8qIFRDQiAoVHJhbnNtaXQgQ29udHJvbCBCbG9jaykgbWVtb3J5IGFuZCBsaXN0cyAqLwotCVBNUF9UQ0IgTXBUY2JNZW07CisJc3RydWN0IHRjYiAqdGNiX3Jpbmc7CiAKIAkvKiBMaXN0IG9mIFRDQnMgdGhhdCBhcmUgcmVhZHkgdG8gYmUgdXNlZCAqLwotCVBNUF9UQ0IgVENCUmVhZHlRdWV1ZUhlYWQ7Ci0JUE1QX1RDQiBUQ0JSZWFkeVF1ZXVlVGFpbDsKKwlzdHJ1Y3QgdGNiICp0Y2JfcWhlYWQ7CisJc3RydWN0IHRjYiAqdGNiX3F0YWlsOwogCiAJLyogbGlzdCBvZiBUQ0JzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBzZW50LiAgTk9URSB0aGF0IGFjY2VzcyB0byBhbGwKLQkgKiB0aHJlZSBvZiB0aGVzZSAoaW5jbHVkaW5nIG5CdXN5U2VuZCkgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZQorCSAqIHRocmVlIG9mIHRoZXNlIChpbmNsdWRpbmcgdXNlZCkgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZQogCSAqIFRDQlNlbmRRTG9jay4gIFRoaXMgbG9jayBzaG91bGQgYmUgc2VjdXJlZCBwcmlvciB0byBpbmNlbWVudGluZyAvCi0JICogZGVjcmVtZW50aW5nIG5CdXN5U2VuZCwgb3IgYW55IHF1ZXVlIG1hbmlwdWxhdGlvbiBvbiBDdXJyU2VuZEhlYWQgLwotCSAqIFRhaWwKKwkgKiBkZWNyZW1lbnRpbmcgdXNlZCwgb3IgYW55IHF1ZXVlIG1hbmlwdWxhdGlvbiBvbiBzZW5kX2hlYWQgLworCSAqIHRhaWwKIAkgKi8KLQlQTVBfVENCIEN1cnJTZW5kSGVhZDsKLQlQTVBfVENCIEN1cnJTZW5kVGFpbDsKLQlpbnQzMl90IG5CdXN5U2VuZDsKLQotCS8qIExpc3Qgb2YgcGFja2V0cyAobm90IFRDQnMpIHRoYXQgd2VyZSBxdWV1ZWQgZm9yIGxhY2sgb2YgcmVzb3VyY2VzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBTZW5kV2FpdFF1ZXVlOwotCWludDMyX3QgbldhaXRTZW5kOworCXN0cnVjdCB0Y2IgKnNlbmRfaGVhZDsKKwlzdHJ1Y3QgdGNiICpzZW5kX3RhaWw7CisJaW50IHVzZWQ7CiAKIAkvKiBUaGUgYWN0dWFsIGRlc2NyaXB0b3IgcmluZyAqLwotCVBUWF9ERVNDX0VOVFJZX3QgcFR4RGVzY1JpbmdWYTsKLQlkbWFfYWRkcl90IHBUeERlc2NSaW5nUGE7Ci0JdWludDY0X3QgcFR4RGVzY1JpbmdBZGp1c3RlZFBhOwotCXVpbnQ2NF90IFR4RGVzY09mZnNldDsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhfZGVzY19yaW5nOworCWRtYV9hZGRyX3QgdHhfZGVzY19yaW5nX3BhOwogCi0JLyogUmVhZHlUb1NlbmQgaW5kaWNhdGVzIHdoZXJlIHdlIGxhc3Qgd3JvdGUgdG8gaW4gdGhlIGRlc2NyaXB0b3IgcmluZy4gKi8KLQl1MzIgdHhEbWFSZWFkeVRvU2VuZDsKKwkvKiBzZW5kX2lkeCBpbmRpY2F0ZXMgd2hlcmUgd2UgbGFzdCB3cm90ZSB0byBpbiB0aGUgZGVzY3JpcHRvciByaW5nLiAqLworCXUzMiBzZW5kX2lkeDsKIAogCS8qIFRoZSBsb2NhdGlvbiBvZiB0aGUgd3JpdGUtYmFjayBzdGF0dXMgYmxvY2sgKi8KLQlQVFhfU1RBVFVTX0JMT0NLX3QgcFR4U3RhdHVzVmE7Ci0JZG1hX2FkZHJfdCBwVHhTdGF0dXNQYTsKKwl1MzIgKnR4X3N0YXR1czsKKwlkbWFfYWRkcl90IHR4X3N0YXR1c19wYTsKIAotCS8qIEEgQmxvY2sgb2YgemVyb2VzIHVzZWQgdG8gcGFkIHBhY2tldHMgdGhhdCBhcmUgbGVzcyB0aGFuIDYwIGJ5dGVzICovCi0Jdm9pZCAqcFR4RHVtbXlCbGtWYTsKLQlkbWFfYWRkcl90IHBUeER1bW15QmxrUGE7Ci0KLQlUWE1BQ19FUlJfdCBUeE1hY0VycjsKLQotCS8qIFZhcmlhYmxlcyB0byB0cmFjayB0aGUgVHggaW50ZXJydXB0IGNvYWxlc2NpbmcgZmVhdHVyZXMgKi8KLQlpbnQzMl90IFR4UGFja2V0c1NpbmNlTGFzdGludGVycnVwdDsKLX0gVFhfUklOR190LCAqUFRYX1JJTkdfdDsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgZnJhZy1saXN0IGZvciB0aGUgZm9sbG93aW5nIHByb3RvdHlwZXMgKi8KLXR5cGVkZWYgc3RydWN0IF9NUF9GUkFHX0xJU1QgTVBfRlJBR19MSVNULCAqUE1QX0ZSQUdfTElTVDsKKwkvKiBQYWNrZXRzIHNpbmNlIHRoZSBsYXN0IElSUTogdXNlZCBmb3IgaW50ZXJydXB0IGNvYWxlc2NpbmcgKi8KKwlpbnQgc2luY2VfaXJxOworfTsKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSAqLwogc3RydWN0IGV0MTMxeF9hZGFwdGVyOwpAQCAtMjMxLDEyICsxNTMsMTIgQEAKIC8qIFBST1RPVFlQRVMgZm9yIGV0MTMxMF90eC5jICovCiBpbnQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBDb25maWdUeERtYVJlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Cit2b2lkIENvbmZpZ1R4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBldDEzMXhfaW5pdF9zZW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF90eF9kbWFfZGlzYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyKTsKLXZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIGV0MTMxeF9oYW5kbGVfc2VuZF9pbnRlcnJ1cHQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqcEFkYXB0ZXIpOwordm9pZCBldDEzMXhfdHhfZG1hX2Rpc2FibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBldDEzMXhfZnJlZV9idXN5X3NlbmRfcGFja2V0cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGV0MTMxeF9zZW5kX3BhY2tldHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAKICNlbmRpZiAvKiBfX0VUMTMxMF9UWF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaAppbmRleCAxZGZlMDZmLi4zZjdmMzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9hZGFwdGVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfYWRhcHRlci5oCkBAIC0xMDAsMTIgKzEwMCw2IEBACiAjZGVmaW5lIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSICAgICAxNQogI2RlZmluZSBMT19NQVJLX1BFUkNFTlRfRk9SX1JYICAgICAgMTUKIAotLyogTWFjcm9zIHNwZWNpZmljIHRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlICovCi0jZGVmaW5lIE1QX1RDQl9SRVNPVVJDRVNfQVZBSUxBQkxFKF9NKSAoKF9NKS0+VHhSaW5nLm5CdXN5U2VuZCA8IE5VTV9UQ0IpCi0jZGVmaW5lIE1QX1RDQl9SRVNPVVJDRVNfTk9UX0FWQUlMQUJMRShfTSkgKChfTSktPlR4UmluZy5uQnVzeVNlbmQgPj0gTlVNX1RDQikKLQotI2RlZmluZSBNUF9TSE9VTERfRkFJTF9TRU5EKF9NKSAgICgoX00pLT5GbGFncyAmIGZNUF9BREFQVEVSX0ZBSUxfU0VORF9NQVNLKQotCiAvKiBDb3VudGVycyBmb3IgZXJyb3IgcmF0ZSBtb25pdG9yaW5nICovCiB0eXBlZGVmIHN0cnVjdCBfTVBfRVJSX0NPVU5URVJTIHsKIAl1MzIgUGt0Q291bnRUeFBhY2tldHM7CkBAIC0xNjgsNyArMTYyLDcgQEAKIAl1MzIgdHhfZGVmZXJyZWQ7CiAKIAkvKiBSeCBTdGF0aXN0aWNzLiAqLwotCXUzMiByeF9vdl9mbG93OwkvKiBSeCBPdmVyIEZsb3cgKi8KKwl1MzIgcnhfb3ZfZmxvdzsJLyogUnggT3ZlcmZsb3cgKi8KIAogCXUzMiBsZW5ndGhfZXJyOwogCXUzMiBhbGlnbm1lbnRfZXJyOwpAQCAtMjAzLDcgKzE5Nyw2IEBACiAJc3BpbmxvY2tfdCBUQ0JTZW5kUUxvY2s7CiAJc3BpbmxvY2tfdCBUQ0JSZWFkeVFMb2NrOwogCXNwaW5sb2NrX3QgU2VuZEhXTG9jazsKLQlzcGlubG9ja190IFNlbmRXYWl0TG9jazsKIAogCXNwaW5sb2NrX3QgUmN2TG9jazsKIAlzcGlubG9ja190IFJjdlBlbmRMb2NrOwpAQCAtMjIwLDkgKzIxMyw2IEBACiAJdTMyIE1DQWRkcmVzc0NvdW50OwogCXU4IE1DTGlzdFtOSUNfTUFYX01DQVNUX0xJU1RdW0VUSF9BTEVOXTsKIAotCS8qIE1BQyB0ZXN0ICovCi0JVFhNQUNfVFhURVNUX3QgVHhNYWNUZXN0OwotCiAJLyogUG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgUENJIHJlZ2lzdGVyIHNwYWNlICovCiAJQUREUkVTU19NQVBfdCBfX2lvbWVtICpyZWdzOwogCkBAIC0yMzQsOSArMjI0LDYgQEAKIAl1MzIgUmVnaXN0cnlSeE1lbUVuZDsJLyogU2l6ZSBvZiBpbnRlcm5hbCByeCBtZW1vcnkgKi8KIAl1MzIgUmVnaXN0cnlKdW1ib1BhY2tldDsJLyogTWF4IHN1cHBvcnRlZCBldGhlcm5ldCBwYWNrZXQgc2l6ZSAqLwogCi0JLyogVmFsaWRhdGlvbiBoZWxwZXJzICovCi0JdTggUmVnaXN0cnlOTUlEaXNhYmxlOwotCXU4IFJlZ2lzdHJ5UGh5TG9vcGJrOwkvKiBFbmFibGUgUGh5IGxvb3BiYWNrICovCiAKIAkvKiBEZXJpdmVkIGZyb20gdGhlIHJlZ2lzdHJ5OiAqLwogCXU4IEFpRm9yY2VEcHg7CQkvKiBkdXBsZXggc2V0dGluZyAqLwpAQCAtMjQ4LDcgKzIzNSw2IEBACiAJCU5FVElGX1NUQVRVU19NRURJQV9ESVNDT05ORUNULAogCQlORVRJRl9TVEFUVVNfTUFYCiAJfSBNZWRpYVN0YXRlOwotCXU4IERyaXZlck5vUGh5QWNjZXNzOwogCiAJLyogTWluaW1pemUgaW5pdC10aW1lICovCiAJc3RydWN0IHRpbWVyX2xpc3QgRXJyb3JUaW1lcjsKQEAgLTI1OSw3ICsyNDUsNyBAQAogCU1JX0JNU1JfdCBCbXNyOwogCiAJLyogVHggTWVtb3J5IFZhcmlhYmxlcyAqLwotCVRYX1JJTkdfdCBUeFJpbmc7CisJc3RydWN0IHR4X3JpbmcgdHhfcmluZzsKIAogCS8qIFJ4IE1lbW9yeSBWYXJpYWJsZXMgKi8KIAlSWF9SSU5HX3QgUnhSaW5nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oCmluZGV4IGY5OGRjYTUuLmQ4MWZjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9kZWZzLmgKQEAgLTEwMiw3ICsxMDIsNiBAQAogCiAvKiBTb21lIG9mZnNldHMgaW4gUENJIGNvbmZpZyBzcGFjZSB0aGF0IGFyZSBhY3R1YWxseSB1c2VkLiAqLwogI2RlZmluZSBFVDEzMTBfUENJX01BWF9QWUxECQkweDRDCi0jZGVmaW5lIEVUMTMxMF9OTUlfRElTQUJMRQkJMHg2MQogI2RlZmluZSBFVDEzMTBfUENJX01BQ19BRERSRVNTCQkweEE0CiAjZGVmaW5lIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUwkweEIyCiAjZGVmaW5lIEVUMTMxMF9QQ0lfQUNLX05BQ0sJCTB4QzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuYwppbmRleCA5ZGIyMDU2Li4wODkyYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCkBAIC0xMDYsMTcgKzEwNiw2IEBACiAjZGVmaW5lIFBBUk1fU1BFRURfRFVQTEVYX01JTiAgIDAKICNkZWZpbmUgUEFSTV9TUEVFRF9EVVBMRVhfTUFYICAgNQogCi0vKiBNb2R1bGUgcGFyYW1ldGVyIGZvciBkaXNhYmxpbmcgTk1JCi0gKiBldDEzMXhfbm1pX2Rpc2FibGUgOgotICogRGlzYWJsZSBOTUkgKDAtMikgWzBdCi0gKiAgMCA6Ci0gKiAgMSA6Ci0gKiAgMiA6Ci0gKi8KLXN0YXRpYyB1MzIgZXQxMzF4X25taV9kaXNhYmxlOwkvKiAwLTIgKi8KLW1vZHVsZV9wYXJhbShldDEzMXhfbm1pX2Rpc2FibGUsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhldDEzMXhfbm1pX2Rpc2FibGUsICJEaXNhYmxlIE5NSSAoMC0yKSBbMF0iKTsKLQogLyogTW9kdWxlIHBhcmFtZXRlciBmb3IgbWFudWFsIHNwZWVkIHNldHRpbmcKICAqIFNldCBMaW5rIHNwZWVkIGFuZCBkdWJsZXggbWFudWFsbHkgKDAtNSkgIFswXQogICogIDEgOiAxME1iICAgSGFsZi1EdXBsZXgKQEAgLTEzMiwxMjggKzEyMSw4OCBAQAogCQkiU2V0IExpbmsgc3BlZWQgYW5kIGR1YmxleCBtYW51YWxseSAoMC01KSAgWzBdIFxuICAxIDogMTBNYiAgIEhhbGYtRHVwbGV4IFxuICAyIDogMTBNYiAgIEZ1bGwtRHVwbGV4IFxuICAzIDogMTAwTWIgIEhhbGYtRHVwbGV4IFxuICA0IDogMTAwTWIgIEZ1bGwtRHVwbGV4IFxuICA1IDogMTAwME1iIEZ1bGwtRHVwbGV4IFxuIDAgOiBBdXRvIFNwZWVkIEF1dG8gRHVibGV4Iik7CiAKIC8qKgotICogZXQxMzF4X2ZpbmRfYWRhcHRlciAtIEZpbmQgdGhlIGFkYXB0ZXIgYW5kIGdldCBhbGwgdGhlIGFzc2lnbmVkIHJlc291cmNlcworICogZXQxMzF4X2h3YWRkcl9pbml0IC0gc2V0IHVwIHRoZSBNQUMgQWRkcmVzcyBvbiB0aGUgRVQxMzEwCiAgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCiAgKi8KLWludCBldDEzMXhfZmluZF9hZGFwdGVyKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit2b2lkIGV0MTMxeF9od2FkZHJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHJlc3VsdDsKLQl1aW50OF90IGVlcHJvbVN0YXQ7Ci0JdWludDhfdCBtYXhQYXlsb2FkID0gMDsKLQl1aW50OF90IHJlYWRfc2l6ZV9yZWc7Ci0JdTggcmV2OwotCi0JLyogQWxsb3cgZGlzYWJsaW5nIG9mIE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHRzIGluIEkvTyBzcGFjZSwgdG8KLQkgKiBzdXBwb3J0IHZhbGlkYXRpb24uCisJLyogSWYgaGF2ZSBvdXIgZGVmYXVsdCBtYWMgZnJvbSBpbml0IGFuZCBubyBtYWMgYWRkcmVzcyBmcm9tCisJICogRUVQUk9NIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBhbmQgc2V0IGl0IG9uIHRoZQorCSAqIGRldmljZQogCSAqLwotCWlmIChhZGFwdGVyLT5SZWdpc3RyeU5NSURpc2FibGUpIHsKLQkJdWludDhfdCBSZWdpc3RlclZhbDsKLQotCQlSZWdpc3RlclZhbCA9IGluYihFVDEzMTBfTk1JX0RJU0FCTEUpOwotCQlSZWdpc3RlclZhbCAmPSAweGYzOwotCi0JCWlmIChhZGFwdGVyLT5SZWdpc3RyeU5NSURpc2FibGUgPT0gMikKLQkJCVJlZ2lzdGVyVmFsIHw9IDB4YzsKLQotCQlvdXRiKEVUMTMxMF9OTUlfRElTQUJMRSwgUmVnaXN0ZXJWYWwpOwotCX0KLQotCS8qIFdlIGZpcnN0IG5lZWQgdG8gY2hlY2sgdGhlIEVFUFJPTSBTdGF0dXMgY29kZSBsb2NhdGVkIGF0IG9mZnNldAotCSAqIDB4QjIgb2YgY29uZmlnIHNwYWNlCi0JICovCi0JcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLAotCQkJCSAgICAgICZlZXByb21TdGF0KTsKLQotCS8qIFRISVMgSVMgQSBXT1JLQVJPVU5EOgotCSAqIEkgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdHdpY2UgdG8gZ2V0IG15IGNhcmQgaW4gYQotCSAqIExHIE0xIEV4cHJlc3MgRHVhbCBydW5uaW5nLiBJIHRyaWVkIGFsc28gYSBtc2xlZXAgYmVmb3JlIHRoaXMKLQkgKiBmdW5jdGlvbiwgYmVjYXVzZSBJIHRob3VndGggdGhlcmUgY291bGQgYmUgc29tZSB0aW1lIGNvbmRpZGlvbnMKLQkgKiBidXQgaXQgZGlkbid0IHdvcmsuIENhbGwgdGhlIHdob2xlIGZ1bmN0aW9uIHR3aWNlIGFsc28gd29yay4KLQkgKi8KLQlyZXN1bHQgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0VFUFJPTV9TVEFUVVMsCi0JCQkJICAgICAgJmVlcHJvbVN0YXQpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yICIKLQkJCSAgIkVFUFJPTSBTdGF0dXNcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBEZXRlcm1pbmUgaWYgdGhlIGVycm9yKHMpIHdlIGNhcmUgYWJvdXQgYXJlIHByZXNlbnQuICBJZiB0aGV5IGFyZQotCSAqIHByZXNlbnQsIHdlIG5lZWQgdG8gZmFpbC4KLQkgKi8KLQlpZiAoZWVwcm9tU3RhdCAmIDB4NEMpIHsKLQkJcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2KTsKLQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkgICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciAiCi0JCQkJICAiUmV2aXNpb24gSURcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0gZWxzZSBpZiAocmV2ID09IDB4MDEpIHsKLQkJCWludDMyX3Qgbkxvb3A7Ci0JCQl1aW50OF90IHRlbXBbNF0gPSB7IDB4RkUsIDB4MTMsIDB4MTAsIDB4RkYgfTsKLQotCQkJLyogUmUtd3JpdGUgdGhlIGZpcnN0IDQgYnl0ZXMgaWYgd2UgaGF2ZSBhbiBlZXByb20KLQkJCSAqIHByZXNlbnQgYW5kIHRoZSByZXZpc2lvbiBpZCBpcyAxLCB0aGlzIGZpeGVzIHRoZQotCQkJICogY29ycnVwdGlvbiBzZWVuIHdpdGggMTMxMCBCIFNpbGljb24KLQkJCSAqLwotCQkJZm9yIChuTG9vcCA9IDA7IG5Mb29wIDwgMzsgbkxvb3ArKykgewotCQkJCUVlcHJvbVdyaXRlQnl0ZShhZGFwdGVyLCBuTG9vcCwgdGVtcFtuTG9vcF0pOwotCQkJfQotCQl9Ci0KLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmF0YWwgRUVQUk9NIFN0YXR1cyBFcnJvciAtIDB4JTA0eFxuIiwgZWVwcm9tU3RhdCk7Ci0KLQkJLyogVGhpcyBlcnJvciBjb3VsZCBtZWFuIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlCi0JCSAqIGVlcHJvbSBvciB0aGF0IHRoZSBlZXByb20gZG9lc24ndCBleGlzdC4gIFdlIHdpbGwgdHJlYXQKLQkJICogZWFjaCBjYXNlIHRoZSBzYW1lIGFuZCBub3QgdHJ5IHRvIGdhdGhlciBhZGRpdGlvbmFsCi0JCSAqIGluZm9ybWF0aW9uIHRoYXQgbm9ybWFsbHkgd291bGQgY29tZSBmcm9tIHRoZSBlZXByb20sIGxpa2UKLQkJICogTUFDIEFkZHJlc3MKKwlpZiAoYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbMV0gPT0gMHgwMCAmJgorCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzJdID09IDB4MDAgJiYKKwkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1szXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbNF0gPT0gMHgwMCAmJgorCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4MDApIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byByYW5kb21seSBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBzbyB3ZQorCQkgKiBkZWNyZWFzZSBvdXIgY2hhbmNlcyBvZiBzZXR0aW5nIHRoZSBtYWMgYWRkcmVzcyB0bworCQkgKiBzYW1lIGFzIGFub3RoZXIgb25lIG9mIG91ciBjYXJkcyBpbiB0aGUgc3lzdGVtCiAJCSAqLwotCQlhZGFwdGVyLT5oYXNfZWVwcm9tID0gMDsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmYWRhcHRlci0+Q3VycmVudEFkZHJlc3NbNV0sIDEpOworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSByZWdpc3RlciB3ZSBhcmUKKwkJICogd29ya2luZyB3aXRoIHNvIHdlIG5lZWQgdG8gY29weSB0aGUgY3VycmVudAorCQkgKiBhZGRyZXNzIGludG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzCisJCSAqLworCQltZW1jcHkoYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcywKKwkJCWFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJLyogV2UgZG8gbm90IGhhdmUgYW4gb3ZlcnJpZGUgYWRkcmVzcywgc28gc2V0IHRoZQorCQkgKiBjdXJyZW50IGFkZHJlc3MgdG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzIGFuZCBhZGQKKwkJICogaXQgdG8gdGhlIGRldmljZQorCQkgKi8KKwkJbWVtY3B5KGFkYXB0ZXItPkN1cnJlbnRBZGRyZXNzLAorCQkgICAgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcywgRVRIX0FMRU4pOworCX0KK30KKworCisvKioKKyAqIGV0MTMxeF9wY2lfaW5pdAkgLSBpbml0aWFsIFBDSSBzZXR1cAorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBwZGV2OiBvdXIgUENJIGRldmljZQorICoKKyAqIFBlcmZvcm0gdGhlIGluaXRpYWwgc2V0dXAgb2YgUENJIHJlZ2lzdGVycyBhbmQgaWYgcG9zc2libGUgaW5pdGlhbGlzZQorICogdGhlIE1BQyBhZGRyZXNzLiBBdCB0aGlzIHBvaW50IHRoZSBJL08gcmVnaXN0ZXJzIGhhdmUgeWV0IHRvIGJlIG1hcHBlZAorICovCisKK3N0YXRpYyBpbnQgZXQxMzF4X3BjaV9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCXU4IG1heF9wYXlsb2FkOworCXU4IHJlYWRfc2l6ZV9yZWc7CisKKwlpZiAoZXQxMzF4X2luaXRfZWVwcm9tKGFkYXB0ZXIpIDwgMCkKIAkJcmV0dXJuIC1FSU87Ci0JfSBlbHNlCi0JCWFkYXB0ZXItPmhhc19lZXByb20gPSAxOwotCi0JLyogUmVhZCB0aGUgRUVQUk9NIGZvciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgTEVEIGJlaGF2aW9yLiBSZWZlciB0bwotCSAqIEVUMTMxMF9waHkuYywgZXQxMzF4X3hjdnJfaW5pdCgpLCBmb3IgaXRzIHVzZS4KLQkgKi8KLQlFZXByb21SZWFkQnl0ZShhZGFwdGVyLCAweDcwLCAmYWRhcHRlci0+ZWVwcm9tRGF0YVswXSk7Ci0JRWVwcm9tUmVhZEJ5dGUoYWRhcHRlciwgMHg3MSwgJmFkYXB0ZXItPmVlcHJvbURhdGFbMV0pOwotCi0JaWYgKGFkYXB0ZXItPmVlcHJvbURhdGFbMF0gIT0gMHhjZCkKLQkJLyogRGlzYWJsZSBhbGwgb3B0aW9uYWwgZmVhdHVyZXMgKi8KLQkJYWRhcHRlci0+ZWVwcm9tRGF0YVsxXSA9IDB4MDA7CiAKIAkvKiBMZXQncyBzZXQgdXAgdGhlIFBPUlQgTE9HSUMgUmVnaXN0ZXIuICBGaXJzdCB3ZSBuZWVkIHRvIGtub3cgd2hhdAogCSAqIHRoZSBtYXhfcGF5bG9hZF9zaXplIGlzCiAJICovCi0JcmVzdWx0ID0gcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9NQVhfUFlMRCwgJm1heFBheWxvYWQpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTUFYX1BZTEQsICZtYXhfcGF5bG9hZCkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkgICAgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCBQYXlsb2FkIFNpemVcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBQcm9ncmFtIHRoZSBBY2svTmFrIGxhdGVuY3kgYW5kIHJlcGxheSB0aW1lcnMgKi8KLQltYXhQYXlsb2FkICY9IDB4MDc7CS8qIE9ubHkgdGhlIGxvd2VyIDMgYml0cyBhcmUgdmFsaWQgKi8KKwltYXhfcGF5bG9hZCAmPSAweDA3OwkvKiBPbmx5IHRoZSBsb3dlciAzIGJpdHMgYXJlIHZhbGlkICovCiAKLQlpZiAobWF4UGF5bG9hZCA8IDIpIHsKLQkJY29uc3QgdWludDE2X3QgQWNrTmFrWzJdID0geyAweDc2LCAweEQwIH07Ci0JCWNvbnN0IHVpbnQxNl90IFJlcGxheVsyXSA9IHsgMHgxRTAsIDB4MkVEIH07CisJaWYgKG1heF9wYXlsb2FkIDwgMikgeworCQlzdGF0aWMgY29uc3QgdTE2IEFja05ha1syXSA9IHsgMHg3NiwgMHhEMCB9OworCQlzdGF0aWMgY29uc3QgdTE2IFJlcGxheVsyXSA9IHsgMHgxRTAsIDB4MkVEIH07CiAKLQkJcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfQUNLX05BQ0ssCi0JCQkJCSAgICAgICBBY2tOYWtbbWF4UGF5bG9hZF0pOwotCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfQUNLX05BQ0ssCisJCQkJCSAgICAgICBBY2tOYWtbbWF4X3BheWxvYWRdKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIEFDSy9OQUtcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KLQotCQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgRVQxMzEwX1BDSV9SRVBMQVksCi0JCQkJCSAgICAgICBSZXBsYXlbbWF4UGF5bG9hZF0pOwotCQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfUkVQTEFZLAorCQkJCQkgICAgICAgUmVwbGF5W21heF9wYXlsb2FkXSkpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBSZXBsYXkgVGltZXJcbiIpOwogCQkJcmV0dXJuIC1FSU87CkBAIC0yNjMsMTYgKzIxMiwxNCBAQAogCS8qIGwwcyBhbmQgbDEgbGF0ZW5jeSB0aW1lcnMuICBXZSBhcmUgdXNpbmcgZGVmYXVsdCB2YWx1ZXMuCiAJICogUmVwcmVzZW50aW5nIDAwMSBmb3IgTDBzIGFuZCAwMTAgZm9yIEwxCiAJICovCi0JcmVzdWx0ID0gcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTDBMMUxBVEVOQ1ksIDB4MTEpOwotCWlmIChyZXN1bHQgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CisJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0wwTDFMQVRFTkNZLCAweDExKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCSAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBMYXRlbmN5IFRpbWVyc1xuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCS8qIENoYW5nZSB0aGUgbWF4IHJlYWQgc2l6ZSB0byAyayAqLwotCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsICZyZWFkX3NpemVfcmVnKTsKLQlpZiAocmVzdWx0ICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgeworCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDUxLCAmcmVhZF9zaXplX3JlZykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCByZWFkIHNpemVcbiIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI4MSw4ICsyMjgsNyBAQAogCXJlYWRfc2l6ZV9yZWcgJj0gMHg4ZjsKIAlyZWFkX3NpemVfcmVnIHw9IDB4NDA7CiAKLQlyZXN1bHQgPSBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MSwgcmVhZF9zaXplX3JlZyk7Ci0JaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsIHJlYWRfc2l6ZV9yZWcpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJICAgICAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBNYXggcmVhZCBzaXplXG4iKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0yOTEsMTkgKzIzNywxOSBAQAogCS8qIEdldCBNQUMgYWRkcmVzcyBmcm9tIGNvbmZpZyBzcGFjZSBpZiBhbiBlZXByb20gZXhpc3RzLCBvdGhlcndpc2UKIAkgKiB0aGUgTUFDIGFkZHJlc3MgdGhlcmUgd2lsbCBub3QgYmUgdmFsaWQKIAkgKi8KLQlpZiAoYWRhcHRlci0+aGFzX2VlcHJvbSkgewotCQlpbnQgaTsKKwlpZiAoIWFkYXB0ZXItPmhhc19lZXByb20pIHsKKwkJZXQxMzF4X2h3YWRkcl9pbml0KGFkYXB0ZXIpOworCQlyZXR1cm4gMDsKKwl9CiAKLQkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKLQkJCXJlc3VsdCA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKAotCQkJCQlwZGV2LCBFVDEzMTBfUENJX01BQ19BRERSRVNTICsgaSwKLQkJCQkJYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcyArIGkpOwotCQkJaWYgKHJlc3VsdCAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICI7Q291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTUFDIGFkZHJlc3NcbiIpOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX01BQ19BRERSRVNTICsgaSwKKwkJCQkJYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcyArIGkpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBNQUMgYWRkcmVzc1xuIik7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KKwltZW1jcHkoYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgzLDUyICszMjksMzQgQEAKIHsKIAlzdHJ1Y3QgX0dMT0JBTF90IF9faW9tZW0gKnJlZ3MgPSAmZXRkZXYtPnJlZ3MtPmdsb2JhbDsKIAotCWlmIChldGRldi0+UmVnaXN0cnlQaHlMb29wYmsgPT0gZmFsc2UpIHsKLQkJaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgMjA0OCkgewotCQkJLyogVHggLyBSeERNQSBhbmQgVHgvUnggTUFDIGludGVyZmFjZXMgaGF2ZSBhIDFrIHdvcmQKLQkJCSAqIGJsb2NrIG9mIFJBTSB0aGF0IHRoZSBkcml2ZXIgY2FuIHNwbGl0IGJldHdlZW4gVHgKLQkJCSAqIGFuZCBSeCBhcyBpdCBkZXNpcmVzLiAgT3VyIGRlZmF1bHQgaXMgdG8gc3BsaXQgaXQKLQkJCSAqIDUwLzUwOgotCQkJICovCi0JCQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fU0laRSAtIDEsICZyZWdzLT50eHFfZW5kX2FkZHIpOwotCQl9IGVsc2UgaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgODE5MikgewotCQkJLyogRm9yIGp1bWJvIHBhY2tldHMgPiAyayBidXQgPCA4aywgc3BsaXQgNTAtNTAuICovCi0JCQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VULCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VUICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKLQkJCXdyaXRlbChJTlRFUk5BTF9NRU1fU0laRSAtIDEsICZyZWdzLT50eHFfZW5kX2FkZHIpOwotCQl9IGVsc2UgewotCQkJLyogOTIxNiBpcyB0aGUgb25seSBwYWNrZXQgc2l6ZSBncmVhdGVyIHRoYW4gOGsgdGhhdAotCQkJICogaXMgYXZhaWxhYmxlLiBUaGUgVHggYnVmZmVyIGhhcyB0byBiZSBiaWcgZW5vdWdoCi0JCQkgKiBmb3Igb25lIHdob2xlIHBhY2tldCBvbiB0aGUgVHggc2lkZS4gV2UnbGwgbWFrZQotCQkJICogdGhlIFR4IDk0MDgsIGFuZCBnaXZlIHRoZSByZXN0IHRvIFJ4Ci0JCQkgKi8KLQkJCXdyaXRlbCgweDAwMDAsICZyZWdzLT5yeHFfc3RhcnRfYWRkcik7Ci0JCQl3cml0ZWwoMHgwMWIzLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJCXdyaXRlbCgweDAxYjQsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7Ci0JCQl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCZyZWdzLT50eHFfZW5kX2FkZHIpOwotCQl9CisJd3JpdGVsKDAsICZyZWdzLT5yeHFfc3RhcnRfYWRkcik7CisJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnR4cV9lbmRfYWRkcik7CiAKLQkJLyogSW5pdGlhbGl6ZSB0aGUgbG9vcGJhY2sgcmVnaXN0ZXIuIERpc2FibGUgYWxsIGxvb3BiYWNrcy4gKi8KLQkJd3JpdGVsKDAsICZyZWdzLT5sb29wYmFjayk7Ci0JfSBlbHNlIHsKLQkJLyogRm9yIFBIWSBMaW5lIGxvb3BiYWNrLCB0aGUgbWVtb3J5IGlzIGNvbmZpZ3VyZWQgYXMgaWYgVHgKLQkJICogYW5kIFJ4IGJvdGggaGF2ZSBhbGwgdGhlIG1lbW9yeS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKLQkJICogUnhNQUMgd2lsbCB3cml0ZSBkYXRhIGludG8gdGhlIHNwYWNlLCBhbmQgdGhlIFR4TUFDIHdpbGwKLQkJICogcmVhZCBpdCBvdXQuCisJaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgMjA0OCkgeworCQkvKiBUeCAvIFJ4RE1BIGFuZCBUeC9SeCBNQUMgaW50ZXJmYWNlcyBoYXZlIGEgMWsgd29yZAorCQkgKiBibG9jayBvZiBSQU0gdGhhdCB0aGUgZHJpdmVyIGNhbiBzcGxpdCBiZXR3ZWVuIFR4CisJCSAqIGFuZCBSeCBhcyBpdCBkZXNpcmVzLiAgT3VyIGRlZmF1bHQgaXMgdG8gc3BsaXQgaXQKKwkJICogNTAvNTA6CiAJCSAqLwotCQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQkJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7Ci0JCXdyaXRlbCgwLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOwotCQl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCAmcmVncy0+dHhxX2VuZF9hZGRyKTsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBsb29wYmFjayByZWdpc3RlciAoTUFDIGxvb3BiYWNrKS4gKi8KLQkJd3JpdGVsKEVUX0xPT1BfTUFDLCAmcmVncy0+bG9vcGJhY2spOworCQl3cml0ZWwoUEFSTV9SWF9NRU1fRU5EX0RFRiwgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7CisJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKKwl9IGVsc2UgaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgODE5MikgeworCQkvKiBGb3IganVtYm8gcGFja2V0cyA+IDJrIGJ1dCA8IDhrLCBzcGxpdCA1MC01MC4gKi8KKwkJd3JpdGVsKElOVEVSTkFMX01FTV9SWF9PRkZTRVQsICZyZWdzLT5yeHFfZW5kX2FkZHIpOworCQl3cml0ZWwoSU5URVJOQUxfTUVNX1JYX09GRlNFVCArIDEsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7CisJfSBlbHNlIHsKKwkJLyogOTIxNiBpcyB0aGUgb25seSBwYWNrZXQgc2l6ZSBncmVhdGVyIHRoYW4gOGsgdGhhdAorCQkgKiBpcyBhdmFpbGFibGUuIFRoZSBUeCBidWZmZXIgaGFzIHRvIGJlIGJpZyBlbm91Z2gKKwkJICogZm9yIG9uZSB3aG9sZSBwYWNrZXQgb24gdGhlIFR4IHNpZGUuIFdlJ2xsIG1ha2UKKwkJICogdGhlIFR4IDk0MDgsIGFuZCBnaXZlIHRoZSByZXN0IHRvIFJ4CisJCSAqLworCQl3cml0ZWwoMHgwMWIzLCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKKwkJd3JpdGVsKDB4MDFiNCwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKIAl9CiAKKwkvKiBJbml0aWFsaXplIHRoZSBsb29wYmFjayByZWdpc3Rlci4gRGlzYWJsZSBhbGwgbG9vcGJhY2tzLiAqLworCXdyaXRlbCgwLCAmcmVncy0+bG9vcGJhY2spOworCiAJLyogTVNJIFJlZ2lzdGVyICovCiAJd3JpdGVsKDAsICZyZWdzLT5tc2lfY29uZmlnKTsKIApAQCAtNDk4LDU3ICs0MjYsMTggQEAKIH0KIAogLyoqCi0gKiBldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyAtIHNldCB1cCB0aGUgTUFDIEFkZHJlc3Mgb24gdGhlIEVUMTMxMAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogSWYgaGF2ZSBvdXIgZGVmYXVsdCBtYWMgZnJvbSByZWdpc3RyeSBhbmQgbm8gbWFjIGFkZHJlc3MgZnJvbQotCSAqIEVFUFJPTSB0aGVuIHdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGxhc3Qgb2N0ZXQgYW5kIHNldCBpdCBvbiB0aGUKLQkgKiBkZXZpY2UKLQkgKi8KLQlpZiAoYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1swXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbMV0gPT0gMHgwMCAmJgotCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzJdID09IDB4MDAgJiYKLQkgICAgYWRhcHRlci0+UGVybWFuZW50QWRkcmVzc1szXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPlBlcm1hbmVudEFkZHJlc3NbNF0gPT0gMHgwMCAmJgotCSAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4MDApIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0byByYW5kb21seSBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBzbyB3ZQotCQkgKiBkZWNyZWFzZSBvdXIgY2hhbmNlcyBvZiBzZXR0aW5nIHRoZSBtYWMgYWRkcmVzcyB0bwotCQkgKiBzYW1lIGFzIGFub3RoZXIgb25lIG9mIG91ciBjYXJkcyBpbiB0aGUgc3lzdGVtCi0JCSAqLwotCQlnZXRfcmFuZG9tX2J5dGVzKCZhZGFwdGVyLT5DdXJyZW50QWRkcmVzc1s1XSwgMSk7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIHdlIGFyZQotCQkgKiB3b3JraW5nIHdpdGggc28gd2UgbmVlZCB0byBjb3B5IHRoZSBjdXJyZW50Ci0JCSAqIGFkZHJlc3MgaW50byB0aGUgcGVybWFuZW50IGFkZHJlc3MKLQkJICovCi0JCW1lbWNweShhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzLAotCQkJYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQkvKiBXZSBkbyBub3QgaGF2ZSBhbiBvdmVycmlkZSBhZGRyZXNzLCBzbyBzZXQgdGhlCi0JCSAqIGN1cnJlbnQgYWRkcmVzcyB0byB0aGUgcGVybWFuZW50IGFkZHJlc3MgYW5kIGFkZAotCQkgKiBpdCB0byB0aGUgZGV2aWNlCi0JCSAqLwotCQltZW1jcHkoYWRhcHRlci0+Q3VycmVudEFkZHJlc3MsCi0JCSAgICAgICBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzLCBFVEhfQUxFTik7Ci0JfQotfQotCi0vKioKICAqIGV0MTMxeF9zb2Z0X3Jlc2V0IC0gSXNzdWUgYSBzb2Z0IHJlc2V0IHRvIHRoZSBoYXJkd2FyZSwgY29tcGxldGUgZm9yIEVUMTMxMAogICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqLwogdm9pZCBldDEzMXhfc29mdF9yZXNldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJLyogRGlzYWJsZSBNQUMgQ29yZSAqLwotCXdyaXRlbCgweGMwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEudmFsdWUpOworCXdyaXRlbCgweGMwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEpOwogCiAJLyogU2V0IGV2ZXJ5dGhpbmcgdG8gYSByZXNldCB2YWx1ZSAqLwogCXdyaXRlbCgweDdGLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLnN3X3Jlc2V0KTsKLQl3cml0ZWwoMHgwMDBmMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxLnZhbHVlKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxLnZhbHVlKTsKKwl3cml0ZWwoMHgwMDBmMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKIH0KIAogLyoqCkBAIC01ODgsMzYgKzQ3NywzMiBAQAogICovCiBpbnQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzOwogCi0JZG8gewotCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBSaW5nICovCi0JCXN0YXR1cyA9IGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkgICJldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOwotCQkJYnJlYWs7Ci0JCX0KKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBSaW5nICovCisJc3RhdHVzID0gZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgImV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIFJlY2VpdmUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uICovCisJc3RhdHVzID0gZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgImV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jIEZBSUxFRFxuIik7CisJCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJCXJldHVybiBzdGF0dXM7CisJfQogCi0JCS8qIFJlY2VpdmUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0aW9uICovCi0JCXN0YXR1cyA9IGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkgICJldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOwotCQkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSW5pdCByZWNlaXZlIGRhdGEgc3RydWN0dXJlcyAqLwotCQlzdGF0dXMgPSBldDEzMXhfaW5pdF9yZWN2KGFkYXB0ZXIpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkiZXQxMzF4X2luaXRfcmVjdiBGQUlMRURcbiIpOwotCQkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQkJCWV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKDApOworCS8qIEluaXQgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwlzdGF0dXMgPSBldDEzMXhfaW5pdF9yZWN2KGFkYXB0ZXIpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiZXQxMzF4X2luaXRfcmVjdiBGQUlMRURcbiIpOworCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOworCQlldDEzMXhfcnhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOworCX0KIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC02MzIsMjIgKzUxNyw1MCBAQAogCWV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CiB9CiAKKworCiAvKioKLSAqIGV0MTMxeF9jb25maWdfcGFyc2UKKyAqIGV0MTMxeF9hZGFwdGVyX2luaXQKICAqIEBldGRldjogcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdAorICogQHBkZXY6IHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2UKICAqCi0gKiBQYXJzZXMgYSBjb25maWd1cmF0aW9uIGZyb20gc29tZSBsb2NhdGlvbiAobW9kdWxlIHBhcmFtZXRlcnMsIGZvciBleGFtcGxlKQotICogaW50byB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdC4gVGhpcyByZWFsbHkgaGFzIG5vIHNlbnNpYmxlIGFuYWxvZ3kgaW4KLSAqIExpbnV4IGFzIHN5c2ZzIHBhcmFtZXRlcnMgYXJlIGR5bmFtaWMuIFNldmVyYWwgdGhpbmdzIHRoYXQgd2VyZSBoZWUgY291bGQKLSAqIGdvIGludG8gc3lzZnMsIGJ1dCBvdGhlciBzdHVmZiBsaWtlIHNwZWVkIGhhbmRsaW5nIGlzIHBhcnQgb2YgdGhlIG1paQotICogaW50ZXJmYWNlcy9ldGh0b29sLgorICogSW5pdGlhbGl6ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZXQxMzF4X2FkYXB0ZXIgb2JqZWN0IGFuZCBsaW5rCisgKiB0aGVtIHRvZ2V0aGVyIHdpdGggdGhlIHBsYXRmb3JtIHByb3ZpZGVkIGRldmljZSBzdHJ1Y3R1cmVzLgogICovCi12b2lkIGV0MTMxeF9jb25maWdfcGFyc2Uoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKKworCitzdGF0aWMgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldDEzMXhfYWRhcHRlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0YXRpYyBjb25zdCB1OCBkZWZhdWx0X21hY1tdID0geyAweDAwLCAweDA1LCAweDNkLCAweDAwLCAweDAyLCAweDAwIH07CiAJc3RhdGljIGNvbnN0IHU4IGR1cGxleFtdID0geyAwLCAxLCAyLCAxLCAyLCAyIH07CiAJc3RhdGljIGNvbnN0IHUxNiBzcGVlZFtdID0geyAwLCAxMCwgMTAsIDEwMCwgMTAwLCAxMDAwIH07CiAKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2OworCisJLyogU2V0dXAgdGhlIGZ1bmRhbWVudGFsIG5ldF9kZXZpY2UgYW5kIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgZWxlbWVudHMgICovCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qIEFsbG9jYXRlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgYW5kIGNvcHkgaW4gcmVsZXZhbnQgaW5mb3JtYXRpb24gKi8KKwlldGRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJZXRkZXYtPnBkZXYgPSBwY2lfZGV2X2dldChwZGV2KTsKKwlldGRldi0+bmV0ZGV2ID0gbmV0ZGV2OworCisJLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBuZXRkZXYgc3RydWN0ICovCisJbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJbmV0ZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5Mb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlRDQlNlbmRRTG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlNlbmRIV0xvY2spOworCXNwaW5fbG9ja19pbml0KCZldGRldi0+UmN2TG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5SY3ZQZW5kTG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5GYnJMb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXRkZXYtPlBIWUxvY2spOworCisJLyogUGFyc2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgKi8KIAlpZiAoZXQxMzF4X3NwZWVkX3NldCkKIAkJZGV2X2luZm8oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkiU3BlZWQgc2V0IG1hbnVhbGx5IHRvIDogJWQgXG4iLCBldDEzMXhfc3BlZWRfc2V0KTsKQEAgLTY1NSw4ICs1NjgsNiBAQAogCWV0ZGV2LT5TcGVlZER1cGxleCA9IGV0MTMxeF9zcGVlZF9zZXQ7CiAJZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPSAxNTE0OwkvKiAxNTE0LTkyMTYgKi8KIAotCWV0ZGV2LT5SZWdpc3RyeU5NSURpc2FibGUgPSBldDEzMXhfbm1pX2Rpc2FibGU7Ci0KIAkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzIHRvIGEgZGVmYXVsdCAqLwogCW1lbWNweShldGRldi0+Q3VycmVudEFkZHJlc3MsIGRlZmF1bHRfbWFjLCBFVEhfQUxFTik7CiAKQEAgLTY3NCw0MCArNTg1LDEwIEBACiAKIAlldGRldi0+QWlGb3JjZVNwZWVkID0gc3BlZWRbZXRkZXYtPlNwZWVkRHVwbGV4XTsKIAlldGRldi0+QWlGb3JjZURweCA9IGR1cGxleFtldGRldi0+U3BlZWREdXBsZXhdOwkvKiBBdXRvIEZEWCAqLworCisJcmV0dXJuIGV0ZGV2OwogfQogCi0KLS8qKgotICogZXQxMzF4X3BjaV9yZW1vdmUKLSAqIEBwZGV2OiBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCi0gKgotICogUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCi0gKiBQQ0kgc3Vic3lzdGVtIGRldGVjdHMgdGhhdCBhIFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb3JtYXRpb24KLSAqIGNvbnRhaW5lZCBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZSBoYXMgYmVlbiByZW1vdmVkLgotICovCi0KLXZvaWQgX19kZXZleGl0IGV0MTMxeF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOwotCi0JLyogUmV0cmlldmUgdGhlIG5ldF9kZXZpY2UgcG9pbnRlciBmcm9tIHRoZSBwY2lfZGV2IHN0cnVjdCwgYXMgd2VsbAotCSAqIGFzIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0Ci0JICovCi0JbmV0ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCS8qIFBlcmZvcm0gZGV2aWNlIGNsZWFudXAgKi8KLQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwotCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7Ci0JcGNpX2Rldl9wdXQoYWRhcHRlci0+cGRldik7Ci0JZnJlZV9uZXRkZXYobmV0ZGV2KTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLX0KLQotCiAvKioKICAqIGV0MTMxeF9wY2lfc2V0dXAgLSBQZXJmb3JtIGRldmljZSBpbml0aWFsaXphdGlvbgogICogQHBkZXY6IGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKQEAgLTcyMSwzNCArNjAyLDMxIEBACiAgKiBhIGRldmljZSBpbnNlcnRpb24gcm91dGluZS4KICAqLwogCi1pbnQgX19kZXZpbml0IGV0MTMxeF9wY2lfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBldDEzMXhfcGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JaW50IHJlc3VsdCA9IDA7CisJaW50IHJlc3VsdCA9IC1FQlVTWTsKIAlpbnQgcG1fY2FwOwogCWJvb2wgcGNpX3VzaW5nX2RhYzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOwogCiAJLyogRW5hYmxlIHRoZSBkZXZpY2UgdmlhIHRoZSBQQ0kgc3Vic3lzdGVtICovCi0JcmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikgIT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogUGVyZm9ybSBzb21lIGJhc2ljIFBDSSBjaGVja3MgKi8KIAlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkgICJDYW4ndCBmaW5kIFBDSSBkZXZpY2UncyBiYXNlIGFkZHJlc3NcbiIpOwotCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfZGlzYWJsZTsKIAl9CiAKLQlyZXN1bHQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSSVZFUl9OQU1FKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiQ2FuJ3QgZ2V0IFBDSSByZXNvdXJjZXNcbiIpOwogCQlnb3RvIGVycl9kaXNhYmxlOwogCX0KQEAgLTc2MywyNyArNjQxLDI2IEBACiAJICovCiAJcG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKIAlpZiAocG1fY2FwID09IDApIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkgICJDYW5ub3QgZmluZCBQb3dlciBNYW5hZ2VtZW50IGNhcGFiaWxpdGllc1xuIik7CiAJCXJlc3VsdCA9IC1FSU87CiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOwogCX0KIAogCS8qIENoZWNrIHRoZSBETUEgYWRkcmVzc2luZyBzdXBwb3J0IG9mIHRoaXMgZGV2aWNlICovCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKIAkJcGNpX3VzaW5nX2RhYyA9IHRydWU7CiAKLQkJcmVzdWx0ID0KLQkJICAgIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworCQlyZXN1bHQgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAJCWlmIChyZXN1bHQgIT0gMCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSAgIlVuYWJsZSB0byBvYnRhaW4gNjQgYml0IERNQSBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CiAJCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKIAkJfQotCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCkpIHsKKwl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CiAJCXBjaV91c2luZ19kYWMgPSBmYWxzZTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJObyB1c2FibGUgRE1BIGFkZHJlc3NpbmcgbWV0aG9kXG4iKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBlcnJfcmVsZWFzZV9yZXM7CkBAIC03OTIsODcgKzY2OSwyMiBAQAogCS8qIEFsbG9jYXRlIG5ldGRldiBhbmQgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHMgKi8KIAluZXRkZXYgPSBldDEzMXhfZGV2aWNlX2FsbG9jKCk7CiAJaWYgKG5ldGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJDb3VsZG4ndCBhbGxvYyBuZXRkZXYgc3RydWN0XG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2MgbmV0ZGV2IHN0cnVjdFxuIik7CiAJCXJlc3VsdCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOwogCX0KLQotCS8qIFNldHVwIHRoZSBmdW5kYW1lbnRhbCBuZXRfZGV2aWNlIGFuZCBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlIGVsZW1lbnRzICAqLwotCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7Ci0JLyoKLQlpZiAocGNpX3VzaW5nX2RhYykgewotCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKLQl9Ci0JKi8KLQotCS8qCi0JICogTk9URSAtIFR1cm4gdGhpcyBvbiB3aGVuIHdlJ3JlIHJlYWR5IHRvIGRlYWwgd2l0aCBTRy1ETUEKLQkgKgotCSAqIE5PVEU6IEFjY29yZGluZyB0byAiTGludXggRGV2aWNlIERyaXZlcnMiLCAzcmQgZWQsIFJ1YmluaSBldCBhbCwKLQkgKiBpZiBjaGVja3N1bW1pbmcgaXMgbm90IHBlcmZvcm1lZCBpbiBIVywgdGhlbiB0aGUga2VybmVsIHdpbGwgbm90Ci0JICogdXNlIFNHLgotCSAqIEZyb20gcHAgNTEwLTUxMToKLQkgKgotCSAqICJOb3RlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBwZXJmb3JtIHNjYXR0ZXIvZ2F0aGVyIEkvTyB0byB5b3VyCi0JICogZGV2aWNlIGlmIGl0IGRvZXMgbm90IGFsc28gcHJvdmlkZSBzb21lIGZvcm0gb2YgY2hlY2tzdW1taW5nIGFzCi0JICogd2VsbC4gVGhlIHJlYXNvbiBpcyB0aGF0LCBpZiB0aGUga2VybmVsIGhhcyB0byBtYWtlIGEgcGFzcyBvdmVyIGEKLQkgKiBmcmFnbWVudGVkICgibm9ubGluZWFyIikgcGFja2V0IHRvIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0sIGl0Ci0JICogbWlnaHQgYXMgd2VsbCBjb3B5IHRoZSBkYXRhIGFuZCBjb2FsZXNjZSB0aGUgcGFja2V0IGF0IHRoZSBzYW1lCi0JICogdGltZS4iCi0JICoKLQkgKiBUaGlzIGhhcyBiZWVuIHZlcmlmaWVkIGJ5IHNldHRpbmcgdGhlIGZsYWdzIGJlbG93IGFuZCBzdGlsbCBub3QKLQkgKiByZWNlaXZpbmcgYSBzY2F0dGVyZWQgYnVmZmVyIGZyb20gdGhlIG5ldHdvcmsgc3RhY2ssIHNvIGxlYXZlIGl0Ci0JICogb2ZmIHVudGlsIGNoZWNrc3VtcyBhcmUgY2FsY3VsYXRlZCBpbiBIVy4KLQkgKi8KLQkvKiBuZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0c7ICovCi0JLyogbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX05PX0NTVU07ICovCi0JLyogbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7ICovCi0KLQkvKiBBbGxvY2F0ZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0IGFuZCBjb3B5IGluIHJlbGV2YW50IGluZm9ybWF0aW9uICovCi0JYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JYWRhcHRlci0+cGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOwotCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKLQotCS8qIERvIHRoZSBzYW1lIGZvciB0aGUgbmV0ZGV2IHN0cnVjdCAqLwotCW5ldGRldi0+aXJxID0gcGRldi0+aXJxOwotCW5ldGRldi0+YmFzZV9hZGRyID0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0KLQkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPkxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5UQ0JTZW5kUUxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5UQ0JSZWFkeVFMb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+U2VuZEhXTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlNlbmRXYWl0TG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPlJjdkxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5SY3ZQZW5kTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPkZickxvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5QSFlMb2NrKTsKLQotCS8qIFBhcnNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCi0JZXQxMzF4X2NvbmZpZ19wYXJzZShhZGFwdGVyKTsKLQotCS8qIEZpbmQgdGhlIHBoeXNpY2FsIGFkYXB0ZXIKLQkgKgotCSAqIE5PVEU6IFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIE1wRmluZEFkYXB0ZXIoKSByb3V0aW5lOyBjYW4gd2UKLQkgKiAgICAgICBsdW1wIGl0J3MgaW5pdCB3aXRoIHRoZSBkZXZpY2Ugc3BlY2lmaWMgaW5pdCBiZWxvdyBpbnRvIGEKLQkgKiAgICAgICBzaW5nbGUgaW5pdCBmdW5jdGlvbj8KLQkgKi8KLQkvKiB3aGlsZSAoZXQxMzF4X2ZpbmRfYWRhcHRlcihhZGFwdGVyLCBwZGV2KSAhPSAwKTsgKi8KLQlldDEzMXhfZmluZF9hZGFwdGVyKGFkYXB0ZXIsIHBkZXYpOworCWFkYXB0ZXIgPSBldDEzMXhfYWRhcHRlcl9pbml0KG5ldGRldiwgcGRldik7CisJLyogSW5pdGlhbGlzZSB0aGUgUENJIHNldHVwIGZvciB0aGUgZGV2aWNlICovCisJZXQxMzF4X3BjaV9pbml0KGFkYXB0ZXIsIHBkZXYpOwogCiAJLyogTWFwIHRoZSBidXMtcmVsYXRpdmUgcmVnaXN0ZXJzIHRvIHN5c3RlbSB2aXJ0dWFsIG1lbW9yeSAqLwotCi0JYWRhcHRlci0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksCi0JCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWFkYXB0ZXItPnJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CiAJaWYgKGFkYXB0ZXItPnJlZ3MgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnNcbiIpOwogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX2RldjsKIAl9CiAKLQkvKiBQZXJmb3JtIGRldmljZS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBoZXJlIChTZWUgY29kZSBiZWxvdykgKi8KLQogCS8qIElmIFBoeSBDT01BIG1vZGUgd2FzIGVuYWJsZWQgd2hlbiB3ZSB3ZW50IGRvd24sIGRpc2FibGUgaXQgaGVyZS4gKi8KIAl3cml0ZWwoRVRfUE1DU1JfSU5JVCwgICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKIApAQCAtODkyLDIwICs3MDQsMTIgQEAKIAkvKiBJbml0IHNlbmQgZGF0YSBzdHJ1Y3R1cmVzICovCiAJZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKIAotCS8qIFJlZ2lzdGVyIHRoZSBpbnRlcnJ1cHQKLQkgKgotCSAqIE5PVEUgLSBUaGlzIGlzIGJlaW5nIGRvbmUgaW4gdGhlIG9wZW4gcm91dGluZSwgd2hlcmUgbW9zdCBvdGhlcgotCSAqICAgICAgICAgTGludXggZHJpdmVycyBzZXR1cCBJUlEgaGFuZGxlcnMuIE1ha2Ugc3VyZSBkZXZpY2UKLQkgKiAgICAgICAgIGludGVycnVwdHMgYXJlIG5vdCB0dXJuZWQgb24gYmVmb3JlIHRoZSBJUlEgaXMgcmVnaXN0ZXJlZCEhCi0JICoKLQkgKiAgICAgICAgIFdoYXQgd2Ugd2lsbCBkbyBoZXJlIGlzIHNldHVwIHRoZSB0YXNrIHN0cnVjdHVyZSBmb3IgdGhlCi0JICogICAgICAgICBJU1IncyBkZWZlcnJlZCBoYW5kbGVyCisJLyoKKwkgKiBTZXQgdXAgdGhlIHRhc2sgc3RydWN0dXJlIGZvciB0aGUgSVNSJ3MgZGVmZXJyZWQgaGFuZGxlcgogCSAqLwogCUlOSVRfV09SSygmYWRhcHRlci0+dGFzaywgZXQxMzF4X2lzcl9oYW5kbGVyKTsKIAotCS8qIERldGVybWluZSBNQUMgQWRkcmVzcywgYW5kIGNvcHkgaW50byB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KLQlldDEzMXhfc2V0dXBfaGFyZHdhcmVfcHJvcGVydGllcyhhZGFwdGVyKTsKLQorCS8qIENvcHkgYWRkcmVzcyBpbnRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCAqLwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwogCiAJLyogU2V0dXAgZXQxMzEwIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiAqLwpAQCAtOTQ0LDEwICs3NDgsNyBAQAogCSAqIGJlZW4gaW5pdGlhbGl6ZWQsIGp1c3QgaW4gY2FzZSBpdCBuZWVkcyB0byBiZSBxdWlja2x5IHJlc3RvcmVkLgogCSAqLwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZXRkZXYpOwotCiAJcGNpX3NhdmVfc3RhdGUoYWRhcHRlci0+cGRldik7Ci0KLW91dDoKIAlyZXR1cm4gcmVzdWx0OwogCiBlcnJfbWVtX2ZyZWU6CkBAIC05NjEsNyArNzYyLDM3IEBACiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIGVycl9kaXNhYmxlOgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlnb3RvIG91dDsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGV0MTMxeF9wY2lfcmVtb3ZlCisgKiBAcGRldjogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQorICogUENJIHN1YnN5c3RlbSBkZXRlY3RzIHRoYXQgYSBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9ybWF0aW9uCisgKiBjb250YWluZWQgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXQxMzF4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXI7CisKKwkvKiBSZXRyaWV2ZSB0aGUgbmV0X2RldmljZSBwb2ludGVyIGZyb20gdGhlIHBjaV9kZXYgc3RydWN0LCBhcyB3ZWxsCisJICogYXMgdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QKKwkgKi8KKwluZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogUGVyZm9ybSBkZXZpY2UgY2xlYW51cCAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKwlwY2lfZGV2X3B1dChhZGFwdGVyLT5wZGV2KTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXQxMzF4X3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CkBAIC05ODksNyArODIwLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQogICovCi1zdGF0aWMgaW50IGV0MTMxeF9pbml0X21vZHVsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgZXQxMzF4X2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaWYgKGV0MTMxeF9zcGVlZF9zZXQgPCBQQVJNX1NQRUVEX0RVUExFWF9NSU4gfHwKIAkgICAgZXQxMzF4X3NwZWVkX3NldCA+IFBBUk1fU1BFRURfRFVQTEVYX01BWCkgewpAQCAtMTAwMiw3ICs4MzMsNyBAQAogLyoqCiAgKiBldDEzMXhfY2xlYW51cF9tb2R1bGUgLSBUaGUgZW50cnkgcG9pbnQgY2FsbGVkIG9uIGRyaXZlciBjbGVhbnVwCiAgKi8KLXN0YXRpYyB2b2lkIGV0MTMxeF9jbGVhbnVwX21vZHVsZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGV0MTMxeF9jbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZXQxMzF4X2RyaXZlcik7CiB9CkBAIC0xMDEwLDcgKzg0MSw2IEBACiBtb2R1bGVfaW5pdChldDEzMXhfaW5pdF9tb2R1bGUpOwogbW9kdWxlX2V4aXQoZXQxMzF4X2NsZWFudXBfbW9kdWxlKTsKIAotCiAvKiBNb2RpbmZvIHBhcmFtZXRlcnMgKGZpbGxlZCBvdXQgdXNpbmcgZGVmaW5lcyBmcm9tIGV0MTMxeF92ZXJzaW9uLmgpICovCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9JTkZPKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2luaXRwY2kuaAppbmRleCA4MTMxZDZhLi43MjY5NTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5oCkBAIC02Nyw3ICs2Nyw3IEBACiBpbnQgZXQxMzF4X2FkYXB0ZXJfc2V0dXAoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIGludCBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgZXQxMzF4X3NldHVwX2hhcmR3YXJlX3Byb3BlcnRpZXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZXQxMzF4X2h3YWRkcl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGV0MTMxeF9zb2Z0X3Jlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CiAKICNlbmRpZiAvKiBfX0VUMTMxWF9JTklUUENJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaXNyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYwppbmRleCBmODAxODlkLi5mNmQ0NTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pc3IuYwpAQCAtMTA5LDkgKzEwOSw2IEBACiAJZWxzZQogCQltYXNrID0gSU5UX01BU0tfRU5BQkxFX05PX0ZMT1c7CiAKLQlpZiAoYWRhcHRlci0+RHJpdmVyTm9QaHlBY2Nlc3MpCi0JCW1hc2sgfD0gRVRfSU5UUl9QSFk7Ci0KIAlhZGFwdGVyLT5DYWNoZWRNYXNrVmFsdWUgPSBtYXNrOwogCXdyaXRlbChtYXNrLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLmludF9tYXNrKTsKIH0KQEAgLTE4MiwxNSArMTc5LDE1IEBACiAJLyogVGhpcyBpcyBvdXIgaW50ZXJydXB0LCBzbyBwcm9jZXNzIGFjY29yZGluZ2x5ICovCiAKIAlpZiAoc3RhdHVzICYgRVRfSU5UUl9XQVRDSERPRykgewotCQlQTVBfVENCIHBNcFRjYiA9IGFkYXB0ZXItPlR4UmluZy5DdXJyU2VuZEhlYWQ7CisJCXN0cnVjdCB0Y2IgKnRjYiA9IGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9oZWFkOwogCi0JCWlmIChwTXBUY2IpCi0JCQlpZiAoKytwTXBUY2ItPlBhY2tldFN0YWxlQ291bnQgPiAxKQorCQlpZiAodGNiKQorCQkJaWYgKCsrdGNiLT5zdGFsZSA+IDEpCiAJCQkJc3RhdHVzIHw9IEVUX0lOVFJfVFhETUFfSVNSOwogCiAJCWlmIChhZGFwdGVyLT5SeFJpbmcuVW5maW5pc2hlZFJlY2VpdmVzKQogCQkJc3RhdHVzIHw9IEVUX0lOVFJfUlhETUFfWEZSX0RPTkU7Ci0JCWVsc2UgaWYgKHBNcFRjYiA9PSBOVUxMKQorCQllbHNlIGlmICh0Y2IgPT0gTlVMTCkKIAkJCXdyaXRlbCgwLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLndhdGNoZG9nX3RpbWVyKTsKIAogCQlzdGF0dXMgJj0gfkVUX0lOVFJfV0FUQ0hET0c7CkBAIC0yOTAsMTcgKzI4NywxMiBAQAogCQkJCXUzMiBwbV9jc3I7CiAKIAkJCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc2VuZCBhIHBhdXNlIHBhY2tldCB2aWEKLQkJCQkgKiB0aGUgYmFjayBwcmVzc3VyZSByZWdpc3RlcgorCQkJCSAqIHRoZSBiYWNrIHByZXNzdXJlIHJlZ2lzdGVyIChicCByZXEgIGFuZAorCQkJCSAqIGJwIHhvbi94b2ZmKQogCQkJCSAqLwogCQkJCXBtX2NzciA9IHJlYWRsKCZpb21lbS0+Z2xvYmFsLnBtX2Nzcik7Ci0JCQkJaWYgKChwbV9jc3IgJiBFVF9QTV9QSFlfU1dfQ09NQSkgPT0gMCkgewotCQkJCQlUWE1BQ19CUF9DVFJMX3QgYnBfY3RybCA9IHsgMCB9OwotCi0JCQkJCWJwX2N0cmwuYml0cy5icF9yZXEgPSAxOwotCQkJCQlicF9jdHJsLmJpdHMuYnBfeG9ueG9mZiA9IDE7Ci0JCQkJCXdyaXRlbChicF9jdHJsLnZhbHVlLAotCQkJCQkgICAgICAgJmlvbWVtLT50eG1hYy5icF9jdHJsLnZhbHVlKTsKLQkJCQl9CisJCQkJaWYgKChwbV9jc3IgJiBFVF9QTV9QSFlfU1dfQ09NQSkgPT0gMCkKKwkJCQkJd3JpdGVsKDMsICZpb21lbS0+dHhtYWMuYnBfY3RybCk7CiAJCQl9CiAJCX0KIApAQCAtMzQwLDExICszMzIsOSBAQAogCQkJICovCiAJCQkvKiBUUkFQKCk7Ki8KIAotCQkJZXRkZXYtPlR4TWFjVGVzdC52YWx1ZSA9Ci0JCQkJcmVhZGwoJmlvbWVtLT50eG1hYy50eF90ZXN0LnZhbHVlKTsKIAkJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAogCQkJCSAgICAiUnhETUFfRVJSIGludGVycnVwdCwgZXJyb3IgJXhcbiIsCi0JCQkJICAgIGV0ZGV2LT5UeE1hY1Rlc3QudmFsdWUpOworCQkJCSAgICByZWFkbCgmaW9tZW0tPnR4bWFjLnR4X3Rlc3QpKTsKIAkJfQogCiAJCS8qIEhhbmRsZSB0aGUgV2FrZSBvbiBMQU4gRXZlbnQgKi8KQEAgLTQwMCw4ICszOTAsNyBAQAogCiAJCS8qIExldCdzIG1vdmUgb24gdG8gdGhlIFR4TWFjICovCiAJCWlmIChzdGF0dXMgJiBFVF9JTlRSX1RYTUFDKSB7Ci0JCQlldGRldi0+VHhSaW5nLlR4TWFjRXJyLnZhbHVlID0KLQkJCQlyZWFkbCgmaW9tZW0tPnR4bWFjLmVyci52YWx1ZSk7CisJCQl1MzIgZXJyID0gcmVhZGwoJmlvbWVtLT50eG1hYy5lcnIudmFsdWUpOwogCiAJCQkvKgogCQkJICogV2hlbiBhbnkgb2YgdGhlIGVycm9ycyBvY2N1ciBhbmQgVFhNQUMgZ2VuZXJhdGVzCkBAIC00MTUsNyArNDA0LDcgQEAKIAkJCSAqLwogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCiAJCQkJICAgICJUWE1BQyBpbnRlcnJ1cHQsIGVycm9yIDB4JTA4eFxuIiwKLQkJCQkgICAgZXRkZXYtPlR4UmluZy5UeE1hY0Vyci52YWx1ZSk7CisJCQkJICAgIGVycik7CiAKIAkJCS8qIElmIHdlIGFyZSBkZWJ1Z2dpbmcsIHdlIHdhbnQgdG8gc2VlIHRoaXMgZXJyb3IsCiAJCQkgKiBvdGhlcndpc2Ugd2UganVzdCB3YW50IHRoZSBkZXZpY2UgdG8gYmUgcmVzZXQgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jCmluZGV4IDhjNzYxMmYuLjI0ZDk3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X25ldGRldi5jCkBAIC01MTksNyArNTE5LDcgQEAKIHZvaWQgZXQxMzF4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlQTVBfVENCIHBNcFRjYjsKKwlzdHJ1Y3QgdGNiICp0Y2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEp1c3Qgc2tpcCB0aGlzIHBhcnQgaWYgdGhlIGFkYXB0ZXIgaXMgZG9pbmcgbGluayBkZXRlY3Rpb24gKi8KQEAgLTU0MSwyOCArNTQxLDE5IEBACiAJLyogSXMgc2VuZCBzdHVjaz8gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwogCi0JcE1wVGNiID0gZXRkZXYtPlR4UmluZy5DdXJyU2VuZEhlYWQ7CisJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwogCi0JaWYgKHBNcFRjYiAhPSBOVUxMKSB7Ci0JCXBNcFRjYi0+Q291bnQrKzsKKwlpZiAodGNiICE9IE5VTEwpIHsKKwkJdGNiLT5jb3VudCsrOwogCi0JCWlmIChwTXBUY2ItPkNvdW50ID4gTklDX1NFTkRfSEFOR19USFJFU0hPTEQpIHsKLQkJCVRYX0RFU0NfRU5UUllfdCBTdHVja0Rlc2NyaXB0b3JzWzEwXTsKLQotCQkJaWYgKElOREVYMTAocE1wVGNiLT5XckluZGV4KSA+IDcpIHsKLQkJCQltZW1jcHkoU3R1Y2tEZXNjcmlwdG9ycywKLQkJCQkgICAgICAgZXRkZXYtPlR4UmluZy5wVHhEZXNjUmluZ1ZhICsKLQkJCQkgICAgICAgSU5ERVgxMChwTXBUY2ItPldySW5kZXgpIC0gNiwKLQkJCQkgICAgICAgc2l6ZW9mKFRYX0RFU0NfRU5UUllfdCkgKiAxMCk7Ci0JCQl9Ci0KKwkJaWYgKHRjYi0+Y291bnQgPiBOSUNfU0VORF9IQU5HX1RIUkVTSE9MRCkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywKIAkJCQkJICAgICAgIGZsYWdzKTsKIAogCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCQkJIlNlbmQgc3R1Y2sgLSByZXNldC4gIHBNcFRjYi0+V3JJbmRleCAleCwgRmxhZ3MgMHglMDh4XG4iLAotCQkJCXBNcFRjYi0+V3JJbmRleCwKLQkJCQlwTXBUY2ItPkZsYWdzKTsKKwkJCQkiU2VuZCBzdHVjayAtIHJlc2V0LiAgdGNiLT5XckluZGV4ICV4LCBGbGFncyAweCUwOHhcbiIsCisJCQkJdGNiLT5pbmRleCwKKwkJCQl0Y2ItPmZsYWdzKTsKIAogCQkJZXQxMzF4X2Nsb3NlKG5ldGRldik7CiAJCQlldDEzMXhfb3BlbihuZXRkZXYpOwpAQCAtNjIyLDcgKzYxMyw3IEBACiAKIAlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwogCi0JZXQxMzF4X3NldHVwX2hhcmR3YXJlX3Byb3BlcnRpZXMoYWRhcHRlcik7CisJZXQxMzF4X2h3YWRkcl9pbml0KGFkYXB0ZXIpOwogCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4pOwogCiAJLyogSW5pdCB0aGUgZGV2aWNlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLwpAQCAtNzA5LDkgKzcwMCw3IEBACiAKIAlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwogCi0JZXQxMzF4X3NldHVwX2hhcmR3YXJlX3Byb3BlcnRpZXMoYWRhcHRlcik7Ci0JLyogbWVtY3B5KCBuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5DdXJyZW50QWRkcmVzcywgRVRIX0FMRU4gKTsgKi8KLQkvKiBibHV4OiBubywgZG8gbm90IG92ZXJyaWRlIG91ciBuaWNlIGFkZHJlc3MgKi8KKwlldDEzMXhfaHdhZGRyX2luaXQoYWRhcHRlcik7CiAKIAkvKiBJbml0IHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCiAJZXQxMzF4X2FkYXB0ZXJfc2V0dXAoYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfYXBpLmgKaW5kZXggMjUxZTJkMS4uOWViODE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9odl9hcGkuaApAQCAtMzE2LDEzICszMTYsMTMgQEAKIAogLyoKICAqIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVECi0gKiBUaGUgcmVxdWVzdGVkIFZNWCBpbnN0cnVjdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2VzZnVsbHkuCisgKiBUaGUgcmVxdWVzdGVkIFZNWCBpbnN0cnVjdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgogICovCiAjZGVmaW5lIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVECQkoKHUxNikweDEwMTEpCiAKIC8qCiAgKiBIVl9TVEFUVVNfVk1YX0lOU1RSVUNUSU9OX0ZBSUxFRF9XSVRIX1NUQVRVUwotICogVGhlIHJlcXVlc3RlZCBWTVggaW5zdHJ1Y3Rpb24gZmFpbGVkIHRvIGNvbXBsZXRlIHN1Y2Nlc2Z1bGx5IGluZGljYXRpbmcKKyAqIFRoZSByZXF1ZXN0ZWQgVk1YIGluc3RydWN0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkgaW5kaWNhdGluZwogICogc3RhdHVzLgogICovCiAjZGVmaW5lIEhWX1NUQVRVU19WTVhfSU5TVFJVQ1RJT05fRkFJTEVEX1dJVEhfU1RBVFVTCSgodTE2KTB4MTAxMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9kZXZpY2UudHh0IGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQKaW5kZXggNjkxNmNkMy4uNjlkOTU3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2RldmljZS50eHQKQEAgLTEwLDcgKzEwLDcgQEAKIAogc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKIAotVGhlIGZpbGwgaW4gdGhlIGZvbGxvd2luZy4KK1RoZW4gZmlsbCBpbiB0aGUgZm9sbG93aW5nOgogCiBpbmRpb19kZXYtPmRldi5wYXJlbnQKICAgdGhlIHN0cnVjdCBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlLgpAQCAtNDUsNSArNDUsNSBAQAogYmUgcmVnaXN0ZXJlZCBhZnRlcndhcmRzIChvdGhlcndpc2UgdGhlIHdob2xlIHBhcmVudGFnZSBvZiBkZXZpY2VzCiBnZXRzIGNvbmZ1c2VkKQogCi1PbiByZW1vdmUgaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldikgd2lsbCByZW1vdmUgdGhlIGRldmljZSBmcm9tCitPbiByZW1vdmUsIGlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpIHdpbGwgcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbQogdGhlIGNvcmUsIGFuZCBpaW9fZnJlZV9kZXZpY2Ugd2lsbCBjbGVhbiB1cC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vb3ZlcnZpZXcudHh0CmluZGV4IDY0NTg0YWQuLmUzOWRmYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9vdmVydmlldy50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL292ZXJ2aWV3LnR4dApAQCAtMjQsMTEgKzI0LDEyIEBACiAqIEV2ZW50IGNocmRldnMuICBUaGVzZSBhcmUgc2ltaWxhciB0byBpbnB1dCBpbiB0aGF0IHRoZXkgcHJvdmlkZSBhCiByb3V0ZSB0byB1c2VyIHNwYWNlIGZvciBoYXJkd2FyZSB0cmlnZ2VyZWQgZXZlbnRzLiBTdWNoIGV2ZW50cyBpbmNsdWRlCiB0aHJlc2hvbGQgZGV0ZWN0b3JzLCBmcmVlLWZhbGwgZGV0ZWN0b3JzIGFuZCBtb3JlIGNvbXBsZXggYWN0aW9uCi1kZXRlY3Rpb24uICBUaGV5IGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBjdXJyZW50bHkgdmVyeSBzaW1wbGUgd2l0aAorZGV0ZWN0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBjdXJyZW50bHkgdmVyeSBzaW1wbGUgd2l0aAogbWVyZWx5IGFuIGV2ZW50IGNvZGUgYW5kIGEgdGltZXN0YW1wLiAgQW55IGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZQotZXZlbnQgbXVzdCBiZSBhY2Nlc3NlZCB2aWEgcG9sbGluZy4gTm90ZSBhIGdpdmVuIGRldmljZSBtYXkgaGF2ZSBvbmUKLW9yIG1vcmUgZXZlbnQgY2hhbm5lbC4gIFRoZXNlIGV2ZW50cyBhcmUgdHVybmVkIG9uIG9yIG9mZiAoaWYgcG9zc2libGUpCi12aWEgc3lzZnMgaW50ZXJmYWNlcy4KK2V2ZW50IG11c3QgYmUgYWNjZXNzZWQgdmlhIHBvbGxpbmcuCisKK05vdGU6IEEgZ2l2ZW4gZGV2aWNlIG1heSBoYXZlIG9uZSBvciBtb3JlIGV2ZW50IGNoYW5uZWwuICBUaGVzZSBldmVudHMgYXJlCit0dXJuZWQgb24gb3Igb2ZmIChpZiBwb3NzaWJsZSkgdmlhIHN5c2ZzIGludGVyZmFjZXMuCiAKICogSGFyZHdhcmUgcmluZyBidWZmZXIgc3VwcG9ydC4gIFNvbWUgcmVjZW50IHNlbnNvcnMgaGF2ZSBpbmNsdWRlZAogZmlmbyAvIHJpbmcgYnVmZmVycyBvbiB0aGUgc2Vuc29yIGNoaXAuICBUaGVzZSBncmVhdGx5IHJlZHVjZSB0aGUgbG9hZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCmluZGV4IDQ1ODY2NTAuLmFjZTk5ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKQEAgLTgsNyArOCw3IEBACiAJLS0taGVscC0tLQogCSAgVGhlIGluZHVzdHJpYWwgSS9PIHN1YnN5c3RlbSBwcm92aWRlcyBhIHVuaWZpZWQgZnJhbWV3b3JrIGZvcgogCSAgZHJpdmVycyBmb3IgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgZW1iZWRkZWQgc2Vuc29ycyB1c2luZyBhCi0JICBudW1iZXIgb2YgZGlmZmVyZW50IHBoeXNpY2FsIGludGVyZmFjZXMgKGkyYywgc3BpIGV0YykuIFNlZQorCSAgbnVtYmVyIG9mIGRpZmZlcmVudCBwaHlzaWNhbCBpbnRlcmZhY2VzIChpMmMsIHNwaSwgZXRjKS4gU2VlCiAJICBEb2N1bWVudGF0aW9uL2luZHVzdHJpYWxpbyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIGlmIElJTwogCkBAIC0yMywxMCArMjMsMTAgQEAKIGNvbmZpZyBJSU9fU1dfUklORwogCXRyaXN0YXRlICJJbmR1c3RyaWFsIEkvTyBsb2NrIGZyZWUgc29mdHdhcmUgcmluZyIKIAloZWxwCi0JZXhhbXBsZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbi4gIFRoZSBkZXNpZ24gYWltCi0Jb2YgdGhpcyBwYXJ0aWN1bGFyIHJlYWxpemF0aW9uIHdhcyB0byBtaW5pemUgd3JpdGUgbG9ja2luZwotCXdpdGggdGhlIGludGVudGlvbiB0aGF0IHNvbWUgZGV2aWNlcyB3b3VsZCBiZSBhYmxlIHRvIHdyaXRlCi0JaW4gaW50ZXJydXB0IGNvbnRleHQuCisJICBFeGFtcGxlIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uLiAgVGhlIGRlc2lnbiBhaW0KKwkgIG9mIHRoaXMgcGFydGljdWxhciByZWFsaXphdGlvbiB3YXMgdG8gbWluaW1pemUgd3JpdGUgbG9ja2luZworCSAgd2l0aCB0aGUgaW50ZW50aW9uIHRoYXQgc29tZSBkZXZpY2VzIHdvdWxkIGJlIGFibGUgdG8gd3JpdGUKKwkgIGluIGludGVycnVwdCBjb250ZXh0LgogCiBlbmRpZiAjIElJT19SSU5HQlVGRkVSCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZwppbmRleCBmZWYzZGE0Li4zZDNjMzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCkBAIC0xMyw2ICsxMyw4IEBACiBjb25maWcgTElTM0wwMkRRCiAJdHJpc3RhdGUgIlNUIE1pY3JvZWxlY3Ryb25pY3MgTElTM0wwMkRRIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgU1BJIHN1cHBvcnQgZm9yIHRoZSBTVCBtaWNyb2VsZWN0cm9uaWNzCiAJICBhY2NlbGVyb21ldGVyLiBUaGUgZHJpdmVyIHN1cHBsaWVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzIGZpbGVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKaW5kZXggODExZmEwNS4uZDdmYzdmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hY2NlbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaApAQCAtMzEsMTMgKzMxLDEzIEBACiAJSUlPX0RFVklDRV9BVFRSKGFjY2VsX3osIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKIAogLyogVGhyZXNob2xkcyBhcmUgc29tZXdoYXQgY2hpcCBkZXBlbmRlbnQgLSBtYXkgbmVlZCBxdWl0ZSBhIGZldyBkZWZzIGhlcmUgKi8KLS8qIEZvciB1bmlmaWVkIHRoZXNob2xkcyAoc2hhcmVkIGFjcm9zcyBhbGwgZGlyZWN0aW9ucyAqLworLyogRm9yIHVuaWZpZWQgdGhyZXNob2xkcyAoc2hhcmVkIGFjcm9zcyBhbGwgZGlyZWN0aW9ucyAqLwogCiAvKioKICAqIElJT19ERVZfQVRUUl9BQ0NFTF9USFJFU0g6IHVuaWZpZWQgdGhyZXNob2xkCiAgKiBAX21vZGU6IHJlYWQvd3JpdGUKICAqIEBfc2hvdzogcmVhZCBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKLSAqIEBfc3RvcmU6IHdyaXRlIGRldGVjdG9yIHRoZXNob2xkIHZhbHVlCisgKiBAX3N0b3JlOiB3cml0ZSBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKICAqIEBfYWRkcjogZHJpdmVyIHNwZWNpZmljIGRhdGEsIHR5cGljYWxseSBhIHJlZ2lzdGVyIGFkZHJlc3MKICAqCiAgKiBUaGlzIG9uZSBpcyBmb3IgY2FzZXMgd2hlcmUgYXMgc2luZ2xlIHRocmVzaG9sZCBjb3ZlcnMgYWxsIGRpcmVjdGlvbnMKQEAgLTQ4LDcgKzQ4LDcgQEAKIC8qKgogICogSUlPX0RFVl9BVFRSX0FDQ0VMX1RIUkVTSF9YOiBpbmRlcGVuZGFudCBkaXJlY3Rpb24gdGhyZXNob2xkLCB4IGF4aXMKICAqIEBfbW9kZTogcmVhZGFibGUgLyB3cml0YWJsZQotICogQF9zaG93OiByZWFkIHggYXhpcyBkZXRlY3RvciB0aGVzaG9sZCB2YWx1ZQorICogQF9zaG93OiByZWFkIHggYXhpcyBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKICAqIEBfc3RvcmU6IHdyaXRlIHggYXhpcyBkZXRlY3RvciB0aHJlc2hvbGQgdmFsdWUKICAqIEBfYWRkcjogZGV2aWNlIGRyaXZlciBkZXBlbmRhbnQsIHR5cGljYWxseSBhIHJlZ2lzdGVyIGFkZHJlc3MKICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKaW5kZXggMjllMTFkYS4uZGE3ZDNjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKQEAgLTc0LDcgKzc0LDcgQEAKICNkZWZpbmUgU0NBMzAwMF9NRUFTX01PREVfT1BfMgkJCTB4MDIKIAogLyogSW4gbW90aW9uIGRldGVjdGlvbiBtb2RlIHRoZSBhY2NlbGVyYXRpb25zIGFyZSBiYW5kIHBhc3MgZmlsdGVyZWQKLSAqIChhcHJveCAxIC0gMjVIeikgYW5kIHRoZW4gYSBwcm9ncmFtbWFibGUgdGhlc2hvbGQgdXNlZCB0byB0cmlnZ2VyCisgKiAoYXByb3ggMSAtIDI1SHopIGFuZCB0aGVuIGEgcHJvZ3JhbW1hYmxlIHRocmVzaG9sZCB1c2VkIHRvIHRyaWdnZXIKICAqIGFuZCBpbnRlcnJ1cHQuCiAgKi8KICNkZWZpbmUgU0NBMzAwMF9NRUFTX01PREVfTU9UX0RFVAkJMHgwMwpAQCAtMTM5LDcgKzEzOSw3IEBACiAvKiBWYWx1ZXMgb2YgbXVsaXBleGVkIHJlZ2lzdGVycyAod3JpdGUgdG8gY3RybF9kYXRhIGFmdGVyIHNlbGVjdCkgKi8KICNkZWZpbmUgU0NBMzAwMF9SRUdfQUREUl9DVFJMX0RBVEEJCTB4MjIKIAotLyogTWVhc3VybWVudCBtb2RlcyBhdmFpbGFibGUgb24gc29tZSBzY2EzMDAwIHNlcmllcyBjaGlwcy4gQ29kZSBhc3N1bWVzIG90aGVycworLyogTWVhc3VyZW1lbnQgbW9kZXMgYXZhaWxhYmxlIG9uIHNvbWUgc2NhMzAwMCBzZXJpZXMgY2hpcHMuIENvZGUgYXNzdW1lcyBvdGhlcnMKICAqIG1heSBiZWNvbWUgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUuCiAgKgogICogQnlwYXNzIC0gQnlwYXNzIHRoZSBsb3ctcGFzcyBmaWx0ZXIgaW4gdGhlIHNpZ25hbCBjaGFubmVsIHNvIGFzIHRvIGluY3JlYXNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCBlMjdlM2I3Li5jZWRjYWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTcyMCw3ICs3MjAsNyBAQAogc3RhdGljIElJT19ERVZfQVRUUl9URU1QKHNjYTMwMDBfcmVhZF90ZW1wKTsKIAogLyoqCi0gKiBzY2EzMDAwX3Nob3dfdGhyZXNoKCkgc3lzZnMgcXVlcnkgb2YgYSB0aGVzaG9sZAorICogc2NhMzAwMF9zaG93X3RocmVzaCgpIHN5c2ZzIHF1ZXJ5IG9mIGEgdGhyZXNob2xkCiAgKiovCiBzdGF0aWMgc3NpemVfdCBzY2EzMDAwX3Nob3dfdGhyZXNoKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCmluZGV4IGI4YzI4NTguLjM5ODljMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZwpAQCAtNiw4ICs2LDE4IEBACiBjb25maWcgTUFYMTM2MwogCXRyaXN0YXRlICJNQVhJTSBtYXgxMzYzIEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIG1hbnkgTUFYSU0gaTJjIGFuYWxvZyB0byBkaWdpdGFsCiAJICBjb252ZXJ0b3JzIChBREMpLiAobWF4MTM2MSwgbWF4MTM2MiwgbWF4MTM2MywgbWF4MTM2NCwgbWF4MTEzNiwKIAkgIG1heDExMzYsIG1heDExMzcsIG1heDExMzgsIG1heDExMzksIG1heDEyMzYsIG1heDEyMzcsIG1heDExMjM4LAogCSAgbWF4MTIzOSkgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKK2NvbmZpZyBNQVgxMzYzX1JJTkdfQlVGRkVSCisJYm9vbCAiTUFYSU0gbWF4MTM2MzogdXNlIHJpbmcgYnVmZmVyIgorCWRlcGVuZHMgb24gTUFYMTM2MworCXNlbGVjdCBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gaW5jbHVkZSByaW5nIGJ1ZmZlciBzdXBwb3J0IGluIHRoZSBNQVgxMzYzCisJICBBREMgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQppbmRleCAwYzJiNmYzLi4wOGNlZTVjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUKQEAgLTMsNiArMyw2IEBACiAjCiAKIG1heDEzNjMteSA6PSBtYXgxMzYzX2NvcmUubwotbWF4MTM2My0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IG1heDEzNjNfcmluZy5vCittYXgxMzYzLSQoQ09ORklHX01BWDEzNjNfUklOR19CVUZGRVIpICs9IG1heDEzNjNfcmluZy5vCiAKIG9iai0kKENPTkZJR19NQVgxMzYzKSArPSBtYXgxMzYzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaAppbmRleCA4YWNhODFmLi5jMTEyZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2My5oCkBAIC0yMjgsNyArMjI4LDcgQEAKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIJCSp0cmlnOwogCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CiB9OwotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfTUFYMTM2M19SSU5HX0JVRkZFUgogCiBzc2l6ZV90IG1heDEzNjNfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMjM5LDcgKzIzOSw3IEBACiBpbnQgbWF4MTM2M19pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiB2b2lkIG1heDEzNjNfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CiAKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbHNlIC8qIENPTkZJR19NQVgxMzYzX1JJTkdfQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMzYzX3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCiB7CkBAIC0yNjUsNSArMjY1LDUgQEAKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMzYzX3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KSB7fTsKLSNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogQ09ORklHX01BWDEzNjNfUklOR19CVUZGRVIgKi8KICNlbmRpZiAvKiBfTUFYMTM2M19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmgKaW5kZXggOGJjNjRiZi4uZjQyYmFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NocmRldi5oCkBAIC03NSwxMCArNzUsMTIgQEAKICAqIEBjdXJyZW50X2V2ZW50czoJbnVtYmVyIG9mIGV2ZW50cyBpbiBkZXRlY3RlZCBsaXN0CiAgKiBAaWQ6CQkJaW5kZW50aWZpZXIgdG8gYWxsb3cgdGhlIGV2ZW50IGludGVyZmFjZSB0byBrbm93IHdoaWNoCiAgKgkJCXBoeXNpY2FsIGxpbmUgaXQgY29ycmVzcG9uZHMgdG8KKyAqIEBhdHRyOgkJdGhpcyBjaHJkZXYncyBtaW5vciBudW1iZXIgc3lzZnMgYXR0cmlidXRlCiAgKiBAb3duZXI6CQllbnN1cmUgdGhlIGRyaXZlciBtb2R1bGUgb3ducyB0aGUgZmlsZSwgbm90IGlpbwogICogQHByaXZhdGU6CQlkcml2ZXIgc3BlY2lmaWMgZGF0YQogICogQF9uYW1lOgkJdXNlZCBpbnRlcm5hbGx5IHRvIHN0b3JlIHRoZSBzeXNmcyBuYW1lIGZvciBtaW5vciBpZAogICoJCQlhdHRyaWJ1dGUKKyAqIEBfYXR0cm5hbWU6CQl0aGUgZXZlbnQgaW50ZXJmYWNlJ3MgYXR0cmlidXRlIG5hbWUKICAqLwogc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgewogCXN0cnVjdCBkZXZpY2UJCQkJZGV2OwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgKiBAaGFuZGxlcjoJCWV2ZW50IGhhbmRsZXIgZnVuY3Rpb24gLSBjYWxsZWQgb24gZXZlbnQgaWYgdGhpcwogICoJCQlldmVudF9oYW5kbGVyIGlzIGVuYWJsZWQuCiAgKgotICogRWFjaCBkZXZpY2UgaGFzIG9uZSBsaXN0IG9mIHRoZXNlIHBlciBpbnRlcnJ1cHQgbGluZQorICogRWFjaCBkZXZpY2UgaGFzIG9uZSBsaXN0IG9mIHRoZXNlIHBlciBpbnRlcnJ1cHQgbGluZS4KICAqKi8KIHN0cnVjdCBpaW9fZXZlbnRfaGFuZGxlcl9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaAppbmRleCAyNWNjYjgwLi43MWRiZmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvLmgKQEAgLTE2Niw3ICsxNjYsNyBAQAogICogQGJpdDogd2hpY2ggbnVtYmVyIHNjYW4gZWxlbWVudCBpcyB0aGlzCiAgKiovCiBzdGF0aWMgaW5saW5lIGludCBpaW9fc2Nhbl9tYXNrX2NvdW50X3RvX3JpZ2h0KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKLWludCBiaXQpCisJCQkJCQlpbnQgYml0KQogewogCWludCBjb3VudCA9IDA7CiAJaW50IG1hc2sgPSAoMSA8PCBiaXQpOwpAQCAtMjM5LDcgKzIzOSw3IEBACiAgKiBAZGV2X2luZm86CQlJSU8gZGV2aWNlIHN0cnVjdHVyZQogICogQGV2X2xpbmU6CQlXaGljaCBldmVudCBsaW5lIChoYXJkd2FyZSBpbnRlcnJ1cHQpCiAgKiBAZXZfY29kZToJCVdoYXQgZXZlbnQKLSAqIEB0aW1lc3RhbXA6CQlXaGVuIHRoZSBldmVudCBvY2N1cmVkCisgKiBAdGltZXN0YW1wOgkJV2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQKICAqKi8KIGludCBpaW9fcHVzaF9ldmVudChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCiAJCSAgaW50IGV2X2xpbmUsCkBAIC0yNDgsMTEgKzI0OCwxMSBAQAogCiAvKioKICAqIHN0cnVjdCBpaW9fd29ya19jb250IC0gY29udGFpbmVyIGZvciB3aGVuIHNpbmdsZXRvbiBoYW5kbGVyIGNhc2UgbWF0dGVycwotICogQHdzOgkJCVtERVZJQ0Vdd29ya19zdHJ1Y3Qgd2hlbiBub3Qgb25seSBwb3NzaWJsZSBldmVudAotICogQHdzX25vY2hlY2s6CQlbREVWSUNFXXdvcmtfc3RydWN0IHdoZW4gb25seSBwb3NzaWJsZSBldmVudAotICogQGFkZHJlc3M6CQlbREVWSUNFXWFzc29jaWF0ZWQgcmVnaXN0ZXIgYWRkcmVzcwotICogQG1hc2s6CQlbREVWSUNFXWFzc29jaWF0ZWQgbWFzayBmb3IgaWRlbnRpZnlpbmcgZXZlbnQgc291cmNlCi0gKiBAc3Q6CQkJW0RFVklDRV1kZXZpY2Ugc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24KKyAqIEB3czoJCQlbREVWSUNFXSB3b3JrX3N0cnVjdCB3aGVuIG5vdCBvbmx5IHBvc3NpYmxlIGV2ZW50CisgKiBAd3Nfbm9jaGVjazoJCVtERVZJQ0VdIHdvcmtfc3RydWN0IHdoZW4gb25seSBwb3NzaWJsZSBldmVudAorICogQGFkZHJlc3M6CQlbREVWSUNFXSBhc3NvY2lhdGVkIHJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBtYXNrOgkJW0RFVklDRV0gYXNzb2NpYXRlZCBtYXNrIGZvciBpZGVudGlmeWluZyBldmVudCBzb3VyY2UKKyAqIEBzdDoJCQlbREVWSUNFXSBkZXZpY2Ugc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24KICAqKi8KIHN0cnVjdCBpaW9fd29ya19jb250IHsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd3M7CkBAIC0yNzMsOSArMjczLDkgQEAKICAqIEBjb250OiB0aGUgd29yayBjb250YWluZXIKICAqIEBfY2hlY2tmdW5jOiBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgcG9zc2libGUgaW50IHNvdXJjZXMKICAqIEBfbm9jaGVja2Z1bmM6IGZ1bmN0aW9uIGZvciB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGludCBzb3VyY2UKLSAqIEBfYWRkOiBkcml2ZXIgZGVwZW5kYW50LCB0eXBpY2FsbHkgYSByZWdpc3RlciBhZGRyZXNzCi0gKiBAX21hc2s6IGRyaXZlciBkZXBlbmRhbnQsIHR5cGljYWxseSBhIGJpdCBtYXNrIGZvciBhIHJlZ2lzdGVyCi0gKiBAX3N0OiBkcml2ZXIgZGVwZW5kYW50LCB0eXBpY2FsbHkgcG9pbnRlciB0byBhIGRldmljZSBzdGF0ZSBzdHJ1Y3R1cmUKKyAqIEBfYWRkOiBkcml2ZXIgZGVwZW5kZW50LCB0eXBpY2FsbHkgYSByZWdpc3RlciBhZGRyZXNzCisgKiBAX21hc2s6IGRyaXZlciBkZXBlbmRlbnQsIHR5cGljYWxseSBhIGJpdCBtYXNrIGZvciBhIHJlZ2lzdGVyCisgKiBAX3N0OiBkcml2ZXIgZGVwZW5kZW50LCB0eXBpY2FsbHkgcG9pbnRlciB0byBhIGRldmljZSBzdGF0ZSBzdHJ1Y3R1cmUKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAogaWlvX2luaXRfd29ya19jb250KHN0cnVjdCBpaW9fd29ya19jb250ICpjb250LApAQCAtMjkwLDcgKzI5MCw3IEBACiAJY29udC0+c3QgPSBfc3Q7CiB9CiAvKioKLSAqIF9faWlvX3B1c2hfZXZlbnQoKSB0cmllcyB0byBhZGQgYW4gZXZlbnQgdG8gdGhlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIGEgY2hyZGV2CisgKiBfX2lpb19wdXNoX2V2ZW50KCkgLSB0cmllcyB0byBhZGQgYW4gZXZlbnQgdG8gdGhlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIGEgY2hyZGV2CiAgKiBAZXZfaW50OgkJdGhlIGV2ZW50IGludGVyZmFjZSB0byB3aGljaCB3ZSBhcmUgcHVzaGluZyB0aGUgZXZlbnQKICAqIEBldl9jb2RlOgkJdGhlIG91dGdvaW5nIGV2ZW50IGNvZGUKICAqIEB0aW1lc3RhbXA6CQl0aW1lc3RhbXAgb2YgdGhlIGV2ZW50CkBAIC0zMDIsOCArMzAyLDggQEAKIAkJICAgIHN0cnVjdCBpaW9fc2hhcmVkX2V2X3BvaW50ZXIqCiAJCSAgICBzaGFyZWRfcG9pbnRlcl9wKTsKIC8qKgotICogX19paW9fY2hhbmdlX2V2ZW50KCkgY2hhbmdlIGFuIGV2ZW50IGNvZGUgaW4gY2FzZSBvZiBldmVudCBlc2NhbGxhdGlvbgotICogQGV2OgkJCXRoZSBldm5ldCB0byBiZSBjaGFuZ2VkCisgKiBfX2lpb19jaGFuZ2VfZXZlbnQoKSAtIGNoYW5nZSBhbiBldmVudCBjb2RlIGluIGNhc2Ugb2YgZXZlbnQgZXNjYWxhdGlvbgorICogQGV2OgkJCXRoZSBldmVudCB0byBiZSBjaGFuZ2VkCiAgKiBAZXZfY29kZToJCW5ldyBldmVudCBjb2RlCiAgKiBAdGltZXN0YW1wOgkJbmV3IHRpbWVzdGFtcAogICoqLwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCQlzNjQgdGltZXN0YW1wKTsKIAogLyoqCi0gKiBpaW9fc2V0dXBfZXZfaW50KCkgQ29uZmlndXJlIGFuIGV2ZW50IGludGVyZmFjZSAoY2hyZGV2KQorICogaWlvX3NldHVwX2V2X2ludCgpIC0gY29uZmlndXJlIGFuIGV2ZW50IGludGVyZmFjZSAoY2hyZGV2KQogICogQG5hbWU6CQluYW1lIHVzZWQgZm9yIHJlc3VsdGluZyBzeXNmcyBkaXJlY3RvcnkgZXRjLgogICogQGV2X2ludDoJCWludGVyZmFjZSB3ZSBhcmUgY29uZmlndXJpbmcKICAqIEBvd25lcjoJCW1vZHVsZSB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGlzIGV2X2ludApAQCAtMzQzLDcgKzM0Myw3IEBACiBleHRlcm4gc3RydWN0IGNsYXNzIGlpb19jbGFzczsKIAogLyoqCi0gKiBpaW9fcHV0X2RldmljZSgpIC0gcmVmZXJlbmNlIGNvdW50ZWQgZGVhbGxvY2F0ZWQgb2Ygc3RydWN0IGRldmljZQorICogaWlvX3B1dF9kZXZpY2UoKSAtIHJlZmVyZW5jZSBjb3VudGVkIGRlYWxsb2NhdGlvbiBvZiBzdHJ1Y3QgZGV2aWNlCiAgKiBAZGV2OiB0aGUgaWlvX2RldmljZSBjb250YWluaW5nIHRoZSBkZXZpY2UKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpaW9fcHV0X2RldmljZShzdHJ1Y3QgaWlvX2RldiAqZGV2KQpAQCAtMzUzLDcgKzM1Myw3IEBACiB9OwogCiAvKioKLSAqIHRvX2lpb19kZXYoKSAtIGdldCBpaW9fZGV2IGZvciB3aGljaCB3ZSBoYXZlIGhhdmUgdGhlIHN0cnVjdCBkZXZpY2UKKyAqIHRvX2lpb19kZXYoKSAtIGdldCBpaW9fZGV2IGZvciB3aGljaCB3ZSBoYXZlIHRoZSBzdHJ1Y3QgZGV2aWNlCiAgKiBAZDogdGhlIHN0cnVjdCBkZXZpY2UKICAqKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlpb19kZXYgKnRvX2lpb19kZXYoc3RydWN0IGRldmljZSAqZCkKQEAgLTM3Nyw2ICszNzcsNyBAQAogCiAvKioKICAqIGlpb19mcmVlX2RldmljZSgpIC0gZnJlZSBhbiBpaW9fZGV2IGZyb20gYSBkcml2ZXIKKyAqIEBkZXY6IHRoZSBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCiAgKiovCiB2b2lkIGlpb19mcmVlX2RldmljZShzdHJ1Y3QgaWlvX2RldiAqZGV2KTsKIApAQCAtMzk1LDcgKzM5Niw4IEBACiB2b2lkIGlpb19kZXZpY2VfZnJlZV9jaHJkZXZfbWlub3IoaW50IHZhbCk7CiAKIC8qKgotICogaWlvX3JpbmdfZW5hYmxlZCgpIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IGlmIGFueSBmb3JtIG9mIHJpbmcgZW5hYmxlZAorICogaWlvX3JpbmdfZW5hYmxlZCgpIC0gaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3QgaWYgYW55IGZvcm0gb2YgcmluZyBpcyBlbmFibGVkCisgKiBAZGV2X2luZm86CQlJSU8gZGV2aWNlIGluZm8gc3RydWN0dXJlIGZvciBkZXZpY2UKICAqKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBpaW9fcmluZ19lbmFibGVkKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZwppbmRleCAxMmFmMGM0Li44MGNiNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9LY29uZmlnCkBAIC0zLDExICszLDEzIEBACiAjCiBjb21tZW50ICJMaWdodCBzZW5zb3JzIgogCi1jb25maWcgVFNMMjU2MQotICAgICAgIHRyaXN0YXRlICJUQU9TIFRTTDI1NjEgbGlnaHQtdG8tZGlnaXRhbCBjb252ZXJ0b3IiCi0gICAgICAgZGVwZW5kcyBvbiBJMkMKLSAgICAgICBoZWxwCi0JU2F5IHllcyBiZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBUQU9TIGxpZ2h0IHRvIGRpZ2l0YWwKLQljb252ZXJ0b3IuICBUaGlzIGNoaXAgaGFzIHR3byBsaWdodCBzZW5zb3JzLiBPbmUgaXMgYnJvYWRiYW5kCi0JaW5jbHVkaW5nIGluZnJhcmVkIHdoaWxzdCB0aGUgb3RoZXIgbWVhc3VyZXMgb25seSBpbmZyYXJlZC4KLQlQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KK2NvbmZpZyBTRU5TT1JTX1RTTDI1NjMKKwl0cmlzdGF0ZSAiVEFPUyBUU0wyNTZbMC0zXSBhbWJpZW50IGxpZ2h0IHNlbnNvciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUYW9zIFRTTDI1NjAsCisJIFRTTDI1NjEsIFRTTDI1NjIgYW5kIFRTTDI1NjMgYW1iaWVudCBsaWdodCBzZW5zb3JzLgorCisJIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgd2lsbCBiZSBjYWxsZWQgdHNsMjU2My4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvTWFrZWZpbGUKaW5kZXggY2NmZjE1MS4uMzBmMzMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gTGlnaHQgc2Vuc29ycwogIwogCi1vYmotJChDT05GSUdfVFNMMjU2MSkgICArPSB0c2wyNTYxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1RTTDI1NjMpCSs9IHRzbDI1NjMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyMTA3Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjEuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogIHRzbDI1NjEuYyAtIExpbnV4IGtlcm5lbCBtb2R1bGVzIGZvciBsaWdodCB0byBkaWdpdGFsIGNvbnZlcnRvcgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BjYW0uYWMudWs+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiAgU29tZSBwb3J0aW9ucyBiYXNlZCB1cG9uIHRoZSB0c2wyNTUwIGRyaXZlci4KLSAqCi0gKiAgVGhpcyBkcml2ZXIgY291bGQgcHJvYmFibHkgYmUgYWRhcHRlZCBlYXNpbHkgdG8gdGFsayB0byB0aGUgdHNsMjU2MCAoc21idXMpCi0gKgotICogIE5lZWRzIHNvbWUgd29yayB0byBzdXBwb3J0IHRoZSBldmVudHMgdGhpcyBjYW4gZ2VuZXJhdGUuCi0gKiAgVG9kbzogSW1wbGVtZW50IGludGVycnVwdCBoYW5kbGluZy4gIEN1cnJlbnRseSBhIGhhcmR3YXJlIGJ1ZyBtZWFucwotICogIHRoaXMgaXNuJ3QgYXZhaWxhYmxlIG9uIG15IHRlc3QgYm9hcmQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0KLSNkZWZpbmUgVFNMMjU2MV9DT05UUk9MX1JFR0lTVEVSIDB4MDAKLSNkZWZpbmUgVFNMMjU2MV9USU1JTkdfUkVHSVNURVIgMHgwMQotI2RlZmluZSBUU0wyNTYxX1RIUkVTSExPV19MT1dfUkVHSVNURVIgMHgwMgotI2RlZmluZSBUU0wyNTYxX1RIUkVTSExPV19ISUdIX1JFR0lTVEVSIDB4MDMKLSNkZWZpbmUgVFNMMjU2MV9USFJFU0hISUdIX0xPV19SRUdJU1RFUiAweDA0Ci0jZGVmaW5lIFRTTDI1NjFfVEhSRVNISElHSF9ISUdIX1JFR0lTVEVSIDB4MDUKLSNkZWZpbmUgVFNMMjU2MV9JTlRfQ09OVFJPTF9SRUdJU1RFUiAweDA2Ci0KLSNkZWZpbmUgVFNMMjU2MV9JTlRfUkVHX0lOVF9PRkYgMHgwMAotI2RlZmluZSBUU0wyNTYxX0lOVF9SRUdfSU5UX0xFVkVMIDB4MDgKLSNkZWZpbmUgVFNMMjU2MV9JTlRfUkVHX0lOVF9TTUJVUyAweDEwCi0jZGVmaW5lIFRTTDI1NjFfSU5UX1JFR19JTlRfVEVTVCAweDE4Ci0KLSNkZWZpbmUgVFNMMjU2MV9JRF9SRUdJU1RFUiAweDBBCi0KLSNkZWZpbmUgVFNMMjU2MV9EQVRBXzBfTE9XIDB4MEMKLSNkZWZpbmUgVFNMMjU2MV9EQVRBXzFfTE9XIDB4MEUKLQotLyogQ29udHJvbCBSZWdpc3RlciBWYWx1ZXMgKi8KLSNkZWZpbmUgVFNMMjU2MV9DT05UX1JFR19QV1JfT04gMHgwMwotI2RlZmluZSBUU0wyNTYxX0NPTlRfUkVHX1BXUl9PRkYgMHgwMAotCi0vKioKLSAqIHN0cnVjdCB0c2wyNTYxX3N0YXRlIC0gZGV2aWNlIHNwZWNpZmljIHN0YXRlCi0gKiBAaW5kaW9fZGV2OgkJdGhlIGluZHVzdHJpYWxpbyBJL08gaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjbGllbnQ6CQlpMmMgY2xpZW50Ci0gKiBAY29tbWFuZF9idWY6CXNpbmdsZSBjb21tYW5kIGJ1ZmZlciB1c2VkIGZvciBhbGwgb3BlcmF0aW9ucwotICogQGNvbW1hbmRfYnVmX2xvY2s6CWVuc3VyZSB1bmlxdWUgYWNjZXNzIHRvIGNvbW1hbmRfYnVmCi0gKi8KLXN0cnVjdCB0c2wyNTYxX3N0YXRlIHsKLQlzdHJ1Y3QgaWlvX2RldgkJKmluZGlvX2RldjsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwotCXN0cnVjdCB0c2wyNTYxX2NvbW1hbmQJKmNvbW1hbmRfYnVmOwotCXN0cnVjdCBtdXRleAkJY29tbWFuZF9idWZfbG9jazsKLX07Ci0KLS8qKgotICogc3RydWN0IHRzbDI1NjFfY29tbWFuZCAtIGNvbW1hbmQgYnl0ZSBmb3Igc21idXMKLSAqIEBhZGRyZXNzOglyZWdpc3RlciBhZGRyZXNzCi0gKiBAYmxvY2s6CWlzIHRoaXMgYSBibG9jayByL3cKLSAqIEB3b3JkOglpcyB0aGlzIGEgd29yZCByL3cKLSAqIEBjbGVhcjoJc2V0IHRvIDEgdG8gY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQKLSAqIEBjbWQ6CXNlbGVjdCB0aGUgY29tbWFuZCByZWdpc3RlciAtIGFsd2F5cyAxLgotICovCi1zdHJ1Y3QgdHNsMjU2MV9jb21tYW5kIHsKLQl1bnNpZ25lZCBpbnQgYWRkcmVzczo0OwotCXVuc2lnbmVkIGludCBibG9jazoxOwotCXVuc2lnbmVkIGludCB3b3JkOjE7Ci0JdW5zaWduZWQgaW50IGNsZWFyOjE7Ci0JdW5zaWduZWQgaW50IGNtZDoxOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHRzbDI1NjFfaW5pdF9jb21tYW5kX2J1ZihzdHJ1Y3QgdHNsMjU2MV9jb21tYW5kICpidWYpCi17Ci0JYnVmLT5hZGRyZXNzID0gMDsKLQlidWYtPmJsb2NrID0gMDsKLQlidWYtPndvcmQgPSAwOwotCWJ1Zi0+Y2xlYXIgPSAwOwotCWJ1Zi0+Y21kID0gMTsKLX0KLQotc3RhdGljIHNzaXplX3QgdHNsMjU2MV9yZWFkX3ZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQotewotCWludCByZXQgPSAwLCBkYXRhOwotCXNzaXplX3QgbGVuID0gMDsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTYxX3N0YXRlICpzdCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7Ci0KLQltdXRleF9sb2NrKCZzdC0+Y29tbWFuZF9idWZfbG9jayk7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5jbWQgPSAxOwotCXN0LT5jb21tYW5kX2J1Zi0+d29yZCA9IDE7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5hZGRyZXNzID0gdGhpc19hdHRyLT5hZGRyZXNzOwotCi0JZGF0YSA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShzdC0+Y2xpZW50LCAqKGNoYXIgKikoc3QtPmNvbW1hbmRfYnVmKSk7Ci0JaWYgKGRhdGEgPCAwKSB7Ci0JCXJldCA9IGRhdGE7Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhKTsKLQotZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9MSUdIVF9JTkZSQVJFRCgwLCB0c2wyNTYxX3JlYWRfdmFsLCBUU0wyNTYxX0RBVEFfMF9MT1cpOwotc3RhdGljIElJT19ERVZfQVRUUl9MSUdIVF9CUk9BRCgwLCB0c2wyNTYxX3JlYWRfdmFsLCBUU0wyNTYxX0RBVEFfMV9MT1cpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdHNsMjU2MV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9saWdodF9pbmZyYXJlZDAuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2xpZ2h0X2Jyb2Fkc3BlY3RydW0wLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRzbDI1NjFfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IHRzbDI1NjFfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBpbnQgdHNsMjU2MV9pbml0aWFsaXplKHN0cnVjdCB0c2wyNTYxX3N0YXRlICpzdCkKLXsKLQlpbnQgZXJyOwotCi0JbXV0ZXhfbG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCXN0LT5jb21tYW5kX2J1Zi0+d29yZCA9IDA7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5ibG9jayA9IDA7Ci0Jc3QtPmNvbW1hbmRfYnVmLT5hZGRyZXNzID0gVFNMMjU2MV9DT05UUk9MX1JFR0lTVEVSOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3QtPmNsaWVudCwgKihjaGFyICopKHN0LT5jb21tYW5kX2J1ZiksCi0JCQkJCVRTTDI1NjFfQ09OVF9SRUdfUFdSX09OKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycm9yX3JldDsKLQotCXN0LT5jb21tYW5kX2J1Zi0+YWRkcmVzcyA9IFRTTDI1NjFfSU5UX0NPTlRST0xfUkVHSVNURVI7Ci0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzdC0+Y2xpZW50LCAqKGNoYXIgKikoc3QtPmNvbW1hbmRfYnVmKSwKLQkJCQkJVFNMMjU2MV9JTlRfUkVHX0lOVF9URVNUKTsKLQotZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCB0c2wyNTYxX3Bvd2VyZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHRzbDI1NjFfY29tbWFuZCBDb21tYW5kID0gewotCQkuY21kID0gIDEsCi0JCS5jbGVhciA9IDAsCi0JCS53b3JkID0gMCwKLQkJLmJsb2NrID0gMCwKLQkJLmFkZHJlc3MgPSBUU0wyNTYxX0NPTlRST0xfUkVHSVNURVIsCi0JfTsKLQotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCAqKGNoYXIgKikoJkNvbW1hbmQpLAotCQkJCQlUU0wyNTYxX0NPTlRfUkVHX1BXUl9PRkYpOwotCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwotfQotc3RhdGljIGludCBfX2RldmluaXQgdHNsMjU2MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmV0ID0gMCwgcmVnZG9uZSA9IDA7Ci0Jc3RydWN0IHRzbDI1NjFfc3RhdGUgKnN0ID0ga3phbGxvYyhzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoc3QgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3QpOwotCXN0LT5jbGllbnQgPSBjbGllbnQ7Ci0JbXV0ZXhfaW5pdCgmc3QtPmNvbW1hbmRfYnVmX2xvY2spOwotCi0Jc3QtPmNvbW1hbmRfYnVmID0ga21hbGxvYyhzaXplb2YoKnN0LT5jb21tYW5kX2J1ZiksIEdGUF9LRVJORUwpOwotCWlmIChzdC0+Y29tbWFuZF9idWYgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2ZyZWVfc3RhdGU7Ci0JfQotCXRzbDI1NjFfaW5pdF9jb21tYW5kX2J1ZihzdC0+Y29tbWFuZF9idWYpOwotCi0Jc3QtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKLQlpZiAoc3QtPmluZGlvX2RldiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZnJlZV9jb21tYW5kX2J1ZjsKLQl9Ci0Jc3QtPmluZGlvX2Rldi0+YXR0cnMgPSAmdHNsMjU2MV9hdHRyaWJ1dGVfZ3JvdXA7Ci0Jc3QtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQlzdC0+aW5kaW9fZGV2LT5kZXZfZGF0YSA9ICh2b2lkICopKHN0KTsKLQlzdC0+aW5kaW9fZGV2LT5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEU7Ci0Jc3QtPmluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9paW9kZXY7Ci0JcmVnZG9uZSA9IDE7Ci0JLyogSW50aWFsaXplIHRoZSBjaGlwICovCi0JcmV0ID0gdHNsMjU2MV9pbml0aWFsaXplKHN0KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfaWlvZGV2OwotCi0JcmV0dXJuIDA7Ci1lcnJvcl91bnJlZ2lzdGVyX2lpb2RldjoKLWVycm9yX2ZyZWVfaWlvZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3QtPmluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2Uoc3QtPmluZGlvX2Rldik7Ci1lcnJvcl9mcmVlX2NvbW1hbmRfYnVmOgotCWtmcmVlKHN0LT5jb21tYW5kX2J1Zik7Ci1lcnJvcl9mcmVlX3N0YXRlOgotCWtmcmVlKHN0KTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotCi19Ci0KLXN0YXRpYyBpbnQgX19kZXZleGl0IHRzbDI1NjFfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHRzbDI1NjFfc3RhdGUgKnN0ID0gIGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0LT5pbmRpb19kZXYpOwotCWtmcmVlKHN0KTsKLQotCXJldHVybiB0c2wyNTYxX3Bvd2VyZG93bihjbGllbnQpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHNsMjU2MV9pZFtdID0gewotCXsgInRzbDI1NjEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzbDI1NjFfaWQpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0c2wyNTYxX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ0c2wyNTYxIiwKLQl9LAotCS5wcm9iZSA9IHRzbDI1NjFfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRzbDI1NjFfcmVtb3ZlKSwKLQkuaWRfdGFibGUgID0gdHNsMjU2MV9pZCwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IHRzbDI1NjFfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdHNsMjU2MV9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQodHNsMjU2MV9pbml0KTsKLQotc3RhdGljIF9fZXhpdCB2b2lkIHRzbDI1NjFfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZ0c2wyNTYxX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdCh0c2wyNTYxX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BjYW0uYWMudWs+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlRTTDI1NjEgbGlnaHQgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGI5NDMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmMKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBkcml2ZXJzL2kyYy9jaGlwcy90c2wyNTYzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFRpbW8gTy4gS2FyamFsYWluZW4gPHRpbW8uby5rYXJqYWxhaW5lbkBub2tpYS5jb20+CisgKiBDb250YWN0OiBBbWl0IEt1Y2hlcmlhIDxhbWl0Lmt1Y2hlcmlhQHZlcmR1cmVudC5jb20+CisgKgorICogQ29udmVydGVkIHRvIElJTyBkcml2ZXIKKyAqIEFtaXQgS3VjaGVyaWEgPGFtaXQua3VjaGVyaWFAdmVyZHVyZW50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgInRzbDI1NjMuaCIKKworLyogVXNlIHRoaXMgbWFueSBiaXRzIGZvciBmcmFjdGlvbiBwYXJ0LiAqLworI2RlZmluZSBBRENfRlJBQ19CSVRTCQkoMTQpCisKKy8qIEdpdmVuIG51bWJlciBvZiAxLzEwMDAwJ3MgaW4gQURDX0ZSQUNfQklUUyBwcmVjaXNpb24uICovCisjZGVmaW5lIEZSQUMxMEsoZikJCSgoKGYpICogKDFMIDw8IChBRENfRlJBQ19CSVRTKSkpIC8gKDEwMDAwKSkKKworLyogQml0cyB1c2VkIGZvciBmcmFjdGlvbiBpbiBjYWxpYnJhdGlvbiBjb2VmZmljaWVudHMuKi8KKyNkZWZpbmUgQ0FMSUJfRlJBQ19CSVRTCQkoMTApCisvKiAwLjUgaW4gQ0FMSUJfRlJBQ19CSVRTIHByZWNpc2lvbiAqLworI2RlZmluZSBDQUxJQl9GUkFDX0hBTEYJCSgxIDw8IChDQUxJQl9GUkFDX0JJVFMgLSAxKSkKKy8qIE1ha2UgYSBmcmFjdGlvbiBmcm9tIGEgbnVtYmVyIG4gdGhhdCB3YXMgbXVsdGlwbGllZCB3aXRoIGIuICovCisjZGVmaW5lIENBTElCX0ZSQUMobiwgYikJKCgobikgPDwgQ0FMSUJfRlJBQ19CSVRTKSAvIChiKSkKKy8qIERlY2ltYWwgMTBeKGRpZ2l0cyBpbiBzeXNmcyBwcmVzZW50YXRpb24pICovCisjZGVmaW5lIENBTElCX0JBU0VfU1lTRlMJKDEwMDApCisKKyNkZWZpbmUgVFNMMjU2M19DTUQJCSgweDgwKQorI2RlZmluZSBUU0wyNTYzX0NMRUFSSU5UCSgweDQwKQorCisjZGVmaW5lIFRTTDI1NjNfUkVHX0NUUkwJKDB4MDApCisjZGVmaW5lIFRTTDI1NjNfUkVHX1RJTUlORwkoMHgwMSkKKyNkZWZpbmUgVFNMMjU2M19SRUdfTE9XTE9XCSgweDAyKSAvKiBkYXRhMCBsb3cgdGhyZXNob2xkLCAyIGJ5dGVzICovCisjZGVmaW5lIFRTTDI1NjNfUkVHX0xPV0hJR0gJKDB4MDMpCisjZGVmaW5lIFRTTDI1NjNfUkVHX0hJR0hMT1cJKDB4MDQpIC8qIGRhdGEwIGhpZ2ggdGhyZXNob2xkLCAyIGJ5dGVzICovCisjZGVmaW5lIFRTTDI1NjNfUkVHX0hJR0hISUdICSgweDA1KQorI2RlZmluZSBUU0wyNTYzX1JFR19JTlQJCSgweDA2KQorI2RlZmluZSBUU0wyNTYzX1JFR19JRAkJKDB4MGEpCisjZGVmaW5lIFRTTDI1NjNfUkVHX0RBVEEwTE9XCSgweDBjKSAvKiBicm9hZGJhbmQgc2Vuc29yIHZhbHVlLCAyIGJ5dGVzICovCisjZGVmaW5lIFRTTDI1NjNfUkVHX0RBVEEwSElHSAkoMHgwZCkKKyNkZWZpbmUgVFNMMjU2M19SRUdfREFUQTFMT1cJKDB4MGUpIC8qIGluZnJhcmVkIHNlbnNvciB2YWx1ZSwgMiBieXRlcyAqLworI2RlZmluZSBUU0wyNTYzX1JFR19EQVRBMUhJR0gJKDB4MGYpCisKKyNkZWZpbmUgVFNMMjU2M19DTURfUE9XRVJfT04JKDB4MDMpCisjZGVmaW5lIFRTTDI1NjNfQ01EX1BPV0VSX09GRgkoMHgwMCkKKyNkZWZpbmUgVFNMMjU2M19DVFJMX1BPV0VSX01BU0sJKDB4MDMpCisKKyNkZWZpbmUgVFNMMjU2M19USU1JTkdfMTNNUwkoMHgwMCkKKyNkZWZpbmUgVFNMMjU2M19USU1JTkdfMTAwTVMJKDB4MDEpCisjZGVmaW5lIFRTTDI1NjNfVElNSU5HXzQwME1TCSgweDAyKQorI2RlZmluZSBUU0wyNTYzX1RJTUlOR19NQVNLCSgweDAzKQorI2RlZmluZSBUU0wyNTYzX1RJTUlOR19HQUlOMTYJKDB4MTApCisjZGVmaW5lIFRTTDI1NjNfVElNSU5HX0dBSU4xCSgweDAwKQorCisjZGVmaW5lIFRTTDI1NjNfSU5UX0RJU0JMRUQJKDB4MDApCisjZGVmaW5lIFRTTDI1NjNfSU5UX0xFVkVMCSgweDEwKQorI2RlZmluZSBUU0wyNTYzX0lOVF9QRVJTSVNUKG4pCSgobikgJiAweDBGKQorCitzdHJ1Y3QgdHNsMjU2M19nYWlubGV2ZWxfY29lZmYgeworCXU4IGdhaW50aW1lOworCXUxNiBtaW47CisJdTE2IG1heDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHNsMjU2M19nYWlubGV2ZWxfY29lZmYgdHNsMjU2M19nYWlubGV2ZWxfdGFibGVbXSA9IHsKKwl7CisJCS5nYWludGltZQk9IFRTTDI1NjNfVElNSU5HXzQwME1TIHwgVFNMMjU2M19USU1JTkdfR0FJTjE2LAorCQkubWluCQk9IDAsCisJCS5tYXgJCT0gNjU1MzQsCisJfSwgeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR180MDBNUyB8IFRTTDI1NjNfVElNSU5HX0dBSU4xLAorCQkubWluCQk9IDIwNDgsCisJCS5tYXgJCT0gNjU1MzQsCisJfSwgeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR18xMDBNUyB8IFRTTDI1NjNfVElNSU5HX0dBSU4xLAorCQkubWluCQk9IDQwOTUsCisJCS5tYXgJCT0gMzcxNzcsCisJfSwgeworCQkuZ2FpbnRpbWUJPSBUU0wyNTYzX1RJTUlOR18xM01TIHwgVFNMMjU2M19USU1JTkdfR0FJTjEsCisJCS5taW4JCT0gMzAwMCwKKwkJLm1heAkJPSA2NTUzNSwKKwl9LAorfTsKKworc3RydWN0IHRzbDI1NjNfY2hpcCB7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJc3RydWN0IGlpb19kZXYJCSppbmRpb19kZXY7CisJc3RydWN0IGRlbGF5ZWRfd29yawlwb3dlcm9mZl93b3JrOworCisJLyogUmVtZW1iZXIgc3RhdGUgZm9yIHN1c3BlbmQgYW5kIHJlc3VtZSBmdW5jdGlvbnMgKi8KKwlwbV9tZXNzYWdlX3QJCXN0YXRlOworCisJc3RydWN0IHRzbDI1NjNfZ2FpbmxldmVsX2NvZWZmICpnYWlubGV2ZWw7CisKKwkvKiBUaHJlc2hvbGRzIGFyZSBpbiBsdXggKi8KKwl1MTYJCQlsb3dfdGhyZXM7CisJdTE2CQkJaGlnaF90aHJlczsKKwl1OAkJCWludHI7CisKKwkvKiBDYWxpYnJhdGlvbiBjb2VmZmljaWVudHMgKi8KKwl1MzIJCQljYWxpYjA7CisJdTMyCQkJY2FsaWIxOworCWludAkJCWNvdmVyX2NvbXBfZ2FpbjsKKworCS8qIENhY2hlIGN1cnJlbnQgdmFsdWVzLCB0byBiZSByZXR1cm5lZCB3aGlsZSBzdXNwZW5kZWQgKi8KKwl1MzIJCQlkYXRhMDsKKwl1MzIJCQlkYXRhMTsKK307CisKK3N0YXRpYyBpbnQgdHNsMjU2M193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCWludCByZXQ7CisJdTggYnVmWzJdOworCisJYnVmWzBdID0gVFNMMjU2M19DTUQgfCByZWc7CisJYnVmWzFdID0gdmFsdWU7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIHNpemVvZihidWYpKTsKKwlyZXR1cm4gKHJldCA9PSBzaXplb2YoYnVmKSkgPyAwIDogcmV0OworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgcmV0OworCXU4IGNtZCA9IFRTTDI1NjNfQ01EIHwgcmVnOworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJmNtZCwgc2l6ZW9mKGNtZCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKGNtZCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfc2V0X3Bvd2VyKHN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAsIGludCBvbikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCXU4IGNtZDsKKworCWNtZCA9IG9uID8gVFNMMjU2M19DTURfUE9XRVJfT04gOiBUU0wyNTYzX0NNRF9QT1dFUl9PRkY7CisJcmV0dXJuIHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19DVFJMLCBjbWQpOworfQorCisvKgorICogUmV0dXJuIHZhbHVlIGlzIDAgZm9yIG9mZiwgMSBmb3Igb24sIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAqIGNvZGUgaWYgcmVhZGluZyBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgdHNsMjU2M19nZXRfcG93ZXIoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQ7CisJdTggdmFsOworCisJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwgVFNMMjU2M19SRUdfQ1RSTCwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCWlmIChyZXQgIT0gc2l6ZW9mKHZhbCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHZhbCAmIFRTTDI1NjNfQ1RSTF9QT1dFUl9NQVNLKSA9PSBUU0wyNTYzX0NNRF9QT1dFUl9PTjsKK30KKworc3RhdGljIGludCB0c2wyNTYzX2NvbmZpZ3VyZShzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19USU1JTkcsCisJCQljaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19JTlQsIGNoaXAtPmludHIpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdHNsMjU2M19wb3dlcm9mZl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0c2wyNTYzX2NoaXAsIHBvd2Vyb2ZmX3dvcmsud29yayk7CisJdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19kZXRlY3Qoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHRzbDI1NjNfZ2V0X3Bvd2VyKGNoaXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldCA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfcmVhZF9pZChzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwLCB1OCAqaWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwgVFNMMjU2M19SRUdfSUQsIGlkLCBzaXplb2YoKmlkKSk7CisJaWYgKHJldCAhPSBzaXplb2YoKmlkKSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogIk5vcm1hbGl6ZWQiIEFEQyB2YWx1ZSBpcyBvbmUgb2J0YWluZWQgd2l0aCA0MDBtcyBvZiBpbnRlZ3JhdGlvbiB0aW1lIGFuZAorICogMTZ4IGdhaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgb2Ygc2hpZnQgbmVlZGVkIHRvCisgKiBjb252ZXJ0IGJldHdlZW4gbm9ybWFsaXplZCB2YWx1ZXMgYW5kIEhXIHZhbHVlcyBvYnRhaW5lZCB1c2luZyBnaXZlbgorICogdGltaW5nIGFuZCBnYWluIHNldHRpbmdzLgorICovCitzdGF0aWMgaW50IGFkY19zaGlmdGJpdHModTggdGltaW5nKQoreworCWludCBzaGlmdCA9IDA7CisKKwlzd2l0Y2ggKHRpbWluZyAmIFRTTDI1NjNfVElNSU5HX01BU0spIHsKKwljYXNlIFRTTDI1NjNfVElNSU5HXzEzTVM6CisJCXNoaWZ0ICs9IDU7CisJCWJyZWFrOworCWNhc2UgVFNMMjU2M19USU1JTkdfMTAwTVM6CisJCXNoaWZ0ICs9IDI7CisJCWJyZWFrOworCWNhc2UgVFNMMjU2M19USU1JTkdfNDAwTVM6CisJCS8qIG5vLW9wICovCisJCWJyZWFrOworCX0KKworCWlmICghKHRpbWluZyAmIFRTTDI1NjNfVElNSU5HX0dBSU4xNikpCisJCXNoaWZ0ICs9IDQ7CisKKwlyZXR1cm4gc2hpZnQ7Cit9CisKKy8qIENvbnZlcnQgYSBIVyBBREMgdmFsdWUgdG8gbm9ybWFsaXplZCBzY2FsZS4gKi8KK3N0YXRpYyB1MzIgbm9ybWFsaXplX2FkYyh1MTYgYWRjLCB1OCB0aW1pbmcpCit7CisJcmV0dXJuIGFkYyA8PCBhZGNfc2hpZnRiaXRzKHRpbWluZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRzbDI1NjNfd2FpdF9hZGMoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgZGVsYXk7CisKKwlzd2l0Y2ggKGNoaXAtPmdhaW5sZXZlbC0+Z2FpbnRpbWUgJiBUU0wyNTYzX1RJTUlOR19NQVNLKSB7CisJY2FzZSBUU0wyNTYzX1RJTUlOR18xM01TOgorCQlkZWxheSA9IDE0OworCQlicmVhazsKKwljYXNlIFRTTDI1NjNfVElNSU5HXzEwME1TOgorCQlkZWxheSA9IDEwMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGVsYXkgPSA0MDI7CisJfQorCS8qCisJICogVE9ETzogTWFrZSBzdXJlIHRoYXQgd2Ugd2FpdCBhdCBsZWFzdCByZXF1aXJlZCBkZWxheSBidXQgd2h5IHdlCisJICogaGF2ZSB0byBleHRlbmQgaXQgb25lIHRpY2sgbW9yZT8KKwkgKi8KKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyhkZWxheSkgKyAyKTsKK30KKworc3RhdGljIGludCB0c2wyNTYzX2FkanVzdF9nYWlubGV2ZWwoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCwgdTE2IGFkYykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCisJaWYgKGFkYyA+IGNoaXAtPmdhaW5sZXZlbC0+bWF4IHx8IGFkYyA8IGNoaXAtPmdhaW5sZXZlbC0+bWluKSB7CisKKwkJKGFkYyA+IGNoaXAtPmdhaW5sZXZlbC0+bWF4KSA/CisJCQljaGlwLT5nYWlubGV2ZWwrKyA6IGNoaXAtPmdhaW5sZXZlbC0tOworCisJCXRzbDI1NjNfd3JpdGUoY2xpZW50LCBUU0wyNTYzX1JFR19USU1JTkcsCisJCQkgICAgICBjaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKworCQl0c2wyNTYzX3dhaXRfYWRjKGNoaXApOworCQl0c2wyNTYzX3dhaXRfYWRjKGNoaXApOworCisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0c2wyNTYzX2dldF9hZGMoc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCXU4IGJ1ZjBbMl0sIGJ1ZjFbMl07CisJdTE2IGFkYzAsIGFkYzE7CisJaW50IHJldHJ5ID0gMTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjaGlwLT5zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTikKKwkJZ290byBvdXQ7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrKTsKKworCWlmICghdHNsMjU2M19nZXRfcG93ZXIoY2hpcCkpIHsKKwkJcmV0ID0gdHNsMjU2M19zZXRfcG93ZXIoY2hpcCwgMSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gdHNsMjU2M19jb25maWd1cmUoY2hpcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJdHNsMjU2M193YWl0X2FkYyhjaGlwKTsKKwl9CisKKwl3aGlsZSAocmV0cnkpIHsKKwkJcmV0ID0gdHNsMjU2M19yZWFkKGNsaWVudCwKKwkJCQkgICBUU0wyNTYzX1JFR19EQVRBMExPVyB8IFRTTDI1NjNfQ0xFQVJJTlQsCisJCQkJICAgYnVmMCwgc2l6ZW9mKGJ1ZjApKTsKKwkJaWYgKHJldCAhPSBzaXplb2YoYnVmMCkpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSB0c2wyNTYzX3JlYWQoY2xpZW50LCBUU0wyNTYzX1JFR19EQVRBMUxPVywKKwkJCQkgICBidWYxLCBzaXplb2YoYnVmMSkpOworCQlpZiAocmV0ICE9IHNpemVvZihidWYxKSkKKwkJCWdvdG8gb3V0OworCisJCWFkYzAgPSAoYnVmMFsxXSA8PCA4KSArIGJ1ZjBbMF07CisJCWFkYzEgPSAoYnVmMVsxXSA8PCA4KSArIGJ1ZjFbMF07CisKKwkJcmV0cnkgPSB0c2wyNTYzX2FkanVzdF9nYWlubGV2ZWwoY2hpcCwgYWRjMCk7CisJfQorCisJY2hpcC0+ZGF0YTAgPSBub3JtYWxpemVfYWRjKGFkYzAsIGNoaXAtPmdhaW5sZXZlbC0+Z2FpbnRpbWUpOworCWNoaXAtPmRhdGExID0gbm9ybWFsaXplX2FkYyhhZGMxLCBjaGlwLT5nYWlubGV2ZWwtPmdhaW50aW1lKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yaywgNSAqIEhaKTsKKworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2FsaWJfdG9fc3lzZnModTMyIGNhbGliKQoreworCXJldHVybiAoaW50KSAoKChjYWxpYiAqIENBTElCX0JBU0VfU1lTRlMpICsKKwkJICAgICAgIENBTElCX0ZSQUNfSEFMRikgPj4gQ0FMSUJfRlJBQ19CSVRTKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2FsaWJfZnJvbV9zeXNmcyhpbnQgdmFsdWUpCit7CisJcmV0dXJuICgoKHUzMikgdmFsdWUpIDw8IENBTElCX0ZSQUNfQklUUykgLyBDQUxJQl9CQVNFX1NZU0ZTOworfQorCisvKgorICogQ29udmVyc2lvbnMgYmV0d2VlbiBsdXggYW5kIEFEQyB2YWx1ZXMuCisgKgorICogVGhlIGJhc2ljIGZvcm11bGEgaXMgbHV4ID0gYzAgKiBhZGMwIC0gYzEgKiBhZGMxLCB3aGVyZSBjMCBhbmQgYzEgYXJlCisgKiBhcHByb3ByaWF0ZSBjb25zdGFudHMuIERpZmZlcmVudCBjb25zdGFudHMgYXJlIG5lZWRlZCBmb3IgZGlmZmVyZW50CisgKiBraW5kcyBvZiBsaWdodCwgZGV0ZXJtaW5lZCBieSB0aGUgcmF0aW8gYWRjMS9hZGMwIChiYXNpY2FsbHkgdGhlIHJhdGlvCisgKiBvZiB0aGUgaW50ZW5zaXRpZXMgaW4gaW5mcmFyZWQgYW5kIHZpc2libGUgd2F2ZWxlbmd0aHMpLiBsdXhfdGFibGUgYmVsb3cKKyAqIGxpc3RzIHRoZSB1cHBlciB0aHJlc2hvbGQgb2YgdGhlIGFkYzEvYWRjMCByYXRpbyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNvbnN0YW50cy4KKyAqLworCitzdHJ1Y3QgdHNsMjU2M19sdXhfY29lZmYgeworCXVuc2lnbmVkIGxvbmcgY2hfcmF0aW87CisJdW5zaWduZWQgbG9uZyBjaDBfY29lZmY7CisJdW5zaWduZWQgbG9uZyBjaDFfY29lZmY7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRzbDI1NjNfbHV4X2NvZWZmIGx1eF90YWJsZVtdID0geworCXsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSygxMzAwKSwKKwkJLmNoMF9jb2VmZgk9IEZSQUMxMEsoMzE1KSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoMjYyKSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoMjYwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDMzNyksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDQzMCksCisJfSwgeworCQkuY2hfcmF0aW8JPSBGUkFDMTBLKDM5MDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygzNjMpLAorCQkuY2gxX2NvZWZmCT0gRlJBQzEwSyg1MjkpLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSyg1MjAwKSwKKwkJLmNoMF9jb2VmZgk9IEZSQUMxMEsoMzkyKSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoNjA1KSwKKwl9LCB7CisJCS5jaF9yYXRpbwk9IEZSQUMxMEsoNjUwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDIyOSksCisJCS5jaDFfY29lZmYJPSBGUkFDMTBLKDI5MSksCisJfSwgeworCQkuY2hfcmF0aW8JPSBGUkFDMTBLKDgwMDApLAorCQkuY2gwX2NvZWZmCT0gRlJBQzEwSygxNTcpLAorCQkuY2gxX2NvZWZmCT0gRlJBQzEwSygxODApLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gRlJBQzEwSygxMzAwMCksCisJCS5jaDBfY29lZmYJPSBGUkFDMTBLKDM0KSwKKwkJLmNoMV9jb2VmZgk9IEZSQUMxMEsoMjYpLAorCX0sIHsKKwkJLmNoX3JhdGlvCT0gVUxPTkdfTUFYLAorCQkuY2gwX2NvZWZmCT0gMCwKKwkJLmNoMV9jb2VmZgk9IDAsCisJfSwKK307CisKKy8qCisgKiBDb252ZXJ0IG5vcm1hbGl6ZWQsIHNjYWxlZCBBREMgdmFsdWVzIHRvIGx1eC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGNfdG9fbHV4KHUzMiBhZGMwLCB1MzIgYWRjMSkKK3sKKwljb25zdCBzdHJ1Y3QgdHNsMjU2M19sdXhfY29lZmYgKmxwID0gbHV4X3RhYmxlOworCXVuc2lnbmVkIGxvbmcgcmF0aW8sIGx1eCwgY2gwID0gYWRjMCwgY2gxID0gYWRjMTsKKworCXJhdGlvID0gY2gwID8gKChjaDEgPDwgQURDX0ZSQUNfQklUUykgLyBjaDApIDogVUxPTkdfTUFYOworCisJd2hpbGUgKGxwLT5jaF9yYXRpbyA8IHJhdGlvKQorCQlscCsrOworCisJbHV4ID0gY2gwICogbHAtPmNoMF9jb2VmZiAtIGNoMSAqIGxwLT5jaDFfY29lZmY7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgKGx1eCA+PiBBRENfRlJBQ19CSVRTKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICBTeXNmcyBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3NpemVfdCB0c2wyNTYzX2FkYzBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOworCisJcmV0ID0gdHNsMjU2M19nZXRfYWRjKGNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2hpcC0+ZGF0YTApOworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19hZGMxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldCA9IHRzbDI1NjNfZ2V0X2FkYyhjaGlwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNoaXAtPmRhdGExKTsKK291dDoKKwltdXRleF91bmxvY2soJmNoaXAtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIEFwcGx5IGNhbGlicmF0aW9uIGNvZWZmaWNpZW50IHRvIEFEQyBjb3VudC4gKi8KK3N0YXRpYyB1MzIgY2FsaWJfYWRjKHUzMiBhZGMsIHUzMiBjYWxpYikKK3sKKwl1bnNpZ25lZCBsb25nIHNjYWxlZCA9IGFkYzsKKworCXNjYWxlZCAqPSBjYWxpYjsKKwlzY2FsZWQgPj49IENBTElCX0ZSQUNfQklUUzsKKworCXJldHVybiAodTMyKSBzY2FsZWQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfbHV4X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXUzMiBjYWxpYjAsIGNhbGliMTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSB0c2wyNTYzX2dldF9hZGMoY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwljYWxpYjAgPSBjYWxpYl9hZGMoY2hpcC0+ZGF0YTAsIGNoaXAtPmNhbGliMCkgKiBjaGlwLT5jb3Zlcl9jb21wX2dhaW47CisJY2FsaWIxID0gY2FsaWJfYWRjKGNoaXAtPmRhdGExLCBjaGlwLT5jYWxpYjEpICogY2hpcC0+Y292ZXJfY29tcF9nYWluOworCisJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYWRjX3RvX2x1eChjYWxpYjAsIGNhbGliMSkpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBmb3JtYXRfY2FsaWIoY2hhciAqYnVmLCBpbnQgbGVuLCB1MzIgY2FsaWIpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNhbGliX3RvX3N5c2ZzKGNhbGliKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzbDI1NjNfY2FsaWIwX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXQgPSBmb3JtYXRfY2FsaWIoYnVmLCBQQUdFX1NJWkUsIGNoaXAtPmNhbGliMCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB0c2wyNTYzX2NhbGliMV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisJcmV0ID0gZm9ybWF0X2NhbGliKGJ1ZiwgUEFHRV9TSVpFLCBjaGlwLT5jYWxpYjEpOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkb19jYWxpYl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgaW50IGNoKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlpbnQgdmFsdWU7CisJdTMyIGNhbGliOworCisJaWYgKDEgIT0gc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYWxpYiA9IGNhbGliX2Zyb21fc3lzZnModmFsdWUpOworCisJaWYgKGNoKQorCQljaGlwLT5jYWxpYjEgPSBjYWxpYjsKKwllbHNlCisJCWNoaXAtPmNhbGliMCA9IGNhbGliOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBkb19jYWxpYl9zdG9yZShkZXYsIGJ1ZiwgbGVuLCAwKTsKK30KKworc3RhdGljIHNzaXplX3QgdHNsMjU2M19jYWxpYjFfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBkb19jYWxpYl9zdG9yZShkZXYsIGJ1ZiwgbGVuLCAxKTsKK30KKworLyogQW1pdFhYWFg6IENvbnZlcnQgdG8gSUlPX0RFVl9BVFRSX0xJR0hUKiBhcyBpbiB0c2wyNTYxCisgKiBvbmNlIEkgdW5kZXJzdGFuZCB3aGF0IHRoZXkgbWVhbiAqLworc3RhdGljIERFVklDRV9BVFRSKGFkYzAsIFNfSVJVR08sIHRzbDI1NjNfYWRjMF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGMxLCBTX0lSVUdPLCB0c2wyNTYzX2FkYzFfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobHV4LCBTX0lSVUdPLCB0c2wyNTYzX2x1eF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYWxpYjAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICB0c2wyNTYzX2NhbGliMF9zaG93LCB0c2wyNTYzX2NhbGliMF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FsaWIxLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgdHNsMjU2M19jYWxpYjFfc2hvdywgdHNsMjU2M19jYWxpYjFfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdHNsMjU2M19hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2FkYzAuYXR0ciwKKwkmZGV2X2F0dHJfYWRjMS5hdHRyLAorCSZkZXZfYXR0cl9sdXguYXR0ciwKKwkmZGV2X2F0dHJfY2FsaWIwLmF0dHIsCisJJmRldl9hdHRyX2NhbGliMS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRzbDI1NjNfZ3JvdXAgPSB7CisJLmF0dHJzID0gdHNsMjU2M19hdHRyaWJ1dGVzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgICAgICAgICAgICAgICBQcm9iZSwgQXR0YWNoLCBSZW1vdmUgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRzbDI1NjNfaTJjX2RyaXZlcjsKKworc3RhdGljIGludCBfX2RldmluaXQgdHNsMjU2M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkZXZpY2VfaWQpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgdHNsMjU2M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGVyciA9IDA7CisJaW50IHJldDsKKwl1OCBpZDsKKworCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisKKwllcnIgPSB0c2wyNTYzX2RldGVjdChjaGlwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZGV2aWNlIG5vdCBmb3VuZCwgZXJyb3IgJWQgXG4iLCAtZXJyKTsKKwkJZ290byBmYWlsMTsKKwl9CisKKwllcnIgPSB0c2wyNTYzX3JlYWRfaWQoY2hpcCwgJmlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwxOworCisJbXV0ZXhfaW5pdCgmY2hpcC0+bG9jayk7CisKKwkvKiBEZWZhdWx0IHZhbHVlcyB1c2VkIHVudGlsIHVzZXJzcGFjZSBzYXlzIG90aGVyd2lzZSAqLworCWNoaXAtPmxvd190aHJlcyA9IDB4MDsKKwljaGlwLT5oaWdoX3RocmVzID0gMHhmZmZmOworCWNoaXAtPmdhaW5sZXZlbCA9IHRzbDI1NjNfZ2FpbmxldmVsX3RhYmxlOworCWNoaXAtPmludHIgPSBUU0wyNTYzX0lOVF9QRVJTSVNUKDQpOworCWNoaXAtPmNhbGliMCA9IGNhbGliX2Zyb21fc3lzZnMoQ0FMSUJfQkFTRV9TWVNGUyk7CisJY2hpcC0+Y2FsaWIxID0gY2FsaWJfZnJvbV9zeXNmcyhDQUxJQl9CQVNFX1NZU0ZTKTsKKworCWlmIChwZGF0YSkKKwkJY2hpcC0+Y292ZXJfY29tcF9nYWluID0gcGRhdGEtPmNvdmVyX2NvbXBfZ2FpbjsKKwllbHNlCisJCWNoaXAtPmNvdmVyX2NvbXBfZ2FpbiA9IDE7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJtb2RlbCAlZCwgcmV2LiAlZFxuIiwgaWQgPj4gNCwgaWQgJiAweDBmKTsKKworCWNoaXAtPmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWNoaXAtPmluZGlvX2RldikKKwkJZ290byBmYWlsMTsKKwljaGlwLT5pbmRpb19kZXYtPmF0dHJzID0gJnRzbDI1NjNfZ3JvdXA7CisJY2hpcC0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWNoaXAtPmluZGlvX2Rldi0+ZGV2X2RhdGEgPSAodm9pZCAqKShjaGlwKTsKKwljaGlwLT5pbmRpb19kZXYtPmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRTsKKwljaGlwLT5pbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihjaGlwLT5pbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDE7CisKKwllcnIgPSB0c2wyNTYzX2NvbmZpZ3VyZShjaGlwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwyOworCisJSU5JVF9ERUxBWUVEX1dPUksoJmNoaXAtPnBvd2Vyb2ZmX3dvcmssIHRzbDI1NjNfcG93ZXJvZmZfd29yayk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrLCA1ICogSFopOworCisJcmV0dXJuIDA7CitmYWlsMjoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKK2ZhaWwxOgorCWtmcmVlKGNoaXApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdHNsMjU2M19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoY2hpcC0+aW5kaW9fZGV2KTsKKworCWtmcmVlKGNoaXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRzbDI1NjNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKworCXJldCA9IHRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2hpcC0+c3RhdGUgPSBzdGF0ZTsKKworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0c2wyNTYzX3Jlc3VtZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXQgPSB0c2wyNTYzX3NldF9wb3dlcihjaGlwLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IHRzbDI1NjNfY29uZmlndXJlKGNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJY2hpcC0+c3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9PTjsKKworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRzbDI1NjNfaWRbXSA9IHsKKwl7ICJ0c2wyNTYwIiwgMCB9LAorCXsgInRzbDI1NjEiLCAxIH0sCisJeyAidHNsMjU2MiIsIDIgfSwKKwl7ICJ0c2wyNTYzIiwgMyB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzbDI1NjNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHNsMjU2M19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCSA9ICJ0c2wyNTYzIiwKKwl9LAorCS5zdXNwZW5kCT0gdHNsMjU2M19zdXNwZW5kLAorCS5yZXN1bWUJCT0gdHNsMjU2M19yZXN1bWUsCisJLnByb2JlCQk9IHRzbDI1NjNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0c2wyNTYzX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gdHNsMjU2M19pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRzbDI1NjNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmdHNsMjU2M19pMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRzbDI1NjNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ0c2wyNTYzX2kyY19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJOb2tpYSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0c2wyNTYzIGxpZ2h0IHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQodHNsMjU2M19pbml0KTsKK21vZHVsZV9leGl0KHRzbDI1NjNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU2My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzM2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuaApAQCAtMCwwICsxLDkgQEAKKyNpZm5kZWYgX19MSU5VWF9UU0wyNTYzX0gKKyNkZWZpbmUgX19MSU5VWF9UU0wyNTYzX0gKKworc3RydWN0IHRzbDI1NjNfcGxhdGZvcm1fZGF0YSB7CisJaW50IGNvdmVyX2NvbXBfZ2FpbjsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1RTTDI1NjNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfZ2VuZXJpYy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2dlbmVyaWMuaAppbmRleCBkOTI2MTg5Li45M2I5MWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfZ2VuZXJpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmgKQEAgLTI1LDkgKzI1LDEyIEBACiAJCQlpbnQgZXZlbnRfY29kZSwKIAkJCXM2NCB0aW1lc3RhbXApOwogLyoqCi0gKiBpaW9fcHVzaF9vcl9lc2NhbGxhdGVfcmluZ19ldmVudCgpIC0JZXNjYWxsYXRlIG9yIGFkZCBhcyBhcHByb3ByaWF0ZQorICogaWlvX3B1c2hfb3JfZXNjYWxsYXRlX3JpbmdfZXZlbnQoKSAtCWVzY2FsYXRlIG9yIGFkZCBhcyBhcHByb3ByaWF0ZQorICogQHJpbmdfYnVmOgkJcmluZyBidWZmZXIgdGhhdCBpcyB0aGUgZXZlbnQgc291cmNlCisgKiBAZXZlbnRfY29kZToJCWV2ZW50IGluZGVudGlmaWNhdGlvbiBjb2RlCisgKiBAdGltZXN0YW1wOgkJdGltZSBvZiBldmVudAogICoKLSAqIFR5cGljYWwgdXNlY2FzZSBpcyB0byBlc2NhbGxhdGUgYSA1MCUgcmluZyBmdWxsIHRvIDc1JSBmdWxsIGlmIG5vb25lIGhhcyB5ZXQKKyAqIFR5cGljYWwgdXNlY2FzZSBpcyB0byBlc2NhbGF0ZSBhIDUwJSByaW5nIGZ1bGwgdG8gNzUlIGZ1bGwgaWYgbm9vbmUgaGFzIHlldAogICogcmVhZCB0aGUgZmlyc3QgZXZlbnQuIENsZWFybHkgdGhlIDUwJSBmdWxsIGlzIG5vIGxvbmdlciBvZiBpbnRlcmVzdCBpbgogICogdHlwaWNhbCB1c2UgY2FzZS4KICAqKi8KQEAgLTM3LDEwICs0MCw2IEBACiAKIC8qKgogICogc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyAtIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHJpbmcgYnVmZmVycy4KLSAqIEBjcmVhdGU6CQlwZXJmb3JtIGFsbG9jYXRpb24KLSAqIEBpbml0OgkJZ2V0IHJpbmcgYnVmZmVyIHJlYWR5IGZvciB1c2UKLSAqIEBfZXhpdDoJCXJldmVyc2Ugc3RlcHMgaW4gaW5pdAotICogQF9mcmVlOgkJZGVhbGxvY2F0ZSByaW5nIGJ1ZmZlcgogICogQG1hcmtfaW5fdXNlOglyZWZlcmVuY2UgY291bnRpbmcsIHR5cGljYWxseSB0byBwcmV2ZW50IG1vZHVsZSByZW1vdmFsCiAgKiBAdW5tYXJrX2luX3VzZToJcmVkdWNlIHJlZmVyZW5jZSBjb3VudCB3aGVuIG5vIGxvbmdlciB1c2luZyByaW5nIGJ1ZmZlcgogICogQHN0b3JlX3RvOgkJYWN0dWFsbHkgc3RvcmUgc3R1ZmYgdG8gdGhlIHJpbmcgYnVmZmVyCkBAIC02MCw3ICs1OSw3IEBACiAgKgogICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgdG8gbWFrZSB0aGUgcmluZyBidWZmZXIgZWxlbWVudAogICogbW9kdWxhciBhcyBldmVudCBmb3IgYSBnaXZlbiBkcml2ZXIsIGRpZmZlcmVudCB1c2VjYXNlcyBtYXkgcmVxdWlyZQotICogZGlmZmVyZW50IHJpbmcgZGVzaWducyAoc3BhY2UgZWZmaWNpZW5jeSB2cyBzcGVlZCBmb3IgZXhhbXBsZS4KKyAqIGRpZmZlcmVudCByaW5nIGRlc2lnbnMgKHNwYWNlIGVmZmljaWVuY3kgdnMgc3BlZWQgZm9yIGV4YW1wbGUpLgogICoKICAqIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IGEgZ2l2ZW4gcmluZyBpbXBsZW1lbnRhdGlvbiBtYXkgb25seSBzdXBwb3J0IGEgc21hbGwKICAqIHByb3BvcnRpb24gb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIGNvcmUgY29kZSAnc2hvdWxkJyBjb3BlIGZpbmUgd2l0aCBhbnkgb2YKQEAgLTkxLDIzICs5MCwyNSBAQAogCiAvKioKICAqIHN0cnVjdCBpaW9fcmluZ19idWZmZXIgLSBnZW5lcmFsIHJpbmcgYnVmZmVyIHN0cnVjdHVyZQotICogQGxlbmd0aDoJCVtERVZJQ0VdbnVtYmVyIG9mIGRhdHVtcyBpbiByaW5nCi0gKiBAYnBkOgkJW0RFVklDRV1zaXplIG9mIGluZGl2aWR1YWwgZGF0dW0gaW5jbHVkaW5nIHRpbWVzdGFtcAotICogQGxvb3Bjb3VudDoJCVtJTlRFUk5dbnVtYmVyIG9mIHRpbWVzIHRoZSByaW5nIGhhcyBsb29wZWQKLSAqIEBhY2Nlc3NfbWlub3JfbmFtZToJW0lOVEVSTl1zdG9yZSBvZiBuYW1lIG9mIHRoZSBhY2Nlc3MgY2hyZGV2IG1pbm9yIG51bWJlcgotICoJCQlzeXNmcyBhdHRyaWJ1dGUKLSAqIEBhY2Nlc3NfaGFuZGxlcjoJW0lOVEVSTl1jaHJkZXYgYWNjZXNzIGhhbmRsaW5nCi0gKiBAZXZlbnRfbWlub3JfbmFtZToJW0lOVEVSTl1zdG9yZSBvZiBuYW1lIG9mIHRoZSBldmVudCBjaHJkZXYgbWlub3IgbnVtYmVyCi0gKgkJCXN5c2ZzIGF0dHJpYnV0ZQotICogQGV2X2ludDoJCVtJTlRFUk5dY2hyZGV2IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50IGNocmRldgotICogQHNoYXJlZF9ldl9wb2ludGVyOglbSU5URVJOXXRoZSBzaGFyZWQgZXZlbnQgcG9pbnRlciB0byBhbGxvdyBlc2NhbGF0aW9uIG9mCisgKiBAZGV2OgkJcmluZyBidWZmZXIgZGV2aWNlIHN0cnVjdAorICogQGFjY2Vzc19kZXY6CQlzeXN0ZW0gZGV2aWNlIHN0cnVjdCBmb3IgdGhlIGNocmRldgorICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBvd25lcjoJCW1vZHVsZSB0aGF0IG93bnMgdGhlIHJpbmcgYnVmZmVyIChmb3IgcmVmIGNvdW50aW5nKQorICogQGlkOgkJCXVuaXF1ZSBpZCBudW1iZXIKKyAqIEBhY2Nlc3NfaWQ6CQlkZXZpY2UgaWQgbnVtYmVyCisgKiBAbGVuZ3RoOgkJW0RFVklDRV0gbnVtYmVyIG9mIGRhdHVtcyBpbiByaW5nCisgKiBAYnBkOgkJW0RFVklDRV0gc2l6ZSBvZiBpbmRpdmlkdWFsIGRhdHVtIGluY2x1ZGluZyB0aW1lc3RhbXAKKyAqIEBsb29wY291bnQ6CQlbSU5URVJOXSBudW1iZXIgb2YgdGltZXMgdGhlIHJpbmcgaGFzIGxvb3BlZAorICogQGFjY2Vzc19oYW5kbGVyOglbSU5URVJOXSBjaHJkZXYgYWNjZXNzIGhhbmRsaW5nCisgKiBAZXZfaW50OgkJW0lOVEVSTl0gY2hyZGV2IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50IGNocmRldgorICogQHNoYXJlZF9ldl9wb2ludGVyOglbSU5URVJOXSB0aGUgc2hhcmVkIGV2ZW50IHBvaW50ZXIgdG8gYWxsb3cgZXNjYWxhdGlvbiBvZgogICoJCQlldmVudHMKLSAqIEByaW5nX2FjY2VzczoJW0RSSVZFUl1yaW5nIGFjY2VzcyBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogQGFjY2VzczoJCVtEUklWRVJdIHJpbmcgYWNjZXNzIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlCiAgKgkJCWltcGxlbWVudGF0aW9uLgotICogQHJpbmdfcHJlbmFibGU6CVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIHJpbmcgZW5hYmxlZAotICogQHJpbmdfcG9zdGVuYWJsZToJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIGFmdGVyIG1hcmtpbmcgcmluZyBlbmFibGVkCi0gKiBAcmluZ19wcmVkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gcHJpb3IgdG8gbWFya2luZyByaW5nIGRpc2FibGVkCi0gKiBAcmluZ19wb3N0ZGlzYWJsZToJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIGFmdGVyIG1hcmtpbmcgcmluZyBkaXNhYmxlZAorICogQHByZWVuYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIHJpbmcgZW5hYmxlZAorICogQHBvc3RlbmFibGU6CQlbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGVuYWJsZWQKKyAqIEBwcmVkaXNhYmxlOgkJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIHByaW9yIHRvIG1hcmtpbmcgcmluZyBkaXNhYmxlZAorICogQHBvc3RkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGRpc2FibGVkCiAgICoqLwogc3RydWN0IGlpb19yaW5nX2J1ZmZlciB7CiAJc3RydWN0IGRldmljZSBkZXY7CkBAIC0xMzMsNyArMTM0LDEwIEBACiAJCQkgIHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyk7CiAKIC8qKgotICogX19paW9faW5pdF9yaW5nX2J1ZmZlcigpIC0gaW5pdGlhbGl6ZSBjb21tb24gZWxlbWVudHMgb2YgcmluZyBidWZmZXJzLgorICogX19paW9faW5pdF9yaW5nX2J1ZmZlcigpIC0gaW5pdGlhbGl6ZSBjb21tb24gZWxlbWVudHMgb2YgcmluZyBidWZmZXJzCisgKiBAcmluZzoJCXJpbmcgYnVmZmVyIHRoYXQgaXMgdGhlIGV2ZW50IHNvdXJjZQorICogQGJ5dGVzX3Blcl9kYXR1bToJc2l6ZSBvZiBpbmRpdmlkdWFsIGRhdHVtIGluY2x1ZGluZyB0aW1lc3RhbXAKKyAqIEBsZW5ndGg6CQludW1iZXIgb2YgZGF0dW1zIGluIHJpbmcKICAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lpb19pbml0X3JpbmdfYnVmZmVyKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcsCiAJCQkJIGludCBieXRlc19wZXJfZGF0dW0sIGludCBsZW5ndGgpCkBAIC0xNzEsNyArMTc1LDExIEBACiAJY29udGFpbmVyX29mKF9kZXZfYXR0ciwgc3RydWN0IGlpb19zY2FuX2VsLCBkZXZfYXR0cik7CiAKIC8qKgotICogaWlvX3NjYW5fZWxfc3RvcmUoKSAtIHN5c2ZzIHNjYW4gZWxlbWVudCBzZWxlY3Rpb24gaW50ZXJmYWNlLgorICogaWlvX3NjYW5fZWxfc3RvcmUoKSAtIHN5c2ZzIHNjYW4gZWxlbWVudCBzZWxlY3Rpb24gaW50ZXJmYWNlCisgKiBAZGV2OiB0aGUgdGFyZ2V0IGRldmljZQorICogQGF0dHI6IHRoZSBkZXZpY2UgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkCisgKiBAYnVmOiBpbnB1dCBmcm9tIHVzZXJzcGFjZQorICogQGxlbjogbGVuZ3RoIG9mIGlucHV0CiAgKgogICogQSBnZW5lcmljIGZ1bmN0aW9uIHVzZWQgdG8gZW5hYmxlIHZhcmlvdXMgc2NhbiBlbGVtZW50cy4gIEluIHNvbWUKICAqIGRldmljZXMgZXhwbGljaXQgcmVhZCBjb21tYW5kcyBmb3IgZWFjaCBjaGFubmVsIG1lYW4gdGhpcyBpcyBtZXJlbHkKQEAgLTE4NCwxMiArMTkyLDE1IEBACiAJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CiAvKioKICAqIGlpb19zY2FsX2VsX3Nob3coKSAtCXN5c2ZzIGludGVyZmFjZSB0byBxdWVyeSB3aGV0aGVyIGEgc2NhbiBlbGVtZW50IGlzCi0gKgkJCWlzIGVuYWJsZWQgb3Igbm90LgorICoJCQlpcyBlbmFibGVkIG9yIG5vdAorICogQGRldjogdGhlIHRhcmdldCBkZXZpY2UKKyAqIEBhdHRyOiB0aGUgZGV2aWNlIGF0dHJpYnV0ZSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZAorICogQGJ1Zjogb3V0cHV0IGJ1ZmZlcgogICoqLwogc3NpemVfdCBpaW9fc2Nhbl9lbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY2hhciAqYnVmKTsKIC8qKgotICogSUlPX1NDQU5fRUw6IC0gZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhIHNjYW4gZWxlbWVudCB3aXRob3V0IGNvbnRyb2wgZnVuYworICogSUlPX1NDQU5fRUwgLSBkZWNsYXJlIGFuZCBpbml0aWFsaXplIGEgc2NhbiBlbGVtZW50IHdpdGhvdXQgY29udHJvbCBmdW5jCiAgKiBAX25hbWU6CWlkZW50aWZ5aW5nIG5hbWUuIFJlc3VsdGluZyBzdHJ1Y3QgaXMgaWlvX3NjYW5fZWxfIyNfbmFtZSwKICAqCQlzeXNmcyBlbGVtZW50LCBzY2FuX2VuXyMjX25hbWUuCiAgKiBAX251bWJlcjoJdW5pcXVlIGlkIG51bWJlciBmb3IgdGhlIHNjYW4gZWxlbWVudC4KQEAgLTIxNCw4ICsyMjUsMTQgQEAKIHNzaXplX3QgaWlvX3NjYW5fZWxfdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNoYXIgKmJ1Zik7CiAvKioKLSAqIElJT19TQ0FOX0VMX0M6IC0gZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhIHNjYW4gZWxlbWVudCB3aXRoIGEgY29udHJvbCBmdW5jCisgKiBJSU9fU0NBTl9FTF9DIC0gZGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBhIHNjYW4gZWxlbWVudCB3aXRoIGEgY29udHJvbCBmdW5jCiAgKgorICogQF9uYW1lOglpZGVudGlmeWluZyBuYW1lLiBSZXN1bHRpbmcgc3RydWN0IGlzIGlpb19zY2FuX2VsXyMjX25hbWUsCisgKgkJc3lzZnMgZWxlbWVudCwgc2Nhbl9lbl8jI19uYW1lLgorICogQF9udW1iZXI6CXVuaXF1ZSBpZCBudW1iZXIgZm9yIHRoZSBzY2FuIGVsZW1lbnQuCisgKiBAX2JpdHM6CW51bWJlciBvZiBiaXRzIGluIHRoZSBzY2FuIGVsZW1lbnQgcmVzdWx0ICh1c2VkIGluIG1peGVkIGJpdAorICoJCWxlbmd0aCBkZXZpY2VzKS4KKyAqIEBfbGFiZWw6CWluZGVudGlmaWNhdGlvbiB2YXJpYWJsZSB1c2VkIGJ5IGRyaXZlcnMuICBPZnRlbiBhIHJlZyBhZGRyZXNzLgogICogQF9jb250cm9sZnVuYzogZnVuY3Rpb24gdXNlZCB0byBub3RpZnkgaGFyZHdhcmUgb2Ygd2hldGhlciBzdGF0ZSBjaGFuZ2VzCiAgKiovCiAjZGVmaW5lIElJT19TQ0FOX0VMX0MoX25hbWUsIF9udW1iZXIsIF9iaXRzLCBfbGFiZWwsIF9jb250cm9sZnVuYykJXApAQCAtMjMwLDcgKzI0Nyw3IEBACiAJCS5zZXRfc3RhdGUgPSBfY29udHJvbGZ1bmMsCQkJCVwKIAl9CiAvKioKLSAqIElJT19TQ0FOX0VMX1RJTUVTVEFNUDogLSBkZWNsYXJlIGEgc3BlY2lhbCBzY2FuIGVsZW1lbnQgZm9yIHRpbWVzdGFtcHMKKyAqIElJT19TQ0FOX0VMX1RJTUVTVEFNUCAtIGRlY2xhcmUgYSBzcGVjaWFsIHNjYW4gZWxlbWVudCBmb3IgdGltZXN0YW1wcwogICoKICAqIE9kZCBvbmUgb3V0LiBIYW5kbGVkIHNsaWdodGx5IGRpZmZlcmVudGx5IGZyb20gb3RoZXIgc2NhbiBlbGVtZW50cy4KICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19zdy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmgKaW5kZXggYWU3MGVlMC4uZjBiODZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmgKQEAgLTM2LDUyICszNiw2NSBAQAogI2lmIGRlZmluZWQgQ09ORklHX0lJT19TV19SSU5HIHx8IGRlZmluZWQgQ09ORklHX0lJT19TV19SSU5HX01PRFVMRQogCiAvKioKLSAqIGlpb19jcmVhdGVfc3dfcmIoKSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uCisgKiBpaW9fY3JlYXRlX3N3X3JiKCkgLSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBhbGxvY2F0aW9uCiAgKiBAcjoJCXBvaW50ZXIgdG8gcmluZyBidWZmZXIgcG9pbnRlcgogICoqLwogaW50IGlpb19jcmVhdGVfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqKnIpOwogCiAvKioKLSAqIGlpb19pbml0X3N3X3JiKCkgaW5pdGlhbGl6ZSB0aGUgc29mdHdhcmUgcmluZyBidWZmZXIKKyAqIGlpb19pbml0X3N3X3JiKCkgLSBpbml0aWFsaXplIHRoZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgogICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgotICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbC4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCiAgKiovCiBpbnQgaWlvX2luaXRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKIC8qKgotICogaWlvX2V4aXRfc3dfcmIoKSByZXZlcnNlIHdoYXQgd2FzIGRvbmUgaW4gaWlvX2luaXRfc3dfcmIKKyAqIGlpb19leGl0X3N3X3JiKCkgLSByZXZlcnNlIHdoYXQgd2FzIGRvbmUgaW4gaWlvX2luaXRfc3dfcmIKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIHZvaWQgaWlvX2V4aXRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX2ZyZWVfc3dfcmIoKSBmcmVlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgY29yZSByaW5nIGJ1ZmZlciBzdHJ1Y3QKKyAqIGlpb19mcmVlX3N3X3JiKCkgLSBmcmVlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgY29yZSByaW5nIGJ1ZmZlciBzdHJ1Y3QKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIHZvaWQgaWlvX2ZyZWVfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX21hcmtfc3dfcmJfaW5fdXNlKCkgcmVmZXJlbmNlIGNvdW50aW5nIHRvIHByZXZlbnQgaW5jb3JyZWN0IGNoYW5jZXMKKyAqIGlpb19tYXJrX3N3X3JiX2luX3VzZSgpIC0gcmVmZXJlbmNlIGNvdW50aW5nIHRvIHByZXZlbnQgaW5jb3JyZWN0IGNoYW5jZXMKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIHZvaWQgaWlvX21hcmtfc3dfcmJfaW5fdXNlKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAvKioKLSAqICBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZSgpIG5vdGlmeSB0aGUgcmluZyBidWZmZXIgdGhhdCB3ZSBkb24ndCBjYXJlIGFueW1vcmUKKyAqICBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZSgpIC0gbm90aWZ5IHRoZSByaW5nIGJ1ZmZlciB0aGF0IHdlIGRvbid0IGNhcmUgYW55bW9yZQorICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAogICoqLwogdm9pZCBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fcmVhZF9sYXN0X2Zyb21fc3dfcmIoKSBhdHRlbXB0IHRvIHJlYWQgdGhlIGxhc3Qgc3RvcmVkIGRhdHVtIGZyb20gdGhlIHJiCisgKiBpaW9fcmVhZF9sYXN0X2Zyb21fc3dfcmIoKSAtIGF0dGVtcHQgdG8gcmVhZCB0aGUgbGFzdCBzdG9yZWQgZGF0dW0gZnJvbSB0aGUgcmIKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKKyAqIEBkYXRhOgl3aGVyZSB0byBzdG9yZSB0aGUgbGFzdCBkYXR1bQogICoqLwogaW50IGlpb19yZWFkX2xhc3RfZnJvbV9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCB1OCAqZGF0YSk7CiAKIC8qKgotICogaWlvX3N0b3JlX3RvX3N3X3JiKCkgc3RvcmUgYSBuZXcgZGF0dW0gdG8gdGhlIHJpbmcgYnVmZmVyCi0gKiBAcmI6CXBvaW50ZXIgdG8gcmluZyBidWZmZXIgaW5zdGFuY2UKLSAqIEBkYXRhOgl0aGUgZGF0dW0gdG8gYmUgc3RvcmVkIGluY2x1ZGluZyB0aW1lc3RhbXAgaWYgcmVsZXZhbnQuCi0gKiBAdGltZXN0YW1wOgl0aW1lc3RhbXAgd2hpY2ggd2lsbCBiZSBhdHRhY2hlZCB0byBidWZmZXIgZXZlbnRzIGlmIHJlbGV2YW50LgorICogaWlvX3N0b3JlX3RvX3N3X3JiKCkgLSBzdG9yZSBhIG5ldyBkYXR1bSB0byB0aGUgcmluZyBidWZmZXIKKyAqIEByOgkJcG9pbnRlciB0byByaW5nIGJ1ZmZlciBpbnN0YW5jZQorICogQGRhdGE6CXRoZSBkYXR1bSB0byBiZSBzdG9yZWQgaW5jbHVkaW5nIHRpbWVzdGFtcCBpZiByZWxldmFudAorICogQHRpbWVzdGFtcDoJdGltZXN0YW1wIHdoaWNoIHdpbGwgYmUgYXR0YWNoZWQgdG8gYnVmZmVyIGV2ZW50cyBpZiByZWxldmFudAogICoqLwogaW50IGlpb19zdG9yZV90b19zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCB1OCAqZGF0YSwgczY0IHRpbWVzdGFtcCk7CiAKIC8qKgotICogaWlvX3JpcF9zd19yYigpIGF0dGVtcHQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHJpbmcgYnVmZmVyCisgKiBpaW9fcmlwX3N3X3JiKCkgLSBhdHRlbXB0IHRvIHJlYWQgZGF0YSBmcm9tIHRoZSByaW5nIGJ1ZmZlcgogICogQHI6CQkJcmluZyBidWZmZXIgaW5zdGFuY2UKICAqIEBjb3VudDoJCW51bWJlciBvZiBkYXR1bSdzIHRvIHRyeSBhbmQgcmVhZAogICogQGRhdGE6CQl3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZC4KQEAgLTk0LDM4ICsxMDcsNTMgQEAKIAkJICBpbnQgKmRlYWRfb2Zmc2V0KTsKIAogLyoqCi0gKiBpaW9fcmVxdWVzdF91cGRhdGVfc3dfcmIoKSB1cGRhdGUgcGFyYW1zIGlmIHVwZGF0ZSBuZWVkZWQKKyAqIGlpb19yZXF1ZXN0X3VwZGF0ZV9zd19yYigpIC0gdXBkYXRlIHBhcmFtcyBpZiB1cGRhdGUgbmVlZGVkCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCiAgKiovCiBpbnQgaWlvX3JlcXVlc3RfdXBkYXRlX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAvKioKLSAqIGlpb19tYXJrX3VwZGF0ZV9uZWVkZWRfc3dfcmIoKSB0ZWxsIHRoZSByaW5nIGJ1ZmZlciBpdCBuZWVkcyBhIHBhcmFtIHVwZGF0ZQorICogaWlvX21hcmtfdXBkYXRlX25lZWRlZF9zd19yYigpIC0gdGVsbCB0aGUgcmluZyBidWZmZXIgaXQgbmVlZHMgYSBwYXJhbSB1cGRhdGUKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIGludCBpaW9fbWFya191cGRhdGVfbmVlZGVkX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOwogCiAKIC8qKgotICogaWlvX2dldF9icGRfc3dfcmIoKSBnZXQgdGhlIGRhdHVtIHNpemUgaW4gYnl0ZXMKKyAqIGlpb19nZXRfYnBkX3N3X3JiKCkgLSBnZXQgdGhlIGRhdHVtIHNpemUgaW4gYnl0ZXMKKyAqIEByOgkJcG9pbnRlciB0byBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyIGNyZWF0ZWQgYnkgYW4KKyAqCQlpaW9fY3JlYXRlX3N3X3JiIGNhbGwKICAqKi8KIGludCBpaW9fZ2V0X2JwZF9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKTsKIAogLyoqCi0gKiBpaW9fc2V0X2JwZF9zd19yYigpIHNldCB0aGUgZGF0dW0gc2l6ZSBpbiBieXRlcworICogaWlvX3NldF9icGRfc3dfcmIoKSAtIHNldCB0aGUgZGF0dW0gc2l6ZSBpbiBieXRlcworICogQHI6CQlwb2ludGVyIHRvIGEgc29mdHdhcmUgcmluZyBidWZmZXIgY3JlYXRlZCBieSBhbgorICoJCWlpb19jcmVhdGVfc3dfcmIgY2FsbAorICogQGJwZDoJYnl0ZXMgcGVyIGRhdHVtIHZhbHVlCiAgKiovCiBpbnQgaWlvX3NldF9icGRfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgc2l6ZV90IGJwZCk7CiAKIC8qKgotICogaWlvX2dldF9sZW5ndGhfc3dfcmIoKSBnZXQgaG93IG1hbnkgZGF0dW1zIHRoZSByYiBtYXkgY29udGFpbgorICogaWlvX2dldF9sZW5ndGhfc3dfcmIoKSAtIGdldCBob3cgbWFueSBkYXR1bXMgdGhlIHJiIG1heSBjb250YWluCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCiAgKiovCiBpbnQgaWlvX2dldF9sZW5ndGhfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcik7CiAKIC8qKgotICogaWlvX3NldF9sZW5ndGhfc3dfcmIoKSBzZXQgaG93IG1hbnkgZGF0dW1zIHRoZSByYiBtYXkgY29udGFpbgorICogaWlvX3NldF9sZW5ndGhfc3dfcmIoKSAtIHNldCBob3cgbWFueSBkYXR1bXMgdGhlIHJiIG1heSBjb250YWluCisgKiBAcjoJCXBvaW50ZXIgdG8gYSBzb2Z0d2FyZSByaW5nIGJ1ZmZlciBjcmVhdGVkIGJ5IGFuCisgKgkJaWlvX2NyZWF0ZV9zd19yYiBjYWxsCisgKiBAbGVuZ3RoOgltYXggbnVtYmVyIG9mIGRhdGEgaXRlbXMgZm9yIHRoZSByaW5nIGJ1ZmZlcgogICoqLwogaW50IGlpb19zZXRfbGVuZ3RoX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsIGludCBsZW5ndGgpOwogCiAvKioKLSAqIGlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCkgaGVscGVyIGZ1bmN0aW9uIHRvIHNldCB1cCByYiBhY2Nlc3MKKyAqIGlpb19yaW5nX3N3X3JlZ2lzdGVyX2Z1bmNzKCkgLSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVwIHJiIGFjY2VzcworICogQHJhOgkJcG9pbnRlciB0byBAaWlvX3JpbmdfYWNjZXNzX2Z1bmNzCiAgKiovCiBzdGF0aWMgaW5saW5lIHZvaWQgaWlvX3Jpbmdfc3dfcmVnaXN0ZXJfZnVuY3Moc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyAqcmEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKaW5kZXggYmZlNDA1NS4uZTUwMWUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaApAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgImlpby5oIgogCiAvKioKLSAqIHN0cnVjdCBpaW9fZXZlbnRfYXR0cmlidXRlIC0gZXZlbnQgY29udHJvbCBhdHRyaWJ1dGUKKyAqIHN0cnVjdCBpaW9fZXZlbnRfYXR0ciAtIGV2ZW50IGNvbnRyb2wgYXR0cmlidXRlCiAgKiBAZGV2X2F0dHI6CXVuZGVybHlpbmcgZGV2aWNlIGF0dHJpYnV0ZQogICogQG1hc2s6CW1hc2sgZm9yIHRoZSBldmVudCB3aGVuIGRldGVjdGluZwogICogQGxpc3RlbDoJbGlzdCBoZWFkZXIgdG8gYWxsb3cgYWRkaXRpb24gdG8gbGlzdCBvZiBldmVudCBoYW5kbGVycwpAQCAtNTQsNiArNTQsNyBAQAogICogc3RydWN0IGlpb19kZXZfYXR0ciAtIGlpbyBzcGVjaWZpYyBkZXZpY2UgYXR0cmlidXRlCiAgKiBAZGV2X2F0dHI6CXVuZGVybHlpbmcgZGV2aWNlIGF0dHJpYnV0ZQogICogQGFkZHJlc3M6CWFzc29jaWF0ZWQgcmVnaXN0ZXIgYWRkcmVzcworICogQHZhbDI6CXNlY29uZGFyeSBhdHRyaWJ1dGUgdmFsdWUKICAqLwogc3RydWN0IGlpb19kZXZfYXR0ciB7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CkBAIC03MSw2ICs3Miw4IEBACiAvKioKICAqIHN0cnVjdCBpaW9fY29uc3RfYXR0ciAtIGNvbnN0YW50IGRldmljZSBzcGVjaWZpYyBhdHRyaWJ1dGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mdGVuIHVzZWQgZm9yIHRoaW5ncyBsaWtlIGF2YWlsYWJsZSBtb2RlcworICogQHN0cmluZzoJYXR0cmlidXRlIHN0cmluZworICogQGRldl9hdHRyOgl1bmRlcmx5aW5nIGRldmljZSBhdHRyaWJ1dGUKICAqLwogc3RydWN0IGlpb19jb25zdF9hdHRyIHsKIAljb25zdCBjaGFyICpzdHJpbmc7CkBAIC04MCw3ICs4Myw3IEBACiAjZGVmaW5lIHRvX2lpb19jb25zdF9hdHRyKF9kZXZfYXR0cikgXAogCWNvbnRhaW5lcl9vZihfZGV2X2F0dHIsIHN0cnVjdCBpaW9fY29uc3RfYXR0ciwgZGV2X2F0dHIpCiAKLS8qIFNvbWUgYXR0cmlidXRlcyB3aWxsIGJlIGhhcmQgY29kZWQgKGRldmljZSBkZXBlbmRhbnQpIGFuZCBub3QgcmVxdWlyZSBhbgorLyogU29tZSBhdHRyaWJ1dGVzIHdpbGwgYmUgaGFyZCBjb2RlZCAoZGV2aWNlIGRlcGVuZGVudCkgYW5kIG5vdCByZXF1aXJlIGFuCiAgICBhZGRyZXNzLCBpbiB0aGVzZSBjYXNlcyBwYXNzIGEgbmVnYXRpdmUgKi8KICNkZWZpbmUgSUlPX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKIAl7IC5kZXZfYXR0ciA9IF9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpLAlcCkBAIC0xMDgsMTAyICsxMTEsMTMwIEBACiAvKiBHZW5lcmljIGF0dHJpYnV0ZXMgb2Ygb25ldHlwZSBvciBhbm90aGVyICovCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX1JFRzogcmV2aXNpb24gbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgKiBJSU9fREVWX0FUVFJfUkVWIC0gcmV2aXNpb24gbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCiAgKiBWZXJ5IG11Y2ggZGV2aWNlIGRlcGVuZGVudC4KICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1JFVihfc2hvdykJCQlcCiAJSUlPX0RFVklDRV9BVFRSKHJldmlzaW9uLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKwogLyoqCi0gKiBJSU9fREVWX0FUVFJfTkFNRTogY2hpcCB0eXBlIGRlcGVuZGFudCBpZGVudGlmaWVyCisgKiBJSU9fREVWX0FUVFJfTkFNRSAtIGNoaXAgdHlwZSBkZXBlbmRlbnQgaWRlbnRpZmllcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9OQU1FKF9zaG93KQkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9TQU1QX0ZSRVE6IHNldHMgYW55IGludGVybmFsIGNsb2NrIGZyZXF1ZW5jeQorICogSUlPX0RFVl9BVFRSX1NBTVBfRlJFUSAtIHNldHMgYW55IGludGVybmFsIGNsb2NrIGZyZXF1ZW5jeQorICogQF9tb2RlOiBzeXNmcyBmaWxlIG1vZGUvcGVybWlzc2lvbnMKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoX21vZGUsIF9zaG93LCBfc3RvcmUpCQkJXAogCUlJT19ERVZJQ0VfQVRUUihzYW1wbGluZ19mcmVxdWVuY3ksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9BVkFJTF9TQU1QX0ZSRVE6IGxpc3QgYXZhaWxhYmxlIHNhbXBsaW5nIGZyZXF1ZW5jaWVzLgorICogSUlPX0RFVl9BVFRSX0FWQUlMX1NBTVBfRlJFUSAtIGxpc3QgYXZhaWxhYmxlIHNhbXBsaW5nIGZyZXF1ZW5jaWVzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCi0gKiBNYXkgYmUgbW9kZSBkZXBlbmRhbnQgb24gc29tZSBkZXZpY2VzCisgKiBNYXkgYmUgbW9kZSBkZXBlbmRlbnQgb24gc29tZSBkZXZpY2VzCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9TQU1QX0ZSRVEoX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX3NhbXBsaW5nX2ZyZXF1ZW5jeSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0NPTlNUX0FWQUlMX1NBTVBfRlJFUTogbGlzdCBhdmFpbGFibGUgc2FtcGxpbmcgZnJlcXVlbmNpZXMuCisgKiBJSU9fQ09OU1RfQVRUUl9BVkFJTF9TQU1QX0ZSRVEgLSBsaXN0IGF2YWlsYWJsZSBzYW1wbGluZyBmcmVxdWVuY2llcworICogQF9zdHJpbmc6IGZyZXF1ZW5jeSBzdHJpbmcgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCiAgKiBDb25zdGFudCB2ZXJzaW9uCiAgKiovCiAjZGVmaW5lIElJT19DT05TVF9BVFRSX0FWQUlMX1NBTVBfRlJFUShfc3RyaW5nKQlcCiAJSUlPX0NPTlNUX0FUVFIoYXZhaWxhYmxlX3NhbXBsaW5nX2ZyZXF1ZW5jeSwgX3N0cmluZykKKwogLyoqCi0gKiBJSU9fREVWX0FUVFJfU0NBTl9NT0RFOiBzZWxlY3QgYSBzY2FuIG1vZGUKKyAqIElJT19ERVZfQVRUUl9TQ0FOX01PREUgLSBzZWxlY3QgYSBzY2FuIG1vZGUKKyAqIEBfbW9kZTogc3lzZnMgZmlsZSBtb2RlL3Blcm1pc3Npb25zCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoKICAqIFRoaXMgaXMgdXNlZCB3aGVuIG9ubHkgY2VydGFpbiBjb21iaW5hdGlvbnMgb2YgaW5wdXRzIG1heSBiZSByZWFkIGluIG9uZQogICogc2Nhbi4KICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1NDQU5fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKIAlJSU9fREVWSUNFX0FUVFIoc2Nhbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKKwogLyoqCi0gKiBJSU9fREVWX0FUVFJfQVZBSUxfU0NBTl9NT0RFUzogbGlzdCBhdmFpbGFibGUgc2NhbiBtb2RlcworICogSUlPX0RFVl9BVFRSX0FWQUlMX1NDQU5fTU9ERVMgLSBsaXN0IGF2YWlsYWJsZSBzY2FuIG1vZGVzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUlMX1NDQU5fTU9ERVMoX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX3NjYW5fbW9kZXMsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQogCiAvKioKLSAqIElJT19ERVZfQVRUUl9TQ0FOOiByZXN1bHQgb2Ygc2NhbiBvZiBtdWx0aXBsZSBjaGFubmVscworICogSUlPX0RFVl9BVFRSX1NDQU4gLSByZXN1bHQgb2Ygc2NhbiBvZiBtdWx0aXBsZSBjaGFubmVscworICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9TQ0FOKF9zaG93KQkJXAogCUlJT19ERVZJQ0VfQVRUUihzY2FuLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCk7CiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0lOUFVUOiBkaXJlY3QgcmVhZCBvZiBhIHNpbmdsZSBpbnB1dCBjaGFubmVsCisgKiBJSU9fREVWX0FUVFJfSU5QVVQgLSBkaXJlY3QgcmVhZCBvZiBhIHNpbmdsZSBpbnB1dCBjaGFubmVsCisgKiBAX251bWJlcjogaW5wdXQgY2hhbm5lbCBudW1iZXIKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfSU5QVVQoX251bWJlciwgX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoaW4jI19udW1iZXIsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfbnVtYmVyKQogCi0KIC8qKgotICogSUlPX0RFVl9BVFRSX1NXX1JJTkdfRU5BQkxFOiBlbmFibGUgc29mdHdhcmUgcmluZyBidWZmZXIKKyAqIElJT19ERVZfQVRUUl9TV19SSU5HX0VOQUJMRSAtIGVuYWJsZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCi0gKiBTdWNjZXNzIG1heSBiZSBkZXBlbmRhbnQgb24gYXR0YWNobWVudCBvZiB0cmlnZ2VyIHByZXZpb3VzbHkKKyAqIFN1Y2Nlc3MgbWF5IGJlIGRlcGVuZGVudCBvbiBhdHRhY2htZW50IG9mIHRyaWdnZXIgcHJldmlvdXNseS4KICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1NXX1JJTkdfRU5BQkxFKF9zaG93LCBfc3RvcmUpCQkJXAogCUlJT19ERVZJQ0VfQVRUUihzd19yaW5nX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIF9zaG93LCBfc3RvcmUsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0hXX1JJTkdfRU5BQkxFOiBlbmFibGUgaGFyZHdhcmUgcmluZyBidWZmZXIKKyAqIElJT19ERVZfQVRUUl9IV19SSU5HX0VOQUJMRSAtIGVuYWJsZSBoYXJkd2FyZSByaW5nIGJ1ZmZlcgorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqCi0gKiBUaGlzIGlzIGEgZGlmZmVyZW50IGF0dHJpYnV0ZSBmcm9tIHRoZSBzb2Z0d2FyZSBvbmUgYXMgb25lIGNhbiBpbnZpc2lvbgorICogVGhpcyBpcyBhIGRpZmZlcmVudCBhdHRyaWJ1dGUgZnJvbSB0aGUgc29mdHdhcmUgb25lIGFzIG9uZSBjYW4gZW52aXNpb24KICAqIHNjaGVtZXMgd2hlcmUgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIG1heSBiZSB1c2VkLgogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfSFdfUklOR19FTkFCTEUoX3Nob3csIF9zdG9yZSkJCQlcCiAJSUlPX0RFVklDRV9BVFRSKGh3X3JpbmdfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgX3Nob3csIF9zdG9yZSwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfQlBTRTogc2V0IG51bWJlciBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQKKyAqIElJT19ERVZfQVRUUl9CUFNFIC0gc2V0IG51bWJlciBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQKKyAqIEBfbW9kZTogc3lzZnMgZmlsZSBtb2RlL3Blcm1pc3Npb25zCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfc3RvcmU6IGlucHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQogICoqLwogI2RlZmluZSBJSU9fREVWX0FUVFJfQlBTRShfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKIAlJSU9fREVWSUNFX0FUVFIoYnBzZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX0JQU0VfQVZBSUxBQkxFOiBubyBvZiBiaXRzIHBlciBzY2FuIGVsZW1lbnQgc3VwcG9ydGVkCisgKiBJSU9fREVWX0FUVFJfQlBTRV9BVkFJTEFCTEUgLSBudW1iZXIgb2YgYml0cyBwZXIgc2NhbiBlbGVtZW50IHN1cHBvcnRlZAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKiovCiAjZGVmaW5lIElJT19ERVZfQVRUUl9CUFNFX0FWQUlMQUJMRShfc2hvdykJCQkJXAogCUlJT19ERVZJQ0VfQVRUUihicHNlX2F2YWlsYWJsZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAKIC8qKgotICogSUlPX0RFVl9BVFRSX1RFTVA6IG1hbnkgc2Vuc29ycyBoYXZlIGF1eGlsaWFyeSB0ZW1wZXJhdHVyZSBzZW5zb3JzCisgKiBJSU9fREVWX0FUVFJfVEVNUCAtIG1hbnkgc2Vuc29ycyBoYXZlIGF1eGlsaWFyeSB0ZW1wZXJhdHVyZSBzZW5zb3JzCisgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKICAqKi8KICNkZWZpbmUgSUlPX0RFVl9BVFRSX1RFTVAoX3Nob3cpCQkJXAogCUlJT19ERVZJQ0VfQVRUUih0ZW1wLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKwogLyoqCi0gKiBJSU9fRVZFTlRfU0g6IGdlbmVyaWMgc2hhcmVkIGV2ZW50IGhhbmRsZXIKKyAqIElJT19FVkVOVF9TSCAtIGdlbmVyaWMgc2hhcmVkIGV2ZW50IGhhbmRsZXIKKyAqIEBfbmFtZTogZXZlbnQgbmFtZQorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoKICAqIFRoaXMgaXMgdXNlZCBpbiBjYXNlcyB3aGVyZSBtb3JlIHRoYW4gb25lIGV2ZW50IG1heSByZXN1bHQgZnJvbSBhIHNpbmdsZQogICogaGFuZGxlci4gIE9mdGVuIHRoZSBjYXNlIHRoYXQgc29tZSBhbGFybSByZWdpc3RlciBtdXN0IGJlIHJlYWQgYW5kIG11bHRpcGxlCkBAIC0yMjEsOCArMjUyLDE0IEBACiAJCQkucHJldiA9ICZpaW9fZXZlbnRfIyNfbmFtZS5saXN0LAkJXAogCQl9LAkJCQkJCQlcCiAJfTsKKwogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9TSDogZ2VuZXJpYyBzaGFyZWQgZXZlbnQgYXR0cmlidXRlCisgKiBJSU9fRVZFTlRfQVRUUl9TSCAtIGdlbmVyaWMgc2hhcmVkIGV2ZW50IGF0dHJpYnV0ZQorICogQF9uYW1lOiBldmVudCBuYW1lCisgKiBAX2V2X2xpc3Q6IGV2ZW50IGhhbmRsZXIgbGlzdAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAogICoKICAqIEFuIGF0dHJpYnV0ZSB3aXRoIGFuIGFzc29jaWF0ZWQgSUlPX0VWRU5UX1NICiAgKiovCkBAIC0yMzUsNyArMjcyLDEyIEBACiAJICAgIC5saXN0ZWwgPSAmX2V2X2xpc3QgfTsKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUjogbm9uIHNoYXJlZCBldmVudCBhdHRyaWJ1dGUKKyAqIElJT19FVkVOVF9BVFRSIC0gbm9uLXNoYXJlZCBldmVudCBhdHRyaWJ1dGUKKyAqIEBfbmFtZTogZXZlbnQgbmFtZQorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUihfbmFtZSwgX3Nob3csIF9zdG9yZSwgX21hc2ssIF9oYW5kbGVyKQkJXAogCXN0YXRpYyBzdHJ1Y3QgaWlvX2V2ZW50X2hhbmRsZXJfbGlzdAkJCQlcCkBAIC0yNTEsMTAgKzI5MywxNCBAQAogCSAgICAubGlzdGVsID0gJmlpb19ldmVudF8jI19uYW1lIH07CQkJCVwKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9EQVRBX1JEWTogZXZlbnQgZHJpdmVuIGJ5IGRhdGEgcmVhZHkgc2lnbmFsCisgKiBJSU9fRVZFTlRfQVRUUl9EQVRBX1JEWSAtIGV2ZW50IGRyaXZlbiBieSBkYXRhIHJlYWR5IHNpZ25hbAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoKICAqIE5vdCB0eXBpY2FsbHkgaW1wbGVtZW50ZWQgaW4gZGV2aWNlcyB3aGVyZSBmdWxsIHRyaWdnZXJpbmcgc3VwcG9ydAotICogaGFzIGJlZW4gaW1wbGVtZW50ZWQKKyAqIGhhcyBiZWVuIGltcGxlbWVudGVkLgogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9EQVRBX1JEWShfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpIFwKIAlJSU9fRVZFTlRfQVRUUihkYXRhX3JkeSwgX3Nob3csIF9zdG9yZSwgX21hc2ssIF9oYW5kbGVyKQpAQCAtMjY5LDE5ICszMTUsMzEgQEAKICNkZWZpbmUgSUlPX0VWRU5UX0NPREVfREVWSUNFX1NQRUNJRklDCTEwMDAKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTEw6IHJpbmcgYnVmZmVyIGV2ZW50IHRvIGluZGljYXRlIDUwJSBmdWxsCisgKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTEwgLSByaW5nIGJ1ZmZlciBldmVudCB0byBpbmRpY2F0ZSA1MCUgZnVsbAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAorICogQF9oYW5kbGVyOiBoYW5kbGVyIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9SSU5HXzUwX0ZVTEwoX3Nob3csIF9zdG9yZSwgX21hc2ssIF9oYW5kbGVyKQlcCiAJSUlPX0VWRU5UX0FUVFIocmluZ181MF9mdWxsLCBfc2hvdywgX3N0b3JlLCBfbWFzaywgX2hhbmRsZXIpCiAKIC8qKgotICogSUlPX0VWRU5UX0FUVFJfUklOR181MF9GVUxMX1NIOiBzaGFyZWQgcmluZyBldmVudCB0byBpbmRpY2F0ZSA1MCUgZnVsbAorICogSUlPX0VWRU5UX0FUVFJfUklOR181MF9GVUxMX1NIIC0gc2hhcmVkIHJpbmcgZXZlbnQgdG8gaW5kaWNhdGUgNTAlIGZ1bGwKKyAqIEBfZXZsaXN0OiBldmVudCBoYW5kbGVyIGxpc3QKKyAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQorICogQF9zdG9yZTogaW5wdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX21hc2s6IG1hc2sgdXNlZCB3aGVuIGRldGVjdGluZyB0aGUgZXZlbnQKICAqKi8KICNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfUklOR181MF9GVUxMX1NIKF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQlcCiAJSUlPX0VWRU5UX0FUVFJfU0gocmluZ181MF9mdWxsLCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKIAogLyoqCi0gKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzc1X0ZVTExfU0g6IHNoYXJlZCByaW5nIGV2ZW50IHRvIGluZGljYXRlIDc1JSBmdWxsCisgKiBJSU9fRVZFTlRfQVRUUl9SSU5HXzc1X0ZVTExfU0ggLSBzaGFyZWQgcmluZyBldmVudCB0byBpbmRpY2F0ZSA3NSUgZnVsbAorICogQF9ldmxpc3Q6IGV2ZW50IGhhbmRsZXIgbGlzdAorICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCisgKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKKyAqIEBfbWFzazogbWFzayB1c2VkIHdoZW4gZGV0ZWN0aW5nIHRoZSBldmVudAogICoqLwogI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9SSU5HXzc1X0ZVTExfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKIAlJSU9fRVZFTlRfQVRUUl9TSChyaW5nXzc1X2Z1bGwsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaAppbmRleCA4Mjg0MDk4Li43ODRlN2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaApAQCAtMTksMTYgKzE5LDE4IEBACiAgKiBAaWQ6CQkJW0lOVEVSTl0gdW5pcXVlIGlkIG51bWJlcgogICogQG5hbWU6CQlbRFJJVkVSXSB1bmlxdWUgbmFtZQogICogQGRldjoJCVtEUklWRVJdIGFzc29jaWF0ZWQgZGV2aWNlIChpZiByZWxldmFudCkKLSAqIEBzeXNmc19kZXY6CQlbSU5URVJOXSBzeXNmcyByZWxldmFudCBkZXZpY2UKICAqIEBwcml2YXRlX2RhdGE6CVtEUklWRVJdIGRldmljZSBzcGVjaWZpYyBkYXRhCiAgKiBAbGlzdDoJCVtJTlRFUk5dIHVzZWQgaW4gbWFpbnRlbmFuY2Ugb2YgZ2xvYmFsIHRyaWdnZXIgbGlzdAogICogQGFsbG9jX2xpc3Q6CQlbRFJJVkVSXSB1c2VkIGZvciBkcml2ZXIgc3BlY2lmaWMgdHJpZ2dlciBsaXN0Ci0gKiBAcG9sbF9mdW5jX2xpc3RfbG9jazpbSU5URVJOXSBwcm90ZWN0aW9uIG9mIHRoZSBwb2xsaW5nIGZ1bmN0aW9uIGxpc3QKKyAqIEBwb2xsZnVuY19saXN0X2xvY2s6CVtJTlRFUk5dIHByb3RlY3Rpb24gb2YgdGhlIHBvbGxpbmcgZnVuY3Rpb24gbGlzdAogICogQHBvbGxmdW5jX2xpc3Q6CVtJTlRFUk5dIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHJ1biBvbiB0cmlnZ2VyLgogICogQGNvbnRyb2xfYXR0cnM6CVtEUklWRVJdIHN5c2ZzIGF0dHJpYnV0ZXMgcmVsZXZhbnQgdG8gdHJpZ2dlciB0eXBlCi0gKiBAc2V0X3RyaWdnZXJfc3RhdGU6CVtEUklWRVJdIHN3aXRjaCBvbi9vZmYgdGhlIHRyaWdnZXIgb24gZGVtYW5kCiAgKiBAdGltZXN0YW1wOgkJW0lOVEVSTl0gdGltZXN0YW1wIHVzZXNkIGJ5IHNvbWUgdHJpZ3MgKGUuZy4gZGF0YXJkeSkKICAqIEBvd25lcjoJCVtEUklWRVJdIHVzZWQgdG8gbW9uaXRvciB1c2FnZSBjb3VudCBvZiB0aGUgdHJpZ2dlci4KKyAqIEB1c2VfY291bnQ6CQl1c2UgY291bnQgZm9yIHRoZSB0cmlnZ2VyCisgKiBAc2V0X3RyaWdnZXJfc3RhdGU6CVtEUklWRVJdIHN3aXRjaCBvbi9vZmYgdGhlIHRyaWdnZXIgb24gZGVtYW5kCisgKiBAdHJ5X3JlZW5hYmxlOglmdW5jdGlvbiB0byByZWVuYWJsZSB0aGUgdHJpZ2dlciB3aGVuIHRoZQorICoJCQl1c2UgY291bnQgaXMgemVybyAobWF5IGJlIE5VTEwpCiAgKiovCiBzdHJ1Y3QgaWlvX3RyaWdnZXIgewogCWludAkJCQlpZDsKQEAgLTY4LDYgKzcwLDkgQEAKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9yZWFkX25hbWUoKSAtIHN5c2ZzIGFjY2VzcyBmdW5jdGlvbiB0byBnZXQgdGhlIHRyaWdnZXIgbmFtZQorICogQGRldjogdGhlIHN5c3RlbSBkZXZpY2UKKyAqIEBhdHRyOiBkZXZpY2UgYXR0cmlidXRlcyBmb3IgdGhlIGRldmljZQorICogQGJ1Zjogb3V0cHV0IGJ1ZmZlciB0byBzdG9yZSB0aGUgdHJpZ2dlciBuYW1lCiAgKiovCiBzc2l6ZV90IGlpb190cmlnZ2VyX3JlYWRfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTc5LDYgKzg0LDggQEAKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9maW5kX2J5X25hbWUoKSAtIHNlYXJjaCBnbG9iYWwgdHJpZ2dlciBsaXN0CisgKiBAbmFtZTogdHJpZ2dlciBuYW1lIHRvIHNlYXJjaCBmb3IKKyAqIEBsZW46IHRyaWdnZXIgbmFtZSBzdHJpbmcgbGVuZ3RoIHRvIGNvbXBhcmUKICAqKi8KIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX3RyaWdnZXJfZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pOwogCkBAIC05MCwzMiArOTcsMzUgQEAKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIGEgdHJpZ2dlciBmcm9tIHRoZSBjb3JlCisgKiBAdHJpZ19pbmZvOgl0cmlnZ2VyIHRvIGJlIHVucmVnaXN0ZXJlZAogICoqLwogdm9pZCBpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKCkgLSBhZGQgYSBmdW5jdGlvbiBwYWlyIHRvIGJlIHJ1biBvbiB0cmlnZ2VyCiAgKiBAdHJpZzoJdHJpZ2dlciB0byB3aGljaCB0aGUgZnVuY3Rpb24gcGFpciBhcmUgYmVpbmcgYWRkZWQKLSAqIEBwZjoJcG9sbCBmdW5jdGlvbiBwYWlyCisgKiBAcGY6CQlwb2xsIGZ1bmN0aW9uIHBhaXIKICAqKi8KIGludCBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKIAkJCQkgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKTsKIAogLyoqCiAgKiBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYygpIC0JcmVtb3ZlIGZ1bmN0aW9uIHBhaXIgZnJvbSB0aG9zZSB0byBiZQotICoJCQkJCXJ1biBvbiB0cmlnZ2VyLgotICogQHRyaWc6CXRyaWdnZXIgZnJvbSB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZC4KKyAqCQkJCQlydW4gb24gdHJpZ2dlcgorICogQHRyaWc6CXRyaWdnZXIgZnJvbSB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZAogICogQHBmOgkJcG9sbCBmdW5jdGlvbiBwYWlyCiAgKiovCiBpbnQgaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAogCQkJCSAgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKTsKIAogLyoqCi0gKiBpaW9fdHJpZ2dlcl9wb2xsKCkgLSBjYWxsZWQgb24gYSB0cmlnZ2VyIG9jY3VyaW5nCisgKiBpaW9fdHJpZ2dlcl9wb2xsKCkgLSBjYWxsZWQgb24gYSB0cmlnZ2VyIG9jY3VycmluZworICogQHRyaWc6IHRyaWdnZXIgd2hpY2ggb2NjdXJyZWQKKyAqCiAgKiBUeXBpY2FsbHkgY2FsbGVkIGluIHJlbGV2YW50IGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGVyLgogICoqLwotdm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqKTsKLXZvaWQgaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3RydWN0IGlpb190cmlnZ2VyICopOwordm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7Cit2b2lkIGlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CiAKIC8qKgogICogc3RydWN0IGlpb19wb2xsX2Z1bmMgLSBwb2xsIGZ1bmN0aW9uIHBhaXIKQEAgLTEyNywxMSArMTM3LDEwIEBACiAgKgkJCQljb250cm9sIG9uIHNlbnNvciBzdXBwb3J0aW5nIGl0LgogICogQHBvbGxfZnVuY19tYWluOgkJZnVuY3Rpb24gaW4gaGVyZSBpcyBydW4gYWZ0ZXIgYWxsIGltbWVkaWF0ZXMuCiAgKgkJCQlSZWFkaW5nIGZyb20gc2Vuc29yIGV0YyB0eXBpY2FsbHkgaW52b2x2ZXMKLSAqCQkJCXNjaGVkdWxpbmcKLSAqCQkJCWZyb20gaGVyZS4KKyAqCQkJCXNjaGVkdWxpbmcgZnJvbSBoZXJlLgogICoKLSAqIFRoZSB0d28gc3RhZ2UgYXBwcm9hY2ggdXNlZCBoZXJlIG9ubHkgaW1wb3J0YW50IHdoZW4gbXVsdGlwbGUgc2Vuc29ycyBhcmUKLSAqIGJlaW5nIHRyaWdnZXJlZCBieSBhIHNpbmdsZSB0cmlnZ2VyLiBUaGlzIHJlYWxseSBjb21lcyBpbnRvIGl0J3Mgb3duIHdpdGgKKyAqIFRoZSB0d28gc3RhZ2UgYXBwcm9hY2ggdXNlZCBoZXJlIGlzIG9ubHkgaW1wb3J0YW50IHdoZW4gbXVsdGlwbGUgc2Vuc29ycyBhcmUKKyAqIGJlaW5nIHRyaWdnZXJlZCBieSBhIHNpbmdsZSB0cmlnZ2VyLiBUaGlzIHJlYWxseSBjb21lcyBpbnRvIGl0cyBvd24gd2l0aAogICogc2ltdWx0YW5lb3VzIHNhbXBsaW5nIGRldmljZXMgd2hlcmUgYSBzaW1wbGUgbGF0Y2ggY29tbWFuZCBjYW4gYmUgdXNlZCB0bwogICogbWFrZSB0aGUgZGV2aWNlIHN0b3JlIHRoZSB2YWx1ZXMgb24gYWxsIGlucHV0cy4KICAqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcKaW5kZXggZmRkOTMwMS4uZDg0MmE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL0tjb25maWcKQEAgLTksMTMgKzksMTMgQEAKIAl0cmlzdGF0ZSAiUGVyaW9kaWMgUlRDIHRyaWdnZXJzIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTCiAJaGVscAotCSAgICBQcm92aWRlcyBzdXBwb3J0IGZvciB1c2luZyBwZXJpb2RpYyBjYXBhYmxlIHJlYWwgdGltZQotCSAgICBjbG9ja3MgYXMgSUlPIHRyaWdnZXJzLgorCSAgUHJvdmlkZXMgc3VwcG9ydCBmb3IgdXNpbmcgcGVyaW9kaWMgY2FwYWJsZSByZWFsIHRpbWUKKwkgIGNsb2NrcyBhcyBJSU8gdHJpZ2dlcnMuCiAKIGNvbmZpZyBJSU9fR1BJT19UUklHR0VSCiAJdHJpc3RhdGUgIkdQSU8gdHJpZ2dlciIKIAlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTwogCWhlbHAKLQkgICAgUHJvdmlkZXMgc3VwcG9ydCBmb3IgdXNpbmcgR1BJTyBwaW5zIGFzIElJTyB0cmlnZ2Vycy4KKwkgIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIEdQSU8gcGlucyBhcyBJSU8gdHJpZ2dlcnMuCiAKIGVuZGlmICMgSUlPX1RSSUdHRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlcl9jb25zdW1lci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmgKaW5kZXggNGM3ZjUyNy4uYTAyZDcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmgKQEAgLTEwLDEyICsxMCwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0lJT19UUklHR0VSCiAvKioKLSAqIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gc2V0IHVwIGFuIGlpb19kZXYgdG8gdXNlIHRyaWdnZXJzLgorICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMKICAqIEBkZXZfaW5mbzogaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSB0aGF0IHdpbGwgY29uc3VtZSB0aGUgdHJpZ2dlcgogICoqLwogaW50IGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pOworCiAvKioKLSAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2Vzcy4KKyAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcwogICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgY29uc3VtZWQgdGhlIHRyaWdnZXIKICAqKi8KIGludCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pOwpAQCAtMjMsMTMgKzI0LDE0IEBACiAjZWxzZQogCiAvKioKLSAqIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gc2V0IHVwIGFuIGlpb19kZXYgdG8gdXNlIHRyaWdnZXJzLgorICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMKICAqIEBkZXZfaW5mbzogaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSB0aGF0IHdpbGwgY29uc3VtZSB0aGUgdHJpZ2dlcgogICoqLwogaW50IGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pCiB7CiAJcmV0dXJuIDA7CiB9OworCiAvKioKICAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcwogICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgY29uc3VtZWQgdGhlIHRyaWdnZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY2FwdHVyZS5jCmluZGV4IGVhMjA2MGIuLmZkNDg5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jYXB0dXJlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NhcHR1cmUuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgInBvZC5oIgogI2luY2x1ZGUgImNhcHR1cmUuaCIKIAotCiAvKgogCUZpbmQgYSBmcmVlIFVSQiBhbmQgc3VibWl0IGl0LgogKi8KQEAgLTMzLDcgKzMyLDggQEAKIAlzdHJ1Y3QgdXJiICp1cmJfaW47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGluZTZwY20tPmxvY2tfYXVkaW9faW4sIGZsYWdzKTsKLQlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5hY3RpdmVfdXJiX2luLCBMSU5FNl9JU09fQlVGRkVSUyk7CisJaW5kZXggPQorCSAgICBmaW5kX2ZpcnN0X3plcm9fYml0KCZsaW5lNnBjbS0+YWN0aXZlX3VyYl9pbiwgTElORTZfSVNPX0JVRkZFUlMpOwogCiAJaWYgKGluZGV4ID49IExJTkU2X0lTT19CVUZGRVJTKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX2luLCBmbGFncyk7CkBAIC00NSwyMCArNDUsMjQgQEAKIAl1cmJfc2l6ZSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7ICsraSkgewotCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZmluID0gJnVyYl9pbi0+aXNvX2ZyYW1lX2Rlc2NbaV07CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmaW4gPQorCQkgICAgJnVyYl9pbi0+aXNvX2ZyYW1lX2Rlc2NbaV07CiAJCWZpbi0+b2Zmc2V0ID0gdXJiX3NpemU7CiAJCWZpbi0+bGVuZ3RoID0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKIAkJdXJiX3NpemUgKz0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKIAl9CiAKLQl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlciA9IGxpbmU2cGNtLT5idWZmZXJfaW4gKyBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKKwl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlciA9CisJICAgIGxpbmU2cGNtLT5idWZmZXJfaW4gKworCSAgICBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKIAl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1cmJfc2l6ZTsKIAl1cmJfaW4tPmNvbnRleHQgPSBzdWJzdHJlYW07CiAKIAlpZiAodXNiX3N1Ym1pdF91cmIodXJiX2luLCBHRlBfQVRPTUlDKSA9PSAwKQogCQlzZXRfYml0KGluZGV4LCAmbGluZTZwY20tPmFjdGl2ZV91cmJfaW4pOwogCWVsc2UKLQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBpbiAjJWQgc3VibWlzc2lvbiBmYWlsZWRcbiIsIGluZGV4KTsKKwkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBpbiAjJWQgc3VibWlzc2lvbiBmYWlsZWRcbiIsCisJCQlpbmRleCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaW5lNnBjbS0+bG9ja19hdWRpb19pbiwgZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtMTQzLDcgKzE0Nyw4IEBACiAJaW50IGZyYW1lczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkgICAgKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKQEAgLTE1NSw4ICsxNjAsMTEgQEAKIAogI2lmIERPX0RVTVBfUENNX1JFQ0VJVkUKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7ICsraSkgewotCQlzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZm91dCA9ICZ1cmItPmlzb19mcmFtZV9kZXNjW2ldOwotCQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2cGNtLT5saW5lNiwgJ0MnLCB1cmItPnRyYW5zZmVyX2J1ZmZlciArIGZvdXQtPm9mZnNldCwgZm91dC0+bGVuZ3RoKTsKKwkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPQorCQkgICAgJnVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV07CisJCWxpbmU2X3dyaXRlX2hleGR1bXAobGluZTZwY20tPmxpbmU2LCAnQycsCisJCQkJICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgZm91dC0+b2Zmc2V0LAorCQkJCSAgICBmb3V0LT5sZW5ndGgpOwogCX0KICNlbmRpZgogCkBAIC0xNzksMjUgKzE4Nyw0MCBAQAogCQlpZiAoZnNpemUgPiAwKSB7CiAJCQlmcmFtZXMgPSBmc2l6ZSAvIGJ5dGVzX3Blcl9mcmFtZTsKIAotCQkJaWYgKGxpbmU2cGNtLT5wb3NfaW5fZG9uZSArIGZyYW1lcyA+IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSB7CisJCQlpZiAobGluZTZwY20tPnBvc19pbl9kb25lICsgZnJhbWVzID4KKwkJCSAgICBydW50aW1lLT5idWZmZXJfc2l6ZSkgewogCQkJCS8qCi0JCQkJCVRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIgYm91bmRhcnksCi0JCQkJCWNvcHkgdHdvIHNlcGFyYXRlIGNodW5rcy4KLQkJCQkqLworCQkJCSAgIFRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIKKwkJCQkgICBib3VuZGFyeSwgY29weSB0d28gc2VwYXJhdGUgY2h1bmtzLgorCQkJCSAqLwogCQkJCWludCBsZW47Ci0JCQkJbGVuID0gcnVudGltZS0+YnVmZmVyX3NpemUgLSBsaW5lNnBjbS0+cG9zX2luX2RvbmU7CisJCQkJbGVuID0KKwkJCQkgICAgcnVudGltZS0+YnVmZmVyX3NpemUgLQorCQkJCSAgICBsaW5lNnBjbS0+cG9zX2luX2RvbmU7CiAKIAkJCQlpZiAobGVuID4gMCkgewotCQkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKiBieXRlc19wZXJfZnJhbWUsIGZidWYsIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSk7Ci0JCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSwgZmJ1ZiArIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSwgKGZyYW1lcyAtIGxlbikgKiBieXRlc19wZXJfZnJhbWUpOwotCQkJCX0gZWxzZQotCQkJCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiZHJpdmVyIGJ1ZzogbGVuID0gJWRcbiIsIGxlbik7ICAvKiB0aGlzIGlzIHNvbWV3aGF0IHBhcmFub2lkICovCisJCQkJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArCisJCQkJCSAgICAgICBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKgorCQkJCQkgICAgICAgYnl0ZXNfcGVyX2ZyYW1lLCBmYnVmLAorCQkJCQkgICAgICAgbGVuICogYnl0ZXNfcGVyX2ZyYW1lKTsKKwkJCQkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCQkgICAgICAgZmJ1ZiArIGxlbiAqIGJ5dGVzX3Blcl9mcmFtZSwKKwkJCQkJICAgICAgIChmcmFtZXMgLQorCQkJCQkJbGVuKSAqIGJ5dGVzX3Blcl9mcmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogdGhpcyBpcyBzb21ld2hhdCBwYXJhbm9pZCAqLworCQkJCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLAorCQkJCQkJImRyaXZlciBidWc6IGxlbiA9ICVkXG4iLCBsZW4pOworCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJLyogY29weSBzaW5nbGUgY2h1bmsgKi8KLQkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKiBieXRlc19wZXJfZnJhbWUsIGZidWYsIGZzaXplICogYnl0ZXNfcGVyX2ZyYW1lKTsKKwkJCQltZW1jcHkocnVudGltZS0+ZG1hX2FyZWEgKworCQkJCSAgICAgICBsaW5lNnBjbS0+cG9zX2luX2RvbmUgKiBieXRlc19wZXJfZnJhbWUsCisJCQkJICAgICAgIGZidWYsIGZzaXplICogYnl0ZXNfcGVyX2ZyYW1lKTsKIAkJCX0KIAotCQkJaWYgKChsaW5lNnBjbS0+cG9zX2luX2RvbmUgKz0gZnJhbWVzKSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwkJCWxpbmU2cGNtLT5wb3NfaW5fZG9uZSArPSBmcmFtZXM7CisJCQlpZiAobGluZTZwY20tPnBvc19pbl9kb25lID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQogCQkJCWxpbmU2cGNtLT5wb3NfaW5fZG9uZSAtPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAkJfQogCX0KQEAgLTIxMiw3ICsyMzUsOCBAQAogCWlmICghc2h1dGRvd24pIHsKIAkJc3VibWl0X2F1ZGlvX2luX3VyYihzdWJzdHJlYW0pOwogCi0JCWlmICgobGluZTZwY20tPmJ5dGVzX2luICs9IGxlbmd0aCkgPj0gbGluZTZwY20tPnBlcmlvZF9pbikgeworCQlsaW5lNnBjbS0+Ynl0ZXNfaW4gKz0gbGVuZ3RoOworCQlpZiAobGluZTZwY20tPmJ5dGVzX2luID49IGxpbmU2cGNtLT5wZXJpb2RfaW4pIHsKIAkJCWxpbmU2cGNtLT5ieXRlc19pbiAtPSBsaW5lNnBjbS0+cGVyaW9kX2luOwogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCQl9CkBAIC0yMjgsNyArMjUyLDggQEAKIAogCWVyciA9IHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zKHJ1bnRpbWUsIDAsCiAJCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQkJICAgICgmbGluZTZwY20tPnByb3BlcnRpZXMtPnNuZF9saW5lNl9yYXRlcykpOworCQkJCQkgICAgKCZsaW5lNnBjbS0+cHJvcGVydGllcy0+CisJCQkJCSAgICAgc25kX2xpbmU2X3JhdGVzKSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTI2Nyw3ICsyOTIsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJbGluZTZwY20tPnBlcmlvZF9pbiA9IHBhcmFtc19wZXJpb2RfYnl0ZXMoaHdfcGFyYW1zKTsKLQlsaW5lNnBjbS0+YnVmZmVyX2luID0ga21hbGxvYyhMSU5FNl9JU09fQlVGRkVSUyAqIExJTkU2X0lTT19QQUNLRVRTICogTElORTZfSVNPX1BBQ0tFVF9TSVpFX01BWCwgR0ZQX0tFUk5FTCk7CisJbGluZTZwY20tPmJ1ZmZlcl9pbiA9CisJICAgIGttYWxsb2MoTElORTZfSVNPX0JVRkZFUlMgKiBMSU5FNl9JU09fUEFDS0VUUyAqCisJCSAgICBMSU5FNl9JU09fUEFDS0VUX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKIAogCWlmICghbGluZTZwY20tPmJ1ZmZlcl9pbikgewogCQlkZXZfZXJyKHMybShzdWJzdHJlYW0pLCAiY2Fubm90IG1hbGxvYyBidWZmZXJfaW5cbiIpOwpAQCAtMzAyLDcgKzMyOSw4IEBACiAJCQllcnIgPSBzdWJtaXRfYXVkaW9faW5fYWxsX3VyYnMoc3Vic3RyZWFtKTsKIAogCQkJaWYgKGVyciA8IDApIHsKLQkJCQljbGVhcl9iaXQoQklUX1JVTk5JTkdfQ0FQVFVSRSwgJmxpbmU2cGNtLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KEJJVF9SVU5OSU5HX0NBUFRVUkUsCisJCQkJCSAgJmxpbmU2cGNtLT5mbGFncyk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtMzMyLDE0ICszNjAsMTQgQEAKIAogLyogY2FwdHVyZSBvcGVyYXRvcnMgKi8KIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbGluZTZfY2FwdHVyZV9vcHMgPSB7Ci0JLm9wZW4gPSAgICAgICAgc25kX2xpbmU2X2NhcHR1cmVfb3BlbiwKLQkuY2xvc2UgPSAgICAgICBzbmRfbGluZTZfY2FwdHVyZV9jbG9zZSwKLQkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gICBzbmRfbGluZTZfY2FwdHVyZV9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSAgICAgc25kX2xpbmU2X2NhcHR1cmVfaHdfZnJlZSwKLQkucHJlcGFyZSA9ICAgICBzbmRfbGluZTZfcHJlcGFyZSwKLQkudHJpZ2dlciA9ICAgICBzbmRfbGluZTZfdHJpZ2dlciwKLQkucG9pbnRlciA9ICAgICBzbmRfbGluZTZfY2FwdHVyZV9wb2ludGVyLAorCS5vcGVuID0gc25kX2xpbmU2X2NhcHR1cmVfb3BlbiwKKwkuY2xvc2UgPSBzbmRfbGluZTZfY2FwdHVyZV9jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX2xpbmU2X2NhcHR1cmVfaHdfcGFyYW1zLAorCS5od19mcmVlID0gc25kX2xpbmU2X2NhcHR1cmVfaHdfZnJlZSwKKwkucHJlcGFyZSA9IHNuZF9saW5lNl9wcmVwYXJlLAorCS50cmlnZ2VyID0gc25kX2xpbmU2X3RyaWdnZXIsCisJLnBvaW50ZXIgPSBzbmRfbGluZTZfY2FwdHVyZV9wb2ludGVyLAogfTsKIAogaW50IGNyZWF0ZV9hdWRpb19pbl91cmJzKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSkKQEAgLTM1MSw3ICszNzksOCBAQAogCQlzdHJ1Y3QgdXJiICp1cmI7CiAKIAkJLyogVVJCIGZvciBhdWRpbyBpbjogKi8KLQkJdXJiID0gbGluZTZwY20tPnVyYl9hdWRpb19pbltpXSA9IHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOworCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX2luW2ldID0KKwkJICAgIHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOwogCiAJCWlmICh1cmIgPT0gTlVMTCkgewogCQkJZGV2X2VycihsaW5lNnBjbS0+bGluZTYtPmlmY2RldiwgIk91dCBvZiBtZW1vcnlcbiIpOwpAQCAtMzU5LDcgKzM4OCwxMCBAQAogCQl9CiAKIAkJdXJiLT5kZXYgPSBsaW5lNnBjbS0+bGluZTYtPnVzYmRldjsKLQkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKGxpbmU2cGNtLT5saW5lNi0+dXNiZGV2LCBsaW5lNnBjbS0+ZXBfYXVkaW9fcmVhZCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CisJCXVyYi0+cGlwZSA9CisJCSAgICB1c2JfcmN2aXNvY3BpcGUobGluZTZwY20tPmxpbmU2LT51c2JkZXYsCisJCQkJICAgIGxpbmU2cGNtLT4KKwkJCQkgICAgZXBfYXVkaW9fcmVhZCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CiAJCXVyYi0+c3RhcnRfZnJhbWUgPSAtMTsKIAkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IExJTkU2X0lTT19QQUNLRVRTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NvbnRyb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9jb250cm9sLmMKaW5kZXggMjNhZDA4ZS4uMGI1OTg1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2NvbnRyb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvY29udHJvbC5jCkBAIC0yMiwxOCArMjIsMTggQEAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyXyMjX25hbWUxID0gX19BVFRSKF9uYW1lMiwgX21vZGUsIF9zaG93LCBfc3RvcmUpCiAKICNkZWZpbmUgTElORTZfUEFSQU1fUihQUkVGSVgsIHByZWZpeCwgdHlwZSwgcGFyYW0pIFwKLXN0YXRpYyBzc2l6ZV90IHByZWZpeCAjIyBfZ2V0XyAjIyBwYXJhbShzdHJ1Y3QgZGV2aWNlICpkZXYsIFwKK3N0YXRpYyBzc2l6ZV90IHByZWZpeCMjX2dldF8jI3BhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwgXAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAogeyBcCi0JcmV0dXJuIHByZWZpeCAjIyBfZ2V0X3BhcmFtXyAjIyB0eXBlKGRldiwgYnVmLCBQUkVGSVggIyMgXyAjIyBwYXJhbSk7IFwKKwlyZXR1cm4gcHJlZml4IyNfZ2V0X3BhcmFtXyMjdHlwZShkZXYsIGJ1ZiwgUFJFRklYIyNfIyNwYXJhbSk7IFwKIH0KIAogI2RlZmluZSBMSU5FNl9QQVJBTV9SVyhQUkVGSVgsIHByZWZpeCwgdHlwZSwgcGFyYW0pIFwKIExJTkU2X1BBUkFNX1IoUFJFRklYLCBwcmVmaXgsIHR5cGUsIHBhcmFtKTsgXAotc3RhdGljIHNzaXplX3QgcHJlZml4ICMjIF9zZXRfICMjIHBhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwgXAorc3RhdGljIHNzaXplX3QgcHJlZml4IyNfc2V0XyMjcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LCBcCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAogeyBcCi0JcmV0dXJuIHByZWZpeCAjIyBfc2V0X3BhcmFtXyAjIyB0eXBlKGRldiwgYnVmLCBjb3VudCwgUFJFRklYICMjIF8gIyMgcGFyYW0pOyBcCisJcmV0dXJuIHByZWZpeCMjX3NldF9wYXJhbV8jI3R5cGUoZGV2LCBidWYsIGNvdW50LCBQUkVGSVgjI18jI3BhcmFtKTsgXAogfQogCiAjZGVmaW5lIFBPRF9QQVJBTV9SKHR5cGUsIHBhcmFtKSBMSU5FNl9QQVJBTV9SKFBPRCwgcG9kLCB0eXBlLCBwYXJhbSkKQEAgLTQxLDcgKzQxLDYgQEAKICNkZWZpbmUgVkFSSUFYX1BBUkFNX1IodHlwZSwgcGFyYW0pIExJTkU2X1BBUkFNX1IoVkFSSUFYLCB2YXJpYXgsIHR5cGUsIHBhcmFtKQogI2RlZmluZSBWQVJJQVhfUEFSQU1fUlcodHlwZSwgcGFyYW0pIExJTkU2X1BBUkFNX1JXKFZBUklBWCwgdmFyaWF4LCB0eXBlLCBwYXJhbSkKIAotCiBzdGF0aWMgc3NpemVfdCBwb2RfZ2V0X3BhcmFtX2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBhcmFtKQogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CkBAIC01MiwxMSArNTEsMTggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcG9kLT5wcm9nX2RhdGEuY29udHJvbFtwYXJhbV0pOwogfQogCi1zdGF0aWMgc3NpemVfdCBwb2Rfc2V0X3BhcmFtX2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgcGFyYW0pCitzdGF0aWMgc3NpemVfdCBwb2Rfc2V0X3BhcmFtX2ludChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBpbnQgcGFyYW0pCiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwogCXBvZF90cmFuc21pdF9wYXJhbWV0ZXIocG9kLCBwYXJhbSwgdmFsdWUpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTc0LDEzICs4MCwxMyBAQAogc3RhdGljIHNzaXplX3QgdmFyaWF4X2dldF9wYXJhbV9mbG9hdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBhcmFtKQogewogCS8qCi0JCVdlIGRvIG91ciBvd24gZmxvYXRpbmcgcG9pbnQgaGFuZGxpbmcgaGVyZSBzaW5jZSBmbG9hdHMgaW4gdGhlCi0JCWtlcm5lbCBhcmUgcHJvYmxlbWF0aWMgZm9yIGF0IGxlYXN0IHR3byByZWFzb25zOiAtIG1hbnkgZGlzdHJvcwotCQlhcmUgc3RpbGwgc2hpcHBlZCB3aXRoIGJpbmFyeSBrZXJuZWxzIG9wdGltaXplZCBmb3IgdGhlIGFuY2llbnQKLQkJODAzODYgd2l0aG91dCBGUFUKLQkJLSB0aGVyZSBpc24ndCBhIHByaW50ZigiJWYiKQotCQkgIChzZWUgaHR0cDovL3d3dy5rZXJuZWx0aHJlYWQuY29tL3B1YmxpY2F0aW9ucy9mYXEvMzM1Lmh0bWwpCi0JKi8KKwkgICBXZSBkbyBvdXIgb3duIGZsb2F0aW5nIHBvaW50IGhhbmRsaW5nIGhlcmUgc2luY2UgZmxvYXRzIGluIHRoZQorCSAgIGtlcm5lbCBhcmUgcHJvYmxlbWF0aWMgZm9yIGF0IGxlYXN0IHR3byByZWFzb25zOiAtIG1hbnkgZGlzdHJvcworCSAgIGFyZSBzdGlsbCBzaGlwcGVkIHdpdGggYmluYXJ5IGtlcm5lbHMgb3B0aW1pemVkIGZvciB0aGUgYW5jaWVudAorCSAgIDgwMzg2IHdpdGhvdXQgRlBVCisJICAgLSB0aGVyZSBpc24ndCBhIHByaW50ZigiJWYiKQorCSAgIChzZWUgaHR0cDovL3d3dy5rZXJuZWx0aHJlYWQuY29tL3B1YmxpY2F0aW9ucy9mYXEvMzM1Lmh0bWwpCisJICovCiAKIAlzdGF0aWMgY29uc3QgaW50IEJJQVMgPSAweDdmOwogCXN0YXRpYyBjb25zdCBpbnQgT0ZGU0VUID0gMHhmOwpAQCAtMTEwLDEwICsxMTYsMTMgQEAKIAkJCXBhcnRfZnJhYyA9IChtYW50aXNzYSA8PCAoMzIgKyBleHBvbmVudCkpICYgMHhmZmZmZmZmZjsKIAkJfQogCi0JCXBhcnRfZnJhYyA9IChwYXJ0X2ZyYWMgLyAoKDFVTCA8PCAzMSkgLyAoUFJFQ0lTSU9OIC8gMiAqIDEwKSkgKyA1KSAvIDEwOworCQlwYXJ0X2ZyYWMgPQorCQkgICAgKHBhcnRfZnJhYyAvICgoMVVMIDw8IDMxKSAvIChQUkVDSVNJT04gLyAyICogMTApKSArIDUpIC8gMTA7CiAJfQogCi0JbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXMlZC4lMDNkXG4iLCAoKHBbMF0gJiAweDgwKSA/ICItIiA6ICIiKSwgcGFydF9pbnQsIHBhcnRfZnJhYyk7CisJbGVuICs9CisJICAgIHNwcmludGYoYnVmICsgbGVuLCAiJXMlZC4lMDNkXG4iLCAoKHBbMF0gJiAweDgwKSA/ICItIiA6ICIiKSwKKwkJICAgIHBhcnRfaW50LCBwYXJ0X2ZyYWMpOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTI2MCwxMjcgKzI2OSwyNDYgQEAKIFZBUklBWF9QQVJBTV9SKGludCwgcGlja3VwX3dpcmluZyk7CiAKIHN0YXRpYyBERVZJQ0VfQVRUUih0d2VhaywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdHdlYWssIHBvZF9zZXRfdHdlYWspOwotc3RhdGljIERFVklDRV9BVFRSKHdhaF9wb3NpdGlvbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfd2FoX3Bvc2l0aW9uLCBwb2Rfc2V0X3dhaF9wb3NpdGlvbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY29tcHJlc3Npb25fZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcHJlc3Npb25fZ2FpbiwgcG9kX3NldF9jb21wcmVzc2lvbl9nYWluKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih2b2xfcGVkYWxfcG9zaXRpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbF9wZWRhbF9wb3NpdGlvbiwgcG9kX3NldF92b2xfcGVkYWxfcG9zaXRpb24pOwotc3RhdGljIERFVklDRV9BVFRSKGNvbXByZXNzaW9uX3RocmVzaG9sZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcHJlc3Npb25fdGhyZXNob2xkLCBwb2Rfc2V0X2NvbXByZXNzaW9uX3RocmVzaG9sZCk7CitzdGF0aWMgREVWSUNFX0FUVFIod2FoX3Bvc2l0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfcG9zaXRpb24sCisJCSAgIHBvZF9zZXRfd2FoX3Bvc2l0aW9uKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjb21wcmVzc2lvbl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9jb21wcmVzc2lvbl9nYWluLCBwb2Rfc2V0X2NvbXByZXNzaW9uX2dhaW4pOworc3RhdGljIERFVklDRV9BVFRSKHZvbF9wZWRhbF9wb3NpdGlvbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfdm9sX3BlZGFsX3Bvc2l0aW9uLCBwb2Rfc2V0X3ZvbF9wZWRhbF9wb3NpdGlvbik7CitzdGF0aWMgREVWSUNFX0FUVFIoY29tcHJlc3Npb25fdGhyZXNob2xkLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9jb21wcmVzc2lvbl90aHJlc2hvbGQsCisJCSAgIHBvZF9zZXRfY29tcHJlc3Npb25fdGhyZXNob2xkKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwYW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3BhbiwgcG9kX3NldF9wYW4pOwotc3RhdGljIERFVklDRV9BVFRSKGFtcF9tb2RlbF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX21vZGVsX3NldHVwLCBwb2Rfc2V0X2FtcF9tb2RlbF9zZXR1cCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYW1wX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9hbXBfbW9kZWwsIHBvZF9zZXRfYW1wX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbXBfbW9kZWxfc2V0dXAsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2FtcF9tb2RlbF9zZXR1cCwKKwkJICAgcG9kX3NldF9hbXBfbW9kZWxfc2V0dXApOworc3RhdGljIERFVklDRV9BVFRSKGFtcF9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX21vZGVsLAorCQkgICBwb2Rfc2V0X2FtcF9tb2RlbCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZHJpdmUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RyaXZlLCBwb2Rfc2V0X2RyaXZlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihiYXNzLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYXNzLCBwb2Rfc2V0X2Jhc3MpOwogc3RhdGljIERFVklDRV9BVFRSKG1pZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbWlkLCBwb2Rfc2V0X21pZCk7CiBzdGF0aWMgREVWSUNFX0FUVFIobG93bWlkLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9sb3dtaWQsIHBvZF9zZXRfbG93bWlkKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0cmVibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RyZWJsZSwgcG9kX3NldF90cmVibGUpOwotc3RhdGljIERFVklDRV9BVFRSKGhpZ2htaWQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2hpZ2htaWQsIHBvZF9zZXRfaGlnaG1pZCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoY2hhbl92b2wsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NoYW5fdm9sLCBwb2Rfc2V0X2NoYW5fdm9sKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfbWl4LCBwb2Rfc2V0X3JldmVyYl9taXgpOwotc3RhdGljIERFVklDRV9BVFRSKGVmZmVjdF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZWZmZWN0X3NldHVwLCBwb2Rfc2V0X2VmZmVjdF9zZXR1cCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8xX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8xX2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzFfZnJlcXVlbmN5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwcmVzZW5jZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcHJlc2VuY2UsIHBvZF9zZXRfcHJlc2VuY2UpOwotc3RhdGljIERFVklDRV9BVFRSMih0cmVibGVfX2Jhc3MsIHRyZWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdHJlYmxlX19iYXNzLCBwb2Rfc2V0X3RyZWJsZV9fYmFzcyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobm9pc2VfZ2F0ZV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X25vaXNlX2dhdGVfZW5hYmxlLCBwb2Rfc2V0X25vaXNlX2dhdGVfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihnYXRlX3RocmVzaG9sZCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZ2F0ZV90aHJlc2hvbGQsIHBvZF9zZXRfZ2F0ZV90aHJlc2hvbGQpOwotc3RhdGljIERFVklDRV9BVFRSKGdhdGVfZGVjYXlfdGltZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZ2F0ZV9kZWNheV90aW1lLCBwb2Rfc2V0X2dhdGVfZGVjYXlfdGltZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9lbmFibGUsIHBvZF9zZXRfc3RvbXBfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjb21wX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfY29tcF9lbmFibGUsIHBvZF9zZXRfY29tcF9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3RpbWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3RpbWUsIHBvZF9zZXRfc3RvbXBfdGltZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9lbmFibGUsIHBvZF9zZXRfZGVsYXlfZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzEsIHBvZF9zZXRfbW9kX3BhcmFtXzEpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzEsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzEsIHBvZF9zZXRfZGVsYXlfcGFyYW1fMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUsIHBvZF9zZXRfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcywgYmFuZF8yX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcywgcG9kX3NldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8yLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8yLCBwb2Rfc2V0X2RlbGF5X3BhcmFtXzIpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3ZvbHVtZV9taXgsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3ZvbHVtZV9taXgsIHBvZF9zZXRfZGVsYXlfdm9sdW1lX21peCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fMywgcG9kX3NldF9kZWxheV9wYXJhbV8zKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZW5hYmxlLCBwb2Rfc2V0X3JldmVyYl9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl90eXBlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfdHlwZSwgcG9kX3NldF9yZXZlcmJfdHlwZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX2RlY2F5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZGVjYXksIHBvZF9zZXRfcmV2ZXJiX2RlY2F5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfdG9uZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcmV2ZXJiX3RvbmUsIHBvZF9zZXRfcmV2ZXJiX3RvbmUpOwotc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9wcmVfZGVsYXksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3JldmVyYl9wcmVfZGVsYXksIHBvZF9zZXRfcmV2ZXJiX3ByZV9kZWxheSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfcHJlX3Bvc3QsIHBvZF9zZXRfcmV2ZXJiX3ByZV9wb3N0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzJfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfMl9mcmVxdWVuY3kpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzNfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzNfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZnJlcXVlbmN5X19iYXNzLCBwb2Rfc2V0X2JhbmRfM19mcmVxdWVuY3lfX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKHdhaF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3dhaF9lbmFibGUsIHBvZF9zZXRfd2FoX2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kdWxhdGlvbl9sb19jdXQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZHVsYXRpb25fbG9fY3V0LCBwb2Rfc2V0X21vZHVsYXRpb25fbG9fY3V0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9yZXZlcmJfbG9fY3V0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9yZXZlcmJfbG9fY3V0LCBwb2Rfc2V0X2RlbGF5X3JldmVyYl9sb19jdXQpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9wZWRhbF9taW5pbXVtLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF92b2x1bWVfcGVkYWxfbWluaW11bSwgcG9kX3NldF92b2x1bWVfcGVkYWxfbWluaW11bSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZXFfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2VxX3ByZV9wb3N0LCBwb2Rfc2V0X2VxX3ByZV9wb3N0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfcHJlX3Bvc3QsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbHVtZV9wcmVfcG9zdCwgcG9kX3NldF92b2x1bWVfcHJlX3Bvc3QpOwotc3RhdGljIERFVklDRV9BVFRSKGRpX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kaV9tb2RlbCwgcG9kX3NldF9kaV9tb2RlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGlfZGVsYXksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RpX2RlbGF5LCBwb2Rfc2V0X2RpX2RlbGF5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfZW5hYmxlLCBwb2Rfc2V0X21vZF9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8xX25vdGVfdmFsdWUsIHBvZF9zZXRfbW9kX3BhcmFtXzFfbm90ZV92YWx1ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8yLCBwb2Rfc2V0X21vZF9wYXJhbV8yKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzMsIHBvZF9zZXRfbW9kX3BhcmFtXzMpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV80LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fNCwgcG9kX3NldF9tb2RfcGFyYW1fNCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV81LCBwb2Rfc2V0X21vZF9wYXJhbV81KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtb2Rfdm9sdW1lX21peCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3ZvbHVtZV9taXgsIHBvZF9zZXRfbW9kX3ZvbHVtZV9taXgpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3ByZV9wb3N0LCBwb2Rfc2V0X21vZF9wcmVfcG9zdCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIobW9kdWxhdGlvbl9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kdWxhdGlvbl9tb2RlbCwgcG9kX3NldF9tb2R1bGF0aW9uX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzNfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfM19mcmVxdWVuY3kpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzRfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzRfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzRfZnJlcXVlbmN5X19iYXNzLCBwb2Rfc2V0X2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIHBvZF9zZXRfbW9kX3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24sIHBvZF9zZXRfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihlcV9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2VxX2VuYWJsZSwgcG9kX3NldF9lcV9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKGhpZ2htaWQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2hpZ2htaWQsCisJCSAgIHBvZF9zZXRfaGlnaG1pZCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2hhbl92b2wsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NoYW5fdm9sLAorCQkgICBwb2Rfc2V0X2NoYW5fdm9sKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfbWl4LAorCQkgICBwb2Rfc2V0X3JldmVyYl9taXgpOworc3RhdGljIERFVklDRV9BVFRSKGVmZmVjdF9zZXR1cCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZWZmZWN0X3NldHVwLAorCQkgICBwb2Rfc2V0X2VmZmVjdF9zZXR1cCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8xX2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF8xX2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzFfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmVzZW5jZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcHJlc2VuY2UsCisJCSAgIHBvZF9zZXRfcHJlc2VuY2UpOworc3RhdGljIERFVklDRV9BVFRSMih0cmVibGVfX2Jhc3MsIHRyZWJsZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X3RyZWJsZV9fYmFzcywgcG9kX3NldF90cmVibGVfX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSKG5vaXNlX2dhdGVfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9ub2lzZV9nYXRlX2VuYWJsZSwgcG9kX3NldF9ub2lzZV9nYXRlX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ2F0ZV90aHJlc2hvbGQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2dhdGVfdGhyZXNob2xkLAorCQkgICBwb2Rfc2V0X2dhdGVfdGhyZXNob2xkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihnYXRlX2RlY2F5X3RpbWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2dhdGVfZGVjYXlfdGltZSwKKwkJICAgcG9kX3NldF9nYXRlX2RlY2F5X3RpbWUpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfZW5hYmxlLAorCQkgICBwb2Rfc2V0X3N0b21wX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoY29tcF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NvbXBfZW5hYmxlLAorCQkgICBwb2Rfc2V0X2NvbXBfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF90aW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF90aW1lLAorCQkgICBwb2Rfc2V0X3N0b21wX3RpbWUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfZW5hYmxlLAorCQkgICBwb2Rfc2V0X2RlbGF5X2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzEsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV8xLAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV8xKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8xLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8xLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzEpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfMl9mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfMl9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzLAorCQkgICAgcG9kX3NldF9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wYXJhbV8yLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9wYXJhbV8yLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzIpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3ZvbHVtZV9taXgsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2RlbGF5X3ZvbHVtZV9taXgsIHBvZF9zZXRfZGVsYXlfdm9sdW1lX21peCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fMywKKwkJICAgcG9kX3NldF9kZWxheV9wYXJhbV8zKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZW5hYmxlLAorCQkgICBwb2Rfc2V0X3JldmVyYl9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl90eXBlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfdHlwZSwKKwkJICAgcG9kX3NldF9yZXZlcmJfdHlwZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX2RlY2F5LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfZGVjYXksCisJCSAgIHBvZF9zZXRfcmV2ZXJiX2RlY2F5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXZlcmJfdG9uZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfcmV2ZXJiX3RvbmUsCisJCSAgIHBvZF9zZXRfcmV2ZXJiX3RvbmUpOworc3RhdGljIERFVklDRV9BVFRSKHJldmVyYl9wcmVfZGVsYXksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3JldmVyYl9wcmVfZGVsYXksIHBvZF9zZXRfcmV2ZXJiX3ByZV9kZWxheSk7CitzdGF0aWMgREVWSUNFX0FUVFIocmV2ZXJiX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9yZXZlcmJfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfcmV2ZXJiX3ByZV9wb3N0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzJfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9iYW5kXzJfZnJlcXVlbmN5LCBwb2Rfc2V0X2JhbmRfMl9mcmVxdWVuY3kpOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzNfZnJlcXVlbmN5X19iYXNzLCBiYW5kXzNfZnJlcXVlbmN5LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcywKKwkJICAgIHBvZF9zZXRfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIod2FoX2VuYWJsZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfd2FoX2VuYWJsZSwKKwkJICAgcG9kX3NldF93YWhfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2R1bGF0aW9uX2xvX2N1dCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfbW9kdWxhdGlvbl9sb19jdXQsIHBvZF9zZXRfbW9kdWxhdGlvbl9sb19jdXQpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3JldmVyYl9sb19jdXQsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2RlbGF5X3JldmVyYl9sb19jdXQsIHBvZF9zZXRfZGVsYXlfcmV2ZXJiX2xvX2N1dCk7CitzdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3BlZGFsX21pbmltdW0sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3ZvbHVtZV9wZWRhbF9taW5pbXVtLCBwb2Rfc2V0X3ZvbHVtZV9wZWRhbF9taW5pbXVtKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihlcV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZXFfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfZXFfcHJlX3Bvc3QpOworc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdm9sdW1lX3ByZV9wb3N0LAorCQkgICBwb2Rfc2V0X3ZvbHVtZV9wcmVfcG9zdCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGlfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RpX21vZGVsLAorCQkgICBwb2Rfc2V0X2RpX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkaV9kZWxheSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGlfZGVsYXksCisJCSAgIHBvZF9zZXRfZGlfZGVsYXkpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9lbmFibGUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9lbmFibGUsCisJCSAgIHBvZF9zZXRfbW9kX2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzFfbm90ZV92YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfbW9kX3BhcmFtXzFfbm90ZV92YWx1ZSwKKwkJICAgcG9kX3NldF9tb2RfcGFyYW1fMV9ub3RlX3ZhbHVlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzIsCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzIpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF9wYXJhbV8zLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcGFyYW1fMywKKwkJICAgcG9kX3NldF9tb2RfcGFyYW1fMyk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X21vZF9wYXJhbV80LAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV80KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfbW9kX3BhcmFtXzUsCisJCSAgIHBvZF9zZXRfbW9kX3BhcmFtXzUpOworc3RhdGljIERFVklDRV9BVFRSKG1vZF92b2x1bWVfbWl4LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2Rfdm9sdW1lX21peCwKKwkJICAgcG9kX3NldF9tb2Rfdm9sdW1lX21peCk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kX3ByZV9wb3N0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9tb2RfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfbW9kX3ByZV9wb3N0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2R1bGF0aW9uX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9tb2R1bGF0aW9uX21vZGVsLCBwb2Rfc2V0X21vZHVsYXRpb25fbW9kZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfM19mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfM19mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF8zX2ZyZXF1ZW5jeSk7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNF9mcmVxdWVuY3lfX2Jhc3MsIGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzRfZnJlcXVlbmN5X19iYXNzLAorCQkgICAgcG9kX3NldF9iYW5kXzRfZnJlcXVlbmN5X19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLAorCQkgICBwb2Rfc2V0X21vZF9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uLAorCQkgICBwb2Rfc2V0X2RlbGF5X3BhcmFtXzFfZG91YmxlX3ByZWNpc2lvbik7CitzdGF0aWMgREVWSUNFX0FUVFIoZXFfZW5hYmxlLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9lcV9lbmFibGUsCisJCSAgIHBvZF9zZXRfZXFfZW5hYmxlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0YXAsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RhcCwgcG9kX3NldF90YXApOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24sIHBvZF9zZXRfdm9sdW1lX3R3ZWFrX3BlZGFsX2Fzc2lnbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF81X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF81X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzVfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduLAorCQkgICBwb2Rfc2V0X3ZvbHVtZV90d2Vha19wZWRhbF9hc3NpZ24pOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNV9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfNV9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF81X2ZyZXF1ZW5jeSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodHVuZXIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3R1bmVyLCBwb2Rfc2V0X3R1bmVyKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihtaWNfc2VsZWN0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9taWNfc2VsZWN0aW9uLCBwb2Rfc2V0X21pY19zZWxlY3Rpb24pOwotc3RhdGljIERFVklDRV9BVFRSKGNhYmluZXRfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NhYmluZXRfbW9kZWwsIHBvZF9zZXRfY2FiaW5ldF9tb2RlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX21vZGVsLCBwb2Rfc2V0X3N0b21wX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyb29tbGV2ZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3Jvb21sZXZlbCwgcG9kX3NldF9yb29tbGV2ZWwpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNF9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF80X2ZyZXF1ZW5jeSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmFuZF82X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF82X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzZfZnJlcXVlbmN5KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSwgcG9kX3NldF9zdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzIsIHBvZF9zZXRfc3RvbXBfcGFyYW1fMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMywgcG9kX3NldF9zdG9tcF9wYXJhbV8zKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV80LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV80LCBwb2Rfc2V0X3N0b21wX3BhcmFtXzQpOwotc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzUsIHBvZF9zZXRfc3RvbXBfcGFyYW1fNSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fNiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fNiwgcG9kX3NldF9zdG9tcF9wYXJhbV82KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhbXBfc3dpdGNoX3NlbGVjdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wX3N3aXRjaF9zZWxlY3QsIHBvZF9zZXRfYW1wX3N3aXRjaF9zZWxlY3QpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzQsIHBvZF9zZXRfZGVsYXlfcGFyYW1fNCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fNSwgcG9kX3NldF9kZWxheV9wYXJhbV81KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcHJlX3Bvc3QsIHBvZF9zZXRfZGVsYXlfcHJlX3Bvc3QpOwotc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9tb2RlbCwgcG9kX3NldF9kZWxheV9tb2RlbCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfdmVyYl9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfdmVyYl9tb2RlbCwgcG9kX3NldF9kZWxheV92ZXJiX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wb19tc2IsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RlbXBvX21zYiwgcG9kX3NldF90ZW1wb19tc2IpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXBvX2xzYiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGVtcG9fbHNiLCBwb2Rfc2V0X3RlbXBvX2xzYik7Ci1zdGF0aWMgREVWSUNFX0FUVFIod2FoX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfbW9kZWwsIHBvZF9zZXRfd2FoX21vZGVsKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihieXBhc3Nfdm9sdW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9ieXBhc3Nfdm9sdW1lLCBwb2Rfc2V0X2J5cGFzc192b2x1bWUpOwotc3RhdGljIERFVklDRV9BVFRSKGZ4X2xvb3Bfb25fb2ZmLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9meF9sb29wX29uX29mZiwgcG9kX3NldF9meF9sb29wX29uX29mZik7Ci1zdGF0aWMgREVWSUNFX0FUVFIodHdlYWtfcGFyYW1fc2VsZWN0LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF90d2Vha19wYXJhbV9zZWxlY3QsIHBvZF9zZXRfdHdlYWtfcGFyYW1fc2VsZWN0KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhbXAxX2VuZ2FnZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wMV9lbmdhZ2UsIHBvZF9zZXRfYW1wMV9lbmdhZ2UpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMV9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzFfZ2FpbiwgcG9kX3NldF9iYW5kXzFfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfMl9nYWluX19iYXNzLCBiYW5kXzJfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8yX2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF8yX2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzJfZ2FpbiwgcG9kX3NldF9iYW5kXzJfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfM19nYWluX19iYXNzLCBiYW5kXzNfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8zX2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF8zX2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSKGJhbmRfM19nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzNfZ2FpbiwgcG9kX3NldF9iYW5kXzNfZ2Fpbik7Ci1zdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfNF9nYWluX19iYXNzLCBiYW5kXzRfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF80X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF80X2dhaW5fX2Jhc3MpOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzVfZ2Fpbl9fYmFzcywgYmFuZF81X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNV9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfNV9nYWluX19iYXNzKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzRfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF80X2dhaW4sIHBvZF9zZXRfYmFuZF80X2dhaW4pOwotc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzZfZ2Fpbl9fYmFzcywgYmFuZF82X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNl9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfNl9nYWluX19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihtaWNfc2VsZWN0aW9uLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9taWNfc2VsZWN0aW9uLAorCQkgICBwb2Rfc2V0X21pY19zZWxlY3Rpb24pOworc3RhdGljIERFVklDRV9BVFRSKGNhYmluZXRfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2NhYmluZXRfbW9kZWwsCisJCSAgIHBvZF9zZXRfY2FiaW5ldF9tb2RlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfbW9kZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX21vZGVsLAorCQkgICBwb2Rfc2V0X3N0b21wX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyb29tbGV2ZWwsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3Jvb21sZXZlbCwKKwkJICAgcG9kX3NldF9yb29tbGV2ZWwpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfNF9mcmVxdWVuY3ksIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X2JhbmRfNF9mcmVxdWVuY3ksIHBvZF9zZXRfYmFuZF80X2ZyZXF1ZW5jeSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF82X2ZyZXF1ZW5jeSwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYmFuZF82X2ZyZXF1ZW5jeSwgcG9kX3NldF9iYW5kXzZfZnJlcXVlbmN5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICBwb2RfZ2V0X3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSwKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV8xX25vdGVfdmFsdWUpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzIsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzIsCisJCSAgIHBvZF9zZXRfc3RvbXBfcGFyYW1fMik7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fMywgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fMywKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV8zKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzdG9tcF9wYXJhbV80LCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9zdG9tcF9wYXJhbV80LAorCQkgICBwb2Rfc2V0X3N0b21wX3BhcmFtXzQpOworc3RhdGljIERFVklDRV9BVFRSKHN0b21wX3BhcmFtXzUsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3N0b21wX3BhcmFtXzUsCisJCSAgIHBvZF9zZXRfc3RvbXBfcGFyYW1fNSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3RvbXBfcGFyYW1fNiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfc3RvbXBfcGFyYW1fNiwKKwkJICAgcG9kX3NldF9zdG9tcF9wYXJhbV82KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbXBfc3dpdGNoX3NlbGVjdCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfYW1wX3N3aXRjaF9zZWxlY3QsIHBvZF9zZXRfYW1wX3N3aXRjaF9zZWxlY3QpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X3BhcmFtXzQsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2RlbGF5X3BhcmFtXzQsCisJCSAgIHBvZF9zZXRfZGVsYXlfcGFyYW1fNCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfcGFyYW1fNSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcGFyYW1fNSwKKwkJICAgcG9kX3NldF9kZWxheV9wYXJhbV81KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxheV9wcmVfcG9zdCwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfZGVsYXlfcHJlX3Bvc3QsCisJCSAgIHBvZF9zZXRfZGVsYXlfcHJlX3Bvc3QpOworc3RhdGljIERFVklDRV9BVFRSKGRlbGF5X21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9kZWxheV9tb2RlbCwKKwkJICAgcG9kX3NldF9kZWxheV9tb2RlbCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsYXlfdmVyYl9tb2RlbCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIHBvZF9nZXRfZGVsYXlfdmVyYl9tb2RlbCwgcG9kX3NldF9kZWxheV92ZXJiX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wb19tc2IsIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X3RlbXBvX21zYiwKKwkJICAgcG9kX3NldF90ZW1wb19tc2IpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXBvX2xzYiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfdGVtcG9fbHNiLAorCQkgICBwb2Rfc2V0X3RlbXBvX2xzYik7CitzdGF0aWMgREVWSUNFX0FUVFIod2FoX21vZGVsLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF93YWhfbW9kZWwsCisJCSAgIHBvZF9zZXRfd2FoX21vZGVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihieXBhc3Nfdm9sdW1lLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9ieXBhc3Nfdm9sdW1lLAorCQkgICBwb2Rfc2V0X2J5cGFzc192b2x1bWUpOworc3RhdGljIERFVklDRV9BVFRSKGZ4X2xvb3Bfb25fb2ZmLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9meF9sb29wX29uX29mZiwKKwkJICAgcG9kX3NldF9meF9sb29wX29uX29mZik7CitzdGF0aWMgREVWSUNFX0FUVFIodHdlYWtfcGFyYW1fc2VsZWN0LCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgcG9kX2dldF90d2Vha19wYXJhbV9zZWxlY3QsIHBvZF9zZXRfdHdlYWtfcGFyYW1fc2VsZWN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhbXAxX2VuZ2FnZSwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYW1wMV9lbmdhZ2UsCisJCSAgIHBvZF9zZXRfYW1wMV9lbmdhZ2UpOworc3RhdGljIERFVklDRV9BVFRSKGJhbmRfMV9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywgcG9kX2dldF9iYW5kXzFfZ2FpbiwKKwkJICAgcG9kX3NldF9iYW5kXzFfZ2Fpbik7CitzdGF0aWMgREVWSUNFX0FUVFIyKGJhbmRfMl9nYWluX19iYXNzLCBiYW5kXzJfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgICBwb2RfZ2V0X2JhbmRfMl9nYWluX19iYXNzLCBwb2Rfc2V0X2JhbmRfMl9nYWluX19iYXNzKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiYW5kXzJfZ2FpbiwgU19JV1VHTyB8IFNfSVJVR08sIHBvZF9nZXRfYmFuZF8yX2dhaW4sCisJCSAgIHBvZF9zZXRfYmFuZF8yX2dhaW4pOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzNfZ2Fpbl9fYmFzcywgYmFuZF8zX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzNfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzNfZ2Fpbl9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF8zX2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfM19nYWluLAorCQkgICBwb2Rfc2V0X2JhbmRfM19nYWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF80X2dhaW5fX2Jhc3MsIGJhbmRfNF9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF80X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF80X2dhaW5fX2Jhc3MpOworc3RhdGljIERFVklDRV9BVFRSMihiYW5kXzVfZ2Fpbl9fYmFzcywgYmFuZF81X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLAorCQkgICAgcG9kX2dldF9iYW5kXzVfZ2Fpbl9fYmFzcywgcG9kX3NldF9iYW5kXzVfZ2Fpbl9fYmFzcyk7CitzdGF0aWMgREVWSUNFX0FUVFIoYmFuZF80X2dhaW4sIFNfSVdVR08gfCBTX0lSVUdPLCBwb2RfZ2V0X2JhbmRfNF9nYWluLAorCQkgICBwb2Rfc2V0X2JhbmRfNF9nYWluKTsKK3N0YXRpYyBERVZJQ0VfQVRUUjIoYmFuZF82X2dhaW5fX2Jhc3MsIGJhbmRfNl9nYWluLCBTX0lXVUdPIHwgU19JUlVHTywKKwkJICAgIHBvZF9nZXRfYmFuZF82X2dhaW5fX2Jhc3MsIHBvZF9zZXRfYmFuZF82X2dhaW5fX2Jhc3MpOwogc3RhdGljIERFVklDRV9BVFRSKGJvZHksIFNfSVJVR08sIHZhcmlheF9nZXRfYm9keSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2VuYWJsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX2VuYWJsZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX3R5cGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV90eXBlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfcG9zaXRpb24sIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9wb3NpdGlvbiwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2FuZ2xlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfYW5nbGUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9sZXZlbCwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX2xldmVsLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfZW5hYmxlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfdHlwZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX3R5cGUsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9wb3NpdGlvbiwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX3Bvc2l0aW9uLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfYW5nbGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9hbmdsZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX2xldmVsLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfbGV2ZWwsIGxpbmU2X25vcF93cml0ZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlja3VwX3BoYXNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cF9waGFzZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihjYXBhY2l0YW5jZSwgU19JUlVHTywgdmFyaWF4X2dldF9jYXBhY2l0YW5jZSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih0b25lX3Jlc2lzdGFuY2UsIFNfSVJVR08sIHZhcmlheF9nZXRfdG9uZV9yZXNpc3RhbmNlLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9yZXNpc3RhbmNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3ZvbHVtZV9yZXNpc3RhbmNlLCBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfZW5hYmxlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfdHlwZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX3R5cGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMV9wb3NpdGlvbiwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAxX3Bvc2l0aW9uLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDFfYW5nbGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMV9hbmdsZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAxX2xldmVsLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDFfbGV2ZWwsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9lbmFibGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl90eXBlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfdHlwZSwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXAyX3Bvc2l0aW9uLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cDJfcG9zaXRpb24sCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwMl9hbmdsZSwgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXAyX2FuZ2xlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHBpY2t1cDJfbGV2ZWwsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwMl9sZXZlbCwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXBfcGhhc2UsIFNfSVJVR08sIHZhcmlheF9nZXRfcGlja3VwX3BoYXNlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKGNhcGFjaXRhbmNlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X2NhcGFjaXRhbmNlLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOworc3RhdGljIERFVklDRV9BVFRSKHRvbmVfcmVzaXN0YW5jZSwgU19JUlVHTywgdmFyaWF4X2dldF90b25lX3Jlc2lzdGFuY2UsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodm9sdW1lX3Jlc2lzdGFuY2UsIFNfSVJVR08sIHZhcmlheF9nZXRfdm9sdW1lX3Jlc2lzdGFuY2UsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodGFwZXIsIFNfSVJVR08sIHZhcmlheF9nZXRfdGFwZXIsIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodG9uZV9kdW1wLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3RvbmVfZHVtcCwgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzYXZlX3RvbmUsIFNfSVJVR08sIHZhcmlheF9nZXRfc2F2ZV90b25lLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHZvbHVtZV9kdW1wLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3ZvbHVtZV9kdW1wLCBsaW5lNl9ub3Bfd3JpdGUpOwotc3RhdGljIERFVklDRV9BVFRSKHR1bmluZ19lbmFibGUsIFNfSVJVR08sIHZhcmlheF9nZXRfdHVuaW5nX2VuYWJsZSwgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih2b2x1bWVfZHVtcCwgU19JUlVHTywgdmFyaWF4X2dldF92b2x1bWVfZHVtcCwKKwkJICAgbGluZTZfbm9wX3dyaXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih0dW5pbmdfZW5hYmxlLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3R1bmluZ19lbmFibGUsCisJCSAgIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodHVuaW5nNiwgU19JUlVHTywgdmFyaWF4X2dldF90dW5pbmc2LCBsaW5lNl9ub3Bfd3JpdGUpOwogc3RhdGljIERFVklDRV9BVFRSKHR1bmluZzUsIFNfSVJVR08sIHZhcmlheF9nZXRfdHVuaW5nNSwgbGluZTZfbm9wX3dyaXRlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0dW5pbmc0LCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3R1bmluZzQsIGxpbmU2X25vcF93cml0ZSk7CkBAIC0zOTksNyArNTI3LDggQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihtaXgzLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X21peDMsIGxpbmU2X25vcF93cml0ZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIobWl4MiwgU19JUlVHTywgdmFyaWF4X2dldF9taXgyLCBsaW5lNl9ub3Bfd3JpdGUpOwogc3RhdGljIERFVklDRV9BVFRSKG1peDEsIFNfSVJVR08sIHZhcmlheF9nZXRfbWl4MSwgbGluZTZfbm9wX3dyaXRlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwaWNrdXBfd2lyaW5nLCBTX0lSVUdPLCB2YXJpYXhfZ2V0X3BpY2t1cF93aXJpbmcsIGxpbmU2X25vcF93cml0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlja3VwX3dpcmluZywgU19JUlVHTywgdmFyaWF4X2dldF9waWNrdXBfd2lyaW5nLAorCQkgICBsaW5lNl9ub3Bfd3JpdGUpOwogCiBpbnQgcG9kX2NyZWF0ZV9maWxlcyhpbnQgZmlybXdhcmUsIGludCB0eXBlLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC00MDcsNyArNTM2LDggQEAKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3R3ZWFrKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl93YWhfcG9zaXRpb24pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY29tcHJlc3Npb25fZ2FpbikpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9jb21wcmVzc2lvbl9nYWluKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92b2xfcGVkYWxfcG9zaXRpb24pKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2NvbXByZXNzaW9uX3RocmVzaG9sZCkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGFuKSk7CkBAIC00MjksNyArNTU5LDggQEAKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXZlcmJfbWl4KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lZmZlY3Rfc2V0dXApKTsKIAlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMV9mcmVxdWVuY3kpKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8xX2ZyZXF1ZW5jeSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wcmVzZW5jZSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCkBAIC00NDMsMTAgKzU3NCwxMiBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfZW5hYmxlKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMSkpOwotCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMV9ub3RlX3ZhbHVlKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX25vdGVfdmFsdWUpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2ZyZXF1ZW5jeV9fYmFzcykpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMikpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfdm9sdW1lX21peCkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMykpOwpAQCAtNDU5LDI2ICs1OTIsMzQgQEAKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmV2ZXJiX3RvbmUpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmV2ZXJiX3ByZV9kZWxheSkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9yZXZlcmJfcHJlX2RlbGF5KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3JldmVyYl9wcmVfcG9zdCkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9yZXZlcmJfcHJlX3Bvc3QpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3kpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcykpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfM19mcmVxdWVuY3lfX2Jhc3MpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3dhaF9lbmFibGUpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX21vZHVsYXRpb25fbG9fY3V0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX21vZHVsYXRpb25fbG9fY3V0KSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9yZXZlcmJfbG9fY3V0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX2RlbGF5X3JldmVyYl9sb19jdXQpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZvbHVtZV9wZWRhbF9taW5pbXVtKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfdm9sdW1lX3BlZGFsX21pbmltdW0pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lcV9wcmVfcG9zdCkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2VxX3ByZV9wb3N0KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92b2x1bWVfcHJlX3Bvc3QpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2RpX21vZGVsKSk7CkBAIC00OTYsMTkgKzYzNywyNSBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbW9kdWxhdGlvbl9tb2RlbCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfM19mcmVxdWVuY3kpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5X19iYXNzKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5X19iYXNzKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8xX2RvdWJsZV9wcmVjaXNpb24pKTsKIAlpZiAoZmlybXdhcmUgPj0gMjAwKQogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2VxX2VuYWJsZSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdGFwKSk7Ci0JQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduKSk7CisJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkgICAgIChkZXYsICZkZXZfYXR0cl92b2x1bWVfdHdlYWtfcGVkYWxfYXNzaWduKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF81X2ZyZXF1ZW5jeSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNV9mcmVxdWVuY3kpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3R1bmVyKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taWNfc2VsZWN0aW9uKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9jYWJpbmV0X21vZGVsKSk7CkBAIC01MTYsMjUgKzY2MywzMCBAQAogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcm9vbWxldmVsKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZnJlcXVlbmN5KSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF80X2ZyZXF1ZW5jeSkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNl9mcmVxdWVuY3kpKTsKLQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSkpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNl9mcmVxdWVuY3kpKTsKKwlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCSAgICAgKGRldiwgJmRldl9hdHRyX3N0b21wX3BhcmFtXzFfbm90ZV92YWx1ZSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fMikpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fMykpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fNCkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fNSkpOwogCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RvbXBfcGFyYW1fNikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0xJVkUpKSAhPSAwKQotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2FtcF9zd2l0Y2hfc2VsZWN0KSk7CisJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCSAgICAgKGRldiwgJmRldl9hdHRyX2FtcF9zd2l0Y2hfc2VsZWN0KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV80KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV81KSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wcmVfcG9zdCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9tb2RlbCkpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCi0JCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfdmVyYl9tb2RlbCkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgIChkZXYsICZkZXZfYXR0cl9kZWxheV92ZXJiX21vZGVsKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl90ZW1wb19tc2IpKTsKIAlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3RlbXBvX2xzYikpOwogCWlmIChmaXJtd2FyZSA+PSAzMDApCkBAIC01NDksMzAgKzcwMSwzOSBAQAogCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMV9nYWluKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2dhaW5fX2Jhc3MpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZ2Fpbl9fYmFzcykpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8yX2dhaW4pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzJfZ2FpbikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfM19nYWluX19iYXNzKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2dhaW5fX2Jhc3MpKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19QT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfM19nYWluKSk7CisJCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkJICAgICAoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2dhaW4pKTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzRfZ2Fpbl9fYmFzcykpOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNF9nYWluX19iYXNzKSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF81X2dhaW5fX2Jhc3MpKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzVfZ2Fpbl9fYmFzcykpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF80X2dhaW4pKTsKKwkJCUNIRUNLX1JFVFVSTihkZXZpY2VfY3JlYXRlX2ZpbGUKKwkJCQkgICAgIChkZXYsICZkZXZfYXR0cl9iYW5kXzRfZ2FpbikpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNl9nYWluX19iYXNzKSk7Ci0gIHJldHVybiAwOworCQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJCSAgICAgKGRldiwgJmRldl9hdHRyX2JhbmRfNl9nYWluX19iYXNzKSk7CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBvZF9jcmVhdGVfZmlsZXMpOwogCiB2b2lkIHBvZF9yZW1vdmVfZmlsZXMoaW50IGZpcm13YXJlLCBpbnQgdHlwZSwgc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNjE4LDcgKzc3OSw4IEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3BhcmFtXzFfbm90ZV92YWx1ZSk7CiAJaWYgKCh0eXBlICYgKExJTkU2X0JJVFNfQkFTU1BPRFhUQUxMKSkgIT0gMCkKIAkJaWYgKGZpcm13YXJlID49IDIwMCkKLQkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsCisJCQkJCSAgICZkZXZfYXR0cl9iYW5kXzJfZnJlcXVlbmN5X19iYXNzKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMik7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RlbGF5X3ZvbHVtZV9taXgpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZWxheV9wYXJhbV8zKTsKQEAgLTYzOSw3ICs4MDEsOCBAQAogCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfMl9mcmVxdWVuY3kpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCi0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfYmFuZF8zX2ZyZXF1ZW5jeV9fYmFzcyk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3dhaF9lbmFibGUpOwogCWlmICgodHlwZSAmIChMSU5FNl9CSVRTX0JBU1NQT0RYVEFMTCkpICE9IDApCiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2R1bGF0aW9uX2xvX2N1dCk7CkBAIC02NzEsNyArODM0LDggQEAKIAkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9iYW5kXzNfZnJlcXVlbmN5KTsKIAlpZiAoKHR5cGUgJiAoTElORTZfQklUU19CQVNTUE9EWFRBTEwpKSAhPSAwKQogCQlpZiAoZmlybXdhcmUgPj0gMjAwKQotCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwKKwkJCQkJICAgJmRldl9hdHRyX2JhbmRfNF9mcmVxdWVuY3lfX2Jhc3MpOwogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9tb2RfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGVsYXlfcGFyYW1fMV9kb3VibGVfcHJlY2lzaW9uKTsKIAlpZiAoZmlybXdhcmUgPj0gMjAwKQpAQCAtNzQ0LDggKzkwOCw2IEBACiAJCWlmIChmaXJtd2FyZSA+PSAyMDApCiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfYmFuZF82X2dhaW5fX2Jhc3MpOwogfQotCi1FWFBPUlRfU1lNQk9MKHBvZF9jcmVhdGVfZmlsZXMpOwogRVhQT1JUX1NZTUJPTChwb2RfcmVtb3ZlX2ZpbGVzKTsKIAogaW50IHZhcmlheF9jcmVhdGVfZmlsZXMoaW50IGZpcm13YXJlLCBpbnQgdHlwZSwgc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNzkwLDggKzk1Miw5IEBACiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taXgyKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9taXgxKSk7CiAJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9waWNrdXBfd2lyaW5nKSk7Ci0gIHJldHVybiAwOworCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTCh2YXJpYXhfY3JlYXRlX2ZpbGVzKTsKIAogdm9pZCB2YXJpYXhfcmVtb3ZlX2ZpbGVzKGludCBmaXJtd2FyZSwgaW50IHR5cGUsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTgzNSw2ICs5OTgsNCBAQAogCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9taXgxKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGlja3VwX3dpcmluZyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wodmFyaWF4X2NyZWF0ZV9maWxlcyk7CiBFWFBPUlRfU1lNQk9MKHZhcmlheF9yZW1vdmVfZmlsZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L2RyaXZlci5jCmluZGV4IGYxODhlY2UuLmU0MDc4YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvZHJpdmVyLmMKQEAgLTE2OCwxOSArMTY4LDE5IEBACiAjZW5kaWYKIAogLyoKLQlTZW5kIHJhdyBtZXNzYWdlIGluIHBpZWNlcyBvZiB3TWF4UGFja2V0U2l6ZSBieXRlcy4KKwlTZW5kIHJhdyBtZXNzYWdlIGluIHBpZWNlcyBvZiBtYXhfcGFja2V0X3NpemUgYnl0ZXMuCiAqLwogaW50IGxpbmU2X3NlbmRfcmF3X21lc3NhZ2Uoc3RydWN0IHVzYl9saW5lNiAqbGluZTYsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKIAkJCSAgIGludCBzaXplKQogewogCWludCBpLCBkb25lID0gMDsKKwlpbnQgYWN0dWFsX3NpemU7CiAKICNpZiBET19EVU1QX1VSQl9TRU5ECiAJbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNiwgJ1MnLCBidWZmZXIsIHNpemUpOwogI2VuZGlmCiAKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBsaW5lNi0+bWF4X3BhY2tldF9zaXplKSB7Ci0JCWludCBwYXJ0aWFsOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IGFjdHVhbF9zaXplKSB7CiAJCWNvbnN0IGNoYXIgKmZyYWdfYnVmID0gYnVmZmVyICsgaTsKIAkJaW50IGZyYWdfc2l6ZSA9IG1pbihsaW5lNi0+bWF4X3BhY2tldF9zaXplLCBzaXplIC0gaSk7CiAJCWludCByZXR2YWw7CkBAIC0xODksNyArMTg5LDcgQEAKIAkJCQkJICAgdXNiX3NuZGludHBpcGUobGluZTYtPnVzYmRldiwKIAkJCQkJCQkgIGxpbmU2LT5lcF9jb250cm9sX3dyaXRlKSwKIAkJCQkJICAgKGNoYXIgKilmcmFnX2J1ZiwgZnJhZ19zaXplLAotCQkJCQkgICAmcGFydGlhbCwgTElORTZfVElNRU9VVCAqIEhaKTsKKwkJCQkJICAgJmFjdHVhbF9zaXplLCBMSU5FNl9USU1FT1VUICogSFopOwogCiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIobGluZTYtPmlmY2RldiwKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlkb25lICs9IGZyYWdfc2l6ZTsKKwkJZG9uZSArPSBhY3R1YWxfc2l6ZTsKIAl9CiAKIAlyZXR1cm4gZG9uZTsKQEAgLTM5NSwxNyArMzk1LDQ0IEBACiAJbGluZTZfc3RhcnRfbGlzdGVuKGxpbmU2KTsKIH0KIAorc3RhdGljIGludCBsaW5lNl9zZW5kKHN0cnVjdCB1c2JfbGluZTYgKmxpbmU2LCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgcGFydGlhbDsKKworI2lmIERPX0RVTVBfVVJCX1NFTkQKKwlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2LCAnUycsIGJ1ZiwgbGVuKTsKKyNlbmRpZgorCisJcmV0dmFsID0gdXNiX2ludGVycnVwdF9tc2cobGluZTYtPnVzYmRldiwKKwkJCQkgICB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LAorCQkJCQkJICBsaW5lNi0+ZXBfY29udHJvbF93cml0ZSksCisJCQkJICAgYnVmLCBsZW4sICZwYXJ0aWFsLAorCQkJCSAgIExJTkU2X1RJTUVPVVQgKiBIWik7CisKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIobGluZTYtPmlmY2RldiwKKwkJCSJ1c2JfaW50ZXJydXB0X21zZyBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKKwlpZiAocGFydGlhbCAhPSBsZW4pIHsKKwkJZGV2X2VycihsaW5lNi0+aWZjZGV2LAorCQkJInVzYl9pbnRlcnJ1cHRfbXNnIHNlbnQgcGFydGlhbCBtZXNzYWdlICglZClcbiIsCisJCQkgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCiAvKgogCVNlbmQgY2hhbm5lbCBudW1iZXIgKGkuZS4sIHN3aXRjaCB0byBhIGRpZmZlcmVudCBzb3VuZCkuCiAqLwogaW50IGxpbmU2X3NlbmRfcHJvZ3JhbShzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgaW50IHZhbHVlKQogewotCWludCByZXR2YWw7CiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwotCXVuc2lnbmVkIGludCBwYXJ0aWFsOworCXNpemVfdCBsZW4gPSAyOwogCi0JYnVmZmVyID0ga21hbGxvYygyLCBHRlBfS0VSTkVMKTsKLQorCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikgewogCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00MTQsMjAgKzQ0MSw3IEBACiAJYnVmZmVyWzBdID0gTElORTZfUFJPR1JBTV9DSEFOR0UgfCBMSU5FNl9DSEFOTkVMX0hPU1Q7CiAJYnVmZmVyWzFdID0gdmFsdWU7CiAKLSNpZiBET19EVU1QX1VSQl9TRU5ECi0JbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNiwgJ1MnLCBidWZmZXIsIDIpOwotI2VuZGlmCi0KLQlyZXR2YWwgPSB1c2JfaW50ZXJydXB0X21zZyhsaW5lNi0+dXNiZGV2LAotCQkJCSAgIHVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsCi0JCQkJCQkgIGxpbmU2LT5lcF9jb250cm9sX3dyaXRlKSwKLQkJCQkgICBidWZmZXIsIDIsICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOwotCi0JaWYgKHJldHZhbCkKLQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAidXNiX2ludGVycnVwdF9tc2cgZmFpbGVkICglZClcbiIsIHJldHZhbCk7Ci0KLQlrZnJlZShidWZmZXIpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGxpbmU2X3NlbmQobGluZTYsIGJ1ZmZlciwgbGVuKTsKIH0KIAogLyoKQEAgLTQzNSwxMiArNDQ5LDEwIEBACiAqLwogaW50IGxpbmU2X3RyYW5zbWl0X3BhcmFtZXRlcihzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiwgaW50IHBhcmFtLCBpbnQgdmFsdWUpCiB7Ci0JaW50IHJldHZhbDsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0JdW5zaWduZWQgaW50IHBhcnRpYWw7CisJc2l6ZV90IGxlbiA9IDM7CiAKLQlidWZmZXIgPSBrbWFsbG9jKDMsIEdGUF9LRVJORUwpOwotCisJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKSB7CiAJCWRldl9lcnIobGluZTYtPmlmY2RldiwgIm91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ1MCwxOSArNDYyLDcgQEAKIAlidWZmZXJbMV0gPSBwYXJhbTsKIAlidWZmZXJbMl0gPSB2YWx1ZTsKIAotI2lmIERPX0RVTVBfVVJCX1NFTkQKLQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2LCAnUycsIGJ1ZmZlciwgMyk7Ci0jZW5kaWYKLQotCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxpbmU2LT51c2JkZXYsCi0JCQkJCQkJCQkJCQkJCSB1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+ZXBfY29udHJvbF93cml0ZSksCi0JCQkJCQkJCQkJCQkJCSBidWZmZXIsIDMsICZwYXJ0aWFsLCBMSU5FNl9USU1FT1VUICogSFopOwotCi0JaWYgKHJldHZhbCkKLQkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAidXNiX2ludGVycnVwdF9tc2cgZmFpbGVkICglZClcbiIsIHJldHZhbCk7Ci0KLQlrZnJlZShidWZmZXIpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGxpbmU2X3NlbmQobGluZTYsIGJ1ZmZlciwgbGVuKTsKIH0KIAogLyoKQEAgLTQ3Niw4ICs0NzYsMTAgQEAKIAogCS8qIHF1ZXJ5IHRoZSBzZXJpYWwgbnVtYmVyOiAqLwogCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JkZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JkZXYsIDApLCAweDY3LAotCQkJCQkJCQkJCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfT1VULAotCQkJCQkJCQkJCQkJKGRhdGFsZW4gPDwgOCkgfCAweDIxLCBhZGRyZXNzLCBOVUxMLCAwLCBMSU5FNl9USU1FT1VUICogSFopOworCQkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UKKwkJCQkgICAgICB8IFVTQl9ESVJfT1VULAorCQkJCSAgICAgIChkYXRhbGVuIDw8IDgpIHwgMHgyMSwgYWRkcmVzcywKKwkJCQkgICAgICBOVUxMLCAwLCBMSU5FNl9USU1FT1VUICogSFopOwogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAicmVhZCByZXF1ZXN0IGZhaWxlZCAoZXJyb3IgJWQpXG4iLCByZXQpOwpAQCAtNDk2LDkgKzQ5OCw3IEBACiAJCQkJInJlY2VpdmUgbGVuZ3RoIGZhaWxlZCAoZXJyb3IgJWQpXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCX0KLQl3aGlsZSAobGVuID09IDB4ZmYpCi0JCTsKKwl9IHdoaWxlIChsZW4gPT0gMHhmZik7CiAKIAlpZiAobGVuICE9IGRhdGFsZW4pIHsKIAkJLyogc2hvdWxkIGJlIGVxdWFsIG9yIHNvbWV0aGluZyB3ZW50IHdyb25nICovCkBAIC02ODIsMTAgKzY4MiwxNCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGNoZWNrIHZlbmRvciBhbmQgcHJvZHVjdCBpZCAqLwotCWZvciAoZGV2dHlwZSA9IEFSUkFZX1NJWkUobGluZTZfaWRfdGFibGUpIC0gMTsgZGV2dHlwZS0tOykKLQkJaWYgKChsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IGxpbmU2X2lkX3RhYmxlW2RldnR5cGVdLmlkVmVuZG9yKSAmJgotCQkJIChsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBsaW5lNl9pZF90YWJsZVtkZXZ0eXBlXS5pZFByb2R1Y3QpKQorCWZvciAoZGV2dHlwZSA9IEFSUkFZX1NJWkUobGluZTZfaWRfdGFibGUpIC0gMTsgZGV2dHlwZS0tOykgeworCQl1MTYgdmVuZG9yID0gbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKKwkJdTE2IHByb2R1Y3QgPSBsZTE2X3RvX2NwdSh1c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworCQlpZiAodmVuZG9yID09IGxpbmU2X2lkX3RhYmxlW2RldnR5cGVdLmlkVmVuZG9yCisJCSAgICAgJiYgcHJvZHVjdCA9PSBsaW5lNl9pZF90YWJsZVtkZXZ0eXBlXS5pZFByb2R1Y3QpCiAJCQlicmVhazsKKwl9CiAKIAlpZiAoZGV2dHlwZSA8IDApCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTAzNiw5ICsxMDQwLDEwIEBACiAKIAkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiTGluZTYgJXMgbm93IGRpc2Nvbm5lY3RlZFxuIiwgbGluZTYtPnByb3BlcnRpZXMtPm5hbWUpOwogCi0JCWZvciAoaSA9IExJTkU2X01BWF9ERVZJQ0VTOyBpLS07KQorCQlmb3IgKGkgPSBMSU5FNl9NQVhfREVWSUNFUzsgaS0tOykgewogCQkJaWYgKGxpbmU2X2RldmljZXNbaV0gPT0gbGluZTYpCiAJCQkJbGluZTZfZGV2aWNlc1tpXSA9IE5VTEw7CisJCX0KIAl9CiAKIAlsaW5lNl9kZXN0cnVjdChpbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9taWRpLmMKaW5kZXggODlhMmIxNy4uNmVmNDQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L21pZGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvbWlkaS5jCkBAIC0zMTgsNyArMzE4LDEzIEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlsaW5lNi0+bGluZTZtaWRpLT5taWRpX21hc2tfdHJhbnNtaXQgPSB2YWx1ZTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zNDQsNyArMzUwLDEzIEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlsaW5lNi0+bGluZTZtaWRpLT5taWRpX21hc2tfcmVjZWl2ZSA9IHZhbHVlOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wY20uYwppbmRleCBmYzQxMTNmLi5kZDk4MTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGNtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BjbS5jCkBAIC0xNTYsNyArMTU2LDggQEAKIAlzdHJjcHkocGNtLT5uYW1lLCBsaW5lNnBjbS0+bGluZTYtPnByb3BlcnRpZXMtPm5hbWUpOwogCiAJLyogc2V0IG9wZXJhdG9ycyAqLwotCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzbmRfbGluZTZfcGxheWJhY2tfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJJnNuZF9saW5lNl9wbGF5YmFja19vcHMpOwogCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgJnNuZF9saW5lNl9jYXB0dXJlX29wcyk7CiAKIAkvKiBwcmUtYWxsb2NhdGlvbiBvZiBidWZmZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcGxheWJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCmluZGV4IGFjYjA2MTIuLjM0MzFmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wbGF5YmFjay5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSAicG9kLmgiCiAjaW5jbHVkZSAicGxheWJhY2suaCIKIAotCiAvKgogCVNvZnR3YXJlIHN0ZXJlbyB2b2x1bWUgY29udHJvbC4KICovCkBAIC0zMCw3ICsyOSw3IEBACiAJaW50IGNobiA9IDA7CiAKIAlpZiAodm9sdW1lWzBdID09IDI1NiAmJiB2b2x1bWVbMV0gPT0gMjU2KQotCQlyZXR1cm47ICAvKiBtYXhpbXVtIHZvbHVtZSAtIG5vIGNoYW5nZSAqLworCQlyZXR1cm47CQkvKiBtYXhpbXVtIHZvbHVtZSAtIG5vIGNoYW5nZSAqLwogCiAJaWYgKGJ5dGVzX3Blcl9mcmFtZSA9PSA0KSB7CiAJCXNob3J0ICpwLCAqYnVmX2VuZDsKQEAgLTY4LDEzICs2NywxNyBAQAogCWludCBpLCB1cmJfc2l6ZSwgdXJiX2ZyYW1lczsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7Ci0JY29uc3QgaW50IGZyYW1lX2luY3JlbWVudCA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5zbmRfbGluZTZfcmF0ZXMucmF0c1swXS5udW1fbWluOwotCWNvbnN0IGludCBmcmFtZV9mYWN0b3IgPSBsaW5lNnBjbS0+cHJvcGVydGllcy0+c25kX2xpbmU2X3JhdGVzLnJhdHNbMF0uZGVuICogKFVTQl9JTlRFUlZBTFNfUEVSX1NFQ09ORCAvIExJTkU2X0lTT19JTlRFUlZBTCk7CisJY29uc3QgaW50IGZyYW1lX2luY3JlbWVudCA9CisJICAgIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5zbmRfbGluZTZfcmF0ZXMucmF0c1swXS5udW1fbWluOworCWNvbnN0IGludCBmcmFtZV9mYWN0b3IgPQorCSAgICBsaW5lNnBjbS0+cHJvcGVydGllcy0+c25kX2xpbmU2X3JhdGVzLnJhdHNbMF0uZGVuICoKKwkgICAgKFVTQl9JTlRFUlZBTFNfUEVSX1NFQ09ORCAvIExJTkU2X0lTT19JTlRFUlZBTCk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3QgdXJiICp1cmJfb3V0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX291dCwgZmxhZ3MpOwotCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPmFjdGl2ZV91cmJfb3V0LCBMSU5FNl9JU09fQlVGRkVSUyk7CisJaW5kZXggPQorCSAgICBmaW5kX2ZpcnN0X3plcm9fYml0KCZsaW5lNnBjbS0+YWN0aXZlX3VyYl9vdXQsIExJTkU2X0lTT19CVUZGRVJTKTsKIAogCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTElORTZfSVNPX0JVRkZFUlMpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGluZTZwY20tPmxvY2tfYXVkaW9fb3V0LCBmbGFncyk7CkBAIC04OCw3ICs5MSw4IEBACiAJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19QQUNLRVRTOyArK2kpIHsKIAkJLyogY29tcHV0ZSBmcmFtZSBzaXplIGZvciBnaXZlbiBzYW1wbGluZyByYXRlICovCiAJCWludCBuLCBmczsKLQkJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmZvdXQgPSAmdXJiX291dC0+aXNvX2ZyYW1lX2Rlc2NbaV07CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0KKwkJICAgICZ1cmJfb3V0LT5pc29fZnJhbWVfZGVzY1tpXTsKIAkJbGluZTZwY20tPmNvdW50X291dCArPSBmcmFtZV9pbmNyZW1lbnQ7CiAJCW4gPSBsaW5lNnBjbS0+Y291bnRfb3V0IC8gZnJhbWVfZmFjdG9yOwogCQlsaW5lNnBjbS0+Y291bnRfb3V0IC09IG4gKiBmcmFtZV9mYWN0b3I7CkBAIC0xMDYsMjUgKzExMCwzNiBAQAogCX0gZWxzZSB7CiAJCWlmIChsaW5lNnBjbS0+cG9zX291dCArIHVyYl9mcmFtZXMgPiBydW50aW1lLT5idWZmZXJfc2l6ZSkgewogCQkJLyoKLQkJCQlUaGUgdHJhbnNmZXJyZWQgYXJlYSBnb2VzIG92ZXIgYnVmZmVyIGJvdW5kYXJ5LAotCQkJCWNvcHkgdGhlIGRhdGEgdG8gdGhlIHRlbXAgYnVmZmVyLgotCQkJKi8KKwkJCSAgIFRoZSB0cmFuc2ZlcnJlZCBhcmVhIGdvZXMgb3ZlciBidWZmZXIgYm91bmRhcnksCisJCQkgICBjb3B5IHRoZSBkYXRhIHRvIHRoZSB0ZW1wIGJ1ZmZlci4KKwkJCSAqLwogCQkJaW50IGxlbjsKIAkJCWxlbiA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplIC0gbGluZTZwY20tPnBvc19vdXQ7CiAJCQl1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXIgPSBsaW5lNnBjbS0+d3JhcF9vdXQ7CiAKIAkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbWVtY3B5KGxpbmU2cGNtLT53cmFwX291dCwgcnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX291dCAqIGJ5dGVzX3Blcl9mcmFtZSwgbGVuICogYnl0ZXNfcGVyX2ZyYW1lKTsKLQkJCQltZW1jcHkobGluZTZwY20tPndyYXBfb3V0ICsgbGVuICogYnl0ZXNfcGVyX2ZyYW1lLCBydW50aW1lLT5kbWFfYXJlYSwgKHVyYl9mcmFtZXMgLSBsZW4pICogYnl0ZXNfcGVyX2ZyYW1lKTsKLQkJCX0gZWxzZQotCQkJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksICJkcml2ZXIgYnVnOiBsZW4gPSAlZFxuIiwgbGVuKTsgIC8qIHRoaXMgaXMgc29tZXdoYXQgcGFyYW5vaWQgKi8KKwkJCQltZW1jcHkobGluZTZwY20tPndyYXBfb3V0LAorCQkJCSAgICAgICBydW50aW1lLT5kbWFfYXJlYSArCisJCQkJICAgICAgIGxpbmU2cGNtLT5wb3Nfb3V0ICogYnl0ZXNfcGVyX2ZyYW1lLAorCQkJCSAgICAgICBsZW4gKiBieXRlc19wZXJfZnJhbWUpOworCQkJCW1lbWNweShsaW5lNnBjbS0+d3JhcF9vdXQgKworCQkJCSAgICAgICBsZW4gKiBieXRlc19wZXJfZnJhbWUsIHJ1bnRpbWUtPmRtYV9hcmVhLAorCQkJCSAgICAgICAodXJiX2ZyYW1lcyAtIGxlbikgKiBieXRlc19wZXJfZnJhbWUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0aGlzIGlzIHNvbWV3aGF0IHBhcmFub2lkICovCisJCQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwKKwkJCQkJImRyaXZlciBidWc6IGxlbiA9ICVkXG4iLCBsZW4pOworCQkJfQogCQl9IGVsc2UgewogCQkJLyogc2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLwotCQkJdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyID0gcnVudGltZS0+ZG1hX2FyZWEgKyBsaW5lNnBjbS0+cG9zX291dCAqIGJ5dGVzX3Blcl9mcmFtZTsKKwkJCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlciA9CisJCQkgICAgcnVudGltZS0+ZG1hX2FyZWEgKworCQkJICAgIGxpbmU2cGNtLT5wb3Nfb3V0ICogYnl0ZXNfcGVyX2ZyYW1lOwogCQl9CiAJfQogCi0JaWYgKChsaW5lNnBjbS0+cG9zX291dCArPSB1cmJfZnJhbWVzKSA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKKwlsaW5lNnBjbS0+cG9zX291dCArPSB1cmJfZnJhbWVzOworCWlmIChsaW5lNnBjbS0+cG9zX291dCA+PSBydW50aW1lLT5idWZmZXJfc2l6ZSkKIAkJbGluZTZwY20tPnBvc19vdXQgLT0gcnVudGltZS0+YnVmZmVyX3NpemU7CiAKIAl1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gdXJiX3NpemU7CkBAIC0xMzMsMTUgKzE0OCwxOSBAQAogCiAjaWYgRE9fRFVNUF9QQ01fU0VORAogCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fUEFDS0VUUzsgKytpKSB7Ci0JCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0gJnVyYl9vdXQtPmlzb19mcmFtZV9kZXNjW2ldOwotCQlsaW5lNl93cml0ZV9oZXhkdW1wKGxpbmU2cGNtLT5saW5lNiwgJ1AnLCB1cmJfb3V0LT50cmFuc2Zlcl9idWZmZXIgKyBmb3V0LT5vZmZzZXQsIGZvdXQtPmxlbmd0aCk7CisJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmb3V0ID0KKwkJICAgICZ1cmJfb3V0LT5pc29fZnJhbWVfZGVzY1tpXTsKKwkJbGluZTZfd3JpdGVfaGV4ZHVtcChsaW5lNnBjbS0+bGluZTYsICdQJywKKwkJCQkgICAgdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyICsgZm91dC0+b2Zmc2V0LAorCQkJCSAgICBmb3V0LT5sZW5ndGgpOwogCX0KICNlbmRpZgogCiAJaWYgKHVzYl9zdWJtaXRfdXJiKHVyYl9vdXQsIEdGUF9BVE9NSUMpID09IDApCiAJCXNldF9iaXQoaW5kZXgsICZsaW5lNnBjbS0+YWN0aXZlX3VyYl9vdXQpOwogCWVsc2UKLQkJZGV2X2VycihzMm0oc3Vic3RyZWFtKSwgIlVSQiBvdXQgIyVkIHN1Ym1pc3Npb24gZmFpbGVkXG4iLCBpbmRleCk7CisJCWRldl9lcnIoczJtKHN1YnN0cmVhbSksICJVUkIgb3V0ICMlZCBzdWJtaXNzaW9uIGZhaWxlZFxuIiwKKwkJCWluZGV4KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpbmU2cGNtLT5sb2NrX2F1ZGlvX291dCwgZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtMTgxLDcgKzIwMCw3IEBACiB9CiAKIC8qCi0JV2FpdCB1bnRpbCB1bmxpbmtpbmcgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgcGxheWJhY2sgVVJCcyBoYXMgYmVlbiBmaW5pc2hlZC4KKyAgIFdhaXQgdW50aWwgdW5saW5raW5nIG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIHBsYXliYWNrIFVSQnMgaGFzIGJlZW4gZmluaXNoZWQuCiAqLwogc3RhdGljIHZvaWQgd2FpdF9jbGVhcl9hdWRpb19vdXRfdXJicyhzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20pCiB7CkBAIC0yMjQsNyArMjQzLDggQEAKIAlpbnQgaSwgaW5kZXgsIGxlbmd0aCA9IDAsIHNodXRkb3duID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KKwkgICAgKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIApAQCAtMjM0LDEzICsyNTQsMTQgQEAKIAkJCWJyZWFrOwogCiAJaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuOyAgLyogVVJCIGhhcyBiZWVuIHVubGlua2VkIGFzeW5jaHJvbm91c2x5ICovCisJCXJldHVybjsJCS8qIFVSQiBoYXMgYmVlbiB1bmxpbmtlZCBhc3luY2hyb25vdXNseSAqLwogCiAJZm9yIChpID0gTElORTZfSVNPX1BBQ0tFVFM7IGktLTspCiAJCWxlbmd0aCArPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaW5lNnBjbS0+bG9ja19hdWRpb19vdXQsIGZsYWdzKTsKLQlsaW5lNnBjbS0+cG9zX291dF9kb25lICs9IGxlbmd0aCAvIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CisJbGluZTZwY20tPnBvc19vdXRfZG9uZSArPQorCSAgICBsZW5ndGggLyBsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2ZyYW1lOwogCiAJaWYgKGxpbmU2cGNtLT5wb3Nfb3V0X2RvbmUgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCWxpbmU2cGNtLT5wb3Nfb3V0X2RvbmUgLT0gcnVudGltZS0+YnVmZmVyX3NpemU7CkBAIC0yNjEsNyArMjgyLDggQEAKIAlpZiAoIXNodXRkb3duKSB7CiAJCXN1Ym1pdF9hdWRpb19vdXRfdXJiKHN1YnN0cmVhbSk7CiAKLQkJaWYgKChsaW5lNnBjbS0+Ynl0ZXNfb3V0ICs9IGxlbmd0aCkgPj0gbGluZTZwY20tPnBlcmlvZF9vdXQpIHsKKwkJbGluZTZwY20tPmJ5dGVzX291dCArPSBsZW5ndGg7CisJCWlmIChsaW5lNnBjbS0+Ynl0ZXNfb3V0ID49IGxpbmU2cGNtLT5wZXJpb2Rfb3V0KSB7CiAJCQlsaW5lNnBjbS0+Ynl0ZXNfb3V0IC09IGxpbmU2cGNtLT5wZXJpb2Rfb3V0OwogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwogCQl9CkBAIC0yNzYsNyArMjk4LDggQEAKIAlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAKIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0ZGVucyhydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQkJICAgICgmbGluZTZwY20tPnByb3BlcnRpZXMtPnNuZF9saW5lNl9yYXRlcykpOworCQkJCQkgICAgKCZsaW5lNnBjbS0+cHJvcGVydGllcy0+CisJCQkJCSAgICAgc25kX2xpbmU2X3JhdGVzKSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTI5MSw3ICszMTQsOCBAQAogfQogCiAvKiBod19wYXJhbXMgcGxheWJhY2sgY2FsbGJhY2sgKi8KLXN0YXRpYyBpbnQgc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCitzdGF0aWMgaW50IHNuZF9saW5lNl9wbGF5YmFja19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewogCWludCByZXQ7CiAJc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwpAQCAtMzQ5LDcgKzM3Myw4IEBACiAJCQllcnIgPSBzdWJtaXRfYXVkaW9fb3V0X2FsbF91cmJzKHN1YnN0cmVhbSk7CiAKIAkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJY2xlYXJfYml0KEJJVF9SVU5OSU5HX1BMQVlCQUNLLCAmbGluZTZwY20tPmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQklUX1JVTk5JTkdfUExBWUJBQ0ssCisJCQkJCSAgJmxpbmU2cGNtLT5mbGFncyk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfQpAQCAtMzg3LDE0ICs0MTIsMTQgQEAKIAogLyogcGxheWJhY2sgb3BlcmF0b3JzICovCiBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2xpbmU2X3BsYXliYWNrX29wcyA9IHsKLQkub3BlbiA9ICAgICAgICBzbmRfbGluZTZfcGxheWJhY2tfb3BlbiwKLQkuY2xvc2UgPSAgICAgICBzbmRfbGluZTZfcGxheWJhY2tfY2xvc2UsCi0JLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCi0JLmh3X3BhcmFtcyA9ICAgc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9ICAgICBzbmRfbGluZTZfcGxheWJhY2tfaHdfZnJlZSwKLQkucHJlcGFyZSA9ICAgICBzbmRfbGluZTZfcHJlcGFyZSwKLQkudHJpZ2dlciA9ICAgICBzbmRfbGluZTZfdHJpZ2dlciwKLQkucG9pbnRlciA9ICAgICBzbmRfbGluZTZfcGxheWJhY2tfcG9pbnRlciwKKwkub3BlbiA9IHNuZF9saW5lNl9wbGF5YmFja19vcGVuLAorCS5jbG9zZSA9IHNuZF9saW5lNl9wbGF5YmFja19jbG9zZSwKKwkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0gc25kX2xpbmU2X3BsYXliYWNrX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNuZF9saW5lNl9wbGF5YmFja19od19mcmVlLAorCS5wcmVwYXJlID0gc25kX2xpbmU2X3ByZXBhcmUsCisJLnRyaWdnZXIgPSBzbmRfbGluZTZfdHJpZ2dlciwKKwkucG9pbnRlciA9IHNuZF9saW5lNl9wbGF5YmFja19wb2ludGVyLAogfTsKIAogaW50IGNyZWF0ZV9hdWRpb19vdXRfdXJicyhzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20pCkBAIC00MDYsNyArNDMxLDggQEAKIAkJc3RydWN0IHVyYiAqdXJiOwogCiAJCS8qIFVSQiBmb3IgYXVkaW8gb3V0OiAqLwotCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX291dFtpXSA9IHVzYl9hbGxvY191cmIoTElORTZfSVNPX1BBQ0tFVFMsIEdGUF9LRVJORUwpOworCQl1cmIgPSBsaW5lNnBjbS0+dXJiX2F1ZGlvX291dFtpXSA9CisJCSAgICB1c2JfYWxsb2NfdXJiKExJTkU2X0lTT19QQUNLRVRTLCBHRlBfS0VSTkVMKTsKIAogCQlpZiAodXJiID09IE5VTEwpIHsKIAkJCWRldl9lcnIobGluZTZwY20tPmxpbmU2LT5pZmNkZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKQEAgLTQxNCw3ICs0NDAsMTAgQEAKIAkJfQogCiAJCXVyYi0+ZGV2ID0gbGluZTZwY20tPmxpbmU2LT51c2JkZXY7Ci0JCXVyYi0+cGlwZSA9IHVzYl9zbmRpc29jcGlwZShsaW5lNnBjbS0+bGluZTYtPnVzYmRldiwgbGluZTZwY20tPmVwX2F1ZGlvX3dyaXRlICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKTsKKwkJdXJiLT5waXBlID0KKwkJICAgIHVzYl9zbmRpc29jcGlwZShsaW5lNnBjbS0+bGluZTYtPnVzYmRldiwKKwkJCQkgICAgbGluZTZwY20tPgorCQkJCSAgICBlcF9hdWRpb193cml0ZSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CiAJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CiAJCXVyYi0+c3RhcnRfZnJhbWUgPSAtMTsKIAkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IExJTkU2X0lTT19QQUNLRVRTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BvZC5jIGIvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3BvZC5jCmluZGV4IDRjNWI5ZDUuLjY4NWM1MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi9wb2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvcG9kLmMKQEAgLTQyMiwxMyArNDIyLDIxIEBACiAvKgogCVJlc29sdmUgdmFsdWUgdG8gbWVtb3J5IGxvY2F0aW9uLgogKi8KLXN0YXRpYyB2b2lkIHBvZF9yZXNvbHZlKGNvbnN0IGNoYXIgKmJ1Ziwgc2hvcnQgYmxvY2swLCBzaG9ydCBibG9jazEsIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uKQorc3RhdGljIGludCBwb2RfcmVzb2x2ZShjb25zdCBjaGFyICpidWYsIHNob3J0IGJsb2NrMCwgc2hvcnQgYmxvY2sxLCB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbikKIHsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlzaG9ydCBibG9jayA9ICh2YWx1ZSA8IDB4NDApID8gYmxvY2swIDogYmxvY2sxOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJc2hvcnQgYmxvY2s7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWJsb2NrID0gKHZhbHVlIDwgMHg0MCkgPyBibG9jazAgOiBibG9jazE7CiAJdmFsdWUgJj0gMHgzZjsKIAlsb2NhdGlvblswXSA9IGJsb2NrID4+IDc7CiAJbG9jYXRpb25bMV0gPSB2YWx1ZSB8IChibG9jayAmIDB4N2YpOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDM4LDE0ICs0NDYsMjAgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0KKwlpbnQgcmV0OwogCWludCBzaXplID0gMyArIHNpemVvZihwb2QtPnByb2dfZGF0YV9idWYpOwogCWNoYXIgKnN5c2V4ID0gcG9kX2FsbG9jX3N5c2V4X2J1ZmZlcihwb2QsIFBPRF9TWVNFWF9TVE9SRSwgc2l6ZSk7CisKIAlpZiAoIXN5c2V4KQogCQlyZXR1cm4gMDsKIAogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTXSA9IDU7ICAvKiBzZWUgcG9kX2R1bXAoKSAqLwotCXBvZF9yZXNvbHZlKGJ1ZiwgYmxvY2swLCBibG9jazEsIHN5c2V4ICsgU1lTRVhfREFUQV9PRlMgKyAxKTsKKwlyZXQgPSBwb2RfcmVzb2x2ZShidWYsIGJsb2NrMCwgYmxvY2sxLCBzeXNleCArIFNZU0VYX0RBVEFfT0ZTICsgMSk7CisJaWYgKHJldCkgeworCQlrZnJlZShzeXNleCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJbWVtY3B5KHN5c2V4ICsgU1lTRVhfREFUQV9PRlMgKyAzLCAmcG9kLT5wcm9nX2RhdGFfYnVmLCBzaXplb2YocG9kLT5wcm9nX2RhdGFfYnVmKSk7CiAKIAlsaW5lNl9zZW5kX3N5c2V4X21lc3NhZ2UoJnBvZC0+bGluZTYsIHN5c2V4LCBzaXplKTsKQEAgLTQ2MSwxMyArNDc1LDE4IEBACiB7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWludCByZXQ7CiAJaW50IHNpemUgPSA0OwogCWNoYXIgKnN5c2V4ID0gcG9kX2FsbG9jX3N5c2V4X2J1ZmZlcihwb2QsIFBPRF9TWVNFWF9EVU1QTUVNLCBzaXplKTsKIAogCWlmICghc3lzZXgpCiAJCXJldHVybiAwOwogCi0JcG9kX3Jlc29sdmUoYnVmLCBibG9jazAsIGJsb2NrMSwgc3lzZXggKyBTWVNFWF9EQVRBX09GUyk7CisJcmV0ID0gcG9kX3Jlc29sdmUoYnVmLCBibG9jazAsIGJsb2NrMSwgc3lzZXggKyBTWVNFWF9EQVRBX09GUyk7CisJaWYgKHJldCkgeworCQlrZnJlZShzeXNleCk7CisJCXJldHVybiByZXQ7CisJfQogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgMl0gPSAwOwogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgM10gPSAwOwogCWxpbmU2X2R1bXBfc3RhcnRlZCgmcG9kLT5kdW1wcmVxLCBQT0RfRFVNUF9NRU1PUlkpOwpAQCAtNTI2LDcgKzU0NSwxMyBAQAogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGRldik7CiAJc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlwb2Rfc2VuZF9jaGFubmVsKHBvZCwgdmFsdWUpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTU3OSw3ICs2MDQsNyBAQAogCiAJaWYgKGNvdW50ICE9IHNpemVvZihwb2QtPnByb2dfZGF0YSkpIHsKIAkJZGV2X2Vycihwb2QtPmxpbmU2LmlmY2RldiwKLQkJCSJkYXRhIGJsb2NrIG11c3QgYmUgZXhhY3RseSAlZCBieXRlc1xuIiwKKwkJCSJkYXRhIGJsb2NrIG11c3QgYmUgZXhhY3RseSAlenUgYnl0ZXNcbiIsCiAJCQlzaXplb2YocG9kLT5wcm9nX2RhdGEpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjQ1LDYgKzY3MCw4IEBACiAJY2hhciAqc3lzZXg7CiAJc3RhdGljIGNvbnN0IGludCBzaXplID0gNTsKIAl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdDsKKwlpbnQgcmV0OwogCiAJaWYgKCgocG9kLT5wcm9nX2RhdGEuY29udHJvbFtQT0RfdHVuZXJdICYgMHg0MCkgPT0gMCkgJiYgdHVuZXIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjUzLDcgKzY4MCwxMiBAQAogCXN5c2V4ID0gcG9kX2FsbG9jX3N5c2V4X2J1ZmZlcihwb2QsIFBPRF9TWVNFWF9TWVNURU0sIHNpemUpOwogCWlmICghc3lzZXgpCiAJCXJldHVybiAwOwotCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkgJiBtYXNrOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnJlc3VsdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZhbHVlID0gcmVzdWx0ICYgbWFzazsKIAlzeXNleFtTWVNFWF9EQVRBX09GU10gPSBjb2RlOwogCXN5c2V4W1NZU0VYX0RBVEFfT0ZTICsgMV0gPSAodmFsdWUgPj4gMTIpICYgMHgwZjsKIAlzeXNleFtTWVNFWF9EQVRBX09GUyArIDJdID0gKHZhbHVlID4+ICA4KSAmIDB4MGY7CkBAIC02OTEsNyArNzIzLDcgQEAKIAogCWlmIChjb3VudCAhPSBzaXplb2YocG9kLT5wcm9nX2RhdGEpKSB7CiAJCWRldl9lcnIocG9kLT5saW5lNi5pZmNkZXYsCi0JCQkJCQkiZGF0YSBibG9jayBtdXN0IGJlIGV4YWN0bHkgJWQgYnl0ZXNcbiIsCisJCQkJCQkiZGF0YSBibG9jayBtdXN0IGJlIGV4YWN0bHkgJXp1IGJ5dGVzXG4iLAogCQkJCQkJc2l6ZW9mKHBvZC0+cHJvZ19kYXRhKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTgxMiw3ICs4NDQsMTMgQEAKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwogCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JaW50IHZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcG9kLT5taWRpX3Bvc3Rwcm9jZXNzID0gdmFsdWUgPyAxIDogMDsKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdG9uZXBvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jCmluZGV4IGVhYTEyMjkuLmU2NzcwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi90b25lcG9ydC5jCkBAIC0xNywxMCArMTcsOCBAQAogI2luY2x1ZGUgInBsYXliYWNrLmgiCiAjaW5jbHVkZSAidG9uZXBvcnQuaCIKIAotCiBzdGF0aWMgaW50IHRvbmVwb3J0X3NlbmRfY21kKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXYsIGludCBjbWQxLCBpbnQgY21kMik7CiAKLQogc3RhdGljIHN0cnVjdCBzbmRfcmF0ZGVuIHRvbmVwb3J0X3JhdGRlbiA9IHsKIAkubnVtX21pbiA9IDQ0MTAwLAogCS5udW1fbWF4ID0gNDQxMDAsCkBAIC0yOSw0NyArMjcsNDQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbGluZTZfcGNtX3Byb3BlcnRpZXMgdG9uZXBvcnRfcGNtX3Byb3BlcnRpZXMgPSB7Ci0gIC5zbmRfbGluZTZfcGxheWJhY2tfaHcgPSB7Ci0JCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAotCQkuZm9ybWF0cyA9ICAgICAgICAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQkucmF0ZXMgPSAgICAgICAgICAgIFNORFJWX1BDTV9SQVRFX0tOT1QsCi0JCS5yYXRlX21pbiA9ICAgICAgICAgNDQxMDAsCi0JCS5yYXRlX21heCA9ICAgICAgICAgNDQxMDAsCi0JCS5jaGFubmVsc19taW4gPSAgICAgMiwKLQkJLmNoYW5uZWxzX21heCA9ICAgICAyLAotCQkuYnVmZmVyX2J5dGVzX21heCA9IDYwMDAwLAotCQkucGVyaW9kX2J5dGVzX21pbiA9IDE4MCAqIDQsCi0JCS5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKLQkJLnBlcmlvZHNfbWluID0gICAgICAxLAotCQkucGVyaW9kc19tYXggPSAgICAgIDEwMjQKLQl9LAotICAuc25kX2xpbmU2X2NhcHR1cmVfaHcgPSB7Ci0JCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCQkJIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCi0JCS5mb3JtYXRzID0gICAgICAgICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCS5yYXRlcyA9ICAgICAgICAgICAgU05EUlZfUENNX1JBVEVfS05PVCwKLQkJLnJhdGVfbWluID0gICAgICAgICA0NDEwMCwKLQkJLnJhdGVfbWF4ID0gICAgICAgICA0NDEwMCwKLQkJLmNoYW5uZWxzX21pbiA9ICAgICAyLAotCQkuY2hhbm5lbHNfbWF4ID0gICAgIDIsCi0JCS5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCi0JCS5wZXJpb2RfYnl0ZXNfbWluID0gMTg4ICogNCwKLQkJLnBlcmlvZF9ieXRlc19tYXggPSA4MTkyLAotCQkucGVyaW9kc19taW4gPSAgICAgIDEsCi0JCS5wZXJpb2RzX21heCA9ICAgICAgMTAyNAotCX0sCisJLnNuZF9saW5lNl9wbGF5YmFja19odyA9IHsKKwkJCQkgIC5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX1BBVVNFIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJCQkJICAuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQkJCSAgLnJhdGVzID0gU05EUlZfUENNX1JBVEVfS05PVCwKKwkJCQkgIC5yYXRlX21pbiA9IDQ0MTAwLAorCQkJCSAgLnJhdGVfbWF4ID0gNDQxMDAsCisJCQkJICAuY2hhbm5lbHNfbWluID0gMiwKKwkJCQkgIC5jaGFubmVsc19tYXggPSAyLAorCQkJCSAgLmJ1ZmZlcl9ieXRlc19tYXggPSA2MDAwMCwKKwkJCQkgIC5wZXJpb2RfYnl0ZXNfbWluID0gMTgwICogNCwKKwkJCQkgIC5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKKwkJCQkgIC5wZXJpb2RzX21pbiA9IDEsCisJCQkJICAucGVyaW9kc19tYXggPSAxMDI0fSwKKwkuc25kX2xpbmU2X2NhcHR1cmVfaHcgPSB7CisJCQkJIC5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJCQkJIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCQkJIC5yYXRlcyA9IFNORFJWX1BDTV9SQVRFX0tOT1QsCisJCQkJIC5yYXRlX21pbiA9IDQ0MTAwLAorCQkJCSAucmF0ZV9tYXggPSA0NDEwMCwKKwkJCQkgLmNoYW5uZWxzX21pbiA9IDIsCisJCQkJIC5jaGFubmVsc19tYXggPSAyLAorCQkJCSAuYnVmZmVyX2J5dGVzX21heCA9IDYwMDAwLAorCQkJCSAucGVyaW9kX2J5dGVzX21pbiA9IDE4OCAqIDQsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKKwkJCQkgLnBlcmlvZHNfbWluID0gMSwKKwkJCQkgLnBlcmlvZHNfbWF4ID0gMTAyNH0sCiAJLnNuZF9saW5lNl9yYXRlcyA9IHsKLQkJLm5yYXRzID0gMSwKLQkJLnJhdHMgPSAmdG9uZXBvcnRfcmF0ZGVuCi0JfSwKKwkJCSAgICAubnJhdHMgPSAxLAorCQkJICAgIC5yYXRzID0gJnRvbmVwb3J0X3JhdGRlbn0sCiAJLmJ5dGVzX3Blcl9mcmFtZSA9IDQKIH07CiAKQEAgLTEwMSw4ICs5NiwxNCBAQAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JY2hhciAqYzsKLQlsZWRfcmVkID0gc2ltcGxlX3N0cnRvbChidWYsICZjLCAxMCk7CisJaW50IHJldHZhbDsKKwlsb25nIHZhbHVlOworCisJcmV0dmFsID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlsZWRfcmVkID0gdmFsdWU7CiAJdG9uZXBvcnRfdXBkYXRlX2xlZChkZXYpOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTExMSwxNSArMTEyLDIyIEBACiAJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JY2hhciAqYzsKLQlsZWRfZ3JlZW4gPSBzaW1wbGVfc3RydG9sKGJ1ZiwgJmMsIDEwKTsKKwlpbnQgcmV0dmFsOworCWxvbmcgdmFsdWU7CisKKwlyZXR2YWwgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWxlZF9ncmVlbiA9IHZhbHVlOwogCXRvbmVwb3J0X3VwZGF0ZV9sZWQoZGV2KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihsZWRfcmVkLCBTX0lXVUdPIHwgU19JUlVHTywgbGluZTZfbm9wX3JlYWQsIHRvbmVwb3J0X3NldF9sZWRfcmVkKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihsZWRfZ3JlZW4sIFNfSVdVR08gfCBTX0lSVUdPLCBsaW5lNl9ub3BfcmVhZCwgdG9uZXBvcnRfc2V0X2xlZF9ncmVlbik7Ci0KK3N0YXRpYyBERVZJQ0VfQVRUUihsZWRfcmVkLCBTX0lXVUdPIHwgU19JUlVHTywgbGluZTZfbm9wX3JlYWQsCisJCSAgIHRvbmVwb3J0X3NldF9sZWRfcmVkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihsZWRfZ3JlZW4sIFNfSVdVR08gfCBTX0lSVUdPLCBsaW5lNl9ub3BfcmVhZCwKKwkJICAgdG9uZXBvcnRfc2V0X2xlZF9ncmVlbik7CiAKIHN0YXRpYyBpbnQgdG9uZXBvcnRfc2VuZF9jbWQoc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiwgaW50IGNtZDEsIGludCBjbWQyKQogewpAQCAtMTk2LDE2ICsyMDQsMTggQEAKIAlsaW5lNl93cml0ZV9kYXRhKGxpbmU2LCAweDgwYzYsICZ0aWNrcywgNCk7CiAKIAkvKgotCXNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGUgZmlyc3QgdHdvLi4uCi0JKi8KKwkgICBzZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhlIGZpcnN0IHR3by4uLgorCSAqLwogCS8qIHRvbmVwb3J0X3NlbmRfY21kKHVzYmRldiwgMHgwMjAxLCAweDAwMDIpOyAqLwogCS8qIHRvbmVwb3J0X3NlbmRfY21kKHVzYmRldiwgMHgwODAxLCAweDAwMDApOyAqLwogCS8qIG9ubHkgb25lIHRoYXQgd29ya3MgZm9yIG1lOyBvbiBHUCwgVFAgbWlnaHQgYmUgZGlmZmVyZW50PyAqLwogCXRvbmVwb3J0X3NlbmRfY21kKHVzYmRldiwgMHgwMzAxLCAweDAwMDApOwogCiAJaWYgKHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgIT0gTElORTZfREVWSURfR1VJVEFSUE9SVCkgewotCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2xlZF9yZWQpKTsKLQkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9sZWRfZ3JlZW4pKTsKKwkJQ0hFQ0tfUkVUVVJOKGRldmljZV9jcmVhdGVfZmlsZQorCQkJICAgICAoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGVkX3JlZCkpOworCQlDSEVDS19SRVRVUk4oZGV2aWNlX2NyZWF0ZV9maWxlCisJCQkgICAgICgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9sZWRfZ3JlZW4pKTsKIAkJdG9uZXBvcnRfdXBkYXRlX2xlZCgmdXNiZGV2LT5kZXYpOwogCX0KIApAQCAtMjIzLDcgKzIzMyw4IEBACiAJCXJldHVybjsKIAl0b25lcG9ydCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAotCWlmICh0b25lcG9ydC0+bGluZTYudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBMSU5FNl9ERVZJRF9HVUlUQVJQT1JUKSB7CisJaWYgKHRvbmVwb3J0LT5saW5lNi51c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0ICE9CisJICAgIExJTkU2X0RFVklEX0dVSVRBUlBPUlQpIHsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2xlZF9yZWQpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGVkX2dyZWVuKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdmFyaWF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvbGluZTYvdmFyaWF4LmMKaW5kZXggZjlkOTY5OC4uNDhkODM0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpbmU2L3ZhcmlheC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saW5lNi92YXJpYXguYwpAQCAtMTg0LDcgKzE4NCwxMiBAQAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3ZhcmlheCAqdmFyaWF4ID0gdXNiX2dldF9pbnRmZGF0YSh0b191c2JfaW50ZXJmYWNlKGRldikpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWx1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWlmIChsaW5lNl90cmFuc21pdF9wYXJhbWV0ZXIoJnZhcmlheC0+bGluZTYsIFZBUklBWE1JRElfdm9sdW1lLAogCQkJCSAgICAgdmFsdWUpID09IDApCkBAIC0yMTEsNyArMjE2LDEyIEBACiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHVzYl9saW5lNl92YXJpYXggKnZhcmlheCA9IHVzYl9nZXRfaW50ZmRhdGEodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpZiAobGluZTZfc2VuZF9wcm9ncmFtKCZ2YXJpYXgtPmxpbmU2LCB2YWx1ZSkgPT0gMCkKIAkJdmFyaWF4LT5tb2RlbCA9IHZhbHVlOwpAQCAtMjM3LDggKzI0NywxNCBAQAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdXNiX2xpbmU2X3ZhcmlheCAqdmFyaWF4ID0gdXNiX2dldF9pbnRmZGF0YSh0b191c2JfaW50ZXJmYWNlKGRldikpOwotCWludCB2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApID8gMSA6IDA7Ci0JdmFyaWF4LT5idWZmZXJfYWN0aXZhdGVbVkFSSUFYX09GRlNFVF9BQ1RJVkFURV0gPSB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2YXJpYXgtPmJ1ZmZlcl9hY3RpdmF0ZVtWQVJJQVhfT0ZGU0VUX0FDVElWQVRFXSA9IHZhbHVlID8gMTogMDsKIAlsaW5lNl9zZW5kX3Jhd19tZXNzYWdlX2FzeW5jKCZ2YXJpYXgtPmxpbmU2LCB2YXJpYXgtPmJ1ZmZlcl9hY3RpdmF0ZSwKIAkJCQkgICAgIHNpemVvZih2YXJpYXhfYWN0aXZhdGUpKTsKIAlyZXR1cm4gY291bnQ7CkBAIC0yNjIsNyArMjc4LDEyIEBACiAJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHVzYl9saW5lNl92YXJpYXggKnZhcmlheCA9IHVzYl9nZXRfaW50ZmRhdGEodG9fdXNiX2ludGVyZmFjZShkZXYpKTsKLQlpbnQgdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpZiAobGluZTZfdHJhbnNtaXRfcGFyYW1ldGVyKCZ2YXJpYXgtPmxpbmU2LCBWQVJJQVhNSURJX3RvbmUsCiAJCQkJICAgICB2YWx1ZSkgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1wb3cuaCBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vY3ZteC1wb3cuaAppbmRleCBjNWQ2NmYyLi5iZjllMDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2N2bXgtcG93LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9jdm14LXBvdy5oCkBAIC0xOTU5LDcgKzE5NTksNyBAQAogICogQGJ1ZmZlcl9zaXplOgogICogICAgICAgICAgICAgICBUaGUgc2l6ZSBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyCiAgKgotICogUmV0dXJucyBaZXJvIG9uIHN1Y2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICogUmV0dXJucyBaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKICAqLwogZXh0ZXJuIGludCBjdm14X3Bvd19jYXB0dXJlKHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCmluZGV4IDg3MDQxMzMuLmZiYWE0NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKQEAgLTMwOCw3ICszMDgsNyBAQAogCiAJLyoKIAkgKiBEdWUgdG8gR01YIGVycmF0YSBpbiBDTjNYWFggc2VyaWVzIGNoaXBzLCBpdCBpcyBuZWNlc3NhcnkKLQkgKiB0byB0YWtlIHRoZSBsaW5rIGRvd24gaW1tZWRpYXRlbHkgd2huZSB0aGUgUEhZIGNoYW5nZXMKKwkgKiB0byB0YWtlIHRoZSBsaW5rIGRvd24gaW1tZWRpYXRlbHkgd2hlbiB0aGUgUEhZIGNoYW5nZXMKIAkgKiBzdGF0ZS4gSW4gb3JkZXIgdG8gZG8gdGhpcyB3ZSBjYWxsIHRoZSBwb2xsIGZ1bmN0aW9uIGV2ZXJ5CiAJICogdGltZSB0aGUgUkdNSUkgaW5iYW5kIHN0YXR1cyBjaGFuZ2VzLiAgVGhpcyBtYXkgY2F1c2UKIAkgKiBwcm9ibGVtcyBpZiB0aGUgUEhZIGRvZXNuJ3QgaW1wbGVtZW50IGluYmFuZCBzdGF0dXMKQEAgLTMxNyw2ICszMTcsOCBAQAogCWlmIChudW1iZXJfcmdtaWlfcG9ydHMgPT0gMCkgewogCQlyID0gcmVxdWVzdF9pcnEoT0NURU9OX0lSUV9STUwsIGN2bV9vY3RfcmdtaWlfcm1sX2ludGVycnVwdCwKIAkJCQlJUlFGX1NIQVJFRCwgIlJHTUlJIiwgJm51bWJlcl9yZ21paV9wb3J0cyk7CisJCWlmIChyICE9IDApCisJCQlyZXR1cm4gcjsKIAl9CiAJbnVtYmVyX3JnbWlpX3BvcnRzKys7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdHguYwppbmRleCA4MWE4NTEzLi41MzUyOTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC10eC5jCkBAIC02MjQsNyArNjI0LDcgQEAKIEVYUE9SVF9TWU1CT0woY3ZtX29jdF90cmFuc21pdF9xb3MpOwogCiAvKioKLSAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHNrYiB0aGF0IGFyZSBjdXJyZW50eSBxdWV1ZWQgZm9yIFRYLgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgc2tiIHRoYXQgYXJlIGN1cnJlbnRseSBxdWV1ZWQgZm9yIFRYLgogICoKICAqIEBkZXY6ICAgIERldmljZSBiZWluZyBzaHV0ZG93bgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NjbWQuYwppbmRleCA4M2RkOGJhLi44ZGEyOGVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jY21kLmMKQEAgLTg5OSw3ICs4OTksNyBAQAogCQl6ZlN0YURpc2FibGVTV0VuY3J5cHRpb24oZGV2KTsKIAl9CiAKLQkvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwKKwkvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hbmNlIHdpdGggSFQgQVAsCiAJZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLwogCS8qIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsgKi8KIApAQCAtMTQwNyw3ICsxNDA3LDcgQEAKIAkJemZTdGFEaXNhYmxlU1dFbmNyeXB0aW9uKGRldik7CiAJfQogCi0JLyogCUltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLAorCS8qIAlJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hbmNlIHdpdGggSFQgQVAsCiAJCWRldGFpbCBpbmZvcm1hdGlvbiBwbGVhc2UgbG9vayBidWcjMzI0OTUKIAkqLwogCS8qIHpmSHBTZXRUVFNJRlNUaW1lKGRldiwgMHg4KTsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW0uYwppbmRleCBiZWQxNmI1Li5hNmMxYjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbS5jCkBAIC0xNDI4LDcgKzE0MjgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogQmVhY29uICovCiAgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9CRUFDT04gOgotICAgICAgICAgICAgICAgIC8qIGlmIGVuYWJsZSA4MDIuMTFoIGFuZCBjdXJyZW50IGNoYW5lbCBpcyBzaWxlbnQgYnV0IHJlY2VpdmUgYmVhY29uIGZyb20gb3RoZXIgQVAgKi8KKyAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFubmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKICAgICAgICAgICAgICAgICB7CkBAIC0xNDY5LDcgKzE0NjksNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlc3BvbnNlICovCiAgICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCA6Ci0gICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBwcm9iZSByZXNwb25zZSBmcm9tIG90aGVyIEFQICovCisgICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbm5lbCBpcyBzaWxlbnQgYnV0IHJlY2VpdmUgcHJvYmUgcmVzcG9uc2UgZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgIGlmICgoKHdkLT5yZWd1bGF0aW9uVGFibGUuYWxsb3dDaGFubmVsW3dkLT5yZWd1bGF0aW9uVGFibGUuQ3VyQ2hJbmRleF0uY2hhbm5lbEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAmIFpNX1JFR19GTEFHX0NIQU5ORUxfQ1NBKSAhPSAwKSAmJiB3ZC0+c3RhLkRGU0VuYWJsZSkKICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvY21tc3RhLmMKaW5kZXggYjI4YTRlMi4uYTExZDU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2NtbXN0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jbW1zdGEuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgLyogQ2hhbmdlIGludGVybmFsIHN0YXRlICovCiAgICAgemZDaGFuZ2VBZGFwdGVyU3RhdGUoZGV2LCBaTV9TVEFfU1RBVEVfRElTQ09OTkVDVCk7CiAKLSAgICAvKiBJbXByb3ZlIFdFUC9US0lQIHBlcmZvcm1hY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLworICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFuY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLwogICAgIC8vemZIcFNldFRUU0lGU1RpbWUoZGV2LCAweDgpOwogCiAgICAgLyogTm90aWZ5IHdyYXBwZXIgb2YgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlcyAqLwpAQCAtNDE0OCw3ICs0MTQ4LDcgQEAKICAgICAgICAgICAgIHdkLT5zdGEuYklzU2hhcmVkS2V5ID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFjZSB3aXRoIEhUIEFQLCBkZXRhaWwgaW5mb3JtYXRpb24gcGxlYXNlIGxvb2sgYnVnIzMyNDk1ICovCisgICAgICAgIC8qIEltcHJvdmUgV0VQL1RLSVAgcGVyZm9ybWFuY2Ugd2l0aCBIVCBBUCwgZGV0YWlsIGluZm9ybWF0aW9uIHBsZWFzZSBsb29rIGJ1ZyMzMjQ5NSAqLwogICAgICAgICAvKgogICAgICAgICBpZiAoIChwQnNzSW5mby0+YnJvYWRjb21IVEFwID09IDEpCiAgICAgICAgICAgICAgJiYgKHdkLT5zdGEuU1dFbmNyeXB0RW5hYmxlICE9IDApICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9jdHhyeC5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKaW5kZXggZTI1OGE3ZC4uYWM1NGQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL2N0eHJ4LmMKQEAgLTMwOTMsNyArMzA5Myw3IEBACiAKICAgICBmcmFtZVR5cGUgPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpOwogCi0gICAgLy8gRG9uJ3QgZGl2aWRlIDJeNCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGZyYWdlbWVudGF0aW9uIHBrdCB0byBiZSB0cmVhdGVkIGFzCisgICAgLy8gRG9uJ3QgZGl2aWRlIDJeNCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGZyYWdtZW50YXRpb24gcGt0IHRvIGJlIHRyZWF0ZWQgYXMKICAgICAvLyBkdXBsaWNhdGVkIGZyYW1lcwogICAgIHNlcSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCsyMik7CiAgICAgZHN0MCA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCs0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy84MDIxMWNvcmUvcHViX3pmaS5oCmluZGV4IDYwYjdkMWMuLmI3YjdmNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzLzgwMjExY29yZS9wdWJfemZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvODAyMTFjb3JlL3B1Yl96ZmkuaApAQCAtNzgyLDcgKzc4Miw3IEBACiAKIC8qKioqKiBFbmQgb2Ygc2VjdGlvbiAyICoqKioqLwogCi0vKioqKiogc2VjdGlvbiAzIHBlcmZvcm1hY2UgZXZhbHVhdGlvbiAqKioqKi8KKy8qKioqKiBzZWN0aW9uIDMgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiAqKioqKi8KICNpZmRlZiBaTV9FTkFCTEVfUEVSRk9STUFOQ0VfRVZBTFVBVElPTgogZXh0ZXJuIHZvaWQgemZpVHhQZXJmb3JtYW5jZU1TRFUoemRldl90KiBkZXYsIHUzMl90IHRpY2spOwogZXh0ZXJuIHZvaWQgemZpUnhQZXJmb3JtYW5jZU1QRFUoemRldl90KiBkZXYsIHpidWZfdCogYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hcGRiZy5jCmluZGV4IGQzZTJmNjIuLjBlYjkzZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2FwZGJnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXBkYmcuYwpAQCAtMzgsMzkgKzM4LDM5IEBACiAKICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CiAKLSNkZWZpbmUgWk1fSU9DVExfUkVHX1JFQUQgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgWk1fSU9DVExfUkVHX1dSSVRFICAgICAgICAgIDB4MDIKLSNkZWZpbmUgWk1fSU9DVExfTUVNX0RVTVAgICAgICAgICAgIDB4MDMKLSNkZWZpbmUgWk1fSU9DVExfUkVHX0RVTVAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgWk1fSU9DVExfVFhEX0RVTVAgICAgICAgICAgIDB4MDYKLSNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAgICAgICAgICAgIDB4MDcKLSNkZWZpbmUgWk1fSU9DVExfTUVNX1JFQUQgICAgICAgICAgIDB4MEIKLSNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFICAgICAgICAgIDB4MEMKLSNkZWZpbmUgWk1fSU9DVExfRE1BX1RFU1QgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgWk1fSU9DVExfUkVHX1RFU1QgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgWk1fSU9DVExfVEVTVCAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgWk1fSU9DVExfVEFMTFkgICAgICAgICAgICAgIDB4ODEgLy9DV1lhbmcoKykKLSNkZWZpbmUgWk1fSU9DVExfUlRTICAgICAgICAgICAgICAgIDB4QTAKLSNkZWZpbmUgWk1fSU9DVExfTUlYX01PREUgICAgICAgICAgIDB4QTEKLSNkZWZpbmUgWk1fSU9DVExfRlJBRyAgICAgICAgICAgICAgIDB4QTIKLSNkZWZpbmUgWk1fSU9DVExfU0NBTiAgICAgICAgICAgICAgIDB4QTMKLSNkZWZpbmUgWk1fSU9DVExfS0VZICAgICAgICAgICAgICAgIDB4QTQKLSNkZWZpbmUgWk1fSU9DVExfUkFURSAgICAgICAgICAgICAgIDB4QTUKLSNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFICAgIDB4QTYKLSNkZWZpbmUgWk1fSU9DVExfR0VUX1RYQ05UICAgICAgICAgIDB4QTcKLSNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVCAgICAgIDB4QTgKLSNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERSAgICAgIDB4QTkKLSNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkgICAgICAgIDB4QUEKLSNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19NT0RFICAgICAgIDB4QUIKLSNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RIICAgIDB4QUMgLy9DV1lhbmcoKykKLSNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1FVQUxJVFkgICAgIDB4QUQgLy9DV1lhbmcoKykKLSNkZWZpbmUgWk1fSU9DVExfU0VUX1BJQlNTX01PREUgICAgIDB4QUUKLSNkZWZpbmUJWkRBUElPQ1RMICAgICAgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19SRUFECQkJMHgwMQorI2RlZmluZSBaTV9JT0NUTF9SRUdfV1JJVEUJCQkweDAyCisjZGVmaW5lIFpNX0lPQ1RMX01FTV9EVU1QCQkJMHgwMworI2RlZmluZSBaTV9JT0NUTF9SRUdfRFVNUAkJCTB4MDUKKyNkZWZpbmUgWk1fSU9DVExfVFhEX0RVTVAJCQkweDA2CisjZGVmaW5lIFpNX0lPQ1RMX1JYRF9EVU1QCQkJMHgwNworI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRAkJCTB4MEIKKyNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFCQkJMHgwQworI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVAkJCTB4MTAKKyNkZWZpbmUgWk1fSU9DVExfUkVHX1RFU1QJCQkweDExCisjZGVmaW5lIFpNX0lPQ1RMX1RFU1QJCQkJMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWQkJCQkweDgxIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9SVFMJCQkJMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERQkJCTB4QTEKKyNkZWZpbmUgWk1fSU9DVExfRlJBRwkJCQkweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4JCQkJMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkJCQkJMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFCQkJCTB4QTUKKyNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFCQkweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVAkJCTB4QTcKKyNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVAkJCTB4QTgKKyNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERQkJCTB4QTkKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkJCQkweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERQkJCTB4QUIKKyNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RICQkweEFDIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWQkJCTB4QUQgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFCQkJMHhBRQorI2RlZmluZQlaREFQSU9DVEwJCQkJU0lPQ0RFVlBSSVZBVEUKIAogc3RydWN0IHpkYXBfaW9jdGwgewotCXVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCB0byBydW4gKi8KLQl1bnNpZ25lZCBpbnQgICBhZGRyOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCi0JdW5zaWduZWQgaW50ICAgdmFsdWU7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CQkJLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBpbnQgICBhZGRyOwkJCS8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgICB2YWx1ZTsJCQkvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLwogCXVuc2lnbmVkIGNoYXIgZGF0YVsweDEwMF07CiB9OwogCkBAIC03OSwxMyArNzksMTMgQEAKICNpZiAwCiAKICNkZWZpbmUgU0tJUF9FTEVNIHsgXAotICAgIHdoaWxlKGlzeGRpZ2l0KCpwKSkgXAotICAgICAgICBwKys7IFwKKwl3aGlsZSAoaXN4ZGlnaXQoKnApKSBcCisJCXArKzsgXAogfQogCiAjZGVmaW5lIFNLSVBfREVMSU1FVEVSIHsgXAotICAgIGlmKCpwID09ICc6JyB8fCAqcCA9PSAnICcpIFwKLSAgICAgICAgcCsrOyBcCisJaWYgKCpwID09ICc6JyB8fCAqcCA9PSAnICcpIFwKKwkJcCsrOyBcCiB9CiAKICNlbmRpZgpAQCAtOTcsMzYxICs5NywzMDggQEAKIAogaW50IHNldF9pb2N0bChpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCiB7Ci0gICAgaWYgKGlvY3RsKHNvY2ssIFpEQVBJT0NUTCwgcmVxKSA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogaW9jdGwoU0lPQ0dJRk1BUCk6ICVzXG4iLAotICAgICAgICAgICAgICAgIHByZ25hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisJaWYgKGlvY3RsKHNvY2ssIFpEQVBJT0NUTCwgcmVxKSA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogaW9jdGwoU0lPQ0dJRk1BUCk6ICVzXG4iLAorCQkJcHJnbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAKIGludCByZWFkX3JlZyhpbnQgc29jaywgc3RydWN0IGlmcmVxICpyZXEpCiB7Ci0gICAgc3RydWN0IHpkYXBfaW9jdGwgKnpkcmVxID0gMDsKKwlzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOwogCi0gICAgaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKLSAgICAgICAgcmV0dXJuIC0xOworCWlmICghc2V0X2lvY3RsKHNvY2ssIHJlcSkpCisJCQlyZXR1cm4gLTE7CiAKLSAgICAvL3pkcmVxID0gKHN0cnVjdCB6ZGFwX2lvY3RsICopcmVxLT5pZnJfZGF0YTsKLSAgICAvL3ByaW50ZiggInJlZyA9ICU0eCwgdmFsdWUgPSAlNHhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCS8qCisJICogemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworCSAqIHByaW50ZiggInJlZyA9ICU0eCwgdmFsdWUgPSAlNHhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCSAqLwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIAogaW50IHJlYWRfbWVtKGludCBzb2NrLCBzdHJ1Y3QgaWZyZXEgKnJlcSkKIHsKLSAgICBzdHJ1Y3QgemRhcF9pb2N0bCAqemRyZXEgPSAwOwotICAgIGludCBpOworCXN0cnVjdCB6ZGFwX2lvY3RsICp6ZHJlcSA9IDA7CisJaW50IGk7CiAKLSAgICBpZiAoIXNldF9pb2N0bChzb2NrLCByZXEpKQotICAgICAgICByZXR1cm4gLTE7CisJaWYgKCFzZXRfaW9jdGwoc29jaywgcmVxKSkKKwkJcmV0dXJuIC0xOwogCi0gICAgLyp6ZHJlcSA9IChzdHJ1Y3QgemRhcF9pb2N0bCAqKXJlcS0+aWZyX2RhdGE7Ci0gICAgcHJpbnRmKCAiZHVtcCBtZW0gZnJvbSAleCwgbGVuZ3RoID0gJXhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCS8qCisJICogemRyZXEgPSAoc3RydWN0IHpkYXBfaW9jdGwgKilyZXEtPmlmcl9kYXRhOworCSAqIHByaW50ZigiZHVtcCBtZW0gZnJvbSAleCwgbGVuZ3RoID0gJXhcbiIsIHpkcmVxLT5hZGRyLCB6ZHJlcS0+dmFsdWUpOworCSAqCisJICogZm9yIChpPTA7IGk8emRyZXEtPnZhbHVlOyBpKyspIHsKKwkgKglwcmludGYoIiUwMngiLCB6ZHJlcS0+ZGF0YVtpXSk7CisJICoJcHJpbnRmKCIgIik7CisJICoKKwkgKglpZiAoKGk+MCkgJiYgKChpKzEpJTE2ID09IDApKQorCSAqCQlwcmludGYoIlxuIik7CisJICogfQorCSAqLwogCi0gICAgZm9yIChpPTA7IGk8emRyZXEtPnZhbHVlOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCIlMDJ4IiwgemRyZXEtPmRhdGFbaV0pOwotICAgICAgICBwcmludGYoIiAiKTsKLQotICAgICAgICBpZiAoKGk+MCkgJiYgKChpKzEpJTE2ID09IDApKQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0qLwotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICAgIGludCBzb2NrOwotICAgIGludCBhZGRyLCB2YWx1ZTsKLSAgICBzdHJ1Y3QgaWZyZXEgcmVxOwotICAgIGNoYXIgKmFjdGlvbiA9IE5VTEw7Ci0gICAgc3RydWN0IHpkYXBfaW9jdGwgemRyZXE7CisJaW50IHNvY2s7CisJaW50IGFkZHIsIHZhbHVlOworCXN0cnVjdCBpZnJlcSByZXE7CisJY2hhciAqYWN0aW9uID0gTlVMTDsKKwlzdHJ1Y3QgemRhcF9pb2N0bCB6ZHJlcTsKIAotICAgIHByZ25hbWUgPSBhcmd2WzBdOworCXByZ25hbWUgPSBhcmd2WzBdOwogCi0gICAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogdXNhZ2UgaXMgXCIlcyA8aWZuYW1lPiA8b3BlcmF0aW9uPiBbPGFkZHJlc3M+XSBbPHZhbHVlPl1cIlxuIiwKLSAgICAgICAgICAgICAgICBwcmduYW1lLCBwcmduYW1lKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsInZhbGlkIG9wZXJhdGlvbjogcmVhZCwgd3JpdGUsIG1lbSwgcmVnLFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgICA6IHR4ZCwgcnhkLCBybWVtLCB3bWVtXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICAgICAgICAgICAgIDogZG1hdCwgcmVndCwgdGVzdFxuIik7CisJaWYgKGFyZ2MgPCAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHVzYWdlIGlzIFwiJXMgPGlmbmFtZT4gPG9wZXJhdGlvbj4iCisJCQkJIls8YWRkcmVzcz5dIFs8dmFsdWU+XVwiXG4iLCBwcmduYW1lLCBwcmduYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJ2YWxpZCBvcGVyYXRpb24gOiByZWFkLCB3cml0ZSwgbWVtLCByZWcsIFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCQk6IHR4ZCwgcnhkLCBybWVtLCB3bWVtXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJCTogZG1hdCwgcmVndCwgdGVzdFxuIik7CiAKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBzY2FuLCBDaGFubmVsIFNjYW5cbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHJ0cyA8ZGVjaW1hbD4sIFNldCBSVFMgVGhyZXNob2xkXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBmcmFnIDxkZWNpbWFsPiwgU2V0IEZyYWdtZW50IFRocmVzaG9sZFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgcmF0ZSA8MC0yOD4sIDA6QVVUTywgMS00OkNDSywgNS0xMjpPRkRNLCAxMy0yODpIVFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgVEJEIG1peCA8MCBvciAxPiwgU2V0IDEgdG8gZW5hYmxlIG1peGVkIG1vZGVcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIGVuYywgPDAtMz4sIDA9Pk9QRU4sIDE9PldFUDY0LCAyPT5XRVAxMjgsIDM9PldFUDI1NlxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgc2tleSA8a2V5PiwgU2V0IFdFUCBrZXlcbiIpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiICAgIHR4Y250LCBHZXQgVHhRIENudFxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgZGFnY250LCBHZXQgRGVhZ2dyZWdhdGUgQ250XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBkdXJtb2RlIDxtb2RlPiwgU2V0IER1cmF0aW9uIE1vZGUgMD0+SFcsIDE9PlNXXG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNrZXkgPHVzZXI+IDxrZXk+XG4iKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIiAgICBhZXNtb2RlIDxtb2RlPlxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgd2xhbm1vZGUgPDAsMT4gMDpTdGF0aW9uIG1vZGUsIDE6UElCU1MgbW9kZVxuIik7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIgICAgdGFsIDwwLDE+LCBHZXQgQ3VycmVudCBUYWxseSBJbmZvLCAwPT5yZWFkLCAxPT5yZWFkIGFuZCByZXNldFxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXNjYW4sIENoYW5uZWwgU2NhblxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXJ0cyA8ZGVjaW1hbD4sIFNldCBSVFMgVGhyZXNob2xkXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJZnJhZyA8ZGVjaW1hbD4sIFNldCBGcmFnbWVudCIKKwkJCSIgVGhyZXNob2xkXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJcmF0ZSA8MC0yOD4sIDA6QVVUTywgMS00OkNDSywiCisJCQkiIDUtMTI6T0ZETSwgMTMtMjg6SFRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglUQkQgbWl4IDwwIG9yIDE+LCBTZXQgMSB0byBlbmFibGUiCisJCQkiIG1peGVkIG1vZGVcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIgllbmMsIDwwLTM+LCAwPT5PUEVOLCAxPT5XRVA2NCwgIgorCQkJIjI9PldFUDEyOCwgMz0+V0VQMjU2XG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJc2tleSA8a2V5PiwgU2V0IFdFUCBrZXlcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIgl0eGNudCwgR2V0IFR4USBDbnRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglkYWdjbnQsIEdldCBEZWFnZ3JlZ2F0ZSBDbnRcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglkdXJtb2RlIDxtb2RlPiwgU2V0IER1cmF0aW9uIE1vZGUgIgorCQkJIjA9PkhXLCAxPT5TV1xuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCWFlc2tleSA8dXNlcj4gPGtleT5cbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIglhZXNtb2RlIDxtb2RlPlxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiCXdsYW5tb2RlIDwwLDE+IDA6U3RhdGlvbiBtb2RlLCAiCisJCQkiMTpQSUJTUyBtb2RlXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIJdGFsIDwwLDE+LCBHZXQgQ3VycmVudCBUYWxseSBJbmZvLCAiCisJCQkiMD0+cmVhZCwgMT0+cmVhZCBhbmQgcmVzZXRcbiIpOwogCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQorCQlleGl0KDEpOworCX0KIAotICAgIHN0cmNweShyZXEuaWZyX25hbWUsIGFyZ3ZbMV0pOwotICAgIHpkcmVxLmFkZHIgPSAwOwotICAgIHpkcmVxLnZhbHVlID0gMDsKKwlzdHJjcHkocmVxLmlmcl9uYW1lLCBhcmd2WzFdKTsKKwl6ZHJlcS5hZGRyID0gMDsKKwl6ZHJlcS52YWx1ZSA9IDA7CiAKLSAgICAvKiBhIHNpbGx5IHJhdyBzb2NrZXQganVzdCBmb3IgaW9jdGwoKWxpbmcgaXQgKi8KLSAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7Ci0gICAgaWYgKHNvY2sgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvY2tldCgpOiAlc1xuIiwgYXJndlswXSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9CisJLyogYSBzaWxseSByYXcgc29ja2V0IGp1c3QgZm9yIGlvY3RsKClsaW5nIGl0ICovCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOworCWlmIChzb2NrIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb2NrZXQoKTogJXNcbiIsIGFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQogCi0gICAgaWYgKGFyZ2MgPj0gNCkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJXgiLCAmYWRkcik7Ci0gICAgfQorCWlmIChhcmdjID49IDQpCisJCXNzY2FuZihhcmd2WzNdLCAiJXgiLCAmYWRkcik7CiAKLSAgICBpZiAoYXJnYyA+PSA1KQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIleCIsICZ2YWx1ZSk7Ci0gICAgfQorCWlmIChhcmdjID49IDUpCisJCXNzY2FuZihhcmd2WzRdLCAiJXgiLCAmdmFsdWUpOwogCi0gICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgemRyZXEudmFsdWUgPSB2YWx1ZTsKKwl6ZHJlcS5hZGRyID0gYWRkcjsKKwl6ZHJlcS52YWx1ZSA9IHZhbHVlOwogCi0gICAgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlYWQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19SRUFEOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJtZW0iKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3cml0ZSIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1dSSVRFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWciKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RYRF9EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyeGQiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JYRF9EVU1QOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJybWVtIikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9NRU1fUkVBRDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAid21lbSIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1dSSVRFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkbWF0IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9ETUFfVEVTVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVndCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1RFU1Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRlc3QiKSkKLSAgICB7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RFU1Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInRhbCIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RBTExZOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJydHMiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7Ci0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SVFM7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1peCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfTUlYX01PREU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImZyYWciKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7Ci0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9GUkFHOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJzY2FuIikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TQ0FOOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJza2V5IikpCi0gICAgewotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9LRVk7CisJaWYgKCFzdHJjbXAoYXJndlsyXSwgInJlYWQiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUkVHX1JFQUQ7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAibWVtIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9EVU1QOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndyaXRlIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JFR19XUklURTsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyZWciKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfUkVHX0RVTVA7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidHhkIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RYRF9EVU1QOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJ4ZCIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SWERfRFVNUDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJybWVtIikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX01FTV9SRUFEOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndtZW0iKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfTUVNX1dSSVRFOworCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRtYXQiKSkKKwkJemRyZXEuY21kID0gWk1fSU9DVExfRE1BX1RFU1Q7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicmVndCIpKQorCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SRUdfVEVTVDsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0ZXN0IikpCisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RFU1Q7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAidGFsIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1RBTExZOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAicnRzIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JUUzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIm1peCIpKSB7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX01JWF9NT0RFOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZnJhZyIpKSB7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9GUkFHOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2NhbiIpKSB7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NDQU47CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJza2V5IikpIHsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfS0VZOwogCi0gICAgICAgIGlmIChhcmdjID49IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsyOV07Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGludCBrZXlMZW47Ci0gICAgICAgICAgICBpbnQgZW5jVHlwZTsKKwkJaWYgKGFyZ2MgPj0gNCkgeworCQkJdW5zaWduZWQgY2hhciB0ZW1wWzI5XTsKKwkJCWludCBpOworCQkJaW50IGtleUxlbjsKKwkJCWludCBlbmNUeXBlOwogCi0gICAgICAgICAgICBrZXlMZW4gPSBzdHJsZW4oYXJndlszXSk7CisJCQlrZXlMZW4gPSBzdHJsZW4oYXJndlszXSk7CiAKLSAgICAgICAgICAgIGlmIChrZXlMZW4gPT0gMTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCIsICZ0ZW1wWzBdLCAmdGVtcFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoa2V5TGVuID09IDI2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMTBdLCAmdGVtcFsxMV0sICZ0ZW1wWzEyXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChrZXlMZW4gPT0gNTgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwgJnRlbXBbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsxMF0sICZ0ZW1wWzExXSwgJnRlbXBbMTJdLCAmdGVtcFsxM10sICZ0ZW1wWzE0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wWzE1XSwgJnRlbXBbMTZdLCAmdGVtcFsxN10sICZ0ZW1wWzE4XSwgJnRlbXBbMTldLAotICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBbMjBdLCAmdGVtcFsyMV0sICZ0ZW1wWzIyXSwgJnRlbXBbMjNdLCAmdGVtcFsyNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdGVtcFsyNV0sICZ0ZW1wWzI2XSwgJnRlbXBbMjddLCAmdGVtcFsyOF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBrZXkgbGVuZ3RoXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgemRyZXEuYWRkciA9IGtleUxlbi8yOworCQkJaWYgKGtleUxlbiA9PSAxMCkKKwkJCQlzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJCQkJJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sCisJCQkJCSZ0ZW1wWzRdKTsKKwkJCWVsc2UgaWYgKGtleUxlbiA9PSAyNikKKwkJCQlzc2NhbmYoYXJndlszXSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKKwkJCQkJIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorCQkJCQkmdGVtcFswXSwgJnRlbXBbMV0sICZ0ZW1wWzJdLCAmdGVtcFszXSwKKwkJCQkJJnRlbXBbNF0sICZ0ZW1wWzVdLCAmdGVtcFs2XSwgJnRlbXBbN10sCisJCQkJCSZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLAorCQkJCQkmdGVtcFsxMV0sICZ0ZW1wWzEyXSk7CisJCQllbHNlIGlmIChrZXlMZW4gPT0gNTgpCisJCQkJc3NjYW5mKGFyZ3ZbM10sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQkJCSZ0ZW1wWzBdLCAmdGVtcFsxXSwgJnRlbXBbMl0sICZ0ZW1wWzNdLAorCQkJCQkmdGVtcFs0XSwgJnRlbXBbNV0sICZ0ZW1wWzZdLCAmdGVtcFs3XSwKKwkJCQkJJnRlbXBbOF0sICZ0ZW1wWzldLCAmdGVtcFsxMF0sCisJCQkJCSZ0ZW1wWzExXSwgJnRlbXBbMTJdLCAmdGVtcFsxM10sCisJCQkJCSZ0ZW1wWzE0XSwgJnRlbXBbMTVdLCAmdGVtcFsxNl0sCisJCQkJCSZ0ZW1wWzE3XSwgJnRlbXBbMThdLCAmdGVtcFsxOV0sCisJCQkJCSZ0ZW1wWzIwXSwgJnRlbXBbMjFdLCAmdGVtcFsyMl0sCisJCQkJCSZ0ZW1wWzIzXSwgJnRlbXBbMjRdLCAmdGVtcFsyNV0sCisJCQkJCSZ0ZW1wWzI2XSwgJnRlbXBbMjddLCAmdGVtcFsyOF0pOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGtleSBsZW5ndGhcbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQl6ZHJlcS5hZGRyID0ga2V5TGVuLzI7CiAKLSAgICAgICAgICAgIGZvcihpPTA7IGk8emRyZXEuYWRkcjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJFcnJvciA6IEtleSByZXF1aXJlZCFcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgInJhdGUiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCQlmb3IgKGkgPSAwOyBpIDwgemRyZXEuYWRkcjsgaSsrKQorCQkJCXpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJFcnJvciA6IEtleSByZXF1aXJlZCFcbiIpOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJyYXRlIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICBpZiAoYWRkciA+IDI4KQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmF0ZSwgcmFuZ2U6MH4yOFxuIik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9SQVRFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJlbmMiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCWlmIChhZGRyID4gMjgpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCByYXRlLCByYW5nZTowfjI4XG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1JBVEU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJlbmMiKSkgeworCQlzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOwogCi0gICAgICAgIGlmIChhZGRyID4gMykKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGVuY3J5cHRpb24gbW9kZSwgcmFuZ2U6MH4zXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KKwkJaWYgKGFkZHIgPiAzKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZW5jcnlwdGlvbiBtb2RlLCByYW5nZTowfjNcbiIpOworCQkJZXhpdCgxKTsKKwkJfQogCi0gICAgICAgIGlmIChhZGRyID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZHIgPSA1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFkZHIgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgYWRkciA9IDY7Ci0gICAgICAgIH0KKwkJaWYgKGFkZHIgPT0gMikKKwkJCWFkZHIgPSA1OworCQllbHNlIGlmIChhZGRyID09IDMpCisJCQlhZGRyID0gNjsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfRU5DUllQVElPTl9NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGNudCIpKQotICAgIHsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfR0VUX1RYQ05UOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJkYWdjbnQiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREU7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0eGNudCIpKSB7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9UWENOVDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImRhZ2NudCIpKSB7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIHZhbHVlIHNob3VsZCBiZSAwIG9yIDFcbiIpOwotICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgfQorCQlpZiAoYWRkciAhPSAwICYmIGFkZHIgIT0gMSkgeworCQkJZnByaW50ZihzdGRlcnIsICJUaGUgdmFsdWUgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisJCQlleGl0KDApOworCQl9CiAKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX0dFVF9ERUFHR19DTlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImR1cm1vZGUiKSkKLSAgICB7Ci0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UOworCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAiZHVybW9kZSIpKQl7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgaWYgKGFkZHIgIT0gMCAmJiBhZGRyICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIER1cmF0aW9uIG1vZGUgc2hvdWxkIGJlIDAgb3IgMVxuIik7Ci0gICAgICAgICAgICBleGl0KDApOwotICAgICAgICB9CisJCWlmIChhZGRyICE9IDAgJiYgYWRkciAhPSAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBEdXJhdGlvbiBtb2RlIHNob3VsZCBiZSAwIG9yIDFcbiIpOworCQkJZXhpdCgwKTsKKwkJfQogCi0gICAgICAgIHpkcmVxLmFkZHIgPSBhZGRyOwotICAgICAgICB6ZHJlcS5jbWQgPSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNrZXkiKSkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdGVtcFsxNl07Ci0gICAgICAgIGludCBpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfRFVSQVRJT05fTU9ERTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgImFlc2tleSIpKSB7CisJCXVuc2lnbmVkIGNoYXIgdGVtcFsxNl07CisJCWludCBpOwogCi0gICAgICAgIHNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CisJCXNzY2FuZihhcmd2WzNdLCAiJWQiLCAmYWRkcik7CiAKLSAgICAgICAgc3NjYW5mKGFyZ3ZbNF0sICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLCAmdGVtcFsyXSwgJnRlbXBbM10sICZ0ZW1wWzRdLCAmdGVtcFs1XSwgJnRlbXBbNl0sICZ0ZW1wWzddLCAmdGVtcFs4XSwgJnRlbXBbOV0sICZ0ZW1wWzEwXSwgJnRlbXBbMTFdLCAmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLCAmdGVtcFsxNV0pOworCQlzc2NhbmYoYXJndls0XSwgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiCisJCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwgJnRlbXBbMF0sICZ0ZW1wWzFdLAorCQkJJnRlbXBbMl0sICZ0ZW1wWzNdLCAmdGVtcFs0XSwgJnRlbXBbNV0sICZ0ZW1wWzZdLAorCQkJJnRlbXBbN10sICZ0ZW1wWzhdLCAmdGVtcFs5XSwgJnRlbXBbMTBdLCAmdGVtcFsxMV0sCisJCQkmdGVtcFsxMl0sICZ0ZW1wWzEzXSwgJnRlbXBbMTRdLCAmdGVtcFsxNV0pOwogCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHpkcmVxLmRhdGFbaV0gPSB0ZW1wW2ldOwotICAgICAgICB9CisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJemRyZXEuZGF0YVtpXSA9IHRlbXBbaV07CiAKLSAgICAgICAgemRyZXEuYWRkciA9IGFkZHI7Ci0gICAgICAgIHpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfS0VZOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNtb2RlIikpCi0gICAgewotICAgICAgICBzc2NhbmYoYXJndlszXSwgIiVkIiwgJmFkZHIpOworCQl6ZHJlcS5hZGRyID0gYWRkcjsKKwkJemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19LRVk7CisJfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJhZXNtb2RlIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX0FFU19NT0RFOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ3bGFubW9kZSIpKQotICAgIHsKLSAgICAgICAgc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKKwkJemRyZXEuYWRkciA9IGFkZHI7CisJCXpkcmVxLmNtZCA9IFpNX0lPQ1RMX1NFVF9BRVNfTU9ERTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsyXSwgIndsYW5tb2RlIikpIHsKKwkJc3NjYW5mKGFyZ3ZbM10sICIlZCIsICZhZGRyKTsKIAotICAgICAgICB6ZHJlcS5hZGRyID0gYWRkcjsKLSAgICAgICAgemRyZXEuY21kID0gWk1fSU9DVExfU0VUX1BJQlNTX01PREU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgYWN0aW9uXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9CisJCXpkcmVxLmFkZHIgPSBhZGRyOworCQl6ZHJlcS5jbWQgPSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERTsKKwl9IGVsc2UgCXsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvciBhY3Rpb25cbiIpOworCQlleGl0KDEpOworCX0KIAotICAgIHJlcS5pZnJfZGF0YSA9IChjaGFyICopJnpkcmVxOwotICAgIHNldF9pb2N0bChzb2NrLCAmcmVxKTsKKwlyZXEuaWZyX2RhdGEgPSAoY2hhciAqKSZ6ZHJlcTsKKwlzZXRfaW9jdGwoc29jaywgJnJlcSk7CiAKIGZhaWw6Ci0gICAgZXhpdCgwKTsKKwlleGl0KDApOwogfQogCiB1bnNpZ25lZCBjaGFyIGFzY3RvaGV4KGNoYXIgKnN0cikKIHsKLSAgICB1bnNpZ25lZCBjaGFyIHZhbHVlOworCXVuc2lnbmVkIGNoYXIgdmFsdWU7CiAKLSAgICB2YWx1ZSA9IGhleCgqc3RyKSAmIDB4MGY7Ci0gICAgdmFsdWUgPSB2YWx1ZSA8PCA0OwotICAgIHN0cisrOwotICAgIHZhbHVlIHw9IGhleCgqc3RyKSAmIDB4MGY7CisJdmFsdWUgPSBoZXgoKnN0cikgJiAweDBmOworCXZhbHVlID0gdmFsdWUgPDwgNDsKKwlzdHIrKzsKKwl2YWx1ZSB8PSBoZXgoKnN0cikgJiAweDBmOwogCi0gICAgcmV0dXJuIHZhbHVlOworCXJldHVybiB2YWx1ZTsKIH0KIAogY2hhciBoZXgoY2hhciB2KQogewotICAgIGlmKGlzZGlnaXQodikpCi0gICAgICAgIHJldHVybiB2IC0gJzAnOwotICAgIGVsc2UgaWYoaXN4ZGlnaXQodikpCi0gICAgICAgIHJldHVybiAodG9sb3dlcih2KSAtICdhJyArIDEwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOworCWlmIChpc2RpZ2l0KHYpKQorCQlyZXR1cm4gdiAtICcwJzsKKwllbHNlIGlmIChpc3hkaWdpdCh2KSkKKwkJcmV0dXJuIHRvbG93ZXIodikgLSAnYScgKyAxMDsKKwllbHNlCisJCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvYXRocl9jb21tb24uaAppbmRleCA2MjBmNzhhLi4zZTMyZjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy9hdGhyX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL2F0aHJfY29tbW9uLmgKQEAgLTY4LDcgKzY4LDcgQEAKIAogI2RlZmluZSBaTV9XQVBJX0tFWV9TSVpFICAgICAgICAgICAgICAgIDMyCiAjZGVmaW5lIFpNX1dBUElfSVZfTEVOICAgICAgICAgICAgICAgICAgMTYKLSNlbmRpZiAvL1pNX0VOQUxCRV9XQVBJCisjZW5kaWYgLyogWk1fRU5BTEJFX1dBUEkgKi8KIC8qIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCiAKIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gewpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCQl1OCBrZXlbWk1fV0FQSV9LRVlfU0laRV07CiAJCX0gY3J5cHQ7CiAJCXN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1OCB3YXBpX3BvbGljeTsKKwkJCXU4IHdhcGlfcG9saWN5OwogCQl9IGluZm87CiAJfSB1OwogfTsKQEAgLTEzMiwxMCArMTMyLDEwIEBACiB7CiAJdTE2CW1zZ190eXBlOwogCXUxNglkYXRhbGVuOwotICAgIAl1OAlzdGFfbWFjW0VUSF9BTEVOXTsKKwl1OAlzdGFfbWFjW0VUSF9BTEVOXTsKIAl1OAlyZXNlcnZlX2RhdGFbMl07Ci0gICAgCXU4CWdzbltaTV9XQVBJX0lWX0xFTl07CisJdTgJZ3NuW1pNX1dBUElfSVZfTEVOXTsKIAl1OAl3aWVbMjU2XTsKIH07Ci0jZW5kaWYgLy9aTV9FTkFMQkVfV0FQSQorI2VuZGlmIC8qIFpNX0VOQUxCRV9XQVBJICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9kdC5oIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKaW5kZXggZTgyYjk3Ny4uZmI2ZDExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX2R0LmgKQEAgLTM5LDE1ICszOSwxNSBAQAogdHlwZWRlZiAgICAgc2hvcnQgICAgICAgICAgICAgICBzMTZfdDsKIHR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgczhfdDsKIAotI2lmbmRlZiAgICAgVFJVRQotI2RlZmluZSAgICAgVFJVRSAgICAgICAgICAgICAgICAoMT09MSkKKyNpZm5kZWYgVFJVRQorI2RlZmluZSAgICAgVFJVRSAgICAgICAgICAgICAgICAoMSA9PSAxKQogI2VuZGlmCiAKLSNpZm5kZWYgICAgIEZBTFNFCi0jZGVmaW5lICAgICBGQUxTRSAgICAgICAgICAgICAgICgxPT0wKQorI2lmbmRlZiBGQUxTRQorI2RlZmluZSAgICAgRkFMU0UgICAgICAgICAgICAgICAoMSA9PSAwKQogI2VuZGlmCiAKLSNpZm5kZWYgICAgIE5VTEwKKyNpZm5kZWYJTlVMTAogI2RlZmluZSAgICAgTlVMTCAgICAgICAgICAgICAgICAwCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL29hbF9tYXJjLmgKaW5kZXggMjA2MTExNi4uZTdhOTA4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvb2FsX21hcmMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy9vYWxfbWFyYy5oCkBAIC0zNCwxNyArMzQsMTkgQEAKIC8qKioqKiBDcml0aWNhbCBzZWN0aW9uICoqKioqLwogLyogRGVjbGFyZSBmb3IgY3JpdGljYWwgc2VjdGlvbiAqLwogI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKLSNkZWZpbmUgem13X2dldF93bGFuX2RldihkZXYpICAgIHN0cnVjdCB6c1dsYW5EZXYgKndkID0gKHN0cnVjdCB6c1dsYW5EZXYqKSAoKCgoc3RydWN0IHVzYmRydl9wcml2YXRlKilkZXYtPnByaXYpLT53ZCkpCisjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IChzdHJ1Y3QgenNXbGFuRGV2ICopIFwKKwkoKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopZGV2LT5wcml2KS0+d2QpKQogCiAjZGVmaW5lIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCkgdW5zaWduZWQgbG9uZyBpcnFGbGFnOwogCiAvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uICovCi0jZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgXAotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CisjZGVmaW5lIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldikgc3Bpbl9sb2NrX2lycXNhdmUoCVwKKwkmKCgoc3RydWN0IHVzYmRydl9wcml2YXRlICopKGRldi0+cHJpdikpLT5jc19sb2NrKSwgaXJxRmxhZyk7CiAKIC8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KICNkZWZpbmUgem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSBcCi0gICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKShkZXYtPnByaXYpKS0+Y3NfbG9jayksIGlycUZsYWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJigoKHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqKQlcCisJCQkoZGV2LT5wcml2KSktPmNzX2xvY2spLCBpcnFGbGFnKTsKICNlbHNlCiAjZGVmaW5lIHptd19nZXRfd2xhbl9kZXYoZGV2KSAgICBzdHJ1Y3QgenNXbGFuRGV2ICp3ZCA9IHpmd0dldFdsYW5EZXYoZGV2KTsKIApAQCAtNTIsMzEgKzU0LDI5IEBACiAjZGVmaW5lIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCkKIAogLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLwotI2RlZmluZSB6bXdfZW50ZXJfY3JpdGljYWxfc2VjdGlvbihkZXYpIFwKLSAgICAgICAgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oZGV2KTsKKyNkZWZpbmUgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KSB6ZndFbnRlckNyaXRpY2FsU2VjdGlvbihkZXYpOwogCiAvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCi0jZGVmaW5lIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldikgXAotICAgICAgICB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbihkZXYpOworI2RlZmluZSB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpIHpmd0xlYXZlQ3JpdGljYWxTZWN0aW9uKGRldik7CiAjZW5kaWYKIAogLyoqKioqIEJ5dGUgb3JkZXIgY29udmVydGluZyAqKioqKi8KICNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgotI2RlZmluZSB6bXdfY3B1X3RvX2xlMzIodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwZmYwMCkgPDwgOCkgIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDAwMDAwZmYpIDw8IDI0KSkKKyNkZWZpbmUgem13X2NwdV90b19sZTMyKHYpICAgIAkoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgCVwKKwkJCQkoKHYgJiAweDAwZmYwMDAwKSA+PiA4KSAgfCAJXAorCQkJCSgodiAmIDB4MDAwMGZmMDApIDw8IDgpICB8IAlcCisJCQkJKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQogCi0jZGVmaW5lIHptd19sZTMyX3RvX2NwdSh2KSAgICAoKCh2ICYgMHhmZjAwMDAwMCkgPj4gMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZjAwMDApID4+IDgpICB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHYgJiAweDAwMDBmZjAwKSA8PCA4KSAgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMDAwMDBmZikgPDwgMjQpKQorI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMDAwMDApID4+IDI0KSB8IAlcCisJCQkJKCh2ICYgMHgwMGZmMDAwMCkgPj4gOCkgfCAJXAorCQkJCSgodiAmIDB4MDAwMGZmMDApIDw8IDgpIHwgCVwKKwkJCQkoKHYgJiAweDAwMDAwMGZmKSA8PCAyNCkpCiAKICNkZWZpbmUgem13X2NwdV90b19sZTE2KHYpICAgICgoKHYgJiAweGZmMDApID4+IDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodiAmIDB4MDBmZikgPDwgOCkpCisJCQkJKCh2ICYgMHgwMGZmKSA8PCA4KSkKIAogI2RlZmluZSB6bXdfbGUxNl90b19jcHUodikgICAgKCgodiAmIDB4ZmYwMCkgPj4gOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2ICYgMHgwMGZmKSA8PCA4KSkKKwkJCQkoKHYgJiAweDAwZmYpIDw8IDgpKQogI2Vsc2UKICNkZWZpbmUgem13X2NwdV90b19sZTMyKHYpICAgICh2KQogI2RlZmluZSB6bXdfbGUzMl90b19jcHUodikgICAgKHYpCkBAIC04OCwzMyArODgsNDEgQEAKIC8qIENhbGxlZCB0byByZWFkL3dyaXRlIGJ1ZmZlciAqLwogI2lmbmRlZiBaTV9IQUxQTFVTX0xPQ0sKIAotI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KQotI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKQotI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWUKLSNkZWZpbmUgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpCi0jZGVmaW5lIHptd19idWZfZ2V0X2J1ZmZlcihkZXYsIGJ1ZikgKHU4X3QqKShidWYtPmRhdGEpCisjZGVmaW5lIHptd19idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCkgKCoodThfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQpKQorI2RlZmluZSB6bXdfYnVmX3JlYWRoKGRldiwgYnVmLCBvZmZzZXQpIHptd19jcHVfdG9fbGUxNigqKHUxNl90ICopCVwKKwkJCQkJKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkpCisjZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAoKih1OF90ICopCQlcCisJCQkJCSgodThfdCAqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWUpCisjZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSAoKih1MTZfdCAqKQkJXAorCQkJKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpKQorI2RlZmluZSB6bXdfYnVmX2dldF9idWZmZXIoZGV2LCBidWYpICh1OF90ICopKGJ1Zi0+ZGF0YSkKIAogI2Vsc2UKIAogI2RlZmluZSB6bXdfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpIHpmd0J1ZlJlYWRCeXRlKGRldiwgYnVmLCBvZmZzZXQpCiAjZGVmaW5lIHptd19idWZfcmVhZGgoZGV2LCBidWYsIG9mZnNldCkgemZ3QnVmUmVhZEhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQpCi0jZGVmaW5lIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6ZndCdWZXcml0ZUJ5dGUoZGV2LCBidWYsIG9mZnNldCwgdmFsdWUpCi0jZGVmaW5lIHptd19idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKSB6ZndCdWZXcml0ZUhhbGZXb3JkKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkgCQkJXAorCQkJemZ3QnVmV3JpdGVCeXRlKGRldiwgYnVmLCBvZmZzZXQsIHZhbHVlKQorI2RlZmluZSB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkJCQkJXAorCQkJemZ3QnVmV3JpdGVIYWxmV29yZChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YWx1ZSkKICNkZWZpbmUgem13X2J1Zl9nZXRfYnVmZmVyKGRldiwgYnVmKSB6ZndHZXRCdWZmZXIoZGV2LCBidWYpCiAKICNlbmRpZgogCiAvKioqKiogRGVidWcgbWVzc2FnZSAqKioqKi8KICNpZiAwCi0jZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKSBwcmludGsoIiVzOiVzXG4iLCBfX2Z1bmNfXywgbXNnKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnMShtc2csIHZhbCkgcHJpbnRrKCIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKLSAgICAgICAgbXNnLCAodTMyX3QpdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnMihtc2csIHZhbCkgcHJpbnRrKCIlczolcyVseGhcbiIsIF9fZnVuY19fLCBcCi0gICAgICAgIG1zZywgKHUzMl90KXZhbCk7Ci0jZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoIiVzOiVzJXNcbiIsIF9fZnVuY19fLCBcCi0gICAgICAgIG1zZywgdmFsKTsKLSNkZWZpbmUgem1fZGVidWdfbXNnX3AobXNnLCB2YWwxLCB2YWwyKSBwcmludGsoIiVzOiVzJTAxbGQuJTAybGRcbiIsIF9fZnVuY19fLCBcCi0gICAgICAgIG1zZywgKHZhbDEvdmFsMiksICgoKHZhbDEqMTAwKS92YWwyKSUxMDApKTsKKyNkZWZpbmUgem1fZGVidWdfbXNnMChtc2cpIHByaW50ayhLRVJOX0RFQlVHICIlczolc1xuIiwgX19mdW5jX18sIG1zZyk7CisjZGVmaW5lIHptX2RlYnVnX21zZzEobXNnLCB2YWwpIHByaW50ayhLRVJOX0RFQlVHICIlczolcyVsZFxuIiwgX19mdW5jX18sIFwKKwltc2csICh1MzJfdCl2YWwpOworI2RlZmluZSB6bV9kZWJ1Z19tc2cyKG1zZywgdmFsKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMlbHhoXG4iLCBfX2Z1bmNfXywgXAorCW1zZywgKHUzMl90KXZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZ19zKG1zZywgdmFsKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMlc1xuIiwgX19mdW5jX18sIFwKKwltc2csIHZhbCk7CisjZGVmaW5lIHptX2RlYnVnX21zZ19wKG1zZywgdmFsMSwgdmFsMikgZG8geyAJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6JXMlMDFsZC4lMDJsZFxuIiwJXAorCQkJCQkJX19mdW5jX18sIAlcCisJCQltc2csICh2YWwxL3ZhbDIpLCAoKCh2YWwxKjEwMCkvdmFsMiklMTAwKSk7CisJCQl9IHdoaWxlICgwKQogI2RlZmluZSB6bV9kYmcoUykgcHJpbnRrIFMKICNlbHNlCiAjZGVmaW5lIHptX2RlYnVnX21zZzAobXNnKQpAQCAtMTI1LDEwICsxMzMsMTAgQEAKICNkZWZpbmUgem1fZGJnKFMpCiAjZW5kaWYKIAotI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcHJpbnRrKCAiQXRoZW9ycyBBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCAgIFwKLSAgICAgICAgI2V4cHIsX19GSUxFX18sX19mdW5jX18sX19MSU5FX18pOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQorI2RlZmluZSB6bV9hc3NlcnQoZXhwcikgaWYgKCEoZXhwcikpIHsJCQkJCSBcCisJcHJpbnRrKEtFUk5fRVJSICJBdGhlb3JzIEFzc2VydGlvbiBmYWlsZWQhICVzLCAlcywgJXMsbGluZT0lZFxuIixcCisJCSNleHByLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKTsJCQkgXAorCX0KIAogI2RlZmluZSBEYmdQcmludCBwcmludGsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvdXNiZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwppbmRleCA0OGFhMzBhLi5iMGFkYmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuYwpAQCAtMTExLDcgKzExMSw3IEBACiAKIC8qIERlZmluaXRpb24gb2YgV2lyZWxlc3MgRXh0ZW5zaW9uICovCiAKLS8vd2lyZWxlc3MgZXh0ZW5zaW9uIGhlbHBlciBmdW5jdGlvbnMKKy8qIHdpcmVsZXNzIGV4dGVuc2lvbiBoZWxwZXIgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IHVzYmRydl9pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSk7CiBleHRlcm4gaW50IHVzYmRydl9pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpOwogLyogV2lyZWxlc3MgRXh0ZW5zaW9uIEhhbmRsZXIgZnVuY3Rpb25zICovCkBAIC0yODIsOCArMjgyLDggQEAKIH07CiAKIC8qIFdEUyAqLwotLy9zdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07Ci0vL3ZvaWQgemZJbml0V2RzU3RydWN0KHZvaWQpOworLyogc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOyAqLworLyogdm9pZCB6ZkluaXRXZHNTdHJ1Y3Qodm9pZCk7CSovCiAKIC8qIFZBUCAqLwogc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwpAQCAtMzE0LDEzICszMTQsMTEgQEAKICAgICAgICAgcmV0dXJuIElSUV9OT05FOwogCiAgICAgLyogdGhlIGRldmljZSBpcyBjbG9zZWQsIGRvbid0IGNvbnRpbnVlIG9yIGVsc2UgYmFkIHRoaW5ncyBtYXkgaGFwcGVuLiAqLwotICAgIGlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKLSAgICB9CiAKLSAgICBpZiAobWFjcC0+ZHJpdmVyX2lzb2xhdGVkKSB7CisgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkKICAgICAgICAgcmV0dXJuIElSUV9OT05FOwotICAgIH0KIAogI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKICAgICAvL3pmaUlzclBjaShkZXYpOwpAQCAtMzQwLDkgKzMzOCwxMSBAQAogCiAgICAgcHJpbnRrKCJFbnRlciBvcGVuKClcbiIpOwogCi0vLyNpZm5kZWYgQ09ORklHX1NNUAotLy8gICAgcmVhZF9sb2NrKCYobWFjcC0+aXNvbGF0ZV9sb2NrKSk7Ci0vLyNlbmRpZgorLyoKKyAqICNpZm5kZWYgQ09ORklHX1NNUAorICogICByZWFkX2xvY2soJihtYWNwLT5pc29sYXRlX2xvY2spKTsKKyAqICNlbmRpZgorICovCiAgICAgaWYgKG1hY3AtPmRyaXZlcl9pc29sYXRlZCkgewogICAgICAgICByYyA9IC1FQlVTWTsKICAgICAgICAgZ290byBleGl0OwpAQCAtMzkzLDExICszOTMsMTEgQEAKICAgICBkZXYtPmRldl9hZGRyWzRdID0gYWRkcls0XTsKICAgICBkZXYtPmRldl9hZGRyWzVdID0gYWRkcls1XTsKICNlbmRpZgotICAgIC8vemZ3TWFjQWRkcmVzc05vdGlmeSgpIHdpbGwgYmUgY2FsbGVkIHRvIHNldHVwIGRldi0+ZGV2X2FkZHJbXQorICAgIC8qIHpmd01hY0FkZHJlc3NOb3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB0byBzZXR1cCBkZXYtPmRldl9hZGRyW10gKi8KIAogICAgIHpmTG54Q3JlYXRlVGhyZWFkKGRldik7CiAKLSAgICBtb2RfdGltZXIoJihtYWNwLT5oYlRpbWVyMTBtcyksIGppZmZpZXMgKyAoMSpIWikvMTAwKTsgICAvLzEwIG1zCisgICAgbW9kX3RpbWVyKCYobWFjcC0+aGJUaW1lcjEwbXMpLCBqaWZmaWVzICsgKDEqSFopLzEwMCk7ICAgLyogMTAgbXMgKi8KIAogICAgIG5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIApAQCAtNDI1LDE1ICs0MjUsMTUgQEAKIAogICAgICNpZiBaTV9TSEFSRV9BVVRIID09IDEKICAgICB6ZmlXbGFuU2V0QXV0aGVudGljYXRpb25Nb2RlKGRldiwgMSk7Ci0gICAgI2VuZGlmIC8vI2lmIFpNX1NIQVJFX0FVVEggPT0gMQotICAjZW5kaWYgLy8jaWYgWk1fV0VQX01PTUUgPT0gMQorICAgICNlbmRpZiAvKiAjaWYgWk1fU0hBUkVfQVVUSCA9PSAxICovCisgICNlbmRpZiAvKiAjaWYgWk1fV0VQX01PTUUgPT0gMSAqLwogCiAjZWxpZiBaTV9QSUJTU19NT0RFID09IDEKICAgICB6ZmlXbGFuU2V0V2xhbk1vZGUoZGV2LCBaTV9NT0RFX1BTRVVETyk7CiAjZWxzZQogICAgIHpmaVdsYW5TZXRXbGFuTW9kZShkZXYsIFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpOwogI2VuZGlmCi0gICAgLy96ZmlXbGFuU2V0Q2hhbm5lbChkZXYsIFpNX0NIQU5ORUwsIEZBTFNFKTsKKyAgICAvKiB6ZmlXbGFuU2V0Q2hhbm5lbChkZXYsIFpNX0NIQU5ORUwsIEZBTFNFKTsgKi8KICAgICB6ZmlXbGFuU2V0RnJlcXVlbmN5KGRldiwgMjQ2MjAwMCwgRkFMU0UpOwogICAgIHpmaVdsYW5TZXRSdHNUaHJlc2hvbGQoZGV2LCAzMjc2Nyk7CiAgICAgemZpV2xhblNldEZyYWdUaHJlc2hvbGQoZGV2LCAwKTsKQEAgLTcyMCw3ICs3MjAsNyBAQAogewogICAgIHUxNl90IGk7CiAKLSAgICBmb3IgKGk9MDsgaTxaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgWk1fVkFQX1BPUlRfTlVNQkVSOyBpKyspCiAgICAgewogICAgICAgICB2YXBbaV0uZGV2ID0gTlVMTDsKICAgICAgICAgdmFwW2ldLm9wZW5GbGFnID0gMDsKQEAgLTExMjgsOCArMTEyOCw3IEBACiAKICAgICBwcmludGsoS0VSTl9FUlIgIlR4UUNudDogJWRcbiIsIFR4UUNudCk7CiAKLSAgICBmb3IoaWkgPSAwOyBpaSA8IFR4UUNudDsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgVHhRQ250OyBpaSsrKSB7CiAgICAgICAgIFVzYlR4UV90ICpUeFEgPSB6ZkxueEdldFVzYlR4QnVmZmVyKGRldik7CiAKICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJkZXZfa2ZyZWVfc2tiX2FueVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy91c2JkcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCmluZGV4IDc4MDA0MDYuLjMzMGQxYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3VzYmRydi5oCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSAib2FsX2R0LmgiCiAjaW5jbHVkZSAib2FsX21hcmMuaCIKICNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3pmaS5oIgotLy8jaW5jbHVkZSAicHViX3pmdy5oIgorLyogI2luY2x1ZGUgInB1Yl96ZncuaCIJKi8KICNpbmNsdWRlICI4MDIxMWNvcmUvcHViX3VzYi5oIgogCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC04Niw4ICs4Niw3IEBACiAjZGVmaW5lIFpNX01BWF9SWF9VUkJfTlVNICAgICAgICAgICAgICAgICAgIDE2CiAjZGVmaW5lIFpNX01BWF9UWF9CVUZfTlVNICAgICAgICAgICAgICAgICAgIDEyOAogCi10eXBlZGVmIHN0cnVjdCBVc2JUeFEKLXsKK3R5cGVkZWYgc3RydWN0IFVzYlR4USB7CiAgICAgemJ1Zl90ICpidWY7CiAgICAgdThfdCBoZHJbODBdOwogICAgIHUxNl90IGhkcmxlbjsKQEAgLTEwMCwxNyArOTksMTYgQEAKIAogCiBzdHJ1Y3QgemRhcF9pb2N0bCB7Ci0JdTE2X3QgY21kOyAgICAgICAgICAgICAgICAvKiBDb21tYW5kIHRvIHJ1biAqLwotCXUzMl90IGFkZHI7ICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KLQl1MzJfdCB2YWx1ZTsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisJdTE2X3QgY21kOwkJICAvKiBDb21tYW5kIHRvIHJ1biAqLworCXUzMl90IGFkZHI7CQkgIC8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1MzJfdCB2YWx1ZTsJCS8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCiAJdThfdAlkYXRhWzB4MTAwXTsKIH07CiAKICNkZWZpbmUgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCAxNgogCi1zdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUKLXsKLQkvL2xpbnV4IHVzZWQKK3N0cnVjdCB1c2JkcnZfcHJpdmF0ZSB7CisJLyogbGludXggdXNlZCAqLwogCXN0cnVjdCBuZXRfZGV2aWNlIAkqZGV2aWNlOwogI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1BDSSkKIAlzdHJ1Y3QgcGNpX2RldiAJCSpwZGV2OwpAQCAtMTIxLDcgKzExOSw3IEBACiAjZW5kaWYKIAlzdHJ1Y3QgZHJpdmVyX3N0YXRzIGRydl9zdGF0czsKIAljaGFyIGlmbmFtZVtJRk5BTVNJWl07Ci0JaW50CSAgICAgICAgICAgICAgICB1c2luZ19kYWM7CisJaW50CQkJICB1c2luZ19kYWM7CiAJdThfdAkJCXJldl9pZDsJCS8qIGFkYXB0ZXIgUENJIHJldmlzaW9uIElEICovCiAJcndsb2NrX3QgCQlpc29sYXRlX2xvY2s7CiAgICAgc3BpbmxvY2tfdCAgICAgIGNzX2xvY2s7CkBAIC0xMzAsNzggKzEyOCw3NiBAQAogCXZvaWQJCQkqcmVncDsKICNlbmRpZgogCi0gICAgICAgIC8qIHRpbWVyIGZvciBoZWFydCBiZWF0ICovCisJIC8qIHRpbWVyIGZvciBoZWFydCBiZWF0ICovCiAJc3RydWN0IHRpbWVyX2xpc3QgaGJUaW1lcjEwbXM7CiAKIAkvKiBGb3IgZHJpdmVyIGNvcmUgKi8KLQl2b2lkKiB3ZDsKKwl2b2lkICp3ZDsKIAogI2lmIChXTEFOX0hPU1RJRiA9PSBXTEFOX1VTQikKLQl1OF90ICAgICAgICAgICAgICAgICAgICB0eFVzYkJ1ZltaTV9NQVhfVFhfVVJCX05VTV1bWk1fVVNCX1RYX0JVRl9TSVpFXTsKLQl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JSZWFkQnVmW1pNX1VTQl9SRUdfTUFYX0JVRl9TSVpFXTsKLQl1OF90ICAgICAgICAgICAgICAgICAgICByZWdVc2JXcml0ZUJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdThfdAkJICAgICAgdHhVc2JCdWZbWk1fTUFYX1RYX1VSQl9OVU1dW1pNX1VTQl9UWF9CVUZfU0laRV07CisJdThfdAkJICAgICAgcmVnVXNiUmVhZEJ1ZltaTV9VU0JfUkVHX01BWF9CVUZfU0laRV07CisJdThfdAkJICAgICAgcmVnVXNiV3JpdGVCdWZbWk1fVVNCX1JFR19NQVhfQlVGX1NJWkVdOwogCXVyYl90CQkJKldsYW5UeERhdGFVcmJbWk1fTUFYX1RYX1VSQl9OVU1dOwogCXVyYl90CQkJKldsYW5SeERhdGFVcmJbWk1fTUFYX1JYX1VSQl9OVU1dOwogCXVyYl90CQkJKlJlZ091dFVyYjsKIAl1cmJfdAkJCSpSZWdJblVyYjsKLQlVc2JUeFFfdCAgICAgICAgICAgICAgICBVc2JUeEJ1ZlFbWk1fTUFYX1RYX0JVRl9OVU1dOwotCXpidWZfdCAgICAgICAgICAgICAgICAgICpVc2JSeEJ1ZlFbWk1fTUFYX1JYX1VSQl9OVU1dOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeEJ1ZkhlYWQ7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4QnVmVGFpbDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhCdWZDbnQ7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFR4VXJiSGVhZDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgVHhVcmJUYWlsOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBUeFVyYkNudDsKLSAgICAgICAgdTE2X3QgICAgICAgICAgICAgICAgICAgUnhCdWZIZWFkOwotICAgICAgICB1MTZfdCAgICAgICAgICAgICAgICAgICBSeEJ1ZlRhaWw7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIFJ4QnVmQ250OworCVVzYlR4UV90CQkgIFVzYlR4QnVmUVtaTV9NQVhfVFhfQlVGX05VTV07CisJemJ1Zl90CQkgICAgKlVzYlJ4QnVmUVtaTV9NQVhfUlhfVVJCX05VTV07CisJIHUxNl90CQkgICAgIFR4QnVmSGVhZDsKKwkgdTE2X3QJCSAgICAgVHhCdWZUYWlsOworCSB1MTZfdAkJICAgICBUeEJ1ZkNudDsKKwkgdTE2X3QJCSAgICAgVHhVcmJIZWFkOworCSB1MTZfdAkJICAgICBUeFVyYlRhaWw7CisJIHUxNl90CQkgICAgIFR4VXJiQ250OworCSB1MTZfdAkJICAgICBSeEJ1ZkhlYWQ7CisJIHUxNl90CQkgICAgIFJ4QnVmVGFpbDsKKwkgdTE2X3QJCSAgICAgUnhCdWZDbnQ7CiAjZW5kaWYKIAogI2lmIFpNX1VTQl9TVFJFQU1fTU9ERSA9PSAxCi0gICAgICAgIHpidWZfdCAgICAgICAgICAgICAgICAgICpyZWFtaW5fYnVmOworCSB6YnVmX3QJCSAgICAqcmVhbWluX2J1ZjsKICNlbmRpZgogCiAjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCi0gICAgICAgIHN0cnVjdCBhdGhyX3dsYW5fcGFyYW0gIGF0aHJfd3BhX3JlcTsKKwkgc3RydWN0IGF0aHJfd2xhbl9wYXJhbSAgYXRocl93cGFfcmVxOwogI2VuZGlmCi0gICAgICAgIHN0cnVjdCBzb2NrICAgICAgICAgICAgICpuZXRsaW5rX3NrOwotICAgICAgICB1OF90ICAgICAgICAgICAgRGV2aWNlT3BlbmVkOyAvL0NXWWFuZygrKQotICAgICAgICB1OF90ICAgICAgICAgICAgc3VwSWVbNTBdOwotICAgICAgICB1OF90ICAgICAgICAgICAgc3VwTGVuOwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExcmVxX3dwYWllIHN0YXdwYWllW1pNX09BTF9NQVhfU1RBX1NVUFBPUlRdOwotICAgICAgICB1OF90ICAgICAgICAgICAgZm9yd2FyZE1nbXQ7CisJIHN0cnVjdCBzb2NrCSAgICAgICpuZXRsaW5rX3NrOworCSB1OF90CSAgICAgRGV2aWNlT3BlbmVkOyAvKiBDV1lhbmcoKykgKi8KKwkgdThfdAkgICAgIHN1cEllWzUwXTsKKwkgdThfdAkgICAgIHN1cExlbjsKKwkgc3RydWN0IGllZWU4MDIxMXJlcV93cGFpZSBzdGF3cGFpZVtaTV9PQUxfTUFYX1NUQV9TVVBQT1JUXTsKKwkgdThfdAkgICAgIGZvcndhcmRNZ210OwogCi0gICAgICAgIHN0cnVjdCB6ZkNiVXNiRnVuY1RibCB1c2JDYkZ1bmN0aW9uczsKKwkgc3RydWN0IHpmQ2JVc2JGdW5jVGJsIHVzYkNiRnVuY3Rpb25zOwogCi0gICAgICAgIC8qIEZvciBrZXZlbnRkICovCi0gICAgICAgIHUzMl90ICAgICAgICAgICAgICAgICAgIGZsYWdzOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBrZXZlbnRfZmxhZ3M7Ci0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGtldmVudF9yZWFkeTsKKwkgLyogRm9yIGtldmVudGQgKi8KKwkgdTMyX3QJCSAgICAgZmxhZ3M7CisJIHVuc2lnbmVkIGxvbmcJICAgIGtldmVudF9mbGFnczsKKwkgdTE2X3QJCSAgICAga2V2ZW50X3JlYWR5OwogCi0gICAgICAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgIGlvY3RsX3NlbTsKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0ICAgICAga2V2ZW50OwotICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICB3YWl0X3F1ZXVlX2V2ZW50OworCSBzdHJ1Y3Qgc2VtYXBob3JlCSBpb2N0bF9zZW07CisJIHN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIGtldmVudDsKKwkgd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdF9xdWV1ZV9ldmVudDsKICNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgaGFsX2lycUZsYWc7CisJIHVuc2lnbmVkIGxvbmcJICAgIGhhbF9pcnFGbGFnOwogI2VuZGlmCi0gICAgICAgIHUxNl90ICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJTdGF0ZTsKKwkgdTE2X3QJCSAgICAgYWRhcHRlclN0YXRlOwogfTsKIAogLyogV0RTICovCiAjZGVmaW5lIFpNX1dEU19QT1JUX05VTUJFUiAgNgogCi1zdHJ1Y3QgenNXZHNTdHJ1Y3QKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2Oworc3RydWN0IHpzV2RzU3RydWN0IHsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgIHUxNl90IG9wZW5GbGFnOwogfTsKIAogLyogVkFQICovCiAjZGVmaW5lIFpNX1ZBUF9QT1JUX05VTUJFUiAgNwogCi1zdHJ1Y3QgenNWYXBTdHJ1Y3QKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2Oworc3RydWN0IHpzVmFwU3RydWN0IHsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogICAgIHUxNl90IG9wZW5GbGFnOwogfTsKIApAQCAtMjE1LDI1ICsyMTEsMjUgQEAKICNkZWZpbmUgWk1fSU9DVExfUlhEX0RVTVAgCQkJMHgwNwogI2RlZmluZSBaTV9JT0NUTF9NRU1fUkVBRAkJCTB4MEIKICNkZWZpbmUgWk1fSU9DVExfTUVNX1dSSVRFCQkJMHgwQwotI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVCAgICAgICAgICAgMHgxMAotI2RlZmluZSBaTV9JT0NUTF9SRUdfVEVTVCAgICAgICAgICAgMHgxMQotI2RlZmluZSBaTV9JT0NUTF9URVNUICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBaTV9JT0NUTF9UQUxMWSAgICAgICAgICAgICAgMHg4MSAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9SVFMgICAgICAgICAgICAgICAgMHhBMAotI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERSAgICAgICAgICAgMHhBMQotI2RlZmluZSBaTV9JT0NUTF9GUkFHICAgICAgICAgICAgICAgMHhBMgotI2RlZmluZSBaTV9JT0NUTF9TQ0FOICAgICAgICAgICAgICAgMHhBMwotI2RlZmluZSBaTV9JT0NUTF9LRVkgICAgICAgICAgICAgICAgMHhBNAotI2RlZmluZSBaTV9JT0NUTF9SQVRFICAgICAgICAgICAgICAgMHhBNQotI2RlZmluZSBaTV9JT0NUTF9FTkNSWVBUSU9OX01PREUgICAgMHhBNgotI2RlZmluZSBaTV9JT0NUTF9HRVRfVFhDTlQgICAgICAgICAgMHhBNwotI2RlZmluZSBaTV9JT0NUTF9HRVRfREVBR0dfQ05UICAgICAgMHhBOAotI2RlZmluZSBaTV9JT0NUTF9EVVJBVElPTl9NT0RFICAgICAgMHhBOQotI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX0tFWSAgICAgICAgMHhBQQotI2RlZmluZSBaTV9JT0NUTF9TRVRfQUVTX01PREUgICAgICAgMHhBQgotI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfU1RSRU5HVEggICAgMHhBQyAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWSAgICAgMHhBRCAvL0NXWWFuZygrKQotI2RlZmluZSBaTV9JT0NUTF9TRVRfUElCU1NfTU9ERSAgICAgMHhBRQorI2RlZmluZSBaTV9JT0NUTF9ETUFfVEVTVAkgICAgCQkweDEwCisjZGVmaW5lIFpNX0lPQ1RMX1JFR19URVNUCSAgICAJCTB4MTEKKyNkZWZpbmUgWk1fSU9DVExfVEVTVAkJIAkJMHg4MAorI2RlZmluZSBaTV9JT0NUTF9UQUxMWQkJCQkweDgxIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9SVFMJCQkJMHhBMAorI2RlZmluZSBaTV9JT0NUTF9NSVhfTU9ERQkJCTB4QTEKKyNkZWZpbmUgWk1fSU9DVExfRlJBRwkJCQkweEEyCisjZGVmaW5lIFpNX0lPQ1RMX1NDQU4JCQkJMHhBMworI2RlZmluZSBaTV9JT0NUTF9LRVkJCQkJMHhBNAorI2RlZmluZSBaTV9JT0NUTF9SQVRFCQkJCTB4QTUKKyNkZWZpbmUgWk1fSU9DVExfRU5DUllQVElPTl9NT0RFCQkweEE2CisjZGVmaW5lIFpNX0lPQ1RMX0dFVF9UWENOVAkJCTB4QTcKKyNkZWZpbmUgWk1fSU9DVExfR0VUX0RFQUdHX0NOVCAgICAJCTB4QTgKKyNkZWZpbmUgWk1fSU9DVExfRFVSQVRJT05fTU9ERQkJCTB4QTkKKyNkZWZpbmUgWk1fSU9DVExfU0VUX0FFU19LRVkJCQkweEFBCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9BRVNfTU9ERQkJCTB4QUIKKyNkZWZpbmUgWk1fSU9DVExfU0lHTkFMX1NUUkVOR1RICQkweEFDIC8qIENXWWFuZygrKSAqLworI2RlZmluZSBaTV9JT0NUTF9TSUdOQUxfUVVBTElUWQkJCTB4QUQgLyogQ1dZYW5nKCspICovCisjZGVmaW5lIFpNX0lPQ1RMX1NFVF9QSUJTU19NT0RFCQkJMHhBRQogCiAjZGVmaW5lCVpEQVBJT0NUTAkJCQlTSU9DREVWUFJJVkFURQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9idWYuYwppbmRleCBhMGY2NzdhLi5kN2VlMGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2J1Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfYnVmLmMKQEAgLTM0LDkgKzM0LDkgQEAKIAogCiAvKiBDYWxsZWQgdG8gYWxsb2NhdGUgYnVmZmVyLCBtdXN0IHJldHVybiBhIGNvbnRpbnVlIGJ1ZmZlciBzcGFjZSAqLwotemJ1Zl90KiB6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTE2X3QgbGVuKQoremJ1Zl90ICp6ZndCdWZBbGxvY2F0ZSh6ZGV2X3QgKmRldiwgdTE2X3QgbGVuKQogewotICAgIHpidWZfdCogYnVmOworICAgIHpidWZfdCAqYnVmOwogCiAgICAgLyogQWxsb2NhdGUgU0tCIGZvciBwYWNrZXQqLwogICAgIGJ1ZiA9IGRldl9hbGxvY19za2IobGVuKTsKQEAgLTQ2LDE1ICs0NiwxNSBAQAogCiAKIC8qIENhbGxlZCB0byBmcmVlIGJ1ZmZlciwgcmVwbGFjZSBiZWxvdyAzIGZ1bmN0aW9ucyAqLwotdm9pZCB6ZndCdWZGcmVlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgc3RhdHVzKQordm9pZCB6ZndCdWZGcmVlKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgc3RhdHVzKQogewogICAgIGRldl9rZnJlZV9za2JfYW55KGJ1Zik7CiB9CiAKIC8qIENhbGxlZCB0byBhZGp1c3QgYnVmZmVyIHNpemUgYW5kIGhlYWQgcG9pbnRlciAqLwotdTE2X3QgemZ3QnVmUmVtb3ZlSGVhZCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpCit1MTZfdCB6ZndCdWZSZW1vdmVIZWFkKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgc2l6ZSkKIHsKLSAgICAvL3ptX2Fzc2VydChidWYtPmxlbiA+IHNpemUpOworICAgIC8qIHptX2Fzc2VydChidWYtPmxlbiA+IHNpemUpOyAqLwogCiAgICAgYnVmLT5kYXRhICs9IHNpemU7CiAgICAgYnVmLT5sZW4gLT0gc2l6ZTsKQEAgLTY4LDcgKzY4LDcgQEAKIC8qIFVzZWQgdG8gY2hhaW4gUnggYnVmZmVyIHRvIGZvcm0gYSBmcmFtZS4gaWYgdGhlIHByZXBhcmVkIFJ4IGJ1ZmZlciAgKi8KIC8qIGlzIGdyZWF0ZXIgdGhhbiBhbiBldGhlcm5ldCBmcmFtZSgxNTE4KzMyIGJ5dGUpLCB0aGVuIHRoaXMgZnVuY3Rpb24gICAgKi8KIC8qIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCBoZWFkPU5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXUxNl90IHpmd0J1ZkNoYWluKHpkZXZfdCogZGV2LCB6YnVmX3QqKiBoZWFkLCB6YnVmX3QqIHRhaWwpCit1MTZfdCB6ZndCdWZDaGFpbih6ZGV2X3QgKmRldiwgemJ1Zl90ICoqaGVhZCwgemJ1Zl90ICp0YWlsKQogewogCiAgICAgKmhlYWQgPSB0YWlsOwpAQCAtNzcsNyArNzcsNyBAQAogCiAKIC8qIENhbGxlZCB3aGVuIGRvaW5nIGluZnJhLWJzcyBmb3J3YXJkaW5nICovCi11MTZfdCB6ZndCdWZDb3B5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGRzdCwgemJ1Zl90KiBzcmMpCit1MTZfdCB6ZndCdWZDb3B5KHpkZXZfdCAqZGV2LCB6YnVmX3QgKmRzdCwgemJ1Zl90ICpzcmMpCiB7CiAgICAgbWVtY3B5KGRzdC0+ZGF0YSwgc3JjLT5kYXRhLCBzcmMtPmxlbik7CiAgICAgZHN0LT50YWlsID0gZHN0LT5kYXRhOwpAQCAtODcsNyArODcsNyBAQAogCiAKIC8qIENhbGxlZCB0byBhZGp1c3QgYnVmZmVyIHNpemUgYW5kIHRhaWwgcG9pbnRlciAqLwotdTE2X3QgemZ3QnVmU2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IHNpemUpCit1MTZfdCB6ZndCdWZTZXRTaXplKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgc2l6ZSkKIHsKICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKICAgICBidWYtPnRhaWwgPSAwOwpAQCAtMTAxLDExICsxMDEsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdTE2X3QgemZ3QnVmR2V0U2l6ZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit1MTZfdCB6ZndCdWZHZXRTaXplKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKIHsKICAgICByZXR1cm4gYnVmLT5sZW47CiB9CiAKLXZvaWQgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90KiBkZXYsIHpidWZfdCogc291cmNlLCB6YnVmX3QqIGRzdCkKK3ZvaWQgemZ3Q29weUJ1ZkNvbnRleHQoemRldl90ICpkZXYsIHpidWZfdCAqc291cmNlLCB6YnVmX3QgKmRzdCkKIHsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2RiZy5jCmluZGV4IGQ0N2U5YWIuLmVlMGVlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZGJnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9kYmcuYwpAQCAtMjksNzAgKzI5LDY3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLXZvaWQgemZ3RHVtcEJ1Zih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit2b2lkIHpmd0R1bXBCdWYoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQogewotICAgIHUxNl90IGk7CisJdTE2X3QgaTsKIAotICAgIGZvciAoaT0wOyBpPGJ1Zi0+bGVuOyBpKyspCi0gICAgewotICAgICAgICBwcmludGsoIiUwMnggIiwgKigoKHU4X3QqKWJ1Zi0+ZGF0YSkraSkpOwotICAgICAgICBpZiAoKGkmMHhmKT09MHhmKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpbnRrKCJcbiIpOworCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICIsICooKCh1OF90ICopYnVmLT5kYXRhKStpKSk7CisJCWlmICgoaSAmIDB4ZikgPT0gMHhmKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwogfQogCiAKLXZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnUmVhZFJlZ0RvbmUoemRldl90ICpkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKIHsKLSAgICBwcmludGsoIlJlYWQgYWRkcjoleCA9ICV4XG4iLCBhZGRyLCB2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJSZWFkIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKIH0KIAotdm9pZCB6ZndEYmdXcml0ZVJlZ0RvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnV3JpdGVSZWdEb25lKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCiB7Ci0gICAgcHJpbnRrKCJXcml0ZSBhZGRyOiV4ID0gJXhcbiIsIGFkZHIsIHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIldyaXRlIGFkZHI6JXggPSAleFxuIiwgYWRkciwgdmFsKTsKIH0KIAotdm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdSZWFkVGFsbHlEb25lKHpkZXZfdCAqZGV2KQogewotICAgIC8vcHJpbnRrKCJSZWFkIFRhbGwgRG9uZVxuIik7CisJLyogcHJpbnRrKEtFUk5fREVCVUcgIlJlYWQgVGFsbCBEb25lXG4iKTsgKi8KIH0KIAotdm9pZCB6ZndEYmdXcml0ZUVlcHJvbURvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnV3JpdGVFZXByb21Eb25lKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCB2YWwpCiB7CiB9CiAKLXZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90KiBkZXYsIHUzMl90IHZhbCkKK3ZvaWQgemZ3RGJnUXVlcnlId1R4QnVzeURvbmUoemRldl90ICpkZXYsIHUzMl90IHZhbCkKIHsKIH0KIAotLy9Gb3IgRXZsICsrCi12b2lkIHpmd0RiZ1JlYWRGbGFzaERvbmUoemRldl90KiBkZXYsIHUzMl90IGFkZHIsIHUzMl90KiByc3BkYXRhLCB1MzJfdCBkYXRhbGVuKQorLyogRm9yIEV2bCArKyAqLwordm9pZCB6ZndEYmdSZWFkRmxhc2hEb25lKHpkZXZfdCAqZGV2LCB1MzJfdCBhZGRyLCB1MzJfdCAqcnNwZGF0YSwgdTMyX3QgZGF0YWxlbikKIHsKLSAgICBwcmludGsoIlJlYWQgRmxhc2ggYWRkcjoleCBsZW5ndGg6JXhcbiIsIGFkZHIsIGRhdGFsZW4pOworCXByaW50ayhLRVJOX0RFQlVHICJSZWFkIEZsYXNoIGFkZHI6JXggbGVuZ3RoOiV4XG4iLCBhZGRyLCBkYXRhbGVuKTsKIH0KIAotdm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoRG9uZSh6ZGV2X3QqIGRldikKK3ZvaWQgemZ3RGJnUHJvZ3JhbWVGbGFzaERvbmUoemRldl90ICpkZXYpCiB7Ci0gICAgcHJpbnRrKCJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJQcm9ncmFtIEZsYXNoIERvbmVcbiIpOwogfQogCi12b2lkIHpmd0RiZ1Byb2dyYW1lRmxhc2hDaGtEb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdQcm9ncmFtZUZsYXNoQ2hrRG9uZSh6ZGV2X3QgKmRldikKIHsKLSAgICBwcmludGsoIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlByb2dyYW0gRmxhc2ggRG9uZVxuIik7CiB9CiAKLXZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwZGF0YSkKK3ZvaWQgemZ3RGJnR2V0Rmxhc2hDaGtTdW1Eb25lKHpkZXZfdCAqZGV2LCB1MzJfdCAqcnNwZGF0YSkKIHsKLSAgICBwcmludGsoIkdldCBGbGFzaCBDaGtTdW0gRG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIkdldCBGbGFzaCBDaGtTdW0gRG9uZVxuIik7CiB9CiAKLXZvaWQgemZ3RGJnRG93bmxvYWRGd0luaXREb25lKHpkZXZfdCogZGV2KQordm9pZCB6ZndEYmdEb3dubG9hZEZ3SW5pdERvbmUoemRldl90ICpkZXYpCiB7Ci0gICAgcHJpbnRrKCJEb3dubG9hZCBGVyBJbml0IERvbmVcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJEb3dubG9hZCBGVyBJbml0IERvbmVcbiIpOwogfQotLy9Gb3IgRXZsIC0tCisvKiBGb3IgRXZsIC0tICovCiAKIC8qIExlYXZlIGFuIGVtcHR5IGxpbmUgYmVsb3cgdG8gcmVtb3ZlIHdhcm5pbmcgbWVzc2FnZSBvbiBzb21lIGNvbXBpbGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX2V2LmMKaW5kZXggYmNkYTBiOS4uMjlmNTYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9ldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfZXYuYwpAQCAtMzIsMjAyICszMiwyMTQgQEAKIAogCiAvKioqKiogTWFuYWdlbWVudCAqKioqKi8KLXUxNl90IHpmTG54QXV0aE5vdGlmeSh6ZGV2X3QqIGRldiwgdTE2X3QqIG1hY0FkZHIpCit1MTZfdCB6ZkxueEF1dGhOb3RpZnkoemRldl90ICpkZXYsIHUxNl90ICptYWNBZGRyKQogewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi11MTZfdCB6ZkxueEFzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3UxNl90IHpmTG54QXNvY05vdGlmeSh6ZGV2X3QgKmRldiwgdTE2X3QgKm1hY0FkZHIsIHU4X3QgKmJvZHksIHUxNl90IGJvZHlTaXplLAorCQkJIHUxNl90IHBvcnQpCiB7Ci0vLyNpZmRlZiBaTV9IT1NUQVBEX1NVUFBPUlQKLSAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOwotICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOwotICAgIHUxNl90IGksIGo7CisvKiAjaWZkZWYgWk1fSE9TVEFQRF9TVVBQT1JUCSovCisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKKwl1MTZfdCBpLCBqOwogCi0gICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOwotICAgIG1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgbWFjQWRkciwgRVRIX0FMRU4pOwotICAgIHdyZXEuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgcHJpbnRrKEtFUk5fREVCVUcgImpvaW5fZXZlbnQgb2YgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwltZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXByaW50ayhLRVJOX0RFQlVHICJqb2luX2V2ZW50IG9mIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQlhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKIAotICAgIGZvcihpID0gMDsgaSA8IFpNX09BTF9NQVhfU1RBX1NVUFBPUlQ7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvcihqID0gMDsgaiA8IElFRUU4MDIxMV9BRERSX0xFTjsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IDApICYmCi0gICAgICAgICAgICAgICAgKG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyW2pdICE9IGFkZHJbal0pKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqID09IDYpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPCBaTV9PQUxfTUFYX1NUQV9TVVBQT1JUKQotICAgIHsKLSAgICAgICAgLy9wcmludGsoInpmd0Fzb2NOb3RpZnkgLSBzdG9yZSB3cGEgaWUgaW4gbWFjcCwgaW5kZXggPSAlZFxuIiwgaSk7Ci0gICAgICAgIG1lbWNweShtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkciwgbWFjQWRkciwgSUVFRTgwMjExX0FERFJfTEVOKTsKLSAgICAgICAgbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgYm9keSwgYm9keVNpemUpOwotICAgIH0KLSAgICAvL2lmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gSU5GUkFTVFJVQ1RVUkVfQlNTKSB7Ci0gICAgLy8gICAgICAgICAgICAvL3dpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOwotICAgIC8vICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQobWFjcC0+ZGV2aWNlLCBTSU9DR0lXQVAsICZ3cmVxLCBOVUxMKTsKLSAgICAvL30KLSAgICAvL2Vsc2UgaWYobWFjcC0+Y2FyZFNldHRpbmcuQnNzVHlwZSA9PSBBUF9CU1MpIHsKLS8vICAgICAgICBpZiAocG9ydCA9PSAwKQotLy8gICAgICAgIHsKLSAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkICovCi0vLyAgICAgICAgICAgIGlmICh2YXBbcG9ydF0uZGV2ICE9IE5VTEwpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiQ2FuJyBmaW5kIGEgdmFsaWQgVkFQIGRldmljZSwgcG9ydDogJWRcbiIsIHBvcnQpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotICAgIC8vfQotLy8jZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVDsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBJRUVFODAyMTFfQUREUl9MRU47IGorKykgeworCQkJaWYgKChtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSAwKSAmJgorCQkJCShtYWNwLT5zdGF3cGFpZVtpXS53cGFfbWFjYWRkcltqXSAhPSBhZGRyW2pdKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSA2KQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgWk1fT0FMX01BWF9TVEFfU1VQUE9SVCkgeworCQkvKgorCQkgKiBwcmludGsoInpmd0Fzb2NOb3RpZnkgLSBzdG9yZSB3cGEgaWUgaW4gbWFjcCwKKwkJICogCWluZGV4ID0gJWRcbiIsIGkpOworCQkgKi8KKwkJbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9tYWNhZGRyLCBtYWNBZGRyLAorCQkJSUVFRTgwMjExX0FERFJfTEVOKTsKKwkJbWVtY3B5KG1hY3AtPnN0YXdwYWllW2ldLndwYV9pZSwgYm9keSwgYm9keVNpemUpOworCX0KKwkvKgorCSAqIGlmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gSU5GUkFTVFJVQ1RVUkVfQlNTKSB7CisJICogd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7CisJICoJd2lyZWxlc3Nfc2VuZF9ldmVudChtYWNwLT5kZXZpY2UsIFNJT0NHSVdBUCwgJndyZXEsIE5VTEwpOworCSAqIH0KKwkgKiBlbHNlIGlmKG1hY3AtPmNhcmRTZXR0aW5nLkJzc1R5cGUgPT0gQVBfQlNTKSB7CisJICoJaWYgKHBvcnQgPT0gMCkKKwkgKgl7CisJICovCisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cmVxLCBOVUxMKTsKKwkvKgorCSAqCX0KKwkgKgllbHNlCisJICoJeworCSAqCQkgQ2hlY2sgd2hldGhlciB0aGUgVkFQIGRldmljZSBpcyB2YWxpZAorCSAqCQlpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorCSAqCQl7CisJICoJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHZhcFtwb3J0XS5kZXYsCisJICoJCQkJCUlXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisJICoJCX0KKwkgKgkJZWxzZQorCSAqCQl7CisJICoJCQlwcmludGsoS0VSTl9FUlIgIkNhbicgZmluZCBhIHZhbGlkIFZBUCBkZXZpY2UsCisJICoJCQkJIHBvcnQ6ICVkXG4iLCBwb3J0KTsKKwkgKgkJfQorCSAqCX0KKwkgKiB9CisJICovCisvKiAjZW5kaWYJKi8KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAKIC8qIE5vdGlmaWNhdGlvbiB0aGF0IGEgU1RBIGlzIGRpc2Fzc29jaWF0ZWQgZnJvbSBBUCAqLwogLyogQVAgbW9kZSBvbmx5ICovCi11MTZfdCB6ZkxueERpc0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHU4X3QqIG1hY0FkZHIsIHUxNl90IHBvcnQpCit1MTZfdCB6ZkxueERpc0Fzb2NOb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKm1hY0FkZHIsIHUxNl90IHBvcnQpCiB7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOwotICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKIAotICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKLSAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKLSAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndEaXNBc29jTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwltZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisJbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBtYWNBZGRyLCBFVEhfQUxFTik7CisJd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlwcmludGsoS0VSTl9ERUJVRyAiemZ3RGlzQXNvY05vdGlmeSgpLCBNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CiAKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKiBOb3RpZmljYXRpb24gdGhhdCBhIFNUQSBpcyBjb25uZWN0IHRvIEFQICovCiAvKiBBUCBtb2RlIG9ubHkgKi8KLXUxNl90IHpmTG54QXBDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtYWNBZGRyLCB1MTZfdCBwb3J0KQordTE2X3QgemZMbnhBcENvbm5lY3ROb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKm1hY0FkZHIsIHUxNl90IHBvcnQpCiB7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSB3cmVxOwotICAgIHU4X3QgKmFkZHIgPSAodThfdCAqKSBtYWNBZGRyOworCXVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1OF90ICphZGRyID0gKHU4X3QgKikgbWFjQWRkcjsKIAotICAgIG1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKLSAgICBtZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKLSAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotICAgIHByaW50ayhLRVJOX0RFQlVHICJ6ZndBcENvbm5lY3ROb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwltZW1jcHkod3JlcS5hZGRyLnNhX2RhdGEsIG1hY0FkZHIsIEVUSF9BTEVOKTsKKwl3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXByaW50ayhLRVJOX0RFQlVHICJ6ZndBcENvbm5lY3ROb3RpZnkoKSwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOwogCiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogCiAKLXZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90KiBic3NpZCkKK3ZvaWQgemZMbnhDb25uZWN0Tm90aWZ5KHpkZXZfdCAqZGV2LCB1MTZfdCBzdGF0dXMsIHUxNl90ICpic3NpZCkKIHsKLSAgICB1bmlvbiBpd3JlcV9kYXRhIHdyZXE7Ci0gICAgdThfdCAqYWRkciA9ICh1OF90ICopIGJzc2lkOwotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwl1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CisJdThfdCAqYWRkciA9ICh1OF90ICopIGJzc2lkOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKIAotICAgIGlmIChic3NpZCAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCZ3cmVxLCAwLCBzaXplb2Yod3JlcSkpOwotICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQotICAgICAgICAgICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOwotICAgICAgICB3cmVxLmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWlmIChic3NpZCAhPSBOVUxMKSB7CisJCW1lbXNldCgmd3JlcSwgMCwgc2l6ZW9mKHdyZXEpKTsKKwkJaWYgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVCkKKwkJCW1lbWNweSh3cmVxLmFkZHIuc2FfZGF0YSwgYnNzaWQsIEVUSF9BTEVOKTsKKwkJd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAotICAgICAgICBpZiAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUKQotICAgICAgICB7CisJCWlmIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1QpIHsKICNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgotICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgICAgICAgICAgICAgYWRkclsxXSwgYWRkclswXSwgYWRkclszXSwgYWRkclsyXSwgYWRkcls1XSwgYWRkcls0XSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ29ubmVjdGVkIHRvIEFQLCBNQUM6IgorCQkJCSIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlhZGRyWzFdLCBhZGRyWzBdLCBhZGRyWzNdLCBhZGRyWzJdLAorCQkJCWFkZHJbNV0sIGFkZHJbNF0pOwogI2Vsc2UKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJDb25uZWN0ZWQgdG8gQVAsIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNvbm5lY3RlZCB0byBBUCwgTUFDOiIKKwkJCQkgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sCisJCQkJYWRkcls0XSwgYWRkcls1XSk7CiAjZW5kaWYKIAotICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB8fAotICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNBQkxFRCkgfHwKLSAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9ESVNBQkxFRCkgfHwKLQkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9DT05ORUNUSU9OX1JFU0VUKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX1JFU0VUKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfREVBVVRIKSB8fAotCSAgICAgICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfRElTQVNPQykgfHwKLQkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0JFQUNPTl9NSVNTKSB8fAotICAgICAgICAgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX05PVF9GT1VORCkgfHwKLQkgICAgICAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX1RJTUVPVVQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRGlzY29ubmVjdGlvbiBOb3RpZnlcbiIpOworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJfSBlbHNlIGlmICgoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0FCTEVEKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0NPTk5FQ1RJT05fRElTQUJMRUQpIHx8CisJCQkgICAgKHN0YXR1cyA9PSBaTV9TVEFUVVNfTUVESUFfQ09OTkVDVElPTl9SRVNFVCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9SRVNFVCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RFQVVUSCkgfHwKKwkJCSAgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0RJU0FTT0MpIHx8CisJCQkgICAoc3RhdHVzID09IFpNX1NUQVRVU19NRURJQV9ESVNDT05ORUNUX0JFQUNPTl9NSVNTKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfTk9UX0ZPVU5EKSB8fAorCQkJICAgIChzdGF0dXMgPT0gWk1fU1RBVFVTX01FRElBX0RJU0NPTk5FQ1RfVElNRU9VVCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJEaXNjb25uZWN0aW9uIE5vdGlmeVxuIik7CiAKLSAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLSAgICAgICAgfQorCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl9CiAKIAkvKiBTYXZlIHRoZSBjb25uZWN0ZWQgc3RhdHVzICovCiAJbWFjcC0+YWRhcHRlclN0YXRlID0gc3RhdHVzOwogCi0gICAgICAgIGlmKHpmaVdsYW5RdWVyeVdsYW5Nb2RlKGRldikgPT0gWk1fTU9ERV9JTkZSQVNUUlVDVFVSRSkgewotICAgICAgICAvLyAgICAgICAgICAgIC8vd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdTQ0FOLCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih6ZmlXbGFuUXVlcnlXbGFuTW9kZShkZXYpID09IFpNX01PREVfQVApIHsKLSAgICAgICAgICAgIC8vaWYgKHBvcnQgPT0gMCkKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwgJndyZXEsIE5VTEwpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgLyogQ2hlY2sgd2hldGhlciB0aGUgVkFQIGRldmljZSBpcyB2YWxpZCAqLwotICAgICAgICAgICAgLy8gICAgaWYgKHZhcFtwb3J0XS5kZXYgIT0gTlVMTCkKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHZhcFtwb3J0XS5kZXYsIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvLyAgICBlbHNlCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgfQotICAgIH0KLSAgICAvL3JldHVybiAwOworCQlpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKSB7CisJCQkvKndpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXU0NBTiwgJndyZXEsIE5VTEwpOyovCisJCQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgU0lPQ0dJV0FQLCAmd3JlcSwgTlVMTCk7CisJCX0gZWxzZSBpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0FQKSB7CisJCQkvKgorCQkJICogaWYgKHBvcnQgPT0gMCkKKwkJCSAqIHsKKwkJCSAqCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWUkVHSVNURVJFRCwKKwkJCSAqCQkJCSAmd3JlcSwgTlVMTCk7CisJCQkgKiB9CisJCQkgKiBlbHNlCisJCQkgKiB7CisJCQkgKglDaGVjayB3aGV0aGVyIHRoZSBWQVAgZGV2aWNlIGlzIHZhbGlkCisJCQkgKglpZiAodmFwW3BvcnRdLmRldiAhPSBOVUxMKQorCQkJICoJeworCQkJICoJCXdpcmVsZXNzX3NlbmRfZXZlbnQodmFwW3BvcnRdLmRldiwKKwkJICoJCQkJIElXRVZSRUdJU1RFUkVELCAmd3JlcSwgTlVMTCk7CisJCQkgKgl9CisJCQkgKgllbHNlCisJCQkgKgl7CisJCQkgKgkJcHJpbnRrKEtFUk5fRVJSICJDYW4nIGZpbmQgYSB2YWxpZCBWQVAiCisJCQkgKgkJCSIgZGV2aWNlLCBwb3J0OiAlZFxuIiwgcG9ydCk7CisJCQkgKgl9CisJCQkgKiB9CisJCQkqLworCQl9CisJfQorCS8qIHJldHVybiAwOwkqLwogfQogCi12b2lkIHpmTG54U2Nhbk5vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU2NhblJlc3VsdCogcmVzdWx0KQordm9pZCB6ZkxueFNjYW5Ob3RpZnkoemRldl90ICpkZXYsIHN0cnVjdCB6c1NjYW5SZXN1bHQgKnJlc3VsdCkKIHsKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQogCi12b2lkIHpmTG54U3RhdGlzdGljc05vdGlmeSh6ZGV2X3QqIGRldiwgc3RydWN0IHpzU3Rhc3RpY3MqIHJlc3VsdCkKK3ZvaWQgemZMbnhTdGF0aXN0aWNzTm90aWZ5KHpkZXZfdCAqZGV2LCBzdHJ1Y3QgenNTdGFzdGljcyAqcmVzdWx0KQogewotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKLS8vdm9pZCB6ZndNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBtZXNzYWdlLCB1MTZfdCBldmVudCkKLXZvaWQgemZMbnhNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1MTZfdCogYWRkciwgdTE2X3Qgc3RhdHVzKQorLyogdm9pZCB6ZndNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCAqZGV2LCB1OF90ICptZXNzYWdlLCB1MTZfdCBldmVudCkgKi8KK3ZvaWQgemZMbnhNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCAqZGV2LCB1MTZfdCAqYWRkciwgdTE2X3Qgc3RhdHVzKQogewogCXN0YXRpYyBjb25zdCBjaGFyICp0YWcgPSAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uIjsKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJY2hhciBidWZbMTI4XTsKIAogCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwgdHlwZSwgc3JjIGFkZHJlc3MgKi8KLQkvL3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyglc2Nhc3QgYWRkcj0lcykiLCB0YWcsCi0JLy8gICAgKHN0YXR1cyA9PSBaTV9NSUNfR1JPVVBfRVJST1IpID8gICJicm9hZCIgOiAidW5pIiwKLQkvLyAgICBldGhlcl9zcHJpbnRmKCh1OF90ICopYWRkcikpOworCS8qCisJICogc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzKCVzY2FzdCBhZGRyPSVzKSIsIHRhZywKKwkgKgkoc3RhdHVzID09IFpNX01JQ19HUk9VUF9FUlJPUikgPyAgImJyb2FkIiA6ICJ1bmkiLAorCSAqCWV0aGVyX3NwcmludGYoKHU4X3QgKilhZGRyKSk7CisJICovCiAKIAlpZiAoemZpV2xhblF1ZXJ5V2xhbk1vZGUoZGV2KSA9PSBaTV9NT0RFX0lORlJBU1RSVUNUVVJFKQotCXsKIAkJc3RyY3B5KGJ1ZiwgdGFnKTsKLQl9CiAKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CiAJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwpAQCAtMjM1LDQyICsyNDcsNDYgQEAKIH0KIAogCi12b2lkIHpmTG54QXBNaWNGYWlsdXJlTm90aWZ5KHpkZXZfdCogZGV2LCB1OF90KiBhZGRyLCB6YnVmX3QqIGJ1ZikKK3ZvaWQgemZMbnhBcE1pY0ZhaWx1cmVOb3RpZnkoemRldl90ICpkZXYsIHU4X3QgKmFkZHIsIHpidWZfdCAqYnVmKQogewotICAgIHVuaW9uIGl3cmVxX2RhdGEgd3JlcTsKKwl1bmlvbiBpd3JlcV9kYXRhIHdyZXE7CiAKLSAgICBtZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7Ci0gICAgbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7Ci0gICAgd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLSAgICBwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBNaWNGYWlsdXJlTm90aWZ5KCksIE1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICBhZGRyWzBdLCBhZGRyWzFdLCBhZGRyWzJdLCBhZGRyWzNdLCBhZGRyWzRdLCBhZGRyWzVdKTsKKwltZW1zZXQoJndyZXEsIDAsIHNpemVvZih3cmVxKSk7CisJbWVtY3B5KHdyZXEuYWRkci5zYV9kYXRhLCBhZGRyLCBFVEhfQUxFTik7CisJd3JlcS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlwcmludGsoS0VSTl9ERUJVRyAiemZ3QXBNaWNGYWlsdXJlTm90aWZ5KCksICIKKwkJCSJNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CiAKLSAgICByZXR1cm47CisJcmV0dXJuOwogfQotCi0vLyBzdGF0dXMgPSAwICA9PiBwYXJ0bmVyIGxvc3QKLS8vICAgICAgICA9IDEgID0+IHBhcnRuZXIgYWxpdmUKLS8vdm9pZCB6ZndJYnNzUGFydG5lck5vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCBzdGF0dXMpCi12b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHUxNl90IHN0YXR1cywgc3RydWN0IHpzUGFydG5lck5vdGlmeUV2ZW50ICpldmVudCkKKy8qCisgKiBzdGF0dXMgPSAwICA9PiBwYXJ0bmVyIGxvc3QKKyAqCQk9IDEgID0+IHBhcnRuZXIgYWxpdmUKKyAqIHZvaWQgemZ3SWJzc1BhcnRuZXJOb3RpZnkoemRldl90KiBkZXYsIHU4X3Qgc3RhdHVzKQorICovCit2b2lkIHpmTG54SWJzc1BhcnRuZXJOb3RpZnkoemRldl90ICpkZXYsIHUxNl90IHN0YXR1cywKKwkJCQlzdHJ1Y3QgenNQYXJ0bmVyTm90aWZ5RXZlbnQgKmV2ZW50KQogewogfQogCi12b2lkIHpmTG54TWFjQWRkcmVzc05vdGlmeSh6ZGV2X3QqIGRldiwgdThfdCogYWRkcikKK3ZvaWQgemZMbnhNYWNBZGRyZXNzTm90aWZ5KHpkZXZfdCAqZGV2LCB1OF90ICphZGRyKQogewotICAgIGRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOwotICAgIGRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOwotICAgIGRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOwotICAgIGRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOwotICAgIGRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOwotICAgIGRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOworCWRldi0+ZGV2X2FkZHJbMF0gPSBhZGRyWzBdOworCWRldi0+ZGV2X2FkZHJbMV0gPSBhZGRyWzFdOworCWRldi0+ZGV2X2FkZHJbMl0gPSBhZGRyWzJdOworCWRldi0+ZGV2X2FkZHJbM10gPSBhZGRyWzNdOworCWRldi0+ZGV2X2FkZHJbNF0gPSBhZGRyWzRdOworCWRldi0+ZGV2X2FkZHJbNV0gPSBhZGRyWzVdOwogfQogCi12b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit2b2lkIHpmTG54U2VuZENvbXBsZXRlSW5kaWNhdGlvbih6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYpCiB7CiB9CiAKIAotdm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Zikgewordm9pZCB6ZkxueFJlc3RvcmVCdWZEYXRhKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKK3sKIAogfQogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21lbS5jCmluZGV4IDMyNDE2ZDcuLjQ3Y2JjZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9tZW0uYwpAQCAtMzAsNjkgKzMwLDc1IEBACiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAogLyogTWVtb3J5IG1hbmFnZW1lbnQgKi8KLS8qIENhbGxlZCB0byBhbGxvY2F0ZSB1bmNhY2hlZCBtZW1vcnksIGFsbG9jYXRlZCBtZW1vcnkgbXVzdCAgICAqLwotLyogaW4gNC1ieXRlIGJvdW5kYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi12b2lkKiB6ZndNZW1BbGxvY2F0ZSh6ZGV2X3QqIGRldiwgdTMyX3Qgc2l6ZSkKKy8qIENhbGxlZCB0byBhbGxvY2F0ZSB1bmNhY2hlZCBtZW1vcnksIGFsbG9jYXRlZCBtZW1vcnkgbXVzdAkqLworLyogaW4gNC1ieXRlIGJvdW5kYXJ5CQkJCQkJKi8KK3ZvaWQgKnpmd01lbUFsbG9jYXRlKHpkZXZfdCAqZGV2LCB1MzJfdCBzaXplKQogewotICAgIHZvaWQqIG1lbSA9IE5VTEw7Ci0gICAgbWVtID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLSAgICByZXR1cm4gbWVtOworCXZvaWQgKm1lbSA9IE5VTEw7CisJbWVtID0ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKKwlyZXR1cm4gbWVtOwogfQogCiAKIC8qIENhbGxlZCB0byBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLXZvaWQgemZ3TWVtRnJlZSh6ZGV2X3QqIGRldiwgdm9pZCogbWVtLCB1MzJfdCBzaXplKQordm9pZCB6ZndNZW1GcmVlKHpkZXZfdCAqZGV2LCB2b2lkICptZW0sIHUzMl90IHNpemUpCiB7Ci0gICAga2ZyZWUobWVtKTsKLSAgICByZXR1cm47CisJa2ZyZWUobWVtKTsKKwlyZXR1cm47CiB9CiAKLXZvaWQgemZ3TWVtb3J5Q29weSh1OF90KiBkc3QsIHU4X3QqIHNyYywgdTE2X3QgbGVuZ3RoKQordm9pZCB6ZndNZW1vcnlDb3B5KHU4X3QgKmRzdCwgdThfdCAqc3JjLCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgLy91MTZfdCBpOworCS8qIHUxNl90IGk7ICovCiAKLSAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7Ci0gICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQotICAgIC8vewotICAgIC8vICAgIGRzdFtpXSA9IHNyY1tpXTsKLSAgICAvL30KLSAgICByZXR1cm47CisJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworCS8qCisJICogZm9yKGk9MDsgaTxsZW5ndGg7IGkrKykKKwkgKiB7CisJICoJZHN0W2ldID0gc3JjW2ldOworCSAqIH0KKwkgKi8KKwlyZXR1cm47CiB9CiAKLXZvaWQgemZ3WmVyb01lbW9yeSh1OF90KiB2YSwgdTE2X3QgbGVuZ3RoKQordm9pZCB6ZndaZXJvTWVtb3J5KHU4X3QgKnZhLCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgLy91MTZfdCBpOwotICAgIG1lbXNldCh2YSwgMCwgbGVuZ3RoKTsKLSAgICAvL2ZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCi0gICAgLy97Ci0gICAgLy8gICAgdmFbaV0gPSAwOwotICAgIC8vfQotICAgIHJldHVybjsKKwkvKiB1MTZfdCBpOyAqLworCW1lbXNldCh2YSwgMCwgbGVuZ3RoKTsKKwkvKgorCSAqIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisJICogeworCSAqCXZhW2ldID0gMDsKKwkgKiB9CisJICovCisJcmV0dXJuOwogfQogCi12b2lkIHpmd01lbW9yeU1vdmUodThfdCogZHN0LCB1OF90KiBzcmMsIHUxNl90IGxlbmd0aCkKK3ZvaWQgemZ3TWVtb3J5TW92ZSh1OF90ICpkc3QsIHU4X3QgKnNyYywgdTE2X3QgbGVuZ3RoKQogewotICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoKTsKLSAgICByZXR1cm47CisJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworCXJldHVybjsKIH0KIAotdThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QqIG0xLCB1OF90KiBtMiwgdTE2X3QgbGVuZ3RoKQordThfdCB6ZndNZW1vcnlJc0VxdWFsKHU4X3QgKm0xLCB1OF90ICptMiwgdTE2X3QgbGVuZ3RoKQogewotICAgIC8vdTE2X3QgaTsKLSAgICBpbnQgcmV0OworCS8qIHUxNl90IGk7ICovCisJaW50IHJldDsKIAotICAgIHJldCA9IG1lbWNtcChtMSwgbTIsIGxlbmd0aCk7CisJcmV0ID0gbWVtY21wKG0xLCBtMiwgbGVuZ3RoKTsKIAotICAgIHJldHVybiAoKHJldD09MCk/VFJVRTpGQUxTRSk7Ci0gICAgLy9mb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQotICAgIC8vewotICAgIC8vICAgIGlmICggbTFbaV0gIT0gbTJbaV0gKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8vICAgIH0KLSAgICAvL30KLQotICAgIC8vcmV0dXJuIFRSVUU7CisJcmV0dXJuICgocmV0ID09IDApID8gVFJVRSA6IEZBTFNFKTsKKwkvKgorCSAqIGZvcihpPTA7IGk8bGVuZ3RoOyBpKyspCisJICp7CisJICoJIGlmICggbTFbaV0gIT0gbTJbaV0gKQorCSAqCXsKKwkgKgkJcmV0dXJuIEZBTFNFOworCSAqCX0KKwkgKn0KKwkgKgorCSAqIHJldHVybiBUUlVFOworCSAqLwogfQogCiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfbWlzLmMKaW5kZXggZWEyMTk5Zi4uMjZmNDliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9taXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX21pcy5jCkBAIC0zMCw3NiArMzAsNzMgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KIAotLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOworLyogZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsJKi8KIGV4dGVybiBzdHJ1Y3QgenNWYXBTdHJ1Y3QgdmFwW1pNX1ZBUF9QT1JUX05VTUJFUl07Ci1leHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldik7CitleHRlcm4gdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QgKmRldik7CiAKIC8qIFNpbXBseSByZXR1cm4gMHhmZmZmIGlmIFZBUCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkICovCi11MTZfdCB6ZndHZXRWYXBJZCh6ZGV2X3QqIGRldikKK3UxNl90IHpmd0dldFZhcElkKHpkZXZfdCAqZGV2KQogewotICAgIHJldHVybiB6ZkxueEdldFZhcElkKGRldik7CisJcmV0dXJuIHpmTG54R2V0VmFwSWQoZGV2KTsKIH0KIAotdm9pZCB6ZndTbGVlcCh6ZGV2X3QqIGRldiwgdTMyX3QgbXMpCit2b2lkIHpmd1NsZWVwKHpkZXZfdCAqZGV2LCB1MzJfdCBtcykKIHsKLSAgICBpZiAoaW5faW50ZXJydXB0KCkgPT0gMCkKLSAgICB7Ci0gICAgICAgIG1kZWxheShtcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGludCBpaTsKLSAgICAgICAgaW50IGl0ZXIgPSAxMDAwMDAgKiBtczsKKwlpZiAoaW5faW50ZXJydXB0KCkgPT0gMCkKKwkJbWRlbGF5KG1zKTsKKwllbHNlIHsKKwkJaW50IGlpOworCQlpbnQgaXRlciA9IDEwMDAwMCAqIG1zOwogCi0gICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGl0ZXI7IGlpKyspCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgfQorCQlmb3IgKGlpID0gMDsgaWkgPCBpdGVyOyBpaSsrKSB7CisJCX0KKwl9CiB9CiAKICNpZmRlZiBaTV9IQUxQTFVTX0xPQ0sKLWFzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QqIGRldikKK2FzbWxpbmthZ2Ugc3RydWN0IHpzV2xhbkRldiAqemZ3R2V0V2xhbkRldih6ZGV2X3QgKmRldikKIHsKIAlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAJcmV0dXJuIG1hY3AtPndkOwogfQogCi1hc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90KiBkZXYpCithc21saW5rYWdlIHZvaWQgemZ3RW50ZXJDcml0aWNhbFNlY3Rpb24oemRldl90ICpkZXYpCiB7CiAJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBtYWNwLT5oYWxfaXJxRmxhZyk7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QqIGRldikKK2FzbWxpbmthZ2Ugdm9pZCB6ZndMZWF2ZUNyaXRpY2FsU2VjdGlvbih6ZGV2X3QgKmRldikKIHsKIAlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgbWFjcC0+aGFsX2lycUZsYWcpOwogfQogCi1hc21saW5rYWdlIHU4X3QgemZ3QnVmUmVhZEJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCithc21saW5rYWdlIHU4X3QgemZ3QnVmUmVhZEJ5dGUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCiB7Ci0gICAgcmV0dXJuICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0KTsKKwlyZXR1cm4gKih1OF90ICopKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCk7CiB9CiAKLWFzbWxpbmthZ2UgdTE2X3QgemZ3QnVmUmVhZEhhbGZXb3JkKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQorYXNtbGlua2FnZSB1MTZfdCB6ZndCdWZSZWFkSGFsZldvcmQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCiB7Ci0gICAgcmV0dXJuIHptd19jcHVfdG9fbGUxNigqKHUxNl90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpKTsKKwlyZXR1cm4gem13X2NwdV90b19sZTE2KCoodTE2X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSk7CiB9CiAKLWFzbWxpbmthZ2Ugdm9pZCB6ZndCdWZXcml0ZUJ5dGUoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgdmFsdWUpCithc21saW5rYWdlIHZvaWQgemZ3QnVmV3JpdGVCeXRlKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0LAorCQkJCXU4X3QgdmFsdWUpCiB7Ci0gICAgKih1OF90KikoKHU4X3QqKWJ1Zi0+ZGF0YStvZmZzZXQpID0gdmFsdWU7CisJKih1OF90ICopKCh1OF90ICopYnVmLT5kYXRhK29mZnNldCkgPSB2YWx1ZTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IHZhbHVlKQorYXNtbGlua2FnZSB2b2lkIHpmd0J1ZldyaXRlSGFsZldvcmQoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsCisJCQkJCXUxNl90IHZhbHVlKQogewotICAgICoodTE2X3QqKSgodThfdCopYnVmLT5kYXRhK29mZnNldCkgPSB6bXdfY3B1X3RvX2xlMTYodmFsdWUpOworCSoodTE2X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0KSA9IHptd19jcHVfdG9fbGUxNih2YWx1ZSk7CiB9CiAKLWFzbWxpbmthZ2UgdThfdCAqemZ3R2V0QnVmZmVyKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKK2FzbWxpbmthZ2UgdThfdCAqemZ3R2V0QnVmZmVyKHpkZXZfdCAqZGV2LCB6YnVmX3QgKmJ1ZikKIHsKLSAgICByZXR1cm4gKHU4X3QqKShidWYtPmRhdGEpOworCXJldHVybiAodThfdCAqKShidWYtPmRhdGEpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3BrdC5jCmluZGV4IDBkNTkyMGYuLjc1YmI5NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9wa3QuYwpAQCAtMzEsMTM2ICszMSwxMjIgQEAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCiAKLS8vZXh0ZXJuIHN0cnVjdCB6c1dkc1N0cnVjdCB3ZHNbWk1fV0RTX1BPUlRfTlVNQkVSXTsKKy8qIGV4dGVybiBzdHJ1Y3QgenNXZHNTdHJ1Y3Qgd2RzW1pNX1dEU19QT1JUX05VTUJFUl07IAkqLwogZXh0ZXJuIHN0cnVjdCB6c1ZhcFN0cnVjdCB2YXBbWk1fVkFQX1BPUlRfTlVNQkVSXTsKIAogCiAvKioqKiogUnggKioqKiovCi12b2lkIHpmTG54UmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKQordm9pZCB6ZkxueFJlY3Y4MDIxMSh6ZGV2X3QgKmRldiwgemJ1Zl90ICpidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyAqYWRkSW5mbykKIHsKLSAgICB1MTZfdCBmcmFtZVR5cGU7Ci0gICAgdTE2X3QgZnJhbWVDdHJsOwotICAgIHUxNl90IGZyYW1lU3VidHlwZTsKLSAgICB6YnVmX3QgKnNrYjE7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXUxNl90IGZyYW1lVHlwZTsKKwl1MTZfdCBmcmFtZUN0cmw7CisJdTE2X3QgZnJhbWVTdWJ0eXBlOworCXpidWZfdCAqc2tiMTsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAKLSAgICAvL2ZyYW1lQ3RybCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIDApOwotICAgIGZyYW1lQ3RybCA9ICoodThfdCopKCh1OF90KilidWYtPmRhdGEpOwotICAgIGZyYW1lVHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjsKLSAgICBmcmFtZVN1YnR5cGUgPSBmcmFtZUN0cmwgJiAweGYwOworCS8qIGZyYW1lQ3RybCA9IHptd19idWZfcmVhZGIoZGV2LCBidWYsIDApOwkqLworCWZyYW1lQ3RybCA9ICoodThfdCAqKSgodThfdCAqKWJ1Zi0+ZGF0YSk7CisJZnJhbWVUeXBlID0gZnJhbWVDdHJsICYgMHhmOworCWZyYW1lU3VidHlwZSA9IGZyYW1lQ3RybCAmIDB4ZjA7CiAKLSAgICBpZiAoKGZyYW1lVHlwZSA9PSAweDApICYmIChtYWNwLT5mb3J3YXJkTWdtdCkpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGZyYW1lU3VidHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEJlYWNvbiAqLwotICAgICAgICAgICAgY2FzZSAweDgwIDoKLSAgICAgICAgICAgICAgICAvKiBQcm9iZSByZXNwb25zZSAqLwotICAgICAgICAgICAgY2FzZSAweDUwIDoKLSAgICAgICAgICAgICAgICBza2IxID0gc2tiX2NvcHkoYnVmLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgICAgICBpZihza2IxICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBza2IxLT5kZXYgPSBkZXY7Ci0gICAgICAgICAgICAgICAgICAgIHNrYjEtPm1hY19oZWFkZXIgPSBza2IxLT5kYXRhOwotCSAgICAgICAgICAgIHNrYjEtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JICAgICAgICAgICAgc2tiMS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCSAgICAgICAgICAgIHNrYjEtPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOyAgLyogRVRIX1BfODAyMTFfUkFXICovCi0gICAgCSAgICAgICAgICAgIG5ldGlmX3J4KHNrYjEpOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKChmcmFtZVR5cGUgPT0gMHgwKSAmJiAobWFjcC0+Zm9yd2FyZE1nbXQpKSB7CisJCXN3aXRjaCAoZnJhbWVTdWJ0eXBlKSB7CisJCQkvKiBCZWFjb24gKi8KKwkJY2FzZSAweDgwOgorCQkJLyogUHJvYmUgcmVzcG9uc2UgKi8KKwkJY2FzZSAweDUwOgorCQkJc2tiMSA9IHNrYl9jb3B5KGJ1ZiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiMSAhPSBOVUxMKSB7CisJCQkJc2tiMS0+ZGV2ID0gZGV2OworCQkJCXNrYjEtPm1hY19oZWFkZXIgPSBza2IxLT5kYXRhOworCQkJCXNrYjEtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQkJc2tiMS0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCQkJCS8qIEVUSF9QXzgwMjExX1JBVyAqLworCQkJCXNrYjEtPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucygweDAwMTkpOworCQkJCW5ldGlmX3J4KHNrYjEpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KIAotICAgIHpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7Ci0gICAgcmV0dXJuOworCXpmaVJlY3Y4MDIxMShkZXYsIGJ1ZiwgYWRkSW5mbyk7CisJcmV0dXJuOwogfQogCiAjZGVmaW5lIFpNX0FWT0lEX1VEUF9MQVJHRV9QQUNLRVRfRkFJTAotdm9pZCB6ZkxueFJlY3ZFdGgoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBwb3J0KQordm9pZCB6ZkxueFJlY3ZFdGgoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBwb3J0KQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAjaWZkZWYgWk1fQVZPSURfVURQX0xBUkdFX1BBQ0tFVF9GQUlMCi0gICAgemJ1Zl90ICpuZXdfYnVmOworCXpidWZfdCAqbmV3X2J1ZjsKIAotICAgIC8vbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoMjA0OCk7Ci0gICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoYnVmLT5sZW4pOworCS8qIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOwkqLworCW5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKGJ1Zi0+bGVuKTsKIAogI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAotICAgIG5ld19idWYtPnRhaWwgPSAwOwotICAgIG5ld19idWYtPmxlbiA9IDA7CisJbmV3X2J1Zi0+dGFpbCA9IDA7CisJbmV3X2J1Zi0+bGVuID0gMDsKICNlbHNlCi0gICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7Ci0gICAgbmV3X2J1Zi0+bGVuID0gMDsKKwluZXdfYnVmLT50YWlsID0gbmV3X2J1Zi0+ZGF0YTsKKwluZXdfYnVmLT5sZW4gPSAwOwogI2VuZGlmCiAKLSAgICBza2JfcHV0KG5ld19idWYsIGJ1Zi0+bGVuKTsKLSAgICBtZW1jcHkobmV3X2J1Zi0+ZGF0YSwgYnVmLT5kYXRhLCBidWYtPmxlbik7CisJc2tiX3B1dChuZXdfYnVmLCBidWYtPmxlbik7CisJbWVtY3B5KG5ld19idWYtPmRhdGEsIGJ1Zi0+ZGF0YSwgYnVmLT5sZW4pOwogCi0gICAgLyogRnJlZSBidWZmZXIgKi8KLSAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOworCS8qIEZyZWUgYnVmZmVyICovCisJZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKIAotICAgIGlmIChwb3J0ID09IDApCi0gICAgewotICAgICAgICBuZXdfYnVmLT5kZXYgPSBkZXY7Ci0gICAgICAgIG5ld19idWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X2J1ZiwgZGV2KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogVkFQICovCi0gICAgICAgIGlmICh2YXBbMF0uZGV2ICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5ld19idWYtPmRldiA9IHZhcFswXS5kZXY7Ci0gICAgICAgICAgICBuZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIHZhcFswXS5kZXYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbmV3X2J1Zi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOwotICAgICAgICB9Ci0gICAgfQorCWlmIChwb3J0ID09IDApIHsKKwkJbmV3X2J1Zi0+ZGV2ID0gZGV2OworCQluZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIGRldik7CisJfSBlbHNlIHsKKwkJLyogVkFQICovCisJCWlmICh2YXBbMF0uZGV2ICE9IE5VTEwpIHsKKwkJCW5ld19idWYtPmRldiA9IHZhcFswXS5kZXY7CisJCQluZXdfYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKG5ld19idWYsIHZhcFswXS5kZXYpOworCQl9IGVsc2UgeworCQkJbmV3X2J1Zi0+ZGV2ID0gZGV2OworCQkJbmV3X2J1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhuZXdfYnVmLCBkZXYpOworCQl9CisJfQogCi0gICAgbmV3X2J1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW5ld19idWYtPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAotICAgIHN3aXRjaChuZXRpZl9yeChuZXdfYnVmKSkKKwlzd2l0Y2ggKG5ldGlmX3J4KG5ld19idWYpKQogI2Vsc2UKLSAgICBpZiAocG9ydCA9PSAwKQotICAgIHsKLSAgICAgICAgYnVmLT5kZXYgPSBkZXY7Ci0gICAgICAgIGJ1Zi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhidWYsIGRldik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFZBUCAqLwotICAgICAgICBpZiAodmFwWzBdLmRldiAhPSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWYtPmRldiA9IHZhcFswXS5kZXY7Ci0gICAgICAgICAgICBidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCB2YXBbMF0uZGV2KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1Zi0+ZGV2ID0gZGV2OwotICAgICAgICAgICAgYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKLSAgICAgICAgfQotICAgIH0KKwlpZiAocG9ydCA9PSAwKSB7CisJCWJ1Zi0+ZGV2ID0gZGV2OworCQlidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCBkZXYpOworCX0gZWxzZSB7CisJCS8qIFZBUCAqLworCQlpZiAodmFwWzBdLmRldiAhPSBOVUxMKSB7CisJCQlidWYtPmRldiA9IHZhcFswXS5kZXY7CisJCQlidWYtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoYnVmLCB2YXBbMF0uZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWJ1Zi0+ZGV2ID0gZGV2OworCQkJYnVmLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKGJ1ZiwgZGV2KTsKKwkJfQorCX0KIAotICAgIGJ1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLSAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWJ1Zi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCi0gICAgc3dpdGNoKG5ldGlmX3J4KGJ1ZikpCisJc3dpdGNoIChuZXRpZl9yeChidWYpKQogI2VuZGlmCi0gICAgewotICAgIGNhc2UgTkVUX1JYX0RST1A6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtYWNwLT5kcnZfc3RhdHMubmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgICAgIG1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gYnVmLT5sZW47Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKwl7CisJY2FzZSBORVRfUlhfRFJPUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJCW1hY3AtPmRydl9zdGF0cy5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCQkJbWFjcC0+ZHJ2X3N0YXRzLm5ldF9zdGF0cy5yeF9ieXRlcyArPSBidWYtPmxlbjsKKwkJYnJlYWs7CisJfQogCi0gICAgcmV0dXJuOworCXJldHVybjsKIH0KIAogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3NlYy5jCmluZGV4IDBmNzgwYmEuLjBiMjM4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfc2VjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF9zZWMuYwpAQCAtMzMsOTIgKzMzLDkzIEBACiAjaWZkZWYgWk1fRU5BQkxFX0NFTkMKIGV4dGVybiBpbnQgemZMbnhDZW5jU2VuZE1zZyhzdHJ1Y3Qgc29jayAqbmV0bGlua19zaywgdV9pbnQ4X3QgKm1zZywgaW50IGxlbik7CiAKLXUxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90KiBkZXYsIHUxNl90KiBtYWNBZGRyLCB1OF90KiBib2R5LCB1MTZfdCBib2R5U2l6ZSwgdTE2X3QgcG9ydCkKK3UxNl90IHpmTG54Q2VuY0Fzb2NOb3RpZnkoemRldl90ICpkZXYsIHUxNl90ICptYWNBZGRyLCB1OF90ICpib2R5LAorCQkJCXUxNl90IGJvZHlTaXplLCB1MTZfdCBwb3J0KQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKilkZXYtPnByaXY7Ci0gICAgc3RydWN0IHp5ZGFzX2NlbmNfc3RhX2luZm8gY2VuY19pbmZvOwotICAgIC8vc3RydWN0IHNvY2sgKm5ldGxpbmtfc2s7Ci0gICAgdThfdCBpZV9sZW47Ci0gICAgaW50IGlpOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IChzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKilkZXYtPnByaXY7CisJc3RydWN0IHp5ZGFzX2NlbmNfc3RhX2luZm8gY2VuY19pbmZvOworCS8qIHN0cnVjdCBzb2NrICpuZXRsaW5rX3NrOwkqLworCXU4X3QgaWVfbGVuOworCWludCBpaTsKIAotICAgIC8qIENyZWF0ZSBORVRMSU5LIHNvY2tldCAqLwotICAgIC8vbmV0bGlua19zayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShORVRMSU5LX1VTRVJTT0NLLCBOVUxMKTsKKwkvKiBDcmVhdGUgTkVUTElOSyBzb2NrZXQgKi8KKwkvKm5ldGxpbmtfc2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoTkVUTElOS19VU0VSU09DSywgTlVMTCk7CSovCiAKLSAgICBpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJORVRMSU5LIFNvY2tldCBpcyBOVUxMXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwlpZiAobWFjcC0+bmV0bGlua19zayA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTkVUTElOSyBTb2NrZXQgaXMgTlVMTFxuIik7CisJCXJldHVybiAtMTsKKwl9CiAKLSAgICBtZW1zZXQoJmNlbmNfaW5mbywgMCwgc2l6ZW9mKGNlbmNfaW5mbykpOworCW1lbXNldCgmY2VuY19pbmZvLCAwLCBzaXplb2YoY2VuY19pbmZvKSk7CiAKLSAgICAvL21lbWNweShjZW5jX2luZm8uZ3NuLCB2YXAtPml2X2NlbmNtc2tfa2V5cy53a190eGl2LCBaTV9DRU5DX0lWX0xFTik7Ci0gICAgemZpV2xhblF1ZXJ5R1NOKGRldiwgY2VuY19pbmZvLmdzbiwgcG9ydCk7Ci0gICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gWk1fQ0VOQ19JVl9MRU47Ci0gICAgaWVfbGVuID0gYm9keVsxXSArIDI7Ci0gICAgbWVtY3B5KGNlbmNfaW5mby53aWUsIGJvZHksIGllX2xlbik7Ci0gICAgY2VuY19pbmZvLmRhdGFsZW4gKz0gaWVfbGVuOworCS8qIG1lbWNweShjZW5jX2luZm8uZ3NuLCB2YXAtPml2X2NlbmNtc2tfa2V5cy53a190eGl2LAorCSAqICAJWk1fQ0VOQ19JVl9MRU4pOworCSAqLworCXpmaVdsYW5RdWVyeUdTTihkZXYsIGNlbmNfaW5mby5nc24sIHBvcnQpOworCWNlbmNfaW5mby5kYXRhbGVuICs9IFpNX0NFTkNfSVZfTEVOOworCWllX2xlbiA9IGJvZHlbMV0gKyAyOworCW1lbWNweShjZW5jX2luZm8ud2llLCBib2R5LCBpZV9sZW4pOworCWNlbmNfaW5mby5kYXRhbGVuICs9IGllX2xlbjsKIAotICAgIG1lbWNweShjZW5jX2luZm8uc3RhX21hYywgbWFjQWRkciwgNik7Ci0gICAgY2VuY19pbmZvLm1zZ190eXBlID0gWk1fQ0VOQ19XQUlfUkVRVUVTVDsKLSAgICBjZW5jX2luZm8uZGF0YWxlbiArPSA2ICsgMjsKKwltZW1jcHkoY2VuY19pbmZvLnN0YV9tYWMsIG1hY0FkZHIsIDYpOworCWNlbmNfaW5mby5tc2dfdHlwZSA9IFpNX0NFTkNfV0FJX1JFUVVFU1Q7CisJY2VuY19pbmZvLmRhdGFsZW4gKz0gNiArIDI7CiAKLSAgICBwcmludGsoS0VSTl9FUlIgIj09PT09IHpmd0NlbmNTZW5kTXNnLCBib2R5U2l6ZTogJWQgPT09PT1cbiIsIGJvZHlTaXplKTsKKwlwcmludGsoS0VSTl9FUlIgIj09PT09IHpmd0NlbmNTZW5kTXNnLCBib2R5U2l6ZTogJWQgPT09PT1cbiIsIGJvZHlTaXplKTsKIAotICAgIGZvcihpaSA9IDA7IGlpIDwgYm9keVNpemU7IGlpKyspCi0gICAgewotICAgICAgICBwcmludGsoS0VSTl9FUlIgIiUwMnggIiwgYm9keVtpaV0pOworCWZvciAoaWkgPSAwOyBpaSA8IGJvZHlTaXplOyBpaSsrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJTAyeCAiLCBib2R5W2lpXSk7CiAKLSAgICAgICAgaWYgKChpaSAmIDB4ZikgPT0gMHhmKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmICgoaWkgJiAweGYpID09IDB4ZikKKwkJCXByaW50ayhLRVJOX0VSUiAiXG4iKTsKKwl9CiAKLSAgICB6ZkxueENlbmNTZW5kTXNnKG1hY3AtPm5ldGxpbmtfc2ssICh1OF90ICopJmNlbmNfaW5mbywgY2VuY19pbmZvLmRhdGFsZW4rNCk7CisJemZMbnhDZW5jU2VuZE1zZyhtYWNwLT5uZXRsaW5rX3NrLCAodThfdCAqKSZjZW5jX2luZm8sCisJCQkgY2VuY19pbmZvLmRhdGFsZW4rNCk7CiAKLSAgICAvKiBDbG9zZSBORVRMSU5LIHNvY2tldCAqLwotICAgIC8vc29ja19yZWxlYXNlKG5ldGxpbmtfc2spOworCS8qIENsb3NlIE5FVExJTksgc29ja2V0ICovCisJLyogc29ja19yZWxlYXNlKG5ldGxpbmtfc2spOwkqLwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQworI2VuZGlmIC8qIFpNX0VOQUJMRV9DRU5DCSovCiAKLXU4X3QgemZ3Q2VuY0hhbmRsZUJlYWNvblByb2JyZXNwb24oemRldl90KiBkZXYsIHU4X3QgKnBXSUVjLAotICAgICAgICB1OF90ICpwUGVlclNTSURjLCB1OF90ICpwUGVlckFkZHJjKQordThfdCB6ZndDZW5jSGFuZGxlQmVhY29uUHJvYnJlc3Bvbih6ZGV2X3QgKmRldiwgdThfdCAqcFdJRWMsCisJCXU4X3QgKnBQZWVyU1NJRGMsIHU4X3QgKnBQZWVyQWRkcmMpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXU4X3QgemZ3R2V0UGt0RW5jRXhlbXB0aW9uQWN0aW9uVHlwZSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYpCit1OF90IHpmd0dldFBrdEVuY0V4ZW1wdGlvbkFjdGlvblR5cGUoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQogewotICAgIHJldHVybiBaTV9FTkNSWVBUSU9OX0VYRU1QVF9OT19FWEVNUFRJT047CisJcmV0dXJuIFpNX0VOQ1JZUFRJT05fRVhFTVBUX05PX0VYRU1QVElPTjsKIH0KIAotdm9pZCBjb3B5VG9JbnRUeEJ1ZmZlcih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1MTZfdCBvZmZzZXQsIHUxNl90IGxlbmd0aCkKK3ZvaWQgY29weVRvSW50VHhCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1OF90ICpzcmMsCisJCQkJCQkgdTE2X3Qgb2Zmc2V0LCB1MTZfdCBsZW5ndGgpCiB7Ci0gICAgdTE2X3QgaTsKKwl1MTZfdCBpOwogCi0gICAgZm9yKGk9MDsgaTxsZW5ndGg7aSsrKQotICAgIHsKLSAgICAgICAgLy96bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2ksIHNyY1tpXSk7Ci0gICAgICAgICoodThfdCopKCh1OF90KilidWYtPmRhdGErb2Zmc2V0K2kpID0gc3JjW2ldOwotICAgIH0KKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJLyogem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtpLCBzcmNbaV0pOwkqLworCQkqKHU4X3QgKikoKHU4X3QgKilidWYtPmRhdGErb2Zmc2V0K2kpID0gc3JjW2ldOworCX0KIH0KIAotdTE2X3QgemZ3U3RhQWRkSWVXcGFSc24oemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQordTE2X3QgemZ3U3RhQWRkSWVXcGFSc24oemRldl90ICpkZXYsIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgZnJhbWVUeXBlKQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICAvL3ptX21zZzFfbW0oWk1fTFZfMCwgIkNXWSAtIGFkZCB3cGFpZSBjb250ZW50IExlbmd0aCA6ICIsIG1hY3AtPnN1cEllWzFdKTsKLSAgICBpZiAobWFjcC0+c3VwSWVbMV0gIT0gMCkKLSAgICB7Ci0gICAgICAgIGNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBtYWNwLT5zdXBJZSwgb2Zmc2V0LCBtYWNwLT5zdXBJZVsxXSsyKTsKLSAgICAgICAgLy9tZW1jcHkoYnVmLT5kYXRhW29mZnNldF0sIG1hY3AtPnN1cEllLCBtYWNwLT5zdXBJZVsxXSsyKTsKLSAgICAgICAgb2Zmc2V0ICs9IChtYWNwLT5zdXBJZVsxXSsyKTsKLSAgICB9CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCS8qIHptX21zZzFfbW0oWk1fTFZfMCwgIkNXWSAtIGFkZCB3cGFpZSBjb250ZW50IExlbmd0aCA6ICIKKwkgKiAJCSwgbWFjcC0+c3VwSWVbMV0pOworCSAqLworCWlmIChtYWNwLT5zdXBJZVsxXSAhPSAwKSB7CisJCWNvcHlUb0ludFR4QnVmZmVyKGRldiwgYnVmLCBtYWNwLT5zdXBJZSwgb2Zmc2V0LAorCQkJCQkgbWFjcC0+c3VwSWVbMV0rMik7CisJCS8qIG1lbWNweShidWYtPmRhdGFbb2Zmc2V0XSwgbWFjcC0+c3VwSWUsIG1hY3AtPnN1cEllWzFdKzIpOyovCisJCW9mZnNldCArPSAobWFjcC0+c3VwSWVbMV0rMik7CisJfQogCi0gICAgcmV0dXJuIG9mZnNldDsKKwlyZXR1cm4gb2Zmc2V0OwogfQogCiAvKiBMZWF2ZSBhbiBlbXB0eSBsaW5lIGJlbG93IHRvIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2Ugb24gc29tZSBjb21waWxlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3dyYXBfdXNiLmMKaW5kZXggNzBmZDQxMC4uNmIzMzZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL290dXMvd3JhcF91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy93cmFwX3VzYi5jCkBAIC0zMCwxNTkgKzMwLDE1MiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCi1leHRlcm4gdm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpOwotZXh0ZXJuIHZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCogZGV2KTsKK2V4dGVybiB2b2lkIHpmTG54SW5pdFVzYlR4USh6ZGV2X3QgKmRldik7CitleHRlcm4gdm9pZCB6ZkxueEluaXRVc2JSeFEoemRldl90ICpkZXYpOwogZXh0ZXJuIHUzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwotdTMyX3QgemZMbnhVc2JPdXQoemRldl90KiBkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAotICAgICAgICB1OF90ICp0YWlsLCB1MTZfdCB0YWlsTGVuLCB6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KTsKLXUzMl90IHpmTG54VXNiV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbik7Cit1MzJfdCB6ZkxueFVzYk91dCh6ZGV2X3QgKmRldiwgdThfdCAqaGRyLCB1MTZfdCBoZHJsZW4sIHU4X3QgKnNuYXAsCisJCXUxNl90IHNuYXBMZW4sIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLAorCQl1MTZfdCBvZmZzZXQpOwordTMyX3QgemZMbnhVc2JXcml0ZVJlZyh6ZGV2X3QgKmRldiwgdTMyX3QgKmNtZCwgdTE2X3QgY21kTGVuKTsKIAotdm9pZCB6ZndVc2JSZWdpc3RlckNhbGxCYWNrKHpkZXZfdCogZGV2LCBzdHJ1Y3QgemZDYlVzYkZ1bmNUYmwgKnpmVXNiRnVuYykgewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKK3ZvaWQgemZ3VXNiUmVnaXN0ZXJDYWxsQmFjayh6ZGV2X3QgKmRldiwgc3RydWN0IHpmQ2JVc2JGdW5jVGJsICp6ZlVzYkZ1bmMpCit7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogCi0gICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWN2OwotICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbiA9IHpmVXNiRnVuYy0+emZjYlVzYlJlZ0luOwotICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZSA9IHpmVXNiRnVuYy0+emZjYlVzYk91dENvbXBsZXRlOworCW1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWN2ID0gemZVc2JGdW5jLT56ZmNiVXNiUmVjdjsKKwltYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiUmVnSW4gPSB6ZlVzYkZ1bmMtPnpmY2JVc2JSZWdJbjsKKwltYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUgPSB6ZlVzYkZ1bmMtPnpmY2JVc2JPdXRDb21wbGV0ZTsKIAotICAgIHJldHVybjsKKwlyZXR1cm47CiB9CiAKLXUzMl90IHpmd1VzYkdldEZyZWVUeFFTaXplKHpkZXZfdCogZGV2KQordTMyX3QgemZ3VXNiR2V0RnJlZVR4UVNpemUoemRldl90ICpkZXYpCiB7Ci0gICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwotICAgIHUzMl90ICAgICAgICBmcmVlVHhRU2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7Ci0gICAgLy96bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOworCXN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKKwl1MzJfdAkJZnJlZVR4UVNpemU7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCS8qIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CSovCiAKLSAgICAvL3ptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7Ci0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOworCS8qIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CSovCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogCi0gICAgZnJlZVR4UVNpemUgPSBaTV9NQVhfVFhfQlVGX05VTSAtIG1hY3AtPlR4QnVmQ250OworCWZyZWVUeFFTaXplID0gWk1fTUFYX1RYX0JVRl9OVU0gLSBtYWNwLT5UeEJ1ZkNudDsKIAotICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKKwkvKiB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwkqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogCi0gICAgcmV0dXJuIGZyZWVUeFFTaXplOworCXJldHVybiBmcmVlVHhRU2l6ZTsKIH0KIAotdTMyX3QgemZ3VXNiR2V0TWF4VHhRU2l6ZSh6ZGV2X3QqIGRldikKK3UzMl90IHpmd1VzYkdldE1heFR4UVNpemUoemRldl90ICpkZXYpCiB7Ci0gICAgcmV0dXJuIFpNX01BWF9UWF9CVUZfTlVNOworCXJldHVybiBaTV9NQVhfVFhfQlVGX05VTTsKIH0KIAogdTMyX3QgemZ3VXNiRW5hYmxlSW50RXB0KHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0KQogewotICAgIC8qIEluaXRpYWxpemUgVVNCIFR4USAqLwotICAgIHpmTG54SW5pdFVzYlR4UShkZXYpOworCS8qIEluaXRpYWxpemUgVVNCIFR4USAqLworCXpmTG54SW5pdFVzYlR4UShkZXYpOwogCi0gICAgLyogSW5pdGlhbGl6ZSBVU0IgUnhRICovCi0gICAgemZMbnhJbml0VXNiUnhRKGRldik7CisJLyogSW5pdGlhbGl6ZSBVU0IgUnhRICovCisJemZMbnhJbml0VXNiUnhRKGRldik7CiAKLSAgICAvKiBJbml0aWFsaXplIFVTQiBSZWdpc3RlciBJbiBVUkIgKi8KLSAgICAvL3pmd1VzYlN1Ym1pdFJlZ0luKGRldik7Ci0gICAgLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCi0gICAgemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOworCS8qIEluaXRpYWxpemUgVVNCIFJlZ2lzdGVyIEluIFVSQiAqLworCS8qIHpmd1VzYlN1Ym1pdFJlZ0luKGRldik7CSovCisJLyogSW5pdGlhbGl6ZSBVU0IgUmVnaXN0ZXIgSW4gVVJCICovCisJemZMbnhTdWJtaXRSZWdJblVyYihkZXYpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLWludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QqIGRldiwgdThfdCBlbmRwdCkKK2ludCB6ZndVc2JFbmFibGVSeEVwdCh6ZGV2X3QgKmRldiwgdThfdCBlbmRwdCkKIHsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotdTMyX3QgemZ3VXNiU3VibWl0Q29udHJvbCh6ZGV2X3QqIGRldiwgdThfdCByZXEsIHUxNl90IHZhbHVlLCB1MTZfdCBpbmRleCwgdm9pZCAqZGF0YSwgdTMyX3Qgc2l6ZSkKK3UzMl90IHpmd1VzYlN1Ym1pdENvbnRyb2woemRldl90ICpkZXYsIHU4X3QgcmVxLCB1MTZfdCB2YWx1ZSwgdTE2X3QgaW5kZXgsCisJCQkgdm9pZCAqZGF0YSwgdTMyX3Qgc2l6ZSkKIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICB1MzJfdCByZXQgPSAwOwotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICB1OF90KiBidWY7CisJaW50IHJlc3VsdCA9IDA7CisJdTMyX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CisJdThfdCAqYnVmOwogCi0gICAgaWYgKHNpemUgPiAwKQotICAgIHsKLSAgICAgICAgYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgbWVtY3B5KGJ1ZiwgKHU4X3QqKWRhdGEsIHNpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBidWYgPSBOVUxMOwotICAgIH0KKwlpZiAoc2l6ZSA+IDApIHsKKwkJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KGJ1ZiwgKHU4X3QgKilkYXRhLCBzaXplKTsKKwl9IGVsc2UKKwkJYnVmID0gTlVMTDsKIAogI2lmIDAKLSAgICBwcmludGsoS0VSTl9FUlIgInJlcSA9IDB4JTAyeFxuIiwgcmVxKTsKLSAgICBwcmludGsoS0VSTl9FUlIgInZhbHVlID0gMHglMDR4XG4iLCB2YWx1ZSk7Ci0gICAgcHJpbnRrKEtFUk5fRVJSICJpbmRleCA9IDB4JTA0eFxuIiwgaW5kZXgpOwotICAgIHByaW50ayhLRVJOX0VSUiAiZGF0YSA9IDB4JWx4XG4iLCAodTMyX3QpIGRhdGEpOwotICAgIHByaW50ayhLRVJOX0VSUiAic2l6ZSA9ICVsZFxuIiwgc2l6ZSk7CisJcHJpbnRrKEtFUk5fRVJSICJyZXEgPSAweCUwMnhcbiIsIHJlcSk7CisJcHJpbnRrKEtFUk5fRVJSICJ2YWx1ZSA9IDB4JTA0eFxuIiwgdmFsdWUpOworCXByaW50ayhLRVJOX0VSUiAiaW5kZXggPSAweCUwNHhcbiIsIGluZGV4KTsKKwlwcmludGsoS0VSTl9FUlIgImRhdGEgPSAweCVseFxuIiwgKHUzMl90KSBkYXRhKTsKKwlwcmludGsoS0VSTl9FUlIgInNpemUgPSAlbGRcbiIsIHNpemUpOwogI2VuZGlmCiAKLSAgICByZXN1bHQgPSB1c2JfY29udHJvbF9tc2cobWFjcC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKG1hY3AtPnVkZXYsIDApLAotICAgICAgICAgICAgcmVxLCBVU0JfRElSX09VVCB8IDB4NDAsIHZhbHVlLCBpbmRleCwgYnVmLCBzaXplLCBIWik7CisJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKG1hY3AtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShtYWNwLT51ZGV2LCAwKSwKKwkJCXJlcSwgVVNCX0RJUl9PVVQgfCAweDQwLCB2YWx1ZSwgaW5kZXgsIGJ1Ziwgc2l6ZSwgSFopOwogCi0gICAgaWYgKHJlc3VsdCA8IDApCi0gICAgewotICAgICAgICBwcmludGsoInpmd1VzYlN1Ym1pdENvbnRyb2woKSBmYWlsZWQsIHJlc3VsdD0weCV4XG4iLCByZXN1bHQpOwotICAgICAgICByZXQgPSAxOwotICAgIH0KLSAgICBrZnJlZShidWYpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiemZ3VXNiU3VibWl0Q29udHJvbCgpIGZhaWxlZCwgcmVzdWx0ID0gMHgleFxuIiwKKwkJCXJlc3VsdCk7CisJCXJldCA9IDE7CisJfQorCWtmcmVlKGJ1Zik7CiAKLSAgICByZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgemZ3VXNiQ21kKHpkZXZfdCogZGV2LCB1OF90IGVuZHB0LCB1MzJfdCogY21kLCB1MTZfdCBjbWRMZW4pCit2b2lkIHpmd1VzYkNtZCh6ZGV2X3QgKmRldiwgdThfdCBlbmRwdCwgdTMyX3QgKmNtZCwgdTE2X3QgY21kTGVuKQogewotICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKLSAgICB1MzJfdCByZXQ7CisJc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OworCXUzMl90IHJldDsKIAotICAgIC8vTVBVc2JDb21tYW5kKGRldiwgZW5kcHQsIGNtZCwgY21kTGVuKTsKLSAgICByZXQgPSB6ZkxueFVzYldyaXRlUmVnKGRldiwgY21kLCBjbWRMZW4pOworCS8qIE1QVXNiQ29tbWFuZChkZXYsIGVuZHB0LCBjbWQsIGNtZExlbik7CSovCisJcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKIAotICAgIC8qIGlmIHpmTG54VXNiV3JpdGVSZWcoKSByZXR1cm4gZXJyb3IsIGZyZWUgYW5kIGFsbG9jYXRlIHVyYiwgcmVzZW5kIGFnYWluICovCi0gICAgaWYgKHJldCAhPSAwKQotICAgIHsKLSAgICAgICAgdXNiX2ZyZWVfdXJiKG1hY3AtPlJlZ091dFVyYik7Ci0gICAgICAgIG1hY3AtPlJlZ091dFVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0gICAgICAgIHJldCA9IHpmTG54VXNiV3JpdGVSZWcoZGV2LCBjbWQsIGNtZExlbik7Ci0gICAgfQorCS8qCisJICogaWYgemZMbnhVc2JXcml0ZVJlZygpIHJldHVybiBlcnJvciwgZnJlZSBhbmQgYWxsb2NhdGUgdXJiLAorCSAqIHJlc2VuZCBhZ2FpbgorCSAqLworCWlmIChyZXQgIT0gMCkgeworCQl1c2JfZnJlZV91cmIobWFjcC0+UmVnT3V0VXJiKTsKKwkJbWFjcC0+UmVnT3V0VXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwkJcmV0ID0gemZMbnhVc2JXcml0ZVJlZyhkZXYsIGNtZCwgY21kTGVuKTsKKwl9CiB9CiAKLXUzMl90IHpmd1VzYlNlbmQoemRldl90KiBkZXYsIHU4X3QgZW5kcHQsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAotICAgICAgICAgICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCit1MzJfdCB6ZndVc2JTZW5kKHpkZXZfdCAqZGV2LCB1OF90IGVuZHB0LCB1OF90ICpoZHIsIHUxNl90IGhkcmxlbiwgdThfdCAqc25hcCwKKwkJCXUxNl90IHNuYXBMZW4sCXU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sCisJCQl6YnVmX3QgKmJ1ZiwgdTE2X3Qgb2Zmc2V0KQogewotICAgIHUzMl90IHN0YXR1czsKKwl1MzJfdCBzdGF0dXM7CiAKICNpZmRlZiBaTV9DT05GSUdfQklHX0VORElBTgotICAgIHUzMl90IGlpID0gMDsKLSAgICB1MTZfdCAqcGMgPSBOVUxMOworCXUzMl90IGlpID0gMDsKKwl1MTZfdCAqcGMgPSBOVUxMOwogCi0gICAgcGMgPSAodTE2X3QgKiloZHI7Ci0gICAgZm9yKGlpPTA7IGlpPChoZHJsZW4+PjEpOyBpaSsrKQotICAgIHsKLSAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKLSAgICB9CisJcGMgPSAodTE2X3QgKiloZHI7CisJZm9yIChpaSA9IDA7IGlpIDwgKGhkcmxlbiA+PiAxKTsgaWkrKykKKwkJcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKIAotICAgIHBjID0gKHUxNl90ICopc25hcDsKLSAgICBmb3IoaWk9MDsgaWk8KHNuYXBMZW4+PjEpOyBpaSsrKQotICAgIHsKLSAgICAgICAgcGNbaWldID0gY3B1X3RvX2xlMTYocGNbaWldKTsKLSAgICB9CisJcGMgPSAodTE2X3QgKilzbmFwOworCWZvciAoaWkgPSAwOyBpaSA8IChzbmFwTGVuID4+IDEpOyBpaSsrKQorCQlwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwogCi0gICAgcGMgPSAodTE2X3QgKil0YWlsOwotICAgIGZvcihpaT0wOyBpaTwodGFpbExlbj4+MSk7IGlpKyspCi0gICAgewotICAgICAgICBwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwotICAgIH0KKwlwYyA9ICh1MTZfdCAqKXRhaWw7CisJZm9yIChpaSA9IDA7IGlpIDwgKHRhaWxMZW4+PjEpOyBpaSsrKQorCQlwY1tpaV0gPSBjcHVfdG9fbGUxNihwY1tpaV0pOwogI2VuZGlmCiAKLSAgICBzdGF0dXMgPSB6ZkxueFVzYk91dChkZXYsIGhkciwgaGRybGVuLCBzbmFwLCBzbmFwTGVuLCB0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCk7Ci0gICAgaWYgKCBzdGF0dXMgPT0gMCApCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQorCXN0YXR1cyA9IHpmTG54VXNiT3V0KGRldiwgaGRyLCBoZHJsZW4sIHNuYXAsIHNuYXBMZW4sIHRhaWwsIHRhaWxMZW4sCisJCQkJYnVmLCBvZmZzZXQpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKIH0KIAogLyogTGVhdmUgYW4gZW1wdHkgbGluZSBiZWxvdyB0byByZW1vdmUgd2FybmluZyBtZXNzYWdlIG9uIHNvbWUgY29tcGlsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvb3R1cy96ZHVzYi5oCmluZGV4IDlmOGFiMmUuLjk3ZTRlZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vdHVzL3pkdXNiLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL290dXMvemR1c2IuaApAQCAtMzQsMTAgKzM0LDEwIEBACiAjZGVmaW5lIFZFUlNJT05JRCAgICAgICAgICAgICAgICIwLjAuMC45OTkiCiAKIC8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KLSNkZWZpbmUgVkVORE9SX0FUSFIgICAgICAgICAgICAgMHgwQ0YzICAvL0F0aGVyb3MKKyNkZWZpbmUgVkVORE9SX0FUSFIgICAgICAgICAgICAgMHgwQ0YzICAvKiBBdGhlcm9zICovCiAjZGVmaW5lIFBST0RVQ1RfQVI5MTcwICAgICAgICAgIDB4OTE3MAogCi0jZGVmaW5lIFZFTkRPUl9ETElOSyAgICAgICAgICAgIDB4MDdEMSAgLy9EbGluaworI2RlZmluZSBWRU5ET1JfRExJTksgICAgICAgICAgICAweDA3RDEgIC8qIERsaW5rICovCiAjZGVmaW5lIFBST0RVQ1RfRFdBMTYwQSAgICAgICAgIDB4M0MxMAogCiAjZGVmaW5lCVZFTkRPUl9ORVRHRUFSCQkweDA4NDYJLyogTmV0R2VhciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3A5YXV0aC9wOWF1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9wOWF1dGgvcDlhdXRoLmMKaW5kZXggOGNjZmZmNy4uZGI3OTYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3A5YXV0aC9wOWF1dGguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcDlhdXRoL3A5YXV0aC5jCkBAIC0zMzQsNiArMzM0LDcgQEAKIAkucmVsZWFzZSA9IGNhcF9yZWxlYXNlLAogfTsKIAorLyogbm8gX19leGl0IGhlcmUgYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBpbml0IGZ1bmN0aW9uICovCiBzdGF0aWMgdm9pZCBjYXBfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTM2MCw3ICszNjEsNyBAQAogCQlwcmludGsoS0VSTl9OT1RJQ0UgIkVycm9yICVkIGFkZGluZyBjYXAlZCIsIGVyciwgaW5kZXgpOwogfQogCi1zdGF0aWMgaW50IGNhcF9pbml0X21vZHVsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgY2FwX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJlc3VsdCwgaTsKIAlkZXZfdCBkZXYgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9waGlzb24vcGhpc29uLmMKaW5kZXggMjcwZWJjYi4uMzgxN2Q3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BoaXNvbi9waGlzb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGhpc29uL3BoaXNvbi5jCkBAIC04NywxMiArODcsMTIgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGludCBwaGlzb25faWRlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBoaXNvbl9pZGVfaW5pdCh2b2lkKQogewogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwaGlzb25fcGNpX2RyaXZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIHBoaXNvbl9pZGVfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHBoaXNvbl9pZGVfZXhpdCh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGhpc29uX3BjaV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvUkVBRE1FCmluZGV4IDg0MmFmZDQuLmFjNzZmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL1JFQURNRQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9SRUFETUUKQEAgLTEsNyArMSw2IEBACiBUT0RPOgogCS0gUnggYmxvY2sgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgMjA0OCwgaGFyZHdhcmUgYnVnPwogCS0gR3JvdXAgc2l6ZSBpcyBsaW1pdGVkIHRvIDwgcGFnZSBzaXplLCBrZXJuZWwgYWxsb2MvbW1hcCBBUEkgaXNzdWVzCi0JLSBmaXgvd29ya2Fyb3VuZCBjYWNoZSBpc3N1ZXMgaW4gY2lyY3VsYXIgYnVmZmVyIGhlYWRlcgogCS0gdGVzdCB3aGV0aGVyIFR4IGlzIHRyYW5zbWl0dGluZyBkYXRhIGZyb20gcHJvdmlkZWQgYnVmZmVycwogCS0gaGFuZGxlIGRldmljZSB1bnBsdWcgY2FzZQogCS0gaGFuZGxlIHRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZApAQCAtMTAsNSArOSwxMjggQEAKIAktIGF1ZGl0IHVzZXJzcGFjZSBpbnRlcmZhY2VzCiAJLSBnZXQgcmVzZXJ2ZWQgbWFqb3IvbWlub3IgaWYgbmVlZGVkCiAKK1NhbXBsZSBDb2RlOgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8c3lzZnMvbGlic3lzZnMuaD4KKworI2luY2x1ZGUgPHBvY2guaD4KKworc3RydWN0IHBjb25zdW1lIHsKKwl1aW50MzJfdCAqIG9mZnNldHM7CisJdWludDMyX3QgbmZldGNoOworCXVpbnQzMl90IG5mbHVzaDsKK307CisKK3VpbnQzMl90IG9mZnNldHNbMTBdOworCit2b2lkIHByb2Nlc3NfZ3JvdXAodW5zaWduZWQgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworCXVpbnQxNl90ICpidWYxNiA9ICh1aW50MTZfdCAqKWJ1ZjsKKworCXByaW50ZigiUlg6ICVwICV1ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLCBidWYsIHNpemUsCisJICAgICAgIGJ1ZjE2WzBdLCBidWYxNlsxXSwgYnVmMTZbMl0sIGJ1ZjE2WzNdLCBidWYxNls0XSwgYnVmMTZbNV0pOworfQorCitpbnQgbWFpbigpCit7CisJc3RydWN0IHN5c2ZzX2F0dHJpYnV0ZSAqYXR0cjsKKwljaGFyICpwYXRoOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBtbWFwX3NpemU7CisJaW50IGZkOworCXVuc2lnbmVkIGNoYXIgKmNidWY7CisKKwl1aW50MzJfdCBuZmx1c2g7CisJc3RydWN0IHBvbGxmZCBwb2xsX2ZkczsKKwlpbnQgY291bnQgPSAwOworCWludCBpOworCisJcGF0aCA9ICIvc3lzL2NsYXNzL3BvY2tldGNoYW5nZS9wb2NoMC9jaDAvYmxvY2tfc2l6ZSI7CisJYXR0ciA9IHN5c2ZzX29wZW5fYXR0cmlidXRlKHBhdGgpOworCXJldCA9IHN5c2ZzX3dyaXRlX2F0dHJpYnV0ZShhdHRyLCAiMjU2Iiwgc3RybGVuKCIyNTYiKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciB3cml0aW5nIGF0dHJpYnV0ZSAlcyIsIHBhdGgpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCXBhdGggPSAiL3N5cy9jbGFzcy9wb2NrZXRjaGFuZ2UvcG9jaDAvY2gwL2dyb3VwX3NpemUiOworCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShwYXRoKTsKKwlyZXQgPSBzeXNmc193cml0ZV9hdHRyaWJ1dGUoYXR0ciwgIjQwOTYiLCBzdHJsZW4oIjQwOTYiKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciB3cml0aW5nIGF0dHJpYnV0ZSAlcyIsIHBhdGgpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCXBhdGggPSAiL3N5cy9jbGFzcy9wb2NrZXRjaGFuZ2UvcG9jaDAvY2gwL2dyb3VwX2NvdW50IjsKKwlhdHRyID0gc3lzZnNfb3Blbl9hdHRyaWJ1dGUocGF0aCk7CisJcmV0ID0gc3lzZnNfd3JpdGVfYXR0cmlidXRlKGF0dHIsICI2NCIsIHN0cmxlbigiNjQiKSk7CisJaWYgKHJldCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciB3cml0aW5nIGF0dHJpYnV0ZSAlcyIsIHBhdGgpOworCXN5c2ZzX2Nsb3NlX2F0dHJpYnV0ZShhdHRyKTsKKworCWZkID0gb3BlbigiL2Rldi9jaDAiLCBPX1JEV1IpOworCWlmIChmZCA9PSAtMSkKKwkJZXJyb3IoMSwgZXJybm8sICJlcnJvciBvcGVuaW5nIGRldmljZSBub2RlIik7CisKKwlwYXRoID0gIi9zeXMvY2xhc3MvcG9ja2V0Y2hhbmdlL3BvY2gwL2NoMC9tbWFwX3NpemUiOworCWF0dHIgPSBzeXNmc19vcGVuX2F0dHJpYnV0ZShwYXRoKTsKKwlyZXQgPSBzeXNmc19yZWFkX2F0dHJpYnV0ZShhdHRyKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHJlYWRpbmcgYXR0cmlidXRlICVzIiwgcGF0aCk7CisJcHJpbnRmKCIlcyIsIGF0dHItPnZhbHVlKTsKKwlzc2NhbmYoYXR0ci0+dmFsdWUsICIlbHUiLCAmbW1hcF9zaXplKTsKKwlzeXNmc19jbG9zZV9hdHRyaWJ1dGUoYXR0cik7CisKKwljYnVmID0gbW1hcChOVUxMLCBtbWFwX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICBNQVBfUFJJVkFURSwgZmQsIDApOworCWlmIChjYnVmID09IE1BUF9GQUlMRUQpCisJCWVycm9yKDEsIGVycm5vLCAiZXJyb3IgbWFwcGluZyBETUEgYnVmZmVycyIpOworCisJcmV0ID0gaW9jdGwoZmQsIFBPQ0hfSU9DX1RSQU5TRkVSX1NUQVJULCAwKTsKKwlpZiAocmV0ID09IC0xKQorCQllcnJvcigxLCBlcnJubywgImVycm9yIHN0YXJ0aW5nIHRyYW5zZmVyIik7CisKKwluZmx1c2ggPSAwOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBwY29uc3VtZSBjb25zdW1lOworCisJCWNvbnN1bWUub2Zmc2V0cyA9IG9mZnNldHM7CisJCWNvbnN1bWUubmZldGNoID0gMTA7CisJCWNvbnN1bWUubmZsdXNoID0gbmZsdXNoOworCisJCXJldCA9IGlvY3RsKGZkLCBQT0NIX0lPQ19DT05TVU1FLCAmY29uc3VtZSk7CisJCWlmIChyZXQgPT0gLTEpCisJCQllcnJvcigxLCBlcnJubywgImVycm9yIGNvbnN1bWluZyBncm91cHMiKTsKKworCQluZmx1c2ggPSBjb25zdW1lLm5mZXRjaDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbmZsdXNoOyBpKyspIHsKKwkJCXByb2Nlc3NfZ3JvdXAoY2J1ZiArIGNvbnN1bWUub2Zmc2V0c1tpXSwgNDA5Nik7CisKKwkJCWNvdW50Kys7CisJCQlpZiAoY291bnQgPT0gMTAwMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3VudCA9PSAxMDAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0ID0gaW9jdGwoZmQsIFBPQ0hfSU9DX1RSQU5TRkVSX1NUT1AsIDApOworCWlmIChyZXQgPT0gLTEpCisJCWVycm9yKDEsIGVycm5vLCAiZXJyb3Igc3RhcnRpbmcgdHJhbnNmZXIiKTsKKworCXJldHVybiAwOworfQorCiBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAogVmlqYXkgS3VtYXIgPHZpamF5a3VtYXJAYnJhdmVnbnUub3JnPiBhbmQgSmF5YSBLdW1hciA8amF5YWt1bWFyLmxrbWxAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5jCmluZGV4IDJlYjhlM2QuLjkwOTUxNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmMKQEAgLTE5NywxMCArMTk3LDkgQEAKIAogCS8qIENvbnRhaW5zIHRoZSBoZWFkZXIgYW5kIGNpcmN1bGFyIGJ1ZmZlciBleHBvcnRlZCB0byB1c2Vyc3BhY2UuICovCiAJc3BpbmxvY2tfdCBncm91cF9vZmZzZXRzX2xvY2s7Ci0Jc3RydWN0IHBvY2hfY2J1Zl9oZWFkZXIgKmhlYWRlcjsKLQlzdHJ1Y3QgcGFnZSAqaGVhZGVyX3BnOwotCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3NpemU7CiAKKwkvKiBMYXN0IGdyb3VwIGNvbnN1bWVkIGJ5IHVzZXIgc3BhY2UuICovCisJdW5zaWduZWQgaW50IGNvbnN1bWVkOwogCS8qIExhc3QgZ3JvdXAgaW5kaWNhdGVkIGFzICdjb21wbGV0ZScgdG8gdXNlciBzcGFjZS4gKi8KIAl1bnNpZ25lZCBpbnQgdHJhbnNmZXI7CiAKQEAgLTI0NSw2ICsyNDQsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiB9OwogCitzdGF0aWMgaW50IHN5bnRoX3J4OworbW9kdWxlX3BhcmFtKHN5bnRoX3J4LCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3ludGhfcngsCisJCSJTeW50aGVzaXplIHJlY2VpdmVkIHZhbHVlcyB1c2luZyBhIGNvdW50ZXIuIERlZmF1bHQ6IE5vIik7CisKK3N0YXRpYyBpbnQgbG9vcGJhY2s7Cittb2R1bGVfcGFyYW0obG9vcGJhY2ssIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhsb29wYmFjaywKKwkJIkVuYWJsZSBoYXJkd2FyZSBsb29wYmFjayBvZiB0cmFzbm1pdHRlZCBkYXRhLiBEZWZhdWx0OiBObyIpOworCiBzdGF0aWMgZGV2X3QgcG9jaF9maXJzdF9kZXY7CiBzdGF0aWMgc3RydWN0IGNsYXNzICpwb2NoX2NsczsKIHN0YXRpYyBERUZJTkVfSURSKHBvY2hfaWRzKTsKQEAgLTMxNywxNCArMzI2LDEyIEBACiAJaW50IGxlbjsKIAl1bnNpZ25lZCBsb25nIG1tYXBfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGdyb3VwX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcgaGVhZGVyX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfZ3JvdXBfcGFnZXM7CiAKIAlncm91cF9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5ncm91cF9zaXplKTsKLQloZWFkZXJfcGFnZXMgPSBucGFnZXMoY2hhbm5lbC0+aGVhZGVyX3NpemUpOwogCXRvdGFsX2dyb3VwX3BhZ2VzID0gZ3JvdXBfcGFnZXMgKiBjaGFubmVsLT5ncm91cF9jb3VudDsKIAotCW1tYXBfc2l6ZSA9IChoZWFkZXJfcGFnZXMgKyB0b3RhbF9ncm91cF9wYWdlcykgKiBQQUdFX1NJWkU7CisJbW1hcF9zaXplID0gdG90YWxfZ3JvdXBfcGFnZXMgKiBQQUdFX1NJWkU7CiAJbGVuID0gc3ByaW50ZihidWYsICIlbHVcbiIsIG1tYXBfc2l6ZSk7CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTM1NywxMCArMzY0LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyBncm91cF9wYWdlczsKLQl1bnNpZ25lZCBsb25nIGhlYWRlcl9wYWdlczsKIAogCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOwotCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+Z3JvdXBfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cDsKQEAgLTM5MCw4ICszOTUsNyBAQAogCQkgKiB0aGlzPwogCQkgKi8KIAkJZ3JvdXAtPmRtYV9hZGRyID0gcGFnZV90b19wZm4oZ3JvdXAtPnBnKSAqIFBBR0VfU0laRTsKLQkJZ3JvdXAtPnVzZXJfb2Zmc2V0ID0KLQkJCShoZWFkZXJfcGFnZXMgKyAoaSAqIGdyb3VwX3BhZ2VzKSkgKiBQQUdFX1NJWkU7CisJCWdyb3VwLT51c2VyX29mZnNldCA9IChpICogZ3JvdXBfcGFnZXMpICogUEFHRV9TSVpFOwogCiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlbGQ6IHVzZXJfb2Zmc2V0OiAweCVseFxuIiwgaSwKIAkJICAgICAgIGdyb3VwLT51c2VyX29mZnNldCk7CkBAIC00NzYsNyArNDgwLDcgQEAKIAkJICBmcGdhICsgYmxvY2tfY291bnRfcmVnKTsKIAlpb3dyaXRlMzIoY2hhbm5lbC0+Z3JvdXBfY291bnQsIGZwZ2EgKyBncm91cF9jb3VudF9yZWcpOwogCS8qIEZJWE1FOiBIYXJkY29kZWQgZ3JvdXBzIHBlciBpbnQuIEdldCBpdCBmcm9tIHN5c2ZzPyAqLwotCWlvd3JpdGUzMigxLCBmcGdhICsgZ3JvdXBzX3Blcl9pbnRfcmVnKTsKKwlpb3dyaXRlMzIoMTYsIGZwZ2EgKyBncm91cHNfcGVyX2ludF9yZWcpOwogCiAJLyogVW5sb2NrIFBDSSBhZGRyZXNzPyBOb3QgZGVmaW5lZCBpbiB0aGUgZGF0YSBzaGVldCwgYnV0IHVzZWQKIAkgKiBpbiB0aGUgcmVmZXJlbmNlIGNvZGUgYnkgUmVkcmFwaWRzLgpAQCAtNTEzLDU2ICs1MTcsNiBAQAogCiB9CiAKLXN0YXRpYyBpbnQgcG9jaF9jaGFubmVsX2FsbG9jX2hlYWRlcihzdHJ1Y3QgY2hhbm5lbF9pbmZvICpjaGFubmVsKQotewotCXN0cnVjdCBwb2NoX2NidWZfaGVhZGVyICpoZWFkZXIgPSBjaGFubmVsLT5oZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyBncm91cF9vZmZzZXRfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHRvdF9ncm91cF9vZmZzZXRzX3NpemU7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gaG9sZCBoZWFkZXIgZXhwb3J0ZWQgdXNlcnNwYWNlICovCi0JZ3JvdXBfb2Zmc2V0X3NpemUgPSBzaXplb2YoaGVhZGVyLT5ncm91cF9vZmZzZXRzWzBdKTsKLQl0b3RfZ3JvdXBfb2Zmc2V0c19zaXplID0gZ3JvdXBfb2Zmc2V0X3NpemUgKiBjaGFubmVsLT5ncm91cF9jb3VudDsKLQljaGFubmVsLT5oZWFkZXJfc2l6ZSA9IHNpemVvZigqaGVhZGVyKSArIHRvdF9ncm91cF9vZmZzZXRzX3NpemU7Ci0JY2hhbm5lbC0+aGVhZGVyX3BnID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCi0JCQkJCSBnZXRfb3JkZXIoY2hhbm5lbC0+aGVhZGVyX3NpemUpKTsKLQlpZiAoIWNoYW5uZWwtPmhlYWRlcl9wZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaGFubmVsLT5oZWFkZXIgPSBwYWdlX2FkZHJlc3MoY2hhbm5lbC0+aGVhZGVyX3BnKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwb2NoX2NoYW5uZWxfZnJlZV9oZWFkZXIoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKLXsKLQl1bnNpZ25lZCBpbnQgb3JkZXI7Ci0KLQlvcmRlciA9IGdldF9vcmRlcihjaGFubmVsLT5oZWFkZXJfc2l6ZSk7Ci0JX19mcmVlX3BhZ2VzKGNoYW5uZWwtPmhlYWRlcl9wZywgb3JkZXIpOwotfQotCi1zdGF0aWMgdm9pZCBwb2NoX2NoYW5uZWxfaW5pdF9oZWFkZXIoc3RydWN0IGNoYW5uZWxfaW5mbyAqY2hhbm5lbCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgcG9jaF9ncm91cF9pbmZvICpncm91cHM7Ci0JczMyICpncm91cF9vZmZzZXRzOwotCi0JY2hhbm5lbC0+aGVhZGVyLT5ncm91cF9zaXplX2J5dGVzID0gY2hhbm5lbC0+Z3JvdXBfc2l6ZTsKLQljaGFubmVsLT5oZWFkZXItPmdyb3VwX2NvdW50ID0gY2hhbm5lbC0+Z3JvdXBfY291bnQ7Ci0KLQlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+Z3JvdXBfb2Zmc2V0c19sb2NrKTsKLQotCWdyb3VwX29mZnNldHMgPSBjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHM7Ci0JZ3JvdXBzID0gY2hhbm5lbC0+Z3JvdXBzOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKLQkJaWYgKGNoYW5uZWwtPmRpciA9PSBDSEFOTkVMX0RJUl9SWCkKLQkJCWdyb3VwX29mZnNldHNbaV0gPSAtMTsKLQkJZWxzZQotCQkJZ3JvdXBfb2Zmc2V0c1tpXSA9IGdyb3Vwc1tpXS51c2VyX29mZnNldDsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIF9fcG9jaF9jaGFubmVsX2NsZWFyX2NvdW50ZXJzKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCiB7CiAJY2hhbm5lbC0+Y291bnRlcnMucGxsX3VubG9jayA9IDA7CkBAIC01ODQsNiArNTM4LDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gb3V0OwogCisJY2hhbm5lbC0+Y29uc3VtZWQgPSAwOwogCWNoYW5uZWwtPnRyYW5zZmVyID0gMDsKIAogCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIGdyb3VwIGluZm9ybWF0aW9uLiAqLwpAQCAtNjA0LDEyICs1NTksNiBAQAogCQlnb3RvIG91dF9mcmVlX2dyb3VwX2luZm87CiAJfQogCi0JcmV0ID0gcG9jaF9jaGFubmVsX2FsbG9jX2hlYWRlcihjaGFubmVsKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3IgYWxsb2NhdGluZyB1c2VyIHNwYWNlIGhlYWRlclxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfZ3JvdXBzOwotCX0KLQogCWNoYW5uZWwtPmZwZ2FfaW9tZW0gPSBwb2NoX2Rldi0+ZnBnYV9pb21lbTsKIAljaGFubmVsLT5icmlkZ2VfaW9tZW0gPSBwb2NoX2Rldi0+YnJpZGdlX2lvbWVtOwogCWNoYW5uZWwtPmlvbWVtX2xvY2sgPSAmcG9jaF9kZXYtPmlvbWVtX2xvY2s7CkBAIC02MTcsMTQgKzU2Niw4IEBACiAKIAlfX3BvY2hfY2hhbm5lbF9jbGVhcl9jb3VudGVycyhjaGFubmVsKTsKIAotCXByaW50ayhLRVJOX1dBUk5JTkcgInBvY2hfY2hhbm5lbF9pbml0X2hlYWRlclxuIik7Ci0KLQlwb2NoX2NoYW5uZWxfaW5pdF9oZWFkZXIoY2hhbm5lbCk7Ci0KIAlyZXR1cm4gMDsKIAotIG91dF9mcmVlX2dyb3VwczoKLQlwb2NoX2NoYW5uZWxfZnJlZV9ncm91cHMoY2hhbm5lbCk7CiAgb3V0X2ZyZWVfZ3JvdXBfaW5mbzoKIAlrZnJlZShjaGFubmVsLT5ncm91cHMpOwogIG91dDoKQEAgLTgyMiwxNCArNzY1LDIxIEBACiAKIAlpZiAoY2hhbm5lbC0+ZGlyID09IENIQU5ORUxfRElSX1RYKSB7CiAJCS8qIEZsdXNoIFRYIEZJRk8gYW5kIG91dHB1dCBkYXRhIGZyb20gY2FyZGJ1cy4gKi8KLQkJaW93cml0ZTMyKEZQR0FfVFhfQ1RMX0ZJRk9fRkxVU0gKLQkJCSAgfCBGUEdBX1RYX0NUTF9PVVRQVVRfQ0FSREJVUywKLQkJCSAgZnBnYSArIEZQR0FfVFhfQ1RMX1JFRyk7CisJCXUzMiBjdGxfdmFsID0gMDsKKworCQljdGxfdmFsIHw9IEZQR0FfVFhfQ1RMX0ZJRk9fRkxVU0g7CisJCWN0bF92YWwgfD0gRlBHQV9UWF9DVExfT1VUUFVUX0NBUkRCVVM7CisJCWlmIChsb29wYmFjaykKKwkJCWN0bF92YWwgfD0gRlBHQV9UWF9DVExfTE9PUEJBQ0s7CisKKwkJaW93cml0ZTMyKGN0bF92YWwsIGZwZ2EgKyBGUEdBX1RYX0NUTF9SRUcpOwogCX0gZWxzZSB7CiAJCS8qIEZsdXNoIFJYIEZJRk8gYW5kIG91dHB1dCBkYXRhIHRvIGNhcmRidXMuICovCi0JCWlvd3JpdGUzMihGUEdBX1JYX0NUTF9DT05UX0NBUAotCQkJICB8IEZQR0FfUlhfQ1RMX0ZJRk9fRkxVU0gsCi0JCQkgIGZwZ2EgKyBGUEdBX1JYX0NUTF9SRUcpOworCQl1MzIgY3RsX3ZhbCA9IEZQR0FfUlhfQ1RMX0NPTlRfQ0FQIHwgRlBHQV9SWF9DVExfRklGT19GTFVTSDsKKwkJaWYgKHN5bnRoX3J4KQorCQkJY3RsX3ZhbCB8PSBGUEdBX1JYX0NUTF9TWU5USF9EQVRBOworCisJCWlvd3JpdGUzMihjdGxfdmFsLCBmcGdhICsgRlBHQV9SWF9DVExfUkVHKTsKIAl9CiAKIAlhdG9taWNfaW5jKCZjaGFubmVsLT5pbml0ZWQpOwpAQCAtODYxLDcgKzgxMSw2IEBACiAJfQogCiAJYXRvbWljX2RlYygmY2hhbm5lbC0+aW5pdGVkKTsKLQlwb2NoX2NoYW5uZWxfZnJlZV9oZWFkZXIoY2hhbm5lbCk7CiAJcG9jaF9jaGFubmVsX2ZyZWVfZ3JvdXBzKGNoYW5uZWwpOwogCWtmcmVlKGNoYW5uZWwtPmdyb3Vwcyk7CiAJYXRvbWljX2luYygmY2hhbm5lbC0+ZnJlZSk7CkBAIC04NzAsNyArODE5LDcgQEAKIH0KIAogLyoKLSAqIE1hcCB0aGUgaGVhZGVyIGFuZCB0aGUgZ3JvdXAgYnVmZmVycywgdG8gdXNlciBzcGFjZS4KKyAqIE1hcCB0aGUgdGhlIGdyb3VwIGJ1ZmZlcnMsIHRvIHVzZXIgc3BhY2UuCiAgKi8KIHN0YXRpYyBpbnQgcG9jaF9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKQEAgLTg4MCw3ICs4MjksNiBAQAogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAogCXVuc2lnbmVkIGxvbmcgZ3JvdXBfcGFnZXM7Ci0JdW5zaWduZWQgbG9uZyBoZWFkZXJfcGFnZXM7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9ncm91cF9wYWdlczsKIAogCWludCBwZ19udW07CkBAIC04OTcsMzAgKzg0NSwxNiBAQAogCX0KIAogCWdyb3VwX3BhZ2VzID0gbnBhZ2VzKGNoYW5uZWwtPmdyb3VwX3NpemUpOwotCWhlYWRlcl9wYWdlcyA9IG5wYWdlcyhjaGFubmVsLT5oZWFkZXJfc2l6ZSk7CiAJdG90YWxfZ3JvdXBfcGFnZXMgPSBncm91cF9wYWdlcyAqIGNoYW5uZWwtPmdyb3VwX2NvdW50OwogCiAJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQlpZiAoc2l6ZSAhPSAoaGVhZGVyX3BhZ2VzICsgdG90YWxfZ3JvdXBfcGFnZXMpICogUEFHRV9TSVpFKSB7CisJaWYgKHNpemUgIT0gdG90YWxfZ3JvdXBfcGFnZXMgKiBQQUdFX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlcXVpcmVkICVsdSBieXRlc1xuIiwgc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKIAotCS8qIEZJWE1FOiBDbGVhbnVwIHJlcXVpcmVkIG9uIGZhaWx1cmU/ICovCi0JcGcgPSBjaGFubmVsLT5oZWFkZXJfcGc7Ci0JZm9yIChwZ19udW0gPSAwOyBwZ19udW0gPCBoZWFkZXJfcGFnZXM7IHBnX251bSsrLCBwZysrKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBGWCAicGFnZV9jb3VudDogJWRcbiIsIHBhZ2VfY291bnQocGcpKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlZDogaGVhZGVyOiAweCVseFxuIiwgcGdfbnVtLCBzdGFydCk7Ci0JCXJldCA9IHZtX2luc2VydF9wYWdlKHZtYSwgc3RhcnQsIHBnKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgInZtX2luc2VydCAxIGZhaWxlZCBhdCAlbHhcbiIsIHN0YXJ0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJc3RhcnQgKz0gUEFHRV9TSVpFOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5ncm91cF9jb3VudDsgaSsrKSB7CiAJCXBnID0gY2hhbm5lbC0+Z3JvdXBzW2ldLnBnOwogCQlmb3IgKHBnX251bSA9IDA7IHBnX251bSA8IGdyb3VwX3BhZ2VzOyBwZ19udW0rKywgcGcrKykgewpAQCAtOTQ3LDIwICs4ODEsMTYgQEAKICAqLwogc3RhdGljIGludCBwb2NoX2NoYW5uZWxfYXZhaWxhYmxlKHN0cnVjdCBjaGFubmVsX2luZm8gKmNoYW5uZWwpCiB7Ci0JaW50IGk7CisJaW50IGF2YWlsYWJsZSA9IDA7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPmdyb3VwX2NvdW50OyBpKyspIHsKLQkJaWYgKGNoYW5uZWwtPmhlYWRlci0+Z3JvdXBfb2Zmc2V0c1tpXSAhPSAtMSkgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9CisJaWYgKGNoYW5uZWwtPmNvbnN1bWVkICE9IGNoYW5uZWwtPnRyYW5zZmVyKQorCQlhdmFpbGFibGUgPSAxOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF2YWlsYWJsZTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBwb2NoX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKnB0KQpAQCAtMTAyNiw2ICs5NTYsNTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOworCWNhc2UgUE9DSF9JT0NfQ09OU1VNRToKKwl7CisJCWludCBhdmFpbGFibGU7CisJCWludCBuZmV0Y2g7CisJCXVuc2lnbmVkIGludCBmcm9tOworCQl1bnNpZ25lZCBpbnQgY291bnQ7CisJCXVuc2lnbmVkIGludCBpLCBqOworCQlzdHJ1Y3QgcG9jaF9jb25zdW1lIGNvbnN1bWU7CisJCXN0cnVjdCBwb2NoX2NvbnN1bWUgKnVjb25zdW1lOworCisJCXVjb25zdW1lID0gYXJncDsKKwkJcmV0ID0gY29weV9mcm9tX3VzZXIoJmNvbnN1bWUsIHVjb25zdW1lLCBzaXplb2YoY29uc3VtZSkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOworCisJCWNoYW5uZWwtPmNvbnN1bWVkICs9IGNvbnN1bWUubmZsdXNoOworCQljaGFubmVsLT5jb25zdW1lZCAlPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKworCQlhdmFpbGFibGUgPSBjaGFubmVsLT50cmFuc2ZlciAtIGNoYW5uZWwtPmNvbnN1bWVkOworCQlpZiAoYXZhaWxhYmxlIDwgMCkKKwkJCWF2YWlsYWJsZSArPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKworCQlmcm9tID0gY2hhbm5lbC0+Y29uc3VtZWQ7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOworCisJCW5mZXRjaCA9IGNvbnN1bWUubmZldGNoOworCQljb3VudCA9IG1pbihhdmFpbGFibGUsIG5mZXRjaCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWogPSAoZnJvbSArIGkpICUgY2hhbm5lbC0+Z3JvdXBfY291bnQ7CisJCQlyZXQgPSBwdXRfdXNlcihjaGFubmVsLT5ncm91cHNbal0udXNlcl9vZmZzZXQsCisJCQkJICAgICAgICZjb25zdW1lLm9mZnNldHNbaV0pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldCA9IHB1dF91c2VyKGNvdW50LCAmdWNvbnN1bWUtPm5mZXRjaCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlicmVhazsKKwl9CiAJY2FzZSBQT0NIX0lPQ19HRVRfQ09VTlRFUlM6CiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJncCwgc2l6ZW9mKHN0cnVjdCBwb2NoX2NvdW50ZXJzKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTEwNzMsNyArMTA0OCw2IEBACiAJbG9uZyBncm91cHNfZG9uZTsKIAl1bnNpZ25lZCBsb25nIGksIGo7CiAJc3RydWN0IHBvY2hfZ3JvdXBfaW5mbyAqZ3JvdXBzOwotCXMzMiAqZ3JvdXBfb2Zmc2V0czsKIAl1MzIgY3Vycl9ncm91cF9yZWc7CiAKIAlpZiAoIWF0b21pY19yZWFkKCZjaGFubmVsLT5pbml0ZWQpKQpAQCAtMTA5MywyMCArMTA2NywyNCBAQAogCWlmIChncm91cHNfZG9uZSA8PSAwKQogCQlncm91cHNfZG9uZSArPSBjaGFubmVsLT5ncm91cF9jb3VudDsKIAotCWdyb3VwX29mZnNldHMgPSBjaGFubmVsLT5oZWFkZXItPmdyb3VwX29mZnNldHM7CiAJZ3JvdXBzID0gY2hhbm5lbC0+Z3JvdXBzOwogCiAJc3Bpbl9sb2NrKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IGdyb3Vwc19kb25lOyBpKyspIHsKIAkJaiA9IChwcmV2X3RyYW5zZmVyICsgaSkgJSBjaGFubmVsLT5ncm91cF9jb3VudDsKLQkJZ3JvdXBfb2Zmc2V0c1tqXSA9IGdyb3Vwc1tqXS51c2VyX29mZnNldDsKKworCQljaGFubmVsLT50cmFuc2ZlciArPSAxOworCQljaGFubmVsLT50cmFuc2ZlciAlPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKworCQlpZiAoY2hhbm5lbC0+dHJhbnNmZXIgPT0gY2hhbm5lbC0+Y29uc3VtZWQpIHsKKwkJCWNoYW5uZWwtPmNvbnN1bWVkICs9IDE7CisJCQljaGFubmVsLT5jb25zdW1lZCAlPSBjaGFubmVsLT5ncm91cF9jb3VudDsKKwkJfQogCX0KIAogCXNwaW5fdW5sb2NrKCZjaGFubmVsLT5ncm91cF9vZmZzZXRzX2xvY2spOwogCi0JY2hhbm5lbC0+dHJhbnNmZXIgPSBjdXJyX3RyYW5zZmVyOwotCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGFubmVsLT53cSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guaCBiL2RyaXZlcnMvc3RhZ2luZy9wb2NoL3BvY2guaAppbmRleCA1MWEyZDE0Li44YjA4Mzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9jaC9wb2NoLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BvY2gvcG9jaC5oCkBAIC03LDExICs3LDggQEAKICAqIGluY2x1ZGUvbGludXggZm9yIGZpbmFsIHZlcnNpb24uCiAgKgogICovCi1zdHJ1Y3QgcG9jaF9jYnVmX2hlYWRlciB7Ci0JX19zMzIgZ3JvdXBfc2l6ZV9ieXRlczsKLQlfX3MzMiBncm91cF9jb3VudDsKLQlfX3MzMiBncm91cF9vZmZzZXRzWzBdOwotfTsKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCBwb2NoX2NvdW50ZXJzIHsKIAlfX3UzMiBmaWZvX2VtcHR5OwpAQCAtMTksNiArMTYsMTIgQEAKIAlfX3UzMiBwbGxfdW5sb2NrOwogfTsKIAorc3RydWN0IHBvY2hfY29uc3VtZSB7CisJX191MzIgX191c2VyICpvZmZzZXRzOworCV9fdTMyIG5mZXRjaDsKKwlfX3UzMiBuZmx1c2g7Cit9OworCiAjZGVmaW5lIFBPQ0hfSU9DX05VTQkJCSc5JwogCiAjZGVmaW5lIFBPQ0hfSU9DX1RSQU5TRkVSX1NUQVJUCQlfSU8oUE9DSF9JT0NfTlVNLCAwKQpAQCAtMjcsMyArMzAsNiBAQAogCQkJCQkgICAgIHN0cnVjdCBwb2NoX2NvdW50ZXJzKQogI2RlZmluZSBQT0NIX0lPQ19TWU5DX0dST1VQX0ZPUl9VU0VSCV9JTyhQT0NIX0lPQ19OVU0sIDMpCiAjZGVmaW5lIFBPQ0hfSU9DX1NZTkNfR1JPVVBfRk9SX0RFVklDRQlfSU8oUE9DSF9JT0NfTlVNLCA0KQorCisjZGVmaW5lIFBPQ0hfSU9DX0NPTlNVTUUJCV9JT1dSKFBPQ0hfSU9DX05VTSwgNSwgXAorCQkJCQkgICAgICBzdHJ1Y3QgcG9jaF9jb25zdW1lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9xdWF0ZWNoX3VzYjIvcXVhdGVjaF91c2IyLmMKaW5kZXggMmFjZWY5NC4uZjc3MjZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL3F1YXRlY2hfdXNiMi5jCkBAIC0xNjcwLDcgKzE2NzAsNyBAQAogCQlkYmcoIiVzKCk6IGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkIiwKIAkJCV9fZnVuY19fLCByZXN1bHQpOwogCX0gZWxzZSB7Ci0JCWRiZygiJXMoKSBzdWNlc3NmdWxseSByZXN1bWl0dGVkIHJlYWQgdXJiIiwgX19mdW5jX18pOworCQlkYmcoIiVzKCkgc3VjY2Vzc2Z1bGx5IHJlc3VibWl0dGVkIHJlYWQgdXJiIiwgX19mdW5jX18pOwogCQlpZiAodHR5X3N0ICYmIFJ4Q291bnQpIHsKIAkJCS8qIGlmIHNvbWUgaW5ib3VuZCBkYXRhIHdhcyBwcm9jZXNzZWQsIHRoZW4KIAkJCSAqIHdlIG5lZWQgdG8gcHVzaCB0aGF0IHRocm91Z2ggdGhlIHR0eSBsYXllcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGUyNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL0tjb25maWcKQEAgLTAsMCArMSwyMSBAQAorY29uZmlnIFJBTVpTV0FQCisJdHJpc3RhdGUgIkNvbXByZXNzZWQgaW4tbWVtb3J5IHN3YXAgZGV2aWNlIChyYW16c3dhcCkiCisJZGVwZW5kcyBvbiBTV0FQCisJc2VsZWN0IExaT19DT01QUkVTUworCXNlbGVjdCBMWk9fREVDT01QUkVTUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIENyZWF0ZXMgdmlydHVhbCBibG9jayBkZXZpY2VzIHdoaWNoIGNhbiBiZSB1c2VkIChvbmx5KSBhcyBhIHN3YXAKKwkgIGRpc2tzLiBQYWdlcyBzd2FwcGVkIHRvIHRoZXNlIGRpc2tzIGFyZSBjb21wcmVzc2VkIGFuZCBzdG9yZWQgaW4KKwkgIG1lbW9yeSBpdHNlbGYuCisKKwkgIFNlZSByYW16c3dhcC50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJICBQcm9qZWN0IGhvbWU6IGh0dHA6Ly9jb21wY2FjaGUuZ29vZ2xlY29kZS5jb20vCisKK2NvbmZpZyBSQU1aU1dBUF9TVEFUUworCWJvb2wgIkVuYWJsZSByYW16c3dhcCBzdGF0cyIKKwlkZXBlbmRzIG9uIFJBTVpTV0FQCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgcmFtenN3YXAuIFRoaXMgYWRkcyBvbmx5IGEgbWluaW1hbAorCSAgb3ZlcmhlYWQuIEluIHVuc3VyZSwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3ZDdkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9NYWtlZmlsZQpAQCAtMCwwICsxLDMgQEAKK3JhbXpzd2FwLW9ianMJOj0JcmFtenN3YXBfZHJ2Lm8geHZtYWxsb2MubworCitvYmotJChDT05GSUdfUkFNWlNXQVApCSs9CXJhbXpzd2FwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9UT0RPCkBAIC0wLDAgKzEsNiBAQAorVE9ETzoKKwktIEFkZCBzdXBwb3J0IGZvciBzd2FwIG5vdGlmaWVycworCS0gUmVtb3ZlIENPTkZJR19BUk0gaGFjaworCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAorTml0aW4gR3VwdGEgPG5ndXB0YUB2ZmxhcmUub3JnPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMTYxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcC50eHQKQEAgLTAsMCArMSw1MSBAQAorcmFtenN3YXA6IENvbXByZXNzZWQgUkFNIGJhc2VkIHN3YXAgZGV2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Byb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbS8KKworKiBJbnRyb2R1Y3Rpb24KKworSXQgY3JlYXRlcyBSQU0gYmFzZWQgYmxvY2sgZGV2aWNlcyB3aGljaCBjYW4gYmUgdXNlZCAob25seSkgYXMgc3dhcCBkaXNrcy4KK1BhZ2VzIHN3YXBwZWQgdG8gdGhlc2UgZGV2aWNlcyBhcmUgY29tcHJlc3NlZCBhbmQgc3RvcmVkIGluIG1lbW9yeSBpdHNlbGYuCitTZWUgcHJvamVjdCBob21lIGZvciB1c2UgY2FzZXMsIHBlcmZvcm1hbmNlIG51bWJlcnMgYW5kIGEgbG90IG1vcmUuCisKK0luZGl2aWR1YWwgcmFtenN3YXAgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBhbmQgaW5pdGlhbGl6ZWQgdXNpbmcgcnpzY29udHJvbAordXNlcnNwYWNlIHV0aWxpdHkgYXMgc2hvd24gaW4gZXhhbXBsZXMgYmVsb3cuIFNlZSByenNjb250cm9sIG1hbiBwYWdlIGZvciBtb3JlCitkZXRhaWxzLgorCisqIFVzYWdlCisKK0ZvbGxvd2luZyBzaG93cyBhIHR5cGljYWwgc2VxdWVuY2Ugb2Ygc3RlcHMgZm9yIHVzaW5nIHJhbXpzd2FwLgorCisxKSBMb2FkIE1vZHVsZXM6CisJbW9kcHJvYmUgcmFtenN3YXAgbnVtX2RldmljZXM9NAorCVRoaXMgY3JlYXRlcyA0ICh1bmluaXRpYWxpemVkKSBkZXZpY2VzOiAvZGV2L3JhbXpzd2FwezAsMSwyLDN9CisJKG51bV9kZXZpY2VzIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gRGVmYXVsdDogMSkKKworMikgSW5pdGlhbGl6ZToKKwlVc2UgcnpzY29udHJvbCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBpbmRpdmlkdWFsCisJcmFtenN3YXAgZGV2aWNlcy4gRXhhbXBsZToKKwlyenNjb250cm9sIC9kZXYvcmFtenN3YXAyIC0taW5pdCAjIHVzZXMgZGVmYXVsdCB2YWx1ZSBvZiBkaXNrc2l6ZV9rYgorCisJKlNlZSByenNjb250cm9sIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzKgorCiszKSBBY3RpdmF0ZToKKwlzd2Fwb24gL2Rldi9yYW16c3dhcDIgIyBvciBhbnkgb3RoZXIgaW5pdGlhbGl6ZWQgcmFtenN3YXAgZGV2aWNlCisKKzQpIFN0YXRzOgorCXJ6c2NvbnRyb2wgL2Rldi9yYW16c3dhcDIgLS1zdGF0cworCis1KSBEZWFjdGl2YXRlOgorCXN3YXBvZmYgL2Rldi9yYW16c3dhcDIKKworNikgUmVzZXQ6CisJcnpzY29udHJvbCAvZGV2L3JhbXpzd2FwMiAtLXJlc2V0CisJKFRoaXMgZnJlZXMgYWxsIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGlzIGRldmljZSkuCisKKworUGxlYXNlIHJlcG9ydCBhbnkgcHJvYmxlbXMgYXQ6CisgLSBNYWlsaW5nIGxpc3Q6IGxpbnV4LW1tLWNjIGF0IGxhcHRvcCBkb3Qgb3JnCisgLSBJc3N1ZSB0cmFja2VyOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY29tcGNhY2hlL2lzc3Vlcy9saXN0CisKK05pdGluIEd1cHRhCituZ3VwdGFAdmZsYXJlLm9yZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5jIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3JhbXpzd2FwX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzlmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmMKQEAgLTAsMCArMSwxNDM1IEBACisvKgorICogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKgorICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCisgKi8KKworI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAicmFtenN3YXAiCisjZGVmaW5lIHByX2ZtdChmbXQpIEtNU0dfQ09NUE9ORU5UICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2x6by5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAicmFtenN3YXBfZHJ2LmgiCisKKy8qIEdsb2JhbHMgKi8KK3N0YXRpYyBpbnQgcmFtenN3YXBfbWFqb3I7CitzdGF0aWMgc3RydWN0IHJhbXpzd2FwICpkZXZpY2VzOworCisvKgorICogUGFnZXMgdGhhdCBjb21wcmVzcyB0byBsYXJnZXIgdGhhbiB0aGlzIHNpemUgYXJlCisgKiBmb3J3YXJkZWQgdG8gYmFja2luZyBzd2FwLCBpZiBwcmVzZW50IG9yIHN0b3JlZAorICogdW5jb21wcmVzc2VkIGluIG1lbW9yeSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3pwYWdlX3NpemU7CisKKy8qIE1vZHVsZSBwYXJhbXMgKGRvY3VtZW50YXRpb24gYXQgZW5kKSAqLworc3RhdGljIHVuc2lnbmVkIGludCBudW1fZGV2aWNlczsKKworc3RhdGljIGludCByenNfdGVzdF9mbGFnKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1MzIgaW5kZXgsCisJCQllbnVtIHJ6c19wYWdlZmxhZ3MgZmxhZykKK3sKKwlyZXR1cm4gcnpzLT50YWJsZVtpbmRleF0uZmxhZ3MgJiBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ6c19zZXRfZmxhZyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgdTMyIGluZGV4LAorCQkJZW51bSByenNfcGFnZWZsYWdzIGZsYWcpCit7CisJcnpzLT50YWJsZVtpbmRleF0uZmxhZ3MgfD0gQklUKGZsYWcpOworfQorCitzdGF0aWMgdm9pZCByenNfY2xlYXJfZmxhZyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgdTMyIGluZGV4LAorCQkJZW51bSByenNfcGFnZWZsYWdzIGZsYWcpCit7CisJcnpzLT50YWJsZVtpbmRleF0uZmxhZ3MgJj0gfkJJVChmbGFnKTsKK30KKworc3RhdGljIGludCBwYWdlX3plcm9fZmlsbGVkKHZvaWQgKnB0cikKK3sKKwl1bnNpZ25lZCBpbnQgcG9zOworCXVuc2lnbmVkIGxvbmcgKnBhZ2U7CisKKwlwYWdlID0gKHVuc2lnbmVkIGxvbmcgKilwdHI7CisKKwlmb3IgKHBvcyA9IDA7IHBvcyAhPSBQQUdFX1NJWkUgLyBzaXplb2YoKnBhZ2UpOyBwb3MrKykgeworCQlpZiAocGFnZVtwb3NdKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBtZW1saW1pdCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGJhY2tpbmcgZGlzayBzaXplLgorICovCitzdGF0aWMgdm9pZCByYW16c3dhcF9zZXRfbWVtbGltaXQoc3RydWN0IHJhbXpzd2FwICpyenMsIHNpemVfdCB0b3RhbHJhbV9ieXRlcykKK3sKKwlpbnQgbWVtbGltaXRfdmFsaWQgPSAxOworCisJaWYgKCFyenMtPm1lbWxpbWl0KSB7CisJCXByX2luZm8oIk1lbW9yeSBsaW1pdCBub3Qgc2V0LlxuIik7CisJCW1lbWxpbWl0X3ZhbGlkID0gMDsKKwl9CisKKwlpZiAocnpzLT5tZW1saW1pdCA+IHJ6cy0+ZGlza3NpemUpIHsKKwkJcHJfaW5mbygiTWVtb3J5IGxpbWl0IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gIgorCQkJImRpc2tzaXplOiBsaW1pdD0lenUsIGRpc2tzaXplPSV6dVxuIiwKKwkJCXJ6cy0+bWVtbGltaXQsIHJ6cy0+ZGlza3NpemUpOworCQltZW1saW1pdF92YWxpZCA9IDA7CisJfQorCisJaWYgKCFtZW1saW1pdF92YWxpZCkgeworCQlzaXplX3QgbWVtcGFydCwgZGlza3NpemU7CisJCXByX2luZm8oIlVzaW5nIGRlZmF1bHQ6IHNtYWxsZXIgb2YgKCV1JSUgb2YgUkFNKSBhbmQgIgorCQkJIihiYWNraW5nIGRpc2sgc2l6ZSkuXG4iLAorCQkJZGVmYXVsdF9tZW1saW1pdF9wZXJjX3JhbSk7CisJCW1lbXBhcnQgPSBkZWZhdWx0X21lbWxpbWl0X3BlcmNfcmFtICogKHRvdGFscmFtX2J5dGVzIC8gMTAwKTsKKwkJZGlza3NpemUgPSByenMtPmRpc2tzaXplOworCQlyenMtPm1lbWxpbWl0ID0gbWVtcGFydCA+IGRpc2tzaXplID8gZGlza3NpemUgOiBtZW1wYXJ0OworCX0KKworCWlmIChyenMtPm1lbWxpbWl0ID4gdG90YWxyYW1fYnl0ZXMgLyAyKSB7CisJCXByX2luZm8oCisJCSJJdHMgbm90IGFkdmlzYWJsZSBzZXR0aW5nIGxpbWl0IG1vcmUgdGhhbiBoYWxmIG9mICIKKwkJInNpemUgb2YgbWVtb3J5IHNpbmNlIHdlIGV4cGVjdCBhIDI6MSBjb21wcmVzc2lvbiByYXRpby4gIgorCQkiTGltaXQgcmVwcmVzZW50cyBhbW91bnQgb2YgKmNvbXByZXNzZWQqIGRhdGEgd2UgY2FuIGtlZXAgIgorCQkiaW4gbWVtb3J5IVxuIgorCQkiXHRNZW1vcnkgU2l6ZTogJXp1IGtCXG4iCisJCSJcdExpbWl0IHlvdSBzZWxlY3RlZDogJXp1IGtCXG4iCisJCSJDb250aW51aW5nIGFueXdheSAuLi5cbiIsCisJCXRvdGFscmFtX2J5dGVzID4+IDEwLCByenMtPm1lbWxpbWl0ID4+IDEwCisJCSk7CisJfQorCisJcnpzLT5tZW1saW1pdCAmPSBQQUdFX01BU0s7CisJQlVHX09OKCFyenMtPm1lbWxpbWl0KTsKK30KKworc3RhdGljIHZvaWQgcmFtenN3YXBfc2V0X2Rpc2tzaXplKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzaXplX3QgdG90YWxyYW1fYnl0ZXMpCit7CisJaWYgKCFyenMtPmRpc2tzaXplKSB7CisJCXByX2luZm8oCisJCSJkaXNrIHNpemUgbm90IHByb3ZpZGVkLiBZb3UgY2FuIHVzZSBkaXNrc2l6ZV9rYiBtb2R1bGUgIgorCQkicGFyYW0gdG8gc3BlY2lmeSBzaXplLlxuVXNpbmcgZGVmYXVsdDogKCV1JSUgb2YgUkFNKS5cbiIsCisJCWRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0KKwkJKTsKKwkJcnpzLT5kaXNrc2l6ZSA9IGRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0gKgorCQkJCQkodG90YWxyYW1fYnl0ZXMgLyAxMDApOworCX0KKworCWlmIChyenMtPmRpc2tzaXplID4gMiAqICh0b3RhbHJhbV9ieXRlcykpIHsKKwkJcHJfaW5mbygKKwkJIlRoZXJlIGlzIGxpdHRsZSBwb2ludCBjcmVhdGluZyBhIHJhbXpzd2FwIG9mIGdyZWF0ZXIgdGhhbiAiCisJCSJ0d2ljZSB0aGUgc2l6ZSBvZiBtZW1vcnkgc2luY2Ugd2UgZXhwZWN0IGEgMjoxIGNvbXByZXNzaW9uICIKKwkJInJhdGlvLiBOb3RlIHRoYXQgcmFtenN3YXAgdXNlcyBhYm91dCAwLjElJSBvZiB0aGUgc2l6ZSBvZiAiCisJCSJ0aGUgc3dhcCBkZXZpY2Ugd2hlbiBub3QgaW4gdXNlIHNvIGEgaHVnZSByYW16c3dhcCBpcyAiCisJCSJ3YXN0ZWZ1bC5cbiIKKwkJIlx0TWVtb3J5IFNpemU6ICV6dSBrQlxuIgorCQkiXHRTaXplIHlvdSBzZWxlY3RlZDogJXp1IGtCXG4iCisJCSJDb250aW51aW5nIGFueXdheSAuLi5cbiIsCisJCXRvdGFscmFtX2J5dGVzID4+IDEwLCByenMtPmRpc2tzaXplCisJCSk7CisJfQorCisJcnpzLT5kaXNrc2l6ZSAmPSBQQUdFX01BU0s7Cit9CisKKy8qCisgKiBTd2FwIGhlYWRlciAoMXN0IHBhZ2Ugb2Ygc3dhcCBkZXZpY2UpIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgKiB0byBpbmRlbnRpZnkgaXQgYXMgYSBzd2FwIHBhcnRpdGlvbi4gUHJlcGFyZSBzdWNoIGEgaGVhZGVyCisgKiBmb3IgcmFtenN3YXAgZGV2aWNlIChyYW16c3dhcDApIHNvIHRoYXQgc3dhcG9uIGNhbiBpZGVudGlmeQorICogaXQgYXMgc3dhcCBwYXJ0aXRpb24uIEluIGNhc2UgYmFja2luZyBzd2FwIGRldmljZSBpcyBwcm92aWRlZCwKKyAqIGNvcHkgaXRzIHN3YXAgaGVhZGVyLgorICovCitzdGF0aWMgaW50IHNldHVwX3N3YXBfaGVhZGVyKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1bmlvbiBzd2FwX2hlYWRlciAqcykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwl1bmlvbiBzd2FwX2hlYWRlciAqYmFja2luZ19zd2FwX2hlYWRlcjsKKworCS8qCisJICogVGhlcmUgaXMgbm8gYmFja2luZyBzd2FwIGRldmljZS4gQ3JlYXRlIGEgc3dhcCBoZWFkZXIKKwkgKiB0aGF0IGlzIGFjY2VwdGFibGUgYnkgc3dhcG9uLgorCSAqLworCWlmICghcnpzLT5iYWNraW5nX3N3YXApIHsKKwkJcy0+aW5mby52ZXJzaW9uID0gMTsKKwkJcy0+aW5mby5sYXN0X3BhZ2UgPSAocnpzLT5kaXNrc2l6ZSA+PiBQQUdFX1NISUZUKSAtIDE7CisJCXMtPmluZm8ubnJfYmFkcGFnZXMgPSAwOworCQltZW1jcHkocy0+bWFnaWMubWFnaWMsICJTV0FQU1BBQ0UyIiwgMTApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgYSBiYWNraW5nIHN3YXAgZGV2aWNlLiBDb3B5IGl0cyBzd2FwIGhlYWRlcgorCSAqIHRvIHJhbXpzd2FwIGRldmljZSBoZWFkZXIuIElmIHRoaXMgaGVhZGVyIGNvbnRhaW5zCisJICogaW52YWxpZCBpbmZvcm1hdGlvbiAoYmFja2luZyBkZXZpY2Ugbm90IGEgc3dhcAorCSAqIHBhcnRpdGlvbiwgZXRjLiksIHN3YXBvbiB3aWxsIGZhaWwgZm9yIHJhbXpzd2FwCisJICogd2hpY2ggaXMgY29ycmVjdCBiZWhhdmlvciAtIHdlIGRvbid0IHdhbnQgdG8gc3dhcAorCSAqIG92ZXIgZmlsZXN5c3RlbSBwYXJ0aXRpb24hCisJICovCisKKwkvKiBSZWFkIHRoZSBiYWNraW5nIHN3YXAgaGVhZGVyIChjb2RlIGZyb20gc3lzX3N3YXBvbikgKi8KKwltYXBwaW5nID0gcnpzLT5zd2FwX2ZpbGUtPmZfbWFwcGluZzsKKwlpZiAoIW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgMCwgcnpzLT5zd2FwX2ZpbGUpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJYmFja2luZ19zd2FwX2hlYWRlciA9IGttYXAocGFnZSk7CisJbWVtY3B5KHMsIGJhY2tpbmdfc3dhcF9oZWFkZXIsIHNpemVvZigqcykpOworCWlmIChzLT5pbmZvLm5yX2JhZHBhZ2VzKSB7CisJCXByX2luZm8oIkNhbm5vdCB1c2UgYmFja2luZyBzd2FwIHdpdGggYmFkIHBhZ2VzICgldSlcbiIsCisJCQlzLT5pbmZvLm5yX2JhZHBhZ2VzKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiByYW16c3dhcCBkaXNrc2l6ZSBlcXVhbHMgbnVtYmVyIG9mIHVzYWJsZSBwYWdlcyBpbiBiYWNraW5nCisJICogc3dhcC4gU2V0IGxhc3RfcGFnZSBpbiBzd2FwIGhlYWRlciB0byBtYXRjaCB0aGlzIGRpc2tzaXplCisJICogKCdsYXN0X3BhZ2UnIG1lYW5zIDAtYmFzZWQgaW5kZXggb2YgbGFzdCB1c2FibGUgc3dhcCBwYWdlKS4KKwkgKi8KKwlzLT5pbmZvLmxhc3RfcGFnZSA9IChyenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQpIC0gMTsKKwlrdW5tYXAocGFnZSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByYW16c3dhcF9mbHVzaF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKyNpZmRlZiBDT05GSUdfQVJNCisJaW50IGZsYWcgPSAwOworCS8qCisJICogVWdseSBoYWNrIHRvIGdldCBmbHVzaF9kY2FjaGVfcGFnZSgpIHdvcmsgb24gQVJNLgorCSAqIHBhZ2VfbWFwcGluZyhwYWdlKSA9PSBOVUxMIGFmdGVyIGNsZWFyaW5nIHRoaXMgc3dhcCBjYWNoZSBmbGFnLgorCSAqIFdpdGhvdXQgY2xlYXJpbmcgdGhpcyBmbGFnLCBmbHVzaF9kY2FjaGVfcGFnZSgpIHdpbGwgc2ltcGx5IHNldAorCSAqICJQR19kY2FjaGVfZGlydHkiIGJpdCBhbmQgcmV0dXJuLgorCSAqLworCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CisJCWZsYWcgPSAxOworCQlDbGVhclBhZ2VTd2FwQ2FjaGUocGFnZSk7CisJfQorI2VuZGlmCisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisjaWZkZWYgQ09ORklHX0FSTQorCWlmIChmbGFnKQorCQlTZXRQYWdlU3dhcENhY2hlKHBhZ2UpOworI2VuZGlmCit9CisKK3ZvaWQgcmFtenN3YXBfaW9jdGxfZ2V0X3N0YXRzKHN0cnVjdCByYW16c3dhcCAqcnpzLAorCQkJc3RydWN0IHJhbXpzd2FwX2lvY3RsX3N0YXRzICpzKQoreworCXN0cm5jcHkocy0+YmFja2luZ19zd2FwX25hbWUsIHJ6cy0+YmFja2luZ19zd2FwX25hbWUsCisJCU1BWF9TV0FQX05BTUVfTEVOIC0gMSk7CisJcy0+YmFja2luZ19zd2FwX25hbWVbTUFYX1NXQVBfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlzLT5kaXNrc2l6ZSA9IHJ6cy0+ZGlza3NpemU7CisJcy0+bWVtbGltaXQgPSByenMtPm1lbWxpbWl0OworCisjaWYgZGVmaW5lZChDT05GSUdfUkFNWlNXQVBfU1RBVFMpCisJeworCXN0cnVjdCByYW16c3dhcF9zdGF0cyAqcnMgPSAmcnpzLT5zdGF0czsKKwlzaXplX3Qgc3VjY193cml0ZXMsIG1lbV91c2VkOworCXVuc2lnbmVkIGludCBnb29kX2NvbXByZXNzX3BlcmMgPSAwLCBub19jb21wcmVzc19wZXJjID0gMDsKKworCW1lbV91c2VkID0geHZfZ2V0X3RvdGFsX3NpemVfYnl0ZXMocnpzLT5tZW1fcG9vbCkKKwkJCSsgKHJzLT5wYWdlc19leHBhbmQgPDwgUEFHRV9TSElGVCk7CisJc3VjY193cml0ZXMgPSBycy0+bnVtX3dyaXRlcyAtIHJzLT5mYWlsZWRfd3JpdGVzOworCisJaWYgKHN1Y2Nfd3JpdGVzICYmIHJzLT5wYWdlc19zdG9yZWQpIHsKKwkJZ29vZF9jb21wcmVzc19wZXJjID0gcnMtPmdvb2RfY29tcHJlc3MgKiAxMDAKKwkJCQkJLyBycy0+cGFnZXNfc3RvcmVkOworCQlub19jb21wcmVzc19wZXJjID0gcnMtPnBhZ2VzX2V4cGFuZCAqIDEwMAorCQkJCQkvIHJzLT5wYWdlc19zdG9yZWQ7CisJfQorCisJcy0+bnVtX3JlYWRzID0gcnMtPm51bV9yZWFkczsKKwlzLT5udW1fd3JpdGVzID0gcnMtPm51bV93cml0ZXM7CisJcy0+ZmFpbGVkX3JlYWRzID0gcnMtPmZhaWxlZF9yZWFkczsKKwlzLT5mYWlsZWRfd3JpdGVzID0gcnMtPmZhaWxlZF93cml0ZXM7CisJcy0+aW52YWxpZF9pbyA9IHJzLT5pbnZhbGlkX2lvOworCXMtPnBhZ2VzX3plcm8gPSBycy0+cGFnZXNfemVybzsKKworCXMtPmdvb2RfY29tcHJlc3NfcGN0ID0gZ29vZF9jb21wcmVzc19wZXJjOworCXMtPnBhZ2VzX2V4cGFuZF9wY3QgPSBub19jb21wcmVzc19wZXJjOworCisJcy0+cGFnZXNfc3RvcmVkID0gcnMtPnBhZ2VzX3N0b3JlZDsKKwlzLT5wYWdlc191c2VkID0gbWVtX3VzZWQgPj4gUEFHRV9TSElGVDsKKwlzLT5vcmlnX2RhdGFfc2l6ZSA9IHJzLT5wYWdlc19zdG9yZWQgPDwgUEFHRV9TSElGVDsKKwlzLT5jb21wcl9kYXRhX3NpemUgPSBycy0+Y29tcHJfc2l6ZTsKKwlzLT5tZW1fdXNlZF90b3RhbCA9IG1lbV91c2VkOworCisJcy0+YmRldl9udW1fcmVhZHMgPSBycy0+YmRldl9udW1fcmVhZHM7CisJcy0+YmRldl9udW1fd3JpdGVzID0gcnMtPmJkZXZfbnVtX3dyaXRlczsKKwl9CisjZW5kaWYgLyogQ09ORklHX1JBTVpTV0FQX1NUQVRTICovCit9CisKK3N0YXRpYyBpbnQgYWRkX2JhY2tpbmdfc3dhcF9leHRlbnQoc3RydWN0IHJhbXpzd2FwICpyenMsCisJCQkJcGdvZmZfdCBwaHlfcGFnZW51bSwKKwkJCQlwZ29mZl90IG51bV9wYWdlcykKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHBhZ2UgKmN1cnJfcGFnZSwgKm5ld19wYWdlOworCXVuc2lnbmVkIGludCBleHRlbnRzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8KKwkJCQlzaXplb2Yoc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50KTsKKworCWlkeCA9IHJ6cy0+bnVtX2V4dGVudHMgJSBleHRlbnRzX3Blcl9wYWdlOworCWlmICghaWR4KSB7CisJCW5ld19wYWdlID0gYWxsb2NfcGFnZShfX0dGUF9aRVJPKTsKKwkJaWYgKCFuZXdfcGFnZSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChyenMtPm51bV9leHRlbnRzKSB7CisJCQljdXJyX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UocnpzLT5jdXJyX2V4dGVudCk7CisJCQloZWFkID0gJmN1cnJfcGFnZS0+bHJ1OworCQl9IGVsc2UgeworCQkJaGVhZCA9ICZyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdDsKKwkJfQorCisJCWxpc3RfYWRkKCZuZXdfcGFnZS0+bHJ1LCBoZWFkKTsKKwkJcnpzLT5jdXJyX2V4dGVudCA9IHBhZ2VfYWRkcmVzcyhuZXdfcGFnZSk7CisJfQorCisJcnpzLT5jdXJyX2V4dGVudC0+cGh5X3BhZ2VudW0gPSBwaHlfcGFnZW51bTsKKwlyenMtPmN1cnJfZXh0ZW50LT5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisKKwlwcl9kZWJ1ZygiYWRkX2V4dGVudDogaWR4PSV1LCBwaHlfcGdudW09JWx1LCBudW1fcGdzPSVsdSwgIgorCQkicGdfbGFzdD0lbHUsIGN1cnJfZXh0PSVwXG4iLCBpZHgsIHBoeV9wYWdlbnVtLCBudW1fcGFnZXMsCisJCXBoeV9wYWdlbnVtICsgbnVtX3BhZ2VzIC0gMSwgcnpzLT5jdXJyX2V4dGVudCk7CisKKwlpZiAoaWR4ICE9IGV4dGVudHNfcGVyX3BhZ2UgLSAxKQorCQlyenMtPmN1cnJfZXh0ZW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXR1cF9iYWNraW5nX3N3YXBfZXh0ZW50cyhzdHJ1Y3QgcmFtenN3YXAgKnJ6cywKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nICpudW1fcGFnZXMpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgYmxrYml0czsKKwl1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2U7CisJcGdvZmZfdCBjb250aWdfcGFnZXMgPSAwLCB0b3RhbF9wYWdlcyA9IDA7CisJcGdvZmZfdCBwYWdlbnVtID0gMCwgcHJldl9wYWdlbnVtID0gMDsKKwlzZWN0b3JfdCBwcm9iZV9ibG9jayA9IDA7CisJc2VjdG9yX3QgbGFzdF9ibG9jazsKKworCWJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfU0laRSA+PiBibGtiaXRzOworCisJbGFzdF9ibG9jayA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBibGtiaXRzOworCXdoaWxlIChwcm9iZV9ibG9jayArIGJsb2Nrc19wZXJfcGFnZSA8PSBsYXN0X2Jsb2NrKSB7CisJCXVuc2lnbmVkIGJsb2NrX2luX3BhZ2U7CisJCXNlY3Rvcl90IGZpcnN0X2Jsb2NrOworCisJCWZpcnN0X2Jsb2NrID0gYm1hcChpbm9kZSwgcHJvYmVfYmxvY2spOworCQlpZiAoZmlyc3RfYmxvY2sgPT0gMCkKKwkJCWdvdG8gYmFkX2JtYXA7CisKKwkJLyogSXQgbXVzdCBiZSBQQUdFX1NJWkUgYWxpZ25lZCBvbi1kaXNrICovCisJCWlmIChmaXJzdF9ibG9jayAmIChibG9ja3NfcGVyX3BhZ2UgLSAxKSkgeworCQkJcHJvYmVfYmxvY2srKzsKKwkJCWdvdG8gcHJvYmVfbmV4dDsKKwkJfQorCisJCS8qIEFsbCBibG9ja3Mgd2l0aGluIHRoaXMgcGFnZSBtdXN0IGJlIGNvbnRpZ3VvdXMgb24gZGlzayAqLworCQlmb3IgKGJsb2NrX2luX3BhZ2UgPSAxOyBibG9ja19pbl9wYWdlIDwgYmxvY2tzX3Blcl9wYWdlOworCQkJCQlibG9ja19pbl9wYWdlKyspIHsKKwkJCXNlY3Rvcl90IGJsb2NrOworCisJCQlibG9jayA9IGJtYXAoaW5vZGUsIHByb2JlX2Jsb2NrICsgYmxvY2tfaW5fcGFnZSk7CisJCQlpZiAoYmxvY2sgPT0gMCkKKwkJCQlnb3RvIGJhZF9ibWFwOworCQkJaWYgKGJsb2NrICE9IGZpcnN0X2Jsb2NrICsgYmxvY2tfaW5fcGFnZSkgeworCQkJCS8qIERpc2NvbnRpZ3VpdHkgKi8KKwkJCQlwcm9iZV9ibG9jaysrOworCQkJCWdvdG8gcHJvYmVfbmV4dDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFdlIGZvdW5kIGEgUEFHRV9TSVpFIGxlbmd0aCwgUEFHRV9TSVpFIGFsaWduZWQKKwkJICogcnVuIG9mIGJsb2Nrcy4KKwkJICovCisJCXBhZ2VudW0gPSBmaXJzdF9ibG9jayA+PiAoUEFHRV9TSElGVCAtIGJsa2JpdHMpOworCisJCWlmICh0b3RhbF9wYWdlcyAmJiAocGFnZW51bSAhPSBwcmV2X3BhZ2VudW0gKyAxKSkgeworCQkJcmV0ID0gYWRkX2JhY2tpbmdfc3dhcF9leHRlbnQocnpzLCBwcmV2X3BhZ2VudW0gLQorCQkJCQkoY29udGlnX3BhZ2VzIC0gMSksIGNvbnRpZ19wYWdlcyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCXJ6cy0+bnVtX2V4dGVudHMrKzsKKwkJCWNvbnRpZ19wYWdlcyA9IDA7CisJCX0KKwkJdG90YWxfcGFnZXMrKzsKKwkJY29udGlnX3BhZ2VzKys7CisJCXByZXZfcGFnZW51bSA9IHBhZ2VudW07CisJCXByb2JlX2Jsb2NrICs9IGJsb2Nrc19wZXJfcGFnZTsKKworcHJvYmVfbmV4dDoKKwkJY29udGludWU7CisJfQorCisJaWYgKGNvbnRpZ19wYWdlcykgeworCQlwcl9kZWJ1ZygiYWRkaW5nIGxhc3QgZXh0ZW50OiBwYWdlbnVtPSVsdSwgIgorCQkJImNvbnRpZ19wYWdlcz0lbHVcbiIsIHBhZ2VudW0sIGNvbnRpZ19wYWdlcyk7CisJCXJldCA9IGFkZF9iYWNraW5nX3N3YXBfZXh0ZW50KHJ6cywKKwkJCXByZXZfcGFnZW51bSAtIChjb250aWdfcGFnZXMgLSAxKSwgY29udGlnX3BhZ2VzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJcnpzLT5udW1fZXh0ZW50cysrOworCX0KKwlpZiAoIXJ6cy0+bnVtX2V4dGVudHMpIHsKKwkJcHJfZXJyKCJObyBzd2FwIGV4dGVudHMgZm91bmQhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJldCkgeworCQkqbnVtX3BhZ2VzID0gdG90YWxfcGFnZXM7CisJCXByX2luZm8oIkZvdW5kICVsdSBleHRlbnRzIGNvbnRhaW5pbmcgJWx1a1xuIiwKKwkJCXJ6cy0+bnVtX2V4dGVudHMsICpudW1fcGFnZXMgPDwgKFBBR0VfU0hJRlQgLSAxMCkpOworCX0KKwlnb3RvIG91dDsKKworYmFkX2JtYXA6CisJcHJfZXJyKCJCYWNraW5nIHN3YXBmaWxlIGhhcyBob2xlc1xuIik7CisJcmV0ID0gLUVJTlZBTDsKK291dDoKKwl3aGlsZSAocmV0ICYmICFsaXN0X2VtcHR5KCZyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdCkpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QubmV4dDsKKwkJcGFnZSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYXBfYmFja2luZ19zd2FwX2V4dGVudHMoc3RydWN0IHJhbXpzd2FwICpyenMpCit7CisJc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50ICpzZTsKKwlzdHJ1Y3QgcGFnZSAqdGFibGVfcGFnZSwgKnNlX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsIG51bV90YWJsZV9wYWdlcywgZW50cnk7CisJdW5zaWduZWQgbG9uZyBzZV9pZHgsIHNwYW47CisJdW5zaWduZWQgZW50cmllc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZigqcnpzLT50YWJsZSk7CisJdW5zaWduZWQgZXh0ZW50c19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZigqc2UpOworCisJLyogVHJ1ZSBmb3IgYmxvY2sgZGV2aWNlICovCisJaWYgKCFyenMtPm51bV9leHRlbnRzKQorCQlyZXR1cm47CisKKwlzZV9wYWdlID0gbGlzdF9lbnRyeShyenMtPmJhY2tpbmdfc3dhcF9leHRlbnRfbGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgcGFnZSwgbHJ1KTsKKwlzZSA9IHBhZ2VfYWRkcmVzcyhzZV9wYWdlKTsKKwlzcGFuID0gc2UtPm51bV9wYWdlczsKKwludW1fcGFnZXMgPSByenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7CisJbnVtX3RhYmxlX3BhZ2VzID0gRElWX1JPVU5EX1VQKG51bV9wYWdlcyAqIHNpemVvZigqcnpzLT50YWJsZSksCisJCQkJCQkJUEFHRV9TSVpFKTsKKworCWVudHJ5ID0gMDsKKwlzZV9pZHggPSAwOworCXdoaWxlIChudW1fdGFibGVfcGFnZXMtLSkgeworCQl0YWJsZV9wYWdlID0gdm1hbGxvY190b19wYWdlKCZyenMtPnRhYmxlW2VudHJ5XSk7CisJCXdoaWxlIChzcGFuIDw9IGVudHJ5KSB7CisJCQlzZV9pZHgrKzsKKwkJCWlmIChzZV9pZHggPT0gcnpzLT5udW1fZXh0ZW50cykKKwkJCQlCVUcoKTsKKworCQkJaWYgKCEoc2VfaWR4ICUgZXh0ZW50c19wZXJfcGFnZSkpIHsKKwkJCQlzZV9wYWdlID0gbGlzdF9lbnRyeShzZV9wYWdlLT5scnUubmV4dCwKKwkJCQkJCXN0cnVjdCBwYWdlLCBscnUpOworCQkJCXNlID0gcGFnZV9hZGRyZXNzKHNlX3BhZ2UpOworCQkJfSBlbHNlCisJCQkJc2UrKzsKKworCQkJc3BhbiArPSBzZS0+bnVtX3BhZ2VzOworCQl9CisJCXRhYmxlX3BhZ2UtPm1hcHBpbmcgPSAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKilzZTsKKwkJdGFibGVfcGFnZS0+cHJpdmF0ZSA9IHNlLT5udW1fcGFnZXMgLSAoc3BhbiAtIGVudHJ5KTsKKwkJcHJfZGVidWcoIm1hcF90YWJsZTogZW50cnk9JWx1LCBzcGFuPSVsdSwgbWFwPSVwLCBwcml2PSVsdVxuIiwKKwkJCWVudHJ5LCBzcGFuLCB0YWJsZV9wYWdlLT5tYXBwaW5nLCB0YWJsZV9wYWdlLT5wcml2YXRlKTsKKwkJZW50cnkgKz0gZW50cmllc19wZXJfcGFnZTsKKwl9Cit9CisKKy8qCisgKiBDaGVjayBpZiB2YWx1ZSBvZiBiYWNraW5nX3N3YXAgbW9kdWxlIHBhcmFtIGlzIHNhbmUuCisgKiBDbGFpbSB0aGlzIGRldmljZSBhbmQgc2V0IHJhbXpzd2FwIHNpemUgZXF1YWwgdG8KKyAqIHNpemUgb2YgdGhpcyBibG9jayBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfYmFja2luZ19zd2FwKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWludCByZXQgPSAwOworCXNpemVfdCBkaXNrc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG51bV9wYWdlcyA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBOVUxMOworCisJaWYgKCFyenMtPmJhY2tpbmdfc3dhcF9uYW1lWzBdKSB7CisJCXByX2RlYnVnKCJiYWNraW5nX3N3YXAgcGFyYW0gbm90IGdpdmVuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJfaW5mbygiVXNpbmcgYmFja2luZyBzd2FwIGRldmljZTogJXNcbiIsIHJ6cy0+YmFja2luZ19zd2FwX25hbWUpOworCisJc3dhcF9maWxlID0gZmlscF9vcGVuKHJ6cy0+YmFja2luZ19zd2FwX25hbWUsCisJCQkJT19SRFdSIHwgT19MQVJHRUZJTEUsIDApOworCWlmIChJU19FUlIoc3dhcF9maWxlKSkgeworCQlwcl9lcnIoIkVycm9yIG9wZW5pbmcgYmFja2luZyBkZXZpY2U6ICVzXG4iLAorCQkJcnpzLT5iYWNraW5nX3N3YXBfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCW1hcHBpbmcgPSBzd2FwX2ZpbGUtPmZfbWFwcGluZzsKKwlpbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisKKwlpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgeworCQliZGV2ID0gSV9CREVWKGlub2RlKTsKKwkJcmV0ID0gYmRfY2xhaW0oYmRldiwgc2V0dXBfYmFja2luZ19zd2FwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJkZXYgPSBOVUxMOworCQkJZ290byBiYWRfcGFyYW07CisJCX0KKwkJZGlza3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWJkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OworCQlpZiAoSVNfU1dBUEZJTEUoaW5vZGUpKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGJhZF9wYXJhbTsKKwkJfQorCQlyZXQgPSBzZXR1cF9iYWNraW5nX3N3YXBfZXh0ZW50cyhyenMsIGlub2RlLCAmbnVtX3BhZ2VzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGJhZF9wYXJhbTsKKwkJZGlza3NpemUgPSBudW1fcGFnZXMgPDwgUEFHRV9TSElGVDsKKwl9IGVsc2UgeworCQlnb3RvIGJhZF9wYXJhbTsKKwl9CisKKwlyenMtPnN3YXBfZmlsZSA9IHN3YXBfZmlsZTsKKwlyenMtPmJhY2tpbmdfc3dhcCA9IGJkZXY7CisJcnpzLT5kaXNrc2l6ZSA9IGRpc2tzaXplOworCUJVR19PTighcnpzLT5kaXNrc2l6ZSk7CisKKwlyZXR1cm4gMDsKKworYmFkX3BhcmFtOgorCWlmIChiZGV2KQorCQliZF9yZWxlYXNlKGJkZXYpOworCWZpbHBfY2xvc2Uoc3dhcF9maWxlLCBOVUxMKTsKKworb3V0OgorCXJ6cy0+YmFja2luZ19zd2FwID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTWFwIGxvZ2ljYWwgcGFnZSBudW1iZXIgJ3BhZ2VudW0nIHRvIHBoeXNpY2FsIHBhZ2UgbnVtYmVyCisgKiBvbiBiYWNraW5nIHN3YXAgZGV2aWNlLiBGb3IgYmxvY2sgZGV2aWNlLCB0aGlzIGlzIGEgbm9wLgorICovCit1MzIgbWFwX2JhY2tpbmdfc3dhcF9wYWdlKHN0cnVjdCByYW16c3dhcCAqcnpzLCB1MzIgcGFnZW51bSkKK3sKKwl1MzIgc2tpcF9wYWdlcywgZW50cmllc19wZXJfcGFnZTsKKwlzaXplX3QgZGVsdGEsIHNlX29mZnNldCwgc2tpcHBlZDsKKwlzdHJ1Y3QgcGFnZSAqdGFibGVfcGFnZSwgKnNlX3BhZ2U7CisJc3RydWN0IHJhbXpzd2FwX2JhY2tpbmdfZXh0ZW50ICpzZTsKKworCWlmICghcnpzLT5udW1fZXh0ZW50cykKKwkJcmV0dXJuIHBhZ2VudW07CisKKwllbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpyenMtPnRhYmxlKTsKKworCXRhYmxlX3BhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoJnJ6cy0+dGFibGVbcGFnZW51bV0pOworCXNlID0gKHN0cnVjdCByYW16c3dhcF9iYWNraW5nX2V4dGVudCAqKXRhYmxlX3BhZ2UtPm1hcHBpbmc7CisJc2VfcGFnZSA9IHZpcnRfdG9fcGFnZShzZSk7CisKKwlza2lwX3BhZ2VzID0gcGFnZW51bSAtIChwYWdlbnVtIC8gZW50cmllc19wZXJfcGFnZSAqIGVudHJpZXNfcGVyX3BhZ2UpOworCXNlX29mZnNldCA9IHRhYmxlX3BhZ2UtPnByaXZhdGUgKyBza2lwX3BhZ2VzOworCisJaWYgKHNlX29mZnNldCA8IHNlLT5udW1fcGFnZXMpCisJCXJldHVybiBzZS0+cGh5X3BhZ2VudW0gKyBzZV9vZmZzZXQ7CisKKwlza2lwcGVkID0gc2UtPm51bV9wYWdlcyAtIHRhYmxlX3BhZ2UtPnByaXZhdGU7CisJZG8geworCQlzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKnNlX2Jhc2U7CisJCXUzMiBzZV9lbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gc2l6ZW9mKCpzZSk7CisKKwkJLyogR2V0IG5leHQgc3dhcCBleHRlbnQgKi8KKwkJc2VfYmFzZSA9IChzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKikKKwkJCQkJCXBhZ2VfYWRkcmVzcyhzZV9wYWdlKTsKKwkJaWYgKHNlIC0gc2VfYmFzZSA9PSBzZV9lbnRyaWVzX3Blcl9wYWdlIC0gMSkgeworCQkJc2VfcGFnZSA9IGxpc3RfZW50cnkoc2VfcGFnZS0+bHJ1Lm5leHQsCisJCQkJCQlzdHJ1Y3QgcGFnZSwgbHJ1KTsKKwkJCXNlID0gcGFnZV9hZGRyZXNzKHNlX3BhZ2UpOworCQl9IGVsc2UgeworCQkJc2UrKzsKKwkJfQorCisJCXNraXBwZWQgKz0gc2UtPm51bV9wYWdlczsKKwl9IHdoaWxlIChza2lwcGVkIDwgc2tpcF9wYWdlcyk7CisKKwlkZWx0YSA9IHNraXBwZWQgLSBza2lwX3BhZ2VzOworCXNlX29mZnNldCA9IHNlLT5udW1fcGFnZXMgLSBkZWx0YTsKKworCXJldHVybiBzZS0+cGh5X3BhZ2VudW0gKyBzZV9vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJhbXpzd2FwX2ZyZWVfcGFnZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cywgc2l6ZV90IGluZGV4KQoreworCXUzMiBjbGVuOworCXZvaWQgKm9iajsKKworCXN0cnVjdCBwYWdlICpwYWdlID0gcnpzLT50YWJsZVtpbmRleF0ucGFnZTsKKwl1MzIgb2Zmc2V0ID0gcnpzLT50YWJsZVtpbmRleF0ub2Zmc2V0OworCisJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQlpZiAocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTykpIHsKKwkJCXJ6c19jbGVhcl9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKTsKKwkJCXN0YXRfZGVjKHJ6cy0+c3RhdHMucGFnZXNfemVybyk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmICh1bmxpa2VseShyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19VTkNPTVBSRVNTRUQpKSkgeworCQljbGVuID0gUEFHRV9TSVpFOworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcnpzX2NsZWFyX2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCk7CisJCXN0YXRfZGVjKHJ6cy0+c3RhdHMucGFnZXNfZXhwYW5kKTsKKwkJZ290byBvdXQ7CisJfQorCisJb2JqID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApICsgb2Zmc2V0OworCWNsZW4gPSB4dl9nZXRfb2JqZWN0X3NpemUob2JqKSAtIHNpemVvZihzdHJ1Y3Qgem9ial9oZWFkZXIpOworCWt1bm1hcF9hdG9taWMob2JqLCBLTV9VU0VSMCk7CisKKwl4dl9mcmVlKHJ6cy0+bWVtX3Bvb2wsIHBhZ2UsIG9mZnNldCk7CisJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5nb29kX2NvbXByZXNzKTsKKworb3V0OgorCXJ6cy0+c3RhdHMuY29tcHJfc2l6ZSAtPSBjbGVuOworCXN0YXRfZGVjKHJ6cy0+c3RhdHMucGFnZXNfc3RvcmVkKTsKKworCXJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UgPSBOVUxMOworCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3plcm9fcGFnZShzdHJ1Y3QgYmlvICpiaW8pCit7CisJdm9pZCAqdXNlcl9tZW07CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlOworCisJdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KHVzZXJfbWVtLCAwLCBQQUdFX1NJWkUpOworCWt1bm1hcF9hdG9taWModXNlcl9tZW0sIEtNX1VTRVIwKTsKKworCXJhbXpzd2FwX2ZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCisJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwliaW9fZW5kaW8oYmlvLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfdW5jb21wcmVzc2VkX3BhZ2Uoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwl1MzIgaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgY2hhciAqdXNlcl9tZW0sICpjbWVtOworCisJcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisJaW5kZXggPSBiaW8tPmJpX3NlY3RvciA+PiBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworCisJdXNlcl9tZW0gPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJY21lbSA9IGttYXBfYXRvbWljKHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2UsIEtNX1VTRVIxKSArCisJCQlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQ7CisKKwltZW1jcHkodXNlcl9tZW0sIGNtZW0sIFBBR0VfU0laRSk7CisJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCWt1bm1hcF9hdG9taWMoY21lbSwgS01fVVNFUjEpOworCisJcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisKKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDYWxsZWQgd2hlbiByZXF1ZXN0IHBhZ2UgaXMgbm90IHByZXNlbnQgaW4gcmFtenN3YXAuCisgKiBJdHMgZWl0aGVyIGluIGJhY2tpbmcgc3dhcCBkZXZpY2UgKGlmIHByZXNlbnQpIG9yCisgKiB0aGlzIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBiZWZvcmUgYW55IHByZXZpb3VzIHdyaXRlCisgKiB0byB0aGlzIGxvY2F0aW9uIC0gdGhpcyBoYXBwZW5zIGR1ZSB0byByZWFkYWhlYWQgd2hlbgorICogc3dhcCBkZXZpY2UgaXMgcmVhZCBmcm9tIHVzZXItc3BhY2UgKGUuZy4gZHVyaW5nIHN3YXBvbikKKyAqLworc3RhdGljIGludCBoYW5kbGVfcmFtenN3YXBfZmF1bHQoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwkvKgorCSAqIEFsd2F5cyBmb3J3YXJkIHN1Y2ggcmVxdWVzdHMgdG8gYmFja2luZyBzd2FwCisJICogZGV2aWNlIChpZiBwcmVzZW50KQorCSAqLworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkgeworCQl1MzIgcGFnZW51bTsKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5udW1fcmVhZHMpOworCQlzdGF0X2luYyhyenMtPnN0YXRzLmJkZXZfbnVtX3JlYWRzKTsKKwkJYmlvLT5iaV9iZGV2ID0gcnpzLT5iYWNraW5nX3N3YXA7CisKKwkJLyoKKwkJICogSW4gY2FzZSBiYWNraW5nIHN3YXAgaXMgYSBmaWxlLCBmaW5kIHRoZSByaWdodCBvZmZzZXQgd2l0aGluCisJCSAqIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gbG9naWNhbCBwb3NpdGlvbiAnaW5kZXgnLiBGb3IgYmxvY2sKKwkJICogZGV2aWNlLCB0aGlzIGlzIGEgbm9wLgorCQkgKi8KKwkJcGFnZW51bSA9IGJpby0+Ymlfc2VjdG9yID4+IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisJCWJpby0+Ymlfc2VjdG9yID0gbWFwX2JhY2tpbmdfc3dhcF9wYWdlKHJ6cywgcGFnZW51bSkKKwkJCQkJPDwgU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBJdHMgdW5saWtlbHkgZXZlbnQgaW4gY2FzZSBiYWNraW5nIGRldiBpcworCSAqIG5vdCBwcmVzZW50CisJICovCisJcHJfZGVidWcoIlJlYWQgYmVmb3JlIHdyaXRlIG9uIHN3YXAgZGV2aWNlOiAiCisJCSJzZWN0b3I9JWx1LCBzaXplPSV1LCBvZmZzZXQ9JXVcbiIsCisJCSh1bG9uZykoYmlvLT5iaV9zZWN0b3IpLCBiaW8tPmJpX3NpemUsCisJCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCk7CisKKwkvKiBEbyBub3RoaW5nLiBKdXN0IHJldHVybiBzdWNjZXNzICovCisJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwliaW9fZW5kaW8oYmlvLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYW16c3dhcF9yZWFkKHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW50IHJldDsKKwl1MzIgaW5kZXg7CisJc2l6ZV90IGNsZW47CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IHpvYmpfaGVhZGVyICp6aGVhZGVyOworCXVuc2lnbmVkIGNoYXIgKnVzZXJfbWVtLCAqY21lbTsKKworCXN0YXRfaW5jKHJ6cy0+c3RhdHMubnVtX3JlYWRzKTsKKworCXBhZ2UgPSBiaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlOworCWluZGV4ID0gYmlvLT5iaV9zZWN0b3IgPj4gU0VDVE9SU19QRVJfUEFHRV9TSElGVDsKKworCWlmIChyenNfdGVzdF9mbGFnKHJ6cywgaW5kZXgsIFJaU19aRVJPKSkKKwkJcmV0dXJuIGhhbmRsZV96ZXJvX3BhZ2UoYmlvKTsKKworCS8qIFJlcXVlc3RlZCBwYWdlIGlzIG5vdCBwcmVzZW50IGluIGNvbXByZXNzZWQgYXJlYSAqLworCWlmICghcnpzLT50YWJsZVtpbmRleF0ucGFnZSkKKwkJcmV0dXJuIGhhbmRsZV9yYW16c3dhcF9mYXVsdChyenMsIGJpbyk7CisKKwkvKiBQYWdlIGlzIHN0b3JlZCB1bmNvbXByZXNzZWQgc2luY2UgaXRzIGluY29tcHJlc3NpYmxlICovCisJaWYgKHVubGlrZWx5KHJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCkpKQorCQlyZXR1cm4gaGFuZGxlX3VuY29tcHJlc3NlZF9wYWdlKHJ6cywgYmlvKTsKKworCXVzZXJfbWVtID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCWNsZW4gPSBQQUdFX1NJWkU7CisKKwljbWVtID0ga21hcF9hdG9taWMocnpzLT50YWJsZVtpbmRleF0ucGFnZSwgS01fVVNFUjEpICsKKwkJCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCXJldCA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZSgKKwkJY21lbSArIHNpemVvZigqemhlYWRlciksCisJCXh2X2dldF9vYmplY3Rfc2l6ZShjbWVtKSAtIHNpemVvZigqemhlYWRlciksCisJCXVzZXJfbWVtLCAmY2xlbik7CisKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisJa3VubWFwX2F0b21pYyhjbWVtLCBLTV9VU0VSMSk7CisKKwkvKiBzaG91bGQgTkVWRVIgaGFwcGVuICovCisJaWYgKHVubGlrZWx5KHJldCAhPSBMWk9fRV9PSykpIHsKKwkJcHJfZXJyKCJEZWNvbXByZXNzaW9uIGZhaWxlZCEgZXJyPSVkLCBwYWdlPSV1XG4iLAorCQkJcmV0LCBpbmRleCk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3JlYWRzKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmFtenN3YXBfZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisKKwlzZXRfYml0KEJJT19VUFRPREFURSwgJmJpby0+YmlfZmxhZ3MpOworCWJpb19lbmRpbyhiaW8sIDApOworCXJldHVybiAwOworCitvdXQ6CisJYmlvX2lvX2Vycm9yKGJpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFtenN3YXBfd3JpdGUoc3RydWN0IHJhbXpzd2FwICpyenMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlpbnQgcmV0LCBmd2Rfd3JpdGVfcmVxdWVzdCA9IDA7CisJdTMyIG9mZnNldCwgaW5kZXg7CisJc2l6ZV90IGNsZW47CisJc3RydWN0IHpvYmpfaGVhZGVyICp6aGVhZGVyOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGFnZV9zdG9yZTsKKwl1bnNpZ25lZCBjaGFyICp1c2VyX21lbSwgKmNtZW0sICpzcmM7CisKKwlzdGF0X2luYyhyenMtPnN0YXRzLm51bV93cml0ZXMpOworCisJcGFnZSA9IGJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisJaW5kZXggPSBiaW8tPmJpX3NlY3RvciA+PiBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworCisJc3JjID0gcnpzLT5jb21wcmVzc19idWZmZXI7CisKKwkvKgorCSAqIFN5c3RlbSBzd2FwcyB0byBzYW1lIHNlY3RvciBhZ2FpbiB3aGVuIHRoZSBzdG9yZWQgcGFnZQorCSAqIGlzIG5vIGxvbmdlciByZWZlcmVuY2VkIGJ5IGFueSBwcm9jZXNzLiBTbywgaXRzIG5vdyBzYWZlCisJICogdG8gZnJlZSB0aGUgbWVtb3J5IHRoYXQgd2FzIGFsbG9jYXRlZCBmb3IgdGhpcyBwYWdlLgorCSAqLworCWlmIChyenMtPnRhYmxlW2luZGV4XS5wYWdlKQorCQlyYW16c3dhcF9mcmVlX3BhZ2UocnpzLCBpbmRleCk7CisKKwkvKgorCSAqIE5vIG1lbW9yeSBpYSBhbGxvY2F0ZWQgZm9yIHplcm8gZmlsbGVkIHBhZ2VzLgorCSAqIFNpbXBseSBjbGVhciB6ZXJvIHBhZ2UgZmxhZy4KKwkgKi8KKwlpZiAocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTykpIHsKKwkJc3RhdF9kZWMocnpzLT5zdGF0cy5wYWdlc196ZXJvKTsKKwkJcnpzX2NsZWFyX2ZsYWcocnpzLCBpbmRleCwgUlpTX1pFUk8pOworCX0KKworCW11dGV4X2xvY2soJnJ6cy0+bG9jayk7CisKKwl1c2VyX21lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlpZiAocGFnZV96ZXJvX2ZpbGxlZCh1c2VyX21lbSkpIHsKKwkJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMucGFnZXNfemVybyk7CisJCXJ6c19zZXRfZmxhZyhyenMsIGluZGV4LCBSWlNfWkVSTyk7CisKKwkJc2V0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyenMtPmJhY2tpbmdfc3dhcCAmJgorCQkocnpzLT5zdGF0cy5jb21wcl9zaXplID4gcnpzLT5tZW1saW1pdCAtIFBBR0VfU0laRSkpIHsKKwkJa3VubWFwX2F0b21pYyh1c2VyX21lbSwgS01fVVNFUjApOworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCWZ3ZF93cml0ZV9yZXF1ZXN0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbHpvMXhfMV9jb21wcmVzcyh1c2VyX21lbSwgUEFHRV9TSVpFLCBzcmMsICZjbGVuLAorCQkJCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSk7CisKKwlrdW5tYXBfYXRvbWljKHVzZXJfbWVtLCBLTV9VU0VSMCk7CisKKwlpZiAodW5saWtlbHkocmV0ICE9IExaT19FX09LKSkgeworCQltdXRleF91bmxvY2soJnJ6cy0+bG9jayk7CisJCXByX2VycigiQ29tcHJlc3Npb24gZmFpbGVkISBlcnI9JWRcbiIsIHJldCk7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUGFnZSBpcyBpbmNvbXByZXNzaWJsZS4gRm9yd2FyZCBpdCB0byBiYWNraW5nIHN3YXAKKwkgKiBpZiBwcmVzZW50LiBPdGhlcndpc2UsIHN0b3JlIGl0IGFzLWlzICh1bmNvbXByZXNzZWQpCisJICogc2luY2Ugd2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHRvbyBtYW55IHN3YXAgd3JpdGUKKwkgKiBlcnJvcnMgd2hpY2ggaGFzIHNpZGUgZWZmZWN0IG9mIGhhbmdpbmcgdGhlIHN5c3RlbS4KKwkgKi8KKwlpZiAodW5saWtlbHkoY2xlbiA+IG1heF96cGFnZV9zaXplKSkgeworCQlpZiAocnpzLT5iYWNraW5nX3N3YXApIHsKKwkJCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKwkJCWZ3ZF93cml0ZV9yZXF1ZXN0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY2xlbiA9IFBBR0VfU0laRTsKKwkJcGFnZV9zdG9yZSA9IGFsbG9jX3BhZ2UoR0ZQX05PSU8gfCBfX0dGUF9ISUdITUVNKTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlX3N0b3JlKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOworCQkJcHJfaW5mbygiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGluY29tcHJlc3NpYmxlICIKKwkJCQkicGFnZTogJXVcbiIsIGluZGV4KTsKKwkJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW9mZnNldCA9IDA7CisJCXJ6c19zZXRfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKTsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5wYWdlc19leHBhbmQpOworCQlyenMtPnRhYmxlW2luZGV4XS5wYWdlID0gcGFnZV9zdG9yZTsKKwkJc3JjID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlnb3RvIG1lbXN0b3JlOworCX0KKworCWlmICh4dl9tYWxsb2MocnpzLT5tZW1fcG9vbCwgY2xlbiArIHNpemVvZigqemhlYWRlciksCisJCQkmcnpzLT50YWJsZVtpbmRleF0ucGFnZSwgJm9mZnNldCwKKwkJCUdGUF9OT0lPIHwgX19HRlBfSElHSE1FTSkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZyenMtPmxvY2spOworCQlwcl9pbmZvKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgY29tcHJlc3NlZCAiCisJCQkicGFnZTogJXUsIHNpemU9JXp1XG4iLCBpbmRleCwgY2xlbik7CisJCXN0YXRfaW5jKHJ6cy0+c3RhdHMuZmFpbGVkX3dyaXRlcyk7CisJCWlmIChyenMtPmJhY2tpbmdfc3dhcCkKKwkJCWZ3ZF93cml0ZV9yZXF1ZXN0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCittZW1zdG9yZToKKwlyenMtPnRhYmxlW2luZGV4XS5vZmZzZXQgPSBvZmZzZXQ7CisKKwljbWVtID0ga21hcF9hdG9taWMocnpzLT50YWJsZVtpbmRleF0ucGFnZSwgS01fVVNFUjEpICsKKwkJCXJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworI2lmIDAKKwkvKiBCYWNrLXJlZmVyZW5jZSBuZWVkZWQgZm9yIG1lbW9yeSBkZWZyYWdtZW50YXRpb24gKi8KKwlpZiAoIXJ6c190ZXN0X2ZsYWcocnpzLCBpbmRleCwgUlpTX1VOQ09NUFJFU1NFRCkpIHsKKwkJemhlYWRlciA9IChzdHJ1Y3Qgem9ial9oZWFkZXIgKiljbWVtOworCQl6aGVhZGVyLT50YWJsZV9pZHggPSBpbmRleDsKKwkJY21lbSArPSBzaXplb2YoKnpoZWFkZXIpOworCX0KKyNlbmRpZgorCisJbWVtY3B5KGNtZW0sIHNyYywgY2xlbik7CisKKwlrdW5tYXBfYXRvbWljKGNtZW0sIEtNX1VTRVIxKTsKKwlpZiAodW5saWtlbHkocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkpCisJCWt1bm1hcF9hdG9taWMoc3JjLCBLTV9VU0VSMCk7CisKKwkvKiBVcGRhdGUgc3RhdHMgKi8KKwlyenMtPnN0YXRzLmNvbXByX3NpemUgKz0gY2xlbjsKKwlzdGF0X2luYyhyenMtPnN0YXRzLnBhZ2VzX3N0b3JlZCk7CisJaWYgKGNsZW4gPD0gUEFHRV9TSVpFIC8gMikKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5nb29kX2NvbXByZXNzKTsKKworCW11dGV4X3VubG9jaygmcnpzLT5sb2NrKTsKKworCXNldF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJYmlvX2VuZGlvKGJpbywgMCk7CisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAoZndkX3dyaXRlX3JlcXVlc3QpIHsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5iZGV2X251bV93cml0ZXMpOworCQliaW8tPmJpX2JkZXYgPSByenMtPmJhY2tpbmdfc3dhcDsKKyNpZiAwCisJCS8qCisJCSAqIFRPRE86IFdlIGN1cnJlbnRseSBoYXZlIGxpbmVhciBtYXBwaW5nIG9mIHJhbXpzd2FwIGFuZAorCQkgKiBiYWNraW5nIHN3YXAgc2VjdG9ycy4gVGhpcyBpcyBub3QgZGVzaXJlZCBzaW5jZSB3ZSB3YW50CisJCSAqIHRvIG9wdGltaXplIHdyaXRlcyB0byBiYWNraW5nIHN3YXAgdG8gbWluaW1pemUgZGlzayBzZWVrcworCQkgKiBvciBoYXZlIGVmZmVjdGl2ZSB3ZWFyIGxldmVsaW5nIChmb3IgU1NEcykuIEFsc28sIGEKKwkJICogbm9uLWxpbmVhciBtYXBwaW5nIGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBjb21wcmVzc2VkCisJCSAqIG9uLWRpc2sgc3dhcHBpbmcuCisJCSAqLworCQkgYmlvLT5iaV9zZWN0b3IgPSBnZXRfYmFja2luZ19zd2FwX3BhZ2UoKQorCQkJCQk8PCBTRUNUT1JTX1BFUl9QQUdFX1NISUZUOworI2VuZGlmCisJCS8qCisJCSAqIEluIGNhc2UgYmFja2luZyBzd2FwIGlzIGEgZmlsZSwgZmluZCB0aGUgcmlnaHQgb2Zmc2V0IHdpdGhpbgorCQkgKiB0aGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGxvZ2ljYWwgcG9zaXRpb24gJ2luZGV4Jy4gRm9yIGJsb2NrCisJCSAqIGRldmljZSwgdGhpcyBpcyBhIG5vcC4KKwkJICovCisJCWJpby0+Ymlfc2VjdG9yID0gbWFwX2JhY2tpbmdfc3dhcF9wYWdlKHJ6cywgaW5kZXgpCisJCQkJCTw8IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQ7CisJCXJldHVybiAxOworCX0KKworCWJpb19pb19lcnJvcihiaW8pOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDaGVjayBpZiByZXF1ZXN0IGlzIHdpdGhpbiBib3VuZHMgYW5kIHBhZ2UgYWxpZ25lZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdmFsaWRfc3dhcF9yZXF1ZXN0KHN0cnVjdCByYW16c3dhcCAqcnpzLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaWYgKHVubGlrZWx5KAorCQkoYmlvLT5iaV9zZWN0b3IgPj0gKHJ6cy0+ZGlza3NpemUgPj4gU0VDVE9SX1NISUZUKSkgfHwKKwkJKGJpby0+Ymlfc2VjdG9yICYgKFNFQ1RPUlNfUEVSX1BBR0UgLSAxKSkgfHwKKwkJKGJpby0+YmlfdmNudCAhPSAxKSB8fAorCQkoYmlvLT5iaV9zaXplICE9IFBBR0VfU0laRSkgfHwKKwkJKGJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCAhPSAwKSkpIHsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzd2FwIHJlcXVlc3QgaXMgdmFsaWQgKi8KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEhhbmRsZXIgZnVuY3Rpb24gZm9yIGFsbCByYW16c3dhcCBJL08gcmVxdWVzdHMuCisgKi8KK3N0YXRpYyBpbnQgcmFtenN3YXBfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZSwgc3RydWN0IGJpbyAqYmlvKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCByYW16c3dhcCAqcnpzID0gcXVldWUtPnF1ZXVlZGF0YTsKKworCWlmICh1bmxpa2VseSghcnpzLT5pbml0X2RvbmUpKSB7CisJCWJpb19pb19lcnJvcihiaW8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXZhbGlkX3N3YXBfcmVxdWVzdChyenMsIGJpbykpIHsKKwkJc3RhdF9pbmMocnpzLT5zdGF0cy5pbnZhbGlkX2lvKTsKKwkJYmlvX2lvX2Vycm9yKGJpbyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoYmlvX2RhdGFfZGlyKGJpbykpIHsKKwljYXNlIFJFQUQ6CisJCXJldCA9IHJhbXpzd2FwX3JlYWQocnpzLCBiaW8pOworCQlicmVhazsKKworCWNhc2UgV1JJVEU6CisJCXJldCA9IHJhbXpzd2FwX3dyaXRlKHJ6cywgYmlvKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWludCBpc19iYWNraW5nX2Jsa2RldiA9IDA7CisJc2l6ZV90IGluZGV4LCBudW1fcGFnZXM7CisJdW5zaWduZWQgZW50cmllc19wZXJfcGFnZTsKKwl1bnNpZ25lZCBsb25nIG51bV90YWJsZV9wYWdlcywgZW50cnkgPSAwOworCisJaWYgKHJ6cy0+YmFja2luZ19zd2FwICYmICFyenMtPm51bV9leHRlbnRzKQorCQlpc19iYWNraW5nX2Jsa2RldiA9IDE7CisKKwludW1fcGFnZXMgPSByenMtPmRpc2tzaXplID4+IFBBR0VfU0hJRlQ7CisKKwkvKiBGcmVlIHZhcmlvdXMgcGVyLWRldmljZSBidWZmZXJzICovCisJa2ZyZWUocnpzLT5jb21wcmVzc193b3JrbWVtKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXJ6cy0+Y29tcHJlc3NfYnVmZmVyLCAxKTsKKworCXJ6cy0+Y29tcHJlc3Nfd29ya21lbSA9IE5VTEw7CisJcnpzLT5jb21wcmVzc19idWZmZXIgPSBOVUxMOworCisJLyogRnJlZSBhbGwgcGFnZXMgdGhhdCBhcmUgc3RpbGwgaW4gdGhpcyByYW16c3dhcCBkZXZpY2UgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1fcGFnZXM7IGluZGV4KyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXUxNiBvZmZzZXQ7CisKKwkJcGFnZSA9IHJ6cy0+dGFibGVbaW5kZXhdLnBhZ2U7CisJCW9mZnNldCA9IHJ6cy0+dGFibGVbaW5kZXhdLm9mZnNldDsKKworCQlpZiAoIXBhZ2UpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkocnpzX3Rlc3RfZmxhZyhyenMsIGluZGV4LCBSWlNfVU5DT01QUkVTU0VEKSkpCisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJeHZfZnJlZShyenMtPm1lbV9wb29sLCBwYWdlLCBvZmZzZXQpOworCX0KKworCWVudHJpZXNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBzaXplb2YoKnJ6cy0+dGFibGUpOworCW51bV90YWJsZV9wYWdlcyA9IERJVl9ST1VORF9VUChudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpLAorCQkJCQlQQUdFX1NJWkUpOworCS8qCisJICogU2V0IHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCBmb3IgZXZlcnkgdGFibGUgcGFnZS4KKwkgKiBPdGhlcndpc2UsIHdlIHdpbGwgaGl0IGJhZF9wYWdlKCkgZHVyaW5nIGZyZWUuCisJICovCisJd2hpbGUgKHJ6cy0+bnVtX2V4dGVudHMgJiYgbnVtX3RhYmxlX3BhZ2VzLS0pIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoJnJ6cy0+dGFibGVbZW50cnldKTsKKwkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCWVudHJ5ICs9IGVudHJpZXNfcGVyX3BhZ2U7CisJfQorCXZmcmVlKHJ6cy0+dGFibGUpOworCXJ6cy0+dGFibGUgPSBOVUxMOworCisJeHZfZGVzdHJveV9wb29sKHJ6cy0+bWVtX3Bvb2wpOworCXJ6cy0+bWVtX3Bvb2wgPSBOVUxMOworCisJLyogRnJlZSBhbGwgc3dhcCBleHRlbnQgcGFnZXMgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0KSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJCWVudHJ5ID0gcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QubmV4dDsKKwkJcGFnZSA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCX0KKwlJTklUX0xJU1RfSEVBRCgmcnpzLT5iYWNraW5nX3N3YXBfZXh0ZW50X2xpc3QpOworCXJ6cy0+bnVtX2V4dGVudHMgPSAwOworCisJLyogQ2xvc2UgYmFja2luZyBzd2FwIGRldmljZSwgaWYgcHJlc2VudCAqLworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkgeworCQlpZiAoaXNfYmFja2luZ19ibGtkZXYpCisJCQliZF9yZWxlYXNlKHJ6cy0+YmFja2luZ19zd2FwKTsKKwkJZmlscF9jbG9zZShyenMtPnN3YXBfZmlsZSwgTlVMTCk7CisJCXJ6cy0+YmFja2luZ19zd2FwID0gTlVMTDsKKwl9CisKKwkvKiBSZXNldCBzdGF0cyAqLworCW1lbXNldCgmcnpzLT5zdGF0cywgMCwgc2l6ZW9mKHJ6cy0+c3RhdHMpKTsKKworCXJ6cy0+ZGlza3NpemUgPSAwOworCXJ6cy0+bWVtbGltaXQgPSAwOworCisJLyogQmFjayB0byB1bmluaXRpYWxpemVkIHN0YXRlICovCisJcnpzLT5pbml0X2RvbmUgPSAwOworfQorCitzdGF0aWMgaW50IHJhbXpzd2FwX2lvY3RsX2luaXRfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWludCByZXQ7CisJc2l6ZV90IG51bV9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bmlvbiBzd2FwX2hlYWRlciAqc3dhcF9oZWFkZXI7CisKKwlpZiAocnpzLT5pbml0X2RvbmUpIHsKKwkJcHJfaW5mbygiRGV2aWNlIGFscmVhZHkgaW5pdGlhbGl6ZWQhXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSBzZXR1cF9iYWNraW5nX3N3YXAocnpzKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlpZiAocnpzLT5iYWNraW5nX3N3YXApCisJCXJhbXpzd2FwX3NldF9tZW1saW1pdChyenMsIHRvdGFscmFtX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCWVsc2UKKwkJcmFtenN3YXBfc2V0X2Rpc2tzaXplKHJ6cywgdG90YWxyYW1fcGFnZXMgPDwgUEFHRV9TSElGVCk7CisKKwlyenMtPmNvbXByZXNzX3dvcmttZW0gPSBremFsbG9jKExaTzFYX01FTV9DT01QUkVTUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyenMtPmNvbXByZXNzX3dvcmttZW0pIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3Igd29ya2luZyBtZW1vcnkhXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCXJ6cy0+Y29tcHJlc3NfYnVmZmVyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKF9fR0ZQX1pFUk8sIDEpOworCWlmICghcnpzLT5jb21wcmVzc19idWZmZXIpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3IgYnVmZmVyIHNwYWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCW51bV9wYWdlcyA9IHJ6cy0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsKKwlyenMtPnRhYmxlID0gdm1hbGxvYyhudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpKTsKKwlpZiAoIXJ6cy0+dGFibGUpIHsKKwkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHJhbXpzd2FwIGFkZHJlc3MgdGFibGVcbiIpOworCQkvKiBUbyBwcmV2ZW50IGFjY2Vzc2luZyB0YWJsZSBlbnRyaWVzIGR1cmluZyBjbGVhbnVwICovCisJCXJ6cy0+ZGlza3NpemUgPSAwOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCW1lbXNldChyenMtPnRhYmxlLCAwLCBudW1fcGFnZXMgKiBzaXplb2YoKnJ6cy0+dGFibGUpKTsKKworCW1hcF9iYWNraW5nX3N3YXBfZXh0ZW50cyhyenMpOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoX19HRlBfWkVSTyk7CisJaWYgKCFwYWdlKSB7CisJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyBzd2FwIGhlYWRlciBwYWdlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlyenMtPnRhYmxlWzBdLnBhZ2UgPSBwYWdlOworCXJ6c19zZXRfZmxhZyhyenMsIDAsIFJaU19VTkNPTVBSRVNTRUQpOworCisJc3dhcF9oZWFkZXIgPSBrbWFwKHBhZ2UpOworCXJldCA9IHNldHVwX3N3YXBfaGVhZGVyKHJ6cywgc3dhcF9oZWFkZXIpOworCWt1bm1hcChwYWdlKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRXJyb3Igc2V0dGluZyBzd2FwIGhlYWRlclxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzZXRfY2FwYWNpdHkocnpzLT5kaXNrLCByenMtPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCk7CisKKwkvKgorCSAqIFdlIGhhdmUgaWRlbnQgbWFwcGluZyBvZiBzZWN0b3JzIGZvciByYW16c3dhcCBhbmQKKwkgKiBhbmQgdGhlIGJhY2tpbmcgc3dhcCBkZXZpY2UuIFNvLCB0aGlzIHF1ZXVlIGZsYWcKKwkgKiBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIGJhY2tpbmcgZGV2LgorCSAqLworCWlmICghcnpzLT5iYWNraW5nX3N3YXAgfHwKKwkJCWJsa19xdWV1ZV9ub25yb3QocnpzLT5iYWNraW5nX3N3YXAtPmJkX2Rpc2stPnF1ZXVlKSkKKwkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19OT05ST1QsIHJ6cy0+ZGlzay0+cXVldWUpOworCisJcnpzLT5tZW1fcG9vbCA9IHh2X2NyZWF0ZV9wb29sKCk7CisJaWYgKCFyenMtPm1lbV9wb29sKSB7CisJCXByX2VycigiRXJyb3IgY3JlYXRpbmcgbWVtb3J5IHBvb2xcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBQYWdlcyB0aGF0IGNvbXByZXNzIHRvIHNpemUgZ3JlYXRlciB0aGFuIHRoaXMgYXJlIGZvcndhcmRlZAorCSAqIHRvIHBoeXNpY2FsIHN3YXAgZGlzayAoaWYgYmFja2luZyBkZXYgaXMgcHJvdmlkZWQpCisJICogVE9ETzogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZQorCSAqLworCWlmIChyenMtPmJhY2tpbmdfc3dhcCkKKwkJbWF4X3pwYWdlX3NpemUgPSBtYXhfenBhZ2Vfc2l6ZV9iZGV2OworCWVsc2UKKwkJbWF4X3pwYWdlX3NpemUgPSBtYXhfenBhZ2Vfc2l6ZV9ub2JkZXY7CisJcHJfZGVidWcoIk1heCBjb21wcmVzc2VkIHBhZ2Ugc2l6ZTogJXUgYnl0ZXNcbiIsIG1heF96cGFnZV9zaXplKTsKKworCXJ6cy0+aW5pdF9kb25lID0gMTsKKworCXByX2RlYnVnKCJJbml0aWFsaXphdGlvbiBkb25lIVxuIik7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJcmVzZXRfZGV2aWNlKHJ6cyk7CisKKwlwcl9lcnIoIkluaXRpYWxpemF0aW9uIGZhaWxlZDogZXJyPSVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmFtenN3YXBfaW9jdGxfcmVzZXRfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzKQoreworCWlmIChyenMtPmluaXRfZG9uZSkKKwkJcmVzZXRfZGV2aWNlKHJ6cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYW16c3dhcF9pb2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzaXplX3QgZGlza3NpemVfa2IsIG1lbWxpbWl0X2tiOworCisJc3RydWN0IHJhbXpzd2FwICpyenMgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUlpTSU9fU0VUX0RJU0tTSVpFX0tCOgorCQlpZiAocnpzLT5pbml0X2RvbmUpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGlza3NpemVfa2IsICh2b2lkICopYXJnLAorCQkJCQkJX0lPQ19TSVpFKGNtZCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnpzLT5kaXNrc2l6ZSA9IGRpc2tzaXplX2tiIDw8IDEwOworCQlwcl9pbmZvKCJEaXNrIHNpemUgc2V0IHRvICV6dSBrQlxuIiwgZGlza3NpemVfa2IpOworCQlicmVhazsKKworCWNhc2UgUlpTSU9fU0VUX01FTUxJTUlUX0tCOgorCQlpZiAocnpzLT5pbml0X2RvbmUpIHsKKwkJCS8qIFRPRE86IGFsbG93IGNoYW5naW5nIG1lbWxpbWl0ICovCisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJm1lbWxpbWl0X2tiLCAodm9pZCAqKWFyZywKKwkJCQkJCV9JT0NfU0laRShjbWQpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJ6cy0+bWVtbGltaXQgPSBtZW1saW1pdF9rYiA8PCAxMDsKKwkJcHJfaW5mbygiTWVtb3J5IGxpbWl0IHNldCB0byAlenUga0JcbiIsIG1lbWxpbWl0X2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIFJaU0lPX1NFVF9CQUNLSU5HX1NXQVA6CisJCWlmIChyenMtPmluaXRfZG9uZSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJ6cy0+YmFja2luZ19zd2FwX25hbWUsICh2b2lkICopYXJnLAorCQkJCQkJX0lPQ19TSVpFKGNtZCkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJcnpzLT5iYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKwkJcHJfaW5mbygiQmFja2luZyBzd2FwIHNldCB0byAlc1xuIiwgcnpzLT5iYWNraW5nX3N3YXBfbmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBSWlNJT19HRVRfU1RBVFM6CisJeworCQlzdHJ1Y3QgcmFtenN3YXBfaW9jdGxfc3RhdHMgKnN0YXRzOworCQlpZiAoIXJ6cy0+aW5pdF9kb25lKSB7CisJCQlyZXQgPSAtRU5PVFRZOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3RhdHMgPSBremFsbG9jKHNpemVvZigqc3RhdHMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzdGF0cykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJhbXpzd2FwX2lvY3RsX2dldF9zdGF0cyhyenMsIHN0YXRzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgc3RhdHMsIHNpemVvZigqc3RhdHMpKSkgeworCQkJa2ZyZWUoc3RhdHMpOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWtmcmVlKHN0YXRzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgUlpTSU9fSU5JVDoKKwkJcmV0ID0gcmFtenN3YXBfaW9jdGxfaW5pdF9kZXZpY2UocnpzKTsKKwkJYnJlYWs7CisKKwljYXNlIFJaU0lPX1JFU0VUOgorCQkvKiBEbyBub3QgcmVzZXQgYW4gYWN0aXZlIGRldmljZSEgKi8KKwkJaWYgKGJkZXYtPmJkX2hvbGRlcnMpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IHJhbXpzd2FwX2lvY3RsX3Jlc2V0X2RldmljZShyenMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2luZm8oIkludmFsaWQgaW9jdGwgJXVcbiIsIGNtZCk7CisJCXJldCA9IC1FTk9UVFk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyByYW16c3dhcF9kZXZvcHMgPSB7CisJLmlvY3RsID0gcmFtenN3YXBfaW9jdGwsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdm9pZCBjcmVhdGVfZGV2aWNlKHN0cnVjdCByYW16c3dhcCAqcnpzLCBpbnQgZGV2aWNlX2lkKQoreworCW11dGV4X2luaXQoJnJ6cy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJ6cy0+YmFja2luZ19zd2FwX2V4dGVudF9saXN0KTsKKworCXJ6cy0+cXVldWUgPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7CisJaWYgKCFyenMtPnF1ZXVlKSB7CisJCXByX2VycigiRXJyb3IgYWxsb2NhdGluZyBkaXNrIHF1ZXVlIGZvciBkZXZpY2UgJWRcbiIsCisJCQlkZXZpY2VfaWQpOworCQlyZXR1cm47CisJfQorCisJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChyenMtPnF1ZXVlLCByYW16c3dhcF9tYWtlX3JlcXVlc3QpOworCXJ6cy0+cXVldWUtPnF1ZXVlZGF0YSA9IHJ6czsKKworCSAvKiBnZW5kaXNrIHN0cnVjdHVyZSAqLworCXJ6cy0+ZGlzayA9IGFsbG9jX2Rpc2soMSk7CisJaWYgKCFyenMtPmRpc2spIHsKKwkJYmxrX2NsZWFudXBfcXVldWUocnpzLT5xdWV1ZSk7CisJCXByX3dhcm5pbmcoIkVycm9yIGFsbG9jYXRpbmcgZGlzayBzdHJ1Y3R1cmUgZm9yIGRldmljZSAlZFxuIiwKKwkJCWRldmljZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwlyenMtPmRpc2stPm1ham9yID0gcmFtenN3YXBfbWFqb3I7CisJcnpzLT5kaXNrLT5maXJzdF9taW5vciA9IGRldmljZV9pZDsKKwlyenMtPmRpc2stPmZvcHMgPSAmcmFtenN3YXBfZGV2b3BzOworCXJ6cy0+ZGlzay0+cXVldWUgPSByenMtPnF1ZXVlOworCXJ6cy0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gcnpzOworCXNucHJpbnRmKHJ6cy0+ZGlzay0+ZGlza19uYW1lLCAxNiwgInJhbXpzd2FwJWQiLCBkZXZpY2VfaWQpOworCisJLyoKKwkgKiBBY3R1YWwgY2FwYWNpdHkgc2V0IHVzaW5nIFJaU0lPX1NFVF9ESVNLU0laRV9LQiBpb2N0bAorCSAqIG9yIHNldCBlcXVhbCB0byBiYWNraW5nIHN3YXAgZGV2aWNlIChpZiBwcm92aWRlZCkKKwkgKi8KKwlzZXRfY2FwYWNpdHkocnpzLT5kaXNrLCAwKTsKKwlhZGRfZGlzayhyenMtPmRpc2spOworCisJcnpzLT5pbml0X2RvbmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2RldmljZShzdHJ1Y3QgcmFtenN3YXAgKnJ6cykKK3sKKwlpZiAocnpzLT5kaXNrKSB7CisJCWRlbF9nZW5kaXNrKHJ6cy0+ZGlzayk7CisJCXB1dF9kaXNrKHJ6cy0+ZGlzayk7CisJfQorCisJaWYgKHJ6cy0+cXVldWUpCisJCWJsa19jbGVhbnVwX3F1ZXVlKHJ6cy0+cXVldWUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCByYW16c3dhcF9pbml0KHZvaWQpCit7CisJaW50IGksIHJldDsKKworCWlmIChudW1fZGV2aWNlcyA+IG1heF9udW1fZGV2aWNlcykgeworCQlwcl93YXJuaW5nKCJJbnZhbGlkIHZhbHVlIGZvciBudW1fZGV2aWNlczogJXVcbiIsCisJCQkJbnVtX2RldmljZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYW16c3dhcF9tYWpvciA9IHJlZ2lzdGVyX2Jsa2RldigwLCAicmFtenN3YXAiKTsKKwlpZiAocmFtenN3YXBfbWFqb3IgPD0gMCkgeworCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlclxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFudW1fZGV2aWNlcykgeworCQlwcl9pbmZvKCJudW1fZGV2aWNlcyBub3Qgc3BlY2lmaWVkLiBVc2luZyBkZWZhdWx0OiAxXG4iKTsKKwkJbnVtX2RldmljZXMgPSAxOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBkZXZpY2UgYXJyYXkgYW5kIGluaXRpYWxpemUgZWFjaCBvbmUgKi8KKwlwcl9pbmZvKCJDcmVhdGluZyAldSBkZXZpY2VzIC4uLlxuIiwgbnVtX2RldmljZXMpOworCWRldmljZXMgPSBremFsbG9jKG51bV9kZXZpY2VzICogc2l6ZW9mKHN0cnVjdCByYW16c3dhcCksIEdGUF9LRVJORUwpOworCWlmICghZGV2aWNlcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykKKwkJY3JlYXRlX2RldmljZSgmZGV2aWNlc1tpXSwgaSk7CisKKwlyZXR1cm4gMDsKK291dDoKKwl1bnJlZ2lzdGVyX2Jsa2RldihyYW16c3dhcF9tYWpvciwgInJhbXpzd2FwIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJhbXpzd2FwX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmFtenN3YXAgKnJ6czsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisJCXJ6cyA9ICZkZXZpY2VzW2ldOworCisJCWRlc3Ryb3lfZGV2aWNlKHJ6cyk7CisJCWlmIChyenMtPmluaXRfZG9uZSkKKwkJCXJlc2V0X2RldmljZShyenMpOworCX0KKworCXVucmVnaXN0ZXJfYmxrZGV2KHJhbXpzd2FwX21ham9yLCAicmFtenN3YXAiKTsKKworCWtmcmVlKGRldmljZXMpOworCXByX2RlYnVnKCJDbGVhbnVwIGRvbmUhXG4iKTsKK30KKworbW9kdWxlX3BhcmFtKG51bV9kZXZpY2VzLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX2RldmljZXMsICJOdW1iZXIgb2YgcmFtenN3YXAgZGV2aWNlcyIpOworCittb2R1bGVfaW5pdChyYW16c3dhcF9pbml0KTsKK21vZHVsZV9leGl0KHJhbXpzd2FwX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOaXRpbiBHdXB0YSA8bmd1cHRhQHZmbGFyZS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbXByZXNzZWQgUkFNIEJhc2VkIFN3YXAgRGV2aWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYTI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9kcnYuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvbXByZXNzZWQgUkFNIGJhc2VkIHN3YXAgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICoKKyAqIFByb2plY3QgaG9tZTogaHR0cDovL2NvbXBjYWNoZS5nb29nbGVjb2RlLmNvbQorICovCisKKyNpZm5kZWYgX1JBTVpTV0FQX0RSVl9IXworI2RlZmluZSBfUkFNWlNXQVBfRFJWX0hfCisKKyNpbmNsdWRlICJyYW16c3dhcF9pb2N0bC5oIgorI2luY2x1ZGUgInh2bWFsbG9jLmgiCisKKy8qCisgKiBTb21lIGFyYml0cmFyeSB2YWx1ZS4gVGhpcyBpcyBqdXN0IHRvIGNhdGNoCisgKiBpbnZhbGlkIHZhbHVlIGZvciBudW1fZGV2aWNlcyBtb2R1bGUgcGFyYW1ldGVyLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4X251bV9kZXZpY2VzID0gMzI7CisKKy8qCisgKiBTdG9yZWQgYXQgYmVnaW5uaW5nIG9mIGVhY2ggY29tcHJlc3NlZCBvYmplY3QuCisgKgorICogSXQgc3RvcmVzIGJhY2stcmVmZXJlbmNlIHRvIHRhYmxlIGVudHJ5IHdoaWNoIHBvaW50cyB0byB0aGlzCisgKiBvYmplY3QuIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBtZW1vcnkgZGVmcmFnbWVudGF0aW9uIG9yCisgKiBtaWdyYXRpbmcgY29tcHJlc3NlZCBwYWdlcyB0byBiYWNraW5nIHN3YXAgZGlzay4KKyAqLworc3RydWN0IHpvYmpfaGVhZGVyIHsKKyNpZiAwCisJdTMyIHRhYmxlX2lkeDsKKyNlbmRpZgorfTsKKworLyotLSBDb25maWd1cmFibGUgcGFyYW1ldGVycyAqLworCisvKiBEZWZhdWx0IHJhbXpzd2FwIGRpc2sgc2l6ZTogMjUlIG9mIHRvdGFsIFJBTSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRlZmF1bHRfZGlza3NpemVfcGVyY19yYW0gPSAyNTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkZWZhdWx0X21lbWxpbWl0X3BlcmNfcmFtID0gMTU7CisKKy8qCisgKiBNYXggY29tcHJlc3NlZCBwYWdlIHNpemUgd2hlbiBiYWNraW5nIGRldmljZSBpcyBwcm92aWRlZC4KKyAqIFBhZ2VzIHRoYXQgY29tcHJlc3MgdG8gc2l6ZSBncmVhdGVyIHRoYW4gdGhpcyBhcmUgc2VudCB0bworICogcGh5c2ljYWwgc3dhcCBkaXNrLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4X3pwYWdlX3NpemVfYmRldiA9IFBBR0VfU0laRSAvIDI7CisKKy8qCisgKiBNYXggY29tcHJlc3NlZCBwYWdlIHNpemUgd2hlbiB0aGVyZSBpcyBubyBiYWNraW5nIGRldi4KKyAqIFBhZ2VzIHRoYXQgY29tcHJlc3MgdG8gc2l6ZSBncmVhdGVyIHRoYW4gdGhpcyBhcmUgc3RvcmVkCisgKiB1bmNvbXByZXNzZWQgaW4gbWVtb3J5LgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4X3pwYWdlX3NpemVfbm9iZGV2ID0gUEFHRV9TSVpFIC8gNCAqIDM7CisKKy8qCisgKiBOT1RFOiBtYXhfenBhZ2Vfc2l6ZV97YmRldixub2JkZXZ9IHNpemVzIG11c3QgYmUKKyAqIGxlc3MgdGhhbiBvciBlcXVhbCB0bzoKKyAqICAgWFZfTUFYX0FMTE9DX1NJWkUgLSBzaXplb2Yoc3RydWN0IHpvYmpfaGVhZGVyKQorICogc2luY2Ugb3RoZXJ3aXNlIHh2X21hbGxvYyB3b3VsZCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgKi8KKworLyotLSBFbmQgb2YgY29uZmlndXJhYmxlIHBhcmFtcyAqLworCisjZGVmaW5lIFNFQ1RPUl9TSElGVAkJOQorI2RlZmluZSBTRUNUT1JfU0laRQkJKDEgPDwgU0VDVE9SX1NISUZUKQorI2RlZmluZSBTRUNUT1JTX1BFUl9QQUdFX1NISUZUCShQQUdFX1NISUZUIC0gU0VDVE9SX1NISUZUKQorI2RlZmluZSBTRUNUT1JTX1BFUl9QQUdFCSgxIDw8IFNFQ1RPUlNfUEVSX1BBR0VfU0hJRlQpCisKKy8qIERlYnVnZ2luZyBhbmQgU3RhdHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKKyNkZWZpbmUgc3RhdF9pbmMoc3RhdCkJKChzdGF0KSsrKQorI2RlZmluZSBzdGF0X2RlYyhzdGF0KQkoKHN0YXQpLS0pCisjZWxzZQorI2RlZmluZSBzdGF0X2luYyh4KQorI2RlZmluZSBzdGF0X2RlYyh4KQorI2VuZGlmCisKKy8qIEZsYWdzIGZvciByYW16c3dhcCBwYWdlcyAodGFibGVbcGFnZV9ub10uZmxhZ3MpICovCitlbnVtIHJ6c19wYWdlZmxhZ3MgeworCS8qIFBhZ2UgaXMgc3RvcmVkIHVuY29tcHJlc3NlZCAqLworCVJaU19VTkNPTVBSRVNTRUQsCisKKwkvKiBQYWdlIGNvbnNpc3RzIGVudGlyZWx5IG9mIHplcm9zICovCisJUlpTX1pFUk8sCisKKwlfX05SX1JaU19QQUdFRkxBR1MsCit9OworCisvKi0tIERhdGEgc3RydWN0dXJlcyAqLworCisvKgorICogQWxsb2NhdGVkIGZvciBlYWNoIHN3YXAgc2xvdCwgaW5kZXhlZCBieSBwYWdlIG5vLgorICogVGhlc2UgdGFibGUgZW50cmllcyBtdXN0IGZpdCBleGFjdGx5IGluIGEgcGFnZS4KKyAqLworc3RydWN0IHRhYmxlIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1MTYgb2Zmc2V0OworCXU4IGNvdW50OwkvKiBvYmplY3QgcmVmIGNvdW50IChub3QgeWV0IHVzZWQpICovCisJdTggZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTs7CisKKy8qCisgKiBTd2FwIGV4dGVudCBpbmZvcm1hdGlvbiBpbiBjYXNlIGJhY2tpbmcgc3dhcCBpcyBhIHJlZ3VsYXIKKyAqIGZpbGUuIFRoZXNlIGV4dGVudCBlbnRyaWVzIG11c3QgZml0IGV4YWN0bHkgaW4gYSBwYWdlLgorICovCitzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgeworCXBnb2ZmX3QgcGh5X3BhZ2VudW07CisJcGdvZmZfdCBudW1fcGFnZXM7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKKworc3RydWN0IHJhbXpzd2FwX3N0YXRzIHsKKwkvKiBiYXNpYyBzdGF0cyAqLworCXNpemVfdCBjb21wcl9zaXplOwkvKiBjb21wcmVzc2VkIHNpemUgb2YgcGFnZXMgc3RvcmVkIC0KKwkJCQkgKiBuZWVkZWQgdG8gZW5mb3JjZSBtZW1saW1pdCAqLworCS8qIG1vcmUgc3RhdHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19SQU1aU1dBUF9TVEFUUykKKwl1NjQgbnVtX3JlYWRzOwkJLyogZmFpbGVkICsgc3VjY2Vzc2Z1bCAqLworCXU2NCBudW1fd3JpdGVzOwkJLyogLS1kby0tICovCisJdTY0IGZhaWxlZF9yZWFkczsJLyogY2FuIGhhcHBlbiB3aGVuIG1lbW9yeSBpcyB0b28gbG93ICovCisJdTY0IGZhaWxlZF93cml0ZXM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCisJdTY0IGludmFsaWRfaW87CQkvKiBub24tc3dhcCBJL08gcmVxdWVzdHMgKi8KKwl1MzIgcGFnZXNfemVybzsJCS8qIG5vLiBvZiB6ZXJvIGZpbGxlZCBwYWdlcyAqLworCXUzMiBwYWdlc19zdG9yZWQ7CS8qIG5vLiBvZiBwYWdlcyBjdXJyZW50bHkgc3RvcmVkICovCisJdTMyIGdvb2RfY29tcHJlc3M7CS8qICUgb2YgcGFnZXMgd2l0aCBjb21wcmVzc2lvbiByYXRpbzw9NTAlICovCisJdTMyIHBhZ2VzX2V4cGFuZDsJLyogJSBvZiBpbmNvbXByZXNzaWJsZSBwYWdlcyAqLworCXU2NCBiZGV2X251bV9yZWFkczsJLyogbm8uIG9mIHJlYWRzIG9uIGJhY2tpbmcgZGV2ICovCisJdTY0IGJkZXZfbnVtX3dyaXRlczsJLyogbm8uIG9mIHdyaXRlcyBvbiBiYWNraW5nIGRldiAqLworI2VuZGlmCit9OworCitzdHJ1Y3QgcmFtenN3YXAgeworCXN0cnVjdCB4dl9wb29sICptZW1fcG9vbDsKKwl2b2lkICpjb21wcmVzc193b3JrbWVtOworCXZvaWQgKmNvbXByZXNzX2J1ZmZlcjsKKwlzdHJ1Y3QgdGFibGUgKnRhYmxlOworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlpbnQgaW5pdF9kb25lOworCS8qCisJICogVGhpcyBpcyBsaW1pdCBvbiBjb21wcmVzc2VkIGRhdGEgc2l6ZSAoc3RhdHMuY29tcHJfc2l6ZSkKKwkgKiBJdHMgYXBwbGljYWJsZSBvbmx5IHdoZW4gYmFja2luZyBzd2FwIGRldmljZSBpcyBwcmVzZW50LgorCSAqLworCXNpemVfdCBtZW1saW1pdDsJLyogYnl0ZXMgKi8KKwkvKgorCSAqIFRoaXMgaXMgbGltaXQgb24gYW1vdW50IG9mICp1bmNvbXByZXNzZWQqIHdvcnRoIG9mIGRhdGEKKwkgKiB3ZSBjYW4gaG9sZC4gV2hlbiBiYWNraW5nIHN3YXAgZGV2aWNlIGlzIHByb3ZpZGVkLCBpdCBpcworCSAqIHNldCBlcXVhbCB0byBkZXZpY2Ugc2l6ZS4KKwkgKi8KKwlzaXplX3QgZGlza3NpemU7CS8qIGJ5dGVzICovCisKKwlzdHJ1Y3QgcmFtenN3YXBfc3RhdHMgc3RhdHM7CisKKwkvKiBiYWNraW5nIHN3YXAgZGV2aWNlIGluZm8gKi8KKwlzdHJ1Y3QgcmFtenN3YXBfYmFja2luZ19leHRlbnQgKmN1cnJfZXh0ZW50OworCXN0cnVjdCBsaXN0X2hlYWQgYmFja2luZ19zd2FwX2V4dGVudF9saXN0OworCXVuc2lnbmVkIGxvbmcgbnVtX2V4dGVudHM7CisJY2hhciBiYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTl07CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmFja2luZ19zd2FwOworCXN0cnVjdCBmaWxlICpzd2FwX2ZpbGU7Cit9OworCisvKi0tICovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC9yYW16c3dhcF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTNhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAvcmFtenN3YXBfaW9jdGwuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29tcHJlc3NlZCBSQU0gYmFzZWQgc3dhcCBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgIE5pdGluIEd1cHRhCisgKgorICogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVzaW5nIGEgZHVhbCBsaWNlbnNlIHN0cmF0ZWd5OiBCU0QvR1BMCisgKiBZb3UgY2FuIGNob29zZSB0aGUgbGljZW5jZSB0aGF0IGJldHRlciBmaXRzIHlvdXIgcmVxdWlyZW1lbnRzLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiAzLWNsYXVzZSBCU0QgTGljZW5zZQorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wCisgKgorICogUHJvamVjdCBob21lOiBodHRwOi8vY29tcGNhY2hlLmdvb2dsZWNvZGUuY29tCisgKi8KKworI2lmbmRlZiBfUkFNWlNXQVBfSU9DVExfSF8KKyNkZWZpbmUgX1JBTVpTV0FQX0lPQ1RMX0hfCisKKyNkZWZpbmUgTUFYX1NXQVBfTkFNRV9MRU4gMTI4CisKK3N0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cyB7CisJY2hhciBiYWNraW5nX3N3YXBfbmFtZVtNQVhfU1dBUF9OQU1FX0xFTl07CisJdTY0IG1lbWxpbWl0OwkJLyogb25seSBhcHBsaWNhYmxlIGlmIGJhY2tpbmcgc3dhcCBwcmVzZW50ICovCisJdTY0IGRpc2tzaXplOwkJLyogdXNlciBzcGVjaWZpZWQgb3IgZXF1YWwgdG8gYmFja2luZyBzd2FwCisJCQkJICogc2l6ZSAoaWYgcHJlc2VudCkgKi8KKwl1NjQgbnVtX3JlYWRzOwkJLyogZmFpbGVkICsgc3VjY2Vzc2Z1bCAqLworCXU2NCBudW1fd3JpdGVzOwkJLyogLS1kby0tICovCisJdTY0IGZhaWxlZF9yZWFkczsJLyogY2FuIGhhcHBlbiB3aGVuIG1lbW9yeSBpcyB0b28gbG93ICovCisJdTY0IGZhaWxlZF93cml0ZXM7CS8qIHNob3VsZCBORVZFUiEgaGFwcGVuICovCisJdTY0IGludmFsaWRfaW87CQkvKiBub24tc3dhcCBJL08gcmVxdWVzdHMgKi8KKwl1MzIgcGFnZXNfemVybzsJCS8qIG5vLiBvZiB6ZXJvIGZpbGxlZCBwYWdlcyAqLworCXUzMiBnb29kX2NvbXByZXNzX3BjdDsJLyogbm8uIG9mIHBhZ2VzIHdpdGggY29tcHJlc3Npb24gcmF0aW88PTUwJSAqLworCXUzMiBwYWdlc19leHBhbmRfcGN0OwkvKiBuby4gb2YgaW5jb21wcmVzc2libGUgcGFnZXMgKi8KKwl1MzIgcGFnZXNfc3RvcmVkOworCXUzMiBwYWdlc191c2VkOworCXU2NCBvcmlnX2RhdGFfc2l6ZTsKKwl1NjQgY29tcHJfZGF0YV9zaXplOworCXU2NCBtZW1fdXNlZF90b3RhbDsKKwl1NjQgYmRldl9udW1fcmVhZHM7CS8qIG5vLiBvZiByZWFkcyBvbiBiYWNraW5nIGRldiAqLworCXU2NCBiZGV2X251bV93cml0ZXM7CS8qIG5vLiBvZiB3cml0ZXMgb24gYmFja2luZyBkZXYgKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCg0KSkpOworCisjZGVmaW5lIFJaU0lPX1NFVF9ESVNLU0laRV9LQglfSU9XKCd6JywgMCwgc2l6ZV90KQorI2RlZmluZSBSWlNJT19TRVRfTUVNTElNSVRfS0IJX0lPVygneicsIDEsIHNpemVfdCkKKyNkZWZpbmUgUlpTSU9fU0VUX0JBQ0tJTkdfU1dBUAlfSU9XKCd6JywgMiwgdW5zaWduZWQgY2hhcltNQVhfU1dBUF9OQU1FX0xFTl0pCisjZGVmaW5lIFJaU0lPX0dFVF9TVEFUUwkJX0lPUigneicsIDMsIHN0cnVjdCByYW16c3dhcF9pb2N0bF9zdGF0cykKKyNkZWZpbmUgUlpTSU9fSU5JVAkJX0lPKCd6JywgNCkKKyNkZWZpbmUgUlpTSU9fUkVTRVQJCV9JTygneicsIDUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFtenN3YXAveHZtYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U5ODZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmMKQEAgLTAsMCArMSw1MDcgQEAKKy8qCisgKiB4dm1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAieHZtYWxsb2MuaCIKKyNpbmNsdWRlICJ4dm1hbGxvY19pbnQuaCIKKworc3RhdGljIHZvaWQgc3RhdF9pbmModTY0ICp2YWx1ZSkKK3sKKwkqdmFsdWUgPSAqdmFsdWUgKyAxOworfQorCitzdGF0aWMgdm9pZCBzdGF0X2RlYyh1NjQgKnZhbHVlKQoreworCSp2YWx1ZSA9ICp2YWx1ZSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9mbGFnKHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCBlbnVtIGJsb2NrZmxhZ3MgZmxhZykKK3sKKwlyZXR1cm4gYmxvY2stPnByZXYgJiBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbGFnKHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCBlbnVtIGJsb2NrZmxhZ3MgZmxhZykKK3sKKwlibG9jay0+cHJldiB8PSBCSVQoZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2ZsYWcoc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssIGVudW0gYmxvY2tmbGFncyBmbGFnKQoreworCWJsb2NrLT5wcmV2ICY9IH5CSVQoZmxhZyk7Cit9CisKKy8qCisgKiBHaXZlbiA8cGFnZSwgb2Zmc2V0PiBwYWlyLCBwcm92aWRlIGEgZGVyZWZyZW5jYWJsZSBwb2ludGVyLgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB4dl9tYWxsb2MveHZfZnJlZSBwYXRoLCBzbyBpdAorICogbmVlZHMgdG8gYmUgZmFzdC4KKyAqLworc3RhdGljIHZvaWQgKmdldF9wdHJfYXRvbWljKHN0cnVjdCBwYWdlICpwYWdlLCB1MTYgb2Zmc2V0LCBlbnVtIGttX3R5cGUgdHlwZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpiYXNlOworCisJYmFzZSA9IGttYXBfYXRvbWljKHBhZ2UsIHR5cGUpOworCXJldHVybiBiYXNlICsgb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBwdXRfcHRyX2F0b21pYyh2b2lkICpwdHIsIGVudW0ga21fdHlwZSB0eXBlKQoreworCWt1bm1hcF9hdG9taWMocHRyLCB0eXBlKTsKK30KKworc3RhdGljIHUzMiBnZXRfYmxvY2twcmV2KHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrKQoreworCXJldHVybiBibG9jay0+cHJldiAmIFBSRVZfTUFTSzsKK30KKworc3RhdGljIHZvaWQgc2V0X2Jsb2NrcHJldihzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgdTE2IG5ld19vZmZzZXQpCit7CisJYmxvY2stPnByZXYgPSBuZXdfb2Zmc2V0IHwgKGJsb2NrLT5wcmV2ICYgRkxBR1NfTUFTSyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfaGVhZGVyICpCTE9DS19ORVhUKHN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrKQoreworCXJldHVybiAoc3RydWN0IGJsb2NrX2hlYWRlciAqKQorCQkoKGNoYXIgKilibG9jayArIGJsb2NrLT5zaXplICsgWFZfQUxJR04pOworfQorCisvKgorICogR2V0IGluZGV4IG9mIGZyZWUgbGlzdCBjb250YWluaW5nIGJsb2NrcyBvZiBtYXhpbXVtIHNpemUKKyAqIHdoaWNoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBnaXZlbiBzaXplLgorICovCitzdGF0aWMgdTMyIGdldF9pbmRleF9mb3JfaW5zZXJ0KHUzMiBzaXplKQoreworCWlmICh1bmxpa2VseShzaXplID4gWFZfTUFYX0FMTE9DX1NJWkUpKQorCQlzaXplID0gWFZfTUFYX0FMTE9DX1NJWkU7CisJc2l6ZSAmPSB+RkxfREVMVEFfTUFTSzsKKwlyZXR1cm4gKHNpemUgLSBYVl9NSU5fQUxMT0NfU0laRSkgPj4gRkxfREVMVEFfU0hJRlQ7Cit9CisKKy8qCisgKiBHZXQgaW5kZXggb2YgZnJlZSBsaXN0IGhhdmluZyBibG9ja3Mgb2Ygc2l6ZSBncmVhdGVyIHRoYW4KKyAqIG9yIGVxdWFsIHRvIHJlcXVlc3RlZCBzaXplLgorICovCitzdGF0aWMgdTMyIGdldF9pbmRleCh1MzIgc2l6ZSkKK3sKKwlpZiAodW5saWtlbHkoc2l6ZSA8IFhWX01JTl9BTExPQ19TSVpFKSkKKwkJc2l6ZSA9IFhWX01JTl9BTExPQ19TSVpFOworCXNpemUgPSBBTElHTihzaXplLCBGTF9ERUxUQSk7CisJcmV0dXJuIChzaXplIC0gWFZfTUlOX0FMTE9DX1NJWkUpID4+IEZMX0RFTFRBX1NISUZUOworfQorCisvKioKKyAqIGZpbmRfYmxvY2sgLSBmaW5kIGJsb2NrIG9mIGF0IGxlYXN0IGdpdmVuIHNpemUKKyAqIEBwb29sOiBtZW1vcnkgcG9vbCB0byBzZWFyY2ggZnJvbQorICogQHNpemU6IHNpemUgb2YgYmxvY2sgcmVxdWlyZWQKKyAqIEBwYWdlOiBwYWdlIGNvbnRhaW5pbmcgcmVxdWlyZWQgYmxvY2sKKyAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugd2hlcmUgYmxvY2sgaXMgbG9jYXRlZC4KKyAqCisgKiBTZWFyY2hlcyB0d28gbGV2ZWwgYml0bWFwIHRvIGxvY2F0ZSBibG9jayBvZiBhdCBsZWFzdAorICogdGhlIGdpdmVuIHNpemUuIElmIHN1Y2ggYSBibG9jayBpcyBmb3VuZCwgaXQgcHJvdmlkZXMKKyAqIDxwYWdlLCBvZmZzZXQ+IHRvIGlkZW50aWZ5IHRoaXMgYmxvY2sgYW5kIHJldHVybnMgaW5kZXgKKyAqIGluIGZyZWVsaXN0IHdoZXJlIHdlIGZvdW5kIHRoaXMgYmxvY2suCisgKiBPdGhlcndpc2UsIHJldHVybnMgMCBhbmQgPHBhZ2UsIG9mZnNldD4gcGFyYW1zIGFyZSBub3QgdG91Y2hlZC4KKyAqLworc3RhdGljIHUzMiBmaW5kX2Jsb2NrKHN0cnVjdCB4dl9wb29sICpwb29sLCB1MzIgc2l6ZSwKKwkJCXN0cnVjdCBwYWdlICoqcGFnZSwgdTMyICpvZmZzZXQpCit7CisJdWxvbmcgZmxiaXRtYXAsIHNsYml0bWFwOworCXUzMiBmbGluZGV4LCBzbGluZGV4LCBzbGJpdHN0YXJ0OworCisJLyogVGhlcmUgYXJlIG5vIGZyZWUgYmxvY2tzIGluIHRoaXMgcG9vbCAqLworCWlmICghcG9vbC0+ZmxiaXRtYXApCisJCXJldHVybiAwOworCisJLyogR2V0IGZyZWVsaXN0IGluZGV4IGNvcnJlc3BvZGluZyB0byB0aGlzIHNpemUgKi8KKwlzbGluZGV4ID0gZ2V0X2luZGV4KHNpemUpOworCXNsYml0bWFwID0gcG9vbC0+c2xiaXRtYXBbc2xpbmRleCAvIEJJVFNfUEVSX0xPTkddOworCXNsYml0c3RhcnQgPSBzbGluZGV4ICUgQklUU19QRVJfTE9ORzsKKworCS8qCisJICogSWYgZnJlZWxpc3QgaXMgbm90IGVtcHR5IGF0IHRoaXMgaW5kZXgsIHdlIGZvdW5kIHRoZQorCSAqIGJsb2NrIC0gaGVhZCBvZiB0aGlzIGxpc3QuIFRoaXMgaXMgYXBwcm94aW1hdGUgYmVzdC1maXQgbWF0Y2guCisJICovCisJaWYgKHRlc3RfYml0KHNsYml0c3RhcnQsICZzbGJpdG1hcCkpIHsKKwkJKnBhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOworCQkqb2Zmc2V0ID0gcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0OworCQlyZXR1cm4gc2xpbmRleDsKKwl9CisKKwkvKgorCSAqIE5vIGJlc3QtZml0IGZvdW5kLiBTZWFyY2ggYSBiaXQgZnVydGhlciBpbiBiaXRtYXAgZm9yIGEgZnJlZSBibG9jay4KKwkgKiBTZWNvbmQgbGV2ZWwgYml0bWFwIGNvbnNpc3RzIG9mIHNlcmllcyBvZiAzMi1iaXQgY2h1bmtzLiBTZWFyY2gKKwkgKiBmdXJ0aGVyIGluIHRoZSBjaHVuayB3aGVyZSB3ZSBleHBlY3RlZCBhIGJlc3QtZml0LCBzdGFydGluZyBmcm9tCisJICogaW5kZXggbG9jYXRpb24gZm91bmQgYWJvdmUuCisJICovCisJc2xiaXRzdGFydCsrOworCXNsYml0bWFwID4+PSBzbGJpdHN0YXJ0OworCisJLyogU2tpcCB0aGlzIHNlYXJjaCBpZiB3ZSB3ZXJlIGFscmVhZHkgYXQgZW5kIG9mIHRoaXMgYml0bWFwIGNodW5rICovCisJaWYgKChzbGJpdHN0YXJ0ICE9IEJJVFNfUEVSX0xPTkcpICYmIHNsYml0bWFwKSB7CisJCXNsaW5kZXggKz0gX19mZnMoc2xiaXRtYXApICsgMTsKKwkJKnBhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOworCQkqb2Zmc2V0ID0gcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0OworCQlyZXR1cm4gc2xpbmRleDsKKwl9CisKKwkvKiBOb3cgZG8gYSBmdWxsIHR3by1sZXZlbCBiaXRtYXAgc2VhcmNoIHRvIGZpbmQgbmV4dCBuZWFyZXN0IGZpdCAqLworCWZsaW5kZXggPSBzbGluZGV4IC8gQklUU19QRVJfTE9ORzsKKworCWZsYml0bWFwID0gKHBvb2wtPmZsYml0bWFwKSA+PiAoZmxpbmRleCArIDEpOworCWlmICghZmxiaXRtYXApCisJCXJldHVybiAwOworCisJZmxpbmRleCArPSBfX2ZmcyhmbGJpdG1hcCkgKyAxOworCXNsYml0bWFwID0gcG9vbC0+c2xiaXRtYXBbZmxpbmRleF07CisJc2xpbmRleCA9IChmbGluZGV4ICogQklUU19QRVJfTE9ORykgKyBfX2ZmcyhzbGJpdG1hcCk7CisJKnBhZ2UgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5wYWdlOworCSpvZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CisKKwlyZXR1cm4gc2xpbmRleDsKK30KKworLyoKKyAqIEluc2VydCBibG9jayBhdCA8cGFnZSwgb2Zmc2V0PiBpbiBmcmVlbGlzdCBvZiBnaXZlbiBwb29sLgorICogZnJlZWxpc3QgdXNlZCBkZXBlbmRzIG9uIGJsb2NrIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIGluc2VydF9ibG9jayhzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBvZmZzZXQsCisJCQlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaykKK3sKKwl1MzIgZmxpbmRleCwgc2xpbmRleDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpuZXh0YmxvY2s7CisKKwlzbGluZGV4ID0gZ2V0X2luZGV4X2Zvcl9pbnNlcnQoYmxvY2stPnNpemUpOworCWZsaW5kZXggPSBzbGluZGV4IC8gQklUU19QRVJfTE9ORzsKKworCWJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJYmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSAwOworCWJsb2NrLT5saW5rLm5leHRfcGFnZSA9IHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2U7CisJYmxvY2stPmxpbmsubmV4dF9vZmZzZXQgPSBwb29sLT5mcmVlbGlzdFtzbGluZGV4XS5vZmZzZXQ7CisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ucGFnZSA9IHBhZ2U7CisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID0gb2Zmc2V0OworCisJaWYgKGJsb2NrLT5saW5rLm5leHRfcGFnZSkgeworCQluZXh0YmxvY2sgPSBnZXRfcHRyX2F0b21pYyhibG9jay0+bGluay5uZXh0X3BhZ2UsCisJCQkJCWJsb2NrLT5saW5rLm5leHRfb2Zmc2V0LCBLTV9VU0VSMSk7CisJCW5leHRibG9jay0+bGluay5wcmV2X3BhZ2UgPSBwYWdlOworCQluZXh0YmxvY2stPmxpbmsucHJldl9vZmZzZXQgPSBvZmZzZXQ7CisJCXB1dF9wdHJfYXRvbWljKG5leHRibG9jaywgS01fVVNFUjEpOworCX0KKworCV9fc2V0X2JpdChzbGluZGV4ICUgQklUU19QRVJfTE9ORywgJnBvb2wtPnNsYml0bWFwW2ZsaW5kZXhdKTsKKwlfX3NldF9iaXQoZmxpbmRleCwgJnBvb2wtPmZsYml0bWFwKTsKK30KKworLyoKKyAqIFJlbW92ZSBibG9jayBmcm9tIGhlYWQgb2YgZnJlZWxpc3QuIEluZGV4ICdzbGluZGV4JyBpZGVudGlmaWVzIHRoZSBmcmVlbGlzdC4KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2Jsb2NrX2hlYWQoc3RydWN0IHh2X3Bvb2wgKnBvb2wsCisJCQlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgdTMyIHNsaW5kZXgpCit7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqdG1wYmxvY2s7CisJdTMyIGZsaW5kZXggPSBzbGluZGV4IC8gQklUU19QRVJfTE9ORzsKKworCXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UgPSBibG9jay0+bGluay5uZXh0X3BhZ2U7CisJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0ID0gYmxvY2stPmxpbmsubmV4dF9vZmZzZXQ7CisJYmxvY2stPmxpbmsucHJldl9wYWdlID0gMDsKKwlibG9jay0+bGluay5wcmV2X29mZnNldCA9IDA7CisKKwlpZiAoIXBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UpIHsKKwkJX19jbGVhcl9iaXQoc2xpbmRleCAlIEJJVFNfUEVSX0xPTkcsICZwb29sLT5zbGJpdG1hcFtmbGluZGV4XSk7CisJCWlmICghcG9vbC0+c2xiaXRtYXBbZmxpbmRleF0pCisJCQlfX2NsZWFyX2JpdChmbGluZGV4LCAmcG9vbC0+ZmxiaXRtYXApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIERFQlVHIE9OTFk6IFdlIG5lZWQgbm90IHJlaW5pdGlhbGl6ZSBmcmVlbGlzdCBoZWFkIHByZXZpb3VzCisJCSAqIHBvaW50ZXIgdG8gMCAtIHdlIG5ldmVyIGRlcGVuZCBvbiBpdHMgdmFsdWUuIEJ1dCBqdXN0IGZvcgorCQkgKiBzYW5pdHksIGxldHMgZG8gaXQuCisJCSAqLworCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UsCisJCQkJcG9vbC0+ZnJlZWxpc3Rbc2xpbmRleF0ub2Zmc2V0LCBLTV9VU0VSMSk7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfcGFnZSA9IDA7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gMDsKKwkJcHV0X3B0cl9hdG9taWModG1wYmxvY2ssIEtNX1VTRVIxKTsKKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgYmxvY2sgZnJvbSBmcmVlbGlzdC4gSW5kZXggJ3NsaW5kZXgnIGlkZW50aWZpZXMgdGhlIGZyZWVsaXN0LgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfYmxvY2soc3RydWN0IHh2X3Bvb2wgKnBvb2wsIHN0cnVjdCBwYWdlICpwYWdlLCB1MzIgb2Zmc2V0LAorCQkJc3RydWN0IGJsb2NrX2hlYWRlciAqYmxvY2ssIHUzMiBzbGluZGV4KQoreworCXUzMiBmbGluZGV4OworCXN0cnVjdCBibG9ja19oZWFkZXIgKnRtcGJsb2NrOworCisJaWYgKHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLnBhZ2UgPT0gcGFnZQorCSAgICYmIHBvb2wtPmZyZWVsaXN0W3NsaW5kZXhdLm9mZnNldCA9PSBvZmZzZXQpIHsKKwkJcmVtb3ZlX2Jsb2NrX2hlYWQocG9vbCwgYmxvY2ssIHNsaW5kZXgpOworCQlyZXR1cm47CisJfQorCisJZmxpbmRleCA9IHNsaW5kZXggLyBCSVRTX1BFUl9MT05HOworCisJaWYgKGJsb2NrLT5saW5rLnByZXZfcGFnZSkgeworCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKGJsb2NrLT5saW5rLnByZXZfcGFnZSwKKwkJCQlibG9jay0+bGluay5wcmV2X29mZnNldCwgS01fVVNFUjEpOworCQl0bXBibG9jay0+bGluay5uZXh0X3BhZ2UgPSBibG9jay0+bGluay5uZXh0X3BhZ2U7CisJCXRtcGJsb2NrLT5saW5rLm5leHRfb2Zmc2V0ID0gYmxvY2stPmxpbmsubmV4dF9vZmZzZXQ7CisJCXB1dF9wdHJfYXRvbWljKHRtcGJsb2NrLCBLTV9VU0VSMSk7CisJfQorCisJaWYgKGJsb2NrLT5saW5rLm5leHRfcGFnZSkgeworCQl0bXBibG9jayA9IGdldF9wdHJfYXRvbWljKGJsb2NrLT5saW5rLm5leHRfcGFnZSwKKwkJCQlibG9jay0+bGluay5uZXh0X29mZnNldCwgS01fVVNFUjEpOworCQl0bXBibG9jay0+bGluay5wcmV2X3BhZ2UgPSBibG9jay0+bGluay5wcmV2X3BhZ2U7CisJCXRtcGJsb2NrLT5saW5rLnByZXZfb2Zmc2V0ID0gYmxvY2stPmxpbmsucHJldl9vZmZzZXQ7CisJCXB1dF9wdHJfYXRvbWljKHRtcGJsb2NrLCBLTV9VU0VSMSk7CisJfQorfQorCisvKgorICogQWxsb2NhdGUgYSBwYWdlIGFuZCBhZGQgaXQgZnJlZWxpc3Qgb2YgZ2l2ZW4gcG9vbC4KKyAqLworc3RhdGljIGludCBncm93X3Bvb2woc3RydWN0IHh2X3Bvb2wgKnBvb2wsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoZmxhZ3MpOworCWlmICh1bmxpa2VseSghcGFnZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJc3RhdF9pbmMoJnBvb2wtPnRvdGFsX3BhZ2VzKTsKKworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisJYmxvY2sgPSBnZXRfcHRyX2F0b21pYyhwYWdlLCAwLCBLTV9VU0VSMCk7CisKKwlibG9jay0+c2l6ZSA9IFBBR0VfU0laRSAtIFhWX0FMSUdOOworCXNldF9mbGFnKGJsb2NrLCBCTE9DS19GUkVFKTsKKwljbGVhcl9mbGFnKGJsb2NrLCBQUkVWX0ZSRUUpOworCXNldF9ibG9ja3ByZXYoYmxvY2ssIDApOworCisJaW5zZXJ0X2Jsb2NrKHBvb2wsIHBhZ2UsIDAsIGJsb2NrKTsKKworCXB1dF9wdHJfYXRvbWljKGJsb2NrLCBLTV9VU0VSMCk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBtZW1vcnkgcG9vbC4gQWxsb2NhdGVzIGZyZWVsaXN0LCBiaXRtYXBzIGFuZCBvdGhlcgorICogcGVyLXBvb2wgbWV0YWRhdGEuCisgKi8KK3N0cnVjdCB4dl9wb29sICp4dl9jcmVhdGVfcG9vbCh2b2lkKQoreworCXUzMiBvdmhkX3NpemU7CisJc3RydWN0IHh2X3Bvb2wgKnBvb2w7CisKKwlvdmhkX3NpemUgPSByb3VuZHVwKHNpemVvZigqcG9vbCksIFBBR0VfU0laRSk7CisJcG9vbCA9IGt6YWxsb2Mob3ZoZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvb2wpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOworCisJcmV0dXJuIHBvb2w7Cit9CisKK3ZvaWQgeHZfZGVzdHJveV9wb29sKHN0cnVjdCB4dl9wb29sICpwb29sKQoreworCWtmcmVlKHBvb2wpOworfQorCisvKioKKyAqIHh2X21hbGxvYyAtIEFsbG9jYXRlIGJsb2NrIG9mIGdpdmVuIHNpemUgZnJvbSBwb29sLgorICogQHBvb2w6IHBvb2wgdG8gYWxsb2NhdGUgZnJvbQorICogQHNpemU6IHNpemUgb2YgYmxvY2sgdG8gYWxsb2NhdGUKKyAqIEBwYWdlOiBwYWdlIG5vLiB0aGF0IGhvbGRzIHRoZSBvYmplY3QKKyAqIEBvZmZzZXQ6IGxvY2F0aW9uIG9mIG9iamVjdCB3aXRoaW4gcGFnZQorICoKKyAqIE9uIHN1Y2Nlc3MsIDxwYWdlLCBvZmZzZXQ+IGlkZW50aWZpZXMgYmxvY2sgYWxsb2NhdGVkCisgKiBhbmQgMCBpcyByZXR1cm5lZC4gT24gZmFpbHVyZSwgPHBhZ2UsIG9mZnNldD4gaXMgc2V0IHRvCisgKiAwIGFuZCAtRU5PTUVNIGlzIHJldHVybmVkLgorICoKKyAqIEFsbG9jYXRpb24gcmVxdWVzdHMgd2l0aCBzaXplID4gWFZfTUFYX0FMTE9DX1NJWkUgd2lsbCBmYWlsLgorICovCitpbnQgeHZfbWFsbG9jKHN0cnVjdCB4dl9wb29sICpwb29sLCB1MzIgc2l6ZSwgc3RydWN0IHBhZ2UgKipwYWdlLAorCQl1MzIgKm9mZnNldCwgZ2ZwX3QgZmxhZ3MpCit7CisJaW50IGVycm9yOworCXUzMiBpbmRleCwgdG1wc2l6ZSwgb3JpZ3NpemUsIHRtcG9mZnNldDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZGVyICpibG9jaywgKnRtcGJsb2NrOworCisJKnBhZ2UgPSBOVUxMOworCSpvZmZzZXQgPSAwOworCW9yaWdzaXplID0gc2l6ZTsKKworCWlmICh1bmxpa2VseSghc2l6ZSB8fCBzaXplID4gWFZfTUFYX0FMTE9DX1NJWkUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSBBTElHTihzaXplLCBYVl9BTElHTik7CisKKwlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCisJaW5kZXggPSBmaW5kX2Jsb2NrKHBvb2wsIHNpemUsIHBhZ2UsIG9mZnNldCk7CisKKwlpZiAoISpwYWdlKSB7CisJCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKKwkJaWYgKGZsYWdzICYgR0ZQX05PV0FJVCkKKwkJCXJldHVybiAtRU5PTUVNOworCQllcnJvciA9IGdyb3dfcG9vbChwb29sLCBmbGFncyk7CisJCWlmICh1bmxpa2VseShlcnJvcikpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJc3Bpbl9sb2NrKCZwb29sLT5sb2NrKTsKKwkJaW5kZXggPSBmaW5kX2Jsb2NrKHBvb2wsIHNpemUsIHBhZ2UsIG9mZnNldCk7CisJfQorCisJaWYgKCEqcGFnZSkgeworCQlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJsb2NrID0gZ2V0X3B0cl9hdG9taWMoKnBhZ2UsICpvZmZzZXQsIEtNX1VTRVIwKTsKKworCXJlbW92ZV9ibG9ja19oZWFkKHBvb2wsIGJsb2NrLCBpbmRleCk7CisKKwkvKiBTcGxpdCB0aGUgYmxvY2sgaWYgcmVxdWlyZWQgKi8KKwl0bXBvZmZzZXQgPSAqb2Zmc2V0ICsgc2l6ZSArIFhWX0FMSUdOOworCXRtcHNpemUgPSBibG9jay0+c2l6ZSAtIHNpemU7CisJdG1wYmxvY2sgPSAoc3RydWN0IGJsb2NrX2hlYWRlciAqKSgoY2hhciAqKWJsb2NrICsgc2l6ZSArIFhWX0FMSUdOKTsKKwlpZiAodG1wc2l6ZSkgeworCQl0bXBibG9jay0+c2l6ZSA9IHRtcHNpemUgLSBYVl9BTElHTjsKKwkJc2V0X2ZsYWcodG1wYmxvY2ssIEJMT0NLX0ZSRUUpOworCQljbGVhcl9mbGFnKHRtcGJsb2NrLCBQUkVWX0ZSRUUpOworCisJCXNldF9ibG9ja3ByZXYodG1wYmxvY2ssICpvZmZzZXQpOworCQlpZiAodG1wYmxvY2stPnNpemUgPj0gWFZfTUlOX0FMTE9DX1NJWkUpCisJCQlpbnNlcnRfYmxvY2socG9vbCwgKnBhZ2UsIHRtcG9mZnNldCwgdG1wYmxvY2spOworCisJCWlmICh0bXBvZmZzZXQgKyBYVl9BTElHTiArIHRtcGJsb2NrLT5zaXplICE9IFBBR0VfU0laRSkgeworCQkJdG1wYmxvY2sgPSBCTE9DS19ORVhUKHRtcGJsb2NrKTsKKwkJCXNldF9ibG9ja3ByZXYodG1wYmxvY2ssIHRtcG9mZnNldCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGJsb2NrIGlzIGV4YWN0IGZpdCAqLworCQlpZiAodG1wb2Zmc2V0ICE9IFBBR0VfU0laRSkKKwkJCWNsZWFyX2ZsYWcodG1wYmxvY2ssIFBSRVZfRlJFRSk7CisJfQorCisJYmxvY2stPnNpemUgPSBvcmlnc2l6ZTsKKwljbGVhcl9mbGFnKGJsb2NrLCBCTE9DS19GUkVFKTsKKworCXB1dF9wdHJfYXRvbWljKGJsb2NrLCBLTV9VU0VSMCk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCisJKm9mZnNldCArPSBYVl9BTElHTjsKKworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBibG9jayBpZGVudGlmaWVkIHdpdGggPHBhZ2UsIG9mZnNldD4KKyAqLwordm9pZCB4dl9mcmVlKHN0cnVjdCB4dl9wb29sICpwb29sLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdTMyIG9mZnNldCkKK3sKKwl2b2lkICpwYWdlX3N0YXJ0OworCXN0cnVjdCBibG9ja19oZWFkZXIgKmJsb2NrLCAqdG1wYmxvY2s7CisKKwlvZmZzZXQgLT0gWFZfQUxJR047CisKKwlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCisJcGFnZV9zdGFydCA9IGdldF9wdHJfYXRvbWljKHBhZ2UsIDAsIEtNX1VTRVIwKTsKKwlibG9jayA9IChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopKChjaGFyICopcGFnZV9zdGFydCArIG9mZnNldCk7CisKKwkvKiBDYXRjaCBkb3VibGUgZnJlZSBidWdzICovCisJQlVHX09OKHRlc3RfZmxhZyhibG9jaywgQkxPQ0tfRlJFRSkpOworCisJYmxvY2stPnNpemUgPSBBTElHTihibG9jay0+c2l6ZSwgWFZfQUxJR04pOworCisJdG1wYmxvY2sgPSBCTE9DS19ORVhUKGJsb2NrKTsKKwlpZiAob2Zmc2V0ICsgYmxvY2stPnNpemUgKyBYVl9BTElHTiA9PSBQQUdFX1NJWkUpCisJCXRtcGJsb2NrID0gTlVMTDsKKworCS8qIE1lcmdlIG5leHQgYmxvY2sgaWYgaXRzIGZyZWUgKi8KKwlpZiAodG1wYmxvY2sgJiYgdGVzdF9mbGFnKHRtcGJsb2NrLCBCTE9DS19GUkVFKSkgeworCQkvKgorCQkgKiBCbG9ja3Mgc21hbGxlciB0aGFuIFhWX01JTl9BTExPQ19TSVpFCisJCSAqIGFyZSBub3QgaW5zZXJ0ZWQgaW4gYW55IGZyZWUgbGlzdC4KKwkJICovCisJCWlmICh0bXBibG9jay0+c2l6ZSA+PSBYVl9NSU5fQUxMT0NfU0laRSkgeworCQkJcmVtb3ZlX2Jsb2NrKHBvb2wsIHBhZ2UsCisJCQkJICAgIG9mZnNldCArIGJsb2NrLT5zaXplICsgWFZfQUxJR04sIHRtcGJsb2NrLAorCQkJCSAgICBnZXRfaW5kZXhfZm9yX2luc2VydCh0bXBibG9jay0+c2l6ZSkpOworCQl9CisJCWJsb2NrLT5zaXplICs9IHRtcGJsb2NrLT5zaXplICsgWFZfQUxJR047CisJfQorCisJLyogTWVyZ2UgcHJldmlvdXMgYmxvY2sgaWYgaXRzIGZyZWUgKi8KKwlpZiAodGVzdF9mbGFnKGJsb2NrLCBQUkVWX0ZSRUUpKSB7CisJCXRtcGJsb2NrID0gKHN0cnVjdCBibG9ja19oZWFkZXIgKikoKGNoYXIgKikocGFnZV9zdGFydCkgKworCQkJCQkJZ2V0X2Jsb2NrcHJldihibG9jaykpOworCQlvZmZzZXQgPSBvZmZzZXQgLSB0bXBibG9jay0+c2l6ZSAtIFhWX0FMSUdOOworCisJCWlmICh0bXBibG9jay0+c2l6ZSA+PSBYVl9NSU5fQUxMT0NfU0laRSkKKwkJCXJlbW92ZV9ibG9jayhwb29sLCBwYWdlLCBvZmZzZXQsIHRtcGJsb2NrLAorCQkJCSAgICBnZXRfaW5kZXhfZm9yX2luc2VydCh0bXBibG9jay0+c2l6ZSkpOworCisJCXRtcGJsb2NrLT5zaXplICs9IGJsb2NrLT5zaXplICsgWFZfQUxJR047CisJCWJsb2NrID0gdG1wYmxvY2s7CisJfQorCisJLyogTm8gdXNlZCBvYmplY3RzIGluIHRoaXMgcGFnZS4gRnJlZSBpdC4gKi8KKwlpZiAoYmxvY2stPnNpemUgPT0gUEFHRV9TSVpFIC0gWFZfQUxJR04pIHsKKwkJcHV0X3B0cl9hdG9taWMocGFnZV9zdGFydCwgS01fVVNFUjApOworCQlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CisKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXN0YXRfZGVjKCZwb29sLT50b3RhbF9wYWdlcyk7CisJCXJldHVybjsKKwl9CisKKwlzZXRfZmxhZyhibG9jaywgQkxPQ0tfRlJFRSk7CisJaWYgKGJsb2NrLT5zaXplID49IFhWX01JTl9BTExPQ19TSVpFKQorCQlpbnNlcnRfYmxvY2socG9vbCwgcGFnZSwgb2Zmc2V0LCBibG9jayk7CisKKwlpZiAob2Zmc2V0ICsgYmxvY2stPnNpemUgKyBYVl9BTElHTiAhPSBQQUdFX1NJWkUpIHsKKwkJdG1wYmxvY2sgPSBCTE9DS19ORVhUKGJsb2NrKTsKKwkJc2V0X2ZsYWcodG1wYmxvY2ssIFBSRVZfRlJFRSk7CisJCXNldF9ibG9ja3ByZXYodG1wYmxvY2ssIG9mZnNldCk7CisJfQorCisJcHV0X3B0cl9hdG9taWMocGFnZV9zdGFydCwgS01fVVNFUjApOworCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKK30KKwordTMyIHh2X2dldF9vYmplY3Rfc2l6ZSh2b2lkICpvYmopCit7CisJc3RydWN0IGJsb2NrX2hlYWRlciAqYmxrOworCisJYmxrID0gKHN0cnVjdCBibG9ja19oZWFkZXIgKikoKGNoYXIgKikob2JqKSAtIFhWX0FMSUdOKTsKKwlyZXR1cm4gYmxrLT5zaXplOworfQorCisvKgorICogUmV0dXJucyB0b3RhbCBtZW1vcnkgdXNlZCBieSBhbGxvY2F0b3IgKHVzZXJkYXRhICsgbWV0YWRhdGEpCisgKi8KK3U2NCB4dl9nZXRfdG90YWxfc2l6ZV9ieXRlcyhzdHJ1Y3QgeHZfcG9vbCAqcG9vbCkKK3sKKwlyZXR1cm4gcG9vbC0+dG90YWxfcGFnZXMgPDwgUEFHRV9TSElGVDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvYy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiB4dm1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICovCisKKyNpZm5kZWYgX1hWX01BTExPQ19IXworI2RlZmluZSBfWFZfTUFMTE9DX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgeHZfcG9vbDsKKworc3RydWN0IHh2X3Bvb2wgKnh2X2NyZWF0ZV9wb29sKHZvaWQpOwordm9pZCB4dl9kZXN0cm95X3Bvb2woc3RydWN0IHh2X3Bvb2wgKnBvb2wpOworCitpbnQgeHZfbWFsbG9jKHN0cnVjdCB4dl9wb29sICpwb29sLCB1MzIgc2l6ZSwgc3RydWN0IHBhZ2UgKipwYWdlLAorCQkJdTMyICpvZmZzZXQsIGdmcF90IGZsYWdzKTsKK3ZvaWQgeHZfZnJlZShzdHJ1Y3QgeHZfcG9vbCAqcG9vbCwgc3RydWN0IHBhZ2UgKnBhZ2UsIHUzMiBvZmZzZXQpOworCit1MzIgeHZfZ2V0X29iamVjdF9zaXplKHZvaWQgKm9iaik7Cit1NjQgeHZfZ2V0X3RvdGFsX3NpemVfYnl0ZXMoc3RydWN0IHh2X3Bvb2wgKnBvb2wpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvY19pbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9yYW16c3dhcC94dm1hbGxvY19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2MxYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3JhbXpzd2FwL3h2bWFsbG9jX2ludC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiB4dm1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5ICBOaXRpbiBHdXB0YQorICoKKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1c2luZyBhIGR1YWwgbGljZW5zZSBzdHJhdGVneTogQlNEL0dQTAorICogWW91IGNhbiBjaG9vc2UgdGhlIGxpY2VuY2UgdGhhdCBiZXR0ZXIgZml0cyB5b3VyIHJlcXVpcmVtZW50cy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgMy1jbGF1c2UgQlNEIExpY2Vuc2UKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMAorICovCisKKyNpZm5kZWYgX1hWX01BTExPQ19JTlRfSF8KKyNkZWZpbmUgX1hWX01BTExPQ19JTlRfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFVzZXIgY29uZmlndXJhYmxlIHBhcmFtcyAqLworCisvKiBNdXN0IGJlIHBvd2VyIG9mIHR3byAqLworI2RlZmluZSBYVl9BTElHTl9TSElGVAkyCisjZGVmaW5lIFhWX0FMSUdOCSgxIDw8IFhWX0FMSUdOX1NISUZUKQorI2RlZmluZSBYVl9BTElHTl9NQVNLCShYVl9BTElHTiAtIDEpCisKKy8qIFRoaXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gc2l6ZW9mKGxpbmtfZnJlZSkgKi8KKyNkZWZpbmUgWFZfTUlOX0FMTE9DX1NJWkUJMzIKKyNkZWZpbmUgWFZfTUFYX0FMTE9DX1NJWkUJKFBBR0VfU0laRSAtIFhWX0FMSUdOKQorCisvKiBGcmVlIGxpc3RzIGFyZSBzZXBhcmF0ZWQgYnkgRkxfREVMVEEgYnl0ZXMgKi8KKyNkZWZpbmUgRkxfREVMVEFfU0hJRlQJMworI2RlZmluZSBGTF9ERUxUQQkoMSA8PCBGTF9ERUxUQV9TSElGVCkKKyNkZWZpbmUgRkxfREVMVEFfTUFTSwkoRkxfREVMVEEgLSAxKQorI2RlZmluZSBOVU1fRlJFRV9MSVNUUwkoKFhWX01BWF9BTExPQ19TSVpFIC0gWFZfTUlOX0FMTE9DX1NJWkUpIFwKKwkJCQkvIEZMX0RFTFRBICsgMSkKKworI2RlZmluZSBNQVhfRkxJCQlESVZfUk9VTkRfVVAoTlVNX0ZSRUVfTElTVFMsIEJJVFNfUEVSX0xPTkcpCisKKy8qIEVuZCBvZiB1c2VyIHBhcmFtcyAqLworCitlbnVtIGJsb2NrZmxhZ3MgeworCUJMT0NLX0ZSRUUsCisJUFJFVl9GUkVFLAorCV9fTlJfQkxPQ0tGTEFHUywKK307CisKKyNkZWZpbmUgRkxBR1NfTUFTSwlYVl9BTElHTl9NQVNLCisjZGVmaW5lIFBSRVZfTUFTSwkofkZMQUdTX01BU0spCisKK3N0cnVjdCBmcmVlbGlzdF9lbnRyeSB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTE2IG9mZnNldDsKKwl1MTYgcGFkOworfTsKKworc3RydWN0IGxpbmtfZnJlZSB7CisJc3RydWN0IHBhZ2UgKnByZXZfcGFnZTsKKwlzdHJ1Y3QgcGFnZSAqbmV4dF9wYWdlOworCXUxNiBwcmV2X29mZnNldDsKKwl1MTYgbmV4dF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgYmxvY2tfaGVhZGVyIHsKKwl1bmlvbiB7CisJCS8qIFRoaXMgY29tbW9uIGhlYWRlciBtdXN0IGJlIEFMSUdOIGJ5dGVzICovCisJCXU4IGNvbW1vbltYVl9BTElHTl07CisJCXN0cnVjdCB7CisJCQl1MTYgc2l6ZTsKKwkJCXUxNiBwcmV2OworCQl9OworCX07CisJc3RydWN0IGxpbmtfZnJlZSBsaW5rOworfTsKKworc3RydWN0IHh2X3Bvb2wgeworCXVsb25nIGZsYml0bWFwOworCXVsb25nIHNsYml0bWFwW01BWF9GTEldOworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCBmcmVlbGlzdF9lbnRyeSBmcmVlbGlzdFtOVU1fRlJFRV9MSVNUU107CisKKwkvKiBzdGF0cyAqLworCXU2NCB0b3RhbF9wYWdlczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Jhci9yYXJfZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYwppbmRleCA5ODA1ZDc0Li5kODVkMTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcmFyL3Jhcl9kcml2ZXIuYwpAQCAtNjYsNyArNjYsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHJhcl9leGl0X2hhbmRsZXIodm9pZCk7CiAKIC8qCi0gIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhdGVkIG9uIHRoZSBzdWNjZXNmdWxsIHByb2JlIG9mIHRoZSBSQVIgZGV2aWNlCisgIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhdGVkIG9uIHRoZSBzdWNjZXNzZnVsbCBwcm9iZSBvZiB0aGUgUkFSIGRldmljZQogKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHJhcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CiAKQEAgLTMxOSw3ICszMTksNyBAQAogfQogCiAvKgotICBmdW5jdGlvbiB0aGF0IGlzIGFjdGl2YWVkIG9uIHRoZSBzdWNjZXNmdWxsIHByb2JlIG9mIHRoZSBSQVIgZGV2aWNlCisgIGZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhdGVkIG9uIHRoZSBzdWNjZXNzZnVsbCBwcm9iZSBvZiB0aGUgUkFSIGRldmljZQogKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHJhcl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvMjg2MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjAyOTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC8yODYwX21haW5fZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgMjg3MF9tYWluX2Rldi5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLWV4dGVybiBJTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKLQkJCQkJCQkJCUlOIFVJTlQgYXJnYywgT1VUIFBSVE1QX0FEQVBURVIgKnBwQWQpOwotCi1zdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogU3ltYm9sICYgTWFjcm8gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBSVDI4NjBfSU5UX1JYX0RMWQkJCQkoMTw8MCkJCS8vIGJpdCAwCi0jZGVmaW5lIFJUMjg2MF9JTlRfVFhfRExZCQkJCSgxPDwxKQkJLy8gYml0IDEKLSNkZWZpbmUgUlQyODYwX0lOVF9SWF9ET05FCQkJCSgxPDwyKQkJLy8gYml0IDIKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUJCQkoMTw8MykJCS8vIGJpdCAzCi0jZGVmaW5lIFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FCQkJKDE8PDQpCQkvLyBiaXQgNAotI2RlZmluZSBSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORQkJCSgxPDw1KQkJLy8gYml0IDUKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUJCQkoMTw8NikJCS8vIGJpdCA2Ci0jZGVmaW5lIFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORQkJKDE8PDcpCQkvLyBiaXQgNwotI2RlZmluZSBSVDI4NjBfSU5UX01HTVRfRE9ORQkJCSgxPDw4KQkJLy8gYml0IDgKLQotI2RlZmluZSBJTlRfUlgJCQlSVDI4NjBfSU5UX1JYX0RPTkUKLQotI2RlZmluZSBJTlRfQUMwX0RMWQkJKFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9BQzFfRExZCQkoUlQyODYwX0lOVF9BQzFfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0FDMl9ETFkJCShSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfQUMzX0RMWQkJKFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9IQ0NBX0RMWSAJKFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfTUdNVF9ETFkJUlQyODYwX0lOVF9NR01UX0RPTkUKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCi1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7Ci1zdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOwotc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCk7Ci12b2lkIGluaXRfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOwotc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKLXN0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci0jZW5kaWYgLy8gQ09ORklHX1BNIC8vCi0KLQotLy8KLS8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKLS8vCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KLXsKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0lfREVWSUNFX0lEKX0sCQkvL1JUMjg2MDIuNEcKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc5MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKFZFTl9BV1RfUENJX1ZFTkRPUl9JRCwgVkVOX0FXVF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MDgpfSwKLQl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzI4KX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc1OCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MjcpfSwKLQl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzM4KX0sCi0Je1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc0OCl9LAotCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3NjgpfSwKLSAgICB7MCx9CQkvLyB0ZXJtaW5hdGUgbGlzdAotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0Mjg2MF9wY2lfdGJsKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNpZmRlZiBNT0RVTEVfVkVSU0lPTgotTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKLSNlbmRpZgotCi0vLwotLy8gT3VyIFBDSSBkcml2ZXIgc3RydWN0dXJlCi0vLwotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0Mjg2MF9kcml2ZXIgPQotewotICAgIG5hbWU6ICAgICAgICJydDI4NjAiLAotICAgIGlkX3RhYmxlOiAgIHJ0Mjg2MF9wY2lfdGJsLAotICAgIHByb2JlOiAgICAgIHJ0Mjg2MF9pbml0X29uZSwKLSAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCi0KLSNpZmRlZiBDT05GSUdfUE0KLQlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKLQlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAotI2VuZGlmCi19OwotCi0KLSNpZmRlZiBDT05GSUdfUE0KLQotVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvLyBjbGVhciBQUyBwYWNrZXRzCi0JLy8gY2xlYXIgVHhTdyBwYWNrZXRzCi19Ci0KLXN0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCi0JcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKLQlJTlQzMiByZXR2YWw7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCi0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIGF2b2lkIHVzZXJzIGRvIHN1c3BlbmQgYWZ0ZXIgaW50ZXJmYWNlIGlzIGRvd24KLQotCQkJLy8gc3RvcCBpbnRlcmZhY2UKLQkJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldF9kZXYpOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKLQotCQkJLy8gbWFyayBkZXZpY2UgYXMgcmVtb3ZlZCBmcm9tIHN5c3RlbSBhbmQgdGhlcmVmb3JlIG5vIGxvbmdlciBhdmFpbGFibGUKLQkJCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7Ci0KLQkJCS8vIG1hcmsgaGFsdCBmbGFnCi0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCS8vIHRha2UgZG93biB0aGUgZGV2aWNlCi0JCQlydDI4eHhfY2xvc2UoKFBORVRfREVWKW5ldF9kZXYpOwotCi0JCQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOwotCQl9Ci0JfQotCi0JLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKLQkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKLQkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAotCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7Ci0JLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKLQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKLQkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwotCi0JcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoCi0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotCUlOVDMyIHJldHZhbDsKLQotCi0JLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKLQkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCi0JLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKLQkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCi0JLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKLQkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCi0JLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQotCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKLQkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQotCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKLQotCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwotCi0JLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQl7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0KLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOwotCX0KLQllbHNlCi0JCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAotCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKLQotCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQotCQkJewotCQkJCS8vIG9wZW4gZmFpbAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKLQkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7Ci0KLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIENPTkZJR19QTSAvLwotCi0KLXN0YXRpYyBJTlQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZShWT0lEKQotewotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotCi0vLwotLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KLS8vCi1zdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7Ci0KLQotc3RhdGljIElOVCBfX2RldmluaXQgcnQyODYwX2luaXRfb25lICgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAotICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKLXsKLSAgICBJTlQgcmM7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9pbml0X29uZVxuIikpOwotCi0gICAgLy8gd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZQotICAgIGlmIChwY2lfZW5hYmxlX2RldmljZSAocGNpX2RldikpCi0gICAgewotICAgICAgICByYyA9IC1FSU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJjID0gcnQyODYwX3Byb2JlKHBjaV9kZXYsIGVudCk7Ci0gICAgfQotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfaW5pdF9vbmVcbiIpKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIFZPSUQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgKnBjaV9kZXYpCi17Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgICAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLSAgICBSVE1QX0FEQVBURVIgICAgICAgICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVtb3ZlX29uZVxuIikpOwotCi0JaWYgKHBBZCAhPSBOVUxMKQotCXsKLQkJLy8gVW5yZWdpc3RlciBuZXR3b3JrIGRldmljZQotCQl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKLQotCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCi0JCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7Ci0KLQkJUlRNUEZyZWVBZGFwdGVyKHBBZCk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCX0KLQllbHNlCi0JewotCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOwotCi0JCS8vIFVubWFwIENTUiBiYXNlIGFkZHJlc3MKLQkJaW91bm1hcCgoY2hhciAqKShuZXRfZGV2LT5iYXNlX2FkZHIpKTsKLQotCQkvLyByZWxlYXNlIG1lbW9yeSByZWdpb24KLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7Ci0JfQotCi0JLy8gRnJlZSBwcmUtYWxsb2NhdGVkIG5ldF9kZXZpY2UgbWVtb3J5Ci0JZnJlZV9uZXRkZXYobmV0X2Rldik7Ci19Ci0KLS8vCi0vLyBQQ0kgZGV2aWNlIHByb2JlICYgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KLS8vCi1zdGF0aWMgSU5UIF9fZGV2aW5pdCAgIHJ0Mjg2MF9wcm9iZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAgICAgICAgICAgICpwY2lfZGV2LAotICAgIElOICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAgKmVudCkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLSAgICBJTlQgcnYgPSAwOwotCi0gICAgcnYgPSAoSU5UKXJ0Mjh4eF9wcm9iZSgodm9pZCAqKXBjaV9kZXYsICh2b2lkICopZW50LCAwLCAmcEFkKTsKLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpOwotCXJldHVybiBydjsKLX0KLQotCi12b2lkIGluaXRfdGhyZWFkX3Rhc2soSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBhYzBfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrLCBhYzFfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBhYzNfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzaywgaGNjYV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2ssIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLX0KLQotdm9pZCBraWxsX3RocmVhZF90YXNrKElOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVBPU19DT09LSUUgcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQl0YXNrbGV0X2tpbGwoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPnRidHRfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZW5hYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MzIgcmVnVmFsdWU7Ci0KLQlwQWQtPmludF9kaXNhYmxlX21hc2sgJj0gfihtb2RlKTsKLQlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7ICAgICAvLyAxOmVuYWJsZQotCi0JaWYgKHJlZ1ZhbHVlICE9IDApCi0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg2MF9pbnRfZGlzYWJsZShQUlRNUF9BREFQVEVSIHBBZCwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdTMyIHJlZ1ZhbHVlOwotCi0JcEFkLT5pbnRfZGlzYWJsZV9tYXNrIHw9IG1vZGU7Ci0JcmVnVmFsdWUgPSAJcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIHJlZ1ZhbHVlKTsgICAgIC8vIDA6IGRpc2FibGUKLQotCWlmIChyZWdWYWx1ZSA9PSAwKQotCXsKLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JSW50U291cmNlLndvcmQgPSAwOwotCUludFNvdXJjZS5maWVsZC5NZ210RG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX01HTVRfRExZOwotCi0JUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChwQWQpOwotCi0JLy8gaWYgeW91IHVzZSBSVE1QX1NFTV9MT0NLLCBzb21ldGltZXMga2VybmVsIHdpbGwgaGFuZyB1cCwgbm8gYW55Ci0JLy8gYnVnIHJlcG9ydCBvdXRwdXQKLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfTUdNVF9ETFkpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9NR01UX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotCUJPT0xFQU4JYlJlc2NoZWR1bGUgPSAwOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlwQWQtPmludF9wZW5kaW5nICY9IH4oSU5UX1JYKTsKLQotCWJSZXNjaGVkdWxlID0gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgMCk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9SWCB8fCBiUmVzY2hlZHVsZSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFJ4SU5UIGFnYWluICovCi0JcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfUlgpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi19Ci0KLXZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXBBZC0+aW50X3BlbmRpbmcgJj0gfihGaWZvU3RhRnVsbEludCk7Ci0JTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIEZpZm9TdGFGdWxsSW50KQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KLQotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKSBkYXRhOwotICAgIElOVF9TT1VSQ0VfQ1NSX1NUUlVDCUludFNvdXJjZTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSAgICBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkhjY2FEbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfSENDQV9ETFk7Ci0KLQlSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfSENDQV9ETFkpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9IQ0NBX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLSAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMyRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMl9ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cwotCSAqLwotCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzJfRExZKSB8fCBiUmVzY2hlZHVsZSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCi0JcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMyX0RMWSk7Ci0JUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMURtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzFfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMV9ETFkpIHx8IGJSZXNjaGVkdWxlKQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBUeERhdGFJbnQgYWdhaW4gKi8KLQlydDI4NjBfaW50X2VuYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLSAgICBJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSAwOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMwRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMF9ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMwX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMF9ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi0KLWludCBwcmludF9pbnRfY291bnQ7Ci0KLUlSUV9IQU5ETEVfVFlQRQotcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOwotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlJTlRfU09VUkNFX0NTUl9TVFJVQwlJbnRTb3VyY2U7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCUJPT0xFQU4JYk9sZFZhbHVlOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCi0JLyogTm90ZSAwMzMxMjAwODogd2UgY2FuIG5vdCByZXR1cm4gaGVyZSBiZWZvcmUKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJkludFNvdXJjZS53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsKLQkJT3Iga2VybmVsIHdpbGwgcGFuaWMgYWZ0ZXIgaWZjb25maWcgcmEwIGRvd24gc29tZXRpbWVzICovCi0KLQotCS8vCi0JLy8gSW5pdGFsIHRoZSBJbnRlcnJ1cHQgc291cmNlLgotCS8vCi0JSW50U291cmNlLndvcmQgPSAweDAwMDAwMDAwTDsKLS8vCU1jdUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7Ci0KLQkvLwotCS8vIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgJiBzYXZlZCB0byBsb2NhbCB2YXJpYWJsZQotCS8vCi0JLy9SVE1QX0lPX1JFQUQzMihwQWQsIHdoZXJlLCAmTWN1SW50U291cmNlLndvcmQpOwotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgLCBNY3VJbnRTb3VyY2Uud29yZCk7Ci0KLQkvLwotCS8vIEZsYWcgZk9QX1NUQVRVU19ET1pFIE9uLCBtZWFucyBBU0lDIHB1dCB0byBzbGVlcCwgZWxhc2UgbWVhbnMgQVNJQ0sgV2FrZVVwCi0JLy8gQW5kIGF0IHRoZSBzYW1lIHRpbWUsIGNsb2NrIG1heWJlIHR1cm5lZCBvZmYgdGhhdCBzYXkgdGhlcmUgaXMgbm8gRE1BIHNlcnZpY2UuCi0JLy8gd2hlbiBBU0lDIGdldCB0byBzbGVlcC4KLQkvLyBUbyBwcmV2ZW50IHN5c3RlbSBoYW5nIG9uIHBvd2VyIHNhdmluZy4KLQkvLyBXZSBuZWVkIHRvIGNoZWNrIGl0IGJlZm9yZSBoYW5kbGUgdGhlIElOVF9TT1VSQ0VfQ1NSLCBBU0lDIG11c3QgYmUgd2FrZSB1cC4KLQkvLwotCS8vIFJUMjY2MSA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW5ub3QgYmUgcmVhZCBhbmQgd3JpdHRlbi4KLQkvLyBSVDI4NjAgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uCi0KLQliT2xkVmFsdWUgPSBwQWQtPmJQQ0ljbGtPZmY7Ci0JcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgSW50U291cmNlLndvcmQpOyAvLyB3cml0ZSAxIHRvIGNsZWFyCi0JfQotCXBBZC0+YlBDSWNsa09mZiA9IGJPbGRWYWx1ZTsKLQotCS8vIERvIG5vdGhpbmcgaWYgUmVzZXQgaW4gcHJvZ3Jlc3MKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JewotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JLy8KLQkvLyBIYW5kbGUgaW50ZXJydXB0LCB3YWxrIHRocm91Z2ggYWxsIGJpdHMKLQkvLyBTaG91bGQgc3RhcnQgZnJvbSBoaWdoZXN0IHByaW9yaXR5IGludGVycnVwdAotCS8vIFRoZSBwcmlvcml0eSBjYW4gYmUgYWRqdXN0IGJ5IGFsdGVyaW5nIHByb2Nlc3NpbmcgaWYgc3RhdGVtZW50Ci0JLy8KLQotCS8vIElmIHJlcXVpcmVkIHNwaW5sb2NrLCBlYWNoIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaGFzIHRvIGFjcXVpcmUKLQkvLyBhbmQgcmVsZWFzZSBpdHNlbGYuCi0JLy8KLQotCS8vIERvIG5vdGhpbmcgaWYgTklDIGRvZXNuJ3QgZXhpc3QKLQlpZiAoSW50U291cmNlLndvcmQgPT0gMHhmZmZmZmZmZikKLQl7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQlwcmludGsoInNub3dwaW4gLSBJbnRTb3VyY2Uud29yZCA9PSAweGZmZmZmZmZmXG4iKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIFR4Q29oZXJlbnQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5UeENvaGVyZW50PDw8XG4iKSk7Ci0JCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgUnhDb2hlcmVudCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj4+PlJ4Q29oZXJlbnQ8PDxcbiIpKTsKLQkJUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBGaWZvU3RhRnVsbEludCkKLQl7Ci0jaWYgMQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIEZpZm9TdGFGdWxsSW50KSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIEZpZm9TdGFGdWxsSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBGaWZvU3RhRnVsbEludCk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gRmlmb1N0YUZ1bGxJbnQ7Ci0jZWxzZQotCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLSNlbmRpZgotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9NR01UX0RMWSkKLQl7Ci0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX01HTVRfRExZKSA9PTAgKQotCQl7Ci0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfTUdNVF9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9NR01UX0RMWSA7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX1JYKQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfUlgpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgUnhJTlQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9SWCk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX1JYOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9IQ0NBX0RMWSkKLQl7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfSENDQV9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfSENDQV9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9IQ0NBX0RMWTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkKLQl7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMzX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzNfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzNfRExZOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzJfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzJfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMl9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMl9ETFk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMV9ETFkpCi0JewotCi0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQkJfQotCi0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpCi0JewotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9BQzBfRExZOwotCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMF9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMwX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCX0KLQotCX0KLQotICAgIGlmIChJbnRTb3VyY2Uud29yZCAmIFByZVRCVFRJbnQpCi0JewotCQlSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIFRCVFRJbnQpCi0JewotCQlSVE1QSGFuZGxlVEJUVEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIEF1dG9XYWtldXBJbnQpCi0JCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7Ci0KLSAgICByZXR1cm4gIElSUV9IQU5ETEVEOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDaGVjayBvawotCUZBTFNFCQkJCUNoZWNrIGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCkKLXsKLQkvKiBhbHdheXMgVFJVRSAqLwotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdCBuZXQgZGV2aWNlIHN0cnVjdHVyZS4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLSAgICAqbmV0X2RldgkJCVBvaW50IHRvIHRoZSBuZXQgZGV2aWNlCi0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUluaXQgb2sKLQlGQUxTRQkJCQlJbml0IGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYTmV0RGV2SW5pdCgKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldiwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gKHN0cnVjdCBwY2lfZGV2ICopX2Rldl9wOwotICAgIGNvbnN0IENIQVIJKnByaW50X25hbWU7Ci0gICAgVUxPTkcJY3NyX2FkZHI7Ci0KLQotCXByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQyODYwIjsKLQotCW5ldF9kZXYtPmJhc2VfYWRkciA9IDA7Ci0JbmV0X2Rldi0+aXJxID0gMDsKLQotICAgIGlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKQotICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7Ci0KLSAgICAvLyBpbnRlcnJ1cHQgSVJRIG51bWJlcgotICAgIG5ldF9kZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKLQotICAgIC8vIG1hcCBwaHlzaWNhbCBhZGRyZXNzIHRvIHZpcnR1YWwgYWRkcmVzcyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVyCi0gICAgY3NyX2FkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCi0JCQkJCQkJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7Ci0KLSAgICBpZiAoIWNzcl9hZGRyKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCi0JCQkJKCJpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzLCByZWdpb24gMHglbFggQCAweCVsWFxuIiwKLQkJCQlwcmludF9uYW1lLCAoVUxPTkcpcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSwKLQkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7Ci0gICAgICAgIGdvdG8gZXJyX291dF9mcmVlX3JlczsKLSAgICB9Ci0KLSAgICAvLyBTYXZlIENTUiB2aXJ0dWFsIGFkZHJlc3MgYW5kIGlycSB0byBkZXZpY2Ugc3RydWN0dXJlCi0gICAgbmV0X2Rldi0+YmFzZV9hZGRyID0gY3NyX2FkZHI7Ci0gICAgcEFkLT5DU1JCYXNlQWRkcmVzcyA9IChQVUNIQVIpbmV0X2Rldi0+YmFzZV9hZGRyOwotCi0gICAgLy8gU2V0IERNQSBtYXN0ZXIKLSAgICBwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKLQotICAgIG5ldF9kZXYtPnByaXZfZmxhZ3MgPSBJTlRfTUFJTjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBhdCAweCVseCwgVkEgMHglbHgsIElSUSAlZC4gXG4iLAotICAgICAgICAJbmV0X2Rldi0+bmFtZSwgKFVMT05HKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKLQkJCShVTE9ORyljc3JfYWRkciwgcGNpX2Rldi0+aXJxKSk7Ci0JcmV0dXJuIFRSVUU7Ci0KLQotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1lcnJfb3V0X2ZyZWVfcmVzOgotICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7Ci1lcnJfb3V0X2ZyZWVfbmV0ZGV2OgotCS8qIGZyZWUgbmV0ZGV2IGluIGNhbGxlciwgbm90IGhlcmUgKi8KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDb25maWcgb2sKLQlGQUxTRQkJCQlDb25maWcgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhQcm9iZVBvc3RDb25maWcoCi0JSU4gdm9pZCAJCQkJKl9kZXZfcCwKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkLAotCUlOIElOVDMyCQkJCWFyZ2MpCi17Ci0JLyogbm8gdXNlICovCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBEaXNhYmxlIERNQS4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4WFhETUFEaXNhYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOwotCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JR2xvQ2ZnLndvcmQgJj0gMHhmZjA7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFbmFibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKQotewotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCWludCBpID0gMDsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpIDwyMDApOwotCi0JUlRNUHVzZWNEZWxheSg1MCk7Ci0KLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKLQlHbG9DZmcuZmllbGQuV1BETUFCdXJzdFNJWkUgPSAyOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gSU5UCQkJCWFwaWR4LAotCUlOIFVMT05HCQkJRnJhbWVMZW4sCi0JSU4gVUxPTkcJCQlVcGRhdGVQb3MpCi17Ci0JVUxPTkcJCQkJQ2FwSW5mb1BvcyA9IDA7Ci0JVUNIQVIgIAkJCSpwdHIsICpwdHJfdXBkYXRlLCAqcHRyX2NhcGluZm87Ci0JVUlOVCAgCQkJaTsKLQlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOwotCVVDSEFSCQkJYmNuX2lkeCA9IDA7Ci0KLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCkgOiBObyB2YWxpZCBJbnRlcmZhY2UgYmUgZm91bmQuXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGJCY25SZXEgPT0gRkFMU0UpCi0JewotCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLwotCQkvKiBjbGVhciBhbGwgemVybyAqLwotCQlmb3IoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwgMHgwMCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLQotCQlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKLQkJewotCQkJVUlOVDMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCBsb25ncHRyKTsKLQkJCXB0ciArPSA0OwotCQl9Ci0KLQkJLy8gVXBkYXRlIENhcGFiaWxpdHlJbmZvIGluIEJlYWNvbgotCQlmb3IgKGkgPSBDYXBJbmZvUG9zOyBpIDwgKENhcEluZm9Qb3MrMik7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksICpwdHJfY2FwaW5mbyk7Ci0JCQlwdHJfY2FwaW5mbyArKzsKLQkJfQotCi0JCWlmIChGcmFtZUxlbiA+IFVwZGF0ZVBvcykKLQkJewotCQkJZm9yIChpPSBVcGRhdGVQb3M7IGk8IChGcmFtZUxlbik7IGkrKykKLQkJCXsKLQkJCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl91cGRhdGUpOwotCQkJCXB0cl91cGRhdGUgKys7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQotCi1WT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci19Ci0KLVZPSUQgUlRNUEZpbmRIb3N0UENJRGV2KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkKQotewotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQkJTGV2ZWwgPSBSRVNUT1JFX0hBTFQgOiBSZXN0b3JlIFBDSSBob3N0IGFuZCBSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgZmllbGQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0JCUxldmVsID0gT3RoZXIgVmFsdWUgOiBSZXN0b3JlIGZyb20gZG90MTEgcG93ZXIgc2F2ZSBvciByYWRpbyBvZmYgc3RhdHVzLiBBbmQgZm9yY2UgUENJIGhvc3QgTGluayBDb250cm9sIGZpZWxkcyB0byAweDEKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgIFVDSEFSCQlMZXZlbCkKLXsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0JCU1heCA6IGxpbWl0IEhvc3QgUENJIGFuZCBSYWxpbmsgUENJZSBkZXZpY2UncyBMSU5LIENPTlRST0wgZmllbGQncyB2YWx1ZS4KLQkJQmVjYXVzZSBub3cgZnJlcXVlbnRseSBzZXQgb3VyIGRldmljZSB0byBtb2RlIDEgb3IgbW9kZSAzIHdpbGwgY2F1c2UgcHJvYmxlbS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gCVVTSE9SVAkJTWF4KQotewotfQotCi1WT0lEIHJ0Mjg2MF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotICAgIFBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpTlVMTDsKLSAgICBpZiAobmV0X2RldiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOwotCX0KLQllbHNlCi0JCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCSAgICAvLyBzdG9wIGludGVyZmFjZQotCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKLQotCQkvLyBtYXJrIGRldmljZSBhcyByZW1vdmVkIGZyb20gc3lzdGVtIGFuZCB0aGVyZWZvcmUgbm8gbG9uZ2VyIGF2YWlsYWJsZQotCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOwotCi0JCS8vIG1hcmsgaGFsdCBmbGFnCi0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCS8vIHRha2UgZG93biB0aGUgZGV2aWNlCi0JCXJ0Mjh4eF9jbG9zZSgoUE5FVF9ERVYpbmV0X2Rldik7Ci0JCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7Ci0JfQotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIGludmFpbGQgb3Igd3JpdGViYWNrIGNhY2hlCi0gKiBhbmQgY29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcwotICovCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvKgotCQktLS0tLS0gUG9ydGluZyBJbmZvcm1hdGlvbiAtLS0tLS0KLQkJPiBGb3IgVHggQWxsb2M6Ci0JCQltZ210IHBhY2tldHMgPT4gc2RfaWR4ID0gMAotCQkJU3dJZHg6IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgKLQkJCXBUeEQgOiBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0KLQkJCWRhdGEgcGFja2V0cyA9PiBzZF9pZHggPSAxCi0JIAkJVHhJZHggOiBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHgKLQkgCQlRdWVJZHg6IHBUeEJsay0+UXVlSWR4Ci0JIAkJcFR4RCAgOiBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uQ2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCSAJPiBGb3IgUnggQWxsb2M6Ci0JIAkJc2RfaWR4ID0gLTEKLQkqLwotCi0JcEFkID0gKFBSVE1QX0FEQVBURVIpaGFuZGxlOwotCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCWlmIChzZF9pZHggPT0gMSkKLQl7Ci0JCVBUWF9CTEsJCXBUeEJsazsKLQkJcFR4QmxrID0gKFBUWF9CTEspcHRyOwotCQlyZXR1cm4gcGNpX21hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIGRpcmVjdGlvbik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7Ci0JfQotCi19Ci0KLXZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQotewotCVBSVE1QX0FEQVBURVIgcEFkOwotCVBPU19DT09LSUUgcE9iajsKLQotCXBBZD0oUFJUTVBfQURBUFRFUiloYW5kbGU7Ci0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcGNpX3VubWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKLQotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL0tjb25maWcKaW5kZXggZWZlMzhlMi4uZjk5NjJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvS2NvbmZpZwpAQCAtMSw1ICsxLDggQEAKIGNvbmZpZyBSVDI4NjAKLQl0cmlzdGF0ZSAiUmFsaW5rIDI4NjAgd2lyZWxlc3Mgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiUmFsaW5rIDI4NjAvMzA5MCB3aXJlbGVzcyBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOCisJc2VsZWN0IFdJUkVMRVNTX0VYVAorCXNlbGVjdCBXRVhUX1BSSVYKIAktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIgZm9yIHRoZSBSYWxpbmsgMjg2MCB3aXJlbGVzcyBjaGlwLgorCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDI4NjAgYW5kIDMwOTAKKwkgIHdpcmVsZXNzIGNoaXBzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvTWFrZWZpbGUKaW5kZXggYzlmZTkyNS4uMjNhZTA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL01ha2VmaWxlCkBAIC0yLDI2ICsyLDMzIEBACiAKICMgVE9ETzogYWxsIG9mIHRoZXNlIHNob3VsZCBiZSByZW1vdmVkCiBFWFRSQV9DRkxBR1MgKz0gLURMSU5VWCAtREFHR1JFR0FUSU9OX1NVUFBPUlQgLURQSUdHWUJBQ0tfU1VQUE9SVCAtRFdNTV9TVVBQT1JUCi1FWFRSQV9DRkxBR1MgKz0gLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRFJUTVBfTUFDX1BDSSAtRFJUTVBfUENJX1NVUFBPUlQgLURSVDI4NjAKK0VYVFJBX0NGTEFHUyArPSAtRFJUTVBfUkZfUldfU1VQUE9SVCAtRFJUTVBfRUZVU0VfU1VQUE9SVCAtRFJUMzB4eCAtRFJUMzA5MAogRVhUUkFfQ0ZMQUdTICs9IC1EREJHCiAKIHJ0Mjg2MHN0YS1vYmpzIDo9CVwKLQljb21tb24vbWQ1Lm8JCVwKKwljb21tb24vY3J5cHRfbWQ1Lm8JXAorCWNvbW1vbi9jcnlwdF9zaGEyLm8JXAorCWNvbW1vbi9jcnlwdF9obWFjLm8JXAogCWNvbW1vbi9tbG1lLm8JCVwKLQljb21tb24vcnRtcF93ZXAubwlcCisJY29tbW9uL2NtbV93ZXAubwlcCiAJY29tbW9uL2FjdGlvbi5vCQlcCiAJY29tbW9uL2NtbV9kYXRhLm8JXAogCWNvbW1vbi9ydG1wX2luaXQubwlcCi0JY29tbW9uL3J0bXBfdGtpcC5vCVwKKwljb21tb24vY21tX3RraXAubwlcCisJY29tbW9uL2NtbV9hZXMubwlcCiAJY29tbW9uL2NtbV9zeW5jLm8JXAogCWNvbW1vbi9lZXByb20ubwkJXAogCWNvbW1vbi9jbW1fc2FuaXR5Lm8JXAogCWNvbW1vbi9jbW1faW5mby5vCVwKKwljb21tb24vY21tX2NmZy5vCVwKIAljb21tb24vY21tX3dwYS5vCVwKIAljb21tb24vZGZzLm8JCVwKIAljb21tb24vc3BlY3RydW0ubwlcCisJY29tbW9uL3J0bXBfdGltZXIubwlcCisJY29tbW9uL3J0X2NoYW5uZWwubwlcCisJY29tbW9uL2NtbV9hc2ljLm8JXAogCXN0YS9hc3NvYy5vCQlcCi0Jc3RhL2Fpcm9uZXQubwkJXAogCXN0YS9hdXRoLm8JCVwKIAlzdGEvYXV0aF9yc3AubwkJXAogCXN0YS9zeW5jLm8JCVwKQEAgLTMwLDEwICszNywxNiBAQAogCXN0YS9jb25uZWN0Lm8JCVwKIAlzdGEvd3BhLm8JCVwKIAlydF9saW51eC5vCQlcCi0JcnRfcHJvZmlsZS5vCQlcCiAJcnRfbWFpbl9kZXYubwkJXAogCXN0YV9pb2N0bC5vCQlcCiAJY29tbW9uL2JhX2FjdGlvbi5vCVwKLQljb21tb24vMjg2MF9ydG1wX2luaXQubwlcCi0JMjg2MF9tYWluX2Rldi5vCQlcCi0JY29tbW9uL2NtbV9kYXRhXzI4NjAubworCXBjaV9tYWluX2Rldi5vCQlcCisJcnRfcGNpX3JidXMubwkJXAorCWNvbW1vbi9jbW1fbWFjX3BjaS5vCVwKKwljb21tb24vY21tX2RhdGFfcGNpLm8JXAorCWNvbW1vbi9lZV9wcm9tLm8JXAorCWNvbW1vbi9ydG1wX21jdS5vCVwKKwljb21tb24vZWVfZWZ1c2UubwlcCisJY2hpcHMvcnQzMHh4Lm8JCVwKKwljb21tb24vcnRfcmYubwkJXAorCWNoaXBzL3J0MzA5MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL1RPRE8KaW5kZXggNjE1OGRjMi4uOGUyZjZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvVE9ETwpAQCAtOSw3ICs5LDYgQEAKIAktIGNoZWNrcGF0Y2gucGwgY2xlYW4KIAktIHNwYXJzZSBjbGVhbgogCS0gcG9ydCB0byBpbi1rZXJuZWwgODAyMTEgc3RhY2sgYW5kIGNvbW1vbiBydDJ4MDAgaW5mcmFzdHJ1Y3R1cmUKLQktIHJlbW92ZSByZWFkaW5nIGZyb20gL2V0Yy8gY29uZmlnIGZpbGVzCiAJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKIAogUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgb3IgY29tcGxhaW50cyBhYm91dCB0aGlzIGRyaXZlciB0byBHcmVnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Fpcm9uZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA3YjE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYWlyb25ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JYWlyb25ldC5oCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0JUGF1bCBMaW4JMDQtMDYtMTUJCUluaXRpYWwKLSovCi0KLSNpZm5kZWYJX19BSVJPTkVUX0hfXwotI2RlZmluZQlfX0FJUk9ORVRfSF9fCi0KLS8vIE1lYXN1cmVtZW50IFR5cGUgZGVmaW5pdGlvbgotI2RlZmluZQlNU1JOX1RZUEVfVU5VU0VECQkJCTAKLSNkZWZpbmUJTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEJCTEKLSNkZWZpbmUJTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRCQkyCi0jZGVmaW5lCU1TUk5fVFlQRV9CRUFDT05fUkVRCQkJMwotI2RlZmluZQlNU1JOX1RZUEVfRlJBTUVfUkVRCQkJCTQKLQotLy8gU2NhbiBNb2RlIGluIEJlYWNvbiBSZXF1ZXN0Ci0jZGVmaW5lCU1TUk5fU0NBTl9NT0RFX1BBU1NJVkUJCQkwCi0jZGVmaW5lCU1TUk5fU0NBTl9NT0RFX0FDVElWRQkJCTEKLSNkZWZpbmUJTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFCQkyCi0KLS8vIFBIWSB0eXBlIGRlZmluaXRpb24gZm9yIEFpcm9uZXQgYmVhY29uIHJlcG9ydCwgQ0NYIDIgdGFibGUgMzYtOQotI2RlZmluZQlQSFlfRkgJCQkJCQkJMQotI2RlZmluZQlQSFlfRFNTCQkJCQkJCTIKLSNkZWZpbmUJUEhZX1VOVVNFRAkJCQkJCTMKLSNkZWZpbmUJUEhZX09GRE0JCQkJCQk0Ci0jZGVmaW5lCVBIWV9IUl9EU1MJCQkJCQk1Ci0jZGVmaW5lCVBIWV9FUlAJCQkJCQkJNgotCi0vLyBSUEkgdGFibGUgaW4gZEJtCi0jZGVmaW5lCVJQSV8wCQkJMAkJCS8vCVBvd2VyIDw9IC04NwotI2RlZmluZQlSUElfMQkJCTEJCQkvLwktODcgPCBQb3dlciA8PSAtODIKLSNkZWZpbmUJUlBJXzIJCQkyCQkJLy8JLTgyIDwgUG93ZXIgPD0gLTc3Ci0jZGVmaW5lCVJQSV8zCQkJMwkJCS8vCS03NyA8IFBvd2VyIDw9IC03MgotI2RlZmluZQlSUElfNAkJCTQJCQkvLwktNzIgPCBQb3dlciA8PSAtNjcKLSNkZWZpbmUJUlBJXzUJCQk1CQkJLy8JLTY3IDwgUG93ZXIgPD0gLTYyCi0jZGVmaW5lCVJQSV82CQkJNgkJCS8vCS02MiA8IFBvd2VyIDw9IC01NwotI2RlZmluZQlSUElfNwkJCTcJCQkvLwktNTcgPCBQb3dlcgotCi0vLyBDaXNjbyBBaXJvbmV0IElBUFAgZGVmaW5ldGlvbnMKLSNkZWZpbmUJQUlST05FVF9JQVBQX1RZUEUJCQkJCTB4MzIKLSNkZWZpbmUJQUlST05FVF9JQVBQX1NVQlRZUEVfUkVRVUVTVAkJMHgwMQotI2RlZmluZQlBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVBPUlQJCQkweDgxCi0KLS8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZGV0YWlsIGZvcm1hdAotdHlwZWRlZglzdHJ1Y3QJX01FQVNVUkVNRU5UX1JFUVVFU1QJewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJU2Nhbk1vZGU7CQkJLy8gVXNlIG9ubHkgaW4gYmVhY29uIHJlcXVlc3QsIG90aGVyIHJlcXVlc3RzIGRpZCBub3QgdXNlIHRoaXMgZmllbGQKLQlVU0hPUlQJRHVyYXRpb247Ci19CU1FQVNVUkVNRU5UX1JFUVVFU1QsICpQTUVBU1VSRU1FTlRfUkVRVUVTVDsKLQotLy8gQmVhY29uIE1lYXN1cmVtZW50IFJlcG9ydAotLy8gQWxsIHRoZXNlIGZpZWxkIG1pZ2h0IGNoYW5nZSB0byBVQ0hBUiwgYmVjYXVzZSB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgdG8gdGhlc2UgcmVwb3J0LgotLy8gV2UgY29weSBhbGwgdGhlc2UgYmVhY29ucyBhbmQgcmVwb3J0IHRvIENDWCAyIEFQLgotdHlwZWRlZglzdHJ1Y3QJX0JFQUNPTl9SRVBPUlQJewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJU3BhcmU7Ci0JVVNIT1JUCUR1cmF0aW9uOwotCVVDSEFSCVBoeVR5cGU7CQkJLy8gRGVmaW5pYXRpb24gaXMgbGlzdGVkIGFib3ZlIHRhYmxlIDM2LTkKLQlVQ0hBUglSeFBvd2VyOwotCVVDSEFSCUJTU0lEWzZdOwotCVVDSEFSCVBhcmVudFRTRls0XTsKLQlVQ0hBUglUYXJnZXRUU0ZbOF07Ci0JVVNIT1JUCUJlYWNvbkludGVydmFsOwotCVVTSE9SVAlDYXBhYmlsaXR5SW5mbzsKLX0JQkVBQ09OX1JFUE9SVCwgKlBCRUFDT05fUkVQT1JUOwotCi0vLyBGcmFtZSBNZWFzdXJlbWVudCBSZXBvcnQgKE9wdGlvbmFsKQotdHlwZWRlZglzdHJ1Y3QJX0ZSQU1FX1JFUE9SVAl7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglTcGFyZTsKLQlVU0hPUlQJRHVyYXRpb247Ci0JVUNIQVIJVEE7Ci0JVUNIQVIJQlNTSURbNl07Ci0JVUNIQVIJUlNTSTsKLQlVQ0hBUglDb3VudDsKLX0JRlJBTUVfUkVQT1JULCAqUEZSQU1FX1JFUE9SVDsKLQotI3ByYWdtYSBwYWNrKDEpCi0vLyBDaGFubmVsIExvYWQgUmVwb3J0Ci10eXBlZGVmCXN0cnVjdAlfQ0hBTk5FTF9MT0FEX1JFUE9SVAl7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglTcGFyZTsKLQlVU0hPUlQJRHVyYXRpb247Ci0JVUNIQVIJQ0NBQnVzeTsKLX0JQ0hBTk5FTF9MT0FEX1JFUE9SVCwgKlBDSEFOTkVMX0xPQURfUkVQT1JUOwotI3ByYWdtYSBwYWNrKCkKLQotLy8gTm9zaWUgSGlzdG9ncmFtIFJlcG9ydAotdHlwZWRlZglzdHJ1Y3QJX05PSVNFX0hJU1RfUkVQT1JUCXsKLQlVQ0hBUglDaGFubmVsOwotCVVDSEFSCVNwYXJlOwotCVVTSE9SVAlEdXJhdGlvbjsKLQlVQ0hBUglEZW5zaXR5WzhdOwotfQlOT0lTRV9ISVNUX1JFUE9SVCwgKlBOT0lTRV9ISVNUX1JFUE9SVDsKLQotLy8gUmFkaW8gTWFuYWdlbWVudCBDYXBhYmlsaXR5IGVsZW1lbnQKLXR5cGVkZWYJc3RydWN0CV9SQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFkJewotCVVDSEFSCUVpZDsJCQkJLy8gVE9ETzogV2h5IHRoZSBFaWQgaXMgMSBieXRlLCBub3Qgbm9ybWFsIDIgYnl0ZXM/Pz8KLQlVQ0hBUglMZW5ndGg7Ci0JVUNIQVIJQWlyb25ldE91aVszXTsJCS8vIEFJcm9uZXQgT1VJICgwMCA0MCA5NikKLQlVQ0hBUglUeXBlOwkJCQkvLyBUeXBlIC8gVmVyc2lvbgotCVVTSE9SVAlTdGF0dXM7CQkJCS8vIHN3YXAxNiByZXF1aXJlZAotfQlSQURJT19NQU5BR0VNRU5UX0NBUEFCSUxJVFksICpQUkFESU9fTUFOQUdFTUVOVF9DQVBBQklMSVRZOwotCi0vLyBNZWFzdXJlbWVudCBNb2RlIEJpdCBkZWZpbml0aW9uCi10eXBlZGVmCXN0cnVjdAlfTUVBU1VSRU1FTlRfTU9ERQl7Ci0JVUNIQVIJUnN2ZDo0OwotCVVDSEFSCVJlcG9ydDoxOwotCVVDSEFSCU5vdFVzZWQ6MTsKLQlVQ0hBUglFbmFibGU6MTsKLQlVQ0hBUglQYXJhbGxlbDoxOwotfQlNRUFTVVJFTUVOVF9NT0RFLCAqUE1FQVNVUkVNRU5UX01PREU7Ci0KLS8vIE1lYXN1cmVtZW50IFJlcXVlc3QgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKLXR5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQJewotCVVTSE9SVAkJCQlFaWQ7Ci0JVVNIT1JUCQkJCUxlbmd0aDsJCQkJLy8gc3dhcDE2IHJlcXVpcmVkCi0JVVNIT1JUCQkJCVRva2VuOwkJCQkvLyBub24temVybyB1bmlxdWUgdG9rZW4KLQlVQ0hBUgkJCQlNb2RlOwkJCQkvLyBNZWFzdXJlbWVudCBNb2RlCi0JVUNIQVIJCQkJVHlwZTsJCQkJLy8gTWVhc3VyZW1lbnQgdHlwZQotfQlNRUFTVVJFTUVOVF9SRVFVRVNUX0VMRU1FTlQsICpQTUVBU1VSRU1FTlRfUkVRVUVTVF9FTEVNRU5UOwotCi0vLyBNZWFzdXJlbWVudCBSZXBvcnQgZWxlbWVudCwgVGhpcyBpcyBsaXR0bGUgZW5kaWFuIG1vZGUKLXR5cGVkZWYJc3RydWN0CV9NRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAl7Ci0JVVNIT1JUCQkJCUVpZDsKLQlVU0hPUlQJCQkJTGVuZ3RoOwkJCQkvLyBzd2FwMTYgcmVxdWlyZWQKLQlVU0hPUlQJCQkJVG9rZW47CQkJCS8vIG5vbi16ZXJvIHVuaXF1ZSB0b2tlbgotCVVDSEFSCQkJCU1vZGU7CQkJCS8vIE1lYXN1cmVtZW50IE1vZGUKLQlVQ0hBUgkJCQlUeXBlOwkJCQkvLyBNZWFzdXJlbWVudCB0eXBlCi19CU1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5ULCAqUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UOwotCi0vLyBDaXNjbyBBaXJvbmV0IElBUFAgRnJhbWUgSGVhZGVyLCBOZXR3b3JrIGJ5dGUgb3JkZXIgdXNlZAotdHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfSUFQUF9IRUFERVIgewotCVVDSEFSCUNpc2NvU25hcEhlYWRlcls4XTsJLy8gOCBieXRlcyBDaXNjbyBzbmFwIGhlYWRlcgotCVVTSE9SVAlMZW5ndGg7CQkJCS8vIElBUFAgSUQgJiBsZW5ndGgsIHJlbWVtYmVyIHRvIHN3YXAxNiBpbiBMRSBzeXN0ZW0KLQlVQ0hBUglUeXBlOwkJCQkvLyBJQVBQIHR5cGUKLQlVQ0hBUglTdWJUeXBlOwkJCS8vIElBUFAgc3VidHlwZQotCVVDSEFSCURBWzZdOwkJCQkvLyBEZXN0aW5hdGlvbiBNQUMgYWRkcmVzcwotCVVDSEFSCVNBWzZdOwkJCQkvLyBTb3VyY2UgTUFDIGFkZHJlc3MKLQlVU0hPUlQJVG9rZW47CQkJCS8vIERpYWxvZyB0b2tlbiwgbm8gbmVlZCB0byBzd2FwMTYgc2luY2UgaXQgaXMgZm9yIHlva2VuIHVzYWdlIG9ubHkKLX0JQUlST05FVF9JQVBQX0hFQURFUiwgKlBBSVJPTkVUX0lBUFBfSEVBREVSOwotCi0vLyBSYWRpbyBNZWFzdXJlbWVudCBSZXF1ZXN0IGZyYW1lCi10eXBlZGVmCXN0cnVjdAlfQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FCXsKLSAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgotCVVDSEFSCQkJCURlbGF5OwkJCS8vIEFjdGl2YXRpb24gRGVsYXkKLQlVQ0hBUgkJCQlPZmZzZXQ7CQkJLy8gTWVhc3VyZW1lbnQgb2Zmc2V0Ci19CUFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUU7Ci0KLS8vIFJhZGlvIE1lYXN1cmVtZW50IFJlcG9ydCBmcmFtZQotdHlwZWRlZglzdHJ1Y3QJX0FJUk9ORVRfUk1fUkVQT1JUX0ZSQU1FCXsKLSAgICBBSVJPTkVUX0lBUFBfSEVBREVSCUlBUFA7CQkJLy8gQ29tbW9uIGhlYWRlcgotfQlBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRSwgKlBBSVJPTkVUX1JNX1JFUE9SVF9GUkFNRTsKLQotLy8gU2F2ZWQgZWxlbWVudCByZXF1ZXN0IGFjdGlvbnMgd2hpY2ggd2lsbCBzYXZlZCBpbiBTdGFDZmcuCi10eXBlZGVmCXN0cnVjdAlfUk1fUkVRVUVTVF9BQ1RJT04JewotCU1FQVNVUkVNRU5UX1JFUVVFU1RfRUxFTUVOVAlSZXFFbGVtOwkJLy8gU2F2ZWQgcmVxdWVzdCBlbGVtZW50Ci0JTUVBU1VSRU1FTlRfUkVRVUVTVAkJCU1lYXN1cmVtZW50OwkvLyBTYXZlZCBtZWFzdXJlbWVudCB3aXRoaW4gdGhlIHJlcXVlc3QgZWxlbWVudAotfQlSTV9SRVFVRVNUX0FDVElPTiwgKlBSTV9SRVFVRVNUX0FDVElPTjsKLQotLy8gQ0NYIGFkbWluaXN0cmF0aW9uIGNvbnRyb2wKLXR5cGVkZWYJdW5pb24JX0NDWF9DT05UUk9MCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZToxOwkJCS8vIEVuYWJsZSBDQ1gyCi0JCVVJTlQzMgkJTGVhcEVuYWJsZToxOwkJLy8gRW5hYmxlIExFQVAgYXQgQ0NYMgotCQlVSU5UMzIJCVJNRW5hYmxlOjE7CQkJLy8gUmFkaW8gTWVhc3VyZW1lbnQgRW5hYmxlCi0JCVVJTlQzMgkJRENSTUVuYWJsZToxOwkJLy8gTm9uIHNlcnZpbmcgY2hhbm5lbCBSYWRpbyBNZWFzdXJlbWVudCBlbmFibGUKLQkJVUlOVDMyCQlRT1NFbmFibGU6MTsJCS8vIEVuYWJsZSBRT1MgZm9yIENDWCAyLjAgc3VwcG9ydAotCQlVSU5UMzIJCUZhc3RSb2FtRW5hYmxlOjE7CS8vIEVuYWJsZSBmYXN0IHJvYW1pbmcKLQkJVUlOVDMyCQlSc3ZkOjI7CQkJCS8vIE5vdCB1c2VkCi0JCVVJTlQzMgkJZEJtVG9Sb2FtOjg7CQkvLyB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4KLQkJVUlOVDMyCQlUdUxpbWl0OjE2OwkJCS8vIExpbWl0IGZvciBkaWZmZXJlbnQgY2hhbm5lbCBzY2FuCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDQ1hfQ09OVFJPTCwgKlBDQ1hfQ09OVFJPTDsKLQotI2VuZGlmCS8vIF9fQUlST05FVF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvYXAuaAppbmRleCBmY2RiMzU4Li4zZjc0NGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2FwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9hcC5oCkBAIC00MCwzOSArNDAsMjcgQEAKICNpZm5kZWYgX19BUF9IX18KICNkZWZpbmUgX19BUF9IX18KIAotLy8gYXBfbWxtZS5jCisvKiBhcF93cGEuYyAqLwordm9pZCBXcGFTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7CiAKLSNpZmRlZiBSVDI4NzAKLVZPSUQgQmVhY29uVXBkYXRlRXhlYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfTUFDX1VTQgordm9pZCBCZWFjb25VcGRhdGVFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLVZPSUQgUlRNUFNldFBpZ2d5QmFjaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBCT09MRUFOCQkJYlBpZ2d5QmFjayk7Cit2b2lkIFJUTVBTZXRQaWdneUJhY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJQaWdneUJhY2spOwogCi0vLyBhcC5jCit2b2lkIE1hY1RhYmxlUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNYWNUYWJsZVJlc2V0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgdTggKnBBZGRyLAorCQkJCSAgICAgdTggYXBpZHgsIElOIEJPT0xFQU4gQ2xlYW5BbGwpOwogCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCUlOIEJPT0xFQU4JQ2xlYW5BbGwpOworQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1MTYgd2NpZCwgdTggKnBBZGRyKTsKIAotQk9PTEVBTiBNYWNUYWJsZURlbGV0ZUVudHJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFVTSE9SVCB3Y2lkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOworc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqTWFjVGFibGVMb29rdXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpOwogCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlTG9va3VwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIpOwotCi0jZW5kaWYgIC8vIF9fQVBfSF9fCi0KKyNlbmRpZiAvKiBfX0FQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tYWNfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWFjX3BjaS5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3BjaS5oCmluZGV4IGJhZDA0ZDQuLmJjNzA0YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWFjX3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9tYWNfcGNpLmgKQEAgLTI1LDcgKzI1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgICBNb2R1bGUgTmFtZToKLSAgICAgICAgbWFjX3BjaS5oCisJbWFjX3BjaS5oCiAKICAgICBBYnN0cmFjdDoKIApAQCAtMzcsMTcgKzM3LDE2IEBACiAjaWZuZGVmIF9fTUFDX1BDSV9IX18KICNkZWZpbmUgX19NQUNfUENJX0hfXwogCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCisjaW5jbHVkZSAiLi4vcnRtcF90eXBlLmgiCiAjaW5jbHVkZSAicnRtcF9tYWMuaCIKICNpbmNsdWRlICJydG1wX3BoeS5oIgotI2luY2x1ZGUgInJ0bXBfaWZhY2UuaCIKLSNpbmNsdWRlICJydG1wX2RvdDExLmgiCisjaW5jbHVkZSAiLi4vcnRtcF9pZmFjZS5oIgorI2luY2x1ZGUgIi4uL3J0bXBfZG90MTEuaCIKIAotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElEIHJlbGF0ZWQgZGVmaW5pdGlvbnMsCi0vLyBOT1RFOiB5b3Ugc2hvdWxkIG5vdCBhZGQgdGhlIG5ldyBWZW5kb3JJRC9EZXZpY2VJRCBoZXJlIHVubGVzcyB5b3Ugbm90IHN1cmUgaXQgYmVsb25ncyB0byB3aGF0IGNoaXAuCi0vLworLyogKi8KKy8qIERldmljZSBJRCAmIFZlbmRvciBJRCByZWxhdGVkIGRlZmluaXRpb25zLCAqLworLyogTk9URTogeW91IHNob3VsZCBub3QgYWRkIHRoZSBuZXcgVmVuZG9ySUQvRGV2aWNlSUQgaGVyZSB1bmxlc3MgeW91IG5vdCBzdXJlIGl0IGJlbG9uZ3MgdG8gd2hhdCBjaGlwLiAqLworLyogKi8KICNkZWZpbmUgTklDX1BDSV9WRU5ET1JfSUQJCTB4MTgxNAogI2RlZmluZSBQQ0lCVVNfSU5URUxfVkVORE9SCTB4ODA4NgogCkBAIC02MSwxNzcgKzYwLDk1IEBACiAjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfUENJCQkweDA2MDQKICNlbmRpZgogCi0KLQotCi0KICNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJCQkwCiAjZGVmaW5lIFJUTVBfUEtUX1RBSUxfUEFERElORwkJCTAKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgJMAogCiAjZGVmaW5lIEFVWF9DVFJMICAgICAgICAgICAweDEwYwogCi0vLwotLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZwotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYRF9TVFJVQyB7Ci0JLy8gV29yZCAwCi0JVUlOVDMyCQlTRFB0cjA7Ci0JLy8gV29yZCAxCi0JVUlOVDMyCQlETUFET05FOjE7Ci0JVUlOVDMyCQlMYXN0U2VjMDoxOwotCVVJTlQzMgkJU0RMZW4wOjE0OwotCVVJTlQzMgkJQnVyc3Q6MTsKLQlVSU5UMzIJCUxhc3RTZWMxOjE7Ci0JVUlOVDMyCQlTRExlbjE6MTQ7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlTRFB0cjE7Ci0JLy8gV29yZCAzCi0JVUlOVDMyCQlJQ086MTsKLQlVSU5UMzIJCVVDTzoxOwotCVVJTlQzMgkJVENPOjE7Ci0JVUlOVDMyCQlyc3Y6MjsKLQlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCi0JVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KLQlVSU5UMzIJCXJzdjI6MjQ7Ci19CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWERfU1RSVUMgewotCS8vIFdvcmQJMAotCVVJTlQzMgkJU0RQdHIwOwotCS8vIFdvcmQJMQotCVVJTlQzMgkJU0RMZW4xOjE0OwotCVVJTlQzMgkJTGFzdFNlYzE6MTsKLQlVSU5UMzIJCUJ1cnN0OjE7Ci0JVUlOVDMyCQlTRExlbjA6MTQ7Ci0JVUlOVDMyCQlMYXN0U2VjMDoxOwotCVVJTlQzMgkJRE1BRE9ORToxOwotCS8vV29yZDIKLQlVSU5UMzIJCVNEUHRyMTsKLQkvL1dvcmQzCi0JVUlOVDMyCQlyc3YyOjI0OwotCVVJTlQzMgkJV0lWOjE7CS8vIFdpcmVsZXNzIEluZm8gVmFsaWQuIDEgaWYgRHJpdmVyIGFscmVhZHkgZmlsbCBXSSwgIG8gaWYgRE1BIG5lZWRzIHRvIGNvcHkgV0kgdG8gY29ycmVjdHBvc2l0aW9uCi0JVUlOVDMyCQlRU0VMOjI7CS8vIHNlbGVjdCBvbi1jaGlwIEZJRk8gSUQgZm9yIDJuZC1zdGFnZSBvdXRwdXQgc2NoZWR1bGVyLjA6TUdNVCwgMTpIQ0NBIDI6RURDQQotCVVJTlQzMgkJcnN2OjI7Ci0JVUlOVDMyCQlUQ086MTsJLy8KLQlVSU5UMzIJCVVDTzoxOwkvLwotCVVJTlQzMgkJSUNPOjE7CS8vCi19CVRYRF9TVFJVQywgKlBUWERfU1RSVUM7Ci0jZW5kaWYKKy8qICovCisvKiBUWCBkZXNjcmlwdG9yIGZvcm1hdCwgVHggICAgIHJpbmcsIE1nbXQgUmluZyAqLworLyogKi8KK3N0cnVjdCBQQUNLRUQgcnRfdHhkIHsKKwkvKiBXb3JkIDAgKi8KKwl1MzIgU0RQdHIwOworCS8qIFdvcmQgMSAqLworCXUzMiBTRExlbjE6MTQ7CisJdTMyIExhc3RTZWMxOjE7CisJdTMyIEJ1cnN0OjE7CisJdTMyIFNETGVuMDoxNDsKKwl1MzIgTGFzdFNlYzA6MTsKKwl1MzIgRE1BRE9ORToxOworCS8qV29yZDIgKi8KKwl1MzIgU0RQdHIxOworCS8qV29yZDMgKi8KKwl1MzIgcnN2MjoyNDsKKwl1MzIgV0lWOjE7CQkvKiBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbiAqLworCXUzMiBRU0VMOjI7CQkvKiBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EgKi8KKwl1MzIgcnN2OjI7CisJdTMyIFRDTzoxOwkJLyogKi8KKwl1MzIgVUNPOjE7CQkvKiAqLworCXUzMiBJQ086MTsJCS8qICovCit9OwogCisvKiAqLworLyogUnggZGVzY3JpcHRvciBmb3JtYXQsIFJ4IFJpbmcgKi8KKy8qICovCit0eXBlZGVmIHN0cnVjdCBQQUNLRUQgcnRfcnhkIHsKKwkvKiBXb3JkIDAgKi8KKwl1MzIgU0RQMDsKKwkvKiBXb3JkIDEgKi8KKwl1MzIgU0RMMToxNDsKKwl1MzIgUnN2OjI7CisJdTMyIFNETDA6MTQ7CisJdTMyIExTMDoxOworCXUzMiBERE9ORToxOworCS8qIFdvcmQgMiAqLworCXUzMiBTRFAxOworCS8qIFdvcmQgMyAqLworCXUzMiBCQToxOworCXUzMiBEQVRBOjE7CisJdTMyIE5VTExEQVRBOjE7CisJdTMyIEZSQUc6MTsKKwl1MzIgVTJNOjE7CQkvKiAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUgKi8KKwl1MzIgTWNhc3Q6MTsJCS8qIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUgKi8KKwl1MzIgQmNhc3Q6MTsJCS8qIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUgKi8KKwl1MzIgTXlCc3M6MTsJCS8qIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRCAqLworCXUzMiBDcmM6MTsJCS8qIDE6IENSQyBlcnJvciAqLworCXUzMiBDaXBoZXJFcnI6MjsJLyogMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZCAqLworCXUzMiBBTVNEVToxOwkJLyogcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLiAqLworCXUzMiBIVEM6MTsKKwl1MzIgUlNTSToxOworCXUzMiBMMlBBRDoxOworCXUzMiBBTVBEVToxOworCXUzMiBEZWNyeXB0ZWQ6MTsJLyogdGhpcyBmcmFtZSBpcyBiZWluZyBkZWNyeXB0ZWQuICovCisJdTMyIFBsY3BTaWduYWw6MTsJLyogVG8gYmUgbW92ZWQgKi8KKwl1MzIgUGxjcFJzc2lsOjE7CS8qIFRvIGJlIG1vdmVkICovCisJdTMyIFJzdjE6MTM7Cit9IFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKIAotLy8KLS8vIFJ4IGRlc2NyaXB0b3IgZm9ybWF0LCBSeCBSaW5nCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhEX1NUUlVDewotCS8vIFdvcmQgMAotCVVJTlQzMgkJU0RQMDsKLQkvLyBXb3JkIDEKLQlVSU5UMzIJCURET05FOjE7Ci0JVUlOVDMyCQlMUzA6MTsKLQlVSU5UMzIJCVNETDA6MTQ7Ci0JVUlOVDMyCQlSc3Y6MjsKLQlVSU5UMzIJCVNETDE6MTQ7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlTRFAxOwotCS8vIFdvcmQgMwotCVVJTlQzMgkJUnN2MToxMzsKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAotCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgotCVVJTlQzMgkJQU1QRFU6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlSU1NJOjE7Ci0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuIG9ic29sZXRlLgotCVVJTlQzMgkJQ2lwaGVyRXJyOjI7ICAgICAgICAvLyAwOiBkZWNyeXB0aW9uIG9rYXksIDE6SUNWIGVycm9yLCAyOk1JQyBlcnJvciwgMzpLRVkgbm90IHZhbGlkCi0JVUlOVDMyCQlDcmM6MTsgICAgICAgICAgICAgIC8vIDE6IENSQyBlcnJvcgotCVVJTlQzMgkJTXlCc3M6MTsJLy8gMTogdGhpcyBmcmFtZSBiZWxvbmdzIHRvIHRoZSBzYW1lIEJTU0lECi0JVUlOVDMyCQlCY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCUZSQUc6MTsKLQlVSU5UMzIJCU5VTExEQVRBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlCQToxOwotCi19CVJYRF9TVFJVQywgKlBSWERfU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYRF9TVFJVQ3sKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUDA7Ci0JLy8gV29yZAkxCi0JVUlOVDMyCQlTREwxOjE0OwotCVVJTlQzMgkJUnN2OjI7Ci0JVUlOVDMyCQlTREwwOjE0OwotCVVJTlQzMgkJTFMwOjE7Ci0JVUlOVDMyCQlERE9ORToxOwotCS8vIFdvcmQJMgotCVVJTlQzMgkJU0RQMTsKLQkvLyBXb3JkCTMKLQlVSU5UMzIJCUJBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlOVUxMREFUQToxOwotCVVJTlQzMgkJRlJBRzoxOwotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCi0JVUlOVDMyCQlNeUJzczoxOwkvLyAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQKLQlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCi0JVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuCi0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCVJTU0k6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlBTVBEVToxOwotCVVJTlQzMgkJRGVjcnlwdGVkOjE7CS8vIHRoaXMgZnJhbWUgaXMgYmVpbmcgZGVjcnlwdGVkLgotCVVJTlQzMgkJUGxjcFNpZ25hbDoxOwkJLy8gVG8gYmUgbW92ZWQKLQlVSU5UMzIJCVBsY3BSc3NpbDoxOy8vIFRvIGJlIG1vdmVkCi0JVUlOVDMyCQlSc3YxOjEzOwotfQlSWERfU1RSVUMsICpQUlhEX1NUUlVDLCBSVDI4WFhfUlhEX1NUUlVDLCAqUFJUMjhYWF9SWERfU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIEJJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24gX1RYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMKLXsKLQlzdHJ1Y3QKLQl7Ci0JCVVMT05HCVJlc2VydmUxOjIwOwotCQlVTE9ORwlQQ0lFX1BIWV9UWF9BVFRFTl9FTjoxOwotCQlVTE9ORwlQQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRTozOwotCQlVTE9ORwlSZXNlcnZlMjo3OwotCQlVTE9ORwlSRl9JU09MQVRJT05fRU5BQkxFOjE7Ci0JfSBmaWVsZDsKLQotCVVMT05HCXdvcmQ7Ci19IFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUMsICpQVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQzsKLSNlbHNlCiB0eXBlZGVmIHVuaW9uIF9UWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDIHsKLQlzdHJ1Y3QKLQl7Ci0JCVVMT05HCVJGX0lTT0xBVElPTl9FTkFCTEU6MTsKLQkJVUxPTkcJUmVzZXJ2ZTI6NzsKLQkJVUxPTkcJUENJRV9QSFlfVFhfQVRURU5fVkFMVUU6MzsKLQkJVUxPTkcJUENJRV9QSFlfVFhfQVRURU5fRU46MTsKLQkJVUxPTkcJUmVzZXJ2ZTE6MjA7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBSRl9JU09MQVRJT05fRU5BQkxFOjE7CisJCXVuc2lnbmVkIGxvbmcgUmVzZXJ2ZTI6NzsKKwkJdW5zaWduZWQgbG9uZyBQQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRTozOworCQl1bnNpZ25lZCBsb25nIFBDSUVfUEhZX1RYX0FUVEVOX0VOOjE7CisJCXVuc2lnbmVkIGxvbmcgUmVzZXJ2ZTE6MjA7CiAJfSBmaWVsZDsKIAotCVVMT05HCXdvcmQ7CisJdW5zaWduZWQgbG9uZyB3b3JkOwogfSBUWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDLCAqUFRYX0FUVEVOVUFUSU9OX0NUUkxfU1RSVUM7Ci0jZW5kaWYKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotLy8gODA1MSBmaXJtd2FyZSBpbWFnZSBmb3IgUlQyODYwIC0gYmFzZSBhZGRyZXNzID0gMHg0MDAwCisvKiA4MDUxIGZpcm13YXJlIGltYWdlIGZvciBSVDI4NjAgLSBiYXNlIGFkZHJlc3MgPSAweDQwMDAgKi8KICNkZWZpbmUgRklSTVdBUkVfSU1BR0VfQkFTRSAgICAgMHgyMDAwCi0jZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFIDB4MjAwMCAgICAvLyA4a2J5dGUKLQorI2RlZmluZSBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSAweDIwMDAJLyogOGtieXRlICovCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEZyaW13YXJlIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KICNkZWZpbmUgUlRNUF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCQlcCiAJZG97CQkJCQkJCQlcCi0JCVVMT05HCV9pLCBfZmlybTsJCQkJCVwKKwkJdW5zaWduZWQgbG9uZwlfaSwgX2Zpcm07CQkJCQlcCiAJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MTAwMDApOwkJXAogCQkJCQkJCQkJXAogCQlmb3IoX2k9MDsgX2k8X0Z3TGVuOyBfaSs9NCkJCQkJXApAQCAtMjUwLDI3ICsxNjcsMjMgQEAKIAkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CQlcCiAJfXdoaWxlKDApCiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0gVFggUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwogI2RlZmluZSBSVE1QX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJZG97fXdoaWxlKDApCiAjZGVmaW5lIFJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCWRve313aGlsZSgwKQogCi0KICNkZWZpbmUgUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAotCQkoKGZyZWVOdW0pID49IChVTE9ORykocFR4QmxrLT5Ub3RhbEZyYWdOdW0gKyBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpICsgMykpIC8qIHJvdWdoIGVzdGltYXRlIHdlIHdpbGwgdXNlIDMgbW9yZSBkZXNjcmlwdG9yLiAqLworCQkoKGZyZWVOdW0pID49ICh1bnNpZ25lZCBsb25nKShwVHhCbGstPlRvdGFsRnJhZ051bSArIFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgKyAzKSkJLyogcm91Z2ggZXN0aW1hdGUgd2Ugd2lsbCB1c2UgMyBtb3JlIGRlc2NyaXB0b3IuICovCiAjZGVmaW5lIFJUTVBfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQlcCiAJCWRve313aGlsZSgwKQogCiAjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKHBBZCwgUXVlSWR4LCBmcmVlTnVtLCBfVHhGcmFtZVR5cGUpIFwKIAkJKCgoZnJlZU51bSAhPSAoVFhfUklOR19TSVpFLTEpKSAmJiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPT0gMCkpIHx8IChmcmVlTnVtPDMpKQotCQkvLygoKGZyZWVOdW0pICE9IChUWF9SSU5HX1NJWkUtMSkpICYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA9PSAxIC8qMCovKSkKLQogCiAjZGVmaW5lIEhBTF9LaWNrT3V0TWdtdFR4KF9wQWQsIF9RdWVJZHgsIF9wUGFja2V0LCBfcFNyY0J1ZlZBLCBfU3JjQnVmTGVuKQlcCiAJCQlSdG1wUENJTWdtdEtpY2tPdXQoX3BBZCwgX1F1ZUlkeCwgX3BQYWNrZXQsIF9wU3JjQnVmVkEsIF9TcmNCdWZMZW4pCiAKICNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKLQkJLyogUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKSovCisJCQkJLyogUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKSAqLwogCiAjZGVmaW5lIEhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKIAkJCVJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKQEAgLTI4NSw3ICsxOTgsNyBAQAogCQkJUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZShfcEFkLCBfcFR4QmxrLCBfVG90YWxNUERVU2l6ZSwgX0ZpcnN0VHhJZHgpCiAKICNkZWZpbmUgSEFMX0xhc3RUeElkeChfcEFkLCBfUXVlSWR4LF9MYXN0VHhJZHgpIFwKLQkJCS8qUnRtcFBDSURhdGFMYXN0VHhJZHgoX3BBZCwgX1F1ZUlkeCxfTGFzdFR4SWR4KSovCisJCQkJLypSdG1wUENJRGF0YUxhc3RUeElkeChfcEFkLCBfUXVlSWR4LF9MYXN0VHhJZHgpICovCiAKICNkZWZpbmUgSEFMX0tpY2tPdXRUeChfcEFkLCBfcFR4QmxrLCBfUXVlSWR4KQlcCiAJCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBUWF9DVFhfSURYMCsoKF9RdWVJZHgpKjB4MTApLCAoX3BBZCktPlR4UmluZ1soX1F1ZUlkeCldLlR4Q3B1SWR4KQpAQCAtMzAwLDM3ICsyMTMsMzQgQEAKIAkJCSA6CVwKIAkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKTsKIAotCiAjZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkgXAogCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KQk/IFwKIAkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIF9wQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMSkgXAogCQkJIDoJXAogCQkJKF9wQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpOwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBBU0lDIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8vIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAKKy8qIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHgwMDAwMDAwMDAwMDAgKi8KICNkZWZpbmUgUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJXAogCUFzaWNEZWxXY2lkVGFiKHBBZCwgV2NpZCk7CiAKLS8vIGFkZCB0aGlzIGVudHJ5IGludG8gQVNJQyBSWCBXQ0lEIHNlYXJjaCB0YWJsZQorLyogYWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlICovCiAjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSkJCVwKIAlBc2ljVXBkYXRlUnhXQ0lEVGFibGUocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKIAotLy8gYWRkIGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldAotLy8gU2V0IE1BQyByZWdpc3RlciB2YWx1ZSBhY2NvcmRpbmcgb3BlcmF0aW9uIG1vZGUKKy8qIGFkZCBieSBqb2hubGksIGZpeCAiaW5faW50ZXJydXB0IiBlcnJvciB3aGVuIGNhbGwgIk1hY1RhYmxlRGVsZXRlRW50cnkiIGluIFJ4IHRhc2tsZXQgKi8KKy8qIFNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlICovCiAjZGVmaW5lIFJUTVBfVVBEQVRFX1BST1RFQ1QocEFkKQlcCiAJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUKSwgVFJVRSwgMCk7Ci0vLyBlbmQgam9obmxpCisvKiBlbmQgam9obmxpICovCiAKLS8vIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQworLyogcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDICovCiAjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCc3NJZHgsIFdjaWQpCVwKLQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJzc0lkeCwgKFVDSEFSKVdjaWQpOworCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQnNzSWR4LCAodTgpV2NpZCk7CiAKLS8vIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlCisvKiBhZGQgQ2xpZW50IHNlY3VyaXR5IGluZm9ybWF0aW9uIGludG8gQVNJQyBXQ0lEIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLwogI2RlZmluZSBSVE1QX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJXAogCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBhcGlkeCwgS2V5SUQsCQkJXAogCQkJCQkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnLCBwRW50cnkpOwpAQCAtMzQ3LDM2ICsyNTcsMzMgQEAKIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsCQlcCiAJCQkJCQkgIHBFbnRyeSk7IH0KIAotCi0vLyBJbnNlcnQgdGhlIEJBIGJpdG1hcCB0byBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQorLyogSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkgKi8KICNkZWZpbmUgUlRNUF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCVwKIAkJZG97CQkJCQlcCi0JCQlVSU5UMzIJX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJCVwKKwkJCXUzMiBfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQkJXAogCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX0FpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCiAJCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpO1wKIAkJCV9WYWx1ZSB8PSAoMHgxMDAwMDw8KF9USUQpKTsJXAogCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTtcCiAJCX13aGlsZSgwKQogCi0KLS8vIFJlbW92ZSB0aGUgQkEgYml0bWFwIGZyb20gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKLS8vCQliaXRtYXAgZmllbGQgc3RhcnRzIGF0IDB4MTAwMDAgaW4gQVNJQyBXQ0lEIHRhYmxlCisvKiBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5ICovCisvKiAgICAgICAgICAgICAgYml0bWFwIGZpZWxkIHN0YXJ0cyBhdCAweDEwMDAwIGluIEFTSUMgV0NJRCB0YWJsZSAqLwogI2RlZmluZSBSVE1QX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAogCQlkb3sJCQkJCQkJCVwKLQkJCVVJTlQzMglfVmFsdWUgPSAwLCBfT2Zmc2V0OwkJCQlcCisJCQl1MzIgX1ZhbHVlID0gMCwgX09mZnNldDsJCQkJXAogCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX1djaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAogCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQlcCiAJCQlfVmFsdWUgJj0gKH4oMHgxMDAwMCA8PCAoX1RJRCkpKTsJCQkJXAogCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQlcCiAJCX13aGlsZSgwKQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEludGVyZmFjZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8vCi0vLyBFbmFibGUgJiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgdmlhIHdyaXRpbmcgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKLS8vIFNpbmNlIGl0IHVzZSBBREFQVEVSIHN0cnVjdHVyZSwgaXQgaGF2ZSB0byBiZSBwdXQgYWZ0ZXIgc3RydWN0dXJlIGRlZmluaXRpb24uCi0vLworLyogKi8KKy8qIEVuYWJsZSAmIERpc2FibGUgTklDIGludGVycnVwdCB2aWEgd3JpdGluZyBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworLyogU2luY2UgaXQgdXNlIEFEQVBURVIgc3RydWN0dXJlLCBpdCBoYXZlIHRvIGJlIHB1dCBhZnRlciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gKi8KKy8qICovCiAjZGVmaW5lIFJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShfcEFkKQkJXAogCWRvewkJCVwKIAkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgSU5UX01BU0tfQ1NSLCAweDApOyAgICAgLyogMDogZGlzYWJsZSAqLwlcCkBAIC0zODksNyArMjk2LDYgQEAKIAkJUlRNUF9TRVRfRkxBRygoX3BBZCksIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7CVwKIAl9d2hpbGUoMCkKIAotCiAjZGVmaW5lIFJUTVBfSVJRX0lOSVQocEFkKQlcCiAJewlwQWQtPmludF9lbmFibGVfcmVnID0gKChERUxBWUlOVE1BU0spIHwJCVwKIAkJCQkJKFJ4SU5UfFR4RGF0YUludHxUeE1nbXRJbnQpKSAmIH4oMHgwMyk7CVwKQEAgLTQwMSw3ICszMDcsNiBAQAogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgMHhmZmZmZmZmZik7XAogCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOyB9CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0gTUxNRSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCiAjZGVmaW5lIFJUTVBfTUxNRV9IQU5ETEVSKHBBZCkJCQlNbG1lSGFuZGxlcihwQWQpCiAKQEAgLTQxOSw4ICszMjQsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0gUG93ZXIgU2F2ZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCiAjZGVmaW5lIFJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCkJCQkJRW5xdWV1ZVBzUG9sbChwQWQpCiAKLQotLy8gRm9yIFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUgKCkgZnVuY3Rpb24KKy8qIEZvciBSVE1QUENJZVBvd2VyTGlua0N0cmxSZXN0b3JlICgpIGZ1bmN0aW9uICovCiAjZGVmaW5lIFJFU1RPUkVfSEFMVAkJMQogI2RlZmluZSBSRVNUT1JFX1dBS0VVUAkJMgogI2RlZmluZSBSRVNUT1JFX0NMT1NFICAgICAgICAgICAzCkBAIC00MzMsOCArMzM3LDYgQEAKICNkZWZpbmUgQ0lEMk1BU0sJCTB4MDBmZjAwMDAKICNkZWZpbmUgQ0lEM01BU0sJCTB4ZmYwMDAwMDAKIAotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCiAjZGVmaW5lIFJUTVBfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpIFwKICAgICBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAocEFkLCBiRnJvbVR4KTsKIApAQCAtNDQzLDcgKzM0NSw2IEBACiAKICNkZWZpbmUgUlRNUF9TRVRfUFNNX0JJVChfcEFkLCBfdmFsKSBcCiAJTWxtZVNldFBzbUJpdChfcEFkLCBfdmFsKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KIAogI2RlZmluZSBSVE1QX01MTUVfUkFESU9fT04ocEFkKSBcCiAgICAgUlQyOHh4UGNpTWxtZVJhZGlvT24ocEFkKTsKQEAgLTQ1MSw0ICszNTIsNCBAQAogI2RlZmluZSBSVE1QX01MTUVfUkFESU9fT0ZGKHBBZCkgXAogICAgIFJUMjh4eFBjaU1sbWVSYWRpb09GRihwQWQpOwogCi0jZW5kaWYgLy9fX01BQ19QQ0lfSF9fIC8vCisjZW5kaWYgLypfX01BQ19QQ0lfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvbWFjX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjY3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL21hY191c2IuaApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBNb2R1bGUgTmFtZToKKyAgICAgICAgbWFjX3VzYi5oCisKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9fTUFDX1VTQl9IX18KKyNkZWZpbmUgX19NQUNfVVNCX0hfXworCisjaW5jbHVkZSAiLi4vcnRtcF90eXBlLmgiCisjaW5jbHVkZSAicnRtcF9tYWMuaCIKKyNpbmNsdWRlICJydG1wX3BoeS5oIgorI2luY2x1ZGUgIi4uL3J0bXBfaWZhY2UuaCIKKyNpbmNsdWRlICIuLi9ydG1wX2RvdDExLmgiCisKKyNkZWZpbmUgVVNCX0NZQ19DRkcJCQkJMHgwMmE0CisKKyNkZWZpbmUgQkVBQ09OX1JJTkdfU0laRQkJMgorI2RlZmluZSBNR01UUElQRUlEWAkJCQkwCS8qIEVQNiBpcyBoaWdoZXN0IHByaW9yaXR5ICovCisKKyNkZWZpbmUgUlRNUF9QS1RfVEFJTF9QQURESU5HCTExCS8qIDMobWF4IDQgYnl0ZSBwYWRkaW5nKSArIDQgKGxhc3QgcGFja2V0IHBhZGRpbmcpICsgNCAoTWF4QnVsa091dHNpemUgYWxpZ24gcGFkZGluZykgKi8KKworI2RlZmluZSBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWAkJXAorCQkoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwJXAorCQkgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCB8IFwKKwkJIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpCisKKy8qICovCisvKiBSWElORk8gYXBwZW5kcyBhdCB0aGUgZW5kIG9mIGVhY2ggcnggcGFja2V0LiAqLworLyogKi8KKyNkZWZpbmUgUlhJTkZPX1NJWkUJCQkJNAorI2RlZmluZSBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRQk0CisKK3R5cGVkZWYgc3RydWN0IFBBQ0tFRCBydF9yeGluZm8geworCXUzMiBCQToxOworCXUzMiBEQVRBOjE7CisJdTMyIE5VTExEQVRBOjE7CisJdTMyIEZSQUc6MTsKKwl1MzIgVTJNOjE7CQkvKiAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUgKi8KKwl1MzIgTWNhc3Q6MTsJCS8qIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUgKi8KKwl1MzIgQmNhc3Q6MTsJCS8qIDE6IHRoaXMgaXMgYSBicm9hZGNhc3QgZnJhbWUgKi8KKwl1MzIgTXlCc3M6MTsJCS8qIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRCAqLworCXUzMiBDcmM6MTsJCS8qIDE6IENSQyBlcnJvciAqLworCXUzMiBDaXBoZXJFcnI6MjsJLyogMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZCAqLworCXUzMiBBTVNEVToxOwkJLyogcnggd2l0aCA4MDIuMyBoZWFkZXIsIG5vdCA4MDIuMTEgaGVhZGVyLiAqLworCXUzMiBIVEM6MTsKKwl1MzIgUlNTSToxOworCXUzMiBMMlBBRDoxOworCXUzMiBBTVBEVToxOwkJLyogVG8gYmUgbW92ZWQgKi8KKwl1MzIgRGVjcnlwdGVkOjE7CisJdTMyIFBsY3BSc3NpbDoxOworCXUzMiBDaXBoZXJBbGc6MTsKKwl1MzIgTGFzdEFNU0RVOjE7CisJdTMyIFBsY3BTaWduYWw6MTI7Cit9IFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKKworLyogKi8KKy8qIFRYSU5GTyAqLworLyogKi8KKyNkZWZpbmUgVFhJTkZPX1NJWkUJCQkJNAorCitzdHJ1Y3QgcnRfdHhpbmZvIHsKKwkvKiBXb3JkIDAgKi8KKwl1MzIgVVNCRE1BVHhQa3RMZW46MTY7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCAgVG90YWwgYnl0ZSBjb3VudHMgb2YgYWxsIHN1Yi1mcmFtZS4gKi8KKwl1MzIgcnN2Ojg7CisJdTMyIFdJVjoxOwkJLyogV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24gKi8KKwl1MzIgUVNFTDoyOwkJLyogc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBICovCisJdTMyIFN3VXNlTGFzdFJvdW5kOjE7CS8qIFNvZnR3YXJlIHVzZS4gKi8KKwl1MzIgcnN2MjoyOwkJLyogU29mdHdhcmUgdXNlLiAqLworCXUzMiBVU0JETUFOZXh0VkxEOjE7CS8qdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQgKi8KKwl1MzIgVVNCRE1BVHhidXJzdDoxOwkvKnVzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZS4gRm9yY2UgVVNCIERNQSB0cmFuc21pdCBmcmFtZSBmcm9tIGN1cnJlbnQgc2VsZWN0ZWQgZW5kcG9pbnQgKi8KK307CisKKy8qICovCisvKiBNYW5hZ2VtZW50IHJpbmcgYnVmZmVyIGZvcm1hdCAqLworLyogKi8KK3N0cnVjdCBydF9tZ210IHsKKwlCT09MRUFOIFZhbGlkOworCXU4ICpwQnVmZmVyOworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOworfTsKKworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworLyogVGhlIHN0cnVjdCBydF90eF9idWZmZXIgc3RydWN0dXJlIGZvcm1zIHRoZSB0cmFuc21pdHRlZCBVU0IgcGFja2V0IHRvIHRoZSBkZXZpY2UgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KK3N0cnVjdCBydF90eF9idWZmZXIgeworCXVuaW9uIHsKKwkJdTggV2lyZWxlc3NQYWNrZXRbVFhfQlVGRkVSX05PUk1TSVpFXTsKKwkJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgTnVsbEZyYW1lOworCQlzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lIFBzUG9sbFBhY2tldDsKKwkJc3RydWN0IHJ0X3J0c19mcmFtZSBSVFNGcmFtZTsKKwl9IGZpZWxkOworCXU4IEFnZ3JlZ2F0aW9uWzRdOwkvKkJ1ZmZlciBmb3Igc2F2ZSBBZ2dyZWdhdGlvbiBzaXplLiAqLworfTsKKworc3RydWN0IHJ0X2h0dHhfYnVmZmVyIHsKKwl1bmlvbiB7CisJCXU4IFdpcmVsZXNzUGFja2V0W01BWF9UWEJVTEtfU0laRV07CisJCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIE51bGxGcmFtZTsKKwkJc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSBQc1BvbGxQYWNrZXQ7CisJCXN0cnVjdCBydF9ydHNfZnJhbWUgUlRTRnJhbWU7CisJfSBmaWVsZDsKKwl1OCBBZ2dyZWdhdGlvbls0XTsJLypCdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4gKi8KK307CisKKy8qIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzICovCitzdHJ1Y3QgcnRfdHhfY29udGV4dCB7CisJdm9pZCAqcEFkOwkJLypJbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUgKi8KKwlQVVJCIHBVcmI7CQkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCVBJUlAgcElycDsJCS8qdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4gKi8KKwkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCXN0cnVjdCBydF90eF9idWZmZXIgKlRyYW5zZmVyQnVmZmVyOwkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCXVuc2lnbmVkIGxvbmcgQnVsa091dFNpemU7CisJdTggQnVsa091dFBpcGVJZDsKKwl1OCBTZWxmSWR4OworCUJPT0xFQU4gSW5Vc2U7CisJQk9PTEVBTiBiV2FpdGluZ0J1bGtPdXQ7CS8qIGF0IGxlYXN0IG9uZSBwYWNrZXQgaXMgaW4gdGhpcyBUeENvbnRleHQsIHJlYWR5IGZvciBtYWtpbmcgSVJQIGFueXRpbWUuICovCisJQk9PTEVBTiBiRnVsbEZvckJ1bGtPdXQ7CS8qIGFsbCB0eCBidWZmZXIgYXJlIGZ1bGwgLCBzbyB3YWl0aW5nIGZvciB0eCBidWxrb3V0LiAqLworCUJPT0xFQU4gSVJQUGVuZGluZzsKKwlCT09MRUFOIExhc3RPbmU7CisJQk9PTEVBTiBiQWdncmVnYXRpYmxlOworCXU4IEhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCXU4IFJzdlsyXTsKKwl1bnNpZ25lZCBsb25nIERhdGFPZmZzZXQ7CisJdTMyIFR4UmF0ZTsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOwkvKiB1cmIgZG1hIG9uIGxpbnV4ICovCisKK307CisKKy8qIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzICovCitzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCB7CisJdm9pZCAqcEFkOwkJLypJbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUgKi8KKwlQVVJCIHBVcmI7CQkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCVBJUlAgcElycDsJCS8qdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4gKi8KKwkvKkluaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZSAqLworCXN0cnVjdCBydF9odHR4X2J1ZmZlciAqVHJhbnNmZXJCdWZmZXI7CS8qSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplICovCisJdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZTsJLyogSW5kaWNhdGUgdGhlIHRvdGFsIGJ1bGstb3V0IHNpemUgaW4gYnl0ZXMgaW4gb25lIGJ1bGstdHJhbnNtaXNzaW9uICovCisJdTggQnVsa091dFBpcGVJZDsKKwlCT09MRUFOIElSUFBlbmRpbmc7CisJQk9PTEVBTiBMYXN0T25lOworCUJPT0xFQU4gYkN1cldyaXRpbmc7CisJQk9PTEVBTiBiUmluZ0VtcHR5OworCUJPT0xFQU4gYkNvcHlTYXZlUGFkOworCXU4IFNhdmVkUGFkWzhdOworCXU4IEhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOworCXVuc2lnbmVkIGxvbmcgQ3VyV3JpdGVQb3NpdGlvbjsJLyogSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IHdpbGwgYmUgaW5zZXJ0ZWQgc3RhcnQgZnJvbS4gKi8KKwl1bnNpZ25lZCBsb25nIEN1cldyaXRlUmVhbFBvczsJLyogSW5kaWNhdGUgdGhlIGJ1ZmZlciBvZmZzZXQgd2hpY2ggcGFja2V0IG5vdyBhcmUgd3JpdGluZyB0by4gKi8KKwl1bnNpZ25lZCBsb25nIE5leHRCdWxrT3V0UG9zaXRpb247CS8qIEluZGljYXRlIHRoZSBidWZmZXIgc3RhcnQgb2Zmc2V0IG9mIGEgYnVsay10cmFuc21pc3Npb24gKi8KKwl1bnNpZ25lZCBsb25nIEVOZXh0QnVsa091dFBvc2l0aW9uOwkvKiBJbmRpY2F0ZSB0aGUgYnVmZmVyIGVuZCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbiAqLworCXUzMiBUeFJhdGU7CisJZG1hX2FkZHJfdCBkYXRhX2RtYTsJLyogdXJiIGRtYSBvbiBsaW51eCAqLworfTsKKworLyogKi8KKy8qIFN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIHJlY2VpdmUgcGFja2V0cyBhbmQgYnVmZmVycyB0byBpbmRpY2F0ZSAqLworLyogcmVjZWl2ZSBkYXRhIHRvIHRoZSBwcm90b2NvbC4gKi8KKy8qICovCitzdHJ1Y3QgcnRfcnhfY29udGV4dCB7CisJdTggKlRyYW5zZmVyQnVmZmVyOworCXZvaWQgKnBBZDsKKwlQSVJQIHBJcnA7CQkvKnVzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBpbi4gKi8KKwlQVVJCIHBVcmI7CisJLypUaGVzZSAyIEJvb2xlYW4gc2hvdWxkbid0IGJvdGggYmUgMSBhdCB0aGUgc2FtZSB0aW1lLiAqLworCXVuc2lnbmVkIGxvbmcgQnVsa0luT2Zmc2V0OwkvKiBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nIGZvciByZW9yZGVyaW5nIC4gKi8KKy8qICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICBSZW9yZGVySW5Vc2U7ICAgLy8gQXQgbGVhc3Qgb25lIHBhY2tldCBpbiB0aGlzIGJ1ZmZlciBhcmUgaW4gcmVvcmRlcmluZyBidWZmZXIgYW5kIHdhaXQgZm9yIHJlY2VpdmUgaW5kaWNhdGlvbiAqLworCUJPT0xFQU4gYlJ4SGFuZGxpbmc7CS8qIE5vdGlmeSB0aGlzIHBhY2tldCBpcyBiZWluZyBwcm9jZXNzIG5vdy4gKi8KKwlCT09MRUFOIEluVXNlOwkJLyogVVNCIEhhcmR3YXJlIE9jY3VwaWVkLiBXYWl0IGZvciBVU0IgSFcgdG8gcHV0IHBhY2tldC4gKi8KKwlCT09MRUFOIFJlYWRhYmxlOwkvKiBSZWNlaXZlIENvbXBsZXRlIGJhY2suIE9LIGZvciBkcml2ZXIgdG8gaW5kaWNhdGUgcmVjZWl2aW5nIHBhY2tldC4gKi8KKwlCT09MRUFOIElSUFBlbmRpbmc7CS8qIFRPRE86IFRvIGJlIHJlbW92ZWQgKi8KKwlhdG9taWNfdCBJcnBMb2NrOworCXNwaW5sb2NrX3QgUnhDb250ZXh0TG9jazsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOwkvKiB1cmIgZG1hIG9uIGxpbnV4ICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlVU0IgRnJpbXdhcmUgUmVsYXRlZCBNQUNSTworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiA4MDUxIGZpcm13YXJlIGltYWdlIGZvciB1c2IgLSB1c2UgbGFzdC1oYWxmIGJhc2UgYWRkcmVzcyA9IDB4MzAwMCAqLworI2RlZmluZSBGSVJNV0FSRV9JTUFHRV9CQVNFCQkJMHgzMDAwCisjZGVmaW5lIE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFCQkweDEwMDAJLyogNGtieXRlICovCisKKyNkZWZpbmUgUlRNUF9XUklURV9GSVJNV0FSRShfcEFkLCBfcEZ3SW1hZ2UsIF9Gd0xlbikJCVwKKwlSVFVTQkZpcm13YXJlV3JpdGUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVVTQiBUWCBSZWxhdGVkIE1BQ1JPCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUlRNUF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJXAorCQkJZG97CQkJCQkJCQkJCQkJCVwKKwkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJCVwKKwkJCQlpZiAocEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdKQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7XAorCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRGVRdWV1ZVJ1bm5pbmdbJWRdPSBUUlVFIVxuIiwgUXVlSWR4KSk7CQlcCisJCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJXAorCQkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCQllbHNlCQkJCQkJCQkJCQkJCVwKKwkJCQl7CQkJCQkJCQkJCQkJCQlcCisJCQkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbUXVlSWR4XSA9IFRSVUU7CQkJCQlcCisJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7XAorCQkJCX0JCQkJCQkJCQkJCQkJCVwKKwkJCX13aGlsZSgwKQorCisjZGVmaW5lIFJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJCQlcCisJCQlkb3sJCQkJCQkJCQkJCQkJCQlcCisJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCisJCQkJcEFkLT5EZVF1ZXVlUnVubmluZ1tRdWVJZHhdID0gRkFMU0U7CQkJCQlcCisJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJXAorCQkJfXdoaWxlKDApCisKKyNkZWZpbmUJUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAorCQkoUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QocEFkLCBwVHhCbGstPlF1ZUlkeCwgKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKSkgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKworI2RlZmluZSBSVE1QX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQlcCisJCWRve313aGlsZSgwKQorCisjZGVmaW5lIE5FRURfUVVFVUVfQkFDS19GT1JfQUdHKF9wQWQsIF9RdWVJZHgsIF9mcmVlTnVtLCBfVHhGcmFtZVR5cGUpCQlcCisJCSgoX1R4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYgKFJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZyhfcEFkLCBfUXVlSWR4KSkpCisKKyNkZWZpbmUgSEFMX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCVwKKwkJCVJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCisJCQlSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikKKworI2RlZmluZSBIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpIFwKKwkJCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLGZyYW1lTnVtLCBwRnJlZU51bWJlcikJXAorCQkJUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsayxmcmFtZU51bSwgcEZyZWVOdW1iZXIpCisKKyNkZWZpbmUgSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBUeElkeCkJXAorCQkJUnRtcFVTQl9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgVHhJZHgpCisKKyNkZWZpbmUgSEFMX0xhc3RUeElkeChwQWQsIFF1ZUlkeCxUeElkeCkgXAorCQkJCS8qUnRtcFVTQkRhdGFMYXN0VHhJZHgocEFkLCBRdWVJZHgsVHhJZHgpICovCisKKyNkZWZpbmUgSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgUXVlSWR4KQlcCisJCQlSdG1wVVNCRGF0YUtpY2tPdXQocEFkLCBwVHhCbGssIFF1ZUlkeCkKKworI2RlZmluZSBIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pCVwKKwkJCVJ0bXBVU0JNZ210S2lja091dChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pCisKKyNkZWZpbmUgSEFMX0tpY2tPdXROdWxsRnJhbWVUeChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQlcCisJCQlSdG1wVVNCTnVsbEZyYW1lS2lja091dChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQorCisjZGVmaW5lIEdFVF9UWFJJTkdfRlJFRU5PKF9wQWQsIF9RdWVJZHgpCShfUXVlSWR4KQkvKihfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHgpICovCisjZGVmaW5lIEdFVF9NR01UUklOR19GUkVFTk8oX3BBZCkJCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIFJYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAgKglEZXZpY2UgSGFyZHdhcmUgSW50ZXJmYWNlIFJlbGF0ZWQgTUFDUk8KKyAgKi8KKyNkZWZpbmUgUlRNUF9JUlFfSU5JVChwQWQpCQkJCWRve313aGlsZSgwKQorI2RlZmluZSBSVE1QX0lSUV9FTkFCTEUocEFkKQkJCWRve313aGlsZSgwKQorCisvKgorICAqCU1MTUUgUmVsYXRlZCBNQUNSTworICAqLworI2RlZmluZSBSVE1QX01MTUVfSEFORExFUihwQWQpCQkJUlRVU0JNbG1lVXAocEFkKQorCisjZGVmaW5lIFJUTVBfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkJCQkJCQkJCVwKKwl7CWlmICgocEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYJCQkJCVwKKwkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgkJXAorCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKSB7CVwKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX0NIRUNLX0dQSU8sIE5VTEwsIDApOyB9IH0KKworI2RlZmluZSBSVE1QX01MTUVfU1RBX1FVSUNLX1JTUF9XQUtFX1VQKHBBZCkJXAorCXsJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCwgTlVMTCwgMCk7CVwKKwkJUlRVU0JNbG1lVXAocEFkKTsgfQorCisjZGVmaW5lIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAorCQkgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRVNFVF9DT05GLCAwLCBOVUxMKTsJXAorCQkgICAgICAgIFJUVVNCTWxtZVVwKHBBZCk7CisKKyNkZWZpbmUgUlRNUF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpCQlcCisJewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChfcEFkLCBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRSwgX3BFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkpKTsJXAorCQlSVFVTQk1sbWVVcChfcEFkKTsJCQkJCQkJCQlcCisJfQorCisvKgorICAqCVBvd2VyIFNhdmUgUmVsYXRlZCBNQUNSTworICAqLworI2RlZmluZSBSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpCQkJCQkJXAorCXsJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9QU1BPTEwpOwlcCisJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsgfQorCisjZGVmaW5lIFJUTVBfU1RBX0ZPUkNFX1dBS0VVUChfcEFkLCBiRnJvbVR4KSBcCisJUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKF9wQWQsIGJGcm9tVHgpOworCisjZGVmaW5lIFJUTVBfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSBcCisgICAgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKKworI2RlZmluZSBSVE1QX1NFVF9QU01fQklUKF9wQWQsIF92YWwpIFwKKwl7XAorCQlpZiAoKF9wQWQpLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApIFwKKwkJCU1sbWVTZXRQc21CaXQoX3BBZCwgX3ZhbCk7XAorCQllbHNlIFwKKwkJeyBcCisJCQl1MTYgX3BzbV92YWw7IFwKKwkJCV9wc21fdmFsID0gX3ZhbDsgXAorCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoX3BBZCwgQ01EVEhSRUFEX1NFVF9QU01fQklULCAmKF9wc21fdmFsKSwgc2l6ZW9mKHUxNikpOyBcCisJCX1cCisJfQorCisjZGVmaW5lIFJUTVBfTUxNRV9SQURJT19PTihwQWQpIFwKKyAgICBSVDI4eHhVc2JNbG1lUmFkaW9PbihwQWQpOworCisjZGVmaW5lIFJUTVBfTUxNRV9SQURJT19PRkYocEFkKSBcCisgICAgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKHBBZCk7CisKKyNlbmRpZiAvKl9fTUFDX1VTQl9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzM3h4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODYwLmgKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzM3h4LmgKY29weSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODYwLmgKaW5kZXggNmViOTM4OC4uZjMwYjgwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydDMzeHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODYwLmgKQEAgLTIzLDI2ICsyMywzMiBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnQzM3h4LmgKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKLSNpZm5kZWYgX19SVDMzWFhfSF9fCi0jZGVmaW5lIF9fUlQzM1hYX0hfXworI2lmbmRlZiBfX1JUMjg2MF9IX18KKyNkZWZpbmUgX19SVDI4NjBfSF9fCiAKLSNpZmRlZiBSVDMzeHgKKyNpbmNsdWRlICJtYWNfcGNpLmgiCiAKKyNpZm5kZWYgUlRNUF9QQ0lfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQyODYwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9QQ0lfU1VQUE9SVCIKKyNlbmRpZgogCi1leHRlcm4gUkVHX1BBSVIgUkZSZWdUYWJsZU92ZXJSVDMzOTBbXTsKLWV4dGVybiBVQ0hBUiBOVU1fUkZfUkVHX1BBUk1TX09WRVJfUlQzMzkwOworI2lmbmRlZiBSVE1QX01BQ19QQ0kKKyNlcnJvciAiRm9yIFJUMjg4MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKKyNlbmRpZgogCi0jZW5kaWYgLy8gUlQzM3h4IC8vCisvKiAqLworLyogRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZSAqLworLyogKi8KKyNkZWZpbmUgTklDMjg2MF9QQ0lfREVWSUNFX0lECTB4MDYwMQorI2RlZmluZSBOSUMyODYwX1BDSWVfREVWSUNFX0lECTB4MDY4MQorI2RlZmluZSBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQJMHgwNzAxCS8qIDFULzJSIENhcmRidXMgPz8/ICovCisjZGVmaW5lIE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQgIDB4MDc4MQkvKiAxVC8yUiBtaW5pQ2FyZCAqLwogCi0jZW5kaWYgLy9fX1JUMzNYWF9IX18gLy8KKyNkZWZpbmUgVkVOX0FXVF9QQ0llX0RFVklDRV9JRAkweDEwNTkKKyNkZWZpbmUgVkVOX0FXVF9QQ0lfVkVORE9SX0lECQkweDFBM0IKKworI2RlZmluZSBFRElNQVhfUENJX1ZFTkRPUl9JRAkJMHgxNDMyCisKKyNlbmRpZiAvKl9fUlQyODYwX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydDMzeHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDI4NzAuaApzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzN4eC5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODcwLmgKaW5kZXggNmViOTM4OC4uODI2M2YxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydDMzeHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQyODcwLmgKQEAgLTIzLDI2ICsyMywyNCBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnQzM3h4LmgKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCisjaWZuZGVmIF9fUlQyODcwX0hfXworI2RlZmluZSBfX1JUMjg3MF9IX18KIAotI2lmbmRlZiBfX1JUMzNYWF9IX18KLSNkZWZpbmUgX19SVDMzWFhfSF9fCisjaWZkZWYgUlQyODcwCiAKLSNpZmRlZiBSVDMzeHgKKyNpZm5kZWYgUlRNUF9VU0JfU1VQUE9SVAorI2Vycm9yICJGb3IgUlQyODcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9VU0JfU1VQUE9SVCIKKyNlbmRpZgogCisjaWZuZGVmIFJUTVBfTUFDX1VTQgorI2Vycm9yICJGb3IgUlQyODcwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9NQUNfVVNCIgorI2VuZGlmCiAKLWV4dGVybiBSRUdfUEFJUiBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtdOwotZXh0ZXJuIFVDSEFSIE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA7CisjaW5jbHVkZSAiLi4vcnRtcF90eXBlLmgiCisjaW5jbHVkZSAibWFjX3VzYi5oIgogCi0jZW5kaWYgLy8gUlQzM3h4IC8vCisvKiNkZWZpbmUgUlRNUF9DSElQX05BTUUgICAgICAgICAgICAgICAgIlJUMjg3MCIgKi8KIAotI2VuZGlmIC8vX19SVDMzWFhfSF9fIC8vCisjZW5kaWYgLyogUlQyODcwIC8vICovCisjZW5kaWYgLypfX1JUMjg3MF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzcwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnQzMDcwLmgKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydDMzNzAuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzA3MC5oCmluZGV4IGJmYTkwMDYuLjE3MmNlNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzcwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzA3MC5oCkBAIC0yNSw3ICsyNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgICAgTW9kdWxlIE5hbWU6Ci0gICAgcnQzMzcwLmgKKwlydDMwNzAuaAogCiAgICAgQWJzdHJhY3Q6CiAKQEAgLTM0LDMxICszNCwzNCBAQAogICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi0jaWZuZGVmIF9fUlQzMzcwX0hfXwotI2RlZmluZSBfX1JUMzM3MF9IX18KKyNpZm5kZWYgX19SVDMwNzBfSF9fCisjZGVmaW5lIF9fUlQzMDcwX0hfXwogCi0jaWZkZWYgUlQzMzcwCisjaWZkZWYgUlQzMDcwCiAKLQorI2lmbmRlZiBSVE1QX1VTQl9TVVBQT1JUCiAjZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX1VTQl9TVVBQT1JUIgorI2VuZGlmCiAKKyNpZm5kZWYgUlRNUF9NQUNfVVNCCiAjZXJyb3IgIkZvciBSVDMwNzAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVE1QX01BQ19VU0IiCisjZW5kaWYKIAogI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKICNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUkZfUldfU1VQUE9SVCIKICNlbmRpZgogCi0jaWZuZGVmIFJUMzN4eAorI2lmbmRlZiBSVDMweHgKICNlcnJvciAiRm9yIFJUMzA3MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUMzB4eCIKICNlbmRpZgogCiAjaW5jbHVkZSAibWFjX3VzYi5oIgotI2luY2x1ZGUgInJ0MzN4eC5oIgorI2luY2x1ZGUgInJ0MzB4eC5oIgogCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KKy8qICovCisvKiBEZXZpY2UgSUQgJiBWZW5kb3IgSUQsIHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2ggRUVQUk9NIHZhbHVlICovCisvKiAqLwogCi0jZW5kaWYgLy8gUlQzMzcwIC8vCisjZW5kaWYgLyogUlQzMDcwIC8vICovCiAKLSNlbmRpZiAvL19fUlQzMzcwX0hfXyAvLworI2VuZGlmIC8qX19SVDMwNzBfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzA5MC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzA5MC5oCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMDkwLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwOTAuaAppbmRleCBkMzI1Y2IwLi4xMDJiOTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzA5MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMwOTAuaApAQCAtNTUsMjMgKzU1LDE4IEBACiAjZXJyb3IgIkZvciBSVDMwOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCiAjZW5kaWYKIAotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNkZWZpbmUgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCiAjZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAogCiAjaW5jbHVkZSAibWFjX3BjaS5oIgogI2luY2x1ZGUgInJ0MzB4eC5oIgogCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMzA5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCQkvLyAxVC8xUiBtaW5pQ2FyZAotI2RlZmluZSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJCS8vIDFULzJSIG1pbmlDYXJkCi0jZGVmaW5lIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkJLy8gMlQvMlIgbWluaUNhcmQKKy8qICovCisvKiBEZXZpY2UgSUQgJiBWZW5kb3IgSUQsIHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2ggRUVQUk9NIHZhbHVlICovCisvKiAqLworI2RlZmluZSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEICAweDMwOTAJLyogMVQvMVIgbWluaUNhcmQgKi8KKyNkZWZpbmUgTklDMzA5MV9QQ0llX0RFVklDRV9JRCAgMHgzMDkxCS8qIDFULzJSIG1pbmlDYXJkICovCisjZGVmaW5lIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkvKiAyVC8yUiBtaW5pQ2FyZCAqLwogCi0jZW5kaWYgLy8gUlQzMDkwIC8vCisjZW5kaWYgLyogUlQzMDkwIC8vICovCiAKLSNlbmRpZiAvL19fUlQzMDkwX0hfXyAvLworI2VuZGlmIC8qX19SVDMwOTBfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzB4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0MzB4eC5oCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMHh4LmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMweHguaAppbmRleCA3MDk3MWEwLi4wMmUxZDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzB4eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcC9ydDMweHguaApAQCAtMzksMTAgKzM5LDkgQEAKIAogI2lmZGVmIFJUMzB4eAogCitleHRlcm4gc3RydWN0IHJ0X3JlZ19wYWlyIFJUMzB4eF9SRlJlZ1RhYmxlW107CitleHRlcm4gdTggTlVNX1JGX1JFR19QQVJNUzsKIAotZXh0ZXJuIFJFR19QQUlSIFJUMzB4eF9SRlJlZ1RhYmxlW107Ci1leHRlcm4gVUNIQVIgTlVNX1JGX1JFR19QQVJNUzsKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0jZW5kaWYgLy9fX1JUMzBYWF9IX18gLy8KKyNlbmRpZiAvKl9fUlQzMFhYX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE3MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfbWFjLmgKQEAgLTAsMCArMSwxMzA3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0bXBfbWFjLmgKKworCUFic3RyYWN0OgorCVJhbGluayBXaXJlbGVzcyBDaGlwIE1BQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCSAgV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmIF9fUlRNUF9NQUNfSF9fCisjZGVmaW5lIF9fUlRNUF9NQUNfSF9fCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogVFggLyBSWCByaW5nIGRlc2NyaXB0b3IgZm9ybWF0ICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogdGhlIGZpcnN0IDI0LWJ5dGUgaW4gVFhEIGlzIGNhbGxlZCBUWElORk8gYW5kIHdpbGwgYmUgRE1BZWQgdG8gTUFDIGJsb2NrIHRocm91Z2ggVFhGSUZPLiAqLworLyogTUFDIGJsb2NrIHVzZSB0aGlzIFRYSU5GTyB0byBjb250cm9sIHRoZSB0cmFuc21pc3Npb24gYmVoYXZpb3Igb2YgdGhpcyBmcmFtZS4gKi8KKyNkZWZpbmUgRklGT19NR01UICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZJRk9fSENDQSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBGSUZPX0VEQ0EgICAgICAgICAgICAgICAgIDIKKworLyogKi8KKy8qIFRYRCBXaXJlbGVzcyBJbmZvcm1hdGlvbiBmb3JtYXQgZm9yIFR4IHJpbmcgYW5kIE1nbXQgUmluZyAqLworLyogKi8KKy8qdHhvcCA6IGZvciB0eG9wIG1vZGUgKi8KKy8qIDA6dHhvcCBmb3IgdGhlIE1QRFUgZnJhbWUgd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMgYnkgcmVnaXN0ZXIgKi8KKy8qIDEvMi8zOnRoZSBNUERVIGZyYW1lIGlzIHNlbmQgYWZ0ZXIgUElGUy9iYWNrb2ZmL1NJRlMgKi8KK3N0cnVjdCBQQUNLRUQgcnRfdHh3aSB7CisJLyogV29yZCAwICovCisJLyogZXg6IDAwIDAzIDAwIDQwIG1lYW5zIHR4b3AgPSAzLCBQSFlNT0RFID0gMSAqLworCXUzMiBGUkFHOjE7CQkvKiAxIHRvIGluZm9ybSBUS0lQIGVuZ2luZSB0aGlzIGlzIGEgZnJhZ21lbnQuICovCisJdTMyIE1JTU9wczoxOwkvKiB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUgKi8KKwl1MzIgQ0ZBQ0s6MTsKKwl1MzIgVFM6MTsKKworCXUzMiBBTVBEVToxOworCXUzMiBNcGR1RGVuc2l0eTozOworCXUzMiB0eG9wOjI7CQkvKkZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4gKi8KKwl1MzIgcnN2OjY7CisKKwl1MzIgTUNTOjc7CisJdTMyIEJXOjE7CQkvKmNoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IeiAqLworCXUzMiBTaG9ydEdJOjE7CisJdTMyIFNUQkM6MjsJCS8qIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFICovCisJdTMyIElmczoxOwkJLyogKi8KKy8qICAgICAgdTMyICAgICAgICAgIHJzdjI6MjsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHogKi8KKwl1MzIgcnN2MjoxOworCXUzMiBUeEJGOjE7CQkvKiAzKjMgKi8KKwl1MzIgUEhZTU9ERToyOworCS8qIFdvcmQxICovCisJLyogZXg6ICAxYyBmZiAzOCAwMCBtZWFucyBBQ0s9MCwgQkFXaW5TaXplPTcsIE1QRFV0b3RhbEJ5dGVDb3VudCA9IDB4MzggKi8KKwl1MzIgQUNLOjE7CisJdTMyIE5TRVE6MTsKKwl1MzIgQkFXaW5TaXplOjY7CisJdTMyIFdpcmVsZXNzQ2xpSUQ6ODsKKwl1MzIgTVBEVXRvdGFsQnl0ZUNvdW50OjEyOworCXUzMiBQYWNrZXRJZDo0OworCS8qV29yZDIgKi8KKwl1MzIgSVY7CisJLypXb3JkMyAqLworCXUzMiBFSVY7Cit9OworCisvKiAqLworLyogUlhXSSB3aXJlbGVzcyBpbmZvcm1hdGlvbiBmb3JtYXQsIGluIFBCRi4gaW52aXNpYmxlIGluIGRyaXZlci4gKi8KKy8qICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3J4d2kgeworCS8qIFdvcmQgMCAqLworCXUzMiBXaXJlbGVzc0NsaUlEOjg7CisJdTMyIEtleUluZGV4OjI7CisJdTMyIEJTU0lEOjM7CisJdTMyIFVERjozOworCXUzMiBNUERVdG90YWxCeXRlQ291bnQ6MTI7CisJdTMyIFRJRDo0OworCS8qIFdvcmQgMSAqLworCXUzMiBGUkFHOjQ7CisJdTMyIFNFUVVFTkNFOjEyOworCXUzMiBNQ1M6NzsKKwl1MzIgQlc6MTsKKwl1MzIgU2hvcnRHSToxOworCXUzMiBTVEJDOjI7CisJdTMyIHJzdjozOworCXUzMiBQSFlNT0RFOjI7CS8qIDE6IHRoaXMgUlggZnJhbWUgaXMgdW5pY2FzdCB0byBtZSAqLworCS8qV29yZDIgKi8KKwl1MzIgUlNTSTA6ODsKKwl1MzIgUlNTSTE6ODsKKwl1MzIgUlNTSTI6ODsKKwl1MzIgcnN2MTo4OworCS8qV29yZDMgKi8KKwl1MzIgU05SMDo4OworCXUzMiBTTlIxOjg7CisJdTMyIEZPRkZTRVQ6ODsJLyogUlQzNXh4ICovCisJdTMyIHJzdjI6ODsKKwkvKnUzMiAgICAgICAgICAgICAgICByc3YyOjE2OyAqLworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBSZWdpc3RlciBmb3JtYXQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAqLworLyogU0NIL0RNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMjAwICovCisvKiAqLworLyogSU5UX1NPVVJDRV9DU1I6IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuIFdyaXRlIG9uZSB0byBjbGVhciBjb3JyZXNwb25kaW5nIGJpdCAqLworLyogKi8KKyNkZWZpbmUgRE1BX0NTUjAJCTB4MjAwCisjZGVmaW5lIElOVF9TT1VSQ0VfQ1NSCQkweDIwMAordHlwZWRlZiB1bmlvbiBfSU5UX1NPVVJDRV9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSeERlbGF5SU5UOjE7CisJCXUzMiBUeERlbGF5SU5UOjE7CisJCXUzMiBSeERvbmU6MTsKKwkJdTMyIEFjMERtYURvbmU6MTsJLyo0ICovCisJCXUzMiBBYzFEbWFEb25lOjE7CisJCXUzMiBBYzJEbWFEb25lOjE7CisJCXUzMiBBYzNEbWFEb25lOjE7CisJCXUzMiBIY2NhRG1hRG9uZToxOwkvKiBiaXQ3ICovCisJCXUzMiBNZ210RG1hRG9uZToxOworCQl1MzIgTUNVQ29tbWFuZElOVDoxOwkvKmJpdCA5ICovCisJCXUzMiBSeFR4Q29oZXJlbnQ6MTsKKwkJdTMyIFRCVFRJbnQ6MTsKKwkJdTMyIFByZVRCVFQ6MTsKKwkJdTMyIFRYRmlmb1N0YXR1c0ludDoxOwkvKkZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMgKi8KKwkJdTMyIEF1dG9XYWtldXA6MTsJLypiaXQxNCAqLworCQl1MzIgR1BUaW1lcjoxOworCQl1MzIgUnhDb2hlcmVudDoxOwkvKmJpdDE2ICovCisJCXUzMiBUeENvaGVyZW50OjE7CisJCXUzMiA6IDE0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IElOVF9TT1VSQ0VfQ1NSX1NUUlVDLCAqUElOVF9TT1VSQ0VfQ1NSX1NUUlVDOworCisvKiAqLworLyogSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYgKi8KKy8qICovCisjZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKK3R5cGVkZWYgdW5pb24gX0lOVF9NQVNLX0NTUl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJYRGVsYXlfSU5UX01TSzoxOworCQl1MzIgVHhEZWxheToxOworCQl1MzIgUnhEb25lOjE7CisJCXUzMiBBYzBEbWFEb25lOjE7CisJCXUzMiBBYzFEbWFEb25lOjE7CisJCXUzMiBBYzJEbWFEb25lOjE7CisJCXUzMiBBYzNEbWFEb25lOjE7CisJCXUzMiBIY2NhRG1hRG9uZToxOworCQl1MzIgTWdtdERtYURvbmU6MTsKKwkJdTMyIE1DVUNvbW1hbmRJTlQ6MTsKKwkJdTMyIDogMjA7CisJCXUzMiBSeENvaGVyZW50OjE7CisJCXUzMiBUeENvaGVyZW50OjE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKKworI2RlZmluZSBXUERNQV9HTE9fQ0ZHCTB4MjA4Cit0eXBlZGVmIHVuaW9uIF9XUERNQV9HTE9fQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgRW5hYmxlVHhETUE6MTsKKwkJdTMyIFR4RE1BQnVzeToxOworCQl1MzIgRW5hYmxlUnhETUE6MTsKKwkJdTMyIFJ4RE1BQnVzeToxOworCQl1MzIgV1BETUFCdXJzdFNJWkU6MjsKKwkJdTMyIEVuVFhXcml0ZUJhY2tERE9ORToxOworCQl1MzIgQmlnRW5kaWFuOjE7CisJCXUzMiBSWEhkclNjYXRlcjo4OworCQl1MzIgSERSX1NFR19MRU46MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gV1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOworCisjZGVmaW5lIFdQRE1BX1JTVF9JRFgJMHgyMGMKK3R5cGVkZWYgdW5pb24gX1dQRE1BX1JTVF9JRFhfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSU1RfRFRYX0lEWDA6MTsKKwkJdTMyIFJTVF9EVFhfSURYMToxOworCQl1MzIgUlNUX0RUWF9JRFgyOjE7CisJCXUzMiBSU1RfRFRYX0lEWDM6MTsKKwkJdTMyIFJTVF9EVFhfSURYNDoxOworCQl1MzIgUlNUX0RUWF9JRFg1OjE7CisJCXUzMiByc3Y6MTA7CisJCXUzMiBSU1RfRFJYX0lEWDA6MTsKKwkJdTMyIDogMTU7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOworI2RlZmluZSBERUxBWV9JTlRfQ0ZHICAweDAyMTAKK3R5cGVkZWYgdW5pb24gX0RFTEFZX0lOVF9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSWE1BWF9QVElNRTo4OworCQl1MzIgUlhNQVhfUElOVDo3OworCQl1MzIgUlhETFlfSU5UX0VOOjE7CisJCXUzMiBUWE1BWF9QVElNRTo4OworCQl1MzIgVFhNQVhfUElOVDo3OworCQl1MzIgVFhETFlfSU5UX0VOOjE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOworI2RlZmluZSBXTU1fQUlGU05fQ0ZHICAgMHgwMjE0Cit0eXBlZGVmIHVuaW9uIF9BSUZTTl9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBBaWZzbjA6NDsJLyogZm9yIEFDX0JFICovCisJCXUzMiBBaWZzbjE6NDsJLyogZm9yIEFDX0JLICovCisJCXUzMiBBaWZzbjI6NDsJLyogZm9yIEFDX1ZJICovCisJCXUzMiBBaWZzbjM6NDsJLyogZm9yIEFDX1ZPICovCisJCXUzMiBSc3Y6MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKKy8qICovCisvKiBDV01JTl9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMgKi8KKy8qICovCisjZGVmaW5lIFdNTV9DV01JTl9DRkcgICAweDAyMTgKK3R5cGVkZWYgdW5pb24gX0NXTUlOX0NTUl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEN3bWluMDo0OwkvKiBmb3IgQUNfQkUgKi8KKwkJdTMyIEN3bWluMTo0OwkvKiBmb3IgQUNfQksgKi8KKwkJdTMyIEN3bWluMjo0OwkvKiBmb3IgQUNfVkkgKi8KKwkJdTMyIEN3bWluMzo0OwkvKiBmb3IgQUNfVk8gKi8KKwkJdTMyIFJzdjoxNjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOworCisvKiAqLworLyogQ1dNQVhfQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDICovCisvKiAqLworI2RlZmluZSBXTU1fQ1dNQVhfQ0ZHICAgMHgwMjFjCit0eXBlZGVmIHVuaW9uIF9DV01BWF9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBDd21heDA6NDsJLyogZm9yIEFDX0JFICovCisJCXUzMiBDd21heDE6NDsJLyogZm9yIEFDX0JLICovCisJCXUzMiBDd21heDI6NDsJLyogZm9yIEFDX1ZJICovCisJCXUzMiBDd21heDM6NDsJLyogZm9yIEFDX1ZPICovCisJCXUzMiBSc3Y6MTY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKKworLyogKi8KKy8qIEFDX1RYT1BfQ1NSMDogQUNfQksvQUNfQkUgVFhPUCByZWdpc3RlciAqLworLyogKi8KKyNkZWZpbmUgV01NX1RYT1AwX0NGRyAgICAweDAyMjAKK3R5cGVkZWYgdW5pb24gX0FDX1RYT1BfQ1NSMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFjMFR4b3A7CS8qIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzICovCisJCXUxNiBBYzFUeG9wOwkvKiBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cyAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEFDX1RYT1BfQ1NSMF9TVFJVQywgKlBBQ19UWE9QX0NTUjBfU1RSVUM7CisKKy8qICovCisvKiBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIgKi8KKy8qICovCisjZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Cit0eXBlZGVmIHVuaW9uIF9BQ19UWE9QX0NTUjFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBYzJUeG9wOwkvKiBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cyAqLworCQl1MTYgQWMzVHhvcDsJLyogZm9yIEFDX1ZPLCBpbiB1bml0IG9mIDMydXMgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOworCisjZGVmaW5lIFJJTkdSRUdfRElGRgkJCTB4MTAKKyNkZWZpbmUgR1BJT19DVFJMX0NGRyAgICAweDAyMjgJLypNQUNfQ1NSMTMgKi8KKyNkZWZpbmUgTUNVX0NNRF9DRkcgICAgMHgwMjJjCisjZGVmaW5lIFRYX0JBU0VfUFRSMCAgICAgMHgwMjMwCS8qQUNfQksgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQwICAgICAgMHgwMjM0CisjZGVmaW5lIFRYX0NUWF9JRFgwICAgICAgIDB4MDIzOAorI2RlZmluZSBUWF9EVFhfSURYMCAgICAgIDB4MDIzYworI2RlZmluZSBUWF9CQVNFX1BUUjEgICAgIDB4MDI0MAkvKkFDX0JFIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBUWF9NQVhfQ05UMSAgICAgIDB4MDI0NAorI2RlZmluZSBUWF9DVFhfSURYMSAgICAgICAweDAyNDgKKyNkZWZpbmUgVFhfRFRYX0lEWDEgICAgICAweDAyNGMKKyNkZWZpbmUgVFhfQkFTRV9QVFIyICAgICAweDAyNTAJLypBQ19WSSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKKyNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4CisjZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCisjZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwCS8qQUNfVk8gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQzICAgICAgMHgwMjY0CisjZGVmaW5lIFRYX0NUWF9JRFgzICAgICAgIDB4MDI2OAorI2RlZmluZSBUWF9EVFhfSURYMyAgICAgIDB4MDI2YworI2RlZmluZSBUWF9CQVNFX1BUUjQgICAgIDB4MDI3MAkvKkhDQ0EgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFRYX01BWF9DTlQ0ICAgICAgMHgwMjc0CisjZGVmaW5lIFRYX0NUWF9JRFg0ICAgICAgIDB4MDI3OAorI2RlZmluZSBUWF9EVFhfSURYNCAgICAgIDB4MDI3YworI2RlZmluZSBUWF9CQVNFX1BUUjUgICAgIDB4MDI4MAkvKk1HTVQgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0CisjZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAorI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YworI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1CisjZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1CisjZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKKyNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MAkvKlJYIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0CisjZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4CisjZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKKworI2RlZmluZSBVU0JfRE1BX0NGRyAgICAgIDB4MDJhMAordHlwZWRlZiB1bmlvbiBfVVNCX0RNQV9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSeEJ1bGtBZ2dUT3V0Ojg7CS8qUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMgKi8KKwkJdTMyIFJ4QnVsa0FnZ0xtdDo4OwkvKlJ4IEJ1bGsgQWdncmVnYXRpb24gTGltaXQgIGluIHVuaXQgb2YgMjU2IGJ5dGVzICovCisJCXUzMiBwaHljbGVhcjoxOwkvKnBoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxICovCisJCXUzMiByc3Y6MjsKKwkJdTMyIFR4Q2xlYXI6MTsJLypDbGVhciBVU0IgRE1BIFRYIHBhdGggKi8KKwkJdTMyIFR4b3BIYWx0OjE7CS8qSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4gKi8KKwkJdTMyIFJ4QnVsa0FnZ0VuOjE7CS8qRW5hYmxlIFJ4IEJ1bGsgQWdncmVnYXRpb24gKi8KKwkJdTMyIFJ4QnVsa0VuOjE7CS8qRW5hYmxlIFVTQiBETUEgUnggKi8KKwkJdTMyIFR4QnVsa0VuOjE7CS8qRW5hYmxlIFVTQiBETUEgVHggKi8KKwkJdTMyIEVwb3V0VmFsaWQ6NjsJLypPVVQgZW5kcG9pbnQgZGF0YSB2YWxpZCAqLworCQl1MzIgUnhCdXN5OjE7CS8qVVNCIERNQSBSWCBGU00gYnVzeSAqLworCQl1MzIgVHhCdXN5OjE7CS8qVVNCIERNQSBUWCBGU00gYnVzeSAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOworCisvKiAqLworLyogIDMgIFBCRiAgcmVnaXN0ZXJzICovCisvKiAqLworLyogKi8KKy8qIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLiAqLworI2RlZmluZSBQQkZfU1lTX0NUUkwJIDB4MDQwMAorI2RlZmluZSBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgUEJGX01BWF9QQ05UCSAweDA0MEMKKyNkZWZpbmUgUEJGX0NUUkwJCTB4MDQxMAorI2RlZmluZSBQQkZfSU5UX1NUQQkgMHgwNDE0CisjZGVmaW5lIFBCRl9JTlRfRU5BCSAweDA0MTgKKyNkZWZpbmUgVFhSWFFfUENOVAkgMHgwNDM4CisjZGVmaW5lIFBCRl9EQkcJCQkgMHgwNDNjCisjZGVmaW5lIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCisKKyNpZmRlZiBSVDMweHgKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKy8qIGVGdXNlIHJlZ2lzdGVycyAqLworI2RlZmluZSBFRlVTRV9DVFJMCQkJCTB4MDU4MAorI2RlZmluZSBFRlVTRV9EQVRBMAkJCQkweDA1OTAKKyNkZWZpbmUgRUZVU0VfREFUQTEJCQkJMHgwNTk0CisjZGVmaW5lIEVGVVNFX0RBVEEyCQkJCTB4MDU5OAorI2RlZmluZSBFRlVTRV9EQVRBMwkJCQkweDA1OWMKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKworI2RlZmluZSBPU0NfQ1RSTAkJMHg1YTQKKyNkZWZpbmUgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTAkweDA1QzgKKyNkZWZpbmUgTERPX0NGRzAJCQkJMHgwNWQ0CisjZGVmaW5lIEdQSU9fU1dJVENICQkJCTB4MDVkYworCisvKiAqLworLyogIDQgIE1BQyAgcmVnaXN0ZXJzICovCisvKiAqLworLyogKi8KKy8qICA0LjEgTUFDIFNZU1RFTSAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEwMDApICovCisvKiAqLworI2RlZmluZSBNQUNfQ1NSMCAgICAgICAgICAgIDB4MTAwMAordHlwZWRlZiB1bmlvbiBfQVNJQ19WRVJfSURfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBU0lDUmV2OwkvKiByZXZlcnNpb24gIDogMCAqLworCQl1MTYgQVNJQ1ZlcjsJLyogdmVyc2lvbiA6IDI4NjAgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKKyNkZWZpbmUgTUFDX1NZU19DVFJMICAgICAgICAgICAgMHgxMDA0CS8qTUFDX0NTUjEgKi8KKyNkZWZpbmUgTUFDX0FERFJfRFcwCQkJCTB4MTAwOAkvKiBNQUMgQUREUiBEVzAgKi8KKyNkZWZpbmUgTUFDX0FERFJfRFcxCQkJIDB4MTAwYwkvKiBNQUMgQUREUiBEVzEgKi8KKy8qICovCisvKiBNQUNfQ1NSMjogU1RBIE1BQyByZWdpc3RlciAwICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTUFDX0RXMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggQnl0ZTA7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMCAqLworCQl1OCBCeXRlMTsJLyogTUFDIGFkZHJlc3MgYnl0ZSAxICovCisJCXU4IEJ5dGUyOwkvKiBNQUMgYWRkcmVzcyBieXRlIDIgKi8KKwkJdTggQnl0ZTM7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMyAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKKworLyogKi8KKy8qIE1BQ19DU1IzOiBTVEEgTUFDIHJlZ2lzdGVyIDEgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9NQUNfRFcxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBCeXRlNDsJLyogTUFDIGFkZHJlc3MgYnl0ZSA0ICovCisJCXU4IEJ5dGU1OwkvKiBNQUMgYWRkcmVzcyBieXRlIDUgKi8KKwkJdTggVTJNZU1hc2s7CisJCXU4IFJzdmQxOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IE1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKKworI2RlZmluZSBNQUNfQlNTSURfRFcwCQkJCTB4MTAxMAkvKiBNQUMgQlNTSUQgRFcwICovCisjZGVmaW5lIE1BQ19CU1NJRF9EVzEJCQkJMHgxMDE0CS8qIE1BQyBCU1NJRCBEVzEgKi8KKworLyogKi8KKy8qIE1BQ19DU1I1OiBCU1NJRCByZWdpc3RlciAxICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfTUFDX0NTUjVfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEJ5dGU0OwkvKiBCU1NJRCBieXRlIDQgKi8KKwkJdTggQnl0ZTU7CS8qIEJTU0lEIGJ5dGUgNSAqLworCQl1MTYgQnNzSWRNYXNrOjI7CS8qIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQgKi8KKwkJdTE2IE1Cc3NCY25OdW06MzsKKwkJdTE2IFJzdmQ6MTE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTUFDX0NTUjVfU1RSVUMsICpQTUFDX0NTUjVfU1RSVUM7CisKKyNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkvKiBydDI4NjBiIG1heCAxNmsgYnl0ZXMuIGJpdDEyOjEzIE1heGltdW0gUFNEVSBsZW5ndGggKHBvd2VyIGZhY3RvcikgMDoyXjEzLCAxOjJeMTQsIDI6Ml4xNSwgMzoyXjE2ICovCisjZGVmaW5lIEJCUF9DU1JfQ0ZHCQkJMHgxMDFjCS8qICovCisvKiAqLworLyogQkJQX0NTUl9DRkc6IEJCUCBzZXJpYWwgY29udHJvbCByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0JCUF9DU1JfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgVmFsdWU6ODsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIFJlZ051bTo4OwkvKiBTZWxlY3RlZCAgICAgQkJQICAgICByZWdpc3RlciAqLworCQl1MzIgZlJlYWQ6MTsJLyogMDogV3JpdGUgQkJQLCAxOiBSZWFkIEJCUCAqLworCQl1MzIgQnVzeToxOwkvKiAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuICovCisJCXUzMiBCQlBfUEFSX0RVUjoxOwkvKiAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcyAqLworCQl1MzIgQkJQX1JXX01PREU6MTsJLyogMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsICovCisJCXUzMiA6IDEyOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOworI2RlZmluZSBSRl9DU1JfQ0ZHMAkJCTB4MTAyMAorLyogKi8KKy8qIFJGX0NTUl9DRkc6IFJGIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9SRl9DU1JfQ0ZHMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJlZ0lkQW5kQ29udGVudDoyNDsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIGJpdHdpZHRoOjU7CS8qIFNlbGVjdGVkICAgICBCQlAgICAgIHJlZ2lzdGVyICovCisJCXUzMiBTdGFuZGJ5TW9kZToxOwkvKiAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMTogbG93IHdoZW4gc3RhbmRieSAqLworCQl1MzIgU2VsOjE7CS8qIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZSAqLworCQl1MzIgQnVzeToxOwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7CisjZGVmaW5lIFJGX0NTUl9DRkcxCQkJMHgxMDI0Cit0eXBlZGVmIHVuaW9uIF9SRl9DU1JfQ0ZHMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJlZ0lkQW5kQ29udGVudDoyNDsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIFJGR2FwOjU7CS8qIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykgKi8KKwkJdTMyIHJzdjo3OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7CisjZGVmaW5lIFJGX0NTUl9DRkcyCQkJMHgxMDI4CS8qICovCit0eXBlZGVmIHVuaW9uIF9SRl9DU1JfQ0ZHMl9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJlZ0lkQW5kQ29udGVudDoyNDsJLyogUmVnaXN0ZXIgICAgIHZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAgKi8KKwkJdTMyIHJzdjo4OwkvKiAwOiBpZGxlIDE6IDhidXN5ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUkZfQ1NSX0NGRzJfU1RSVUMsICpQUkZfQ1NSX0NGRzJfU1RSVUM7CisjZGVmaW5lIExFRF9DRkcJCQkJMHgxMDJjCS8qICBNQUNfQ1NSMTQgKi8KK3R5cGVkZWYgdW5pb24gX0xFRF9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBPblBlcmlvZDo4OwkvKiBibGlua2luZyBvbiBwZXJpb2QgdW5pdCAxbXMgKi8KKwkJdTMyIE9mZlBlcmlvZDo4OwkvKiBibGlua2luZyBvZmYgcGVyaW9kIHVuaXQgMW1zICovCisJCXUzMiBTbG93QmxpbmtQZXJpb2Q6NjsJLyogc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zICovCisJCXUzMiByc3Y6MjsKKwkJdTMyIFJMZWRNb2RlOjI7CS8qIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbiAqLworCQl1MzIgR0xlZE1vZGU6MjsJLyogZ3JlZW4gTGVkIE1vZGUgKi8KKwkJdTMyIFlMZWRNb2RlOjI7CS8qIHllbGxvdyBMZWQgTW9kZSAqLworCQl1MzIgTGVkUG9sYXI6MTsJLyogTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoICovCisJCXUzMiA6IDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTEVEX0NGR19TVFJVQywgKlBMRURfQ0ZHX1NUUlVDOworLyogKi8KKy8qICA0LjIgTUFDIFRJTUlORyAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDExMDApICovCisvKiAqLworI2RlZmluZSBYSUZTX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwMAkvKiBNQUNfQ1NSOCAgTUFDX0NTUjkgKi8KK3R5cGVkZWYgdW5pb24gX0lGU19TTE9UX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIENja21TaWZzVGltZTo4OwkvKiAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYICovCisJCXUzMiBPZmRtU2lmc1RpbWU6ODsJLyogIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFggKi8KKwkJdTMyIE9mZG1YaWZzVGltZTo0OwkvKk9GRE0gU0lGUy4gdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWCB3aGVuIE1BQyBkb2Vzbid0IHJlZmVyZW5jZSBCQlAgc2lnbmFsIEJCUlhFTkQgKi8KKwkJdTMyIEVJRlM6OTsJLyogIHVuaXQgMXVzICovCisJCXUzMiBCQlJ4ZW5kRW5hYmxlOjE7CS8qICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIgKi8KKwkJdTMyIHJzdjoyOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IElGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7CisKKyNkZWZpbmUgQktPRkZfU0xPVF9DRkcgICAgICAgICAgICAgMHgxMTA0CS8qICBtYWNfY3NyOSBsYXN0IDggYml0cyAqLworI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CS8qIE5BViAgKE1BQ19DU1IxNSkgKi8KKyNkZWZpbmUgQ0hfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTBDCS8qIENvdW50IGFzIGNoYW5uZWwgYnVzeSAqLworI2RlZmluZSBQQkZfTElGRV9USU1FUiAgICAgICAgICAgICAweDExMTAJLypUWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzICovCisjZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJLyogVFhSWF9DU1I5ICovCisKKyNkZWZpbmUgQkNOX09GRlNFVDAJCQkJMHgwNDJDCisjZGVmaW5lIEJDTl9PRkZTRVQxCQkJCTB4MDQzMAorCisvKiAqLworLyogQkNOX1RJTUVfQ0ZHIDogU3luY2hyb25pemF0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9CQ05fVElNRV9DRkdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBCZWFjb25JbnRlcnZhbDoxNjsJLyogaW4gdW5pdCBvZiAxLzE2IFRVICovCisJCXUzMiBiVHNmVGlja2luZzoxOwkvKiBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcgKi8KKwkJdTMyIFRzZlN5bmNNb2RlOjI7CS8qIEVuYWJsZSBUU0Ygc3luYywgMDA6IGRpc2FibGUsIDAxOiBpbmZyYSBtb2RlLCAxMDogYWQtaG9jIG1vZGUgKi8KKwkJdTMyIGJUQlRURW5hYmxlOjE7CisJCXUzMiBiQmVhY29uR2VuOjE7CS8qIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yICovCisJCXUzMiA6IDM7CisJCXUzMiBUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOworI2RlZmluZSBUQlRUX1NZTkNfQ0ZHICAgICAgICAgICAgMHgxMTE4CS8qIHR4cnhfY3NyMTAgKi8KKyNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMJLyogTG9jYWwgVFNGIHRpbWVyIGxzYiAzMiBiaXRzLiBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgVFNGX1RJTUVSX0RXMSAgICAgICAgICAgICAweDExMjAJLyogbXNiIDMyIGJpdHMuIFJlYWQtb25seS4gKi8KKyNkZWZpbmUgVEJUVF9USU1FUgkJMHgxMTI0CS8qIFRJbWVyIHJlbWFpbnMgdGlsbCBuZXh0IFRCVFQuIFJlYWQtb25seS4gIFRYUlhfQ1NSMTQgKi8KKyNkZWZpbmUgSU5UX1RJTUVSX0NGRwkJCTB4MTEyOAkvKiAqLworI2RlZmluZSBJTlRfVElNRVJfRU4JCQkweDExMmMJLyogIEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlICovCisjZGVmaW5lIENIX0lETEVfU1RBCQkJMHgxMTMwCS8qICBjaGFubmVsIGlkbGUgdGltZSAqLworI2RlZmluZSBDSF9CVVNZX1NUQQkJCTB4MTEzNAkvKiAgY2hhbm5sZSBidXN5IHRpbWUgKi8KKy8qICovCisvKiAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApICovCisvKiAqLworI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJLyogb2xkIE1BQ19DU1IxMiAqLworI2RlZmluZSBQV1JfUElOX0NGRyAgICAgICAgICAgICAweDEyMDQJLyogb2xkIE1BQ19DU1IxMiAqLworI2RlZmluZSBBVVRPX1dBS0VVUF9DRkcgICAgICAgICAgICAgMHgxMjA4CS8qIG9sZCBNQUNfQ1NSMTAgKi8KKy8qICovCisvKiBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfQVVUT19XQUtFVVBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBBdXRvTGVhZFRpbWU6ODsKKwkJdTMyIE51bW9mU2xlZXBpbmdUYnR0Ojc7CS8qIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQgKi8KKwkJdTMyIEVuYWJsZUF1dG9XYWtldXA6MTsJLyogMDpzbGVlcCwgMTphd2FrZSAqLworCQl1MzIgOiAxNjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKKy8qICovCisvKiAgNC4zIE1BQyBUWCAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEzMDApICovCisvKiAqLworCisjZGVmaW5lIEVEQ0FfQUMwX0NGRwkweDEzMDAJLypBQ19UWE9QX0NTUjAgMHgzNDc0ICovCisjZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKKyNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAorI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCit0eXBlZGVmIHVuaW9uIF9FRENBX0FDX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEFjVHhvcDo4OwkvKiAgaW4gdW5pdCBvZiAzMnVzICovCisJCXUzMiBBaWZzbjo0OwkvKiAjIG9mIHNsb3QgdGltZSAqLworCQl1MzIgQ3dtaW46NDsJLyogKi8KKwkJdTMyIEN3bWF4OjQ7CS8qdW5pdCBwb3dlciBvZiAyICovCisJCXUzMiA6IDEyOwkvKiAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOworCisjZGVmaW5lIEVEQ0FfVElEX0FDX01BUAkweDEzMTAKKyNkZWZpbmUgVFhfUFdSX0NGR18wCTB4MTMxNAorI2RlZmluZSBUWF9QV1JfQ0ZHXzEJMHgxMzE4CisjZGVmaW5lIFRYX1BXUl9DRkdfMgkweDEzMUMKKyNkZWZpbmUgVFhfUFdSX0NGR18zCTB4MTMyMAorI2RlZmluZSBUWF9QV1JfQ0ZHXzQJMHgxMzI0CisjZGVmaW5lIFRYX1BJTl9DRkcJCTB4MTMyOAorI2RlZmluZSBUWF9CQU5EX0NGRwkweDEzMmMJLyogMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6ICovCisjZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAorI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKKyNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4CisjZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKKyNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCisjZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAorCit0eXBlZGVmIHVuaW9uIF9UWF9SVFNfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQXV0b1J0c1JldHJ5TGltaXQ6ODsKKwkJdTMyIFJ0c1RocmVzOjE2OwkvKiB1bml0OmJ5dGUgKi8KKwkJdTMyIFJ0c0Zia0VuOjE7CS8qIGVuYWJsZSBydHMgcmF0ZSBmYWxsYmFjayAqLworCQl1MzIgcnN2Ojc7CS8qIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOworI2RlZmluZSBUWF9USU1FT1VUX0NGRwkweDEzNDgKK3R5cGVkZWYgdW5pb24gX1RYX1RJTUVPVVRfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgcnN2OjQ7CisJCXUzMiBNcGR1TGlmZVRpbWU6NDsJLyogIGV4cGlyYXRpb24gdGltZSA9IDJeKDkrTVBEVSBMSUZFIFRJTUUpICB1cyAqLworCQl1MzIgUnhBY2tUaW1lb3V0Ojg7CS8qIHVuaXQ6c2xvdC4gVXNlZCBmb3IgVFggcHJlY2VkdXJlICovCisJCXUzMiBUeG9wVGltZW91dDo4OwkvKlRYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkgKi8KKwkJdTMyIHJzdjI6ODsJLyogMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUgKi8KKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9USU1FT1VUX0NGR19TVFJVQywgKlBUWF9USU1FT1VUX0NGR19TVFJVQzsKKyNkZWZpbmUgVFhfUlRZX0NGRwkweDEzNGMKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgU2hvcnRSdHlMaW1pdDo4OwkvKiAgc2hvcnQgcmV0cnkgbGltaXQgKi8KKwkJdTMyIExvbmdSdHlMaW1pdDo4OwkvKmxvbmcgcmV0cnkgbGltaXQgKi8KKwkJdTMyIExvbmdSdHlUaHJlOjEyOwkvKiBMb25nIHJldHJ5IHRocmVzaG9vbGQgKi8KKwkJdTMyIE5vbkFnZ1J0eU1vZGU6MTsJLyogTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyICovCisJCXUzMiBBZ2dSdHlNb2RlOjE7CS8qIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyICovCisJCXUzMiBUeGF1dG9GQkVuYWJsZToxOwkvKiBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZSAqLworCQl1MzIgcnN2OjE7CS8qIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOworI2RlZmluZSBUWF9MSU5LX0NGRwkweDEzNTAKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQyB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXUzMiBSZW1vdGVNRkJMaWZlVGltZTo4OwkvKnJlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cyAqLworCQl1MzIgTUZCRW5hYmxlOjE7CS8qICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlICovCisJCXUzMiBSZW1vdGVVTUZTRW5hYmxlOjE7CS8qICByZW1vdGUgdW5zb2xpY2l0ICBNRkIgZW5hYmxlLiAgMDogbm90IGFwcGx5IHJlbW90ZSByZW1vdGUgdW5zb2xpY2l0IChNRlM9NykgKi8KKwkJdTMyIFR4TVJRRW46MTsJLyogIE1DUyByZXF1ZXN0IFRYIGVuYWJsZSAqLworCQl1MzIgVHhSREdFbjoxOwkvKiBSREcgVFggZW5hYmxlICovCisJCXUzMiBUeENGQWNrRW46MTsJLyogICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZSAqLworCQl1MzIgcnN2OjM7CS8qICovCisJCXUzMiBSZW1vdE1GQjo4OwkvKiAgcmVtb3RlIE1DUyBmZWVkYmFjayAqLworCQl1MzIgUmVtb3RNRlM6ODsJLypyZW1vdGUgTUNTIGZlZWRiYWNrIHNlcXVlbmNlIG51bWJlciAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0xJTktfQ0ZHX1NUUlVDLCAqUFRYX0xJTktfQ0ZHX1NUUlVDOworI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEhUTUNTMEZCSzo0OworCQl1MzIgSFRNQ1MxRkJLOjQ7CisJCXUzMiBIVE1DUzJGQks6NDsKKwkJdTMyIEhUTUNTM0ZCSzo0OworCQl1MzIgSFRNQ1M0RkJLOjQ7CisJCXUzMiBIVE1DUzVGQks6NDsKKwkJdTMyIEhUTUNTNkZCSzo0OworCQl1MzIgSFRNQ1M3RkJLOjQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7CisjZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAordHlwZWRlZiB1bmlvbiBfSFRfRkJLX0NGRzFfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBIVE1DUzhGQks6NDsKKwkJdTMyIEhUTUNTOUZCSzo0OworCQl1MzIgSFRNQ1MxMEZCSzo0OworCQl1MzIgSFRNQ1MxMUZCSzo0OworCQl1MzIgSFRNQ1MxMkZCSzo0OworCQl1MzIgSFRNQ1MxM0ZCSzo0OworCQl1MzIgSFRNQ1MxNEZCSzo0OworCQl1MzIgSFRNQ1MxNUZCSzo0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOworI2RlZmluZSBMR19GQktfQ0ZHMAkweDEzNWMKK3R5cGVkZWYgdW5pb24gX0xHX0ZCS19DRkcwX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgT0ZETU1DUzBGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDAgKi8KKwkJdTMyIE9GRE1NQ1MxRkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyAwICovCisJCXUzMiBPRkRNTUNTMkZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMSAqLworCQl1MzIgT0ZETU1DUzNGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDIgKi8KKwkJdTMyIE9GRE1NQ1M0RkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyAzICovCisJCXUzMiBPRkRNTUNTNUZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgNCAqLworCQl1MzIgT0ZETU1DUzZGQks6NDsJLyppbml0aWFsIHZhbHVlIGlzIDUgKi8KKwkJdTMyIE9GRE1NQ1M3RkJLOjQ7CS8qaW5pdGlhbCB2YWx1ZSBpcyA2ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7CisjZGVmaW5lIExHX0ZCS19DRkcxCQkweDEzNjAKK3R5cGVkZWYgdW5pb24gX0xHX0ZCS19DRkcxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQ0NLTUNTMEZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMCAqLworCQl1MzIgQ0NLTUNTMUZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMCAqLworCQl1MzIgQ0NLTUNTMkZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMSAqLworCQl1MzIgQ0NLTUNTM0ZCSzo0OwkvKmluaXRpYWwgdmFsdWUgaXMgMiAqLworCQl1MzIgcnN2OjE2OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IExHX0ZCS19DRkcxX1NUUlVDLCAqUExHX0ZCS19DRkcxX1NUUlVDOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qPT09PT09PT09PT09PT09PSBQcm90ZWN0aW9uIFBhcmFtYXRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgQ0NLX1BST1RfQ0ZHCTB4MTM2NAkvKkNDSyBQcm90ZWN0aW9uICovCisjZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKKyNkZWZpbmUgQVNJQ19sb25nTkFWCQkyCisjZGVmaW5lIEFTSUNfUlRTCQkxCisjZGVmaW5lIEFTSUNfQ1RTCQkyCit0eXBlZGVmIHVuaW9uIF9QUk9UX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFByb3RlY3RSYXRlOjE2OwkvKlByb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuICovCisJCXUzMiBQcm90ZWN0Q3RybDoyOwkvKlByb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdiAqLworCQl1MzIgUHJvdGVjdE5hdjoyOwkvKlRYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdiAqLworCQl1MzIgVHhvcEFsbG93Q2NrOjE7CS8qQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuICovCisJCXUzMiBUeG9wQWxsb3dPZmRtOjE7CS8qQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuICovCisJCXUzMiBUeG9wQWxsb3dNTTIwOjE7CS8qQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93TU00MDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93R0YyMDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgVHhvcEFsbG93R0Y0MDoxOwkvKkNDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LiAqLworCQl1MzIgUlRTVGhFbjoxOwkvKlJUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWCAqLworCQl1MzIgcnN2OjU7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7CisKKyNkZWZpbmUgT0ZETV9QUk9UX0NGRwkweDEzNjgJLypPRkRNIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJLypNTTIwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgTU00MF9QUk9UX0NGRwkweDEzNzAJLypNTTQwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgR0YyMF9QUk9UX0NGRwkweDEzNzQJLypHRjIwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJLypHUjQwIFByb3RlY3Rpb24gKi8KKyNkZWZpbmUgRVhQX0NUU19USU1FCTB4MTM3QwkvKiAqLworI2RlZmluZSBFWFBfQUNLX1RJTUUJMHgxMzgwCS8qICovCisKKy8qICovCisvKiAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkgKi8KKy8qICovCisjZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJLypUWFJYX0NTUjAgKi8KKyNkZWZpbmUgQVVUT19SU1BfQ0ZHCTB4MTQwNAkvKlRYUlhfQ1NSNCAqLworLyogKi8KKy8qIFRYUlhfQ1NSNDogQXV0by1SZXNwb25kZXIvICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfQVVUT19SU1BfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQXV0b1Jlc3BvbmRlckVuYWJsZToxOworCQl1MzIgQkFDQWNrUG9saWN5RW5hYmxlOjE7CS8qIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZSAqLworCQl1MzIgQ1RTNDBNTW9kZToxOwkvKiBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUgKi8KKwkJdTMyIENUUzQwTVJlZjoxOwkvKiBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUgKi8KKwkJdTMyIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOwkvKiAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUgKi8KKwkJdTMyIHJzdjoxOwkvKiBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUgKi8KKwkJdTMyIER1YWxDVFNFbjoxOwkvKiBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUgKi8KKwkJdTMyIEFja0N0c1BzbUJpdDoxOwkvKiBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUgKi8KKwkJdTMyIDogMjQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKKworI2RlZmluZSBMRUdBQ1lfQkFTSUNfUkFURQkweDE0MDgJLyogIFRYUlhfQ1NSNSAgICAgICAgICAgMHgzMDU0ICovCisjZGVmaW5lIEhUX0JBU0lDX1JBVEUJCTB4MTQwYworI2RlZmluZSBIVF9DVFJMX0NGRwkJMHgxNDEwCisjZGVmaW5lIFNJRlNfQ09TVF9DRkcJCTB4MTQxNAorI2RlZmluZSBSWF9QQVJTRVJfQ0ZHCQkweDE0MTgJLypTZXQgTkFWIGZvciBhbGwgcmVjZWl2ZWQgZnJhbWVzICovCisKKy8qICovCisvKiAgNC41IE1BQyBTZWN1cml0eSBjb25maWd1cmF0aW9uIChvZmZzZXQ6MHgxNTAwKSAqLworLyogKi8KKyNkZWZpbmUgVFhfU0VDX0NOVDAJCTB4MTUwMAkvKiAqLworI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CS8qICovCisjZGVmaW5lIENDTVBfRkNfTVVURQkJMHgxNTA4CS8qICovCisvKiAqLworLyogIDQuNiBIQ0NBL1BTTVAgKG9mZnNldDoweDE2MDApICovCisvKiAqLworI2RlZmluZSBUWE9QX0hMRFJfQUREUjAJCTB4MTYwMAorI2RlZmluZSBUWE9QX0hMRFJfQUREUjEJCTB4MTYwNAorI2RlZmluZSBUWE9QX0hMRFJfRVQJCTB4MTYwOAorI2RlZmluZSBRT1NfQ0ZQT0xMX1JBX0RXMAkJMHgxNjBjCisjZGVmaW5lIFFPU19DRlBPTExfQTFfRFcxCQkweDE2MTAKKyNkZWZpbmUgUU9TX0NGUE9MTF9RQwkJMHgxNjE0CisvKiAqLworLyogIDQuNyBNQUMgU3RhdGlzdGlzIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTcwMCkgKi8KKy8qICovCisjZGVmaW5lIFJYX1NUQV9DTlQwCQkweDE3MDAJLyogKi8KKyNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkvKiAqLworI2RlZmluZSBSWF9TVEFfQ05UMgkJMHgxNzA4CS8qICovCisKKy8qICovCisvKiBSWF9TVEFfQ05UMF9TVFJVQzogUlggUExDUCBlcnJvciBjb3VudCAmIFJYIENSQyBlcnJvciBjb3VudCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1JYX1NUQV9DTlQwX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQ3JjRXJyOworCQl1MTYgUGh5RXJyOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOworCisvKiAqLworLyogUlhfU1RBX0NOVDFfU1RSVUM6IFJYIEZhbHNlIENDQSBjb3VudCAmIFJYIGxvbmcgZnJhbWUgY291bnQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9SWF9TVEFfQ05UMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEZhbHNlQ2NhOworCQl1MTYgUGxjcEVycjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKKworLyogKi8KKy8qIFJYX1NUQV9DTlQyX1NUUlVDOiAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1JYX1NUQV9DTlQyX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgUnhEdXBsaUNvdW50OworCQl1MTYgUnhGaWZvT3ZlcmZsb3dDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBSWF9TVEFfQ05UMl9TVFJVQywgKlBSWF9TVEFfQ05UMl9TVFJVQzsKKyNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkvKiAqLworLyogKi8KKy8qIFNUQV9DU1IzOiBUWCBCZWFjb24gY291bnQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9UWF9TVEFfQ05UMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFR4RmFpbENvdW50OworCQl1MTYgVHhCZWFjb25Db3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKKyNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkvKiAqLworLyogKi8KKy8qIFRYX1NUQV9DTlQxOiBUWCB0eCBjb3VudCAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1RYX1NUQV9DTlQxX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgVHhTdWNjZXNzOworCQl1MTYgVHhSZXRyYW5zbWl0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOworI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CS8qICovCisvKiAqLworLyogVFhfU1RBX0NOVDI6IFRYIHR4IGNvdW50ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfVFhfU1RBX0NOVDJfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBUeFplcm9MZW5Db3VudDsKKwkJdTE2IFR4VW5kZXJGbG93Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7CisjZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJLyogKi8KKy8qICovCisvKiBUWF9TVEFfRklGT19TVFJVQzogVFggUmVzdWx0IGZvciBzcGVjaWZpYyBQSUQgc3RhdHVzIGZpZm8gcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfVFhfU1RBX0ZJRk9fU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBiVmFsaWQ6MTsJLyogMTpUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIGEgdmFsaWQgVFggcmVzdWx0ICovCisJCXUzMiBQaWRUeXBlOjQ7CisJCXUzMiBUeFN1Y2Nlc3M6MTsJLyogVHggTm8gcmV0cnkgc3VjY2VzcyAqLworCQl1MzIgVHhBZ2dyZToxOwkvKiBUeCBSZXRyeSBTdWNjZXNzICovCisJCXUzMiBUeEFja1JlcXVpcmVkOjE7CS8qIFR4IGZhaWwgKi8KKwkJdTMyIHdjaWQ6ODsJLyp3aXJlbGVzcyBjbGllbnQgaW5kZXggKi8KKy8qICAgICAgICAgICAgICB1MzIgICAgICAgICAgU3VjY2Vzc1JhdGU6MTY7IC8vaW5jbHVkZSBNQ1MsIG1vZGUgLHNob3J0R0ksIEJXIHNldHRpbmdTYW1lIGZvcm1hdCBhcyBUWFdJIFdvcmQgMCBCaXQgMzEtMTYuICovCisJCXUzMiBTdWNjZXNzUmF0ZToxMzsJLyppbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4gKi8KKwkJdTMyIFR4QkY6MTsKKwkJdTMyIFJlc2VydmU6MjsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKKy8qIERlYnVnIGNvdW50ZXIgKi8KKyNkZWZpbmUgVFhfQUdHX0NOVAkweDE3MWMKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlRfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBOb25BZ2dUeENvdW50OworCQl1MTYgQWdnVHhDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UX1NUUlVDLCAqUFRYX0FHR19DTlRfU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplMUNvdW50OworCQl1MTYgQWdnU2l6ZTJDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UMF9TVFJVQywgKlBUWF9BR0dfQ05UMF9TVFJVQzsKKy8qIERlYnVnIGNvdW50ZXIgKi8KKyNkZWZpbmUgVFhfQUdHX0NOVDEJMHgxNzI0Cit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UMV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemUzQ291bnQ7CisJCXUxNiBBZ2dTaXplNENvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOworI2RlZmluZSBUWF9BR0dfQ05UMgkweDE3MjgKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQyX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTVDb3VudDsKKwkJdTE2IEFnZ1NpemU2Q291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDJfU1RSVUMsICpQVFhfQUdHX0NOVDJfU1RSVUM7CisvKiBEZWJ1ZyBjb3VudGVyICovCisjZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYwordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDNfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplN0NvdW50OworCQl1MTYgQWdnU2l6ZThDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UM19TVFJVQywgKlBUWF9BR0dfQ05UM19TVFJVQzsKKy8qIERlYnVnIGNvdW50ZXIgKi8KKyNkZWZpbmUgVFhfQUdHX0NOVDQJMHgxNzMwCit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UNF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemU5Q291bnQ7CisJCXUxNiBBZ2dTaXplMTBDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKKyNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0Cit0eXBlZGVmIHVuaW9uIF9UWF9BR0dfQ05UNV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IEFnZ1NpemUxMUNvdW50OworCQl1MTYgQWdnU2l6ZTEyQ291bnQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gVFhfQUdHX0NOVDVfU1RSVUMsICpQVFhfQUdHX0NOVDVfU1RSVUM7CisjZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKK3R5cGVkZWYgdW5pb24gX1RYX0FHR19DTlQ2X1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgQWdnU2l6ZTEzQ291bnQ7CisJCXUxNiBBZ2dTaXplMTRDb3VudDsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBUWF9BR0dfQ05UNl9TVFJVQywgKlBUWF9BR0dfQ05UNl9TVFJVQzsKKyNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYwordHlwZWRlZiB1bmlvbiBfVFhfQUdHX0NOVDdfU1RSVUMgeworCXN0cnVjdCB7CisJCXUxNiBBZ2dTaXplMTVDb3VudDsKKwkJdTE2IEFnZ1NpemUxNkNvdW50OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFRYX0FHR19DTlQ3X1NUUlVDLCAqUFRYX0FHR19DTlQ3X1NUUlVDOworI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKK3R5cGVkZWYgdW5pb24gX01QRFVfREVOX0NOVF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFRYWmVyb0RlbENvdW50OwkvKlRYIHplcm8gbGVuZ3RoIGRlbGltaXRlciBjb3VudCAqLworCQl1MTYgUlhaZXJvRGVsQ291bnQ7CS8qUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50ICovCisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTVBEVV9ERU5fQ05UX1NUUlVDLCAqUE1QRFVfREVOX0NOVF9TVFJVQzsKKy8qICovCisvKiBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMCAqLworLyogKi8KKy8qIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4gKi8KKyNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKKworLyogKi8KKy8qIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMCAqLworLyogKi8KKyNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwCS8qOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9ICovCisjZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMAkvKiAzMi1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlICovCisjZGVmaW5lIEhXX0tFWV9FTlRSWV9TSVpFICAgICAgICAgICAweDIwCisjZGVmaW5lIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMAkvKiA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUgKi8KKyNkZWZpbmUgTUFDX0lWRUlWX1RBQkxFX0JBU0UgICAgIDB4NjAwMAkvKiA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUgKi8KKyNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKKyNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMAkvKiA0LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUgKi8KKyNkZWZpbmUgSFdfV0NJRF9BVFRSSV9TSVpFICAgNAorI2RlZmluZSBXQ0lEX1JFU0VSVkVECQkJMHg2YmZjCisjZGVmaW5lIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSAgICAgICAweDZjMDAJLyogMzItYnl0ZSAqIDE2LWVudHJ5ID0gNTEyLWJ5dGUgKi8KKyNkZWZpbmUgU0hBUkVEX0tFWV9NT0RFX0JBU0UgICAgICAgMHg3MDAwCS8qIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlICovCisjZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAorI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKKyNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKKwordHlwZWRlZiB1bmlvbiBfU0hBUkVES0VZX01PREVfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBCc3MwS2V5MENpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMEtleTFDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczBLZXkyQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MwS2V5M0NpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMUtleTBDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczFLZXkxQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MxS2V5MkNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMUtleTNDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKKworLyogOC1ieXRlIHBlciBlbnRyeSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworc3RydWN0IHJ0X2h3X3djaWRfZW50cnkgeworCXU4IEFkZHJlc3NbNl07CisJdTggUnN2WzJdOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBXQ0lEICBmb3JtYXQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyo3LjEgICBXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcyAqLworc3RydWN0IHJ0X3djaWRfZW50cnkgeworCXU4IFJYQkFCaXRtYXA3OwkvKiBiaXQwIGZvciBUSUQ4LCBiaXQ3IGZvciBUSUQgMTUgKi8KKwl1OCBSWEJBQml0bWFwMDsJLyogYml0MCBmb3IgVElEMCwgYml0NyBmb3IgVElEIDcgKi8KKwl1OCBNQUNbNl07CQkvKiAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlICovCit9OworCisvKjguMS4xIFNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcgKi8KKy8qIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZSAqLworc3RydWN0IHJ0X2h3X2tleV9lbnRyeSB7CisJdTggS2V5WzE2XTsKKwl1OCBUeE1pY1s4XTsKKwl1OCBSeE1pY1s4XTsKK307CisKKy8qOC4xLjIgSVYvRUlWICBmb3JtYXQgIDogMkRXICovCisKKy8qOC4xLjMgUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdCAgOiAxRFcgKi8KK3N0cnVjdCBydF9tYWNfYXR0cmlidXRlIHsKKwl1MzIgS2V5VGFiOjE7CS8qIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUgKi8KKwl1MzIgUGFpcktleU1vZGU6MzsKKwl1MzIgQlNTSURJZHg6MzsJLyptdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQgKi8KKwl1MzIgUlhXSVVERjozOworCXUzMiByc3Y6MjI7Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEhPU1QtTUNVIGNvbW11bmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAqLworLyogSDJNX01BSUxCT1hfQ1NSOiBIb3N0LXRvLU1DVSBNYWlsYm94ICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfSDJNX01BSUxCT1hfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBMb3dCeXRlOjg7CisJCXUzMiBIaWdoQnl0ZTo4OworCQl1MzIgQ21kVG9rZW46ODsKKwkJdTMyIE93bmVyOjg7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gSDJNX01BSUxCT1hfU1RSVUMsICpQSDJNX01BSUxCT1hfU1RSVUM7CisKKy8qICovCisvKiBNMkhfQ01EX0RPTkVfQ1NSOiBNQ1UtdG8tSG9zdCBjb21tYW5kIGNvbXBsZXRlIGluZGljYXRpb24gKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9NMkhfQ01EX0RPTkVfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBDbWRUb2tlbjA7CisJCXUzMiBDbWRUb2tlbjE7CisJCXUzMiBDbWRUb2tlbjI7CisJCXUzMiBDbWRUb2tlbjM7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKKworLypOQVZfVElNRV9DRkcgOk5BViAqLwordHlwZWRlZiB1bmlvbiBfTkFWX1RJTUVfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBTaWZzOwkvKiBpbiB1bml0IG9mIDEtdXMgKi8KKwkJdTggU2xvdFRpbWU7CS8qIGluIHVuaXQgb2YgMS11cyAqLworCQl1MTYgRWlmczo5OwkvKiBpbiB1bml0IG9mIDEtdXMgKi8KKwkJdTE2IFplcm9TaWZzOjE7CS8qIEFwcGxpZWQgemVybyBTSUZTIHRpbWVyIGFmdGVyIE9GRE0gUlggMDogZGlzYWJsZSAqLworCQl1MTYgcnN2OjY7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gTkFWX1RJTUVfQ0ZHX1NUUlVDLCAqUE5BVl9USU1FX0NGR19TVFJVQzsKKworLyogKi8KKy8qIFJYX0ZJTFRSX0NGRzogIC9SWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUlhfRklMVFJfQ0ZHX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgRHJvcENSQ0VycjoxOwkvKiBEcm9wIENSQyBlcnJvciAqLworCQl1MzIgRHJvcFBoeUVycjoxOwkvKiBEcm9wIHBoeXNpY2FsIGVycm9yICovCisJCXUzMiBEcm9wTm90VG9NZToxOwkvKiBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lICovCisJCXUzMiBEcm9wTm90TXlCU1NJRDoxOwkvKiBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZSAqLworCisJCXUzMiBEcm9wVmVyRXJyOjE7CS8qIERyb3AgdmVyc2lvbiBlcnJvciBmcmFtZSAqLworCQl1MzIgRHJvcE1jYXN0OjE7CS8qIERyb3AgbXVsdGljYXN0IGZyYW1lcyAqLworCQl1MzIgRHJvcEJjYXN0OjE7CS8qIERyb3AgYnJvYWRjYXN0IGZyYW1lcyAqLworCQl1MzIgRHJvcER1cGxpY2F0ZToxOwkvKiBEcm9wIGR1cGxpY2F0ZSBmcmFtZSAqLworCisJCXUzMiBEcm9wQ0ZFbmRBY2s6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wQ0ZFbmQ6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wQWNrOjE7CS8qIERyb3AgUHMtUG9sbCAqLworCQl1MzIgRHJvcEN0czoxOwkvKiBEcm9wIFBzLVBvbGwgKi8KKworCQl1MzIgRHJvcFJ0czoxOwkvKiBEcm9wIFBzLVBvbGwgKi8KKwkJdTMyIERyb3BQc1BvbGw6MTsJLyogRHJvcCBQcy1Qb2xsICovCisJCXUzMiBEcm9wQkE6MTsJLyogKi8KKwkJdTMyIERyb3BCQVI6MTsJLyogKi8KKworCQl1MzIgRHJvcFJzdkNudGxUeXBlOjE7CisJCXUzMiA6IDE1OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7CisKKy8qICovCisvKiBQSFlfQ1NSNDogUkYgc2VyaWFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9QSFlfQ1NSNF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJGUmVnVmFsdWU6MjQ7CS8qIFJlZ2lzdGVyICAgICB2YWx1ZSAoaW5jbHVkZSByZWdpc3RlciBpZCkgICAgIHNlcmlhbCBvdXQgdG8gUkYvSUYgICAgIGNoaXAuICovCisJCXUzMiBOdW1iZXJPZkJpdHM6NTsJLyogTnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBSRlJlZ1ZhbHVlIChJOjIwLCAgICAgUkZNRDoyMikgKi8KKwkJdTMyIElGU2VsZWN0OjE7CS8qIDE6IHNlbGVjdCBJRiB0byBwcm9ncmFtLCAgICAgMDogc2VsZWN0IFJGIHRvIHByb2dyYW0gKi8KKwkJdTMyIFBMTF9MRDoxOwkvKiBSRiBQTExfTEQgc3RhdHVzICovCisJCXUzMiBCdXN5OjE7CS8qIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLiAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOworCisvKiAqLworLyogU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX1NFQ19DU1I1X1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MzIgQnNzMktleTBDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczJLZXkxQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MyS2V5MkNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzMktleTNDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczNLZXkwQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJCXUzMiBCc3MzS2V5MUNpcGhlckFsZzozOworCQl1MzIgOiAxOworCQl1MzIgQnNzM0tleTJDaXBoZXJBbGc6MzsKKwkJdTMyIDogMTsKKwkJdTMyIEJzczNLZXkzQ2lwaGVyQWxnOjM7CisJCXUzMiA6IDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7CisKKy8qICovCisvKiBIT1NUX0NNRF9DU1I6IEZvciBIT1NUIHRvIGludGVycnVwdCBlbWJlZGRlZCBwcm9jZXNzb3IgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9IT1NUX0NNRF9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBIb3N0Q29tbWFuZDo4OworCQl1MzIgUnN2OjI0OworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IEhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7CisKKy8qICovCisvKiBBSUZTTl9DU1I6IEFJRlNOIGZvciBlYWNoIEVEQ0EgQUMgKi8KKy8qICovCisKKy8qICovCisvKiBFMlBST01fQ1NSOiBFRVBST00gY29udHJvbCByZWdpc3RlciAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0UyUFJPTV9DU1JfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSZWxvYWQ6MTsJLyogUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuICovCisJCXUzMiBFZXByb21TSzoxOworCQl1MzIgRWVwcm9tQ1M6MTsKKwkJdTMyIEVlcHJvbURJOjE7CisJCXUzMiBFZXByb21ETzoxOworCQl1MzIgVHlwZToxOwkvKiAxOiA5M0M0NiwgMDo5M0M2NiAqLworCQl1MzIgTG9hZFN0YXR1czoxOwkvKiAxOmxvYWRpbmcsIDA6ZG9uZSAqLworCQl1MzIgUnN2ZDoyNTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7CisKKy8qICovCisvKiBRT1NfQ1NSMDogVFhPUCBob2xkZXIgYWRkcmVzczAgcmVnaXN0ZXIgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9RT1NfQ1NSMF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggQnl0ZTA7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMCAqLworCQl1OCBCeXRlMTsJLyogTUFDIGFkZHJlc3MgYnl0ZSAxICovCisJCXU4IEJ5dGUyOwkvKiBNQUMgYWRkcmVzcyBieXRlIDIgKi8KKwkJdTggQnl0ZTM7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgMyAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFFPU19DU1IwX1NUUlVDLCAqUFFPU19DU1IwX1NUUlVDOworCisvKiAqLworLyogUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyICovCisvKiAqLwordHlwZWRlZiB1bmlvbiBfUU9TX0NTUjFfU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEJ5dGU0OwkvKiBNQUMgYWRkcmVzcyBieXRlIDQgKi8KKwkJdTggQnl0ZTU7CS8qIE1BQyBhZGRyZXNzIGJ5dGUgNSAqLworCQl1OCBSc3ZkMDsKKwkJdTggUnN2ZDE7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKK30gUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7CisKKyNkZWZpbmUJUkZfQ1NSX0NGRwkweDUwMAordHlwZWRlZiB1bmlvbiBfUkZfQ1NSX0NGR19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIFJGX0NTUl9EQVRBOjg7CS8qIERBVEEgKi8KKwkJdTMyIFRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8qIFJGIHJlZ2lzdGVyIElEICovCisJCXUzMiBSc3ZkMjozOwkvKiBSZXNlcnZlZCAqLworCQl1MzIgUkZfQ1NSX1dSOjE7CS8qIDA6IHJlYWQgIDE6IHdyaXRlICovCisJCXUzMiBSRl9DU1JfS0lDSzoxOwkvKiBraWNrIFJGIHJlZ2lzdGVyIHJlYWQvd3JpdGUgKi8KKwkJdTMyIFJzdmQxOjE0OwkvKiBSZXNlcnZlZCAqLworCX0gZmllbGQ7CisJdTMyIHdvcmQ7Cit9IFJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKKworLyogKi8KKy8qIE90aGVyIG9uLWNoaXAgc2hhcmVkIG1lbW9yeSBzcGFjZSwgYmFzZSA9IDB4MjAwMCAqLworLyogKi8KKworLyogQ0lTIHNwYWNlIC0gYmFzZSBhZGRyZXNzID0gMHgyMDAwICovCisjZGVmaW5lIEhXX0NJU19CQVNFICAgICAgICAgICAgIDB4MjAwMAorCisvKiBDYXJyaWVyLXNlbnNlIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBjYXJyaWVyLXNlbnNlIGZyYW1lIGZvciBjYXJyaWVyLXNlbnNlIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIV19DU19DVFNfQkFTRQkJCTB4NzcwMAorLyogREZTIENUUyBmcmFtZSBiYXNlIGFkZHJlc3MuIEl0J3Mgd2hlcmUgbWFjIHN0b3JlcyBDVFMgZnJhbWUgZm9yIERGUy4gKi8KKyNkZWZpbmUgSFdfREZTX0NUU19CQVNFCQkJMHg3NzgwCisjZGVmaW5lIEhXX0NUU19GUkFNRV9TSVpFCQkweDgwCisKKy8qIDIwMDQtMTEtMDggam9obiAtIHNpbmNlIE5VTEwgZnJhbWUgd29uJ3QgYmUgdGhhdCBsb25nICgyNTYgYnl0ZSkuIFdlIHN0ZWFsIDE2IHRhaWwgYnl0ZXMgKi8KKy8qIHRvIHNhdmUgZGVidWdnaW5nIHNldHRpbmdzICovCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRSAgIDB4NzdmMAkvKiAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzICovCisjZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRTIgICAweDc3NzAJLyogMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcyAqLworCisvKiBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbiAqLworLyogVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLiAqLworLyogMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MyAqLworLyogMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUgKi8KKy8qIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NyAqLworLyogICAgICAgIEl0IG9jY3VwaWVkIHRob3NlIG1lbW9yeSBvZiB3Y2lkIDIzOH4yNTMgZm9yIEJDTiA2ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNyAqLworI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAJLyogdW5pdDogYnl0ZSAqLworI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCisjZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAorI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKKyNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCisKKyNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAorI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKKyNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQorCisvKiBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwICovCisjZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKKyNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCisjZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAorI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKKyNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0CisjZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAorI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKKyNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjCS8qIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydCAqLworI2RlZmluZSBNQ1VfVFhPUF9FTlRSWV9TSVpFICAgICAzMgkvKiBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQgKi8KKyNkZWZpbmUgTUFYX05VTV9PRl9UWE9QX0VOVFJZICAgMTYJLyogVE9ETzogbXVzdCBiZSBzYW1lIHdpdGggODA1MSBmaXJtd2FyZSAqLworI2RlZmluZSBNQ1VfTUJPWF9WRVJTSU9OICAgICAgICAweDAxCS8qIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQgKi8KKyNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNQkvKiBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQgKi8KKworLyogKi8KKy8qIEhvc3QgRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDIwMCAuICBUWDAtMz1FRENBUWlkMC0zLCBUWDQ9SENDQSwgVFg1PU1HTVQsICovCisvKiAqLworLyogKi8KKy8qICBETUEgUklORyBERVNDUklQVE9SICovCisvKiAqLworI2RlZmluZSBFMlBST01fQ1NSICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJT19DTlRMX0NTUiAgICAgICAgIDB4NzdkMAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBUeCAvIFJ4IC8gTWdtdCByaW5nIGRlc2NyaXB0b3IgZGVmaW5pdGlvbiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiB0aGUgZm9sbG93aW5nIFBJRCB2YWx1ZXMgYXJlIHVzZWQgdG8gbWFyayBvdXRnb2luZyBmcmFtZSB0eXBlIGluIFRYRC0+UElEIHNvIHRoYXQgKi8KKy8qIHByb3BlciBUWCBzdGF0aXN0aWNzIGNhbiBiZSBjb2xsZWN0ZWQgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcyAqLworLyogYjMtMiBvZiBQSUQgZmllbGQgLSAqLworI2RlZmluZSBQSURfTUdNVAkJCTB4MDUKKyNkZWZpbmUgUElEX0JFQUNPTgkJCTB4MGMKKyNkZWZpbmUgUElEX0RBVEFfTk9STUFMVUNBU1QJCTB4MDIKKyNkZWZpbmUgUElEX0RBVEFfQU1QRFUJCTB4MDQKKyNkZWZpbmUgUElEX0RBVEFfTk9fQUNLCQkweDA4CisjZGVmaW5lIFBJRF9EQVRBX05PVF9OT1JNX0FDSwkJMHgwMworLyogdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KSAqLworI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxCS8qIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZSAqLworI2RlZmluZSBRSURfQUNfQkUgICAgICAgICAgICAgICAwCS8qIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZSAqLworI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCisjZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAorI2RlZmluZSBOVU1fT0ZfVFhfUklORyAgICAgICAgICA0CisjZGVmaW5lIFFJRF9NR01UICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIFFJRF9SWCAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFFJRF9PVEhFUiAgICAgICAgICAgICAgIDE1CisKKyNlbmRpZiAvKiBfX1JUTVBfTUFDX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3BoeS5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXAvcnRtcF9waHkuaAppbmRleCBiOTg0OGNhLi44YjhiMGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGh5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwL3J0bXBfcGh5LmgKQEAgLTM4LDcgKzM4LDYgQEAKICNpZm5kZWYgX19SVE1QX1BIWV9IX18KICNkZWZpbmUgX19SVE1QX1BIWV9IX18KIAotCiAvKgogCVJGIHNlY3Rpb25zCiAqLwpAQCAtNzUsMzEgKzc0LDMwIEBACiAjZGVmaW5lIFJGX1IzMAkJCTMwCiAjZGVmaW5lIFJGX1IzMQkJCTMxCiAKLQotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUKLSNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMi40RyAyVDNSCi0jZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDIuNEcvNUcgMlQzUgotI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMyAgICAgICAvLyAyLjRHIDFUMlIKLSNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMi40Ry81RyAxVDJSCi0jZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDIuNEcgMVQxUgotI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAyLjRHIEIvRwotI2RlZmluZSBSRklDXzMwMjEgICAgICAgICAgICAgICAgICAgNyAgICAgICAvLyAyLjRHIDFUMlIKLSNkZWZpbmUgUkZJQ18zMDIyICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gMi40RyAyVDJSCi0jZGVmaW5lIFJGSUNfMzA1MiAgICAgICAgICAgICAgICAgICA5ICAgICAgIC8vIDIuNEcvNUcgMlQyUgorLyogdmFsdWUgZG9tYWluIG9mIHBBZC0+UmZJY1R5cGUgKi8KKyNkZWZpbmUgUkZJQ18yODIwICAgICAgICAgICAgICAgICAgIDEJLyogMi40RyAyVDNSICovCisjZGVmaW5lIFJGSUNfMjg1MCAgICAgICAgICAgICAgICAgICAyCS8qIDIuNEcvNUcgMlQzUiAqLworI2RlZmluZSBSRklDXzI3MjAgICAgICAgICAgICAgICAgICAgMwkvKiAyLjRHIDFUMlIgKi8KKyNkZWZpbmUgUkZJQ18yNzUwICAgICAgICAgICAgICAgICAgIDQJLyogMi40Ry81RyAxVDJSICovCisjZGVmaW5lIFJGSUNfMzAyMCAgICAgICAgICAgICAgICAgICA1CS8qIDIuNEcgMVQxUiAqLworI2RlZmluZSBSRklDXzIwMjAgICAgICAgICAgICAgICAgICAgNgkvKiAyLjRHIEIvRyAqLworI2RlZmluZSBSRklDXzMwMjEgICAgICAgICAgICAgICAgICAgNwkvKiAyLjRHIDFUMlIgKi8KKyNkZWZpbmUgUkZJQ18zMDIyICAgICAgICAgICAgICAgICAgIDgJLyogMi40RyAyVDJSICovCisjZGVmaW5lIFJGSUNfMzA1MiAgICAgICAgICAgICAgICAgICA5CS8qIDIuNEcvNUcgMlQyUiAqLwogCiAvKgogCUJCUCBzZWN0aW9ucwogKi8KLSNkZWZpbmUgQkJQX1IwCQkJMCAgLy8gdmVyc2lvbgotI2RlZmluZSBCQlBfUjEJCQkxICAvLyBUU1NJCi0jZGVmaW5lIEJCUF9SMgkJCTIgIC8vIFRYIGNvbmZpZ3VyZQorI2RlZmluZSBCQlBfUjAJCQkwCS8qIHZlcnNpb24gKi8KKyNkZWZpbmUgQkJQX1IxCQkJMQkvKiBUU1NJICovCisjZGVmaW5lIEJCUF9SMgkJCTIJLyogVFggY29uZmlndXJlICovCiAjZGVmaW5lIEJCUF9SMwkJCTMKICNkZWZpbmUgQkJQX1I0CQkJNAogI2RlZmluZSBCQlBfUjUJCQk1CiAjZGVmaW5lIEJCUF9SNgkJCTYKLSNkZWZpbmUgQkJQX1IxNAkJCTE0IC8vIFJYIGNvbmZpZ3VyZQorI2RlZmluZSBCQlBfUjE0CQkJMTQJLyogUlggY29uZmlndXJlICovCiAjZGVmaW5lIEJCUF9SMTYJCQkxNgotI2RlZmluZSBCQlBfUjE3CQkJMTcgLy8gUlggc2Vuc2liaWxpdHkKKyNkZWZpbmUgQkJQX1IxNwkJCTE3CS8qIFJYIHNlbnNpYmlsaXR5ICovCiAjZGVmaW5lIEJCUF9SMTgJCQkxOAogI2RlZmluZSBCQlBfUjIxCQkJMjEKICNkZWZpbmUgQkJQX1IyMgkJCTIyCkBAIC0xMDgsMTIgKzEwNiwxMiBAQAogI2RlZmluZSBCQlBfUjI2CQkJMjYKICNkZWZpbmUgQkJQX1IyNwkJCTI3CiAjZGVmaW5lIEJCUF9SMzEJCQkzMQotI2RlZmluZSBCQlBfUjQ5CQkJNDkgLy9UU1NJCisjZGVmaW5lIEJCUF9SNDkJCQk0OQkvKlRTU0kgKi8KICNkZWZpbmUgQkJQX1I1MAkJCTUwCiAjZGVmaW5lIEJCUF9SNTEJCQk1MQogI2RlZmluZSBCQlBfUjUyCQkJNTIKICNkZWZpbmUgQkJQX1I1NQkJCTU1Ci0jZGVmaW5lIEJCUF9SNjIJCQk2MiAvLyBSeCBTUTAgVGhyZXNob2xkIEhJR0gKKyNkZWZpbmUgQkJQX1I2MgkJCTYyCS8qIFJ4IFNRMCBUaHJlc2hvbGQgSElHSCAqLwogI2RlZmluZSBCQlBfUjYzCQkJNjMKICNkZWZpbmUgQkJQX1I2NAkJCTY0CiAjZGVmaW5lIEJCUF9SNjUJCQk2NQpAQCAtMTIxLDcgKzExOSw3IEBACiAjZGVmaW5lIEJCUF9SNjcJCQk2NwogI2RlZmluZSBCQlBfUjY4CQkJNjgKICNkZWZpbmUgQkJQX1I2OQkJCTY5Ci0jZGVmaW5lIEJCUF9SNzAJCQk3MCAvLyBSeCBBR0MgU1EgQ0NLIFhjb3JyIHRocmVzaG9sZAorI2RlZmluZSBCQlBfUjcwCQkJNzAJLyogUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQgKi8KICNkZWZpbmUgQkJQX1I3MwkJCTczCiAjZGVmaW5lIEJCUF9SNzUJCQk3NQogI2RlZmluZSBCQlBfUjc3CQkJNzcKQEAgLTEzNSw3ICsxMzMsNyBAQAogI2RlZmluZSBCQlBfUjg2CQkJODYKICNkZWZpbmUgQkJQX1I5MQkJCTkxCiAjZGVmaW5lIEJCUF9SOTIJCQk5MgotI2RlZmluZSBCQlBfUjk0CQkJOTQgLy8gVHggR2FpbiBDb250cm9sCisjZGVmaW5lIEJCUF9SOTQJCQk5NAkvKiBUeCBHYWluIENvbnRyb2wgKi8KICNkZWZpbmUgQkJQX1IxMDMJCTEwMwogI2RlZmluZSBCQlBfUjEwNQkJMTA1CiAjZGVmaW5lIEJCUF9SMTA2CQkxMDYKQEAgLTE1MSwzOSArMTQ5LDIyIEBACiAjZGVmaW5lIEJCUF9SMTIyCQkxMjIKICNkZWZpbmUgQkJQX1IxMjMJCTEyMwogI2lmZGVmIFJUMzB4eAotI2RlZmluZSBCQlBfUjEzOAkJMTM4IC8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBBREMgZHluYW1pYyBvbi9vZmYgY29udHJvbAotI2VuZGlmIC8vIFJUMzB4eCAvLworI2RlZmluZSBCQlBfUjEzOAkJMTM4CS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBBREMgZHluYW1pYyBvbi9vZmYgY29udHJvbCAqLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCisjZGVmaW5lIEJCUFI5NF9ERUZBVUxUCTB4MDYJLyogQWRkIDEgdmFsdWUgd2lsbCBnYWluIDFkYiAqLwogCi0jZGVmaW5lIEJCUFI5NF9ERUZBVUxUCTB4MDYgLy8gQWRkIDEgdmFsdWUgd2lsbCBnYWluIDFkYgorLyogKi8KKy8qIEJCUCAmIFJGIGFyZSB1c2luZyBpbmRpcmVjdCBhY2Nlc3MuIEJlZm9yZSB3cml0ZSBhbnkgdmFsdWUgaW50byBpdC4gKi8KKy8qIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nIGNvbW1hbmQgcGVuZGluZyB2aWEgY2hlY2tpbmcgYnVzeSBiaXQuICovCisvKiAqLworI2RlZmluZSBNQVhfQlVTWV9DT1VOVCAgMTAwCS8qIE51bWJlciBvZiByZXRyeSBiZWZvcmUgZmFpbGluZyBhY2Nlc3MgQkJQICYgUkYgaW5kaXJlY3QgcmVnaXN0ZXIgKi8KIAorLyojZGVmaW5lIFBIWV9UUl9TV0lUQ0hfVElNRSAgICAgICAgICA1ICAvLyB1c2VjICovCiAKLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQkjZGVmaW5lIE1BWF9CQlBfSUQJMjAwCi0JI2RlZmluZSBNQVhfQkJQX01TR19TSVpFCTQwOTYKLSNlbHNlCi0jaWZkZWYgUlQzMHh4Ci0JLy8gZWRpdCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBhZGQgQkJQIFIxMzggZm9yIEFEQyBkeW5hbWljIG9uL29mZiBjb250cm9sCi0JI2RlZmluZSBNQVhfQkJQX0lECTEzOAotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2lmbmRlZiBSVDMweHgKLQkjZGVmaW5lIE1BWF9CQlBfSUQJMTM2Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JI2RlZmluZSBNQVhfQkJQX01TR19TSVpFCTIwNDgKLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLQotCi0vLwotLy8gQkJQICYgUkYgYXJlIHVzaW5nIGluZGlyZWN0IGFjY2Vzcy4gQmVmb3JlIHdyaXRlIGFueSB2YWx1ZSBpbnRvIGl0LgotLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcgY29tbWFuZCBwZW5kaW5nIHZpYSBjaGVja2luZyBidXN5IGJpdC4KLS8vCi0jZGVmaW5lIE1BWF9CVVNZX0NPVU5UICAxMDAgICAgICAgICAvLyBOdW1iZXIgb2YgcmV0cnkgYmVmb3JlIGZhaWxpbmcgYWNjZXNzIEJCUCAmIFJGIGluZGlyZWN0IHJlZ2lzdGVyCi0KLS8vI2RlZmluZSBQSFlfVFJfU1dJVENIX1RJTUUgICAgICAgICAgNSAgLy8gdXNlYwotCi0vLyNkZWZpbmUgQkJQX1IxN19MT1dfU0VOU0lCSUxJVFkgICAgIDB4NTAKLS8vI2RlZmluZSBCQlBfUjE3X01JRF9TRU5TSUJJTElUWSAgICAgMHg0MQotLy8jZGVmaW5lIEJCUF9SMTdfRFlOQU1JQ19VUF9CT1VORCAgICAweDQwCisvKiNkZWZpbmUgQkJQX1IxN19MT1dfU0VOU0lCSUxJVFkgICAgIDB4NTAgKi8KKy8qI2RlZmluZSBCQlBfUjE3X01JRF9TRU5TSUJJTElUWSAgICAgMHg0MSAqLworLyojZGVmaW5lIEJCUF9SMTdfRFlOQU1JQ19VUF9CT1VORCAgICAweDQwICovCiAKICNkZWZpbmUgUlNTSV9GT1JfVkVSWV9MT1dfU0VOU0lCSUxJVFkgICAtMzUKICNkZWZpbmUgUlNTSV9GT1JfTE9XX1NFTlNJQklMSVRZCQktNTgKQEAgLTE5OSw3ICsxODAsNyBAQAogCWlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQkgICAgICAgICAgICAgICAgXAogCXsJCQkJCQkJCQkJCQlcCiAJCVBIWV9DU1I0X1NUUlVDICBfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVVMT05HICAgICAgICAgICBfYnVzeUNudCA9IDA7ICAgICAgICAgICAgICAgICAgICBcCisJCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIF9idXN5Q250ID0gMDsgICAgICAgICAgICAgICAgICAgIFwKIAkJCQkJCQkJCQkJXAogCQlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQlSVE1QX0lPX1JFQUQzMigoX0EpLCBSRl9DU1JfQ0ZHMCwgJl92YWx1ZS53b3JkKTsgIFwKQEAgLTIxMywxNSArMTk0LDE1IEBACiAJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl9CQkJCQkJCQlcCiB9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoX0EsIF9WKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAjaWZkZWYgUlQzMHh4CiAjZGVmaW5lIFJUTVBfUkZfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICBSVDMweHhSZWFkUkZSZWdpc3RlcihfQSwgX0ksIF9wVikKICNkZWZpbmUgUlRNUF9SRl9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgIFJUMzB4eFdyaXRlUkZSZWdpc3RlcihfQSwgX0ksIF9WKQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCisjZW5kaWYgLyogUlQzMHh4IC8vICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCUJCUCByZWdpc3RlciBSZWFkL1dyaXRlIG1hcmNvIGRlZmluaXRpb25zLgpAQCAtMjMxLDcgKzIxMiw3IEBACiAjaWZkZWYgUlRNUF9NQUNfUENJCiAvKgogCWJhc2ljIG1hcmNvIGZvciBCQlAgcmVhZCBvcGVyYXRpb24uCi0JX3BBZDogdGhlIGRhdGEgc3RydWN0dXJlIHBvaW50ZXIgb2YgUlRNUF9BREFQVEVSCisJX3BBZDogdGhlIGRhdGEgc3RydWN0dXJlIHBvaW50ZXIgb2Ygc3RydWN0IHJ0X3J0bXBfYWRhcHRlcgogCV9iYnBJRCA6IHRoZSBiYnAgcmVnaXN0ZXIgSUQKIAlfcFY6IGRhdGEgcG9pbnRlciB1c2VkIHRvIHNhdmUgdGhlIHZhbHVlIG9mIHF1ZXJpZWQgYmJwIHJlZ2lzdGVyLgogCV9iVmlhTUNVOiBpZiB3ZSBuZWVkIGFjY2VzcyB0aGUgYmJwIHZpYSB0aGUgTUNVLgpAQCAtMjY3LDcgKzI0OCw3IEBACiAJCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmICAgICAgICAgICAgICBcCiAJCQkJKEJicENzci5maWVsZC5SZWdOdW0gPT0gX2JicElEKSkgICAgICAgICAgICAgICAgXAogCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCSooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAorCQkJCSooX3BWKSA9ICh1OClCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAogCQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjk1LDIwICsyNzYsNyBAQAogCUJ1dCBmb3Igc29tZSBjaGlwc2V0IHdoaWNoIGRpZG4ndCBoYXZlIG1jdSAoZS5nLiwgUkJVUyBiYXNlZCBjaGlwc2V0KSwgd2UKIAl3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIHRvbyBhbmQgZGlkbid0IGFjY2VzcyB0aGUgYmJwIHJlZ2lzdGVyIHZpYSB0aGUgTUNVLgogKi8KLSNpZm5kZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJXAotCQkJaWYgKChfQSktPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1JCVVMpCQkJXAotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4KChfQSksIChfSSksIChfcFYpLCBGQUxTRSk7CVwKLQkJCWVsc2UJCQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9CQlBfSU9fUkVBRDgoKF9BKSwgKF9JKSwgKF9wViksIFRSVUUpOwlcCi0JCX0JCQkJCQkJCQkJCQkJXAotCX13aGlsZSgwKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gUmVhZCBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRC4gR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKKy8qIFJlYWQgQkJQIHJlZ2lzdGVyIGJ5IHJlZ2lzdGVyJ3MgSUQuIEdlbmVyYXRlIFBFUiB0byB0ZXN0IEJBICovCiAjZGVmaW5lIFJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQkJCQlcCiB7CQkJCQkJCQkJCQkJCQkJCQkJXAogCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsJCQkJCQkJCQkJCVwKQEAgLTM0NSw3ICszMTMsNyBAQAogCQkJCWlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYJCQkJCQkJCVwKIAkJCQkJKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKQkJCQkJCQkJXAogCQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOwkJCQkJCQlcCisJCQkJCSooX3BWKSA9ICh1OClCYnBDc3IuZmllbGQuVmFsdWU7CQkJCQkJCVwKIAkJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQlcCiAJCQkJfQkJCQkJCQkJCQkJCQkJCQlcCiAJCQl9CQkJCQkJCQkJCQkJCQkJCVwKQEAgLTM4Myw3ICszNTEsNyBAQAogCQkJaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJgkJCQkJCQkJXAogCQkJCShCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkJCQkJCQkJCVwKIAkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCSooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7CQkJCQkJCVwKKwkJCQkqKF9wVikgPSAodTgpQmJwQ3NyLmZpZWxkLlZhbHVlOwkJCQkJCQlcCiAJCQkJYnJlYWs7CQkJCQkJCQkJCQkJCQlcCiAJCQl9CQkJCQkJCQkJCQkJCQkJCVwKIAkJfQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtMzk5LDExICszNjcsMTAgQEAKIAkJKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07CQkJCQkJCQlcCiAJfQkJCQkJCQkJCQkJCQkJCQkJXAogfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwogCiAvKgogCWJhc2ljIG1hcmNvIGZvciBCQlAgd3JpdGUgb3BlcmF0aW9uLgotCV9wQWQ6IHRoZSBkYXRhIHN0cnVjdHVyZSBwb2ludGVyIG9mIFJUTVBfQURBUFRFUgorCV9wQWQ6IHRoZSBkYXRhIHN0cnVjdHVyZSBwb2ludGVyIG9mIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIKIAlfYmJwSUQgOiB0aGUgYmJwIHJlZ2lzdGVyIElECiAJX3BWOiBkYXRhIHVzZWQgdG8gc2F2ZSB0aGUgdmFsdWUgb2YgcXVlcmllZCBiYnAgcmVnaXN0ZXIuCiAJX2JWaWFNQ1U6IGlmIHdlIG5lZWQgYWNjZXNzIHRoZSBiYnAgdmlhIHRoZSBNQ1UuCkBAIC00NDcsNyArNDE0LDYgQEAKIAkJfQkJCQkJCQkJCQkJCQkJXAogCX13aGlsZSgwKQogCi0KIC8qCiAJVGhpcyBtYXJjbyB1c2VkIGZvciB0aGUgQkJQIHdyaXRlIG9wZXJhdGlvbiB3aGljaCBkaWRuJ3QgbmVlZCB2aWEgTUNVLgogKi8KQEAgLTQ1OSwyNCArNDI1LDExIEBACiAJQnV0IGZvciBzb21lIGNoaXBzZXQgd2hpY2ggZGlkbid0IGhhdmUgbWN1IChlLmcuLCBSQlVTIGJhc2VkIGNoaXBzZXQpLCB3ZQogCXdpbGwgdXNlIHRoaXMgZnVuY3Rpb24gdG9vIGFuZCBkaWRuJ3QgYWNjZXNzIHRoZSBiYnAgcmVnaXN0ZXIgdmlhIHRoZSBNQ1UuCiAqLwotI2lmbmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCQlcCi0JZG97CQkJCQkJCQkJCQkJCQlcCi0JCWlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJXAotCQkJaWYgKChfQSktPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1JCVVMpCQkJXAotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOCgoX0EpLCAoX0kpLCAoX3BWKSwgRkFMU0UpOwlcCi0JCQllbHNlCQkJCQkJCQkJCQkJXAotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOCgoX0EpLCAoX0kpLCAoX3BWKSwgVFJVRSk7CVwKLQkJfQkJCQkJCQkJCQkJCQlcCi0JfXdoaWxlKDApCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vLyBXcml0ZSBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRCAmIHZhbHVlCisvKiBXcml0ZSBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRCAmIHZhbHVlICovCiAjZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikJCQkJCQlcCiB7CQkJCQkJCQkJCQkJCQkJCQkJXAogCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsJCQkJCQkJCQkJCVwKLQlJTlQJCQkJCUJ1c3lDbnQgPSAwOwkJCQkJCQkJCQlcCisJaW50CQkJCQlCdXN5Q250ID0gMDsJCQkJCQkJCQkJXAogCUJPT0xFQU4JCQkJCWJyYzsJCQlcCiAJaWYgKF9JIDwgTUFYX05VTV9PRl9CQlBfTEFUQ0gpCQkJCQkJCQkJCVwKIAl7CQkJCQkJCQkJCQkJCQkJCQlcCkBAIC01NTcsNDggKzUxMCwyMSBAQAogCQlEQkdQUklOVF9FUlIoKCIqKioqKiogQkJQX1dyaXRlX0xhdGNoIEJ1ZmZlciBleGNlZWRzIG1heCBib3VuZHJ5ICoqKioqKiBcbiIpKTsJXAogCX0JCQkJCQkJCQkJCQkJCQkJCQlcCiB9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKKyNpZmRlZiBSVE1QX01BQ19VU0IKKyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgIFJUVVNCUmVhZEJCUFJlZ2lzdGVyKF9BLCBfSSwgX3BWKQorI2RlZmluZSBSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpICAgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKF9BLCBfSSwgX1YpCiAKKyNkZWZpbmUgQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikJCQlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoX0EsIF9JLCBfVikKKyNkZWZpbmUgQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikJCVJUVVNCUmVhZEJCUFJlZ2lzdGVyKF9BLCBfSSwgX3BWKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAjaWZkZWYgUlQzMHh4Ci0vL05lZWQgdG8gY29sbGVjdCBlYWNoIGFudCdzIHJzc2kgY29uY3VycmVudGx5Ci0vL3Jzc2kxIGlzIHJlcG9ydCB0byBwYWlyMiBBbnQgYW5kIHJzczIgaXMgcmVwcm90IHRvIHBhaXIxIEFudCB3aGVuIDQgQW50Ci0jZGVmaW5lIENPTExFQ1RfUlhfQU5URU5OQV9BVkVSQUdFX1JTU0koX3BBZCwgX3Jzc2kxLCBfcnNzaTIpCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JU0hPUlQJQXZnUnNzaTsJCQkJCQkJCQkJCQkJCQlcCi0JVUNIQVIJVXNlZEFudDsJCQkJCQkJCQkJCQkJCQlcCi0JaWYgKF9wQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID09IDApCQkJCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVVzZWRBbnQgPSBfcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsJCQkJCQkJXAotCQlBdmdSc3NpID0gX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdOwkJCQkJCVwKLQkJaWYgKEF2Z1Jzc2kgPCAwKQkJCQkJCQkJCQkJCQlcCi0JCQlBdmdSc3NpID0gQXZnUnNzaSAtIChBdmdSc3NpID4+IDMpICsgX3Jzc2kxOwkJCQkJXAotCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKLQkJCUF2Z1Jzc2kgPSBfcnNzaTEgPDwgMzsJCQkJCQkJCQkJCVwKLQkJX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdID0gQXZnUnNzaTsJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJVXNlZEFudCA9IF9wQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQ7CQkJCQkJCVwKLQkJQXZnUnNzaSA9IF9wQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtVc2VkQW50XTsJCQkJCQlcCi0JCWlmICgoQXZnUnNzaSA8IDApICYmIChfcEFkLT5SeEFudC5GaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGUpKQkJXAotCQkJQXZnUnNzaSA9IEF2Z1Jzc2kgLSAoQXZnUnNzaSA+PiAzKSArIF9yc3NpMTsJCQkJCVwKLQkJZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCV9wQWQtPlJ4QW50LkZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZSA9IFRSVUU7CQkJCQlcCi0JCQlBdmdSc3NpID0gX3Jzc2kxIDw8IDM7CQkJCQkJCQkJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdID0gQXZnUnNzaTsJCQkJCQlcCi0JCV9wQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSsrOwkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi19Ci0KICNkZWZpbmUgUlRNUF9BU0lDX01NUFNfRElTQUJMRShfcEFkKQkJCQkJCQlcCiAJZG97CQkJCQkJCQkJCQkJCQkJXAotCQlVQ0hBUiBfYmJwRGF0YTsJCQkJCQkJCQkJCVwKLQkJVUlOVDMyIF9tYWNEYXRhOwkJCQkJCQkJCQkJXAorCQl1MzIgX21hY0RhdGE7IFwKKwkJdTggX2JicERhdGEgPSAwOyBcCiAJCS8qIGRpc2FibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlciAqLwkJCQkJCVwKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9wQWQsIEJCUF9SMywgJl9iYnBEYXRhKTsJXAogCQlfYmJwRGF0YSAmPSB+KDB4MDQpOwkvKmJpdCAyKi8JCQkJCQkJCVwKQEAgLTYxMCwxMSArNTM2LDEwIEBACiAJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCAweDEyMTAsIF9tYWNEYXRhKTsJCQkJXAogCX13aGlsZSgwKQogCi0KICNkZWZpbmUgUlRNUF9BU0lDX01NUFNfRU5BQkxFKF9wQWQpCQkJCQkJCVwKIAlkb3sJCQkJCQkJCQkJCQkJCQlcCi0JCVVDSEFSIF9iYnBEYXRhOwkJCQkJCQkJCQkJXAotCQlVSU5UMzIgX21hY0RhdGE7CQkJCQkJCQkJCQlcCisJCXUzMiBfbWFjRGF0YTsgXAorCQl1OCBfYmJwRGF0YSA9IDA7IFwKIAkJLyogZW5hYmxlIE1NUFMgQkJQIGNvbnRyb2wgcmVnaXN0ZXIgKi8JCQkJCQlcCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChfcEFkLCBCQlBfUjMsICZfYmJwRGF0YSk7CVwKIAkJX2JicERhdGEgfD0gKDB4MDQpOwkvKmJpdCAyKi8JCQkJCQkJCVwKQEAgLTYyNiw2ICs1NTEsNiBAQAogCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgMHgxMjEwLCBfbWFjRGF0YSk7CQkJCVwKIAl9d2hpbGUoMCkKIAotI2VuZGlmIC8vIFJUMzB4eCAvLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCi0jZW5kaWYgLy8gX19SVE1QX1BIWV9IX18gLy8KKyNlbmRpZiAvKiBfX1JUTVBfUEhZX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwNzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3YmFkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMDcwLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQzMDcwLmMKKworCUFic3RyYWN0OgorCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMwNzAKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgUlQzMDcwCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKKyNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgorI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLworCit2b2lkIE5JQ0luaXRSVDMwNzBSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGk7CisJdTggUkZWYWx1ZTsKKworCS8qIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMgKi8KKwkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkpIHsKKwkJLyogSW5pdCBSRiBjYWxpYnJhdGlvbiAqLworCQkvKiBEcml2ZXIgc2hvdWxkIHRvZ2dsZSBSRiBSMzAgYml0NyBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMgKi8KKwkJdTMyIFJmUmVnID0gMDsKKwkJdTMyIGRhdGE7CisKKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsICh1OCAqKSYgUmZSZWcpOworCQlSZlJlZyB8PSAweDgwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsICh1OClSZlJlZyk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJCVJmUmVnICY9IDB4N0Y7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4KVJmUmVnKTsKKworCQkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVM7IGkrKykgeworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwKKwkJCQkJICAgICAgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsCisJCQkJCSAgICAgIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKKwkJfQorCisJCS8qIGFkZCBieSBqb2hubGkgKi8KKwkJaWYgKElTX1JUMzA3MChwQWQpKSB7CisJCQkvKiAqLworCQkJLyogVGhlIERBQyBpc3N1ZShMRE9fQ0ZHMCkgaGFzIGJlZW4gZml4ZWQgaW4gUlQzMDcwKEYpLiAqLworCQkJLyogVGhlIHZvbHRhZ2UgcmFpc2luZyBwYXRjaCBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBSVDMwNzAoRikgKi8KKwkJCS8qICovCisJCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpIHsKKwkJCQkvKiAgVXBkYXRlIE1BQyAweDA1RDQgZnJvbSAwMXh4eHh4eCB0byAwRHh4eHh4eCAodm9sdGFnZSAxLjJWIHRvIDEuMzVWKSBmb3IgUlQzMDcwIHRvIGltcHJvdmUgeWllbGQgcmF0ZSAqLworCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKKwkJCQlkYXRhID0gKChkYXRhICYgMHhGMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKKwkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgZGF0YSk7CisJCQl9CisJCX0gZWxzZSBpZiAoSVNfUlQzMDcxKHBBZCkpIHsKKwkJCS8qIERyaXZlciBzaG91bGQgc2V0IFJGIFI2IGJpdDYgb24gYmVmb3JlIGluaXQgUkYgcmVnaXN0ZXJzICovCisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKHU4ICopJiBSZlJlZyk7CisJCQlSZlJlZyB8PSAweDQwOworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAodTgpUmZSZWcpOworCisJCQkvKiBpbml0IFIzMSAqLworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDE0KTsKKworCQkJLyogUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZSAqLworCQkJaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQorCQkJICAgICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpIHsKKwkJCQkvKiBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkgKi8KKwkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIExET19DRkcwLCAmZGF0YSk7CisJCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7CisJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsIGRhdGEpOworCQkJfSBlbHNlIHsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7CisJCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOworCQkJfQorCisJCQkvKiBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlICovCisJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7CisJCQlkYXRhICY9IH4oMHgyMCk7CisJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7CisJCX0KKwkJLypGb3IgUkYgZmlsdGVyIENhbGlicmF0aW9uICovCisJCVJUTVBGaWx0ZXJDYWxpYnJhdGlvbihwQWQpOworCisJCS8qIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpICovCisJCS8qICovCisJCS8qIFRYIHRvIFJYIElRIGdsaXRjaChSRl9SMjcpIGhhcyBiZWVuIGZpeGVkIGluIFJUMzA3MChGKS4gKi8KKwkJLyogUmFpc2luZyBSRiB2b2x0YWdlIGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIFJUMzA3MChGKSAqLworCQkvKiAqLworCQlpZiAoKElTX1JUMzA3MChwQWQpKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSB7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7CisJCX0gZWxzZSBpZiAoKElTX1JUMzA3MShwQWQpKQorCQkJICAgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkgeworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAweDMpOworCQl9CisJCS8qIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUgKi8KKwkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBPUFRfMTQsICZkYXRhKTsKKwkJZGF0YSB8PSAweDAxOworCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBPUFRfMTQsIGRhdGEpOworCisJCS8qIG1vdmUgZnJvbSBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAgYmVjYXVzZSBpdCdzIG5lZWRlZCBmb3IgYm90aCBSVDMwNzAgYW5kIFJUMzA3MSAqLworCQkvKiBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDA4KTsKKwkJLyogdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUgKi8KKwkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkgeworCQkJaWYgKChJU19SVDMwNzEocEFkKQorCQkJICAgICAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSkKKwkJCSAgICB8fCBJU19SVDMwNzAocEFkKSkgeworCQkJCVJGVmFsdWUgfD0gMHgyMDsKKwkJCX0KKwkJfQorCQkvKiBzZXQgUkZfUjE3X2JpdFsyOjBdIGVxdWFsIHRvIEVFUFJPTSBzZXR0aW5nIGF0IDB4NDhoICovCisJCWlmIChwQWQtPlR4TWl4ZXJHYWluMjRHID49IDEpIHsKKwkJCVJGVmFsdWUgJj0gKH4weDcpOwkvKiBjbGVhbiBiaXQgWzI6MF0gKi8KKwkJCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKKwkJfQorCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsIFJGVmFsdWUpOworCisJCWlmIChJU19SVDMwNzEocEFkKSkgeworCQkJLyogYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwICovCisJCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKKwkJfSBlbHNlIGlmIChJU19SVDMwNzAocEFkKSkgeworCQkJLyogYWRkIGJ5IGpvaG5saSwgcmVzZXQgUkZfUjI3IHdoZW4gaW50ZXJmYWNlIGRvd24gJiB1cCB0byBmaXggdGhyb3VnaHB1dCBwcm9ibGVtICovCisJCQkvKiBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAgKi8KKwkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7CisJCQkvKiBUWCB0byBSWCBJUSBnbGl0Y2goUkZfUjI3KSBoYXMgYmVlbiBmaXhlZCBpbiBSVDMwNzAoRikuICovCisJCQkvKiBSYWlzaW5nIFJGIHZvbHRhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUlQzMDcwKEYpICovCisJCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpCisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7CisJCQllbHNlCisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOworCQkJLyogZW5kIGpvaG5saSAqLworCQl9CisJfQorCit9CisjZW5kaWYgLyogUlQzMDcwIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzA5MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwpzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzA5MC5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NoaXBzL3J0MzA5MC5jCmluZGV4IDM1YzU0OWQuLjU5MjdiYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMDkwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMwOTAuYwpAQCAtMzksODUgKzM5LDgxIEBACiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotCiAjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAogI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCiAKLQotVk9JRCBOSUNJbml0UlQzMDkwUkZSZWdpc3RlcnMoSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE5JQ0luaXRSVDMwOTBSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JCUlOVCBpOwotCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwLCBkYXRhOworCWludCBpOworCS8qIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMgKi8KKwkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwlpZiAoSVNfUlQzMDkwKHBBZCkpIHsKKwkJLyogSW5pdCBSRiBjYWxpYnJhdGlvbiAqLworCQkvKiBEcml2ZXIgc2hvdWxkIHRvZ2dsZSBSRiBSMzAgYml0NyBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMgKi8KKwkJdTMyIFJmUmVnID0gMCwgZGF0YTsKIAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFBVQ0hBUikmUmZSZWcpOworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4ICopJiBSZlJlZyk7CiAJCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAodTgpUmZSZWcpOwogCQlSVE1QdXNlY0RlbGF5KDEwMDApOwogCQlSZlJlZyAmPSAweDdGOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKHU4KVJmUmVnKTsKIAotCQkvLyBpbml0IFIyNCwgUjMxCisJCS8qIGluaXQgUjI0LCBSMzEgKi8KIAkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKIAkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKIAotCQkvLyBSVDMwOXggdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkKLQkJewotCQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5CisJCS8qIFJUMzA5eCB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUgKi8KKwkJaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKQorCQkgICAgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKSkgeworCQkJLyogcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5ICovCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7CiAJCQlkYXRhID0gKChkYXRhICYgMHhFMEZGRkZGRikgfCAweDBEMDAwMDAwKTsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBkYXRhKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKIAkJCWRhdGEgPSAoKGRhdGEgJiAweEUwRkZGRkZGKSB8IDB4MDEwMDAwMDApOwogCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwogCQl9CiAKLQkJLy8gcGF0Y2ggTE5BX1BFX0cxIGZhaWxlZCBpc3N1ZQorCQkvKiBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlICovCiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKIAkJZGF0YSAmPSB+KDB4MjApOwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7CiAKLQkJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TOyBpKyspCi0JCXsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlJlZ2lzdGVyLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5WYWx1ZSk7CisJCS8qIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNUzsgaSsrKSB7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLAorCQkJCQkgICAgICBSVDMweHhfUkZSZWdUYWJsZVtpXS5SZWdpc3RlciwKKwkJCQkJICAgICAgUlQzMHh4X1JGUmVnVGFibGVbaV0uVmFsdWUpOwogCQl9CiAKLQkJLy8gRHJpdmVyIHNob3VsZCBzZXQgUkYgUjYgYml0NiBvbiBiZWZvcmUgY2FsaWJyYXRpb24KLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJmUmVnKTsKKwkJLyogRHJpdmVyIHNob3VsZCBzZXQgUkYgUjYgYml0NiBvbiBiZWZvcmUgY2FsaWJyYXRpb24gKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsICh1OCAqKSYgUmZSZWcpOwogCQlSZlJlZyB8PSAweDQwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChVQ0hBUilSZlJlZyk7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKHU4KVJmUmVnKTsKIAotCQkvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KKwkJLypGb3IgUkYgZmlsdGVyIENhbGlicmF0aW9uICovCiAJCVJUTVBGaWx0ZXJDYWxpYnJhdGlvbihwQWQpOwogCi0JCS8vIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpCisJCS8qIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpICovCiAJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKIAkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgzKTsKIAotCQkvLyBzZXQgbGVkIG9wZW4gZHJhaW4gZW5hYmxlCisJCS8qIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUgKi8KIAkJUlRNUF9JT19SRUFEMzIocEFkLCBPUFRfMTQsICZkYXRhKTsKIAkJZGF0YSB8PSAweDAxOwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBPUFRfMTQsIGRhdGEpOwogCi0JCS8vIHNldCBkZWZhdWx0IGFudGVubmEgYXMgbWFpbgorCQkvKiBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4gKi8KIAkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKQogCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7CiAKLQkJLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCisJCS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cCAqLwogCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKIAl9CiAKIH0KIAotI2VuZGlmIC8vIFJUMzA5MCAvLworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGlwcy9ydDMweHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2ODRhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hpcHMvcnQzMHh4LmMKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnQzMHh4LmMKKworCUFic3RyYWN0OgorCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmIFJUMzB4eAorCisjaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCisKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKKworLyogKi8KKy8qIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldCAqLworLyogKi8KK3N0cnVjdCBydF9yZWdfcGFpciBSVDMweHhfUkZSZWdUYWJsZVtdID0geworCXtSRl9SMDQsIDB4NDB9CisJLAorCXtSRl9SMDUsIDB4MDN9CisJLAorCXtSRl9SMDYsIDB4MDJ9CisJLAorCXtSRl9SMDcsIDB4NzB9CisJLAorCXtSRl9SMDksIDB4MEZ9CisJLAorCXtSRl9SMTAsIDB4NDF9CisJLAorCXtSRl9SMTEsIDB4MjF9CisJLAorCXtSRl9SMTIsIDB4N0J9CisJLAorCXtSRl9SMTQsIDB4OTB9CisJLAorCXtSRl9SMTUsIDB4NTh9CisJLAorCXtSRl9SMTYsIDB4QjN9CisJLAorCXtSRl9SMTcsIDB4OTJ9CisJLAorCXtSRl9SMTgsIDB4MkN9CisJLAorCXtSRl9SMTksIDB4MDJ9CisJLAorCXtSRl9SMjAsIDB4QkF9CisJLAorCXtSRl9SMjEsIDB4REJ9CisJLAorCXtSRl9SMjQsIDB4MTZ9CisJLAorCXtSRl9SMjUsIDB4MDF9CisJLAorCXtSRl9SMjksIDB4MUZ9CisJLAorfTsKKwordTggTlVNX1JGX1JFR19QQVJNUyA9IChzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBydF9yZWdfcGFpcikpOworCisvKiBBbnRlbm5hIGRpdmVzaXR5IHVzZSBHUElPMyBhbmQgRUVTSyBwaW4gZm9yIGNvbnRyb2wgKi8KKy8qIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sICovCisvKiBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZSAqLworLyogVGhlbiByZXN0b3JlIGFudGVubmEgYWZ0ZXIgRUVQUk9NIGFjY2VzcyAqLworLyogVGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBBc2ljU2V0UnhBbnQoKSwgbm93IGNoYW5nZSB0byAqLworLyp2b2lkIEFzaWNTZXRSeEFudCggKi8KK3ZvaWQgUlQzMHh4U2V0UnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBBbnQpCit7CisJdTMyIFZhbHVlOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXUzMiB4OworI2VuZGlmCisKKwlpZiAoKHBBZC0+RWVwcm9tQWNjZXNzKSB8fAorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgfHwKKwkgICAgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgfHwKKwkgICAgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKSB8fAorCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQlyZXR1cm47CisJfQorCS8qIHRoZSBhbnRlbm5hIHNlbGVjdGlvbiBpcyB0aHJvdWdoIGZpcm13YXJlIGFuZCBNQUMgcmVnaXN0ZXIoR1BJTzMpICovCisJaWYgKEFudCA9PSAwKSB7CisJCS8qIE1haW4gYW50ZW5uYSAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwkJeCB8PSAoRUVTSyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworI2Vsc2UKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDczLCAweEZGLCAweDEsIDB4MCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSB+KDB4MDgwOCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fQ1RSTF9DRkcsIFZhbHVlKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIkFzaWNTZXRSeEFudCwgc3dpdGNoIHRvIG1haW4gYW50ZW5uYVxuIikpOworCX0gZWxzZSB7CisJCS8qIEF1eCBhbnRlbm5hICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCQl4ICY9IH4oRUVTSyk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworI2Vsc2UKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDczLCAweEZGLCAweDAsIDB4MCk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gfigweDA4MDgpOworCQlWYWx1ZSB8PSAweDA4OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUZvciBSRiBmaWx0ZXIgY2FsaWJyYXRpb24gcHVycG9zZQorCisJQXJndW1lbnRzOgorCQlwQWQgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEZpbHRlckNhbGlicmF0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1OCBSNTV4ID0gMCwgdmFsdWUsIEZpbHRlclRhcmdldCA9IDB4MUUsIEJCUFZhbHVlID0gMDsKKwl1MzIgbG9vcCA9IDAsIGNvdW50ID0gMCwgbG9vcGNudCA9IDAsIFJlVHJ5ID0gMDsKKwl1OCBSRl9SMjRfVmFsdWUgPSAwOworCisJLyogR2l2ZSBiYnAgZmlsdGVyIGluaXRpYWwgdmFsdWUgKi8KKwlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7CisJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOwkvKkJpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwICovCisKKwlkbyB7CisJCWlmIChsb29wID09IDEpCS8qQmFuZFdpZHRoID0gNDAgTUh6ICovCisJCXsKKwkJCS8qIFdyaXRlIDB4MjcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyICovCisJCQlSRl9SMjRfVmFsdWUgPSAweDI3OworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQkJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCQkJCUZpbHRlclRhcmdldCA9IDB4MTU7CisJCQllbHNlCisJCQkJRmlsdGVyVGFyZ2V0ID0gMHgxOTsKKworCQkJLyogd2hlbiBjYWxpYnJhdGUgQlc0MCwgQkJQIG1hc2sgbXVzdCBzZXQgdG8gQlc0MC4gKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKKwkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CisJCQlCQlBWYWx1ZSB8PSAoMHgxMCk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwkJCS8qIHNldCB0byBCVzQwICovCisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKKwkJCXZhbHVlIHw9IDB4MjA7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKKwkJfSBlbHNlCQkvKkJhbmRXaWR0aCA9IDIwIE1IeiAqLworCQl7CisJCQkvKiBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlciAqLworCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKKwkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJCQlGaWx0ZXJUYXJnZXQgPSAweDEzOworCQkJZWxzZQorCQkJCUZpbHRlclRhcmdldCA9IDB4MTY7CisKKwkJCS8qIHNldCB0byBCVzIwICovCisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9ICh+MHgyMCk7CisJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKKwkJfQorCisJCS8qIFdyaXRlIDB4MDEgdG8gUkZfUjIyIHRvIGVuYWJsZSBiYXNlYmFuZCBsb29wYmFjayBtb2RlICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCAmdmFsdWUpOworCQl2YWx1ZSB8PSAweDAxOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKKworCQkvKiBXcml0ZSAweDAwIHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHBhc3NiYW5kIHRlc3QgdG9uZSAqLworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7CisKKwkJZG8geworCQkJLyogV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZSAqLworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjUsIDB4OTApOworCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJLyogUmVhZCBCQlBfUjU1WzY6MF0gZm9yIHJlY2VpdmVkIHBvd2VyLCBzZXQgUjU1eCA9IEJCUF9SNTVbNjowXSAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCVI1NXggPSB2YWx1ZSAmIDB4RkY7CisKKwkJfSB3aGlsZSAoKFJlVHJ5KysgPCAxMDApICYmIChSNTV4ID09IDApKTsKKworCQkvKiBXcml0ZSAweDA2IHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHN0b3BiYW5kIHRlc3QgdG9uZSAqLworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMHgwNik7CisKKwkJd2hpbGUgKFRSVUUpIHsKKwkJCS8qIFdyaXRlIDB4OTAgdG8gQkJQX1IyNSB0byB0cmFuc21pdCB0ZXN0IHRvbmUgKi8KKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI1LCAweDkwKTsKKworCQkJLypXZSBuZWVkIHRvIHdhaXQgZm9yIGNhbGlicmF0aW9uICovCisJCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKKwkJCXZhbHVlICY9IDB4RkY7CisJCQlpZiAoKFI1NXggLSB2YWx1ZSkgPCBGaWx0ZXJUYXJnZXQpIHsKKwkJCQlSRl9SMjRfVmFsdWUrKzsKKwkJCX0gZWxzZSBpZiAoKFI1NXggLSB2YWx1ZSkgPT0gRmlsdGVyVGFyZ2V0KSB7CisJCQkJUkZfUjI0X1ZhbHVlKys7CisJCQkJY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4gKi8KKwkJCWlmIChsb29wY250KysgPiAxMDApIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLAorCQkJCQkgIGxvb3BjbnQpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlciAqLworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOworCQl9CisJCS8qIFN0b3JlIGZvciBmdXR1cmUgdXNhZ2UgKi8KKwkJaWYgKGxvb3BjbnQgPCAxMDApIHsKKwkJCWlmIChsb29wKysgPT0gMCkgeworCQkJCS8qQmFuZFdpZHRoID0gMjAgTUh6ICovCisJCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAodTgpUkZfUjI0X1ZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQkvKkJhbmRXaWR0aCA9IDQwIE1IeiAqLworCQkJCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gKHU4KVJGX1IyNF9WYWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsKKworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7CisKKwkJLyogcmVzZXQgY291bnQgKi8KKwkJY291bnQgPSAwOworCX0gd2hpbGUgKFRSVUUpOworCisJLyogKi8KKwkvKiBTZXQgYmFjayB0byBpbml0aWFsIHN0YXRlICovCisJLyogKi8KKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7CisKKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgJnZhbHVlKTsKKwl2YWx1ZSAmPSB+KDB4MDEpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOworCisJLyogc2V0IEJCUCBiYWNrIHRvIEJXMjAgKi8KKwlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CisJQkJQVmFsdWUgJj0gKH4weDE4KTsKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gQ2FsaUJXMjBSZlIyND0weCV4LCBDYWxpQlc0MFJmUjI0PTB4JXhcbiIsCisJCSAgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Cit9CisKKy8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwICovCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlMb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXU4IFJGVmFsdWU7CisKKwkvKiBSWDBfUEQgJiBUWDBfUEQsIFJGIFIxIHJlZ2lzdGVyIEJpdCAyICYgQml0IDMgdG8gMCBhbmQgUkZfQkxPQ0tfZW4sUlgxX1BEICYgVFgxX1BELCBCaXQwLCBCaXQgNCAmIEJpdDUgdG8gMSAqLworCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7CisJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDBDKSkgfCAweDMxOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7CisKKwkvKiBUWF9MTzJfZW4sIFJGIFIxNSByZWdpc3RlciBCaXQgMyB0byAwICovCisJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsICZSRlZhbHVlKTsKKwlSRlZhbHVlICY9ICh+MHgwOCk7CisJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCBSRlZhbHVlKTsKKworCS8qIG1vdmUgdG8gTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzCisJICAgLy8gVFhfTE8xX2VuLCBSRiBSMTcgcmVnaXN0ZXIgQml0IDMgdG8gMAorCSAgIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCAmUkZWYWx1ZSk7CisJICAgUkZWYWx1ZSAmPSAofjB4MDgpOworCSAgIC8vIHRvIGZpeCByeCBsb25nIHJhbmdlIGlzc3VlCisJICAgaWYgKCgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpICYmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHID09IDApKQorCSAgIHsKKwkgICBSRlZhbHVlIHw9IDB4MjA7CisJICAgfQorCSAgIC8vIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGgKKwkgICBpZiAocEFkLT5UeE1peGVyR2FpbjI0RyA+PSAyKQorCSAgIHsKKwkgICBSRlZhbHVlICY9ICh+MHg3KTsgIC8vIGNsZWFuIGJpdCBbMjowXQorCSAgIFJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKKwkgICB9CisJICAgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjE3LCBSRlZhbHVlKTsKKwkgKi8KKworCS8qIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAgKi8KKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOworCVJGVmFsdWUgJj0gKH4weDA4KTsKKwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOworCisJLyogUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMCAqLworCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7CisJUkZWYWx1ZSAmPSAofjB4MDgpOworCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7CisKKwkvKiBhZGQgYnkgam9obmxpLCByZXNldCBSRl9SMjcgd2hlbiBpbnRlcmZhY2UgZG93biAmIHVwIHRvIGZpeCB0aHJvdWdocHV0IHByb2JsZW0gKi8KKwkvKiBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAgKi8KKwlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOworCS8qIFRYIHRvIFJYIElRIGdsaXRjaChSRl9SMjcpIGhhcyBiZWVuIGZpeGVkIGluIFJUMzA3MChGKS4gKi8KKwkvKiBSYWlzaW5nIFJGIHZvbHRhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUlQzMDcwKEYpICovCisJaWYgKElTX1JUMzA5MChwQWQpKQkvKiBSVDMwOXggYW5kIFJUMzA3MS83MiAqLworCXsKKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQorCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7CisJCWVsc2UKKwkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOworCX0KKwkvKiBlbmQgam9obmxpICovCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUxvYWQgUkYgc2xlZXAtbW9kZSBzZXR1cAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTggUkZWYWx1ZTsKKwl1MzIgTUFDVmFsdWU7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlpZiAoIUlTX1JUMzU3MihwQWQpKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCXsKKwkJLyogUkZfQkxPQ0tfZW4uIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDAgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSAmPSAofjB4MDEpOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOworCisJCS8qIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDMwKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKKworCQkvKiBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDBFKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKKworCQkvKiBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAwICovCisJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7CisJCVJGVmFsdWUgJj0gKH4weDgwKTsKKwkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKKwl9CisKKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwJLyogSVNfUlQzMDkwIGluY2x1ZGluZyBSVDMwOXggYW5kIFJUMzA3MS83MiAqLworCSAgICBJU19SVDM1NzIocEFkKSB8fAorCSAgICAoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpIHsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJaWYgKCFJU19SVDM1NzIocEFkKSkKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwkJeworCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKKwkJCVJGVmFsdWUgfD0gMHg3NzsKKwkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOworCQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJUmV2ZXJzZSBSRiBzbGVlcC1tb2RlIHNldHVwCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1OCBSRlZhbHVlOworCXUzMiBNQUNWYWx1ZTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWlmICghSVNfUlQzNTcyKHBBZCkpCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJeworCQkvKiBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMSAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOworCQlSRlZhbHVlIHw9IDB4MDE7CisJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7CisKKwkJLyogVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDMwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOworCisJCS8qIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDBFOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOworCisJCS8qIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEgKi8KKwkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKKwkJUkZWYWx1ZSB8PSAweDgwOworCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOworCX0KKworCWlmIChJU19SVDMwOTAocEFkKSB8fAkvKiBJU19SVDMwOTAgaW5jbHVkaW5nIFJUMzA5eCBhbmQgUlQzMDcxLzcyICovCisJICAgIElTX1JUMzU3MihwQWQpIHx8CisJICAgIElTX1JUMzM5MChwQWQpIHx8CisJICAgIChJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkgeworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlpZiAoIUlTX1JUMzU3MihwQWQpKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCQl7CisJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOworCQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQorCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOworCQkJZWxzZQorCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOworCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKKwkJfQorCQkvKiBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlICovCisJCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkKKwkJICAgICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpIHsKKwkJCS8qIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseSAqLworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOworCQl9IGVsc2UgeworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKKwkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOworCQl9CisJfQorCisJaWYgKElTX1JUMzU3MihwQWQpKQorCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDgsIDB4ODApOworfQorCisvKiBlbmQgam9obmxpICovCisKK3ZvaWQgUlQzMHh4SGFsdEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTMyIFR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKKworCS8qICovCisJLyogVHVybiBvZmYgTE5BX1BFIG9yIFRSU1dfUE9MICovCisJLyogKi8KKwlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpIHsKKwkJaWYgKChJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKwkJICAgICYmIChwQWQtPmJVc2VFZnVzZSkKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKwkJICAgICkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZCRjBGMDsJLyogYml0MTggb2ZmICovCisJCX0gZWxzZSB7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGMEYwOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCX0KK30KKworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGxpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY2hsaXN0LmgKaW5kZXggZjQ5YTM1Yy4uYWRhNjVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jaGxpc3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NobGlzdC5oCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSAicnRtcF90eXBlLmgiCiAjaW5jbHVkZSAicnRtcF9kZWYuaCIKIAotCiAjZGVmaW5lIE9ET1IJCQkwCiAjZGVmaW5lIElET1IJCQkxCiAjZGVmaW5lIEJPVEgJCQkyCkBAIC01MCwxMTk2ICs0OSw2OSBAQAogI2RlZmluZSBCQU5EXzI0RyAgICAgICAgMQogI2RlZmluZSBCQU5EX0JPVEggICAgICAgMgogCi10eXBlZGVmIHN0cnVjdCBfQ0hfREVTUCB7Ci0JVUNIQVIgRmlyc3RDaGFubmVsOwotCVVDSEFSIE51bU9mQ2g7Ci0JQ0hBUiBNYXhUeFB3cjsJCQkvLyBkQm0KLQlVQ0hBUiBHZW9ncmFwaHk7CQkJLy8gMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGgKLQlCT09MRUFOIERmc1JlcTsJCQkvLyBEZnMgcmVxdWlyZSwgMDogTm8sIDE6IHllcy4KLX0gQ0hfREVTUCwgKlBDSF9ERVNQOwotCi10eXBlZGVmIHN0cnVjdCBfQ0hfUkVHSU9OIHsKLQlVQ0hBUiBDb3VudFJlZ1szXTsKLQlVQ0hBUiBEZnNUeXBlOwkJCS8vIDA6IENFLCAxOiBGQ0MsIDI6IEpBUCwgMzpKQVBfVzUzLCBKQVBfVzU2Ci0JQ0hfREVTUCBDaERlc3BbMTBdOwotfSBDSF9SRUdJT04sICpQQ0hfUkVHSU9OOwotCi1zdGF0aWMgQ0hfUkVHSU9OIENoUmVnaW9uW10gPQotewotCQl7CS8vIEFudGlndWEgYW5kIEJlcmJ1ZGEKLQkJCSJBRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFyZ2VudGluYQotCQkJIkFSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEFydWJhCi0JCQkiQVciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBdXN0cmFsaWEKLQkJCSJBVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEF1c3RyaWEKLQkJCSJBVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9LAkJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhaGFtYXMKLQkJCSJCUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJhcmJhZG9zCi0JCQkiQkIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZXJtdWRhCi0JCQkiQk0iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCcmF6aWwKLQkJCSJCUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCZWxnaXVtCi0JCQkiQkUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAxOCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEJ1bGdhcmlhCi0JCQkiQkciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2FuYWRhCi0JCQkiQ0EiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDYXltYW4gSXNMYW5kcwotCQkJIktZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2hpbGUKLQkJCSJDTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA1LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENoaW5hCi0JCQkiQ04iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENvbG9tYmlhCi0JCQkiQ08iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ29zdGEgUmljYQotCQkJIkNSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ3lwcnVzCi0JCQkiQ1kiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDemVjaF9SZXB1YmxpYwotCQkJIkNaIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEZW5tYXJrCi0JCQkiREsiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBEb21pbmljYW4gUmVwdWJsaWMKLQkJCSJETyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAwCi0JCQkJeyAxNDksIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRXF1YWRvcgotCQkJIkVDIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxMDAsIDExLCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEVsIFNhbHZhZG9yCi0JCQkiU1YiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgIDM2LCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEZpbmxhbmQKLQkJCSJGSSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRnJhbmNlCi0JCQkiRlIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR2VybWFueQotCQkJIkRFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBHcmVlY2UKLQkJCSJHUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhbQotCQkJIkdVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDE0OSwgIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3VhdGVtYWxhCi0JCQkiR1QiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSGFpdGkKLQkJCSJIVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIb25kdXJhcwotCQkJIkhOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEhvbmcgS29uZwotCQkJIkhLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEh1bmdhcnkKLQkJCSJIVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJY2VsYW5kCi0JCQkiSVMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEluZGlhCi0JCQkiSU4iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSW5kb25lc2lhCi0JCQkiSUQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgCTQsICAyNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSXJlbGFuZAotCQkJIklFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSXNyYWVsCi0JCQkiSUwiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MwotCQkJCXsgNCwgCTYsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggNH45Ci0JCQkJeyAxMCwgCTQsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMTB+MTMKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEl0YWx5Ci0JCQkiSVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgT0RPUiwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBKYXBhbgotCQkJIkpQIiwKLQkJCUpBUCwKLQkJCXsKLQkJCQl7IDEsICAgMTQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xNAotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBKb3JkYW4KLQkJCSJKTyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgSURPUiwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAxNDksIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIExhdHZpYQotCQkJIkxWIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTGllY2h0ZW5zdGVpbgotCQkJIkxJIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIExpdGh1YW5pYQotCQkJIkxUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTHV4ZW1idXJnCi0JCQkiTFUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNYWxheXNpYQotCQkJIk1ZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDUsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWFsdGEKLQkJCSJNVCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1hcm9jY28KLQkJCSJNQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNZXhpY28KLQkJCSJNWCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTmV0aGVybGFuZHMKLQkJCSJOTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsIAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgCTQsICAyNCwgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5ldyBaZWFsYW5kCi0JCQkiTloiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsIAk0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE5vcndheQotCQkJIk5PIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUGVydQotCQkJIlBFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBvcnR1Z2FsCi0JCQkiUFQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBvbGFuZAotCQkJIlBMIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBSb21hbmlhCi0JCQkiUk8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFJ1c3NpYQotCQkJIlJVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNhdWRpIEFyYWJpYQotCQkJIlNBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybwotCQkJIkNTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTaW5nYXBvcmUKLQkJCSJTRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTbG92YWtpYQotCQkJIlNLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTbG92ZW5pYQotCQkJIlNJIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNvdXRoIEFmcmljYQotCQkJIlpBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTb3V0aCBLb3JlYQotCQkJIktSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKLQkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3BhaW4KLQkJCSJFUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3dlZGVuCi0JCQkiU0UiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFN3aXR6ZXJsYW5kCi0JCQkiQ0giLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBUYWl3YW4KLQkJCSJUVyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVHVya2V5Ci0JCQkiVFIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVLCi0JCQkiR0IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVrcmFpbmUKLQkJCSJVQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKLQkJCSJBRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVW5pdGVkX1N0YXRlcwotCQkJIlVTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFZlbmV6dWVsYQotCQkJIlZFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIERlZmF1bHQKLQkJCSIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCitzdHJ1Y3QgcnRfY2hfZGVzcCB7CisJdTggRmlyc3RDaGFubmVsOworCXU4IE51bU9mQ2g7CisJY2hhciBNYXhUeFB3cjsJCS8qIGRCbSAqLworCXU4IEdlb2dyYXBoeTsJLyogMDpvdXQgZG9vciwgMTppbiBkb29yLCAyOmJvdGggKi8KKwlCT09MRUFOIERmc1JlcTsJCS8qIERmcyByZXF1aXJlLCAwOiBObywgMTogeWVzLiAqLwogfTsKIAotc3RhdGljIGlubGluZSBQQ0hfUkVHSU9OIEdldENoUmVnaW9uKAotCUlOIFBVQ0hBUiBDbnRyeUNvZGUpCi17Ci0JSU5UIGxvb3AgPSAwOwotCVBDSF9SRUdJT04gcENoUmVnaW9uID0gTlVMTDsKK3N0cnVjdCBydF9jaF9yZWdpb24geworCXU4IENvdW50UmVnWzNdOworCXU4IERmc1R5cGU7CQkvKiAwOiBDRSwgMTogRkNDLCAyOiBKQVAsIDM6SkFQX1c1MywgSkFQX1c1NiAqLworCXN0cnVjdCBydF9jaF9kZXNwIENoRGVzcFsxMF07Cit9OwogCi0Jd2hpbGUgKHN0cmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApCi0JewotCQlpZiAoc3RybmNtcChDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgQ250cnlDb2RlLCAyKSA9PSAwKQotCQl7Ci0JCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07Ci0JCQlicmVhazsKLQkJfQotCQlsb29wKys7Ci0JfQorZXh0ZXJuIHN0cnVjdCBydF9jaF9yZWdpb24gQ2hSZWdpb25bXTsKIAotCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKLQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOwotCXJldHVybiBwQ2hSZWdpb247Ci19CitzdHJ1Y3QgcnRfY2hfZnJlcV9tYXAgeworCXUxNiBjaGFubmVsOworCXUxNiBmcmVxS0h6OworfTsKIAotc3RhdGljIGlubGluZSBWT0lEIENoQmFuZENoZWNrKAotCUlOIFVDSEFSIFBoeU1vZGUsCi0JT1VUIFBVQ0hBUiBwQ2hUeXBlKQotewotCXN3aXRjaChQaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFBOgotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQkJKnBDaFR5cGUgPSBCQU5EXzVHOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7Ci0JCQlicmVhazsKK2V4dGVybiBzdHJ1Y3QgcnRfY2hfZnJlcV9tYXAgQ0hfSFpfSURfTUFQW107CitleHRlcm4gaW50IENIX0haX0lEX01BUF9OVU07CiAKLQkJZGVmYXVsdDoKLQkJCSpwQ2hUeXBlID0gQkFORF8yNEc7Ci0JCQlicmVhazsKLQl9Ci19CisjZGVmaW5lICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooX2NoLCBfa2h6KQkJCQkJXAorCQlkb3sJCQkJCQkJCQkJCQkJXAorCQkJaW50IF9jaElkeDsJCQkJCQkJCQkJCVwKKwkJCWZvciAoX2NoSWR4ID0gMDsgX2NoSWR4IDwgQ0hfSFpfSURfTUFQX05VTTsgX2NoSWR4KyspXAorCQkJewkJCQkJCQkJCQkJCQlcCisJCQkJaWYgKChfY2gpID09IENIX0haX0lEX01BUFtfY2hJZHhdLmNoYW5uZWwpCQkJXAorCQkJCXsJCQkJCQkJCQkJCQlcCisJCQkJCShfa2h6KSA9IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHogKiAxMDAwOwlcCisJCQkJCWJyZWFrOwkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJXAorCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCQkJXAorCQkJCShfa2h6KSA9IDI0MTIwMDA7CQkJCQkJCQkJXAorICAgICAgICAgICAgfXdoaWxlKDApCiAKLXN0YXRpYyBpbmxpbmUgVUNIQVIgRmlsbENoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQQ0hfREVTUCBwQ2hEZXNwLAotCUlOIFVDSEFSIE9mZnNldCwKLQlJTiBVQ0hBUiBpbmNyZW1lbnQpCi17Ci0JSU5UIGksIGosIGw7Ci0JVUNIQVIgY2hhbm5lbDsKKyNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChfa2h6LCBfY2gpICAgICAgICAgICAgICAgICBcCisJCWRvewkJCQkJCQkJCQkJCQlcCisJCQlpbnQgX2NoSWR4OwkJCQkJCQkJCQkJXAorCQkJZm9yIChfY2hJZHggPSAwOyBfY2hJZHggPCBDSF9IWl9JRF9NQVBfTlVNOyBfY2hJZHgrKylcCisJCQl7CQkJCQkJCQkJCQkJCVwKKwkJCQlpZiAoKF9raHopID09IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHopCQkJXAorCQkJCXsJCQkJCQkJCQkJCQlcCisJCQkJCShfY2gpID0gQ0hfSFpfSURfTUFQW19jaElkeF0uY2hhbm5lbDsJCQlcCisJCQkJCWJyZWFrOwkJCQkJCQkJCQlcCisJCQkJfQkJCQkJCQkJCQkJCVwKKwkJCX0JCQkJCQkJCQkJCQkJXAorCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCQkJXAorCQkJCShfY2gpID0gMTsJCQkJCQkJCQkJCVwKKwkJfXdoaWxlKDApCiAKLQlqID0gT2Zmc2V0OwotCWZvciAoaSA9IDA7IGkgPCBwQ2hEZXNwLT5OdW1PZkNoOyBpKyspCi0JewotCQljaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKLQkJZm9yIChsPTA7IGw8TUFYX05VTV9PRl9DSEFOTkVMUzsgbCsrKQotCQl7Ci0JCQlpZiAoY2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbbF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyOwotCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyMjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQotCQkJY29udGludWU7Cit2b2lkIEJ1aWxkQ2hhbm5lbExpc3RFeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uQ2hhbm5lbCA9IHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7Ci0JCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKLQkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7Ci0JCWorKzsKLQl9Ci0JcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7Cit2b2lkIEJ1aWxkQmVhY29uQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwQnVmLCB1bnNpZ25lZCBsb25nICpwQnVmTGVuKTsKIAotCXJldHVybiBqOwotfQordm9pZCBOX0NoYW5uZWxDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1zdGF0aWMgaW5saW5lIFZPSUQgQ3JlYXRlQ2hMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBDSF9SRUdJT04gcENoUmVnaW9uLAotCUlOIFVDSEFSIEdlb2dyYXBoeSkKLXsKLQlJTlQgaTsKLQlVQ0hBUiBvZmZzZXQgPSAwOwotCVBDSF9ERVNQIHBDaERlc3A7Ci0JVUNIQVIgQ2hUeXBlOwotCVVDSEFSIGluY3JlbWVudDsKK3ZvaWQgTl9TZXRDZW5DaChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlyZXR1cm47Cit1OCBHZXRDdW50cnlNYXhUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNoYW5uZWwpOwogCi0JQ2hCYW5kQ2hlY2socEFkLT5Db21tb25DZmcuUGh5TW9kZSwgJkNoVHlwZSk7Ci0KLQlmb3IgKGk9MDsgaTwxMDsgaSsrKQotCXsKLQkJcENoRGVzcCA9ICZwQ2hSZWdpb24tPkNoRGVzcFtpXTsKLQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKENoVHlwZSA9PSBCQU5EXzVHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsIDw9IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKENoVHlwZSA9PSBCQU5EXzI0RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotCQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gQk9USCkKLQkJCXx8IChwQ2hEZXNwLT5HZW9ncmFwaHkgPT0gR2VvZ3JhcGh5KSkKLSAgICAgICAgewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA+IDE0KQotICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IDQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gMTsKLQkJCW9mZnNldCA9IEZpbGxDaExpc3QocEFkLCBwQ2hEZXNwLCBvZmZzZXQsIGluY3JlbWVudCk7Ci0gICAgICAgIH0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgVk9JRCBCdWlsZENoYW5uZWxMaXN0RXgoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUENIX1JFR0lPTiBwQ2hSZWc7Ci0KLQlwQ2hSZWcgPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7Ci0JQ3JlYXRlQ2hMaXN0KHBBZCwgcENoUmVnLCBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpOwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgQnVpbGRCZWFjb25DaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwQnVmLAotCU9VVAlQVUxPTkcgcEJ1ZkxlbikKLXsKLQlJTlQgaTsKLQlVTE9ORyBUbXBMZW47Ci0JUENIX1JFR0lPTiBwQ2hSZWdpb247Ci0JUENIX0RFU1AgcENoRGVzcDsKLQlVQ0hBUiBDaFR5cGU7Ci0KLQlwQ2hSZWdpb24gPSBHZXRDaFJlZ2lvbihwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSk7Ci0KLQlpZiAocENoUmVnaW9uID09IE5VTEwpCi0JCXJldHVybjsKLQotCUNoQmFuZENoZWNrKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsICZDaFR5cGUpOwotCSpwQnVmTGVuID0gMDsKLQotCWZvciAoaT0wOyBpPDEwOyBpKyspCi0JewotCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOwotCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCi0JCQlicmVhazsKLQotCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQotCQkJfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKQotCQl7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwQnVmICsgKnBCdWZMZW4sCQkmVG1wTGVuLAotCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgCSZwQ2hEZXNwLT5GaXJzdENoYW5uZWwsCi0JCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPk51bU9mQ2gsCi0JCQkJCQkJCTEsICAgICAgICAgICAgICAgICAJJnBDaERlc3AtPk1heFR4UHdyLAotCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQkqcEJ1ZkxlbiArPSBUbXBMZW47Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKQotCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJcmV0dXJuIEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIFRSVUU7Ci19Ci0KLQotc3RhdGljIGlubGluZSBVQ0hBUiBHZXRFeHRDaCgKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIFVDSEFSIERpcmVjdGlvbikKLXsKLQlDSEFSIEV4dENoOwotCi0JaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCi0JCUV4dENoID0gQ2hhbm5lbCArIDQ7Ci0JZWxzZQotCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7Ci0KLQlyZXR1cm4gRXh0Q2g7Ci19Ci0KLQotc3RhdGljIGlubGluZSBWT0lEIE5fQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07Ci0JVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQotCXsKLQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJewotCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKLQkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKLQkJCX0KLQkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKLQkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJZG8KLQkJCXsKLQkJCQlVQ0hBUiBFeHRDaDsKLQkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOwotCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKLQkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCi0JCQkJCWJyZWFrOwotCi0JCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOwotCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKLQkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJfSB3aGlsZShGQUxTRSk7Ci0KLQkJCWlmIChDaGFubmVsID09IDE0KQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCi0JCQl9Ci0JCX0KLQl9Ci0KLQotfQotCi0KLXN0YXRpYyBpbmxpbmUgVk9JRCBOX1NldENlbkNoKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSAxNCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAxOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCX0KLX0KLQotc3RhdGljIGlubGluZSBVSU5UOCBHZXRDdW50cnlNYXhUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVSU5UOCBjaGFubmVsKQotewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gMHhmZjsKLQllbHNlCi0JCXJldHVybiBwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyOwotfQotI2VuZGlmIC8vIF9fQ0hMSVNUX0hfXwotCisjZW5kaWYgLyogX19DSExJU1RfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi8yODYwX3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vMjg2MF9ydG1wX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjMGZiOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi8yODYwX3J0bXBfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODk3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JMjg2MF9ydG1wX2luaXQuYwotCi0JQWJzdHJhY3Q6Ci0JTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgTGluICAgIDIwMDItMDgtMDEgICAgY3JlYXRlZAotICAgIEpvaG4gQ2hhbmcgIDIwMDQtMDgtMjAgICAgUlQyNTYxLzI2NjEgdXNlIHNjYXR0ZXItZ2F0aGVyIHNjaGVtZQotICAgIEphbiBMZWUgIDIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgotKi8KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0JCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlORElTX1NUQVRVUwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVTE9ORwkJCVJpbmdCYXNlUGFIaWdoOwotCVVMT05HCQkJUmluZ0Jhc2VQYUxvdzsKLQlQVk9JRAkJCVJpbmdCYXNlVmE7Ci0JSU5UCQkJCWluZGV4LCBudW07Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVVMT05HCQkJRXJyb3JWYWx1ZSA9IDA7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVBSVE1QX0RNQUJVRglwRG1hQnVmOwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7Ci0JZG8KLQl7Ci0JCS8vCi0JCS8vIEFsbG9jYXRlIGFsbCByaW5nIGRlc2NyaXB0b3JzLCBpbmNsdWRlIFR4RCwgUnhELCBNZ210RC4KLQkJLy8gQWx0aG91Z2ggZWFjaCBzaXplIGlzIGRpZmZlcmVudCwgdG8gcHJldmVudCBjYWNoZWxpbmUgYW5kIGFsaWdubWVudAotCQkvLyBpc3N1ZSwgSSBpbnRlbnRpb25hbCBzZXQgdGhlbSBhbGwgdG8gNjQgYnl0ZXMuCi0JCS8vCi0JCWZvciAobnVtPTA7IG51bTxOVU1fT0ZfVFhfUklORzsgbnVtKyspCi0JCXsKLQkJCVVMT05HICBCdWZCYXNlUGFIaWdoOwotCQkJVUxPTkcgIEJ1ZkJhc2VQYUxvdzsKLQkJCVBWT0lEICBCdWZCYXNlVmE7Ci0KLQkJCS8vCi0JCQkvLyBBbGxvY2F0ZSBUeCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgKDUgVFggcmluZ3MgPSA0IEFDcyArIDEgSENDQSkKLQkJCS8vCi0JCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWERfU0laRTsKLQkJCVJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkoCi0JCQkJcEFkLAotCQkJCW51bSwKLQkJCQlwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUsCi0JCQkJRkFMU0UsCi0JCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsCi0JCQkJJnBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOwotCi0JCQlpZiAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSA9PSBOVUxMKQotCQkJewotCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1NpemUpOwotCi0JCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCi0JCQlSaW5nQmFzZVBhSGlnaCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkJCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOwotCQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhOwotCi0JCQkvLwotCQkJLy8gQWxsb2NhdGUgYWxsIDFzdCBUWEJ1ZidzIG1lbW9yeSBmb3IgdGhpcyBUeFJpbmcKLQkJCS8vCi0JCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUgPSBUWF9SSU5HX1NJWkUgKiBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCi0JCQkJcEFkLAotCQkJCW51bSwKLQkJCQlwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsCi0JCQkJRkFMU0UsCi0JCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsCi0JCQkJJnBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOwotCi0JCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSA9PSBOVUxMKQotCQkJewotCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUpOwotCi0JCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCi0JCQlCdWZCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOwotCQkJQnVmQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1BhKTsKLQkJCUJ1ZkJhc2VWYSAgICAgPSBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhOwotCi0JCQkvLwotCQkJLy8gSW5pdGlhbGl6ZSBUeCBSaW5nIERlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQotCQkJLy8KLQkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbbnVtXTsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFRYX1JJTkdfU0laRTsgaW5kZXgrKykKLQkJCXsKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJCQkvLyBJbml0IFR4IFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcwotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOwotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwVHhSaW5nLT5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOwotCi0JCQkJLy8gU2V0dXAgVHggQnVmZmVyIHNpemUgJiBhZGRyZXNzLiBvbmx5IDgwMi4xMSBoZWFkZXIgd2lsbCBzdG9yZSBpbiB0aGlzIHNwYWNlCi0JCQkJcERtYUJ1ZiA9ICZwVHhSaW5nLT5DZWxsW2luZGV4XS5EbWFCdWY7Ci0JCQkJcERtYUJ1Zi0+QWxsb2NTaXplID0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCQlwRG1hQnVmLT5BbGxvY1ZhID0gQnVmQmFzZVZhOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFIaWdoKTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhLCBCdWZCYXNlUGFMb3cpOwotCi0JCQkJLy8gbGluayB0aGUgcHJlLWFsbG9jYXRlZCBUeEJ1ZiB0byBUWEQKLQkJCQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQkJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJCXBUeEQtPkRNQURPTkUgPSAxOwotCQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7Ci0JCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBUWERfU0laRTsKLQotCQkJCS8vIGFkdmFuY2UgdG8gbmV4dCBUeEJ1ZiBhZGRyZXNzCi0JCQkJQnVmQmFzZVBhTG93ICs9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQkJQnVmQmFzZVZhID0gKFBVQ0hBUikgQnVmQmFzZVZhICsgVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4UmluZ1slZF06IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgbnVtLCBpbmRleCkpOwotCQl9Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTKQotCQkJYnJlYWs7Ci0KLQkJLy8KLQkJLy8gQWxsb2NhdGUgTUdNVCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKLQkJLy8KLQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplID0gTUdNVF9SSU5HX1NJWkUgKiBUWERfU0laRTsKLQkJUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KAotCQkJcEFkLAotCQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLAotCQkJRkFMU0UsCi0JCQkmcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKLQkJCSZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQotCQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKQotCQl7Ci0JCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOwotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOwotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKLQotCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCi0JCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VWYSAgICAgPSBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhOwotCi0JCS8vCi0JCS8vIEluaXRpYWxpemUgTUdNVCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJLy8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUdNVF9SSU5HX1NJWkU7IGluZGV4KyspCi0JCXsKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJLy8gSW5pdCBNR01UIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcwotCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1NpemUgPSBUWERfU0laRTsKLQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKLQotCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7Ci0JCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFRYRF9TSVpFOwotCi0JCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRAotCQkJcFR4RCA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmE7Ci0JCQlwVHhELT5ETUFET05FID0gMTsKLQotCQkJLy8gbm8gcHJlLWFsbG9jYXRlZCBidWZmZXIgcmVxdWlyZWQgaW4gTWdtdFJpbmcgZm9yIHNjYXR0ZXItZ2F0aGVyIGNhc2UKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKLQotCQkvLwotCQkvLyBBbGxvY2F0ZSBSWCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIKLQkJLy8KLQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSA9IFJYX1JJTkdfU0laRSAqIFJYRF9TSVpFOwotCQlSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KAotCQkJcEFkLAotCQkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwKLQkJCUZBTFNFLAotCQkJJnBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAotCQkJJnBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLQotCQlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkKLQkJewotCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXJcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKTsKLQotCi0JCXByaW50aygiUlggREVTQyAlcCAgc2l6ZSA9ICVsZFxuIiwgcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsCi0JCQkJCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpOwotCi0JCS8vIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24KLQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVBhTG93ICA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlVmEgICAgID0gcEFkLT5SeERlc2NSaW5nLkFsbG9jVmE7Ci0KLQkJLy8KLQkJLy8gSW5pdGlhbGl6ZSBSeCBSaW5nIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkKLQkJLy8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgUlhfUklOR19TSVpFOyBpbmRleCsrKQotCQl7Ci0JCQkvLyBJbml0IFJYIFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gUlhEX1NJWkU7Ci0JCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1BhLCBSaW5nQmFzZVBhSGlnaCk7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCS8vIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCi0JCQlSaW5nQmFzZVBhTG93ICs9IFJYRF9TSVpFOwotCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBSWERfU0laRTsKLQotCQkJLy8gU2V0dXAgUnggYXNzb2NpYXRlZCBCdWZmZXIgc2l6ZSAmIGFsbG9jYXRlIHNoYXJlIG1lbW9yeQotCQkJcERtYUJ1ZiA9ICZwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWY7Ci0JCQlwRG1hQnVmLT5BbGxvY1NpemUgPSBSWF9CVUZGRVJfQUdHUkVTSVpFOwotCQkJcFBhY2tldCA9IFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigKLQkJCQlwQWQsCi0JCQkJcERtYUJ1Zi0+QWxsb2NTaXplLAotCQkJCUZBTFNFLAotCQkJCSZwRG1hQnVmLT5BbGxvY1ZhLAotCQkJCSZwRG1hQnVmLT5BbGxvY1BhKTsKLQotCQkJLyoga2VlcCBhbGxvY2F0ZWQgcnggcGFja2V0ICovCi0JCQlwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IHBQYWNrZXQ7Ci0KLQkJCS8vIEVycm9yIGhhbmRsaW5nCi0JCQlpZiAocERtYUJ1Zi0+QWxsb2NWYSA9PSBOVUxMKQotCQkJewotCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIFJ4UmluZydzIDFzdCBidWZmZXJcbiIpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQkJTmRpc1plcm9NZW1vcnkocERtYUJ1Zi0+QWxsb2NWYSwgcERtYUJ1Zi0+QWxsb2NTaXplKTsKLQotCQkJLy8gV3JpdGUgUnhEIGJ1ZmZlciBhZGRyZXNzICYgYWxsb2NhdGVkIGJ1ZmZlciBsZW5ndGgKLQkJCXBSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYTsKLQkJCXBSeEQtPlNEUDAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwRG1hQnVmLT5BbGxvY1BhKTsKLQkJCXBSeEQtPkRET05FID0gMDsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKLQotCX0Jd2hpbGUgKEZBTFNFKTsKLQotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKLQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKLQl7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQl9Ci0KLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQkvLyBMb2cgZXJyb3IgaW5mb3JhbXRpb24KLQkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeSgKLQkJCXBBZC0+QWRhcHRlckhhbmRsZSwKLQkJCU5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAotCQkJMSwKLQkJCUVycm9yVmFsdWUpOwotCX0KLQotCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQkJSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCi0JCWluIFJUTVBfQURBUFRFUiBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JaW50IGk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0+IE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZVxuIikpOwotCi0JLy8gSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsYXRlZCBzb2Z0d2FyZSBxdWV1ZXMKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0pOwotCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7Ci0JSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldKTsKLQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOwotCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKLQotCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCi0JcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOwotCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKLQotCS8vIEluaXQgVFggcmluZ3MgaW5kZXggcG9pbnRlcgotCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQotCQl7Ci0JCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7Ci0JCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7Ci0JCX0KLQotCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKLQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKLQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQotCXBBZC0+UHJpdmF0ZUluZm8uVHhSaW5nRnVsbENudCAgICAgICA9IDA7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFJpbmdDbGVhblVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmluZ1R5cGUpCi17Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlhEX1NUUlVDCQlwUnhEOwotCVBRVUVVRV9FTlRSWQlwRW50cnk7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JaW50CQkJCWk7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBSaW5nQ2xlYW5VcChSaW5nSWR4PSVkLCBQZW5kaW5nLU5ESVM9JWxkKVxuIiwgUmluZ1R5cGUsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOwotCXN3aXRjaCAoUmluZ1R5cGUpCi0JewotCQljYXNlIFFJRF9BQ19CSzoKLQkJY2FzZSBRSURfQUNfQkU6Ci0JCWNhc2UgUUlEX0FDX1ZJOgotCQljYXNlIFFJRF9BQ19WTzoKLQkJY2FzZSBRSURfSENDQToKLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUmluZ1R5cGVdOwotCi0JCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAotCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIC8vIFdlIGhhdmUgdG8gc2NhbiBhbGwgVFggcmluZwotCQkJewotCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQotCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0OwotCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCX0KLQotCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLCAmcFR4UmluZy0+VHhEbWFJZHgpOwotCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFJpbmdUeXBlICogMHgxMCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCi0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKQotCQkJewotCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdKTsKLQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVsZWFzZSAxIE5ESVMgcGFja2V0IGZyb20gcy93IGJhY2tsb2cgcXVldWVcbiIpKTsKLQkJCX0KLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRSURfTUdNVDoKLQkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0Ci0JCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLQkJCWZvciAoaT0wOyBpPE1HTVRfUklOR19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0OwotCQkJCS8vIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQl9Ci0JCQkJcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0OwotCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQotCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQl9Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKLQkJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OwotCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7Ci0KLQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRSURfUlg6Ci0JCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAotCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLQotCQkJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJcFJ4RCAgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCQkJCXBSeEQtPkRET05FID0gMCA7Ci0JCQl9Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKLQkJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7Ci0JCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9ICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4RG1hSWR4LTEpKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQotCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCi0JSU4gUFZPSUQJaGFuZGxlLAotCU9VVAlQVk9JRAkqcHBBZCkKLXsKLQlQUENJX0RFViBwY2lfZGV2OwotCWRtYV9hZGRyX3QJKnBoeV9hZGRyOwotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBoYW5kbGU7Ci0KLQlwY2lfZGV2ID0gcE9iai0+cGNpX2RldjsKLQlwaHlfYWRkciA9ICZwT2JqLT5wQWRfcGE7Ci0KLQkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsgLy9wY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2YoUlRNUF9BREFQVEVSKSwgcGh5X2FkZHIpOwotCi0JaWYgKCpwcEFkKQotCXsKLQkJTmRpc1plcm9NZW1vcnkoKnBwQWQsIHNpemVvZihSVE1QX0FEQVBURVIpKTsKLQkJKChQUlRNUF9BREFQVEVSKSpwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOwotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotfQotCi0KLXZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClQQ0lfQUxMT0NfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLX0KLQotdm9pZCBSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLQotfQotCi12b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLQotfQotCi12b2lkIFJUTVBfRnJlZVJ4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JUFZPSUQJVmlydHVhbEFkZHJlc3MsCi0JSU4JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotCi12b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVJTlQJSW5kZXgsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKVBDSV9BTExPQ19DT05TSVNURU5UKHBPYmotPnBjaV9kZXYsc2l6ZW9mKGNoYXIpKkxlbmd0aCwgUGh5c2ljYWxBZGRyZXNzKTsKLX0KLQotLyoKLSAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIGNvbW1vbiBidWZmZXIgZm9yIERNQQotICogQVJHVU1FTlRTOgotICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCi0gKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCi0gKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCi0gKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCi0gKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcwotICovCi0KLXZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpUENJX0FMTE9DX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi1WT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0JaW50IGluZGV4LCBudW0gLCBqOwotCVBSVE1QX1RYX1JJTkcgcFR4UmluZzsKLQlQVFhEX1NUUlVDCSAgcFR4RDsKLQlQTkRJU19QQUNLRVQgIHBQYWNrZXQ7Ci0JdW5zaWduZWQgaW50ICBJcnFGbGFnczsKLQotCVBPU19DT09LSUUgcE9iaiA9KFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKLQotCS8vIEZyZWUgVHhTd1F1ZXVlIFBhY2tldAotCWZvciAoaW5kZXg9MDsgaW5kZXggPE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCXsKLQkJUFFVRVVFX0VOVFJZIHBFbnRyeTsKLQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0JCVBRVUVVRV9IRUFERVIgICBwUXVldWU7Ci0KLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOwotCQl3aGlsZSAocFF1ZXVlLT5IZWFkKQotCQl7Ci0JCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKLQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQl9Ci0KLQkvLyBGcmVlIFR4IFJpbmcgUGFja2V0Ci0JZm9yIChpbmRleD0wO2luZGV4PCBOVU1fT0ZfVFhfUklORztpbmRleCsrKQotCXsKLQkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07Ci0KLQkJZm9yIChqPTA7IGo8IFRYX1JJTkdfU0laRTsgaisrKQotCQl7Ci0JCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW2pdLkFsbG9jVmEpOwotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotICAgICAgICAgICAgCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCX0KLQl9Ci0KLQlmb3IgKGluZGV4ID0gUlhfUklOR19TSVpFIC0gMSA7IGluZGV4ID49IDA7IGluZGV4LS0pCi0JewotCQlpZiAoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1ZhKSAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBPYmotPnBjaV9kZXYsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1BhLCBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJfQotCX0KLQlOZGlzWmVyb01lbW9yeShwQWQtPlJ4UmluZy5DZWxsLCBSWF9SSU5HX1NJWkUgKiBzaXplb2YoUlRNUF9ETUFDQikpOwotCi0JaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhKQotICAgIHsKLSAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLCBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotICAgIH0KLSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5SeERlc2NSaW5nLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQotCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQotCXsKLQkJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOwotCX0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihSVE1QX0RNQUJVRikpOwotCi0JZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCi0JewotICAgIAlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSkKLQkgICAgewotCSAgICAJUENJX0ZSRUVfQ09OU0lTVEVOVChwT2JqLT5wY2lfZGV2LCBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOwotCSAgICB9Ci0JICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4QnVmU3BhY2VbbnVtXSwgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0KLSAgICAJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEpCi0JICAgIHsKLQkgICAgCVBDSV9GUkVFX0NPTlNJU1RFTlQocE9iai0+cGNpX2RldiwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkgICAgfQotCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOwotCX0KLQotCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Ci19Ci0KLQotLyoKLSAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQotICogQVJHVU1FTlRTOgotICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCi0gKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCi0gKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCi0gKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCi0gKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcwotICogTm90ZXM6Ci0gKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5Ci0gKi8KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBORElTX1BBQ0tFVCBwa3Q7Ci0KLQlwa3QgPSBSVFBLVF9UT19PU1BLVChERVZfQUxMT0NfU0tCKExlbmd0aCkpOwotCi0JaWYgKHBrdCA9PSBOVUxMKSB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKLQl9Ci0KLQlpZiAocGt0KSB7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocGt0LCBQS1RTUkNfTkRJUyk7Ci0JCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgUlRQS1RfVE9fT1NQS1QocGt0KS0+ZGF0YTsKLQkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCBMZW5ndGgsIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCX0gZWxzZSB7Ci0JCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgTlVMTDsKLQkJKlBoeXNpY2FsQWRkcmVzcyA9IChORElTX1BIWVNJQ0FMX0FERFJFU1MpIE5VTEw7Ci0JfQotCi0JcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKLX0KLQotCi1WT0lEIEludmFsaWRfUmVtYWluaW5nX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkgVUxPTkcgVmlydHVhbEFkZHJlc3MpCi17Ci0JTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzczsKLQotCVBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKHZvaWQgKikoVmlydHVhbEFkZHJlc3MrMTYwMCksIFJYX0JVRkZFUl9OT1JNU0laRS0xNjAwLCAtMSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLX0KLQotUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJcFNhdmVSeEQsCi0JT1VUCQlCT09MRUFOCQkJKnBiUmVzY2hlZHVsZSwKLQlJTiBPVVQJVUlOVDMyCQkJKnBSeFBlbmRpbmcpCi17Ci0JUFJYRF9TVFJVQwkJCQlwUnhEOwotCVBORElTX1BBQ0tFVAkJCXBSeFBhY2tldCA9IE5VTEw7Ci0JUE5ESVNfUEFDS0VUCQkJcE5ld1BhY2tldDsKLQlQVk9JRAkJCQkJQWxsb2NWYTsKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MJQWxsb2NQYTsKLQlCT09MRUFOCQkJCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5SeFJpbmdMb2NrKTsKLQotCWlmICgqcFJ4UGVuZGluZyA9PSAwKQotCXsKLQkJLy8gR2V0IGhvdyBtYXkgcGFja2V0cyBoYWQgYmVlbiByZWNlaXZlZAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFggLCAmcEFkLT5SeFJpbmcuUnhEbWFJZHgpOwotCi0JCWlmIChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9PSBwQWQtPlJ4UmluZy5SeERtYUlkeCkKLQkJewotCQkJLy8gbm8gbW9yZSByeCBwYWNrZXRzCi0JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJLy8gZ2V0IHJ4IHBlbmRpbmcgY291bnQKLQkJaWYgKHBBZC0+UnhSaW5nLlJ4RG1hSWR4ID4gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHgpCi0JCQkqcFJ4UGVuZGluZyA9IHBBZC0+UnhSaW5nLlJ4RG1hSWR4IC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7Ci0JCWVsc2UKLQkJCSpwUnhQZW5kaW5nCT0gcEFkLT5SeFJpbmcuUnhEbWFJZHggKyBSWF9SSU5HX1NJWkUgLSBwQWQtPlJ4UmluZy5SeFN3UmVhZElkeDsKLQotCX0KLQotCS8vIFBvaW50IHRvIFJ4IGluZGV4ZWQgcnggcmluZyBkZXNjcmlwdG9yCi0JcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW3BBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4XS5BbGxvY1ZhOwotCi0JaWYgKHBSeEQtPkRET05FID09IDApCi0JewotCQkqcFJ4UGVuZGluZyA9IDA7Ci0JCS8vIERNQUluZHggaGFkIGRvbmUgYnV0IERET05FIGJpdCBub3QgcmVhZHkKLQkJYlJlc2NoZWR1bGUgPSBUUlVFOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQkvLyByZXR1cm4gcnggZGVzY3JpcHRvcgotCU5kaXNNb3ZlTWVtb3J5KHBTYXZlUnhELCBwUnhELCBSWERfU0laRSk7Ci0KLQlwTmV3UGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX0FHR1JFU0laRSwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7Ci0KLQlpZiAocE5ld1BhY2tldCkKLQl7Ci0JCS8vIHVubWFwIHRoZSByeCBidWZmZXIKLQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1BhLAotCQkJCQkgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJcFJ4UGFja2V0ID0gcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQ7Ci0KLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jU2l6ZQk9IFJYX0JVRkZFUl9BR0dSRVNJWkU7Ci0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLnBOZGlzUGFja2V0CQk9IChQTkRJU19QQUNLRVQpIHBOZXdQYWNrZXQ7Ci0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1ZhCT0gQWxsb2NWYTsKLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEJPSBBbGxvY1BhOwotCQkvKiB1cGRhdGUgU0RQMCB0byBuZXcgYnVmZmVyIG9mIHJ4IHBhY2tldCAqLwotCQlwUnhELT5TRFAwID0gQWxsb2NQYTsKLQl9Ci0JZWxzZQotCXsKLQkJLy9wcmludGsoIk5vIFJ4IEJ1ZmZlclxuIik7Ci0JCXBSeFBhY2tldCA9IE5VTEw7Ci0JCWJSZXNjaGVkdWxlID0gVFJVRTsKLQl9Ci0KLQlwUnhELT5ERE9ORSA9IDA7Ci0KLQkvLyBoYWQgaGFuZGxlZCBvbmUgcnggcGFja2V0Ci0JKnBSeFBlbmRpbmcgPSAqcFJ4UGVuZGluZyAtIDE7Ci0KLQkvLyB1cGRhdGUgcnggZGVzY3JpcHRvciBhbmQga2ljayByeAotCUlOQ19SSU5HX0lOREVYKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4LCBSWF9SSU5HX1NJWkUpOwotCi0JcEFkLT5SeFJpbmcuUnhDcHVJZHggPSAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4LTEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQotZG9uZToKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+UnhSaW5nTG9jayk7Ci0JKnBiUmVzY2hlZHVsZSA9IGJSZXNjaGVkdWxlOwotCXJldHVybiBwUnhQYWNrZXQ7Ci19Ci0vKiBFbmQgb2YgMjg2MF9ydG1wX2luaXQuYyAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5jCmluZGV4IDI1NmNiNjcuLjU2YWQyMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2FjdGlvbi5jCkBAIC0zOSwxMCArMzksNyBAQAogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogI2luY2x1ZGUgImFjdGlvbi5oIgogCi0KLXN0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CitzdGF0aWMgdm9pZCBSZXNlcnZlZEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02MSw3NSArNTgsODkgQEAKICAgICAgICAgTVQyX0NMUzNFUlIgICAgICAgICAgICAgIGNsczNlcnJfYWN0aW9uCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3ZvaWQgQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkgICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotCVN0YXRlTWFjaGluZUluaXQoUywgKFNUQVRFX01BQ0hJTkVfRlVOQyAqKVRyYW5zLCBNQVhfQUNUX1NUQVRFLCBNQVhfQUNUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBQ1RfSURMRSwgQUNUX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopIFRyYW5zLCBNQVhfQUNUX1NUQVRFLAorCQkJIE1BWF9BQ1RfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKSBEcm9wLCBBQ1RfSURMRSwKKwkJCSBBQ1RfTUFDSElORV9CQVNFKTsKIAotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfU1BFQ1RSVU1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyU3BlY3RydW1BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclFPU0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclNwZWN0cnVtQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1FPU19DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclFPU0FjdGlvbik7CiAKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVJlc2VydmVkQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUmVzZXJ2ZWRBY3Rpb24pOwogCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCQUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJIVEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQUREQkFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9CQV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckJBQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0hUX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVySFRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfQUREX0JBX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lQUREQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lREVMQkFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lREVMQkFBY3Rpb24pOwogCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9QVUJMSUNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHVibGljQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1JNX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJNQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1BVQkxJQ19DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclB1YmxpY0FjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9STV9DQVRFLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclJNQWN0aW9uKTsKIAotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfUU9TX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVFPU0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9ETFNfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRExTQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSW52YWxpZEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9RT1NfQ0FURSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVRT1NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfRExTX0NBVEUsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lRExTQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9BQ1RfSU5WQUxJRCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVJbnZhbGlkQWN0aW9uKTsKIH0KIAotVk9JRCBNbG1lQUREQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCit2b2lkIE1sbWVBRERCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JTUxNRV9BRERCQV9SRVFfU1RSVUNUICpwSW5mbzsKLQlVQ0hBUiAgICAgICAgICAgQWRkcls2XTsKLQlQVUNIQVIgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlVTE9ORwkJSWR4OwotCUZSQU1FX0FEREJBX1JFUSAgRnJhbWU7Ci0JVUxPTkcJCUZyYW1lTGVuOwotCUJBX09SSV9FTlRSWQkJCSpwQkFFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxICpwSW5mbzsKKwl1OCBBZGRyWzZdOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIElkeDsKKwlzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxIEZyYW1lOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSBOVUxMOwogCi0JcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOwotCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOworCXBJbmZvID0gKHN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSAqKUVsZW0tPk1zZzsKKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxKSk7CiAKLQlpZihNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpCi0JewotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCWlmIChNbG1lQWRkQkFSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcikpIHsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJLy8gMS4gZmluZCBlbnRyeQotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKLQkJaWYgKElkeCA9PSAwKQotCQl7CisJCS8qIDEuIGZpbmQgZW50cnkgKi8KKwkJSWR4ID0KKwkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOworCQlpZiAoSWR4ID09IDApIHsKIAkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBjYW4ndCBmaW5kIEJBT3JpRW50cnkgXG4iKSk7CiAJCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJCX0gZWxzZSB7CisJCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOwogCQl9CiAKIAkJewogCQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwSW5mby0+cEFkZHIsCisJCQkJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCWVsc2UKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBJbmZvLT5wQWRkcik7CisJCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCQkgICAgICBwSW5mby0+cEFkZHIpOwogCQl9CiAKIAkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKQEAgLTE0MSwyMCArMTUyLDI5IEBACiAJCUZyYW1lLlRva2VuID0gcEluZm8tPlRva2VuOwogCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBwSW5mby0+VGltZU91dFZhbHVlOwogCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLkZyYWdOdW0gPSAwOwotCQlGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07CisJCUZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEgPQorCQkgICAgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07CiAKLQkJKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmRnJhbWUuQmFQYXJtKSk7CisJCSoodTE2ICopICgmRnJhbWUuQmFQYXJtKSA9CisJCSAgICBjcHUybGUxNigqKHUxNiAqKSAoJkZyYW1lLkJhUGFybSkpOwogCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihGcmFtZS5UaW1lT3V0VmFsdWUpOwogCQlGcmFtZS5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihGcmFtZS5CYVN0YXJ0U2VxLndvcmQpOwogCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSksICZGcmFtZSwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxKSwgJkZyYW1lLCBFTkRfT0ZfQVJHUyk7CisKKwkJTWluaXBvcnRNTVJlcXVlc3QocEFkLAorCQkJCSAgKE1HTVRfVVNFX1FVRVVFX0ZMQUcgfAorCQkJCSAgIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbcEluZm8tPlRJRF0pLAorCQkJCSAgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOworCiAJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBTZW5kIEFEREJBIHJlcXVlc3QuIFN0YXJ0U2VxID0gJXgsICBGcmFtZUxlbiA9ICVsZC4gQnVmU2l6ZSA9ICVkXG4iLCBGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxLCBGcmFtZUxlbiwgRnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKLSAgICB9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQkEgLSBTZW5kIEFEREJBIHJlcXVlc3QuIFN0YXJ0U2VxID0gJXgsICBGcmFtZUxlbiA9ICVsZC4gQnVmU2l6ZSA9ICVkXG4iLAorCQkJICBGcmFtZS5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxLCBGcmFtZUxlbiwKKwkJCSAgRnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKKwl9CiB9CiAKIC8qCkBAIC0xNjIsMjg4ICsxODIsMjc3IEBACiAgICAgRGVzY3JpcHRpb246CiAgICAgICAgIHNlbmQgREVMQkEgYW5kIGRlbGV0ZSBCYUVudHJ5IGlmIGFueQogICAgIFBhcmFtZXRyczoKLSAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBNTE1FX0RFTEJBX1JFUV9TVFJVQ1QKKyAgICAgICAgRWxlbSAtIE1MTUUgbWVzc2FnZSBzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEKIAogCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lREVMQkFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lREVMQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUFVDSEFSCQkgICBwT3V0QnVmZmVyMiA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcJCUlkeDsKLQlGUkFNRV9ERUxCQV9SRVEgIEZyYW1lOwotCVVMT05HCQlGcmFtZUxlbjsKLQlGUkFNRV9CQVIJRnJhbWVCYXI7CisJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxICpwSW5mbzsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdTggKnBPdXRCdWZmZXIyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIElkeDsKKwlzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxIEZyYW1lOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CisJc3RydWN0IHJ0X2ZyYW1lX2JhciBGcmFtZUJhcjsKIAotCXBJbmZvID0gKE1MTUVfREVMQkFfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKLQkvLyBtdXN0IHNlbmQgYmFjayBERUxCQQotCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lREVMQkFBY3Rpb24oKSwgSW5pdGlhdG9yKCVkKSBcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEgKilFbGVtLT5Nc2c7CisJLyogbXVzdCBzZW5kIGJhY2sgREVMQkEgKi8KKwlOZGlzWmVyb01lbW9yeSgmRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIj09PiBNbG1lREVMQkFBY3Rpb24oKSwgSW5pdGlhdG9yKCVkKSBcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKIAotCWlmKE1sbWVEZWxCQVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKLQl7Ci0JCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMS4gXG4iKSk7CisJaWYgKE1sbWVEZWxCQVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkgeworCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAxLiBcbiIpKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewogCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAyLiBcbiIpKTsKIAkJCXJldHVybjsKIAkJfQorCQkvKiBTRU5EIEJBUiAoU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyLikgKi8KKwkJSWR4ID0KKwkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOwogCi0JCS8vIFNFTkQgQkFSIChTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIuKQotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5CQU9yaVdjaWRBcnJheVtwSW5mby0+VElEXTsKKwkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwKKwkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsCisJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLiAqLworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwSW5mby0+VElEOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5BQ0tQb2xpY3kgPSBJTU1FRF9CQTsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uICovCisJCUZyYW1lQmFyLkJhckNvbnRyb2wuQ29tcHJlc3NlZCA9IDE7CS8qIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLiAqLworCQlGcmFtZUJhci5CYXJDb250cm9sLk1USUQgPSAwOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KIAotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uVHhTZXFbcEluZm8tPlRJRF07IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IHBJbmZvLT5USUQ7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLkFDS1BvbGljeSA9IElNTUVEX0JBOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuTVRJRCA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFyKSwgJkZyYW1lQmFyLCBFTkRfT0ZfQVJHUyk7CiAJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyIFxuIikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgLiBTZW5kIEJBUiB0byByZWZyZXNoIHBlZXIgcmVvcmRlcmluZyBidWZmZXIgXG4iKSk7CiAKLQkJLy8gU0VORCBERUxCQSBGUkFNRQorCQkvKiBTRU5EIERFTEJBIEZSQU1FICovCiAJCUZyYW1lTGVuID0gMDsKIAogCQl7CiAJCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS4KKwkJCQkJICAgICAgQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJZWxzZQotCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCAgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIpOworCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uCisJCQkJCSAgICAgIEFkZHIpOwogCQl9CiAKIAkJRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9CQTsKIAkJRnJhbWUuQWN0aW9uID0gREVMQkE7CiAJCUZyYW1lLkRlbGJhUGFybS5Jbml0aWF0b3IgPSBwSW5mby0+SW5pdGlhdG9yOwogCQlGcmFtZS5EZWxiYVBhcm0uVElEID0gcEluZm8tPlRJRDsKLQkJRnJhbWUuUmVhc29uQ29kZSA9IDM5OyAvLyBUaW1lIE91dAotCQkqKFVTSE9SVCAqKSgmRnJhbWUuRGVsYmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pKTsKKwkJRnJhbWUuUmVhc29uQ29kZSA9IDM5OwkvKiBUaW1lIE91dCAqLworCQkqKHUxNiAqKSAoJkZyYW1lLkRlbGJhUGFybSkgPQorCQkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZGcmFtZS5EZWxiYVBhcm0pKTsKIAkJRnJhbWUuUmVhc29uQ29kZSA9IGNwdTJsZTE2KEZyYW1lLlJlYXNvbkNvZGUpOwogCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIHNpemVvZihGUkFNRV9ERUxCQV9SRVEpLCAgICAmRnJhbWUsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSksICZGcmFtZSwgRU5EX09GX0FSR1MpOwogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gMyBERUxCQSBzZW50LiBJbml0aWF0b3IoJWQpXG4iLCBwSW5mby0+SW5pdGlhdG9yKSk7Ci0gICAgCX0KLX0KLQotVk9JRCBNbG1lUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBNbG1lRExTQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBNbG1lSW52YWxpZEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JLy9QVUNIQVIJCSAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCS8vUmV0dXJuIHRoZSByZWNlaXZpbmcgZnJhbWUgZXhjZXB0IHRoZSBNU0Igb2YgY2F0ZWdvcnkgZmlsZWQgc2V0IHRvIDEuICA3LjMuMS4xMQotfQotCi1WT0lEIFBlZXJRT1NBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotfQotCi1WT0lEIFBlZXJCQUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07Ci0KLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBBRERCQV9SRVE6Ci0JCQlQZWVyQWRkQkFSZXFBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUREQkFfUkVTUDoKLQkJCVBlZXJBZGRCQVJzcEFjdGlvbihwQWQsRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBERUxCQToKLQkJCVBlZXJEZWxCQUFjdGlvbihwQWQsRWxlbSk7Ci0JCQlicmVhazsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIC4gMyBERUxCQSBzZW50LiBJbml0aWF0b3IoJWQpXG4iLAorCQkJICBwSW5mby0+SW5pdGlhdG9yKSk7CiAJfQogfQogCi1WT0lEIFBlZXJQdWJsaWNBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lUU9TQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKK30KKwordm9pZCBNbG1lRExTQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKK30KKwordm9pZCBNbG1lSW52YWxpZEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJLyp1OCAqICAgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7ICovCisJLypSZXR1cm4gdGhlIHJlY2VpdmluZyBmcmFtZSBleGNlcHQgdGhlIE1TQiBvZiBjYXRlZ29yeSBmaWxlZCBzZXQgdG8gMS4gIDcuMy4xLjExICovCit9CisKK3ZvaWQgUGVlclFPU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7Cit9CisKK3ZvaWQgUGVlckJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKKwl1OCBBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDFdOworCisJc3dpdGNoIChBY3Rpb24pIHsKKwljYXNlIEFEREJBX1JFUToKKwkJUGVlckFkZEJBUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQUREQkFfUkVTUDoKKwkJUGVlckFkZEJBUnNwQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgREVMQkE6CisJCVBlZXJEZWxCQUFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgUGVlclB1YmxpY0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7CiAJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybjsKIH0KIAotCi1zdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCitzdGF0aWMgdm9pZCBSZXNlcnZlZEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgQ2F0ZWdvcnk7CisJdTggQ2F0ZWdvcnk7CiAKLQlpZiAoRWxlbS0+TXNnTGVuIDw9IExFTkdUSF84MDJfMTEpCi0JeworCWlmIChFbGVtLT5Nc2dMZW4gPD0gTEVOR1RIXzgwMl8xMSkgewogCQlyZXR1cm47CiAJfQogCiAJQ2F0ZWdvcnkgPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSY3YgcmVzZXJ2ZWQgY2F0ZWdvcnkoJWQpIEFjdGlvbiBGcmFtZVxuIiwgQ2F0ZWdvcnkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUmN2IHJlc2VydmVkIGNhdGVnb3J5KCVkKSBBY3Rpb24gRnJhbWVcbiIsIENhdGVnb3J5KSk7CiAJaGV4X2R1bXAoIlJlc2VydmVkIEFjdGlvbiBGcmFtZSIsICZFbGVtLT5Nc2dbMF0sIEVsZW0tPk1zZ0xlbik7CiB9CiAKLVZPSUQgUGVlclJNQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBQZWVyUk1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogCXJldHVybjsKIH0KIAotc3RhdGljIFZPSUQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkJICAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuOwotCUZSQU1FX0hUX0lORk8JSFRJTkZPZnJhbWUsICpwRnJhbWU7Ci0JVUNIQVIgICAJCSpwQWRkcjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwlzdHJ1Y3QgcnRfZnJhbWVfaHRfaW5mbyBIVElORk9mcmFtZSwgKnBGcmFtZTsKKwl1OCAqcEFkZHI7CiAKKwkvKiAyLiBBbHdheXMgc2VuZCBiYWNrIEFEREJBIFJlc3BvbnNlICovCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLwogCi0JLy8gMi4gQWx3YXlzIHNlbmQgYmFjayBBRERCQSBSZXNwb25zZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0KLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBQ1RJT04gLSByZXNwb25kX2h0X2luZm9ybWF0aW9uX2V4Y2hhbmdlX2FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFDVElPTiAtIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKIAkJcmV0dXJuOwogCX0KLQotCS8vIGdldCBSQQotCXBGcmFtZSA9IChGUkFNRV9IVF9JTkZPICopICZFbGVtLT5Nc2dbMF07CisJLyogZ2V0IFJBICovCisJcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9odF9pbmZvICopICYgRWxlbS0+TXNnWzBdOwogCXBBZGRyID0gcEZyYW1lLT5IZHIuQWRkcjI7CiAKLQlOZGlzWmVyb01lbW9yeSgmSFRJTkZPZnJhbWUsIHNpemVvZihGUkFNRV9IVF9JTkZPKSk7Ci0JLy8gMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLgorCU5kaXNaZXJvTWVtb3J5KCZIVElORk9mcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9odF9pbmZvKSk7CisJLyogMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLiAqLwogCXsKIAkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmSFRJTkZPZnJhbWUuSGRyLCBwQWRkciwKKwkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJZWxzZQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZIVElORk9mcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwKKwkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywKKwkJCQkgICAgICBwQWRkcik7CiAJfQogCiAJSFRJTkZPZnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKIAlIVElORk9mcmFtZS5BY3Rpb24gPSBIVF9JTkZPX0VYQ0hBTkdFOwogCUhUSU5GT2ZyYW1lLkhUX0luZm8uUmVxdWVzdCA9IDA7Ci0JSFRJTkZPZnJhbWUuSFRfSW5mby5Gb3J0eV9NSHpfSW50b2xlcmFudCA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQ7Ci0JSFRJTkZPZnJhbWUuSFRfSW5mby5TVEFfQ2hhbm5lbF9XaWR0aAkgPSBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5Gb3J0eV9NSHpfSW50b2xlcmFudCA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uRm9ydHlfTWh6X0ludG9sZXJhbnQ7CisJSFRJTkZPZnJhbWUuSFRfSW5mby5TVEFfQ2hhbm5lbF9XaWR0aCA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCQkmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX0hUX0lORk8pLAkmSFRJTkZPZnJhbWUsCi0JCQkJCSAgRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9odF9pbmZvKSwgJkhUSU5GT2ZyYW1lLCBFTkRfT0ZfQVJHUyk7CiAKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiB9CiAKLVZPSUQgUGVlckhUQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckhUQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKKwl1OCBBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIDFdOwogCiAJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybjsKIAotCXN3aXRjaChBY3Rpb24pCi0JewotCQljYXNlIE5PVElGWV9CV19BQ1RJT046Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIEhUIE5vdGlmeSBDaGFubmVsIGJhbmR3aWR0aCBhY3Rpb24tLS0tPiBcbiIpKTsKKwlzd2l0Y2ggKEFjdGlvbikgeworCWNhc2UgTk9USUZZX0JXX0FDVElPTjoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBQ1RJT04gLSBIVCBOb3RpZnkgQ2hhbm5lbCBiYW5kd2lkdGggYWN0aW9uLS0tLT4gXG4iKSk7CiAKLQkJCWlmKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQotCQkJewotCQkJCS8vIE5vdGUsIHRoaXMgaXMgdG8gcGF0Y2ggRElSLTEzNTMgQVAuIFdoZW4gdGhlIEFQIHNldCB0byBXZXAsIGl0IHdpbGwgdXNlIGxlZ2FjeSBtb2RlLiBCdXQgQVAgc3RpbGwga2VlcHMKLQkJCQkvLyBzZW5kaW5nIEJXX05vdGlmeSBBY3Rpb24gZnJhbWUsIGFuZCBjYXVzZSB1cyB0byBsaW5rdXAgYW5kIGxpbmtkb3duLgotCQkJCS8vIEluIGxlZ2FjeSBtb2RlLCBkb24ndCBuZWVkIHRvIHBhcnNlIEhUIGFjdGlvbiBmcmFtZS4KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtSWdub3JlIEhUIE5vdGlmeSBDaGFubmVsIEJXIHdoZW4gbGluayBhcyBsZWdhY3kgbW9kZS4gQlcgPSAlZC0tLT4gXG4iLAotCQkJCQkJCQlFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSApKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IDApCS8vIDcuNC44LjIuIGlmIHZhbHVlIGlzIDEsIGtlZXAgdGhlIHNhbWUgYXMgc3VwcG9ydGVkIGNoYW5uZWwgYmFuZHdpZHRoLgotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKLQorCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpIHsKKwkJCS8qIE5vdGUsIHRoaXMgaXMgdG8gcGF0Y2ggRElSLTEzNTMgQVAuIFdoZW4gdGhlIEFQIHNldCB0byBXZXAsIGl0IHdpbGwgdXNlIGxlZ2FjeSBtb2RlLiBCdXQgQVAgc3RpbGwga2VlcHMgKi8KKwkJCS8qIHNlbmRpbmcgQldfTm90aWZ5IEFjdGlvbiBmcmFtZSwgYW5kIGNhdXNlIHVzIHRvIGxpbmt1cCBhbmQgbGlua2Rvd24uICovCisJCQkvKiBJbiBsZWdhY3kgbW9kZSwgZG9uJ3QgbmVlZCB0byBwYXJzZSBIVCBhY3Rpb24gZnJhbWUuICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBQ1RJT04gLUlnbm9yZSBIVCBOb3RpZnkgQ2hhbm5lbCBCVyB3aGVuIGxpbmsgYXMgbGVnYWN5IG1vZGUuIEJXID0gJWQtLS0+IFxuIiwKKwkJCQkgIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgMl0pKTsKIAkJCWJyZWFrOwotCQljYXNlIFNNUFNfQUNUSU9OOgotCQkJLy8gNy4zLjEuMjUKLSAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIFNNUFMgYWN0aW9uLS0tLT4gXG4iKSk7Ci0JCQlpZiAoKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSYweDEpID09IDApKQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0VOQUJMRTsKLQkJCX0KLQkJCWVsc2UgaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0mMHgyKSA9PSAwKSkKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19TVEFUSUM7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfRFlOQU1JQzsKLQkJCX0KKwkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFpZCglZCkgTUlNTyBQUyA9ICVkXG4iLCBFbGVtLT5XY2lkLCBwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlKSk7Ci0JCQkvLyBydDI4NjBjIDogYWRkIHNvbWV0aGluZyBmb3Igc21wcyBjaGFuZ2UuCi0JCQlicmVhazsKKwkJaWYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgMl0gPT0gMCkJLyogNy40LjguMi4gaWYgdmFsdWUgaXMgMSwga2VlcCB0aGUgc2FtZSBhcyBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGguICovCisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDA7CiAKLQkJY2FzZSBTRVRQQ09fQUNUSU9OOgotCQkJYnJlYWs7Ci0JCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046Ci0JCQlicmVhazsKLQkJY2FzZSBIVF9JTkZPX0VYQ0hBTkdFOgotCQkJewotCQkJCUhUX0lORk9STUFUSU9OX09DVEVUCSpwSFRfaW5mbzsKKwkJYnJlYWs7CisJY2FzZSBTTVBTX0FDVElPTjoKKwkJLyogNy4zLjEuMjUgKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQUNUSU9OIC0gU01QUyBhY3Rpb24tLS0tPiBcbiIpKTsKKwkJaWYgKCgoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyAyXSAmIDB4MSkgPT0gMCkpIHsKKwkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX0VOQUJMRTsKKwkJfSBlbHNlIGlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgMl0gJiAweDIpID09IDApKSB7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19TVEFUSUM7CisJCX0gZWxzZSB7CisJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19EWU5BTUlDOworCQl9CiAKLQkJCQlwSFRfaW5mbyA9IChIVF9JTkZPUk1BVElPTl9PQ1RFVCAqKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl07Ci0gICAgCQkJCS8vIDcuNC44LjEwCi0gICAgCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7Ci0gICAgCQkJCWlmIChwSFRfaW5mby0+UmVxdWVzdCkKLSAgICAJCQkJewotICAgIAkJCQkJcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24ocEFkLCBFbGVtKTsKLSAgICAJCQkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFpZCglZCkgTUlNTyBQUyA9ICVkXG4iLCBFbGVtLT5XY2lkLAorCQkJICBwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlKSk7CisJCS8qIHJ0Mjg2MGMgOiBhZGQgc29tZXRoaW5nIGZvciBzbXBzIGNoYW5nZS4gKi8KKwkJYnJlYWs7CisKKwljYXNlIFNFVFBDT19BQ1RJT046CisJCWJyZWFrOworCWNhc2UgTUlNT19DSEFfTUVBU1VSRV9BQ1RJT046CisJCWJyZWFrOworCWNhc2UgSFRfSU5GT19FWENIQU5HRToKKwkJeworCQkJc3RydWN0IHJ0X2h0X2luZm9ybWF0aW9uX29jdGV0ICpwSFRfaW5mbzsKKworCQkJcEhUX2luZm8gPQorCQkJICAgIChzdHJ1Y3QgcnRfaHRfaW5mb3JtYXRpb25fb2N0ZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArCisJCQkJCQkJCSAyXTsKKwkJCS8qIDcuNC44LjEwICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBQ1RJT04gLSBIVCBJbmZvcm1hdGlvbiBFeGNoYW5nZSBhY3Rpb24tLS0tPiBcbiIpKTsKKwkJCWlmIChwSFRfaW5mby0+UmVxdWVzdCkgeworCQkJCXJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKHBBZCwKKwkJCQkJCQkJICAgICAgIEVsZW0pOwogCQkJfQotICAgIAkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC00NTgsMTIwICs0NjcsMTE2IEBACiAJCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBPUklCQVRpbWVyVGltZW91dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgT1JJQkFUaW1lclRpbWVvdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5OwotCUlOVAkJCWksIHRvdGFsOwotCVVDSEFSCQkJVElEOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlpbnQgaSwgdG90YWw7CisJdTggVElEOwogCiAJdG90YWwgPSBwQWQtPk1hY1RhYi5TaXplICogTlVNX09GX1RJRDsKIAotCWZvciAoaSA9IDE7ICgoaSA8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpICYmICh0b3RhbCA+IDApKSA7IGkrKykKLQl7Ci0JCWlmICAocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWRdOworCWZvciAoaSA9IDE7ICgoaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSAmJiAodG90YWwgPiAwKSk7IGkrKykgeworCQlpZiAocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpIHsKKwkJCXBFbnRyeSA9CisJCQkgICAgJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uCisJCQkJCQkgV2NpZF07CiAJCQlUSUQgPSBwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5USUQ7CiAKLQkJCUFTU0VSVChwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtpXS5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOworCQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWQgPAorCQkJICAgICAgIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKIAkJfQotCQl0b3RhbCAtLTsKKwkJdG90YWwtLTsKIAl9CiB9CiAKLQotVk9JRCBTZW5kUmVmcmVzaEJBUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSkKK3ZvaWQgU2VuZFJlZnJlc2hCQVIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7Ci0JRlJBTUVfQkFSCQlGcmFtZUJhcjsKLQlVTE9ORwkJCUZyYW1lTGVuOwotCU5ESVNfU1RBVFVTIAlOU3RhdHVzOwotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVTSE9SVAkJCVNlcXVlbmNlOwotCVVDSEFSCQkJaSwgVElEOwotCVVTSE9SVAkJCWlkeDsKLQlCQV9PUklfRU5UUlkJKnBCQUVudHJ5OworCXN0cnVjdCBydF9mcmFtZV9iYXIgRnJhbWVCYXI7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwlpbnQgTlN0YXR1czsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdTE2IFNlcXVlbmNlOworCXU4IGksIFRJRDsKKwl1MTYgaWR4OworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5OwogCi0JZm9yIChpID0gMDsgaSA8TlVNX09GX1RJRDsgaSsrKQotCXsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09GX1RJRDsgaSsrKSB7CiAJCWlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbaV07Ci0JCWlmIChpZHggPT0gMCkKLQkJeworCQlpZiAoaWR4ID09IDApIHsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2lkeF07CiAKLQkJaWYgIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKKwkJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkgewogCQkJVElEID0gcEJBRW50cnktPlRJRDsKIAogCQkJQVNTRVJUKHBCQUVudHJ5LT5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOwogCi0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOworCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCiAJCQlTZXF1ZW5jZSA9IHBFbnRyeS0+VHhTZXFbVElEXTsKIAotCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEVudHJ5LT5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBFbnRyeS0+QWRkciwKKwkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAotCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgotCQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBTZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCQlGcmFtZUJhci5CYXJDb250cm9sLlRJRCA9IFRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uICovCisJCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IFNlcXVlbmNlOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gVElEOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KIAotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFyKSwgJkZyYW1lQmFyLAorCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCS8qaWYgKCEoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpKSAqLworCQkJaWYgKDEpCS8qIE5vdyB3ZSBhbHdheXMgc2VuZCBCQVIuICovCisJCQl7CisJCQkJLypNaW5pcG9ydE1NUmVxdWVzdFVubG9jayhwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsgKi8KKwkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsCisJCQkJCQkgIChNR01UX1VTRV9RVUVVRV9GTEFHIHwKKwkJCQkJCSAgIE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnkKKwkJCQkJCSAgIFtUSURdKSwgcE91dEJ1ZmZlciwKKwkJCQkJCSAgRnJhbWVMZW4pOwogCi0JCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCisJCQl9CiAJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCQl9CiAJfQogfQogCi1WT0lEIEFjdEhlYWRlckluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLSAgICBJTiBQVUNIQVIgQWRkcjEsCi0gICAgSU4gUFVDSEFSIEFkZHIyLAotICAgIElOIFBVQ0hBUiBBZGRyMykKK3ZvaWQgQWN0SGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkgICB1OCAqQWRkcjEsIHU4ICpBZGRyMiwgdTggKkFkZHIzKQogewotICAgIE5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLSAgICBwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwotICAgIHBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQUNUSU9OOworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKKwlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0FDVElPTjsKIAotICAgIENPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgQWRkcjEpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgQWRkcjEpOwogCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgQWRkcjIpOwotICAgIENPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgQWRkcjMpOworCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgQWRkcjMpOwogfQogCi1WT0lEIEJhckhlYWRlckluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUIFBGUkFNRV9CQVIgcENudGxCYXIsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcFNBKQordm9pZCBCYXJIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X2ZyYW1lX2JhciAqIHBDbnRsQmFyLCB1OCAqcERBLCB1OCAqcFNBKQogewotCU5kaXNaZXJvTWVtb3J5KHBDbnRsQmFyLCBzaXplb2YoRlJBTUVfQkFSKSk7CisJTmRpc1plcm9NZW1vcnkocENudGxCYXIsIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFyKSk7CiAJcENudGxCYXItPkZDLlR5cGUgPSBCVFlQRV9DTlRMOwogCXBDbnRsQmFyLT5GQy5TdWJUeXBlID0gU1VCVFlQRV9CTE9DS19BQ0tfUkVROwotICAgCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOworCXBDbnRsQmFyLT5CYXJDb250cm9sLk1USUQgPSAwOwogCXBDbnRsQmFyLT5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOwogCXBDbnRsQmFyLT5CYXJDb250cm9sLkFDS1BvbGljeSA9IDA7CiAKLQotCXBDbnRsQmFyLT5EdXJhdGlvbiA9IDE2ICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfMSwgc2l6ZW9mKEZSQU1FX0JBKSk7CisJcENudGxCYXItPkR1cmF0aW9uID0KKwkgICAgMTYgKyBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgUkFURV8xLCBzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2JhKSk7CiAKIAlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMSwgcERBKTsKIAlDT1BZX01BQ19BRERSKHBDbnRsQmFyLT5BZGRyMiwgcFNBKTsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC01ODYsMTkgKzU5MSwxNCBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnNlcnRBY3RGaWVsZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDYXRlZ29yeSwKLQlJTiBVSU5UOCBBY3RDb2RlKQordm9pZCBJbnNlcnRBY3RGaWVsZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1OCAqcEZyYW1lQnVmLAorCQkgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLCB1OCBDYXRlZ29yeSwgdTggQWN0Q29kZSkKIHsKLQlVTE9ORyBUZW1wTGVuOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKAlwRnJhbWVCdWYsCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCSZDYXRlZ29yeSwKLQkJCQkJCTEsCQkJCSZBY3RDb2RlLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZDYXRlZ29yeSwgMSwgJkFjdENvZGUsIEVORF9PRl9BUkdTKTsKIAogCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYWN0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uaAppbmRleCBjZmMyYTVmLi45NzRmOGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9hY3Rpb24uaApAQCAtMzksMjMgKzM5LDE4IEBACiAjaWZuZGVmCV9fQUNUSU9OX0hfXwogI2RlZmluZQlfX0FDVElPTl9IX18KIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fSFRfSU5GT19PQ1RFVAotewotCVVDSEFSCVJlcXVlc3Q6MTsKLQlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOwotCVVDSEFSIAlTVEFfQ2hhbm5lbF9XaWR0aDoxOwotCVVDSEFSCVJlc2VydmVkOjU7Ci19IEhUX0lORk9STUFUSU9OX09DVEVUOworc3RydWN0IFBBQ0tFRCBydF9odF9pbmZvcm1hdGlvbl9vY3RldCB7CisJdTggUmVxdWVzdDoxOworCXU4IEZvcnR5X01Iel9JbnRvbGVyYW50OjE7CisJdTggU1RBX0NoYW5uZWxfV2lkdGg6MTsKKwl1OCBSZXNlcnZlZDo1OworfTsKIAotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19GUkFNRV9IVF9JTkZPCi17Ci0JSEVBREVSXzgwMl8xMSAgIAkJSGRyOwotCVVDSEFSCQkJCQlDYXRlZ29yeTsKLQlVQ0hBUgkJCQkJQWN0aW9uOwotCUhUX0lORk9STUFUSU9OX09DVEVUCUhUX0luZm87Ci19ICAgRlJBTUVfSFRfSU5GTywgKlBGUkFNRV9IVF9JTkZPOworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9odF9pbmZvIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXN0cnVjdCBydF9odF9pbmZvcm1hdGlvbl9vY3RldCBIVF9JbmZvOworfTsKIAogI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vYmFfYWN0aW9uLmMKaW5kZXggYjdiYmU5OS4uMTc0ZjJhNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2JhX2FjdGlvbi5jCkBAIC0yNyw0MiArMjcsMzMgQEAKIAogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi0KLQotI2RlZmluZSBCQV9PUklfSU5JVF9TRVEJCShwRW50cnktPlR4U2VxW1RJRF0pIC8vMQkJCS8vIGluaXRhbCBzZXF1ZW5jZSBudW1iZXIgb2YgQkEgc2Vzc2lvbgorI2RlZmluZSBCQV9PUklfSU5JVF9TRVEJCShwRW50cnktPlR4U2VxW1RJRF0pCS8qMSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRhbCBzZXF1ZW5jZSBudW1iZXIgb2YgQkEgc2Vzc2lvbiAqLwogCiAjZGVmaW5lIE9SSV9TRVNTSU9OX01BWF9SRVRSWQk4Ci0jZGVmaW5lIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQJKDIwMDApCS8vIG1zCi0jZGVmaW5lIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVAkoMTAwMCkJLy8gbXMKKyNkZWZpbmUgT1JJX0JBX1NFU1NJT05fVElNRU9VVAkoMjAwMCkJLyogbXMgKi8KKyNkZWZpbmUgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUCSgxMDAwKQkvKiBtcyAqLwogCi0jZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKLSNkZWZpbmUgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJKCgzMDAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVAkJKCgxMDAgKiBPU19IWikvMTAwMCkJLyogc3lzdGVtIHRpY2tzIC0tIDEwMCBtcyAqLworI2RlZmluZSBNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVAkoKDMwMDAgKiBPU19IWikvMTAwMCkJLyogc3lzdGVtIHRpY2tzIC0tIDEwMCBtcyAqLwogCiAjZGVmaW5lIFJFU0VUX1JDVl9TRVEJCSgweEZGRkYpCiAKLXN0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKTsKK3N0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2Jsayk7CiAKK3N0cnVjdCBydF9iYV9vcmlfZW50cnkgKkJBVGFibGVBbGxvY09yaUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2ICogSWR4KTsKIAotQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOworc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqQkFUYWJsZUFsbG9jUmVjRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgKiBJZHgpOwogCi1CQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCk7Cit2b2lkIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KK3ZvaWQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCSAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAogQlVJTERfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KTsKIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KTsKQEAgLTcwLDkxICs2MSw3OCBAQAogI2RlZmluZSBBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChfcEFkLCBfbXBkdV9ibGspCVwKIAkJCUFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KF9wQWQsIF9tcGR1X2Jsayk7CiAKLVZPSUQgQkFfTWF4V2luU2l6ZVJlYXNpZ24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5UGVlciwKLQlPVVQgVUNIQVIJCQkqcFdpblNpemUpCit2b2lkIEJBX01heFdpblNpemVSZWFzaWduKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5UGVlciwgdTggKiBwV2luU2l6ZSkKIHsKLQlVQ0hBUiBNYXhTaXplOworCXU4IE1heFNpemU7CiAKLQotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODNfVkVSU0lPTikgLy8gMyozCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OKQkvKiAzKjMgKi8KIAl7Ci0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzMwNzBfVkVSU0lPTikKLQkJewotCQkJaWYgKHBFbnRyeVBlZXItPldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQotCQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18zMDcwX1ZFUlNJT04pIHsKKwkJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQorCQkJCU1heFNpemUgPSA3OwkvKiBmb3Igbm9uLW9wZW4gbW9kZSAqLwogCQkJZWxzZQogCQkJCU1heFNpemUgPSAxMzsKLQkJfQotCQllbHNlCisJCX0gZWxzZQogCQkJTWF4U2l6ZSA9IDMxOwotCX0KLQllbHNlIGlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODBFX1ZFUlNJT04pIC8vIDI4ODAgZQorCX0gZWxzZSBpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgwRV9WRVJTSU9OKQkvKiAyODgwIGUgKi8KIAl7CiAJCWlmIChwRW50cnlQZWVyLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKLQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQorCQkJTWF4U2l6ZSA9IDc7CS8qIGZvciBub24tb3BlbiBtb2RlICovCiAJCWVsc2UKIAkJCU1heFNpemUgPSAxMzsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlNYXhTaXplID0gNzsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJhPiBXaW4gU2l6ZSA9ICVkLCBNYXggU2l6ZSA9ICVkXG4iLAotCQkJKnBXaW5TaXplLCBNYXhTaXplKSk7CisJCQkJICAqcFdpblNpemUsIE1heFNpemUpKTsKIAotCWlmICgoKnBXaW5TaXplKSA+IE1heFNpemUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gcmVhc3NpZ24gbWF4IHdpbiBzaXplIGZyb20gJWQgdG8gJWRcbiIsCi0JCQkJKnBXaW5TaXplLCBNYXhTaXplKSk7CisJaWYgKCgqcFdpblNpemUpID4gTWF4U2l6ZSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoImJhPiByZWFzc2lnbiBtYXggd2luIHNpemUgZnJvbSAlZCB0byAlZFxuIiwKKwkJCSAgKnBXaW5TaXplLCBNYXhTaXplKSk7CiAKIAkJKnBXaW5TaXplID0gTWF4U2l6ZTsKIAl9CiB9CiAKLXZvaWQgQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKLQkJCQkJCQkJSU4gc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbXBkdSkKK3ZvaWQgQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCUlOIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHUpCiB7Ci0JUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQ7CisJdm9pZCAqcFBhY2tldDsKIAogCXBQYWNrZXQgPSBtcGR1LT5wUGFja2V0OwogCi0JaWYgKG1wZHUtPmJBTVNEVSkKLQl7CisJaWYgKG1wZHUtPmJBTVNEVSkgewogCQlBU1NFUlQoMCk7CiAJCUJBX1Jlb3JkZXJfQU1TRFVfQW5ubm91bmNlKHBBZCwgcFBhY2tldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vCi0JCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQotCQkvLworCX0gZWxzZSB7CisJCS8qICovCisJCS8qIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseSAqLworCQkvKiAqLwogCi0JCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldCwgUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpKTsKKwkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CiAJfQogfQogCiAvKgogICogSW5zZXJ0IGEgcmVvcmRlcmluZyBtcGR1IGludG8gc29ydGVkIGxpbmtlZCBsaXN0IGJ5IHNlcXVlbmNlIG5vLgogICovCi1CT09MRUFOIGJhX3Jlb3JkZXJpbmdfbXBkdV9pbnNlcnRzb3J0ZWQoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdSkKK0JPT0xFQU4gYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZChzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LAorCQkJCQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1KQogewogCiAJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqKnBwU2NhbiA9ICZsaXN0LT5uZXh0OwogCi0Jd2hpbGUgKCpwcFNjYW4gIT0gTlVMTCkKLQl7Ci0JCWlmIChTRVFfU01BTExFUigoKnBwU2NhbiktPlNlcXVlbmNlLCBtcGR1LT5TZXF1ZW5jZSwgTUFYU0VRKSkKLQkJeworCXdoaWxlICgqcHBTY2FuICE9IE5VTEwpIHsKKwkJaWYgKFNFUV9TTUFMTEVSKCgqcHBTY2FuKS0+U2VxdWVuY2UsIG1wZHUtPlNlcXVlbmNlLCBNQVhTRVEpKSB7CiAJCQlwcFNjYW4gPSAmKCpwcFNjYW4pLT5uZXh0OwotCQl9Ci0JCWVsc2UgaWYgKCgqcHBTY2FuKS0+U2VxdWVuY2UgPT0gbXBkdS0+U2VxdWVuY2UpCi0JCXsKKwkJfSBlbHNlIGlmICgoKnBwU2NhbiktPlNlcXVlbmNlID09IG1wZHUtPlNlcXVlbmNlKSB7CiAJCQkvKiBnaXZlIHVwIHRoaXMgZHVwbGljYXRlZCBmcmFtZSAqLwotCQkJcmV0dXJuKEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJCXJldHVybiAoRkFMU0UpOworCQl9IGVsc2UgewogCQkJLyogZmluZCBwb3NpdGlvbiAqLwogCQkJYnJlYWs7CiAJCX0KQEAgLTE2NiwxMSArMTQ0LDExIEBACiAJcmV0dXJuIFRSVUU7CiB9CiAKLQogLyoKICAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiYV9lbnF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQorc3RhdGljIGlubGluZSB2b2lkIGJhX2VucXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCwKKwkJCSAgICAgIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQogewogCWxpc3QtPnFsZW4rKzsKIAltcGR1X2Jsay0+bmV4dCA9IGxpc3QtPm5leHQ7CkBAIC0xODAsNDcgKzE1OCw0NiBAQAogLyoKICAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5CiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqIGJhX2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrID0gTlVMTDsKIAogCUFTU0VSVChsaXN0KTsKIAotCQlpZiAobGlzdC0+cWxlbikKLQkJewotCQkJbGlzdC0+cWxlbi0tOwotCQkJbXBkdV9ibGsgPSBsaXN0LT5uZXh0OwotCQkJaWYgKG1wZHVfYmxrKQotCQkJewotCQkJCWxpc3QtPm5leHQgPSBtcGR1X2Jsay0+bmV4dDsKLQkJCQltcGR1X2Jsay0+bmV4dCA9IE5VTEw7Ci0JCQl9CisJaWYgKGxpc3QtPnFsZW4pIHsKKwkJbGlzdC0+cWxlbi0tOworCQltcGR1X2JsayA9IGxpc3QtPm5leHQ7CisJCWlmIChtcGR1X2JsaykgeworCQkJbGlzdC0+bmV4dCA9IG1wZHVfYmxrLT5uZXh0OworCQkJbXBkdV9ibGstPm5leHQgPSBOVUxMOwogCQl9CisJfQogCXJldHVybiBtcGR1X2JsazsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgICpiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZShzdHJ1Y3QKKwkJCQkJCQkJIHJlb3JkZXJpbmdfbGlzdAorCQkJCQkJCQkgKmxpc3QpCiB7Ci0JcmV0dXJuKGJhX2RlcXVldWUobGlzdCkpOworCXJldHVybiAoYmFfZGVxdWV1ZShsaXN0KSk7CiB9CiAKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICAqYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCi0Jeworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpiYV9yZW9yZGVyaW5nX21wZHVfcHJvYmUoc3RydWN0CisJCQkJCQkJICAgICAgIHJlb3JkZXJpbmdfbGlzdAorCQkJCQkJCSAgICAgICAqbGlzdCkKK3sKIAlBU1NFUlQobGlzdCk7CiAKLQkJcmV0dXJuKGxpc3QtPm5leHQpOwotCX0KLQorCXJldHVybiAobGlzdC0+bmV4dCk7Cit9CiAKIC8qCiAgKiBmcmVlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KICAqLwotdm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JQkFfVEFCTEUgICAgICAgICpUYWI7Ci0JUEJBX1JFQ19FTlRSWSAgIHBCQUVudHJ5OworCXN0cnVjdCBydF9iYV90YWJsZSAqVGFiOworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5OwogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCWludCBpOwogCkBAIC0yMjgsMTUgKzIwNSwxNCBAQAogCiAJLyogSS4gIHJlbGVhc2UgYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBwYWNrZXQgKi8KIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKSB7CiAJCXBCQUVudHJ5ID0gJlRhYi0+QkFSZWNFbnRyeVtpXTsKLQkJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQotCQl7Ci0JCQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCi0JCQl7CisJCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkgeworCQkJd2hpbGUgKChtcGR1X2JsayA9CisJCQkJYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpIHsKIAkJCQlBU1NFUlQobXBkdV9ibGstPnBQYWNrZXQpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBtcGR1X2Jsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIG1wZHVfYmxrLT5wUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7CiAJCQl9CiAJCX0KQEAgLTI1MCwxNSArMjI2LDEzIEBACiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwogfQogCi0KLQogLyoKICAqIEFsbG9jYXRlIGFsbCByZXNvdXJjZSBmb3IgcmVvcmRlcmluZyBtZWNoYW5pc20KICAqLwotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pCitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBudW0pCiB7Ci0JaW50ICAgICBpOwotCVBVQ0hBUiAgbWVtOworCWludCBpOworCXU4ICptZW07CiAJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CiAJc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqZnJlZWxpc3Q7CiAKQEAgLTI3MCwyNCArMjQ0LDI2IEBACiAJZnJlZWxpc3QtPm5leHQgPSBOVUxMOwogCWZyZWVsaXN0LT5xbGVuID0gMDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlICVkIG1lbW9yeSBmb3IgQkEgcmVvcmRlcmluZ1xuIiwgKFVJTlQzMikobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQWxsb2NhdGUgJWQgbWVtb3J5IGZvciBCQSByZW9yZGVyaW5nXG4iLAorCQkgICh1MzIpKG51bSAqIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpKTsKIAogCS8qIGFsbG9jYXRlIG51bWJlciBvZiBtcGR1X2JsayBtZW1vcnkgKi8KLQlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1lbSwgKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKTsKKwlvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgbWVtLAorCQkgICAgIChudW0gKiBzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKTsKIAogCXBBZC0+bXBkdV9ibGtfcG9vbC5tZW0gPSBtZW07CiAKLQlpZiAobWVtID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIEJBIFJlb3JkZXJpbmdcbiIpKTsKLQkJcmV0dXJuKEZBTFNFKTsKKwlpZiAobWVtID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIEJBIFJlb3JkZXJpbmdcbiIpKTsKKwkJcmV0dXJuIChGQUxTRSk7CiAJfQogCiAJLyogYnVpbGQgbXBkdV9ibGsgZnJlZSBsaXN0ICovCi0JZm9yIChpPTA7IGk8bnVtOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewogCQkvKiBnZXQgbXBkdV9ibGsgKi8KLQkJbXBkdV9ibGsgPSAoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqKSBtZW07CisJCW1wZHVfYmxrID0gKHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKiltZW07CiAJCS8qIGluaXRpYWwgbXBkdV9ibGsgKi8KIAkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7CiAJCS8qIG5leHQgbXBkdV9ibGsgKi8KQEAgLTI5NiwyMCArMjcyLDE5IEBACiAJCWJhX2VucXVldWUoZnJlZWxpc3QsIG1wZHVfYmxrKTsKIAl9CiAKLQlyZXR1cm4oVFJVRSk7CisJcmV0dXJuIChUUlVFKTsKIH0KIAotLy9zdGF0aWMgaW50IGJsa19jb3VudD0wOyAvLyBzYW1wbGUgdGFrZSBvZmYsIG5vIHVzZQorLypzdGF0aWMgaW50IGJsa19jb3VudD0wOyAvLyBzYW1wbGUgdGFrZSBvZmYsIG5vIHVzZSAqLwogCi1zdGF0aWMgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfbXBkdV9ibGtfYWxsb2MoUFJUTVBfQURBUFRFUiBwQWQpCitzdGF0aWMgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqYmFfbXBkdV9ibGtfYWxsb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5tcGR1X2Jsa19wb29sLmxvY2spOwogCW1wZHVfYmxrID0gYmFfZGVxdWV1ZSgmcEFkLT5tcGR1X2Jsa19wb29sLmZyZWVsaXN0KTsKLQlpZiAobXBkdV9ibGspCi0JewotLy8JCWJsa19jb3VudCsrOworCWlmIChtcGR1X2JsaykgeworLyogICAgICAgICAgICAgIGJsa19jb3VudCsrOyAqLwogCQkvKiByZXNldCBtcGR1X2JsayAqLwogCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKIAl9CkBAIC0zMTcsNDMgKzI5Miw0MCBAQAogCXJldHVybiBtcGR1X2JsazsKIH0KIAotc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCitzdGF0aWMgdm9pZCBiYV9tcGR1X2Jsa19mcmVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspCiB7CiAJQVNTRVJUKG1wZHVfYmxrKTsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLS8vCWJsa19jb3VudC0tOworLyogICAgICBibGtfY291bnQtLTsgKi8KIAliYV9lbnF1ZXVlKCZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3QsIG1wZHVfYmxrKTsKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7CiB9CiAKLQotc3RhdGljIFVTSE9SVCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKAotCQkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTdGFydFNlcSkKK3N0YXRpYyB1MTYgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCQkgICAgc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnksCisJCQkJCQkgICAgdTE2IFN0YXJ0U2VxKQogewogCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCVVTSE9SVCAgTGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CisJdTE2IExhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CiAKLQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQl7Ci0JCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCi0JCWlmICghU0VRX1NURVBPTkUobXBkdV9ibGstPlNlcXVlbmNlLCBTdGFydFNlcSwgTUFYU0VRKSkKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwotCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOwotCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCisJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkgeworCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICghU0VRX1NURVBPTkUobXBkdV9ibGstPlNlcXVlbmNlLCBTdGFydFNlcSwgTUFYU0VRKSkgeworCQkJYnJlYWs7CisJCX0KKwkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCisJCW1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KTsKKwkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCiAJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwogCQkvKiBtb3ZlIHRvIG5leHQgc2VxdWVuY2UgKi8KLQkJCVN0YXJ0U2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOworCQlTdGFydFNlcSA9IG1wZHVfYmxrLT5TZXF1ZW5jZTsKIAkJTGFzdEluZFNlcSA9IFN0YXJ0U2VxOwogCQkvKiBmcmVlIG1wZHVfYmxrICovCi0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwogCX0KIAogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwpAQCAtMzYyLDUxICszMzQsNDQgQEAKIAlyZXR1cm4gTGFzdEluZFNlcTsKIH0KIAotc3RhdGljIHZvaWQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEoCi0JCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFNlcXVlbmNlKQorc3RhdGljIHZvaWQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnksCisJCQkJCQl1MTYgU2VxdWVuY2UpCiB7CiAJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQl7Ci0JCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCi0JCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKSB8fCBTRVFfU01BTExFUihtcGR1X2Jsay0+U2VxdWVuY2UsIFNlcXVlbmNlLCBNQVhTRVEpKQotCQl7CisJd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkgeworCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCisJCWlmICgobXBkdV9ibGstPlNlcXVlbmNlID09IFNlcXVlbmNlKQorCQkgICAgfHwgU0VRX1NNQUxMRVIobXBkdV9ibGstPlNlcXVlbmNlLCBTZXF1ZW5jZSwgTUFYU0VRKSkgewogCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCiAJCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7CiAJCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KIAkJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwogCQkJLyogZnJlZSBtcGR1X2JsayAqLwogCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOwogCQl9Ci0JCWVsc2UKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KIAl9CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7CiB9CiAKLQotc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKAotCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkgICBQQkFfUkVDX0VOVFJZICAgICAgIHBCQUVudHJ5KQorc3RhdGljIHZvaWQgYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnkpCiB7CiAJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKIAotCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCi0Jd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCkpKQotCXsKLQkJCS8qIHBhc3MgdGhpcyBmcmFtZSB1cCAqLworCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLworCXdoaWxlICgobXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpKSkgeworCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KIAkJQU5OT1VOQ0VfUkVPUkRFUklOR19QQUNLRVQocEFkLCBtcGR1X2Jsayk7CiAKIAkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBtcGR1X2Jsay0+U2VxdWVuY2U7Ci0JCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOworCQliYV9tcGR1X2Jsa19mcmVlKHBBZCwgbXBkdV9ibGspOwogCiAJCS8qIHVwZGF0ZSBsYXN0IGluZGljYXRlZCBzZXF1ZW5jZSAqLwogCX0KQEAgLTQxNSwyNDggKzM4MCwyNDAgQEAKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKIH0KIAotCi0vL3N0YXRpYwotdm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoCi0JCQkJCQkJCQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQkJCQkJCQkJCUlOIFBCQV9SRUNfRU5UUlkgICAgcEJBRW50cnksCi0JCQkJCQkJCQlJTiBVTE9ORyAgICAgICAgICAgIE5vdzMyKQotCisvKnN0YXRpYyAqLwordm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICAgICBzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBOb3czMikKIHsKLQlVU0hPUlQgU2VxdWVuY2U7CisJdTE2IFNlcXVlbmNlOwogCi0vLwlpZiAoKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcitSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkgJiYKLS8vCQkgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAoKHBCQUVudHJ5LT5CQVdpblNpemUqNykvOCkpKSAvL3x8Ci0vLwkJKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoMTAqUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKSAmJgotLy8JCSAocEJBRW50cnktPmxpc3QucWxlbiA+IChwQkFFbnRyeS0+QkFXaW5TaXplLzgpKSkKLQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhNQVhfUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVC82KSkpCi0JCSAmJihwQkFFbnRyeS0+bGlzdC5xbGVuID4gMSkKLQkJKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJ0aW1lb3V0WyVkXSAoJTA4bHgtJTA4bHggPSAlZCA+ICVkKTogJXgsIGZsdXNoIGFsbCFcbiAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCi0JCQkgICAoaW50KSgobG9uZykgTm93MzIgLSAobG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSksIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULAotCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKy8qICAgICAgaWYgKChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpICYmICovCisvKiAgICAgICAgICAgICAgIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKChwQkFFbnRyeS0+QkFXaW5TaXplKjcpLzgpKSkgLy98fCAqLworLyogICAgICAgICAgICAgIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKDEwKlJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSkgJiYgKi8KKy8qICAgICAgICAgICAgICAgKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAocEJBRW50cnktPkJBV2luU2l6ZS84KSkpICovCisJaWYgKFJUTVBfVElNRV9BRlRFUgorCSAgICAoKHVuc2lnbmVkIGxvbmcpTm93MzIsCisJICAgICAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsKKwkJCSAgICAgKE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUIC8gNikpKQorCSAgICAmJiAocEJBRW50cnktPmxpc3QucWxlbiA+IDEpCisJICAgICkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInRpbWVvdXRbJWRdICglMDhseC0lMDhseCA9ICVkID4gJWQpOiAleCwgZmx1c2ggYWxsIVxuICIsCisJCQkgIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLAorCQkJICAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKKwkJCSAgKGludCkoKGxvbmcpTm93MzIgLQorCQkJCShsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwKKwkJCSAgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7CiAJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JfQotCWVsc2UKLQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJfSBlbHNlCisJICAgIGlmIChSVE1QX1RJTUVfQUZURVIKKwkJKCh1bnNpZ25lZCBsb25nKU5vdzMyLAorCQkgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArCisJCQkJIChSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCiAJCSYmIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkKLQkgICApCi0JCXsKLSAgICAJCS8vCi0JCS8vIGZvcmNlIExhc3RJbmRTZXEgdG8gc2hpZnQgdG8gTGFzdEluZFNlcSsxCi0gICAgCQkvLwotICAgIAkJU2VxdWVuY2UgPSAocEJBRW50cnktPkxhc3RJbmRTZXErMSkgJiBNQVhTRVE7Ci0gICAgCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7Ci0gICAgCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKKwkgICAgKSB7CisJCS8qICovCisJCS8qIGZvcmNlIExhc3RJbmRTZXEgdG8gc2hpZnQgdG8gTGFzdEluZFNlcSsxICovCisJCS8qICovCisJCVNlcXVlbmNlID0gKHBCQUVudHJ5LT5MYXN0SW5kU2VxICsgMSkgJiBNQVhTRVE7CisJCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CisJCS8qICovCisJCS8qIGluZGljYXRlIGluLW9yZGVyIG1wZHVzICovCisJCS8qICovCisJCVNlcXVlbmNlID0KKwkJICAgIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwKKwkJCQkJCQkgIFNlcXVlbmNlKTsKKwkJaWYgKFNlcXVlbmNlICE9IFJFU0VUX1JDVl9TRVEpIHsKIAkJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7Ci0gICAgCQkvLwotICAgIAkJLy8gaW5kaWNhdGUgaW4tb3JkZXIgbXBkdXMKLSAgICAJCS8vCi0gICAgCQlTZXF1ZW5jZSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotICAgIAkJaWYgKFNlcXVlbmNlICE9IFJFU0VUX1JDVl9TRVEpCi0gICAgCQl7Ci0gICAgCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKLSAgICAJCX0KKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCSAoIiV4LCBmbHVzaCBvbmUhXG4iLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwogCiAJfQogfQogCi0KIC8qCiAgKiBnZW5lcmF0ZSBBRERCQSByZXF1ZXN0IHRvCiAgKiBzZXQgdXAgQkEgYWdyZWVtZW50CiAgKi8KLVZPSUQgQkFPcmlTZXNzaW9uU2V0VXAoCi0JCQkJCSAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCSAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCQkJCQkgIElOIFVDSEFSICAgICAgICAgICAgVElELAotCQkJCQkgIElOIFVTSE9SVCAgICAgICAgICAgVGltZU91dCwKLQkJCQkJICBJTiBVTE9ORyAgICAgICAgICAgIERlbGF5VGltZSwKLQkJCQkJICBJTiBCT09MRUFOICAgICAgICAgIGlzRm9yY2VkKQotCit2b2lkIEJBT3JpU2Vzc2lvblNldFVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJICAgICAgIHU4IFRJRCwKKwkJICAgICAgIHUxNiBUaW1lT3V0LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBEZWxheVRpbWUsIElOIEJPT0xFQU4gaXNGb3JjZWQpCiB7Ci0JLy9NTE1FX0FEREJBX1JFUV9TVFJVQ1QJQWRkYmFSZXE7Ci0JQkFfT1JJX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgICAgQ2FuY2VsbGVkOworCS8qc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxIEFkZGJhUmVxOyAqLworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwl1MTYgSWR4OworCUJPT0xFQU4gQ2FuY2VsbGVkOwogCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBICE9IFRSVUUpICAmJiAgKGlzRm9yY2VkID09IEZBTFNFKSkKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgIT0gVFJVRSkKKwkgICAgJiYgKGlzRm9yY2VkID09IEZBTFNFKSkKIAkJcmV0dXJuOwogCi0JLy8gaWYgdGhpcyBlbnRyeSBpcyBsaW1pdGVkIHRvIHVzZSBsZWdhY3kgdHggbW9kZSwgaXQgZG9lc24ndCBnZW5lcmF0ZSBCQS4KKwkvKiBpZiB0aGlzIGVudHJ5IGlzIGxpbWl0ZWQgdG8gdXNlIGxlZ2FjeSB0eCBtb2RlLCBpdCBkb2Vzbid0IGdlbmVyYXRlIEJBLiAqLwogCWlmIChSVE1QU3RhRml4ZWRUeE1vZGUocEFkLCBwRW50cnkpICE9IEZJWEVEX1RYTU9ERV9IVCkKIAkJcmV0dXJuOwogCi0JaWYgKChwRW50cnktPkJBRGVjbGluZUJpdG1hcCAmICgxPDxUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKQotCXsKLQkJLy8gdHJ5IGFnYWluIGFmdGVyIDMgc2VjcworCWlmICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMSA8PCBUSUQpKSAmJiAoaXNGb3JjZWQgPT0gRkFMU0UpKSB7CisJCS8qIHRyeSBhZ2FpbiBhZnRlciAzIHNlY3MgKi8KIAkJRGVsYXlUaW1lID0gMzAwMDsKLS8vCQlwcmludGsoIkRlQ2xpbmUgQkEgZnJvbSBQZWVyXG4iKTsKLS8vCQlyZXR1cm47CisvKiAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpKTsgKi8KKy8qICAgICAgICAgICAgICByZXR1cm47ICovCiAJfQogCi0KIAlJZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF07Ci0JaWYgKElkeCA9PSAwKQotCXsKLQkJLy8gYWxsb2NhdGUgYSBCQSBzZXNzaW9uCisJaWYgKElkeCA9PSAwKSB7CisJCS8qIGFsbG9jYXRlIGEgQkEgc2Vzc2lvbiAqLwogCQlwQkFFbnRyeSA9IEJBVGFibGVBbGxvY09yaUVudHJ5KHBBZCwgJklkeCk7Ci0JCWlmIChwQkFFbnRyeSA9PSBOVUxMKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFEREJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgQkEgc2Vzc2lvbiBmYWlsZWQgXG4iKSk7CisJCWlmIChwQkFFbnRyeSA9PSBOVUxMKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJBRERCQSAtIE1sbWVBRERCQUFjdGlvbigpIGFsbG9jYXRlIEJBIHNlc3Npb24gZmFpbGVkIFxuIikpOwogCQkJcmV0dXJuOwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwl9IGVsc2UgeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOwogCX0KIAotCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA+PSBPcmlnaW5hdG9yX1dhaXRSZXMpCi0JeworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA+PSBPcmlnaW5hdG9yX1dhaXRSZXMpIHsKIAkJcmV0dXJuOwogCX0KIAogCXBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXSA9IElkeDsKIAotCS8vIEluaXRpYWxpemUgQkEgc2Vzc2lvbgorCS8qIEluaXRpYWxpemUgQkEgc2Vzc2lvbiAqLwogCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9XYWl0UmVzOwogCXBCQUVudHJ5LT5XY2lkID0gcEVudHJ5LT5BaWQ7CiAJcEJBRW50cnktPkJBV2luU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQ7CiAJcEJBRW50cnktPlNlcXVlbmNlID0gQkFfT1JJX0lOSVRfU0VROwotCXBCQUVudHJ5LT5Ub2tlbiA9IDE7CS8vICgyMDA4LTAxLTIxKSBKYW4gTGVlIHJlY29tbWVuZHMgaXQgLSB0aGlzIHRva2VuIGNhbid0IGJlIDAKKwlwQkFFbnRyeS0+VG9rZW4gPSAxOwkvKiAoMjAwOC0wMS0yMSkgSmFuIExlZSByZWNvbW1lbmRzIGl0IC0gdGhpcyB0b2tlbiBjYW4ndCBiZSAwICovCiAJcEJBRW50cnktPlRJRCA9IFRJRDsKIAlwQkFFbnRyeS0+VGltZU91dFZhbHVlID0gVGltZU91dDsKIAlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmQgQWRkQkEgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVGlkOiVkIGlzRm9yY2VkOiVkIFdjaWQ6JWRcbiIKLQkJLHBFbnRyeS0+QWRkclswXSxwRW50cnktPkFkZHJbMV0scEVudHJ5LT5BZGRyWzJdCi0JCSxwRW50cnktPkFkZHJbM10scEVudHJ5LT5BZGRyWzRdLHBFbnRyeS0+QWRkcls1XQotCQksVElELGlzRm9yY2VkLHBFbnRyeS0+QWlkKSk7Ci0KLQlpZiAoIShwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VElEKSkpCi0JewotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KSwgcEJBRW50cnksIEZBTFNFKTsKLQl9Ci0JZWxzZQorCWlmICghKHBFbnRyeS0+VFhCQWJpdG1hcCAmICgxIDw8IFRJRCkpKSB7CisJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPk9SSUJBVGltZXIsCisJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KSwKKwkJCSAgICAgIHBCQUVudHJ5LCBGQUxTRSk7CisJfSBlbHNlCiAJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOwogCi0JLy8gc2V0IHRpbWVyIHRvIHNlbmQgQUREQkEgcmVxdWVzdAorCS8qIHNldCB0aW1lciB0byBzZW5kIEFEREJBIHJlcXVlc3QgKi8KIAlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBEZWxheVRpbWUpOwogfQogCi1WT0lEIEJBT3JpU2Vzc2lvbkFkZCgKLQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JCQlJTiBQRlJBTUVfQUREQkFfUlNQIHBGcmFtZSkKK3ZvaWQgQkFPcmlTZXNzaW9uQWRkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yc3AgKiBwRnJhbWUpCiB7Ci0JQkFfT1JJX0VOVFJZICAqcEJBRW50cnkgPSBOVUxMOwotCUJPT0xFQU4gICAgICAgQ2FuY2VsbGVkOwotCVVDSEFSICAgICAgICAgVElEOwotCVVTSE9SVCAgICAgICAgSWR4OwotCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyMiA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuOwotCUZSQU1FX0JBUiAgICAgICBGcmFtZUJhcjsKKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeSA9IE5VTEw7CisJQk9PTEVBTiBDYW5jZWxsZWQ7CisJdTggVElEOworCXUxNiBJZHg7CisJdTggKnBPdXRCdWZmZXIyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXN0cnVjdCBydF9mcmFtZV9iYXIgRnJhbWVCYXI7CiAKIAlUSUQgPSBwRnJhbWUtPkJhUGFybS5USUQ7CiAJSWR4ID0gcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtUSURdOwotCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKKwlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOwogCi0JLy8gU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLgotCWlmICgoSWR4ICE9MCkgJiYgKHBCQUVudHJ5LT5USUQgPT0gVElEKSAmJiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9XYWl0UmVzKSkKLQl7Ci0JCXBCQUVudHJ5LT5CQVdpblNpemUgPSBtaW4ocEJBRW50cnktPkJBV2luU2l6ZSwgKChVQ0hBUilwRnJhbWUtPkJhUGFybS5CdWZTaXplKSk7CisJLyogU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLiAqLworCWlmICgoSWR4ICE9IDApICYmIChwQkFFbnRyeS0+VElEID09IFRJRCkKKwkgICAgJiYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykpIHsKKwkJcEJBRW50cnktPkJBV2luU2l6ZSA9CisJCSAgICBtaW4ocEJBRW50cnktPkJBV2luU2l6ZSwgKCh1OClwRnJhbWUtPkJhUGFybS5CdWZTaXplKSk7CiAJCUJBX01heFdpblNpemVSZWFzaWduKHBBZCwgcEVudHJ5LCAmcEJBRW50cnktPkJBV2luU2l6ZSk7CiAKIAkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOwogCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfRG9uZTsKLQkJLy8gcmVzZXQgc2VxdWVuY2UgbnVtYmVyCisJCXBBZC0+QkFUYWJsZS5udW1Eb25lT3JpZ2luYXRvcisrOworCisJCS8qIHJlc2V0IHNlcXVlbmNlIG51bWJlciAqLwogCQlwQkFFbnRyeS0+U2VxdWVuY2UgPSBCQV9PUklfSU5JVF9TRVE7Ci0JCS8vIFNldCBCaXRtYXAgZmxhZy4KLQkJcEVudHJ5LT5UWEJBYml0bWFwIHw9ICgxPDxUSUQpOwotCQkJCVJUTVBDYW5jZWxUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsICZDYW5jZWxsZWQpOworCQkvKiBTZXQgQml0bWFwIGZsYWcuICovCisJCXBFbnRyeS0+VFhCQWJpdG1hcCB8PSAoMSA8PCBUSUQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKIAotCQlwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlID0gMDsJLy9wRnJhbWUtPlRpbWVPdXRWYWx1ZTsKKwkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8qcEZyYW1lLT5UaW1lT3V0VmFsdWU7ICovCiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA6IFRYQkFiaXRtYXAgPSAleCwgQkFXaW5TaXplID0gJWQsIFRpbWVPdXQgPSAlbGRcbiIsIF9fZnVuY19fLCBwRW50cnktPlRYQkFiaXRtYXAsCi0JCQkJCQkJCSBwQkFFbnRyeS0+QkFXaW5TaXplLCBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMgOiBUWEJBYml0bWFwID0gJXgsIEJBV2luU2l6ZSA9ICVkLCBUaW1lT3V0ID0gJWxkXG4iLAorCQkJICBfX2Z1bmNfXywgcEVudHJ5LT5UWEJBYml0bWFwLCBwQkFFbnRyeS0+QkFXaW5TaXplLAorCQkJICBwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKSk7CiAKLQkJLy8gU0VORCBCQVIgOwotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIEJBT3JpU2Vzc2lvbkFkZCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCS8qIFNFTkQgQkFSIDsgKi8KKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkEgLSBCQU9yaVNlc3Npb25BZGQoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsCisJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXS5BZGRyLAorCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBCQUVudHJ5LT5TZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEJBRW50cnktPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwgICAgICAmRnJhbWVCYXIsCi0JCQkJCSAgRU5EX09GX0FSR1MpOworCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsJLyogbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uICovCisJCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxID0gcEJBRW50cnktPlNlcXVlbmNlOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJRnJhbWVCYXIuQmFyQ29udHJvbC5USUQgPSBwQkFFbnRyeS0+VElEOwkvKiBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4gKi8KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsICZGcmFtZUxlbiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFyKSwgJkZyYW1lQmFyLCBFTkRfT0ZfQVJHUyk7CiAJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyMiwgRnJhbWVMZW4pOwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIyKTsKIAotCiAJCWlmIChwQkFFbnRyeS0+T1JJQkFUaW1lci5UaW1lclZhbHVlKQotCQkJUlRNUFNldFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSk7IC8vIGluIG1TZWMKKwkJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpOwkvKiBpbiBtU2VjICovCiAJfQogfQogCi1CT09MRUFOIEJBUmVjU2Vzc2lvbkFkZCgKLQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCSAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCQkJICAgSU4gUEZSQU1FX0FEREJBX1JFUSBwRnJhbWUpCitCT09MRUFOIEJBUmVjU2Vzc2lvbkFkZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKiBwRnJhbWUpCiB7Ci0JQkFfUkVDX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlCT09MRUFOICAgICAgICAgICAgICAgICBTdGF0dXMgPSBUUlVFOwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgVElEOwotCVVDSEFSICAgICAgICAgICAgICAgICAgIEJBV2luU2l6ZTsKLQkvL1VJTlQzMiAgICAgICAgICAgICAgICAgIFZhbHVlOwotCS8vVUlOVCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OwotCisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnkgPSBOVUxMOworCUJPT0xFQU4gU3RhdHVzID0gVFJVRTsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwl1MTYgSWR4OworCXU4IFRJRDsKKwl1OCBCQVdpblNpemU7CisJLyp1MzIgICAgICAgICAgICAgICAgICBWYWx1ZTsgKi8KKwkvKnUzMiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OyAqLwogCiAJQVNTRVJUKHBFbnRyeSk7CiAKLQkvLyBmaW5kIFRJRAorCS8qIGZpbmQgVElEICovCiAJVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOwogCi0JQkFXaW5TaXplID0gbWluKCgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKKwlCQVdpblNpemUgPQorCSAgICBtaW4oKCh1OClwRnJhbWUtPkJhUGFybS5CdWZTaXplKSwKKwkJKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwogCi0JLy8gSW50ZWwgcGF0Y2gKLQlpZiAoQkFXaW5TaXplID09IDApCi0JeworCS8qIEludGVsIHBhdGNoICovCisJaWYgKEJBV2luU2l6ZSA9PSAwKSB7CiAJCUJBV2luU2l6ZSA9IDY0OwogCX0KIAogCUlkeCA9IHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXTsKIAotCi0JaWYgKElkeCA9PSAwKQotCXsKKwlpZiAoSWR4ID09IDApIHsKIAkJcEJBRW50cnkgPSBCQVRhYmxlQWxsb2NSZWNFbnRyeShwQWQsICZJZHgpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJLyogZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cyAqLwogCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyglbGQpOiBJZHggPSAlZCwgQkFXaW5TaXplKHJlcSAlZCkgPSAlZFxuIiwgX19mdW5jX18sIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LAotCQkJCQkJCSBwRnJhbWUtPkJhUGFybS5CdWZTaXplLCBCQVdpblNpemUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fZnVuY19fLAorCQkgIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCwgSWR4LCBwRnJhbWUtPkJhUGFybS5CdWZTaXplLAorCQkgIEJBV2luU2l6ZSkpOwogCi0JLy8gU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLgotCWlmIChwQkFFbnRyeSAhPSBOVUxMKQotCXsKKwkvKiBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuICovCisJaWYgKHBCQUVudHJ5ICE9IE5VTEwpIHsKIAkJQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7CiAKIAkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfSGFuZGxlUmVzOwpAQCAtNjY1LDY2ICs2MjIsNjIgQEAKIAkJcEJBRW50cnktPlRJRCA9IFRJRDsKIAkJcEJBRW50cnktPlRpbWVPdXRWYWx1ZSA9IHBGcmFtZS0+VGltZU91dFZhbHVlOwogCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9BY2NlcHQ7Ci0JCS8vIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsgLy9wRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7CisJCS8qIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVyICovCisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gUkVTRVRfUkNWX1NFUTsJLypwRnJhbWUtPkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXE7ICovCiAKLQkJcHJpbnRrKCJTdGFydCBTZXEgPSAlMDh4XG4iLCAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJICgiU3RhcnQgU2VxID0gJTA4eFxuIiwKKwkJCSAgcEZyYW1lLT5CYVN0YXJ0U2VxLmZpZWxkLlN0YXJ0U2VxKSk7CiAKLQkJaWYgKHBFbnRyeS0+UlhCQWJpdG1hcCAmICgxPDxUSUQpKQotCQl7CisJCWlmIChwRW50cnktPlJYQkFiaXRtYXAgJiAoMSA8PCBUSUQpKSB7CiAJCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCQVJlY1Nlc3Npb25JZGxlVGltZW91dCksIHBCQUVudHJ5LCBUUlVFKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBJbml0VGltZXIocEFkLCAmcEJBRW50cnktPlJFQ0JBVGltZXIsCisJCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OCisJCQkJICAgICAgKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KSwgcEJBRW50cnksCisJCQkJICAgICAgVFJVRSk7CiAJCX0KIAotCQkvLyBTZXQgQml0bWFwIGZsYWcuCi0JCXBFbnRyeS0+UlhCQWJpdG1hcCB8PSAoMTw8VElEKTsKKwkJLyogU2V0IEJpdG1hcCBmbGFnLiAqLworCQlwRW50cnktPlJYQkFiaXRtYXAgfD0gKDEgPDwgVElEKTsKIAkJcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdID0gSWR4OwogCi0JCXBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICY9IH4oMTw8VElEKTsKKwkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxIDw8IFRJRCk7CiAKLQkJLy8gU2V0IEJBIHNlc3Npb24gbWFzayBpbiBXQ0lEIHRhYmxlLgotCQlSVDI4WFhfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhwQWQsIHBFbnRyeS0+QWlkLCBUSUQpOworCQkvKiBTZXQgQkEgc2Vzc2lvbiBtYXNrIGluIFdDSUQgdGFibGUuICovCisJCVJUTVBfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhwQWQsIHBFbnRyeS0+QWlkLCBUSUQpOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTUFDRW50cnlbJWRdUlhCQWJpdG1hcCA9IDB4JXguIEJBUmVjV2NpZEFycmF5PSVkXG4iLAotCQkJCXBFbnRyeS0+QWlkLCBwRW50cnktPlJYQkFiaXRtYXAsIHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbVElEXSkpOwotCX0KLQllbHNlCi0JeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1BQ0VudHJ5WyVkXVJYQkFiaXRtYXAgPSAweCV4LiBCQVJlY1djaWRBcnJheT0lZFxuIiwKKwkJCSAgcEVudHJ5LT5BaWQsIHBFbnRyeS0+UlhCQWJpdG1hcCwKKwkJCSAgcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdKSk7CisJfSBlbHNlIHsKIAkJU3RhdHVzID0gRkFMU0U7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKLQkJCQlQUklOVF9NQUMocEVudHJ5LT5BZGRyKSwgVElEKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQ2FuJ3QgQWNjZXB0IEFEREJBIGZvciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUSUQgPSAlZFxuIiwKKwkJCSAgUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOwogCX0KLQlyZXR1cm4oU3RhdHVzKTsKKwlyZXR1cm4gKFN0YXR1cyk7CiB9CiAKLQotQkFfUkVDX0VOVFJZICpCQVRhYmxlQWxsb2NSZWNFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpCitzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpCQVRhYmxlQWxsb2NSZWNFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiAqIElkeCkKIHsKLQlpbnQgICAgICAgICAgICAgaTsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQorCWludCBpOworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKIAotCWlmIChwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgPj0gTUFYX0JBUkVDSV9TRVNTSU9OKQotCXsKLQkJcHJpbnRrKCJCQSBSZWNpcGVpbnQgU2Vzc2lvbiAoJWxkKSA+ICVkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsCi0JCQlNQVhfQkFSRUNJX1NFU1NJT04pOworCWlmIChwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgPj0gTUFYX0JBUkVDSV9TRVNTSU9OKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJCQSBSZWNpcGVpbnQgU2Vzc2lvbiAoJWxkKSA+ICVkXG4iLAorCQkJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsCisJCQkJCU1BWF9CQVJFQ0lfU0VTU0lPTikpOwogCQlnb3RvIGRvbmU7CiAJfQotCi0JLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5Ci0JZm9yIChpPTE7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtpXTsKLQkJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfTk9ORSkpCi0JCXsKLQkJCS8vIGdldCBvbmUKKwkvKiByZXNlcnZlIGlkeCAwIHRvIGlkZW50aWZ5IEJBV2NpZEFycmF5W1RJRF0gYXMgZW1wdHkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykgeworCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtpXTsKKwkJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfTk9ORSkpIHsKKwkJCS8qIGdldCBvbmUgKi8KIAkJCXBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCsrOwogCQkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfVVNFRDsKIAkJCSpJZHggPSBpOwpAQCAtNzM3LDI3ICs2OTAsMjEgQEAKIAlyZXR1cm4gcEJBRW50cnk7CiB9CiAKLUJBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KQorc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgKiBJZHgpCiB7Ci0JaW50ICAgICAgICAgICAgIGk7Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7CisJaW50IGk7CisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSBOVUxMOwogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwogCi0JaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkKLQl7CisJaWYgKHBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgPj0gKE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFKSkgewogCQlnb3RvIGRvbmU7CiAJfQotCi0JLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5Ci0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKLQl7Ci0JCXBCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV07Ci0JCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9OT05FKSkKLQkJewotCQkJLy8gZ2V0IG9uZQorCS8qIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eSAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKSB7CisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldOworCQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfTk9ORSkpIHsKKwkJCS8qIGdldCBvbmUgKi8KIAkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IrKzsKIAkJCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9VU0VEOwogCQkJcEJBRW50cnktPnBBZGFwdGVyID0gcEFkOwpAQCAtNzcxLDMyICs3MTgsMjggQEAKIAlyZXR1cm4gcEJBRW50cnk7CiB9CiAKLQotVk9JRCBCQVRhYmxlRnJlZU9yaUVudHJ5KAotCQkJCQkJSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQlJTiAgVUxPTkcgICAgICAgICAgIElkeCkKK3ZvaWQgQkFUYWJsZUZyZWVPcmlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgSWR4KQogewotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCisJc3RydWN0IHJ0X2JhX29yaV9lbnRyeSAqcEJBRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKIAogCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQogCQlyZXR1cm47CiAKLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07CisJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKIAotCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpCi0JeworCWlmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyAhPSBPcmlnaW5hdG9yX05PTkUpIHsKIAkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOwogCQlwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKIAotCiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQkJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJewotCQkgCXBFbnRyeS0+VFhCQWJpdG1hcCAmPSAofigxPDwocEJBRW50cnktPlRJRCkgKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRnJlZU9yaUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKLQkJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKSB7CisJCQlwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IgLT0gMTsKKwkJCXBFbnRyeS0+VFhCQWJpdG1hcCAmPSAofigxIDw8IChwQkFFbnRyeS0+VElEKSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwKKwkJCQkgIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOworCQkJLyogRXJhc2UgQml0bWFwIGZsYWcuICovCiAJCX0KIAogCQlBU1NFUlQocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAhPSAwKTsKQEAgLTgwOSwyMiArNzUyLDE3IEBACiAJfQogfQogCi0KLVZPSUQgQkFUYWJsZUZyZWVSZWNFbnRyeSgKLQkJCQkJCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJSU4gIFVMT05HICAgICAgICAgICBJZHgpCit2b2lkIEJBVGFibGVGcmVlUmVjRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIElkeCkKIHsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQorCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CiAKIAlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKIAkJcmV0dXJuOwogCi0JcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOworCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CiAKLQlpZiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgIT0gUmVjaXBpZW50X05PTkUpCi0JeworCWlmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyAhPSBSZWNpcGllbnRfTk9ORSkgewogCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF07CiAJCXBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbcEJBRW50cnktPlRJRF0gPSAwOwogCkBAIC04MzksMTc3ICs3NzcsMTc3IEBACiAJfQogfQogCi0KLVZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAotCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAotCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCit2b2lkIEJBT3JpU2Vzc2lvblRlYXJEb3duKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggV2NpZCwKKwkJCSAgdTggVElELAorCQkJICBJTiBCT09MRUFOIGJQYXNzaXZlLCBJTiBCT09MRUFOIGJGb3JjZVNlbmQpCiB7Ci0JVUxPTkcgICAgICAgICAgIElkeCA9IDA7Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKLQlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOworCXVuc2lnbmVkIGxvbmcgSWR4ID0gMDsKKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeTsKKwlCT09MRUFOIENhbmNlbGxlZDsKIAotCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKKwlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkgewogCQlyZXR1cm47CiAJfQotCi0JLy8KLQkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgotCS8vCisJLyogKi8KKwkvKiBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLiAqLworCS8qICovCiAJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOwotCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQotCXsKLQkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKLQkJewotCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCi0JCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkJaWYgKEVsZW0gPT0gTlVMTCkKLQkJCQlyZXR1cm47CisJaWYgKChJZHggPT0gMCkgfHwgKElkeCA+PSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSkpIHsKKwkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkgeworCQkJLyogZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBICovCisJCQlzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEgRGVsYmFSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtID0KKwkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJCWlmIChFbGVtICE9IE5VTEwpIHsKKwkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSk7CiAKLQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7Ci0KLQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLQkJCURlbGJhUmVxLldjaWQgPSBXY2lkOwotCQkJRGVsYmFSZXEuVElEID0gVElEOwotCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKLSNpZiAxCi0JCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOwotCQkJa2ZyZWUoRWxlbSk7Ci0jZWxzZQotCQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKLQkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLSNlbmRpZgorCQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKwkJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKKwkJCQlFbGVtLT5Nc2dMZW4gPSBzaXplb2YoRGVsYmFSZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLAorCQkJCQkgICAgICAgc2l6ZW9mKERlbGJhUmVxKSk7CisJCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7CisJCQkJa2ZyZWUoRWxlbSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIlcyhiRm9yY2VTZW5kKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwKKwkJCQkJICBfX2Z1bmNfXykpOworCQkJfQogCQl9CiAKIAkJcmV0dXJuOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19mdW5jX18sIFdjaWQsIFRJRCkpOwogCiAJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIE9SSV9CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cykpOwotCS8vCi0JLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCi0JLy8KLQlpZiAoKGJQYXNzaXZlID09IEZBTFNFKSAmJiAoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpKQotCXsKLQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7Ci0JCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZiAoRWxlbSA9PSBOVUxMKQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJcdD09PT5JZHggPSAlbGQsIFdjaWQ9JWQuVElEPSVkLCBPUklfQkFfU3RhdHVzID0gJWQgXG4iLCBJZHgsCisJCSAgV2NpZCwgVElELCBwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cykpOworCS8qICovCisJLyogUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuICovCisJLyogKi8KKwlpZiAoKGJQYXNzaXZlID09IEZBTFNFKSAmJiAoVElEID09IHBCQUVudHJ5LT5USUQpCisJICAgICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpKSB7CisJCXN0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSBEZWxiYVJlcTsKKwkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9CisJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJTUVNX0FMTE9DX0ZMQUcpOworCQlpZiAoRWxlbSAhPSBOVUxMKSB7CisJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOworCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pKTsKKworCQkJQ09QWV9NQUNfQUREUihEZWxiYVJlcS5BZGRyLAorCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CisJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCURlbGJhUmVxLlRJRCA9IHBCQUVudHJ5LT5USUQ7CisJCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOworCQkJRWxlbS0+TXNnTGVuID0gc2l6ZW9mKERlbGJhUmVxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOworCQkJa2ZyZWUoRWxlbSk7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlcygpOmFsbG9jIG1lbW9yeSBmYWlsZWQhXG4iLCBfX2Z1bmNfXykpOwogCQkJcmV0dXJuOwotCi0JCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKLQotCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7Ci0JCURlbGJhUmVxLldjaWQgPSBXY2lkOwotCQlEZWxiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOwotCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOwotI2lmIDEKLQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCWtmcmVlKEVsZW0pOwotI2Vsc2UKLQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotI2VuZGlmCisJCX0KIAl9CiAJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7CiAJQkFUYWJsZUZyZWVPcmlFbnRyeShwQWQsIElkeCk7CiAKLQlpZiAoYlBhc3NpdmUpCi0JewotCQkvL0JBT3JpU2Vzc2lvblNldFVwKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIFRJRCwgMCwgMTAwMDAsIFRSVUUpOworCWlmIChiUGFzc2l2ZSkgeworCQkvKkJBT3JpU2Vzc2lvblNldFVwKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIFRJRCwgMCwgMTAwMDAsIFRSVUUpOyAqLwogCX0KIH0KIAotVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKLQkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgV2NpZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBUSUQsCi0JCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYlBhc3NpdmUpCit2b2lkIEJBUmVjU2Vzc2lvblRlYXJEb3duKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTggV2NpZCwgdTggVElELCBJTiBCT09MRUFOIGJQYXNzaXZlKQogewotCVVMT05HICAgICAgICAgICBJZHggPSAwOwotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnk7CisJdW5zaWduZWQgbG9uZyBJZHggPSAwOworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5OwogCi0JaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JeworCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSB7CiAJCXJldHVybjsKIAl9Ci0KLQkvLwotCS8vICBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgotCS8vCisJLyogKi8KKwkvKiAgTG9jYXRlIGNvcnJlc3BvbmRpbmcgQkEgT3JpZ2luYXRvciBFbnRyeSBpbiBCQSBUYWJsZSB3aXRoIHRoZSAocEFkZHIsVElEKS4gKi8KKwkvKiAqLwogCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKIAlpZiAoSWR4ID09IDApCiAJCXJldHVybjsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7Ci0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7CiAKIAlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXHQ9PT0+SWR4ID0gJWxkLCBXY2lkPSVkLlRJRD0lZCwgUkVDX0JBX1N0YXR1cyA9ICVkIFxuIiwgSWR4LCBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7Ci0JLy8KLQkvLyBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4KLQkvLwotCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkKLQl7Ci0JCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAgIERlbGJhUmVxOwotCQlCT09MRUFOIAkJCQlDYW5jZWxsZWQ7Ci0JCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkvL1VMT05HICAgb2Zmc2V0OwotCQkvL1VJTlQzMiAgVkFMVUU7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwKKwkJICBXY2lkLCBUSUQsIHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzKSk7CisJLyogKi8KKwkvKiBQcmVwYXJlIERlbEJBIGFjdGlvbiBmcmFtZSBhbmQgc2VuZCB0byB0aGUgcGVlci4gKi8KKwkvKiAqLworCWlmICgoVElEID09IHBCQUVudHJ5LT5USUQpCisJICAgICYmIChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfQWNjZXB0KSkgeworCQlzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEgRGVsYmFSZXE7CisJCUJPT0xFQU4gQ2FuY2VsbGVkOworCQkvKnVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7ICovCisJCS8qdTMyICBWQUxVRTsgKi8KIAogCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKIAotCQkvLwotCQkvLyAxLiBTZW5kIERFTEJBIEFjdGlvbiBGcmFtZQotCQkvLwotCQlpZiAoYlBhc3NpdmUgPT0gRkFMU0UpCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KCZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7CisJCS8qICovCisJCS8qIDEuIFNlbmQgREVMQkEgQWN0aW9uIEZyYW1lICovCisJCS8qICovCisJCWlmIChiUGFzc2l2ZSA9PSBGQUxTRSkgeworCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSA9CisJCQkgICAgKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtKSwKKwkJCQkJCQlNRU1fQUxMT0NfRkxBRyk7CisJCQlpZiAoRWxlbSAhPSBOVUxMKSB7CisJCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2Yoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSkpOwogCi0JCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7Ci0JCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCURlbGJhUmVxLlRJRCA9IFRJRDsKLQkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKLSNpZiAxCi0JCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KEVsZW0tPk1zZywgJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCU1sbWVERUxCQUFjdGlvbihwQWQsIEVsZW0pOwotCQkJa2ZyZWUoRWxlbSk7Ci0jZWxzZQotCQkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIHNpemVvZihNTE1FX0RFTEJBX1JFUV9TVFJVQ1QpLCAoUFZPSUQpJkRlbGJhUmVxKTsKLQkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLSNlbmRpZgorCQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKwkJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKKwkJCQlEZWxiYVJlcS5USUQgPSBUSUQ7CisJCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gUkVDSVBJRU5UOworCQkJCUVsZW0tPk1zZ0xlbiA9IHNpemVvZihEZWxiYVJlcSk7CisJCQkJTmRpc01vdmVNZW1vcnkoRWxlbS0+TXNnLCAmRGVsYmFSZXEsCisJCQkJCSAgICAgICBzaXplb2YoRGVsYmFSZXEpKTsKKwkJCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKKwkJCQlrZnJlZShFbGVtKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIiVzKCk6YWxsb2MgbWVtb3J5IGZhaWxlZCFcbiIsCisJCQkJCSAgX19mdW5jX18pKTsKKwkJCQlyZXR1cm47CisJCQl9CiAJCX0KIAotCi0JCS8vCi0JCS8vIDIuIEZyZWUgcmVzb3VyY2Ugb2YgQkEgc2Vzc2lvbgotCQkvLwotCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCisJCS8qICovCisJCS8qIDIuIEZyZWUgcmVzb3VyY2Ugb2YgQkEgc2Vzc2lvbiAqLworCQkvKiAqLworCQkvKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzICovCiAJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKIAogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7CiAKLQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCisJCS8qIEVyYXNlIEJpdG1hcCBmbGFnLiAqLwogCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7CiAJCXBCQUVudHJ5LT5CQVdpblNpemUgPSAwOwotCQkvLyBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZQotCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpKSk7CisJCS8qIEVyYXNlIEJpdG1hcCBmbGFnIGF0IHNvZnR3YXJlIG1hY3RhYmxlICovCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uUlhCQWJpdG1hcCAmPQorCQkgICAgKH4oMSA8PCAocEJBRW50cnktPlRJRCkpKTsKIAkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdID0gMDsKIAotCQlSVDI4WFhfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKHBBZCwgV2NpZCwgVElEKTsKKwkJUlRNUF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMocEFkLCBXY2lkLCBUSUQpOwogCiAJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKIApAQCAtMTAxOCwyMCArOTU2LDE2IEBACiAJQkFUYWJsZUZyZWVSZWNFbnRyeShwQWQsIElkeCk7CiB9CiAKLVZPSUQgQkFTZXNzaW9uVGVhckRvd25BTEwoCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSIHBBZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSIFdjaWQpCit2b2lkIEJBU2Vzc2lvblRlYXJEb3duQUxMKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggV2NpZCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaT0wOyBpPE5VTV9PRl9USUQ7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE5VTV9PRl9USUQ7IGkrKykgewogCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFLCBGQUxTRSk7CiAJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgV2NpZCwgaSwgRkFMU0UpOwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0xMDQ2LDUwICs5ODAsNTAgQEAKIAkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9PUklfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFFbnRyeSA9IChzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CiAKIAlpZiAocEJBRW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOwogCi0JLy8gRG8gbm90aGluZyBpZiBtb25pdG9yIG1vZGUgaXMgb24KLQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQlyZXR1cm47CisJeworCQkvKiBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbiAqLworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KIAogCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BCQUVudHJ5LT5XY2lkXTsKIAotCWlmICgocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9XYWl0UmVzKSAmJiAocEJBRW50cnktPlRva2VuIDwgT1JJX1NFU1NJT05fTUFYX1JFVFJZKSkKLQl7Ci0JCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAgICBBZGRiYVJlcTsKKwlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfV2FpdFJlcykKKwkgICAgJiYgKHBCQUVudHJ5LT5Ub2tlbiA8IE9SSV9TRVNTSU9OX01BWF9SRVRSWSkpIHsKKwkJc3RydWN0IHJ0X21sbWVfYWRkYmFfcmVxIEFkZGJhUmVxOwogCiAJCU5kaXNaZXJvTWVtb3J5KCZBZGRiYVJlcSwgc2l6ZW9mKEFkZGJhUmVxKSk7CiAJCUNPUFlfTUFDX0FERFIoQWRkYmFSZXEucEFkZHIsIHBFbnRyeS0+QWRkcik7Ci0JCUFkZGJhUmVxLldjaWQgPSAoVUNIQVIpKHBFbnRyeS0+QWlkKTsKKwkJQWRkYmFSZXEuV2NpZCA9ICh1OCkocEVudHJ5LT5BaWQpOwogCQlBZGRiYVJlcS5USUQgPSBwQkFFbnRyeS0+VElEOwotCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OworCQlBZGRiYVJlcS5CYUJ1ZlNpemUgPQorCQkgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKIAkJQWRkYmFSZXEuVGltZU91dFZhbHVlID0gMDsKIAkJQWRkYmFSZXEuVG9rZW4gPSBwQkFFbnRyeS0+VG9rZW47Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZBZGRiYVJlcSk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSBPcmkgU2Vzc2lvbiBUaW1lb3V0KCVkKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBUaWQ6JWQgV2NpZDolZFxuIgotCQkscEJBRW50cnktPlRva2VuCi0JCSxwRW50cnktPkFkZHJbMF0scEVudHJ5LT5BZGRyWzFdLHBFbnRyeS0+QWRkclsyXQotCQkscEVudHJ5LT5BZGRyWzNdLHBFbnRyeS0+QWRkcls0XSxwRW50cnktPkFkZHJbNV0KLQkJLHBCQUVudHJ5LT5USUQscEVudHJ5LT5BaWQpKTsKKwkJTWxtZUVucXVldWUocEFkLCBBQ1RJT05fU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQUREX0JBX0NBVEUsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSksICh2b2lkICopJiBBZGRiYVJlcSk7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQkEgT3JpIFNlc3Npb24gVGltZW91dCglZCkgOiBTZW5kIEFERCBCQSBhZ2FpblxuIiwKKwkJCSAgcEJBRW50cnktPlRva2VuKSk7CisKIAkJcEJBRW50cnktPlRva2VuKys7CiAJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCUJBVGFibGVGcmVlT3JpRW50cnkocEFkLCBwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdKTsKIAl9CiB9CkBAIC0xMTA4LDQxOSArMTA0MiwzODMgQEAKIAkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewogCi0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeSA9IChCQV9SRUNfRU5UUlkgKilGdW5jdGlvbkNvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKLQlVTE9ORyAgICAgICAgICAgTm93MzI7CisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqcEJBRW50cnkgPSAoc3RydWN0IHJ0X2JhX3JlY19lbnRyeSAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJdW5zaWduZWQgbG9uZyBOb3czMjsKIAogCWlmIChwQkFFbnRyeSA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKQotCXsKKwlpZiAoKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID09IFJlY2lwaWVudF9BY2NlcHQpKSB7CiAJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKIAotCQlpZiAoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyICsgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpCi0JCXsKKwkJaWYgKFJUTVBfVElNRV9BRlRFUgorCQkgICAgKCh1bnNpZ25lZCBsb25nKU5vdzMyLAorCQkgICAgICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgKworCQkJCSAgICAgUkVDX0JBX1NFU1NJT05fSURMRV9USU1FT1VUKSkpIHsKIAkJCXBBZCA9IHBCQUVudHJ5LT5wQWRhcHRlcjsKLQkJCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKKwkJCS8qIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMgKi8KIAkJCWJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cyhwQWQsIHBCQUVudHJ5KTsKLQkJCXByaW50aygiJWxkOiBSRUMgQkEgc2Vzc2lvbiBUaW1lb3V0XG4iLCBOb3czMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiJWxkOiBSRUMgQkEgc2Vzc2lvbiBUaW1lb3V0XG4iLCBOb3czMikpOwogCQl9CiAJfQogfQogCi0KLVZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBQZWVyQWRkQkFSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCS8vCTcuNC40LjEKLQkvL1VMT05HCUlkeDsKLQlVQ0hBUiAgIFN0YXR1cyA9IDE7Ci0JVUNIQVIgICBwQWRkcls2XTsKLQlGUkFNRV9BRERCQV9SU1AgQUREZnJhbWU7Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JUEZSQU1FX0FEREJBX1JFUSAgcEFkZHJlcUZyYW1lID0gTlVMTDsKLQkvL1VDSEFSCQlCdWZTaXplOwotCVVMT05HICAgICAgIEZyYW1lTGVuOwotCVBVTE9ORyAgICAgIHB0ZW1wOwotCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OworCS8qICAgICAgNy40LjQuMSAqLworCS8qdW5zaWduZWQgbG9uZyBJZHg7ICovCisJdTggU3RhdHVzID0gMTsKKwl1OCBwQWRkcls2XTsKKwlzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwIEFERGZyYW1lOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwlzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcmVxICogcEFkZHJlcUZyYW1lID0gTlVMTDsKKwkvKnU4ICAgICAgICAgQnVmU2l6ZTsgKi8KKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCXVuc2lnbmVkIGxvbmcgKnB0ZW1wOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiAoV2NpZCA9ICVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXMgPT0+IChXY2lkID0gJWQpXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCkpOwogCi0JLy9oZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7CisJLypoZXhfZHVtcCgiQWRkQkFSZXEiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7ICovCiAKLQkvL0FEREJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgorCS8qQUREQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuICovCiAJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybjsKIAogCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKLQlwdGVtcCA9IChQVUxPTkcpRWxlbS0+TXNnOwotCS8vREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkEgLSBQZWVyQWRkQkFSZXFBY3Rpb24tLS0tPiBcbiIpKTsKKwlwdGVtcCA9ICh1bnNpZ25lZCBsb25nICopRWxlbS0+TXNnOworCS8qREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VNVSwgKCIlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHhcbiIsICoocHRlbXApLCAqKHB0ZW1wKzEpLCAqKHB0ZW1wKzIpLCAqKHB0ZW1wKzMpLCAqKHB0ZW1wKzQpLCAqKHB0ZW1wKzUpLCAqKHB0ZW1wKzYpLCAqKHB0ZW1wKzcpLCAqKHB0ZW1wKzgpKSk7ICovCiAKLQlpZiAoUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIHBBZGRyKSkKLQl7CisJaWYgKFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBwQWRkcikpIHsKIAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPT0gRkFMU0UpICYmIElTX0hUX1NUQShwTWFjRW50cnkpKQotCQl7Ci0JCQlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JCQlwcmludGsoIlJjdiBXY2lkKCVkKSBBZGRCQVJlcVxuIiwgRWxlbS0+V2NpZCk7Ci0JCQlpZiAoQkFSZWNTZXNzaW9uQWRkKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0sIHBBZGRyZXFGcmFtZSkpCisJCWlmICgocEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9PSBGQUxTRSkKKwkJICAgICYmIElTX0hUX1NUQShwTWFjRW50cnkpKSB7CisJCQlwQWRkcmVxRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSAqKSAoJkVsZW0tPk1zZ1swXSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiUmN2IFdjaWQoJWQpIEFkZEJBUmVxXG4iLCBFbGVtLT5XY2lkKSk7CisJCQlpZiAoQkFSZWNTZXNzaW9uQWRkCisJCQkgICAgKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0sCisJCQkgICAgIHBBZGRyZXFGcmFtZSkpCiAJCQkJU3RhdHVzID0gMDsKIAkJCWVsc2UKLQkJCQlTdGF0dXMgPSAzODsgLy8gbW9yZSBwYXJhbWV0ZXJzIGhhdmUgaW52YWxpZCB2YWx1ZXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCVN0YXR1cyA9IDM3OyAvLyB0aGUgcmVxdWVzdCBoYXMgYmVlbiBkZWNsaW5lZC4KKwkJCQlTdGF0dXMgPSAzODsJLyogbW9yZSBwYXJhbWV0ZXJzIGhhdmUgaW52YWxpZCB2YWx1ZXMgKi8KKwkJfSBlbHNlIHsKKwkJCVN0YXR1cyA9IDM3OwkvKiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBkZWNsaW5lZC4gKi8KIAkJfQogCX0KIAogCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNDTEkpCiAJCUFTU0VSVChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlNzdCA9PSBTU1RfQVNTT0MpOwogCi0JcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOwotCS8vIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIFBlZXJCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJcEFkZHJlcUZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yZXEgKikgKCZFbGVtLT5Nc2dbMF0pOworCS8qIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UgKi8KKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFDVElPTiAtIFBlZXJCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCXJldHVybjsKIAl9CiAKLQlOZGlzWmVyb01lbW9yeSgmQUREZnJhbWUsIHNpemVvZihGUkFNRV9BRERCQV9SU1ApKTsKKwlOZGlzWmVyb01lbW9yeSgmQUREZnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwKSk7CiAKLQkvLyAyLTEuIFByZXBhcmUgQUREQkEgUmVzcG9uc2UgZnJhbWUuCisJLyogMi0xLiBQcmVwYXJlIEFEREJBIFJlc3BvbnNlIGZyYW1lLiAqLwogCXsKIAkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwKKwkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJZWxzZQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWRkcik7CisJCQlBY3RIZWFkZXJJbml0KHBBZCwgJkFERGZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOwogCX0KIAogCUFERGZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfQkE7CiAJQUREZnJhbWUuQWN0aW9uID0gQUREQkFfUkVTUDsKIAlBRERmcmFtZS5Ub2tlbiA9IHBBZGRyZXFGcmFtZS0+VG9rZW47Ci0JLy8gV2hhdCBpcyB0aGUgU3RhdHVzIGNvZGU/PyAgbmVlZCB0byBjaGVjay4KKwkvKiBXaGF0IGlzIHRoZSBTdGF0dXMgY29kZT8/ICBuZWVkIHRvIGNoZWNrLiAqLwogCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBTdGF0dXM7CiAJQUREZnJhbWUuQmFQYXJtLkJBUG9saWN5ID0gSU1NRURfQkE7CiAJQUREZnJhbWUuQmFQYXJtLkFNU0RVU3VwcG9ydGVkID0gMDsKIAlBRERmcmFtZS5CYVBhcm0uVElEID0gcEFkZHJlcUZyYW1lLT5CYVBhcm0uVElEOwotCUFERGZyYW1lLkJhUGFybS5CdWZTaXplID0gbWluKCgoVUNIQVIpcEFkZHJlcUZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKLQlpZiAoQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPT0gMCkKLQl7CisJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPQorCSAgICBtaW4oKCh1OClwQWRkcmVxRnJhbWUtPkJhUGFybS5CdWZTaXplKSwKKwkJKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOworCWlmIChBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9PSAwKSB7CiAJCUFERGZyYW1lLkJhUGFybS5CdWZTaXplID0gNjQ7CiAJfQotCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IDA7IC8vcEFkZHJlcUZyYW1lLT5UaW1lT3V0VmFsdWU7CisJQUREZnJhbWUuVGltZU91dFZhbHVlID0gMDsJLypwQWRkcmVxRnJhbWUtPlRpbWVPdXRWYWx1ZTsgKi8KIAotCSooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkpOworCSoodTE2ICopICgmQUREZnJhbWUuQmFQYXJtKSA9CisJICAgIGNwdTJsZTE2KCoodTE2ICopICgmQUREZnJhbWUuQmFQYXJtKSk7CiAJQUREZnJhbWUuU3RhdHVzQ29kZSA9IGNwdTJsZTE2KEFERGZyYW1lLlN0YXR1c0NvZGUpOwogCUFERGZyYW1lLlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KEFERGZyYW1lLlRpbWVPdXRWYWx1ZSk7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfQUREQkFfUlNQKSwgICZBRERmcmFtZSwKLQkJCSAgRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9hZGRiYV9yc3ApLCAmQUREZnJhbWUsIEVORF9PRl9BUkdTKTsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyglZCk6IFRJRCglZCksIEJ1ZlNpemUoJWQpIDw9PSBcbiIsIF9fZnVuY19fLCBFbGVtLT5XY2lkLCBBRERmcmFtZS5CYVBhcm0uVElELAotCQkJCQkJCSAgQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXMoJWQpOiBUSUQoJWQpLCBCdWZTaXplKCVkKSA8PT0gXG4iLCBfX2Z1bmNfXywgRWxlbS0+V2NpZCwKKwkJICBBRERmcmFtZS5CYVBhcm0uVElELCBBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSkpOwogfQogCi0KLVZPSUQgUGVlckFkZEJBUnNwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQordm9pZCBQZWVyQWRkQkFSc3BBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCS8vVUNIQVIJCUlkeCwgaTsKLQkvL1BVQ0hBUgkJICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEZSQU1FX0FEREJBX1JTUCAgICBwRnJhbWUgPSBOVUxMOwotCS8vUEJBX09SSV9FTlRSWQkJcEJBRW50cnk7CisJLyp1OCAgICAgICAgIElkeCwgaTsgKi8KKwkvKnU4ICogICAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsgKi8KKwlzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwICogcEZyYW1lID0gTlVMTDsKKwkvKnN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQUVudHJ5OyAqLwogCi0JLy9BRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCisJLypBRERCQSBSZXNwb25zZSBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuICovCiAJaWYgKEVsZW0tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybjsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzID09PiBXY2lkKCVkKVxuIiwgX19mdW5jX18sIEVsZW0tPldjaWQpKTsKIAotCS8vaGV4X2R1bXAoIlBlZXJBZGRCQVJzcEFjdGlvbigpIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOworCS8qaGV4X2R1bXAoIlBlZXJBZGRCQVJzcEFjdGlvbigpIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOyAqLwogCi0JaWYgKFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKLQl7Ci0JCXBGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKSgmRWxlbS0+TXNnWzBdKTsKKwlpZiAoUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKSB7CisJCXBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwICopICgmRWxlbS0+TXNnWzBdKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdFx0IFN0YXR1c0NvZGUgPSAlZFxuIiwgcEZyYW1lLT5TdGF0dXNDb2RlKSk7Ci0JCXN3aXRjaCAocEZyYW1lLT5TdGF0dXNDb2RlKQotCQl7Ci0JCQljYXNlIDA6Ci0JCQkJLy8gSSB3YW50IGEgQkFzZXNzaW9uIHdpdGggdGhpcyBwZWVyIGFzIGFuIG9yaWdpbmF0b3IuCi0JCQkJQkFPcmlTZXNzaW9uQWRkKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0sIHBGcmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCS8vIGNoZWNrIHN0YXR1cyA9PSBVU0VEID8/PwotCQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcEZyYW1lLT5CYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7Ci0JCQkJYnJlYWs7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiXHRcdCBTdGF0dXNDb2RlID0gJWRcbiIsIHBGcmFtZS0+U3RhdHVzQ29kZSkpOworCQlzd2l0Y2ggKHBGcmFtZS0+U3RhdHVzQ29kZSkgeworCQljYXNlIDA6CisJCQkvKiBJIHdhbnQgYSBCQXNlc3Npb24gd2l0aCB0aGlzIHBlZXIgYXMgYW4gb3JpZ2luYXRvci4gKi8KKwkJCUJBT3JpU2Vzc2lvbkFkZChwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLAorCQkJCQlwRnJhbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBjaGVjayBzdGF0dXMgPT0gVVNFRCA/Pz8gKi8KKwkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwKKwkJCQkJICAgICBwRnJhbWUtPkJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwkJCWJyZWFrOwogCQl9Ci0JCS8vIFJjdiBEZWNsaW5lIFN0YXR1c0NvZGUKKwkJLyogUmN2IERlY2xpbmUgU3RhdHVzQ29kZSAqLwogCQlpZiAoKHBGcmFtZS0+U3RhdHVzQ29kZSA9PSAzNykKLSAgICAgICAgICAgIHx8ICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYgKHBGcmFtZS0+U3RhdHVzQ29kZSAhPSAwKSkKLSAgICAgICAgICAgICkKLQkJewotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5CQURlY2xpbmVCaXRtYXAgfD0gMTw8cEZyYW1lLT5CYVBhcm0uVElEOworCQkgICAgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBTVEFfVEdOX1dJRklfT04ocEFkKQorCQkJJiYgKHBGcmFtZS0+U3RhdHVzQ29kZSAhPSAwKSkKKwkJICAgICkgeworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5CQURlY2xpbmVCaXRtYXAgfD0KKwkJCSAgICAxIDw8IHBGcmFtZS0+QmFQYXJtLlRJRDsKIAkJfQogCX0KIH0KIAotVk9JRCBQZWVyRGVsQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCit2b2lkIFBlZXJEZWxCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JLy9VQ0hBUgkJCQlJZHg7Ci0JLy9QVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEZSQU1FX0RFTEJBX1JFUSAgICBwRGVsRnJhbWUgPSBOVUxMOworCS8qdTggICAgICAgICAgICAgICAgICAgICAgICAgSWR4OyAqLworCS8qdTggKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsgKi8KKwlzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxICogcERlbEZyYW1lID0gTlVMTDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX2Z1bmNfXykpOwotCS8vREVMQkEgUmVxdWVzdCBmcm9tIHVua25vd24gcGVlciwgaWdub3JlIHRoaXMuCi0JaWYgKFBlZXJEZWxCQUFjdGlvblNhbml0eShwQWQsIEVsZW0tPldjaWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuKSkKLQl7Ci0JCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKSgmRWxlbS0+TXNnWzBdKTsKLQkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gUGVlckRlbEJBQWN0aW9uLS0tLT4gT1JJR0lOQVRPUlxuIikpOwotCQkJQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IFJFQ0lQSUVOVCwgUmVhc29uID0gJWRcbiIsICBwRGVsRnJhbWUtPlJlYXNvbkNvZGUpKTsKLQkJCS8vaGV4X2R1bXAoIkRlbEJBIEZyYW1lIiwgcERlbEZyYW1lLCBFbGVtLT5Nc2dMZW4pOwotCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT5cbiIsIF9fZnVuY19fKSk7CisJLypERUxCQSBSZXF1ZXN0IGZyb20gdW5rbm93biBwZWVyLCBpZ25vcmUgdGhpcy4gKi8KKwlpZiAoUGVlckRlbEJBQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+V2NpZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKSB7CisJCXBEZWxGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfZGVsYmFfcmVxICopICgmRWxlbS0+TXNnWzBdKTsKKwkJaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLkluaXRpYXRvciA9PSBPUklHSU5BVE9SKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKKwkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwKKwkJCQkJICAgICBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUpOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLAorCQkJCSAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7CisJCQkvKmhleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsgKi8KKwkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwKKwkJCQkJICAgICBwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQsIFRSVUUsCisJCQkJCSAgICAgRkFMU0UpOwogCQl9CiAJfQogfQogCi0KLUJPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KAotCQkJCQkJICBJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JCQkJCQkgIElOIFVMT05HCQkJCVdjaWQsCi0JCQkJCQkgIElOIFVMT05HCQkJCU1zZ0xlbiwKLQkJCQkJCSAgSU4gUEZSQU1FX0JBX1JFUQkJcE1zZykKK0JPT0xFQU4gQ250bEVucXVldWVGb3JSZWN2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgV2NpZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCBzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxICogcE1zZykKIHsKLQlQRlJBTUVfQkFfUkVRICAgcEZyYW1lID0gcE1zZzsKLQkvL1BSVE1QX1JFT1JERVJCVUYJcEJ1ZmZlcjsKLQkvL1BSVE1QX1JFT1JERVJCVUYJcERtYUJ1ZjsKLQlQQkFfUkVDX0VOVFJZIHBCQUVudHJ5OwotCS8vQk9PTEVBTiAJUmVzdWx0OwotCVVMT05HICAgSWR4OwotCS8vVUNIQVIJTnVtUnhQa3Q7Ci0JVUNIQVIJVElEOy8vLCBpOworCXN0cnVjdCBydF9mcmFtZV9iYV9yZXEgKiBwRnJhbWUgPSBwTXNnOworCS8qUFJUTVBfUkVPUkRFUkJVRiAgICAgIHBCdWZmZXI7ICovCisJLypQUlRNUF9SRU9SREVSQlVGICAgICAgcERtYUJ1ZjsgKi8KKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwQkFFbnRyeTsKKwkvKkJPT0xFQU4gICAgICAgUmVzdWx0OyAqLworCXVuc2lnbmVkIGxvbmcgSWR4OworCS8qdTggTnVtUnhQa3Q7ICovCisJdTggVElEOwkJLyosIGk7ICovCiAKLQlUSUQgPSAoVUNIQVIpcEZyYW1lLT5CQVJDb250cm9sLlRJRDsKKwlUSUQgPSAodTgpcEZyYW1lLT5CQVJDb250cm9sLlRJRDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCk6IEJBUi1XY2lkKCVsZCksIFRpZCAoJWQpXG4iLCBfX2Z1bmNfXywgV2NpZCwgVElEKSk7Ci0JLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7Ci0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fZnVuY19fLCBXY2lkLCBUSUQpKTsKKwkvKmhleF9kdW1wKCJCQVIiLCAoY2hhciAqKXBGcmFtZSwgTXNnTGVuKTsgKi8KKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKIAkJcmV0dXJuIEZBTFNFOwogCi0JLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotCXsKKwkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKIAkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKIAkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCi0JeworCX0gZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxKSkgewogCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKIAkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCi0JeworCX0gZWxzZSBpZiAoTXNnTGVuICE9IHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxKSkgewogCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCi0JCXsKLQkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KKwlpZiAoKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgJiYgKFRJRCA8IDgpKSB7CisJCS8qIGlmIHRoaXMgcmVjZWl2aW5nIHBhY2tldCBpcyBmcm9tIFNBIHRoYXQgaXMgaW4gb3VyIE9yaUVudHJ5LiBTaW5jZSBXQ0lEIDw5IGhhcyBkaXJlY3QgbWFwcGluZy4gbm8gbmVlZCBzZWFyY2guICovCiAJCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKIAkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQkJfQotCQllbHNlCi0JCXsKKwl9IGVsc2UgewogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJCQVIoJWxkKSA6IFRpZCAoJWQpIC0gJTA0eDolMDR4XG4iLCBXY2lkLCBUSUQsCisJCSAgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwogCi0JaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCi0JewotCQkvL3ByaW50aygiQkFSIFNlcSA9ICV4LCBMYXN0SW5kU2VxID0gJXhcbiIsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOwotCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEpOwotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0gMCkgPyBNQVhTRVEgOihwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLTEpOworCWlmIChTRVFfU01BTExFUgorCSAgICAocEJBRW50cnktPkxhc3RJbmRTZXEsIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSwKKwkgICAgIE1BWFNFUSkpIHsKKwkJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVIgU2VxID0gJXgsIExhc3RJbmRTZXEgPSAleFxuIiwgcEZyYW1lLT5CQVN0YXJ0aW5nU2VxLmZpZWxkLlN0YXJ0U2VxLCBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOyAqLworCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LAorCQkJCQkJICAgIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC4KKwkJCQkJCSAgICBTdGFydFNlcSk7CisJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0KKwkJICAgIChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPT0KKwkJICAgICAwKSA/IE1BWFNFUSA6IChwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgLSAxKTsKIAl9Ci0JLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJLypiYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7ICovCiAJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCiBEZXNjcmlwdGlvbiA6IFNlbmQgUFNNUCBBY3Rpb24gZnJhbWUgSWYgUFNNUCBtb2RlIHN3aXRjaGVzLgogKi8KLVZPSUQgU2VuZFBTTVBBY3Rpb24oCi0JCQkJICAgSU4gUFJUTVBfQURBUFRFUgkJcEFkLAotCQkJCSAgIElOIFVDSEFSCQkJCVdjaWQsCi0JCQkJICAgSU4gVUNIQVIJCQkJUHNtcCkKK3ZvaWQgU2VuZFBTTVBBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkLCB1OCBQc21wKQogewotCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQkvL1VMT05HICAgICAgICAgICBJZHg7Ci0JRlJBTUVfUFNNUF9BQ1RJT04gICBGcmFtZTsKLQlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47Ci0JVUNIQVIJCQliYnBkYXRhPTA7Ci0JVUlOVDMyCQkJbWFjZGF0YTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgICBJZHg7ICovCisJc3RydWN0IHJ0X2ZyYW1lX3BzbXBfYWN0aW9uIEZyYW1lOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW47CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKIAkJcmV0dXJuOwogCX0KIAotCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKKwlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7CiAKIAlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOwogCUZyYW1lLkFjdGlvbiA9IFNNUFNfQUNUSU9OOwotCXN3aXRjaCAoUHNtcCkKLQl7Ci0JCWNhc2UgTU1QU19FTkFCTEU6Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JCQl7Ci0JCQkJLy8gZGlzYWJsZSBNTVBTIEJCUCBjb250cm9sIHJlZ2lzdGVyCi0JCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmYmJwZGF0YSk7Ci0JCQkJYmJwZGF0YSAmPSB+KDB4MDQpOwkvL2JpdCAyCi0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgYmJwZGF0YSk7Ci0KLQkJCQkvLyBkaXNhYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTIxMCwgJm1hY2RhdGEpOwotCQkJCW1hY2RhdGEgJj0gfigweDA5KTsJLy9iaXQgMCwgMwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTIxMCwgbWFjZGF0YSk7Ci0JCQl9Ci0JCQlGcmFtZS5Qc21wID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE1NUFNfRFlOQU1JQzoKLQkJCWlmIChJU19SVDMwOTAocEFkKSkKLQkJCXsKLQkJCQkvLyBlbmFibGUgTU1QUyBCQlAgY29udHJvbCByZWdpc3RlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJmJicGRhdGEpOwotCQkJCWJicGRhdGEgfD0gMHgwNDsJLy9iaXQgMgotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIGJicGRhdGEpOwotCi0JCQkJLy8gZW5hYmxlIE1NUFMgTUFDIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIDB4MTIxMCwgJm1hY2RhdGEpOwotCQkJCW1hY2RhdGEgfD0gMHgwOTsJLy9iaXQgMCwgMwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTIxMCwgbWFjZGF0YSk7Ci0JCQl9Ci0JCQlGcmFtZS5Qc21wID0gMzsKLQkJCWJyZWFrOwotCQljYXNlIE1NUFNfU1RBVElDOgotCQkJaWYgKElTX1JUMzA5MChwQWQpKQotCQkJewotCQkJCS8vIGVuYWJsZSBNTVBTIEJCUCBjb250cm9sIHJlZ2lzdGVyCi0JCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmYmJwZGF0YSk7Ci0JCQkJYmJwZGF0YSB8PSAweDA0OwkvL2JpdCAyCi0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgYmJwZGF0YSk7Ci0KLQkJCQkvLyBlbmFibGUgTU1QUyBNQUMgY29udHJvbCByZWdpc3RlcgotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMjEwLCAmbWFjZGF0YSk7Ci0JCQkJbWFjZGF0YSB8PSAweDA5OwkvL2JpdCAwLCAzCi0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxMjEwLCBtYWNkYXRhKTsKLQkJCX0KLQkJCUZyYW1lLlBzbXAgPSAxOwotCQkJYnJlYWs7CisJc3dpdGNoIChQc21wKSB7CisJY2FzZSBNTVBTX0VOQUJMRToKKyNpZmRlZiBSVDMweHgKKwkJaWYgKElTX1JUMzB4eChwQWQpCisJCSAgICAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEKKwkJCXx8IHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPiAxKSkgeworCQkJUlRNUF9BU0lDX01NUFNfRElTQUJMRShwQWQpOworCQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCUZyYW1lLlBzbXAgPSAwOworCQlicmVhazsKKwljYXNlIE1NUFNfRFlOQU1JQzoKKwkJRnJhbWUuUHNtcCA9IDM7CisJCWJyZWFrOworCWNhc2UgTU1QU19TVEFUSUM6CisjaWZkZWYgUlQzMHh4CisJCWlmIChJU19SVDMweHgocEFkKQorCQkgICAgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxCisJCQl8fCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID4gMSkpIHsKKwkJCVJUTVBfQVNJQ19NTVBTX0VOQUJMRShwQWQpOworCQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCUZyYW1lLlBzbXAgPSAxOworCQlicmVhazsKIAl9Ci0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX1BTTVBfQUNUSU9OKSwgICAgICAmRnJhbWUsCi0JCQkJCSAgRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9wc21wX2FjdGlvbiksICZGcmFtZSwgRU5EX09GX0FSR1MpOwogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkhUIC0gU2VuZFBTTVBBY3Rpb24oICVkICkgIFxuIiwgRnJhbWUuUHNtcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkhUIC0gU2VuZFBTTVBBY3Rpb24oICVkICkgIFxuIiwgRnJhbWUuUHNtcCkpOwogfQogCi0KICNkZWZpbmUgUkFESU9fTUVBU1VSRU1FTlRfUkVRVUVTVF9BQ1RJT04JMAogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQKK3N0cnVjdCBQQUNLRUQgcnRfYmVhY29uX3JlcXVlc3QgeworCXU4IFJlZ3VsYXRvcnlDbGFzczsKKwl1OCBDaGFubmVsTnVtYmVyOworCXUxNiBSYW5kb21JbnRlcnZhbDsKKwl1MTYgTWVhc3VyZW1lbnREdXJhdGlvbjsKKwl1OCBNZWFzdXJlbWVudE1vZGU7CisJdTggQlNTSURbTUFDX0FERFJfTEVOXTsKKwl1OCBSZXBvcnRpbmdDb25kaXRpb247CisJdTggVGhyZXNob2xkOworCXU4IFNTSURJRVsyXTsJLyogMiBieXRlICovCit9OworCitzdHJ1Y3QgUEFDS0VEIHJ0X21lYXN1cmVtZW50X3JlcSB7CisJdTggSUQ7CisJdTggTGVuZ3RoOworCXU4IFRva2VuOworCXU4IFJlcXVlc3RNb2RlOworCXU4IFR5cGU7Cit9OworCit2b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssCisJCQkJCQkJICAgdTgKKwkJCQkJCQkgICBGcm9tV2hpY2hCU1NJRCkKIHsKLQlVQ0hBUglSZWd1bGF0b3J5Q2xhc3M7Ci0JVUNIQVIJQ2hhbm5lbE51bWJlcjsKLQlVU0hPUlQJUmFuZG9tSW50ZXJ2YWw7Ci0JVVNIT1JUCU1lYXN1cmVtZW50RHVyYXRpb247Ci0JVUNIQVIJTWVhc3VyZW1lbnRNb2RlOwotCVVDSEFSICAgQlNTSURbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUglSZXBvcnRpbmdDb25kaXRpb247Ci0JVUNIQVIJVGhyZXNob2xkOwotCVVDSEFSICAgU1NJRElFWzJdOwkJCS8vIDIgYnl0ZQotfSBCRUFDT05fUkVRVUVTVDsKKwl2b2lkICpwUnhQa3Q7CisJdTggSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VECi17Ci0JVUNIQVIJSUQ7Ci0JVUNIQVIJTGVuZ3RoOwotCVVDSEFSCVRva2VuOwotCVVDSEFSCVJlcXVlc3RNb2RlOwotCVVDSEFSCVR5cGU7Ci19IE1FQVNVUkVNRU5UX1JFUTsKLQotCi0KLQotdm9pZCBjb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVBORElTX1BBQ0tFVAlwUnhQa3Q7Ci0JVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOwotCi0JLy8gMS4gZ2V0IDgwMi4zIEhlYWRlcgotCS8vIDIuIHJlbW92ZSBMTEMKLQkvLyAJCWEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkCi0JLy8gICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZQorCS8qIDEuIGdldCA4MDIuMyBIZWFkZXIgKi8KKwkvKiAyLiByZW1vdmUgTExDICovCisJLyogICAgICAgICAgICAgIGEuIHBvaW50ZXIgcFJ4QmxrLT5wRGF0YSB0byBwYXlsb2FkICovCisJLyogICAgICBiLiBtb2RpZnkgcFJ4QmxrLT5EYXRhU2l6ZSAqLwogCiAJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKIAogCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7CiAJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwogCi0JUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRhdGEgPSBwUnhCbGstPnBEYXRhOwotCVJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmxlbiA9IHBSeEJsay0+RGF0YVNpemU7Ci0JUlRQS1RfVE9fT1NQS1QocFJ4UGt0KS0+dGFpbCA9IFJUUEtUX1RPX09TUEtUKHBSeFBrdCktPmRhdGEgKyBSVFBLVF9UT19PU1BLVChwUnhQa3QpLT5sZW47CisJU0VUX09TX1BLVF9ORVRERVYocFJ4UGt0LCBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCkpOworCVNFVF9PU19QS1RfREFUQVBUUihwUnhQa3QsIHBSeEJsay0+cERhdGEpOworCVNFVF9PU19QS1RfTEVOKHBSeFBrdCwgcFJ4QmxrLT5EYXRhU2l6ZSk7CisJU0VUX09TX1BLVF9EQVRBVEFJTChwUnhQa3QsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOwogCi0JLy8KLQkvLyBjb3B5IDgwMi4zIGhlYWRlciwgaWYgbmVjZXNzYXJ5Ci0JLy8KLQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpKQotCXsKKwkvKiAqLworCS8qIGNvcHkgODAyLjMgaGVhZGVyLCBpZiBuZWNlc3NhcnkgKi8KKwkvKiAqLworCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpIHsKKwkJewogI2lmZGVmIExJTlVYCi0JCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBSeFBrdCwgTEVOR1RIXzgwMl8zKSwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisJCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksCisJCQkJICAgICAgIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOwogI2VuZGlmCisJCX0KIAl9CiB9CiAKLQogI2RlZmluZSBJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKQkJXAogCWRvCQkJCQkJCQkJCQkJCQkJCQlcCiAJewkJCQkJCQkJCQkJCQkJCQkJXApAQCAtMTUzOCw2MSArMTQzNiw2MCBAQAogICAgIAl9CQkJCQkJCQkJCQkJCQkJCVwKIAl9IHdoaWxlICgwKTsKIAotCi0KLXN0YXRpYyBWT0lEIGJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCitzdGF0aWMgdm9pZCBiYV9lbnF1ZXVlX3Jlb3JkZXJpbmdfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5LAorCQkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCQkgdTggRnJvbVdoaWNoQlNTSUQpCiB7CiAJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGs7Ci0JVUlOVDE2CVNlcXVlbmNlID0gKFVJTlQxNikgcFJ4QmxrLT5wSGVhZGVyLT5TZXF1ZW5jZTsKKwl1MTYgU2VxdWVuY2UgPSAodTE2KXBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7CiAKIAltcGR1X2JsayA9IGJhX21wZHVfYmxrX2FsbG9jKHBBZCk7Ci0JaWYgKG1wZHVfYmxrICE9IE5VTEwpCi0JewotCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAorCWlmICgobXBkdV9ibGsgIT0gTlVMTCkgJiYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0VBUCkpKSB7CisJCS8qIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoICovCiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwogCiAJCW1wZHVfYmxrLT5TZXF1ZW5jZSA9IFNlcXVlbmNlOwogCiAJCW1wZHVfYmxrLT5iQU1TRFUgPSBSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKIAotCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQljb252ZXJ0X3Jlb3JkZXJpbmdfcGFja2V0X3RvX3ByZUFNU0RVX29yXzgwMl8zX3BhY2tldChwQWQsCisJCQkJCQkJCSAgICAgIHBSeEJsaywKKwkJCQkJCQkJICAgICAgRnJvbVdoaWNoQlNTSUQpOwogCiAJCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwogCi0gICAgICAgIC8vCi0JCS8vIGl0IGlzIG5lY2Vzc2FyeSBmb3IgcmVvcmRlcmluZyBwYWNrZXQgdG8gcmVjb3JkCi0JCS8vIHdoaWNoIEJTUyBpdCBjb21lIGZyb20KLQkJLy8KKwkJLyogKi8KKwkJLyogaXQgaXMgbmVjZXNzYXJ5IGZvciByZW9yZGVyaW5nIHBhY2tldCB0byByZWNvcmQgKi8KKwkJLyogd2hpY2ggQlNTIGl0IGNvbWUgZnJvbSAqLworCQkvKiAqLwogCQlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKIAogCQltcGR1X2Jsay0+cFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwogCi0JCWlmIChiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKCZwQkFFbnRyeS0+bGlzdCwgbXBkdV9ibGspID09IEZBTFNFKQotCQl7Ci0JCQkvLyBoYWQgYmVlbiBhbHJlYWR5IHdpdGhpbiByZW9yZGVyaW5nIGxpc3QKLQkJCS8vIGRvbid0IGluZGljYXRlCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQlpZiAoYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZCgmcEJBRW50cnktPmxpc3QsIG1wZHVfYmxrKQorCQkgICAgPT0gRkFMU0UpIHsKKwkJCS8qIGhhZCBiZWVuIGFscmVhZHkgd2l0aGluIHJlb3JkZXJpbmcgbGlzdCAqLworCQkJLyogZG9uJ3QgaW5kaWNhdGUgKi8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKIAkJfQogCi0JCUFTU0VSVCgoMDw9IHBCQUVudHJ5LT5saXN0LnFsZW4pICAmJiAocEJBRW50cnktPmxpc3QucWxlbiA8PSBwQkFFbnRyeS0+QkFXaW5TaXplKSk7CisJCUFTU0VSVCgoMCA8PSBwQkFFbnRyeS0+bGlzdC5xbGVuKQorCQkgICAgICAgJiYgKHBCQUVudHJ5LT5saXN0LnFsZW4gPD0gcEJBRW50cnktPkJBV2luU2l6ZSkpOwogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICAoIiEhISAoJWQpIENhbid0IGFsbG9jYXRlIHJlb3JkZXJpbmcgbXBkdSBibGtcbiIsCi0JCQkJCQkJCSAgIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiAoJWQpIENhbid0IGFsbG9jYXRlIHJlb3JkZXJpbmcgbXBkdSBibGtcbiIsCisJCQkgIHBCQUVudHJ5LT5saXN0LnFsZW4pKTsKIAogCQkvKgogCQkgKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCiAJCSAqIGFuZCByZWNldmluZyBtcGR1IHRvIHVwcGVyIGxheWVyCiAJCSAqIG1ha2UgdGNwL2lwIHRvIHRha2UgY2FyZSByZW9yZGVyaW5nIG1lY2hhbmlzbQogCQkgKi8KLQkJLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7CisJCS8qYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOyAqLwogCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBTZXF1ZW5jZSk7CiAKIAkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKQEAgLTE2MDAsNyArMTQ5Nyw2IEBACiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTE2MTksMTM5ICsxNTE1LDEzNCBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIAotVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlVU0hPUlQJCQkJSWR4OwotCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKLQlVSU5UMTYJCQkJU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOwotCVVMT05HCQkJCU5vdzMyOwotCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOwotCVVDSEFSCQkJCVRJRCA9IHBSeEJsay0+cFJ4V0ktPlRJRDsKKwl1MTYgSWR4OworCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwl1MTYgU2VxdWVuY2UgPSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOworCXVuc2lnbmVkIGxvbmcgTm93MzI7CisJdTggV2NpZCA9IHBSeEJsay0+cFJ4V0ktPldpcmVsZXNzQ2xpSUQ7CisJdTggVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOwogCi0KLQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpICYmICAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSkKLQl7Ci0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKQorCSAgICAmJiAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSkgeworCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7CisJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgewogCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07Ci0JCWlmIChJZHggPT0gMCkKLQkJeworCQlpZiAoSWR4ID09IDApIHsKIAkJCS8qIFJlYyBCQSBTZXNzaW9uIGhhZCBiZWVuIHRvcm4gZG93biAqLwogCQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJCQlyZXR1cm47CiAJCX0KIAkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gaW1wb3NzaWJsZSAhISEKKwl9IGVsc2UgeworCQkvKiBpbXBvc3NpYmxlICEgKi8KIAkJQVNTRVJUKDApOwotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm47CiAJfQogCiAJQVNTRVJUKHBCQUVudHJ5KTsKIAotCS8vIHVwZGF0ZSBsYXN0IHJ4IHRpbWUKKwkvKiB1cGRhdGUgbGFzdCByeCB0aW1lICovCiAJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOwogCiAJcEJBRW50cnktPnJjdlNlcSA9IFNlcXVlbmNlOwogCi0KIAliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOwogCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwogCi0JLy8KLQkvLyBSZXNldCBMYXN0IEluZGljYXRlIFNlcXVlbmNlCi0JLy8KLQlpZiAocEJBRW50cnktPkxhc3RJbmRTZXEgPT0gUkVTRVRfUkNWX1NFUSkKLQl7Ci0JCUFTU0VSVCgocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCA9PSBOVUxMKSk7CisJLyogKi8KKwkvKiBSZXNldCBMYXN0IEluZGljYXRlIFNlcXVlbmNlICovCisJLyogKi8KKwlpZiAocEJBRW50cnktPkxhc3RJbmRTZXEgPT0gUkVTRVRfUkNWX1NFUSkgeworCQlBU1NFUlQoKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCkKKwkJICAgICAgICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ID09IE5VTEwpKTsKIAotCQkvLyByZXNldCByY3Ygc2VxdWVuY2Ugb2YgQkEgc2Vzc2lvbgorCQkvKiByZXNldCByY3Ygc2VxdWVuY2Ugb2YgQkEgc2Vzc2lvbiAqLwogCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwogCQlwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIgPSBOb3czMjsKIAkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJCXJldHVybjsKIAl9CiAKLQotCS8vCi0JLy8gSS4gQ2hlY2sgaWYgaW4gb3JkZXIuCi0JLy8KLQlpZiAoU0VRX1NURVBPTkUoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKQotCXsKLQkJVVNIT1JUICBMYXN0SW5kU2VxOworCS8qICovCisJLyogSS4gQ2hlY2sgaWYgaW4gb3JkZXIuICovCisJLyogKi8KKwlpZiAoU0VRX1NURVBPTkUoU2VxdWVuY2UsIHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBNQVhTRVEpKSB7CisJCXUxNiBMYXN0SW5kU2VxOwogCiAJCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gU2VxdWVuY2U7CiAJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotIAkJTGFzdEluZFNlcSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOwotCQlpZiAoTGFzdEluZFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKQotCQl7CisJCUxhc3RJbmRTZXEgPQorCQkgICAgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LAorCQkJCQkJCSAgcEJBRW50cnktPkxhc3RJbmRTZXEpOworCQlpZiAoTGFzdEluZFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKSB7CiAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IExhc3RJbmRTZXE7CiAJCX0KIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CiAJfQotCS8vCi0JLy8gSUkuIERyb3AgRHVwbGljYXRlZCBQYWNrZXQKLQkvLwotCWVsc2UgaWYgKFNlcXVlbmNlID09IHBCQUVudHJ5LT5MYXN0SW5kU2VxKQotCXsKKwkvKiAqLworCS8qIElJLiBEcm9wIER1cGxpY2F0ZWQgUGFja2V0ICovCisJLyogKi8KKwllbHNlIGlmIChTZXF1ZW5jZSA9PSBwQkFFbnRyeS0+TGFzdEluZFNlcSkgewogCi0JCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCS8qIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0ICovCiAJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCX0KLQkvLwotCS8vIElJSS4gRHJvcCBPbGQgUmVjZWl2ZWQgUGFja2V0Ci0JLy8KLQllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCi0JeworCS8qICovCisJLyogSUlJLiBEcm9wIE9sZCBSZWNlaXZlZCBQYWNrZXQgKi8KKwkvKiAqLworCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkgewogCi0JCS8vIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0CisJCS8qIGRyb3AgYW5kIHJlbGVhc2UgcGFja2V0ICovCiAJCXBCQUVudHJ5LT5uRHJvcFBhY2tldCsrOwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCX0KLQkvLwotCS8vIElWLiBSZWNlaXZlIFNlcXVlbmNlIHdpdGhpbiBXaW5kb3cgU2l6ZQotCS8vCi0JZWxzZSBpZiAoU0VRX1NNQUxMRVIoU2VxdWVuY2UsICgoKHBCQUVudHJ5LT5MYXN0SW5kU2VxK3BCQUVudHJ5LT5CQVdpblNpemUrMSkpICYgTUFYU0VRKSwgTUFYU0VRKSkKLQl7Ci0JCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJLyogKi8KKwkvKiBJVi4gUmVjZWl2ZSBTZXF1ZW5jZSB3aXRoaW4gV2luZG93IFNpemUgKi8KKwkvKiAqLworCWVsc2UgaWYgKFNFUV9TTUFMTEVSCisJCSAoU2VxdWVuY2UsCisJCSAgKCgocEJBRW50cnktPkxhc3RJbmRTZXEgKyBwQkFFbnRyeS0+QkFXaW5TaXplICsgMSkpICYgTUFYU0VRKSwKKwkJICBNQVhTRVEpKSB7CisJCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLAorCQkJCQkgICAgIEZyb21XaGljaEJTU0lEKTsKIAl9Ci0JLy8KLQkvLyBWLiBSZWNlaXZlIHNlcSBzdXJwYXNzZXMgV2luKGxhc3RzZXEgKyBuTVNEVSkuIFNvIHJlZnJlc2ggYWxsIHJlb3JkZXIgYnVmZmVyCi0JLy8KLQllbHNlCi0JewotCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7CisJLyogKi8KKwkvKiBWLiBSZWNlaXZlIHNlcSBzdXJwYXNzZXMgV2luKGxhc3RzZXEgKyBuTVNEVSkuIFNvIHJlZnJlc2ggYWxsIHJlb3JkZXIgYnVmZmVyICovCisJLyogKi8KKwllbHNlIHsKKwkJbG9uZyBXaW5TdGFydFNlcSwgVG1wU2VxOwogCi0KLQkJVG1wU2VxID0gU2VxdWVuY2UgLSAocEJBRW50cnktPkJBV2luU2l6ZSkgLTE7Ci0JCWlmIChUbXBTZXEgPCAwKQotCQl7Ci0JCQlUbXBTZXEgPSAoTUFYU0VRKzEpICsgVG1wU2VxOworCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtIDE7CisJCWlmIChUbXBTZXEgPCAwKSB7CisJCQlUbXBTZXEgPSAoTUFYU0VRICsgMSkgKyBUbXBTZXE7CiAJCX0KLQkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROworCQlXaW5TdGFydFNlcSA9IChUbXBTZXEgKyAxKSAmIE1BWFNFUTsKIAkJYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEocEFkLCBwQkFFbnRyeSwgV2luU3RhcnRTZXEpOwotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFdpblN0YXJ0U2VxOyAvL1RtcFNlcTsKKwkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBXaW5TdGFydFNlcTsJLypUbXBTZXE7ICovCiAKIAkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7CiAKLQkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKKwkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssCisJCQkJCSAgICAgRnJvbVdoaWNoQlNTSUQpOwogCi0JCVRtcFNlcSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgcEJBRW50cnktPkxhc3RJbmRTZXEpOwotCQlpZiAoVG1wU2VxICE9IFJFU0VUX1JDVl9TRVEpCi0JCXsKKwkJVG1wU2VxID0KKwkJICAgIGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwKKwkJCQkJCQkgIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKKwkJaWYgKFRtcFNlcSAhPSBSRVNFVF9SQ1ZfU0VRKSB7CiAJCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFRtcFNlcTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTAzNTdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2Flcy5jCkBAIC0wLDAgKzEsMTMxMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljbW1fYWVzLmMKKworCUFic3RyYWN0OgorCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8JCQlXaGVuCQkJV2hhdAorCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQYXVsIFd1CQkwMi0yNS0wMgkJSW5pdGlhbAorKi8KKworI2luY2x1ZGUJIi4uL3J0X2NvbmZpZy5oIgorCitzdHJ1Y3QgYWVzX2NvbnRleHQgeworCXUzMiBlcmtbNjRdOwkJLyogZW5jcnlwdGlvbiByb3VuZCBrZXlzICovCisJdTMyIGRya1s2NF07CQkvKiBkZWNyeXB0aW9uIHJvdW5kIGtleXMgKi8KKwlpbnQgbnI7CQkJLyogbnVtYmVyIG9mIHJvdW5kcyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqIFNCT1ggVGFibGUgKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1OCBTYm94VGFibGVbMjU2XSA9IHsKKwkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAorCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCisJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKwkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAorCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCisJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKKwkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAorCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCisJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKKwkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAorCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCisJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKwkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAorCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCisJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKKwkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAorCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCisJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKKwkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAorCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCisJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKwkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAorCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCisJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKKwkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAorCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCisJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKKwkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAorCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCisJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKwkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAorCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK307CisKK3ZvaWQgeG9yXzMyKHU4ICphLCB1OCAqYiwgdTggKm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCit2b2lkIHhvcl8xMjgodTggKmEsIHU4ICpiLCB1OCAqb3V0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJb3V0W2ldID0gYVtpXSBeIGJbaV07CisJfQorfQorCit1OCBSVE1QQ2tpcFNib3godTggYSkKK3sKKwlyZXR1cm4gU2JveFRhYmxlWyhpbnQpYV07Cit9CisKK3ZvaWQgbmV4dF9rZXkodTggKmtleSwgaW50IHJvdW5kKQoreworCXU4IHJjb247CisJdTggc2JveF9rZXlbNF07CisJdTggcmNvbl90YWJsZVsxMl0gPSB7CisJCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCisJCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKKwl9OworCisJc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7CisJc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7CisJc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7CisJc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7CisKKwlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07CisKKwl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOworCWtleVswXSA9IGtleVswXSBeIHJjb247CisKKwl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7CisJeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOworCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOworfQorCit2b2lkIGJ5dGVfc3ViKHU4ICppbiwgdTggKm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCW91dFtpXSA9IFJUTVBDa2lwU2JveChpbltpXSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOworCX0KK30KKwordm9pZCBzaGlmdF9yb3codTggKmluLCB1OCAqb3V0KQoreworCW91dFswXSA9IGluWzBdOworCW91dFsxXSA9IGluWzVdOworCW91dFsyXSA9IGluWzEwXTsKKwlvdXRbM10gPSBpblsxNV07CisJb3V0WzRdID0gaW5bNF07CisJb3V0WzVdID0gaW5bOV07CisJb3V0WzZdID0gaW5bMTRdOworCW91dFs3XSA9IGluWzNdOworCW91dFs4XSA9IGluWzhdOworCW91dFs5XSA9IGluWzEzXTsKKwlvdXRbMTBdID0gaW5bMl07CisJb3V0WzExXSA9IGluWzddOworCW91dFsxMl0gPSBpblsxMl07CisJb3V0WzEzXSA9IGluWzFdOworCW91dFsxNF0gPSBpbls2XTsKKwlvdXRbMTVdID0gaW5bMTFdOworfQorCit2b2lkIG1peF9jb2x1bW4odTggKmluLCB1OCAqb3V0KQoreworCWludCBpOworCXU4IGFkZDFiWzRdOworCXU4IGFkZDFiZjdbNF07CisJdTggcm90bFs0XTsKKwl1OCBzd2FwX2hhbGZzWzRdOworCXU4IGFuZGY3WzRdOworCXU4IHJvdHJbNF07CisJdTggdGVtcFs0XTsKKwl1OCB0ZW1wYls0XTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKChpbltpXSAmIDB4ODApID09IDB4ODApCisJCQlhZGQxYltpXSA9IDB4MWI7CisJCWVsc2UKKwkJCWFkZDFiW2ldID0gMHgwMDsKKwl9CisKKwlzd2FwX2hhbGZzWzBdID0gaW5bMl07CS8qIFN3YXAgaGFsZnMgKi8KKwlzd2FwX2hhbGZzWzFdID0gaW5bM107CisJc3dhcF9oYWxmc1syXSA9IGluWzBdOworCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKKworCXJvdGxbMF0gPSBpblszXTsJLyogUm90YXRlIGxlZnQgOCBiaXRzICovCisJcm90bFsxXSA9IGluWzBdOworCXJvdGxbMl0gPSBpblsxXTsKKwlyb3RsWzNdID0gaW5bMl07CisKKwlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKKwlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKKwlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKKwlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKKworCWZvciAoaSA9IDM7IGkgPiAwOyBpLS0pIHsJLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCisJCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKKwkJaWYgKChhbmRmN1tpIC0gMV0gJiAweDgwKSA9PSAweDgwKSB7CisJCQlhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOworCQl9CisJfQorCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKKwlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKKworCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOworCisJeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKKworCXRlbXBbMF0gPSByb3RyWzBdOwkvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCisJcm90clswXSA9IHJvdHJbMV07CisJcm90clsxXSA9IHJvdHJbMl07CisJcm90clsyXSA9IHJvdHJbM107CisJcm90clszXSA9IHRlbXBbMF07CisKKwl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7CisJeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsIHRlbXBiKTsKKwl4b3JfMzIodGVtcCwgdGVtcGIsIG91dCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KKy8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSh1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMSwKKwkJCSAgIGludCBoZWFkZXJfbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICptcGR1KQoreworCW1pY19oZWFkZXIxWzBdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOworCW1pY19oZWFkZXIxWzFdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOworCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7CS8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCisJbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsJLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KKwltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07CS8qIEExICovCisJbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOworCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKKwltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107CisJbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOworCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKKwltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsJLyogQTIgKi8KKwltaWNfaGVhZGVyMVsxMV0gPSBtcGR1WzExXTsKKwltaWNfaGVhZGVyMVsxMl0gPSBtcGR1WzEyXTsKKwltaWNfaGVhZGVyMVsxM10gPSBtcGR1WzEzXTsKKwltaWNfaGVhZGVyMVsxNF0gPSBtcGR1WzE0XTsKKwltaWNfaGVhZGVyMVsxNV0gPSBtcGR1WzE1XTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbnN0cnVjdF9taWNfaGVhZGVyMigpICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWlsZHMgdGhlIGxhc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICAqLworLyogaGVhZGVyIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgY29uc3RydWN0X21pY19oZWFkZXIyKHVuc2lnbmVkIGNoYXIgKm1pY19oZWFkZXIyLAorCQkJICAgdW5zaWduZWQgY2hhciAqbXBkdSwgaW50IGE0X2V4aXN0cywgaW50IHFjX2V4aXN0cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQltaWNfaGVhZGVyMltpXSA9IDB4MDA7CisKKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOwkvKiBBMyAqLworCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CisJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKKwltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOworCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07CisJbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKKworCS8qIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KSAqLworCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOwkvKiBTQyAqLworCW1pY19oZWFkZXIyWzddID0gMHgwMDsJLyogbXBkdVsyM107ICovCisKKwlpZiAoKCFxY19leGlzdHMpICYgYTRfZXhpc3RzKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQltaWNfaGVhZGVyMls4ICsgaV0gPSBtcGR1WzI0ICsgaV07CS8qIEE0ICovCisKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmICghYTRfZXhpc3RzKSkgeworCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsJLyogbXV0ZSBiaXRzIDE1IC0gNCAqLworCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKKwl9CisKKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJbWljX2hlYWRlcjJbOCArIGldID0gbXBkdVsyNCArIGldOwkvKiBBNCAqLworCisJCW1pY19oZWFkZXIyWzE0XSA9IG1wZHVbMzBdICYgMHgwZjsKKwkJbWljX2hlYWRlcjJbMTVdID0gbXBkdVszMV0gJiAweDAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBjb25zdHJ1Y3RfbWljX2l2KHVuc2lnbmVkIGNoYXIgKm1pY19pdiwKKwkJICAgICAgaW50IHFjX2V4aXN0cywKKwkJICAgICAgaW50IGE0X2V4aXN0cywKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbXBkdSwKKwkJICAgICAgdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IpCit7CisJaW50IGk7CisKKwltaWNfaXZbMF0gPSAweDU5OworCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQorCQltaWNfaXZbMV0gPSBtcGR1WzMwXSAmIDB4MGY7CS8qIFFvU19UQyAgICAgICAgICAgKi8KKwlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpCisJCW1pY19pdlsxXSA9IG1wZHVbMjRdICYgMHgwZjsJLyogbXV0ZSBiaXRzIDctNCAgICAqLworCWlmICghcWNfZXhpc3RzKQorCQltaWNfaXZbMV0gPSAweDAwOworCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCisJCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOwkvKiBtaWNfaXZbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLworI2lmZGVmIENPTlNJU1RFTlRfUE5fT1JERVIKKwlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJbWljX2l2W2ldID0gcG5fdmVjdG9yW2kgLSA4XTsJLyogbWljX2l2Wzg6MTNdID0gUE5bMDo1XSAqLworI2Vsc2UKKwlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07CS8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KKyNlbmRpZgorCWkgPSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOworCWkgPSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikocGF5bG9hZF9sZW5ndGggLyAyNTYpOworCW1pY19pdlsxNV0gPSAodW5zaWduZWQgY2hhcikocGF5bG9hZF9sZW5ndGggJSAyNTYpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KKy8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGFlczEyOGsxMjhkKHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQpCit7CisJaW50IHJvdW5kOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgaW50ZXJtZWRpYXRlYVsxNl07CisJdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGViWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHJvdW5kX2tleVsxNl07CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcm91bmRfa2V5W2ldID0ga2V5W2ldOworCisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspIHsKKwkJaWYgKHJvdW5kID09IDApIHsKKwkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9IGVsc2UgaWYgKHJvdW5kID09IDEwKSB7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJfSBlbHNlIHsJLyogMSAtIDkgKi8KKworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7CisJCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKKwkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKKwkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQl9CisJfQorCit9CisKK3ZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKHVuc2lnbmVkIGNoYXIgKmN0cl9wcmVsb2FkLAorCQkJICAgaW50IGE0X2V4aXN0cywKKwkJCSAgIGludCBxY19leGlzdHMsCisJCQkgICB1bnNpZ25lZCBjaGFyICptcGR1LCB1bnNpZ25lZCBjaGFyICpwbl92ZWN0b3IsIGludCBjKQoreworCisJaW50IGkgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IDB4MDA7CisJaSA9IDA7CisKKwljdHJfcHJlbG9hZFswXSA9IDB4MDE7CS8qIGZsYWcgKi8KKwlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKKwkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7CS8qIFFvQ19Db250cm9sICAqLworCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKKwkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOwkvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCisjaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgorCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IHBuX3ZlY3RvcltpIC0gOF07CS8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bMDo1XSAqLworI2Vsc2UKKwlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKKwkJY3RyX3ByZWxvYWRbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsJLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCisjZW5kaWYKKwljdHJfcHJlbG9hZFsxNF0gPSAodW5zaWduZWQgY2hhcikoYyAvIDI1Nik7CS8qIEN0ciAqLworCWN0cl9wcmVsb2FkWzE1XSA9ICh1bnNpZ25lZCBjaGFyKShjICUgMjU2KTsKKworfQorCitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ250LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSkKK3sKKwl1OCBLZXlJRDsKKwl1MzIgSGVhZGVyTGVuOworCXU4IFBOWzZdOworCXUzMiBwYXlsb2FkX2xlbjsKKwl1MzIgbnVtX2Jsb2NrczsKKwl1MzIgcGF5bG9hZF9yZW1haW5kZXI7CisJdTE2IGZjOworCXU4IGZjMDsKKwl1OCBmYzE7CisJdTMyIGZyYW1lX3R5cGU7CisJdTMyIGZyYW1lX3N1YnR5cGU7CisJdTMyIGZyb21fZHM7CisJdTMyIHRvX2RzOworCWludCBhNF9leGlzdHM7CisJaW50IHFjX2V4aXN0czsKKwl1OCBhZXNfb3V0WzE2XTsKKwlpbnQgcGF5bG9hZF9pbmRleDsKKwl1MzIgaTsKKwl1OCBjdHJfcHJlbG9hZFsxNl07CisJdTggY2hhaW5fYnVmZmVyWzE2XTsKKwl1OCBwYWRkZWRfYnVmZmVyWzE2XTsKKwl1OCBtaWNfaXZbMTZdOworCXU4IG1pY19oZWFkZXIxWzE2XTsKKwl1OCBtaWNfaGVhZGVyMlsxNl07CisJdTggTUlDWzhdOworCXU4IFRyYWlsTUlDWzhdOworCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigodTE2ICopcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKwlmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKwl0b19kcyA9IChmYzEgJiAweDEpOworCisJYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisJcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8CS8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisJCSAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwJLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fCAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCSAgICApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKHU4ICopKHBEYXRhICsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUTVBTb2Z0RGVjcnlwdEFFUyBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwKKwkJCSAgS2V5SUQpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCVBOWzBdID0gKihwRGF0YSArIEhlYWRlckxlbik7CisJUE5bMV0gPSAqKHBEYXRhICsgSGVhZGVyTGVuICsgMSk7CisJUE5bMl0gPSAqKHBEYXRhICsgSGVhZGVyTGVuICsgNCk7CisJUE5bM10gPSAqKHBEYXRhICsgSGVhZGVyTGVuICsgNSk7CisJUE5bNF0gPSAqKHBEYXRhICsgSGVhZGVyTGVuICsgNik7CisJUE5bNV0gPSAqKHBEYXRhICsgSGVhZGVyTGVuICsgNyk7CisKKwlwYXlsb2FkX2xlbiA9IERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDg7CS8qIDggYnl0ZXMgZm9yIENDTVAgaGVhZGVyICwgOCBieXRlcyBmb3IgTUlDICovCisJcGF5bG9hZF9yZW1haW5kZXIgPSAocGF5bG9hZF9sZW4pICUgMTY7CisJbnVtX2Jsb2NrcyA9IChwYXlsb2FkX2xlbikgLyAxNjsKKworCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLworCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW4gKyA4OwkvKklWK0VJViAqLworCisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJICAgICAgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBEYXRhLCBQTiwgaSArIDEpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKKwkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCAxNik7CisJCXBheWxvYWRfaW5kZXggKz0gMTY7CisJfQorCisJLyogKi8KKwkvKiBJZiB0aGVyZSBpcyBhIHNob3J0IGZpbmFsIGJsb2NrLCB0aGVuIHBhZCBpdCAqLworCS8qIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjayAqLworCS8qICovCisJaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkgeworCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCisJCQkJICAgICAgYTRfZXhpc3RzLAorCQkJCSAgICAgIHFjX2V4aXN0cywgcERhdGEsIFBOLCBudW1fYmxvY2tzICsgMSk7CisKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsCisJCQkgICAgICAgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwKKwkJCSAgICAgICBwYXlsb2FkX3JlbWFpbmRlcik7CisJCXBheWxvYWRfaW5kZXggKz0gcGF5bG9hZF9yZW1haW5kZXI7CisJfQorCS8qICovCisJLyogRGVzY3J5cHQgdGhlIE1JQyAqLworCS8qICovCisJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcERhdGEsIFBOLCAwKTsKKwlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7CisJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCA4KTsKKworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOworCisJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKKworCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBjaGFpbl9idWZmZXIsIDgpOworCisJLyogKi8KKwkvKiBDYWxjdWxhdGUgTUlDICovCisJLyogKi8KKworCS8qRm9yY2UgdGhlIHByb3RlY3RlZCBmcmFtZSBiaXQgb24gKi8KKwkqKHBEYXRhICsgMSkgPSAqKHBEYXRhICsgMSkgfCAweDQwOworCisJLyogRmluZCBzdGFydCBvZiBwYXlsb2FkICovCisJLyogQmVjYXVzZSB0aGUgQ0NNUCBoZWFkZXIgaGFzIGJlZW4gcmVtb3ZlZCAqLworCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW47CisKKwljb25zdHJ1Y3RfbWljX2l2KG1pY19pdiwgcWNfZXhpc3RzLCBhNF9leGlzdHMsIHBEYXRhLCBwYXlsb2FkX2xlbiwgUE4pOworCisJY29uc3RydWN0X21pY19oZWFkZXIxKG1pY19oZWFkZXIxLCBIZWFkZXJMZW4sIHBEYXRhKTsKKworCWNvbnN0cnVjdF9taWNfaGVhZGVyMihtaWNfaGVhZGVyMiwgcERhdGEsIGE0X2V4aXN0cywgcWNfZXhpc3RzKTsKKworCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgbWljX2l2LCBhZXNfb3V0KTsKKwliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKKwlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7CisJYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7CisJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOworCisJLyogaXRlcmF0ZSB0aHJvdWdoIGVhY2ggMTYgYnl0ZSBwYXlsb2FkIGJsb2NrICovCisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7CisJCXBheWxvYWRfaW5kZXggKz0gMTY7CisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwl9CisKKwkvKiBBZGQgb24gdGhlIGZpbmFsIHBheWxvYWQgYmxvY2sgaWYgaXQgbmVlZHMgcGFkZGluZyAqLworCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKKwkJTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwYWRkZWRfYnVmZmVyLCBwRGF0YSArIHBheWxvYWRfaW5kZXgsCisJCQkgICAgICAgcGF5bG9hZF9yZW1haW5kZXIpOworCisJCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7CisJCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKKwl9CisJLyogYWVzX291dCBjb250YWlucyBwYWRkZWQgbWljLCBkaXNjYXJkIG1vc3Qgc2lnbmlmaWNhbnQgKi8KKwkvKiA4IGJ5dGVzIHRvIGdlbmVyYXRlIDY0IGJpdCBNSUMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlNSUNbaV0gPSBhZXNfb3V0W2ldOworCisJaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0QUVTLCBNSUMgRXJyb3IgIVxuIikpOwkvKk1JQyBlcnJvci4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09ICBBRVMgRW4vRGVjcnlwdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZgl1aW50OAorI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgorI2VuZGlmCisKKyNpZm5kZWYJdWludDMyCisjZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlpbnQKKyNlbmRpZgorCisvKiBmb3J3YXJkIFMtYm94ICovCitzdGF0aWMgdWludDMyIEZTYlsyNTZdID0geworCTB4NjMsIDB4N0MsIDB4NzcsIDB4N0IsIDB4RjIsIDB4NkIsIDB4NkYsIDB4QzUsCisJMHgzMCwgMHgwMSwgMHg2NywgMHgyQiwgMHhGRSwgMHhENywgMHhBQiwgMHg3NiwKKwkweENBLCAweDgyLCAweEM5LCAweDdELCAweEZBLCAweDU5LCAweDQ3LCAweEYwLAorCTB4QUQsIDB4RDQsIDB4QTIsIDB4QUYsIDB4OUMsIDB4QTQsIDB4NzIsIDB4QzAsCisJMHhCNywgMHhGRCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzRiwgMHhGNywgMHhDQywKKwkweDM0LCAweEE1LCAweEU1LCAweEYxLCAweDcxLCAweEQ4LCAweDMxLCAweDE1LAorCTB4MDQsIDB4QzcsIDB4MjMsIDB4QzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OUEsCisJMHgwNywgMHgxMiwgMHg4MCwgMHhFMiwgMHhFQiwgMHgyNywgMHhCMiwgMHg3NSwKKwkweDA5LCAweDgzLCAweDJDLCAweDFBLCAweDFCLCAweDZFLCAweDVBLCAweEEwLAorCTB4NTIsIDB4M0IsIDB4RDYsIDB4QjMsIDB4MjksIDB4RTMsIDB4MkYsIDB4ODQsCisJMHg1MywgMHhEMSwgMHgwMCwgMHhFRCwgMHgyMCwgMHhGQywgMHhCMSwgMHg1QiwKKwkweDZBLCAweENCLCAweEJFLCAweDM5LCAweDRBLCAweDRDLCAweDU4LCAweENGLAorCTB4RDAsIDB4RUYsIDB4QUEsIDB4RkIsIDB4NDMsIDB4NEQsIDB4MzMsIDB4ODUsCisJMHg0NSwgMHhGOSwgMHgwMiwgMHg3RiwgMHg1MCwgMHgzQywgMHg5RiwgMHhBOCwKKwkweDUxLCAweEEzLCAweDQwLCAweDhGLCAweDkyLCAweDlELCAweDM4LCAweEY1LAorCTB4QkMsIDB4QjYsIDB4REEsIDB4MjEsIDB4MTAsIDB4RkYsIDB4RjMsIDB4RDIsCisJMHhDRCwgMHgwQywgMHgxMywgMHhFQywgMHg1RiwgMHg5NywgMHg0NCwgMHgxNywKKwkweEM0LCAweEE3LCAweDdFLCAweDNELCAweDY0LCAweDVELCAweDE5LCAweDczLAorCTB4NjAsIDB4ODEsIDB4NEYsIDB4REMsIDB4MjIsIDB4MkEsIDB4OTAsIDB4ODgsCisJMHg0NiwgMHhFRSwgMHhCOCwgMHgxNCwgMHhERSwgMHg1RSwgMHgwQiwgMHhEQiwKKwkweEUwLCAweDMyLCAweDNBLCAweDBBLCAweDQ5LCAweDA2LCAweDI0LCAweDVDLAorCTB4QzIsIDB4RDMsIDB4QUMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4RTQsIDB4NzksCisJMHhFNywgMHhDOCwgMHgzNywgMHg2RCwgMHg4RCwgMHhENSwgMHg0RSwgMHhBOSwKKwkweDZDLCAweDU2LCAweEY0LCAweEVBLCAweDY1LCAweDdBLCAweEFFLCAweDA4LAorCTB4QkEsIDB4NzgsIDB4MjUsIDB4MkUsIDB4MUMsIDB4QTYsIDB4QjQsIDB4QzYsCisJMHhFOCwgMHhERCwgMHg3NCwgMHgxRiwgMHg0QiwgMHhCRCwgMHg4QiwgMHg4QSwKKwkweDcwLCAweDNFLCAweEI1LCAweDY2LCAweDQ4LCAweDAzLCAweEY2LCAweDBFLAorCTB4NjEsIDB4MzUsIDB4NTcsIDB4QjksIDB4ODYsIDB4QzEsIDB4MUQsIDB4OUUsCisJMHhFMSwgMHhGOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhEOSwgMHg4RSwgMHg5NCwKKwkweDlCLCAweDFFLCAweDg3LCAweEU5LCAweENFLCAweDU1LCAweDI4LCAweERGLAorCTB4OEMsIDB4QTEsIDB4ODksIDB4MEQsIDB4QkYsIDB4RTYsIDB4NDIsIDB4NjgsCisJMHg0MSwgMHg5OSwgMHgyRCwgMHgwRiwgMHhCMCwgMHg1NCwgMHhCQiwgMHgxNgorfTsKKworLyogZm9yd2FyZCB0YWJsZSAqLworI2RlZmluZQlGVCBcCitcCisJVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKKwlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAorCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCisJVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKKwlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAorCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCisJVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKKwlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAorCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCisJVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKKwlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAorCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCisJVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKKwlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAorCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCisJVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKKwlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAorCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCisJVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKKwlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAorCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCisJVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKKwlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAorCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCisJVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKKwlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAorCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCisJVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKKwlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAorCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCisJVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKKwlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAorCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCisJVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKKwlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAorCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCisJVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKKwlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAorCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCisJVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKKwlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAorCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCisJVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKKwlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAorCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCisJVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKKwlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAorCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCisJVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKKwlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAorCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCisJVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKKwlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAorCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCisJVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKKwlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAorCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCisJVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKKwlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAorCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCisJVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKKwlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAorCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCisJVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCitzdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OworCisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKK3N0YXRpYyB1aW50MzIgRlQxWzI1Nl0gPSB7IEZUIH07CisKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgorc3RhdGljIHVpbnQzMiBGVDJbMjU2XSA9IHsgRlQgfTsKKworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCitzdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OworCisjdW5kZWYgVgorCisjdW5kZWYgRlQKKworLyogcmV2ZXJzZSBTLWJveCAqLworCitzdGF0aWMgdWludDMyIFJTYlsyNTZdID0geworCTB4NTIsIDB4MDksIDB4NkEsIDB4RDUsIDB4MzAsIDB4MzYsIDB4QTUsIDB4MzgsCisJMHhCRiwgMHg0MCwgMHhBMywgMHg5RSwgMHg4MSwgMHhGMywgMHhENywgMHhGQiwKKwkweDdDLCAweEUzLCAweDM5LCAweDgyLCAweDlCLCAweDJGLCAweEZGLCAweDg3LAorCTB4MzQsIDB4OEUsIDB4NDMsIDB4NDQsIDB4QzQsIDB4REUsIDB4RTksIDB4Q0IsCisJMHg1NCwgMHg3QiwgMHg5NCwgMHgzMiwgMHhBNiwgMHhDMiwgMHgyMywgMHgzRCwKKwkweEVFLCAweDRDLCAweDk1LCAweDBCLCAweDQyLCAweEZBLCAweEMzLCAweDRFLAorCTB4MDgsIDB4MkUsIDB4QTEsIDB4NjYsIDB4MjgsIDB4RDksIDB4MjQsIDB4QjIsCisJMHg3NiwgMHg1QiwgMHhBMiwgMHg0OSwgMHg2RCwgMHg4QiwgMHhEMSwgMHgyNSwKKwkweDcyLCAweEY4LCAweEY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LAorCTB4RDQsIDB4QTQsIDB4NUMsIDB4Q0MsIDB4NUQsIDB4NjUsIDB4QjYsIDB4OTIsCisJMHg2QywgMHg3MCwgMHg0OCwgMHg1MCwgMHhGRCwgMHhFRCwgMHhCOSwgMHhEQSwKKwkweDVFLCAweDE1LCAweDQ2LCAweDU3LCAweEE3LCAweDhELCAweDlELCAweDg0LAorCTB4OTAsIDB4RDgsIDB4QUIsIDB4MDAsIDB4OEMsIDB4QkMsIDB4RDMsIDB4MEEsCisJMHhGNywgMHhFNCwgMHg1OCwgMHgwNSwgMHhCOCwgMHhCMywgMHg0NSwgMHgwNiwKKwkweEQwLCAweDJDLCAweDFFLCAweDhGLCAweENBLCAweDNGLCAweDBGLCAweDAyLAorCTB4QzEsIDB4QUYsIDB4QkQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OEEsIDB4NkIsCisJMHgzQSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0RiwgMHg2NywgMHhEQywgMHhFQSwKKwkweDk3LCAweEYyLCAweENGLCAweENFLCAweEYwLCAweEI0LCAweEU2LCAweDczLAorCTB4OTYsIDB4QUMsIDB4NzQsIDB4MjIsIDB4RTcsIDB4QUQsIDB4MzUsIDB4ODUsCisJMHhFMiwgMHhGOSwgMHgzNywgMHhFOCwgMHgxQywgMHg3NSwgMHhERiwgMHg2RSwKKwkweDQ3LCAweEYxLCAweDFBLCAweDcxLCAweDFELCAweDI5LCAweEM1LCAweDg5LAorCTB4NkYsIDB4QjcsIDB4NjIsIDB4MEUsIDB4QUEsIDB4MTgsIDB4QkUsIDB4MUIsCisJMHhGQywgMHg1NiwgMHgzRSwgMHg0QiwgMHhDNiwgMHhEMiwgMHg3OSwgMHgyMCwKKwkweDlBLCAweERCLCAweEMwLCAweEZFLCAweDc4LCAweENELCAweDVBLCAweEY0LAorCTB4MUYsIDB4REQsIDB4QTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4QzcsIDB4MzEsCisJMHhCMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhFQywgMHg1RiwKKwkweDYwLCAweDUxLCAweDdGLCAweEE5LCAweDE5LCAweEI1LCAweDRBLCAweDBELAorCTB4MkQsIDB4RTUsIDB4N0EsIDB4OUYsIDB4OTMsIDB4QzksIDB4OUMsIDB4RUYsCisJMHhBMCwgMHhFMCwgMHgzQiwgMHg0RCwgMHhBRSwgMHgyQSwgMHhGNSwgMHhCMCwKKwkweEM4LCAweEVCLCAweEJCLCAweDNDLCAweDgzLCAweDUzLCAweDk5LCAweDYxLAorCTB4MTcsIDB4MkIsIDB4MDQsIDB4N0UsIDB4QkEsIDB4NzcsIDB4RDYsIDB4MjYsCisJMHhFMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwQywgMHg3RAorfTsKKworLyogcmV2ZXJzZSB0YWJsZSAqLworCisjZGVmaW5lCVJUIFwKK1wKKwlWKDUxLEY0LEE3LDUwKSwJVig3RSw0MSw2NSw1MyksCVYoMUEsMTcsQTQsQzMpLAlWKDNBLDI3LDVFLDk2KSwJXAorCVYoM0IsQUIsNkIsQ0IpLAlWKDFGLDlELDQ1LEYxKSwJVihBQyxGQSw1OCxBQiksCVYoNEIsRTMsMDMsOTMpLAlcCisJVigyMCwzMCxGQSw1NSksCVYoQUQsNzYsNkQsRjYpLAlWKDg4LENDLDc2LDkxKSwJVihGNSwwMiw0QywyNSksCVwKKwlWKDRGLEU1LEQ3LEZDKSwJVihDNSwyQSxDQixENyksCVYoMjYsMzUsNDQsODApLAlWKEI1LDYyLEEzLDhGKSwJXAorCVYoREUsQjEsNUEsNDkpLAlWKDI1LEJBLDFCLDY3KSwJVig0NSxFQSwwRSw5OCksCVYoNUQsRkUsQzAsRTEpLAlcCisJVihDMywyRiw3NSwwMiksCVYoODEsNEMsRjAsMTIpLAlWKDhELDQ2LDk3LEEzKSwJVig2QixEMyxGOSxDNiksCVwKKwlWKDAzLDhGLDVGLEU3KSwJVigxNSw5Miw5Qyw5NSksCVYoQkYsNkQsN0EsRUIpLAlWKDk1LDUyLDU5LERBKSwJXAorCVYoRDQsQkUsODMsMkQpLAlWKDU4LDc0LDIxLEQzKSwJVig0OSxFMCw2OSwyOSksCVYoOEUsQzksQzgsNDQpLAlcCisJVig3NSxDMiw4OSw2QSksCVYoRjQsOEUsNzksNzgpLAlWKDk5LDU4LDNFLDZCKSwJVigyNyxCOSw3MSxERCksCVwKKwlWKEJFLEUxLDRGLEI2KSwJVihGMCw4OCxBRCwxNyksCVYoQzksMjAsQUMsNjYpLAlWKDdELENFLDNBLEI0KSwJXAorCVYoNjMsREYsNEEsMTgpLAlWKEU1LDFBLDMxLDgyKSwJVig5Nyw1MSwzMyw2MCksCVYoNjIsNTMsN0YsNDUpLAlcCisJVihCMSw2NCw3NyxFMCksCVYoQkIsNkIsQUUsODQpLAlWKEZFLDgxLEEwLDFDKSwJVihGOSwwOCwyQiw5NCksCVwKKwlWKDcwLDQ4LDY4LDU4KSwJVig4Riw0NSxGRCwxOSksCVYoOTQsREUsNkMsODcpLAlWKDUyLDdCLEY4LEI3KSwJXAorCVYoQUIsNzMsRDMsMjMpLAlWKDcyLDRCLDAyLEUyKSwJVihFMywxRiw4Riw1NyksCVYoNjYsNTUsQUIsMkEpLAlcCisJVihCMixFQiwyOCwwNyksCVYoMkYsQjUsQzIsMDMpLAlWKDg2LEM1LDdCLDlBKSwJVihEMywzNywwOCxBNSksCVwKKwlWKDMwLDI4LDg3LEYyKSwJVigyMyxCRixBNSxCMiksCVYoMDIsMDMsNkEsQkEpLAlWKEVELDE2LDgyLDVDKSwJXAorCVYoOEEsQ0YsMUMsMkIpLAlWKEE3LDc5LEI0LDkyKSwJVihGMywwNyxGMixGMCksCVYoNEUsNjksRTIsQTEpLAlcCisJVig2NSxEQSxGNCxDRCksCVYoMDYsMDUsQkUsRDUpLAlWKEQxLDM0LDYyLDFGKSwJVihDNCxBNixGRSw4QSksCVwKKwlWKDM0LDJFLDUzLDlEKSwJVihBMixGMyw1NSxBMCksCVYoMDUsOEEsRTEsMzIpLAlWKEE0LEY2LEVCLDc1KSwJXAorCVYoMEIsODMsRUMsMzkpLAlWKDQwLDYwLEVGLEFBKSwJVig1RSw3MSw5RiwwNiksCVYoQkQsNkUsMTAsNTEpLAlcCisJVigzRSwyMSw4QSxGOSksCVYoOTYsREQsMDYsM0QpLAlWKERELDNFLDA1LEFFKSwJVig0RCxFNixCRCw0NiksCVwKKwlWKDkxLDU0LDhELEI1KSwJVig3MSxDNCw1RCwwNSksCVYoMDQsMDYsRDQsNkYpLAlWKDYwLDUwLDE1LEZGKSwJXAorCVYoMTksOTgsRkIsMjQpLAlWKEQ2LEJELEU5LDk3KSwJVig4OSw0MCw0MyxDQyksCVYoNjcsRDksOUUsNzcpLAlcCisJVihCMCxFOCw0MixCRCksCVYoMDcsODksOEIsODgpLAlWKEU3LDE5LDVCLDM4KSwJVig3OSxDOCxFRSxEQiksCVwKKwlWKEExLDdDLDBBLDQ3KSwJVig3Qyw0MiwwRixFOSksCVYoRjgsODQsMUUsQzkpLAlWKDAwLDAwLDAwLDAwKSwJXAorCVYoMDksODAsODYsODMpLAlWKDMyLDJCLEVELDQ4KSwJVigxRSwxMSw3MCxBQyksCVYoNkMsNUEsNzIsNEUpLAlcCisJVihGRCwwRSxGRixGQiksCVYoMEYsODUsMzgsNTYpLAlWKDNELEFFLEQ1LDFFKSwJVigzNiwyRCwzOSwyNyksCVwKKwlWKDBBLDBGLEQ5LDY0KSwJVig2OCw1QyxBNiwyMSksCVYoOUIsNUIsNTQsRDEpLAlWKDI0LDM2LDJFLDNBKSwJXAorCVYoMEMsMEEsNjcsQjEpLAlWKDkzLDU3LEU3LDBGKSwJVihCNCxFRSw5NixEMiksCVYoMUIsOUIsOTEsOUUpLAlcCisJVig4MCxDMCxDNSw0RiksCVYoNjEsREMsMjAsQTIpLAlWKDVBLDc3LDRCLDY5KSwJVigxQywxMiwxQSwxNiksCVwKKwlWKEUyLDkzLEJBLDBBKSwJVihDMCxBMCwyQSxFNSksCVYoM0MsMjIsRTAsNDMpLAlWKDEyLDFCLDE3LDFEKSwJXAorCVYoMEUsMDksMEQsMEIpLAlWKEYyLDhCLEM3LEFEKSwJVigyRCxCNixBOCxCOSksCVYoMTQsMUUsQTksQzgpLAlcCisJVig1NyxGMSwxOSw4NSksCVYoQUYsNzUsMDcsNEMpLAlWKEVFLDk5LERELEJCKSwJVihBMyw3Riw2MCxGRCksCVwKKwlWKEY3LDAxLDI2LDlGKSwJVig1Qyw3MixGNSxCQyksCVYoNDQsNjYsM0IsQzUpLAlWKDVCLEZCLDdFLDM0KSwJXAorCVYoOEIsNDMsMjksNzYpLAlWKENCLDIzLEM2LERDKSwJVihCNixFRCxGQyw2OCksCVYoQjgsRTQsRjEsNjMpLAlcCisJVihENywzMSxEQyxDQSksCVYoNDIsNjMsODUsMTApLAlWKDEzLDk3LDIyLDQwKSwJVig4NCxDNiwxMSwyMCksCVwKKwlWKDg1LDRBLDI0LDdEKSwJVihEMixCQiwzRCxGOCksCVYoQUUsRjksMzIsMTEpLAlWKEM3LDI5LEExLDZEKSwJXAorCVYoMUQsOUUsMkYsNEIpLAlWKERDLEIyLDMwLEYzKSwJVigwRCw4Niw1MixFQyksCVYoNzcsQzEsRTMsRDApLAlcCisJVigyQixCMywxNiw2QyksCVYoQTksNzAsQjksOTkpLAlWKDExLDk0LDQ4LEZBKSwJVig0NyxFOSw2NCwyMiksCVwKKwlWKEE4LEZDLDhDLEM0KSwJVihBMCxGMCwzRiwxQSksCVYoNTYsN0QsMkMsRDgpLAlWKDIyLDMzLDkwLEVGKSwJXAorCVYoODcsNDksNEUsQzcpLAlWKEQ5LDM4LEQxLEMxKSwJVig4QyxDQSxBMixGRSksCVYoOTgsRDQsMEIsMzYpLAlcCisJVihBNixGNSw4MSxDRiksCVYoQTUsN0EsREUsMjgpLAlWKERBLEI3LDhFLDI2KSwJVigzRixBRCxCRixBNCksCVwKKwlWKDJDLDNBLDlELEU0KSwJVig1MCw3OCw5MiwwRCksCVYoNkEsNUYsQ0MsOUIpLAlWKDU0LDdFLDQ2LDYyKSwJXAorCVYoRjYsOEQsMTMsQzIpLAlWKDkwLEQ4LEI4LEU4KSwJVigyRSwzOSxGNyw1RSksCVYoODIsQzMsQUYsRjUpLAlcCisJVig5Riw1RCw4MCxCRSksCVYoNjksRDAsOTMsN0MpLAlWKDZGLEQ1LDJELEE5KSwJVihDRiwyNSwxMixCMyksCVwKKwlWKEM4LEFDLDk5LDNCKSwJVigxMCwxOCw3RCxBNyksCVYoRTgsOUMsNjMsNkUpLAlWKERCLDNCLEJCLDdCKSwJXAorCVYoQ0QsMjYsNzgsMDkpLAlWKDZFLDU5LDE4LEY0KSwJVihFQyw5QSxCNywwMSksCVYoODMsNEYsOUEsQTgpLAlcCisJVihFNiw5NSw2RSw2NSksCVYoQUEsRkYsRTYsN0UpLAlWKDIxLEJDLENGLDA4KSwJVihFRiwxNSxFOCxFNiksCVwKKwlWKEJBLEU3LDlCLEQ5KSwJVig0QSw2RiwzNixDRSksCVYoRUEsOUYsMDksRDQpLAlWKDI5LEIwLDdDLEQ2KSwJXAorCVYoMzEsQTQsQjIsQUYpLAlWKDJBLDNGLDIzLDMxKSwJVihDNixBNSw5NCwzMCksCVYoMzUsQTIsNjYsQzApLAlcCisJVig3NCw0RSxCQywzNyksCVYoRkMsODIsQ0EsQTYpLAlWKEUwLDkwLEQwLEIwKSwJVigzMyxBNyxEOCwxNSksCVwKKwlWKEYxLDA0LDk4LDRBKSwJVig0MSxFQyxEQSxGNyksCVYoN0YsQ0QsNTAsMEUpLAlWKDE3LDkxLEY2LDJGKSwJXAorCVYoNzYsNEQsRDYsOEQpLAlWKDQzLEVGLEIwLDREKSwJVihDQyxBQSw0RCw1NCksCVYoRTQsOTYsMDQsREYpLAlcCisJVig5RSxEMSxCNSxFMyksCVYoNEMsNkEsODgsMUIpLAlWKEMxLDJDLDFGLEI4KSwJVig0Niw2NSw1MSw3RiksCVwKKwlWKDlELDVFLEVBLDA0KSwJVigwMSw4QywzNSw1RCksCVYoRkEsODcsNzQsNzMpLAlWKEZCLDBCLDQxLDJFKSwJXAorCVYoQjMsNjcsMUQsNUEpLAlWKDkyLERCLEQyLDUyKSwJVihFOSwxMCw1NiwzMyksCVYoNkQsRDYsNDcsMTMpLAlcCisJVig5QSxENyw2MSw4QyksCVYoMzcsQTEsMEMsN0EpLAlWKDU5LEY4LDE0LDhFKSwJVihFQiwxMywzQyw4OSksCVwKKwlWKENFLEE5LDI3LEVFKSwJVihCNyw2MSxDOSwzNSksCVYoRTEsMUMsRTUsRUQpLAlWKDdBLDQ3LEIxLDNDKSwJXAorCVYoOUMsRDIsREYsNTkpLAlWKDU1LEYyLDczLDNGKSwJVigxOCwxNCxDRSw3OSksCVYoNzMsQzcsMzcsQkYpLAlcCisJVig1MyxGNyxDRCxFQSksCVYoNUYsRkQsQUEsNUIpLAlWKERGLDNELDZGLDE0KSwJVig3OCw0NCxEQiw4NiksCVwKKwlWKENBLEFGLEYzLDgxKSwJVihCOSw2OCxDNCwzRSksCVYoMzgsMjQsMzQsMkMpLAlWKEMyLEEzLDQwLDVGKSwJXAorCVYoMTYsMUQsQzMsNzIpLAlWKEJDLEUyLDI1LDBDKSwJVigyOCwzQyw0OSw4QiksCVYoRkYsMEQsOTUsNDEpLAlcCisJVigzOSxBOCwwMSw3MSksCVYoMDgsMEMsQjMsREUpLAlWKEQ4LEI0LEU0LDlDKSwJVig2NCw1NixDMSw5MCksCVwKKwlWKDdCLENCLDg0LDYxKSwJVihENSwzMixCNiw3MCksCVYoNDgsNkMsNUMsNzQpLAlWKEQwLEI4LDU3LDQyKQorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKK3N0YXRpYyB1aW50MzIgUlQwWzI1Nl0gPSB7IFJUIH07CisKKyN1bmRlZiBWCisKKyNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYworc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKKworI3VuZGVmIFYKKworI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCitzdGF0aWMgdWludDMyIFJUMlsyNTZdID0geyBSVCB9OworCisjdW5kZWYgVgorCisjZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKK3N0YXRpYyB1aW50MzIgUlQzWzI1Nl0gPSB7IFJUIH07CisKKyN1bmRlZiBWCisKKyN1bmRlZiBSVAorCisvKiByb3VuZCBjb25zdGFudHMgKi8KKworc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9IHsKKwkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwLAorCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDAsCisJMHgxQjAwMDAwMCwgMHgzNjAwMDAwMAorfTsKKworLyoga2V5IHNjaGVkdWxlCXRhYmxlcyAqLworCitzdGF0aWMgaW50IEtUX2luaXQgPSAxOworCitzdGF0aWMgdWludDMyIEtUMFsyNTZdOworc3RhdGljIHVpbnQzMiBLVDFbMjU2XTsKK3N0YXRpYyB1aW50MzIgS1QyWzI1Nl07CitzdGF0aWMgdWludDMyIEtUM1syNTZdOworCisvKiBwbGF0Zm9ybS1pbmRlcGVuZGFudAkzMi1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24JbWFjcm9zICovCisKKyNkZWZpbmUJR0VUX1VJTlQzMihuLGIsaSkJCQkJCQlcCit7CQkJCQkJCQkJCQkJXAorCShuKQk9ICgJKHVpbnQzMikgKGIpWyhpKQldIDw8IDI0CSkJCVwKKwkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAxXSA8PCAxNgkpCQlcCisJCXwgKAkodWludDMyKSAoYilbKGkpICsgMl0gPDwgIDgJKQkJXAorCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDNdCQkpOwkJXAorfQorCisjZGVmaW5lCVBVVF9VSU5UMzIobixiLGkpCQkJCQkJXAorewkJCQkJCQkJCQkJCVwKKwkoYilbKGkpCSAgIF0gPSAodWludDgpICggKG4pID4+CTI0ICk7CQlcCisJKGIpWyhpKQkrIDFdID0gKHVpbnQ4KSAoIChuKSA+PgkxNiApOwkJXAorCShiKVsoaSkJKyAyXSA9ICh1aW50OCkgKCAobikgPj4JIDggKTsJCVwKKwkoYilbKGkpCSsgM10gPSAodWludDgpICggKG4pCSAgICk7CQlcCit9CisKK2ludCBydF9hZXNfc2V0X2tleShzdHJ1Y3QgYWVzX2NvbnRleHQgKiBjdHgsIHVpbnQ4ICoga2V5LCBpbnQgbmJpdHMpCit7CisJaW50IGk7CisJdWludDMyICpSSywgKlNLOworCisJc3dpdGNoIChuYml0cykgeworCWNhc2UgMTI4OgorCQljdHgtPm5yID0gMTA7CisJCWJyZWFrOworCWNhc2UgMTkyOgorCQljdHgtPm5yID0gMTI7CisJCWJyZWFrOworCWNhc2UgMjU2OgorCQljdHgtPm5yID0gMTQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoMSk7CisJfQorCisJUksgPSAodWludDMyICopIGN0eC0+ZXJrOworCisJZm9yIChpID0gMDsgaSA8IChuYml0cyA+PiA1KTsgaSsrKSB7CisJCUdFVF9VSU5UMzIoUktbaV0sIGtleSwgaSAqIDQpOworCX0KKworCS8qIHNldHVwIGVuY3J5cHRpb24gICAgIHJvdW5kIGtleXMgKi8KKworCXN3aXRjaCAobmJpdHMpIHsKKwljYXNlIDEyODoKKworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKywgUksgKz0gNCkgeworCQkJUktbNF0gPSBSS1swXSBeIFJDT05baV0gXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbM10gPj4gMTYpXSA8PCAyNCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbM10gPj4gOCldIDw8IDE2KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1szXSldIDw8IDgpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzNdID4+IDI0KV0pOworCisJCQlSS1s1XSA9IFJLWzFdIF4gUktbNF07CisJCQlSS1s2XSA9IFJLWzJdIF4gUktbNV07CisJCQlSS1s3XSA9IFJLWzNdIF4gUktbNl07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDE5MjoKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBSSyArPSA2KSB7CisJCQlSS1s2XSA9IFJLWzBdIF4gUkNPTltpXSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s1XSA+PiAxNildIDw8IDI0KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s1XSA+PiA4KV0gPDwgMTYpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzVdKV0gPDwgOCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbNV0gPj4gMjQpXSk7CisKKwkJCVJLWzddID0gUktbMV0gXiBSS1s2XTsKKwkJCVJLWzhdID0gUktbMl0gXiBSS1s3XTsKKwkJCVJLWzldID0gUktbM10gXiBSS1s4XTsKKwkJCVJLWzEwXSA9IFJLWzRdIF4gUktbOV07CisJCQlSS1sxMV0gPSBSS1s1XSBeIFJLWzEwXTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjU2OgorCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyssIFJLICs9IDgpIHsKKwkJCVJLWzhdID0gUktbMF0gXiBSQ09OW2ldIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzddID4+IDE2KV0gPDwgMjQpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzddID4+IDgpXSA8PCAxNikgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbN10pXSA8PCA4KSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1s3XSA+PiAyNCldKTsKKworCQkJUktbOV0gPSBSS1sxXSBeIFJLWzhdOworCQkJUktbMTBdID0gUktbMl0gXiBSS1s5XTsKKwkJCVJLWzExXSA9IFJLWzNdIF4gUktbMTBdOworCisJCQlSS1sxMl0gPSBSS1s0XSBeCisJCQkgICAgKEZTYlsodWludDgpIChSS1sxMV0gPj4gMjQpXSA8PCAyNCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbMTFdID4+IDE2KV0gPDwgMTYpIF4KKwkJCSAgICAoRlNiWyh1aW50OCkgKFJLWzExXSA+PiA4KV0gPDwgOCkgXgorCQkJICAgIChGU2JbKHVpbnQ4KSAoUktbMTFdKV0pOworCisJCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKKwkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOworCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogc2V0dXAgZGVjcnlwdGlvbiAgICAgcm91bmQga2V5cyAqLworCisJaWYgKEtUX2luaXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQlLVDBbaV0gPSBSVDBbRlNiW2ldXTsKKwkJCUtUMVtpXSA9IFJUMVtGU2JbaV1dOworCQkJS1QyW2ldID0gUlQyW0ZTYltpXV07CisJCQlLVDNbaV0gPSBSVDNbRlNiW2ldXTsKKwkJfQorCisJCUtUX2luaXQgPSAwOworCX0KKworCVNLID0gKHVpbnQzMiAqKSBjdHgtPmRyazsKKworCSpTSysrID0gKlJLKys7CisJKlNLKysgPSAqUksrKzsKKwkqU0srKyA9ICpSSysrOworCSpTSysrID0gKlJLKys7CisKKwlmb3IgKGkgPSAxOyBpIDwgY3R4LT5ucjsgaSsrKSB7CisJCVJLIC09IDg7CisKKwkJKlNLKysgPSBLVDBbKHVpbnQ4KSAoKlJLID4+IDI0KV0gXgorCQkgICAgS1QxWyh1aW50OCkgKCpSSyA+PiAxNildIF4KKwkJICAgIEtUMlsodWludDgpICgqUksgPj4gOCldIF4gS1QzWyh1aW50OCkgKCpSSyldOworCQlSSysrOworCisJCSpTSysrID0gS1QwWyh1aW50OCkgKCpSSyA+PiAyNCldIF4KKwkJICAgIEtUMVsodWludDgpICgqUksgPj4gMTYpXSBeCisJCSAgICBLVDJbKHVpbnQ4KSAoKlJLID4+IDgpXSBeIEtUM1sodWludDgpICgqUkspXTsKKwkJUksrKzsKKworCQkqU0srKyA9IEtUMFsodWludDgpICgqUksgPj4gMjQpXSBeCisJCSAgICBLVDFbKHVpbnQ4KSAoKlJLID4+IDE2KV0gXgorCQkgICAgS1QyWyh1aW50OCkgKCpSSyA+PiA4KV0gXiBLVDNbKHVpbnQ4KSAoKlJLKV07CisJCVJLKys7CisKKwkJKlNLKysgPSBLVDBbKHVpbnQ4KSAoKlJLID4+IDI0KV0gXgorCQkgICAgS1QxWyh1aW50OCkgKCpSSyA+PiAxNildIF4KKwkJICAgIEtUMlsodWludDgpICgqUksgPj4gOCldIF4gS1QzWyh1aW50OCkgKCpSSyldOworCQlSSysrOworCX0KKworCVJLIC09IDg7CisKKwkqU0srKyA9ICpSSysrOworCSpTSysrID0gKlJLKys7CisJKlNLKysgPSAqUksrKzsKKwkqU0srKyA9ICpSSysrOworCisJcmV0dXJuICgwKTsKK30KKworLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCisKK3ZvaWQgcnRfYWVzX2VuY3J5cHQoc3RydWN0IGFlc19jb250ZXh0ICogY3R4LCB1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0pCit7CisJdWludDMyICpSSywgWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzOworCisJUksgPSAodWludDMyICopIGN0eC0+ZXJrOworCUdFVF9VSU5UMzIoWDAsIGlucHV0LCAwKTsKKwlYMCBePSBSS1swXTsKKwlHRVRfVUlOVDMyKFgxLCBpbnB1dCwgNCk7CisJWDEgXj0gUktbMV07CisJR0VUX1VJTlQzMihYMiwgaW5wdXQsIDgpOworCVgyIF49IFJLWzJdOworCUdFVF9VSU5UMzIoWDMsIGlucHV0LCAxMik7CisJWDMgXj0gUktbM107CisKKyNkZWZpbmUJQUVTX0ZST1VORChYMCxYMSxYMixYMyxZMCxZMSxZMixZMykJCVwKK3sJCQkJCQkJCQkJCQlcCisJUksgKz0gNDsJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQlcCisJWDAgPSBSS1swXSBeIEZUMFsgKHVpbnQ4KSAoCVkwID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTEgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMiA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkzCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDEgPSBSS1sxXSBeIEZUMFsgKHVpbnQ4KSAoCVkxID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTIgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMyA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkwCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDIgPSBSS1syXSBeIEZUMFsgKHVpbnQ4KSAoCVkyID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTMgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMCA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkxCQkgKSBdOwlcCisJCQkJCQkJCQkJCQlcCisJWDMgPSBSS1szXSBeIEZUMFsgKHVpbnQ4KSAoCVkzID4+IDI0ICkgXSBeCVwKKwkJCQkgRlQxWyAodWludDgpICgJWTAgPj4gMTYgKSBdIF4JXAorCQkJCSBGVDJbICh1aW50OCkgKAlZMSA+PiAgOCApIF0gXglcCisJCQkJIEZUM1sgKHVpbnQ4KSAoCVkyCQkgKSBdOwlcCit9CisKKwlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDEgKi8KKwlBRVNfRlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDIgKi8KKwlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDMgKi8KKwlBRVNfRlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDQgKi8KKwlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDUgKi8KKwlBRVNfRlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDYgKi8KKwlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDcgKi8KKwlBRVNfRlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDggKi8KKwlBRVNfRlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDkgKi8KKworCWlmIChjdHgtPm5yID4gMTApIHsKKwkJQUVTX0ZST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCAxMCAgICAgKi8KKwkJQUVTX0ZST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAxMSAgICAgKi8KKwl9CisKKwlpZiAoY3R4LT5uciA+IDEyKSB7CisJCUFFU19GUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgMTIgICAgICovCisJCUFFU19GUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMTMgICAgICovCisJfQorCisJLyogbGFzdCByb3VuZCAqLworCisJUksgKz0gNDsKKworCVgwID0gUktbMF0gXiAoRlNiWyh1aW50OCkgKFkwID4+IDI0KV0gPDwgMjQpIF4KKwkgICAgKEZTYlsodWludDgpIChZMSA+PiAxNildIDw8IDE2KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTIgPj4gOCldIDw8IDgpIF4gKEZTYlsodWludDgpIChZMyldKTsKKworCVgxID0gUktbMV0gXiAoRlNiWyh1aW50OCkgKFkxID4+IDI0KV0gPDwgMjQpIF4KKwkgICAgKEZTYlsodWludDgpIChZMiA+PiAxNildIDw8IDE2KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTMgPj4gOCldIDw8IDgpIF4gKEZTYlsodWludDgpIChZMCldKTsKKworCVgyID0gUktbMl0gXiAoRlNiWyh1aW50OCkgKFkyID4+IDI0KV0gPDwgMjQpIF4KKwkgICAgKEZTYlsodWludDgpIChZMyA+PiAxNildIDw8IDE2KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTAgPj4gOCldIDw8IDgpIF4gKEZTYlsodWludDgpIChZMSldKTsKKworCVgzID0gUktbM10gXiAoRlNiWyh1aW50OCkgKFkzID4+IDI0KV0gPDwgMjQpIF4KKwkgICAgKEZTYlsodWludDgpIChZMCA+PiAxNildIDw8IDE2KSBeCisJICAgIChGU2JbKHVpbnQ4KSAoWTEgPj4gOCldIDw8IDgpIF4gKEZTYlsodWludDgpIChZMildKTsKKworCVBVVF9VSU5UMzIoWDAsIG91dHB1dCwgMCk7CisJUFVUX1VJTlQzMihYMSwgb3V0cHV0LCA0KTsKKwlQVVRfVUlOVDMyKFgyLCBvdXRwdXQsIDgpOworCVBVVF9VSU5UMzIoWDMsIG91dHB1dCwgMTIpOworfQorCisvKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KKwordm9pZCBydF9hZXNfZGVjcnlwdChzdHJ1Y3QgYWVzX2NvbnRleHQgKiBjdHgsIHVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSkKK3sKKwl1aW50MzIgKlJLLCBYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTM7CisKKwlSSyA9ICh1aW50MzIgKikgY3R4LT5kcms7CisKKwlHRVRfVUlOVDMyKFgwLCBpbnB1dCwgMCk7CisJWDAgXj0gUktbMF07CisJR0VUX1VJTlQzMihYMSwgaW5wdXQsIDQpOworCVgxIF49IFJLWzFdOworCUdFVF9VSU5UMzIoWDIsIGlucHV0LCA4KTsKKwlYMiBePSBSS1syXTsKKwlHRVRfVUlOVDMyKFgzLCBpbnB1dCwgMTIpOworCVgzIF49IFJLWzNdOworCisjZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCit7CQkJCQkJCQkJCQkJXAorCVJLICs9IDQ7CQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJXAorCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAorCQkJCQkJCQkJCQkJXAorCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCisJCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKKwkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAorCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAorfQorCisJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAxICovCisJQUVTX1JST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCAyICovCisJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCAzICovCisJQUVTX1JST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA0ICovCisJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA1ICovCisJQUVTX1JST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA2ICovCisJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA3ICovCisJQUVTX1JST1VORChYMCwgWDEsIFgyLCBYMywgWTAsIFkxLCBZMiwgWTMpOwkvKiByb3VuZCA4ICovCisJQUVTX1JST1VORChZMCwgWTEsIFkyLCBZMywgWDAsIFgxLCBYMiwgWDMpOwkvKiByb3VuZCA5ICovCisKKwlpZiAoY3R4LT5uciA+IDEwKSB7CisJCUFFU19SUk9VTkQoWDAsIFgxLCBYMiwgWDMsIFkwLCBZMSwgWTIsIFkzKTsJLyogcm91bmQgMTAgICAgICovCisJCUFFU19SUk9VTkQoWTAsIFkxLCBZMiwgWTMsIFgwLCBYMSwgWDIsIFgzKTsJLyogcm91bmQgMTEgICAgICovCisJfQorCisJaWYgKGN0eC0+bnIgPiAxMikgeworCQlBRVNfUlJPVU5EKFgwLCBYMSwgWDIsIFgzLCBZMCwgWTEsIFkyLCBZMyk7CS8qIHJvdW5kIDEyICAgICAqLworCQlBRVNfUlJPVU5EKFkwLCBZMSwgWTIsIFkzLCBYMCwgWDEsIFgyLCBYMyk7CS8qIHJvdW5kIDEzICAgICAqLworCX0KKworCS8qIGxhc3Qgcm91bmQgKi8KKworCVJLICs9IDQ7CisKKwlYMCA9IFJLWzBdIF4gKFJTYlsodWludDgpIChZMCA+PiAyNCldIDw8IDI0KSBeCisJICAgIChSU2JbKHVpbnQ4KSAoWTMgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoUlNiWyh1aW50OCkgKFkyID4+IDgpXSA8PCA4KSBeIChSU2JbKHVpbnQ4KSAoWTEpXSk7CisKKwlYMSA9IFJLWzFdIF4gKFJTYlsodWludDgpIChZMSA+PiAyNCldIDw8IDI0KSBeCisJICAgIChSU2JbKHVpbnQ4KSAoWTAgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoUlNiWyh1aW50OCkgKFkzID4+IDgpXSA8PCA4KSBeIChSU2JbKHVpbnQ4KSAoWTIpXSk7CisKKwlYMiA9IFJLWzJdIF4gKFJTYlsodWludDgpIChZMiA+PiAyNCldIDw8IDI0KSBeCisJICAgIChSU2JbKHVpbnQ4KSAoWTEgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoUlNiWyh1aW50OCkgKFkwID4+IDgpXSA8PCA4KSBeIChSU2JbKHVpbnQ4KSAoWTMpXSk7CisKKwlYMyA9IFJLWzNdIF4gKFJTYlsodWludDgpIChZMyA+PiAyNCldIDw8IDI0KSBeCisJICAgIChSU2JbKHVpbnQ4KSAoWTIgPj4gMTYpXSA8PCAxNikgXgorCSAgICAoUlNiWyh1aW50OCkgKFkxID4+IDgpXSA8PCA4KSBeIChSU2JbKHVpbnQ4KSAoWTApXSk7CisKKwlQVVRfVUlOVDMyKFgwLCBvdXRwdXQsIDApOworCVBVVF9VSU5UMzIoWDEsIG91dHB1dCwgNCk7CisJUFVUX1VJTlQzMihYMiwgb3V0cHV0LCA4KTsKKwlQVVRfVUlOVDMyKFgzLCBvdXRwdXQsIDEyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBFTkNSWVBUIEFFUyBHVEsgYmVmb3JlIHNlbmRpbmcgaW4gRUFQT0wgZnJhbWUuCisgICAgICAgIEFFUyBHVEsgbGVuZ3RoID0gMTI4IGJpdCwgIHNvIGZpeCBibG9ja3MgZm9yIGFlcy1rZXktd3JhcCBhcyAyIGluIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0byBSRkMgMzM5NCBmb3IgYWVzIGtleSB3cmFwIGFsZ29yaXRobS4KKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFFU19HVEtfS0VZX1dSQVAodTggKiBrZXksCisJCSAgICAgIHU4ICogcGxhaW50ZXh0LAorCQkgICAgICB1MzIgcF9sZW4sIHU4ICogY2lwaGVydGV4dCkKK3sKKwl1OCBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKKwl1OCBSWzUxMl07CisJaW50IG51bV9ibG9ja3MgPSBwX2xlbiAvIDg7CS8qIHVuaXQ6NjRiaXRzICovCisJaW50IGksIGo7CisJc3RydWN0IGFlc19jb250ZXh0IGFlc2N0eDsKKwl1OCB4b3I7CisKKwlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7CisKKwkvKiBJbml0IElBICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJQVtpXSA9IDB4YTY7CisKKwkvKklucHV0IHBsYWludGV4dCAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCVJbOCAqIChpICsgMSkgKyBqXSA9IHBsYWludGV4dFs4ICogaSArIGpdOworCX0KKworCS8qIEtleSBNaXggKi8KKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCWZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKSB7CisJCQkvKnBoYXNlIDEgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUls4ICogaV0sIDgpOworCQkJcnRfYWVzX2VuY3J5cHQoJmFlc2N0eCwgQklOLCBCT1VUKTsKKworCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOworCQkJeG9yID0gbnVtX2Jsb2NrcyAqIGogKyBpOworCQkJQVs3XSA9IEJPVVRbN10gXiB4b3I7CisJCQlOZGlzTW92ZU1lbW9yeSgmUls4ICogaV0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8qIE91dHB1dCBjaXBoZXJ0ZXh0ICovCisJTmRpc01vdmVNZW1vcnkoY2lwaGVydGV4dCwgQSwgOCk7CisKKwlmb3IgKGkgPSAxOyBpIDw9IG51bV9ibG9ja3M7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJY2lwaGVydGV4dFs4ICogaSArIGpdID0gUls4ICogaSArIGpdOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCU1pc2MgZnVuY3Rpb24gdG8gZGVjcnlwdCBBRVMgYm9keQorCisJQXJndW1lbnRzOgorCisJUmV0dXJuIFZhbHVlOgorCisJTm90ZToKKwkJVGhpcyBmdW5jdGlvbiByZWZlcmVuY2VzIHRvCVJGQwkzMzk0IGZvciBhZXMga2V5IHVud3JhcCBhbGdvcml0aG0uCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEFFU19HVEtfS0VZX1VOV1JBUCh1OCAqIGtleSwKKwkJCXU4ICogcGxhaW50ZXh0LAorCQkJdTMyIGNfbGVuLCB1OCAqIGNpcGhlcnRleHQpCit7CisJdTggQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07CisJdTggeG9yOworCWludCBpLCBqOworCXN0cnVjdCBhZXNfY29udGV4dCBhZXNjdHg7CisJdTggKlI7CisJaW50IG51bV9ibG9ja3MgPSBjX2xlbiAvIDg7CS8qIHVuaXQ6NjRiaXRzICovCisKKwlvc19hbGxvY19tZW0oTlVMTCwgKHU4ICoqKSAmIFIsIDUxMik7CisKKwlpZiAoUiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQUVTX0dUS19LRVlfVU5XUkFQOiBubyBtZW1vcnkhXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyogRW5kIG9mIGlmICovCisJLyogSW5pdGlhbGl6ZSAqLworCU5kaXNNb3ZlTWVtb3J5KEEsIGNpcGhlcnRleHQsIDgpOworCS8qSW5wdXQgcGxhaW50ZXh0ICovCisJZm9yIChpID0gMDsgaSA8IChjX2xlbiAtIDgpOyBpKyspIHsKKwkJUltpXSA9IGNpcGhlcnRleHRbaSArIDhdOworCX0KKworCXJ0X2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKKworCWZvciAoaiA9IDU7IGogPj0gMDsgai0tKSB7CisJCWZvciAoaSA9IChudW1fYmxvY2tzIC0gMSk7IGkgPiAwOyBpLS0pIHsKKwkJCXhvciA9IChudW1fYmxvY2tzIC0gMSkgKiBqICsgaTsKKwkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7CisJCQlCSU5bN10gPSBBWzddIF4geG9yOworCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGkgLSAxKSAqIDhdLCA4KTsKKwkJCXJ0X2Flc19kZWNyeXB0KCZhZXNjdHgsIEJJTiwgQk9VVCk7CisJCQlOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmUlsoaSAtIDEpICogOF0sICZCT1VUWzhdLCA4KTsKKwkJfQorCX0KKworCS8qIE9VVFBVVCAqLworCWZvciAoaSA9IDA7IGkgPCBjX2xlbjsgaSsrKSB7CisJCXBsYWludGV4dFtpXSA9IFJbaV07CisJfQorCisJb3NfZnJlZV9tZW0oTlVMTCwgUik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fYXNpYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2FzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc3ZTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2FzaWMuYwpAQCAtMCwwICsxLDI1NjUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJY21tX2FzaWMuYworCisJQWJzdHJhY3Q6CisJRnVuY3Rpb25zIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBBU0lDCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCQlXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCisvKiBSZXNldCB0aGUgUkZJQyBzZXR0aW5nIHRvIG5ldyBzZXJpZXMgKi8KK3N0cnVjdCBydF9ydG1wX3JmX3JlZ3MgUkYyODUwUmVnVGFibGVbXSA9IHsKKy8qICAgICAgICAgICAgICBjaCAgICAgICBSMSAgICAgICAgICAgICAgUjIgICAgICAgICAgICAgIFIzKFRYMH40PTApIFI0ICovCisJezEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3ODYsIDB4OTgxNmI0NTUsIDB4OTgwMDUxMGJ9CisJLAorCXsyLCAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfQorCSwKKwl7MywgMHg5ODQwMmVjYywgMHg5ODRjMDc4YSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0KKwksCisJezQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OGEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOWZ9CisJLAorCXs1LCAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifQorCSwKKwl7NiwgMHg5ODQwMmVjYywgMHg5ODRjMDc4ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezcsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9CisJLAorCXs4LCAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfQorCSwKKwl7OSwgMHg5ODQwMmVjYywgMHg5ODRjMDc5NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0KKwksCisJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfQorCSwKKwl7MTEsIDB4OTg0MDJlY2MsIDB4OTg0YzA3OWEsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOGJ9CisJLAorCXsxMiwgMHg5ODQwMmVjYywgMHg5ODRjMDc5YSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0KKwksCisJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifQorCSwKKwl7MTQsIDB4OTg0MDJlY2MsIDB4OTg0YzA3YTIsIDB4OTgxNjhhNTUsIDB4OTgwMDUxOTN9CisJLAorCisJLyogODAyLjExIFVOSSAvIEh5cGVyTGFuIDIgKi8KKwl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9CisJLAorCXszOCwgMHg5ODQwMmVjYywgMHg5ODRjMDk5ZSwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30KKwksCisJezQwLCAweDk4NDAyZWM4LCAweDk4NGMwNjgyLCAweDk4MTU4YTU1LCAweDk4MGVkMTgzfQorCSwKKwl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9CisJLAorCXs0NiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4NiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE4Yn0KKwksCisJezQ4LCAweDk4NDAyZWM4LCAweDk4NGMwNjg2LCAweDk4MTU4YTU1LCAweDk4MGVkMTlifQorCSwKKwl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9CisJLAorCXs1NCwgMHg5ODQwMmVjOCwgMHg5ODRjMDY4YSwgMHg5ODE1OGE1NSwgMHg5ODBlZDFhM30KKwksCisJezU2LCAweDk4NDAyZWM4LCAweDk4NGMwNjhlLCAweDk4MTU4YTU1LCAweDk4MGVkMThifQorCSwKKwl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9CisJLAorCXs2MiwgMHg5ODQwMmVjOCwgMHg5ODRjMDY5MiwgMHg5ODE1OGE1NSwgMHg5ODBlZDE5M30KKwksCisJezY0LCAweDk4NDAyZWM4LCAweDk4NGMwNjkyLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfQorCSwJCQkvKiBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuICovCisKKwkvKiA4MDIuMTEgSHlwZXJMYW4gMiAqLworCXsxMDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2YjIsIDB4OTgxNzhhNTUsIDB4OTgwZWQ3ODN9CisJLAorCisJLyogMjAwOC4wNC4zMCBtb2RpZmllZCAqLworCS8qIFRoZSBzeXN0ZW0gdGVhbSBoYXMgQU4gdG8gaW1wcm92ZSB0aGUgRVZNIHZhbHVlICovCisJLyogZm9yIGNoYW5uZWwgMTAyIHRvIDEwOCBmb3IgdGhlIFJUMjg1MC9SVDI3NTAgZHVhbCBiYW5kIHNvbHV0aW9uLiAqLworCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9CisJLAorCXsxMDQsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxYTN9CisJLAorCXsxMDgsIDB4OTg0MDJlY2MsIDB4OTg1YzBhMzIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxOTN9CisJLAorCisJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30KKwksCisJezExMiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0KKwksCisJezExNiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzYSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhM30KKwksCisJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30KKwksCisJezEyMCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30KKwksCisJezEyNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30KKwksCisJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0KKwksCQkJLyogMHg5ODBlZDFiYi0+MHg5ODBlZDE1YiByZXF1aXJlZCBieSBSb3J5IDIwMDcwOTI3ICovCisJezEyOCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhM30KKwksCisJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0KKwksCisJezEzNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30KKwksCisJezEzNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0KKwksCisJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30KKwksCisKKwkvKiA4MDIuMTEgVU5JSSAqLworCXsxNDksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGEsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9CisJLAorCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9CisJLAorCXsxNTMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGZ9CisJLAorCXsxNTcsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWZ9CisJLAorCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9CisJLAorCXsxNjEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9CisJLAorCXsxNjUsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTd9CisJLAorCXsxNjcsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDIsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMWZ9CisJLAorCXsxNjksIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDIsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMjd9CisJLAorCXsxNzEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDYsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMDd9CisJLAorCXsxNzMsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDYsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMGZ9CisJLAorCisJLyogSmFwYW4gKi8KKwl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifQorCSwKKwl7MTg4LCAweDk1MDAyY2NjLCAweDk1MDA0OTIyLCAweDk1MDliZTU1LCAweDk1MGMwYTEzfQorCSwKKwl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifQorCSwKKwl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfQorCSwKKwl7MjA4LCAweDk1MDAyY2NjLCAweDk1MDA0OTNhLCAweDk1MDliZTU1LCAweDk1MGMwYTEzfQorCSwKKwl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifQorCSwKKwl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfQorCSwKKworCS8qIHN0aWxsIGxhY2sgb2YgTU1BQyhKYXBhbikgY2ggMzQsMzgsNDIsNDYgKi8KK307CisKK3U4IE5VTV9PRl8yODUwX0NITkwgPSAoc2l6ZW9mKFJGMjg1MFJlZ1RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzKSk7CisKK3N0cnVjdCBydF9mcmVxdWVuY3lfaXRlbSBGcmVxSXRlbXMzMDIwW10gPSB7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIElTTSA6IDIuNCB0byAyLjQ4MyBHSHogICAgICAgICAgICAgICAgICAgICAgICAgLy8gKi8KKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogMTFnICovCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qLUNILS0tTi0tLS0tLS1SLS0tSy0tLS0tLS0tLS0tICovCisJezEsIDI0MSwgMiwgMn0KKwksCisJezIsIDI0MSwgMiwgN30KKwksCisJezMsIDI0MiwgMiwgMn0KKwksCisJezQsIDI0MiwgMiwgN30KKwksCisJezUsIDI0MywgMiwgMn0KKwksCisJezYsIDI0MywgMiwgN30KKwksCisJezcsIDI0NCwgMiwgMn0KKwksCisJezgsIDI0NCwgMiwgN30KKwksCisJezksIDI0NSwgMiwgMn0KKwksCisJezEwLCAyNDUsIDIsIDd9CisJLAorCXsxMSwgMjQ2LCAyLCAyfQorCSwKKwl7MTIsIDI0NiwgMiwgN30KKwksCisJezEzLCAyNDcsIDIsIDJ9CisJLAorCXsxNCwgMjQ4LCAyLCA0fQorCSwKK307CisKK3U4IE5VTV9PRl8zMDIwX0NITkwgPSAoc2l6ZW9mKEZyZXFJdGVtczMwMjApIC8gc2l6ZW9mKHN0cnVjdCBydF9mcmVxdWVuY3lfaXRlbSkpOworCit2b2lkIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwUmF0ZVRhYmxlKQoreworCXU4IGk7CisJSFRfRkJLX0NGRzBfU1RSVUMgSHRDZmcwOworCUhUX0ZCS19DRkcxX1NUUlVDIEh0Q2ZnMTsKKwlMR19GQktfQ0ZHMF9TVFJVQyBMZ0NmZzA7CisJTEdfRkJLX0NGRzFfU1RSVUMgTGdDZmcxOworCXN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICpwQ3VyclR4UmF0ZSwgKnBOZXh0VHhSYXRlOworCisJLyogc2V0IHRvIGluaXRpYWwgdmFsdWUgKi8KKwlIdENmZzAud29yZCA9IDB4NjU0MzIxMDA7CisJSHRDZmcxLndvcmQgPSAweGVkY2JhOTg4OworCUxnQ2ZnMC53b3JkID0gMHhlZGNiYTk4ODsKKwlMZ0NmZzEud29yZCA9IDB4MDAwMDIxMDA7CisKKwlwTmV4dFR4UmF0ZSA9IChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSBwUmF0ZVRhYmxlICsgMTsKKwlmb3IgKGkgPSAxOyBpIDwgKigodTggKilwUmF0ZVRhYmxlKTsgaSsrKSB7CisJCXBDdXJyVHhSYXRlID0gKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopIHBSYXRlVGFibGUgKyAxICsgaTsKKwkJc3dpdGNoIChwQ3VyclR4UmF0ZS0+TW9kZSkgeworCQljYXNlIDA6CS8qQ0NLICovCisJCQlicmVhazsKKwkJY2FzZSAxOgkvKk9GRE0gKi8KKwkJCXsKKwkJCQlzd2l0Y2ggKHBDdXJyVHhSYXRlLT5DdXJyTUNTKSB7CisJCQkJY2FzZSAwOgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzBGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMUZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzNGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNEZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNToKKwkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0KKwkJCQkJICAgIChwTmV4dFR4UmF0ZS0+TW9kZSA9PQorCQkJCQkgICAgIE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPgorCQkJCQkJCSAgIEN1cnJNQ1MgKworCQkJCQkJCSAgIDgpIDogcE5leHRUeFJhdGUtPgorCQkJCQkgICAgQ3Vyck1DUzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OgorCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzZGQksgPQorCQkJCQkgICAgKHBOZXh0VHhSYXRlLT5Nb2RlID09CisJCQkJCSAgICAgTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+CisJCQkJCQkJICAgQ3Vyck1DUyArCisJCQkJCQkJICAgOCkgOiBwTmV4dFR4UmF0ZS0+CisJCQkJCSAgICBDdXJyTUNTOworCQkJCQlicmVhazsKKwkJCQljYXNlIDc6CisJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTN0ZCSyA9CisJCQkJCSAgICAocE5leHRUeFJhdGUtPk1vZGUgPT0KKwkJCQkJICAgICBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT4KKwkJCQkJCQkgICBDdXJyTUNTICsKKwkJCQkJCQkgICA4KSA6IHBOZXh0VHhSYXRlLT4KKwkJCQkJICAgIEN1cnJNQ1M7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CS8qSFQtTUlYICovCisJCWNhc2UgMzoJLypIVC1HRiAqLworCQkJeworCQkJCWlmICgocE5leHRUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkKKwkJCQkgICAgJiYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTICE9CisJCQkJCXBOZXh0VHhSYXRlLT5DdXJyTUNTKSkgeworCQkJCQlzd2l0Y2ggKHBDdXJyVHhSYXRlLT5DdXJyTUNTKSB7CisJCQkJCWNhc2UgMDoKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzBGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMToKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzFGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMzoKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzNGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzRGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNToKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNjoKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzZGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNzoKKwkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzdGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgODoKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgOToKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzlGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTA6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxMEZCSyA9CisJCQkJCQkgICAgcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxMToKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDEyOgorCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTJGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMTM6CisJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxM0ZCSyA9CisJCQkJCQkgICAgcE5leHRUeFJhdGUtPkN1cnJNQ1M7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxNDoKKwkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0KKwkJCQkJCSAgICBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE1OgorCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTMTVGQksgPQorCQkJCQkJICAgIHBOZXh0VHhSYXRlLT5DdXJyTUNTOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgKCJBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGU6IG5vdCBzdXBwb3J0IEN1cnJNQ1M9JWRcbiIsCisJCQkJCQkJICBwQ3VyclR4UmF0ZS0+CisJCQkJCQkJICBDdXJyTUNTKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgorCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgorCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCisKKwkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKKwkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCisJCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KKwkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KKwkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKKwkJaWYgKGJOb25HRkV4aXN0KQorCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBc2ljVXBkYXRlUHJvdGVjdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1MTYgT3BlcmF0aW9uTW9kZSwKKwkJICAgICAgIHU4IFNldE1hc2ssCisJCSAgICAgICBJTiBCT09MRUFOIGJEaXNhYmxlQkdQcm90ZWN0LCBJTiBCT09MRUFOIGJOb25HRkV4aXN0KQoreworCVBST1RfQ0ZHX1NUUlVDIFByb3RDZmcsIFByb3RDZmc0OworCXUzMiBQcm90ZWN0WzZdOworCXUxNiBvZmZzZXQ7CisJdTggaTsKKwl1MzIgTWFjUmVnID0gMDsKKworCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpICYmIChPcGVyYXRpb25Nb2RlICE9IDgpKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEFkLT5CQVRhYmxlLm51bURvbmVPcmlnaW5hdG9yKSB7CisJCS8qICovCisJCS8qIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbiAqLworCQkvKiAqLworCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOworCQlPcGVyYXRpb25Nb2RlID0gODsKKwl9CisJLyogQ29uZmlnIEFTSUMgUlRTIHRocmVzaG9sZCByZWdpc3RlciAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRTX0NGRywgJk1hY1JlZyk7CisJTWFjUmVnICY9IDB4RkYwMDAwRkY7CisJLyogSWYgdGhlIHVzZXIgd2FudCBkaXNhYmxlIFJ0c1RocmVzaG9sZCBhbmQgZW5hYmxlIEFtc2R1L1JhbGluay1BZ2dyZWdhdGlvbiwgc2V0IHRoZSBSdHNUaHJlc2hvbGQgYXMgNDA5NiAqLworCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkgfHwKKwkgICAgIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID09IFRSVUUpKQorCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPT0gTUFYX1JUU19USFJFU0hPTEQpIHsKKwkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7CisJfSBlbHNlIHsKKwkJTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRTX0NGRywgTWFjUmVnKTsKKworCS8qIEluaXRpYWwgY29tbW9uIHByb3RlY3Rpb24gc2V0dGluZ3MgKi8KKwlSVE1QWmVyb01lbW9yeShQcm90ZWN0LCBzaXplb2YoUHJvdGVjdCkpOworCVByb3RDZmc0LndvcmQgPSAwOworCVByb3RDZmcud29yZCA9IDA7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjQwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGMjAgPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU00MCA9IDE7CisJUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTIwID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd09mZG0gPSAxOworCVByb3RDZmcuZmllbGQuVHhvcEFsbG93Q2NrID0gMTsKKwlQcm90Q2ZnLmZpZWxkLlJUU1RoRW4gPSAxOworCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7CisKKwkvKiB1cGRhdGUgUEhZIG1vZGUgYW5kIHJhdGUgKi8KKwlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gMHg0MDAwOworCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgfD0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKKworCS8qIEhhbmRsZSBsZWdhY3koQi9HKSBwcm90ZWN0aW9uICovCisJaWYgKGJEaXNhYmxlQkdQcm90ZWN0KSB7CisJCS8qUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7ICovCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOworCQlQcm90ZWN0WzBdID0gUHJvdENmZy53b3JkOworCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCQlwQWQtPkZsZ0N0c0VuYWJsZWQgPSAwOwkvKiBDVFMtc2VsZiBpcyBub3QgdXNlZCAqLworCX0gZWxzZSB7CisJCS8qUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7ICovCisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOwkvKiBDQ0sgZG8gbm90IG5lZWQgdG8gYmUgcHJvdGVjdGVkICovCisJCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7CisJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX0NUUzsJLyogT0ZETSBuZWVkcyB1c2luZyBDQ0sgdG8gcHJvdGVjdCAqLworCQlQcm90ZWN0WzFdID0gUHJvdENmZy53b3JkOworCQlwQWQtPkZsZ0N0c0VuYWJsZWQgPSAxOwkvKiBDVFMtc2VsZiBpcyB1c2VkICovCisJfQorCisJLyogRGVjaWRlIEhUIGZyYW1lIHByb3RlY3Rpb24uICovCisJaWYgKChTZXRNYXNrICYgQUxMTl9TRVRQUk9URUNUKSAhPSAwKSB7CisJCXN3aXRjaCAoT3BlcmF0aW9uTW9kZSkgeworCQljYXNlIDB4MDoKKwkJCS8qIE5PIFBST1RFQ1QgKi8KKwkJCS8qIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUICovCisJCQkvKiAyLiBpbiBhaSAyMC80ME1IeiBCU1MgKi8KKwkJCS8qIDMuIGFsbCBTVEFzIGFyZSAyME1IeiBpbiBhIDIwTUh6IEJTUyAqLworCQkJLyogUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4gKi8KKworCQkJLyogTU0yMF9QUk9UX0NGRyAqLworCQkJLyogICAgICBSZXNlcnZlZCAoMzE6MjcpICovCisJCQkvKiAgICAgIFBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExICovCisJCQkvKiAgICAgIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKSAqLworCQkJLyogIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpICovCisJCQkvKiAgICAgIFBST1RfUkFURSgxNTowKSAgLS0gMHg0MDA0IChPRkRNIDI0TSkgKi8KKwkJCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OworCisJCQkvKiBNTTQwX1BST1RfQ0ZHICovCisJCQkvKiAgICAgIFJlc2VydmVkICgzMToyNykgKi8KKwkJCS8qICAgICAgUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEgKi8KKwkJCS8qICAgICAgUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pICovCisJCQkvKiAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkgKi8KKwkJCS8qICAgICAgUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkgKi8KKwkJCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OworCisJCQkvKiBDRjIwX1BST1RfQ0ZHICovCisJCQkvKiAgICAgIFJlc2VydmVkICgzMToyNykgKi8KKwkJCS8qICAgICAgUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEgKi8KKwkJCS8qICAgICAgUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pICovCisJCQkvKiAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkgKi8KKwkJCS8qICAgICAgUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKSAqLworCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7CisKKwkJCS8qIENGNDBfUFJPVF9DRkcgKi8KKwkJCS8qICAgICAgUmVzZXJ2ZWQgKDMxOjI3KSAqLworCQkJLyogICAgICBQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMSAqLworCQkJLyogICAgICBQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikgKi8KKwkJCS8qICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKSAqLworCQkJLyogICAgICBQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKSAqLworCQkJUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7CisKKwkJCWlmIChiTm9uR0ZFeGlzdCkgeworCQkJCS8qIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aWlvbikgKi8KKwkJCQkvKiBQUk9UX0NUUkwoMTc6MTYpIC0tIDAxIChSVFMvQ1RTKSAqLworCQkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OworCQkJfQorCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IEZBTFNFOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJLyogVGhpcyBpcyAiSFQgbm9uLW1lbWJlciBwcm90ZWN0aW9uIG1vZGUuIiAqLworCQkJLyogSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUyAqLworCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLyogUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpICovCisJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsJLyogZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLiAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKSB7CisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLypFUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLiAqLworCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOwkvKiBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MzsgKi8KKwkJCX0KKwkJCS8qQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cyAqLworCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOworCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKKwkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJLyogSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMgKi8KKwkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8qIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKSAqLworCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7CS8qIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4gKi8KKworCQkJLypBc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDQwTUh6IHBhY2tldHMgKi8KKwkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKKwkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7CisJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKKwkJCWlmIChiTm9uR0ZFeGlzdCkgeworCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJfQorCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQkvKiBIVCBtaXhlZCBtb2RlLiAgICAgICAgUFJPVEVDVCBBTEwhICovCisJCQkvKiBBc3NpZ24gUmF0ZSAqLworCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsJLypkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuICovCisJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsKKwkJCS8qIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZSAqLworCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKSB7CisJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLypFUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLiAqLworCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOwkvKiBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MyAqLworCQkJfQorCQkJLypBc3NpZ24gUHJvdGVjdGlvbiBtZXRob2QgZm9yIDIwJjQwIE1IeiBwYWNrZXRzICovCisJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7CisJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKKwkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOworCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKKwkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOworCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKKwkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOworCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7CisJCQlicmVhazsKKworCQljYXNlIDg6CisJCQkvKiBTcGVjaWFsIG9uIGZvciBBdGhlcm9zIHByb2JsZW0gbiBjaGlwLiAqLworCQkJUHJvdGVjdFsyXSA9IDB4MDE3NTQwMDQ7CisJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKKwkJCVByb3RlY3RbNF0gPSAweDAxNzU0MDA0OworCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7CisJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJb2Zmc2V0ID0gQ0NLX1BST1RfQ0ZHOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKChTZXRNYXNrICYgKDEgPDwgaSkpKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpICogNCwgUHJvdGVjdFtpXSk7CisJCX0KKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNTd2l0Y2hDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCwgSU4gQk9PTEVBTiBiU2NhbikKK3sKKwl1bnNpZ25lZCBsb25nIFIyID0gMCwgUjMgPSBERUZBVUxUX1JGX1RYX1BPV0VSLCBSNCA9IDA7CisJY2hhciBUeFB3ZXIgPSAwLCBUeFB3ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsJLypCYnA5NCA9IEJCUFI5NF9ERUZBVUxULCBUeFB3ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsgKi8KKwl1OCBpbmRleDsKKwl1MzIgVmFsdWUgPSAwOwkvKkJicFJlZywgVmFsdWU7ICovCisJc3RydWN0IHJ0X3J0bXBfcmZfcmVncyAqUkZSZWdUYWJsZTsKKwl1OCBSRlZhbHVlOworCisJUkZWYWx1ZSA9IDA7CisJLyogU2VhcmNoIFR4IHBvd2VyIHZhbHVlICovCisJLyogV2UgY2FuJ3QgdXNlIENoYW5uZWxMaXN0IHRvIHNlYXJjaCBjaGFubmVsLCBzaW5jZSBzb21lIGNlbnRyYWwgY2hhbm5sJ3MgdHhwb3dyIGRvZXNuJ3QgbGlzdCAqLworCS8qIGluIENoYW5uZWxMaXN0LCBzbyB1c2UgVHhQb3dlciBhcnJheSBpbnN0ZWFkLiAqLworCS8qICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaW5kZXgrKykgeworCQlpZiAoQ2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbaW5kZXhdLkNoYW5uZWwpIHsKKwkJCVR4UHdlciA9IHBBZC0+VHhQb3dlcltpbmRleF0uUG93ZXI7CisJCQlUeFB3ZXIyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQXNpY1N3aXRjaENoYW5uZWw6IENhbid0IGZpbmQgdGhlIENoYW5uZWwjJWQgXG4iLAorCQkJICBDaGFubmVsKSk7CisJfQorI2lmZGVmIFJUMzB4eAorCS8qIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eCAqLworCWlmICgoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJICAgICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKKwkJfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIxKQorCQl8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjIpKSkgeworCQkvKiBtb2RpZnkgYnkgV1kgZm9yIFJlYWQgUkYgUmVnLiBlcnJvciAqLworCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8zMDIwX0NITkw7IGluZGV4KyspIHsKKwkJCWlmIChDaGFubmVsID09IEZyZXFJdGVtczMwMjBbaW5kZXhdLkNoYW5uZWwpIHsKKwkJCQkvKiBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMgKi8KKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDIsCisJCQkJCQkgICAgICBGcmVxSXRlbXMzMDIwW2luZGV4XS5OKTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDMsCisJCQkJCQkgICAgICBGcmVxSXRlbXMzMDIwW2luZGV4XS5LKTsKKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPQorCQkJCSAgICAoUkZWYWx1ZSAmIDB4RkMpIHwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUjsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIFJGVmFsdWUpOworCisJCQkJLyogU2V0IFR4MCBQb3dlciAqLworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCAmUkZWYWx1ZSk7CisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXI7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCBSRlZhbHVlKTsKKworCQkJCS8qIFNldCBUeDEgUG93ZXIgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMywgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyMjsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsIFJGVmFsdWUpOworCisJCQkJLyogVHgvUnggU3RyZWFtIHNldHRpbmcgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOworCQkJCS8qaWYgKElTX1JUMzA5MChwQWQpKSAqLworCQkJCS8qICAgICAgUkZWYWx1ZSB8PSAweDAxOyAvLyBFbmFibGUgUkYgYmxvY2suICovCisJCQkJUkZWYWx1ZSAmPSAweDAzOwkvKmNsZWFyIGJpdFs3fjJdICovCisJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKKwkJCQkJUkZWYWx1ZSB8PSAweEEwOworCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKKwkJCQkJUkZWYWx1ZSB8PSAweDgwOworCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCisJCQkJCVJGVmFsdWUgfD0gMHg1MDsKKwkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCisJCQkJCVJGVmFsdWUgfD0gMHg0MDsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOworCisJCQkJLyogU2V0IFJGIG9mZnNldCAqLworCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCAmUkZWYWx1ZSk7CisJCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHg4MCkgfCBwQWQtPlJmRnJlcU9mZnNldDsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjMsIFJGVmFsdWUpOworCisJCQkJLyogU2V0IEJXICovCisJCQkJaWYgKCFiU2NhbgorCQkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkgeworCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQ7CisJCQkJCS8qRElTQUJMRV8xMU5fQ0hFQ0socEFkKTsgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7CisJCQkJfQorCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZWYWx1ZSk7CisJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCBSRlZhbHVlKTsKKworCQkJCS8qIEVuYWJsZSBSRiB0dW5pbmcgKi8KKwkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOworCQkJCVJGVmFsdWUgPSBSRlZhbHVlIHwgMHgxOworCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7CisKKwkJCQkvKiBsYXRjaCBjaGFubmVsIGZvciBmdXR1cmUgdXNhZ2UuICovCisJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAorCQkJCQkgIENoYW5uZWwsIHBBZC0+UmZJY1R5cGUsIFR4UHdlciwKKwkJCQkJICBUeFB3ZXIyLCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJCQkgIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCisJCQkJCSAgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSywKKwkJCQkJICBGcmVxSXRlbXMzMDIwW2luZGV4XS5SKSk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCXsKKwkJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOworCQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpIHsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspIHsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKSB7CisJCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7CisJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpIHsKKwkJCQkJCVIyIHw9IDB4NDAwMDsJLyogSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7ICovCisJCQkJCX0KKworCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKSB7CisJCQkJCQlSMiB8PSAweDQwOwkvKiB3cml0ZSAxIHRvIG9mZiBSeHBhdGguICovCisJCQkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PQorCQkJCQkJICAgMSkgeworCQkJCQkJUjIgfD0gMHgyMDA0MDsJLyogd3JpdGUgMSB0byBvZmYgUnhQYXRoICovCisJCQkJCX0KKworCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KSB7CisJCQkJCQkvKiBpbml0aWFsaXplIFIzLCBSNCAqLworCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uCisJCQkJCQkgICAgICBSMyAmIDB4ZmZmZmMxZmYpOworCQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uCisJCQkJCQkgICAgICBSNCAmICh+MHgwMDFmODdjMCkpIHwKKwkJCQkJCSAgICAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpOworCisJCQkJCQkvKiA1RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIgKi8KKwkJCQkJCS8qIFIzICovCisJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykKKwkJCQkJCSAgICAmJiAoVHhQd2VyIDwgMCkpIHsKKwkJCQkJCQlUeFB3ZXIgPSAoNyArIFR4UHdlcik7CisJCQkJCQkJVHhQd2VyID0KKwkJCQkJCQkgICAgKFR4UHdlciA+CisJCQkJCQkJICAgICAweEYpID8gKDB4RikKKwkJCQkJCQkgICAgOiAoVHhQd2VyKTsKKwkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKKwkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkJICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsCisJCQkJCQkJCSAgVHhQd2VyKSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVR4UHdlciA9CisJCQkJCQkJICAgIChUeFB3ZXIgPgorCQkJCQkJCSAgICAgMHhGKSA/ICgweEYpCisJCQkJCQkJICAgIDogKFR4UHdlcik7CisJCQkJCQkJUjMgfD0KKwkJCQkJCQkgICAgKFR4UHdlciA8PCAxMCkgfCAoMQorCQkJCQkJCQkJICAgICAgPDwKKwkJCQkJCQkJCSAgICAgIDkpOworCQkJCQkJfQorCisJCQkJCQkvKiBSNCAqLworCQkJCQkJaWYgKChUeFB3ZXIyID49IC03KQorCQkJCQkJICAgICYmIChUeFB3ZXIyIDwgMCkpIHsKKwkJCQkJCQlUeFB3ZXIyID0gKDcgKyBUeFB3ZXIyKTsKKwkJCQkJCQlUeFB3ZXIyID0KKwkJCQkJCQkgICAgKFR4UHdlcjIgPgorCQkJCQkJCSAgICAgMHhGKSA/ICgweEYpCisJCQkJCQkJICAgIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgKCJBc2ljU3dpdGNoQ2hhbm5lbDogVHhQd2VyMj0lZCBcbiIsCisJCQkJCQkJCSAgVHhQd2VyMikpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlUeFB3ZXIyID0KKwkJCQkJCQkgICAgKFR4UHdlcjIgPgorCQkJCQkJCSAgICAgMHhGKSA/ICgweEYpCisJCQkJCQkJICAgIDogKFR4UHdlcjIpOworCQkJCQkJCVI0IHw9CisJCQkJCQkJICAgIChUeFB3ZXIyIDw8IDcpIHwgKDEKKwkJCQkJCQkJCSAgICAgIDw8CisJCQkJCQkJCQkgICAgICA2KTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOwkvKiBzZXQgVFggcG93ZXIwICovCisJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8IDYpOwkvKiBTZXQgZnJlcSBPZmZzZXQgJiBUeFB3cjEgKi8KKwkJCQkJfQorCisJCQkJCS8qIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuICovCisJCQkJCWlmICghYlNjYW4KKwkJCQkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0KKwkJCQkJCUJXXzQwKSkgeworCQkJCQkJUjQgfD0gMHgyMDAwMDA7CisJCQkJCX0KKwkJCQkJLyogVXBkYXRlIHZhcmlhYmxlcyAqLworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0KKwkJCQkJICAgIFJGUmVnVGFibGVbaW5kZXhdLlIxOworCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7CisJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKKwkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OworCisJCQkJCS8qIFNldCBSRiB2YWx1ZSAxJ3Mgc2V0IFIzW2JpdDJdID0gWzBdICovCisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SMSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SMik7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgKHBBZC0+TGF0Y2hSZlJlZ3MuCisJCQkJCQkJICAgIFIzICYgKH4weDA0KSkpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOworCisJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKKworCQkJCQkvKiBTZXQgUkYgdmFsdWUgMidzIHNldCBSM1tiaXQyXSA9IFsxXSAqLworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJCSAgIChwQWQtPkxhdGNoUmZSZWdzLgorCQkJCQkJCSAgICBSMyB8IDB4MDQpKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKKworCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CisKKwkJCQkJLyogU2V0IFJGIHZhbHVlIDMncyBzZXQgUjNbYml0Ml0gPSBbMF0gKi8KKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwKKwkJCQkJCQkgICAocEFkLT5MYXRjaFJmUmVncy4KKwkJCQkJCQkgICAgUjMgJiAofjB4MDQpKSk7CisJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsCisJCQkJCQkJICAgcEFkLT5MYXRjaFJmUmVncy5SNCk7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVsdSwgUHdyMT0lbHUsICVkVCkgdG8gLCBSMT0weCUwOGx4LCBSMj0weCUwOGx4LCBSMz0weCUwOGx4LCBSND0weCUwOGx4XG4iLAorCQkJICBDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCAoUjMgJiAweDAwMDAzZTAwKSA+PiA5LAorCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAorCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIxLCBwQWQtPkxhdGNoUmZSZWdzLlIyLAorCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLCBwQWQtPkxhdGNoUmZSZWdzLlI0KSk7CisJfQorCisJLyogQ2hhbmdlIEJCUCBzZXR0aW5nIGR1cmluZyBzaXd0Y2ggZnJvbSBhLT5nLCBnLT5hICovCisJaWYgKENoYW5uZWwgPD0gMTQpIHsKKwkJdW5zaWduZWQgbG9uZyBUeFBpbkNmZyA9IDB4MDAwNTBGMEE7CS8qR2FyeSAyMDA3LzA4LzA5IDB4MDUwQTBBICovCisKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsCisJCQkJCSAgICAgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywKKwkJCQkJICAgICAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LAorCQkJCQkgICAgICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOwkvKigweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLiAqLworCQkvKlJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsgKi8KKworCQkvKiBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QgKi8KKwkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpIHsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKKwkJfQorCisJCS8qIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudCAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOworCQlWYWx1ZSAmPSAofjB4Nik7CisJCVZhbHVlIHw9ICgweDA0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKKworCQkvKiBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUiAqLworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOworCQl9CisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpIHsKKwkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7CisJCX0KKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7CisKKyNpZiBkZWZpbmVkKFJUMzA5MCkgfHwgZGVmaW5lZChSVDMzOTApCisJCS8qIFBDSWUgUEhZIFRyYW5zbWl0IGF0dGVudWF0aW9uIGFkanVzdG1lbnQgKi8KKwkJaWYgKElTX1JUMzA5MEEocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgeworCQkJVFhfQVRURU5VQVRJT05fQ1RSTF9TVFJVQyBUeEF0dGVudWF0aW9uQ3RybCA9IHsKKwkJCS53b3JkID0gMH07CisKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTCwKKwkJCQkgICAgICAgJlR4QXR0ZW51YXRpb25DdHJsLndvcmQpOworCisJCQlpZiAoQ2hhbm5lbCA9PSAxNCkJLyogQ2hhbm5lbCAjMTQgKi8KKwkJCXsKKwkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9FTiA9IDE7CS8qIEVuYWJsZSBQQ0llIFBIWSBUeCBhdHRlbnVhdGlvbiAqLworCQkJCVR4QXR0ZW51YXRpb25DdHJsLmZpZWxkLlBDSUVfUEhZX1RYX0FUVEVOX1ZBTFVFID0gNDsJLyogOS8xNiBmdWxsIGRyaXZlIGxldmVsICovCisJCQl9IGVsc2UJLyogQ2hhbm5lbCAjMX4jMTMgKi8KKwkJCXsKKwkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9FTiA9IDA7CS8qIERpc2FibGUgUENJZSBQSFkgVHggYXR0ZW51YXRpb24gKi8KKwkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRSA9IDA7CS8qIG4vYSAqLworCQkJfQorCisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQ0lFX1BIWV9UWF9BVFRFTlVBVElPTl9DVFJMLAorCQkJCQlUeEF0dGVudWF0aW9uQ3RybC53b3JkKTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBUeFBpbkNmZyA9IDB4MDAwNTBGMDU7CS8qR2FyeSAyMDA3LzgvOSAweDA1MDUwNSAqLworCisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLAorCQkJCQkgICAgICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKKwkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsCisJCQkJCSAgICAgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NCwKKwkJCQkJICAgICAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsJLyooMHg0NCAtIEdFVF9MTkFfR0FJTihwQWQpKSk7ICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLiAqLworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7CisKKwkJLyogUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0ICovCisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7CisJCX0gZWxzZSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7CisJCX0KKworCQkvKiA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKKwkJVmFsdWUgJj0gKH4weDYpOworCQlWYWx1ZSB8PSAoMHgwMik7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CisKKwkJLyogVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIgKi8KKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKKwkJfQorCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CisJCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOworCQl9CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOworCisJfQorCisJLyogUjY2IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIENoYW5uZWwgYW5kIHVzZSAyME1IeiB3aGVuIHNjYW5uaW5nICovCisJLypSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpOyAqLworCWlmIChiU2NhbikKKwkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKKwllbHNlCisJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcpOworCisJLyogKi8KKwkvKiBPbiAxMUEsIFdlIHNob3VsZCBkZWxheSBhbmQgd2FpdCBSRi9CQlAgdG8gYmUgc3RhYmxlICovCisJLyogYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMgKi8KKwkvKiAyMDA1LzA2LzA1IC0gT24gMTFHLCBXZSBhbHNvIG5lZWQgdGhpcyBkZWxheSB0aW1lLiBPdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gcGFzcyB0aGUgV0hRTC4gKi8KKwkvKiAqLworCVJUTVB1c2VjRGVsYXkoMTAwMCk7Cit9CisKK3ZvaWQgQXNpY1Jlc2V0QkJQQWdlbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCUJCUF9DU1JfQ0ZHX1NUUlVDIEJicENzcjsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXNldCBCQlAgQWdlbnQgYnVzeSBiaXQhXG4iKSk7CisJLyogU3RpbGwgbmVlZCB0byBmaW5kIHdoeSBCQlAgYWdlbnQga2VlcHMgYnVzeSwgYnV0IGluIGZhY3QsIGhhcmR3YXJlIHN0aWxsIGZ1bmN0aW9uIG9rLiBOb3cgY2xlYXIgYnVzeSBmaXJzdC4gKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CisJQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCisJCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKKwkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KKwkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNMb2NrQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwpCit7Cit9CisKK3ZvaWQgQXNpY1JmVHVuaW5nRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCit7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgorCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBMSU5LIFVQIGluIElORlJBU1RSVUNUVVJFIG1vZGUuCisKKwkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCisJCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKKwkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKKwkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCisJCTMuIGV4dHJhIDIgZGIgZm9yIENDSworCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAorCisJTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCisJCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdFN3aXRjaGluZygpCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljQWRqdXN0VHhQb3dlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IGksIGo7CisJY2hhciBEZWx0YVB3ciA9IDA7CisJQk9PTEVBTiBiQXV0b1R4QWdjID0gRkFMU0U7CisJdTggVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7CisJdTggQmJwUjEgPSAwLCBCYnBSNDkgPSAwLCBpZHg7CisJY2hhciAqcFR4QWdjQ29tcGVuc2F0ZTsKKwl1bnNpZ25lZCBsb25nIFR4UHdyWzVdOworCWNoYXIgVmFsdWU7CisJY2hhciBSc3NpID0gLTEyNzsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpIHx8CisjaWZkZWYgUlRNUF9NQUNfUENJCisJICAgIChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkgfHwKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkgICAgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSB8fAorCSAgICBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQlyZXR1cm47CisKKwlSc3NpID0gUlRNUE1heFJzc2kocEFkLAorCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKKwkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gMTQpIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0gZWxzZSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfSBlbHNlIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwkvKiBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLiB0cnkgZXZlcnkgNCBzZWNvbmQgKi8KKwlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA0ID09IDApIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpIHsKKwkJCS8qIGJnIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgPSBwQWQtPmJBdXRvVHhBZ2NHOworCQkJVHNzaVJlZiA9IHBBZC0+VHNzaVJlZkc7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdOworCQkJVHhBZ2NTdGVwID0gcEFkLT5UeEFnY1N0ZXBHOworCQkJcFR4QWdjQ29tcGVuc2F0ZSA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7CisJCX0gZWxzZSB7CisJCQkvKiBhIGNoYW5uZWwgKi8KKwkJCWJBdXRvVHhBZ2MgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJVHNzaVJlZiA9IHBBZC0+VHNzaVJlZkE7CisJCQlwVHNzaU1pbnVzQm91bmRhcnkgPSAmcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF07CisJCQlwVHNzaVBsdXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOworCQkJVHhBZ2NTdGVwID0gcEFkLT5UeEFnY1N0ZXBBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykgeworCQkJLyogQmJwUjEgaXMgdW5zaWduZWQgY2hhciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7CisKKwkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCisJCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCisJCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLworCisJCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLworCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKKwkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLworCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCisKKwkJCS8qIHBsdXMgKCspIGlzIDB4MDAgfiAweDQ1LCBtaW51cyAoLSkgaXMgMHhhMCB+IDB4ZjAgKi8KKwkJCS8qIGlmIHZhbHVlIGlzIGJldHdlZW4gcDEgfiBvMSBvciBvMSB+IHMxLCBubyBuZWVkIHRvIGFkanVzdCB0eCBwb3dlciAqLworCQkJLyogaWYgdmFsdWUgaXMgMHhhNSwgdHggcG93ZXIgd2lsbCBiZSAtPSBUeEFnY1N0ZXAqKDItMSkgKi8KKworCQkJaWYgKEJicFI0OSA+IHBUc3NpTWludXNCb3VuZGFyeVsxXSkgeworCQkJCS8qIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZSAqLworCQkJCS8qIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIgKi8KKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKSB7CisJCQkJCWlmIChCYnBSNDkgPD0gcFRzc2lNaW51c0JvdW5kYXJ5W2lkeF0pCS8qIEZvdW5kIHRoZSByYW5nZSAqLworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSMyA+ICh1bnNpZ25lZCBsb25nKShUeEFnY1N0ZXAgKiAoaWR4LTEpKSkgKi8KKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oVHhBZ2NTdGVwICogKGlkeCAtIDEpKTsKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwVHhBZ2NDb21wZW5zYXRlID0gLSgodTgpUjMpOyAqLworCisJCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAorCQkJCQkgIEJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHggLSAxKSk7CisJCQl9IGVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKSB7CisJCQkJLyogUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZSAqLworCQkJCS8qIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIgKi8KKwkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKSB7CisJCQkJCWlmIChCYnBSNDkgPj0gcFRzc2lQbHVzQm91bmRhcnlbaWR4XSkJLyogRm91bmQgdGhlIHJhbmdlICovCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogVGhlIGluZGV4IGlzIHRoZSBzdGVwIHdlIHNob3VsZCBpbmNyZWFzZSwgaWR4ID0gMCBtZWFucyB0aGVyZSBpcyBub3RoaW5nIHRvIGNvbXBlbnNhdGUgKi8KKwkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHggLSAxKTsKKwkJCQlEZWx0YVB3ciArPSAoKnBUeEFnY0NvbXBlbnNhdGUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCisJCQkJCSAgQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIGlkeCAtIDEpKTsKKwkJCX0gZWxzZSB7CisJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCIgICBUeCBQb3dlciwgQkJQIFI0OT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAorCQkJCQkgIEJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgeworCQkJYkF1dG9UeEFnYyA9IHBBZC0+YkF1dG9UeEFnY0c7CisJCQlwVHhBZ2NDb21wZW5zYXRlID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlRzsKKwkJfSBlbHNlIHsKKwkJCWJBdXRvVHhBZ2MgPSBwQWQtPmJBdXRvVHhBZ2NBOworCQkJcFR4QWdjQ29tcGVuc2F0ZSA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7CisJCX0KKworCQlpZiAoYkF1dG9UeEFnYykKKwkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7CisJfQorCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwUjEpOworCUJicFIxICY9IDB4RkM7CisKKwkvKiBjYWxjdWxhdGUgZGVsdGEgcG93ZXIgYmFzZWQgb24gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwkvKiBFMlBST00gc2V0dGluZyBpcyBjYWxpYnJhdGVkIGZvciBtYXhpbXVtIFRYIHBvd2VyIChpLmUuIDEwMCUpICovCisJLyogV2UgbG93ZXIgVFggcG93ZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIHBlcmNlbnRhZ2Ugc3BlY2lmaWVkIGZyb20gVUkgKi8KKwlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikJLyogQVVUTyBUWCBQT1dFUiBjb250cm9sICovCisJeworCQl7CisJCQkvKiB0byBwYXRjaCBoaWdoIHBvd2VyIGlzc3VlIHdpdGggc29tZSBBUHMsIGxpa2UgQmVsa2luIE4xLiAqLworCQkJaWYgKFJzc2kgPiAtMzUpIHsKKwkJCQlCYnBSMSB8PSAweDAyOwkvKiBEZWx0YVB3ciAtPSAxMjsgKi8KKwkJCX0gZWxzZSBpZiAoUnNzaSA+IC00MCkgeworCQkJCUJicFIxIHw9IDB4MDE7CS8qIERlbHRhUHdyIC09IDY7ICovCisJCQl9IGVsc2U7CisJCX0KKwl9IGVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApCS8qIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcgKi8KKwkJOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApCS8qIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcgICAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSAxOyAqLworCXsKKwkJRGVsdGFQd3IgLT0gMTsKKwl9IGVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApCS8qIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcgICAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSAzOyAqLworCXsKKwkJRGVsdGFQd3IgLT0gMzsKKwl9IGVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMTUpCS8qIDE2IH4gMzAlLCB0cmVhdCBhcyAyNSUgaW4gdGVybXMgb2YgbVcgICAgICAgICAgICAgICAvLyBEZWx0YVB3ciAtPSA2OyAqLworCXsKKwkJQmJwUjEgfD0gMHgwMTsKKwl9IGVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkJLyogMTAgfiAxNSUsIHRyZWF0IGFzIDEyLjUlIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgIC8vIERlbHRhUHdyIC09IDk7ICovCisJeworCQlCYnBSMSB8PSAweDAxOworCQlEZWx0YVB3ciAtPSAzOworCX0gZWxzZQkJCS8qIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XICAgICAgICAgICAgIC8vIERlbHRhUHdyIC09IDEyOyAqLworCXsKKwkJQmJwUjEgfD0gMHgwMjsKKwl9CisKKwlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCYnBSMSk7CisKKwkvKiByZXNldCBkaWZmZXJlbnQgbmV3IHR4IHBvd2VyIGZvciBkaWZmZXJlbnQgVFggcmF0ZSAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpIHsKKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQlWYWx1ZSA9IChjaGFyKSgoVHhQd3JbaV0gPj4gaiAqIDQpICYgMHgwRik7CS8qIDAgfiAxNSAqLworCisJCQkJaWYgKChWYWx1ZSArIERlbHRhUHdyKSA8IDApIHsKKwkJCQkJVmFsdWUgPSAwOwkvKiBtaW4gKi8KKwkJCQl9IGVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikgeworCQkJCQlWYWx1ZSA9IDB4RjsJLyogbWF4ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7CS8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLworCQkJCX0KKworCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KKwkJCQlUeFB3cltpXSA9CisJCQkJICAgIChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqICogNCkpIHwgKFZhbHVlCisJCQkJCQkJCQkgICA8PCBqCisJCQkJCQkJCQkgICAqIDQpOworCQkJfQorCisJCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KKwkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IgVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQorCQkJICAgVFggcG93ZXIgZm9yIE9GRE0gNk0vOU0KKwkJCSAgIFRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQorCQkJICAgVFggcG93ZXIgZm9yIENDSzFNLzJNICovCisJCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkgKiA0LCBUeFB3cltpXSk7CisJCX0KKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlwdXQgUEhZIHRvIHNsZWVwIGhlcmUsIGFuZCBzZXQgbmV4dCB3YWtldXAgdGltZXIuIFBIWSBkb2Vzbid0IG5vdCB3YWtldXAKKwkJYXV0b21hdGljYWxseS4gSW5zdGVhZCwgTUNVIHdpbGwgaXNzdWUgYSBUd2FrZVVwSW50ZXJydXB0IHRvIGhvc3QgYWZ0ZXIKKwkJdGhlIHdha2V1cCB0aW1lciB0aW1lb3V0LiBEcml2ZXIgaGFzIHRvIGlzc3VlIGEgc2VwYXJhdGUgY29tbWFuZCB0byB3YWtlCisJCVBIWSB1cC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKQoreworCVJUTVBfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBc2ljRm9yY2VXYWtldXAoKSBpcyB1c2VkIHdoZW5ldmVyIG1hbnVhbCB3YWtldXAgaXMgcmVxdWlyZWQKKwkJQXNpY0ZvcmNlU2xlZXAoKSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gbm90IGluIElORlJBIEJTUy4gV2hlbgorCQlpbiBJTkZSQSBCU1MsIHdlIHNob3VsZCB1c2UgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoKSBpbnN0ZWFkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0ZvcmNlU2xlZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQXNpY0ZvcmNlV2FrZXVwKCkgaXMgdXNlZCB3aGVuZXZlciBUd2FrZXVwIHRpbWVyIChzZXQgdmlhIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKQorCQlleHBpcmVkLgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNGb3JjZVdha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkZyb21UeCkKK3sKKwlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoIi0tPiBBc2ljRm9yY2VXYWtldXAgXG4iKSk7CisJUlRNUF9TVEFfRk9SQ0VfV0FLRVVQKHBBZCwgYkZyb21UeCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJU2V0IE15IEJTU0lECisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY1NldEJzc2lkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBCc3NpZCkKK3sKKwl1bnNpZ25lZCBsb25nIEFkZHI0OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT09PT09PT09PT09PT4gQXNpY1NldEJzc2lkICV4OiV4OiV4OiV4OiV4OiV4XG4iLCBwQnNzaWRbMF0sCisJCSAgcEJzc2lkWzFdLCBwQnNzaWRbMl0sIHBCc3NpZFszXSwgcEJzc2lkWzRdLCBwQnNzaWRbNV0pKTsKKworCUFkZHI0ID0gKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFswXSkgfAorCSAgICAodW5zaWduZWQgbG9uZykocEJzc2lkWzFdIDw8IDgpIHwKKwkgICAgKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFsyXSA8PCAxNikgfCAodW5zaWduZWQgbG9uZykocEJzc2lkWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7CisKKwlBZGRyNCA9IDA7CisJLyogYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZSAqLworCUFkZHI0ID0gKHVuc2lnbmVkIGxvbmcpKHBCc3NpZFs0XSkgfCAodW5zaWduZWQgbG9uZykocEJzc2lkWzVdIDw8IDgpOworCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0JTU0lEX0RXMSwgQWRkcjQpOworfQorCit2b2lkIEFzaWNTZXRNY2FzdFdDKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKKwl1MTYgb2Zmc2V0OworCisJcEVudHJ5LT5Tc3QgPSBTU1RfQVNTT0M7CisJcEVudHJ5LT5BaWQgPSBNQ0FTVF9XQ0lEOwkvKiBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleCAqLworCXBFbnRyeS0+UHNNb2RlID0gUFdSX0FDVElWRTsKKwlwRW50cnktPkN1cnJUeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKKwlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgQlNTME1jYXN0X1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljRGVsV2NpZFRhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpCit7CisJdW5zaWduZWQgbG9uZyBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljRGVsV2NpZFRhYj09PldjaWQgPSAweCV4XG4iLCBXY2lkKSk7CisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIFdjaWQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMCk7CisJb2Zmc2V0ICs9IDQ7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyMSk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljRW5hYmxlUkRHKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlUWF9MSU5LX0NGR19TVFJVQyBUeExpbmtDZmc7CisJdTMyIERhdGEgPSAwOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKKwlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7CisJRGF0YSAmPSAweEZGRkZGRjAwOworCURhdGEgfD0gMHg4MDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOworCisJLypPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOyAqLworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0Rpc2FibGVSREcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCVRYX0xJTktfQ0ZHX1NUUlVDIFR4TGlua0NmZzsKKwl1MzIgRGF0YSA9IDA7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOworCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMDsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKKworCURhdGEgJj0gMHhGRkZGRkYwMDsKKwkvKkRhdGEgIHw9IDB4MjA7ICovCisjaWZuZGVmIFdJRklfVEVTVAorCS8qaWYgKCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCApICovCisJLyogICAgICBEYXRhIHw9IDB4NjA7IC8vIGZvciBwZXJmb3JtYW5jZSBpc3N1ZSBub3Qgc2V0IHRoZSBUWE9QIHRvIDAgKi8KKyNlbmRpZgorCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSkKKwkgICAgJiYgKHBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYyA9PSBGQUxTRSkKKwkgICAgKSB7CisJCS8qIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlICovCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKKwkJCURhdGEgfD0gMHgyMDsKKwl9CisJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0Rpc2FibGVTeW5jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkRpc2FibGUgVFNGIHN5bmNocm9uaXphdGlvblxuIikpOworCisJLyogMjAwMy0xMi0yMCBkaXNhYmxlIFRTRiBhbmQgVEJUVCB3aGlsZSBOSUMgaW4gcG93ZXItc2F2aW5nIGhhdmUgc2lkZSBlZmZlY3QgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgTklDIHdpbGwgbmV2ZXIgd2FrZXMgdXAgYmVjYXVzZSBUU0Ygc3RvcHMgYW5kIG5vIG1vcmUgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgIFRCVFQgaW50ZXJydXB0cyAqLworCXBBZC0+VGJ0dFRpY2tDb3VudCA9IDA7CisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CisJY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKKwljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBBc2ljRW5hYmxlQnNzU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlQnNzU3luYyhJTkZSQSBtb2RlKVxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7CisvKiAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgMHgwMDAwMDAwMCk7ICovCisJeworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsJLyogQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVICovCisJCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDE7CisJCWNzci5maWVsZC5Uc2ZTeW5jTW9kZSA9IDE7CS8qIHN5bmMgVFNGIGluIElORlJBU1RSVUNUVVJFIG1vZGUgKi8KKwkJY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOwkvKiBkbyBOT1QgZ2VuZXJhdGUgQkVBQ09OICovCisJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDE7CisJfQorCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJRGVzY3JpcHRpb246CisJTm90ZToKKwkJQkVBQ09OIGZyYW1lIGluIHNoYXJlZCBtZW1vcnkgc2hvdWxkIGJlIGJ1aWx0IG9rIGJlZm9yZSB0aGlzIHJvdXRpbmUKKwkJY2FuIGJlIGNhbGxlZC4gT3RoZXJ3aXNlLCBhIGdhcmJhZ2UgZnJhbWUgbWF5YmUgdHJhbnNtaXR0ZWQgb3V0IGV2ZXJ5CisJCUJlYWNvbiBwZXJpb2QuCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY0VuYWJsZUlic3NTeW5jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKKwl1OCAqcHRyOworCXUzMiBpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIi0tLT5Bc2ljRW5hYmxlSWJzc1N5bmMoQURIT0MgbW9kZS4gTVBEVXRvdGFsQnl0ZUNvdW50ID0gJWQpXG4iLAorCQkgIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKKwljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOworCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOworCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIG1vdmUgQkVBQ09OIFRYRCBhbmQgZnJhbWUgY29udGVudCB0byBvbi1jaGlwIG1lbW9yeSAqLworCXB0ciA9ICh1OCAqKSYgcEFkLT5CZWFjb25UeFdJOworCWZvciAoaSA9IDA7IGkgPCBUWFdJX1NJWkU7IGkgKz0gNCkJLyogMTYtYnl0ZSBUWFdJIGZpZWxkICovCisJeworCQl1MzIgbG9uZ3B0ciA9CisJCSAgICAqcHRyICsgKCoocHRyICsgMSkgPDwgOCkgKyAoKihwdHIgKyAyKSA8PCAxNikgKworCQkgICAgKCoocHRyICsgMykgPDwgMjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIV19CRUFDT05fQkFTRTAgKyBpLCBsb25ncHRyKTsKKwkJcHRyICs9IDQ7CisJfQorCisJLyogc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZCAqLworCXB0ciA9IHBBZC0+QmVhY29uQnVmOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpICs9IDQpIHsKKwkJdTMyIGxvbmdwdHIgPQorCQkgICAgKnB0ciArICgqKHB0ciArIDEpIDw8IDgpICsgKCoocHRyICsgMikgPDwgMTYpICsKKwkJICAgICgqKHB0ciArIDMpIDw8IDI0KTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7CisJCXB0ciArPSA0OworCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkvKiBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkgKi8KKwlwdHIgPSAodTggKikmIHBBZC0+QmVhY29uVHhXSTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhXSV9TSVpFOyBpICs9IDIpCS8qIDE2LWJ5dGUgVFhXSSBmaWVsZCAqLworCXsKKwkJLyp1MzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7ICovCisJCS8qUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7ICovCisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIHB0ciwgMik7CisJCXB0ciArPSAyOworCX0KKworCS8qIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQgKi8KKwlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSArPSAyKSB7CisJCS8qdTMyIGxvbmdwdHIgPSAgKnB0ciArICgqKHB0cisxKTw8OCkgKyAoKihwdHIrMik8PDE2KSArICgqKHB0ciszKTw8MjQpOyAqLworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOyAqLworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBIV19CRUFDT05fQkFTRTAgKyBUWFdJX1NJWkUgKyBpLCBwdHIsIDIpOworCQlwdHIgKz0gMjsKKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkvKiAqLworCS8qIEZvciBXaS1GaSBmYWlseSBnZW5lcmF0ZWQgYmVhY29ucyBiZXR3ZWVuIHBhcnRpY2lwYXRpbmcgc3RhdGlvbnMuICovCisJLyogU2V0IFRCVFQgcGhhc2UgYWRhcHRpdmUgYWRqdXN0bWVudCBzdGVwIHRvIDh1cyAoZGVmYXVsdCAxNnVzKSAqLworCS8qIGRvbid0IGNoYW5nZSBzZXR0aW5ncyAyMDA2LTUtIGJ5IEplcnJ5ICovCisJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBUQlRUX1NZTkNfQ0ZHLCAweDAwMDAxMDEwKTsgKi8KKworCS8qIHN0YXJ0IHNlbmRpbmcgQkVBQ09OICovCisJY3NyOS5maWVsZC5CZWFjb25JbnRlcnZhbCA9IHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCA0OwkvKiBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgKi8KKwljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMTsKKwljc3I5LmZpZWxkLlRzZlN5bmNNb2RlID0gMjsJLyogc3luYyBUU0YgaW4gSUJTUyBtb2RlICovCisJY3NyOS5maWVsZC5iVEJUVEVuYWJsZSA9IDE7CisJY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIEFzaWNTZXRFZGNhUGFybShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSkKK3sKKwlFRENBX0FDX0NGR19TVFJVQyBBYzBDZmcsIEFjMUNmZywgQWMyQ2ZnLCBBYzNDZmc7CisJQUNfVFhPUF9DU1IwX1NUUlVDIGNzcjA7CisJQUNfVFhPUF9DU1IxX1NUUlVDIGNzcjE7CisJQUlGU05fQ1NSX1NUUlVDIEFpZnNuQ3NyOworCUNXTUlOX0NTUl9TVFJVQyBDd21pbkNzcjsKKwlDV01BWF9DU1JfU1RSVUMgQ3dtYXhDc3I7CisJaW50IGk7CisKKwlBYzBDZmcud29yZCA9IDA7CisJQWMxQ2ZnLndvcmQgPSAwOworCUFjMkNmZy53b3JkID0gMDsKKwlBYzNDZmcud29yZCA9IDA7CisJaWYgKChwRWRjYVBhcm0gPT0gTlVMTCkgfHwgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0RWRjYVBhcm1cbiIpKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CisJCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJCisJCQkgICAgfHwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGkpCisJCQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCZwQWQtPk1hY1RhYi4KKwkJCQkJCQkgQ29udGVudFtpXSwKKwkJCQkJCQkgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOworCQl9CisKKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQkvKiAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5IC4gKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyojaWZuZGVmIFdJRklfVEVTVCAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpIHsKKwkJCS8qIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlICovCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMHgyMDsJLyogU3VnZ2VzdCBieSBKb2huIGZvciBUeEJ1cnN0IGluIEhUIE1vZGUgKi8KKwkJfSBlbHNlCisJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLyogUUlEX0FDX0JFICovCisvKiNlbHNlICovCisvKiAgICAgICAgICAgICAgQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7ICAgICAgICAvLyBRSURfQUNfQkUgKi8KKy8qI2VuZGlmICovCisJCUFjMENmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOworCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKKwkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMjsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7CisKKwkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IDA7CS8qIFFJRF9BQ19CSyAqLworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMUNmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOworCisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpIHsKKwkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAxOTI7CS8qIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMgKi8KKwkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA5NjsJLyogQUNfVk86IDk2KjMydXMgIH49IDNtcyAqLworCQl9IGVsc2UgeworCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvKiBBQ19WSTogOTYqMzJ1cyB+PSAzbXMgKi8KKwkJCUFjM0NmZy5maWVsZC5BY1R4b3AgPSA0ODsJLyogQUNfVk86IDQ4KjMydXMgfj0gMS41bXMgKi8KKwkJfQorCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjMkNmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMyX0NGRywgQWMyQ2ZnLndvcmQpOworCQlBYzNDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7CisJCUFjM0NmZy5maWVsZC5BaWZzbiA9IDI7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOworCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gMDsJLyogUUlEX0FDX0JFICovCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CS8qIFFJRF9BQ19CSyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOworCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKSB7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSAxOTI7CS8qIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMgKi8KKwkJCWNzcjEuZmllbGQuQWMzVHhvcCA9IDk2OwkvKiBBQ19WTzogOTYqMzJ1cyAgfj0gM21zICovCisJCX0gZWxzZSB7CisJCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJLyogQUNfVkk6IDk2KjMydXMgfj0gM21zICovCisJCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA0ODsJLyogQUNfVk86IDQ4KjMydXMgfj0gMS41bXMgKi8KKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBDV19NSU5fSU5fQklUUzsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4xID0gQ1dfTUlOX0lOX0JJVFM7CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IENXX01JTl9JTl9CSVRTOworCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBDV19NSU5fSU5fQklUUzsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7CisKKwkJQ3dtYXhDc3Iud29yZCA9IDA7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IENXX01BWF9JTl9CSVRTOworCQlDd21heENzci5maWVsZC5Dd21heDEgPSBDV19NQVhfSU5fQklUUzsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gQ1dfTUFYX0lOX0JJVFM7CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IENXX01BWF9JTl9CSVRTOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNQVhfQ0ZHLCBDd21heENzci53b3JkKTsKKworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCAweDAwMDAyMjIyKTsKKworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTsKKwl9IGVsc2UgeworCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCk7CisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weS4gKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQkvKiAqLworCQkvKiBNb2RpZnkgQ3dtaW4vQ3dtYXgvVHhvcCBvbiBxdWV1ZVtRSURfQUNfVkldLCBSZWNvbW1lbmQgYnkgSmVycnkgMjAwNS8wNy8yNyAqLworCQkvKiBUbyBkZWdyYWRlIG91ciBWSURPIFF1ZXVlJ3MgdGhyb3VnaHB1dCBmb3IgV2lGaSBXTU0gUzNUMDcgSXNzdWUuICovCisJCS8qICovCisJCS8qcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDcgLyAxMDsgLy8gcnQyODYwYyBuZWVkIHRoaXMgKi8KKworCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07CisJCUFjMENmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXTsKKwkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdOworCQlBYzBDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07CS8qKzE7ICovCisKKwkJQWMxQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOworCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107CS8qKzI7ICovCisJCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOwkvKisxOyAqLworCisJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOworCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gKyAxOworCQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldICsgMTsKKwkJfSBlbHNlIHsKKwkJCUFjMkNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKKwkJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKKwkJfQorCQlBYzJDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gKyAxOworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlBYzJDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gKyAzOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJCXsKKwkJCS8qIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNiAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgorCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCQlBYzJDZmcuZmllbGQuQWlmc24gLT0gMTsKKworCQkJLyogVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyICovCisJCQkvKiBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YSAqLworCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCisJCQkgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKSB7CisJCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gMzsKKwkJCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gNTsKKwkJCX0KKyNpZmRlZiBSVDMweHgKKwkJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMAorCQkJICAgIHx8IHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSB7CisJCQkJLyogVHVuaW5nIGZvciBXaUZpIFdNTSBTMy1UMDc6IGNvbm5leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhLiAqLworCQkJCUFjMkNmZy5maWVsZC5BaWZzbiA9IDU7CisJCQl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisJCX0KKworCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT107CisJCUFjM0NmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXTsKKwkJQWMzQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVk9dOworCQlBYzNDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT107CisKKy8qI2lmZGVmIFdJRklfVEVTVCAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSB7CisJCQlpZiAoQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9PSAxMDIpIHsKKwkJCQlBYzBDZmcuZmllbGQuQWNUeG9wID0KKwkJCQkgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gPyBwRWRjYVBhcm0tPgorCQkJCSAgICBUeG9wW1FJRF9BQ19CRV0gOiAxMDsKKwkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV0gLSAxOwkvKiBBSUZTTiBtdXN0ID49IDEgKi8KKwkJCQlBYzFDZmcuZmllbGQuQWNUeG9wID0KKwkJCQkgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS107CisJCQkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0KKwkJCQkgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOworCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPQorCQkJCSAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXTsKKwkJCX0JLyogRW5kIG9mIGlmICovCisJCX0KKy8qI2VuZGlmIC8vIFdJRklfVEVTVCAvLyAqLworCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMzX0NGRywgQWMzQ2ZnLndvcmQpOworCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJLyogICAgICBETUEgUmVnaXN0ZXIgaGFzIGEgY29weSB0b28uICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJY3NyMC5maWVsZC5BYzBUeG9wID0gQWMwQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gQWMxQ2ZnLmZpZWxkLkFjVHhvcDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKKworCQljc3IxLmZpZWxkLkFjMlR4b3AgPSBBYzJDZmcuZmllbGQuQWNUeG9wOworCQljc3IxLmZpZWxkLkFjM1R4b3AgPSBBYzNDZmcuZmllbGQuQWNUeG9wOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IxLndvcmQpOworCisJCUN3bWluQ3NyLndvcmQgPSAwOworCQlDd21pbkNzci5maWVsZC5Dd21pbjAgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07CisJCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsKKwkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldOworCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gLSAxOwkvKmZvciBUR24gd2lmaSB0ZXN0ICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOworCisJCUN3bWF4Q3NyLndvcmQgPSAwOworCQlDd21heENzci5maWVsZC5Dd21heDAgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07CisJCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKKwkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgyID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldOworCQlDd21heENzci5maWVsZC5Dd21heDMgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT107CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOworCisJCUFpZnNuQ3NyLndvcmQgPSAwOworCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSBBYzBDZmcuZmllbGQuQWlmc247CS8qcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOyAqLworCQlBaWZzbkNzci5maWVsZC5BaWZzbjEgPSBBYzFDZmcuZmllbGQuQWlmc247CS8qcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAqLworCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc247CS8qcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOyAqLworCisJCXsKKwkJCS8qIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNiAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgorCQkJICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSBBYzJDZmcuZmllbGQuQWlmc24gLSA0OworCisJCQkvKiBUdW5pbmcgZm9yIFRHbiBXaS1GaSA1LjIuMzIgKi8KKwkJCS8qIFNUQSBUZXN0QmVkIGNoYW5nZXMgaW4gdGhpcyBpdGVtOiBjb25uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YSAqLworCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCisJCQkgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKSB7CisJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gMzsKKwkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSA3OworCQkJfQorCisJCQlpZiAoSU5GUkFfT04ocEFkKSkKKwkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgICBDb250ZW50W0JTU0lEX1dDSURdLAorCQkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKKwkJfQorCisJCXsKKwkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7CS8qcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0ICovCisjaWZkZWYgUlQzMHh4CisJCQkvKiBUT0RPOiBTaGlhbmcsIHRoaXMgbW9kaWZpY2F0aW9uIGFsc28gc3VpdGFibGUgZm9yIFJUMzA1Mi9SVDMwNTAgPz8/ICovCisJCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjAKKwkJCSAgICB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkgeworCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDB4MjsJLypwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07IC8vZm9yIFdpRmkgV01NIFM0LVQwNC4gKi8KKwkJCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQUlGU05fQ0ZHLCBBaWZzbkNzci53b3JkKTsKKworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSwgcEVkY2FQYXJtLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CisJCWlmICghQURIT0NfT04ocEFkKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiRURDQSBbIyVkXTogQUlGU04gQ1dtaW4gQ1dtYXggIFRYT1AodXMpICBBQ01cbiIsCisJCQkJICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiICAgICBBQ19CRSAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCSAgcEVkY2FQYXJtLT5BaWZzblswXSwgcEVkY2FQYXJtLT5Dd21pblswXSwKKwkJCQkgIHBFZGNhUGFybS0+Q3dtYXhbMF0sIHBFZGNhUGFybS0+VHhvcFswXSA8PCA1LAorCQkJCSAgcEVkY2FQYXJtLT5iQUNNWzBdKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIgICAgIEFDX0JLICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCisJCQkJICBwRWRjYVBhcm0tPkFpZnNuWzFdLCBwRWRjYVBhcm0tPkN3bWluWzFdLAorCQkJCSAgcEVkY2FQYXJtLT5Dd21heFsxXSwgcEVkY2FQYXJtLT5UeG9wWzFdIDw8IDUsCisJCQkJICBwRWRjYVBhcm0tPmJBQ01bMV0pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiAgICAgQUNfVkkgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKKwkJCQkgIHBFZGNhUGFybS0+QWlmc25bMl0sIHBFZGNhUGFybS0+Q3dtaW5bMl0sCisJCQkJICBwRWRjYVBhcm0tPkN3bWF4WzJdLCBwRWRjYVBhcm0tPlR4b3BbMl0gPDwgNSwKKwkJCQkgIHBFZGNhUGFybS0+YkFDTVsyXSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiICAgICBBQ19WTyAgICAgICUyZCAgICAgJTJkICAgICAlMmQgICAgICAlNGQgICAgICVkXG4iLAorCQkJCSAgcEVkY2FQYXJtLT5BaWZzblszXSwgcEVkY2FQYXJtLT5Dd21pblszXSwKKwkJCQkgIHBFZGNhUGFybS0+Q3dtYXhbM10sIHBFZGNhUGFybS0+VHhvcFszXSA8PCA1LAorCQkJCSAgcEVkY2FQYXJtLT5iQUNNWzNdKSk7CisJCX0KKwl9CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK3ZvaWQgQXNpY1NldFNsb3RUaW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSkKK3sKKwl1bnNpZ25lZCBsb25nIFNsb3RUaW1lOworCXUzMiBSZWdWYWx1ZSA9IDA7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisKKwlpZiAoYlVzZVNob3J0U2xvdFRpbWUKKwkgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCisJCXJldHVybjsKKwllbHNlIGlmICgoIWJVc2VTaG9ydFNsb3RUaW1lKQorCQkgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkpCisJCXJldHVybjsKKworCWlmIChiVXNlU2hvcnRTbG90VGltZSkKKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKwllbHNlCisJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKworCVNsb3RUaW1lID0gKGJVc2VTaG9ydFNsb3RUaW1lKSA/IDkgOiAyMDsKKworCXsKKwkJLyogZm9yY2UgdXNpbmcgc2hvcnQgU0xPVCB0aW1lIGZvciBGQUUgdG8gZGVtbyBwZXJmb3JtYW5jZSB3aGVuIFR4QnVyc3QgaXMgT04gKi8KKwkJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCisJCSAgICAgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpKQorCQkgICAgfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKQorCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0KKwkJCSAgICBCQV9OT1RVU0UpKQorCQkgICAgKSB7CisJCQkvKiBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdGhpbmsgaXQgaXMgZG9pbmcgV2ktRmkgdGVzdCAqLworCQkJLyogQW5kIHdlIHdpbGwgbm90IHNldCB0byBzaG9ydCBzbG90IHdoZW4gYkVuYWJsZVR4QnVyc3QgaXMgVFJVRS4gKi8KKwkJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkgeworCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKwkJCVNsb3RUaW1lID0gOTsKKwkJfQorCX0KKworCS8qICovCisJLyogRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuICovCisJLyogKi8KKwkvKiBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQiAqLworCS8qICovCisJeworCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKKwkJCVNsb3RUaW1lID0gMjA7CisJCX0KKwl9CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCAmUmVnVmFsdWUpOworCVJlZ1ZhbHVlID0gUmVnVmFsdWUgJiAweEZGRkZGRjAwOworCisJUmVnVmFsdWUgfD0gU2xvdFRpbWU7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBCS09GRl9TTE9UX0NGRywgUmVnVmFsdWUpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlBZGQgU2hhcmVkIGtleSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMuCisJCVVwZGF0ZSBzaGFyZWQga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBTaGFyZWQga2V5IHRhYmxlCisJCVVwZGF0ZSBpdHMgY2lwaGVyQWxnIHRvIEFzaWMgU2hhcmVkIGtleSBNb2RlLgorCisgICAgUmV0dXJuOgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4IEJzc0luZGV4LAorCQkJICAgdTggS2V5SWR4LAorCQkJICAgdTggQ2lwaGVyQWxnLAorCQkJICAgdTggKnBLZXksIHU4ICpwVHhNaWMsIHU4ICpwUnhNaWMpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CQkvKiwgY3NyMDsgKi8KKwlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCWludCBpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzaWNBZGRTaGFyZWRLZXlFbnRyeSBCc3NJbmRleD0lZCwgS2V5SWR4PSVkXG4iLCBCc3NJbmRleCwKKwkJICBLZXlJZHgpKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwKKwkJICBCc3NJbmRleCAqIDQgKyBLZXlJZHgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCSAgICAgKCIJCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgIHBLZXlbMF0sIHBLZXlbMV0sIHBLZXlbMl0sIHBLZXlbM10sIHBLZXlbNF0sCisJCSAgICAgIHBLZXlbNV0sIHBLZXlbNl0sIHBLZXlbN10sIHBLZXlbOF0sIHBLZXlbOV0sCisJCSAgICAgIHBLZXlbMTBdLCBwS2V5WzExXSwgcEtleVsxMl0sIHBLZXlbMTNdLCBwS2V5WzE0XSwKKwkJICAgICAgcEtleVsxNV0pKTsKKwlpZiAocFJ4TWljKSB7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCIJCVJ4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgICAgICBwUnhNaWNbMF0sIHBSeE1pY1sxXSwgcFJ4TWljWzJdLCBwUnhNaWNbM10sCisJCQkgICAgICBwUnhNaWNbNF0sIHBSeE1pY1s1XSwgcFJ4TWljWzZdLCBwUnhNaWNbN10pKTsKKwl9CisJaWYgKHBUeE1pYykgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiCQlUeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgcFR4TWljWzBdLCBwVHhNaWNbMV0sIHBUeE1pY1syXSwgcFR4TWljWzNdLAorCQkJICAgICAgcFR4TWljWzRdLCBwVHhNaWNbNV0sIHBUeE1pY1s2XSwgcFR4TWljWzddKSk7CisJfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCS8qICovCisJLyogZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMgKi8KKwkvKiAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQorCW9mZnNldCA9CisJICAgIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0ICogQnNzSW5kZXggKyBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOyBpKyspIHsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7CisJaWYgKHBUeE1pYykgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7CisJCX0KKwl9CisKKwlvZmZzZXQgKz0gODsKKwlpZiAocFJ4TWljKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwl7CisJCW9mZnNldCA9CisJCSAgICBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsKKwkJCQkJICAgICBLZXlJZHgpICogSFdfS0VZX0VOVFJZX1NJWkU7CisJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9TSEFSRV9LRVkpOworCisJCW9mZnNldCArPSBNQVhfTEVOX09GX1NIQVJFX0tFWTsKKwkJaWYgKHBUeE1pYykgeworCQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOworCQl9CisKKwkJb2Zmc2V0ICs9IDg7CisJCWlmIChwUnhNaWMpIHsKKwkJCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCS8qICovCisJLyogVXBkYXRlIGNpcGhlciBhbGdvcml0aG0uIFdTVEEgYWx3YXlzIHVzZSBCU1MwICovCisJLyogKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLAorCQkgICAgICAgJmNzcjEud29yZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJlYWQ6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSBLZXlJZHhbJWRdPSAweCV4IFxuIiwKKwkJICBCc3NJbmRleCwgS2V5SWR4LCBjc3IxLndvcmQpKTsKKwlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkgeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwl9IGVsc2UgeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQllbHNlIGlmIChLZXlJZHggPT0gMSkKKwkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwl9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwKKwkJICBCc3NJbmRleCwgY3NyMS53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCQljc3IxLndvcmQpOworCit9CisKKy8qICAgICAgSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBCc3NJbmRleCwgdTggS2V5SWR4KQoreworCS8qdW5zaWduZWQgbG9uZyBTZWNDc3IwOyAqLworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCAqIDQgKyBLZXlJZHgpKTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksCisJCSAgICAgICAmY3NyMS53b3JkKTsKKwlpZiAoKEJzc0luZGV4ICUgMikgPT0gMCkgeworCQlpZiAoS2V5SWR4ID09IDApCisJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKKwkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCisJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKKwkJZWxzZQorCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKEtleUlkeCA9PSAwKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IDA7CisJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IDA7CisJCWVsc2UKKwkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSAwOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLAorCQkgIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwKKwkJCWNzcjEud29yZCk7CisJQVNTRVJUKEJzc0luZGV4IDwgNCk7CisJQVNTRVJUKEtleUlkeCA8IDQpOworCit9CisKK3ZvaWQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MTYgV0NJRCwKKwkJCSAgICAgdTggQnNzSW5kZXgsCisJCQkgICAgIHU4IENpcGhlckFsZywKKwkJCSAgICAgSU4gQk9PTEVBTiBiVXNlUGFpcmV3aXNlS2V5VGFibGUpCit7CisJdW5zaWduZWQgbG9uZyBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7CisKKwkvKiAqLworCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4gKi8KKwkvKiBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4gKi8KKwkvKiAqLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9CisJICAgIChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Cit9CisKK3ZvaWQgQXNpY1VwZGF0ZVdDSURJVkVJVihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IFdDSUQsIHVuc2lnbmVkIGxvbmcgdUlWLCB1bnNpZ25lZCBsb25nIHVFSVYpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7CisJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Cit9CisKK3ZvaWQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHUxNiBXQ0lELCB1OCAqcEFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBBZGRyOworCisJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKKwlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyAocEFkZHJbMl0gPDwgMTYpICsgKHBBZGRyWzNdIDw8IDI0KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIEFkZHIpOworCUFkZHIgPSBwQWRkcls0XSArIChwQWRkcls1XSA8PCA4KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyA0LCBBZGRyKTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJvdXRpbmUgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYworCisgICAgQXJndW1lbnRzOgorICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCisgICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgorICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KKyAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAorICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCisgICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKKyAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCisKKyAgICBSZXR1cm4gVmFsdWU6CisgICAgICAgIE5vbmUKKworICAgIE5vdGU6CisgICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAorICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCisKKyAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKKyAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KKworICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCisgICAgICAgIFJYIGtleQorCisJRm9yIEFQIG1vZGUgYlR4S2V5IG11c3QgYmUgYWx3YXlzIHNldCB0byBUUlVFLgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgQXNpY0FkZEtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB1MTYgV0NJRCwKKwkJICAgICB1OCBCc3NJbmRleCwKKwkJICAgICB1OCBLZXlJZHgsCisJCSAgICAgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBDaXBoZXJLZXksCisJCSAgICAgSU4gQk9PTEVBTiBiVXNlUGFpcmV3aXNlS2V5VGFibGUsIElOIEJPT0xFQU4gYlR4S2V5KQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworLyogICAgICB1bnNpZ25lZCBsb25nICAgV0NJREF0dHJpID0gMDsgKi8KKwl1OCBJVjQgPSAwOworCXU4ICpwS2V5ID0gcENpcGhlcktleS0+S2V5OworLyogICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBLZXlMZW4gPSBwQ2lwaGVyS2V5LT5LZXlMZW47ICovCisJdTggKnBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCXU4ICpwUnhNaWMgPSBwQ2lwaGVyS2V5LT5SeE1pYzsKKwl1OCAqcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7CisJdTggQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOworCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJdTggaTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworLyogICAgICBBU1NFUlQoS2V5TGVuIDw9IE1BWF9MRU5fT0ZfUEVFUl9LRVkpOyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IEFzaWNBZGRLZXlFbnRyeVxuIikpOworCS8qICovCisJLyogMS4pIGRlY2lkZSBrZXkgdGFibGUgb2Zmc2V0ICovCisJLyogKi8KKwlpZiAoYlVzZVBhaXJld2lzZUtleVRhYmxlKQorCQlvZmZzZXQgPSBQQUlSV0lTRV9LRVlfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfS0VZX0VOVFJZX1NJWkUpOworCWVsc2UKKwkJb2Zmc2V0ID0KKwkJICAgIFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0ICogQnNzSW5kZXggKworCQkJCQkgICAgIEtleUlkeCkgKiBIV19LRVlfRU5UUllfU0laRTsKKworCS8qICovCisJLyogMi4pIFNldCBLZXkgdG8gQXNpYyAqLworCS8qICovCisJLypmb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkrKykgeworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOworCX0KKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8qICovCisJLyogMy4pIFNldCBNSUMga2V5IGlmIGF2YWlsYWJsZSAqLworCS8qICovCisJaWYgKHBUeE1pYykgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7CisJCX0KKwl9CisJb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKKworCWlmIChwUnhNaWMpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOworCQl9CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7CisJb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7CisKKwkvKiAqLworCS8qIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUgKi8KKwkvKiAqLworCWlmIChwVHhNaWMpIHsKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCBwVHhNaWMsIDgpOworCX0KKwlvZmZzZXQgKz0gTEVOX1RLSVBfVFhNSUNLOworCisJaWYgKHBSeE1pYykgeworCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBSeE1pYywgOCk7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJLyogKi8KKwkvKiA0LikgTW9kaWZ5IElWL0VJViBpZiBuZWVkcyAqLworCS8qICAgICBUaGlzIHdpbGwgZm9yY2UgQXNpYyB0byB1c2UgdGhpcyBrZXkgSUQgYnkgc2V0dGluZyBJVi4gKi8KKwkvKiAqLworCWlmIChiVHhLZXkpIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOworCQkvKiAqLworCQkvKiBXcml0ZSBJViAqLworCQkvKiAqLworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCwgcFR4dHNjWzFdKTsKKwkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAxLCAoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikpOworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDIsIHBUeHRzY1swXSk7CisKKwkJSVY0ID0gKEtleUlkeCA8PCA2KTsKKwkJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykKKwkJICAgIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJCQlJVjQgfD0gMHgyMDsJLyogdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UgKi8KKworCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDMsIElWNCk7CisKKwkJLyogKi8KKwkJLyogV3JpdGUgRUlWICovCisJCS8qICovCisJCW9mZnNldCArPSA0OworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeHRzY1tpICsgMl0pOworCQl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCXUzMiB0bXBWYWw7CisKKwkJLyogKi8KKwkJLyogV3JpdGUgSVYgKi8KKwkJLyogKi8KKwkJSVY0ID0gKEtleUlkeCA8PCA2KTsKKwkJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCisJCSAgICB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykKKwkJICAgIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCisJCQlJVjQgfD0gMHgyMDsJLyogdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UgKi8KKworCQl0bXBWYWwgPQorCQkgICAgcFR4dHNjWzFdICsgKCgocFR4dHNjWzFdIHwgMHgyMCkgJiAweDdmKSA8PCA4KSArCisJCSAgICAocFR4dHNjWzBdIDw8IDE2KSArIChJVjQgPDwgMjQpOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHRtcFZhbCk7CisKKwkJLyogKi8KKwkJLyogV3JpdGUgRUlWICovCisJCS8qICovCisJCW9mZnNldCArPSA0OworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsICoodTMyICopJiBwQ2lwaGVyS2V5LT5UeFRzY1syXSk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLAorCQkJCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpOworCX0KKworCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKSB7CisJCS8qICovCisJCS8qIE9ubHkgdXBkYXRlIHRoZSBzaGFyZWQga2V5IHNlY3VyaXR5IG1vZGUgKi8KKwkJLyogKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwKKwkJCSAgICAgICAmY3NyMS53b3JkKTsKKwkJaWYgKChCc3NJbmRleCAlIDIpID09IDApIHsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfSBlbHNlIHsKKwkJCWlmIChLZXlJZHggPT0gMCkKKwkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOworCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQorCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQllbHNlCisJCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJfQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwKKwkJCQljc3IxLndvcmQpOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBBc2ljQWRkS2V5RW50cnlcbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgorCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4ICpwQWRkciwKKwkJCSAgICAgdTggV0NJRCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBDaXBoZXJLZXkpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdTggKnBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7CisJdTggKnBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOworCXU4ICpwUnhNaWMgPSBwQ2lwaGVyS2V5LT5SeE1pYzsKKyNpZmRlZiBEQkcKKwl1OCBDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7CisjZW5kaWYgLyogREJHIC8vICovCisKKwkvKiBFS0VZICovCisJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKSB7CisJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcEtleVtpXSk7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPktleVswXSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfUEVFUl9LRVk7IGkgKz0gNCkgeworCQl1MzIgVmFsdWU7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgb2Zmc2V0ICsgaSwgJlZhbHVlKTsKKwl9CisKKwlvZmZzZXQgKz0gTUFYX0xFTl9PRl9QRUVSX0tFWTsKKworCS8qICBNSUMgS0VZICovCisJaWYgKHBUeE1pYykgeworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7CisJCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+VHhNaWNbMF0sIDgpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCX0KKwlvZmZzZXQgKz0gODsKKwlpZiAocFJ4TWljKSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsICZwQ2lwaGVyS2V5LT5SeE1pY1swXSwgOCk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzaWNBZGRQYWlyd2lzZUtleUVudHJ5OiBXQ0lEICMlZCBBbGc9JXNcbiIsIFdDSUQsCisJCSAgQ2lwaGVyTmFtZVtDaXBoZXJBbGddKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIglLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkgIHBLZXlbMF0sIHBLZXlbMV0sIHBLZXlbMl0sIHBLZXlbM10sIHBLZXlbNF0sIHBLZXlbNV0sCisJCSAgcEtleVs2XSwgcEtleVs3XSwgcEtleVs4XSwgcEtleVs5XSwgcEtleVsxMF0sIHBLZXlbMTFdLAorCQkgIHBLZXlbMTJdLCBwS2V5WzEzXSwgcEtleVsxNF0sIHBLZXlbMTVdKSk7CisJaWYgKHBSeE1pYykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIglSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICBwUnhNaWNbMF0sIHBSeE1pY1sxXSwgcFJ4TWljWzJdLCBwUnhNaWNbM10sCisJCQkgIHBSeE1pY1s0XSwgcFJ4TWljWzVdLCBwUnhNaWNbNl0sIHBSeE1pY1s3XSkpOworCX0KKwlpZiAocFR4TWljKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgIHBUeE1pY1swXSwgcFR4TWljWzFdLCBwVHhNaWNbMl0sIHBUeE1pY1szXSwKKwkJCSAgcFR4TWljWzRdLCBwVHhNaWNbNV0sIHBUeE1pY1s2XSwgcFR4TWljWzddKSk7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlSZW1vdmUgUGFpci13aXNlIGtleSBtYXRlcmlhbCBmcm9tIEFTSUMuCisKKyAgICBSZXR1cm46CisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTggQnNzSWR4LCB1OCBXY2lkKQoreworCXVuc2lnbmVkIGxvbmcgV0NJREF0dHJpOworCXUxNiBvZmZzZXQ7CisKKwkvKiByZS1zZXQgdGhlIGVudHJ5J3MgV0NJRCBhdHRyaWJ1dGUgYXMgT1BFTi1OT05FLiAqLworCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOworCVdDSURBdHRyaSA9IChCc3NJZHggPDwgNCkgfCBQQUlSV0lTRUtFWVRBQkxFOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKK30KKworQk9PTEVBTiBBc2ljU2VuZENvbW1hbmRUb01jdShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IENvbW1hbmQsCisJCQkgICAgIHU4IFRva2VuLCB1OCBBcmcwLCB1OCBBcmcxKQoreworCisJaWYgKHBBZC0+Y2hpcE9wcy5zZW5kQ29tbWFuZFRvTWN1KQorCQlwQWQtPmNoaXBPcHMuc2VuZENvbW1hbmRUb01jdShwQWQsIENvbW1hbmQsIFRva2VuLCBBcmcwLCBBcmcxKTsKKworCXJldHVybiBUUlVFOworfQorCit2b2lkIEFzaWNTZXRSeEFudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEFudCkKK3sKKyNpZmRlZiBSVDMweHgKKwkvKiBSVDM1NzIgQVRFIG5lZWQgbm90IHRvIGRvIHRoaXMuICovCisJUlQzMHh4U2V0UnhBbnQocEFkLCBBbnQpOworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworfQorCit2b2lkIEFzaWNUdXJuT2ZmUkZDbGsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKQoreworCWlmIChwQWQtPmNoaXBPcHMuQXNpY1JmVHVybk9mZikgeworCQlwQWQtPmNoaXBPcHMuQXNpY1JmVHVybk9mZihwQWQpOworCX0gZWxzZSB7CisJCS8qIFJGIFIyIGJpdCAxOCA9IDAgKi8KKwkJdTMyIFIxID0gMCwgUjIgPSAwLCBSMyA9IDA7CisJCXU4IGluZGV4OworCQlzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzICpSRlJlZ1RhYmxlOworCisJCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpIHsKKwkJY2FzZSBSRklDXzI4MjA6CisJCWNhc2UgUkZJQ18yODUwOgorCQljYXNlIFJGSUNfMjcyMDoKKwkJY2FzZSBSRklDXzI3NTA6CisKKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspIHsKKwkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKSB7CisJCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjEgJiAweGZmZmZkZmZmOworCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyICYgMHhmZmZiZmZmZjsKKwkJCQkJUjMgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmM2ZmZmY7CisKKwkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7CisKKwkJCQkJLyogUHJvZ3JhbSBSMWIxMyB0byAxLCBSMy9iMTgsMTkgdG8gMCwgUjJiMTggdG8gMC4gKi8KKwkJCQkJLyogU2V0IFJGIFIyIGJpdDE4PTAsIFIzIGJpdFsxODoxOV09MCAqLworCQkJCQkvKmlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpICovCisJCQkJCWlmICgxKSB7CisJCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7CisKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHgsICBSMyA9IDB4JTA4eCBcbiIsCisJCQkJCQkJICBDaGFubmVsLAorCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwgUjIsCisJCQkJCQkJICBSMykpOworCQkJCQl9IGVsc2UKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAoIkFzaWNUdXJuT2ZmUkZDbGsjJWQoUkY9JWQsICkgLCBSMj0weCUwOHggXG4iLAorCQkJCQkJCSAgQ2hhbm5lbCwKKwkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsIFIyKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBBc2ljVHVybk9uUkZDbGsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKQoreworCS8qIFJGIFIyIGJpdCAxOCA9IDAgKi8KKwl1MzIgUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKKwl1OCBpbmRleDsKKwlzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzICpSRlJlZ1RhYmxlOworCisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisJLyogVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4ICovCisJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpIHsKKwkJcmV0dXJuOworCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKworCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKKworCXN3aXRjaCAocEFkLT5SZkljVHlwZSkgeworCWNhc2UgUkZJQ18yODIwOgorCWNhc2UgUkZJQ18yODUwOgorCWNhc2UgUkZJQ18yNzIwOgorCWNhc2UgUkZJQ18yNzUwOgorCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl8yODUwX0NITkw7IGluZGV4KyspIHsKKwkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpIHsKKwkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7CisJCQkJUjMgJj0gMHhmZmYzZmZmZjsKKwkJCQlSMyB8PSAweDAwMDgwMDAwOworCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKKworCQkJCVIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7CisJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOworCisJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKKwkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSB7CisJCQkJCVIyIHw9IDB4NDAwMDsJLyogSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7ICovCisJCQkJfQorCisJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikgeworCQkJCQlSMiB8PSAweDQwOwkvKiB3cml0ZSAxIHRvIG9mZiBSeHBhdGguICovCisJCQkJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpIHsKKwkJCQkJUjIgfD0gMHgyMDA0MDsJLyogd3JpdGUgMSB0byBvZmYgUnhQYXRoICovCisJCQkJfQorCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAorCQkJCSAgQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9jZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGY0MzkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2NmZy5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorCWNtbV9jZmcuYworCisgICAgQWJzdHJhY3Q6CisgICAgUmFsaW5rIFdpRmkgRHJpdmVyIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBzdWJyb3V0aW5lcworCisgICAgUmV2aXNpb24gSGlzdG9yeToKKyAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgorCitjaGFyICpHZXRQaHlNb2RlKGludCBNb2RlKQoreworCXN3aXRjaCAoTW9kZSkgeworCWNhc2UgTU9ERV9DQ0s6CisJCXJldHVybiAiQ0NLIjsKKworCWNhc2UgTU9ERV9PRkRNOgorCQlyZXR1cm4gIk9GRE0iOworCWNhc2UgTU9ERV9IVE1JWDoKKwkJcmV0dXJuICJIVE1JWCI7CisKKwljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgorCQlyZXR1cm4gIkdSRUVOIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIk4vQSI7CisJfQorfQorCitjaGFyICpHZXRCVyhpbnQgQlcpCit7CisJc3dpdGNoIChCVykgeworCWNhc2UgQldfMTA6CisJCXJldHVybiAiMTBNIjsKKworCWNhc2UgQldfMjA6CisJCXJldHVybiAiMjBNIjsKKwljYXNlIEJXXzQwOgorCQlyZXR1cm4gIjQwTSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJOL0EiOworCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24gdG8gcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbi4KKyAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRfQ2ZnU2V0Q291bnRyeVJlZ2lvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZywgaW50IGJhbmQpCit7CisJbG9uZyByZWdpb24sIHJlZ2lvbk1heDsKKwl1OCAqcENvdW50cnlSZWdpb247CisKKwlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKGJhbmQgPT0gQkFORF8yNEcpIHsKKwkJcENvdW50cnlSZWdpb24gPSAmcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbjsKKwkJcmVnaW9uTWF4ID0gUkVHSU9OX01BWElNVU1fQkdfQkFORDsKKwl9IGVsc2UgeworCQlwQ291bnRyeVJlZ2lvbiA9ICZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7CisJCXJlZ2lvbk1heCA9IFJFR0lPTl9NQVhJTVVNX0FfQkFORDsKKwl9CisKKwkvKiBUT0RPOiBJcyBpdCBuZWNjZXNheSBmb3IgZm9sbG93aW5nIGNoZWNrPz8/ICovCisJLyogQ291bnRyeSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBFRVBST00gbm90IHByb2dyYW1tZWQgKi8KKwlpZiAoKnBDb3VudHJ5UmVnaW9uICYgMHg4MCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkNmZ1NldENvdW50cnlSZWdpb24oKTpDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSB3YXMgcHJvZ3JhbW1lZFxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChyZWdpb24gPj0gMCkgJiYgKHJlZ2lvbiA8PSBSRUdJT05fTUFYSU1VTV9CR19CQU5EKSkgeworCQkqcENvdW50cnlSZWdpb24gPSAodTgpcmVnaW9uOworCX0gZWxzZSBpZiAoKHJlZ2lvbiA9PSBSRUdJT05fMzFfQkdfQkFORCkgJiYgKGJhbmQgPT0gQkFORF8yNEcpKSB7CisJCSpwQ291bnRyeVJlZ2lvbiA9ICh1OClyZWdpb247CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJDZmdTZXRDb3VudHJ5UmVnaW9uKCk6cmVnaW9uKCVsZCkgb3V0IG9mIHJhbmdlIVxuIiwKKwkJCSAgcmVnaW9uKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQoreworCWludCBNYXhQaHlNb2RlID0gUEhZXzExRzsKKwlsb25nIFdpcmVsZXNzTW9kZTsKKworCU1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOworCisJV2lyZWxlc3NNb2RlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlpZiAoV2lyZWxlc3NNb2RlIDw9IE1heFBoeU1vZGUpIHsKKwkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFdpcmVsZXNzTW9kZTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworCit9CisKK2ludCBSVF9DZmdTZXRTaG9ydFNsb3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpCit7CisJbG9uZyBTaG9ydFNsb3Q7CisKKwlTaG9ydFNsb3QgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOworCisJaWYgKFNob3J0U2xvdCA9PSAxKQorCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7CisJZWxzZSBpZiAoU2hvcnRTbG90ID09IDApCisJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gRkFMU0U7CS8qSW52YWxpZCBhcmd1bWVudCAqLworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdFUCBLRVkgYmFzZSBvbiBLZXlJZHgKKyAgICBSZXR1cm46CisgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVF9DZmdTZXRXZXBLZXkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgY2hhciAqa2V5U3RyaW5nLAorCQkgICAgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBTaGFyZWRLZXksIGludCBrZXlJZHgpCit7CisJaW50IEtleUxlbjsKKwlpbnQgaTsKKwl1OCBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwlCT09MRUFOIGJLZXlJc0hleCA9IEZBTFNFOworCisJLyogVE9ETzogU2hhbGwgd2UgZG8gbWVtc2V0IGZvciB0aGUgb3JpZ2luYWwga2V5IGluZm8/PyAqLworCW1lbXNldChwU2hhcmVkS2V5LCAwLCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwlLZXlMZW4gPSBzdHJsZW4oa2V5U3RyaW5nKTsKKwlzd2l0Y2ggKEtleUxlbikgeworCWNhc2UgNToJCS8qd2VwIDQwIEFzY2lpIHR5cGUgKi8KKwljYXNlIDEzOgkJLyp3ZXAgMTA0IEFzY2lpIHR5cGUgKi8KKwkJYktleUlzSGV4ID0gRkFMU0U7CisJCXBTaGFyZWRLZXktPktleUxlbiA9IEtleUxlbjsKKwkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+S2V5LCBrZXlTdHJpbmcsIEtleUxlbik7CisJCWJyZWFrOworCisJY2FzZSAxMDoJCS8qd2VwIDQwIEhleCB0eXBlICovCisJY2FzZSAyNjoJCS8qd2VwIDEwNCBIZXggdHlwZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgS2V5TGVuOyBpKyspIHsKKwkJCWlmICghaXN4ZGlnaXQoKihrZXlTdHJpbmcgKyBpKSkpCisJCQkJcmV0dXJuIEZBTFNFOwkvKk5vdCBIZXggdmFsdWU7ICovCisJCX0KKwkJYktleUlzSGV4ID0gVFJVRTsKKwkJcFNoYXJlZEtleS0+S2V5TGVuID0gS2V5TGVuIC8gMjsKKwkJQXRvSChrZXlTdHJpbmcsIHBTaGFyZWRLZXktPktleSwgcFNoYXJlZEtleS0+S2V5TGVuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLypJbnZhbGlkIGFyZ3VtZW50ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRfQ2ZnU2V0V2VwS2V5KGtleUlkeD0lZCk6SW52YWxpZCBhcmd1bWVudCAoYXJnPSVzKVxuIiwKKwkJCSAga2V5SWR4LCBrZXlTdHJpbmcpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9ICgoS2V5TGVuICUgNSkgPyBDSVBIRVJfV0VQMTI4IDogQ0lQSEVSX1dFUDY0KTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRfQ2ZnU2V0V2VwS2V5OihLZXlJZHg9JWQsdHlwZT0lcywgQWxnPSVzKVxuIiwga2V5SWR4LAorCQkgIChiS2V5SXNIZXggPT0gRkFMU0UgPyAiQXNjaWkiIDogIkhleCIpLAorCQkgIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgU2V0IFdQQSBQU0sga2V5CisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIHBBZGFwdGVyCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgICAga2V5U3RyaW5nCVdQQSBwcmUtc2hhcmVkIGtleSBzdHJpbmcKKyAgICAgICAgcEhhc2hTdHIJU3RyaW5nIHVzZWQgZm9yIHBhc3N3b3JkIGhhc2ggZnVuY3Rpb24KKyAgICAgICAgaGFzaFN0ckxlbglMZW5naHQgb2YgdGhlIGhhc2ggc3RyaW5nCisgICAgICAgIHBQTUtCdWYJCU91dHB1dCBidWZmZXIgb2YgV1BBUFNLIGtleQorCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRfQ2ZnU2V0V1BBUFNLS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIGNoYXIgKmtleVN0cmluZywKKwkJICAgICAgIHU4ICogcEhhc2hTdHIsCisJCSAgICAgICBpbnQgaGFzaFN0ckxlbiwgdTggKnBQTUtCdWYpCit7CisJaW50IGtleUxlbjsKKwl1OCBrZXlNYXRlcmlhbFs0MF07CisKKwlrZXlMZW4gPSBzdHJsZW4oa2V5U3RyaW5nKTsKKwlpZiAoKGtleUxlbiA8IDgpIHx8IChrZXlMZW4gPiA2NCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJXUEFQU0sgS2V5IGxlbmd0aCglZCkgZXJyb3IsIHJlcXVpcmVkIDggfiA2NCBjaGFyYWN0ZXJzIShrZXlTdHI9JXMpXG4iLAorCQkJICBrZXlMZW4sIGtleVN0cmluZykpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJbWVtc2V0KHBQTUtCdWYsIDAsIDMyKTsKKwlpZiAoa2V5TGVuID09IDY0KSB7CisJCUF0b0goa2V5U3RyaW5nLCBwUE1LQnVmLCAzMik7CisJfSBlbHNlIHsKKwkJUGFzc3dvcmRIYXNoKGtleVN0cmluZywgcEhhc2hTdHIsIGhhc2hTdHJMZW4sIGtleU1hdGVyaWFsKTsKKwkJTmRpc01vdmVNZW1vcnkocFBNS0J1Ziwga2V5TWF0ZXJpYWwsIDMyKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YS5jCmluZGV4IDc3NGZhYmIuLjY4MjYzY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGEuYwpAQCAtMjcsNTAgKzI3LDU4IEBACiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotI2RlZmluZSBNQVhfVFhfSU5fVEJUVAkJKDE2KQordTggU05BUF84MDJfMUhbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OwordTggU05BUF9CUklER0VfVFVOTkVMW10gPSB7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjggfTsKIAorLyogQWRkIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZSBmb3IgQ0NYMiBzdXBwb3J0ICovCit1OCBTTkFQX0FJUk9ORVRbXSA9IHsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMCB9OwordTggQ0tJUF9MTENfU05BUFtdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAyIH07Cit1OCBFQVBPTF9MTENfU05BUFtdID0geyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDhlIH07Cit1OCBFQVBPTFtdID0geyAweDg4LCAweDhlIH07Cit1OCBUUElEW10gPSB7IDB4ODEsIDB4MDAgfTsJLyogVkxBTiByZWxhdGVkICovCiAKLVVDSEFSCVNOQVBfODAyXzFIW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07Ci1VQ0hBUglTTkFQX0JSSURHRV9UVU5ORUxbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4fTsKLS8vIEFkZCBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGUgZm9yIENDWDIgc3VwcG9ydAotVUNIQVIJU05BUF9BSVJPTkVUW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMH07Ci1VQ0hBUglDS0lQX0xMQ19TTkFQW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMn07Ci1VQ0hBUglFQVBPTF9MTENfU05BUFtdPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4ZX07Ci1VQ0hBUglFQVBPTFtdID0gezB4ODgsIDB4OGV9OwotVUNIQVIgICBUUElEW10gPSB7MHg4MSwgMHgwMH07IC8qIFZMQU4gcmVsYXRlZCAqLwordTggSVBYW10gPSB7IDB4ODEsIDB4MzcgfTsKK3U4IEFQUExFX1RBTEtbXSA9IHsgMHg4MCwgMHhmMyB9OwogCi1VQ0hBUglJUFhbXSA9IHsweDgxLCAweDM3fTsKLVVDSEFSCUFQUExFX1RBTEtbXSA9IHsweDgwLCAweGYzfTsKLVVDSEFSCVJhdGVJZFRvUGxjcFNpZ25hbFsxMl0gPSB7Ci0JIDAsIC8qIFJBVEVfMSAqLwkxLCAvKiBSQVRFXzIgKi8gCTIsIC8qIFJBVEVfNV81ICovCTMsIC8qIFJBVEVfMTEgKi8JLy8gc2VlIEJCUCBzcGVjCi0JMTEsIC8qIFJBVEVfNiAqLyAgIDE1LCAvKiBSQVRFXzkgKi8gICAgMTAsIC8qIFJBVEVfMTIgKi8gICAxNCwgLyogUkFURV8xOCAqLwkvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0Ci0JIDksIC8qIFJBVEVfMjQgKi8gIDEzLCAvKiBSQVRFXzM2ICovCTgsIC8qIFJBVEVfNDggKi8gICAxMiAgLyogUkFURV81NCAqLyB9OyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0Cit1OCBSYXRlSWRUb1BsY3BTaWduYWxbMTJdID0geworCTAsIC8qIFJBVEVfMSAqLyAxLCAvKiBSQVRFXzIgKi8gMiwgLyogUkFURV81XzUgKi8gMywJLyogUkFURV8xMSAqLy8qIHNlZSBCQlAgc3BlYyAqLworCTExLCAvKiBSQVRFXzYgKi8gMTUsIC8qIFJBVEVfOSAqLyAxMCwgLyogUkFURV8xMiAqLyAxNCwJLyogUkFURV8xOCAqLy8qIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQgKi8KKwk5LCAvKiBSQVRFXzI0ICovIDEzLCAvKiBSQVRFXzM2ICovIDgsIC8qIFJBVEVfNDggKi8gMTIgLyogUkFURV81NCAqLworfTsJCQkJLyogc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNCAqLwogCi1VQ0hBUgkgT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA9IHsKLQlSQVRFXzU0LCAgUkFURV81NCwJUkFURV81NCwgIFJBVEVfNTQsCS8vIE9GRE0gUExDUCBTaWduYWwgPSAwLCAgMSwgIDIsICAzIHJlc3BlY3RpdmVseQotCVJBVEVfNTQsICBSQVRFXzU0LAlSQVRFXzU0LCAgUkFURV81NCwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDQsICA1LCAgNiwgIDcgcmVzcGVjdGl2ZWx5Ci0JUkFURV80OCwgIFJBVEVfMjQsCVJBVEVfMTIsICBSQVRFXzYsCS8vIE9GRE0gUExDUCBTaWduYWwgPSA4LCAgOSwgIDEwLCAxMSByZXNwZWN0aXZlbHkKLQlSQVRFXzU0LCAgUkFURV8zNiwJUkFURV8xOCwgIFJBVEVfOSwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDEyLCAxMywgMTQsIDE1IHJlc3BlY3RpdmVseQordTggT2ZkbVNpZ25hbFRvUmF0ZUlkWzE2XSA9IHsKKwlSQVRFXzU0LCBSQVRFXzU0LCBSQVRFXzU0LCBSQVRFXzU0LAkvKiBPRkRNIFBMQ1AgU2lnbmFsID0gMCwgIDEsICAyLCAgMyByZXNwZWN0aXZlbHkgKi8KKwlSQVRFXzU0LCBSQVRFXzU0LCBSQVRFXzU0LCBSQVRFXzU0LAkvKiBPRkRNIFBMQ1AgU2lnbmFsID0gNCwgIDUsICA2LCAgNyByZXNwZWN0aXZlbHkgKi8KKwlSQVRFXzQ4LCBSQVRFXzI0LCBSQVRFXzEyLCBSQVRFXzYsCS8qIE9GRE0gUExDUCBTaWduYWwgPSA4LCAgOSwgIDEwLCAxMSByZXNwZWN0aXZlbHkgKi8KKwlSQVRFXzU0LCBSQVRFXzM2LCBSQVRFXzE4LCBSQVRFXzksCS8qIE9GRE0gUExDUCBTaWduYWwgPSAxMiwgMTMsIDE0LCAxNSByZXNwZWN0aXZlbHkgKi8KIH07CiAKLVVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1sxMl0gPSB7Ci0JMCwgIDAsCTAsICAwLAotCTAsICAxLAkyLCAgMywJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKLQk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKLX07Ci1VQ0hBUgkgUnh3aU1DU1RvT2ZkbVJhdGVbMTJdID0gewotCVJBVEVfNiwgIFJBVEVfOSwJUkFURV8xMiwgIFJBVEVfMTgsCi0JUkFURV8yNCwgIFJBVEVfMzYsCVJBVEVfNDgsICBSQVRFXzU0LAkvLyBPRkRNIHJhdGUgNiw5LDEyLDE4ID0gcnh3aSBtY3MgMCwxLDIsMwotCTQsICA1LAk2LCAgNywJLy8gT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNwordTggT2ZkbVJhdGVUb1J4d2lNQ1NbMTJdID0geworCTAsIDAsIDAsIDAsCisJMCwgMSwgMiwgMywJCS8qIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzICovCisJNCwgNSwgNiwgNywJCS8qIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcgKi8KIH07CiAKLWNoYXIqICAgTUNTVG9NYnBzW10gPSB7IjFNYnBzIiwiMk1icHMiLCI1LjVNYnBzIiwiMTFNYnBzIiwiMDZNYnBzIiwiMDlNYnBzIiwiMTJNYnBzIiwiMThNYnBzIiwiMjRNYnBzIiwiMzZNYnBzIiwiNDhNYnBzIiwiNTRNYnBzIiwiTU0tMCIsIk1NLTEiLCJNTS0yIiwiTU0tMyIsIk1NLTQiLCJNTS01IiwiTU0tNiIsIk1NLTciLCJNTS04IiwiTU0tOSIsIk1NLTEwIiwiTU0tMTEiLCJNTS0xMiIsIk1NLTEzIiwiTU0tMTQiLCJNTS0xNSIsIk1NLTMyIiwiZWUxIiwiZWUyIiwiZWUzIn07Cit1OCBSeHdpTUNTVG9PZmRtUmF0ZVsxMl0gPSB7CisJUkFURV82LCBSQVRFXzksIFJBVEVfMTIsIFJBVEVfMTgsCisJUkFURV8yNCwgUkFURV8zNiwgUkFURV80OCwgUkFURV81NCwJLyogT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMgKi8KKwk0LCA1LCA2LCA3LAkJLyogT0ZETSByYXRlIDI0LDM2LDQ4LDU0ID0gcnh3aSBtY3MgNCw1LDYsNyAqLworfTsKIAotVUNIQVIgZGVmYXVsdF9jd21pbltdPXtDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLTEsIENXX01JTl9JTl9CSVRTLTJ9OwotVUNIQVIgZGVmYXVsdF9zdGFfYWlmc25bXT17Myw3LDIsMn07CitjaGFyICpNQ1NUb01icHNbXSA9CisgICAgeyAiMU1icHMiLCAiMk1icHMiLCAiNS41TWJwcyIsICIxMU1icHMiLCAiMDZNYnBzIiwgIjA5TWJwcyIsICIxMk1icHMiLAorIjE4TWJwcyIsICIyNE1icHMiLCAiMzZNYnBzIiwgIjQ4TWJwcyIsICI1NE1icHMiLCAiTU0tMCIsICJNTS0xIiwgIk1NLTIiLCAiTU0tMyIsCisiTU0tNCIsICJNTS01IiwgIk1NLTYiLCAiTU0tNyIsICJNTS04IiwgIk1NLTkiLCAiTU0tMTAiLCAiTU0tMTEiLCAiTU0tMTIiLCAiTU0tMTMiLAorIk1NLTE0IiwgIk1NLTE1IiwgIk1NLTMyIiwgImVlMSIsICJlZTIiLCAiZWUzIiB9OwogCi1VQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdID0ge1FJRF9BQ19CRSwgUUlEX0FDX0JLLCBRSURfQUNfQkssIFFJRF9BQ19CRSwgUUlEX0FDX1ZJLCBRSURfQUNfVkksIFFJRF9BQ19WTywgUUlEX0FDX1ZPfTsKK3U4IGRlZmF1bHRfY3dtaW5bXSA9CisgICAgeyBDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTIC0gMSwgQ1dfTUlOX0lOX0JJVFMgLSAyIH07CisvKnU4IGRlZmF1bHRfY3dtYXhbXT17Q1dfTUFYX0lOX0JJVFMsIENXX01BWF9JTl9CSVRTLCBDV19NSU5fSU5fQklUUywgQ1dfTUlOX0lOX0JJVFMtMX07ICovCit1OCBkZWZhdWx0X3N0YV9haWZzbltdID0geyAzLCA3LCAyLCAyIH07CiAKK3U4IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF0gPQorICAgIHsgUUlEX0FDX0JFLCBRSURfQUNfQkssIFFJRF9BQ19CSywgUUlEX0FDX0JFLCBRSURfQUNfVkksIFFJRF9BQ19WSSwKK1FJRF9BQ19WTywgUUlEX0FDX1ZPIH07CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC05NiwxNjIgKzEwNCwxMTkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVJTlQJCQlMZW5ndGgpCitpbnQgTWluaXBvcnRNTVJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggUXVlSWR4LCB1OCAqcERhdGEsIHUzMiBMZW5ndGgpCiB7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMgIAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVVMT05HCSAJCUZyZWVOdW07Ci0jaWZkZWYgUlQyODYwCi0JdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7Ci0jZW5kaWYKLQlVQ0hBUgkJCUlycVN0YXRlOwotCVVDSEFSCQkJcnRtcEh3SGRyW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsgLy9SVE1QX0hXX0hEUl9MRU5dOworCXZvaWQgKnBQYWNrZXQ7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBGcmVlTnVtOworCXU4IHJ0bXBId0hkcltUWElORk9fU0laRSArIFRYV0lfU0laRV07CS8qUlRNUF9IV19IRFJfTEVOXTsgKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzID0gMDsKKwl1OCBJcnFTdGF0ZTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwlCT09MRUFOIGJVc2VEYXRhUSA9IEZBTFNFOworCWludCByZXRyeUNudCA9IDA7CiAKIAlBU1NFUlQoTGVuZ3RoIDw9IE1HTVRfRE1BX0JVRkZFUl9TSVpFKTsKIAotCVF1ZUlkeD0zOwotCi0JLy8gMjg2MEMgdXNlIFR4IFJpbmcKLQorCWlmICgoUXVlSWR4ICYgTUdNVF9VU0VfUVVFVUVfRkxBRykgPT0gTUdNVF9VU0VfUVVFVUVfRkxBRykgeworCQliVXNlRGF0YVEgPSBUUlVFOworCQlRdWVJZHggJj0gKH5NR01UX1VTRV9RVUVVRV9GTEFHKTsKKwl9CisjaWZkZWYgUlRNUF9NQUNfUENJCisJLyogMjg2MEMgdXNlIFR4IFJpbmcgKi8KIAlJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOwotCi0jaWZkZWYgUlQyODYwCi0JaWYgKChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgJiYgKCFJcnFTdGF0ZSkpCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSB7CisJCVF1ZUlkeCA9IChiVXNlRGF0YVEgPT0gVFJVRSA/IFF1ZUlkeCA6IDMpOworCQliVXNlRGF0YVEgPSBUUlVFOworCX0KKwlpZiAoYlVzZURhdGFRICYmICghSXJxU3RhdGUpKQogCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0jZW5kaWYKLQlkbwotCXsKLQkJLy8gUmVzZXQgaXMgaW4gcHJvZ3Jlc3MsIHN0b3AgaW1tZWRpYXRlbHkKLQkJaWYgKCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQkgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpfHwKLQkJCSAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJeworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJZG8geworCQkvKiBSZXNldCBpcyBpbiBwcm9ncmVzcywgc3RvcCBpbW1lZGlhdGVseSAqLworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAorCQkgICAgUlRNUF9URVNUX0ZMQUcocEFkLAorCQkJCSAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKQorCQkgICAgfHwgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpIHsKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJCQlicmVhazsKIAkJfQotCi0JCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKLQkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgotCi0JCS8vIDI4NjBDIHVzZSBUeCBSaW5nCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJeworCQkvKiBDaGVjayBGcmVlIHByaW9yaXR5IHF1ZXVlICovCisJCS8qIFNpbmNlIHdlIHVzZSBQQkYgUXVldWUyIGZvciBtYW5hZ2VtZW50IGZyYW1lLiAgSXRzIGNvcnJlc3BvbmRpbmcgRE1BIHJpbmcgc2hvdWxkIGJlIHVzaW5nIFR4UmluZy4gKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJaWYgKGJVc2VEYXRhUSkgeworCQkJcmV0cnlDbnQgPSBNQVhfREFUQU1NX1JFVFJZOworCQkJLyogZnJlZSBUeChRdWVJZHgpIHJlc291cmNlcyAqLworCQkJUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUXVlSWR4KTsKIAkJCUZyZWVOdW0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJewogCQkJRnJlZU51bSA9IEdFVF9NR01UUklOR19GUkVFTk8ocEFkKTsKIAkJfQogCi0JCWlmICgoRnJlZU51bSA+IDApKQotCQl7Ci0JCQkvLyBXZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIHJ0bXAgaGFyZHdhcmUgaGVhZGVyLiBpLmUuLCBUeFdJIGZvciBSVDI4NjAgYW5kIFR4SW5mbytUeFdJIGZvciBSVDI4NzAKKwkJaWYgKChGcmVlTnVtID4gMCkpIHsKKwkJCS8qIFdlIG5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgcnRtcCBoYXJkd2FyZSBoZWFkZXIuIGkuZS4sIFR4V0kgZm9yIFJUMjg2MCBhbmQgVHhJbmZvK1R4V0kgZm9yIFJUMjg3MCAqLwogCQkJTmRpc1plcm9NZW1vcnkoJnJ0bXBId0hkciwgKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSk7Ci0JCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIChQVUNIQVIpJnJ0bXBId0hkciwgKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKSwgcERhdGEsIExlbmd0aCk7Ci0JCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKKwkJCVN0YXR1cyA9CisJCQkgICAgUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LAorCQkJCQkJICAgKHU4ICopJiBydG1wSHdIZHIsCisJCQkJCQkgICAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLAorCQkJCQkJICAgcERhdGEsIExlbmd0aCk7CisJCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkgKCJNaW5pcG9ydE1NUmVxdWVzdCAoZXJyb3I6OiBjYW4ndCBhbGxvY2F0ZSBORElTIFBBQ0tFVClcbiIpKTsKIAkJCQlicmVhazsKIAkJCX0KKwkJCS8qcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsgKi8KKwkJCS8qcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzI7ICovCiAKLQkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCS8vcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzI7Ci0KLQotCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0JCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQlpZiAoYlVzZURhdGFRKSB7CisJCQkJU3RhdHVzID0KKwkJCQkgICAgTWxtZURhdGFIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOworCQkJCXJldHJ5Q250LS07CisJCQl9IGVsc2UKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCQlTdGF0dXMgPSBNbG1lSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKKwkJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQlyZXRyeUNudCA9IDA7CisJCQllbHNlCiAJCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50Kys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJRaWR4KCVkKSwgbm90IGVub3VnaCBzcGFjZSBpbiBNZ210UmluZywgTWdtdFJpbmdGdWxsQ291bnQ9JWxkIVxuIiwKLQkJCQkJCQkJCQlRdWVJZHgsIHBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQpKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJCWlmIChiVXNlRGF0YVEpIHsKKwkJCQlyZXRyeUNudC0tOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJyZXRyeUNudCAlZFxuIiwgcmV0cnlDbnQpKTsKKwkJCQlpZiAocmV0cnlDbnQgPT0gMCkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAoIlFpZHgoJWQpLCBub3QgZW5vdWdoIHNwYWNlIGluIERhdGFSaW5nLCBNZ210UmluZ0Z1bGxDb3VudD0lbGQhXG4iLAorCQkJCQkJICBRdWVJZHgsCisJCQkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuCisJCQkJCQkgIE1nbXRSaW5nRnVsbENvdW50KSk7CisJCQkJfQorCQkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gTWdtdFJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCisJCQkJICBRdWVJZHgsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50KSk7CiAJCX0KKwl9IHdoaWxlIChyZXRyeUNudCA+IDApOwogCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0jaWZkZWYgUlQyODYwCi0JLy8gMjg2MEMgdXNlIFR4IFJpbmcKLQlpZiAoKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSAmJiAoIUlycVN0YXRlKSkKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpZiAoYlVzZURhdGFRICYmICghSXJxU3RhdGUpKQogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLSNlbmRpZgotCXJldHVybiBTdGF0dXM7Ci19Ci0KLSNpZmRlZiBSVDI4NjAKLU5ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0VW5sb2NrKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVJTlQJCQlMZW5ndGgpCi17Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JTkRJU19TVEFUVVMgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUxPTkcJIEZyZWVOdW07Ci0JVFhXSV9TVFJVQwkJVFhXSTsKLQlVTE9ORwlTV19UWF9JRFg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQotCVF1ZUlkeCA9IDM7Ci0JQVNTRVJUKExlbmd0aCA8PSBNR01UX0RNQV9CVUZGRVJfU0laRSk7Ci0KLQlkbwotCXsKLQkJLy8gUmVzZXQgaXMgaW4gcHJvZ3Jlc3MsIHN0b3AgaW1tZWRpYXRlbHkKLQkJaWYgKCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQkgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpfHwKLQkJCSAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gQ2hlY2sgRnJlZSBwcmlvcml0eSBxdWV1ZQotCQkvLyBTaW5jZSB3ZSB1c2UgUEJGIFF1ZXVlMiBmb3IgbWFuYWdlbWVudCBmcmFtZS4gIEl0cyBjb3JyZXNwb25kaW5nIERNQSByaW5nIHNob3VsZCBiZSB1c2luZyBUeFJpbmcuCi0JCS8vIDI4NjBDIHVzZSBUeCBSaW5nCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJewotCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJCVNXX1RYX0lEWCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHg7Ci0JCQlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU1dfVFhfSURYXS5BbGxvY1ZhOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRnJlZU51bSA9IEdFVF9NR01UUklOR19GUkVFTk8ocEFkKTsKLQkJCVNXX1RYX0lEWCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7Ci0JCQlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbU1dfVFhfSURYXS5BbGxvY1ZhOwotCQl9Ci0JCWlmICgoRnJlZU51bSA+IDApKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeSgmVFhXSSwgVFhXSV9TSVpFKTsKLQkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmVFhXSSwgVFhXSV9TSVpFLCBwRGF0YSwgTGVuZ3RoKTsKLQkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlTdGF0dXMgPSBNbG1lSGFyZFRyYW5zbWl0KHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKLQkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwUGFja2V0KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQrKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlFpZHgoJWQpLCBub3QgZW5vdWdoIHNwYWNlIGluIE1nbXRSaW5nXG4iLCBRdWVJZHgpKTsKLQkJfQotCi0JfSB3aGlsZSAoRkFMU0UpOwotCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKIAlyZXR1cm4gU3RhdHVzOwogfQotI2VuZGlmCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yNzcsMjcwICsyNDIsODUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCitpbnQgTWxtZUhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCkKIHsKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQotCXsKKwlzdHJ1Y3QgcnRfcGFja2V0X2luZm8gUGFja2V0SW5mbzsKKwl1OCAqcFNyY0J1ZlZBOworCXUzMiBTcmNCdWZMZW47CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyXzgwMl8xMTsKKworCWlmICgocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQorCSAgICApIHsKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0jaWZkZWYgUlQyODYwCi0JaWYgKCBwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCApCi0JCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHBBZCxRdWVJZHgscFBhY2tldCk7CisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisKKwlwSGVhZGVyXzgwMl8xMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOworCisjaWZkZWYgUlRNUF9NQUNfUENJCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQorCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CiAJZWxzZQotI2VuZGlmCi0JCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcocEFkLFF1ZUlkeCxwUGFja2V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsIFF1ZUlkeCwgcFBhY2tldCk7CiAKIH0KIAotI2lmZGVmIFJUMjg2MAotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUglRdWVJZHgsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCitpbnQgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCkKIHsKLQlQQUNLRVRfSU5GTyAJUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOwotCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7Ci0JVUxPTkcJCQlTcmNCdWZQQTsKLQlVQ0hBUgkJCU1sbWVSYXRlOwotCVVMT05HCQkJU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCVBUWFdJX1NUUlVDIAlwRmlyc3RUeFdJOwotCVVMT05HCSBGcmVlTnVtOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKLQorCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXU4ICpwU3JjQnVmVkE7CisJdTMyIFNyY0J1ZkxlbjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXJfODAyXzExOworCUJPT0xFQU4gYkFja1JlcXVpcmVkLCBiSW5zZXJ0VGltZXN0YW1wOworCXU4IE1sbWVSYXRlOworCXN0cnVjdCBydF90eHdpICogcEZpcnN0VHhXSTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnkgPSBOVUxMOworCXU4IFBJRDsKIAogCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKIAotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQl7Ci0JCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKLQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0KLQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCi0JaWYgKEZyZWVOdW0gPT0gMCkKLQl7Ci0JCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCi0JcFR4RCAgPSAoUFRYRF9TVFJVQykgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1N3SWR4XS5BbGxvY1ZhOwotCi0JaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQpCi0JewotCQlwcmludGsoIk1sbWVIYXJkVHJhbnNtaXQgRXJyb3JcbiIpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRlJPTV9UWCk7Ci0KLQlwRmlyc3RUeFdJCT0oUFRYV0lfU1RSVUMpcFNyY0J1ZlZBOwotCi0JcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIChwU3JjQnVmVkEgKyBUWFdJX1NJWkUpOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOwotCX0KLQllbHNlCi0JewotCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCX0KLQotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQotCXsKLQkJcE1hY0VudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwSGVhZGVyXzgwMl8xMS0+QWRkcjEpOwotCX0KLQotCS8vIFZlcmlmeSBNbG1lIHJhdGUgZm9yIGEgLyBnIGJhbmRzLgotCWlmICgocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpICYmIChNbG1lUmF0ZSA8IFJBVEVfNikpIC8vIDExQSBiYW5kCi0JCU1sbWVSYXRlID0gUkFURV82OwotCi0JLy8KLQkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQotCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0Ci0JLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCi0JLy8KLQkvLwotCS8vIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUKLQotICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKLQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkKLSAgICB7Ci0gICAgCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpIHx8ICEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKLSAgICAJewotICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOwotICAgIAl9Ci0gICAgCWVsc2UKLSAgICAJewotICAgIAkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOwotICAgIAl9Ci0gICAgfQotCi0JYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKLQl7Ci0JCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCX0KLQllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCi0JewotCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKLQkJewotCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOwotCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQotCQkJewotCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOwotCQkJfQotCQl9Ci0JfQotCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKLQlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQotCQlwQWQtPlNlcXVlbmNlID0gMDsKLQkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKLQkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQotCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8KLQkvLyBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUCi0JLy8gc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgb2h5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzCi0JLy8gdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUKLQkvLwotCi0JLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCi0JLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQotCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKLQotLy8gbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuCi0JLy8gT25seSBiZWFjb24gdXNlIE5zZXE9VFJVRS4gU28gaGVyZSB3ZSB1c2UgTnNlcT1GQUxTRS4KLQlpZiAocE1hY0VudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksIFBJRF9NR01ULCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsCi0JCQkJCWJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkJCQkwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCi0JCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKLQkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKLQkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOwotCX0KLQotCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCVNyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fRURDQSk7Ci0JcFR4RC0+TGFzdFNlYzAgPSAxOwotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47Ci0JcFR4RC0+U0RMZW4xID0gMDsKLQlwVHhELT5TRFB0cjAgPSBTcmNCdWZQQTsKLQlwVHhELT5ETUFET05FID0gMDsKLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0KLSAgIAkvLyBJbmNyZWFzZSBUWF9DVFhfSURYLCBidXQgd3JpdGUgdG8gcmVnaXN0ZXIgbGF0ZXIuCi0JSU5DX1JJTkdfSU5ERVgocEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUXVlSWR4KjB4MTAsICBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOwotCUJPT0xFQU4gCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7Ci0JVUNIQVIJCQlNbG1lUmF0ZTsKLQlQVFhXSV9TVFJVQyAJcEZpcnN0VHhXSTsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeSA9IE5VTEw7Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQotCi0JaWYgKHBTcmNCdWZWQSA9PSBOVUxMKQotCXsKKwkvKiBNYWtlIHN1cmUgTUdNVCByaW5nIHJlc291cmNlIHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgdGhyZWFkcyAqLworCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKwlpZiAocFNyY0J1ZlZBID09IE5VTEwpIHsKKwkJLyogVGhlIGJ1ZmZlciBzaG91bGRuJ3QgYmUgTlVMTCAqLwogCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCi0JLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0Ci0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0jaWZkZWYgUlQyODYwCi0JCUFzaWNGb3JjZVdha2V1cChwQWQsIEZST01fVFgpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotI2VuZGlmCi0KLQlwRmlyc3RUeFdJID0gKFBUWFdJX1NUUlVDKShwU3JjQnVmVkEgKyAgVFhJTkZPX1NJWkUpOwotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpOyAvL1RYV0lfU0laRSk7Ci0KLQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKIAl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwkJLyogb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0ICovCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CiAJfQotCWVsc2UKLQl7CisKKwlwRmlyc3RUeFdJID0gKHN0cnVjdCBydF90eHdpICopIChwU3JjQnVmVkEgKyBUWElORk9fU0laRSk7CisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsJLypUWFdJX1NJWkUpOyAqLworCisJaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpIHsKKwkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5CYXNpY01sbWVSYXRlOworCX0gZWxzZSB7CiAJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CiAJfQogCi0JLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCi0JaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKKwkvKiBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4gKi8KKwlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKQkvKiAxMUEgYmFuZCAqLwogCQlNbG1lUmF0ZSA9IFJBVEVfNjsKIAogCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKQotCXsKKwkgICAgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKSB7CiAJCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKIAl9CiAKIAl7Ci0JCS8vIEZpeGVkIFc1MiB3aXRoIEFjdGl2aXR5IHNjYW4gaXNzdWUgaW4gQUJHX01JWEVEIGFuZCBBQkdOX01JWEVEIG1vZGUuCisJCS8qIEZpeGVkIFc1MiB3aXRoIEFjdGl2aXR5IHNjYW4gaXNzdWUgaW4gQUJHX01JWEVEIGFuZCBBQkdOX01JWEVEIG1vZGUuICovCiAJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRAotCQkJfHwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVECi0JCSkKLQkJeworCQkgICAgfHwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB7CiAJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCiAJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOwogCQkJZWxzZQpAQCAtNTQ4LDEwMyArMzI4LDEyMSBAQAogCQl9CiAJfQogCi0JLy8KLQkvLyBTaG91bGQgbm90IGJlIGhhcmQgY29kZSB0byBzZXQgUHdyTWdtdCB0byAwIChQV1JfQUNUSVZFKQotCS8vIFNuaWNlIGl0J3MgYmVlbiBzZXQgdG8gMCB3aGlsZSBvbiBNZ3RNYWNIZWFkZXJJbml0Ci0JLy8gQnkgdGhlIHdheSB0aGlzIHdpbGwgY2F1c2UgZnJhbWUgdG8gYmUgc2VuZCBvbiBQV1JfU0FWRSBmYWlsZWQuCi0JLy8KLQkvLyBwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IDA7IC8vIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotCS8vCi0JLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQorCS8qICovCisJLyogU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkgKi8KKwkvKiBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdCAqLworCS8qIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLiAqLworCS8qICovCisJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOwkvKiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsgKi8KIAotICAgIC8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0RBVEEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9DTlRMKSkKKwkvKiAqLworCS8qIEluIFdNTS1VQVBTRCwgbWxtZSBmcmFtZSBzaG91bGQgYmUgc2V0IHBzbSBhcyBwb3dlciBzYXZpbmcgYnV0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KKwkvKiBEYXRhLU51bGwgcGFja2V0cyBhbHNlIHBhc3MgdGhyb3VnaCBNTVJlcXVlc3QgaW4gUlQyODYwLCBob3dldmVyLCB3ZSBob3BlIGNvbnRyb2wgdGhlIHBzbSBiaXQgdG8gcGFzcyBBUFNEICovCisvKiAgICAgIGlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0NOVEwpKSAqLwogCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCi0JCQkocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9BQ1RJT04pKQotCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQkJZWxzZQotCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOworCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQUNUSU9OKSB8fAorCQkgICAgKChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKSAmJgorCQkgICAgICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkgfHwKKwkJICAgICAgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfTlVMTF9GVU5DKSkpKSB7CisJCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQorCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCQllbHNlCisJCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPQorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOworCQl9CiAJfQogCiAJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfQ05UTCkJLyogbXVzdCBiZSBQUy1QT0xMICovCiAJewotCQkvL1NldCBQTSBiaXQgaW4gcHMtcG9sbCwgdG8gZml4IFdMSyAxLjIgIFBvd2VyU2F2ZU1vZGVfZXh0IGZhaWx1cmUgaXNzdWUuCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFNfUE9MTCkpCi0JCXsKKwkJLypTZXQgUE0gYml0IGluIHBzLXBvbGwsIHRvIGZpeCBXTEsgMS4yICBQb3dlclNhdmVNb2RlX2V4dCBmYWlsdXJlIGlzc3VlLiAqLworCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCSAgICAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QU19QT0xMKSkgewogCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKIAkJfQogCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQl9Ci0JZWxzZSAvLyBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKQorCX0gZWxzZQkJCS8qIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpICovCiAJewotCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKKwkJLypwQWQtPlNlcXVlbmNlKys7ICovCisJCS8qcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsgKi8KKworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkJLyogTVVMVElDQVNULCBCUk9BRENBU1QgKi8KIAkJewogCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CiAJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOwotCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQotCQkJeworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0KKwkJCSAgICBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgTWxtZVJhdGUsIDE0KTsKKwkJCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SU1ApCisJCQkgICAgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX01HTVQpKSB7CiAJCQkJYkluc2VydFRpbWVzdGFtcCA9IFRSVUU7CisJCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CS8qIERpc2FibGUgQUNLIHRvIHByZXZlbnQgcmV0cnkgMHgxZiBmb3IgUHJvYmUgUmVzcG9uc2UgKi8KKwkJCX0gZWxzZQorCQkJICAgIGlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0KKwkJCQkgU1VCVFlQRV9QUk9CRV9SRVEpCisJCQkJJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX01HTVQpKSB7CisJCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CS8qIERpc2FibGUgQUNLIHRvIHByZXZlbnQgcmV0cnkgMHgxZiBmb3IgUHJvYmUgUmVxdWVzdCAqLwogCQkJfQogCQl9CiAJfQogCiAJcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZSsrOwotCWlmIChwQWQtPlNlcXVlbmNlID4weGZmZikKKwlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQogCQlwQWQtPlNlcXVlbmNlID0gMDsKIAotCS8vIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcQotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbgorCS8qIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcSAqLworCS8qIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbiAqLwogCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSFcbiIpKTsKKy8qICAgICAgICAgICAgICBpZiAoIUlycVN0YXRlKSAqLwogCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKIAkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9CiAKLQkvLwotCS8vIGZpbGwgc2NhdHRlci1hbmQtZ2F0aGVyIGJ1ZmZlciBsaXN0IGludG8gVFhELiBJbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKLQkvLyBzaG91bGQgYWx3YXlzIGhhcyBvbmx5IG9uZSBvaHlzaWNhbCBidWZmZXIsIGFuZCB0aGUgd2hvbGUgZnJhbWUgc2l6ZSBlcXVhbHMKLQkvLyB0byB0aGUgZmlyc3Qgc2NhdHRlciBidWZmZXIgc2l6ZQotCS8vCisJLyogKi8KKwkvKiBmaWxsIHNjYXR0ZXItYW5kLWdhdGhlciBidWZmZXIgbGlzdCBpbnRvIFRYRC4gSW50ZXJuYWxseSBjcmVhdGVkIE5ESVMgUEFDS0VUICovCisJLyogc2hvdWxkIGFsd2F5cyBoYXMgb25seSBvbmUgcGh5c2ljYWwgYnVmZmVyLCBhbmQgdGhlIHdob2xlIGZyYW1lIHNpemUgZXF1YWxzICovCisJLyogdG8gdGhlIGZpcnN0IHNjYXR0ZXIgYnVmZmVyIHNpemUgKi8KKwkvKiAqLwogCi0JLy8gSW5pdGlhbGl6ZSBUWCBEZXNjcmlwdG9yCi0JLy8gRm9yIGludGVyLWZyYW1lIGdhcCwgdGhlIG51bWJlciBpcyBmb3IgdGhpcyBmcmFtZSBhbmQgbmV4dCBmcmFtZQotCS8vIEZvciBNTE1FIHJhdGUsIHdlIHdpbGwgZml4IGFzIDJNYiB0byBtYXRjaCBvdGhlciB2ZW5kb3IncyBpbXBsZW1lbnQKKwkvKiBJbml0aWFsaXplIFRYIERlc2NyaXB0b3IgKi8KKwkvKiBGb3IgaW50ZXItZnJhbWUgZ2FwLCB0aGUgbnVtYmVyIGlzIGZvciB0aGlzIGZyYW1lIGFuZCBuZXh0IGZyYW1lICovCisJLyogRm9yIE1MTUUgcmF0ZSwgd2Ugd2lsbCBmaXggYXMgMk1iIHRvIG1hdGNoIG90aGVyIHZlbmRvcidzIGltcGxlbWVudCAqLworLyogICAgICBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7ICovCiAKLS8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgotCWlmIChwTWFjRW50cnkgPT0gTlVMTCkKLQl7Ci0JCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLAotCQkwLCBSRVNFUlZFRF9XQ0lELCAoU3JjQnVmTGVuIC0gVFhJTkZPX1NJWkUgLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwgIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotCX0KLQllbHNlCi0JeworLyogbWFuYWdlbWVudCBmcmFtZSBkb2Vzbid0IG5lZWQgZW5jcnlwdGlvbi4gc28gdXNlIFJFU0VSVkVEX1dDSUQgbm8gbWF0dGVyIHUgYXJlIHNlbmRpbmcgdG8gc3BlY2lmaWMgd2NpZCBvciBub3QuICovCisJUElEID0gUElEX01HTVQ7CisKKwlpZiAocE1hY0VudHJ5ID09IE5VTEwpIHsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwKKwkJCSAgICAgIEZBTFNFLCBiQWNrUmVxdWlyZWQsIEZBTFNFLCAwLCBSRVNFUlZFRF9XQ0lELAorCQkJICAgICAgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwgUElELCAwLAorCQkJICAgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsCisJCQkgICAgICBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCX0gZWxzZSB7CisJCS8qIGRvbnQgdXNlIGxvdyByYXRlIHRvIHNlbmQgUW9TIE51bGwgZGF0YSBmcmFtZSAqLwogCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAotCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksCi0JCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKLQkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKLQkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCQkJICAgICAgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCQkgICAgICAwLCBwTWFjRW50cnktPkFpZCwKKwkJCSAgICAgIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksCisJCQkgICAgICBwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCisJCQkgICAgICAodTgpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOwogCX0KIAotCS8vIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LgorCS8qIE5vdyBkbyBoYXJkd2FyZS1kZXBlbmVkIGtpY2sgb3V0LiAqLwogCUhBTF9LaWNrT3V0TWdtdFR4KHBBZCwgUXVlSWR4LCBwUGFja2V0LCBwU3JjQnVmVkEsIFNyY0J1Zkxlbik7CiAKLQkvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UKKwkvKiBNYWtlIHN1cmUgdG8gcmVsZWFzZSBNR01UIHJpbmcgcmVzb3VyY2UgKi8KKy8qICAgICAgaWYgKCFJcnFTdGF0ZSkgKi8KIAlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCkBAIC03MDgsMTc4ICs1MDYsMTUzIEBACiAJCQkJCQkJCSgyKS5Ob3JtYWwKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1zdGF0aWMgVUNIQVIgVHhQa3RDbGFzc2lmaWNhdGlvbigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCitzdGF0aWMgdTggVHhQa3RDbGFzc2lmaWNhdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpCiB7Ci0JVUNIQVIJCQlUeEZyYW1lVHlwZSA9IFRYX1VOS09XTl9GUkFNRTsKLQlVQ0hBUgkJCVdjaWQ7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotCUJPT0xFQU4JCQliSFRSYXRlID0gRkFMU0U7CisJdTggVHhGcmFtZVR5cGUgPSBUWF9VTktPV05fRlJBTUU7CisJdTggV2NpZDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnkgPSBOVUxMOworCUJPT0xFQU4gYkhUUmF0ZSA9IEZBTFNFOwogCiAJV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOwotCWlmIChXY2lkID09IE1DQVNUX1dDSUQpCi0JewkvLyBIYW5kbGUgZm9yIFJBIGlzIEJyb2FkY2FzdC9NdWx0aWNhc3QgQWRkcmVzcy4KKwlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKSB7CS8qIEhhbmRsZSBmb3IgUkEgaXMgQnJvYWRjYXN0L011bHRpY2FzdCBBZGRyZXNzLiAqLwogCQlyZXR1cm4gVFhfTUNBU1RfRlJBTUU7CiAJfQotCi0JLy8gSGFuZGxlIGZvciB1bmljYXN0IHBhY2tldHMKKwkvKiBIYW5kbGUgZm9yIHVuaWNhc3QgcGFja2V0cyAqLwogCXBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdOwotCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkKLQl7CS8vIEl0J3MgYSBzcGVjaWZpYyBwYWNrZXQgbmVlZCB0byBmb3JjZSBsb3cgcmF0ZSwgaS5lLiwgYkRIQ1BGcmFtZSwgYkVBUE9MRnJhbWUsIGJXQUlGcmFtZQorCWlmIChSVE1QX0dFVF9QQUNLRVRfTE9XUkFURShwUGFja2V0KSkgewkvKiBJdCdzIGEgc3BlY2lmaWMgcGFja2V0IG5lZWQgdG8gZm9yY2UgbG93IHJhdGUsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUgKi8KIAkJVHhGcmFtZVR5cGUgPSBUWF9MRUdBQ1lfRlJBTUU7Ci0JfQotCWVsc2UgaWYgKElTX0hUX1JBVEUocE1hY0VudHJ5KSkKLQl7CS8vIGl0J3MgYSAxMW4gY2FwYWJsZSBwYWNrZXQKKwl9IGVsc2UgaWYgKElTX0hUX1JBVEUocE1hY0VudHJ5KSkgewkvKiBpdCdzIGEgMTFuIGNhcGFibGUgcGFja2V0ICovCiAKLQkJLy8gRGVwZW5kcyBvbiBIVFBoeU1vZGUgdG8gY2hlY2sgaWYgdGhlIHBlZXIgc3VwcG9ydCB0aGUgSFRSYXRlIHRyYW5zbWlzc2lvbi4KLQkJLy8gCUN1cnJlbnRseSBkaWRuJ3Qgc3VwcG9ydCBBLU1TRFUgZW1iZWRkZWQgaW4gQS1NUERVCisJCS8qIERlcGVuZHMgb24gSFRQaHlNb2RlIHRvIGNoZWNrIGlmIHRoZSBwZWVyIHN1cHBvcnQgdGhlIEhUUmF0ZSB0cmFuc21pc3Npb24uICovCisJCS8qICAgICAgQ3VycmVudGx5IGRpZG4ndCBzdXBwb3J0IEEtTVNEVSBlbWJlZGRlZCBpbiBBLU1QRFUgKi8KIAkJYkhUUmF0ZSA9IFRSVUU7Ci0JCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkgfHwgKHBNYWNFbnRyeS0+UHNNb2RlID09IFBXUl9TQVZFKSkKKwkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KQorCQkgICAgfHwgKHBNYWNFbnRyeS0+UHNNb2RlID09IFBXUl9TQVZFKSkKIAkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJZWxzZSBpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCi0JCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0JCWVsc2UgaWYoKHBNYWNFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDwoUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpKSkpICE9IDApCisJCWVsc2UgaWYgKChwTWFjRW50cnktPgorCQkJICBUWEJBYml0bWFwICYgKDEgPDwgKFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KSkpKSAhPQorCQkJIDApCiAJCQlyZXR1cm4gVFhfQU1QRFVfRlJBTUU7Ci0JCWVsc2UgaWYoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQorCQllbHNlIGlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRworCQkJIChwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCiAJCQlyZXR1cm4gVFhfQU1TRFVfRlJBTUU7CiAJCWVsc2UKIAkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCX0KLQllbHNlCi0JewkvLyBpdCdzIGEgbGVnYWN5IGIvZyBwYWNrZXQuCi0JCWlmICgoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKSAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSAmJgotCQkJKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJgotCQkJKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQotCQl7CS8vIGlmIHBlZXIgc3VwcG9ydCBSYWxpbmsgQWdncmVnYXRpb24sIHdlIHVzZSBpdC4KKwl9IGVsc2UgewkJLyogaXQncyBhIGxlZ2FjeSBiL2cgcGFja2V0LiAqLworCQlpZiAoKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSkgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkgJiYgKFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUocFBhY2tldCkgPj0gUkFURV82KSAmJiAoIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSkpIHsJLyogaWYgcGVlciBzdXBwb3J0IFJhbGluayBBZ2dyZWdhdGlvbiwgd2UgdXNlIGl0LiAqLwogCQkJVHhGcmFtZVR5cGUgPSBUWF9SQUxJTktfRlJBTUU7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKIAkJfQogCX0KIAotCS8vIEN1cnJlbnRseSwgb3VyIGZyYWdtZW50IG9ubHkgc3VwcG9ydCB3aGVuIGEgdW5pY2FzdCBwYWNrZXQgc2VuZCBhcyBOT1QtQVJBTElOSywgTk9ULUFNU0RVIGFuZCBOT1QtQU1QRFUuCi0JaWYgKChSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpID4gMSkgJiYgKFR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkpCisJLyogQ3VycmVudGx5LCBvdXIgZnJhZ21lbnQgb25seSBzdXBwb3J0IHdoZW4gYSB1bmljYXN0IHBhY2tldCBzZW5kIGFzIE5PVC1BUkFMSU5LLCBOT1QtQU1TRFUgYW5kIE5PVC1BTVBEVS4gKi8KKwlpZiAoKFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgPiAxKQorCSAgICAmJiAoVHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKSkKIAkJVHhGcmFtZVR5cGUgPSBUWF9GUkFHX0ZSQU1FOwogCiAJcmV0dXJuIFR4RnJhbWVUeXBlOwogfQogCi0KLUJPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSyAqcFR4QmxrKQorQk9PTEVBTiBSVE1QX0ZpbGxUeEJsa0luZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUEFDS0VUX0lORk8JCQlQYWNrZXRJbmZvOwotCVBORElTX1BBQ0tFVAkJcFBhY2tldDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X3BhY2tldF9pbmZvIFBhY2tldEluZm87CisJdm9pZCAqcFBhY2tldDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnkgPSBOVUxMOwogCiAJcFBhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKKwlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCSAgICAgJnBUeEJsay0+U3JjQnVmTGVuKTsKIAotCXBUeEJsay0+V2NpZAkgCSAJCT0gUlRNUF9HRVRfUEFDS0VUX1dDSUQocFBhY2tldCk7Ci0JcFR4QmxrLT5hcGlkeAkJIAkJPSBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCk7Ci0JcFR4QmxrLT5Vc2VyUHJpb3JpdHkgCQk9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKLQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX0hUVFhPUDsJCS8vIEFTSUMgZGV0ZXJtaW5lIEZyYW1lIEdhcAorCXBUeEJsay0+V2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOworCXBUeEJsay0+YXBpZHggPSBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCk7CisJcFR4QmxrLT5Vc2VyUHJpb3JpdHkgPSBSVE1QX0dFVF9QQUNLRVRfVVAocFBhY2tldCk7CisJcFR4QmxrLT5GcmFtZUdhcCA9IElGU19IVFRYT1A7CS8qIEFTSUMgZGV0ZXJtaW5lIEZyYW1lIEdhcCAqLwogCiAJaWYgKFJUTVBfR0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFR4QmxrLT5wUGFja2V0KSkKIAkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKTsKIAllbHNlCiAJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKTsKIAotCS8vIERlZmF1bHQgdG8gY2xlYXIgdGhpcyBmbGFnCisJLyogRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcgKi8KIAlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOwogCi0KLQlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCi0JeworCWlmIChwVHhCbGstPldjaWQgPT0gTUNBU1RfV0NJRCkgewogCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7CiAJCXsKLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0JCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQotCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKLQkJCWVsc2UKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0JCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7CisJCQlwVHhCbGstPnBUcmFuc21pdCA9CisJCQkgICAgJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOwogCQl9CiAKLQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsJLy8gQWNrUmVxdWlyZWQgPSBGQUxTRSwgd2hlbiBicm9hZGNhc3QgcGFja2V0IGluIEFkaG9jIG1vZGUuCi0JCS8vVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZUxvd1JhdGUpOworCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvKiBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4gKi8KKwkJLypUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7ICovCiAJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOwogCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKLQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKLQkJeworCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKSB7CiAJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKIAkJfQogCi0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcFR4QmxrLT5wTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtwVHhCbGstPldjaWRdOwogCQlwVHhCbGstPnBUcmFuc21pdCA9ICZwVHhCbGstPnBNYWNFbnRyeS0+SFRQaHlNb2RlOwogCiAJCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwogCi0KLQkJLy8gRm9yIGFsbCB1bmljYXN0IHBhY2tldHMsIG5lZWQgQWNrIHVubGVzcyB0aGUgQWNrIFBvbGljeSBpcyBub3Qgc2V0IGFzIE5PUk1BTF9BQ0suCisJCS8qIEZvciBhbGwgdW5pY2FzdCBwYWNrZXRzLCBuZWVkIEFjayB1bmxlc3MgdGhlIEFjayBQb2xpY3kgaXMgbm90IHNldCBhcyBOT1JNQUxfQUNLLiAqLwogCQlpZiAocEFkLT5Db21tb25DZmcuQWNrUG9saWN5W3BUeEJsay0+UXVlSWR4XSAhPSBOT1JNQUxfQUNLKQogCQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKIAkJZWxzZQogCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CiAKLQkJewotCQkJLy8gSWYgc3VwcG9ydCBXTU0sIGVuYWJsZSBpdC4KLSNpZmRlZiBSVDI4NjAKLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgotCQkJCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQotI2VuZGlmCi0JCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOworCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCisJCSAgICAoQURIT0NfT04ocEFkKSkgJiYKKwkJICAgIChSWF9GSUxURVJfVEVTVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfUFJPTUlTQ1VPVVMpKSkgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKQorCQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7CiAJCX0KIAotCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9MRUdBQ1lfRlJBTUUpCiAJCXsKLQkJCWlmICggKFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKHBQYWNrZXQpKSB8fAotICAgICAgICAgICAgICAgICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0NDSykgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSBSQVRFXzEpKSkKLQkJCXsJLy8gU3BlY2lmaWMgcGFja2V0LCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lLCBuZWVkIGZvcmNlIGxvdyByYXRlLgotCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOworCQkJewogCi0JCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KKwkJCQkvKiBJZiBzdXBwb3J0IFdNTSwgZW5hYmxlIGl0LiAqLworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKQorCQkJCSAgICAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksCisJCQkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKKwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOworCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCkgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfQXV0b1JhdGVTd2l0Y2gpOyAqLworCQkJfQorCQl9CisKKwkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKSB7CisJCQlpZiAoKFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKHBQYWNrZXQpKSB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgJiYgKHBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gUkFURV8xKSkpIHsJLyogU3BlY2lmaWMgcGFja2V0LCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lLCBuZWVkIGZvcmNlIGxvdyByYXRlLiAqLworCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0KKwkJCQkgICAgJnBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlOworCisJCQkJLyogTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8gKi8KIAkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgotCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCi0JCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCisJCQkJICAgIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRworCQkJCSAgICAgKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpKQorCQkJCSAgICAmJiAoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkKKwkJCQkJJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LAorCQkJCQkJCQkgICBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpKQogCQkJCXsKIAkJCQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYldNTSk7Ci0JCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOworCQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLAorCQkJCQkJCWZUWF9iRm9yY2VOb25Rb1MpOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKCAoSVNfSFRfUkFURShwTWFjRW50cnkpID09IEZBTFNFKSAmJgotCQkJCShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1BJR0dZQkFDS19DQVBBQkxFKSkpCi0JCQl7CS8vIEN1cnJlbnRseSBwaWdneS1iYWNrIG9ubHkgc3VwcG9ydCB3aGVuIHBlZXIgaXMgb3BlcmF0ZSBpbiBiL2cgbW9kZS4KKwkJCWlmICgoSVNfSFRfUkFURShwTWFjRW50cnkpID09IEZBTFNFKSAmJiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSkpKSB7CS8qIEN1cnJlbnRseSBwaWdneS1iYWNrIG9ubHkgc3VwcG9ydCB3aGVuIHBlZXIgaXMgb3BlcmF0ZSBpbiBiL2cgbW9kZS4gKi8KIAkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7CiAJCQl9CiAKLQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkpCi0JCQl7CisJCQlpZiAoUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKHBQYWNrZXQpKSB7CiAJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CiAJCQl9Ci0jaWZkZWYgVUFQU0RfQVBfU1VQUE9SVAotCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9FT1NQKHBQYWNrZXQpKQotCQkJewotCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iV01NX1VBUFNEX0VPU1ApOwotCQkJfQotI2VuZGlmIC8vIFVBUFNEX0FQX1NVUFBPUlQgLy8KLQkJfQotCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0ZSQUdfRlJBTUUpCi0JCXsKKwkJfSBlbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0ZSQUdfRlJBTUUpIHsKIAkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKIAkJfQogCkBAIC04ODksNDEgKzY2MiwzMyBAQAogCXJldHVybiBUUlVFOwogfQogCi0KLUJPT0xFQU4gQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBORElTX1BBQ0tFVCAqcFBhY2tldCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCitCT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIGNoYXIgKiBwUGFja2V0LCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7CiAKLQkvL3ByaW50aygiQ2hlY2sgaWYgY2FuIGRvIGFnZ3JlZ2F0aW9uISBUeEZyYW1lVHlwZT0lZCFcbiIsIHBUeEJsay0+VHhGcmFtZVR5cGUpOworCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hlY2sgaWYgY2FuIGRvIGFnZ3JlZ2F0aW9uISBUeEZyYW1lVHlwZT0lZCFcbiIsIHBUeEJsay0+VHhGcmFtZVR5cGUpKTsgKi8KIAogCWlmIChSVE1QX0dFVF9QQUNLRVRfV0NJRChwUGFja2V0KSA9PSBNQ0FTVF9XQ0lEKQogCQlyZXR1cm4gRkFMU0U7CiAKIAlpZiAoUlRNUF9HRVRfUEFDS0VUX0RIQ1AocFBhY2tldCkgfHwKLQkJUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpIHx8Ci0JCVJUTVBfR0VUX1BBQ0tFVF9XQUkocFBhY2tldCkpCisJICAgIFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KSB8fCBSVE1QX0dFVF9QQUNLRVRfV0FJKHBQYWNrZXQpKQogCQlyZXR1cm4gRkFMU0U7CiAKLQlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpICYmCi0JCSgocFR4QmxrLT5Ub3RhbEZyYW1lTGVuICsgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpPiAoUlhfQlVGRkVSX0FHR1JFU0laRSAtIDEwMCkpKQotCXsJLy8gRm9yIEFNU0RVLCBhbGxvdyB0aGUgcGFja2V0cyB3aXRoIHRvdGFsIGxlbmd0aCA8IG1heC1hbXNkdSBzaXplCisJaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSAmJiAoKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKSA+IChSWF9CVUZGRVJfQUdHUkVTSVpFIC0gMTAwKSkpIHsJLyogRm9yIEFNU0RVLCBhbGxvdyB0aGUgcGFja2V0cyB3aXRoIHRvdGFsIGxlbmd0aCA8IG1heC1hbXNkdSBzaXplICovCiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKSAmJgotCQkocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID09IDIpKQotCXsJLy8gRm9yIFJBTElOSy1BZ2dyZWdhdGlvbiwgYWxsb3cgdHdvIGZyYW1lcyBpbiBvbmUgYmF0Y2guCisJaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAyKSkgewkvKiBGb3IgUkFMSU5LLUFnZ3JlZ2F0aW9uLCBhbGxvdyB0d28gZnJhbWVzIGluIG9uZSBiYXRjaC4gKi8KIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmICgoSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSAvLyBtdXN0IGJlIHVuaWNhc3QgdG8gQVAKKwlpZiAoKElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkJLyogbXVzdCBiZSB1bmljYXN0IHRvIEFQICovCiAJCXJldHVybiBUUlVFOwogCWVsc2UKIAkJcmV0dXJuIEZBTFNFOwotfQogCit9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC05NDcsNTMgKzcxMiw0MiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QRGVRdWV1ZVBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgICAgIGJJbnRDb250ZXh0LAotCUlOICBVQ0hBUgkJCVFJZHgsIC8qIEJ1bGtPdXRQaXBlSWQgKi8KLQlJTiAgVUNIQVIgICAgICAgICAgIE1heF9UeF9QYWNrZXRzKQordm9pZCBSVE1QRGVRdWV1ZVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkludENvbnRleHQsIHU4IFFJZHgsCS8qIEJ1bGtPdXRQaXBlSWQgKi8KKwkJICAgICAgIHU4IE1heF9UeF9QYWNrZXRzKQogewotCVBRVUVVRV9FTlRSWSAgICBwRW50cnkgPSBOVUxMOwotCVBORElTX1BBQ0tFVCAJcFBhY2tldDsKLQlORElTX1NUQVRVUyAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlVQ0hBUiAgICAgICAgICAgQ291bnQ9MDsKLQlQUVVFVUVfSEVBREVSICAgcFF1ZXVlOwotCVVMT05HICAgICAgICAgICBGcmVlTnVtYmVyW05VTV9PRl9UWF9SSU5HXTsKLQlVQ0hBUgkJCVF1ZUlkeCwgc1FJZHgsIGVRSWR4OwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwOwotCUJPT0xFQU4JCQloYXNUeERlc2MgPSBGQUxTRTsKLQlUWF9CTEsJCQlUeEJsazsKLQlUWF9CTEsJCQkqcFR4QmxrOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5ID0gTlVMTDsKKwl2b2lkICpwUGFja2V0OworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXU4IENvdW50ID0gMDsKKwlzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpwUXVldWU7CisJdW5zaWduZWQgbG9uZyBGcmVlTnVtYmVyW05VTV9PRl9UWF9SSU5HXTsKKwl1OCBRdWVJZHgsIHNRSWR4LCBlUUlkeDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzID0gMDsKKwlCT09MRUFOIGhhc1R4RGVzYyA9IEZBTFNFOworCXN0cnVjdCBydF90eF9ibGsgVHhCbGs7CisJc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrOwogCi0KLQotCWlmIChRSWR4ID09IE5VTV9PRl9UWF9SSU5HKQotCXsKKwlpZiAoUUlkeCA9PSBOVU1fT0ZfVFhfUklORykgewogCQlzUUlkeCA9IDA7Ci0vL1BTIHBhY2tldHMgdXNlIEhDQ0EgcXVldWUgd2hlbiBkZXF1ZXVlIGZyb20gUFMgdW5pY2FzdCBxdWV1ZSAoV2lGaSBXUEEyIE1BOV9EVDEgZm9yIE1hcnZlbGwgQiBTVEEpCi0JCWVRSWR4ID0gMzsJLy8gNCBBQ3MsIHN0YXJ0IGZyb20gMC4KLQl9Ci0JZWxzZQotCXsKKwkJZVFJZHggPSAzOwkvKiA0IEFDcywgc3RhcnQgZnJvbSAwLiAqLworCX0gZWxzZSB7CiAJCXNRSWR4ID0gZVFJZHggPSBRSWR4OwogCX0KIAotCWZvciAoUXVlSWR4PXNRSWR4OyBRdWVJZHggPD0gZVFJZHg7IFF1ZUlkeCsrKQotCXsKLQkJQ291bnQ9MDsKKwlmb3IgKFF1ZUlkeCA9IHNRSWR4OyBRdWVJZHggPD0gZVFJZHg7IFF1ZUlkeCsrKSB7CisJCUNvdW50ID0gMDsKIAotCQlSVDI4WFhfU1RBUlRfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOworCQlSVE1QX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKIAotCi0JCXdoaWxlICgxKQotCQl7Ci0JCQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQkJCXsKLQkJCQlSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisJCXdoaWxlICgxKSB7CisJCQlpZiAoKFJUTVBfVEVTVF9GTEFHCisJCQkgICAgIChwQWQsCisJCQkgICAgICAoZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyB8CisJCQkgICAgICAgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkgICAgICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisJCQkJUlRNUF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAKQEAgLTEwMDEsNDMgKzc1NSw0NyBAQAogCQkJCWJyZWFrOwogCiAJCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKLQkJCXsKLQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgYkludENvbnRleHQsIElycUZsYWdzKTsKKwkJCWlmICgmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSA9PSBOVUxMKSB7CisJCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LAorCQkJCQkgICAgICAgSXJxRmxhZ3MpOwogCQkJCWJyZWFrOwogCQkJfQotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwogCi0KLQkJCWlmIChGcmVlTnVtYmVyW1F1ZUlkeF0gPD0gNSkKLQkJCXsKLQkJCQkvLyBmcmVlIFR4KFF1ZUlkeCkgcmVzb3VyY2VzCisJCQlpZiAoRnJlZU51bWJlcltRdWVJZHhdIDw9IDUpIHsKKwkJCQkvKiBmcmVlIFR4KFF1ZUlkeCkgcmVzb3VyY2VzICovCiAJCQkJUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUXVlSWR4KTsKLQkJCQlGcmVlTnVtYmVyW1F1ZUlkeF0gPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7CisJCQkJRnJlZU51bWJlcltRdWVJZHhdID0KKwkJCQkgICAgR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwogCQkJfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCQkJLyogcHJvYmUgdGhlIFF1ZXVlIEhlYWQgKi8KIAkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOwotCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCi0JCQl7Ci0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7CisJCQlpZiAoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkgeworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwKKwkJCQkJICAgICAgIElycUZsYWdzKTsKIAkJCQlicmVhazsKIAkJCX0KIAogCQkJcFR4QmxrID0gJlR4QmxrOwotCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUilwVHhCbGssIHNpemVvZihUWF9CTEspKTsKKwkJCU5kaXNaZXJvTWVtb3J5KCh1OCAqKXBUeEJsaywgc2l6ZW9mKHN0cnVjdCBydF90eF9ibGspKTsKKwkJCS8qSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7ICAgICAgICAgLy8gRGlkbid0IG5lZWQgaXQgYmVjYXVzZSB3ZSBhbHJlYWR5IG1lbXplcm8gaXQuICovCiAJCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKIAotCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwRW50cnkpOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwogCi0JCQkvLyBFYXJseSBjaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBlbm9ndWggVHggUmVzb3VyY2UuCi0JCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7Ci0JCQlpZiAoIWhhc1R4RGVzYykKLQkJCXsKKwkJCS8qIEVhcmx5IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub2d1aCBUeCBSZXNvdXJjZS4gKi8KKwkJCWhhc1R4RGVzYyA9CisJCQkgICAgUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywKKwkJCQkJCSAgICAgIEZyZWVOdW1iZXJbUXVlSWR4XSwKKwkJCQkJCSAgICAgIHBQYWNrZXQpOworCQkJaWYgKCFoYXNUeERlc2MpIHsKIAkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKIAotCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwKKwkJCQkJICAgICAgIElycUZsYWdzKTsKIAogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTA0NSw3NCArODAzLDg5IEBACiAJCQlwVHhCbGstPlR4RnJhbWVUeXBlID0gVHhQa3RDbGFzc2lmaWNhdGlvbihwQWQsIHBQYWNrZXQpOwogCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CiAJCQlwVHhCbGstPlRvdGFsRnJhbWVOdW0rKzsKLQkJCXBUeEJsay0+VG90YWxGcmFnTnVtICs9IFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCk7CS8vIFRoZSByZWFsIGZyYWdtZW50IG51bWJlciBtYXliZSB2YXJ5CisJCQlwVHhCbGstPlRvdGFsRnJhZ051bSArPSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQpOwkvKiBUaGUgcmVhbCBmcmFnbWVudCBudW1iZXIgbWF5YmUgdmFyeSAqLwogCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCQkJcFR4QmxrLT5wUGFja2V0ID0gcFBhY2tldDsKLQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CisJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LAorCQkJCQlQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwogCi0JCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKLQkJCXsKLQkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQotCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKLQkJCQl7Ci0JCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0JCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOworCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FCisJCQkgICAgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkgeworCQkJCS8qIEVuaGFuY2UgU1cgQWdncmVnYXRpb24gTWVjaGFuaXNtICovCisJCQkJaWYgKE5FRURfUVVFVUVfQkFDS19GT1JfQUdHCisJCQkJICAgIChwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLAorCQkJCSAgICAgcFR4QmxrLT5UeEZyYW1lVHlwZSkpIHsKKwkJCQkJSW5zZXJ0SGVhZFF1ZXVlKHBRdWV1ZSwKKwkJCQkJCQlQQUNLRVRfVE9fUVVFVUVfRU5UUlkKKwkJCQkJCQkocFBhY2tldCkpOworCQkJCQlERVFVRVVFX1VOTE9DSygmcEFkLT5pcnFfbG9jaywKKwkJCQkJCSAgICAgICBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwogCQkJCQlicmVhazsKIAkJCQl9CiAKLQkJCQlkb3sKLQkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKKwkJCQlkbyB7CisJCQkJCWlmICgocEVudHJ5ID0gcFF1ZXVlLT5IZWFkKSA9PSBOVUxMKQogCQkJCQkJYnJlYWs7CiAKLQkJCQkJLy8gRm9yIFRYX0FNU0RVX0ZSQU1FL1RYX1JBTElOS19GUkFNRSwgTmVlZCB0byBjaGVjayBpZiBuZXh0IHBha2NldCBjYW4gZG8gYWdncmVnYXRpb24uCi0JCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KTsKLQkJCQkJRnJlZU51bWJlcltRdWVJZHhdID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCQkJCQloYXNUeERlc2MgPSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7Ci0JCQkJCWlmICgoaGFzVHhEZXNjID09IEZBTFNFKSB8fCAoQ2FuRG9BZ2dyZWdhdGVUcmFuc21pdChwQWQsIHBQYWNrZXQsIHBUeEJsaykgPT0gRkFMU0UpKQorCQkJCQkvKiBGb3IgVFhfQU1TRFVfRlJBTUUvVFhfUkFMSU5LX0ZSQU1FLCBOZWVkIHRvIGNoZWNrIGlmIG5leHQgcGFrY2V0IGNhbiBkbyBhZ2dyZWdhdGlvbi4gKi8KKwkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJCQlGcmVlTnVtYmVyW1F1ZUlkeF0gPQorCQkJCQkgICAgR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOworCQkJCQloYXNUeERlc2MgPQorCQkJCQkgICAgUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsCisJCQkJCQkJCSAgICAgIHBUeEJsaywKKwkJCQkJCQkJICAgICAgRnJlZU51bWJlcgorCQkJCQkJCQkgICAgICBbUXVlSWR4XSwKKwkJCQkJCQkJICAgICAgcFBhY2tldCk7CisJCQkJCWlmICgoaGFzVHhEZXNjID09IEZBTFNFKQorCQkJCQkgICAgfHwKKwkJCQkJICAgIChDYW5Eb0FnZ3JlZ2F0ZVRyYW5zbWl0CisJCQkJCSAgICAgKHBBZCwgcFBhY2tldCwgcFR4QmxrKSA9PSBGQUxTRSkpCiAJCQkJCQlicmVhazsKIAotCQkJCQkvL1JlbW92ZSB0aGUgcGFja2V0IGZyb20gdGhlIFR4U3dRdWV1ZSBhbmQgaW5zZXJ0IGludG8gcFR4QmxrCisJCQkJCS8qUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgVHhTd1F1ZXVlIGFuZCBpbnNlcnQgaW50byBwVHhCbGsgKi8KIAkJCQkJcEVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKHBRdWV1ZSk7CiAJCQkJCUFTU0VSVChwRW50cnkpOwotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEtUKHBFbnRyeSk7CisJCQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKIAkJCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTnVtKys7Ci0JCQkJCXBUeEJsay0+VG90YWxGcmFnTnVtICs9IFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCk7CS8vIFRoZSByZWFsIGZyYWdtZW50IG51bWJlciBtYXliZSB2YXJ5Ci0JCQkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQkJCQkJSW5zZXJ0VGFpbFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCwgUEFDS0VUX1RPX1FVRVVFX0VOVFJZKHBQYWNrZXQpKTsKLQkJCQl9d2hpbGUoMSk7CisJCQkJCXBUeEJsay0+VG90YWxGcmFnTnVtICs9IFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCk7CS8qIFRoZSByZWFsIGZyYWdtZW50IG51bWJlciBtYXliZSB2YXJ5ICovCisJCQkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPQorCQkJCQkgICAgR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CisJCQkJCUluc2VydFRhaWxRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QsCisJCQkJCQkJUEFDS0VUX1RPX1FVRVVFX0VOVFJZCisJCQkJCQkJKHBQYWNrZXQpKTsKKwkJCQl9IHdoaWxlICgxKTsKIAogCQkJCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMSkKIAkJCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKIAkJCX0KLQotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1VTQgogCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAkJCUNvdW50ICs9IHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcjsKIAotCQkJLy8gRG8gSGFyZFRyYW5zbWl0IG5vdy4KKwkJCS8qIERvIEhhcmRUcmFuc21pdCBub3cuICovCiAJCQlTdGF0dXMgPSBTVEFIYXJkVHJhbnNtaXQocEFkLCBwVHhCbGssIFF1ZUlkeCk7CiAKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotCQkJLy8gc3RhdGljIHJhdGUgYWxzbyBuZWVkIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygpIGZ1bmN0aW9uLgotCQkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKLQkJCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLSNlbmRpZgorCQkJLyogc3RhdGljIHJhdGUgYWxzbyBuZWVkIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygpIGZ1bmN0aW9uLiAqLworCQkJLyppZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkgKi8KKwkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCiAJCX0KIAotCQlSVDI4WFhfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CisJCVJUTVBfU1RPUF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBJcnFGbGFncyk7CiAKLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX01BQ19VU0IKIAkJaWYgKCFoYXNUeERlc2MpCiAJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAJfQogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTEzNSw0MCArOTA4LDM3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1VU0hPUlQJUlRNUENhbGNEdXJhdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJhdGUsCi0JSU4JVUxPTkcJCQlTaXplKQordTE2IFJUTVBDYWxjRHVyYXRpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBSYXRlLCB1bnNpZ25lZCBsb25nIFNpemUpCiB7Ci0JVUxPTkcJRHVyYXRpb24gPSAwOworCXVuc2lnbmVkIGxvbmcgRHVyYXRpb24gPSAwOwogCi0JaWYgKFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgLy8gQ0NLCisJaWYgKFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkJLyogQ0NLICovCiAJewotCQlpZiAoKFJhdGUgPiBSQVRFXzEpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSkKLQkJCUR1cmF0aW9uID0gOTY7CS8vIDcyKzI0IHByZWFtYmxlK3BsY3AKKwkJaWYgKChSYXRlID4gUkFURV8xKQorCQkgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwKKwkJCQkJICBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkpCisJCQlEdXJhdGlvbiA9IDk2OwkvKiA3MisyNCBwcmVhbWJsZStwbGNwICovCiAJCWVsc2UKLQkJCUR1cmF0aW9uID0gMTkyOyAvLyAxNDQrNDggcHJlYW1ibGUrcGxjcAorCQkJRHVyYXRpb24gPSAxOTI7CS8qIDE0NCs0OCBwcmVhbWJsZStwbGNwICovCiAKLQkJRHVyYXRpb24gKz0gKFVTSE9SVCkoKFNpemUgPDwgNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOworCQlEdXJhdGlvbiArPSAodTE2KSgoU2l6ZSA8PCA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CiAJCWlmICgoU2l6ZSA8PCA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKLQkJCUR1cmF0aW9uICsrOwotCX0KLQllbHNlIGlmIChSYXRlIDw9IFJBVEVfTEFTVF9PRkRNX1JBVEUpLy8gT0ZETSByYXRlcworCQkJRHVyYXRpb24rKzsKKwl9IGVsc2UgaWYgKFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkJLyogT0ZETSByYXRlcyAqLwogCXsKLQkJRHVyYXRpb24gPSAyMCArIDY7CQkvLyAxNis0IHByZWFtYmxlK3BsY3AgKyBTaWduYWwgRXh0ZW5zaW9uCi0JCUR1cmF0aW9uICs9IDQgKiAoVVNIT1JUKSgoMTEgKyBTaXplICogNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOworCQlEdXJhdGlvbiA9IDIwICsgNjsJLyogMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbiAqLworCQlEdXJhdGlvbiArPQorCQkgICAgNCAqICh1MTYpKCgxMSArIFNpemUgKiA0KSAvIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSk7CiAJCWlmICgoMTEgKyBTaXplICogNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCiAJCQlEdXJhdGlvbiArPSA0OwotCX0KLQllbHNlCS8vbWltbyByYXRlCisJfSBlbHNlCQkJLyptaW1vIHJhdGUgKi8KIAl7Ci0JCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgorCQlEdXJhdGlvbiA9IDIwICsgNjsJLyogMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbiAqLwogCX0KIAotCXJldHVybiAoVVNIT1JUKUR1cmF0aW9uOworCXJldHVybiAodTE2KUR1cmF0aW9uOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTExOTQsNTggKzk2NCw1MyBAQAogCUlSUUwgPSBQQVNTSVZFX0xFVkVMCiAJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKLSAgICBTZWUgYWxzbyA6IEJBU21hcnRIYXJkVHJhbnNtaXQoKSAgICAhISEKKyAgICBTZWUgYWxzbyA6IEJBU21hcnRIYXJkVHJhbnNtaXQoKSAgICAhCiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMgCXBPdXRUeFdJLAotCUlOCUJPT0xFQU4JCQlGUkFHLAotCUlOCUJPT0xFQU4JCQlDRkFDSywKLQlJTglCT09MRUFOCQkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4gCQlBTVBEVSwKLQlJTglCT09MRUFOIAkJQWNrLAotCUlOCUJPT0xFQU4gCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOCVVDSEFSIAkJCVBJRCwKLQlJTglVQ0hBUgkJCVRJRCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglVQ0hBUgkJCVR4b3Btb2RlLAotCUlOCUJPT0xFQU4JCQlDZkFjaywKLQlJTglIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdCkKK3ZvaWQgUlRNUFdyaXRlVHhXSShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eHdpICogcE91dFR4V0ksIElOIEJPT0xFQU4gRlJBRywgSU4gQk9PTEVBTiBDRkFDSywgSU4gQk9PTEVBTiBJbnNUaW1lc3RhbXAsIElOIEJPT0xFQU4gQU1QRFUsIElOIEJPT0xFQU4gQWNrLCBJTiBCT09MRUFOIE5TZXEsCS8qIEhXIG5ldyBhIHNlcXVlbmNlLiAqLworCQkgICB1OCBCQVNpemUsCisJCSAgIHU4IFdDSUQsCisJCSAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkgICB1OCBQSUQsCisJCSAgIHU4IFRJRCwKKwkJICAgdTggVHhSYXRlLAorCQkgICB1OCBUeG9wbW9kZSwKKwkJICAgSU4gQk9PTEVBTiBDZkFjaywgSU4gSFRUUkFOU01JVF9TRVRUSU5HICogcFRyYW5zbWl0KQogewotCVBNQUNfVEFCTEVfRU5UUlkJcE1hYyA9IE5VTEw7Ci0JVFhXSV9TVFJVQyAJCVR4V0k7Ci0JUFRYV0lfU1RSVUMgCXBUeFdJOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWMgPSBOVUxMOworCXN0cnVjdCBydF90eHdpIFR4V0k7CisJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKIAogCWlmIChXQ0lEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXBNYWMgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtXQ0lEXTsKIAotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KKwkvKiAqLworCS8qIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLiAqLworCS8qIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyAqLworCS8qICovCiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKTsKIAlOZGlzWmVyb01lbW9yeSgmVHhXSSwgVFhXSV9TSVpFKTsKIAlwVHhXSSA9ICZUeFdJOwogCi0JcFR4V0ktPkZSQUc9IEZSQUc7CisJcFR4V0ktPkZSQUcgPSBGUkFHOwogCiAJcFR4V0ktPkNGQUNLID0gQ0ZBQ0s7Ci0JcFR4V0ktPlRTPSBJbnNUaW1lc3RhbXA7CisJcFR4V0ktPlRTID0gSW5zVGltZXN0YW1wOwogCXBUeFdJLT5BTVBEVSA9IEFNUERVOwogCXBUeFdJLT5BQ0sgPSBBY2s7Ci0JcFR4V0ktPnR4b3A9IFR4b3Btb2RlOworCXBUeFdJLT50eG9wID0gVHhvcG1vZGU7CiAKIAlwVHhXSS0+TlNFUSA9IE5TZXE7Ci0JLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCS8qIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UgKi8KIAlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKLQotCWlmKCBCQVNpemUgPjcgKQotCQlCQVNpemUgPTc7CisJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKSB7CisJCWlmIChCQVNpemUgPiAxMykKKwkJCUJBU2l6ZSA9IDEzOworCX0gZWxzZSB7CisJCWlmIChCQVNpemUgPiA3KQorCQkJQkFTaXplID0gNzsKKwl9CiAJcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKIAlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKIAlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKQEAgLTEyNTQsOTAgKzEwMTksODQgQEAKIAlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gTGVuZ3RoOwogCXBUeFdJLT5QYWNrZXRJZCA9IFBJRDsKIAotCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCi0JcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwkvKiBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMCAqLworCXBUeFdJLT5CVyA9CisJICAgIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0KKwkgICAgIE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwogCiAJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwogCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwogCXBUeFdJLT5DRkFDSyA9IENmQWNrOwogCi0JaWYgKHBNYWMpCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKLQkJewotCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQkJewotCQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwlpZiAocE1hYykgeworCQlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkgeworCQkJaWYgKChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpCisJCQkgICAgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpIHsKKwkJCQkvKiBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCiAJCQkJcFR4V0ktPk1JTU9wcyA9IDE7Ci0JCQl9Ci0JCQllbHNlIGlmIChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKLQkJCXsKLQkJCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQotCQkJCXsKKwkJCX0gZWxzZSBpZiAocE1hYy0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpIHsKKwkJCQkvKiBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUgKi8KKwkJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgKKwkJCQkgICAgJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSB7CiAJCQkJCXBUeFdJLT5NQ1MgPSA3OwogCQkJCQlwVHhXSS0+TUlNT3BzID0gMDsKIAkJCQl9CiAJCQl9CiAJCX0KLQkJLy9wVHhXSS0+TUlNT3BzID0gKHBNYWMtPlBzTW9kZSA9PSBQV1JfTU1QUyk/IDE6MDsKLQkJaWYgKHBNYWMtPmJJQW1CYWRBdGhlcm9zICYmIChwTWFjLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkKLQkJeworCQkvKnBUeFdJLT5NSU1PcHMgPSAocE1hYy0+UHNNb2RlID09IFBXUl9NTVBTKT8gMTowOyAqLworCQlpZiAocE1hYy0+YklBbUJhZEF0aGVyb3MKKwkJICAgICYmIChwTWFjLT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkgewogCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBUeFdJLT5NcGR1RGVuc2l0eSA9IHBNYWMtPk1wZHVEZW5zaXR5OwogCQl9CiAJfQogCiAJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKLQlOZGlzTW92ZU1lbW9yeShwT3V0VHhXSSwgJlR4V0ksIHNpemVvZihUWFdJX1NUUlVDKSk7CisJTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2Yoc3RydWN0IHJ0X3R4d2kpKTsKIH0KIAotCi1WT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsaykKK3ZvaWQgUlRNUFdyaXRlVHhXSV9EYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF90eHdpICogcFR4V0ksIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKLQlVQ0hBUgkJCQlCQVNpemU7CisJSFRUUkFOU01JVF9TRVRUSU5HICpwVHJhbnNtaXQ7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5OworCXU4IEJBU2l6ZTsKIAogCUFTU0VSVChwVHhXSSk7CiAKIAlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKIAlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKIAotCi0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLworCS8qICovCisJLyogQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuICovCisJLyogVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzICovCisJLyogKi8KIAlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwogCU5kaXNaZXJvTWVtb3J5KHBUeFdJLCBUWFdJX1NJWkUpOwogCi0JcFR4V0ktPkZSQUcJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKLQlwVHhXSS0+QUNLCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKLQlwVHhXSS0+dHhvcAkJPSBwVHhCbGstPkZyYW1lR2FwOworCXBUeFdJLT5GUkFHID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKKwlwVHhXSS0+QUNLID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOworCXBUeFdJLT50eG9wID0gcFR4QmxrLT5GcmFtZUdhcDsKIAotCQlwVHhXSS0+V2lyZWxlc3NDbGlJRAkJPSBwVHhCbGstPldjaWQ7CisJcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBwVHhCbGstPldjaWQ7CiAKLQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50CT0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4V0ktPkNGQUNLCQkJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKKwlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4V0ktPkNGQUNLID0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKIAotCS8vIElmIENDSyBvciBPRkRNLCBCVyBtdXN0IGJlIDIwCi0JcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKLQlwVHhXSS0+QU1QRFUJPSAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpID8gVFJVRSA6IEZBTFNFKTsKKwkvKiBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMCAqLworCXBUeFdJLT5CVyA9CisJICAgIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0KKwkgICAgIE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOworCXBUeFdJLT5BTVBEVSA9ICgocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgPyBUUlVFIDogRkFMU0UpOwogCi0JLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQorCS8qIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UgKi8KIAlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKLQlpZigocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgJiYgKHBNYWNFbnRyeSkpCi0JewotCQlVQ0hBUgkJUkFCQU9yaUlkeCA9IDA7CS8vVGhlIFJBJ3MgQkEgT3JpZ2luYXRvciB0YWJsZSBpbmRleC4KKwlpZiAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpICYmIChwTWFjRW50cnkpKSB7CisJCXU4IFJBQkFPcmlJZHggPSAwOwkvKlRoZSBSQSdzIEJBIE9yaWdpbmF0b3IgdGFibGUgaW5kZXguICovCiAKLQkJUkFCQU9yaUlkeCA9IHBUeEJsay0+cE1hY0VudHJ5LT5CQU9yaVdjaWRBcnJheVtwVHhCbGstPlVzZXJQcmlvcml0eV07CisJCVJBQkFPcmlJZHggPQorCQkgICAgcFR4QmxrLT5wTWFjRW50cnktPkJBT3JpV2NpZEFycmF5W3BUeEJsay0+VXNlclByaW9yaXR5XTsKIAkJQkFTaXplID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbUkFCQU9yaUlkeF0uQkFXaW5TaXplOwogCX0KIApAQCAtMTM0OSwxNzIgKzExMDgsMTEyIEBACiAJcFR4V0ktPk1DUyA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwogCXBUeFdJLT5QSFlNT0RFID0gcFRyYW5zbWl0LT5maWVsZC5NT0RFOwogCi0JaWYgKHBNYWNFbnRyeSkKLQl7Ci0JCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQl7Ci0JCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCisJaWYgKHBNYWNFbnRyeSkgeworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKQorCQkgICAgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpIHsKKwkJCS8qIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUgKi8KIAkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCXsKLQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJaWYgKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykKLQkJCXsKKwkJfSBlbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKSB7CisJCQkvKiBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUgKi8KKwkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWAorCQkJICAgICYmIHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykgewogCQkJCXBUeFdJLT5NQ1MgPSA3OwogCQkJCXBUeFdJLT5NSU1PcHMgPSAwOwogCQkJfQogCQl9CiAKLQkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWNFbnRyeS0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkpCi0JCXsKKwkJaWYgKHBNYWNFbnRyeS0+YklBbUJhZEF0aGVyb3MKKwkJICAgICYmIChwTWFjRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKSB7CiAJCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gcE1hY0VudHJ5LT5NcGR1RGVuc2l0eTsKIAkJfQogCX0KIAotCi0JLy8gZm9yIHJhdGUgYWRhcGF0aW9uCisJLyogZm9yIHJhdGUgYWRhcGF0aW9uICovCiAJcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKIH0KIAotCi1WT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspCit2b2lkIFJUTVBXcml0ZVR4V0lfQ2FjaGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF90eHdpICogcFR4V0ksIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCXBUcmFuc21pdDsKLQlQTUFDX1RBQkxFX0VOVFJZCXBNYWNFbnRyeTsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIC8qcFR4SFRQaHlNb2RlLCAqLyBwVHJhbnNtaXQ7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5OwogCi0JLy8KLQkvLyB1cGRhdGUgVFhXSQotCS8vCisJLyogKi8KKwkvKiB1cGRhdGUgVFhXSSAqLworCS8qICovCiAJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CiAJcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7CiAKLQlpZiAocE1hY0VudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCkKLQl7CisJLyppZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkgKi8KKwkvKmlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcE1hY0VudHJ5KSkgKi8KKwkvKmlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX0F1dG9SYXRlU3dpdGNoKSkgKi8KKwlpZiAocE1hY0VudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCkgewogCQlwVHhXSS0+dHhvcCA9IElGU19IVFRYT1A7CiAKLQkJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKLQkJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKKwkJLyogSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAgKi8KKwkJcFR4V0ktPkJXID0KKwkJICAgIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0KKwkJICAgICBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKIAkJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7CiAJCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwogCiAJCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKIAkJcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7CiAKLQkJLy8gc2V0IFBJRCBmb3IgVHhSYXRlU3dpdGNoaW5nCisJCS8qIHNldCBQSUQgZm9yIFR4UmF0ZVN3aXRjaGluZyAqLwogCQlwVHhXSS0+UGFja2V0SWQgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKIAl9CiAKLQlwVHhXSS0+QU1QRFUgPSAoKHBNYWNFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPT0gMCkgPyBUUlVFOiBGQUxTRSk7CisJcFR4V0ktPkFNUERVID0gKChwTWFjRW50cnktPk5vQkFEYXRhQ291bnREb3duID09IDApID8gVFJVRSA6IEZBTFNFKTsKIAlwVHhXSS0+TUlNT3BzID0gMDsKIAotCWlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQotCXsKLQkJLy8gTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJaWYgKChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfRFlOQU1JQykgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCXsKLQkJCS8vIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKKwlpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkgeworCQkvKiBNSU1PIFBvd2VyIFNhdmUgTW9kZSAqLworCQlpZiAoKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKQorCQkgICAgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpIHsKKwkJCS8qIER5bmFtaWMgTUlNTyBQb3dlciBTYXZlIE1vZGUgKi8KIAkJCXBUeFdJLT5NSU1PcHMgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHBNYWNFbnRyeS0+TW1wc01vZGUgPT0gTU1QU19TVEFUSUMpCi0JCXsKLQkJCS8vIFN0YXRpYyBNSU1PIFBvd2VyIFNhdmUgTW9kZQotCQkJaWYgKChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkgJiYgKHBUcmFuc21pdC0+ZmllbGQuTUNTID4gNykpCi0JCQl7CisJCX0gZWxzZSBpZiAocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykgeworCQkJLyogU3RhdGljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlICovCisJCQlpZiAoKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCQkJICAgICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKSB7CiAJCQkJcFR4V0ktPk1DUyA9IDc7CiAJCQkJcFR4V0ktPk1JTU9wcyA9IDA7CiAJCQl9CiAJCX0KIAl9CiAKLQogCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKIAogfQogCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCi0Jd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KLQotCUFyZ3VtZW50czoKLQkJcFR4RAkJUG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yCi0JCUFjayAJCVNldHRpbmcgZm9yIEFjayByZXF1aXJlbWVudCBiaXQKLQkJRnJhZ21lbnQJU2V0dGluZyBmb3IgRnJhZ21lbnQgYml0Ci0JCVJldHJ5TW9kZQlTZXR0aW5nIGZvciByZXRyeSBtb2RlCi0JCUlmcyAJCVNldHRpbmcgZm9yIElGUyBnYXAKLQkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQotCQlTZXJ2aWNlIAlTZXR0aW5nIGZvciBzZXJ2aWNlCi0JCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCi0JCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcwotCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBXcml0ZVR4RGVzY3JpcHRvcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhEX1NUUlVDCQlwVHhELAotCUlOCUJPT0xFQU4gCQliV0lWLAotCUlOCVVDSEFSCQkJUXVldWVTRUwpCi17Ci0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0KLQlwVHhELT5XSVYJPSAoYldJVikgPyAxOiAwOwotCXBUeEQtPlFTRUw9IChRdWV1ZVNFTCk7Ci0JaWYgKHBBZC0+Ykdlbk9uZUhDQ0EgPT0gVFJVRSkKLQkJcFR4RC0+UVNFTD0gRklGT19IQ0NBOwotCXBUeEQtPkRNQURPTkUgPSAwOwotfQotCi0KLS8vIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIC0KLS8vIDEuIE1FQURJQV9DT05ORUNURUQKLS8vIDIuIEFHR1JFR0FUSU9OX0lOX1VTRUQKLS8vIDMuIEZyYWdtZW50YXRpb24gbm90IGluIHVzZWQKLS8vIDQuIGVpdGhlciBubyBwcmV2aW91cyBmcmFtZSAocFByZXZBZGRyMT1OVUxMKSAuT1IuIHByZXZpb3VkIGZyYW1lIGlzIGFnZ3JlZ2F0aWJsZQotQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFByZXZBZGRyMSwKLQlJTglQVUNIQVIJCQlwODAyM2hkcikKKy8qIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIC0gKi8KKy8qIDEuIE1FQURJQV9DT05ORUNURUQgKi8KKy8qIDIuIEFHR1JFR0FUSU9OX0lOX1VTRUQgKi8KKy8qIDMuIEZyYWdtZW50YXRpb24gbm90IGluIHVzZWQgKi8KKy8qIDQuIGVpdGhlciBubyBwcmV2aW91cyBmcmFtZSAocFByZXZBZGRyMT1OVUxMKSAuT1IuIHByZXZpb3VkIGZyYW1lIGlzIGFnZ3JlZ2F0aWJsZSAqLworQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggKnBQcmV2QWRkcjEsIHU4ICpwODAyM2hkcikKIHsKIAotCS8vIGNhbid0IGFnZ3JlZ2F0ZSBFQVBPTCAoODAyLjF4KSBmcmFtZQorCS8qIGNhbid0IGFnZ3JlZ2F0ZSBFQVBPTCAoODAyLjF4KSBmcmFtZSAqLwogCWlmICgocDgwMjNoZHJbMTJdID09IDB4ODgpICYmIChwODAyM2hkclsxM10gPT0gMHg4ZSkpCiAJCXJldHVybiBGQUxTRTsKIAotCS8vIGNhbid0IGFnZ3JlZ2F0ZSBtdWx0aWNhc3QvYnJvYWRjYXN0IGZyYW1lCisJLyogY2FuJ3QgYWdncmVnYXRlIG11bHRpY2FzdC9icm9hZGNhc3QgZnJhbWUgKi8KIAlpZiAocDgwMjNoZHJbMF0gJiAweDAxKQogCQlyZXR1cm4gRkFMU0U7CiAKLQlpZiAoSU5GUkFfT04ocEFkKSkgLy8gbXVzdCBiZSB1bmljYXN0IHRvIEFQCisJaWYgKElORlJBX09OKHBBZCkpCS8qIG11c3QgYmUgdW5pY2FzdCB0byBBUCAqLwogCQlyZXR1cm4gVFJVRTsKLQllbHNlIGlmICgocFByZXZBZGRyMSA9PSBOVUxMKSB8fCBNQUNfQUREUl9FUVVBTChwUHJldkFkZHIxLCBwODAyM2hkcikpIC8vIHVuaWNhc3QgdG8gc2FtZSBTVEEKKwllbHNlIGlmICgocFByZXZBZGRyMSA9PSBOVUxMKSB8fCBNQUNfQUREUl9FUVVBTChwUHJldkFkZHIxLCBwODAyM2hkcikpCS8qIHVuaWNhc3QgdG8gc2FtZSBTVEEgKi8KIAkJcmV0dXJuIFRSVUU7CiAJZWxzZQogCQlyZXR1cm4gRkFMU0U7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTUzMSwzMyArMTIzMCwyNyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVMT05HCQkgICBUeFJhdGUsCi0JSU4JUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpCitCT09MRUFOIFBlZXJJc0FnZ3JlT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICB1bnNpZ25lZCBsb25nIFR4UmF0ZSwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5KQogewotCVVMT05HCUFGbGFncyA9IChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKwl1bnNpZ25lZCBsb25nIEFGbGFncyA9CisJICAgIChmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQgfCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKIAotCWlmIChwTWFjRW50cnkgIT0gTlVMTCAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIEFGbGFncykpCi0JewotCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotCQl7CisJaWYgKHBNYWNFbnRyeSAhPSBOVUxMICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgQUZsYWdzKSkgeworCQlpZiAocE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSB7CiAJCQlyZXR1cm4gVFJVRTsKIAkJfQotCiAjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCQlpZiAoVHhSYXRlID49IFJBVEVfNiAmJiBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlICYmICghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKLQkJewkvLyBsZWdhY3kgIFJhbGluayBBZ2dyZWdhdGlvbiBzdXBwb3J0CisJCWlmIChUeFJhdGUgPj0gUkFURV82ICYmIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgJiYgKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKSB7CS8qIGxlZ2FjeSAgUmFsaW5rIEFnZ3JlZ2F0aW9uIHN1cHBvcnQgKi8KIAkJCXJldHVybiBUUlVFOwogCQl9Ci0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLworI2VuZGlmIC8qIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8gKi8KIAl9CiAKIAlyZXR1cm4gRkFMU0U7CiAKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xNTc2LDMyMyArMTI2OSwzOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotUFFVRVVFX0hFQURFUglSVE1QQ2hlY2tUeFN3UXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIFBVQ0hBUgkJCXBRdWVJZHgpCitzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpSVE1QQ2hlY2tUeFN3UXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcFF1ZUlkeCkKIHsKIAotCVVMT05HCU51bWJlcjsKKwl1bnNpZ25lZCBsb25nIE51bWJlcjsKKwkvKiAyMDA0LTExLTE1IHRvIGJlIHJlbW92ZWQuIHRlc3QgYWdncmVnYXRpb24gb25seSAqLworLyogICAgICBpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkgJiYgKCpwTnVtYmVyIDwgMikpICovCisvKiAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAqLwogCiAJTnVtYmVyID0gcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlcgotCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXS5OdW1iZXI7CisJICAgICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JFXS5OdW1iZXIKKwkgICAgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLk51bWJlcgorCSAgICArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyOwogCi0JaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uSGVhZCAhPSBOVUxMKQotCXsKKwlpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5IZWFkICE9IE5VTEwpIHsKIAkJKnBRdWVJZHggPSBRSURfQUNfVk87CiAJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10pOwotCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLkhlYWQgIT0gTlVMTCkKLQl7CisJfSBlbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfVkldLkhlYWQgIT0gTlVMTCkgewogCQkqcFF1ZUlkeCA9IFFJRF9BQ19WSTsKIAkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXSk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uSGVhZCAhPSBOVUxMKSB7CiAJCSpwUXVlSWR4ID0gUUlEX0FDX0JFOwogCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdKTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5IZWFkICE9IE5VTEwpCi0JeworCX0gZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5IZWFkICE9IE5VTEwpIHsKIAkJKnBRdWVJZHggPSBRSURfQUNfQks7CiAJCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10pOwogCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uSGVhZCAhPSBOVUxMKQotCXsKLQkJKnBRdWVJZHggPSBRSURfSENDQTsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdKTsKLQl9Ci0KLQkvLyBObyBwYWNrZXQgcGVuZGluZyBpbiBUeCBTdyBxdWV1ZQorCS8qIE5vIHBhY2tldCBwZW5kaW5nIGluIFR4IFN3IHF1ZXVlICovCiAJKnBRdWVJZHggPSBRSURfQUNfQks7CiAKIAlyZXR1cm4gKE5VTEwpOwogfQogCi0jaWZkZWYgUlQyODYwCi1CT09MRUFOICBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlRdWVJZHgpCi17Ci0JUFJUTVBfVFhfUklORyBwVHhSaW5nOwotCVBUWERfU1RSVUMJICBwVHhEOwotCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKLQlVQ0hBUglGUkVFID0gMDsKLQlUWERfU1RSVUMJVHhELCAqcE9yaVR4RDsKLQkvL1VMT05HCQlJcnFGbGFnczsKLQlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCi0JQVNTRVJUKFF1ZUlkeCA8IE5VTV9PRl9UWF9SSU5HKTsKLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGLCAmcFR4UmluZy0+VHhEbWFJZHgpOwotCXdoaWxlIChwVHhSaW5nLT5UeFN3RnJlZUlkeCAhPSBwVHhSaW5nLT5UeERtYUlkeCkKLQl7Ci0JCS8vIHN0YXRpYyByYXRlIGFsc28gbmVlZCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoKSBmdW5jdGlvbi4KLQkJLy9pZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkKLQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotCi0JCS8qIE5vdGUgOiBJZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSwgd2Ugd2lsbCBuZXZlciByZWFjaCBoZXJlLiAqLwotCQlGUkVFKys7Ci0gICAgICAgICAgICAgICAgcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCXBPcmlUeEQgPSBwVHhEOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLQkJcFR4RCA9ICZUeEQ7Ci0KLQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCQl7Ci0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQ7Ci0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLQkJCQlpZiAoUlRNUF9HRVRfUEFDS0VUXzVWVChwUGFja2V0KSkKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfNVZUX0VOSEFOQ0UgLy8KLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0OwotCi0JCQlBU1NFUlQocFBhY2tldCA9PSBOVUxMKTsKLQkJCWlmIChwUGFja2V0KQotCQkJewotI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotCQkJCWlmIChSVE1QX0dFVF9QQUNLRVRfNVZUKHBQYWNrZXQpKQotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJZWxzZQotI2VuZGlmIC8vIENPTkZJR181VlRfRU5IQU5DRSAvLwotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQkJCS8vQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJcFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJfQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgKHBUeEQtPlNETGVuMSArIHBUeEQtPlNETGVuMCk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1F1ZUlkeF0gKys7Ci0JCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4U3dGcmVlSWR4LCBUWF9SSU5HX1NJWkUpOwotCQkvKiBnZXQgdHhfdGR4X2lkeCBhZ2FpbiAqLwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGICwgICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0KLSAgICAgICAgTmRpc01vdmVNZW1vcnkocE9yaVR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOwotCX0KLQotCi0JcmV0dXJuICBiUmVzY2hlZHVsZTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFRYIFJpbmdzIERNQSBEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKQotewotICAgIHVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0KLQkvLyBNYWtlIHN1cmUgVHggcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMwRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgPSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkUpOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5IY2NhRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0hDQ0EpOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzNEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVk8pOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzJEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfVkkpOwotCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzFEbWFEb25lKQotCQliUmVzY2hlZHVsZSB8PSBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRSURfQUNfQkspOwotCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgVHggcmluZyByZXNvdXJjZQotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCi0JLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAotCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci0KLQlyZXR1cm4gIGJSZXNjaGVkdWxlOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIE1HTVQgcmluZyBETUEgZG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUFRYRF9TVFJVQwkgcFR4RDsKLQlQTkRJU19QQUNLRVQgcFBhY2tldDsKLQlVQ0hBUglGUkVFID0gMDsKLQlQUlRNUF9NR01UX1JJTkcgcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcE1nbXRSaW5nLT5UeERtYUlkeCk7Ci0Jd2hpbGUgKHBNZ210UmluZy0+VHhTd0ZyZWVJZHghPSBwTWdtdFJpbmctPlR4RG1hSWR4KQotCXsKLQkJRlJFRSsrOwotCQlwVHhEID0gKFBUWERfU1RSVUMpIChwTWdtdFJpbmctPkNlbGxbcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCXBUeEQtPkRNQURPTkUgPSAwOwotCQlwUGFja2V0ID0gcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OwotCi0KLQkJaWYgKHBQYWNrZXQpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQlwUGFja2V0ID0gcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQkJaWYgKHBQYWNrZXQpCi0JCXsKLQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCX0KLQkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCUlOQ19SSU5HX0lOREVYKHBNZ210UmluZy0+VHhTd0ZyZWVJZHgsIE1HTVRfUklOR19TSVpFKTsKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQXJndW1lbnRzOgotCQlBZGFwdGVyIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyLiBEZXF1ZXVlIGFsbCBwb3dlciBzYWZlIGRlbGF5ZWQgYnJhb2RjYXN0IGZyYW1lcyBhZnRlciBiZWFjb24uCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JewotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJewotCQl9Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCUFyZ3VtZW50czoKLQkJQWRhcHRlciAJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gUmV3cml0ZSBiZWFjb24gY29udGVudCBiZWZvcmUgbmV4dCBzZW5kLW91dC4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQl7Ci0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdC4uLlxuIikpOwotCQl9Ci0JfQotCi0KLX0KLQotVk9JRAlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLQotCWlmIChwQWQgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IHBBZCBpcyBOVUxMLCByZXR1cm4uXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUEhhbmRsZVJ4Q29oZXJlbnRJbnRlcnJ1cHQgXG4iKSk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcgLCAmR2xvQ2ZnLndvcmQpOwotCi0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JUlRNUEVuYWJsZVJ4VHgocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTkwOSwyNSArMTMxNywyNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOTklORywgc3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTQ0FOTklORywgc3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKIAorCS8qICovCisJLyogQmVmb3JlIEJTU19TQ0FOX0lOX1BST0dSRVNTLCB3ZSBuZWVkIHRvIGtlZXAgQ3VycmVudCBSNjYgdmFsdWUgYW5kICovCisJLyogdXNlIExvd2JvdW5kIGFzIFI2NiB2YWx1ZSBvbiBTY2FuTmV4dENoYW5uZWwoLi4uKSAqLworCS8qICovCisJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwKKwkJCQkgICAgJnBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7CiAKLQkvLwotCS8vIEJlZm9yZSBCU1NfU0NBTl9JTl9QUk9HUkVTUywgd2UgbmVlZCB0byBrZWVwIEN1cnJlbnQgUjY2IHZhbHVlIGFuZAotCS8vIHVzZSBMb3dib3VuZCBhcyBSNjYgdmFsdWUgb24gU2Nhbk5leHRDaGFubmVsKC4uLikKLQkvLwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwotCi0JLy8gc2V0IEJCUF9SNjYgdG8gMHgzMC8weDQwIHdoZW4gc2Nhbm5pbmcgKEFzaWNTd2l0Y2hDaGFubmVsIHdpbGwgc2V0IFI2NiBhY2NvcmRpbmcgdG8gY2hhbm5lbCB3aGVuIHNjYW5uaW5nKQorCS8qIHNldCBCQlBfUjY2IHRvIDB4MzAvMHg0MCB3aGVuIHNjYW5uaW5nIChBc2ljU3dpdGNoQ2hhbm5lbCB3aWxsIHNldCBSNjYgYWNjb3JkaW5nIHRvIGNoYW5uZWwgd2hlbiBzY2FubmluZykgKi8KKwkvKlJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWQpKSk7ICovCiAJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKIAogCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKKwkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NOVExfQ1NSLCAweDAwMGYwMDAwKTsgICAgICAgICAgICAgICAgLy8gYWJvcnQgYWxsIFRYIHJpbmdzICovCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTk0NiwxNDEgKzEzNTQsMTQ1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOIGRvbmUsIHJlc3VtZSBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKKy8qICAgIHU4ICAgICAgICAgICAgICAgICAgICAgSXJxU3RhdGU7ICovCiAKLQkvLyBBZnRlciBmaW5pc2ggQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8gcmVzdG9yZSBDdXJyZW50IFI2NiB2YWx1ZQotCS8vIFI2NiBzaG91bGQgbm90IGJlIDAKLQlpZiAocEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlID09IDApCi0JeworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOworCisJLyogQWZ0ZXIgZmluaXNoIEJTU19TQ0FOX0lOX1BST0dSRVNTLCB3ZSBuZWVkIHRvIHJlc3RvcmUgQ3VycmVudCBSNjYgdmFsdWUgKi8KKwkvKiBSNjYgc2hvdWxkIG5vdCBiZSAwICovCisJaWYgKHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9PSAwKSB7CiAJCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CiAJCURCR1BSSU5UX0VSUigoIlJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uLCBSNjZDdXJyZW50VmFsdWU9MC4uLlxuIikpOwogCX0KIAotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOworCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LAorCQkJCSAgICAgcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworLyogc2FtcGxlLCBmb3IgSVJRIExPQ0sgdG8gU0VNIExPQ0sgKi8KKy8qICAgIElycVN0YXRlID0gcEFkLT5pcnFfZGlzYWJsZWQ7ICovCisvKiAgICAgIGlmIChJcnFTdGF0ZSkgKi8KKy8qICAgICAgICAgICAgICBSVE1QRGVRdWV1ZVBhY2tldChwQWQsIFRSVUUsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7ICovCisvKiAgICBlbHNlICovCiAJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKIH0KIAotCi1VSU5UIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplKQordTMyIGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl2b2lkICpwUGFja2V0LAorCQkJCXU4ICpwRGF0YSwgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSkKIHsKLQlVU0hPUlQgCQkJUGF5bG9hZFNpemU7Ci0JVVNIT1JUIAkJCVN1YkZyYW1lU2l6ZTsKLQlQSEVBREVSXzgwMl8zIAlwQU1TRFVzdWJoZWFkZXI7Ci0JVUlOVAkJCW5NU0RVOwotICAgIFVDSEFSCQkJSGVhZGVyODAyXzNbMTRdOworCXUxNiBQYXlsb2FkU2l6ZTsKKwl1MTYgU3ViRnJhbWVTaXplOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzMgKiBwQU1TRFVzdWJoZWFkZXI7CisJdTMyIG5NU0RVOworCXU4IEhlYWRlcjgwMl8zWzE0XTsKIAotCVBVQ0hBUgkJCXBQYXlsb2FkLCBwREEsIHBTQSwgcFJlbW92ZWRMTENTTkFQOwotCVBORElTX1BBQ0tFVAlwQ2xvbmVQYWNrZXQ7Ci0KLQorCXU4ICpwUGF5bG9hZCwgKnBEQSwgKnBTQSwgKnBSZW1vdmVkTExDU05BUDsKKwl2b2lkICpwQ2xvbmVQYWNrZXQ7CiAKIAluTVNEVSA9IDA7CiAKLQl3aGlsZSAoRGF0YVNpemUgPiBMRU5HVEhfODAyXzMpCi0JeworCXdoaWxlIChEYXRhU2l6ZSA+IExFTkdUSF84MDJfMykgewogCiAJCW5NU0RVKys7CiAKLQkJcEFNU0RVc3ViaGVhZGVyID0gKFBIRUFERVJfODAyXzMpcERhdGE7Ci0JCVBheWxvYWRTaXplID0gcEFNU0RVc3ViaGVhZGVyLT5PY3RldFsxXSArIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdPDw4KTsKKwkJLypoZXhfZHVtcCgic3ViaGVhZGVyIiwgcERhdGEsIDY0KTsgKi8KKwkJcEFNU0RVc3ViaGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzMgKikgcERhdGE7CisJCS8qcERhdGEgKz0gTEVOR1RIXzgwMl8zOyAqLworCQlQYXlsb2FkU2l6ZSA9CisJCSAgICBwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzFdICsKKwkJICAgIChwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzBdIDw8IDgpOwogCQlTdWJGcmFtZVNpemUgPSBQYXlsb2FkU2l6ZSArIExFTkdUSF84MDJfMzsKIAotCi0JCWlmICgoRGF0YVNpemUgPCBTdWJGcmFtZVNpemUpIHx8IChQYXlsb2FkU2l6ZSA+IDE1MTggKSkKLQkJeworCQlpZiAoKERhdGFTaXplIDwgU3ViRnJhbWVTaXplKSB8fCAoUGF5bG9hZFNpemUgPiAxNTE4KSkgewogCQkJYnJlYWs7CiAJCX0KKwkJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVkIHN1YmZyYW1lOiBTaXplID0gJWRcbiIsICBuTVNEVSwgUGF5bG9hZFNpemUpKTsgKi8KIAogCQlwUGF5bG9hZCA9IHBEYXRhICsgTEVOR1RIXzgwMl8zOwogCQlwREEgPSBwRGF0YTsKIAkJcFNBID0gcERhdGEgKyBNQUNfQUREUl9MRU47CiAKLQkJLy8gY29udmVydCB0byA4MDIuMyBoZWFkZXIKLSAgICAgICAgQ09OVkVSVF9UT184MDJfMyhIZWFkZXI4MDJfMywgcERBLCBwU0EsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSwgcFJlbW92ZWRMTENTTkFQKTsKKwkJLyogY29udmVydCB0byA4MDIuMyBoZWFkZXIgKi8KKwkJQ09OVkVSVF9UT184MDJfMyhIZWFkZXI4MDJfMywgcERBLCBwU0EsIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSwKKwkJCQkgcFJlbW92ZWRMTENTTkFQKTsKIAotCQlpZiAoKEhlYWRlcjgwMl8zWzEyXSA9PSAweDg4KSAmJiAoSGVhZGVyODAyXzNbMTNdID09IDB4OEUpICkKLQkJewotCQkgICAgLy8gYXZvaWQgbG9jYWwgaGVhcCBvdmVyZmxvdywgdXNlIGR5YW5hbWljIGFsbG9jYXRpb24KLQkJICAgTUxNRV9RVUVVRV9FTEVNICpFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCSAgIGlmIChFbGVtID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JCSAgIG1lbW1vdmUoRWxlbS0+TXNnKyhMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0gpLCBwUGF5bG9hZCwgUGF5bG9hZFNpemUpOwotCQkgICBFbGVtLT5Nc2dMZW4gPSBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyBQYXlsb2FkU2l6ZTsKLQkJICAgV3BhRUFQT0xLZXlBY3Rpb24ocEFkLCBFbGVtKTsKLQkJICAga2ZyZWUoRWxlbSk7CisJCWlmICgoSGVhZGVyODAyXzNbMTJdID09IDB4ODgpICYmIChIZWFkZXI4MDJfM1sxM10gPT0gMHg4RSkpIHsKKwkJCS8qIGF2b2lkIGxvY2FsIGhlYXAgb3ZlcmZsb3csIHVzZSBkeWFuYW1pYyBhbGxvY2F0aW9uICovCisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtID0KKwkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKwkJCWlmIChFbGVtICE9IE5VTEwpIHsKKwkJCQltZW1tb3ZlKEVsZW0tPk1zZyArCisJCQkJCShMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0gpLAorCQkJCQlwUGF5bG9hZCwgUGF5bG9hZFNpemUpOworCQkJCUVsZW0tPk1zZ0xlbiA9CisJCQkJICAgIExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArCisJCQkJICAgIFBheWxvYWRTaXplOworCQkJCS8qV3BhRUFQT0xLZXlBY3Rpb24ocEFkLCBFbGVtKTsgKi8KKwkJCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgQlNTSURfV0NJRCwKKwkJCQkJCQkgIEVsZW0tPk1zZywKKwkJCQkJCQkgIEVsZW0tPk1zZ0xlbiwgMCwgMCwgMCwKKwkJCQkJCQkgIDApOworCQkJCWtmcmVlKEVsZW0pOworCQkJfQogCQl9CiAKIAkJewotCSAgICAgICAgCWlmIChwUmVtb3ZlZExMQ1NOQVApCi0JICAgICAgICAJewotCSAgICAJCQlwUGF5bG9hZCAtPSBMRU5HVEhfODAyXzM7Ci0JICAgIAkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKLQkgICAgCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKLQkgICAgICAgIAl9CisJCQlpZiAocFJlbW92ZWRMTENTTkFQKSB7CisJCQkJcFBheWxvYWQgLT0gTEVOR1RIXzgwMl8zOworCQkJCVBheWxvYWRTaXplICs9IExFTkdUSF84MDJfMzsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUGF5bG9hZCwgJkhlYWRlcjgwMl8zWzBdLAorCQkJCQkgICAgICAgTEVOR1RIXzgwMl8zKTsKKwkJCX0KIAkJfQogCiAJCXBDbG9uZVBhY2tldCA9IENsb25lUGFja2V0KHBBZCwgcFBhY2tldCwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKLQkJaWYgKHBDbG9uZVBhY2tldCkKLQkJewotCQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwQ2xvbmVQYWNrZXQsIFJUTVBfR0VUX1BBQ0tFVF9JRihwUGFja2V0KSk7CisJCWlmIChwQ2xvbmVQYWNrZXQpIHsKKwkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcENsb25lUGFja2V0LAorCQkJCQkJCSBSVE1QX0dFVF9QQUNLRVRfSUYKKwkJCQkJCQkgKHBQYWNrZXQpKTsKIAkJfQogCisJCS8qIEEtTVNEVSBoYXMgcGFkZGluZyB0byBtdWx0aXBsZSBvZiA0IGluY2x1ZGluZyBzdWJmcmFtZSBoZWFkZXIuICovCisJCS8qIGFsaWduIFN1YkZyYW1lU2l6ZSB1cCB0byBtdWx0aXBsZSBvZiA0ICovCisJCVN1YkZyYW1lU2l6ZSA9IChTdWJGcmFtZVNpemUgKyAzKSAmICh+MHgzKTsKIAotCQkvLyBBLU1TRFUgaGFzIHBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBpbmNsdWRpbmcgc3ViZnJhbWUgaGVhZGVyLgotCQkvLyBhbGlnbiBTdWJGcmFtZVNpemUgdXAgdG8gbXVsdGlwbGUgb2YgNAotCQlTdWJGcmFtZVNpemUgPSAoU3ViRnJhbWVTaXplKzMpJih+MHgzKTsKLQotCi0JCWlmIChTdWJGcmFtZVNpemUgPiAxNTI4IHx8IFN1YkZyYW1lU2l6ZSA8IDMyKQotCQl7CisJCWlmIChTdWJGcmFtZVNpemUgPiAxNTI4IHx8IFN1YkZyYW1lU2l6ZSA8IDMyKSB7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChEYXRhU2l6ZSA+IFN1YkZyYW1lU2l6ZSkKLQkJeworCQlpZiAoRGF0YVNpemUgPiBTdWJGcmFtZVNpemUpIHsKIAkJCXBEYXRhICs9IFN1YkZyYW1lU2l6ZTsKIAkJCURhdGFTaXplIC09IFN1YkZyYW1lU2l6ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGVuZCBvZiBBLU1TRFUKKwkJfSBlbHNlIHsKKwkJCS8qIGVuZCBvZiBBLU1TRFUgKi8KIAkJCURhdGFTaXplID0gMDsKIAkJfQogCX0KIAotCS8vIGZpbmFsbHkgcmVsZWFzZSBvcmlnaW5hbCByeCBwYWNrZXQKKwkvKiBmaW5hbGx5IHJlbGVhc2Ugb3JpZ2luYWwgcnggcGFja2V0ICovCiAJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogCiAJcmV0dXJuIG5NU0RVOwogfQogCi0KLVVJTlQgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCit1MzIgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewotCVBVQ0hBUgkJCXBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplOwotCVVJTlQJCQluTVNEVSA9IDA7CisJdTggKnBEYXRhOworCXUxNiBEYXRhU2l6ZTsKKwl1MzIgbk1TRFUgPSAwOwogCi0JcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JRGF0YVNpemUgPSAoVVNIT1JUKSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKKwlwRGF0YSA9ICh1OCAqKUdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKKwlEYXRhU2l6ZSA9ICh1MTYpR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CiAKIAluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKIAogCXJldHVybiBuTVNEVTsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC0yMDg5LDQwICsxNTAxLDM3IEBACiAJCXBFbnRyeSAtIHBvaW50ZXIgdG8gdGhlIE1BQyBlbnRyeTsgTlVMTCBpcyBub3QgZm91bmQKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JUFVDSEFSIHBBZGRyKQorc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqTWFjVGFibGVMb29rdXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpCiB7Ci0JVUxPTkcgSGFzaElkeDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBIYXNoSWR4OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKIAlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CiAJcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKIAotCXdoaWxlIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaCkpCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKKwl3aGlsZSAocEVudHJ5CisJICAgICAgICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTCisJCSAgIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKSB7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkgewogCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CiAJfQogCiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydEVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIJCQlwQWRkciwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCUlOIEJPT0xFQU4JQ2xlYW5BbGwpCitzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpNYWNUYWJsZUluc2VydEVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHU4ICpwQWRkciwKKwkJCQkgICAgIHU4IGFwaWR4LCBJTiBCT09MRUFOIENsZWFuQWxsKQogewotCVVDSEFSIEhhc2hJZHg7CisJdTggSGFzaElkeDsKIAlpbnQgaSwgRmlyc3RXY2lkOwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7CisvKiAgICAgIHUxNiAgb2Zmc2V0OyAqLworLyogICAgICB1bnNpZ25lZCBsb25nICAgYWRkcjsgKi8KIAotCS8vIGlmIEZVTEwsIHJldHVybgorCS8qIGlmIEZVTEwsIHJldHVybiAqLwogCWlmIChwQWQtPk1hY1RhYi5TaXplID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMjEzMSwyMyArMTU0MCwyMSBAQAogCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKIAkJRmlyc3RXY2lkID0gMjsKIAotCS8vIGFsbG9jYXRlIG9uZSBNQUMgZW50cnkKKwkvKiBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5ICovCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQlmb3IgKGkgPSBGaXJzdFdjaWQ7IGk8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspICAgLy8gc2tpcCBlbnRyeSMwIHNvIHRoYXQgImVudHJ5IGluZGV4ID09IEFJRCIgZm9yIGZhc3QgbG9va3VwCisJZm9yIChpID0gRmlyc3RXY2lkOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykJLyogc2tpcCBlbnRyeSMwIHNvIHRoYXQgImVudHJ5IGluZGV4ID09IEFJRCIgZm9yIGZhc3QgbG9va3VwICovCiAJewotCQkvLyBwaWNrIHVwIHRoZSBmaXJzdCBhdmFpbGFibGUgdmFjYW5jeQorCQkvKiBwaWNrIHVwIHRoZSBmaXJzdCBhdmFpbGFibGUgdmFjYW5jeSAqLwogCQlpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBGQUxTRSkgJiYKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNXRFMgPT0gRkFMU0UpICYmCi0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGk9PSBGQUxTRSkgJiYKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNNZXNoID09IEZBTFNFKQotCQkJKQotCQl7CisJCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzV0RTID09IEZBTFNFKSAmJgorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0FwQ2xpID09IEZBTFNFKSAmJgorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc01lc2ggPT0gRkFMU0UpCisJCSAgICApIHsKIAkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCQkJaWYgKENsZWFuQWxsID09IFRSVUUpCi0JCQl7CisJCQlpZiAoQ2xlYW5BbGwgPT0gVFJVRSkgewogCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CiAJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gUkFURV8xMTsKLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5KSk7CiAJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOwogCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CiAJCQl9CkBAIC0yMTY0LDc3ICsxNTcxLDc2IEBACiAJCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gRkFMU0U7CiAJCQlwRW50cnktPnBBZCA9IHBBZDsKIAkJCXBFbnRyeS0+Q01UaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOworCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9CisJCQkgICAgRUFQT0xfU1RBUlRfRElTQUJMRTsKIAkJCXBFbnRyeS0+UlNOSUVfTGVuID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLAorCQkJCSAgICAgICBzaXplb2YocEVudHJ5LT5SX0NvdW50ZXIpKTsKIAkJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKIAogCQkJaWYgKHBFbnRyeS0+VmFsaWRBc01lc2gpCi0JCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNIKTsKKwkJCQlwRW50cnktPmFwaWR4ID0KKwkJCQkgICAgKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX01FU0gpOwogCQkJZWxzZSBpZiAocEVudHJ5LT5WYWxpZEFzQXBDbGkpCi0JCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSk7CisJCQkJcEVudHJ5LT5hcGlkeCA9CisJCQkJICAgIChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSk7CiAJCQllbHNlIGlmIChwRW50cnktPlZhbGlkQXNXRFMpCi0JCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMpOworCQkJCXBFbnRyeS0+YXBpZHggPQorCQkJCSAgICAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKTsKIAkJCWVsc2UKIAkJCQlwRW50cnktPmFwaWR4ID0gYXBpZHg7CiAKIAkJCXsKIAkJCQl7CiAJCQkJCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQkJCQkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsOwotI2lmZGVmIFJUMjg2MAotCQkJCQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIHBFbnRyeS0+YXBpZHgsIChVQ0hBUilpKTsKLSNlbmRpZgorCQkJCQlwRW50cnktPldlcFN0YXR1cyA9CisJCQkJCSAgICBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCQkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9CisJCQkJCSAgICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLAorCQkJCQkJCQkgICBwRW50cnktPgorCQkJCQkJCQkgICBhcGlkeCwKKwkJCQkJCQkJICAgKHU4KWkpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCQkJCX0KIAkJCX0KIAogCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOwogCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOwogCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotI2lmZGVmIFJUMjg2MAotCQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJCShwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykpCi0JCQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJZWxzZQotI2VuZGlmCiAJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwogCiAJCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOwogCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKIAkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOwogCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKLQkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOworCQkJcEVudHJ5LT5BaWQgPSAodTE2KWk7CS8qMDsgKi8KIAkJCXBFbnRyeS0+Q2FwYWJpbGl0eUluZm8gPSAwOwogCQkJcEVudHJ5LT5Qc01vZGUgPSBQV1JfQUNUSVZFOwogCQkJcEVudHJ5LT5Qc1FJZGxlQ291bnQgPSAwOwogCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOworCQkJcEVudHJ5LT5Bc3NvY0RlYWRMaW5lID0gTUFDX1RBQkxFX0FTU09DX1RJTUVPVVQ7CiAJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKIAkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKIAorCQkJcEFkLT5NYWNUYWIuU2l6ZSsrOworCQkJLyogQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlICovCisJCQlSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpOwogCi0JCQlwQWQtPk1hY1RhYi5TaXplICsrOwotCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCi0JCQlSVDI4WFhfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSk7Ci0KLQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZUluc2VydEVudHJ5IC0gYWxsb2NhdGUgZW50cnkgIyVkLCBUb3RhbD0gJWRcbiIsaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTWFjVGFibGVJbnNlcnRFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLAorCQkJCSAgaSwgcEFkLT5NYWNUYWIuU2l6ZSkpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLQkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JaWYgKHBFbnRyeSkKLQl7CisJLyogYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZSAqLworCWlmIChwRW50cnkpIHsKIAkJSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOwotCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQl7CisJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpIHsKIAkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKIAkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQogCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKQEAgLTIyNTIsMTQgKzE2NTgsMTQgQEAKIAkJRGVsZXRlIGEgc3BlY2lmaWVkIGNsaWVudCBmcm9tIE1BQyB0YWJsZQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpCitCT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHUxNiB3Y2lkLCB1OCAqcEFkZHIpCiB7Ci0JVVNIT1JUIEhhc2hJZHg7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnksICpwUHJldkVudHJ5LCAqcFByb2JlRW50cnk7CisJdTE2IEhhc2hJZHg7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCAqcFByZXZFbnRyeSwgKnBQcm9iZUVudHJ5OwogCUJPT0xFQU4gQ2FuY2VsbGVkOworCS8qdTE2ICAgICAgICBvZmZzZXQ7IC8vIHVudXNlZCB2YXJpYWJsZSAqLworCS8qdTggajsgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkIHZhcmlhYmxlICovCiAKIAlpZiAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAkJcmV0dXJuIEZBTFNFOwpAQCAtMjI2NywzNiArMTY3MywzMyBAQAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKIAlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7CisJLypwRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOyAqLwogCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOwogCi0JaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNNZXNoCi0JCSkpCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKKwlpZiAocEVudHJ5CisJICAgICYmIChwRW50cnktPlZhbGlkQXNDTEkgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzV0RTCisJCXx8IHBFbnRyeS0+VmFsaWRBc01lc2gpKSB7CisJCWlmIChNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBBZGRyKSkgewogCi0JCQkvLyBEZWxldGUgdGhpcyBlbnRyeSBmcm9tIEFTSUMgb24tY2hpcCBXQ0lEIFRhYmxlCi0JCQlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHdjaWQpOworCQkJLyogRGVsZXRlIHRoaXMgZW50cnkgZnJvbSBBU0lDIG9uLWNoaXAgV0NJRCBUYWJsZSAqLworCQkJUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgd2NpZCk7CiAKLQkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCisJCQkvKiBmcmVlIHJlc291cmNlcyBvZiBCQSAqLwogCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBwRW50cnktPkFpZCk7CiAKIAkJCXBQcmV2RW50cnkgPSBOVUxMOwogCQkJcFByb2JlRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwogCQkJQVNTRVJUKHBQcm9iZUVudHJ5KTsKIAotCQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQkJZG8KLQkJCXsKLQkJCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJCXsKLQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQkJewotCQkJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkvKiB1cGRhdGUgSGFzaCBsaXN0ICovCisJCQlkbyB7CisJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkgeworCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKSB7CisJCQkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0KKwkJCQkJCSAgICBwRW50cnktPnBOZXh0OworCQkJCQl9IGVsc2UgeworCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPQorCQkJCQkJICAgIHBFbnRyeS0+cE5leHQ7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMjMwNSw0OCArMTcwOCw0MyBAQAogCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwogCQkJfSB3aGlsZSAocFByb2JlRW50cnkpOwogCi0JCQkvLyBub3QgZm91bmQgISEhCisJCQkvKiBub3QgZm91bmQgISAqLwogCQkJQVNTRVJUKHBQcm9iZUVudHJ5ICE9IE5VTEwpOwogCi0JCQlSVDI4WFhfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCU1MwLCB3Y2lkKTsKKwkJCVJUTVBfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCU1MwLCB3Y2lkKTsKIAorCQkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0KKwkJCSAgICBFQVBPTF9TVEFSVF9ESVNBQkxFKSB7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPgorCQkJCQkJRW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsCisJCQkJCQkmQ2FuY2VsbGVkKTsKKwkJCQlwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nID0KKwkJCQkgICAgRUFQT0xfU1RBUlRfRElTQUJMRTsKKwkJCX0KIAotCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQotCQl7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+RW5xdWV1ZVN0YXJ0Rm9yUFNLVGltZXIsICZDYW5jZWxsZWQpOwotCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7Ci0JCX0KLQotCi0gICAJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNQUNfVEFCTEVfRU5UUlkpKTsKLQkJCXBBZC0+TWFjVGFiLlNpemUgLS07Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZURlbGV0ZUVudHJ5MSAtIFRvdGFsPSAlZFxuIiwgcEFkLT5NYWNUYWIuU2l6ZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpbnRrKCJcbiVzOiBJbXBvc3NpYmxlIFdjaWQgPSAlZCAhISEhIVxuIiwgX19mdW5jX18sIHdjaWQpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSkpOworCQkJcEFkLT5NYWNUYWIuU2l6ZS0tOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsCisJCQkJICBwQWQtPk1hY1RhYi5TaXplKSk7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiXG4lczogSW1wb3NzaWJsZSBXY2lkID0gJWQgIVxuIiwKKwkJCQkgIF9fZnVuY19fLCB3Y2lkKSk7CiAJCX0KIAl9CiAKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwogCi0JLy9SZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4KLQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKQotCXsKKwkvKlJlc2V0IG9wZXJhdGluZyBtb2RlIHdoZW4gbm8gU3RhLiAqLworCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDApIHsKIAkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gMDsKLSNpZmRlZiBSVDI4NjAKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwIC8qcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKi8sIChBTExOX1NFVFBST1RFQ1QpLCBUUlVFLCAwIC8qcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiovKTsKLSNlbHNlCi0JCS8vIGVkaXQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0Ci0JCS8vIFNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlCi0JCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1VQREFURV9QUk9URUNULCBOVUxMLCAwKTsKLSNlbmRpZgorCQlSVE1QX1VQREFURV9QUk9URUNUKHBBZCk7CS8qIGVkaXQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0ICovCiAJfQogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMjM1NCwzNCArMTc1MiwzMCBAQAogCQl0aGUgcG93ZXItc2F2aW5nIHF1ZXVlcyBhcmUgZnJlZWQgaGVyZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1hY1RhYmxlUmVzZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgIHBBZCkKK3ZvaWQgTWFjVGFibGVSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JaW50ICAgICAgICAgaTsKKwlpbnQgaTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY1RhYmxlUmVzZXRcbiIpKTsKLQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CisJLypOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOyAqLwogCi0JZm9yIChpPTE7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0jaWZkZWYgUlQyODYwCi0JCVJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7Ci0jZW5kaWYKLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQotCSAgIHsKLQkJCS8vIGZyZWUgcmVzb3VyY2VzIG9mIEJBCisJZm9yIChpID0gMTsgaSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkgeworCisJCQkvKiBmcmVlIHJlc291cmNlcyBvZiBCQSAqLwogCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBpKTsKIAogCQkJcEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID0gRkFMU0U7CiAKLQotCi0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIsIDYpOwotCQkJUlQyOFhYX1NUQV9FTlRSWV9NQUNfUkVTRVQocEFkLCBpKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwkJCVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIGkpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgaSk7CisJCQkvKkFzaWNEZWxXY2lkVGFiKHBBZCwgaSk7ICovCiAJCX0KIAl9CiAKQEAgLTIzOTYsMjIgKzE3OTAsMTkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBBc3NvY1Bhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAotCUlOIFBVQ0hBUiAgICAgICAgICAgICAgICAgICAgIHBBZGRyLAotCUlOIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvLAotCUlOIFVMT05HICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsCi0JSU4gVVNIT1JUICAgICAgICAgICAgICAgICAgICAgTGlzdGVuSW50dikKK3ZvaWQgQXNzb2NQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSAqQXNzb2NSZXEsCisJCSAgIHU4ICpwQWRkciwKKwkJICAgdTE2IENhcGFiaWxpdHlJbmZvLAorCQkgICB1bnNpZ25lZCBsb25nIFRpbWVvdXQsIHUxNiBMaXN0ZW5JbnR2KQogewogCUNPUFlfTUFDX0FERFIoQXNzb2NSZXEtPkFkZHIsIHBBZGRyKTsKLQkvLyBBZGQgbWFzayB0byBzdXBwb3J0IDgwMi4xMWIgbW9kZSBvbmx5Ci0JQXNzb2NSZXEtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOyAvLyBub3QgY2YtcG9sbGFibGUsIG5vdCBjZi1wb2xsLXJlcXVlc3QKKwkvKiBBZGQgbWFzayB0byBzdXBwb3J0IDgwMi4xMWIgbW9kZSBvbmx5ICovCisJQXNzb2NSZXEtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOwkvKiBub3QgY2YtcG9sbGFibGUsIG5vdCBjZi1wb2xsLXJlcXVlc3QgKi8KIAlBc3NvY1JlcS0+VGltZW91dCA9IFRpbWVvdXQ7CiAJQXNzb2NSZXEtPkxpc3RlbkludHYgPSBMaXN0ZW5JbnR2OwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTI0MjAsMTcgKzE4MTEsMTQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgKkRpc2Fzc29jUmVxLAotCUlOIFBVQ0hBUiBwQWRkciwKLQlJTiBVU0hPUlQgUmVhc29uKQordm9pZCBEaXNhc3NvY1Bhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxICpEaXNhc3NvY1JlcSwKKwkJICAgICAgdTggKnBBZGRyLCB1MTYgUmVhc29uKQogewogCUNPUFlfTUFDX0FERFIoRGlzYXNzb2NSZXEtPkFkZHIsIHBBZGRyKTsKIAlEaXNhc3NvY1JlcS0+UmVhc29uID0gUmVhc29uOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI0NjUsNzYgKzE4NTMsNjkgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLUJPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQorQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewotCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOwotCVVMT05HCQkJTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOwotCVVMT05HCQkJQ3VycmVudE9mZnNldCA9IDA7Ci0JUFZPSUQJCQlwVmlydHVhbEFkZHJlc3MgPSBOVUxMOwotCVVJTlQJCQlOZGlzQnVmZmVyTGVuZ3RoOwotCVBVQ0hBUgkJCXBTcmM7Ci0JVVNIT1JUCQkJUHJvdG9jb2w7Ci0JVUNIQVIJCQlCeXRlT2Zmc2V0MzYgPSAwOwotCVVDSEFSCQkJQnl0ZU9mZnNldDM4ID0gMDsKLQlCT09MRUFOIAkJUmVhZEZpcnN0UGFybSA9IFRSVUU7CisJc3RydWN0IHJ0X3BhY2tldF9pbmZvIFBhY2tldEluZm87CisJdW5zaWduZWQgbG9uZyBOdW1iZXJPZkJ5dGVzUmVhZCA9IDA7CisJdW5zaWduZWQgbG9uZyBDdXJyZW50T2Zmc2V0ID0gMDsKKwl2b2lkICpwVmlydHVhbEFkZHJlc3MgPSBOVUxMOworCXUzMiBOZGlzQnVmZmVyTGVuZ3RoOworCXU4ICpwU3JjOworCXUxNiBQcm90b2NvbDsKKwl1OCBCeXRlT2Zmc2V0MzYgPSAwOworCXU4IEJ5dGVPZmZzZXQzOCA9IDA7CisJQk9PTEVBTiBSZWFkRmlyc3RQYXJtID0gVFJVRTsKIAotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAoUFVDSEFSICopJnBWaXJ0dWFsQWRkcmVzcywgJk5kaXNCdWZmZXJMZW5ndGgpOworCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAodTggKiopICYgcFZpcnR1YWxBZGRyZXNzLAorCQkJICAgICAmTmRpc0J1ZmZlckxlbmd0aCk7CiAKIAlOdW1iZXJPZkJ5dGVzUmVhZCArPSBOZGlzQnVmZmVyTGVuZ3RoOwotCXBTcmMgPSAoUFVDSEFSKSBwVmlydHVhbEFkZHJlc3M7CisJcFNyYyA9ICh1OCAqKXBWaXJ0dWFsQWRkcmVzczsKIAlQcm90b2NvbCA9ICoocFNyYyArIDEyKSAqIDI1NiArICoocFNyYyArIDEzKTsKIAotCS8vCi0JLy8gQ2hlY2sgREhDUCAmIEJPT1RQIHByb3RvY29sCi0JLy8KLQl3aGlsZSAoTnVtYmVyT2ZCeXRlc1JlYWQgPD0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCkKLQl7Ci0JCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKQotCQl7Ci0JCQlDdXJyZW50T2Zmc2V0ID0gMzUgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKKwkvKiAqLworCS8qIENoZWNrIERIQ1AgJiBCT09UUCBwcm90b2NvbCAqLworCS8qICovCisJd2hpbGUgKE51bWJlck9mQnl0ZXNSZWFkIDw9IFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGgpIHsKKwkJaWYgKChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNSkgJiYgKFJlYWRGaXJzdFBhcm0gPT0gVFJVRSkpIHsKKwkJCUN1cnJlbnRPZmZzZXQgPQorCQkJICAgIDM1IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CiAJCQlCeXRlT2Zmc2V0MzYgPSAqKHBTcmMgKyBDdXJyZW50T2Zmc2V0KTsKIAkJCVJlYWRGaXJzdFBhcm0gPSBGQUxTRTsKIAkJfQogCi0JCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykKLQkJewotCQkJQ3VycmVudE9mZnNldCA9IDM3IC0gKE51bWJlck9mQnl0ZXNSZWFkIC0gTmRpc0J1ZmZlckxlbmd0aCk7CisJCWlmIChOdW1iZXJPZkJ5dGVzUmVhZCA+PSAzNykgeworCQkJQ3VycmVudE9mZnNldCA9CisJCQkgICAgMzcgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKIAkJCUJ5dGVPZmZzZXQzOCA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOwotCQkJLy9FbmQgb2YgUmVhZAorCQkJLypFbmQgb2YgUmVhZCAqLwogCQkJYnJlYWs7CiAJCX0KIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCS8vIENoZWNrIGZvciBESENQICYgQk9PVFAgcHJvdG9jb2wKLQlpZiAoKEJ5dGVPZmZzZXQzNiAhPSAweDQ0KSB8fCAoQnl0ZU9mZnNldDM4ICE9IDB4NDMpKQotCQl7Ci0JCS8vCi0JCS8vIDIwNTQgKGhleCAwODA2KSBmb3IgQVJQIGRhdGFncmFtcwotCQkvLyBpZiB0aGlzIHBhY2tldCBpcyBub3QgQVJQIGRhdGFncmFtcywgdGhlbiBkbyBub3RoaW5nCi0JCS8vIEFSUCBkYXRhZ3JhbXMgd2lsbCBhbHNvIGJlIGR1cGxpY2F0ZSBhdCAxbWIgYnJvYWRjYXN0IGZyYW1lcwotCQkvLwotCQlpZiAoUHJvdG9jb2wgIT0gMHgwODA2ICkKKwkvKiBDaGVjayBmb3IgREhDUCAmIEJPT1RQIHByb3RvY29sICovCisJaWYgKChCeXRlT2Zmc2V0MzYgIT0gMHg0NCkgfHwgKEJ5dGVPZmZzZXQzOCAhPSAweDQzKSkgeworCQkvKiAqLworCQkvKiAyMDU0IChoZXggMDgwNikgZm9yIEFSUCBkYXRhZ3JhbXMgKi8KKwkJLyogaWYgdGhpcyBwYWNrZXQgaXMgbm90IEFSUCBkYXRhZ3JhbXMsIHRoZW4gZG8gbm90aGluZyAqLworCQkvKiBBUlAgZGF0YWdyYW1zIHdpbGwgYWxzbyBiZSBkdXBsaWNhdGUgYXQgMW1iIGJyb2FkY2FzdCBmcmFtZXMgKi8KKwkJLyogKi8KKwkJaWYgKFByb3RvY29sICE9IDB4MDgwNikKIAkJCXJldHVybiBGQUxTRTsKLQkJfQorCX0KIAogCXJldHVybiBUUlVFOwogfQogCi0KLUJPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQorQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewotCVVTSE9SVAlUeXBlTGVuOwotCVVDSEFSCUJ5dGUwLCBCeXRlMTsKLQlQVUNIQVIJcFNyY0J1ZjsKLQlVSU5UMzIJcGt0TGVuOwotCVVJTlQxNiAJc3JjUG9ydCwgZHN0UG9ydDsKLQlCT09MRUFOCXN0YXR1cyA9IFRSVUU7Ci0KKwl1MTYgVHlwZUxlbjsKKwl1OCBCeXRlMCwgQnl0ZTE7CisJdTggKnBTcmNCdWY7CisJdTMyIHBrdExlbjsKKwl1MTYgc3JjUG9ydCwgZHN0UG9ydDsKKwlCT09MRUFOIHN0YXR1cyA9IFRSVUU7CiAKIAlwU3JjQnVmID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwogCXBrdExlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwpAQCAtMjU0MywzNSArMTkyNCwzMSBAQAogCiAJUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKHBQYWNrZXQsIDApOwogCi0JLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkCi0JVHlwZUxlbiA9IChwU3JjQnVmWzEyXSA8PCA4KSArIHBTcmNCdWZbMTNdOworCS8qIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZCAqLworCVR5cGVMZW4gPSAocFNyY0J1ZlsxMl0gPDwgOCkgfCBwU3JjQnVmWzEzXTsKIAotCXBTcmNCdWYgKz0gTEVOR1RIXzgwMl8zOwkvLyBTa2lwIHRoZSBFdGhlcm5ldCBIZWFkZXIuCisJcFNyY0J1ZiArPSBMRU5HVEhfODAyXzM7CS8qIFNraXAgdGhlIEV0aGVybmV0IEhlYWRlci4gKi8KIAotCWlmIChUeXBlTGVuIDw9IDE1MDApCi0JewkvLyA4MDIuMywgODAyLjMgTExDCisJaWYgKFR5cGVMZW4gPD0gMTUwMCkgewkvKiA4MDIuMywgODAyLjMgTExDICovCiAJCS8qCi0JCQlEZXN0TUFDKDYpICsgU3JjTUFDKDYpICsgTGVuZ2h0KDIpICsKLQkJCURTQVAoMSkgKyBTU0FQKDEpICsgQ29udHJvbCgxKSArCi0JCQlpZiB0aGUgRFNBUCA9IDB4QUEsIFNTQVA9MHhBQSwgQ29udG9ybCA9IDB4MDMsIGl0IGhhcyBhIDUtYnl0ZXMgU05BUCBoZWFkZXIuCi0JCQkJPT4gKyBTTkFQICg1LCBPcmlnaW5hdGlvbklEKDMpICsgZXRoZXJUeXBlKDIpKQotCQkqLwotCQlpZiAocFNyY0J1ZlswXSA9PSAweEFBICYmIHBTcmNCdWZbMV0gPT0gMHhBQSAmJiBwU3JjQnVmWzJdID09IDB4MDMpCi0JCXsKLQkJCVNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIocFNyY0J1ZiwgNiwgJkJ5dGUwLCAmQnl0ZTEpOworCQkgICBEZXN0TUFDKDYpICsgU3JjTUFDKDYpICsgTGVuZ2h0KDIpICsKKwkJICAgRFNBUCgxKSArIFNTQVAoMSkgKyBDb250cm9sKDEpICsKKwkJICAgaWYgdGhlIERTQVAgPSAweEFBLCBTU0FQPTB4QUEsIENvbnRvcmwgPSAweDAzLCBpdCBoYXMgYSA1LWJ5dGVzIFNOQVAgaGVhZGVyLgorCQkgICA9PiArIFNOQVAgKDUsIE9yaWdpbmF0aW9uSUQoMykgKyBldGhlclR5cGUoMikpCisJCSAqLworCQlpZiAocFNyY0J1ZlswXSA9PSAweEFBICYmIHBTcmNCdWZbMV0gPT0gMHhBQQorCQkgICAgJiYgcFNyY0J1ZlsyXSA9PSAweDAzKSB7CisJCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKChjaGFyICopcFNyY0J1ZiwgNiwKKwkJCQkJCSAgJkJ5dGUwLCAmQnl0ZTEpOwogCQkJUlRNUF9TRVRfUEFDS0VUX0xMQ1NOQVAocFBhY2tldCwgMSk7Ci0JCQlUeXBlTGVuID0gKFVTSE9SVCkoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOwotCQkJcFNyY0J1ZiArPSA4OyAvLyBTa2lwIHRoaXMgTExDL1NOQVAgaGVhZGVyCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL0l0IGp1c3QgaGFzIDMtYnl0ZSBMTEMgaGVhZGVyLCBtYXliZSBhIGxlZ2FjeSBldGhlciB0eXBlIGZyYW1lLiB3ZSBkaWRuJ3QgaGFuZGxlIGl0LgorCQkJVHlwZUxlbiA9ICh1MTYpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCXBTcmNCdWYgKz0gODsJLyogU2tpcCB0aGlzIExMQy9TTkFQIGhlYWRlciAqLworCQl9IGVsc2UgeworCQkJLypJdCBqdXN0IGhhcyAzLWJ5dGUgTExDIGhlYWRlciwgbWF5YmUgYSBsZWdhY3kgZXRoZXIgdHlwZSBmcmFtZS4gd2UgZGlkbid0IGhhbmRsZSBpdC4gKi8KIAkJfQogCX0KLQotCS8vIElmIGl0J3MgYSBWTEFOIHBhY2tldCwgZ2V0IHRoZSByZWFsIFR5cGUvTGVuZ3RoIGZpZWxkLgotCWlmIChUeXBlTGVuID09IDB4ODEwMCkKLQl7CisJLyogSWYgaXQncyBhIFZMQU4gcGFja2V0LCBnZXQgdGhlIHJlYWwgVHlwZS9MZW5ndGggZmllbGQuICovCisJaWYgKFR5cGVMZW4gPT0gMHg4MTAwKSB7CiAJCS8qIDB4ODEwMCBtZWFucyBWTEFOIHBhY2tldHMgKi8KIAogCQkvKiBEZXN0LiBNQUMgQWRkcmVzcyAoNi1ieXRlcykgKwpAQCAtMjU4NCwyNDMgKzE5NjEsMjI5IEBACiAJCSAgIEZyYW1lIENoZWNrIFNlcXVlbmNlICg0LWJ5dGVzKSAqLwogCiAJCVJUTVBfU0VUX1BBQ0tFVF9WTEFOKHBQYWNrZXQsIDEpOwotCQlTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKHBTcmNCdWYsIDIsICZCeXRlMCwgJkJ5dGUxKTsKLQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigoY2hhciAqKXBTcmNCdWYsIDIsICZCeXRlMCwKKwkJCQkJICAmQnl0ZTEpOworCQlUeXBlTGVuID0gKHUxNikoKEJ5dGUwIDw8IDgpICsgQnl0ZTEpOwogCi0JCXBTcmNCdWYgKz0gNDsgLy8gU2tpcCB0aGUgVkxBTiBIZWFkZXIuCisJCXBTcmNCdWYgKz0gNDsJLyogU2tpcCB0aGUgVkxBTiBIZWFkZXIuICovCiAJfQogCi0Jc3dpdGNoIChUeXBlTGVuKQotCXsKLQkJY2FzZSAweDA4MDA6Ci0JCQl7Ci0JCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwotCQkJCWlmICgqKHBTcmNCdWYgKyA5KSA9PSAweDExKQotCQkJCXsJLy8gdWRwIHBhY2tldAotCQkJCQlBU1NFUlQoKHBrdExlbiA+IDM0KSk7CS8vIDE0IGZvciBldGhlcm5ldCBoZWFkZXIsIDIwIGZvciBJUCBoZWFkZXIKKwlzd2l0Y2ggKFR5cGVMZW4pIHsKKwljYXNlIDB4MDgwMDoKKwkJeworCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOworCQkJaWYgKCoocFNyY0J1ZiArIDkpID09IDB4MTEpIHsJLyogdWRwIHBhY2tldCAqLworCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsJLyogMTQgZm9yIGV0aGVybmV0IGhlYWRlciwgMjAgZm9yIElQIGhlYWRlciAqLwogCi0JCQkJCXBTcmNCdWYgKz0gMjA7CS8vIFNraXAgdGhlIElQIGhlYWRlcgotCQkJCQlzcmNQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopcFNyY0J1ZikpOwotCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoKigoVUlOVDE2ICopKHBTcmNCdWYgKzIpKSk7CisJCQkJcFNyY0J1ZiArPSAyMDsJLyogU2tpcCB0aGUgSVAgaGVhZGVyICovCisJCQkJc3JjUG9ydCA9CisJCQkJICAgIE9TX05UT0hTKGdldF91bmFsaWduZWQKKwkJCQkJICAgICAoKHUxNiAqKShwU3JjQnVmKSkpOworCQkJCWRzdFBvcnQgPQorCQkJCSAgICBPU19OVE9IUyhnZXRfdW5hbGlnbmVkCisJCQkJCSAgICAgKCh1MTYgKikocFNyY0J1ZiArIDIpKSk7CiAKLQkJCQkJaWYgKChzcmNQb3J0PT0weDQ0ICYmIGRzdFBvcnQ9PTB4NDMpIHx8IChzcmNQb3J0PT0weDQzICYmIGRzdFBvcnQ9PTB4NDQpKQotCQkJCQl7CS8vSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0Ci0JCQkJCQlSVE1QX1NFVF9QQUNLRVRfREhDUChwUGFja2V0LCAxKTsKLQkJCQkJfQorCQkJCWlmICgoc3JjUG9ydCA9PSAweDQ0ICYmIGRzdFBvcnQgPT0gMHg0MykgfHwgKHNyY1BvcnQgPT0gMHg0MyAmJiBkc3RQb3J0ID09IDB4NDQpKSB7CS8qSXQncyBhIEJPT1RQL0RIQ1AgcGFja2V0ICovCisJCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOwogCQkJCX0KIAkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDB4MDgwNjoKLQkJCXsKLQkJCQkvL0FSUCBQYWNrZXQuCi0JCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDg4OGU6Ci0JCQl7Ci0JCQkJLy8gRUFQT0wgUGFja2V0LgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3RhdHVzID0gRkFMU0U7Ci0JCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4MDgwNjoKKwkJeworCQkJLypBUlAgUGFja2V0LiAqLworCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDg4OGU6CisJCXsKKwkJCS8qIEVBUE9MIFBhY2tldC4gKi8KKwkJCVJUTVBfU0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0LCAxKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSBGQUxTRTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKIAogfQogCit2b2lkIFVwZGF0ZV9Sc3NpX1NhbXBsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfcnNzaV9zYW1wbGUgKnBSc3NpLCBzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJKQoreworCWNoYXIgcnNzaTAgPSBwUnhXSS0+UlNTSTA7CisJY2hhciByc3NpMSA9IHBSeFdJLT5SU1NJMTsKKwljaGFyIHJzc2kyID0gcFJ4V0ktPlJTU0kyOwogCi0KLVZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKQotCQl7Ci0JQ0hBUglyc3NpMCA9IHBSeFdJLT5SU1NJMDsKLQlDSEFSCXJzc2kxID0gcFJ4V0ktPlJTU0kxOwotCUNIQVIJcnNzaTIgPSBwUnhXSS0+UlNTSTI7Ci0KLQlpZiAocnNzaTAgIT0gMCkKLQl7Ci0JCXBSc3NpLT5MYXN0UnNzaTAJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTAsIFJTU0lfMCk7Ci0JCXBSc3NpLT5BdmdSc3NpMFg4CT0gKHBSc3NpLT5BdmdSc3NpMFg4IC0gcFJzc2ktPkF2Z1Jzc2kwKSArIHBSc3NpLT5MYXN0UnNzaTA7Ci0JCXBSc3NpLT5BdmdSc3NpMAk9IHBSc3NpLT5BdmdSc3NpMFg4ID4+IDM7CisJaWYgKHJzc2kwICE9IDApIHsKKwkJcFJzc2ktPkxhc3RSc3NpMCA9IENvbnZlcnRUb1Jzc2kocEFkLCAoY2hhcilyc3NpMCwgUlNTSV8wKTsKKwkJcFJzc2ktPkF2Z1Jzc2kwWDggPQorCQkgICAgKHBSc3NpLT5BdmdSc3NpMFg4IC0gcFJzc2ktPkF2Z1Jzc2kwKSArIHBSc3NpLT5MYXN0UnNzaTA7CisJCXBSc3NpLT5BdmdSc3NpMCA9IHBSc3NpLT5BdmdSc3NpMFg4ID4+IDM7CiAJfQogCi0JaWYgKHJzc2kxICE9IDApCi0JewotCQlwUnNzaS0+TGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kxLCBSU1NJXzEpOwotCQlwUnNzaS0+QXZnUnNzaTFYOAk9IChwUnNzaS0+QXZnUnNzaTFYOCAtIHBSc3NpLT5BdmdSc3NpMSkgKyBwUnNzaS0+TGFzdFJzc2kxOwotCQlwUnNzaS0+QXZnUnNzaTEJPSBwUnNzaS0+QXZnUnNzaTFYOCA+PiAzOworCWlmIChyc3NpMSAhPSAwKSB7CisJCXBSc3NpLT5MYXN0UnNzaTEgPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKGNoYXIpcnNzaTEsIFJTU0lfMSk7CisJCXBSc3NpLT5BdmdSc3NpMVg4ID0KKwkJICAgIChwUnNzaS0+QXZnUnNzaTFYOCAtIHBSc3NpLT5BdmdSc3NpMSkgKyBwUnNzaS0+TGFzdFJzc2kxOworCQlwUnNzaS0+QXZnUnNzaTEgPSBwUnNzaS0+QXZnUnNzaTFYOCA+PiAzOwogCX0KIAotCWlmIChyc3NpMiAhPSAwKQotCXsKLQkJcFJzc2ktPkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMiwgUlNTSV8yKTsKLQkJcFJzc2ktPkF2Z1Jzc2kyWDggID0gKHBSc3NpLT5BdmdSc3NpMlg4IC0gcFJzc2ktPkF2Z1Jzc2kyKSArIHBSc3NpLT5MYXN0UnNzaTI7CisJaWYgKHJzc2kyICE9IDApIHsKKwkJcFJzc2ktPkxhc3RSc3NpMiA9IENvbnZlcnRUb1Jzc2kocEFkLCAoY2hhcilyc3NpMiwgUlNTSV8yKTsKKwkJcFJzc2ktPkF2Z1Jzc2kyWDggPQorCQkgICAgKHBSc3NpLT5BdmdSc3NpMlg4IC0gcFJzc2ktPkF2Z1Jzc2kyKSArIHBSc3NpLT5MYXN0UnNzaTI7CiAJCXBSc3NpLT5BdmdSc3NpMiA9IHBSc3NpLT5BdmdSc3NpMlg4ID4+IDM7CiAJfQogfQogCi0KLQotLy8gTm9ybWFsIGxlZ2FjeSBSeCBwYWNrZXQgaW5kaWNhdGlvbgotVk9JRCBJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKKy8qIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24gKi8KK3ZvaWQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JVUNIQVIJCQlIZWFkZXI4MDJfM1tMRU5HVEhfODAyXzNdOworCXZvaWQgKnBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCXU4IEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CiAKLQkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCi0JLy8gMi4gcmVtb3ZlIExMQwotCS8vIAkJYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQKLQkvLyAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplCisJLyogMS4gZ2V0IDgwMi4zIEhlYWRlciAqLworCS8qIDIuIHJlbW92ZSBMTEMgKi8KKwkvKiAgICAgICAgICAgICAgYS4gcG9pbnRlciBwUnhCbGstPnBEYXRhIHRvIHBheWxvYWQgKi8KKwkvKiAgICAgIGIuIG1vZGlmeSBwUnhCbGstPkRhdGFTaXplICovCiAJUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhwUnhCbGssIEhlYWRlcjgwMl8zKTsKIAotCWlmIChwUnhCbGstPkRhdGFTaXplID4gTUFYX1JYX1BLVF9MRU4pCi0JeworCWlmIChwUnhCbGstPkRhdGFTaXplID4gTUFYX1JYX1BLVF9MRU4pIHsKIAotCQkvLyByZWxlYXNlIHBhY2tldAorCQkvKiByZWxlYXNlIHBhY2tldCAqLwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAotCiAJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7CiAKLSNpZmRlZiBSVDI4NzAKLQlpZiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApCi0JewotCQlQQkFfUkVDX0VOVFJZCQlwQkFFbnRyeTsKLQkJVUxPTkcJCQkJTm93MzI7Ci0JCVVDSEFSCQkJCVdjaWQgPSBwUnhCbGstPnBSeFdJLT5XaXJlbGVzc0NsaUlEOwotCQlVQ0hBUgkJCQlUSUQgPSBwUnhCbGstPnBSeFdJLT5USUQ7Ci0JCVVTSE9SVAkJCQlJZHg7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSB7CisJCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5OworCQl1bnNpZ25lZCBsb25nIE5vdzMyOworCQl1OCBXY2lkID0gcFJ4QmxrLT5wUnhXSS0+V2lyZWxlc3NDbGlJRDsKKwkJdTggVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOworCQl1MTYgSWR4OwogCi0jZGVmaW5lIFJFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQJCSgoMTAwICogSFopLzEwMDApCS8vIHN5c3RlbSB0aWNrcyAtLSAxMDAgbXMKKyNkZWZpbmUgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVAkJKCgxMDAgKiBPU19IWikvMTAwMCkJLyogc3lzdGVtIHRpY2tzIC0tIDEwMCBtcyAqLwogCi0JCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXsKKwkJaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkgewogCQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOwotCQkJaWYgKElkeCAhPSAwKQotCQkJeworCQkJaWYgKElkeCAhPSAwKSB7CiAJCQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQkJCQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCisJCQkJLyogdXBkYXRlIGxhc3QgcnggdGltZSAqLwogCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdzMyKTsKIAkJCQlpZiAoKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAwKSAmJgotCQkJCQkgUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKyhSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCi0JICAgCQkJCSkKLQkJCQl7Ci0JCQkJCXByaW50aygiSW5kaWNhdGVfTGVnYWN5X1BhY2tldCgpOmZsdXNoIHJlb3JkZXJpbmdfdGltZW91dF9tcGR1cyEgUnhXSS0+RmxhZ3M9JWQsIHBSeFdJLlRJRD0lZCwgUnhELT5BTVBEVT0lZCFcbiIsIHBSeEJsay0+RmxhZ3MsIHBSeEJsay0+cFJ4V0ktPlRJRCwgcFJ4QmxrLT5SeEQuQU1QRFUpOwotCQkJCQloZXhfZHVtcCgiRHVtcCB0aGUgbGVnYWN5IFBhY2tldDoiLCBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4QmxrLT5wUnhQYWNrZXQpLCA2NCk7Ci0JCQkJCWJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cyhwQWQsIHBCQUVudHJ5LCBOb3czMik7CisJCQkJICAgIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwKKwkJCQkJCSAgICAodW5zaWduZWQgbG9uZykocEJBRW50cnktPgorCQkJCQkJCQkgICAgTGFzdEluZFNlcUF0VGltZXIKKwkJCQkJCQkJICAgICsKKwkJCQkJCQkJICAgIChSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpCisJCQkJICAgICkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJCQkgKCJJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KCk6Zmx1c2ggcmVvcmRlcmluZ190aW1lb3V0X21wZHVzISBSeFdJLT5GbGFncz0lZCwgcFJ4V0kuVElEPSVkLCBSeEQtPkFNUERVPSVkIVxuIiwKKwkJCQkJCSAgcFJ4QmxrLT5GbGFncywKKwkJCQkJCSAgcFJ4QmxrLT5wUnhXSS0+VElELAorCQkJCQkJICBwUnhCbGstPlJ4RC5BTVBEVSkpOworCQkJCQloZXhfZHVtcCgiRHVtcCB0aGUgbGVnYWN5IFBhY2tldDoiLAorCQkJCQkJIEdFVF9PU19QS1RfREFUQVBUUihwUnhCbGstPgorCQkJCQkJCQkgICAgcFJ4UGFja2V0KSwKKwkJCQkJCSA2NCk7CisJCQkJCWJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cyhwQWQsCisJCQkJCQkJCQkgIHBCQUVudHJ5LAorCQkJCQkJCQkJICBOb3czMik7CiAJCQkJfQogCQkJfQogCQl9CiAJfQotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAJd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KHBBZCwgcFJ4QmxrLCBIZWFkZXI4MDJfMywgRnJvbVdoaWNoQlNTSUQpOwogCi0JLy8KLQkvLyBwYXNzIHRoaXMgODAyLjMgcGFja2V0IHRvIHVwcGVyIGxheWVyIG9yIGZvcndhcmQgdGhpcyBwYWNrZXQgdG8gV00gZGlyZWN0bHkKLQkvLworCS8qICovCisJLyogcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5ICovCisJLyogKi8KIAlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwogfQogCi0KLS8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKLVZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKKy8qIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUgKi8KK3ZvaWQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKLQl7CisJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpIHsKIAkJSW5kaWNhdGVfQU1QRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKLQkJewotCQkJLy8gaGFuZGxlIEEtTVNEVQorCX0gZWxzZSB7CisJCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkgeworCQkJLyogaGFuZGxlIEEtTVNEVSAqLwogCQkJSW5kaWNhdGVfQU1TRFVfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJCX0KIAl9CiB9CiAKLQotVk9JRCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCBDbW1SeFJhbGlua0ZyYW1lSW5kaWNhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107Ci0JVUlOVDE2CQkJTXNkdTJTaXplOwotCVVJTlQxNiAJCQlQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKLQlQVUNIQVIgCQkJcERhdGEyOwotCVBORElTX1BBQ0tFVAlwUGFja2V0MiA9IE5VTEw7CisJdTggSGVhZGVyODAyXzNbTEVOR1RIXzgwMl8zXTsKKwl1MTYgTXNkdTJTaXplOworCXUxNiBQYXlsb2FkMVNpemUsIFBheWxvYWQyU2l6ZTsKKwl1OCAqcERhdGEyOworCXZvaWQgKnBQYWNrZXQyID0gTlVMTDsKIAorCU1zZHUyU2l6ZSA9ICoocFJ4QmxrLT5wRGF0YSkgKyAoKihwUnhCbGstPnBEYXRhICsgMSkgPDwgOCk7CiAKLQotCU1zZHUyU2l6ZSA9ICoocFJ4QmxrLT5wRGF0YSkgKyAoKihwUnhCbGstPnBEYXRhKzEpIDw8IDgpOwotCi0JaWYgKChNc2R1MlNpemUgPD0gMTUzNikgJiYgKE1zZHUyU2l6ZSA8IHBSeEJsay0+RGF0YVNpemUpKQotCXsKKwlpZiAoKE1zZHUyU2l6ZSA8PSAxNTM2KSAmJiAoTXNkdTJTaXplIDwgcFJ4QmxrLT5EYXRhU2l6ZSkpIHsKIAkJLyogc2tpcCB0d28gYnl0ZSBNU0RVMiBsZW4gKi8KIAkJcFJ4QmxrLT5wRGF0YSArPSAyOwogCQlwUnhCbGstPkRhdGFTaXplIC09IDI7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfSBlbHNlIHsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAotCS8vIGdldCA4MDIuMyBIZWFkZXIgYW5kICByZW1vdmUgTExDCisJLyogZ2V0IDgwMi4zIEhlYWRlciBhbmQgIHJlbW92ZSBMTEMgKi8KIAlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOwogCiAJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKIAotCS8vIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZQotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ICsrOworCS8qIFJhbGluayBBZ2dyZWdhdGlvbiBmcmFtZSAqLworCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50Kys7CiAJUGF5bG9hZDFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZSAtIE1zZHUyU2l6ZTsKIAlQYXlsb2FkMlNpemUgPSBNc2R1MlNpemUgLSBMRU5HVEhfODAyXzM7CiAKIAlwRGF0YTIgPSBwUnhCbGstPnBEYXRhICsgUGF5bG9hZDFTaXplICsgTEVOR1RIXzgwMl8zOwogCi0JcFBhY2tldDIgPSBkdXBsaWNhdGVfcGt0KHBBZCwgKHBEYXRhMi1MRU5HVEhfODAyXzMpLCBMRU5HVEhfODAyXzMsIHBEYXRhMiwgUGF5bG9hZDJTaXplLCBGcm9tV2hpY2hCU1NJRCk7CisJcFBhY2tldDIgPQorCSAgICBkdXBsaWNhdGVfcGt0KHBBZCwgKHBEYXRhMiAtIExFTkdUSF84MDJfMyksIExFTkdUSF84MDJfMywgcERhdGEyLAorCQkJICBQYXlsb2FkMlNpemUsIEZyb21XaGljaEJTU0lEKTsKIAotCWlmICghcFBhY2tldDIpCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCWlmICghcFBhY2tldDIpIHsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KLQotCS8vIHVwZGF0ZSBwYXlsb2FkIHNpemUgb2YgMXN0IHBhY2tldAorCS8qIHVwZGF0ZSBwYXlsb2FkIHNpemUgb2YgMXN0IHBhY2tldCAqLwogCXBSeEJsay0+RGF0YVNpemUgPSBQYXlsb2FkMVNpemU7CiAJd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KHBBZCwgcFJ4QmxrLCBIZWFkZXI4MDJfMywgRnJvbVdoaWNoQlNTSUQpOwogCi0JQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOworCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJCSBGcm9tV2hpY2hCU1NJRCk7CiAKLQlpZiAocFBhY2tldDIpCi0JeworCWlmIChwUGFja2V0MikgewogCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBQYWNrZXQyLCBGcm9tV2hpY2hCU1NJRCk7CiAJfQogfQogCi0KICNkZWZpbmUgUkVTRVRfRlJBR0ZSQU1FKF9mcmFnRnJhbWUpIFwKIAl7CQkJCQkJCQlcCiAJCV9mcmFnRnJhbWUuUnhTaXplID0gMDsJCVwKQEAgLTI4MjksMTA5ICsyMTkyLDEwMiBAQAogCQlfZnJhZ0ZyYW1lLkZsYWdzID0gMDsJCVwKIAl9CiAKLQotUE5ESVNfUEFDS0VUIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCit2b2lkICpSVE1QRGVGcmFnbWVudERhdGFGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQlVQ0hBUgkJCSpwRGF0YSA9IHBSeEJsay0+cERhdGE7Ci0JVVNIT1JUCQkJRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOwotCVBORElTX1BBQ0tFVAlwUmV0UGFja2V0ID0gTlVMTDsKLQlVQ0hBUgkJCSpwRnJhZ0J1ZmZlciA9IE5VTEw7Ci0JQk9PTEVBTiAJCWJSZWFzc0RvbmUgPSBGQUxTRTsKLQlVQ0hBUgkJCUhlYWRlclJvb20gPSAwOwotCisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCXZvaWQgKnBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OworCXU4ICpwRGF0YSA9IHBSeEJsay0+cERhdGE7CisJdTE2IERhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKKwl2b2lkICpwUmV0UGFja2V0ID0gTlVMTDsKKwl1OCAqcEZyYWdCdWZmZXIgPSBOVUxMOworCUJPT0xFQU4gYlJlYXNzRG9uZSA9IEZBTFNFOworCXU4IEhlYWRlclJvb20gPSAwOwogCiAJQVNTRVJUKHBIZWFkZXIpOwogCi0JSGVhZGVyUm9vbSA9IHBEYXRhIC0gKFVDSEFSICopcEhlYWRlcjsKKwlIZWFkZXJSb29tID0gcERhdGEgLSAodTggKikgcEhlYWRlcjsKIAotCS8vIFJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKLQlpZiAocEhlYWRlci0+RnJhZyA9PSAwKQkJLy8gRnJhZy4gTnVtYmVyIGlzIDAgOiBGaXJzdCBmcmFnIG9yIG9ubHkgb25lIHBrdAorCS8qIFJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMgKi8KKwlpZiAocEhlYWRlci0+RnJhZyA9PSAwKQkvKiBGcmFnLiBOdW1iZXIgaXMgMCA6IEZpcnN0IGZyYWcgb3Igb25seSBvbmUgcGt0ICovCiAJewotCQkvLyB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuCi0JCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKLQkJeworCQkvKiB0aGUgZmlyc3QgcGt0IG9mIGZyYWdtZW50LCByZWNvcmQgaXQuICovCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykgewogCQkJQVNTRVJUKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKLQkJCXBGcmFnQnVmZmVyID0gR0VUX09TX1BLVF9EQVRBUFRSKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KTsKLQkJCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgID0gRGF0YVNpemUgKyBIZWFkZXJSb29tOwotCQkJTmRpc01vdmVNZW1vcnkocEZyYWdCdWZmZXIsCSBwSGVhZGVyLCBwQWQtPkZyYWdGcmFtZS5SeFNpemUpOworCQkJcEZyYWdCdWZmZXIgPQorCQkJICAgIEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CisJCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgPSBEYXRhU2l6ZSArIEhlYWRlclJvb207CisJCQlOZGlzTW92ZU1lbW9yeShwRnJhZ0J1ZmZlciwgcEhlYWRlciwKKwkJCQkgICAgICAgcEFkLT5GcmFnRnJhbWUuUnhTaXplKTsKIAkJCXBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlID0gcEhlYWRlci0+U2VxdWVuY2U7Ci0JCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CSAgIC8vIFNob3VsZCBiZSAwCisJCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CS8qIFNob3VsZCBiZSAwICovCiAJCQlBU1NFUlQocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPT0gMCk7Ci0JCQlnb3RvIGRvbmU7CS8vIGVuZCBvZiBwcm9jZXNzaW5nIHRoaXMgZnJhbWUKKwkJCWdvdG8gZG9uZTsJLyogZW5kIG9mIHByb2Nlc3NpbmcgdGhpcyBmcmFtZSAqLwogCQl9Ci0JfQotCWVsc2UJLy9NaWRkbGUgJiBFbmQgb2YgZnJhZ21lbnQKKwl9IGVsc2UJCQkvKk1pZGRsZSAmIEVuZCBvZiBmcmFnbWVudCAqLwogCXsKIAkJaWYgKChwSGVhZGVyLT5TZXF1ZW5jZSAhPSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkgfHwKLQkJCShwSGVhZGVyLT5GcmFnICE9IChwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyArIDEpKSkKLQkJewotCQkJLy8gRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIKLQkJCS8vIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrCisJCSAgICAocEhlYWRlci0+RnJhZyAhPSAocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgKyAxKSkpIHsKKwkJCS8qIEZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyICovCisJCQkvKiBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsayAqLwogCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZyYWdtZW50IGlzIG5vdCB0aGUgc2FtZSBzZXF1ZW5jZSBvciBvdXQgb2YgZnJhZ21lbnQgbnVtYmVyIG9yZGVyLlxuIikpOwotCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJfQotCQllbHNlIGlmICgocEFkLT5GcmFnRnJhbWUuUnhTaXplICsgRGF0YVNpemUpID4gTUFYX0ZSQU1FX1NJWkUpCi0JCXsKLQkJCS8vIEZyYWdtZW50IGZyYW1lIGlzIHRvbyBsYXJnZSwgaXQgZXhlZWRzIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUuCi0JCQkvLyBSZXNldCBGcmFnbWVudCBjb250cm9sIGJsaworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRnJhZ21lbnQgaXMgbm90IHRoZSBzYW1lIHNlcXVlbmNlIG9yIG91dCBvZiBmcmFnbWVudCBudW1iZXIgb3JkZXIuXG4iKSk7CisJCQlnb3RvIGRvbmU7CS8qIGdpdmUgdXAgdGhpcyBmcmFtZSAqLworCQl9IGVsc2UgaWYgKChwQWQtPkZyYWdGcmFtZS5SeFNpemUgKyBEYXRhU2l6ZSkgPiBNQVhfRlJBTUVfU0laRSkgeworCQkJLyogRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS4gKi8KKwkJCS8qIFJlc2V0IEZyYWdtZW50IGNvbnRyb2wgYmxrICovCiAJCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRnJhZ21lbnQgZnJhbWUgaXMgdG9vIGxhcmdlLCBpdCBleGVlZHMgdGhlIG1heGltdW0gZnJhbWUgc2l6ZS5cbiIpKTsKLQkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJGcmFnbWVudCBmcmFtZSBpcyB0b28gbGFyZ2UsIGl0IGV4ZWVkcyB0aGUgbWF4aW11bSBmcmFtZSBzaXplLlxuIikpOworCQkJZ290byBkb25lOwkvKiBnaXZlIHVwIHRoaXMgZnJhbWUgKi8KIAkJfQotCi0gICAgICAgIC8vCi0JCS8vIEJyb2FkY29tIEFQKEJDTTk0NzA0QUdSKSB3aWxsIHNlbmQgb3V0IExMQyBpbiBmcmFnbWVudCdzIHBhY2tldCwgTExDIG9ubHkgY2FuIGFjY3BldCBhdCBmaXJzdCBmcmFnbWVudC4KLQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGRyb3B0IGl0LgotCQkvLwotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBEYXRhLCBTTkFQXzgwMl8xSCwgc2l6ZW9mKFNOQVBfODAyXzFIKSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZpbmQgYW5vdGhlciBMTEMgYXQgTWlkZGxlIG9yIEVuZCBmcmFnbWVudChTTj0lZCwgRnJhZz0lZClcbiIsIHBIZWFkZXItPlNlcXVlbmNlLCBwSGVhZGVyLT5GcmFnKSk7Ci0JCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQorCQkvKiAqLworCQkvKiBCcm9hZGNvbSBBUChCQ005NDcwNEFHUikgd2lsbCBzZW5kIG91dCBMTEMgaW4gZnJhZ21lbnQncyBwYWNrZXQsIExMQyBvbmx5IGNhbiBhY2NwZXQgYXQgZmlyc3QgZnJhZ21lbnQuICovCisJCS8qIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCBkcm9wdCBpdC4gKi8KKwkJLyogKi8KKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRGF0YSwgU05BUF84MDJfMUgsIHNpemVvZihTTkFQXzgwMl8xSCkpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJGaW5kIGFub3RoZXIgTExDIGF0IE1pZGRsZSBvciBFbmQgZnJhZ21lbnQoU049JWQsIEZyYWc9JWQpXG4iLAorCQkJCSAgcEhlYWRlci0+U2VxdWVuY2UsIHBIZWFkZXItPkZyYWcpKTsKKwkJCWdvdG8gZG9uZTsJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCiAJCX0KIAogCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7CiAKLQkJLy8gY29uY2F0ZW5hdGUgdGhpcyBmcmFnbWVudCBpbnRvIHRoZSByZS1hc3NlbWJseSBidWZmZXIKLQkJTmRpc01vdmVNZW1vcnkoKHBGcmFnQnVmZmVyICsgcEFkLT5GcmFnRnJhbWUuUnhTaXplKSwgcERhdGEsIERhdGFTaXplKTsKLQkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICArPSBEYXRhU2l6ZTsKLQkJcEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPSBwSGVhZGVyLT5GcmFnOwkgICAvLyBVcGRhdGUgZnJhZ21lbnQgbnVtYmVyCisJCS8qIGNvbmNhdGVuYXRlIHRoaXMgZnJhZ21lbnQgaW50byB0aGUgcmUtYXNzZW1ibHkgYnVmZmVyICovCisJCU5kaXNNb3ZlTWVtb3J5KChwRnJhZ0J1ZmZlciArIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSksIHBEYXRhLAorCQkJICAgICAgIERhdGFTaXplKTsKKwkJcEFkLT5GcmFnRnJhbWUuUnhTaXplICs9IERhdGFTaXplOworCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CS8qIFVwZGF0ZSBmcmFnbWVudCBudW1iZXIgKi8KIAotCQkvLyBMYXN0IGZyYWdtZW50Ci0JCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSBGQUxTRSkKLQkJeworCQkvKiBMYXN0IGZyYWdtZW50ICovCisJCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZyA9PSBGQUxTRSkgewogCQkJYlJlYXNzRG9uZSA9IFRSVUU7CiAJCX0KIAl9CiAKIGRvbmU6Ci0JLy8gYWx3YXlzIHJlbGVhc2UgcnggZnJhZ21lbnRlZCBwYWNrZXQKKwkvKiBhbHdheXMgcmVsZWFzZSByeCBmcmFnbWVudGVkIHBhY2tldCAqLwogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCi0JLy8gcmV0dXJuIGRlZnJhZ21lbnRlZCBwYWNrZXQgaWYgcGFja2V0IGlzIHJlYXNzZW1ibGVkIGNvbXBsZXRlbHkKLQkvLyBvdGhlcndpc2UgcmV0dXJuIE5VTEwKLQlpZiAoYlJlYXNzRG9uZSkKLQl7Ci0JCVBORElTX1BBQ0tFVCBwTmV3RnJhZ1BhY2tldDsKKwkvKiByZXR1cm4gZGVmcmFnbWVudGVkIHBhY2tldCBpZiBwYWNrZXQgaXMgcmVhc3NlbWJsZWQgY29tcGxldGVseSAqLworCS8qIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworCWlmIChiUmVhc3NEb25lKSB7CisJCXZvaWQgKnBOZXdGcmFnUGFja2V0OwogCi0JCS8vIGFsbG9jYXRlIGEgbmV3IHBhY2tldCBidWZmZXIgZm9yIGZyYWdtZW50Ci0JCXBOZXdGcmFnUGFja2V0ID0gUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOwotCQlpZiAocE5ld0ZyYWdQYWNrZXQpCi0JCXsKLQkJCS8vIHVwZGF0ZSBSeEJsaworCQkvKiBhbGxvY2F0ZSBhIG5ldyBwYWNrZXQgYnVmZmVyIGZvciBmcmFnbWVudCAqLworCQlwTmV3RnJhZ1BhY2tldCA9CisJCSAgICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7CisJCWlmIChwTmV3RnJhZ1BhY2tldCkgeworCQkJLyogdXBkYXRlIFJ4QmxrICovCiAJCQlwUmV0UGFja2V0ID0gcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQ7CiAJCQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9IHBOZXdGcmFnUGFja2V0OwotCQkJcFJ4QmxrLT5wSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBHRVRfT1NfUEtUX0RBVEFQVFIocFJldFBhY2tldCk7Ci0JCQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcFJ4QmxrLT5wSGVhZGVyICsgSGVhZGVyUm9vbTsKKwkJCXBSeEJsay0+cEhlYWRlciA9CisJCQkgICAgKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIEdFVF9PU19QS1RfREFUQVBUUihwUmV0UGFja2V0KTsKKwkJCXBSeEJsay0+cERhdGEgPSAodTggKikgcFJ4QmxrLT5wSGVhZGVyICsgSGVhZGVyUm9vbTsKIAkJCXBSeEJsay0+RGF0YVNpemUgPSBwQWQtPkZyYWdGcmFtZS5SeFNpemUgLSBIZWFkZXJSb29tOwogCQkJcFJ4QmxrLT5wUnhQYWNrZXQgPSBwUmV0UGFja2V0OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJUkVTRVRfRlJBR0ZSQU1FKHBBZC0+RnJhZ0ZyYW1lKTsKIAkJfQogCX0KQEAgLTI5MzksMjUgKzIyOTUsMjIgQEAKIAlyZXR1cm4gcFJldFBhY2tldDsKIH0KIAotCi1WT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIEluZGljYXRlX0FNU0RVX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKQogewotCVVJTlQJCQluTVNEVTsKKwl1MzIgbk1TRFU7CiAKIAl1cGRhdGVfb3NfcGFja2V0X2luZm8ocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKIAlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKLQluTVNEVSA9IGRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUpOworCW5NU0RVID0KKwkgICAgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgcFJ4QmxrLT5wRGF0YSwKKwkJCQkgICAgICAgcFJ4QmxrLT5EYXRhU2l6ZSk7CiB9CiAKLVZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKIAl7CiAJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwpAQCAtMjk2NSw0OCArMjMxOCw0MiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJJbmRpY2F0ZV9FQVBPTF9QYWNrZXQ6IGRyb3AgYW5kIHJlbGVhc2UgdGhlIGludmFsaWQgcGFja2V0LlxuIikpOwotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCWlmIChwRW50cnkgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJICgiSW5kaWNhdGVfRUFQT0xfUGFja2V0OiBkcm9wIGFuZCByZWxlYXNlIHRoZSBpbnZhbGlkIHBhY2tldC5cbiIpKTsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIH0KIAotI2RlZmluZSBCQ05fVEJUVF9PRkZTRVQJCTY0CS8vZGVmZXIgNjQgdXMKLVZPSUQgUmVTeW5jQmVhY29uVGltZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKKyNkZWZpbmUgQkNOX1RCVFRfT0ZGU0VUCQk2NAkvKmRlZmVyIDY0IHVzICovCit2b2lkIFJlU3luY0JlYWNvblRpbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCi0JVUlOVDMyICBPZmZzZXQ7Ci0KKwl1MzIgT2Zmc2V0OwogCiAJT2Zmc2V0ID0gKHBBZC0+VGJ0dFRpY2tDb3VudCkgJSAoQkNOX1RCVFRfT0ZGU0VUKTsKIAogCXBBZC0+VGJ0dFRpY2tDb3VudCsrOwogCi0JLy8KLQkvLyBUaGUgdXBkYXRlZCBCZWFjb25JbnRlcnZhbCBWYWx1ZSB3aWxsIGFmZmVjdCBCZWFjb24gSW50ZXJ2YWwgYWZ0ZXIgdHdvIFRCVFQKLQkvLyBiZWFjYXN1ZSB0aGUgb3JpZ2luYWwgQmVhY29uSW50ZXJ2YWwgaGFkIGJlZW4gbG9hZGVkIGludG8gbmV4dCBUQlRUX1RJTUVSCi0JLy8KLQlpZiAoT2Zmc2V0ID09IChCQ05fVEJUVF9PRkZTRVQtMikpCi0JeworCS8qICovCisJLyogVGhlIHVwZGF0ZWQgQmVhY29uSW50ZXJ2YWwgVmFsdWUgd2lsbCBhZmZlY3QgQmVhY29uIEludGVydmFsIGFmdGVyIHR3byBUQlRUICovCisJLyogYmVhY2FzdWUgdGhlIG9yaWdpbmFsIEJlYWNvbkludGVydmFsIGhhZCBiZWVuIGxvYWRlZCBpbnRvIG5leHQgVEJUVF9USU1FUiAqLworCS8qICovCisJaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VUIC0gMikpIHsKIAkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0JCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNCkgLSAxIDsJLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVID0gNjR1cworCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQpIC0gMTsJLyogQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVID0gNjR1cyAqLwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VULTEpKQotCQl7CisJfSBlbHNlIHsKKwkJaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VUIC0gMSkpIHsKIAkJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CiAKIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotCQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCisJCQljc3IuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSA8PCA0OwkvKiBBU0lDIHJlZ2lzdGVyIGluIHVuaXRzIG9mIDEvMTYgVFUgKi8KIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwogCQl9CiAJfQogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV8yODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1N2ZmNDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfMjg2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qCi0gICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFBDSS1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgotCWluIG90aGVyIGZpbGVzLgotCi0qLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi1leHRlcm4gUlRNUF9SRl9SRUdTIFJGMjg1MFJlZ1RhYmxlW107Ci1leHRlcm4gVUNIQVIJTlVNX09GXzI4NTBfQ0hOTDsKLQotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCi0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZWFkZXJMZW47Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQkvLyBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JewotCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JfQotCWVsc2UKLQl7Ci0JCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOwotCi0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotfQotCi0KLVVTSE9SVCBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKLQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0KLQlSZXRUeElkeCA9IFR4SWR4OwotCS8vCi0JLy8gVXBkYXRlIFR4IGluZGV4Ci0JLy8KLQlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKLQlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OwotCi0JKkZyZWVOdW1iZXIgLT0gMTsKLQotCXJldHVybiBSZXRUeElkeDsKLX0KLQotCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhbWVOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCUJPT0xFQU4gYklzTGFzdDsKLQlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7Ci0JVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JVUlOVDMyCQkJQnVmQmFzZVBhTG93OwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlVU0hPUlQJCQlod0hkckxlbjsKLQlVSU5UMzIJCQlmaXJzdERNQUxlbjsKLQotCWJJc0xhc3QgPSAoKGZyYW1lTnVtID09IChwVHhCbGstPlRvdGFsRnJhbWVOdW0gLSAxKSkgPyAxIDogMCk7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQlpZiAoZnJhbWVOdW0gPT0gMCkKLQl7Ci0JCS8vIGNvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKLQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfUkFMSU5LX0ZSQU1FKQotCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKLQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEICsgcFR4QmxrLT5IZHJQYWRMZW4gKyBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQ7Ci0JCWVsc2UKLQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOwotCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKLQotCQlmaXJzdERNQUxlbiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW47Ci0JfQotCWVsc2UKLQl7Ci0JCWZpcnN0RE1BTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCX0KLQotCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQSwgcFR4QmxrLT5IZWFkZXJCdWYsIGZpcnN0RE1BTGVuKTsKLQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsgLy8gaW5jbHVkZSBwYWRkaW5nCi0JcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKLQlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JcFR4RC0+TGFzdFNlYzEgPSAoYklzTGFzdCkgPyAxIDogMDsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci0KLX0KLQotCi1WT0lEIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAotCUlOCVVTSE9SVAkJCUZpcnN0VHhJZHgpCi17Ci0KLQlQVFhXSV9TVFJVQwkJcFR4V0k7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JcFR4V0kgPSAoUFRYV0lfU1RSVUMpIHBUeFJpbmctPkNlbGxbRmlyc3RUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHRvdGFsTVBEVVNpemU7Ci19Ci0KLQotVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlMYXN0VHhJZHgpCi17Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtMYXN0VHhJZHhdLkFsbG9jVmE7Ci0KLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci19Ci0KLQotVVNIT1JUCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhZ051bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCi17Ci0JVUNIQVIJCQkqcERNQUhlYWRlckJ1ZlZBOwotCVVTSE9SVAkJCVR4SWR4LCBSZXRUeElkeDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCVVJTlQzMgkJCUJ1ZkJhc2VQYUxvdzsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0JVVNIT1JUCQkJaHdIZWFkZXJMZW47Ci0JVUlOVDMyCQkJZmlyc3RETUFMZW47Ci0KLQkvLwotCS8vIEdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKLQlwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlCdWZCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0KLQkvLwotCS8vIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKLQkvLwotCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQlmaXJzdERNQUxlbiA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47Ci0JTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOwotCi0KLQkvLwotCS8vIEJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLQotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKQotCXsKLQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JfQotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IGZpcnN0RE1BTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIEZBTFNFLCBGSUZPX0VEQ0EpOwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci0KLX0KLQotLyoKLQlNdXN0IGJlIHJ1biBpbiBJbnRlcnJ1cHQgY29udGV4dAotCVRoaXMgZnVuY3Rpb24gaGFuZGxlIFBDSSBzcGVjaWZpYyBUeERlc2MgYW5kIGNwdSBpbmRleCB1cGRhdGUgYW5kIGtpY2sgdGhlIHBhY2tldCBvdXQuCi0gKi8KLWludCBSdG1wUENJTWdtdEtpY2tPdXQoCi0JSU4gUlRNUF9BREFQVEVSIAkqcEFkLAotCUlOIFVDSEFSIAkJCVF1ZUlkeCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gUFVDSEFSCQkJcFNyY0J1ZlZBLAotCUlOIFVJTlQgCQkJU3JjQnVmTGVuKQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JVUxPTkcJCQlTd0lkeCA9IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHg7Ci0KLQlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0JaWYgKCFwVHhEKQotCQlyZXR1cm4gMDsKLQotCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OwotCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fTUdNVCk7Ci0JcFR4RC0+TGFzdFNlYzAgPSAxOwotCXBUeEQtPkxhc3RTZWMxID0gMTsKLQlwVHhELT5ETUFET05FID0gMDsKLQlwVHhELT5TRExlbjEgPSAwOwotCXBUeEQtPlNEUHRyMCA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOzsKLQlwVHhELT5TRExlbjAgPSBTcmNCdWZMZW47Ci0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0JLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgotCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIE1HTVRfUklOR19TSVpFKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCAgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAotCi0JQXJndW1lbnRzOgotCQlwUnhECQlQb2ludGVyIHRvIHRoZSBSeCBkZXNjcmlwdG9yCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MgCU5vIGVycgotCQlORElTX1NUQVRVU19GQUlMVVJFIAlFcnJvcgotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVBIRUFERVJfODAyXzExCQlwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDIAkJcFJ4V0ksCi0JSU4gIFBSVDI4WFhfUlhEX1NUUlVDIAlwUnhEKQotewotCVBDSVBIRVJfS0VZIHBXcGFLZXk7Ci0JSU5UIGRCbTsKLQotCS8vIFBoeSBlcnJvcnMgJiBDUkMgZXJyb3JzCi0JaWYgKC8qKHBSeEQtPlBoeUVycikgfHwqLyAocFJ4RC0+Q3JjKSkKLQl7Ci0JCS8vIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uCi0JCWRCbSA9IChJTlQpIChwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQkJaWYgKGRCbSA8PSAtODcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtODIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNzIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNjIpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA8PSAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7Ci0JCWVsc2UgaWYgKGRCbSA+IC01NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKLQotCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gQWRkIFJ4IHNpemUgdG8gY2hhbm5lbCBsb2FkIGNvdW50ZXIsIHdlIHNob3VsZCBpZ25vcmUgZXJyb3IgY291bnRzCi0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgKz0gKHBSeEQtPlNETDAgKyAxNCk7Ci0KLQkvLyBEcm9wIFRvRHMgcHJvbWlzY291cyBmcmFtZSwgaXQgaXMgb3BlbmVkIGR1ZSB0byBDQ1ggMiBjaGFubmVsIGxvYWQgc3RhdGlzdGljcwotCWlmIChwSGVhZGVyICE9IE5VTEwpCi0JewotCQlpZiAocEhlYWRlci0+RkMuVG9EcykKLQkJewotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQl9Ci0JfQotCi0JLy8gRHJvcCBub3QgVTJNIGZyYW1lcywgY2FudCdzIGRyb3AgaGVyZSBiZWNhdXNlIHdlIHdpbGwgZHJvcCBiZWFjb24gaW4gdGhpcyBjYXNlCi0JLy8gSSBhbSBraW5kIG9mIGRvdWJ0aW5nIHRoZSBVMk0gYml0IG9wZXJhdGlvbgotCS8vIGlmIChwUnhELT5VMk0gPT0gMCkKLQkvLwlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0KLQkvLyBkcm9wIGRlY3lwdGlvbiBmYWlsIGZyYW1lCi0JaWYgKHBSeEQtPkNpcGhlckVycikKLQl7Ci0JCWlmIChwUnhELT5DaXBoZXJFcnIgPT0gMikKLQkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1Ygb2sgYnV0IE1JQ0VyciAiKSk7fQotCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMSkKLQkJCXtEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJwUnhEIEVSUk9SOiBJQ1YgRXJyICIpKTt9Ci0JCWVsc2UgaWYgKHBSeEQtPkNpcGhlckVyciA9PSAzKQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogS2V5IG5vdCB2YWxpZCAiKSk7Ci0KLSAgICAgICAgaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMSkgPT0gMSkgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIiAlZCAobGVuPSVkLCBNY2FzdD0lZCwgTXlCc3M9JWQsIFdjaWQ9JWQsIEtleUlkPSVkKVxuIiwKLQkJCXBSeEQtPkNpcGhlckVyciwKLQkJCXBSeEQtPlNETDAsCi0JCQlwUnhELT5NY2FzdCB8IHBSeEQtPkJjYXN0LAotCQkJcFJ4RC0+TXlCc3MsCi0JCQlwUnhXSS0+V2lyZWxlc3NDbGlJRCwKLQkJCXBSeFdJLT5LZXlJbmRleCkpOwotCi0JCS8vCi0JCS8vIE1JQyBFcnJvcgotCQkvLwotCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCi0JCXsKLQkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKLQotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKLSAgICAgICAgICAgICAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwV3BhS2V5LT5UeXBlID09IFBBSVJXSVNFS0VZKSA/IFRSVUU6RkFMU0UpOwotICAgICAgICAgICAgZWxzZQotCQkJICAgIFJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOwotCi0gICAgICAgICAgICBpZiAoKChwUnhELT5DaXBoZXJFcnIgJiAyKSA9PSAyKSAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQotICAgICAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3JcbiIpKTsKLQkJfQotCi0JCWlmIChwSGVhZGVyID09IE5VTEwpCi0JCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byBwb3dlciBzYXZlIG1vZGUuCi0JCUJvdGggUmFkaW9PZmYgYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgotCUlucHV0OgotCQlMZXZlbCA9IEdVSVJBRElPX09GRiAgOiBHVUkgUmFkaW8gT2ZmIG1vZGUKLQkJTGV2ZWwgPSBET1QxMVBPV0VSU0FWRSAgOiA4MDIuMTEgcG93ZXIgc2F2ZSBtb2RlCi0JCUxldmVsID0gUlRNUF9IQUxUICA6IFdoZW4gRGlzYWJsZSBkZXZpY2UuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAotCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLQlVQ0hBUgkJaSwgdGVtcEJCUF9SMyA9IDA7Ci0JQk9PTEVBTgkJYnJjID0gRkFMU0UsIENhbmNlbGxlZDsKLSAgICBVSU5UMzIJCVRiVFRUaW1lID0gMDsKLQlVSU5UMzIJCVBzUG9sbFRpbWUgPSAwLCBNQUNWYWx1ZTsKLSAgICBVTE9ORwkJQmVhY29uUGVyaW9kVGltZTsKLSAgICBVSU5UMzIJCVJ4RG1hSWR4LCBSeENwdUlkeDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiBUeENwdUlkeCA9ICVkLCBUeERtYUlkeCA9ICVkLiBSeENwdUlkeCA9ICVkLCBSeERtYUlkeCA9ICVkLlxuIiwgcEFkLT5UeFJpbmdbMF0uVHhDcHVJZHgsIHBBZC0+VHhSaW5nWzBdLlR4RG1hSWR4LCBwQWQtPlJ4UmluZy5SeENwdUlkeCwgcEFkLT5SeFJpbmcuUnhEbWFJZHgpKTsKLQotICAgIC8vIENoZWNrIFJ4IERNQSBidXN5IHN0YXR1cywgaWYgbW9yZSB0aGFuIGhhbGYgaXMgb2NjdXBpZWQsIGdpdmUgdXAgdGhpcyByYWRpbyBvZmYuCi0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYICwgJlJ4RG1hSWR4KTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0NSWF9JRFggLCAmUnhDcHVJZHgpOwotCWlmICgoUnhEbWFJZHggPiBSeENwdUlkeCkgJiYgKChSeERtYUlkeCAtIFJ4Q3B1SWR4KSA+IFJYX1JJTkdfU0laRS8zKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNSYWRpb09mZiA9PT0+IHJldHVybjEuIFJ4RG1hSWR4ID0gJWQgLCAgUnhDcHVJZHggPSAlZC4gXG4iLCBSeERtYUlkeCwgUnhDcHVJZHgpKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmICgoUnhDcHVJZHggPj0gUnhEbWFJZHgpICYmICgoUnhDcHVJZHggLSBSeERtYUlkeCkgPCBSWF9SSU5HX1NJWkUvMykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4yLiAgUnhDcHVJZHggPSAlZC4gUnhEbWFJZHggPSAlZCAsICBcbiIsIFJ4Q3B1SWR4LCBSeERtYUlkeCkpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgLy8gT25jZSBnbyBpbnRvIHRoaXMgZnVuY3Rpb24sIGRpc2FibGUgdHggYmVjYXVzZSBkb24ndCB3YW50IHRvbyBtYW55IHBhY2tldHMgaW4gcXVldWUgdG8gcHJldmVudCBIVyBzdG9wcy4KLQlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKTsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JewotCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOwotCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0KLQkgICAgaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRCVFRfVElNRVIsICZUYlRUVGltZSk7Ci0JCQlUYlRUVGltZSAmPSAweDFmZmZmOwotCQkJLy8gMDAuIGNoZWNrIGlmIG5lZWQgdG8gZG8gc2xlZXAgaW4gdGhpcyBEVElNIHBlcmlvZC4gICBJZiBuZXh0IGJlYWNvbiB3aWxsIGFycml2ZSB3aXRoaW4gMzBtcyAsIC4uLmRvZXNuJ3QgbmVjZXNzYXJpbHkgc2xlZXAuCi0JCQkvLyBUYlRUVGltZSB1aW50ID0gNjR1cywgTEVBRF9USU1FIHVuaXQgPSAxMDI0dXMsIFBzUG9sbFRpbWUgdW5pdCA9IDFtcwotCSAgICAgICAgaWYgICgoKDY0KlRiVFRUaW1lKSA8KChMRUFEX1RJTUUqMTAyNCkgKyA0MDAwMCkpICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRiVFRUaW1lID0gMHgleCAsIGdpdmUgdXAgdGhpcyBzbGVlcC4gXG4iLCBUYlRUVGltZSkpOwotCSAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCQkJCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVBzUG9sbFRpbWUgPSAoNjQqVGJUVFRpbWUtIExFQURfVElNRSoxMDI0KS8xMDAwOwotCQkJCVBzUG9sbFRpbWUgLT0gMzsKLQotCSAgICAgICAgICAgIEJlYWNvblBlcmlvZFRpbWUgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QqMTAyLzEwMDsKLQkJCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IDApCi0JCQkJCVBzUG9sbFRpbWUgKz0gKChUYnR0TnVtVG9OZXh0V2FrZVVwIC0xKSAqIEJlYWNvblBlcmlvZFRpbWUpOwotCi0JICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBUUlVFOwotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCBQc1BvbGxUaW1lKTsKLQkJCX0KLQkJfQotCX0KLQotICAgIC8vIDAuIERpc2FibGUgVHggRE1BLgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKLQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKLQotCS8vIDEuIFdhaXQgRE1BIG5vdCBidXN5Ci0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKLQkJaWYgKChEbWFDZmcuZmllbGQuVHhETUFCdXN5ID09IDApICYmIChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0JCVJUTVB1c2VjRGVsYXkoMjApOwotCQlpKys7Ci0JfXdoaWxlKGkgPCA1MCk7Ci0KLQlpZiAoaSA+PSA1MCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRNQSBrZWVwcyBidXN5LiAgcmV0dXJuIG9uIFJUMjh4eFBjaUFzaWNSYWRpb09mZiAoKVxuIikpOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKLQkJcEFkLT5DaGVja0RtYUJ1c3lDb3VudCsrOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQgPSAwOwotCX0KLQotICAgIFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLQotICAgIC8vIFNldCB0byAxUi4KLQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCi0JewotCQl0ZW1wQkJQX1IzID0gKHBBZC0+U3RhQ2ZnLkJCUFIzICYgMHhFNyk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHRlbXBCQlBfUjMpOwotCX0KLQotCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQlpZiAoTGV2ZWwgIT0gUlRNUF9IQUxUKQotCXsKLQkJLy8gQ2hhbmdlIEludGVycnVwdCBiaXRtYXNrLgotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIEF1dG9XYWtldXBJbnQpOwotCX0KLQllbHNlCi0JewotCQlOSUNEaXNhYmxlSW50ZXJydXB0KHBBZCk7Ci0JfQotCi0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOwotCS8vIERpc2FibGUgTUFDIFJ4Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwgLCAmTUFDVmFsdWUpOwotCU1BQ1ZhbHVlICY9IDB4Zjc7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMICwgTUFDVmFsdWUpOwotCi0JLy8gIDIuIFNlbmQgU2xlZXAgY29tbWFuZAotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKLQkvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIGhpZ2gtYnl0ZSA9IDEgc2F2ZSBwb3dlciBhcyBtdWNoIGFzIHBvc3NpYmxlLiBoaWdoIGJ5dGUgPSAwIHNhdmUgbGVzcyBwb3dlcgotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJTYWZlQ0lELCAweGZmLCAweDEpOwotCS8vICAyLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JLy8gU3RhdHVzID0gMSA6IHN1Y2Nlc3MsIFN0YXR1cyA9IDIsIGFscmVhZHkgc2xlZXAsIFN0YXR1cyA9IDMsIE1heWJlIE1BQyBpcyBidXN5IHNvIGNhbid0IGZpbmlzaCB0aGlzIHRhc2suCi0JYnJjID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOwotCi0gICAgaWYgKGJyYyA9PSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIC8vIHRyeSBhZ2FpbgotICAgIAlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgwMSk7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IHVuaXQ6NDB1cy4KLSAgICAJLy9SVE1QdXNlY0RlbGF5KDIwMCk7Ci0gICAgCWJyYyA9IEFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKLSAgICB9Ci0KLQkvLyAgMy4gQWZ0ZXIgMHgzMCBjb21tYW5kIGlzIG9rLCBzZW5kIHJhZGlvIG9mZiBjb21tYW5kLiBsb3dieXRlID0gMCBmb3IgcG93ZXIgc2FmZS4KLQkvLyBJZiAweDMwIGNvbW1hbmQgaXMgbm90IG9rIHRoaXMgdGltZSwgd2UgY2FuIGlnbm9yZSAweDM1IGNvbW1hbmQuIEl0IHdpbGwgbWFrZSBzdXJlIG5vdCBjYXVzZSBmaXJtd2FyZSdyIHByb2JsZW0uCi0JaWYgKChMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkgJiYgKGJyYyA9PSBUUlVFKSkKLQl7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNSwgUG93ZXJSYWRpb09mZkNJRCwgMCwgMHgwMCk7CS8vIGxvd2J5dGUgPSAwIG1lYW5zIHRvIGRvIHBvd2VyIHNhZmUsIE5PVCB0dXJuIG9mZiByYWRpby4KLQkgCS8vICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JIAlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyUmFkaW9PZmZDSUQpOwotCX0KLQllbHNlIGlmIChicmMgPT0gVFJVRSkKLQl7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNSwgUG93ZXJSYWRpb09mZkNJRCwgMSwgMHgwMCk7CS8vIGxvd2J5dGUgPSAwIG1lYW5zIHRvIGRvIHBvd2VyIHNhZmUsIE5PVCB0dXJuIG9mZiByYWRpby4KLQkgCS8vICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JIAlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyUmFkaW9PZmZDSUQpOwotCX0KLQotICAgIC8vIFdhaXQgRE1BIG5vdCBidXN5Ci0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKLQkJaWYgKChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApICYmIChEbWFDZmcuZmllbGQuVHhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0JCVJUTVB1c2VjRGVsYXkoMjApOwotCQlpKys7Ci0JfXdoaWxlKGkgPCA1MCk7Ci0KLQlpZiAoaSA+PSA1MCkKLQl7Ci0JCXBBZC0+Q2hlY2tEbWFCdXN5Q291bnQrKzsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRE1BIFJ4IGtlZXBzIGJ1c3kuICBvbiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgKClcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5DaGVja0RtYUJ1c3lDb3VudCA9IDA7Ci0JfQotCi0JaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQotCXsKLQkJQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLQkJLy9SVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgOTApOwotCi0JCS8vIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4KLQkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKLQkJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOwotCi0JCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotCQkvLyAxLiBTZXQgYXV0byB3YWtlIHVwIHRpbWVyLgotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7Ci0JCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7Ci0JCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gTEVBRF9USU1FOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0JfQotCi0JLy8gIDQtMS4gSWYgaXQncyB0byBkaXNhYmxlIG91ciBkZXZpY2UuIE5lZWQgdG8gcmVzdG9yZSBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSB0byBpdHMgb3JpZ2luYWwgdmFsdWUuCi0JaWYgKExldmVsID09IFJUTVBfSEFMVCkKLQl7Ci0JCWlmICgoYnJjID09IFRSVUUpICYmIChpIDwgNTApKQotCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAwKTsKLQl9Ci0JLy8gIDQuIFNldCBQQ0kgY29uZmlndXJhdGlvbiBTcGFjZSBMaW5rIENvbXRyb2wgZmllbGRzLiAgT25seSBSYWRpbyBPZmYgbmVlZHMgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uCi0JZWxzZQotCXsKLQkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCi0JCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOwotCX0KLQotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byB3YWtlIHVwIG1vZGUgZnJvbSBwb3dlciBzYXZlIG1vZGUuCi0JCUJvdGggUmFkaW9PbiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCi0JSW5wdXQ6Ci0JCUxldmVsID0gR1VJUkFESU9fT0ZGIDogY2FsbCB0aGlzIGZ1bmN0aW9uIGlzIGZyb20gUmFkaW8gT2ZmIHRvIFJhZGlvIE9uLiAgTmVlZCB0byByZXN0b3JlIFBDSSBob3N0IHZhbHVlLgotCQlMZXZlbCA9IG90aGVyIHZhbHVlIDogbm9ybWFsIHdha2UgdXAgZnVuY3Rpb24uCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICBMZXZlbCkKLXsKLSAgICBXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLQlCT09MRUFOCQkJCUNhbmNlbGxlZCwgYnJ2ID0gVFJVRTsKLSAgICBVSU5UMzIJCQkgICAgTUFDVmFsdWU7Ci0KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCXsKLQkgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCQlpZiAoKExldmVsID09IEdVSVJBRElPX09GRikgfHwgKExldmVsID09IEdVSV9JRExFX1BPV0VSX1NBVkUpCi0JCXx8IChSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4UGNpQXNpY1JhZGlvT24gKClcbiIpKTsKLQkJCS8vIDEuIFNldCBQQ0kgTGluayBDb250cm9sIGluIENvbmZpZ3VyYXRpb24gU3BhY2UuCi0JCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotCQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJfQotCX0KLQotICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgzYTgwKTsKLQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7Ci0KLQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KLQlicnYgPSBBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7Ci0gICAgaWYgKGJydikKLSAgICB7Ci0gICAgCU5JQ0VuYWJsZUludGVycnVwdChwQWQpOwotCi0gICAgCS8vIDMuIEVuYWJsZSBUeCBETUEuCi0gICAgCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKLSAgICAJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKLSAgICAgICAgRG1hQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMTsKLSAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOwotCi0gICAgICAgIC8vIEVhYmxlIE1BQyBSeAotICAgIAlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCAsICZNQUNWYWx1ZSk7Ci0gICAgCU1BQ1ZhbHVlIHw9IDB4ODsKLSAgICAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMICwgTUFDVmFsdWUpOwotCi0gICAgCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotICAgIAlpZiAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkKLSAgICAJewotICAgIAkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCi0gICAgCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLSAgICAJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLSAgICAJCXsKLSAgICAJCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotICAgIAkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLSAgICAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0gICAgCQl9Ci0gICAgCQllbHNlCi0gICAgCQl7Ci0gICAgCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLSAgICAJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLSAgICAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLSAgICAJCX0KLSAgICAJfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLVZPSUQgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgIAkgTGV2ZWwpCi17Ci0gICAgQVVUT19XQUtFVVBfU1RSVUMJQXV0b1dha2V1cENmZzsKLQotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0KLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotICAgIHsKLSAgICAgICAgLy8gU3VwcG9ydCBQQ0llIEFkdmFuY2UgUG93ZXIgU2F2ZQotICAgIAlpZiAoKChMZXZlbCA9PSBGUk9NX1RYKSAmJiAocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPT0gVFJVRSkpIHx8Ci0JCQkoTGV2ZWwgPT0gUlRNUF9IQUxUKSkKLSAgICAJewotICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0gICAgCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PUFzaWNGb3JjZVdha2V1cD09PWJGcm9tVHhcbiIpKTsKLSAgICAJfQotCi0JCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotCQkvLyBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIEhhbHQuIEFMV0FZUyBmb3JjZSB3YWtldXAhISEKLQkJaWYgKExldmVsID09IFJUTVBfSEFMVCkKLQkJewotCQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBSVE1QX0hBTFQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKFJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgRE9UMTFQT1dFUlNBVkUpKQotCQkJewotCQkJCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotCQkJCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJCQl7Ci0JCQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFBDSSwgMjg2MC1QQ0llCi0gICAgICAgIEFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMCk7Ci0JCUF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLSAgICB9Ci0KLSAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLSAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PT09PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cFxuIikpOwotfQotCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKQotewotICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0JewotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQkJcmV0dXJuOwotCX0KLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotICAgIHsKLSAgICAJVUxPTkcJTm93ID0gMDsKLSAgICAgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7Ci0gICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCS8vIElmIGxhc3Qgc2VuZCBOVUxMIGZyYW0gdGltZSBpcyB0b28gY2xvc2UgdG8gdGhpcyByZWNlaXZpbmcgYmVhY29uICh3aXRoaW4gOG1zKSwgZG9uJ3QgZ28gdG8gc2xlZXAgZm9yIHRoaXMgRFRNLgotCQkvLyBCZWNhdXNlIFNvbWUgQVAgY2FuJ3QgcXVldWluZyBvdXRnb2luZyBmcmFtZXMgaW1tZWRpYXRlbHkuCi0JCWlmICgoKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lICsgOCkgPj0gTm93KSAmJiAocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgPD0gTm93KSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdSA6ICBSeENvdW50U2luY2VMYXN0TlVMTCA9ICVsdS4gXG4iLCBOb3csIHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lLCBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPiAwKSAmJiAoKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lICsgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSA+PSBOb3cpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3cgPSAlbHUsIExhc3RTZW5kTlVMTHBzbVRpbWU9JWx1OiBSeENvdW50U2luY2VMYXN0TlVMTCA9ICVsdSA+IDAgXG4iLCBOb3csIHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lLCAgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLSAgICAgICAgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgRE9UMTFQT1dFUlNBVkUsIFRidHROdW1Ub05leHRXYWtlVXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOwotICAgICAgICAvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCi0gICAgICAgIGlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0gICAgICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotICAgICAgICBBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKLSAgICAgICAgQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKLSAgICAgICAgQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSA1OwotICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgICAgIEFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMCk7ICAgLy8gc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSAlcywgVGJ0dE51bVRvTmV4dFdha2VVcD0lZCBcbiIsIF9fZnVuY19fLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7Ci0gICAgfQotICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLX0KLQotVk9JRCBQc1BvbGxXYWtlRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlBzUG9sbFdha2VFeGVjIFxuIikpOwotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLSAgICBpZiAocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcpCi0gICAgewotCSAgICBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotICAgIH0KLSAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi1WT0lEICBSYWRpb09uRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCVdQRE1BX0dMT19DRkdfU1RSVUMJRG1hQ2ZnOwotCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIGZPUF9TVEFUVVNfRE9aRSA9PSBUUlVFOyBcbiIpKTsKLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gU0NBTl9JTl9QUk9HUkVTUzsgXG4iKSk7Ci0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotCQlyZXR1cm47Ci0JfQotICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLQl7Ci0JCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotICAgICAgICBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQotCQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOwotCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KLQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotCi0JCS8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4gU28gd2hlbiBiYWNrIHRvIGNsb2NrIG9uLCBlbmFibGUgaW50ZXJydXB0LgotCQlOSUNFbmFibGVJbnRlcnJ1cHQocEFkKTsKLQotCQkvLyAzLiBFbmFibGUgVHggRE1BLgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZEbWFDZmcud29yZCk7Ci0JCURtYUNmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIERtYUNmZy53b3JkKTsKLQotCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJewotCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQl9Ci0KLQkJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCS8vIFNldCBMRUQKLQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0KLSAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKQotICAgICAgICB7Ci0gICAgCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7Ci0gICAgICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJUkFESU9fT0ZGLCAwKTsKLQl9Ci19Ci0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0gICAgaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLSAgIAkJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7Ci0KLSAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwKLSAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkpKQotICAgIHsKLSAgICAJTklDUmVzZXRGcm9tRXJyb3IocEFkKTsKLQotICAgIAkvKgotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQkJKi8KLQotICAgIAkvLyBFbmFibGUgVHgvUngKLSAgICAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKLQotICAgIAkvLyBDbGVhciBSYWRpbyBvZmYgZmxhZwotICAgIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkgICAgLy8gU2V0IExFRAotCSAgICBSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKLSAgICB9Ci0KLSAgICBpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCi0gICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpKQotICAgIHsKLSAgICAgICAgQk9PTEVBTgkJQ2FuY2VsbGVkOwotCi0gICAgCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0KLSAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKLSAgICAJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotICAgIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOwotICAgIAlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKLSAgICB9Ci19Ci0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotICAgIFdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCVVJTlQzMglpOwotCi0JaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5NbG1lUmFkaW9PZmYoKSByZXR1cm4gb24gYlJhZGlvID09IFRSVUU7IFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQotICAgIAlyZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKLQotCS8vIFNldCBMRUQKLQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7Ci0KLSAgICB7Ci0gICAgCUJPT0xFQU4JCUNhbmNlbGxlZDsKLQotICAgIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICAJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotICAgIAl9Ci0KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLSAgICAgICAgewotICAgICAgICAgICAgQk9PTEVBTiBDYW5jZWxsZWQ7Ci0KLQkJCS8vIEFsd2F5cyByYWRpbyBvbiBzaW5jZSB0aGUgTklDIG5lZWRzIHRvIHNldCB0aGUgTUNVIGNvbW1hbmQgKExFRF9SQURJT19PRkYpLg0KLQkJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgDQotCQkJICAgICAoSURMRV9PTihwQWQpKSAmJiANCi0JCQkgICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkNCi0JCQl7DQotCQkJCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7DQotCQkJfQotCi0gICAgICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCSAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAkmQ2FuY2VsbGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzCi0gICAgICAgIGlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLSAgICAgICAgUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0gICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIC8vIENsZWFuIHVwIG9sZCBic3MgdGFibGUKLSAgICAgICAgQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCi0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7Ci0gICAgCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsKLSAgICAJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOwotICAgIAlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JCXsKLQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgNTAwKTsKLQkJCXJldHVybjsKLQkJfQotICAgIH0KLQotCS8vIFNldCBSYWRpbyBvZmYgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkvLyBEaXNhYmxlIFR4L1J4IERNQQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJICAgLy8gZGlzYWJsZSBETUEKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkgICAvLyBhYm9ydCBhbGwgVFggcmluZ3MKLQotCi0JLy8gTUFDX1NZU19DVFJMID0+IHZhbHVlID0gMHgwID0+IDQwbUEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDApOwotCi0JLy8gUFdSX1BJTl9DRkcgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAwKTsKLQotCS8vIFRYX1BJTl9DRkcgPT4gdmFsdWUgPSAweDAgPT4gMjBtQQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIDApOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQkvLyBXYWl0aW5nIGZvciBETUEgaWRsZQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JfXdoaWxlIChpKysgPCAxMDApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q3M2EwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfcGNpLmMKQEAgLTAsMCArMSwxMDk2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgbXVzdCBiZSBQQ0ktZGVwZW5kZWQsIG9yIHlvdSBzaG91bGQgb3V0IHlvdXIgZnVuY3Rpb24KKwlpbiBvdGhlciBmaWxlcy4KKworKi8KKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKwordTE2IFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkgICAgICAgSU4gQk9PTEVBTiBiSXNMYXN0LCB1MTYgKiBGcmVlTnVtYmVyKQoreworCisJdTggKnBETUFIZWFkZXJCdWZWQTsKKwl1MTYgVHhJZHgsIFJldFR4SWR4OworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXUzMiBCdWZCYXNlUGFMb3c7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKwl1MTYgaHdIZWFkZXJMZW47CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAodTggKilwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwkvKiBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpIHsKKwkJLypod0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOyAqLworCQlod0hlYWRlckxlbiA9CisJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJICAgIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwl9IGVsc2UgeworCQkvKmh3SGVhZGVyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwkJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKwl9CisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwKKwkJICAgICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8qICovCisJLyogYnVpbGQgVHggRGVzY3JpcHRvciAqLworCS8qICovCisKKwlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCisJcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOworCisJUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7CisKKwlSZXRUeElkeCA9IFR4SWR4OworCS8qICovCisJLyogVXBkYXRlIFR4IGluZGV4ICovCisJLyogKi8KKwlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKKwlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OworCisJKkZyZWVOdW1iZXIgLT0gMTsKKworCXJldHVybiBSZXRUeElkeDsKK30KKwordTE2IFJ0bXBQQ0lfV3JpdGVTaW5nbGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgIElOIEJPT0xFQU4gYklzTGFzdCwKKwkJCQkgICAgIHUxNiAqIEZyZWVOdW1iZXIpCit7CisKKwl1OCAqcERNQUhlYWRlckJ1ZlZBOworCXUxNiBUeElkeCwgUmV0VHhJZHg7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdTMyIEJ1ZkJhc2VQYUxvdzsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXUxNiBod0hlYWRlckxlbjsKKworCS8qICovCisJLyogZ2V0IFR4IFJpbmcgUmVzb3VyY2UgKi8KKwkvKiAqLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9ICh1OCAqKXBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCS8qIGNvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIgKi8KKwkvKmh3SGVhZGVyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsgKi8KKwlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwKKwkJICAgICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW4pOworCisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7CisJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCS8qICovCisJLyogYnVpbGQgVHggRGVzY3JpcHRvciAqLworCS8qICovCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7CisJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOworCisJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCXBUeEQtPlNETGVuMCA9IFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZWFkZXJMZW47CS8qIGluY2x1ZGUgcGFkZGluZyAqLworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworCVJldFR4SWR4ID0gVHhJZHg7CisJLyogKi8KKwkvKiBVcGRhdGUgVHggaW5kZXggKi8KKwkvKiAqLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworfQorCit1MTYgUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgdTggZnJhbWVOdW0sIHUxNiAqIEZyZWVOdW1iZXIpCit7CisJQk9PTEVBTiBiSXNMYXN0OworCXU4ICpwRE1BSGVhZGVyQnVmVkE7CisJdTE2IFR4SWR4LCBSZXRUeElkeDsKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwl1MzIgQnVmQmFzZVBhTG93OworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisJdTE2IGh3SGRyTGVuOworCXUzMiBmaXJzdERNQUxlbjsKKworCWJJc0xhc3QgPSAoKGZyYW1lTnVtID09IChwVHhCbGstPlRvdGFsRnJhbWVOdW0gLSAxKSkgPyAxIDogMCk7CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlUeElkeCA9IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeDsKKwlwRE1BSGVhZGVyQnVmVkEgPSAodTggKilwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKKwlCdWZCYXNlUGFMb3cgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7CisKKwlpZiAoZnJhbWVOdW0gPT0gMCkgeworCQkvKiBjb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQorCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOyAqLworCQkJaHdIZHJMZW4gPQorCQkJICAgIHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKworCQkJICAgIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKKwkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCisJCQkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCwgNCkrTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOyAqLworCQkJaHdIZHJMZW4gPQorCQkJICAgIHBUeEJsay0+TXBkdUhlYWRlckxlbiAtCisJCQkgICAgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEICsgcFR4QmxrLT5IZHJQYWRMZW4gKworCQkJICAgIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKKwkJZWxzZQorCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7ICovCisJCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbjsKKwl9IGVsc2UgeworCQlmaXJzdERNQUxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7CisKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKKwlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCisJLyogKi8KKwkvKiBidWlsZCBUeCBEZXNjcmlwdG9yICovCisJLyogKi8KKwlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKKwlOZGlzWmVyb01lbW9yeShwVHhELCBUWERfU0laRSk7CisKKwlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7CisJcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47CS8qIGluY2x1ZGUgcGFkZGluZyAqLworCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTs7CisJcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47CisJcFR4RC0+TGFzdFNlYzAgPSAwOworCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworCVJldFR4SWR4ID0gVHhJZHg7CisJLyogKi8KKwkvKiBVcGRhdGUgVHggaW5kZXggKi8KKwkvKiAqLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworCit9CisKK3ZvaWQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICB1MTYgdG90YWxNUERVU2l6ZSwgdTE2IEZpcnN0VHhJZHgpCit7CisKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJOworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisKKwkvKiAqLworCS8qIGdldCBUeCBSaW5nIFJlc291cmNlICovCisJLyogKi8KKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKKwlwVHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSBwVHhSaW5nLT5DZWxsW0ZpcnN0VHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOworCit9CisKK3ZvaWQgUnRtcFBDSURhdGFMYXN0VHhJZHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBRdWVJZHgsIHUxNiBMYXN0VHhJZHgpCit7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsKKworCS8qICovCisJLyogZ2V0IFR4IFJpbmcgUmVzb3VyY2UgKi8KKwkvKiAqLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKKworCS8qICovCisJLyogYnVpbGQgVHggRGVzY3JpcHRvciAqLworCS8qICovCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbTGFzdFR4SWR4XS5BbGxvY1ZhOworCisJcFR4RC0+TGFzdFNlYzEgPSAxOworCit9CisKK3UxNiBSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICB1OCBmcmFnTnVtLCB1MTYgKiBGcmVlTnVtYmVyKQoreworCXU4ICpwRE1BSGVhZGVyQnVmVkE7CisJdTE2IFR4SWR4LCBSZXRUeElkeDsKKwlzdHJ1Y3QgcnRfdHhkICogcFR4RDsKKwl1MzIgQnVmQmFzZVBhTG93OworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisJdTE2IGh3SGVhZGVyTGVuOworCXUzMiBmaXJzdERNQUxlbjsKKworCS8qICovCisJLyogR2V0IFR4IFJpbmcgUmVzb3VyY2UgKi8KKwkvKiAqLworCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOworCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OworCXBETUFIZWFkZXJCdWZWQSA9ICh1OCAqKXBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOworCUJ1ZkJhc2VQYUxvdyA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKKworCS8qICovCisJLyogQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCS8qICovCisJLypod0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7ICovCisJaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKKworCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsKKwlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7CisKKwkvKiAqLworCS8qIEJ1aWxkIFR4IERlc2NyaXB0b3IgKi8KKwkvKiAqLworCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKSB7CisJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OworCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOworCX0KKworCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKKwlwVHhELT5TRExlbjAgPSBmaXJzdERNQUxlbjsJLyogaW5jbHVkZSBwYWRkaW5nICovCisJcFR4RC0+U0RQdHIxID0gUENJX01BUF9TSU5HTEUocEFkLCBwVHhCbGssIDAsIDEsIFBDSV9ETUFfVE9ERVZJQ0UpOworCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEQtPkxhc3RTZWMwID0gMDsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKKworCVJldFR4SWR4ID0gVHhJZHg7CisJcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCisJLyogKi8KKwkvKiBVcGRhdGUgVHggaW5kZXggKi8KKwkvKiAqLworCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOworCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7CisKKwkqRnJlZU51bWJlciAtPSAxOworCisJcmV0dXJuIFJldFR4SWR4OworCit9CisKKy8qCisJTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKKwlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBQQ0kgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgorICovCitpbnQgUnRtcFBDSU1nbXRLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IFF1ZUlkeCwKKwkJICAgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgICB1OCAqcFNyY0J1ZlZBLCB1MzIgU3JjQnVmTGVuKQoreworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXVuc2lnbmVkIGxvbmcgU3dJZHggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OworCisJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKKworCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCVJUTVBXcml0ZVR4RGVzY3JpcHRvcihwQWQsIHBUeEQsIFRSVUUsIEZJRk9fTUdNVCk7CisJcFR4RC0+TGFzdFNlYzAgPSAxOworCXBUeEQtPkxhc3RTZWMxID0gMTsKKwlwVHhELT5ETUFET05FID0gMDsKKwlwVHhELT5TRExlbjEgPSAwOworCXBUeEQtPlNEUHRyMCA9CisJICAgIFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOworCXBUeEQtPlNETGVuMCA9IFNyY0J1ZkxlbjsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJNTE1FSGFyZFRyYW5zbWl0XG4iKSk7CisJZm9yIChpID0gMDsgaSA8IChUWFdJX1NJWkUrMjQpOyBpKyspCisJeworCisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIleDoiLCAqKHBTcmNCdWZWQStpKSkpOworCQlpZiAoIGklNCA9PSAzKQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiA6OiAiKSk7CisJCWlmICggaSUxNiA9PSAxNSkKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbiAgICAgICIpKTsKKwl9CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlxuICAgICAgIikpOyovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJLyogSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLiAqLworCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIE1HTVRfUklOR19TSVpFKTsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKKworCXJldHVybiAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2hlY2sgUnggZGVzY3JpcHRvciwgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgaWYgYW55IGVycm9yIGRvdW5kCisKKwlBcmd1bWVudHM6CisJCXBSeEQJCVBvaW50ZXIgdG8gdGhlIFJ4IGRlc2NyaXB0b3IKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUwlObyBlcnIKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQlFcnJvcgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVE1QQ2hlY2tSeEVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJLCBJTiBQUlQyOFhYX1JYRF9TVFJVQyBwUnhEKQoreworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5OworCWludCBkQm07CisKKwkvKiBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycyAqLworCWlmICggLyoocFJ4RC0+UGh5RXJyKSB8fCAqLyAocFJ4RC0+Q3JjKSkgeworCQkvKiBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLiAqLworCQlkQm0gPSAoaW50KShwUnhXSS0+UlNTSTApIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKKwkJaWYgKGRCbSA8PSAtODcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzBdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtODIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzFdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzJdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNzIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzNdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzRdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNjIpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzVdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA8PSAtNTcpCisJCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzZdICs9IDE7CisJCWVsc2UgaWYgKGRCbSA+IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbN10gKz0gMTsKKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvKiBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMgKi8KKwlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4RC0+U0RMMCArIDE0KTsKKworCS8qIERyb3AgVG9EcyBwcm9taXNjb3VzIGZyYW1lLCBpdCBpcyBvcGVuZWQgZHVlIHRvIENDWCAyIGNoYW5uZWwgbG9hZCBzdGF0aXN0aWNzICovCisJaWYgKHBIZWFkZXIgIT0gTlVMTCkgeworCQlpZiAocEhlYWRlci0+RkMuVG9EcykgeworCQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKwkvKiBEcm9wIG5vdCBVMk0gZnJhbWVzLCBjYW50J3MgZHJvcCBoZXJlIGJlY2F1c2Ugd2Ugd2lsbCBkcm9wIGJlYWNvbiBpbiB0aGlzIGNhc2UgKi8KKwkvKiBJIGFtIGtpbmQgb2YgZG91YnRpbmcgdGhlIFUyTSBiaXQgb3BlcmF0aW9uICovCisJLyogaWYgKHBSeEQtPlUyTSA9PSAwKSAqLworCS8qICAgICAgcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOyAqLworCisJLyogZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZSAqLworCWlmIChwUnhELT5DaXBoZXJFcnIpIHsKKwkJaWYgKHBSeEQtPkNpcGhlckVyciA9PSAyKSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoInBSeEQgRVJST1I6IElDViBvayBidXQgTUlDRXJyICIpKTsKKwkJfSBlbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMSkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoInBSeEQgRVJST1I6IElDViBFcnIgIikpOworCQl9IGVsc2UgaWYgKHBSeEQtPkNpcGhlckVyciA9PSAzKQorCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJwUnhEIEVSUk9SOiBLZXkgbm90IHZhbGlkICIpKTsKKworCQlpZiAoKChwUnhELT5DaXBoZXJFcnIgJiAxKSA9PSAxKQorCQkgICAgJiYgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgJiYgSU5GUkFfT04ocEFkKSkKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgICBBZGRyLCBCU1MwLCAwKTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiICVkIChsZW49JWQsIE1jYXN0PSVkLCBNeUJzcz0lZCwgV2NpZD0lZCwgS2V5SWQ9JWQpXG4iLAorCQkJICAgICAgcFJ4RC0+Q2lwaGVyRXJyLCBwUnhELT5TREwwLAorCQkJICAgICAgcFJ4RC0+TWNhc3QgfCBwUnhELT5CY2FzdCwgcFJ4RC0+TXlCc3MsCisJCQkgICAgICBwUnhXSS0+V2lyZWxlc3NDbGlJRCwKKy8qICAgICAgICAgICAgICAgICAgICAgIENpcGhlck5hbWVbcFJ4RC0+Q2lwaGVyQWxnXSwgKi8KKwkJCSAgICAgIHBSeFdJLT5LZXlJbmRleCkpOworCisJCS8qICovCisJCS8qIE1JQyBFcnJvciAqLworCQkvKiAqLworCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpIHsKKwkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCisJCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLAorCQkJCQkJCQkgKHBXcGFLZXktPgorCQkJCQkJCQkgIFR5cGUgPT0KKwkJCQkJCQkJICBQQUlSV0lTRUtFWSkgPworCQkJCQkJCQkgVFJVRSA6IEZBTFNFKTsKKwkJCWVsc2UKKwkJCQlSVE1QUmVwb3J0TWljRXJyb3IocEFkLCBwV3BhS2V5KTsKKworCQkJaWYgKCgocFJ4RC0+Q2lwaGVyRXJyICYgMikgPT0gMikKKwkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19NSUNfRVJST1JfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCQkJICAgICAgQlNTMCwgMCk7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSeCBNSUMgVmFsdWUgZXJyb3JcbiIpKTsKKwkJfQorCisJCWlmIChwSGVhZGVyID09IE5VTEwpCisJCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkvKmlmICgocFJ4RC0+Q2lwaGVyQWxnID09IENJUEhFUl9BRVMpICYmCisJCSAgIChwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpCisJCSAgIHsKKwkJICAgLy8KKwkJICAgLy8gQWNjZXB0YWJsZSBzaW5jZSB0aGUgRmlyc3QgRnJhZ0ZyYW1lIG5vIENpcGhlckVyciBwcm9ibGVtLgorCQkgICAvLworCQkgICByZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCSAgIH0gKi8KKworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK0JPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUXVlSWR4KQoreworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdm9pZCAqcFBhY2tldDsKKwl1OCBGUkVFID0gMDsKKwlzdHJ1Y3QgcnRfdHhkIFR4RCwgKnBPcmlUeEQ7CisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgSXJxRmxhZ3M7ICovCisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IEZBTFNFOworCisJQVNTRVJUKFF1ZUlkeCA8IE5VTV9PRl9UWF9SSU5HKTsKKwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGLAorCQkgICAgICAgJnBUeFJpbmctPlR4RG1hSWR4KTsKKwl3aGlsZSAocFR4UmluZy0+VHhTd0ZyZWVJZHggIT0gcFR4UmluZy0+VHhEbWFJZHgpIHsKKy8qICAgICAgICAgICAgICBSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7ICovCisKKwkJLyogc3RhdGljIHJhdGUgYWxzbyBuZWVkIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygpIGZ1bmN0aW9uLiAqLworCQkvKmlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKSAqLworCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKworCQkvKiBOb3RlIDogSWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSksIHdlIHdpbGwgbmV2ZXIgcmVhY2ggaGVyZS4gKi8KKwkJRlJFRSsrOworCQlwVHhEID0KKwkJICAgIChzdHJ1Y3QgcnRfdHhkICopIChwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKKwkJcE9yaVR4RCA9IHBUeEQ7CisJCU5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihzdHJ1Y3QgcnRfdHhkKSk7CisJCXBUeEQgPSAmVHhEOworCisJCXBUeEQtPkRNQURPTkUgPSAwOworCisJCXsKKwkJCXBQYWNrZXQgPQorCQkJICAgIHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLAorCQkJCQkJIHBUeEQtPlNETGVuMSwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJCX0KKwkJCS8qQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyICovCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPQorCQkJICAgIHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKKworCQkJQVNTRVJUKHBQYWNrZXQgPT0gTlVMTCk7CisJCQlpZiAocFBhY2tldCkgeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsCisJCQkJCQkgcFR4RC0+U0RMZW4xLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLypBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyICovCisJCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPQorCQkJICAgIE5VTEw7CisJCX0KKworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9CisJCSAgICAocFR4RC0+U0RMZW4xICsgcFR4RC0+U0RMZW4wKTsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUXVlSWR4XSsrOworCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKKwkJLyogZ2V0IHR4X3RkeF9pZHggYWdhaW4gKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwKKwkJCSAgICAgICAmcFR4UmluZy0+VHhEbWFJZHgpOworCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2Yoc3RydWN0IHJ0X3R4ZCkpOworCisvKiAgICAgICAgIFJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOyAqLworCX0KKworCXJldHVybiBiUmVzY2hlZHVsZTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJUHJvY2VzcyBUWCBSaW5ncyBETUEgRG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIElOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCkKK3sKKy8qICAgICAgdTggICAgICAgICAgICAgICAgICAgQ291bnQgPSAwOyAqLworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IEZBTFNFOworCisJLyogTWFrZSBzdXJlIFR4IHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzICovCisJLypOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisJaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5BYzBEbWFEb25lKQorCQliUmVzY2hlZHVsZSA9IFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFFJRF9BQ19CRSk7CisKKwlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkFjM0RtYURvbmUpCisJCWJSZXNjaGVkdWxlIHw9IFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFFJRF9BQ19WTyk7CisKKwlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkFjMkRtYURvbmUpCisJCWJSZXNjaGVkdWxlIHw9IFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFFJRF9BQ19WSSk7CisKKwlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkFjMURtYURvbmUpCisJCWJSZXNjaGVkdWxlIHw9IFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShwQWQsIFFJRF9BQ19CSyk7CisKKwkvKiBNYWtlIHN1cmUgdG8gcmVsZWFzZSBUeCByaW5nIHJlc291cmNlICovCisJLypOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCisJLyogRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdCAqLworCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisKKwlyZXR1cm4gYlJlc2NoZWR1bGU7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIE1HTVQgcmluZyBETUEgZG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEhhbmRsZU1nbXRSaW5nRG1hRG9uZUludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdm9pZCAqcFBhY2tldDsKKy8qICAgICAgaW50ICAgICAgICAgICAgICBpOyAqLworCXU4IEZSRUUgPSAwOworCXN0cnVjdCBydF9ydG1wX21nbXRfcmluZyAqcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7CisKKwlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX01HTVREVFhfSURYLCAmcE1nbXRSaW5nLT5UeERtYUlkeCk7CisJd2hpbGUgKHBNZ210UmluZy0+VHhTd0ZyZWVJZHggIT0gcE1nbXRSaW5nLT5UeERtYUlkeCkgeworCQlGUkVFKys7CisJCXBUeEQgPQorCQkgICAgKHN0cnVjdCBydF90eGQgKikgKHBNZ210UmluZy0+Q2VsbFtwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4XS4KKwkJCQkgIEFsbG9jVmEpOworCQlwVHhELT5ETUFET05FID0gMDsKKwkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKKworCQlpZiAocFBhY2tldCkgeworCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCX0KKwkJcE1nbXRSaW5nLT5DZWxsW3BNZ210UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKworCQlwUGFja2V0ID0KKwkJICAgIHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7CisJCWlmIChwUGFja2V0KSB7CisJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwkJfQorCQlwTWdtdFJpbmctPkNlbGxbcE1nbXRSaW5nLT5UeFN3RnJlZUlkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJSU5DX1JJTkdfSU5ERVgocE1nbXRSaW5nLT5UeFN3RnJlZUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJfQorCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIuIERlcXVldWUgYWxsIHBvd2VyIHNhZmUgZGVsYXllZCBicmFvZGNhc3QgZnJhbWVzIGFmdGVyIGJlYWNvbi4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QSGFuZGxlVEJUVEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJeworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlci4gUmV3cml0ZSBiZWFjb24gY29udGVudCBiZWZvcmUgbmV4dCBzZW5kLW91dC4KKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJeworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQuLi5cbiIpKTsKKwkJfQorCX0KKworfQorCit2b2lkIFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKworCWlmIChwQWQgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBwQWQgaXMgTlVMTCwgcmV0dXJuLlxuIikpOworCQlyZXR1cm47CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOworCisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKKwlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKKworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7CisJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOworCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9SWCk7CisKKwlSVE1QRW5hYmxlUnhUeChwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0IFxuIikpOworfQorCit2b2lkICpHZXRQYWNrZXRGcm9tUnhSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgT1VUIFBSVDI4WFhfUlhEX1NUUlVDIHBTYXZlUnhELAorCQkJCSBPVVQgQk9PTEVBTiAqIHBiUmVzY2hlZHVsZSwKKwkJCQkgSU4gdTMyICogcFJ4UGVuZGluZykKK3sKKwlzdHJ1Y3QgcnRfcnhkICogcFJ4RDsKKwl2b2lkICpwUnhQYWNrZXQgPSBOVUxMOworCXZvaWQgKnBOZXdQYWNrZXQ7CisJdm9pZCAqQWxsb2NWYTsKKwlkbWFfYWRkcl90IEFsbG9jUGE7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IEZBTFNFOworCXN0cnVjdCBydF9ydG1wX2RtYWNiICpwUnhDZWxsOworCisJUlRNUF9TRU1fTE9DSygmcEFkLT5SeFJpbmdMb2NrKTsKKworCWlmICgqcFJ4UGVuZGluZyA9PSAwKSB7CisJCS8qIEdldCBob3cgbWF5IHBhY2tldHMgaGFkIGJlZW4gcmVjZWl2ZWQgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9EUlhfSURYLCAmcEFkLT5SeFJpbmcuUnhEbWFJZHgpOworCisJCWlmIChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9PSBwQWQtPlJ4UmluZy5SeERtYUlkeCkgeworCQkJLyogbm8gbW9yZSByeCBwYWNrZXRzICovCisJCQliUmVzY2hlZHVsZSA9IEZBTFNFOworCQkJZ290byBkb25lOworCQl9CisJCS8qIGdldCByeCBwZW5kaW5nIGNvdW50ICovCisJCWlmIChwQWQtPlJ4UmluZy5SeERtYUlkeCA+IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4KQorCQkJKnBSeFBlbmRpbmcgPQorCQkJICAgIHBBZC0+UnhSaW5nLlJ4RG1hSWR4IC0gcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7CisJCWVsc2UKKwkJCSpwUnhQZW5kaW5nID0KKwkJCSAgICBwQWQtPlJ4UmluZy5SeERtYUlkeCArIFJYX1JJTkdfU0laRSAtCisJCQkgICAgcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHg7CisKKwl9CisKKwlwUnhDZWxsID0gJnBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdOworCisJLyogUG9pbnQgdG8gUnggaW5kZXhlZCByeCByaW5nIGRlc2NyaXB0b3IgKi8KKwlwUnhEID0gKHN0cnVjdCBydF9yeGQgKikgcFJ4Q2VsbC0+QWxsb2NWYTsKKworCWlmIChwUnhELT5ERE9ORSA9PSAwKSB7CisJCSpwUnhQZW5kaW5nID0gMDsKKwkJLyogRE1BSW5keCBoYWQgZG9uZSBidXQgRERPTkUgYml0IG5vdCByZWFkeSAqLworCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiByZXR1cm4gcnggZGVzY3JpcHRvciAqLworCU5kaXNNb3ZlTWVtb3J5KHBTYXZlUnhELCBwUnhELCBSWERfU0laRSk7CisKKwlwTmV3UGFja2V0ID0KKwkgICAgUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX0FHR1JFU0laRSwgRkFMU0UsCisJCQkJCSZBbGxvY1ZhLCAmQWxsb2NQYSk7CisKKwlpZiAocE5ld1BhY2tldCkgeworCQkvKiB1bm1hcCB0aGUgcnggYnVmZmVyICovCisJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwUnhDZWxsLT5EbWFCdWYuQWxsb2NQYSwKKwkJCQkgcFJ4Q2VsbC0+RG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcFJ4UGFja2V0ID0gcFJ4Q2VsbC0+cE5kaXNQYWNrZXQ7CisKKwkJcFJ4Q2VsbC0+RG1hQnVmLkFsbG9jU2l6ZSA9IFJYX0JVRkZFUl9BR0dSRVNJWkU7CisJCXBSeENlbGwtPnBOZGlzUGFja2V0ID0gKHZvaWQgKilwTmV3UGFja2V0OworCQlwUnhDZWxsLT5EbWFCdWYuQWxsb2NWYSA9IEFsbG9jVmE7CisJCXBSeENlbGwtPkRtYUJ1Zi5BbGxvY1BhID0gQWxsb2NQYTsKKwkJLyogdXBkYXRlIFNEUDAgdG8gbmV3IGJ1ZmZlciBvZiByeCBwYWNrZXQgKi8KKwkJcFJ4RC0+U0RQMCA9IEFsbG9jUGE7CisJfSBlbHNlIHsKKwkJLypEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk5vIFJ4IEJ1ZmZlclxuIikpOyAqLworCQlwUnhQYWNrZXQgPSBOVUxMOworCQliUmVzY2hlZHVsZSA9IFRSVUU7CisJfQorCisJcFJ4RC0+RERPTkUgPSAwOworCisJLyogaGFkIGhhbmRsZWQgb25lIHJ4IHBhY2tldCAqLworCSpwUnhQZW5kaW5nID0gKnBSeFBlbmRpbmcgLSAxOworCisJLyogdXBkYXRlIHJ4IGRlc2NyaXB0b3IgYW5kIGtpY2sgcnggKi8KKwlJTkNfUklOR19JTkRFWChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCwgUlhfUklOR19TSVpFKTsKKworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0KKwkgICAgKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09CisJICAgICAwKSA/IChSWF9SSU5HX1NJWkUgLSAxKSA6IChwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCAtIDEpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKKworZG9uZToKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+UnhSaW5nTG9jayk7CisJKnBiUmVzY2hlZHVsZSA9IGJSZXNjaGVkdWxlOworCXJldHVybiBwUnhQYWNrZXQ7Cit9CisKK2ludCBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpCit7CisJc3RydWN0IHJ0X3BhY2tldF9pbmZvIFBhY2tldEluZm87CisJdTggKnBTcmNCdWZWQTsKKwl1MzIgU3JjQnVmTGVuOworCXN0cnVjdCBydF90eGQgKiBwVHhEOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcl84MDJfMTE7CisJQk9PTEVBTiBiQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7CisJdW5zaWduZWQgbG9uZyBTcmNCdWZQQTsKKwkvKnU4ICAgICAgICAgICAgICAgICBUeEJ1ZklkeDsgKi8KKwl1OCBNbG1lUmF0ZTsKKwl1bnNpZ25lZCBsb25nIFN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBGaXJzdFR4V0k7CisJLyp1bnNpZ25lZCBsb25nIGk7ICovCisJLypIVFRSQU5TTUlUX1NFVFRJTkcgICAgTWxtZVRyYW5zbWl0OyAgIC8vUmF0ZSBmb3IgdGhpcyBNR01UIGZyYW1lLiAqLworCXVuc2lnbmVkIGxvbmcgRnJlZU51bTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnkgPSBOVUxMOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKSB7CisJCS8qIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwgKi8KKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCS8qIE1ha2Ugc3VyZSBNR01UIHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzICovCisJLypOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCisJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKworCWlmIChGcmVlTnVtID09IDApIHsKKwkJLypOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlTd0lkeCA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHg7CisKKwlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcEFkLT5UeFJpbmdbUXVlSWR4XS5DZWxsW1N3SWR4XS5BbGxvY1ZhOworCisJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIk1sbWVIYXJkVHJhbnNtaXQgRXJyb3JcbiIpKTsKKwkJLypOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwl7CisJCS8qIG91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCAqLworCQkvKiBpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOworCX0KKwlwRmlyc3RUeFdJID0gKHN0cnVjdCBydF90eHdpICopIHBTcmNCdWZWQTsKKworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIChwU3JjQnVmVkEgKyBUWFdJX1NJWkUpOworCWlmIChwSGVhZGVyXzgwMl8xMS0+QWRkcjFbMF0gJiAweDAxKSB7CisJCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKKwl9IGVsc2UgeworCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOworCX0KKworCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKKwkgICAgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUU9TX05VTEwpKSB7CisJCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKKwl9CisJLyogVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuICovCisJaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkJLyogMTFBIGJhbmQgKi8KKwkJTWxtZVJhdGUgPSBSQVRFXzY7CisKKwkvKiAqLworCS8qIFNob3VsZCBub3QgYmUgaGFyZCBjb2RlIHRvIHNldCBQd3JNZ210IHRvIDAgKFBXUl9BQ1RJVkUpICovCisJLyogU25pY2UgaXQncyBiZWVuIHNldCB0byAwIHdoaWxlIG9uIE1ndE1hY0hlYWRlckluaXQgKi8KKwkvKiBCeSB0aGUgd2F5IHRoaXMgd2lsbCBjYXVzZSBmcmFtZSB0byBiZSBzZW5kIG9uIFBXUl9TQVZFIGZhaWxlZC4gKi8KKwkvKiAqLworCS8qICovCisJLyogSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZSAqLworCS8qIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QgKi8KKwlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkgeworCQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUkVRKQorCQkgICAgfHwgIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUKKwkJCSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpIHsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gUFdSX0FDVElWRTsKKwkJfSBlbHNlIHsKKwkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0KKwkJCSAgICBwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlOworCQl9CisJfQorCisJYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOworCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQkvKiBtdXN0IGJlIFBTLVBPTEwgKi8KKwl7CisJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOworCX0gZWxzZQkJCS8qIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpICovCisJeworCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkJLyogTVVMVElDQVNULCBCUk9BRENBU1QgKi8KKwkJeworCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7CisJCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOworCQl9IGVsc2UgeworCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9CisJCQkgICAgUlRNUENhbGNEdXJhdGlvbihwQWQsIE1sbWVSYXRlLCAxNCk7CisJCQlpZiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SU1ApIHsKKwkJCQliSW5zZXJ0VGltZXN0YW1wID0gVFJVRTsKKwkJCX0KKwkJfQorCX0KKwlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlKys7CisJaWYgKHBBZC0+U2VxdWVuY2UgPiAweGZmZikKKwkJcEFkLT5TZXF1ZW5jZSA9IDA7CisJLyogQmVmb3JlIHJhZGFyIGRldGVjdGlvbiBkb25lLCBtZ210IGZyYW1lIGNhbiBub3QgYmUgc2VudCBidXQgcHJvYmUgcmVxICovCisJLyogQmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBwcm9iZSByZXEgdG8gdHJpZ2dlciBkcml2ZXIgdG8gc2VuZCBwcm9iZSByZXEgaW4gcGFzc2l2ZSBzY2FuICovCisJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSAhPSBTVUJUWVBFX1BST0JFX1JFUSkKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfTk9STUFMX01PREUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSFcbiIpKTsKKwkJLypOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCX0KKwkvKiAqLworCS8qIGZpbGwgc2NhdHRlci1hbmQtZ2F0aGVyIGJ1ZmZlciBsaXN0IGludG8gVFhELiBJbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQgKi8KKwkvKiBzaG91bGQgYWx3YXlzIGhhcyBvbmx5IG9uZSBvaHlzaWNhbCBidWZmZXIsIGFuZCB0aGUgd2hvbGUgZnJhbWUgc2l6ZSBlcXVhbHMgKi8KKwkvKiB0byB0aGUgZmlyc3Qgc2NhdHRlciBidWZmZXIgc2l6ZSAqLworCS8qICovCisKKwkvKiBJbml0aWFsaXplIFRYIERlc2NyaXB0b3IgKi8KKwkvKiBGb3IgaW50ZXItZnJhbWUgZ2FwLCB0aGUgbnVtYmVyIGlzIGZvciB0aGlzIGZyYW1lIGFuZCBuZXh0IGZyYW1lICovCisJLyogRm9yIE1MTUUgcmF0ZSwgd2Ugd2lsbCBmaXggYXMgMk1iIHRvIG1hdGNoIG90aGVyIHZlbmRvcidzIGltcGxlbWVudCAqLworLyogICAgICBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7ICovCisKKy8qIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LiAqLworCS8qIE9ubHkgYmVhY29uIHVzZSBOc2VxPVRSVUUuIFNvIGhlcmUgd2UgdXNlIE5zZXE9RkFMU0UuICovCisJaWYgKHBNYWNFbnRyeSA9PSBOVUxMKSB7CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwRmlyc3RUeFdJLCBGQUxTRSwgRkFMU0UsIGJJbnNlcnRUaW1lc3RhbXAsCisJCQkgICAgICBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwgMCwgUkVTRVJWRURfV0NJRCwKKwkJCSAgICAgIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwKKwkJCSAgICAgICh1OClwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKKwl9IGVsc2UgeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAorCQkJICAgICAgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCisJCQkgICAgICAwLCBwTWFjRW50cnktPkFpZCwgKFNyY0J1ZkxlbiAtIFRYV0lfU0laRSksCisJCQkgICAgICBwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCisJCQkgICAgICAodTgpcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTLAorCQkJICAgICAgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOworCX0KKworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKy8qICAgICAgcEZpcnN0VHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gU3JjQnVmTGVuIC0gVFhXSV9TSVpFOyAqLworCVNyY0J1ZlBBID0KKwkgICAgUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX0VEQ0EpOworCXBUeEQtPkxhc3RTZWMwID0gMTsKKwlwVHhELT5MYXN0U2VjMSA9IDE7CisJcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOworCXBUeEQtPlNETGVuMSA9IDA7CisJcFR4RC0+U0RQdHIwID0gU3JjQnVmUEE7CisJcFR4RC0+RE1BRE9ORSA9IDA7CisKKwlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOworCisJLyogSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLiAqLworCUlOQ19SSU5HX0lOREVYKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCAqIDB4MTAsCisJCQlwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KTsKKworCS8qIE1ha2Ugc3VyZSB0byByZWxlYXNlIE1HTVQgcmluZyByZXNvdXJjZSAqLworLyogICAgICBOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOyAqLworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBNbG1lRGF0YUhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCkKK3sKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKKwkgICAgKSB7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCXJldHVybiBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHBBZCwgUXVlSWR4LCBwUGFja2V0KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKKwl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgorCisJQXJndW1lbnRzOgorCQlwVHhECQlQb2ludGVyIHRvIHRyYW5zbWl0IGRlc2NyaXB0b3IKKwkJQWNrCQlTZXR0aW5nIGZvciBBY2sgcmVxdWlyZW1lbnQgYml0CisJCUZyYWdtZW50CVNldHRpbmcgZm9yIEZyYWdtZW50IGJpdAorCQlSZXRyeU1vZGUJU2V0dGluZyBmb3IgcmV0cnkgbW9kZQorCQlJZnMJCVNldHRpbmcgZm9yIElGUyBnYXAKKwkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQorCQlTZXJ2aWNlCQlTZXR0aW5nIGZvciBzZXJ2aWNlCisJCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCisJCVR4UHJlYW1ibGUJU2hvcnQgb3IgTG9uZyBwcmVhbWJsZSB3aGVuIHVzaW5nIENDSyByYXRlcworCQlRdWVJZHggLSAwLTMsIGFjY29yZGluZyB0byA4MDIuMTFlL2Q0LjQgSnVuZS8yMDAzCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBXcml0ZVR4RGVzY3JpcHRvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfdHhkICogcFR4RCwKKwkJCSAgIElOIEJPT0xFQU4gYldJViwgdTggUXVldWVTRUwpCit7CisJLyogKi8KKwkvKiBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4gKi8KKwkvKiBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MgKi8KKwkvKiAqLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CisKKwlwVHhELT5XSVYgPSAoYldJVikgPyAxIDogMDsKKwlwVHhELT5RU0VMID0gKFF1ZXVlU0VMKTsKKwkvKlJUMjg2MGM/PyAgZml4ZWQgdXNpbmcgRURDQSBxdWV1ZSBmb3IgdGVzdC4uLiAgV2UgZG91YnQgUXVldWUxIGhhcyBwcm9ibGVtLiAgMjAwNi0wOS0yNiBKYW4gKi8KKwkvKnBUeEQtPlFTRUw9IEZJRk9fRURDQTsgKi8KKwlwVHhELT5ETUFET05FID0gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1NmMyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9kYXRhX3VzYi5jCkBAIC0wLDAgKzEsOTUxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8qCisgICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFVTQi1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgorCWluIG90aGVyIGZpbGVzLgorCisqLworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworLyoKKwlXZSBjYW4gZG8gY29weSB0aGUgZnJhbWUgaW50byBwVHhDb250ZXh0IHdoZW4gbWF0Y2ggZm9sbG93aW5nIGNvbmRpdGlvbnMuCisJCT0+CisJCT0+CisJCT0+CisqLworc3RhdGljIGlubGluZSBpbnQgUnRtcFVTQkNhbkRvV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgICAgdTggUXVlSWR4LAorCQkJCQkgICAgc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dCkKK3sKKwlpbnQgY2FuV3JpdGUgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisKKwlpZiAoKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIDwKKwkgICAgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikKKwkgICAgJiYgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIExPQ0FMX1RYQlVGX1NJWkUpID4KKwkgICAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMxIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9IGVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkKKwkJICAgJiYgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA8IExPQ0FMX1RYQlVGX1NJWkUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMyIVxuIikpOworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBRdWVJZHgpKTsKKwl9IGVsc2UgaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wVVNCQ2FuRG9Xcml0ZSBjMyFcbiIpKTsKKwl9IGVsc2UgeworCQljYW5Xcml0ZSA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJcmV0dXJuIGNhbldyaXRlOworfQorCit1MTYgUnRtcFVTQl9Xcml0ZVN1YlR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgSU4gQk9PTEVBTiBiSXNMYXN0LCB1MTYgKiBGcmVlTnVtYmVyKQoreworCisJLyogRHVtbXkgZnVuY3Rpb24uIFNob3VsZCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICovCisJcmV0dXJuIDA7CisKK30KKwordTE2IFJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgIHU4IGZyYWdOdW0sIHUxNiAqIEZyZWVOdW1iZXIpCit7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1MTYgaHdIZHJMZW47CS8qIFRoZSBod0hkckxlbiBjb25zaXN0IG9mIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIHBsdXMgdGhlIGhlYWRlciBwYWRkaW5nIGxlbmd0aC4gKi8KKwl1MzIgZmlsbE9mZnNldDsKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXN0cnVjdCBydF90eHdpICpwVHhXSTsKKwl1OCAqcFdpcmVsZXNzUGFja2V0ID0gTlVMTDsKKwl1OCBRdWVJZHg7CisJaW50IFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCXUzMiBVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7CisJQk9PTEVBTiBUeFFMYXN0Um91bmQgPSBGQUxTRTsKKworCS8qICovCisJLyogZ2V0IFR4IFJpbmcgUmVzb3VyY2UgJiBEbWEgQnVmZmVyIGFkZHJlc3MgKi8KKwkvKiAqLworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCWlmIChmcmFnTnVtID09IDApIHsKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgYnVsay1vdXQgYmF0Y2guICovCisJCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOworCisJCQkvKiBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuICovCisJCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0KKwkJCSAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkgeworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKz0gODsKKwkJCQlmaWxsT2Zmc2V0ICs9IDg7CisJCQl9CisJCQlwVHhCbGstPlByaXYgPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPQorCQkJICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwKKwkJCQkJSXJxRmxhZ3MpOworCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlyZXR1cm4gKFN0YXR1cyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLiAqLworCQlTdGF0dXMgPQorCQkgICAgKChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09CisJCSAgICAgIFRSVUUpID8gTkRJU19TVEFUVVNfU1VDQ0VTUyA6IE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWZpbGxPZmZzZXQgKz0gcFR4QmxrLT5Qcml2OworCQl9IGVsc2UgeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLAorCQkJCQlJcnFGbGFncyk7CisKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCXJldHVybiAoU3RhdHVzKTsKKwkJfQorCX0KKworCU5kaXNaZXJvTWVtb3J5KCh1OCAqKSgmcFR4QmxrLT5IZWFkZXJCdWZbMF0pLCBUWElORk9fU0laRSk7CisJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJcFR4V0kgPSAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pOworCisJcFdpcmVsZXNzUGFja2V0ID0KKwkgICAgJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOworCisJLyogY29weSBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlciAqLworCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwkvKiBCdWlsZCBvdXIgVVJCIGZvciBVU0JEICovCisJRE1BSGRyTGVuID0gVFhXSV9TSVpFICsgaHdIZHJMZW47CisJVVNCRE1BcGt0TGVuID0gRE1BSGRyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47CisJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8qIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQgKi8KKwlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKKworCXBUeEJsay0+UHJpdiArPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOworCisJLyogRm9yIFR4SW5mbywgdGhlIGxlbmd0aCBvZiBVU0JETUFwa3RMZW4gPSBUWFdJX1NJWkUgKyA4MDIuMTEgaGVhZGVyICsgcGF5bG9hZCAqLworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sICh1MTYpKFVTQkRNQXBrdExlbiksIEZBTFNFLCBGSUZPX0VEQ0EsCisJCQlGQUxTRSAvKk5leHRWYWxpZCAqLyAsIEZBTFNFKTsKKworCWlmIChmcmFnTnVtID09IHBUeEJsay0+VG90YWxGcmFnTnVtKSB7CisJCXBUeEluZm8tPlVTQkRNQVR4YnVyc3QgPSAwOworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIHBUeEJsay0+UHJpdiArIDM5MDYpID4KKwkJICAgIE1BWF9UWEJVTEtfTElNSVQpIHsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCVR4UUxhc3RSb3VuZCA9IFRSVUU7CisJCX0KKwl9IGVsc2UgeworCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLAorCQkgICAgICAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJcFdpcmVsZXNzUGFja2V0ICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKKwlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKKworCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4pOworCisJLyogICAgICBaZXJvIHRoZSBsYXN0IHBhZGRpbmcuICovCisJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOworCisJaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pIHsKKwkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJCS8qIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLiAzOTA2IHVzZWQgdG8gcHJldmVudCB0aGUgTmV4dEJ1bGtPdXQgaXMgYSBBLVJBTElOSy9BLU1TRFUgRnJhbWUuICovCisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7CisJCWlmIChUeFFMYXN0Um91bmQgPT0gVFJVRSkKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJCS8qIEZpbmFsbHksIHNldCBiQ3VyV3JpdGluZyBhcyBGQUxTRSAqLworCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkJLyogc3VjY2VlZCBhbmQgcmVsZWFzZSB0aGUgc2tiIGJ1ZmZlciAqLworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKwl9CisKKwlyZXR1cm4gKFN0YXR1cyk7CisKK30KKwordTE2IFJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgICAgIElOIEJPT0xFQU4gYklzTGFzdCwKKwkJCQkgICAgIHUxNiAqIEZyZWVOdW1iZXIpCit7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1MTYgaHdIZHJMZW47CisJdTMyIGZpbGxPZmZzZXQ7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqcFR4V0k7CisJdTggKnBXaXJlbGVzc1BhY2tldDsKKwl1OCBRdWVJZHg7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKwlpbnQgU3RhdHVzOworCXUzMiBVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7CisJQk9PTEVBTiBiVHhRTGFzdFJvdW5kID0gRkFMU0U7CisKKwkvKiBGb3IgVVNCLCBkaWRuJ3QgbmVlZCBQQ0lfTUFQX1NJTkdMRSgpICovCisJLypTcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKGNoYXIgKikgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOyAqLworCisJLyogKi8KKwkvKiBnZXQgVHggUmluZyBSZXNvdXJjZSAmIERtYSBCdWZmZXIgYWRkcmVzcyAqLworCS8qICovCisJUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCS8qIENoZWNrIHJpbmcgZnVsbC4gKi8KKwlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKKwlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7CisKKwkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopKCZwVHhCbGstPkhlYWRlckJ1ZlswXSk7CisJCXBUeFdJID0gKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCQkvKiBSZXNlcnZlIHNwYWNlIGZvciA4IGJ5dGVzIHBhZGRpbmcuICovCisJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PQorCQkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpIHsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OworCQkJZmlsbE9mZnNldCArPSA4OworCQl9CisJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJCXBXaXJlbGVzc1BhY2tldCA9CisJCSAgICAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCSAgICBXaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkvKiBjb3B5IFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyICovCisJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOworCisJCS8qIEJ1aWxkIG91ciBVUkIgZm9yIFVTQkQgKi8KKwkJRE1BSGRyTGVuID0gVFhXSV9TSVpFICsgaHdIZHJMZW47CisJCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOworCQlwYWRkaW5nID0gKDQgLSAoVVNCRE1BcGt0TGVuICUgNCkpICYgMHgwMzsJLyogcm91bmQgdXAgdG8gNCBieXRlIGFsaWdubWVudCAqLworCQlVU0JETUFwa3RMZW4gKz0gcGFkZGluZzsKKworCQlwVHhCbGstPlByaXYgPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOworCisJCS8qIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQgKi8KKwkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKHUxNikoVVNCRE1BcGt0TGVuKSwgRkFMU0UsCisJCQkJRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCAqLyAsIEZBTFNFKTsKKworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDM5MDYgKyBwVHhCbGstPlByaXYpID4KKwkJICAgIE1BWF9UWEJVTEtfTElNSVQpIHsKKwkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKKwkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOworCQl9CisJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsCisJCQkgICAgICAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisJCXBXaXJlbGVzc1BhY2tldCArPSAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbik7CisKKwkJLyogV2UgdW5sb2NrIGl0IGhlcmUgdG8gcHJldmVudCB0aGUgZmlyc3QgOCBieXRlcyBtYXliZSBvdmVyLXdyaXRlZCBpc3N1ZS4gKi8KKwkJLyogICAgICAxLiBGaXJzdCB3ZSBnb3QgQ3VyV3JpdGVQb3NpdGlvbiBidXQgdGhlIGZpcnN0IDggYnl0ZXMgc3RpbGwgbm90IHdyaXRlIHRvIHRoZSBwVHhjb250ZXh0LiAqLworCQkvKiAgICAgIDIuIEFuIGludGVycnVwdCBicmVhayBvdXIgcm91dGluZSBhbmQgaGFuZGxlIGJ1bGstb3V0IGNvbXBsZXRlLiAqLworCQkvKiAgICAgIDMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwgKi8KKwkJLyogICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIEVOZXh0QnVsa091dFBvc2l0aW9uIGlzIGp1c3QgdGhlIHNhbWUgYXMgQ3VyV3JpdGVQb3NpdGlvbiwgaXQgd2lsbCBzYXZlIHRoZSBmaXJzdCA4IGJ5dGVzIGZyb20gQ3VyV3JpdGVQb3NpdGlvbiwgKi8KKwkJLyogICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuICovCisJCS8qICAgICAgNC4gSW50ZXJydXB0IGNvbXBsZXRlLiAqLworCQkvKiAgNS4gT3VyIGludGVycnVwdGVkIHJvdXRpbmUgZ28gYmFjayBhbmQgZmlsbCB0aGUgZmlyc3QgOCBieXRlcyB0byBwVHhDb250ZXh0LiAqLworCQkvKiAgICAgIDYuIE5leHQgdGltZSB3aGVuIGRvIGJ1bGstb3V0LCBpdCBmb3VuZCB0aGUgYkNvcHlQYWQ9PVRSVUUgYW5kIHdpbGwgY29weSB0aGUgU2F2ZWRQYWRbXSB0byBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLiAqLworCQkvKiAgICAgICAgICAgICAgYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4gKi8KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0KKwkJICAgIChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLAorCQkJICAgICAgIHBUeEJsay0+U3JjQnVmTGVuKTsKKwkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IHBUeEJsay0+UHJpdjsKKwkJaWYgKGJUeFFMYXN0Um91bmQpCisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSA4OworCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKKworCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7CisJfQorCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKKwkvKiBzdWNjZWVkIGFuZCByZWxlYXNlIHRoZSBza2IgYnVmZmVyICovCisJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gKFN0YXR1cyk7CisKK30KKwordTE2IFJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgIHU4IGZyYW1lTnVtLCB1MTYgKiBGcmVlTnVtYmVyKQoreworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTE2IGh3SGRyTGVuOwkvKiBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguICovCisJdTMyIGZpbGxPZmZzZXQ7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwlzdHJ1Y3QgcnRfdHh3aSAqcFR4V0k7CisJdTggKnBXaXJlbGVzc1BhY2tldCA9IE5VTEw7CisJdTggUXVlSWR4OworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKwkvKnUzMiAgICAgICAgICAgICAgICAgICAgICAgIFVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsgKi8KKworCS8qICovCisJLyogZ2V0IFR4IFJpbmcgUmVzb3VyY2UgJiBEbWEgQnVmZmVyIGFkZHJlc3MgKi8KKwkvKiAqLworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYgKGZyYW1lTnVtID09IDApIHsKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgYnVsay1vdXQgYmF0Y2guICovCisJCVN0YXR1cyA9IFJ0bXBVU0JDYW5Eb1dyaXRlKHBBZCwgUXVlSWR4LCBwSFRUWENvbnRleHQpOworCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOworCisJCQlwVHhJbmZvID0gKHN0cnVjdCBydF90eGluZm8gKikoJnBUeEJsay0+SGVhZGVyQnVmWzBdKTsKKwkJCXBUeFdJID0gKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKKworCQkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLiAqLworCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09CisJCQkgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpIHsKKworCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OworCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKz0gODsKKwkJCX0KKwkJCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9CisJCQkgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCisJCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkJICAgICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJCSAgICBXaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLyogKi8KKwkJCS8qIENvcHkgVFhJTkZPICsgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIgKi8KKwkJCS8qICovCisJCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKKwkJCQkvKmh3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQsIDQpK0xFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7ICovCisJCQkJaHdIZHJMZW4gPQorCQkJCSAgICBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLQorCQkJCSAgICBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJCQkgICAgcFR4QmxrLT5IZHJQYWRMZW4gKworCQkJCSAgICBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOworCQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCisJCQkJLypod0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQsIDQpK0xFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsgKi8KKwkJCQlod0hkckxlbiA9CisJCQkJICAgIHBUeEJsay0+TXBkdUhlYWRlckxlbiAtCisJCQkJICAgIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArCisJCQkJICAgIHBUeEJsay0+SGRyUGFkTGVuICsKKwkJCQkgICAgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOworCQkJZWxzZQorCQkJCS8qaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOyAqLworCQkJCWh3SGRyTGVuID0KKwkJCQkgICAgcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47CisKKwkJCS8qIFVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2LiAqLworCQkJcFR4QmxrLT5Qcml2ID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbjsKKworCQkJLyogICAgICBwVHhJbmZvLT5VU0JETUFwa3RMZW4gbm93IGp1c3QgYSB0ZW1wIHZhbHVlIGFuZCB3aWxsIHRvIGNvcnJlY3QgbGF0dGVyLiAqLworCQkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKHUxNikocFR4QmxrLT5Qcml2KSwKKwkJCQkJRkFMU0UsIEZJRk9fRURDQSwgRkFMU0UgLypOZXh0VmFsaWQgKi8gLAorCQkJCQlGQUxTRSk7CisKKwkJCS8qIENvcHkgaXQuICovCisJCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLAorCQkJCSAgICAgICBwVHhCbGstPlByaXYpOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gcFR4QmxrLT5Qcml2OworCQkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+UHJpdjsKKwkJfQorCX0gZWxzZSB7CQkvKiBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLiAqLworCisJCVN0YXR1cyA9CisJCSAgICAoKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0KKwkJICAgICAgVFJVRSkgPyBORElTX1NUQVRVU19TVUNDRVNTIDogTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJZmlsbE9mZnNldCA9CisJCQkgICAgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIHBUeEJsay0+UHJpdik7CisJCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkJICAgICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJCSAgICBXaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKKworCQkJLypod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsCisJCQkJICAgICAgIHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwV2lyZWxlc3NQYWNrZXQgKz0gKHBUeEJsay0+TXBkdUhlYWRlckxlbik7CisJCQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOworCQl9IGVsc2UgewkvKiBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLiAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiV3JpdGVNdWx0aVR4UmVzb3VyY2UoKTpiQ3VyV3JpdGluZyBpcyBGQUxTRSB3aGVuIGhhbmRsZSBzdWItc2VxdWVudCBmcmFtZXMuXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCQl9CisJfQorCisJLyogV2UgdW5sb2NrIGl0IGhlcmUgdG8gcHJldmVudCB0aGUgZmlyc3QgOCBieXRlcyBtYXliZSBvdmVyLXdyaXRlIGlzc3VlLiAqLworCS8qICAgICAgMS4gRmlyc3Qgd2UgZ290IEN1cldyaXRlUG9zaXRpb24gYnV0IHRoZSBmaXJzdCA4IGJ5dGVzIHN0aWxsIG5vdCB3cml0ZSB0byB0aGUgcFR4Q29udGV4dC4gKi8KKwkvKiAgICAgIDIuIEFuIGludGVycnVwdCBicmVhayBvdXIgcm91dGluZSBhbmQgaGFuZGxlIGJ1bGstb3V0IGNvbXBsZXRlLiAqLworCS8qICAgICAgMy4gSW4gdGhlIGJ1bGstb3V0IGNvbXBsbGV0ZSwgaXQgbmVlZCB0byBkbyBhbm90aGVyIGJ1bGstb3V0LCAqLworCS8qICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sICovCisJLyogICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBwYXlsb2FkIHN0aWxsIG5vdCBjb3B5ZWQuIHRoZSBwVHhDb250ZXh0LT5TYXZlZFBhZFtdIHdpbGwgc2F2ZSBhcyBhbGx6ZXJvLiBhbmQgc2V0IHRoZSBiQ29weVBhZCA9IFRSVUUuICovCisJLyogICAgICA0LiBJbnRlcnJ1cHQgY29tcGxldGUuICovCisJLyogIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4gKi8KKwkvKiAgICAgIDYuIE5leHQgdGltZSB3aGVuIGRvIGJ1bGstb3V0LCBpdCBmb3VuZCB0aGUgYkNvcHlQYWQ9PVRSVUUgYW5kIHdpbGwgY29weSB0aGUgU2F2ZWRQYWRbXSB0byBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLiAqLworCS8qICAgICAgICAgICAgICBhbmQgdGhlIHBhY2tldCB3aWxsIHdyb25nLiAqLworCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiV3JpdGVNdWx0aVR4UmVzb3VyY2U6IENXUG9zID0gJWxkLCBOQk91dFBvcyA9ICVsZC5cbiIsCisJCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCWdvdG8gZG9uZTsKKwl9CisJLyogQ29weSB0aGUgZnJhbWUgY29udGVudCBpbnRvIERNQSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2ICovCisJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7CisJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPlNyY0J1ZkxlbjsKKworZG9uZToKKwkvKiBSZWxlYXNlIHRoZSBza2IgYnVmZmVyIGhlcmUgKi8KKwlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybiAoU3RhdHVzKTsKKworfQorCit2b2lkIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgdTE2IHRvdGFsTVBEVVNpemUsIHUxNiBUeElkeCkKK3sKKwl1OCBRdWVJZHg7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1MzIgZmlsbE9mZnNldDsKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXN0cnVjdCBydF90eHdpICpwVHhXSTsKKwl1MzIgVVNCRE1BcGt0TGVuLCBwYWRkaW5nOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJdTggKnBXaXJlbGVzc1BhY2tldDsKKworCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OworCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOworCisJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOworCisJaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkgeworCQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOworCQlpZiAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09CisJCSAgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKKwkJICAgICB8fCAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gLSA4KSA9PQorCQkJIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCisJCSAgICAmJiAocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpCisJCQlwV2lyZWxlc3NQYWNrZXQgPSAodTggKikoJnBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0pOworCQllbHNlCisJCQlwV2lyZWxlc3NQYWNrZXQgPQorCQkJICAgICh1OCAqKSgmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCQkJICAgICAgV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF0pOworCisJCS8qICovCisJCS8qIFVwZGF0ZSBUeEluZm8tPlVTQkRNQXBrdExlbiAsICovCisJCS8qICAgICAgICAgICAgICB0aGUgbGVuZ3RoID0gVFhXSV9TSVpFICsgODAyLjExX2hkciArIDgwMi4xMV9oZHJfcGFkICsgcGF5bG9hZF9vZl9hbGxfYmF0Y2hfZnJhbWVzICsgQnVsay1PdXQtcGFkZGluZyAqLworCQkvKiAqLworCQlwVHhJbmZvID0gKHN0cnVjdCBydF90eGluZm8gKikocFdpcmVsZXNzUGFja2V0KTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIGJ1bGstb3V0IHBhZGRpbmcgKi8KKwkJVVNCRE1BcGt0TGVuID0gcFR4QmxrLT5Qcml2IC0gVFhJTkZPX1NJWkU7CisJCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvKiByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50ICovCisJCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOworCisJCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOworCisJCS8qICovCisJCS8qIFVwZGF0ZSBUWFdJLT5NUERVdG90YWxCeXRlQ291bnQgLCAqLworCQkvKiAgICAgICAgICAgICAgdGhlIGxlbmd0aCA9IDgwMi4xMSBoZWFkZXIgKyBwYXlsb2FkX29mX2FsbF9iYXRjaF9mcmFtZXMgKi8KKwkJcFR4V0kgPSAoc3RydWN0IHJ0X3R4d2kgKikgKHBXaXJlbGVzc1BhY2tldCArIFRYSU5GT19TSVpFKTsKKwkJcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IHRvdGFsTVBEVVNpemU7CisKKwkJLyogKi8KKwkJLyogVXBkYXRlIHRoZSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKi8KKwkJLyogKi8KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7CisJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMzkwNikgPiBNQVhfVFhCVUxLX0xJTUlUKSB7CS8qIEFkZCAzOTA2IGZvciBwcmV2ZW50IHRoZSBOZXh0QnVsa091dCBwYWNrZXQgc2l6ZSBpcyBhIEEtUkFMSU5LL0EtTVNEVSBGcmFtZS4gKi8KKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7CisJCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7CisJCX0KKwkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247CisKKwkJLyogKi8KKwkJLyogICAgICBaZXJvIHRoZSBsYXN0IHBhZGRpbmcuICovCisJCS8qICovCisJCXBXaXJlbGVzc1BhY2tldCA9CisJCSAgICAoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgIFdpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXQgKyBwVHhCbGstPlByaXZdKTsKKwkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7CisKKwkJLyogRmluYWxseSwgc2V0IGJDdXJXcml0aW5nIGFzIEZBTFNFICovCisJCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBGQUxTRTsKKworCX0gZWxzZSB7CQkvKiBJdCBzaG91bGQgbm90IGhhcHBlbmVkIG5vdyB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHNodXRkb3duLiAqLworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkZpbmFsV3JpdGVUeFJlc291cmNlKCk6YkN1cldyaXRpbmcgaXMgRkFMU0Ugd2hlbiBoYW5kbGUgbGFzdCBmcmFtZXMuXG4iKSk7CisJfQorCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7CisKK30KKwordm9pZCBSdG1wVVNCRGF0YUxhc3RUeElkeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IFF1ZUlkeCwgdTE2IFR4SWR4KQoreworCS8qIERPIG5vdGhpbmcgZm9yIFVTQi4gKi8KK30KKworLyoKKwlXaGVuIGNhbiBkbyBidWxrLW91dDoKKwkJMS4gVHhTd0ZyZWVJZHggPCBUWF9SSU5HX1NJWkU7CisJCQlJdCBtZWFucyBoYXMgYXQgbGVhc3Qgb25lIFJpbmcgZW50aXR5IGlzIHJlYWR5IGZvciBidWxrLW91dCwga2ljayBpdCBvdXQuCisJCTIuIElmIFR4U3dGcmVlSWR4ID09IFRYX1JJTkdfU0laRQorCQkJQ2hlY2sgaWYgdGhlIEN1cldyaXRpbmcgZmxhZyBpcyBGQUxTRSwgaWYgaXQncyBGQUxTRSwgd2UgY2FuIGRvIGtpY2sgb3V0LgorCisqLwordm9pZCBSdG1wVVNCRGF0YUtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLCB1OCBRdWVJZHgpCit7CisJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgUXVlSWR4KSk7CisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKKy8qCisJTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKKwlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBSVDI4NzAgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgorICovCitpbnQgUnRtcFVTQk1nbXRLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IFF1ZUlkeCwKKwkJICAgICAgIHZvaWQgKnBQYWNrZXQsCisJCSAgICAgICB1OCAqcFNyY0J1ZlZBLCB1MzIgU3JjQnVmTGVuKQoreworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJdW5zaWduZWQgbG9uZyBCdWxrT3V0U2l6ZTsKKwl1OCBwYWRMZW47CisJdTggKnBEZXN0OworCXVuc2lnbmVkIGxvbmcgU3dJZHggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQgPQorCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbU3dJZHhdLkFsbG9jVmE7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKworCXBUeEluZm8gPSAoc3RydWN0IHJ0X3R4aW5mbyAqKShwU3JjQnVmVkEpOworCisJLyogQnVpbGQgb3VyIFVSQiBmb3IgVVNCRCAqLworCUJ1bGtPdXRTaXplID0gU3JjQnVmTGVuOworCUJ1bGtPdXRTaXplID0gKEJ1bGtPdXRTaXplICsgMykgJiAofjMpOworCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sICh1MTYpKEJ1bGtPdXRTaXplIC0gVFhJTkZPX1NJWkUpLAorCQkJVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsIEZBTFNFKTsKKworCUJ1bGtPdXRTaXplICs9IDQ7CS8qIEFsd2F5cyBhZGQgNCBleHRyYSBieXRlcyBhdCBldmVyeSBwYWNrZXQuICovCisKKwkvKiBJZiBCdWxrT3V0U2l6ZSBpcyBtdWx0aXBsZSBvZiBCdWxrT3V0TWF4UGFja2V0U2l6ZSwgYWRkIGV4dHJhIDQgYnl0ZXMgYWdhaW4uICovCisJaWYgKChCdWxrT3V0U2l6ZSAlIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpID09IDApCisJCUJ1bGtPdXRTaXplICs9IDQ7CisKKwlwYWRMZW4gPSBCdWxrT3V0U2l6ZSAtIFNyY0J1ZkxlbjsKKwlBU1NFUlQoKHBhZExlbiA8PSBSVE1QX1BLVF9UQUlMX1BBRERJTkcpKTsKKworCS8qIE5vdyBtZW16ZXJvIGFsbCBleHRyYSBwYWRkaW5nIGJ5dGVzLiAqLworCXBEZXN0ID0gKHU4ICopKHBTcmNCdWZWQSArIFNyY0J1Zkxlbik7CisJc2tiX3B1dChHRVRfT1NfUEtUX1RZUEUocFBhY2tldCksIHBhZExlbik7CisJTmRpc1plcm9NZW1vcnkocERlc3QsIHBhZExlbik7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJcEFkLT5NZ210UmluZy5DZWxsW3BBZC0+TWdtdFJpbmcuVHhDcHVJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKKwlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0KKwkgICAgKHN0cnVjdCBydF90eF9idWZmZXIgKikoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpKTsKKworCS8qIExlbmd0aCBpbiBUeEluZm8gc2hvdWxkIGJlIDggbGVzcyB0aGFuIGJ1bGtvdXQgc2l6ZS4gKi8KKwlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gQnVsa091dFNpemU7CisJcE1MTUVDb250ZXh0LT5JblVzZSA9IFRSVUU7CisJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBUUlVFOworCisJLypmb3IgZGVidWcgKi8KKwkvKmhleF9kdW1wKCJSdG1wVVNCTWdtdEtpY2tPdXQiLCAmcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF0sIChwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID4gMTYgPyAxNiA6IHBNTE1FQ29udGV4dC0+QnVsa091dFNpemUpKTsgKi8KKworCS8qcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOyAqLworCS8qcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOyAqLworCisJLyppZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9PSBNR01UX1JJTkdfU0laRSkgKi8KKwkvKiAgICAgIG5lZWRLaWNrT3V0ID0gVFJVRTsgKi8KKworCS8qIERlY3JlYXNlIHRoZSBUeFN3RnJlZUlkeCBhbmQgSW5jcmVhc2UgdGhlIFRYX0NUWF9JRFggKi8KKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4LS07CisJSU5DX1JJTkdfSU5ERVgocEFkLT5NZ210UmluZy5UeENwdUlkeCwgTUdNVF9SSU5HX1NJWkUpOworCisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkvKmlmIChuZWVkS2lja091dCkgKi8KKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBSdG1wVVNCTnVsbEZyYW1lS2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IFF1ZUlkeCwKKwkJCSAgICAgdTggKiBwTnVsbEZyYW1lLCB1MzIgZnJhbWVMZW4pCit7CisJaWYgKHBBZC0+TnVsbENvbnRleHQuSW5Vc2UgPT0gRkFMU0UpIHsKKwkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBOdWxsQ29udGV4dDsKKwkJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbzsKKwkJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKKwkJdTggKnBXaXJlbGVzc1BrdDsKKworCQlwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCisJCS8qIFNldCB0aGUgaW4gdXNlIGJpdCAqLworCQlwTnVsbENvbnRleHQtPkluVXNlID0gVFJVRTsKKwkJcFdpcmVsZXNzUGt0ID0KKwkJICAgICh1OCAqKSYgcE51bGxDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCSAgICBXaXJlbGVzc1BhY2tldFswXTsKKworCQlSVE1QWmVyb01lbW9yeSgmcFdpcmVsZXNzUGt0WzBdLCAxMDApOworCQlwVHhJbmZvID0gKHN0cnVjdCBydF90eGluZm8gKikmIHBXaXJlbGVzc1BrdFswXTsKKwkJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywKKwkJCQkodTE2KShzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpICsgVFhXSV9TSVpFKSwKKwkJCQlUUlVFLCBFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgRkFMU0UpOworCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQlwVHhXSSA9IChzdHJ1Y3QgcnRfdHh3aSAqKSAmIHBXaXJlbGVzc1BrdFtUWElORk9fU0laRV07CisJCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsCisJCQkgICAgICBGQUxTRSwgMCwgQlNTSURfV0NJRCwgKHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpLCAwLAorCQkJICAgICAgMCwgKHU4KXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsCisJCQkgICAgICBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisKKwkJUlRNUE1vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUWFdJX1NJWkUgKyBUWElORk9fU0laRV0sCisJCQkgICAgICAgJnBBZC0+TnVsbEZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwkJcEFkLT5OdWxsQ29udGV4dC5CdWxrT3V0U2l6ZSA9CisJCSAgICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihwQWQtPk51bGxGcmFtZSkgKyA0OworCisJCS8qIEZpbGwgb3V0IGZyYW1lIGxlbmd0aCBpbmZvcm1hdGlvbiBmb3IgZ2xvYmFsIEJ1bGsgb3V0IGFyYml0b3IgKi8KKwkJLypwTnVsbENvbnRleHQtPkJ1bGtPdXRTaXplID0gVHJhbnNmZXJCdWZmZXJMZW5ndGg7ICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiU1lOQyAtIHNlbmQgTlVMTCBGcmFtZSBAJWQgTWJwcy4uLlxuIiwKKwkJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0pKTsKKwkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpOworCisJCS8qIEtpY2sgYnVsayBvdXQgKi8KKwkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCX0KKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEdldCBhIHJlY2VpdmVkIHBhY2tldC4KKworQXJndW1lbnRzOgorCXBBZAkJCQkJZGV2aWNlIGNvbnRyb2wgYmxvY2sKKwlwU2F2ZVJ4RAkJCXJlY2VpdmUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbgorCSpwYlJlc2NoZWR1bGUJCW5lZWQgcmVzY2hlZHVsZSBmbGFnCisJKnBSeFBlbmRpbmcJCQlwZW5kaW5nIHJlY2VpdmVkIHBhY2tldCBmbGFnCisKK1JldHVybiBWYWx1ZToKKyAgICB0aGUgcmVjaWV2ZWQgcGFja2V0CisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkICpHZXRQYWNrZXRGcm9tUnhSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgT1VUIFBSVDI4WFhfUlhEX1NUUlVDIHBTYXZlUnhELAorCQkJCSBPVVQgQk9PTEVBTiAqIHBiUmVzY2hlZHVsZSwKKwkJCQkgSU4gdTMyICogcFJ4UGVuZGluZykKK3sKKwlzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dDsKKwl2b2lkICpwU2tiOworCXU4ICpwRGF0YTsKKwl1bnNpZ25lZCBsb25nIFRoaXNGcmFtZUxlbjsKKwl1bnNpZ25lZCBsb25nIFJ4QnVmZmVyTGVuZ3RoOworCXN0cnVjdCBydF9yeHdpICogcFJ4V0k7CisKKwlwUnhDb250ZXh0ID0gJnBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4XTsKKwlpZiAoKHBSeENvbnRleHQtPlJlYWRhYmxlID09IEZBTFNFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCisJCXJldHVybiBOVUxMOworCisJUnhCdWZmZXJMZW5ndGggPSBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgLSBwQWQtPlJlYWRQb3NpdGlvbjsKKwlpZiAoUnhCdWZmZXJMZW5ndGggPAorCSAgICAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2Yoc3RydWN0IHJ0X3J4d2kpICsKKwkgICAgIHNpemVvZihzdHJ1Y3QgcnRfcnhpbmZvKSkpIHsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKworCXBEYXRhID0gJnBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyW3BBZC0+UmVhZFBvc2l0aW9uXTsJLyogNEtCICovCisJLyogVGhlIFJYRE1BIGZpZWxkIGlzIDQgYnl0ZXMsIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgMiBieXRlcy4gVGhlIExlbmd0aCBpbmNsdWRpbmcgdGhlIChSWFdJICsgTVNEVSArIFBhZGRpbmcpICovCisJVGhpc0ZyYW1lTGVuID0gKnBEYXRhICsgKCoocERhdGEgKyAxKSA8PCA4KTsKKwlpZiAoVGhpc0ZyYW1lTGVuID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCSVJJZHgoJWQpOiBSWERNQUxlbiBpcyB6ZXJvLlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAorCQkJICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLAorCQkJICBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKwlpZiAoKFRoaXNGcmFtZUxlbiAmIDB4MykgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkJJUklkeCglZCk6IFJYRE1BTGVuIG5vdCBtdWx0aXBsZSBvZiA0LlslbGRdLCBCdWxrSW5CdWZMZW4gPSAlbGQpXG4iLAorCQkJICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLAorCQkJICBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKworCWlmICgoVGhpc0ZyYW1lTGVuICsgOCkgPiBSeEJ1ZmZlckxlbmd0aCkJLyogOCBmb3IgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKHN0cnVjdCBydF9yeGluZm8pKSAqLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCSVJJZHgoJWQpOkZyYW1lTGVuKDB4JWx4KSBvdXRyYW5nZXMuIEJ1bGtJbkxlbj0weCVseCwgcmVtYWluaW5nIFJ4QnVmTGVuPTB4JWx4LCBSZWFkUG9zPTB4JWx4XG4iLAorCQkJICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgVGhpc0ZyYW1lTGVuLAorCQkJICBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQsIFJ4QnVmZmVyTGVuZ3RoLAorCQkJICBwQWQtPlJlYWRQb3NpdGlvbikpOworCisJCS8qIGVycm9yIGZyYW1lLiBmaW5pc2ggdGhpcyBsb29wICovCisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJLyogc2tpcCBVU0IgZnJhbWUgbGVuZ3RoIGZpZWxkICovCisJcERhdGEgKz0gUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkU7CisJcFJ4V0kgPSAoc3RydWN0IHJ0X3J4d2kgKikgcERhdGE7CisJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBUaGlzRnJhbWVMZW4pIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcygpOnBSeFdJTVBEVXRvdGFsQnl0ZUNvdW50KCVkKSBsYXJnZSB0aGFuIFJ4RE1BTGVuKCVsZClcbiIsCisJCQkgIF9fRlVOQ1RJT05fXywgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKKwkJCSAgVGhpc0ZyYW1lTGVuKSk7CisJCWdvdG8gbGFiZWxfbnVsbDsKKwl9CisJLyogYWxsb2NhdGUgYSByeCBwYWNrZXQgKi8KKwlwU2tiID0gZGV2X2FsbG9jX3NrYihUaGlzRnJhbWVMZW4pOworCWlmIChwU2tiID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcygpOkNhbm5vdCBBbGxvY2F0ZSBzayBidWZmZXIgZm9yIHRoaXMgQnVsay1JbiBidWZmZXIhXG4iLAorCQkJICBfX0ZVTkNUSU9OX18pKTsKKwkJZ290byBsYWJlbF9udWxsOworCX0KKwkvKiBjb3B5IHRoZSByeCBwYWNrZXQgKi8KKwltZW1jcHkoc2tiX3B1dChwU2tiLCBUaGlzRnJhbWVMZW4pLCBwRGF0YSwgVGhpc0ZyYW1lTGVuKTsKKwlSVFBLVF9UT19PU1BLVChwU2tiKS0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7CisJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwU2tiKSwgUEtUU1JDX05ESVMpOworCisJLyogY29weSBSeEQgKi8KKwkqcFNhdmVSeEQgPSAqKHN0cnVjdCBydF9yeGluZm8gKikgKHBEYXRhICsgVGhpc0ZyYW1lTGVuKTsKKworCS8qIHVwZGF0ZSBuZXh0IHBhY2tldCByZWFkIHBvc2l0aW9uLiAqLworCXBBZC0+UmVhZFBvc2l0aW9uICs9IChUaGlzRnJhbWVMZW4gKyBSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIFJYSU5GT19TSVpFKTsJLyogOCBmb3IgKFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFICsgc2l6ZW9mKHN0cnVjdCBydF9yeGluZm8pKSAqLworCisJcmV0dXJuIHBTa2I7CisKK2xhYmVsX251bGw6CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNoZWNrIFJ4IGRlc2NyaXB0b3IsIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGlmIGFueSBlcnJvciBkb3VuZAorCisJQXJndW1lbnRzOgorCQlwUnhECQlQb2ludGVyCXRvIHRoZSBSeCBkZXNjcmlwdG9yCisKKwlSZXR1cm4gVmFsdWU6CisJCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCU5vIGVycgorCQlORElTX1NUQVRVU19GQUlMVVJFCQlFcnJvcgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVE1QQ2hlY2tSeEVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJLCBJTiBQUlQyOFhYX1JYRF9TVFJVQyBwUnhJTkZPKQoreworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5OworCWludCBkQm07CisKKwlpZiAocEFkLT5iUHJvbWlzY3VvdXMgPT0gVFJVRSkKKwkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKKwlpZiAocFJ4SU5GTyA9PSBOVUxMKQorCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCisJLyogUGh5IGVycm9ycyAmIENSQyBlcnJvcnMgKi8KKwlpZiAocFJ4SU5GTy0+Q3JjKSB7CisJCS8qIENoZWNrIFJTU0kgZm9yIE5vaXNlIEhpc3Qgc3RhdGlzdGljIGNvbGxlY3Rpb24uICovCisJCWRCbSA9IChpbnQpKHBSeFdJLT5SU1NJMCkgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOworCQlpZiAoZEJtIDw9IC04NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC04MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC03MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbM10gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNF0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC02MikKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNV0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtIDw9IC01NykKKwkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNl0gKz0gMTsKKwkJZWxzZSBpZiAoZEJtID4gLTU3KQorCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs3XSArPSAxOworCisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorCS8qIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cyAqLworCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICsgMTQpOworCisJLyogRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MgKi8KKwlpZiAocEhlYWRlci0+RkMuVG9EcykgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiRXJyO0ZDLlRvRHNcbiIpKTsKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJfQorCS8qIFBhdWwgMDQtMDMgZm9yIE9GRE0gUnggbGVuZ3RoIGlzc3VlICovCisJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNQVhfQUdHUkVHQVRJT05fU0laRSkgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgicmVjZWl2ZWQgcGFja2V0IHRvbyBsb25nXG4iKSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKwkvKiBEcm9wIG5vdCBVMk0gZnJhbWVzLCBjYW50J3MgZHJvcCBoZXJlIGJlY2F1c2Ugd2Ugd2lsbCBkcm9wIGJlYWNvbiBpbiB0aGlzIGNhc2UgKi8KKwkvKiBJIGFtIGtpbmQgb2YgZG91YnRpbmcgdGhlIFUyTSBiaXQgb3BlcmF0aW9uICovCisJLyogaWYgKHBSeEQtPlUyTSA9PSAwKSAqLworCS8qICAgICAgcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOyAqLworCisJLyogZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZSAqLworCWlmIChwUnhJTkZPLT5EZWNyeXB0ZWQgJiYgcFJ4SU5GTy0+Q2lwaGVyRXJyKSB7CisKKwkJaWYgKCgocFJ4SU5GTy0+Q2lwaGVyRXJyICYgMSkgPT0gMSkKKwkJICAgICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CisKKwkJaWYgKCgocFJ4SU5GTy0+Q2lwaGVyRXJyICYgMikgPT0gMikKKwkJICAgICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19NSUNfRVJST1JfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CisJCS8qICovCisJCS8qIE1JQyBFcnJvciAqLworCQkvKiAqLworCQlpZiAoKHBSeElORk8tPkNpcGhlckVyciA9PSAyKSAmJiBwUnhJTkZPLT5NeUJzcykgeworCQkJcFdwYUtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwUnhXSS0+S2V5SW5kZXhdOworCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7CisJCX0KKworCQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmCisJCSAgICAocEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XS5DaXBoZXJBbGcgPT0KKwkJICAgICBDSVBIRVJfQUVTKQorCQkgICAgJiYgKHBIZWFkZXItPlNlcXVlbmNlID09IHBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlKSkgeworCQkJLyogKi8KKwkJCS8qIEFjY2VwdGFibGUgc2luY2UgdGhlIEZpcnN0IEZyYWdGcmFtZSBubyBDaXBoZXJFcnIgcHJvYmxlbS4gKi8KKwkJCS8qICovCisJCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQl9CisKKwkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKKwl9CisKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworfQorCit2b2lkIFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLAorCQkJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKworCWlmIChwQWQgJiYgcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lclJ1bm5pbmcpIHsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCAweGZmLCAweDAwLCAweDAyKTsKKworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwl9Cit9CisKK3ZvaWQgUlQyOHh4VXNiU3RhQXNpY0ZvcmNlV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiRnJvbVR4KQoreworCUJPT0xFQU4gQ2FuY2VsZWQ7CisKKwlpZiAocEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lclJ1bm5pbmcpCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lciwgJkNhbmNlbGVkKTsKKworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKK30KKwordm9pZCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1MTYgVGJ0dE51bVRvTmV4dFdha2VVcCkKK3sKKworCS8qIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4gKi8KKwlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQorCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKKworCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lciwgQVVUT19XQUtFVVBfVElNRU9VVCk7CisJcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsJLyogc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBUaW1lb3V0IDQwdXMuICovCisKKwlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisKK30KKworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9pbmZvLmMKaW5kZXggMDE5Y2M0NC4uMjUzMDJlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX2luZm8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1faW5mby5jCkBAIC0yMyw4MjYgKzIzLDExIEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLworICovCiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi1JTlQJU2hvd19TU0lEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1R4QnVyc3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1R4UHJlYW1ibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0NoYW5uZWxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEJ3X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRPcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0NvdW50cnlDb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotI2VuZGlmIC8vIEFHR1JFR0FUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIFdNTV9TVVBQT1JUCi1JTlQJU2hvd19XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfRW5jcnlwVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKTsKLQotSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXkxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXkyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXkzX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXk0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpOwotCi1JTlQJU2hvd19XUEFQU0tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1Zik7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCUNIQVIgKm5hbWU7Ci0JSU5UICgqc2hvd19wcm9jKShQUlRNUF9BREFQVEVSIHBBZGFwdGVyLCBQVUNIQVIgYXJnKTsKLX0gKlBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MsIFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQ1tdID0gewotCXsiU1NJRCIsCQkJCQlTaG93X1NTSURfUHJvY30sCi0JeyJXaXJlbGVzc01vZGUiLAkJCVNob3dfV2lyZWxlc3NNb2RlX1Byb2N9LAotCXsiVHhCdXJzdCIsCQkJCQlTaG93X1R4QnVyc3RfUHJvY30sCi0JeyJUeFByZWFtYmxlIiwJCQkJU2hvd19UeFByZWFtYmxlX1Byb2N9LAotCXsiVHhQb3dlciIsCQkJCQlTaG93X1R4UG93ZXJfUHJvY30sCi0JeyJDaGFubmVsIiwJCQkJCVNob3dfQ2hhbm5lbF9Qcm9jfSwKLQl7IkJHUHJvdGVjdGlvbiIsCQkJU2hvd19CR1Byb3RlY3Rpb25fUHJvY30sCi0JeyJSVFNUaHJlc2hvbGQiLAkJCVNob3dfUlRTVGhyZXNob2xkX1Byb2N9LAotCXsiRnJhZ1RocmVzaG9sZCIsCQkJU2hvd19GcmFnVGhyZXNob2xkX1Byb2N9LAotCXsiSHRCdyIsCQkJCQlTaG93X0h0QndfUHJvY30sCi0JeyJIdE1jcyIsCQkJCQlTaG93X0h0TWNzX1Byb2N9LAotCXsiSHRHaSIsCQkJCQlTaG93X0h0R2lfUHJvY30sCi0JeyJIdE9wTW9kZSIsCQkJCVNob3dfSHRPcE1vZGVfUHJvY30sCi0JeyJIdEV4dGNoYSIsCQkJCVNob3dfSHRFeHRjaGFfUHJvY30sCi0JeyJIdE1wZHVEZW5zaXR5IiwJCQlTaG93X0h0TXBkdURlbnNpdHlfUHJvY30sCi0JeyJIdEJhV2luU2l6ZSIsCQkgICAgICAgIFNob3dfSHRCYVdpblNpemVfUHJvY30sCi0JeyJIdFJkZyIsCQkgICAgICAgIAlTaG93X0h0UmRnX1Byb2N9LAotCXsiSHRBbXNkdSIsCQkgICAgICAgIAlTaG93X0h0QW1zZHVfUHJvY30sCi0JeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCi0JeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKLSNlbmRpZgotCi0jaWZkZWYgV01NX1NVUFBPUlQKLQl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCi0jZW5kaWYKLQl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCi0gICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCi0JeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCi0JeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAotCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKLQl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAotCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCi0JeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKLQl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAotCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAotCXtOVUxMLCBOVUxMfQotfTsKLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCi0KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENvdW50cnkgUmVnaW9uLgotICAgICAgICBUaGlzIGNvbW1hbmQgd2lsbCBub3Qgd29yaywgaWYgdGhlIGZpZWxkIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQuCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0NvdW50cnlSZWdpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgcmVnaW9uOwotCi0JcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDgwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVyIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQgXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZigocmVnaW9uID49IDApICYmIChyZWdpb24gPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247Ci0JfQotCWVsc2UgaWYgKHJlZ2lvbiA9PSBSRUdJT05fMzFfQkdfQkFORCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHJlZ2lvbjsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6cGFyYW1ldGVycyBvdXQgb2YgcmFuZ2VcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0Ci0JQnVpbGRDaGFubmVsTGlzdChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24gZm9yIEEgYmFuZC4KLSAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgbm90IHdvcmssIGlmIHRoZSBmaWVsZCBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkLgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgcmVnaW9uOwotCi0JcmVnaW9uID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCS8vIENvdW50cnkgY2FuIGJlIHNldCBvbmx5IHdoZW4gRUVQUk9NIG5vdCBwcm9ncmFtbWVkCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4ODApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OnBhcmFtZXRlciBvZiBDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSBpcyBwcm9ncmFtbWVkIFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpIHJlZ2lvbjsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jOjpwYXJhbWV0ZXJzIG91dCBvZiByYW5nZVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKLQlCdWlsZENoYW5uZWxMaXN0KHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9XaXJlbGVzc01vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcJV2lyZWxlc3NNb2RlOwotCUlOVAkJc3VjY2VzcyA9IFRSVUU7Ci0KLQlXaXJlbGVzc01vZGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JewotCQlJTlQgTWF4UGh5TW9kZSA9IFBIWV8xMUc7Ci0KLQkJTWF4UGh5TW9kZSA9IFBIWV8xMU5fNUc7Ci0KLQkJaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKQotCQl7Ci0JCQlSVE1QU2V0UGh5TW9kZShwQWQsIFdpcmVsZXNzTW9kZSk7Ci0KLQkJCWlmIChXaXJlbGVzc01vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwotCQkJfQotCi0JCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCi0JCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQl7Ci0JCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdWNjZXNzID0gRkFMU0U7Ci0JCX0KLQl9Ci0KLQkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKLQlpZiAoc3VjY2VzcyA9PSBUUlVFKQotCXsKLQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVsZClcbiIsIFdpcmVsZXNzTW9kZSkpOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7Ci0JfQotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENoYW5uZWwKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLSAJSU5UCQlzdWNjZXNzID0gVFJVRTsKLQlVQ0hBUglDaGFubmVsOwotCi0JQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAotCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKLQl7Ci0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOwotCi0JCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQkJewotCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7Ci0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JCQkJewotCQkJCQlOX1NldENlbkNoKHBBZCk7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCwgY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLQkJCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV18yMCwgQ2hhbm5lbCglZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VjY2VzcyA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXN1Y2Nlc3MgPSBGQUxTRTsKLQl9Ci0KLQotCWlmIChzdWNjZXNzID09IFRSVUUpCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9DaGFubmVsX1Byb2M6OihDaGFubmVsPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFNob3J0IFNsb3QgVGltZSBFbmFibGUgb3IgRGlzYWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9TaG9ydFNsb3RfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgU2hvcnRTbG90OwotCi0JU2hvcnRTbG90ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChTaG9ydFNsb3QgPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOwotCWVsc2UgaWYgKFNob3J0U2xvdCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2hvcnRTbG90X1Byb2M6OihTaG9ydFNsb3Q9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFR4IHBvd2VyCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVHhQb3dlcjsKLQlJTlQgICBzdWNjZXNzID0gRkFMU0U7Ci0KLQlUeFBvd2VyID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChUeFBvd2VyIDw9IDEwMCkKLQl7Ci0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gVHhQb3dlcjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7Ci0JCX0KLQkJc3VjY2VzcyA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJc3VjY2VzcyA9IEZBTFNFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4UG93ZXJfUHJvYzo6KFR4UG93ZXJQZXJjZW50YWdlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgMTFCLzExRyBQcm90ZWN0aW9uCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkpCi0JewotCQljYXNlIDA6IC8vQVVUTwotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6ICAvL0ludmFsaWQgYXJndW1lbnQKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CR1Byb3RlY3Rpb25fUHJvYzo6KEJHUHJvdGVjdGlvbj0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBUeFByZWFtYmxlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4UHJlYW1ibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JUlRfODAyXzExX1BSRUFNQkxFCVByZWFtYmxlOwotCi0JUHJlYW1ibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0KLQlzd2l0Y2ggKFByZWFtYmxlKQotCXsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlU2hvcnQ6Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUHJlYW1ibGU7Ci0KLQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KTsKLQkJCWJyZWFrOwotCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgotCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVBdXRvOgotCQkJLy8gaWYgdXNlciB3YW50cyBBVVRPLCBpbml0aWFsaXplIHRvIExPTkcgaGVyZSwgdGhlbiBjaGFuZ2UgYWNjb3JkaW5nIHRvIEFQJ3MKLQkJCS8vIGNhcGFiaWxpdHkgdXBvbiBhc3NvY2lhdGlvbi4KLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKLQotCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4UHJlYW1ibGVfUHJvYzo6KFR4UHJlYW1ibGU9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFJUUyBUaHJlc2hvbGQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCSBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7Ci0KLQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYoKFJ0c1RocmVzaCA+IDApICYmIChSdHNUaHJlc2ggPD0gTUFYX1JUU19USFJFU0hPTEQpKQotCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgID0gKFVTSE9SVClSdHNUaHJlc2g7Ci0JZWxzZSBpZiAoUnRzVGhyZXNoID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9SVFNUaHJlc2hvbGRfUHJvYzo6KFJUU1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEZyYWdtZW50IFRocmVzaG9sZAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCSBORElTXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCAgICAgRnJhZ1RocmVzaDsKLQotCUZyYWdUaHJlc2ggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLQl7Ci0JCS8vSWxsZWdhbCBGcmFnVGhyZXNoIHNvIHdlIHNldCBpdCB0byBkZWZhdWx0Ci0JCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCX0KLQllbHNlIGlmIChGcmFnVGhyZXNoICUgMiA9PSAxKQotCXsKLQkJLy8gVGhlIGxlbmd0aCBvZiBlYWNoIGZyYWdtZW50IHNoYWxsIGFsd2F5cyBiZSBhbiBldmVuIG51bWJlciBvZiBvY3RldHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZnJhZ21lbnQKLQkJLy8gb2YgYW4gTVNEVSBvciBNTVBEVSwgd2hpY2ggbWF5IGJlIGVpdGhlciBhbiBldmVuIG9yIGFuIG9kZCBudW1iZXIgb2Ygb2N0ZXRzLgotCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IChVU0hPUlQpKEZyYWdUaHJlc2ggLSAxKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0JfQotCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKQotCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7Ci0JCWVsc2UKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jOjooRnJhZ1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhCdXJzdAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFR4QnVyc3Q7Ci0KLQlUeEJ1cnN0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVHhCdXJzdCA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7Ci0JZWxzZSBpZiAoVHhCdXJzdCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhCdXJzdF9Qcm9jOjooVHhCdXJzdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFR4QnVyc3QKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIGFnZ3JlOwotCi0JYWdncmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGFnZ3JlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOwotCWVsc2UgaWYgKGFnZ3JlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUGt0QWdncmVnYXRlX1Byb2M6OihBR0dSRT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IElFRUU4MDIxMUguCi0gICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIDEgd2hlbiBuZWVkcyByYWRhciBkZXRlY3Rpb24sIG90aGVyd2lzZSAwCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0gICAgVUxPTkcgaWVlZTgwMjExaDsKLQotCWllZWU4MDIxMWggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGllZWU4MDIxMWggPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOwotCWVsc2UgaWYgKGllZWU4MDIxMWggPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0lFRUU4MDIxMUhfUHJvYzo6KElFRUU4MDIxMUg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotI2lmZGVmIERCRwotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBGb3IgRGVidWcgaW5mb3JtYXRpb24KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfRGVidWdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFNldF9EZWJ1Z19Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKLQotICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gUlRfREVCVUdfTE9VRCkKLSAgICAgICAgUlREZWJ1Z0xldmVsID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfRGVidWdfUHJvYyhSVERlYnVnTGV2ZWwgPSAlbGQpXG4iLCBSVERlYnVnTGV2ZWwpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLUlOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotI2lmZGVmIFJUMjg2MAotCUlOVCBpLCBRdWVJZHg9MDsKLQlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEOwotICAgIFBUWERfU1RSVUMgcFR4RDsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUXVlSWR4XTsKLQlQUlRNUF9NR01UX1JJTkcJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0JUFJUTVBfUlhfUklORwlwUnhSaW5nID0gJnBBZC0+UnhSaW5nOwotCi0JZm9yKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JewotCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQkgICAgcHJpbnRrKCJEZXNjICMlZFxuIixpKTsKLQkgICAgaGV4X2R1bXAoIlR4IERlc2NyaXB0b3IiLCAoY2hhciAqKXBUeEQsIDE2KTsKLQkgICAgcHJpbnRrKCJwVHhELT5ETUFET05FID0gJXhcbiIsIHBUeEQtPkRNQURPTkUpOwotCX0KLQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JZm9yKGk9MDtpPE1HTVRfUklOR19TSVpFO2krKykKLQl7Ci0JICAgIHBUeEQgPSAoUFRYRF9TVFJVQykgcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0JICAgIHByaW50aygiRGVzYyAjJWRcbiIsaSk7Ci0JICAgIGhleF9kdW1wKCJNZ210IERlc2NyaXB0b3IiLCAoY2hhciAqKXBUeEQsIDE2KTsKLQkgICAgcHJpbnRrKCJwTWdtdC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKTsKLQl9Ci0JcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCWZvcihpPTA7aTxSWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkgICAgcFJ4RCA9IChQUlQyOFhYX1JYRF9TVFJVQykgcFJ4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCSAgICBwcmludGsoIkRlc2MgIyVkXG4iLGkpOwotCSAgICBoZXhfZHVtcCgiUnggRGVzY3JpcHRvciIsIChjaGFyICopcFJ4RCwgMTYpOwotCQlwcmludGsoInBSeEQtPkRET05FID0gJXhcbiIsIHBSeEQtPkRET05FKTsKLQl9Ci0jZW5kaWYgLyogUlQyODYwICovCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgUmVzZXQgc3RhdGlzdGljcyBjb3VudGVyCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICBhcmcKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PlNldF9SZXNldFN0YXRDb3VudGVyX1Byb2NcbiIpKTsKLQotCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycwotCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5XbGFuQ291bnRlcnMsIHNpemVvZihDT1VOVEVSXzgwMl8xMSkpOwotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5SYWxpbmtDb3VudGVycywgc2l6ZW9mKENPVU5URVJfUkFMSU5LKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCi0gICAgSU4gIENIQVIgKnBJblB1dFN0ciwKLSAgICBJTiAgVUNIQVIgc3RyTGVuKQotewotICAgIFVDSEFSIGk9MDsKLQotICAgIGZvciAoaT0wOyBpPHN0ckxlbjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChwSW5QdXRTdHJbaV0gPCAweDIxKSB8fAotICAgICAgICAgICAgKHBJblB1dFN0cltpXSA+IDB4N0UpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04NjIsMjE3ICs0NywxNzQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpCit2b2lkIFJUTVBTZXREZXNpcmVkUmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGxvbmcgUmF0ZXMpCiB7Ci0gICAgTkRJU184MDJfMTFfUkFURVMgYXJ5UmF0ZXM7CisJTkRJU184MDJfMTFfUkFURVMgYXJ5UmF0ZXM7CiAKLSAgICBtZW1zZXQoJmFyeVJhdGVzLCAweDAwLCBzaXplb2YoTkRJU184MDJfMTFfUkFURVMpKTsKLSAgICBzd2l0Y2ggKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgUEhZXzExQTogLy8gQSBvbmx5Ci0gICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4NjA7IC8vIDQ4TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcwotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s0XSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s2XSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwYzsgLy8gNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBIWV8xMUJHX01JWEVEOiAvLyBCL0cgTWl4ZWQKLSAgICAgICAgY2FzZSBQSFlfMTFCOiAvLyBCIG9ubHkKLSAgICAgICAgY2FzZSBQSFlfMTFBQkdfTUlYRUQ6IC8vIEEvQi9HIE1peGVkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzd2l0Y2ggKFJhdGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMTAwMDAwMDogLy8xTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDI7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDAwMDAwOiAvLzJNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgwNDsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDUwMDAwMDA6IC8vNS41TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGI7IC8vIDUuNU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDExMDAwMDAwOiAvLzExTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNjAwMDAwMDogLy82TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5MDAwMDAwOiAvLzlNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxMjsgLy8gOU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18xOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyMDAwMDAwOiAvLzEyTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTg7IC8vIDEyTQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTgwMDAwMDA6IC8vMThNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgyNDsgLy8gMThNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDAwMDogLy8yNE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDMwOyAvLyAyNE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU180OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM2MDAwMDAwOiAvLzM2TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NDg7IC8vIDM2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDAwMDA6IC8vNDhNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2MDsgLy8gNDhNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1NDAwMDAwMDogLy81NE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU183OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOiAvL0F1dG8KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0gICAgICAgICAgICAgICAgICAgIHsgLy9CIE9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgxNjsgLy8gMTFNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1sxXSA9IDB4MGI7IC8vIDUuNU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHgwNDsgLy8gMk1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzNdID0gMHgwMjsgLy8gMU1icHMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgLy8oQi9HKSBNaXhlZCBvciAoQS9CL0cpIE1peGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NmM7IC8vIDU0TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzJdID0gMHg0ODsgLy8gMzZNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MzA7IC8vIDI0TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDE2OyAvLyAxMU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzVdID0gMHgwYjsgLy8gNS41TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDA0OyAvLyAyTWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbN10gPSAweDAyOyAvLyAxTWJwcwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsICZhcnlSYXRlcywgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFJUTVBTZXREZXNpcmVkUmF0ZXMgKCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeClcbiIsCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0sCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSxwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7Ci0gICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0Ci0gICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkYXB0ZXIsIEZBTFNFLCAwKTsKLX0KLQotTkRJU19TVEFUVVMgUlRNUFdQQVJlbW92ZUtleVByb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFZPSUQJCQlwQnVmKQotewotCVBORElTXzgwMl8xMV9SRU1PVkVfS0VZIHBLZXk7Ci0JVUxPTkcJCQkJCUtleUlkeDsKLQlORElTX1NUQVRVUyAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCUJPT0xFQU4gCWJUeEtleTsgCQkvLyBTZXQgdGhlIGtleSBhcyB0cmFuc21pdCBrZXkKLQlCT09MRUFOIAliUGFpcndpc2U7CQkvLyBJbmRpY2F0ZSB0aGUga2V5IGlzIHBhaXJ3aXNlIGtleQotCUJPT0xFQU4gCWJLZXlSU0M7CQkvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSAgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZS4KLQkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIHNldCBieSB0aGUgTklDLgotCUJPT0xFQU4gCWJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSBrZXkgaXMgc2V0IGJ5IGF1dGhlbnRpY2F0b3IuCi0JSU5UIAkJaTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0tPiBSVE1QV1BBUmVtb3ZlS2V5UHJvY1xuIikpOwotCi0JcEtleSA9IChQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSkgcEJ1ZjsKLQlLZXlJZHggPSBwS2V5LT5LZXlJbmRleCAmIDB4ZmY7Ci0JLy8gQml0IDMxIG9mIEFkZC1rZXksIFR4IEtleQotCWJUeEtleQkJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQkvLyBCaXQgMzAgb2YgQWRkLWtleSBQYWlyd2lzZUtleQotCWJQYWlyd2lzZQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4NDAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCS8vIEJpdCAyOSBvZiBBZGQta2V5IEtleVJTQwotCWJLZXlSU0MgCSAgID0gKHBLZXktPktleUluZGV4ICYgMHgyMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgotCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0KLQkvLyAxLiBJZiBiVHggaXMgVFJVRSwgcmV0dXJuIGZhaWx1cmUgaW5mb3JtYXRpb24KLQlpZiAoYlR4S2V5ID09IFRSVUUpCi0JCXJldHVybihORElTX1NUQVRVU19JTlZBTElEX0RBVEEpOwotCi0JLy8gMi4gQ2hlY2sgUGFpcndpc2UgS2V5Ci0JaWYgKGJQYWlyd2lzZSkKLQl7Ci0JCS8vIGEuIElmIEJTU0lEIGlzIGJyb2FkY2FzdCwgcmVtb3ZlIGFsbCBwYWlyd2lzZSBrZXlzLgotCQkvLyBiLiBJZiBub3QgYnJvYWRjYXN0LCByZW1vdmUgdGhlIHBhaXJ3aXNlIHNwZWNpZmllZCBieSBCU1NJRAotCQlmb3IgKGkgPSAwOyBpIDwgU0hBUkVfS0VZX05VTTsgaSsrKQotCQl7Ci0JCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQnNzSWQsIHBLZXktPkJTU0lEKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lZClcbiIsIGkpKTsKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5LZXlMZW4gPSAwOwotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilpKTsKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJCWJyZWFrOwotCQkJfQorCW1lbXNldCgmYXJ5UmF0ZXMsIDB4MDAsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOworCXN3aXRjaCAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlKSB7CisJY2FzZSBQSFlfMTFBOgkJLyogQSBvbmx5ICovCisJCXN3aXRjaCAoUmF0ZXMpIHsKKwkJY2FzZSA2MDAwMDAwOgkvKjZNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MGM7CS8qIDZNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMDsKKwkJCWJyZWFrOworCQljYXNlIDkwMDAwMDA6CS8qOU0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgxMjsJLyogOU0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18xOworCQkJYnJlYWs7CisJCWNhc2UgMTIwMDAwMDA6CS8qMTJNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MTg7CS8qIDEyTSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzI7CisJCQlicmVhazsKKwkJY2FzZSAxODAwMDAwMDoJLyoxOE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgyNDsJLyogMThNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMzsKKwkJCWJyZWFrOworCQljYXNlIDI0MDAwMDAwOgkvKjI0TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDMwOwkvKiAyNE0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU180OworCQkJYnJlYWs7CisJCWNhc2UgMzYwMDAwMDA6CS8qMzZNICovCisJCQlhcnlSYXRlc1swXSA9IDB4NDg7CS8qIDM2TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzU7CisJCQlicmVhazsKKwkJY2FzZSA0ODAwMDAwMDoJLyo0OE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHg2MDsJLyogNDhNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNjsKKwkJCWJyZWFrOworCQljYXNlIDU0MDAwMDAwOgkvKjU0TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDZjOwkvKiA1NE0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU183OworCQkJYnJlYWs7CisJCWNhc2UgLTE6CS8qQXV0byAqLworCQlkZWZhdWx0OgorCQkJYXJ5UmF0ZXNbMF0gPSAweDZjOwkvKiA1NE1icHMgKi8KKwkJCWFyeVJhdGVzWzFdID0gMHg2MDsJLyogNDhNYnBzICovCisJCQlhcnlSYXRlc1syXSA9IDB4NDg7CS8qIDM2TWJwcyAqLworCQkJYXJ5UmF0ZXNbM10gPSAweDMwOwkvKiAyNE1icHMgKi8KKwkJCWFyeVJhdGVzWzRdID0gMHgyNDsJLyogMThNICovCisJCQlhcnlSYXRlc1s1XSA9IDB4MTg7CS8qIDEyTSAqLworCQkJYXJ5UmF0ZXNbNl0gPSAweDEyOwkvKiA5TSAqLworCQkJYXJ5UmF0ZXNbN10gPSAweDBjOwkvKiA2TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTX0FVVE87CisJCQlicmVhazsKIAkJfQotCX0KLQkvLyAzLiBHcm91cCBLZXkKLQllbHNlCi0JewotCQkvLyBhLiBJZiBCU1NJRCBpcyBicm9hZGNhc3QsIHJlbW92ZSBhbGwgZ3JvdXAga2V5cyBpbmRleGVkCi0JCS8vIGIuIElmIEJTU0lEIG1hdGNoZWQsIGRlbGV0ZSB0aGUgZ3JvdXAga2V5IGluZGV4ZWQuCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVsZClcbiIsIEtleUlkeCkpOwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9IDA7Ci0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCQlicmVhazsKKwljYXNlIFBIWV8xMUJHX01JWEVEOgkvKiBCL0cgTWl4ZWQgKi8KKwljYXNlIFBIWV8xMUI6CQkvKiBCIG9ubHkgKi8KKwljYXNlIFBIWV8xMUFCR19NSVhFRDoJLyogQS9CL0cgTWl4ZWQgKi8KKwlkZWZhdWx0OgorCQlzd2l0Y2ggKFJhdGVzKSB7CisJCWNhc2UgMTAwMDAwMDoJLyoxTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDAyOworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzA7CisJCQlicmVhazsKKwkJY2FzZSAyMDAwMDAwOgkvKjJNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MDQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMTsKKwkJCWJyZWFrOworCQljYXNlIDUwMDAwMDA6CS8qNS41TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDBiOwkvKiA1LjVNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMjsKKwkJCWJyZWFrOworCQljYXNlIDExMDAwMDAwOgkvKjExTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDE2OwkvKiAxMU0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18zOworCQkJYnJlYWs7CisJCWNhc2UgNjAwMDAwMDoJLyo2TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDBjOwkvKiA2TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzA7CisJCQlicmVhazsKKwkJY2FzZSA5MDAwMDAwOgkvKjlNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MTI7CS8qIDlNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfMTsKKwkJCWJyZWFrOworCQljYXNlIDEyMDAwMDAwOgkvKjEyTSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDE4OwkvKiAxMk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU18yOworCQkJYnJlYWs7CisJCWNhc2UgMTgwMDAwMDA6CS8qMThNICovCisJCQlhcnlSYXRlc1swXSA9IDB4MjQ7CS8qIDE4TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzM7CisJCQlicmVhazsKKwkJY2FzZSAyNDAwMDAwMDoJLyoyNE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHgzMDsJLyogMjRNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNDsKKwkJCWJyZWFrOworCQljYXNlIDM2MDAwMDAwOgkvKjM2TSAqLworCQkJYXJ5UmF0ZXNbMF0gPSAweDQ4OwkvKiAzNk0gKi8KKwkJCXBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPQorCQkJICAgIE1DU181OworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDAwMDA6CS8qNDhNICovCisJCQlhcnlSYXRlc1swXSA9IDB4NjA7CS8qIDQ4TSAqLworCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTXzY7CisJCQlicmVhazsKKwkJY2FzZSA1NDAwMDAwMDoJLyo1NE0gKi8KKwkJCWFyeVJhdGVzWzBdID0gMHg2YzsJLyogNTRNICovCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCSAgICBNQ1NfNzsKKwkJCWJyZWFrOworCQljYXNlIC0xOgkvKkF1dG8gKi8KKwkJZGVmYXVsdDoKKwkJCWlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgewkvKkIgT25seSAqLworCQkJCWFyeVJhdGVzWzBdID0gMHgxNjsJLyogMTFNYnBzICovCisJCQkJYXJ5UmF0ZXNbMV0gPSAweDBiOwkvKiA1LjVNYnBzICovCisJCQkJYXJ5UmF0ZXNbMl0gPSAweDA0OwkvKiAyTWJwcyAqLworCQkJCWFyeVJhdGVzWzNdID0gMHgwMjsJLyogMU1icHMgKi8KKwkJCX0gZWxzZSB7CS8qKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZCAqLworCQkJCWFyeVJhdGVzWzBdID0gMHg2YzsJLyogNTRNYnBzICovCisJCQkJYXJ5UmF0ZXNbMV0gPSAweDYwOwkvKiA0OE1icHMgKi8KKwkJCQlhcnlSYXRlc1syXSA9IDB4NDg7CS8qIDM2TWJwcyAqLworCQkJCWFyeVJhdGVzWzNdID0gMHgzMDsJLyogMjRNYnBzICovCisJCQkJYXJ5UmF0ZXNbNF0gPSAweDE2OwkvKiAxMU1icHMgKi8KKwkJCQlhcnlSYXRlc1s1XSA9IDB4MGI7CS8qIDUuNU1icHMgKi8KKwkJCQlhcnlSYXRlc1s2XSA9IDB4MDQ7CS8qIDJNYnBzICovCisJCQkJYXJ5UmF0ZXNbN10gPSAweDAyOwkvKiAxTWJwcyAqLworCQkJfQorCQkJcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9CisJCQkgICAgTUNTX0FVVE87CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gKFN0YXR1cyk7CisJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLAorCQkgICAgICAgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgJmFyeVJhdGVzLAorCQkgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0sCisJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAorCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSwKKwkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10pKTsKKwkvKiBDaGFuZ2luZyBEZXNpcmVkUmF0ZSBtYXkgYWZmZWN0IHRoZSBNQVggVFggcmF0ZSB3ZSB1c2VkIHRvIFRYIGZyYW1lcyBvdXQgKi8KKwlNbG1lVXBkYXRlVHhSYXRlcyhwQWRhcHRlciwgRkFMU0UsIDApOwogfQogCiAvKgpAQCAtMTA5Myw0MCArMjM1LDY1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBXUEFSZW1vdmVBbGxLZXlzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QV1BBUmVtb3ZlQWxsS2V5cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAKLQlVQ0hBUiAJaTsKKwl1OCBpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlQWxsS2V5cyhBdXRoTW9kZT0lZCwgV2VwU3RhdHVzPSVkKVxuIiwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCi0JLy8gRm9yIFdFUC9DS0lQLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJlbW92ZSBpdCwgc2luY2UgV2luWFAgd29uJ3Qgc2V0IGl0IGFnYWluIGFmdGVyCi0JLy8gTGluayB1cC4gQW5kIGl0IHdpbGwgYmUgcmVwbGFjZWQgaWYgdXNlciBjaGFuZ2VkIGl0LgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QV1BBUmVtb3ZlQWxsS2V5cyhBdXRoTW9kZT0lZCwgV2VwU3RhdHVzPSVkKVxuIiwKKwkJICBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOworCS8qIEZvciBXRVAvQ0tJUCwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlciAqLworCS8qIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4gKi8KIAlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCiAJCXJldHVybjsKIAotCS8vIEZvciBXUEEtTm9uZSwgdGhlcmUgaXMgbm8gbmVlZCB0byByZW1vdmUgaXQsIHNpbmNlIFdpblhQIHdvbid0IHNldCBpdCBhZ2FpbiBhZnRlcgotCS8vIExpbmsgdXAuIEFuZCBpdCB3aWxsIGJlIHJlcGxhY2VkIGlmIHVzZXIgY2hhbmdlZCBpdC4KKwkvKiBGb3IgV1BBLU5vbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIgKi8KKwkvKiBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuICovCiAJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCiAJCXJldHVybjsKIAotCS8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKKwkvKiBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlICovCiAJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCU1MwLCBCU1NJRF9XQ0lEKTsKIAotCS8vIHNldCBhbGwgc2hhcmVkIGtleSBtb2RlIGFzIG5vLXNlY3VyaXR5LgotCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCi0gICAgewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInJlbW92ZSAlcyBrZXkgIyVkXG4iLCBDaXBoZXJOYW1lW3BBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZ10sIGkpKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLCBzaXplb2YoQ0lQSEVSX0tFWSkpOworCS8qIHNldCBhbGwgc2hhcmVkIGtleSBtb2RlIGFzIG5vLXNlY3VyaXR5LiAqLworCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJyZW1vdmUgJXMga2V5ICMlZFxuIiwKKwkJCSAgQ2lwaGVyTmFtZVtwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGddLCBpKSk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtpXSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CiAKIAkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaSk7CiAJfQotCisJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKIH0KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFzIFNUQSdzIEJTU0lEIGlzIGEgV0MgdG9vLCBpdCB1c2VzIHNoYXJlZCBrZXkgdGFibGUuCisJCVRoaXMgZnVuY3Rpb24gd3JpdGUgY29ycmVjdCB1bmljYXN0IFRYIGtleSB0byBBU0lDIFdDSUQuCisJCUFuZCB3ZSBzdGlsbCBtYWtlIGEgY29weSBpbiBvdXIgTWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuCisJCUNhbGxlciBndWFyYW50ZWUgVEtJUC9BRVMgYWx3YXlzIGhhcyBrZXlpZHggPSAwLiAocGFpcndpc2Uga2V5KQorCQlDYWxsZXIgZ3VhcmFudGVlIFdFUCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gc2V0IFR4a2V5LCAgZGVmYXVsdCBrZXkgaW5kZXg9MH4zLgorCisJQXJndW1lbnRzOgorCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcEtleQkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAorCisJUmV0dXJuIFZhbHVlOgorCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5CisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCVJvdXRpbmUgRGVzY3JpcHRpb246CiAJCUNoYW5nZSBOSUMgUEhZIG1vZGUuIFJlLWFzc29jaWF0aW9uIG1heSBiZSBuZWNlc3NhcnkuIHBvc3NpYmxlIHNldHRpbmdzCiAJCWluY2x1ZGUgLSBQSFlfMTFCLCBQSFlfMTFCR19NSVhFRCwgUEhZXzExQSwgYW5kIFBIWV8xMUFCR19NSVhFRApAQCAtMTE0MCwxMTUgKzMwNywxMTkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFNldFBoeU1vZGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUxPTkcgcGh5bW9kZSkKK3ZvaWQgUlRNUFNldFBoeU1vZGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIHBoeW1vZGUpCiB7Ci0JSU5UIGk7Ci0JLy8gdGhlIHNlbGVjdGVkIHBoeW1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIFJGIElDIGVuY29kZWQgaW4gRTJQUk9NCisJaW50IGk7CisJLyogdGhlIHNlbGVjdGVkIHBoeW1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIFJGIElDIGVuY29kZWQgaW4gRTJQUk9NICovCiAKLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gKFVDSEFSKXBoeW1vZGU7CisJLyogaWYgbm8gY2hhbmdlLCBkbyBub3RoaW5nICovCisJLyogYnVnIGZpeAorCSAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IHBoeW1vZGUpCisJICAgcmV0dXJuOworCSAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAodTgpcGh5bW9kZTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFNldFBoeU1vZGUgOiBQaHlNb2RlPSVkLCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0UGh5TW9kZSA6IFBoeU1vZGU9JWQsIGNoYW5uZWw9JWQgXG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKIAogCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKIAotCS8vIHNhbml0eSBjaGVjayB1c2VyIHNldHRpbmcKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKKwkvKiBzYW5pdHkgY2hlY2sgdXNlciBzZXR0aW5nICovCisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgewogCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCiAJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCXsKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBGaXJzdENoYW5uZWwocEFkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldFBoeU1vZGU6IGNoYW5uZWwgaXMgb3V0IG9mIHJhbmdlLCB1c2UgZmlyc3QgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVE1QU2V0UGh5TW9kZTogY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UsIHVzZSBmaXJzdCBjaGFubmVsPSVkIFxuIiwKKwkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwogCX0KIAogCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CiAJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwogCXN3aXRjaCAocGh5bW9kZSkgewotCQljYXNlIFBIWV8xMUI6Ci0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA0OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCi0JCQlicmVhazsKKwljYXNlIFBIWV8xMUI6CisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gPSAweDgyOwkvKiAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gPSAweDg0OwkvKiAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gPSAweDhCOwkvKiA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSA9IDB4OTY7CS8qIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuID0gMDsKKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSA9IDI7CS8qIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSA9IDQ7CS8qIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsyXSA9IDExOwkvKiA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSA9IDIyOwkvKiAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZSAqLworCQlicmVhazsKIAotCQljYXNlIFBIWV8xMUc6Ci0JCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NDg7CSAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVswXSAgPSAweDBDOwkgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMV0gID0gMHgxODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsyXSAgPSAweDMwOwkgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzNdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gNDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDEyOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdICA9IDE4OyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDI0OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAzNjsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOF0gID0gNDg7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzldICA9IDcyOyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMF0gPSA5NjsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTFdID0gMTA4OyAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlicmVhazsKKwljYXNlIFBIWV8xMUc6CisJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwljYXNlIFBIWV8xMU5fMl80RzoKKwljYXNlIFBIWV8xMUFCR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFHTl9NSVhFRDoKKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSA9IDB4ODI7CS8qIDEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSA9IDB4ODQ7CS8qIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSA9IDB4OEI7CS8qIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZSAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzNdID0gMHg5NjsJLyogMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSA9IDB4MTI7CS8qIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSA9IDB4MjQ7CS8qIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gPSAweDQ4OwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddID0gMHg2YzsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiA9IDg7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMF0gPSAweDBDOwkvKiA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMV0gPSAweDE4OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzJdID0gMHgzMDsJLyogMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVszXSA9IDB4NjA7CS8qIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gPSA0OworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdID0gMjsJLyogMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdID0gNDsJLyogMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdID0gMTE7CS8qIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdID0gMjI7CS8qIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gPSAxMjsJLyogNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdID0gMTg7CS8qIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSA9IDI0OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddID0gMzY7CS8qIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOF0gPSA0ODsJLyogMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs5XSA9IDcyOwkvKiAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzEwXSA9IDk2OwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzExXSA9IDEwODsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJYnJlYWs7CiAKLQkJY2FzZSBQSFlfMTFBOgotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFOXzVHOgotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSAgPSAweDhDOwkgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMV0gID0gMHgxMjsJICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzJdICA9IDB4OTg7CSAgLy8gMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHgyNDsJICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs0XSAgPSAweGIwOwkgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzVdICA9IDB4NDg7CSAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gID0gMHg2MDsJICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs3XSAgPSAweDZjOwkgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuICA9IDg7Ci0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuICA9IDA7Ci0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdICA9IDEyOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDE4OyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDI0OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAzNjsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0gID0gNDg7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdICA9IDcyOyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSAgPSA5NjsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gID0gMTA4OyAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UKLQkJCWJyZWFrOworCWNhc2UgUEhZXzExQToKKwljYXNlIFBIWV8xMUFOX01JWEVEOgorCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCWNhc2UgUEhZXzExTl81RzoKKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXSA9IDB4OEM7CS8qIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSA9IDB4MTI7CS8qIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSA9IDB4OTg7CS8qIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gPSAweDI0OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdID0gMHhiMDsJLyogMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSA9IDB4NDg7CS8qIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNl0gPSAweDYwOwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddID0gMHg2YzsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiA9IDg7CisJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gPSAwOworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdID0gMTI7CS8qIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSA9IDE4OwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gPSAyNDsJLyogMTIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSA9IDM2OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdID0gNDg7CS8qIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gPSA3MjsJLyogMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs2XSA9IDk2OwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddID0gMTA4OwkvKiA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOyAvLyBUaGlzIE1PREUgaXMgb25seSBGWUkuIG5vdCB1c2UgKi8KKwkJYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAotCiAJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOwogfQogCkBAIC0xMjY0LDM0ICs0MzUsMzMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFNldEhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU9JRF9TRVRfSFRfUEhZTU9ERSAqcEhUUGh5TW9kZSkKK3ZvaWQgUlRNUFNldEhUKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X29pZF9zZXRfaHRfcGh5bW9kZSAqcEhUUGh5TW9kZSkKIHsKLQkvL1VMT05HCSpwbWNzOwotCVVJTlQzMglWYWx1ZSA9IDA7Ci0JVUNIQVIJQkJQVmFsdWUgPSAwOwotCVVDSEFSCUJCUDNWYWx1ZSA9IDA7Ci0JVUNIQVIJUnhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbTsKKwkvKnVuc2lnbmVkIGxvbmcgKnBtY3M7ICovCisJdTMyIFZhbHVlID0gMDsKKwl1OCBCQlBWYWx1ZSA9IDA7CisJdTggQkJQM1ZhbHVlID0gMDsKKwl1OCBSeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogSFRfbW9kZSglZCksIEV4dE9mZnNldCglZCksIE1DUyglZCksIEJXKCVkKSwgU1RCQyglZCksIFNIT1JUR0koJWQpXG4iLAotCQkJCQkJCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAotCQkJCQkJCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsCi0JCQkJCQkJCQkJcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+U0hPUlRHSSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0SFQgOiBIVF9tb2RlKCVkKSwgRXh0T2Zmc2V0KCVkKSwgTUNTKCVkKSwgQlcoJWQpLCBTVEJDKCVkKSwgU0hPUlRHSSglZClcbiIsCisJCSAgcEhUUGh5TW9kZS0+SHRNb2RlLCBwSFRQaHlNb2RlLT5FeHRPZmZzZXQsIHBIVFBoeU1vZGUtPk1DUywKKwkJICBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+U0hPUlRHSSkpOwogCi0JLy8gRG9uJ3QgemVybyBzdXBwb3J0ZWRIeVBoeSBzdHJ1Y3R1cmUuCi0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQpKTsKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCBzaXplb2YocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5KSk7CisJLyogRG9uJ3QgemVybyBzdXBwb3J0ZWRIeVBoeSBzdHJ1Y3R1cmUuICovCisJUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOworCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQpKTsKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeSkpOwogCi0gICAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCi0JeworCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDE7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMDsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gMDsKIAl9CkBAIC0xMjk5LDg5ICs0NjksOTIgQEAKIAlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IDM7CiAJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciA9IDM7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0SFQgOiBSeEJBV2luTGltaXQgPSAlZFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KSk7CiAKLQkvLyBNaW1vIHBvd2VyIHNhdmUsIEEtTVNEVSBzaXplLAotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCS8qIE1pbW8gcG93ZXIgc2F2ZSwgQS1NU0RVIHNpemUsICovCisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9CisJICAgICh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPQorCSAgICAodTgpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9CisJICAgICh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CiAKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOworCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9CisJICAgICh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKLQkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0SFQgOiBBTXNkdVNpemUgPSAlZCwgTWltb1BzID0gJWQsIE1wZHVEZW5zaXR5ID0gJWQsIE1heFJBbXBkdUZhY3RvciA9ICVkXG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUsCisJCSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcywKKwkJICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHksCisJCSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcikpOwogCi0JaWYocEhUUGh5TW9kZS0+SHRNb2RlID09IEhUTU9ERV9HRikKLQl7CisJaWYgKHBIVFBoeU1vZGUtPkh0TW9kZSA9PSBIVE1PREVfR0YpIHsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRiA9IDE7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGID0gMDsKIAotCS8vIERlY2lkZSBSeCBNQ1NTZXQKLQlzd2l0Y2ggKFJ4U3RyZWFtKQotCXsKLQkJY2FzZSAxOgotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweDAwOwotCQkJYnJlYWs7CisJLyogRGVjaWRlIFJ4IE1DU1NldCAqLworCXN3aXRjaCAoUnhTdHJlYW0pIHsKKwljYXNlIDE6CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKKwkJYnJlYWs7CiAKLQkJY2FzZSAyOgotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOwotCQkJYnJlYWs7CisJY2FzZSAyOgorCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisJCWJyZWFrOwogCi0JCWNhc2UgMzogLy8gMyozCi0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gIDB4ZmY7Ci0JCQlicmVhazsKKwljYXNlIDM6CQkvKiAzKjMgKi8KKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKKwkJYnJlYWs7CiAJfQogCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgJiYgKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKSApCi0JeworCWlmIChwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpICYmIChwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkpIHsKIAkJcEhUUGh5TW9kZS0+QlcgPSBCV18yMDsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5Gb3J0eV9NaHpfSW50b2xlcmFudCA9IDE7CiAJfQogCi0JaWYocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOyAvLyBNQ1MgMzIKKwlpZiAocEhUUGh5TW9kZS0+QlcgPT0gQldfNDApIHsKKwkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsJLyogTUNTIDMyICovCiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMTsKIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCiAJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNDS21vZGVpbjQwID0gMTsKIAogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID0gMTsKIAkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID0gKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpPyAoRVhUQ0hBX0JFTE9XKTogRVhUQ0hBX0FCT1ZFOwotCQkvLyBTZXQgUmVnc2l0ZXIgZm9yIGV4dGVuc2lvbiBjaGFubmVsIHBvc2l0aW9uLgorCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPQorCQkgICAgKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PQorCQkgICAgIEVYVENIQV9CRUxPVykgPyAoRVhUQ0hBX0JFTE9XKSA6IEVYVENIQV9BQk9WRTsKKwkJLyogU2V0IFJlZ3NpdGVyIGZvciBleHRlbnNpb24gY2hhbm5lbCBwb3NpdGlvbi4gKi8KIAkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQM1ZhbHVlKTsKLQkJaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKLQkJeworCQlpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQkVMT1cpKSB7CiAJCQlWYWx1ZSB8PSAweDE7CiAJCQlCQlAzVmFsdWUgfD0gKDB4MjApOwogCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQkJfQotCQllbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCXsKKwkJfSBlbHNlIGlmICgocEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpIHsKIAkJCVZhbHVlICY9IDB4ZmU7CiAJCQlCQlAzVmFsdWUgJj0gKH4weDIwKTsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CiAJCX0KLQotCQkvLyBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4KLQkJLy8gU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLgorCQkvKiBUdXJuIG9uIEJCUCA0ME1IeiBtb2RlIG5vdyBvbmx5IGFzIEFQIC4gKi8KKwkJLyogU3RhIGNhbiB0dXJuIG9uIEJCUCA0ME1IeiBhZnRlciBjb25uZWN0aW9uIHdpdGggNDBNSHogQVAuIFN0YSBvbmx5IGJyb2FkY2FzdCA0ME1IeiBjYXBhYmlsaXR5IGJlZm9yZSBjb25uZWN0aW9uLiAqLwogCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgfHwgSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCi0JCQkpCi0JCXsKKwkJICAgICkgewogCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKIAkJCUJCUFZhbHVlIHw9IDB4MTA7CkBAIC0xMzkwLDE1ICs1NjMsMTMgQEAKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUDNWYWx1ZSk7CiAJCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMDsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDA7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IEVYVENIQV9OT05FOwogCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgorCQkvKiBUdXJuIG9uIEJCUCAyME1IeiBtb2RlIGJ5IHJlcXVlc3QgaGVyZS4gKi8KIAkJewogCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKQEAgLTE0MDcsNDIgKzU3OCwzNSBAQAogCQl9CiAJfQogCi0JaWYocEhUUGh5TW9kZS0+U1RCQyA9PSBTVEJDX1VTRSkKLQl7CisJaWYgKHBIVFBoeU1vZGUtPlNUQkMgPT0gU1RCQ19VU0UpIHsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMTsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAxOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDID0gMTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMDsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQyA9IDA7CiAJfQogCi0JaWYocEhUUGh5TW9kZS0+U0hPUlRHSSA9PSBHSV80MDApCi0JeworCWlmIChwSFRQaHlNb2RlLT5TSE9SVEdJID09IEdJXzQwMCkgewogCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gMTsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCA9IDE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDAgPSAxOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gMDsKIAkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAwOwogCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwID0gMDsKIAkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCA9IDA7CiAJfQogCi0JLy8gV2Ugc3VwcG9ydCBsaW5rIGFkYXB0YXRpb24gZm9yIHVuc29saWNpdCBNQ1MgZmVlZGJhY2ssIHNldCB0byAyLgotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uTUNTRmVlZGJhY2sgPSBNQ1NGQktfTk9ORTsgLy9NQ1NGQktfVU5TT0xJQ0lUOworCS8qIFdlIHN1cHBvcnQgbGluayBhZGFwdGF0aW9uIGZvciB1bnNvbGljaXQgTUNTIGZlZWRiYWNrLCBzZXQgdG8gMi4gKi8KKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID0gTUNTRkJLX05PTkU7CS8qTUNTRkJLX1VOU09MSUNJVDsgKi8KIAlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQ29udHJvbENoYW4gPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCS8vIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLgorCS8qIDEsIHRoZSBleHRlbnNpb24gY2hhbm5lbCBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLiAqLwogCi0JLy8gRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7CisJLyogRURDQSBwYXJhbWV0ZXJzIHVzZWQgZm9yIEFQJ3Mgb3duIHRyYW5zbWlzc2lvbiAqLworCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkgewogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOwogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKQEAgLTE0NTksMTQgKzYyMywxNyBAQAogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CiAKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gOTQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSAgPSA0NzsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdID0gOTQ7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSA9IDQ3OwogCX0KIAlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7CiAKLQlSVE1QU2V0SW5kaXZpZHVhbEhUKHBBZCwgMCk7CisJeworCQlSVE1QU2V0SW5kaXZpZHVhbEhUKHBBZCwgMCk7CisJfQorCiB9CiAKIC8qCkBAIC0xNDgxLDExMiArNjQ4LDEwMyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QU2V0SW5kaXZpZHVhbEhUKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCkKK3ZvaWQgUlRNUFNldEluZGl2aWR1YWxIVChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGFwaWR4KQogewotCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKLQlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOwotCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKKwlzdHJ1Y3QgcnRfaHRfcGh5X2luZm8gKnBEZXNpcmVkX2h0X3BoeSA9IE5VTEw7CisJdTggVHhTdHJlYW0gPSBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbTsKKwl1OCBEZXNpcmVkTWNzID0gTUNTX0FVVE87CiAKLQlkbwotCXsKKwlkbyB7CiAJCXsKIAkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOwotCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKLQkJCQlicmVhazsKKwkJCURlc2lyZWRNY3MgPQorCQkJICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOworCQkJLypwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsgKi8KKwkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAoRkFMU0UpOwogCi0JaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7CisJaWYgKHBEZXNpcmVkX2h0X3BoeSA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRNUFNldEluZGl2aWR1YWxIVDogaW52YWxpZCBhcGlkeCglZClcbiIsIGFwaWR4KSk7CiAJCXJldHVybjsKIAl9Ci0JUlRNUFplcm9NZW1vcnkocERlc2lyZWRfaHRfcGh5LCBzaXplb2YoUlRfSFRfUEhZX0lORk8pKTsKKwlSVE1QWmVyb01lbW9yeShwRGVzaXJlZF9odF9waHksIHNpemVvZihzdHJ1Y3QgcnRfaHRfcGh5X2luZm8pKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQgOiBEZXNpcmVkIE1DUyA9ICVkXG4iLCBEZXNpcmVkTWNzKSk7Ci0JLy8gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIE1DUwotCWlmICgoVHhTdHJlYW0gPT0gMSkgJiYgKChEZXNpcmVkTWNzID49IE1DU184KSAmJiAoRGVzaXJlZE1jcyA8PSBNQ1NfMTUpKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTKCVkKSBpcyBpbnZhbGlkIGluIDFTLCByZXNldCBpdCBhcyBNQ1NfN1xuIiwgRGVzaXJlZE1jcykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOworCS8qIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MgKi8KKwlpZiAoKFR4U3RyZWFtID09IDEpCisJICAgICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCSAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsCisJCQkgIERlc2lyZWRNY3MpKTsKIAkJRGVzaXJlZE1jcyA9IE1DU183OwogCX0KIAotCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfMjApCisJICAgICYmIChEZXNpcmVkTWNzID09IE1DU18zMikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCSAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DU18zMiBpcyBvbmx5IHN1cHBvcnRlZCBpbiA0MC1NSHosIHJlc2V0IGl0IGFzIE1DU18wXG4iKSk7CiAJCURlc2lyZWRNY3MgPSBNQ1NfMDsKIAl9CiAKIAlwRGVzaXJlZF9odF9waHktPmJIdEVuYWJsZSA9IFRSVUU7CiAKLQkvLyBEZWNpZGUgZGVzaXJlZCBUeCBNQ1MKLQlzd2l0Y2ggKFR4U3RyZWFtKQotCXsKLQkJY2FzZSAxOgotCQkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pCi0JCQl7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDB4ZmY7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU183KQotCQkJewotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdPSAxPDxEZXNpcmVkTWNzOwotCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdPSAweDAwOwotCQkJfQotCQkJYnJlYWs7CisJLyogRGVjaWRlIGRlc2lyZWQgVHggTUNTICovCisJc3dpdGNoIChUeFN0cmVhbSkgeworCWNhc2UgMToKKwkJaWYgKERlc2lyZWRNY3MgPT0gTUNTX0FVVE8pIHsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdID0gMHhmZjsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdID0gMHgwMDsKKwkJfSBlbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU183KSB7CisJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXSA9IDEgPDwgRGVzaXJlZE1jczsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdID0gMHgwMDsKKwkJfQorCQlicmVhazsKIAotCQljYXNlIDI6Ci0JCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKLQkJCX0KLQkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQotCQkJewotCQkJCVVMT05HIG1vZGU7CisJY2FzZSAyOgorCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykgeworCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF0gPSAweGZmOworCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV0gPSAweGZmOworCQl9IGVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSB7CisJCQl1bnNpZ25lZCBsb25nIG1vZGU7CiAKLQkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7Ci0JCQkJaWYgKG1vZGUgPCAyKQotCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKLQkJCX0KLQkJCWJyZWFrOworCQkJbW9kZSA9IERlc2lyZWRNY3MgLyA4OworCQkJaWYgKG1vZGUgPCAyKQorCQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0W21vZGVdID0KKwkJCQkgICAgKDEgPDwgKERlc2lyZWRNY3MgLSBtb2RlICogOCkpOworCQl9CisJCWJyZWFrOwogCi0JCWNhc2UgMzogLy8gMyozCi0JCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKLQkJCXsKLQkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKLQkJCX0KLQkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQotCQkJewotCQkJCVVMT05HIG1vZGU7CisJY2FzZSAzOgkJLyogMyozICovCisJCWlmIChEZXNpcmVkTWNzID09IE1DU19BVVRPKSB7CisJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzBdID0gMHhmZjsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzFdID0gMHhmZjsKKwkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzJdID0gMHhmZjsKKwkJfSBlbHNlIGlmIChEZXNpcmVkTWNzIDw9IE1DU18yMykgeworCQkJdW5zaWduZWQgbG9uZyBtb2RlOwogCi0JCQkJbW9kZSA9IERlc2lyZWRNY3MgLyA4OwotCQkJCWlmIChtb2RlIDwgMykKLQkJCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbbW9kZV0gPSAoMSA8PCAoRGVzaXJlZE1jcyAtIG1vZGUgKiA4KSk7Ci0JCQl9Ci0JCQlicmVhazsKKwkJCW1vZGUgPSBEZXNpcmVkTWNzIC8gODsKKwkJCWlmIChtb2RlIDwgMykKKwkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9CisJCQkJICAgICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKKwkJfQorCQlicmVhazsKIAl9CiAKLQlpZihwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoID09IEJXXzQwKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV180MCkgewogCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKIAkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOwogCX0KLQotCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKLSAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLSAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotICAgIGVsc2UKLQkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKKwkvKiB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nICovCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKKwllbHNlCisJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBhcGlkeCk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtMTU5NSwzNiArNzUzLDM0IEBACiAJQXJndW1lbnRzOgogCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCiAKLQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFVwZGF0ZUhUSUUoCi0JSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCi0JSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAotCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKK3ZvaWQgUlRNUFVwZGF0ZUhUSUUoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgKnBSdEh0LAorCQkgICAgdTggKiBwTWNzU2V0LAorCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkgICAgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbykKIHsKLQlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCVJUTVBaZXJvTWVtb3J5KHBIdENhcGFiaWxpdHksIHNpemVvZihzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSkpOworCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcFJ0SHQtPkNoYW5uZWxXaWR0aDsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9QcyA9IHBSdEh0LT5NaW1vUHM7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiA9IHBSdEh0LT5HRjsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9IHBSdEh0LT5TaG9ydEdJZm9yMjA7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSBwUnRIdC0+U2hvcnRHSWZvcjQwOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDID0gcFJ0SHQtPlR4U1RCQzsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyA9IHBSdEh0LT5SeFNUQkM7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUgPSBwUnRIdC0+QW1zZHVTaXplOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcFJ0SHQtPk1heFJBbXBkdUZhY3RvcjsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gcFJ0SHQtPk1wZHVEZW5zaXR5OworCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOworCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMgPSBwUnRIdC0+TWltb1BzOworCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRiA9IHBSdEh0LT5HRjsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0gcFJ0SHQtPlNob3J0R0lmb3I0MDsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDID0gcFJ0SHQtPlR4U1RCQzsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplID0gcFJ0SHQtPkFtc2R1U2l6ZTsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcFJ0SHQtPk1heFJBbXBkdUZhY3RvcjsKKwlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7CiAKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7Ci0JCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7Ci0JCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OwotCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KKwlwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IHBSdEh0LT5FeHRDaGFuT2Zmc2V0OworCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7CisJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBwUnRIdC0+T3BlcmFpb25Nb2RlOworCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID0gcFJ0SHQtPk5vbkdmUHJlc2VudDsKKwlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCAqLyBwTWNzU2V0LCA0KTsJLyogcnQyODYwIG9ubHkgc3VwcG9ydCBNQ1MgbWF4PTMyLCBubyBuZWVkIHRvIGNvcHkgYWxsIDE2IHVjaGFyLiAqLwogCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFVwZGF0ZUhUSUUgPD09IFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKIH0KIAogLyoKQEAgLTE2MzQsNzggKzc5MCw3MSBAQAogICAgIFJldHVybjoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCc3NJZHgsCi0JSU4gCVVDSEFSCQkgCUtleUlkeCwKLQlJTiAJVUNIQVIJCSAJQ2lwaGVyQWxnLAotCUlOIAlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSkKK3ZvaWQgUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggQnNzSWR4LAorCQkJICAgICAgIHU4IEtleUlkeCwKKwkJCSAgICAgICB1OCBDaXBoZXJBbGcsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKIHsKLQlVSU5UMzIJCVdDSURBdHRyaSA9IDA7Ci0JVVNIT1JUCQlvZmZzZXQ7Ci0JVUNIQVIJCUlWRUlWID0gMDsKLQlVU0hPUlQJCVdjaWQgPSAwOworCXUzMiBXQ0lEQXR0cmkgPSAwOworCXUxNiBvZmZzZXQ7CisJdTggSVZFSVYgPSAwOworCXUxNiBXY2lkID0gMDsKIAogCXsKIAkJewotCQkJaWYgKEJzc0lkeCA+IEJTUzApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogVGhlIEJTUy1pbmRleCglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBJbmZyYSBsaW5rLiBcbiIsIEJzc0lkeCkpOworCQkJaWYgKEJzc0lkeCA+IEJTUzApIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeTogVGhlIEJTUy1pbmRleCglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBJbmZyYSBsaW5rLiBcbiIsCisJCQkJCSAgQnNzSWR4KSk7CiAJCQkJcmV0dXJuOwogCQkJfQotCi0JCQkvLyAxLglJbiBBREhPQyBtb2RlLCB0aGUgQUlEIGlzIHdjaWQgbnVtYmVyLiBBbmQgTk8gbWVzaCBsaW5rIGV4aXN0cy4KLQkJCS8vIDIuCUluIEluZnJhIG1vZGUsIHRoZSBBSUQ6MSBNVVNUIGJlIHdjaWQgb2YgaW5mcmEgU1RBLgotCQkJLy8JCQkJCSAgIHRoZSBBSUQ6Mn4gYXNzaWduIHRvIG1lc2ggbGluayBlbnRyeS4KLQkJCWlmIChwRW50cnkgJiYgQURIT0NfT04ocEFkKSkKKwkJCS8qIDEuICAgSW4gQURIT0MgbW9kZSwgdGhlIEFJRCBpcyB3Y2lkIG51bWJlci4gQW5kIE5PIG1lc2ggbGluayBleGlzdHMuICovCisJCQkvKiAyLiAgIEluIEluZnJhIG1vZGUsIHRoZSBBSUQ6MSBNVVNUIGJlIHdjaWQgb2YgaW5mcmEgU1RBLiAqLworCQkJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBBSUQ6Mn4gYXNzaWduIHRvIG1lc2ggbGluayBlbnRyeS4gKi8KKwkJCWlmIChwRW50cnkpCiAJCQkJV2NpZCA9IHBFbnRyeS0+QWlkOwotCQkJZWxzZSBpZiAocEVudHJ5ICYmIElORlJBX09OKHBBZCkpCi0JCQl7Ci0JCQkJV2NpZCA9IEJTU0lEX1dDSUQ7Ci0JCQl9CiAJCQllbHNlCiAJCQkJV2NpZCA9IE1DQVNUX1dDSUQ7CiAJCX0KIAl9CiAKLQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUKKwkvKiBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgKi8KIAlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXY2lkICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKIAogCXsKIAkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNNZXNoKQotCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOworCQkJV0NJREF0dHJpID0gKENpcGhlckFsZyA8PCAxKSB8IFBBSVJXSVNFS0VZVEFCTEU7CiAJCWVsc2UKLQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgU0hBUkVES0VZVEFCTEU7CisJCQlXQ0lEQXR0cmkgPSAoQ2lwaGVyQWxnIDw8IDEpIHwgU0hBUkVES0VZVEFCTEU7CiAJfQogCiAJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOwogCi0KLQkvLyBVcGRhdGUgSVYvRUlWIHRhYmxlCisJLyogVXBkYXRlIElWL0VJViB0YWJsZSAqLwogCW9mZnNldCA9IE1BQ19JVkVJVl9UQUJMRV9CQVNFICsgKFdjaWQgKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKIAotCS8vIFdQQSBtb2RlCi0JaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fCAoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQotCXsKLQkJLy8gRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleQotCQlJVkVJViA9IChLZXlJZHggPDw2KSB8IDB4MjA7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCisJLyogV1BBIG1vZGUgKi8KKwlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCisJICAgIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpIHsKKwkJLyogRWl2IGJpdCBvbi4ga2V5aWQgYWx3YXlzIGlzIDAgZm9yIHBhaXJ3aXNlIGtleSAqLworCQlJVkVJViA9IChLZXlJZHggPDwgNikgfCAweDIwOworCX0gZWxzZSB7CisJCS8qIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuICovCiAJCUlWRUlWID0gKEtleUlkeCA8PCA2KTsKIAl9CiAKLQkvLyBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuCi0jaWZkZWYgUlQyODYwCi0JUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQrMywgSVZFSVYpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUocEFkLCBvZmZzZXQrMywgJklWRUlWKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwkvKiBGb3Iga2V5IGluZGV4IGFuZCBleHQgSVYgYml0LCBzbyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbihvZmZzZXQrMykuICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVkVJVik7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUocEFkLCBvZmZzZXQgKyAzLCAmSVZFSVYpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5OiBXQ0lEICMlZCwgS2V5SW5kZXggIyVkLCBBbGc9JXNcbiIsV2NpZCwgS2V5SWR4LCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglXQ0lEQXR0cmkgPSAweCV4IFxuIiwgIFdDSURBdHRyaSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5OiBXQ0lEICMlZCwgS2V5SW5kZXggIyVkLCBBbGc9JXNcbiIsCisJCSAgV2NpZCwgS2V5SWR4LCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJV0NJREF0dHJpID0gMHgleCBcbiIsIFdDSURBdHRyaSkpOwogCiB9CiAKQEAgLTE3MjMsMTUyNCArODcyLDg0IEBACiAgICAgTm90ZToKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUNIQVIgKkdldEVuY3J5cHRUeXBlKENIQVIgZW5jKQorY2hhciAqR2V0RW5jcnlwdFR5cGUoY2hhciBlbmMpCiB7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLSAgICAgICAgcmV0dXJuICJOT05FIjsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCi0gICAgCXJldHVybiAiV0VQIjsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAJcmV0dXJuICJUS0lQIjsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLSAgICAJcmV0dXJuICJBRVMiOwotCWlmKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkKQotICAgIAlyZXR1cm4gIlRLSVBBRVMiOwotICAgIGVsc2UKLSAgICAJcmV0dXJuICJVTktOT1ciOwotfQotCi1DSEFSICpHZXRBdXRoTW9kZShDSEFSIGF1dGgpCi17Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotICAgIAlyZXR1cm4gIk9QRU4iOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotICAgIAlyZXR1cm4gIlNIQVJFRCI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQotICAgIAlyZXR1cm4gIkFVVE9XRVAiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgIAlyZXR1cm4gIldQQSI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spCi0gICAgCXJldHVybiAiV1BBUFNLIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0gICAgCXJldHVybiAiV1BBTk9ORSI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotICAgIAlyZXR1cm4gIldQQTIiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLSAgICAJcmV0dXJuICJXUEEyUFNLIjsKLQlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKQotICAgIAlyZXR1cm4gIldQQTFXUEEyIjsKLQlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKQotICAgIAlyZXR1cm4gIldQQTFQU0tXUEEyUFNLIjsKLQotICAgIAlyZXR1cm4gIlVOS05PVyI7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IHNpdGUgc3VydmV5IHJlc3VsdHMKLQlBcmd1bWVudHM6Ci0JICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgCQkxLikgVUkgbmVlZHMgdG8gd2FpdCA0IHNlY29uZHMgYWZ0ZXIgaXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kCi0gICAgICAgIAkJMi4pIGl3cHJpdiByYTAgZ2V0X3NpdGVfc3VydmV5Ci0gICAgICAgIAkJMy4pIFVJIG5lZWRzIHRvIHByZXBhcmUgYXQgbGVhc3QgNDA5NmJ5dGVzIHRvIGdldCB0aGUgcmVzdWx0cwotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2RlZmluZQlMSU5FX0xFTgkoNCszMysyMCs4KzEwKzkrNyszKQkvLyBDaGFubmVsK1NTSUQrQnNzaWQrV2VwU3RhdHVzK0F1dGhNb2RlK1NpZ25hbCtXaXJlc3NNb2RlK05ldHdvcmtUeXBlCi1WT0lEIFJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSkKLXsKLQlDSEFSCQkqbXNnOwotCUlOVCAJCWk9MDsKLQlJTlQJCQlXYWl0Q250OwotCUlOVCAJCVN0YXR1cz0wOwotCUNIQVIJCVNzaWRbTUFYX0xFTl9PRl9TU0lEICsxXTsKLSAgICBJTlQgICAgICAgICBSc3NpID0gMCwgbWF4X2xlbiA9IExJTkVfTEVOOwotCVVJTlQgICAgICAgIFJzc2lfUXVhbGl0eSA9IDA7Ci0JTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIHdpcmVsZXNzX21vZGU7Ci0KLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtc2csIHNpemVvZihDSEFSKSooKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuKSk7Ci0KLQlpZiAobXNnID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QSW9jdGxHZXRTaXRlU3VydmV5IC0gbXNnIG1lbW9yeSBhbGxvYyBmYWlsLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JbWVtc2V0KG1zZywgMCAsKE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSptYXhfbGVuICk7Ci0JbWVtc2V0KFNzaWQsIDAgLChNQVhfTEVOX09GX1NTSUQgKzEpKTsKLQlzcHJpbnRmKG1zZywiJXMiLCJcbiIpOwotCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRzJS0zM3MlLTIwcyUtOHMlLTEwcyUtOXMlLTdzJS0zc1xuIiwKLQkgICAgIkNoIiwgIlNTSUQiLCAiQlNTSUQiLCAiRW5jIiwgIkF1dGgiLCAiU2lnYW5sKCUpIiwgIlctTW9kZSIsICIgTlQiKTsKLQotCVdhaXRDbnQgPSAwOwotCXBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7Ci0KLQl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKLQkJT1NfV0FJVCg1MDApOwotCi0JZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQotCXsKLQkJaWYoIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNoYW5uZWw9PTApCi0JCQlicmVhazsKLQotCQlpZigoc3RybGVuKG1zZykrbWF4X2xlbiApID49IElXX1NDQU5fTUFYX0RBVEEpCi0JCQlicmVhazsKLQotCQkvL0NoYW5uZWwKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DaGFubmVsKTsKLQkJLy9TU0lECi0JCW1lbWNweShTc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuKTsKLQkJU3NpZFtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuXSA9ICdcMCc7Ci0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTMzcyIsIFNzaWQpOwotCQkvL0JTU0lECi0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgICIsCi0JCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFswXSwKLQkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzFdLAotCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbMl0sCi0JCQlwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZFszXSwKLQkJCXBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkWzRdLAotCQkJcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWRbNV0pOwotCQkvL0VuY3J5cHRpb24gVHlwZQotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS04cyIsR2V0RW5jcnlwdFR5cGUocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzKSk7Ci0JCS8vQXV0aGVudGljYXRpb24gTW9kZQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBzIiwgIlVOS05PVyIpOwotCQllbHNlCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMHMiLEdldEF1dGhNb2RlKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkF1dGhNb2RlKSk7Ci0JCS8vIFJzc2kKLQkJUnNzaSA9IChJTlQpcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaTsKLQkJaWYgKFJzc2kgPj0gLTUwKQotCQkJUnNzaV9RdWFsaXR5ID0gMTAwOwotCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KLQkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7Ci0JCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCi0JCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKLQkJZWxzZSAgICAvLyA8IC04NCBkYm0KLQkJCVJzc2lfUXVhbGl0eSA9IDA7Ci0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKLQkJLy8gV2lyZWxlc3MgTW9kZQotCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eSgmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0pOwotCQlpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExRkggfHwKLQkJCXdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMURTKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiIik7Ci0JCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01KQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhIik7Ci0JCWVsc2UgaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMU9GRE01X04pCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWEvbiIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjQpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZyIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNMjRfTikKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYi9nL24iKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAidW5rbm93Iik7Ci0JCS8vTmV0d29yayBUeXBlCi0JCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTNzIiwgIiBBZCIpOwotCQllbHNlCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgSW4iKTsKLQotICAgICAgICBzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiXG4iKTsKLQl9Ci0KLQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKLQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKLQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Ci19Ci0KLQotI2RlZmluZQlNQUNfTElORV9MRU4JKDE0KzQrNCsxMCsxMCsxMCs2KzYpCS8vIEFkZHIrYWlkK3BzbStkYXRhdGltZStyeGJ5dGUrdHhieXRlK2N1cnJlbnQgdHggcmF0ZStsYXN0IHR4IHJhdGUKLVZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JSU5UIGk7Ci0JUlRfODAyXzExX01BQ19UQUJMRSBNYWNUYWI7Ci0JY2hhciAqbXNnOwotCi0JTWFjVGFiLk51bSA9IDA7Ci0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3N0ID09IFNTVF9BU1NPQykpCi0JCXsKLQkJCUNPUFlfTUFDX0FERFIoTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFkZHIsICZwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkFpZCA9IChVQ0hBUilwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFpZDsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Qc20gPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlBzTW9kZTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5NaW1vUHMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLk1tcHNNb2RlOwotCi0JCQkvLyBGaWxsIGluIFJTU0kgcGVyIGVudHJ5Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTAgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTA7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTEgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTE7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQXZnUnNzaTIgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlJzc2lTYW1wbGUuQXZnUnNzaTI7Ci0KLQkJCS8vIHRoZSBjb25uZWN0ZWQgdGltZSBwZXIgZW50cnkKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5Db25uZWN0ZWRUaW1lID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5TdGFDb25uZWN0VGltZTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTUNTID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5CVyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLkJXOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5TaG9ydEdJID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU1RCQyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLnJzdiA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLnJzdjsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuTU9ERSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS53b3JkOwotCi0JCQlNYWNUYWIuTnVtICs9IDE7Ci0JCX0KLQl9Ci0Jd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9NQUNfVEFCTEUpOwotCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1hY1RhYiwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsXG4iLCBfX2Z1bmNfXykpOwotCX0KLQotCW1zZyA9IChDSEFSICopIGttYWxsb2Moc2l6ZW9mKENIQVIpKihNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pLCBNRU1fQUxMT0NfRkxBRyk7Ci0JbWVtc2V0KG1zZywgMCAsTUFYX0xFTl9PRl9NQUNfVEFCTEUqTUFDX0xJTkVfTEVOICk7Ci0Jc3ByaW50Zihtc2csIiVzIiwiXG4iKTsKLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xNHMlLTRzJS00cyUtMTBzJS0xMHMlLTEwcyUtNnMlLTZzXG4iLAotCQkiTUFDIiwgIkFJRCIsICJQU00iLCAiTERUIiwgIlJ4QiIsICJUeEIiLCJDVHhSIiwgIkxUeFIiKTsKLQotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCQlpZiAocEVudHJ5LT5WYWxpZEFzQ0xJICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlpZigoc3RybGVuKG1zZykrTUFDX0xJTkVfTEVOICkgPj0gKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTikgKQotCQkJCWJyZWFrOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAgIiwKLQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAotCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNGQiLCAoaW50KXBFbnRyeS0+QWlkKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLkxhc3REYXRhUGFja2V0VGltZSovKTsgLy8gVG9EbwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFJ4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0xMGQiLDAvKnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFNDb3VudGVyLlRvdGFsVHhCeXRlQ291bnQqLyk7IC8vIFRvRG8KLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTZkIixSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5DdXJyVHhSYXRlXSk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZFxuIiwwLypSYXRlSWRUb01icHNbcEFkLT5NYWNUYWIuQ29udGVudFtpXS5MYXN0VHhSYXRlXSovKTsgLy8gVG9EbwotCQl9Ci0JfQotCS8vIGZvciBjb21wYXRpYmxlIHdpdGggb2xkIEFQSSBqdXN0IGRvIHRoZSBwcmludGsgdG8gY29uc29sZQotCS8vd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JLy9pZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIiwgbXNnKSk7Ci0JfQotCi0Ja2ZyZWUobXNnKTsKLX0KLQotSU5UCVNldF9CQVNldHVwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgdGlkOwotCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0vKgotCVRoZSBCQVNldHVwIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCi0JCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAotCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCi0qLwotCi0JaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gMTUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeFxuIiwgbWFjWzBdLCBtYWNbMV0sCi0JCQkJbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOwotCi0JICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKLQotICAgIAlpZiAocEVudHJ5KSB7Ci0gICAgICAgIAlwcmludGsoIlxuU2V0dXAgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7Ci0JICAgICAgICBCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgdGlkLCAwLCAxMDAsIFRSVUUpOwotICAgIAl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLUlOVAlTZXRfQkFEZWNsaW5lX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIGJCQURlY2xpbmU7Ci0KLQliQkFEZWNsaW5lID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChiQkFEZWNsaW5lID09IDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKGJCQURlY2xpbmUgPT0gMSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOwotCX0KKwlpZiAoZW5jID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKKwkJcmV0dXJuICJOT05FIjsKKwlpZiAoZW5jID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQlyZXR1cm4gIldFUCI7CisJaWYgKGVuYyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQlyZXR1cm4gIlRLSVAiOworCWlmIChlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcmV0dXJuICJBRVMiOworCWlmIChlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCkKKwkJcmV0dXJuICJUS0lQQUVTIjsKIAllbHNlCi0JewotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CQURlY2xpbmVfUHJvYzo6KEJBRGVjbGluZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUpKTsKLQotCXJldHVybiBUUlVFOworCQlyZXR1cm4gIlVOS05PVyI7CiB9CiAKLUlOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKK2NoYXIgKkdldEF1dGhNb2RlKGNoYXIgYXV0aCkKIHsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQljaGFyICp0b2tlbiwgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQlyZXR1cm4gIk9QRU4iOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKKwkJcmV0dXJuICJTSEFSRUQiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpCisJCXJldHVybiAiQVVUT1dFUCI7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQlyZXR1cm4gIldQQSI7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCQlyZXR1cm4gIldQQVBTSyI7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKKwkJcmV0dXJuICJXUEFOT05FIjsKKwlpZiAoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQlyZXR1cm4gIldQQTIiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJCXJldHVybiAiV1BBMlBTSyI7CisJaWYgKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpCisJCXJldHVybiAiV1BBMVdQQTIiOworCWlmIChhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKQorCQlyZXR1cm4gIldQQTFQU0tXUEEyUFNLIjsKIAotLyoKLQlUaGUgQkFPcmlUZWFyRG93biBpbnVwdCBzdHJpbmcgZm9ybWF0IHNob3VsZCBiZSB4eDp4eDp4eDp4eDp4eDp4eC1kLAotCQk9PlRoZSBzaXggMiBkaWdpdCBoZXgtZGVjaW1hbCBudW1iZXIgcHJldmlvdXMgYXJlIHRoZSBNYWMgYWRkcmVzcywKLQkJPT5UaGUgc2V2ZW50aCBkZWNpbWFsIG51bWJlciBpcyB0aGUgdGlkIHZhbHVlLgotKi8KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCB0aWQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCXRpZCA9IHNpbXBsZV9zdHJ0b2woKHRva2VuKzEpLCAwLCAxMCk7Ci0JCWlmICh0aWQgPiBOVU1fT0ZfVElEKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sIChQVUNIQVIpKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkgICAgcHJpbnRrKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLCBtYWNbMF0sIG1hY1sxXSwKLQkgICAgICAgICAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKTsKLQotCSAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIG1hYyk7Ci0KLQkgICAgaWYgKHBFbnRyeSkgewotCSAgICAgICAgcHJpbnRrKCJcblRlYXIgZG93biBPcmkgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCk7Ci0gICAgICAgIEJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UsIFRSVUUpOwotCSAgICB9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCisJcmV0dXJuICJVTktOT1ciOwogfQogCi1JTlQJU2V0X0JBUmVjVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCitpbnQgU2V0Q29tbW9uSFQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotICAgIFVDSEFSIG1hY1s2XSwgdGlkOwotCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0gICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7Ci0vKgotCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCi0JCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAotCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCi0qLwotICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKFBVQ0hBUikoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlwcmludGsoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsIG1hY1swXSwgbWFjWzFdLAotCQkgICAgICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCB0aWQpOwotCi0JCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKLQotCQlpZiAocEVudHJ5KSB7Ci0JCSAgICBwcmludGsoIlxuVGVhciBkb3duIFJlYyBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKTsKLQkJICAgIEJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UpOwotCQl9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLUlOVAlTZXRfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBIdEJ3OwotCi0JSHRCdyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKEh0QncgPT0gQldfNDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKLQllbHNlIGlmIChIdEJ3ID09IEJXXzIwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCd19Qcm9jOjooSHRCdz0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgSHRNY3MsIE1jc190bXA7Ci0gICAgQk9PTEVBTiBiQXV0b1JhdGUgPSBGQUxTRTsKLQotCU1jc190bXAgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKE1jc190bXAgPD0gMTUgfHwgTWNzX3RtcCA9PSAzMikKLQkJSHRNY3MgPSBNY3NfdG1wOwotCWVsc2UKLQkJSHRNY3MgPSBNQ1NfQVVUTzsKLQotCXsKLQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBIdE1jczsKLQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoSHRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRTpGQUxTRTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihIdE1jcz0lZCwgYkF1dG9UeFJhdGVTd2l0Y2ggPSAlZClcbiIsCi0JCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUywgcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpKTsKLQotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKSB8fAotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPCBNT0RFX0hUTUlYKSkKLQkJewotCSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKLQkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSAzKSAmJgotCSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spKQotCQkJewotCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jc10gKiAxMDAwMDAwKSk7Ci0JCQl9Ci0JICAgICAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCi0JCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDcpICYmCi0JICAgICAgICAgICAgCShwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9PRkRNKSkKLQkJCXsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgKExPTkcpIChSYXRlSWRUb01icHNbSHRNY3MrNF0gKiAxMDAwMDAwKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYkF1dG9SYXRlID0gVFJVRTsKLQotCQkJaWYgKGJBdXRvUmF0ZSkKLQkJCXsKLQkgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAtMSk7Ci0JCQl9Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNY3NfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIixwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlKSk7Ci0JCX0KLSAgICAgICAgaWYgKEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLQl9Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRHaV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBIdEdpOwotCi0JSHRHaSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoIEh0R2kgPT0gR0lfNDAwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKLQllbHNlIGlmICggSHRHaSA9PSBHSV84MDAgKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0R2lfUHJvYzo6KFNob3J0R0k9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUNIQVIgU2l6ZTsKLQotCVNpemUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFNpemUgPD0wIHx8IFNpemUgPj02NCkKLQl7Ci0JCVNpemUgPSA4OwotCX0KLQlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IFNpemUtMTsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfSHRUeEJBU2l6ZSA6OihUeEJBU2l6ZT0gJWQpXG4iLCBTaXplKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJU2V0X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gSFRNT0RFX0dGKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKLQllbHNlIGlmICggVmFsdWUgPT0gSFRNT0RFX01NICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfTU07Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE9wTW9kZV9Qcm9jOjooSHRPcE1vZGU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpKTsKLQotCXJldHVybiBUUlVFOwotCi19Ci0KLUlOVAlTZXRfSHRTdGJjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCi0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09IFNUQkNfTk9ORSApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU3RiY19Qcm9jOjooSHRTdGJjPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRIdGNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0KLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLSAgICAgICAgCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRIdGNfUHJvYzo6KEh0SHRjPSVkKVxuIixwQWQtPkhUQ0VuYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0KLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLSAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RXh0Y2hhX1Byb2M6OihIdEV4dGNoYT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA8PTcgJiYgVmFsdWUgPj0gMCkKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gVmFsdWU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSA0OwotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1wZHVEZW5zaXR5X1Byb2M6OihIdE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0KLQlpZiAoVmFsdWUgPj0xICYmIFZhbHVlIDw9IDY0KQotCXsKLQkJcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IFZhbHVlOwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7Ci0JfQotCWVsc2UKLQl7Ci0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OwotCX0KLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCYVdpblNpemVfUHJvYzo6KEh0QmFXaW5TaXplPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0JewotCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgIAlwQWQtPkNvbW1vbkNmZy5iUmRnID0gVFJVRTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFJkZ19Qcm9jOjooSHRSZGc9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJSZGcpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRMaW5rQWRhcHRfUHJvYzo6KEh0TGlua0FkYXB0PSVkKVxuIixwQWQtPmJMaW5rQWRhcHQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IEZBTFNFOwotCWVsc2UgaWYgKCBWYWx1ZSA9PSAxICkKLSAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0QW1zZHVfUHJvYzo6KEh0QW1zZHU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7Ci0JfQotICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLSAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKLSAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeTsKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBdXRvQmFfUHJvYzo6KEh0QXV0b0JhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1JTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOwotICAgIGVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdFByb3RlY3RfUHJvYzo6KEh0UHJvdGVjdD0lZClcbiIscEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfU2VuZFBTTVBBY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0gICAgVUNIQVIgbWFjWzZdLCBtb2RlOwotCWNoYXIgKnRva2VuLCBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0gICAgLy9wcmludGsoIlxuJXNcbiIsIGFyZyk7Ci0vKgotCVRoZSBCQVJlY1RlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCi0JCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAotCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSBtb2RlIHZhbHVlLgotKi8KLSAgICBpZihzdHJsZW4oYXJnKSA8IDE5KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcgcGx1cyB0aGUgIi0iIGFuZCBtb2RlIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLSAgIAl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQltb2RlID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQkJaWYgKG1vZGUgPiBNTVBTX0VOQUJMRSkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoUFVDSEFSKSgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCXByaW50aygiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwgbWFjWzBdLCBtYWNbMV0sCi0JCSAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIG1vZGUpOwotCi0JCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgbWFjKTsKLQotCQlpZiAocEVudHJ5KSB7Ci0JCSAgICBwcmludGsoIlxuU2VuZFBTTVBBY3Rpb24gTUlQUyBtb2RlID0gJWRcbiIsIG1vZGUpOwotCQkgICAgU2VuZFBTTVBBY3Rpb24ocEFkLCBwRW50cnktPkFpZCwgbW9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci0KLQotfQotCi1JTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA8PTMgJiYgVmFsdWUgPj0gMCkKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSAzOwotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1JTU9QU21vZGVfUHJvYzo6KE1JTU9QUyBtb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJID0gRkFMU0U7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZVNob3J0R0lfUHJvYzo6KEZvcmNlU2hvcnRHST0lZClcbiIsIHBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLQotSU5UCVNldF9Gb3JjZUdGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gRkFMU0U7Ci0JZWxzZSBpZiAoVmFsdWUgPT0gMSkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9Gb3JjZUdGX1Byb2M6OihGb3JjZUdGPSVkKVxuIiwgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRNaW1vUHNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmIChWYWx1ZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNaW1vUHNfUHJvYzo6KEh0TWltb1BzPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldENvbW1vbkhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCU9JRF9TRVRfSFRfUEhZTU9ERQkJU2V0SFQ7CisJc3RydWN0IHJ0X29pZF9zZXRfaHRfcGh5bW9kZSBTZXRIVDsKIAogCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkKIAkJcmV0dXJuIEZBTFNFOwogCiAJU2V0SFQuUGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JU2V0SFQuVHJhbnNtaXRObyA9ICgoVUNIQVIpcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCk7Ci0JU2V0SFQuSHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7Ci0JU2V0SFQuRXh0T2Zmc2V0ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7CisJU2V0SFQuVHJhbnNtaXRObyA9ICgodTgpcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCk7CisJU2V0SFQuSHRNb2RlID0gKHU4KXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7CisJU2V0SFQuRXh0T2Zmc2V0ID0KKwkgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7CiAJU2V0SFQuTUNTID0gTUNTX0FVVE87Ci0JU2V0SFQuQlcgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOwotCVNldEhULlNUQkMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7Ci0JU2V0SFQuU0hPUlRHSSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKKwlTZXRIVC5CVyA9ICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlc7CisJU2V0SFQuU1RCQyA9ICh1OClwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQzsKKwlTZXRIVC5TSE9SVEdJID0gKHU4KXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOwogCiAJUlRNUFNldEhUKHBBZCwgJlNldEhUKTsKIAogCXJldHVybiBUUlVFOwogfQogCi1JTlQJU2V0X0ZpeGVkVHhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQorY2hhciAqUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cih1MTYgZW5jcnlNb2RlKQogewotCVVDSEFSCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOwotCi0JaWYgKHN0cmNtcChhcmcsICJPRkRNIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAib2ZkbSIpID09IDApCi0JewotCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9PRkRNOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJnLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiY2NrIikgPT0gMCkKLQl7Ci0gICAgICAgIGZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX0NDSzsKLQl9Ci0KLQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRml4ZWRUeE1vZGVfUHJvYzo6KEZpeGVkVHhNb2RlPSVkKVxuIiwgZml4X3R4X21vZGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1QQ0hBUiAgIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cigKLSAgICBJTiAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRoTW9kZSkKLXsKLQlzd2l0Y2goYXV0aE1vZGUpCi0JewotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW46Ci0JCQlyZXR1cm4gIk9QRU4iOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKLQkJCXJldHVybiAiV1BBUFNLIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ6Ci0JCQlyZXR1cm4gIlNIQVJFRCI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgotCQkJcmV0dXJuICJXUEEiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6Ci0JCQlyZXR1cm4gIldQQTIiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6Ci0JCQlyZXR1cm4gIldQQTJQU0siOwotICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotCQkJcmV0dXJuICJXUEFQU0tXUEEyUFNLIjsKLSAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLQkJCXJldHVybiAiV1BBMVdQQTIiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU6Ci0JCQlyZXR1cm4gIldQQU5PTkUiOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJVTktOT1ciOworCXN3aXRjaCAoZW5jcnlNb2RlKSB7CisJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCXJldHVybiAiTk9ORSI7CisJY2FzZSBOZGlzODAyXzExV0VQRW5hYmxlZDoKKwkJcmV0dXJuICJXRVAiOworCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKKwkJcmV0dXJuICJUS0lQIjsKKwljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6CisJCXJldHVybiAiQUVTIjsKKwljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCXJldHVybiAiVEtJUEFFUyI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1ciOwogCX0KIH0KLQotUENIQVIgICBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAotICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKQotewotCXN3aXRjaChlbmNyeU1vZGUpCi0JewotI2lmIGRlZmluZWQoUlQyODYwKSB8fCBkZWZpbmVkKFJUMzB4eCkKLQkgICAgZGVmYXVsdDoKLSNlbmRpZgotCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKLQkJCXJldHVybiAiTk9ORSI7Ci0JCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6Ci0JCQlyZXR1cm4gIldFUCI7Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLQkJCXJldHVybiAiVEtJUCI7Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCXJldHVybiAiQUVTIjsKLSAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgotCQkJcmV0dXJuICJUS0lQQUVTIjsKLSNpZiAhZGVmaW5lZChSVDI4NjApICYmICFkZWZpbmVkKFJUMzB4eCkKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiVU5LTk9XIjsKLSNlbmRpZgotCX0KLX0KLQotSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcE5hbWUsCi0JSU4JUFVDSEFSCQkJcEJ1ZikKLXsKLQlJTlQJU3RhdHVzID0gMDsKLQotCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQotCXsKLQkJaWYgKCFzdHJjbXAocE5hbWUsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpKQotCQl7Ci0JCQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5zaG93X3Byb2MocEFkLCBwQnVmKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7ICAvL0V4aXQgZm9yIGxvb3AuCi0JCX0KLQl9Ci0KLQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lID09IE5VTEwpCi0JewotCQlzcHJpbnRmKHBCdWYsICJcbiIpOwotCQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKLQkJCXNwcmludGYocEJ1ZiArIHN0cmxlbihwQnVmKSwgIiVzXG4iLCBQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lKTsKLQl9Ci0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi1JTlQJU2hvd19TU0lEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKLQl7Ci0JCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUE6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFHOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExTl8yXzRHOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExTl81RzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1JTlQJU2hvd19UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpCi0JewotCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0U2hvcnQiKTsKLQkJCWJyZWFrOwotCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgotCQkJc3ByaW50ZihwQnVmLCAiXHRMb25nIik7Ci0JCQlicmVhazsKLQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlQXV0bzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSk7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19CR1Byb3RlY3Rpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKQotCXsKLQkJY2FzZSAxOiAvL0Fsd2F5cyBPbgotCQkJc3ByaW50ZihwQnVmLCAiXHRPTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjogLy9BbHdheXMgT0ZGCi0JCQlzcHJpbnRmKHBCdWYsICJcdE9GRiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDogLy9BVVRPCi0JCQlzcHJpbnRmKHBCdWYsICJcdEF1dG8iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWx1KSIsIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbik7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JewotCQlzcHJpbnRmKHBCdWYsICJcdDQwIE1IeiIpOwotCX0KLQllbHNlCi0JewotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdDIwIE1IeiIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEdpX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKQotCXsKLQkJY2FzZSBHSV80MDA6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdJXzQwMCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0lfODAwOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHSV84MDAiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKQotCXsKLQkJY2FzZSBIVE1PREVfR0Y6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdGIik7Ci0JCQlicmVhazsKLQkJY2FzZSBIVE1PREVfTU06Ci0JCQlzcHJpbnRmKHBCdWYsICJcdE1NIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBKQotCXsKLQkJY2FzZSBFWFRDSEFfQkVMT1c6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEJlbG93Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBFWFRDSEFfQUJPVkU6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEFib3ZlIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCV1KSIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLUlOVAlTaG93X0h0TXBkdURlbnNpdHlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPyAiVFJVRSI6IkZBTFNFIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPyAiVFJVRSI6IkZBTFNFIik7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCi0jaWZkZWYgV01NX1NVUFBPUlQKLUlOVAlTaG93X1dtbUNhcGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPyAiVFJVRSI6IkZBTFNFIik7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyBXTU1fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19OZXR3b3JrVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPlN0YUNmZy5Cc3NUeXBlKQotCXsKLQkJY2FzZSBCU1NfQURIT0M6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEFkaG9jIik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfSU5GUkE6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEluZnJhIik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfQU5ZOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBbnkiKTsKLQkJCWJyZWFrOwotCQljYXNlIEJTU19NT05JVE9SOgotCQkJc3ByaW50ZihwQnVmLCAiXHRNb25pdG9yIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCi0JQXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQotCWlmICgoQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikgJiYKLQkJKEF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKLQkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cihBdXRoTW9kZSkpOwotCWVsc2UKLQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgQXV0aE1vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0VuY3J5cFR5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCVdlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQotCWlmICgoV2VwU3RhdHVzID49IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgotCQkoV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCkpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKFdlcFN0YXR1cykpOwotCWVsc2UKLQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgV2VwU3RhdHVzKTsKLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlVQ0hBUiBEZWZhdWx0S2V5SWQgPSAwOwotCi0JRGVmYXVsdEtleUlkID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCi0Jc3ByaW50ZihwQnVmLCAiXHQlZCIsIERlZmF1bHRLZXlJZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfV2VwS2V5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIElOVAkJCQlLZXlJZHgsCi0JT1VUCVBVQ0hBUgkJCXBCdWYpCi17Ci0JVUNIQVIgICBLZXlbMTZdID0gezB9LCBLZXlMZW5ndGggPSAwOwotCUlOVAkJaW5kZXggPSBCU1MwOwotCi0JS2V5TGVuZ3RoID0gcEFkLT5TaGFyZWRLZXlbaW5kZXhdW0tleUlkeF0uS2V5TGVuOwotCU5kaXNNb3ZlTWVtb3J5KEtleSwgcEFkLT5TaGFyZWRLZXlbaW5kZXhdW0tleUlkeF0uS2V5LCBLZXlMZW5ndGgpOwotCi0JLy9jaGVjayBrZXkgc3RyaW5nIGlzIEFTQ0lJIG9yIG5vdAotICAgIGlmIChSVE1QQ2hlY2tTdHJQcmludEFibGUoS2V5LCBLZXlMZW5ndGgpKQotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdCVzIiwgS2V5KTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBpbnQgaWR4OwotICAgICAgICBzcHJpbnRmKHBCdWYsICJcdCIpOwotICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IEtleUxlbmd0aDsgaWR4KyspCi0gICAgICAgICAgICBzcHJpbnRmKHBCdWYrc3RybGVuKHBCdWYpLCAiJTAyWCIsIEtleVtpZHhdKTsKLSAgICB9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMCwgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMSwgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMiwgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFVDSEFSCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMywgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1dQQVBTS19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQVUNIQVIJCQlwQnVmKQotewotCUlOVCAJaWR4OwotCVVDSEFSCVBNS1szMl0gPSB7MH07Ci0KLQlOZGlzTW92ZU1lbW9yeShQTUssIHBBZC0+U3RhQ2ZnLlBNSywgMzIpOwotCi0gICAgc3ByaW50ZihwQnVmLCAiXHRQTUsgPSAiKTsKLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IDMyOyBpZHgrKykKLSAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBQTUtbaWR4XSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY19wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwZWJkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9tYWNfcGNpLmMKQEAgLTAsMCArMSwxNjYxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUFsbG9jYXRlIERNQSBtZW1vcnkgYmxvY2tzIGZvciBzZW5kLCByZWNlaXZlCisKKwlBcmd1bWVudHM6CisJCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUworCQlORElTX1NUQVRVU19GQUlMVVJFCisJCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXVuc2lnbmVkIGxvbmcgUmluZ0Jhc2VQYUhpZ2g7CisJdW5zaWduZWQgbG9uZyBSaW5nQmFzZVBhTG93OworCXZvaWQgKlJpbmdCYXNlVmE7CisJaW50IGluZGV4LCBudW07CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJc3RydWN0IHJ0X3J4ZCAqIHBSeEQ7CisJdW5zaWduZWQgbG9uZyBFcnJvclZhbHVlID0gMDsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXN0cnVjdCBydF9ydG1wX2RtYWJ1ZiAqcERtYUJ1ZjsKKwl2b2lkICpwUGFja2V0OworLyogICAgICBQUlRNUF9SRU9SREVSQlVGICAgICAgICBwUmVvcmRlckJ1ZjsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeVxuIikpOworCWRvIHsKKwkJLyogKi8KKwkJLyogQWxsb2NhdGUgYWxsIHJpbmcgZGVzY3JpcHRvcnMsIGluY2x1ZGUgVHhELCBSeEQsIE1nbXRELiAqLworCQkvKiBBbHRob3VnaCBlYWNoIHNpemUgaXMgZGlmZmVyZW50LCB0byBwcmV2ZW50IGNhY2hlbGluZSBhbmQgYWxpZ25tZW50ICovCisJCS8qIGlzc3VlLCBJIGludGVudGlvbmFsIHNldCB0aGVtIGFsbCB0byA2NCBieXRlcy4gKi8KKwkJLyogKi8KKwkJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgQnVmQmFzZVBhSGlnaDsKKwkJCXVuc2lnbmVkIGxvbmcgQnVmQmFzZVBhTG93OworCQkJdm9pZCAqQnVmQmFzZVZhOworCisJCQkvKiAqLworCQkJLyogQWxsb2NhdGUgVHggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5ICg1IFRYIHJpbmdzID0gNCBBQ3MgKyAxIEhDQ0EpICovCisJCQkvKiAqLworCQkJcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplID0KKwkJCSAgICBUWF9SSU5HX1NJWkUgKiBUWERfU0laRTsKKwkJCVJUTVBfQWxsb2NhdGVUeERlc2NNZW1vcnkocEFkLCBudW0sCisJCQkJCQkgIHBBZC0+VHhEZXNjUmluZ1tudW1dLgorCQkJCQkJICBBbGxvY1NpemUsIEZBTFNFLAorCQkJCQkJICAmcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwKKwkJCQkJCSAgJnBBZC0+VHhEZXNjUmluZ1tudW1dLgorCQkJCQkJICBBbGxvY1BhKTsKKworCQkJaWYgKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEgPT0gTlVMTCkgeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jayAqLworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwKKwkJCQkgICAgICAgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplKTsKKworCQkJLyogU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbiAqLworCQkJUmluZ0Jhc2VQYUhpZ2ggPQorCQkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPlR4RGVzY1JpbmdbbnVtXS4KKwkJCQkJCQlBbGxvY1BhKTsKKwkJCVJpbmdCYXNlUGFMb3cgPQorCQkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhEZXNjUmluZ1tudW1dLgorCQkJCQkJICAgICAgIEFsbG9jUGEpOworCQkJUmluZ0Jhc2VWYSA9IHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmE7CisKKwkJCS8qICovCisJCQkvKiBBbGxvY2F0ZSBhbGwgMXN0IFRYQnVmJ3MgbWVtb3J5IGZvciB0aGlzIFR4UmluZyAqLworCQkJLyogKi8KKwkJCXBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jU2l6ZSA9CisJCQkgICAgVFhfUklOR19TSVpFICogVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCVJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKHBBZCwgbnVtLAorCQkJCQkJICAgcEFkLT5UeEJ1ZlNwYWNlW251bV0uCisJCQkJCQkgICBBbGxvY1NpemUsIEZBTFNFLAorCQkJCQkJICAgJnBBZC0+VHhCdWZTcGFjZVtudW1dLgorCQkJCQkJICAgQWxsb2NWYSwKKwkJCQkJCSAgICZwQWQtPlR4QnVmU3BhY2VbbnVtXS4KKwkJCQkJCSAgIEFsbG9jUGEpOworCisJCQlpZiAocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSA9PSBOVUxMKSB7CisJCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKKwkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7CisJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrICovCisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhLAorCQkJCSAgICAgICBwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1NpemUpOworCisJCQkvKiBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uICovCisJCQlCdWZCYXNlUGFIaWdoID0KKwkJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeEJ1ZlNwYWNlW251bV0uCisJCQkJCQkJQWxsb2NQYSk7CisJCQlCdWZCYXNlUGFMb3cgPQorCQkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhCdWZTcGFjZVtudW1dLgorCQkJCQkJICAgICAgIEFsbG9jUGEpOworCQkJQnVmQmFzZVZhID0gcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYTsKKworCQkJLyogKi8KKwkJCS8qIEluaXRpYWxpemUgVHggUmluZyBEZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlciBtZW1vcnkgKi8KKwkJCS8qICovCisJCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW251bV07CisJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBUWF9SSU5HX1NJWkU7IGluZGV4KyspIHsKKwkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJCQkvKiBJbml0IFR4IFJpbmcgU2l6ZSwgVmEsIFBhIHZhcmlhYmxlcyAqLworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOworCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwVHhSaW5nLT4KKwkJCQkJCQkgICAgQ2VsbFtpbmRleF0uQWxsb2NQYSwKKwkJCQkJCQkgICAgUmluZ0Jhc2VQYUhpZ2gpOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbaW5kZXhdLgorCQkJCQkJCSAgIEFsbG9jUGEsCisJCQkJCQkJICAgUmluZ0Jhc2VQYUxvdyk7CisKKwkJCQkvKiBTZXR1cCBUeCBCdWZmZXIgc2l6ZSAmIGFkZHJlc3MuIG9ubHkgODAyLjExIGhlYWRlciB3aWxsIHN0b3JlIGluIHRoaXMgc3BhY2UgKi8KKwkJCQlwRG1hQnVmID0gJnBUeFJpbmctPkNlbGxbaW5kZXhdLkRtYUJ1ZjsKKwkJCQlwRG1hQnVmLT5BbGxvY1NpemUgPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOworCQkJCXBEbWFCdWYtPkFsbG9jVmEgPSBCdWZCYXNlVmE7CisJCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBEbWFCdWYtPkFsbG9jUGEsCisJCQkJCQkJICAgIEJ1ZkJhc2VQYUhpZ2gpOworCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEsCisJCQkJCQkJICAgQnVmQmFzZVBhTG93KTsKKworCQkJCS8qIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhEICovCisJCQkJcFR4RCA9CisJCQkJICAgIChzdHJ1Y3QgcnRfdHhkICopIHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jVmE7CisJCQkJcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OworCQkJCS8qIGFkdmFuY2UgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQkJCXBUeEQtPkRNQURPTkUgPSAxOworCQkJCVJpbmdCYXNlUGFMb3cgKz0gVFhEX1NJWkU7CisJCQkJUmluZ0Jhc2VWYSA9ICh1OCAqKVJpbmdCYXNlVmEgKyBUWERfU0laRTsKKworCQkJCS8qIGFkdmFuY2UgdG8gbmV4dCBUeEJ1ZiBhZGRyZXNzICovCisJCQkJQnVmQmFzZVBhTG93ICs9IFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7CisJCQkJQnVmQmFzZVZhID0KKwkJCQkgICAgKHU4ICopQnVmQmFzZVZhICsgVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlR4UmluZ1slZF06IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgbnVtLAorCQkJCSAgaW5kZXgpKTsKKwkJfQorCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1JFU09VUkNFUykKKwkJCWJyZWFrOworCisJCS8qICovCisJCS8qIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyICovCisJCS8qICovCisJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogVFhEX1NJWkU7CisJCVJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeShwQWQsCisJCQkJCSAgICBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCisJCQkJCSAgICBGQUxTRSwKKwkJCQkJICAgICZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLAorCQkJCQkgICAgJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCisJCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpIHsKKwkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlicmVhazsKKwkJfQorCQkvKiBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sgKi8KKwkJTmRpc1plcm9NZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwKKwkJCSAgICAgICBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOworCisJCS8qIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24gKi8KKwkJUmluZ0Jhc2VQYUhpZ2ggPQorCQkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVBhTG93ID0KKwkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVZhID0gcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYTsKKworCQkvKiAqLworCQkvKiBJbml0aWFsaXplIE1HTVQgUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5ICovCisJCS8qICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1HTVRfUklOR19TSVpFOyBpbmRleCsrKSB7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKwkJCS8qIEluaXQgTUdNVCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMgKi8KKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NTaXplID0gVFhEX1NJWkU7CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jVmEgPSBSaW5nQmFzZVZhOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uCisJCQkJCQkgICAgQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS4KKwkJCQkJCSAgIEFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOworCisJCQkvKiBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQkJUmluZ0Jhc2VQYUxvdyArPSBUWERfU0laRTsKKwkJCVJpbmdCYXNlVmEgPSAodTggKilSaW5nQmFzZVZhICsgVFhEX1NJWkU7CisKKwkJCS8qIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhEICovCisJCQlwVHhEID0gKHN0cnVjdCBydF90eGQgKikgcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOworCQkJcFR4RC0+RE1BRE9ORSA9IDE7CisKKwkJCS8qIG5vIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHJlcXVpcmVkIGluIE1nbXRSaW5nIGZvciBzY2F0dGVyLWdhdGhlciBjYXNlICovCisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNR01UIFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKKworCQkvKiAqLworCQkvKiBBbGxvY2F0ZSBSWCByaW5nIGRlc2NyaXB0b3IncyBtZW1vcnkgZXhjZXB0IFR4IHJpbmcgd2hpY2ggYWxsb2NhdGVkIGVhcmlsZXIgKi8KKwkJLyogKi8KKwkJcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSA9IFJYX1JJTkdfU0laRSAqIFJYRF9TSVpFOworCQlSVE1QX0FsbG9jYXRlUnhEZXNjTWVtb3J5KHBBZCwKKwkJCQkJICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplLAorCQkJCQkgIEZBTFNFLAorCQkJCQkgICZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKKwkJCQkJICAmcEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCisJCWlmIChwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSA9PSBOVUxMKSB7CisJCQlFcnJvclZhbHVlID0gRVJSTE9HX09VVF9PRl9TSEFSRURfTUVNT1JZOworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlclxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJYnJlYWs7CisJCX0KKwkJLyogWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrICovCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAorCQkJICAgICAgIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpOworCisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCSAoIlJYIERFU0MgJXAgIHNpemUgPSAlbGRcbiIsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAorCQkJICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NTaXplKSk7CisKKwkJLyogU2F2ZSBQQSAmIFZBIGZvciBmdXJ0aGVyIG9wZXJhdGlvbiAqLworCQlSaW5nQmFzZVBhSGlnaCA9CisJCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOworCQlSaW5nQmFzZVBhTG93ID0KKwkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKKwkJUmluZ0Jhc2VWYSA9IHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhOworCisJCS8qICovCisJCS8qIEluaXRpYWxpemUgUnggUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5ICovCisJCS8qICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFJYX1JJTkdfU0laRTsgaW5kZXgrKykgeworCQkJLyogSW5pdCBSWCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMgKi8KKwkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFJYRF9TSVpFOworCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uCisJCQkJCQkgICAgQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOworCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uCisJCQkJCQkgICBBbGxvY1BhLCBSaW5nQmFzZVBhTG93KTsKKworCQkJLypOZGlzWmVyb01lbW9yeShSaW5nQmFzZVZhLCBSWERfU0laRSk7ICovCisKKwkJCS8qIE9mZnNldCB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCQlSaW5nQmFzZVBhTG93ICs9IFJYRF9TSVpFOworCQkJUmluZ0Jhc2VWYSA9ICh1OCAqKVJpbmdCYXNlVmEgKyBSWERfU0laRTsKKworCQkJLyogU2V0dXAgUnggYXNzb2NpYXRlZCBCdWZmZXIgc2l6ZSAmIGFsbG9jYXRlIHNoYXJlIG1lbW9yeSAqLworCQkJcERtYUJ1ZiA9ICZwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWY7CisJCQlwRG1hQnVmLT5BbGxvY1NpemUgPSBSWF9CVUZGRVJfQUdHUkVTSVpFOworCQkJcFBhY2tldCA9IFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsCisJCQkJCQkJICAgICAgcERtYUJ1Zi0+CisJCQkJCQkJICAgICAgQWxsb2NTaXplLCBGQUxTRSwKKwkJCQkJCQkgICAgICAmcERtYUJ1Zi0+QWxsb2NWYSwKKwkJCQkJCQkgICAgICAmcERtYUJ1Zi0+CisJCQkJCQkJICAgICAgQWxsb2NQYSk7CisKKwkJCS8qIGtlZXAgYWxsb2NhdGVkIHJ4IHBhY2tldCAqLworCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBwUGFja2V0OworCisJCQkvKiBFcnJvciBoYW5kbGluZyAqLworCQkJaWYgKHBEbWFCdWYtPkFsbG9jVmEgPT0gTlVMTCkgeworCQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7CisJCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIFJ4UmluZydzIDFzdCBidWZmZXJcbiIpKTsKKwkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sgKi8KKwkJCU5kaXNaZXJvTWVtb3J5KHBEbWFCdWYtPkFsbG9jVmEsIHBEbWFCdWYtPkFsbG9jU2l6ZSk7CisKKwkJCS8qIFdyaXRlIFJ4RCBidWZmZXIgYWRkcmVzcyAmIGFsbG9jYXRlZCBidWZmZXIgbGVuZ3RoICovCisJCQlwUnhEID0gKHN0cnVjdCBydF9yeGQgKikgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYTsKKwkJCXBSeEQtPlNEUDAgPQorCQkJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEpOworCQkJcFJ4RC0+RERPTkUgPSAwOworCisJCX0KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKKworCX0gd2hpbGUgKEZBTFNFKTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkZyYWdGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9mcmFnbWVudF9mcmFtZSkpOworCXBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID0KKwkgICAgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIocEFkLCBSWF9CVUZGRVJfTk9STVNJWkUpOworCisJaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID09IE5VTEwpIHsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCX0KKworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkvKiBMb2cgZXJyb3IgaW5mb3JhbXRpb24gKi8KKwkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeShwQWQtPkFkYXB0ZXJIYW5kbGUsCisJCQkJICAgICAgIE5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAorCQkJCSAgICAgICAxLCBFcnJvclZhbHVlKTsKKwl9CisJLyogRm9sbG93aW5nIGNvZGUgc2VnbWVudCBnZXQgZnJvbSBvcmlnaW5hbCBmdW5jOk5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgpLCBub3cgc2hvdWxkIGludGVncmF0ZSBpdCB0byBoZXJlLiAqLworCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCItLT4gTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlXG4iKSk7CisKKy8qCisJCS8vIERpc2FibGUgRE1BLgorCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCUdsb0NmZy53b3JkICY9IDB4ZmYwOworCQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisqLworCisJCS8qIEluaXRpYWxpemUgYWxsIHRyYW5zbWl0IHJlbGF0ZWQgc29mdHdhcmUgcXVldWVzICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKSB7CisJCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW2luZGV4XSk7CisJCQkvKiBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIgKi8KKwkJCXBBZC0+VHhSaW5nW2luZGV4XS5UeFN3RnJlZUlkeCA9IDA7CisJCQlwQWQtPlR4UmluZ1tpbmRleF0uVHhDcHVJZHggPSAwOworCQkJLypSVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCkgLCAgcEFkLT5UeFJpbmdbaV0uVFhfQ1RYX0lEWCk7ICovCisJCX0KKworCQkvKiBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlciAqLworCQlwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCA9IDA7CisJCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKKwkJLypSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SWF9DUlhfSURYMCk7ICovCisKKwkJLyogaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlciAqLworCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKKwkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7CisKKwkJcEFkLT5Qcml2YXRlSW5mby5UeFJpbmdGdWxsQ250ID0gMDsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjwtLSBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWVcbiIpKTsKKwl9CisKKwlEQkdQUklOVF9TKFN0YXR1cywKKwkJICAgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVJlc2V0IE5JQyBBc2ljcy4gQ2FsbCBhZnRlciByZXN0IERNQS4gU28gcmVzZXQgVFhfQ1RYX0lEWCB0byB6ZXJvLgorCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKwkJUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUFJpbmdDbGVhblVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUmluZ1R5cGUpCit7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJc3RydWN0IHJ0X3J4ZCAqIHBSeEQ7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnk7CisJdm9pZCAqcFBhY2tldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nICpwVHhSaW5nOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJLyp1MzIgICAgICAgICAgICAgICAgICAgICAgICBSeFN3UmVhZElkeDsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QUmluZ0NsZWFuVXAoUmluZ0lkeD0lZCwgUGVuZGluZy1ORElTPSVsZClcbiIsIFJpbmdUeXBlLAorCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOworCXN3aXRjaCAoUmluZ1R5cGUpIHsKKwljYXNlIFFJRF9BQ19CSzoKKwljYXNlIFFJRF9BQ19CRToKKwljYXNlIFFJRF9BQ19WSToKKwljYXNlIFFJRF9BQ19WTzoKKworCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1JpbmdUeXBlXTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisJCS8qIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0ICovCisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykJLyogV2UgaGF2ZSB0byBzY2FuIGFsbCBUWCByaW5nICovCisJCXsKKwkJCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7CisKKwkJCXBQYWNrZXQgPSAodm9pZCAqKXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7CisJCQkvKiByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBjaGFyICovCisJCQlpZiAocFBhY2tldCkgeworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJfQorCisJCQlwUGFja2V0ID0KKwkJCSAgICAodm9pZCAqKXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0OworCQkJLyogcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgY2hhciAqLworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisJCQl9CisJCX0KKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLAorCQkJICAgICAgICZwVHhSaW5nLT5UeERtYUlkeCk7CisJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLAorCQkJCXBUeFJpbmctPlR4Q3B1SWR4KTsKKworCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtSaW5nVHlwZV0uSGVhZCAhPSBOVUxMKSB7CisJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1JpbmdUeXBlXSk7CisJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJSZWxlYXNlIDEgTkRJUyBwYWNrZXQgZnJvbSBzL3cgYmFja2xvZyBxdWV1ZVxuIikpOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgUUlEX01HTVQ6CisJCS8qIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0ICovCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykgeworCQkJcFR4RCA9IChzdHJ1Y3QgcnRfdHhkICopIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCisJCQlwUGFja2V0ID0KKwkJCSAgICAodm9pZCAqKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldDsKKwkJCS8qIHJsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgY2hhciAqLworCQkJaWYgKHBQYWNrZXQpIHsKKwkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLAorCQkJCQkJIHBUeEQtPlNETGVuMCwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCX0KKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCXBQYWNrZXQgPQorCQkJICAgICh2b2lkICopcEFkLT5NZ210UmluZy5DZWxsW2ldLgorCQkJICAgIHBOZXh0TmRpc1BhY2tldDsKKwkJCS8qIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIGNoYXIgKi8KKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwKKwkJCQkJCSBwVHhELT5TRExlbjEsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQl9CisJCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKKworCQl9CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9NR01URFRYX0lEWCwgJnBBZC0+TWdtdFJpbmcuVHhEbWFJZHgpOworCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gcEFkLT5NZ210UmluZy5UeERtYUlkeDsKKwkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKKworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1nbXRSaW5nTG9jayk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOworCQlicmVhazsKKworCWNhc2UgUUlEX1JYOgorCQkvKiBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldCAqLworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlJ4UmluZ0xvY2spOworCisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJcFJ4RCA9IChzdHJ1Y3QgcnRfcnhkICopIHBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJCXBSeEQtPkRET05FID0gMDsKKwkJfQorCisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKKwkJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSBwQWQtPlJ4UmluZy5SeERtYUlkeDsKKwkJcEFkLT5SeFJpbmcuUnhDcHVJZHggPQorCQkgICAgKChwQWQtPlJ4UmluZy5SeERtYUlkeCA9PQorCQkgICAgICAwKSA/IChSWF9SSU5HX1NJWkUgLSAxKSA6IChwQWQtPlJ4UmluZy5SeERtYUlkeCAtIDEpKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOworCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCBpbmRleCwgbnVtLCBqOworCXN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7CisJc3RydWN0IHJ0X3R4ZCAqIHBUeEQ7CisJdm9pZCAqcFBhY2tldDsKKwl1bnNpZ25lZCBpbnQgSXJxRmxhZ3M7CisKKwkvKnN0cnVjdCBvc19jb29raWUgKnBPYmogPShzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOworCisJLyogRnJlZSBUeFN3UXVldWUgUGFja2V0ICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspIHsKKwkJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwRW50cnk7CisJCXZvaWQgKnBQYWNrZXQ7CisJCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgKnBRdWV1ZTsKKworCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CisJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtpbmRleF07CisJCXdoaWxlIChwUXVldWUtPkhlYWQpIHsKKwkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOworCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQl9CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOworCX0KKworCS8qIEZyZWUgVHggUmluZyBQYWNrZXQgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykgeworCQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW2luZGV4XTsKKworCQlmb3IgKGogPSAwOyBqIDwgVFhfUklOR19TSVpFOyBqKyspIHsKKwkJCXBUeEQgPSAoc3RydWN0IHJ0X3R4ZCAqKSAocFR4UmluZy0+Q2VsbFtqXS5BbGxvY1ZhKTsKKwkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2pdLnBOZGlzUGFja2V0OworCisJCQlpZiAocFBhY2tldCkgeworCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsCisJCQkJCQkgcFR4RC0+U0RMZW4wLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCQkJfQorCQkJLypBbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIgKi8KKwkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOworCisJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7CisKKwkJCWlmIChwUGFja2V0KSB7CisJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwKKwkJCQkJCSBwVHhELT5TRExlbjEsCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCQl9CisJCQkvKkFsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIgKi8KKwkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9CisJCQkgICAgTlVMTDsKKworCQl9CisJfQorCisJZm9yIChpbmRleCA9IFJYX1JJTkdfU0laRSAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHsKKwkJaWYgKChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuQWxsb2NWYSkKKwkJICAgICYmIChwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCkpIHsKKwkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLAorCQkJCQkgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jUGEsCisJCQkJCSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5EbWFCdWYuCisJCQkJCSBBbGxvY1NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwKKwkJCQkJICAgIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyk7CisJCX0KKwl9CisJTmRpc1plcm9NZW1vcnkocEFkLT5SeFJpbmcuQ2VsbCwgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2RtYWNiKSk7CisKKwlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEpIHsKKwkJUlRNUF9GcmVlRGVzY01lbW9yeShwQWQsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUsCisJCQkJICAgIHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhLAorCQkJCSAgICBwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7CisJfQorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlJ4RGVzY1JpbmcsIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFidWYpKTsKKworCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKSB7CisJCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCisJCQkJICAgIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCisJCQkJICAgIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOworCX0KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9kbWFidWYpKTsKKworCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKSB7CisJCWlmIChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhKSB7CisJCQlSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKHBBZCwKKwkJCQkJICAgICAgIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jU2l6ZSwKKwkJCQkJICAgICAgIEZBTFNFLAorCQkJCQkgICAgICAgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwKKwkJCQkJICAgICAgIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOworCQl9CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4QnVmU3BhY2VbbnVtXSwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2RtYWJ1ZikpOworCisJCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhKSB7CisJCQlSVE1QX0ZyZWVEZXNjTWVtb3J5KHBBZCwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLAorCQkJCQkgICAgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwKKwkJCQkJICAgIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOworCQl9CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlR4RGVzY1JpbmdbbnVtXSwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2RtYWJ1ZikpOworCX0KKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LAorCQkJCSAgICBORElTX1NUQVRVU19TVUNDRVNTKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCXJlZ2lzdGVyIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgRGlzYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlQyOFhYRE1BRGlzYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7CisJR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9IDE7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEVuYWJsZSBETUEuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorCU5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlQyOFhYRE1BRW5hYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKwlpbnQgaSA9IDA7CisKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4NCk7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCQlicmVhazsKKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gIERNQUJ1c3lcbiIpKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJaSsrOworCX0gd2hpbGUgKGkgPCAyMDApOworCisJUlRNUHVzZWNEZWxheSg1MCk7CisKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKKwlHbG9DZmcuZmllbGQuV1BETUFCdXJzdFNJWkUgPSAyOworCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT0gV1JJVEUgRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOworCit9CisKK0JPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDb21tYW5kKQoreworCXUzMiBDbWRTdGF0dXMgPSAwLCBDSUQgPSAwLCBpOworCXUzMiBUaGlzQ0lETWFzayA9IDA7CisKKwlpID0gMDsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAmQ0lEKTsKKwkJLyogRmluZCB3aGVyZSB0aGUgY29tbWFuZCBpcy4gQmVjYXVzZSB0aGlzIGlzIHJhbmRvbWx5IHNwZWNpZmllZCBieSBmaXJtd2FyZS4gKi8KKwkJaWYgKChDSUQgJiBDSUQwTUFTSykgPT0gQ29tbWFuZCkgeworCQkJVGhpc0NJRE1hc2sgPSBDSUQwTUFTSzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCgoKENJRCAmIENJRDFNQVNLKSA+PiA4KSAmIDB4ZmYpID09IENvbW1hbmQpIHsKKwkJCVRoaXNDSURNYXNrID0gQ0lEMU1BU0s7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKChDSUQgJiBDSUQyTUFTSykgPj4gMTYpICYgMHhmZikgPT0gQ29tbWFuZCkgeworCQkJVGhpc0NJRE1hc2sgPSBDSUQyTUFTSzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCgoKENJRCAmIENJRDNNQVNLKSA+PiAyNCkgJiAweGZmKSA9PSBDb21tYW5kKSB7CisJCQlUaGlzQ0lETWFzayA9IENJRDNNQVNLOworCQkJYnJlYWs7CisJCX0KKworCQlSVE1QdXNlY0RlbGF5KDEwMCk7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgMjAwKTsKKworCS8qIEdldCBDb21tYW5kU3RhdHVzIFZhbHVlICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsICZDbWRTdGF0dXMpOworCisJLyogVGhpcyBjb21tYW5kJ3Mgc3RhdHVzIGlzIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGFzIGNvbW1hbmQuIFNvIEFORCBjb21tYW5kIHBvc2l0aW9uJ3MgYml0bWFzayB0byByZWFkIHN0YXR1cy4gKi8KKwlpZiAoaSA8IDIwMCkgeworCQkvKiBJZiBTdGF0dXMgaXMgMSwgdGhlIGNvbWFtbmQgaXMgc3VjY2Vzcy4gKi8KKwkJaWYgKCgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MSkKKwkJICAgIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwKQorCQkgICAgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDAwMCkKKwkJICAgIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwMDAwMCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIi0tPiBBc2ljQ2hlY2tDb21tYW5PayBDSUQgPSAweCV4LCBDbWRTdGF0dXM9IDB4JXggXG4iLAorCQkJCSAgQ0lELCBDbWRTdGF0dXMpKTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDEgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwKKwkJCSAgQ0lELCBDbWRTdGF0dXMpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMiBUaW1lb3V0IENvbW1hbmQgPSAlZCwgQ21kU3RhdHVzPSAweCV4IFxuIiwKKwkJCSAgQ29tbWFuZCwgQ21kU3RhdHVzKSk7CisJfQorCS8qIENsZWFyIENvbW1hbmQgYW5kIFN0YXR1cy4gKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIGludCBhcGlkeCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIEZyYW1lTGVuLCB1bnNpZ25lZCBsb25nIFVwZGF0ZVBvcykKK3sKKwl1bnNpZ25lZCBsb25nIENhcEluZm9Qb3MgPSAwOworCXU4ICpwdHIsICpwdHJfdXBkYXRlLCAqcHRyX2NhcGluZm87CisJdTMyIGk7CisJQk9PTEVBTiBiQmNuUmVxID0gRkFMU0U7CisJdTggYmNuX2lkeCA9IDA7CisKKwl7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMoKSA6IE5vIHZhbGlkIEludGVyZmFjZSBiZSBmb3VuZC5cbiIsIF9fZnVuY19fKSk7CisJCXJldHVybjsKKwl9CisKKwkvKmlmICgocEFkLT5XZHNUYWIuTW9kZSA9PSBXRFNfQlJJREdFX01PREUpICovCisJLyogICAgICB8fCAoKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldiA9PSBOVUxMKSAqLworCS8qICAgICAgICAgICAgICB8fCAhKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldi0+ZmxhZ3MgJiBJRkZfVVApKSAqLworCS8qICAgICAgKSAqLworCWlmIChiQmNuUmVxID09IEZBTFNFKSB7CisJCS8qIHdoZW4gdGhlIHJhIGludGVyZmFjZSBpcyBkb3duLCBkbyBub3Qgc2VuZCBpdHMgYmVhY29uIGZyYW1lICovCisJCS8qIGNsZWFyIGFsbCB6ZXJvICovCisJCWZvciAoaSA9IDA7IGkgPCBUWFdJX1NJWkU7IGkgKz0gNCkKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwKKwkJCQkJMHgwMCk7CisJfSBlbHNlIHsKKwkJcHRyID0gKHU4ICopJiBwQWQtPkJlYWNvblR4V0k7CisJCWZvciAoaSA9IDA7IGkgPCBUWFdJX1NJWkU7IGkgKz0gNCkJLyogMTYtYnl0ZSBUWFdJIGZpZWxkICovCisJCXsKKwkJCXUzMiBsb25ncHRyID0KKwkJCSAgICAqcHRyICsgKCoocHRyICsgMSkgPDwgOCkgKyAoKihwdHIgKyAyKSA8PCAxNikgKworCQkJICAgICgqKHB0ciArIDMpIDw8IDI0KTsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwKKwkJCQkJbG9uZ3B0cik7CisJCQlwdHIgKz0gNDsKKwkJfQorCisJCS8qIFVwZGF0ZSBDYXBhYmlsaXR5SW5mbyBpbiBCZWFjb24gKi8KKwkJZm9yIChpID0gQ2FwSW5mb1BvczsgaSA8IChDYXBJbmZvUG9zICsgMik7IGkrKykgeworCQkJUlRNUF9JT19XUklURTgocEFkLAorCQkJCSAgICAgICBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArCisJCQkJICAgICAgIGksICpwdHJfY2FwaW5mbyk7CisJCQlwdHJfY2FwaW5mbysrOworCQl9CisKKwkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKSB7CisJCQlmb3IgKGkgPSBVcGRhdGVQb3M7IGkgPCAoRnJhbWVMZW4pOyBpKyspIHsKKwkJCQlSVE1QX0lPX1dSSVRFOChwQWQsCisJCQkJCSAgICAgICBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArCisJCQkJCSAgICAgICBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7CisJCQkJcHRyX3VwZGF0ZSsrOworCQkJfQorCQl9CisKKwl9CisKK30KKwordm9pZCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJGcm9tVHgpCit7CisJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKworCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJcmV0dXJuOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKworCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQorCSAgICAmJiBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkgeworCQkvKiBTdXBwb3J0IFBDSWUgQWR2YW5jZSBQb3dlciBTYXZlICovCisJCWlmIChiRnJvbVR4ID09IFRSVUUgJiYgKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID09IFRSVUUpKSB7CisJCQlwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOworCQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKKwkJCVJUTVB1c2VjRGVsYXkoMzAwMCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PT09QXNpY0ZvcmNlV2FrZXVwPT09YkZyb21UeFxuIikpOworCQl9CisKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCisJCWlmIChSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIERPVDExUE9XRVJTQVZFKSkgeworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCQkJLyogYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwICovCisJCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCQkJICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSB7CisJCQkJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworCisJCQkJaWYgKHBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkKKwkJCQkJcENoaXBPcHMtPgorCQkJCQkgICAgQXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKwkJCX0gZWxzZQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCQkJeworCQkJCS8qIGVuZCBqb2hubGkgKi8KKwkJCQkvKiBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4gKi8KKwkJCQlpZiAoSU5GUkFfT04ocEFkKQorCQkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0KKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLgorCQkJCQlDaGFubmVsV2lkdGggPT0gQldfNDApKSB7CisJCQkJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgQ2VudHJhbENoYW5uZWwsCisJCQkJCQkJICBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsCisJCQkJCQkJcEFkLT5Db21tb25DZmcuCisJCQkJCQkJQ2VudHJhbENoYW5uZWwpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCX0KKwkJCX0KKwkJfQorI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCQkvKiAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLiAqLworCQkvKiBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuICovCisJCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCQkgICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIjw9PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cDo6UmVsZWFzZSB0aGUgTUNVIExvY2soMzA5MClcbiIpKTsKKwkJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCX0gZWxzZSB7CisJCS8qIFBDSSwgMjg2MC1QQ0llICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPD09UlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwOjpPcmlnaW5hbCBQQ0kgUG93ZXIgU2F2aW5nXG4iKSk7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7CisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKwl9CisKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PT09PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cFxuIikpOworfQorCit2b2lkIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKQoreworCUJPT0xFQU4gYnJjOworCisJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkgeworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkgICAgJiYgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJdW5zaWduZWQgbG9uZyBOb3cgPSAwOworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKKwkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQkJcmV0dXJuOworCQl9CisKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKKwkJLyogSWYgbGFzdCBzZW5kIE5VTEwgZnJhbSB0aW1lIGlzIHRvbyBjbG9zZSB0byB0aGlzIHJlY2VpdmluZyBiZWFjb24gKHdpdGhpbiA4bXMpLCBkb24ndCBnbyB0byBzbGVlcCBmb3IgdGhpcyBEVE0uICovCisJCS8qIEJlY2F1c2UgU29tZSBBUCBjYW4ndCBxdWV1aW5nIG91dGdvaW5nIGZyYW1lcyBpbW1lZGlhdGVseS4gKi8KKwkJaWYgKCgocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgKyA4KSA+PSBOb3cpCisJCSAgICAmJiAocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgPD0gTm93KSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdSA6ICBSeENvdW50U2luY2VMYXN0TlVMTCA9ICVsdS4gXG4iLAorCQkJCSAgTm93LCBwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSwKKwkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwpKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICgocEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCA+IDApCisJCQkgICAmJgorCQkJICAgKChwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSArCisJCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkgPj0gTm93KSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdTogUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAlbHUgPiAwIFxuIiwKKwkJCQkgIE5vdywgcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlicmMgPQorCQkgICAgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgRE9UMTFQT1dFUlNBVkUsCisJCQkJCSAgVGJ0dE51bVRvTmV4dFdha2VVcCk7CisJCWlmIChicmMgPT0gVFJVRSkKKwkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwl9IGVsc2UgeworCQlBVVRPX1dBS0VVUF9TVFJVQyBBdXRvV2FrZXVwQ2ZnOworCQkvKiB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuICovCisJCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCisJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKKworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgQXV0b1dha2V1cEludCk7ICovCisKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDApOwkvKiBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4gKi8KKwkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjwtLSAlcywgVGJ0dE51bVRvTmV4dFdha2VVcD0lZCBcbiIsIF9fZnVuY19fLAorCQkJICBUYnR0TnVtVG9OZXh0V2FrZVVwKSk7CisJfQorCit9CisKK3ZvaWQgUHNQb2xsV2FrZUV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlBzUG9sbFdha2VFeGVjIFxuIikpOworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwlpZiAocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcpIHsKKwkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKKwl9CisJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkvKiBGb3IgcnQzMHh4IHBvd2VyIHNvbHV0aW9uIDMsIFVzZSBzb2Z0d2FyZSB0aW1lciB0byB3YWtlIHVwIGluIHBzbS4gU28gY2FsbCAqLworCS8qIEFzaWNGb3JjZVdha2V1cCBoZXJlIGluc3RlYWQgb2YgaGFuZGxpbmcgdHdha2V1cCBpbnRlcnJ1cHQuICovCisJaWYgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJICAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIjwtLVBzUG9sbFdha2VFeGVjOjozMDkwIGNhbGxzIEFzaWNGb3JjZVdha2V1cChwQWQsIERPVDExUE9XRVJTQVZFKSBpbiBhZHZhbmNlIFxuIikpOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSk7CisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworfQorCit2b2lkIFJhZGlvT25FeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIERtYUNmZzsKKwlCT09MRUFOIENhbmNlbGxlZDsKKworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gZk9QX1NUQVRVU19ET1pFID09IFRSVUU7IFxuIikpOworLypLSCBEZWJ1ZzogQWRkIHRoZSBjb21waWxlIGZsYWcgIlJUMjg2MCBhbmQgY29uZGl0aW9uICovCisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkJICAgICYmIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQorCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAxMCk7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworCQlyZXR1cm47CisJfQorCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCItLT5SYWRpb09uRXhlYygpIHJldHVybiBvbiBTQ0FOX0lOX1BST0dSRVNTOyBcbiIpKTsKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQorCQkgICAgJiYgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisJCXJldHVybjsKKwl9CisvKktIIERlYnVnOiBuZWVkIHRvIGNoZWNrLiBJIGFkZCB0aGUgY29tcGlsZSBmbGFnICJDT05GSUdfU1RBX1NVUFBPUlQiIHRvIGVuY2xvc2UgdGhlIGZvbGxvd2luZyBjb2Rlcy4gKi8KKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCisJICAgICYmIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSB7CisJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwl9CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgeworCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOworCisJCS8qIDIuIFNlbmQgd2FrZSB1cCBjb21tYW5kLiAqLworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMik7CisJCS8qIDItMS4gd2FpdCBjb21tYW5kIG9rLiAqLworCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisKKwkJLyogV2hlbiBQQ0kgY2xvY2sgaXMgb2ZmLCBkb24ndCB3YW50IHRvIHNlcnZpY2UgaW50ZXJydXB0LiBTbyB3aGVuIGJhY2sgdG8gY2xvY2sgb24sIGVuYWJsZSBpbnRlcnJ1cHQuICovCisJCS8qUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCAoREVMQVlJTlRNQVNLfFJ4SU5UKSk7ICovCisJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7CisKKwkJLyogMy4gRW5hYmxlIFR4IERNQS4gKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmRG1hQ2ZnLndvcmQpOworCQlEbWFDZmcuZmllbGQuRW5hYmxlVHhETUEgPSAxOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBEbWFDZmcud29yZCk7CisKKwkJLyogSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uICovCisJCWlmIChJTkZSQV9PTihwQWQpCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0KKwkJCUJXXzQwKSkgeworCQkJLyogTXVzdCB1c2luZyA0ME1Iei4gKi8KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsCisJCQkJCSAgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQl9IGVsc2UgeworCQkJLyogTXVzdCB1c2luZyAyME1Iei4gKi8KKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCX0KKworLypLSCBEZWJ1ZzpUaGUgZm9sbG93aW5nIGNvZGVzIHNob3VsZCBiZSBlbmNsb3NlZCBieSBSVDMwOTAgY29tcGlsZSBmbGFnICovCisJCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCisJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKKworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorLyogMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4gKi8KKy8qIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4gKi8KKwkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkJICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOworCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOworCQl9CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwkJLyogQ2xlYXIgUmFkaW8gb2ZmIGZsYWcgKi8KKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCS8qIFNldCBMRUQgKi8KKwkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKSB7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLAorCQkJCQkJICAgICBwQWQtPlN0YUNmZy5CQlBSMyk7CisJCX0KKwl9IGVsc2UgeworCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlSQURJT19PRkYsIDApOworCX0KK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCURlc2NyaXB0aW9uOgorCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byB3YWtlIHVwIG1vZGUgZnJvbSBwb3dlciBzYXZlIG1vZGUuCisJCUJvdGggUmFkaW9PbiBhbmQgLjExIHBvd2VyIHNhdmUgZnVuY3Rpb24gbmVlZHMgdG8gY2FsbCB0aGlzIHJvdXRpbmUuCisJSW5wdXQ6CisJCUxldmVsID0gR1VJUkFESU9fT0ZGIDogY2FsbCB0aGlzIGZ1bmN0aW9uIGlzIGZyb20gUmFkaW8gT2ZmIHRvIFJhZGlvIE9uLiAgTmVlZCB0byByZXN0b3JlIFBDSSBob3N0IHZhbHVlLgorCQlMZXZlbCA9IG90aGVyIHZhbHVlIDogbm9ybWFsIHdha2UgdXAgZnVuY3Rpb24uCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCitCT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggTGV2ZWwpCit7CisJLypXUERNQV9HTE9fQ0ZHX1NUUlVDICAgICAgIERtYUNmZzsgKi8KKwlCT09MRUFOIENhbmNlbGxlZDsKKwkvKnUzMiAgICAgICAgICAgICAgICAgICAgICAgIE1BQ1ZhbHVlOyAqLworCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCAmJiBMZXZlbCA9PSBET1QxMVBPV0VSU0FWRSkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkgeworCQkJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJfQorCQlpZiAoKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFICYmCisJCSAgICAgKExldmVsID09IEdVSVJBRElPX09GRiB8fCBMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKSkgfHwKKwkJICAgIFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkpIHsKKwkJCS8qIFNvbWUgY2hpcHMgZG9uJ3QgbmVlZCB0byBkZWxheSA2bXMsIHNvIGNvcHkgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZSAqLworCQkJLyogcmV0dXJuIGNvbmRpdGlvbiBoZXJlLiAqLworCQkJLyoKKwkJCSAgIGlmICgoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKQorCQkJICAgJiYgKChwQWQtPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpCisJCQkgICB8fChwQWQtPkRldmljZUlEID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpKSkKKwkJCSAqLworCQkJeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJSVDI4eHhQY2lBc2ljUmFkaW9PbiAoKVxuIikpOworCQkJCS8qIDEuIFNldCBQQ0kgTGluayBDb250cm9sIGluIENvbmZpZ3VyYXRpb24gU3BhY2UuICovCisJCQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsCisJCQkJCQkJICAgICBSRVNUT1JFX1dBS0VVUCk7CisJCQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKKwkJCX0KKwkJfQorCX0KKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwlpZiAoIQorCSAgICAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCSAgICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkpKQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCXsKKwkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUFNNIDozMDl4YlBDSWNsa09mZiA9PSAlZFxuIiwgcEFkLT5iUENJY2xrT2ZmKSk7CisJfQorCS8qIDIuIFNlbmQgd2FrZSB1cCBjb21tYW5kLiAqLworCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLCAweDAyKTsKKwlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKwkvKiAyLTEuIHdhaXQgY29tbWFuZCBvay4gKi8KKwlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyV2FrZUNJRCk7CisJUlRNUF9BU0lDX0lOVEVSUlVQVF9FTkFCTEUocEFkKTsKKworCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCWlmIChMZXZlbCA9PSBHVUlfSURMRV9QT1dFUl9TQVZFKSB7CisjaWZkZWYgIFBDSUVfUFNfU1VQUE9SVAorCisJCS8qIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cCAqLworCQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkgeworCQkJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworCisJCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQorCQkJCXBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZShwQWQpOworCQkJLyogMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4gKi8KKwkJCS8qIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4gKi8KKwkJCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCisJCQkgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PQorCQkJCTMpCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PQorCQkJCVRSVUUpKSB7CisJCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7CisJCQl9CisJCX0gZWxzZQorCQkJLyogZW5kIGpvaG5saSAqLworI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCQl7CisJCQkvKiBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4gKi8KKwkJCXsKKwkJCQlpZiAoSU5GUkFfT04ocEFkKQorCQkJCSAgICAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0KKwkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCQkgICAgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLgorCQkJCQlDaGFubmVsV2lkdGggPT0gQldfNDApKSB7CisJCQkJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgQ2VudHJhbENoYW5uZWwsCisJCQkJCQkJICBGQUxTRSk7CisJCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsCisJCQkJCQkJcEFkLT5Db21tb25DZmcuCisJCQkJCQkJQ2VudHJhbENoYW5uZWwpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE11c3QgdXNpbmcgMjBNSHouICovCisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCXJldHVybiBUUlVFOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIHNlbmRzIGNvbW1hbmQgdG8gZmlybXdhcmUgYW5kIHR1cm4gb3VyIGNoaXAgdG8gcG93ZXIgc2F2ZSBtb2RlLgorCQlCb3RoIFJhZGlvT2ZmIGFuZCAuMTEgcG93ZXIgc2F2ZSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgcm91dGluZS4KKwlJbnB1dDoKKwkJTGV2ZWwgPSBHVUlSQURJT19PRkYgIDogR1VJIFJhZGlvIE9mZiBtb2RlCisJCUxldmVsID0gRE9UMTFQT1dFUlNBVkUgIDogODAyLjExIHBvd2VyIHNhdmUgbW9kZQorCQlMZXZlbCA9IFJUTVBfSEFMVCAgOiBXaGVuIERpc2FibGUgZGV2aWNlLgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PZmYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggTGV2ZWwsIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKQoreworCVdQRE1BX0dMT19DRkdfU1RSVUMgRG1hQ2ZnOworCXU4IGksIHRlbXBCQlBfUjMgPSAwOworCUJPT0xFQU4gYnJjID0gRkFMU0UsIENhbmNlbGxlZDsKKwl1MzIgVGJUVFRpbWUgPSAwOworCXUzMiBQc1BvbGxUaW1lID0gMCAvKiwgTUFDVmFsdWUgKi8gOworCXVuc2lnbmVkIGxvbmcgQmVhY29uUGVyaW9kVGltZTsKKwl1MzIgUnhEbWFJZHgsIFJ4Q3B1SWR4OworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBc2ljUmFkaW9PZmYgPT09PiBMdj0gJWQsIFR4Q3B1SWR4ID0gJWQsIFR4RG1hSWR4ID0gJWQuIFJ4Q3B1SWR4ID0gJWQsIFJ4RG1hSWR4ID0gJWQuXG4iLAorCQkgIExldmVsLCBwQWQtPlR4UmluZ1swXS5UeENwdUlkeCwgcEFkLT5UeFJpbmdbMF0uVHhEbWFJZHgsCisJCSAgcEFkLT5SeFJpbmcuUnhDcHVJZHgsIHBBZC0+UnhSaW5nLlJ4RG1hSWR4KSk7CisKKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQICYmIExldmVsID09IERPVDExUE9XRVJTQVZFKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvKiBDaGVjayBSeCBETUEgYnVzeSBzdGF0dXMsIGlmIG1vcmUgdGhhbiBoYWxmIGlzIG9jY3VwaWVkLCBnaXZlIHVwIHRoaXMgcmFkaW8gb2ZmLiAqLworCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJlJ4RG1hSWR4KTsKKwlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0NSWF9JRFgsICZSeENwdUlkeCk7CisJaWYgKChSeERtYUlkeCA+IFJ4Q3B1SWR4KSAmJiAoKFJ4RG1hSWR4IC0gUnhDcHVJZHgpID4gUlhfUklOR19TSVpFIC8gMykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4xLiBSeERtYUlkeCA9ICVkICwgIFJ4Q3B1SWR4ID0gJWQuIFxuIiwKKwkJCSAgUnhEbWFJZHgsIFJ4Q3B1SWR4KSk7CisJCXJldHVybiBGQUxTRTsKKwl9IGVsc2UgaWYgKChSeENwdUlkeCA+PSBSeERtYUlkeCkKKwkJICAgJiYgKChSeENwdUlkeCAtIFJ4RG1hSWR4KSA8IFJYX1JJTkdfU0laRSAvIDMpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMi4gIFJ4Q3B1SWR4ID0gJWQuIFJ4RG1hSWR4ID0gJWQgLCAgXG4iLAorCQkJICBSeENwdUlkeCwgUnhEbWFJZHgpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBPbmNlIGdvIGludG8gdGhpcyBmdW5jdGlvbiwgZGlzYWJsZSB0eCBiZWNhdXNlIGRvbid0IHdhbnQgdG9vIG1hbnkgcGFja2V0cyBpbiBxdWV1ZSB0byBwcmV2ZW50IEhXIHN0b3BzLiAqLworCS8qcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gVFJVRTsgKi8KKwlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKTsKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKKwkgICAgJiYgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQQorCSAgICAmJiBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkgeworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKSB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRCVFRfVElNRVIsICZUYlRUVGltZSk7CisJCQlUYlRUVGltZSAmPSAweDFmZmZmOworCQkJLyogMDAuIGNoZWNrIGlmIG5lZWQgdG8gZG8gc2xlZXAgaW4gdGhpcyBEVElNIHBlcmlvZC4gICBJZiBuZXh0IGJlYWNvbiB3aWxsIGFycml2ZSB3aXRoaW4gMzBtcyAsIC4uLmRvZXNuJ3QgbmVjZXNzYXJpbHkgc2xlZXAuICovCisJCQkvKiBUYlRUVGltZSB1aW50ID0gNjR1cywgTEVBRF9USU1FIHVuaXQgPSAxMDI0dXMsIFBzUG9sbFRpbWUgdW5pdCA9IDFtcyAqLworCQkJaWYgKCgoNjQgKiBUYlRUVGltZSkgPCAoKExFQURfVElNRSAqIDEwMjQpICsgNDAwMDApKQorCQkJICAgICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlRiVFRUaW1lID0gMHgleCAsIGdpdmUgdXAgdGhpcyBzbGVlcC4gXG4iLAorCQkJCQkgIFRiVFRUaW1lKSk7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCQkJLypwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsgKi8KKwkJCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJUHNQb2xsVGltZSA9CisJCQkJICAgICg2NCAqIFRiVFRUaW1lIC0gTEVBRF9USU1FICogMTAyNCkgLyAxMDAwOworI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAorCQkJCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkKKwkJCQkgICAgIHx8IElTX1JUMzM5MChwQWQpKQorCQkJCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLgorCQkJCQlydDMweHhQb3dlck1vZGUgPT0gMykKKwkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC4KKwkJCQkJRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJCQkJUHNQb2xsVGltZSAtPSA1OworCQkJCX0gZWxzZQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCQkJCQlQc1BvbGxUaW1lIC09IDM7CisKKwkJCQlCZWFjb25QZXJpb2RUaW1lID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kICogMTAyIC8gMTAwOworCQkJCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gMCkKKwkJCQkJUHNQb2xsVGltZSArPQorCQkJCQkgICAgKChUYnR0TnVtVG9OZXh0V2FrZVVwIC0KKwkJCQkJICAgICAgMSkgKiBCZWFjb25QZXJpb2RUaW1lKTsKKworCQkJCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gVFJVRTsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwKKwkJCQkJICAgICBQc1BvbGxUaW1lKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlQyOHh4UGNpQXNpY1JhZGlvT2ZmOjpMZXZlbCE9RE9UMTFQT1dFUlNBVkUgXG4iKSk7CisJfQorCisJcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7CisKKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7CisKKwkvKiBTZXQgdG8gMVIuICovCisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJdGVtcEJCUF9SMyA9IChwQWQtPlN0YUNmZy5CQlBSMyAmIDB4RTcpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCB0ZW1wQkJQX1IzKTsKKwl9CisJLyogSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uICovCisJaWYgKChJTkZSQV9PTihwQWQpIHx8IHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCisJICAgICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKSB7CisJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJfSBlbHNlIHsKKwkJLyogTXVzdCB1c2luZyAyME1Iei4gKi8KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCWlmIChMZXZlbCAhPSBSVE1QX0hBTFQpIHsKKwkJLyogQ2hhbmdlIEludGVycnVwdCBiaXRtYXNrLiAqLworCQkvKiBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgQXV0b1dha2V1cEludCk7CisJfSBlbHNlIHsKKwkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7CisJfQorCisJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOworCS8qICAyLiBTZW5kIFNsZWVwIGNvbW1hbmQgKi8KKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7CisJLyogc2VuZCBQT1dFUi1TQVZFIGNvbW1hbmQgdG8gTUNVLiBoaWdoLWJ5dGUgPSAxIHNhdmUgcG93ZXIgYXMgbXVjaCBhcyBwb3NzaWJsZS4gaGlnaCBieXRlID0gMCBzYXZlIGxlc3MgcG93ZXIgKi8KKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgxKTsKKwkvKiAgMi0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcyAqLworCS8qIFN0YXR1cyA9IDEgOiBzdWNjZXNzLCBTdGF0dXMgPSAyLCBhbHJlYWR5IHNsZWVwLCBTdGF0dXMgPSAzLCBNYXliZSBNQUMgaXMgYnVzeSBzbyBjYW4ndCBmaW5pc2ggdGhpcyB0YXNrLiAqLworCWJyYyA9IEFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKKworCS8qICAzLiBBZnRlciAweDMwIGNvbW1hbmQgaXMgb2ssIHNlbmQgcmFkaW8gb2ZmIGNvbW1hbmQuIGxvd2J5dGUgPSAwIGZvciBwb3dlciBzYWZlLiAqLworCS8qIElmIDB4MzAgY29tbWFuZCBpcyBub3Qgb2sgdGhpcyB0aW1lLCB3ZSBjYW4gaWdub3JlIDB4MzUgY29tbWFuZC4gSXQgd2lsbCBtYWtlIHN1cmUgbm90IGNhdXNlIGZpcm13YXJlJ3IgcHJvYmxlbS4gKi8KKwlpZiAoKExldmVsID09IERPVDExUE9XRVJTQVZFKSAmJiAoYnJjID09IFRSVUUpKSB7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNSwgUG93ZXJSYWRpb09mZkNJRCwgMCwgMHgwMCk7CS8qIGxvd2J5dGUgPSAwIG1lYW5zIHRvIGRvIHBvd2VyIHNhZmUsIE5PVCB0dXJuIG9mZiByYWRpby4gKi8KKwkJLyogIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKwl9IGVsc2UgaWYgKGJyYyA9PSBUUlVFKSB7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzNSwgUG93ZXJSYWRpb09mZkNJRCwgMSwgMHgwMCk7CS8qIGxvd2J5dGUgPSAwIG1lYW5zIHRvIGRvIHBvd2VyIHNhZmUsIE5PVCB0dXJuIG9mZiByYWRpby4gKi8KKwkJLyogIDMtMS4gV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKwl9CisJLyogMS4gV2FpdCBETUEgbm90IGJ1c3kgKi8KKwlpID0gMDsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKKwkJaWYgKChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApCisJCSAgICAmJiAoRG1hQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCQlSVE1QdXNlY0RlbGF5KDIwKTsKKwkJaSsrOworCX0gd2hpbGUgKGkgPCA1MCk7CisKKwkvKgorCSAgIGlmIChpID49IDUwKQorCSAgIHsKKwkgICBwQWQtPkNoZWNrRG1hQnVzeUNvdW50Kys7CisJICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRE1BIFJ4IGtlZXBzIGJ1c3kuICByZXR1cm4gb24gQXNpY1JhZGlvT2ZmICgpIENoZWNrRG1hQnVzeUNvdW50ID0gJWQgXG4iLCBwQWQtPkNoZWNrRG1hQnVzeUNvdW50KSk7CisJICAgfQorCSAgIGVsc2UKKwkgICB7CisJICAgcEFkLT5DaGVja0RtYUJ1c3lDb3VudCA9IDA7CisJICAgfQorCSAqLworLypLSCBEZWJ1ZzpNeSBvcmlnaW5hbCBjb2RlcyBoYXZlIHRoZSBmb2xsd29pbmcgY29kZXMsIGJ1dCBjdXJyZWNudCBjb2RlcyBkbyBub3QgaGF2ZSBpdC4gKi8KKy8qIERpc2FibGUgZm9yIHN0YWJpbGl0eS4gSWYgUENJRSBMaW5rIENvbnRyb2wgaXMgbW9kaWZpZWQgZm9yIGFkdmFuY2UgcG93ZXIgc2F2ZSwgcmUtY292ZXJ5IHRoaXMgY29kZSBzZWdtZW50LiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHgxMjgwKTsKKy8qT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0NMS1NFTEVDVF80ME1IWik7ICovCisKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlQyOHh4UGNpQXNpY1JhZGlvT2ZmOjozMDkwIHJldHVybiB0byBza2lwIHRoZSBmb2xsb3dpbmcgVGJ0dE51bVRvTmV4dFdha2VVcCBzZXR0aW5nIGZvciAyNzl4XG4iKSk7CisJCXBBZC0+YlBDSWNsa09mZiA9IFRSVUU7CisJCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7CisJCS8qIEZvciB0aGlzIGNhc2UsIGRvZXNuJ3QgbmVlZCB0byBiZWxvdyBhY3Rpb25zLCBzbyByZXR1cm4gaGVyZS4gKi8KKwkJcmV0dXJuIGJyYzsKKwl9CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwlpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpIHsKKwkJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKKwkJLypSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgOTApOyAqLworCisJCS8qIHdlIGhhdmUgZGVjaWRlZCB0byBTTEVFUCwgc28gYXQgbGVhc3QgZG8gaXQgZm9yIGEgQkVBQ09OIHBlcmlvZC4gKi8KKwkJaWYgKFRidHROdW1Ub05leHRXYWtlVXAgPT0gMCkKKwkJCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOworCisJCUF1dG9XYWtldXBDZmcud29yZCA9IDA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKKworCQkvKiAxLiBTZXQgYXV0byB3YWtlIHVwIHRpbWVyLiAqLworCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7CisJCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gTEVBRF9USU1FOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7CisJfQorCS8qICA0LTEuIElmIGl0J3MgdG8gZGlzYWJsZSBvdXIgZGV2aWNlLiBOZWVkIHRvIHJlc3RvcmUgUENJIENvbmZpZ3VyYXRpb24gU3BhY2UgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLiAqLworCWlmIChMZXZlbCA9PSBSVE1QX0hBTFQgJiYgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgeworCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKKwkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMSk7CisJfQorCS8qICA0LiBTZXQgUENJIGNvbmZpZ3VyYXRpb24gU3BhY2UgTGluayBDb210cm9sIGZpZWxkcy4gIE9ubHkgUmFkaW8gT2ZmIG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiAqLworCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJaWYgKChicmMgPT0gVFJVRSkgJiYgKGkgPCA1MCkpCisJCQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOworCX0KKwkvKnBBZC0+YlBDSWNsa09mZkRpc2FibGVUeCA9IEZBTFNFOyAqLworCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgUlQyOHh4UGNpTWxtZVJhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKKworCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSB8fCAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCQkJCSAgICYmCisJCQkJCSAgICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCSAgICAocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQorCQkJCQkgICAgfHwgcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLgorCQkJCQkgICAgRW5hYmxlTmV3UFMgPT0gRkFMU0UpKSkgeworCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOworCQkvKk5JQ1Jlc2V0RnJvbUVycm9yKHBBZCk7ICovCisKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKKwkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX01HTVQpOworCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOworCisJCS8qIEVuYWJsZSBUeC9SeCAqLworCQlSVE1QRW5hYmxlUnhUeChwQWQpOworCisJCS8qIENsZWFyIFJhZGlvIG9mZiBmbGFnICovCisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKKworCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKworCQkvKiBTZXQgTEVEICovCisJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOworCX0KKworCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKSB7CisJCUJPT0xFQU4gQ2FuY2VsbGVkOworCisJCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7CisKKwkJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDQwKTsKKwl9Cit9CisKK3ZvaWQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlCT09MRUFOIGJyYyA9IFRSVUU7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCisJCXJldHVybjsKKworCS8qIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKKwkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkgeworCQkJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc1JlcTsKKwkJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKnBNc2dFbGVtID0KKwkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKworCQkJaWYgKHBNc2dFbGVtKSB7CisJCQkJQ09QWV9NQUNfQUREUigmRGlzUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlEaXNSZXEuUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOworCisJCQkJcE1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJCXBNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJCXBNc2dFbGVtLT5Nc2dMZW4gPQorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwTXNnRWxlbS0+TXNnLCAmRGlzUmVxLAorCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCSAgICAgICAoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSk7CisKKwkJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBwTXNnRWxlbSk7CisJCQkJa2ZyZWUocE1zZ0VsZW0pOworCisJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCX0KKwkJfQorCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzPT09PlxuIiwgX19mdW5jX18pKTsKKworCS8qIFNldCBSYWRpbyBvZmYgZmxhZyAqLworCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwl7CisJCUJPT0xFQU4gQ2FuY2VsbGVkOworCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpIHsKKwkJCWlmIChSVE1QX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB7CisJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCQkJJkNhbmNlbGxlZCk7CisJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOworCQkJfQorCQkJLyogSWYgZHVyaW5nIHBvd2VyIHNhZmUgbW9kZS4gKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCItLT5NbG1lUmFkaW9PZmYoKSByZXR1cm4gb24gYlJhZGlvID09IFRSVUU7IFxuIikpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCS8qIEFsd2F5cyByYWRpbyBvbiBzaW5jZSB0aGUgTklDIG5lZWRzIHRvIHNldCB0aGUgTUNVIGNvbW1hbmQgKExFRF9SQURJT19PRkYpLiAqLworCQkJaWYgKElETEVfT04ocEFkKSAmJgorCQkJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKKwkJCXsKKwkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOworCQkJfQorCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQkJQk9PTEVBTiBDYW5jZWxsZWQ7CisJCQkJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwKKwkJCQkJCSZDYW5jZWxsZWQpOworCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwKKwkJCQkJCSZDYW5jZWxsZWQpOworCQkJfQorCQl9CisJCS8qIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzICovCisJCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCisJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKKwkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qIENsZWFuIHVwIG9sZCBic3MgdGFibGUgKi8KKwkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCisJCS8qCisJCSAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkJICAgeworCQkgICBSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKwkJICAgcmV0dXJuOworCQkgICB9CisJCSAqLworCX0KKworCS8qIFNldCBMRUQuTW92ZSB0byBoZXJlIGZvciBmaXhpbmcgTEVEIGJ1Zy4gVGhpcyBmbGFnIG11c3QgYmUgY2FsbGVkIGFmdGVyIExpbmtEb3duICovCisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOworCisvKktIIERlYnVnOkFsbCBQQ0llIGRldmljZXMgbmVlZCB0byB1c2UgdGltZXIgdG8gZXhlY3V0ZSByYWRpbyBvZmYgZnVuY3Rpb24sIG9yIHRoZSBQQ0llJiZFbmFibGVOZXdQUyBuZWVkcy4gKi8KKy8qS0ggQW5zOkl0IGlzIHJpZ2h0LCBiZWNhdXNlIG9ubHkgd2hlbiB0aGUgUENJZSBhbmQgRW5hYmxlTmV3UHMgaXMgdHJ1ZSwgd2UgbmVlZCB0byBkZWxheSB0aGUgUmFkaW9PZmZUaW1lciAqLworLyp0byBhdm9pZCB0aGUgZGVhZGxvY2sgd2l0aCBQQ0llIFBvd2VyIHNhdmluZyBmdW5jdGlvbi4gKi8KKwlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSAmJgorCSAgICBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSAmJgorCSAgICBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkgeworCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKKwl9IGVsc2UgeworCQlicmMgPSBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlSQURJT19PRkYsIDApOworCisJCWlmIChicmMgPT0gRkFMU0UpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzIGNhbGwgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmIGZhaWwhXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJfQorCX0KKy8qCisqLworfQorCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fbWFjX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ2OTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX21hY191c2IuYwpAQCAtMCwwICsxLDExNjUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbGl6ZSByZWNlaXZlIGRhdGEgc3RydWN0dXJlcy4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorCUluaXRpYWxpemUgYWxsIHJlY2VpdmUgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCisJaW4gc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBzdHJ1Y3R1cmUgYW5kIGFsbCBwcml2YXRlIGRhdGEgc3RydWN0dXJlcy4gVGhlIG1haG9yCisJd29yayBpcyB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGVhY2ggcGFja2V0IGFuZCBjaGFpbiBidWZmZXIgdG8KKwlORElTIHBhY2tldCBkZXNjcmlwdG9yLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE5JQ0luaXRSZWN2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1OCBpOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRSZWN2XG4iKSk7CisJcE9iaiA9IHBPYmo7CisKKwkvKkludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsgKi8KKwlwQWQtPlBlbmRpbmdSeCA9IDA7CisJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvKiBOZXh0IFJ4IFJlYWQgaW5kZXggKi8KKwlwQWQtPk5leHRSeEJ1bGtJbkluZGV4ID0gMDsJLypSWF9SSU5HX1NJWkUgLTE7IC8vIFJ4IEJ1bGsgcG9pbnRlciAqLworCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gPSAwOworCisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspIHsKKwkJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkvKkFsbG9jYXRlIFVSQiAqLworCQlwUnhDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOworCQlpZiAocFJ4Q29udGV4dC0+cFVyYiA9PSBOVUxMKSB7CisJCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CisJCQlnb3RvIG91dDE7CisJCX0KKwkJLyogQWxsb2NhdGUgdHJhbnNmZXIgYnVmZmVyICovCisJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0KKwkJICAgIFJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIE1BWF9SWEJVTEtfU0laRSwKKwkJCQkJICAgJnBSeENvbnRleHQtPmRhdGFfZG1hKTsKKwkJaWYgKHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID09IE5VTEwpIHsKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCisJCU5kaXNaZXJvTWVtb3J5KHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLCBNQVhfUlhCVUxLX1NJWkUpOworCisJCXBSeENvbnRleHQtPnBBZCA9IHBBZDsKKwkJcFJ4Q29udGV4dC0+cElycCA9IE5VTEw7CisJCXBSeENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJLypwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsgKi8KKwkJcFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPSBGQUxTRTsKKwkJcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ID0gMDsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFJlY3YoU3RhdHVzPSVkKVxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKKworb3V0MToKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykgeworCQlzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOworCisJCWlmIChOVUxMICE9IHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKSB7CisJCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIE1BWF9SWEJVTEtfU0laRSwKKwkJCQkJICAgICAgcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCisJCQkJCSAgICAgIHBSeENvbnRleHQtPmRhdGFfZG1hKTsKKwkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJfQorCisJCWlmIChOVUxMICE9IHBSeENvbnRleHQtPnBVcmIpIHsKKwkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CisJCQlSVFVTQl9GUkVFX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKKwkJCXBSeENvbnRleHQtPnBVcmIgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0aWFsaXplIHRyYW5zbWl0IGRhdGEgc3RydWN0dXJlcy4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IE5JQ0luaXRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisjZGVmaW5lIExNX1VTQl9BTExPQyhwT2JqLCBDb250ZXh0LCBUQl9UeXBlLCBCdWZmZXJTaXplLCBTdGF0dXMsIG1zZzEsIGVycjEsIG1zZzIsIGVycjIpCVwKKwlDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOwkJXAorCWlmIChDb250ZXh0LT5wVXJiID09IE5VTEwpIHsJCQlcCisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cxKTsJCVwKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAorCQlnb3RvIGVycjE7IH0JCQkJCQlcCisJCQkJCQkJCQkJCVwKKwlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9CQkJCVwKKwkJKFRCX1R5cGUpUlRVU0JfVVJCX0FMTE9DX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwgJkNvbnRleHQtPmRhdGFfZG1hKTsJXAorCWlmIChDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKSB7CVwKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsIG1zZzIpOwkJXAorCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7CQlcCisJCWdvdG8gZXJyMjsgfQorCisjZGVmaW5lIExNX1VSQl9GUkVFKHBPYmosIENvbnRleHQsIEJ1ZmZlclNpemUpCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5wVXJiKSB7CQkJCQkJCVwKKwkJUlRVU0JfVU5MSU5LX1VSQihDb250ZXh0LT5wVXJiKTsJCQkJCVwKKwkJUlRVU0JfRlJFRV9VUkIoQ29udGV4dC0+cFVyYik7CQkJCQkJXAorCQlDb250ZXh0LT5wVXJiID0gTlVMTDsgfQkJCQkJCQkJXAorCWlmIChOVUxMICE9IENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKSB7CQkJCVwKKwkJUlRVU0JfVVJCX0ZSRUVfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBCdWZmZXJTaXplLAlcCisJCQkJCQkJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyLAlcCisJCQkJCQkJCUNvbnRleHQtPmRhdGFfZG1hKTsJCQlcCisJCUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsgfQorCisJdTggaSwgYWNpZHg7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBOdWxsQ29udGV4dCA9ICYocEFkLT5OdWxsQ29udGV4dCk7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUlRTQ29udGV4dCA9ICYocEFkLT5SVFNDb250ZXh0KTsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0ID0gTlVMTDsKKy8qICAgICAgc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dCA9IE5VTEw7ICovCisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJdm9pZCAqUmluZ0Jhc2VWYTsKKy8qICAgICAgc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsgKi8KKwlzdHJ1Y3QgcnRfcnRtcF9tZ210X3JpbmcgKnBNZ210UmluZzsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0VHJhbnNtaXRcbiIpKTsKKwlwT2JqID0gcE9iajsKKworCS8qIEluaXQgNCBzZXQgb2YgVHggcGFyYW1ldGVycyAqLworCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IE5VTV9PRl9UWF9SSU5HOyBhY2lkeCsrKSB7CisJCS8qIEluaXRpYWxpemUgYWxsIFRyYW5zbWl0IHJlbGVhdGVkIHF1ZXVlcyAqLworCQlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+VHhTd1F1ZXVlW2FjaWR4XSk7CisKKwkJLyogTmV4dCBMb2NhbCB0eCByaW5nIHBvaW50ZXIgd2FpdGluZyBmb3IgYnVjayBvdXQgKi8KKwkJcEFkLT5OZXh0QnVsa091dEluZGV4W2FjaWR4XSA9IGFjaWR4OworCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW2FjaWR4XSA9IEZBTFNFOwkvKiBCdWNrIE91dCBjb250cm9sIGZsYWcgKi8KKwkJLypwQWQtPkRhdGFCdWxrRG9uZUlkeFthY2lkeF0gPSAwOyAqLworCX0KKworCS8qcEFkLT5OZXh0TUxNRUluZGV4ICAgID0gMDsgKi8KKwkvKnBBZC0+UHVzaE1nbXRJbmRleCAgICA9IDA7ICovCisJLypwQWQtPlBvcE1nbXRJbmRleCAgICAgPSAwOyAqLworCS8qSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5NZ210UXVldWVTaXplLCAwKTsgKi8KKwkvKkludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VHhDb3VudCwgMCk7ICovCisKKwkvKnBBZC0+UHJpb1JpbmdGaXJzdEluZGV4ICAgICAgID0gMDsgKi8KKwkvKnBBZC0+UHJpb1JpbmdUeENudCAgICAgICAgICAgID0gMDsgKi8KKworCWRvIHsKKwkJLyogKi8KKwkJLyogVFhfUklOR19TSVpFLCA0IEFDcyAqLworCQkvKiAqLworCQlmb3IgKGFjaWR4ID0gMDsgYWNpZHggPCA0OyBhY2lkeCsrKSB7CisJCQlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOworCisJCQlOZGlzWmVyb01lbW9yeShwSFRUWENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCkpOworCQkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJCUxNX1VTQl9BTExPQyhwT2JqLCBwSFRUWENvbnRleHQsIHN0cnVjdCBydF9odHR4X2J1ZmZlciAqLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9odHR4X2J1ZmZlciksIFN0YXR1cywKKwkJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFR4Q29udGV4dFslZF0gdXJiIVxuIiwKKwkJCQkgICAgICBhY2lkeCksIGRvbmUsCisJCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIHN0cnVjdCBydF9odHR4X2J1ZmZlciFcbiIsCisJCQkJICAgICAgYWNpZHgpLCBvdXQxKTsKKworCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+CisJCQkJICAgICAgIEFnZ3JlZ2F0aW9uLCA0KTsKKwkJCXBIVFRYQ29udGV4dC0+cEFkID0gcEFkOworCQkJcEhUVFhDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSAwOworCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gMDsKKwkJCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCQkJcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkID0gYWNpZHg7CisJCQlwSFRUWENvbnRleHQtPmJSaW5nRW1wdHkgPSBUUlVFOworCQkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBGQUxTRTsKKwkJCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7CisJCX0KKworCQkvKiAqLworCQkvKiBNR01UX1JJTkdfU0laRSAqLworCQkvKiAqLworCisJCS8qIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5ICovCisJCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9CisJCSAgICBNR01UX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnRfdHhfY29udGV4dCk7CisJCW9zX2FsbG9jX21lbShwQWQsICh1OCAqKikgKCZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKSwKKwkJCSAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKwkJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEgPT0gTlVMTCkgeworCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgYmlnIGJ1ZmZlciBmb3IgTWdtdERlc2NSaW5nIVxuIikpOworCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOworCQkJZ290byBvdXQxOworCQl9CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsCisJCQkgICAgICAgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplKTsKKwkJUmluZ0Jhc2VWYSA9IHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmE7CisKKwkJLyogSW5pdGlhbGl6ZSBNR01UIFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeSAqLworCQlwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKKwkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspIHsKKwkJCS8qIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgTWdtdCBidWZmZXIgdG8gTWdtdFJpbmcuQ2VsbCAqLworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jU2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRfdHhfY29udGV4dCk7CisJCQlwTWdtdFJpbmctPkNlbGxbaV0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7CisJCQlwTWdtdFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOworCQkJcE1nbXRSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7CisKKwkJCS8qQWxsb2NhdGUgVVJCIGZvciBNTE1FQ29udGV4dCAqLworCQkJcE1MTUVDb250ZXh0ID0KKwkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IFJUVVNCX0FMTE9DX1VSQigwKTsKKwkJCWlmIChwTUxNRUNvbnRleHQtPnBVcmIgPT0gTlVMTCkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTUxNRUNvbnRleHRbJWRdIHVyYiFcbiIsCisJCQkJCSAgaSkpOworCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwkJCQlnb3RvIG91dDI7CisJCQl9CisJCQlwTUxNRUNvbnRleHQtPnBBZCA9IHBBZDsKKwkJCXBNTE1FQ29udGV4dC0+cElycCA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQkJcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKKwkJCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCQkJcE1MTUVDb250ZXh0LT5TZWxmSWR4ID0gaTsKKworCQkJLyogT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwkJCVJpbmdCYXNlVmEgPSAodTggKilSaW5nQmFzZVZhICsgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KTsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1HTVQgUmluZzogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBpKSk7CisKKwkJLypwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gKE1HTVRfUklOR19TSVpFIC0gMSk7ICovCisJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBNR01UX1JJTkdfU0laRTsKKwkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7CisJCXBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPSAwOworCisJCS8qICovCisJCS8qIEJFQUNPTl9SSU5HX1NJWkUgKi8KKwkJLyogKi8KKwkJZm9yIChpID0gMDsgaSA8IEJFQUNPTl9SSU5HX1NJWkU7IGkrKykJLyogMiAqLworCQl7CisJCQlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CisKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25Db250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpKTsKKworCQkJLypBbGxvY2F0ZSBVUkIgKi8KKwkJCUxNX1VTQl9BTExPQyhwT2JqLCBwQmVhY29uQ29udGV4dCwgc3RydWN0IHJ0X3R4X2J1ZmZlciAqLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpLCBTdGF0dXMsCisJCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBCZWFjb25Db250ZXh0WyVkXSB1cmIhXG4iLAorCQkJCSAgICAgIGkpLCBvdXQyLAorCQkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gc3RydWN0IHJ0X3R4X2J1ZmZlciFcbiIsCisJCQkJICAgICAgaSksIG91dDMpOworCisJCQlwQmVhY29uQ29udGV4dC0+cEFkID0gcEFkOworCQkJcEJlYWNvbkNvbnRleHQtPnBJcnAgPSBOVUxMOworCQkJcEJlYWNvbkNvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCQlwQmVhY29uQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCQl9CisKKwkJLyogKi8KKwkJLyogTnVsbENvbnRleHQgKi8KKwkJLyogKi8KKwkJTmRpc1plcm9NZW1vcnkocE51bGxDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpKTsKKworCQkvKkFsbG9jYXRlIFVSQiAqLworCQlMTV9VU0JfQUxMT0MocE9iaiwgcE51bGxDb250ZXh0LCBzdHJ1Y3QgcnRfdHhfYnVmZmVyICosIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSwKKwkJCSAgICAgU3RhdHVzLAorCQkJICAgICAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBOdWxsQ29udGV4dCB1cmIhXG4iKSwKKwkJCSAgICAgb3V0MywKKwkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTnVsbENvbnRleHQgc3RydWN0IHJ0X3R4X2J1ZmZlciFcbiIpLAorCQkJICAgICBvdXQ0KTsKKworCQlwTnVsbENvbnRleHQtPnBBZCA9IHBBZDsKKwkJcE51bGxDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcE51bGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKworCQkvKiAqLworCQkvKiBSVFNDb250ZXh0ICovCisJCS8qICovCisJCU5kaXNaZXJvTWVtb3J5KHBSVFNDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2NvbnRleHQpKTsKKworCQkvKkFsbG9jYXRlIFVSQiAqLworCQlMTV9VU0JfQUxMT0MocE9iaiwgcFJUU0NvbnRleHQsIHN0cnVjdCBydF90eF9idWZmZXIgKiwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpLAorCQkJICAgICBTdGF0dXMsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFJUU0NvbnRleHQgdXJiIVxuIiksCisJCQkgICAgIG91dDQsCisJCQkgICAgICgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFJUU0NvbnRleHQgc3RydWN0IHJ0X3R4X2J1ZmZlciFcbiIpLAorCQkJICAgICBvdXQ1KTsKKworCQlwUlRTQ29udGV4dC0+cEFkID0gcEFkOworCQlwUlRTQ29udGV4dC0+cElycCA9IE5VTEw7CisJCXBSVFNDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCQlwUlRTQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCisJCS8qICovCisJCS8qIFBzUG9sbENvbnRleHQgKi8KKwkJLyogKi8KKwkJLypOZGlzWmVyb01lbW9yeShwUHNQb2xsQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9jb250ZXh0KSk7ICovCisJCS8qQWxsb2NhdGUgVVJCICovCisJCUxNX1VTQl9BTExPQyhwT2JqLCBwUHNQb2xsQ29udGV4dCwgc3RydWN0IHJ0X3R4X2J1ZmZlciAqLAorCQkJICAgICBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlciksIFN0YXR1cywKKwkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCB1cmIhXG4iKSwKKwkJCSAgICAgb3V0NSwKKwkJCSAgICAgKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggUHNQb2xsQ29udGV4dCBzdHJ1Y3QgcnRfdHhfYnVmZmVyIVxuIiksCisJCQkgICAgIG91dDYpOworCisJCXBQc1BvbGxDb250ZXh0LT5wQWQgPSBwQWQ7CisJCXBQc1BvbGxDb250ZXh0LT5wSXJwID0gTlVMTDsKKwkJcFBzUG9sbENvbnRleHQtPkluVXNlID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5iQWdncmVnYXRpYmxlID0gRkFMU0U7CisJCXBQc1BvbGxDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKKworCX0gd2hpbGUgKEZBTFNFKTsKKworZG9uZToKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFRyYW5zbWl0KFN0YXR1cz0lZClcbiIsIFN0YXR1cykpOworCisJcmV0dXJuIFN0YXR1czsKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitvdXQ2OgorCUxNX1VSQl9GUkVFKHBPYmosIHBQc1BvbGxDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCitvdXQ1OgorCUxNX1VSQl9GUkVFKHBPYmosIHBSVFNDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCitvdXQ0OgorCUxNX1VSQl9GUkVFKHBPYmosIHBOdWxsQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKworb3V0MzoKKwlmb3IgKGkgPSAwOyBpIDwgQkVBQ09OX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKwkJaWYgKHBCZWFjb25Db250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEJlYWNvbkNvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisJfQorCitvdXQyOgorCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKSB7CisJCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOworCQlmb3IgKGkgPSAwOyBpIDwgTUdNVF9SSU5HX1NJWkU7IGkrKykgeworCQkJcE1MTUVDb250ZXh0ID0KKwkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJCWlmIChwTUxNRUNvbnRleHQpCisJCQkJTE1fVVJCX0ZSRUUocE9iaiwgcE1MTUVDb250ZXh0LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF90eF9idWZmZXIpKTsKKwkJfQorCQlvc19mcmVlX21lbShwQWQsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpOworCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID0gTlVMTDsKKwl9CisKK291dDE6CisJZm9yIChhY2lkeCA9IDA7IGFjaWR4IDwgNDsgYWNpZHgrKykgeworCQlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcFR4Q29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKKwkJaWYgKHBUeENvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwVHhDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X2h0dHhfYnVmZmVyKSk7CisJfQorCisJLyogSGVyZSB3ZSBkaWRuJ3QgaGF2ZSBhbnkgcHJlLWFsbG9jYXRlZCBtZW1vcnkgbmVlZCB0byBmcmVlLiAqLworCisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZS4KKworQXJndW1lbnRzOgorICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKwlORElTX1NUQVRVU19SRVNPVVJDRVMKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisvKiAgICAgIHN0cnVjdCBydF9jb3VudGVyXzgwMl8xMSAgcENvdW50ZXIgPSAmcEFkLT5XbGFuQ291bnRlcnM7ICovCisJaW50IFN0YXR1czsKKwlpbnQgbnVtOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5XG4iKSk7CisKKwlkbyB7CisJCS8qIEluaXQgdGhlIHN0cnVjdCBydF9jbWRxIGFuZCBDbWRRTG9jayAqLworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlSVFVTQkluaXRpYWxpemVDbWRRKCZwQWQtPkNtZFEpOworCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NTE1FQnVsa091dExvY2spOworCQkvKk5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1MTUVXYWl0UXVldWVMb2NrKTsgKi8KKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMF0pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1sxXSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzJdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbM10pOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1s0XSk7CisJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzVdKTsKKwkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa0luTG9jayk7CisKKwkJZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspIHsKKwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tudW1dKTsKKwkJfQorCisvKiAgICAgICAgICAgICAgTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWVtTG9jayk7ICAgIC8vIE5vdCB1c2VkIGluIFJUMjhYWCAqLworCisvKiAgICAgICAgICAgICAgTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7IC8vIGluaXQgaXQgaW4gVXNlckNmZ0luaXQoKSAqLworLyogICAgICAgICAgICAgIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7IC8vIGluaXQgaXQgaW4gQkFUYWJsZUluaXQoKSAqLworCisvKiAgICAgICAgICAgICAgZm9yKG51bT0wOyBudW08TUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IG51bSsrKSAqLworLyogICAgICAgICAgICAgIHsgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIE5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtudW1dLlJ4UmVSaW5nTG9jayk7ICovCisvKiAgICAgICAgICAgICAgfSAqLworCisJCS8qICovCisJCS8qIEluaXQgTWFjIFRhYmxlICovCisJCS8qICovCisvKiAgICAgICAgICAgICAgTWFjVGFibGVJbml0aWFsaXplKHBBZCk7ICovCisKKwkJLyogKi8KKwkJLyogSW5pdCBzZW5kIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzICovCisJCS8qICovCisJCVN0YXR1cyA9IE5JQ0luaXRUcmFuc21pdChwQWQpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQkvKiAqLworCQkvKiBJbml0IHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKwkJLyogKi8KKwkJU3RhdHVzID0gTklDSW5pdFJlY3YocEFkKTsKKwkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisKKwkJcEFkLT5QZW5kaW5nSW9Db3VudCA9IDE7CisKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfZnJhZ21lbnRfZnJhbWUpKTsKKwlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9CisJICAgIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKKworCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKSB7CisJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKKwl9CisKKwlEQkdQUklOVF9TKFN0YXR1cywKKwkJICAgKCI8LS0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnksIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKwlDYWxscyBVU0JfSW50ZXJmYWNlU3RvcCBhbmQgZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIFVSQnMKKyAgICBjYWxscyBOZGlzTURlcmVnaXN0ZXJEZXZpY2UgYW5kIGZyZWVzIHRoZSBtZW1vcnkKKyAgICBhbGxvY2F0ZWQgaW4gVk5ldEluaXRpYWxpemUgZm9yIHRoZSBBZGFwdGVyIE9iamVjdAorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCisJaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCisJCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCisJCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKKwkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKKwlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQkJXAorCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsCVwKKwkJCQkJCQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCVwKKwkJCQkJCQkJQ29udGV4dC0+ZGF0YV9kbWEpOwkJCVwKKwkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOyB9CisKKwl1MzIgaSwgYWNpZHg7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBOdWxsQ29udGV4dCA9ICZwQWQtPk51bGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dCA9ICZwQWQtPlBzUG9sbENvbnRleHQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBSVFNDb250ZXh0ID0gJnBBZC0+UlRTQ29udGV4dDsKKy8qICAgICAgc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsgKi8KKwkvKlBSVE1QX1JFT1JERVJCVUYgICAgICBwUmVvcmRlckJ1ZjsgKi8KKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKy8qICAgICAgc3RydWN0IHJ0X3J0bXBfdHhfcmluZyAqcFR4UmluZzsgKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT4gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOworCXBPYmogPSBwT2JqOworCisJLyogRnJlZSBhbGwgcmVzb3VyY2VzIGZvciB0aGUgUkVDRUlWRSBidWZmZXIgcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspIHsKKwkJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKwkJaWYgKHBSeENvbnRleHQpCisJCQlMTV9VUkJfRlJFRShwT2JqLCBwUnhDb250ZXh0LCBNQVhfUlhCVUxLX1NJWkUpOworCX0KKworCS8qIEZyZWUgUHNQb2xsIGZyYW1lIHJlc291cmNlICovCisJTE1fVVJCX0ZSRUUocE9iaiwgcFBzUG9sbENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisKKwkvKiBGcmVlIE5VTEwgZnJhbWUgcmVzb3VyY2UgKi8KKwlMTV9VUkJfRlJFRShwT2JqLCBwTnVsbENvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisKKwkvKiBGcmVlIFJUUyBmcmFtZSByZXNvdXJjZSAqLworCUxNX1VSQl9GUkVFKHBPYmosIHBSVFNDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X3R4X2J1ZmZlcikpOworCisJLyogRnJlZSBiZWFjb24gZnJhbWUgcmVzb3VyY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQkVBQ09OX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKKwkJaWYgKHBCZWFjb25Db250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEJlYWNvbkNvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7CisJfQorCisJLyogRnJlZSBtZ210IGZyYW1lIHJlc291cmNlICovCisJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBNTE1FQ29udGV4dCA9CisJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKKwkJLypMTV9VUkJfRlJFRShwT2JqLCBwTUxNRUNvbnRleHQsIHNpemVvZihzdHJ1Y3QgcnRfdHhfYnVmZmVyKSk7ICovCisJCWlmIChOVUxMICE9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCkgeworCQkJUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwKKwkJCQkJICAgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZGlzUGFja2V0KTsKKwkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7CisJCQlwTUxNRUNvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKKwkJfQorCisJCWlmIChwTUxNRUNvbnRleHQpIHsKKwkJCWlmIChOVUxMICE9IHBNTE1FQ29udGV4dC0+cFVyYikgeworCQkJCVJUVVNCX1VOTElOS19VUkIocE1MTUVDb250ZXh0LT5wVXJiKTsKKwkJCQlSVFVTQl9GUkVFX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOworCQkJCXBNTE1FQ29udGV4dC0+cFVyYiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJaWYgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEpCisJCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSk7CisKKwkvKiBGcmVlIFR4IGZyYW1lIHJlc291cmNlICovCisJZm9yIChhY2lkeCA9IDA7IGFjaWR4IDwgNDsgYWNpZHgrKykgeworCQlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOworCQlpZiAocEhUVFhDb250ZXh0KQorCQkJTE1fVVJCX0ZSRUUocE9iaiwgcEhUVFhDb250ZXh0LCBzaXplb2Yoc3RydWN0IHJ0X2h0dHhfYnVmZmVyKSk7CisJfQorCisJaWYgKHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0KQorCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQsCisJCQkJICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW2ldKTsKKwl9CisKKwlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKKworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCS8qIENsZWFyIGFsbCBwZW5kaW5nIGJ1bGstb3V0IHJlcXVlc3QgZmxhZ3MuICovCisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgMHhmZmZmZmZmZik7CisKKy8qICAgICAgTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsgKi8KKworLyogICAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBpKyspICovCisvKiAgICAgIHsgKi8KKy8qICAgICAgICAgICAgICBOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spOyAqLworLyogICAgICB9ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI8LS0tIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBXcml0ZSBXTEFOIE1BQyBhZGRyZXNzIHRvIFVTQiAyODcwLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitpbnQgUlRVU0JXcml0ZUhXTUFDQWRkcmVzcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJTUFDX0RXMF9TVFJVQyBTdGFNYWNSZWcwOworCU1BQ19EVzFfU1RSVUMgU3RhTWFjUmVnMTsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlMQVJHRV9JTlRFR0VSIE5PVzsKKworCS8qIGluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yICovCisJUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZSgmTk9XKTsKKworCWlmIChwQWQtPmJMb2NhbEFkbWluTUFDICE9IFRSVUUpIHsKKwkJcEFkLT5DdXJyZW50QWRkcmVzc1swXSA9IHBBZC0+UGVybWFuZW50QWRkcmVzc1swXTsKKwkJcEFkLT5DdXJyZW50QWRkcmVzc1sxXSA9IHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXTsKKwkJcEFkLT5DdXJyZW50QWRkcmVzc1syXSA9IHBBZC0+UGVybWFuZW50QWRkcmVzc1syXTsKKwkJcEFkLT5DdXJyZW50QWRkcmVzc1szXSA9IHBBZC0+UGVybWFuZW50QWRkcmVzc1szXTsKKwkJcEFkLT5DdXJyZW50QWRkcmVzc1s0XSA9IHBBZC0+UGVybWFuZW50QWRkcmVzc1s0XTsKKwkJcEFkLT5DdXJyZW50QWRkcmVzc1s1XSA9IHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XTsKKwl9CisJLyogV3JpdGUgTmV3IE1BQyBhZGRyZXNzIHRvIE1BQ19DU1IyICYgTUFDX0NTUjMgJiBsZXQgQVNJQyBrbm93IG91ciBuZXcgTUFDICovCisJU3RhTWFjUmVnMC5maWVsZC5CeXRlMCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMF07CisJU3RhTWFjUmVnMC5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07CisJU3RhTWFjUmVnMC5maWVsZC5CeXRlMiA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMl07CisJU3RhTWFjUmVnMC5maWVsZC5CeXRlMyA9IHBBZC0+Q3VycmVudEFkZHJlc3NbM107CisJU3RhTWFjUmVnMS5maWVsZC5CeXRlNCA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNF07CisJU3RhTWFjUmVnMS5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CisJU3RhTWFjUmVnMS5maWVsZC5VMk1lTWFzayA9IDB4ZmY7CisJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkgICAgICgiTG9jYWwgTUFDID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3NbMF0sIHBBZC0+Q3VycmVudEFkZHJlc3NbMV0sCisJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3NbMl0sIHBBZC0+Q3VycmVudEFkZHJlc3NbM10sCisJCSAgICAgIHBBZC0+Q3VycmVudEFkZHJlc3NbNF0sIHBBZC0+Q3VycmVudEFkZHJlc3NbNV0pKTsKKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIE1BQ19BRERSX0RXMCwgU3RhTWFjUmVnMC53b3JkKTsKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBNQUNfQUREUl9EVzEsIFN0YU1hY1JlZzEud29yZCk7CisJcmV0dXJuIFN0YXR1czsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBEaXNhYmxlIERNQS4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisJTm9uZQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVDI4WFhETUFEaXNhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwkvKiBubyB1c2UgKi8KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBFbmFibGUgRE1BLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjhYWERNQUVuYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7CisJVVNCX0RNQV9DRkdfU1RSVUMgVXNiQ2ZnOworCWludCBpID0gMDsKKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApCisJCSAgICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiAgRE1BQnVzeVxuIikpOworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQlpKys7CisJfSB3aGlsZSAoaSA8IDIwMCk7CisKKwlSVE1QdXNlY0RlbGF5KDUwKTsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKKwlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CisKKwlVc2JDZmcud29yZCA9IDA7CisJVXNiQ2ZnLmZpZWxkLnBoeWNsZWFyID0gMDsKKwkvKiB1c2IgdmVyc2lvbiBpcyAxLjEsZG8gbm90IHVzZSBidWxrIGluIGFnZ3JlZ2F0aW9uICovCisJaWYgKHBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9PSA1MTIpCisJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dFbiA9IDE7CisJLyogZm9yIGxhc3QgcGFja2V0LCBQQkYgbWlnaHQgdXNlIG1vcmUgdGhhbiBsaW1pdGVkLCBzbyBtaW51cyAyIHRvIHByZXZlbnQgZnJvbSBlcnJvciAqLworCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dMbXQgPSAoTUFYX1JYQlVMS19TSVpFIC8gMTAyNCkgLSAzOworCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dUT3V0ID0gMHg4MDsJLyogMjAwNi0xMC0xOCAqLworCVVzYkNmZy5maWVsZC5SeEJ1bGtFbiA9IDE7CisJVXNiQ2ZnLmZpZWxkLlR4QnVsa0VuID0gMTsKKworCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCBVc2JDZmcud29yZCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKgkyODcwIEJlYWNvbiBVcGRhdGUgUmVsYXRlZCBmdW5jdGlvbnMuCisgICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgorCitBcmd1bWVudHM6CisJKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKwlOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIGludCBhcGlkeCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIEZyYW1lTGVuLCB1bnNpZ25lZCBsb25nIFVwZGF0ZVBvcykKK3sKKwl1OCAqcEJlYWNvbkZyYW1lID0gTlVMTDsKKwl1OCAqcHRyOworCXUzMiBpLCBwYWRkaW5nOworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwl1MzIgbG9uZ1ZhbHVlOworLyogICAgICB1MTYgICAgICAgICAgICAgICAgICBzaG9ydFZhbHVlOyAqLworCUJPT0xFQU4gYkJjblJlcSA9IEZBTFNFOworCXU4IGJjbl9pZHggPSAwOworCisJaWYgKHBCZWFjb25GcmFtZSA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBCZWFjb25GcmFtZSBpcyBOVUxMIVxuIikpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBCZWFjb25TeW5jID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicEJlYWNvblN5bmMgaXMgTlVMTCFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwkvKmlmICgocEFkLT5XZHNUYWIuTW9kZSA9PSBXRFNfQlJJREdFX01PREUpIHx8ICovCisJLyogICAgICAoKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldiA9PSBOVUxMKSB8fCAhKHBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldi0+ZmxhZ3MgJiBJRkZfVVApKSAqLworCS8qICAgICAgKSAqLworCWlmIChiQmNuUmVxID09IEZBTFNFKSB7CisJCS8qIHdoZW4gdGhlIHJhIGludGVyZmFjZSBpcyBkb3duLCBkbyBub3Qgc2VuZCBpdHMgYmVhY29uIGZyYW1lICovCisJCS8qIGNsZWFyIGFsbCB6ZXJvICovCisJCWZvciAoaSA9IDA7IGkgPCBUWFdJX1NJWkU7IGkgKz0gNCkgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLAorCQkJCQkweDAwKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9CisJCSAgICAofihCRUFDT05fQklUTUFQX01BU0sgJiAoMSA8PCBiY25faWR4KSkpOworCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgVFhXSV9TSVpFKTsKKwl9IGVsc2UgeworCQlwdHIgPSAodTggKikmIHBBZC0+QmVhY29uVHhXSTsKKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKSA9PSBGQUxTRSkgewkvKiBJZiBCZWFjb25UeFdJIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmV3cml0ZSB0aGUgVHhXSSBmb3IgdGhlIEJlYWNvbiBmcmFtZXMuICovCisJCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9CisJCQkgICAgKH4oQkVBQ09OX0JJVE1BUF9NQVNLICYgKDEgPDwgYmNuX2lkeCkpKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2Jjbl9pZHhdLAorCQkJCSAgICAgICAmcEFkLT5CZWFjb25UeFdJLCBUWFdJX1NJWkUpOworCQl9CisKKwkJaWYgKChwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICYgKDEgPDwgYmNuX2lkeCkpICE9CisJCSAgICAoMSA8PCBiY25faWR4KSkgeworCQkJZm9yIChpID0gMDsgaSA8IFRYV0lfU0laRTsgaSArPSA0KQkvKiAxNi1ieXRlIFRYV0kgZmllbGQgKi8KKwkJCXsKKwkJCQlsb25nVmFsdWUgPQorCQkJCSAgICAqcHRyICsgKCoocHRyICsgMSkgPDwgOCkgKworCQkJCSAgICAoKihwdHIgKyAyKSA8PCAxNikgKyAoKihwdHIgKyAzKSA8PCAyNCk7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwKKwkJCQkJCXBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgaSwKKwkJCQkJCWxvbmdWYWx1ZSk7CisJCQkJcHRyICs9IDQ7CisJCQl9CisJCX0KKworCQlwdHIgPSBwQmVhY29uU3luYy0+QmVhY29uQnVmW2Jjbl9pZHhdOworCQlwYWRkaW5nID0gKEZyYW1lTGVuICYgMHgwMSk7CisJCU5kaXNaZXJvTWVtb3J5KCh1OCAqKShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiksIHBhZGRpbmcpOworCQlGcmFtZUxlbiArPSBwYWRkaW5nOworCQlmb3IgKGkgPSAwOyBpIDwgRnJhbWVMZW4gLypIV19CRUFDT05fT0ZGU0VUICovIDsgaSArPSAyKSB7CisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHB0ciwgcEJlYWNvbkZyYW1lLCAyKSA9PSBGQUxTRSkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHB0ciwgcEJlYWNvbkZyYW1lLCAyKTsKKwkJCQkvKnNob3J0VmFsdWUgPSAqcHRyICsgKCoocHRyKzEpPDw4KTsgKi8KKwkJCQkvKlJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCBzaG9ydFZhbHVlKTsgKi8KKwkJCQlSVFVTQk11bHRpV3JpdGUocEFkLAorCQkJCQkJcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKworCQkJCQkJVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKKwkJCX0KKwkJCXB0ciArPSAyOworCQkJcEJlYWNvbkZyYW1lICs9IDI7CisJCX0KKworCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwIHw9ICgxIDw8IGJjbl9pZHgpOworCisJCS8qIEZvciBBUCBpbnRlcmZhY2UsIHNldCB0aGUgRHRpbUJpdE9uIHNvIHRoYXQgd2UgY2FuIHNlbmQgQmNhc3QvTWNhc3QgZnJhbWUgb3V0IGFmdGVyIHRoaXMgYmVhY29uIGZyYW1lLiAqLworCX0KKworfQorCit2b2lkIFJUVVNCQnNzQmVhY29uU3RvcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X2JlYWNvbl9zeW5jICpwQmVhY29uU3luYzsKKwlpbnQgaSwgb2Zmc2V0OworCUJPT0xFQU4gQ2FuY2VsbGVkID0gVFJVRTsKKworCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJaWYgKHBCZWFjb25TeW5jICYmIHBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24pIHsKKwkJaW50IE51bU9mQmNuOworCisJCXsKKwkJCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOworCQl9CisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJZm9yIChpID0gMDsgaSA8IE51bU9mQmNuOyBpKyspIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sCisJCQkJICAgICAgIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7CisKKwkJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgSFdfQkVBQ09OX09GRlNFVDsgb2Zmc2V0ICs9IDQpCisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwKKwkJCQkJCXBBZC0+QmVhY29uT2Zmc2V0W2ldICsgb2Zmc2V0LAorCQkJCQkJMHgwMCk7CisKKwkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisJCXBCZWFjb25TeW5jLT5EdGltQml0T24gPSAwOworCX0KK30KKwordm9pZCBSVFVTQkJzc0JlYWNvblN0YXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgYXBpZHg7CisJc3RydWN0IHJ0X2JlYWNvbl9zeW5jICpwQmVhY29uU3luYzsKKy8qICAgICAgTEFSR0VfSU5URUdFUiAgIHRzZlRpbWUsIGRlbHRhVGltZTsgKi8KKworCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJaWYgKHBCZWFjb25TeW5jICYmIHBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24pIHsKKwkJaW50IE51bU9mQmNuOworCisJCXsKKwkJCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOworCQl9CisKKwkJZm9yIChhcGlkeCA9IDA7IGFwaWR4IDwgTnVtT2ZCY247IGFwaWR4KyspIHsKKwkJCXU4IENhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbiA9IDA7CisJCQl1OCBUaW1JRUxvY2F0aW9uSW5CZWFjb24gPSAwOworCisJCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2FwaWR4XSwKKwkJCQkgICAgICAgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2FwaWR4XSA9CisJCQkgICAgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uOworCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPQorCQkJICAgIFRpbUlFTG9jYXRpb25JbkJlYWNvbjsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2FwaWR4XSwKKwkJCQkgICAgICAgVFhXSV9TSVpFKTsKKwkJfQorCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKKwkJcEJlYWNvblN5bmMtPkR0aW1CaXRPbiA9IDA7CisJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLlJlcGVhdCA9IFRSVUU7CisKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uQWRqdXN0ID0gMDsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yID0KKwkJICAgIDB4ZmZmZmZmZmYgLyAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluID0KKwkJICAgICgweGZmZmZmZmZmICUgKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkpICsgMTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVFVTQkJzc0JlYWNvblN0YXJ0OkJlYWNvbkZhY3Rvcj0lZCwgQmVhY29uUmVtYWluPSVkIVxuIiwKKwkJCSAgcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yLAorCQkJICBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4pKTsKKwkJUlRNUFNldFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwKKwkJCSAgICAgMTAgLypwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgKi8gKTsKKworCX0KK30KKwordm9pZCBSVFVTQkJzc0JlYWNvbkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisJaW50IGk7CisKKwlvc19hbGxvY19tZW0ocEFkLCAodTggKiopICgmcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgcnRfYmVhY29uX3N5bmMpKTsKKwkvKk5kaXNBbGxvY01lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgc2l6ZW9mKHN0cnVjdCBydF9iZWFjb25fc3luYyksIE1FTV9BTExPQ19GTEFHKTsgKi8KKwlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpIHsKKwkJcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKKwkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMsIHNpemVvZihzdHJ1Y3QgcnRfYmVhY29uX3N5bmMpKTsKKwkJZm9yIChpID0gMDsgaSA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykgeworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwKKwkJCQkgICAgICAgSFdfQkVBQ09OX09GRlNFVCk7CisJCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOworCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7CisJCX0KKwkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7CisKKwkJLypSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyksIHBBZCwgVFJVRSk7ICovCisJCXBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24gPSBUUlVFOworCX0KK30KKwordm9pZCBSVFVTQkJzc0JlYWNvbkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF9iZWFjb25fc3luYyAqcEJlYWNvblN5bmM7CisJQk9PTEVBTiBDYW5jZWxsZWQgPSBUUlVFOworCWludCBpOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jKSB7CisJCXBCZWFjb25TeW5jID0gcEFkLT5Db21tb25DZmcucEJlYWNvblN5bmM7CisJCXBCZWFjb25TeW5jLT5FbmFibGVCZWFjb24gPSBGQUxTRTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lciwgJkNhbmNlbGxlZCk7CisJCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fTUFYX0NPVU5UOyBpKyspIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sCisJCQkJICAgICAgIEhXX0JFQUNPTl9PRkZTRVQpOworCQkJcEJlYWNvblN5bmMtPkNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7CisJCQlwQmVhY29uU3luYy0+VGltSUVMb2NhdGlvbkluQmVhY29uW2ldID0gMDsKKwkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2ldLCBUWFdJX1NJWkUpOworCQl9CisKKwkJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYyk7CisJCXBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jID0gTlVMTDsKKwl9Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAgICAgRm9yIGRldmljZSB3b3JrIGFzIEFQIG1vZGUgYnV0IGRpZG4ndCBoYXZlIFRCVFQgaW50ZXJydXB0IGV2ZW50LCB3ZSBuZWVkIGEgbWVjaGFuaXNtCisgICAgICAgIHRvIHVwZGF0ZSB0aGUgYmVhY29uIGNvbnRleHQgaW4gZWFjaCBCZWFjb24gaW50ZXJ2YWwuIEhlcmUgd2UgdXNlIGEgcGVyaW9kaWNhbCB0aW1lcgorICAgICAgICB0byBzaW11bGF0ZSB0aGUgVEJUVCBpbnRlcnJ1cHQgdG8gaGFuZGxlIHRoZSBiZWFjb24gY29udGV4dCB1cGRhdGUuCisKKyAgICBBcmd1bWVudHM6CisgICAgICAgIFN5c3RlbVNwZWNpZmljMSAgICAgICAgIC0gTm90IHVzZWQuCisgICAgICAgIEZ1bmN0aW9uQ29udGV4dCAgICAgICAgIC0gUG9pbnRlciB0byBvdXIgQWRhcHRlciBjb250ZXh0LgorICAgICAgICBTeXN0ZW1TcGVjaWZpYzIgICAgICAgICAtIE5vdCB1c2VkLgorICAgICAgICBTeXN0ZW1TcGVjaWZpYzMgICAgICAgICAtIE5vdCB1c2VkLgorCisgICAgUmV0dXJuIFZhbHVlOgorICAgICAgICBOb25lCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEJlYWNvblVwZGF0ZUV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCUxBUkdFX0lOVEVHRVIgdHNmVGltZV9hOwkvKiwgdHNmVGltZV9iLCBkZWx0YVRpbWVfZXhwLCBkZWx0YVRpbWVfYWI7ICovCisJdTMyIGRlbHRhLCBkZWx0YTJNUywgcGVyaW9kMlVTLCByZW1haW4sIHJlbWFpbl9sb3csIHJlbWFpbl9oaWdoOworLyogICAgICBCT09MRUFOICAgICAgICAgICAgICAgICBwb3NpdGl2ZTsgKi8KKworCWlmIChwQWQtPkNvbW1vbkNmZy5Jc1VwZGF0ZUJlYWNvbiA9PSBUUlVFKSB7CisJCVJlU3luY0JlYWNvblRpbWUocEFkKTsKKworCX0KKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFNGX1RJTUVSX0RXMCwgJnRzZlRpbWVfYS51Lkxvd1BhcnQpOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFNGX1RJTUVSX0RXMSwgJnRzZlRpbWVfYS51LkhpZ2hQYXJ0KTsKKworCS8qcG9zaXRpdmU9Z2V0RGVsdGFUaW1lKHRzZlRpbWVfYSwgZXhwZWN0ZWRUaW1lLCAmZGVsdGFUaW1lX2V4cCk7ICovCisJcGVyaW9kMlVTID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJcmVtYWluX2hpZ2ggPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4gKiB0c2ZUaW1lX2EudS5IaWdoUGFydDsKKwlyZW1haW5fbG93ID0gdHNmVGltZV9hLnUuTG93UGFydCAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOworCXJlbWFpbiA9CisJICAgIChyZW1haW5faGlnaCArIHJlbWFpbl9sb3cpICUgKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCk7CisJZGVsdGEgPSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKSAtIHJlbWFpbjsKKworCWRlbHRhMk1TID0gKGRlbHRhID4+IDEwKTsKKwlpZiAoZGVsdGEyTVMgPiAxNTApIHsKKwkJcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIuVGltZXJWYWx1ZSA9IDEwMDsKKwkJcEFkLT5Db21tb25DZmcuSXNVcGRhdGVCZWFjb24gPSBGQUxTRTsKKwl9IGVsc2UgeworCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5UaW1lclZhbHVlID0gZGVsdGEyTVMgKyAxMDsKKwkJcEFkLT5Db21tb25DZmcuSXNVcGRhdGVCZWFjb24gPSBUUlVFOworCX0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCTI4NzAgUmFkaW8gb24vb2ZmIFJlbGF0ZWQgZnVuY3Rpb25zLgorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBSVDI4eHhVc2JNbG1lUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4VXNiTWxtZVJhZGlvT24oKVxuIikpOworCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKKwkJcmV0dXJuOworCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOworCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKKwl9CisJLypOSUNSZXNldEZyb21FcnJvcihwQWQpOyAqLworCisJLyogRW5hYmxlIFR4L1J4ICovCisJUlRNUEVuYWJsZVJ4VHgocEFkKTsKKworCWlmIChwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpCisJCXBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZShwQWQpOworCisJLyogQ2xlYXIgUmFkaW8gb2ZmIGZsYWcgKi8KKwlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisKKwkvKiBTZXQgTEVEICovCisJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Cit9CisKK3ZvaWQgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKKwl1MzIgVmFsdWUsIGk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVDI4eHhVc2JNbG1lUmFkaW9PRkYoKVxuIikpOworCisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQorCQlyZXR1cm47CisKKwkvKiBDbGVhciBQTUtJRCBjYWNoZS4gKi8KKwlwQWQtPlN0YUNmZy5TYXZlZFBNS051bSA9IDA7CisJUlRNUFplcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIChQTUtJRF9OTyAqIHNpemVvZihzdHJ1Y3QgcnRfYnNzaWRfaW5mbykpKTsKKworCS8qIExpbmsgZG93biBmaXJzdCBpZiBhbnkgYXNzb2NpYXRpb24gZXhpc3RzICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKKwkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkgeworCQkJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc1JlcTsKKwkJCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKnBNc2dFbGVtID0KKwkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKworCQkJaWYgKHBNc2dFbGVtKSB7CisJCQkJQ09QWV9NQUNfQUREUigmRGlzUmVxLkFkZHIsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlEaXNSZXEuUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOworCisJCQkJcE1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOworCQkJCXBNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJCXBNc2dFbGVtLT5Nc2dMZW4gPQorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeShwTXNnRWxlbS0+TXNnLCAmRGlzUmVxLAorCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCSAgICAgICAoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSk7CisKKwkJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBwTXNnRWxlbSk7CisJCQkJa2ZyZWUocE1zZ0VsZW0pOworCisJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBTZXQgUmFkaW8gb2ZmIGZsYWcgKi8KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJeworCQkvKiBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cyAqLworCQlpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQorCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJCS8qIENsZWFuIHVwIG9sZCBic3MgdGFibGUgKi8KKwkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOworCX0KKworCS8qIFNldCBMRUQgKi8KKwlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7CisKKwlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSB7CisJCS8qIE11c3QgdXNpbmcgNDBNSHouICovCisJCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CisJfSBlbHNlIHsKKwkJLyogTXVzdCB1c2luZyAyME1Iei4gKi8KKwkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCX0KKworCS8qIERpc2FibGUgVHgvUnggRE1BICovCisJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvKiBkaXNhYmxlIERNQSAqLworCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7CisJR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKKwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CS8qIGFib3J0IGFsbCBUWCByaW5ncyAqLworCisJLyogV2FpdGluZyBmb3IgRE1BIGlkbGUgKi8KKwlpID0gMDsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApCisJCSAgICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJCWJyZWFrOworCisJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisJfSB3aGlsZSAoaSsrIDwgMTAwKTsKKworCS8qIERpc2FibGUgTUFDIFR4L1J4ICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7CisJVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOworCisJeworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOworCX0KK30KKworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCmluZGV4IDg1ODU1ZjdmLi42YjAwM2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc2FuaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3Nhbml0eS5jCkBAIC0zNiwxNyArMzYsMTYgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKK2V4dGVybiB1OCBDSVNDT19PVUlbXTsKIAotZXh0ZXJuIFVDSEFSCUNJU0NPX09VSVtdOwotCi1leHRlcm4gVUNIQVIJV1BBX09VSVtdOwotZXh0ZXJuIFVDSEFSCVJTTl9PVUlbXTsKLWV4dGVybiBVQ0hBUglXTUVfSU5GT19FTEVNW107Ci1leHRlcm4gVUNIQVIJV01FX1BBUk1fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCUNjeDJRb3NJbmZvW107Ci1leHRlcm4gVUNIQVIJUkFMSU5LX09VSVtdOwotZXh0ZXJuIFVDSEFSCUJST0FEQ09NX09VSVtdOwotZXh0ZXJuIFVDSEFSICAgIFdQU19PVUlbXTsKK2V4dGVybiB1OCBXUEFfT1VJW107CitleHRlcm4gdTggUlNOX09VSVtdOworZXh0ZXJuIHU4IFdNRV9JTkZPX0VMRU1bXTsKK2V4dGVybiB1OCBXTUVfUEFSTV9FTEVNW107CitleHRlcm4gdTggQ2N4MlFvc0luZm9bXTsKK2V4dGVybiB1OCBSQUxJTktfT1VJW107CitleHRlcm4gdTggQlJPQURDT01fT1VJW107CitleHRlcm4gdTggV1BTX09VSVtdOwogCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01OSwxNzMgKzU4LDE3MiBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMikKK0JPT0xFQU4gTWxtZUFkZEJBUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCAqcEFkZHIyKQogewotICAgIFBNTE1FX0FEREJBX1JFUV9TVFJVQ1QgICBwSW5mbzsKKwlzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEgKnBJbmZvOwogCi0gICAgcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopTXNnOworCXBJbmZvID0gKHN0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSAqKU1zZzsKIAotICAgIGlmICgoTXNnTGVuICE9IHNpemVvZihNTE1FX0FEREJBX1JFUV9TVFJVQ1QpKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgTWFjIGlzIG5vdCBhc3NvY2lhdGVkIHlldC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICgocEluZm8tPnBBZGRyWzBdJjB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIGJyb2FkY2FzdCBhZGRyZXNzIG5vdCBzdXBwb3J0IEJBXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pCi17Ci0JTUxNRV9ERUxCQV9SRVFfU1RSVUNUICpwSW5mbzsKLQlwSW5mbyA9IChNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKilNc2c7Ci0KLSAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9ERUxCQV9SRVFfU1RSVUNUKSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBJbmZvLT5USUQgJiAweGYwKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgVElEIGlzIGluY29ycmVjdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCWlmIChOZGlzRXF1YWxNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQWRkciwgcEluZm8tPkFkZHIsIE1BQ19BRERSX0xFTikgPT0gMCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gdGhlIHBlZXIgYWRkciBkb3Nlbid0IGV4aXN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLUJPT0xFQU4gUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyKQotewotCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfQUREQkFfUkVRIHBBZGRGcmFtZTsKLQlwQWRkRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkocE1zZyk7Ci0JaWYgKE1zZ0xlbiA8IChzaXplb2YoRlJBTUVfQUREQkFfUkVRKSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCWlmICgoTXNnTGVuICE9IHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hZGRiYV9yZXEpKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1sbWVBZGRCQVJlcVNhbml0eSBmYWlsIC0gbWVzc2FnZSBsZW5naHQgbm90IGNvcnJlY3QuXG4iKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCisJaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKHBJbmZvLT5wQWRkclswXSAmIDB4MDEpID09IDB4MDEpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIGJyb2FkY2FzdCBhZGRyZXNzIG5vdCBzdXBwb3J0IEJBXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCisgICAgUmV0dXJuOgorICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqIE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4pCit7CisJc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxICpwSW5mbzsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9kZWxiYV9yZXEgKilNc2c7CisKKwlpZiAoKE1zZ0xlbiAhPSBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGVsYmFfcmVxKSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKHBJbmZvLT5USUQgJiAweGYwKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIk1sbWVEZWxCQVJlcVNhbml0eSBmYWlsIC0gVGhlIHBlZXIgVElEIGlzIGluY29ycmVjdC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChOZGlzRXF1YWxNZW1vcnkKKwkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLAorCSAgICAgTUFDX0FERFJfTEVOKSA9PSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSB0aGUgcGVlciBhZGRyIGRvc2VuJ3QgZXhpc3QuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICogcE1zZywKKwkJCQkgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHU4ICpwQWRkcjIpCit7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIHBNc2c7CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSAqIHBBZGRGcmFtZTsKKwlwQWRkRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSAqKSAocE1zZyk7CisJaWYgKE1zZ0xlbiA8IChzaXplb2Yoc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JlcSkpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXF1ZXN0IGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwKKwkJCSAgTXNnTGVuKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuICovCisJKih1MTYgKikgKCZwQWRkRnJhbWUtPkJhUGFybSkgPQorCSAgICBjcHUybGUxNigqKHUxNiAqKSAoJnBBZGRGcmFtZS0+QmFQYXJtKSk7CiAJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CiAJcEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihwQWRkRnJhbWUtPkJhU3RhcnRTZXEud29yZCk7CiAKLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFEREJBIFJlcXVlc3QuIHRpZD0leCwgQnVmc2l6ZT0leCwgQU1TRFVTdXBwb3J0ZWQ9JXggXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQsIHBBZGRGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIHBBZGRGcmFtZS0+QmFQYXJtLkFNU0RVU3VwcG9ydGVkKSk7CisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXF1ZXN0IEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQUREQkEgUmVxdWVzdC4gdGlkPSV4LCBCdWZzaXplPSV4LCBBTVNEVVN1cHBvcnRlZD0leCBcbiIsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCwgcEFkZEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSwKKwkJCSAgcEFkZEZyYW1lLT5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KLQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotCWlmIChwQWRkRnJhbWUtPkJhUGFybS5USUQgJjB4ZmZmMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXF1ZXN0IGluY29ycmVjdCBUSUQgPSAlZFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElEKSk7CisJLyogd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuICovCisJaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmIDB4ZmZmMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVxdWVzdCBpbmNvcnJlY3QgVElEID0gJWRcbiIsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CiAJcmV0dXJuIFRSVUU7CiB9CiAKLUJPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKQorQk9PTEVBTiBQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICogcE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4pCiB7Ci0JUEZSQU1FX0FEREJBX1JTUCBwQWRkRnJhbWU7CisJc3RydWN0IHJ0X2ZyYW1lX2FkZGJhX3JzcCAqIHBBZGRGcmFtZTsKIAotCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKShwTXNnKTsKLQlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SU1ApKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOworCXBBZGRGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwICopIChwTXNnKTsKKwlpZiAoTXNnTGVuIDwgKHNpemVvZihzdHJ1Y3QgcnRfZnJhbWVfYWRkYmFfcnNwKSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGZyYW1lIGxlbmd0aCBzaXplID0gJWxkIGluY29ycmVjdFxuIiwKKwkJCSAgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOworCS8qIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLiAqLworCSoodTE2ICopICgmcEFkZEZyYW1lLT5CYVBhcm0pID0KKwkgICAgY3B1MmxlMTYoKih1MTYgKikgKCZwQWRkRnJhbWUtPkJhUGFybSkpOwogCXBBZGRGcmFtZS0+U3RhdHVzQ29kZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+U3RhdHVzQ29kZSk7CiAJcEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSk7CiAKLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJlcUFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kgIT0gSU1NRURfQkEpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIEJhIFBvbGljeVslZF0gbm90IHN1cHBvcnRcbiIsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5KSk7CiAJCXJldHVybiBGQUxTRTsKIAl9Ci0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYweGZmZjApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlBlZXJBZGRCQVJzcEFjdGlvblNhbml0eTogQUREQkEgUmVzcG9uc2UgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKKwkvKiB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4gKi8KKwlpZiAocEFkZEZyYW1lLT5CYVBhcm0uVElEICYgMHhmZmYwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBpbmNvcnJlY3QgVElEID0gJWRcbiIsCisJCQkgIHBBZGRGcmFtZS0+QmFQYXJtLlRJRCkpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCXJldHVybiBUUlVFOwogCiB9CiAKLUJPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSIFdjaWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4gKQorQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggV2NpZCwgdm9pZCAqIHBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKQogewotCS8vUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBGUkFNRV9ERUxCQV9SRVEgIHBEZWxGcmFtZTsKLQlpZiAoTXNnTGVuICE9IChzaXplb2YoRlJBTUVfREVMQkFfUkVRKSkpCisJLypzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKilwTXNnOyAqLworCXN0cnVjdCBydF9mcmFtZV9kZWxiYV9yZXEgKiBwRGVsRnJhbWU7CisJaWYgKE1zZ0xlbiAhPSAoc2l6ZW9mKHN0cnVjdCBydF9mcmFtZV9kZWxiYV9yZXEpKSkKIAkJcmV0dXJuIEZBTFNFOwogCiAJaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCiAJCXJldHVybiBGQUxTRTsKIAotCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKShwTXNnKTsKKwlwRGVsRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lX2RlbGJhX3JlcSAqKSAocE1zZyk7CiAKLQkqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CisJKih1MTYgKikgKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkgPQorCSAgICBjcHUybGUxNigqKHUxNiAqKSAoJnBEZWxGcmFtZS0+RGVsYmFQYXJtKSk7CiAJcERlbEZyYW1lLT5SZWFzb25Db2RlID0gY3B1MmxlMTYocERlbEZyYW1lLT5SZWFzb25Db2RlKTsKIAotCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5USUQgJjB4ZmZmMCkKKwlpZiAocERlbEZyYW1lLT5EZWxiYVBhcm0uVElEICYgMHhmZmYwKQogCQlyZXR1cm4gRkFMU0U7CiAKIAlyZXR1cm4gVFJVRTsKQEAgLTI0Miw0NzIgKzI0MCw0NjkgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgSU4gVUNIQVIgIE1zZ0NoYW5uZWwsCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFBVQ0hBUiBwQnNzaWQsCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0gICAgT1VUIFVDSEFSICpwQnNzVHlwZSwKLSAgICBPVVQgVVNIT1JUICpwQmVhY29uUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqcENoYW5uZWwsCi0gICAgT1VUIFVDSEFSICpwTmV3Q2hhbm5lbCwKLSAgICBPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKLSAgICBPVVQgQ0ZfUEFSTSAqcENmUGFybSwKLSAgICBPVVQgVVNIT1JUICpwQXRpbVdpbiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVDSEFSICpwRXJwLAotICAgIE9VVCBVQ0hBUiAqcER0aW1Db3VudCwKLSAgICBPVVQgVUNIQVIgKnBEdGltUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqcEJjYXN0RmxhZywKLSAgICBPVVQgVUNIQVIgKnBNZXNzYWdlVG9NZSwKLSAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0gICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotICAgIE9VVAlVQ0hBUiAqcENraXBGbGFnLAotICAgIE9VVAlVQ0hBUiAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLSAgICBPVVQgUEVEQ0FfUEFSTSAgICAgICBwRWRjYVBhcm0sCi0gICAgT1VUIFBRQlNTX0xPQURfUEFSTSAgcFFic3NMb2FkLAotICAgIE9VVCBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLSAgICBPVVQgVUxPTkcgKnBSYWxpbmtJZSwKLSAgICBPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVUNIQVIJCSAqcFByZU5IdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUIFVDSEFSCQkgKkFkZEh0SW5mb0xlbiwKLQlPVVQgQUREX0hUX0lORk9fSUUgKkFkZEh0SW5mbywKLQlPVVQgVUNIQVIgKk5ld0V4dENoYW5uZWxPZmZzZXQsCQkvLyBIdCBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQoYWJvdmUgb3IgYmVsb3cpCi0gICAgT1VUIFVTSE9SVCAqTGVuZ3RoVklFLAotICAgIE9VVAlQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKiBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB1OCBNc2dDaGFubmVsLCB1OCAqcEFkZHIyLCB1OCAqcEJzc2lkLCBjaGFyIFNzaWRbXSwgdTggKiBwU3NpZExlbiwgdTggKiBwQnNzVHlwZSwgdTE2ICogcEJlYWNvblBlcmlvZCwgdTggKiBwQ2hhbm5lbCwgdTggKiBwTmV3Q2hhbm5lbCwgT1VUIExBUkdFX0lOVEVHRVIgKiBwVGltZXN0YW1wLCBzdHJ1Y3QgcnRfY2ZfcGFybSAqIHBDZlBhcm0sIHUxNiAqIHBBdGltV2luLCB1MTYgKiBwQ2FwYWJpbGl0eUluZm8sIHU4ICogcEVycCwgdTggKiBwRHRpbUNvdW50LCB1OCAqIHBEdGltUGVyaW9kLCB1OCAqIHBCY2FzdEZsYWcsIHU4ICogcE1lc3NhZ2VUb01lLCB1OCBTdXBSYXRlW10sIHU4ICogcFN1cFJhdGVMZW4sIHU4IEV4dFJhdGVbXSwgdTggKiBwRXh0UmF0ZUxlbiwgdTggKiBwQ2tpcEZsYWcsIHU4ICogcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLCBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwgc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gKnBRb3NDYXBhYmlsaXR5LCB1bnNpZ25lZCBsb25nICogcFJhbGlua0llLCB1OCAqIHBIdENhcGFiaWxpdHlMZW4sIHU4ICogcFByZU5IdENhcGFiaWxpdHlMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgdTggKiBBZGRIdEluZm9MZW4sIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIEFkZEh0SW5mbywgdTggKiBOZXdFeHRDaGFubmVsT2Zmc2V0LAkvKiBIdCBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQoYWJvdmUgb3IgYmVsb3cpICovCisJCQkJICAgIHUxNiAqIExlbmd0aFZJRSwKKwkJCQkgICAgc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqcFZJRSkKIHsKLSAgICBDSEFSCQkJCSpQdHI7Ci0JQ0hBUiAJCQkJVGltTGVuOwotICAgIFBGUkFNRV84MDJfMTEJCXBGcmFtZTsKLSAgICBQRUlEX1NUUlVDVCAgICAgICAgIHBFaWQ7Ci0gICAgVUNIQVIJCQkJU3ViVHlwZTsKLSAgICBVQ0hBUgkJCQlTYW5pdHk7Ci0gICAgLy9VQ0hBUgkJCQlFQ1dNaW4sIEVDV01heDsKLSAgICAvL01BQ19DU1I5X1NUUlVDCQlDc3I5OwotICAgIFVMT05HCQkJCUxlbmd0aCA9IDA7CisJdTggKlB0cjsKKwl1OCBUaW1MZW47CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZTsKKwlzdHJ1Y3QgcnRfZWlkICogcEVpZDsKKwl1OCBTdWJUeXBlOworCXU4IFNhbml0eTsKKwkvKnU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ1dNaW4sIEVDV01heDsgKi8KKwkvKk1BQ19DU1I5X1NUUlVDICAgICAgICAgICAgQ3NyOTsgKi8KKwl1bnNpZ25lZCBsb25nIExlbmd0aCA9IDA7CiAKLQkvLyBGb3Igc29tZSAxMWEgQVAgd2hpY2ggZGlkbid0IGhhdmUgRFNfSUUsIHdlIHVzZSB0d28gY29uZGl0aW9ucyB0byBkZWNpZGUgdGhlIGNoYW5uZWwKLQkvLwkxLiBJZiB0aGUgQVAgaXMgMTFuIGVuYWJsZWQsIHRoZW4gY2hlY2sgdGhlIGNvbnRyb2wgY2hhbm5lbC4KLQkvLwkyLiBJZiB0aGUgQVAgZGlkbid0IGhhdmUgYW55IGluZm8gYWJvdXQgY2hhbm5lbCwgdXNlIHRoZSBjaGFubmVsIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUgYXMgdGhlIGNoYW5uZWwuIChNYXkgaW5hY2N1cmFjeSEhKQotCVVDSEFSCQkJQ3RybENoYW5uZWwgPSAwOworCS8qIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbCAqLworCS8qICAgICAgMS4gSWYgdGhlIEFQIGlzIDExbiBlbmFibGVkLCB0aGVuIGNoZWNrIHRoZSBjb250cm9sIGNoYW5uZWwuICovCisJLyogICAgICAyLiBJZiB0aGUgQVAgZGlkbid0IGhhdmUgYW55IGluZm8gYWJvdXQgY2hhbm5lbCwgdXNlIHRoZSBjaGFubmVsIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUgYXMgdGhlIGNoYW5uZWwuIChNYXkgaW5hY2N1cmFjeSEpICovCisJdTggQ3RybENoYW5uZWwgPSAwOwogCi0gICAgLy8gQWRkIGZvciAzIG5lY2Vzc2FyeSBFSUQgZmllbGQgY2hlY2sKLSAgICBTYW5pdHkgPSAwOworCS8qIEFkZCBmb3IgMyBuZWNlc3NhcnkgRUlEIGZpZWxkIGNoZWNrICovCisJU2FuaXR5ID0gMDsKIAotICAgICpwQXRpbVdpbiA9IDA7Ci0gICAgKnBFcnAgPSAwOwotICAgICpwRHRpbUNvdW50ID0gMDsKLSAgICAqcER0aW1QZXJpb2QgPSAwOwotICAgICpwQmNhc3RGbGFnID0gMDsKLSAgICAqcE1lc3NhZ2VUb01lID0gMDsKLSAgICAqcEV4dFJhdGVMZW4gPSAwOwotICAgICpwQ2tpcEZsYWcgPSAwOwkJCSAgICAgICAgLy8gRGVmYXVsdCBvZiBDa2lwRmxhZyBpcyAwCi0gICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAweEZGOyAgLy8gRGVmYXVsdCBvZiBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgaXMgMHhGRgotICAgICpMZW5ndGhWSUUgPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAotICAgICpwSHRDYXBhYmlsaXR5TGVuID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKKwkqcEF0aW1XaW4gPSAwOworCSpwRXJwID0gMDsKKwkqcER0aW1Db3VudCA9IDA7CisJKnBEdGltUGVyaW9kID0gMDsKKwkqcEJjYXN0RmxhZyA9IDA7CisJKnBNZXNzYWdlVG9NZSA9IDA7CisJKnBFeHRSYXRlTGVuID0gMDsKKwkqcENraXBGbGFnID0gMDsJCS8qIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMCAqLworCSpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsJLyogRGVmYXVsdCBvZiBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgaXMgMHhGRiAqLworCSpMZW5ndGhWSUUgPSAwOwkJLyogU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMCAqLworCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsJLyogU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMCAqLwogCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAotICAgICpBZGRIdEluZm9MZW4gPSAwOwkJCQkJLy8gU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMAotICAgICpwUmFsaW5rSWUgPSAwOwotICAgICpwTmV3Q2hhbm5lbCA9IDA7Ci0gICAgKk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwkvL0RlZmF1bHQgMHhmZiBtZWFucyBubyBzdWNoIElFCi0gICAgcENmUGFybS0+YlZhbGlkID0gRkFMU0U7ICAgICAgICAvLyBkZWZhdWx0OiBubyBJRV9DRiBmb3VuZAotICAgIHBRYnNzTG9hZC0+YlZhbGlkID0gRkFMU0U7ICAgICAgLy8gZGVmYXVsdDogbm8gSUVfUUJTU19MT0FEIGZvdW5kCi0gICAgcEVkY2FQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9FRENBX1BBUkFNRVRFUiBmb3VuZAotICAgIHBRb3NDYXBhYmlsaXR5LT5iVmFsaWQgPSBGQUxTRTsgLy8gZGVmYXVsdDogbm8gSUVfUU9TX0NBUEFCSUxJVFkgZm91bmQKKwkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLyogU2V0IHRoZSBsZW5ndGggb2YgVklFIHRvIGluaXQgdmFsdWUgMCAqLworCSpBZGRIdEluZm9MZW4gPSAwOwkvKiBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwICovCisJKnBSYWxpbmtJZSA9IDA7CisJKnBOZXdDaGFubmVsID0gMDsKKwkqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8qRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUgKi8KKwlwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsJLyogZGVmYXVsdDogbm8gSUVfQ0YgZm91bmQgKi8KKwlwUWJzc0xvYWQtPmJWYWxpZCA9IEZBTFNFOwkvKiBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQgKi8KKwlwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOwkvKiBkZWZhdWx0OiBubyBJRV9FRENBX1BBUkFNRVRFUiBmb3VuZCAqLworCXBRb3NDYXBhYmlsaXR5LT5iVmFsaWQgPSBGQUxTRTsJLyogZGVmYXVsdDogbm8gSUVfUU9TX0NBUEFCSUxJVFkgZm91bmQgKi8KIAotICAgIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBNc2c7CiAKLSAgICAvLyBnZXQgc3VidHlwZSBmcm9tIGhlYWRlcgotICAgIFN1YlR5cGUgPSAoVUNIQVIpcEZyYW1lLT5IZHIuRkMuU3ViVHlwZTsKKwkvKiBnZXQgc3VidHlwZSBmcm9tIGhlYWRlciAqLworCVN1YlR5cGUgPSAodTgpcEZyYW1lLT5IZHIuRkMuU3ViVHlwZTsKIAotICAgIC8vIGdldCBBZGRyMiBhbmQgQlNTSUQgZnJvbSBoZWFkZXIKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIENPUFlfTUFDX0FERFIocEJzc2lkLCBwRnJhbWUtPkhkci5BZGRyMyk7CisJLyogZ2V0IEFkZHIyIGFuZCBCU1NJRCBmcm9tIGhlYWRlciAqLworCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJQ09QWV9NQUNfQUREUihwQnNzaWQsIHBGcmFtZS0+SGRyLkFkZHIzKTsKIAotICAgIFB0ciA9IHBGcmFtZS0+T2N0ZXQ7Ci0gICAgTGVuZ3RoICs9IExFTkdUSF84MDJfMTE7CisJUHRyID0gcEZyYW1lLT5PY3RldDsKKwlMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKIAotICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKKwkvKiBnZXQgdGltZXN0YW1wIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCU5kaXNNb3ZlTWVtb3J5KHBUaW1lc3RhbXAsIFB0ciwgVElNRVNUQU1QX0xFTik7CiAKIAlwVGltZXN0YW1wLT51Lkxvd1BhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51Lkxvd1BhcnQpOwogCXBUaW1lc3RhbXAtPnUuSGlnaFBhcnQgPSBjcHUybGUzMihwVGltZXN0YW1wLT51LkhpZ2hQYXJ0KTsKIAotICAgIFB0ciArPSBUSU1FU1RBTVBfTEVOOwotICAgIExlbmd0aCArPSBUSU1FU1RBTVBfTEVOOworCVB0ciArPSBUSU1FU1RBTVBfTEVOOworCUxlbmd0aCArPSBUSU1FU1RBTVBfTEVOOwogCi0gICAgLy8gZ2V0IGJlYWNvbiBpbnRlcnZhbCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwQmVhY29uUGVyaW9kLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotICAgIExlbmd0aCArPSAyOworCS8qIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCisJTmRpc01vdmVNZW1vcnkocEJlYWNvblBlcmlvZCwgUHRyLCAyKTsKKwlQdHIgKz0gMjsKKwlMZW5ndGggKz0gMjsKIAotICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOwotICAgIFB0ciArPSAyOwotICAgIExlbmd0aCArPSAyOworCS8qIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCisJTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOworCVB0ciArPSAyOworCUxlbmd0aCArPSAyOwogCi0gICAgaWYgKENBUF9JU19FU1NfT04oKnBDYXBhYmlsaXR5SW5mbykpCi0gICAgICAgICpwQnNzVHlwZSA9IEJTU19JTkZSQTsKLSAgICBlbHNlCi0gICAgICAgICpwQnNzVHlwZSA9IEJTU19BREhPQzsKKwlpZiAoQ0FQX0lTX0VTU19PTigqcENhcGFiaWxpdHlJbmZvKSkKKwkJKnBCc3NUeXBlID0gQlNTX0lORlJBOworCWVsc2UKKwkJKnBCc3NUeXBlID0gQlNTX0FESE9DOwogCi0gICAgcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOworCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSBQdHI7CiAKLSAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQotICAgIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCi0gICAgICAgIC8vCi0gICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCi0gICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCS8qIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyICovCisJd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pIHsKKwkJLyogKi8KKwkJLyogU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuICovCisJCS8qICovCisJCWlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCisJCQkJICAoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpLCBNQVhfVklFX0xFTikpOworCQkJYnJlYWs7CisJCX0KIAotICAgICAgICBzd2l0Y2gocEVpZC0+RWlkKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIElFX1NTSUQ6Ci0gICAgICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgb25lIFNTSUQgRUlEIGluIHRoaXMgYmVhY29uLCBpZ25vcmUgdGhlIHNlY29uZCBvbmUKLSAgICAgICAgICAgICAgICBpZiAoU2FuaXR5ICYgMHgxKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TU0lEKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwU3NpZExlbiA9IHBFaWQtPkxlbjsKLSAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJc3dpdGNoIChwRWlkLT5FaWQpIHsKKwkJY2FzZSBJRV9TU0lEOgorCQkJLyogQWxyZWFkeSBoYXMgb25lIFNTSUQgRUlEIGluIHRoaXMgYmVhY29uLCBpZ25vcmUgdGhlIHNlY29uZCBvbmUgKi8KKwkJCWlmIChTYW5pdHkgJiAweDEpCisJCQkJYnJlYWs7CisJCQlpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1NJRCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworCQkJCSpwU3NpZExlbiA9IHBFaWQtPkxlbjsKKwkJCQlTYW5pdHkgfD0gMHgxOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIiwKKwkJCQkJICBwRWlkLT5MZW4pKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDI7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcFN1cFJhdGVMZW4gPSBwRWlkLT5MZW47CisJCWNhc2UgSUVfU1VQUF9SQVRFUzoKKwkJCWlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIHsKKwkJCQlTYW5pdHkgfD0gMHgyOworCQkJCU5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworCQkJCSpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKIAotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJLyogVE9ETzogMjAwNC0wOS0xNCBub3QgYSBnb29kIGRlc2lnbiBoZXJlLCBjYXVzZSBpdCBleGNsdWRlIGV4dHJhIHJhdGVzICovCisJCQkJLyogZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZCAqLworCQkJCS8qIHJhdGVzIGluIE1sbWVBdXguICovCisJCQkJLyogQ2hlY2sgYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHJhdGVzICovCisJCQkJLyogUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7ICovCisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTIChsZW49JWQpXG4iLAorCQkJCQkgIHBFaWQtPkxlbikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0hUX0NBUDoKLQkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpICAvL05vdGU6IGFsbG93IGV4dGVuc2lvbi4hIQorCQljYXNlIElFX0hUX0NBUDoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpCS8qTm90ZTogYWxsb3cgZXh0ZW5zaW9uISAqLwogCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCQkJCSpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7CS8vIE5ub3cgd2Ugb25seSBzdXBwb3J0IDI2IGJ5dGVzLgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llKSk7CisJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLyogTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuICovCiAKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkqKHUxNiAqKSAoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPQorCQkJCSAgICBjcHUybGUxNigqKHUxNiAqKQorCQkJCQkgICAgICgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKih1MTYgKikgKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOwogCiAJCQkJewotCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSAwOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCQkJKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsJLyogTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuICovCiAKLQkJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7CisJCQkJCVB0ciA9ICh1OCAqKXBWSUU7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsCisJCQkJCQkgICAgICAgJnBFaWQtPkVpZCwKKwkJCQkJCSAgICAgICBwRWlkLT5MZW4gKyAyKTsKIAkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLiBwRWlkLT5MZW4gPSAlZFxuIiwgcEVpZC0+TGVuKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsCisJCQkJCSAgcEVpZC0+TGVuKSk7CiAJCQl9CiAKLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKLQkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKLQkJCXsKLQkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQotCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQotCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsIHNpemVvZihBRERfSFRfSU5GT19JRSkpOworCQkJYnJlYWs7CisJCWNhc2UgSUVfQUREX0hUOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSkgeworCQkJCS8qIFRoaXMgSUUgYWxsb3dzIGV4dGVuc2lvbiwgYnV0IHdlIGNhbiBpZ25vcmUgZXh0cmEgYnl0ZXMgYmV5b25kIG91ciBrbm93bGVkZ2UgLCBzbyBvbmx5ICovCisJCQkJLyogY29weSBmaXJzdCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgcEVpZC0+T2N0ZXQsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CiAJCQkJKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7CiAKIAkJCQlDdHJsQ2hhbm5lbCA9IEFkZEh0SW5mby0+Q29udHJvbENoYW47CiAKLQkJCQkqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKLQkJCQkqKFVTSE9SVCAqKSgmQWRkSHRJbmZvLT5BZGRIdEluZm8zKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKKwkJCQkqKHUxNiAqKSAoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikgPQorCQkJCSAgICBjcHUybGUxNigqKHUxNiAqKQorCQkJCQkgICAgICgmQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7CisJCQkJKih1MTYgKikgKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykpOwogCiAJCQkJewotCQkJICAgICAgICAgICAgICAgIFB0ciA9IChQVUNIQVIpIHBWSUU7Ci0JCQkgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7Ci0JCQkgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CisJCQkJCVB0ciA9ICh1OCAqKXBWSUU7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsCisJCQkJCQkgICAgICAgJnBFaWQtPkVpZCwKKwkJCQkJCSAgICAgICBwRWlkLT5MZW4gKyAyKTsKKwkJCQkJKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKIAkJCX0KIAotCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSUVfU0VDT05EQVJZX0NIX09GRlNFVDoKLQkJCWlmIChwRWlkLT5MZW4gPT0gMSkKLQkJCXsKKwkJCWJyZWFrOworCQljYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpIHsKIAkJCQkqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IHBFaWQtPk9jdGV0WzBdOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NFQ09OREFSWV9DSF9PRkZTRVQuIFxuIikpOwogCQkJfQogCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9GSF9QQVJNOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShJRV9GSF9QQVJNKSBcbiIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCWJyZWFrOworCQljYXNlIElFX0ZIX1BBUk06CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBJRV9EU19QQVJNOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKnBDaGFubmVsID0gKnBFaWQtPk9jdGV0OworCQljYXNlIElFX0RTX1BBUk06CisJCQlpZiAocEVpZC0+TGVuID09IDEpIHsKKwkJCQkqcENoYW5uZWwgPSAqcEVpZC0+T2N0ZXQ7CiAKLQkJCQkJewotCQkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApCi0JCQkJCQl7CisJCQkJeworCQkJCQlpZiAoQ2hhbm5lbFNhbml0eShwQWQsICpwQ2hhbm5lbCkgPT0gMCkgewogCi0JCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCQkJfQorCQkJCQkJcmV0dXJuIEZBTFNFOwogCQkJCQl9CisJCQkJfQogCi0gICAgICAgICAgICAgICAgICAgIFNhbml0eSB8PSAweDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0RTX1BBUk0gKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJU2FuaXR5IHw9IDB4NDsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0RTX1BBUk0gKGxlbj0lZClcbiIsCisJCQkJCSAgcEVpZC0+TGVuKSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfQ0ZfUEFSTToKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPmJWYWxpZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcENvdW50ID0gcEVpZC0+T2N0ZXRbMF07Ci0gICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcFBlcmlvZCA9IHBFaWQtPk9jdGV0WzFdOwotICAgICAgICAgICAgICAgICAgICBwQ2ZQYXJtLT5DZnBNYXhEdXJhdGlvbiA9IHBFaWQtPk9jdGV0WzJdICsgMjU2ICogcEVpZC0+T2N0ZXRbM107Ci0gICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcER1clJlbWFpbmluZyA9IHBFaWQtPk9jdGV0WzRdICsgMjU2ICogcEVpZC0+T2N0ZXRbNV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0NGX1BBUk1cbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBJRV9DRl9QQVJNOgorCQkJaWYgKHBFaWQtPkxlbiA9PSA2KSB7CisJCQkJcENmUGFybS0+YlZhbGlkID0gVFJVRTsKKwkJCQlwQ2ZQYXJtLT5DZnBDb3VudCA9IHBFaWQtPk9jdGV0WzBdOworCQkJCXBDZlBhcm0tPkNmcFBlcmlvZCA9IHBFaWQtPk9jdGV0WzFdOworCQkJCXBDZlBhcm0tPkNmcE1heER1cmF0aW9uID0KKwkJCQkgICAgcEVpZC0+T2N0ZXRbMl0gKyAyNTYgKiBwRWlkLT5PY3RldFszXTsKKwkJCQlwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmcgPQorCQkJCSAgICBwRWlkLT5PY3RldFs0XSArIDI1NiAqIHBFaWQtPk9jdGV0WzVdOworCQkJfSBlbHNlIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQ0ZfUEFSTVxuIikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0lCU1NfUEFSTToKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSUJTU19QQVJNXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfSUJTU19QQVJNOgorCQkJaWYgKHBFaWQtPkxlbiA9PSAyKSB7CisJCQkJTmRpc01vdmVNZW1vcnkocEF0aW1XaW4sIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgcEVpZC0+TGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0lCU1NfUEFSTVxuIikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX1RJTToKLSAgICAgICAgICAgICAgICBpZihJTkZSQV9PTihwQWQpICYmIFN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHZXRUaW1CaXQoKFBVQ0hBUilwRWlkLCBwQWQtPlN0YUFjdGl2ZS5BaWQsICZUaW1MZW4sIHBCY2FzdEZsYWcsIHBEdGltQ291bnQsIHBEdGltUGVyaW9kLCBwTWVzc2FnZVRvTWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBJRV9USU06CisJCQlpZiAoSU5GUkFfT04ocEFkKSAmJiBTdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKSB7CisJCQkJR2V0VGltQml0KChjaGFyICopcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLAorCQkJCQkgICZUaW1MZW4sIHBCY2FzdEZsYWcsIHBEdGltQ291bnQsCisJCQkJCSAgcER0aW1QZXJpb2QsIHBNZXNzYWdlVG9NZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ6CisJCQlpZiAocEVpZC0+TGVuID09IDMpIHsKKwkJCQkqcE5ld0NoYW5uZWwgPSBwRWlkLT5PY3RldFsxXTsJLypleHRyYWN0IG5ldyBjaGFubmVsIG51bWJlciAqLworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSAzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAJKnBOZXdDaGFubmVsID0gcEVpZC0+T2N0ZXRbMV07CS8vZXh0cmFjdCBuZXcgY2hhbm5lbCBudW1iZXIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkvKiBOZXcgZm9yIFdQQSAqLworCQkJLyogQ0NYIHYyIGhhcyB0aGUgc2FtZSBJRSwgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHRvbyAqLworCQkJLyogV2lmaSBXTU0gdXNlIHRoZSBzYW1lIElFIHZhbGUsIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28gKi8KKwkJCS8qIGNhc2UgSUVfV1BBOiAqLworCQljYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKKwkJCS8qIENoZWNrIEJyb2FkY29tL0F0aGVyb3MgODAyLjExbiBPVUkgdmVyc2lvbiwgZm9yIEhUIENhcGFiaWxpdHkgSUUuICovCisJCQkvKiBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4gKi8KKwkJCS8qaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgQlJPQURDT01fT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpKQorCQkJICAgeworCQkJICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfQlJPQURDT01fSFQpICYmIChwRWlkLT5MZW4gPj0gMzApKQorCQkJICAgeworCQkJICAgeworCQkJICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2Yoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpKTsKKwkJCSAgICpwSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7ICAvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KKwkJCSAgIH0KKwkJCSAgIH0KKwkJCSAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX0JST0FEQ09NX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKKwkJCSAgIHsKKwkJCSAgIHsKKwkJCSAgIE5kaXNNb3ZlTWVtb3J5KEFkZEh0SW5mbywgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CisJCQkgICAqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsgLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCisJCQkgICB9CisJCQkgICB9CisJCQkgICB9CisJCQkgKi8KKwkJCS8qIENoZWNrIHRoZSBPVUkgdmVyc2lvbiwgZmlsdGVyIG91dCBub24tc3RhbmRhcmQgdXNhZ2UgKi8KKwkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFJBTElOS19PVUksIDMpCisJCQkgICAgJiYgKHBFaWQtPkxlbiA9PSA3KSkgeworCQkJCS8qKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOyAqLworCQkJCWlmIChwRWlkLT5PY3RldFszXSAhPSAwKQorCQkJCQkqcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107CisJCQkJZWxzZQorCQkJCQkqcFJhbGlua0llID0gMHhmMDAwMDAwMDsJLyogU2V0IHRvIG5vbi16ZXJvIHZhbHVlIChjYW4ndCBzZXQgYml0MC0yKSB0byByZXByZXNlbnQgdGhpcyBpcyBSYWxpbmsgQ2hpcC4gU28gYXQgbGlua3VwLCB3ZSB3aWxsIHNldCByYWxpbmtjaGlwIGZsYWcuICovCisJCQl9CisJCQkvKiBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4gKi8KIAotICAgICAgICAgICAgLy8gTmV3IGZvciBXUEEKLSAgICAgICAgICAgIC8vIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KLSAgICAgICAgICAgIC8vIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCi0gICAgICAgICAgICAvLyBjYXNlIElFX1dQQToKLSAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBPVUkgdmVyc2lvbiwgZmlsdGVyIG91dCBub24tc3RhbmRhcmQgdXNhZ2UKLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBSQUxJTktfT1VJLCAzKSAmJiAocEVpZC0+TGVuID09IDcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8qcFJhbGlua0llID0gcEVpZC0+T2N0ZXRbM107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWlkLT5PY3RldFszXSAhPSAwKQotICAgICAgICAJCQkJKnBSYWxpbmtJZSA9IHBFaWQtPk9jdGV0WzNdOwotICAgICAgICAJCQllbHNlCi0gICAgICAgIAkJCQkqcFJhbGlua0llID0gMHhmMDAwMDAwMDsgLy8gU2V0IHRvIG5vbi16ZXJvIHZhbHVlIChjYW4ndCBzZXQgYml0MC0yKSB0byByZXByZXNlbnQgdGhpcyBpcyBSYWxpbmsgQ2hpcC4gU28gYXQgbGlua3VwLCB3ZSB3aWxsIHNldCByYWxpbmtjaGlwIGZsYWcuCi0gICAgICAgICAgICAgICAgfQotCQkvLyBUaGlzIEhUIElFIGlzIGJlZm9yZSBJRUVFIGRyYWZ0IHNldCBIVCBJRSB2YWx1ZS4yMDA2LTA5LTI4IGJ5IEphbi4KKwkJCS8qIE90aGVyIHZlbmRvcnMgaGFkIHByb2R1Y3Rpb24gYmVmb3JlIElFX0hUX0NBUCB2YWx1ZSBpcyBhc3NpZ25lZC4gVG8gYmFja3dhcmQgc3VwcG9ydCB0aG9zZSBvbGQtZmlybXdhcmUgQVAsICovCisJCQkvKiBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFICovCisJCQllbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkKKwkJCQkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksCisJCQkJCQkgICAgMykgJiYgKHBFaWQtPkxlbiA+PSA0KQorCQkJCSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKKwkJCQlpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0hUX0NBUCkKKwkJCQkgICAgJiYgKHBFaWQtPkxlbiA+PSAzMCkKKwkJCQkgICAgJiYgKCpwSHRDYXBhYmlsaXR5TGVuID09IDApKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksCisJCQkJCQkgICAgICAgJnBFaWQtPk9jdGV0WzRdLAorCQkJCQkJICAgICAgIHNpemVvZgorCQkJCQkJICAgICAgIChzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSkpOworCQkJCQkqcFByZU5IdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKKwkJCQl9CiAKLSAgICAgICAgICAgICAgICAvLyBPdGhlciB2ZW5kb3JzIGhhZCBwcm9kdWN0aW9uIGJlZm9yZSBJRV9IVF9DQVAgdmFsdWUgaXMgYXNzaWduZWQuIFRvIGJhY2t3YXJkIHN1cHBvcnQgdGhvc2Ugb2xkLWZpcm13YXJlIEFQLAotICAgICAgICAgICAgICAgIC8vIENoZWNrIGJyb2FkY29tLWRlZmllbmQgcHJlLTgwMi4xMW5EMS4wIE9VSSBmb3IgSFQgcmVsYXRlZCBJRSwgaW5jbHVkaW5nIEhUIENhcGF0aWxpdGllcyBJRSBhbmQgSFQgSW5mb3JtYXRpb24gSUUKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYgTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBQUkVfTl9IVF9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9IVF9DQVApICYmIChwRWlkLT5MZW4gPj0gMzApICYmICgqcEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnBQcmVOSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKwkJCQlpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9QUkVOX0FERF9IVCkKKwkJCQkgICAgJiYgKHBFaWQtPkxlbiA+PSAyNikpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkoQWRkSHRJbmZvLAorCQkJCQkJICAgICAgICZwRWlkLT5PY3RldFs0XSwKKwkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CisJCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkgeworCQkJCS8qIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4gKi8KKwkJCQlQdHIgPSAodTggKilwVklFOworCQkJCU5kaXNNb3ZlTWVtb3J5KFB0ciArICpMZW5ndGhWSUUsICZwRWlkLT5FaWQsCisJCQkJCSAgICAgICBwRWlkLT5MZW4gKyAyKTsKKwkJCQkqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJCX0gZWxzZQorCQkJICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpCisJCQkJJiYgKHBFaWQtPkxlbiA9PSAyNCkpIHsKKwkJCQl1OCAqcHRyOworCQkJCWludCBpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fQUREX0hUKSAmJiAocEVpZC0+TGVuID49IDI2KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQWRkSHRJbmZvLCAmcEVpZC0+T2N0ZXRbNF0sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKkFkZEh0SW5mb0xlbiA9IFNJWkVfQUREX0hUX0lORk9fSUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKLSAgICAgICAgICAgICAgICAgICAgaW50IGk7CisJCQkJLyogcGFyc2luZyBFRENBIHBhcmFtZXRlcnMgKi8KKwkJCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7CisJCQkJcEVkY2FQYXJtLT5iUUFjayA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4MTA7ICovCisJCQkJcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsgKi8KKwkJCQlwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4NDA7ICovCisJCQkJcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPQorCQkJCSAgICBwRWlkLT5PY3RldFs2XSAmIDB4MGY7CisJCQkJcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgPQorCQkJCSAgICAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOworCQkJCXB0ciA9ICZwRWlkLT5PY3RldFs4XTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJCXU4IGFjaSA9ICgqcHRyICYgMHg2MCkgPj4gNTsJLyogYjV+NiBpcyBBQyBJTkRFWCAqLworCQkJCQlwRWRjYVBhcm0tPmJBQ01bYWNpXSA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7CS8qIGI1IGlzIEFDTSAqLworCQkJCQlwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOwkvKiBiMH4zIGlzIEFJRlNOICovCisJCQkJCXBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyICsgMSkgJiAweDBmOwkvKiBiMH40IGlzIEN3bWluICovCisJCQkJCXBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyICsgMSkgPj4gNDsJLyogYjV+OCBpcyBDd21heCAqLworCQkJCQlwRWRjYVBhcm0tPlR4b3BbYWNpXSA9ICoocHRyICsgMikgKyAyNTYgKiAoKihwdHIgKyAzKSk7CS8qIGluIHVuaXQgb2YgMzItdXMgKi8KKwkJCQkJcHRyICs9IDQ7CS8qIHBvaW50IHRvIG5leHQgQUMgKi8KKwkJCQl9CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfSU5GT19FTEVNLCA2KQorCQkJCSYmIChwRWlkLT5MZW4gPT0gNykpIHsKKwkJCQkvKiBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycyAqLworCQkJCXBFZGNhUGFybS0+YlZhbGlkID0gVFJVRTsKKwkJCQlwRWRjYVBhcm0tPmJRQWNrID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsgKi8KKwkJCQlwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDIwOyAqLworCQkJCXBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ID0gRkFMU0U7CS8qIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsgKi8KKwkJCQlwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9CisJCQkJICAgIHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKKwkJCQlwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSA9CisJCQkJICAgIChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICBwdHIgPSAmcEVpZC0+T2N0ZXRbOF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX0lORk9fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSA3KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKwkJCQkvKiB1c2UgZGVmYXVsdCBFRENBIHBhcmFtZXRlciAqLworCQkJCXBFZGNhUGFybS0+YkFDTVtRSURfQUNfQkVdID0gMDsKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV0gPSAzOworCQkJCXBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXSA9IENXX01JTl9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXSA9IENXX01BWF9JTl9CSVRTOworCQkJCXBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdID0gMDsKIAotICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBFRENBIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JFXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV0gPSAzOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV0gPSBDV19NSU5fSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQkVdID0gQ1dfTUFYX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdICA9IDA7CisJCQkJcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19CS10gPSAwOworCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7CisJCQkJcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQktdID0gQ1dfTUlOX0lOX0JJVFM7CisJCQkJcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7CisJCQkJcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gPSAwOwogCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQktdICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JLXSA9IDc7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXSA9IENXX01JTl9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CS10gPSBDV19NQVhfSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS10gID0gMDsKKwkJCQlwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZJXSA9IDA7CisJCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID0gMjsKKwkJCQlwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV0gPQorCQkJCSAgICBDV19NSU5fSU5fQklUUyAtIDE7CisJCQkJcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldID0gQ1dfTUFYX0lOX0JJVFM7CisJCQkJcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gPSA5NjsJLyogQUNfVkk6IDk2KjMydXMgfj0gM21zICovCiAKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID0gMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0gQ1dfTUlOX0lOX0JJVFMtMTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldID0gQ1dfTUFYX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICA9IDk2OyAgIC8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcworCQkJCXBFZGNhUGFybS0+YkFDTVtRSURfQUNfVk9dID0gMDsKKwkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT10gPSAyOworCQkJCXBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSA9CisJCQkJICAgIENXX01JTl9JTl9CSVRTIC0gMjsKKwkJCQlwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT10gPQorCQkJCSAgICBDV19NQVhfSU5fQklUUyAtIDE7CisJCQkJcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WT10gPSA0ODsJLyogQUNfVk86IDQ4KjMydXMgfj0gMS41bXMgKi8KKwkJCX0KIAotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX1ZPXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WT10gPSAyOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gPSBDV19NSU5fSU5fQklUUy0yOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT10gPSBDV19NQVhfSU5fQklUUy0xOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXSAgPSA0ODsgICAvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOworCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorCQkJaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgeworCQkJCU5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworCQkJCSpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKIAotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBFeHRSYXRlLCBwRXh0UmF0ZUxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCS8qIFRPRE86IDIwMDQtMDktMTQgbm90IGEgZ29vZCBkZXNpZ24gaGVyZSwgY2F1c2UgaXQgZXhjbHVkZSBleHRyYSByYXRlcyAqLworCQkJCS8qIGZyb20gU2NhblRhYi4gV2Ugc2hvdWxkIHJlcG9ydCBhcyBpcy4gQW5kIGZpbHRlciBvdXQgdW5zdXBwb3J0ZWQgKi8KKwkJCQkvKiByYXRlcyBpbiBNbG1lQXV4LiAqLworCQkJCS8qIENoZWNrIGFnYWluc3QgdGhlIHN1cHBvcnRlZCByYXRlcyAqLworCQkJCS8qIFJUTVBDaGVja1JhdGVzKHBBZCwgRXh0UmF0ZSwgcEV4dFJhdGVMZW4pOyAqLworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgSUVfRVJQOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwRXJwID0gKFVDSEFSKXBFaWQtPk9jdGV0WzBdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBJRV9FUlA6CisJCQlpZiAocEVpZC0+TGVuID09IDEpIHsKKwkJCQkqcEVycCA9ICh1OClwRWlkLT5PY3RldFswXTsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKLSAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKLSAgICAgICAgICAgICAgICAvLyBDaXNjbyBBUDM1MCB1c2VkIGxlbmd0aCBhcyAyOAotICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMTJYWCB1c2VkIGxlbmd0aCBhcyAzMAotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgSUVfQUlST05FVF9DS0lQOgorCQkJLyogMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIDI4ICovCisJCQkvKiBDaXNjbyBBUDM1MCB1c2VkIGxlbmd0aCBhcyAyOCAqLworCQkJLyogQ2lzY28gQVAxMlhYIHVzZWQgbGVuZ3RoIGFzIDMwICovCisJCQlpZiAocEVpZC0+TGVuIDwgKENLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMikpCisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAvLyAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcwotICAgICAgICAgICAgICAgICpwQ2tpcEZsYWcgPSAqKHBFaWQtPk9jdGV0ICsgOCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkvKiAxLiBDb3B5IENLSVAgZmxhZyBieXRlIHRvIGJ1ZmZlciBmb3IgcHJvY2VzcyAqLworCQkJKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKKwkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIElFX0FQX1RYX1BPV0VSOgotICAgICAgICAgICAgICAgIC8vIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0gICAgICAgICAgICAgICAgLy8wLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSA2Ci0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiAhPSAweDA2KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKKwkJCS8qIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyICovCisJCQkvKjAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIDYgKi8KKwkJCWlmIChwRWlkLT5MZW4gIT0gMHgwNikKKwkJCQlicmVhazsKIAotICAgICAgICAgICAgICAgIC8vIEdldCBjZWxsIHBvd2VyIGxpbWl0IGluIGRCbQotICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgKnBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPSAqKHBFaWQtPk9jdGV0ICsgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQkvKiBHZXQgY2VsbCBwb3dlciBsaW1pdCBpbiBkQm0gKi8KKwkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKKwkJCQkqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA9ICoocEVpZC0+T2N0ZXQgKyA0KTsKKwkJCWJyZWFrOwogCi0gICAgICAgICAgICAvLyBXUEEyICYgODAyLjExaSBSU04KLSAgICAgICAgICAgIGNhc2UgSUVfUlNOOgotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIE9VSSBmb3IgdmVyc2lvbiBhbnltb3JlLCBjaGVjayB0aGUgZ3JvdXAgY2lwaGVyIE9VSSBiZWZvcmUgY29weWluZwotICAgICAgICAgICAgICAgIGlmIChSVE1QRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCS8qIFdQQTIgJiA4MDIuMTFpIFJTTiAqLworCQljYXNlIElFX1JTTjoKKwkJCS8qIFRoZXJlIGlzIG5vIE9VSSBmb3IgdmVyc2lvbiBhbnltb3JlLCBjaGVjayB0aGUgZ3JvdXAgY2lwaGVyIE9VSSBiZWZvcmUgY29weWluZyAqLworCQkJaWYgKFJUTVBFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKSB7CisJCQkJLyogQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LiAqLworCQkJCVB0ciA9ICh1OCAqKXBWSUU7CisJCQkJTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwKKwkJCQkJICAgICAgIHBFaWQtPkxlbiArIDIpOworCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOworCQkJfQorCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCi0gICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotICAgIH0KKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsJLyogRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0gKi8KKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KIAotICAgIC8vIEZvciBzb21lIDExYSBBUC4gaXQgZGlkIG5vdCBoYXZlIHRoZSBjaGFubmVsIEVJRCwgcGF0Y2ggaGVyZQorCS8qIEZvciBzb21lIDExYSBBUC4gaXQgZGlkIG5vdCBoYXZlIHRoZSBjaGFubmVsIEVJRCwgcGF0Y2ggaGVyZSAqLwogCXsKLQkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOwotCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCi0JCXsKKwkJdTggTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOworCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpIHsKIAkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQogCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOwogCQkJZWxzZQpAQCAtNzE2LDEzICs3MTEsMTIgQEAKIAkJfQogCX0KIAotCWlmIChTYW5pdHkgIT0gMHg3KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKKwlpZiAoU2FuaXR5ICE9IDB4NykgeworCQlEQkdQUklOVChSVF9ERUJVR19MT1VELAorCQkJICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gbWlzc2luZyBmaWVsZCwgU2FuaXR5PTB4JTAyeFxuIiwKKwkJCSAgU2FuaXR5KSk7CiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlyZXR1cm4gVFJVRTsKIAl9CiAKQEAgLTczNiw1MSArNzMwLDQyIEBACiAgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1sbWVTY2FuUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFVDSEFSICpwQnNzVHlwZSwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpwU3NpZExlbiwKLQlPVVQgVUNIQVIgKnBTY2FuVHlwZSkKK0JPT0xFQU4gTWxtZVNjYW5SZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB2b2lkICogTXNnLAorCQkJICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgdTggKiBwQnNzVHlwZSwKKwkJCSAgY2hhciBTc2lkW10sCisJCQkgIHU4ICogcFNzaWRMZW4sIHU4ICogcFNjYW5UeXBlKQogewotCU1MTUVfU0NBTl9SRVFfU1RSVUNUICpJbmZvOworCXN0cnVjdCBydF9tbG1lX3NjYW5fcmVxICpJbmZvOwogCi0JSW5mbyA9IChNTE1FX1NDQU5fUkVRX1NUUlVDVCAqKShNc2cpOworCUluZm8gPSAoc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEgKikoTXNnKTsKIAkqcEJzc1R5cGUgPSBJbmZvLT5Cc3NUeXBlOwogCSpwU3NpZExlbiA9IEluZm8tPlNzaWRMZW47CiAJTmRpc01vdmVNZW1vcnkoU3NpZCwgSW5mby0+U3NpZCwgKnBTc2lkTGVuKTsKIAkqcFNjYW5UeXBlID0gSW5mby0+U2NhblR5cGU7CiAKLQlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQyB8fCAqcEJzc1R5cGUgPT0gQlNTX0FOWSkKLQkJJiYgKCpwU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUKLQkJfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX1BBU1NJVkUgfHwgKnBTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0FDVElWRQotCQl8fCAqcFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9DSVNDT19OT0lTRQotCQkpKQotCXsKKwlpZiAoKCpwQnNzVHlwZSA9PSBCU1NfSU5GUkEgfHwgKnBCc3NUeXBlID09IEJTU19BREhPQworCSAgICAgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCisJICAgICYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFKSkgewogCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFTYW5pdHkgZmFpbCAtIHdyb25nIEJzc1R5cGUgb3IgU2NhblR5cGVcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1sbWVTY2FuUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBCc3NUeXBlIG9yIFNjYW5UeXBlXG4iKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVUNIQVIgQ2hhbm5lbFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBVQ0hBUiBjaGFubmVsKQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit1OCBDaGFubmVsU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggY2hhbm5lbCkKIHsKLSAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpICsrKQotICAgIHsKLSAgICAgICAgaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspIHsKKwkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwogfQogCiAvKgpAQCAtNzk0LDE5ICs3NzksMTcgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gUGVlckRlYXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCitCT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHZvaWQgKiBNc2csCisJCQkgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgdTggKnBBZGRyMiwgdTE2ICogcFJlYXNvbikKIHsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CisJQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKwlOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7CiAKLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTgyMCw1OCArODAzLDQ2IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJBdXRoU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkciwKLSAgICBPVVQgVVNIT1JUICpwQWxnLAotICAgIE9VVCBVU0hPUlQgKnBTZXEsCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBDSEFSICpwQ2hsZ1RleHQpCitCT09MRUFOIFBlZXJBdXRoU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHZvaWQgKiBNc2csCisJCSAgICAgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJICAgICAgIHU4ICpwQWRkciwKKwkJICAgICAgIHUxNiAqIHBBbGcsCisJCSAgICAgICB1MTYgKiBwU2VxLAorCQkgICAgICAgdTE2ICogcFN0YXR1cywgY2hhciAqIHBDaGxnVGV4dCkKIHsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgQ09QWV9NQUNfQUREUihwQWRkciwgICBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFsZywgICAgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTZXEsICAgICZwRnJhbWUtPk9jdGV0WzJdLCAyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7CisJQ09QWV9NQUNfQUREUihwQWRkciwgcEZyYW1lLT5IZHIuQWRkcjIpOworCU5kaXNNb3ZlTWVtb3J5KHBBbGcsICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKwlOZGlzTW92ZU1lbW9yeShwU2VxLCAmcEZyYW1lLT5PY3RldFsyXSwgMik7CisJTmRpc01vdmVNZW1vcnkocFN0YXR1cywgJnBGcmFtZS0+T2N0ZXRbNF0sIDIpOwogCi0gICAgaWYgKCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotICAgICAgKQotICAgIHsKLSAgICAgICAgaWYgKCpwU2VxID09IDEgfHwgKnBTZXEgPT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgU2VnI1xuIikpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCpwQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLSAgICB7Ci0gICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCpwU2VxID09IDIgfHwgKnBTZXEgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocENobGdUZXh0LCAmcEZyYW1lLT5PY3RldFs4XSwgQ0lQSEVSX1RFWFRfTEVOKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKCpwQWxnID09IEFVVEhfTU9ERV9PUEVOKSB7CisJCWlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDIpIHsKKwkJCXJldHVybiBUUlVFOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0gZWxzZSBpZiAoKnBBbGcgPT0gQVVUSF9NT0RFX0tFWSkgeworCQlpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSA0KSB7CisJCQlyZXR1cm4gVFJVRTsKKwkJfSBlbHNlIGlmICgqcFNlcSA9PSAyIHx8ICpwU2VxID09IDMpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBDaGxnVGV4dCwgJnBGcmFtZS0+T2N0ZXRbOF0sCisJCQkJICAgICAgIENJUEhFUl9URVhUX0xFTik7CisJCQlyZXR1cm4gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIH0KIAogLyoKQEAgLTg4MiwzMiArODUzLDI3IEBACiAgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkciwKLSAgICBPVVQgVUxPTkcgKnBUaW1lb3V0LAotICAgIE9VVCBVU0hPUlQgKnBBbGcpCitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdm9pZCAqIE1zZywKKwkJCSAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgIHU4ICpwQWRkciwKKwkJCSAgdW5zaWduZWQgbG9uZyAqIHBUaW1lb3V0LCB1MTYgKiBwQWxnKQogewotICAgIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKKwlzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSAqcEluZm87CiAKLSAgICBwSW5mbyAgPSAoTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKilNc2c7Ci0gICAgQ09QWV9NQUNfQUREUihwQWRkciwgcEluZm8tPkFkZHIpOwotICAgICpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OwotICAgICpwQWxnID0gcEluZm8tPkFsZzsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSAqKU1zZzsKKwlDT1BZX01BQ19BRERSKHBBZGRyLCBwSW5mby0+QWRkcik7CisJKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7CisJKnBBbGcgPSBwSW5mby0+QWxnOwogCi0gICAgaWYgKCgoKnBBbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fCgqcEFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotICAgICAJKSAmJgotICAgICAgICAoKCpwQWRkciAmIDB4MDEpID09IDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKwlpZiAoKCgqcEFsZyA9PSBBVVRIX01PREVfS0VZKSB8fCAoKnBBbGcgPT0gQVVUSF9NT0RFX09QRU4pCisJICAgICkgJiYgKCgqcEFkZHIgJiAweDAxKSA9PSAwKSkgeworCQlyZXR1cm4gVFJVRTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1sbWVBdXRoUmVxU2FuaXR5IGZhaWwgLSB3cm9uZyBhbGdvcml0aG1cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIH0KIAogLyoKQEAgLTkyMSwyNCArODg3LDIyIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFwQWRkciwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVMT05HICpwVGltZW91dCwKLSAgICBPVVQgVVNIT1JUICpwTGlzdGVuSW50dikKK0JPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgIHU4ICpwQXBBZGRyLAorCQkJICAgdTE2ICogcENhcGFiaWxpdHlJbmZvLAorCQkJICAgdW5zaWduZWQgbG9uZyAqIHBUaW1lb3V0LCB1MTYgKiBwTGlzdGVuSW50dikKIHsKLSAgICBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKnBJbmZvOworCXN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSAqcEluZm87CiAKLSAgICBwSW5mbyA9IChNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKilNc2c7Ci0gICAgKnBUaW1lb3V0ID0gcEluZm8tPlRpbWVvdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0Ci0gICAgQ09QWV9NQUNfQUREUihwQXBBZGRyLCBwSW5mby0+QWRkcik7ICAgICAgICAgICAgICAgICAgIC8vIEFQIGFkZHJlc3MKLSAgICAqcENhcGFiaWxpdHlJbmZvID0gcEluZm8tPkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgIC8vIGNhcGFiaWxpdHkgaW5mbwotICAgICpwTGlzdGVuSW50diA9IHBJbmZvLT5MaXN0ZW5JbnR2OworCXBJbmZvID0gKHN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSAqKU1zZzsKKwkqcFRpbWVvdXQgPSBwSW5mby0+VGltZW91dDsJLyogdGltZW91dCAqLworCUNPUFlfTUFDX0FERFIocEFwQWRkciwgcEluZm8tPkFkZHIpOwkvKiBBUCBhZGRyZXNzICovCisJKnBDYXBhYmlsaXR5SW5mbyA9IHBJbmZvLT5DYXBhYmlsaXR5SW5mbzsJLyogY2FwYWJpbGl0eSBpbmZvICovCisJKnBMaXN0ZW5JbnR2ID0gcEluZm8tPkxpc3RlbkludHY7CiAKLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTk1MiwxOSArOTE2LDE3IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFkZHIyLCB1MTYgKiBwUmVhc29uKQogewotICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnJhbWUgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBNc2c7CiAKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOworCU5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKIAotICAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOwogfQogCiAvKgpAQCAtOTg0LDcxICs5NDYsMjYwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eSgKLSAgICBJTiBQQlNTX0VOVFJZIHBCc3MpCitORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eShzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzKQogewotCU5ESVNfODAyXzExX05FVFdPUktfVFlQRQlOZXRXb3JrVHlwZTsKLQlVQ0hBUgkJCQkJCXJhdGUsIGk7CisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldFdvcmtUeXBlOworCXU4IHJhdGUsIGk7CiAKIAlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFEUzsKIAotCWlmIChwQnNzLT5DaGFubmVsIDw9IDE0KQotCXsKLQkJLy8KLQkJLy8gRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLgotCQkvLwotCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKQotCQl7Ci0JCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7IC8vIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdAotCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCi0JCQl7CisJaWYgKHBCc3MtPkNoYW5uZWwgPD0gMTQpIHsKKwkJLyogKi8KKwkJLyogRmlyc3QgY2hlY2sgc3VwcG9ydCBSYXRlLiAqLworCQkvKiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+U3VwUmF0ZUxlbjsgaSsrKSB7CisJCQlyYXRlID0gcEJzcy0+U3VwUmF0ZVtpXSAmIDB4N2Y7CS8qIE1hc2sgb3V0IGJhc2ljIHJhdGUgc2V0IGJpdCAqLworCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKQorCQkJICAgIHx8IChyYXRlID09IDIyKSkgewogCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKLQkJCQkvLworCQkJfSBlbHNlIHsKKwkJCQkvKiAqLworCQkJCS8qIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0ICovCisJCQkJLyogKi8KIAkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAotCQkvLwotCQkvLyBTZWNvbmQgY2hlY2sgRXh0ZW5kIFJhdGUuCi0JCS8vCi0JCWlmIChOZXRXb3JrVHlwZSAhPSBOZGlzODAyXzExT0ZETTI0KQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+RXh0UmF0ZUxlbjsgaSsrKQotCQkJewotCQkJCXJhdGUgPSBwQnNzLT5TdXBSYXRlW2ldICYgMHg3ZjsgLy8gTWFzayBvdXQgYmFzaWMgcmF0ZSBzZXQgYml0Ci0JCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCi0JCQkJeworCQkvKiAqLworCQkvKiBTZWNvbmQgY2hlY2sgRXh0ZW5kIFJhdGUuICovCisJCS8qICovCisJCWlmIChOZXRXb3JrVHlwZSAhPSBOZGlzODAyXzExT0ZETTI0KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+RXh0UmF0ZUxlbjsgaSsrKSB7CisJCQkJcmF0ZSA9IHBCc3MtPlN1cFJhdGVbaV0gJiAweDdmOwkvKiBNYXNrIG91dCBiYXNpYyByYXRlIHNldCBiaXQgKi8KKwkJCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpCisJCQkJICAgIHx8IChyYXRlID09IDIyKSkgewogCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8KLQkJCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKLQkJCQkJLy8KKwkJCQl9IGVsc2UgeworCQkJCQkvKiAqLworCQkJCQkvKiBPdGhlcndpc2UgKGV2ZW4gcmF0ZSA+IDEwOCkgbWVhbnMgTmRpczgwMl8xMU9GRE0yNCAqLworCQkJCQkvKiAqLwogCQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01OwogCX0KIAotICAgIGlmIChwQnNzLT5IdENhcGFiaWxpdHlMZW4gIT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCi0gICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKLSAgICB9CisJaWYgKHBCc3MtPkh0Q2FwYWJpbGl0eUxlbiAhPSAwKSB7CisJCWlmIChOZXRXb3JrVHlwZSA9PSBOZGlzODAyXzExT0ZETTUpCisJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNNV9OOworCQllbHNlCisJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjRfTjsKKwl9CiAKIAlyZXR1cm4gTmV0V29ya1R5cGU7CiB9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSByZWNlaXZlZCBFQVBvTCBmcmFtZQorICAgIFJldHVybjoKKyAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssCisgICAgICAgIEZBTFNFIG90aGVyd2lzZQorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICAgIHU4IE1zZ1R5cGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKK3sKKwl1OCBtaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07CisJQk9PTEVBTiBiUmVwbGF5RGlmZiA9IEZBTFNFOworCUJPT0xFQU4gYldQQTIgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfa2V5X2luZm8gRWFwb2xLZXlJbmZvOworCXU4IEdyb3VwS2V5SW5kZXggPSAwOworCisJTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7CisJTmRpc1plcm9NZW1vcnkoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7CisJTmRpc1plcm9NZW1vcnkoS0VZREFUQSwgc2l6ZW9mKEtFWURBVEEpKTsKKwlOZGlzWmVyb01lbW9yeSgodTggKikmIEVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOworCisJTmRpc01vdmVNZW1vcnkoKHU4ICopJiBFYXBvbEtleUluZm8sCisJCSAgICAgICAodTggKikmIHBNc2ctPktleURlc2MuS2V5SW5mbywgc2l6ZW9mKHN0cnVjdCBydF9rZXlfaW5mbykpOworCisJKigodTE2ICopICYgRWFwb2xLZXlJbmZvKSA9IGNwdTJsZTE2KCooKHUxNiAqKSAmIEVhcG9sS2V5SW5mbykpOworCisJLyogQ2hvb3NlIFdQQTIgb3Igbm90ICovCisJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJICAgIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMiA9IFRSVUU7CisKKwkvKiAwLiBDaGVjayBNc2dUeXBlICovCisJaWYgKChNc2dUeXBlID4gRUFQT0xfR1JPVVBfTVNHXzIpIHx8IChNc2dUeXBlIDwgRUFQT0xfUEFJUl9NU0dfMSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQoJWQpISBcbiIsIE1zZ1R5cGUpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiAxLiBSZXBsYXkgY291bnRlciBjaGVjayAqLworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCS8qIEZvciBzdXBwbGljYW50ICovCisJeworCQkvKiBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlci4gKi8KKwkJLyogTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlciAqLworCQl1OCBaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOworCisJCU5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5CisJCSAgICAgKHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsCisJCSAgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCisJCSAgICAmJgorCQkgICAgKFJUTVBDb21wYXJlTWVtb3J5CisJCSAgICAgKHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwKKwkJICAgICAgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpIHsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKwkJfQorCX0gZWxzZSBpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfNCB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18yKQkvKiBGb3IgYXV0aGVudGljYXRvciAqLworCXsKKwkJLyogY2hlY2sgUmVwbGF5IENvdW50ZXIgY29yZXNwb25kcyB0byBNU0cgZnJvbSBhdXRoZW50aWNhdG9yLCBvdGhlcndpc2UgZGlzY2FyZCAqLworCQlpZiAoIU5kaXNFcXVhbE1lbW9yeQorCQkgICAgKHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsCisJCSAgICAgTEVOX0tFWV9ERVNDX1JFUExBWSkpIHsKKwkJCWJSZXBsYXlEaWZmID0gVFJVRTsKKwkJfQorCX0KKwkvKiBSZXBsYXkgQ291bnRlciBkaWZmZXJlbnQgY29uZGl0aW9uICovCisJaWYgKGJSZXBsYXlEaWZmKSB7CisJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgcmVwbGF5IGNvdW50ZXIgZGlmZmVyZW50ICovCisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCSAgICAgIElXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKKworCQlpZiAoTXNnVHlwZSA8IEVBUE9MX0dST1VQX01TR18xKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gcGFpcndpc2UgbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsCisJCQkJICBNc2dUeXBlKSk7CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsCisJCQkJICAoTXNnVHlwZSAtIEVBUE9MX1BBSVJfTVNHXzQpKSk7CisJCX0KKworCQloZXhfZHVtcCgiUmVjZWl2ZSByZXBsYXkgY291bnRlciAiLCBwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsCisJCQkgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLAorCQkJIExFTl9LRVlfREVTQ19SRVBMQVkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEgKi8KKwlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKSB7CisJCXU4IHJjdmRfbWljW0xFTl9LRVlfREVTQ19NSUNdOworCisJCS8qIFJlY29yZCB0aGUgcmVjZWl2ZWQgTUlDIGZvciBjaGVjayBsYXRlciAqLworCQlOZGlzTW92ZU1lbW9yeShyY3ZkX21pYywgcE1zZy0+S2V5RGVzYy5LZXlNaWMsCisJCQkgICAgICAgTEVOX0tFWV9ERVNDX01JQyk7CisJCU5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCQlpZiAoRWFwb2xLZXlJbmZvLktleURlc2NWZXIgPT0gREVTQ19UWVBFX1RLSVApCS8qIFRLSVAgKi8KKwkJeworCQkJSE1BQ19NRDUocEVudHJ5LT5QVEssIExFTl9FQVBfTUlDSywgKHU4ICopcE1zZywKKwkJCQkgTXNnTGVuLCBtaWMsIE1ENV9ESUdFU1RfU0laRSk7CisJCX0gZWxzZSBpZiAoRWFwb2xLZXlJbmZvLktleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykJLyogQUVTICovCisJCXsKKwkJCUhNQUNfU0hBMShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAodTggKilwTXNnLAorCQkJCSAgTXNnTGVuLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOworCQkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCQl9CisKKwkJaWYgKCFOZGlzRXF1YWxNZW1vcnkocmN2ZF9taWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQykpIHsKKwkJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgTUlDIGRpZmZlcmVudCAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQorCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19NSUNfRElGRl9FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEVudHJ5LT5BZGRyLAorCQkJCQkJICAgICAgcEVudHJ5LT5hcGlkeCwgMCk7CisKKwkJCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiTUlDIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwKKwkJCQkJICBNc2dUeXBlKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJNSUMgRGlmZmVyZW50IGluIGdyb3VwIG1zZyAlZCBvZiAyLXdheSBoYW5kc2hha2UhXG4iLAorCQkJCQkgIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKKwkJCX0KKworCQkJaGV4X2R1bXAoIlJlY2VpdmVkIE1JQyIsIHJjdmRfbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKwkJCWhleF9kdW1wKCJEZXNpcmVkICBNSUMiLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJLyogMS4gRGVjcnlwdCB0aGUgS2V5IERhdGEgZmllbGQgaWYgR1RLIGlzIGluY2x1ZGVkLiAqLworCS8qIDIuIEV4dHJhY3QgdGhlIGNvbnRleHQgb2YgdGhlIEtleSBEYXRhIGZpZWxkIGlmIGl0IGV4aXN0LiAqLworCS8qIFRoZSBmaWVsZCBpbiBwYWlyd2lzZV9tc2dfMl9XUEExKFdQQTIpICYgcGFpcndpc2VfbXNnXzNfV1BBMSBpcyBjbGVhci4gKi8KKwkvKiBUaGUgZmllbGQgaW4gZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAmIHBhaXJ3aXNlX21zZ18zX1dQQTIgaXMgZW5jcnlwdGVkLiAqLworCWlmIChDT05WX0FSUkFSWV9UT191MTYocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuKSA+IDApIHsKKwkJLyogRGVjcnlwdCB0aGlzIGZpZWxkICovCisJCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKQorCQkgICAgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSB7CisJCQlpZiAoKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpKSB7CisJCQkJLyogQUVTICovCisJCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsCisJCQkJCQkgICBDT05WX0FSUkFSWV9UT191MTYocE1zZy0+CisJCQkJCQkJCQkgS2V5RGVzYy4KKwkJCQkJCQkJCSBLZXlEYXRhTGVuKSwKKwkJCQkJCSAgIHBNc2ctPktleURlc2MuS2V5RGF0YSk7CisJCQl9IGVsc2UgeworCQkJCWludCBpOworCQkJCXU4IEtleVszMl07CisJCQkJLyogRGVjcnlwdCBUS0lQIEdUSyAqLworCQkJCS8qIENvbnN0cnVjdCAzMiBieXRlcyBSQzQgS2V5ICovCisJCQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCAxNik7CisJCQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwRW50cnktPlBUS1sxNl0sIDE2KTsKKwkJCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS2V5LAorCQkJCQkgICAgIDMyKTsKKwkJCQkvKmRpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzICovCisJCQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJCQlBUkNGT1VSX0JZVEUoJnBBZC0+UHJpdmF0ZUluZm8uCisJCQkJCQkgICAgIFdFUENPTlRFWFQpOworCQkJCS8qIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90ICovCisJCQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsCisJCQkJCQlLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsCisJCQkJCQlDT05WX0FSUkFSWV9UT191MTYocE1zZy0+CisJCQkJCQkJCSAgICAgIEtleURlc2MuCisJCQkJCQkJCSAgICAgIEtleURhdGFMZW4pKTsKKwkJCX0KKworCQkJaWYgKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCQkJR3JvdXBLZXlJbmRleCA9IEVhcG9sS2V5SW5mby5LZXlJbmRleDsKKworCQl9IGVsc2UgaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpCisJCQkgICB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmICFiV1BBMikpIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KEtFWURBVEEsIHBNc2ctPktleURlc2MuS2V5RGF0YSwKKwkJCQkgICAgICAgQ09OVl9BUlJBUllfVE9fdTE2KHBNc2ctPktleURlc2MuCisJCQkJCQkJICAgICBLZXlEYXRhTGVuKSk7CisJCX0gZWxzZSB7CisKKwkJCXJldHVybiBUUlVFOworCQl9CisKKwkJLyogUGFyc2UgS2V5IERhdGEgZmllbGQgdG8gKi8KKwkJLyogMS4gdmVyaWZ5IFJTTiBJRSBmb3IgcGFpcndpc2VfbXNnXzJfV1BBMShXUEEyKSAscGFpcndpc2VfbXNnXzNfV1BBMShXUEEyKSAqLworCQkvKiAyLiB2ZXJpZnkgS0RFIGZvcm1hdCBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMiAqLworCQkvKiAzLiB1cGRhdGUgc2hhcmVkIGtleSBmb3IgcGFpcndpc2VfbXNnXzNfV1BBMiwgZ3JvdXBfbXNnXzFfV1BBMShXUEEyKSAqLworCQlpZiAoIVJUTVBQYXJzZUVhcG9sS2V5RGF0YShwQWQsIEtFWURBVEEsCisJCQkJCSAgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5LZXlEZXNjLgorCQkJCQkJCQkgS2V5RGF0YUxlbiksCisJCQkJCSAgIEdyb3VwS2V5SW5kZXgsIE1zZ1R5cGUsIGJXUEEyLAorCQkJCQkgICBwRW50cnkpKSB7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV9zeW5jLmMKaW5kZXggYTZlMWI2ZC4uZjg0MTk0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3N5bmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fc3luYy5jCkBAIC0yNSw3ICsyNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAJTW9kdWxlIE5hbWU6Ci0Jc3luYy5jCisJY21tX3N5bmMuYwogCiAJQWJzdHJhY3Q6CiAKQEAgLTM2LDQyICszNiw2MiBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotLy8gMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMQorLyogMi40IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLiAqLworI2RlZmluZQlCR19CQU5EX1JFR0lPTl8wX1NUQVJUCTAJLyogMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fMF9TSVpFCTExCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzFfU1RBUlQJMAkvKiAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMyAqLwogI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NJWkUJMTMKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMl9TVEFSVAk5CQkJLy8gMTAsMTEKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fMl9TVEFSVAk5CS8qIDEwLDExICovCiAjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzJfU0laRQkyCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkJCS8vIDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzNfU1RBUlQJOQkvKiAxMCwxMSwxMiwxMyAqLwogI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zX1NJWkUJNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NUQVJUCTEzCQkJLy8gMTQKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TVEFSVAkxMwkvKiAxNCAqLwogI2RlZmluZQlCR19CQU5EX1JFR0lPTl80X1NJWkUJMQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNAorI2RlZmluZQlCR19CQU5EX1JFR0lPTl81X1NUQVJUCTAJLyogMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fNV9TSVpFCTE0Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU1RBUlQJMgkJCS8vIDMsNCw1LDYsNyw4LDkKKyNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TVEFSVAkyCS8qIDMsNCw1LDYsNyw4LDkgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fNl9TSVpFCTcKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TVEFSVAk0CQkJLy8gNSw2LDcsOCw5LDEwLDExLDEyLDEzCisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU1RBUlQJNAkvKiA1LDYsNyw4LDksMTAsMTEsMTIsMTMgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fN19TSVpFCTkKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0CisjZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzMxX1NUQVJUCTAJLyogMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQgKi8KICNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU0laRQkxNAogCi0vLyA1IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgotVUNIQVIgQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjF9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLCAxNTcsIDE2MX07CisvKiA1IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLiAqLwordTggQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgfTsKK3U4IEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LAorMTMyLCAxMzYsIDE0MCB9OwordTggQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVFtdID0geyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQgfTsKK3U4IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1RbXSA9IHsgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSB9OwordTggQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVFtdID0geyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSB9OwordTggQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVFtdID0geyAxNDksIDE1MywgMTU3LCAxNjEgfTsKK3U4IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1RbXSA9IHsgMzYsIDQwLCA0NCwgNDggfTsKK3U4IEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LAorMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUsIDE2OSwgMTczIH07Cit1OCBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUW10gPSB7IDUyLCA1NiwgNjAsIDY0IH07Cit1OCBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwKKzE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1IH07Cit1OCBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSB9OwordTggQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXSA9CisgICAgeyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLAorMTU3LCAxNjEgfTsKK3U4IEFfQkFORF9SRUdJT05fMTJfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwKKzEzMiwgMTM2LCAxNDAgfTsKK3U4IEFfQkFORF9SRUdJT05fMTNfQ0hBTk5FTF9MSVNUW10gPQorICAgIHsgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLAorMTQ5LCAxNTMsIDE1NywgMTYxIH07Cit1OCBBX0JBTkRfUkVHSU9OXzE0X0NIQU5ORUxfTElTVFtdID0KKyAgICB7IDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzNiwgMTQwLCAxNDksCisxNTMsIDE1NywgMTYxLCAxNjUgfTsKK3U4IEFfQkFORF9SRUdJT05fMTVfQ0hBTk5FTF9MSVNUW10gPSB7IDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MyB9OwogCi0vL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgotVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07CisvKkJhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LiAqLwordTggQmFTaXplQXJyYXlbNF0gPSB7IDgsIDE2LCAzMiwgNjQgfTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtODUsMTU1ICsxMDUsMjQzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEJ1aWxkQ2hhbm5lbExpc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOwotCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOworCXU4IGksIGosIGluZGV4ID0gMCwgbnVtID0gMDsKKwl1OCAqcENoYW5uZWxMaXN0ID0gTlVMTDsKIAotCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q2hhbm5lbExpc3QsIE1BWF9OVU1fT0ZfQ0hBTk5FTFMgKiBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikpOworCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q2hhbm5lbExpc3QsCisJCSAgICAgICBNQVhfTlVNX09GX0NIQU5ORUxTICogc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSk7CiAKLQkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCisJLyogaWYgbm90IDExYS1vbmx5IG1vZGUsIGNoYW5uZWwgbGlzdCBzdGFydHMgZnJvbSAyLjRHaHogYmFuZCAqLwogCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBKQotCQkmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFBTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExTl81RykKLQkpCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gICYgMHg3ZikKLQkJewotCQkJY2FzZSBSRUdJT05fMF9CR19CQU5EOgkvLyAxIC0xMQotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8wX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMF9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8wX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xX0JHX0JBTkQ6CS8vIDEgLSAxMwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8xX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMV9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8xX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8yX0JHX0JBTkQ6CS8vIDEwIC0gMTEKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMl9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzJfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMl9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fM19CR19CQU5EOgkvLyAxMCAtIDEzCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzNfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzNfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzRfQkdfQkFORDoJLy8gMTQKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNF9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzRfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNF9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNV9CR19CQU5EOgkvLyAxIC0gMTQKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNV9TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzVfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNV9TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNl9CR19CQU5EOgkvLyAzIC0gOQotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl82X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNl9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl82X1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl83X0JHX0JBTkQ6ICAvLyA1IC0gMTMKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fN19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzdfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fN19TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMzFfQkdfQkFORDoJLy8gMSAtIDE0Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzMxX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMzFfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMzFfU0laRTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCQlicmVhazsKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgIT0gUEhZXzExQU5fTUlYRUQpCisJICAgICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMU5fNUcpCisJICAgICkgeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDdmKSB7CisJCWNhc2UgUkVHSU9OXzBfQkdfQkFORDoJLyogMSAtMTEgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwKKwkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8wX1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzBfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8wX1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMV9CR19CQU5EOgkvKiAxIC0gMTMgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwKKwkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8xX1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzFfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8xX1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMl9CR19CQU5EOgkvKiAxMCAtIDExICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMl9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl8yX1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fMl9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzNfQkdfQkFORDoJLyogMTAgLSAxMyAqLworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLAorCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzNfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fM19TSVpFKTsKKwkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzNfU0laRTsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl80X0JHX0JBTkQ6CS8qIDE0ICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNF9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl80X1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNF9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzVfQkdfQkFORDoJLyogMSAtIDE0ICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fNV9TVEFSVF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlcikgKgorCQkJCSAgICAgICBCR19CQU5EX1JFR0lPTl81X1NJWkUpOworCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fNV9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzZfQkdfQkFORDoJLyogMyAtIDkgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwKKwkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl82X1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzZfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl82X1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fN19CR19CQU5EOgkvKiA1IC0gMTMgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwKKwkJCQkgICAgICAgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSAqCisJCQkJICAgICAgIEJHX0JBTkRfUkVHSU9OXzdfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7CisJCQlicmVhazsKKwkJY2FzZSBSRUdJT05fMzFfQkdfQkFORDoJLyogMSAtIDE0ICovCisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sCisJCQkJICAgICAgICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIpICoKKwkJCQkgICAgICAgQkdfQkFORF9SRUdJT05fMzFfU0laRSk7CisJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlicmVhazsKIAkJfQotCQlmb3IgKGk9MDsgaTxpbmRleDsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKIAkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uTWF4VHhQd3IgPSAyMDsKIAl9CiAKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQotCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKLQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKQotCSkKLQl7Ci0JCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg3ZikKLQkJewotCQkJY2FzZSBSRUdJT05fMF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzFfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8yX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fM19BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzRfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl81X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNl9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzdfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl84X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fOV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQorCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKQorCSAgICApIHsKKwkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgJiAweDdmKSB7CisJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzFfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzJfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl8zX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzRfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzVfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl82X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzdfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzhfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzhfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgorCQkJbnVtID0KKwkJCSAgICBzaXplb2YoQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CiAKLQkJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7CisJCWNhc2UgUkVHSU9OXzEwX0FfQkFORDoKKwkJCW51bSA9CisJCQkgICAgc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKSAvCisJCQkgICAgc2l6ZW9mKHU4KTsKKwkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOworCQkJYnJlYWs7CiAKLQkJCWNhc2UgUkVHSU9OXzExX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6ICAgICAgICAgICAgLy8gRXJyb3IuIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCgiY291bnRyeXJlZ2lvbj0lZCBub3Qgc3VwcG9ydCIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOwotCQkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xMV9BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xMl9BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzEyX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xM19BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzEzX0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzEzX0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xNF9BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzE0X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzE0X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQljYXNlIFJFR0lPTl8xNV9BX0JBTkQ6CisJCQludW0gPQorCQkJICAgIHNpemVvZihBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVCkgLworCQkJICAgIHNpemVvZih1OCk7CisJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzE1X0NIQU5ORUxfTElTVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkgKCJjb3VudHJ5cmVnaW9uPSVkIG5vdCBzdXBwb3J0IiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOworCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAobnVtICE9IDApCi0JCXsKLQkJCVVDSEFSIFJhZGFyQ2hbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotCQkJZm9yIChpPTA7IGk8bnVtOyBpKyspCi0JCQl7Ci0JCQkJZm9yIChqPTA7IGo8TUFYX05VTV9PRl9DSEFOTkVMUzsgaisrKQotCQkJCXsKLQkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBwQWQtPlR4UG93ZXJbal0uQ2hhbm5lbCkKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLCAmcEFkLT5UeFBvd2VyW2pdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikpOwotCQkJCQl9Ci0JCQkJZm9yIChqPTA7IGo8MTU7IGorKykKLQkJCQl7Ci0JCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0gUmFkYXJDaFtqXSkKLQkJCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uRGZzUmVxID0gVFJVRTsKKwkJaWYgKG51bSAhPSAwKSB7CisJCQl1OCBSYWRhckNoWzE1XSA9CisJCQkgICAgeyA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LAorCQkgICAgMTI4LCAxMzIsIDEzNiwgMTQwIH07CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgTUFYX05VTV9PRl9DSEFOTkVMUzsgaisrKSB7CisJCQkJCWlmIChwQ2hhbm5lbExpc3RbaV0gPT0KKwkJCQkJICAgIHBBZC0+VHhQb3dlcltqXS5DaGFubmVsKQorCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+CisJCQkJCQkJICAgICAgIENoYW5uZWxMaXN0W2luZGV4CisJCQkJCQkJCQkgICArIGldLAorCQkJCQkJCSAgICAgICAmcEFkLT5UeFBvd2VyW2pdLAorCQkJCQkJCSAgICAgICBzaXplb2YKKwkJCQkJCQkgICAgICAgKHN0cnVjdCBydF9jaGFubmVsX3R4X3Bvd2VyKSk7CiAJCQkJfQotCQkJCXBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0uTWF4VHhQd3IgPSAyMDsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMTU7IGorKykgeworCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IFJhZGFyQ2hbal0pCisJCQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4ICsKKwkJCQkJCQkJIGldLkRmc1JlcSA9CisJCQkJCQkgICAgVFJVRTsKKwkJCQl9CisJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCArIGldLk1heFR4UHdyID0gMjA7CiAJCQl9CiAJCQlpbmRleCArPSBudW07CiAJCX0KIAl9CiAKIAlwQWQtPkNoYW5uZWxMaXN0TnVtID0gaW5kZXg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJjb3VudHJ5IGNvZGU9JWQvJWQsIFJGSUM9JWQsIFBIWSBtb2RlPSVkLCBzdXBwb3J0ICVkIGNoYW5uZWxzXG4iLAotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiY291bnRyeSBjb2RlPSVkLyVkLCBSRklDPSVkLCBQSFkgbW9kZT0lZCwgc3VwcG9ydCAlZCBjaGFubmVsc1xuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCwgcEFkLT5SZkljVHlwZSwKKwkJICBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7CiAjaWZkZWYgREJHCi0JZm9yIChpPTA7aTxwQWQtPkNoYW5uZWxMaXN0TnVtO2krKykKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkJ1aWxkQ2hhbm5lbCAjICVkIDo6IFB3cjAgPSAlZCwgUHdyMSA9JWQsIFxuICIsIHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdFtpXS5Qb3dlciwgcEFkLT5DaGFubmVsTGlzdFtpXS5Qb3dlcjIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKSB7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCSAgICAgKCJCdWlsZENoYW5uZWwgIyAlZCA6OiBQd3IwID0gJWQsIFB3cjEgPSVkLCBcbiAiLAorCQkJICAgICAgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLAorCQkJICAgICAgcEFkLT5DaGFubmVsTGlzdFtpXS5Qb3dlciwKKwkJCSAgICAgIHBBZC0+Q2hhbm5lbExpc3RbaV0uUG93ZXIyKSk7CiAJfQogI2VuZGlmCiB9CkBAIC0yNTEsOCArMzU5LDcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVVDSEFSIEZpcnN0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3U4IEZpcnN0Q2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJcmV0dXJuIHBBZC0+Q2hhbm5lbExpc3RbMF0uQ2hhbm5lbDsKIH0KQEAgLTI2OCwxOSArMzc1LDE2IEBACiAJCXJldHVybiAwIGlmIG5vIG1vcmUgbmV4dCBjaGFubmVsCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVUNIQVIgTmV4dENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgY2hhbm5lbCkKK3U4IE5leHRDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggY2hhbm5lbCkKIHsKIAlpbnQgaTsKLQlVQ0hBUiBuZXh0X2NoYW5uZWwgPSAwOworCXU4IG5leHRfY2hhbm5lbCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQotCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCXsKLQkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSsxXS5DaGFubmVsOworCQlpZiAoY2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpIHsKKwkJCW5leHRfY2hhbm5lbCA9IHBBZC0+Q2hhbm5lbExpc3RbaSArIDFdLkNoYW5uZWw7CiAJCQlicmVhazsKLQl9CisJCX0KIAlyZXR1cm4gbmV4dF9jaGFubmVsOwogfQogCkBAIC0zMDQsMTYgKzQwOCwxNSBAQAogCQl0aGUgbWluaW11bSB2YWx1ZSBvciBuZXh0IGxvd2VyIHZhbHVlLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCkKK3ZvaWQgQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggQWlyb25ldENlbGxQb3dlckxpbWl0KQogewotCS8vdmFsdWQgMHhGRiBtZWFucyB0aGF0IGhhc24ndCBmb3VuZCBwb3dlciBsaW1pdCBpbmZvcm1hdGlvbgotCS8vZnJvbSB0aGUgQVAncyBCZWFjb24vUHJvYmUgcmVzcG9uc2UuCisJLyp2YWx1ZCAweEZGIG1lYW5zIHRoYXQgaGFzbid0IGZvdW5kIHBvd2VyIGxpbWl0IGluZm9ybWF0aW9uICovCisJLypmcm9tIHRoZSBBUCdzIEJlYWNvbi9Qcm9iZSByZXNwb25zZS4gKi8KIAlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ID09IDB4RkYpCiAJCXJldHVybjsKIAotCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KSAvL1VzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuCisJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDYpCS8qVXNlZCBMb3dlc3QgUG93ZXIgUGVyY2VudGFnZS4gKi8KIAkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSA2OwogCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDkpCiAJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMTA7CkBAIC0zMjQsNDUgKzQyNyw0MCBAQAogCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE1KQogCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDc1OwogCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAxMDA7IC8vZWxzZSB1c2VkIG1heGltdW0KKwkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAxMDA7CS8qZWxzZSB1c2VkIG1heGltdW0gKi8KIAogCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0KQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9CisJCSAgICBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKIAogfQogCi1DSEFSCUNvbnZlcnRUb1Jzc2koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JQ0hBUgkJCVJzc2ksCi0JSU4gIFVDSEFSICAgUnNzaU51bWJlcikKK2NoYXIgQ29udmVydFRvUnNzaShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgUnNzaSwgdTggUnNzaU51bWJlcikKIHsKLQlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOworCXU4IFJzc2lPZmZzZXQsIExOQUdhaW47CiAKLQkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCisJLyogUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZSAqLwogCWlmIChSc3NpID09IDApCiAJCXJldHVybiAtOTk7CiAKIAlMTkFHYWluID0gR0VUX0xOQV9HQUlOKHBBZCk7Ci0gICAgaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQotICAgIHsKLSAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKKwlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpIHsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKIAkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKIAkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQogCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOwogCQllbHNlCiAJCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChSc3NpTnVtYmVyID09IDApCisJfSBlbHNlIHsKKwkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKIAkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7CiAJCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKIAkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7CiAJCWVsc2UKIAkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7Ci0gICAgfQorCX0KIAotICAgIHJldHVybiAoLTEyIC0gUnNzaU9mZnNldCAtIExOQUdhaW4gLSBSc3NpKTsKKwlyZXR1cm4gKC0xMiAtIFJzc2lPZmZzZXQgLSBMTkFHYWluIC0gUnNzaSk7CiB9CiAKIC8qCkBAIC0zNzEsNjMgKzQ2OSw3NSBAQAogCQlTY2FuIG5leHQgY2hhbm5lbAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgU2Nhbk5leHRDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBTY2FuTmV4dENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlVQ0hBUiAgICAgICAgICAgU3NpZExlbiA9IDAsIFNjYW5UeXBlID0gcEFkLT5NbG1lQXV4LlNjYW5UeXBlLCBCQlBWYWx1ZSA9IDA7Ci0JVVNIT1JUICAgICAgICAgIFN0YXR1czsKLQlQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExOwotCVVJTlQJCQlTY2FuVGltZUluNWdDaGFubmVsID0gU0hPUlRfQ0hBTk5FTF9USU1FOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjgwMjExOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1OCBTc2lkTGVuID0gMCwgU2NhblR5cGUgPSBwQWQtPk1sbWVBdXguU2NhblR5cGUsIEJCUFZhbHVlID0gMDsKKwl1MTYgU3RhdHVzOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExOworCXUzMiBTY2FuVGltZUluNWdDaGFubmVsID0gU0hPUlRfQ0hBTk5FTF9USU1FOwogCi0JaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJcmV0dXJuOwotCi0JaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID09IDApCiAJeworCQlpZiAoTU9OSVRPUl9PTihwQWQpKQorCQkJcmV0dXJuOworCX0KKworCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwKSB7CiAJCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCQkJJiYgKElORlJBX09OKHBBZCkKLQkJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKLQkJCSkKLQkJewotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOworCQkgICAgJiYgKElORlJBX09OKHBBZCkKKwkJCXx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApKQorCQkgICAgKSB7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLAorCQkJCQkgIEZBTFNFKTsKIAkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKIAkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKIAkJCUJCUFZhbHVlICY9ICh+MHgxOCk7CiAJCQlCQlBWYWx1ZSB8PSAweDEwOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIDQwTUh6IGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIixwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsCisJCQkJICBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJfSBlbHNlIHsKIAkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwogCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiU1lOQyAtIEVuZCBvZiBTQ0FOLCByZXN0b3JlIHRvIGNoYW5uZWwgJWQsIFRvdGFsIEJTU1slMDJkXVxuIiwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwogCQl9CiAKIAkJewotCQkJLy8KLQkJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgotCQkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCi0JCQkvLyBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCi0JCQkvLwotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCi0JCQl7Ci0JCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7Ci0JCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQl7Ci0JCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkvKiAqLworCQkJLyogVG8gcHJldmVudCBkYXRhIGxvc3QuICovCisJCQkvKiBTZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9uIHRvIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCBiZWZvcmUgU0NBTiBwcm9ncmVzcy4gKi8KKwkJCS8qIE5vdywgd2UgbmVlZCB0byBzZW5kIGFuIE5VTEwgZGF0YSB3aXRoIHR1cm5lZCBQU00gYml0IG9mZiB0byBBUCwgd2hlbiBzY2FuIHByb2dyZXNzIGRvbmUgKi8KKwkJCS8qICovCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCQkgICAgJiYgKElORlJBX09OKHBBZCkpKSB7CisJCQkJTlN0YXR1cyA9CisJCQkJICAgIE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsCisJCQkJCQkgICAgICAgKHZvaWQgKikmIHBPdXRCdWZmZXIpOworCQkJCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcEhkcjgwMjExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBPdXRCdWZmZXI7CisJCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwSGRyODAyMTEsCisJCQkJCQkJIFNVQlRZUEVfTlVMTF9GVU5DLCAxLAorCQkJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJCQkgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQkJCQlwSGRyODAyMTEtPkR1cmF0aW9uID0gMDsKIAkJCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQkJCQkJcEhkcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CisJCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9CisJCQkJCSAgICAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKIAotCQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZVxuIikpOworCQkJCQkvKiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlICovCisJCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwKKwkJCQkJCQkgIHNpemVvZgorCQkJCQkJCSAgKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZVxuIikpOwogCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwogCQkJCX0KQEAgLTQzNSwxNTUgKzU0NSwxNDggQEAKIAogCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwKKwkJCQkgICAgMiwgJlN0YXR1cyk7CiAJCX0KIAogCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKIAl9Ci0jaWZkZWYgUlQyODcwCi0JZWxzZSBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLQl7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJZWxzZSBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpCisJCSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJTWxtZUNudGxDb25maXJtKHBBZCwgTVQyX1NDQU5fQ09ORiwgTUxNRV9GQUlMX05PX1JFU09VUkNFKTsKIAl9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JZWxzZQotCXsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwllbHNlIHsKIAkJewotCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0Ci0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2lmZGVmIFJUMjg2MAotCQkJCUFzaWNGb3JjZVdha2V1cChwQWQsIEZST01fVFgpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLSNlbmRpZgotCQkJLy8gbGVhdmUgUFNNIGR1cmluZyBzY2FubmluZy4gb3RoZXJ3aXNlIHdlIG1heSBsb3N0IFByb2JlUnNwICYgQkVBQ09OCisJCQkvKiBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0ICovCisJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKworCQkJLyogbGVhdmUgUFNNIGR1cmluZyBzY2FubmluZy4gb3RoZXJ3aXNlIHdlIG1heSBsb3N0IFByb2JlUnNwICYgQkVBQ09OICovCiAJCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCU1sbWVTZXRQc21CaXQocEFkLCBQV1JfQUNUSVZFKTsKKwkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX0FDVElWRSk7CiAJCX0KIAogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwogCiAJCXsKLQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQotCQkJewotCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCi0JCQkJeworCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpIHsKKwkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCQkJICAgICYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwKKwkJCQkJCQkgcEFkLT5NbG1lQXV4LgorCQkJCQkJCSBDaGFubmVsKSkgewogCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKIAkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7CiAJCQkJfQogCQkJfQogCQl9CiAKLQkJLy9HbG9iYWwgY291bnRyeSBkb21haW4oY2gxLTExOmFjdGl2ZSBzY2FuLCBjaDEyLTE0IHBhc3NpdmUgc2NhbikKLQkJaWYgKChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID49IDEyKSAmJiAoKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gJiAweDdmKSA9PSBSRUdJT05fMzFfQkdfQkFORCkpCi0JCXsKKwkJLypHbG9iYWwgY291bnRyeSBkb21haW4oY2gxLTExOmFjdGl2ZSBzY2FuLCBjaDEyLTE0IHBhc3NpdmUgc2NhbikgKi8KKwkJaWYgKChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID49IDEyKQorCQkgICAgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0KKwkJCVJFR0lPTl8zMV9CR19CQU5EKSkgewogCQkJU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7CiAJCX0KLQotCQkvLyBXZSBuZWVkIHRvIHNob3J0ZW4gYWN0aXZlIHNjYW4gdGltZSBpbiBvcmRlciBmb3IgV1pDIGNvbm5lY3QgaXNzdWUKLQkJLy8gQ2huYWdlIHRoZSBjaGFubmVsIHNjYW4gdGltZSBmb3IgQ0lTQ08gc3R1ZmYgYmFzZWQgb24gaXRzIElBUFAgYW5ub3VuY2VtZW50CisJCS8qIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZSAqLworCQkvKiBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQgKi8KIAkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCi0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7Ci0JCWVsc2UgaWYgKCgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8Ci0JCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKLQkJCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8Ci0JCQkJKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSA8IDI1KQotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgKiAyKTsKLQkJCWVsc2UKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKTsKLQkJfQotCQllbHNlIC8vIG11c3QgYmUgU0NBTl9QQVNTSVZFIG9yIFNDQU5fQUNUSVZFCisJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCisJCQkJICAgICBGQVNUX0FDVElWRV9TQ0FOX1RJTUUpOworCQllbHNlCQkvKiBtdXN0IGJlIFNDQU5fUEFTU0lWRSBvciBTQ0FOX0FDVElWRSAqLwogCQl7CiAJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKQotCQkJCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKLQkJCSkKLQkJCXsKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQorCQkJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkKKwkJCSAgICApIHsKIAkJCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkKLQkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBTY2FuVGltZUluNWdDaGFubmVsKTsKKwkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCQkJICAgICBTY2FuVGltZUluNWdDaGFubmVsKTsKIAkJCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNSU5fQ0hBTk5FTF9USU1FKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIE1BWF9DSEFOTkVMX1RJTUUpOworCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsCisJCQkJCQkgICAgIE1JTl9DSEFOTkVMX1RJTUUpOworCQkJfSBlbHNlCisJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkJCQkgICAgIE1BWF9DSEFOTkVMX1RJTUUpOwogCQl9CiAKLQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkgfHwgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpIHx8Ci0JCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpKQotCQl7Ci0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU2Nhbk5leHRDaGFubmVsKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxcbiIpKTsKKwkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkKKwkJICAgIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkgICAgKSB7CisJCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlNZTkMgLSBTY2FuTmV4dENoYW5uZWwoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwogCiAJCQkJewotCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOworCQkJCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkJICAgIFNZTkNfSURMRTsKIAkJCQkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCQkJTWxtZUVucXVldWUocEFkLAorCQkJCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCQkJICAgIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOwogCQkJCX0KIAogCQkJCXJldHVybjsKIAkJCX0KLQotCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIGJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGlmIGFjdGl2ZSBzY2FuIGlzIGluIGVmZmVjdC4KLQkJCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQotCQkJCSkKKwkJCS8qIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZCBicm9hZGNhc3QgcHJvYmUgcmVxdWVzdCBpZiBhY3RpdmUgc2NhbiBpcyBpbiBlZmZlY3QuICovCisJCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKQorCQkJICAgIHx8IChTY2FuVHlwZSA9PSBGQVNUX1NDQU5fQUNUSVZFKQorCQkJICAgICkKIAkJCQlTc2lkTGVuID0gcEFkLT5NbG1lQXV4LlNzaWRMZW47CiAJCQllbHNlCiAJCQkJU3NpZExlbiA9IDA7CiAKLQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOwotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRMZW4sCi0JCQkJCQkJICBTc2lkTGVuLAkJCSAgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiwgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwKKwkJCQkJIEJST0FEQ0FTVF9BRERSLCBCUk9BRENBU1RfQUREUik7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkhkcjgwMjExLCAxLAorCQkJCQkgICZTc2lkSWUsIDEsICZTc2lkTGVuLCBTc2lkTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkLCAxLCAmU3VwUmF0ZUllLCAxLAorCQkJCQkgICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgRU5EX09GX0FSR1MpOwogCi0JCQlpZiAocEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbikKLQkJCXsKLQkJCQlVTE9ORyBUbXA7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXAsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLAotCQkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4pIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcDsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZUbXAsCisJCQkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJCQkgIDEsICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLAorCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJRnJhbWVMZW4gKz0gVG1wOwogCQkJfQogCi0JCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJewotCQkJCVVMT05HCVRtcDsKLQkJCQlVQ0hBUglIdExlbjsKLQkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wOworCQkJCXU4IEh0TGVuOworCQkJCXU4IEJST0FEQ09NWzRdID0geyAweDAsIDB4OTAsIDB4NGMsIDB4MzMgfTsKIAotCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpCi0JCQkJewotCQkJCQlIdExlbiA9IHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gKyA0OworCQkJCWlmIChwQWQtPmJCcm9hZENvbUhUID09IFRSVUUpIHsKKwkJCQkJSHRMZW4gPQorCQkJCQkgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiArIDQ7CiAKLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJCQk0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkJICAmVG1wLCAxLCAmV3BhSWUsIDEsCisJCQkJCQkJICAmSHRMZW4sIDQsCisJCQkJCQkJICAmQlJPQURDT01bMF0sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJICBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJICAmcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCX0gZWxzZSB7CiAJCQkJCUh0TGVuID0gcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbjsKIAotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJSHRMZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCQkgICZUbXAsIDEsICZIdENhcEllLCAxLAorCQkJCQkJCSAgJkh0TGVuLCBIdExlbiwKKwkJCQkJCQkgICZwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIEh0Q2FwYWJpbGl0eSwKKwkJCQkJCQkgIEVORF9PRl9BUkdTKTsKIAkJCQl9CiAJCQkJRnJhbWVMZW4gKz0gVG1wOwogCQkJfQpAQCAtNTkxLDIyICs2OTQsMTggQEAKIAkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAkJfQotCi0JCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCisJCS8qIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlICovCiAKIAkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNDQU5fTElTVEVOOwogCX0KIH0KIAotVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotCUlOIFVDSEFSIFN1YlR5cGUsCi0JSU4gVUNIQVIgVG9EcywKLQlJTiBQVUNIQVIgcERBLAotCUlOIFBVQ0hBUiBwQnNzaWQpCit2b2lkIE1ndFByb2JSZXFNYWNIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCQkgICAgIHU4IFN1YlR5cGUsCisJCQkgICAgIHU4IFRvRHMsIHU4ICpwREEsIHU4ICpwQnNzaWQpCiB7Ci0JTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CiAKIAlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwogCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7CkBAIC02MTcsNSArNzE2LDMgQEAKIAlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwogCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMywgcEJzc2lkKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3RraXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODgxZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3RraXAuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlNb2R1bGUgTmFtZToKKwljbW1fdGtpcC5jCisKKwlBYnN0cmFjdDoKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKKyovCisKKyNpbmNsdWRlCSIuLi9ydF9jb25maWcuaCIKKworLyogUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMgKi8KKyNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCisJKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQorI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCisKK3UzMiBUa2lwX1Nib3hfTG93ZXJbMjU2XSA9IHsKKwkweEE1LCAweDg0LCAweDk5LCAweDhELCAweDBELCAweEJELCAweEIxLCAweDU0LAorCTB4NTAsIDB4MDMsIDB4QTksIDB4N0QsIDB4MTksIDB4NjIsIDB4RTYsIDB4OUEsCisJMHg0NSwgMHg5RCwgMHg0MCwgMHg4NywgMHgxNSwgMHhFQiwgMHhDOSwgMHgwQiwKKwkweEVDLCAweDY3LCAweEZELCAweEVBLCAweEJGLCAweEY3LCAweDk2LCAweDVCLAorCTB4QzIsIDB4MUMsIDB4QUUsIDB4NkEsIDB4NUEsIDB4NDEsIDB4MDIsIDB4NEYsCisJMHg1QywgMHhGNCwgMHgzNCwgMHgwOCwgMHg5MywgMHg3MywgMHg1MywgMHgzRiwKKwkweDBDLCAweDUyLCAweDY1LCAweDVFLCAweDI4LCAweEExLCAweDBGLCAweEI1LAorCTB4MDksIDB4MzYsIDB4OUIsIDB4M0QsIDB4MjYsIDB4NjksIDB4Q0QsIDB4OUYsCisJMHgxQiwgMHg5RSwgMHg3NCwgMHgyRSwgMHgyRCwgMHhCMiwgMHhFRSwgMHhGQiwKKwkweEY2LCAweDRELCAweDYxLCAweENFLCAweDdCLCAweDNFLCAweDcxLCAweDk3LAorCTB4RjUsIDB4NjgsIDB4MDAsIDB4MkMsIDB4NjAsIDB4MUYsIDB4QzgsIDB4RUQsCisJMHhCRSwgMHg0NiwgMHhEOSwgMHg0QiwgMHhERSwgMHhENCwgMHhFOCwgMHg0QSwKKwkweDZCLCAweDJBLCAweEU1LCAweDE2LCAweEM1LCAweEQ3LCAweDU1LCAweDk0LAorCTB4Q0YsIDB4MTAsIDB4MDYsIDB4ODEsIDB4RjAsIDB4NDQsIDB4QkEsIDB4RTMsCisJMHhGMywgMHhGRSwgMHhDMCwgMHg4QSwgMHhBRCwgMHhCQywgMHg0OCwgMHgwNCwKKwkweERGLCAweEMxLCAweDc1LCAweDYzLCAweDMwLCAweDFBLCAweDBFLCAweDZELAorCTB4NEMsIDB4MTQsIDB4MzUsIDB4MkYsIDB4RTEsIDB4QTIsIDB4Q0MsIDB4MzksCisJMHg1NywgMHhGMiwgMHg4MiwgMHg0NywgMHhBQywgMHhFNywgMHgyQiwgMHg5NSwKKwkweEEwLCAweDk4LCAweEQxLCAweDdGLCAweDY2LCAweDdFLCAweEFCLCAweDgzLAorCTB4Q0EsIDB4MjksIDB4RDMsIDB4M0MsIDB4NzksIDB4RTIsIDB4MUQsIDB4NzYsCisJMHgzQiwgMHg1NiwgMHg0RSwgMHgxRSwgMHhEQiwgMHgwQSwgMHg2QywgMHhFNCwKKwkweDVELCAweDZFLCAweEVGLCAweEE2LCAweEE4LCAweEE0LCAweDM3LCAweDhCLAorCTB4MzIsIDB4NDMsIDB4NTksIDB4QjcsIDB4OEMsIDB4NjQsIDB4RDIsIDB4RTAsCisJMHhCNCwgMHhGQSwgMHgwNywgMHgyNSwgMHhBRiwgMHg4RSwgMHhFOSwgMHgxOCwKKwkweEQ1LCAweDg4LCAweDZGLCAweDcyLCAweDI0LCAweEYxLCAweEM3LCAweDUxLAorCTB4MjMsIDB4N0MsIDB4OUMsIDB4MjEsIDB4REQsIDB4REMsIDB4ODYsIDB4ODUsCisJMHg5MCwgMHg0MiwgMHhDNCwgMHhBQSwgMHhEOCwgMHgwNSwgMHgwMSwgMHgxMiwKKwkweEEzLCAweDVGLCAweEY5LCAweEQwLCAweDkxLCAweDU4LCAweDI3LCAweEI5LAorCTB4MzgsIDB4MTMsIDB4QjMsIDB4MzMsIDB4QkIsIDB4NzAsIDB4ODksIDB4QTcsCisJMHhCNiwgMHgyMiwgMHg5MiwgMHgyMCwgMHg0OSwgMHhGRiwgMHg3OCwgMHg3QSwKKwkweDhGLCAweEY4LCAweDgwLCAweDE3LCAweERBLCAweDMxLCAweEM2LCAweEI4LAorCTB4QzMsIDB4QjAsIDB4NzcsIDB4MTEsIDB4Q0IsIDB4RkMsIDB4RDYsIDB4M0EKK307CisKK3UzMiBUa2lwX1Nib3hfVXBwZXJbMjU2XSA9IHsKKwkweEM2LCAweEY4LCAweEVFLCAweEY2LCAweEZGLCAweEQ2LCAweERFLCAweDkxLAorCTB4NjAsIDB4MDIsIDB4Q0UsIDB4NTYsIDB4RTcsIDB4QjUsIDB4NEQsIDB4RUMsCisJMHg4RiwgMHgxRiwgMHg4OSwgMHhGQSwgMHhFRiwgMHhCMiwgMHg4RSwgMHhGQiwKKwkweDQxLCAweEIzLCAweDVGLCAweDQ1LCAweDIzLCAweDUzLCAweEU0LCAweDlCLAorCTB4NzUsIDB4RTEsIDB4M0QsIDB4NEMsIDB4NkMsIDB4N0UsIDB4RjUsIDB4ODMsCisJMHg2OCwgMHg1MSwgMHhEMSwgMHhGOSwgMHhFMiwgMHhBQiwgMHg2MiwgMHgyQSwKKwkweDA4LCAweDk1LCAweDQ2LCAweDlELCAweDMwLCAweDM3LCAweDBBLCAweDJGLAorCTB4MEUsIDB4MjQsIDB4MUIsIDB4REYsIDB4Q0QsIDB4NEUsIDB4N0YsIDB4RUEsCisJMHgxMiwgMHgxRCwgMHg1OCwgMHgzNCwgMHgzNiwgMHhEQywgMHhCNCwgMHg1QiwKKwkweEE0LCAweDc2LCAweEI3LCAweDdELCAweDUyLCAweERELCAweDVFLCAweDEzLAorCTB4QTYsIDB4QjksIDB4MDAsIDB4QzEsIDB4NDAsIDB4RTMsIDB4NzksIDB4QjYsCisJMHhENCwgMHg4RCwgMHg2NywgMHg3MiwgMHg5NCwgMHg5OCwgMHhCMCwgMHg4NSwKKwkweEJCLCAweEM1LCAweDRGLCAweEVELCAweDg2LCAweDlBLCAweDY2LCAweDExLAorCTB4OEEsIDB4RTksIDB4MDQsIDB4RkUsIDB4QTAsIDB4NzgsIDB4MjUsIDB4NEIsCisJMHhBMiwgMHg1RCwgMHg4MCwgMHgwNSwgMHgzRiwgMHgyMSwgMHg3MCwgMHhGMSwKKwkweDYzLCAweDc3LCAweEFGLCAweDQyLCAweDIwLCAweEU1LCAweEZELCAweEJGLAorCTB4ODEsIDB4MTgsIDB4MjYsIDB4QzMsIDB4QkUsIDB4MzUsIDB4ODgsIDB4MkUsCisJMHg5MywgMHg1NSwgMHhGQywgMHg3QSwgMHhDOCwgMHhCQSwgMHgzMiwgMHhFNiwKKwkweEMwLCAweDE5LCAweDlFLCAweEEzLCAweDQ0LCAweDU0LCAweDNCLCAweDBCLAorCTB4OEMsIDB4QzcsIDB4NkIsIDB4MjgsIDB4QTcsIDB4QkMsIDB4MTYsIDB4QUQsCisJMHhEQiwgMHg2NCwgMHg3NCwgMHgxNCwgMHg5MiwgMHgwQywgMHg0OCwgMHhCOCwKKwkweDlGLCAweEJELCAweDQzLCAweEM0LCAweDM5LCAweDMxLCAweEQzLCAweEYyLAorCTB4RDUsIDB4OEIsIDB4NkUsIDB4REEsIDB4MDEsIDB4QjEsIDB4OUMsIDB4NDksCisJMHhEOCwgMHhBQywgMHhGMywgMHhDRiwgMHhDQSwgMHhGNCwgMHg0NywgMHgxMCwKKwkweDZGLCAweEYwLCAweDRBLCAweDVDLCAweDM4LCAweDU3LCAweDczLCAweDk3LAorCTB4Q0IsIDB4QTEsIDB4RTgsIDB4M0UsIDB4OTYsIDB4NjEsIDB4MEQsIDB4MEYsCisJMHhFMCwgMHg3QywgMHg3MSwgMHhDQywgMHg5MCwgMHgwNiwgMHhGNywgMHgxQywKKwkweEMyLCAweDZBLCAweEFFLCAweDY5LCAweDE3LCAweDk5LCAweDNBLCAweDI3LAorCTB4RDksIDB4RUIsIDB4MkIsIDB4MjIsIDB4RDIsIDB4QTksIDB4MDcsIDB4MzMsCisJMHgyRCwgMHgzQywgMHgxNSwgMHhDOSwgMHg4NywgMHhBQSwgMHg1MCwgMHhBNSwKKwkweDAzLCAweDU5LCAweDA5LCAweDFBLCAweDY1LCAweEQ3LCAweDg0LCAweEQwLAorCTB4ODIsIDB4MjksIDB4NUEsIDB4MUUsIDB4N0IsIDB4QTgsIDB4NkQsIDB4MkMKK307CisKKy8qICovCisvKiBFeHBhbmRlZCBJViBmb3IgVEtJUCBmdW5jdGlvbi4gKi8KKy8qICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3RraXBfaXYgeworCXVuaW9uIFBBQ0tFRCB7CisJCXN0cnVjdCBQQUNLRUQgeworCQkJdTggcmMwOworCQkJdTggcmMxOworCQkJdTggcmMyOworCisJCQl1bmlvbiBQQUNLRUQgeworCQkJCXN0cnVjdCBQQUNLRUQgeworCQkJCQl1OCBSc3ZkOjU7CisJCQkJCXU4IEV4dElWOjE7CisJCQkJCXU4IEtleUlEOjI7CisJCQkJfSBmaWVsZDsKKwkJCQl1OCBCeXRlOworCQkJfSBDT05UUk9MOworCQl9IGZpZWxkOworCisJCXVuc2lnbmVkIGxvbmcgd29yZDsKKwl9IElWMTY7CisKKwl1bnNpZ25lZCBsb25nIElWMzI7Cit9OworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ29udmVydCBmcm9tIHU4W10gdG8gdW5zaWduZWQgbG9uZyBpbiBhIHBvcnRhYmxlIHdheQorCisJQXJndW1lbnRzOgorICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit1bnNpZ25lZCBsb25nIFJUTVBUa2lwR2V0VUludDMyKHU4ICpwTUlDS2V5KQoreworCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcmVzIHw9ICgqcE1JQ0tleSsrKSA8PCAoOCAqIGkpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDb252ZXJ0IGZyb20gdW5zaWduZWQgbG9uZyB0byB1OFtdIGluIGEgcG9ydGFibGUgd2F5CisKKwlBcmd1bWVudHM6CisgICAgICBwRHN0CQkJcG9pbnRlciB0byBkZXN0aW5hdGlvbiBmb3IgY29udmVydCB1bnNpZ25lZCBsb25nIHRvIHU4W10KKyAgICAgIHZhbAkJCXRoZSB2YWx1ZSBmb3IgY29udmVydAorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBUa2lwUHV0VUludDMyKElOIHU4ICpwRHN0LCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJKnBEc3QrKyA9ICh1OCkodmFsICYgMHhmZik7CisJCXZhbCA+Pj0gODsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlTZXQgdGhlIE1JQyBLZXkuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBUa2lwU2V0TUlDS2V5KHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCwgdTggKnBNSUNLZXkpCit7CisJLyogU2V0IHRoZSBrZXkgKi8KKwlwVGtpcC0+SzAgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5KTsKKwlwVGtpcC0+SzEgPSBSVE1QVGtpcEdldFVJbnQzMihwTUlDS2V5ICsgNCk7CisJLyogYW5kIHJlc2V0IHRoZSBtZXNzYWdlICovCisJcFRraXAtPkwgPSBwVGtpcC0+SzA7CisJcFRraXAtPlIgPSBwVGtpcC0+SzE7CisJcFRraXAtPm5CeXRlc0luTSA9IDA7CisJcFRraXAtPk0gPSAwOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHVDaGFyCQkJQXBwZW5kIHRoaXMgdUNoYXIKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVE1QVGtpcEFwcGVuZEJ5dGUoc3RydWN0IHJ0X3RraXBfa2V5X2luZm8gKnBUa2lwLCB1OCB1Q2hhcikKK3sKKwkvKiBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyICovCisJcFRraXAtPk0gfD0gKHVDaGFyIDw8ICg4ICogcFRraXAtPm5CeXRlc0luTSkpOworCXBUa2lwLT5uQnl0ZXNJbk0rKzsKKwkvKiBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuICovCisJaWYgKHBUa2lwLT5uQnl0ZXNJbk0gPj0gNCkgeworCQlwVGtpcC0+TCBePSBwVGtpcC0+TTsKKwkJcFRraXAtPlIgXj0gUk9MMzIocFRraXAtPkwsIDE3KTsKKwkJcFRraXAtPkwgKz0gcFRraXAtPlI7CisJCXBUa2lwLT5SIF49CisJCSAgICAoKHBUa2lwLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBUa2lwLT4KKwkJCQkJCSAgICAgICBMICYgMHgwMGZmMDBmZikgPDwgOCk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST0wzMihwVGtpcC0+TCwgMyk7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQlwVGtpcC0+UiBePSBST1IzMihwVGtpcC0+TCwgMik7CisJCXBUa2lwLT5MICs9IHBUa2lwLT5SOworCQkvKiBDbGVhciB0aGUgYnVmZmVyICovCisJCXBUa2lwLT5NID0gMDsKKwkJcFRraXAtPm5CeXRlc0luTSA9IDA7CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZQlEZXNjcmlwdGlvbjoKKwkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAgICAgIHBTcmMJCQlQb2ludGVyIHRvIHNvdXJjZSBkYXRhIGZvciBDYWxjdWxhdGUgTUlDIFZhbHVlCisgICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBUa2lwQXBwZW5kKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCwgdTggKnBTcmMsIHUzMiBuQnl0ZXMpCit7CisJLyogVGhpcyBpcyBzaW1wbGUgKi8KKwl3aGlsZSAobkJ5dGVzID4gMCkgeworCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsICpwU3JjKyspOworCQluQnl0ZXMtLTsKKwl9Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlHZXQgdGhlIE1JQyBWYWx1ZS4KKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisJCXRoZSBNSUMgVmFsdWUgaXMgc3RvcmUgaW4gcEFkLT5Qcml2YXRlSW5mby5NSUMKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBUa2lwR2V0TUlDKHN0cnVjdCBydF90a2lwX2tleV9pbmZvICpwVGtpcCkKK3sKKwkvKiBBcHBlbmQgdGhlIG1pbmltdW0gcGFkZGluZyAqLworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMHg1YSk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwKTsKKwlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDApOworCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCk7CisJUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwKTsKKwkvKiBhbmQgdGhlbiB6ZXJvZXMgdW50aWwgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQgKi8KKwl3aGlsZSAocFRraXAtPm5CeXRlc0luTSAhPSAwKSB7CisJCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCk7CisJfQorCS8qIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCisJUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQywgcFRraXAtPkwpOworCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMgKyA0LCBwVGtpcC0+Uik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IFRraXAgZnVuY3Rpb24uCisKKwlBcmd1bWVudHM6CisgICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFRLZXkgICAgICAgUG9pbnRlciB0byB0aGUgVGVtcG9yYWwgS2V5IChUSyksIFRLIHNoYWxsIGJlIDEyOGJpdHMuCisJCUtleUlkCQlUSyBLZXkgSUQKKwkJcFRBCQkJUG9pbnRlciB0byB0cmFuc21pdHRlciBhZGRyZXNzCisJCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBJbml0VGtpcEVuZ2luZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1OCAqcEtleSwKKwkJCXU4IEtleUlkLAorCQkJdTggKnBUQSwKKwkJCXU4ICpwTUlDS2V5LAorCQkJdTggKnBUU0MsIHVuc2lnbmVkIGxvbmcgKnBJVjE2LCB1bnNpZ25lZCBsb25nICpwSVYzMikKK3sKKwlzdHJ1Y3QgcnRfdGtpcF9pdiB0a2lwSXY7CisKKwkvKiBQcmVwYXJlIDggYnl0ZXMgVEtJUCBlbmNhcHN1bGF0aW9uIGZvciBNUERVICovCisJTmRpc1plcm9NZW1vcnkoJnRraXBJdiwgc2l6ZW9mKHN0cnVjdCBydF90a2lwX2l2KSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMwID0gKihwVFNDICsgMSk7CisJdGtpcEl2LklWMTYuZmllbGQucmMxID0gKHRraXBJdi5JVjE2LmZpZWxkLnJjMCB8IDB4MjApICYgMHg3ZjsKKwl0a2lwSXYuSVYxNi5maWVsZC5yYzIgPSAqcFRTQzsKKwl0a2lwSXYuSVYxNi5maWVsZC5DT05UUk9MLmZpZWxkLkV4dElWID0gMTsJLyogMDogbm9uLWV4dGVuZGVkIElWLCAxOiBhbiBleHRlbmRlZCBJViAqLworCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuS2V5SUQgPSBLZXlJZDsKKy8qICAgICAgdGtpcEl2LklWMzIgPSAqKHVuc2lnbmVkIGxvbmcgKikocFRTQyArIDIpOyAqLworCU5kaXNNb3ZlTWVtb3J5KCZ0a2lwSXYuSVYzMiwgKHBUU0MgKyAyKSwgNCk7CS8qIENvcHkgSVYgKi8KKworCSpwSVYxNiA9IHRraXBJdi5JVjE2LndvcmQ7CisJKnBJVjMyID0gdGtpcEl2LklWMzI7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlJbml0IE1JQyBWYWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB3aGljaCBpbmNsdWRlIHNldCBNSUMga2V5ICYKKwkJY2FsY3VsYXRlIGZpcnN0IDE2IGJ5dGVzIChEQSArIFNBICsgcHJpb3JpdHkgKyAgMCkKKworCUFyZ3VtZW50czoKKyAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KKwkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCisJCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcworCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUEluaXRNSUNFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBLZXksCisJCSAgICAgICB1OCAqcERBLAorCQkgICAgICAgdTggKnBTQSwgdTggVXNlclByaW9yaXR5LCB1OCAqcE1JQ0tleSkKK3sKKwl1bnNpZ25lZCBsb25nIFByaW9yaXR5ID0gVXNlclByaW9yaXR5OworCisJLyogSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24gKi8KKwlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcE1JQ0tleSk7CisJLyogREEgKi8KKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcERBLCBNQUNfQUREUl9MRU4pOworCS8qIFNBICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTQSwgTUFDX0FERFJfTEVOKTsKKwkvKiBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMCAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCAodTggKikmIFByaW9yaXR5LCA0KTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKKworCUFyZ3VtZW50czoKKwkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKwkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgUGxhaW4gdGV4dCBkYXRhCisJCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcworCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKKwkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5CisJCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBsYWluIHRleHQgZGF0YSBleGNsdWRlIE1JQyB2YWx1ZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFICAgICAgICBNSUMgdmFsdWUgbWF0Y2hlZAorCQlGQUxTRSAgICAgICBNSUMgdmFsdWUgbWlzbWF0Y2hlZAorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTggKnBTcmMsCisJCQkJdTggKnBEQSwKKwkJCQl1OCAqcFNBLAorCQkJCXU4ICpwTUlDS2V5LAorCQkJCXU4IFVzZXJQcmlvcml0eSwgdTMyIExlbikKK3sKKwl1OCBPbGRNaWNbOF07CisJdW5zaWduZWQgbG9uZyBQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKKworCS8qIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uICovCisJUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOworCS8qIERBICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKKwkvKiBTQSAqLworCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7CisJLyogUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAgKi8KKwlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKHU4ICopJiBQcmlvcml0eSwgNCk7CisKKwkvKiBDYWxjdWxhdGUgTUlDIHZhbHVlIGZyb20gcGxhaW4gdGV4dCBkYXRhICovCisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTcmMsIExlbik7CisKKwkvKiBHZXQgTUlDIHZhbHVkZSBmcm9tIHJlY2VpdmVkIGZyYW1lICovCisJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwU3JjICsgTGVuLCA4KTsKKworCS8qIEdldCBNSUMgdmFsdWUgZnJvbSBkZWNyeXB0ZWQgcGxhaW4gZGF0YSAqLworCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlJ4KTsKKworCS8qIE1vdmUgTUlDIHZhbHVlIGZyb20gTVNEVSwgdGhpcyBzdGVwcyBzaG91bGQgbW92ZSB0byBkYXRhIHBhdGguICovCisJLyogU2luY2UgdGhlIE1JQyB2YWx1ZSBtaWdodCBjcm9zcyBNUERVcy4gKi8KKwlpZiAoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoKTogVEtJUCBNSUMgRXJyb3IgIVxuIikpOwkvKk1JQyBlcnJvci4gKi8KKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisJcmV0dXJuIChUUlVFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSB0cmFuc21pdCBmdW5jdGlvbgorCisJQXJndW1lbnRzOgorCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJdm9pZCAqCVBvaW50ZXIgdG8gTmRpcyBQYWNrZXQgZm9yIE1JQyBjYWxjdWxhdGlvbgorCQlwRW5jYXAJCQlQb2ludGVyIHRvIExMQyBlbmNhcCBkYXRhCisJCUxlbkVuY2FwCQlUb3RhbCBlbmNhcCBsZW5ndGgsIG1pZ2h0IGJlIDAgd2hpY2ggaW5kaWNhdGVzIG5vIGVuY2FwCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKnBQYWNrZXQsCisJCQkgICB1OCAqcEVuY2FwLAorCQkJICAgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBLZXksIHU4IGFwaWR4KQoreworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXU4ICpwU3JjQnVmVkE7CisJdTMyIFNyY0J1ZkxlbjsKKwl1OCAqcFNyYzsKKwl1OCBVc2VyUHJpb3JpdHk7CisJdTggdmxhbl9vZmZzZXQgPSAwOworCisJUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOworCisJVXNlclByaW9yaXR5ID0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOworCXBTcmMgPSBwU3JjQnVmVkE7CisKKwkvKiBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHZsYW4gcGFja2V0ICovCisJaWYgKCgoKihwU3JjICsgMTIpIDw8IDgpICsgKihwU3JjICsgMTMpKSA9PSAweDgxMDApCisJCXZsYW5fb2Zmc2V0ID0gNDsKKworCXsKKwkJUlRNUEluaXRNSUNFbmdpbmUocEFkLAorCQkJCSAgcEtleS0+S2V5LAorCQkJCSAgcFNyYywgcFNyYyArIDYsIFVzZXJQcmlvcml0eSwgcEtleS0+VHhNaWMpOworCX0KKworCWlmIChwRW5jYXAgIT0gTlVMTCkgeworCQkvKiBMTEMgZW5jYXBzdWxhdGlvbiAqLworCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcEVuY2FwLCA2KTsKKwkJLyogUHJvdG9jb2wgVHlwZSAqLworCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYyArIDEyICsgdmxhbl9vZmZzZXQsCisJCQkgICAgICAgMik7CisJfQorCVNyY0J1ZkxlbiAtPSAoMTQgKyB2bGFuX29mZnNldCk7CisJcFNyYyArPSAoMTQgKyB2bGFuX29mZnNldCk7CisJZG8geworCQlpZiAoU3JjQnVmTGVuID4gMCkgeworCQkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMsIFNyY0J1Zkxlbik7CisJCX0KKworCQlicmVhazsJCS8qIE5vIG5lZWQgaGFuZGxlIG5leHQgcGFja2V0ICovCisKKwl9IHdoaWxlIChUUlVFKTsJCS8qIEVuZCBvZiBjb3B5aW5nIHBheWxvYWQgKi8KKworCS8qIENvbXB1dGUgdGhlIGZpbmFsIE1JQyBWYWx1ZSAqLworCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRraXBfc2JveCgpCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm5zIGEgMTYgYml0IHZhbHVlIGZyb20gYSA2NEsgZW50cnkgdGFibGUuIFRoZSBUYWJsZSAqLworLyogaXMgc3ludGhlc2l6ZWQgZnJvbSB0d28gMjU2IGVudHJ5IGJ5dGUgd2lkZSB0YWJsZXMuCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIHRraXBfc2JveCh1MzIgaW5kZXgpCit7CisJdTMyIGluZGV4X2xvdzsKKwl1MzIgaW5kZXhfaGlnaDsKKwl1MzIgbGVmdCwgcmlnaHQ7CisKKwlpbmRleF9sb3cgPSAoaW5kZXggJSAyNTYpOworCWluZGV4X2hpZ2ggPSAoKGluZGV4ID4+IDgpICUgMjU2KTsKKworCWxlZnQgPSBUa2lwX1Nib3hfTG93ZXJbaW5kZXhfbG93XSArIChUa2lwX1Nib3hfVXBwZXJbaW5kZXhfbG93XSAqIDI1Nik7CisJcmlnaHQgPQorCSAgICBUa2lwX1Nib3hfVXBwZXJbaW5kZXhfaGlnaF0gKyAoVGtpcF9TYm94X0xvd2VyW2luZGV4X2hpZ2hdICogMjU2KTsKKworCXJldHVybiAobGVmdCBeIHJpZ2h0KTsKK30KKwordTMyIHJvdHIxKHUzMiBhKQoreworCXVuc2lnbmVkIGludCBiOworCisJaWYgKChhICYgMHgwMSkgPT0gMHgwMSkgeworCQliID0gKGEgPj4gMSkgfCAweDgwMDA7CisJfSBlbHNlIHsKKwkJYiA9IChhID4+IDEpICYgMHg3ZmZmOworCX0KKwliID0gYiAlIDY1NTM2OworCXJldHVybiBiOworfQorCit2b2lkIFJUTVBUa2lwTWl4S2V5KHU4ICoga2V5LCB1OCAqIHRhLCB1bnNpZ25lZCBsb25nIHBubCwJLyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLworCQkgICAgdW5zaWduZWQgbG9uZyBwbmgsCS8qIE1vc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBQTiAqLworCQkgICAgdTggKiByYzRrZXksIHUzMiAqIHAxaykKK3sKKworCXUzMiB0c2MwOworCXUzMiB0c2MxOworCXUzMiB0c2MyOworCisJdTMyIHBwazA7CisJdTMyIHBwazE7CisJdTMyIHBwazI7CisJdTMyIHBwazM7CisJdTMyIHBwazQ7CisJdTMyIHBwazU7CisKKwlpbnQgaTsKKwlpbnQgajsKKworCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsJLyogbXNiICovCisJdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKKwl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOwkvKiBsc2IgKi8KKworCS8qIFBoYXNlIDEsIHN0ZXAgMSAqLworCXAxa1swXSA9IHRzYzE7CisJcDFrWzFdID0gdHNjMDsKKwlwMWtbMl0gPSAodTMyKSh0YVswXSArICh0YVsxXSAqIDI1NikpOworCXAxa1szXSA9ICh1MzIpKHRhWzJdICsgKHRhWzNdICogMjU2KSk7CisJcDFrWzRdID0gKHUzMikodGFbNF0gKyAodGFbNV0gKiAyNTYpKTsKKworCS8qIFBoYXNlIDEsIHN0ZXAgMiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaiA9IDIgKiAoaSAmIDEpOworCQlwMWtbMF0gPQorCQkgICAgKHAxa1swXSArCisJCSAgICAgdGtpcF9zYm94KChwMWtbNF0gXiAoKDI1NiAqIGtleVsxICsgal0pICsga2V5W2pdKSkgJQorCQkJICAgICAgIDY1NTM2KSkgJSA2NTUzNjsKKwkJcDFrWzFdID0KKwkJICAgIChwMWtbMV0gKworCQkgICAgIHRraXBfc2JveCgocDFrWzBdIF4gKCgyNTYgKiBrZXlbNSArIGpdKSArIGtleVs0ICsgal0pKSAlCisJCQkgICAgICAgNjU1MzYpKSAlIDY1NTM2OworCQlwMWtbMl0gPQorCQkgICAgKHAxa1syXSArCisJCSAgICAgdGtpcF9zYm94KChwMWtbMV0gXiAoKDI1NiAqIGtleVs5ICsgal0pICsga2V5WzggKyBqXSkpICUKKwkJCSAgICAgICA2NTUzNikpICUgNjU1MzY7CisJCXAxa1szXSA9CisJCSAgICAocDFrWzNdICsKKwkJICAgICB0a2lwX3Nib3goKHAxa1syXSBeICgoMjU2ICoga2V5WzEzICsgal0pICsga2V5WzEyICsgal0pKSAlCisJCQkgICAgICAgNjU1MzYpKSAlIDY1NTM2OworCQlwMWtbNF0gPQorCQkgICAgKHAxa1s0XSArCisJCSAgICAgdGtpcF9zYm94KChwMWtbM10gXiAoKCgyNTYgKiBrZXlbMSArIGpdKSArIGtleVtqXSkpKSAlCisJCQkgICAgICAgNjU1MzYpKSAlIDY1NTM2OworCQlwMWtbNF0gPSAocDFrWzRdICsgaSkgJSA2NTUzNjsKKwl9CisKKwkvKiBQaGFzZSAyLCBTdGVwIDEgKi8KKwlwcGswID0gcDFrWzBdOworCXBwazEgPSBwMWtbMV07CisJcHBrMiA9IHAxa1syXTsKKwlwcGszID0gcDFrWzNdOworCXBwazQgPSBwMWtbNF07CisJcHBrNSA9IChwMWtbNF0gKyB0c2MyKSAlIDY1NTM2OworCisJLyogUGhhc2UyLCBTdGVwIDIgKi8KKwlwcGswID0gcHBrMCArIHRraXBfc2JveCgocHBrNSBeICgoMjU2ICoga2V5WzFdKSArIGtleVswXSkpICUgNjU1MzYpOworCXBwazEgPSBwcGsxICsgdGtpcF9zYm94KChwcGswIF4gKCgyNTYgKiBrZXlbM10pICsga2V5WzJdKSkgJSA2NTUzNik7CisJcHBrMiA9IHBwazIgKyB0a2lwX3Nib3goKHBwazEgXiAoKDI1NiAqIGtleVs1XSkgKyBrZXlbNF0pKSAlIDY1NTM2KTsKKwlwcGszID0gcHBrMyArIHRraXBfc2JveCgocHBrMiBeICgoMjU2ICoga2V5WzddKSArIGtleVs2XSkpICUgNjU1MzYpOworCXBwazQgPSBwcGs0ICsgdGtpcF9zYm94KChwcGszIF4gKCgyNTYgKiBrZXlbOV0pICsga2V5WzhdKSkgJSA2NTUzNik7CisJcHBrNSA9IHBwazUgKyB0a2lwX3Nib3goKHBwazQgXiAoKDI1NiAqIGtleVsxMV0pICsga2V5WzEwXSkpICUgNjU1MzYpOworCisJcHBrMCA9IHBwazAgKyByb3RyMShwcGs1IF4gKCgyNTYgKiBrZXlbMTNdKSArIGtleVsxMl0pKTsKKwlwcGsxID0gcHBrMSArIHJvdHIxKHBwazAgXiAoKDI1NiAqIGtleVsxNV0pICsga2V5WzE0XSkpOworCXBwazIgPSBwcGsyICsgcm90cjEocHBrMSk7CisJcHBrMyA9IHBwazMgKyByb3RyMShwcGsyKTsKKwlwcGs0ID0gcHBrNCArIHJvdHIxKHBwazMpOworCXBwazUgPSBwcGs1ICsgcm90cjEocHBrNCk7CisKKwkvKiBQaGFzZSAyLCBTdGVwIDMgKi8KKwkvKiBQaGFzZSAyLCBTdGVwIDMgKi8KKworCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsJLyogbXNiICovCisJdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKKwl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOwkvKiBsc2IgKi8KKworCXJjNGtleVswXSA9ICh0c2MyID4+IDgpICUgMjU2OworCXJjNGtleVsxXSA9ICgoKHRzYzIgPj4gOCkgJSAyNTYpIHwgMHgyMCkgJiAweDdmOworCXJjNGtleVsyXSA9IHRzYzIgJSAyNTY7CisJcmM0a2V5WzNdID0gKChwcGs1IF4gKCgyNTYgKiBrZXlbMV0pICsga2V5WzBdKSkgPj4gMSkgJSAyNTY7CisKKwlyYzRrZXlbNF0gPSBwcGswICUgMjU2OworCXJjNGtleVs1XSA9IChwcGswID4+IDgpICUgMjU2OworCisJcmM0a2V5WzZdID0gcHBrMSAlIDI1NjsKKwlyYzRrZXlbN10gPSAocHBrMSA+PiA4KSAlIDI1NjsKKworCXJjNGtleVs4XSA9IHBwazIgJSAyNTY7CisJcmM0a2V5WzldID0gKHBwazIgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbMTBdID0gcHBrMyAlIDI1NjsKKwlyYzRrZXlbMTFdID0gKHBwazMgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbMTJdID0gcHBrNCAlIDI1NjsKKwlyYzRrZXlbMTNdID0gKHBwazQgPj4gOCkgJSAyNTY7CisKKwlyYzRrZXlbMTRdID0gcHBrNSAlIDI1NjsKKwlyYzRrZXlbMTVdID0gKHBwazUgPj4gOCkgJSAyNTY7Cit9CisKKy8qICovCisvKiBUUlVFOiBTdWNjZXNzISAqLworLyogRkFMU0U6IERlY3J5cHQgRXJyb3IhICovCisvKiAqLworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCAqcERhdGEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwKKwkJCSAgICB1OCBVc2VyUHJpb3JpdHksIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5KQoreworCXU4IEtleUlEOworCXUzMiBIZWFkZXJMZW47CisJdTggZmMwOworCXU4IGZjMTsKKwl1MTYgZmM7CisJdTMyIGZyYW1lX3R5cGU7CisJdTMyIGZyYW1lX3N1YnR5cGU7CisJdTMyIGZyb21fZHM7CisJdTMyIHRvX2RzOworCWludCBhNF9leGlzdHM7CisJaW50IHFjX2V4aXN0czsKKwl1MTYgZHVyYXRpb247CisJdTE2IHNlcV9jb250cm9sOworCXUxNiBxb3NfY29udHJvbDsKKwl1OCBUQVtNQUNfQUREUl9MRU5dOworCXU4IERBW01BQ19BRERSX0xFTl07CisJdTggU0FbTUFDX0FERFJfTEVOXTsKKwl1OCBSQzRLZXlbMTZdOworCXUzMiBwMWtbNV07CQkvKmZvciBtaXhfa2V5OyAqLworCXVuc2lnbmVkIGxvbmcgcG5sOwkJLyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLworCXVuc2lnbmVkIGxvbmcgcG5oOwkJLyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCisJdTMyIG51bV9ibG9ja3M7CisJdTMyIHBheWxvYWRfcmVtYWluZGVyOworCXN0cnVjdCBydF9hcmNmb3VyY29udGV4dCBBcmNGb3VyQ29udGV4dDsKKwl1MzIgY3JjMzIgPSAwOworCXUzMiB0cmFpbGZjcyA9IDA7CisJdTggTUlDWzhdOworCXU4IFRyYWlsTUlDWzhdOworCisJZmMwID0gKnBEYXRhOworCWZjMSA9ICoocERhdGEgKyAxKTsKKworCWZjID0gKigodTE2ICopcERhdGEpOworCisJZnJhbWVfdHlwZSA9ICgoZmMwID4+IDIpICYgMHgwMyk7CisJZnJhbWVfc3VidHlwZSA9ICgoZmMwID4+IDQpICYgMHgwZik7CisKKwlmcm9tX2RzID0gKGZjMSAmIDB4MikgPj4gMTsKKwl0b19kcyA9IChmYzEgJiAweDEpOworCisJYTRfZXhpc3RzID0gKGZyb21fZHMgJiB0b19kcyk7CisJcWNfZXhpc3RzID0gKChmcmFtZV9zdWJ0eXBlID09IDB4MDgpIHx8CS8qIEFzc3VtZWQgUW9TIHN1YnR5cGVzICovCisJCSAgICAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwJLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KKwkJICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBhKSB8fCAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQorCSAgICApOworCisJSGVhZGVyTGVuID0gMjQ7CisJaWYgKGE0X2V4aXN0cykKKwkJSGVhZGVyTGVuICs9IDY7CisKKwlLZXlJRCA9ICooKHU4ICopKHBEYXRhICsgSGVhZGVyTGVuICsgMykpOworCUtleUlEID0gS2V5SUQgPj4gNjsKKworCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsCisJCQkgIEtleUlEKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkdXJhdGlvbiA9ICooKHUxNiAqKShwRGF0YSArIDIpKTsKKworCXNlcV9jb250cm9sID0gKigodTE2ICopKHBEYXRhICsgMjIpKTsKKworCWlmIChxY19leGlzdHMpIHsKKwkJaWYgKGE0X2V4aXN0cykgeworCQkJcW9zX2NvbnRyb2wgPSAqKCh1MTYgKikocERhdGEgKyAzMCkpOworCQl9IGVsc2UgeworCQkJcW9zX2NvbnRyb2wgPSAqKCh1MTYgKikocERhdGEgKyAyNCkpOworCQl9CisJfQorCisJaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAxKSB7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSArIDQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSArIDE2LCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGEgKyAxMCwgTUFDX0FERFJfTEVOKTsJLypCU1NJRCAqLworCX0gZWxzZSBpZiAodG9fZHMgPT0gMCAmJiBmcm9tX2RzID09IDApIHsKKwkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhICsgMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSArIDQsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCX0gZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDApIHsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhICsgMTAsIE1BQ19BRERSX0xFTik7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGEgKyAxNiwgTUFDX0FERFJfTEVOKTsKKwl9IGVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAxKSB7CisJCU5kaXNNb3ZlTWVtb3J5KFRBLCBwRGF0YSArIDEwLCBNQUNfQUREUl9MRU4pOworCQlOZGlzTW92ZU1lbW9yeShEQSwgcERhdGEgKyAxNiwgTUFDX0FERFJfTEVOKTsKKwkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhICsgMjIsIE1BQ19BRERSX0xFTik7CisJfQorCisJbnVtX2Jsb2NrcyA9IChEYXRhQnl0ZUNudCAtIDE2KSAvIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKERhdGFCeXRlQ250IC0gMTYpICUgMTY7CisKKwlwbmwgPSAoKihwRGF0YSArIEhlYWRlckxlbikpICogMjU2ICsgKihwRGF0YSArIEhlYWRlckxlbiArIDIpOworCXBuaCA9ICooKHVuc2lnbmVkIGxvbmcgKikocERhdGEgKyBIZWFkZXJMZW4gKyA0KSk7CisJcG5oID0gY3B1MmxlMzIocG5oKTsKKwlSVE1QVGtpcE1peEtleShwV3BhS2V5W0tleUlEXS5LZXksIFRBLCBwbmwsIHBuaCwgUkM0S2V5LCBwMWspOworCisJQVJDRk9VUl9JTklUKCZBcmNGb3VyQ29udGV4dCwgUkM0S2V5LCAxNik7CisKKwlBUkNGT1VSX0RFQ1JZUFQoJkFyY0ZvdXJDb250ZXh0LCBwRGF0YSArIEhlYWRlckxlbiwKKwkJCXBEYXRhICsgSGVhZGVyTGVuICsgOCwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4KTsKKwlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gNCwgNCk7CisJY3JjMzIgPSBSVE1QX0NBTENfRkNTMzIoUFBQSU5JVEZDUzMyLCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gNCk7CS8qU2tpcCBJVitFSVYgOCBieXRlcyAmIFNraXAgbGFzdCA0IGJ5dGVzKEZDUykuICovCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsJLyogY29tcGxlbWVudCAqLworCisJaWYgKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBJQ1YgRXJyb3IgIVxuIikpOwkvKklDViBlcnJvci4gKi8KKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA4IC0gNCwgOCk7CisJUlRNUEluaXRNSUNFbmdpbmUocEFkLCBwV3BhS2V5W0tleUlEXS5LZXksIERBLCBTQSwgVXNlclByaW9yaXR5LAorCQkJICBwV3BhS2V5W0tleUlEXS5SeE1pYyk7CisJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEYXRhICsgSGVhZGVyTGVuLAorCQkgICAgICAgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gMTIpOworCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKKwlOZGlzTW92ZU1lbW9yeShNSUMsIHBBZC0+UHJpdmF0ZUluZm8uVHguTUlDLCA4KTsKKworCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIE1JQyBFcnJvciAhXG4iKSk7CS8qTUlDIGVycm9yLiAqLworCQkvKlJUTVBSZXBvcnRNaWNFcnJvcihwQWQsICZwV3BhS2V5W0tleUlEXSk7ICAgICAvLyBtYXJrZWQgYnkgQWxiZXJ0WSBAIDIwMDYwNjMwICovCisJCXJldHVybiAoRkFMU0UpOworCX0KKwkvKkRCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAiUlRNUFNvZnREZWNyeXB0VEtJUCBEZWNyaXB0IGRvbmUhXG4iKTsgKi8KKwlyZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd2VwLmMKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF93ZXAuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dlcC5jCmluZGV4IDhlODMzZTcuLjc2Zjg4MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfd2VwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dlcC5jCkBAIC0zNSwxMCArMzUsOSBAQAogCVBhdWwgV3UJCTEwLTI4LTAyCQlJbml0aWFsCiAqLwogCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCiAKLVVJTlQgRkNTVEFCXzMyWzI1Nl0gPQotewordTMyIEZDU1RBQl8zMlsyNTZdID0gewogCTB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsCiAJMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywKIAkweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LApAQCAtMTA2LDYgKzEwNSwxNSBAQAogfTsKIAogLyoKK3U4ICAgV0VQS0VZW10gPSB7CisJCS8vSVYKKwkJMHgwMCwgMHgxMSwgMHgyMiwKKwkJLy9XRVAgS0VZCisJCTB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4QUEsIDB4QkIsIDB4Q0MKKwl9OworICovCisKKy8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAlSb3V0aW5lCURlc2NyaXB0aW9uOgpAQCAtMTI3LDM5ICsxMzUsMzEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUEluaXRXZXBFbmdpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEtleSwKLQlJTglVQ0hBUgkJCUtleUlkLAotCUlOCVVDSEFSCQkJS2V5TGVuLAotCUlOIE9VVAlQVUNIQVIJCXBEZXN0KQordm9pZCBSVE1QSW5pdFdlcEVuZ2luZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEtleSwKKwkJICAgICAgIHU4IEtleUlkLCB1OCBLZXlMZW4sIElOIHU4ICpwRGVzdCkKIHsKLQlVSU5UIGk7Ci0JVUNIQVIgICBXRVBLRVlbXSA9IHsKLQkJLy9JVgorCXUzMiBpOworCXU4IFdFUEtFWVtdID0geworCQkvKklWICovCiAJCTB4MDAsIDB4MTEsIDB4MjIsCi0JCS8vV0VQIEtFWQotCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDCisJCS8qV0VQIEtFWSAqLworCQkweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LAorCQkgICAgMHhBQSwgMHhCQiwgMHhDQwogCX07CiAKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOyAgIC8vSW5pdCBjcmMzMi4KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOwkvKkluaXQgY3JjMzIuICovCiAKLSAgICBpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0gICAgewotICAgICAgICBBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcEtleSwgS2V5TGVuKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocERlc3QsIHBLZXksIDMpOyAgLy9BcHBlbmQgSW5pdCBWZWN0b3IKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKwl7CiAJCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBLZXksIEtleUxlbik7CiAKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQotCQkJV0VQS0VZW2ldID0gUmFuZG9tQnl0ZShwQWQpOyAgIC8vQ2FsbCBtbG1lIFJhbmRvbUJ5dGUoKSBmdW5jdGlvbi4KLQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwgS2V5TGVuICsgMyk7ICAvL0lOSVQgU0JPWCwgS0VZTEVOKzMoSVYpCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7CS8qQ2FsbCBtbG1lIFJhbmRvbUJ5dGUoKSBmdW5jdGlvbi4gKi8KKwkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwgS2V5TGVuICsgMyk7CS8qSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikgKi8KIAotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCi0gICAgfQotCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECisJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBXRVBLRVksIDMpOwkvKkFwcGVuZCBJbml0IFZlY3RvciAqLworCX0KKwkqKHBEZXN0ICsgMykgPSAoS2V5SWQgPDwgNik7CS8qQXBwZW5kIEtFWUlEICovCiAKIH0KIApAQCAtMTg0LDE3ICsxODQsMTQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUEVuY3J5cHREYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JVUlOVAkJCUxlbikKK3ZvaWQgUlRNUEVuY3J5cHREYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB1OCAqcFNyYywgdTggKnBEZXN0LCB1MzIgTGVuKQogewotCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgcFNyYywgTGVuKTsKKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0KKwkgICAgUlRNUF9DQUxDX0ZDUzMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIsIHBTcmMsIExlbik7CiAJQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCBwU3JjLCBMZW4pOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTIxNCw0MCArMjExLDQxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4gUFVDSEFSCQkJcERhdGEsCi0JSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KQorQk9PTEVBTiBSVE1QU29mdERlY3J5cHRXRVAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBHcm91cEtleSkKIHsKLQlVSU5UCXRyYWlsZmNzOwotCVVJTlQgICAgY3JjMzI7Ci0JVUNIQVIJS2V5SWR4OwotCVVDSEFSICAgV0VQS0VZW10gPSB7Ci0JCS8vSVYKKwl1MzIgdHJhaWxmY3M7CisJdTMyIGNyYzMyOworCXU4IEtleUlkeDsKKwl1OCBXRVBLRVlbXSA9IHsKKwkJLypJViAqLwogCQkweDAwLCAweDExLCAweDIyLAotCQkvL1dFUCBLRVkKLQkJMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQworCQkvKldFUCBLRVkgKi8KKwkJMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwKKwkJICAgIDB4QUEsIDB4QkIsIDB4Q0MKIAl9OwotCVVDSEFSIAkqcFBheWxvYWQgPSAoVUNIQVIgKilwRGF0YSArIExFTkdUSF84MDJfMTE7Ci0JVUxPTkcJcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIExFTkdUSF84MDJfMTE7CisJdTggKnBQYXlsb2FkID0gKHU4ICopIHBEYXRhICsgTEVOR1RIXzgwMl8xMTsKKwl1bnNpZ25lZCBsb25nIHBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOwogCi0JTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7ICAgIC8vR2V0IFdFUCBJVgorCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSwgcFBheWxvYWQsIDMpOwkvKkdldCBXRVAgSVYgKi8KIAogCUtleUlkeCA9ICgqKHBQYXlsb2FkICsgMykgJiAweGMwKSA+PiA2OwogCWlmIChwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gPT0gMCkKIAkJcmV0dXJuIChGQUxTRSk7CiAKLQlOZGlzTW92ZU1lbW9yeShXRVBLRVkgKyAzLCBwR3JvdXBLZXlbS2V5SWR4XS5LZXksIHBHcm91cEtleVtLZXlJZHhdLktleUxlbik7Ci0JQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIFdFUEtFWSwgcEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuICsgMyk7Ci0JQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBQYXlsb2FkLCBwUGF5bG9hZCArIDQsIHBheWxvYWRfbGVuIC0gNCk7CisJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEdyb3VwS2V5W0tleUlkeF0uS2V5LAorCQkgICAgICAgcEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuKTsKKwlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLAorCQkgICAgIHBHcm91cEtleVtLZXlJZHhdLktleUxlbiArIDMpOworCUFSQ0ZPVVJfREVDUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwUGF5bG9hZCwgcFBheWxvYWQgKyA0LAorCQkJcGF5bG9hZF9sZW4gLSA0KTsKIAlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBQYXlsb2FkICsgcGF5bG9hZF9sZW4gLSA4LCA0KTsKLQljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBQYXlsb2FkLCBwYXlsb2FkX2xlbiAtIDgpOyAgLy9Ta2lwIGxhc3QgNCBieXRlcyhGQ1MpLgotCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBQYXlsb2FkLCBwYXlsb2FkX2xlbiAtIDgpOwkvKlNraXAgbGFzdCA0IGJ5dGVzKEZDUykuICovCisJY3JjMzIgXj0gMHhmZmZmZmZmZjsJLyogY29tcGxlbWVudCAqLwogCi0gICAgaWYoY3JjMzIgIT0gY3B1MmxlMzIodHJhaWxmY3MpKQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISBXRVAgRGF0YSBDUkMgRXJyb3IgIVxuIikpOwkgLy9DUkMgZXJyb3IuCisJaWYgKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXRVAgRGF0YSBDUkMgRXJyb3IhXG4iKSk7CS8qQ1JDIGVycm9yLiAqLwogCQlyZXR1cm4gKEZBTFNFKTsKIAl9CiAJcmV0dXJuIChUUlVFKTsKQEAgLTI1NywxMCArMjU1LDEwIEBACiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSAiQVJDRk9VUiIgaW5pdGlhbGl6ZQorCQlUaGUgU3RyZWFtIENpcGhlciBFbmNyeXB0aW9uIEFsZ29yaXRobSAic3RydWN0IHJ0X2FyY2ZvdXIiIGluaXRpYWxpemUKIAogCUFyZ3VtZW50czoKLQkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKKwkgICBDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCiAJCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKIAkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQogCkBAIC0yNzMsMjYgKzI3MSwyMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlBUkNGT1VSX0lOSVQoCi0JSU4JUEFSQ0ZPVVJDT05URVhUCUN0eCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVVJTlQJCQlLZXlMZW4pCit2b2lkIEFSQ0ZPVVJfSU5JVChzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCwgdTggKnBLZXksIHUzMiBLZXlMZW4pCiB7Ci0JVUNIQVIJdCwgdTsKLQlVSU5UCWtleWluZGV4OwotCVVJTlQJc3RhdGVpbmRleDsKLQlQVUNIQVIJc3RhdGU7Ci0JVUlOVAljb3VudGVyOworCXU4IHQsIHU7CisJdTMyIGtleWluZGV4OworCXUzMiBzdGF0ZWluZGV4OworCXU4ICpzdGF0ZTsKKwl1MzIgY291bnRlcjsKIAogCXN0YXRlID0gQ3R4LT5TVEFURTsKIAlDdHgtPlggPSAwOwogCUN0eC0+WSA9IDA7CiAJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQotCQlzdGF0ZVtjb3VudGVyXSA9IChVQ0hBUiljb3VudGVyOworCQlzdGF0ZVtjb3VudGVyXSA9ICh1OCljb3VudGVyOwogCWtleWluZGV4ID0gMDsKIAlzdGF0ZWluZGV4ID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCi0JeworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykgewogCQl0ID0gc3RhdGVbY291bnRlcl07CiAJCXN0YXRlaW5kZXggPSAoc3RhdGVpbmRleCArIHBLZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOwogCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07CkBAIC0zMDcsMzcgKzMwMSwzNiBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAJUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJR2V0IGJ5dGVzIGZyb20gQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKwkJR2V0IGJ5dGVzIGZyb20gc3RydWN0IHJ0X2FyY2ZvdXIgQ09OVEVYVCAoUy1CT1gpCiAKIAlBcmd1bWVudHM6Ci0JICAgQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJICAgQ3R4ICAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfYXJjZm91ciBDT05URVhUIChTQk9YKQogCiAJUmV0dXJuIFZhbHVlOgotCSAgIFVDSEFSICAtIHRoZSB2YWx1ZSBvZiB0aGUgQVJDRk9VUiBDT05URVhUIChTLUJPWCkKKwkgICB1OCAgLSB0aGUgdmFsdWUgb2YgdGhlIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFMtQk9YKQogCiAJTm90ZToKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVVDSEFSCUFSQ0ZPVVJfQllURSgKLQlJTglQQVJDRk9VUkNPTlRFWFQJCUN0eCkKK3U4IEFSQ0ZPVVJfQllURShzdHJ1Y3QgcnRfYXJjZm91cmNvbnRleHQgKkN0eCkKIHsKLSAgVUlOVCB4OwotICBVSU5UIHk7Ci0gIFVDSEFSIHN4LCBzeTsKLSAgUFVDSEFSIHN0YXRlOworCXUzMiB4OworCXUzMiB5OworCXU4IHN4LCBzeTsKKwl1OCAqc3RhdGU7CiAKLSAgc3RhdGUgPSBDdHgtPlNUQVRFOwotICB4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKLSAgc3ggPSBzdGF0ZVt4XTsKLSAgeSA9IChzeCArIEN0eC0+WSkgJiAweGZmOwotICBzeSA9IHN0YXRlW3ldOwotICBDdHgtPlggPSB4OwotICBDdHgtPlkgPSB5OwotICBzdGF0ZVt5XSA9IHN4OwotICBzdGF0ZVt4XSA9IHN5OworCXN0YXRlID0gQ3R4LT5TVEFURTsKKwl4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKKwlzeCA9IHN0YXRlW3hdOworCXkgPSAoc3ggKyBDdHgtPlkpICYgMHhmZjsKKwlzeSA9IHN0YXRlW3ldOworCUN0eC0+WCA9IHg7CisJQ3R4LT5ZID0geTsKKwlzdGF0ZVt5XSA9IHN4OworCXN0YXRlW3hdID0gc3k7CiAKLSAgcmV0dXJuKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKKwlyZXR1cm4gKHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdKTsKIAogfQogCkBAIC0zNDgsNyArMzQxLDcgQEAKIAkJVGhlIFN0cmVhbSBDaXBoZXIgRGVjcnlwdGlvbiBBbGdvcml0aG0KIAogCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCisJCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X2FyY2ZvdXIgQ09OVEVYVCAoU0JPWCkKIAkJcERlc3QJCQlQb2ludGVyIHRvIHRoZSBEZXN0aW5hdGlvbgogCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSBTb3VyY2UgZGF0YQogCQlMZW4gICAgICAgICBJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBTb3VyY2UgZGF0YQpAQCAtMzYwLDEzICszNTMsMTAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJQVJDRk9VUl9ERUNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQordm9pZCBBUkNGT1VSX0RFQ1JZUFQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsCisJCSAgICAgdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbikKIHsKLQlVSU5UIGk7CisJdTMyIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCiAJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOwpAQCAtMzc5LDcgKzM2OSw3IEBACiAJCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtCiAKIAlBcmd1bWVudHM6Ci0JCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCiAJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KIAkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKIAkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQpAQCAtMzkzLDEzICszODMsMTAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQordm9pZCBBUkNGT1VSX0VOQ1JZUFQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsCisJCSAgICAgdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbikKIHsKLQlVSU5UIGk7CisJdTMyIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCiAJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOwpAQCAtNDEyLDMxICszOTksMjYgQEAKIAkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCiAKIAlBcmd1bWVudHM6Ci0JCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQorCQlDdHggICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9hcmNmb3VyIENPTlRFWFQgKFNCT1gpCiAJCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KIAkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKIAkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQogCi0KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLVZPSUQJV1BBQVJDRk9VUl9FTkNSWVBUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcERlc3QsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuKQordm9pZCBXUEFBUkNGT1VSX0VOQ1JZUFQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsCisJCQl1OCAqcERlc3QsIHU4ICpwU3JjLCB1MzIgTGVuKQogewotCVVJTlQgaTsKLSAgICAgICAgLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcworCXUzMiBpOworCS8qZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgICAgICBBUkNGT1VSX0JZVEUoQ3R4KTsKKwkJQVJDRk9VUl9CWVRFKEN0eCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCiAJCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTQ0OSw3ICs0MzEsNyBAQAogCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCiAKIAlSZXR1cm4gVmFsdWU6Ci0JCVVJTlQgLSBGQ1MgMzIgYml0cworCQl1MzIgLSBGQ1MgMzIgYml0cwogCiAJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKQEAgLTQ1NywxOCArNDM5LDE0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1VSU5UCVJUTVBfQ0FMQ19GQ1MzMigKLQlJTglVSU5UCUZjcywKLQlJTglQVUNIQVIJQ3AsCi0JSU4JSU5UCQlMZW4pCit1MzIgUlRNUF9DQUxDX0ZDUzMyKHUzMiBGY3MsIHU4ICpDcCwgaW50IExlbikKIHsKIAl3aGlsZSAoTGVuLS0pCi0JICAgRmNzID0gKCgoRmNzKSA+PiA4KSBeIEZDU1RBQl8zMlsoKEZjcykgXiAoKkNwKyspKSAmIDB4ZmZdKTsKKwkJRmNzID0gKCgoRmNzKSA+PiA4KSBeIEZDU1RBQl8zMlsoKEZjcykgXiAoKkNwKyspKSAmIDB4ZmZdKTsKIAogCXJldHVybiAoRmNzKTsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC00ODUsMTMgKzQ2MywxMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QU2V0SUNWKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUglwRGVzdCkKK3ZvaWQgUlRNUFNldElDVihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwRGVzdCkKIHsKLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KKwlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyIF49IDB4ZmZmZmZmZmY7CS8qIGNvbXBsZW1lbnQgKi8KIAlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gY3B1MmxlMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMik7CiAKLQlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsIChQVUNIQVIpICZwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCA0KTsKKwlBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcERlc3QsCisJCQkodTggKikmIHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIsIDQpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jbW1fd3BhLmMKaW5kZXggMmRlMjlmZC4uOTRlMTE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY21tX3dwYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NtbV93cGEuYwpAQCAtMzYsMjUgKzM2LDEyMTkgQEAKIAlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50CiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotLy8gV1BBIE9VSQotVUNIQVIJCU9VSV9XUEFfTk9ORV9BS01bNF0JCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDB9OwotVUNIQVIgICAgICAgT1VJX1dQQV9WRVJTSU9OWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1dFUDQwWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1RLSVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQV9DQ01QWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA0fTsKLVVDSEFSICAgICAgIE9VSV9XUEFfV0VQMTA0WzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBXzgwMjFYX0FLTVs0XQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfUFNLX0FLTVs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OwotLy8gV1BBMiBPVUkKLVVDSEFSICAgICAgIE9VSV9XUEEyX1dFUDQwWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl9US0lQWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX0NDTVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDR9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfODAyMVhfQUtNWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl9QU0tfQUtNWzRdICAgCT0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfV0VQMTA0WzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwNX07Ci0vLyBNU0EgT1VJCi1VQ0hBUiAgIAlPVUlfTVNBXzgwMjFYX0FLTVs0XSAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDA1fTsJCS8vIE5vdCB5ZXQgZmluYWwgLSBJRUVFIDgwMi4xMXMtRDEuMDYKLVVDSEFSICAgCU9VSV9NU0FfUFNLX0FLTVs0XSAgIAk9IHsweDAwLCAweDBGLCAweEFDLCAweDA2fTsJCS8vIE5vdCB5ZXQgZmluYWwgLSBJRUVFIDgwMi4xMXMtRDEuMDYKKy8qIFdQQSBPVUkgKi8KK3U4IE9VSV9XUEFfTk9ORV9BS01bNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDAgfTsKK3U4IE9VSV9XUEFfVkVSU0lPTls0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSB9OwordTggT1VJX1dQQV9XRVA0MFs0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSB9OwordTggT1VJX1dQQV9US0lQWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAyIH07Cit1OCBPVUlfV1BBX0NDTVBbNF0gPSB7IDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQgfTsKK3U4IE9VSV9XUEFfV0VQMTA0WzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDA1IH07Cit1OCBPVUlfV1BBXzgwMjFYX0FLTVs0XSA9IHsgMHgwMCwgMHg1MCwgMHhGMiwgMHgwMSB9OwordTggT1VJX1dQQV9QU0tfQUtNWzRdID0geyAweDAwLCAweDUwLCAweEYyLCAweDAyIH07CisKKy8qIFdQQTIgT1VJICovCit1OCBPVUlfV1BBMl9XRVA0MFs0XSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwMSB9OwordTggT1VJX1dQQTJfVEtJUFs0XSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwMiB9OwordTggT1VJX1dQQTJfQ0NNUFs0XSA9IHsgMHgwMCwgMHgwRiwgMHhBQywgMHgwNCB9OwordTggT1VJX1dQQTJfODAyMVhfQUtNWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAxIH07Cit1OCBPVUlfV1BBMl9QU0tfQUtNWzRdID0geyAweDAwLCAweDBGLCAweEFDLCAweDAyIH07Cit1OCBPVUlfV1BBMl9XRVAxMDRbNF0gPSB7IDB4MDAsIDB4MEYsIDB4QUMsIDB4MDUgfTsKKworc3RhdGljIHZvaWQgQ29uc3RydWN0RWFwb2xLZXlEYXRhKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCQkgIHU4IEdyb3VwS2V5V2VwU3RhdHVzLAorCQkJCSAgdTgga2V5RGVzY1ZlciwKKwkJCQkgIHU4IE1zZ1R5cGUsCisJCQkJICB1OCBEZWZhdWx0S2V5SWR4LAorCQkJCSAgdTggKiBHVEssCisJCQkJICB1OCAqIFJTTklFLAorCQkJCSAgdTggUlNOSUVfTEVOLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZyk7CisKK3N0YXRpYyB2b2lkIENhbGN1bGF0ZU1JQyh1OCBLZXlEZXNjVmVyLAorCQkJIHU4ICogUFRLLCBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZyk7CisKK3N0YXRpYyB2b2lkIFdwYUVBUFBhY2tldEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOworCitzdGF0aWMgdm9pZCBXcGFFQVBPTEFTRkFsZXJ0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKKworc3RhdGljIHZvaWQgV3BhRUFQT0xMb2dvZmZBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKKworc3RhdGljIHZvaWQgV3BhRUFQT0xTdGFydEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CisKK3N0YXRpYyB2b2lkIFdwYUVBUE9MS2V5QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAorICAgIFBhcmFtZXRlcnM6CisgICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBXcGFTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQoreworCVN0YXRlTWFjaGluZUluaXQoUywgKFNUQVRFX01BQ0hJTkVfRlVOQyAqKSBUcmFucywgTUFYX1dQQV9QVEtfU1RBVEUsCisJCQkgTUFYX1dQQV9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpIERyb3AsIFdQQV9QVEssCisJCQkgV1BBX01BQ0hJTkVfQkFTRSk7CisKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUFBhY2tldCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFdwYUVBUFBhY2tldEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTFN0YXJ0LAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQT0xTdGFydEFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTExvZ29mZiwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFdwYUVBUE9MTG9nb2ZmQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgV1BBX1BUSywgTVQyX0VBUE9MS2V5LAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgV3BhRUFQT0xLZXlBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQT0xBU0ZBbGVydCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24pOworfQorCisvKgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRGVzY3JpcHRpb246CisgICAgICAgIHRoaXMgaXMgc3RhdGUgbWFjaGluZSBmdW5jdGlvbi4KKyAgICAgICAgV2hlbiByZWNlaXZpbmcgRUFQIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXggYXV0aGVudGljYXRpb24gdXNlLgorICAgICAgICBOb3QgdXNlIGluIFBTSyBjYXNlCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBXcGFFQVBQYWNrZXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworfQorCit2b2lkIFdwYUVBUE9MQVNGQWxlcnRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworfQorCit2b2lkIFdwYUVBUE9MTG9nb2ZmQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgIFN0YXJ0IDQtd2F5IEhTIHdoZW4gcmN2IEVBUE9MX1NUQVJUIHdoaWNoIG1heSBjcmVhdGUgYnkgb3VyIGRyaXZlciBpbiBhc3NvYy5jCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBXcGFFQVBPTFN0YXJ0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhRUFQT0xTdGFydEFjdGlvbiA9PT0+IFxuIikpOworCisJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisKKwkvKkZvciBub3JtYW9sIFBTSywgd2UgZW5xdWV1ZSBhbiBFQVBPTC1TdGFydCBjb21tYW5kIHRvIHRyaWdnZXIgdGhlIHByb2Nlc3MuICovCisJaWYgKEVsZW0tPk1zZ0xlbiA9PSA2KQorCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEVsZW0tPk1zZyk7CisJZWxzZSB7CisJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOworCX0KKworCWlmIChwRW50cnkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIgUG9ydFNlY3VyZWQoJWQpLCBXcGFTdGF0ZSglZCksIEF1dGhNb2RlKCVkKSwgUE1LSURfQ2FjaGVJZHgoJWQpIFxuIiwKKwkJCSAgcEVudHJ5LT5Qb3J0U2VjdXJlZCwgcEVudHJ5LT5XcGFTdGF0ZSwKKwkJCSAgcEVudHJ5LT5BdXRoTW9kZSwgcEVudHJ5LT5QTUtJRF9DYWNoZUlkeCkpOworCisJCWlmICgocEVudHJ5LT5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCisJCSAgICAmJiAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX1BUS1NUQVJUKQorCQkgICAgJiYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKKwkJCXx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJCQl8fCAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJCSAgICAmJiAocEVudHJ5LT5QTUtJRF9DYWNoZUlkeCAhPSBFTlRSWV9OT1RfRk9VTkQpKSkpIHsKKwkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJCQlwRW50cnktPldwYVN0YXRlID0gQVNfSU5JVFBTSzsKKwkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwKKwkJCQkgICAgICAgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7CisJCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFI7CisKKwkJCVdQQVN0YXJ0NFdheUhTKHBBZCwgcEVudHJ5LCBQRUVSX01TRzFfUkVUUllfRVhFQ19JTlRWKTsKKwkJfQorCX0KK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBUaGlzIGlzIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCisgICAgICAgIFdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCisgICAgICAgIFVzZSBib3RoIGluIFdQQSwgYW5kIFdQQVBTSyBjYXNlLgorICAgICAgICBJbiB0aGlzIGZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudCBmdW5jdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSByZWNlaXZlZCBwYWNrZXQuICAzIGNhdGVnb3JpZXMgYXJlIDoKKyAgICAgICAgICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKKyAgICAgICAgICAyLiAgTUlDIGVycm9yIChDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldCBmcm9tIFNUQS4KKyAgICAgICAgICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZSBmcm9tIFNUQQorICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgV3BhRUFQT0xLZXlBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBFYXBvbF9wYWNrZXQ7CisJc3RydWN0IHJ0X2tleV9pbmZvIHBlZXJLZXlJbmZvOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhRUFQT0xLZXlBY3Rpb24gPT09PlxuIikpOworCisJcEhlYWRlciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJcEVhcG9sX3BhY2tldCA9CisJICAgIChzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisKKwlOZGlzWmVyb01lbW9yeSgodTggKikmIHBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKKwlOZGlzTW92ZU1lbW9yeSgodTggKikmIHBlZXJLZXlJbmZvLAorCQkgICAgICAgKHU4ICopJiBwRWFwb2xfcGFja2V0LT5LZXlEZXNjLktleUluZm8sCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2tleV9pbmZvKSk7CisKKwloZXhfZHVtcCgiUmVjZWl2ZWQgRWFwb2wgZnJhbWUiLCAodW5zaWduZWQgY2hhciAqKXBFYXBvbF9wYWNrZXQsCisJCSAoRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IKSk7CisKKwkqKCh1MTYgKikgJiBwZWVyS2V5SW5mbykgPSBjcHUybGUxNigqKCh1MTYgKikgJiBwZWVyS2V5SW5mbykpOworCisJZG8geworCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKKworCQlpZiAoIXBFbnRyeQorCQkgICAgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCQlicmVhazsKKworCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCWJyZWFrOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUmVjZWl2ZSBFQVBvTC1LZXkgZnJhbWUgZnJvbSBTVEEgJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIsCisJCQkgIFBSSU5UX01BQyhwRW50cnktPkFkZHIpKSk7CisKKwkJaWYgKCgocEVhcG9sX3BhY2tldC0+UHJvVmVyICE9IEVBUE9MX1ZFUikKKwkJICAgICAmJiAocEVhcG9sX3BhY2tldC0+UHJvVmVyICE9IEVBUE9MX1ZFUjIpKQorCQkgICAgfHwgKChwRWFwb2xfcGFja2V0LT5LZXlEZXNjLlR5cGUgIT0gV1BBMV9LRVlfREVTQykKKwkJCSYmIChwRWFwb2xfcGFja2V0LT5LZXlEZXNjLlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJLZXkgZGVzY3JpcHRlciBkb2VzIG5vdCBtYXRjaCB3aXRoIFdQQSBydWxlXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQkvKiBUaGUgdmFsdWUgMSBzaGFsbCBiZSB1c2VkIGZvciBhbGwgRUFQT0wtS2V5IGZyYW1lcyB0byBhbmQgZnJvbSBhIFNUQSB3aGVuICovCisJCS8qIG5laXRoZXIgdGhlIGdyb3VwIG5vciBwYWlyd2lzZSBjaXBoZXJzIGFyZSBDQ01QIGZvciBLZXkgRGVzY3JpcHRvciAxLiAqLworCQlpZiAoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCSAgICAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSBERVNDX1RZUEVfVEtJUCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIktleSBkZXNjcmlwdGVyIHZlcnNpb24gbm90IG1hdGNoKFRLSVApIFxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJLyogVGhlIHZhbHVlIDIgc2hhbGwgYmUgdXNlZCBmb3IgYWxsIEVBUE9MLUtleSBmcmFtZXMgdG8gYW5kIGZyb20gYSBTVEEgd2hlbiAqLworCQkvKiBlaXRoZXIgdGhlIHBhaXJ3aXNlIG9yIHRoZSBncm91cCBjaXBoZXIgaXMgQUVTLUNDTVAgZm9yIEtleSBEZXNjcmlwdG9yIDIuICovCisJCWVsc2UgaWYgKChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IERFU0NfVFlQRV9BRVMpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJLZXkgZGVzY3JpcHRlciB2ZXJzaW9uIG5vdCBtYXRjaChBRVMpIFxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJLyogQ2hlY2sgaWYgdGhpcyBTVEEgaXMgaW4gY2xhc3MgMyBzdGF0ZSBhbmQgdGhlIFdQQSBzdGF0ZSBpcyBzdGFydGVkICovCisJCWlmICgocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKQorCQkgICAgJiYgKHBFbnRyeS0+V3BhU3RhdGUgPj0gQVNfSU5JVFBTSykpIHsKKwkJCS8qIENoZWNrIHRoZSBLZXkgQWNrIChiaXQgNykgb2YgdGhlIEtleSBJbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgdGhlIEF1dGhlbnRpY2F0b3IgKi8KKwkJCS8qIG9yIG5vdC4gKi8KKwkJCS8qIEFuIEVBUE9MLUtleSBmcmFtZSB0aGF0IGlzIHNlbnQgYnkgdGhlIFN1cHBsaWNhbnQgaW4gcmVzcG9uc2UgdG8gYW4gRUFQT0wtICovCisJCQkvKiBLZXkgZnJhbWUgZnJvbSB0aGUgQXV0aGVudGljYXRvciBtdXN0IG5vdCBoYXZlIHRoZSBBY2sgYml0IHNldC4gKi8KKwkJCWlmIChwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgeworCQkJCS8qIFRoZSBmcmFtZSBpcyBzbmV0IGJ5IEF1dGhlbnRpY2F0b3IuICovCisJCQkJLyogU28gdGhlIFN1cHBsaWNhbnQgc2lkZSBzaGFsbCBoYW5kbGUgdGhpcy4gKi8KKworCQkJCWlmICgocGVlcktleUluZm8uU2VjdXJlID09IDApCisJCQkJICAgICYmIChwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApCisJCQkJICAgICYmIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKQorCQkJCSAgICAmJiAocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkpIHsKKwkJCQkJLyogUHJvY2VzcyAxLiB0aGUgbWVzc2FnZSAxIG9mIDQtd2F5IEhTIGluIFdQQSBvciBXUEEyICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0wtS2V5KDAsMCwxLDAsUCwwLDAsQU5vbmNlLDAsRGF0YUtEX00xKSAqLworCQkJCQkvKiAgICAgICAgICAgICAgICAgMi4gdGhlIG1lc3NhZ2UgMyBvZiA0LXdheSBIUyBpbiBXUEEgKi8KKwkJCQkJLyogICAgICAgICAgICAgICAgICAgICAgICBFQVBPTC1LZXkoMCwxLDEsMSxQLDAsS2V5UlNDLEFOb25jZSxNSUMsRGF0YUtEX00zKSAqLworCQkJCQlpZiAocGVlcktleUluZm8uS2V5TWljID09IDApCisJCQkJCQlQZWVyUGFpck1zZzFBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgIEVsZW0pOworCQkJCQllbHNlCisJCQkJCQlQZWVyUGFpck1zZzNBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgIEVsZW0pOworCQkJCX0gZWxzZSBpZiAoKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxKQorCQkJCQkgICAmJiAocGVlcktleUluZm8uS2V5TWljID09IDEpCisJCQkJCSAgICYmIChwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApCisJCQkJCSAgICYmIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKSkgeworCQkJCQkvKiBQcm9jZXNzIDEuIHRoZSBtZXNzYWdlIDMgb2YgNC13YXkgSFMgaW4gV1BBMiAqLworCQkJCQkvKiAgICAgICAgICAgICAgICAgICAgICAgIEVBUE9MLUtleSgxLDEsMSwxLFAsMCxLZXlSU0MsQU5vbmNlLE1JQyxEYXRhS0RfTTMpICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAyLiB0aGUgbWVzc2FnZSAxIG9mIGdyb3VwIEtTIGluIFdQQSBvciBXUEEyICovCisJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgRUFQT0wtS2V5KDEsMSwxLDAsRywwLEtleSBSU0MsMCwgTUlDLEdUS1tOXSkgKi8KKwkJCQkJaWYgKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpCisJCQkJCQlQZWVyUGFpck1zZzNBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgIEVsZW0pOworCQkJCQllbHNlCisJCQkJCQlQZWVyR3JvdXBNc2cxQWN0aW9uKHBBZCwgcEVudHJ5LAorCQkJCQkJCQkgICAgRWxlbSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgZnJhbWUgaXMgc25ldCBieSBTdXBwbGljYW50LiAqLworCQkJCS8qIFNvIHRoZSBBdXRoZW50aWNhdG9yIHNpZGUgc2hhbGwgaGFuZGxlIHRoaXMuICovCisJCQkJaWYgKChwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApICYmCisJCQkJICAgIChwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgorCQkJCSAgICAocGVlcktleUluZm8uS2V5TWljID09IDEpKSB7CisJCQkJCWlmIChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMAorCQkJCQkgICAgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PQorCQkJCQkgICAgUEFJUldJU0VLRVkpIHsKKwkJCQkJCS8qIEVBUE9MLUtleSgwLDEsMCwwLFAsMCwwLFNOb25jZSxNSUMsRGF0YSkgKi8KKwkJCQkJCS8qIFByb2Nlc3MgMS4gbWVzc2FnZSAyIG9mIDQtd2F5IEhTIGluIFdQQSBvciBXUEEyICovCisJCQkJCQkvKiAgICAgICAgICAgICAgICAgMi4gbWVzc2FnZSA0IG9mIDQtd2F5IEhTIGluIFdQQSAqLworCQkJCQkJaWYgKENPTlZfQVJSQVJZX1RPX3UxNgorCQkJCQkJICAgIChwRWFwb2xfcGFja2V0LT5LZXlEZXNjLgorCQkJCQkJICAgICBLZXlEYXRhTGVuKSA9PSAwKSB7CisJCQkJCQkJUGVlclBhaXJNc2c0QWN0aW9uKHBBZCwKKwkJCQkJCQkJCSAgIHBFbnRyeSwKKwkJCQkJCQkJCSAgIEVsZW0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlQZWVyUGFpck1zZzJBY3Rpb24ocEFkLAorCQkJCQkJCQkJICAgcEVudHJ5LAorCQkJCQkJCQkJICAgRWxlbSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAocGVlcktleUluZm8uU2VjdXJlID09IDEKKwkJCQkJCSAgICYmIHBlZXJLZXlJbmZvLktleVR5cGUgPT0KKwkJCQkJCSAgIFBBSVJXSVNFS0VZKSB7CisJCQkJCQkvKiBFQVBPTC1LZXkoMSwxLDAsMCxQLDAsMCwwLE1JQywwKSAqLworCQkJCQkJLyogUHJvY2VzcyBtZXNzYWdlIDQgb2YgNC13YXkgSFMgaW4gV1BBMiAqLworCQkJCQkJUGVlclBhaXJNc2c0QWN0aW9uKHBBZCwgcEVudHJ5LAorCQkJCQkJCQkgICBFbGVtKTsKKwkJCQkJfSBlbHNlIGlmIChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMQorCQkJCQkJICAgJiYgcGVlcktleUluZm8uS2V5VHlwZSA9PQorCQkJCQkJICAgR1JPVVBLRVkpIHsKKwkJCQkJCS8qIEVBUE9MLUtleSgxLDEsMCwwLEcsMCwwLDAsTUlDLDApICovCisJCQkJCQkvKiBQcm9jZXNzIG1lc3NhZ2UgMiBvZiBHcm91cCBrZXkgSFMgaW4gV1BBIG9yIFdQQTIgKi8KKwkJCQkJCVBlZXJHcm91cE1zZzJBY3Rpb24ocEFkLCBwRW50cnksCisJCQkJCQkJCSAgICAmRWxlbS0+CisJCQkJCQkJCSAgICBNc2cKKwkJCQkJCQkJICAgIFtMRU5HVEhfODAyXzExXSwKKwkJCQkJCQkJICAgIChFbGVtLT4KKwkJCQkJCQkJICAgICBNc2dMZW4gLQorCQkJCQkJCQkgICAgIExFTkdUSF84MDJfMTEpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKEZBTFNFKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUJRGVzY3JpcHRpb246CisJCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAorCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKKwlzZW50IG91dCB0byBhaXIuCisKKwlBcmd1bWVudHM6CisJCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgorCQl2b2lkICoJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCisJCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKKworCVJldHVybiBWYWx1ZToKKwkJTm9uZQorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUFRvV2lyZWxlc3NTdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkgICAgICAgdTggKnBIZWFkZXI4MDJfMywKKwkJICAgICAgIHUzMiBIZHJMZW4sCisJCSAgICAgICB1OCAqcERhdGEsIHUzMiBEYXRhTGVuLCBJTiBCT09MRUFOIGJDbGVhckZyYW1lKQoreworCXZvaWQgKnBQYWNrZXQ7CisJaW50IFN0YXR1czsKKworCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCXJldHVybjsKKworCWRvIHsKKwkJLyogYnVpbGQgYSBORElTIHBhY2tldCAqLworCQlTdGF0dXMgPQorCQkgICAgUlRNUEFsbG9jYXRlTmRpc1BhY2tldChwQWQsICZwUGFja2V0LCBwSGVhZGVyODAyXzMsIEhkckxlbiwKKwkJCQkJICAgcERhdGEsIERhdGFMZW4pOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoYkNsZWFyRnJhbWUpCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDEpOworCQllbHNlCisJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOworCQl7CisJCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKKworCQkJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHBQYWNrZXQsIE1BSU5fTUJTU0lEKTsJLyogc2V0IGEgZGVmYXVsdCB2YWx1ZSAqLworCQkJaWYgKHBFbnRyeS0+YXBpZHggIT0gMCkKKwkJCQlSVE1QX1NFVF9QQUNLRVRfTkVUX0RFVklDRV9NQlNTSUQocFBhY2tldCwKKwkJCQkJCQkJICBwRW50cnktPgorCQkJCQkJCQkgIGFwaWR4KTsKKworCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgKHU4KXBFbnRyeS0+QWlkKTsKKwkJCVJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0LCBGQUxTRSk7CisJCX0KKworCQl7CisJCQkvKiBzZW5kIG91dCB0aGUgcGFja2V0ICovCisJCQlTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7CisJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQl1OCBJbmRleDsKKworCQkJCS8qIERlcXVldWUgb25lIGZyYW1lIGZyb20gVHhTd1F1ZXVlMC4uMyBxdWV1ZSBhbmQgcHJvY2VzcyBpdCAqLworCQkJCS8qIFRoZXJlIGFyZSB0aHJlZSBwbGFjZSBjYWxsaW5nIGRlcXVldWUgZm9yIFRYIHJpbmcuICovCisJCQkJLyogMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLiAqLworCQkJCS8qIDIuIEF0IHRoZSBlbmQgb2YgVHhSaW5nVHhEb25lIHNlcnZpY2Ugcm91dGluZS4gKi8KKwkJCQkvKiAzLiBVcG9uIE5ESVMgY2FsbCBSVE1QU2VuZFBhY2tldHMgKi8KKwkJCQlpZiAoKCFSVE1QX1RFU1RfRkxBRworCQkJCSAgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCisJCQkJICAgICYmCisJCQkJICAgICghUlRNUF9URVNUX0ZMQUcKKwkJCQkgICAgIChwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSkgeworCQkJCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCA1OyBJbmRleCsrKQorCQkJCQkJaWYgKHBBZC0+VHhTd1F1ZXVlW0luZGV4XS4KKwkJCQkJCSAgICBOdW1iZXIgPiAwKQorCQkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwKKwkJCQkJCQkJCSAgRkFMU0UsCisJCQkJCQkJCQkgIEluZGV4LAorCQkJCQkJCQkJICBNQVhfVFhfUFJPQ0VTUyk7CisJCQkJfQorCQkJfQorCQl9CisKKwl9IHdoaWxlIChGQUxTRSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgVGhpcyBpcyBhIGZ1bmN0aW9uIHRvIGluaXRpbGl6ZSA0LXdheSBoYW5kc2hha2UKKworICAgIFJldHVybjoKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBXUEFTdGFydDRXYXlIUyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHVuc2lnbmVkIGxvbmcgVGltZUludGVydmFsKQoreworCXU4IEhlYWRlcjgwMl8zWzE0XTsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0IEVBUE9MUEtUOworCXU4ICpwQnNzaWQgPSBOVUxMOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gV1BBU3RhcnQ0V2F5SFNcbiIpKTsKKworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLAorCSAgICAgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCisJeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIltFUlJPUl1XUEFTdGFydDRXYXlIUyA6IFRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkLi4uXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocEJzc2lkID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJbRVJST1JdV1BBU3RhcnQ0V2F5SFMgOiBObyBjb3JyZXNwb25kaW5nIEF1dGhlbnRpY2F0b3IuXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyogQ2hlY2sgdGhlIHN0YXR1cyAqLworCWlmICgocEVudHJ5LT5XcGFTdGF0ZSA+IEFTX1BUS1NUQVJUKSB8fCAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX0lOSVRQTUspKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiW0VSUk9SXVdQQVN0YXJ0NFdheUhTIDogTm90IGV4cGVjdCBjYWxsaW5nXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJbmNyZW1lbnQgcmVwbGF5IGNvdW50ZXIgYnkgMSAqLworCUFERF9PTkVfVG9fNjRCSVRfVkFSKHBFbnRyeS0+Ul9Db3VudGVyKTsKKworCS8qIFJhbmRvbWx5IGdlbmVyYXRlIEFOb25jZSAqLworCUdlblJhbmRvbShwQWQsICh1OCAqKSBwQnNzaWQsIHBFbnRyeS0+QU5vbmNlKTsKKworCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDEgKi8KKwkvKiBFQVBPTC1LZXkoMCwwLDEsMCxQLDAsMCxBTm9uY2UsMCxEYXRhS0RfTTEpICovCisJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwgZ3JvdXBfY2lwaGVyLCBFQVBPTF9QQUlSX01TR18xLCAwLAkvKiBEZWZhdWx0IGtleSBpbmRleCAqLworCQkJICBwRW50cnktPkFOb25jZSwgTlVMTCwJLyogVHhSU0MgKi8KKwkJCSAgTlVMTCwJLyogR1RLICovCisJCQkgIE5VTEwsCS8qIFJTTklFICovCisJCQkgIDAsCS8qIFJTTklFIGxlbmd0aCAqLworCQkJICAmRUFQT0xQS1QpOworCisJLyogTWFrZSBvdXRnb2luZyBmcmFtZSAqLworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LCBIZWFkZXI4MDJfMywKKwkJCSAgTEVOR1RIXzgwMl8zLCAodTggKikmIEVBUE9MUEtULAorCQkJICBDT05WX0FSUkFSWV9UT191MTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwKKwkJCSAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0KKwkJCSAgIFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/IEZBTFNFIDogVFJVRSk7CisKKwkvKiBUcmlnZ2VyIFJldHJ5IFRpbWVyICovCisJUlRNUE1vZFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsIFRpbWVJbnRlcnZhbCk7CisKKwkvKiBVcGRhdGUgU3RhdGUgKi8KKwlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLU1RBUlQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBXUEFTdGFydDRXYXlIUzogc2VuZCBNc2cxIG9mIDQtd2F5IFxuIikpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSBNc2ctMSBvZiA0LXdheSBoYW5kc2hha2luZyBhbmQgc2VuZCBNc2ctMgorCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBQZWVyUGFpck1zZzFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXU4IFBUS1s4MF07CisJdTggSGVhZGVyODAyXzNbMTRdOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnMTsKKwl1MzIgTXNnTGVuOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJdTggKnBDdXJyZW50QWRkciA9IE5VTEw7CisJdTggKnBta19wdHIgPSBOVUxMOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl1OCAqcnNuaWVfcHRyID0gTlVMTDsKKwl1OCByc25pZV9sZW4gPSAwOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBQZWVyUGFpck1zZzFBY3Rpb24gXG4iKSk7CisKKwlpZiAoKCFwRW50cnkpIHx8ICgoIXBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKCFwRW50cnktPlZhbGlkQXNBcENsaSkpKQorCQlyZXR1cm47CisKKwlpZiAoRWxlbS0+TXNnTGVuIDwKKwkgICAgKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsKKwkgICAgIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQorCQlyZXR1cm47CisKKwl7CisJCXBDdXJyZW50QWRkciA9IHBBZC0+Q3VycmVudEFkZHJlc3M7CisJCXBta19wdHIgPSBwQWQtPlN0YUNmZy5QTUs7CisJCWdyb3VwX2NpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOworCQlyc25pZV9wdHIgPSBwQWQtPlN0YUNmZy5SU05fSUU7CisJCXJzbmllX2xlbiA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwl9CisKKwkvKiBTdG9yZSB0aGUgcmVjZWl2ZWQgZnJhbWUgKi8KKwlwTXNnMSA9IChzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisJTXNnTGVuID0gRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IOworCisJLyogU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSAxIC0gUmVwbGF5IENvdW50ZXIgKi8KKwlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnMSwgTXNnTGVuLCBFQVBPTF9QQUlSX01TR18xLCBwRW50cnkpCisJICAgID09IEZBTFNFKQorCQlyZXR1cm47CisKKwkvKiBTdG9yZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gdmVyaWZ5IG1lc3NhZ2UgMyBhbmQgY29uc3RydWN0IG1lc3NhZ2UgMiAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBwTXNnMS0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLAorCQkgICAgICAgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvKiBTdG9yZSBBTm9uY2UgKi8KKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsCisJCSAgICAgICBMRU5fS0VZX0RFU0NfTk9OQ0UpOworCisJLyogR2VuZXJhdGUgcmFuZG9tIFNOb25jZSAqLworCUdlblJhbmRvbShwQWQsICh1OCAqKSBwQ3VycmVudEFkZHIsIHBFbnRyeS0+U05vbmNlKTsKKworCXsKKwkJLyogQ2FsY3VsYXRlIFBUSyhBTm9uY2UsIFNOb25jZSkgKi8KKwkJV3BhRGVyaXZlUFRLKHBBZCwKKwkJCSAgICAgcG1rX3B0ciwKKwkJCSAgICAgcEVudHJ5LT5BTm9uY2UsCisJCQkgICAgIHBFbnRyeS0+QWRkciwKKwkJCSAgICAgcEVudHJ5LT5TTm9uY2UsIHBDdXJyZW50QWRkciwgUFRLLCBMRU5fUFRLKTsKKworCQkvKiBTYXZlIGtleSB0byBQVEsgZW50cnkgKi8KKwkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QVEssIFBUSywgTEVOX1BUSyk7CisJfQorCisJLyogVXBkYXRlIFdwYVN0YXRlICovCisJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7CisKKwkvKiBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIFBhaXJ3aXNlIE1zZyAyICovCisJLyogIEVBUE9MLUtleSgwLDEsMCwwLFAsMCwwLFNOb25jZSxNSUMsRGF0YUtEX00yKSAqLworCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQpKTsKKwlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksIGdyb3VwX2NpcGhlciwgRUFQT0xfUEFJUl9NU0dfMiwgMCwJLyogRGVmYXVsdEtleUlkeCAqLworCQkJICBwRW50cnktPlNOb25jZSwgTlVMTCwJLyogVHhSc2MgKi8KKwkJCSAgTlVMTCwJLyogR1RLICovCisJCQkgICh1OCAqKSByc25pZV9wdHIsIHJzbmllX2xlbiwgJkVBUE9MUEtUKTsKKworCS8qIE1ha2Ugb3V0Z29pbmcgZnJhbWUgKi8KKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQ3VycmVudEFkZHIsIEVBUE9MKTsKKworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAorCQkJICBIZWFkZXI4MDJfMywgc2l6ZW9mKEhlYWRlcjgwMl8zKSwgKHU4ICopJiBFQVBPTFBLVCwKKwkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIFRSVUUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PT0gUGVlclBhaXJNc2cxQWN0aW9uOiBzZW5kIE1zZzIgb2YgNC13YXkgXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIHNlY29uZCBwYWNrZXQgb2YgNC13YXkgcGFpcndpc2VrZXkgaGFuZHNoYWtlLgorICAgIFJldHVybjoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUGVlclBhaXJNc2cyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKK3sKKwl1OCBQVEtbODBdOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0IEVBUE9MUEtUOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnMjsKKwl1MzIgTXNnTGVuOworCXU4IEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107CisJdTggVHhUc2NbNl07CisJdTggKnBCc3NpZCA9IE5VTEw7CisJdTggKnBta19wdHIgPSBOVUxMOworCXU4ICpndGtfcHRyID0gTlVMTDsKKwl1OCBkZWZhdWx0X2tleSA9IDA7CisJdTggZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXU4ICpyc25pZV9wdHIgPSBOVUxMOworCXU4IHJzbmllX2xlbiA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnMkFjdGlvbiBcbiIpKTsKKworCWlmICgoIXBFbnRyeSkgfHwgKCFwRW50cnktPlZhbGlkQXNDTEkpKQorCQlyZXR1cm47CisKKwlpZiAoRWxlbS0+TXNnTGVuIDwKKwkgICAgKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsKKwkgICAgIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBFbnRyeSBpbiB2YWxpZCBTdGF0ZSAqLworCWlmIChwRW50cnktPldwYVN0YXRlIDwgQVNfUFRLU1RBUlQpCisJCXJldHVybjsKKworCS8qIHBvaW50ZXIgdG8gODAyLjExIGhlYWRlciAqLworCXBIZWFkZXIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgRWxlbS0+TXNnOworCisJLyogc2tpcCA4MDIuMTFfaGVhZGVyKDI0LWJ5dGUpIGFuZCBMTENfaGVhZGVyKDgpICovCisJcE1zZzIgPSAoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqKSAmIEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOworCU1zZ0xlbiA9IEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSDsKKworCS8qIFN0b3JlIFNOb25jZSAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+U05vbmNlLCBwTXNnMi0+S2V5RGVzYy5LZXlOb25jZSwKKwkJICAgICAgIExFTl9LRVlfREVTQ19OT05DRSk7CisKKwl7CisJCS8qIERlcml2ZSBQVEsgKi8KKwkJV3BhRGVyaXZlUFRLKHBBZCwgKHU4ICopIHBta19wdHIsIHBFbnRyeS0+QU5vbmNlLAkvKiBBTk9OQ0UgKi8KKwkJCSAgICAgKHU4ICopIHBCc3NpZCwgcEVudHJ5LT5TTm9uY2UsCS8qIFNOT05DRSAqLworCQkJICAgICBwRW50cnktPkFkZHIsIFBUSywgTEVOX1BUSyk7CisKKwkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QVEssIFBUSywgTEVOX1BUSyk7CisJfQorCisJLyogU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSAyIC0gUmVwbGF5IENvdW50ZXIsIE1JQywgUlNOSUUgKi8KKwlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnMiwgTXNnTGVuLCBFQVBPTF9QQUlSX01TR18yLCBwRW50cnkpCisJICAgID09IEZBTFNFKQorCQlyZXR1cm47CisKKwlkbyB7CisJCS8qIGRlbGV0ZSByZXRyeSB0aW1lciAqLworCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJLyogQ2hhbmdlIHN0YXRlICovCisJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtJTklUX05FR09USUFUSU5HOworCisJCS8qIEluY3JlbWVudCByZXBsYXkgY291bnRlciBieSAxICovCisJCUFERF9PTkVfVG9fNjRCSVRfVkFSKHBFbnRyeS0+Ul9Db3VudGVyKTsKKworCQkvKiBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIFBhaXJ3aXNlIE1zZyAzICovCisJCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQpKTsKKwkJQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LAorCQkJCSAgZ3JvdXBfY2lwaGVyLAorCQkJCSAgRUFQT0xfUEFJUl9NU0dfMywKKwkJCQkgIGRlZmF1bHRfa2V5LAorCQkJCSAgcEVudHJ5LT5BTm9uY2UsCisJCQkJICBUeFRzYywKKwkJCQkgICh1OCAqKSBndGtfcHRyLAorCQkJCSAgKHU4ICopIHJzbmllX3B0ciwgcnNuaWVfbGVuLCAmRUFQT0xQS1QpOworCisJCS8qIE1ha2Ugb3V0Z29pbmcgZnJhbWUgKi8KKwkJTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEJzc2lkLCBFQVBPTCk7CisJCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LCBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLAorCQkJCSAgKHU4ICopJiBFQVBPTFBLVCwKKwkJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAorCQkJCSAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0KKwkJCQkgICBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkgPyBGQUxTRSA6IFRSVUUpOworCisJCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gUEVFUl9NU0czX1JFVFJZX1RJTUVSX0NUUjsKKwkJUlRNUFNldFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsIFBFRVJfTVNHM19SRVRSWV9FWEVDX0lOVFYpOworCisJCS8qIFVwZGF0ZSBTdGF0ZSAqLworCQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVF9ORUdPVElBVElORzsKKwl9IHdoaWxlIChGQUxTRSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPD09PSBQZWVyUGFpck1zZzJBY3Rpb246IHNlbmQgTXNnMyBvZiA0LXdheSBcbiIpKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgUGFpcndpc2Uga2V5IE1zZyAzIG9mIDQtd2F5IGhhbmRzaGFraW5nIGFuZCBzZW5kIE1zZyA0CisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBQZWVyUGFpck1zZzNBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwl1OCBIZWFkZXI4MDJfM1sxNF07CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCBFQVBPTFBLVDsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZzM7CisJdTMyIE1zZ0xlbjsKKwl1OCAqcEN1cnJlbnRBZGRyID0gTlVMTDsKKwl1OCBncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnM0FjdGlvbiBcbiIpKTsKKworCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCisJCXJldHVybjsKKworCWlmIChFbGVtLT5Nc2dMZW4gPAorCSAgICAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKworCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLSBNQVhfTEVOX09GX1JTTklFIC0gMikpCisJCXJldHVybjsKKworCXsKKwkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKKwkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7CisKKwl9CisKKwkvKiBSZWNvcmQgODAyLjExIGhlYWRlciAmIHRoZSByZWNlaXZlZCBFQVBPTCBwYWNrZXQgTXNnMyAqLworCXBIZWFkZXIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgRWxlbS0+TXNnOworCXBNc2czID0gKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKwlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkvKiBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDMgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRSAqLworCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2czLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzMsIHBFbnRyeSkKKwkgICAgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIGNvbnN0cnVjdCBtZXNzYWdlIDQgKi8KKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlJfQ291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwKKwkJICAgICAgIExFTl9LRVlfREVTQ19SRVBMQVkpOworCisJLyogRG91YmxlIGNoZWNrIEFOb25jZSAqLworCWlmICghTmRpc0VxdWFsTWVtb3J5CisJICAgIChwRW50cnktPkFOb25jZSwgcE1zZzMtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSkpIHsKKwkJcmV0dXJuOworCX0KKwkvKiBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIFBhaXJ3aXNlIE1zZyA0ICovCisJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwgZ3JvdXBfY2lwaGVyLCBFQVBPTF9QQUlSX01TR180LCAwLAkvKiBncm91cCBrZXkgaW5kZXggbm90IHVzZWQgaW4gbWVzc2FnZSA0ICovCisJCQkgIE5VTEwsCS8qIE5vbmNlIG5vdCB1c2VkIGluIG1lc3NhZ2UgNCAqLworCQkJICBOVUxMLAkvKiBUeFJTQyBub3QgdXNlZCBpbiBtZXNzYWdlIDQgKi8KKwkJCSAgTlVMTCwJLyogR1RLIG5vdCB1c2VkIGluIG1lc3NhZ2UgNCAqLworCQkJICBOVUxMLAkvKiBSU04gSUUgbm90IHVzZWQgaW4gbWVzc2FnZSA0ICovCisJCQkgIDAsICZFQVBPTFBLVCk7CisKKwkvKiBVcGRhdGUgV3BhU3RhdGUgKi8KKwlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLSU5JVERPTkU7CisKKwkvKiBVcGRhdGUgcGFpcndpc2Uga2V5ICovCisJeworCQlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFNoYXJlZEtleTsKKworCQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdOworCisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgcEVudHJ5LT5QVEssIExFTl9QVEspOworCisJCS8qIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUgKi8KKwkJTmRpc1plcm9NZW1vcnkocFNoYXJlZEtleSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLAorCQkJICAgICAgIExFTl9US0lQX0VLKTsKKwkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLAorCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlR4TWljLAorCQkJICAgICAgICZwQWQtPlN0YUNmZy5QVEtbNDggKyBMRU5fVEtJUF9SWE1JQ0tdLAorCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisKKwkJLyogRGVjaWRlIGl0cyBDaGlwZXJBbGcgKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQllbHNlCisJCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKworCQkvKiBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICovCisJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sCisJCQkgICAgICAgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwKKwkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLAorCQkJICAgICAgICZwQWQtPlN0YUNmZy5QVEtbNDggKyBMRU5fVEtJUF9SWE1JQ0tdLAorCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcFNoYXJlZEtleS0+Q2lwaGVyQWxnOworCisJCS8qIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCisJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJICAgICAgQlNTMCwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKKwkJCQkgICAgICBwU2hhcmVkS2V5LT5LZXksCisJCQkJICAgICAgcFNoYXJlZEtleS0+VHhNaWMsIHBTaGFyZWRLZXktPlJ4TWljKTsKKworCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCSAgQlNTMCwKKwkJCQkJICAwLCBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsIHBFbnRyeSk7CisKKwl9CisKKwkvKiBvcGVuIDgwMi4xeCBwb3J0IGNvbnRyb2wgYW5kIHByaXZhY3kgZmlsdGVyICovCisJaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSyB8fAorCSAgICBwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHsKKwkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOworCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKworCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisJCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUGVlclBhaXJNc2czQWN0aW9uOiBBdXRoTW9kZSglcykgUGFpcndpc2VDaXBoZXIoJXMpIEdyb3VwQ2lwaGVyKCVzKSBcbiIsCisJCQkgIEdldEF1dGhNb2RlKHBFbnRyeS0+QXV0aE1vZGUpLAorCQkJICBHZXRFbmNyeXB0VHlwZShwRW50cnktPldlcFN0YXR1cyksCisJCQkgIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKKwl9IGVsc2UgeworCX0KKworCS8qIEluaXQgODAyLjMgaGVhZGVyIGFuZCBzZW5kIG91dCAqLworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBDdXJyZW50QWRkciwgRUFQT0wpOworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAorCQkJICBIZWFkZXI4MDJfMywgc2l6ZW9mKEhlYWRlcjgwMl8zKSwKKwkJCSAgKHU4ICopJiBFQVBPTFBLVCwKKwkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIFRSVUUpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PT0gUGVlclBhaXJNc2czQWN0aW9uOiBzZW5kIE1zZzQgb2YgNC13YXkgXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIGxhc3QgcGFja2V0IG9mIDQtd2F5IHBhaXJ3aXNla2V5IGhhbmRzaGFrZS4KKyAgICAgICAgSW5pdGlsaXplIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZSBmb2xsb3dpbmcuCisgICAgUmV0dXJuOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBQZWVyUGFpck1zZzRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQoreworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnNDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI7CisJdTMyIE1zZ0xlbjsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwl1OCBncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnNEFjdGlvblxuIikpOworCisJZG8geworCQlpZiAoKCFwRW50cnkpIHx8ICghcEVudHJ5LT5WYWxpZEFzQ0xJKSkKKwkJCWJyZWFrOworCisJCWlmIChFbGVtLT5Nc2dMZW4gPAorCQkgICAgKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsKKwkJICAgICBzaXplb2Yoc3RydWN0IHJ0X2tleV9kZXNjcmlwdGVyKSAtIE1BWF9MRU5fT0ZfUlNOSUUgLSAyKSkKKwkJCWJyZWFrOworCisJCWlmIChwRW50cnktPldwYVN0YXRlIDwgQVNfUFRLSU5JVF9ORUdPVElBVElORykKKwkJCWJyZWFrOworCisJCS8qIHBvaW50ZXIgdG8gODAyLjExIGhlYWRlciAqLworCQlwSGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIEVsZW0tPk1zZzsKKworCQkvKiBza2lwIDgwMi4xMV9oZWFkZXIoMjQtYnl0ZSkgYW5kIExMQ19oZWFkZXIoOCkgKi8KKwkJcE1zZzQgPQorCQkgICAgKHN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKikgJiBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKKwkJTXNnTGVuID0gRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IOworCisJCS8qIFNhbml0eSBDaGVjayBwZWVyIFBhaXJ3aXNlIG1lc3NhZ2UgNCAtIFJlcGxheSBDb3VudGVyLCBNSUMgKi8KKwkJaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5CisJCSAgICAocEFkLCBwTXNnNCwgTXNnTGVuLCBFQVBPTF9QQUlSX01TR180LCBwRW50cnkpID09IEZBTFNFKQorCQkJYnJlYWs7CisKKwkJLyogMy4gdXNlcyB0aGUgTUxNRS5TRVRLRVlTLnJlcXVlc3QgdG8gY29uZmlndXJlIFBUSyBpbnRvIE1BQyAqLworCQlOZGlzWmVyb01lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisKKwkJLyogcmVzZXQgSVZFSVYgaW4gQXNpYyAqLworCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgcEVudHJ5LT5BaWQsIDEsIDApOworCisJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEVudHJ5LT5QVEtbMzJdLAorCQkJICAgICAgIExFTl9US0lQX0VLKTsKKwkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywKKwkJCSAgICAgICAmcEVudHJ5LT5QVEtbVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUXSwKKwkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLAorCQkJICAgICAgICZwRW50cnktPlBUS1tUS0lQX0FQX1RYTUlDS19PRkZTRVRdLAorCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisKKwkJLyogU2V0IHBhaXJ3aXNlIGtleSB0byBBc2ljICovCisJCXsKKwkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQlpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJZWxzZSBpZiAocEVudHJ5LT5XZXBTdGF0dXMgPT0KKwkJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisKKwkJCS8qIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMgKi8KKwkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCXBFbnRyeS0+QWRkciwKKwkJCQkJCSh1OClwRW50cnktPkFpZCwKKwkJCQkJCSZwRW50cnktPlBhaXJ3aXNlS2V5KTsKKworCQkJLyogdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeSAqLworCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkgIHBFbnRyeS0+YXBpZHgsCisJCQkJCQkgIDAsCisJCQkJCQkgIHBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAorCQkJCQkJICBwRW50cnkpOworCQl9CisKKwkJLyogNC4gdXBncmFkZSBzdGF0ZSAqLworCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwkJcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRET05FOworCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisKKwkJaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMiB8fAorCQkgICAgcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB7CisJCQlwRW50cnktPkdUS1N0YXRlID0gUkVLRVlfRVNUQUJMSVNIRUQ7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7CisKKwkJCS8qIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKKwkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLAorCQkJCQkJICAgICAgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOworCisJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCisJCQkJICgiQVAgU0VUS0VZUyBET05FIC0gV1BBMiwgQXV0aE1vZGUoJWQpPSVzLCBXZXBTdGF0dXMoJWQpPSVzLCBHcm91cFdlcFN0YXR1cyglZCk9JXNcblxuIiwKKwkJCQkgIHBFbnRyeS0+QXV0aE1vZGUsCisJCQkJICBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKKwkJCQkgIHBFbnRyeS0+V2VwU3RhdHVzLAorCQkJCSAgR2V0RW5jcnlwdFR5cGUocEVudHJ5LT5XZXBTdGF0dXMpLAorCQkJCSAgZ3JvdXBfY2lwaGVyLCBHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7CisJCX0gZWxzZSB7CisJCQkvKiA1LiBpbml0IEdyb3VwIDItd2F5IGhhbmRzaGFrZSBpZiBuZWNlc3NhcnkuICovCisJCQlXUEFTdGFydDJXYXlHcm91cEhTKHBBZCwgcEVudHJ5KTsKKworCQkJcEVudHJ5LT5SZVRyeUNvdW50ZXIgPSBHUk9VUF9NU0cxX1JFVFJZX1RJTUVSX0NUUjsKKwkJCVJUTVBNb2RUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLAorCQkJCSAgICAgUEVFUl9NU0czX1JFVFJZX0VYRUNfSU5UVik7CisJCX0KKwl9IHdoaWxlIChGQUxTRSk7CisKK30KKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIERlc2NyaXB0aW9uOgorICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gc2VuZCB0aGUgZmlyc3QgcGFja2V0IG9mIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZQorICAgIFJldHVybjoKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBXUEFTdGFydDJXYXlHcm91cEhTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KQoreworCXU4IEhlYWRlcjgwMl8zWzE0XTsKKwl1OCBUeFRzY1s2XTsKKwlzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0IEVBUE9MUEtUOworCXU4IGdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwl1OCBkZWZhdWx0X2tleSA9IDA7CisJdTggKmdub25jZV9wdHIgPSBOVUxMOworCXU4ICpndGtfcHRyID0gTlVMTDsKKwl1OCAqcEJzc2lkID0gTlVMTDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gV1BBU3RhcnQyV2F5R3JvdXBIU1xuIikpOworCisJaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCisJCXJldHVybjsKKworCWRvIHsKKwkJLyogSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEgKi8KKwkJQUREX09ORV9Ub182NEJJVF9WQVIocEVudHJ5LT5SX0NvdW50ZXIpOworCisJCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gR3JvdXAgTXNnIDEgKi8KKwkJTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2Yoc3RydWN0IHJ0X2VhcG9sX3BhY2tldCkpOworCQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCisJCQkJICBncm91cF9jaXBoZXIsCisJCQkJICBFQVBPTF9HUk9VUF9NU0dfMSwKKwkJCQkgIGRlZmF1bHRfa2V5LAorCQkJCSAgKHU4ICopIGdub25jZV9wdHIsCisJCQkJICBUeFRzYywgKHU4ICopIGd0a19wdHIsIE5VTEwsIDAsICZFQVBPTFBLVCk7CisKKwkJLyogTWFrZSBvdXRnb2luZyBmcmFtZSAqLworCQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQnNzaWQsIEVBUE9MKTsKKwkJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCisJCQkJICBIZWFkZXI4MDJfMywgTEVOR1RIXzgwMl8zLAorCQkJCSAgKHU4ICopJiBFQVBPTFBLVCwKKwkJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAorCQkJCSAgRkFMU0UpOworCisJfSB3aGlsZSAoRkFMU0UpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PT0gV1BBU3RhcnQyV2F5R3JvdXBIUyA6IHNlbmQgb3V0IEdyb3VwIE1lc3NhZ2UgMSBcbiIpKTsKKworCXJldHVybjsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCVByb2Nlc3MgR3JvdXAga2V5IDItd2F5IGhhbmRzaGFraW5nCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCUVsZW0JCU1lc3NhZ2UgYm9keQorCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlOb3RlOgorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBQZWVyR3JvdXBNc2cxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCit7CisJdTggSGVhZGVyODAyXzNbMTRdOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgRUFQT0xQS1Q7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBHcm91cDsKKwl1MzIgTXNnTGVuOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXU4IGRlZmF1bHRfa2V5ID0gMDsKKwl1OCBncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJdTggKnBDdXJyZW50QWRkciA9IE5VTEw7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJHcm91cE1zZzFBY3Rpb24gXG4iKSk7CisKKwlpZiAoKCFwRW50cnkpIHx8ICgoIXBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKCFwRW50cnktPlZhbGlkQXNBcENsaSkpKQorCQlyZXR1cm47CisKKwl7CisJCXBDdXJyZW50QWRkciA9IHBBZC0+Q3VycmVudEFkZHJlc3M7CisJCWdyb3VwX2NpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOworCQlkZWZhdWx0X2tleSA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKKwl9CisKKwkvKiBQcm9jZXNzIEdyb3VwIE1lc3NhZ2UgMSBmcmFtZS4gc2tpcCA4MDIuMTEgaGVhZGVyKDI0KSAmIExMQ19TTkFQIGhlYWRlcig4KSAqLworCXBHcm91cCA9IChzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICopICYgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07CisJTXNnTGVuID0gRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IOworCisJLyogU2FuaXR5IENoZWNrIHBlZXIgZ3JvdXAgbWVzc2FnZSAxIC0gUmVwbGF5IENvdW50ZXIsIE1JQywgUlNOSUUgKi8KKwlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwR3JvdXAsIE1zZ0xlbiwgRUFQT0xfR1JPVVBfTVNHXzEsIHBFbnRyeSkKKwkgICAgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qIGRlbGV0ZSByZXRyeSB0aW1lciAqLworCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKKworCS8qIFNhdmUgUmVwbGF5IGNvdW50ZXIsIGl0IHdpbGwgdXNlIHRvIGNvbnN0cnVjdCBtZXNzYWdlIDIgKi8KKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlJfQ291bnRlciwgcEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsCisJCSAgICAgICBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKKworCS8qIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gR3JvdXAgTXNnIDIgKi8KKwlOZGlzWmVyb01lbW9yeSgmRUFQT0xQS1QsIHNpemVvZihzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0KSk7CisJQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LCBncm91cF9jaXBoZXIsIEVBUE9MX0dST1VQX01TR18yLCBkZWZhdWx0X2tleSwgTlVMTCwJLyogTm9uY2Ugbm90IHVzZWQgKi8KKwkJCSAgTlVMTCwJLyogVHhSU0Mgbm90IHVzZWQgKi8KKwkJCSAgTlVMTCwJLyogR1RLIG5vdCB1c2VkICovCisJCQkgIE5VTEwsCS8qIFJTTiBJRSBub3QgdXNlZCAqLworCQkJICAwLCAmRUFQT0xQS1QpOworCisJLyogb3BlbiA4MDIuMXggcG9ydCBjb250cm9sIGFuZCBwcml2YWN5IGZpbHRlciAqLworCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKKwlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKworCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKKwkvKiBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSSAqLworCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUGVlckdyb3VwTXNnMUFjdGlvbjogQXV0aE1vZGUoJXMpIFBhaXJ3aXNlQ2lwaGVyKCVzKSBHcm91cENpcGhlciglcykgXG4iLAorCQkgIEdldEF1dGhNb2RlKHBFbnRyeS0+QXV0aE1vZGUpLAorCQkgIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKKwkJICBHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7CisKKwkvKiBpbml0IGhlYWRlciBhbmQgRmlsbCBQYWNrZXQgYW5kIHNlbmQgTXNnIDIgdG8gYXV0aGVudGljYXRvciAqLworCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBDdXJyZW50QWRkciwgRUFQT0wpOworCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAorCQkJICBIZWFkZXI4MDJfMywgc2l6ZW9mKEhlYWRlcjgwMl8zKSwKKwkJCSAgKHU4ICopJiBFQVBPTFBLVCwKKwkJCSAgQ09OVl9BUlJBUllfVE9fdTE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIEZBTFNFKTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT09IFBlZXJHcm91cE1zZzFBY3Rpb246IHNuZWQgZ3JvdXAgbWVzc2FnZSAyXG4iKSk7Cit9CisKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKyAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIGxhc3QgcGFja2V0IG9mIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZS4KKyAgICBSZXR1cm46CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFBlZXJHcm91cE1zZzJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSB2b2lkICogTXNnLCB1MzIgTXNnTGVuKQoreworCXUzMiBMZW47CisJdTggKnBEYXRhOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXN0cnVjdCBydF9lYXBvbF9wYWNrZXQgKiBwTXNnMjsKKwl1OCBncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJHcm91cE1zZzJBY3Rpb24gXG4iKSk7CisKKwlkbyB7CisJCWlmICgoIXBFbnRyeSkgfHwgKCFwRW50cnktPlZhbGlkQXNDTEkpKQorCQkJYnJlYWs7CisKKwkJaWYgKE1zZ0xlbiA8CisJCSAgICAoTEVOR1RIXzgwMl8xX0ggKyBMRU5HVEhfRUFQT0xfSCArIHNpemVvZihzdHJ1Y3QgcnRfa2V5X2Rlc2NyaXB0ZXIpIC0KKwkJICAgICBNQVhfTEVOX09GX1JTTklFIC0gMikpCisJCQlicmVhazsKKworCQlpZiAocEVudHJ5LT5XcGFTdGF0ZSAhPSBBU19QVEtJTklURE9ORSkKKwkJCWJyZWFrOworCisJCXBEYXRhID0gKHU4ICopTXNnOworCQlwTXNnMiA9IChzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICopIChwRGF0YSArIExFTkdUSF84MDJfMV9IKTsKKwkJTGVuID0gTXNnTGVuIC0gTEVOR1RIXzgwMl8xX0g7CisKKwkJLyogU2FuaXR5IENoZWNrIHBlZXIgZ3JvdXAgbWVzc2FnZSAyIC0gUmVwbGF5IENvdW50ZXIsIE1JQyAqLworCQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkKKwkJICAgIChwQWQsIHBNc2cyLCBMZW4sIEVBUE9MX0dST1VQX01TR18yLCBwRW50cnkpID09IEZBTFNFKQorCQkJYnJlYWs7CisKKwkJLyogMy4gIHVwZ3JhZGUgc3RhdGUgKi8KKworCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7CisJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9FU1RBQkxJU0hFRDsKKworCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKKwkJICAgIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwKKwkJCQkJCSAgICAgIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwRW50cnktPkFkZHIsCisJCQkJCQkgICAgICBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIkFQIFNFVEtFWVMgRE9ORSAtIFdQQTIsIEF1dGhNb2RlKCVkKT0lcywgV2VwU3RhdHVzKCVkKT0lcywgR3JvdXBXZXBTdGF0dXMoJWQpPSVzXG5cbiIsCisJCQkJICBwRW50cnktPkF1dGhNb2RlLAorCQkJCSAgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCisJCQkJICBwRW50cnktPldlcFN0YXR1cywKKwkJCQkgIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKKwkJCQkgIGdyb3VwX2NpcGhlciwgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOworCQl9IGVsc2UgeworCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwKKwkJCQkJCSAgICAgIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwRW50cnktPkFkZHIsCisJCQkJCQkgICAgICBwRW50cnktPmFwaWR4LCAwKTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIkFQIFNFVEtFWVMgRE9ORSAtIFdQQTEsIEF1dGhNb2RlKCVkKT0lcywgV2VwU3RhdHVzKCVkKT0lcywgR3JvdXBXZXBTdGF0dXMoJWQpPSVzXG5cbiIsCisJCQkJICBwRW50cnktPkF1dGhNb2RlLAorCQkJCSAgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCisJCQkJICBwRW50cnktPldlcFN0YXR1cywKKwkJCQkgIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKKwkJCQkgIGdyb3VwX2NpcGhlciwgR2V0RW5jcnlwdFR5cGUoZ3JvdXBfY2lwaGVyKSkpOworCQl9CisJfSB3aGlsZSAoRkFMU0UpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ2xhc3NpZnkgV1BBIEVBUCBtZXNzYWdlIHR5cGUKKworCUFyZ3VtZW50czoKKwkJRUFQVHlwZQkJVmFsdWUgb2YgRUFQIG1lc3NhZ2UgdHlwZQorCQlNc2dUeXBlCQlJbnRlcm5hbCBNZXNzYWdlIGRlZmluaXRpb24gZm9yIE1MTUUgc3RhdGUgbWFjaGluZQorCisJUmV0dXJuIFZhbHVlOgorCQlUUlVFCQlGb3VuZCBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKKwkJRkFMU0UJCU5vIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQorCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCisKKwlOb3RlOgorCQlBbGwgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHdwYS5oCisJCUZvciBzdXBwbGljYW50LCB0aGVyZSBpcyBvbmx5IEVBUE9MIEtleSBtZXNzYWdlIGF2YWxpYWJsZQorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBXcGFNc2dUeXBlU3Vic3QodTggRUFQVHlwZSwgaW50ICogTXNnVHlwZSkKK3sKKwlzd2l0Y2ggKEVBUFR5cGUpIHsKKwljYXNlIEVBUFBhY2tldDoKKwkJKk1zZ1R5cGUgPSBNVDJfRUFQUGFja2V0OworCQlicmVhazsKKwljYXNlIEVBUE9MU3RhcnQ6CisJCSpNc2dUeXBlID0gTVQyX0VBUE9MU3RhcnQ7CisJCWJyZWFrOworCWNhc2UgRUFQT0xMb2dvZmY6CisJCSpNc2dUeXBlID0gTVQyX0VBUE9MTG9nb2ZmOworCQlicmVhazsKKwljYXNlIEVBUE9MS2V5OgorCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEtleTsKKwkJYnJlYWs7CisJY2FzZSBFQVBPTEFTRkFsZXJ0OgorCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEFTRkFsZXJ0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjcsNzIgKzEyNjEsMTE4IEBACiAJCUl0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgUFRLLCBHVEsgb3Igc29tZSBzcGVjaWZpYyByYW5kb20gdmFsdWUuCiAKIAlBcmd1bWVudHM6Ci0JCVVDSEFSCSprZXksCQktCXRoZSBrZXkgbWF0ZXJpYWwgZm9yIEhNQUNfU0hBMSB1c2UKLQkJSU5UCQlrZXlfbGVuCQktCXRoZSBsZW5ndGggb2Yga2V5Ci0JCVVDSEFSCSpwcmVmaXgJCS0JYSBwcmVmaXggbGFiZWwKLQkJSU5UCQlwcmVmaXhfbGVuCS0JdGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwKLQkJVUNIQVIJKmRhdGEJCS0JYSBzcGVjaWZpYyBkYXRhIHdpdGggdmFyaWFibGUgbGVuZ3RoCi0JCUlOVAkJZGF0YV9sZW4JLQl0aGUgbGVuZ3RoIG9mIGEgc3BlY2lmaWMgZGF0YQotCQlJTlQJCWxlbgkJCS0JdGhlIG91dHB1dCBsZW5naHQKKwkJdTgJKmtleSwJCS0JdGhlIGtleSBtYXRlcmlhbCBmb3IgSE1BQ19TSEExIHVzZQorCQlpbnQJCWtleV9sZW4JCS0JdGhlIGxlbmd0aCBvZiBrZXkKKwkJdTgJKnByZWZpeAkJLQlhIHByZWZpeCBsYWJlbAorCQlpbnQJCXByZWZpeF9sZW4JLQl0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbAorCQl1OAkqZGF0YQkJLQlhIHNwZWNpZmljIGRhdGEgd2l0aCB2YXJpYWJsZSBsZW5ndGgKKwkJaW50CQlkYXRhX2xlbgktCXRoZSBsZW5ndGggb2YgYSBzcGVjaWZpYyBkYXRhCisJCWludAkJbGVuCQkJLQl0aGUgb3V0cHV0IGxlbmdodAogCiAJUmV0dXJuIFZhbHVlOgotCQlVQ0hBUgkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAorCQl1OAkqb3V0cHV0CQktCXRoZSBjYWxjdWxhdGVkIHJlc3VsdAogCiAJTm90ZToKIAkJODAyLjExaS0yMDA0CUFubmV4IEguMwogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlQUkYoCi0JSU4JVUNIQVIJKmtleSwKLQlJTglJTlQJCWtleV9sZW4sCi0JSU4JVUNIQVIJKnByZWZpeCwKLQlJTglJTlQJCXByZWZpeF9sZW4sCi0JSU4JVUNIQVIJKmRhdGEsCi0JSU4JSU5UCQlkYXRhX2xlbiwKLQlPVVQJVUNIQVIJKm91dHB1dCwKLQlJTglJTlQJCWxlbikKK3ZvaWQgUFJGKHU4ICoga2V5LAorCSBpbnQga2V5X2xlbiwKKwkgdTggKiBwcmVmaXgsCisJIGludCBwcmVmaXhfbGVuLAorCSB1OCAqIGRhdGEsIGludCBkYXRhX2xlbiwgdTggKiBvdXRwdXQsIGludCBsZW4pCiB7Ci0JSU5UCQlpOwotICAgIFVDSEFSICAgKmlucHV0OwotCUlOVAkJY3VycmVudGluZGV4ID0gMDsKLQlJTlQJCXRvdGFsX2xlbjsKKwlpbnQgaTsKKwl1OCAqaW5wdXQ7CisJaW50IGN1cnJlbnRpbmRleCA9IDA7CisJaW50IHRvdGFsX2xlbjsKIAotCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgaW5wdXQKLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZpbnB1dCwgMTAyNCk7CisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCAqLworCW9zX2FsbG9jX21lbShOVUxMLCAodTggKiopICYgaW5wdXQsIDEwMjQpOwogCi0gICAgaWYgKGlucHV0ID09IE5VTEwpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISFQUkY6IG5vIG1lbW9yeSEhIVxuIikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0JLy8gR2VuZXJhdGUgY29uY2F0ZW5hdGlvbiBpbnB1dAorCWlmIChpbnB1dCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlBSRjogbm8gbWVtb3J5IVxuIikpOworCQlyZXR1cm47CisJfQorCS8qIEdlbmVyYXRlIGNvbmNhdGVuYXRpb24gaW5wdXQgKi8KIAlOZGlzTW92ZU1lbW9yeShpbnB1dCwgcHJlZml4LCBwcmVmaXhfbGVuKTsKIAotCS8vIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMAotCWlucHV0W3ByZWZpeF9sZW5dID0JMDsKKwkvKiBDb25jYXRlbmF0ZSBhIHNpbmdsZSBvY3RldCBjb250YWluaW5nIDAgKi8KKwlpbnB1dFtwcmVmaXhfbGVuXSA9IDA7CiAKLQkvLyBDb25jYXRlbmF0ZSBzcGVjaWZpYyBkYXRhCisJLyogQ29uY2F0ZW5hdGUgc3BlY2lmaWMgZGF0YSAqLwogCU5kaXNNb3ZlTWVtb3J5KCZpbnB1dFtwcmVmaXhfbGVuICsgMV0sIGRhdGEsIGRhdGFfbGVuKTsKLQl0b3RhbF9sZW4gPQlwcmVmaXhfbGVuICsgMSArIGRhdGFfbGVuOworCXRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyAxICsgZGF0YV9sZW47CiAKLQkvLyBDb25jYXRlbmF0ZSBhIHNpbmdsZSBvY3RldCBjb250YWluaW5nIDAKLQkvLyBUaGlzIG9jdGV0IHNoYWxsIGJlIHVwZGF0ZSBsYXRlcgorCS8qIENvbmNhdGVuYXRlIGEgc2luZ2xlIG9jdGV0IGNvbnRhaW5pbmcgMCAqLworCS8qIFRoaXMgb2N0ZXQgc2hhbGwgYmUgdXBkYXRlIGxhdGVyICovCiAJaW5wdXRbdG90YWxfbGVuXSA9IDA7CiAJdG90YWxfbGVuKys7CiAKLQkvLyBJdGVyYXRlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzdWx0IGJ5IGhtYWMtc2hhLTEKLQkvLyBUaGVuIGNvbmNhdGVuYXRlIHRvIGxhc3QgcmVzdWx0Ci0JZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQotCXsKLQkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKLQkJY3VycmVudGluZGV4ICs9CTIwOworCS8qIEl0ZXJhdGUgdG8gY2FsY3VsYXRlIHRoZSByZXN1bHQgYnkgaG1hYy1zaGEtMSAqLworCS8qIFRoZW4gY29uY2F0ZW5hdGUgdG8gbGFzdCByZXN1bHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKGxlbiArIDE5KSAvIDIwOyBpKyspIHsKKwkJSE1BQ19TSEExKGtleSwga2V5X2xlbiwgaW5wdXQsIHRvdGFsX2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdLAorCQkJICBTSEExX0RJR0VTVF9TSVpFKTsKKwkJY3VycmVudGluZGV4ICs9IDIwOwogCi0JCS8vIHVwZGF0ZSB0aGUgbGFzdCBvY3RldAorCQkvKiB1cGRhdGUgdGhlIGxhc3Qgb2N0ZXQgKi8KIAkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKIAl9Ci0gICAgb3NfZnJlZV9tZW0oTlVMTCwgaW5wdXQpOworCW9zX2ZyZWVfbWVtKE5VTEwsIGlucHV0KTsKK30KKworLyoKKyogRihQLCBTLCBjLCBpKSA9IFUxIHhvciBVMiB4b3IgLi4uIFVjCisqIFUxID0gUFJGKFAsIFMgfHwgSW50KGkpKQorKiBVMiA9IFBSRihQLCBVMSkKKyogVWMgPSBQUkYoUCwgVWMtMSkKKyovCisKK3N0YXRpYyB2b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLAorCSAgICAgIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKK3sKKwl1bnNpZ25lZCBjaGFyIGRpZ2VzdFszNl0sIGRpZ2VzdDFbU0hBMV9ESUdFU1RfU0laRV07CisJaW50IGksIGo7CisKKwkvKiBVMSA9IFBSRihQLCBTIHx8IGludChpKSkgKi8KKwltZW1jcHkoZGlnZXN0LCBzc2lkLCBzc2lkbGVuZ3RoKTsKKwlkaWdlc3Rbc3NpZGxlbmd0aF0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50ID4+IDI0KSAmIDB4ZmYpOworCWRpZ2VzdFtzc2lkbGVuZ3RoICsgMV0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50ID4+IDE2KSAmIDB4ZmYpOworCWRpZ2VzdFtzc2lkbGVuZ3RoICsgMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50ID4+IDgpICYgMHhmZik7CisJZGlnZXN0W3NzaWRsZW5ndGggKyAzXSA9ICh1bnNpZ25lZCBjaGFyKShjb3VudCAmIDB4ZmYpOworCUhNQUNfU0hBMSgodW5zaWduZWQgY2hhciAqKXBhc3N3b3JkLCAoaW50KXN0cmxlbihwYXNzd29yZCksIGRpZ2VzdCwgc3NpZGxlbmd0aCArIDQsIGRpZ2VzdDEsIFNIQTFfRElHRVNUX1NJWkUpOwkvKiBmb3IgV1BBIHVwZGF0ZSAqLworCisJLyogb3V0cHV0ID0gVTEgKi8KKwltZW1jcHkob3V0cHV0LCBkaWdlc3QxLCBTSEExX0RJR0VTVF9TSVpFKTsKKworCWZvciAoaSA9IDE7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKwkJLyogVW4gPSBQUkYoUCwgVW4tMSkgKi8KKwkJSE1BQ19TSEExKCh1bnNpZ25lZCBjaGFyICopcGFzc3dvcmQsIChpbnQpc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0MSwgU0hBMV9ESUdFU1RfU0laRSwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsJLyogZm9yIFdQQSB1cGRhdGUgKi8KKwkJbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7CisKKwkJLyogb3V0cHV0ID0gb3V0cHV0IHhvciBVbiAqLworCQlmb3IgKGogPSAwOyBqIDwgU0hBMV9ESUdFU1RfU0laRTsgaisrKSB7CisJCQlvdXRwdXRbal0gXj0gZGlnZXN0W2pdOworCQl9CisJfQorfQorCisvKgorKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAorKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cworKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCisqIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5CisqLworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdTggKnNzaWQsIGludCBzc2lkbGVuZ3RoLCB1OCAqb3V0cHV0KQoreworCWlmICgoc3RybGVuKHBhc3N3b3JkKSA+IDYzKSB8fCAoc3NpZGxlbmd0aCA+IDMyKSkKKwkJcmV0dXJuIDA7CisKKwlGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAxLCBvdXRwdXQpOworCUYocGFzc3dvcmQsIHNzaWQsIHNzaWRsZW5ndGgsIDQwOTYsIDIsICZvdXRwdXRbU0hBMV9ESUdFU1RfU0laRV0pOworCXJldHVybiAxOwogfQogCiAvKgpAQCAtMTQzLDcgKzEzODMsNyBAQAogCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCiAKIAlBcmd1bWVudHM6Ci0JCXBBZCAJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJCXBBZAktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKIAkJUE1LCQktCXBvaW50ZXIgdG8gUE1LCiAJCUFOb25jZQktCXBvaW50ZXIgdG8gQU5vbmNlCiAJCUFBCQktCXBvaW50ZXIgdG8gQXV0aGVudGljYXRvciBBZGRyZXNzCkBAIC0xNTksNTYgKzEzOTksNTUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgV3BhQ291bnRQVEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJKlBNSywKLQlJTglVQ0hBUgkqQU5vbmNlLAotCUlOCVVDSEFSCSpBQSwKLQlJTglVQ0hBUgkqU05vbmNlLAotCUlOCVVDSEFSCSpTQSwKLQlPVVQJVUNIQVIJKm91dHB1dCwKLQlJTglVSU5UCWxlbikKK3ZvaWQgV3BhRGVyaXZlUFRLKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICB1OCAqIFBNSywKKwkJICB1OCAqIEFOb25jZSwKKwkJICB1OCAqIEFBLAorCQkgIHU4ICogU05vbmNlLAorCQkgIHU4ICogU0EsIHU4ICogb3V0cHV0LCB1MzIgbGVuKQogewotCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOwotCVVJTlQJQ3VyclBvcyA9IDA7Ci0JVUNIQVIJdGVtcFszMl07Ci0JVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAotCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307CisJdTggY29uY2F0ZW5hdGlvbls3Nl07CisJdTMyIEN1cnJQb3MgPSAwOworCXU4IHRlbXBbMzJdOworCXU4IFByZWZpeFtdID0KKwkgICAgeyAnUCcsICdhJywgJ2knLCAncicsICd3JywgJ2knLCAncycsICdlJywgJyAnLCAnaycsICdlJywgJ3knLCAnICcsCisJCSdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAncycsICdpJywgJ28nLCAnbicKKwl9OwogCi0JLy8gaW5pdGlhdGUgdGhlIGNvbmNhdGVuYXRpb24gaW5wdXQKKwkvKiBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dCAqLwogCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7CiAJTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOwogCi0JLy8gR2V0IHNtYWxsZXIgYWRkcmVzcworCS8qIEdldCBzbWFsbGVyIGFkZHJlc3MgKi8KIAlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQogCQlOZGlzTW92ZU1lbW9yeShjb25jYXRlbmF0aW9uLCBBQSwgNik7CiAJZWxzZQogCQlOZGlzTW92ZU1lbW9yeShjb25jYXRlbmF0aW9uLCBTQSwgNik7CiAJQ3VyclBvcyArPSA2OwogCi0JLy8gR2V0IGxhcmdlciBhZGRyZXNzCisJLyogR2V0IGxhcmdlciBhZGRyZXNzICovCiAJaWYgKFJUTVBDb21wYXJlTWVtb3J5KFNBLCBBQSwgNikgPT0gMSkKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNBLCA2KTsKIAllbHNlCiAJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBQSwgNik7CiAKLQkvLyBzdG9yZSB0aGUgbGFyZ2VyIG1hYyBhZGRyZXNzIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIG9mCi0JLy8gcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKKwkvKiBzdG9yZSB0aGUgbGFyZ2VyIG1hYyBhZGRyZXNzIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIG9mICovCisJLyogcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUgKi8KIAlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgTUFDX0FERFJfTEVOKTsKIAlDdXJyUG9zICs9IDY7CiAKLQkvLyBHZXQgc21hbGxlciBOb25jZQorCS8qIEdldCBzbWFsbGVyIE5vbmNlICovCiAJaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCisJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8qIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZSAqLwogCWVsc2UgaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMSkKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIFNOb25jZSwgMzIpOwogCWVsc2UKIAkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFOb25jZSwgMzIpOwogCUN1cnJQb3MgKz0gMzI7CiAKLQkvLyBHZXQgbGFyZ2VyIE5vbmNlCisJLyogR2V0IGxhcmdlciBOb25jZSAqLwogCWlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDApCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCB0ZW1wLCAzMik7CS8vIHBhdGNoIGZvciByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQorCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvKiBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUgKi8KIAllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCiAJCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKIAllbHNlCkBAIC0yMTcsNyArMTQ1Niw3IEBACiAKIAloZXhfZHVtcCgiY29uY2F0ZW5hdGlvbj0iLCBjb25jYXRlbmF0aW9uLCA3Nik7CiAKLQkvLyBVc2UgUFJGIHRvIGdlbmVyYXRlIFBUSworCS8qIFVzZSBQUkYgdG8gZ2VuZXJhdGUgUFRLICovCiAJUFJGKFBNSywgTEVOX01BU1RFUl9LRVksIFByZWZpeCwgMjIsIGNvbmNhdGVuYXRpb24sIDc2LCBvdXRwdXQsIGxlbik7CiAKIH0KQEAgLTIzOSw0NiArMTQ3OCw0MyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlHZW5SYW5kb20oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQkqbWFjQWRkciwKLQlPVVQJVUNIQVIJCQkqcmFuZG9tKQordm9pZCBHZW5SYW5kb20oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqIG1hY0FkZHIsIHU4ICogcmFuZG9tKQogewotCUlOVAkJaSwgY3VycjsKLQlVQ0hBUglsb2NhbFs4MF0sIEtleUNvdW50ZXJbMzJdOwotCVVDSEFSCXJlc3VsdFs4MF07Ci0JVUxPTkcJQ3VycmVudFRpbWU7Ci0JVUNIQVIJcHJlZml4W10gPSB7J0knLCAnbicsICdpJywgJ3QnLCAnICcsICdDJywgJ28nLCAndScsICduJywgJ3QnLCAnZScsICdyJ307CisJaW50IGksIGN1cnI7CisJdTggbG9jYWxbODBdLCBLZXlDb3VudGVyWzMyXTsKKwl1OCByZXN1bHRbODBdOworCXVuc2lnbmVkIGxvbmcgQ3VycmVudFRpbWU7CisJdTggcHJlZml4W10gPQorCSAgICB7ICdJJywgJ24nLCAnaScsICd0JywgJyAnLCAnQycsICdvJywgJ3UnLCAnbicsICd0JywgJ2UnLCAncicgfTsKIAotCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkvKiBaZXJvIHRoZSByZWxhdGVkIGluZm9ybWF0aW9uICovCiAJTmRpc1plcm9NZW1vcnkocmVzdWx0LCA4MCk7CiAJTmRpc1plcm9NZW1vcnkobG9jYWwsIDgwKTsKIAlOZGlzWmVyb01lbW9yeShLZXlDb3VudGVyLCAzMik7CiAKLQlmb3IJKGkgPSAwOwlpIDwJMzI7CWkrKykKLQl7Ci0JCS8vIGNvcHkgdGhlIGxvY2FsIE1BQyBhZGRyZXNzCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJLyogY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MgKi8KIAkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7Ci0JCWN1cnIgPQlNQUNfQUREUl9MRU47CisJCWN1cnIgPSBNQUNfQUREUl9MRU47CiAKLQkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQorCQkvKiBjb25jYXRlbmF0ZSB0aGUgY3VycmVudCB0aW1lICovCiAJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJkN1cnJlbnRUaW1lKTsKLQkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJkN1cnJlbnRUaW1lLAlzaXplb2YoQ3VycmVudFRpbWUpKTsKLQkJY3VyciArPQlzaXplb2YoQ3VycmVudFRpbWUpOworCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICZDdXJyZW50VGltZSwgc2l6ZW9mKEN1cnJlbnRUaW1lKSk7CisJCWN1cnIgKz0gc2l6ZW9mKEN1cnJlbnRUaW1lKTsKIAotCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKLQkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7Ci0JCWN1cnIgKz0JMzI7CisJCS8qIGNvbmNhdGVuYXRlIHRoZSBsYXN0IHJlc3VsdCAqLworCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sIHJlc3VsdCwgMzIpOworCQljdXJyICs9IDMyOwogCi0JCS8vIGNvbmNhdGVuYXRlIGEgdmFyaWFibGUKLQkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgJmksICAyKTsKLQkJY3VyciArPQkyOworCQkvKiBjb25jYXRlbmF0ZSBhIHZhcmlhYmxlICovCisJCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgJmksIDIpOworCQljdXJyICs9IDI7CiAKLQkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKLQkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKKwkJLyogY2FsY3VsYXRlIHRoZSByZXN1bHQgKi8KKwkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsIDEyLCBsb2NhbCwgY3VyciwgcmVzdWx0LCAzMik7CiAJfQogCi0JTmRpc01vdmVNZW1vcnkocmFuZG9tLCByZXN1bHQsCTMyKTsKKwlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwgMzIpOwogfQogCiAvKgpAQCAtMjkwLDggKzE1MjYsOCBAQAogCiAJQXJndW1lbnRzOgogCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLSAgICAJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgotICAgIAlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgorCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKIAkJYk1peENpcGhlcgktCWEgYm9vbGVhbiB0byBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgY2lwaGVyIGFuZCBncm91cAogCQkJCQkJY2lwaGVyIGFyZSB0aGUgc2FtZSBvciBub3QKIApAQCAtMzAxLDE3MCArMTUzNywxNjkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLXN0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNpcGhlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKLQlJTglVSU5UCQkJV2VwU3RhdHVzLAotCUlOCUJPT0xFQU4JCQliTWl4Q2lwaGVyLAotCUlOCVVDSEFSCQkJRmxleGlibGVDaXBoZXIsCi0JT1VUCVBVQ0hBUgkJCXBSc25JZSwKLQlPVVQJVUNIQVIJCQkqcnNuX2xlbikKK3N0YXRpYyB2b2lkIFJUTVBNYWtlUnNuSWVDaXBoZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4IEVsZW1lbnRJRCwKKwkJCQl1MzIgV2VwU3RhdHVzLAorCQkJCUlOIEJPT0xFQU4gYk1peENpcGhlciwKKwkJCQl1OCBGbGV4aWJsZUNpcGhlciwKKwkJCQl1OCAqcFJzbkllLCB1OCAqIHJzbl9sZW4pCiB7Ci0JVUNIQVIJUGFpcndpc2VDbnQ7CisJdTggUGFpcndpc2VDbnQ7CiAKIAkqcnNuX2xlbiA9IDA7CiAKLQkvLyBkZWNpZGUgV1BBMiBvciBXUEExCi0JaWYgKEVsZW1lbnRJRCA9PSBXcGEySWUpCi0JewotCQlSU05JRTIJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUyKilwUnNuSWU7CisJLyogZGVjaWRlIFdQQTIgb3IgV1BBMSAqLworCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKSB7CisJCXN0cnVjdCBydF9yc25pZTIgKnBSc25pZV9jaXBoZXIgPSAoc3RydWN0IHJ0X3JzbmllMiAqKXBSc25JZTsKIAotCQkvLyBBc3NpZ24gdGhlIHZlcnNvbiBhcyAxCisJCS8qIEFzc2lnbiB0aGUgdmVyc29uIGFzIDEgKi8KIAkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CiAKLSAgICAgICAgc3dpdGNoIChXZXBTdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgCS8vIFRLSVAgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJc3dpdGNoIChXZXBTdGF0dXMpIHsKKwkJCS8qIFRLSVAgbW9kZSAqLworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQlwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCSAgICAgICBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCSpyc25fbGVuID0gc2l6ZW9mKHN0cnVjdCBydF9yc25pZTIpOworCQkJYnJlYWs7CiAKLQkJCS8vIEFFUyBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ6Ci0JCQkJaWYgKGJNaXhDaXBoZXIpCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9US0lQLCA0KTsKLQkJCQllbHNlCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCS8qIEFFUyBtb2RlICovCisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChiTWl4Q2lwaGVyKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LAorCQkJCQkgICAgICAgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQllbHNlCisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBMl9DQ01QLCA0KTsKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEEyX0NDTVAsIDQpOworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMik7CisJCQlicmVhazsKIAotCQkJLy8gVEtJUC1BRVMgbWl4IG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CisJCQkvKiBUS0lQLUFFUyBtaXggbW9kZSAqLworCQljYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7CiAKLQkJCQlQYWlyd2lzZUNudCA9IDE7Ci0JCQkJLy8gSW5zZXJ0IFdQQTIgVEtJUCBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJaWYgKE1JWF9DSVBIRVJfV1BBMl9US0lQX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0JCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgotCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpCi0JCQkJCXsKLSAgICAgICAgICAgICAgICAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOwotCQkJCQkJUGFpcndpc2VDbnQgPSAyOwotCQkJCQl9CisJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkvKiBJbnNlcnQgV1BBMiBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIgKi8KKwkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksCisJCQkJCSAgICAgICBPVUlfV1BBMl9US0lQLCA0KTsKKwkJCQkvKiBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIHNlY29uZGFyeSBwYWlyd2lzZSBjaXBoZXIgKi8KKwkJCQlpZiAoTUlYX0NJUEhFUl9XUEEyX0FFU19PTihGbGV4aWJsZUNpcGhlcikpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0uCisJCQkJCQkgICAgICAgb3VpICsgNCwgT1VJX1dQQTJfQ0NNUCwKKwkJCQkJCSAgICAgICA0KTsKKwkJCQkJUGFpcndpc2VDbnQgPSAyOwogCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX0NDTVAsIDQpOwotCQkJCX0KLQotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMikgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlVSU5UIEdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0JCQlzd2l0Y2goR3JvdXBDaXBoZXIpCi0JCQl7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBMl9XRVA0MCwgNCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDEwNCwgNCk7Ci0JCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJbnNlcnQgV1BBMiBBRVMgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwKKwkJCQkJICAgICAgIE9VSV9XUEEyX0NDTVAsIDQpOwogCQkJfQorCisJCQlwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKKwkJCSpyc25fbGVuID0gc2l6ZW9mKHN0cnVjdCBydF9yc25pZTIpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7CisJCQlicmVhazsKIAkJfQogCi0JCS8vIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0KKwkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCisJCSAgICAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKKwkJCXUzMiBHcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOworCQkJc3dpdGNoIChHcm91cENpcGhlcikgeworCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6CisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBMl9XRVA0MCwgNCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6CisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBMl9XRVAxMDQsIDQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIHN3YXAgZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm0gKi8KIAkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnZlcnNpb24pOwotCSAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOwotCX0KLQllbHNlCi0JewotCQlSU05JRQkqcFJzbmllX2NpcGhlciA9IChSU05JRSopcFJzbkllOworCQlwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT51Y291bnQpOworCX0gZWxzZSB7CisJCXN0cnVjdCBydF9yc25pZSAqcFJzbmllX2NpcGhlciA9IChzdHJ1Y3QgcnRfcnNuaWUgKilwUnNuSWU7CiAKLQkJLy8gQXNzaWduIE9VSSBhbmQgdmVyc2lvbgorCQkvKiBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uICovCiAJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKLSAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7CisJCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSAxOwogCi0JCXN3aXRjaCAoV2VwU3RhdHVzKQotCQl7Ci0JCQkvLyBUS0lQIG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9US0lQLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCXN3aXRjaCAoV2VwU3RhdHVzKSB7CisJCQkvKiBUS0lQIG1vZGUgKi8KKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CisJCQlwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCSAgICAgICBPVUlfV1BBX1RLSVAsIDQpOworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllKTsKKwkJCWJyZWFrOwogCi0JCQkvLyBBRVMgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJCWlmIChiTWl4Q2lwaGVyKQotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9US0lQLCA0KTsKLQkJCQllbHNlCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCS8qIEFFUyBtb2RlICovCisJCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJCWlmIChiTWl4Q2lwaGVyKQorCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LAorCQkJCQkgICAgICAgT1VJX1dQQV9US0lQLCA0KTsKKwkJCWVsc2UKKwkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwKKwkJCQkJICAgICAgIE9VSV9XUEFfQ0NNUCwgNCk7CisJCQlwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOworCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCSAgICAgICBPVUlfV1BBX0NDTVAsIDQpOworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllKTsKKwkJCWJyZWFrOwogCi0JCQkvLyBUS0lQLUFFUyBtaXggbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOworCQkJLyogVEtJUC1BRVMgbWl4IG1vZGUgKi8KKwkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgorCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7CiAKLQkJCQlQYWlyd2lzZUNudCA9IDE7Ci0JCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCi0JCQkJewotICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfVEtJUCwgNCk7Ci0JCQkJCS8vIEluc2VydCBXUEEgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCi0JCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKQotCQkJCQl7Ci0gICAgICAgICAgICAgICAgCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWkgKyA0LCBPVUlfV1BBX0NDTVAsIDQpOwotCQkJCQkJUGFpcndpc2VDbnQgPSAyOwotCQkJCQl9CisJCQlQYWlyd2lzZUNudCA9IDE7CisJCQkvKiBJbnNlcnQgV1BBIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJaWYgKE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oRmxleGlibGVDaXBoZXIpKSB7CisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLAorCQkJCQkgICAgICAgT1VJX1dQQV9US0lQLCA0KTsKKwkJCQkvKiBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJCWlmIChNSVhfQ0lQSEVSX1dQQV9BRVNfT04oRmxleGlibGVDaXBoZXIpKSB7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLgorCQkJCQkJICAgICAgIG91aSArIDQsIE9VSV9XUEFfQ0NNUCwKKwkJCQkJCSAgICAgICA0KTsKKwkJCQkJUGFpcndpc2VDbnQgPSAyOwogCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKLQkJCQl9Ci0KLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSBQYWlyd2lzZUNudDsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSkgKyAoNCAqIChQYWlyd2lzZUNudCAtIDEpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlVSU5UIEdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0JCQlzd2l0Y2goR3JvdXBDaXBoZXIpCi0JCQl7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ6Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1dFUDQwLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9XRVAxMDQsIDQpOwotCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogSW5zZXJ0IFdQQSBBRVMgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlciAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwKKwkJCQkJICAgICAgIE9VSV9XUEFfQ0NNUCwgNCk7CiAJCQl9CisKKwkJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IFBhaXJ3aXNlQ250OworCQkJKnJzbl9sZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOworCQkJYnJlYWs7CiAJCX0KIAotCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKKwkJICAgIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSB7CisJCQl1MzIgR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKKwkJCXN3aXRjaCAoR3JvdXBDaXBoZXIpIHsKKwkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOgorCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LAorCQkJCQkgICAgICAgT1VJX1dQQV9XRVA0MCwgNCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ6CisJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsCisJCQkJCSAgICAgICBPVUlfV1BBX1dFUDEwNCwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogc3dhcCBmb3IgYmlnLWVuZGlhbiBwbGF0Zm9ybSAqLwogCQlwUnNuaWVfY2lwaGVyLT52ZXJzaW9uID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dmVyc2lvbik7Ci0JICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CisJCXBSc25pZV9jaXBoZXItPnVjb3VudCA9IGNwdTJsZTE2KHBSc25pZV9jaXBoZXItPnVjb3VudCk7CiAJfQogfQogCkBAIC00NzcsOCArMTcxMiw4IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0gICAgCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKKwlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQogCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CiAKIAlSZXR1cm4gVmFsdWU6CkBAIC00ODcsNjIgKzE3MjIsNjYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLXN0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUFLTSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKLQlJTglVSU5UCQkJQXV0aE1vZGUsCi0JSU4JVUNIQVIJCQlhcGlkeCwKLQlPVVQJUFVDSEFSCQkJcFJzbkllLAotCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQorc3RhdGljIHZvaWQgUlRNUE1ha2VSc25JZUFLTShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IEVsZW1lbnRJRCwKKwkJCSAgICAgdTMyIEF1dGhNb2RlLAorCQkJICAgICB1OCBhcGlkeCwKKwkJCSAgICAgdTggKnBSc25JZSwgdTggKiByc25fbGVuKQogewotCVJTTklFX0FVVEgJCSpwUnNuaWVfYXV0aDsKKwlzdHJ1Y3QgcnRfcnNuaWVfYXV0aCAqcFJzbmllX2F1dGg7CisJdTggQWttQ250ID0gMTsJLyogZGVmYXVsdCBhcyAxICovCiAKLQlwUnNuaWVfYXV0aCA9IChSU05JRV9BVVRIKikocFJzbkllICsgKCpyc25fbGVuKSk7CisJcFJzbmllX2F1dGggPSAoc3RydWN0IHJ0X3JzbmllX2F1dGggKikgKHBSc25JZSArICgqcnNuX2xlbikpOwogCi0JLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQotCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQotCXsKLQkJc3dpdGNoIChBdXRoTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLSAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBMl84MDIxWF9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCS8qIGRlY2lkZSBXUEEyIG9yIFdQQTEgKi8KKwlpZiAoRWxlbWVudElEID09IFdwYTJJZSkgewogCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOwotICAgICAgICAgICAgICAgIAlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEEyX1BTS19BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0JfQotCWVsc2UKLQl7Ci0JCXN3aXRjaCAoQXV0aE1vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLSAgICAgICAgICAgICAgICBwUnNuaWVfYXV0aC0+YWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfODAyMVhfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJc3dpdGNoIChBdXRoTW9kZSkgeworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEEyXzgwMjFYX0FLTSwgNCk7CisJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotICAgICAgICAgICAgICAgIHBSc25pZV9hdXRoLT5hY291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQV9QU0tfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgorCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgorCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLAorCQkJCSAgICAgICBPVUlfV1BBMl9QU0tfQUtNLCA0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQWttQ250ID0gMDsKKwkJCWJyZWFrOwogCi0JCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU6Ci0gICAgICAgICAgICAgICAgcFJzbmllX2F1dGgtPmFjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBX05PTkVfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChBdXRoTW9kZSkgeworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKKwkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwKKwkJCQkgICAgICAgT1VJX1dQQV84MDIxWF9BS00sIDQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s6CisJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEFfUFNLX0FLTSwgNCk7CisJCQlicmVhazsKKworCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU6CisJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksCisJCQkJICAgICAgIE9VSV9XUEFfTk9ORV9BS00sIDQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlBa21DbnQgPSAwOworCQkJYnJlYWs7CisJCX0KIAl9CiAKKwlwUnNuaWVfYXV0aC0+YWNvdW50ID0gQWttQ250OwogCXBSc25pZV9hdXRoLT5hY291bnQgPSBjcHUybGUxNihwUnNuaWVfYXV0aC0+YWNvdW50KTsKIAotCSgqcnNuX2xlbikgKz0gc2l6ZW9mKFJTTklFX0FVVEgpOwkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKKwkvKiB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGggKi8KKwkoKnJzbl9sZW4pICs9IChzaXplb2Yoc3RydWN0IHJ0X3JzbmllX2F1dGgpICsgKDQgKiAoQWttQ250IC0gMSkpKTsKIAogfQogCkBAIC01NTUsNyArMTc5NCw3IEBACiAKIAlBcmd1bWVudHM6CiAJCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotICAgIAlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCisJRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgogCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CiAKIAlSZXR1cm4gVmFsdWU6CkBAIC01NjQsMjkgKzE4MDMsMjUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLXN0YXRpYyBWT0lEIFJUTVBJbnNlcnRSc25JZUNhcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCitzdGF0aWMgdm9pZCBSVE1QTWFrZVJzbkllQ2FwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggRWxlbWVudElELAorCQkJICAgICB1OCBhcGlkeCwKKwkJCSAgICAgdTggKnBSc25JZSwgdTggKiByc25fbGVuKQogewotCVJTTl9DQVBBQklMSVRJRVMgICAgKnBSU05fQ2FwOworCVJTTl9DQVBBQklMSVRJRVMgKnBSU05fQ2FwOwogCi0JLy8gaXQgY291bGQgYmUgaWdub3JlZCBpbiBXUEExIG1vZGUKKwkvKiBpdCBjb3VsZCBiZSBpZ25vcmVkIGluIFdQQTEgbW9kZSAqLwogCWlmIChFbGVtZW50SUQgPT0gV3BhSWUpCiAJCXJldHVybjsKIAotCXBSU05fQ2FwID0gKFJTTl9DQVBBQklMSVRJRVMqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKLQorCXBSU05fQ2FwID0gKFJTTl9DQVBBQklMSVRJRVMgKikgKHBSc25JZSArICgqcnNuX2xlbikpOwogCiAJcFJTTl9DYXAtPndvcmQgPSBjcHUybGUxNihwUlNOX0NhcC0+d29yZCk7CiAKLQkoKnJzbl9sZW4pICs9IHNpemVvZihSU05fQ0FQQUJJTElUSUVTKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCisJKCpyc25fbGVuKSArPSBzaXplb2YoUlNOX0NBUEFCSUxJVElFUyk7CS8qIHVwZGF0ZSBjdXJyZW50IFJTTklFIGxlbmd0aCAqLwogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNTk1LDggKzE4MzAsOCBAQAogCiAJQXJndW1lbnRzOgogCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLSAgICAJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQotICAgIAlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCisJQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQorCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKIAkJYXBpZHgJCS0JaW5kaWNhdGUgdGhlIGludGVyZmFjZSBpbmRleAogCiAJUmV0dXJuIFZhbHVlOgpAQCAtNjA1LDQ4ICsxODQwLDQzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBNYWtlUlNOSUUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKLQlJTglVQ0hBUgkJCWFwaWR4KQordm9pZCBSVE1QTWFrZVJTTklFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgdTMyIEF1dGhNb2RlLCB1MzIgV2VwU3RhdHVzLCB1OCBhcGlkeCkKIHsKLQlQVUNIQVIJCXBSc25JZSA9IE5VTEw7CQkJLy8gcHJpbWFyeSBSU05JRQotCVVDSEFSIAkJKnJzbmllbGVuX2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRQotCVVDSEFSCQkqcnNuaWVsZW5fZXhfY3VyX3AgPSAwOwkvLyB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkgUlNOSUUKLQlVQ0hBUgkJUHJpbWFyeVJzbmllOwotCUJPT0xFQU4JCWJNaXhDaXBoZXIgPSBGQUxTRTsJLy8gaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudAotCVVDSEFSCQlwX29mZnNldDsKLQlXUEFfTUlYX1BBSVJfQ0lQSEVSCQlGbGV4aWJsZUNpcGhlciA9IFdQQV9US0lQQUVTX1dQQTJfVEtJUEFFUzsJLy8gaXQgcHJvdmlkZSB0aGUgbW9yZSBmbGV4aWJsZSBjaXBoZXIgY29tYmluYXRpb24gaW4gV1BBLVdQQTIgYW5kIFRLSVBBRVMgbW9kZQorCXU4ICpwUnNuSWUgPSBOVUxMOwkvKiBwcmltYXJ5IFJTTklFICovCisJdTggKnJzbmllbGVuX2N1cl9wID0gMDsJLyogdGhlIGxlbmd0aCBvZiB0aGUgcHJpbWFyeSBSU05JRSAqLworCXU4ICpyc25pZWxlbl9leF9jdXJfcCA9IDA7CS8qIHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZGFyeSBSU05JRSAqLworCXU4IFByaW1hcnlSc25pZTsKKwlCT09MRUFOIGJNaXhDaXBoZXIgPSBGQUxTRTsJLyogaW5kaWNhdGUgdGhlIHBhaXJ3aXNlIGFuZCBncm91cCBjaXBoZXIgYXJlIGRpZmZlcmVudCAqLworCXU4IHBfb2Zmc2V0OworCVdQQV9NSVhfUEFJUl9DSVBIRVIgRmxleGlibGVDaXBoZXIgPSBXUEFfVEtJUEFFU19XUEEyX1RLSVBBRVM7CS8qIGl0IHByb3ZpZGUgdGhlIG1vcmUgZmxleGlibGUgY2lwaGVyIGNvbWJpbmF0aW9uIGluIFdQQS1XUEEyIGFuZCBUS0lQQUVTIG1vZGUgKi8KIAogCXJzbmllbGVuX2N1cl9wID0gTlVMTDsKIAlyc25pZWxlbl9leF9jdXJfcCA9IE5VTEw7CiAKIAl7CiAJCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLQkJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0KKwkJCSAgICBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKSB7CiAJCQkJaWYgKEF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQogCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gU3VwcG9ydCBXUEFQU0sgb3IgV1BBMlBTSyBpbiBTVEEtSW5mcmEgbW9kZQotCQkJCS8vIFN1cHBvcnQgV1BBTm9uZSBpbiBTVEEtQWRob2MgbW9kZQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTdXBwb3J0IFdQQVBTSyBvciBXUEEyUFNLIGluIFNUQS1JbmZyYSBtb2RlICovCisJCQkJLyogU3VwcG9ydCBXUEFOb25lIGluIFNUQS1BZGhvYyBtb2RlICovCiAJCQkJaWYgKChBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCQkJCQkoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJKQorCQkJCSAgICAoQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKKwkJCQkgICAgKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCisJCQkJICAgICkKIAkJCQkJcmV0dXJuOwogCQkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIj09PiBSVE1QTWFrZVJTTklFKFNUQSlcbiIpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QTWFrZVJTTklFKFNUQSlcbiIpKTsKIAotCQkJLy8gWmVybyBSU05JRSBjb250ZXh0CisJCQkvKiBaZXJvIFJTTklFIGNvbnRleHQgKi8KIAkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IDA7CiAJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SU05fSUUsIE1BWF9MRU5fT0ZfUlNOSUUpOwogCi0JCQkvLyBQb2ludGVyIHRvIFJTTklFCisJCQkvKiBQb2ludGVyIHRvIFJTTklFICovCiAJCQlyc25pZWxlbl9jdXJfcCA9ICZwQWQtPlN0YUNmZy5SU05JRV9MZW47CiAJCQlwUnNuSWUgPSBwQWQtPlN0YUNmZy5SU05fSUU7CiAKQEAgLTY1NCwzNCArMTg4NCwzNSBAQAogCQl9CiAJfQogCi0JLy8gaW5kaWNhdGUgcHJpbWFyeSBSU05JRSBhcyBXUEEgb3IgV1BBMgorCS8qIGluZGljYXRlIHByaW1hcnkgUlNOSUUgYXMgV1BBIG9yIFdQQTIgKi8KIAlpZiAoKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHx8Ci0JCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikgfHwKLQkJKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKKwkgICAgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkgICAgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHx8CisJICAgIChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMikgfHwKKwkgICAgKEF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKIAkJUHJpbWFyeVJzbmllID0gV3BhSWU7CiAJZWxzZQogCQlQcmltYXJ5UnNuaWUgPSBXcGEySWU7CiAKIAl7Ci0JCS8vIEJ1aWxkIHRoZSBwcmltYXJ5IFJTTklFCi0JCS8vIDEuIGluc2VydCBjaXBoZXIgc3VpdGUKLQkJUlRNUEluc2VydFJzbkllQ2lwaGVyKHBBZCwgUHJpbWFyeVJzbmllLCBXZXBTdGF0dXMsIGJNaXhDaXBoZXIsIEZsZXhpYmxlQ2lwaGVyLCBwUnNuSWUsICZwX29mZnNldCk7CisJCS8qIEJ1aWxkIHRoZSBwcmltYXJ5IFJTTklFICovCisJCS8qIDEuIGluc2VydCBjaXBoZXIgc3VpdGUgKi8KKwkJUlRNUE1ha2VSc25JZUNpcGhlcihwQWQsIFByaW1hcnlSc25pZSwgV2VwU3RhdHVzLCBiTWl4Q2lwaGVyLAorCQkJCSAgICBGbGV4aWJsZUNpcGhlciwgcFJzbkllLCAmcF9vZmZzZXQpOwogCi0JCS8vIDIuIGluc2VydCBBS00KLQkJUlRNUEluc2VydFJzbkllQUtNKHBBZCwgUHJpbWFyeVJzbmllLCBBdXRoTW9kZSwgYXBpZHgsIHBSc25JZSwgJnBfb2Zmc2V0KTsKKwkJLyogMi4gaW5zZXJ0IEFLTSAqLworCQlSVE1QTWFrZVJzbkllQUtNKHBBZCwgUHJpbWFyeVJzbmllLCBBdXRoTW9kZSwgYXBpZHgsIHBSc25JZSwKKwkJCQkgJnBfb2Zmc2V0KTsKIAotCQkvLyAzLiBpbnNlcnQgY2FwYWJpbGl0eQotCQlSVE1QSW5zZXJ0UnNuSWVDYXAocEFkLCBQcmltYXJ5UnNuaWUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CisJCS8qIDMuIGluc2VydCBjYXBhYmlsaXR5ICovCisJCVJUTVBNYWtlUnNuSWVDYXAocEFkLCBQcmltYXJ5UnNuaWUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7CiAJfQogCi0JLy8gNC4gdXBkYXRlIHRoZSBSU05JRSBsZW5ndGgKKwkvKiA0LiB1cGRhdGUgdGhlIFJTTklFIGxlbmd0aCAqLwogCSpyc25pZWxlbl9jdXJfcCA9IHBfb2Zmc2V0OwogCiAJaGV4X2R1bXAoIlRoZSBwcmltYXJ5IFJTTklFIiwgcFJzbkllLCAoKnJzbmllbGVuX2N1cl9wKSk7CiAKLQogfQogCiAvKgpAQCAtNjkzLDE0NCArMTkyNCwxMDkzIEBACiAJCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKIAkJcEVudHJ5CQkJLQlwb2ludGVyIHRvIGFjdGl2ZSBlbnRyeQogCQlwRGF0YQkJCS0JdGhlIHJlY2VpdmVkIGZyYW1lCi0JCURhdGFCeXRlQ291bnQgCS0JdGhlIHJlY2VpdmVkIGZyYW1lJ3MgbGVuZ3RoCisJCURhdGFCeXRlQ291bnQJLQl0aGUgcmVjZWl2ZWQgZnJhbWUncyBsZW5ndGgKIAkJRnJvbVdoaWNoQlNTSUQJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4CiAKICAgICBSZXR1cm46Ci0gICAgICAgICBUUlVFIAkJCS0JVGhpcyBmcmFtZSBpcyBFQVAgZnJhbWUKLSAgICAgICAgIEZBTFNFIAkJCS0Jb3RoZXJ3aXNlCisgICAgICAgICBUUlVFCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQorICAgICAgICAgRkFMU0UJCQktCW90aGVyd2lzZQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTiBQVUNIQVIgICAgICAgICAgIHBEYXRhLAotICAgIElOIFVMT05HICAgICAgICAgICAgRGF0YUJ5dGVDb3VudCwKLQlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQorQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgdTggKnBEYXRhLAorCQkJICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ291bnQsIHU4IEZyb21XaGljaEJTU0lEKQogewotCVVMT05HCUJvZHlfbGVuOworCXVuc2lnbmVkIGxvbmcgQm9keV9sZW47CiAJQk9PTEVBTiBDYW5jZWxsZWQ7CiAKKwlpZiAoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKKwkJcmV0dXJuIEZBTFNFOwogCi0gICAgaWYoRGF0YUJ5dGVDb3VudCA8IChMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCS8qIFNraXAgTExDIGhlYWRlciAqLworCWlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIHBEYXRhLCA2KSB8fAorCSAgICAvKiBDaXNjbyAxMjAwIEFQIG1heSBzZW5kIHBhY2tldCB3aXRoIFNOQVBfQlJJREdFX1RVTk5FTCAqLworCSAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBwRGF0YSwgNikpIHsKKwkJcERhdGEgKz0gNjsKKwl9CisJLyogU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUgKi8KKwlpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpIHsKKwkJcERhdGEgKz0gMjsKKwl9IGVsc2UKKwkJcmV0dXJuIEZBTFNFOwogCisJc3dpdGNoICgqKHBEYXRhICsgMSkpIHsKKwljYXNlIEVBUFBhY2tldDoKKwkJQm9keV9sZW4gPSAoKihwRGF0YSArIDIpIDw8IDgpIHwgKCoocERhdGEgKyAzKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUmVjZWl2ZSBFQVAtUGFja2V0IGZyYW1lLCBUWVBFID0gMCwgTGVuZ3RoID0gJWxkXG4iLAorCQkJICBCb2R5X2xlbikpOworCQlicmVhazsKKwljYXNlIEVBUE9MU3RhcnQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7CisJCWlmIChwRW50cnktPkVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nICE9CisJCSAgICBFQVBPTF9TVEFSVF9ESVNBQkxFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDYW5jZWwgdGhlIEVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nIFxuIikpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLAorCQkJCQkmQ2FuY2VsbGVkKTsKKwkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPQorCQkJICAgIEVBUE9MX1NUQVJUX0RJU0FCTEU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFQVBPTExvZ29mZjoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUE9MTG9nb2ZmIGZyYW1lLCBUWVBFID0gMiBcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBFQVBPTEtleToKKwkJQm9keV9sZW4gPSAoKihwRGF0YSArIDIpIDw8IDgpIHwgKCoocERhdGEgKyAzKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUmVjZWl2ZSBFQVBPTC1LZXkgZnJhbWUsIFRZUEUgPSAzLCBMZW5ndGggPSAlbGRcbiIsCisJCQkgIEJvZHlfbGVuKSk7CisJCWJyZWFrOworCWNhc2UgRUFQT0xBU0ZBbGVydDoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWNlaXZlIEVBUE9MQVNGQWxlcnQgZnJhbWUsIFRZUEUgPSA0IFxuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRkFMU0U7CiAKLQkvLyBTa2lwIExMQyBoZWFkZXIKLSAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBwRGF0YSwgNikgfHwKLSAgICAgICAgLy8gQ2lzY28gMTIwMCBBUCBtYXkgc2VuZCBwYWNrZXQgd2l0aCBTTkFQX0JSSURHRV9UVU5ORUwKLSAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgcERhdGEsIDYpKQotICAgIHsKLSAgICAgICAgcERhdGEgKz0gNjsKLSAgICB9Ci0JLy8gU2tpcCAyLWJ5dGVzIEVBUG9MIHR5cGUKLSAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KEVBUE9MLCBwRGF0YSwgMikpCi0gICAgewotICAgICAgICBwRGF0YSArPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CiAKLSAgICBzd2l0Y2ggKCoocERhdGErMSkpCi0gICAgewotICAgICAgICBjYXNlIEVBUFBhY2tldDoKLQkJCUJvZHlfbGVuID0gKCoocERhdGErMik8PDgpIHwgKCoocERhdGErMykpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVAtUGFja2V0IGZyYW1lLCBUWVBFID0gMCwgTGVuZ3RoID0gJWxkXG4iLCBCb2R5X2xlbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUFQT0xTdGFydDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wtU3RhcnQgZnJhbWUsIFRZUEUgPSAxIFxuIikpOwotCQkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYW5jZWwgdGhlIEVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nIFxuIikpOwotICAgICAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5FbnF1ZXVlU3RhcnRGb3JQU0tUaW1lciwgJkNhbmNlbGxlZCk7Ci0gICAgICAgICAgICAgICAgcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTExvZ29mZjoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0xMb2dvZmYgZnJhbWUsIFRZUEUgPSAyIFxuIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUFQT0xLZXk6Ci0JCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wtS2V5IGZyYW1lLCBUWVBFID0gMywgTGVuZ3RoID0gJWxkXG4iLCBCb2R5X2xlbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUFQT0xBU0ZBbGVydDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0xBU0ZBbGVydCBmcmFtZSwgVFlQRSA9IDQgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKy8qCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBEZXNjcmlwdGlvbjoKKwkJUmVwb3J0IHRoZSBFQVAgbWVzc2FnZSB0eXBlCiAKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisJQXJndW1lbnRzOgorCQltc2cJCS0JRUFQT0xfUEFJUl9NU0dfMQorCQkJCQlFQVBPTF9QQUlSX01TR18yCisJCQkJCUVBUE9MX1BBSVJfTVNHXzMKKwkJCQkJRUFQT0xfUEFJUl9NU0dfNAorCQkJCQlFQVBPTF9HUk9VUF9NU0dfMQorCQkJCQlFQVBPTF9HUk9VUF9NU0dfMgorCisgICAgUmV0dXJuOgorICAgICAgICAgbWVzc2FnZSB0eXBlIHN0cmluZworCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitjaGFyICpHZXRFYXBvbE1zZ1R5cGUoY2hhciBtc2cpCit7CisJaWYgKG1zZyA9PSBFQVBPTF9QQUlSX01TR18xKQorCQlyZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMSI7CisJZWxzZSBpZiAobXNnID09IEVBUE9MX1BBSVJfTVNHXzIpCisJCXJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAyIjsKKwllbHNlIGlmIChtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDMiOworCWVsc2UgaWYgKG1zZyA9PSBFQVBPTF9QQUlSX01TR180KQorCQlyZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgNCI7CisJZWxzZSBpZiAobXNnID09IEVBUE9MX0dST1VQX01TR18xKQorCQlyZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMSI7CisJZWxzZSBpZiAobXNnID09IEVBUE9MX0dST1VQX01TR18yKQorCQlyZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMiI7CisJZWxzZQorCQlyZXR1cm4gIkludmFsaWQgTWVzc2FnZSI7CiB9CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlNaXNjIGZ1bmN0aW9uIHRvIGRlY3J5cHQgQUVTIGJvZHkKKyAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK0JPT0xFQU4gUlRNUENoZWNrUlNOSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBEYXRhLAorCQkgICAgICAgdTggRGF0YUxlbiwKKwkJICAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgdTggKiBPZmZzZXQpCit7CisJdTggKnBWSUU7CisJdTggbGVuOworCXN0cnVjdCBydF9laWQgKiBwRWlkOworCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7CisKKwlwVklFID0gcERhdGE7CisJbGVuID0gRGF0YUxlbjsKKwkqT2Zmc2V0ID0gMDsKKworCXdoaWxlIChsZW4gPiBzaXplb2Yoc3RydWN0IHJ0X3JzbmllMikpIHsKKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopIHBWSUU7CisJCS8qIFdQQSBSU04gSUUgKi8KKwkJaWYgKChwRWlkLT5FaWQgPT0gSUVfV1BBKQorCQkgICAgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKSB7CisJCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBCisJCQkgICAgIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQorCQkJICAgICYmCisJCQkgICAgKE5kaXNFcXVhbE1lbW9yeQorCQkJICAgICAocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkKKwkJCSAgICAmJiAocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkgeworCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9CisJCS8qIFdQQTIgUlNOIElFICovCisJCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKQorCQkJICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpIHsKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyCisJCQkgICAgIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKKwkJCSAgICAmJiAocEVpZC0+RWlkID09IHBFbnRyeS0+UlNOX0lFWzBdKQorCQkJICAgICYmICgocEVpZC0+TGVuICsgMikgPj0gcEVudHJ5LT5SU05JRV9MZW4pCisJCQkgICAgJiYKKwkJCSAgICAoTmRpc0VxdWFsTWVtb3J5CisJCQkgICAgIChwRWlkLT5PY3RldCwgJnBFbnRyeS0+UlNOX0lFWzJdLAorCQkJICAgICAgcEVudHJ5LT5SU05JRV9MZW4gLSAyKSkpIHsKKworCQkJCXJlc3VsdCA9IFRSVUU7CisJCQl9CisKKwkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKworCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKKwkJbGVuIC09IChwRWlkLT5MZW4gKyAyKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFBhcnNlIEtFWURBVEEgZmllbGQuICBLRVlEQVRBW10gTWF5IGNvbnRhaW4gMiBSU04gSUUgYW5kIG9wdGlvbmFsbHkgR1RLLgorICAgIEdUSyAgaXMgZW5jYXB0dWxhdGVkIGluIEtERSBmb3JtYXQgYXQgIHAuODMgODAyLjExaSBEMTAKIAogCUFyZ3VtZW50czoKIAogCVJldHVybiBWYWx1ZToKIAogCU5vdGU6Ci0JCVRoaXMgZnVuY3Rpb24gcmVmZXJlbmNlcyB0bwlSRkMJMzM5NCBmb3IgYWVzIGtleSB1bndyYXAgYWxnb3JpdGhtLgorICAgICAgICA4MDIuMTFpIEQxMAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlBRVNfR1RLX0tFWV9VTldSQVAoCi0JSU4JVUNIQVIJKmtleSwKLQlPVVQJVUNIQVIJKnBsYWludGV4dCwKLQlJTglVQ0hBUiAgICBjX2xlbiwKLQlJTglVQ0hBUgkqY2lwaGVydGV4dCkKLQorQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggKnBLZXlEYXRhLAorCQkJICAgICAgdTggS2V5RGF0YUxlbiwKKwkJCSAgICAgIHU4IEdyb3VwS2V5SW5kZXgsCisJCQkgICAgICB1OCBNc2dUeXBlLAorCQkJICAgICAgSU4gQk9PTEVBTiBiV1BBMiwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KQogewotCVVDSEFSICAgICAgIEFbOF0sIEJJTlsxNl0sIEJPVVRbMTZdOwotCVVDSEFSICAgICAgIHhvcjsKLQlJTlQgICAgICAgICBpLCBqOwotCWFlc19jb250ZXh0IGFlc2N0eDsKLQlVQ0hBUiAgICAgICAqUjsKLQlJTlQgICAgICAgICBudW1fYmxvY2tzID0gY19sZW4vODsJLy8gdW5pdDo2NGJpdHMKKwlzdHJ1Y3QgcnRfa2RlX2VuY2FwICogcEtERSA9IE5VTEw7CisJdTggKnBNeUtleURhdGEgPSBwS2V5RGF0YTsKKwl1OCBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKKwl1OCBHVEtMRU4gPSAwOworCXU4IERlZmF1bHRJZHggPSAwOworCXU4IHNraXBfb2Zmc2V0OwogCisJLyogVmVyaWZ5IFRoZSBSU04gSUUgY29udGFpbmVkIGluIHBhaXJld2lzZV9tc2dfMiAmJiBwYWlyZXdpc2VfbXNnXzMgYW5kIHNraXAgaXQgKi8KKwlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykgeworCQkvKiBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sgKi8KKwkJaWYgKCFSVE1QQ2hlY2tSU05JRQorCQkgICAgKHBBZCwgcEtleURhdGEsIEtleURhdGFMZW4sIHBFbnRyeSwgJnNraXBfb2Zmc2V0KSkgeworCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBSU04gSUUgZGlmZmVyZW50ICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwKKwkJCQkJCSAgICAgIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBFbnRyeS0+QWRkciwKKwkJCQkJCSAgICAgIHBFbnRyeS0+YXBpZHgsIDApOwogCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmUiwgNTEyKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlJTTl9JRSBEaWZmZXJlbnQgaW4gbXNnICVkIG9mIDQtd2F5IGhhbmRzaGFrZSFcbiIsCisJCQkJICBNc2dUeXBlKSk7CisJCQloZXhfZHVtcCgiUmVjZWl2ZSBSU05fSUUgIiwgcEtleURhdGEsIEtleURhdGFMZW4pOworCQkJaGV4X2R1bXAoIkRlc2lyZWQgUlNOX0lFICIsIHBFbnRyeS0+UlNOX0lFLAorCQkJCSBwRW50cnktPlJTTklFX0xlbik7CiAKLQlpZiAoUiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQUVTX0dUS19LRVlfVU5XUkFQOiBubyBtZW1vcnkhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCisJCQlyZXR1cm4gRkFMU0U7CisJCX0gZWxzZSB7CisJCQlpZiAoYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB7CisJCQkJV3BhU2hvd0FsbHN1aXRlKHBNeUtleURhdGEsIHNraXBfb2Zmc2V0KTsKIAotCS8vIEluaXRpYWxpemUKLQlOZGlzTW92ZU1lbW9yeShBLCBjaXBoZXJ0ZXh0LCA4KTsKLQkvL0lucHV0IHBsYWludGV4dAotCWZvcihpID0gMDsgaSA8IChjX2xlbi04KTsgaSsrKQotCXsKLQkJUlsgaV0gPSBjaXBoZXJ0ZXh0W2kgKyA4XTsKLQl9Ci0KLQlydG1wX2Flc19zZXRfa2V5KCZhZXNjdHgsIGtleSwgMTI4KTsKLQotCWZvcihqID0gNTsgaiA+PSAwOyBqLS0pCi0JewotCQlmb3IoaSA9IChudW1fYmxvY2tzLTEpOyBpID4gMDsgaS0tKQotCQl7Ci0JCQl4b3IgPSAobnVtX2Jsb2NrcyAtMSApKiBqICsgaTsKLQkJCU5kaXNNb3ZlTWVtb3J5KEJJTiwgQSwgOCk7Ci0JCQlCSU5bN10gPSBBWzddIF4geG9yOwotCQkJTmRpc01vdmVNZW1vcnkoJkJJTls4XSwgJlJbKGktMSkqOF0sIDgpOwotCQkJcnRtcF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOwotCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOwotCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKKwkJCQkvKiBza2lwIFJTTiBJRSAqLworCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7CisJCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUlRNUFBhcnNlRWFwb2xLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1hdGNoZWQgaW4gTXNnIDMsIExlbmd0aCglZCkgXG4iLAorCQkJCQkgIHNraXBfb2Zmc2V0KSk7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gVFJVRTsKIAkJfQogCX0KIAotCS8vIE9VVFBVVAotCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCi0JewotCQlwbGFpbnRleHRbaV0gPSBSW2ldOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IEtleURhdGFMZW5ndGggJWQgd2l0aG91dCBSU05fSUUgXG4iLAorCQkgIEtleURhdGFMZW5ndGgpKTsKKwkvKmhleF9kdW1wKCJyZW1haW4gZGF0YSIsIHBNeUtleURhdGEsIEtleURhdGFMZW5ndGgpOyAqLworCisJLyogUGFyc2UgRUtEIGZvcm1hdCBpbiBwYWlyd2lzZV9tc2dfM19XUEEyICYmIGdyb3VwX21zZ18xX1dQQTIgKi8KKwlpZiAoYldQQTIKKwkgICAgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkgeworCQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQkvKiBLREUgZm9ybWF0IGV4Y2x1ZGUgR1RLIGxlbmd0aCAqLworCQl7CisJCQlwS0RFID0gKHN0cnVjdCBydF9rZGVfZW5jYXAgKikgcE15S2V5RGF0YTsKKworCQkJRGVmYXVsdElkeCA9IHBLREUtPkdUS0VuY2FwLktpZDsKKworCQkJLyogU2FuaXR5IGNoZWNrIC0gS0VEIGxlbmd0aCAqLworCQkJaWYgKEtleURhdGFMZW5ndGggPCAocEtERS0+TGVuICsgMikpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCS8qIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MiAqLworCQkJR1RLTEVOID0gcEtERS0+TGVuIC0gNjsKKwkJCWlmIChHVEtMRU4gPCBMRU5fQUVTX0tFWSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJFUlJPUjogR1RLIEtleSBsZW5ndGggaXMgdG9vIHNob3J0ICglZCkgXG4iLAorCQkJCQkgIEdUS0xFTikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRVJST1I6IEtERSBmb3JtYXQgbGVuZ3RoIGlzIHRvbyBzaG9ydCBcbiIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwKKwkJCSAgRGVmYXVsdElkeCwgR1RLTEVOKSk7CisJCS8qIHNraXAgaXQgKi8KKwkJcE15S2V5RGF0YSArPSA4OworCQlLZXlEYXRhTGVuZ3RoIC09IDg7CisKKwl9IGVsc2UgaWYgKCFiV1BBMiAmJiBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSB7CisJCURlZmF1bHRJZHggPSBHcm91cEtleUluZGV4OworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkdUSyBEZWZhdWx0S2V5SUQ9JWQgXG4iLCBEZWZhdWx0SWR4KSk7CisJfQorCS8qIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggbXVzdCBiZSAxIH4gMyAqLworCWlmIChEZWZhdWx0SWR4IDwgMSB8fCBEZWZhdWx0SWR4ID4gMykgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkVSUk9SOiBHVEsgS2V5IGluZGV4KCVkKSBpcyBpbnZhbGlkIGluICVzICVzIFxuIiwKKwkJCSAgRGVmYXVsdElkeCwgKChiV1BBMikgPyAiV1BBMiIgOiAiV1BBIiksCisJCQkgIEdldEVhcG9sTXNnVHlwZShNc2dUeXBlKSkpOworCQlyZXR1cm4gRkFMU0U7CiAJfQogCisJeworCQlzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFNoYXJlZEtleTsKIAotCW9zX2ZyZWVfbWVtKE5VTEwsIFIpOworCQkvKiBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgKi8KKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBwTXlLZXlEYXRhLCAzMik7CisJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IERlZmF1bHRJZHg7CisKKwkJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdOworCisJCS8qIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUgKi8KKwkJTmRpc1plcm9NZW1vcnkocFNoYXJlZEtleSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksIHBBZC0+U3RhQ2ZnLkdUSywgTEVOX1RLSVBfRUspOworCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1sxNl0sCisJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMjRdLAorCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisKKwkJLyogVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnICovCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PQorCQkJIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOworCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisKKwkJLyogVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKKwkJCQkgICAgICBCU1MwLAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkgICAgICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCisJCQkJICAgICAgcFNoYXJlZEtleS0+S2V5LAorCQkJCSAgICAgIHBTaGFyZWRLZXktPlR4TWljLCBwU2hhcmVkS2V5LT5SeE1pYyk7CisKKwkJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkgIEJTUzAsCisJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywgTlVMTCk7CisJfQorCisJcmV0dXJuIFRSVUU7CisKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUNvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIGZvciBXUEEgaGFuZHNoYWtpbmcKKwkJSXRzIGZvcm1hdCBpcyBiZWxvdywKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVmVyc2lvbgkgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgUHJvdG9jb2wgVHlwZQkJIHwJMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgQm9keSBMZW5ndGgJCSB8ICAyIG9jdGV0cworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgRGVzY3JpcHRvciBUeXBlCSB8CTEgb2N0ZXQKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJbmZvcm1hdGlvbiAgICB8CTIgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTGVuZ3RoCSAgICAgfCAgMSBvY3RldAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgS2V5IFJlcGFseSBDb3VudGVyIHwJOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBOb25jZQkJICAgICB8ICAzMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJVgkJCSB8ICAxNiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBSU0MJCQkgfCAgOCBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBJRCBvciBSZXNlcnZlZCB8CTggb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgTUlDCQkJIHwJMTYgb2N0ZXRzCisJCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkJfCBLZXkgRGF0YSBMZW5ndGgJIHwJMiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCQl8IEtleSBEYXRhCQkJIHwJbiBvY3RldHMKKwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisJQXJndW1lbnRzOgorCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIENvbnN0cnVjdEVhcG9sTXNnKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJICAgICAgIHU4IEdyb3VwS2V5V2VwU3RhdHVzLAorCQkgICAgICAgdTggTXNnVHlwZSwKKwkJICAgICAgIHU4IERlZmF1bHRLZXlJZHgsCisJCSAgICAgICB1OCAqIEtleU5vbmNlLAorCQkgICAgICAgdTggKiBUeFJTQywKKwkJICAgICAgIHU4ICogR1RLLAorCQkgICAgICAgdTggKiBSU05JRSwKKwkJICAgICAgIHU4IFJTTklFX0xlbiwgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cpCit7CisJQk9PTEVBTiBiV1BBMiA9IEZBTFNFOworCXU4IEtleURlc2NWZXI7CisKKwkvKiBDaG9vc2UgV1BBMiBvciBub3QgKi8KKwlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKKwkgICAgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCisJCWJXUEEyID0gVFJVRTsKKworCS8qIEluaXQgUGFja2V0IGFuZCBGaWxsIGhlYWRlciAqLworCXBNc2ctPlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlwTXNnLT5Qcm9UeXBlID0gRUFQT0xLZXk7CisKKwkvKiBEZWZhdWx0IDk1IGJ5dGVzLCB0aGUgRUFQb0wtS2V5IGRlc2NyaXB0b3IgZXhjbHVkZSBLZXktZGF0YSBmaWVsZCAqLworCVNFVF91MTZfVE9fQVJSQVJZKHBNc2ctPkJvZHlfTGVuLCBMRU5fRUFQT0xfS0VZX01TRyk7CisKKwkvKiBGaWxsIGluIEVBUG9MIGRlc2NyaXB0b3IgKi8KKwlpZiAoYldQQTIpCisJCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7CisJZWxzZQorCQlwTXNnLT5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOworCisJLyogS2V5IERlc2NyaXB0b3IgVmVyc2lvbiAoYml0cyAwLTIpIHNwZWNpZmllcyB0aGUga2V5IGRlc2NyaXB0b3IgdmVyc2lvbiB0eXBlICovCisJeworCQkvKiBGaWxsIGluIEtleSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gSUVFRSBTdGQgODAyLjExaS0yMDA0IHBhZ2UgNzggKi8KKwkJLyogV2hlbiBlaXRoZXIgdGhlIHBhaXJ3aXNlIG9yIHRoZSBncm91cCBjaXBoZXIgaXMgQUVTLCB0aGUgREVTQ19UWVBFX0FFUygyKSBzaGFsbCBiZSB1c2VkLiAqLworCQlLZXlEZXNjVmVyID0KKwkJICAgICgoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCisJCSAgICAgIHx8IChHcm91cEtleVdlcFN0YXR1cyA9PQorCQkJICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgPyAoREVTQ19UWVBFX0FFUykKKwkJICAgICA6IChERVNDX1RZUEVfVEtJUCkpOworCX0KKworCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gS2V5RGVzY1ZlcjsKKworCS8qIFNwZWNpZnkgS2V5IFR5cGUgYXMgR3JvdXAoMCkgb3IgUGFpcndpc2UoMSkgKi8KKwlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBHUk9VUEtFWTsKKwllbHNlCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7CisKKwkvKiBTcGVjaWZ5IEtleSBJbmRleCwgb25seSBncm91cF9tc2cxX1dQQTEgKi8KKwlpZiAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUluZGV4ID0gRGVmYXVsdEtleUlkeDsKKworCWlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5JbnN0YWxsID0gMTsKKworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQorCSAgICB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCisJCXBNc2ctPktleURlc2MuS2V5SW5mby5LZXlBY2sgPSAxOworCisJaWYgKE1zZ1R5cGUgIT0gRUFQT0xfUEFJUl9NU0dfMSkKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleU1pYyA9IDE7CisKKwlpZiAoKGJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX1BBSVJfTVNHXzMpKSB8fAorCSAgICAoIWJXUEEyICYmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKSkpIHsKKwkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7CisJfQorCisJaWYgKGJXUEEyICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fAorCQkgICAgICAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSB7CisJCXBNc2ctPktleURlc2MuS2V5SW5mby5FS0RfREwgPSAxOworCX0KKwkvKiBrZXkgSW5mb3JtYXRpb24gZWxlbWVudCBoYXMgZG9uZS4gKi8KKwkqKHUxNiAqKSAoJnBNc2ctPktleURlc2MuS2V5SW5mbykgPQorCSAgICBjcHUybGUxNigqKHUxNiAqKSAoJnBNc2ctPktleURlc2MuS2V5SW5mbykpOworCisJLyogRmlsbCBpbiBLZXkgTGVuZ3RoICovCisJeworCQlpZiAoTXNnVHlwZSA+PSBFQVBPTF9HUk9VUF9NU0dfMSkgeworCQkJLyogdGhlIGxlbmd0aCBvZiBncm91cCBrZXkgY2lwaGVyICovCisJCQlwTXNnLT5LZXlEZXNjLktleUxlbmd0aFsxXSA9CisJCQkgICAgKChHcm91cEtleVdlcFN0YXR1cyA9PQorCQkJICAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgPyBUS0lQX0dUS19MRU5HVEggOgorCQkJICAgICBMRU5fQUVTX0tFWSk7CisJCX0gZWxzZSB7CisJCQkvKiB0aGUgbGVuZ3RoIG9mIHBhaXJ3aXNlIGtleSBjaXBoZXIgKi8KKwkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0KKwkJCSAgICAoKHBFbnRyeS0+V2VwU3RhdHVzID09CisJCQkgICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSA/IExFTl9US0lQX0tFWSA6CisJCQkgICAgIExFTl9BRVNfS0VZKTsKKwkJfQorCX0KKworCS8qIEZpbGwgaW4gcmVwbGF5IGNvdW50ZXIgKi8KKwlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBFbnRyeS0+Ul9Db3VudGVyLAorCQkgICAgICAgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisKKwkvKiBGaWxsIEtleSBOb25jZSBmaWVsZCAqLworCS8qIEFOb25jZSA6IHBhaXJ3aXNlX21zZzEgJiBwYWlyd2lzZV9tc2czICovCisJLyogU05vbmNlIDogcGFpcndpc2VfbXNnMiAqLworCS8qIEdOb25jZSA6IGdyb3VwX21zZzFfd3BhMSAqLworCWlmICgoTXNnVHlwZSA8PSBFQVBPTF9QQUlSX01TR18zKQorCSAgICB8fCAoKCFiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKSkKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlOb25jZSwgS2V5Tm9uY2UsCisJCQkgICAgICAgTEVOX0tFWV9ERVNDX05PTkNFKTsKKworCS8qIEZpbGwga2V5IElWIC0gV1BBMiBhcyAwLCBXUEExIGFzIHJhbmRvbSAqLworCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSB7CisJCS8qIFN1Z2dlc3QgSVYgYmUgcmFuZG9tIG51bWJlciBwbHVzIHNvbWUgbnVtYmVyLCAqLworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleUl2LCAmS2V5Tm9uY2VbMTZdLAorCQkJICAgICAgIExFTl9LRVlfREVTQ19JVik7CisJCXBNc2ctPktleURlc2MuS2V5SXZbMTVdICs9IDI7CisJfQorCS8qIEZpbGwgS2V5IFJTQyBmaWVsZCAqLworCS8qIEl0IGNvbnRhaW5zIHRoZSBSU0MgZm9yIHRoZSBHVEsgYmVpbmcgaW5zdGFsbGVkLiAqLworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKQorCSAgICB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpIHsKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlSc2MsIFR4UlNDLCA2KTsKKwl9CisJLyogQ2xlYXIgS2V5IE1JQyBmaWVsZCBmb3IgTUlDIGNhbGN1bGF0aW9uIGxhdGVyICovCisJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOworCisJQ29uc3RydWN0RWFwb2xLZXlEYXRhKHBFbnRyeSwKKwkJCSAgICAgIEdyb3VwS2V5V2VwU3RhdHVzLAorCQkJICAgICAgS2V5RGVzY1ZlciwKKwkJCSAgICAgIE1zZ1R5cGUsCisJCQkgICAgICBEZWZhdWx0S2V5SWR4LCBHVEssIFJTTklFLCBSU05JRV9MZW4sIHBNc2cpOworCisJLyogQ2FsY3VsYXRlIE1JQyBhbmQgZmlsbCBpbiBLZXlNaWMgRmllbGQgZXhjZXB0IFBhaXJ3aXNlIE1zZyAxLiAqLworCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpIHsKKwkJQ2FsY3VsYXRlTUlDKEtleURlc2NWZXIsIHBFbnRyeS0+UFRLLCBwTXNnKTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT09PiBDb25zdHJ1Y3RFYXBvbE1zZyBmb3IgJXMgJXNcbiIsCisJCSAgKChiV1BBMikgPyAiV1BBMiIgOiAiV1BBIiksIEdldEVhcG9sTXNnVHlwZShNc2dUeXBlKSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIJICAgICBCb2R5IGxlbmd0aCA9ICVkIFxuIiwKKwkJICBDT05WX0FSUkFSWV9UT191MTYocE1zZy0+Qm9keV9MZW4pKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIgkgICAgIEtleSBsZW5ndGggID0gJWQgXG4iLAorCQkgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5LZXlEZXNjLktleUxlbmd0aCkpKTsKKworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJQ29uc3RydWN0IHRoZSBLZXkgRGF0YSBmaWVsZCBvZiBFQVBvTCBtZXNzYWdlCisKKwlBcmd1bWVudHM6CisJCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKKwkJRWxlbQkJTWVzc2FnZSBib2R5CisKKwlSZXR1cm4gVmFsdWU6CisJCU5vbmUKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIENvbnN0cnVjdEVhcG9sS2V5RGF0YShzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICB1OCBHcm91cEtleVdlcFN0YXR1cywKKwkJCSAgIHU4IGtleURlc2NWZXIsCisJCQkgICB1OCBNc2dUeXBlLAorCQkJICAgdTggRGVmYXVsdEtleUlkeCwKKwkJCSAgIHU4ICogR1RLLAorCQkJICAgdTggKiBSU05JRSwKKwkJCSAgIHU4IFJTTklFX0xFTiwgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cpCit7CisJdTggKm1wb29sLCAqS2V5X0RhdGEsICpSYzRHVEs7CisJdTggZWtleVsoTEVOX0tFWV9ERVNDX0lWICsgTEVOX0VBUF9FSyldOworCXVuc2lnbmVkIGxvbmcgZGF0YV9vZmZzZXQ7CisJQk9PTEVBTiBiV1BBMkNhcGFibGUgPSBGQUxTRTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBwRW50cnktPnBBZDsKKwlCT09MRUFOIEdUS19JbmNsdWRlZCA9IEZBTFNFOworCisJLyogQ2hvb3NlIFdQQTIgb3Igbm90ICovCisJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJICAgIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQliV1BBMkNhcGFibGUgPSBUUlVFOworCisJaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fAorCSAgICBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwgTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikKKwkJcmV0dXJuOworCisJLyogYWxsb2NhdGUgbWVtb3J5IHBvb2wgKi8KKwlvc19hbGxvY19tZW0oTlVMTCwgKHU4ICoqKSAmIG1wb29sLCAxNTAwKTsKKworCWlmIChtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBSYzRHVEsgTGVuID0gNTEyICovCisJUmM0R1RLID0gKHU4ICopIFJPVU5EX1VQKG1wb29sLCA0KTsKKwkvKiBLZXlfRGF0YSBMZW4gPSA1MTIgKi8KKwlLZXlfRGF0YSA9ICh1OCAqKSBST1VORF9VUChSYzRHVEsgKyA1MTIsIDQpOworCisJTmRpc1plcm9NZW1vcnkoS2V5X0RhdGEsIDUxMik7CisJU0VUX3UxNl9UT19BUlJBUlkocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuLCAwKTsKKwlkYXRhX29mZnNldCA9IDA7CisKKwkvKiBFbmNhcHN1bGF0ZSBSU05JRSBpbiBwYWlyd2lzZV9tc2cyICYgcGFpcndpc2VfbXNnMyAqLworCWlmIChSU05JRV9MRU4KKwkgICAgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIpCisJCXx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpKSkgeworCQl1OCAqcG1raWRfcHRyID0gTlVMTDsKKwkJdTggcG1raWRfbGVuID0gMDsKKworCQlSVE1QSW5zZXJ0UlNOSUUoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwKKwkJCQkmZGF0YV9vZmZzZXQsCisJCQkJUlNOSUUsIFJTTklFX0xFTiwgcG1raWRfcHRyLCBwbWtpZF9sZW4pOworCX0KKworCS8qIEVuY2Fwc3VsYXRlIEtERSBmb3JtYXQgaW4gcGFpcndpc2VfbXNnM19XUEEyICYgZ3JvdXBfbXNnMV9XUEEyICovCisJaWYgKGJXUEEyQ2FwYWJsZQorCSAgICAmJiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKKwkJfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkgeworCQkvKiBLZXkgRGF0YSBFbmNhcHN1bGF0aW9uIChLREUpIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzdyBhbmQgVGFibGUtMjBoICovCisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOworCisJCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgxNjsJLyogNCsyKzE2KE9VSStEYXRhVHlwZStEYXRhRmllbGQpICovCisJCX0gZWxzZSB7CisJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgyNjsJLyogNCsyKzMyKE9VSStEYXRhVHlwZStEYXRhRmllbGQpICovCisJCX0KKworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDJdID0gMHgwMDsKKwkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAzXSA9IDB4MEY7CisJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgNF0gPSAweEFDOworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDVdID0gMHgwMTsKKworCQkvKiBHVEsgS0RFIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzeCAqLworCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDZdID0gKERlZmF1bHRLZXlJZHggJiAweDAzKTsKKwkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA3XSA9IDB4MDA7CS8qIFJlc2VydmVkIEJ5dGUgKi8KKworCQlkYXRhX29mZnNldCArPSA4OworCX0KKworCS8qIEVuY2Fwc3VsYXRlIEdUSyAqLworCS8qIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMSAqLworCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkKKwkgICAgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSB7CisJCS8qIEZpbGwgaW4gR1RLICovCisJCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB7CisJCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssCisJCQkJICAgICAgIExFTl9BRVNfS0VZKTsKKwkJCWRhdGFfb2Zmc2V0ICs9IExFTl9BRVNfS0VZOworCQl9IGVsc2UgeworCQkJTmRpc01vdmVNZW1vcnkoJktleV9EYXRhW2RhdGFfb2Zmc2V0XSwgR1RLLAorCQkJCSAgICAgICBUS0lQX0dUS19MRU5HVEgpOworCQkJZGF0YV9vZmZzZXQgKz0gVEtJUF9HVEtfTEVOR1RIOworCQl9CisKKwkJR1RLX0luY2x1ZGVkID0gVFJVRTsKKwl9CisKKwkvKiBUaGlzIHdob2xlIGtleS1kYXRhIGZpZWxkIHNoYWxsIGJlIGVuY3J5cHRlZCBpZiBhIEdUSyBpcyBpbmNsdWRlZC4gKi8KKwkvKiBFbmNyeXB0IHRoZSBkYXRhIG1hdGVyaWFsIGluIGtleSBkYXRhIGZpZWxkIHdpdGggS0VLICovCisJaWYgKEdUS19JbmNsdWRlZCkgeworCQkvKmhleF9kdW1wKCJHVEtfSW5jbHVkZWQiLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOyAqLworCisJCWlmICgoa2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKSkgeworCQkJdTggcmVtYWluZGVyID0gMDsKKwkJCXU4IHBhZF9sZW4gPSAwOworCisJCQkvKiBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIDIgb3IgMzogQUVTIGtleSB3cmFwLCBkZWZpbmVkIGluIElFVEYgUkZDIDMzOTQsICovCisJCQkvKiBzaGFsbCBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIEtleSBEYXRhIGZpZWxkIHVzaW5nIHRoZSBLRUsgZmllbGQgZnJvbSAqLworCQkJLyogdGhlIGRlcml2ZWQgUFRLLiAqLworCisJCQkvKiBJZiB0aGUgS2V5IERhdGEgZmllbGQgdXNlcyB0aGUgTklTVCBBRVMga2V5IHdyYXAsIHRoZW4gdGhlIEtleSBEYXRhIGZpZWxkICovCisJCQkvKiBzaGFsbCBiZSBwYWRkZWQgYmVmb3JlIGVuY3J5cHRpbmcgaWYgdGhlIGtleSBkYXRhIGxlbmd0aCBpcyBsZXNzIHRoYW4gMTYgKi8KKwkJCS8qIG9jdGV0cyBvciBpZiBpdCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiBUaGUgcGFkZGluZyBjb25zaXN0cyBvZiBhcHBlbmRpbmcgKi8KKwkJCS8qIGEgc2luZ2xlIG9jdGV0IDB4ZGQgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIDB4MDAgb2N0ZXRzLiAqLworCQkJaWYgKChyZW1haW5kZXIgPSBkYXRhX29mZnNldCAmIDB4MDcpICE9IDApIHsKKwkJCQlpbnQgaTsKKworCQkJCXBhZF9sZW4gPSAoOCAtIHJlbWFpbmRlcik7CisJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXRdID0gMHhERDsKKwkJCQlmb3IgKGkgPSAxOyBpIDwgcGFkX2xlbjsgaSsrKQorCQkJCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIGldID0gMDsKKworCQkJCWRhdGFfb2Zmc2V0ICs9IHBhZF9sZW47CisJCQl9CisKKwkJCUFFU19HVEtfS0VZX1dSQVAoJnBFbnRyeS0+UFRLWzE2XSwgS2V5X0RhdGEsCisJCQkJCSBkYXRhX29mZnNldCwgUmM0R1RLKTsKKwkJCS8qIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aCAqLworCQkJZGF0YV9vZmZzZXQgKz0gODsKKwkJfSBlbHNlIHsKKwkJCS8qICAgICAgS2V5IERlc2NyaXB0b3IgVmVyc2lvbiAxOiBBUkM0IGlzIHVzZWQgdG8gZW5jcnlwdCB0aGUgS2V5IERhdGEgZmllbGQKKwkJCSAgIHVzaW5nIHRoZSBLRUsgZmllbGQgZnJvbSB0aGUgZGVyaXZlZCBQVEsuICovCisKKwkJCS8qIFBSRVBBUkUgRW5jcnlwdGVkICAiS2V5IERBVEEiIGZpZWxkLiAgKEVuY3J5cHQgR1RLIHdpdGggUkM0LCB1c2luZiBQVEtbMTZdLT5bMzFdIGFzIEtleSwgSVYtZmllbGQgYXMgSVYpICovCisJCQkvKiBwdXQgVHhUc2MgaW4gS2V5IFJTQyBmaWVsZCAqLworCQkJcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFBQUElOSVRGQ1MzMjsJLypJbml0IGNyYzMyLiAqLworCisJCQkvKiBla2V5IGlzIHRoZSBjb250YW5ldGlvbiBvZiBJVi1maWVsZCwgYW5kIFBUS1sxNl0tPlBUS1szMV0gKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KGVrZXksIHBNc2ctPktleURlc2MuS2V5SXYsCisJCQkJICAgICAgIExFTl9LRVlfREVTQ19JVik7CisJCQlOZGlzTW92ZU1lbW9yeSgmZWtleVtMRU5fS0VZX0RFU0NfSVZdLCAmcEVudHJ5LT5QVEtbMTZdLAorCQkJCSAgICAgICBMRU5fRUFQX0VLKTsKKwkJCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBla2V5LCBzaXplb2YoZWtleSkpOwkvKklOSVQgU0JPWCwgS0VZTEVOKzMoSVYpICovCisJCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0KKwkJCSAgICBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgS2V5X0RhdGEsCisJCQkJCSAgICBkYXRhX29mZnNldCk7CisJCQlXUEFBUkNGT1VSX0VOQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgUmM0R1RLLAorCQkJCQkgICBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOworCQl9CisKKwkJTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlEYXRhLCBSYzRHVEssIGRhdGFfb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7CisJfQorCisJLyogVXBkYXRlIGtleSBkYXRhIGxlbmd0aCBmaWVsZCBhbmQgdG90YWwgYm9keSBsZW5ndGggKi8KKwlTRVRfdTE2X1RPX0FSUkFSWShwTXNnLT5LZXlEZXNjLktleURhdGFMZW4sIGRhdGFfb2Zmc2V0KTsKKwlJTkNfdTE2X1RPX0FSUkFSWShwTXNnLT5Cb2R5X0xlbiwgZGF0YV9vZmZzZXQpOworCisJb3NfZnJlZV9tZW0oTlVMTCwgbXBvb2wpOworCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJUGVlcldlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCBDYWxjdWxhdGVNSUModTggS2V5RGVzY1ZlciwKKwkJCSB1OCAqIFBUSywgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cpCit7CisJdTggKk91dEJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1OCBtaWNbTEVOX0tFWV9ERVNDX01JQ107CisJdTggZGlnZXN0WzgwXTsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgTUlDIGNhbGN1bGF0aW9uICovCisJb3NfYWxsb2NfbWVtKE5VTEwsICh1OCAqKikgJiBPdXRCdWZmZXIsIDUxMik7CisKKwlpZiAoT3V0QnVmZmVyID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ2FsY3VsYXRlTUlDOiBubyBtZW1vcnkhXG4iKSk7CisJCXJldHVybjsKKwl9CisJLyogbWFrZSBhIGZyYW1lIGZvciBjYWxjdWxhdGluZyBNSUMuICovCisJTWFrZU91dGdvaW5nRnJhbWUoT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihwTXNnLT5Cb2R5X0xlbikgKyA0LCBwTXNnLAorCQkJICBFTkRfT0ZfQVJHUyk7CisKKwlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKKworCS8qIENhbGN1bGF0ZSBNSUMgKi8KKwlpZiAoS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfQUVTKSB7CisJCUhNQUNfU0hBMShQVEssIExFTl9FQVBfTUlDSywgT3V0QnVmZmVyLCBGcmFtZUxlbiwgZGlnZXN0LAorCQkJICBTSEExX0RJR0VTVF9TSVpFKTsKKwkJTmRpc01vdmVNZW1vcnkobWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOworCX0gZWxzZSB7CisJCUhNQUNfTUQ1KFBUSywgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsIEZyYW1lTGVuLCBtaWMsCisJCQkgTUQ1X0RJR0VTVF9TSVpFKTsKKwl9CisKKwkvKiBzdG9yZSB0aGUgY2FsY3VsYXRlZCBNSUMgKi8KKwlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleU1pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKKworCW9zX2ZyZWVfbWVtKE5VTEwsIE91dEJ1ZmZlcik7Cit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lIERlc2NyaXB0aW9uOgorCQlTb21lIHJlY2VpdmVkIGZyYW1lcyBjYW4ndCBkZWNyeXB0IGJ5IEFzaWMsIHNvIGRlY3J5cHQgdGhlbSBieSBzb2Z0d2FyZS4KKworCUFyZ3VtZW50czoKKwkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0CisJUGVlcldlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUwkJLQlkZWNyeXB0aW9uIHN1Y2Nlc3NmdWwKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJLQlkZWNyeXB0aW9uIGZhaWx1cmUKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVE1QU29mdERlY3J5cHRCcm9hZENhc3REYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywKKwkJCQkJIElOIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCisJCQkJCSBHcm91cENpcGhlciwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBTaGFyZF9rZXkpCit7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisKKwkvKiBoYW5kbGUgV0VQIGRlY3J5cHRpb24gKi8KKwlpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgeworCQlpZiAoUlRNUFNvZnREZWNyeXB0V0VQCisJCSAgICAocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LAorCQkgICAgIHBTaGFyZF9rZXkpKSB7CisKKwkJCS8qTWludXMgSVZbNF0gJiBJQ1ZbNF0gKi8KKwkJCXBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLT0gODsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkVSUk9SIDogU29mdHdhcmUgZGVjcnlwdCBXRVAgZGF0YSBmYWlscy5cbiIpKTsKKwkJCS8qIGdpdmUgdXAgdGhpcyBmcmFtZSAqLworCQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJCX0KKwl9CisJLyogaGFuZGxlIFRLSVAgZGVjcnlwdGlvbiAqLworCWVsc2UgaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHsKKwkJaWYgKFJUTVBTb2Z0RGVjcnlwdFRLSVAKKwkJICAgIChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIDAsCisJCSAgICAgcFNoYXJkX2tleSkpIHsKKworCQkJLypNaW51cyA4IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYsIDQgYnl0ZXMgSUNWICovCisJCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDIwOworCQl9IGVsc2UgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRUS0lQIEZhaWxlZFxuIikpOworCQkJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwkvKiBoYW5kbGUgQUVTIGRlY3J5cHRpb24gKi8KKwllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB7CisJCWlmIChSVE1QU29mdERlY3J5cHRBRVMKKwkJICAgIChwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCisJCSAgICAgcFNoYXJkX2tleSkpIHsKKworCQkJLyo4IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYgKENDTVAgSGVhZGVyKSAqLworCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSAxNjsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkVSUk9SIDogUlRNUFNvZnREZWNyeXB0QUVTIEZhaWxlZFxuIikpOworCQkJLyogZ2l2ZSB1cCB0aGlzIGZyYW1lICovCisJCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGdpdmUgdXAgdGhpcyBmcmFtZSAqLworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKworfQorCit1OCAqR2V0U3VpdGVGcm9tUlNOSUUodTggKnJzbmllLAorCQkJIHUzMiByc25pZV9sZW4sIHU4IHR5cGUsIHU4ICogY291bnQpCit7CisJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CisJaW50IGxlbjsKKwl1OCAqcEJ1ZjsKKwlpbnQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgcnRfcnNuaWVfYXV0aCAqcEFrbTsKKwl1MTYgYWNvdW50OworCUJPT0xFQU4gaXNXUEEyID0gRkFMU0U7CisKKwlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgcnNuaWU7CisJbGVuID0gcnNuaWVfbGVuIC0gMjsJLyogZXhjbHVkZSBJRSBhbmQgbGVuZ3RoICovCisJcEJ1ZiA9ICh1OCAqKSYgcEVpZC0+T2N0ZXRbMF07CisKKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZSAqLworCSpjb3VudCA9IDA7CisKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlpZiAoKGxlbiA8PSAwKSB8fCAocEVpZC0+TGVuICE9IGxlbikpIHsKKwkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBDaGVjayBXUEEgb3IgV1BBMiAqLworCWlmIChwRWlkLT5FaWQgPT0gSUVfV1BBKSB7CisJCXN0cnVjdCBydF9yc25pZSAqcFJzbmllID0gKHN0cnVjdCBydF9yc25pZSAqKXBCdWY7CisJCXUxNiB1Y291bnQ7CisKKwkJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWUpKSB7CisJCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEFcbiIsCisJCQkJICAgICAgX19mdW5jX18pKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIEdldCB0aGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyICovCisJCXVjb3VudCA9IGNwdTJsZTE2KHBSc25pZS0+dWNvdW50KTsKKwkJaWYgKHVjb3VudCA+IDIpIHsKKwkJCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBwYWlyd2lzZSBjaXBoZXIgaXMgaW52bGFpZFxuIiwgX19mdW5jX18sIHVjb3VudCkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogR2V0IHRoZSBncm91cCBjaXBoZXIgKi8KKwkJaWYgKHR5cGUgPT0gR1JPVVBfU1VJVEUpIHsKKwkJCSpjb3VudCA9IDE7CisJCQlyZXR1cm4gcFJzbmllLT5tY2FzdDsKKwkJfQorCQkvKiBHZXQgdGhlIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZSAqLworCQllbHNlIGlmICh0eXBlID09IFBBSVJXSVNFX1NVSVRFKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlcyA6IFRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIgaXMgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgdWNvdW50KSk7CisJCQkqY291bnQgPSB1Y291bnQ7CisJCQlyZXR1cm4gcFJzbmllLT51Y2FzdFswXS5vdWk7CisJCX0KKworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ0X3JzbmllKSArICg0ICogKHVjb3VudCAtIDEpKTsKKworCX0gZWxzZSBpZiAocEVpZC0+RWlkID09IElFX1JTTikgeworCQlzdHJ1Y3QgcnRfcnNuaWUyICpwUnNuaWUgPSAoc3RydWN0IHJ0X3JzbmllMiAqKXBCdWY7CisJCXUxNiB1Y291bnQ7CisKKwkJaXNXUEEyID0gVFJVRTsKKworCQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZTIpKSB7CisJCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEEyXG4iLAorCQkJCSAgICAgIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLworCQl1Y291bnQgPSBjcHUybGUxNihwUnNuaWUtPnVjb3VudCk7CisJCWlmICh1Y291bnQgPiAyKSB7CisJCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBjb3VudCglZCkgb2YgcGFpcndpc2UgY2lwaGVyIGlzIGludmxhaWRcbiIsIF9fZnVuY19fLCB1Y291bnQpKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIEdldCB0aGUgZ3JvdXAgY2lwaGVyICovCisJCWlmICh0eXBlID09IEdST1VQX1NVSVRFKSB7CisJCQkqY291bnQgPSAxOworCQkJcmV0dXJuIHBSc25pZS0+bWNhc3Q7CisJCX0KKwkJLyogR2V0IHRoZSBwYWlyd2lzZSBjaXBoZXIgc3VpdGUgKi8KKwkJZWxzZSBpZiAodHlwZSA9PSBQQUlSV0lTRV9TVUlURSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiJXMgOiBUaGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyIGlzICVkXG4iLAorCQkJCSAgX19mdW5jX18sIHVjb3VudCkpOworCQkJKmNvdW50ID0gdWNvdW50OworCQkJcmV0dXJuIHBSc25pZS0+dWNhc3RbMF0ub3VpOworCQl9CisKKwkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBydF9yc25pZTIpICsgKDQgKiAodWNvdW50IC0gMSkpOworCisJfSBlbHNlIHsKKwkJREJHUFJJTlRfRVJSKCgiJXMgOiBVbmtub3duIElFICglZClcbiIsIF9fZnVuY19fLCBwRWlkLT5FaWQpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogc2tpcCBncm91cCBjaXBoZXIgYW5kIHBhaXJ3aXNlIGNpcGhlciBzdWl0ZSAqLworCXBCdWYgKz0gb2Zmc2V0OworCWxlbiAtPSBvZmZzZXQ7CisKKwlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBydF9yc25pZV9hdXRoKSkgeworCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggb2YgUlNOSUUgaXMgdG9vIHNob3J0XG4iLAorCQkJICAgICAgX19mdW5jX18pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIHBvaW50ZXIgdG8gQUtNIGNvdW50ICovCisJcEFrbSA9IChzdHJ1Y3QgcnRfcnNuaWVfYXV0aCAqKXBCdWY7CisKKwkvKiBHZXQgdGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciAqLworCWFjb3VudCA9IGNwdTJsZTE2KHBBa20tPmFjb3VudCk7CisJaWYgKGFjb3VudCA+IDIpIHsKKwkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIEFLTSBpcyBpbnZsYWlkXG4iLAorCQkJICAgICAgX19mdW5jX18sIGFjb3VudCkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogR2V0IHRoZSBBS00gc3VpdGUgKi8KKwlpZiAodHlwZSA9PSBBS01fU1VJVEUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiBUaGUgY291bnQgb2YgQUtNIGlzICVkXG4iLAorCQkJCQkgIF9fZnVuY19fLCBhY291bnQpKTsKKwkJKmNvdW50ID0gYWNvdW50OworCQlyZXR1cm4gcEFrbS0+YXV0aFswXS5vdWk7CisJfQorCW9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnRfcnNuaWVfYXV0aCkgKyAoNCAqIChhY291bnQgLSAxKSk7CisKKwlwQnVmICs9IG9mZnNldDsKKwlsZW4gLT0gb2Zmc2V0OworCisJLyogVGhlIHJlbWFpbmluZyBsZW5ndGggbXVzdCBsYXJnZXIgdGhhbiAoUlNOLUNhcGFiaWxpdHkoMikgKyBQTUtJRC1Db3VudCgyKSArIFBNS0lEKDE2fikpICovCisJaWYgKGxlbiA+PSAoc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpICsgMiArIExFTl9QTUtJRCkpIHsKKwkJLyogU2tpcCBSU04gY2FwYWJpbGl0eSBhbmQgUE1LSUQtQ291bnQgKi8KKwkJcEJ1ZiArPSAoc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpICsgMik7CisJCWxlbiAtPSAoc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpICsgMik7CisKKwkJLyogR2V0IFBNS0lEICovCisJCWlmICh0eXBlID09IFBNS0lEX0xJU1QpIHsKKwkJCSpjb3VudCA9IDE7CisJCQlyZXR1cm4gcEJ1ZjsKKwkJfQorCX0gZWxzZSB7CisJCURCR1BSSU5UX0VSUigoIiVzIDogaXQgY2FuJ3QgZ2V0IGFueSBtb3JlIGluZm9ybWF0aW9uIGJleW9uZCBBS00gXG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqY291bnQgPSAwOworCS8qREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgdHlwZSglZCkgZG9lc24ndCBzdXBwb3J0IFxuIiwgX19mdW5jX18sIHR5cGUpKTsgKi8KKwlyZXR1cm4gTlVMTDsKKworfQorCit2b2lkIFdwYVNob3dBbGxzdWl0ZSh1OCAqcnNuaWUsIHUzMiByc25pZV9sZW4pCit7CisJdTggKnBTdWl0ZSA9IE5VTEw7CisJdTggY291bnQ7CisKKwloZXhfZHVtcCgiUlNOSUUiLCByc25pZSwgcnNuaWVfbGVuKTsKKworCS8qIGdyb3VwIGNpcGhlciAqLworCWlmICgocFN1aXRlID0KKwkgICAgIEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIEdST1VQX1NVSVRFLAorCQkJICAgICAgICZjb3VudCkpICE9IE5VTEwpIHsKKwkJaGV4X2R1bXAoImdyb3VwIGNpcGhlciIsIHBTdWl0ZSwgNCAqIGNvdW50KTsKKwl9CisJLyogcGFpcndpc2UgY2lwaGVyICovCisJaWYgKChwU3VpdGUgPQorCSAgICAgR2V0U3VpdGVGcm9tUlNOSUUocnNuaWUsIHJzbmllX2xlbiwgUEFJUldJU0VfU1VJVEUsCisJCQkgICAgICAgJmNvdW50KSkgIT0gTlVMTCkgeworCQloZXhfZHVtcCgicGFpcndpc2UgY2lwaGVyIiwgcFN1aXRlLCA0ICogY291bnQpOworCX0KKwkvKiBBS00gKi8KKwlpZiAoKHBTdWl0ZSA9CisJICAgICBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBBS01fU1VJVEUsICZjb3VudCkpICE9IE5VTEwpIHsKKwkJaGV4X2R1bXAoIkFLTSBzdWl0ZSIsIHBTdWl0ZSwgNCAqIGNvdW50KTsKKwl9CisJLyogUE1LSUQgKi8KKwlpZiAoKHBTdWl0ZSA9CisJICAgICBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBQTUtJRF9MSVNULCAmY291bnQpKSAhPSBOVUxMKSB7CisJCWhleF9kdW1wKCJQTUtJRCIsIHBTdWl0ZSwgTEVOX1BNS0lEKTsKKwl9CisKK30KKwordm9pZCBSVE1QSW5zZXJ0UlNOSUUodTggKnBGcmFtZUJ1ZiwKKwkJICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCSAgICAgdTggKnJzbmllX3B0ciwKKwkJICAgICB1OCByc25pZV9sZW4sCisJCSAgICAgdTggKnBta2lkX3B0ciwgdTggcG1raWRfbGVuKQoreworCXU4ICpwVG1wQnVmOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbiA9IDA7CisJdTggZXh0cmFfbGVuID0gMDsKKwl1MTYgcG1rX2NvdW50ID0gMDsKKwl1OCBpZV9udW07CisJdTggdG90YWxfbGVuID0gMDsKKwl1OCBXUEEyX09VSVszXSA9IHsgMHgwMCwgMHgwRiwgMHhBQyB9OworCisJcFRtcEJ1ZiA9IHBGcmFtZUJ1ZjsKKworCS8qIFBNS0lELUxpc3QgTXVzdCBsYXJnZXIgdGhhbiAwIGFuZCB0aGUgbXVsdGlwbGUgb2YgMTYuICovCisJaWYgKHBta2lkX2xlbiA+IDAgJiYgKChwbWtpZF9sZW4gJiAweDBmKSA9PSAwKSkgeworCQlleHRyYV9sZW4gPSBzaXplb2YodTE2KSsgcG1raWRfbGVuOworCisJCXBta19jb3VudCA9IChwbWtpZF9sZW4gPj4gNCk7CisJCXBta19jb3VudCA9IGNwdTJsZTE2KHBta19jb3VudCk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCSAoIiVzIDogVGhlIGxlbmd0aCBpcyBQTUtJRC1MaXN0IGlzIGludmFsaWQgKCVkKSwgc28gZG9uJ3QgaW5zZXJ0IGl0LlxuIiwKKwkJCSAgX19mdW5jX18sIHBta2lkX2xlbikpOworCX0KKworCWlmIChyc25pZV9sZW4gIT0gMCkgeworCQlpZV9udW0gPSBJRV9XUEE7CisJCXRvdGFsX2xlbiA9IHJzbmllX2xlbjsKKworCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHJzbmllX3B0ciArIDIsIFdQQTJfT1VJLCBzaXplb2YoV1BBMl9PVUkpKSkgeworCQkJaWVfbnVtID0gSUVfUlNOOworCQkJdG90YWxfbGVuICs9IGV4dHJhX2xlbjsKKwkJfQorCisJCS8qIGNvbnN0cnVjdCBSU05JRSBib2R5ICovCisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBUbXBCdWYsICZUZW1wTGVuLAorCQkJCSAgMSwgJmllX251bSwKKwkJCQkgIDEsICZ0b3RhbF9sZW4sCisJCQkJICByc25pZV9sZW4sIHJzbmllX3B0ciwgRU5EX09GX0FSR1MpOworCisJCXBUbXBCdWYgKz0gVGVtcExlbjsKKwkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOworCisJCWlmIChpZV9udW0gPT0gSUVfUlNOKSB7CisJCQkvKiBJbnNlcnQgUE1LSUQtTGlzdCBmaWVsZCAqLworCQkJaWYgKGV4dHJhX2xlbiA+IDApIHsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwVG1wQnVmLCAmVGVtcExlbiwKKwkJCQkJCSAgMiwgJnBta19jb3VudCwKKwkJCQkJCSAgcG1raWRfbGVuLCBwbWtpZF9wdHIsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKworCQkJCXBUbXBCdWYgKz0gVGVtcExlbjsKKwkJCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9obWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9obWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhYjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X2htYWMuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vY3J5cHRfaG1hYy5oIgorCisjaWZkZWYgSE1BQ19TSEExX1NVUFBPUlQKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSE1BQyB1c2luZyBTSEExIGhhc2ggZnVuY3Rpb24KKworQXJndW1lbnRzOgorICAgIGtleSAgICAgICAgICAgICBTZWNyZXQga2V5CisgICAga2V5X2xlbiAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGtleSBpbiBieXRlcworICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKKyAgICBtZXNzYWdlX2xlbiAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCisgICAgbWFjTGVuICAgICAgICAgIFJlcXVlc3QgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKworUmV0dXJuIFZhbHVlOgorICAgIG1hYyAgICAgICAgICAgICBNZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIEhNQUNfU0hBMShJTiBjb25zdCB1OCBLZXlbXSwKKwkgICAgICAgdTMyIEtleUxlbiwKKwkgICAgICAgSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICAgICB1MzIgTWVzc2FnZUxlbiwgdTggTUFDW10sIHUzMiBNQUNMZW4pCit7CisJc3RydWN0IHJ0X3NoYTFfY3R4IHNoYV9jdHgxOworCXN0cnVjdCBydF9zaGExX2N0eCBzaGFfY3R4MjsKKwl1OCBLMFtTSEExX0JMT0NLX1NJWkVdOworCXU4IERpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKKwl1MzIgaW5kZXg7CisKKwlOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDEsIHNpemVvZihzdHJ1Y3QgcnRfc2hhMV9jdHgpKTsKKwlOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDIsIHNpemVvZihzdHJ1Y3QgcnRfc2hhMV9jdHgpKTsKKwkvKgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA9IEIoQmxvY2sgc2l6ZSk6IEswID0gSy4KKwkgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPiBCOiBoYXNoIEsgdG8gb2J0YWluIGFuIEwgYnl0ZSBzdHJpbmcsCisJICogdGhlbiBhcHBlbmQgKEItTCkgemVyb3MgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMCAoaS5lLiwgSzAgPSBIKEspIHx8IDAwLi4uMDApLgorCSAqIElmIHRoZSBsZW5ndGggb2YgSyA8IEI6IGFwcGVuZCB6ZXJvcyB0byB0aGUgZW5kIG9mIEsgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMAorCSAqLworCU5kaXNaZXJvTWVtb3J5KEswLCBTSEExX0JMT0NLX1NJWkUpOworCWlmIChLZXlMZW4gPD0gU0hBMV9CTE9DS19TSVpFKQorCQlOZGlzTW92ZU1lbW9yeShLMCwgS2V5LCBLZXlMZW4pOworCWVsc2UKKwkJUlRfU0hBMShLZXksIEtleUxlbiwgSzApOworCS8qIEVuZCBvZiBpZiAqLworCisJLyogRXhjbHVzaXZlLU9yIEswIHdpdGggaXBhZCAqLworCS8qIGlwYWQ6IElubmVyIHBhZDsgdGhlIGJ5dGUgeMKhwqYzNsKhwqYgcmVwZWF0ZWQgQiB0aW1lcy4gKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSEExX0JMT0NLX1NJWkU7IGluZGV4KyspCisJCUswW2luZGV4XSBePSAweDM2OworCS8qIEVuZCBvZiBmb3IgKi8KKworCVJUX1NIQTFfSW5pdCgmc2hhX2N0eDEpOworCS8qIEgoSzBeaXBhZCkgKi8KKwlTSEExX0FwcGVuZCgmc2hhX2N0eDEsIEswLCBzaXplb2YoSzApKTsKKwkvKiBIKChLMF5pcGFkKXx8dGV4dCkgKi8KKwlTSEExX0FwcGVuZCgmc2hhX2N0eDEsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOworCVNIQTFfRW5kKCZzaGFfY3R4MSwgRGlnZXN0KTsKKworCS8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCisJLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB4wqHCpjVjwqHCpiByZXBlYXRlZCBCIHRpbWVzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNIQTFfQkxPQ0tfU0laRTsgaW5kZXgrKykKKwkJSzBbaW5kZXhdIF49IDB4MzYgXiAweDVjOworCS8qIEVuZCBvZiBmb3IgKi8KKworCVJUX1NIQTFfSW5pdCgmc2hhX2N0eDIpOworCS8qIEgoSzBeb3BhZCkgKi8KKwlTSEExX0FwcGVuZCgmc2hhX2N0eDIsIEswLCBzaXplb2YoSzApKTsKKwkvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KKwlTSEExX0FwcGVuZCgmc2hhX2N0eDIsIERpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7CisJU0hBMV9FbmQoJnNoYV9jdHgyLCBEaWdlc3QpOworCisJaWYgKE1BQ0xlbiA+IFNIQTFfRElHRVNUX1NJWkUpCisJCU5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKKwllbHNlCisJCU5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LCBNQUNMZW4pOworfQkJCQkvKiBFbmQgb2YgSE1BQ19TSEExICovCisjZW5kaWYgLyogSE1BQ19TSEExX1NVUFBPUlQgKi8KKworI2lmZGVmIEhNQUNfTUQ1X1NVUFBPUlQKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSE1BQyB1c2luZyBNRDUgaGFzaCBmdW5jdGlvbgorCitBcmd1bWVudHM6CisgICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKKyAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKyAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorCitSZXR1cm4gVmFsdWU6CisgICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgSE1BQ19NRDUoSU4gY29uc3QgdTggS2V5W10sCisJICAgICAgdTMyIEtleUxlbiwKKwkgICAgICBJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICAgdTMyIE1lc3NhZ2VMZW4sIHU4IE1BQ1tdLCB1MzIgTUFDTGVuKQoreworCXN0cnVjdCBydF9tZDVfY3R4X3N0cnVjIG1kNV9jdHgxOworCXN0cnVjdCBydF9tZDVfY3R4X3N0cnVjIG1kNV9jdHgyOworCXU4IEswW01ENV9CTE9DS19TSVpFXTsKKwl1OCBEaWdlc3RbTUQ1X0RJR0VTVF9TSVpFXTsKKwl1MzIgaW5kZXg7CisKKwlOZGlzWmVyb01lbW9yeSgmbWQ1X2N0eDEsIHNpemVvZihzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YykpOworCU5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4Miwgc2l6ZW9mKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjKSk7CisJLyoKKwkgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPSBCKEJsb2NrIHNpemUpOiBLMCA9IEsuCisJICogSWYgdGhlIGxlbmd0aCBvZiBLID4gQjogaGFzaCBLIHRvIG9idGFpbiBhbiBMIGJ5dGUgc3RyaW5nLAorCSAqIHRoZW4gYXBwZW5kIChCLUwpIHplcm9zIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAgKGkuZS4sIEswID0gSChLKSB8fCAwMC4uLjAwKS4KKwkgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPCBCOiBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEItYnl0ZSBzdHJpbmcgSzAKKwkgKi8KKwlOZGlzWmVyb01lbW9yeShLMCwgTUQ1X0JMT0NLX1NJWkUpOworCWlmIChLZXlMZW4gPD0gTUQ1X0JMT0NLX1NJWkUpIHsKKwkJTmRpc01vdmVNZW1vcnkoSzAsIEtleSwgS2V5TGVuKTsKKwl9IGVsc2UgeworCQlSVF9NRDUoS2V5LCBLZXlMZW4sIEswKTsKKwl9CisKKwkvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBpcGFkICovCisJLyogaXBhZDogSW5uZXIgcGFkOyB0aGUgYnl0ZSB4wqHCpjM2wqHCpiByZXBlYXRlZCBCIHRpbWVzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1ENV9CTE9DS19TSVpFOyBpbmRleCsrKQorCQlLMFtpbmRleF0gXj0gMHgzNjsKKwkvKiBFbmQgb2YgZm9yICovCisKKwlNRDVfSW5pdCgmbWQ1X2N0eDEpOworCS8qIEgoSzBeaXBhZCkgKi8KKwlNRDVfQXBwZW5kKCZtZDVfY3R4MSwgSzAsIHNpemVvZihLMCkpOworCS8qIEgoKEswXmlwYWQpfHx0ZXh0KSAqLworCU1ENV9BcHBlbmQoJm1kNV9jdHgxLCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKKwlNRDVfRW5kKCZtZDVfY3R4MSwgRGlnZXN0KTsKKworCS8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCisJLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB4wqHCpjVjwqHCpiByZXBlYXRlZCBCIHRpbWVzLiAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1ENV9CTE9DS19TSVpFOyBpbmRleCsrKQorCQlLMFtpbmRleF0gXj0gMHgzNiBeIDB4NWM7CisJLyogRW5kIG9mIGZvciAqLworCisJTUQ1X0luaXQoJm1kNV9jdHgyKTsKKwkvKiBIKEswXm9wYWQpICovCisJTUQ1X0FwcGVuZCgmbWQ1X2N0eDIsIEswLCBzaXplb2YoSzApKTsKKwkvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KKwlNRDVfQXBwZW5kKCZtZDVfY3R4MiwgRGlnZXN0LCBNRDVfRElHRVNUX1NJWkUpOworCU1ENV9FbmQoJm1kNV9jdHgyLCBEaWdlc3QpOworCisJaWYgKE1BQ0xlbiA+IE1ENV9ESUdFU1RfU0laRSkKKwkJTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsIE1ENV9ESUdFU1RfU0laRSk7CisJZWxzZQorCQlOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUFDTGVuKTsKK30JCQkJLyogRW5kIG9mIEhNQUNfU0hBMjU2ICovCisjZW5kaWYgLyogSE1BQ19NRDVfU1VQUE9SVCAqLworCisvKiBFbmQgb2YgY3J5cHRfaG1hYy5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2NyeXB0X21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZWFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9tZDUuYwpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiLi4vY3J5cHRfbWQ1LmgiCisKKyNpZmRlZiBNRDVfU1VQUE9SVAorLyoKKyAqIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCisjZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQorI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCisjZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKKworI2RlZmluZSBST1RMKHgsbix3KSAoKHggPDwgbikgfCAoeCA+PiAodyAtIG4pKSkKKyNkZWZpbmUgUk9UTDMyKHgsbikgUk9UTCh4LG4sMzIpCS8qIDMyIGJpdHMgd29yZCAqLworCisjZGVmaW5lIFJPVU5EMShhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCisgICAgKGEpICs9IEYoKGIpLChjKSwoZCkpICsgKHgpICsgKHUzMikoYWMpOyBcCisgICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIFJPVU5EMihhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCisgICAgKGEpICs9IEcoKGIpLChjKSwoZCkpICsgKHgpICsgKHUzMikoYWMpOyBcCisgICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIFJPVU5EMyhhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCisgICAgKGEpICs9IEgoKGIpLChjKSwoZCkpICsgKHgpICsgKHUzMikoYWMpOyBcCisgICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIFJPVU5ENChhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCisgICAgKGEpICs9IEkoKGIpLChjKSwoZCkpICsgKHgpICsgKHUzMikoYWMpOyBcCisgICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitzdGF0aWMgY29uc3QgdTMyIE1ENV9EZWZhdWx0SGFzaFZhbHVlWzRdID0geworCTB4Njc0NTIzMDFVTCwgMHhlZmNkYWI4OVVMLCAweDk4YmFkY2ZlVUwsIDB4MTAzMjU0NzZVTAorfTsKKyNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLworCisjaWZkZWYgTUQ1X1NVUFBPUlQKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSW5pdGlhbCBNZDVfQ1RYX1NUUlVDCisKK0FyZ3VtZW50czoKKyAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNZDVfQ1RYX1NUUlVDCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBNRDVfSW5pdChzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyAqcE1ENV9DVFgpCit7CisJTmRpc01vdmVNZW1vcnkocE1ENV9DVFgtPkhhc2hWYWx1ZSwgTUQ1X0RlZmF1bHRIYXNoVmFsdWUsCisJCSAgICAgICBzaXplb2YoTUQ1X0RlZmF1bHRIYXNoVmFsdWUpKTsKKwlOZGlzWmVyb01lbW9yeShwTUQ1X0NUWC0+QmxvY2ssIE1ENV9CTE9DS19TSVpFKTsKKwlwTUQ1X0NUWC0+QmxvY2tMZW4gPSAwOworCXBNRDVfQ1RYLT5NZXNzYWdlTGVuID0gMDsKK30JCQkJLyogRW5kIG9mIE1ENV9Jbml0ICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgTUQ1IGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQorCitBcmd1bWVudHM6CisgICAgcE1ENV9DVFggICAgICAgIFBvaW50ZXIgdG8gTWQ1X0NUWF9TVFJVQworCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorICAgIFRbaV0gOj0gZmxvb3IoYWJzKHNpbihpICsgMSkpICogKDIgcG93IDMyKSksIGkgaXMgbnVtYmVyIG9mIHJvdW5kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIE1ENV9IYXNoKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCkKK3sKKwl1MzIgWF9pOworCXUzMiBYWzE2XTsKKwl1MzIgYSwgYiwgYywgZDsKKworCS8qIFByZXBhcmUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUsIHtYX2l9ICovCisJTmRpc01vdmVNZW1vcnkoWCwgcE1ENV9DVFgtPkJsb2NrLCBNRDVfQkxPQ0tfU0laRSk7CisJZm9yIChYX2kgPSAwOyBYX2kgPCAxNjsgWF9pKyspCisJCVhbWF9pXSA9IGNwdTJsZTMyKFhbWF9pXSk7CS8qIEVuZGlhbiBTd2FwICovCisJLyogRW5kIG9mIGZvciAqLworCisJLyogTUQ1IGhhc2ggY29tcHV0YXRpb24gKi8KKwkvKiBJbml0aWFsaXplIHRoZSB3b3JraW5nIHZhcmlhYmxlcyAqLworCWEgPSBwTUQ1X0NUWC0+SGFzaFZhbHVlWzBdOworCWIgPSBwTUQ1X0NUWC0+SGFzaFZhbHVlWzFdOworCWMgPSBwTUQ1X0NUWC0+SGFzaFZhbHVlWzJdOworCWQgPSBwTUQ1X0NUWC0+SGFzaFZhbHVlWzNdOworCisJLyoKKwkgKiAgUm91bmQgMQorCSAqICBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisJICogIGEgPSBiICsgKChhICsgRihiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCisJICovCisJUk9VTkQxKGEsIGIsIGMsIGQsIFhbMF0sIDcsIDB4ZDc2YWE0NzgpOwkvKiAxICovCisJUk9VTkQxKGQsIGEsIGIsIGMsIFhbMV0sIDEyLCAweGU4YzdiNzU2KTsJLyogMiAqLworCVJPVU5EMShjLCBkLCBhLCBiLCBYWzJdLCAxNywgMHgyNDIwNzBkYik7CS8qIDMgKi8KKwlST1VORDEoYiwgYywgZCwgYSwgWFszXSwgMjIsIDB4YzFiZGNlZWUpOwkvKiA0ICovCisJUk9VTkQxKGEsIGIsIGMsIGQsIFhbNF0sIDcsIDB4ZjU3YzBmYWYpOwkvKiA1ICovCisJUk9VTkQxKGQsIGEsIGIsIGMsIFhbNV0sIDEyLCAweDQ3ODdjNjJhKTsJLyogNiAqLworCVJPVU5EMShjLCBkLCBhLCBiLCBYWzZdLCAxNywgMHhhODMwNDYxMyk7CS8qIDcgKi8KKwlST1VORDEoYiwgYywgZCwgYSwgWFs3XSwgMjIsIDB4ZmQ0Njk1MDEpOwkvKiA4ICovCisJUk9VTkQxKGEsIGIsIGMsIGQsIFhbOF0sIDcsIDB4Njk4MDk4ZDgpOwkvKiA5ICovCisJUk9VTkQxKGQsIGEsIGIsIGMsIFhbOV0sIDEyLCAweDhiNDRmN2FmKTsJLyogMTAgKi8KKwlST1VORDEoYywgZCwgYSwgYiwgWFsxMF0sIDE3LCAweGZmZmY1YmIxKTsJLyogMTEgKi8KKwlST1VORDEoYiwgYywgZCwgYSwgWFsxMV0sIDIyLCAweDg5NWNkN2JlKTsJLyogMTIgKi8KKwlST1VORDEoYSwgYiwgYywgZCwgWFsxMl0sIDcsIDB4NmI5MDExMjIpOwkvKiAxMyAqLworCVJPVU5EMShkLCBhLCBiLCBjLCBYWzEzXSwgMTIsIDB4ZmQ5ODcxOTMpOwkvKiAxNCAqLworCVJPVU5EMShjLCBkLCBhLCBiLCBYWzE0XSwgMTcsIDB4YTY3OTQzOGUpOwkvKiAxNSAqLworCVJPVU5EMShiLCBjLCBkLCBhLCBYWzE1XSwgMjIsIDB4NDliNDA4MjEpOwkvKiAxNiAqLworCisJLyoKKwkgKiAgUm91bmQgMgorCSAqICBMZXQgW2FiY2QgayBzIGldIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisJICogIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCisJICovCisJUk9VTkQyKGEsIGIsIGMsIGQsIFhbMV0sIDUsIDB4ZjYxZTI1NjIpOwkvKiAxNyAqLworCVJPVU5EMihkLCBhLCBiLCBjLCBYWzZdLCA5LCAweGMwNDBiMzQwKTsJLyogMTggKi8KKwlST1VORDIoYywgZCwgYSwgYiwgWFsxMV0sIDE0LCAweDI2NWU1YTUxKTsJLyogMTkgKi8KKwlST1VORDIoYiwgYywgZCwgYSwgWFswXSwgMjAsIDB4ZTliNmM3YWEpOwkvKiAyMCAqLworCVJPVU5EMihhLCBiLCBjLCBkLCBYWzVdLCA1LCAweGQ2MmYxMDVkKTsJLyogMjEgKi8KKwlST1VORDIoZCwgYSwgYiwgYywgWFsxMF0sIDksIDB4MjQ0MTQ1Myk7CS8qIDIyICovCisJUk9VTkQyKGMsIGQsIGEsIGIsIFhbMTVdLCAxNCwgMHhkOGExZTY4MSk7CS8qIDIzICovCisJUk9VTkQyKGIsIGMsIGQsIGEsIFhbNF0sIDIwLCAweGU3ZDNmYmM4KTsJLyogMjQgKi8KKwlST1VORDIoYSwgYiwgYywgZCwgWFs5XSwgNSwgMHgyMWUxY2RlNik7CS8qIDI1ICovCisJUk9VTkQyKGQsIGEsIGIsIGMsIFhbMTRdLCA5LCAweGMzMzcwN2Q2KTsJLyogMjYgKi8KKwlST1VORDIoYywgZCwgYSwgYiwgWFszXSwgMTQsIDB4ZjRkNTBkODcpOwkvKiAyNyAqLworCVJPVU5EMihiLCBjLCBkLCBhLCBYWzhdLCAyMCwgMHg0NTVhMTRlZCk7CS8qIDI4ICovCisJUk9VTkQyKGEsIGIsIGMsIGQsIFhbMTNdLCA1LCAweGE5ZTNlOTA1KTsJLyogMjkgKi8KKwlST1VORDIoZCwgYSwgYiwgYywgWFsyXSwgOSwgMHhmY2VmYTNmOCk7CS8qIDMwICovCisJUk9VTkQyKGMsIGQsIGEsIGIsIFhbN10sIDE0LCAweDY3NmYwMmQ5KTsJLyogMzEgKi8KKwlST1VORDIoYiwgYywgZCwgYSwgWFsxMl0sIDIwLCAweDhkMmE0YzhhKTsJLyogMzIgKi8KKworCS8qCisJICogIFJvdW5kIDMKKwkgKiAgTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgorCSAqICBhID0gYiArICgoYSArIEgoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKQorCSAqLworCVJPVU5EMyhhLCBiLCBjLCBkLCBYWzVdLCA0LCAweGZmZmEzOTQyKTsJLyogMzMgKi8KKwlST1VORDMoZCwgYSwgYiwgYywgWFs4XSwgMTEsIDB4ODc3MWY2ODEpOwkvKiAzNCAqLworCVJPVU5EMyhjLCBkLCBhLCBiLCBYWzExXSwgMTYsIDB4NmQ5ZDYxMjIpOwkvKiAzNSAqLworCVJPVU5EMyhiLCBjLCBkLCBhLCBYWzE0XSwgMjMsIDB4ZmRlNTM4MGMpOwkvKiAzNiAqLworCVJPVU5EMyhhLCBiLCBjLCBkLCBYWzFdLCA0LCAweGE0YmVlYTQ0KTsJLyogMzcgKi8KKwlST1VORDMoZCwgYSwgYiwgYywgWFs0XSwgMTEsIDB4NGJkZWNmYTkpOwkvKiAzOCAqLworCVJPVU5EMyhjLCBkLCBhLCBiLCBYWzddLCAxNiwgMHhmNmJiNGI2MCk7CS8qIDM5ICovCisJUk9VTkQzKGIsIGMsIGQsIGEsIFhbMTBdLCAyMywgMHhiZWJmYmM3MCk7CS8qIDQwICovCisJUk9VTkQzKGEsIGIsIGMsIGQsIFhbMTNdLCA0LCAweDI4OWI3ZWM2KTsJLyogNDEgKi8KKwlST1VORDMoZCwgYSwgYiwgYywgWFswXSwgMTEsIDB4ZWFhMTI3ZmEpOwkvKiA0MiAqLworCVJPVU5EMyhjLCBkLCBhLCBiLCBYWzNdLCAxNiwgMHhkNGVmMzA4NSk7CS8qIDQzICovCisJUk9VTkQzKGIsIGMsIGQsIGEsIFhbNl0sIDIzLCAweDQ4ODFkMDUpOwkvKiA0NCAqLworCVJPVU5EMyhhLCBiLCBjLCBkLCBYWzldLCA0LCAweGQ5ZDRkMDM5KTsJLyogNDUgKi8KKwlST1VORDMoZCwgYSwgYiwgYywgWFsxMl0sIDExLCAweGU2ZGI5OWU1KTsJLyogNDYgKi8KKwlST1VORDMoYywgZCwgYSwgYiwgWFsxNV0sIDE2LCAweDFmYTI3Y2Y4KTsJLyogNDcgKi8KKwlST1VORDMoYiwgYywgZCwgYSwgWFsyXSwgMjMsIDB4YzRhYzU2NjUpOwkvKiA0OCAqLworCisJLyoKKwkgKiAgUm91bmQgNAorCSAqICBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCisJICogIGEgPSBiICsgKChhICsgSShiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCisJICovCisJUk9VTkQ0KGEsIGIsIGMsIGQsIFhbMF0sIDYsIDB4ZjQyOTIyNDQpOwkvKiA0OSAqLworCVJPVU5ENChkLCBhLCBiLCBjLCBYWzddLCAxMCwgMHg0MzJhZmY5Nyk7CS8qIDUwICovCisJUk9VTkQ0KGMsIGQsIGEsIGIsIFhbMTRdLCAxNSwgMHhhYjk0MjNhNyk7CS8qIDUxICovCisJUk9VTkQ0KGIsIGMsIGQsIGEsIFhbNV0sIDIxLCAweGZjOTNhMDM5KTsJLyogNTIgKi8KKwlST1VORDQoYSwgYiwgYywgZCwgWFsxMl0sIDYsIDB4NjU1YjU5YzMpOwkvKiA1MyAqLworCVJPVU5ENChkLCBhLCBiLCBjLCBYWzNdLCAxMCwgMHg4ZjBjY2M5Mik7CS8qIDU0ICovCisJUk9VTkQ0KGMsIGQsIGEsIGIsIFhbMTBdLCAxNSwgMHhmZmVmZjQ3ZCk7CS8qIDU1ICovCisJUk9VTkQ0KGIsIGMsIGQsIGEsIFhbMV0sIDIxLCAweDg1ODQ1ZGQxKTsJLyogNTYgKi8KKwlST1VORDQoYSwgYiwgYywgZCwgWFs4XSwgNiwgMHg2ZmE4N2U0Zik7CS8qIDU3ICovCisJUk9VTkQ0KGQsIGEsIGIsIGMsIFhbMTVdLCAxMCwgMHhmZTJjZTZlMCk7CS8qIDU4ICovCisJUk9VTkQ0KGMsIGQsIGEsIGIsIFhbNl0sIDE1LCAweGEzMDE0MzE0KTsJLyogNTkgKi8KKwlST1VORDQoYiwgYywgZCwgYSwgWFsxM10sIDIxLCAweDRlMDgxMWExKTsJLyogNjAgKi8KKwlST1VORDQoYSwgYiwgYywgZCwgWFs0XSwgNiwgMHhmNzUzN2U4Mik7CS8qIDYxICovCisJUk9VTkQ0KGQsIGEsIGIsIGMsIFhbMTFdLCAxMCwgMHhiZDNhZjIzNSk7CS8qIDYyICovCisJUk9VTkQ0KGMsIGQsIGEsIGIsIFhbMl0sIDE1LCAweDJhZDdkMmJiKTsJLyogNjMgKi8KKwlST1VORDQoYiwgYywgZCwgYSwgWFs5XSwgMjEsIDB4ZWI4NmQzOTEpOwkvKiA2NCAqLworCisJLyogQ29tcHV0ZSB0aGUgaV50aCBpbnRlcm1lZGlhdGUgaGFzaCB2YWx1ZSBIXihpKSAqLworCXBNRDVfQ1RYLT5IYXNoVmFsdWVbMF0gKz0gYTsKKwlwTUQ1X0NUWC0+SGFzaFZhbHVlWzFdICs9IGI7CisJcE1ENV9DVFgtPkhhc2hWYWx1ZVsyXSArPSBjOworCXBNRDVfQ1RYLT5IYXNoVmFsdWVbM10gKz0gZDsKKworCU5kaXNaZXJvTWVtb3J5KHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOworCXBNRDVfQ1RYLT5CbG9ja0xlbiA9IDA7Cit9CQkJCS8qIEVuZCBvZiBNRDVfSGFzaCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFRoZSBtZXNzYWdlIGlzIGFwcGVuZGVkIHRvIGJsb2NrLiBJZiBibG9jayBzaXplID4gNjQgYnl0ZXMsIHRoZSBNRDVfSGFzaAord2lsbCBiZSBjYWxsZWQuCisKK0FyZ3VtZW50czoKKyAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YworICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKKyAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBNRDVfQXBwZW5kKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCwKKwkJSU4gY29uc3QgdTggTWVzc2FnZVtdLCB1MzIgTWVzc2FnZUxlbikKK3sKKwl1MzIgYXBwZW5kTGVuID0gMDsKKwl1MzIgZGlmZkxlbiA9IDA7CisKKwl3aGlsZSAoYXBwZW5kTGVuICE9IE1lc3NhZ2VMZW4pIHsKKwkJZGlmZkxlbiA9IE1lc3NhZ2VMZW4gLSBhcHBlbmRMZW47CisJCWlmICgocE1ENV9DVFgtPkJsb2NrTGVuICsgZGlmZkxlbikgPCBNRDVfQkxPQ0tfU0laRSkgeworCQkJTmRpc01vdmVNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLAorCQkJCSAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLCBkaWZmTGVuKTsKKwkJCXBNRDVfQ1RYLT5CbG9ja0xlbiArPSBkaWZmTGVuOworCQkJYXBwZW5kTGVuICs9IGRpZmZMZW47CisJCX0gZWxzZSB7CisJCQlOZGlzTW92ZU1lbW9yeShwTUQ1X0NUWC0+QmxvY2sgKyBwTUQ1X0NUWC0+QmxvY2tMZW4sCisJCQkJICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sCisJCQkJICAgICAgIE1ENV9CTE9DS19TSVpFIC0gcE1ENV9DVFgtPkJsb2NrTGVuKTsKKwkJCWFwcGVuZExlbiArPSAoTUQ1X0JMT0NLX1NJWkUgLSBwTUQ1X0NUWC0+QmxvY2tMZW4pOworCQkJcE1ENV9DVFgtPkJsb2NrTGVuID0gTUQ1X0JMT0NLX1NJWkU7CisJCQlNRDVfSGFzaChwTUQ1X0NUWCk7CisJCX0JCS8qIEVuZCBvZiBpZiAqLworCX0JCQkvKiBFbmQgb2Ygd2hpbGUgKi8KKwlwTUQ1X0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOworfQkJCQkvKiBFbmQgb2YgTUQ1X0FwcGVuZCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKKyAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCisgICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCisKK0FyZ3VtZW50czoKKyAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YworCitSZXR1cm4gVmFsdWU6CisgICAgZGlnZXN0TWVzc2FnZSAgIERpZ2VzdCBtZXNzYWdlCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBNRDVfRW5kKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCwgdTggRGlnZXN0TWVzc2FnZVtdKQoreworCXUzMiBpbmRleDsKKwl1NjQgbWVzc2FnZV9sZW5ndGhfYml0czsKKworCS8qIGFwcGVuZCAxIGJpdHMgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCisJTmRpc0ZpbGxNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKKworCS8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLworCWlmIChwTUQ1X0NUWC0+QmxvY2tMZW4gPiA1NSkKKwkJTUQ1X0hhc2gocE1ENV9DVFgpOworCS8qIEVuZCBvZiBpZiAqLworCisJLyogQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cyAqLworCW1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBwTUQ1X0NUWC0+TWVzc2FnZUxlbiAqIDg7CisJbWVzc2FnZV9sZW5ndGhfYml0cyA9IGNwdTJsZTY0KG1lc3NhZ2VfbGVuZ3RoX2JpdHMpOworCU5kaXNNb3ZlTWVtb3J5KCZwTUQ1X0NUWC0+QmxvY2tbNTZdLCAmbWVzc2FnZV9sZW5ndGhfYml0cywgOCk7CisJTUQ1X0hhc2gocE1ENV9DVFgpOworCisJLyogUmV0dXJuIG1lc3NhZ2UgZGlnZXN0LCB0cmFuc2Zvcm0gdGhlIHUzMiBoYXNoIHZhbHVlIHRvIGJ5dGVzICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykKKwkJcE1ENV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0gPQorCQkgICAgY3B1MmxlMzIocE1ENV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0pOworCS8qIEVuZCBvZiBmb3IgKi8KKwlOZGlzTW92ZU1lbW9yeShEaWdlc3RNZXNzYWdlLCBwTUQ1X0NUWC0+SGFzaFZhbHVlLCBNRDVfRElHRVNUX1NJWkUpOworfQkJCQkvKiBFbmQgb2YgTUQ1X0VuZCAqLworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIE1ENSBhbGdvcml0aG0KKworQXJndW1lbnRzOgorICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKKyAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCisKK1JldHVybiBWYWx1ZToKKyAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUX01ENShJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBEaWdlc3RNZXNzYWdlW10pCit7CisJc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgbWQ1X2N0eDsKKworCU5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4LCBzaXplb2Yoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMpKTsKKwlNRDVfSW5pdCgmbWQ1X2N0eCk7CisJTUQ1X0FwcGVuZCgmbWQ1X2N0eCwgTWVzc2FnZSwgTWVzc2FnZUxlbik7CisJTUQ1X0VuZCgmbWQ1X2N0eCwgRGlnZXN0TWVzc2FnZSk7Cit9CQkJCS8qIEVuZCBvZiBSVF9NRDUgKi8KKworI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCisKKy8qIEVuZCBvZiBjcnlwdF9tZDUuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY3J5cHRfc2hhMi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vY3J5cHRfc2hhMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODNmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9jcnlwdF9zaGEyLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi4uL2NyeXB0X3NoYTIuaCIKKworLyogQmFzaWMgb3BlcmF0aW9ucyAqLworI2RlZmluZSBTSFIoeCxuKSAoeCA+PiBuKQkvKiBTSFIoeClebiwgcmlnaHQgc2hpZnQgbiBiaXRzICwgeCBpcyB3LWJpdCB3b3JkLCAwIDw9IG4gPD0gdyAqLworI2RlZmluZSBST1RSKHgsbix3KSAoKHggPj4gbikgfCAoeCA8PCAodyAtIG4pKSkJLyogUk9UUih4KV5uLCBjaXJjdWxhciByaWdodCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCisjZGVmaW5lIFJPVEwoeCxuLHcpICgoeCA8PCBuKSB8ICh4ID4+ICh3IC0gbikpKQkvKiBST1RMKHgpXm4sIGNpcmN1bGFyIGxlZnQgc2hpZnQgbiBiaXRzICwgeCBpcyB3LWJpdCB3b3JkLCAwIDw9IG4gPD0gdyAqLworI2RlZmluZSBST1RSMzIoeCxuKSBST1RSKHgsbiwzMikJLyogMzIgYml0cyB3b3JkICovCisjZGVmaW5lIFJPVEwzMih4LG4pIFJPVEwoeCxuLDMyKQkvKiAzMiBiaXRzIHdvcmQgKi8KKworLyogQmFzaWMgZnVuY3Rpb25zICovCisjZGVmaW5lIENoKHgseSx6KSAoKHggJiB5KSBeICgofngpICYgeikpCisjZGVmaW5lIE1haih4LHkseikgKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSkKKyNkZWZpbmUgUGFyaXR5KHgseSx6KSAoeCBeIHkgXiB6KQorCisjaWZkZWYgU0hBMV9TVVBQT1JUCisvKiBTSEExIGNvbnN0YW50cyAqLworI2RlZmluZSBTSEExX01BU0sgMHgwMDAwMDAwZgorc3RhdGljIGNvbnN0IHUzMiBTSEExX0tbNF0gPSB7CisJMHg1YTgyNzk5OVVMLCAweDZlZDllYmExVUwsIDB4OGYxYmJjZGNVTCwgMHhjYTYyYzFkNlVMCit9OworCitzdGF0aWMgY29uc3QgdTMyIFNIQTFfRGVmYXVsdEhhc2hWYWx1ZVs1XSA9IHsKKwkweDY3NDUyMzAxVUwsIDB4ZWZjZGFiODlVTCwgMHg5OGJhZGNmZVVMLCAweDEwMzI1NDc2VUwsIDB4YzNkMmUxZjBVTAorfTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBJbml0aWFsIHN0cnVjdCBydF9zaGExX2N0eAorCitBcmd1bWVudHM6CisgICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X3NoYTFfY3R4CisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6CisgICAgTm9uZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSVF9TSEExX0luaXQoc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCkKK3sKKwlOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+SGFzaFZhbHVlLCBTSEExX0RlZmF1bHRIYXNoVmFsdWUsCisJCSAgICAgICBzaXplb2YoU0hBMV9EZWZhdWx0SGFzaFZhbHVlKSk7CisJTmRpc1plcm9NZW1vcnkocFNIQV9DVFgtPkJsb2NrLCBTSEExX0JMT0NLX1NJWkUpOworCXBTSEFfQ1RYLT5NZXNzYWdlTGVuID0gMDsKKwlwU0hBX0NUWC0+QmxvY2tMZW4gPSAwOworfQkJCQkvKiBFbmQgb2YgUlRfU0hBMV9Jbml0ICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgU0hBMSBjb21wdXRhdGlvbiBmb3Igb25lIGJsb2NrICg1MTIgYml0cykKKworQXJndW1lbnRzOgorICAgIHBTSEFfQ1RYICAgICAgICBQb2ludGVyIHRvIHN0cnVjdCBydF9zaGExX2N0eAorCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgU0hBMV9IYXNoKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgpCit7CisJdTMyIFdfaSwgdCwgczsKKwl1MzIgV1sxNl07CisJdTMyIGEsIGIsIGMsIGQsIGUsIFQsIGZfdCA9IDA7CisKKwkvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMCA8IHQgPCAxNSAqLworCU5kaXNNb3ZlTWVtb3J5KFcsIHBTSEFfQ1RYLT5CbG9jaywgU0hBMV9CTE9DS19TSVpFKTsKKwlmb3IgKFdfaSA9IDA7IFdfaSA8IDE2OyBXX2krKykKKwkJV1tXX2ldID0gY3B1MmJlMzIoV1tXX2ldKTsJLyogRW5kaWFuIFN3YXAgKi8KKwkvKiBFbmQgb2YgZm9yICovCisKKwkvKiBTSEEyNTYgaGFzaCBjb21wdXRhdGlvbiAqLworCS8qIEluaXRpYWxpemUgdGhlIHdvcmtpbmcgdmFyaWFibGVzICovCisJYSA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbMF07CisJYiA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbMV07CisJYyA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbMl07CisJZCA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbM107CisJZSA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbNF07CisKKwkvKiA4MCByb3VuZHMgKi8KKwlmb3IgKHQgPSAwOyB0IDwgODA7IHQrKykgeworCQlzID0gdCAmIFNIQTFfTUFTSzsKKwkJaWYgKHQgPiAxNSkgewkvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMTYgPCB0IDwgNzkgKi8KKwkJCVdbc10gPQorCQkJICAgIChXWyhzICsgMTMpICYgU0hBMV9NQVNLXSkgXiAoV1socyArIDgpICYgU0hBMV9NQVNLXSkKKwkJCSAgICBeIChXWyhzICsgMikgJiBTSEExX01BU0tdKSBeIFdbc107CisJCQlXW3NdID0gUk9UTDMyKFdbc10sIDEpOworCQl9CQkvKiBFbmQgb2YgaWYgKi8KKwkJc3dpdGNoICh0IC8gMjApIHsKKwkJY2FzZSAwOgorCQkJZl90ID0gQ2goYiwgYywgZCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZl90ID0gUGFyaXR5KGIsIGMsIGQpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWZfdCA9IE1haihiLCBjLCBkKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlmX3QgPSBQYXJpdHkoYiwgYywgZCk7CisJCQlicmVhazsKKwkJfQkJLyogRW5kIG9mIHN3aXRjaCAqLworCQlUID0gUk9UTDMyKGEsIDUpICsgZl90ICsgZSArIFNIQTFfS1t0IC8gMjBdICsgV1tzXTsKKwkJZSA9IGQ7CisJCWQgPSBjOworCQljID0gUk9UTDMyKGIsIDMwKTsKKwkJYiA9IGE7CisJCWEgPSBUOworCX0JCQkvKiBFbmQgb2YgZm9yICovCisKKwkvKiBDb21wdXRlIHRoZSBpXnRoIGludGVybWVkaWF0ZSBoYXNoIHZhbHVlIEheKGkpICovCisJcFNIQV9DVFgtPkhhc2hWYWx1ZVswXSArPSBhOworCXBTSEFfQ1RYLT5IYXNoVmFsdWVbMV0gKz0gYjsKKwlwU0hBX0NUWC0+SGFzaFZhbHVlWzJdICs9IGM7CisJcFNIQV9DVFgtPkhhc2hWYWx1ZVszXSArPSBkOworCXBTSEFfQ1RYLT5IYXNoVmFsdWVbNF0gKz0gZTsKKworCU5kaXNaZXJvTWVtb3J5KHBTSEFfQ1RYLT5CbG9jaywgU0hBMV9CTE9DS19TSVpFKTsKKwlwU0hBX0NUWC0+QmxvY2tMZW4gPSAwOworfQkJCQkvKiBFbmQgb2YgU0hBMV9IYXNoICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgVGhlIG1lc3NhZ2UgaXMgYXBwZW5kZWQgdG8gYmxvY2suIElmIGJsb2NrIHNpemUgPiA2NCBieXRlcywgdGhlIFNIQTFfSGFzaAord2lsbCBiZSBjYWxsZWQuCisKK0FyZ3VtZW50czoKKyAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3QgcnRfc2hhMV9jdHgKKyAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0CisgICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcworCitSZXR1cm4gVmFsdWU6CisgICAgTm9uZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgU0hBMV9BcHBlbmQoc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCwKKwkJIElOIGNvbnN0IHU4IE1lc3NhZ2VbXSwgdTMyIE1lc3NhZ2VMZW4pCit7CisJdTMyIGFwcGVuZExlbiA9IDA7CisJdTMyIGRpZmZMZW4gPSAwOworCisJd2hpbGUgKGFwcGVuZExlbiAhPSBNZXNzYWdlTGVuKSB7CisJCWRpZmZMZW4gPSBNZXNzYWdlTGVuIC0gYXBwZW5kTGVuOworCQlpZiAoKHBTSEFfQ1RYLT5CbG9ja0xlbiArIGRpZmZMZW4pIDwgU0hBMV9CTE9DS19TSVpFKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sCisJCQkJICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIGRpZmZMZW4pOworCQkJcFNIQV9DVFgtPkJsb2NrTGVuICs9IGRpZmZMZW47CisJCQlhcHBlbmRMZW4gKz0gZGlmZkxlbjsKKwkJfSBlbHNlIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwKKwkJCQkgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwKKwkJCQkgICAgICAgU0hBMV9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKKwkJCWFwcGVuZExlbiArPSAoU0hBMV9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKKwkJCXBTSEFfQ1RYLT5CbG9ja0xlbiA9IFNIQTFfQkxPQ0tfU0laRTsKKwkJCVNIQTFfSGFzaChwU0hBX0NUWCk7CisJCX0JCS8qIEVuZCBvZiBpZiAqLworCX0JCQkvKiBFbmQgb2Ygd2hpbGUgKi8KKwlwU0hBX0NUWC0+TWVzc2FnZUxlbiArPSBNZXNzYWdlTGVuOworfQkJCQkvKiBFbmQgb2YgU0hBMV9BcHBlbmQgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICAxLiBBcHBlbmQgYml0IDEgdG8gZW5kIG9mIHRoZSBtZXNzYWdlCisgICAgMi4gQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cworICAgIDMuIFRyYW5zZm9ybSB0aGUgSGFzaCBWYWx1ZSB0byBkaWdlc3QgbWVzc2FnZQorCitBcmd1bWVudHM6CisgICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IHJ0X3NoYTFfY3R4CisKK1JldHVybiBWYWx1ZToKKyAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKKworTm90ZToKKyAgICBOb25lCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFNIQTFfRW5kKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgsIHU4IERpZ2VzdE1lc3NhZ2VbXSkKK3sKKwl1MzIgaW5kZXg7CisJdTY0IG1lc3NhZ2VfbGVuZ3RoX2JpdHM7CisKKwkvKiBBcHBlbmQgYml0IDEgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCisJTmRpc0ZpbGxNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKKworCS8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLworCWlmIChwU0hBX0NUWC0+QmxvY2tMZW4gPiA1NSkKKwkJU0hBMV9IYXNoKHBTSEFfQ1RYKTsKKwkvKiBFbmQgb2YgaWYgKi8KKworCS8qIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMgKi8KKwltZXNzYWdlX2xlbmd0aF9iaXRzID0gcFNIQV9DVFgtPk1lc3NhZ2VMZW4gKiA4OworCW1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBjcHUyYmU2NChtZXNzYWdlX2xlbmd0aF9iaXRzKTsKKwlOZGlzTW92ZU1lbW9yeSgmcFNIQV9DVFgtPkJsb2NrWzU2XSwgJm1lc3NhZ2VfbGVuZ3RoX2JpdHMsIDgpOworCVNIQTFfSGFzaChwU0hBX0NUWCk7CisKKwkvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgdTMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1OyBpbmRleCsrKQorCQlwU0hBX0NUWC0+SGFzaFZhbHVlW2luZGV4XSA9CisJCSAgICBjcHUyYmUzMihwU0hBX0NUWC0+SGFzaFZhbHVlW2luZGV4XSk7CisJLyogRW5kIG9mIGZvciAqLworCU5kaXNNb3ZlTWVtb3J5KERpZ2VzdE1lc3NhZ2UsIHBTSEFfQ1RYLT5IYXNoVmFsdWUsIFNIQTFfRElHRVNUX1NJWkUpOworfQkJCQkvKiBFbmQgb2YgU0hBMV9FbmQgKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBTSEExIGFsZ29yaXRobQorCitBcmd1bWVudHM6CisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAorICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKKworUmV0dXJuIFZhbHVlOgorICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQorCitOb3RlOgorICAgIE5vbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRfU0hBMShJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICB1MzIgTWVzc2FnZUxlbiwgdTggRGlnZXN0TWVzc2FnZVtdKQoreworCisJc3RydWN0IHJ0X3NoYTFfY3R4IHNoYV9jdHg7CisKKwlOZGlzWmVyb01lbW9yeSgmc2hhX2N0eCwgc2l6ZW9mKHN0cnVjdCBydF9zaGExX2N0eCkpOworCVJUX1NIQTFfSW5pdCgmc2hhX2N0eCk7CisJU0hBMV9BcHBlbmQoJnNoYV9jdHgsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOworCVNIQTFfRW5kKCZzaGFfY3R4LCBEaWdlc3RNZXNzYWdlKTsKK30JCQkJLyogRW5kIG9mIFJUX1NIQTEgKi8KKyNlbmRpZiAvKiBTSEExX1NVUFBPUlQgKi8KKworLyogRW5kIG9mIGNyeXB0X3NoYTIuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYwppbmRleCAyMzMzMGYyLi43MWNiYjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9kZnMuYwpAQCAtMzMsMTY0ICszMywxMCBAQAogICAgIFJldmlzaW9uIEhpc3Rvcnk6CiAgICAgV2hvICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CiAgICAgLS0tLS0tLS0gIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRm9uY2hpICAgIDAzLTEyLTIwMDcgICAgICBjcmVhdGVkCiAqLwogCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLXR5cGVkZWYgc3RydWN0IF9SQURBUl9EVVJBVElPTl9UQUJMRQotewotCVVMT05HIFJERHVyUmVnaW9uOwotCVVMT05HIFJhZGFyU2lnbmFsRHVyYXRpb247Ci0JVUxPTkcgVG9sZXJhbmNlOwotfSBSQURBUl9EVVJBVElPTl9UQUJMRSwgKlBSQURBUl9EVVJBVElPTl9UQUJMRTsKLQotCi1zdGF0aWMgVUNIQVIgUmRJZGxlVGltZVRhYmxlW01BWF9SRF9SRUdJT05dWzRdID0KLXsKLQl7OSwgMjUwLCAyNTAsIDI1MH0sCQkvLyBDRQotCXs0LCAyNTAsIDI1MCwgMjUwfSwJCS8vIEZDQwotCXs0LCAyNTAsIDI1MCwgMjUwfSwJCS8vIEpBUAotCXsxNSwgMjUwLCAyNTAsIDI1MH0sCS8vIEpBUF9XNTMKLQl7NCwgMjUwLCAyNTAsIDI1MH0JCS8vIEpBUF9XNTYKLX07Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCYnAgUmFkYXIgZGV0ZWN0aW9uIHJvdXRpbmUKLQotCUFyZ3VtZW50czoKLQkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVDggUmFkYXJQZXJpb2Q7Ci0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTE0LCAweDAyKTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIxLCAweDIwKTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIyLCAweDAwKTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIzLCAweDA4LyoweDgwKi8pOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjQsIDB4MjgpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjUsIDB4ZmYpOwotCi0JUmFkYXJQZXJpb2QgPSAoKFVJTlQpUmRJZGxlVGltZVRhYmxlW3BBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uXVswXSArIChVSU5UKXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lKSA8IDI1MCA/Ci0JCQkoUmRJZGxlVGltZVRhYmxlW3BBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uXVswXSArIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lKSA6IDI1MDsKLQotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIwLCAweDFkKTsKLQlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMSwgMHg0MCk7Ci0KLQlSYWRhckRldGVjdGlvblN0YXJ0KHBBZCwgMCwgUmFkYXJQZXJpb2QpOwotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIwLCAweDFkKTsKLQlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMSwgMHg2MCk7Ci0KLQlSYWRhckRldGVjdGlvblN0b3AocEFkKTsKLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIENUU1Byb3RlY3QsCi0JSU4gVUlOVDggQ1RTUGVyaW9kKQotewotCVVJTlQ4IERmc0FjdGl2ZVRpbWUgPSAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgJiAweDFmKTsKLQlVSU5UOCBDdHNQcm90ZWN0ID0gKENUU1Byb3RlY3QgPT0gMSkgPyAweDAyIDogMHgwMTsgLy8gQ1RTIHByb3RlY3QuCi0KLQlpZiAoQ1RTUHJvdGVjdCAhPSAwKQotCXsKLQkJc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uKQotCQl7Ci0JCWNhc2UgRkNDOgotCQljYXNlIEpBUF9XNTY6Ci0JCQlDdHNQcm90ZWN0ID0gMHgwMzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ0U6Ci0JCWNhc2UgSkFQX1c1MzoKLQkJZGVmYXVsdDoKLQkJCUN0c1Byb3RlY3QgPSAweDAyOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCQlDdHNQcm90ZWN0ID0gMHgwMTsKLQotCi0JLy8gc2VuZCBzdGFydC1SRCB3aXRoIENUUyBwcm90ZWN0aW9uIGNvbW1hbmQgdG8gTUNVCi0JLy8gaGlnaGJ5dGUgWzddCQlyZXNlcnZlCi0JLy8gaGlnaGJ5dGUgWzY6NV0JMHg6IHN0b3AgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24KLQkvLyBoaWdoYnl0ZSBbMTBdOglTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRob3V0IENUUyBwcm90ZWN0aW9uLCAxMTogU3RhcnQgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24gd2l0aCBDVFMgcHJvdGVjdGlvbgotCS8vIGhpZ2hieXRlIFs0OjBdCVJhZGFyL2NhcnJpZXIgZGV0ZWN0aW9uIGR1cmF0aW9uLiBJbiAxbXMuCi0KLQkvLyBsb3dieXRlIFs3OjBdCVJhZGFyL2NhcnJpZXIgZGV0ZWN0aW9uIHBlcmlvZCwgaW4gMW1zLgotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgQ1RTUGVyaW9kLCBEZnNBY3RpdmVUaW1lIHwgKEN0c1Byb3RlY3QgPDwgNSkpOwotCS8vQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYzLCAweGZmLCAxMCwgMCk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQgCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQlGb3VuZCByYWRhciBzaWduYWwKLQkJRkFMU0UJTm90IGZvdW5kIHJhZGFyIHNpZ25hbAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSYWRhckRldGVjdGlvblN0b3AuXG4iKSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYwLCAweGZmLCAweDAwLCAweDAwKTsJLy8gc2VuZCBzdGFydC1SRCB3aXRoIENUUyBwcm90ZWN0aW9uIGNvbW1hbmQgdG8gTUNVCi0KLQlyZXR1cm47Ci19Ci0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTIwNiwyMjcgKzUyLDE3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQ2gpCitCT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2gpCiB7Ci0jaWYgMQotCUlOVAkJaTsKKwlpbnQgaTsKIAlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwogCi0JZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKENoID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJeworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspIHsKKwkJaWYgKENoID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkgewogCQkJcmVzdWx0ID0gcEFkLT5DaGFubmVsTGlzdFtpXS5EZnNSZXE7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCXJldHVybiByZXN1bHQ7Ci0jZWxzZQotCUlOVAkJaTsKLQlVQ0hBUglDaGFubmVsWzE1XT17NTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfTsKLQotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JewotCQlpZiAoQ2ggPT0gQ2hhbm5lbFtpXSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSAhPSAxNSkKLQkJcmV0dXJuIFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci0jZW5kaWYKIH0KLQotVUxPTkcgSmFwUmFkYXJUeXBlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HCQlpOwotCWNvbnN0IFVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uICE9IEpBUCkKLQl7Ci0JCXJldHVybiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbjsKLQl9Ci0KLQlmb3IgKGk9MDsgaTwxNTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gQ2hhbm5lbFtpXSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA8IDQpCi0JCXJldHVybiBKQVBfVzUzOwotCWVsc2UgaWYgKGkgPCAxNSkKLQkJcmV0dXJuIEpBUF9XNTY7Ci0JZWxzZQotCQlyZXR1cm4gSkFQOyAvLyBXNTIKLQotfQotCi1VTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDggYnl0ZVZhbHVlID0gMDsKLQlVTE9ORyByZXN1bHQ7Ci0KLQlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTUsICZieXRlVmFsdWUpOwotCi0JcmVzdWx0ID0gMDsKLQlzd2l0Y2ggKGJ5dGVWYWx1ZSkKLQl7Ci0JY2FzZSAxOiAvLyByYWRhciBzaWduYWwgZGV0ZWN0ZWQgYnkgcHVsc2UgbW9kZS4KLQljYXNlIDI6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSB3aWR0aCBtb2RlLgotCQlyZXN1bHQgPSBSVE1QUmVhZFJhZGFyRHVyYXRpb24ocEFkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDA6IC8vIE5vIHJhZGFyIHNpZ25hbC4KLQlkZWZhdWx0OgotCi0JCXJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLVVMT05HIFJUTVBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVTE9ORyByZXN1bHQgPSAwOwotCi0JcmV0dXJuIHJlc3VsdDsKLQotfQotCi1WT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JcmV0dXJuOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFJhZGFyIHdhdmUgZGV0ZWN0aW9uLiBUaGUgQVBJIHNob3VsZCBiZSBpbnZva2UgZWFjaCBzZWNvbmQuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVAlpOwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuSW5TZXJ2aWNlTW9uaXRvckNvdW50Kys7Ci0KLQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID4gMCkKLQkJewotCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlIC0tOwotCQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCU1KSA9PSAwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhZGFyRGV0ZWN0UGVyaW9kaWMgLSBjaD0lZCwgUmVtYWluaW5nVGltZUZvclVzZT0lZFxuIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vcmFkYXIgZGV0ZWN0Ci0JaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCXsKLQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOwotCX0KLQotCXJldHVybjsKLX0KLQotLy8gUGVyaW9kaWMgUmFkYXIgZGV0ZWN0aW9uLCBzd2l0Y2ggY2hhbm5lbCB3aWxsIG9jY3VyIGluIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KCkKLS8vIEJlZm9yZSBzd2l0Y2ggY2hhbm5lbCwgZHJpdmVyIG5lZWRzIGRvaW5nIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudC4KLVZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvLyBuZWVkIHRvIGNoZWNrIGNoYW5uZWwgYXZhaWxhYmlsaXR5LCBhZnRlciBzd2l0Y2ggY2hhbm5lbAotCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgIT0gUkRfU0lMRU5DRV9NT0RFKQotCQkJcmV0dXJuOwotCi0JLy8gY2hhbm5lbCBhdmFpbGFiaWxpdHkgY2hlY2sgdGltZSBpcyA2MHNlYywgdXNlIDY1IGZvciBhc3N1cmFuY2UKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCsrID4gcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGZvdW5kIHJhZGFyIHNpZ25hbCwgc3RhcnQgc2VuZCBiZWFjb24gYW5kIHJhZGFyIGRldGVjdGlvbiBpbiBzZXJ2aWNlIG1vbml0b3JcblxuIikpOwotCQkJQmJwUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7Ci0JCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOwotCi0KLQkJcmV0dXJuOwotCX0KLQotCXJldHVybjsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0JCWNoYW5nZSBjaGFubmVsIG1vdmluZyB0aW1lIGZvciBERlMgdGVzdGluZy4KLQotCUFyZ3VtZW50czoKLQkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgc2V0IENoTW92VGltZT1bdmFsdWVdCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBhcmcpCi17Ci0JVUlOVDggVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSBWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fZnVuY19fLAotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X0xvbmdQdWxzZVJhZGFyVGhfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKQotewotCVVJTlQ4IFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID4gMTAgPyAxMCA6IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gVmFsdWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX2Z1bmNfXywKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX2VmdXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0MTJmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlX2VmdXNlLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJZWVfZWZ1c2UuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUJIi4uL3J0X2NvbmZpZy5oIgorCisjZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9TVEFSVAkweDJkMAorI2RlZmluZSBFRlVTRV9VU0FHRV9NQVBfRU5ECQkweDJmYworI2RlZmluZSBFRlVTRV9VU0FHRV9NQVBfU0laRQk0NQorCisjZGVmaW5lIEVGVVNFX0VFUFJPTV9ERUZVTFRfRklMRQkiUlQzMHh4RUVQUk9NLmJpbiIKKyNkZWZpbmUgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFCTEwMjQKKworI2RlZmluZSBFRlVTRV9UQUcJCQkJMHgyZmUKKwordHlwZWRlZiB1bmlvbiBfRUZVU0VfQ1RSTF9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTMyIEVGU1JPTV9BT1VUOjY7CisJCXUzMiBFRlNST01fTU9ERToyOworCQl1MzIgRUZTUk9NX0xET19PRkZfVElNRTo2OworCQl1MzIgRUZTUk9NX0xET19PTl9USU1FOjI7CisJCXUzMiBFRlNST01fQUlOOjEwOworCQl1MzIgUkVTRVJWRUQ6NDsKKwkJdTMyIEVGU1JPTV9LSUNLOjE7CisJCXUzMiBTRUxfRUZVU0U6MTsKKwl9IGZpZWxkOworCXUzMiB3b3JkOworfSBFRlVTRV9DVFJMX1NUUlVDLCAqUEVGVVNFX0NUUkxfU1RSVUM7CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit1OCBlRnVzZVJlYWRSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHUxNiBMZW5ndGgsIHUxNiAqIHBEYXRhKQoreworCUVGVVNFX0NUUkxfU1RSVUMgZUZ1c2VDdHJsU3RydWM7CisJaW50IGk7CisJdTE2IGVmdXNlRGF0YU9mZnNldDsKKwl1MzIgZGF0YTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOworCisJLypTdGVwMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4gKi8KKwkvKlVzZSB0aGUgZWVwcm9tIGxvZ2ljYWwgYWRkcmVzcyBhbmQgY292ZXJ0IHRvIGFkZHJlc3MgdG8gYmxvY2sgbnVtYmVyICovCisJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKKworCS8qU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAwLiAqLworCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMDsKKworCS8qU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuICovCisJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOworCisJTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7CisKKwkvKlN0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uICovCisJaSA9IDA7CisJd2hpbGUgKGkgPCA1MDApIHsKKwkJLypydG1wLkh3TWVtb3J5UmVhZER3b3JkKEVGVVNFX0NUUkwsIChEV09SRCAqKSAmZUZ1c2VDdHJsU3RydWMsIDQpOyAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKKwkJaWYgKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApIHsKKwkJCWJyZWFrOworCQl9CisJCVJUTVB1c2VjRGVsYXkoMik7CisJCWkrKzsKKwl9CisKKwkvKmlmIEVGU1JPTV9BT1VUIGlzIG5vdCBmb3VuZCBpbiBwaHlzaWNhbCBhZGRyZXNzLCB3cml0ZSAweGZmZmYgKi8KKwlpZiAoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQgPT0gMHgzZikgeworCQlmb3IgKGkgPSAwOyBpIDwgTGVuZ3RoIC8gMjsgaSsrKQorCQkJKihwRGF0YSArIDIgKiBpKSA9IDB4ZmZmZjsKKwl9IGVsc2UgeworCQkvKlN0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTkwLTB4NTlDKSAqLworCQllZnVzZURhdGFPZmZzZXQgPSBFRlVTRV9EQVRBMyAtIChPZmZzZXQgJiAweEMpOworCQkvKmRhdGEgaG9sZCA0IGJ5dGVzIGRhdGEuICovCisJCS8qSW4gUlRNUF9JT19SRUFEMzIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgMzItYnl0ZXMgc3dhcHBpbmcgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsICZkYXRhKTsKKwkJLypEZWNpZGUgdGhlIHVwcGVyIDIgYnl0ZXMgb3IgdGhlIGJvdHRvbSAyIGJ5dGVzLiAqLworCQkvKiBMaXR0bGUtZW5kaWFuICAgICAgICAgICAgICAgIFMgICAgICAgfCAgICAgICBTICAgICAgIEJpZy1lbmRpYW4gKi8KKwkJLyogYWRkciAzICAgICAgIDIgICAgICAgMSAgICAgICAwICAgICAgIHwgICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAqLworCQkvKiBPcmktViAgICAgICAgRCAgICAgICBDICAgICAgIEIgICAgICAgQSAgICAgICB8ICAgICAgIEEgICAgICAgQiAgICAgICBDICAgICAgIEQgKi8KKwkJLypBZnRlciBzd2FwcGluZyAqLworCQkvKiAgICAgICAgICAgICAgRCAgICAgICBDICAgICAgIEIgICAgICAgQSAgICAgICB8ICAgICAgIEQgICAgICAgQyAgICAgICBCICAgICAgIEEgKi8KKwkJLypSZXR1cm4gMi1ieXRlcyAqLworCQkvKlRoZSByZXR1cm4gYnl0ZSBzdGF0cnMgZnJvbSBTLiBUaGVyZWZvcmUsIHRoZSBsaXR0bGUtZW5kaWFuIHdpbGwgcmV0dXJuIEJBLCB0aGUgQmlnLWVuZGlhbiB3aWxsIHJldHVybiBEQy4gKi8KKwkJLypGb3IgcmV0dXJuaW5nIHRoZSBib3R0b20gMiBieXRlcywgdGhlIEJpZy1lbmRpYW4gc2hvdWxkIHNoaWZ0IHJpZ2h0IDItYnl0ZXMuICovCisJCWRhdGEgPSBkYXRhID4+ICg4ICogKE9mZnNldCAmIDB4MykpOworCisJCU5kaXNNb3ZlTWVtb3J5KHBEYXRhLCAmZGF0YSwgTGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gKHU4KWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BT1VUOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisKKwlSZXR1cm4gVmFsdWU6CisKKwlOb3RlOgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIGVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1MTYgT2Zmc2V0LAorCQkJCXUxNiBMZW5ndGgsIHUxNiAqIHBEYXRhKQoreworCUVGVVNFX0NUUkxfU1RSVUMgZUZ1c2VDdHJsU3RydWM7CisJaW50IGk7CisJdTE2IGVmdXNlRGF0YU9mZnNldDsKKwl1MzIgZGF0YTsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOworCisJLypTdGVwMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4gKi8KKwllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOworCisJLypTdGVwMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDEuICovCisJLypSZWFkIGluIHBoeXNpY2FsIHZpZXcgKi8KKwllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDE7CisKKwkvKlN0ZXAyLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHJlYWQgcHJvY2VkdXJlLiAqLworCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKKworCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOworCisJLypTdGVwMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLiAqLworCWkgPSAwOworCXdoaWxlIChpIDwgNTAwKSB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOworCQlpZiAoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKKwkJCWJyZWFrOworCQlSVE1QdXNlY0RlbGF5KDIpOworCQlpKys7CisJfQorCisJLypTdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkgKi8KKwkvKkJlY2F1c2UgdGhlIHNpemUgb2YgZWFjaCBFRlVTRV9EQVRBIGlzIDQgQnl0ZXMsIHRoZSBzaXplIG9mIGFkZHJlc3Mgb2YgZWFjaCBpcyAyIGJpdHMuICovCisJLypUaGUgcHJldmlvdXMgMiBiaXRzIGlzIHRoZSBFRlVTRV9EQVRBIG51bWJlciwgdGhlIGxhc3QgMiBiaXRzIGlzIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGJ5dGVzICovCisJLypEZWNpZGUgd2hpY2ggRUZVU0VfREFUQSB0byByZWFkICovCisJLyo1OTA6RiBFIEQgQyAqLworCS8qNTk0OkIgQSA5IDggKi8KKwkvKjU5ODo3IDYgNSA0ICovCisJLyo1OUM6MyAyIDEgMCAqLworCWVmdXNlRGF0YU9mZnNldCA9IEVGVVNFX0RBVEEzIC0gKE9mZnNldCAmIDB4Qyk7CisKKwlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgJmRhdGEpOworCisJZGF0YSA9IGRhdGEgPj4gKDggKiAoT2Zmc2V0ICYgMHgzKSk7CisKKwlOZGlzTW92ZU1lbW9yeShwRGF0YSwgJmRhdGEsIExlbmd0aCk7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIGVGdXNlUmVhZFBoeXNpY2FsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHUxNiAqbHBJbkJ1ZmZlciwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbkluQnVmZmVyU2l6ZSwKKwkJCSAgICAgIHUxNiAqbHBPdXRCdWZmZXIsIHVuc2lnbmVkIGxvbmcgbk91dEJ1ZmZlclNpemUpCit7CisJdTE2ICpwSW5CdWYgPSAodTE2ICopIGxwSW5CdWZmZXI7CisJdTE2ICpwT3V0QnVmID0gKHUxNiAqKSBscE91dEJ1ZmZlcjsKKworCXUxNiBPZmZzZXQgPSBwSW5CdWZbMF07CS8qYWRkciAqLworCXUxNiBMZW5ndGggPSBwSW5CdWZbMV07CS8qbGVuZ3RoICovCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuZ3RoOyBpICs9IDIpIHsKKwkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBPZmZzZXQgKyBpLCAyLCAmcE91dEJ1ZltpIC8gMl0pOworCX0KK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKworCVJldHVybiBWYWx1ZToKKworCU5vdGU6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBzZXRfZUZ1c2VHZXRGcmVlQmxvY2tDb3VudF9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQoreworCXUxNiBpOworCXUxNiBMb2dpY2FsQWRkcmVzczsKKwl1MTYgZWZ1c2VmcmVlbnVtID0gMDsKKwlpZiAoIXBBZC0+YlVzZUVmdXNlKQorCQlyZXR1cm4gRkFMU0U7CisJZm9yIChpID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpIDw9IEVGVVNFX1VTQUdFX01BUF9FTkQ7IGkgKz0gMikgeworCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7CisJCWlmICgoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKSB7CisJCQllZnVzZWZyZWVudW0gPSAodTgpKEVGVVNFX1VTQUdFX01BUF9FTkQgLSBpICsgMSk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkgeworCQkJZWZ1c2VmcmVlbnVtID0gKHU4KShFRlVTRV9VU0FHRV9NQVBfRU5EIC0gaSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IEVGVVNFX1VTQUdFX01BUF9FTkQpCisJCQllZnVzZWZyZWVudW0gPSAwOworCX0KKwlwcmludGsoImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIiwgZWZ1c2VmcmVlbnVtKTsKKwlyZXR1cm4gVFJVRTsKK30KKworaW50IHNldF9lRnVzZWR1bXBfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZykKK3sKKwl1MTYgSW5CdWZbM107CisJaW50IGkgPSAwOworCWlmICghcEFkLT5iVXNlRWZ1c2UpCisJCXJldHVybiBGQUxTRTsKKwlmb3IgKGkgPSAwOyBpIDwgRUZVU0VfVVNBR0VfTUFQX0VORCAvIDI7IGkrKykgeworCQlJbkJ1ZlswXSA9IDIgKiBpOworCQlJbkJ1ZlsxXSA9IDI7CisJCUluQnVmWzJdID0gMHgwOworCisJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOworCQlpZiAoaSAlIDQgPT0gMCkKKwkJCXByaW50aygiXG5CbG9jayAleDoiLCBpIC8gOCk7CisJCXByaW50aygiJTA0eCAiLCBJbkJ1ZlsyXSk7CisJfQorCXJldHVybiBUUlVFOworfQorCitpbnQgcnRtcF9lZV9lZnVzZV9yZWFkMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHUxNiAqIHBWYWx1ZSkKK3sKKwllRnVzZVJlYWRSZWdpc3RlcnMocEFkLCBPZmZzZXQsIDIsIHBWYWx1ZSk7CisJcmV0dXJuICgqcFZhbHVlKTsKK30KKworaW50IFJ0bXBFZnVzZVN1cHBvcnRDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTE2IHZhbHVlOworCisJaWYgKElTX1JUMzB4eChwQWQpKSB7CisJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgRUZVU0VfVEFHLCAyLCAmdmFsdWUpOworCQlwQWQtPkVGdXNlVGFnID0gKHZhbHVlICYgMHhmZik7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGVGdXNlR2V0RnJlZUJsb2NrQ291bnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MzIgKkVmdXNlRnJlZUJsb2NrKQoreworCXUxNiBpOworCXUxNiBMb2dpY2FsQWRkcmVzczsKKwlpZiAoIXBBZC0+YlVzZUVmdXNlKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiZUZ1c2VHZXRGcmVlQmxvY2tDb3VudCBPbmx5IHN1cHBvcnRzIGVmdXNlIE1vZGVcbiIpKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGkgPD0gRUZVU0VfVVNBR0VfTUFQX0VORDsgaSArPSAyKSB7CisJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKKwkJaWYgKChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApIHsKKwkJCSpFZnVzZUZyZWVCbG9jayA9ICh1OCkoRUZVU0VfVVNBR0VfTUFQX0VORCAtIGkgKyAxKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCgoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKSB7CisJCQkqRWZ1c2VGcmVlQmxvY2sgPSAodTgpKEVGVVNFX1VTQUdFX01BUF9FTkQgLSBpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKKwkJCSpFZnVzZUZyZWVCbG9jayA9IDA7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJlRnVzZUdldEZyZWVCbG9ja0NvdW50IGlzIDB4JXhcbiIsICpFZnVzZUZyZWVCbG9jaykpOworfQorCitpbnQgZUZ1c2VfaW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTMyIEVmdXNlRnJlZUJsb2NrID0gMDsKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJICgiTlZNIGlzIEVmdXNlIGFuZCBpdHMgc2l6ZSA9JXhbJXgtJXhdIFxuIiwKKwkJICBFRlVTRV9VU0FHRV9NQVBfU0laRSwgRUZVU0VfVVNBR0VfTUFQX1NUQVJULAorCQkgIEVGVVNFX1VTQUdFX01BUF9FTkQpKTsKKwllRnVzZUdldEZyZWVCbG9ja0NvdW50KHBBZCwgJkVmdXNlRnJlZUJsb2NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfcHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZWVfcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODM3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZV9wcm9tLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJZWVfcHJvbS5jCisKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CisJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZQkiLi4vcnRfY29uZmlnLmgiCisKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCitzdGF0aWMgaW5saW5lIHZvaWQgUmFpc2VDbG9jayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUzMiAqIHgpCit7CisJKnggPSAqeCB8IEVFU0s7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworCVJUTVB1c2VjRGVsYXkoMSk7CS8qIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24gKi8KK30KKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBMb3dlckNsb2NrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTMyICogeCkKK3sKKwkqeCA9ICp4ICYgfkVFU0s7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOworCVJUTVB1c2VjRGVsYXkoMSk7Cit9CisKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCitzdGF0aWMgaW5saW5lIHUxNiBTaGlmdEluQml0cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTMyIHgsIGk7CisJdTE2IGRhdGEgPSAwOworCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKwl4ICY9IH4oRUVETyB8IEVFREkpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZGF0YSA9IGRhdGEgPDwgMTsKKwkJUmFpc2VDbG9jayhwQWQsICZ4KTsKKworCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwkJTG93ZXJDbG9jayhwQWQsICZ4KTsJLypwcmV2ZW50IHJlYWQgZmFpbGVkICovCisKKwkJeCAmPSB+KEVFREkpOworCQlpZiAoeCAmIEVFRE8pCisJCQlkYXRhIHw9IDE7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCitzdGF0aWMgaW5saW5lIHZvaWQgU2hpZnRPdXRCaXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQl1MTYgZGF0YSwgdTE2IGNvdW50KQoreworCXUzMiB4LCBtYXNrOworCisJbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisKKwl4ICY9IH4oRUVETyB8IEVFREkpOworCisJZG8geworCQl4ICY9IH5FRURJOworCQlpZiAoZGF0YSAmIG1hc2spCisJCQl4IHw9IEVFREk7CisKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwkJTG93ZXJDbG9jayhwQWQsICZ4KTsKKworCQltYXNrID0gbWFzayA+PiAxOworCX0gd2hpbGUgKG1hc2spOworCisJeCAmPSB+RUVESTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKK30KKworLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBFRXByb21DbGVhbnVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MzIgeDsKKworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOworCisJeCAmPSB+KEVFQ1MgfCBFRURJKTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKKworCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJTG93ZXJDbG9jayhwQWQsICZ4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEVXRU4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUzMiB4OworCisJLyogcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MgKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKwl4IHw9IEVFQ1M7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvKiBraWNrIGEgcHVsc2UgKi8KKwlSYWlzZUNsb2NrKHBBZCwgJngpOworCUxvd2VyQ2xvY2socEFkLCAmeCk7CisKKwkvKiBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlIGFuZCBzaXggcHVsc2UgaW4gdGhhdCBvcmRlciAqLworCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9FV0VOX09QQ09ERSwgNSk7CisJU2hpZnRPdXRCaXRzKHBBZCwgMCwgNik7CisKKwlFRXByb21DbGVhbnVwKHBBZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBFV0RTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1MzIgeDsKKworCS8qIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTICovCisJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7CisJeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7CisJeCB8PSBFRUNTOworCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOworCisJLyoga2ljayBhIHB1bHNlICovCisJUmFpc2VDbG9jayhwQWQsICZ4KTsKKwlMb3dlckNsb2NrKHBBZCwgJngpOworCisJLyogb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIgKi8KKwlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOworCVNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOworCisJRUVwcm9tQ2xlYW51cChwQWQpOworfQorCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworaW50IHJ0bXBfZWVfcHJvbV9yZWFkMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTE2IE9mZnNldCwgdTE2ICogcFZhbHVlKQoreworCXUzMiB4OworCXUxNiBkYXRhOworCisJT2Zmc2V0IC89IDI7CisJLyogcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MgKi8KKwlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKKwl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKKwl4IHw9IEVFQ1M7CisJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7CisKKwkvKiBwYXRjaCBjYW4gbm90IGFjY2VzcyBlLUZ1c2UgaXNzdWUgKi8KKwlpZiAoIShJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpIHsKKwkJLyoga2ljayBhIHB1bHNlICovCisJCVJhaXNlQ2xvY2socEFkLCAmeCk7CisJCUxvd2VyQ2xvY2socEFkLCAmeCk7CisJfQorCS8qIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHJlZ2lzdGVyIG51bWJlciBpbiB0aGF0IG9yZGVyICovCisJU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1JFQURfT1BDT0RFLCAzKTsKKwlTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7CisKKwkvKiBOb3cgcmVhZCB0aGUgZGF0YSAoMTYgYml0cykgaW4gZnJvbSB0aGUgc2VsZWN0ZWQgRUVQUk9NIHdvcmQgKi8KKwlkYXRhID0gU2hpZnRJbkJpdHMocEFkKTsKKworCUVFcHJvbUNsZWFudXAocEFkKTsKKworCSpwVmFsdWUgPSBkYXRhOworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCmluZGV4IGZmY2I0Y2UuLjk0NjcwMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2VlcHJvbS5jCkBAIC0zNiwxNDQ0ICszNiw1NiBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVZPSUQgUmFpc2VDbG9jaygKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiAgVUlOVDMyICp4KQoraW50IFJ0bXBDaGlwT3BzRWVwcm9tSG9vayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBpbmZUeXBlKQogewotICAgICp4ID0gKnggfCBFRVNLOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsICp4KTsKLSAgICBSVE1QdXNlY0RlbGF5KDEpOwkJCQkvLyBNYXggZnJlcXVlbmN5ID0gMU1IeiBpbiBTcGVjLiBkZWZpbml0aW9uCi19CisJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworI2lmZGVmIFJUMzB4eAorI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAorCXUzMiBlRnVzZUN0cmwsIE1hY0NzcjA7CisJaW50IGluZGV4OwogCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVk9JRCBMb3dlckNsb2NrKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBVSU5UMzIgKngpCi17Ci0gICAgKnggPSAqeCAmIH5FRVNLOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsICp4KTsKLSAgICBSVE1QdXNlY0RlbGF5KDEpOwotfQorCWluZGV4ID0gMDsKKwlkbyB7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKKwkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKIAotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVVTSE9SVCBTaGlmdEluQml0cygKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVSU5UMzIJCXgsaTsKLQlVU0hPUlQgICAgICBkYXRhPTA7Ci0KLSAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotICAgIHggJj0gfiggRUVETyB8IEVFREkpOwotCi0gICAgZm9yKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLSAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKLSAgICAgICAgUmFpc2VDbG9jayhwQWQsICZ4KTsKLQotICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotCUxvd2VyQ2xvY2socEFkLCAmeCk7IC8qIHByZXZlbnQgcmVhZCBmYWlsZWQgKi8KLQotICAgICAgICB4ICY9IH4oRUVESSk7Ci0gICAgICAgIGlmKHggJiBFRURPKQotICAgICAgICAgICAgZGF0YSB8PSAxOwotICAgIH0KLQotICAgIHJldHVybiBkYXRhOwotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVk9JRCBTaGlmdE91dEJpdHMoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVTSE9SVCBkYXRhLAotICAgIElOICBVU0hPUlQgY291bnQpCi17Ci0gICAgVUlOVDMyICAgICAgIHgsbWFzazsKLQotICAgIG1hc2sgPSAweDAxIDw8IChjb3VudCAtIDEpOwotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0gICAgeCAmPSB+KEVFRE8gfCBFRURJKTsKLQotICAgIGRvCi0gICAgewotICAgICAgICB4ICY9IH5FRURJOwotICAgICAgICBpZihkYXRhICYgbWFzaykJCXggfD0gRUVESTsKLQotICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotICAgICAgICBSYWlzZUNsb2NrKHBBZCwgJngpOwotICAgICAgICBMb3dlckNsb2NrKHBBZCwgJngpOwotCi0gICAgICAgIG1hc2sgPSBtYXNrID4+IDE7Ci0gICAgfSB3aGlsZShtYXNrKTsKLQotICAgIHggJj0gfkVFREk7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci19Ci0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1WT0lEIEVFcHJvbUNsZWFudXAoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0gICAgVUlOVDMyIHg7Ci0KLSAgICBSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotICAgIHggJj0gfihFRUNTIHwgRUVESSk7Ci0gICAgUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLSAgICBSYWlzZUNsb2NrKHBBZCwgJngpOwotICAgIExvd2VyQ2xvY2socEFkLCAmeCk7Ci19Ci0KLVZPSUQgRVdFTigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVSU5UMzIJeDsKLQotICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0gICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0gICAgeCB8PSBFRUNTOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotCi0gICAgLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKLSAgICBTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdFTl9PUENPREUsIDUpOwotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOwotCi0gICAgRUVwcm9tQ2xlYW51cChwQWQpOwotfQotCi1WT0lEIEVXRFMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0gICAgVUlOVDMyCXg7Ci0KLSAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUwotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOwotICAgIHggfD0gRUVDUzsKLSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCS8vIGtpY2sgYSBwdWxzZQotCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JTG93ZXJDbG9jayhwQWQsICZ4KTsKLQotICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyCi0gICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRFNfT1BDT0RFLCA1KTsKLSAgICBTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKLQotICAgIEVFcHJvbUNsZWFudXAocEFkKTsKLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVVTSE9SVCBSVE1QX0VFUFJPTV9SRUFEMTYoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVTSE9SVCBPZmZzZXQpCi17Ci0gICAgVUlOVDMyCQl4OwotICAgIFVTSE9SVAkJZGF0YTsKLQotI2lmZGVmIFJUMjg3MAotCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQotICAgIHsKLSAgICAJcEFkLT5FZXByb21BY2Nlc3MgPSBUUlVFOwotICAgIH0KLSNlbmRpZgotICAgIE9mZnNldCAvPSAyOwotICAgIC8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0gICAgUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0gICAgeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0gICAgeCB8PSBFRUNTOwotICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8gcGF0Y2ggY2FuIG5vdCBhY2Nlc3MgZS1GdXNlIGlzc3VlCi0gICAgaWYgKCFJU19SVDMwOTAocEFkKSkKLSAgICB7Ci0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotICAgIH0KLQotICAgIC8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHJlZ2lzdGVyIG51bWJlciBpbiB0aGF0IG9yZGVyCi0gICAgU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX1JFQURfT1BDT0RFLCAzKTsKLSAgICBTaGlmdE91dEJpdHMocEFkLCBPZmZzZXQsIHBBZC0+RUVQUk9NQWRkcmVzc051bSk7Ci0KLSAgICAvLyBOb3cgcmVhZCB0aGUgZGF0YSAoMTYgYml0cykgaW4gZnJvbSB0aGUgc2VsZWN0ZWQgRUVQUk9NIHdvcmQKLSAgICBkYXRhID0gU2hpZnRJbkJpdHMocEFkKTsKLQotICAgIEVFcHJvbUNsZWFudXAocEFkKTsKLQotI2lmZGVmIFJUMjg3MAotCS8vIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sCi0gICAgLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAvLyBUaGVuIHJlc3RvcmUgYW50ZW5uYSBhZnRlciBFRVBST00gYWNjZXNzCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApKQotICAgIHsKLQkgICAgcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLQkgICAgQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIGRhdGE7Ci19CS8vUmVhZEVFcHJvbQotCi1WT0lEIFJUTVBfRUVQUk9NX1dSSVRFMTYoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gIFVTSE9SVCBPZmZzZXQsCi0gICAgSU4gIFVTSE9SVCBEYXRhKQotewotICAgIFVJTlQzMiB4OwotCi0jaWZkZWYgUlQyODcwCi0JaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpCi0gICAgewotICAgIAlwQWQtPkVlcHJvbUFjY2VzcyA9IFRSVUU7Ci0gICAgfQotI2VuZGlmCi0JT2Zmc2V0IC89IDI7Ci0KLQlFV0VOKHBBZCk7Ci0KLSAgICAvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUwotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotICAgIHggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOwotICAgIHggfD0gRUVDUzsKLSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCS8vIHBhdGNoIGNhbiBub3QgYWNjZXNzIGUtRnVzZSBpc3N1ZQotICAgIGlmICghSVNfUlQzMDkwKHBBZCkpCi0gICAgewotCS8vIGtpY2sgYSBwdWxzZQotCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JTG93ZXJDbG9jayhwQWQsICZ4KTsKLSAgICB9Ci0KLSAgICAvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlICxyZWdpc3RlciBudW1iZXIgYW5kIGRhdGEgaW4gdGhhdCBvcmRlcgotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9XUklURV9PUENPREUsIDMpOwotICAgIFNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKLQlTaGlmdE91dEJpdHMocEFkLCBEYXRhLCAxNik7CQkvLyAxNi1iaXQgYWNjZXNzCi0KLSAgICAvLyByZWFkIERPIHN0YXR1cwotICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotCi0JUlRNUHVzZWNEZWxheSgxMDAwMCk7CS8vZGVsYXkgZm9yIHR3cChNQVgpPTEwbXMKLQotCUVXRFMocEFkKTsKLQotICAgIEVFcHJvbUNsZWFudXAocEFkKTsKLQotI2lmZGVmIFJUMjg3MAotCS8vIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sCi0gICAgLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLSAgICAvLyBUaGVuIHJlc3RvcmUgYW50ZW5uYSBhZnRlciBFRVBST00gYWNjZXNzCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApKQotICAgIHsKLQkgICAgcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLQkgICAgQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLSNpZmRlZiBSVDI4NzAKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUNIQVIgZUZ1c2VSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCS8vU3RlcDAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JLy9Vc2UgdGhlIGVlcHJvbSBsb2dpY2FsIGFkZHJlc3MgYW5kIGNvdmVydCB0byBhZGRyZXNzIHRvIGJsb2NrIG51bWJlcgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkvL1N0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMC4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDA7Ci0KLQkvL1N0ZXAyLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHJlYWQgcHJvY2VkdXJlLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JLy9TdGVwMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLgotCWkgPSAwOwotCXdoaWxlKGkgPCAxMDApCi0JewotCQkvL3J0bXAuSHdNZW1vcnlSZWFkRHdvcmQoRUZVU0VfQ1RSTCwgKERXT1JEICopICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCVJUTVB1c2VjRGVsYXkoMik7Ci0JCWkrKzsKLQl9Ci0KLQkvL2lmIEVGU1JPTV9BT1VUIGlzIG5vdCBmb3VuZCBpbiBwaHlzaWNhbCBhZGRyZXNzLCB3cml0ZSAweGZmZmYKLQlpZiAoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQgPT0gMHgzZikKLQl7Ci0JCWZvcihpPTA7IGk8TGVuZ3RoLzI7IGkrKykKLQkJCSoocERhdGErMippKSA9IDB4ZmZmZjsKLQl9Ci0JZWxzZQotCXsKLQkJLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5MC0weDU5QykKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzIC0gKE9mZnNldCAmIDB4QykgIDsKLQkJLy9kYXRhIGhvbGQgNCBieXRlcyBkYXRhLgotCQkvL0luIFJUTVBfSU9fUkVBRDMyIHdpbGwgYXV0b21hdGljYWxseSBleGVjdXRlIDMyLWJ5dGVzIHN3YXBwaW5nCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAmZGF0YSk7Ci0JCS8vRGVjaWRlIHRoZSB1cHBlciAyIGJ5dGVzIG9yIHRoZSBib3R0b20gMiBieXRlcy4KLQkJLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCQkvLyBhZGRyCTMJMgkxCTAJfAkwCTEJMgkzCi0JCS8vIE9yaS1WCUQJQwlCCUEJfAlBCUIJQwlECi0JCS8vQWZ0ZXIgc3dhcHBpbmcKLQkJLy8JCUQJQwlCCUEJfAlECUMJQglBCi0JCS8vUmV0dXJuIDItYnl0ZXMKLQkJLy9UaGUgcmV0dXJuIGJ5dGUgc3RhdHJzIGZyb20gUy4gVGhlcmVmb3JlLCB0aGUgbGl0dGxlLWVuZGlhbiB3aWxsIHJldHVybiBCQSwgdGhlIEJpZy1lbmRpYW4gd2lsbCByZXR1cm4gREMuCi0JCS8vRm9yIHJldHVybmluZyB0aGUgYm90dG9tIDIgYnl0ZXMsIHRoZSBCaWctZW5kaWFuIHNob3VsZCBzaGlmdCByaWdodCAyLWJ5dGVzLgotCQlkYXRhID0gZGF0YSA+PiAoOCooT2Zmc2V0ICYgMHgzKSk7Ci0KLQkJTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOwotCX0KLQotCXJldHVybiAoVUNIQVIpIGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BT1VUOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBlRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpCi17Ci0JRUZVU0VfQ1RSTF9TVFJVQwkJZUZ1c2VDdHJsU3RydWM7Ci0JaW50CWk7Ci0JVVNIT1JUCWVmdXNlRGF0YU9mZnNldDsKLQlVSU5UMzIJZGF0YTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkvL1N0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4KLQkvL1JlYWQgaW4gcGh5c2ljYWwgdmlldwotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMTsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDEwMCkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQlicmVhazsKLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vU3RlcDQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JLy9CZWNhdXNlIHRoZSBzaXplIG9mIGVhY2ggRUZVU0VfREFUQSBpcyA0IEJ5dGVzLCB0aGUgc2l6ZSBvZiBhZGRyZXNzIG9mIGVhY2ggaXMgMiBiaXRzLgotCS8vVGhlIHByZXZpb3VzIDIgYml0cyBpcyB0aGUgRUZVU0VfREFUQSBudW1iZXIsIHRoZSBsYXN0IDIgYml0cyBpcyB1c2VkIHRvIGRlY2lkZSB3aGljaCBieXRlcwotCS8vRGVjaWRlIHdoaWNoIEVGVVNFX0RBVEEgdG8gcmVhZAotCS8vNTkwOkYgRSBEIEMKLQkvLzU5NDpCIEEgOSA4Ci0JLy81OTg6NyA2IDUgNAotCS8vNTlDOjMgMiAxIDAKLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTMgLSAoT2Zmc2V0ICYgMHhDKSAgOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsICZkYXRhKTsKLQotCWRhdGEgPSBkYXRhID4+ICg4KihPZmZzZXQgJiAweDMpKTsKLQotCU5kaXNNb3ZlTWVtb3J5KHBEYXRhLCAmZGF0YSwgTGVuZ3RoKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgZUZ1c2VSZWFkUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gIAlJTglQVVNIT1JUIGxwSW5CdWZmZXIsCi0gIAlJTglVTE9ORyBuSW5CdWZmZXJTaXplLAotICAJT1VUCVBVU0hPUlQgbHBPdXRCdWZmZXIsCi0gIAlJTglVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKQotewotCVVTSE9SVCogcEluQnVmID0gKFVTSE9SVCopbHBJbkJ1ZmZlcjsKLQlVU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilscE91dEJ1ZmZlcjsKLQotCVVTSE9SVCBPZmZzZXQgPSBwSW5CdWZbMF07CQkJCQkvL2FkZHIKLQlVU0hPUlQgTGVuZ3RoID0gcEluQnVmWzFdOwkJCQkJLy9sZW5ndGgKLQlpbnQgCQlpOwotCi0JZm9yKGk9MDsgaTxMZW5ndGg7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsT2Zmc2V0K2ksIDIsICZwT3V0QnVmW2kvMl0pOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1OVFNUQVRVUyBlRnVzZVJlYWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlMZW5ndGgpCi17Ci0JVVNIT1JUKiBwT3V0QnVmID0gKFVTSE9SVCopcERhdGE7Ci0JTlRTVEFUVVMJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JVUNIQVIJRUZTUk9NX0FPVVQ7Ci0JaW50CWk7Ci0KLQlmb3IoaT0wOyBpPExlbmd0aDsgaSs9MikKLQl7Ci0JCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgT2Zmc2V0K2ksIDIsICZwT3V0QnVmW2kvMl0pOwotCX0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgZUZ1c2VQaHlzaWNhbFdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhLCBlRnVzZURhdGFCdWZmZXJbNF07Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxNi1ieXRlIG9mIGRhdGEgdG8gRUZVU0VfREFUQTAtMyAoMHg1OTAtMHg1OUMpLCB3aGVyZSBFRlVTRV9EQVRBMCBpcyB0aGUgTFNCIERXLCBFRlVTRV9EQVRBMyBpcyB0aGUgTVNCIERXLgotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvL3JlYWQgY3VycmVudCB2YWx1ZXMgb2YgMTYtYnl0ZSBibG9jawotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkvL1N0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDE7Ci0KLQkvL1N0ZXAyLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHJlYWQgcHJvY2VkdXJlLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JLy9TdGVwMy4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLgotCWkgPSAwOwotCXdoaWxlKGkgPCAxMDApCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQlicmVhazsKLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLQotCS8vU3RlcDQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzOwotCWZvcihpPTA7IGk8IDQ7IGkrKykKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAoUFVJTlQzMikgJmVGdXNlRGF0YUJ1ZmZlcltpXSk7Ci0JCWVmdXNlRGF0YU9mZnNldCAtPSAgNDsKLQl9Ci0KLQkvL1VwZGF0ZSB0aGUgdmFsdWUsIHRoZSBvZmZzZXQgaXMgbXVsdGlwbGUgb2YgMiwgbGVuZ3RoIGlzIDIKLQllZnVzZURhdGFPZmZzZXQgPSAoT2Zmc2V0ICYgMHhjKSA+PiAyOwotCWRhdGEgPSBwRGF0YVswXSAmIDB4ZmZmZjsKLQkvL1RoZSBvZmZzZXQgc2hvdWxkIGJlIDB4KioqMTAgb3IgMHgqKiowMAotCWlmKChPZmZzZXQgJSA0KSAhPSAwKQotCXsKLQkJZUZ1c2VEYXRhQnVmZmVyW2VmdXNlRGF0YU9mZnNldF0gPSAoZUZ1c2VEYXRhQnVmZmVyW2VmdXNlRGF0YU9mZnNldF0gJiAweGZmZmYpIHwgKGRhdGEgPDwgMTYpOwotCX0KLQllbHNlCi0JewotCQllRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSA9IChlRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSAmIDB4ZmZmZjAwMDApIHwgZGF0YTsKLQl9Ci0KLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTM7Ci0JZm9yKGk9MDsgaTwgNDsgaSsrKQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCBlRnVzZURhdGFCdWZmZXJbaV0pOwotCQllZnVzZURhdGFPZmZzZXQgLT0gNDsKLQl9Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCS8vU3RlcDEuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAzLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMzsKLQotCS8vU3RlcDMuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgd3JpdGUgcHJvY2VkdXJlLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JLy9TdGVwNC4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLiBJdO+/ve+/vXMgZG9uZS4KLQlpID0gMDsKLQl3aGlsZShpIDwgMTAwKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQorCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKQorCQkgICAgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKIAkJCWJyZWFrOwogCi0JCVJUTVB1c2VjRGVsYXkoMik7Ci0JCWkrKzsKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7CisKKwlwQWQtPmJVc2VFZnVzZSA9IEZBTFNFOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybCk7CisJcEFkLT5iVXNlRWZ1c2UgPSAoKGVGdXNlQ3RybCAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApID8gMSA6IDA7CisJaWYgKHBBZC0+YlVzZUVmdXNlKSB7CisJCXBDaGlwT3BzLT5lZWluaXQgPSBlRnVzZV9pbml0OworCQlwQ2hpcE9wcy0+ZWVyZWFkID0gcnRtcF9lZV9lZnVzZV9yZWFkMTY7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOVk0gaXMgRUVQUk9NXG4iKSk7CisjZW5kaWYgLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKwlzd2l0Y2ggKGluZlR5cGUpIHsKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJY2FzZSBSVE1QX0RFVl9JTkZfUENJOgorCQlwQ2hpcE9wcy0+ZWVpbml0ID0gTlVMTDsKKwkJcENoaXBPcHMtPmVlcmVhZCA9IHJ0bXBfZWVfcHJvbV9yZWFkMTY7CisJCWJyZWFrOworI2VuZGlmIC8qIFJUTVBfUENJX1NVUFBPUlQgLy8gKi8KKyNpZmRlZiBSVE1QX1VTQl9TVVBQT1JUCisJY2FzZSBSVE1QX0RFVl9JTkZfVVNCOgorCQlwQ2hpcE9wcy0+ZWVpbml0ID0gTlVMTDsKKwkJcENoaXBPcHMtPmVlcmVhZCA9IFJUVVNCUmVhZEVFUFJPTTE2OworCQlicmVhazsKKyNlbmRpZiAvKiBSVE1QX1VTQl9TVVBQT1JUIC8vICovCisKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSdG1wQ2hpcE9wc0VlcHJvbUhvb2soKSBmYWlsZWQhXG4iKSk7CisJCWJyZWFrOwogCX0KKworCXJldHVybiAwOwogfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCUlOCVVTSE9SVCogcERhdGEpCi17Ci0JVVNIT1JUCWk7Ci0JVVNIT1JUCWVGdXNlRGF0YTsKLQlVU0hPUlQJTG9naWNhbEFkZHJlc3MsIEJsa051bSA9IDB4ZmZmZjsKLQlVQ0hBUglFRlNST01fQU9VVDsKLQotCVVTSE9SVCBhZGRyLHRtcGFkZHIsIEluQnVmWzNdLCB0bXBPZmZzZXQ7Ci0JVVNIT1JUIGJ1ZmZlcls4XTsKLQlCT09MRUFOCQliV3JpdGVTdWNjZXNzID0gVFJVRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgT2Zmc2V0PSV4LCBwRGF0YT0leFxuIiwgT2Zmc2V0LCAqcERhdGEpKTsKLQotCS8vU3RlcCAwLiBmaW5kIHRoZSBlbnRyeSBpbiB0aGUgbWFwcGluZyB0YWJsZQotCS8vVGhlIGFkZHJlc3Mgb2YgRUVQUk9NIGlzIDItYnl0ZXMgYWxpZ25tZW50LgotCS8vVGhlIGxhc3QgYml0IGlzIHVzZWQgZm9yIGFsaWdubWVudCwgc28gaXQgbXVzdCBiZSAwLgotCXRtcE9mZnNldCA9IE9mZnNldCAmIDB4ZmZmZTsKLQlFRlNST01fQU9VVCA9IGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIHRtcE9mZnNldCwgMiwgJmVGdXNlRGF0YSk7Ci0KLQlpZiggRUZTUk9NX0FPVVQgPT0gMHgzZikKLQl7CS8vZmluZCBhdmFpbGFibGUgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJLy90aGUgbG9naWNhbCBhZGRyZXNzIGRvZXMgbm90IGV4aXN0LCBmaW5kIGFuIGVtcHR5IG9uZQotCQkvL2Zyb20gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgYmxvY2sgNDU9MTYqNDU9MHgyZDAgdG8gdGhlIGxhc3QgYWRkcmVzcyBvZiBibG9jayA0NwotCQkvLz09PjQ4KjE2LTMocmVzZXJ2ZWQpPTJGQwotCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQl7Ci0JCQkvL1JldHJpdmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVibWVyIGZvcm0gZWFjaCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJLy9JdCB3aWxsIGFjY2VzcyB0d28gbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIgZWFjaCB0aW1lLgotCQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQl7Ly9Ob3QgdXNlZCBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkJCWlmIChpICE9IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVCsxOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlCbGtOdW0gPSBFRlNST01fQU9VVDsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzIEJsa051bSA9ICVkIFxuIiwgQmxrTnVtKSk7Ci0KLQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyczogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvL1N0ZXAgMS4gU2F2ZSBkYXRhIG9mIHRoaXMgYmxvY2sJd2hpY2ggaXMgcG9pbnRlZCBieSB0aGUgYXZhaWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCS8vIHJlYWQgYW5kIHNhdmUgdGhlIG9yaWdpbmFsIGJsb2NrIGRhdGEKLQlmb3IoaSA9MDsgaTw4OyBpKyspCi0JewotCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJSW5CdWZbMF0gPSBhZGRyKzIqaTsKLQkJSW5CdWZbMV0gPSAyOwotCQlJbkJ1ZlsyXSA9IDB4MDsKLQotCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQotCQlidWZmZXJbaV0gPSBJbkJ1ZlsyXTsKLQl9Ci0KLQkvL1N0ZXAgMi4gVXBkYXRlIHRoZSBkYXRhIGluIGJ1ZmZlciwgYW5kIHdyaXRlIHRoZSBkYXRhIHRvIEVmdXNlCi0JYnVmZmVyWyAoT2Zmc2V0ID4+IDEpICUgOF0gPSBwRGF0YVswXTsKLQotCWRvCi0JewotCQkvL1N0ZXAgMy4gV3JpdGUgdGhlIGRhdGEgdG8gRWZ1c2UKLQkJaWYoIWJXcml0ZVN1Y2Nlc3MpCi0JCXsKLQkJCWZvcihpID0wOyBpPDg7IGkrKykKLQkJCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IGJ1ZmZlcltpXTsKLQotCQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQkJSW5CdWZbMF0gPSBhZGRyKyhPZmZzZXQgJSAxNik7Ci0JCQkJSW5CdWZbMV0gPSAyOwotCQkJCUluQnVmWzJdID0gcERhdGFbMF07Ci0KLQkJCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDIpOwotCQl9Ci0KLQkJLy9TdGVwIDQuIFdyaXRlIG1hcHBpbmcgdGFibGUKLQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCWFkZHIgPSBhZGRyIC0xOwotCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCUluQnVmWzFdID0gMjsKLQotCQkvL2NvbnZlcnQgdGhlIGFkZHJlc3MgZnJvbSAxMCB0byA4IGJpdCAoIGJpdDcsIDYgPSBwYXJpdHkgYW5kIGJpdDUgfiAwID0gYml0OX40KSwgYW5kIHdyaXRlIHRvIGxvZ2ljYWwgbWFwIGVudHJ5Ci0JCXRtcE9mZnNldCA9IE9mZnNldDsKLQkJdG1wT2Zmc2V0ID4+PSA0OwotCQl0bXBPZmZzZXQgfD0gKCh+KCh0bXBPZmZzZXQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDEgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSkpIDw8IDYpICYgMHg0MDsKLQkJdG1wT2Zmc2V0IHw9ICgofiggKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gNCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gNSAmIDB4MDEpKSkgPDwgNykgJiAweDgwOwotCi0JCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJaWYodG1wYWRkciUyICE9IDApCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDw8ODsKLQkJZWxzZQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ7Ci0KLQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCi0JCS8vU3RlcCA1LiBDb21wYXJlIGRhdGEgaWYgbm90IHRoZSBzYW1lLCBpbnZhbGlkYXRlIHRoZSBtYXBwaW5nIGVudHJ5LCB0aGVuIHJlLXdyaXRlIHRoZSBkYXRhIHVudGlsIEUtZnVzZSBpcyBleGhhdXN0ZWQKLQkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JCWZvcihpID0wOyBpPDg7IGkrKykKLQkJewotCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJSW5CdWZbMV0gPSAyOwotCQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQlpZihidWZmZXJbaV0gIT0gSW5CdWZbMl0pCi0JCQl7Ci0JCQkJYldyaXRlU3VjY2VzcyA9IEZBTFNFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy9TdGVwIDYuIGludmxpZGF0ZSBtYXBwaW5nIGVudHJ5IGFuZCBmaW5kIGEgZnJlZSBtYXBwaW5nIGVudHJ5IGlmIG5vdCBzdWNjZWVkCi0JCWlmICghYldyaXRlU3VjY2VzcykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGJXcml0ZVN1Y2Nlc3MgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCi0JCQkvLyB0aGUgb2Zmc2V0IG9mIGN1cnJlbnQgbWFwcGluZyBlbnRyeQotCQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJCS8vZmluZCBhIG5ldyBtYXBwaW5nIGVudHJ5Ci0JCQlCbGtOdW0gPSAweGZmZmY7Ci0JCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQkJewotCQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCQl7Ci0JCQkJCQlCbGtOdW0gPSBpKzEtRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBiV3JpdGVTdWNjZXNzIG5ldyBCbGtOdW0gPSAlZFxuIiwgQmxrTnVtKSk7Ci0JCQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnM6IG91dCBvZiBmcmVlIEUtZnVzZSBzcGFjZSEhIVxuIikpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQotCQkJLy9pbnZhbGlkYXRlIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGVudHJ5IGlmIG5ldyBlbnRyeSBpcyBub3QgZm91bmQKLQkJCXRtcGFkZHIgPSBhZGRyOwotCi0JCQlpZihhZGRyICUgMiAhPSAwKQotCQkJCWFkZHIgPSBhZGRyIC0xOwotCQkJSW5CdWZbMF0gPSBhZGRyOwotCQkJSW5CdWZbMV0gPSAyOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQotCQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQkJaWYodG1wYWRkciUyICE9IDApCi0JCQl7Ci0JCQkJLy8gSW52YWxpZGF0ZSB0aGUgaGlnaCBieXRlCi0JCQkJZm9yIChpPTg7IGk8MTU7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGludmFsaWRhdGUgdGhlIGxvdyBieXRlCi0JCQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCQl9Ci0JfQotCXdoaWxlKCFiV3JpdGVTdWNjZXNzKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgZUZ1c2VXcml0ZVBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotICAJUFVTSE9SVCBscEluQnVmZmVyLAotCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0gIAlQVUNIQVIgbHBPdXRCdWZmZXIsCi0gIAlVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKQotewotCVVTSE9SVCogcEluQnVmID0gKFVTSE9SVCopbHBJbkJ1ZmZlcjsKLQlpbnQgCQlpOwotCS8vVVNIT1JUKiBwT3V0QnVmID0gKFVTSE9SVCopaW9CdWZmZXI7Ci0KLQlVU0hPUlQgT2Zmc2V0ID0gcEluQnVmWzBdOwkJCQkJLy9hZGRyCi0JVVNIT1JUIExlbmd0aCA9IHBJbkJ1ZlsxXTsJCQkJCS8vbGVuZ3RoCi0JVVNIT1JUKiBwVmFsdWVYID0gJnBJbkJ1ZlsyXTsJCQkJLy92YWx1ZSAuLi4KLQkJLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCQkvLyBhZGRyCTMJMgkxCTAJfAkwCTEJMgkzCi0JCS8vIE9yaS1WCUQJQwlCCUEJfAlBCUIJQwlECi0JCS8vQWZ0ZXIgc3dhcHBpbmcKLQkJLy8JCUQJQwlCCUEJfAlECUMJQglBCi0JCS8vQm90aCB0aGUgbGl0dGxlIGFuZCBiaWctZW5kaWFuIHVzZSB0aGUgc2FtZSBzZXF1ZW5jZSB0byB3cml0ZSAgZGF0YS4KLQkJLy9UaGVyZWZvcmUsIHdlIG9ubHkgbmVlZCBzd2FwIGRhdGEgd2hlbiByZWFkIHRoZSBkYXRhLgotCWZvcihpPTA7IGk8TGVuZ3RoOyBpKz0yKQotCXsKLQkJZUZ1c2VQaHlzaWNhbFdyaXRlUmVnaXN0ZXJzKHBBZCwgT2Zmc2V0K2ksIDIsICZwVmFsdWVYW2kvMl0pOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlV3JpdGUoCi0gICAJSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKLXsKLQlpbnQgaTsKLQotCVVTSE9SVCogcFZhbHVlWCA9IChQVVNIT1JUKSBwRGF0YTsJCQkJLy92YWx1ZSAuLi4KLQkJLy9UaGUgaW5wdXQgdmFsdWU9MzA3MCB3aWxsIGJlIHN0b3JlZCBhcyBmb2xsb3dpbmcKLSAJCS8vIExpdHRsZS1lbmRpYW4JCVMJfAlTCUJpZy1lbmRpYW4KLQkJLy8gYWRkcgkJCTEJMAl8CTAJMQotCQkvLyBPcmktVgkJCTMwCTcwCXwJMzAJNzAKLQkJLy9BZnRlciBzd2FwcGluZwotCQkvLwkJCQkzMAk3MAl8CTcwCTMwCi0JCS8vQ2FzdGluZwotCQkvLwkJCQkzMDcwCXwJNzAzMCAoeCkKLQkJLy9UaGUgc3dhcHBpbmcgc2hvdWxkIGJlIHJlbW92ZWQgZm9yIGJpZy1lbmRpYW4KLQlmb3IoaT0wOyBpPGxlbmd0aDsgaSs9MikKLQl7Ci0JCWVGdXNlV3JpdGVSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBWYWx1ZVhbaS8yXSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIHNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2MoCi0gICAJSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVTSE9SVCBpOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzczsKLQlVU0hPUlQgZWZ1c2VmcmVlbnVtPTA7Ci0JaWYoIXBBZC0+YlVzZUVmdXNlKQotCQlyZXR1cm4gRkFMU0U7Ci0JZm9yIChpID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpIDw9IEVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQllZnVzZWZyZWVudW09IChVQ0hBUikgKEVGVVNFX1VTQUdFX01BUF9FTkQtaSsxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQl7Ci0JCQllZnVzZWZyZWVudW0gPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZihpID09IEVGVVNFX1VTQUdFX01BUF9FTkQpCi0JCQllZnVzZWZyZWVudW0gPSAwOwotCX0KLQlwcmludGsoImVmdXNlRnJlZU51bWJlciBpcyAlZFxuIixlZnVzZWZyZWVudW0pOwotCXJldHVybiBUUlVFOwotfQotSU5UIHNldF9lRnVzZWR1bXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci1VU0hPUlQgSW5CdWZbM107Ci0JSU5UIGk9MDsKLQlpZighcEFkLT5iVXNlRWZ1c2UpCi0JCXJldHVybiBGQUxTRTsKLQlmb3IoaSA9MDsgaTxFRlVTRV9VU0FHRV9NQVBfRU5ELzI7IGkrKykKLQl7Ci0JCUluQnVmWzBdID0gMippOwotCQlJbkJ1ZlsxXSA9IDI7Ci0JCUluQnVmWzJdID0gMHgwOwotCi0JCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCQlpZihpJTQ9PTApCi0JCXByaW50aygiXG5CbG9jayAleDoiLGkvOCk7Ci0JCXByaW50aygiJTA0eCAiLEluQnVmWzJdKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci1JTlQJc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpCi17Ci0JQ0hBUgkJCQkJKnNyYzsKLQlzdHJ1Y3QgZmlsZQkJCQkqc3JjZjsKLQlJTlQgCQkJCQlyZXR2YWw7Ci0gICAJbW1fc2VnbWVudF90CQkJb3JnZnM7Ci0JVUNIQVIJCQkJCSpidWZmZXI7Ci0JVUNIQVIJCQkJCUJpbkZpbGVTaXplPTA7Ci0JSU5UCQkJCQkJaSA9IDAsaj0wLGs9MTsKLQlVU0hPUlQJCQkJCSpQREFUQTsKLQlVU0hPUlQJCQkJCURBVEE7Ci0JQmluRmlsZVNpemU9c3RybGVuKCJSVDMweHhFRVBST00uYmluIik7Ci0Jc3JjID0ga21hbGxvYygxMjgsIE1FTV9BTExPQ19GTEFHKTsKLQlOZGlzWmVyb01lbW9yeShzcmMsIDEyOCk7Ci0KLSAJaWYoc3RybGVuKGFyZyk+MCkKLQl7Ci0KLQkJTmRpc01vdmVNZW1vcnkoc3JjLCBhcmcsIHN0cmxlbihhcmcpKTsKLSAJfQotCi0JZWxzZQotCXsKLQotCQlOZGlzTW92ZU1lbW9yeShzcmMsICJSVDMweHhFRVBST00uYmluIiwgQmluRmlsZVNpemUpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpbGVOYW1lPSVzXG4iLHNyYykpOwotCWJ1ZmZlciA9IGttYWxsb2MoTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0KLQlpZihidWZmZXIgPT0gTlVMTCkKLQl7Ci0JCWtmcmVlKHNyYyk7Ci0JCSByZXR1cm4gRkFMU0U7Ci19Ci0JUERBVEE9a21hbGxvYyhzaXplb2YoVVNIT1JUKSo4LE1FTV9BTExPQ19GTEFHKTsKLQotCWlmKFBEQVRBPT1OVUxMKQotCXsKLQkJa2ZyZWUoc3JjKTsKLQotCQlrZnJlZShidWZmZXIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0gICAgCW9yZ2ZzID0gZ2V0X2ZzKCk7Ci0gICAJIHNldF9mcyhLRVJORUxfRFMpOwotCi0JaWYgKHNyYyAmJiAqc3JjKQotCXsKLQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKLQkJaWYgKElTX0VSUihzcmNmKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLQkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCi0JCQl7Ci0JCQkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKTsKLQkJCQl3aGlsZShzcmNmLT5mX29wLT5yZWFkKHNyY2YsICZidWZmZXJbaV0sIDEsICZzcmNmLT5mX3Bvcyk9PTEpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlMDJYICIsYnVmZmVyW2ldKSk7Ci0JCQkJCWlmKChpKzEpJTg9PTApCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbiIpKTsKLSAgICAgICAgICAgICAgCQkJaSsrOwotCQkJCQkJaWYoaT49TUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKQotCQkJCQkJCXsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCByZWFkaW5nICVzLCBUaGUgZmlsZSBpcyB0b28gbGFyZ2VbMTAyNF1cbiIsIC1QVFJfRVJSKHNyY2YpLHNyYykpOwotCQkJCQkJCQlrZnJlZShQREFUQSk7Ci0JCQkJCQkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQkJCQkJCWtmcmVlKHNyYyk7Ci0JCQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJCQl9Ci0JCQkgICAgICAgfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yISEgU3lzdGVtIGRvZXN0IG5vdCBzdXBwb3J0IHJlYWQgZnVuY3Rpb25cbiIpKTsKLQkJCQkJCWtmcmVlKFBEQVRBKTsKLQkJCQkJCWtmcmVlKGJ1ZmZlcik7Ci0JCQkJCQlrZnJlZShzcmMpOwotCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotICAgICAgCQl9Ci0KLQotCX0KLQllbHNlCi0JCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yIHNyYyAgb3Igc3JjZiBpcyBudWxsXG4iKSk7Ci0JCQkJCWtmcmVlKFBEQVRBKTsKLQkJCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCi0JCX0KLQotCi0JcmV0dmFsPWZpbHBfY2xvc2Uoc3JjZixOVUxMKTsKLQotCWlmIChyZXR2YWwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0JfQotCXNldF9mcyhvcmdmcyk7Ci0KLQlmb3Ioaj0wO2o8aTtqKyspCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlMDJYICIsYnVmZmVyW2pdKSk7Ci0JCWlmKChqKzEpJTI9PTApCi0JCQlQREFUQVtqLzIlOF09KChidWZmZXJbal08PDgpJjB4ZmYwMCl8KGJ1ZmZlcltqLTFdJjB4ZmYpOwotCQlpZihqJTE2PT0wKQotCQl7Ci0JCQlrPWJ1ZmZlcltqXTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWsmPWJ1ZmZlcltqXTsKLQkJCWlmKChqKzEpJTE2PT0wKQotCQkJewotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHJlc3VsdD0lMDJYLGJsaz0lMDJ4XG4iLGssai8xNikpOwotCi0JCQkJaWYoayE9MHhmZikKLQkJCQkJZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4ocEFkLChVU0hPUlQpai0xNSwgMTYsIFBEQVRBKTsKLQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmKGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsaiwgMiwoUFVTSE9SVCkmREFUQSkhPTB4M2YpCi0JCQkJCQkJZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4ocEFkLChVU0hPUlQpai0xNSwgMTYsIFBEQVRBKTsKLQkJCQkJfQotCQkJCS8qCi0JCQkJZm9yKGw9MDtsPDg7bCsrKQotCQkJCQlwcmludGsoIiUwNHggIixQREFUQVtsXSk7Ci0JCQkJcHJpbnRrKCJcbiIpOwotCQkJCSovCi0JCQkJTmRpc1plcm9NZW1vcnkoUERBVEEsMTYpOwotCi0KLQkJCX0KLQkJfQotCi0KLQl9Ci0KLQotCWtmcmVlKFBEQVRBKTsKLQlrZnJlZShidWZmZXIpOwotCWtmcmVlKHNyYyk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci1OVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSkKLXsKLQlVU0hPUlQJaTsKLQlVU0hPUlQJZUZ1c2VEYXRhOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzcywgQmxrTnVtID0gMHhmZmZmOwotCVVDSEFSCUVGU1JPTV9BT1VULExvb3A9MDsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhLHRlbXBidWZmZXI7Ci0JVVNIT1JUIGFkZHIsdG1wYWRkciwgSW5CdWZbM10sIHRtcE9mZnNldDsKLQlVSU5UMzIgYnVmZmVyWzRdOwotCUJPT0xFQU4JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCUJPT0xFQU4JCWJOb3RXcml0ZT1UUlVFOwotCUJPT0xFQU4JCWJBbGxvY2F0ZU5ld0Jsaz1UUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4gT2Zmc2V0PSV4LCBwRGF0YT0lMDR4OiUwNHg6JTA0eDolMDR4XG4iLCBPZmZzZXQsICpwRGF0YSwqKHBEYXRhKzEpLCoocERhdGErMiksKihwRGF0YSszKSkpOwotCi0JZG8KLQl7Ci0JLy9TdGVwIDAuIGZpbmQgdGhlIGVudHJ5IGluIHRoZSBtYXBwaW5nIHRhYmxlCi0JLy9UaGUgYWRkcmVzcyBvZiBFRVBST00gaXMgMi1ieXRlcyBhbGlnbm1lbnQuCi0JLy9UaGUgbGFzdCBiaXQgaXMgdXNlZCBmb3IgYWxpZ25tZW50LCBzbyBpdCBtdXN0IGJlIDAuCi0JTG9vcCsrOwotCXRtcE9mZnNldCA9IE9mZnNldCAmIDB4ZmZmZTsKLQlFRlNST01fQU9VVCA9IGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIHRtcE9mZnNldCwgMiwgJmVGdXNlRGF0YSk7Ci0KLQlpZiggRUZTUk9NX0FPVVQgPT0gMHgzZikKLQl7CS8vZmluZCBhdmFpbGFibGUgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJLy90aGUgbG9naWNhbCBhZGRyZXNzIGRvZXMgbm90IGV4aXN0LCBmaW5kIGFuIGVtcHR5IG9uZQotCQkvL2Zyb20gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgYmxvY2sgNDU9MTYqNDU9MHgyZDAgdG8gdGhlIGxhc3QgYWRkcmVzcyBvZiBibG9jayA0NwotCQkvLz09PjQ4KjE2LTMocmVzZXJ2ZWQpPTJGQwotCQliQWxsb2NhdGVOZXdCbGs9VFJVRTsKLQkJZm9yIChpPUVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaTw9RUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQkJewotCQkJLy9SZXRyaXZlIHRoZSBsb2dpY2FsIGJsb2NrIG51Ym1lciBmb3JtIGVhY2ggbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCS8vSXQgd2lsbCBhY2Nlc3MgdHdvIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyIGVhY2ggdGltZS4KLQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQrMTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJYkFsbG9jYXRlTmV3QmxrPUZBTFNFOwotCQlCbGtOdW0gPSBFRlNST01fQU9VVDsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzIEJsa051bSA9ICVkIFxuIiwgQmxrTnVtKSk7Ci0KLQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyczogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JLy9TdGVwIDEuMS4wCi0JLy9JZiB0aGUgYmxvY2sgaXMgbm90IGV4aXN0aW5nIGluIG1hcHBpbmcgdGFibGUsIGNyZWF0ZSBvbmUKLQkvL2FuZCB3cml0ZSBkb3duIHRoZSAxNi1ieXRlcyBkYXRhIHRvIHRoZSBuZXcgYmxvY2sKLQlpZihiQWxsb2NhdGVOZXdCbGspCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSBOZXcgQmxrXG4iKSk7Ci0JCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQkJZm9yKGk9MDsgaTwgNDsgaSsrKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSBOZXcgQmxrLCBEYXRhJWQ9JTA0eCUwNHhcbiIsMy1pLHBEYXRhWzIqaSsxXSxwRGF0YVsyKmldKSk7Ci0JCQl0ZW1wYnVmZmVyPSgocERhdGFbMippKzFdPDwxNikmMHhmZmZmMDAwMCl8cERhdGFbMippXTsKLQotCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsdGVtcGJ1ZmZlcik7Ci0JCQllZnVzZURhdGFPZmZzZXQgLT0gNDsKLQotCQl9Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkJLy9TdGVwMS4xLjEuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBCbGtOdW0qIDB4MTAgOwotCi0JCS8vU3RlcDEuMS4yLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMy4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAzOwotCi0JCS8vU3RlcDEuMS4zLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHdyaXRlIHByb2NlZHVyZS4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JCS8vU3RlcDEuMS40LiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uIEl077+977+9cyBkb25lLgotCQlpID0gMDsKLQkJd2hpbGUoaSA8IDEwMCkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAoUFVJTlQzMikgJmVGdXNlQ3RybFN0cnVjKTsKLQotCQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJCWkrKzsKLQkJfQotCi0JfQotCWVsc2UKLQl7CS8vU3RlcDEuMi4KLQkJLy9JZiB0aGUgc2FtZSBsb2dpY2FsIG51bWJlciBpcyBleGlzdGluZywgY2hlY2sgaWYgdGhlIHdyaXR0aW5nIGRhdGEgYW5kIHRoZSBkYXRhCi0JCS8vc2F2aW5nIGluIHRoaXMgYmxvY2sgYXJlIHRoZSBzYW1lLgotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvL3JlYWQgY3VycmVudCB2YWx1ZXMgb2YgMTYtYnl0ZSBibG9jawotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCS8vU3RlcDEuMi4wLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JCS8vU3RlcDEuMi4xLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4KLQkJZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAwOwotCi0JCS8vU3RlcDEuMi4yLiBXcml0ZSBFRlNST01fS0lDSyAoMHg1ODAsIGJpdDMwKSB0byAxIHRvIGtpY2stb2ZmIHBoeXNpY2FsIHJlYWQgcHJvY2VkdXJlLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQkJTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JCS8vU3RlcDEuMi4zLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JCWkgPSAwOwotCQl3aGlsZShpIDwgMTAwKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsIChQVUlOVDMyKSAmZUZ1c2VDdHJsU3RydWMpOwotCi0JCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJCWJyZWFrOwotCQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJCWkrKzsKLQkJfQotCi0JCS8vU3RlcDEuMi40LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTlDLTB4NTkwKQotCQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTM7Ci0JCWZvcihpPTA7IGk8IDQ7IGkrKykKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIChQVUlOVDMyKSAmYnVmZmVyW2ldKTsKLQkJCWVmdXNlRGF0YU9mZnNldCAtPSAgNDsKLQkJfQotCQkvL1N0ZXAxLjIuNS4gQ2hlY2sgaWYgdGhlIGRhdGEgb2YgZWZ1c2UgYW5kIHRoZSB3cml0aW5nIGRhdGEgYXJlIHRoZSBzYW1lLgotCQlmb3IoaSA9MDsgaTw0OyBpKyspCi0JCXsKLQkJCXRlbXBidWZmZXI9KChwRGF0YVsyKmkrMV08PDE2KSYweGZmZmYwMDAwKXxwRGF0YVsyKmldOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYnVmZmVyWyVkXT0leCxwRGF0YVslZF09JXgscERhdGFbJWRdPSV4LHRlbXBidWZmZXI9JXhcbiIsaSxidWZmZXJbaV0sMippLHBEYXRhWzIqaV0sMippKzEscERhdGFbMippKzFdLHRlbXBidWZmZXIpKTsKLQotCQkJaWYoKChidWZmZXJbaV0mMHhmZmZmMDAwMCk9PShwRGF0YVsyKmkrMV08PDE2KSkmJigoYnVmZmVyW2ldJjB4ZmZmZik9PXBEYXRhWzIqaV0pKQotCQkJCWJOb3RXcml0ZSY9VFJVRTsKLQkJCWVsc2UKLQkJCXsKLQkJCQliTm90V3JpdGUmPUZBTFNFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmKCFiTm90V3JpdGUpCi0JCXsKLQkJcHJpbnRrKCJUaGUgZGF0YSBpcyBub3QgdGhlIHNhbWVcbiIpOwotCi0JCQlmb3IoaSA9MDsgaTw4OyBpKyspCi0JCQl7Ci0JCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQkJSW5CdWZbMF0gPSBhZGRyKzIqaTsKLQkJCQlJbkJ1ZlsxXSA9IDI7Ci0JCQkJSW5CdWZbMl0gPSBwRGF0YVtpXTsKLQotCQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMik7Ci0JCQl9Ci0KLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gVFJVRTsKLQkgICAgIH0KLQotCi0KLQkJLy9TdGVwIDIuIFdyaXRlIG1hcHBpbmcgdGFibGUKLQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCWFkZHIgPSBhZGRyIC0xOwotCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCUluQnVmWzFdID0gMjsKLQotCQkvL2NvbnZlcnQgdGhlIGFkZHJlc3MgZnJvbSAxMCB0byA4IGJpdCAoIGJpdDcsIDYgPSBwYXJpdHkgYW5kIGJpdDUgfiAwID0gYml0OX40KSwgYW5kIHdyaXRlIHRvIGxvZ2ljYWwgbWFwIGVudHJ5Ci0JCXRtcE9mZnNldCA9IE9mZnNldDsKLQkJdG1wT2Zmc2V0ID4+PSA0OwotCQl0bXBPZmZzZXQgfD0gKCh+KCh0bXBPZmZzZXQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDEgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSkpIDw8IDYpICYgMHg0MDsKLQkJdG1wT2Zmc2V0IHw9ICgofiggKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDMgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gNCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gNSAmIDB4MDEpKSkgPDwgNykgJiAweDgwOwotCi0JCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJaWYodG1wYWRkciUyICE9IDApCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDw8ODsKLQkJZWxzZQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ7Ci0KLQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCi0JCS8vU3RlcCAzLiBDb21wYXJlIGRhdGEgaWYgbm90IHRoZSBzYW1lLCBpbnZhbGlkYXRlIHRoZSBtYXBwaW5nIGVudHJ5LCB0aGVuIHJlLXdyaXRlIHRoZSBkYXRhIHVudGlsIEUtZnVzZSBpcyBleGhhdXN0ZWQKLQkJYldyaXRlU3VjY2VzcyA9IFRSVUU7Ci0JCWZvcihpID0wOyBpPDg7IGkrKykKLQkJewotCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJSW5CdWZbMV0gPSAyOwotCQkJSW5CdWZbMl0gPSAweDA7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYWRkcj0leCwgYnVmZmVyW2ldPSV4LEluQnVmWzJdPSV4XG4iLEluQnVmWzBdLHBEYXRhW2ldLEluQnVmWzJdKSk7Ci0JCQlpZihwRGF0YVtpXSAhPSBJbkJ1ZlsyXSkKLQkJCXsKLQkJCQliV3JpdGVTdWNjZXNzID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvL1N0ZXAgNC4gaW52bGlkYXRlIG1hcHBpbmcgZW50cnkgYW5kIGZpbmQgYSBmcmVlIG1hcHBpbmcgZW50cnkgaWYgbm90IHN1Y2NlZWQKLQotCQlpZiAoIWJXcml0ZVN1Y2Nlc3MmJkxvb3A8MikKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW46Ok5vdCBiV3JpdGVTdWNjZXNzIEJsa051bSA9ICVkXG4iLCBCbGtOdW0pKTsKLQotCQkJLy8gdGhlIG9mZnNldCBvZiBjdXJyZW50IG1hcHBpbmcgZW50cnkKLQkJCWFkZHIgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQrQmxrTnVtOwotCi0JCQkvL2ZpbmQgYSBuZXcgbWFwcGluZyBlbnRyeQotCQkJQmxrTnVtID0gMHhmZmZmOwotCQkJZm9yIChpPUVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaTw9RUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQkJCXsKLQkJCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQkJCXsKLQkJCQkJaWYgKGkgIT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCQkJewotCQkJCQkJQmxrTnVtID0gaSsxLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjo6Tm90IGJXcml0ZVN1Y2Nlc3MgbmV3IEJsa051bSA9ICVkXG4iLCBCbGtOdW0pKTsKLQkJCWlmKEJsa051bSA9PSAweGZmZmYpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW46IG91dCBvZiBmcmVlIEUtZnVzZSBzcGFjZSEhIVxuIikpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQotCQkJLy9pbnZhbGlkYXRlIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGVudHJ5IGlmIG5ldyBlbnRyeSBpcyBub3QgZm91bmQKLQkJCXRtcGFkZHIgPSBhZGRyOwotCi0JCQlpZihhZGRyICUgMiAhPSAwKQotCQkJCWFkZHIgPSBhZGRyIC0xOwotCQkJSW5CdWZbMF0gPSBhZGRyOwotCQkJSW5CdWZbMV0gPSAyOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQotCQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQkJaWYodG1wYWRkciUyICE9IDApCi0JCQl7Ci0JCQkJLy8gSW52YWxpZGF0ZSB0aGUgaGlnaCBieXRlCi0JCQkJZm9yIChpPTg7IGk8MTU7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGludmFsaWRhdGUgdGhlIGxvdyBieXRlCi0JCQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDApOwotCQl9Ci0KLQl9Ci0Jd2hpbGUoIWJXcml0ZVN1Y2Nlc3MmJkxvb3A8Mik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlLmgKaW5kZXggZTcyOTk2Zi4uMmZlY2QzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vZmlybXdhcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZS5oCkBAIC00Myw3ICs0Myw3IEBACiAvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLwogCiAKLVVDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7Cit1OCBGaXJtd2FyZUltYWdlXzI4NjAgW10gPSB7CiAweDAyLCAweDAzLCAweDVlLCAweDAyLCAweDAyLCAweGIxLCAweDIyLCAweDIyLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDgyLCAweGZmLCAweGZmLAogMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHgxZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMSwgMHgzMywgMHhjMCwgMHhlMCwKIDB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTgsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZV8zMDcwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9maXJtd2FyZV8zMDcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMGQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL2Zpcm13YXJlXzMwNzAuaApAQCAtMCwwICsxLDUxNyBAQAorLyogQVVUTyBHRU4gUExFQVNFIERPIE5PVCBNT0RJRlkgSVQgKi8KKy8qIEFVVE8gR0VOIFBMRUFTRSBETyBOT1QgTU9ESUZZIElUICovCisKKwordTggRmlybXdhcmVJbWFnZV8zMDcwIFtdID0geworMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgxMCwgMHgyOCwgMHgwMiwgMHgxMCwgMHgzMiwgMHgwMiwgMHgxMCwgMHg3OCwgMHgwMiwgMHgxMywgMHgxZiwgMHgwMiwKKzB4MTMsIDB4MjAsIDB4MDIsIDB4MTMsIDB4M2YsIDB4MDIsIDB4MTMsIDB4NDQsIDB4MTIsIDB4MTMsIDB4NDAsIDB4MjIsIDB4MDIsIDB4MTcsIDB4YWUsIDB4MDIsCisweDE4LCAweGQyLCAweDAyLCAweDE0LCAweDNkLCAweDAyLCAweDEzLCAweDc4LCAweDMwLCAweDA1LCAweDA2LCAweDIwLCAweDBkLCAweDAzLCAweDEyLCAweDE5LAorMHg5NSwgMHgyMiwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMywgMHgxYiwgMHhlNSwgMHg0YywgMHgzMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHg0MCwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZWYsIDB4ZjAsIDB4OTAsIDB4MDEsIDB4OGMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4ZTQsCisweDkwLCAweDAxLCAweGE3LCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweGUwLCAweDMwLCAweGUwLCAweDFjLCAweDkwLCAweDAxLCAweDgwLCAweGUwLCAweGI0LAorMHgwMiwgMHgxNSwgMHhhMywgMHhlMCwgMHhiNCwgMHgwMSwgMHgxMCwgMHg5MCwgMHgwMSwgMHg4NCwgMHhlMCwgMHhiNCwgMHg4MSwgMHgwOSwgMHg5MCwgMHgwMSwKKzB4OGMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4MTIsIDB4MGQsIDB4YzgsIDB4MjIsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4MjAsIDB4ZTcsIDB4MDMsIDB4MDIsCisweDEzLCAweDFlLCAweDkwLCAweDcwLCAweDEyLCAweGUwLCAweGY1LCAweDU2LCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDEyLCAweDBhLCAweDlkLCAweDEwLAorMHhkOSwgMHgzMSwgMHgxMCwgMHhiZCwgMHgzNiwgMHgxMSwgMHgwMiwgMHg1MCwgMHgxMSwgMHgzOSwgMHg1MSwgMHgxMSwgMHg0MiwgMHg1MiwgMHgxMSwgMHg0MiwKKzB4NTMsIDB4MTEsIDB4NDIsIDB4NTQsIDB4MTEsIDB4ODMsIDB4NTUsIDB4MTEsIDB4ZDIsIDB4NTYsIDB4MTIsIDB4MjUsIDB4NzAsIDB4MTIsIDB4NTAsIDB4NzEsCisweDEyLCAweDdlLCAweDcyLCAweDEyLCAweGQ1LCAweDczLCAweDEyLCAweGY2LCAweDgwLCAweDAwLCAweDAwLCAweDEzLCAweDFlLCAweDkwLCAweDcwLCAweDExLAorMHhlMCwgMHhmNSwgMHgzYywgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNSwgMHg1NiwKKzB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsIDB4MDIsIDB4MTMsIDB4MTcsIDB4MjAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4MDMsIDB4MWQsIDB4N2QsCisweDAyLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLAorMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHg4NSwgMHg1NiwgMHg0MSwgMHhkMiwKKzB4MDIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZmYsIDB4YmYsIDB4MGEsIDB4MGQsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsCisweGI0LCAweDA4LCAweDA2LCAweDc1LCAweDRlLCAweDAxLCAweDc1LCAweDRmLCAweDg0LCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweGZmLAorMHhiZiwgMHgwMiwgMHgxMiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwNCwgMHhlMCwgMHhiNCwgMHgyMCwgMHgwNiwgMHg3NSwKKzB4NGUsIDB4MDMsIDB4NzUsIDB4NGYsIDB4MjAsIDB4ZTQsIDB4ZjUsIDB4MjcsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsCisweDQ3LCAweDIyLCAweDkwLCAweDA0LCAweDA0LCAweGUwLCAweDI1LCAweGUwLCAweDI0LCAweDVkLCAweGY1LCAweDU3LCAweDkwLCAweDcwLCAweDEwLCAweGUwLAorMHhmZiwgMHg3NCwgMHg0NywgMHgyNSwgMHg1NywgMHhmOCwgMHhjNiwgMHhlZiwgMHhjNiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmZiwgMHg3NCwgMHg0OCwKKzB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsCisweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLAorMHgwMiwgMHgxMywgMHgxNywgMHhlNSwgMHg0NywgMHg2NCwgMHgwNywgMHg2MCwgMHgxZCwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNywgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDksIDB4NjAsIDB4MTEsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGEsIDB4NjAsIDB4MGIsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGIsIDB4NjAsCisweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDBjLCAweDA4LCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDU0LCAweDBmLCAweGY1LCAweDNhLCAweGU1LCAweDQ3LAorMHhiNCwgMHgwOSwgMHgwOCwgMHhlNSwgMHgzYSwgMHhiNCwgMHgwMywgMHgwMywgMHhlNCwgMHhmNSwgMHg0NiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwYSwgMHgwOCwKKzB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDMsIDB4ZTQsIDB4ZjUsIDB4NDYsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4ZDIsCisweDA0LCAweDIyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGY0LCAweGZmLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDVmLCAweGZmLCAweDkwLCAweDcwLAorMHgxMSwgMHhlMCwgMHg1NSwgMHgyNywgMHg0ZiwgMHg5MCwgMHg3MCwgMHgxOCwgMHhmMCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg5MCwgMHg3MCwgMHgxOSwKKzB4ZjAsIDB4ZTQsIDB4ZmQsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4MzAsIDB4MTUsIDB4MDMsIDB4ZDIsIDB4MTQsIDB4MjIsIDB4OTAsIDB4NzAsCisweDE4LCAweGUwLCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweGZmLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweGZlLCAweGVmLCAweDVlLAorMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwgMHg5MCwKKzB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsCisweGY4LCAweGU2LCAweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLAorMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywKKzB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4ZmUsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmQsIDB4ZWQsIDB4ZjUsIDB4ODIsIDB4OGUsIDB4ODMsIDB4ZTAsCisweGY1LCAweDU3LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLAorMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwgMHgwMiwgMHgxMywgMHgxNywgMHg5MCwgMHgxMCwKKzB4MDAsIDB4ZTAsIDB4ZjUsIDB4NTcsIDB4OTAsIDB4MTAsIDB4MDIsIDB4ZTAsIDB4ZjUsIDB4NTgsIDB4YTMsIDB4ZTAsIDB4ZjUsIDB4NTksIDB4ZTUsIDB4NTgsCisweGI0LCAweDcwLCAweDFlLCAweGU1LCAweDU5LCAweGI0LCAweDMwLCAweDE5LCAweDkwLCAweDA1LCAweDA4LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGZkLAorMHg5MCwgMHgwNSwgMHgwNSwgMHhlMCwgMHg1NCwgMHhmYiwgMHhmMCwgMHg0NCwgMHgwNCwgMHhmMCwgMHhlZCwgMHg1NCwgMHhmZSwgMHg5MCwgMHgwNSwgMHgwOCwKKzB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NGUsIDB4ZjUsIDB4NGYsIDB4NzUsIDB4M2EsIDB4ZmYsIDB4NzUsIDB4M2MsIDB4ZmYsIDB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsCisweDEyLCAweDBiLCAweDkxLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LCAweDU2LAorMHhmNCwgMHg2MCwgMHg0YiwgMHg4MCwgMHg0MiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg5MywgMHhlNCwgMHhmZCwgMHhhZiwKKzB4NTYsIDB4MTIsIDB4MGIsIDB4OTEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsCisweDU2LCAweGY0LCAweDYwLCAweDJhLCAweDgwLCAweDIxLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDI0LCAweGZmLCAweDkyLCAweDRhLCAweGQyLCAweDA1LAorMHhhZCwgMHg1NywgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHg5MSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwKKzB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NjAsIDB4MDcsIDB4OTAsIDB4NzAsIDB4MjUsIDB4ZTAsIDB4NDQsIDB4MDEsIDB4ZjAsIDB4MjIsIDB4MjIsCisweGU1LCAweDUzLCAweDcwLCAweDFhLCAweDMwLCAweDYwLCAweDA5LCAweGIyLCAweDRkLCAweDMwLCAweDRkLCAweDA0LCAweDA1LCAweDQ2LCAweGMyLCAweDA0LAorMHhlNSwgMHg0ZiwgMHg0NSwgMHg0ZSwgMHg2MCwgMHgwOCwgMHhlNSwgMHg0ZiwgMHgxNSwgMHg0ZiwgMHg3MCwgMHgwMiwgMHgxNSwgMHg0ZSwgMHgyMiwgMHgyMiwKKzB4YzIsIDB4NDIsIDB4ZDMsIDB4MjIsIDB4MzAsIDB4MTQsIDB4MzAsIDB4OTAsIDB4NzAsIDB4MTksIDB4ZTAsIDB4NTUsIDB4MjcsIDB4ZmYsIDB4OTAsIDB4NzAsCisweDE4LCAweGUwLCAweDRmLCAweGY1LCAweDI3LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweGZmLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweGZlLCAweGVmLAorMHg1ZSwgMHg5MCwgMHgwMiwgMHgyOSwgMHhmMCwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwKKzB4OTAsIDB4MDIsIDB4MjgsIDB4ZWYsIDB4ZjAsIDB4YzIsIDB4MTQsIDB4MjIsIDB4YzIsIDB4NGIsIDB4YzIsIDB4NGMsIDB4ZTUsIDB4NDQsIDB4MTIsIDB4MGEsCisweDlkLCAweDEzLCAweDlhLCAweDAwLCAweDE0LCAweDI4LCAweDA0LCAweDE0LCAweDI0LCAweDA4LCAweDE0LCAweDA0LCAweDEwLCAweDEzLCAweGFlLCAweDIwLAorMHgxMywgMHhjZSwgMHg2MCwgMHgxMywgMHhkZiwgMHhhMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgyYSwgMHg4NSwgMHg0OCwgMHg0MywgMHg4NSwgMHg0YSwgMHg0MiwKKzB4ODUsIDB4NGMsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NjAsIDB4MDMsIDB4MDIsIDB4MTQsIDB4MmEsIDB4ODAsIDB4MWIsIDB4ZTUsIDB4NDgsCisweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRhLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRjLCAweGM0LCAweDU0LAorMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHg2MSwgMHg1MywgMHg0MywgMHgwZiwgMHg4MCwgMHg1YywgMHg4NSwgMHg0OSwKKzB4NDMsIDB4ODUsIDB4NGIsIDB4NDIsIDB4ODUsIDB4NGQsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NGQsIDB4ODAsIDB4MWIsIDB4ZTUsCisweDQ5LCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQzLCAweGU1LCAweDRiLCAweGM0LCAweDU0LCAweDBmLCAweGY1LCAweDQyLCAweGU1LCAweDRkLCAweGM0LAorMHg1NCwgMHgwZiwgMHhmNSwgMHg1ZSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwNiwgMHg3MCwgMHgzMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgxMCwKKzB4ZjUsIDB4NDMsIDB4ODAsIDB4MjYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDQsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDUsIDB4MDYsIDB4NDMsCisweDVlLCAweDA0LCAweDc1LCAweDQyLCAweDA5LCAweGU1LCAweDQ3LCAweGI0LCAweDA2LCAweDEwLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDQ0LCAweDMwLAorMHhmNSwgMHg0MywgMHg4MCwgMHgwNiwgMHhkMiwgMHg0YiwgMHg4MCwgMHgwMiwgMHhkMiwgMHg0YywgMHhlNCwgMHhmNSwgMHgyNSwgMHhlNSwgMHg0MiwgMHhjNCwKKzB4NTQsIDB4ZjAsIDB4ZmYsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NGYsIDB4ZjUsIDB4NWYsIDB4ZDIsIDB4NjAsIDB4MjIsIDB4ZDIsIDB4MTUsIDB4ZTUsCisweDQ3LCAweDI0LCAweGY1LCAweDYwLCAweDBiLCAweDI0LCAweGNiLCAweDYwLCAweDA3LCAweDI0LCAweDQwLCAweDcwLCAweDA2LCAweGMyLCAweDE1LCAweDIyLAorMHgxMiwgMHgxNywgMHg3OSwgMHgxMiwgMHgxNCwgMHg1ZiwgMHhjMiwgMHgxNSwgMHhjMiwgMHhhZiwgMHhjMiwgMHgwNCwgMHhkMiwgMHhhZiwgMHgyMiwgMHhjMiwKKzB4YWYsIDB4OTAsIDB4MDQsIDB4MTQsIDB4ZTAsIDB4NTQsIDB4MGUsIDB4NjAsIDB4MDQsIDB4ZDIsIDB4MTgsIDB4ODAsIDB4MDgsIDB4ZTUsIDB4NGUsIDB4NDUsCisweDRmLCAweDI0LCAweGZmLCAweDkyLCAweDE4LCAweGQyLCAweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweGEyLCAweGU0LCAweDkyLCAweDE5LCAweDc0LAorMHgxZSwgMHhmMCwgMHhlNSwgMHg1ZiwgMHg1NCwgMHgwZiwgMHhmNSwgMHgyZCwgMHhlNSwgMHgyNSwgMHg3MCwgMHgxMywgMHgzMCwgMHgxOCwgMHgwNSwgMHhlNSwKKzB4NWYsIDB4MjAsIDB4ZTUsIDB4MGIsIDB4MzAsIDB4MTksIDB4MTksIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MzAsIDB4ZmYsIDB4YmYsIDB4MzAsIDB4MTEsIDB4ZTUsCisweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDBjLCAweDgwLCAweDAyLCAweDE1LCAweDI1LCAweGQyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDBmLAorMHhlNSwgMHg1ZiwgMHgzMCwgMHhlNiwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHhlNSwKKzB4NDcsIDB4NjQsIDB4MDMsIDB4NzAsIDB4MjEsIDB4MzAsIDB4NGIsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MTgsIDB4ZTUsIDB4MjUsCisweDcwLCAweDAzLCAweDMwLCAweDRjLCAweDExLCAweGMyLCAweDRjLCAweGU1LCAweDI1LCAweDcwLCAweDA1LCAweDc1LCAweDI1LCAweDA3LCAweDgwLCAweDAyLAorMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHhlNSwgMHg0NywgMHhiNCwgMHgwOSwgMHgxNCwgMHhlNSwgMHg0NCwgMHgyMCwgMHhlMywgMHgwYiwKKzB4ZTUsIDB4M2EsIDB4NjQsIDB4MDIsIDB4NjAsIDB4MDUsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDMsIDB4MDQsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsCisweDQ3LCAweGI0LCAweDBhLCAweDEzLCAweGU1LCAweDNhLCAweGI0LCAweDAxLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDA4LCAweGU1LAorMHgzYSwgMHg3MCwgMHgwNCwgMHhkMiwgMHg2YywgMHhjMiwgMHg2ZCwgMHgyMCwgMHg2OSwgMHgwNywgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwMiwgMHhiMiwKKzB4NjgsIDB4MjAsIDB4NmIsIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDIsIDB4YjIsIDB4NmEsIDB4MjAsIDB4NmQsIDB4MDcsIDB4ZTUsIDB4NWUsCisweDIwLCAweGUyLCAweDAyLCAweGIyLCAweDZjLCAweDc1LCAweDJlLCAweDQwLCAweDIwLCAweDY5LCAweDA0LCAweGEyLCAweDY4LCAweDgwLCAweDI2LCAweDMwLAorMHg2OCwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMiwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwKKzB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsCisweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDczLCAweDkyLCAweDcyLCAweDIwLCAweDZiLCAweDA0LCAweGEyLCAweDZhLCAweDgwLCAweDI2LAorMHgzMCwgMHg2YSwgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwgMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMCwgMHgwNCwgMHg3ZiwgMHgwMSwKKzB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsIDB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsCisweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLCAweDc1LCAweDkyLCAweDc0LCAweDIwLCAweDZkLCAweDA0LCAweGEyLCAweDZjLCAweDgwLAorMHgyNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYSwgMHg3MCwgMHgyMiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMywgMHg4MCwgMHgxNywKKzB4ZTUsIDB4M2EsIDB4YjQsIDB4MDEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsIDB4ODAsIDB4MzQsIDB4ZTUsIDB4NDYsIDB4MjAsIDB4ZTQsIDB4MDMsCisweDMwLCAweGU1LCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDgwLCAweDI2LCAweDMwLCAweDZjLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUyLAorMHg4MCwgMHgxZCwgMHhlNSwgMHg1ZSwgMHgyMCwgMHhlMSwgMHgwNCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwMiwgMHg3ZiwgMHgwMCwgMHhlNSwgMHg0NiwgMHg1NCwKKzB4ZjAsIDB4ZmUsIDB4YmUsIDB4ZjAsIDB4MDQsIDB4N2UsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2UsIDB4MDAsIDB4ZWUsIDB4NmYsIDB4MjQsIDB4ZmYsIDB4OTIsCisweDcxLCAweDkyLCAweDcwLCAweDkwLCAweDEwLCAweDAwLCAweGUwLCAweDkwLCAweDEwLCAweDJjLCAweGYwLCAweDkwLCAweDEwLCAweDAzLCAweGUwLCAweGMzLAorMHg5NCwgMHgzMCwgMHg0MCwgMHgxNCwgMHhhMiwgMHg3MSwgMHg5MiwgMHg3NywgMHhhMiwgMHg3MCwgMHg5MiwgMHg3NiwgMHhlNSwgMHgyZSwgMHgxMywgMHgxMywKKzB4NTQsIDB4M2YsIDB4ZjUsIDB4MmUsIDB4YzIsIDB4NzcsIDB4ZDIsIDB4NzYsIDB4OTAsIDB4MTAsIDB4MmYsIDB4ZTUsIDB4MmUsIDB4ZjAsIDB4ZTUsIDB4NDcsCisweDY0LCAweDA2LCAweDcwLCAweDM5LCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZlLCAweGYwLCAweGU1LCAweDQzLCAweGM0LCAweDU0LCAweDBmLAorMHgxNCwgMHg2MCwgMHgwYywgMHgyNCwgMHhmZSwgMHg2MCwgMHgwYywgMHgyNCwgMHgwMywgMHg3MCwgMHgxMywgMHhjMiwgMHgzOCwgMHg4MCwgMHgwZiwgMHhkMiwKKzB4MzgsIDB4ODAsIDB4MGIsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzgsIDB4MzAsIDB4NDcsCisweDA1LCAweGFmLCAweDI3LCAweDAyLCAweDE3LCAweDczLCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDAyLCAweDE3LCAweDczLCAweGU1LCAweDQ3LCAweDY0LAorMHgwNywgMHg2MCwgMHgwZiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOSwgMHhlNSwgMHg0NywgMHg2NCwgMHgwOSwgMHg2MCwgMHgwMywgMHgwMiwKKzB4MTYsIDB4ZjIsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZTAsIDB4NTQsIDB4ZmMsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MjIsIDB4MTQsIDB4NjAsCisweDI1LCAweDE0LCAweDYwLCAweDJkLCAweDI0LCAweGZjLCAweDYwLCAweDQ5LCAweDI0LCAweGY5LCAweDYwLCAweDE0LCAweDI0LCAweDBlLCAweDcwLCAweDUwLAorMHhlNSwgMHg0NiwgMHgxMywgMHgxMywgMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhlNSwgMHhmMCwgMHgyNCwgMHhmZiwgMHg4MCwgMHgzYSwKKzB4ZDIsIDB4MzksIDB4YzIsIDB4MzgsIDB4ODAsIDB4M2UsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MWQsIDB4YzMsIDB4ODAsCisweDFhLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLCAweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLAorMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHhlZSwgMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOCwgMHhjMiwgMHgzOSwgMHg4MCwKKzB4MTMsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4YzIsIDB4MzgsIDB4ODAsIDB4MDQsCisweGMyLCAweDM4LCAweGMyLCAweDM5LCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LCAweDI3LCAweGY0LCAweGZmLCAweDAyLAorMHgxNywgMHg3MywgMHhlNSwgMHg0NywgMHg2NCwgMHgwYywgMHg2MCwgMHgwNiwgMHhlNSwgMHg0NywgMHg2NCwgMHgwYiwgMHg3MCwgMHg3YSwgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZmQsIDB4ZjAsIDB4ZTUsIDB4M2EsIDB4MTQsIDB4NjAsIDB4MjAsIDB4MTQsIDB4NjAsIDB4MjEsIDB4MTQsIDB4NjAsIDB4MmIsCisweDI0LCAweGZjLCAweDYwLCAweDQ1LCAweDI0LCAweGY5LCAweDYwLCAweDEyLCAweDI0LCAweDBlLCAweDcwLCAweDRhLCAweGU1LCAweDQ2LCAweDEzLCAweDEzLAorMHg1NCwgMHgzZiwgMHg3NSwgMHhmMCwgMHgwMywgMHg4NCwgMHhlNSwgMHhmMCwgMHg4MCwgMHgyOSwgMHhkMiwgMHgzOSwgMHg4MCwgMHgzYSwgMHhlNSwgMHg0NiwKKzB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsIDB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MmQsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MGQsCisweDU0LCAweDM4LCAweGMzLCAweDk0LCAweDMwLCAweDUwLCAweDA2LCAweDdlLCAweDAwLCAweDdmLCAweDAxLCAweDgwLCAweDA0LCAweDdlLCAweDAwLCAweDdmLAorMHgwMCwgMHhlZSwgMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgzOSwgMHg4MCwgMHgwZiwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwMywgMHhkMywgMHg4MCwKKzB4MDEsIDB4YzMsIDB4OTIsIDB4MzksIDB4ODAsIDB4MDIsIDB4YzIsIDB4MzksIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsCisweDI3LCAweGY0LCAweGZmLCAweDkwLCAweDAyLCAweDI4LCAweGVmLCAweGYwLCAweDIyLCAweGU1LCAweDQ3LCAweGI0LCAweDBiLCAweDEwLCAweDkwLCAweDAyLAorMHgyOSwgMHhlMCwgMHg1NCwgMHhlYiwgMHhmMCwgMHhlNSwgMHgyNywgMHg1NCwgMHhlYiwgMHg0NSwgMHg0NSwgMHhmNSwgMHgyNywgMHgyMiwgMHhlNCwgMHg5MCwKKzB4MDIsIDB4MjksIDB4ZjAsIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4NDUsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4NDUsIDB4ZjQsIDB4ZmYsIDB4OTAsIDB4MDIsCisweDI4LCAweGVmLCAweGYwLCAweDIyLCAweDhmLCAweDUwLCAweGQyLCAweDU5LCAweDIyLCAweDhmLCAweDU0LCAweGQyLCAweDU4LCAweDIyLCAweGU0LCAweGY1LAorMHg2MiwgMHhjMiwgMHhhZiwgMHhlNSwgMHg1MSwgMHgxNCwgMHg2MCwgMHg0OCwgMHgxNCwgMHg2MCwgMHg2NiwgMHgyNCwgMHgwMiwgMHg2MCwgMHgwMywgMHgwMiwKKzB4MTgsIDB4YjYsIDB4ZDIsIDB4NTksIDB4NzUsIDB4NTUsIDB4MDEsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NTQsIDB4N2YsIDB4ZjAsIDB4YTMsIDB4ZTAsCisweDIwLCAweGU3LCAweDIzLCAweDkwLCAweDA0LCAweDM0LCAweGUwLCAweGI0LCAweDAyLCAweDFjLCAweGEzLCAweGUwLCAweGI0LCAweDAyLCAweDE3LCAweGEzLAorMHhlMCwgMHhiNCwgMHgwMiwgMHgxMiwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNywgMHhhNCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmMywgMHhmMCwKKzB4NzUsIDB4NTEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4YjYsIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDYsIDB4NzUsIDB4NjIsIDB4MDMsIDB4MDIsIDB4MTgsIDB4YjYsCisweDkwLCAweDEyLCAweDAwLCAweGUwLCAweDU0LCAweDAzLCAweDcwLCAweDEyLCAweDdmLCAweDIwLCAweDEyLCAweDE3LCAweGE0LCAweDkwLCAweDAyLCAweGEyLAorMHhlMCwgMHg1NCwgMHhiZiwgMHhmMCwgMHg3NSwgMHg1MSwgMHgwMiwgMHgwMiwgMHgxOCwgMHhiNiwgMHhlNSwgMHg1MCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxOCwKKzB4YjEsIDB4OTAsIDB4MDIsIDB4YTMsIDB4ZTAsIDB4MzAsIDB4ZTYsIDB4MDMsIDB4MDIsIDB4MTgsIDB4YWQsIDB4OTAsIDB4MDQsIDB4MzcsIDB4ZTAsIDB4NjQsCisweDIyLCAweDcwLCAweDdhLCAweDkwLCAweDAxLCAweDhhLCAweDc0LCAweDdlLCAweGYwLCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweDkwLCAweDEyLCAweDA0LAorMHg3NCwgMHgwYSwgMHhmMCwgMHhlNSwgMHg1OCwgMHhiNCwgMHg3MiwgMHgxNSwgMHhlNSwgMHg1OSwgMHhiNCwgMHgzNSwgMHgxMCwgMHhlNCwgMHg5MCwgMHgwNSwKKzB4MDAsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDgsIDB4ZjAsIDB4YTMsIDB4NzQsIDB4MDEsIDB4ZjAsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4N2YsIDB4MDEsIDB4MTIsCisweDBkLCAweDJhLCAweDkwLCAweDEzLCAweDI4LCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGEzLCAweGUwLCAweDU0LCAweGYwLCAweGYwLCAweGU1LCAweDU5LAorMHhiNCwgMHgzNSwgMHgxNCwgMHhlNSwgMHgzYywgMHhmNCwgMHg2MCwgMHgwNiwgMHhhMywgMHhlMCwgMHg1NCwgMHhmMywgMHg4MCwgMHgxNCwgMHg5MCwgMHgxMywKKzB4MmEsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4ODAsIDB4MTQsIDB4ZTUsIDB4M2MsIDB4ZjQsIDB4OTAsIDB4MTMsIDB4MmEsIDB4NjAsIDB4MDgsIDB4ZTAsCisweDU0LCAweGYyLCAweDQ1LCAweDNjLCAweGYwLCAweDgwLCAweDA0LCAweGUwLCAweDU0LCAweGZhLCAweGYwLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDU0LAorMHhmZCwgMHhmMCwgMHg3NSwgMHg2MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMiwgMHhlNCwgMHhmNSwgMHg1MSwgMHg4MCwgMHgwOSwgMHhlNSwgMHg1MCwgMHg3MCwKKzB4MDUsIDB4NzUsIDB4NjIsIDB4MDMsIDB4ZjUsIDB4NTEsIDB4ZTUsIDB4NjIsIDB4NjAsIDB4MTUsIDB4YzIsIDB4MDEsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4YzIsCisweDU5LCAweGFkLCAweDYyLCAweGFmLCAweDQwLCAweDEyLCAweDE5LCAweDYxLCAweGU1LCAweDYyLCAweGI0LCAweDAzLCAweDAyLCAweGQyLCAweDAzLCAweGQyLAorMHhhZiwgMHgyMiwgMHhjMiwgMHhhZiwgMHgzMCwgMHgwMSwgMHgxMiwgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhmNSwgMHg1MSwgMHhjMiwgMHg1OSwKKzB4YzIsIDB4MDEsIDB4N2QsIDB4MDIsIDB4YWYsIDB4NDAsIDB4MTIsIDB4MTksIDB4NjEsIDB4ZTUsIDB4NTIsIDB4MTQsIDB4NjAsIDB4MDksIDB4MDQsIDB4NzAsCisweDZkLCAweDc1LCAweDUyLCAweDAxLCAweDc1LCAweDU1LCAweDAzLCAweDkwLCAweDA0LCAweDAxLCAweGUwLCAweDQ0LCAweDBlLCAweGYwLCAweDkwLCAweDEzLAorMHgyOCwgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwZiwgMHhmMCwgMHhhMywgMHhlMCwgMHg0NCwgMHgwNSwgMHhmMCwgMHg5MCwKKzB4MTIsIDB4MDQsIDB4NzQsIDB4MDMsIDB4ZjAsIDB4ZTUsIDB4NTgsIDB4YjQsIDB4NzIsIDB4MTYsIDB4ZTUsIDB4NTksIDB4YjQsIDB4MzUsIDB4MTEsIDB4OTAsCisweDA1LCAweDAwLCAweDc0LCAweGUyLCAweGYwLCAweGEzLCAweDc0LCAweDA4LCAweGYwLCAweGEzLCAweDc0LCAweDAxLCAweGYwLCAweDc0LCAweDAzLCAweGYwLAorMHg3ZiwgMHgwMSwgMHgxMiwgMHgwZCwgMHgyYSwgMHg5MCwgMHgwMiwgMHhhMiwgMHhlMCwgMHg0NCwgMHhjMCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgwNCwgMHhlMCwKKzB4NDQsIDB4MGMsIDB4ZjAsIDB4ZTQsIDB4ZjUsIDB4NTIsIDB4ZjUsIDB4NTUsIDB4MzAsIDB4MDIsIDB4MDksIDB4YzIsIDB4MDIsIDB4N2QsIDB4MDEsIDB4YWYsCisweDQxLCAweDEyLCAweDE5LCAweDYxLCAweDMwLCAweDAzLCAweDAyLCAweGMyLCAweDAzLCAweGU0LCAweDkwLCAweDAxLCAweDk2LCAweGYwLCAweGQyLCAweGFmLAorMHgyMiwgMHhlZiwgMHhmNCwgMHg2MCwgMHgyZCwgMHhlNCwgMHhmZSwgMHg3NCwgMHgxNCwgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwKKzB4ODMsIDB4ZTAsIDB4YjQsIDB4ZmYsIDB4MTksIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsIDB4ODMsIDB4ZWYsCisweGYwLCAweDc0LCAweDFjLCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVkLCAweGYwLCAweDIyLCAweDBlLCAweGJlLAorMHgwNCwgMHhkNSwgMHgyMiwgMHgyMiwgMHgyMiwgMHg5MCwgMHg3MCwgMHgyYSwgMHhlMCwgMHgzMCwgMHhlMSwgMHg0ZCwgMHhjMiwgMHhhZiwgMHg5MCwgMHg3MCwKKzB4MjgsIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MjksIDB4ZTAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZjAsIDB4OTAsIDB4NzAsCisweDJhLCAweGUwLCAweDkwLCAweDEwLCAweDFlLCAweGYwLCAweDkwLCAweDEwLCAweDFjLCAweGUwLCAweGY1LCAweDYyLCAweDkwLCAweDEwLCAweDFlLCAweGUwLAorMHgyMCwgMHhlMSwgMHhmMywgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHg5MCwgMHg3MCwgMHgyOCwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxZCwgMHhlMCwgMHg5MCwKKzB4NzAsIDB4MjksIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWUsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZjAsIDB4MzAsIDB4NGEsIDB4MDcsIDB4OTAsIDB4NzAsCisweDI0LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweGMyLCAweDA1LCAweGQyLCAweGFmLCAweDIyLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHg3YiwgMHhjNCwKKzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDIsIDB4MTAsIDB4MjgsIDB4MDIsIDB4MTAsIDB4MzIsIDB4MDIsIDB4MTAsIDB4NzgsIDB4MDIsIDB4MTMsIDB4MWYsIDB4MDIsCisweDEzLCAweDIwLCAweDAyLCAweDEzLCAweDNmLCAweDAyLCAweDEzLCAweDQ0LCAweDEyLCAweDEzLCAweDQwLCAweDIyLCAweDAyLCAweDE3LCAweGFlLCAweDAyLAorMHgxOCwgMHhkMiwgMHgwMiwgMHgxNCwgMHgzZCwgMHgwMiwgMHgxMywgMHg3OCwgMHgzMCwgMHgwNSwgMHgwNiwgMHgyMCwgMHgwZCwgMHgwMywgMHgxMiwgMHgxOSwKKzB4OTUsIDB4MjIsIDB4OTAsIDB4MDEsIDB4OGMsIDB4ZTAsIDB4MzAsIDB4ZTMsIDB4MWIsIDB4ZTUsIDB4NGMsIDB4MzAsIDB4ZTAsIDB4MDQsIDB4N2YsIDB4NDAsCisweDgwLCAweDAyLCAweDdmLCAweDAwLCAweDkwLCAweDEwLCAweDJmLCAweGVmLCAweGYwLCAweDkwLCAweDAxLCAweDhjLCAweDc0LCAweDA4LCAweGYwLCAweGU0LAorMHg5MCwgMHgwMSwgMHhhNywgMHhmMCwgMHg5MCwgMHgwMSwgMHg4YywgMHhlMCwgMHgzMCwgMHhlMCwgMHgxYywgMHg5MCwgMHgwMSwgMHg4MCwgMHhlMCwgMHhiNCwKKzB4MDIsIDB4MTUsIDB4YTMsIDB4ZTAsIDB4YjQsIDB4MDEsIDB4MTAsIDB4OTAsIDB4MDEsIDB4ODQsIDB4ZTAsIDB4YjQsIDB4ODEsIDB4MDksIDB4OTAsIDB4MDEsCisweDhjLCAweDc0LCAweDAxLCAweGYwLCAweDEyLCAweDBkLCAweGRkLCAweDIyLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDIwLCAweGU3LCAweDAzLCAweDAyLAorMHgxMywgMHgxZSwgMHg5MCwgMHg3MCwgMHgxMiwgMHhlMCwgMHhmNSwgMHg1NiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgxMiwgMHgwYSwgMHhiNiwgMHgxMCwKKzB4ZDksIDB4MzEsIDB4MTAsIDB4YmQsIDB4MzYsIDB4MTEsIDB4MDIsIDB4NTAsIDB4MTEsIDB4MzksIDB4NTEsIDB4MTEsIDB4NDIsIDB4NTIsIDB4MTEsIDB4NDIsCisweDUzLCAweDExLCAweDQyLCAweDU0LCAweDExLCAweDgzLCAweDU1LCAweDExLCAweGQyLCAweDU2LCAweDEyLCAweDI1LCAweDcwLCAweDEyLCAweDUwLCAweDcxLAorMHgxMiwgMHg3ZSwgMHg3MiwgMHgxMiwgMHhkNSwgMHg3MywgMHgxMiwgMHhmNiwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMywgMHgxZSwgMHg5MCwgMHg3MCwgMHgxMSwKKzB4ZTAsIDB4ZjUsIDB4M2MsIDB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTUsIDB4NTYsCisweGY0LCAweDcwLCAweDAzLCAweDAyLCAweDEzLCAweDFlLCAweDAyLCAweDEzLCAweDE3LCAweDIwLCAweDAyLCAweDAzLCAweDMwLCAweDAzLCAweDFkLCAweDdkLAorMHgwMiwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywKKzB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsIDB4MDIsIDB4MTMsIDB4MTcsIDB4ODUsIDB4NTYsIDB4NDEsIDB4ZDIsCisweDAyLCAweDIyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweDU0LCAweDdmLCAweGZmLCAweGJmLCAweDBhLCAweDBkLCAweDkwLCAweDcwLCAweDExLCAweGUwLAorMHhiNCwgMHgwOCwgMHgwNiwgMHg3NSwgMHg0ZSwgMHgwMSwgMHg3NSwgMHg0ZiwgMHg4NCwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1NCwgMHg3ZiwgMHhmZiwKKzB4YmYsIDB4MDIsIDB4MTIsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDQsIDB4ZTAsIDB4YjQsIDB4MjAsIDB4MDYsIDB4NzUsCisweDRlLCAweDAzLCAweDc1LCAweDRmLCAweDIwLCAweGU0LCAweGY1LCAweDI3LCAweDIyLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweDI0LCAweGZmLCAweDkyLAorMHg0NywgMHgyMiwgMHg5MCwgMHgwNCwgMHgwNCwgMHhlMCwgMHgyNSwgMHhlMCwgMHgyNCwgMHg1ZCwgMHhmNSwgMHg1NywgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwKKzB4ZmYsIDB4NzQsIDB4NDcsIDB4MjUsIDB4NTcsIDB4ZjgsIDB4YzYsIDB4ZWYsIDB4YzYsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4ZmYsIDB4NzQsIDB4NDgsCisweDI1LCAweDU3LCAweGY4LCAweGM2LCAweGVmLCAweGM2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LAorMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwgMHhmNCwgMHg3MCwgMHgwMywgMHgwMiwgMHgxMywgMHgxZSwKKzB4MDIsIDB4MTMsIDB4MTcsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDcsIDB4NjAsIDB4MWQsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTcsIDB4ZTUsCisweDQ3LCAweDY0LCAweDA5LCAweDYwLCAweDExLCAweGU1LCAweDQ3LCAweDY0LCAweDBhLCAweDYwLCAweDBiLCAweGU1LCAweDQ3LCAweDY0LCAweDBiLCAweDYwLAorMHgwNSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwYywgMHgwOCwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHg1NCwgMHgwZiwgMHhmNSwgMHgzYSwgMHhlNSwgMHg0NywKKzB4YjQsIDB4MDksIDB4MDgsIDB4ZTUsIDB4M2EsIDB4YjQsIDB4MDMsIDB4MDMsIDB4ZTQsIDB4ZjUsIDB4NDYsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MGEsIDB4MDgsCisweGU1LCAweDNhLCAweGI0LCAweDAxLCAweDAzLCAweGU0LCAweGY1LCAweDQ2LCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweGQyLAorMHgwNCwgMHgyMiwgMHg5MCwgMHg3MCwgMHgxMSwgMHhlMCwgMHhmNCwgMHhmZiwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHg1ZiwgMHhmZiwgMHg5MCwgMHg3MCwKKzB4MTEsIDB4ZTAsIDB4NTUsIDB4MjcsIDB4NGYsIDB4OTAsIDB4NzAsIDB4MTgsIDB4ZjAsIDB4OTAsIDB4NzAsIDB4MTEsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MTksCisweGYwLCAweGU0LCAweGZkLCAweGFmLCAweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDMwLCAweDE1LCAweDAzLCAweGQyLCAweDE0LCAweDIyLCAweDkwLCAweDcwLAorMHgxOCwgMHhlMCwgMHhmNSwgMHgyNywgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHhmZiwgMHg5MCwgMHg3MCwgMHgxOSwgMHhlMCwgMHhmZSwgMHhlZiwgMHg1ZSwKKzB4OTAsIDB4MDIsIDB4MjksIDB4ZjAsIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4MjcsIDB4ZjQsIDB4ZmYsIDB4OTAsCisweDAyLCAweDI4LCAweGVmLCAweGYwLCAweDIyLCAweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZkLCAweGVkLAorMHhmOCwgMHhlNiwgMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwKKzB4ZTQsIDB4OTAsIDB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsIDB4MDIsIDB4MTMsIDB4MTcsCisweDkwLCAweDcwLCAweDEwLCAweGUwLCAweGZlLCAweDkwLCAweDcwLCAweDExLCAweGUwLCAweGZkLCAweGVkLCAweGY1LCAweDgyLCAweDhlLCAweDgzLCAweGUwLAorMHhmNSwgMHg1NywgMHhmZCwgMHhhZiwgMHg1NiwgMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwKKzB4NzAsIDB4MTMsIDB4ZjAsIDB4ZTUsIDB4NTYsIDB4ZjQsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTMsIDB4MWUsIDB4MDIsIDB4MTMsIDB4MTcsIDB4OTAsIDB4MTAsCisweDAwLCAweGUwLCAweGY1LCAweDU3LCAweDkwLCAweDEwLCAweDAyLCAweGUwLCAweGY1LCAweDU4LCAweGEzLCAweGUwLCAweGY1LCAweDU5LCAweGU1LCAweDU4LAorMHhiNCwgMHg3MCwgMHgxZSwgMHhlNSwgMHg1OSwgMHhiNCwgMHgzMCwgMHgxOSwgMHg5MCwgMHgwNSwgMHgwOCwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHhmZCwKKzB4OTAsIDB4MDUsIDB4MDUsIDB4ZTAsIDB4NTQsIDB4ZmIsIDB4ZjAsIDB4NDQsIDB4MDQsIDB4ZjAsIDB4ZWQsIDB4NTQsIDB4ZmUsIDB4OTAsIDB4MDUsIDB4MDgsCisweGYwLCAweGU0LCAweGY1LCAweDRlLCAweGY1LCAweDRmLCAweDc1LCAweDNhLCAweGZmLCAweDc1LCAweDNjLCAweGZmLCAweGFkLCAweDU3LCAweGFmLCAweDU2LAorMHgxMiwgMHgwYiwgMHhhYSwgMHg5MCwgMHgwNCwgMHgxNCwgMHg3NCwgMHg4MCwgMHhmMCwgMHhlNCwgMHg5MCwgMHg3MCwgMHgxMywgMHhmMCwgMHhlNSwgMHg1NiwKKzB4ZjQsIDB4NjAsIDB4NGIsIDB4ODAsIDB4NDIsIDB4OTAsIDB4NzAsIDB4MTAsIDB4ZTAsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4OTMsIDB4ZTQsIDB4ZmQsIDB4YWYsCisweDU2LCAweDEyLCAweDBiLCAweGFhLCAweDkwLCAweDA0LCAweDE0LCAweDc0LCAweDgwLCAweGYwLCAweGU0LCAweDkwLCAweDcwLCAweDEzLCAweGYwLCAweGU1LAorMHg1NiwgMHhmNCwgMHg2MCwgMHgyYSwgMHg4MCwgMHgyMSwgMHg5MCwgMHg3MCwgMHgxMCwgMHhlMCwgMHgyNCwgMHhmZiwgMHg5MiwgMHg0YSwgMHhkMiwgMHgwNSwKKzB4YWQsIDB4NTcsIDB4YWYsIDB4NTYsIDB4MTIsIDB4MGIsIDB4YWEsIDB4OTAsIDB4MDQsIDB4MTQsIDB4NzQsIDB4ODAsIDB4ZjAsIDB4ZTQsIDB4OTAsIDB4NzAsCisweDEzLCAweGYwLCAweGU1LCAweDU2LCAweGY0LCAweDYwLCAweDA3LCAweDkwLCAweDcwLCAweDI1LCAweGUwLCAweDQ0LCAweDAxLCAweGYwLCAweDIyLCAweDIyLAorMHhlNSwgMHg1MywgMHg3MCwgMHgxYSwgMHgzMCwgMHg2MCwgMHgwOSwgMHhiMiwgMHg0ZCwgMHgzMCwgMHg0ZCwgMHgwNCwgMHgwNSwgMHg0NiwgMHhjMiwgMHgwNCwKKzB4ZTUsIDB4NGYsIDB4NDUsIDB4NGUsIDB4NjAsIDB4MDgsIDB4ZTUsIDB4NGYsIDB4MTUsIDB4NGYsIDB4NzAsIDB4MDIsIDB4MTUsIDB4NGUsIDB4MjIsIDB4MjIsCisweGMyLCAweDQyLCAweGQzLCAweDIyLCAweDMwLCAweDE0LCAweDMwLCAweDkwLCAweDcwLCAweDE5LCAweGUwLCAweDU1LCAweDI3LCAweGZmLCAweDkwLCAweDcwLAorMHgxOCwgMHhlMCwgMHg0ZiwgMHhmNSwgMHgyNywgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHhmZiwgMHg5MCwgMHg3MCwgMHgxOSwgMHhlMCwgMHhmZSwgMHhlZiwKKzB4NWUsIDB4OTAsIDB4MDIsIDB4MjksIDB4ZjAsIDB4MzAsIDB4NDcsIDB4MDQsIDB4YWYsIDB4MjcsIDB4ODAsIDB4MDQsIDB4ZTUsIDB4MjcsIDB4ZjQsIDB4ZmYsCisweDkwLCAweDAyLCAweDI4LCAweGVmLCAweGYwLCAweGMyLCAweDE0LCAweDIyLCAweGMyLCAweDRiLCAweGMyLCAweDRjLCAweGU1LCAweDQ0LCAweDEyLCAweDBhLAorMHhiNiwgMHgxMywgMHg5YSwgMHgwMCwgMHgxNCwgMHgyOCwgMHgwNCwgMHgxNCwgMHgyNCwgMHgwOCwgMHgxNCwgMHgwNCwgMHgxMCwgMHgxMywgMHhhZSwgMHgyMCwKKzB4MTMsIDB4Y2UsIDB4NjAsIDB4MTMsIDB4ZGYsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MmEsIDB4ODUsIDB4NDgsIDB4NDMsIDB4ODUsIDB4NGEsIDB4NDIsCisweDg1LCAweDRjLCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDYwLCAweDAzLCAweDAyLCAweDE0LCAweDJhLCAweDgwLCAweDFiLCAweGU1LCAweDQ4LAorMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YSwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0YywgMHhjNCwgMHg1NCwKKzB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4NjEsIDB4NTMsIDB4NDMsIDB4MGYsIDB4ODAsIDB4NWMsIDB4ODUsIDB4NDksCisweDQzLCAweDg1LCAweDRiLCAweDQyLCAweDg1LCAweDRkLCAweDVlLCAweGU1LCAweDQ3LCAweDY0LCAweDA2LCAweDcwLCAweDRkLCAweDgwLCAweDFiLCAweGU1LAorMHg0OSwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MywgMHhlNSwgMHg0YiwgMHhjNCwgMHg1NCwgMHgwZiwgMHhmNSwgMHg0MiwgMHhlNSwgMHg0ZCwgMHhjNCwKKzB4NTQsIDB4MGYsIDB4ZjUsIDB4NWUsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDYsIDB4NzAsIDB4MzAsIDB4ZTUsIDB4NDMsIDB4NTQsIDB4MGYsIDB4NDQsIDB4MTAsCisweGY1LCAweDQzLCAweDgwLCAweDI2LCAweGU1LCAweDQ3LCAweDY0LCAweDA0LCAweDYwLCAweDA1LCAweGU1LCAweDQ3LCAweGI0LCAweDA1LCAweDA2LCAweDQzLAorMHg1ZSwgMHgwNCwgMHg3NSwgMHg0MiwgMHgwOSwgMHhlNSwgMHg0NywgMHhiNCwgMHgwNiwgMHgxMCwgMHhlNSwgMHg0MywgMHg1NCwgMHgwZiwgMHg0NCwgMHgzMCwKKzB4ZjUsIDB4NDMsIDB4ODAsIDB4MDYsIDB4ZDIsIDB4NGIsIDB4ODAsIDB4MDIsIDB4ZDIsIDB4NGMsIDB4ZTQsIDB4ZjUsIDB4MjUsIDB4ZTUsIDB4NDIsIDB4YzQsCisweDU0LCAweGYwLCAweGZmLCAweGU1LCAweDQzLCAweDU0LCAweDBmLCAweDRmLCAweGY1LCAweDVmLCAweGQyLCAweDYwLCAweDIyLCAweGQyLCAweDE1LCAweGU1LAorMHg0NywgMHgyNCwgMHhmNSwgMHg2MCwgMHgwYiwgMHgyNCwgMHhjYiwgMHg2MCwgMHgwNywgMHgyNCwgMHg0MCwgMHg3MCwgMHgwNiwgMHhjMiwgMHgxNSwgMHgyMiwKKzB4MTIsIDB4MTcsIDB4NzksIDB4MTIsIDB4MTQsIDB4NWYsIDB4YzIsIDB4MTUsIDB4YzIsIDB4YWYsIDB4YzIsIDB4MDQsIDB4ZDIsIDB4YWYsIDB4MjIsIDB4YzIsCisweGFmLCAweDkwLCAweDA0LCAweDE0LCAweGUwLCAweDU0LCAweDBlLCAweDYwLCAweDA0LCAweGQyLCAweDE4LCAweDgwLCAweDA4LCAweGU1LCAweDRlLCAweDQ1LAorMHg0ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHgxOCwgMHhkMiwgMHhhZiwgMHg5MCwgMHgwNCwgMHgxNCwgMHhlMCwgMHhhMiwgMHhlNCwgMHg5MiwgMHgxOSwgMHg3NCwKKzB4MWUsIDB4ZjAsIDB4ZTUsIDB4NWYsIDB4NTQsIDB4MGYsIDB4ZjUsIDB4MmQsIDB4ZTUsIDB4MjUsIDB4NzAsIDB4MTMsIDB4MzAsIDB4MTgsIDB4MDUsIDB4ZTUsCisweDVmLCAweDIwLCAweGU1LCAweDBiLCAweDMwLCAweDE5LCAweDE5LCAweGU1LCAweDVmLCAweDU0LCAweDMwLCAweGZmLCAweGJmLCAweDMwLCAweDExLCAweGU1LAorMHgyNSwgMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwYywgMHg4MCwgMHgwMiwgMHgxNSwgMHgyNSwgMHhkMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwZiwKKzB4ZTUsIDB4NWYsIDB4MzAsIDB4ZTYsIDB4MDYsIDB4YzIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ODAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4ZTUsCisweDQ3LCAweDY0LCAweDAzLCAweDcwLCAweDIxLCAweDMwLCAweDRiLCAweDA2LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweDgwLCAweDE4LCAweGU1LCAweDI1LAorMHg3MCwgMHgwMywgMHgzMCwgMHg0YywgMHgxMSwgMHhjMiwgMHg0YywgMHhlNSwgMHgyNSwgMHg3MCwgMHgwNSwgMHg3NSwgMHgyNSwgMHgwNywgMHg4MCwgMHgwMiwKKzB4MTUsIDB4MjUsIDB4ZDIsIDB4NmMsIDB4ZDIsIDB4NmQsIDB4ZTUsIDB4NDcsIDB4YjQsIDB4MDksIDB4MTQsIDB4ZTUsIDB4NDQsIDB4MjAsIDB4ZTMsIDB4MGIsCisweGU1LCAweDNhLCAweDY0LCAweDAyLCAweDYwLCAweDA1LCAweGU1LCAweDNhLCAweGI0LCAweDAzLCAweDA0LCAweGMyLCAweDZjLCAweGQyLCAweDZkLCAweGU1LAorMHg0NywgMHhiNCwgMHgwYSwgMHgxMywgMHhlNSwgMHgzYSwgMHhiNCwgMHgwMSwgMHgwNiwgMHhjMiwgMHg2YywgMHhkMiwgMHg2ZCwgMHg4MCwgMHgwOCwgMHhlNSwKKzB4M2EsIDB4NzAsIDB4MDQsIDB4ZDIsIDB4NmMsIDB4YzIsIDB4NmQsIDB4MjAsIDB4NjksIDB4MDcsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTAsIDB4MDIsIDB4YjIsCisweDY4LCAweDIwLCAweDZiLCAweDA3LCAweGU1LCAweDVlLCAweDIwLCAweGUxLCAweDAyLCAweGIyLCAweDZhLCAweDIwLCAweDZkLCAweDA3LCAweGU1LCAweDVlLAorMHgyMCwgMHhlMiwgMHgwMiwgMHhiMiwgMHg2YywgMHg3NSwgMHgyZSwgMHg0MCwgMHgyMCwgMHg2OSwgMHgwNCwgMHhhMiwgMHg2OCwgMHg4MCwgMHgyNiwgMHgzMCwKKzB4NjgsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTIsIDB4ODAsIDB4MWQsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTIsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsCisweDAyLCAweDdmLCAweDAwLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZlLCAweGJlLCAweGYwLCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLAorMHgwMCwgMHhlZSwgMHg2ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHg3MywgMHg5MiwgMHg3MiwgMHgyMCwgMHg2YiwgMHgwNCwgMHhhMiwgMHg2YSwgMHg4MCwgMHgyNiwKKzB4MzAsIDB4NmEsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTIsIDB4ODAsIDB4MWQsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTAsIDB4MDQsIDB4N2YsIDB4MDEsCisweDgwLCAweDAyLCAweDdmLCAweDAwLCAweGU1LCAweDQ2LCAweDU0LCAweGYwLCAweGZlLCAweGJlLCAweGYwLCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLAorMHg3ZSwgMHgwMCwgMHhlZSwgMHg2ZiwgMHgyNCwgMHhmZiwgMHg5MiwgMHg3NSwgMHg5MiwgMHg3NCwgMHgyMCwgMHg2ZCwgMHgwNCwgMHhhMiwgMHg2YywgMHg4MCwKKzB4MjYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGEsIDB4NzAsIDB4MjIsIDB4MzAsIDB4NmMsIDB4MDYsIDB4ZTUsIDB4NDYsIDB4YTIsIDB4ZTMsIDB4ODAsIDB4MTcsCisweGU1LCAweDNhLCAweGI0LCAweDAxLCAweDA2LCAweGU1LCAweDQ2LCAweGEyLCAweGUzLCAweDgwLCAweDM0LCAweGU1LCAweDQ2LCAweDIwLCAweGU0LCAweDAzLAorMHgzMCwgMHhlNSwgMHgwMywgMHhkMywgMHg4MCwgMHgwMSwgMHhjMywgMHg4MCwgMHgyNiwgMHgzMCwgMHg2YywgMHgwNiwgMHhlNSwgMHg0NiwgMHhhMiwgMHhlMiwKKzB4ODAsIDB4MWQsIDB4ZTUsIDB4NWUsIDB4MjAsIDB4ZTEsIDB4MDQsIDB4N2YsIDB4MDEsIDB4ODAsIDB4MDIsIDB4N2YsIDB4MDAsIDB4ZTUsIDB4NDYsIDB4NTQsCisweGYwLCAweGZlLCAweGJlLCAweGYwLCAweDA0LCAweDdlLCAweDAxLCAweDgwLCAweDAyLCAweDdlLCAweDAwLCAweGVlLCAweDZmLCAweDI0LCAweGZmLCAweDkyLAorMHg3MSwgMHg5MiwgMHg3MCwgMHg5MCwgMHgxMCwgMHgwMCwgMHhlMCwgMHg5MCwgMHgxMCwgMHgyYywgMHhmMCwgMHg5MCwgMHgxMCwgMHgwMywgMHhlMCwgMHhjMywKKzB4OTQsIDB4MzAsIDB4NDAsIDB4MTQsIDB4YTIsIDB4NzEsIDB4OTIsIDB4NzcsIDB4YTIsIDB4NzAsIDB4OTIsIDB4NzYsIDB4ZTUsIDB4MmUsIDB4MTMsIDB4MTMsCisweDU0LCAweDNmLCAweGY1LCAweDJlLCAweGMyLCAweDc3LCAweGQyLCAweDc2LCAweDkwLCAweDEwLCAweDJmLCAweGU1LCAweDJlLCAweGYwLCAweGU1LCAweDQ3LAorMHg2NCwgMHgwNiwgMHg3MCwgMHgzOSwgMHg5MCwgMHgwMiwgMHgyOSwgMHhlMCwgMHg1NCwgMHhmZSwgMHhmMCwgMHhlNSwgMHg0MywgMHhjNCwgMHg1NCwgMHgwZiwKKzB4MTQsIDB4NjAsIDB4MGMsIDB4MjQsIDB4ZmUsIDB4NjAsIDB4MGMsIDB4MjQsIDB4MDMsIDB4NzAsIDB4MTMsIDB4YzIsIDB4MzgsIDB4ODAsIDB4MGYsIDB4ZDIsCisweDM4LCAweDgwLCAweDBiLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDM4LCAweDMwLCAweDQ3LAorMHgwNSwgMHhhZiwgMHgyNywgMHgwMiwgMHgxNywgMHg3MywgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwgMHgwMiwgMHgxNywgMHg3MywgMHhlNSwgMHg0NywgMHg2NCwKKzB4MDcsIDB4NjAsIDB4MGYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MDksIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MDksIDB4NjAsIDB4MDMsIDB4MDIsCisweDE2LCAweGYyLCAweDkwLCAweDAyLCAweDI5LCAweGUwLCAweDU0LCAweGZjLCAweGYwLCAweGU1LCAweDNhLCAweDE0LCAweDYwLCAweDIyLCAweDE0LCAweDYwLAorMHgyNSwgMHgxNCwgMHg2MCwgMHgyZCwgMHgyNCwgMHhmYywgMHg2MCwgMHg0OSwgMHgyNCwgMHhmOSwgMHg2MCwgMHgxNCwgMHgyNCwgMHgwZSwgMHg3MCwgMHg1MCwKKzB4ZTUsIDB4NDYsIDB4MTMsIDB4MTMsIDB4NTQsIDB4M2YsIDB4NzUsIDB4ZjAsIDB4MDMsIDB4ODQsIDB4ZTUsIDB4ZjAsIDB4MjQsIDB4ZmYsIDB4ODAsIDB4M2EsCisweGQyLCAweDM5LCAweGMyLCAweDM4LCAweDgwLCAweDNlLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDFkLCAweGMzLCAweDgwLAorMHgxYSwgMHhlNSwgMHg0NiwgMHgzMCwgMHhlMiwgMHgwZCwgMHg1NCwgMHgzOCwgMHhjMywgMHg5NCwgMHgzMCwgMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwKKzB4MDEsIDB4ODAsIDB4MDQsIDB4N2UsIDB4MDAsIDB4N2YsIDB4MDAsIDB4ZWUsIDB4NGYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzgsIDB4YzIsIDB4MzksIDB4ODAsCisweDEzLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDM5LCAweGMyLCAweDM4LCAweDgwLCAweDA0LAorMHhjMiwgMHgzOCwgMHhjMiwgMHgzOSwgMHgzMCwgMHg0NywgMHgwNCwgMHhhZiwgMHgyNywgMHg4MCwgMHgwNCwgMHhlNSwgMHgyNywgMHhmNCwgMHhmZiwgMHgwMiwKKzB4MTcsIDB4NzMsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGMsIDB4NjAsIDB4MDYsIDB4ZTUsIDB4NDcsIDB4NjQsIDB4MGIsIDB4NzAsIDB4N2EsIDB4OTAsIDB4MDIsCisweDI5LCAweGUwLCAweDU0LCAweGZkLCAweGYwLCAweGU1LCAweDNhLCAweDE0LCAweDYwLCAweDIwLCAweDE0LCAweDYwLCAweDIxLCAweDE0LCAweDYwLCAweDJiLAorMHgyNCwgMHhmYywgMHg2MCwgMHg0NSwgMHgyNCwgMHhmOSwgMHg2MCwgMHgxMiwgMHgyNCwgMHgwZSwgMHg3MCwgMHg0YSwgMHhlNSwgMHg0NiwgMHgxMywgMHgxMywKKzB4NTQsIDB4M2YsIDB4NzUsIDB4ZjAsIDB4MDMsIDB4ODQsIDB4ZTUsIDB4ZjAsIDB4ODAsIDB4MjksIDB4ZDIsIDB4MzksIDB4ODAsIDB4M2EsIDB4ZTUsIDB4NDYsCisweDMwLCAweGUyLCAweDAzLCAweGQzLCAweDgwLCAweDAxLCAweGMzLCAweDkyLCAweDM5LCAweDgwLCAweDJkLCAweGU1LCAweDQ2LCAweDMwLCAweGUyLCAweDBkLAorMHg1NCwgMHgzOCwgMHhjMywgMHg5NCwgMHgzMCwgMHg1MCwgMHgwNiwgMHg3ZSwgMHgwMCwgMHg3ZiwgMHgwMSwgMHg4MCwgMHgwNCwgMHg3ZSwgMHgwMCwgMHg3ZiwKKzB4MDAsIDB4ZWUsIDB4NGYsIDB4MjQsIDB4ZmYsIDB4OTIsIDB4MzksIDB4ODAsIDB4MGYsIDB4ZTUsIDB4NDYsIDB4MzAsIDB4ZTIsIDB4MDMsIDB4ZDMsIDB4ODAsCisweDAxLCAweGMzLCAweDkyLCAweDM5LCAweDgwLCAweDAyLCAweGMyLCAweDM5LCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDI3LCAweDgwLCAweDA0LCAweGU1LAorMHgyNywgMHhmNCwgMHhmZiwgMHg5MCwgMHgwMiwgMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHhlNSwgMHg0NywgMHhiNCwgMHgwYiwgMHgxMCwgMHg5MCwgMHgwMiwKKzB4MjksIDB4ZTAsIDB4NTQsIDB4ZWIsIDB4ZjAsIDB4ZTUsIDB4MjcsIDB4NTQsIDB4ZWIsIDB4NDUsIDB4NDUsIDB4ZjUsIDB4MjcsIDB4MjIsIDB4ZTQsIDB4OTAsCisweDAyLCAweDI5LCAweGYwLCAweDMwLCAweDQ3LCAweDA0LCAweGFmLCAweDQ1LCAweDgwLCAweDA0LCAweGU1LCAweDQ1LCAweGY0LCAweGZmLCAweDkwLCAweDAyLAorMHgyOCwgMHhlZiwgMHhmMCwgMHgyMiwgMHg4ZiwgMHg1MCwgMHhkMiwgMHg1OSwgMHgyMiwgMHg4ZiwgMHg1NCwgMHhkMiwgMHg1OCwgMHgyMiwgMHhlNCwgMHhmNSwKKzB4NjIsIDB4YzIsIDB4YWYsIDB4ZTUsIDB4NTEsIDB4MTQsIDB4NjAsIDB4NDgsIDB4MTQsIDB4NjAsIDB4NjYsIDB4MjQsIDB4MDIsIDB4NjAsIDB4MDMsIDB4MDIsCisweDE4LCAweGI2LCAweGQyLCAweDU5LCAweDc1LCAweDU1LCAweDAxLCAweDkwLCAweDAyLCAweGEyLCAweGUwLCAweDU0LCAweDdmLCAweGYwLCAweGEzLCAweGUwLAorMHgyMCwgMHhlNywgMHgyMywgMHg5MCwgMHgwNCwgMHgzNCwgMHhlMCwgMHhiNCwgMHgwMiwgMHgxYywgMHhhMywgMHhlMCwgMHhiNCwgMHgwMiwgMHgxNywgMHhhMywKKzB4ZTAsIDB4YjQsIDB4MDIsIDB4MTIsIDB4N2YsIDB4MjAsIDB4MTIsIDB4MTcsIDB4YTQsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsIDB4NTQsIDB4ZjMsIDB4ZjAsCisweDc1LCAweDUxLCAweDAxLCAweDAyLCAweDE4LCAweGI2LCAweGU1LCAweDUwLCAweDcwLCAweDA2LCAweDc1LCAweDYyLCAweDAzLCAweDAyLCAweDE4LCAweGI2LAorMHg5MCwgMHgxMiwgMHgwMCwgMHhlMCwgMHg1NCwgMHgwMywgMHg3MCwgMHgxMiwgMHg3ZiwgMHgyMCwgMHgxMiwgMHgxNywgMHhhNCwgMHg5MCwgMHgwMiwgMHhhMiwKKzB4ZTAsIDB4NTQsIDB4YmYsIDB4ZjAsIDB4NzUsIDB4NTEsIDB4MDIsIDB4MDIsIDB4MTgsIDB4YjYsIDB4ZTUsIDB4NTAsIDB4NzAsIDB4MDMsIDB4MDIsIDB4MTgsCisweGIxLCAweDkwLCAweDAyLCAweGEzLCAweGUwLCAweDMwLCAweGU2LCAweDAzLCAweDAyLCAweDE4LCAweGFkLCAweDkwLCAweDA0LCAweDM3LCAweGUwLCAweDY0LAorMHgyMiwgMHg3MCwgMHg3YSwgMHg5MCwgMHgwMSwgMHg4YSwgMHg3NCwgMHg3ZSwgMHhmMCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHg5MCwgMHgxMiwgMHgwNCwKKzB4NzQsIDB4MGEsIDB4ZjAsIDB4ZTUsIDB4NTgsIDB4YjQsIDB4NzIsIDB4MTUsIDB4ZTUsIDB4NTksIDB4YjQsIDB4MzUsIDB4MTAsIDB4ZTQsIDB4OTAsIDB4MDUsCisweDAwLCAweGYwLCAweGEzLCAweDc0LCAweDA4LCAweGYwLCAweGEzLCAweDc0LCAweDAxLCAweGYwLCAweDc0LCAweDAzLCAweGYwLCAweDdmLCAweDAxLCAweDEyLAorMHgwZCwgMHg0OCwgMHg5MCwgMHgxMywgMHgyOCwgMHhlMCwgMHg1NCwgMHhmMCwgMHhmMCwgMHhhMywgMHhlMCwgMHg1NCwgMHhmMCwgMHhmMCwgMHhlNSwgMHg1OSwKKzB4YjQsIDB4MzUsIDB4MTQsIDB4ZTUsIDB4M2MsIDB4ZjQsIDB4NjAsIDB4MDYsIDB4YTMsIDB4ZTAsIDB4NTQsIDB4ZjMsIDB4ODAsIDB4MTQsIDB4OTAsIDB4MTMsCisweDJhLCAweGUwLCAweDU0LCAweGZiLCAweGYwLCAweDgwLCAweDE0LCAweGU1LCAweDNjLCAweGY0LCAweDkwLCAweDEzLCAweDJhLCAweDYwLCAweDA4LCAweGUwLAorMHg1NCwgMHhmMiwgMHg0NSwgMHgzYywgMHhmMCwgMHg4MCwgMHgwNCwgMHhlMCwgMHg1NCwgMHhmYSwgMHhmMCwgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg1NCwKKzB4ZmQsIDB4ZjAsIDB4NzUsIDB4NjIsIDB4MDEsIDB4NzUsIDB4NTUsIDB4MDIsIDB4ZTQsIDB4ZjUsIDB4NTEsIDB4ODAsIDB4MDksIDB4ZTUsIDB4NTAsIDB4NzAsCisweDA1LCAweDc1LCAweDYyLCAweDAzLCAweGY1LCAweDUxLCAweGU1LCAweDYyLCAweDYwLCAweDE1LCAweGMyLCAweDAxLCAweGU0LCAweGY1LCAweDUxLCAweGMyLAorMHg1OSwgMHhhZCwgMHg2MiwgMHhhZiwgMHg0MCwgMHgxMiwgMHgxOSwgMHg2MSwgMHhlNSwgMHg2MiwgMHhiNCwgMHgwMywgMHgwMiwgMHhkMiwgMHgwMywgMHhkMiwKKzB4YWYsIDB4MjIsIDB4YzIsIDB4YWYsIDB4MzAsIDB4MDEsIDB4MTIsIDB4ZTQsIDB4OTAsIDB4MDEsIDB4OTYsIDB4ZjAsIDB4ZjUsIDB4NTEsIDB4YzIsIDB4NTksCisweGMyLCAweDAxLCAweDdkLCAweDAyLCAweGFmLCAweDQwLCAweDEyLCAweDE5LCAweDYxLCAweGU1LCAweDUyLCAweDE0LCAweDYwLCAweDA5LCAweDA0LCAweDcwLAorMHg2ZCwgMHg3NSwgMHg1MiwgMHgwMSwgMHg3NSwgMHg1NSwgMHgwMywgMHg5MCwgMHgwNCwgMHgwMSwgMHhlMCwgMHg0NCwgMHgwZSwgMHhmMCwgMHg5MCwgMHgxMywKKzB4MjgsIDB4ZTAsIDB4NDQsIDB4MGYsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NDQsIDB4MGYsIDB4ZjAsIDB4YTMsIDB4ZTAsIDB4NDQsIDB4MDUsIDB4ZjAsIDB4OTAsCisweDEyLCAweDA0LCAweDc0LCAweDAzLCAweGYwLCAweGU1LCAweDU4LCAweGI0LCAweDcyLCAweDE2LCAweGU1LCAweDU5LCAweGI0LCAweDM1LCAweDExLCAweDkwLAorMHgwNSwgMHgwMCwgMHg3NCwgMHhlMiwgMHhmMCwgMHhhMywgMHg3NCwgMHgwOCwgMHhmMCwgMHhhMywgMHg3NCwgMHgwMSwgMHhmMCwgMHg3NCwgMHgwMywgMHhmMCwKKzB4N2YsIDB4MDEsIDB4MTIsIDB4MGQsIDB4NDgsIDB4OTAsIDB4MDIsIDB4YTIsIDB4ZTAsIDB4NDQsIDB4YzAsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MDQsIDB4ZTAsCisweDQ0LCAweDBjLCAweGYwLCAweGU0LCAweGY1LCAweDUyLCAweGY1LCAweDU1LCAweDMwLCAweDAyLCAweDA5LCAweGMyLCAweDAyLCAweDdkLCAweDAxLCAweGFmLAorMHg0MSwgMHgxMiwgMHgxOSwgMHg2MSwgMHgzMCwgMHgwMywgMHgwMiwgMHhjMiwgMHgwMywgMHhlNCwgMHg5MCwgMHgwMSwgMHg5NiwgMHhmMCwgMHhkMiwgMHhhZiwKKzB4MjIsIDB4ZWYsIDB4ZjQsIDB4NjAsIDB4MmQsIDB4ZTQsIDB4ZmUsIDB4NzQsIDB4MTQsIDB4MmUsIDB4ZjUsIDB4ODIsIDB4ZTQsIDB4MzQsIDB4NzAsIDB4ZjUsCisweDgzLCAweGUwLCAweGI0LCAweGZmLCAweDE5LCAweDc0LCAweDE0LCAweDJlLCAweGY1LCAweDgyLCAweGU0LCAweDM0LCAweDcwLCAweGY1LCAweDgzLCAweGVmLAorMHhmMCwgMHg3NCwgMHgxYywgMHgyZSwgMHhmNSwgMHg4MiwgMHhlNCwgMHgzNCwgMHg3MCwgMHhmNSwgMHg4MywgMHhlZCwgMHhmMCwgMHgyMiwgMHgwZSwgMHhiZSwKKzB4MDQsIDB4ZDUsIDB4MjIsIDB4MjIsIDB4MjIsIDB4OTAsIDB4NzAsIDB4MmEsIDB4ZTAsIDB4MzAsIDB4ZTEsIDB4NGQsIDB4YzIsIDB4YWYsIDB4OTAsIDB4NzAsCisweDI4LCAweGUwLCAweDkwLCAweDEwLCAweDFjLCAweGYwLCAweDkwLCAweDcwLCAweDI5LCAweGUwLCAweDkwLCAweDEwLCAweDFkLCAweGYwLCAweDkwLCAweDcwLAorMHgyYSwgMHhlMCwgMHg5MCwgMHgxMCwgMHgxZSwgMHhmMCwgMHg5MCwgMHgxMCwgMHgxYywgMHhlMCwgMHhmNSwgMHg2MiwgMHg5MCwgMHgxMCwgMHgxZSwgMHhlMCwKKzB4MjAsIDB4ZTEsIDB4ZjMsIDB4OTAsIDB4MTAsIDB4MWMsIDB4ZTAsIDB4OTAsIDB4NzAsIDB4MjgsIDB4ZjAsIDB4OTAsIDB4MTAsIDB4MWQsIDB4ZTAsIDB4OTAsCisweDcwLCAweDI5LCAweGYwLCAweDkwLCAweDEwLCAweDFlLCAweGUwLCAweDkwLCAweDcwLCAweDJhLCAweGYwLCAweDMwLCAweDRhLCAweDA3LCAweDkwLCAweDcwLAorMHgyNCwgMHhlMCwgMHg0NCwgMHgwMSwgMHhmMCwgMHhjMiwgMHgwNSwgMHhkMiwgMHhhZiwgMHgyMiwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4NjUsIDB4ZDMsIH0gOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWQ1LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4ODNjYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tZDUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtZDUuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncwotCWphbgkJCTEwLTI4LTAzCQlJbml0aWFsCi0JUml0YSAgICAJMTEtMjMtMDQJCU1vZGlmeSBNRDUgYW5kIFNIQS0xCi0JUml0YQkJMTAtMTQtMDUJCU1vZGlmeSBTSEEtMSBpbiBiaWctZW5kaWFuIHBsYXRmb3JtCi0gKi8KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotLyoqCi0gKiBtZDVfbWFjOgotICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCi0gKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKLSAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCi0gKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcwotICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCi0gKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKLSAqCi0gKiBtZDVfbWFjKCkgZGV0ZXJtaW5lcwl0aGUJbWVzc2FnZQlhdXRoZW50aWNhdGlvbiBjb2RlCWJ5IHVzaW5nIHNlY3VyZQloYXNoCi0gKiBNRDUoa2V5IHwgZGF0YSB8CWtleSkuCi0gKi8KLXZvaWQgbWQ1X21hYyh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKLXsKLQlNRDVfQ1RYCWNvbnRleHQ7Ci0KLQlNRDVJbml0KCZjb250ZXh0KTsKLQlNRDVVcGRhdGUoJmNvbnRleHQsCWtleSwga2V5X2xlbik7Ci0JTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7Ci0JTUQ1VXBkYXRlKCZjb250ZXh0LAlrZXksIGtleV9sZW4pOwotCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwotfQotCi0vKioKLSAqIGhtYWNfbWQ1OgotICogQGtleTogcG9pbnRlciB0bwl0aGUJa2V5CXVzZWQgZm9yIE1BQyBnZW5lcmF0aW9uCi0gKiBAa2V5X2xlbjogbGVuZ3RoCW9mIHRoZSBrZXkgaW4gYnl0ZXMKLSAqIEBkYXRhOiBwb2ludGVyIHRvIHRoZSBkYXRhIGFyZWEgZm9yIHdoaWNoIHRoZSBNQUMgaXMJZ2VuZXJhdGVkCi0gKiBAZGF0YV9sZW46IGxlbmd0aCBvZgl0aGUJZGF0YSBpbglieXRlcwotICogQG1hYzogcG9pbnRlciB0bwl0aGUJYnVmZmVyIGhvbGRpbmcgc3BhY2UgZm9yIHRoZSBNQUM7IHRoZSBidWZmZXIgc2hvdWxkCi0gKiBoYXZlCXNwYWNlIGZvciAxMjgtYml0ICgxNiBieXRlcykgTUQ1IGhhc2ggdmFsdWUKLSAqCi0gKiBobWFjX21kNSgpIGRldGVybWluZXMgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24JY29kZSB1c2luZyBITUFDLU1ENS4KLSAqIFRoaXMJaW1wbGVtZW50YXRpb24gaXMgYmFzZWQJb24gdGhlIHNhbXBsZSBjb2RlIHByZXNlbnRlZCBpbglSRkMJMjEwNC4KLSAqLwotdm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYykKLXsKLQlNRDVfQ1RYCWNvbnRleHQ7Ci0gICAgdTgga19pcGFkWzY1XTsgLyogaW5uZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggaXBhZCAqLwotICAgIHU4IGtfb3BhZFs2NV07IC8qIG91dGVyIHBhZGRpbmcgLSBrZXkgWE9SZCB3aXRoIG9wYWQgKi8KLSAgICB1OCB0a1sxNl07Ci0JaW50CWk7Ci0KLQkvL2Fzc2VydChrZXkgIT0gTlVMTCAmJiBkYXRhICE9IE5VTEwgJiYgbWFjICE9IE5VTEwpOwotCi0JLyogaWYga2V5IGlzIGxvbmdlcgl0aGFuIDY0CWJ5dGVzIHJlc2V0CWl0IHRvIGtleSA9CU1ENShrZXkpICovCi0JaWYgKGtleV9sZW4JPiA2NCkgewotCQlNRDVfQ1RYCXR0Y29udGV4dDsKLQotCQlNRDVJbml0KCZ0dGNvbnRleHQpOwotCQlNRDVVcGRhdGUoJnR0Y29udGV4dCwga2V5LCBrZXlfbGVuKTsKLQkJTUQ1RmluYWwodGssICZ0dGNvbnRleHQpOwotCQkvL2tleT0oUFVDSEFSKXR0Y29udGV4dC5idWY7Ci0JCWtleQk9IHRrOwotCQlrZXlfbGVuCT0gMTY7Ci0JfQotCi0JLyogdGhlIEhNQUNfTUQ1CXRyYW5zZm9ybSBsb29rcwlsaWtlOgotCSAqCi0JICogTUQ1KEsgWE9SIG9wYWQsIE1ENShLIFhPUiBpcGFkLCB0ZXh0KSkKLQkgKgotCSAqIHdoZXJlIEsgaXMgYW4gbiBieXRlCWtleQotCSAqIGlwYWQJaXMgdGhlIGJ5dGUJMHgzNiByZXBlYXRlZCA2NCB0aW1lcwotCSAqIG9wYWQJaXMgdGhlIGJ5dGUJMHg1YyByZXBlYXRlZCA2NCB0aW1lcwotCSAqIGFuZCB0ZXh0CWlzIHRoZSBkYXRhCWJlaW5nIHByb3RlY3RlZAkqLwotCi0JLyogc3RhcnQgb3V0IGJ5CXN0b3JpbmcJa2V5CWluIHBhZHMJKi8KLQlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKLQlOZGlzWmVyb01lbW9yeShrX29wYWQsCXNpemVvZihrX29wYWQpKTsKLQkvL2Fzc2VydChrZXlfbGVuIDwgc2l6ZW9mKGtfaXBhZCkpOwotCU5kaXNNb3ZlTWVtb3J5KGtfaXBhZCwga2V5LAlrZXlfbGVuKTsKLQlOZGlzTW92ZU1lbW9yeShrX29wYWQsIGtleSwJa2V5X2xlbik7Ci0KLQkvKiBYT1Iga2V5IHdpdGgJaXBhZCBhbmQgb3BhZCB2YWx1ZXMgKi8KLQlmb3IJKGkgPSAwOwlpIDwJNjQ7CWkrKykgewotCQlrX2lwYWRbaV0gXj0gMHgzNjsKLQkJa19vcGFkW2ldIF49IDB4NWM7Ci0JfQotCi0JLyogcGVyZm9ybSBpbm5lciBNRDUgKi8KLQlNRDVJbml0KCZjb250ZXh0KTsJCQkJCSAvKglpbml0IGNvbnRleHQgZm9yIDFzdCBwYXNzICovCi0JTUQ1VXBkYXRlKCZjb250ZXh0LAlrX2lwYWQsCTY0KTsJIC8qCXN0YXJ0IHdpdGggaW5uZXIgcGFkICovCi0JTUQ1VXBkYXRlKCZjb250ZXh0LAlkYXRhLCBkYXRhX2xlbik7IC8qCXRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLwotCU1ENUZpbmFsKG1hYywgJmNvbnRleHQpOwkJCSAvKglmaW5pc2ggdXAgMXN0IHBhc3MgKi8KLQotCS8qIHBlcmZvcm0gb3V0ZXIgTUQ1ICovCi0JTUQ1SW5pdCgmY29udGV4dCk7CQkJCQkgLyoJaW5pdCBjb250ZXh0IGZvciAybmQgcGFzcyAqLwotCU1ENVVwZGF0ZSgmY29udGV4dCwJa19vcGFkLAk2NCk7CSAvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLwotCU1ENVVwZGF0ZSgmY29udGV4dCwJbWFjLCAxNik7CQkgLyoJdGhlbiByZXN1bHRzIG9mCTFzdAloYXNoICovCi0JTUQ1RmluYWwobWFjLCAmY29udGV4dCk7CQkJIC8qCWZpbmlzaCB1cCAybmQgcGFzcyAqLwotfQotCi0jZGVmaW5lIGJ5dGVSZXZlcnNlKGJ1ZiwgbGVuKSAgIC8qIE5vdGhpbmcgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT0gIE1ENSBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIE1ENQotI2RlZmluZSBNRDVfRjEoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQotI2RlZmluZSBNRDVfRjIoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQotI2RlZmluZSBNRDVfRjMoeCwgeSwgeikgKCh4KSBeICh5KSBeICh6KSkKLSNkZWZpbmUgTUQ1X0Y0KHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpCi0jZGVmaW5lIENZQ0xJQ19MRUZUX1NISUZUKHcsIHMpICgoKHcpIDw8IChzKSkgfCAoKHcpID4+ICgzMi0ocykpKSkKLQotI2RlZmluZQlNRDVTdGVwKGYsIHcsIHgsIHksCXosIGRhdGEsIHQsIHMpCVwKLQkoIHcJKz0gZih4LAl5LCB6KSArCWRhdGEgKyB0LCAgdyA9IChDWUNMSUNfTEVGVF9TSElGVCh3LCBzKSkgJiAweGZmZmZmZmZmLCB3ICs9CXggKQotCi0KLS8qCi0gKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246Ci0gKiAgICAgIEluaXRpYXRlIE1ENSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMTMyMQotICoKLSAqICBBcmd1bWVudHM6Ci0gKiAgICAgIHBDdHggICAgICAgIFBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKLSAqCi0gKiAgUmV0dXJuIFZhbHVlOgotICogICAgICBOb25lCi0gKi8KLVZPSUQgTUQ1SW5pdChNRDVfQ1RYICpwQ3R4KQotewotICAgIHBDdHgtPkJ1ZlswXT0weDY3NDUyMzAxOwotICAgIHBDdHgtPkJ1ZlsxXT0weGVmY2RhYjg5OwotICAgIHBDdHgtPkJ1ZlsyXT0weDk4YmFkY2ZlOwotICAgIHBDdHgtPkJ1ZlszXT0weDEwMzI1NDc2OwotCi0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXT0wOwotICAgIHBDdHgtPkxlbkluQml0Q291bnRbMV09MDsKLX0KLQotCi0vKgotICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgotICogICAgICBVcGRhdGUgTUQ1IENvbnRleHQsIGFsbG93IG9mIGFuIGFycmFyeSBvZiBvY3RldHMgYXMgdGhlIG5leHQgcG9ydGlvbgotICogICAgICBvZiB0aGUgbWVzc2FnZQotICoKLSAqICBBcmd1bWVudHM6Ci0gKiAgICAgIHBDdHgJCVBvaW50ZXIJdG8gTUQ1IGNvbnRleHQKLSAqIAkgICAgcERhdGEgICAgICAgUG9pbnRlciB0byBpbnB1dCBkYXRhCi0gKiAgICAgIExlbkluQnl0ZXMgIFRoZSBsZW5ndGggb2YgaW5wdXQgZGF0YSAodW5pdDogYnl0ZSkKLSAqCi0gKiAgUmV0dXJuIFZhbHVlOgotICogICAgICBOb25lCi0gKgotICogIE5vdGU6Ci0gKiAgICAgIENhbGxlZCBhZnRlciBNRDVJbml0IG9yIE1ENVVwZGF0ZShpdHNlbGYpCi0gKi8KLVZPSUQgTUQ1VXBkYXRlKE1ENV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCi17Ci0KLSAgICBVSU5UMzIgVGZUaW1lczsKLSAgICBVSU5UMzIgdGVtcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotICAgIHRlbXAgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOwotCi0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFswXSA9IChVSU5UMzIpIChwQ3R4LT5MZW5JbkJpdENvdW50WzBdICsgKExlbkluQnl0ZXMgPDwgMykpOwotCi0gICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPCB0ZW1wKQotICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgotCi0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXSArPSBMZW5JbkJ5dGVzID4+IDI5OwotCi0gICAgLy8gbW9kIDY0IGJ5dGVzCi0gICAgdGVtcCA9ICh0ZW1wID4+IDMpICYgMHgzZjsKLQotICAgIC8vIHByb2Nlc3MgbGFja3Mgb2YgNjQtYnl0ZSBkYXRhCi0gICAgaWYgKHRlbXApCi0gICAgewotICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXA7Ci0KLSAgICAgICAgaWYgKCh0ZW1wK0xlbkluQnl0ZXMpIDwgNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCBMZW5JbkJ5dGVzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wKTsKLSAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLQotICAgICAgICBwRGF0YSArPSA2NC10ZW1wOwotICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXA7Ci0gICAgfSAvLyBlbmQgb2YgaWYgKHRlbXApCi0KLQotICAgIFRmVGltZXMgPSAoTGVuSW5CeXRlcyA+PiA2KTsKLQotICAgIGZvciAoaT1UZlRpbWVzOyBpPjA7IGktLSkKLSAgICB7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBDdHgtPklucHV0LCAoVUNIQVIgKilwRGF0YSwgNjQpOwotICAgICAgICBieXRlUmV2ZXJzZShwQ3R4LT5JbnB1dCwgMTYpOwotICAgICAgICBNRDVUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotICAgICAgICBwRGF0YSArPSA2NDsKLSAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKLSAgICB9IC8vIGVuZCBvZiBmb3IKLQotICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKLSAgICBpZihMZW5JbkJ5dGVzKQotICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOwotCi19Ci0KLQotLyoKLSAqICBGdW5jdGlvbiBEZXNjcmlwdGlvbjoKLSAqICAgICAgQXBwZW5kIHBhZGRpbmcgYml0cyBhbmQgbGVuZ3RoIG9mIG9yaWdpbmFsIG1lc3NhZ2UgaW4gdGhlIHRhaWwKLSAqICAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAotICoKLSAqICBBcmd1bWVudHM6Ci0gKiAgICAgIERpZ2VzdAkJT3V0cHV0IG9mIERpZ2VzdC1NZXNzYWdlIGZvciBNRDUKLSAqICAJcEN0eCAgICAgICAgUG9pbnRlcgl0byBNRDUgY29udGV4dAotICoKLSAqICBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgIE5vbmUKLSAqCi0gKiAgTm90ZToKLSAqICAgICAgQ2FsbGVkIGFmdGVyIE1ENVVwZGF0ZQotICovCi1WT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpCi17Ci0gICAgVUNIQVIgUmVtYWluZGVyOwotICAgIFVDSEFSIFBhZExlbkluQnl0ZXM7Ci0gICAgVUNIQVIgKnBBcHBlbmQ9MDsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIFJlbWFpbmRlciA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gMykgJiAweDNmKTsKLQotICAgIFBhZExlbkluQnl0ZXMgPSAoUmVtYWluZGVyIDwgNTYpID8gKDU2LVJlbWFpbmRlcikgOiAoMTIwLVJlbWFpbmRlcik7Ci0KLSAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7Ci0KLSAgICAvLyBwYWRkaW5nIGJpdHMgd2l0aG91dCBjcm9zc2luZyBibG9jayg2NC1ieXRlIGJhc2VkKSBib3VuZGFyeQotICAgIGlmIChSZW1haW5kZXIgPCA1NikKLSAgICB7Ci0gICAgICAgICpwQXBwZW5kID0gMHg4MDsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCBQYWRMZW5JbkJ5dGVzKTsKLQotCQkvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQsIGZyb20gbG93IHRvIGhpZ2gKLSAgICAgICAJZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7Ci0gICAgICAJfQotCi0gICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0gICAgfSAvLyBlbmQgb2YgaWYKLQotICAgIC8vIHBhZGRpbmcgYml0cyB3aXRoIGNyb3NzaW5nIGJsb2NrKDY0LWJ5dGUgYmFzZWQpIGJvdW5kYXJ5Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gdGhlIGZpcnN0IGJsb2NrID09PQotICAgICAgICAqcEFwcGVuZCA9IDB4ODA7Ci0gICAgICAgIFBhZExlbkluQnl0ZXMgLS07Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgKDY0LVJlbWFpbmRlci0xKSk7Ci0gICAgICAgIFBhZExlbkluQnl0ZXMgLT0gKDY0IC0gUmVtYWluZGVyIC0gMSk7Ci0KLSAgICAgICAgYnl0ZVJldmVyc2UocEN0eC0+SW5wdXQsIDE2KTsKLSAgICAgICAgTUQ1VHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLQotCi0gICAgICAgIC8vIHRoZSBzZWNvbmQgYmxvY2sgPT09Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0LCBQYWRMZW5JbkJ5dGVzKTsKLQotICAgICAgICAvLyBhZGQgZGF0YS1sZW5ndGggZmllbGQKLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs1NitpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMF0gPj4gKGkgPDwgMykpICYgMHhmZik7Ci0gICAgICAgIAlwQ3R4LT5JbnB1dFs2MCtpXSA9IChVQ0hBUikoKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPj4gKGkgPDwgMykpICYgMHhmZik7Ci0gICAgICAJfQotCi0gICAgICAgIGJ5dGVSZXZlcnNlKHBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE1ENVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0gICAgfSAvLyBlbmQgb2YgZWxzZQotCi0KLSAgICBOZGlzTW92ZU1lbW9yeSgoVUNIQVIgKilEaWdlc3QsIChVSU5UMzIgKilwQ3R4LT5CdWYsIDE2KTsgLy8gb3V0cHV0Ci0gICAgYnl0ZVJldmVyc2UoKFVDSEFSICopRGlnZXN0LCA0KTsKLSAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQotfQotCi0KLS8qCi0gKiAgRnVuY3Rpb24gRGVzY3JpcHRpb246Ci0gKiAgICAgIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBNRDUsIGNvbnNpc3RzIG9mIGZvdXIgcm91bmRzIGFuZCBzaXh0ZWVuCi0gKiAgCXN0ZXBzIHBlciByb3VuZAotICoKLSAqICBBcmd1bWVudHM6Ci0gKiAgICAgIEJ1ZiAgICAgQnVmZmVycyBvZiBmb3VyIHN0YXRlcyAob3V0cHV0OiAxNiBieXRlcykKLSAqIAkgICAgTWVzICAgICBJbnB1dCBkYXRhIChpbnB1dDogNjQgYnl0ZXMpCi0gKgotICogIFJldHVybiBWYWx1ZToKLSAqICAgICAgTm9uZQotICoKLSAqICBOb3RlOgotICogICAgICBDYWxsZWQgYnkgTUQ1VXBkYXRlIG9yIE1ENUZpbmFsCi0gKi8KLVZPSUQgTUQ1VHJhbnNmb3JtKFVJTlQzMiBCdWZbNF0sIFVJTlQzMiBNZXNbMTZdKQotewotICAgIFVJTlQzMiBSZWdbNF0sIFRlbXA7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLSAgICBzdGF0aWMgVUNIQVIgTFNoaWZ0VmFsWzE2XSA9Ci0gICAgewotICAgICAgICA3LCAxMiwgMTcsIDIyLAotCQk1LCA5ICwgMTQsIDIwLAotCQk0LCAxMSwgMTYsIDIzLAotIAkJNiwgMTAsIDE1LCAyMSwKLSAJfTsKLQotCi0JLy8gW2VxdWFsIHRvIDQyOTQ5NjcyOTYqYWJzKHNpbihpbmRleCkpXQotICAgIHN0YXRpYyBVSU5UMzIgTUQ1VGFibGVbNjRdID0KLQl7Ci0JCTB4ZDc2YWE0NzgsCTB4ZThjN2I3NTYsCTB4MjQyMDcwZGIsCTB4YzFiZGNlZWUsCi0JCTB4ZjU3YzBmYWYsCTB4NDc4N2M2MmEsCTB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCi0JCTB4Njk4MDk4ZDgsCTB4OGI0NGY3YWYsCTB4ZmZmZjViYjEsCTB4ODk1Y2Q3YmUsCi0gICAgCTB4NmI5MDExMjIsCTB4ZmQ5ODcxOTMsCTB4YTY3OTQzOGUsCTB4NDliNDA4MjEsCi0KLSAgICAJMHhmNjFlMjU2MiwJMHhjMDQwYjM0MCwJMHgyNjVlNWE1MSwJMHhlOWI2YzdhYSwKLSAgICAJMHhkNjJmMTA1ZCwJMHgwMjQ0MTQ1MywJMHhkOGExZTY4MSwJMHhlN2QzZmJjOCwKLSAgICAJMHgyMWUxY2RlNiwJMHhjMzM3MDdkNiwJMHhmNGQ1MGQ4NywJMHg0NTVhMTRlZCwKLSAgICAJMHhhOWUzZTkwNSwJMHhmY2VmYTNmOCwJMHg2NzZmMDJkOSwJMHg4ZDJhNGM4YSwKLQotICAgIAkweGZmZmEzOTQyLAkweDg3NzFmNjgxLAkweDZkOWQ2MTIyLAkweGZkZTUzODBjLAotICAgIAkweGE0YmVlYTQ0LAkweDRiZGVjZmE5LAkweGY2YmI0YjYwLAkweGJlYmZiYzcwLAotICAgIAkweDI4OWI3ZWM2LAkweGVhYTEyN2ZhLAkweGQ0ZWYzMDg1LAkweDA0ODgxZDA1LAotICAgIAkweGQ5ZDRkMDM5LAkweGU2ZGI5OWU1LAkweDFmYTI3Y2Y4LAkweGM0YWM1NjY1LAotCi0gICAgCTB4ZjQyOTIyNDQsCTB4NDMyYWZmOTcsCTB4YWI5NDIzYTcsCTB4ZmM5M2EwMzksCi0gICAJCTB4NjU1YjU5YzMsCTB4OGYwY2NjOTIsCTB4ZmZlZmY0N2QsCTB4ODU4NDVkZDEsCi0gICAgCTB4NmZhODdlNGYsCTB4ZmUyY2U2ZTAsCTB4YTMwMTQzMTQsCTB4NGUwODExYTEsCi0gICAgCTB4Zjc1MzdlODIsCTB4YmQzYWYyMzUsCTB4MmFkN2QyYmIsCTB4ZWI4NmQzOTEKLQl9OwotCi0KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgICAgIFJlZ1tpXT1CdWZbaV07Ci0KLQotICAgIC8vIDY0IHN0ZXBzIGluIE1ENSBhbGdvcml0aG0KLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKQotICAgIHsKLSAgICAgICAgTUQ1U3RlcChNRDVfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzW2ldLAotICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbaSAmIDB4M10pOwotCi0gICAgICAgIC8vIG9uZS13b3JkIHJpZ2h0IHNoaWZ0Ci0gICAgICAgIFRlbXAgICA9IFJlZ1szXTsKLSAgICAgICAgUmVnWzNdID0gUmVnWzJdOwotICAgICAgICBSZWdbMl0gPSBSZWdbMV07Ci0gICAgICAgIFJlZ1sxXSA9IFJlZ1swXTsKLSAgICAgICAgUmVnWzBdID0gVGVtcDsKLSAgICB9Ci0gICAgZm9yIChpPTE2OyBpPDMyOyBpKyspCi0gICAgewotICAgICAgICBNRDVTdGVwKE1ENV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBNZXNbKDUqKGkgJiAweGYpKzEpICYgMHhmXSwKLSAgICAgICAgICAgICAgICBNRDVUYWJsZVtpXSwgTFNoaWZ0VmFsWygweDEgPDwgMikrKGkgJiAweDMpXSk7Ci0KLSAgICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKLSAgICAgICAgVGVtcCAgID0gUmVnWzNdOwotICAgICAgICBSZWdbM10gPSBSZWdbMl07Ci0gICAgICAgIFJlZ1syXSA9IFJlZ1sxXTsKLSAgICAgICAgUmVnWzFdID0gUmVnWzBdOwotICAgICAgICBSZWdbMF0gPSBUZW1wOwotICAgIH0KLSAgICBmb3IgKGk9MzI7IGk8NDg7IGkrKykKLSAgICB7Ci0gICAgICAgIE1ENVN0ZXAoTUQ1X0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIE1lc1soMyooaSAmIDB4ZikrNSkgJiAweGZdLAotICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MSA8PCAzKSsoaSAmIDB4MyldKTsKLQotICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAotICAgICAgICBUZW1wICAgPSBSZWdbM107Ci0gICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKLSAgICAgICAgUmVnWzJdID0gUmVnWzFdOwotICAgICAgICBSZWdbMV0gPSBSZWdbMF07Ci0gICAgICAgIFJlZ1swXSA9IFRlbXA7Ci0gICAgfQotICAgIGZvciAoaT00ODsgaTw2NDsgaSsrKQotICAgIHsKLSAgICAgICAgTUQ1U3RlcChNRDVfRjQsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgTWVzWyg3KihpICYgMHhmKSkgJiAweGZdLAotICAgICAgICAgICAgICAgIE1ENVRhYmxlW2ldLCBMU2hpZnRWYWxbKDB4MyA8PCAyKSsoaSAmIDB4MyldKTsKLQotICAgICAgICAvLyBvbmUtd29yZCByaWdodCBzaGlmdAotICAgICAgICBUZW1wICAgPSBSZWdbM107Ci0gICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKLSAgICAgICAgUmVnWzJdID0gUmVnWzFdOwotICAgICAgICBSZWdbMV0gPSBSZWdbMF07Ci0gICAgICAgIFJlZ1swXSA9IFRlbXA7Ci0gICAgfQotCi0KLSAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKLQotfQotCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgU0hBLTEgaW1wbGVtZW50YXRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8vIGZvdXIgYmFzZSBmdW5jdGlvbnMgZm9yIFNIQS0xCi0jZGVmaW5lIFNIQTFfRjEoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKCh+YikgJiAoZCkpKQotI2RlZmluZSBTSEExX0YyKGIsIGMsIGQpICAgICgoYikgXiAoYykgXiAoZCkpCi0jZGVmaW5lIFNIQTFfRjMoYiwgYywgZCkgICAgKCgoYikgJiAoYykpIHwgKChiKSAmIChkKSkgfCAoKGMpICYgKGQpKSkKLQotCi0jZGVmaW5lIFNIQTFTdGVwKGYsIGEsIGIsIGMsIGQsIGUsIHcsIGspICAgIFwKLSAgICAoIGUJKz0gKCBmKGIsIGMsIGQpICsgdyArIGsgKyBDWUNMSUNfTEVGVF9TSElGVChhLCA1KSkgJiAweGZmZmZmZmZmLCBcCi0gICAgICBiID0gQ1lDTElDX0xFRlRfU0hJRlQoYiwgMzApICkKLQotLy9Jbml0aWF0ZSBTSEEtMSBDb250ZXh0IHNhdGlzZmllZCBpbiBSRkMgMzE3NAotVk9JRCBTSEFJbml0KFNIQV9DVFggKnBDdHgpCi17Ci0gICAgcEN0eC0+QnVmWzBdPTB4Njc0NTIzMDE7Ci0gICAgcEN0eC0+QnVmWzFdPTB4ZWZjZGFiODk7Ci0gICAgcEN0eC0+QnVmWzJdPTB4OThiYWRjZmU7Ci0gICAgcEN0eC0+QnVmWzNdPTB4MTAzMjU0NzY7Ci0gICAgcEN0eC0+QnVmWzRdPTB4YzNkMmUxZjA7Ci0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzBdPTA7Ci0gICAgcEN0eC0+TGVuSW5CaXRDb3VudFsxXT0wOwotfQotCi0vKgotICogIEZ1bmN0aW9uIERlc2NyaXB0aW9uOgotICogICAgICBVcGRhdGUgU0hBLTEgQ29udGV4dCwgYWxsb3cgb2YgYW4gYXJyYXJ5IG9mIG9jdGV0cyBhcyB0aGUgbmV4dAotICogICAgICBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCi0gKgotICogIEFyZ3VtZW50czoKLSAqICAgICAgcEN0eAkJUG9pbnRlcgl0byBTSEEtMSBjb250ZXh0Ci0gKiAJICAgIHBEYXRhICAgICAgIFBvaW50ZXIgdG8gaW5wdXQgZGF0YQotICogICAgICBMZW5JbkJ5dGVzICBUaGUgbGVuZ3RoIG9mIGlucHV0IGRhdGEgKHVuaXQ6IGJ5dGUpCi0gKgotICogIFJldHVybiBWYWx1ZToKLSAqICAgICAgZXJyb3IgICAgICAgaW5kaWNhdGUgbW9yZSB0aGFuIHBvdygyLDY0KSBiaXRzIG9mIGRhdGEKLSAqCi0gKiAgTm90ZToKLSAqICAgICAgQ2FsbGVkIGFmdGVyIFNIQUluaXQgb3IgU0hBVXBkYXRlKGl0c2VsZikKLSAqLwotVUNIQVIgU0hBVXBkYXRlKFNIQV9DVFggKnBDdHgsIFVDSEFSICpwRGF0YSwgVUlOVDMyIExlbkluQnl0ZXMpCi17Ci0gICAgVUlOVDMyIFRmVGltZXM7Ci0gICAgVUlOVDMyIHRlbXAxLHRlbXAyOwotCXVuc2lnbmVkIGludCBpOwotCVVDSEFSIGVycj0xOwotCi0gICAgdGVtcDEgPSBwQ3R4LT5MZW5JbkJpdENvdW50WzBdOwotICAgIHRlbXAyID0gcEN0eC0+TGVuSW5CaXRDb3VudFsxXTsKLQotICAgIHBDdHgtPkxlbkluQml0Q291bnRbMF0gPSAoVUlOVDMyKSAocEN0eC0+TGVuSW5CaXRDb3VudFswXSArIChMZW5JbkJ5dGVzIDw8IDMpKTsKLSAgICBpZiAocEN0eC0+TGVuSW5CaXRDb3VudFswXSA8IHRlbXAxKQotICAgICAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdKys7ICAgLy9jYXJyeSBpbgotCi0KLSAgICBwQ3R4LT5MZW5JbkJpdENvdW50WzFdID0gKFVJTlQzMikgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gKyhMZW5JbkJ5dGVzID4+IDI5KSk7Ci0gICAgaWYgKHBDdHgtPkxlbkluQml0Q291bnRbMV0gPCB0ZW1wMikKLSAgICAgICAgcmV0dXJuIChlcnIpOyAgIC8vY2hlY2sgdG90YWwgbGVuZ3RoIG9mIG9yaWdpbmFsIGRhdGEKLQotCi0gICAgLy8gbW9kIDY0IGJ5dGVzCi0gICAgdGVtcDEgPSAodGVtcDEgPj4gMykgJiAweDNmOwotCi0gICAgLy8gcHJvY2VzcyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKLSAgICBpZiAodGVtcDEpCi0gICAgewotICAgICAgICBVQ0hBUiAqcEFkcyA9IChVQ0hBUiAqKSBwQ3R4LT5JbnB1dCArIHRlbXAxOwotCi0gICAgICAgIGlmICgodGVtcDErTGVuSW5CeXRlcykgPCA2NCkKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkcywgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOwotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZHMsIChVQ0hBUiAqKXBEYXRhLCA2NC10ZW1wMSk7Ci0gICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOwotICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotCi0gICAgICAgIHBEYXRhICs9IDY0LXRlbXAxOwotICAgICAgICBMZW5JbkJ5dGVzIC09IDY0LXRlbXAxOwotICAgIH0gLy8gZW5kIG9mIGlmICh0ZW1wMSkKLQotCi0gICAgVGZUaW1lcyA9IChMZW5JbkJ5dGVzID4+IDYpOwotCi0gICAgZm9yIChpPVRmVGltZXM7IGk+MDsgaS0tKQotICAgIHsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEN0eC0+SW5wdXQsIChVQ0hBUiAqKXBEYXRhLCA2NCk7Ci0gICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyA2NCwgMTYpOwotICAgICAgICBTSEFUcmFuc2Zvcm0ocEN0eC0+QnVmLCAoVUlOVDMyICopcEN0eC0+SW5wdXQpOwotICAgICAgICBwRGF0YSArPSA2NDsKLSAgICAgICAgTGVuSW5CeXRlcyAtPSA2NDsKLSAgICB9IC8vIGVuZCBvZiBmb3IKLQotICAgIC8vIGJ1ZmZlcmluZyBsYWNrcyBvZiA2NC1ieXRlIGRhdGEKLSAgICBpZihMZW5JbkJ5dGVzKQotICAgICAgICBOZGlzTW92ZU1lbW9yeShwQ3R4LT5JbnB1dCwgKFVDSEFSICopcERhdGEsIExlbkluQnl0ZXMpOwotCi0JcmV0dXJuICgwKTsKLQotfQotCi0vLyBBcHBlbmQgcGFkZGluZyBiaXRzIGFuZCBsZW5ndGggb2Ygb3JpZ2luYWwgbWVzc2FnZSBpbiB0aGUgdGFpbAotLy8gVGhlIG1lc3NhZ2UgZGlnZXN0IGhhcyB0byBiZSBjb21wbGV0ZWQgaW4gdGhlIGVuZAotVk9JRCBTSEFGaW5hbChTSEFfQ1RYICpwQ3R4LCBVQ0hBUiBEaWdlc3RbMjBdKQotewotICAgIFVDSEFSIFJlbWFpbmRlcjsKLSAgICBVQ0hBUiBQYWRMZW5JbkJ5dGVzOwotICAgIFVDSEFSICpwQXBwZW5kPTA7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBSZW1haW5kZXIgPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzBdID4+IDMpICYgMHgzZik7Ci0KLSAgICBwQXBwZW5kID0gKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXI7Ci0KLSAgICBQYWRMZW5JbkJ5dGVzID0gKFJlbWFpbmRlciA8IDU2KSA/ICg1Ni1SZW1haW5kZXIpIDogKDEyMC1SZW1haW5kZXIpOwotCi0gICAgLy8gcGFkZGluZyBiaXRzIHdpdGhvdXQgY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKLSAgICBpZiAoUmVtYWluZGVyIDwgNTYpCi0gICAgewotICAgICAgICAqcEFwcGVuZCA9IDB4ODA7Ci0gICAgICAgIFBhZExlbkluQnl0ZXMgLS07Ci0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkoKFVDSEFSICopcEN0eC0+SW5wdXQgKyBSZW1haW5kZXIrMSwgUGFkTGVuSW5CeXRlcyk7Ci0KLQkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkLCBmcm9tIGhpZ2ggdG8gbG93Ci0gICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKLSAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7Ci0gICAgICAJfQotCi0gICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE0KTsKLSAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLSAgICB9IC8vIGVuZCBvZiBpZgotCi0gICAgLy8gcGFkZGluZyBiaXRzIHdpdGggY3Jvc3NpbmcgYmxvY2soNjQtYnl0ZSBiYXNlZCkgYm91bmRhcnkKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvLyB0aGUgZmlyc3QgYmxvY2sgPT09Ci0gICAgICAgICpwQXBwZW5kID0gMHg4MDsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtLTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIFJlbWFpbmRlcisxLCAoNjQtUmVtYWluZGVyLTEpKTsKLSAgICAgICAgUGFkTGVuSW5CeXRlcyAtPSAoNjQgLSBSZW1haW5kZXIgLSAxKTsKLQotICAgICAgICBieXRlUmV2ZXJzZSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgMTYpOwotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCArIDY0LCAxNik7Ci0gICAgICAgIFNIQVRyYW5zZm9ybShwQ3R4LT5CdWYsIChVSU5UMzIgKilwQ3R4LT5JbnB1dCk7Ci0KLQotICAgICAgICAvLyB0aGUgc2Vjb25kIGJsb2NrID09PQotICAgICAgICBOZGlzWmVyb01lbW9yeSgoVUNIQVIgKilwQ3R4LT5JbnB1dCwgUGFkTGVuSW5CeXRlcyk7Ci0KLQkJLy8gYWRkIGRhdGEtbGVuZ3RoIGZpZWxkCi0JCWZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAJcEN0eC0+SW5wdXRbNTYraV0gPSAoVUNIQVIpKChwQ3R4LT5MZW5JbkJpdENvdW50WzFdID4+ICgoMy1pKSA8PCAzKSkgJiAweGZmKTsKLSAgICAgICAgCXBDdHgtPklucHV0WzYwK2ldID0gKFVDSEFSKSgocEN0eC0+TGVuSW5CaXRDb3VudFswXSA+PiAoKDMtaSkgPDwgMykpICYgMHhmZik7Ci0gICAgICAJfQotCi0gICAgICAgIGJ5dGVSZXZlcnNlKChVQ0hBUiAqKXBDdHgtPklucHV0LCAxNik7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKXBDdHgtPklucHV0ICsgNjQsIDE2KTsKLSAgICAgICAgU0hBVHJhbnNmb3JtKHBDdHgtPkJ1ZiwgKFVJTlQzMiAqKXBDdHgtPklucHV0KTsKLSAgICB9IC8vIGVuZCBvZiBlbHNlCi0KLQotICAgIC8vT3V0cHV0LCBieXRlcmV2ZXJzZQotICAgIGZvciAoaT0wOyBpPDIwOyBpKyspCi0gICAgewotICAgICAgICBEaWdlc3QgW2ldID0gKFVDSEFSKShwQ3R4LT5CdWZbaT4+Ml0gPj4gOCooMy0oaSAmIDB4MykpKTsKLSAgICB9Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwQ3R4LCBzaXplb2YocEN0eCkpOyAvLyBtZW1vcnkgZnJlZQotfQotCi0KLS8vIFRoZSBjZW50cmFsIGFsZ29yaXRobSBvZiBTSEEtMSwgY29uc2lzdHMgb2YgZm91ciByb3VuZHMgYW5kCi0vLyB0d2VudHkgc3RlcHMgcGVyIHJvdW5kCi1WT0lEIFNIQVRyYW5zZm9ybShVSU5UMzIgQnVmWzVdLCBVSU5UMzIgTWVzWzIwXSkKLXsKLSAgICBVSU5UMzIgUmVnWzVdLFRlbXA7Ci0JdW5zaWduZWQgaW50IGk7Ci0gICAgVUlOVDMyIFdbODBdOwotCi0gICAgc3RhdGljIFVJTlQzMiBTSEExVGFibGVbNF0gPSB7IDB4NWE4Mjc5OTksIDB4NmVkOWViYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNiB9OwotCi0gICAgUmVnWzBdPUJ1ZlswXTsKLQlSZWdbMV09QnVmWzFdOwotCVJlZ1syXT1CdWZbMl07Ci0JUmVnWzNdPUJ1ZlszXTsKLQlSZWdbNF09QnVmWzRdOwotCi0gICAgLy90aGUgZmlyc3Qgb2N0ZXQgb2YgYSB3b3JkIGlzIHN0b3JlZCBpbiB0aGUgMHRoIGVsZW1lbnQsIGJ5dGVyZXZlcnNlCi0JZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgCVdbaV0gID0gKE1lc1tpXSA+PiAyNCkgJiAweGZmOwotICAgICAgICBXW2ldIHw9IChNZXNbaV0gPj4gOCApICYgMHhmZjAwOwotICAgICAgICBXW2ldIHw9IChNZXNbaV0gPDwgOCApICYgMHhmZjAwMDA7Ci0gICAgICAgIFdbaV0gfD0gKE1lc1tpXSA8PCAyNCkgJiAweGZmMDAwMDAwOwotICAgIH0KLQotCi0gICAgZm9yCShpID0gMDsgaSA8IDY0OyBpKyspCi0JICAgIFdbMTYraV0gPSBDWUNMSUNfTEVGVF9TSElGVChXW2ldIF4gV1syK2ldIF4gV1s4K2ldIF4gV1sxMytpXSwgMSk7Ci0KLQotICAgIC8vIDgwIHN0ZXBzIGluIFNIQS0xIGFsZ29yaXRobQotICAgIGZvciAoaT0wOyBpPDgwOyBpKyspCi0gICAgewotICAgICAgICBpZiAoaTwyMCkKLSAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjEsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAotICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzBdKTsKLQotICAgICAgICBlbHNlIGlmIChpPj0yMCAmJiBpPDQwKQotICAgICAgICAgICAgU0hBMVN0ZXAoU0hBMV9GMiwgUmVnWzBdLCBSZWdbMV0sIFJlZ1syXSwgUmVnWzNdLCBSZWdbNF0sCi0gICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMV0pOwotCi0JCWVsc2UgaWYgKGk+PTQwICYmIGk8NjApCi0gICAgICAgICAgICBTSEExU3RlcChTSEExX0YzLCBSZWdbMF0sIFJlZ1sxXSwgUmVnWzJdLCBSZWdbM10sIFJlZ1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICBXW2ldLCBTSEExVGFibGVbMl0pOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFNIQTFTdGVwKFNIQTFfRjIsIFJlZ1swXSwgUmVnWzFdLCBSZWdbMl0sIFJlZ1szXSwgUmVnWzRdLAotICAgICAgICAgICAgICAgICAgICAgV1tpXSwgU0hBMVRhYmxlWzNdKTsKLQotCi0gICAgICAgLy8gb25lLXdvcmQgcmlnaHQgc2hpZnQKLQkJVGVtcCAgID0gUmVnWzRdOwotICAgICAgICBSZWdbNF0gPSBSZWdbM107Ci0gICAgICAgIFJlZ1szXSA9IFJlZ1syXTsKLSAgICAgICAgUmVnWzJdID0gUmVnWzFdOwotICAgICAgICBSZWdbMV0gPSBSZWdbMF07Ci0gICAgICAgIFJlZ1swXSA9IFRlbXA7Ci0KLSAgICB9IC8vIGVuZCBvZiBmb3ItbG9vcAotCi0KLSAgICAvLyAodGVtcG9yYXJ5KW91dHB1dAotICAgIGZvciAoaT0wOyBpPDU7IGkrKykKLSAgICAgICAgQnVmW2ldICs9IFJlZ1tpXTsKLQotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT0gIEFFUyBFbi9EZWNyeXB0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qIGZvcndhcmQgUy1ib3ggKi8KLXN0YXRpYyB1aW50MzIgRlNiWzI1Nl0gPQotewotCTB4NjMsIDB4N0MsCTB4NzcsIDB4N0IsCTB4RjIsIDB4NkIsCTB4NkYsIDB4QzUsCi0JMHgzMCwgMHgwMSwJMHg2NywgMHgyQiwJMHhGRSwgMHhENywJMHhBQiwgMHg3NiwKLQkweENBLCAweDgyLAkweEM5LCAweDdELAkweEZBLCAweDU5LAkweDQ3LCAweEYwLAotCTB4QUQsIDB4RDQsCTB4QTIsIDB4QUYsCTB4OUMsIDB4QTQsCTB4NzIsIDB4QzAsCi0JMHhCNywgMHhGRCwJMHg5MywgMHgyNiwJMHgzNiwgMHgzRiwJMHhGNywgMHhDQywKLQkweDM0LCAweEE1LAkweEU1LCAweEYxLAkweDcxLCAweEQ4LAkweDMxLCAweDE1LAotCTB4MDQsIDB4QzcsCTB4MjMsIDB4QzMsCTB4MTgsIDB4OTYsCTB4MDUsIDB4OUEsCi0JMHgwNywgMHgxMiwJMHg4MCwgMHhFMiwJMHhFQiwgMHgyNywJMHhCMiwgMHg3NSwKLQkweDA5LCAweDgzLAkweDJDLCAweDFBLAkweDFCLCAweDZFLAkweDVBLCAweEEwLAotCTB4NTIsIDB4M0IsCTB4RDYsIDB4QjMsCTB4MjksIDB4RTMsCTB4MkYsIDB4ODQsCi0JMHg1MywgMHhEMSwJMHgwMCwgMHhFRCwJMHgyMCwgMHhGQywJMHhCMSwgMHg1QiwKLQkweDZBLCAweENCLAkweEJFLCAweDM5LAkweDRBLCAweDRDLAkweDU4LCAweENGLAotCTB4RDAsIDB4RUYsCTB4QUEsIDB4RkIsCTB4NDMsIDB4NEQsCTB4MzMsIDB4ODUsCi0JMHg0NSwgMHhGOSwJMHgwMiwgMHg3RiwJMHg1MCwgMHgzQywJMHg5RiwgMHhBOCwKLQkweDUxLCAweEEzLAkweDQwLCAweDhGLAkweDkyLCAweDlELAkweDM4LCAweEY1LAotCTB4QkMsIDB4QjYsCTB4REEsIDB4MjEsCTB4MTAsIDB4RkYsCTB4RjMsIDB4RDIsCi0JMHhDRCwgMHgwQywJMHgxMywgMHhFQywJMHg1RiwgMHg5NywJMHg0NCwgMHgxNywKLQkweEM0LCAweEE3LAkweDdFLCAweDNELAkweDY0LCAweDVELAkweDE5LCAweDczLAotCTB4NjAsIDB4ODEsCTB4NEYsIDB4REMsCTB4MjIsIDB4MkEsCTB4OTAsIDB4ODgsCi0JMHg0NiwgMHhFRSwJMHhCOCwgMHgxNCwJMHhERSwgMHg1RSwJMHgwQiwgMHhEQiwKLQkweEUwLCAweDMyLAkweDNBLCAweDBBLAkweDQ5LCAweDA2LAkweDI0LCAweDVDLAotCTB4QzIsIDB4RDMsCTB4QUMsIDB4NjIsCTB4OTEsIDB4OTUsCTB4RTQsIDB4NzksCi0JMHhFNywgMHhDOCwJMHgzNywgMHg2RCwJMHg4RCwgMHhENSwJMHg0RSwgMHhBOSwKLQkweDZDLCAweDU2LAkweEY0LCAweEVBLAkweDY1LCAweDdBLAkweEFFLCAweDA4LAotCTB4QkEsIDB4NzgsCTB4MjUsIDB4MkUsCTB4MUMsIDB4QTYsCTB4QjQsIDB4QzYsCi0JMHhFOCwgMHhERCwJMHg3NCwgMHgxRiwJMHg0QiwgMHhCRCwJMHg4QiwgMHg4QSwKLQkweDcwLCAweDNFLAkweEI1LCAweDY2LAkweDQ4LCAweDAzLAkweEY2LCAweDBFLAotCTB4NjEsIDB4MzUsCTB4NTcsIDB4QjksCTB4ODYsIDB4QzEsCTB4MUQsIDB4OUUsCi0JMHhFMSwgMHhGOCwJMHg5OCwgMHgxMSwJMHg2OSwgMHhEOSwJMHg4RSwgMHg5NCwKLQkweDlCLCAweDFFLAkweDg3LCAweEU5LAkweENFLCAweDU1LAkweDI4LCAweERGLAotCTB4OEMsIDB4QTEsCTB4ODksIDB4MEQsCTB4QkYsIDB4RTYsCTB4NDIsIDB4NjgsCi0JMHg0MSwgMHg5OSwJMHgyRCwgMHgwRiwJMHhCMCwgMHg1NCwJMHhCQiwgMHgxNgotfTsKLQotLyogZm9yd2FyZCB0YWJsZSAqLwotI2RlZmluZQlGVCBcCi1cCi0JVihDNiw2Myw2MyxBNSksCVYoRjgsN0MsN0MsODQpLAlWKEVFLDc3LDc3LDk5KSwJVihGNiw3Qiw3Qiw4RCksCVwKLQlWKEZGLEYyLEYyLDBEKSwJVihENiw2Qiw2QixCRCksCVYoREUsNkYsNkYsQjEpLAlWKDkxLEM1LEM1LDU0KSwJXAotCVYoNjAsMzAsMzAsNTApLAlWKDAyLDAxLDAxLDAzKSwJVihDRSw2Nyw2NyxBOSksCVYoNTYsMkIsMkIsN0QpLAlcCi0JVihFNyxGRSxGRSwxOSksCVYoQjUsRDcsRDcsNjIpLAlWKDRELEFCLEFCLEU2KSwJVihFQyw3Niw3Niw5QSksCVwKLQlWKDhGLENBLENBLDQ1KSwJVigxRiw4Miw4Miw5RCksCVYoODksQzksQzksNDApLAlWKEZBLDdELDdELDg3KSwJXAotCVYoRUYsRkEsRkEsMTUpLAlWKEIyLDU5LDU5LEVCKSwJVig4RSw0Nyw0NyxDOSksCVYoRkIsRjAsRjAsMEIpLAlcCi0JVig0MSxBRCxBRCxFQyksCVYoQjMsRDQsRDQsNjcpLAlWKDVGLEEyLEEyLEZEKSwJVig0NSxBRixBRixFQSksCVwKLQlWKDIzLDlDLDlDLEJGKSwJVig1MyxBNCxBNCxGNyksCVYoRTQsNzIsNzIsOTYpLAlWKDlCLEMwLEMwLDVCKSwJXAotCVYoNzUsQjcsQjcsQzIpLAlWKEUxLEZELEZELDFDKSwJVigzRCw5Myw5MyxBRSksCVYoNEMsMjYsMjYsNkEpLAlcCi0JVig2QywzNiwzNiw1QSksCVYoN0UsM0YsM0YsNDEpLAlWKEY1LEY3LEY3LDAyKSwJVig4MyxDQyxDQyw0RiksCVwKLQlWKDY4LDM0LDM0LDVDKSwJVig1MSxBNSxBNSxGNCksCVYoRDEsRTUsRTUsMzQpLAlWKEY5LEYxLEYxLDA4KSwJXAotCVYoRTIsNzEsNzEsOTMpLAlWKEFCLEQ4LEQ4LDczKSwJVig2MiwzMSwzMSw1MyksCVYoMkEsMTUsMTUsM0YpLAlcCi0JVigwOCwwNCwwNCwwQyksCVYoOTUsQzcsQzcsNTIpLAlWKDQ2LDIzLDIzLDY1KSwJVig5RCxDMyxDMyw1RSksCVwKLQlWKDMwLDE4LDE4LDI4KSwJVigzNyw5Niw5NixBMSksCVYoMEEsMDUsMDUsMEYpLAlWKDJGLDlBLDlBLEI1KSwJXAotCVYoMEUsMDcsMDcsMDkpLAlWKDI0LDEyLDEyLDM2KSwJVigxQiw4MCw4MCw5QiksCVYoREYsRTIsRTIsM0QpLAlcCi0JVihDRCxFQixFQiwyNiksCVYoNEUsMjcsMjcsNjkpLAlWKDdGLEIyLEIyLENEKSwJVihFQSw3NSw3NSw5RiksCVwKLQlWKDEyLDA5LDA5LDFCKSwJVigxRCw4Myw4Myw5RSksCVYoNTgsMkMsMkMsNzQpLAlWKDM0LDFBLDFBLDJFKSwJXAotCVYoMzYsMUIsMUIsMkQpLAlWKERDLDZFLDZFLEIyKSwJVihCNCw1QSw1QSxFRSksCVYoNUIsQTAsQTAsRkIpLAlcCi0JVihBNCw1Miw1MixGNiksCVYoNzYsM0IsM0IsNEQpLAlWKEI3LEQ2LEQ2LDYxKSwJVig3RCxCMyxCMyxDRSksCVwKLQlWKDUyLDI5LDI5LDdCKSwJVihERCxFMyxFMywzRSksCVYoNUUsMkYsMkYsNzEpLAlWKDEzLDg0LDg0LDk3KSwJXAotCVYoQTYsNTMsNTMsRjUpLAlWKEI5LEQxLEQxLDY4KSwJVigwMCwwMCwwMCwwMCksCVYoQzEsRUQsRUQsMkMpLAlcCi0JVig0MCwyMCwyMCw2MCksCVYoRTMsRkMsRkMsMUYpLAlWKDc5LEIxLEIxLEM4KSwJVihCNiw1Qiw1QixFRCksCVwKLQlWKEQ0LDZBLDZBLEJFKSwJVig4RCxDQixDQiw0NiksCVYoNjcsQkUsQkUsRDkpLAlWKDcyLDM5LDM5LDRCKSwJXAotCVYoOTQsNEEsNEEsREUpLAlWKDk4LDRDLDRDLEQ0KSwJVihCMCw1OCw1OCxFOCksCVYoODUsQ0YsQ0YsNEEpLAlcCi0JVihCQixEMCxEMCw2QiksCVYoQzUsRUYsRUYsMkEpLAlWKDRGLEFBLEFBLEU1KSwJVihFRCxGQixGQiwxNiksCVwKLQlWKDg2LDQzLDQzLEM1KSwJVig5QSw0RCw0RCxENyksCVYoNjYsMzMsMzMsNTUpLAlWKDExLDg1LDg1LDk0KSwJXAotCVYoOEEsNDUsNDUsQ0YpLAlWKEU5LEY5LEY5LDEwKSwJVigwNCwwMiwwMiwwNiksCVYoRkUsN0YsN0YsODEpLAlcCi0JVihBMCw1MCw1MCxGMCksCVYoNzgsM0MsM0MsNDQpLAlWKDI1LDlGLDlGLEJBKSwJVig0QixBOCxBOCxFMyksCVwKLQlWKEEyLDUxLDUxLEYzKSwJVig1RCxBMyxBMyxGRSksCVYoODAsNDAsNDAsQzApLAlWKDA1LDhGLDhGLDhBKSwJXAotCVYoM0YsOTIsOTIsQUQpLAlWKDIxLDlELDlELEJDKSwJVig3MCwzOCwzOCw0OCksCVYoRjEsRjUsRjUsMDQpLAlcCi0JVig2MyxCQyxCQyxERiksCVYoNzcsQjYsQjYsQzEpLAlWKEFGLERBLERBLDc1KSwJVig0MiwyMSwyMSw2MyksCVwKLQlWKDIwLDEwLDEwLDMwKSwJVihFNSxGRixGRiwxQSksCVYoRkQsRjMsRjMsMEUpLAlWKEJGLEQyLEQyLDZEKSwJXAotCVYoODEsQ0QsQ0QsNEMpLAlWKDE4LDBDLDBDLDE0KSwJVigyNiwxMywxMywzNSksCVYoQzMsRUMsRUMsMkYpLAlcCi0JVihCRSw1Riw1RixFMSksCVYoMzUsOTcsOTcsQTIpLAlWKDg4LDQ0LDQ0LENDKSwJVigyRSwxNywxNywzOSksCVwKLQlWKDkzLEM0LEM0LDU3KSwJVig1NSxBNyxBNyxGMiksCVYoRkMsN0UsN0UsODIpLAlWKDdBLDNELDNELDQ3KSwJXAotCVYoQzgsNjQsNjQsQUMpLAlWKEJBLDVELDVELEU3KSwJVigzMiwxOSwxOSwyQiksCVYoRTYsNzMsNzMsOTUpLAlcCi0JVihDMCw2MCw2MCxBMCksCVYoMTksODEsODEsOTgpLAlWKDlFLDRGLDRGLEQxKSwJVihBMyxEQyxEQyw3RiksCVwKLQlWKDQ0LDIyLDIyLDY2KSwJVig1NCwyQSwyQSw3RSksCVYoM0IsOTAsOTAsQUIpLAlWKDBCLDg4LDg4LDgzKSwJXAotCVYoOEMsNDYsNDYsQ0EpLAlWKEM3LEVFLEVFLDI5KSwJVig2QixCOCxCOCxEMyksCVYoMjgsMTQsMTQsM0MpLAlcCi0JVihBNyxERSxERSw3OSksCVYoQkMsNUUsNUUsRTIpLAlWKDE2LDBCLDBCLDFEKSwJVihBRCxEQixEQiw3NiksCVwKLQlWKERCLEUwLEUwLDNCKSwJVig2NCwzMiwzMiw1NiksCVYoNzQsM0EsM0EsNEUpLAlWKDE0LDBBLDBBLDFFKSwJXAotCVYoOTIsNDksNDksREIpLAlWKDBDLDA2LDA2LDBBKSwJVig0OCwyNCwyNCw2QyksCVYoQjgsNUMsNUMsRTQpLAlcCi0JVig5RixDMixDMiw1RCksCVYoQkQsRDMsRDMsNkUpLAlWKDQzLEFDLEFDLEVGKSwJVihDNCw2Miw2MixBNiksCVwKLQlWKDM5LDkxLDkxLEE4KSwJVigzMSw5NSw5NSxBNCksCVYoRDMsRTQsRTQsMzcpLAlWKEYyLDc5LDc5LDhCKSwJXAotCVYoRDUsRTcsRTcsMzIpLAlWKDhCLEM4LEM4LDQzKSwJVig2RSwzNywzNyw1OSksCVYoREEsNkQsNkQsQjcpLAlcCi0JVigwMSw4RCw4RCw4QyksCVYoQjEsRDUsRDUsNjQpLAlWKDlDLDRFLDRFLEQyKSwJVig0OSxBOSxBOSxFMCksCVwKLQlWKEQ4LDZDLDZDLEI0KSwJVihBQyw1Niw1NixGQSksCVYoRjMsRjQsRjQsMDcpLAlWKENGLEVBLEVBLDI1KSwJXAotCVYoQ0EsNjUsNjUsQUYpLAlWKEY0LDdBLDdBLDhFKSwJVig0NyxBRSxBRSxFOSksCVYoMTAsMDgsMDgsMTgpLAlcCi0JVig2RixCQSxCQSxENSksCVYoRjAsNzgsNzgsODgpLAlWKDRBLDI1LDI1LDZGKSwJVig1QywyRSwyRSw3MiksCVwKLQlWKDM4LDFDLDFDLDI0KSwJVig1NyxBNixBNixGMSksCVYoNzMsQjQsQjQsQzcpLAlWKDk3LEM2LEM2LDUxKSwJXAotCVYoQ0IsRTgsRTgsMjMpLAlWKEExLERELERELDdDKSwJVihFOCw3NCw3NCw5QyksCVYoM0UsMUYsMUYsMjEpLAlcCi0JVig5Niw0Qiw0QixERCksCVYoNjEsQkQsQkQsREMpLAlWKDBELDhCLDhCLDg2KSwJVigwRiw4QSw4QSw4NSksCVwKLQlWKEUwLDcwLDcwLDkwKSwJVig3QywzRSwzRSw0MiksCVYoNzEsQjUsQjUsQzQpLAlWKENDLDY2LDY2LEFBKSwJXAotCVYoOTAsNDgsNDgsRDgpLAlWKDA2LDAzLDAzLDA1KSwJVihGNyxGNixGNiwwMSksCVYoMUMsMEUsMEUsMTIpLAlcCi0JVihDMiw2MSw2MSxBMyksCVYoNkEsMzUsMzUsNUYpLAlWKEFFLDU3LDU3LEY5KSwJVig2OSxCOSxCOSxEMCksCVwKLQlWKDE3LDg2LDg2LDkxKSwJVig5OSxDMSxDMSw1OCksCVYoM0EsMUQsMUQsMjcpLAlWKDI3LDlFLDlFLEI5KSwJXAotCVYoRDksRTEsRTEsMzgpLAlWKEVCLEY4LEY4LDEzKSwJVigyQiw5OCw5OCxCMyksCVYoMjIsMTEsMTEsMzMpLAlcCi0JVihEMiw2OSw2OSxCQiksCVYoQTksRDksRDksNzApLAlWKDA3LDhFLDhFLDg5KSwJVigzMyw5NCw5NCxBNyksCVwKLQlWKDJELDlCLDlCLEI2KSwJVigzQywxRSwxRSwyMiksCVYoMTUsODcsODcsOTIpLAlWKEM5LEU5LEU5LDIwKSwJXAotCVYoODcsQ0UsQ0UsNDkpLAlWKEFBLDU1LDU1LEZGKSwJVig1MCwyOCwyOCw3OCksCVYoQTUsREYsREYsN0EpLAlcCi0JVigwMyw4Qyw4Qyw4RiksCVYoNTksQTEsQTEsRjgpLAlWKDA5LDg5LDg5LDgwKSwJVigxQSwwRCwwRCwxNyksCVwKLQlWKDY1LEJGLEJGLERBKSwJVihENyxFNixFNiwzMSksCVYoODQsNDIsNDIsQzYpLAlWKEQwLDY4LDY4LEI4KSwJXAotCVYoODIsNDEsNDEsQzMpLAlWKDI5LDk5LDk5LEIwKSwJVig1QSwyRCwyRCw3NyksCVYoMUUsMEYsMEYsMTEpLAlcCi0JVig3QixCMCxCMCxDQiksCVYoQTgsNTQsNTQsRkMpLAlWKDZELEJCLEJCLEQ2KSwJVigyQywxNiwxNiwzQSkKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCi1zdGF0aWMgdWludDMyIEZUMFsyNTZdID0geyBGVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCi1zdGF0aWMgdWludDMyIEZUMVsyNTZdID0geyBGVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCi1zdGF0aWMgdWludDMyIEZUMlsyNTZdID0geyBGVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCi1zdGF0aWMgdWludDMyIEZUM1syNTZdID0geyBGVCB9OwotI3VuZGVmIFYKLQotI3VuZGVmIEZUCi0KLS8qIHJldmVyc2UgUy1ib3ggKi8KLQotc3RhdGljIHVpbnQzMiBSU2JbMjU2XSA9Ci17Ci0JMHg1MiwgMHgwOSwJMHg2QSwgMHhENSwJMHgzMCwgMHgzNiwJMHhBNSwgMHgzOCwKLQkweEJGLCAweDQwLAkweEEzLCAweDlFLAkweDgxLCAweEYzLAkweEQ3LCAweEZCLAotCTB4N0MsIDB4RTMsCTB4MzksIDB4ODIsCTB4OUIsIDB4MkYsCTB4RkYsIDB4ODcsCi0JMHgzNCwgMHg4RSwJMHg0MywgMHg0NCwJMHhDNCwgMHhERSwJMHhFOSwgMHhDQiwKLQkweDU0LCAweDdCLAkweDk0LCAweDMyLAkweEE2LCAweEMyLAkweDIzLCAweDNELAotCTB4RUUsIDB4NEMsCTB4OTUsIDB4MEIsCTB4NDIsIDB4RkEsCTB4QzMsIDB4NEUsCi0JMHgwOCwgMHgyRSwJMHhBMSwgMHg2NiwJMHgyOCwgMHhEOSwJMHgyNCwgMHhCMiwKLQkweDc2LCAweDVCLAkweEEyLCAweDQ5LAkweDZELCAweDhCLAkweEQxLCAweDI1LAotCTB4NzIsIDB4RjgsCTB4RjYsIDB4NjQsCTB4ODYsIDB4NjgsCTB4OTgsIDB4MTYsCi0JMHhENCwgMHhBNCwJMHg1QywgMHhDQywJMHg1RCwgMHg2NSwJMHhCNiwgMHg5MiwKLQkweDZDLCAweDcwLAkweDQ4LCAweDUwLAkweEZELCAweEVELAkweEI5LCAweERBLAotCTB4NUUsIDB4MTUsCTB4NDYsIDB4NTcsCTB4QTcsIDB4OEQsCTB4OUQsIDB4ODQsCi0JMHg5MCwgMHhEOCwJMHhBQiwgMHgwMCwJMHg4QywgMHhCQywJMHhEMywgMHgwQSwKLQkweEY3LCAweEU0LAkweDU4LCAweDA1LAkweEI4LCAweEIzLAkweDQ1LCAweDA2LAotCTB4RDAsIDB4MkMsCTB4MUUsIDB4OEYsCTB4Q0EsIDB4M0YsCTB4MEYsIDB4MDIsCi0JMHhDMSwgMHhBRiwJMHhCRCwgMHgwMywJMHgwMSwgMHgxMywJMHg4QSwgMHg2QiwKLQkweDNBLCAweDkxLAkweDExLCAweDQxLAkweDRGLCAweDY3LAkweERDLCAweEVBLAotCTB4OTcsIDB4RjIsCTB4Q0YsIDB4Q0UsCTB4RjAsIDB4QjQsCTB4RTYsIDB4NzMsCi0JMHg5NiwgMHhBQywJMHg3NCwgMHgyMiwJMHhFNywgMHhBRCwJMHgzNSwgMHg4NSwKLQkweEUyLCAweEY5LAkweDM3LCAweEU4LAkweDFDLCAweDc1LAkweERGLCAweDZFLAotCTB4NDcsIDB4RjEsCTB4MUEsIDB4NzEsCTB4MUQsIDB4MjksCTB4QzUsIDB4ODksCi0JMHg2RiwgMHhCNywJMHg2MiwgMHgwRSwJMHhBQSwgMHgxOCwJMHhCRSwgMHgxQiwKLQkweEZDLCAweDU2LAkweDNFLCAweDRCLAkweEM2LCAweEQyLAkweDc5LCAweDIwLAotCTB4OUEsIDB4REIsCTB4QzAsIDB4RkUsCTB4NzgsIDB4Q0QsCTB4NUEsIDB4RjQsCi0JMHgxRiwgMHhERCwJMHhBOCwgMHgzMywJMHg4OCwgMHgwNywJMHhDNywgMHgzMSwKLQkweEIxLCAweDEyLAkweDEwLCAweDU5LAkweDI3LCAweDgwLAkweEVDLCAweDVGLAotCTB4NjAsIDB4NTEsCTB4N0YsIDB4QTksCTB4MTksIDB4QjUsCTB4NEEsIDB4MEQsCi0JMHgyRCwgMHhFNSwJMHg3QSwgMHg5RiwJMHg5MywgMHhDOSwJMHg5QywgMHhFRiwKLQkweEEwLCAweEUwLAkweDNCLCAweDRELAkweEFFLCAweDJBLAkweEY1LCAweEIwLAotCTB4QzgsIDB4RUIsCTB4QkIsIDB4M0MsCTB4ODMsIDB4NTMsCTB4OTksIDB4NjEsCi0JMHgxNywgMHgyQiwJMHgwNCwgMHg3RSwJMHhCQSwgMHg3NywJMHhENiwgMHgyNiwKLQkweEUxLCAweDY5LAkweDE0LCAweDYzLAkweDU1LCAweDIxLAkweDBDLCAweDdECi19OwotCi0vKiByZXZlcnNlIHRhYmxlICovCi0KLSNkZWZpbmUJUlQgXAotXAotCVYoNTEsRjQsQTcsNTApLAlWKDdFLDQxLDY1LDUzKSwJVigxQSwxNyxBNCxDMyksCVYoM0EsMjcsNUUsOTYpLAlcCi0JVigzQixBQiw2QixDQiksCVYoMUYsOUQsNDUsRjEpLAlWKEFDLEZBLDU4LEFCKSwJVig0QixFMywwMyw5MyksCVwKLQlWKDIwLDMwLEZBLDU1KSwJVihBRCw3Niw2RCxGNiksCVYoODgsQ0MsNzYsOTEpLAlWKEY1LDAyLDRDLDI1KSwJXAotCVYoNEYsRTUsRDcsRkMpLAlWKEM1LDJBLENCLEQ3KSwJVigyNiwzNSw0NCw4MCksCVYoQjUsNjIsQTMsOEYpLAlcCi0JVihERSxCMSw1QSw0OSksCVYoMjUsQkEsMUIsNjcpLAlWKDQ1LEVBLDBFLDk4KSwJVig1RCxGRSxDMCxFMSksCVwKLQlWKEMzLDJGLDc1LDAyKSwJVig4MSw0QyxGMCwxMiksCVYoOEQsNDYsOTcsQTMpLAlWKDZCLEQzLEY5LEM2KSwJXAotCVYoMDMsOEYsNUYsRTcpLAlWKDE1LDkyLDlDLDk1KSwJVihCRiw2RCw3QSxFQiksCVYoOTUsNTIsNTksREEpLAlcCi0JVihENCxCRSw4MywyRCksCVYoNTgsNzQsMjEsRDMpLAlWKDQ5LEUwLDY5LDI5KSwJVig4RSxDOSxDOCw0NCksCVwKLQlWKDc1LEMyLDg5LDZBKSwJVihGNCw4RSw3OSw3OCksCVYoOTksNTgsM0UsNkIpLAlWKDI3LEI5LDcxLEREKSwJXAotCVYoQkUsRTEsNEYsQjYpLAlWKEYwLDg4LEFELDE3KSwJVihDOSwyMCxBQyw2NiksCVYoN0QsQ0UsM0EsQjQpLAlcCi0JVig2MyxERiw0QSwxOCksCVYoRTUsMUEsMzEsODIpLAlWKDk3LDUxLDMzLDYwKSwJVig2Miw1Myw3Riw0NSksCVwKLQlWKEIxLDY0LDc3LEUwKSwJVihCQiw2QixBRSw4NCksCVYoRkUsODEsQTAsMUMpLAlWKEY5LDA4LDJCLDk0KSwJXAotCVYoNzAsNDgsNjgsNTgpLAlWKDhGLDQ1LEZELDE5KSwJVig5NCxERSw2Qyw4NyksCVYoNTIsN0IsRjgsQjcpLAlcCi0JVihBQiw3MyxEMywyMyksCVYoNzIsNEIsMDIsRTIpLAlWKEUzLDFGLDhGLDU3KSwJVig2Niw1NSxBQiwyQSksCVwKLQlWKEIyLEVCLDI4LDA3KSwJVigyRixCNSxDMiwwMyksCVYoODYsQzUsN0IsOUEpLAlWKEQzLDM3LDA4LEE1KSwJXAotCVYoMzAsMjgsODcsRjIpLAlWKDIzLEJGLEE1LEIyKSwJVigwMiwwMyw2QSxCQSksCVYoRUQsMTYsODIsNUMpLAlcCi0JVig4QSxDRiwxQywyQiksCVYoQTcsNzksQjQsOTIpLAlWKEYzLDA3LEYyLEYwKSwJVig0RSw2OSxFMixBMSksCVwKLQlWKDY1LERBLEY0LENEKSwJVigwNiwwNSxCRSxENSksCVYoRDEsMzQsNjIsMUYpLAlWKEM0LEE2LEZFLDhBKSwJXAotCVYoMzQsMkUsNTMsOUQpLAlWKEEyLEYzLDU1LEEwKSwJVigwNSw4QSxFMSwzMiksCVYoQTQsRjYsRUIsNzUpLAlcCi0JVigwQiw4MyxFQywzOSksCVYoNDAsNjAsRUYsQUEpLAlWKDVFLDcxLDlGLDA2KSwJVihCRCw2RSwxMCw1MSksCVwKLQlWKDNFLDIxLDhBLEY5KSwJVig5NixERCwwNiwzRCksCVYoREQsM0UsMDUsQUUpLAlWKDRELEU2LEJELDQ2KSwJXAotCVYoOTEsNTQsOEQsQjUpLAlWKDcxLEM0LDVELDA1KSwJVigwNCwwNixENCw2RiksCVYoNjAsNTAsMTUsRkYpLAlcCi0JVigxOSw5OCxGQiwyNCksCVYoRDYsQkQsRTksOTcpLAlWKDg5LDQwLDQzLENDKSwJVig2NyxEOSw5RSw3NyksCVwKLQlWKEIwLEU4LDQyLEJEKSwJVigwNyw4OSw4Qiw4OCksCVYoRTcsMTksNUIsMzgpLAlWKDc5LEM4LEVFLERCKSwJXAotCVYoQTEsN0MsMEEsNDcpLAlWKDdDLDQyLDBGLEU5KSwJVihGOCw4NCwxRSxDOSksCVYoMDAsMDAsMDAsMDApLAlcCi0JVigwOSw4MCw4Niw4MyksCVYoMzIsMkIsRUQsNDgpLAlWKDFFLDExLDcwLEFDKSwJVig2Qyw1QSw3Miw0RSksCVwKLQlWKEZELDBFLEZGLEZCKSwJVigwRiw4NSwzOCw1NiksCVYoM0QsQUUsRDUsMUUpLAlWKDM2LDJELDM5LDI3KSwJXAotCVYoMEEsMEYsRDksNjQpLAlWKDY4LDVDLEE2LDIxKSwJVig5Qiw1Qiw1NCxEMSksCVYoMjQsMzYsMkUsM0EpLAlcCi0JVigwQywwQSw2NyxCMSksCVYoOTMsNTcsRTcsMEYpLAlWKEI0LEVFLDk2LEQyKSwJVigxQiw5Qiw5MSw5RSksCVwKLQlWKDgwLEMwLEM1LDRGKSwJVig2MSxEQywyMCxBMiksCVYoNUEsNzcsNEIsNjkpLAlWKDFDLDEyLDFBLDE2KSwJXAotCVYoRTIsOTMsQkEsMEEpLAlWKEMwLEEwLDJBLEU1KSwJVigzQywyMixFMCw0MyksCVYoMTIsMUIsMTcsMUQpLAlcCi0JVigwRSwwOSwwRCwwQiksCVYoRjIsOEIsQzcsQUQpLAlWKDJELEI2LEE4LEI5KSwJVigxNCwxRSxBOSxDOCksCVwKLQlWKDU3LEYxLDE5LDg1KSwJVihBRiw3NSwwNyw0QyksCVYoRUUsOTksREQsQkIpLAlWKEEzLDdGLDYwLEZEKSwJXAotCVYoRjcsMDEsMjYsOUYpLAlWKDVDLDcyLEY1LEJDKSwJVig0NCw2NiwzQixDNSksCVYoNUIsRkIsN0UsMzQpLAlcCi0JVig4Qiw0MywyOSw3NiksCVYoQ0IsMjMsQzYsREMpLAlWKEI2LEVELEZDLDY4KSwJVihCOCxFNCxGMSw2MyksCVwKLQlWKEQ3LDMxLERDLENBKSwJVig0Miw2Myw4NSwxMCksCVYoMTMsOTcsMjIsNDApLAlWKDg0LEM2LDExLDIwKSwJXAotCVYoODUsNEEsMjQsN0QpLAlWKEQyLEJCLDNELEY4KSwJVihBRSxGOSwzMiwxMSksCVYoQzcsMjksQTEsNkQpLAlcCi0JVigxRCw5RSwyRiw0QiksCVYoREMsQjIsMzAsRjMpLAlWKDBELDg2LDUyLEVDKSwJVig3NyxDMSxFMyxEMCksCVwKLQlWKDJCLEIzLDE2LDZDKSwJVihBOSw3MCxCOSw5OSksCVYoMTEsOTQsNDgsRkEpLAlWKDQ3LEU5LDY0LDIyKSwJXAotCVYoQTgsRkMsOEMsQzQpLAlWKEEwLEYwLDNGLDFBKSwJVig1Niw3RCwyQyxEOCksCVYoMjIsMzMsOTAsRUYpLAlcCi0JVig4Nyw0OSw0RSxDNyksCVYoRDksMzgsRDEsQzEpLAlWKDhDLENBLEEyLEZFKSwJVig5OCxENCwwQiwzNiksCVwKLQlWKEE2LEY1LDgxLENGKSwJVihBNSw3QSxERSwyOCksCVYoREEsQjcsOEUsMjYpLAlWKDNGLEFELEJGLEE0KSwJXAotCVYoMkMsM0EsOUQsRTQpLAlWKDUwLDc4LDkyLDBEKSwJVig2QSw1RixDQyw5QiksCVYoNTQsN0UsNDYsNjIpLAlcCi0JVihGNiw4RCwxMyxDMiksCVYoOTAsRDgsQjgsRTgpLAlWKDJFLDM5LEY3LDVFKSwJVig4MixDMyxBRixGNSksCVwKLQlWKDlGLDVELDgwLEJFKSwJVig2OSxEMCw5Myw3QyksCVYoNkYsRDUsMkQsQTkpLAlWKENGLDI1LDEyLEIzKSwJXAotCVYoQzgsQUMsOTksM0IpLAlWKDEwLDE4LDdELEE3KSwJVihFOCw5Qyw2Myw2RSksCVYoREIsM0IsQkIsN0IpLAlcCi0JVihDRCwyNiw3OCwwOSksCVYoNkUsNTksMTgsRjQpLAlWKEVDLDlBLEI3LDAxKSwJVig4Myw0Riw5QSxBOCksCVwKLQlWKEU2LDk1LDZFLDY1KSwJVihBQSxGRixFNiw3RSksCVYoMjEsQkMsQ0YsMDgpLAlWKEVGLDE1LEU4LEU2KSwJXAotCVYoQkEsRTcsOUIsRDkpLAlWKDRBLDZGLDM2LENFKSwJVihFQSw5RiwwOSxENCksCVYoMjksQjAsN0MsRDYpLAlcCi0JVigzMSxBNCxCMixBRiksCVYoMkEsM0YsMjMsMzEpLAlWKEM2LEE1LDk0LDMwKSwJVigzNSxBMiw2NixDMCksCVwKLQlWKDc0LDRFLEJDLDM3KSwJVihGQyw4MixDQSxBNiksCVYoRTAsOTAsRDAsQjApLAlWKDMzLEE3LEQ4LDE1KSwJXAotCVYoRjEsMDQsOTgsNEEpLAlWKDQxLEVDLERBLEY3KSwJVig3RixDRCw1MCwwRSksCVYoMTcsOTEsRjYsMkYpLAlcCi0JVig3Niw0RCxENiw4RCksCVYoNDMsRUYsQjAsNEQpLAlWKENDLEFBLDRELDU0KSwJVihFNCw5NiwwNCxERiksCVwKLQlWKDlFLEQxLEI1LEUzKSwJVig0Qyw2QSw4OCwxQiksCVYoQzEsMkMsMUYsQjgpLAlWKDQ2LDY1LDUxLDdGKSwJXAotCVYoOUQsNUUsRUEsMDQpLAlWKDAxLDhDLDM1LDVEKSwJVihGQSw4Nyw3NCw3MyksCVYoRkIsMEIsNDEsMkUpLAlcCi0JVihCMyw2NywxRCw1QSksCVYoOTIsREIsRDIsNTIpLAlWKEU5LDEwLDU2LDMzKSwJVig2RCxENiw0NywxMyksCVwKLQlWKDlBLEQ3LDYxLDhDKSwJVigzNyxBMSwwQyw3QSksCVYoNTksRjgsMTQsOEUpLAlWKEVCLDEzLDNDLDg5KSwJXAotCVYoQ0UsQTksMjcsRUUpLAlWKEI3LDYxLEM5LDM1KSwJVihFMSwxQyxFNSxFRCksCVYoN0EsNDcsQjEsM0MpLAlcCi0JVig5QyxEMixERiw1OSksCVYoNTUsRjIsNzMsM0YpLAlWKDE4LDE0LENFLDc5KSwJVig3MyxDNywzNyxCRiksCVwKLQlWKDUzLEY3LENELEVBKSwJVig1RixGRCxBQSw1QiksCVYoREYsM0QsNkYsMTQpLAlWKDc4LDQ0LERCLDg2KSwJXAotCVYoQ0EsQUYsRjMsODEpLAlWKEI5LDY4LEM0LDNFKSwJVigzOCwyNCwzNCwyQyksCVYoQzIsQTMsNDAsNUYpLAlcCi0JVigxNiwxRCxDMyw3MiksCVYoQkMsRTIsMjUsMEMpLAlWKDI4LDNDLDQ5LDhCKSwJVihGRiwwRCw5NSw0MSksCVwKLQlWKDM5LEE4LDAxLDcxKSwJVigwOCwwQyxCMyxERSksCVYoRDgsQjQsRTQsOUMpLAlWKDY0LDU2LEMxLDkwKSwJXAotCVYoN0IsQ0IsODQsNjEpLAlWKEQ1LDMyLEI2LDcwKSwJVig0OCw2Qyw1Qyw3NCksCVYoRDAsQjgsNTcsNDIpCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYSMjYiMjYyMjZAotc3RhdGljIHVpbnQzMiBSVDBbMjU2XSA9IHsgUlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjZCMjYSMjYiMjYwotc3RhdGljIHVpbnQzMiBSVDFbMjU2XSA9IHsgUlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYyMjZCMjYSMjYgotc3RhdGljIHVpbnQzMiBSVDJbMjU2XSA9IHsgUlQgfTsKLSN1bmRlZiBWCi0KLSNkZWZpbmUJVihhLGIsYyxkKSAweCMjYiMjYyMjZCMjYQotc3RhdGljIHVpbnQzMiBSVDNbMjU2XSA9IHsgUlQgfTsKLSN1bmRlZiBWCi0KLSN1bmRlZiBSVAotCi0vKiByb3VuZCBjb25zdGFudHMgKi8KLQotc3RhdGljIHVpbnQzMiBSQ09OWzEwXSA9Ci17Ci0JMHgwMTAwMDAwMCwJMHgwMjAwMDAwMCwJMHgwNDAwMDAwMCwJMHgwODAwMDAwMCwKLQkweDEwMDAwMDAwLAkweDIwMDAwMDAwLAkweDQwMDAwMDAwLAkweDgwMDAwMDAwLAotCTB4MUIwMDAwMDAsCTB4MzYwMDAwMDAKLX07Ci0KLS8qIGtleSBzY2hlZHVsZQl0YWJsZXMgKi8KLQotc3RhdGljIGludCBLVF9pbml0ID0gMTsKLQotc3RhdGljIHVpbnQzMiBLVDBbMjU2XTsKLXN0YXRpYyB1aW50MzIgS1QxWzI1Nl07Ci1zdGF0aWMgdWludDMyIEtUMlsyNTZdOwotc3RhdGljIHVpbnQzMiBLVDNbMjU2XTsKLQotLyogcGxhdGZvcm0taW5kZXBlbmRhbnQJMzItYml0IGludGVnZXIgbWFuaXB1bGF0aW9uCW1hY3JvcyAqLwotCi0jZGVmaW5lCUdFVF9VSU5UMzIobixiLGkpCQkJCQkJXAotewkJCQkJCQkJCQkJCVwKLQkobikJPSAoCSh1aW50MzIpIChiKVsoaSkJXSA8PCAyNAkpCQlcCi0JCXwgKAkodWludDMyKSAoYilbKGkpICsgMV0gPDwgMTYJKQkJXAotCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDJdIDw8ICA4CSkJCVwKLQkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAzXQkJKTsJCVwKLX0KLQotI2RlZmluZQlQVVRfVUlOVDMyKG4sYixpKQkJCQkJCVwKLXsJCQkJCQkJCQkJCQlcCi0JKGIpWyhpKQkgICBdID0gKHVpbnQ4KSAoIChuKSA+PgkyNCApOwkJXAotCShiKVsoaSkJKyAxXSA9ICh1aW50OCkgKCAobikgPj4JMTYgKTsJCVwKLQkoYilbKGkpCSsgMl0gPSAodWludDgpICggKG4pID4+CSA4ICk7CQlcCi0JKGIpWyhpKQkrIDNdID0gKHVpbnQ4KSAoIChuKQkgICApOwkJXAotfQotCi0vKiBBRVMga2V5IHNjaGVkdWxpbmcgcm91dGluZSAqLwotCi1pbnQJcnRtcF9hZXNfc2V0X2tleSggYWVzX2NvbnRleHQgKmN0eCwgdWludDggKmtleSwgaW50IG5iaXRzICkKLXsKLQlpbnQJaTsKLQl1aW50MzIgKlJLLAkqU0s7Ci0KLQlzd2l0Y2goCW5iaXRzICkKLQl7Ci0JCWNhc2UgMTI4OiBjdHgtPm5yID0JMTA7CWJyZWFrOwotCQljYXNlIDE5MjogY3R4LT5uciA9CTEyOwlicmVhazsKLQkJY2FzZSAyNTY6IGN0eC0+bnIgPQkxNDsJYnJlYWs7Ci0JCWRlZmF1bHQJOiByZXR1cm4oIDEJKTsKLQl9Ci0KLQlSSyA9IGN0eC0+ZXJrOwotCi0JZm9yKCBpID0gMDsJaSA8CShuYml0cyA+PiA1KTsgaSsrICkKLQl7Ci0JCUdFVF9VSU5UMzIoCVJLW2ldLCBrZXksCWkgKgk0ICk7Ci0JfQotCi0JLyogc2V0dXAgZW5jcnlwdGlvbglyb3VuZCBrZXlzICovCi0KLQlzd2l0Y2goCW5iaXRzICkKLQl7Ci0JY2FzZSAxMjg6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTEwOwlpKyssIFJLCSs9IDQgKQotCQl7Ci0JCQlSS1s0XSAgPSBSS1swXSBeIFJDT05baV0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAxNiApIF0gPDwJMjQgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+ICA4ICkgXSA8PAkxNiApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10JCSApIF0gPDwJIDggKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdID4+IDI0ICkgXQkgICApOwotCi0JCQlSS1s1XSAgPSBSS1sxXSBeIFJLWzRdOwotCQkJUktbNl0gID0gUktbMl0gXiBSS1s1XTsKLQkJCVJLWzddICA9IFJLWzNdIF4gUktbNl07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDE5MjoKLQotCQlmb3IoIGkgPSAwOwlpIDwJODsgaSsrLAlSSyArPSA2CSkKLQkJewotCQkJUktbNl0gID0gUktbMF0gXiBSQ09OW2ldIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMTYgKSBdIDw8CTI0ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAgOCApIF0gPDwJMTYgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdCQkgKSBdIDw8CSA4ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XSA+PiAyNCApIF0JICAgKTsKLQotCQkJUktbN10gID0gUktbMV0gXiBSS1s2XTsKLQkJCVJLWzhdICA9IFJLWzJdIF4gUktbN107Ci0JCQlSS1s5XSAgPSBSS1szXSBeIFJLWzhdOwotCQkJUktbMTBdID0gUktbNF0gXiBSS1s5XTsKLQkJCVJLWzExXSA9IFJLWzVdIF4gUktbMTBdOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAyNTY6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTc7IGkrKywJUksgKz0gOAkpCi0JCXsKLQkJCVJLWzhdICA9IFJLWzBdIF4gUkNPTltpXSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDE2ICkgXSA8PAkyNCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gIDggKSBdIDw8CTE2ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XQkJICkgXSA8PAkgOCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10gPj4gMjQgKSBdCSAgICk7Ci0KLQkJCVJLWzldICA9IFJLWzFdIF4gUktbOF07Ci0JCQlSS1sxMF0gPSBSS1syXSBeIFJLWzldOwotCQkJUktbMTFdID0gUktbM10gXiBSS1sxMF07Ci0KLQkJCVJLWzEyXSA9IFJLWzRdIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDI0ICkJXSA8PCAyNAkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+IDE2ICkJXSA8PCAxNgkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCT4+CTggKQldIDw8ICA4CSkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1sxMV0JCSAgKQldCQkpOwotCi0JCQlSS1sxM10gPSBSS1s1XSBeIFJLWzEyXTsKLQkJCVJLWzE0XSA9IFJLWzZdIF4gUktbMTNdOwotCQkJUktbMTVdID0gUktbN10gXiBSS1sxNF07Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JLyogc2V0dXAgZGVjcnlwdGlvbglyb3VuZCBrZXlzICovCi0KLQlpZigJS1RfaW5pdAkpCi0JewotCQlmb3IoIGkgPSAwOwlpIDwJMjU2OyBpKysgKQotCQl7Ci0JCQlLVDBbaV0gPSBSVDBbIEZTYltpXSBdOwotCQkJS1QxW2ldID0gUlQxWyBGU2JbaV0gXTsKLQkJCUtUMltpXSA9IFJUMlsgRlNiW2ldIF07Ci0JCQlLVDNbaV0gPSBSVDNbIEZTYltpXSBdOwotCQl9Ci0KLQkJS1RfaW5pdAk9IDA7Ci0JfQotCi0JU0sgPSBjdHgtPmRyazsKLQotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0KLQlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKLQl7Ci0JCVJLIC09IDg7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0JfQotCi0JUksgLT0gODsKLQotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0KLQlyZXR1cm4oCTAgKTsKLX0KLQotLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCi0KLXZvaWQgcnRtcF9hZXNfZW5jcnlwdChhZXNfY29udGV4dCAqY3R4LCB1aW50OCBpbnB1dFsxNl0sCXVpbnQ4IG91dHB1dFsxNl0gKQotewotCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKLQotCVJLID0gY3R4LT5lcms7Ci0JR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOwotCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKLQlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07Ci0JR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKLQotI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAotewkJCQkJCQkJCQkJCVwKLQlSSyArPSA0OwkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCVwKLQlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKLQkJCQkJCQkJCQkJCVwKLQlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKLQkJCQkJCQkJCQkJCVwKLQlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKLQkJCQkJCQkJCQkJCVwKLQlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKLX0KLQotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLwotCi0JaWYoCWN0eC0+bnIJPiAxMCApCi0JewotCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KLQkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCi0JfQotCi0JaWYoCWN0eC0+bnIJPiAxMiApCi0JewotCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KLQkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCi0JfQotCi0JLyogbGFzdAlyb3VuZCAqLwotCi0JUksgKz0gNDsKLQotCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7Ci0KLQlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOwotCi0JWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKLQotCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7Ci0KLQlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOwotCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7Ci0JUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKLQlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOwotfQotCi0vKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KLQotdm9pZCBydG1wX2Flc19kZWNyeXB0KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCBpbnB1dFsxNl0sIHVpbnQ4IG91dHB1dFsxNl0gKQotewotCXVpbnQzMiAqUkssCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMzsKLQotCVJLID0gY3R4LT5kcms7Ci0KLQlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07Ci0JR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOwotCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKLQlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOwotCi0jZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCi17CQkJCQkJCQkJCQkJXAotCVJLICs9IDQ7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAotfQotCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCi0KLQlpZigJY3R4LT5ucgk+IDEwICkKLQl7Ci0JCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLwotCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KLQl9Ci0KLQlpZigJY3R4LT5ucgk+IDEyICkKLQl7Ci0JCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLwotCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KLQl9Ci0KLQkvKiBsYXN0CXJvdW5kICovCi0KLQlSSyArPSA0OwotCi0JWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKLQotCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7Ci0KLQlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOwotCi0JWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKLQotCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7Ci0JUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKLQlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOwotCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTSEExIGZ1bmN0aW9uCi0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlITUFDX1NIQTEoCi0JSU4JVUNIQVIJKnRleHQsCi0JSU4JVUlOVAl0ZXh0X2xlbiwKLQlJTglVQ0hBUgkqa2V5LAotCUlOCVVJTlQJa2V5X2xlbiwKLQlJTglVQ0hBUgkqZGlnZXN0KQotewotCVNIQV9DVFgJY29udGV4dDsKLQlVQ0hBUglrX2lwYWRbNjVdOyAvKiBpbm5lciBwYWRkaW5nIC0ga2V5IFhPUmQgd2l0aCBpcGFkCSovCi0JVUNIQVIJa19vcGFkWzY1XTsgLyogb3V0ZXIgcGFkZGluZyAtIGtleSBYT1JkIHdpdGggb3BhZAkqLwotCUlOVAkJaTsKLQotCS8vIGlmIGtleSBpcyBsb25nZXIJdGhhbiA2NAlieXRlcyByZXNldAlpdCB0byBrZXk9U0hBMShrZXkpCi0JaWYgKGtleV9sZW4JPiA2NCkKLQl7Ci0JCVNIQV9DVFgJCSB0Y3R4OwotCQlTSEFJbml0KCZ0Y3R4KTsKLQkJU0hBVXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOwotCQlTSEFGaW5hbCgmdGN0eCwJa2V5KTsKLQkJa2V5X2xlbgk9IDIwOwotCX0KLQlOZGlzWmVyb01lbW9yeShrX2lwYWQsIHNpemVvZihrX2lwYWQpKTsKLQlOZGlzWmVyb01lbW9yeShrX29wYWQsIHNpemVvZihrX29wYWQpKTsKLQlOZGlzTW92ZU1lbW9yeShrX2lwYWQsIGtleSwJa2V5X2xlbik7Ci0JTmRpc01vdmVNZW1vcnkoa19vcGFkLCBrZXksCWtleV9sZW4pOwotCi0JLy8gWE9SIGtleSB3aXRoCWlwYWQgYW5kIG9wYWQgdmFsdWVzCi0JZm9yCShpID0gMDsJaSA8CTY0OwlpKyspCi0JewotCQlrX2lwYWRbaV0gXj0gMHgzNjsKLQkJa19vcGFkW2ldIF49IDB4NWM7Ci0JfQotCi0JLy8gcGVyZm9ybSBpbm5lciBTSEExCi0JU0hBSW5pdCgmY29udGV4dCk7IAkJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMXN0IHBhc3MgKi8KLQlTSEFVcGRhdGUoJmNvbnRleHQsCWtfaXBhZCwJNjQpOwkJLyoJc3RhcnQgd2l0aCBpbm5lciBwYWQgKi8KLQlTSEFVcGRhdGUoJmNvbnRleHQsCXRleHQsIHRleHRfbGVuKTsJLyoJdGhlbiB0ZXh0IG9mIGRhdGFncmFtICovCi0JU0hBRmluYWwoJmNvbnRleHQsIGRpZ2VzdCk7CQkJCS8qIGZpbmlzaCB1cCAxc3QgcGFzcyAqLwotCi0JLy9wZXJmb3JtIG91dGVyCVNIQTEKLQlTSEFJbml0KCZjb250ZXh0KTsJCQkJCS8qIGluaXQgY29udGV4dCBmb3IgMm5kIHBhc3MgKi8KLQlTSEFVcGRhdGUoJmNvbnRleHQsCWtfb3BhZCwJNjQpOwkvKglzdGFydCB3aXRoIG91dGVyIHBhZCAqLwotCVNIQVVwZGF0ZSgmY29udGV4dCwJZGlnZXN0LAkyMCk7CS8qCXRoZW4gcmVzdWx0cyBvZgkxc3QJaGFzaCAqLwotCVNIQUZpbmFsKCZjb250ZXh0LCBkaWdlc3QpOwkJCS8qIGZpbmlzaCB1cCAybmQgcGFzcyAqLwotCi19Ci0KLS8qCi0qIEYoUCwgUywgYywgaSkgPSBVMSB4b3IgVTIgeG9yIC4uLiBVYwotKiBVMSA9IFBSRihQLCBTIHx8IEludChpKSkKLSogVTIgPSBQUkYoUCwgVTEpCi0qIFVjID0gUFJGKFAsIFVjLTEpCi0qLwotCi12b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpCi17Ci0gICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMzZdLCBkaWdlc3QxW1NIQV9ESUdFU1RfTEVOXTsKLSAgICBpbnQgaSwgajsKLQotICAgIC8qIFUxID0gUFJGKFAsIFMgfHwgaW50KGkpKSAqLwotICAgIG1lbWNweShkaWdlc3QsIHNzaWQsIHNzaWRsZW5ndGgpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjI0KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzFdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+MTYpICYgMHhmZik7Ci0gICAgZGlnZXN0W3NzaWRsZW5ndGgrMl0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj44KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzNdID0gKHVuc2lnbmVkIGNoYXIpKGNvdW50ICYgMHhmZik7Ci0gICAgSE1BQ19TSEExKGRpZ2VzdCwgc3NpZGxlbmd0aCs0LCAodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxKTsgLy8gZm9yIFdQQSB1cGRhdGUKLQotICAgIC8qIG91dHB1dCA9IFUxICovCi0gICAgbWVtY3B5KG91dHB1dCwgZGlnZXN0MSwgU0hBX0RJR0VTVF9MRU4pOwotCi0gICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCi0gICAgICAgIEhNQUNfU0hBMShkaWdlc3QxLCBTSEFfRElHRVNUX0xFTiwgKHVuc2lnbmVkIGNoYXIqKSBwYXNzd29yZCwgKGludCkgc3RybGVuKHBhc3N3b3JkKSwgZGlnZXN0KTsgLy8gZm9yIFdQQSB1cGRhdGUKLSAgICAgICAgbWVtY3B5KGRpZ2VzdDEsIGRpZ2VzdCwgU0hBX0RJR0VTVF9MRU4pOwotCi0gICAgICAgIC8qIG91dHB1dCA9IG91dHB1dCB4b3IgVW4gKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFNIQV9ESUdFU1RfTEVOOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0vKgotKiBwYXNzd29yZCAtIGFzY2lpIHN0cmluZyB1cCB0byA2MyBjaGFyYWN0ZXJzIGluIGxlbmd0aAotKiBzc2lkIC0gb2N0ZXQgc3RyaW5nIHVwIHRvIDMyIG9jdGV0cwotKiBzc2lkbGVuZ3RoIC0gbGVuZ3RoIG9mIHNzaWQgaW4gb2N0ZXRzCi0qIG91dHB1dCBtdXN0IGJlIDQwIG9jdGV0cyBpbiBsZW5ndGggYW5kIG91dHB1dHMgMjU2IGJpdHMgb2Yga2V5Ci0qLwotaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKLXsKLSAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKLSAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQV9ESUdFU1RfTEVOXSk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vbWxtZS5jCmluZGV4IDYxYTJhNGUuLjlmYzM0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9tbG1lLmMKQEAgLTM5LDQxMyArMzksMzA5IEBACiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKLVVDSEFSCUNJU0NPX09VSVtdID0gezB4MDAsIDB4NDAsIDB4OTZ9OwordTggQ0lTQ09fT1VJW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYgfTsKIAotVUNIQVIJV1BBX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwotVUNIQVIJUlNOX09VSVtdID0gezB4MDAsIDB4MGYsIDB4YWN9OwotVUNIQVIgICBXTUVfSU5GT19FTEVNW10gID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDF9OwotVUNIQVIgICBXTUVfUEFSTV9FTEVNW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMSwgMHgwMX07Ci1VQ0hBUglDY3gyUW9zSW5mb1tdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDR9OwotVUNIQVIgICBSQUxJTktfT1VJW10gID0gezB4MDAsIDB4MGMsIDB4NDN9OwotVUNIQVIgICBCUk9BRENPTV9PVUlbXSAgPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci1VQ0hBUiAgIFdQU19PVUlbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDA0fTsKLVVDSEFSCVBSRV9OX0hUX09VSVtdCT0gezB4MDAsIDB4OTAsIDB4NGN9OwordTggV1BBX09VSVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAxIH07Cit1OCBSU05fT1VJW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMgfTsKK3U4IFdNRV9JTkZPX0VMRU1bXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSB9OwordTggV01FX1BBUk1fRUxFTVtdID0geyAweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxIH07Cit1OCBDY3gyUW9zSW5mb1tdID0geyAweDAwLCAweDQwLCAweDk2LCAweDA0IH07Cit1OCBSQUxJTktfT1VJW10gPSB7IDB4MDAsIDB4MGMsIDB4NDMgfTsKK3U4IEJST0FEQ09NX09VSVtdID0geyAweDAwLCAweDkwLCAweDRjIH07Cit1OCBXUFNfT1VJW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQgfTsKK3U4IFBSRV9OX0hUX09VSVtdID0geyAweDAwLCAweDkwLCAweDRjIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZVtdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLSAgICAweDA0LCAweDIxLCAgMCwgMzAsIDUwLAotICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDBhLCAweDIxLCAgNiwgIDgsIDI1LAotICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMjUsCi0gICAgMHgwYywgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwZCwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDBlLCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MGYsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgxMCwgMHgyMiwgMTUsICA4LCAyNSwKLSAgICAweDExLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTIsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxMywgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE0LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTUsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxNiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE3LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTgsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxOSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFhLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWIsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxYywgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFkLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWUsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxZiwgMHgwMCwgIDAsICAwLCAgMCwKK3U4IFJhdGVTd2l0Y2hUYWJsZVtdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgxMSwgMHgwMCwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDAwLCAwLCA0MCwgMTAxLAorCTB4MDEsIDB4MDAsIDEsIDQwLCA1MCwKKwkweDAyLCAweDAwLCAyLCAzNSwgNDUsCisJMHgwMywgMHgwMCwgMywgMjAsIDQ1LAorCTB4MDQsIDB4MjEsIDAsIDMwLCA1MCwKKwkweDA1LCAweDIxLCAxLCAyMCwgNTAsCisJMHgwNiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDcsIDB4MjEsIDMsIDE1LCA1MCwKKwkweDA4LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwOSwgMHgyMSwgNSwgMTAsIDI1LAorCTB4MGEsIDB4MjEsIDYsIDgsIDI1LAorCTB4MGIsIDB4MjEsIDcsIDgsIDI1LAorCTB4MGMsIDB4MjAsIDEyLCAxNSwgMzAsCisJMHgwZCwgMHgyMCwgMTMsIDgsIDIwLAorCTB4MGUsIDB4MjAsIDE0LCA4LCAyMCwKKwkweDBmLCAweDIwLCAxNSwgOCwgMjUsCisJMHgxMCwgMHgyMiwgMTUsIDgsIDI1LAorCTB4MTEsIDB4MDAsIDAsIDAsIDAsCisJMHgxMiwgMHgwMCwgMCwgMCwgMCwKKwkweDEzLCAweDAwLCAwLCAwLCAwLAorCTB4MTQsIDB4MDAsIDAsIDAsIDAsCisJMHgxNSwgMHgwMCwgMCwgMCwgMCwKKwkweDE2LCAweDAwLCAwLCAwLCAwLAorCTB4MTcsIDB4MDAsIDAsIDAsIDAsCisJMHgxOCwgMHgwMCwgMCwgMCwgMCwKKwkweDE5LCAweDAwLCAwLCAwLCAwLAorCTB4MWEsIDB4MDAsIDAsIDAsIDAsCisJMHgxYiwgMHgwMCwgMCwgMCwgMCwKKwkweDFjLCAweDAwLCAwLCAwLCAwLAorCTB4MWQsIDB4MDAsIDAsIDAsIDAsCisJMHgxZSwgMHgwMCwgMCwgMCwgMCwKKwkweDFmLCAweDAwLCAwLCAwLCAwLAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwNCwgMHgwMywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFCW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDA0LCAweDAzLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDM1LCA0NSwKKwkweDAzLCAweDAwLCAzLCAyMCwgNDUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDM1LCA0NSwKLSAgICAweDAzLCAweDAwLCAgMywgMjAsIDQ1LAotICAgIDB4MDQsIDB4MTAsICAyLCAyMCwgMzUsCi0gICAgMHgwNSwgMHgxMCwgIDMsIDE2LCAzNSwKLSAgICAweDA2LCAweDEwLCAgNCwgMTAsIDI1LAotICAgIDB4MDcsIDB4MTAsICA1LCAxNiwgMjUsCi0gICAgMHgwOCwgMHgxMCwgIDYsIDEwLCAyNSwKLSAgICAweDA5LCAweDEwLCAgNywgMTAsIDEzLAordTggUmF0ZVN3aXRjaFRhYmxlMTFCR1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYSwgMHgwMCwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDAwLCAwLCA0MCwgMTAxLAorCTB4MDEsIDB4MDAsIDEsIDQwLCA1MCwKKwkweDAyLCAweDAwLCAyLCAzNSwgNDUsCisJMHgwMywgMHgwMCwgMywgMjAsIDQ1LAorCTB4MDQsIDB4MTAsIDIsIDIwLCAzNSwKKwkweDA1LCAweDEwLCAzLCAxNiwgMzUsCisJMHgwNiwgMHgxMCwgNCwgMTAsIDI1LAorCTB4MDcsIDB4MTAsIDUsIDE2LCAyNSwKKwkweDA4LCAweDEwLCA2LCAxMCwgMjUsCisJMHgwOSwgMHgxMCwgNywgMTAsIDEzLAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFHW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwOCwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MTAsICAwLCAyMCwgMTAxLAotICAgIDB4MDEsIDB4MTAsICAxLCAyMCwgMzUsCi0gICAgMHgwMiwgMHgxMCwgIDIsIDIwLCAzNSwKLSAgICAweDAzLCAweDEwLCAgMywgMTYsIDM1LAotICAgIDB4MDQsIDB4MTAsICA0LCAxMCwgMjUsCi0gICAgMHgwNSwgMHgxMCwgIDUsIDE2LCAyNSwKLSAgICAweDA2LCAweDEwLCAgNiwgMTAsIDI1LAotICAgIDB4MDcsIDB4MTAsICA3LCAxMCwgMTMsCit1OCBSYXRlU3dpdGNoVGFibGUxMUdbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MDgsIDB4MDAsIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgxMCwgMCwgMjAsIDEwMSwKKwkweDAxLCAweDEwLCAxLCAyMCwgMzUsCisJMHgwMiwgMHgxMCwgMiwgMjAsIDM1LAorCTB4MDMsIDB4MTAsIDMsIDE2LCAzNSwKKwkweDA0LCAweDEwLCA0LCAxMCwgMjUsCisJMHgwNSwgMHgxMCwgNSwgMTYsIDI1LAorCTB4MDYsIDB4MTAsIDYsIDEwLCAyNSwKKwkweDA3LCAweDEwLCA3LCAxMCwgMTMsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4xU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MDksIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxMCwgMjUsCi0gICAgMHgwNiwgMHgyMSwgIDYsICA4LCAxNCwKLSAgICAweDA3LCAweDIxLCAgNywgIDgsIDE0LAotICAgIDB4MDgsIDB4MjMsICA3LCAgOCwgMTQsCit1OCBSYXRlU3dpdGNoVGFibGUxMU4xU1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYywgMHgwYSwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDAwLCAwLCA0MCwgMTAxLAorCTB4MDEsIDB4MDAsIDEsIDQwLCA1MCwKKwkweDAyLCAweDAwLCAyLCAyNSwgNDUsCisJMHgwMywgMHgyMSwgMCwgMjAsIDM1LAorCTB4MDQsIDB4MjEsIDEsIDIwLCAzNSwKKwkweDA1LCAweDIxLCAyLCAyMCwgMzUsCisJMHgwNiwgMHgyMSwgMywgMTUsIDM1LAorCTB4MDcsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA4LCAweDIxLCA1LCAxMCwgMjUsCisJMHgwOSwgMHgyMSwgNiwgOCwgMTQsCisJMHgwYSwgMHgyMSwgNywgOCwgMTQsCisJMHgwYiwgMHgyMywgNywgOCwgMTQsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4yU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMU4yU1tdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwZSwgMHgwYywgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDAwLCAwLCA0MCwgMTAxLAorCTB4MDEsIDB4MDAsIDEsIDQwLCA1MCwKKwkweDAyLCAweDAwLCAyLCAyNSwgNDUsCisJMHgwMywgMHgyMSwgMCwgMjAsIDM1LAorCTB4MDQsIDB4MjEsIDEsIDIwLCAzNSwKKwkweDA1LCAweDIxLCAyLCAyMCwgMzUsCisJMHgwNiwgMHgyMSwgMywgMTUsIDM1LAorCTB4MDcsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA4LCAweDIwLCAxMSwgMTUsIDMwLAorCTB4MDksIDB4MjAsIDEyLCAxNSwgMzAsCisJMHgwYSwgMHgyMCwgMTMsIDgsIDIwLAorCTB4MGIsIDB4MjAsIDE0LCA4LCAyMCwKKwkweDBjLCAweDIwLCAxNSwgOCwgMjUsCisJMHgwZCwgMHgyMiwgMTUsIDgsIDE1LAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKLS8vIEl0ZW0gTm8uCU1vZGUJQ3Vyci1NQ1MJVHJhaW5VcAlUcmFpbkRvd24JLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLCAgICAgIC8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDcsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDA5LCAweDIyLCAxNSwgIDgsIDI1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFOM1NbXSA9IHsKKy8qIEl0ZW0gTm8uICAgICBNb2RlICAgIEN1cnItTUNTICAgICAgICBUcmFpblVwIFRyYWluRG93biAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGIsIDB4MDAsIDAsIDAsIDAsCS8qIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDIxLCAwLCAzMCwgMTAxLAorCTB4MDEsIDB4MjEsIDEsIDIwLCA1MCwKKwkweDAyLCAweDIxLCAyLCAyMCwgNTAsCisJMHgwMywgMHgyMSwgMywgMTUsIDUwLAorCTB4MDQsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA1LCAweDIwLCAxMSwgMTUsIDMwLAkvKiBSZXF1aXJlZCBieSBTeXN0ZW0tQWxhbiBAIDIwMDgwODEyICovCisJMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwJLyogMHgwNSwgMHgyMCwgMTIsIDE1LCAzMCwgKi8KKwkweDA3LCAweDIwLCAxMywgOCwgMjAsCS8qIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsICovCisJMHgwOCwgMHgyMCwgMTQsIDgsIDIwLAkvKiAweDA3LCAweDIwLCAxNCwgIDgsIDIwLCAqLworCTB4MDksIDB4MjAsIDE1LCA4LCAyNSwJLyogMHgwOCwgMHgyMCwgMTUsICA4LCAyNSwgKi8KKwkweDBhLCAweDIyLCAxNSwgOCwgMjUsCS8qIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsICovCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdID0geworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYiwgMHgwOSwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDIxLCAwLCAzMCwgMTAxLAorCTB4MDEsIDB4MjEsIDEsIDIwLCA1MCwKKwkweDAyLCAweDIxLCAyLCAyMCwgNTAsCisJMHgwMywgMHgyMSwgMywgMTUsIDUwLAorCTB4MDQsIDB4MjEsIDQsIDE1LCAzMCwKKwkweDA1LCAweDIxLCA1LCAxNSwgMzAsCisJMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDA3LCAweDIwLCAxMywgOCwgMjAsCisJMHgwOCwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MDksIDB4MjAsIDE1LCA4LCAyNSwKKwkweDBhLCAweDIyLCAxNSwgOCwgMjUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU0ZvckFCYW5kW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExTjNTRm9yQUJhbmRbXSA9IHsJLyogMyozICovCisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBiLCAweDA5LCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAxNSwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDUsIDB4MjEsIDUsIDE1LCAzMCwKKwkweDA2LCAweDIwLCAxMiwgMTUsIDMwLAorCTB4MDcsIDB4MjAsIDEzLCA4LCAyMCwKKwkweDA4LCAweDIwLCAxNCwgOCwgMjAsCisJMHgwOSwgMHgyMCwgMTUsIDgsIDI1LAorCTB4MGEsIDB4MjIsIDE1LCA4LCAyNSwKIH07CiAKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBkLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAotICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCi0gICAgMHgwNCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAotICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDBhLCAweDIxLCAgNiwgIDgsIDE0LAotICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMTQsCi0JMHgwYywgMHgyMywgIDcsICA4LCAxNCwKK3U4IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXSA9IHsKKy8qIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93biAgICAgICAgICAgICAvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKSAqLworCTB4MGMsIDB4MGEsIDAsIDAsIDAsCS8qIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uICovCisJMHgwMCwgMHgwMCwgMCwgNDAsIDEwMSwKKwkweDAxLCAweDAwLCAxLCA0MCwgNTAsCisJMHgwMiwgMHgwMCwgMiwgMjUsIDQ1LAorCTB4MDMsIDB4MjEsIDAsIDIwLCAzNSwKKwkweDA0LCAweDIxLCAxLCAyMCwgMzUsCisJMHgwNSwgMHgyMSwgMiwgMjAsIDM1LAorCTB4MDYsIDB4MjEsIDMsIDE1LCAzNSwKKwkweDA3LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwOCwgMHgyMSwgNSwgMTAsIDI1LAorCTB4MDksIDB4MjEsIDYsIDgsIDE0LAorCTB4MGEsIDB4MjEsIDcsIDgsIDE0LAorCTB4MGIsIDB4MjMsIDcsIDgsIDE0LAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBlLCAweDBjLCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MDAsIDAsIDQwLCAxMDEsCisJMHgwMSwgMHgwMCwgMSwgNDAsIDUwLAorCTB4MDIsIDB4MDAsIDIsIDI1LCA0NSwKKwkweDAzLCAweDIxLCAwLCAyMCwgMzUsCisJMHgwNCwgMHgyMSwgMSwgMjAsIDM1LAorCTB4MDUsIDB4MjEsIDIsIDIwLCAzNSwKKwkweDA2LCAweDIxLCAzLCAxNSwgMzUsCisJMHgwNywgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDgsIDB4MjAsIDExLCAxNSwgMzAsCisJMHgwOSwgMHgyMCwgMTIsIDE1LCAzMCwKKwkweDBhLCAweDIwLCAxMywgOCwgMjAsCisJMHgwYiwgMHgyMCwgMTQsIDgsIDIwLAorCTB4MGMsIDB4MjAsIDE1LCA4LCAyNSwKKwkweDBkLCAweDIyLCAxNSwgOCwgMTUsCiB9OwogCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAyMCwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCA1MCwKLSAgICAweDA1LCAweDIwLCAyMCwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDIxLCAgOCwgMjAsCi0gICAgMHgwNywgMHgyMCwgMjIsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAyMywgIDgsIDI1LAotICAgIDB4MDksIDB4MjIsIDIzLCAgOCwgMjUsCit1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjNTW10gPSB7CS8qIDMqMyAqLworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYSwgMHgwMCwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDIxLCAwLCAzMCwgMTAxLAkvKjUwICovCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAyMCwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDUwLAorCTB4MDUsIDB4MjAsIDIwLCAxNSwgMzAsCisJMHgwNiwgMHgyMCwgMjEsIDgsIDIwLAorCTB4MDcsIDB4MjAsIDIyLCA4LCAyMCwKKwkweDA4LCAweDIwLCAyMywgOCwgMjUsCisJMHgwOSwgMHgyMiwgMjMsIDgsIDI1LAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjEsICA1LCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMTIsIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kW10gPSB7CisvKiBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24gICAgICAgICAgICAgLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikgKi8KKwkweDBiLCAweDA5LCAwLCAwLCAwLAkvKiBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbiAqLworCTB4MDAsIDB4MjEsIDAsIDMwLCAxMDEsCS8qNTAgKi8KKwkweDAxLCAweDIxLCAxLCAyMCwgNTAsCisJMHgwMiwgMHgyMSwgMiwgMjAsIDUwLAorCTB4MDMsIDB4MjEsIDMsIDE1LCA1MCwKKwkweDA0LCAweDIxLCA0LCAxNSwgMzAsCisJMHgwNSwgMHgyMSwgNSwgMTUsIDMwLAorCTB4MDYsIDB4MjAsIDEyLCAxNSwgMzAsCisJMHgwNywgMHgyMCwgMTMsIDgsIDIwLAorCTB4MDgsIDB4MjAsIDE0LCA4LCAyMCwKKwkweDA5LCAweDIwLCAxNSwgOCwgMjUsCisJMHgwYSwgMHgyMiwgMTUsIDgsIDI1LAogfTsKIAotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7IC8vIDMqMwotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGMsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjEsIDEyLCAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMjAsIDE1LCAzMCwKLSAgICAweDA4LCAweDIwLCAyMSwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDIyLCAgOCwgMjAsCi0gICAgMHgwYSwgMHgyMCwgMjMsICA4LCAyNSwKLSAgICAweDBiLCAweDIyLCAyMywgIDgsIDI1LAordTggUmF0ZVN3aXRjaFRhYmxlMTFCR04zU0ZvckFCYW5kW10gPSB7CS8qIDMqMyAqLworLyogSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duICAgICAgICAgICAgIC8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpICovCisJMHgwYywgMHgwOSwgMCwgMCwgMCwJLyogSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwkweDAwLCAweDIxLCAwLCAzMCwgMTAxLAkvKjUwICovCisJMHgwMSwgMHgyMSwgMSwgMjAsIDUwLAorCTB4MDIsIDB4MjEsIDIsIDIwLCA1MCwKKwkweDAzLCAweDIxLCAzLCAxNSwgNTAsCisJMHgwNCwgMHgyMSwgNCwgMTUsIDMwLAorCTB4MDUsIDB4MjEsIDUsIDE1LCAzMCwKKwkweDA2LCAweDIxLCAxMiwgMTUsIDMwLAorCTB4MDcsIDB4MjAsIDIwLCAxNSwgMzAsCisJMHgwOCwgMHgyMCwgMjEsIDgsIDIwLAorCTB4MDksIDB4MjAsIDIyLCA4LCAyMCwKKwkweDBhLCAweDIwLCAyMywgOCwgMjUsCisJMHgwYiwgMHgyMiwgMjMsIDgsIDI1LAogfTsKIAotUFVDSEFSIFJlYXNvblN0cmluZ1tdID0gewotCS8qIDAgICovCSAiUmVzZXJ2ZWQiLAotCS8qIDEgICovCSAiVW5zcGVjaWZpZWQgUmVhc29uIiwKLQkvKiAyICAqLwkgIlByZXZpb3VzIEF1dGggbm8gbG9uZ2VyIHZhbGlkIiwKLQkvKiAzICAqLwkgIlNUQSBpcyBsZWF2aW5nIC8gaGFzIGxlZnQiLAotCS8qIDQgICovCSAiRElTLUFTU09DIGR1ZSB0byBpbmFjdGl2aXR5IiwKLQkvKiA1ICAqLwkgIkFQIHVuYWJsZSB0byBoYW5sZSBhbGwgYXNzb2NpYXRpb25zIiwKLQkvKiA2ICAqLwkgImNsYXNzIDIgZXJyb3IiLAotCS8qIDcgICovCSAiY2xhc3MgMyBlcnJvciIsCi0JLyogOCAgKi8JICJTVEEgaXMgbGVhdmluZyAvIGhhcyBsZWZ0IiwKLQkvKiA5ICAqLwkgInJlcXVpcmUgYXV0aCBiZWZvcmUgYXNzb2MvcmUtYXNzb2MiLAotCS8qIDEwICovCSAiUmVzZXJ2ZWQiLAotCS8qIDExICovCSAiUmVzZXJ2ZWQiLAotCS8qIDEyICovCSAiUmVzZXJ2ZWQiLAotCS8qIDEzICovCSAiaW52YWxpZCBJRSIsCi0JLyogMTQgKi8JICJNSUMgZXJyb3IiLAotCS8qIDE1ICovCSAiNC13YXkgaGFuZHNoYWtlIHRpbWVvdXQiLAotCS8qIDE2ICovCSAiMi13YXkgKGdyb3VwIGtleSkgaGFuZHNoYWtlIHRpbWVvdXQiLAotCS8qIDE3ICovCSAiNC13YXkgaGFuZHNoYWtlIElFIGRpZmYgYW1vbmcgQXNzb3NSZXEvUnNwL0JlYWNvbiIsCi0JLyogMTggKi8KK2V4dGVybiB1OCBPZmRtUmF0ZVRvUnh3aU1DU1tdOworLyogc2luY2UgUlQ2MSBoYXMgYmV0dGVyIFJYIHNlbnNpYmlsaXR5LCB3ZSBoYXZlIHRvIGxpbWl0IFRYIEFDSyByYXRlIG5vdCB0byBleGNlZWQgb3VyIG5vcm1hbCBkYXRhIFRYIHJhdGUuICovCisvKiBvdGhlcndpc2UgdGhlIFdMQU4gcGVlciBtYXkgbm90IGJlIGFibGUgdG8gcmVjZWl2ZSB0aGUgQUNLIHRodXMgZG93bmdyYWRlIGl0cyBkYXRhIFRYIHJhdGUgKi8KK3Vuc2lnbmVkIGxvbmcgQmFzaWNSYXRlTWFza1sxMl0gPQorICAgIHsgMHhmZmZmZjAwMSAvKiAxLU1icHMgKi8gLCAweGZmZmZmMDAzIC8qIDIgTWJwcyAqLyAsIDB4ZmZmZmYwMDcgLyogNS41ICovICwKKzB4ZmZmZmYwMGYgLyogMTEgKi8gLAorCTB4ZmZmZmYwMWYgLyogNiAqLyAsIDB4ZmZmZmYwM2YgLyogOSAqLyAsIDB4ZmZmZmYwN2YgLyogMTIgKi8gLAorCSAgICAweGZmZmZmMGZmIC8qIDE4ICovICwKKwkweGZmZmZmMWZmIC8qIDI0ICovICwgMHhmZmZmZjNmZiAvKiAzNiAqLyAsIDB4ZmZmZmY3ZmYgLyogNDggKi8gLAorCSAgICAweGZmZmZmZmZmIC8qIDU0ICovCiB9OwogCi1leHRlcm4gVUNIQVIJIE9mZG1SYXRlVG9SeHdpTUNTW107Ci0vLyBzaW5jZSBSVDYxIGhhcyBiZXR0ZXIgUlggc2Vuc2liaWxpdHksIHdlIGhhdmUgdG8gbGltaXQgVFggQUNLIHJhdGUgbm90IHRvIGV4Y2VlZCBvdXIgbm9ybWFsIGRhdGEgVFggcmF0ZS4KLS8vIG90aGVyd2lzZSB0aGUgV0xBTiBwZWVyIG1heSBub3QgYmUgYWJsZSB0byByZWNlaXZlIHRoZSBBQ0sgdGh1cyBkb3duZ3JhZGUgaXRzIGRhdGEgVFggcmF0ZQotVUxPTkcgQmFzaWNSYXRlTWFza1sxMl0JCQkJPSB7MHhmZmZmZjAwMSAvKiAxLU1icHMgKi8sIDB4ZmZmZmYwMDMgLyogMiBNYnBzICovLCAweGZmZmZmMDA3IC8qIDUuNSAqLywgMHhmZmZmZjAwZiAvKiAxMSAqLywKLQkJCQkJCQkJCSAgMHhmZmZmZjAxZiAvKiA2ICovCSAsIDB4ZmZmZmYwM2YgLyogOSAqLwkgICwgMHhmZmZmZjA3ZiAvKiAxMiAqLyAsIDB4ZmZmZmYwZmYgLyogMTggKi8sCi0JCQkJCQkJCQkgIDB4ZmZmZmYxZmYgLyogMjQgKi8JICwgMHhmZmZmZjNmZiAvKiAzNiAqLwkgICwgMHhmZmZmZjdmZiAvKiA0OCAqLyAsIDB4ZmZmZmZmZmYgLyogNTQgKi99OwordTggQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OwordTggWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CiAKLVVDSEFSIE1VTFRJQ0FTVF9BRERSW01BQ19BRERSX0xFTl0gPSB7MHgxLCAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci1VQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotVUNIQVIgWkVST19NQUNfQUREUltNQUNfQUREUl9MRU5dICA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKy8qIGUuZy4gUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtSQVRFXzM2XSIgbWVhbnMgaWYgdGhlIGN1cnJlbnQgUlNTSSBpcyBncmVhdGVyIHRoYW4gKi8KKy8qICAgICAgICAgICAgICB0aGlzIHZhbHVlLCB0aGVuIGl0J3MgcXVhcmFudGVlZCBjYXBhYmxlIG9mIG9wZXJhdGluZyBpbiAzNiBtYnBzIFRYIHJhdGUgaW4gKi8KKy8qICAgICAgICAgICAgICBjbGVhbiBlbnZpcm9ubWVudC4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZTogMSAgIDIgICA1LjUgICAxMSAgICAgICA2ICAgICAgICA5ICAgIDEyICAgICAgIDE4ICAgICAgIDI0ICAgMzYgICA0OCAgIDU0ICAgICAgIDcyICAxMDAgKi8KK2NoYXIgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdID0KKyAgICB7IC05MiwgLTkxLCAtOTAsIC04NywgLTg4LCAtODYsIC04NSwgLTgzLCAtODEsIC03OCwgLTcyLCAtNzEsIC00MCwgLTQwIH07CiAKLS8vIGUuZy4gUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtSQVRFXzM2XSIgbWVhbnMgaWYgdGhlIGN1cnJlbnQgUlNTSSBpcyBncmVhdGVyIHRoYW4KLS8vCQl0aGlzIHZhbHVlLCB0aGVuIGl0J3MgcXVhcmFudGVlZCBjYXBhYmxlIG9mIG9wZXJhdGluZyBpbiAzNiBtYnBzIFRYIHJhdGUgaW4KLS8vCQljbGVhbiBlbnZpcm9ubWVudC4KLS8vCQkJCQkJCQkgIFR4UmF0ZTogMSAgIDIgICA1LjUJMTEJIDYJICA5ICAgIDEyCTE4CSAyNCAgIDM2ICAgNDgJNTQJIDcyICAxMDAKLUNIQVIgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdID17ICAtOTIsIC05MSwgLTkwLCAtODcsIC04OCwgLTg2LCAtODUsIC04MywgLTgxLCAtNzgsIC03MiwgLTcxLCAtNDAsIC00MCB9OwordTggUmF0ZUlkVG9NYnBzW10gPSB7IDEsIDIsIDUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA3MiwgMTAwIH07Cit1MTYgUmF0ZUlkVG81MDBLYnBzW10gPQorICAgIHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxNDQsIDIwMCB9OwogCi1VQ0hBUiAgUmF0ZUlkVG9NYnBzW10JID0geyAxLCAyLCA1LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCwgNzIsIDEwMH07Ci1VU0hPUlQgUmF0ZUlkVG81MDBLYnBzW10gPSB7IDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgMTQ0LCAyMDB9OwordTggU3NpZEllID0gSUVfU1NJRDsKK3U4IFN1cFJhdGVJZSA9IElFX1NVUFBfUkFURVM7Cit1OCBFeHRSYXRlSWUgPSBJRV9FWFRfU1VQUF9SQVRFUzsKK3U4IEh0Q2FwSWUgPSBJRV9IVF9DQVA7Cit1OCBBZGRIdEluZm9JZSA9IElFX0FERF9IVDsKK3U4IE5ld0V4dENoYW5JZSA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQ7Cit1OCBFcnBJZSA9IElFX0VSUDsKK3U4IERzSWUgPSBJRV9EU19QQVJNOwordTggVGltSWUgPSBJRV9USU07Cit1OCBXcGFJZSA9IElFX1dQQTsKK3U4IFdwYTJJZSA9IElFX1dQQTI7Cit1OCBJYnNzSWUgPSBJRV9JQlNTX1BBUk07CiAKLVVDSEFSICBTc2lkSWUJID0gSUVfU1NJRDsKLVVDSEFSICBTdXBSYXRlSWUgPSBJRV9TVVBQX1JBVEVTOwotVUNIQVIgIEV4dFJhdGVJZSA9IElFX0VYVF9TVVBQX1JBVEVTOwotVUNIQVIgIEh0Q2FwSWUgPSBJRV9IVF9DQVA7Ci1VQ0hBUiAgQWRkSHRJbmZvSWUgPSBJRV9BRERfSFQ7Ci1VQ0hBUiAgTmV3RXh0Q2hhbkllID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVDsKLVVDSEFSICBFcnBJZQkgPSBJRV9FUlA7Ci1VQ0hBUiAgRHNJZSAJID0gSUVfRFNfUEFSTTsKLVVDSEFSICBUaW1JZQkgPSBJRV9USU07Ci1VQ0hBUiAgV3BhSWUJID0gSUVfV1BBOwotVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOwotVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07Ci1VQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKK2V4dGVybiB1OCBXUEFfT1VJW107CiAKLWV4dGVybiBVQ0hBUglXUEFfT1VJW107Cit1OCBTRVNfT1VJW10gPSB7IDB4MDAsIDB4OTAsIDB4NGMgfTsKIAotVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OwotCi1VQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLQkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKLQotLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCi1SVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKLS8vCQljaAkgUjEgCQkgUjIgCQkgUjMoVFgwfjQ9MCkgUjQKLQkJezEsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTZiNDU1LCAweDk4MDA1MTBifSwKLQkJezIsICAweDk4NDAyZWNjLCAweDk4NGMwNzg2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezMsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezQsICAweDk4NDAyZWNjLCAweDk4NGMwNzhhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezUsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezYsICAweDk4NDAyZWNjLCAweDk4NGMwNzhlLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezcsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezgsICAweDk4NDAyZWNjLCAweDk4NGMwNzkyLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezksICAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezEwLCAweDk4NDAyZWNjLCAweDk4NGMwNzk2LCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezExLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezEyLCAweDk4NDAyZWNjLCAweDk4NGMwNzlhLCAweDk4MTY4YTU1LCAweDk4MDA1MTlmfSwKLQkJezEzLCAweDk4NDAyZWNjLCAweDk4NGMwNzllLCAweDk4MTY4YTU1LCAweDk4MDA1MThifSwKLQkJezE0LCAweDk4NDAyZWNjLCAweDk4NGMwN2EyLCAweDk4MTY4YTU1LCAweDk4MDA1MTkzfSwKLQotCQkvLyA4MDIuMTEgVU5JIC8gSHlwZXJMYW4gMgotCQl7MzYsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7MzgsIDB4OTg0MDJlY2MsIDB4OTg0YzA5OWUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAotCQl7NDQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7NDYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAotCQl7NDgsIDB4OTg0MDJlYzgsIDB4OTg0YzA2ODYsIDB4OTgxNThhNTUsIDB4OTgwZWQxOWJ9LAotCQl7NTIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NTQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGEsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LAotCQl7NTYsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OGUsIDB4OTgxNThhNTUsIDB4OTgwZWQxOGJ9LAotCQl7NjAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxODN9LAotCQl7NjIsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxOTN9LAotCQl7NjQsIDB4OTg0MDJlYzgsIDB4OTg0YzA2OTIsIDB4OTgxNThhNTUsIDB4OTgwZWQxYTN9LCAvLyBQbHVnZmVzdCM0LCBEYXk0LCBjaGFuZ2UgUkZSMyBsZWZ0NHRoIDktPjUuCi0KLQkJLy8gODAyLjExIEh5cGVyTGFuIDIKLQkJezEwMCwgMHg5ODQwMmVjOCwgMHg5ODRjMDZiMiwgMHg5ODE3OGE1NSwgMHg5ODBlZDc4M30sCi0KLQkJLy8gMjAwOC4wNC4zMCBtb2RpZmllZAotCQkvLyBUaGUgc3lzdGVtIHRlYW0gaGFzIEFOIHRvIGltcHJvdmUgdGhlIEVWTSB2YWx1ZQotCQkvLyBmb3IgY2hhbm5lbCAxMDIgdG8gMTA4IGZvciB0aGUgUlQyODUwL1JUMjc1MCBkdWFsIGJhbmQgc29sdXRpb24uCi0JCXsxMDIsIDB4OTg0MDJlYzgsIDB4OTg1YzA2YjIsIDB4OTg1NzhhNTUsIDB4OTgwZWQ3OTN9LAotCQl7MTA0LCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezEwOCwgMHg5ODQwMmVjYywgMHg5ODVjMGEzMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDE5M30sCi0KLQkJezExMCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzNiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0JCXsxMTIsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWJ9LAotCQl7MTE2LCAweDk4NDAyZWNjLCAweDk4NGMwYTNhLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezExOCwgMHg5ODQwMmVjYywgMHg5ODRjMGEzZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCi0JCXsxMjAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAotCQl7MTI0LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKLQkJezEyNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE1Yn0sIC8vIDB4OTgwZWQxYmItPjB4OTgwZWQxNWIgcmVxdWlyZWQgYnkgUm9yeSAyMDA3MDkyNwotCQl7MTI4LCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMWEzfSwKLQkJezEzMiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Yn0sCi0JCXsxMzQsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAotCQl7MTM2LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKLQkJezE0MCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4M30sCi0KLQkJLy8gODAyLjExIFVOSUkKLQkJezE0OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4YSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhN30sCi0JCXsxNTEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODd9LAotCQl7MTUzLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMThmfSwKLQkJezE1NywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Zn0sCi0JCXsxNTksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAotCQl7MTYxLCAweDk4NDAyZWM0LCAweDk4NGMwMzkyLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKLQkJezE2NSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5N30sCi0KLQkJLy8gSmFwYW4KLQkJezE4NCwgMHg5NTAwMmNjYywgMHg5NTAwNDkxZSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEwYn0sCi0JCXsxODgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjIsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAotCQl7MTkyLCAweDk1MDAyY2NjLCAweDk1MDA0OTI2LCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKLQkJezE5NiwgMHg5NTAwMmNjYywgMHg5NTAwNDkyYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCi0JCXsyMDgsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2EsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMTN9LAotCQl7MjEyLCAweDk1MDAyY2NjLCAweDk1MDA0OTNlLCAweDk1MDliZTU1LCAweDk1MGMwYTFifSwKLQkJezIxNiwgMHg5NTAwMmNjYywgMHg5NTAwNDk4MiwgMHg5NTA5YmU1NSwgMHg5NTBjMGEyM30sCi0KLQkJLy8gc3RpbGwgbGFjayBvZiBNTUFDKEphcGFuKSBjaCAzNCwzOCw0Miw0NgordTggWmVyb1NzaWRbMzJdID0KKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKIH07Ci1VQ0hBUglOVU1fT0ZfMjg1MF9DSE5MID0gKHNpemVvZihSRjI4NTBSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRl9SRUdTKSk7Ci0KLUZSRVFVRU5DWV9JVEVNIEZyZXFJdGVtczMwMjBbXSA9Ci17Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vIElTTSA6IDIuNCB0byAyLjQ4MyBHSHogICAgICAgICAgICAgICAgICAgICAgICAgLy8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gMTFnCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vLUNILS0tTi0tLS0tLS1SLS0tSy0tLS0tLS0tLS0tCi0JezEsICAgIDI0MSwgIDIsICAyfSwKLQl7MiwgICAgMjQxLAkgMiwgIDd9LAotCXszLCAgICAyNDIsCSAyLCAgMn0sCi0JezQsICAgIDI0MiwJIDIsICA3fSwKLQl7NSwgICAgMjQzLAkgMiwgIDJ9LAotCXs2LCAgICAyNDMsCSAyLCAgN30sCi0JezcsICAgIDI0NCwJIDIsICAyfSwKLQl7OCwgICAgMjQ0LAkgMiwgIDd9LAotCXs5LCAgICAyNDUsCSAyLCAgMn0sCi0JezEwLCAgIDI0NSwJIDIsICA3fSwKLQl7MTEsICAgMjQ2LAkgMiwgIDJ9LAotCXsxMiwgICAyNDYsCSAyLCAgN30sCi0JezEzLCAgIDI0NywJIDIsICAyfSwKLQl7MTQsICAgMjQ4LAkgMiwgIDR9LAotfTsKLVVDSEFSCU5VTV9PRl8zMDIwX0NITkw9KHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihGUkVRVUVOQ1lfSVRFTSkpOwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NjAsMTcgKzM1NiwxNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBNbG1lSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK2ludCBNbG1lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKIAotCWRvCi0JeworCWRvIHsKIAkJU3RhdHVzID0gTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKLQkJaWYoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCiAJCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOwpAQCAtNDc5LDQwICszNzMsNjUgQEAKIAkJewogCQkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwogCi0JCQkvLyBpbml0IFNUQSBzdGF0ZSBtYWNoaW5lcwotCQkJQXNzb2NTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5Bc3NvY01hY2hpbmUsIHBBZC0+TWxtZS5Bc3NvY0Z1bmMpOwotCQkJQXV0aFN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBwQWQtPk1sbWUuQXV0aEZ1bmMpOwotCQkJQXV0aFJzcFN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLCBwQWQtPk1sbWUuQXV0aFJzcEZ1bmMpOwotCQkJU3luY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLlN5bmNNYWNoaW5lLCBwQWQtPk1sbWUuU3luY0Z1bmMpOwotCQkJV3BhUHNrU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuV3BhUHNrTWFjaGluZSwgcEFkLT5NbG1lLldwYVBza0Z1bmMpOwotCQkJQWlyb25ldFN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLCBwQWQtPk1sbWUuQWlyb25ldEZ1bmMpOworCQkJLyogaW5pdCBTVEEgc3RhdGUgbWFjaGluZXMgKi8KKwkJCUFzc29jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLAorCQkJCQkgICAgICBwQWQtPk1sbWUuQXNzb2NGdW5jKTsKKwkJCUF1dGhTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwKKwkJCQkJICAgICBwQWQtPk1sbWUuQXV0aEZ1bmMpOworCQkJQXV0aFJzcFN0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkF1dGhSc3BNYWNoaW5lLAorCQkJCQkJcEFkLT5NbG1lLkF1dGhSc3BGdW5jKTsKKwkJCVN5bmNTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwKKwkJCQkJICAgICBwQWQtPk1sbWUuU3luY0Z1bmMpOwogCi0JCQkvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgc3dpdGNoL2Nhc2UgdG8gaW1wbGVtZW50IGl0LCB0aGUgaW5pdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUKLQkJCS8vIHN0YXRlIG1hY2hpbmUgaW5pdAorCQkJLyogU2luY2Ugd2UgYXJlIHVzaW5nIHN3aXRjaC9jYXNlIHRvIGltcGxlbWVudCBpdCwgdGhlIGluaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGFib3ZlICovCisJCQkvKiBzdGF0ZSBtYWNoaW5lIGluaXQgKi8KIAkJCU1sbWVDbnRsSW5pdChwQWQsICZwQWQtPk1sbWUuQ250bE1hY2hpbmUsIE5VTEwpOwogCQl9CiAKLQkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOworCQlXcGFTdGF0ZU1hY2hpbmVJbml0KHBBZCwgJnBBZC0+TWxtZS5XcGFNYWNoaW5lLAorCQkJCSAgICBwQWQtPk1sbWUuV3BhRnVuYyk7CiAKLQkJLy8gSW5pdCBtbG1lIHBlcmlvZGljIHRpbWVyCi0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKSwgcEFkLCBUUlVFKTsKKwkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwKKwkJCQkgICAgICAgcEFkLT5NbG1lLkFjdEZ1bmMpOwogCi0JCS8vIFNldCBtbG1lIHBlcmlvZGljIHRpbWVyCisJCS8qIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lciAqLworCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLAorCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpLCBwQWQsIFRSVUUpOworCisJCS8qIFNldCBtbG1lIHBlcmlvZGljIHRpbWVyICovCiAJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOwogCi0JCS8vIHNvZnR3YXJlLWJhc2VkIFJYIEFudGVubmEgZGl2ZXJzaXR5Ci0JCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkJLyogc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkgKi8KKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsCisJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpLCBwQWQsCisJCQkgICAgICBGQUxTRSk7CiAKLSNpZmRlZiBSVDI4NjAKIAkJewotCSAgICAgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICAvLyBvbmx5IFBDSWUgY2FyZHMgbmVlZCB0aGVzZSB0d28gdGltZXJzCi0JICAgIAkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyksIHBBZCwgRkFMU0UpOwotCSAgICAJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKSwgcEFkLCBGQUxTRSk7Ci0JICAgICAgICB9CisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQkJLyogb25seSBQQ0llIGNhcmRzIG5lZWQgdGhlc2UgdHdvIHRpbWVycyAqLworCQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAorCQkJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04KKwkJCQkJICAgICAgKFBzUG9sbFdha2VFeGVjKSwgcEFkLCBGQUxTRSk7CisJCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLAorCQkJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpLAorCQkJCQkgICAgICBwQWQsIEZBTFNFKTsKKwkJCX0KKyNlbmRpZiAvKiBSVE1QX1BDSV9TVVBQT1JUIC8vICovCisKKwkJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLkxpbmtEb3duVGltZXIsCisJCQkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKExpbmtEb3duRXhlYyksIHBBZCwKKwkJCQkgICAgICBGQUxTRSk7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lciwKKwkJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04KKwkJCQkgICAgICAoUnRtcFVzYlN0YUFzaWNGb3JjZVdha2V1cFRpbWVvdXQpLCBwQWQsCisJCQkJICAgICAgRkFMU0UpOworCQkJcEFkLT5NbG1lLkF1dG9XYWtldXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAkJfQotI2VuZGlmCisKIAl9IHdoaWxlIChGQUxTRSk7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTUxNRSBJbml0aWFsaXplXG4iKSk7CkBAIC01MzQsOTMgKzQ1MywxMDIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUhhbmRsZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE1sbWVIYW5kbGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNTE1FX1FVRVVFX0VMRU0gCSAgICpFbGVtID0gTlVMTDsKKwlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtID0gTlVMTDsKIAotCS8vIE9ubHkgYWNjZXB0IE1MTUUgYW5kIEZyYW1lIGZyb20gcGVlciBzaWRlLCBubyBvdGhlciAoY29udHJvbC9kYXRhKSBmcmFtZSBzaG91bGQKLQkvLyBnZXQgaW50byB0aGlzIHN0YXRlIG1hY2hpbmUKKwkvKiBPbmx5IGFjY2VwdCBNTE1FIGFuZCBGcmFtZSBmcm9tIHBlZXIgc2lkZSwgbm8gb3RoZXIgKGNvbnRyb2wvZGF0YSkgZnJhbWUgc2hvdWxkICovCisJLyogZ2V0IGludG8gdGhpcyBzdGF0ZSBtYWNoaW5lICovCiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCWlmKHBBZC0+TWxtZS5iUnVubmluZykKLQl7CisJaWYgKHBBZC0+TWxtZS5iUnVubmluZykgewogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwogCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5NbG1lLmJSdW5uaW5nID0gVFJVRTsKIAl9CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKIAotCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCi0JeworCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpIHsKIAkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NTE1FX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRldmljZSBIYWx0ZWQgb3IgUmVtb3ZlZCBvciBNbG1lUmVzdCwgZXhpdCBNbG1lSGFuZGxlciEgKHF1ZXVlIG51bSA9ICVsZClcbiIsIHBBZC0+TWxtZS5RdWV1ZS5OdW0pKTsKKwkJICAgIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAorCQkgICAgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJEZXZpY2UgSGFsdGVkIG9yIFJlbW92ZWQgb3IgTWxtZVJlc3QsIGV4aXQgTWxtZUhhbmRsZXIhIChxdWV1ZSBudW0gPSAlbGQpXG4iLAorCQkJCSAgcEFkLT5NbG1lLlF1ZXVlLk51bSkpOwogCQkJYnJlYWs7CiAJCX0KLQotCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQotCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQotCQl7Ci0jaWZkZWYgUlQyODcwCi0JCQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfUkVTRVRfQ09ORikKLQkJCXsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiISEhIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSAhISFcbiIpKTsKKwkJLypGcm9tIG1lc3NhZ2UgdHlwZSwgZGV0ZXJtaW5lIHdoaWNoIHN0YXRlIG1hY2hpbmUgSSBzaG91bGQgZHJpdmUgKi8KKwkJaWYgKE1sbWVEZXF1ZXVlKCZwQWQtPk1sbWUuUXVldWUsICZFbGVtKSkgeworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQkJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1JFU0VUX0NPTkYpIHsKKwkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAgICAgKCJyZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUhXG4iKSk7CiAJCQkJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUocEFkKTsKIAkJCQlFbGVtLT5PY2N1cGllZCA9IEZBTFNFOwogCQkJCUVsZW0tPk1zZ0xlbiA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQkJCS8vIGlmIGRlcXVldWUgc3VjY2VzcwotCQkJc3dpdGNoIChFbGVtLT5NYWNoaW5lKQotCQkJewotCQkJCS8vIFNUQSBzdGF0ZSBtYWNoaW5lcwotCQkJCWNhc2UgQVNTT0NfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRIX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkF1dGhNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1lOQ19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5TeW5jTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCU1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYVBza01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFJUk9ORVRfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEFDVElPTl9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BY3RNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7CisJCQkvKiBpZiBkZXF1ZXVlIHN1Y2Nlc3MgKi8KKwkJCXN3aXRjaCAoRWxlbS0+TWFjaGluZSkgeworCQkJCS8qIFNUQSBzdGF0ZSBtYWNoaW5lcyAqLworCQkJY2FzZSBBU1NPQ19TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS4KKwkJCQkJCQkgIEFzc29jTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVVEhfU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuCisJCQkJCQkJICBBdXRoTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU6CisJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsCisJCQkJCQkJICAmcEFkLT5NbG1lLgorCQkJCQkJCSAgQXV0aFJzcE1hY2hpbmUsIEVsZW0pOworCQkJCWJyZWFrOworCQkJY2FzZSBTWU5DX1NUQVRFX01BQ0hJTkU6CisJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsCisJCQkJCQkJICAmcEFkLT5NbG1lLgorCQkJCQkJCSAgU3luY01hY2hpbmUsIEVsZW0pOworCQkJCWJyZWFrOworCQkJY2FzZSBNTE1FX0NOVExfU1RBVEVfTUFDSElORToKKwkJCQlNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICAgICZwQWQtPk1sbWUuCisJCQkJCQkJICAgICBDbnRsTWFjaGluZSwgRWxlbSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFdQQV9QU0tfU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuCisJCQkJCQkJICBXcGFQc2tNYWNoaW5lLCBFbGVtKTsKKwkJCQlicmVhazsKIAorCQkJY2FzZSBBQ1RJT05fU1RBVEVfTUFDSElORToKKwkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwKKwkJCQkJCQkgICZwQWQtPk1sbWUuQWN0TWFjaGluZSwKKwkJCQkJCQkgIEVsZW0pOworCQkJCWJyZWFrOwogCisJCQljYXNlIFdQQV9TVEFURV9NQUNISU5FOgorCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLAorCQkJCQkJCSAgJnBBZC0+TWxtZS5XcGFNYWNoaW5lLAorCQkJCQkJCSAgRWxlbSk7CisJCQkJYnJlYWs7CiAKKwkJCWRlZmF1bHQ6CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkVSUk9SOiBJbGxlZ2FsIG1hY2hpbmUgJWxkIGluIE1sbWVIYW5kbGVyKClcbiIsCisJCQkJCSAgRWxlbS0+TWFjaGluZSkpOworCQkJCWJyZWFrOworCQkJfQkvKiBlbmQgb2Ygc3dpdGNoICovCiAKLQkJCQlkZWZhdWx0OgotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFUlJPUjogSWxsZWdhbCBtYWNoaW5lICVsZCBpbiBNbG1lSGFuZGxlcigpXG4iLCBFbGVtLT5NYWNoaW5lKSk7Ci0JCQkJCWJyZWFrOwotCQkJfSAvLyBlbmQgb2Ygc3dpdGNoCi0KLQkJCS8vIGZyZWUgTUxNRSBlbGVtZW50CisJCQkvKiBmcmVlIE1MTUUgZWxlbWVudCAqLwogCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKIAkJCUVsZW0tPk1zZ0xlbiA9IDA7CiAKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCURCR1BSSU5UX0VSUigoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKIAkJfQogCX0KQEAgLTY0Myw3MyArNTcxLDY3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVIYWx0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBNbG1lSGFsdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JQk9PTEVBTiAJICBDYW5jZWxsZWQ7Ci0jaWZkZWYgUlQzMDcwCi0JVUlOVDMyCQlUeFBpbkNmZyA9IDB4MDAwNTBGMEY7Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCisJQk9PTEVBTiBDYW5jZWxsZWQ7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUhhbHRcbiIpKTsKIAotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJLy8gZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpIHsKKwkJLyogZGlzYWJsZSBCRUFDT04gZ2VuZXJhdGlvbiBhbmQgb3RoZXIgQkVBQ09OIHJlbGF0ZWQgaGFyZHdhcmUgdGltZXJzICovCiAJCUFzaWNEaXNhYmxlU3luYyhwQWQpOwogCX0KIAogCXsKLQkJLy8gQ2FuY2VsIHBlbmRpbmcgdGltZXJzCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0jaWZkZWYgUlQyODYwCi0JICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpCi0JICAgIHsKLQkgICAJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwkJLyogQ2FuY2VsIHBlbmRpbmcgdGltZXJzICovCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZDYW5jZWxsZWQpOworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsICZDYW5jZWxsZWQpOworCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOworCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCAmQ2FuY2VsbGVkKTsKIAkJfQotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuTGlua0Rvd25UaW1lciwgJkNhbmNlbGxlZCk7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuQXV0b1dha2V1cFRpbWVyLCAmQ2FuY2VsbGVkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAl9CiAKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsCQkmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgJkNhbmNlbGxlZCk7CiAKKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgeworCQlzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CiAKLQotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJLy8gU2V0IExFRAorCQkvKiBTZXQgTEVEICovCiAJCVJUTVBTZXRMRUQocEFkLCBMRURfSEFMVCk7Ci0gICAgICAgIFJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLy8gRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4KLSNpZmRlZiBSVDI4NzAKLSAgICAgICAgewotICAgICAgICAgICAgTEVEX0NGR19TVFJVQyBMZWRDZmc7Ci0gICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIExFRF9DRkcsICZMZWRDZmcud29yZCk7Ci0gICAgICAgICAgICBMZWRDZmcuZmllbGQuTGVkUG9sYXIgPSAwOwotICAgICAgICAgICAgTGVkQ2ZnLmZpZWxkLlJMZWRNb2RlID0gMDsKLSAgICAgICAgICAgIExlZENmZy5maWVsZC5HTGVkTW9kZSA9IDA7Ci0gICAgICAgICAgICBMZWRDZmcuZmllbGQuWUxlZE1vZGUgPSAwOwotICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTEVEX0NGRywgTGVkQ2ZnLndvcmQpOwotICAgICAgICB9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0jaWZkZWYgUlQzMDcwCi0JCS8vCi0JCS8vIFR1cm4gb2ZmIExOQV9QRQotCQkvLwotCQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkpCisJCVJUTVBTZXRTaWduYWxMRUQocEFkLCAtMTAwKTsJLyogRm9yY2Ugc2lnbmFsIHN0cmVuZ3RoIExlZCB0byBiZSB0dXJuZWQgb2ZmLCBmaXJtd2FyZSBpcyBub3QgZG9uZSBpdC4gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKIAkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjBGMDsKLQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKKwkJCUxFRF9DRkdfU1RSVUMgTGVkQ2ZnOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRURfQ0ZHLCAmTGVkQ2ZnLndvcmQpOworCQkJTGVkQ2ZnLmZpZWxkLkxlZFBvbGFyID0gMDsKKwkJCUxlZENmZy5maWVsZC5STGVkTW9kZSA9IDA7CisJCQlMZWRDZmcuZmllbGQuR0xlZE1vZGUgPSAwOworCQkJTGVkQ2ZnLmZpZWxkLllMZWRNb2RlID0gMDsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIExFRF9DRkcsIExlZENmZy53b3JkKTsKIAkJfQotI2VuZGlmIC8vIFJUMzA3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJCWlmIChwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24pCisJCQlwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24ocEFkKTsKIAl9CiAKLQlSVE1QdXNlY0RlbGF5KDUwMDApOyAgICAvLyAgNSBtc2VjIHRvIGd1cmFudGVlIEFudCBEaXZlcnNpdHkgdGltZXIgY2FuY2VsZWQKKwlSVE1QdXNlY0RlbGF5KDUwMDApOwkvKiAgNSBtc2VjIHRvIGd1cmFudGVlIEFudCBEaXZlcnNpdHkgdGltZXIgY2FuY2VsZWQgKi8KIAogCU1sbWVRdWV1ZURlc3Ryb3koJnBBZC0+TWxtZS5RdWV1ZSk7CiAJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKQEAgLTcxNywxMSArNjM5LDExIEBACiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVIYWx0XG4iKSk7CiB9CiAKLVZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCit2b2lkIE1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7Ci0JLy8gY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4KKwlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNSeE9rRGF0YUNudCA9CisJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQ7CisJLyogY2xlYXIgYWxsIE9uZVNlY3h4eCBjb3VudGVycy4gKi8KIAlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0JlYWNvblNlbnRDbnQgPSAwOwogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgPSAwOwogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgPSAwOwpAQCAtNzMwLDggKzY1MiwxMCBAQAogCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCA9IDA7CisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCA9IDA7CiAKLQkvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAorCS8qIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkICovCiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JFXSA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX0JLXSA9IDA7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUUlEX0FDX1ZJXSA9IDA7CkBAIC03NDgsOSArNjcyLDYgQEAKIAlyZXR1cm47CiB9CiAKLXVuc2lnbmVkIGxvbmcgcnhfQU1TRFU7Ci11bnNpZ25lZCBsb25nIHJ4X1RvdGFsOwotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC03NjcsMjI5ICs2ODgsMTg4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi0jZGVmaW5lIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUJCSg4Kk9TX0haKSAgLy8gOCBzZWMKLVZPSUQgTWxtZVBlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCisjZGVmaW5lIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUJCSg4Kk9TX0haKQkvKiA4IHNlYyAqLwordm9pZCBNbG1lUGVyaW9kaWNFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlVTE9ORwkJCVR4VG90YWxDbnQ7Ci0JUFJUTVBfQURBUFRFUglwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXVuc2lnbmVkIGxvbmcgVHhUb3RhbENudDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotI2lmZGVmIFJUMjg2MAotCS8vQmFyb24gMjAwOC8wNy8xMAotCS8vcHJpbnRrKCJCYXJvbl9UZXN0Olx0JXMiLCBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCS8vSWYgdGhlIFNUQSBzZWN1cml0eSBzZXR0aW5nIGlzIE9QRU4gb3IgV0VQLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAwLgotCS8vSWYgdGhlIFNUQSBzZWN1cml0eSBzZXR0aW5nIGlzIFdQQVBTSyBvciBXUEEyUFNLLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSAxLgotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1czwyKQorI2lmZGVmIFJUTVBfTUFDX1BDSQogCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMTsKLQl9CisJCS8qIElmIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCwgd2UgaGF2ZSB0byBjaGVjayBHUElPIHBpbjIgZXZlcnkgMiBzZWNvbmQuICovCisJCS8qIE1vdmUgY29kZSB0byBoZXJlLCBiZWNhdXNlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV0dXJuIHdoZW4gcmFkaW8gaXMgb2ZmICovCisJCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiAyKSA9PQorCQkgICAgIDApICYmIChwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKQorCQkgICAgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCSAgICAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkKKwkJICAgIC8qJiYocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKSAqLworCQkgICAgKSB7CisJCQl1MzIgZGF0YSA9IDA7CiAKLQl7Ci0JICAgIC8vIElmIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCwgd2UgaGF2ZSB0byBjaGVjayBHUElPIHBpbjIgZXZlcnkgMiBzZWNvbmQuCi0JCS8vIE1vdmUgY29kZSB0byBoZXJlLCBiZWNhdXNlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV0dXJuIHdoZW4gcmFkaW8gaXMgb2ZmCi0JCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiAyKSA9PSAwKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID09IFRSVUUpICYmCi0JCQkoUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCi0JCXsKLQkJCVVJTlQzMgkJCQlkYXRhID0gMDsKKwkJCS8qIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUgKi8KKyNpZm5kZWYgUlQzMDkwCisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKy8qS0goUENJRSBQUyk6QWRkZWQgYmFzZWQgb24gSmFuZTwtLSAqLworI2lmZGVmIFJUMzA5MAorLyogUmVhZCBHUElPIHBpbjIgYXMgSGFyZHdhcmUgY29udHJvbGxlZCByYWRpbyBzdGF0ZSAqLworLyogV2UgbmVlZCB0byBSZWFkIEdQSU8gaWYgSFcgc2FpZCBzbyBubyBtYXRlciB3aGF0IGFkdmFuY2UgcG93ZXIgc2F2aW5nICovCisJCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZCkpCisJCQkgICAgJiYKKwkJCSAgICAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkKKwkJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZVBTaW5JZGxlID09CisJCQkJVFJVRSkpIHsKKwkJCQkvKiBXYW50IHRvIG1ha2Ugc3VyZSBkZXZpY2UgZ29lcyB0byBMMCBzdGF0ZSBiZWZvcmUgcmVhZGluZyByZWdpc3Rlci4gKi8KKwkJCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgMCk7CisJCQkJUlRNUF9JT19GT1JDRV9SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisJCQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKKwkJCX0gZWxzZQorCQkJCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworLypLSChQQ0lFIFBTKTpBZGRlZCBiYXNlZCBvbiBKYW5lLS0+ICovCiAKLQkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKLQkJCVJUTVBfSU9fRk9SQ0VfUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotCQkJaWYgKGRhdGEgJiAweDA0KQotCQkJeworCQkJaWYgKGRhdGEgJiAweDA0KSB7CiAJCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOwogCQkJfQotCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7Ci0JCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotCQkJCXsKKwkJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0KKwkJCSAgICAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKSB7CisJCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvCisJCQkJCQkgICAgICAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSB7CiAJCQkJCU1sbWVSYWRpb09uKHBBZCk7Ci0JCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgorCQkJCQkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gKi8KIAkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCX0gZWxzZSB7CiAJCQkJCU1sbWVSYWRpb09mZihwQWQpOwotCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KKwkJCQkJLyogVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uICovCiAJCQkJCXBBZC0+RXh0cmFJbmZvID0gSFdfUkFESU9fT0ZGOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLwogCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSkKKwkJCQkgIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgUlQyODYwCi0JewotCQlpZiAoKHBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdFJlY2VpdmVkQnl0ZUNvdW50ID09IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQpICYmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkpCi0JCXsKLQkJCS8vIElmIFJlY2VpdmVCeXRlQ291bnQgZG9lc24ndCBjaGFuZ2UsICBpbmNyZWFzZSBTYW1lUnhCeXRlQ291bnQgYnkgMS4KLQkJCXBBZC0+U2FtZVJ4Qnl0ZUNvdW50Kys7Ci0JCX0KLQkJZWxzZQotCQkJcEFkLT5TYW1lUnhCeXRlQ291bnQgPSAwOwotCi0JCS8vIElmIGFmdGVyIEJCUCwgc3RpbGwgbm90IHdvcmsuLi5uZWVkIHRvIGNoZWNrIHRvIHJlc2V0IFBCRiZNQUMuCi0JCWlmIChwQWQtPlNhbWVSeEJ5dGVDb3VudCA9PSA3MDIpCi0JCXsKLQkJCXBBZC0+U2FtZVJ4Qnl0ZUNvdW50ID0gMDsKLQkJCUFzaWNSZXNldFBCRihwQWQpOwotCQkJQXNpY1Jlc2V0TUFDKHBBZCk7Ci0JCX0KLQotCQkvLyBJZiBTYW1lUnhCeXRlQ291bnQga2VlcHMgaGFwcGVucyBmb3IgMiBzZWNvbmQgaW4gaW5mcmEgbW9kZSwgb3IgZm9yIDYwIHNlY29uZHMgaW4gaWRsZSBtb2RlLgotCQlpZiAoKChJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5TYW1lUnhCeXRlQ291bnQgPiAyMCkpIHx8ICgoSURMRV9PTihwQWQpKSAmJiAocEFkLT5TYW1lUnhCeXRlQ291bnQgPiA2MDApKSkKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYgKHBBZC0+U2FtZVJ4Qnl0ZUNvdW50IDwgNzAwKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+ICBTYW1lUnhCeXRlQ291bnQgPSAlbHUgISEhISEhISEhISEhISEhIFxuIiwgcEFkLT5TYW1lUnhCeXRlQ291bnQpKTsKLQkJCQlwQWQtPlNhbWVSeEJ5dGVDb3VudCA9IDcwMDsKLQkJCQlBc2ljUmVzZXRCQlAocEFkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFVwZGF0ZSBsYXN0UmVjZWl2ZUJ5dGVDb3VudC4KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0UmVjZWl2ZWRCeXRlQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OwotCi0JCWlmICgocEFkLT5DaGVja0RtYUJ1c3lDb3VudCA+IDMpICYmIChJRExFX09OKHBBZCkpKQotCQl7Ci0JCQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLQkJCUFzaWNSZXNldEZyb21ETUFCdXN5KHBBZCk7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogUlQyODYwICovCi0JUlQyOFhYX01MTUVfUFJFX1NBTklUWV9DSEVDSyhwQWQpOworCVJUTVBfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCk7CiAKIAl7Ci0JCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCisJCS8qIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uICovCiAJCWlmIChNT05JVE9SX09OKHBBZCkpCiAJCQlyZXR1cm47CiAKLQkJaWYgKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICYgMHgxKQotCQl7Ci0JCQkvLyBUaGlzIGlzIHRoZSBmaXggZm9yIHdpZmkgMTFuIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIHRlc3QgY2FzZS4gIGZvciAyODYwRAorCQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJiAweDEpIHsKKwkJCS8qIFRoaXMgaXMgdGhlIGZpeCBmb3Igd2lmaSAxMW4gZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgdGVzdCBjYXNlLiAgZm9yIDI4NjBEICovCiAJCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkgJiYKLQkJCQkoU1RBX1RHTl9XSUZJX09OKHBBZCkpICYmCi0JCQkJKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9PSBGQUxTRSkpCi0KLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjRCZik7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IFRSVUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKLQkJCQkJCSgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA9PSAweDAxMDEpKQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNDNmKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gRkFMU0U7Ci0JCQkJfQorCQkJICAgIChTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCSAgICAocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID09IEZBTFNFKSkKKwkJCXsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0QmYpOworCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlRvZ2dsZSA9IFRSVUU7CisJCQl9IGVsc2UgaWYgKChTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKKwkJCQkgICAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSkgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4MjQzZik7CisJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gRkFMU0U7CisJCQl9CiAJCX0KIAl9CiAKIAlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7CiAKLS8vCVJFQ0JBVGltZXJUaW1lb3V0KFN5c3RlbVNwZWNpZmljMSxGdW5jdGlvbkNvbnRleHQsU3lzdGVtU3BlY2lmaWMyLFN5c3RlbVNwZWNpZmljMyk7Ci0JcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7CisvKiAgICAgIFJFQ0JBVGltZXJUaW1lb3V0KFN5c3RlbVNwZWNpZmljMSxGdW5jdGlvbkNvbnRleHQsU3lzdGVtU3BlY2lmaWMyLFN5c3RlbVNwZWNpZmljMyk7ICovCisJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQrKzsKIAotI2lmZGVmIFJUMzA3MAotCS8vIGV4ZWN1dGUgZXZlcnkgMTAwbXMsIHVwZGF0ZSB0aGUgVHggRklGTyBDbnQgZm9yIHVwZGF0ZSBUeCBSYXRlLgorI2lmZGVmIFJUTVBfTUFDX1VTQgorCS8qIGV4ZWN1dGUgZXZlcnkgMTAwbXMsIHVwZGF0ZSB0aGUgVHggRklGTyBDbnQgZm9yIHVwZGF0ZSBUeCBSYXRlLiAqLwogCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotI2VuZGlmIC8vIFJUMzA3MCAvLwotCS8vIGV4ZWN1dGUgZXZlcnkgNTAwbXMKLQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgNSA9PSAwKSAmJiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhwQWQpLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkqLykKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCS8qIGV4ZWN1dGUgZXZlcnkgNTAwbXMgKi8KKwlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgNSA9PSAwKQorCSAgICAmJiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhwQWQpCisJICAgIC8qKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpICovICkKIAl7Ci0JCS8vIHBlcmZvcm0gZHluYW1pYyB0eCByYXRlIHN3aXRjaGluZyBiYXNlZCBvbiBwYXN0IFRYIGhpc3RvcnkKKwkJLyogcGVyZm9ybSBkeW5hbWljIHR4IHJhdGUgc3dpdGNoaW5nIGJhc2VkIG9uIHBhc3QgVFggaGlzdG9yeSAqLwogCQl7Ci0JCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkJCQkpCi0JCQkJJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKSkKKwkJCWlmICgoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkgICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQorCQkJICAgICkKKwkJCSAgICAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpKQogCQkJCU1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKHBBZCk7CiAJCX0KIAl9CisJLyogTm9ybWFsIDEgc2Vjb25kIE1sbWUgUGVyaW9kaWNFeGVjLiAqLworCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIE1MTUVfVEFTS19FWEVDX01VTFRJUExFID09IDApIHsKKwkJcEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQrKzsKIAotCS8vIE5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYy4KLQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJU1MTUVfVEFTS19FWEVDX01VTFRJUExFID09IDApCi0JewotICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICsrOworCQkvKk9SSUJBVGltZXJUaW1lb3V0KHBBZCk7ICovCiAKLQkJaWYgKHJ4X1RvdGFsKQotCQl7Ci0KLQkJCS8vIHJlc2V0IGNvdW50ZXJzCi0JCQlyeF9BTVNEVSA9IDA7Ci0JCQlyeF9Ub3RhbCA9IDA7Ci0JCX0KLQotCQkvLyBNZWRpYSBzdGF0dXMgY2hhbmdlZCwgcmVwb3J0IHRvIE5ESVMKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpKQotCQl7CisJCS8qIE1lZGlhIHN0YXR1cyBjaGFuZ2VkLCByZXBvcnQgdG8gTkRJUyAqLworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSkpIHsKIAkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKTsKLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQl7Ci0JCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwogCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CiAKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOworCQkJfSBlbHNlIHsKKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7CiAJCQl9CiAJCX0KIAogCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTm93MzIpOwogCi0JCS8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSB2YXJpYWJsZSwgc28gdGhhdAotCQkvLyB0aGUgZHluYW1pYyB0dW5pbmcgbWVjaGFuaXNtIGJlbG93IGFyZSBiYXNlZCBvbiBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwkJLyogYWRkIHRoZSBtb3N0IHVwLXRvLWRhdGUgaC93IHJhdyBjb3VudGVycyBpbnRvIHNvZnR3YXJlIHZhcmlhYmxlLCBzbyB0aGF0ICovCisJCS8qIHRoZSBkeW5hbWljIHR1bmluZyBtZWNoYW5pc20gYmVsb3cgYXJlIGJhc2VkIG9uIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiAqLwogCQlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwogCi0jaWZkZWYgUlQyODcwCi0JCVJUMjg3MF9XYXRjaERvZyhwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCQlSVFVTQldhdGNoRG9nKHBBZCk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLSAgIAkJLy8gTmVlZCBzdGF0aXN0aWNzIGFmdGVyIHJlYWQgY291bnRlci4gU28gcHV0IGFmdGVyIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzCisJCS8qIE5lZWQgc3RhdGlzdGljcyBhZnRlciByZWFkIGNvdW50ZXIuIFNvIHB1dCBhZnRlciBOSUNVcGRhdGVSYXdDb3VudGVycyAqLwogCQlPUklCQVRpbWVyVGltZW91dChwQWQpOwogCi0JCS8vIFRoZSB0aW1lIHBlcmlvZCBmb3IgY2hlY2tpbmcgYW50ZW5uYSBpcyBhY2NvcmRpbmcgdG8gdHJhZmZpYwotCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKQotCQl7Ci0JCQlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJCS8qIGlmIE1HTVQgUklORyBpcyBmdWxsIG1vcmUgdGhhbiB0d2ljZSB3aXRoaW4gMSBzZWNvbmQsIHdlIGNvbnNpZGVyIHRoZXJlJ3MgKi8KKwkJLyogYSBoYXJkd2FyZSBwcm9ibGVtIHN0dWNraW5nIHRoZSBUWCBwYXRoLiBJbiB0aGlzIGNhc2UsIHRyeSBhIGhhcmR3YXJlIHJlc2V0ICovCisJCS8qIHRvIHJlY292ZXIgdGhlIHN5c3RlbSAqLworCQkvKiAgICAgIGlmIChwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID49IDIpICovCisJCS8qICAgICAgICAgICAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUik7ICovCisJCS8qICAgICAgZWxzZSAqLworCQkvKiAgICAgICAgICAgICAgcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA9IDA7ICovCiAKLQkJCS8vIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljCi0JCQlpZiAoVHhUb3RhbENudCA+IDUwKQotCQkJewotCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwID09IDApCi0JCQkJewotCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAzID09IDApCi0JCQkJewotCQkJCQlBc2ljRXZhbHVhdGVSeEFudChwQWQpOworCQkvKiBUaGUgdGltZSBwZXJpb2QgZm9yIGNoZWNraW5nIGFudGVubmEgaXMgYWNjb3JkaW5nIHRvIHRyYWZmaWMgKi8KKwkJeworCQkJaWYgKHBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjaykgeworCQkJCVR4VG90YWxDbnQgPQorCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJCS8qIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljICovCisJCQkJaWYgKFR4VG90YWxDbnQgPiA1MCkgeworCQkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJQorCQkJCQkgICAgMTAgPT0gMCkgeworCQkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDMgPT0KKwkJCQkJICAgIDApIHsKKwkJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTk5OSwzODIgKzg3OSw0MCBAQAogCQlNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhwQWQpOwogCiAJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpICYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQotI2VuZGlmCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKQorCQkJICAgICYmIChwQWQtPmJQQ0ljbGtPZmYgPT0gRkFMU0UpKQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCQkJewotCQkJCS8vIFdoZW4gQWRob2MgYmVhY29uIGlzIGVuYWJsZWQgYW5kIFJUUy9DVFMgaXMgZW5hYmxlZCwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBoYXJkd2FyZSBNQUMgRlNNIHdpbGwgcnVuIGludG8gYSBkZWFkbG9jawotCQkJCS8vIGFuZCBzZW5kaW5nIENUUy10by1zZWxmIG92ZXIgYW5kIG92ZXIuCi0JCQkJLy8gU29mdHdhcmUgUGF0Y2ggU29sdXRpb246Ci0JCQkJLy8gMS4gUG9sbGluZyBkZWJ1ZyBzdGF0ZSByZWdpc3RlciAweDEwRjQgZXZlcnkgb25lIHNlY29uZC4KLQkJCQkvLyAyLiBJZiBpbiAweDEwRjQgdGhlICgoYml0Mjk9PTEpICYmIChiaXQ3PT0xKSkgT1IgKChiaXQyOT09MSkgJiYgKGJpdDU9PTEpKSwgaXQgbWVhbnMgdGhlIGRlYWRsb2NrIGhhcyBvY2N1cnJlZC4KLQkJCQkvLyAzLiBJZiB0aGUgZGVhZGxvY2sgb2NjdXJyZWQsIHJlc2V0IE1BQy9CQlAgYnkgc2V0dGluZyAweDEwMDQgdG8gMHgwMDAxIGZvciBhIHdoaWxlIHRoZW4gc2V0dGluZyBpdCBiYWNrIHRvIDB4MDAwQyBhZ2Fpbi4KKwkJCQkvKiBXaGVuIEFkaG9jIGJlYWNvbiBpcyBlbmFibGVkIGFuZCBSVFMvQ1RTIGlzIGVuYWJsZWQsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgaGFyZHdhcmUgTUFDIEZTTSB3aWxsIHJ1biBpbnRvIGEgZGVhZGxvY2sgKi8KKwkJCQkvKiBhbmQgc2VuZGluZyBDVFMtdG8tc2VsZiBvdmVyIGFuZCBvdmVyLiAqLworCQkJCS8qIFNvZnR3YXJlIFBhdGNoIFNvbHV0aW9uOiAqLworCQkJCS8qIDEuIFBvbGxpbmcgZGVidWcgc3RhdGUgcmVnaXN0ZXIgMHgxMEY0IGV2ZXJ5IG9uZSBzZWNvbmQuICovCisJCQkJLyogMi4gSWYgaW4gMHgxMEY0IHRoZSAoKGJpdDI5PT0xKSAmJiAoYml0Nz09MSkpIE9SICgoYml0Mjk9PTEpICYmIChiaXQ1PT0xKSksIGl0IG1lYW5zIHRoZSBkZWFkbG9jayBoYXMgb2NjdXJyZWQuICovCisJCQkJLyogMy4gSWYgdGhlIGRlYWRsb2NrIG9jY3VycmVkLCByZXNldCBNQUMvQkJQIGJ5IHNldHRpbmcgMHgxMDA0IHRvIDB4MDAwMSBmb3IgYSB3aGlsZSB0aGVuIHNldHRpbmcgaXQgYmFjayB0byAweDAwMEMgYWdhaW4uICovCiAKLQkJCQlVSU5UMzIJTWFjUmVnID0gMDsKKwkJCQl1MzIgTWFjUmVnID0gMDsKIAogCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMEY0LCAmTWFjUmVnKTsKLQkJCQlpZiAoKChNYWNSZWcgJiAweDIwMDAwMDAwKSAmJiAoTWFjUmVnICYgMHg4MCkpIHx8ICgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4MjApKSkKLQkJCQl7CisJCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKQorCQkJCSAgICB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApCisJCQkJCSYmIChNYWNSZWcgJiAweDIwKSkpIHsKIAkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOwogCQkJCQlSVE1QdXNlY0RlbGF5KDEpOwogCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Qyk7CiAKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIldhcm5pbmcsIE1BQyBzcGVjaWZpYyBjb25kaXRpb24gb2NjdXJzIFxuIikpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCQkJICgiV2FybmluZywgTUFDIHNwZWNpZmljIGNvbmRpdGlvbiBvY2N1cnMgXG4iKSk7CiAJCQkJfQogCQkJfQogCQl9CiAKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwogCX0KIAogCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBGQUxTRTsKIH0KIAotVk9JRCBTVEFNbG1lUGVyaW9kaWNFeGVjKAotCVBSVE1QX0FEQVBURVIgcEFkKQotewotI2lmZGVmIFJUMjg2MAotCVVMT05HCQkJICAgIFR4VG90YWxDbnQ7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlVTE9ORwlUeFRvdGFsQ250OwotCWludCAJaTsKLSNlbmRpZgotCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotICAgIHsKLSAgICAJLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcwotICAgIAlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgJiYgKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQotICAgIAkJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBGQUxTRTsKLSAgICB9Ci0KLSNpZmRlZiBSVDI4NjAKLQkvL0Jhcm9uIDIwMDgvMDcvMTAKLQkvL3ByaW50aygiQmFyb25fVGVzdDpcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkvL0lmIHRoZSBTVEEgc2VjdXJpdHkgc2V0dGluZyBpcyBPUEVOIG9yIFdFUCwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMC4KLQkvL0lmIHRoZSBTVEEgc2VjdXJpdHkgc2V0dGluZyBpcyBXUEFQU0sgb3IgV1BBMlBTSywgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gMS4KLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXM8MikKLQl7Ci0JCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICBpZiAoKHBBZC0+UHJlTWVkaWFTdGF0ZSAhPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSkKLQl7Ci0JCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLQkJewotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0JCXBBZC0+UHJlTWVkaWFTdGF0ZSA9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlOwotCX0KLQotI2lmZGVmIFJUMjg2MAotCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKElETEVfT04ocEFkKSkgJiYKLSAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkgJiYKLQkJKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU1lOQ19JRExFKSAmJgotCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCi0JCShSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpICYmCi0JCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCi0JewotCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFLCAwKTsKLQl9Ci0jZW5kaWYKLQotCi0KLSAgIAlBc2ljU3RhQmJwVHVuaW5nKHBBZCk7Ci0KLQlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JewotCQkvLyB1cGRhdGUgY2hhbm5lbCBxdWFsaXR5IGZvciBSb2FtaW5nIGFuZCBVSSBMaW5rUXVhbGl0eSBkaXNwbGF5Ci0JCU1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShwQWQsIHBBZC0+TWxtZS5Ob3czMik7Ci0JfQotCi0JLy8gbXVzdCBiZSBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpIGJlY2F1c2UgaXQgbmVlZHMgdG8ga25vdyBpZgotCS8vIFJhZGlvIGlzIGN1cnJlbnRseSBpbiBub2lzeSBlbnZpcm9ubWVudAotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQkJQXNpY0FkanVzdFR4UG93ZXIocEFkKTsKLQotCWlmIChJTkZSQV9PTihwQWQpKQotCXsKLQkJLy8gSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8KLQkJLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uCi0JCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJTWxtZUNoZWNrUHNtQ2hhbmdlKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQgPSBUeFRvdGFsQ250OwotCi0JCWlmICgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIDEqT1NfSFogPCBwQWQtPk1sbWUuTm93MzIpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCi0JCQkoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPCA2MDApKSkKLQkJewotCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7Ci0JCX0KLQotICAgICAgICB7Ci0gICAgCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQotICAgIAkJewotICAgIAkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCi0gICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDIwKSA9PSA4KQotICAgIAkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7Ci0gICAgCQl9Ci0gICAgCQllbHNlCi0gICAgCQl7Ci0gICAgCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCi0gICAgCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDEwKSA9PSA4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQotICAgIAkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0JCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgRkFMU0UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAJCX0KLSAgICAgICAgfQotCi0JCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQotCQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOwotCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFJlcG9ydEZsYWcgPSBUUlVFOwotCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUExpbmtEb3duVGltZSA9IHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWU7Ci0KLQkJCS8vIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudAotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLSAgICAgICAgICAgIH0KLQotCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQl9Ci0JCWVsc2UgaWYgKENRSV9JU19CQUQocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5KSkKLQkJewotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gQmFkIENRSS4gQXV0byBSZWNvdmVyeSBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQpKTsKLQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJfQotCi0JCS8vIEFkZCBhdXRvIHNlYW1sZXNzIHJvYW1pbmcKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykKLQkJewotCQkJU0hPUlQJZEJtVG9Sb2FtID0gKFNIT1JUKXBBZC0+U3RhQ2ZnLmRCbVRvUm9hbTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnNzaT0lZCwgZEJtVG9Sb2FtPSVkXG4iLCBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpLCAoQ0hBUilkQm1Ub1JvYW0pKTsKLQotCQkJaWYgKFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMikgPD0gKENIQVIpZEJtVG9Sb2FtKQotCQkJewotCQkJCU1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKHBBZCwgcEFkLT5NbG1lLk5vdzMyKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCXsKLSNpZmRlZiBSVDI4NjAKLQkJLy8gMjAwMy0wNC0xNyBqb2huLiB0aGlzIGlzIGEgcGF0Y2ggdGhhdCBkcml2ZXIgZm9yY2VzIGEgQkVBQ09OIG91dCBpZiBBU0lDIGZhaWxzCi0JCS8vIHRoZSAiVFggQkVBQ09OIGNvbXBldGl0aW9uIiBmb3IgdGhlIGVudGlyZSBwYXN0IDEgc2VjLgotCQkvLyBTbyB0aGF0IGV2ZW4gd2hlbiBBU0lDJ3MgQkVBQ09OZ2VuIGVuZ2luZSBiZWVuIGJsb2NrZWQKLQkJLy8gYnkgcGVlcidzIEJFQUNPTiBkdWUgdG8gc2xvd2VyIHN5c3RlbSBjbG9jaywgdGhpcyBTVEEgc3RpbGwgY2FuIHNlbmQgb3V0Ci0JCS8vIG1pbmltdW0gQkVBQ09OIHRvIHRlbGwgdGhlIHBlZXIgSSdtIGFsaXZlLgotCQkvLyBkcmF3YmFjayBpcyB0aGF0IHRoaXMgQkVBQ09OIHdvbid0IGJlIHdlbGwgYWxpZ25lZCBhdCBUQlRUIGJvdW5kYXJ5LgotCQkvLyBFbnF1ZXVlQmVhY29uRnJhbWUocEFkKTsJCQkgIC8vIHNvZnR3YXJlIHNlbmQgQkVBQ09OCi0KLQkJLy8gaWYgYWxsIDExYiBwZWVycyBsZWF2ZSB0aGlzIEJTUyBtb3JlIHRoYW4gNSBzZWNvbmRzLCB1cGRhdGUgVHggcmF0ZSwKLQkJLy8gcmVzdG9yZSBvdXRnb2luZyBCRUFDT04gdG8gc3VwcG9ydCBCL0ctbWl4ZWQgbW9kZQotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCQkJICAgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkJICAgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5NYXhEZXNpcmVkUmF0ZSA+IFJBVEVfMTEpICAmJgotCQkJKChwQWQtPlN0YUNmZy5MYXN0MTFiQmVhY29uUnhUaW1lICsgNSpPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMTFCIHBlZXIgbGVmdCwgdXBkYXRlIFR4IHJhdGVzXG4iKSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKLQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIDApOwotCQkJTWFrZUlic3NCZWFjb24ocEFkKTsJCS8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CS8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKLQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBGQUxTRTsKLQkJfQotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCXsKLQkJCWlmICgocEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCkgJiYKLQkJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QxMWdCZWFjb25SeFRpbWUgKyA1ICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMTFHIHBlZXIgbGVmdFxuIikpOwotCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgPSBGQUxTRTsKLQkJCX0KLQotCQkJaWYgKChwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCkgJiYKLQkJCQkoKHBBZC0+U3RhQ2ZnLkxhc3QyME5CZWFjb25SeFRpbWUgKyA1ICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGxhc3QgMjBNSHogTiBwZWVyIGxlZnRcbiIpKTsKLQkJCQlwQWQtPlN0YUNmZy5BZGhvYzIwTkpvaW5lZCA9IEZBTFNFOwotCQkJfQotCQl9Ci0jZW5kaWYgLyogUlQyODYwICovCi0KLQkJLy9yYWRhciBkZXRlY3QKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCXsKLQkJCVJhZGFyRGV0ZWN0UGVyaW9kaWMocEFkKTsKLQkJfQotCi0JCS8vIElmIGFsbCBwZWVycyBsZWF2ZSwgYW5kIHRoaXMgU1RBIGJlY29tZXMgdGhlIGxhc3Qgb25lIGluIHRoaXMgSUJTUywgdGhlbiBjaGFuZ2UgTWVkaWFTdGF0ZQotCQkvLyB0byBESVNDT05ORUNURUQuIEJ1dCBzdGlsbCBob2xkaW5nIHRoaXMgSUJTUyAoaS5lLiBzZW5kaW5nIEJFQUNPTikgc28gdGhhdCBvdGhlciBTVEFzIGNhbgotCQkvLyBqb2luIGxhdGVyLgotCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FIDwgcEFkLT5NbG1lLk5vdzMyKSAmJgotCQkJT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQl7Ci0JCQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIGV4Y2Vzc2l2ZSBCRUFDT04gbG9zdCwgbGFzdCBTVEEgaW4gdGhpcyBJQlNTLCBNZWRpYVN0YXRlPURpc2Nvbm5lY3RlZFxuIikpOwotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLQkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7Ci0JCX0KLQotI2lmZGVmIFJUMjg3MAotCQlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQkJewotCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQotCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSA9PSBGQUxTRSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUgPCBwQWQtPk1sbWUuTm93MzIpCi0JCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOwotCQl9Ci0jZW5kaWYKLQl9Ci0JZWxzZSAvLyBubyBJTkZSQSBub3IgQURIT0MgY29ubmVjdGlvbgotCXsKLQotCQlpZiAocEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSAmJgotICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAzMCAqIE9TX0haKSA+IHBBZC0+TWxtZS5Ob3czMikpCi0JCQlnb3RvIFNLSVBfQVVUT19TQ0FOX0NPTk47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpCi0JCQkmJiBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApCi0JCQkmJiAoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCi0JCXsKLQkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yPT0wKSAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpKQotCQkJewotCQkJCU1MTUVfU0NBTl9SRVFfU1RSVUNUCSAgIFNjYW5SZXE7Ci0KLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSArIDEwICogT1NfSFopIDwgcEFkLT5NbG1lLk5vdzMyKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7Ci0JCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOwotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCQkJCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKLQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCX0KLQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykJLy8gUXVpdCB0aGUgZm9yZXZlciBzY2FuIHdoZW4gaW4gYSB2ZXJ5IGNsZWFuIHJvb20KLQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCQl7Ci0JCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApCi0JCQkJewotCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKLQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotU0tJUF9BVVRPX1NDQU5fQ09OTjoKLQotICAgIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwICE9MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKQotCXsKLQkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IFRSVUU7Ci0JCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0JfQotCWVsc2UgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgPT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkKLQl7Ci0JCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBGQUxTRTsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOwotCX0KLQotCXJldHVybjsKLX0KLQotLy8gTGluayBkb3duIHJlcG9ydAotVk9JRCBMaW5rRG93bkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCi0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lQXV0b1NjYW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCi0JCQkJCTAsCi0JCQkJCU5VTEwpOwotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JfQotfQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQotCi0JLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSAmJgotCQkoTWxtZVZhbGlkYXRlU1NJRChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpCi0JewotCQlORElTXzgwMl8xMV9TU0lEIE9pZFNzaWQ7Ci0JCU9pZFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbjsKLQkJTmRpc01vdmVNZW1vcnkoT2lkU3NpZC5Tc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwKLQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQkJCU9JRF84MDJfMTFfU1NJRCwKLQkJCQkJc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAotCQkJCQkmT2lkU3NpZCk7Ci0JCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci19Ci0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKQEAgLTEzODMsMzggKzkyMSwzMSBAQAogCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCgKLQlJTiBQVUNIQVIJcFNzaWQsCi0JSU4gVUNIQVIJU3NpZExlbikKK0JPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCh1OCAqcFNzaWQsIHU4IFNzaWRMZW4pCiB7Ci0JaW50CWluZGV4OworCWludCBpbmRleDsKIAogCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQogCQlyZXR1cm4gKEZBTFNFKTsKIAotCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKLQl7CisJLyogQ2hlY2sgZWFjaCBjaGFyYWN0ZXIgdmFsdWUgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTc2lkTGVuOyBpbmRleCsrKSB7CiAJCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQogCQkJcmV0dXJuIChGQUxTRSk7CiAJfQogCi0JLy8gQWxsIGNoZWNrZWQKKwkvKiBBbGwgY2hlY2tlZCAqLwogCXJldHVybiAoVFJVRSk7CiB9CiAKLVZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAotCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAotCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCkKK3ZvaWQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgIHU4ICoqIHBwVGFibGUsCisJCQkgICB1OCAqcFRhYmxlU2l6ZSwgdTggKnBJbml0VHhSYXRlSWR4KQogewotCWRvCi0JewotCQkvLyBkZWNpZGUgdGhlIHJhdGUgdGFibGUgZm9yIHR1bmluZwotCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlVGFibGVTaXplID4gMCkKLQkJeworCWRvIHsKKwkJLyogZGVjaWRlIHRoZSByYXRlIHRhYmxlIGZvciB0dW5pbmcgKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZVRhYmxlU2l6ZSA+IDApIHsKIAkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlOwogCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGVbMF07CiAJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGVbMV07CkBAIC0xNDIyLDg0ICs5NTMsNDAgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKLSNpZmRlZiBSVDI4NjAKLQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCT25seUpvaW5lZCAmJgotCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkICYmCi0JCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkJKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQkocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQotI2VuZGlmCi0JCQl7Ly8gMTFOIDFTIEFkaG9jCisJCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkgeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKSB7CS8qIDExTiAxUyBBZGhvYyAqLwogCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CiAJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKIAkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKIAotCQkJfQotCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYKLSNpZmRlZiBSVDI4NjAKLQkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgJiYKLQkJCQkJIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKLQkJCQkJKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkJCShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweGZmKSAmJgotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJgotI2VuZGlmCi0JCQkJCShwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQkJey8vIDExTiAyUyBBZGhvYwotCQkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQkJeworCQkJfSBlbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHhmZikgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpIHsJLyogMTFOIDJTIEFkaG9jICovCisJCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJCX0gZWxzZSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOworCQkJCQkqcFRhYmxlU2l6ZSA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKIAkJCQl9CiAKLQkJCX0KLQkJCWVsc2UKLSNpZmRlZiBSVDI4NjAKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQkJeworCQkJfSBlbHNlIGlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCisJCQkJICAgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKQorCQkJCSAgICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKKwkJCSAgICApIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKIAkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKIAkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJbMV07CiAKLQkJCX0KLQkgICAgICAgIGVsc2UgaWYoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkgJiYgKHBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPT0gVFJVRSkpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSA0KQotCQkJCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKLQkJCQkJKQotI2VuZGlmCi0JCQl7Ci0JCQkJLy8gVVNlIEIgVGFibGUgd2hlbiBPbmx5IGItb25seSBTdGF0aW9uIGluIG15IElCU1MgLgotCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwotCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKLQotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJeworCQkJfSBlbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7CiAJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHWzBdOwogCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CiAKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CiAJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07CiAJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwpAQCAtMTUwNyw5MSArOTk0LDgyIEBACiAJCQl9CiAJCQlicmVhazsKIAkJfQotCi0JCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDEyKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCQkoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQotCQl7Ly8gMTFCR04gMVMgQVAKKwkJLyppZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKi8KKwkJLyogICAgICAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkgKi8KKwkJaWYgKCgocEVudHJ5LT5SYXRlTGVuID09IDEyKSB8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkgewkvKiAxMUJHTiAxUyBBUCAqLwogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTOwogCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzBdOwogCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1sxXTsKIAogCQkJYnJlYWs7CiAJCX0KLQotCQlpZiAoKHBFbnRyeS0+UmF0ZUxlbiA9PSAxMikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCi0JCXsvLyAxMUJHTiAyUyBBUAotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gMTIpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAweGZmKSAmJiAqLworCQkvKiAgICAgIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkgKi8KKwkJaWYgKCgocEVudHJ5LT5SYXRlTGVuID09IDEyKSB8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpIHsJLyogMTFCR04gMlMgQVAgKi8KKwkJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7CiAJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOwogCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07CiAKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQ7CiAJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kWzFdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFsxXTsKIAogCQkJfQogCQkJYnJlYWs7CiAJCX0KLQotCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKQotCQl7Ly8gMTFOIDFTIEFQCisJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKSAqLworCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpKSB7CS8qIDExTiAxUyBBUCAqLwogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKIAkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07CiAJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4xU1sxXTsKIAogCQkJYnJlYWs7CiAJCX0KLQotCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKLQkJey8vIDExTiAyUyBBUAotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7Ci0JCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07Ci0gICAgICAgICAgICB9Ci0JCQllbHNlCi0JCQl7CisJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkgKi8KKwkJaWYgKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpIHsJLyogMTFOIDJTIEFQICovCisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSB7CisJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKKwkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOworCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzFdOworCQkJfSBlbHNlIHsKIAkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQ7CiAJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07CisJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKIAkJCX0KIAogCQkJYnJlYWs7CiAJCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCi0JCWlmIChwRW50cnktPlJhdGVMZW4gPT0gNCkKLQkJey8vIEIgb25seSBBUAorCQkvKmVsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpICovCisJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQgfHwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorCQkgICAgLypJdmVyc29uIG1hcmsgZm9yIEFkaG9jIGIgbW9kZSxzdGEgd2lsbCB1c2UgcmF0ZSA1NCAgTWJwcyB3aGVuIGNvbm5lY3Qgd2l0aCBzdGEgYi9nL24gbW9kZSAqLworCQkgICAgLyogJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApICovCisJCSAgICApIHsJCS8qIEIgb25seSBBUCAqLwogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7CiAJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQlsxXTsKIAogCQkJYnJlYWs7CiAJCX0KLQotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA+IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCisJCS8qZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkgKi8KIAkJaWYgKChwRW50cnktPlJhdGVMZW4gPiA4KQotCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCi0JCQkpCi0JCXsvLyBCL0cgIG1peGVkIEFQCisJCSAgICAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApCisJCSAgICAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisJCSAgICApIHsJCS8qIEIvRyAgbWl4ZWQgQVAgKi8KIAkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCRzsKIAkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CiAKIAkJCWJyZWFrOwogCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKKwkJLyplbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiArIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPT0gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkgKi8KIAkJaWYgKChwRW50cnktPlJhdGVMZW4gPT0gOCkKLQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQotCQkJKQotCQl7Ly8gRyBvbmx5IEFQCisJCSAgICAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApCisJCSAgICAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCisJCSAgICApIHsJCS8qIEcgb25seSBBUCAqLwogCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7CiAJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKIAkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKQEAgLTE2MDAsNzAgKzEwNzgsNDk2IEBACiAJCX0KIAogCQl7Ci0JCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCi0JCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQotCQkJewkvLyBMZWdhY3kgbW9kZQotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkKLQkJCQl7CisJCQkvKmVsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpICovCisJCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKSB7CS8qIExlZ2FjeSBtb2RlICovCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA8PSBSQVRFXzExKSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKIAkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+IFJBVEVfMTEpKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiBSQVRFXzExKQorCQkJCQkgICAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID4KKwkJCQkJICAgICAgIFJBVEVfMTEpKSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFHOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKIAkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwogCi0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KLQotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKLQkJCQl7CisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSB7CisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4xUzsKIAkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4xU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDFTIEFQIFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07CisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkJCSAgICAgKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKKwkJCQl9IGVsc2UgewogCQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTOwogCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMlMgQVAgXG4iKSk7CisJCQkJCSpwSW5pdFR4UmF0ZUlkeCA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU1sxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICAgICAoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKLQkJCQl7CisJCQl9IGVsc2UgeworCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSB7CiAJCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7CiAJCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQkJKnBJbml0VHhSYXRlSWR4ID0KKwkJCQkJICAgIFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJCQkgICAgICgiRFJTOiB1bmtvd24gbW9kZSxkZWZhdWx0IHVzZSAxMU4gMVMgQVAgXG4iKSk7CisJCQkJfSBlbHNlIHsKIAkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOworCQkJCQkqcFRhYmxlU2l6ZSA9CisJCQkJCSAgICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOworCQkJCQkqcEluaXRUeFJhdGVJZHggPQorCQkJCQkgICAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFsxXTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICAgICAoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOwogCQkJCX0KIAkJCX0KLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiRFJTOiB1bmtvd24gbW9kZSAoU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgTUNTU2V0WzBdPTB4JXgsIE1DU1NldFsxXT0weCV4KVxuIiwKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0pKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiRFJTOiB1bmtvd24gbW9kZSAoU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZCwgTUNTU2V0WzBdPTB4JXgsIE1DU1NldFsxXT0weCV4KVxuIiwKKwkJCQkgICAgICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAorCQkJCSAgICAgIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCisJCQkJICAgICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sCisJCQkJICAgICAgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby4KKwkJCQkgICAgICBNQ1NTZXRbMV0pKTsKIAkJfQotCX0gd2hpbGUoRkFMU0UpOworCX0gd2hpbGUgKEZBTFNFKTsKK30KKwordm9pZCBTVEFNbG1lUGVyaW9kaWNFeGVjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwl1bnNpZ25lZCBsb25nIFR4VG90YWxDbnQ7CisJaW50IGk7CisKKwkvKgorCSAgIFdlIHJldHVybiBoZXJlIGluIEFURSBtb2RlLCBiZWNhdXNlIHRoZSBzdGF0aXN0aWNzCisJICAgdGhhdCBBVEUgbmVlZCBhcmUgbm90IGNvbGxlY3RlZCB2aWEgdGhpcyByb3V0aW5lLgorCSAqLworI2lmIGRlZmluZWQoUlQzMDV4KXx8ZGVmaW5lZChSVDMwNzApCisJLyogcmVxdWVzdCBieSBHYXJ5LCBpZiBSc3NpMCA+IC00MiwgQkJQIDgyIG5lZWQgdG8gYmUgY2hhbmdlZCBmcm9tIDB4NjIgdG8gMHg0MiwgLCBiYnAgNjcgbmVlZCB0byBiZSBjaGFuZ2VkIGZyb20gMHgyMCB0byAweDE4ICovCisJaWYgKCFwQWQtPkNvbW1vbkNmZy5IaWdoUG93ZXJQYXRjaERpc2FibGVkKSB7CisjaWZkZWYgUlQzMDcwCisJCWlmICgoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpCisjZW5kaWYgLyogUlQzMDcwIC8vICovCisJCXsKKwkJCWlmICgocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCAhPSAwKQorCQkJICAgICYmIChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwID4KKwkJCQkocEFkLT5CYnBSc3NpVG9EYm1EZWx0YSAtIDM1KSkpIHsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4MjApOworCQkJfSBlbHNlIHsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4MjMpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisjaWZkZWYgUENJRV9QU19TVVBQT1JUCisvKiBkb24ndCBwZXJmb3JtIGlkbGUtcG93ZXItc2F2ZSBtZWNoYW5pc20gd2l0aGluIDMgbWluIGFmdGVyIGRyaXZlciBpbml0aWFsaXphdGlvbi4gKi8KKy8qIFRoaXMgY2FuIG1ha2UgcmVib290ZXIgdGVzdCBtb3JlIHJvYnVzdCAqLworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZCkpCisJCSAgICAmJiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTWU5DX0lETEUpCisJCSAgICAmJiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCisJCSAgICAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKSB7CisJCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09CisJCQkJICAgIFRSVUUpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCIlc1xuIiwgX19mdW5jX18pKTsKKwkJCQkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwKKwkJCQkJCQkgICAgICBHVUlfSURMRV9QT1dFUl9TQVZFLAorCQkJCQkJCSAgICAgIDApOworCQkJCX0gZWxzZSB7CisJCQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwKKwkJCQkJCQkgICAgIFBvd2VyU2FmZUNJRCwgMHhmZiwKKwkJCQkJCQkgICAgIDB4Mik7CisJCQkJCS8qIFdhaXQgY29tbWFuZCBzdWNjZXNzICovCisJCQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJTYWZlQ0lEKTsKKwkJCQkJUlRNUF9TRVRfRkxBRyhwQWQsCisJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJQU00gLSBydDMweHggSXNzdWUgU2xlZXAgY29tbWFuZClcbiIpKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID4gMTgwKSB7CisJCQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PQorCQkJCSAgICBUUlVFKSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiJXNcbiIsIF9fZnVuY19fKSk7CisJCQkJCVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsCisJCQkJCQkJICAgICAgR1VJX0lETEVfUE9XRVJfU0FWRSwKKwkJCQkJCQkgICAgICAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsCisJCQkJCQkJICAgICBQb3dlclNhZmVDSUQsIDB4ZmYsCisJCQkJCQkJICAgICAweDAyKTsKKwkJCQkJLyogV2FpdCBjb21tYW5kIHN1Y2Nlc3MgKi8KKwkJCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOworCQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwKKwkJCQkJCSAgICAgIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlBTTSAtICBydDI4eHggSXNzdWUgU2xlZXAgY29tbWFuZClcbiIpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJTVEFNbG1lUGVyaW9kaWNFeGVjIE1NQ0hLIC0gQ29tbW9uQ2ZnLlNzaWRbJWRdPSVjJWMlYyVjLi4uIE1sbWVBdXguU3NpZFslZF09JWMlYyVjJWMuLi5cbiIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZFswXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRbMV0sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkWzJdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZFszXSwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZFswXSwgcEFkLT5NbG1lQXV4LlNzaWRbMV0sCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZFsyXSwgcEFkLT5NbG1lQXV4LlNzaWRbM10pKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKworCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkgeworCQkvKiBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzICovCisJCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJgorCQkgICAgUlRNUF9USU1FX0FGVEVSKHBBZC0+TWxtZS5Ob3czMiwKKwkJCQkgICAgcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArCisJCQkJICAgICg2MCAqIE9TX0haKSkpCisJCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOworCX0KKworCWlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKSB7CisJCWlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkgeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktVUF9FVkVOVF9GTEFHLAorCQkJCQkgICAgICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgICBBZGRyLCBCU1MwLCAwKTsKKwkJfQorCQlwQWQtPlByZU1lZGlhU3RhdGUgPSBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZTsKKwl9CisKKwlpZiAocEFkLT5Db21tb25DZmcuUFNQWGxpbmsgJiYgQURIT0NfT04ocEFkKSkgeworCX0gZWxzZSB7CisJCUFzaWNTdGFCYnBUdW5pbmcocEFkKTsKKwl9CisKKwlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKKwkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisKKwlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCS8qIHVwZGF0ZSBjaGFubmVsIHF1YWxpdHkgZm9yIFJvYW1pbmcgYW5kIFVJIExpbmtRdWFsaXR5IGRpc3BsYXkgKi8KKwkJTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KHBBZCwgTlVMTCwgcEFkLT5NbG1lLk5vdzMyKTsKKwl9CisJLyogbXVzdCBiZSBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpIGJlY2F1c2UgaXQgbmVlZHMgdG8ga25vdyBpZiAqLworCS8qIFJhZGlvIGlzIGN1cnJlbnRseSBpbiBub2lzeSBlbnZpcm9ubWVudCAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJQXNpY0FkanVzdFR4UG93ZXIocEFkKTsKKworCWlmIChJTkZSQV9PTihwQWQpKSB7CisKKwkJLyogSXMgUFNNIGJpdCBjb25zaXN0ZW50IHdpdGggdXNlciBwb3dlciBtYW5hZ2VtZW50IHBvbGljeT8gKi8KKwkJLyogVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGF0IHdpbGwgc2V0IFBTTSBiaXQgT04uICovCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKKwkJCU1sbWVDaGVja1BzbUNoYW5nZShwQWQsIHBBZC0+TWxtZS5Ob3czMik7CisKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID0gVHhUb3RhbENudDsKKworCQlpZiAoKFJUTVBfVElNRV9BRlRFUgorCQkgICAgIChwQWQtPk1sbWUuTm93MzIsCisJCSAgICAgIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyAoMSAqIE9TX0haKSkpCisJCSAgICAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQorCQkgICAgJiYKKwkJICAgICgoKFR4VG90YWxDbnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQpIDwKKwkJICAgICAgNjAwKSkpIHsKKwkJCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTUNISyAtIE5vIEJFQUNPTi4gcmVzdG9yZSBSNjYgdG8gdGhlIGxvdyBib3VuZCglZCkgXG4iLAorCQkJCSAgKDB4MkUgKyBHRVRfTE5BX0dBSU4ocEFkKSkpKTsKKwkJfQorCQkvKmlmICgocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmICovCisJCS8qICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKSAqLworCQl7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCQkgICAgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpIHsKKwkJCQkvKiBXaGVuIEFQU0QgaXMgZW5hYmxlZCwgdGhlIHBlcmlvZCBjaGFuZ2VzIGFzIDIwIHNlYyAqLworCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAyMCkgPT0gOCkKKwkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLAorCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuVHhSYXRlLAorCQkJCQkJCSAgVFJVRSk7CisJCQl9IGVsc2UgeworCQkJCS8qIFNlbmQgb3V0IGEgTlVMTCBmcmFtZSBldmVyeSAxMCBzZWMgdG8gaW5mb3JtIEFQIHRoYXQgU1RBIGlzIHN0aWxsIGFsaXZlIChBdm9pZCBiZWluZyBhZ2Ugb3V0KSAqLworCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAxMCkgPT0gOCkgeworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCisJCQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsCisJCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkJICBDb21tb25DZmcuCisJCQkJCQkJCSAgVHhSYXRlLCBUUlVFKTsKKwkJCQkJZWxzZQorCQkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLAorCQkJCQkJCQkgIHBBZC0+CisJCQkJCQkJCSAgQ29tbW9uQ2ZnLgorCQkJCQkJCQkgIFR4UmF0ZSwKKwkJCQkJCQkJICBGQUxTRSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKENRSV9JU19ERUFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1NQ0hLIC0gTm8gQkVBQ09OLiBEZWFkIENRSS4gQXV0byBSZWNvdmVyeSBhdHRlbXB0ICMlbGRcbiIsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7CisKKwkJCS8qIExvc3QgQVAsIHNlbmQgZGlzY29ubmVjdCAmIGxpbmsgZG93biBldmVudCAqLworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CisKKwkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwKKwkJCQkJCTApOworCisJCQkvKiBSVE1QUGF0Y2hNYWNCYnBCdWcocEFkKTsgKi8KKwkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKKwkJfSBlbHNlIGlmIChDUUlfSVNfQkFEKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSkpIHsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQrKzsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIk1NQ0hLIC0gQmFkIENRSS4gQXV0byBSZWNvdmVyeSBhdHRlbXB0ICMlbGRcbiIsCisJCQkJICBwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50KSk7CisJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCX0KKworCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nKSB7CisJCQlCT09MRUFOIHJ2ID0gRkFMU0U7CisJCQljaGFyIGRCbVRvUm9hbSA9IHBBZC0+U3RhQ2ZnLmRCbVRvUm9hbTsKKwkJCWNoYXIgTWF4UnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuCisJCQkJCQkgICBMYXN0UnNzaTAsCisJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLgorCQkJCQkJICAgTGFzdFJzc2kxLAorCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS4KKwkJCQkJCSAgIExhc3RSc3NpMik7CisKKwkJCS8qIFNjYW5uaW5nLCBpZ25vcmUgUm9hbWluZyAqLworCQkJaWYgKCFSVE1QX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpCisJCQkgICAgJiYgKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU1lOQ19JRExFKQorCQkJICAgICYmIChNYXhSc3NpIDw9IGRCbVRvUm9hbSkpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUnNzaT0lZCwgZEJtVG9Sb2FtPSVkXG4iLCBNYXhSc3NpLAorCQkJCQkgIChjaGFyKWRCbVRvUm9hbSkpOworCisJCQkJLyogQWRkIGF1dG8gc2VhbWxlc3Mgcm9hbWluZyAqLworCQkJCWlmIChydiA9PSBGQUxTRSkKKwkJCQkJcnYgPSBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyhwQWQpOworCisJCQkJaWYgKHJ2ID09IEZBTFNFKSB7CisJCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsKKwkJCQkJICAgICAxMCAqIE9TX0haKSA8IHBBZC0+TWxtZS5Ob3czMikgeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiTU1DSEsgLSBSb2FtaW5nLCBObyBlbGlnYWJsZSBlbnRyeSwgdHJ5IG5ldyBzY2FuIVxuIikpOworCQkJCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDI7CisJCQkJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPQorCQkJCQkJICAgIHBBZC0+TWxtZS5Ob3czMjsKKwkJCQkJCU1sbWVBdXRvU2NhbihwQWQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIGlmIChBREhPQ19PTihwQWQpKSB7CisJCS8qIElmIGFsbCBwZWVycyBsZWF2ZSwgYW5kIHRoaXMgU1RBIGJlY29tZXMgdGhlIGxhc3Qgb25lIGluIHRoaXMgSUJTUywgdGhlbiBjaGFuZ2UgTWVkaWFTdGF0ZSAqLworCQkvKiB0byBESVNDT05ORUNURUQuIEJ1dCBzdGlsbCBob2xkaW5nIHRoaXMgSUJTUyAoaS5lLiBzZW5kaW5nIEJFQUNPTikgc28gdGhhdCBvdGhlciBTVEFzIGNhbiAqLworCQkvKiBqb2luIGxhdGVyLiAqLworCQlpZiAoUlRNUF9USU1FX0FGVEVSCisJCSAgICAocEFkLT5NbG1lLk5vdzMyLAorCQkgICAgIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19CRUFDT05fTE9TVF9USU1FKQorCQkgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwKKwkJCQkJICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSBTdGFydFJlcTsKKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTU1DSEsgLSBleGNlc3NpdmUgQkVBQ09OIGxvc3QsIGxhc3QgU1RBIGluIHRoaXMgSUJTUywgTWVkaWFTdGF0ZT1EaXNjb25uZWN0ZWRcbiIpKTsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCisJCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLAorCQkJCSAgICAgIChjaGFyICopIHBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCSAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEpLCAmU3RhcnRSZXEpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKKwkJfQorCisJCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKworCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSA9PSBGQUxTRSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKFJUTVBfVElNRV9BRlRFUgorCQkJICAgIChwQWQtPk1sbWUuTm93MzIsCisJCQkgICAgIHBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUpKQorCQkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFpZCwKKwkJCQkJCSAgICBwRW50cnktPkFkZHIpOworCQl9CisJfSBlbHNlCQkJLyogbm8gSU5GUkEgbm9yIEFESE9DIGNvbm5lY3Rpb24gKi8KKwl7CisKKwkJaWYgKHBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgJiYKKwkJICAgIFJUTVBfVElNRV9CRUZPUkUocEFkLT5NbG1lLk5vdzMyLAorCQkJCSAgICAgcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgKDMwICogT1NfSFopKSkKKwkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKKwkJZWxzZQorCQkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOworCisJCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKKwkJICAgICYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKKwkJICAgICYmCisJCSAgICAoTWxtZVZhbGlkYXRlU1NJRAorCQkgICAgIChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsCisJCSAgICAgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpIHsKKwkJCWlmICgocEFkLT5TY2FuVGFiLkJzc05yID09IDApCisJCQkgICAgJiYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSkgeworCQkJCXN0cnVjdCBydF9tbG1lX3NjYW5fcmVxIFNjYW5SZXE7CisKKwkJCQlpZiAoUlRNUF9USU1FX0FGVEVSCisJCQkJICAgIChwQWQtPk1sbWUuTm93MzIsCisJCQkJICAgICBwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAoMTAgKiBPU19IWikpKSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJICBBdXRvUmVjb25uZWN0U3NpZCkpOworCQkJCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwKKwkJCQkJCSAgICAgKGNoYXIgKilwQWQtPk1sbWVBdXguCisJCQkJCQkgICAgIEF1dG9SZWNvbm5lY3RTc2lkLAorCQkJCQkJICAgICBwQWQtPk1sbWVBdXguCisJCQkJCQkgICAgIEF1dG9SZWNvbm5lY3RTc2lkTGVuLAorCQkJCQkJICAgICBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLAorCQkJCQkJICAgIE1UMl9NTE1FX1NDQU5fUkVRLAorCQkJCQkJICAgIHNpemVvZgorCQkJCQkJICAgIChzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSksCisJCQkJCQkgICAgJlNjYW5SZXEpOworCQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkJICAgIENOVExfV0FJVF9PSURfTElTVF9TQ0FOOworCQkJCQkvKiBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIgKi8KKwkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0KKwkJCQkJICAgIHBBZC0+TWxtZS5Ob3czMjsKKwkJCQl9IGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQkvKiBRdWl0IHRoZSBmb3JldmVyIHNjYW4gd2hlbiBpbiBhIHZlcnkgY2xlYW4gcm9vbSAqLworCQkJCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7CisJCQl9IGVsc2UgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSB7CisJCQkJaWYgKChwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCAlIDcpID09IDApIHsKKwkJCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJCQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9CisJCQkJCSAgICBwQWQtPk1sbWUuTm93MzI7CisJCQkJfSBlbHNlIHsKKwkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworU0tJUF9BVVRPX1NDQU5fQ09OTjoKKworCWlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwICE9IDApCisJICAgICYmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID09IEZBTFNFKSkgeworCQlwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uID0gVFJVRTsKKwkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwKKwkJCQkgIEZBTFNFKTsKKwl9IGVsc2UgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgPT0gMCkKKwkJICAgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gVFJVRSkpIHsKKwkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IEZBTFNFOworCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJICBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJICBPcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIExpbmsgZG93biByZXBvcnQgKi8KK3ZvaWQgTGlua0Rvd25FeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisKKwlpZiAocEFkICE9IE5VTEwpIHsKKwkJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc2Fzc29jUmVxOworCisJCWlmICgocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSAmJgorCQkgICAgKElORlJBX09OKHBBZCkpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJMaW5rRG93bkV4ZWMoKTogZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwKKwkJCQkJIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwKKwkJCQkgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwKKwkJCQkgICAgJkRpc2Fzc29jUmVxKTsKKwkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CisKKwkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOworCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKKwkJfQorCX0KK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVBdXRvU2NhbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJLyogY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QgKi8KKwlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBEcml2ZXIgYXV0byBzY2FuXG4iKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwKKwkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCSAgICBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTiwKKwkJCSAgICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4sCisJCQkgICAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKTsKKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9Cit9CisKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpZiAocEFkLT5TdGFDZmcuYkF1dG9Db25uZWN0QnlCc3NpZCkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkRyaXZlciBhdXRvIHJlY29ubmVjdCB0byBsYXN0IE9JRF84MDJfMTFfQlNTSUQgc2V0dGluZyAtICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkJICBwQWQtPk1sbWVBdXguQnNzaWRbMF0sIHBBZC0+TWxtZUF1eC5Cc3NpZFsxXSwKKwkJCSAgcEFkLT5NbG1lQXV4LkJzc2lkWzJdLCBwQWQtPk1sbWVBdXguQnNzaWRbM10sCisJCQkgIHBBZC0+TWxtZUF1eC5Cc3NpZFs0XSwgcEFkLT5NbG1lQXV4LkJzc2lkWzVdKSk7CisKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkgICAgT0lEXzgwMl8xMV9CU1NJRCwgTUFDX0FERFJfTEVOLCBwQWQtPk1sbWVBdXguQnNzaWQpOworCisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisKKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9CisJLyogY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QgKi8KKwllbHNlIGlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCisJCSAoTWxtZVZhbGlkYXRlU1NJRAorCQkgIChwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsCisJCSAgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbikgPT0gVFJVRSkpIHsKKwkJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgT2lkU3NpZDsKKwkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOworCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJCSAgICAgICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9TU0lEIHNldHRpbmcgLSAlcywgbGVuIC0gJWRcbiIsCisJCQkgIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwKKwkJCSAgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE9JRF84MDJfMTFfU1NJRCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQpLCAmT2lkU3NpZCk7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CisJfQogfQogCiAvKgpAQCAtMTY3OCw0NyArMTU4Miw1MCBAQAogCU91dHB1dDoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcJTm93MzIpCit2b2lkIE1sbWVDaGVja0ZvclJvYW1pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE5vdzMyKQogewotCVVTSE9SVAkgICBpOwotCUJTU19UQUJMRSAgKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOwotCUJTU19FTlRSWSAgKnBCc3M7CisJdTE2IGk7CisJc3RydWN0IHJ0X2Jzc190YWJsZSAqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7CisJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzczsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBNbG1lQ2hlY2tGb3JSb2FtaW5nXG4iKSk7Ci0JLy8gcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyCisJLyogcHV0IGFsbCByb2FtaW5nIGNhbmRpZGF0ZXMgaW50byBSb2FtVGFiLCBhbmQgc29ydCBpbiBSU1NJIG9yZGVyICovCiAJQnNzVGFibGVJbml0KHBSb2FtVGFiKTsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykgewogCQlwQnNzID0gJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKIAotCQlpZiAoKHBCc3MtPkxhc3RCZWFjb25SeFRpbWUgKyBCRUFDT05fTE9TVF9USU1FKSA8IE5vdzMyKQotCQkJY29udGludWU7CSAvLyBBUCBkaXNhcHBlYXIKKwkJaWYgKChwQnNzLT5MYXN0QmVhY29uUnhUaW1lICsgcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWUpIDwKKwkJICAgIE5vdzMyKQorCQkJY29udGludWU7CS8qIEFQIGRpc2FwcGVhciAqLwogCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKLQkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgorCQkJY29udGludWU7CS8qIFJTU0kgdG9vIHdlYWsuIGZvcmdldCBpdC4gKi8KIAkJaWYgKE1BQ19BRERSX0VRVUFMKHBCc3MtPkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkpCi0JCQljb250aW51ZTsJIC8vIHNraXAgY3VycmVudCBBUAotCQlpZiAocEJzcy0+UnNzaSA8IChwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCArIFJTU0lfREVMVEEpKQotCQkJY29udGludWU7CSAvLyBvbmx5IEFQIHdpdGggc3Ryb25nZXIgUlNTSSBpcyBlbGlnaWJsZSBmb3Igcm9hbWluZworCQkJY29udGludWU7CS8qIHNraXAgY3VycmVudCBBUCAqLworCQlpZiAocEJzcy0+UnNzaSA8CisJCSAgICAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgKyBSU1NJX0RFTFRBKSkKKwkJCWNvbnRpbnVlOwkvKiBvbmx5IEFQIHdpdGggc3Ryb25nZXIgUlNTSSBpcyBlbGlnaWJsZSBmb3Igcm9hbWluZyAqLwogCi0JCS8vIEFQIHBhc3NpbmcgYWxsIGFib3ZlIHJ1bGVzIGlzIHB1dCBpbnRvIHJvYW1pbmcgY2FuZGlkYXRlIHRhYmxlCi0JCU5kaXNNb3ZlTWVtb3J5KCZwUm9hbVRhYi0+QnNzRW50cnlbcFJvYW1UYWItPkJzc05yXSwgcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkvKiBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZSAqLworCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJcFJvYW1UYWItPkJzc05yICs9IDE7CiAJfQogCi0JaWYgKHBSb2FtVGFiLT5Cc3NOciA+IDApCi0JewotCQkvLyBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdAotCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCArKzsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZyBhdHRlbXB0ICMlbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOwotCQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKSB7CisJCS8qIGNoZWNrIENudGxNYWNoaW5lLkN1cnJTdGF0ZSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBORElTIFNldE9JRCByZXF1ZXN0ICovCisJCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgeworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50Kys7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLAorCQkJCSAgcEFkLT5SYWxpbmtDb3VudGVycy5Qb29yQ1FJUm9hbWluZ0NvdW50KSk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJCSAgICBNVDJfTUxNRV9ST0FNSU5HX1JFUSwgMCwgTlVMTCk7CisJCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwogCQl9CiAJfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBNbG1lQ2hlY2tGb3JSb2FtaW5nKCMgb2YgY2FuZGlkYXRlPSAlZClcbiIscFJvYW1UYWItPkJzc05yKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PSBNbG1lQ2hlY2tGb3JSb2FtaW5nKCMgb2YgY2FuZGlkYXRlPSAlZClcbiIsCisJCSAgcFJvYW1UYWItPkJzc05yKSk7CiB9CiAKIC8qCkBAIC0xNzMzLDE1OSArMTY0MCw3NCBAQAogCU91dHB1dDoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVMT05HCQkJTm93KQorQk9PTEVBTiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVVNIT1JUCQlpOwotCUJTU19UQUJMRQkqcFJvYW1UYWIgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWI7Ci0JQlNTX0VOVFJZCSpwQnNzOworCXUxNiBpOworCXN0cnVjdCBydF9ic3NfdGFibGUgKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOworCXN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3M7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmdcbiIpKTsKLQkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKKwkvKiBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIgKi8KIAlCc3NUYWJsZUluaXQocFJvYW1UYWIpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKSB7CiAJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwogCi0gICAgICAgIGlmICgocEJzcy0+UnNzaSA8PSAtNTApICYmIChwQnNzLT5DaGFubmVsID09IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCisJCWlmICgocEJzcy0+UnNzaSA8PSAtNTApCisJCSAgICAmJiAocEJzcy0+Q2hhbm5lbCA9PSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKKwkJCWNvbnRpbnVlOwkvKiBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuICovCiAJCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQotCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKLQkJaWYgKCFTU0lEX0VRVUFMKHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQotCQkJY29udGludWU7CSAvLyBza2lwIGRpZmZlcmVudCBTU0lECi0gICAgICAgIGlmIChwQnNzLT5Sc3NpIDwgKFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMikgKyBSU1NJX0RFTFRBKSkKLQkJCWNvbnRpbnVlOwkgLy8gc2tpcCBBUCB3aXRob3V0IGJldHRlciBSU1NJCisJCQljb250aW51ZTsJLyogc2tpcCBjdXJyZW50IEFQICovCisJCWlmICghU1NJRF9FUVVBTAorCQkgICAgKHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCSAgICAgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCisJCQljb250aW51ZTsJLyogc2tpcCBkaWZmZXJlbnQgU1NJRCAqLworCQlpZiAocEJzcy0+UnNzaSA8CisJCSAgICAoUlRNUE1heFJzc2kKKwkJICAgICAocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwKKwkJICAgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsCisJCSAgICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSArIFJTU0lfREVMVEEpKQorCQkJY29udGludWU7CS8qIHNraXAgQVAgd2l0aG91dCBiZXR0ZXIgUlNTSSAqLwogCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxhc3RSc3NpMCA9ICVkLCBwQnNzLT5Sc3NpID0gJWRcbiIsIFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksIHBCc3MtPlJzc2kpKTsKLQkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKLQkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTGFzdFJzc2kwID0gJWQsIHBCc3MtPlJzc2kgPSAlZFxuIiwKKwkJCSAgUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwKKwkJCQkgICAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwKKwkJCQkgICAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiksCisJCQkgIHBCc3MtPlJzc2kpKTsKKwkJLyogQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUgKi8KKwkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CiAJCXBSb2FtVGFiLT5Cc3NOciArPSAxOwogCX0KIAotCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQotCXsKLQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKLQkJCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJfQotCX0KLQkvLyBNYXliZSBzaXRlIHN1cnZleSByZXF1aXJlZAotCWVsc2UKLQl7Ci0JCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiAxMDAwKSA8IE5vdykKLQkJewotCQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZywgTm8gZWxpZ2FibGUgZW50cnksIHRyeSBuZXcgc2NhbiFcbiIpKTsKLQkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAyOwotCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwotCQkJTWxtZUF1dG9TY2FuKHBBZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIjw9PSBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyAoQnNzTnI9JWQpXG4iLCBwUm9hbVRhYi0+QnNzTnIpKTsKKwlpZiAocFJvYW1UYWItPkJzc05yID4gMCkgeworCQkvKiBjaGVjayBDbnRsTWFjaGluZS5DdXJyU3RhdGUgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggTkRJUyBTZXRPSUQgcmVxdWVzdCAqLworCQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpIHsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCsrOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTU1DSEsgLSBSb2FtaW5nIGF0dGVtcHQgIyVsZFxuIiwKKwkJCQkgIHBBZC0+UmFsaW5rQ291bnRlcnMuUG9vckNRSVJvYW1pbmdDb3VudCkpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkgICAgTVQyX01MTUVfUk9BTUlOR19SRVEsIDAsIE5VTEwpOworCQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKKwkJCXJldHVybiBUUlVFOwogCQl9CiAJfQogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOworCXJldHVybiBGQUxTRTsKIH0KIAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyBUeFBFUiwgUnhQRVIgb2YgdGhlIHBhc3QgTi1zZWMgcGVyaW9kLiBBbmQKLQkJYWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQsIENoYW5uZWxRdWFsaXR5IGlzIGNhbGN1bGF0ZWQgaGVyZQotCQl0byBkZWNpZGUgaWYgY3VycmVudCBBUCBpcyBzdGlsbCBkb2luZyB0aGUgam9iLgotCi0JCUlmIENoYW5uZWxRdWFsaXR5IGlzIG5vdCBnb29kLCBhIFJPQU1pbmcgYXR0ZW1wdCBtYXkgYmUgdHJpZWQgbGF0ZXIuCi0JT3V0cHV0OgotCQlTdGFDZmcuQ2hhbm5lbFF1YWxpdHkgLSAwLi4xMDAKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTk9URTogVGhpcyByb3V0aW5lIGRlY2lkZSBjaGFubmxlIHF1YWxpdHkgYmFzZWQgb24gUlggQ1JDIGVycm9yIHJhdGlvLgotCQlDYWxsZXIgc2hvdWxkIG1ha2Ugc3VyZSBhIGZ1bmN0aW9uIGNhbGwgdG8gTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKQotCQlpcyBwZXJmb3JtZWQgcmlnaHQgYmVmb3JlIHRoaXMgcm91dGluZSwgc28gdGhhdCB0aGlzIHJvdXRpbmUgY2FuIGRlY2lkZQotCQljaGFubmVsIHF1YWxpdHkgYmFzZWQgb24gdGhlIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIE5vdzMyKQordm9pZCBNbG1lU2V0VHhSYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqIHBUeFJhdGUpCiB7Ci0JVUxPTkcgVHhPa0NudCwgVHhDbnQsIFR4UEVSLCBUeFBSUjsKLQlVTE9ORyBSeENudCwgUnhQRVI7Ci0JVUNIQVIgTm9yUnNzaTsKLQlDSEFSICBNYXhSc3NpOwotCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKLQotCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOwotCi0JLy8KLQkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKLQkvLwotCVR4T2tDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVR4Q250ID0gVHhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0JaWYgKFR4Q250IDwgNSkKLQl7Ci0JCVR4UEVSID0gMDsKLQkJVHhQUlIgPSAwOwotCX0KLQllbHNlCi0JewotCQlUeFBFUiA9IChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICogMTAwKSAvIFR4Q250OwotCQlUeFBSUiA9ICgoVHhDbnQgLSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OwotCX0KLQotCS8vCi0JLy8gY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlCi0JLy8KLQlSeENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQ7Ci0JaWYgKFJ4Q250IDwgNSkKLQkJUnhQRVIgPSAwOwotCWVsc2UKLQkJUnhQRVIgPSAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKLQotCS8vCi0JLy8gZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUgotCS8vCi0JaWYgKElORlJBX09OKHBBZCkgJiYKLQkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA8IDIpICYmIC8vIG5vIGhlYXZ5IHRyYWZmaWMKLQkJKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSA8IE5vdzMyKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKLQkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTm9ybWFsaXplIFJzc2kKLQkJaWYgKE1heFJzc2kgPiAtNDApCi0JCQlOb3JSc3NpID0gMTAwOwotCQllbHNlIGlmIChNYXhSc3NpIDwgLTkwKQotCQkJTm9yUnNzaSA9IDA7Ci0JCWVsc2UKLQkJCU5vclJzc2kgPSAoTWF4UnNzaSArIDkwKSAqIDI7Ci0KLQkJLy8gQ2hhbm5lbFF1YWxpdHkgPSBXMSpSU1NJICsgVzIqVHhQUlIgKyBXMypSeFBFUgkgKFJTU0kgMC4uMTAwKSwgKFR4UEVSIDEwMC4uMCksIChSeFBFUiAxMDAuLjApCi0JCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9IChSU1NJX1dFSUdIVElORyAqIE5vclJzc2kgKwotCQkJCQkJCQkgICBUWF9XRUlHSFRJTkcgKiAoMTAwIC0gVHhQUlIpICsKLQkJCQkJCQkJICAgUlhfV0VJR0hUSU5HKiAoMTAwIC0gUnhQRVIpKSAvIDEwMDsKLQkJaWYgKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA+PSAxMDApCi0JCQlwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgPSAxMDA7Ci0JfQotCi19Ci0KLVZPSUQgTWxtZVNldFR4UmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpCi17Ci0JVUNIQVIJTWF4TW9kZSA9IE1PREVfT0ZETTsKKwl1OCBNYXhNb2RlID0gTU9ERV9PRkRNOwogCiAJTWF4TW9kZSA9IE1PREVfSFRHUkVFTkZJRUxEOwogCi0JaWYgKHBUeFJhdGUtPlNUQkMgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKKwlpZiAocFR4UmF0ZS0+U1RCQyAmJiAocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMpCisJICAgICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQogCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfVVNFOwogCWVsc2UKIAkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CkBAIC0xODk2LDg3ICsxNzE4LDEwOSBAQAogCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID4gNykKIAkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CiAKLSAgIAlpZiAoQURIT0NfT04ocEFkKSkKLQl7Ci0JCS8vIElmIHBlZXIgYWRob2MgaXMgYi1vbmx5IG1vZGUsIHdlIGNhbid0IHNlbmQgMTFnIHJhdGUuCisJaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJLyogSWYgcGVlciBhZGhvYyBpcyBiLW9ubHkgbW9kZSwgd2UgY2FuJ3Qgc2VuZCAxMWcgcmF0ZS4gKi8KIAkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMJPSBTVEJDX05PTkU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CiAKLQkJLy8KLQkJLy8gRm9yIEFkaG9jIE1PREVfQ0NLLCBkcml2ZXIgd2lsbCB1c2UgQWRob2NCT25seUpvaW5lZCBmbGFnIHRvIHJvbGwgYmFjayB0byBCIG9ubHkgaWYgbmVjZXNzYXJ5Ci0JCS8vCi0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwVHhSYXRlLT5Nb2RlOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkvKiAqLworCQkvKiBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkgKi8KKwkJLyogKi8KKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBUeFJhdGUtPk1vZGU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPQorCQkgICAgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CiAKLQkJLy8gUGF0Y2ggc3BlZWQgZXJyb3IgaW4gc3RhdHVzIHBhZ2UKKwkJLyogUGF0Y2ggc3BlZWQgZXJyb3IgaW4gc3RhdHVzIHBhZ2UgKi8KIAkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWlmIChwVHhSYXRlLT5Nb2RlIDw9IE1heE1vZGUpCiAJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBUeFJhdGUtPk1vZGU7CiAKLQkJaWYgKHBUeFJhdGUtPlNob3J0R0kgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKSkKKwkJaWYgKHBUeFJhdGUtPlNob3J0R0kKKwkJICAgICYmIChwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSkpCiAJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzQwMDsKIAkJZWxzZQogCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7CiAKLQkJLy8gUmVleGFtIGVhY2ggYmFuZHdpZHRoJ3MgU0dJIHN1cHBvcnQuCi0JCWlmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9PSBHSV80MDApCi0JCXsKLQkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfMjApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKSkpCisJCS8qIFJlZXhhbSBlYWNoIGJhbmR3aWR0aCdzIFNHSSBzdXBwb3J0LiAqLworCQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPT0gR0lfNDAwKSB7CisJCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzIwKQorCQkJICAgICYmCisJCQkgICAgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRworCQkJICAgICAocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKSkpCiAJCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID09IEJXXzQwKSAmJiAoIUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSkpKQorCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV180MCkKKwkJCSAgICAmJgorCQkJICAgICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSkpKQogCQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwogCQl9CisJCS8qIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLiAqLworCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkpIHsKKwkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKSB7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywKKwkJCQkJCSAgQUxMTl9TRVRQUk9URUNULCBUUlVFLAorCQkJCQkJICAoQk9PTEVBTikgcEFkLT5NbG1lQXV4LgorCQkJCQkJICBBZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJCSAgTm9uR2ZQcmVzZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkJICBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLgorCQkJCQkJICBBZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwKKwkJCQkJCSAgQUxMTl9TRVRQUk9URUNULCBUUlVFLAorCQkJCQkJICAoQk9PTEVBTikgcEFkLT5NbG1lQXV4LgorCQkJCQkJICBBZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkJCSAgTm9uR2ZQcmVzZW50KTsKKwkJCX0KKwkJfSBlbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpCisJCQkgICAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSkgeworCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pIHsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLAorCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkJICBOb25HZlByZXNlbnQpOworCQkJfSBlbHNlIHsKKwkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCQkgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uCisJCQkJCQkgIEFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLAorCQkJCQkJICBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIChCT09MRUFOKSBwQWQtPk1sbWVBdXguCisJCQkJCQkgIEFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkJICBOb25HZlByZXNlbnQpOworCQkJfQorCQl9IGVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkKKwkJCSAgICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApKSB7CisJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULAorCQkJCQkgIFRSVUUsCisJCQkJCSAgKEJPT0xFQU4pIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uCisJCQkJCSAgQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwogCi0JCS8vIFR1cm4gUlRTL0NUUyByYXRlIHRvIDZNYnBzLgotCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSAwKSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSAwKSkKLQkJewotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDgpICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDgpKQotCQl7Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCWlmIChwQWQtPk1hY1RhYi5mQW55QkFTZXNzaW9uKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkpCi0JCXsKLQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCi0JCX0KLQkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSkKLQkJewotCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9SVFNDVFNfNk0sIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CisJCX0gZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KQorCQkJICAgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkpIHsKKwkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsCisJCQkJCSAgVFJVRSwKKwkJCQkJICAoQk9PTEVBTikgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby4KKwkJCQkJICBBZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7CiAJCX0KIAotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkM7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSAmJgotCQkgICAgcEFkLT5XSUZJdGVzdGJlZC5iR3JlZW5GaWVsZCkKLQkJICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKKwkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0KKwkJICAgIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCWlmICgocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpCisJCSAgICAmJiBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKQorCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOwogCX0KIAotCXBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOworCXBBZC0+TGFzdFR4UmF0ZSA9ICh1MTYpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOwogfQogCiAvKgpAQCAtMTk5Niw0NyArMTg0MCwzOSBAQAogCQljYWxsIHRoaXMgcm91dGluZSBldmVyeSBzZWNvbmQKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7Ci0JVUxPTkcJCQkJCWksIEFjY3VUeFRvdGFsQ250ID0gMCwgVHhUb3RhbENudDsKLQlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKLQlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7Ci0JUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKLQlQVUNIQVIJCQkJCXBUYWJsZTsKLQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKLQlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKLQlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKLQlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOwotCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7Ci0JVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKLQlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OworCXU4IFVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHg7CisJdW5zaWduZWQgbG9uZyBpLCBBY2N1VHhUb3RhbENudCA9IDAsIFR4VG90YWxDbnQ7CisJdW5zaWduZWQgbG9uZyBUeEVycm9yUmF0aW8gPSAwOworCUJPT0xFQU4gYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRSwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7CisJc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKnBDdXJyVHhSYXRlLCAqcE5leHRUeFJhdGUgPSBOVUxMOworCXU4ICpwVGFibGU7CisJdTggVGFibGVTaXplID0gMDsKKwl1OCBJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCWNoYXIgUnNzaSwgUnNzaU9mZnNldCA9IDA7CisJVFhfU1RBX0NOVDFfU1RSVUMgU3RhVHgxOworCVRYX1NUQV9DTlQwX1NUUlVDIFR4U3RhQ250MDsKKwl1bnNpZ25lZCBsb25nIFR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlICpwUnNzaSA9ICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlOwogCi0JLy8KLQkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5Ci0JLy8KLSAgIAlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7CisJLyogKi8KKwkvKiB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5ICovCisJLyogKi8KKwlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgewogCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKIAotCQkvLyBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseQorCQkvKiBjaGVjayBpZiB0aGlzIGVudHJ5IG5lZWQgdG8gc3dpdGNoIHJhdGUgYXV0b21hdGljYWxseSAqLwogCQlpZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBFbnRyeSkgPT0gRkFMU0UpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkgfHwgKHBFbnRyeS0+VmFsaWRBc0RscykpCi0JCXsKLSNpZmRlZiBSVDI4NjAKLQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIChDSEFSKXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsIChDSEFSKXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsIChDSEFSKXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCisJCWlmICgocEFkLT5NYWNUYWIuU2l6ZSA9PSAxKSB8fCAocEVudHJ5LT5WYWxpZEFzRGxzKSkgewogCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYKKwkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kwLAorCQkJCQkgICBwUnNzaS0+QXZnUnNzaTEsIHBSc3NpLT5BdmdSc3NpMik7CiAKLQkJCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgorCQkJLyogVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyICovCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKIAkJCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBUUlVFOwpAQCAtMjA0NSwyOTEgKzE4ODEsMjkzIEBACiAJCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKIAkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKIAotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPQorCQkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPQorCQkJICAgIFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOworCQkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9CisJCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwogCi0JCQkvLyBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsCi0JCQkvLyBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0Ci0JCQkvLyBDaGFyaW90IHRocm91Z2hwdXQgdGVzdAotCQkJQWNjdVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7CisJCQkvKiBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsICovCisJCQkvKiBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0ICovCisJCQkvKiBDaGFyaW90IHRocm91Z2hwdXQgdGVzdCAqLworCQkJQWNjdVR4VG90YWxDbnQgPQorCQkJICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCisJCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKIAogCQkJaWYgKFR4VG90YWxDbnQpCi0JCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKLQkJfQotCQllbHNlCi0JCXsKLSNpZmRlZiBSVDI4NjAKLQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIChDSEFSKXBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwgKENIQVIpcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLCAoQ0hBUilwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCisJCQkJVHhFcnJvclJhdGlvID0KKwkJCQkgICAgKChUeFJldHJhbnNtaXQgKworCQkJCSAgICAgIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OworCQl9IGVsc2UgewogCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCiAJCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTAsCisJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTEsCisJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTIpOwogCQkJZWxzZQogCQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwotI2VuZGlmCisJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTIpOwogCiAJCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7CisJCQkgICAgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkgICAgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKIAogCQkJaWYgKFR4VG90YWxDbnQpCi0JCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJCQlUeEVycm9yUmF0aW8gPQorCQkJCSAgICAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSAgICAgIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvCisJCQkJICAgIFR4VG90YWxDbnQ7CisJCX0KKworCQlpZiAoVHhUb3RhbENudCkgeworCQkJLyoKKwkJCSAgIFRocmVlIEFkSG9jIGNvbm5lY3Rpb25zIGNhbiBub3Qgd29yayBub3JtYWxseSBpZiBvbmUgQWRIb2MgY29ubmVjdGlvbiBpcyBkaXNhcHBlYXJlZCBmcm9tIGEgaGVhdnkgdHJhZmZpYyBlbnZpcm9ubWVudCBnZW5lcmF0ZWQgYnkgcGluZyB0b29sCisJCQkgICBXZSBmb3JjZSB0byBzZXQgTG9uZ1J0eUxpbWl0IGFuZCBTaG9ydFJ0eUxpbWl0IHRvIDAgdG8gc3RvcCByZXRyYW5zbWl0dGluZyBwYWNrZXQsIGFmdGVyIGEgd2hpbGUsIHJlc29yaW5nIG9yaWdpbmFsIHNldHRpbmdzCisJCQkgKi8KKwkJCWlmIChUeEVycm9yUmF0aW8gPT0gMTAwKSB7CisJCQkJVFhfUlRZX0NGR19TVFJVQyBUeFJ0eUNmZywgVHhSdHlDZmd0bXA7CisJCQkJdW5zaWduZWQgbG9uZyBJbmRleDsKKwkJCQl1bnNpZ25lZCBsb25nIE1BQ1ZhbHVlOworCisJCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFlfQ0ZHLCAmVHhSdHlDZmcud29yZCk7CisJCQkJVHhSdHlDZmd0bXAud29yZCA9IFR4UnR5Q2ZnLndvcmQ7CisJCQkJVHhSdHlDZmcuZmllbGQuTG9uZ1J0eUxpbWl0ID0gMHgwOworCQkJCVR4UnR5Q2ZnLmZpZWxkLlNob3J0UnR5TGltaXQgPSAweDA7CisJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRZX0NGRywgVHhSdHlDZmcud29yZCk7CisKKwkJCQlSVE1QdXNlY0RlbGF5KDEpOworCisJCQkJSW5kZXggPSAwOworCQkJCU1BQ1ZhbHVlID0gMDsKKwkJCQlkbyB7CisJCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwKKwkJCQkJCSAgICAgICAmTUFDVmFsdWUpOworCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmZmZmZmYpID09IDApCisJCQkJCQlicmVhazsKKwkJCQkJSW5kZXgrKzsKKwkJCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJCQl9IHdoaWxlICgoSW5kZXggPCAzMzApCisJCQkJCSAmJgorCQkJCQkgKCFSVE1QX1RFU1RfRkxBRworCQkJCQkgIChwQWQsCisJCQkJCSAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKTsKKworCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJlR4UnR5Q2ZnLndvcmQpOworCQkJCVR4UnR5Q2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9CisJCQkJICAgIFR4UnR5Q2ZndG1wLmZpZWxkLkxvbmdSdHlMaW1pdDsKKwkJCQlUeFJ0eUNmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0KKwkJCQkgICAgVHhSdHlDZmd0bXAuZmllbGQuU2hvcnRSdHlMaW1pdDsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCBUeFJ0eUNmZy53b3JkKTsKKwkJCX0KIAkJfQogCiAJCUN1cnJSYXRlSWR4ID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7CiAKLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmSW5pdFR4UmF0ZUlkeCk7CisJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwKKwkJCQkgICAgICAmSW5pdFR4UmF0ZUlkeCk7CiAKLQkJaWYgKEN1cnJSYXRlSWR4ID49IFRhYmxlU2l6ZSkKLQkJeworCQlpZiAoQ3VyclJhdGVJZHggPj0gVGFibGVTaXplKSB7CiAJCQlDdXJyUmF0ZUlkeCA9IFRhYmxlU2l6ZSAtIDE7CiAJCX0KLQotCQkvLyBXaGVuIHN3aXRjaCBmcm9tIEZpeGVkIHJhdGUgLT4gYXV0byByYXRlLCB0aGUgUkVBTCBUWCByYXRlIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4LgotCQkvLyBTbyBuZWVkIHRvIHN5bmMgaGVyZS4KLQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEN1cnJSYXRlSWR4KzEpKjVdOworCQkvKiBXaGVuIHN3aXRjaCBmcm9tIEZpeGVkIHJhdGUgLT4gYXV0byByYXRlLCB0aGUgUkVBTCBUWCByYXRlIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4LiAqLworCQkvKiBTbyBuZWVkIHRvIHN5bmMgaGVyZS4gKi8KKwkJcEN1cnJUeFJhdGUgPQorCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYgcFRhYmxlWyhDdXJyUmF0ZUlkeCArIDEpICogNV07CiAJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IHBDdXJyVHhSYXRlLT5DdXJyTUNTKQotCQkJLy8mJiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCSkKLQkJeworCQkgICAgLyomJiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkgKi8KKwkJICAgICkgewogCi0JCQkvLyBOZWVkIHRvIHN5bmMgUmVhbCBUeCByYXRlIGFuZCBvdXIgcmVjb3JkLgotCQkJLy8gVGhlbiByZXR1cm4gZm9yIG5leHQgRFJTLgotCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEluaXRUeFJhdGVJZHgrMSkqNV07CisJCQkvKiBOZWVkIHRvIHN5bmMgUmVhbCBUeCByYXRlIGFuZCBvdXIgcmVjb3JkLiAqLworCQkJLyogVGhlbiByZXR1cm4gZm9yIG5leHQgRFJTLiAqLworCQkJcEN1cnJUeFJhdGUgPQorCQkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmIHBUYWJsZVsoSW5pdFR4UmF0ZUlkeCArIDEpCisJCQkJCQkJICAgICogNV07CiAJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IEluaXRUeFJhdGVJZHg7CiAJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwQ3VyclR4UmF0ZSk7CiAKLQkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycworCQkJLyogcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzICovCiAJCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwogCQkJY29udGludWU7CiAJCX0KLQotCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55Ci0JCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQotCQl7CisJCS8qIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkgKi8KKwkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpIHsKIAkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKLQkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLTE7Ci0JCX0KLQkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkKLQkJeworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CisJCX0gZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwogCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCi0JCXsKKwkJfSBlbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpIHsKIAkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwogCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CiAJCX0KIAotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisJCXBDdXJyVHhSYXRlID0KKwkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmIHBUYWJsZVsoQ3VyclJhdGVJZHggKyAxKSAqIDVdOwogCi0JCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQotCQl7Ci0JCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7Ci0JCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7Ci0JCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkgeworCQkJVHJhaW5VcCA9CisJCQkgICAgKHBDdXJyVHhSYXRlLT5UcmFpblVwICsKKwkJCSAgICAgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKKwkJCVRyYWluRG93biA9CisJCQkgICAgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKworCQkJICAgICAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0gZWxzZSB7CisJCQlUcmFpblVwID0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24gPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOwogCQl9CiAKLQkJLy9wQWQtPkRyc0NvdW50ZXJzLkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0gcEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOworCQkvKnBBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247ICovCiAKLQkJLy8KLQkJLy8gS2VlcCB0aGUgbGFzdCB0aW1lIFR4UmF0ZUNoYW5nZUFjdGlvbiBzdGF0dXMuCi0JCS8vCi0JCXBFbnRyeS0+TGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPSBwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CisJCS8qICovCisJCS8qIEtlZXAgdGhlIGxhc3QgdGltZSBUeFJhdGVDaGFuZ2VBY3Rpb24gc3RhdHVzLiAqLworCQkvKiAqLworCQlwRW50cnktPkxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uID0KKwkJICAgIHBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsKIAorCQkvKiAqLworCQkvKiBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSSAqLworCQkvKiAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkgKi8KKwkJLyogKi8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTUpIHsKKwkJCWNoYXIgaWR4ID0gMDsKKwkJCXU4IFR4UmF0ZUlkeDsKKwkJCXU4IE1DUzAgPSAwLCBNQ1MxID0gMCwgTUNTMiA9IDAsIE1DUzMgPSAwLCBNQ1M0ID0KKwkJCSAgICAwLCBNQ1M1ID0gMCwgTUNTNiA9IDAsIE1DUzcgPSAwOworCQkJdTggTUNTMTIgPSAwLCBNQ1MxMyA9IDAsIE1DUzE0ID0gMCwgTUNTMTUgPSAwOworCQkJdTggTUNTMjAgPSAwLCBNQ1MyMSA9IDAsIE1DUzIyID0gMCwgTUNTMjMgPSAwOwkvKiAzKjMgKi8KIAorCQkJLyogY2hlY2sgdGhlIGV4aXN0ZW5jZSBhbmQgaW5kZXggb2YgZWFjaCBuZWVkZWQgTUNTICovCisJCQl3aGlsZSAoaWR4IDwgcFRhYmxlWzBdKSB7CisJCQkJcEN1cnJUeFJhdGUgPQorCQkJCSAgICAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgJiBwVGFibGVbKGlkeCArIDEpICoKKwkJCQkJCQkJICAgIDVdOwogCi0JCS8vCi0JCS8vIENBU0UgMS4gd2hlbiBUWCBzYW1wbGVzIGFyZSBmZXdlciB0aGFuIDE1LCB0aGVuIGRlY2lkZSBUWCByYXRlIHNvbGVseSBvbiBSU1NJCi0JCS8vICAgICAgICAgKGNyaXRlcmlhIGNvcGllZCBmcm9tIFJUMjUwMCBmb3IgTmV0b3BpYSBjYXNlKQotCQkvLwotCQlpZiAoVHhUb3RhbENudCA8PSAxNSkKLQkJewotCQkJQ0hBUglpZHggPSAwOwotCQkJVUNIQVIJVHhSYXRlSWR4OwotCQkJLy9VQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsIE1DUzcgPSAwLCBNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7Ci0JCQlVQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsICBNQ1M1ID0wLCBNQ1M2ID0gMCwgTUNTNyA9IDA7Ci0JICAgICAgICBVQ0hBUglNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7Ci0JCQlVQ0hBUglNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7IC8vIDMqMwotCi0JCQkvLyBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MKLQkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pCi0JCQl7Ci0JCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKGlkeCsxKSo1XTsKLQotCQkJCWlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMCkKLQkJCQl7CisJCQkJaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18wKSB7CiAJCQkJCU1DUzAgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xKSB7CiAJCQkJCU1DUzEgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yKSB7CiAJCQkJCU1DUzIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18zKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18zKSB7CiAJCQkJCU1DUzMgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU180KQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU180KSB7CiAJCQkJCU1DUzQgPSBpZHg7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNSkgeworCQkJCQlNQ1M1ID0gaWR4OworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzYpIHsKKwkJCQkJTUNTNiA9IGlkeDsKIAkJCQl9Ci0JICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzUpCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBNQ1M1ID0gaWR4OwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIE1DUzYgPSBpZHg7Ci0JICAgICAgICAgICAgfQotCQkJCS8vZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpCi0JCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy8gcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQKKwkJCQkvKmVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAqLworCQkJCWVsc2UgaWYgKChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNykgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8qIHByZXZlbnQgdGhlIGhpZ2hlc3QgTUNTIHVzaW5nIHNob3J0IEdJIHdoZW4gMVQgYW5kIGxvdyB0aHJvdWdocHV0ICovCiAJCQkJewogCQkJCQlNQ1M3ID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTIpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEyKSB7CiAJCQkJCU1DUzEyID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzEzKSB7CiAJCQkJCU1DUzEzID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTQpCi0JCQkJeworCQkJCX0gZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE0KSB7CiAJCQkJCU1DUzE0ID0gaWR4OwogCQkJCX0KLQkJCQllbHNlIGlmICgocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE1KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy93ZSBob3BlIHRvIHVzZSBTaG9ydEdJIGFzIGluaXRpYWwgcmF0ZSwgaG93ZXZlciBBdGhlcm9zJ3MgY2hpcCBoYXMgYnVncyB3aGVuIHNob3J0IEdJCisJCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8qd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUsIGhvd2V2ZXIgQXRoZXJvcydzIGNoaXAgaGFzIGJ1Z3Mgd2hlbiBzaG9ydCBHSSAqLwogCQkJCXsKIAkJCQkJTUNTMTUgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkgLy8gMyozCisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjApCS8qIDMqMyAqLwogCQkJCXsKIAkJCQkJTUNTMjAgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMSkKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjEpIHsKIAkJCQkJTUNTMjEgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjIpIHsKIAkJCQkJTUNTMjIgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMykKLQkJCQl7CisJCQkJfSBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjMpIHsKIAkJCQkJTUNTMjMgPSBpZHg7CiAJCQkJfQotCQkJCWlkeCArKzsKKwkJCQlpZHgrKzsKIAkJCX0KIAotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKLQkJCQl7CisJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSB7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpIHsKIAkJCQkJUnNzaU9mZnNldCA9IDI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJUnNzaU9mZnNldCA9IDU7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQotCQkJCXsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpIHsKIAkJCQkJUnNzaU9mZnNldCA9IDU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJUnNzaU9mZnNldCA9IDg7CiAJCQkJfQogCQkJfQogCi0JCQkvKmlmIChNQ1MxNSkqLwotCQkJaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04zUykgfHwKLQkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fAotCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKLQkJCXsvLyBOIG1vZGUgd2l0aCAzIHN0cmVhbSAvLyAzKjMKKwkJCS8qaWYgKE1DUzE1KSAqLworCQkJaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04zUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4zUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKSB7CS8qIE4gbW9kZSB3aXRoIDMgc3RyZWFtIC8vIDMqMyAqLwogCQkJCWlmIChNQ1MyMyAmJiAoUnNzaSA+PSAtNzApKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxNTsKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMjM7CiAJCQkJZWxzZSBpZiAoTUNTMjIgJiYgKFJzc2kgPj0gLTcyKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTQ7Ci0gICAgICAgIAkgICAgZWxzZSBpZiAoTUNTMjEgJiYgKFJzc2kgPj0gLTc2KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTM7CisJCQkJCVR4UmF0ZUlkeCA9IE1DUzIyOworCQkJCWVsc2UgaWYgKE1DUzIxICYmIChSc3NpID49IC03NikpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzIxOwogCQkJCWVsc2UgaWYgKE1DUzIwICYmIChSc3NpID49IC03OCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOwotCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAtODIpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCi0JCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gLTg2KSkKLQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAtODgpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzE7Ci0JCQllbHNlCi0JCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJfQotCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSkgLy8gMyozCi0JCQl7Ly8gTiBtb2RlIHdpdGggMiBzdHJlYW0KLQkJCQlpZiAoTUNTMTUgJiYgKFJzc2kgPj0gKC03MCtSc3NpT2Zmc2V0KSkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzIwOworCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPj0gLTgyKSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49IC04NCkpCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzM7CisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAtODYpKQorCQkJCQlUeFJhdGVJZHggPSBNQ1MyOworCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPj0gLTg4KSkKKwkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKKwkJCQllbHNlCisJCQkJCVR4UmF0ZUlkeCA9IE1DUzA7CisJCQl9CisvKiAgICAgICAgICAgICAgZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZCkgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUpKSAqLworCQkJZWxzZSBpZiAoKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZCkgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSkJLyogMyozICovCisJCQl7CS8qIE4gbW9kZSB3aXRoIDIgc3RyZWFtICovCisJCQkJaWYgKE1DUzE1ICYmIChSc3NpID49ICgtNzAgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzE1OwotCQkJCWVsc2UgaWYgKE1DUzE0ICYmIChSc3NpID49ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzE0ICYmIChSc3NpID49ICgtNzIgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OwotCQkJCWVsc2UgaWYgKE1DUzEzICYmIChSc3NpID49ICgtNzYrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzEzICYmIChSc3NpID49ICgtNzYgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzEzOwotCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzgrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzEyICYmIChSc3NpID49ICgtNzggKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzEyOwotCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPj0gKC04MitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAoLTgyICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPj0gKC04NCtSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAoLTg0ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gKC04NitSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+PSAoLTg2ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPj0gKC04OCtSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAoLTg4ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwogCQkJCWVsc2UKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQkJCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04xUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4xUykpCi0JCQl7Ly8gTiBtb2RlIHdpdGggMSBzdHJlYW0KLQkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+ICgtNzIrUnNzaU9mZnNldCkpKQorCQkJfSBlbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMVMpKSB7CS8qIE4gbW9kZSB3aXRoIDEgc3RyZWFtICovCisJCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAoLTcyICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1M3OwotCQkJCWVsc2UgaWYgKE1DUzYgJiYgKFJzc2kgPiAoLTc0K1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gKC03NCArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTNjsKLQkJCQllbHNlIGlmIChNQ1M1ICYmIChSc3NpID4gKC03NytSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+ICgtNzcgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzU7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+ICgtNzkrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAoLTc5ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzMgJiYgKFJzc2kgPiAoLTgxK1Jzc2lPZmZzZXQpKSkKKwkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gKC04MSArIFJzc2lPZmZzZXQpKSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gKC04MytSc3NpT2Zmc2V0KSkpCisJCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+ICgtODMgKyBSc3NpT2Zmc2V0KSkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+ICgtODYrUnNzaU9mZnNldCkpKQorCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAoLTg2ICsgUnNzaU9mZnNldCkpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1MxOwogCQkJCWVsc2UKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsvLyBMZWdhY3kgbW9kZQorCQkJfSBlbHNlIHsJLyogTGVnYWN5IG1vZGUgKi8KIAkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+IC03MCkpCiAJCQkJCVR4UmF0ZUlkeCA9IE1DUzc7CiAJCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+IC03NCkpCkBAIC0yMzM4LDcgKzIxNzYsNyBAQAogCQkJCQlUeFJhdGVJZHggPSBNQ1M1OwogCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAtODIpKQogCQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJCWVsc2UgaWYgKE1DUzQgPT0gMCkJLy8gZm9yIEItb25seSBtb2RlCisJCQkJZWxzZSBpZiAoTUNTNCA9PSAwKQkvKiBmb3IgQi1vbmx5IG1vZGUgKi8KIAkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKIAkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gLTg1KSkKIAkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKQEAgLTIzNTAsMTI5ICsyMTg4LDE1OCBAQAogCQkJCQlUeFJhdGVJZHggPSBNQ1MwOwogCQkJfQogCisJCQkvKiAgICAgICAgICAgICAgaWYgKFR4UmF0ZUlkeCAhPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCkgKi8KIAkJCXsKIAkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFR4UmF0ZUlkeDsKLQkJCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07CisJCQkJcE5leHRUeFJhdGUgPQorCQkJCSAgICAoc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKikgJgorCQkJCSAgICBwVGFibGVbKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ICsgMSkgKiA1XTsKIAkJCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwTmV4dFR4UmF0ZSk7CiAJCQl9CiAKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+UEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksCisJCQkJICAgICAgIHNpemVvZih1MTYpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwKKwkJCQkgICAgICAgc2l6ZW9mKHU4KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwogCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBUUlVFOwotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQkvKiByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMgKi8KIAkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CiAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKHBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID09IFRSVUUpCi0JCXsKKwkJaWYgKHBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID09IFRSVUUpIHsKIAkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gRkFMU0U7CiAJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAwOwotCQkJLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisJCQkvKiByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMgKi8KIAkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7CiAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZG8KLQkJewotCQkJQk9PTEVBTgliVHJhaW5VcERvd24gPSBGQUxTRTsKKwkJZG8geworCQkJQk9PTEVBTiBiVHJhaW5VcERvd24gPSBGQUxTRTsKIAotCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSArKzsKKwkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUrKzsKIAotCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKLQkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQotCQkJeworCQkJLyogZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQgKi8KKwkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSB7CiAJCQkJYlRyYWluVXBEb3duID0gVFJVRTsKLQkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCQlwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPQorCQkJCSAgICBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKIAkJCX0KLQkJCS8vIHVwZ3JhZGUgVFggcXVhbGl0eSBpZiBQRVIgPD0gUmF0ZS1VcCB0aHJlc2hvbGQKLQkJCWVsc2UgaWYgKFR4RXJyb3JSYXRpbyA8PSBUcmFpblVwKQotCQkJeworCQkJLyogdXBncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA8PSBSYXRlLVVwIHRocmVzaG9sZCAqLworCQkJZWxzZSBpZiAoVHhFcnJvclJhdGlvIDw9IFRyYWluVXApIHsKIAkJCQliVHJhaW5VcERvd24gPSBUUlVFOwogCQkJCWJVcGdyYWRlUXVhbGl0eSA9IFRSVUU7CiAJCQkJaWYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSkKLQkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdIC0tOyAgLy8gcXVhbGl0eSB2ZXJ5IGdvb2QgaW4gQ3VyclJhdGUKKwkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdLS07CS8qIHF1YWxpdHkgdmVyeSBnb29kIGluIEN1cnJSYXRlICovCiAKIAkJCQlpZiAocEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkpCi0JCQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5IC0tOworCQkJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eS0tOwogCQkJCWVsc2UgaWYgKHBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0pCi0JCQkJCXBFbnRyeS0+VHhRdWFsaXR5W1VwUmF0ZUlkeF0gLS07ICAgIC8vIG1heSBpbXByb3ZlIG5leHQgVVAgcmF0ZSdzIHF1YWxpdHkKKwkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XS0tOwkvKiBtYXkgaW1wcm92ZSBuZXh0IFVQIHJhdGUncyBxdWFsaXR5ICovCiAJCQl9CiAKLQkJCXBFbnRyeS0+UEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87CisJCQlwRW50cnktPlBFUltDdXJyUmF0ZUlkeF0gPSAodTgpVHhFcnJvclJhdGlvOwogCi0JCQlpZiAoYlRyYWluVXBEb3duKQotCQkJewotCQkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KLQkJCQlpZiAoKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID49IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EKSkKLQkJCQl7CisJCQlpZiAoYlRyYWluVXBEb3duKSB7CisJCQkJLyogcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLiAqLworCQkJCWlmICgoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpCisJCQkJICAgICYmIChwRW50cnktPlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPj0KKwkJCQkJRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQpKSB7CiAJCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIDw9IDApKQotCQkJCXsKKwkJCQl9IGVsc2UgaWYgKChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpCisJCQkJCSAgICYmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIDw9CisJCQkJCSAgICAgICAwKSkgewogCQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKIAkJCQl9CiAJCQl9CiAJCX0gd2hpbGUgKEZBTFNFKTsKIAotCQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcwotCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkKLQkJeworCQkvKiBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcyAqLworCQlpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPiBDdXJyUmF0ZUlkeCkgewogCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7CiAJCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7Ci0JCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAxOyAvLyByYXRlIFVQCi0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDE7CS8qIHJhdGUgVVAgKi8KKwkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeS0+VHhRdWFsaXR5LAorCQkJCSAgICAgICBzaXplb2YodTE2KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsCisJCQkJICAgICAgIHNpemVvZih1OCkqCisJCQkJICAgICAgIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKIAotCQkJLy8KLQkJCS8vIEZvciBUeFJhdGUgZmFzdCB0cmFpbiB1cAotCQkJLy8KLQkJCWlmICghcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nKQotCQkJewotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsIDEwMCk7CisJCQkvKiAqLworCQkJLyogRm9yIFR4UmF0ZSBmYXN0IHRyYWluIHVwICovCisJCQkvKiAqLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpIHsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLgorCQkJCQkgICAgIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLAorCQkJCQkgICAgIDEwMCk7CiAKLQkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJCXBBZC0+U3RhQ2ZnLgorCQkJCSAgICBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOwogCQkJfQogCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwogCQl9Ci0JCS8vIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeQotCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQotCQl7CisJCS8qIGlmIHJhdGUtZG93biBoYXBwZW4sIG9ubHkgY2xlYXIgRG93blJhdGUncyBiYWQgaGlzdG9yeSAqLworCQllbHNlIGlmIChwRW50cnktPkN1cnJUeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KSB7CiAJCQlwRW50cnktPkN1cnJUeFJhdGVTdGFibGVUaW1lID0gMDsKLQkJCXBFbnRyeS0+VHhSYXRlVXBQZW5hbHR5ID0gMDsgICAgICAgICAgIC8vIG5vIHBlbmFsdHkKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDI7IC8vIHJhdGUgRE9XTgorCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOwkvKiBubyBwZW5hbHR5ICovCisJCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAyOwkvKiByYXRlIERPV04gKi8KIAkJCXBFbnRyeS0+VHhRdWFsaXR5W3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7CiAJCQlwRW50cnktPlBFUltwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOwogCi0JCQkvLwotCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIGRvd24KLQkJCS8vCi0JCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKLQkJCXsKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOworCQkJLyogKi8KKwkJCS8qIEZvciBUeFJhdGUgZmFzdCB0cmFpbiBkb3duICovCisJCQkvKiAqLworCQkJaWYgKCFwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcpIHsKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLgorCQkJCQkgICAgIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLAorCQkJCQkgICAgIDEwMCk7CiAKLQkJCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOworCQkJCXBBZC0+U3RhQ2ZnLgorCQkJCSAgICBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBUUlVFOwogCQkJfQogCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMDsgLy8gcmF0ZSBubyBjaGFuZ2UKKwkJfSBlbHNlIHsKKwkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7CS8qIHJhdGUgbm8gY2hhbmdlICovCiAJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOwogCQl9CiAKIAkJcEVudHJ5LT5MYXN0VHhPa0NvdW50ID0gVHhTdWNjZXNzOwotCi0JCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwotCi0JCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwRW50cnktPkN1cnJUeFJhdGVJbmRleCsxKSo1XTsKLQkJaWYgKGJUeFJhdGVDaGFuZ2VkICYmIHBOZXh0VHhSYXRlKQogCQl7CisJCQl1OCB0bXBUeFJhdGU7CisKKwkJCS8qIHRvIGZpeCB0Y3AgYWNrIGlzc3VlICovCisJCQlpZiAoIWJUeFJhdGVDaGFuZ2VkCisJCQkgICAgJiYgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQgPgorCQkJCShwQWQtPlJhbGlua0NvdW50ZXJzLgorCQkJCSBPbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCAqIDUpKSkgeworCQkJCXRtcFR4UmF0ZSA9IERvd25SYXRlSWR4OworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIkRSUzogUngoJWQpIGlzIDUgdGltZXMgbGFyZ2VyIHRoYW4gVHgoJWQpLCB1c2UgbG93IHJhdGUgKGN1cnI9JWQsIHRtcD0lZClcbiIsCisJCQkJCSAgICAgIHBBZC0+UmFsaW5rQ291bnRlcnMuCisJCQkJCSAgICAgIE9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50LAorCQkJCQkgICAgICBwQWQtPlJhbGlua0NvdW50ZXJzLgorCQkJCQkgICAgICBPbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCwKKwkJCQkJICAgICAgcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgsCisJCQkJCSAgICAgIHRtcFR4UmF0ZSkpOworCQkJfSBlbHNlIHsKKwkJCQl0bXBUeFJhdGUgPSBwRW50cnktPkN1cnJUeFJhdGVJbmRleDsKKwkJCX0KKworCQkJcE5leHRUeFJhdGUgPQorCQkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmIHBUYWJsZVsodG1wVHhSYXRlICsgMSkgKgorCQkJCQkJCSAgICA1XTsKKwkJfQorCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpIHsKIAkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKIAkJfQorCQkvKiByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMgKi8KKwkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKIAl9CiB9CiAKQEAgLTI0OTIsMTAzICsyMzU5LDg0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwKKwkJCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlQUlRNUF9BREFQVEVSCQkJcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OwotCVVDSEFSCQkJCQlVcFJhdGVJZHggPSAwLCBEb3duUmF0ZUlkeCA9IDAsIEN1cnJSYXRlSWR4ID0gMDsKLQlVTE9ORwkJCQkJVHhUb3RhbENudDsKLQlVTE9ORwkJCQkJVHhFcnJvclJhdGlvID0gMDsKLSNpZmRlZiBSVDI4NjAKLQlCT09MRUFOCQkJCQliVHhSYXRlQ2hhbmdlZCA9IFRSVUU7IC8vLCBiVXBncmFkZVF1YWxpdHkgPSBGQUxTRTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7Ci0jZW5kaWYKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGUgPSBOVUxMOwotCVBVQ0hBUgkJCQkJcFRhYmxlOwotCVVDSEFSCQkJCQlUYWJsZVNpemUgPSAwOwotCVVDSEFSCQkJCQlJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOwotCVRYX1NUQV9DTlQxX1NUUlVDCQlTdGFUeDE7Ci0JVFhfU1RBX0NOVDBfU1RSVUMJCVR4U3RhQ250MDsKLQlDSEFSCQkJCQlSc3NpLCByYXRpbzsKLQlVTE9ORwkJCQkJVHhSZXRyYW5zbWl0ID0gMCwgVHhTdWNjZXNzID0gMCwgVHhGYWlsQ291bnQgPSAwOwotCU1BQ19UQUJMRV9FTlRSWQkJCSpwRW50cnk7Ci0JVUxPTkcJCQkJCWk7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJdTggVXBSYXRlSWR4ID0gMCwgRG93blJhdGVJZHggPSAwLCBDdXJyUmF0ZUlkeCA9IDA7CisJdW5zaWduZWQgbG9uZyBUeFRvdGFsQ250OworCXVuc2lnbmVkIGxvbmcgVHhFcnJvclJhdGlvID0gMDsKKwlCT09MRUFOIGJUeFJhdGVDaGFuZ2VkOwkvKiwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7ICovCisJc3RydWN0IHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggKnBDdXJyVHhSYXRlLCAqcE5leHRUeFJhdGUgPSBOVUxMOworCXU4ICpwVGFibGU7CisJdTggVGFibGVTaXplID0gMDsKKwl1OCBJbml0VHhSYXRlSWR4ID0gMCwgVHJhaW5VcCwgVHJhaW5Eb3duOworCVRYX1NUQV9DTlQxX1NUUlVDIFN0YVR4MTsKKwlUWF9TVEFfQ05UMF9TVFJVQyBUeFN0YUNudDA7CisJY2hhciBSc3NpLCByYXRpbzsKKwl1bnNpZ25lZCBsb25nIFR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBpOwogCiAJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7CiAKLSAgICAvLwotICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKLSAgICAvLwotCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKKwkvKiAqLworCS8qIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkgKi8KKwkvKiAqLworCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKSB7CiAJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwogCi0JCS8vIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5CisJCS8qIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5ICovCiAJCWlmIChSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKHBBZCwgcEVudHJ5KSA9PSBGQUxTRSkKIAkJCWNvbnRpbnVlOwogCi0jaWZkZWYgUlQyODYwCi0JCS8vUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgKENIQVIpcEFkLT5TdGFDZmcuQXZnUnNzaTAsIChDSEFSKXBBZC0+U3RhQ2ZnLkF2Z1Jzc2kxLCAoQ0hBUilwQWQtPlN0YUNmZy5BdmdSc3NpMik7Ci0JICAgIGlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID4gMSkKLQkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7Ci0JCWVsc2UKLQkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCiAJCWlmIChJTkZSQV9PTihwQWQpICYmIChpID09IDEpKQogCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7CisJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEsCisJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIpOwogCQllbHNlCiAJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCwKLQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEsCi0JCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLSNlbmRpZgorCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCisJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKKwkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKIAogCQlDdXJyUmF0ZUlkeCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4OwogCi0JCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLAorCQkJCSAgICAgICZJbml0VHhSYXRlSWR4KTsKIAotCQkvLyBkZWNpZGUgdGhlIG5leHQgdXBncmFkZSByYXRlIGFuZCBkb3duZ3JhZGUgcmF0ZSwgaWYgYW55Ci0JCWlmICgoQ3VyclJhdGVJZHggPiAwKSAmJiAoQ3VyclJhdGVJZHggPCAoVGFibGVTaXplIC0gMSkpKQotCQl7CisJCS8qIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkgKi8KKwkJaWYgKChDdXJyUmF0ZUlkeCA+IDApICYmIChDdXJyUmF0ZUlkeCA8IChUYWJsZVNpemUgLSAxKSkpIHsKIAkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKLQkJCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLTE7Ci0JCX0KLQkJZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkKLQkJeworCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CisJCX0gZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkgewogCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwogCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpCi0JCXsKKwkJfSBlbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAoVGFibGVTaXplIC0gMSkpIHsKIAkJCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwogCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtIDE7CiAJCX0KIAotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07CisJCXBDdXJyVHhSYXRlID0KKwkJICAgIChzdHJ1Y3QgcnRfcnRtcF90eF9yYXRlX3N3aXRjaCAqKSAmIHBUYWJsZVsoQ3VyclJhdGVJZHggKyAxKSAqIDVdOwogCi0JCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQotCQl7Ci0JCQlUcmFpblVwCQk9IChwQ3VyclR4UmF0ZS0+VHJhaW5VcCArIChwQ3VyclR4UmF0ZS0+VHJhaW5VcCA+PiAxKSk7Ci0JCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVRyYWluVXAJCT0gcEN1cnJUeFJhdGUtPlRyYWluVXA7Ci0JCQlUcmFpbkRvd24JPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOworCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkgeworCQkJVHJhaW5VcCA9CisJCQkgICAgKHBDdXJyVHhSYXRlLT5UcmFpblVwICsKKwkJCSAgICAgKHBDdXJyVHhSYXRlLT5UcmFpblVwID4+IDEpKTsKKwkJCVRyYWluRG93biA9CisJCQkgICAgKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKworCQkJICAgICAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7CisJCX0gZWxzZSB7CisJCQlUcmFpblVwID0gcEN1cnJUeFJhdGUtPlRyYWluVXA7CisJCQlUcmFpbkRvd24gPSBwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duOwogCQl9CiAKLQkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkKLQkJewotCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCisJCWlmIChwQWQtPk1hY1RhYi5TaXplID09IDEpIHsKKwkJCS8qIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlciAqLwogCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7CiAKQEAgLTI1OTcsMTIzICsyNDQ1LDEzOCBAQAogCQkJVHhGYWlsQ291bnQgPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CiAJCQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7CiAKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0KKwkJCSAgICBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9CisJCQkgICAgU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgKz0KKwkJCSAgICBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7CisJCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9CisJCQkgICAgU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9CisJCQkgICAgU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKKwkJCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPQorCQkJICAgIFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKIAogCQkJaWYgKFR4VG90YWxDbnQpCi0JCQkJVHhFcnJvclJhdGlvID0gKChUeFJldHJhbnNtaXQgKyBUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKLQkJfQotCQllbHNlCi0JCXsKKwkJCQlUeEVycm9yUmF0aW8gPQorCQkJCSAgICAoKFR4UmV0cmFuc21pdCArCisJCQkJICAgICAgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7CisJCX0gZWxzZSB7CiAJCQlUeFRvdGFsQ250ID0gcEVudHJ5LT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQ7CisJCQkgICAgcEVudHJ5LT5PbmVTZWNUeFJldHJ5T2tDb3VudCArCisJCQkgICAgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudDsKIAogCQkJaWYgKFR4VG90YWxDbnQpCi0JCQkJVHhFcnJvclJhdGlvID0gKChwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICsgcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCkgKiAxMDApIC8gVHhUb3RhbENudDsKKwkJCQlUeEVycm9yUmF0aW8gPQorCQkJCSAgICAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKworCQkJCSAgICAgIHBFbnRyeS0+T25lU2VjVHhGYWlsQ291bnQpICogMTAwKSAvCisJCQkJICAgIFR4VG90YWxDbnQ7CiAJCX0KIAorCQkvKiAqLworCQkvKiBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSSAqLworCQkvKiAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkgKi8KKwkJLyogKi8KKwkJaWYgKFR4VG90YWxDbnQgPD0gMTIpIHsKKwkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LAorCQkJCSAgICAgICBzaXplb2YodTE2KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5QRVIsCisJCQkJICAgICAgIHNpemVvZih1OCkqCisJCQkJICAgICAgIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKIAotCQkvLwotCQkvLyBDQVNFIDEuIHdoZW4gVFggc2FtcGxlcyBhcmUgZmV3ZXIgdGhhbiAxNSwgdGhlbiBkZWNpZGUgVFggcmF0ZSBzb2xlbHkgb24gUlNTSQotCQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKLQkJLy8KLQkJaWYgKFR4VG90YWxDbnQgPD0gMTIpCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCi0JCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQotCQkJeworCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkKKwkJCSAgICAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKSB7CiAJCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBEb3duUmF0ZUlkeDsKLQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQkJCX0KLQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCi0JCQl7CisJCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0KKwkJCQkgICAgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PQorCQkJCSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkgewogCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OwogCQkJfQogCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogVHhUb3RhbENudCA8PSAxNSwgdHJhaW4gYmFjayB0byBvcmlnaW5hbCByYXRlIFxuIikpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJRdWlja0RSUzogVHhUb3RhbENudCA8PSAxNSwgdHJhaW4gYmFjayB0byBvcmlnaW5hbCByYXRlIFxuIikpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJZG8KLQkJewotCQkJVUxPTkcgT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudDsKKwkJZG8geworCQkJdW5zaWduZWQgbG9uZyBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50OwogCiAJCQlpZiAocEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9PSAwKQogCQkJCXJhdGlvID0gNTsKIAkJCWVsc2UKIAkJCQlyYXRpbyA9IDQ7CiAKLQkJCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCi0JCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikKLQkJCXsKLQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCS8qIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkICovCisJCQlpZiAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikgeworCQkJCXBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5W0N1cnJSYXRlSWR4XSA9CisJCQkJICAgIERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EOwogCQkJfQogCi0JCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOworCQkJcEFkLT5EcnNDb3VudGVycy5QRVJbQ3VyclJhdGVJZHhdID0KKwkJCSAgICAodTgpVHhFcnJvclJhdGlvOwogCiAJCQlPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50ID0gKFR4U3VjY2VzcyAqIHJhdGlvKTsKIAotCQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgotCQkJaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMSkgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkKLQkJCXsKLQkJCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OwotCQkJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKKwkJCS8qIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4gKi8KKwkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID09IDEpCisJCQkgICAgJiYgKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSkgeworCQkJCWlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0KKwkJCQkgICAgT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkgeworCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9CisJCQkJCSAgICBEb3duUmF0ZUlkeDsKKwkJCQkJcEFkLT5EcnNDb3VudGVycy4KKwkJCQkJICAgIFR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPQorCQkJCQkgICAgRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7CiAKIAkJCQl9CiAKLQkJCX0KLQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCi0JCQl7Ci0JCQkJaWYgKChUeEVycm9yUmF0aW8gPj0gNTApIHx8IChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKSkKLQkJCQl7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PQorCQkJCSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkgeworCQkJCWlmICgoVHhFcnJvclJhdGlvID49IDUwKQorCQkJCSAgICB8fCAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikpIHsKIAotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkKLQkJCQl7CisJCQkJfSBlbHNlIGlmICgocEFkLT5EcnNDb3VudGVycy5MYXN0VHhPa0NvdW50ICsgMikKKwkJCQkJICAgPj0gT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCkgewogCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IFVwUmF0ZUlkeDsKIAkJCQl9CiAJCQl9Ci0JCX13aGlsZSAoRkFMU0UpOworCQl9IHdoaWxlIChGQUxTRSk7CiAKLQkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCi0JCXsKKwkJLyogaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMgKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpIHsKIAkJCXBBZC0+RHJzQ291bnRlcnMuVHhSYXRlVXBQZW5hbHR5ID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuVHhRdWFsaXR5LCBzaXplb2YoVVNIT1JUKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotI2lmZGVmIFJUMjg3MAorCQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksCisJCQkJICAgICAgIHNpemVvZih1MTYpKgorCQkJCSAgICAgICBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwKKwkJCQkgICAgICAgc2l6ZW9mKHU4KSoKKwkJCQkgICAgICAgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwogCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotI2VuZGlmCiAJCX0KLQkJLy8gaWYgcmF0ZS1kb3duIGhhcHBlbiwgb25seSBjbGVhciBEb3duUmF0ZSdzIGJhZCBoaXN0b3J5Ci0JCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4IDwgQ3VyclJhdGVJZHgpCi0JCXsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlF1aWNrRFJTOiAtLVRYIHJhdGUgZnJvbSAlZCB0byAlZCBcbiIsIEN1cnJSYXRlSWR4LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCkpOworCQkvKiBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkgKi8KKwkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJRdWlja0RSUzogLS1UWCByYXRlIGZyb20gJWQgdG8gJWQgXG4iLAorCQkJCSAgICAgIEN1cnJSYXRlSWR4LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCkpOwogCi0JCQlwQWQtPkRyc0NvdW50ZXJzLlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5Ci0JCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOworCQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOwkvKiBubyBwZW5hbHR5ICovCisJCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPQorCQkJICAgIDA7CiAJCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOwotI2lmZGVmIFJUMjg3MAogCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotI2VuZGlmCi0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOwogCQl9CiAKLQkJcE5leHRUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KzEpKjVdOwotCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCi0JCXsKKwkJcE5leHRUeFJhdGUgPQorCQkgICAgKHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICopICYKKwkJICAgIHBUYWJsZVsocEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggKyAxKSAqIDVdOworCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpIHsKIAkJCU1sbWVTZXRUeFJhdGUocEFkLCBwRW50cnksIHBOZXh0VHhSYXRlKTsKIAkJfQogCX0KQEAgLTI3MzgsOTggKzI2MDEsMTc2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORwlOb3czMikKK3ZvaWQgTWxtZUNoZWNrUHNtQ2hhbmdlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBOb3czMikKIHsKLQlVTE9ORwlQb3dlck1vZGU7CisJdW5zaWduZWQgbG9uZyBQb3dlck1vZGU7CiAKLQkvLyBjb25kaXRpb24gLQotCS8vIDEuIFBzbSBtYXliZSBPTiBvbmx5IGhhcHBlbiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCi0JLy8gMi4gdXNlciB3YW50cyBlaXRoZXIgTUFYX1BTUCBvciBGQVNUX1BTUAotCS8vIDMuIGJ1dCBjdXJyZW50IHBzbSBpcyBub3QgaW4gUFdSX1NBVkUKLQkvLyA0LiBDTlRMIHN0YXRlIG1hY2hpbmUgaXMgbm90IGRvaW5nIFNDQU5uaW5nCi0JLy8gNS4gbm8gVFggU1VDQ0VTUyBldmVudCBmb3IgdGhlIHBhc3QgMS1zZWMgcGVyaW9kCi0jaWZkZWYgTkRJUzUxX01JTklQT1JUCi0JaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlclByb2ZpbGUgPT0gTmRpc1Bvd2VyUHJvZmlsZUJhdHRlcnkpCi0JCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOwotCWVsc2UKLSNlbmRpZgotCQlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOworCS8qIGNvbmRpdGlvbiAtICovCisJLyogMS4gUHNtIG1heWJlIE9OIG9ubHkgaGFwcGVuIGluIElORlJBU1RSVUNUVVJFIG1vZGUgKi8KKwkvKiAyLiB1c2VyIHdhbnRzIGVpdGhlciBNQVhfUFNQIG9yIEZBU1RfUFNQICovCisJLyogMy4gYnV0IGN1cnJlbnQgcHNtIGlzIG5vdCBpbiBQV1JfU0FWRSAqLworCS8qIDQuIENOVEwgc3RhdGUgbWFjaGluZSBpcyBub3QgZG9pbmcgU0NBTm5pbmcgKi8KKwkvKiA1LiBubyBUWCBTVUNDRVNTIGV2ZW50IGZvciB0aGUgcGFzdCAxLXNlYyBwZXJpb2QgKi8KKwlQb3dlck1vZGUgPSBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlOwogCiAJaWYgKElORlJBX09OKHBBZCkgJiYKLQkJKFBvd2VyTW9kZSAhPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKSAmJgotCQkocEFkLT5TdGFDZmcuUHNtID09IFBXUl9BQ1RJVkUpICYmCi0jaWZkZWYgUlQyODYwCi0JCVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApKQotI2Vsc2UKLQkJKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKSkKLSNlbmRpZgotCXsKLQkJLy8gYWRkIGJ5IGpvaG5saSwgdXNlIFJ4IE9LIGRhdGEgY291bnQgcGVyIHNlY29uZCB0byBjYWxjdWxhdGUgdGhyb3VnaHB1dAotCQkvLyBJZiBUdHJhZmZpYyBpcyB0b28gaGlnaCAoID4gNDAwIFJ4IHBlciBzZWNvbmQpLCBkb24ndCBnbyB0byBzbGVlcCBtb2RlLiBJZiB0eCByYXRlIGlzIGxvdywgdXNlIGxvdyBjcml0ZXJpYQotCQkvLyBNb2RlPUNDSy9NQ1M9MyA9PiAxMSBNYnBzLCBNb2RlPU9GRE0vTUNTPTMgPT4gMTggTWJwcwotCQlpZiAoKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTIDw9IDMpICYmCi0JCQkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0RhdGFDbnQgPCAoVUxPTkcpMTAwKSkgfHwKLQkJCSgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA+IDMpICYmCi0JCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA8IChVTE9ORyk0MDApKSkKLQkJewotCQkJCS8vIEdldCB0aGlzIHRpbWUKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lKTsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAwOwotCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKLQkJCWlmICghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCi0JCQl7Ci0JCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlSVE1QU2VuZE51bGxGcmFtZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSwgVFJVRSk7Ci0JCQl9CisJICAgIChQb3dlck1vZGUgIT0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTSkgJiYKKwkgICAgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKSAmJgorLyogICAgICAgICAgICAgICghIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICovCisJICAgIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkgJiYKKwkgICAgUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCkKKwkgICAgLyomJgorCSAgICAgICAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCisJICAgICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApICovCisJICAgICkgeworCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPk1sbWUuTGFzdFNlbmROVUxMcHNtVGltZSk7CisJCXBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPSAwOworCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX1NBVkUpOworCQlpZiAoIQorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCQkgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkgeworCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKIAkJfQogCX0KIH0KIAotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lU2V0UHNtQml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBwc20pCisvKiBJUlFMID0gUEFTU0lWRV9MRVZFTCAqLworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVTZXRQc21CaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgcHNtKQogewogCUFVVE9fUlNQX0NGR19TVFJVQyBjc3I0OwogCiAJcEFkLT5TdGFDZmcuUHNtID0gcHNtOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVUT19SU1BfQ0ZHLCAmY3NyNC53b3JkKTsKLQljc3I0LmZpZWxkLkFja0N0c1BzbUJpdCA9IChwc20gPT0gUFdSX1NBVkUpPyAxOjA7CisJY3NyNC5maWVsZC5BY2tDdHNQc21CaXQgPSAocHNtID09IFBXUl9TQVZFKSA/IDEgOiAwOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fUlNQX0NGRywgY3NyNC53b3JkKTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTZXRQc21CaXQgPSAlZFxuIiwgcHNtKSk7CiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVHhQcmVhbWJsZSkKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgVHhQRVIsIFJ4UEVSIG9mIHRoZSBwYXN0IE4tc2VjIHBlcmlvZC4gQW5kCisJCWFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gcmVzdWx0LCBDaGFubmVsUXVhbGl0eSBpcyBjYWxjdWxhdGVkIGhlcmUKKwkJdG8gZGVjaWRlIGlmIGN1cnJlbnQgQVAgaXMgc3RpbGwgZG9pbmcgdGhlIGpvYi4KKworCQlJZiBDaGFubmVsUXVhbGl0eSBpcyBub3QgZ29vZCwgYSBST0FNaW5nIGF0dGVtcHQgbWF5IGJlIHRyaWVkIGxhdGVyLgorCU91dHB1dDoKKwkJU3RhQ2ZnLkNoYW5uZWxRdWFsaXR5IC0gMC4uMTAwCisKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKKworCU5PVEU6IFRoaXMgcm91dGluZSBkZWNpZGUgY2hhbm5sZSBxdWFsaXR5IGJhc2VkIG9uIFJYIENSQyBlcnJvciByYXRpby4KKwkJQ2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgYSBmdW5jdGlvbiBjYWxsIHRvIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCkKKwkJaXMgcGVyZm9ybWVkIHJpZ2h0IGJlZm9yZSB0aGlzIHJvdXRpbmUsIHNvIHRoYXQgdGhpcyByb3V0aW5lIGNhbiBkZWNpZGUKKwkJY2hhbm5lbCBxdWFsaXR5IGJhc2VkIG9uIHRoZSBtb3N0IHVwLXRvLWRhdGUgaW5mb3JtYXRpb24KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCit2b2lkIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeSwgdW5zaWduZWQgbG9uZyBOb3czMikKK3sKKwl1bnNpZ25lZCBsb25nIFR4T2tDbnQsIFR4Q250LCBUeFBFUiwgVHhQUlI7CisJdW5zaWduZWQgbG9uZyBSeENudCwgUnhQRVI7CisJdTggTm9yUnNzaTsKKwljaGFyIE1heFJzc2k7CisJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlICpwUnNzaVNhbXBsZSA9IE5VTEw7CisJdTMyIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPSAwOworCXUzMiBPbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7CisJdTMyIE9uZVNlY1R4RmFpbENvdW50ID0gMDsKKwl1MzIgT25lU2VjUnhPa0NudCA9IDA7CisJdTMyIE9uZVNlY1J4RmNzRXJyQ250ID0gMDsKKwl1bnNpZ25lZCBsb25nIENoYW5uZWxRdWFsaXR5ID0gMDsJLyogMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZyAqLworCXVuc2lnbmVkIGxvbmcgQmVhY29uTG9zdFRpbWUgPSBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZTsKKworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCXBSc3NpU2FtcGxlID0gJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGU7CisJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPQorCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCQlPbmVTZWNUeFJldHJ5T2tDb3VudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7CisJCU9uZVNlY1R4RmFpbENvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKwkJT25lU2VjUnhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudDsKKwkJT25lU2VjUnhGY3NFcnJDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250OworCX0KKworCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBSc3NpU2FtcGxlLT5MYXN0UnNzaTAsCisJCQkgICAgICBwUnNzaVNhbXBsZS0+TGFzdFJzc2kxLCBwUnNzaVNhbXBsZS0+TGFzdFJzc2kyKTsKKworCS8qICovCisJLyogY2FsY3VsYXRlIFRYIHBhY2tldCBlcnJvciByYXRpbyBhbmQgVFggcmV0cnkgcmF0aW8gLSBpZiB0b28gZmV3IFRYIHNhbXBsZXMsIHNraXAgVFggcmVsYXRlZCBzdGF0aXN0aWNzICovCisJLyogKi8KKwlUeE9rQ250ID0gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCVR4Q250ID0gVHhPa0NudCArIE9uZVNlY1R4RmFpbENvdW50OworCWlmIChUeENudCA8IDUpIHsKKwkJVHhQRVIgPSAwOworCQlUeFBSUiA9IDA7CisJfSBlbHNlIHsKKwkJVHhQRVIgPSAoT25lU2VjVHhGYWlsQ291bnQgKiAxMDApIC8gVHhDbnQ7CisJCVR4UFJSID0gKChUeENudCAtIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQpICogMTAwKSAvIFR4Q250OworCX0KKworCS8qICovCisJLyogY2FsY3VsYXRlIFJYIFBFUiAtIGRvbid0IHRha2UgUnhQRVIgaW50byBjb25zaWRlcmF0aW9uIGlmIHRvbyBmZXcgc2FtcGxlICovCisJLyogKi8KKwlSeENudCA9IE9uZVNlY1J4T2tDbnQgKyBPbmVTZWNSeEZjc0VyckNudDsKKwlpZiAoUnhDbnQgPCA1KQorCQlSeFBFUiA9IDA7CisJZWxzZQorCQlSeFBFUiA9IChPbmVTZWNSeEZjc0VyckNudCAqIDEwMCkgLyBSeENudDsKKworCS8qICovCisJLyogZGVjaWRlIENoYW5uZWxRdWFsaXR5IGJhc2VkIG9uOiAxKWxhc3QgQkVBQ09OIHJlY2VpdmVkIHRpbWUsIDIpbGFzdCBSU1NJLCAzKVR4UEVSLCBhbmQgNClSeFBFUiAqLworCS8qICovCisJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBJTkZSQV9PTihwQWQpICYmIChPbmVTZWNUeE5vUmV0cnlPa0NvdW50IDwgMikgJiYJLyogbm8gaGVhdnkgdHJhZmZpYyAqLworCSAgICAoKHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyBCZWFjb25Mb3N0VGltZSkgPCBOb3czMikpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCRUFDT04gbG9zdCA+ICVsZCBtc2VjIHdpdGggVHhPa0NudD0lbGQgLT4gQ1FJPTBcbiIsCisJCQkgIEJlYWNvbkxvc3RUaW1lLCBUeE9rQ250KSk7CisJCUNoYW5uZWxRdWFsaXR5ID0gMDsKKwl9IGVsc2UgeworCQkvKiBOb3JtYWxpemUgUnNzaSAqLworCQlpZiAoTWF4UnNzaSA+IC00MCkKKwkJCU5vclJzc2kgPSAxMDA7CisJCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCisJCQlOb3JSc3NpID0gMDsKKwkJZWxzZQorCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKKworCQkvKiBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSICAgICAgICAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkgKi8KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoUlNTSV9XRUlHSFRJTkcgKiBOb3JSc3NpICsKKwkJCQkgIFRYX1dFSUdIVElORyAqICgxMDAgLSBUeFBSUikgKworCQkJCSAgUlhfV0VJR0hUSU5HICogKDEwMCAtIFJ4UEVSKSkgLyAxMDA7CisJfQorCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCisJCXBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSA9CisJCSAgICAoQ2hhbm5lbFF1YWxpdHkgPiAxMDApID8gMTAwIDogQ2hhbm5lbFF1YWxpdHk7CisKK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVTZXRUeFByZWFtYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2IFR4UHJlYW1ibGUpCiB7CiAJQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7CiAKLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCi0JLy9UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7CisJLyogKi8KKwkvKiBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4gKi8KKwkvKiBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MgKi8KKwkvKiAqLworCS8qVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVMb25nOyAqLwogCiAJUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOwotCWlmIChUeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVMb25nKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gTE9ORyBQUkVBTUJMRSlcbiIpKTsKKwlpZiAoVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlTG9uZykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1sbWVTZXRUeFByZWFtYmxlICg9IGxvbmcgUFJFQU1CTEUpXG4iKSk7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CiAJCWNzcjQuZmllbGQuQXV0b1Jlc3BvbmRlclByZWFtYmxlID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTk9URTogMU1icHMgc2hvdWxkIGFsd2F5cyB1c2UgbG9uZyBwcmVhbWJsZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBTSE9SVCBQUkVBTUJMRSlcbiIpKTsKKwl9IGVsc2UgeworCQkvKiBOT1RFOiAxTWJwcyBzaG91bGQgYWx3YXlzIHVzZSBsb25nIHByZWFtYmxlICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gc2hvcnQgUFJFQU1CTEUpXG4iKSk7CiAJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwogCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDE7CiAJfQpAQCAtMjg0NCwxMTcgKzI3ODUsMTQwIEBACiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogCi1WT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyKQordm9pZCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIpCiB7Ci0gICAgSU5UICBpLCBqOwotICAgICAgICAgICAgICAgICAgLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLwotICAgIFVDSEFSIHJhdGVbXSA9IHsgMiwgNCwgIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCB9OwotICAgIFVDSEFSICpzdXBfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3VwUmF0ZTsKLSAgICBVQ0hBUiAqZXh0X3AgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkV4dFJhdGU7Ci0gICAgVUxPTkcgYml0bWFwID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXA7CisJaW50IGksIGo7CisJLyogMSAgMiAgNS41LCAxMSwgIDYsICA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsICA1NCAqLworCXU4IHJhdGVbXSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07CisJdTggKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOworCXU4ICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKKwl1bnNpZ25lZCBsb25nIGJpdG1hcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwOwogCi0KLSAgICAvKiBpZiBBIG1vZGUsIGFsd2F5cyB1c2UgZml4IEJhc2ljUmF0ZUJpdE1hcCAqLwotICAgIC8vaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA9PSBQSFlfMTFBKQorCS8qIGlmIEEgbW9kZSwgYWx3YXlzIHVzZSBmaXggQmFzaWNSYXRlQml0TWFwICovCisJLyppZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID09IFBIWV8xMUEpICovCiAJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA9IDB4MTUwOyAvKiA2LCAxMiwgMjRNICovCi0gICAgLyogRW5kIG9mIGlmICovCisJCXBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7CS8qIDYsIDEyLCAyNE0gKi8KKwkvKiBFbmQgb2YgaWYgKi8KIAotICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpCi0gICAgewotICAgICAgICAvKiAoMiBeIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAtMSAqLwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KKwlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPiA0MDk1KSB7CisJCS8qICgyIF4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpIC0xICovCisJCXJldHVybjsKKwl9CisJLyogRW5kIG9mIGlmICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspIHsKKwkJc3VwX3BbaV0gJj0gMHg3ZjsKKwkJZXh0X3BbaV0gJj0gMHg3ZjsKKwl9CQkJLyogRW5kIG9mIGZvciAqLwogCi0gICAgZm9yKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotICAgIHsKLSAgICAgICAgc3VwX3BbaV0gJj0gMHg3ZjsKLSAgICAgICAgZXh0X3BbaV0gJj0gMHg3ZjsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykgeworCQlpZiAoYml0bWFwICYgKDEgPDwgaSkpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKSB7CisJCQkJaWYgKHN1cF9wW2pdID09IHJhdGVbaV0pCisJCQkJCXN1cF9wW2pdIHw9IDB4ODA7CisJCQkJLyogRW5kIG9mIGlmICovCisJCQl9CS8qIEVuZCBvZiBmb3IgKi8KIAotICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChiaXRtYXAgJiAoMSA8PCBpKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdXBfcFtqXSA9PSByYXRlW2ldKQotICAgICAgICAgICAgICAgICAgICBzdXBfcFtqXSB8PSAweDgwOwotICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCisJCQlmb3IgKGogPSAwOyBqIDwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykgeworCQkJCWlmIChleHRfcFtqXSA9PSByYXRlW2ldKQorCQkJCQlleHRfcFtqXSB8PSAweDgwOworCQkJCS8qIEVuZCBvZiBpZiAqLworCQkJfQkvKiBFbmQgb2YgZm9yICovCisJCX0JCS8qIEVuZCBvZiBpZiAqLworCX0JCQkvKiBFbmQgb2YgZm9yICovCit9CQkJCS8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KIAotICAgICAgICAgICAgZm9yKGo9MDsgajxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChleHRfcFtqXSA9PSByYXRlW2ldKQotICAgICAgICAgICAgICAgICAgICBleHRfcFtqXSB8PSAweDgwOwotICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2YgZm9yICovCi19IC8qIEVuZCBvZiBVcGRhdGVCYXNpY1JhdGVCaXRtYXAgKi8KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotLy8gYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuCi0vLyBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLgotVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSIAkJcEFkLAotCUlOIAlCT09MRUFOCQkgCQliTGlua1VwLAotCUlOCVVDSEFSCQkJCWFwaWR4KQorLyogSVJRTCA9IFBBU1NJVkVfTEVWRUwgKi8KKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLworLyogYkxpbmtVcCBpcyB0byBpZGVudGlmeSB0aGUgaW5pdGFsIGxpbmsgc3BlZWQuICovCisvKiBUUlVFIGluZGljYXRlcyB0aGUgcmF0ZSB1cGRhdGUgYXQgbGlua3VwLCB3ZSBzaG91bGQgbm90IHRyeSB0byBzZXQgdGhlIHJhdGUgYXQgNTRNYnBzLiAqLwordm9pZCBNbG1lVXBkYXRlVHhSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkxpbmtVcCwgdTggYXBpZHgpCiB7CiAJaW50IGksIG51bTsKLQlVQ0hBUiBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7Ci0JVUNIQVIgTWluU3VwcG9ydCA9IFJBVEVfNTQ7Ci0JVUxPTkcgQmFzaWNSYXRlQml0bWFwID0gMDsKLQlVQ0hBUiBDdXJyQmFzaWNSYXRlID0gUkFURV8xOwotCVVDSEFSICpwU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgKnBFeHRSYXRlLCBFeHRSYXRlTGVuOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOwotCUJPT0xFQU4gCQkJCSphdXRvX3JhdGVfY3VyX3A7Ci0JVUNIQVIJCQkJCUh0TWNzID0gTUNTX0FVVE87CisJdTggUmF0ZSA9IFJBVEVfNiwgTWF4RGVzaXJlID0gUkFURV8xLCBNYXhTdXBwb3J0ID0gUkFURV8xOworCXU4IE1pblN1cHBvcnQgPSBSQVRFXzU0OworCXVuc2lnbmVkIGxvbmcgQmFzaWNSYXRlQml0bWFwID0gMDsKKwl1OCBDdXJyQmFzaWNSYXRlID0gUkFURV8xOworCXU4ICpwU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgKnBFeHRSYXRlLCBFeHRSYXRlTGVuOworCVBIVFRSQU5TTUlUX1NFVFRJTkcgcEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIHBNYXhIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORyBwTWluSHRQaHkgPSBOVUxMOworCUJPT0xFQU4gKmF1dG9fcmF0ZV9jdXJfcDsKKwl1OCBIdE1jcyA9IE1DU19BVVRPOwogCi0JLy8gZmluZCBtYXggZGVzaXJlZCByYXRlCisJLyogZmluZCBtYXggZGVzaXJlZCByYXRlICovCiAJVXBkYXRlQmFzaWNSYXRlQml0bWFwKHBBZCk7CiAKIAludW0gPSAwOwogCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7Ci0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLQl7Ci0JCXN3aXRjaCAocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVtpXSAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgMjogIFJhdGUgPSBSQVRFXzE7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDQ6ICBSYXRlID0gUkFURV8yOyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAxMTogUmF0ZSA9IFJBVEVfNV81OyBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMjI6IFJhdGUgPSBSQVRFXzExOyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDEyOiBSYXRlID0gUkFURV82OyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAxODogUmF0ZSA9IFJBVEVfOTsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMjQ6IFJhdGUgPSBSQVRFXzEyOyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDM2OiBSYXRlID0gUkFURV8xODsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA0ODogUmF0ZSA9IFJBVEVfMjQ7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgNzI6IFJhdGUgPSBSQVRFXzM2OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDk2OiBSYXRlID0gUkFURV80ODsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAxMDg6IFJhdGUgPSBSQVRFXzU0OyBudW0rKzsgICBicmVhazsKLQkJCS8vZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykgeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbaV0gJiAweDdmKSB7CisJCWNhc2UgMjoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlSYXRlID0gUkFURV8yOworCQkJbnVtKys7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCVJhdGUgPSBSQVRFXzVfNTsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMjI6CisJCQlSYXRlID0gUkFURV8xMTsKKwkJCW51bSsrOworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQlSYXRlID0gUkFURV82OworCQkJbnVtKys7CisJCQlicmVhazsKKwkJY2FzZSAxODoKKwkJCVJhdGUgPSBSQVRFXzk7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJUmF0ZSA9IFJBVEVfMTI7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDM2OgorCQkJUmF0ZSA9IFJBVEVfMTg7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDQ4OgorCQkJUmF0ZSA9IFJBVEVfMjQ7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDcyOgorCQkJUmF0ZSA9IFJBVEVfMzY7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDk2OgorCQkJUmF0ZSA9IFJBVEVfNDg7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQljYXNlIDEwODoKKwkJCVJhdGUgPSBSQVRFXzU0OworCQkJbnVtKys7CisJCQlicmVhazsKKwkJCS8qZGVmYXVsdDogUmF0ZSA9IFJBVEVfMTsgICBicmVhazsgKi8KIAkJfQotCQlpZiAoTWF4RGVzaXJlIDwgUmF0ZSkgIE1heERlc2lyZSA9IFJhdGU7CisJCWlmIChNYXhEZXNpcmUgPCBSYXRlKQorCQkJTWF4RGVzaXJlID0gUmF0ZTsKIAl9CiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJewotCQlwSHRQaHkgCQk9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7Ci0JCXBNYXhIdFBoeQk9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7Ci0JCXBNaW5IdFBoeQk9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CisJCXBIdFBoeSA9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeSA9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeSA9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CiAKIAkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCQlIdE1jcyAJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CisJCUh0TWNzID0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7CiAKIAkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCi0JCQkoTWF4RGVzaXJlID4gUkFURV8xMSkpCi0JCXsKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCisJCSAgICAoTWF4RGVzaXJlID4gUkFURV8xMSkpIHsKIAkJCU1heERlc2lyZSA9IFJBVEVfMTE7CiAJCX0KIAl9CkBAIC0yOTY0LDExMSArMjkyOCwyMTEgQEAKIAlwTWF4SHRQaHktPndvcmQgPSAwOwogCXBIdFBoeS0+d29yZCA9IDA7CiAKLQkvLyBBdXRvIHJhdGUgc3dpdGNoaW5nIGlzIGVuYWJsZWQgb25seSBpZiBtb3JlIHRoYW4gb25lIERFU0lSRUQgUkFURVMgYXJlCi0JLy8gc3BlY2lmaWVkOyBvdGhlcndpc2UgZGlzYWJsZWQKLQlpZiAobnVtIDw9IDEpCi0JeworCS8qIEF1dG8gcmF0ZSBzd2l0Y2hpbmcgaXMgZW5hYmxlZCBvbmx5IGlmIG1vcmUgdGhhbiBvbmUgREVTSVJFRCBSQVRFUyBhcmUgKi8KKwkvKiBzcGVjaWZpZWQ7IG90aGVyd2lzZSBkaXNhYmxlZCAqLworCWlmIChudW0gPD0gMSkgeworCQkvKk9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoICAgICAgPSBGQUxTRTsgKi8KIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IEZBTFNFOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CisJCS8qT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOyAqLworCQkvKnBBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoICAgICAgPSBUUlVFOyAqLwogCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKIAl9CiAKLSNpZiAxCi0JaWYgKEh0TWNzICE9IE1DU19BVVRPKQotCXsKKwlpZiAoSHRNY3MgIT0gTUNTX0FVVE8pIHsKKwkJLypPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsgKi8KKwkJLypwQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaCAgICAgID0gRkFMU0U7ICovCiAJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgeworCQkvKk9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsgKi8KKwkJLypwQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaCAgICAgID0gVFJVRTsgKi8KIAkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7CiAJfQotI2VuZGlmCiAKLQlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCXsKKwlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSB7CiAJCXBTdXBSYXRlID0gJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVbMF07CiAJCXBFeHRSYXRlID0gJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVbMF07CiAJCVN1cFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuOwogCQlFeHRSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwU3VwUmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdOwogCQlwRXh0UmF0ZSA9ICZwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzBdOwogCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKIAkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47CiAJfQogCi0JLy8gZmluZCBtYXggc3VwcG9ydGVkIHJhdGUKLQlmb3IgKGk9MDsgaTxTdXBSYXRlTGVuOyBpKyspCi0JewotCQlzd2l0Y2ggKHBTdXBSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgIFJhdGUgPSBSQVRFXzE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CSBicmVhazsKLQkJCWNhc2UgNDogICBSYXRlID0gUkFURV8yOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAyOwkgYnJlYWs7Ci0JCQljYXNlIDExOiAgUmF0ZSA9IFJBVEVfNV81OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OwkgYnJlYWs7Ci0JCQljYXNlIDIyOiAgUmF0ZSA9IFJBVEVfMTE7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CSBicmVhazsKLQkJCWNhc2UgMTI6ICBSYXRlID0gUkFURV82OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7ICBicmVhazsKLQkJCWNhc2UgMTg6ICBSYXRlID0gUkFURV85OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDIwOwkgYnJlYWs7Ci0JCQljYXNlIDI0OiAgUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA0MDsgIGJyZWFrOwotCQkJY2FzZSAzNjogIFJhdGUgPSBSQVRFXzE4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOwkgYnJlYWs7Ci0JCQljYXNlIDQ4OiAgUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkqLyAgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsgIGJyZWFrOwotCQkJY2FzZSA3MjogIFJhdGUgPSBSQVRFXzM2OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOwkgYnJlYWs7Ci0JCQljYXNlIDk2OiAgUmF0ZSA9IFJBVEVfNDg7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA0MDA7CSBicmVhazsKLQkJCWNhc2UgMTA4OiBSYXRlID0gUkFURV81NDsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDgwMDsJIGJyZWFrOwotCQkJZGVmYXVsdDogIFJhdGUgPSBSQVRFXzE7CWJyZWFrOworCS8qIGZpbmQgbWF4IHN1cHBvcnRlZCByYXRlICovCisJZm9yIChpID0gMDsgaSA8IFN1cFJhdGVMZW47IGkrKykgeworCQlzd2l0Y2ggKHBTdXBSYXRlW2ldICYgMHg3ZikgeworCQljYXNlIDI6CisJCQlSYXRlID0gUkFURV8xOworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAxOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCVJhdGUgPSBSQVRFXzI7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDI7CisJCQlicmVhazsKKwkJY2FzZSAxMToKKwkJCVJhdGUgPSBSQVRFXzVfNTsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwNDsKKwkJCWJyZWFrOworCQljYXNlIDIyOgorCQkJUmF0ZSA9IFJBVEVfMTE7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDg7CisJCQlicmVhazsKKwkJY2FzZSAxMjoKKwkJCVJhdGUgPSBSQVRFXzY7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgKi8KKwkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMTA7CisJCQlicmVhazsKKwkJY2FzZSAxODoKKwkJCVJhdGUgPSBSQVRFXzk7CisJCQlpZiAocFN1cFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMjA7CisJCQlicmVhazsKKwkJY2FzZSAyNDoKKwkJCVJhdGUgPSBSQVRFXzEyOwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApICovCisJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDQwOworCQkJYnJlYWs7CisJCWNhc2UgMzY6CisJCQlSYXRlID0gUkFURV8xODsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA4MDsKKwkJCWJyZWFrOworCQljYXNlIDQ4OgorCQkJUmF0ZSA9IFJBVEVfMjQ7CS8qaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgKi8KKwkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAxMDA7CisJCQlicmVhazsKKwkJY2FzZSA3MjoKKwkJCVJhdGUgPSBSQVRFXzM2OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMjAwOworCQkJYnJlYWs7CisJCWNhc2UgOTY6CisJCQlSYXRlID0gUkFURV80ODsKKwkJCWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDQwMDsKKwkJCWJyZWFrOworCQljYXNlIDEwODoKKwkJCVJhdGUgPSBSQVRFXzU0OworCQkJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwODAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSYXRlID0gUkFURV8xOworCQkJYnJlYWs7CiAJCX0KLQkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQlNYXhTdXBwb3J0ID0gUmF0ZTsKKwkJaWYgKE1heFN1cHBvcnQgPCBSYXRlKQorCQkJTWF4U3VwcG9ydCA9IFJhdGU7CiAKLQkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKSBNaW5TdXBwb3J0ID0gUmF0ZTsKKwkJaWYgKE1pblN1cHBvcnQgPiBSYXRlKQorCQkJTWluU3VwcG9ydCA9IFJhdGU7CiAJfQogCi0JZm9yIChpPTA7IGk8RXh0UmF0ZUxlbjsgaSsrKQotCXsKLQkJc3dpdGNoIChwRXh0UmF0ZVtpXSAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgMjogICBSYXRlID0gUkFURV8xOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAxOwkgYnJlYWs7Ci0JCQljYXNlIDQ6ICAgUmF0ZSA9IFJBVEVfMjsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsJIGJyZWFrOwotCQkJY2FzZSAxMTogIFJhdGUgPSBSQVRFXzVfNTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwNDsJIGJyZWFrOwotCQkJY2FzZSAyMjogIFJhdGUgPSBSQVRFXzExOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OwkgYnJlYWs7Ci0JCQljYXNlIDEyOiAgUmF0ZSA9IFJBVEVfNjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOyAgYnJlYWs7Ci0JCQljYXNlIDE4OiAgUmF0ZSA9IFJBVEVfOTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsJIGJyZWFrOwotCQkJY2FzZSAyNDogIFJhdGUgPSBSQVRFXzEyOwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7ICBicmVhazsKLQkJCWNhc2UgMzY6ICBSYXRlID0gUkFURV8xODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA4MDsJIGJyZWFrOwotCQkJY2FzZSA0ODogIFJhdGUgPSBSQVRFXzI0OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAxMDA7ICBicmVhazsKLQkJCWNhc2UgNzI6ICBSYXRlID0gUkFURV8zNjsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsJIGJyZWFrOwotCQkJY2FzZSA5NjogIFJhdGUgPSBSQVRFXzQ4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOwkgYnJlYWs7Ci0JCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CSBicmVhazsKLQkJCWRlZmF1bHQ6ICBSYXRlID0gUkFURV8xOwlicmVhazsKKwlmb3IgKGkgPSAwOyBpIDwgRXh0UmF0ZUxlbjsgaSsrKSB7CisJCXN3aXRjaCAocEV4dFJhdGVbaV0gJiAweDdmKSB7CisJCWNhc2UgMjoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwMDE7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJUmF0ZSA9IFJBVEVfMjsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsKKwkJCWJyZWFrOworCQljYXNlIDExOgorCQkJUmF0ZSA9IFJBVEVfNV81OworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA0OworCQkJYnJlYWs7CisJCWNhc2UgMjI6CisJCQlSYXRlID0gUkFURV8xMTsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwODsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJUmF0ZSA9IFJBVEVfNjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAxMDsKKwkJCWJyZWFrOworCQljYXNlIDE4OgorCQkJUmF0ZSA9IFJBVEVfOTsKKwkJCWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApCisJCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsKKwkJCWJyZWFrOworCQljYXNlIDI0OgorCQkJUmF0ZSA9IFJBVEVfMTI7CS8qaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgKi8KKwkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7CisJCQlicmVhazsKKwkJY2FzZSAzNjoKKwkJCVJhdGUgPSBSQVRFXzE4OworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDgwOworCQkJYnJlYWs7CisJCWNhc2UgNDg6CisJCQlSYXRlID0gUkFURV8yNDsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSAqLworCQkJQmFzaWNSYXRlQml0bWFwIHw9IDB4MDEwMDsKKwkJCWJyZWFrOworCQljYXNlIDcyOgorCQkJUmF0ZSA9IFJBVEVfMzY7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDAyMDA7CisJCQlicmVhazsKKwkJY2FzZSA5NjoKKwkJCVJhdGUgPSBSQVRFXzQ4OworCQkJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkKKwkJCQlCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOworCQkJYnJlYWs7CisJCWNhc2UgMTA4OgorCQkJUmF0ZSA9IFJBVEVfNTQ7CisJCQlpZiAocEV4dFJhdGVbaV0gJiAweDgwKQorCQkJCUJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKIAkJfQotCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOworCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCisJCQlNYXhTdXBwb3J0ID0gUmF0ZTsKIAotCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpIE1pblN1cHBvcnQgPSBSYXRlOworCQlpZiAoTWluU3VwcG9ydCA+IFJhdGUpCisJCQlNaW5TdXBwb3J0ID0gUmF0ZTsKIAl9CiAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRUdBQ1lfQkFTSUNfUkFURSwgQmFzaWNSYXRlQml0bWFwKTsKIAotCS8vIGNhbGN1bGF0ZSB0aGUgZXhwdGVjdGVkIEFDSyByYXRlIGZvciBlYWNoIFRYIHJhdGUuIFRoaXMgaW5mbyBpcyB1c2VkIHRvIGNhY3VsYXRlCi0JLy8gdGhlIERVUkFUSU9OIGZpZWxkIG9mIG91dGdvaW5nIHVuaWljYXN0IERBVEEvTUdNVCBmcmFtZQotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCi0JeworCS8qIGJ1ZyBmaXggKi8KKwkvKiBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSBCYXNpY1JhdGVCaXRtYXA7ICovCisKKwkvKiBjYWxjdWxhdGUgdGhlIGV4cHRlY3RlZCBBQ0sgcmF0ZSBmb3IgZWFjaCBUWCByYXRlLiBUaGlzIGluZm8gaXMgdXNlZCB0byBjYWN1bGF0ZSAqLworCS8qIHRoZSBEVVJBVElPTiBmaWVsZCBvZiBvdXRnb2luZyB1bmlpY2FzdCBEQVRBL01HTVQgZnJhbWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykgewogCQlpZiAoQmFzaWNSYXRlQml0bWFwICYgKDB4MDEgPDwgaSkpCi0JCQlDdXJyQmFzaWNSYXRlID0gKFVDSEFSKWk7CisJCQlDdXJyQmFzaWNSYXRlID0gKHU4KWk7CiAJCXBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtpXSA9IEN1cnJCYXNpY1JhdGU7CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlVHhSYXRlc1tNYXhTdXBwb3J0ID0gJWRdID0gTWF4RGVzaXJlICVkIE1icHNcbiIsIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0pKTsKLQkvLyBtYXggdHggcmF0ZSA9IG1pbiB7bWF4IGRlc2lyZSByYXRlLCBtYXggc3VwcG9ydGVkIHJhdGV9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwKKwkJICBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdKSk7CisJLyogbWF4IHR4IHJhdGUgPSBtaW4ge21heCBkZXNpcmUgcmF0ZSwgbWF4IHN1cHBvcnRlZCByYXRlfSAqLwogCWlmIChNYXhTdXBwb3J0IDwgTWF4RGVzaXJlKQogCQlwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPSBNYXhTdXBwb3J0OwogCWVsc2UKIAkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4RGVzaXJlOwogCiAJcEFkLT5Db21tb25DZmcuTWluVHhSYXRlID0gTWluU3VwcG9ydDsKLQlpZiAoKmF1dG9fcmF0ZV9jdXJfcCkKLQl7CisJLyogMjAwMy0wNy0zMSBqb2huIC0gMjUwMCBkb2Vzbid0IGhhdmUgZ29vZCBzZW5zaXRpdml0eSBhdCBoaWdoIE9GRE0gcmF0ZXMuIHRvIGluY3JlYXNlIHRoZSBzdWNjZXNzICovCisJLyogcmF0aW8gb2YgaW5pdGlhbCBESENQIHBhY2tldCBleGNoYW5nZSwgVFggcmF0ZSBzdGFydHMgZnJvbSBhIGxvd2VyIHJhdGUgZGVwZW5kaW5nICovCisJLyogb24gYXZlcmFnZSBSU1NJICovCisJLyogICAgICAgMS4gUlNTSSA+PSAtNzBkYiwgc3RhcnQgYXQgNTQgTWJwcyAoc2hvcnQgZGlzdGFuY2UpICovCisJLyogICAgICAgMi4gLTcwID4gUlNTSSA+PSAtNzUsIHN0YXJ0IGF0IDI0IE1icHMgKG1pZCBkaXN0YW5jZSkgKi8KKwkvKiAgICAgICAzLiAtNzUgPiBSU1NJLCBzdGFydCBhdCAxMSBNYnBzIChsb25nIGRpc3RhbmNlKSAqLworCWlmICgqYXV0b19yYXRlX2N1cl9wKSB7CiAJCXNob3J0IGRibSA9IDA7CiAKIAkJZGJtID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7CkBAIC0zMDgzLDExMyArMzE0NywxMzcgQEAKIAkJZWxzZSBpZiAoZGJtIDwgLTcwKQogCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKIAotCQkvLyBzaG91bGQgbmV2ZXIgZXhjZWVkIE1heFR4UmF0ZSAoY29uc2lkZXIgMTFCLW9ubHkgbW9kZSkKKwkJLyogc2hvdWxkIG5ldmVyIGV4Y2VlZCBNYXhUeFJhdGUgKGNvbnNpZGVyIDExQi1vbmx5IG1vZGUpICovCiAJCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUpCiAJCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CiAKIAkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSAwOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKLQkJcEh0UGh5LT5maWVsZC5NQ1MJPSAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlIC0gNCkgOiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7Ci0JCXBIdFBoeS0+ZmllbGQuTU9ERQk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IE1PREVfT0ZETSA6IE1PREVfQ0NLOworCQlwSHRQaHktPmZpZWxkLk1DUyA9CisJCSAgICAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4KKwkJICAgICAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLQorCQkJICAgNCkgOiBwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGU7CisJCXBIdFBoeS0+ZmllbGQuTU9ERSA9CisJCSAgICAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gMykgPyBNT0RFX09GRE0gOiBNT0RFX0NDSzsKIAotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TVEJDCT0gcEh0UGh5LT5maWVsZC5TVEJDOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEh0UGh5LT5maWVsZC5TaG9ydEdJOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MJCT0gcEh0UGh5LT5maWVsZC5NQ1M7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwSHRQaHktPmZpZWxkLk1PREU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNUQkMgPQorCQkgICAgcEh0UGh5LT5maWVsZC5TVEJDOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0KKwkJICAgIHBIdFBoeS0+ZmllbGQuU2hvcnRHSTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJICAgIHBIdFBoeS0+ZmllbGQuTUNTOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0KKwkJICAgIHBIdFBoeS0+ZmllbGQuTU9ERTsKIAl9CiAKLQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlIDw9IFJBVEVfMTEpCi0JeworCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkgewogCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKIAkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7CiAJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKIAkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdOwotCQlpZiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID49IFJBVEVfNiAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlIDw9IFJBVEVfNTQpKQotCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXTt9Ci0JCWVsc2UKLQkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTt9CisJCWlmIChwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGUgPj0gUkFURV82CisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlIDw9IFJBVEVfNTQpKSB7CisJCQlwTWluSHRQaHktPmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXTsKKwkJfSBlbHNlIHsKKwkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWluVHhSYXRlOworCQl9CiAJfQogCiAJcEh0UGh5LT53b3JkID0gKHBNYXhIdFBoeS0+d29yZCk7Ci0JaWYgKGJMaW5rVXAgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCXsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwSHRQaHktPndvcmQ7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkID0gcE1heEh0UGh5LT53b3JkOwotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCA9IHBNaW5IdFBoeS0+d29yZDsKLQl9Ci0JZWxzZQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCQl7Ci0JCQljYXNlIFBIWV8xMUJHX01JWEVEOgotCQkJY2FzZSBQSFlfMTFCOgotCQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6CisJaWYgKGJMaW5rVXAgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKSB7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwSHRQaHktPndvcmQ7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgPQorCQkgICAgcE1heEh0UGh5LT53b3JkOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkID0KKwkJICAgIHBNaW5IdFBoeS0+d29yZDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpIHsKKwkJY2FzZSBQSFlfMTFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFCOgorCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOworCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7CisKKy8qI2lmZGVmICAgICAgICBXSUZJX1RFU1QgKi8KKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzExOworLyojZWxzZSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOyAqLworLyojZW5kaWYgKi8KKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUc6CisJCWNhc2UgUEhZXzExQToKKwkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExR05fTUlYRUQ6CisJCWNhc2UgUEhZXzExTl8yXzRHOgorCQljYXNlIFBIWV8xMUFOX01JWEVEOgorCQljYXNlIFBIWV8xMU5fNUc6CisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7CisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpIHsKIAkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfMTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPQorCQkJCSAgICBNT0RFX0NDSzsKIAkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzExOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQSFlfMTFHOgotCQkJY2FzZSBQSFlfMTFBOgotCQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMUdOX01JWEVEOgotCQkJY2FzZSBQSFlfMTFOXzJfNEc6Ci0JCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQkJY2FzZSBQSFlfMTFOXzVHOgorCQkJfSBlbHNlIHsKIAkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKIAkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8xOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKLQkJCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfNjsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDogLy8gZXJyb3IKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IFJBVEVfNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7Ci0JCQkJYnJlYWs7CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPQorCQkJCSAgICBNT0RFX09GRE07CisJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBlcnJvciAqLworCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7CisJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKKwkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7CisJCQlicmVhazsKIAkJfQotCQkvLwotCQkvLyBLZWVwIEJhc2ljIE1sbWUgUmF0ZS4KLQkJLy8KLQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOworCQkvKiAqLworCQkvKiBLZWVwIEJhc2ljIE1sbWUgUmF0ZS4gKi8KKwkJLyogKi8KKwkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9CisJCSAgICBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZDsKIAkJaWYgKHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW1JBVEVfMjRdOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1tSQVRFXzI0XTsKIAkJZWxzZQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gUkFURV8xOworCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBSQVRFXzE7CiAJCXBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKE1heERlc2lyZT0lZCwgTWF4U3VwcG9ydD0lZCwgTWF4VHhSYXRlPSVkLCBNaW5SYXRlPSVkLCBSYXRlIFN3aXRjaGluZyA9JWQpXG4iLAotCQkJIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXSwKLQkJCSAvKk9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkqLyphdXRvX3JhdGVfY3VyX3ApKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKFR4UmF0ZT0lZCwgUnRzUmF0ZT0lZCwgQmFzaWNSYXRlQml0bWFwPTB4JTA0bHgpXG4iLAotCQkJIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuUnRzUmF0ZV0sIEJhc2ljUmF0ZUJpdG1hcCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVVcGRhdGVUeFJhdGVzIChNbG1lVHJhbnNtaXQ9MHgleCwgTWluSFRQaHlNb2RlPSV4LCBNYXhIVFBoeU1vZGU9MHgleCwgSFRQaHlNb2RlPTB4JXgpXG4iLAotCQkJIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1pbkhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkICxwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkICkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKE1heERlc2lyZT0lZCwgTWF4U3VwcG9ydD0lZCwgTWF4VHhSYXRlPSVkLCBNaW5SYXRlPSVkLCBSYXRlIFN3aXRjaGluZyA9JWQpXG4iLAorCQkgIFJhdGVJZFRvTWJwc1tNYXhEZXNpcmVdLCBSYXRlSWRUb01icHNbTWF4U3VwcG9ydF0sCisJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sCisJCSAgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZV0sCisJCSAgLypPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpICovCisJCSAgKmF1dG9fcmF0ZV9jdXJfcCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIgTWxtZVVwZGF0ZVR4UmF0ZXMgKFR4UmF0ZT0lZCwgUnRzUmF0ZT0lZCwgQmFzaWNSYXRlQml0bWFwPTB4JTA0bHgpXG4iLAorCQkgIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdLAorCQkgIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIk1sbWVVcGRhdGVUeFJhdGVzIChNbG1lVHJhbnNtaXQ9MHgleCwgTWluSFRQaHlNb2RlPSV4LCBNYXhIVFBoeU1vZGU9MHgleCwgSFRQaHlNb2RlPTB4JXgpXG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NYXhIVFBoeU1vZGUud29yZCwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkKSk7CiB9CiAKIC8qCkBAIC0zMTk4LDE2OCArMzI4NiwxOTYgQEAKIAkJVGhpcyBmdW5jdGlvbiB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nLgogCQlJbnB1dCBXY2lkIHZhbHVlIGlzIHZhbGlkIGZvciAyIGNhc2UgOgogCQkxLiBpdCdzIHVzZWQgZm9yIFN0YXRpb24gaW4gaW5mcmEgbW9kZSB0aGF0IGNvcHkgQVAgcmF0ZSB0byBNYWN0YWJsZS4KLQkJMi4gT1IgU3RhdGlvbiAJaW4gYWRob2MgbW9kZSB0byBjb3B5IHBlZXIncyBIVCByYXRlIHRvIE1hY3RhYmxlLgorCQkyLiBPUiBTdGF0aW9uCWluIGFkaG9jIG1vZGUgdG8gY29weSBwZWVyJ3MgSFQgcmF0ZSB0byBNYWN0YWJsZS4KIAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCit2b2lkIE1sbWVVcGRhdGVIdFR4UmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBhcGlkeCkKIHsKLQlVQ0hBUglTdGJjTWNzOyAvL2osIFN0YmNNY3MsIGJpdG1hc2s7Ci0JQ0hBUiAJaTsgLy8gMyozCi0JUlRfSFRfQ0FQQUJJTElUWSAJKnBSdEh0Q2FwID0gTlVMTDsKLQlSVF9IVF9QSFlfSU5GTwkJKnBBY3RpdmVIdFBoeSA9IE5VTEw7Ci0JVUxPTkcJCUJhc2ljTUNTOwotCVVDSEFSIGosIGJpdG1hc2s7Ci0JUFJUX0hUX1BIWV9JTkZPCQkJcERlc2lyZUh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwSHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBNYXhIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcE1pbkh0UGh5ID0gTlVMTDsKLQlCT09MRUFOIAkJCQkqYXV0b19yYXRlX2N1cl9wOworCXU4IFN0YmNNY3M7CQkvKmosIFN0YmNNY3MsIGJpdG1hc2s7ICovCisJY2hhciBpOwkJCS8qIDMqMyAqLworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5ICpwUnRIdENhcCA9IE5VTEw7CisJc3RydWN0IHJ0X2h0X3BoeV9pbmZvICpwQWN0aXZlSHRQaHkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgQmFzaWNNQ1M7CisJdTggaiwgYml0bWFzazsKKwlzdHJ1Y3QgcnRfaHRfcGh5X2luZm8gKnBEZXNpcmVIdFBoeSA9IE5VTEw7CisJUEhUVFJBTlNNSVRfU0VUVElORyBwSHRQaHkgPSBOVUxMOworCVBIVFRSQU5TTUlUX1NFVFRJTkcgcE1heEh0UGh5ID0gTlVMTDsKKwlQSFRUUkFOU01JVF9TRVRUSU5HIHBNaW5IdFBoeSA9IE5VTEw7CisJQk9PTEVBTiAqYXV0b19yYXRlX2N1cl9wOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPT09PiBcbiIpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lVXBkYXRlSHRUeFJhdGVzPT09PiBcbiIpKTsKIAogCWF1dG9fcmF0ZV9jdXJfcCA9IE5VTEw7CiAKIAl7Ci0JCXBEZXNpcmVIdFBoeQk9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQlwQWN0aXZlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKLQkJcEh0UGh5IAkJPSAmcEFkLT5TdGFDZmcuSFRQaHlNb2RlOwotCQlwTWF4SHRQaHkJPSAmcEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlOwotCQlwTWluSHRQaHkJPSAmcEFkLT5TdGFDZmcuTWluSFRQaHlNb2RlOworCQlwRGVzaXJlSHRQaHkgPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKKwkJcEFjdGl2ZUh0UGh5ID0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87CisJCXBIdFBoeSA9ICZwQWQtPlN0YUNmZy5IVFBoeU1vZGU7CisJCXBNYXhIdFBoeSA9ICZwQWQtPlN0YUNmZy5NYXhIVFBoeU1vZGU7CisJCXBNaW5IdFBoeSA9ICZwQWQtPlN0YUNmZy5NaW5IVFBoeU1vZGU7CiAKIAkJYXV0b19yYXRlX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwogCX0KIAotCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpCi0JeworCWlmICgoQURIT0NfT04ocEFkKSB8fCBJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIHsKIAkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQogCQkJcmV0dXJuOwogCiAJCXBSdEh0Q2FwID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5OwogCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mbzsKLQkJU3RiY01jcyA9IChVQ0hBUilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKLQkJQmFzaWNNQ1MgPXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzBdKyhwQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCVN0YmNNY3MgPSAodTgpcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8zLlN0YmNNY3M7CisJCUJhc2ljTUNTID0KKwkJICAgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzBdICsKKwkJICAgIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFsxXSA8PCA4KSArIChTdGJjTWNzIDw8IDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykKKwkJICAgICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQogCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19VU0U7CiAJCWVsc2UKIAkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlpZiAocERlc2lyZUh0UGh5LT5iSHRFbmFibGUgPT0gRkFMU0UpCiAJCQlyZXR1cm47CiAKIAkJcFJ0SHRDYXAgPSAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5OwotCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8zLlN0YmNNY3M7Ci0JCUJhc2ljTUNTID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFswXSsocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCisJCVN0YmNNY3MgPSAodTgpcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKKwkJQmFzaWNNQ1MgPQorCQkgICAgcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFswXSArCisJCSAgICAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFsxXSA8PCA4KSArIChTdGJjTWNzIDw8IDE2KTsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykKKwkJICAgICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQogCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19VU0U7CiAJCWVsc2UKIAkJCXBNYXhIdFBoeS0+ZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKIAl9CiAKLQkvLyBEZWNpZGUgTUFYIGh0IHJhdGUuCisJLyogRGVjaWRlIE1BWCBodCByYXRlLiAqLwogCWlmICgocFJ0SHRDYXAtPkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKIAkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVEdSRUVORklFTEQ7CiAJZWxzZQogCQlwTWF4SHRQaHktPmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwogCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCisJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKQorCSAgICAmJiAocFJ0SHRDYXAtPkNoYW5uZWxXaWR0aCkpCiAJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV180MDsKIAllbHNlCiAJCXBNYXhIdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKIAotICAgIGlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQotCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPSAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3IyMCAmIHBSdEh0Q2FwLT5TaG9ydEdJZm9yMjApOworCWlmIChwTWF4SHRQaHktPmZpZWxkLkJXID09IEJXXzIwKQorCQlwTWF4SHRQaHktPmZpZWxkLlNob3J0R0kgPQorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgJiBwUnRIdENhcC0+CisJCSAgICAgU2hvcnRHSWZvcjIwKTsKIAllbHNlCi0JCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3I0MCk7CisJCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9CisJCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCAmIHBSdEh0Q2FwLT4KKwkJICAgICBTaG9ydEdJZm9yNDApOwogCi0JZm9yIChpPTIzOyBpPj0wOyBpLS0pIC8vIDMqMworCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKSB7CisJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7CisJfQorCisJZm9yIChpID0gMjM7IGkgPj0gMDsgaS0tKQkvKiAzKjMgKi8KIAl7Ci0JCWogPSBpLzg7Ci0JCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKKwkJaiA9IGkgLyA4OworCQliaXRtYXNrID0gKDEgPDwgKGkgLSAoaiAqIDgpKSk7CiAKLQkJaWYgKChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQotCQl7CisJCWlmICgocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKQorCQkgICAgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpIHsKIAkJCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gaTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKGk9PTApCisJCWlmIChpID09IDApCiAJCQlicmVhazsKIAl9CiAKLQkvLyBDb3B5IE1JTiBodCByYXRlLiAgcnQyODYwPz8/CisJLyogQ29weSBNSU4gaHQgcmF0ZS4gIHJ0Mjg2MD8/PyAqLwogCXBNaW5IdFBoeS0+ZmllbGQuQlcgPSBCV18yMDsKIAlwTWluSHRQaHktPmZpZWxkLk1DUyA9IDA7CiAJcE1pbkh0UGh5LT5maWVsZC5TVEJDID0gMDsKIAlwTWluSHRQaHktPmZpZWxkLlNob3J0R0kgPSAwOwotCS8vSWYgU1RBIGFzc2lnbnMgZml4ZWQgcmF0ZS4gdXBkYXRlIHRvIGZpeGVkIGhlcmUuCi0JaWYgKCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKQotCXsKLQkJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzRdICE9IDApCi0JCXsKKwkvKklmIFNUQSBhc3NpZ25zIGZpeGVkIHJhdGUuIHVwZGF0ZSB0byBmaXhlZCBoZXJlLiAqLworCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpKSB7CisJCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKSB7CiAJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IDMyOwogCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gVXNlIEZpeGVkIE1DUyA9ICVkXG4iLHBNaW5IdFBoeS0+ZmllbGQuTUNTKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBVc2UgRml4ZWQgTUNTID0gJWRcbiIsCisJCQkJICBwTWluSHRQaHktPmZpZWxkLk1DUykpOwogCQl9CiAKLQkJZm9yIChpPTIzOyAoQ0hBUilpID49IDA7IGktLSkgLy8gMyozCisJCWZvciAoaSA9IDIzOyAoY2hhcilpID49IDA7IGktLSkJLyogMyozICovCiAJCXsKLQkJCWogPSBpLzg7Ci0JCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7Ci0JCQlpZiAoIChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwQWN0aXZlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQotCQkJeworCQkJaiA9IGkgLyA4OworCQkJYml0bWFzayA9ICgxIDw8IChpIC0gKGogKiA4KSkpOworCQkJaWYgKChwRGVzaXJlSHRQaHktPk1DU1NldFtqXSAmIGJpdG1hc2spCisJCQkgICAgJiYgKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpIHsKIAkJCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IGk7CiAJCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKGk9PTApCisJCQlpZiAoaSA9PSAwKQogCQkJCWJyZWFrOwogCQl9CiAJfQogCi0JLy8gRGVjaWRlIGh0IHJhdGUKKwkvKiBEZWNpZGUgaHQgcmF0ZSAqLwogCXBIdFBoeS0+ZmllbGQuU1RCQyA9IHBNYXhIdFBoeS0+ZmllbGQuU1RCQzsKIAlwSHRQaHktPmZpZWxkLkJXID0gcE1heEh0UGh5LT5maWVsZC5CVzsKIAlwSHRQaHktPmZpZWxkLk1PREUgPSBwTWF4SHRQaHktPmZpZWxkLk1PREU7CiAJcEh0UGh5LT5maWVsZC5NQ1MgPSBwTWF4SHRQaHktPmZpZWxkLk1DUzsKIAlwSHRQaHktPmZpZWxkLlNob3J0R0kgPSBwTWF4SHRQaHktPmZpZWxkLlNob3J0R0k7CiAKLQkvLyB1c2UgZGVmYXVsdCBub3cuIHJ0Mjg2MAorCS8qIHVzZSBkZWZhdWx0IG5vdy4gcnQyODYwICovCiAJaWYgKHBEZXNpcmVIdFBoeS0+TUNTU2V0WzBdICE9IDB4ZmYpCiAJCSphdXRvX3JhdGVfY3VyX3AgPSBGQUxTRTsKIAllbHNlCiAJCSphdXRvX3JhdGVfY3VyX3AgPSBUUlVFOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVIdFR4UmF0ZXM8LS0tLkFNc2R1U2l6ZSA9ICVkICBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemUgKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUWDogTUNTWzBdID0gJXggKGNob29zZSAlZCksIEJXID0gJWQsIFNob3J0R0kgPSAlZCwgTU9ERSA9ICVkLCAgXG4iLCBwQWN0aXZlSHRQaHktPk1DU1NldFswXSxwSHRQaHktPmZpZWxkLk1DUywKLQkJcEh0UGh5LT5maWVsZC5CVywgcEh0UGh5LT5maWVsZC5TaG9ydEdJLCBwSHRQaHktPmZpZWxkLk1PREUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM8PT09IFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIgTWxtZVVwZGF0ZUh0VHhSYXRlczwtLS0uQU1zZHVTaXplID0gJWQgIFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlRYOiBNQ1NbMF0gPSAleCAoY2hvb3NlICVkKSwgQlcgPSAlZCwgU2hvcnRHSSA9ICVkLCBNT0RFID0gJWQsICBcbiIsCisJCSAgcEFjdGl2ZUh0UGh5LT5NQ1NTZXRbMF0sIHBIdFBoeS0+ZmllbGQuTUNTLCBwSHRQaHktPmZpZWxkLkJXLAorCQkgIHBIdFBoeS0+ZmllbGQuU2hvcnRHSSwgcEh0UGh5LT5maWVsZC5NT0RFKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gXG4iKSk7CiB9CiAKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEJBVGFibGVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2JhX3RhYmxlICpUYWIpCiB7Ci0JUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCk7CisJaW50IGk7CisKKwlUYWItPm51bUFzT3JpZ2luYXRvciA9IDA7CisJVGFiLT5udW1Bc1JlY2lwaWVudCA9IDA7CisJVGFiLT5udW1Eb25lT3JpZ2luYXRvciA9IDA7CisJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykgeworCQlUYWItPkJBUmVjRW50cnlbaV0uUkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOworCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKFRhYi0+QkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspIHsKKwkJVGFiLT5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJfQogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgTWxtZVJhZGlvT2ZmKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlSVDI4WFhfTUxNRV9SQURJT19PTihwQWQpOworCVJUTVBfTUxNRV9SQURJT19PRkYocEFkKTsKIH0KIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gYnNzX3RhYmxlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBNbG1lUmFkaW9PbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJUlRNUF9NTE1FX1JBRElPX09OKHBBZCk7Cit9CiAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIGJzc190YWJsZS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qISBcYnJpZWYgaW5pdGlhbGl6ZSBCU1MgdGFibGUKICAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSB0YWJsZQpAQCAtMzM3MSwzNyArMzQ4NywxNSBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVZPSUQgQnNzVGFibGVJbml0KAotCUlOIEJTU19UQUJMRSAqVGFiKQordm9pZCBCc3NUYWJsZUluaXQoc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiKQogewogCWludCBpOwogCiAJVGFiLT5Cc3NOciA9IDA7Ci0gICAgVGFiLT5Cc3NPdmVybGFwTnIgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JTU19UQUJMRTsgaSsrKQotCXsKLQkJTmRpc1plcm9NZW1vcnkoJlRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJVGFiLT5Cc3NFbnRyeVtpXS5Sc3NpID0gLTEyNzsJLy8gaW5pdGlhbCB0aGUgcnNzaSBhcyBhIG1pbmltdW0gdmFsdWUKLQl9Ci19Ci0KLVZPSUQgQkFUYWJsZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gQkFfVEFCTEUgKlRhYikKLXsKLQlpbnQgaTsKLQotCVRhYi0+bnVtQXNPcmlnaW5hdG9yID0gMDsKLQlUYWItPm51bUFzUmVjaXBpZW50ID0gMDsKLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJVGFiLT5CQVJlY0VudHJ5W2ldLlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfTk9ORTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJihUYWItPkJBUmVjRW50cnlbaV0uUnhSZVJpbmdMb2NrKSk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JBX09SSV9UQUJMRTsgaSsrKQotCXsKLQkJVGFiLT5CQU9yaUVudHJ5W2ldLk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CisJVGFiLT5Cc3NPdmVybGFwTnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX0JTU19UQUJMRTsgaSsrKSB7CisJCU5kaXNaZXJvTWVtb3J5KCZUYWItPkJzc0VudHJ5W2ldLCBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOworCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvKiBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZSAqLwogCX0KIH0KIApAQCAtMzQxNiw5NyArMzUxMCwxMDIgQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1VTE9ORyBCc3NUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIHBCc3NpZCwKLQlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgQnNzVGFibGVTZWFyY2goc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLCB1OCAqcEJzc2lkLCB1OCBDaGFubmVsKQogewotCVVDSEFSIGk7CisJdTggaTsKIAotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JewotCQkvLwotCQkvLyBTb21lIEFQIHRoYXQgc3VwcG9ydCBBL0IvRyBtb2RlIHRoYXQgbWF5IHVzZWQgdGhlIHNhbWUgQlNTSUQgb24gMTFBIGFuZCAxMUIvRy4KLQkJLy8gV2Ugc2hvdWxkIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZS4KLQkJLy8KKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKSB7CisJCS8qICovCisJCS8qIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLiAqLworCQkvKiBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLiAqLworCQkvKiAqLwogCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgotCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkKLQkJeworCQkgICAgICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJICAgIE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpIHsKIAkJCXJldHVybiBpOwogCQl9CiAJfQotCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpQlNTX05PVF9GT1VORDsKIH0KIAotVUxPTkcgQnNzU3NpZFRhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgcEJzc2lkLAotCUlOIFBVQ0hBUgkgcFNzaWQsCi0JSU4gVUNIQVIJIFNzaWRMZW4sCi0JSU4gVUNIQVIJIENoYW5uZWwpCit1bnNpZ25lZCBsb25nIEJzc1NzaWRUYWJsZVNlYXJjaChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsCisJCQkgdTggKnBCc3NpZCwKKwkJCSB1OCAqcFNzaWQsIHU4IFNzaWRMZW4sIHU4IENoYW5uZWwpCiB7Ci0JVUNIQVIgaTsKKwl1OCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCS8vCi0JCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgotCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgotCQkvLworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspIHsKKwkJLyogKi8KKwkJLyogU29tZSBBUCB0aGF0IHN1cHBvcnQgQS9CL0cgbW9kZSB0aGF0IG1heSB1c2VkIHRoZSBzYW1lIEJTU0lEIG9uIDExQSBhbmQgMTFCL0cuICovCisJCS8qIFdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aGlzIGNhc2UuICovCisJCS8qICovCiAJCWlmICgoKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPD0gMTQpICYmIChDaGFubmVsIDw9IDE0KSkgfHwKLQkJCSAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCi0JCQlNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCi0JCQlTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpCi0JCXsKKwkJICAgICAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA+IDE0KSAmJiAoQ2hhbm5lbCA+IDE0KSkpICYmCisJCSAgICBNQUNfQUREUl9FUVVBTChUYWItPkJzc0VudHJ5W2ldLkJzc2lkLCBwQnNzaWQpICYmCisJCSAgICBTU0lEX0VRVUFMKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsCisJCQkgICAgICAgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkgewogCQkJcmV0dXJuIGk7CiAJCX0KIAl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOworCXJldHVybiAodW5zaWduZWQgbG9uZylCU1NfTk9UX0ZPVU5EOwogfQogCi1VTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUgkgQnNzaWQsCi0JSU4gUFVDSEFSCSBwU3NpZCwKLQlJTiBVQ0hBUgkgU3NpZExlbiwKLQlJTiBVQ0hBUgkgQ2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgQnNzVGFibGVTZWFyY2hXaXRoU1NJRChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsCisJCQkgICAgIHU4ICpCc3NpZCwKKwkJCSAgICAgdTggKnBTc2lkLAorCQkJICAgICB1OCBTc2lkTGVuLCB1OCBDaGFubmVsKQogewotCVVDSEFSIGk7CisJdTggaTsKIAotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspIHsKIAkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAotCQkJKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgotCQkJTUFDX0FERFJfRVFVQUwoJihUYWItPkJzc0VudHJ5W2ldLkJzc2lkKSwgQnNzaWQpICYmCi0JCQkoU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pIHx8Ci0JCQkoTmRpc0VxdWFsTWVtb3J5KHBTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikpIHx8Ci0JCQkoTmRpc0VxdWFsTWVtb3J5KFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpKSkKLQkJeworCQkgICAgICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID4gMTQpICYmIChDaGFubmVsID4gMTQpKSkgJiYKKwkJICAgIE1BQ19BRERSX0VRVUFMKCYoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCksIEJzc2lkKSAmJgorCQkgICAgKFNTSURfRVFVQUwKKwkJICAgICAocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwKKwkJICAgICAgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKQorCQkgICAgIHx8IChOZGlzRXF1YWxNZW1vcnkocFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSkKKwkJICAgICB8fAorCQkgICAgIChOZGlzRXF1YWxNZW1vcnkKKwkJICAgICAgKFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgWmVyb1NzaWQsCisJCSAgICAgICBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKSkpIHsKIAkJCXJldHVybiBpOwogCQl9CiAJfQotCXJldHVybiAoVUxPTkcpQlNTX05PVF9GT1VORDsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpQlNTX05PVF9GT1VORDsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gT1VUCUJTU19UQUJMRSAqVGFiLAotCUlOCQlQVUNIQVIJICBwQnNzaWQsCi0JSU4JCVVDSEFSCSAgQ2hhbm5lbCkKK3Vuc2lnbmVkIGxvbmcgQnNzU3NpZFRhYmxlU2VhcmNoQnlTU0lEKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSAgICAgICB1OCAqcFNzaWQsIHU4IFNzaWRMZW4pCiB7Ci0JVUNIQVIgaSwgajsKKwl1OCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykgeworCQlpZiAoU1NJRF9FUVVBTAorCQkgICAgKHBTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W2ldLlNzaWQsCisJCSAgICAgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkgeworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKUJTU19OT1RfRk9VTkQ7Cit9CisKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBCc3NUYWJsZURlbGV0ZUVudHJ5KHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSB1OCAqcEJzc2lkLCB1OCBDaGFubmVsKQoreworCXU4IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKSB7CiAJCWlmICgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsID09IENoYW5uZWwpICYmCi0JCQkoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpCi0JCXsKLQkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtqXSksICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCSAgICAoTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkpIHsKKwkJCWZvciAoaiA9IGk7IGogPCBUYWItPkJzc05yIC0gMTsgaisrKSB7CisJCQkJTmRpc01vdmVNZW1vcnkoJihUYWItPkJzc0VudHJ5W2pdKSwKKwkJCQkJICAgICAgICYoVGFiLT5Cc3NFbnRyeVtqICsgMV0pLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJCX0KLQkJCU5kaXNaZXJvTWVtb3J5KCYoVGFiLT5Cc3NFbnRyeVtUYWItPkJzc05yIC0gMV0pLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJCQlOZGlzWmVyb01lbW9yeSgmKFRhYi0+QnNzRW50cnlbVGFiLT5Cc3NOciAtIDFdKSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJCVRhYi0+QnNzTnIgLT0gMTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMzUyMiwyNSArMzYyMSwyNCBAQAogCS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJQkFfT1JJX0VOVFJZCSpwQkFPUklFbnRyeSkKK3ZvaWQgQkFUYWJsZURlbGV0ZU9SSUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9iYV9vcmlfZW50cnkgKnBCQU9SSUVudHJ5KQogewogCi0JaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkKLQl7CisJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzICE9IE9yaWdpbmF0b3JfTk9ORSkgewogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JCWlmIChwQkFPUklFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKKwkJaWYgKHBCQU9SSUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkgewogCQkJcEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciAtPSAxOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZURlbGV0ZU9SSUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLCBwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQpKTsKLQkJCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQkFUYWJsZURlbGV0ZU9SSUVudHJ5IG51bUFzT3JpZ2luYXRvcj0gJWxkXG4iLAorCQkJCSAgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7CisJCQkvKiBFcmFzZSBCaXRtYXAgZmxhZy4gKi8KIAkJfQotCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDE8PChwQkFPUklFbnRyeS0+VElEKSApKTsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEJBT1JJRW50cnktPlRJRF0gPSAwOwkvLyBJZiBTVEEgbW9kZSwgIGVyYXNlIGZsYWcgaGVyZQorCQlwQWQtPk1hY1RhYi5Db250ZW50W3BCQU9SSUVudHJ5LT5XY2lkXS5UWEJBYml0bWFwICY9ICh+KDEgPDwgKHBCQU9SSUVudHJ5LT5USUQpKSk7CS8qIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlICovCisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLkJBT3JpV2NpZEFycmF5W3BCQU9SSUVudHJ5LT5USURdID0gMDsJLyogSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUgKi8KIAkJcEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7CiAJCXBCQU9SSUVudHJ5LT5Ub2tlbiA9IDE7Ci0JCS8vIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLgorCQkvKiBOb3QgY2xlYXIgU2VxdWVuY2UgaGVyZS4gKi8KIAkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwogCX0KIH0KQEAgLTM1NTQsMTkwICszNjUyLDE2NCBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVZPSUQgQnNzRW50cnlTZXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIEJTU19FTlRSWSAqcEJzcywKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIFBDRl9QQVJNIHBDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQordm9pZCBCc3NFbnRyeVNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3MsIHU4ICpwQnNzaWQsIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1MTYgQmVhY29uUGVyaW9kLCBzdHJ1Y3QgcnRfY2ZfcGFybSAqIHBDZlBhcm0sIHUxNiBBdGltV2luLCB1MTYgQ2FwYWJpbGl0eUluZm8sIHU4IFN1cFJhdGVbXSwgdTggU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkgdTggSHRDYXBhYmlsaXR5TGVuLAorCQkgdTggQWRkSHRJbmZvTGVuLAorCQkgdTggTmV3RXh0Q2hhbk9mZnNldCwKKwkJIHU4IENoYW5uZWwsCisJCSBjaGFyIFJzc2ksCisJCSBJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwkJIHU4IENraXBGbGFnLAorCQkgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLAorCQkgc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gKnBRb3NDYXBhYmlsaXR5LAorCQkgc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtICpwUWJzc0xvYWQsCisJCSB1MTYgTGVuZ3RoVklFLCBzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFKQogewogCUNPUFlfTUFDX0FERFIocEJzcy0+QnNzaWQsIHBCc3NpZCk7Ci0JLy8gRGVmYXVsdCBIaWRkZW4gU1NJRCB0byBiZSBUUlVFLCBpdCB3aWxsIGJlIHR1cm5lZCB0byBGQUxTRSBhZnRlciBjb3BpbmcgU1NJRAorCS8qIERlZmF1bHQgSGlkZGVuIFNTSUQgdG8gYmUgVFJVRSwgaXQgd2lsbCBiZSB0dXJuZWQgdG8gRkFMU0UgYWZ0ZXIgY29waW5nIFNTSUQgKi8KIAlwQnNzLT5IaWRkZW4gPSAxOwotCWlmIChTc2lkTGVuID4gMCkKLQl7Ci0JCS8vIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwCi0JCS8vIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsCi0JCS8vIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4KLQkJLy8gV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZQotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKQotCQl7Ci0JCSAgICBOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCWlmIChTc2lkTGVuID4gMCkgeworCQkvKiBGb3IgaGlkZGVuIFNTSUQgQVAsIGl0IG1pZ2h0IHNlbmQgYmVhY29uIHdpdGggU1NJRCBsZW4gZXF1YWwgdG8gMCAqLworCQkvKiBPciBzZW5kIGJlYWNvbiAvcHJvYmUgcmVzcG9uc2Ugd2l0aCBTU0lEIGxlbiBtYXRjaGluZyByZWFsIFNTSUQgbGVuZ3RoLCAqLworCQkvKiBidXQgU1NJRCBpcyBhbGwgemVyby4gc3VjaCBhcyAiMDAtMDAtMDAtMDAiIHdpdGggbGVuZ3RoIDQuICovCisJCS8qIFdlIGhhdmUgdG8gcHJldmVudCB0aGlzIGNhc2Ugb3ZlcndyaXRlIGNvcnJlY3QgdGFibGUgKi8KKwkJaWYgKE5kaXNFcXVhbE1lbW9yeShTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikgPT0gMCkgeworCQkJTmRpc1plcm9NZW1vcnkocEJzcy0+U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKIAkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOwogCQkJcEJzcy0+U3NpZExlbiA9IFNzaWRMZW47CiAJCQlwQnNzLT5IaWRkZW4gPSAwOwogCQl9Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJcEJzcy0+U3NpZExlbiA9IDA7CiAJcEJzcy0+QnNzVHlwZSA9IEJzc1R5cGU7CiAJcEJzcy0+QmVhY29uUGVyaW9kID0gQmVhY29uUGVyaW9kOwotCWlmIChCc3NUeXBlID09IEJTU19JTkZSQSkKLQl7Ci0JCWlmIChwQ2ZQYXJtLT5iVmFsaWQpCi0JCXsKKwlpZiAoQnNzVHlwZSA9PSBCU1NfSU5GUkEpIHsKKwkJaWYgKHBDZlBhcm0tPmJWYWxpZCkgewogCQkJcEJzcy0+Q2ZwQ291bnQgPSBwQ2ZQYXJtLT5DZnBDb3VudDsKIAkJCXBCc3MtPkNmcFBlcmlvZCA9IHBDZlBhcm0tPkNmcFBlcmlvZDsKIAkJCXBCc3MtPkNmcE1heER1cmF0aW9uID0gcENmUGFybS0+Q2ZwTWF4RHVyYXRpb247CiAJCQlwQnNzLT5DZnBEdXJSZW1haW5pbmcgPSBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmc7CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQnNzLT5BdGltV2luID0gQXRpbVdpbjsKIAl9CiAKIAlwQnNzLT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOwotCS8vIFRoZSBwcml2YWN5IGJpdCBpbmRpY2F0ZSBzZWN1cml0eSBpcyBPTiwgaXQgbWFpZ2h0IGJlIFdFUCwgVEtJUCBvciBBRVMKLQkvLyBDb21iaW5lIHdpdGggQXV0aE1vZGUsIHRoZXkgd2lsbCBkZWNpZGUgdGhlIGNvbm5lY3Rpb24gbWV0aG9kcy4KKwkvKiBUaGUgcHJpdmFjeSBiaXQgaW5kaWNhdGUgc2VjdXJpdHkgaXMgT04sIGl0IG1haWdodCBiZSBXRVAsIFRLSVAgb3IgQUVTICovCisJLyogQ29tYmluZSB3aXRoIEF1dGhNb2RlLCB0aGV5IHdpbGwgZGVjaWRlIHRoZSBjb25uZWN0aW9uIG1ldGhvZHMuICovCiAJcEJzcy0+UHJpdmFjeSA9IENBUF9JU19QUklWQUNZX09OKHBCc3MtPkNhcGFiaWxpdHlJbmZvKTsKIAlBU1NFUlQoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CiAJaWYgKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCiAJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwogCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOworCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5TdXBSYXRlLCBTdXBSYXRlLAorCQkJICAgICAgIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKIAlwQnNzLT5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKIAlBU1NFUlQoRXh0UmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7CiAJTmRpc01vdmVNZW1vcnkocEJzcy0+RXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7Ci0JTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKLQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOwogCXBCc3MtPk5ld0V4dENoYW5PZmZzZXQgPSBOZXdFeHRDaGFuT2Zmc2V0OwogCXBCc3MtPkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwogCXBCc3MtPkNoYW5uZWwgPSBDaGFubmVsOwogCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gQ2hhbm5lbDsKIAlwQnNzLT5Sc3NpID0gUnNzaTsKLQkvLyBVcGRhdGUgQ2tpcEZsYWcuIGlmIG5vdCBleGlzdHMsIHRoZSB2YWx1ZSBpcyAweDAKKwkvKiBVcGRhdGUgQ2tpcEZsYWcuIGlmIG5vdCBleGlzdHMsIHRoZSB2YWx1ZSBpcyAweDAgKi8KIAlwQnNzLT5Da2lwRmxhZyA9IENraXBGbGFnOwogCi0JLy8gTmV3IGZvciBtaWNyb3NvZnQgRml4ZWQgSUVzCisJLyogTmV3IGZvciBtaWNyb3NvZnQgRml4ZWQgSUVzICovCiAJTmRpc01vdmVNZW1vcnkocEJzcy0+Rml4SUVzLlRpbWVzdGFtcCwgJlRpbWVTdGFtcCwgOCk7CiAJcEJzcy0+Rml4SUVzLkJlYWNvbkludGVydmFsID0gQmVhY29uUGVyaW9kOwogCXBCc3MtPkZpeElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKIAotCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFZhcmlhYmxlIElFcwotCWlmIChMZW5ndGhWSUUgIT0gMCkKLQl7CisJLyogTmV3IGZvciBtaWNyb3NvZnQgVmFyaWFibGUgSUVzICovCisJaWYgKExlbmd0aFZJRSAhPSAwKSB7CiAJCXBCc3MtPlZhcklFTGVuID0gTGVuZ3RoVklFOwogCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5WYXJJRXMsIHBWSUUsIHBCc3MtPlZhcklFTGVuKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQnNzLT5WYXJJRUxlbiA9IDA7CiAJfQogCiAJcEJzcy0+QWRkSHRJbmZvTGVuID0gMDsKIAlwQnNzLT5IdENhcGFiaWxpdHlMZW4gPSAwOwotCi0JaWYgKEh0Q2FwYWJpbGl0eUxlbj4gMCkKLQl7CisJaWYgKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHsKIAkJcEJzcy0+SHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOwotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4pOwotCQlpZiAoQWRkSHRJbmZvTGVuID4gMCkKLQkJeworCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+SHRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LAorCQkJICAgICAgIEh0Q2FwYWJpbGl0eUxlbik7CisJCWlmIChBZGRIdEluZm9MZW4gPiAwKSB7CiAJCQlwQnNzLT5BZGRIdEluZm9MZW4gPSBBZGRIdEluZm9MZW47Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+QWRkSHRJbmZvLCBwQWRkSHRJbmZvLCBBZGRIdEluZm9MZW4pOworCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkFkZEh0SW5mbywgcEFkZEh0SW5mbywKKwkJCQkgICAgICAgQWRkSHRJbmZvTGVuKTsKIAotCSAJCQlpZiAoKHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuID4gMikmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JIAkJCXsKLQkgCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gLSAyOwotCSAJCQl9Ci0JIAkJCWVsc2UgaWYgKChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJCQl7Ci0JCSAJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPSBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiArIDI7Ci0JCQkJfQorCQkJaWYgKChwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiA+IDIpCisJCQkgICAgJiYgKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09CisJCQkJRVhUQ0hBX0JFTE9XKQorCQkJICAgICYmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09CisJCQkJQldfNDApKSB7CisJCQkJcEJzcy0+Q2VudHJhbENoYW5uZWwgPQorCQkJCSAgICBwQWRkSHRJbmZvLT5Db250cm9sQ2hhbiAtIDI7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09CisJCQkJIEVYVENIQV9BQk9WRSkKKwkJCQkmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PQorCQkJCSAgICBCV180MCkpIHsKKwkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9CisJCQkJICAgIHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuICsgMjsKKwkJCX0KIAkJfQogCX0KIAogCUJzc0NpcGhlclBhcnNlKHBCc3MpOwogCi0JLy8gbmV3IGZvciBRT1MKKwkvKiBuZXcgZm9yIFFPUyAqLwogCWlmIChwRWRjYVBhcm0pCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5FZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5FZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOwogCWVsc2UKIAkJcEJzcy0+RWRjYVBhcm0uYlZhbGlkID0gRkFMU0U7CiAJaWYgKHBRb3NDYXBhYmlsaXR5KQotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UW9zQ2FwYWJpbGl0eSwgcFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5Rb3NDYXBhYmlsaXR5LCBwUW9zQ2FwYWJpbGl0eSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0pKTsKIAllbHNlCiAJCXBCc3MtPlFvc0NhcGFiaWxpdHkuYlZhbGlkID0gRkFMU0U7CiAJaWYgKHBRYnNzTG9hZCkKLQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPlFic3NMb2FkLCBwUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOworCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UWJzc0xvYWQsIHBRYnNzTG9hZCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtKSk7CiAJZWxzZQogCQlwQnNzLT5RYnNzTG9hZC5iVmFsaWQgPSBGQUxTRTsKIAogCXsKLQkJUEVJRF9TVFJVQ1QgICAgIHBFaWQ7Ci0JCVVTSE9SVCAgICAgICAgICBMZW5ndGggPSAwOwotCisJCXN0cnVjdCBydF9laWQgKiBwRWlkOworCQl1MTYgTGVuZ3RoID0gMDsKIAogCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+V3BhSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKIAkJTmRpc1plcm9NZW1vcnkoJnBCc3MtPlJzbklFLklFWzBdLCBNQVhfQ1VTVE9NX0xFTik7Ci0KLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKLQotCQl3aGlsZSAoKExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbikgPD0gTGVuZ3RoVklFKQotCQl7Ci0JCQlzd2l0Y2gocEVpZC0+RWlkKQotCQkJewotCQkJCWNhc2UgSUVfV1BBOgotCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXUEFfT1VJLCA0KSkKLQkJCQkJewotCQkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKQotCQkJCQkJewotCQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gMDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXBCc3MtPldwYUlFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPldwYUlFLklFLCBwRWlkLCBwQnNzLT5XcGFJRS5JRUxlbik7CisJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSBwVklFOworCQl3aGlsZSAoKExlbmd0aCArIDIgKyAodTE2KXBFaWQtPkxlbikgPD0gTGVuZ3RoVklFKSB7CisJCQlzd2l0Y2ggKHBFaWQtPkVpZCkgeworCQkJY2FzZSBJRV9XUEE6CisJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpIHsKKwkJCQkJaWYgKChwRWlkLT5MZW4gKyAyKSA+IE1BWF9DVVNUT01fTEVOKSB7CisJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IDA7CisJCQkJCQlicmVhazsKIAkJCQkJfQotCQkJCQlicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElFX1JTTjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQotCQkJCQl7Ci0JCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pCi0JCQkJCQl7Ci0JCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSAwOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJcEJzcy0+UnNuSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsIHBCc3MtPlJzbklFLklFTGVuKTsKLQkJCX0KKwkJCQkJcEJzcy0+V3BhSUUuSUVMZW4gPSBwRWlkLT5MZW4gKyAyOworCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5XcGFJRS5JRSwgcEVpZCwKKwkJCQkJCSAgICAgICBwQnNzLT5XcGFJRS5JRUxlbik7CisJCQkJfQogCQkJCWJyZWFrOwotICAgICAgICAgICAgfQotCQkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIChVU0hPUlQpcEVpZC0+TGVuOyAgLy8gRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0KLQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCQkJY2FzZSBJRV9SU046CisJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeQorCQkJCSAgICAocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkgeworCQkJCQlpZiAoKHBFaWQtPkxlbiArIDIpID4gTUFYX0NVU1RPTV9MRU4pIHsKKwkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+UnNuSUUuSUUsIHBFaWQsCisJCQkJCQkgICAgICAgcEJzcy0+UnNuSUUuSUVMZW4pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCUxlbmd0aCA9IExlbmd0aCArIDIgKyAodTE2KXBFaWQtPkxlbjsJLyogRWlkWzFdICsgTGVuWzFdKyBjb250ZW50W0xlbl0gKi8KKwkJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSAoKHU4ICopIHBFaWQgKyAyICsgcEVpZC0+TGVuKTsKIAkJfQogCX0KIH0KQEAgLTM3NjUsMzAxICszODM3LDMzNyBAQAogIElSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKi8KLVVMT05HIEJzc1RhYmxlU2V0RW50cnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbE5vLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKQordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNldEVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLCB1OCAqcEJzc2lkLCBjaGFyIFNzaWRbXSwgdTggU3NpZExlbiwgdTggQnNzVHlwZSwgdTE2IEJlYWNvblBlcmlvZCwgc3RydWN0IHJ0X2NmX3Bhcm0gKiBDZlBhcm0sIHUxNiBBdGltV2luLCB1MTYgQ2FwYWJpbGl0eUluZm8sIHU4IFN1cFJhdGVbXSwgdTggU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkgICAgICAgdTggSHRDYXBhYmlsaXR5TGVuLAorCQkgICAgICAgdTggQWRkSHRJbmZvTGVuLAorCQkgICAgICAgdTggTmV3RXh0Q2hhbk9mZnNldCwKKwkJICAgICAgIHU4IENoYW5uZWxObywKKwkJICAgICAgIGNoYXIgUnNzaSwKKwkJICAgICAgIElOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCQkgICAgICAgdTggQ2tpcEZsYWcsCisJCSAgICAgICBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCSAgICAgICBzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSAqcFFvc0NhcGFiaWxpdHksCisJCSAgICAgICBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwKKwkJICAgICAgIHUxNiBMZW5ndGhWSUUsIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpCiB7Ci0JVUxPTkcJSWR4OworCXVuc2lnbmVkIGxvbmcgSWR4OwogCi0JSWR4ID0gQnNzVGFibGVTZWFyY2hXaXRoU1NJRChUYWIsIHBCc3NpZCwgIFNzaWQsIFNzaWRMZW4sIENoYW5uZWxObyk7Ci0JaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCXsKLQkJaWYgKFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCi0JICAgIHsKLQkJCS8vCi0JCQkvLyBJdCBtYXkgaGFwcGVuIHdoZW4gQlNTIFRhYmxlIHdhcyBmdWxsLgotCQkJLy8gVGhlIGRlc2lyZWQgQVAgd2lsbCBub3QgYmUgYWRkZWQgaW50byBCU1MgVGFibGUKLQkJCS8vIEluIHRoaXMgY2FzZSwgaWYgd2UgZm91bmQgdGhlIGRlc2lyZWQgQVAgdGhlbiBvdmVyd3JpdGUgQlNTIFRhYmxlLgotCQkJLy8KLQkJCWlmKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQl7Ci0JCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzc2lkKSB8fAotCQkJCQlTU0lEX0VRVUFMKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgU3NpZCwgU3NpZExlbikpCi0JCQkJeworCUlkeCA9CisJICAgIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoVGFiLCBwQnNzaWQsICh1OCAqKSBTc2lkLCBTc2lkTGVuLAorCQkJCSAgIENoYW5uZWxObyk7CisJaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKSB7CisJCWlmIChUYWItPkJzc05yID49IE1BWF9MRU5fT0ZfQlNTX1RBQkxFKSB7CisJCQkvKiAqLworCQkJLyogSXQgbWF5IGhhcHBlbiB3aGVuIEJTUyBUYWJsZSB3YXMgZnVsbC4gKi8KKwkJCS8qIFRoZSBkZXNpcmVkIEFQIHdpbGwgbm90IGJlIGFkZGVkIGludG8gQlNTIFRhYmxlICovCisJCQkvKiBJbiB0aGlzIGNhc2UsIGlmIHdlIGZvdW5kIHRoZSBkZXNpcmVkIEFQIHRoZW4gb3ZlcndyaXRlIEJTUyBUYWJsZS4gKi8KKwkJCS8qICovCisJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIHBCc3NpZCkKKwkJCQkgICAgfHwgU1NJRF9FUVVBTChwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIFNzaWQsCisJCQkJCQkgIFNzaWRMZW4pKSB7CiAJCQkJCUlkeCA9IFRhYi0+QnNzT3ZlcmxhcE5yOwotCQkJCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLCBDZlBhcm0sIEF0aW1XaW4sCi0JCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAotCQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7Ci0gICAgICAgICAgICAgICAgICAgIFRhYi0+QnNzT3ZlcmxhcE5yID0gKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUgTUFYX0xFTl9PRl9CU1NfVEFCTEU7CisJCQkJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwKKwkJCQkJCSAgICBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sCisJCQkJCQkgICAgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAorCQkJCQkJICAgIENmUGFybSwgQXRpbVdpbiwKKwkJCQkJCSAgICBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwKKwkJCQkJCSAgICBTdXBSYXRlTGVuLCBFeHRSYXRlLAorCQkJCQkJICAgIEV4dFJhdGVMZW4sIHBIdENhcGFiaWxpdHksCisJCQkJCQkgICAgcEFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJICAgIEFkZEh0SW5mb0xlbiwKKwkJCQkJCSAgICBOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sCisJCQkJCQkgICAgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKKwkJCQkJCSAgICBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LAorCQkJCQkJICAgIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKKwkJCQkJVGFiLT5Cc3NPdmVybGFwTnIgPQorCQkJCQkgICAgKFRhYi0+QnNzT3ZlcmxhcE5yKyspICUKKwkJCQkJICAgIE1BWF9MRU5fT0ZfQlNTX1RBQkxFOwogCQkJCX0KIAkJCQlyZXR1cm4gSWR4OwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJcmV0dXJuIEJTU19OT1RfRk9VTkQ7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBCU1NfTk9UX0ZPVU5EOwogCQkJfQogCQl9CiAJCUlkeCA9IFRhYi0+QnNzTnI7Ci0JCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsIENmUGFybSwgQXRpbVdpbiwKLQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKLQkJCQkJTmV3RXh0Q2hhbk9mZnNldCwgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sIHBRb3NDYXBhYmlsaXR5LCBwUWJzc0xvYWQsIExlbmd0aFZJRSwgcFZJRSk7CisJCUJzc0VudHJ5U2V0KHBBZCwgJlRhYi0+QnNzRW50cnlbSWR4XSwgcEJzc2lkLCBTc2lkLCBTc2lkTGVuLAorCQkJICAgIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAorCQkJICAgIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLAorCQkJICAgIEV4dFJhdGVMZW4sIHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sCisJCQkgICAgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5PZmZzZXQsCisJCQkgICAgQ2hhbm5lbE5vLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCBwRWRjYVBhcm0sCisJCQkgICAgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKIAkJVGFiLT5Cc3NOcisrOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCS8qIGF2b2lkICBIaWRkZW4gU1NJRCBmb3JtIGJlYWNvbiB0byBvdmVyd2lyaXRlIGNvcnJlY3QgU1NJRCBmcm9tIHByb2JlIHJlc3BvbnNlICovCi0JCWlmICgoU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKSB8fAotCQkJKE5kaXNFcXVhbE1lbW9yeShUYWItPkJzc0VudHJ5W0lkeF0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkTGVuKSkpCi0JCXsKLQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCxDZlBhcm0sIEF0aW1XaW4sCi0JCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCi0JCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOworCQlpZiAoKFNTSURfRVFVQUwKKwkJICAgICAoU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWQsCisJCSAgICAgIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkTGVuKSkKKwkJICAgIHx8CisJCSAgICAoTmRpc0VxdWFsTWVtb3J5CisJCSAgICAgKFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkLCBaZXJvU3NpZCwKKwkJICAgICAgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWRMZW4pKSkgeworCQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsCisJCQkJICAgIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLAorCQkJCSAgICBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwKKwkJCQkgICAgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKKwkJCQkgICAgcEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLAorCQkJCSAgICBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywKKwkJCQkgICAgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLAorCQkJCSAgICBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwogCQl9CiAJfQogCiAJcmV0dXJuIElkeDsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlU3NpZFNvcnQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIEJTU19UQUJMRSAqT3V0VGFiLAotCUlOCUNIQVIgU3NpZFtdLAotCUlOCVVDSEFSIFNzaWRMZW4pCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgQnNzVGFibGVTc2lkU29ydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9ic3NfdGFibGUgKk91dFRhYiwgY2hhciBTc2lkW10sIHU4IFNzaWRMZW4pCiB7Ci0JSU5UIGk7CisJaW50IGk7CiAJQnNzVGFibGVJbml0KE91dFRhYik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlCU1NfRU5UUlkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0JCUJPT0xFQU4JYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykgeworCQlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwSW5Cc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCQlCT09MRUFOIGJJc0hpZGRlbkFwSW5jbHVkZWQgPSBGQUxTRTsKIAogCQlpZiAoKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgotICAgICAgICAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCi0gICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwSW5Cc3MtPkNoYW5uZWwpKQotICAgICAgICAgICAgKQotCQl7CisJCSAgICAgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpICYmCisJCSAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwSW5Cc3MtPkNoYW5uZWwpKQorCQkgICAgKSB7CiAJCQlpZiAocEluQnNzLT5IaWRkZW4pCiAJCQkJYklzSGlkZGVuQXBJbmNsdWRlZCA9IFRSVUU7CiAJCX0KIAogCQlpZiAoKHBJbkJzcy0+QnNzVHlwZSA9PSBwQWQtPlN0YUNmZy5Cc3NUeXBlKSAmJgotCQkJKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEluQnNzLT5Tc2lkLCBwSW5Cc3MtPlNzaWRMZW4pIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKQotCQl7Ci0JCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKKwkJICAgIChTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBJbkJzcy0+U3NpZCwgcEluQnNzLT5Tc2lkTGVuKQorCQkgICAgIHx8IGJJc0hpZGRlbkFwSW5jbHVkZWQpKSB7CisJCQlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CiAKLQkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCS8qIDIuNEcvNUcgTiBvbmx5IG1vZGUgKi8KIAkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKLQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCSAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKQorCQkJICAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0KLQkJCS8vIE5ldyBmb3IgV1BBMgotCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0Ci0JCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJewotCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKLQkJCQkJLy8gTm9uZSBtYXRjaGVkCisJCQkvKiBOZXcgZm9yIFdQQTIgKi8KKwkJCS8qIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdCAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQkJCS8qIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUgKi8KKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpCisJCQkJICAgICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPQorCQkJCQlwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKKwkJCQkJLyogTm9uZSBtYXRjaGVkICovCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQkvKiBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nICovCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgeworCQkJCQkvKiBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uICovCiAJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQkgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCiAJCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmIChwSW5Cc3MtPldQQS5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQgJiYKLQkJCQkJICAgIHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQgJiYKLQkJCQkJICAgIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkvKiBjaGVjayBncm91cCBjaXBoZXIgKi8KKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPAorCQkJCQkgICAgIHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQorCQkJCQkgICAgJiYgKHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9CisJCQkJCQlOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCQkJCSAgICAmJiAocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0KKwkJCQkJCU5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpKQogCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuUGFpckNpcGhlckF1eCkpCisJCQkJCS8qIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQgKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLiAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBLlBhaXJDaXBoZXIpCisJCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQlwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKIAkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCXsKLQkJCQkJLy8gSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbgorCQkJCX0gZWxzZQorCQkJCSAgICBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQorCQkJCQl8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSB7CisJCQkJCS8qIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24gKi8KIAkJCQkJaWYgKHBJbkJzcy0+V1BBMi5iTWl4TW9kZSA9PSBGQUxTRSkKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQorCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJICAgIHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlcikKIAkJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQgJiYKLQkJCQkJICAgIHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkICYmCi0JCQkJCSAgICBwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCS8qIGNoZWNrIGdyb3VwIGNpcGhlciAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8CisJCQkJCSAgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCSAgICAmJiAocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9CisJCQkJCQlOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCQkJCSAgICAmJiAocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9CisJCQkJCQlOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKSkKIAkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQKLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLgotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlckF1eCkpCisJCQkJCS8qIGNoZWNrIHBhaXJ3aXNlIGNpcGhlciwgc2tpcCBpZiBub25lIG1hdGNoZWQgKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gQUVTLCBsZXQgaXQgcGFzcyB3aXRob3V0IHF1ZXN0aW9uLiAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBUS0lQLCB3ZSBtdXN0IGZpbmQgb25lIG1hdGVjaGVkICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQogCQkJCQkJY29udGludWU7CiAJCQkJfQogCQkJfQotCQkJLy8gQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLgotCQkJLy8gV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzCi0JCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuV2VwU3RhdHVzPSVkLCB3aGlsZSBwSW5Cc3MtPldlcFN0YXR1cz0lZFxuIiwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBwSW5Cc3MtPldlcFN0YXR1cykpOwotCQkJCS8vCi0JCQkJLy8gRm9yIHRoZSBTRVN2MiBjYXNlLCB3ZSB3aWxsIG5vdCBxdWFsaWZ5IFdlcFN0YXR1cy4KLQkJCQkvLworCQkJLyogQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLiAqLworCQkJLyogV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzICovCisJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiU3RhQ2ZnLldlcFN0YXR1cz0lZCwgd2hpbGUgcEluQnNzLT5XZXBTdGF0dXM9JWRcbiIsCisJCQkJCSAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLAorCQkJCQkgIHBJbkJzcy0+V2VwU3RhdHVzKSk7CisJCQkJLyogKi8KKwkJCQkvKiBGb3IgdGhlIFNFU3YyIGNhc2UsIHdlIHdpbGwgbm90IHF1YWxpZnkgV2VwU3RhdHVzLiAqLworCQkJCS8qICovCiAJCQkJaWYgKCFwSW5Cc3MtPmJTRVMpCiAJCQkJCWNvbnRpbnVlOwogCQkJfQotCi0JCQkvLyBTaW5jZSB0aGUgQVAgaXMgdXNpbmcgaGlkZGVuIFNTSUQsIGFuZCB3ZSBhcmUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gQU5ZCi0JCQkvLyBJdCBkZWZpbml0ZWx5IHdpbGwgZmFpbC4gU28sIHNraXAgaXQuCi0JCQkvLyBDQ1ggYWxzbyByZXF1aXJlIG5vdCBldmVuIHRyeSB0byBjb25uZWN0IGl0ISEKKwkJCS8qIFNpbmNlIHRoZSBBUCBpcyB1c2luZyBoaWRkZW4gU1NJRCwgYW5kIHdlIGFyZSB0cnlpbmcgdG8gY29ubmVjdCB0byBBTlkgKi8KKwkJCS8qIEl0IGRlZmluaXRlbHkgd2lsbCBmYWlsLiBTbywgc2tpcCBpdC4gKi8KKwkJCS8qIENDWCBhbHNvIHJlcXVpcmUgbm90IGV2ZW4gdHJ5IHRvIGNvbm5lY3QgaXQhICovCiAJCQlpZiAoU3NpZExlbiA9PSAwKQogCQkJCWNvbnRpbnVlOwogCi0JCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCi0JCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJLyogSWYgYm90aCBzdGF0aW9uIGFuZCBBUCB1c2UgNDBNSHosIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlIDQwTUhaIGJhbmQncyBsZWdhbGl0eSBpbiBteSBjb3VudHJ5IHJlZ2lvbiAqLworCQkJLyogSWYgdGhpcyA0ME1IeiB3aWRlYmFuZCBpcyBub3QgYWxsb3dlZCBpbiBteSBjb3VudHJ5IGxpc3QsIHVzZSBiYW5kd2lkdGggMjBNSFogaW5zdGVhZCwgKi8KIAkJCWlmICgocEluQnNzLT5DZW50cmFsQ2hhbm5lbCAhPSBwSW5Cc3MtPkNoYW5uZWwpICYmCi0JCQkJKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkpCi0JCQl7Ci0JCQkJaWYgKFJUTVBDaGVja0NoYW5uZWwocEFkLCBwSW5Cc3MtPkNlbnRyYWxDaGFubmVsLCBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfMjA7CisJCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PQorCQkJICAgICBCV180MCkpIHsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbAorCQkJCSAgICAocEFkLCBwSW5Cc3MtPkNlbnRyYWxDaGFubmVsLAorCQkJCSAgICAgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkgeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCQkJCSAgICBCVyA9IEJXXzIwOwogCQkJCQlTZXRDb21tb25IVChwQWQpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQkFORF9XSURUSF8yMCkKLQkJCQkJeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCQkJCSAgICBCVyA9IEJXXzQwOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuCisJCQkJCSAgICBDaGFubmVsV2lkdGggPT0gQkFORF9XSURUSF8yMCkgewogCQkJCQkJU2V0Q29tbW9uSFQocEFkKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQotCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKLQkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCQkJLyogY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAogCQkJT3V0VGFiLT5Cc3NOcisrOwotCQl9Ci0JCWVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYgKFNzaWRMZW4gPT0gMCkpCi0JCXsKLQkJCUJTU19FTlRSWSAqcE91dEJzcyA9ICZPdXRUYWItPkJzc0VudHJ5W091dFRhYi0+QnNzTnJdOworCQl9IGVsc2UgaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkKKwkJCSAgICYmIChTc2lkTGVuID09IDApKSB7CisJCQlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07CiAKLQkJCS8vIDIuNEcvNUcgTiBvbmx5IG1vZGUKKwkJCS8qIDIuNEcvNUcgTiBvbmx5IG1vZGUgKi8KIAkJCWlmICgocEluQnNzLT5IdENhcGFiaWxpdHlMZW4gPT0gMCkgJiYKLQkJCQkoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEEgaXMgaW4gTi1vbmx5IE1vZGUsIHRoaXMgQVAgZG9uJ3QgaGF2ZSBIdCBjYXBhYmlsaXR5IGluIEJlYWNvbi5cbiIpKTsKKwkJCSAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKQorCQkJICAgICB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0KLQkJCS8vIE5ldyBmb3IgV1BBMgotCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0Ci0JCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJewotCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKLQkJCQkJLy8gTm9uZSBtYXRjaGVkCisJCQkvKiBOZXcgZm9yIFdQQTIgKi8KKwkJCS8qIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdCAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQkJCS8qIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUgKi8KKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpCisJCQkJICAgICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPQorCQkJCQlwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKKwkJCQkJLyogTm9uZSBtYXRjaGVkICovCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KKwkJCQkvKiBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nICovCisJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgeworCQkJCQkvKiBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uICovCiAJCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQkgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCiAJCQkJCQkJY29udGludWU7CiAKLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPCBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKKwkJCQkJLyogY2hlY2sgZ3JvdXAgY2lwaGVyICovCisJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPAorCQkJCQkgICAgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCiAJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5QYWlyQ2lwaGVyQXV4KSkKKwkJCQkJLyogY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZCAqLworCQkJCQkvKiBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQgKi8KKwkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPQorCQkJCQkJcEluQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBLlBhaXJDaXBoZXJBdXgpKQogCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJewotCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCisJCQkJfSBlbHNlCisJCQkJICAgIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQkJCXx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCQkJLyogSWYgaXQncyBub3QgbWl4ZWQgbW9kZSwgd2Ugc2hvdWxkIG9ubHkgbGV0IEJTUyBwYXNzIHdpdGggdGhlIHNhbWUgZW5jcnlwdGlvbiAqLwogCQkJCQlpZiAocEluQnNzLT5XUEEyLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCisJCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQkgICAgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQogCQkJCQkJCWNvbnRpbnVlOwogCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQorCQkJCQkvKiBjaGVjayBncm91cCBjaXBoZXIgKi8KKwkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8CisJCQkJCSAgICBwSW5Cc3MtPldQQTIuR3JvdXBDaXBoZXIpCiAJCQkJCQljb250aW51ZTsKIAotCQkJCQkvLyBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4KLQkJCQkJLy8gSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZAotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSAmJgotCQkJCQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQorCQkJCQkvKiBjaGVjayBwYWlyd2lzZSBjaXBoZXIsIHNraXAgaWYgbm9uZSBtYXRjaGVkICovCisJCQkJCS8qIElmIHByb2ZpbGUgc2V0IHRvIEFFUywgbGV0IGl0IHBhc3Mgd2l0aG91dCBxdWVzdGlvbi4gKi8KKwkJCQkJLyogSWYgcHJvZmlsZSBzZXQgdG8gVEtJUCwgd2UgbXVzdCBmaW5kIG9uZSBtYXRlY2hlZCAqLworCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCQkJCSAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJCQlwSW5Cc3MtPldQQTIuUGFpckNpcGhlcikKKwkJCQkJICAgICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkJCXBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSkKIAkJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCX0KLQkJCS8vIEJzcyBUeXBlIG1hdGNoZWQsIFNTSUQgbWF0Y2hlZC4KLQkJCS8vIFdlIHdpbGwgY2hlY2sgd2Vwc3RhdHVzIGZvciBxdWFsaWZpY2F0aW9uIEJzcworCQkJLyogQnNzIFR5cGUgbWF0Y2hlZCwgU1NJRCBtYXRjaGVkLiAqLworCQkJLyogV2Ugd2lsbCBjaGVjayB3ZXBzdGF0dXMgZm9yIHF1YWxpZmljYXRpb24gQnNzICovCiAJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XZXBTdGF0dXMpCi0JCQkJCWNvbnRpbnVlOworCQkJCWNvbnRpbnVlOwogCi0JCQkvLyBJZiBib3RoIHN0YXRpb24gYW5kIEFQIHVzZSA0ME1Ieiwgc3RpbGwgbmVlZCB0byBjaGVjayBpZiB0aGUgNDBNSFogYmFuZCdzIGxlZ2FsaXR5IGluIG15IGNvdW50cnkgcmVnaW9uCi0JCQkvLyBJZiB0aGlzIDQwTUh6IHdpZGViYW5kIGlzIG5vdCBhbGxvd2VkIGluIG15IGNvdW50cnkgbGlzdCwgdXNlIGJhbmR3aWR0aCAyME1IWiBpbnN0ZWFkLAorCQkJLyogSWYgYm90aCBzdGF0aW9uIGFuZCBBUCB1c2UgNDBNSHosIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlIDQwTUhaIGJhbmQncyBsZWdhbGl0eSBpbiBteSBjb3VudHJ5IHJlZ2lvbiAqLworCQkJLyogSWYgdGhpcyA0ME1IeiB3aWRlYmFuZCBpcyBub3QgYWxsb3dlZCBpbiBteSBjb3VudHJ5IGxpc3QsIHVzZSBiYW5kd2lkdGggMjBNSFogaW5zdGVhZCwgKi8KIAkJCWlmICgocEluQnNzLT5DZW50cmFsQ2hhbm5lbCAhPSBwSW5Cc3MtPkNoYW5uZWwpICYmCi0JCQkJKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkpCi0JCQl7Ci0JCQkJaWYgKFJUTVBDaGVja0NoYW5uZWwocEFkLCBwSW5Cc3MtPkNlbnRyYWxDaGFubmVsLCBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfMjA7CisJCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PQorCQkJICAgICBCV180MCkpIHsKKwkJCQlpZiAoUlRNUENoZWNrQ2hhbm5lbAorCQkJCSAgICAocEFkLCBwSW5Cc3MtPkNlbnRyYWxDaGFubmVsLAorCQkJCSAgICAgcEluQnNzLT5DaGFubmVsKSA9PSBGQUxTRSkgeworCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCQkJCSAgICBCVyA9IEJXXzIwOwogCQkJCQlTZXRDb21tb25IVChwQWQpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPSBCV180MDsKKwkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCQkgICAgQlcgPSBCV180MDsKIAkJCQl9CiAJCQl9Ci0KLQkJCS8vIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiCi0JCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwkJCS8qIGNvcHkgbWF0Y2hpbmcgQlNTIGZyb20gSW5UYWIgdG8gT3V0VGFiICovCisJCQlOZGlzTW92ZU1lbW9yeShwT3V0QnNzLCBwSW5Cc3MsIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CiAKIAkJCU91dFRhYi0+QnNzTnIrKzsKIAkJfQpAQCAtNDA3MSwzNzggKzQxNzksMzY2IEBACiAJQnNzVGFibGVTb3J0QnlSc3NpKE91dFRhYik7CiB9CiAKLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlU29ydEJ5UnNzaSgKLQlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgQnNzVGFibGVTb3J0QnlSc3NpKHN0cnVjdCBydF9ic3NfdGFibGUgKk91dFRhYikKIHsKLQlJTlQgCSAgaSwgajsKLQlCU1NfRU5UUlkgVG1wQnNzOworCWludCBpLCBqOworCXN0cnVjdCBydF9ic3NfZW50cnkgVG1wQnNzOwogCi0JZm9yIChpID0gMDsgaSA8IE91dFRhYi0+QnNzTnIgLSAxOyBpKyspCi0JewotCQlmb3IgKGogPSBpKzE7IGogPCBPdXRUYWItPkJzc05yOyBqKyspCi0JCXsKLQkJCWlmIChPdXRUYWItPkJzc0VudHJ5W2pdLlJzc2kgPiBPdXRUYWItPkJzc0VudHJ5W2ldLlJzc2kpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtqXSwgJk91dFRhYi0+QnNzRW50cnlbaV0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmT3V0VGFiLT5Cc3NFbnRyeVtpXSwgJlRtcEJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOworCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKSB7CisJCWZvciAoaiA9IGkgKyAxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKSB7CisJCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKSB7CisJCQkJTmRpc01vdmVNZW1vcnkoJlRtcEJzcywgJk91dFRhYi0+QnNzRW50cnlbal0sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZPdXRUYWItPkJzc0VudHJ5W2pdLAorCQkJCQkgICAgICAgJk91dFRhYi0+QnNzRW50cnlbaV0sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZPdXRUYWItPkJzc0VudHJ5W2ldLCAmVG1wQnNzLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJCX0KIAkJfQogCX0KIH0KIAotVk9JRCBCc3NDaXBoZXJQYXJzZSgKLQlJTiBPVVQJUEJTU19FTlRSWQlwQnNzKQordm9pZCBCc3NDaXBoZXJQYXJzZShzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzKQogewotCVBFSURfU1RSVUNUIAkJIHBFaWQ7Ci0JUFVDSEFSCQkJCXBUbXA7Ci0JUFJTTl9JRV9IRUFERVJfU1RSVUNUCQkJcFJzbkhlYWRlcjsKLQlQQ0lQSEVSX1NVSVRFX1NUUlVDVAkJCXBDaXBoZXI7Ci0JUEFLTV9TVUlURV9TVFJVQ1QJCQkJcEFLTTsKLQlVU0hPUlQJCQkJCQkJQ291bnQ7Ci0JSU5UCQkJCQkJCQlMZW5ndGg7Ci0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJVG1wQ2lwaGVyOworCXN0cnVjdCBydF9laWQgKiBwRWlkOworCXU4ICpwVG1wOworCXN0cnVjdCBydF9yc25faWVfaGVhZGVyICogcFJzbkhlYWRlcjsKKwlzdHJ1Y3QgcnRfY2lwaGVyX3N1aXRlX3N0cnVjdCAqIHBDaXBoZXI7CisJc3RydWN0IHJ0X2FrbV9zdWl0ZSAqIHBBS007CisJdTE2IENvdW50OworCWludCBMZW5ndGg7CisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgVG1wQ2lwaGVyOwogCi0JLy8KLQkvLyBXZXBTdGF0dXMgd2lsbCBiZSByZXNldCBsYXRlciwgaWYgQVAgYW5ub3VuY2UgVEtJUCBvciBBRVMgb24gdGhlIGJlYWNvbiBmcmFtZS4KLQkvLwotCWlmIChwQnNzLT5Qcml2YWN5KQotCXsKLQkJcEJzcy0+V2VwU3RhdHVzIAk9IE5kaXM4MDJfMTFXRVBFbmFibGVkOworCS8qICovCisJLyogV2VwU3RhdHVzIHdpbGwgYmUgcmVzZXQgbGF0ZXIsIGlmIEFQIGFubm91bmNlIFRLSVAgb3IgQUVTIG9uIHRoZSBiZWFjb24gZnJhbWUuICovCisJLyogKi8KKwlpZiAocEJzcy0+UHJpdmFjeSkgeworCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKKwl9IGVsc2UgeworCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAJfQotCWVsc2UKLQl7Ci0JCXBCc3MtPldlcFN0YXR1cyAJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JfQotCS8vIFNldCBkZWZhdWx0IHRvIGRpc2FibGUgJiBvcGVuIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSBwYXJzaW5nIHZhcmlhYmxlIElFCi0JcEJzcy0+QXV0aE1vZGUJCT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQlwQnNzLT5BdXRoTW9kZUF1eAk9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJLyogU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUgKi8KKwlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwogCi0JLy8gSW5pdCBXUEEgc2V0dGluZwotCXBCc3MtPldQQS5QYWlyQ2lwaGVyCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCS8qIEluaXQgV1BBIHNldHRpbmcgKi8KKwlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKIAlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogCXBCc3MtPldQQS5Sc25DYXBhYmlsaXR5ID0gMDsKLQlwQnNzLT5XUEEuYk1peE1vZGUJCT0gRkFMU0U7CisJcEJzcy0+V1BBLmJNaXhNb2RlID0gRkFMU0U7CiAKLQkvLyBJbml0IFdQQTIgc2V0dGluZwotCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJLyogSW5pdCBXUEEyIHNldHRpbmcgKi8KKwlwQnNzLT5XUEEyLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIJID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CiAJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gMDsKLQlwQnNzLT5XUEEyLmJNaXhNb2RlIAkgPSBGQUxTRTsKKwlwQnNzLT5XUEEyLmJNaXhNb2RlID0gRkFMU0U7CiAKKwlMZW5ndGggPSAoaW50KXBCc3MtPlZhcklFTGVuOwogCi0JTGVuZ3RoID0gKElOVCkgcEJzcy0+VmFySUVMZW47Ci0KLQl3aGlsZSAoTGVuZ3RoID4gMCkKLQl7Ci0JCS8vIFBhcnNlIGNpcGhlciBzdWl0ZSBiYXNlIG9uIFdQQTEgJiBXUEEyLCB0aGV5IHNob3VsZCBiZSBwYXJzZWQgZGlmZmVyZW50bHkKLQkJcFRtcCA9ICgoUFVDSEFSKSBwQnNzLT5WYXJJRXMpICsgcEJzcy0+VmFySUVMZW4gLSBMZW5ndGg7Ci0JCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBUbXA7Ci0JCXN3aXRjaCAocEVpZC0+RWlkKQotCQl7Ci0JCQljYXNlIElFX1dQQToKLQkJCQkvL1BhcnNlIENpc2NvIElFX1dQQSAoTEVBUCwgQ0NLTSwgZXRjLikKLQkJCQlpZiAoIE5kaXNFcXVhbE1lbW9yeSgocFRtcCs4KSwgQ0lTQ09fT1VJLCAzKSkKLQkJCQl7Ci0JCQkJCXBUbXAgICArPSAxMTsKLQkJCQkJc3dpdGNoICgqcFRtcCkKLQkJCQkJewotCQkJCQkJY2FzZSAxOgotCQkJCQkJY2FzZSA1OgkvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKLQkJCQkJCQlwQnNzLT5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCXBCc3MtPldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJcEJzcy0+V2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQkvLyBpZiBDaXNjbyBJRV9XUEEsIGJyZWFrCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFNFU19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCi0JCQkJewotCQkJCQlwQnNzLT5iU0VTID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0gMSkKLQkJCQl7Ci0JCQkJCS8vIGlmIHVuc3VwcG9ydGVkIHZlbmRvciBzcGVjaWZpYyBJRQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gU2tpcCBPVUksIHZlcnNpb24sIGFuZCBtdWx0aWNhc3Qgc3VpdGUKLQkJCQkvLyBUaGlzIHBhcnQgc2hvdWxkIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgd2hlbiBBUCBzdXBwb3J0ZWQgbXVsdGlwbGUgY2lwaGVyIHN1aXRlLgotCQkJCS8vIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLgotCQkJCS8vIHBUbXAgPSAoUFVDSEFSKSBwRWlkLT5PY3RldDsKLQkJCQlwVG1wICAgKz0gMTE7Ci0KLQkJCQkvLyBDaXBoZXIgU3VpdGUgU2VsZWN0b3JzIGZyb20gU3BlYyBQODAyLjExaS9EMy4yIFAyNi4KLQkJCQkvLwlWYWx1ZQkgICBNZWFuaW5nCi0JCQkJLy8JMAkJCU5vbmUKLQkJCQkvLwkxCQkJV0VQLTQwCi0JCQkJLy8JMgkJCVRraXAKLQkJCQkvLwkzCQkJV1JBUAotCQkJCS8vCTQJCQlBRVMKLQkJCQkvLwk1CQkJV0VQLTEwNAotCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgotCQkJCXN3aXRjaCAoKnBUbXApCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA1OgotCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZQotCQkJCXBUbXAgICArPSAxOwotCi0JCQkJLy8gc2tpcCBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGVzCi0JCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKLQkJCQl3aGlsZSAoQ291bnQgPiAwKQotCQkJCXsKLQkJCQkJLy8gU2tpcCBPVUkKLQkJCQkJcFRtcCArPSAzOwotCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JCQkJCXN3aXRjaCAoKnBUbXApCi0JCQkJCXsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEuUGFpckNpcGhlcikKLQkJCQkJewotCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCXBUbXArKzsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cwotCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKLQkJCQlwVG1wICAgKz0gMzsKLQotCQkJCXN3aXRjaCAoKnBUbXApCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEgbW9kZQotCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCQkJZWxzZQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcFRtcCAgICs9IDE7Ci0KLQkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKLQkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJewotCQkJCQlwQnNzLT5BdXRoTW9kZQkgID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0KLQkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCi0JCQkJaWYgKHBCc3MtPldQQS5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEuUGFpckNpcGhlcikKLQkJCQkJcEJzcy0+V1BBLmJNaXhNb2RlID0gVFJVRTsKLQorCXdoaWxlIChMZW5ndGggPiAwKSB7CisJCS8qIFBhcnNlIGNpcGhlciBzdWl0ZSBiYXNlIG9uIFdQQTEgJiBXUEEyLCB0aGV5IHNob3VsZCBiZSBwYXJzZWQgZGlmZmVyZW50bHkgKi8KKwkJcFRtcCA9ICgodTggKilwQnNzLT5WYXJJRXMpICsgcEJzcy0+VmFySUVMZW4gLSBMZW5ndGg7CisJCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSBwVG1wOworCQlzd2l0Y2ggKHBFaWQtPkVpZCkgeworCQljYXNlIElFX1dQQToKKwkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFNFU19PVUksIDMpCisJCQkgICAgJiYgKHBFaWQtPkxlbiA9PSA3KSkgeworCQkJCXBCc3MtPmJTRVMgPSBUUlVFOwogCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpICE9CisJCQkJICAgMSkgeworCQkJCS8qIGlmIHVuc3VwcG9ydGVkIHZlbmRvciBzcGVjaWZpYyBJRSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU2tpcCBPVUksIHZlcnNpb24sIGFuZCBtdWx0aWNhc3Qgc3VpdGUgKi8KKwkJCS8qIFRoaXMgcGFydCBzaG91bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB3aGVuIEFQIHN1cHBvcnRlZCBtdWx0aXBsZSBjaXBoZXIgc3VpdGUuICovCisJCQkvKiBGb3Igbm93LCBpdCdzIE9LIHNpbmNlIGFsbW9zdCBhbGwgQVBzIGhhdmUgZml4ZWQgY2lwaGVyIHN1aXRlIHN1cHBvcnRlZC4gKi8KKwkJCS8qIHBUbXAgPSAodTggKilwRWlkLT5PY3RldDsgKi8KKwkJCXBUbXAgKz0gMTE7CiAKLQkJCWNhc2UgSUVfUlNOOgotCQkJCXBSc25IZWFkZXIgPSAoUFJTTl9JRV9IRUFERVJfU1RSVUNUKSBwVG1wOwotCi0JCQkJLy8gMC4gVmVyc2lvbiBtdXN0IGJlIDEKLQkJCQlpZiAobGUyY3B1MTYocFJzbkhlYWRlci0+VmVyc2lvbikgIT0gMSkKLQkJCQkJYnJlYWs7Ci0JCQkJcFRtcCAgICs9IHNpemVvZihSU05fSUVfSEVBREVSX1NUUlVDVCk7Ci0KLQkJCQkvLyAxLiBDaGVjayBncm91cCBjaXBoZXIKLQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOwotCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQotCQkJCQlicmVhazsKLQotCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgotCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA1OgotCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBzZXQgdG8gY29ycmVjdCBvZmZzZXQgZm9yIG5leHQgcGFyc2luZwotCQkJCXBUbXAgICArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7Ci0KLQkJCQkvLyAyLiBHZXQgcGFpcndpc2UgY2lwaGVyIGNvdW50cwotCQkJCS8vQ291bnQgPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKLQotCQkJCS8vIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIKLQkJCQkvLyBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZQotCQkJCXdoaWxlIChDb3VudCA+IDApCi0JCQkJewotCQkJCQkvLyBTa2lwIE9VSQotCQkJCQlwQ2lwaGVyID0gKFBDSVBIRVJfU1VJVEVfU1RSVUNUKSBwVG1wOwotCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkKLQkJCQkJewotCQkJCQkJY2FzZSAxOgotCQkJCQkJY2FzZSA1OiAvLyBBbHRob3VnaCBXRVAgaXMgbm90IGFsbG93ZWQgaW4gV1BBIHJlbGF0ZWQgYXV0aCBtb2RlLCB3ZSBwYXJzZSBpdCBhbnl3YXkKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQTIuUGFpckNpcGhlcikKLQkJCQkJewotCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKLQkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKLQkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlcgkgPSBUbXBDaXBoZXI7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBUbXBDaXBoZXI7Ci0JCQkJCX0KLQkJCQkJcFRtcCArPSBzaXplb2YoQ0lQSEVSX1NVSVRFX1NUUlVDVCk7Ci0JCQkJCUNvdW50LS07Ci0JCQkJfQotCi0JCQkJLy8gNC4gZ2V0IEFLTSBzdWl0ZSBjb3VudHMKLQkJCQkvL0NvdW50CT0gKihQVVNIT1JUKSBwVG1wOwotCQkJCUNvdW50ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyA1LiBHZXQgQUtNIGNpcGhlcnMKLQkJCQlwQUtNID0gKFBBS01fU1VJVEVfU1RSVUNUKSBwVG1wOwotCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQotCQkJCQlicmVhazsKLQotCQkJCXN3aXRjaCAocEFLTS0+VHlwZSkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCi0JCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCS8vIFNldCBBUCBzdXBwb3J0IFdQQSBtb2RlCi0JCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7Ci0KLQkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKLQkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJewotCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlcgk9IHBCc3MtPldQQTIuR3JvdXBDaXBoZXI7Ci0JCQkJCXBCc3MtPldlcFN0YXR1cyAJCT0gcEJzcy0+V1BBLkdyb3VwQ2lwaGVyOwotCQkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCQkJcEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPSBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7Ci0JCQkJfQotCQkJCXBCc3MtPldlcFN0YXR1cyAgID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOwotCi0JCQkJLy8gNi4gR2V0IFJTTiBjYXBhYmlsaXR5Ci0JCQkJLy9wQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gKHBUbXBbMV08PDgpICsgcFRtcFswXTsKLQkJCQlwVG1wICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZwotCQkJCWlmIChwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKLQkJCQkJcEJzcy0+V1BBMi5iTWl4TW9kZSA9IFRSVUU7Ci0KKwkJCS8qIENpcGhlciBTdWl0ZSBTZWxlY3RvcnMgZnJvbSBTcGVjIFA4MDIuMTFpL0QzLjIgUDI2LiAqLworCQkJLyogICAgICBWYWx1ZSAgICAgIE1lYW5pbmcgKi8KKwkJCS8qICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgTm9uZSAqLworCQkJLyogICAgICAxICAgICAgICAgICAgICAgICAgICAgICBXRVAtNDAgKi8KKwkJCS8qICAgICAgMiAgICAgICAgICAgICAgICAgICAgICAgVGtpcCAqLworCQkJLyogICAgICAzICAgICAgICAgICAgICAgICAgICAgICBXUkFQICovCisJCQkvKiAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgIEFFUyAqLworCQkJLyogICAgICA1ICAgICAgICAgICAgICAgICAgICAgICBXRVAtMTA0ICovCisJCQkvKiBQYXJzZSBncm91cCBjaXBoZXIgKi8KKwkJCXN3aXRjaCAoKnBUbXApIHsKKwkJCWNhc2UgMToKKwkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0KKwkJCQkgICAgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWJyZWFrOworCQkJfQorCQkJLyogbnVtYmVyIG9mIHVuaWNhc3Qgc3VpdGUgKi8KKwkJCXBUbXAgKz0gMTsKKworCQkJLyogc2tpcCBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGVzICovCisJCQkvKkNvdW50ID0gKih1MTYgKilwVG1wOyAqLworCQkJQ291bnQgPSAocFRtcFsxXSA8PCA4KSArIHBUbXBbMF07CisJCQlwVG1wICs9IHNpemVvZih1MTYpOworCisJCQkvKiBQYXJzaW5nIGFsbCB1bmljYXN0IGNpcGhlciBzdWl0ZSAqLworCQkJd2hpbGUgKENvdW50ID4gMCkgeworCQkJCS8qIFNraXAgT1VJICovCisJCQkJcFRtcCArPSAzOworCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJCQlzd2l0Y2ggKCpwVG1wKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgNToJLyogQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5ICovCisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCVRtcENpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKFRtcENpcGhlciA+IHBCc3MtPldQQS5QYWlyQ2lwaGVyKSB7CisJCQkJCS8qIE1vdmUgdGhlIGxvd2VyIGNpcGhlciBzdWl0ZSB0byBQYWlyQ2lwaGVyQXV4ICovCisJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkJICAgIHBCc3MtPldQQS5QYWlyQ2lwaGVyOworCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlciA9IFRtcENpcGhlcjsKKwkJCQl9IGVsc2UgeworCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQl9CisJCQkJcFRtcCsrOworCQkJCUNvdW50LS07CisJCQl9CisKKwkJCS8qIDQuIGdldCBBS00gc3VpdGUgY291bnRzICovCisJCQkvKkNvdW50ID0gKih1MTYgKilwVG1wOyAqLworCQkJQ291bnQgPSAocFRtcFsxXSA8PCA4KSArIHBUbXBbMF07CisJCQlwVG1wICs9IHNpemVvZih1MTYpOworCQkJcFRtcCArPSAzOworCisJCQlzd2l0Y2ggKCpwVG1wKSB7CisJCQljYXNlIDE6CisJCQkJLyogU2V0IEFQIHN1cHBvcnQgV1BBLWVudGVycHJpc2UgbW9kZSAqLworCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKwkJCQllbHNlCisJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0KKwkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQkvKiBTZXQgQVAgc3VwcG9ydCBXUEEtUFNLIG1vZGUgKi8KKwkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJcEJzcy0+QXV0aE1vZGUgPQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWVsc2UKKwkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBUbXAgKz0gMTsKKworCQkJLyogRml4ZWQgZm9yIFdQQS1Ob25lICovCisJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CisJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCXBCc3MtPldlcFN0YXR1cyA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQkvKiBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIgKi8KKwkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0KKwkJCQkgICAgTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9CisJCQkJCSAgICBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQl9IGVsc2UKKwkJCQlwQnNzLT5XZXBTdGF0dXMgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKKworCQkJLyogQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZyAqLworCQkJaWYgKHBCc3MtPldQQS5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEuUGFpckNpcGhlcikKKwkJCQlwQnNzLT5XUEEuYk1peE1vZGUgPSBUUlVFOworCisJCQlicmVhazsKKworCQljYXNlIElFX1JTTjoKKwkJCXBSc25IZWFkZXIgPSAoc3RydWN0IHJ0X3Jzbl9pZV9oZWFkZXIgKikgcFRtcDsKKworCQkJLyogMC4gVmVyc2lvbiBtdXN0IGJlIDEgKi8KKwkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQorCQkJCWJyZWFrOworCQkJcFRtcCArPSBzaXplb2Yoc3RydWN0IHJ0X3Jzbl9pZV9oZWFkZXIpOworCisJCQkvKiAxLiBDaGVjayBncm91cCBjaXBoZXIgKi8KKwkJCXBDaXBoZXIgPSAoc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QgKikgcFRtcDsKKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQorCQkJCWJyZWFrOworCisJCQkvKiBQYXJzZSBncm91cCBjaXBoZXIgKi8KKwkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkgeworCQkJY2FzZSAxOgorCQkJCXBCc3MtPldQQTIuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJLyogc2V0IHRvIGNvcnJlY3Qgb2Zmc2V0IGZvciBuZXh0IHBhcnNpbmcgKi8KKwkJCXBUbXAgKz0gc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfc3VpdGVfc3RydWN0KTsKKworCQkJLyogMi4gR2V0IHBhaXJ3aXNlIGNpcGhlciBjb3VudHMgKi8KKwkJCS8qQ291bnQgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlDb3VudCA9IChwVG1wWzFdIDw8IDgpICsgcFRtcFswXTsKKwkJCXBUbXAgKz0gc2l6ZW9mKHUxNik7CisKKwkJCS8qIDMuIEdldCBwYWlyd2lzZSBjaXBoZXIgKi8KKwkJCS8qIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlICovCisJCQl3aGlsZSAoQ291bnQgPiAwKSB7CisJCQkJLyogU2tpcCBPVUkgKi8KKwkJCQlwQ2lwaGVyID0gKHN0cnVjdCBydF9jaXBoZXJfc3VpdGVfc3RydWN0ICopIHBUbXA7CisJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJCXN3aXRjaCAocENpcGhlci0+VHlwZSkgeworCQkJCWNhc2UgMToKKwkJCQljYXNlIDU6CS8qIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheSAqLworCQkJCQlUbXBDaXBoZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQlUbXBDaXBoZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlUbXBDaXBoZXIgPQorCQkJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpIHsKKwkJCQkJLyogTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXggKi8KKwkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0KKwkJCQkJICAgIHBCc3MtPldQQTIuUGFpckNpcGhlcjsKKwkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyID0gVG1wQ2lwaGVyOworCQkJCX0gZWxzZSB7CisJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKKwkJCQl9CisJCQkJcFRtcCArPSBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QpOworCQkJCUNvdW50LS07CisJCQl9CisKKwkJCS8qIDQuIGdldCBBS00gc3VpdGUgY291bnRzICovCisJCQkvKkNvdW50ID0gKih1MTYgKilwVG1wOyAqLworCQkJQ291bnQgPSAocFRtcFsxXSA8PCA4KSArIHBUbXBbMF07CisJCQlwVG1wICs9IHNpemVvZih1MTYpOworCisJCQkvKiA1LiBHZXQgQUtNIGNpcGhlcnMgKi8KKwkJCS8qIFBhcnNpbmcgYWxsIEFLTSBjaXBoZXJzICovCisJCQl3aGlsZSAoQ291bnQgPiAwKSB7CisJCQkJcEFLTSA9IChzdHJ1Y3QgcnRfYWttX3N1aXRlICopIHBUbXA7CisJCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCisJCQkJCWJyZWFrOworCisJCQkJc3dpdGNoIChwQUtNLT5UeXBlKSB7CisJCQkJY2FzZSAxOgorCQkJCQkvKiBTZXQgQVAgc3VwcG9ydCBXUEEtZW50ZXJwcmlzZSBtb2RlICovCisJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PQorCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKKwkJCQkJCXBCc3MtPkF1dGhNb2RlID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyOworCQkJCQllbHNlCisJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9CisJCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQkvKiBTZXQgQVAgc3VwcG9ydCBXUEEtUFNLIG1vZGUgKi8KKwkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQorCQkJCQkJcEJzcy0+QXV0aE1vZGUgPQorCQkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CisJCQkJCWVsc2UKKwkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0KKwkJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0KKwkJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCisJCQkJCQlwQnNzLT5BdXRoTW9kZSA9CisJCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4OworCQkJCQllbHNlCisJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9CisJCQkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcFRtcCArPSAoQ291bnQgKiBzaXplb2Yoc3RydWN0IHJ0X2FrbV9zdWl0ZSkpOworCQkJCUNvdW50LS07CisJCQl9CisKKwkJCS8qIEZpeGVkIGZvciBXUEEtTm9uZSAqLworCQkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CisJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKKwkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9CisJCQkJICAgIHBCc3MtPldQQTIuUGFpckNpcGhlckF1eDsKKwkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyOworCQkJCXBCc3MtPldlcFN0YXR1cyA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKKwkJCQkvKiBQYXRjaGVkIGJ1Z3MgZm9yIG9sZCBkcml2ZXIgKi8KKwkJCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0KKwkJCQkgICAgTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9CisJCQkJCSAgICBwQnNzLT5XUEEuR3JvdXBDaXBoZXI7CisJCQl9CisJCQlwQnNzLT5XZXBTdGF0dXMgPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXI7CisKKwkJCS8qIDYuIEdldCBSU04gY2FwYWJpbGl0eSAqLworCQkJLypwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAqKHUxNiAqKXBUbXA7ICovCisJCQlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAocFRtcFsxXSA8PCA4KSArIHBUbXBbMF07CisJCQlwVG1wICs9IHNpemVvZih1MTYpOworCisJCQkvKiBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnICovCisJCQlpZiAocEJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCisJCQkJcEJzcy0+V1BBMi5iTWl4TW9kZSA9IFRSVUU7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KIAkJTGVuZ3RoIC09IChwRWlkLT5MZW4gKyAyKTsKIAl9CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIG1hY190YWJsZS5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBtYWNfdGFibGUuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiEgXGJyaWVmIGdlbmVyYXRlcyBhIHJhbmRvbSBtYWMgYWRkcmVzcyB2YWx1ZSBmb3IgSUJTUyBCU1NJRAogICoJXHBhcmFtIEFkZHIgdGhlIGJzc2lkIGxvY2F0aW9uCkBAIC00NDUwLDE4ICs0NTQ2LDE1IEBACiAgKglccHJlCiAgKglccG9zdAogICovCi1WT0lEIE1hY0FkZHJSYW5kb21Cc3NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBBZGRyKQordm9pZCBNYWNBZGRyUmFuZG9tQnNzaWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIpCiB7Ci0JSU5UIGk7CisJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFDX0FERFJfTEVOOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykgewogCQlwQWRkcltpXSA9IFJhbmRvbUJ5dGUocEFkKTsKIAl9CiAKLQlwQWRkclswXSA9IChwQWRkclswXSAmIDB4ZmUpIHwgMHgwMjsgIC8vIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4CisJcEFkZHJbMF0gPSAocEFkZHJbMF0gJiAweGZlKSB8IDB4MDI7CS8qIHRoZSBmaXJzdCAyIGJpdHMgbXVzdCBiZSAwMXh4eHh4eHh4ICovCiB9CiAKIC8qISBcYnJpZWYgaW5pdCB0aGUgbWFuYWdlbWVudCBtYWMgZnJhbWUgaGVhZGVyCkBAIC00NDc1LDMzICs0NTY4LDMwIEBACiAgKglccG9zdAogICoJXG5vdGUgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZm9sbG93aW5nIGZpZWxkCiAKLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCUlSUUwgPSBQQVNTSVZFX0xFVkVMCisJSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotVk9JRCBNZ3RNYWNIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCkKK3ZvaWQgTWd0TWFjSGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkgICAgICB1OCBTdWJUeXBlLAorCQkgICAgICB1OCBUb0RzLCB1OCAqcERBLCB1OCAqcEJzc2lkKQogewotCU5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKKwlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOwogCiAJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKIAlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOworLyogICAgICBpZiAoU3ViVHlwZSA9PSBTVUJUWVBFX0FDSykgICAgIC8vIHNhbXBsZSwgbm8gdXNlLCBpdCB3aWxsIGNvbmZsaWN0IHdpdGggQUNUSU9OIGZyYW1lIHN1YiB0eXBlICovCisvKiAgICAgICAgICAgICAgcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsgKi8KIAlwSGRyODAyMTEtPkZDLlRvRHMgPSBUb0RzOwogCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMSwgcERBKTsKLQogCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KIAlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBCc3NpZCk7CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIG1lbV9tZ210LmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIG1lbV9tZ210LmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAogLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUaGlzIHJvdXRpbmUgYnVpbGQgYW4gb3V0Z29pbmcgZnJhbWUsIGFuZCBmaWxsIGFsbCBpbmZvcm1hdGlvbiBzcGVjaWZpZWQKQEAgLTQ1MTAsNDkgKzQ2MDAsNDUgQEAKICAqIGlucHV0IHBhcmFtczoKICAqCQlCdWZmZXIgLSBwb2ludGVyIHRvIGEgcHJlLWFsbG9jYXRlZCBtZW1vcnkgc2VnbWVudAogICoJCWFyZ3MgLSBhIGxpc3Qgb2YgPGludCBhcmdfc2l6ZSwgYXJnPiBwYWlycy4KLSAqCQlOT1RFIE5PVEUgTk9URSEhISEgdGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBOVUxMLCBvdGhlcndpc2UgdGhpcwotICoJCQkJCQkgICBmdW5jdGlvbiB3aWxsIEZBSUwhISEKKyAqCQlOT1RFIE5PVEUgTk9URSEgdGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBOVUxMLCBvdGhlcndpc2UgdGhpcworICoJCQkJCQkgICBmdW5jdGlvbiB3aWxsIEZBSUwhCiAgKiByZXR1cm46CiAgKgkJU2l6ZSBvZiB0aGUgYnVmZmVyCiAgKiB1c2FnZToKICAqCQlNYWtlT3V0Z29pbmdGcmFtZShCdWZmZXIsIG91dHB1dF9sZW5ndGgsIDIsICZmYywgMiwgJmR1ciwgNiwgcF9hZGRyMSwgNixwX2FkZHIyLCBFTkRfT0ZfQVJHUyk7CiAKICBJUlFMID0gUEFTU0lWRV9MRVZFTAotIElSUUwgPSBESVNQQVRDSF9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAogCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVVMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAotCU9VVCBDSEFSICpCdWZmZXIsCi0JT1VUIFVMT05HICpGcmFtZUxlbiwgLi4uKQordW5zaWduZWQgbG9uZyBNYWtlT3V0Z29pbmdGcmFtZSh1OCAqIEJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqIEZyYW1lTGVuLCAuLi4pCiB7Ci0JQ0hBUiAgICpwOwotCWludCAJbGVuZzsKLQlVTE9ORwlUb3RMZW5nOworCXU4ICpwOworCWludCBsZW5nOworCXVuc2lnbmVkIGxvbmcgVG90TGVuZzsKIAl2YV9saXN0IEFyZ3M7CiAKLQkvLyBjYWxjdWxhdGVzIHRoZSB0b3RhbCBsZW5ndGgKKwkvKiBjYWxjdWxhdGVzIHRoZSB0b3RhbCBsZW5ndGggKi8KIAlUb3RMZW5nID0gMDsKIAl2YV9zdGFydChBcmdzLCBGcmFtZUxlbik7Ci0JZG8KLQl7CisJZG8gewogCQlsZW5nID0gdmFfYXJnKEFyZ3MsIGludCk7Ci0JCWlmIChsZW5nID09IEVORF9PRl9BUkdTKQotCQl7CisJCWlmIChsZW5nID09IEVORF9PRl9BUkdTKSB7CiAJCQlicmVhazsKIAkJfQotCQlwID0gdmFfYXJnKEFyZ3MsIFBWT0lEKTsKKwkJcCA9IHZhX2FyZyhBcmdzLCB2b2lkICopOwogCQlOZGlzTW92ZU1lbW9yeSgmQnVmZmVyW1RvdExlbmddLCBwLCBsZW5nKTsKIAkJVG90TGVuZyA9IFRvdExlbmcgKyBsZW5nOwotCX0gd2hpbGUoVFJVRSk7CisJfSB3aGlsZSAoVFJVRSk7CiAKLQl2YV9lbmQoQXJncyk7IC8qIGNsZWFuIHVwICovCisJdmFfZW5kKEFyZ3MpOwkJLyogY2xlYW4gdXAgKi8KIAkqRnJhbWVMZW4gPSBUb3RMZW5nOwogCXJldHVybiBUb3RMZW5nOwogfQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBtbG1lX3F1ZXVlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIG1sbWVfcXVldWUuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKiEgXGJyaWVmCUluaXRpYWxpemUgVGhlIE1MTUUgUXVldWUsIHVzZWQgYnkgTUxNRSBGdW5jdGlvbnMKICAqCVxwYXJhbQkqUXVldWUJICAgVGhlIE1MTUUgUXVldWUKQEAgLTQ1NjQsMTkgKzQ2NTAsMTcgQEAKICBJUlFMID0gUEFTU0lWRV9MRVZFTAogCiAgKi8KLU5ESVNfU1RBVFVTIE1sbWVRdWV1ZUluaXQoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpCitpbnQgTWxtZVF1ZXVlSW5pdChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpCiB7Ci0JSU5UIGk7CisJaW50IGk7CiAKIAlOZGlzQWxsb2NhdGVTcGluTG9jaygmUXVldWUtPkxvY2spOwogCi0JUXVldWUtPk51bQk9IDA7CisJUXVldWUtPk51bSA9IDA7CiAJUXVldWUtPkhlYWQgPSAwOwogCVF1ZXVlLT5UYWlsID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01MTUVfUVVFVUU7IGkrKykKLQl7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRTsgaSsrKSB7CiAJCVF1ZXVlLT5FbnRyeVtpXS5PY2N1cGllZCA9IEZBTFNFOwogCQlRdWV1ZS0+RW50cnlbaV0uTXNnTGVuID0gMDsKIAkJTmRpc1plcm9NZW1vcnkoUXVldWUtPkVudHJ5W2ldLk1zZywgTUdNVF9ETUFfQlVGRkVSX1NJWkUpOwpAQCAtNDU5NiwzNCArNDY4MCwzMSBAQAogICoJXHBvc3QKICAqCVxub3RlCSBUaGUgbWVzc2FnZSBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQKIAotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVFbnF1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVMT05HIE1hY2hpbmUsCi0JSU4gVUxPTkcgTXNnVHlwZSwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gVk9JRCAqTXNnKQorQk9PTEVBTiBNbG1lRW5xdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1bnNpZ25lZCBsb25nIE1hY2hpbmUsCisJCSAgICB1bnNpZ25lZCBsb25nIE1zZ1R5cGUsIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB2b2lkICogTXNnKQogewotCUlOVCBUYWlsOwotCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOworCWludCBUYWlsOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSA9IChzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqKSYgcEFkLT5NbG1lLlF1ZXVlOwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKIAkJcmV0dXJuIEZBTFNFOwogCi0JLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWU6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKKwkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWU6IG1zZyB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLAorCQkJICAgICAgTXNnTGVuKSk7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCi0JeworCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkgewogCQlyZXR1cm4gRkFMU0U7CiAJfQogCkBAIC00NjMxLDggKzQ3MTIsNyBAQAogCVRhaWwgPSBRdWV1ZS0+VGFpbDsKIAlRdWV1ZS0+VGFpbCsrOwogCVF1ZXVlLT5OdW0rKzsKLQlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQotCXsKKwlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKSB7CiAJCVF1ZXVlLT5UYWlsID0gMDsKIAl9CiAKQEAgLTQ2NDAsMTAgKzQ3MjAsOSBAQAogCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7CiAJUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuICA9IE1zZ0xlbjsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuID0gTXNnTGVuOwogCi0JaWYgKE1zZyAhPSBOVUxMKQotCXsKKwlpZiAoTXNnICE9IE5VTEwpIHsKIAkJTmRpc01vdmVNZW1vcnkoUXVldWUtPkVudHJ5W1RhaWxdLk1zZywgTXNnLCBNc2dMZW4pOwogCX0KIApAQCAtNDY1Niw3ICs0NzM1LDcgQEAKICAqCVxwYXJhbQkgVGltZVN0YW1wSGlnaAkgVGhlIHVwcGVyIDMyIGJpdCBvZiB0aW1lc3RhbXAKICAqCVxwYXJhbQkgVGltZVN0YW1wTG93CSBUaGUgbG93ZXIgMzIgYml0IG9mIHRpbWVzdGFtcAogICoJXHBhcmFtCSBSc3NpCQkJIFRoZSByZWNlaXZpbmcgUlNTSSBzdHJlbmd0aAotICoJXHBhcmFtCSBNc2dMZW4gCQkgVGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQorICoJXHBhcmFtCSBNc2dMZW4JCQkgVGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZQogICoJXHBhcmFtCSpNc2cJCQkgVGhlIG1lc3NhZ2UgcG9pbnRlcgogICoJXHJldHVybiAgVFJVRSBpZiBldmVyeXRoaW5nIG9rLCBGQUxTRSBvdGhlcndpc2UgKGxpa2UgUXVldWUgRnVsbCkKICAqCVxwcmUKQEAgLTQ2NjUsODcgKzQ3NDQsNzggQEAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1CT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBXY2lkLAotCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCi0JSU4gVUxPTkcgVGltZVN0YW1wTG93LAotCUlOIFVDSEFSIFJzc2kwLAotCUlOIFVDSEFSIFJzc2kxLAotCUlOIFVDSEFSIFJzc2kyLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBWT0lEICpNc2csCi0JSU4gVUNIQVIgU2lnbmFsKQorQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdW5zaWduZWQgbG9uZyBXY2lkLAorCQkJICAgdW5zaWduZWQgbG9uZyBUaW1lU3RhbXBIaWdoLAorCQkJICAgdW5zaWduZWQgbG9uZyBUaW1lU3RhbXBMb3csCisJCQkgICB1OCBSc3NpMCwKKwkJCSAgIHU4IFJzc2kxLAorCQkJICAgdTggUnNzaTIsCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdm9pZCAqIE1zZywgdTggU2lnbmFsKQogewotCUlOVCAJCSBUYWlsLCBNYWNoaW5lOwotCVBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCUlOVAkJIE1zZ1R5cGU7Ci0JTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7CisJaW50IFRhaWwsIE1hY2hpbmU7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIE1zZzsKKwlpbnQgTXNnVHlwZTsKKwlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUgPSAoc3RydWN0IHJ0X21sbWVfcXVldWUgKikmIHBBZC0+TWxtZS5RdWV1ZTsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JeworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLAorCSAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgewogCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQotCi0JLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotCXsKKwkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUgKi8KKwlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpIHsKIAkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKLQl7CisJaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKSB7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAKIAl7Ci0JCWlmICghTXNnVHlwZVN1YnN0KHBBZCwgcEZyYW1lLCAmTWFjaGluZSwgJk1zZ1R5cGUpKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IHVuLXJlY29uZ25pemVkIG1nbXQtPnN1YnR5cGU9JWRcbiIscEZyYW1lLT5IZHIuRkMuU3ViVHlwZSkpOworCQlpZiAoIU1zZ1R5cGVTdWJzdChwQWQsIHBGcmFtZSwgJk1hY2hpbmUsICZNc2dUeXBlKSkgeworCQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiB1bi1yZWNvbmduaXplZCBtZ210LT5zdWJ0eXBlPSVkXG4iLCBwRnJhbWUtPkhkci5GQy5TdWJUeXBlKSk7CiAJCQlyZXR1cm4gRkFMU0U7CiAJCX0KIAl9CiAKLQkvLyBPSywgd2UgZ290IGFsbCB0aGUgaW5mb3JtYXRpb25zLCBpdCBpcyB0aW1lIHRvIHB1dCB0aGluZ3MgaW50byBxdWV1ZQorCS8qIE9LLCB3ZSBnb3QgYWxsIHRoZSBpbmZvcm1hdGlvbnMsIGl0IGlzIHRpbWUgdG8gcHV0IHRoaW5ncyBpbnRvIHF1ZXVlICovCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CiAJVGFpbCA9IFF1ZXVlLT5UYWlsOwogCVF1ZXVlLT5UYWlsKys7CiAJUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JeworCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpIHsKIAkJUXVldWUtPlRhaWwgPSAwOwogCX0KIAlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKIAlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47CisJUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiA9IE1zZ0xlbjsKIAlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuTG93UGFydCA9IFRpbWVTdGFtcExvdzsKIAlRdWV1ZS0+RW50cnlbVGFpbF0uVGltZVN0YW1wLnUuSGlnaFBhcnQgPSBUaW1lU3RhbXBIaWdoOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMCA9IFJzc2kwOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMSA9IFJzc2kxOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5Sc3NpMiA9IFJzc2kyOwogCVF1ZXVlLT5FbnRyeVtUYWlsXS5TaWduYWwgPSBTaWduYWw7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLldjaWQgPSAoVUNIQVIpV2NpZDsKKwlRdWV1ZS0+RW50cnlbVGFpbF0uV2NpZCA9ICh1OClXY2lkOwogCiAJUXVldWUtPkVudHJ5W1RhaWxdLkNoYW5uZWwgPSBwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWw7CiAKLQlpZiAoTXNnICE9IE5VTEwpCi0JeworCWlmIChNc2cgIT0gTlVMTCkgewogCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7CiAJfQogCiAJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CiAKLQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKIAogCXJldHVybiBUUlVFOwogfQogCi0KIC8qISBcYnJpZWYJIERlcXVldWUgYSBtZXNzYWdlIGZyb20gdGhlIE1MTUUgUXVldWUKICAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQogICoJXHBhcmFtCSpFbGVtCSAgVGhlIG1lc3NhZ2UgZGVxdWV1ZWQgZnJvbSBNTE1FIFF1ZXVlCkBAIC00NzU2LDk3ICs0ODI2LDg4IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotQk9PTEVBTiBNbG1lRGVxdWV1ZSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKLQlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSkKK0JPT0xFQU4gTWxtZURlcXVldWUoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICoqIEVsZW0pCiB7CiAJTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CiAJKkVsZW0gPSAmKFF1ZXVlLT5FbnRyeVtRdWV1ZS0+SGVhZF0pOwogCVF1ZXVlLT5OdW0tLTsKIAlRdWV1ZS0+SGVhZCsrOwotCWlmIChRdWV1ZS0+SGVhZCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JeworCWlmIChRdWV1ZS0+SGVhZCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpIHsKIAkJUXVldWUtPkhlYWQgPSAwOwogCX0KIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKIAlyZXR1cm4gVFJVRTsKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lECU1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIE1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSNpZmRlZiBSVDI4NjAKLQlNTE1FX1FVRVVFX0VMRU0JCSpFbGVtID0gTlVMTDsKLSNlbmRpZgotCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0gPSBOVUxMOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCUJPT0xFQU4gQ2FuY2VsbGVkOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUgXG4iKSk7CiAKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCWlmKHBBZC0+TWxtZS5iUnVubmluZykKLQl7CisJaWYgKHBBZC0+TWxtZS5iUnVubmluZykgewogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwogCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcEFkLT5NbG1lLmJSdW5uaW5nID0gVFJVRTsKIAl9CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKIAotCS8vIFJlbW92ZSBhbGwgTWxtZSBxdWV1ZXMgZWxlbWVudHMKLQl3aGlsZSAoIU1sbWVRdWV1ZUVtcHR5KCZwQWQtPk1sbWUuUXVldWUpKQotCXsKLQkJLy9Gcm9tIG1lc3NhZ2UgdHlwZSwgZGV0ZXJtaW5lIHdoaWNoIHN0YXRlIG1hY2hpbmUgSSBzaG91bGQgZHJpdmUKLQkJaWYgKE1sbWVEZXF1ZXVlKCZwQWQtPk1sbWUuUXVldWUsICZFbGVtKSkKLQkJewotCQkJLy8gZnJlZSBNTE1FIGVsZW1lbnQKKwkvKiBSZW1vdmUgYWxsIE1sbWUgcXVldWVzIGVsZW1lbnRzICovCisJd2hpbGUgKCFNbG1lUXVldWVFbXB0eSgmcEFkLT5NbG1lLlF1ZXVlKSkgeworCQkvKkZyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZSAqLworCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKSB7CisJCQkvKiBmcmVlIE1MTUUgZWxlbWVudCAqLwogCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKIAkJCUVsZW0tPk1zZ0xlbiA9IDA7CiAKLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCURCR1BSSU5UX0VSUigoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKIAkJfQogCX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAogCXsKLQkJLy8gQ2FuY2VsIGFsbCB0aW1lciBldmVudHMKLQkJLy8gQmUgY2FyZWZ1bCB0byBjYW5jZWwgbmV3IGFkZGVkIHRpbWVyCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCSAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCSAgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwJICAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwJICAgJkNhbmNlbGxlZCk7CisJCS8qIENhbmNlbCBhbGwgdGltZXIgZXZlbnRzICovCisJCS8qIEJlIGNhcmVmdWwgdG8gY2FuY2VsIG5ldyBhZGRlZCB0aW1lciAqLworCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmQ2FuY2VsbGVkKTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmQ2FuY2VsbGVkKTsKKwogCX0KIAotCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCisJLyogQ2hhbmdlIGJhY2sgdG8gb3JpZ2luYWwgY2hhbm5lbCBpbiBjYXNlIG9mIGRvaW5nIHNjYW4gKi8KIAlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKIAlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKIAotCS8vIFJlc3VtZSBNU0RVIHdoaWNoIGlzIHR1cm5lZCBvZmYgZHVybmluZyBzY2FuCisJLyogUmVzdW1lIE1TRFUgd2hpY2ggaXMgdHVybmVkIG9mZiBkdXJuaW5nIHNjYW4gKi8KIAlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOwogCiAJewotCQkvLyBTZXQgYWxsIHN0YXRlIG1hY2hpbmVzIGJhY2sgSURMRQotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQ05UTF9JRExFOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSAgID0gQVNTT0NfSURMRTsKLQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IEFVVEhfUkVRX0lETEU7CisJCS8qIFNldCBhbGwgc3RhdGUgbWFjaGluZXMgYmFjayBJRExFICovCisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CisJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKKwkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CiAJCXBBZC0+TWxtZS5BdXRoUnNwTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JTUF9JRExFOwotCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlICAgID0gU1lOQ19JRExFOwotCQlwQWQtPk1sbWUuQWN0TWFjaGluZS5DdXJyU3RhdGUgICAgPSBBQ1RfSURMRTsKKwkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKKwkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlID0gQUNUX0lETEU7CiAJfQogCi0jaWZkZWYgUlQyODYwCi0JLy8gUmVtb3ZlIHJ1bm5pbmcgc3RhdGUKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkvKiBSZW1vdmUgcnVubmluZyBzdGF0ZSAqLwogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7CiAJcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogfQogCiAvKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKQEAgLTQ4NTgsOCArNDkxOSw3IEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKK0JPT0xFQU4gTWxtZVF1ZXVlRW1wdHkoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKQogewogCUJPT0xFQU4gQW5zOwogCkBAIC00ODcxLDcgKzQ5MzEsNyBAQAogfQogCiAvKiEgXGJyaWVmCSB0ZXN0IGlmIHRoZSBNTE1FIFF1ZXVlIGlzIGZ1bGwKLSAqCVxwYXJhbQkgKlF1ZXVlIAkgVGhlIE1MTUUgUXVldWUKKyAqCVxwYXJhbQkgKlF1ZXVlCQkgVGhlIE1MTUUgUXVldWUKICAqCVxyZXR1cm4gIFRSVUUgaWYgdGhlIFF1ZXVlIGlzIGVtcHR5LCBGQUxTRSBvdGhlcndpc2UKICAqCVxwcmUKICAqCVxwb3N0CkBAIC00ODgwLDEzICs0OTQwLDEzIEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotQk9PTEVBTiBNbG1lUXVldWVGdWxsKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKQorQk9PTEVBTiBNbG1lUXVldWVGdWxsKHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSkKIHsKIAlCT09MRUFOIEFuczsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCUFucyA9IChRdWV1ZS0+TnVtID09IE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSB8fCBRdWV1ZS0+RW50cnlbUXVldWUtPlRhaWxdLk9jY3VwaWVkKTsKKwlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUKKwkgICAgICAgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7CiAKIAlyZXR1cm4gQW5zOwpAQCAtNDkwMiwxMSArNDk2MiwxMCBAQAogIElSUUwgPSBQQVNTSVZFX0xFVkVMCiAKICAqLwotVk9JRCBNbG1lUXVldWVEZXN0cm95KAotCUlOIE1MTUVfUVVFVUUgKnBRdWV1ZSkKK3ZvaWQgTWxtZVF1ZXVlRGVzdHJveShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqcFF1ZXVlKQogewogCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKLQlwUXVldWUtPk51bSAgPSAwOworCXBRdWV1ZS0+TnVtID0gMDsKIAlwUXVldWUtPkhlYWQgPSAwOwogCXBRdWV1ZS0+VGFpbCA9IDA7CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOwpAQCAtNDkyNCwxMjYgKzQ5ODMsMTEyIEBACiAgSVJRTCA9IERJU1BBVENIX0xFVkVMCiAKICAqLwotQk9PTEVBTiBNc2dUeXBlU3Vic3QoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotCU9VVCBJTlQgKk1hY2hpbmUsCi0JT1VUIElOVCAqTXNnVHlwZSkKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lLAorCQkgICAgIGludCAqIE1hY2hpbmUsIGludCAqIE1zZ1R5cGUpCiB7Ci0JVVNIT1JUCVNlcTsKLQlVQ0hBUglFQVBUeXBlOwotCVBVQ0hBUglwRGF0YTsKKwl1MTYgU2VxLCBBbGc7CisJdTggRUFQVHlwZTsKKwl1OCAqcERhdGE7CiAKLQkvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEgZnJhbWVzIGluY2x1ZGluZyBTTkFQIGhlYWRlcgotCXBEYXRhID0gKFBVQ0hBUikgcEZyYW1lICsgTEVOR1RIXzgwMl8xMTsKKwkvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEgZnJhbWVzIGluY2x1ZGluZyBTTkFQIGhlYWRlciAqLworCXBEYXRhID0gKHU4ICopcEZyYW1lICsgTEVOR1RIXzgwMl8xMTsKIAotCS8vIFRoZSBvbmx5IGRhdGEgdHlwZSB3aWxsIHBhc3MgdG8gdGhpcyBmdW5jdGlvbiBpcyBFQVBPTCBmcmFtZQotCWlmIChwRnJhbWUtPkhkci5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0JewotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfQUlST05FVCwgcERhdGEsIExFTkdUSF84MDJfMV9IKSkKKwkvKiBUaGUgb25seSBkYXRhIHR5cGUgd2lsbCBwYXNzIHRvIHRoaXMgZnVuY3Rpb24gaXMgRUFQT0wgZnJhbWUgKi8KKwlpZiAocEZyYW1lLT5IZHIuRkMuVHlwZSA9PSBCVFlQRV9EQVRBKSB7CiAJCXsKLQkJCS8vIENpc2NvIEFpcm9uZXQgU05BUCBoZWFkZXIKLQkJCSpNYWNoaW5lID0gQUlST05FVF9TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfQUlST05FVF9NU0c7Ci0JCQlyZXR1cm4gKFRSVUUpOwotCQl9Ci0JCXsKLQkJCSpNYWNoaW5lID0gV1BBX1BTS19TVEFURV9NQUNISU5FOwotCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKLQkJCXJldHVybihXcGFNc2dUeXBlU3Vic3QoRUFQVHlwZSwgTXNnVHlwZSkpOworCQkJKk1hY2hpbmUgPSBXUEFfU1RBVEVfTUFDSElORTsKKwkJCUVBUFR5cGUgPQorCQkJICAgICooKHU4ICopIHBGcmFtZSArIExFTkdUSF84MDJfMTEgKworCQkJICAgICAgTEVOR1RIXzgwMl8xX0ggKyAxKTsKKwkJCXJldHVybiAoV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIChpbnQgKikgTXNnVHlwZSkpOwogCQl9CiAJfQogCi0Jc3dpdGNoIChwRnJhbWUtPkhkci5GQy5TdWJUeXBlKQotCXsKLQkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6Ci0JCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6Ci0JCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SU1A7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9CRUFDT047Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FUSU06Ci0JCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVRJTTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6Ci0JCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQVVUSDoKLQkJCS8vIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0KLQkJCU5kaXNNb3ZlTWVtb3J5KCZTZXEsICZwRnJhbWUtPk9jdGV0WzJdLCBzaXplb2YoVVNIT1JUKSk7Ci0JCQlpZiAoU2VxID09IDEgfHwgU2VxID09IDMpCi0JCQl7Ci0JCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOwotCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9PREQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkKLQkJCXsKKwlzd2l0Y2ggKHBGcmFtZS0+SGRyLkZDLlN1YlR5cGUpIHsKKwljYXNlIFNVQlRZUEVfQVNTT0NfUkVROgorCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUkVROworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgorCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUlNQOworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9SRUFTU09DX1JFUTsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgorCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SU1A7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9QUk9CRV9SRVE6CisJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOworCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1BST0JFX1JFUTsKKwkJYnJlYWs7CisJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKKwkJKk1hY2hpbmUgPSBTWU5DX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfUFJPQkVfUlNQOworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfQkVBQ09OOgorCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9CRUFDT047CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9BVElNOgorCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVElNOworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfRElTQVNTT0M6CisJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ESVNBU1NPQ19SRVE7CisJCWJyZWFrOworCWNhc2UgU1VCVFlQRV9BVVRIOgorCQkvKiBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIHBheWxvYWQgMjQgTWFjIEhlYWRlciArIDIgYnl0ZXMgYWxnb3JpdGhtICovCisJCU5kaXNNb3ZlTWVtb3J5KCZTZXEsICZwRnJhbWUtPk9jdGV0WzJdLCBzaXplb2YodTE2KSk7CisJCU5kaXNNb3ZlTWVtb3J5KCZBbGcsICZwRnJhbWUtPk9jdGV0WzBdLCBzaXplb2YodTE2KSk7CisJCWlmIChTZXEgPT0gMSB8fCBTZXEgPT0gMykgeworCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOworCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9BVVRIX09ERDsKKwkJfSBlbHNlIGlmIChTZXEgPT0gMiB8fCBTZXEgPT0gNCkgeworCQkJaWYgKEFsZyA9PSBBVVRIX01PREVfT1BFTiB8fCBBbGcgPT0gQVVUSF9NT0RFX0tFWSkgewogCQkJCSpNYWNoaW5lID0gQVVUSF9TVEFURV9NQUNISU5FOwogCQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVVUSF9FVkVOOwogCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfREVBVVRIOgotCQkJKk1hY2hpbmUgPSBBVVRIX1JTUF9TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9ERUFVVEg7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FDVElPTjoKLQkJCSpNYWNoaW5lID0gQUNUSU9OX1NUQVRFX01BQ0hJTkU7Ci0JCQkvLyAgU29tZXRpbWVzIFN0YSB3aWxsIHJldHVybiB3aXRoIGNhdGVnb3J5IGJ5dGVzIHdpdGggTVNCID0gMSwgaWYgdGhleSByZWNlaXZlIGNhdG9nb3J5IG91dCBvZiB0aGVpciBzdXBwb3J0Ci0JCQlpZiAoKHBGcmFtZS0+T2N0ZXRbMF0mMHg3RikgPiBNQVhfUEVFUl9DQVRFX01TRykKLQkJCXsKLQkJCQkqTXNnVHlwZSA9IE1UMl9BQ1RfSU5WQUxJRDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqTXNnVHlwZSA9IChwRnJhbWUtPk9jdGV0WzBdJjB4N0YpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6CisJCX0gZWxzZSB7CiAJCQlyZXR1cm4gRkFMU0U7Ci0JCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlRZUEVfREVBVVRIOgorCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7CisJCSpNc2dUeXBlID0gTVQyX1BFRVJfREVBVVRIOworCQlicmVhazsKKwljYXNlIFNVQlRZUEVfQUNUSU9OOgorCQkqTWFjaGluZSA9IEFDVElPTl9TVEFURV9NQUNISU5FOworCQkvKiAgU29tZXRpbWVzIFN0YSB3aWxsIHJldHVybiB3aXRoIGNhdGVnb3J5IGJ5dGVzIHdpdGggTVNCID0gMSwgaWYgdGhleSByZWNlaXZlIGNhdG9nb3J5IG91dCBvZiB0aGVpciBzdXBwb3J0ICovCisJCWlmICgocEZyYW1lLT5PY3RldFswXSAmIDB4N0YpID4gTUFYX1BFRVJfQ0FURV9NU0cpIHsKKwkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOworCQl9IGVsc2UgeworCQkJKk1zZ1R5cGUgPSAocEZyYW1lLT5PY3RldFswXSAmIDB4N0YpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHN0YXRlX21hY2hpbmUuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogc3RhdGVfbWFjaGluZS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qISBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFjaGluZS4KICAqCVxwYXJhbSAqUwkJCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKICAqCVxwYXJhbQlUcmFucwkJU3RhdGUgbWFjaGluZSB0cmFuc2l0aW9uIGZ1bmN0aW9uCiAgKglccGFyYW0JU3ROcgkJbnVtYmVyIG9mIHN0YXRlcwogICoJXHBhcmFtCU1zZ05yCQludW1iZXIgb2YgbWVzc2FnZXMKLSAqCVxwYXJhbQlEZWZGdW5jIAlkZWZhdWx0IGZ1bmN0aW9uLCB3aGVuIHRoZXJlIGlzIGludmFsaWQgc3RhdGUvbWVzc2FnZSBjb21iaW5hdGlvbgorICoJXHBhcmFtCURlZkZ1bmMJCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCiAgKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKICAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKICAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCkBAIC01MDUyLDM0ICs1MDk3LDMwIEBACiAgSVJRTCA9IFBBU1NJVkVfTEVWRUwKIAogICovCi1WT0lEIFN0YXRlTWFjaGluZUluaXQoCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKQordm9pZCBTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkgICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBTdE5yLAorCQkgICAgICB1bnNpZ25lZCBsb25nIE1zZ05yLAorCQkgICAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgRGVmRnVuYywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBJbml0U3RhdGUsIHVuc2lnbmVkIGxvbmcgQmFzZSkKIHsKLQlVTE9ORyBpLCBqOworCXVuc2lnbmVkIGxvbmcgaSwgajsKIAotCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcworCS8qIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcyAqLwogCVMtPk5yU3RhdGUgPSBTdE5yOwotCVMtPk5yTXNnICAgPSBNc2dOcjsKLQlTLT5CYXNlICAgID0gQmFzZTsKKwlTLT5Ock1zZyA9IE1zZ05yOworCVMtPkJhc2UgPSBCYXNlOwogCi0JUy0+VHJhbnNGdW5jICA9IFRyYW5zOworCVMtPlRyYW5zRnVuYyA9IFRyYW5zOwogCi0JLy8gaW5pdCBhbGwgc3RhdGUgdHJhbnNpdGlvbiB0byBkZWZhdWx0IGZ1bmN0aW9uCi0JZm9yIChpID0gMDsgaSA8IFN0TnI7IGkrKykKLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBNc2dOcjsgaisrKQotCQl7CisJLyogaW5pdCBhbGwgc3RhdGUgdHJhbnNpdGlvbiB0byBkZWZhdWx0IGZ1bmN0aW9uICovCisJZm9yIChpID0gMDsgaSA8IFN0TnI7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykgewogCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKIAkJfQogCX0KIAotCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKKwkvKiBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlICovCiAJUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOwogfQogCkBAIC01MDk0LDM4ICs1MTM1LDM0IEBACiAgSVJRTCA9IFBBU1NJVkVfTEVWRUwKIAogICovCi1WT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKK3ZvaWQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJICAgdW5zaWduZWQgbG9uZyBTdCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnLCBJTiBTVEFURV9NQUNISU5FX0ZVTkMgRnVuYykKIHsKLQlVTE9ORyBNc2dJZHg7CisJdW5zaWduZWQgbG9uZyBNc2dJZHg7CiAKIAlNc2dJZHggPSBNc2cgLSBTLT5CYXNlOwogCi0JaWYgKFN0IDwgUy0+TnJTdGF0ZSAmJiBNc2dJZHggPCBTLT5Ock1zZykKLQl7Ci0JCS8vIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24KKwlpZiAoU3QgPCBTLT5OclN0YXRlICYmIE1zZ0lkeCA8IFMtPk5yTXNnKSB7CisJCS8qIGJvdW5kYXJ5IGNoZWNraW5nIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3Rpb24gKi8KIAkJUy0+VHJhbnNGdW5jW1N0ICogUy0+TnJNc2cgKyBNc2dJZHhdID0gRnVuYzsKIAl9CiB9CiAKIC8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc3RhdGUgdHJhbnNpdGlvbgogICoJXHBhcmFtCSAqQWRhcHRlciB0aGUgTklDIGFkYXB0ZXIgcG9pbnRlcgotICoJXHBhcmFtCSAqUyAJICB0aGUgc3RhdGUgbWFjaGluZQorICoJXHBhcmFtCSAqUwkgIHRoZSBzdGF0ZSBtYWNoaW5lCiAgKglccGFyYW0JICpFbGVtCSAgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQKICAqCVxyZXR1cm4gICBOb25lCiAKICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKIAogICovCi1WT0lEIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCSgqKFMtPlRyYW5zRnVuY1tTLT5DdXJyU3RhdGUgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkpKHBBZCwgRWxlbSk7CisJKCooUy0+VHJhbnNGdW5jW1MtPkN1cnJTdGF0ZSAqIFMtPk5yTXNnICsgRWxlbS0+TXNnVHlwZSAtIFMtPkJhc2VdKSkKKwkgICAgKHBBZCwgRWxlbSk7CiB9CiAKIC8qCkBAIC01MTM2LDE1ICs1MTczLDEzIEBACiAJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRHJvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIERyb3Aoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogfQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBsZnNyLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIGxmc3IuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01MTU0LDkgKzUxODksNyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBMZnNySW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBTZWVkKQordm9pZCBMZnNySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgU2VlZCkKIHsKIAlpZiAoU2VlZCA9PSAwKQogCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSAxOwpAQCAtNTE2OSwyNiArNTIwMiwyMyBAQAogCURlc2NyaXB0aW9uOgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVVDSEFSIFJhbmRvbUJ5dGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit1OCBSYW5kb21CeXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVTE9ORyBpOwotCVVDSEFSIFIsIFJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJdTggUiwgUmVzdWx0OwogCiAJUiA9IDA7CiAKIAlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnID09IDApCi0JTmRpc0dldFN5c3RlbVVwVGltZSgoVUxPTkcgKikmcEFkLT5NbG1lLlNoaWZ0UmVnKTsKKwkJTmRpc0dldFN5c3RlbVVwVGltZSgodW5zaWduZWQgbG9uZyAqKSAmIHBBZC0+TWxtZS5TaGlmdFJlZyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyAmIDB4MDAwMDAwMDEpCi0JCXsKLQkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9ICgocEFkLT5NbG1lLlNoaWZ0UmVnIF4gTEZTUl9NQVNLKSA+PiAxKSB8IDB4ODAwMDAwMDA7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAocEFkLT5NbG1lLlNoaWZ0UmVnICYgMHgwMDAwMDAwMSkgeworCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0KKwkJCSAgICAoKHBBZC0+TWxtZS4KKwkJCSAgICAgIFNoaWZ0UmVnIF4gTEZTUl9NQVNLKSA+PiAxKSB8IDB4ODAwMDAwMDA7CiAJCQlSZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gcEFkLT5NbG1lLlNoaWZ0UmVnID4+IDE7CiAJCQlSZXN1bHQgPSAwOwogCQl9CkBAIC01MTk4LDI0NTQgKzUyMjgsNiBAQAogCXJldHVybiBSOwogfQogCi1WT0lEIEFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwUmF0ZVRhYmxlKQotewotCVVDSEFSCQkJCQlpOwotCUhUX0ZCS19DRkcwX1NUUlVDCQlIdENmZzA7Ci0JSFRfRkJLX0NGRzFfU1RSVUMJCUh0Q2ZnMTsKLQlMR19GQktfQ0ZHMF9TVFJVQwkJTGdDZmcwOwotCUxHX0ZCS19DRkcxX1NUUlVDCQlMZ0NmZzE7Ci0JUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlOwotCi0JLy8gc2V0IHRvIGluaXRpYWwgdmFsdWUKLQlIdENmZzAud29yZCA9IDB4NjU0MzIxMDA7Ci0JSHRDZmcxLndvcmQgPSAweGVkY2JhOTg4OwotCUxnQ2ZnMC53b3JkID0gMHhlZGNiYTk4ODsKLQlMZ0NmZzEud29yZCA9IDB4MDAwMDIxMDA7Ci0KLQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSClwUmF0ZVRhYmxlKzE7Ci0JZm9yIChpID0gMTsgaSA8ICooKFBVQ0hBUikgcFJhdGVUYWJsZSk7IGkrKykKLQl7Ci0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMStpOwotCQlzd2l0Y2ggKHBDdXJyVHhSYXRlLT5Nb2RlKQotCQl7Ci0JCQljYXNlIDA6CQkvL0NDSwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgkJLy9PRkRNCi0JCQkJewotCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMDoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzBGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MxRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMzoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzNGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M0RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA1OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNUZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNjoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzZGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDc6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M3RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgkJLy9IVC1NSVgKLQkJCWNhc2UgMzoJCS8vSFQtR0YKLQkJCQl7Ci0JCQkJCWlmICgocE5leHRUeFJhdGUtPk1vZGUgPj0gTU9ERV9IVE1JWCkgJiYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTICE9IHBOZXh0VHhSYXRlLT5DdXJyTUNTKSkKLQkJCQkJewotCQkJCQkJc3dpdGNoKHBDdXJyVHhSYXRlLT5DdXJyTUNTKQotCQkJCQkJewotCQkJCQkJCWNhc2UgMDoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDE6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzFGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMzoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTM0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDQ6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzRGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA1OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNjoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDc6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzdGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA4OgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M4RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgOToKLQkJCQkJCQkJSHRDZmcxLmZpZWxkLkhUTUNTOUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDEwOgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxMEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDExOgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDEyOgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxMkZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDEzOgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxM0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDE0OgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDE1OgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1MxNUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGU6IG5vdCBzdXBwb3J0IEN1cnJNQ1M9JWRcbiIsIHBDdXJyVHhSYXRlLT5DdXJyTUNTKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlwTmV4dFR4UmF0ZSA9IHBDdXJyVHhSYXRlOwotCX0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhUX0ZCS19DRkcwLCBIdENmZzAud29yZCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzEsIEh0Q2ZnMS53b3JkKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMR19GQktfQ0ZHMCwgTGdDZmcwLndvcmQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcxLCBMZ0NmZzEud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZS4KLQkJT3BlcmF0aW9uTW9kZSBBTkQgYk5vbkdGRXhpc3QgYXJlIGZvciBNTSBhbmQgR0YgUHJvdGVjaXRvbi4KLQkJSWYgTU0gb3IgR0YgbWFzayBpcyBub3Qgc2V0LCB0aG9zZSBwYXNzaW5nIGFyZ3VtZW50IGRvZXNuJ3Qgbm90IHRha2UgZWZmZWN0LgotCi0JCU9wZXJhdGlvbiBtb2RlIG1lYW5pbmc6Ci0JCT0gMCA6IFB1cmUgSFQsIG5vIHByZW90ZWN0aW9uLgotCQk9IDB4MDE7IHRoZXJlIG1heSBiZSBub24tSFQgZGV2aWNlcyBpbiBib3RoIHRoZSBjb250cm9sIGFuZCBleHRlbnNpb24gY2hhbm5lbCwgcHJvdGVjdGlvbiBpcyBvcHRpb25hbCBpbiBCU1MuCi0JCT0gMHgxMDogTm8gVHJhbnNtaXNzaW9uIGluIDQwTSBpcyBwcm90ZWN0ZWQuCi0JCT0gMHgxMTogVHJhbnNtaXNzaW9uIGluIGJvdGggNDBNIGFuZCAyME0gc2hhbGwgYmUgcHJvdGVjdGVkCi0JCWlmIChiTm9uR0ZFeGlzdCkKLQkJCXdlIHNob3VsZCBjaG9vc2Ugbm90IHRvIHVzZSBHRi4gQnV0IHN0aWxsIHNldCBjb3JyZWN0IEFTSUMgcmVnaXN0ZXJzLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgCUFzaWNVcGRhdGVQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAJCVVTSE9SVAkJCU9wZXJhdGlvbk1vZGUsCi0JSU4gCQlVQ0hBUgkJCVNldE1hc2ssCi0JSU4JCUJPT0xFQU4JCQliRGlzYWJsZUJHUHJvdGVjdCwKLQlJTgkJQk9PTEVBTgkJCWJOb25HRkV4aXN0KQotewotCVBST1RfQ0ZHX1NUUlVDCVByb3RDZmcsIFByb3RDZmc0OwotCVVJTlQzMiBQcm90ZWN0WzZdOwotCVVTSE9SVAkJCW9mZnNldDsKLQlVQ0hBUgkJCWk7Ci0JVUlOVDMyIE1hY1JlZyA9IDA7Ci0KLQlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvcikKLQl7Ci0JCS8vCi0JCS8vIGVuYWJsZSB0aGUgUlRTL0NUUyB0byBhdm9pZCBjaGFubmVsIGNvbGxpc2lvbgotCQkvLwotCQlTZXRNYXNrID0gQUxMTl9TRVRQUk9URUNUOwotCQlPcGVyYXRpb25Nb2RlID0gODsKLQl9Ci0KLQkvLyBDb25maWcgQVNJQyBSVFMgdGhyZXNob2xkIHJlZ2lzdGVyCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9SVFNfQ0ZHLCAmTWFjUmVnKTsKLQlNYWNSZWcgJj0gMHhGRjAwMDBGRjsKLQotCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYWJsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKLSAgICAgICAgaWYgKCgKLQkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8Ci0JCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKLSAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKLSAgICAgICAgewotCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0JCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKLSAgICAgICAgfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRTX0NGRywgTWFjUmVnKTsKLQotCS8vIEluaXRpYWwgY29tbW9uIHByb3RlY3Rpb24gc2V0dGluZ3MKLQlSVE1QWmVyb01lbW9yeShQcm90ZWN0LCBzaXplb2YoUHJvdGVjdCkpOwotCVByb3RDZmc0LndvcmQgPSAwOwotCVByb3RDZmcud29yZCA9IDA7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU00MCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTIwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd09mZG0gPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93Q2NrID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlJUU1RoRW4gPSAxOwotCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0KLQkvLyB1cGRhdGUgUEhZIG1vZGUgYW5kIHJhdGUKLQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gMHg0MDAwOwotCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgfD0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQotCS8vIEhhbmRsZSBsZWdhY3koQi9HKSBwcm90ZWN0aW9uCi0JaWYgKGJEaXNhYmxlQkdQcm90ZWN0KQotCXsKLQkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7Ci0JCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7Ci0JCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOwkJCS8vIENDSyBkbyBub3QgbmVlZCB0byBiZSBwcm90ZWN0ZWQKLQkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfQ1RTOwkvLyBPRkRNIG5lZWRzIHVzaW5nIENDSyB0byBwcm90ZWN0Ci0JCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7Ci0JfQotCi0JLy8gRGVjaWRlIEhUIGZyYW1lIHByb3RlY3Rpb24uCi0JaWYgKChTZXRNYXNrICYgQUxMTl9TRVRQUk9URUNUKSAhPSAwKQotCXsKLQkJc3dpdGNoKE9wZXJhdGlvbk1vZGUpCi0JCXsKLQkJCWNhc2UgMHgwOgotCQkJCS8vIE5PIFBST1RFQ1QKLQkJCQkvLyAxLkFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwLzQwIE1IeiBIVAotCQkJCS8vIDIuIGluIGFpIDIwLzQwTUh6IEJTUwotCQkJCS8vIDMuIGFsbCBTVEFzIGFyZSAyME1IeiBpbiBhIDIwTUh6IEJTUwotCQkJCS8vIFB1cmUgSFQuIG5vIHByb3RlY3Rpb24uCi0KLQkJCQkvLyBNTTIwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDAxMDExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFsyXSA9IDB4MDE3NDQwMDQ7Ci0KLQkJCQkvLyBNTTQwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vIAlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQotCQkJCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCQkJCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCQkJCS8vIAlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDA4NCAoZHVwbGljYXRlIE9GRE0gMjRNKQotCQkJCVByb3RlY3RbM10gPSAweDAzZjQ0MDg0OwotCi0JCQkJLy8gQ0YyMF9QUk9UX0NGRwotCQkJCS8vCVJlc2VydmVkICgzMToyNykKLQkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQotCQkJCVByb3RlY3RbNF0gPSAweDAxNzQ0MDA0OwotCi0JCQkJLy8gQ0Y0MF9QUk9UX0NGRwotCQkJCS8vCVJlc2VydmVkICgzMToyNykKLQkJCQkvLyAJUFJPVF9UWE9QKDI1OjIwKSAtLSAxMTExMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLyAJUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y0NDA4NDsKLQotCQkJCWlmIChiTm9uR0ZFeGlzdCkKLQkJCQl7Ci0JCQkJCS8vIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aWlvbikKLQkJCQkJLy8gUFJPVF9DVFJMKDE3OjE2KSAtLSAwMSAoUlRTL0NUUykKLQkJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NTQwMDQ7Ci0JCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OwotCQkJCX0KLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0KLSAJCQljYXNlIDE6Ci0JCQkJLy8gVGhpcyBpcyAiSFQgbm9uLW1lbWJlciBwcm90ZWN0aW9uIG1vZGUuIgotCQkJCS8vIElmIHRoZXJlIG1heSBiZSBub24tSFQgU1RBcyBteSBCU1MKLQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OwkvLyBQUk9UX0NUUkwoMTc6MTYpIDogMCAoTm9uZSkKLQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsgLy8gZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKLQkJCQl7Ci0JCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KLQkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzOwotCQkJCX0KLQkJCQkvL0Fzc2lnbiBQcm90ZWN0aW9uIG1ldGhvZCBmb3IgMjAmNDAgTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAyOgotCQkJCS8vIElmIG9ubHkgSFQgU1RBcyBhcmUgaW4gQlNTLiBhdCBsZWFzdCBvbmUgaXMgMjBNSHouIE9ubHkgcHJvdGVjdCA0ME1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZy53b3JkID0gMHgwMTc0NDAwNDsgIC8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCi0KLQkJCQkvL0Fzc2lnbiBQcm90ZWN0aW9uIG1ldGhvZCBmb3IgNDBNSHogcGFja2V0cwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlpZiAoYk5vbkdGRXhpc3QpCi0JCQkJewotCQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJfQotCQkJCVByb3RlY3RbNF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFs1XSA9IFByb3RDZmc0LndvcmQ7Ci0KLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMzoKLQkJCQkvLyBIVCBtaXhlZCBtb2RlLgkgUFJPVEVDVCBBTEwhCi0JCQkJLy8gQXNzaWduIFJhdGUKLQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OwkvL2R1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KLQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0NDA4NDsKLQkJCQkvLyBib3RoIDIwTUh6IGFuZCA0ME1IeiBhcmUgcHJvdGVjdGVkLiBXaGV0aGVyIHVzZSBSVFMgb3IgQ1RTLXRvLXNlbGYgZGVwZW5kcyBvbiB0aGUKLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCi0JCQkJewotCQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQwMDAzOwkvL0VSUCB1c2UgUHJvdGVjdGlvbiBiaXQgaXMgc2V0LCB1c2UgcHJvdGVjdGlvbiByYXRlIGF0IENsYXVzZSAxOC4uCi0JCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQwMDAzOyAvLyBEb24ndCBkdXBsaWNhdGUgUlRTL0NUUyBpbiBDQ0sgbW9kZS4gMHgwM2Y0MDA4MwotCQkJCX0KLQkJCQkvL0Fzc2lnbiBQcm90ZWN0aW9uIG1ldGhvZCBmb3IgMjAmNDAgTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfUlRTOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RlY3RbMl0gPSBQcm90Q2ZnLndvcmQ7Ci0JCQkJUHJvdGVjdFszXSA9IFByb3RDZmc0LndvcmQ7Ci0JCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSA4OgotCQkJCS8vIFNwZWNpYWwgb24gZm9yIEF0aGVyb3MgcHJvYmxlbSBuIGNoaXAuCi0JCQkJUHJvdGVjdFsyXSA9IDB4MDE3NTQwMDQ7Ci0JCQkJUHJvdGVjdFszXSA9IDB4MDNmNTQwODQ7Ci0JCQkJUHJvdGVjdFs0XSA9IDB4MDE3NTQwMDQ7Ci0JCQkJUHJvdGVjdFs1XSA9IDB4MDNmNTQwODQ7Ci0JCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iUlRTTG9uZ1Byb3RPbiA9IFRSVUU7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlvZmZzZXQgPSBDQ0tfUFJPVF9DRkc7Ci0JZm9yIChpID0gMDtpIDwgNjtpKyspCi0JewotCQlpZiAoKFNldE1hc2sgJiAoMTw8IGkpKSkKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgaSo0LCBQcm90ZWN0W2ldKTsKLQkJfQotCX0KLX0KLQotI2lmZGVmIFJUMjg3MAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCi0JLy8gUlgwX1BEICYgVFgwX1BELCBSRiBSMSByZWdpc3RlciBCaXQgMiAmIEJpdCAzIHRvIDAgYW5kIFJGX0JMT0NLX2VuLFJYMV9QRCAmIFRYMV9QRCwgQml0MCwgQml0IDQgJiBCaXQ1IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHgwQykpIHwgMHgzMTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JLy8gVFhfTE8yX2VuLCBSRiBSMTUgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNSwgUkZWYWx1ZSk7Ci0KLQkvLyBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JLy8gdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUKLQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkgJiYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkpCi0JewotCQlSRlZhbHVlIHw9IDB4MjA7Ci0JfQotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7Ci0KLQkvLyBSWF9MTzFfZW4sIFJGIFIyMCByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIwLCBSRlZhbHVlKTsKLQotCS8vIFJYX0xPMl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCi0JLy8gTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMiB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOwotCWVsc2UKLQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQkvKiBlbmQgam9obmxpICovCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUxvYWQgUkYgc2xlZXAtbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQlVSU5UMzIgTUFDVmFsdWU7Ci0KLQkvLyBSRl9CTE9DS19lbi4gUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDEpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MzApOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkvLyBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwRSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKLQotCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDgwKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCi0JLy8gTERPUkZfVkMsIFJGIFIyNyByZWdpc3RlciBCaXQgMCwgQml0IDEgJiBCaXQgMiB0byAxCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQlSRlZhbHVlIHw9IDB4Nzc7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JTUFDVmFsdWUgfD0gMHgxRDAwMDAwMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlSZXZlcnNlIFJGIHNsZWVwLW1vZGUgc2V0dXAKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0JLy8gUkZfQkxPQ0tfZW4sIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgfD0gMHgwMTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JLy8gVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgfD0gMHgzMDsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JLy8gSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSB8PSAweDBFOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7Ci0KLQkvLyBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAxCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQlSRlZhbHVlIHw9IDB4ODA7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKLQotCS8vIExET1JGX1ZDLCBSRiBSMjcgcmVnaXN0ZXIgQml0IDIgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKLQllbHNlCi0JCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0KLQkvLyBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpKQotCXsKLQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIExET19DRkcwLCBNQUNWYWx1ZSk7Ci0JfQotfQotI2VuZGlmCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTd2l0Y2hDaGFubmVsKAotCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCwKLQlJTglCT09MRUFOCQkJYlNjYW4pCi17Ci0JVUxPTkcJCQlSMiA9IDAsIFIzID0gREVGQVVMVF9SRl9UWF9QT1dFUiwgUjQgPSAwOwotCUNIQVIgICAgVHhQd2VyID0gMCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7IC8vQmJwOTQgPSBCQlBSOTRfREVGQVVMVCwgVHhQd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JVUNIQVIJaW5kZXg7Ci0JVUlOVDMyIAlWYWx1ZSA9IDA7IC8vQmJwUmVnLCBWYWx1ZTsKLQlSVE1QX1JGX1JFR1MgKlJGUmVnVGFibGU7Ci0KLQkvLyBTZWFyY2ggVHggcG93ZXIgdmFsdWUKLQkvLyBXZSBjYW4ndCB1c2UgQ2hhbm5lbExpc3QgdG8gc2VhcmNoIGNoYW5uZWwsIHNpbmNlIHNvbWUgY2VudHJhbCBjaGFubmwncyB0eHBvd3IgZG9lc24ndCBsaXN0Ci0JLy8gaW4gQ2hhbm5lbExpc3QsIHNvIHVzZSBUeFBvd2VyIGFycmF5IGluc3RlYWQuCi0JLy8KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpbmRleCsrKQotCXsKLQkJaWYgKENoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2luZGV4XS5DaGFubmVsKQotCXsKLQkJCVR4UHdlciA9IHBBZC0+VHhQb3dlcltpbmRleF0uUG93ZXI7Ci0JCQlUeFB3ZXIyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpbmRleCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBc2ljU3dpdGNoQ2hhbm5lbDogQ2FuJ3QgZmluZCB0aGUgQ2hhbm5lbCMlZCBcbiIsIENoYW5uZWwpKTsKLQotI2lmZGVmIFJUMjg3MAotCS8vIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eAotCWlmICgoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDkwKHBBZCkpICYmICgKLQkgICAgIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMikgfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIxKSB8fAotCSAgICAgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApKSkKLQl7Ci0JCS8qIG1vZGlmeSBieSBXWSBmb3IgUmVhZCBSRiBSZWcuIGVycm9yICovCi0JCVVDSEFSIFJGVmFsdWU7Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKLQkJewotCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMywgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7Ci0KLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RkMpIHwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uUjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIFJGVmFsdWUpOwotCi0JCQkJLy8gU2V0IFR4MCBQb3dlcgotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXI7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEyLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBUeDEgUG93ZXIKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyMjsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsIFJGVmFsdWUpOwotCi0JCQkJLy8gVHgvUnggU3RyZWFtIHNldHRpbmcKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQkJCS8vaWYgKElTX1JUMzA5MChwQWQpKQotCQkJCS8vCVJGVmFsdWUgfD0gMHgwMTsgLy8gRW5hYmxlIFJGIGJsb2NrLgotCQkJCVJGVmFsdWUgJj0gMHgwMzsJLy9jbGVhciBiaXRbN34yXQotCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCVJGVmFsdWUgfD0gMHhBMDsKLQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCQkJCVJGVmFsdWUgfD0gMHg4MDsKLQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQlSRlZhbHVlIHw9IDB4NTA7Ci0JCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQlSRlZhbHVlIHw9IDB4NDA7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBSRiBvZmZzZXQKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5SZkZyZXFPZmZzZXQ7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIzLCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBCVwotCQkJCWlmICghYlNjYW4gJiYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkpCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQ7Ci0JCQkJCS8vRElTQUJMRV8xMU5fQ0hFQ0socEFkKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0OwotCQkJCX0KLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGVmFsdWUpOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBFbmFibGUgUkYgdHVuaW5nCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gUkZWYWx1ZSB8IDB4MTsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCQkJLy8gbGF0Y2ggY2hhbm5lbCBmb3IgZnV0dXJlIHVzYWdlLgotCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSVkLCBQd3IxPSVkLCAlZFQpLCBOPTB4JTAyWCwgSz0weCUwMlgsIFI9MHglMDJYXG4iLAotCQkJCQlDaGFubmVsLAotCQkJCQlwQWQtPlJmSWNUeXBlLAotCQkJCQlUeFB3ZXIsCi0JCQkJCVR4UHdlcjIsCi0JCQkJCXBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLk4sCi0JCQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLkssCi0JCQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLlIpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWQsIFB3cjE9JWQsICVkVCksIE49MHglMDJYLCBLPTB4JTAyWCwgUj0weCUwMlhcbiIsCi0JCQlDaGFubmVsLAotCQkJcEFkLT5SZkljVHlwZSwKLQkJCVR4UHdlciwKLQkJCVR4UHdlcjIsCi0JCQlwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uTiwKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLkssCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5SKSk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQl7Ci0JCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCi0JCXsKLQkJCWNhc2UgUkZJQ18yODIwOgotCQkJY2FzZSBSRklDXzI4NTA6Ci0JCQljYXNlIFJGSUNfMjcyMDoKLQkJCWNhc2UgUkZJQ18yNzUwOgotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJewotCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyOwotCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDQwMDA7CS8vIElmIFRYcGF0aCBpcyAxLCBiaXQgMTQgPSAxOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCQkJewotCQkJCQkJUjIgfD0gMHg0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhwYXRoLgotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJewotCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCi0JCQkJCX0KLQotCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KQotCQkJCQl7Ci0JCQkJCQkvLyBpbml0aWFsaXplIFIzLCBSNAotCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKTsKLQkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpOwotCi0JCQkJCQkvLyA1RyBiYW5kIHBvd2VyIHJhbmdlOiAweEY5fjBYMEYsIFRYMCBSZWczIGJpdDkvVFgxIFJlZzQgYml0Nj0iMCIgbWVhbnMgdGhlIFRYIHBvd2VyIHJlZHVjZSA3ZEIKLQkJCQkJCS8vIFIzCi0JCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQotCQkJCQkJewotCQkJCQkJCVR4UHdlciA9ICg3K1R4UHdlcik7Ci0JCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOwotCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXI9JWQgXG4iLCBUeFB3ZXIpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJUjMgfD0gKFR4UHdlciA8PCAxMCkgfCAoMSA8PCA5KTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gUjQKLQkJCQkJCWlmICgoVHhQd2VyMiA+PSAtNykgJiYgKFR4UHdlcjIgPCAwKSkKLQkJCQkJCXsKLQkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7Ci0JCQkJCQkJVHhQd2VyMiA9IChUeFB3ZXIyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcjIpOwotCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKLQkJCQkJCQlSNCB8PSAoVHhQd2VyMiA8PCA3KSB8ICgxIDw8IDYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7IC8vIHNldCBUWCBwb3dlcjAKLQkJCQkJUjQgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjQgJiAofjB4MDAxZjg3YzApKSB8IChwQWQtPlJmRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOy8vIFNldCBmcmVxIE9mZnNldCAmIFR4UHdyMQotCQkJCQl9Ci0KLQkJCQkJLy8gQmFzZWQgb24gQkJQIGN1cnJlbnQgbW9kZSBiZWZvcmUgY2hhbmdpbmcgUkYgY2hhbm5lbC4KLQkJCQkJaWYgKCFiU2NhbiAmJiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKSkKLQkJCQkJewotCQkJCQkJUjQgfD0weDIwMDAwMDsKLQkJCQkJfQotCi0JCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZXMKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7Ci0JCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OwotCi0JCQkJCS8vIFNldCBSRiB2YWx1ZSAxJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCi0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCQkJCQkvLyBTZXQgUkYgdmFsdWUgMidzIHNldCBSM1tiaXQyXSA9IFsxXQotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzIHwgMHgwNCkpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0KLQkJCQkJLy8gU2V0IFJGIHZhbHVlIDMncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc2l3dGNoIGZyb20gYS0+ZywgZy0+YQotCWlmIChDaGFubmVsIDw9IDE0KQotCXsKLQkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjBBOy8vR2FyeSAyMDA3LzA4LzA5IDB4MDUwQTBBCi0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjMsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsIDApOy8vKDB4NDQgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwkvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCi0JCS8vIFJ4IEhpZ2ggcG93ZXIgVkdBIG9mZnNldCBmb3IgTE5BIHNlbGVjdAotCSAgICBpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKLQkgICAgewotCSAgICAgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4NjIpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NDYpOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAgICAgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODIsIDB4ODQpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzUsIDB4NTApOwotCSAgICB9Ci0KLQkJLy8gNUcgYmFuZCBzZWxlY3Rpb24gUElOLCBiaXQxIGFuZCBiaXQyIGFyZSBjb21wbGVtZW50Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHg2KTsKLQkJVmFsdWUgfD0gKDB4MDQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0gICAgICAgIC8vIFR1cm4gb2ZmIHVudXNlZCBQQSBvciBMTkEgd2hlbiBvbmx5IDFUIG9yIDFSCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JCX0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vR2FyeSAyMDA3LzgvOSAweDA1MDUwNQotCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweEYyKTsKLQotCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKLQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckEpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKLQkJfQotCi0JCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4Nik7Ci0JCVZhbHVlIHw9ICgweDAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQotICAgICAgICAvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCX0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKLQl9Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOwotCX0KLQotICAgIC8vIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZwotCS8vUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQlpZiAoYlNjYW4pCi0JCVJUTVBTZXRBR0NJbml0VmFsdWUocEFkLCBCV18yMCk7Ci0JZWxzZQotCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXKTsKLQotCS8vCi0JLy8gT24gMTFBLCBXZSBzaG91bGQgZGVsYXkgYW5kIHdhaXQgUkYvQkJQIHRvIGJlIHN0YWJsZQotCS8vIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGltZSBzaG91bGQgYmUgMTAwMCBtaWNybyBzZWNvbmRzCi0JLy8gMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCi0JLy8KLQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgUHdyMD0lbHUsIFB3cjE9JWx1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKLQkJCQkJCQkgIENoYW5uZWwsCi0JCQkJCQkJICBwQWQtPlJmSWNUeXBlLAotCQkJCQkJCSAgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKLQkJCQkJCQkgIChSNCAmIDB4MDAwMDA3YzApID4+IDYsCi0JCQkJCQkJICBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjIsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIzLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIDI0MjEgb25seSwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkdXJpbmcKLQkJc2l0ZSBzdXJ2ZXkuIEl0J3Mgb25seSByZXF1aXJlZCBhZnRlciBOSUMgZGVjaWRlZCB0byBzdGF5IGF0IGEgY2hhbm5lbAotCQlmb3IgYSBsb25nZXIgcGVyaW9kLgotCQlXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCdzIGFsd2F5cyBhZnRlciBBc2ljU3dpdGNoQ2hhbm5lbCgpLgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0xvY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIENoYW5uZWwpCi17Ci19Ci0KLVZPSUQgQXNpY1JmVHVuaW5nRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJR2l2ZXMgQ0NLIFRYIHJhdGUgMiBtb3JlIGRCIFRYIHBvd2VyLgotCQlUaGlzIHJvdXRpbmUgd29ya3Mgb25seSBpbiBMSU5LIFVQIGluIElORlJBU1RSVUNUVVJFIG1vZGUuCi0KLQkJY2FsY3VsYXRlIGRlc2lyZWQgVHggcG93ZXIgaW4gUkYgUjMuVHgwfjUsCXNob3VsZCBjb25zaWRlciAtCi0JCTAuIGlmIGN1cnJlbnQgcmFkaW8gaXMgYSBub2lzeSBlbnZpcm9ubWVudCAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCkKLQkJMS4gVHhQb3dlclBlcmNlbnRhZ2UKLQkJMi4gYXV0byBjYWxpYnJhdGlvbiBiYXNlZCBvbiBUU1NJIGZlZWRiYWNrCi0JCTMuIGV4dHJhIDIgZGIgZm9yIENDSwotCQk0LiAtMTAgZGIgdXBvbiB2ZXJ5LXNob3J0IGRpc3RhbmNlIChBdmdSU1NJID49IC00MGRiKSB0byBBUAotCi0JTk9URTogU2luY2UgdGhpcyByb3V0aW5lIHJlcXVpcmVzIHRoZSB2YWx1ZSBvZiAocEFkLT5EcnNDb3VudGVycy5mTm9pc3lFbnZpcm9ubWVudCksCi0JCWl0IHNob3VsZCBiZSBjYWxsZWQgQUZURVIgTWxtZUR5bmFtaWNUeFJhdFN3aXRjaGluZygpCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlJTlQJCQlpLCBqOwotCUNIQVIJCURlbHRhUHdyID0gMDsKLQlCT09MRUFOCQliQXV0b1R4QWdjID0gRkFMU0U7Ci0JVUNIQVIJCVRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOwotCVVDSEFSCQlCYnBSMSA9IDAsIEJicFI0OSA9IDAsIGlkeDsKLQlQQ0hBUgkJcFR4QWdjQ29tcGVuc2F0ZTsKLQlVTE9ORwkJVHhQd3JbNV07Ci0JQ0hBUgkJVmFsdWU7Ci0KLSNpZmRlZiBSVDI4NjAKLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQotCQl8fCAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpCi0JCXx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikKLQkJfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQkJcmV0dXJuOwotI2VuZGlmCi0KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCi0JLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4gdHJ5IGV2ZXJ5IDQgc2Vjb25kCi0JaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCS8qIGJnIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogYSBjaGFubmVsICovCi0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOwotCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKLQkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKLQkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOwotCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKLQkJfQotCi0JCWlmIChiQXV0b1R4QWdjKQotCQl7Ci0JCQkvKiBCYnBSMSBpcyB1bnNpZ25lZCBjaGFyICovCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQ5LCAmQmJwUjQ5KTsKLQotCQkJLyogKHApIFRzc2lQbHVzQm91bmRhcnlHWzBdID0gMCA9IChtKSBUc3NpTWludXNCb3VuZGFyeUdbMF0gKi8KLQkJCS8qIGNvbXBlbnNhdGU6ICs0ICAgICArMyAgICsyICAgKzEgICAgMCAgIC0xICAgLTIgICAtMyAgIC00ICogc3RlcHMgKi8KLQkJCS8qIHN0ZXAgdmFsdWUgaXMgZGVmaW5lZCBpbiBwQWQtPlR4QWdjU3RlcEcgZm9yIHR4IHBvd2VyIHZhbHVlICovCi0KLQkJCS8qIFs0XSsxK1s0XSAgIHA0ICAgICBwMyAgIHAyICAgcDEgICBvMSAgIG0xICAgbTIgICBtMyAgIG00ICovCi0JCQkvKiBleDogICAgICAgICAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAotCQkJICAgYWJvdmUgdmFsdWUgYXJlIGV4YW1pbmVkIGluIG1hc3MgZmFjdG9yeSBwcm9kdWN0aW9uICovCi0JCQkvKiAgICAgICAgICAgICBbNF0gICAgWzNdICBbMl0gIFsxXSAgWzBdICBbMV0gIFsyXSAgWzNdICBbNF0gKi8KLQotCQkJLyogcGx1cyAoKykgaXMgMHgwMCB+IDB4NDUsIG1pbnVzICgtKSBpcyAweGEwIH4gMHhmMCAqLwotCQkJLyogaWYgdmFsdWUgaXMgYmV0d2VlbiBwMSB+IG8xIG9yIG8xIH4gczEsIG5vIG5lZWQgdG8gYWRqdXN0IHR4IHBvd2VyICovCi0JCQkvKiBpZiB2YWx1ZSBpcyAweGE1LCB0eCBwb3dlciB3aWxsIGJlIC09IFR4QWdjU3RlcCooMi0xKSAqLwotCi0JCQlpZiAoQmJwUjQ5ID4gcFRzc2lNaW51c0JvdW5kYXJ5WzFdKQotCQkJewotCQkJCS8vIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQotCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIKLQkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkgIC8vIEZvdW5kIHRoZSByYW5nZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCi0JCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHgtMSkpOwotCi0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLSBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSAtJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZSBpZiAoQmJwUjQ5IDwgcFRzc2lQbHVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQotCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIKLQkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKSAgIC8vIEZvdW5kIHRoZSByYW5nZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCi0JCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOwotCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSNDk9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKLQkJfQotCi0JCWlmIChiQXV0b1R4QWdjKQotCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQl9Ci0KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBSMSk7Ci0JQmJwUjEgJj0gMHhGQzsKLQotCS8qIGNhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSSAqLwotCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKLQkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSQotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9PSAweGZmZmZmZmZmKSAgICAgICAvLyBBVVRPIFRYIFBPV0VSIGNvbnRyb2wKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApICAvLyA5MSB+IDEwMCUgJiBBVVRPLCB0cmVhdCBhcyAxMDAlIGluIHRlcm1zIG9mIG1XCi0JCTsKLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKSAgLy8gNjEgfiA5MCUsIHRyZWF0IGFzIDc1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMTsKLQl7Ci0JCURlbHRhUHdyIC09IDE7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAzOwotCXsKLQkJRGVsdGFQd3IgLT0gMzsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkgIC8vIDE2IH4gMzAlLCB0cmVhdCBhcyAyNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDY7Ci0JewotCQlCYnBSMSB8PSAweDAxOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpICAgLy8gMTAgfiAxNSUsIHRyZWF0IGFzIDEyLjUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSA5OwotCXsKLQkJQmJwUjEgfD0gMHgwMTsKLQkJRGVsdGFQd3IgLT0gMzsKLQl9Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gMTI7Ci0JewotCQlCYnBSMSB8PSAweDAyOwotCX0KLQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFIxKTsKLQotCS8qIHJlc2V0IGRpZmZlcmVudCBuZXcgdHggcG93ZXIgZm9yIGRpZmZlcmVudCBUWCByYXRlICovCi0JZm9yKGk9MDsgaTw1OyBpKyspCi0JewotCQlpZiAoVHhQd3JbaV0gIT0gMHhmZmZmZmZmZikKLQkJewotCQkJZm9yIChqPTA7IGo8ODsgaisrKQotCQkJewotCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7IC8qIDAgfiAxNSAqLwotCi0JCQkJaWYgKChWYWx1ZSArIERlbHRhUHdyKSA8IDApCi0JCQkJewotCQkJCQlWYWx1ZSA9IDA7IC8qIG1pbiAqLwotCQkJCX0KLQkJCQllbHNlIGlmICgoVmFsdWUgKyBEZWx0YVB3cikgPiAweEYpCi0JCQkJewotCQkJCQlWYWx1ZSA9IDB4RjsgLyogbWF4ICovCi0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVZhbHVlICs9IERlbHRhUHdyOyAvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24gKi8KLQkJCQl9Ci0KLQkJCQkvKiBmaWxsIG5ldyB2YWx1ZSB0byBDU1Igb2Zmc2V0ICovCi0JCQkJVHhQd3JbaV0gPSAoVHhQd3JbaV0gJiB+KDB4MDAwMDAwMEYgPDwgaio0KSkgfCAoVmFsdWUgPDwgaio0KTsKLQkJCX0KLQotCQkJLyogd3JpdGUgdHggcG93ZXIgdmFsdWUgdG8gQ1NSICovCi0JCQkvKiBUWF9QV1JfQ0ZHXzAgKDggdHggcmF0ZSkgZm9yCVRYIHBvd2VyIGZvciBPRkRNIDEyTS8xOE0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIE9GRE0gNk0vOU0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzUuNU0vMTFNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0sxTS8yTSAqLwotCQkJLyogVFhfUFdSX0NGR18xIH4gVFhfUFdSX0NGR180ICovCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIFR4UHdyW2ldKTsKLQkJfQotCX0KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXB1dCBQSFkgdG8gc2xlZXAgaGVyZSwgYW5kIHNldCBuZXh0IHdha2V1cCB0aW1lci4gUEhZIGRvZXNuJ3Qgbm90IHdha2V1cAotCQlhdXRvbWF0aWNhbGx5LiBJbnN0ZWFkLCBNQ1Ugd2lsbCBpc3N1ZSBhIFR3YWtlVXBJbnRlcnJ1cHQgdG8gaG9zdCBhZnRlcgotCQl0aGUgd2FrZXVwIHRpbWVyIHRpbWVvdXQuIERyaXZlciBoYXMgdG8gaXNzdWUgYSBzZXBhcmF0ZSBjb21tYW5kIHRvIHdha2UKLQkJUEhZIHVwLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKQotewotICAgIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgbWFudWFsIHdha2V1cCBpcyByZXF1aXJlZAotCQlBc2ljRm9yY2VTbGVlcCgpIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBub3QgaW4gSU5GUkEgQlNTLiBXaGVuCi0JCWluIElORlJBIEJTUywgd2Ugc2hvdWxkIHVzZSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgpIGluc3RlYWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRm9yY2VTbGVlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgVHdha2V1cCB0aW1lciAoc2V0IHZpYSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCkKLQkJZXhwaXJlZC4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0jaWZkZWYgUlQyODYwCi0JSU4gVUNIQVIgICAgCSBMZXZlbCkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCUlOIEJPT0xFQU4gICAgYkZyb21UeCkKLSNlbmRpZgotewotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljRm9yY2VXYWtldXAgXG4iKSk7Ci0jaWZkZWYgUlQyODYwCi0gICAgUlQyOFhYX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBMZXZlbCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSAgICBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpOwotI2VuZGlmCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2V0IE15IEJTU0lECi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1NldEJzc2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQnNzaWQpCi17Ci0JVUxPTkcJCSAgQWRkcjQ7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT0+IEFzaWNTZXRCc3NpZCAleDoleDoleDoleDoleDoleFxuIiwKLQkJcEJzc2lkWzBdLHBCc3NpZFsxXSxwQnNzaWRbMl0scEJzc2lkWzNdLCBwQnNzaWRbNF0scEJzc2lkWzVdKSk7Ci0KLQlBZGRyNCA9IChVTE9ORykocEJzc2lkWzBdKQkJIHwKLQkJCShVTE9ORykocEJzc2lkWzFdIDw8IDgpICB8Ci0JCQkoVUxPTkcpKHBCc3NpZFsyXSA8PCAxNikgfAotCQkJKFVMT05HKShwQnNzaWRbM10gPDwgMjQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzAsIEFkZHI0KTsKLQotCUFkZHI0ID0gMDsKLQkvLyBhbHdheXMgb25lIEJTU0lEIGluIFNUQSBtb2RlCi0JQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFs0XSkgfCAoVUxPTkcpKHBCc3NpZFs1XSA8PCA4KTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19CU1NJRF9EVzEsIEFkZHI0KTsKLX0KLQotVk9JRCBBc2ljU2V0TWNhc3RXQygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOwotCVVTSE9SVAkJb2Zmc2V0OwotCi0JcEVudHJ5LT5Tc3QgICAgICAgID0gU1NUX0FTU09DOwotCXBFbnRyeS0+QWlkICAgICAgICA9IE1DQVNUX1dDSUQ7CS8vIFNvZnRhcCBzdXBwb3J0cyAxIEJTU0lEIGFuZCB1c2UgV0NJRD0wIGFzIG11bHRpY2FzdCBXY2lkIGluZGV4Ci0JcEVudHJ5LT5Qc01vZGUgICAgID0gUFdSX0FDVElWRTsKLQlwRW50cnktPkN1cnJUeFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQlvZmZzZXQgPSBNQUNfV0NJRF9CQVNFICsgQlNTME1jYXN0X1dDSUQgKiBIV19XQ0lEX0VOVFJZX1NJWkU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGVsV2NpZFRhYigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUglXY2lkKQotewotCVVMT05HCQkgIEFkZHIwID0gMHgwLCBBZGRyMSA9IDB4MDsKLQlVTE9ORyAJCW9mZnNldDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNEZWxXY2lkVGFiPT0+V2NpZCA9IDB4JXhcbiIsV2NpZCkpOwotCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBXY2lkICogSFdfV0NJRF9FTlRSWV9TSVpFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjApOwotCW9mZnNldCArPSA0OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjEpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0VuYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlUWF9MSU5LX0NGR19TVFJVQwlUeExpbmtDZmc7Ci0JVUlOVDMyCQkJCURhdGEgPSAwOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKLQlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7Ci0JRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQlEYXRhICB8PSAweDgwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Ci0KLQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGlzYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlUWF9MSU5LX0NGR19TVFJVQwlUeExpbmtDZmc7Ci0JVUlOVDMyCQkJCURhdGEgPSAwOwotCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwotCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQotCURhdGEgICY9IDB4RkZGRkZGMDA7Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9EWU5BTUlDX0JFX1RYT1BfQUNUSVZFKQotCQkmJiAocEFkLT5NYWNUYWIuZkFueVN0YXRpb25NSU1PUFNEeW5hbWljID09IEZBTFNFKQotCSkKLQl7Ci0JCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKLQkJCURhdGEgfD0gMHgyMDsKLQl9Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0Rpc2FibGVTeW5jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+RGlzYWJsZSBUU0Ygc3luY2hyb25pemF0aW9uXG4iKSk7Ci0KLQkvLyAyMDAzLTEyLTIwIGRpc2FibGUgVFNGIGFuZCBUQlRUIHdoaWxlIE5JQyBpbiBwb3dlci1zYXZpbmcgaGF2ZSBzaWRlIGVmZmVjdAotCS8vCQkJICB0aGF0IE5JQyB3aWxsIG5ldmVyIHdha2VzIHVwIGJlY2F1c2UgVFNGIHN0b3BzIGFuZCBubyBtb3JlCi0JLy8JCQkgIFRCVFQgaW50ZXJydXB0cwotCXBBZC0+VGJ0dFRpY2tDb3VudCA9IDA7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0JY3NyLmZpZWxkLmJCZWFjb25HZW4gPSAwOwotCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7Ci0JY3NyLmZpZWxkLlRzZlN5bmNNb2RlID0gMDsKLQljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRW5hYmxlQnNzU3luYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVCc3NTeW5jKElORlJBIG1vZGUpXG4iKSk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQotCXsKLQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQotCQljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAxOwotCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAxOyAvLyBzeW5jIFRTRiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCi0JCWNzci5maWVsZC5iQmVhY29uR2VuICA9IDA7IC8vIGRvIE5PVCBnZW5lcmF0ZSBCRUFDT04KLQkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMTsKLQl9Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCU5vdGU6Ci0JCUJFQUNPTiBmcmFtZSBpbiBzaGFyZWQgbWVtb3J5IHNob3VsZCBiZSBidWlsdCBvayBiZWZvcmUgdGhpcyByb3V0aW5lCi0JCWNhbiBiZSBjYWxsZWQuIE90aGVyd2lzZSwgYSBnYXJiYWdlIGZyYW1lIG1heWJlIHRyYW5zbWl0dGVkIG91dCBldmVyeQotCQlCZWFjb24gcGVyaW9kLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNFbmFibGVJYnNzU3luYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOTsKLQlQVUNIQVIJCQlwdHI7Ci0JVUlOVCBpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPkFzaWNFbmFibGVJYnNzU3luYyhBREhPQyBtb2RlLiBNUERVdG90YWxCeXRlQ291bnQgPSAlZClcbiIsIHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyOS53b3JkKTsKLQljc3I5LmZpZWxkLmJCZWFjb25HZW4gPSAwOwotCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAwOwotCWNzcjkuZmllbGQuYlRzZlRpY2tpbmcgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEJDTl9USU1FX0NGRywgY3NyOS53b3JkKTsKLQotI2lmZGVmIFJUMjg2MAotCS8vIG1vdmUgQkVBQ09OIFRYRCBhbmQgZnJhbWUgY29udGVudCB0byBvbi1jaGlwIG1lbW9yeQotCXB0ciA9IChQVUNIQVIpJnBBZC0+QmVhY29uVHhXSTsKLQlmb3IgKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpICAvLyAxNi1ieXRlIFRYV0kgZmllbGQKLQl7Ci0JCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgbG9uZ3B0cik7Ci0JCXB0ciArPSA0OwotCX0KLQotCS8vIHN0YXJ0IHJpZ2h0IGFmdGVyIHRoZSAxNi1ieXRlIFRYV0kgZmllbGQKLQlwdHIgPSBwQWQtPkJlYWNvbkJ1ZjsKLQlmb3IgKGk9MDsgaTwgcEFkLT5CZWFjb25UeFdJLk1QRFV0b3RhbEJ5dGVDb3VudDsgaSs9NCkKLQl7Ci0JCVVJTlQzMiBsb25ncHRyID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgbG9uZ3B0cik7Ci0JCXB0ciArPTQ7Ci0JfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JLy8gbW92ZSBCRUFDT04gVFhEIGFuZCBmcmFtZSBjb250ZW50IHRvIG9uLWNoaXAgbWVtb3J5Ci0JcHRyID0gKFBVQ0hBUikmcEFkLT5CZWFjb25UeFdJOwotCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9MikgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCXsKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgaSwgcHRyLCAyKTsKLQkJcHRyICs9IDI7Ci0JfQotCi0JLy8gc3RhcnQgcmlnaHQgYWZ0ZXIgdGhlIDE2LWJ5dGUgVFhXSSBmaWVsZAotCXB0ciA9IHBBZC0+QmVhY29uQnVmOwotCWZvciAoaT0wOyBpPCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50OyBpKz0yKQotCXsKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgSFdfQkVBQ09OX0JBU0UwICsgVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKLQkJcHRyICs9MjsKLQl9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQkvLyBzdGFydCBzZW5kaW5nIEJFQUNPTgotCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7Ci0JY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7IC8vIHN5bmMgVFNGIGluIElCU1MgbW9kZQotCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOwotCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU2V0RWRjYVBhcm0oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUEVEQ0FfUEFSTQkgcEVkY2FQYXJtKQotewotCUVEQ0FfQUNfQ0ZHX1NUUlVDICAgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOwotCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOwotCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOwotCUFJRlNOX0NTUl9TVFJVQyAgICBBaWZzbkNzcjsKLQlDV01JTl9DU1JfU1RSVUMgICAgQ3dtaW5Dc3I7Ci0JQ1dNQVhfQ1NSX1NUUlVDICAgIEN3bWF4Q3NyOwotCWludCBpOwotCi0JQWMwQ2ZnLndvcmQgPSAwOwotCUFjMUNmZy53b3JkID0gMDsKLQlBYzJDZmcud29yZCA9IDA7Ci0JQWMzQ2ZnLndvcmQgPSAwOwotCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNTZXRFZGNhUGFybVxuIikpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKLQkJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQkJewotCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSB8fCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSkKLQkJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQkJfQotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJaWYoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKLQkJewotCQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKLQkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAweDIwOyAvLyBTdWdnZXN0IGJ5IEpvaG4gZm9yIFR4QnVyc3QgaW4gSFQgTW9kZQotCQl9Ci0JCWVsc2UKLQkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKLQkJQWMwQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMENmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzBDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIEFjMENmZy53b3JkKTsKLQotCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JLCi0JCUFjMUNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOwotCQlBYzFDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKLQkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gMjsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzFfQ0ZHLCBBYzFDZmcud29yZCk7Ci0KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKLQkJewotCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDE5MjsJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcwotCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcwotCQkJQWMzQ2ZnLmZpZWxkLkFjVHhvcCA9IDQ4OwkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcwotCQl9Ci0JCUFjMkNmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOwotCQlBYzJDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKLQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gMjsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzJfQ0ZHLCBBYzJDZmcud29yZCk7Ci0JCUFjM0NmZy5maWVsZC5Dd21pbiA9IENXX01JTl9JTl9CSVRTOwotCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBDV19NQVhfSU5fQklUUzsKLQkJQWMzQ2ZnLmZpZWxkLkFpZnNuID0gMjsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7Ci0KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyAgICAgIERNQSBSZWdpc3RlciBoYXMgYSBjb3B5IHRvby4KLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAwOwkJLy8gUUlEX0FDX0JFCi0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IDA7CQkvLyBRSURfQUNfQksKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikKLQkJewotCQkJY3NyMS5maWVsZC5BYzJUeG9wID0gMTkyOwkJLy8gQUNfVkk6IDE5MiozMnVzIH49IDZtcwotCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gOTY7CQkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQljc3IxLmZpZWxkLkFjMlR4b3AgPSA5NjsJCS8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcwotCQkJY3NyMS5maWVsZC5BYzNUeG9wID0gNDg7CQkvLyBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcwotCQl9Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjEud29yZCk7Ci0KLQkJQ3dtaW5Dc3Iud29yZCA9IDA7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMCA9IENXX01JTl9JTl9CSVRTOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBDV19NSU5fSU5fQklUUzsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4yID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IENXX01JTl9JTl9CSVRTOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fQ1dNSU5fQ0ZHLCBDd21pbkNzci53b3JkKTsKLQotCQlDd21heENzci53b3JkID0gMDsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgwID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MSA9IENXX01BWF9JTl9CSVRTOwotCQlDd21heENzci5maWVsZC5Dd21heDIgPSBDV19NQVhfSU5fQklUUzsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgzID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01BWF9DRkcsIEN3bWF4Q3NyLndvcmQpOwotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIDB4MDAwMDIyMjIpOwotCi0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyAgICAgIE1BQyBSZWdpc3RlciBoYXMgYSBjb3B5LgotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vCi0JCS8vIE1vZGlmeSBDd21pbi9Dd21heC9UeG9wIG9uIHF1ZXVlW1FJRF9BQ19WSV0sIFJlY29tbWVuZCBieSBKZXJyeSAyMDA1LzA3LzI3Ci0JCS8vIFRvIGRlZ3JhZGUgb3VyIFZJRE8gUXVldWUncyB0aHJvdWdocHV0IGZvciBXaUZpIFdNTSBTM1QwNyBJc3N1ZS4KLQkJLy8KLQkJLy9wRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICogNyAvIDEwOyAvLyBydDI4NjBjIG5lZWQgdGhpcwotCi0JCUFjMENmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV07Ci0JCUFjMENmZy5maWVsZC5Dd21pbj0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOwotCQlBYzBDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV07Ci0JCUFjMENmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXTsgLy8rMTsKLQotCQlBYzFDZmcuZmllbGQuQWNUeG9wID0gIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdOwotCQlBYzFDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107IC8vKzI7Ci0JCUFjMUNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JLXTsKLQkJQWMxQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOyAvLysxOwotCi0JCUFjMkNmZy5maWVsZC5BY1R4b3AgPSAocEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA2KSAvIDEwOwotCQlBYzJDZmcuZmllbGQuQ3dtaW4gPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WSV07Ci0JCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXTsKLQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOwotCi0JCXsKLQkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCQlBYzJDZmcuZmllbGQuQWlmc24gLT0gMTsKLQotCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCi0JCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKLQkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCXsKLQkJCQlBYzBDZmcuZmllbGQuQWlmc24gPSAzOwotCQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA1OwotCQkJfQotCi0jaWZkZWYgUlQyODcwCi0JCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjAgfHwgcEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApCi0JCQl7Ci0JCQkJLy8gVHVuaW5nIGZvciBXaUZpIFdNTSBTMy1UMDc6IGNvbm5leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhLgotCQkJCUFjMkNmZy5maWVsZC5BaWZzbiA9IDU7Ci0JCQl9Ci0jZW5kaWYKLQkJfQotCi0JCUFjM0NmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXTsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dOwotCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT107Ci0JCUFjM0NmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsKLQotLy8jaWZkZWYgV0lGSV9URVNUCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QpCi0JCXsKLQkJCWlmIChBYzNDZmcuZmllbGQuQWNUeG9wID09IDEwMikKLQkJCXsKLQkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA/IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdIDogMTA7Ci0JCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuICA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXS0xOyAvKiBBSUZTTiBtdXN0ID49IDEgKi8KLQkJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKLQkJCQlBYzFDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOwotCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldOwotCQkJfSAvKiBFbmQgb2YgaWYgKi8KLQkJfQotLy8jZW5kaWYgLy8gV0lGSV9URVNUIC8vCi0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7Ci0KLQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IEFjMENmZy5maWVsZC5BY1R4b3A7Ci0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IEFjMUNmZy5maWVsZC5BY1R4b3A7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7Ci0KLQkJY3NyMS5maWVsZC5BYzJUeG9wID0gQWMyQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJY3NyMS5maWVsZC5BYzNUeG9wID0gQWMzQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKLQotCQlDd21pbkNzci53b3JkID0gMDsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKLQotCQlDd21pbkNzci5maWVsZC5Dd21pbjMgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19WT10gLSAxOyAvL2ZvciBUR24gd2lmaSB0ZXN0Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7Ci0KLQkJQ3dtYXhDc3Iud29yZCA9IDA7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOwotCQlDd21heENzci5maWVsZC5Dd21heDIgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7Ci0KLQkJQWlmc25Dc3Iud29yZCA9IDA7Ci0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IEFjMENmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07Ci0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMSA9IEFjMUNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107Ci0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07Ci0KLQkJewotCQkJLy8gVHVuaW5nIGZvciBXaS1GaSBXTU0gUzA2Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpRmlUZXN0ICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbiAtIDQ7Ci0KLQkJCS8vIFR1bmluZyBmb3IgVEduIFdpLUZpIDUuMi4zMgotCQkJLy8gU1RBIFRlc3RCZWQgY2hhbmdlcyBpbiB0aGlzIGl0ZW06IGNvbm5leGFudCBsZWdhY3kgc3RhID09PiBicm9hZGNvbSAxMW4gc3RhCi0JCQlpZiAoU1RBX1RHTl9XSUZJX09OKHBBZCkgJiYKLQkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCi0JCQl7Ci0JCQkJQWlmc25Dc3IuZmllbGQuQWlmc24wID0gMzsKLQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSA3OwotCQkJfQotI2lmZGVmIFJUMjg3MAotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotI2VuZGlmCi0JCX0KLQotCQlBaWZzbkNzci5maWVsZC5BaWZzbjMgPSBBYzNDZmcuZmllbGQuQWlmc24gLSAxOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsgLy9mb3IgVEduIHdpZmkgdGVzdAotI2lmZGVmIFJUMjg3MAotCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjAgfHwgcEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApCi0JCQlBaWZzbkNzci5maWVsZC5BaWZzbjIgPSAweDI7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldOyAvL2ZvciBXaUZpIFdNTSBTNC1UMDQuCi0jZW5kaWYKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgQWlmc25Dc3Iud29yZCk7Ci0KLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQlpZiAoIUFESE9DX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRURDQSBbIyVkXTogQUlGU04gQ1dtaW4gQ1dtYXggIFRYT1AodXMpICBBQ01cbiIsIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50KSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQkUgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzBdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMF0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFswXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMF08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzBdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfQksgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzFdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMV0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsxXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMV08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzFdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVkkgICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzJdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bMl0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFsyXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbMl08PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzJdKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiAgICAgQUNfVk8gICAgICAlMmQgICAgICUyZCAgICAgJTJkICAgICAgJTRkICAgICAlZFxuIiwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkFpZnNuWzNdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtaW5bM10sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5Dd21heFszXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPlR4b3BbM108PDUsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5iQUNNWzNdKSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIAlBc2ljU2V0U2xvdFRpbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSkKLXsKLQlVTE9ORwlTbG90VGltZTsKLQlVSU5UMzIJUmVnVmFsdWUgPSAwOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJYlVzZVNob3J0U2xvdFRpbWUgPSBUUlVFOwotCi0JaWYgKGJVc2VTaG9ydFNsb3RUaW1lKQotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOwotCWVsc2UKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOwotCi0JU2xvdFRpbWUgPSAoYlVzZVNob3J0U2xvdFRpbWUpPyA5IDogMjA7Ci0KLQl7Ci0JCS8vIGZvcmNlIHVzaW5nIHNob3J0IFNMT1QgdGltZSBmb3IgRkFFIHRvIGRlbW8gcGVyZm9ybWFuY2Ugd2hlbiBUeEJ1cnN0IGlzIE9OCi0JCWlmICgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSkpCi0JCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpCi0JCQkpCi0JCXsKLQkJCS8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCB0aGluayBpdCBpcyBkb2luZyBXaS1GaSB0ZXN0Ci0JCQkvLyBBbmQgd2Ugd2lsbCBub3Qgc2V0IHRvIHNob3J0IHNsb3Qgd2hlbiBiRW5hYmxlVHhCdXJzdCBpcyBUUlVFLgotCQl9Ci0JCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KQotCQkJU2xvdFRpbWUgPSA5OwotCX0KLQotCS8vCi0JLy8gRm9yIHNvbWUgcmVhc29ucywgYWx3YXlzIHNldCBpdCB0byBzaG9ydCBzbG90IHRpbWUuCi0JLy8KLQkvLyBUb0RvOiBTaG91bGQgY29uc2lkZXIgY2FwYWJpbGl0eSB3aXRoIDExQgotCS8vCi0JaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQlTbG90VGltZSA9IDIwOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBCS09GRl9TTE9UX0NGRywgJlJlZ1ZhbHVlKTsKLQlSZWdWYWx1ZSA9IFJlZ1ZhbHVlICYgMHhGRkZGRkYwMDsKLQotCVJlZ1ZhbHVlIHw9IFNsb3RUaW1lOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgQktPRkZfU0xPVF9DRkcsIFJlZ1ZhbHVlKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQWRkIFNoYXJlZCBrZXkgaW5mb3JtYXRpb24gaW50byBBU0lDLgotCQlVcGRhdGUgc2hhcmVkIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgU2hhcmVkIGtleSB0YWJsZQotCQlVcGRhdGUgaXRzIGNpcGhlckFsZyB0byBBc2ljIFNoYXJlZCBrZXkgTW9kZS4KLQotICAgIFJldHVybjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0luZGV4LAotCUlOIFVDSEFSCQkgS2V5SWR4LAotCUlOIFVDSEFSCQkgQ2lwaGVyQWxnLAotCUlOIFBVQ0hBUgkJIHBLZXksCi0JSU4gUFVDSEFSCQkgcFR4TWljLAotCUlOIFBVQ0hBUgkJIHBSeE1pYykKLXsKLQlVTE9ORyBvZmZzZXQ7IC8vLCBjc3IwOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0jaWZkZWYgUlQyODYwCi0JSU5UICAgaTsKLSNlbmRpZgotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKLQlpZiAocFJ4TWljKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKLQl9Ci0JaWYgKHBUeE1pYykKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7Ci0JfQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vCi0JLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKLQkvLwotCi0Jb2Zmc2V0ID0gU0hBUkVEX0tFWV9UQUJMRV9CQVNFICsgKDQqQnNzSW5kZXggKyBLZXlJZHgpKkhXX0tFWV9FTlRSWV9TSVpFOwotI2lmZGVmIFJUMjg2MAotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfU0hBUkVfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcEtleSwgTUFYX0xFTl9PRl9TSEFSRV9LRVkpOwotI2VuZGlmCi0Jb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfU0hBUkVfS0VZOwotCWlmIChwVHhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFR4TWljW2ldKTsKLQkJfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFR4TWljLCA4KTsKLSNlbmRpZgotCX0KLQotCW9mZnNldCArPSA4OwotCWlmIChwUnhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0ICsgaSwgcFJ4TWljW2ldKTsKLQkJfQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgcFJ4TWljLCA4KTsKLSNlbmRpZgotCX0KLQotCi0JLy8KLQkvLyBVcGRhdGUgY2lwaGVyIGFsZ29yaXRobS4gV1NUQSBhbHdheXMgdXNlIEJTUzAKLQkvLwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksICZjc3IxLndvcmQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUmVhZDogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdIEtleUlkeFslZF09IDB4JXggXG4iLCBCc3NJbmRleCxLZXlJZHgsIGNzcjEud29yZCkpOwotCWlmICgoQnNzSW5kZXglMikgPT0gMCkKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCX0KLQllbHNlCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKLQotfQotCi0vLwlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQnNzSW5kZXgsCi0JSU4gVUNIQVIJCSBLZXlJZHgpCi17Ci0JLy9VTE9ORyBTZWNDc3IwOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeTogIyVkIFxuIiwgQnNzSW5kZXgqNCArIEtleUlkeCkpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7Ci0JaWYgKChCc3NJbmRleCUyKSA9PSAwKQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IDA7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IDA7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IDA7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSAwOwotCX0KLQllbHNlCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkxQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gMDsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IDA7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGU6IFNIQVJFRF9LRVlfTU9ERV9CQVNFIGF0IHRoaXMgQnNzWyVkXSA9IDB4JXggXG4iLCBCc3NJbmRleCwgY3NyMS53b3JkKSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UrNCooQnNzSW5kZXgvMiksIGNzcjEud29yZCk7Ci0JQVNTRVJUKEJzc0luZGV4IDwgNCk7Ci0JQVNTRVJUKEtleUlkeCA8IDQpOwotCi19Ci0KLQotVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKQotewotCVVMT05HICAgV0NJREF0dHJpID0gMCwgb2Zmc2V0OwotCi0JLy8KLQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUuCi0JLy8gT25seSBUeEtleSBjb3VsZCB1cGRhdGUgV0NJRCBhdHRyaWJ1dGUuCi0JLy8KLQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChXQ0lEICogSFdfV0NJRF9BVFRSSV9TSVpFKTsKLQlXQ0lEQXR0cmkgPSAoQnNzSW5kZXggPDwgNCkgfCAoQ2lwaGVyQWxnIDw8IDEpIHwgKGJVc2VQYWlyZXdpc2VLZXlUYWJsZSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOwotfQotCi1WT0lEIEFzaWNVcGRhdGVXQ0lESVZFSVYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVMT05HICAgICAgICB1SVYsCi0JSU4gVUxPTkcgICAgICAgIHVFSVYpCi17Ci0JVUxPTkcJb2Zmc2V0OwotCi0Jb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB1SVYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIHVFSVYpOwotfQotCi1WT0lEIEFzaWNVcGRhdGVSeFdDSURUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkcikKLXsKLQlVTE9ORyBvZmZzZXQ7Ci0JVUxPTkcgQWRkcjsKLQotCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7Ci0JQWRkciA9IHBBZGRyWzBdICsgKHBBZGRyWzFdIDw8IDgpICsocEFkZHJbMl0gPDwgMTYpICsocEFkZHJbM10gPDwgMjQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcik7Ci0JQWRkciA9IHBBZGRyWzRdICsgKHBBZGRyWzVdIDw8IDgpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIDQsIEFkZHIpOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSwgSVYvRUlWIHRvIEFzaWMKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICBXQ0lEICAgICAgICAgICAgICAgICAgICBXQ0lEIEVudHJ5IG51bWJlci4KLSAgICAgICAgQnNzSW5kZXggICAgICAgICAgICAgICAgQlNTSUQgaW5kZXgsIHN0YXRpb24gb3Igbm9uZSBtdWx0aXBsZSBCU1NJRCBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdmFsdWUgc2hvdWxkIGJlIDAuCi0gICAgICAgIEtleUlkeCAgICAgICAgICAgICAgICAgIFRoaXMgS2V5SWR4IHdpbGwgc2V0IHRvIElWJ3MgS2V5SUQgaWYgYlR4S2V5IGVuYWJsZWQKLSAgICAgICAgcENpcGhlcktleSAgICAgICAgICAgICAgUG9pbnRlciB0byBDaXBoZXIgS2V5LgotICAgICAgICBiVXNlUGFpcmV3aXNlS2V5VGFibGUgICBUUlVFIG1lYW5zIHNhdmVkIHRoZSBrZXkgaW4gU2hhcmVkS2V5IHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgUGFpcmV3aXNlS2V5IHRhYmxlCi0gICAgICAgIGJUeEtleSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHRyYW5zbWl0IGtleSBpZiBlbmFibGVkLgotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBUaGlzIHJvdXRpbmUgd2lsbCBzZXQgdGhlIHJlbGF0aXZlIGtleSBzdHVmZiB0byBBc2ljIGluY2x1ZGluZyBXQ0lEIGF0dHJpYnV0ZSwKLSAgICAgICAgQ2lwaGVyIEtleSwgQ2lwaGVyIGFsZ29yaXRobSBhbmQgSVYvRUlWLgotCi0gICAgICAgIElWL0VJViB3aWxsIGJlIHVwZGF0ZSBpZiB0aGlzIENpcGhlcktleSBpcyB0aGUgdHJhbnNtaXNzaW9uIGtleSBiZWNhdXNlCi0gICAgICAgIEFTSUMgd2lsbCBiYXNlIG9uIElWJ3MgS2V5SUQgdmFsdWUgdG8gc2VsZWN0IENpcGhlciBLZXkuCi0KLSAgICAgICAgSWYgYlR4S2V5IHNldHMgdG8gRkFMU0UsIHRoaXMgaXMgbm90IHRoZSBUWCBrZXksIGJ1dCBpdCBjb3VsZCBiZQotICAgICAgICBSWCBrZXkKLQotICAgIAlGb3IgQVAgbW9kZSBiVHhLZXkgbXVzdCBiZSBhbHdheXMgc2V0IHRvIFRSVUUuCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVDSEFSCQlCc3NJbmRleCwKLQlJTiBVQ0hBUgkJS2V5SWR4LAotCUlOIFBDSVBIRVJfS0VZCXBDaXBoZXJLZXksCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlLAotCUlOIEJPT0xFQU4JCWJUeEtleSkKLXsKLQlVTE9ORwlvZmZzZXQ7Ci0JVUNIQVIJSVY0ID0gMDsKLQlQVUNIQVIJCXBLZXkgPSBwQ2lwaGVyS2V5LT5LZXk7Ci0JUFVDSEFSCQlwVHhNaWMgPSBwQ2lwaGVyS2V5LT5UeE1pYzsKLQlQVUNIQVIJCXBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOwotCVBVQ0hBUgkJcFR4dHNjID0gcENpcGhlcktleS0+VHhUc2M7Ci0JVUNIQVIJCUNpcGhlckFsZyA9IHBDaXBoZXJLZXktPkNpcGhlckFsZzsKLQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOwotI2lmZGVmIFJUMjg2MAotCVVDSEFSCQlpOwotI2VuZGlmCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gQXNpY0FkZEtleUVudHJ5XG4iKSk7Ci0JLy8KLQkvLyAxLikgZGVjaWRlIGtleSB0YWJsZSBvZmZzZXQKLQkvLwotCWlmIChiVXNlUGFpcmV3aXNlS2V5VGFibGUpCi0JCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7Ci0JZWxzZQotCQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOwotCi0JLy8KLQkvLyAyLikgU2V0IEtleSB0byBBc2ljCi0JLy8KLQkvL2ZvciAoaSA9IDA7IGkgPCBLZXlMZW47IGkrKykKLSNpZmRlZiBSVDI4NjAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKQotCXsKLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBLZXksIE1BWF9MRU5fT0ZfUEVFUl9LRVkpOwotI2VuZGlmCi0Jb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7Ci0KLQkvLwotCS8vIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUKLQkvLwotCWlmIChwVHhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBUeE1pYywgOCk7Ci0jZW5kaWYKLQl9Ci0Jb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKLQotCWlmIChwUnhNaWMpCi0JewotI2lmZGVmIFJUMjg2MAotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQlSVFVTQk11bHRpV3JpdGUocEFkLCBvZmZzZXQsIHBSeE1pYywgOCk7Ci0jZW5kaWYKLQl9Ci0KLQotCS8vCi0JLy8gNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMKLQkvLyAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuCi0JLy8KLQlpZiAoYlR4S2V5KQotCXsKLSNpZmRlZiBSVDI4NjAKLQkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCQkvLwotCQkvLyBXcml0ZSBJVgotCQkvLwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCwgcFR4dHNjWzFdKTsKLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAxLCAoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikpOwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDIsIHBUeHRzY1swXSk7Ci0KLQkJSVY0ID0gKEtleUlkeCA8PCA2KTsKLQkJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCi0JCQlJVjQgfD0gMHgyMDsgIC8vIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlCi0KLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVjQpOwotCi0JCS8vCi0JCS8vIFdyaXRlIEVJVgotCQkvLwotCQlvZmZzZXQgKz0gNDsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHh0c2NbaSArIDJdKTsKLQkJfQotCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJVUlOVDMyIHRtcFZhbDsKLQotCQkvLwotCQkvLyBXcml0ZSBJVgotCQkvLwotCQlJVjQgPSAoS2V5SWR4IDw8IDYpOwotCQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8KENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQkJCUlWNCB8PSAweDIwOyAgLy8gdHVybiBvbiBleHRlbnNpb24gYml0IG1lYW5zIEVJViBleGlzdGVuY2UKLQotCQl0bXBWYWwgPSBwVHh0c2NbMV0gKyAoKChwVHh0c2NbMV0gfCAweDIwKSAmIDB4N2YpIDw8IDgpICsgKHBUeHRzY1swXSA8PCAxNikgKyAoSVY0IDw8IDI0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCB0bXBWYWwpOwotCi0JCS8vCi0JCS8vIFdyaXRlIEVJVgotCQkvLwotCQlvZmZzZXQgKz0gNDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCAqKFBVSU5UMzIpJnBDaXBoZXJLZXktPlR4VHNjWzJdKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBXQ0lELCBCc3NJbmRleCwgQ2lwaGVyQWxnLCBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOwotCX0KLQotCWlmICghYlVzZVBhaXJld2lzZUtleVRhYmxlKQotCXsKLQkJLy8KLQkJLy8gT25seSB1cGRhdGUgdGhlIHNoYXJlZCBrZXkgc2VjdXJpdHkgbW9kZQotCQkvLwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCAqIChCc3NJbmRleCAvIDIpLCAmY3NyMS53b3JkKTsKLQkJaWYgKChCc3NJbmRleCAlIDIpID09IDApCi0JCXsKLQkJCWlmIChLZXlJZHggPT0gMCkKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChLZXlJZHggPT0gMCkKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkwQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAyKQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5M0NpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJfQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgY3NyMS53b3JkKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gQXNpY0FkZEtleUVudHJ5XG4iKSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQWRkIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgaW50byBBU0lDLgotCQlVcGRhdGUgcGFpcndpc2Uga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBQYWlyLXdpc2Uga2V5IHRhYmxlCi0KLSAgICBSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSCQlXQ0lELAotCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSkKLXsKLQlJTlQgaTsKLQlVTE9ORyAJCW9mZnNldDsKLQlQVUNIQVIJCSBwS2V5ID0gcENpcGhlcktleS0+S2V5OwotCVBVQ0hBUgkJIHBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOwotCVBVQ0hBUgkJIHBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOwotI2lmZGVmIERCRwotCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7Ci0jZW5kaWYgLy8gREJHIC8vCi0KLQkvLyBFS0VZCi0Jb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLSNpZmRlZiBSVDI4NjAKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVJUVVNCTXVsdGlXcml0ZShwQWQsIG9mZnNldCwgJnBDaXBoZXJLZXktPktleVswXSwgTUFYX0xFTl9PRl9QRUVSX0tFWSk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9QRUVSX0tFWTsgaSs9NCkKLQl7Ci0JCVVJTlQzMiBWYWx1ZTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBvZmZzZXQgKyBpLCAmVmFsdWUpOwotCX0KLQotCW9mZnNldCArPSBNQVhfTEVOX09GX1BFRVJfS0VZOwotCi0JLy8gIE1JQyBLRVkKLQlpZiAocFR4TWljKQotCXsKLSNpZmRlZiBSVDI4NjAKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwVHhNaWNbaV0pOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+VHhNaWNbMF0sIDgpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCX0KLQlvZmZzZXQgKz0gODsKLQlpZiAocFJ4TWljKQotCXsKLSNpZmRlZiBSVDI4NjAKLQkJZm9yIChpPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCtpLCBwUnhNaWNbaV0pOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgb2Zmc2V0LCAmcENpcGhlcktleS0+UnhNaWNbMF0sIDgpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnk6IFdDSUQgIyVkIEFsZz0lc1xuIixXQ0lELCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwS2V5WzBdLHBLZXlbMV0scEtleVsyXSxwS2V5WzNdLHBLZXlbNF0scEtleVs1XSxwS2V5WzZdLHBLZXlbN10scEtleVs4XSxwS2V5WzldLHBLZXlbMTBdLHBLZXlbMTFdLHBLZXlbMTJdLHBLZXlbMTNdLHBLZXlbMTRdLHBLZXlbMTVdKSk7Ci0JaWYgKHBSeE1pYykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOwotCX0KLQlpZiAocFR4TWljKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7Ci0JfQotfQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDLgotCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJZHgsCi0JSU4gVUNIQVIJCSBXY2lkKQotewotCVVMT05HCQlXQ0lEQXR0cmk7Ci0JVVNIT1JUCQlvZmZzZXQ7Ci0KLQkvLyByZS1zZXQgdGhlIGVudHJ5J3MgV0NJRCBhdHRyaWJ1dGUgYXMgT1BFTi1OT05FLgotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCVdDSURBdHRyaSA9IChCc3NJZHg8PDQpIHwgUEFJUldJU0VLRVlUQUJMRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci19Ci0KLUJPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kLAotCUlOIFVDSEFSCQkgVG9rZW4sCi0JSU4gVUNIQVIJCSBBcmcwLAotCUlOIFVDSEFSCQkgQXJnMSkKLXsKLQlIT1NUX0NNRF9DU1JfU1RSVUMJSDJNQ21kOwotCUgyTV9NQUlMQk9YX1NUUlVDCUgyTU1haWxib3g7Ci0JVUxPTkcJCQkJaSA9IDA7Ci0KLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOwotCQlpZiAoSDJNTWFpbGJveC5maWVsZC5Pd25lciA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQl9IHdoaWxlKGkrKyA8IDEwMCk7Ci0KLQlpZiAoaSA+IDEwMCkKLQl7Ci0JCXsKLSNpZmRlZiBSVDI4NjAKLQkJCVVJTlQzMiBEYXRhOwotCi0JCQkvLyBSZXNldCBETUEKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX1NZU19DVFJMLCAmRGF0YSk7Ci0JCQlEYXRhIHw9IDB4MjsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQkJCS8vIEFmdGVyIFJlc2V0IERNQSwgRE1BIGluZGV4IHdpbGwgYmVjb21lIFplcm8uIFNvIERyaXZlciBuZWVkIHRvIHJlc2V0IGFsbCByaW5nIGluZGV4cyB0b28uCi0JCQkvLyBSZXNldCBETUEvQ1BVIHJpbmcgaW5kZXgKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZJKTsKLQkJCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7Ci0JCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfSENDQSk7Ci0JCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfTUdNVCk7Ci0JCQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JCQkvLyBDbGVhciBSZXNldAotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZEYXRhKTsKLQkJCURhdGEgJj0gMHhmZmZmZmZmZDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0jZW5kaWYgLyogUlQyODYwICovCi0JCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKLQkJfQotCQkvL3JldHVybiBGQUxTRTsKLSNpZmRlZiBSVDI4NzAKLQkJcmV0dXJuIEZBTFNFOwotI2VuZGlmCi0JfQotCi0JSDJNTWFpbGJveC5maWVsZC5Pd25lcgkgID0gMTsJICAgLy8gcGFzcyBvd25lcnNoaXAgdG8gTUNVCi0JSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOwotCUgyTU1haWxib3guZmllbGQuSGlnaEJ5dGUgPSBBcmcxOwotCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSAgPSBBcmcwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgSDJNTWFpbGJveC53b3JkKTsKLQotCUgyTUNtZC53b3JkIAkJCSAgPSAwOwotCUgyTUNtZC5maWVsZC5Ib3N0Q29tbWFuZCAgPSBDb21tYW5kOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOwotCi0JaWYgKENvbW1hbmQgIT0gMHg4MCkKLQl7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBSVDI4NjAKLUJPT0xFQU4gQXNpY0NoZWNrQ29tbWFuT2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kKQotewotCVVJTlQzMglDbWRTdGF0dXMgPSAwLCBDSUQgPSAwLCBpOwotCVVJTlQzMglUaGlzQ0lETWFzayA9IDA7Ci0KLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsICZDSUQpOwotCQkvLyBGaW5kIHdoZXJlIHRoZSBjb21tYW5kIGlzLiBCZWNhdXNlIHRoaXMgaXMgcmFuZG9tbHkgc3BlY2lmaWVkIGJ5IGZpcm13YXJlLgotCQlpZiAoKENJRCAmIENJRDBNQVNLKSA9PSBDb21tYW5kKQotCQl7Ci0JCQlUaGlzQ0lETWFzayA9IENJRDBNQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMU1BU0spPj44KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEMU1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQyTUFTSyk+PjE2KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEMk1BU0s7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmICgoKChDSUQgJiBDSUQzTUFTSyk+PjI0KSAmIDB4ZmYpID09IENvbW1hbmQpCi0JCXsKLQkJCVRoaXNDSURNYXNrID0gQ0lEM01BU0s7Ci0JCQlicmVhazsKLQkJfQotCi0JCVJUTVB1c2VjRGVsYXkoMTAwKTsKLQkJaSsrOwotCX13aGlsZSAoaSA8IDIwMCk7Ci0KLQkvLyBHZXQgQ29tbWFuZFN0YXR1cyBWYWx1ZQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAmQ21kU3RhdHVzKTsKLQotCS8vIFRoaXMgY29tbWFuZCdzIHN0YXR1cyBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBhcyBjb21tYW5kLiBTbyBBTkQgY29tbWFuZCBwb3NpdGlvbidzIGJpdG1hc2sgdG8gcmVhZCBzdGF0dXMuCi0JaWYgKGkgPCAyMDApCi0JewotCQkvLyBJZiBTdGF0dXMgaXMgMSwgdGhlIGNvbWFtbmQgaXMgc3VjY2Vzcy4KLQkJaWYgKCgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MSkgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDApCi0JCQl8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwKSB8fCAoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEwMDAwMDApKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuT2sgQ0lEID0gMHgleCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ0lELCBDbWRTdGF0dXMpKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbkZhaWwxIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsIENJRCwgQ21kU3RhdHVzKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMiBUaW1lb3V0IENvbW1hbmQgPSAlZCwgQ21kU3RhdHVzPSAweCV4IFxuIiwgQ29tbWFuZCwgQ21kU3RhdHVzKSk7Ci0JfQotCS8vIENsZWFyIENvbW1hbmQgYW5kIFN0YXR1cy4KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NJRCwgMHhmZmZmZmZmZik7Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0jZW5kaWYgLyogUlQ4MjYwICovCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTc2NjIsMTMgKzUyNDQsMTEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUENoZWNrUmF0ZXMoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVAlVQ0hBUgkJCVN1cFJhdGVbXSwKLQlJTiBPVVQJVUNIQVIJCQkqU3VwUmF0ZUxlbikKK3ZvaWQgUlRNUENoZWNrUmF0ZXMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgSU4gdTggU3VwUmF0ZVtdLCBJTiB1OCAqIFN1cFJhdGVMZW4pCiB7Ci0JVUNIQVIJUmF0ZUlkeCwgaSwgajsKLQlVQ0hBUglOZXdSYXRlWzEyXSwgTmV3UmF0ZUxlbjsKKwl1OCBSYXRlSWR4LCBpLCBqOworCXU4IE5ld1JhdGVbMTJdLCBOZXdSYXRlTGVuOwogCiAJTmV3UmF0ZUxlbiA9IDA7CiAKQEAgLTc2NzcsNyArNTI1Nyw3IEBACiAJZWxzZQogCQlSYXRlSWR4ID0gMTI7CiAKLQkvLyBDaGVjayBmb3Igc3VwcG9ydCByYXRlcyBleGNsdWRlIGJhc2ljIHJhdGUgYml0CisJLyogQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdCAqLwogCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQogCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQogCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQpAQCAtNzY4Nyw0MyArNTI2NywzNyBAQAogCU5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsIE5ld1JhdGUsIE5ld1JhdGVMZW4pOwogfQogCi1CT09MRUFOIFJUTVBDaGVja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCUNlbnRyYWxDaGFubmVsLAotCUlOIFVDSEFSCQlDaGFubmVsKQorQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1OCBDZW50cmFsQ2hhbm5lbCwgdTggQ2hhbm5lbCkKIHsKLQlVQ0hBUgkJazsKLQlVQ0hBUgkJVXBwZXJDaGFubmVsID0gMCwgTG93ZXJDaGFubmVsID0gMDsKLQlVQ0hBUgkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKKwl1OCBrOworCXU4IFVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7CisJdTggTm9FZmZlY3RDaGFubmVsaW5MaXN0ID0gMDsKIAotCS8vIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLgotCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpCi0JeworCS8qIEZpbmQgdXBwZXIgYW5kIGxvd2VyIGNoYW5uZWwgYWNjb3JkaW5nIHRvIDQwTUh6IGN1cnJlbnQgb3BlcmF0aW9uLiAqLworCWlmIChDZW50cmFsQ2hhbm5lbCA8IENoYW5uZWwpIHsKIAkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKIAkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKIAkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKIAkJZWxzZQogCQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCi0JeworCX0gZWxzZSBpZiAoQ2VudHJhbENoYW5uZWwgPiBDaGFubmVsKSB7CiAJCVVwcGVyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsICsgMjsKIAkJTG93ZXJDaGFubmVsID0gQ2hhbm5lbDsKIAl9CiAKLQlmb3IgKGsgPSAwO2sgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2srKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gVXBwZXJDaGFubmVsKQotCQl7Ci0JCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7CisJZm9yIChrID0gMDsgayA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGsrKykgeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkgeworCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0Kys7CiAJCX0KLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpCi0JCXsKLQkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCArKzsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3Rba10uQ2hhbm5lbCA9PSBMb3dlckNoYW5uZWwpIHsKKwkJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCsrOwogCQl9CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUb3RhbCBDaGFubmVsIGluIENoYW5uZWwgTGlzdCA9IFslZF1cbiIsIE5vRWZmZWN0Q2hhbm5lbGluTGlzdCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJUb3RhbCBDaGFubmVsIGluIENoYW5uZWwgTGlzdCA9IFslZF1cbiIsCisJCSAgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7CiAJaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQogCQlyZXR1cm4gVFJVRTsKIAllbHNlCkBAIC03NzQ2LDg4ICs1MzIwLDExNCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotQk9PTEVBTiAJUlRNUENoZWNrSHQoCi0JSU4JUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTglVQ0hBUgkJCQkJV2NpZCwKLQlJTiAJSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0JSU4gCUFERF9IVF9JTkZPX0lFCQkJKnBBZGRIdEluZm8pCitCT09MRUFOIFJUTVBDaGVja0h0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4IFdjaWQsCisJCSAgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvKQogewogCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQogCQlyZXR1cm4gRkFMU0U7CiAKLQkvLyBJZiB1c2UgQU1TRFUsIHNldCBmbGFnLgorCS8qIElmIHVzZSBBTVNEVSwgc2V0IGZsYWcuICovCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdUVuYWJsZSkKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEKTsKLQkvLyBTYXZlIFBlZXIgQ2FwYWJpbGl0eQorCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLAorCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCS8qIFNhdmUgUGVlciBDYXBhYmlsaXR5ICovCiAJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLAorCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKIAlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOwogCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uVHhTVEJDKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sCisJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKIAlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQykKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwotCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQotCXsKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLAorCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpIHsKKwkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwKKwkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpOwogCX0KIAotCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JewotCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLk1wZHVEZW5zaXR5ID0gcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCWlmIChXY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5NcGR1RGVuc2l0eSA9CisJCSAgICBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7CiAJfQotCi0JLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdworCS8qIFdpbGwgY2hlY2sgQ2hhbm5lbFdpZHRoIGZvciBNQ1NTZXRbNF0gYmVsb3cgKi8KIAlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSA9IDB4MTsKLSAgICBzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtKQotCXsKLQkJY2FzZSAxOgotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweDAwOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4ZmY7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7Ci0JCQlicmVhazsKKwlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtKSB7CisJY2FzZSAxOgorCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHgwMDsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHgwMDsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOworCQlicmVhazsKKwljYXNlIDM6CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKKwkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOworCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4ZmY7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKKwkJYnJlYWs7CiAJfQogCi0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGggJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9CisJICAgIHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LgorCSAgICBDaGFubmVsV2lkdGg7CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQ2hlY2tIdDo6IEh0Q2FwSW5mby5DaGFubmVsV2lkdGg9JWQsIFJlY29tV2lkdGg9JWQsIERlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGg9JWQsIEJXNDBNQXZhaWxGb3JBL0c9JWQvJWQsIFBoeU1vZGU9JWQgXG4iLAotCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgsIHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoLCBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoLAotCQlwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckEsIHBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yRywgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QQ2hlY2tIdDo6IEh0Q2FwSW5mby5DaGFubmVsV2lkdGg9JWQsIFJlY29tV2lkdGg9JWQsIERlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGg9JWQsIEJXNDBNQXZhaWxGb3JBL0c9JWQvJWQsIFBoeU1vZGU9JWQgXG4iLAorCQkgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwKKwkJICBwQWRkSHRJbmZvLT5BZGRIdEluZm8uUmVjb21XaWR0aCwKKwkJICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoLAorCQkgIHBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwKKwkJICBwQWQtPk5pY0NvbmZpZzIuZmllbGQuQlc0ME1BdmFpbEZvckcsCisJCSAgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwogCi0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPSAgcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGICZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0Y7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uR0YgPQorCSAgICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJiBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0Y7CiAKLQkvLyBTZW5kIEFzc29jIFJlcSB3aXRoIG15IEhUIGNhcGFiaWxpdHkuCi0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHM7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSAmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQyA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykmKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlJ4U1RCQykmKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9IHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3I7Ci0gICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKLQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUQ2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOwotCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKQotCXsKLQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0OwotICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gMTsKKwkvKiBTZW5kIEFzc29jIFJlcSB3aXRoIG15IEhUIGNhcGFiaWxpdHkuICovCisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0KKwkgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPQorCSAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCA9CisJICAgIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSAmIChwSHRDYXBhYmlsaXR5LT4KKwkJCQkJCQkgIEh0Q2FwSW5mby4KKwkJCQkJCQkgIFNob3J0R0lmb3IyMCk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwID0KKwkgICAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApICYgKHBIdENhcGFiaWxpdHktPgorCQkJCQkJCSAgSHRDYXBJbmZvLgorCQkJCQkJCSAgU2hvcnRHSWZvcjQwKTsKKwlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPQorCSAgICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLgorCQkJCQkJICAgIFJ4U1RCQyk7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0KKwkgICAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMpICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby4KKwkJCQkJCSAgICBUeFNUQkMpOworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvciA9CisJICAgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3I7CisJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPQorCSAgICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OworCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPQorCSAgICBwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQzsKKwlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUQ2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9CisJICAgIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOworCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnKSB7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQgPQorCQkgICAgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7CisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOwogCX0KIAotICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCi0gICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgorCWlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCisJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOwkvKiBCVzIwIGNhbid0IHRyYW5zbWl0IE1DUzMyICovCiAKIAlDT1BZX0FQX0hUU0VUVElOR1NfRlJPTV9CRUFDT04ocEFkLCBwSHRDYXBhYmlsaXR5KTsKIAlyZXR1cm4gVFJVRTsKQEAgLTc4NDksNjUgKzU0NDksNjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QVXBkYXRlTWxtZVJhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCU1pbmltdW1SYXRlOwotCVVDSEFSCVByb3Blck1sbWVSYXRlOyAvLz0gUkFURV81NDsKLQlVQ0hBUglpLCBqLCBSYXRlSWR4ID0gMTI7IC8vMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotCUJPT0xFQU4JYk1hdGNoID0gRkFMU0U7CisJdTggTWluaW11bVJhdGU7CisJdTggUHJvcGVyTWxtZVJhdGU7CS8qPSBSQVRFXzU0OyAqLworCXU4IGksIGosIFJhdGVJZHggPSAxMjsJLyoxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0ICovCisJQk9PTEVBTiBiTWF0Y2ggPSBGQUxTRTsKIAotCXN3aXRjaCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKLQl7Ci0JCWNhc2UgUEhZXzExQjoKKwlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpIHsKKwljYXNlIFBIWV8xMUI6CisJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKKwkJTWluaW11bVJhdGUgPSBSQVRFXzE7CisJCWJyZWFrOworCWNhc2UgUEhZXzExQkdfTUlYRUQ6CisJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCWNhc2UgUEhZXzExQkdOX01JWEVEOgorCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCisJCSAgICAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCisJCQkvKiBCIG9ubHkgQVAgKi8KIAkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKLQkJCU1pbmltdW1SYXRlID0gUkFURV8xOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQUJHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6Ci0JCQlpZiAoKHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID09IDQpICYmCi0JCQkJKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID09IDApKQotCQkJCS8vIEIgb25seSBBUAotCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xMTsKLQkJCWVsc2UKLQkJCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCWVsc2UKKwkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKIAotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJCU1pbmltdW1SYXRlID0gUkFURV8xOwotCQkJZWxzZQotCQkJCU1pbmltdW1SYXRlID0gUkFURV82OwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQToKLQkJY2FzZSBQSFlfMTFOXzJfNEc6CS8vIHJ0Mjg2MCBuZWVkIHRvIGNoZWNrIG1sbWVyYXRlIGZvciA4MDIuMTFuCi0JCWNhc2UgUEhZXzExR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQUdOX01JWEVEOgotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQljYXNlIFBIWV8xMU5fNUc6Ci0JCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7Ci0JCQlNaW5pbXVtUmF0ZSA9IFJBVEVfNjsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFCR19NSVhFRDoKLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKLQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkKLQkJCSAgIE1pbmltdW1SYXRlID0gUkFURV8xOwotCQkJZWxzZQotCQkJCU1pbmltdW1SYXRlID0gUkFURV82OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8vIGVycm9yCi0JCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTsKKwkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQogCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQlicmVhazsKKwkJZWxzZQorCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCWJyZWFrOworCWNhc2UgUEhZXzExQToKKwljYXNlIFBIWV8xMU5fMl80RzoJLyogcnQyODYwIG5lZWQgdG8gY2hlY2sgbWxtZXJhdGUgZm9yIDgwMi4xMW4gKi8KKwljYXNlIFBIWV8xMUdOX01JWEVEOgorCWNhc2UgUEhZXzExQUdOX01JWEVEOgorCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJY2FzZSBQSFlfMTFOXzVHOgorCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMjQ7CisJCU1pbmltdW1SYXRlID0gUkFURV82OworCQlicmVhazsKKwljYXNlIFBIWV8xMUFCR19NSVhFRDoKKwkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OworCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCisJCQlNaW5pbXVtUmF0ZSA9IFJBVEVfMTsKKwkJZWxzZQorCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBlcnJvciAqLworCQlQcm9wZXJNbG1lUmF0ZSA9IFJBVEVfMTsKKwkJTWluaW11bVJhdGUgPSBSQVRFXzE7CisJCWJyZWFrOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsgaSsrKQotCXsKLQkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykKLQkJewotCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09IFJhdGVJZFRvNTAwS2Jwc1tqXSkKLQkJCXsKLQkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKLQkJCQl7CisJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFJhdGVJZHg7IGorKykgeworCQkJaWYgKChwQWQtPk1sbWVBdXguU3VwUmF0ZVtpXSAmIDB4N2YpID09CisJCQkgICAgUmF0ZUlkVG81MDBLYnBzW2pdKSB7CisJCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpIHsKIAkJCQkJYk1hdGNoID0gVFJVRTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtNzkxOCwxNiArNTUxMywxMiBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGJNYXRjaCA9PSBGQUxTRSkKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbjsgaSsrKQotCQl7Ci0JCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQotCQkJewotCQkJCWlmICgocEFkLT5NbG1lQXV4LkV4dFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCi0JCQkJewotCQkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKLQkJCQkJeworCWlmIChiTWF0Y2ggPT0gRkFMU0UpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspIHsKKwkJCQlpZiAoKHBBZC0+TWxtZUF1eC5FeHRSYXRlW2ldICYgMHg3ZikgPT0KKwkJCQkgICAgUmF0ZUlkVG81MDBLYnBzW2pdKSB7CisJCQkJCWlmIChqID09IFByb3Blck1sbWVSYXRlKSB7CiAJCQkJCQliTWF0Y2ggPSBUUlVFOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTc5MzksNTEgKzU1MzAsNDggQEAKIAkJfQogCX0KIAotCWlmIChiTWF0Y2ggPT0gRkFMU0UpCi0JeworCWlmIChiTWF0Y2ggPT0gRkFMU0UpIHsKIAkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKIAl9CiAKIAlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOwogCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKLQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQl9Ci0JZWxzZQotCXsKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0KKwkJICAgIE1PREVfT0ZETTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfSBlbHNlIHsKIAkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKIAkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0KKwkJICAgIE1PREVfQ0NLOworCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJICAgIHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVNbG1lUmF0ZSA9PT4gICBNbG1lVHJhbnNtaXQgPSAweCV4ICBcbiIgLCBwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQud29yZCkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkKSk7CiB9CiAKLUNIQVIgUlRNUE1heFJzc2koCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpCitjaGFyIFJUTVBNYXhSc3NpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJIGNoYXIgUnNzaTAsIGNoYXIgUnNzaTEsIGNoYXIgUnNzaTIpCiB7Ci0JQ0hBUglsYXJnZXIgPSAtMTI3OworCWNoYXIgbGFyZ2VyID0gLTEyNzsKIAotCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpCi0JeworCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSAmJiAoUnNzaTAgIT0gMCkpIHsKIAkJbGFyZ2VyID0gUnNzaTA7CiAJfQogCi0JaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKLQl7CisJaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkgewogCQlsYXJnZXIgPSBtYXgoUnNzaTAsIFJzc2kxKTsKIAl9CiAKLQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykgJiYgKFJzc2kyICE9IDApKQotCXsKKwlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykgJiYgKFJzc2kyICE9IDApKSB7CiAJCWxhcmdlciA9IG1heChsYXJnZXIsIFJzc2kyKTsKIAl9CiAKQEAgLTc5OTMsNTYgKzU1ODEsNiBAQAogCXJldHVybiBsYXJnZXI7CiB9CiAKLSNpZmRlZiBSVDI4NzAKLS8vIEFudGVubmEgZGl2ZXNpdHkgdXNlIEdQSU8zIGFuZCBFRVNLIHBpbiBmb3IgY29udHJvbAotLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLS8vIFRoZXJlZm9yIHdlIHNob3VsZCBhdm9pZCBhY2Nlc3NpbmcgRUVTSyBhdCB0aGUgc2FtZSB0aW1lCi0vLyBUaGVuIHJlc3RvcmUgYW50ZW5uYSBhZnRlciBFRVBST00gYWNjZXNzCi1WT0lEIEFzaWNTZXRSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUFudCkKLXsKLQlVSU5UMzIJVmFsdWU7Ci0JVUlOVDMyCXg7Ci0KLQlpZiAoKHBBZC0+RWVwcm9tQWNjZXNzKQkJCQkJCQkJCQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkJfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkJfHwKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQkJCXx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIHRoZSBhbnRlbm5hIHNlbGVjdGlvbiBpcyB0aHJvdWdoIGZpcm13YXJlIGFuZCBNQUMgcmVnaXN0ZXIoR1BJTzMpCi0JaWYgKEFudCA9PSAwKQotCXsKLQkJLy8gTWFpbiBhbnRlbm5hCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4IHw9IChFRVNLKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDB4MDgwOCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fQ1RSTF9DRkcsIFZhbHVlKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNTZXRSeEFudCwgc3dpdGNoIHRvIG1haW4gYW50ZW5uYVxuIikpOwotCX0KLQllbHNlCi0JewotCQkvLyBBdXggYW50ZW5uYQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQkJeCAmPSB+KEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJVmFsdWUgfD0gMHgwODsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gYXV4IGFudGVubmFcbiIpKTsKLQl9Ci19Ci0jZW5kaWYKLQogLyoKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtODA1Niw5MSArNTU5NCw3MCBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgQXNpY0V2YWx1YXRlUnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCUJCUFIzID0gMDsKKwl1OCBCQlBSMyA9IDA7CiAKIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAotCQkJCWZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpCi0JCQkJfHwgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQotI2lmZGVmIFJUMjg3MAotCQkJCXx8IChwQWQtPkVlcHJvbUFjY2VzcykKLSNlbmRpZgotCQkJCSkKLQkJCXJldHVybjsKLQorCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8CisJCQkgICBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSB8fAorCSAgICBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCiAjaWZkZWYgUlQzMHh4Ci0JLy8gdHdvIGFudGVubmEgc2VsZWN0aW9uIG1lY2hhbmlzbS0gb25lIGlzIGFudGVubmEgZGl2ZXJzaXR5LCB0aGUgb3RoZXIgaXMgZmFpbGVkIGFudGVubmEgcmVtb3ZlCi0JLy8gb25lIGlzIGFudGVubmEgZGl2ZXJzaXR5OnRoZXJlIGlzIG9ubHkgb25lIGFudGVubmEgY2FuIHJ4IGFuZCB0eAotCS8vIHRoZSBvdGhlciBpcyBmYWlsZWQgYW50ZW5uYSByZW1vdmU6dHdvIHBoeXNpY2FsIGFudGVubmEgY2FuIHJ4IGFuZCB0eAotCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQorCSAgICB8fCAocEFkLT5FZXByb21BY2Nlc3MpCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisjaWZkZWYgUlQzMDkwCisJICAgIHx8IChwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkgICAgKQorCQlyZXR1cm47CisKIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQW50RGl2IC0gYmVmb3JlIGV2YWx1YXRlIFBhaXIxLUFudCAoJWQsJWQpXG4iLAotCQkJcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCwgcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50KSk7CisJCS8qaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgKi8KKwkJLyogICAgICByZXR1cm47ICovCiAKLQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50KTsKLQotCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMTsgLy8gMTpNZWFucyBzd2l0Y2ggdG8gU2Vjb25kYXJ5UnhBbnQsIDA6TWVhbnMgc3dpdGNoIHRvIFBhaXIxUHJpbWFyeVJ4QW50Ci0JCXBBZC0+UnhBbnQuRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlID0gRkFMU0U7Ci0JCXBBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlID0gMDsKLQotCQkvLyBhIG9uZS1zaG90IHRpbWVyIHRvIGVuZCB0aGUgZXZhbHV0aW9uCi0JCS8vIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMTAwKTsKLQkJZWxzZQotCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDMwMCk7Ci0JfQotCWVsc2UKLSNlbmRpZgotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJCXJldHVybjsKLQotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7Ci0JCUJCUFIzICY9ICh+MHgxOCk7Ci0JCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKIAkJewotCQkJQkJQUjMgfD0gKDB4MTApOwotCQl9Ci0JCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQl7Ci0JCQlCQlBSMyB8PSAoMHg4KTsKLQkJfQotCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJQkJQUjMgfD0gKDB4MCk7Ci0JCX0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOwogCi0jaWZkZWYgUlQyODYwCi0JCXBBZC0+U3RhQ2ZnLkJCUFIzID0gQkJQUjM7Ci0jZW5kaWYKKwkJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCQkJcmV0dXJuOworCisJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7CisJCQlCQlBSMyAmPSAofjB4MTgpOworCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykgeworCQkJCUJCUFIzIHw9ICgweDEwKTsKKwkJCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKSB7CisJCQkJQkJQUjMgfD0gKDB4OCk7CisJCQl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgeworCQkJCUJCUFIzIHw9ICgweDApOworCQkJfQorCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQUjMpOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCQkJcEFkLT5TdGFDZmcuQkJQUjMgPSBCQlBSMzsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKKwkJCSAgICApIHsKKwkJCQl1bnNpZ25lZCBsb25nIFR4VG90YWxDbnQgPQorCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKworCQkJCSAgICBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICsKKwkJCQkgICAgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKKworCQkJCS8qIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljICovCisJCQkJaWYgKFR4VG90YWxDbnQgPiA1MCkgeworCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwKKwkJCQkJCSAgICAgMjApOworCQkJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBGQUxTRTsKKwkJCQl9IGVsc2UgeworCQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwKKwkJCQkJCSAgICAgMzAwKTsKKwkJCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gVFJVRTsKKwkJCQl9CisJCQl9CisJCX0KKwogCX0KIAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKLQkJKQotCXsKLQkJVUxPTkcJVHhUb3RhbENudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JCQkvLyBkeW5hbWljIGFkanVzdCBhbnRlbm5hIGV2YWx1YXRpb24gcGVyaW9kIGFjY29yZGluZyB0byB0aGUgdHJhZmZpYwotCQlpZiAoVHhUb3RhbENudCA+IDUwKQotCQl7Ci0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMjApOwotCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwgMzAwKTsKLQkJCXBBZC0+TWxtZS5iTG93VGhyb3VnaHB1dCA9IFRSVUU7Ci0JCX0KLQl9CiB9CiAKIC8qCkBAIC04MTU2LDkwICs1NjczLDU0IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQXNpY1J4QW50RXZhbFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVJUTVBfQURBUFRFUgkqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQlVQ0hBUgkJCUJCUFIzID0gMDsKLQlDSEFSCQkJbGFyZ2VyID0gLTEyNywgcnNzaTAsIHJzc2kxLCByc3NpMjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwl1OCBCQlBSMyA9IDA7CisJY2hhciBsYXJnZXIgPSAtMTI3LCByc3NpMCwgcnNzaTEsIHJzc2kyOwogCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUwl8Ci0JCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpCi0JCQkJCQkJfHwgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQotI2lmZGVmIFJUMjg3MAotCQkJCQkJCXx8IChwQWQtPkVlcHJvbUFjY2VzcykKLSNlbmRpZgotCQkJCQkJCSkKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCSAgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkgICBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8CisJICAgIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKKyNpZmRlZiBSVDMweHgKKwkgICAgfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworI2lmZGVmIFJUMzA5MAorCSAgICB8fCAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpCisjZW5kaWYgLyogUlQzMDkwIC8vICovCisJICAgICkKIAkJcmV0dXJuOwogCiAJewotI2lmZGVmIFJUMzB4eAotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkKLQkJewotCQkJaWYgKChwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSAhPSAwKSAmJiAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50XSA+PSBwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50XSkpCi0JCQl7Ci0JCQkJVUNIQVIJCQl0ZW1wOwotCi0JCQkJLy8KLQkJCQkvLyBzZWxlY3QgUHJpbWFyeVJ4QW50UGFpcgotCQkJCS8vICAgIFJvbGUgY2hhbmdlLCBVc2VkIFBhaXIxU2Vjb25kYXJ5UnhBbnQgYXMgUHJpbWFyeVJ4QW50UGFpci4KLQkJCQkvLyAgICBTaW5jZSBQYWlyMVNlY29uZGFyeVJ4QW50IFF1YWxpdHkgZ29vZCB0aGFuIFBhaXIxUHJpbWFyeVJ4QW50Ci0JCQkJLy8KLQkJCQl0ZW1wID0gcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudDsKLQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50ID0gcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwotCQkJCXBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCA9IHRlbXA7Ci0KLQkJCQlwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2kgPSAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50XSA+PiAzKTsKLQkJCQlwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ID0gMDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBpZiB0aGUgZXZhbHVhdGVkIGFudGVubmEgaXMgbm90IGJldHRlciB0aGFuIG9yaWdpbmFsLCBzd2l0Y2ggYmFjayB0byBvcmlnaW5hbCBhbnRlbm5hCi0JCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JCQkJcEFkLT5SeEFudC5FdmFsdWF0ZVN0YWJsZUNudCArKzsKLQkJCX0KLQotCQkJcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9IDA7IC8vIDE6TWVhbnMgc3dpdGNoIHRvIFNlY29uZGFyeVJ4QW50LCAwOk1lYW5zIHN3aXRjaCB0byBQYWlyMVByaW1hcnlSeEFudAotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNSeEFudEV2YWxBY3Rpb246OkFmdGVyIEV2YWwoZml4IGluICMlZCksIDwlZCwgJWQ+LCBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU9JWxkXG4iLAotCQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbMF0gPj4gMyksIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVsxXSA+PiAzKSwgcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUpKTsKLQkJfQotCQllbHNlCi0jZW5kaWYKKwkJLyppZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAqLworCQkvKiAgICAgIHJldHVybjsgKi8KIAkJewogCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKIAkJCQlyZXR1cm47CiAKLQkJCS8vIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEKLQkJCWlmIChwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPT0gVFJVRSkKLQkJCXsKKwkJCS8qIGlmIHRoZSB0cmFmZmljIGlzIGxvdywgdXNlIGF2ZXJhZ2UgcnNzaSBhcyB0aGUgY3JpdGVyaWEgKi8KKwkJCWlmIChwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPT0gVFJVRSkgewogCQkJCXJzc2kwID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CiAJCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKIAkJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlyc3NpMCA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTA7CiAJCQkJcnNzaTEgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOwogCQkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMjsKIAkJCX0KIAotCQkJaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCQkJeworCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykgewogCQkJCWxhcmdlciA9IG1heChyc3NpMCwgcnNzaTEpOwogCiAJCQkJaWYgKGxhcmdlciA+IChyc3NpMiArIDIwKSkKIAkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOwogCQkJCWVsc2UKIAkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAzOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQl7CisJCQl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikgewogCQkJCWlmIChyc3NpMCA+IChyc3NpMSArIDIwKSkKIAkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAxOwogCQkJCWVsc2UKQEAgLTgyNDgsMzkgKzU3MjksNDUgQEAKIAogCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOwogCQkJQkJQUjMgJj0gKH4weDE4KTsKLQkJCWlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDMpCi0JCQl7CisJCQlpZiAocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMykgewogCQkJCUJCUFIzIHw9ICgweDEwKTsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMikKLQkJCXsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMikgewogCQkJCUJCUFIzIHw9ICgweDgpOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAxKQotCQkJeworCQkJfSBlbHNlIGlmIChwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9PSAxKSB7CiAJCQkJQkJQUjMgfD0gKDB4MCk7CiAJCQl9CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7Ci0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCiAJCQlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAJCX0KIAl9CisKIH0KIAotVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQVBTRFBlcmlvZGljRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCiAJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCiAJCXJldHVybjsKIAogCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50Kys7CiAKKy8qIERyaXZlciBzaG91bGQgbm90IHNlbmQgdHJpZ2dlciBmcmFtZSwgaXQgc2hvdWxkIGJlIHNlbmQgYnkgYXBwbGljYXRpb24gbGF5ZXIgKi8KKy8qCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZQorCQkmJiAocEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lIHx8CisJCSgoKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50JTIwKSA9PSAxOSkgJiYgKCFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFIHx8ICFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLIHx8ICFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJIHx8ICFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKSkpKQorCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIHRyaWdnZXIgZnJhbWUgYW5kIGVudGVyIHNlcnZpY2UgcGVyaW9kIHdoZW4gc3VwcG9ydCBBUFNEXG4iKSk7CisJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKKwkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7CisJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKKwkJcEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCA9IFRSVUU7CisJfSovCiB9CiAKIC8qCkBAIC04Mjk3LDExICs1Nzg0LDkgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUFNldFBpZ2d5QmFjaygKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBCT09MRUFOICAgICAgICAgIGJQaWdneUJhY2spCit2b2lkIFJUTVBTZXRQaWdneUJhY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJQaWdneUJhY2spCiB7Ci0JVFhfTElOS19DRkdfU1RSVUMgIFR4TGlua0NmZzsKKwlUWF9MSU5LX0NGR19TVFJVQyBUeExpbmtDZmc7CiAKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwogCkBAIC04MzI0LDM2ICs1ODA5LDMyIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7Ci0JQk9PTEVBTgkJcmVzdWx0ID0gVFJVRTsKKwlCT09MRUFOIHJlc3VsdCA9IFRSVUU7CiAKIAl7Ci0JCS8vIG9ubHkgYXNzb2NpYXRlZCBTVEEgY291bnRzCi0JCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCXsKKwkJLyogb25seSBhc3NvY2lhdGVkIFNUQSBjb3VudHMgKi8KKwkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJKQorCQkgICAgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpIHsKIAkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlyZXN1bHQgPSBGQUxTRTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KLUJPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpCitCT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpCi0JCXJldHVybiBUUlVFOwotCisJeworCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpCisJCQlyZXR1cm4gVFJVRTsKKwl9CiAJcmV0dXJuIEZBTFNFOwogfQogCi0KIC8qCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgUm91dGluZSBEZXNjcmlwdGlvbjoKQEAgLTgzNjksMTMgKzU4NTAsMTUgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVVDSEFSIFJUTVBTdGFGaXhlZFR4TW9kZSgKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3U4IFJUTVBTdGFGaXhlZFR4TW9kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSkKIHsKLQlVQ0hBUgl0eF9tb2RlID0gRklYRURfVFhNT0RFX0hUOworCXU4IHR4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7CiAKLQl0eF9tb2RlID0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGU7CisJeworCQl0eF9tb2RlID0KKwkJICAgICh1OClwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkgICAgRml4ZWRUeE1vZGU7CisJfQogCiAJcmV0dXJuIHR4X21vZGU7CiB9CkBAIC04Mzk1LDkgKzU4NzgsNyBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAotCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAotCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSkKK3ZvaWQgUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZyh1OCBmaXhlZF90eF9tb2RlLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpCiB7CiAJSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0U2V0dGluZzsKIApAQCAtODQwOSwyNiArNTg5MCwyNCBAQAogCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKIAlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTOwogCi0JaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0NDSykKLQl7CisJaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0NDSykgewogCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkvLyBDQ0sgbW9kZSBhbGxvdyBNQ1MgMH4zCisJCS8qIENDSyBtb2RlIGFsbG93IE1DUyAwfjMgKi8KIAkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfMykKIAkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJLy8gT0ZETSBtb2RlIGFsbG93IE1DUyAwfjcKKwkJLyogT0ZETSBtb2RlIGFsbG93IE1DUyAwfjcgKi8KIAkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfNykKIAkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKIAl9CiAKLQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBUcmFuc21pdFNldHRpbmcuZmllbGQuTU9ERSkKLQl7CisJaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUpIHsKIAkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IFRyYW5zbWl0U2V0dGluZy53b3JkOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nIDogd2NpZC0lZCwgTU9ERT0lcywgTUNTPSVkIFxuIiwKLQkJCQlwRW50cnktPkFpZCwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZyA6IHdjaWQtJWQsIE1PREU9JXMsIE1DUz0lZCBcbiIsCisJCQkgIHBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLAorCQkJICBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKIAl9CiB9CiAKQEAgLTg0NDIsMzgxICs1OTIxLDE1MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBBc2ljU3RhQmJwVHVuaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVQ0hBUglPcmlnUjY2VmFsdWUgPSAwLCBSNjY7Ly8sIFI2NlVwcGVyQm91bmQgPSAweDMwLCBSNjZMb3dlckJvdW5kID0gMHgzMDsKLQlDSEFSCVJzc2k7CisJdTggT3JpZ1I2NlZhbHVlID0gMCwgUjY2OwkvKiwgUjY2VXBwZXJCb3VuZCA9IDB4MzAsIFI2Nkxvd2VyQm91bmQgPSAweDMwOyAqLworCWNoYXIgUnNzaTsKIAotCS8vIDI4NjBDIGRpZCBub3Qgc3VwcG9ydCBGYXNlIENDQSwgdGhlcmVmb3JlIGNhbid0IHR1bmUKKwkvKiAyODYwQyBkaWQgbm90IHN1cHBvcnQgRmFzZSBDQ0EsIHRoZXJlZm9yZSBjYW4ndCB0dW5lICovCiAJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQogCQlyZXR1cm47CiAKLQkvLwotCS8vIHdvcmsgYXMgYSBTVEEKLQkvLwotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgIC8vIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORworCS8qICovCisJLyogd29yayBhcyBhIFNUQSAqLworCS8qICovCisJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQkvKiBubyBSNjYgdHVuaW5nIHdoZW4gU0NBTk5JTkcgKi8KIAkJcmV0dXJuOwogCiAJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQkmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCi0JCQkpCi0JCSYmICEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLSNpZmRlZiBSVDI4NjAKLQkJJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJKQotI2VuZGlmCi0JeworCSAgICAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJICAgICkKKwkgICAgJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCSAgICAmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCSAgICApIHsKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgJk9yaWdSNjZWYWx1ZSk7CiAJCVI2NiA9IE9yaWdSNjZWYWx1ZTsKIAogCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCi0JCQlSc3NpID0gKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKyBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOworCQkJUnNzaSA9CisJCQkgICAgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgKworCQkJICAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKSA+PiAxOwogCQllbHNlCiAJCQlSc3NpID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMDsKIAotCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQl7CS8vQkcgYmFuZAotI2lmZGVmIFJUMjg3MAotCQkJLy8gUlQzMDcwIGlzIGEgbm8gTE5BIHNvbHV0aW9uLCBpdCBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgY29udHJvbCByZWdhcmRpbmcgdG8gQUdDIGdhaW4gY29udHJvbAotCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIGhhdmUgc29tZSB0aHJvdWdocHV0IHNpZGUgZWZmZWN0IHdoZW4gbG93IFJTU0kKLQkJCWlmIChJU19SVDMweHgocEFkKSkKLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKSArIDB4MjA7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsJLypCRyBiYW5kICovCisjaWZkZWYgUlQzMHh4CisJCQkvKiBSVDMwNzAgaXMgYSBubyBMTkEgc29sdXRpb24sIGl0IHNob3VsZCBoYXZlIGRpZmZlcmVudCBjb250cm9sIHJlZ2FyZGluZyB0byBBR0MgZ2FpbiBjb250cm9sICovCisJCQkvKiBPdGhlcndpc2UsIGl0IHdpbGwgaGF2ZSBzb21lIHRocm91Z2hwdXQgc2lkZSBlZmZlY3Qgd2hlbiBsb3cgUlNTSSAqLworCisJCQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkKKwkJCSAgICB8fCBJU19SVDMzOTAocEFkKSkgeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkgeworCQkJCQlSNjYgPQorCQkJCQkgICAgMHgxQyArIDIgKiBHRVRfTE5BX0dBSU4ocEFkKSArIDB4MjA7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KSB7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkgICAgKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVI2NiA9IDB4MUMgKyAyICogR0VUX0xOQV9HQUlOKHBBZCk7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KSB7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkgICAgKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJfQogCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKTsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUlQyODcwIC8vCisJCQl9IGVsc2UKKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIAkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkgewogCQkJCQlSNjYgPSAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSArIDB4MTA7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOwogCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOwotCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KSB7CisJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkgICAgKHBBZCwgQkJQX1I2NiwgUjY2KTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJfQotCQllbHNlCi0JCXsJLy9BIGJhbmQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfMjApCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQl9IGVsc2UgewkvKkEgYmFuZCAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV18yMCkgeworCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkgeworCQkJCQlSNjYgPQorCQkJCQkgICAgMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMyArCisJCQkJCSAgICAweDEwOworCQkJCQlpZiAoT3JpZ1I2NlZhbHVlICE9IFI2NikgeworCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRAorCQkJCQkJICAgIChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlSNjYgPQorCQkJCQkgICAgMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOwogCQkJCQl9CiAJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMzsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpIHsKKwkJCQkJUjY2ID0KKwkJCQkJICAgIDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkgKiA1KSAvIDMgKworCQkJCQkgICAgMHgxMDsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOwogCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4M0EgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyArIDB4MTA7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCQl9IGVsc2UgeworCQkJCQlSNjYgPQorCQkJCQkgICAgMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSAqIDUpIC8gMzsKKwkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpIHsKKwkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCSAgICAocEFkLCBCQlBfUjY2LCBSNjYpOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CiAKLQogCX0KIH0KIAotI2lmZGVmIFJUMjg2MAotVk9JRCBBc2ljUmVzZXRGcm9tRE1BQnVzeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgUlRNUFNldEFHQ0luaXRWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEJhbmRXaWR0aCkKIHsKLQlVSU5UMzIJCURhdGE7Ci0JQk9PTEVBTgkJYkN0cmwgPSBGQUxTRTsKKwl1OCBSNjYgPSAweDMwOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPiAgQXNpY1Jlc2V0RnJvbURNQUJ1c3kgICEhISEhISEhISEhISEhISEhISEhISEhIFxuIikpOworCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpIHsJLyogQkcgYmFuZCAqLworI2lmZGVmIFJUMzB4eAorCQkvKiBHYXJ5IHdhcyB2ZXJpZmllZCBBbWF6b24gQVAgYW5kIGZpbmQgdGhhdCBSVDMwN3ggaGFzIEJCUF9SNjYgaW52YWxpZCBkZWZhdWx0IHZhbHVlICovCiAKLQkvLyBCZSBzdXJlIHJlc3RvcmUgbGluayBjb250cm9sIHZhbHVlIHNvIHdlIGNhbiB3cml0ZSByZWdpc3Rlci4KLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNSZXNldEZyb21ETUFCdXN5PT0+XG4iKSk7Ci0JCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX0hBTFQpOwotCQlSVE1QdXNlY0RlbGF5KDYwMDApOwotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQkJYkN0cmwgPSBUUlVFOwotCX0KLQkvLyBSZXNldCBETUEKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJkRhdGEpOwotCURhdGEgfD0gMHgyOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQkvLyBBZnRlciBSZXNldCBETUEsIERNQSBpbmRleCB3aWxsIGJlY29tZSBaZXJvLiBTbyBEcml2ZXIgbmVlZCB0byByZXNldCBhbGwgcmluZyBpbmRleHMgdG9vLgotCS8vIFJlc2V0IERNQS9DUFUgcmluZyBpbmRleAotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVkkpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JLy8gQ2xlYXIgUmVzZXQKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJkRhdGEpOwotCURhdGEgJj0gMHhmZmZmZmZmZDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIERhdGEpOwotCi0JLy8gSWYgaW4gUmFkaW8gb2ZmLCBzaG91bGQgY2FsbCBSVE1QUENJZVBvd2VyTGlua0N0cmwgYWdhaW4uCi0JaWYgKChiQ3RybCA9PSBUUlVFKSAmJiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKSkKLQkJUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcocEFkLCAzKTsKLQotCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tICBBc2ljUmVzZXRGcm9tRE1BQnVzeSAhISEhISEhISEhISEhISEhISEhISEhISAgXG4iKSk7Ci19Ci0KLVZPSUQgQXNpY1Jlc2V0QkJQKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT4gIEFzaWMgSGFyZFJlc2V0IEJCUCAgISEhISEhISEhISEhISEhISEhISEhISEgXG4iKSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDIpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhjKTsKLQotCS8vIEFmdGVyIGhhcmQtcmVzZXQgQkJQLCBpbml0aWFsaXplIGFsbCBCQlAgdmFsdWVzLgotCU5JQ1Jlc3RvcmVCQlBWYWx1ZShwQWQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIEFzaWMgSGFyZFJlc2V0IEJCUCAhISEhISEhISEhISEhISEhISEhISEhISAgXG4iKSk7Ci19Ci0KLVZPSUQgQXNpY1Jlc2V0TUFDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HCQlEYXRhOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tPiAgQXNpY1Jlc2V0TUFDICAgISEhISBcbiIpKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJkRhdGEpOwotCURhdGEgfD0gMHg0OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0JRGF0YSAmPSAweGZmZmZmZmZiOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgRGF0YSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tICBBc2ljUmVzZXRNQUMgICAhISEhIFxuIikpOwotfQotCi1WT0lEIEFzaWNSZXNldFBCRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVTE9ORwkJVmFsdWUxLCBWYWx1ZTI7Ci0JVUxPTkcJCURhdGE7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZWYWx1ZTEpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUEJGX0RCRywgJlZhbHVlMik7Ci0KLQlWYWx1ZTIgJj0gMHhmZjsKLQkvLyBzdW0gc2hvdWxkIGJlIGVxdWFscyB0byAweGZmLCB3aGljaCBpcyB0aGUgdG90YWwgYnVmZmVyIHNpemUuCi0JaWYgKChWYWx1ZTEgKyBWYWx1ZTIpIDwgMHhmZikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT4gIEFzaWMgSGFyZFJlc2V0IFBCRiAhISEhIFxuIikpOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJkRhdGEpOwotCQlEYXRhIHw9IDB4ODsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCBEYXRhKTsKLQkJRGF0YSAmPSAweGZmZmZmZmY3OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIERhdGEpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0gIEFzaWMgSGFyZFJlc2V0IFBCRiAhISEhIFxuIikpOwotCX0KLX0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQotVk9JRCBSVE1QU2V0QUdDSW5pdFZhbHVlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQmFuZFdpZHRoKQotewotCVVDSEFSCVI2NiA9IDB4MzA7Ci0KLQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCXsJLy8gQkcgYmFuZAotCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCX0KLQllbHNlCi0JewkvL0EgYmFuZAotCQlpZiAoQmFuZFdpZHRoID09IEJXXzIwKQorCQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkKKwkJICAgIHx8IElTX1JUMzM5MChwQWQpKSB7CisJCQlSNjYgPSAweDFDICsgMiAqIEdFVF9MTkFfR0FJTihwQWQpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7CisJCX0gZWxzZQorI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCQl7Ci0JCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7CisJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKIAkJfQotCQllbHNlCisJfSBlbHNlIHsJCS8qQSBiYW5kICovCiAJCXsKLQkJCVI2NiA9IChVQ0hBUikoMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJaWYgKEJhbmRXaWR0aCA9PSBCV18yMCkgeworCQkJCVI2NiA9CisJCQkJICAgICh1OCkoMHgzMiArCisJCQkJCSAgICAgKEdFVF9MTkFfR0FJTihwQWQpICogNSkgLyAzKTsKKwkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKKwkJCX0gZWxzZSB7CisJCQkJUjY2ID0KKwkJCQkgICAgKHU4KSgweDNBICsKKwkJCQkJICAgICAoR0VUX0xOQV9HQUlOKHBBZCkgKiA1KSAvIDMpOworCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOworCQkJfQogCQl9CiAJfQogCiB9Ci0KLVZPSUQgQXNpY1R1cm5PZmZSRkNsaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVQ0hBUgkJQ2hhbm5lbCkKLXsKLQotCS8vIFJGIFIyIGJpdCAxOCA9IDAKLQlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOwotCVVDSEFSCQkJaW5kZXg7Ci0JUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOwotCi0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKElTX1JUMzA5MChwQWQpKQotCXsKLQkJUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAocEFkKTsgIC8vIGFkZCBieSBqb2hubGksICBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBzbGVlcC1tb2RlIHNldHVwCi0JCXJldHVybjsKLQl9Ci0KLQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0KLQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCi0JewotCQljYXNlIFJGSUNfMjgyMDoKLQkJY2FzZSBSRklDXzI4NTA6Ci0JCWNhc2UgUkZJQ18yNzIwOgotCQljYXNlIFJGSUNfMjc1MDoKLQotCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKLQkJCXsKLQkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQotCQkJCXsKLQkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMSAmIDB4ZmZmZmRmZmY7Ci0JCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjIgJiAweGZmZmJmZmZmOwotCQkJCQlSMyA9IFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmYzZmZmZjsKLQotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQotCQkJCQkvLyBQcm9ncmFtIFIxYjEzIHRvIDEsIFIzL2IxOCwxOSB0byAwLCBSMmIxOCB0byAwLgotCQkJCQkvLyBTZXQgUkYgUjIgYml0MTg9MCwgUjMgYml0WzE4OjE5XT0wCi0JCQkJCS8vaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJCQkJaWYgKDEpCi0JCQkJCXsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKLQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PZmZSRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eCwgIFIzID0gMHglMDh4IFxuIiwKLQkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMiwgUjMpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4IFxuIiwKLQkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotfQotCi0KLVZPSUQgQXNpY1R1cm5PblJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCkKLXsKLQotCS8vIFJGIFIyIGJpdCAxOCA9IDAKLQlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOwotCVVDSEFSCQkJaW5kZXg7Ci0JUlRNUF9SRl9SRUdTCSpSRlJlZ1RhYmxlOwotCi0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKElTX1JUMzA5MChwQWQpKQotCQlyZXR1cm47Ci0KLQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0KLQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCi0JewotCQljYXNlIFJGSUNfMjgyMDoKLQkJY2FzZSBSRklDXzI4NTA6Ci0JCWNhc2UgUkZJQ18yNzIwOgotCQljYXNlIFJGSUNfMjc1MDoKLQotCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzI4NTBfQ0hOTDsgaW5kZXgrKykKLQkJCXsKLQkJCQlpZiAoQ2hhbm5lbCA9PSBSRlJlZ1RhYmxlW2luZGV4XS5DaGFubmVsKQotCQkJCXsKLQkJCQkJUjMgPSBwQWQtPkxhdGNoUmZSZWdzLlIzOwotCQkJCQlSMyAmPSAweGZmZjNmZmZmOwotCQkJCQlSMyB8PSAweDAwMDgwMDAwOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7Ci0KLQkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKLQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOwotCi0JCQkJCVIyID0gUkZSZWdUYWJsZVtpbmRleF0uUjI7Ci0JCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4NDAwMDsJLy8gSWYgVFhwYXRoIGlzIDEsIGJpdCAxNCA9IDE7Ci0JCQkJCX0KLQotCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQl7Ci0JCQkJCQlSMiB8PSAweDIwMDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeFBhdGgKLQkJCQkJfQotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNUdXJuT25SRkNsayMlZChSRj0lZCwgKSAsIFIyPTB4JTA4eFxuIiwKLQkJQ2hhbm5lbCwKLQkJcEFkLT5SZkljVHlwZSwKLQkJUjIpKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRfY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODc5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9jaGFubmVsLmMKQEAgLTAsMCArMSwxNzA1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisKK3N0cnVjdCBydF9jaF9mcmVxX21hcCBDSF9IWl9JRF9NQVBbXSA9IHsKKwl7MSwgMjQxMn0KKwksCisJezIsIDI0MTd9CisJLAorCXszLCAyNDIyfQorCSwKKwl7NCwgMjQyN30KKwksCisJezUsIDI0MzJ9CisJLAorCXs2LCAyNDM3fQorCSwKKwl7NywgMjQ0Mn0KKwksCisJezgsIDI0NDd9CisJLAorCXs5LCAyNDUyfQorCSwKKwl7MTAsIDI0NTd9CisJLAorCXsxMSwgMjQ2Mn0KKwksCisJezEyLCAyNDY3fQorCSwKKwl7MTMsIDI0NzJ9CisJLAorCXsxNCwgMjQ4NH0KKwksCisKKwkvKiAgVU5JSSAqLworCXszNiwgNTE4MH0KKwksCisJezQwLCA1MjAwfQorCSwKKwl7NDQsIDUyMjB9CisJLAorCXs0OCwgNTI0MH0KKwksCisJezUyLCA1MjYwfQorCSwKKwl7NTYsIDUyODB9CisJLAorCXs2MCwgNTMwMH0KKwksCisJezY0LCA1MzIwfQorCSwKKwl7MTQ5LCA1NzQ1fQorCSwKKwl7MTUzLCA1NzY1fQorCSwKKwl7MTU3LCA1Nzg1fQorCSwKKwl7MTYxLCA1ODA1fQorCSwKKwl7MTY1LCA1ODI1fQorCSwKKwl7MTY3LCA1ODM1fQorCSwKKwl7MTY5LCA1ODQ1fQorCSwKKwl7MTcxLCA1ODU1fQorCSwKKwl7MTczLCA1ODY1fQorCSwKKworCS8qIEhpcGVyTEFOMiAqLworCXsxMDAsIDU1MDB9CisJLAorCXsxMDQsIDU1MjB9CisJLAorCXsxMDgsIDU1NDB9CisJLAorCXsxMTIsIDU1NjB9CisJLAorCXsxMTYsIDU1ODB9CisJLAorCXsxMjAsIDU2MDB9CisJLAorCXsxMjQsIDU2MjB9CisJLAorCXsxMjgsIDU2NDB9CisJLAorCXsxMzIsIDU2NjB9CisJLAorCXsxMzYsIDU2ODB9CisJLAorCXsxNDAsIDU3MDB9CisJLAorCisJLyogSmFwYW4gTU1BQyAqLworCXszNCwgNTE3MH0KKwksCisJezM4LCA1MTkwfQorCSwKKwl7NDIsIDUyMTB9CisJLAorCXs0NiwgNTIzMH0KKwksCisKKwkvKiAgSmFwYW4gKi8KKwl7MTg0LCA0OTIwfQorCSwKKwl7MTg4LCA0OTQwfQorCSwKKwl7MTkyLCA0OTYwfQorCSwKKwl7MTk2LCA0OTgwfQorCSwKKworCXsyMDgsIDUwNDB9CisJLAkJCS8qIEphcGFuLCBtZWFucyBKMDggKi8KKwl7MjEyLCA1MDYwfQorCSwJCQkvKiBKYXBhbiwgbWVhbnMgSjEyICovCisJezIxNiwgNTA4MH0KKwksCQkJLyogSmFwYW4sIG1lYW5zIEoxNiAqLworfTsKKworaW50IENIX0haX0lEX01BUF9OVU0gPSAoc2l6ZW9mKENIX0haX0lEX01BUCkgLyBzaXplb2Yoc3RydWN0IHJ0X2NoX2ZyZXFfbWFwKSk7CisKK3N0cnVjdCBydF9jaF9yZWdpb24gQ2hSZWdpb25bXSA9IHsKKwl7CQkJLyogQW50aWd1YSBhbmQgQmVyYnVkYSAqLworCSAiQUciLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBBcmdlbnRpbmEgKi8KKwkgIkFSIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQXJ1YmEgKi8KKwkgIkFXIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQXVzdHJhbGlhICovCisJICJBVSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDUsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQXVzdHJpYSAqLworCSAiQVQiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCYWhhbWFzICovCisJICJCUyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDUsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQmFyYmFkb3MgKi8KKwkgIkJCIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogQmVybXVkYSAqLworCSAiQk0iLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCcmF6aWwgKi8KKwkgIkJSIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBCZWxnaXVtICovCisJICJCRSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAxOCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDE4LCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEJ1bGdhcmlhICovCisJICJCRyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBDYW5hZGEgKi8KKwkgIkNBIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBDYXltYW4gSXNMYW5kcyAqLworCSAiS1kiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBDaGlsZSAqLworCSAiQ0wiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA1LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENoaW5hICovCisJICJDTiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezE0OSwgNCwgMjcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBDb2xvbWJpYSAqLworCSAiQ08iLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MTQ5LCA1LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjUgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIENvc3RhIFJpY2EgKi8KKwkgIkNSIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDE3LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBDeXBydXMgKi8KKwkgIkNZIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEN6ZWNoX1JlcHVibGljICovCisJICJDWiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogRGVubWFyayAqLworCSAiREsiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogRG9taW5pY2FuIFJlcHVibGljICovCisJICJETyIsCisJIENFLAorCSB7CisJICB7MSwgMCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAwICovCisJICB7MTQ5LCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEVxdWFkb3IgKi8KKwkgIkVDIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTAwLCAxMSwgMjcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBFbCBTYWx2YWRvciAqLworCSAiU1YiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDM2LCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBGaW5sYW5kICovCisJICJGSSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBGcmFuY2UgKi8KKwkgIkZSIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBHZXJtYW55ICovCisJICJERSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBHcmVlY2UgKi8KKwkgIkdSIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIE9ET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEd1YW0gKi8KKwkgIkdVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMSwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7MzYsIDQsIDE3LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBHdWF0ZW1hbGEgKi8KKwkgIkdUIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDE3LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBIYWl0aSAqLworCSAiSFQiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMTcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEhvbmR1cmFzICovCisJICJITiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezE0OSwgNCwgMjcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBIb25nIEtvbmcgKi8KKwkgIkhLIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNCwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBIdW5nYXJ5ICovCisJICJIVSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSWNlbGFuZCAqLworCSAiSVMiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSW5kaWEgKi8KKwkgIklOIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyNCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIEluZG9uZXNpYSAqLworCSAiSUQiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHsxNDksIDQsIDI3LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSXJlbGFuZCAqLworCSAiSUUiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgT0RPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSXNyYWVsICovCisJICJJTCIsCisJIENFLAorCSB7CisJICB7MSwgMywgMjAsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjMgKi8KKwkgIHs0LCA2LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDR+OSAqLworCSAgezEwLCA0LCAyMCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDEwfjEzICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBJdGFseSAqLworCSAiSVQiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgT0RPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogSmFwYW4gKi8KKwkgIkpQIiwKKwkgSkFQLAorCSB7CisJICB7MSwgMTQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xNCAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBKb3JkYW4gKi8KKwkgIkpPIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHsxNDksIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTGF0dmlhICovCisJICJMViIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBMaWVjaHRlbnN0ZWluICovCisJICJMSSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTGl0aHVhbmlhICovCisJICJMVCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBMdXhlbWJ1cmcgKi8KKwkgIkxVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIE1hbGF5c2lhICovCisJICJNWSIsCisJIENFLAorCSB7CisJICB7MzYsIDQsIDIzLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezE0OSwgNSwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBNYWx0YSAqLworCSAiTVQiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTWFyb2NjbyAqLworCSAiTUEiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjQsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTWV4aWNvICovCisJICJNWCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDUsIDMwLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTmV0aGVybGFuZHMgKi8KKwkgIk5MIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjQsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIE5ldyBaZWFsYW5kICovCisJICJOWiIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyNCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxNDksIDQsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogTm9yd2F5ICovCisJICJOTyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyNCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDI0LCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBQZXJ1ICovCisJICJQRSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezE0OSwgNCwgMjcsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTYxICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBQb3J0dWdhbCAqLworCSAiUFQiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogUG9sYW5kICovCisJICJQTCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBSb21hbmlhICovCisJICJSTyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBSdXNzaWEgKi8KKwkgIlJVIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MTQ5LCA0LCAyMCwgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNhdWRpIEFyYWJpYSAqLworCSAiU0EiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNlcmJpYV9hbmRfTW9udGVuZWdybyAqLworCSAiQ1MiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNpbmdhcG9yZSAqLworCSAiU0ciLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTQ5LCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNsb3Zha2lhICovCisJICJTSyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBTbG92ZW5pYSAqLworCSAiU0kiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNvdXRoIEFmcmljYSAqLworCSAiWkEiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTMgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHsxNDksIDQsIDMwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2MSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogU291dGggS29yZWEgKi8KKwkgIktSIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgOCwgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTI4ICovCisJICB7MTQ5LCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFNwYWluICovCisJICJFUyIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAxNywgSURPUiwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDM2fjQ4ICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfQorCSAgLAkJCS8qIDVHLCBjaCAxMDB+MTQwICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBTd2VkZW4gKi8KKwkgIlNFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjEzICovCisJICB7MzYsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MTAwLCAxMSwgMzAsIEJPVEgsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFN3aXR6ZXJsYW5kICovCisJICJDSCIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMyAqLworCSAgezM2LCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMzZ+NDggKi8KKwkgIHs1MiwgNCwgMjMsIElET1IsIFRSVUV9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBUYWl3YW4gKi8KKwkgIlRXIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7NTIsIDQsIDIzLCBJRE9SLCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFR1cmtleSAqLworCSAiVFIiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHszNiwgNCwgMjMsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAzNn40OCAqLworCSAgezUyLCA0LCAyMywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBVSyAqLworCSAiR0IiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHszNiwgNCwgMjMsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezUyLCA0LCAyMywgSURPUiwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogVWtyYWluZSAqLworCSAiVUEiLAorCSBDRSwKKwkgeworCSAgezEsIDEzLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIFVuaXRlZF9BcmFiX0VtaXJhdGVzICovCisJICJBRSIsCisJIENFLAorCSB7CisJICB7MSwgMTMsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCisKKwl7CQkJLyogVW5pdGVkX1N0YXRlcyAqLworCSAiVVMiLAorCSBDRSwKKwkgeworCSAgezEsIDExLCAzMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogMi40IEcsIGNoIDF+MTEgKi8KKwkgIHszNiwgNCwgMTcsIElET1IsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCA1Mn42NCAqLworCSAgezUyLCA0LCAyNCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0KKwkgICwJCQkvKiA1RywgY2ggMTAwfjE0MCAqLworCSAgezE0OSwgNSwgMzAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDVHLCBjaCAxNDl+MTY1ICovCisJICB7MH0KKwkgICwJCQkvKiBlbmQgKi8KKwkgIH0KKwkgfQorCSwKKworCXsJCQkvKiBWZW5lenVlbGEgKi8KKwkgIlZFIiwKKwkgQ0UsCisJIHsKKwkgIHsxLCAxMywgMjAsIEJPVEgsIEZBTFNFfQorCSAgLAkJCS8qIDIuNCBHLCBjaCAxfjExICovCisJICB7MTQ5LCA0LCAyNywgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDE0OX4xNjEgKi8KKwkgIHswfQorCSAgLAkJCS8qIGVuZCAqLworCSAgfQorCSB9CisJLAorCisJewkJCS8qIERlZmF1bHQgKi8KKwkgIiIsCisJIENFLAorCSB7CisJICB7MSwgMTEsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiAyLjQgRywgY2ggMX4xMSAqLworCSAgezM2LCA0LCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDUyfjY0ICovCisJICB7NTIsIDQsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggNTJ+NjQgKi8KKwkgIHsxMDAsIDExLCAyMCwgQk9USCwgRkFMU0V9CisJICAsCQkJLyogNUcsIGNoIDEwMH4xNDAgKi8KKwkgIHsxNDksIDUsIDIwLCBCT1RILCBGQUxTRX0KKwkgICwJCQkvKiA1RywgY2ggMTQ5fjE2NSAqLworCSAgezB9CisJICAsCQkJLyogZW5kICovCisJICB9CisJIH0KKwksCit9OworCitzdGF0aWMgc3RydWN0IHJ0X2NoX3JlZ2lvbiAqR2V0Q2hSZWdpb24odTggKkNudHJ5Q29kZSkKK3sKKwlpbnQgbG9vcCA9IDA7CisJc3RydWN0IHJ0X2NoX3JlZ2lvbiAqcENoUmVnaW9uID0gTlVMTDsKKworCXdoaWxlIChzdHJjbXAoKGNoYXIgKilDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgIiIpICE9IDApIHsKKwkJaWYgKHN0cm5jbXAKKwkJICAgICgoY2hhciAqKUNoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAoY2hhciAqKUNudHJ5Q29kZSwKKwkJICAgICAyKSA9PSAwKSB7CisJCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJCQlicmVhazsKKwkJfQorCQlsb29wKys7CisJfQorCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlwQ2hSZWdpb24gPSAmQ2hSZWdpb25bbG9vcF07CisJcmV0dXJuIHBDaFJlZ2lvbjsKK30KKworc3RhdGljIHZvaWQgQ2hCYW5kQ2hlY2sodTggUGh5TW9kZSwgdTggKnBDaFR5cGUpCit7CisJc3dpdGNoIChQaHlNb2RlKSB7CisJY2FzZSBQSFlfMTFBOgorCWNhc2UgUEhZXzExQU5fTUlYRUQ6CisJCSpwQ2hUeXBlID0gQkFORF81RzsKKwkJYnJlYWs7CisJY2FzZSBQSFlfMTFBQkdfTUlYRUQ6CisJY2FzZSBQSFlfMTFBR05fTUlYRUQ6CisJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgorCQkqcENoVHlwZSA9IEJBTkRfQk9USDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkqcENoVHlwZSA9IEJBTkRfMjRHOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB1OCBGaWxsQ2hMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9jaF9kZXNwICpwQ2hEZXNwLAorCQkJdTggT2Zmc2V0LCB1OCBpbmNyZW1lbnQpCit7CisJaW50IGksIGosIGw7CisJdTggY2hhbm5lbDsKKworCWogPSBPZmZzZXQ7CisJZm9yIChpID0gMDsgaSA8IHBDaERlc3AtPk51bU9mQ2g7IGkrKykgeworCQljaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKKwkJZm9yIChsID0gMDsgbCA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGwrKykgeworCQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5UeFBvd2VyW2xdLkNoYW5uZWwpIHsKKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyID0KKwkJCQkgICAgcEFkLT5UeFBvd2VyW2xdLlBvd2VyOworCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIyID0KKwkJCQkgICAgcEFkLT5UeFBvd2VyW2xdLlBvd2VyMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQorCQkJY29udGludWU7CisKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5DaGFubmVsID0KKwkJICAgIHBDaERlc3AtPkZpcnN0Q2hhbm5lbCArIGkgKiBpbmNyZW1lbnQ7CisJCXBBZC0+Q2hhbm5lbExpc3Rbal0uTWF4VHhQd3IgPSBwQ2hEZXNwLT5NYXhUeFB3cjsKKwkJcEFkLT5DaGFubmVsTGlzdFtqXS5EZnNSZXEgPSBwQ2hEZXNwLT5EZnNSZXE7CisJCWorKzsKKwl9CisJcEFkLT5DaGFubmVsTGlzdE51bSA9IGo7CisKKwlyZXR1cm4gajsKK30KKworc3RhdGljIGlubGluZSB2b2lkIENyZWF0ZUNoTGlzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJc3RydWN0IHJ0X2NoX3JlZ2lvbiAqcENoUmVnaW9uLCB1OCBHZW9ncmFwaHkpCit7CisJaW50IGk7CisJdTggb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgcnRfY2hfZGVzcCAqcENoRGVzcDsKKwl1OCBDaFR5cGU7CisJdTggaW5jcmVtZW50OworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07CisJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKKwkJCWJyZWFrOworCisJCWlmIChDaFR5cGUgPT0gQkFORF81RykgeworCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCisJCSAgICB8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IEdlb2dyYXBoeSkpIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKKwkJCQlpbmNyZW1lbnQgPSA0OworCQkJZWxzZQorCQkJCWluY3JlbWVudCA9IDE7CisJCQlvZmZzZXQgPSBGaWxsQ2hMaXN0KHBBZCwgcENoRGVzcCwgb2Zmc2V0LCBpbmNyZW1lbnQpOworCQl9CisJfQorfQorCit2b2lkIEJ1aWxkQ2hhbm5lbExpc3RFeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X2NoX3JlZ2lvbiAqcENoUmVnOworCisJcENoUmVnID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCUNyZWF0ZUNoTGlzdChwQWQsIHBDaFJlZywgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KTsKK30KKwordm9pZCBCdWlsZEJlYWNvbkNoTGlzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCAqcEJ1ZiwgdW5zaWduZWQgbG9uZyAqcEJ1ZkxlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwlzdHJ1Y3QgcnRfY2hfcmVnaW9uICpwQ2hSZWdpb247CisJc3RydWN0IHJ0X2NoX2Rlc3AgKnBDaERlc3A7CisJdTggQ2hUeXBlOworCisJcENoUmVnaW9uID0gR2V0Q2hSZWdpb24ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpOworCisJaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKKwkqcEJ1ZkxlbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOworCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCisJCQlicmVhazsKKworCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpIHsKKwkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKSB7CisJCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQorCQkgICAgfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkpKSB7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwQnVmICsgKnBCdWZMZW4sICZUbXBMZW4sCisJCQkJCSAgMSwgJnBDaERlc3AtPkZpcnN0Q2hhbm5lbCwKKwkJCQkJICAxLCAmcENoRGVzcC0+TnVtT2ZDaCwKKwkJCQkJICAxLCAmcENoRGVzcC0+TWF4VHhQd3IsIEVORF9PRl9BUkdTKTsKKwkJCSpwQnVmTGVuICs9IFRtcExlbjsKKwkJfQorCX0KK30KKworc3RhdGljIEJPT0xFQU4gSXNWYWxpZENoYW5uZWwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjaGFubmVsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykgeworCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsID09IGNoYW5uZWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQorCQlyZXR1cm4gRkFMU0U7CisJZWxzZQorCQlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHU4IEdldEV4dENoKHU4IENoYW5uZWwsIHU4IERpcmVjdGlvbikKK3sKKwljaGFyIEV4dENoOworCisJaWYgKERpcmVjdGlvbiA9PSBFWFRDSEFfQUJPVkUpCisJCUV4dENoID0gQ2hhbm5lbCArIDQ7CisJZWxzZQorCQlFeHRDaCA9IChDaGFubmVsIC0gNCkgPiAwID8gKENoYW5uZWwgLSA0KSA6IDA7CisKKwlyZXR1cm4gRXh0Q2g7Cit9CisKK3ZvaWQgTl9DaGFubmVsQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCS8qdTggQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07ICovCisJdTggQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkpIHsKKwkJaWYgKENoYW5uZWwgPiAxNCkgeworCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkKKwkJCSAgICB8fCAoQ2hhbm5lbCA9PSA1MikgfHwgKENoYW5uZWwgPT0gNjApCisJCQkgICAgfHwgKENoYW5uZWwgPT0gMTAwKSB8fCAoQ2hhbm5lbCA9PSAxMDgpCisJCQkgICAgfHwgKENoYW5uZWwgPT0gMTE2KSB8fCAoQ2hhbm5lbCA9PSAxMjQpCisJCQkgICAgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpCisJCQkgICAgfHwgKENoYW5uZWwgPT0gMTU3KSkgeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPQorCQkJCSAgICBFWFRDSEFfQUJPVkU7CisJCQl9IGVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkKKwkJCQkgICB8fCAoQ2hhbm5lbCA9PSA1NikgfHwgKENoYW5uZWwgPT0gNjQpCisJCQkJICAgfHwgKENoYW5uZWwgPT0gMTA0KSB8fCAoQ2hhbm5lbCA9PSAxMTIpCisJCQkJICAgfHwgKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpCisJCQkJICAgfHwgKENoYW5uZWwgPT0gMTM2KSB8fCAoQ2hhbm5lbCA9PSAxNTMpCisJCQkJICAgfHwgKENoYW5uZWwgPT0gMTYxKSkgeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPQorCQkJCSAgICBFWFRDSEFfQkVMT1c7CisJCQl9IGVsc2UgeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9CisJCQkJICAgIEJXXzIwOworCQkJfQorCQl9IGVsc2UgeworCQkJZG8geworCQkJCXU4IEV4dENoOworCQkJCXU4IERpciA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkgICAgRVhUQ0hBOworCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKKwkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCisJCQkJCWJyZWFrOworCisJCQkJRGlyID0KKwkJCQkgICAgKERpciA9PQorCQkJCSAgICAgRVhUQ0hBX0FCT1ZFKSA/IEVYVENIQV9CRUxPVyA6CisJCQkJICAgIEVYVENIQV9BQk9WRTsKKwkJCQlFeHRDaCA9IEdldEV4dENoKENoYW5uZWwsIERpcik7CisJCQkJaWYgKElzVmFsaWRDaGFubmVsKHBBZCwgRXh0Q2gpKSB7CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC4KKwkJCQkJICAgIEVYVENIQSA9IERpcjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9CisJCQkJICAgIEJXXzIwOworCQkJfSB3aGlsZSAoRkFMU0UpOworCisJCQlpZiAoQ2hhbm5lbCA9PSAxNCkgeworCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9CisJCQkJICAgIEJXXzIwOworCQkJCS8qcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9OT05FOyAvLyBXZSBkaWRuJ3Qgc2V0IHRoZSBFeHRDaCBhcyBOT05FIGR1ZSB0byBpdCdsbCBzZXQgaW4gUlRNUFNldEhUKCkgKi8KKwkJCX0KKwkJfQorCX0KKworfQorCit2b2lkIE5fU2V0Q2VuQ2goc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0KKwkJICAgIEVYVENIQV9BQk9WRSkgeworCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPQorCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQl9IGVsc2UgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gMTQpCisJCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPQorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMTsKKwkJCWVsc2UKKwkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQl9CisJfSBlbHNlIHsKKwkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCX0KK30KKwordTggR2V0Q3VudHJ5TWF4VHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjaGFubmVsKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspIHsKKwkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKKwkJcmV0dXJuIDB4ZmY7CisJZWxzZQorCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0X3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9yZi5jCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0X3JmLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0X3JmLmMKaW5kZXggOWQ2MzhmNy4uNTE5MTIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfcmYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydF9yZi5jCkBAIC0zNyw3ICszNyw2IEBACiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotCiAjaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTQsMjcgKzUzLDI2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBSVDMweHhXcml0ZVJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlyZWdJRCwKLQlJTglVQ0hBUgkJCXZhbHVlKQoraW50IFJUMzB4eFdyaXRlUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICB1OCByZWdJRCwgdTggdmFsdWUpCiB7Ci0JUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKLQlVSU5UCQkJCWkgPSAwOworCVJGX0NTUl9DRkdfU1RSVUMgcmZjc3I7CisJdTMyIGkgPSAwOwogCi0JZG8KLQl7CisJZG8gewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKIAogCQlpZiAoIXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLKQogCQkJYnJlYWs7CiAJCWkrKzsKIAl9Ci0Jd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CisJd2hpbGUgKChpIDwgUkVUUllfTElNSVQpCisJICAgICAgICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7CiAKLQlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOworCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkKKwkgICAgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCFcbiIpKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQogCkBAIC04OCw3ICs4Niw2IEBACiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMTA0LDIwICsxMDEsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIFJUMzB4eFJlYWRSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJcmVnSUQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKQoraW50IFJUMzB4eFJlYWRSRlJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdTggcmVnSUQsIHU4ICpwVmFsdWUpCiB7Ci0JUkZfQ1NSX0NGR19TVFJVQwlyZmNzcjsKLQlVSU5UCQkJCWk9MCwgaz0wOworCVJGX0NTUl9DRkdfU1RSVUMgcmZjc3I7CisJdTMyIGkgPSAwLCBrID0gMDsKIAotCWZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVTWV9DT1VOVDsgaSsrKSB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwogCi0JCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQotCQl7CisJCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKSB7CiAJCQljb250aW51ZTsKIAkJfQogCQlyZmNzci53b3JkID0gMDsKQEAgLTEyNSw0MiArMTE4LDM2IEBACiAJCXJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID0gMTsKIAkJcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSByZWdJRDsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7Ci0JCWZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspCi0JCXsKKwkJZm9yIChrID0gMDsgayA8IE1BWF9CVVNZX0NPVU5UOyBrKyspIHsKIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUkZfQ1NSX0NGRywgJnJmY3NyLndvcmQpOwogCiAJCQlpZiAocmZjc3IuZmllbGQuUkZfQ1NSX0tJQ0sgPT0gSURMRSkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpICYmCi0JCQkocmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPT0gcmVnSUQpKQotCQl7Ci0JCQkqcFZhbHVlID0gKFVDSEFSKXJmY3NyLmZpZWxkLlJGX0NTUl9EQVRBOworCQkgICAgKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IHJlZ0lEKSkgeworCQkJKnBWYWx1ZSA9ICh1OClyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUkYgcmVhZCBSJWQ9MHgleCBmYWlsLCBpWyVkXSwga1slZF1cbiIsIHJlZ0lELCByZmNzci53b3JkLGksaykpOworCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKSB7CisJCURCR1BSSU5UX0VSUigoIlJGIHJlYWQgUiVkPTB4JXggZmFpbCwgaVslZF0sIGtbJWRdXG4iLCByZWdJRCwKKwkJCSAgICAgIHJmY3NyLndvcmQsIGksIGspKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KLVZPSUQgTklDSW5pdFJGUmVnaXN0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQordm9pZCBOSUNJbml0UkZSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCWlmIChwQWQtPmNoaXBPcHMuQXNpY1JmSW5pdCkKIAkJcEFkLT5jaGlwT3BzLkFzaWNSZkluaXQocEFkKTsKIH0KIAotCi1WT0lEIFJ0bXBDaGlwT3BzUkZIb29rKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKQordm9pZCBSdG1wQ2hpcE9wc1JGSG9vayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7CisJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwogCiAJcENoaXBPcHMtPnBSRlJlZ1RhYmxlID0gTlVMTDsKIAlwQ2hpcE9wcy0+QXNpY1JmSW5pdCA9IE5VTEw7CkBAIC0xNjgsMzQgKzE1NSwzNCBAQAogCXBDaGlwT3BzLT5Bc2ljUmZUdXJuT2ZmID0gTlVMTDsKIAlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUgPSBOVUxMOwogCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbiA9IE5VTEw7Ci0jaWZkZWYgUlQzM3h4Ci1pZiAoSVNfUlQzMzkwKHBBZCkgJiYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSkKLQkJewotCQkJcENoaXBPcHMtPnBSRlJlZ1RhYmxlID0gUkZSZWdUYWJsZU92ZXJSVDMzOTA7Ci0JCQlwQ2hpcE9wcy0+QXNpY0hhbHRBY3Rpb24gPSBSVDMzeHhIYWx0QWN0aW9uOwotCQkJcENoaXBPcHMtPkFzaWNSZlR1cm5PZmYgPSBSVDMzeHhMb2FkUkZTbGVlcE1vZGVTZXR1cDsKLQkJCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTklDSW5pdFJUMzM5MFJGUmVnaXN0ZXJzOwotCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0gUlQzM3h4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7Ci0JCX0KLSNlbHNlIC8vIFJUMzN4eCAvLwogCS8qIFdlIGRlcGVuZHMgb24gUmZJQ1R5cGUgYW5kIE1BQ1ZlcnNpb24gdG8gYXNzaWduIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBjYWxsYmFja3MuICovCiAKICNpZmRlZiBSVDMweHgKLQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JeworCWlmIChJU19SVDMweHgocEFkKSkgewogCQlwQ2hpcE9wcy0+cFJGUmVnVGFibGUgPSBSVDMweHhfUkZSZWdUYWJsZTsKIAkJcENoaXBPcHMtPkFzaWNIYWx0QWN0aW9uID0gUlQzMHh4SGFsdEFjdGlvbjsKKyNpZmRlZiBSVDMwNzAKKwkJaWYgKChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkKKwkJICAgICYmIChwQWQtPmluZlR5cGUgPT0gUlRNUF9ERVZfSU5GX1VTQikpIHsKKwkJCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTklDSW5pdFJUMzA3MFJGUmVnaXN0ZXJzOworCQkJaWYgKElTX1JUMzA3MShwQWQpKSB7CisJCQkJcENoaXBPcHMtPkFzaWNSZlR1cm5PZmYgPQorCQkJCSAgICBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cDsKKwkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUgPQorCQkJCSAgICBSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cDsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIFJUMzA3MCAvLyAqLwogI2lmZGVmIFJUMzA5MAotCQlpZiAoSVNfUlQzMDkwKHBBZCkgJiYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSkKLQkJeworCQlpZiAoSVNfUlQzMDkwKHBBZCkgJiYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSkgewogCQkJcENoaXBPcHMtPkFzaWNSZlR1cm5PZmYgPSBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cDsKIAkJCXBDaGlwT3BzLT5Bc2ljUmZJbml0ID0gTklDSW5pdFJUMzA5MFJGUmVnaXN0ZXJzOwotCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlID0gUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXA7CisJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUgPQorCQkJICAgIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwOwogCQl9Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCisjZW5kaWYgLyogUlQzMDkwIC8vICovCiAJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUMzN4eCAvLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogfQogCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCmluZGV4IDIwYzJjZTIuLjIxYTk1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfaW5pdC5jCkBAIC0zMywxNzIgKzMzLDExMSBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0CiAJLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCi0gICAgSm9obiBDaGFuZyAgMjAwNC0wOC0yMCAgICBSVDI1NjEvMjY2MSB1c2Ugc2NhdHRlci1nYXRoZXIgc2NoZW1lCi0gICAgSmFuIExlZSAgMjAwNi0wOS0xNSAgICBSVDI4NjAuIENoYW5nZSBmb3IgODAyLjExbiAsIEVFUFJPTSwgTGVkLCBCQSwgSFQuCiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2lmZGVmIFJUMjg2MAotI2luY2x1ZGUgImZpcm13YXJlLmgiCi0jaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLS8qIE5ldyBmaXJtd2FyZSBoYW5kbGVzIGJvdGggUlQyODcwIGFuZCBSVDMwNzAuICovCi0jaW5jbHVkZSAiLi4vLi4vcnQzMDcwL2Zpcm13YXJlLmgiCi0jZW5kaWYKIAotVUNIQVIgICAgQklUOFtdID0gezB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OwotVUxPTkcgICAgQklUMzJbXSA9IHsweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDA4LAotCQkJCQkweDAwMDAwMDEwLCAweDAwMDAwMDIwLCAweDAwMDAwMDQwLCAweDAwMDAwMDgwLAotCQkJCQkweDAwMDAwMTAwLCAweDAwMDAwMjAwLCAweDAwMDAwNDAwLCAweDAwMDAwODAwLAotCQkJCQkweDAwMDAxMDAwLCAweDAwMDAyMDAwLCAweDAwMDA0MDAwLCAweDAwMDA4MDAwLAotCQkJCQkweDAwMDEwMDAwLCAweDAwMDIwMDAwLCAweDAwMDQwMDAwLCAweDAwMDgwMDAwLAotCQkJCQkweDAwMTAwMDAwLCAweDAwMjAwMDAwLCAweDAwNDAwMDAwLCAweDAwODAwMDAwLAotCQkJCQkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwLAotCQkJCQkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwfTsKK3U4IEJJVDhbXSA9IHsgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCB9OworY2hhciAqQ2lwaGVyTmFtZVtdID0KKyAgICB7ICJub25lIiwgIndlcDY0IiwgIndlcDEyOCIsICJUS0lQIiwgIkFFUyIsICJDS0lQNjQiLCAiQ0tJUDEyOCIgfTsKIAotY2hhciogICBDaXBoZXJOYW1lW10gPSB7Im5vbmUiLCJ3ZXA2NCIsIndlcDEyOCIsIlRLSVAiLCJBRVMiLCJDS0lQNjQiLCJDS0lQMTI4In07Ci0KLS8vCi0vLyBCQlAgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0Ci0vLwotUkVHX1BBSVIgICBCQlBSZWdUYWJsZVtdID0gewotCXtCQlBfUjY1LAkJMHgyQ30sCQkvLyBmaXggcnNzaSBpc3N1ZQotCXtCQlBfUjY2LAkJMHgzOH0sCS8vIEFsc28gc2V0IHRoaXMgZGVmYXVsdCB2YWx1ZSB0byBwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgYXQgaW5pdGlhbAotCXtCQlBfUjY5LAkJMHgxMn0sCi0Je0JCUF9SNzAsCQkweGF9LAkvLyBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YQotCXtCQlBfUjczLAkJMHgxMH0sCi0Je0JCUF9SODEsCQkweDM3fSwKLQl7QkJQX1I4MiwJCTB4NjJ9LAotCXtCQlBfUjgzLAkJMHg2QX0sCi0Je0JCUF9SODQsCQkweDk5fSwJLy8gMHgxOSBpcyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gMHg5OSBpcyBmb3IgcnQyODYwRCBhbmQgYmVmb3JlCi0Je0JCUF9SODYsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SOTEsCQkweDA0fSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SOTIsCQkweDAwfSwJLy8gbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4Ci0Je0JCUF9SMTAzLCAgCTB4MDB9LCAJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKLQl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgorLyogKi8KKy8qIEJCUCByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQgKi8KKy8qICovCitzdHJ1Y3QgcnRfcmVnX3BhaXIgQkJQUmVnVGFibGVbXSA9IHsKKwl7QkJQX1I2NSwgMHgyQ30sCS8qIGZpeCByc3NpIGlzc3VlICovCisJe0JCUF9SNjYsIDB4Mzh9LAkvKiBBbHNvIHNldCB0aGlzIGRlZmF1bHQgdmFsdWUgdG8gcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlIGF0IGluaXRpYWwgKi8KKwl7QkJQX1I2OSwgMHgxMn0sCisJe0JCUF9SNzAsIDB4YX0sCQkvKiBCQlBfUjcwIHdpbGwgY2hhbmdlIHRvIDB4OCBpbiBBcFN0YXJ0VXAgYW5kIExpbmtVcCBmb3IgcnQyODYwQywgb3RoZXJ3aXNlIHZhbHVlIGlzIDB4YSAqLworCXtCQlBfUjczLCAweDEwfSwKKwl7QkJQX1I4MSwgMHgzN30sCisJe0JCUF9SODIsIDB4NjJ9LAorCXtCQlBfUjgzLCAweDZBfSwKKwl7QkJQX1I4NCwgMHg5OX0sCS8qIDB4MTkgaXMgZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuIDB4OTkgaXMgZm9yIHJ0Mjg2MEQgYW5kIGJlZm9yZSAqLworCXtCQlBfUjg2LCAweDAwfSwJLyogbWlkZGxlIHJhbmdlIGlzc3VlLCBSb3J5IEAyMDA4LTAxLTI4ICovCisJe0JCUF9SOTEsIDB4MDR9LAkvKiBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjggKi8KKwl7QkJQX1I5MiwgMHgwMH0sCS8qIG1pZGRsZSByYW5nZSBpc3N1ZSwgUm9yeSBAMjAwOC0wMS0yOCAqLworCXtCQlBfUjEwMywgMHgwMH0sCS8qIG5lYXIgcmFuZ2UgaGlnaC1wb3dlciBpc3N1ZSwgcmVxdWVzdGVkIGZyb20gR2FyeSBAMjAwOC0wNTI4ICovCisJe0JCUF9SMTA1LCAweDA1fSwJLyogMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLiAqLworCXtCQlBfUjEwNiwgMHgzNX0sCS8qIGZvciBTaG9ydEdJIHRocm91Z2hwdXQgKi8KIH07Ci0jZGVmaW5lCU5VTV9CQlBfUkVHX1BBUk1TCShzaXplb2YoQkJQUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKIAotLy8KLS8vIFJGIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldAotLy8KLSNpZmRlZiBSVDI4NzAKLVJFR19QQUlSICAgUlQzMHh4X1JGUmVnVGFibGVbXSA9IHsKLSAgICAgICAge1JGX1IwNCwgICAgICAgICAgMHg0MH0sCi0gICAgICAgIHtSRl9SMDUsICAgICAgICAgIDB4MDN9LAotICAgICAgICB7UkZfUjA2LCAgICAgICAgICAweDAyfSwKLSAgICAgICAge1JGX1IwNywgICAgICAgICAgMHg3MH0sCi0gICAgICAgIHtSRl9SMDksICAgICAgICAgIDB4MEZ9LAotICAgICAgICB7UkZfUjEwLCAgICAgICAgICAweDQxfSwKLSAgICAgICAge1JGX1IxMSwgICAgICAgICAgMHgyMX0sCi0gICAgICAgIHtSRl9SMTIsICAgICAgICAgIDB4N0J9LAotICAgICAgICB7UkZfUjE0LCAgICAgICAgICAweDkwfSwKLSAgICAgICAge1JGX1IxNSwgICAgICAgICAgMHg1OH0sCi0gICAgICAgIHtSRl9SMTYsICAgICAgICAgIDB4QjN9LAotICAgICAgICB7UkZfUjE3LCAgICAgICAgICAweDkyfSwKLSAgICAgICAge1JGX1IxOCwgICAgICAgICAgMHgyQ30sCi0gICAgICAgIHtSRl9SMTksICAgICAgICAgIDB4MDJ9LAotICAgICAgICB7UkZfUjIwLCAgICAgICAgICAweEJBfSwKLSAgICAgICAge1JGX1IyMSwgICAgICAgICAgMHhEQn0sCi0gICAgICAgIHtSRl9SMjQsICAgICAgICAgIDB4MTZ9LAotICAgICAgICB7UkZfUjI1LCAgICAgICAgICAweDAxfSwKLSAgICAgICAge1JGX1IyOSwgICAgICAgICAgMHgxRn0sCi19OwotI2RlZmluZQlOVU1fUkZfUkVHX1BBUk1TCShzaXplb2YoUlQzMHh4X1JGUmVnVGFibGUpIC8gc2l6ZW9mKFJFR19QQUlSKSkKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2Yoc3RydWN0IHJ0X3JlZ19wYWlyKSkKIAotLy8KLS8vIEFTSUMgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0cwotLy8KKy8qICovCisvKiBBU0lDIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldHMgKi8KKy8qICovCiAKLVJUTVBfUkVHX1BBSVIJTUFDUmVnVGFibGVbXSA9CXsKK3N0cnVjdCBydF9ydG1wX3JlZ19wYWlyIE1BQ1JlZ1RhYmxlW10gPSB7CiAjaWYgZGVmaW5lZChIV19CRUFDT05fT0ZGU0VUKSAmJiAoSFdfQkVBQ09OX09GRlNFVCA9PSAweDIwMCkKLQl7QkNOX09GRlNFVDAsCQkJMHhmOGYwZThlMH0sIC8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCi0Je0JDTl9PRkZTRVQxLAkJCTB4NmY3N2QwYzh9LCAvKiAweDMyMDAoYzgpLCAweDM0MDAoZDApLCAweDFEQzAoNzcpLCAweDFCQzAoNmYpLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMCwgMHhmOGYwZThlMH0sCS8qIDB4MzgwMChlMCksIDB4M0EwMChlOCksIDB4M0MwMChmMCksIDB4M0UwMChmOCksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQxLCAweDZmNzdkMGM4fSwJLyogMHgzMjAwKGM4KSwgMHgzNDAwKGQwKSwgMHgxREMwKDc3KSwgMHgxQkMwKDZmKSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KICNlbGlmIGRlZmluZWQoSFdfQkVBQ09OX09GRlNFVCkgJiYgKEhXX0JFQUNPTl9PRkZTRVQgPT0gMHgxMDApCi0Je0JDTl9PRkZTRVQwLAkJCTB4ZWNlOGU0ZTB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCi0Je0JDTl9PRkZTRVQxLAkJCTB4ZmNmOGY0ZjB9LCAvKiAweDM4MDAsIDB4M0EwMCwgMHgzQzAwLCAweDNFMDAsIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCisJe0JDTl9PRkZTRVQwLCAweGVjZThlNGUwfSwJLyogMHgzODAwLCAweDNBMDAsIDB4M0MwMCwgMHgzRTAwLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLworCXtCQ05fT0ZGU0VUMSwgMHhmY2Y4ZjRmMH0sCS8qIDB4MzgwMCwgMHgzQTAwLCAweDNDMDAsIDB4M0UwMCwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KICNlbHNlCi0gICAgI2Vycm9yIFlvdSBtdXN0IHJlLWNhbGN1bGF0ZSBuZXcgdmFsdWUgZm9yIEJDTl9PRkZTRVQwICYgQkNOX09GRlNFVDEgaW4gTUFDUmVnVGFibGVbXSEhIQotI2VuZGlmIC8vIEhXX0JFQUNPTl9PRkZTRVQgLy8KKyNlcnJvciBZb3UgbXVzdCByZS1jYWxjdWxhdGUgbmV3IHZhbHVlIGZvciBCQ05fT0ZGU0VUMCAmIEJDTl9PRkZTRVQxIGluIE1BQ1JlZ1RhYmxlW10hCisjZW5kaWYgLyogSFdfQkVBQ09OX09GRlNFVCAvLyAqLwogCi0Je0xFR0FDWV9CQVNJQ19SQVRFLAkJMHgwMDAwMDEzZn0sIC8vICBCYXNpYyByYXRlIHNldCBiaXRtYXAKLQl7SFRfQkFTSUNfUkFURSwJCTB4MDAwMDgwMDN9LCAvLyBCYXNpYyBIVCByYXRlIHNldCAsIDIwTSwgTUNTPTMsIE1NLiBGb3JtYXQgaXMgdGhlIHNhbWUgYXMgaW4gVFhXSS4KLQl7TUFDX1NZU19DVFJMLAkJMHgwMH0sIC8vIDB4MTAwNCwgLCBkZWZhdWx0IERpc2FibGUgUlgKLQl7UlhfRklMVFJfQ0ZHLAkJMHgxN2Y5N30sIC8vMHgxNDAwICAsIFJYIGZpbHRlciBjb250cm9sLAotCXtCS09GRl9TTE9UX0NGRywJMHgyMDl9LCAvLyBkZWZhdWx0IHNldCBzaG9ydCBzbG90IHRpbWUsIENDX0RFTEFZX1RJTUUgc2hvdWxkIGJlIDIKLQl7VFhfU1dfQ0ZHMCwJCTB4MH0sIAkJLy8gR2FyeSwyMDA4LTA1LTIxIGZvciBDV0MgdGVzdAotCXtUWF9TV19DRkcxLAkJMHg4MDYwNn0sIC8vIEdhcnksMjAwNi0wOC0yMwotCXtUWF9MSU5LX0NGRywJCTB4MTAyMH0sCQkvLyBHYXJ5LDIwMDYtMDgtMjMKLQl7VFhfVElNRU9VVF9DRkcsCTB4MDAwYTIwOTB9LAkvLyBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQgLCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAxCi0Je01BWF9MRU5fQ0ZHLAkJTUFYX0FHR1JFR0FUSU9OX1NJWkUgfCAweDAwMDAxMDAwfSwJLy8gMHgzMDE4LCBNQVggZnJhbWUgbGVuZ3RoLiBNYXggUFNEVSA9IDE2a2J5dGVzLgotCXtMRURfQ0ZHLAkJMHg3ZjAzMWU0Nn0sIC8vIEdhcnksIDIwMDYtMDgtMjMKLQl7UEJGX01BWF9QQ05ULAkJCTB4MUYzRkJGOUZ9LCAJLy8weDFGM2Y3ZjlmfSwJCS8vSmFuLCAyMDA2LzA0LzIwCi0Je1RYX1JUWV9DRkcsCQkJMHg0N2QwMWYwZn0sCS8vIEphbiwgMjAwNi8xMS8xNiwgU2V0IFR4V0ktPkFDSyA9MCBpbiBQcm9iZSBSc3AgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMwotCXtBVVRPX1JTUF9DRkcsCQkJMHgwMDAwMDAxM30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlcgotCXtDQ0tfUFJPVF9DRkcsCQkJMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMqL30sCS8vIEluaXRpYWwgQXV0b19SZXNwb25kZXIsIGJlY2F1c2UgUUEgd2lsbCB0dXJuIG9mZiBBdXRvLVJlc3BvbmRlci4gQW5kIFJUUyB0aHJlc2hvbGQgaXMgZW5hYmxlZC4KLQl7T0ZETV9QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgotLy9QUyBwYWNrZXRzIHVzZSBUeDFRIChmb3IgSENDQSkgd2hlbiBkZXF1ZXVlIGZyb20gUFMgdW5pY2FzdCBxdWV1ZSAoV2lGaSBXUEEyIE1BOV9EVDEgZm9yIE1hcnZlbGwgQiBTVEEpCi0jaWZkZWYgUlQyODcwCi0Je1BCRl9DRkcsIAkJCQkweGY0MDAwNn0sIAkJLy8gT25seSBlbmFibGUgUXVldWUgMgotCXtNTTQwX1BST1RfQ0ZHLAkJCTB4M0Y0NDA4NH0sCQkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIKLQl7V1BETUFfR0xPX0NGRywJCQkweDAwMDAwMDMwfSwKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQl7R0YyMF9QUk9UX0NGRywJCQkweDAxNzQ0MDA0fSwgICAgLy8gc2V0IDE5OjE4IC0tPiBTaG9ydCBOQVYgZm9yIE1JTU8gUFMKLQl7R0Y0MF9QUk9UX0NGRywJCQkweDAzRjQ0MDg0fSwKLQl7TU0yMF9QUk9UX0NGRywJCQkweDAxNzQ0MDA0fSwKLSNpZmRlZiBSVDI4NjAKLQl7TU00MF9QUk9UX0NGRywJCQkweDAzRjU0MDg0fSwKLSNlbmRpZgotCXtUWE9QX0NUUkxfQ0ZHLAkJCTB4MDAwMDU4M2YsIC8qMHgwMDAwMjQzZiovIC8qMHgwMDAwMjRiZiovfSwJLy9FeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLgotCXtUWF9SVFNfQ0ZHLAkJCTB4MDAwOTJiMjB9LAotCXtFWFBfQUNLX1RJTUUsCQkJMHgwMDI0MDBjYX0sCS8vIGRlZmF1bHQgdmFsdWUKLQl7VFhPUF9ITERSX0VULCAJCQkweDAwMDAwMDAyfSwKKwl7TEVHQUNZX0JBU0lDX1JBVEUsIDB4MDAwMDAxM2Z9LAkvKiAgQmFzaWMgcmF0ZSBzZXQgYml0bWFwICovCisJe0hUX0JBU0lDX1JBVEUsIDB4MDAwMDgwMDN9LAkvKiBCYXNpYyBIVCByYXRlIHNldCAsIDIwTSwgTUNTPTMsIE1NLiBGb3JtYXQgaXMgdGhlIHNhbWUgYXMgaW4gVFhXSS4gKi8KKwl7TUFDX1NZU19DVFJMLCAweDAwfSwJLyogMHgxMDA0LCAsIGRlZmF1bHQgRGlzYWJsZSBSWCAqLworCXtSWF9GSUxUUl9DRkcsIDB4MTdmOTd9LAkvKjB4MTQwMCAgLCBSWCBmaWx0ZXIgY29udHJvbCwgKi8KKwl7QktPRkZfU0xPVF9DRkcsIDB4MjA5fSwJLyogZGVmYXVsdCBzZXQgc2hvcnQgc2xvdCB0aW1lLCBDQ19ERUxBWV9USU1FIHNob3VsZCBiZSAyICovCisJLyp7VFhfU1dfQ0ZHMCwgICAgICAgICAgMHg0MGEwNn0sIC8vIEdhcnksMjAwNi0wOC0yMyAqLworCXtUWF9TV19DRkcwLCAweDB9LAkvKiBHYXJ5LDIwMDgtMDUtMjEgZm9yIENXQyB0ZXN0ICovCisJe1RYX1NXX0NGRzEsIDB4ODA2MDZ9LAkvKiBHYXJ5LDIwMDYtMDgtMjMgKi8KKwl7VFhfTElOS19DRkcsIDB4MTAyMH0sCS8qIEdhcnksMjAwNi0wOC0yMyAqLworCS8qe1RYX1RJTUVPVVRfQ0ZHLCAgICAgIDB4MDAxODIwOTB9LCAgICAvLyBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQgKi8KKwl7VFhfVElNRU9VVF9DRkcsIDB4MDAwYTIwOTB9LAkvKiBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQgLCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAxICovCisJe01BWF9MRU5fQ0ZHLCBNQVhfQUdHUkVHQVRJT05fU0laRSB8IDB4MDAwMDEwMDB9LAkvKiAweDMwMTgsIE1BWCBmcmFtZSBsZW5ndGguIE1heCBQU0RVID0gMTZrYnl0ZXMuICovCisJe0xFRF9DRkcsIDB4N2YwMzFlNDZ9LAkvKiBHYXJ5LCAyMDA2LTA4LTIzICovCisKKwl7UEJGX01BWF9QQ05ULCAweDFGM0ZCRjlGfSwJLyoweDFGM2Y3ZjlmfSwgICAgICAgICAgLy9KYW4sIDIwMDYvMDQvMjAgKi8KKworCXtUWF9SVFlfQ0ZHLCAweDQ3ZDAxZjBmfSwJLyogSmFuLCAyMDA2LzExLzE2LCBTZXQgVHhXSS0+QUNLID0wIGluIFByb2JlIFJzcCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAzICovCisKKwl7QVVUT19SU1BfQ0ZHLCAweDAwMDAwMDEzfSwJLyogSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyICovCisJe0NDS19QUk9UX0NGRywgMHgwNTc0MDAwMyAvKjB4MDE3NDAwMDMgKi8gfSwJLyogSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLiAqLworCXtPRkRNX1BST1RfQ0ZHLCAweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyAqLyB9LAkvKiBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJe1BCRl9DRkcsIDB4ZjQwMDA2fSwJLyogT25seSBlbmFibGUgUXVldWUgMiAqLworCXtNTTQwX1BST1RfQ0ZHLCAweDNGNDQwODR9LAkvKiBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIgKi8KKwl7V1BETUFfR0xPX0NGRywgMHgwMDAwMDAzMH0sCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJe0dGMjBfUFJPVF9DRkcsIDB4MDE3NDQwMDR9LAkvKiBzZXQgMTk6MTggLS0+IFNob3J0IE5BViBmb3IgTUlNTyBQUyAqLworCXtHRjQwX1BST1RfQ0ZHLCAweDAzRjQ0MDg0fSwKKwl7TU0yMF9QUk9UX0NGRywgMHgwMTc0NDAwNH0sCisjaWZkZWYgUlRNUF9NQUNfUENJCisJe01NNDBfUFJPVF9DRkcsIDB4MDNGNTQwODR9LAorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCXtUWE9QX0NUUkxfQ0ZHLCAweDAwMDA1ODNmLCAvKjB4MDAwMDI0M2YgKi8vKjB4MDAwMDI0YmYgKi8gfSwJLypFeHRlbnNpb24gY2hhbm5lbCBiYWNrb2ZmLiAqLworCXtUWF9SVFNfQ0ZHLCAweDAwMDkyYjIwfSwKKwl7RVhQX0FDS19USU1FLCAweDAwMjQwMGNhfSwJLyogZGVmYXVsdCB2YWx1ZSAqLworCisJe1RYT1BfSExEUl9FVCwgMHgwMDAwMDAwMn0sCiAKIAkvKiBKZXJyeSBjb21tZW50cyAyMDA4LzAxLzE2OiB3ZSB1c2UgU0lGUyA9IDEwdXMgaW4gQ0NLIGRlZmF1bHRseSwgYnV0IGl0IHNlZW1zIHRoYXQgMTB1cwotCQlpcyB0b28gc21hbGwgZm9yIElOVEVMIDIyMDBiZyBjYXJkLCBzbyBpbiBNQlNTIG1vZGUsIHRoZSBkZWx0YSB0aW1lIGJldHdlZW4gYmVhY29uMAotCQlhbmQgYmVhY29uMSBpcyBTSUZTICgxMHVzKSwgc28gaWYgSU5URUwgMjIwMGJnIGNhcmQgY29ubmVjdHMgdG8gQlNTMCwgdGhlIHBpbmcKLQkJd2lsbCBhbHdheXMgbG9zdC4gU28gd2UgY2hhbmdlIHRoZSBTSUZTIG9mIENDSyBmcm9tIDEwdXMgdG8gMTZ1cy4gKi8KLQl7WElGU19USU1FX0NGRywJCQkweDMzYTQxMDEwfSwKLQl7UFdSX1BJTl9DRkcsCQkJMHgwMDAwMDAwM30sCS8vIHBhdGNoIGZvciAyODgwLUUKKwkgICBpcyB0b28gc21hbGwgZm9yIElOVEVMIDIyMDBiZyBjYXJkLCBzbyBpbiBNQlNTIG1vZGUsIHRoZSBkZWx0YSB0aW1lIGJldHdlZW4gYmVhY29uMAorCSAgIGFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZworCSAgIHdpbGwgYWx3YXlzIGxvc3QuIFNvIHdlIGNoYW5nZSB0aGUgU0lGUyBvZiBDQ0sgZnJvbSAxMHVzIHRvIDE2dXMuICovCisJe1hJRlNfVElNRV9DRkcsIDB4MzNhNDEwMTB9LAorCXtQV1JfUElOX0NGRywgMHgwMDAwMDAwM30sCS8qIHBhdGNoIGZvciAyODgwLUUgKi8KIH07CiAKLVJUTVBfUkVHX1BBSVIJU1RBTUFDUmVnVGFibGVbXSA9CXsKLQl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDIyNzN9LAotCXtXTU1fQ1dNSU5fQ0ZHLAkweDAwMDAyMzQ0fSwKLQl7V01NX0NXTUFYX0NGRywJMHgwMDAwMzRhYX0sCitzdHJ1Y3QgcnRfcnRtcF9yZWdfcGFpciBTVEFNQUNSZWdUYWJsZVtdID0geworCXtXTU1fQUlGU05fQ0ZHLCAweDAwMDAyMjczfSwKKwl7V01NX0NXTUlOX0NGRywgMHgwMDAwMjM0NH0sCisJe1dNTV9DV01BWF9DRkcsIDB4MDAwMDM0YWF9LAogfTsKIAotI2RlZmluZQlOVU1fTUFDX1JFR19QQVJNUwkJKHNpemVvZihNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCi0jZGVmaW5lCU5VTV9TVEFfTUFDX1JFR19QQVJNUwkoc2l6ZW9mKFNUQU1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKLQotI2lmZGVmIFJUMjg3MAotLy8KLS8vIFJUMjg3MCBGaXJtd2FyZSBTcGVjIG9ubHkgdXNlZCAxIG9jdCBmb3IgdmVyc2lvbiBleHByZXNzaW9uCi0vLwotI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCTcKLQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0vLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCi0jZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKLSNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKFVDSEFSKSkKLSNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkwCi0KLSNkZWZpbmUgRklSTVdBUkVJTUFHRVYxX0xFTkdUSAkweDEwMDAKLSNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkweDEwMDAKLQotI2lmZGVmIFJUMjg2MAotI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCTIKLSNlbmRpZgotCisjZGVmaW5lCU5VTV9NQUNfUkVHX1BBUk1TCQkoc2l6ZW9mKE1BQ1JlZ1RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9yZWdfcGFpcikpCisjZGVmaW5lCU5VTV9TVEFfTUFDX1JFR19QQVJNUwkoc2l6ZW9mKFNUQU1BQ1JlZ1RhYmxlKSAvIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9yZWdfcGFpcikpCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBbGxvY2F0ZSBSVE1QX0FEQVBURVIgZGF0YSBibG9jayBhbmQgZG8gc29tZSBpbml0aWFsaXphdGlvbgorCQlBbGxvY2F0ZSBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIGRhdGEgYmxvY2sgYW5kIGRvIHNvbWUgaW5pdGlhbGl6YXRpb24KIAogCUFyZ3VtZW50czoKIAkJQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgpAQCAtMjEzLDQ4ICsxNTIsNDggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTCVJUTVBBbGxvY0FkYXB0ZXJCbG9jaygKLQlJTiAgUFZPSUQJaGFuZGxlLAotCU9VVAlQUlRNUF9BREFQVEVSCSpwcEFkYXB0ZXIpCitpbnQgUlRNUEFsbG9jQWRhcHRlckJsb2NrKHZvaWQgKmhhbmRsZSwKKwkJCQkgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiAqIHBwQWRhcHRlcikKIHsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlORElTX1NUQVRVUwkJU3RhdHVzOwotCUlOVCAJCQlpbmRleDsKLQlVQ0hBUgkJCSpwQmVhY29uQnVmID0gTlVMTDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJaW50IFN0YXR1czsKKwlpbnQgaW5kZXg7CisJdTggKnBCZWFjb25CdWYgPSBOVUxMOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOwogCiAJKnBwQWRhcHRlciA9IE5VTEw7CiAKLQlkbwotCXsKLQkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jaworCWRvIHsKKwkJLyogQWxsb2NhdGUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBtZW1vcnkgYmxvY2sgKi8KIAkJcEJlYWNvbkJ1ZiA9IGttYWxsb2MoTUFYX0JFQUNPTl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCWlmIChwQmVhY29uQnVmID09IE5VTEwpCi0JCXsKKwkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkgewogCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7CiAJCQlicmVhazsKIAkJfQorCQlOZGlzWmVyb01lbW9yeShwQmVhY29uQnVmLCBNQVhfQkVBQ09OX1NJWkUpOwogCi0JCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7Ci0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJeworCQlTdGF0dXMgPSBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeShoYW5kbGUsICh2b2lkICoqKSAmIHBBZCk7CisJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgewogCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKIAkJCWJyZWFrOwogCQl9CiAJCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKLQkJcHJpbnRrKCJcblxuPT09IHBBZCA9ICVwLCBzaXplID0gJWQgPT09XG5cbiIsIHBBZCwgKFVJTlQzMilzaXplb2YoUlRNUF9BREFQVEVSKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJCSAoIj09PSBwQWQgPSAlcCwgc2l6ZSA9ICVkID09PVxuIiwgcEFkLAorCQkJICAodTMyKXNpemVvZihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyKSkpOwogCi0KLQkJLy8gSW5pdCBzcGluIGxvY2tzCisJCS8qIEluaXQgc3BpbiBsb2NrcyAqLwogCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQogCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLSNlbmRpZgorI2lmZGVmIFJUMzA5MAorCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NY3VDbWRMb2NrKTsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKLQkJeworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykgewogCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOwogCQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+RGVRdWV1ZUxvY2tbaW5kZXhdKTsKIAkJCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7CkBAIC0yOTEsNTE4ICsyMzAsMTk5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUTVBSZWFkVHhQd3JQZXJSYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QUmVhZFR4UHdyUGVyUmF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUxPTkcJCWRhdGEsIEFkYXRhLCBHZGF0YTsKLQlVU0hPUlQJCWksIHZhbHVlLCB2YWx1ZTI7Ci0JSU5UCQkJQXB3cmRlbHRhLCBHcHdyZGVsdGE7Ci0JVUNIQVIJCXQxLHQyLHQzLHQ0OwotCUJPT0xFQU4JCWJWYWxpZCwgYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKKwl1bnNpZ25lZCBsb25nIGRhdGEsIEFkYXRhLCBHZGF0YTsKKwl1MTYgaSwgdmFsdWUsIHZhbHVlMjsKKwlpbnQgQXB3cmRlbHRhLCBHcHdyZGVsdGE7CisJdTggdDEsIHQyLCB0MywgdDQ7CisJQk9PTEVBTiBiQXB3cmRlbHRhTWludXMgPSBUUlVFLCBiR3B3cmRlbHRhTWludXMgPSBUUlVFOwogCi0JLy8KLQkvLyBHZXQgcG93ZXIgZGVsdGEgZm9yIDIwTUh6IGFuZCA0ME1Iei4KLQkvLworCS8qICovCisJLyogR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouICovCisJLyogKi8KIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7CiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKIAlBcHdyZGVsdGEgPSAwOwogCUdwd3JkZWx0YSA9IDA7CiAKLQlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCi0JeworCWlmICgodmFsdWUyICYgMHhmZikgIT0gMHhmZikgewogCQlpZiAoKHZhbHVlMiAmIDB4ODApKQotCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOworCQkJR3B3cmRlbHRhID0gKHZhbHVlMiAmIDB4Zik7CiAKIAkJaWYgKCh2YWx1ZTIgJiAweDQwKSkKIAkJCWJHcHdyZGVsdGFNaW51cyA9IEZBTFNFOwogCQllbHNlCiAJCQliR3B3cmRlbHRhTWludXMgPSBUUlVFOwogCX0KLQlpZiAoKHZhbHVlMiAmIDB4ZmYwMCkgIT0gMHhmZjAwKQotCXsKKwlpZiAoKHZhbHVlMiAmIDB4ZmYwMCkgIT0gMHhmZjAwKSB7CiAJCWlmICgodmFsdWUyICYgMHg4MDAwKSkKLQkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7CisJCQlBcHdyZGVsdGEgPSAoKHZhbHVlMiAmIDB4ZjAwKSA+PiA4KTsKIAogCQlpZiAoKHZhbHVlMiAmIDB4NDAwMCkpCiAJCQliQXB3cmRlbHRhTWludXMgPSBGQUxTRTsKIAkJZWxzZQogCQkJYkFwd3JkZWx0YU1pbnVzID0gVFJVRTsKIAl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR3B3cmRlbHRhID0gJXgsIEFwd3JkZWx0YSA9ICV4IC5cbiIsIEdwd3JkZWx0YSwgQXB3cmRlbHRhKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOwogCi0JLy8KLQkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgotCS8vCi0JZm9yIChpPTA7IGk8NTsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOworCS8qICovCisJLyogR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgMjBNSHogaW4gMi40Ry4gKi8KKwkvKiAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLAorCQkJCSAgICAgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpICogNCwKKwkJCQkgICAgIHZhbHVlKTsKIAkJZGF0YSA9IHZhbHVlOwotCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOworCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKSB7CisJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgKyAoQXB3cmRlbHRhKTsKIAkJCWlmICh0MSA+IDB4ZikKIAkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7CisJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQyID4gMHhmKQogCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7CisJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgKyAoQXB3cmRlbHRhKTsKIAkJCWlmICh0MyA+IDB4ZikKIAkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7CisJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQ0ID4gMHhmKQogCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7CisJCX0gZWxzZSB7CisJCQlpZiAoKHZhbHVlICYgMHhmKSA+IEFwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMCkgPj4gNCkgPiBBcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMCkgPj4gOCkgPiBBcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpIC0gKEFwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpID4gQXB3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpIC0gKEFwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDQgPSAwOwogCQl9Ci0JCUFkYXRhID0gdDEgKyAodDI8PDQpICsgKHQzPDw4KSArICh0NDw8MTIpOwotCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOworCQlBZGF0YSA9IHQxICsgKHQyIDw8IDQpICsgKHQzIDw8IDgpICsgKHQ0IDw8IDEyKTsKKwkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkgeworCQkJdDEgPSAodmFsdWUgJiAweGYpICsgKEdwd3JkZWx0YSk7CiAJCQlpZiAodDEgPiAweGYpCiAJCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOworCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MiA+IDB4ZikKIAkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOworCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpICsgKEdwd3JkZWx0YSk7CiAJCQlpZiAodDMgPiAweGYpCiAJCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOworCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0NCA+IDB4ZikKIAkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOworCQl9IGVsc2UgeworCQkJaWYgKCh2YWx1ZSAmIDB4ZikgPiBHcHdyZGVsdGEpCisJCQkJdDEgPSAodmFsdWUgJiAweGYpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjApID4+IDQpID4gR3B3cmRlbHRhKQorCQkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDApID4+IDgpID4gR3B3cmRlbHRhKQorCQkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSAtIChHcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQzID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShHcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMDApID4+IDEyKSA+IEdwd3JkZWx0YSkKKwkJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSAtIChHcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQ0ID0gMDsKIAkJfQotCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKKwkJR2RhdGEgPSB0MSArICh0MiA8PCA0KSArICh0MyA8PCA4KSArICh0NCA8PCAxMik7CiAKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKLQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJewotCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLAorCQkJCSAgICAgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcgKyBpICogNCArCisJCQkJICAgICAyLCB2YWx1ZSk7CisJCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpIHsKKwkJCXQxID0gKHZhbHVlICYgMHhmKSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQxID4gMHhmKQogCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKKwkJCXQyID0gKCh2YWx1ZSAmIDB4ZjApID4+IDQpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDIgPiAweGYpCiAJCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKKwkJCXQzID0gKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSArIChBcHdyZGVsdGEpOwogCQkJaWYgKHQzID4gMHhmKQogCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKKwkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpICsgKEFwd3JkZWx0YSk7CiAJCQlpZiAodDQgPiAweGYpCiAJCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgodmFsdWUgJiAweGYpID4gQXB3cmRlbHRhKQorCQkJCXQxID0gKHZhbHVlICYgMHhmKSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShBcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwKSA+PiA0KSA+IEFwd3JkZWx0YSkKKwkJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSAtIChBcHdyZGVsdGEpOwogCQkJZWxzZQogCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBBcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwKSA+PiA4KSA+IEFwd3JkZWx0YSkKKwkJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgPiBBcHdyZGVsdGEpCisJCQkJdDQgPSAoKHZhbHVlICYgMHhmMDAwKSA+PiAxMikgLSAoQXB3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0NCA9IDA7CiAJCX0KLQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQkJaWYgKGJHcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJewotCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKKwkJQWRhdGEgfD0gKCh0MSA8PCAxNikgKyAodDIgPDwgMjApICsgKHQzIDw8IDI0KSArICh0NCA8PCAyOCkpOworCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKSB7CisJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MSA+IDB4ZikKIAkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7CisJCQl0MiA9ICgodmFsdWUgJiAweGYwKSA+PiA0KSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQyID4gMHhmKQogCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7CisJCQl0MyA9ICgodmFsdWUgJiAweGYwMCkgPj4gOCkgKyAoR3B3cmRlbHRhKTsKIAkJCWlmICh0MyA+IDB4ZikKIAkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7CisJCQl0NCA9ICgodmFsdWUgJiAweGYwMDApID4+IDEyKSArIChHcHdyZGVsdGEpOwogCQkJaWYgKHQ0ID4gMHhmKQogCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7CisJCX0gZWxzZSB7CisJCQlpZiAoKHZhbHVlICYgMHhmKSA+IEdwd3JkZWx0YSkKKwkJCQl0MSA9ICh2YWx1ZSAmIDB4ZikgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBHcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKKwkJCWlmICgoKHZhbHVlICYgMHhmMCkgPj4gNCkgPiBHcHdyZGVsdGEpCisJCQkJdDIgPSAoKHZhbHVlICYgMHhmMCkgPj4gNCkgLSAoR3B3cmRlbHRhKTsKIAkJCWVsc2UKIAkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOworCQkJaWYgKCgodmFsdWUgJiAweGYwMCkgPj4gOCkgPiBHcHdyZGVsdGEpCisJCQkJdDMgPSAoKHZhbHVlICYgMHhmMDApID4+IDgpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7CisJCQlpZiAoKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpID4gR3B3cmRlbHRhKQorCQkJCXQ0ID0gKCh2YWx1ZSAmIDB4ZjAwMCkgPj4gMTIpIC0gKEdwd3JkZWx0YSk7CiAJCQllbHNlCiAJCQkJdDQgPSAwOwogCQl9Ci0JCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7Ci0JCWRhdGEgfD0gKHZhbHVlPDwxNik7CisJCUdkYXRhIHw9ICgodDEgPDwgMTYpICsgKHQyIDw8IDIwKSArICh0MyA8PCAyNCkgKyAodDQgPDwgMjgpKTsKKwkJZGF0YSB8PSAodmFsdWUgPDwgMTYpOwogCi0JCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOwotCQlwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gPSBHZGF0YTsKKwkJLyogRm9yIDIwTS80ME0gUG93ZXIgRGVsdGEgaXNzdWUgKi8KKwkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gZGF0YTsKKwkJcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldID0gZGF0YTsKKwkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7CisJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOwogCiAJCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7Ci0JfQotCi0JLy8KLQkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiAyLjRHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCi0JLy8KLQliVmFsaWQgPSBUUlVFOwotCWZvciAoaT0wOyBpPDY7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzJfNEcgKyAyICsgaSoyLCB2YWx1ZSk7Ci0JCWlmICgoKHZhbHVlICYgMHgwMEZGKSA9PSAweDAwRkYpIHx8ICgodmFsdWUgJiAweEZGMDApID09IDB4RkYwMCkpCi0JCXsKLQkJCWJWYWxpZCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIEdldCBUeHBvd2VyIHBlciBNQ1MgZm9yIDQwTUh6IGluIDIuNEcuCi0JLy8KLQlpZiAoYlZhbGlkKQotCXsKLQkJZm9yIChpPTA7IGk8NDsgaSsrKQotCQl7Ci0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHICsgaSo0LCB2YWx1ZSk7Ci0JCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gR3B3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlHZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKLQotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKLQkJCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJdDEgPSAodmFsdWUmMHhmKSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDEgPiAweGYpCi0JCQkJCXQxID0gMHhmOwotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQyID4gMHhmKQotCQkJCQl0MiA9IDB4ZjsKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoR3B3cmRlbHRhKTsKLQkJCQlpZiAodDMgPiAweGYpCi0JCQkJCXQzID0gMHhmOwotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEdwd3JkZWx0YSk7Ci0JCQkJaWYgKHQ0ID4gMHhmKQotCQkJCQl0NCA9IDB4ZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHZhbHVlJjB4ZikgPiBHcHdyZGVsdGEpCi0JCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MSA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQotCQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDIgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShHcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDMgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEdwd3JkZWx0YSkKLQkJCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQ0ID0gMDsKLQkJCX0KLQkJCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7Ci0KLQkJCWlmIChpID09IDApCi0JCQkJcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gPSAocEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2krMV0gJiAweDAwMDBGRkZGKSB8IChHZGF0YSAmIDB4RkZGRjAwMDApOwotCQkJZWxzZQotCQkJCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpKzFdID0gR2RhdGE7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCI0ME1IeiBCVywgMi40RyBiYW5kLCBHZGF0YSA9ICVseCBcbiIsIEdkYXRhKSk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIENoZWNrIHRoaXMgYmxvY2sgaXMgdmFsaWQgZm9yIDIwTUh6IGluIDVHLiBJZiBpbnZhbGlkLCB1c2UgcGFyYW1ldGVyIGZvciAyME1IeiBpbiAyLjRHCi0JLy8KLQliVmFsaWQgPSBUUlVFOwotCWZvciAoaT0wOyBpPDg7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgMiArIGkqMiwgdmFsdWUpOwotCQlpZiAoKCh2YWx1ZSAmIDB4MDBGRikgPT0gMHgwMEZGKSB8fCAoKHZhbHVlICYgMHhGRjAwKSA9PSAweEZGMDApKQotCQl7Ci0JCQliVmFsaWQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiA1Ry4KLQkvLwotCWlmIChiVmFsaWQpCi0JewotCQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JCXsKLQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHICsgaSo0LCB2YWx1ZSk7Ci0JCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlBZGF0YSA9IHQxICsgKHQyPDw0KSArICh0Mzw8OCkgKyAodDQ8PDEyKTsKLQotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfNUcgKyBpKjQgKyAyLCB2YWx1ZSk7Ci0JCQlpZiAoYkFwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQkJewotCQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQxID4gMHhmKQotCQkJCQl0MSA9IDB4ZjsKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MiA+IDB4ZikKLQkJCQkJdDIgPSAweGY7Ci0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQkJaWYgKHQzID4gMHhmKQotCQkJCQl0MyA9IDB4ZjsKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0NCA+IDB4ZikKLQkJCQkJdDQgPSAweGY7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCQl0MSA9ICh2YWx1ZSYweGYpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDEgPSAwOwotCQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQyID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQzID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0NCA9IDA7Ci0JCQl9Ci0JCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCi0JCQlpZiAoaSA9PSAwKQotCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IChwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbaV0gJiAweDAwMDBGRkZGKSB8IChBZGF0YSAmIDB4RkZGRjAwMDApOwotCQkJZWxzZQotCQkJCXBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSA9IEFkYXRhOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDVHSHogYmFuZCwgQWRhdGEgPSAlbHggXG4iLCBBZGF0YSkpOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBDaGVjayB0aGlzIGJsb2NrIGlzIHZhbGlkIGZvciA0ME1IeiBpbiA1Ry4gSWYgaW52YWxpZCwgdXNlIHBhcmFtZXRlciBmb3IgMjBNSHogaW4gMi40RwotCS8vCi0JYlZhbGlkID0gVFJVRTsKLQlmb3IgKGk9MDsgaTw2OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIDIgKyBpKjIsIHZhbHVlKTsKLQkJaWYgKCgodmFsdWUgJiAweDAwRkYpID09IDB4MDBGRikgfHwgKCh2YWx1ZSAmIDB4RkYwMCkgPT0gMHhGRjAwKSkKLQkJewotCQkJYlZhbGlkID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8vCi0JLy8gR2V0IFR4cG93ZXIgcGVyIE1DUyBmb3IgNDBNSHogaW4gNUcuCi0JLy8KLQlpZiAoYlZhbGlkKQotCXsKLQkJZm9yIChpPTA7IGk8NDsgaSsrKQotCQl7Ci0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl81RyArIGkqNCwgdmFsdWUpOwotCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJCXsKLQkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MSA+IDB4ZikKLQkJCQkJdDEgPSAweGY7Ci0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDIgPiAweGYpCi0JCQkJCXQyID0gMHhmOwotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MyA+IDB4ZikKLQkJCQkJdDMgPSAweGY7Ci0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDQgPiAweGYpCi0JCQkJCXQ0ID0gMHhmOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKLQkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQxID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCi0JCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MiA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MyA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQotCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDQgPSAwOwotCQkJfQotCQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7Ci0KLQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHICsgaSo0ICsgMiwgdmFsdWUpOwotCQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJCXsKLQkJCQl0MSA9ICh2YWx1ZSYweGYpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MSA+IDB4ZikKLQkJCQkJdDEgPSAweGY7Ci0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDIgPiAweGYpCi0JCQkJCXQyID0gMHhmOwotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhBcHdyZGVsdGEpOwotCQkJCWlmICh0MyA+IDB4ZikKLQkJCQkJdDMgPSAweGY7Ci0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoQXB3cmRlbHRhKTsKLQkJCQlpZiAodDQgPiAweGYpCi0JCQkJCXQ0ID0gMHhmOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICgodmFsdWUmMHhmKSA+IEFwd3JkZWx0YSkKLQkJCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKLQkJCQllbHNlCi0JCQkJCXQxID0gMDsKLQkJCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCi0JCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MiA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEFwd3JkZWx0YSk7Ci0JCQkJZWxzZQotCQkJCQl0MyA9IDA7Ci0JCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gQXB3cmRlbHRhKQotCQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOwotCQkJCWVsc2UKLQkJCQkJdDQgPSAwOwotCQkJfQotCQkJQWRhdGEgfD0gKCh0MTw8MTYpICsgKHQyPDwyMCkgKyAodDM8PDI0KSArICh0NDw8MjgpKTsKLQotCQkJaWYgKGkgPT0gMCkKLQkJCQlwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSA9IChwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaSsxXSAmIDB4MDAwMEZGRkYpIHwgKEFkYXRhICYgMHhGRkZGMDAwMCk7Ci0JCQllbHNlCi0JCQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2krMV0gPSBBZGF0YTsKLQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjQwTUh6IEJXLCA1R0h6IGJhbmQsIEFkYXRhID0gJWx4IFxuIiwgQWRhdGEpKTsKLQkJfQorCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSAqIDQsIGRhdGEpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkgICAgICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwKKwkJCSAgICAgIGRhdGEsIEFkYXRhLCBHZGF0YSkpOwogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04MjEsMjMgKzQ0MSwyMyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QUmVhZENoYW5uZWxQd3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUTVBSZWFkQ2hhbm5lbFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJCQkJaSwgY2hvZmZzZXQ7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXIyOworCXU4IGksIGNob2Zmc2V0OworCUVFUFJPTV9UWF9QV1JfU1RSVUMgUG93ZXI7CisJRUVQUk9NX1RYX1BXUl9TVFJVQyBQb3dlcjI7CiAKLQkvLyBSZWFkIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMKLQkvLyBWYWx1ZSBmcm9tIDEgLSAweDdmLiBEZWZhdWx0IHZhbHVlIGlzIDI0LgotCS8vIFBvd2VyIHZhbHVlIDogMi40RyAweDAwICgwKSB+IDB4MUYgKDMxKQotCS8vICAgICAgICAgICAgIDogNS41RyAweEY5ICgtNykgfiAweDBGICgxNSkKKwkvKiBSZWFkIFR4IHBvd2VyIHZhbHVlIGZvciBhbGwgY2hhbm5lbHMgKi8KKwkvKiBWYWx1ZSBmcm9tIDEgLSAweDdmLiBEZWZhdWx0IHZhbHVlIGlzIDI0LiAqLworCS8qIFBvd2VyIHZhbHVlIDogMi40RyAweDAwICgwKSB+IDB4MUYgKDMxKSAqLworCS8qICAgICAgICAgICAgIDogNS41RyAweEY5ICgtNykgfiAweDBGICgxNSkgKi8KIAotCS8vIDAuIDExYi9nLCBjaDEgLSBjaCAxNAotCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIud29yZCk7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0dfVFgyX1BXUl9PRkZTRVQgKyBpICogMiwgUG93ZXIyLndvcmQpOworCS8qIDAuIDExYi9nLCBjaDEgLSBjaCAxNCAqLworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWF9QV1JfT0ZGU0VUICsgaSAqIDIsCisJCQkJICAgICBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWDJfUFdSX09GRlNFVCArIGkgKiAyLAorCQkJCSAgICAgUG93ZXIyLndvcmQpOwogCQlwQWQtPlR4UG93ZXJbaSAqIDJdLkNoYW5uZWwgPSBpICogMiArIDE7CiAJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLkNoYW5uZWwgPSBpICogMiArIDI7CiAKQEAgLTg2MiwxMjUgKzQ4MiwxNDkgQEAKIAkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKIAl9CiAKLQkvLyAxLiBVLU5JSSBsb3dlci9taWRkbGUgYmFuZDogMzYsIDM4LCA0MDsgNDQsIDQ2LCA0ODsgNTIsIDU0LCA1NjsgNjAsIDYyLCA2NCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQotCS8vIDEuMSBGaWxsIHVwIGNoYW5uZWwKKwkvKiAxLiBVLU5JSSBsb3dlci9taWRkbGUgYmFuZDogMzYsIDM4LCA0MDsgNDQsIDQ2LCA0ODsgNTIsIDU0LCA1NjsgNjAsIDYyLCA2NCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KSAqLworCS8qIDEuMSBGaWxsIHVwIGNoYW5uZWwgKi8KIAljaG9mZnNldCA9IDE0OwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgMDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbCA9IDM2ICsgaSAqIDggKyAwOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbAk9IDM2ICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwgPSAzNiArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAzNiArIGkgKiA4ICsgNDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsID0gMzYgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAJfQogCi0JLy8gMS4yIEZpbGwgdXAgcG93ZXIKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyLndvcmQpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwkvKiAxLjIgRmlsbCB1cCBwb3dlciAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgaSAqIDIsCisJCQkJICAgICBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIGkgKiAyLAorCQkJCSAgICAgUG93ZXIyLndvcmQpOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUxOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUxOwogCX0KIAotCS8vIDIuIEhpcHBlckxBTiAyIDEwMCwgMTAyICwxMDQ7IDEwOCwgMTEwLCAxMTI7IDExNiwgMTE4LCAxMjA7IDEyNCwgMTI2LCAxMjg7IDEzMiwgMTM0LCAxMzY7IDE0MCAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQotCS8vIDIuMSBGaWxsIHVwIGNoYW5uZWwKKwkvKiAyLiBIaXBwZXJMQU4gMiAxMDAsIDEwMiAsMTA0OyAxMDgsIDExMCwgMTEyOyAxMTYsIDExOCwgMTIwOyAxMjQsIDEyNiwgMTI4OyAxMzIsIDEzNCwgMTM2OyAxNDAgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikgKi8KKwkvKiAyLjEgRmlsbCB1cCBjaGFubmVsICovCiAJY2hvZmZzZXQgPSAxNCArIDEyOwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwgPSAxMDAgKyBpICogOCArIDA7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwgPSAxMDAgKyBpICogOCArIDI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyA0OwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwgPSAxMDAgKyBpICogOCArIDQ7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMiA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAJfQotCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAkJPSAxNDA7Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsID0gMTQwOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCXBBZC0+VHhQb3dlclszICogNSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCS8vIDIuMiBGaWxsIHVwIHBvd2VyCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7CisJLyogMi4yIEZpbGwgdXAgcG93ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwKKwkJCQkgICAgIEVFUFJPTV9BX1RYX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKworCQkJCSAgICAgaSAqIDIsIFBvd2VyLndvcmQpOworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArCisJCQkJICAgICBpICogMiwgUG93ZXIyLndvcmQpOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKKwkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPQorCQkJICAgIFBvd2VyLmZpZWxkLkJ5dGUxOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUwOwogCiAJCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9CisJCQkgICAgUG93ZXIyLmZpZWxkLkJ5dGUxOwogCX0KIAotCS8vIDMuIFUtTklJIHVwcGVyIGJhbmQ6IDE0OSwgMTUxLCAxNTM7IDE1NywgMTU5LCAxNjE7IDE2NSAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KQotCS8vIDMuMSBGaWxsIHVwIGNoYW5uZWwKKwkvKiAzLiBVLU5JSSB1cHBlciBiYW5kOiAxNDksIDE1MSwgMTUzOyAxNTcsIDE1OSwgMTYxOyAxNjUsIDE2NywgMTY5OyAxNzEsIDE3MyAoaW5jbHVkaW5nIGNlbnRyYWwgZnJlcXVlbmN5IGluIEJXIDQwTUh6KSAqLworCS8qIDMuMSBGaWxsIHVwIGNoYW5uZWwgKi8KIAljaG9mZnNldCA9IDE0ICsgMTIgKyAxNjsKLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCXsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyAwOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCS8qZm9yIChpID0gMDsgaSA8IDI7IGkrKykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbCA9IDE0OSArIGkgKiA4ICsgMDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uQ2hhbm5lbCA9IDE0OSArIGkgKiA4ICsgMjsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDQ7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbCA9IDE0OSArIGkgKiA4ICsgNDsKKwkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAl9Ci0JcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE2NTsKLQlwQWQtPlR4UG93ZXJbMyAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwgPSAxNzE7CisJcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwogCi0JLy8gMy4yIEZpbGwgdXAgcG93ZXIKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyLndvcmQpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKKwlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwgPSAxNzM7CisJcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCisJLyogMy4yIEZpbGwgdXAgcG93ZXIgKi8KKwkvKmZvciAoaSA9IDA7IGkgPCA0OyBpKyspICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsCisJCQkJICAgICBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgKGNob2Zmc2V0IC0gMTQpICsKKwkJCQkgICAgIGkgKiAyLCBQb3dlci53b3JkKTsKKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLAorCQkJCSAgICAgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgKyAoY2hvZmZzZXQgLSAxNCkgKworCQkJCSAgICAgaSAqIDIsIFBvd2VyMi53b3JkKTsKIAogCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0KKwkJCSAgICBQb3dlci5maWVsZC5CeXRlMDsKIAogCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7CisJCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyID0KKwkJCSAgICBQb3dlci5maWVsZC5CeXRlMTsKIAogCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPQorCQkJICAgIFBvd2VyMi5maWVsZC5CeXRlMDsKIAogCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUxOworCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPQorCQkJICAgIFBvd2VyMi5maWVsZC5CeXRlMTsKIAl9CiAKLQkvLyA0LiBQcmludCBhbmQgRGVidWcKLQljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDc7CisJLyogNC4gUHJpbnQgYW5kIERlYnVnICovCisJLypjaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDc7ICovCisJY2hvZmZzZXQgPSAxNCArIDEyICsgMTYgKyAxMTsKKwogfQogCiAvKgpAQCAtMTAwNiwyNzggKzY1MCwxNCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMJTklDUmVhZFJlZ1BhcmFtZXRlcnMoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU5ESVNfSEFORExFCQkJV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0Ci0JKQoraW50IE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdm9pZCAqV3JhcHBlckNvbmZpZ3VyYXRpb25Db250ZXh0KQogewotCU5ESVNfU1RBVFVTCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAlEQkdQUklOVF9TKFN0YXR1cywgKCI8LS0gTklDUmVhZFJlZ1BhcmFtZXRlcnMsIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7CiAJcmV0dXJuIFN0YXR1czsKIH0KIAotCi0jaWZkZWYgUlQyODcwCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJUjU1eCA9IDAsIHZhbHVlLCBGaWx0ZXJUYXJnZXQgPSAweDFFLCBCQlBWYWx1ZT0wOwotCVVJTlQJbG9vcCA9IDAsIGNvdW50ID0gMCwgbG9vcGNudCA9IDAsIFJlVHJ5ID0gMDsKLQlVQ0hBUglSRl9SMjRfVmFsdWUgPSAwOwotCi0JLy8gR2l2ZSBiYnAgZmlsdGVyIGluaXRpYWwgdmFsdWUKLSNpZm5kZWYgUlQyODcwCi0JcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAweDE2OwotCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gMHgzNjsgIC8vQml0WzVdIG11c3QgYmUgMSBmb3IgQlcgNDAKLSNlbHNlCi0JcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAweDFGOwotCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gMHgyRjsgLy9CaXRbNV0gbXVzdCBiZSAxIGZvciBCVyA0MAotI2VuZGlmCi0JZG8KLQl7Ci0JCWlmIChsb29wID09IDEpCS8vQmFuZFdpZHRoID0gNDAgTUh6Ci0JCXsKLQkJCS8vIFdyaXRlIDB4MjcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSRl9SMjRfVmFsdWUgPSAweDI3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQkJaWYgKElTX1JUMzA5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTU7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxOTsKLQotCQkJLy8gd2hlbiBjYWxpYnJhdGUgQlc0MCwgQkJQIG1hc2sgbXVzdCBzZXQgdG8gQlc0MC4KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlfD0gKDB4MTApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotI2lmZGVmIFJUMjg3MAotCQkJLy8gc2V0IHRvIEJXNDAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgfD0gMHgyMDsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotI2VuZGlmCi0JCX0KLQkJZWxzZQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCXsKLQkJCS8vIFdyaXRlIDB4MDcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSRl9SMjRfVmFsdWUgPSAweDA3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQkJaWYgKElTX1JUMzA5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTM7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNjsKLSNpZmRlZiBSVDI4NzAKLQkJCS8vIHNldCB0byBCVzIwCi0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKLQkJCXZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKLSNlbmRpZgotCQl9Ci0KLQkJLy8gV3JpdGUgMHgwMSB0byBSRl9SMjIgdG8gZW5hYmxlIGJhc2ViYW5kIGxvb3BiYWNrIG1vZGUKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JCXZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JCS8vIFdyaXRlIDB4MDAgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2YgcGFzc2JhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAwKTsKLQotCQlkbwotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjU1LCAmdmFsdWUpOwotCQkJUjU1eCA9IHZhbHVlICYgMHhGRjsKLQotCQl9IHdoaWxlICgoUmVUcnkrKyA8IDEwMCkgJiYgKFI1NXggPT0gMCkpOwotCi0JCS8vIFdyaXRlIDB4MDYgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2Ygc3RvcGJhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAweDA2KTsKLQotCQl3aGlsZShUUlVFKQotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSAmPSAweEZGOwotCQkJaWYgKChSNTV4IC0gdmFsdWUpIDwgRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCX0KLQkJCWVsc2UgaWYgKChSNTV4IC0gdmFsdWUpID09IEZpbHRlclRhcmdldCkKLQkJCXsKLQkJCQlSRl9SMjRfVmFsdWUgKys7Ci0JCQkJY291bnQgKys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4KLQkJCWlmIChsb29wY250KysgPiAxMDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkKLQkJewotCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOwotCQl9Ci0KLQkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQotCQlpZiAobG9vcGNudCA8IDEwMCkKLQkJewotCQkJaWYgKGxvb3ArKyA9PSAwKQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQotCQkvLyByZXNldCBjb3VudAotCQljb3VudCA9IDA7Ci0JfSB3aGlsZShUUlVFKTsKLQotCS8vCi0JLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQotCS8vCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JdmFsdWUgJj0gfigweDAxKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKLQotCS8vIHNldCBCQlAgYmFjayB0byBCVzIwCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCUJCUFZhbHVlJj0gKH4weDE4KTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBDYWxpQlcyMFJmUjI0PTB4JXgsIENhbGlCVzQwUmZSMjQ9MHgleFxuIiwgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Ci19Ci0KLVZPSUQgTklDSW5pdFJUMzB4eFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVCBpOwotCS8vIERyaXZlciBtdXN0IHJlYWQgRUVQUk9NIHRvIGdldCBSZkljVHlwZSBiZWZvcmUgaW5pdGlhbCBSRiByZWdpc3RlcnMKLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwOwotCQlVSU5UMzIgZGF0YTsKLQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFBVQ0hBUikmUmZSZWcpOwotCQlSZlJlZyB8PSAweDgwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCVJmUmVnICY9IDB4N0Y7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVM7IGkrKykKLQkJewotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUlQzMHh4X1JGUmVnVGFibGVbaV0uUmVnaXN0ZXIsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlZhbHVlKTsKLQkJfQotCi0JCWlmIChJU19SVDMwNzAocEFkKSkKLQkJewotCQkJLy8gIFVwZGF0ZSBNQUMgMHgwNUQ0IGZyb20gMDF4eHh4eHggdG8gMER4eHh4eHggKHZvbHRhZ2UgMS4yViB0byAxLjM1VikgZm9yIFJUMzA3MCB0byBpbXByb3ZlIHlpZWxkIHJhdGUKLQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsICZkYXRhKTsKLQkJCWRhdGEgPSAoKGRhdGEgJiAweEYwRkZGRkZGKSB8IDB4MEQwMDAwMDApOwotCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwotCQl9Ci0JCWVsc2UgaWYgKElTX1JUMzA3MShwQWQpKQotCQl7Ci0JCQkvLyBEcml2ZXIgc2hvdWxkIHNldCBSRiBSNiBiaXQ2IG9uIGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJmUmVnKTsKLQkJCVJmUmVnIHw9IDB4NDA7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChVQ0hBUilSZlJlZyk7Ci0KLQkJCS8vIGluaXQgUjMxCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIDB4MTQpOwotCi0JCQkvLyBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpCi0JCQl7Ci0JCQkJLy8gcGF0Y2ggdHggRVZNIGlzc3VlIHRlbXBvcmFyaWx5Ci0JCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBMRE9fQ0ZHMCwgJmRhdGEpOwotCQkJCWRhdGEgPSAoKGRhdGEgJiAweEUwRkZGRkZGKSB8IDB4MEQwMDAwMDApOwotCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIExET19DRkcwLCBkYXRhKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmZGF0YSk7Ci0JCQkJZGF0YSA9ICgoZGF0YSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIGRhdGEpOwotCQkJfQotCi0JCQkvLyBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlCi0JCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7Ci0JCQlkYXRhICY9IH4oMHgyMCk7Ci0JCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7Ci0JCX0KLQotCQkvL0ZvciBSRiBmaWx0ZXIgQ2FsaWJyYXRpb24KLQkJUlRNUEZpbHRlckNhbGlicmF0aW9uKHBBZCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBSRiBSMjcgcmVnaXN0ZXIsIHNldCBSRiBSMjcgbXVzdCBiZSBiZWhpbmQgUlRNUEZpbHRlckNhbGlicmF0aW9uKCkKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAweDMpOwotCi0JCS8vIHNldCBsZWQgb3BlbiBkcmFpbiBlbmFibGUKLQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBPUFRfMTQsICZkYXRhKTsKLQkJZGF0YSB8PSAweDAxOwotCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBPUFRfMTQsIGRhdGEpOwotCi0JCWlmIChJU19SVDMwNzEocEFkKSkKLQkJewotCQkJLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0JCQlSVDMweHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKLQkJfQotCX0KLX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMjk2LDg4ICs2NzYsOTEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJbWFjX2FkZHIpCit2b2lkIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKm1hY19hZGRyKQogewotCVVJTlQzMgkJCWRhdGEgPSAwOwotCVVTSE9SVAkJCWksIHZhbHVlLCB2YWx1ZTI7Ci0JVUNIQVIJCQlUbXBQaHk7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7Ci0JRUVQUk9NX1ZFUlNJT05fU1RSVUMgICAgVmVyc2lvbjsKLQlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOwotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOworCXUzMiBkYXRhID0gMDsKKwl1MTYgaSwgdmFsdWUsIHZhbHVlMjsKKwl1OCBUbXBQaHk7CisJRUVQUk9NX1RYX1BXUl9TVFJVQyBQb3dlcjsKKwlFRVBST01fVkVSU0lPTl9TVFJVQyBWZXJzaW9uOworCUVFUFJPTV9BTlRFTk5BX1NUUlVDIEFudGVubmE7CisJRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDIE5pY0NvbmZpZzI7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnNcbiIpKTsKIAotCS8vIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04CisJaWYgKHBBZC0+Y2hpcE9wcy5lZWluaXQpCisJCXBBZC0+Y2hpcE9wcy5lZWluaXQocEFkKTsKKworCS8qIEluaXQgRUVQUk9NIEFkZHJlc3MgTnVtYmVyLCBiZWZvcmUgYWNjZXNzIEVFUFJPTTsgaWYgOTNjNDYsIEVFUFJPTUFkZHJlc3NOdW09NiwgZWxzZSBpZiA5M2M2NiwgRUVQUk9NQWRkcmVzc051bT04ICovCiAJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmZGF0YSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEUyUFJPTV9DU1IgPSAweCV4XG4iLCBkYXRhKSk7CiAKLQlpZigoZGF0YSAmIDB4MzApID09IDApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CQkvLyA5M0M0NgotCWVsc2UgaWYoKGRhdGEgJiAweDMwKSA9PSAweDEwKQotCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OyAgICAgLy8gOTNDNjYKKwlpZiAoKGRhdGEgJiAweDMwKSA9PSAwKQorCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA2OwkvKiA5M0M0NiAqLworCWVsc2UgaWYgKChkYXRhICYgMHgzMCkgPT0gMHgxMCkKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLyogOTNDNjYgKi8KIAllbHNlCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M4NgotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFRVBST01BZGRyZXNzTnVtID0gJWRcbiIsIHBBZC0+RUVQUk9NQWRkcmVzc051bSApKTsKKwkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLyogOTNDODYgKi8KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtKSk7CiAKLQkvLyBSVDI4NjAgTUFDIG5vIGxvbmdlciBhdXRvIGxvYWQgTUFDIGFkZHJlc3MgZnJvbSBFMlBST00uIERyaXZlciBoYXMgdG8gaW50aWFsaXplCi0JLy8gTUFDIGFkZHJlc3MgcmVnaXN0ZXJzIGFjY29yZGluZyB0byBFMlBST00gc2V0dGluZworCS8qIFJUMjg2MCBNQUMgbm8gbG9uZ2VyIGF1dG8gbG9hZCBNQUMgYWRkcmVzcyBmcm9tIEUyUFJPTS4gRHJpdmVyIGhhcyB0byBpbnRpYWxpemUgKi8KKwkvKiBNQUMgYWRkcmVzcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIEUyUFJPTSBzZXR0aW5nICovCiAJaWYgKG1hY19hZGRyID09IE5VTEwgfHwKLQkJc3RybGVuKG1hY19hZGRyKSAhPSAxNyB8fAotCQltYWNfYWRkclsyXSAhPSAnOicgIHx8IG1hY19hZGRyWzVdICE9ICc6JyAgfHwgbWFjX2FkZHJbOF0gIT0gJzonIHx8Ci0JCW1hY19hZGRyWzExXSAhPSAnOicgfHwgbWFjX2FkZHJbMTRdICE9ICc6JykKLQl7Ci0JCVVTSE9SVCAgQWRkcjAxLEFkZHIyMyxBZGRyNDUgOworCSAgICBzdHJsZW4oKGNoYXIgKiltYWNfYWRkcikgIT0gMTcgfHwKKwkgICAgbWFjX2FkZHJbMl0gIT0gJzonIHx8IG1hY19hZGRyWzVdICE9ICc6JyB8fCBtYWNfYWRkcls4XSAhPSAnOicgfHwKKwkgICAgbWFjX2FkZHJbMTFdICE9ICc6JyB8fCBtYWNfYWRkclsxNF0gIT0gJzonKSB7CisJCXUxNiBBZGRyMDEsIEFkZHIyMywgQWRkcjQ1OwogCiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgQWRkcjAxKTsKIAkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBBZGRyMjMpOwogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIEFkZHI0NSk7CiAKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gKFVDSEFSKShBZGRyMDEgJiAweGZmKTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdID0gKFVDSEFSKShBZGRyMDEgPj4gOCk7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSA9IChVQ0hBUikoQWRkcjIzICYgMHhmZik7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1szXSA9IChVQ0hBUikoQWRkcjIzID4+IDgpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0gPSAoVUNIQVIpKEFkZHI0NSAmIDB4ZmYpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSAoVUNIQVIpKEFkZHI0NSA+PiA4KTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gKHU4KShBZGRyMDEgJiAweGZmKTsKKwkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdID0gKHU4KShBZGRyMDEgPj4gOCk7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSA9ICh1OCkoQWRkcjIzICYgMHhmZik7CisJCXBBZC0+UGVybWFuZW50QWRkcmVzc1szXSA9ICh1OCkoQWRkcjIzID4+IDgpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0gPSAodTgpKEFkZHI0NSAmIDB4ZmYpOworCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSAodTgpKEFkZHI0NSA+PiA4KTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOwotCX0KLQllbHNlCi0JewotCQlJTlQJCWo7Ci0JCVBVQ0hBUgltYWNwdHI7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIEUyUFJPTSBcbiIpKTsKKwl9IGVsc2UgeworCQlpbnQgajsKKwkJY2hhciAqbWFjcHRyOwogCi0JCW1hY3B0ciA9IG1hY19hZGRyOworCQltYWNwdHIgPSAoY2hhciAqKW1hY19hZGRyOwogCi0JCWZvciAoaj0wOyBqPE1BQ19BRERSX0xFTjsgaisrKQotCQl7CisJCWZvciAoaiA9IDA7IGogPCBNQUNfQUREUl9MRU47IGorKykgewogCQkJQXRvSChtYWNwdHIsICZwQWQtPlBlcm1hbmVudEFkZHJlc3Nbal0sIDEpOwotCQkJbWFjcHRyPW1hY3B0ciszOworCQkJbWFjcHRyID0gbWFjcHRyICsgMzsKIAkJfQogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkluaXRpYWxpemUgTUFDIEFkZHJlc3MgZnJvbSBtb2R1bGUgcGFyYW1ldGVyIFxuIikpOwogCX0KIAotCiAJewotCQkvL21vcmUgY29udmVuaW5ldCB0byB0ZXN0IG1ic3NpZCwgc28gYXAncyBic3NpZCAmMHhmMQorCQkvKm1vcmUgY29udmVuaW5ldCB0byB0ZXN0IG1ic3NpZCwgc28gYXAncyBic3NpZCAmMHhmMSAqLwogCQlpZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID09IDB4ZmYpCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKKwkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSAmIDB4Zjg7CiAKLQkJLy9pZiAocEFkLT5QZXJtYW5lbnRBZGRyZXNzWzVdID09IDB4ZmYpCi0JCS8vCXBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OworCQkvKmlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPT0gMHhmZikgKi8KKwkJLyogICAgICBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsgKi8KIAotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAotCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKLQkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCi0JCXsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJICAgICAoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1swXSwKKwkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKKwkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwKKwkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKKwkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1s0XSwKKwkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQlpZiAocEFkLT5iTG9jYWxBZG1pbk1BQyA9PSBGQUxTRSkgewogCQkJTUFDX0RXMF9TVFJVQyBjc3IyOwogCQkJTUFDX0RXMV9TVFJVQyBjc3IzOwotCQkJQ09QWV9NQUNfQUREUihwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPlBlcm1hbmVudEFkZHJlc3MpOworCQkJQ09QWV9NQUNfQUREUihwQWQtPkN1cnJlbnRBZGRyZXNzLAorCQkJCSAgICAgIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7CiAJCQljc3IyLmZpZWxkLkJ5dGUwID0gcEFkLT5DdXJyZW50QWRkcmVzc1swXTsKIAkJCWNzcjIuZmllbGQuQnl0ZTEgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzFdOwogCQkJY3NyMi5maWVsZC5CeXRlMiA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMl07CkBAIC0xMzg4LDExOCArNzcxLDExNiBAQAogCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07CiAJCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKLQkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMl0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1szXSwKLQkJCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJICAgICAgUFJJTlRfTUFDKHBBZC0+UGVybWFuZW50QWRkcmVzcykpKTsKIAkJfQogCX0KIAotCS8vIGlmIG5vdCByZXR1cm4gZWFybHkuIGNhdXNlIGZhaWwgYXQgZW11bGF0aW9uLgotCS8vIEluaXQgdGhlIGNoYW5uZWwgbnVtYmVyIGZvciBUWCBjaGFubmVsIHBvd2VyCisJLyogaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uICovCisJLyogSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIgKi8KIAlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKIAotCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAotCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCisJLyogaWYgRTJQUk9NIHZlcnNpb24gbWlzbWF0Y2ggd2l0aCBkcml2ZXIncyBleHBlY3RhdGlvbiwgdGhlbiBza2lwICovCisJLyogYWxsIHN1YnNlcXVlbnQgRTJSUE9NIHJldGlldmFsIGFuZCBzZXQgYSBzeXN0ZW0gZXJyb3IgYml0IHRvIG5vdGlmeSBHVUkgKi8KIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9WRVJTSU9OX09GRlNFVCwgVmVyc2lvbi53b3JkKTsKLQlwQWQtPkVlcHJvbVZlcnNpb24gPSBWZXJzaW9uLmZpZWxkLlZlcnNpb24gKyBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIgKiAyNTY7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRTJQUk9NOiBWZXJzaW9uID0gJWQsIEZBRSByZWxlYXNlICMlZFxuIiwgVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIpKTsKKwlwQWQtPkVlcHJvbVZlcnNpb24gPQorCSAgICBWZXJzaW9uLmZpZWxkLlZlcnNpb24gKyBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIgKiAyNTY7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsCisJCSAgVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWZXJzaW9uLmZpZWxkLkZhZVJlbGVhc2VOdW1iZXIpKTsKIAotCWlmIChWZXJzaW9uLmZpZWxkLlZlcnNpb24gPiBWQUxJRF9FRVBST01fVkVSU0lPTikKLQl7Ci0JCURCR1BSSU5UX0VSUigoIkUyUFJPTTogV1JPTkcgVkVSU0lPTiAweCV4LCBzaG91bGQgYmUgJWRcbiIsVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWQUxJRF9FRVBST01fVkVSU0lPTikpOworCWlmIChWZXJzaW9uLmZpZWxkLlZlcnNpb24gPiBWQUxJRF9FRVBST01fVkVSU0lPTikgeworCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLAorCQkJICAgICAgVmVyc2lvbi5maWVsZC5WZXJzaW9uLCBWQUxJRF9FRVBST01fVkVSU0lPTikpOwogCQkvKnBBZC0+U3lzdGVtRXJyb3JCaXRtYXAgfD0gMHgwMDAwMDAwMTsKIAotCQkvLyBoYXJkLWNvZGUgZGVmYXVsdCB2YWx1ZSB3aGVuIG5vIHByb3BlciBFMlBST00gaW5zdGFsbGVkCi0JCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKLQkJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOworCQkgICAvLyBoYXJkLWNvZGUgZGVmYXVsdCB2YWx1ZSB3aGVuIG5vIHByb3BlciBFMlBST00gaW5zdGFsbGVkCisJCSAgIHBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsKKwkJICAgcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwogCi0JCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGkrKykKLQkJCXBBZC0+VHhQb3dlcltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CisJCSAgIC8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKKwkJICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGkrKykKKwkJICAgcEFkLT5UeFBvd2VyW2ldLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKIAotCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GXzExSkNIQU5ORUxTOyBpKyspCi0JCQlwQWQtPlR4UG93ZXIxMUpbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOworCQkgICAvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCisJCSAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GXzExSkNIQU5ORUxTOyBpKyspCisJCSAgIHBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7CiAKLQkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKLQkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOwotCQlyZXR1cm47ICAqLworCQkgICBmb3IoaSA9IDA7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQorCQkgICBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSA9IDB4ZmZmZjsKKwkJICAgcmV0dXJuOyAgKi8KIAl9Ci0KLQkvLyBSZWFkIEJCUCBkZWZhdWx0IHZhbHVlIGZyb20gRUVQUk9NIGFuZCBzdG9yZSB0byBhcnJheShFRVBST01EZWZhdWx0VmFsdWUpIGluIHBBZAorCS8qIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkICovCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKIAlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOwogCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKIAlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOwogCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCisJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8qIENvdW50cnkgUmVnaW9uICovCiAJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKIAotCWZvcihpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOwotCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9CQlBfQkFTRV9PRkZTRVQgKyBpICogMiwKKwkJCQkgICAgIHZhbHVlKTsKKwkJcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaSArIDNdID0gdmFsdWU7CiAJfQogCi0JLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCi0JLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQotCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCi0JLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKKwkvKiBXZSBoYXZlIHRvIHBhcnNlIE5JQyBjb25maWd1cmF0aW9uIDAgYXQgaGVyZS4gKi8KKwkvKiBJZiBUU1NJIGRpZCBub3QgaGF2ZSBwcmVsb2FkZWQgdmFsdWUsIGl0IHNob3VsZCByZXNldCB0aGUgVHhBdXRvQWdjIHRvIGZhbHNlICovCisJLyogVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIHJlYWQgVHhBdXRvQWdjIGNvbnRyb2wgYmVmb3JlaGFuZC4gKi8KKwkvKiBSZWFkIFR4IEFHQyBjb250cm9sIGJpdCAqLwogCUFudGVubmEud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdOwotCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKQotCXsKLQkJaWYoSVNfUlQzMDkwKHBBZCkpCi0JCXsKKwlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikgeworI2lmZGVmIFJUMzB4eAorCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKIAkJCUFudGVubmEud29yZCA9IDA7CiAJCQlBbnRlbm5hLmZpZWxkLlJmSWNUeXBlID0gUkZJQ18zMDIwOwogCQkJQW50ZW5uYS5maWVsZC5UeFBhdGggPSAxOwogCQkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAxOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCisjZW5kaWYgLyogUlQzMHh4IC8vICovCiAJCXsKLQkJQW50ZW5uYS53b3JkID0gMDsKLQkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKLQkJQW50ZW5uYS5maWVsZC5UeFBhdGggPSAxOwotCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLCBBbnRlbm5hLndvcmQpKTsKKworCQkJQW50ZW5uYS53b3JkID0gMDsKKwkJCUFudGVubmEuZmllbGQuUmZJY1R5cGUgPSBSRklDXzI4MjA7CisJCQlBbnRlbm5hLmZpZWxkLlR4UGF0aCA9IDE7CisJCQlBbnRlbm5hLmZpZWxkLlJ4UGF0aCA9IDI7CisJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJCSAoIkUyUFJPTSBlcnJvciwgaGFyZCBjb2RlIGFzIDB4JTA0eFxuIiwKKwkJCQkgIEFudGVubmEud29yZCkpOwogCQl9CiAJfQotCi0JLy8gQ2hvb3NlIHRoZSBkZXNpcmVkIFR4JlJ4IHN0cmVhbS4KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA+IEFudGVubmEuZmllbGQuVHhQYXRoKSkKKwkvKiBDaG9vc2UgdGhlIGRlc2lyZWQgVHgmUnggc3RyZWFtLiAqLworCWlmICgocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5UeFBhdGgpKQogCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IEFudGVubmEuZmllbGQuVHhQYXRoOwogCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlJ4UGF0aCkpCi0JeworCWlmICgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMCkKKwkgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gQW50ZW5uYS5maWVsZC5SeFBhdGgpKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gQW50ZW5uYS5maWVsZC5SeFBhdGg7CiAKIAkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gMikpCi0JCXsKLQkJCS8vIG9ubHkgMiBSeCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCisJCSAgICAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPiAyKSkgeworCQkJLyogb25seSAyIFJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMgKi8KIAkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKIAkJfQogCX0KLQotCS8vIDMqMwotCS8vIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIKLQkvLyB5ZXQgaW1wbGVtZW50Ci0JZm9yKGk9MDsgaTwzOyBpKyspCi0JeworCS8qIDMqMyAqLworCS8qIHJlYWQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHNldCB0aGVtIHRvIENTUjE3NCB+IDE3NyBpbiBjaGFpbjAgfiBjaGFpbjIgKi8KKwkvKiB5ZXQgaW1wbGVtZW50ICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCX0KIAogCU5pY0NvbmZpZzIud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzFdOwogCiAJewotCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikKLQkJeworCQlpZiAoKE5pY0NvbmZpZzIud29yZCAmIDB4MDBmZikgPT0gMHhmZikgewogCQkJTmljQ29uZmlnMi53b3JkICY9IDB4ZmYwMDsKIAkJfQogCi0JCWlmICgoTmljQ29uZmlnMi53b3JkID4+IDgpID09IDB4ZmYpCi0JCXsKKwkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikgewogCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKIAkJfQogCX0KQEAgLTE1MDksMjkgKzg5MCw0MyBAQAogCWVsc2UKIAkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKIAotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLCBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKKwlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCSAgICAgKCJOSUNSZWFkRUVQUk9NUGFyYW1ldGVyczogUnhQYXRoID0gJWQsIFR4UGF0aCA9ICVkXG4iLAorCQkgICAgICBBbnRlbm5hLmZpZWxkLlJ4UGF0aCwgQW50ZW5uYS5maWVsZC5UeFBhdGgpKTsKIAotCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKKwkvKiBTYXZlIHRoZSBhbnRlbm5hIGZvciBmdXR1cmUgdXNlICovCiAJcEFkLT5BbnRlbm5hLndvcmQgPSBBbnRlbm5hLndvcmQ7CiAKLQkvLwotCS8vIFJlc2V0IFBoeU1vZGUgaWYgd2UgZG9uJ3Qgc3VwcG9ydCA4MDIuMTFhCi0JLy8gT25seSBSRklDXzI4NTAgJiBSRklDXzI3NTAgc3VwcG9ydCA4MDIuMTFhCi0JLy8KLQlpZiAoKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yODUwKSAmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI3NTApKQotCXsKKwkvKiBTZXQgdGhlIFJmSUNUeXBlIGhlcmUsIHRoZW4gd2UgY2FuIGluaXRpYWxpemUgUkZJQyByZWxhdGVkIG9wZXJhdGlvbiBjYWxsYmFja3MgKi8KKwlwQWQtPk1sbWUuUmVhbFJ4UGF0aCA9ICh1OClBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKKwlwQWQtPlJmSWNUeXBlID0gKHU4KUFudGVubmEuZmllbGQuUmZJY1R5cGU7CisKKyNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKKwlSdG1wQ2hpcE9wc1JGSG9vayhwQWQpOworI2VuZGlmIC8qIFJUTVBfUkZfUldfU1VQUE9SVCAvLyAqLworCisjaWZkZWYgUlRNUF9NQUNfUENJCisJc3ByaW50ZigoY2hhciAqKXBBZC0+bmlja25hbWUsICJSVDI4NjBTVEEiKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCS8qICovCisJLyogUmVzZXQgUGh5TW9kZSBpZiB3ZSBkb24ndCBzdXBwb3J0IDgwMi4xMWEgKi8KKwkvKiBPbmx5IFJGSUNfMjg1MCAmIFJGSUNfMjc1MCBzdXBwb3J0IDgwMi4xMWEgKi8KKwkvKiAqLworCWlmICgoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzI4NTApCisJICAgICYmIChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjc1MCkKKwkgICAgJiYgKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18zMDUyKSkgewogCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVEKSB8fAotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkpCisJCSAgICAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBKSkKIAkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR19NSVhFRDsKLQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkJfHwKLQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpIAl8fAotCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpIAl8fAotCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkKKwkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwKKwkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkgfHwKKwkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpIHx8CisJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCiAJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gUEhZXzExQkdOX01JWEVEOwogCX0KLQotCS8vIFJlYWQgVFNTSSByZWZlcmVuY2UgYW5kIFRTU0kgYm91bmRhcnkgZm9yIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhpcyBpcyB1Z2x5Ci0JLy8gMC4gMTFiL2cKKwkvKiBSZWFkIFRTU0kgcmVmZXJlbmNlIGFuZCBUU1NJIGJvdW5kYXJ5IGZvciB0ZW1wZXJhdHVyZSBjb21wZW5zYXRpb24uIFRoaXMgaXMgdWdseSAqLworCS8qIDAuIDExYi9nICovCiAJewogCQkvKiB0aGVzZSBhcmUgdGVtcGF0dXJlIHJlZmVyZW5jZSB2YWx1ZSAoMHgwMCB+IDB4RkUpCiAJCSAgIGV4OiAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMApAQCAtMTU0NCw3ICs5MzksNyBAQAogCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwogCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzIsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lSZWZHICAgPSBQb3dlci5maWVsZC5CeXRlMDsgLyogcmVmZXJlbmNlIHZhbHVlIFswXSAqLworCQlwQWQtPlRzc2lSZWZHID0gUG93ZXIuZmllbGQuQnl0ZTA7CS8qIHJlZmVyZW5jZSB2YWx1ZSBbMF0gKi8KIAkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4NzQsIFBvd2VyLndvcmQpOwogCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7CkBAIC0xNTU0LDE5ICs5NDksMjMgQEAKIAkJcEFkLT5UeEFnY1N0ZXBHID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCXBBZC0+VHhBZ2NDb21wZW5zYXRlRyA9IDA7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdID0gcEFkLT5Uc3NpUmVmRzsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXSAgPSBwQWQtPlRzc2lSZWZHOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzBdID0gcEFkLT5Uc3NpUmVmRzsKIAotCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJLyogRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0ICovCiAJCWlmIChwQWQtPlRzc2lSZWZHID09IDB4ZmYpCiAJCQlwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEcgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAotCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMV0sCi0JCQlwQWQtPlRzc2lSZWZHLAotCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1sxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1s0XSwKLQkJCXBBZC0+VHhBZ2NTdGVwRywgcEFkLT5iQXV0b1R4QWdjRykpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkUyUFJPTTogRyBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzRdLAorCQkJICBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0sCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lSZWZHLAorCQkJICBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzJdLAorCQkJICBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzRdLAorCQkJICBwQWQtPlR4QWdjU3RlcEcsIHBBZC0+YkF1dG9UeEFnY0cpKTsKIAl9Ci0JLy8gMS4gMTFhCisJLyogMS4gMTFhICovCiAJewogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4RDQsIFBvd2VyLndvcmQpOwogCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwpAQCAtMTU3NSw3ICs5NzQsNyBAQAogCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwogCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwogCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4RDgsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lSZWZBICAgPSBQb3dlci5maWVsZC5CeXRlMDsKKwkJcEFkLT5Uc3NpUmVmQSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwogCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHhEQSwgUG93ZXIud29yZCk7CiAJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbMl0gPSBQb3dlci5maWVsZC5CeXRlMDsKQEAgLTE1ODUsOTcgKzk4NCwxMTkgQEAKIAkJcEFkLT5UeEFnY1N0ZXBBID0gUG93ZXIuZmllbGQuQnl0ZTE7CiAJCXBBZC0+VHhBZ2NDb21wZW5zYXRlQSA9IDA7CiAJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVswXSAgPSBwQWQtPlRzc2lSZWZBOworCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdID0gcEFkLT5Uc3NpUmVmQTsKIAotCQkvLyBEaXNhYmxlIFR4QWdjIGlmIHRoZSBiYXNlZCB2YWx1ZSBpcyBub3QgcmlnaHQKKwkJLyogRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0ICovCiAJCWlmIChwQWQtPlRzc2lSZWZBID09IDB4ZmYpCiAJCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEEgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAotCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsyXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0sCi0JCQlwQWQtPlRzc2lSZWZBLAotCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVs0XSwKLQkJCXBBZC0+VHhBZ2NTdGVwQSwgcEFkLT5iQXV0b1R4QWdjQSkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkUyUFJPTTogQSBUc3NpWy00IC4uICs0XSA9ICVkICVkICVkICVkIC0gJWQgLSVkICVkICVkICVkLCBzdGVwPSVkLCB0dW5pbmc9JWRcbiIsCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzRdLAorCQkJICBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSwKKwkJCSAgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMl0sCisJCQkgIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lSZWZBLAorCQkJICBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzFdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdLAorCQkJICBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzRdLAorCQkJICBwQWQtPlR4QWdjU3RlcEEsIHBBZC0+YkF1dG9UeEFnY0EpKTsKIAl9CiAJcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSA9IDB4MDsKIAotCS8vIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRgorCS8qIFJlYWQgZnJlcXVlbmN5IG9mZnNldCBzZXR0aW5nIGZvciBSRiAqLwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0ZSRVFfT0ZGU0VULCB2YWx1ZSk7CiAJaWYgKCh2YWx1ZSAmIDB4MDBGRikgIT0gMHgwMEZGKQotCQlwQWQtPlJmRnJlcU9mZnNldCA9IChVTE9ORykgKHZhbHVlICYgMHgwMEZGKTsKKwkJcEFkLT5SZkZyZXFPZmZzZXQgPSAodW5zaWduZWQgbG9uZykodmFsdWUgJiAweDAwRkYpOwogCWVsc2UKIAkJcEFkLT5SZkZyZXFPZmZzZXQgPSAwOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogUkYgRnJlcU9mZnNldD0weCVseCBcbiIsIHBBZC0+UmZGcmVxT2Zmc2V0KSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkUyUFJPTTogUkYgRnJlcU9mZnNldD0weCVseCBcbiIsIHBBZC0+UmZGcmVxT2Zmc2V0KSk7CiAKLQkvL0NvdW50cnlSZWdpb24gYnl0ZSBvZmZzZXQgKDM4aCkKLQl2YWx1ZSA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdID4+IDg7CQkvLyAyLjRHIGJhbmQKLQl2YWx1ZTIgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSAmIDB4MDBGRjsJLy8gNUcgYmFuZAorCS8qQ291bnRyeVJlZ2lvbiBieXRlIG9mZnNldCAoMzhoKSAqLworCXZhbHVlID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPj4gODsJLyogMi40RyBiYW5kICovCisJdmFsdWUyID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gJiAweDAwRkY7CS8qIDVHIGJhbmQgKi8KIAotCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiA9ICgoVUNIQVIpIHZhbHVlKSB8IDB4ODA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgoVUNIQVIpIHZhbHVlMikgfCAweDgwOworCWlmICgodmFsdWUgPD0gUkVHSU9OX01BWElNVU1fQkdfQkFORCkKKwkgICAgJiYgKHZhbHVlMiA8PSBSRUdJT05fTUFYSU1VTV9BX0JBTkQpKSB7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoKHU4KXZhbHVlKSB8IDB4ODA7CisJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCA9ICgodTgpdmFsdWUyKSB8IDB4ODA7CiAJCVRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7CiAJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOwogCQlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7CiAJCVNldENvbW1vbkhUKHBBZCk7CiAJfQotCi0JLy8KLQkvLyBHZXQgUlNTSSBPZmZzZXQgb24gRUVQUk9NIDB4OUFoICYgMHg5Q2guCi0JLy8gVGhlIHZhbGlkIHZhbHVlIGFyZSAoLTEwIH4gMTApCi0JLy8KKwkvKiAqLworCS8qIEdldCBSU1NJIE9mZnNldCBvbiBFRVBST00gMHg5QWggJiAweDlDaC4gKi8KKwkvKiBUaGUgdmFsaWQgdmFsdWUgYXJlICgtMTAgfiAxMCkgKi8KKwkvKiAqLwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VULCB2YWx1ZSk7CiAJcEFkLT5CR1Jzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CiAJcEFkLT5CR1Jzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUKzIsIHZhbHVlKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCArIDIsIHZhbHVlKTsKIAlwQWQtPkJHUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKIAlwQWQtPkFMTkFHYWluMSA9ICh2YWx1ZSA+PiA4KTsKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCB2YWx1ZSk7CiAJcEFkLT5CTE5BR2FpbiA9IHZhbHVlICYgMHgwMGZmOwogCXBBZC0+QUxOQUdhaW4wID0gKHZhbHVlID4+IDgpOwogCi0JLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8wIG9mZnNldC4KKwkvKiBWYWxpZGF0ZSAxMWIvZyBSU1NJXzAgb2Zmc2V0LiAqLwogCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQwID4gMTApKQogCQlwQWQtPkJHUnNzaU9mZnNldDAgPSAwOwogCi0JLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8xIG9mZnNldC4KKwkvKiBWYWxpZGF0ZSAxMWIvZyBSU1NJXzEgb2Zmc2V0LiAqLwogCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQxID4gMTApKQogCQlwQWQtPkJHUnNzaU9mZnNldDEgPSAwOwogCi0JLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8yIG9mZnNldC4KKwkvKiBWYWxpZGF0ZSAxMWIvZyBSU1NJXzIgb2Zmc2V0LiAqLwogCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQyID4gMTApKQogCQlwQWQtPkJHUnNzaU9mZnNldDIgPSAwOwogCiAJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fUlNTSV9BX09GRlNFVCwgdmFsdWUpOwogCXBBZC0+QVJzc2lPZmZzZXQwID0gdmFsdWUgJiAweDAwZmY7CiAJcEFkLT5BUnNzaU9mZnNldDEgPSAodmFsdWUgPj4gOCk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQV9PRkZTRVQrMiksIHZhbHVlKTsKKwlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCArIDIpLCB2YWx1ZSk7CiAJcEFkLT5BUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKIAlwQWQtPkFMTkFHYWluMiA9ICh2YWx1ZSA+PiA4KTsKIAotCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4xID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMSA9PSAweDAwKSkKKwlpZiAoKCh1OClwQWQtPkFMTkFHYWluMSA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjEgPT0gMHgwMCkpCiAJCXBBZC0+QUxOQUdhaW4xID0gcEFkLT5BTE5BR2FpbjA7Ci0JaWYgKCgoVUNIQVIpcEFkLT5BTE5BR2FpbjIgPT0gMHhGRikgfHwgKHBBZC0+QUxOQUdhaW4yID09IDB4MDApKQorCWlmICgoKHU4KXBBZC0+QUxOQUdhaW4yID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMiA9PSAweDAwKSkKIAkJcEFkLT5BTE5BR2FpbjIgPSBwQWQtPkFMTkFHYWluMDsKIAotCS8vIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LgorCS8qIFZhbGlkYXRlIDExYSBSU1NJXzAgb2Zmc2V0LiAqLwogCWlmICgocEFkLT5BUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MCA+IDEwKSkKIAkJcEFkLT5BUnNzaU9mZnNldDAgPSAwOwogCi0JLy8gVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuCisJLyogVmFsaWRhdGUgMTFhIFJTU0lfMSBvZmZzZXQuICovCiAJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MSA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQxID4gMTApKQogCQlwQWQtPkFSc3NpT2Zmc2V0MSA9IDA7CiAKLQkvL1ZhbGlkYXRlIDExYSBSU1NJXzIgb2Zmc2V0LgorCS8qVmFsaWRhdGUgMTFhIFJTU0lfMiBvZmZzZXQuICovCiAJaWYgKChwQWQtPkFSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QVJzc2lPZmZzZXQyID4gMTApKQogCQlwQWQtPkFSc3NpT2Zmc2V0MiA9IDA7CiAKLQkvLwotCS8vIEdldCBMRUQgU2V0dGluZy4KLQkvLworI2lmZGVmIFJUMzB4eAorCS8qICovCisJLyogR2V0IFRYIG1peGVyIGdhaW4gc2V0dGluZyAqLworCS8qIDB4ZmYgYXJlIGludmFsaWQgdmFsdWUgKi8KKwkvKiBOb3RlOiBSVDMweFggZGVmYXVsdCB2YWx1ZSBpcyAweDAwIGFuZCB3aWxsIHByb2dyYW0gdG8gUkZfUjE3IG9ubHkgd2hlbiB0aGlzIHZhbHVlIGlzIG5vdCB6ZXJvLiAqLworCS8qICAgICAgIFJUMzU5WCBkZWZhdWx0IHZhbHVlIGlzIDB4MDIgKi8KKwkvKiAqLworCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9UWE1JWEVSX0dBSU5fMl80RywgdmFsdWUpOworCQlwQWQtPlR4TWl4ZXJHYWluMjRHID0gMDsKKwkJdmFsdWUgJj0gMHgwMGZmOworCQlpZiAodmFsdWUgIT0gMHhmZikgeworCQkJdmFsdWUgJj0gMHgwNzsKKwkJCXBBZC0+VHhNaXhlckdhaW4yNEcgPSAodTgpdmFsdWU7CisJCX0KKwl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKwkvKiAqLworCS8qIEdldCBMRUQgU2V0dGluZy4gKi8KKwkvKiAqLwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgzYSwgdmFsdWUpOwotCXBBZC0+TGVkQ250bC53b3JkID0gKHZhbHVlJjB4ZmYwMCkgPj4gODsKKwlwQWQtPkxlZENudGwud29yZCA9ICh2YWx1ZSA+PiA4KTsKIAlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQxX09GRlNFVCwgdmFsdWUpOwogCXBBZC0+TGVkMSA9IHZhbHVlOwogCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDJfT0ZGU0VULCB2YWx1ZSk7CkBAIC0xNjg1LDYgKzExMDYsMTIgQEAKIAogCVJUTVBSZWFkVHhQd3JQZXJSYXRlKHBBZCk7CiAKKyNpZmRlZiBSVDMweHgKKyNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKKwlSdG1wRWZ1c2VTdXBwb3J0Q2hlY2socEFkKTsKKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNSZWFkRUVQUk9NUGFyYW1ldGVyc1xuIikpOwogfQogCkBAIC0xNzA2LDE3MCArMTEzMywyMTggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJTklDSW5pdEFzaWNGcm9tRUVQUk9NKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBOSUNJbml0QXNpY0Zyb21FRVBST00oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVJTlQzMgkJCQkJZGF0YSA9IDA7Ci0JVUNIQVIJQkJQUjEgPSAwOwotCVVTSE9SVAkJCQkJaTsKLQlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOwotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOwotCVVDSEFSCUJCUFIzID0gMDsKKwl1MzIgZGF0YSA9IDA7CisJdTggQkJQUjEgPSAwOworCXUxNiBpOworLyogICAgICBFRVBST01fQU5URU5OQV9TVFJVQyAgICBBbnRlbm5hOyAqLworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyBOaWNDb25maWcyOworCXU4IEJCUFIzID0gMDsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKLQlmb3IoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQotCXsKLQkJVUNIQVIgQmJwUmVnSWR4LCBCYnBWYWx1ZTsKKwlmb3IgKGkgPSAzOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykgeworCQl1OCBCYnBSZWdJZHgsIEJicFZhbHVlOwogCi0JCWlmICgocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gIT0gMHhGRkZGKSAmJiAocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gIT0gMCkpCi0JCXsKLQkJCUJicFJlZ0lkeCA9IChVQ0hBUikocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gPj4gOCk7Ci0JCQlCYnBWYWx1ZSAgPSAoVUNIQVIpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICYgMHhmZik7CisJCWlmICgocEFkLT5FRVBST01EZWZhdWx0VmFsdWVbaV0gIT0gMHhGRkZGKQorCQkgICAgJiYgKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDApKSB7CisJCQlCYnBSZWdJZHggPSAodTgpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID4+IDgpOworCQkJQmJwVmFsdWUgPSAodTgpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICYgMHhmZik7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQmJwUmVnSWR4LCBCYnBWYWx1ZSk7CiAJCX0KIAl9CiAKLSNpZm5kZWYgUlQyODcwCi0JQW50ZW5uYS53b3JkID0gcEFkLT5BbnRlbm5hLndvcmQ7Ci0jZWxzZQotCUFudGVubmEud29yZCA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzBdOwotCWlmIChBbnRlbm5hLndvcmQgPT0gMHhGRkZGKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLCBBbnRlbm5hLndvcmQpKTsKLQkJQlVHX09OKEFudGVubmEud29yZCA9PSAweEZGRkYpOwotCX0KLSNlbmRpZgotCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJ4UGF0aDsKLQlwQWQtPlJmSWNUeXBlID0gKFVDSEFSKSBBbnRlbm5hLmZpZWxkLlJmSWNUeXBlOwotCi0jaWZkZWYgUlQyODcwCi0JREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJwQWQtPlJmSWNUeXBlID0gJWQsIFJlYWxSeFBhdGg9JWQsIFR4UGF0aCA9ICVkXG4iLCBwQWQtPlJmSWNUeXBlLCBwQWQtPk1sbWUuUmVhbFJ4UGF0aCxBbnRlbm5hLmZpZWxkLlR4UGF0aCkpOwotCi0JLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQotCXBBZC0+QW50ZW5uYS53b3JkID0gQW50ZW5uYS53b3JkOwotI2VuZGlmCiAJTmljQ29uZmlnMi53b3JkID0gcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMV07CiAKLSNpZmRlZiBSVDI4NzAKIAl7Ci0JCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQotCQl7CisJCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKSB7CiAJCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOwogCQl9CiAKLQkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKLQkJeworCQlpZiAoKE5pY0NvbmZpZzIud29yZCA+PiA4KSA9PSAweGZmKSB7CiAJCQlOaWNDb25maWcyLndvcmQgJj0gMHgwMGZmOwogCQl9CiAJfQotI2VuZGlmCi0JLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQorCisJLyogU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZSAqLwogCXBBZC0+TmljQ29uZmlnMi53b3JkID0gTmljQ29uZmlnMi53b3JkOwogCi0jaWZkZWYgUlQyODcwCi0JLy8gc2V0IGRlZmF1bHQgYW50ZW5uYSBhcyBtYWluCisjaWZkZWYgUlQzMHh4CisJLyogc2V0IGRlZmF1bHQgYW50ZW5uYSBhcyBtYWluICovCiAJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKQogCQlBc2ljU2V0UnhBbnQocEFkLCBwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50KTsKLSNlbmRpZgotCS8vCi0JLy8gU2VuZCBMRUQgU2V0dGluZyB0byBNQ1UuCi0JLy8KLQlpZiAocEFkLT5MZWRDbnRsLndvcmQgPT0gMHhGRikKLQl7CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKwkvKiAqLworCS8qIFNlbmQgTEVEIFNldHRpbmcgdG8gTUNVLiAqLworCS8qICovCisJaWYgKHBBZC0+TGVkQ250bC53b3JkID09IDB4RkYpIHsKIAkJcEFkLT5MZWRDbnRsLndvcmQgPSAweDAxOwogCQlwQWQtPkxlZDEgPSAweDU1NTU7CiAJCXBBZC0+TGVkMiA9IDB4MjIyMTsKLSNpZmRlZiBSVDI4NjAKLQkJcEFkLT5MZWQzID0gMHhBOUY4OwotI2VuZGlmCiAKLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJcEFkLT5MZWQzID0gMHhBOUY4OworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgogCQlwQWQtPkxlZDMgPSAweDU2Mjc7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAJfQogCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUyLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQxLCAoVUNIQVIpKHBBZC0+TGVkMSA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUzLCAweGZmLCAoVUNIQVIpcEFkLT5MZWQyLCAoVUNIQVIpKHBBZC0+TGVkMiA+PiA4KSk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDU0LCAweGZmLCAoVUNIQVIpcEFkLT5MZWQzLCAoVUNIQVIpKHBBZC0+TGVkMyA+PiA4KSk7Ci0gICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGRjsKLSAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgYmVmb3JlIGxpbmsgdXAKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTIsIDB4ZmYsICh1OClwQWQtPkxlZDEsCisJCQkgICAgICh1OCkocEFkLT5MZWQxID4+IDgpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTMsIDB4ZmYsICh1OClwQWQtPkxlZDIsCisJCQkgICAgICh1OCkocEFkLT5MZWQyID4+IDgpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTQsIDB4ZmYsICh1OClwQWQtPkxlZDMsCisJCQkgICAgICh1OCkocEFkLT5MZWQzID4+IDgpKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTEsIDB4ZmYsIDAsIHBBZC0+TGVkQ250bC5maWVsZC5Qb2xhcml0eSk7CisKKwlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMHhGRjsKKwlSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8qIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgYmVmb3JlIGxpbmsgdXAgKi8KIAogCXsKLQkJLy8gUmVhZCBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIHN0YXRlIGVuYWJsZSBiaXQKLQkJaWYgKE5pY0NvbmZpZzIuZmllbGQuSGFyZHdhcmVSYWRpb0NvbnRyb2wgPT0gMSkKLQkJeworCQkvKiBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdCAqLworCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKSB7CiAJCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IFRSVUU7CiAKLQkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKKwkJCS8qIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUgKi8KIAkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkKLQkJCXsKKwkJCWlmICgoZGF0YSAmIDB4MDQpID09IDApIHsKIAkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOwogCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IEZBTFNFOworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgwMDAwMTgxOCk7ICovCiAJCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKIAkJCX0KLQkJfQotCQllbHNlCisJCX0gZWxzZQogCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsKIAotCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQl7CisJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpIHsKIAkJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT0ZGKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOwotI2lmZGVmIFJUMjg2MAorI2lmZGVmIFJUTVBfTUFDX1BDSQorI2lmZGVmIFJUMzA5MAorCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclJhZGlvT2ZmQ0lELCAweGZmLAorCQkJCQkgICAgIDB4MDIpOworCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclJhZGlvT2ZmQ0lEKTsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKyNpZm5kZWYgUlQzMDkwCiAJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDIpOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDApOwotCQkJLy8gMi0xLiB3YWl0IGNvbW1hbmQgb2suCisjZW5kaWYgLyogUlQzMDkwIC8vICovCisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwKKwkJCQkJICAgICAweDAwKTsKKwkJCS8qIDItMS4gd2FpdCBjb21tYW5kIG9rLiAqLwogCQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAJCX0KIAl9CiAKLQkvLyBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyCi0JaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKQotCXsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNpZmRlZiBSVDMweHgKKwlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOworCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQorCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7CisJfQorCS8qIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuICovCisJLyogQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLiAqLworCisJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKKwkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcywgcmVsZWFzZSBNY3UgTG9ja1xuIiwgX19mdW5jX18pKTsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7CisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwl9CisjZW5kaWYgLyogUlQzMHh4IC8vICovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkvKiBUdXJuIG9mZiBwYXRjaGluZyBmb3IgY2FyZGJ1cyBjb250cm9sbGVyICovCisJaWYgKE5pY0NvbmZpZzIuZmllbGQuQ2FyZGJ1c0FjY2VsZXJhdGlvbiA9PSAxKSB7CisvKiAgICAgICAgICAgICAgcEFkLT5iVGVzdDEgPSBUUlVFOyAqLwogCX0KIAogCWlmIChOaWNDb25maWcyLmZpZWxkLkR5bmFtaWNUeEFnY0NvbnRyb2wgPT0gMSkKIAkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBUUlVFOwogCWVsc2UKIAkJcEFkLT5iQXV0b1R4QWdjQSA9IHBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKLQotCS8qIEJCUCBoYXMgYmVlbiBwcm9ncmFtbWVkIHNvIHJlc2V0IHRvIFVOS05PV05fQkFORCAqLworCS8qICovCisJLyogU2luY2UgQkJQIGhhcyBiZWVuIHByb2dhbWVkLCB0byBtYWtlIHN1cmUgQkJQIHNldHRpbmcgd2lsbCBiZSAqLworCS8qIHVwYXRlIGluc2lkZSBvZiBBc2ljQW50ZW5uYVNlbGVjdCwgc28gcmVzZXQgdG8gVU5LTk9XTl9CQU5EISAqLworCS8qICovCiAJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOwogCiAJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOwogCUJCUFIzICY9ICh+MHgxOCk7Ci0JaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCXsKKwlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSB7CiAJCUJCUFIzIHw9ICgweDEwKTsKLQl9Ci0JZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JeworCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKSB7CiAJCUJCUFIzIHw9ICgweDgpOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQl7CisJfSBlbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpIHsKIAkJQkJQUjMgfD0gKDB4MCk7CiAJfQogCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKIAogCXsKLQkJLy8gSGFuZGxlIHRoZSBkaWZmZXJlbmNlIHdoZW4gMVQKKwkJLyogSGFuZGxlIHRoZSBkaWZmZXJlbmNlIHdoZW4gMVQgKi8KIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQkJQUjEpOwotCQlpZihwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJQkJQUjEgJj0gKH4weDE4KTsKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJQkJQUjEgJj0gKH4weDE4KTsKIAkJfQogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCQlBSMSk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlVzZSBIdyBSYWRpbyBDb250cm9sIFBpbj0lZDsgaWYgdXNlZCBQaW49JWQ7XG4iLAorCQkJICBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbywKKwkJCSAgcEFkLT5Db21tb25DZmcuYkhhcmR3YXJlUmFkaW8pKTsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBhdGggPSAlZCwgUnhQYXRoID0gJWQsIFJGSUM9JWQsIFBvbGFyK0xFRCBtb2RlPSV4XG4iLCBwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoLCBwQWQtPlJmSWNUeXBlLCBwQWQtPkxlZENudGwud29yZCkpOworI2lmZGVmIFJUTVBfTUFDX1VTQgorI2lmZGVmIFJUMzB4eAorCS8qIHVwZGF0ZSByZWdpc3RlcnMgZnJvbSBFRVBST00gZm9yIFJUMzA3MSBvciBsYXRlcigzNTcyLzM1OTIpLiAqLworCisJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSB7CisJCXU4IFJlZ0lkeCwgUmVnVmFsdWU7CisJCXUxNiB2YWx1ZTsKKworCQkvKiBhZnRlciBSVDMwNzEsIHdyaXRlIEJCUCBmcm9tIEVFUFJPTSAweEYwIHRvIDB4MTAyICovCisJCWZvciAoaSA9IDB4RjA7IGkgPD0gMHgxMDI7IGkgPSBpICsgMikgeworCQkJdmFsdWUgPSAweEZGRkY7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGksIHZhbHVlKTsKKwkJCWlmICgodmFsdWUgIT0gMHhGRkZGKSAmJiAodmFsdWUgIT0gMCkpIHsKKwkJCQlSZWdJZHggPSAodTgpKHZhbHVlID4+IDgpOworCQkJCVJlZ1ZhbHVlID0gKHU4KSh2YWx1ZSAmIDB4ZmYpOworCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSZWdJZHgsCisJCQkJCQkJICAgICBSZWdWYWx1ZSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlVwZGF0ZSBCQlAgUmVnaXN0ZXJzIGZyb20gRUVQUk9NKDB4JTB4KSwgQkJQKDB4JXgpID0gMHgleFxuIiwKKwkJCQkJICBpLCBSZWdJZHgsIFJlZ1ZhbHVlKSk7CisJCQl9CisJCX0KKworCQkvKiBhZnRlciBSVDMwNzEsIHdyaXRlIFJGIGZyb20gRUVQUk9NIDB4MTA0IHRvIDB4MTE2ICovCisJCWZvciAoaSA9IDB4MTA0OyBpIDw9IDB4MTE2OyBpID0gaSArIDIpIHsKKwkJCXZhbHVlID0gMHhGRkZGOworCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBpLCB2YWx1ZSk7CisJCQlpZiAoKHZhbHVlICE9IDB4RkZGRikgJiYgKHZhbHVlICE9IDApKSB7CisJCQkJUmVnSWR4ID0gKHU4KSh2YWx1ZSA+PiA4KTsKKwkJCQlSZWdWYWx1ZSA9ICh1OCkodmFsdWUgJiAweGZmKTsKKwkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSZWdJZHgsIFJlZ1ZhbHVlKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiVXBkYXRlIFJGIFJlZ2lzdGVycyBmcm9tIEVFUFJPTTB4JXgpLCBCQlAoMHgleCkgPSAweCV4XG4iLAorCQkJCQkgIGksIFJlZ0lkeCwgUmVnVmFsdWUpKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJUeFBhdGggPSAlZCwgUnhQYXRoID0gJWQsIFJGSUM9JWQsIFBvbGFyK0xFRCBtb2RlPSV4XG4iLAorCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGgsCisJCSAgcEFkLT5SZkljVHlwZSwgcEFkLT5MZWRDbnRsLndvcmQpKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdEFzaWNGcm9tRUVQUk9NXG4iKSk7CiB9CiAKQEAgLTE4OTEsMzkgKzEzNjYsMzkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTCU5JQ0luaXRpYWxpemVBZGFwdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KQoraW50IE5JQ0luaXRpYWxpemVBZGFwdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiSGFyZFJlc2V0KQogewotCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotI2lmZGVmIFJUMjg2MAotCVVJTlQzMgkJCVZhbHVlOwotCURFTEFZX0lOVF9DRkdfU1RSVUMJSW50Q2ZnOwotI2VuZGlmCi0JVUxPTkcJaSA9MCwgaj0wOwotCUFDX1RYT1BfQ1NSMF9TVFJVQwljc3IwOworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXUzMiBWYWx1ZTsKKwlERUxBWV9JTlRfQ0ZHX1NUUlVDIEludENmZzsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKy8qICAgICAgSU5UX01BU0tfQ1NSX1NUUlVDICAgICAgICAgICAgICBJbnRNYXNrOyAqLworCXVuc2lnbmVkIGxvbmcgaSA9IDAsIGogPSAwOworCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7CiAKLQkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorCS8qIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6ICovCiByZXRyeToKIAlpID0gMDsKLQlkbwotCXsKKwlkbyB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKKwkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApCisJCSAgICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKIAkJCWJyZWFrOwogCiAJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CiAJCWkrKzsKLQl9d2hpbGUgKCBpPDEwMCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOworCX0gd2hpbGUgKGkgPCAxMDApOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI8PT0gRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7CiAJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKKwlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CiAKLQkvLyBSZWNvcmQgSFcgQmVhY29uIG9mZnNldAorCS8qIFJlY29yZCBIVyBCZWFjb24gb2Zmc2V0ICovCiAJcEFkLT5CZWFjb25PZmZzZXRbMF0gPSBIV19CRUFDT05fQkFTRTA7CiAJcEFkLT5CZWFjb25PZmZzZXRbMV0gPSBIV19CRUFDT05fQkFTRTE7CiAJcEFkLT5CZWFjb25PZmZzZXRbMl0gPSBIV19CRUFDT05fQkFTRTI7CkBAIC0xOTMzLDkxICsxNDA4LDg3IEBACiAJcEFkLT5CZWFjb25PZmZzZXRbNl0gPSBIV19CRUFDT05fQkFTRTY7CiAJcEFkLT5CZWFjb25PZmZzZXRbN10gPSBIV19CRUFDT05fQkFTRTc7CiAKLQkvLwotCS8vIHdyaXRlIGFsbCBzaGFyZWQgUmluZydzIGJhc2UgYWRkcmVzcyBpbnRvIEFTSUMKLQkvLworCS8qICovCisJLyogd3JpdGUgYWxsIHNoYXJlZCBSaW5nJ3MgYmFzZSBhZGRyZXNzIGludG8gQVNJQyAqLworCS8qICovCiAKLQkvLyBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuCi0JLy8gcGJmIGhhcmR3YXJlIHJlc2V0Ci0jaWZkZWYgUlQyODYwCi0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfUlNUX0lEWCwgMHgxMDAzZik7CS8vIDB4MTAwMDAgZm9yIHJlc2V0IHJ4LCAweDNmIHJlc2V0cyBhbGwgNiB0eCByaW5ncy4KKwkvKiBhc2ljIHNpbXVsYXRpb24gc2VxdWVuY2UgcHV0IHRoaXMgYWhlYWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUuICovCisJLyogcGJmIGhhcmR3YXJlIHJlc2V0ICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfUlNUX0lEWCwgMHgxMDAzZik7CS8qIDB4MTAwMDAgZm9yIHJlc2V0IHJ4LCAweDNmIHJlc2V0cyBhbGwgNiB0eCByaW5ncy4gKi8KIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTFmKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4ZTAwKTsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCi0JaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlpZiAoaisrID09IDApCi0JCXsKKwkvKiBJbml0aWFsemUgQVNJQyBmb3IgVFggJiBSeCBvcGVyYXRpb24gKi8KKwlpZiAoTklDSW5pdGlhbGl6ZUFzaWMocEFkLCBiSGFyZFJlc2V0KSAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmIChqKysgPT0gMCkgewogCQkJTklDTG9hZEZpcm13YXJlKHBBZCk7CiAJCQlnb3RvIHJldHJ5OwogCQl9CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotCi0jaWZkZWYgUlQyODYwCi0JLy8gV3JpdGUgQUNfQksgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfQktdLkNlbGxbMF0uQWxsb2NQYSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJLyogV3JpdGUgQUNfQksgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJVmFsdWUgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfQktdLkNlbGxbMF0uQWxsb2NQYSk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIxLCBWYWx1ZSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMSA6IDB4JXhcbiIsIFZhbHVlKSk7CiAKLQkvLyBXcml0ZSBBQ19CRSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFswXS5BbGxvY1BhKTsKKwkvKiBXcml0ZSBBQ19CRSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlWYWx1ZSA9CisJICAgIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjAsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIwIDogMHgleFxuIiwgVmFsdWUpKTsKIAotCS8vIFdyaXRlIEFDX1ZJIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX1ZJXS5DZWxsWzBdLkFsbG9jUGEpOworCS8qIFdyaXRlIEFDX1ZJIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCVZhbHVlID0KKwkgICAgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX1ZJXS5DZWxsWzBdLkFsbG9jUGEpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMiwgVmFsdWUpOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjIgOiAweCV4XG4iLCBWYWx1ZSkpOwogCi0JLy8gV3JpdGUgQUNfVk8gYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVk9dLkNlbGxbMF0uQWxsb2NQYSk7CisJLyogV3JpdGUgQUNfVk8gYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJVmFsdWUgPQorCSAgICBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfVk9dLkNlbGxbMF0uQWxsb2NQYSk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIzLCBWYWx1ZSk7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMyA6IDB4JXhcbiIsIFZhbHVlKSk7CiAKLQkvLyBXcml0ZSBIQ0NBIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCSAgVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfSENDQV0uQ2VsbFswXS5BbGxvY1BhKTsKLQkgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSNCwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjQgOiAweCV4XG4iLCBWYWx1ZSkpOwotCi0JLy8gV3JpdGUgTUdNVF9CQVNFX0NTUiByZWdpc3RlcgorCS8qIFdyaXRlIE1HTVRfQkFTRV9DU1IgcmVnaXN0ZXIgKi8KIAlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjUsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFI1IDogMHgleFxuIiwgVmFsdWUpKTsKIAotCS8vIFdyaXRlIFJYX0JBU0VfQ1NSIHJlZ2lzdGVyCisJLyogV3JpdGUgUlhfQkFTRV9DU1IgcmVnaXN0ZXIgKi8KIAlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+UnhSaW5nLkNlbGxbMF0uQWxsb2NQYSk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQkFTRV9QVFIsIFZhbHVlKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlhfQkFTRV9QVFIgOiAweCV4XG4iLCBWYWx1ZSkpOwogCi0JLy8gSW5pdCBSWCBSaW5nIGluZGV4IHBvaW50ZXIKKwkvKiBJbml0IFJYIFJpbmcgaW5kZXggcG9pbnRlciAqLwogCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gMDsKLQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRS0xOworCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFIC0gMTsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7CiAKLQkvLyBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIKKwkvKiBJbml0IFRYIHJpbmdzIGluZGV4IHBvaW50ZXIgKi8KIAl7Ci0JCWZvciAoaT0wOyBpPE5VTV9PRl9UWF9SSU5HOyBpKyspCi0JCXsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspIHsKIAkJCXBBZC0+VHhSaW5nW2ldLlR4U3dGcmVlSWR4ID0gMDsKIAkJCXBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4ID0gMDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIChUWF9DVFhfSURYMCArIGkgKiAweDEwKSAsICBwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCksCisJCQkJCXBBZC0+VHhSaW5nW2ldLlR4Q3B1SWR4KTsKIAkJfQogCX0KIAotCS8vIGluaXQgTUdNVCByaW5nIGluZGV4IHBvaW50ZXIKKwkvKiBpbml0IE1HTVQgcmluZyBpbmRleCBwb2ludGVyICovCiAJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IDA7CiAJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUdNVENUWF9JRFgsICBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4KTsKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7CiAKLQkvLwotCS8vIHNldCBlYWNoIFJpbmcncyBTSVpFICBpbnRvIEFTSUMuIERlc2NyaXB0b3IgU2l6ZSBpcyBmaXhlZCBieSBkZXNpZ24uCi0JLy8KKwkvKiAqLworCS8qIHNldCBlYWNoIFJpbmcncyBTSVpFICBpbnRvIEFTSUMuIERlc2NyaXB0b3IgU2l6ZSBpcyBmaXhlZCBieSBkZXNpZ24uICovCisJLyogKi8KIAotCS8vIFdyaXRlIFRYX1JJTkdfQ1NSMCByZWdpc3RlcgorCS8qIFdyaXRlIFRYX1JJTkdfQ1NSMCByZWdpc3RlciAqLwogCVZhbHVlID0gVFhfUklOR19TSVpFOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQwLCBWYWx1ZSk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDEsIFZhbHVlKTsKQEAgLTIwMjcsNTMgKzE0OTgsNDcgQEAKIAlWYWx1ZSA9IE1HTVRfUklOR19TSVpFOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRNQVhfQ05ULCBWYWx1ZSk7CiAKLQkvLyBXcml0ZSBSWF9SSU5HX0NTUiByZWdpc3RlcgorCS8qIFdyaXRlIFJYX1JJTkdfQ1NSIHJlZ2lzdGVyICovCiAJVmFsdWUgPSBSWF9SSU5HX1NJWkU7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfTUFYX0NOVCwgVmFsdWUpOwotI2VuZGlmIC8qIFJUMjg2MCAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0KLQkvLyBXTU0gcGFyYW1ldGVyCisJLyogV01NIHBhcmFtZXRlciAqLwogCWNzcjAud29yZCA9IDA7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCXsKLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCi0JfQotCWVsc2UKLQl7Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSAxOTI7CS8qIEFDX1ZJOiAxOTIqMzJ1cyB+PSA2bXMgKi8KKwkJY3NyMC5maWVsZC5BYzFUeG9wID0gOTY7CS8qIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMgKi8KKwl9IGVsc2UgeworCQljc3IwLmZpZWxkLkFjMFR4b3AgPSA5NjsJLyogQUNfVkk6IDk2KjMydXMgfj0gM21zICovCisJCWNzcjAuZmllbGQuQWMxVHhvcCA9IDQ4OwkvKiBBQ19WTzogNDgqMzJ1cyB+PSAxLjVtcyAqLwogCX0KIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDFfQ0ZHLCBjc3IwLndvcmQpOwogCi0KLSNpZmRlZiBSVDI4NjAKLQkvLyAzLiBTZXQgRE1BIGdsb2JhbCBjb25maWd1cmF0aW9uIGV4Y2VwdCBUWF9ETUFfRU4gYW5kIFJYX0RNQV9FTiBiaXRzOgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6ICovCiAJaSA9IDA7Ci0JZG8KLQl7CisJZG8gewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCisJCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKQorCQkgICAgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCiAJCQlicmVhazsKIAogCQlSVE1QdXNlY0RlbGF5KDEwMDApOwogCQlpKys7Ci0JfXdoaWxlICggaSA8IDEwMCk7CisJfSB3aGlsZSAoaSA8IDEwMCk7CiAKIAlHbG9DZmcud29yZCAmPSAweGZmMDsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0xOworCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPSAxOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKIAogCUludENmZy53b3JkID0gMDsKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCBJbnRDZmcud29yZCk7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCi0JLy8gcmVzZXQgYWN0aW9uCi0JLy8gTG9hZCBmaXJtd2FyZQotCS8vICBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwkvKiByZXNldCBhY3Rpb24gKi8KKwkvKiBMb2FkIGZpcm13YXJlICovCisJLyogIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOyAqLwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRpYWxpemVBZGFwdGVyXG4iKSk7CiAJcmV0dXJuIFN0YXR1czsKQEAgLTIwOTcsNDIgKzE1NjIsNTUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTCU5JQ0luaXRpYWxpemVBc2ljKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBCT09MRUFOCQliSGFyZFJlc2V0KQoraW50IE5JQ0luaXRpYWxpemVBc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiSGFyZFJlc2V0KQogewotCVVMT05HCQkJSW5kZXggPSAwOwotCVVDSEFSCQkJUjAgPSAweGZmOwotCVVJTlQzMgkJCU1hY0NzcjEyID0gMCwgQ291bnRlciA9IDA7Ci0jaWZkZWYgUlQyODcwCi0JVUlOVDMyCQkJTWFjQ3NyMCA9IDA7Ci0JTlRTVEFUVVMJCVN0YXR1czsKLQlVQ0hBUgkJCVZhbHVlID0gMHhmZjsKLQlVSU5UMzIJCQllRnVzZUN0cmw7Ci0jZW5kaWYKLQlVU0hPUlQJCQlLZXlJZHg7Ci0JSU5UCQkJCWksYXBpZHg7CisJdW5zaWduZWQgbG9uZyBJbmRleCA9IDA7CisJdTggUjAgPSAweGZmOworCXUzMiBNYWNDc3IxMiA9IDAsIENvdW50ZXIgPSAwOworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXUzMiBNYWNDc3IwID0gMDsKKwlpbnQgU3RhdHVzOworCXU4IFZhbHVlID0gMHhmZjsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKyNpZmRlZiBSVDMweHgKKwl1OCBiYnByZWcgPSAwOworCXU4IFJGVmFsdWUgPSAwOworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCXUxNiBLZXlJZHg7CisJaW50IGksIGFwaWR4OwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBc2ljXG4iKSk7CiAKLSNpZmRlZiBSVDI4NjAKLQlpZiAoYkhhcmRSZXNldCA9PSBUUlVFKQotCXsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgzKTsJLyogVG8gZml4IGRyaXZlciBkaXNhYmxlL2VuYWJsZSBoYW5nIGlzc3VlIHdoZW4gcmFkaW8gb2ZmICovCisJaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkgewogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4Myk7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JLy8KLQkvLyBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkgYWZ0ZXIgTklDTG9hZEZpcm13YXJlKCkuCi0JLy8KKworCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwKTsKKwkvKiBJbml0aWFsaXplIE1BQyByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspIHsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLAorCQkJCU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJfQorCisJeworCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fU1RBX01BQ19SRUdfUEFSTVM7IEluZGV4KyspIHsKKwkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwKKwkJCQkJU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkvKiAqLworCS8qIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeSBhZnRlciBOSUNMb2FkRmlybXdhcmUoKS4gKi8KKwkvKiAqLwogCUluZGV4ID0gMDsKIAotCS8vVG8gYXZvaWQgaGFuZy1vbiBpc3N1ZSB3aGVuIGludGVyZmFjZSB1cCBpbiBrZXJuZWwgMi40LAotCS8vd2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgIk1hY0NzcjAiIGluc3RlYWQgb2YgdXNpbmcgInBBZC0+TUFDVmVyc2lvbiIgZGlyZWN0bHkuCi0JZG8KLQl7CisJLypUbyBhdm9pZCBoYW5nLW9uIGlzc3VlIHdoZW4gaW50ZXJmYWNlIHVwIGluIGtlcm5lbCAyLjQsICovCisJLyp3ZSB1c2UgYSBsb2NhbCB2YXJpYWJsZSAiTWFjQ3NyMCIgaW5zdGVhZCBvZiB1c2luZyAicEFkLT5NQUNWZXJzaW9uIiBkaXJlY3RseS4gKi8KKwlkbyB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKIAogCQlpZiAoKE1hY0NzcjAgIT0gMHgwMCkgJiYgKE1hY0NzcjAgIT0gMHhGRkZGRkZGRikpCkBAIC0yMTQyLDggKzE2MjAsOSBAQAogCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOwogCiAJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQUNfQ1NSMCAgWyBWZXI6UmV2PTB4JTA4eF1cbiIsIHBBZC0+TUFDVmVyc2lvbikpOwotCS8vIHR1cm4gb24gYml0MTMgKHNldCB0byB6ZXJvKSBhZnRlciBydDI4NjBELiBUaGlzIGlzIHRvIHNvbHZlIGhpZ2gtY3VycmVudCBpc3N1ZS4KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKKwkvKiB0dXJuIG9uIGJpdDEzIChzZXQgdG8gemVybykgYWZ0ZXIgcnQyODYwRC4gVGhpcyBpcyB0byBzb2x2ZSBoaWdoLWN1cnJlbnQgaXNzdWUuICovCiAJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNDc3IxMik7CiAJTWFjQ3NyMTIgJj0gKH4weDIwMDApOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgTWFjQ3NyMTIpOwpAQCAtMjE1MSwyMDMgKzE2MzAsMjIzIEBACiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDMpOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFVTQl9ETUFfQ0ZHLCAweDApOwogCVN0YXR1cyA9IFJUVVNCVmVuZGVyUmVzZXQocEFkKTsKLSNlbmRpZgogCiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDApOwogCi0JLy8gSW5pdGlhbGl6ZSBNQUMgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotI2lmZGVmIFJUMjg2MAotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwotCX0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCWZvcihJbmRleD0wOyBJbmRleDxOVU1fTUFDX1JFR19QQVJNUzsgSW5kZXgrKykKLQl7Ci0jaWZkZWYgUlQzMDcwCi0JCWlmICgoTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyID09IFRYX1NXX0NGRzApICYmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSkpCi0JCXsKKwkvKiBJbml0aWFsaXplIE1BQyByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlICovCisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX01BQ19SRUdfUEFSTVM7IEluZGV4KyspIHsKKyNpZmRlZiBSVDMweHgKKwkJaWYgKChNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIgPT0gVFhfU1dfQ0ZHMCkKKwkJICAgICYmIChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwNzEocEFkKSB8fCBJU19SVDM1NzIocEFkKQorCQkJfHwgSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKSB7CiAJCQlNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUgPSAweDAwMDAwNDAwOwogCQl9Ci0jZW5kaWYgLy8gUlQzMDcwIC8vCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIChVU0hPUlQpTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAodTE2KU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwKKwkJCQlNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwogCX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KIAogCXsKLQkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX1NUQV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIChVU0hPUlQpU1RBTUFDUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBTVEFNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwotI2VuZGlmCisJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9TVEFfTUFDX1JFR19QQVJNUzsgSW5kZXgrKykgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwKKwkJCQkJKHUxNilTVEFNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsCisJCQkJCVNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CiAJCX0KIAl9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQkvLyBJbml0aWFsaXplIFJUMzA3MCBzZXJpYWwgTUFjIHJlZ2lzdGVycyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBSVDI4NzAgc2VyaWFsCi0JaWYgKElTX1JUMzA5MChwQWQpKQotCXsKKyNpZmRlZiBSVDMweHgKKwkvKiBJbml0aWFsaXplIFJUMzA3MCBzZXJpYWwgTUFDIHJlZ2lzdGVycyB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBSVDI4NzAgc2VyaWFsICovCisJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSB7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzEsIDApOwogCi0JCS8vIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQl7Ci0JCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkRBQ1Rlc3RCaXQgPT0gMSkKLQkJCXsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDFGKTsJLy8gVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseQorCQkvKiBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlICovCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkgeworCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpIHsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDJDKTsJLyogVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseSAqLworCQkJfSBlbHNlIHsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDBGKTsJLyogVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseSAqLwogCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MEYpOwkvLyBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDApOwogCQl9CisJfSBlbHNlIGlmIChJU19SVDMwNzAocEFkKSkgeworCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMSwgMCk7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDJDKTsJLyogVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseSAqLworCQl9IGVsc2UgeworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMCk7CisJCX0KIAl9Ci0jaWZkZWYgUlQyODcwCi0JZWxzZSBpZiAoSVNfUlQzMDcwKHBBZCkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcxLCAwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgxRik7CS8vIFRvIGZpeCB0aHJvdWdocHV0IGRyb3AgZHJhc3RpY2FsbHkKLQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCisjZW5kaWYgLyogUlQzMHh4IC8vICovCiAKLQkvLwotCS8vIEJlZm9yZSBwcm9ncmFtIEJCUCwgd2UgbmVlZCB0byB3YWl0IEJCUC9SRiBnZXQgd2FrZSB1cC4KLQkvLworCS8qICovCisJLyogQmVmb3JlIHByb2dyYW0gQkJQLCB3ZSBuZWVkIHRvIHdhaXQgQkJQL1JGIGdldCB3YWtlIHVwLiAqLworCS8qICovCiAJSW5kZXggPSAwOwotCWRvCi0JeworCWRvIHsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1RBVFVTX0NGRywgJk1hY0NzcjEyKTsKIAotCQlpZiAoKE1hY0NzcjEyICYgMHgwMykgPT0gMCkJLy8gaWYgQkIuUkYgaXMgc3RhYmxlCisJCWlmICgoTWFjQ3NyMTIgJiAweDAzKSA9PSAwKQkvKiBpZiBCQi5SRiBpcyBzdGFibGUgKi8KIAkJCWJyZWFrOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIE1BQ19TVEFUVVNfQ0ZHICA9IEJ1c3kgPSAleFxuIiwgTWFjQ3NyMTIpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDaGVjayBNQUNfU1RBVFVTX0NGRyAgPSBCdXN5ID0gJXhcbiIsIE1hY0NzcjEyKSk7CiAJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CiAJfSB3aGlsZSAoSW5kZXgrKyA8IDEwMCk7CiAKLSAgICAvLyBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUKLQkvLyBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8vIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQKKwkvKiBUaGUgY29tbWFuZHMgdG8gZmlybXdhcmUgc2hvdWxkIGJlIGFmdGVyIHRoZXNlIGNvbW1hbmRzLCB0aGVzZSBjb21tYW5kcyB3aWxsIGluaXQgZmlybXdhcmUgKi8KKwkvKiBQQ0kgYW5kIFVTQiBhcmUgbm90IHRoZSBzYW1lIGJlY2F1c2UgUENJIGRyaXZlciBuZWVkcyB0byB3YWl0IGZvciBQQ0kgYnVzIHJlYWR5ICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgMCk7CS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8KIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIDApOworI2lmZGVmIFJUMzA5MAorCS8qMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnPC0tICovCisJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAwLCAwLCAwKTsKKwkvKjIwMDgvMTEvMjg6S0ggYWRkIHRvIGZpeCB0aGUgZGVhZCByZiBmcmVxdWVuY3kgb2Zmc2V0IGJ1Zy0tPiAqLworI2VuZGlmIC8qIFJUMzA5MCAvLyAqLwogCVJUTVB1c2VjRGVsYXkoMTAwMCk7CiAKLQkvLyBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEKKwkvKiBSZWFkIEJCUCByZWdpc3RlciwgbWFrZSBzdXJlIEJCUCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgd3JpdGUgbmV3IGRhdGEgKi8KIAlJbmRleCA9IDA7Ci0JZG8KLQl7CisJZG8gewogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjAsICZSMCk7CiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJCUCB2ZXJzaW9uID0gJXhcbiIsIFIwKSk7CiAJfSB3aGlsZSAoKCsrSW5kZXggPCAyMCkgJiYgKChSMCA9PSAweGZmKSB8fCAoUjAgPT0gMHgwMCkpKTsKLQkvL0FTU0VSVChJbmRleCA8IDIwKTsgLy90aGlzIHdpbGwgY2F1c2UgQlNPRCBvbiBDaGVjay1idWlsZCBkcml2ZXIKKwkvKkFTU0VSVChJbmRleCA8IDIwKTsgLy90aGlzIHdpbGwgY2F1c2UgQlNPRCBvbiBDaGVjay1idWlsZCBkcml2ZXIgKi8KIAogCWlmICgoUjAgPT0gMHhmZikgfHwgKFIwID09IDB4MDApKQogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKIAotCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIEJCUFJlZ1RhYmxlW0luZGV4XS5WYWx1ZSk7CisJLyogSW5pdGlhbGl6ZSBCQlAgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZSAqLworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBJbmRleCsrKSB7CisJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsCisJCQkJCSAgICAgQkJQUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKIAl9CiAKLSNpZm5kZWYgUlQyODcwCi0JLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IEJCUF9SODQgd2l0aCAweDE5LiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCi0JaWYgKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmKSAhPSAweDAxMDEpCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDE5KTsKLSNlbHNlCi0JLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IEJCUF9SODQgd2l0aCAweDE5LiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCi0JLy8gUlQzMDkwIHNob3VsZCBub3QgcHJvZ3JhbSBCQlAgUjg0IHRvIDB4MTksIG90aGVyd2lzZSBUWCB3aWxsIGJsb2NrLgotCWlmICgoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkgJiYgKCFJU19SVDMweHgocEFkKSkpCisjaWZkZWYgUlRNUF9NQUNfUENJCisJLyogVE9ETzogc2hpYW5nLCBjaGVjayBNQUNWZXJzaW9uLCBjdXJyZW50bHksIHJidXMtYmFzZWQgY2hpcCB1c2UgdGhpcy4gKi8KKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg3MjAyMDApIHsKKwkJLyp1OCB2YWx1ZTsgKi8KKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTI7CisKKwkJLypkaXNhYmxlIE1MRCBieSBCcnVjZSAyMDA4MDcwNCAqLworCQkvKkJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwNSwgJnZhbHVlKTsgKi8KKwkJLypCQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMTA1LCB2YWx1ZSB8IDQpOyAqLworCisJCS8qTWF4aW11bSBQU0RVIGxlbmd0aCBmcm9tIDE2SyB0byAzMksgYnl0ZXMgKi8KKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQVhfTEVOX0NGRywgJnZhbHVlMik7CisJCXZhbHVlMiAmPSB+KDB4MyA8PCAxMik7CisJCXZhbHVlMiB8PSAoMHgyIDw8IDEyKTsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIHZhbHVlMik7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJLyogZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IEJCUF9SODQgd2l0aCAweDE5LiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuICovCisJLyogUlQzMDkwIHNob3VsZCBub3QgcHJvZ3JhbSBCQlAgUjg0IHRvIDB4MTksIG90aGVyd2lzZSBUWCB3aWxsIGJsb2NrLiAqLworCS8qMzA3MC83MS83MiwzMDkwLDMwOTBBKCBhcmUgaW5jbHVkZWQgaW4gUlQzMHh4KSwzNTcyLDMzOTAgKi8KKwlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpICE9IDB4MDEwMSkKKwkgICAgJiYgIShJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg0LCAweDE5KTsKIAotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JewkvL3VwZGF0ZSBmb3IgUlQzMDcwLzcxLzcyLzkwLzkxLzkyLgorI2lmZGVmIFJUMzB4eAorLyogYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAgKi8KKwlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsJLyp1cGRhdGUgZm9yIFJUMzA3MC83MS83Mi85MC85MS85MiwzNTcyLDMzOTAuICovCiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc5LCAweDEzKTsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODAsIDB4MDUpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MSwgMHgzMyk7CiAJfQogCi0JaWYgKElTX1JUMzA5MChwQWQpKQorCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDMzOTAocEFkKSkJLyogUlQzMDl4LCBSVDMwNzEvNzIgKi8KIAl7Ci0JCVVDSEFSCQliYnByZWc9MDsKLQotCQkvLyBlbmFibGUgREMgZmlsdGVyCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpCi0JCXsKKwkJLyogZW5hYmxlIERDIGZpbHRlciAqLworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSB7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDMsIDB4YzApOwogCQl9Ci0KLQkJLy8gaW1wcm92ZSBwb3dlciBjb25zdW1wdGlvbgorCQkvKiBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uICovCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTM4LCAmYmJwcmVnKTsKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQkJLy8gdHVybiBvZmYgdHggREFDXzEKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkgeworCQkJLyogdHVybiBvZmYgdHggREFDXzEgKi8KIAkJCWJicHJlZyA9IChiYnByZWcgfCAweDIwKTsKIAkJfQogCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCS8vIHR1cm4gb2ZmIHR4IEFEQ18xCisJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpIHsKKwkJCS8qIHR1cm4gb2ZmIHR4IEFEQ18xICovCiAJCQliYnByZWcgJj0gKH4weDIpOwogCQl9CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEzOCwgYmJwcmVnKTsKIAotCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uIGluIFJUMzA3MSBWZXIuRQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKQotCQl7CisJCS8qIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gaW4gUlQzMDcxIFZlci5FICovCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpIHsKIAkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsICZiYnByZWcpOwogCQkJYmJwcmVnICY9ICh+MHgzKTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMxLCBiYnByZWcpOwogCQl9CisJfSBlbHNlIGlmIChJU19SVDMwNzAocEFkKSkgeworCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjAxKSB7CisJCQkvKiBlbmFibGUgREMgZmlsdGVyICovCisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDMsIDB4YzApOworCisJCQkvKiBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uIGluIFJUMzA3MCBWZXIuRiAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgJmJicHJlZyk7CisJCQliYnByZWcgJj0gKH4weDMpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMzEsIGJicHJlZyk7CisJCX0KKwkJLyogVFhfTE8xX2VuLCBSRiBSMTcgcmVnaXN0ZXIgQml0IDMgdG8gMCAqLworCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOworCQlSRlZhbHVlICY9ICh+MHgwOCk7CisJCS8qIHRvIGZpeCByeCBsb25nIHJhbmdlIGlzc3VlICovCisJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHID09IDApIHsKKwkJCVJGVmFsdWUgfD0gMHgyMDsKKwkJfQorCQkvKiBzZXQgUkZfUjE3X2JpdFsyOjBdIGVxdWFsIHRvIEVFUFJPTSBzZXR0aW5nIGF0IDB4NDhoICovCisJCWlmIChwQWQtPlR4TWl4ZXJHYWluMjRHID49IDEpIHsKKwkJCVJGVmFsdWUgJj0gKH4weDcpOwkvKiBjbGVhbiBiaXQgWzI6MF0gKi8KKwkJCVJGVmFsdWUgfD0gcEFkLT5UeE1peGVyR2FpbjI0RzsKKwkJfQorCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsIFJGVmFsdWUpOwogCX0KLSNlbmRpZgotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQl7CisvKiBlbmQgam9obmxpICovCisjZW5kaWYgLyogUlQzMHh4IC8vICovCisKKwlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApIHsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMik7Ci0gICAgfQorCX0KIAotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzI4ODBFX1ZFUlNJT04gJiYgcEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzMwNzBfVkVSU0lPTikgLy8gMyozCisJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKQkvKiAzKjMgKi8KIAl7Ci0JCS8vIGVubGFyZ2UgTUFYX0xFTl9DRkcKLQkJVUlOVDMyIGNzcjsKKwkJLyogZW5sYXJnZSBNQVhfTEVOX0NGRyAqLworCQl1MzIgY3NyOwogCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BWF9MRU5fQ0ZHLCAmY3NyKTsKIAkJY3NyICY9IDB4RkZGOwogCQljc3IgfD0gMHgyMDAwOwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgY3NyKTsKIAl9Ci0KLSNpZmRlZiBSVDI4NzAKLXsKLQlVQ0hBUglNQUNfVmFsdWVbXT17MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwwLDB9OwotCi0JLy9Jbml0aWFsaXplIFdDSUQgdGFibGUKLQlWYWx1ZSA9IDB4ZmY7Ci0JZm9yKEluZGV4ID0wIDtJbmRleCA8IDI1NDtJbmRleCsrKQorI2lmZGVmIFJUTVBfTUFDX1VTQgogCXsKLQkJUlRVU0JNdWx0aVdyaXRlKHBBZCwgKFVTSE9SVCkoTUFDX1dDSURfQkFTRSArIEluZGV4ICogOCksIE1BQ19WYWx1ZSwgOCk7CisJCXU4IE1BQ19WYWx1ZVtdID0KKwkJICAgIHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMCwgMCB9OworCisJCS8qSW5pdGlhbGl6ZSBXQ0lEIHRhYmxlICovCisJCVZhbHVlID0gMHhmZjsKKwkJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgMjU0OyBJbmRleCsrKSB7CisJCQlSVFVTQk11bHRpV3JpdGUocEFkLAorCQkJCQkodTE2KShNQUNfV0NJRF9CQVNFICsgSW5kZXggKiA4KSwKKwkJCQkJTUFDX1ZhbHVlLCA4KTsKKwkJfQogCX0KLX0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vIEFkZCByYWRpbyBvZmYgY29udHJvbAorCS8qIEFkZCByYWRpbyBvZmYgY29udHJvbCAqLwogCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotLy8JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgwMDAwMTgxOCk7CisJCWlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpIHsKKy8qICAgICAgICAgICAgICAgICAgICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDAwMDAxODE4KTsgKi8KIAkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgUmFkaW8gT2ZmXG4iKSk7CiAJCX0KIAl9CiAKLQkvLyBDbGVhciByYXcgY291bnRlcnMKKwkvKiBDbGVhciByYXcgY291bnRlcnMgKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMSwgJkNvdW50ZXIpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZDb3VudGVyKTsKQEAgLTIzNTUsNjUgKzE4NTQsNTUgQEAKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwogCi0JLy8gQVNJQyB3aWxsIGtlZXAgZ2FyYmFnZSB2YWx1ZSBhZnRlciBib290Ci0JLy8gQ2xlYXIgYWxsIHNlYXJlZCBrZXkgdGFibGUgd2hlbiBpbml0aWFsCi0JLy8gVGhpcyByb3V0aW5lIGNhbiBiZSBpZ25vcmVkIGluIHJhZGlvLU9OL09GRiBvcGVyYXRpb24uCi0JaWYgKGJIYXJkUmVzZXQpCi0JewotCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQqS2V5SWR4LCAwKTsKKwkvKiBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QgKi8KKwkvKiBDbGVhciBhbGwgc2hhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwgKi8KKwkvKiBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4gKi8KKwlpZiAoYkhhcmRSZXNldCkgeworCQlmb3IgKEtleUlkeCA9IDA7IEtleUlkeCA8IDQ7IEtleUlkeCsrKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiBLZXlJZHgsCisJCQkJCTApOwogCQl9CiAKLQkJLy8gQ2xlYXIgYWxsIHBhaXJ3aXNlIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKLQkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCAyNTY7IEtleUlkeCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChLZXlJZHggKiBIV19XQ0lEX0FUVFJJX1NJWkUpLCAxKTsKKwkJLyogQ2xlYXIgYWxsIHBhaXJ3aXNlIGtleSB0YWJsZSB3aGVuIGluaXRpYWwgKi8KKwkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCAyNTY7IEtleUlkeCsrKSB7CisJCQlSVE1QX0lPX1dSSVRFMzIocEFkLAorCQkJCQlNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArCisJCQkJCShLZXlJZHggKiBIV19XQ0lEX0FUVFJJX1NJWkUpLCAxKTsKIAkJfQogCX0KKwkvKiBhc3NlcnQgSE9TVCByZWFkeSBiaXQgKi8KKy8qICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHgwKTsgLy8gMjAwNC0wOS0xNCBhc2tlZCBieSBNYXJrICovCisvKiAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4NCk7ICovCiAKLQotCS8vIEl0IGlzbid0IG5lY2Vzc2FyeSB0byBjbGVhciB0aGlzIHNwYWNlIHdoZW4gbm90IGhhcmQgcmVzZXQuCi0JaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkKLQl7Ci0JCS8vIGNsZWFyIGFsbCBvbi1jaGlwIEJFQUNPTiBmcmFtZSBzcGFjZQotCQlmb3IgKGFwaWR4ID0gMDsgYXBpZHggPCBIV19CRUFDT05fTUFYX0NPVU5UOyBhcGlkeCsrKQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSFdfQkVBQ09OX09GRlNFVD4+MjsgaSs9NCkKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFthcGlkeF0gKyBpLCAweDAwKTsKKwkvKiBJdCBpc24ndCBuZWNlc3NhcnkgdG8gY2xlYXIgdGhpcyBzcGFjZSB3aGVuIG5vdCBoYXJkIHJlc2V0LiAqLworCWlmIChiSGFyZFJlc2V0ID09IFRSVUUpIHsKKwkJLyogY2xlYXIgYWxsIG9uLWNoaXAgQkVBQ09OIGZyYW1lIHNwYWNlICovCisJCWZvciAoYXBpZHggPSAwOyBhcGlkeCA8IEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGFwaWR4KyspIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBIV19CRUFDT05fT0ZGU0VUID4+IDI7IGkgKz0gNCkKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLAorCQkJCQkJcEFkLT5CZWFjb25PZmZzZXRbYXBpZHhdICsgaSwKKwkJCQkJCTB4MDApOwogCQl9CiAJfQotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1VTQgogCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCS8vIENsZWFyIHJhdyBjb3VudGVycworCS8qIENsZWFyIHJhdyBjb3VudGVycyAqLwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDAsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwogCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZDb3VudGVyKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmQ291bnRlcik7CiAJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJkNvdW50ZXIpOwotCS8vIERlZmF1bHQgUENJIGNsb2NrIGN5Y2xlIHBlciBtcyBpcyBkaWZmZXJlbnQgYXMgZGVmYXVsdCBzZXR0aW5nLCB3aGljaCBpcyBiYXNlZCBvbiBQQ0kuCisJLyogRGVmYXVsdCBQQ0kgY2xvY2sgY3ljbGUgcGVyIG1zIGlzIGRpZmZlcmVudCBhcyBkZWZhdWx0IHNldHRpbmcsIHdoaWNoIGlzIGJhc2VkIG9uIFBDSS4gKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIFVTQl9DWUNfQ0ZHLCAmQ291bnRlcik7Ci0JQ291bnRlciY9MHhmZmZmZmYwMDsKLQlDb3VudGVyfD0weDAwMDAwMWU7CisJQ291bnRlciAmPSAweGZmZmZmZjAwOworCUNvdW50ZXIgfD0gMHgwMDAwMDFlOwogCVJUTVBfSU9fV1JJVEUzMihwQWQsIFVTQl9DWUNfQ0ZHLCBDb3VudGVyKTsKLQotCXBBZC0+YlVzZUVmdXNlPUZBTFNFOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybCk7Ci0JcEFkLT5iVXNlRWZ1c2UgPSAoIChlRnVzZUN0cmwgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKSA/IDEgOiAwOwotCWlmKHBBZC0+YlVzZUVmdXNlKQotCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5WTSBpcyBFZnVzZVxuIikpOwotCX0KLQllbHNlCi0JewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTlZNIGlzIEVFUFJPTVxuIikpOwotCX0KLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAJewotCQkvLyBmb3IgcnQyODYwRSBhbmQgYWZ0ZXIsIGluaXQgVFhPUF9DVFJMX0NGRyB3aXRoIDB4NTgzZi4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULgotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpICE9IDB4MDEwMSkKKwkJLyogZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IFRYT1BfQ1RSTF9DRkcgd2l0aCAweDU4M2YuIFRoaXMgaXMgZm9yIGV4dGVuc2lvbiBjaGFubmVsIG92ZXJsYXBwaW5nIElPVC4gKi8KKwkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpICE9IDB4MDEwMSkKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYT1BfQ1RSTF9DRkcsIDB4NTgzZik7CiAJfQogCkBAIC0yNDIxLDEzMyArMTkxMCw2IEBACiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQotI2lmZGVmIFJUMjg2MAotVk9JRCBOSUNSZXN0b3JlQkJQVmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJCWluZGV4OwotCVVDSEFSCQlWYWx1ZSA9IDA7Ci0JVUxPTkcJCURhdGE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+ICBOSUNSZXN0b3JlQkJQVmFsdWUgISEhISEhISEhISEhISEhISEhISEhISEgIFxuIikpOwotCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKHJ0bXBfaW5pdC5jKQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9CQlBfUkVHX1BBUk1TOyBpbmRleCsrKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUFJlZ1RhYmxlW2luZGV4XS5SZWdpc3RlciwgQkJQUmVnVGFibGVbaW5kZXhdLlZhbHVlKTsKLQl9Ci0JLy8gY29weSBmcm9tIChydG1wX2luaXQuYykKLQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDEyKTsKLQl9Ci0KLQkvLyBjb3B5IGZyb20gKGNvbm5lY3QuYyBMaW5rVXAgZnVuY3Rpb24pCi0JaWYgKElORlJBX09OKHBBZCkpCi0JewotCQkvLyBDaGFuZ2UgdG8gQVAgY2hhbm5lbAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCXsKLQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOwotCQkJVmFsdWUgJj0gKH4weDE4KTsKLQkJCVZhbHVlIHw9IDB4MTA7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7Ci0KLQkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkJVmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLQkJCS8vIFJlY29yZCBCQlBSMyBzZXR0aW5nLCBCdXQgZG9uJ3Qga2VlcCBSIEFudGVubmEgIyBpbmZvcm1hdGlvbi4KLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJCURhdGEgJj0gMHhmZmZmZmZmZTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQkJewotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQkJfQotCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJewotCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MTgpOwotCQkJVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOwotCQkJRGF0YSB8PSAweDE7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkJCVZhbHVlIHw9ICgweDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLQkJCS8vIFJlY29yZCBCQlBSMyBzZXR0aW5nLCBCdXQgZG9uJ3Qga2VlcCBSIEFudGVubmEgIyBpbmZvcm1hdGlvbi4KLQkJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0KLQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJCXsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7Ci0JCQl9Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IFVwcGVyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBVcHBlckNlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZWYWx1ZSk7Ci0JCQlWYWx1ZSAmPSAofjB4MTgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmRGF0YSk7Ci0JCQlEYXRhICY9IDB4ZmZmZmZmZmU7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7Ci0JCQkvLyBSZWNvcmQgQkJQUjMgc2V0dGluZywgQnV0IGRvbid0IGtlZXAgUiBBbnRlbm5hICMgaW5mb3JtYXRpb24uCi0JCQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotCi0JCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCQl7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhcnQyODYwQyAhISEgXG4iICkpOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEyME1IeiBMSU5LIFVQICEhISBcbiIgKSk7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tICBOSUNSZXN0b3JlQkJQVmFsdWUgISEhISEhISEhISEhISEhISEhISEhISEgIFxuIikpOwotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yNTY3LDE5ICsxOTI5LDIxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECU5JQ0lzc3VlUmVzZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIE5JQ0lzc3VlUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVJTlQzMglWYWx1ZSA9IDA7CisJdTMyIFZhbHVlID0gMDsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSXNzdWVSZXNldFxuIikpOwogCi0JLy8gRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQKKwkvKiBBYm9ydCBUeCwgcHJldmVudCBBU0lDIGZyb20gd3JpdGluZyB0byBIb3N0IG1lbW9yeSAqLworCS8qUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ05UTF9DU1IsIDB4MDAxZjAwMDApOyAqLworCisJLyogRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQgKi8KIAlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKIAlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7CiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7CiAKLQkvLyBJc3N1ZSByZXNldCBhbmQgY2xlYXIgZnJvbSByZXNldCBzdGF0ZQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgwMyk7IC8vIDIwMDQtMDktMTcgY2hhbmdlIGZyb20gMHgwMQorCS8qIElzc3VlIHJlc2V0IGFuZCBjbGVhciBmcm9tIHJlc2V0IHN0YXRlICovCisJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAzKTsJLyogMjAwNC0wOS0xNyBjaGFuZ2UgZnJvbSAweDAxICovCiAJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDAwKTsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJc3N1ZVJlc2V0XG4iKSk7CkBAIC0yNjAxLDEzNCArMTk2NSwxMTUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUJPT0xFQU4JTklDQ2hlY2tGb3JIYW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQorQk9PTEVBTiBOSUNDaGVja0Zvckhhbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCXJldHVybiAoRkFMU0UpOwogfQogCi1WT0lEIE5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlUWF9TVEFfRklGT19TVFJVQwlTdGFGaWZvOwotCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeTsKLQlVQ0hBUgkJCQlpID0gMDsKLQlVQ0hBUgkJCXBpZCA9IDAsIHdjaWQgPSAwOwotCUNIQVIJCQkJcmVUcnk7Ci0JVUNIQVIJCQkJc3VjY01DUzsKKwlUWF9TVEFfRklGT19TVFJVQyBTdGFGaWZvOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeTsKKwl1OCBpID0gMDsKKwl1OCBwaWQgPSAwLCB3Y2lkID0gMDsKKwljaGFyIHJlVHJ5OworCXU4IHN1Y2NNQ1M7CiAKLQkJZG8KLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfRklGTywgJlN0YUZpZm8ud29yZCk7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9GSUZPLCAmU3RhRmlmby53b3JkKTsKIAotCQkJaWYgKFN0YUZpZm8uZmllbGQuYlZhbGlkID09IDApCi0JCQkJYnJlYWs7CisJCWlmIChTdGFGaWZvLmZpZWxkLmJWYWxpZCA9PSAwKQorCQkJYnJlYWs7CiAKLQkJCXdjaWQgPSAoVUNIQVIpU3RhRmlmby5maWVsZC53Y2lkOwotCisJCXdjaWQgPSAodTgpU3RhRmlmby5maWVsZC53Y2lkOwogCiAJCS8qIGlnbm9yZSBOb0FDSyBhbmQgTUdNVCBmcmFtZSB1c2UgMHhGRiBhcyBXQ0lEICovCi0JCQlpZiAoKFN0YUZpZm8uZmllbGQuVHhBY2tSZXF1aXJlZCA9PSAwKSB8fCAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0JCQl7Ci0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBQSUQgc3RvcmUgVHggTUNTIFJhdGUgKi8KLQkJCXBpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLlBpZFR5cGU7Ci0KLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOwotCi0JCQlwRW50cnktPkRlYnVnRklGT0NvdW50Kys7Ci0KLQkJCWlmIChTdGFGaWZvLmZpZWxkLlR4QkYpIC8vIDMqMwotCQkJCXBFbnRyeS0+VHhCRkNvdW50Kys7Ci0KLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JCQlVQVBTRF9TUF9BVUVfSGFuZGxlKHBBZCwgcEVudHJ5LCBTdGFGaWZvLmZpZWxkLlR4U3VjY2Vzcyk7Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCi0JCQlpZiAoIVN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQotCQkJewotCQkJCXBFbnRyeS0+RklGT0NvdW50Kys7Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCsrOwotCi0JCQkJaWYgKHBFbnRyeS0+RklGT0NvdW50ID49IDEpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIjIikpOwotCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7Ci0KLQkJCQkJaWYocEVudHJ5LT5Qc01vZGUgPT0gUFdSX0FDVElWRSkKLQkJCQkJewotCQkJCQkJaW50IHRpZDsKLQkJCQkJCWZvciAodGlkPTA7IHRpZDxOVU1fT0ZfVElEOyB0aWQrKykKLQkJCQkJCXsKLQkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCAgdGlkLCBGQUxTRSwgRkFMU0UpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBVcGRhdGUgdGhlIGNvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIGNvdW50ZXIgZXhjZXB0IFBTIG1vZGUKLQkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQrKzsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIENsZWFyIHRoZSBGSUZPQ291bnQgd2hlbiBzdGEgaW4gUG93ZXIgU2F2ZSBtb2RlLiBCYXNpY2FsbHkgd2UgYXNzdW1lCi0JCQkJCQkvLyAgICAgdGhpcyB0eCBlcnJvciBoYXBwZW5lZCBkdWUgdG8gc3RhIGp1c3QgZ28gdG8gc2xlZXAuCi0JCQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoKHBFbnRyeS0+UHNNb2RlICE9IFBXUl9TQVZFKSAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOwotCQkJCQlpZiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bj09MCkKLQkJCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcEVudHJ5LT5GSUZPQ291bnQgPSAwOwotCQkJCXBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCsrOwotCQkJCS8vIHVwZGF0ZSBOb0RhdGFJZGxlQ291bnQgd2hlbiBzdWNlc3NmdWwgc2VuZCBwYWNrZXQgdG8gU1RBLgotCQkJCXBFbnRyeS0+Tm9EYXRhSWRsZUNvdW50ID0gMDsKLQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKLQkJCX0KLQotCQkJc3VjY01DUyA9IFN0YUZpZm8uZmllbGQuU3VjY2Vzc1JhdGUgJiAweDdGOwotCi0JCQlyZVRyeSA9IHBpZCAtIHN1Y2NNQ1M7Ci0KLQkJCWlmIChTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKLQkJCXsKLQkJCQlwRW50cnktPlRYTUNTRXhwZWN0ZWRbcGlkXSsrOwotCQkJCWlmIChwaWQgPT0gc3VjY01DUykKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+VFhNQ1NTdWNjZXNzZnVsW3BpZF0rKzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEVudHJ5LT5UWE1DU0F1dG9GYWxsQmFja1twaWRdW3N1Y2NNQ1NdKys7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBFbnRyeS0+VFhNQ1NGYWlsZWRbcGlkXSsrOwotCQkJfQotCi0JCQlpZiAocmVUcnkgPiAwKQotCQkJewotCQkJCWlmICgocGlkID49IDEyKSAmJiBzdWNjTUNTIDw9NykKLQkJCQl7Ci0JCQkJCXJlVHJ5IC09IDQ7Ci0JCQkJfQotCQkJCXBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gcmVUcnk7Ci0JCQl9Ci0KKwkJaWYgKChTdGFGaWZvLmZpZWxkLlR4QWNrUmVxdWlyZWQgPT0gMCkKKwkJICAgIHx8ICh3Y2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSkgewogCQkJaSsrOwotCQkJLy8gQVNJQyBzdG9yZSAxNiBzdGFjawotCQl9IHdoaWxlICggaSA8ICgyKlRYX1JJTkdfU0laRSkgKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUElEIHN0b3JlIFR4IE1DUyBSYXRlICovCisJCXBpZCA9ICh1OClTdGFGaWZvLmZpZWxkLlBpZFR5cGU7CisKKwkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbd2NpZF07CisKKwkJcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCsrOworCisJCWlmIChTdGFGaWZvLmZpZWxkLlR4QkYpCS8qIDMqMyAqLworCQkJcEVudHJ5LT5UeEJGQ291bnQrKzsKKworCQlpZiAoIVN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKSB7CisJCQlwRW50cnktPkZJRk9Db3VudCsrOworCQkJcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCsrOworCisJCQlpZiAocEVudHJ5LT5GSUZPQ291bnQgPj0gMSkgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiMiKSk7CisJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9IDY0OworCisJCQkJaWYgKHBFbnRyeS0+UHNNb2RlID09IFBXUl9BQ1RJVkUpIHsKKwkJCQkJaW50IHRpZDsKKwkJCQkJZm9yICh0aWQgPSAwOyB0aWQgPCBOVU1fT0ZfVElEOyB0aWQrKykgeworCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLAorCQkJCQkJCQkgICAgIHBFbnRyeS0+CisJCQkJCQkJCSAgICAgQWlkLCB0aWQsCisJCQkJCQkJCSAgICAgRkFMU0UsCisJCQkJCQkJCSAgICAgRkFMU0UpOworCQkJCQl9CisKKwkJCQkJLyogVXBkYXRlIHRoZSBjb250aW51b3VzIHRyYW5zbWlzc2lvbiBjb3VudGVyIGV4Y2VwdCBQUyBtb2RlICovCisJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBDbGVhciB0aGUgRklGT0NvdW50IHdoZW4gc3RhIGluIFBvd2VyIFNhdmUgbW9kZS4gQmFzaWNhbGx5IHdlIGFzc3VtZSAqLworCQkJCQkvKiAgICAgdGhpcyB0eCBlcnJvciBoYXBwZW5lZCBkdWUgdG8gc3RhIGp1c3QgZ28gdG8gc2xlZXAuICovCisJCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7CisJCQkJfQorCQkJCS8qcEVudHJ5LT5GSUZPQ291bnQgPSAwOyAqLworCQkJfQorCQkJLypwRW50cnktPmJTZW5kQkFSID0gVFJVRTsgKi8KKwkJfSBlbHNlIHsKKwkJCWlmICgocEVudHJ5LT5Qc01vZGUgIT0gUFdSX1NBVkUpCisJCQkgICAgJiYgKHBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24gPiAwKSkgeworCQkJCXBFbnRyeS0+Tm9CQURhdGFDb3VudERvd24tLTsKKwkJCQlpZiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9PSAwKSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkBcbiIpKTsKKwkJCQl9CisJCQl9CisKKwkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKKwkJCXBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCsrOworCQkJLyogdXBkYXRlIE5vRGF0YUlkbGVDb3VudCB3aGVuIHN1Y2Vzc2Z1bCBzZW5kIHBhY2tldCB0byBTVEEuICovCisJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7CisJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKKwkJfQorCisJCXN1Y2NNQ1MgPSBTdGFGaWZvLmZpZWxkLlN1Y2Nlc3NSYXRlICYgMHg3RjsKKworCQlyZVRyeSA9IHBpZCAtIHN1Y2NNQ1M7CisKKwkJaWYgKFN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKSB7CisJCQlwRW50cnktPlRYTUNTRXhwZWN0ZWRbcGlkXSsrOworCQkJaWYgKHBpZCA9PSBzdWNjTUNTKSB7CisJCQkJcEVudHJ5LT5UWE1DU1N1Y2Nlc3NmdWxbcGlkXSsrOworCQkJfSBlbHNlIHsKKwkJCQlwRW50cnktPlRYTUNTQXV0b0ZhbGxCYWNrW3BpZF1bc3VjY01DU10rKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBFbnRyeS0+VFhNQ1NGYWlsZWRbcGlkXSsrOworCQl9CisKKwkJaWYgKHJlVHJ5ID4gMCkgeworCQkJaWYgKChwaWQgPj0gMTIpICYmIHN1Y2NNQ1MgPD0gNykgeworCQkJCXJlVHJ5IC09IDQ7CisJCQl9CisJCQlwRW50cnktPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IHJlVHJ5OworCQl9CisKKwkJaSsrOworCQkvKiBBU0lDIHN0b3JlIDE2IHN0YWNrICovCisJfSB3aGlsZSAoaSA8ICgyICogVFhfUklOR19TSVpFKSk7CiAKIH0KIApAQCAtMjc0OSw4NyArMjA5NCw5OSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTklDVXBkYXRlUmF3Q291bnRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVJTlQzMglPbGRWYWx1ZTsKLQlSWF9TVEFfQ05UMF9TVFJVQwkgUnhTdGFDbnQwOwotCVJYX1NUQV9DTlQxX1NUUlVDICAgUnhTdGFDbnQxOwotCVJYX1NUQV9DTlQyX1NUUlVDICAgUnhTdGFDbnQyOwotCVRYX1NUQV9DTlQwX1NUUlVDIAkgVHhTdGFDbnQwOwotCVRYX1NUQV9DTlQxX1NUUlVDCSBTdGFUeDE7Ci0JVFhfU1RBX0NOVDJfU1RSVUMJIFN0YVR4MjsKLQlUWF9BR0dfQ05UX1NUUlVDCVR4QWdnQ250OwotCVRYX0FHR19DTlQwX1NUUlVDCVR4QWdnQ250MDsKLQlUWF9BR0dfQ05UMV9TVFJVQwlUeEFnZ0NudDE7Ci0JVFhfQUdHX0NOVDJfU1RSVUMJVHhBZ2dDbnQyOwotCVRYX0FHR19DTlQzX1NUUlVDCVR4QWdnQ250MzsKLQlUWF9BR0dfQ05UNF9TVFJVQwlUeEFnZ0NudDQ7Ci0JVFhfQUdHX0NOVDVfU1RSVUMJVHhBZ2dDbnQ1OwotCVRYX0FHR19DTlQ2X1NUUlVDCVR4QWdnQ250NjsKLQlUWF9BR0dfQ05UN19TVFJVQwlUeEFnZ0NudDc7CisJdTMyIE9sZFZhbHVlOwkvKiwgVmFsdWUyOyAqLworCS8qdW5zaWduZWQgbG9uZyBQYWdlU3VtLCBPbmVTZWNUcmFuc21pdENvdW50OyAqLworCS8qdW5zaWduZWQgbG9uZyBUeEVycm9yUmF0aW8sIFJldHJ5LCBGYWlsOyAqLworCVJYX1NUQV9DTlQwX1NUUlVDIFJ4U3RhQ250MDsKKwlSWF9TVEFfQ05UMV9TVFJVQyBSeFN0YUNudDE7CisJUlhfU1RBX0NOVDJfU1RSVUMgUnhTdGFDbnQyOworCVRYX1NUQV9DTlQwX1NUUlVDIFR4U3RhQ250MDsKKwlUWF9TVEFfQ05UMV9TVFJVQyBTdGFUeDE7CisJVFhfU1RBX0NOVDJfU1RSVUMgU3RhVHgyOworCVRYX0FHR19DTlRfU1RSVUMgVHhBZ2dDbnQ7CisJVFhfQUdHX0NOVDBfU1RSVUMgVHhBZ2dDbnQwOworCVRYX0FHR19DTlQxX1NUUlVDIFR4QWdnQ250MTsKKwlUWF9BR0dfQ05UMl9TVFJVQyBUeEFnZ0NudDI7CisJVFhfQUdHX0NOVDNfU1RSVUMgVHhBZ2dDbnQzOworCVRYX0FHR19DTlQ0X1NUUlVDIFR4QWdnQ250NDsKKwlUWF9BR0dfQ05UNV9TVFJVQyBUeEFnZ0NudDU7CisJVFhfQUdHX0NOVDZfU1RSVUMgVHhBZ2dDbnQ2OworCVRYX0FHR19DTlQ3X1NUUlVDIFR4QWdnQ250NzsKKwlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgKnBSYWxpbmtDb3VudGVyczsKKworCXBSYWxpbmtDb3VudGVycyA9ICZwQWQtPlJhbGlua0NvdW50ZXJzOwogCiAJUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJlJ4U3RhQ250MC53b3JkKTsKIAlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmUnhTdGFDbnQyLndvcmQpOwogCiAJewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQxLCAmUnhTdGFDbnQxLndvcmQpOwotCSAgICAvLyBVcGRhdGUgUlggUExDUCBlcnJvciBjb3VudGVyCi0JICAgIHBBZC0+UHJpdmF0ZUluZm8uUGh5UnhFcnJDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLlBsY3BFcnI7Ci0JCS8vIFVwZGF0ZSBGYWxzZSBDQ0EgY291bnRlcgotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ICs9IFJ4U3RhQ250MS5maWVsZC5GYWxzZUNjYTsKKwkJLyogVXBkYXRlIFJYIFBMQ1AgZXJyb3IgY291bnRlciAqLworCQlwQWQtPlByaXZhdGVJbmZvLlBoeVJ4RXJyQ250ICs9IFJ4U3RhQ250MS5maWVsZC5QbGNwRXJyOworCQkvKiBVcGRhdGUgRmFsc2UgQ0NBIGNvdW50ZXIgKi8KKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNGYWxzZUNDQUNudCArPQorCQkgICAgUnhTdGFDbnQxLmZpZWxkLkZhbHNlQ2NhOwogCX0KIAotCS8vIFVwZGF0ZSBGQ1MgY291bnRlcnMKLQlPbGRWYWx1ZT0gcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQ7Ci0JcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQgKz0gKFJ4U3RhQ250MC5maWVsZC5DcmNFcnIpOyAvLyA+PiA3KTsKKwkvKiBVcGRhdGUgRkNTIGNvdW50ZXJzICovCisJT2xkVmFsdWUgPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydDsKKwlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCArPSAoUnhTdGFDbnQwLmZpZWxkLkNyY0Vycik7CS8qID4+IDcpOyAqLwogCWlmIChwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQogCQlwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuSGlnaFBhcnQrKzsKIAotCS8vIEFkZCBGQ1MgZXJyb3IgY291bnQgdG8gcHJpdmF0ZSBjb3VudGVycwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhGY3NFcnJDbnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKLQlPbGRWYWx1ZSA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuTG93UGFydDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQwLmZpZWxkLkNyY0VycjsKLQlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0IDwgT2xkVmFsdWUpCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuUmVhbEZjc0VyckNvdW50LnUuSGlnaFBhcnQrKzsKKwkvKiBBZGQgRkNTIGVycm9yIGNvdW50IHRvIHByaXZhdGUgY291bnRlcnMgKi8KKwlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1J4RmNzRXJyQ250ICs9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7CisJT2xkVmFsdWUgPSBwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQ7CisJcFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7CisJaWYgKHBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQorCQlwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51LkhpZ2hQYXJ0Kys7CiAKLQkvLyBVcGRhdGUgRHVwbGljYXRlIFJjdiBjaGVjawotCXBBZC0+UmFsaW5rQ291bnRlcnMuRHVwbGljYXRlUmN2ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7Ci0JcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKLQkvLyBVcGRhdGUgUlggT3ZlcmZsb3cgY291bnRlcgorCS8qIFVwZGF0ZSBEdXBsaWNhdGUgUmN2IGNoZWNrICovCisJcFJhbGlua0NvdW50ZXJzLT5EdXBsaWNhdGVSY3YgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKKwlwQWQtPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCArPQorCSAgICBSeFN0YUNudDIuZmllbGQuUnhEdXBsaUNvdW50OworCS8qIFVwZGF0ZSBSWCBPdmVyZmxvdyBjb3VudGVyICovCiAJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciArPSAoUnhTdGFDbnQyLmZpZWxkLlJ4Rmlmb092ZXJmbG93Q291bnQpOwogCi0jaWZkZWYgUlQyODcwCi0JaWYgKHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudCAhPSBwQWQtPndhdGNoRG9nUnhDbnQpCi0JewotCQlwQWQtPndhdGNoRG9nUnhDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQ7CisJLypwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgPSAwOyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCWlmIChwUmFsaW5rQ291bnRlcnMtPlJ4Q291bnQgIT0gcEFkLT53YXRjaERvZ1J4Q250KSB7CisJCXBBZC0+d2F0Y2hEb2dSeENudCA9IHBSYWxpbmtDb3VudGVycy0+UnhDb3VudDsKIAkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWlmIChSeFN0YUNudDIuZmllbGQuUnhGaWZvT3ZlcmZsb3dDb3VudCkKIAkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250Kys7CiAJCWVsc2UKIAkJCXBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID0gMDsKIAl9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQotCWlmICghcEFkLT5iVXBkYXRlQmNuQ250RG9uZSkKLQl7Ci0JLy8gVXBkYXRlIEJFQUNPTiBzZW50IGNvdW50Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJlR4U3RhQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDIsICZTdGFUeDIud29yZCk7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ICs9IFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OworCS8qaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpIHx8ICovCisJLyogICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSAmJiAocEFkLT5NYWNUYWIuU2l6ZSAhPSAxKSkpICovCisJaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKSB7CisJCS8qIFVwZGF0ZSBCRUFDT04gc2VudCBjb3VudCAqLworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQxLCAmU3RhVHgxLndvcmQpOworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmU3RhVHgyLndvcmQpOworCQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY0JlYWNvblNlbnRDbnQgKz0KKwkJICAgIFR4U3RhQ250MC5maWVsZC5UeEJlYWNvbkNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9CisJCSAgICBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OworCQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKz0KKwkJICAgIFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7CisJCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhGYWlsQ291bnQgKz0KKwkJICAgIFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKKwkJcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LnUuTG93UGFydCArPQorCQkgICAgU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKKwkJcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7CisJCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPQorCQkgICAgVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwogCX0KIAorCS8qaWYgKHBBZC0+YlN0YUZpZm9UZXN0ID09IFRSVUUpICovCiAJewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQsICZUeEFnZ0NudC53b3JkKTsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKQEAgLTI4NDAsNjAgKzIxOTcsODkgQEAKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5BZ2dUeENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4Tm9uQWdnQ291bnQgKz0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzFNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMk1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2czTVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzRNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnNU1QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c2TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnN01QRFVDb3VudCArPSBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UeEFnZzhNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHhBZ2c5TVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTBNUERVQ291bnQgKz0gVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnN01QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c4TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZThDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzlNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250NC5maWVsZC5BZ2dTaXplOUNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTBNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTFNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEyTVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxM01QRFVDb3VudCArPQorCQkgICAgVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTRNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTRDb3VudDsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTVNUERVQ291bnQgKz0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlR4QWdnMTZNUERVQ291bnQgKz0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50OworCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTVNUERVQ291bnQgKz0KKwkJICAgIFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudDsKKwkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzE2TVBEVUNvdW50ICs9CisJCSAgICBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7CiAKLQkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CisJCS8qIENhbGN1bGF0ZSB0aGUgdHJhbnNtaXR0ZWQgQS1NUERVIGNvdW50ICovCisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUxQ291bnQ7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplM0NvdW50IC8gMyk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNUNvdW50IC8gNSk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50IC8gNyk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemU5Q291bnQgLyA5KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ0LmZpZWxkLkFnZ1NpemUxMENvdW50IC8gMTApOwogCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50IC8gMTEpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTJDb3VudCAvIDEyKTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50IC8gMTEpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7CiAKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOworCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0KKwkJICAgIChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTRDb3VudCAvIDE0KTsKIAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudCAvIDE1KTsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQgLyAxNik7CisJCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPQorCQkgICAgKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTVDb3VudCAvIDE1KTsKKwkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9CisJCSAgICAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNkNvdW50IC8gMTYpOwogCX0KIAotCi0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yOTEzLDI1ICsyMjk5LDMzIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECU5JQ1Jlc2V0RnJvbUVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBOSUNSZXNldEZyb21FcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JLy8gUmVzZXQgQkJQIChhY2NvcmRpbmcgdG8gYWxleCwgcmVzZXQgQVNJQyB3aWxsIGZvcmNlIHJlc2V0IEJCUAotCS8vIFRoZXJlZm9yZSwgc2tpcCB0aGUgcmVzZXQgQkJQCi0JLy8gUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4Mik7CisJLyogUmVzZXQgQkJQIChhY2NvcmRpbmcgdG8gYWxleCwgcmVzZXQgQVNJQyB3aWxsIGZvcmNlIHJlc2V0IEJCUCAqLworCS8qIFRoZXJlZm9yZSwgc2tpcCB0aGUgcmVzZXQgQkJQICovCisJLyogUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjEsIDB4Mik7ICovCiAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7Ci0JLy8gUmVtb3ZlIEFTSUMgZnJvbSByZXNldCBzdGF0ZQorCS8qIFJlbW92ZSBBU0lDIGZyb20gcmVzZXQgc3RhdGUgKi8KIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7CiAKIAlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIEZBTFNFKTsKIAlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKIAotCS8vIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4KKwkvKiBTd2l0Y2ggdG8gY3VycmVudCBjaGFubmVsLCBzaW5jZSBkdXJpbmcgcmVzZXQgcHJvY2VzcywgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHJlbWFpbnMgb24uICovCiAJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwogCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKIH0KIAoraW50IE5JQ0xvYWRGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJaW50IHN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJaWYgKHBBZC0+Y2hpcE9wcy5sb2FkRmlybXdhcmUpCisJCXN0YXR1cyA9IHBBZC0+Y2hpcE9wcy5sb2FkRmlybXdhcmUocEFkKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI5NDUsMTAwICsyMzM5LDEyIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIE5JQ0VyYXNlRmlybXdhcmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIE5JQ0VyYXNlRmlybXdhcmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVMT05HIGk7CisJaWYgKHBBZC0+Y2hpcE9wcy5lcmFzZUZpcm13YXJlKQorCQlwQWQtPmNoaXBPcHMuZXJhc2VGaXJtd2FyZShwQWQpOwogCi0JZm9yKGk9MDsgaTxNQVhfRklSTVdBUkVfSU1BR0VfU0laRTsgaSs9NCkKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIDApOwotCi19LyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUxvYWQgODA1MSBmaXJtd2FyZSBSVDI1NjEuQklOIGZpbGUgaW50byBNQUMgQVNJQwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgZmlybXdhcmUgaW1hZ2UgbG9hZCBvawotCQlORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgaW1hZ2Ugbm90IGZvdW5kCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOwotCVVMT05HCQkJRmlsZUxlbmd0aCwgSW5kZXg7Ci0JLy9VTE9ORwkJCWZpcm07Ci0JVUlOVDMyCQkJTWFjUmVnID0gMDsKLSNpZmRlZiBSVDI4NzAKLQlVSU5UMzIJCQlWZXJzaW9uID0gKHBBZC0+TUFDVmVyc2lvbiA+PiAxNik7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7Ci0JRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKLSNpZmRlZiBSVDI4NzAKLQkvLyBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyCi0JLy9wcmludGsoIlVzYiBDaGlwXG4iKTsKLQlpZiAoRklSTVdBUkVJTUFHRV9MRU5HVEggPT0gRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RIKQotCS8vVGhlIGZpcm13YXJlIGltYWdlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cy4gT25lIGlzIHRoZSBvcmlnaWFubCBhbmQgdGhlIG90aGVyIGlzIHRoZSBuZXcuCi0JLy9Vc2UgU2Vjb25kIFBhcnQKLQl7Ci0JCWlmICgoVmVyc2lvbiAhPSAweDI4NjApICYmIChWZXJzaW9uICE9IDB4Mjg3MikgJiYgKFZlcnNpb24gIT0gMHgzMDcwKSkKLQkJewkvLyBVc2UgRmlybXdhcmUgVjIuCi0JCQkvL3ByaW50aygiS0g6VXNlIE5ldyBWZXJzaW9uLHBhcnQyXG4iKTsKLQkJCXBGaXJtd2FyZUltYWdlID0gKFBVQ0hBUikmRmlybXdhcmVJbWFnZVtGSVJNV0FSRUlNQUdFVjFfTEVOR1RIXTsKLQkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RIOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy9wcmludGsoIktIOlVzZSBOZXcgVmVyc2lvbixwYXJ0MVxuIik7Ci0JCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7Ci0JCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRVYxX0xFTkdUSDsKLQkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLSDogYmluIGZpbGUgc2hvdWxkIGJlIDhLQi5cbiIpKTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCVJUMjhYWF9XUklURV9GSVJNV0FSRShwQWQsIHBGaXJtd2FyZUltYWdlLCBGaWxlTGVuZ3RoKTsKLQotCS8qIGNoZWNrIGlmIE1DVSBpcyByZWFkeSAqLwotCUluZGV4ID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBQQkZfU1lTX0NUUkwsICZNYWNSZWcpOwotCi0JCWlmIChNYWNSZWcgJiAweDgwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9IHdoaWxlIChJbmRleCsrIDwgMTAwMCk7Ci0KLSAgICBpZiAoSW5kZXggPiAxMDAwKQotCXsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZEZpcm13YXJlOiBNQ1UgaXMgbm90IHJlYWR5XG5cblxuIikpOwotCX0gLyogRW5kIG9mIGlmICovCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCSAoIjw9PT0gJXMgKHN0YXR1cz0lZClcbiIsIF9fZnVuY19fLCBTdGF0dXMpKTsKLSAgICByZXR1cm4gU3RhdHVzOwotfSAvKiBFbmQgb2YgTklDTG9hZEZpcm13YXJlICovCi0KK30JCQkJLyogRW5kIG9mIE5JQ0VyYXNlRmlybXdhcmUgKi8KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTMwNjEsOCArMjM2Nyw3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK2ludCBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0zMDcxLDUzICsyMzc2LDYgQEAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCWlmICBwU3JjMSBhbGwgemVybyB3aXRoIGxlbmd0aCBMZW5ndGgsIHJldHVybiAwLgotCQlJZiBub3QgYWxsIHplcm8sIHJldHVybiAxCi0KLQlBcmd1bWVudHM6Ci0JCXBTcmMxCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCTE6CQkJbm90IGFsbCB6ZXJvCi0JCTA6CQkJYWxsIHplcm8KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVMT05HCVJUTVBOb3RBbGxaZXJvKAotCUlOCVBWT0lECXBTcmMxLAotCUlOCVVMT05HCUxlbmd0aCkKLXsKLQlQVUNIQVIJcE1lbTE7Ci0JVUxPTkcJSW5kZXggPSAwOwotCi0JcE1lbTEgPSAoUFVDSEFSKSBwU3JjMTsKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKLQl7Ci0JCWlmIChwTWVtMVtJbmRleF0gIT0gMHgwKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChJbmRleCA9PSBMZW5ndGgpCi0JewotCQlyZXR1cm4gKDApOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gKDEpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246CiAJCUNvbXBhcmUgdHdvIG1lbW9yeSBibG9jawogCiAJQXJndW1lbnRzOgpAQCAtMzEzNSwyNyArMjM5MywyMyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVUxPTkcJUlRNUENvbXBhcmVNZW1vcnkoCi0JSU4JUFZPSUQJcFNyYzEsCi0JSU4JUFZPSUQJcFNyYzIsCi0JSU4JVUxPTkcJTGVuZ3RoKQordW5zaWduZWQgbG9uZyBSVE1QQ29tcGFyZU1lbW9yeSh2b2lkICpwU3JjMSwgdm9pZCAqcFNyYzIsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKQogewotCVBVQ0hBUglwTWVtMTsKLQlQVUNIQVIJcE1lbTI7Ci0JVUxPTkcJSW5kZXggPSAwOworCXU4ICpwTWVtMTsKKwl1OCAqcE1lbTI7CisJdW5zaWduZWQgbG9uZyBJbmRleCA9IDA7CiAKLQlwTWVtMSA9IChQVUNIQVIpIHBTcmMxOwotCXBNZW0yID0gKFBVQ0hBUikgcFNyYzI7CisJcE1lbTEgPSAodTggKilwU3JjMTsKKwlwTWVtMiA9ICh1OCAqKXBTcmMyOwogCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspIHsKIAkJaWYgKHBNZW0xW0luZGV4XSA+IHBNZW0yW0luZGV4XSkKIAkJCXJldHVybiAoMSk7CiAJCWVsc2UgaWYgKHBNZW0xW0luZGV4XSA8IHBNZW0yW0luZGV4XSkKIAkJCXJldHVybiAoMik7CiAJfQogCi0JLy8gRXF1YWwKKwkvKiBFcXVhbCAqLwogCXJldHVybiAoMCk7CiB9CiAKQEAgLTMxNzksMzcgKzI0MzMsMTggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFplcm9NZW1vcnkoCi0JSU4JUFZPSUQJcFNyYywKLQlJTglVTE9ORwlMZW5ndGgpCit2b2lkIFJUTVBaZXJvTWVtb3J5KHZvaWQgKnBTcmMsIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKQogewotCVBVQ0hBUglwTWVtOwotCVVMT05HCUluZGV4ID0gMDsKKwl1OCAqcE1lbTsKKwl1bnNpZ25lZCBsb25nIEluZGV4ID0gMDsKIAotCXBNZW0gPSAoUFVDSEFSKSBwU3JjOworCXBNZW0gPSAodTggKilwU3JjOwogCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKKwlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspIHsKIAkJcE1lbVtJbmRleF0gPSAweDAwOwogCX0KIH0KIAotVk9JRAlSVE1QRmlsbE1lbW9yeSgKLQlJTglQVk9JRAlwU3JjLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglVQ0hBUglGaWxsKQotewotCVBVQ0hBUglwTWVtOwotCVVMT05HCUluZGV4ID0gMDsKLQotCXBNZW0gPSAoUFVDSEFSKSBwU3JjOwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTGVuZ3RoOyBJbmRleCsrKQotCXsKLQkJcE1lbVtJbmRleF0gPSBGaWxsOwotCX0KLX0KLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzIzMSwyMiArMjQ2NiwxOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QTW92ZU1lbW9yeSgKLQlPVVQJUFZPSUQJcERlc3QsCi0JSU4JUFZPSUQJcFNyYywKLQlJTglVTE9ORwlMZW5ndGgpCit2b2lkIFJUTVBNb3ZlTWVtb3J5KHZvaWQgKnBEZXN0LCB2b2lkICpwU3JjLCB1bnNpZ25lZCBsb25nIExlbmd0aCkKIHsKLQlQVUNIQVIJcE1lbTE7Ci0JUFVDSEFSCXBNZW0yOwotCVVJTlQJSW5kZXg7CisJdTggKnBNZW0xOworCXU4ICpwTWVtMjsKKwl1MzIgSW5kZXg7CiAKLQlBU1NFUlQoKExlbmd0aD09MCkgfHwgKHBEZXN0ICYmIHBTcmMpKTsKKwlBU1NFUlQoKExlbmd0aCA9PSAwKSB8fCAocERlc3QgJiYgcFNyYykpOwogCi0JcE1lbTEgPSAoUFVDSEFSKSBwRGVzdDsKLQlwTWVtMiA9IChQVUNIQVIpIHBTcmM7CisJcE1lbTEgPSAodTggKilwRGVzdDsKKwlwTWVtMiA9ICh1OCAqKXBTcmM7CiAKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JeworCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykgewogCQlwTWVtMVtJbmRleF0gPSBwTWVtMltJbmRleF07CiAJfQogfQpAQCAtMzI2OSwxNyArMjUwMCwxNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlVc2VyQ2ZnSW5pdCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgVXNlckNmZ0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotICAgIFVJTlQga2V5X2luZGV4LCBic3NfaW5kZXg7CisJdTMyIGtleV9pbmRleCwgYnNzX2luZGV4OwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFVzZXJDZmdJbml0XG4iKSk7CiAKLQkvLwotCS8vICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbgotCS8vCi0jaWZkZWYgUlQyODcwCisJLyogKi8KKwkvKiAgcGFydCBJLiBpbnRpYWxpemUgY29tbW9uIGNvbmZpZ3VyYXRpb24gKi8KKwkvKiAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgogCXBBZC0+QnVsa091dFJlcSA9IDA7CiAKIAlwQWQtPkJ1bGtPdXRDb21wbGV0ZSA9IDA7CkBAIC0zMjg5LDcyICsyNTE5LDcxIEBACiAJcEFkLT5CdWxrSW5Db21wbGV0ZSA9IDA7CiAJcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwgPSAwOwogCi0JLy9wQWQtPlF1aWNrVGltZXJQID0gMTAwOwotCS8vcEFkLT5UdXJuQWdnckJ1bGtJbkNvdW50ID0gMDsKKwkvKnBBZC0+UXVpY2tUaW1lclAgPSAxMDA7ICovCisJLypwQWQtPlR1cm5BZ2dyQnVsa0luQ291bnQgPSAwOyAqLwogCXBBZC0+YlVzYlR4QnVsa0FnZ3JlID0gMDsKIAotCS8vIGluaXQgYXMgdW5zZWQgdmFsdWUgdG8gZW5zdXJlIGRyaXZlciB3aWxsIHNldCB0byBNQ1Ugb25jZS4KLQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAweEZGOworCS8qIGluaXQgYXMgdW5zZWQgdmFsdWUgdG8gZW5zdXJlIGRyaXZlciB3aWxsIHNldCB0byBNQ1Ugb25jZS4gKi8KKwlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMHhGRjsKIAogCXBBZC0+Q29tbW9uQ2ZnLk1heFBrdE9uZVR4QnVsayA9IDI7CiAJcEFkLT5Db21tb25DZmcuVHhCdWxrRmFjdG9yID0gMTsKLQlwQWQtPkNvbW1vbkNmZy5SeEJ1bGtGYWN0b3IgPTE7CisJcEFkLT5Db21tb25DZmcuUnhCdWxrRmFjdG9yID0gMTsKIAotCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyID0gMTAwOwkvKm1XICovCiAKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0pKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybSwKKwkJICAgICAgIHNpemVvZihwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtKSk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQlmb3Ioa2V5X2luZGV4PTA7IGtleV9pbmRleDxTSEFSRV9LRVlfTlVNOyBrZXlfaW5kZXgrKykKLQl7Ci0JCWZvcihic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspCi0JCXsKKwlmb3IgKGtleV9pbmRleCA9IDA7IGtleV9pbmRleCA8IFNIQVJFX0tFWV9OVU07IGtleV9pbmRleCsrKSB7CisJCWZvciAoYnNzX2luZGV4ID0gMDsgYnNzX2luZGV4IDwgTUFYX01CU1NJRF9OVU07IGJzc19pbmRleCsrKSB7CiAJCQlwQWQtPlNoYXJlZEtleVtic3NfaW5kZXhdW2tleV9pbmRleF0uS2V5TGVuID0gMDsKLQkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5DaXBoZXJBbGcgPQorCQkJICAgIENJUEhFUl9OT05FOwogCQl9CiAJfQogCi0jaWZkZWYgUlQyODcwCiAJcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLSNlbmRpZgorCiAJcEFkLT5BbnRlbm5hLndvcmQgPSAwOwogCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwogCiAJcEFkLT5MZWRDbnRsLndvcmQgPSAwOwotI2lmZGVmIFJUMjg2MAotCXBBZC0+TGVkSW5kaWNhdG9yU3RyZWd0aCA9IDA7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDA7CiAJcEFkLT5STG5rQ3RybE9mZnNldCA9IDA7CiAJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IDA7CisJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID0gVFJVRTsKIAlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCi0JcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwkJCS8vIERlZmF1bHQgaXMgT0ZGCisJcEFkLT5iQXV0b1R4QWdjQSA9IEZBTFNFOwkvKiBEZWZhdWx0IGlzIE9GRiAqLworCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsJLyogRGVmYXVsdCBpcyBPRkYgKi8KIAlwQWQtPlJmSWNUeXBlID0gUkZJQ18yODIwOwogCi0JLy8gSW5pdCB0aW1lciBmb3IgcmVzZXQgY29tcGxldGUgZXZlbnQKKwkvKiBJbml0IHRpbWVyIGZvciByZXNldCBjb21wbGV0ZSBldmVudCAqLwogCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMTsKIAlwQWQtPmJGb3JjZVByaW50VFggPSBGQUxTRTsKIAlwQWQtPmJGb3JjZVByaW50UlggPSBGQUxTRTsKIAlwQWQtPmJTdGFGaWZvVGVzdCA9IEZBTFNFOwogCXBBZC0+YlByb3RlY3Rpb25UZXN0ID0gRkFMU0U7Ci0JcEFkLT5iSENDQVRlc3QgPSBGQUxTRTsKLQlwQWQtPmJHZW5PbmVIQ0NBID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuRHNpZnMgPSAxMDsgICAgICAvLyBpbiB1bml0cyBvZiB1c2VjCi0JcEFkLT5Db21tb25DZmcuVHhQb3dlciA9IDEwMDsgLy9tVwotCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gMHhmZmZmZmZmZjsgLy8gQVVUTwotCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gMHhmZmZmZmZmZjsgLy8gQVVUTwotCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlQXV0bzsgLy8gdXNlIExvbmcgcHJlYW1ibGUgb24gVFggYnkgZGVmYXV0CisJcEFkLT5Db21tb25DZmcuRHNpZnMgPSAxMDsJLyogaW4gdW5pdHMgb2YgdXNlYyAqLworCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7CS8qbVcgKi8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7CS8qIEFVVE8gKi8KKwlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7CS8qIEFVVE8gKi8KKwlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87CS8qIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dCAqLwogCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKIAlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OwogCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKLQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCi0JcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7Ci0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCisJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMDsJLyogMDogQVVUTyAqLworCXBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ID0gVFJVRTsJLyowOyAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOwkvKiB1bmtub3duICovCiAJcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOwogCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7CiAJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7CiAJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7CisKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSA2NTsKIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gMzsKIAlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKQEAgLTMzNjcsMTggKzI1OTYsMjIgQEAKIAogCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkJlYWNvblR4V0ksIHNpemVvZihwQWQtPkJlYWNvblR4V0kpKTsKIAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOwogCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7CiAJcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOwogCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKIAotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkgICAgICAgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbykpOwogCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE1NUFNfRU5BQkxFOwogCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IDA7CiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IElNTUVEX0JBOwotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsgLy8zMjsKLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFVzZXJDZmdJbml0LiBCQUNhcGFiaWxpdHkgPSAweCV4XG4iLCBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCkpOworCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSA2NDsJLyozMjsgKi8KKwlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuVHhCQVdpbkxpbWl0ID0gNjQ7CS8qMzI7ICovCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCkpOwogCiAJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IEZBTFNFOwogCUJBVGFibGVJbml0KHBBZCwgJnBBZC0+QkFUYWJsZSk7CkBAIC0zMzg2LDI4ICsyNjE5LDM1IEBACiAJcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOwogCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOwogCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOworCS8qMjAwOC8xMS8wNTpLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLSAqLworCXBBZC0+Q29tbW9uQ2ZnLmJHcmVlbkFQRW5hYmxlID0gRkFMU0U7CisJLyoyMDA4LzExLzA1OktIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+ICovCiAJcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwogCXBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOwogCi0JcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSA3OworCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkgeworCQlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IDEzOwkvKmJ5IEplcnJ5IHJlY29tbWVuZCAqLworCX0gZWxzZSB7CisJCXBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplID0gNzsKKwl9CiAKIAlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkOwogCi0JLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7CisJLypwQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsgKi8KKwkvKnBBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsgKi8KKwkvKnBBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfODAwOyAqLworCS8qcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7ICovCiAJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV82OwogCiAJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE1DU19SQVRFXzY7CiAJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLkJXID0gQldfMjA7CiAJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07CiAKLQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAxMDA7ICAgICAvLyBpbiBtU2VjCisJcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kID0gMTAwOwkvKiBpbiBtU2VjICovCiAKLQkvLwotCS8vIHBhcnQgSUkuIGludGlhbGl6ZSBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbgotCS8vCisJLyogKi8KKwkvKiBwYXJ0IElJLiBpbnRpYWxpemUgU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KKwkvKiAqLwogCXsKIAkJUlhfRklMVEVSX1NFVF9GTEFHKHBBZCwgZlJYX0ZJTFRFUl9BQ0NFUFRfRElSRUNUKTsKIAkJUlhfRklMVEVSX0NMRUFSX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9NVUxUSUNBU1QpOwpAQCAtMzQyMiwyMiArMjY2MiwyMyBAQAogCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gRkFMU0U7CiAJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CiAKLQkJLy8gODAyLjF4IHBvcnQgY29udHJvbAorCQkvKiA4MDIuMXggcG9ydCBjb250cm9sICovCiAJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwogCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKIAkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCAgICAgICAgPSAwOwotCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAgICAgID0gRkFMU0U7Ci0JCXBBZC0+U3RhQ2ZnLldwYVN0YXRlICAgICAgICAgPSBTU19OT1RVU0U7CisJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9IDA7CisJCXBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwogCi0JCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CQkvLyBOZXcgdG8gc3VwcG9ydCBtaWNyb3NvZnQgZGlzYWJsZSByYWRpbyB3aXRoIE9JRCBjb21tYW5kCisJCXBBZC0+Q29tbW9uQ2ZnLk5kaXNSYWRpb1N0YXRlT2ZmID0gRkFMU0U7CS8qIE5ldyB0byBzdXBwb3J0IG1pY3Jvc29mdCBkaXNhYmxlIHJhZGlvIHdpdGggT0lEIGNvbW1hbmQgKi8KIAogCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlciA9IDA7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBzaXplb2YoUlNTSV9TQU1QTEUpKTsKLQkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXJNb2RlID0gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQ7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBzaXplb2Yoc3RydWN0IHJ0X3Jzc2lfc2FtcGxlKSk7CisJCXBBZC0+U3RhQ2ZnLlJzc2lUcmlnZ2VyTW9kZSA9CisJCSAgICBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRDsKIAkJcEFkLT5TdGFDZmcuQXRpbVdpbiA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ly9kZWZhdWx0IGxpc3RlbiBjb3VudDsKLQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0Mgb3IgQlNTX01PTklUT1IKKwkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsJLypkZWZhdWx0IGxpc3RlbiBjb3VudDsgKi8KKwkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsJLyogQlNTX0lORlJBIG9yIEJTU19BREhPQyBvciBCU1NfTU9OSVRPUiAqLwogCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKQEAgLTM0NDYsMTU4ICsyNjg3LDE3NCBAQAogCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwogCX0KIAotCS8vIGdsb2JhbCB2YXJpYWJsZXMgbVhYWFggdXNlZCBpbiBNQUMgcHJvdG9jb2wgc3RhdGUgbWFjaGluZXMKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwlwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID0gRkFMU0U7CisvKktIIERlYnVnOnRoZSBmb2xsb3dpbmcgbXVzdCBiZSByZW1vdmVkICovCisJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9IDM7CisJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3QgPSAwOworCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTSA9IDE7CisjZW5kaWYgLyogUENJRV9QU19TVVBQT1JUIC8vICovCisKKwkvKiBnbG9iYWwgdmFyaWFibGVzIG1YWFhYIHVzZWQgaW4gTUFDIHByb3RvY29sIHN0YXRlIG1hY2hpbmVzICovCiAJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7CiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwogCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKIAotCS8vIFBIWSBzcGVjaWZpY2F0aW9uCi0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkJLy8gZGVmYXVsdCBQSFkgbW9kZQotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7ICAvLyBDQ0sgdXNlIExPTkcgcHJlYW1ibGUKKwkvKiBQSFkgc3BlY2lmaWNhdGlvbiAqLworCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR19NSVhFRDsJLyogZGVmYXVsdCBQSFkgbW9kZSAqLworCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7CS8qIENDSyB1c2UgbG9uZyBwcmVhbWJsZSAqLwogCiAJewotCQkvLyB1c2VyIGRlc2lyZWQgcG93ZXIgbW9kZQorCQkvKiB1c2VyIGRlc2lyZWQgcG93ZXIgbW9kZSAqLwogCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKIAkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwogCQlwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID0gRkFMU0U7CiAKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKKwkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwKKwkJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKSwKKwkJCSAgICAgIHBBZCwgRkFMU0UpOwogCQlwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmcgPSBGQUxTRTsKIAotCQkvLyBQYXRjaCBmb3IgTmR0ZXN0CisJCS8qIFBhdGNoIGZvciBOZHRlc3QgKi8KIAkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7CiAKLQkJLy8gQ0NYIDIuMCBjb250cm9sIGZsYWcgaW5pdAotCQlwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSA9IE1TUk5fVFlQRV9VTlVTRUQ7Ci0JCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7Ci0JCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01heAk9IDEwOworCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CS8qIERlZmF1bHQgSGFyZHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uICovCisJCXBBZC0+U3RhQ2ZnLmJTd1JhZGlvID0gVFJVRTsJLyogRGVmYXVsdCBTb2Z0d2FyZSBSYWRpbyBzdGF0dXMgaXMgT24gKi8KKwkJcEFkLT5TdGFDZmcuYlJhZGlvID0gVFJVRTsJLyogYkh3UmFkaW8gJiYgYlN3UmFkaW8gKi8KKwkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsJLyogRGVmYXVsdCBpcyBPRkYgKi8KKwkJcEFkLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID0gRkFMU0U7CS8qIERlZmF1bHQgbm8gc2hvdyAqLwogCi0JCXBBZC0+U3RhQ2ZnLmJId1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgSGFyZHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCi0JCXBBZC0+U3RhQ2ZnLmJTd1JhZGlvICA9IFRSVUU7IC8vIERlZmF1bHQgU29mdHdhcmUgUmFkaW8gc3RhdHVzIGlzIE9uCi0JCXBBZC0+U3RhQ2ZnLmJSYWRpbyAgICA9IFRSVUU7IC8vIGJId1JhZGlvICYmIGJTd1JhZGlvCi0JCXBBZC0+U3RhQ2ZnLmJIYXJkd2FyZVJhZGlvID0gRkFMU0U7CQkvLyBEZWZhdWx0IGlzIE9GRgotCQlwQWQtPlN0YUNmZy5iU2hvd0hpZGRlblNTSUQgPSBGQUxTRTsJCS8vIERlZmF1bHQgbm8gc2hvdwotCi0JCS8vIE5pdHJvIG1vZGUgY29udHJvbAorCQkvKiBOaXRybyBtb2RlIGNvbnRyb2wgKi8KIAkJcEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwogCi0JCS8vIFNhdmUgdGhlIGluaXQgdGltZSBhcyBsYXN0IHNjYW4gdGltZSwgdGhlIHN5c3RlbSBzaG91bGQgZG8gc2NhbiBhZnRlciAyIHNlY29uZHMuCi0JCS8vIFRoaXMgcGF0Y2ggaXMgZm9yIGRyaXZlciB3YWtlIHVwIGZyb20gc3RhbmRieSBtb2RlLCBzeXN0ZW0gd2lsbCBkbyBzY2FuIHJpZ2h0IGF3YXkuCi0JCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IDA7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+bmlja25hbWUsIElXX0VTU0lEX01BWF9TSVpFKzEpOwotCQlzcHJpbnRmKHBBZC0+bmlja25hbWUsICIlcyIsIFNUQV9OSUNfREVWSUNFX05BTUUpOwotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpLCBwQWQsIEZBTFNFKTsKKwkJLyogU2F2ZSB0aGUgaW5pdCB0aW1lIGFzIGxhc3Qgc2NhbiB0aW1lLCB0aGUgc3lzdGVtIHNob3VsZCBkbyBzY2FuIGFmdGVyIDIgc2Vjb25kcy4gKi8KKwkJLyogVGhpcyBwYXRjaCBpcyBmb3IgZHJpdmVyIHdha2UgdXAgZnJvbSBzdGFuZGJ5IG1vZGUsIHN5c3RlbSB3aWxsIGRvIHNjYW4gcmlnaHQgYXdheS4gKi8KKwkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lKTsKKwkJaWYgKHBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA+IDEwICogT1NfSFopCisJCQlwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgLT0gKDEwICogT1NfSFopOworCisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+bmlja25hbWUsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCXNwcmludGYoKGNoYXIgKilwQWQtPm5pY2tuYW1lLCAiUlQyODYwU1RBIik7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCXNwcmludGYoKGNoYXIgKilwQWQtPm5pY2tuYW1lLCAiUlQyODcwU1RBIik7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsCisJCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpLAorCQkJICAgICAgcEFkLCBGQUxTRSk7CiAJCXBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwogCQlwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IEZBTFNFOwogCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOworCQlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gRkFMU0U7CiAJCXBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKKworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKKworCQlwQWQtPlN0YUNmZy5iQXV0b0Nvbm5lY3RCeUJzc2lkID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lID0gQkVBQ09OX0xPU1RfVElNRTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgNjQpOworCQlwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID0gMDsKKwkJcEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nID0gRkFMU0U7CisJCXBBZC0+U3RhQ2ZnLmJGb3JjZVR4QnVyc3QgPSBGQUxTRTsKIAl9CiAKLQkvLyBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQKKwkvKiBEZWZhdWx0IGZvciBleHRyYSBpbmZvcm1hdGlvbiBpcyBub3QgdmFsaWQgKi8KIAlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7CiAKLQkvLyBEZWZhdWx0IENvbmZpZyBjaGFuZ2UgZmxhZworCS8qIERlZmF1bHQgQ29uZmlnIGNoYW5nZSBmbGFnICovCiAJcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOwogCi0JLy8KLQkvLyBwYXJ0IElJSS4gQVAgY29uZmlndXJhdGlvbnMKLQkvLworCS8qICovCisJLyogcGFydCBJSUkuIEFQIGNvbmZpZ3VyYXRpb25zICovCisJLyogKi8KIAotCi0JLy8KLQkvLyBwYXJ0IElWLiBvdGhlcnMKLQkvLwotCS8vIGR5bmFtaWMgQkJQIFI2NjpzZW5zaWJpdHkgdHVuaW5nIHRvIG92ZXJjb21lIGJhY2tncm91bmQgbm9pc2UKLQlwQWQtPkJicFR1bmluZy5iRW5hYmxlICAgICAgICAgICAgICAgID0gVFJVRTsKKwkvKiAqLworCS8qIHBhcnQgSVYuIG90aGVycyAqLworCS8qICovCisJLyogZHluYW1pYyBCQlAgUjY2OnNlbnNpYml0eSB0dW5pbmcgdG8gb3ZlcmNvbWUgYmFja2dyb3VuZCBub2lzZSAqLworCXBBZC0+QmJwVHVuaW5nLmJFbmFibGUgPSBUUlVFOwogCXBBZC0+QmJwVHVuaW5nLkZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQgPSAxMDA7CiAJcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCA9IDUxMjsKLQlwQWQtPkJicFR1bmluZy5SNjZEZWx0YSAgICAgICAgICAgICAgID0gNDsKKwlwQWQtPkJicFR1bmluZy5SNjZEZWx0YSA9IDQ7CiAJcEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrID0gVFJVRTsKIAotCS8vCi0JLy8gQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLgotCS8vIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4KLQkvLworCS8qICovCisJLyogQWxzbyBpbml0aWFsIFI2NkN1cnJlbnRWYWx1ZSwgUlRVU0JSZXN1bWVNc2R1VHJhbnNtaXNzaW9uIG1pZ2h0IHVzZSB0aGlzIHZhbHVlLiAqLworCS8qIGlmIG5vdCBpbml0aWFsIHRoaXMgdmFsdWUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgMC4gKi8KKwkvKiAqLwogCXBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSA9IDB4Mzg7CiAKIAlwQWQtPkJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7CiAJcEFkLT5CYnBGb3JDQ0sgPSBGQUxTRTsKIAotCS8vIGluaXRpYWxpemUgTUFDIHRhYmxlIGFuZCBhbGxvY2F0ZSBzcGluIGxvY2sKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NYWNUYWIsIHNpemVvZihNQUNfVEFCTEUpKTsKKwkvKiBEZWZhdWx0IGlzIEZBTFNFIGZvciB0ZXN0IGJpdCAxICovCisJLypwQWQtPmJUZXN0MSA9IEZBTFNFOyAqLworCisJLyogaW5pdGlhbGl6ZSBNQUMgdGFibGUgYW5kIGFsbG9jYXRlIHNwaW4gbG9jayAqLworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKHN0cnVjdCBydF9tYWNfdGFibGUpKTsKIAlJbml0aWFsaXplUXVldWVIZWFkZXIoJnBBZC0+TWFjVGFiLk1jYXN0UHNRdWV1ZSk7CiAJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKKwkvKlJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5SRUNCQVRpbWVyLCBSRUNCQVRpbWVyVGltZW91dCwgcEFkLCBUUlVFKTsgKi8KKwkvKlJUTVBTZXRUaW1lcigmcEFkLT5SRUNCQVRpbWVyLCBSRU9SREVSX0VYRUNfSU5UVik7ICovCisKIAlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgPSBGQUxTRTsKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAogCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gVXNlckNmZ0luaXRcbiIpKTsKIH0KIAotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLVVDSEFSIEJ0b0goY2hhciBjaCkKKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCit1OCBCdG9IKGNoYXIgY2gpCiB7Ci0JaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHJldHVybiAoY2ggLSAnMCcpOyAgICAgICAgLy8gSGFuZGxlIG51bWVyYWxzCi0JaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHJldHVybiAoY2ggLSAnQScgKyAweEEpOyAgLy8gSGFuZGxlIGNhcGl0b2wgaGV4IGRpZ2l0cwotCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSByZXR1cm4gKGNoIC0gJ2EnICsgMHhBKTsgIC8vIEhhbmRsZSBzbWFsbCBoZXggZGlnaXRzCi0JcmV0dXJuKDI1NSk7CisJaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisJCXJldHVybiAoY2ggLSAnMCcpOwkvKiBIYW5kbGUgbnVtZXJhbHMgKi8KKwlpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKKwkJcmV0dXJuIChjaCAtICdBJyArIDB4QSk7CS8qIEhhbmRsZSBjYXBpdG9sIGhleCBkaWdpdHMgKi8KKwlpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKKwkJcmV0dXJuIChjaCAtICdhJyArIDB4QSk7CS8qIEhhbmRsZSBzbWFsbCBoZXggZGlnaXRzICovCisJcmV0dXJuICgyNTUpOwogfQogCi0vLwotLy8gIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgVUNIQVIgKiwgaW50KQotLy8KLS8vICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4Ci0vLwotLy8gIFBBUkFNRVRFUlM6Ci0vLyAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZwotLy8gICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4Ci0vLyAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0Ci0vLwotLy8gIENPTU1FTlRTOgotLy8KLS8vICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIKLS8vICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLgotLy8KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCisvKiAqLworLyogIEZVTkNUSU9OOiBBdG9IKGNoYXIgKiwgdTggKiwgaW50KSAqLworLyogKi8KKy8qICBQVVJQT1NFOiAgQ29udmVydHMgYXNjaWkgc3RyaW5nIHRvIG5ldHdvcmsgb3JkZXIgaGV4ICovCisvKiAqLworLyogIFBBUkFNRVRFUlM6ICovCisvKiAgICBzcmMgICAgLSBwb2ludGVyIHRvIGlucHV0IGFzY2lpIHN0cmluZyAqLworLyogICAgZGVzdCAgIC0gcG9pbnRlciB0byBvdXRwdXQgaGV4ICovCisvKiAgICBkZXN0bGVuIC0gc2l6ZSBvZiBkZXN0ICovCisvKiAqLworLyogIENPTU1FTlRTOiAqLworLyogKi8KKy8qICAgIDIgYXNjaWkgYnl0ZXMgbWFrZSBhIGhleCBieXRlIHNvIG11c3QgcHV0IDFzdCBhc2NpaSBieXRlIG9mIHBhaXIgKi8KKy8qICAgIGludG8gdXBwZXIgbmliYmxlIGFuZCAybmQgYXNjaWkgYnl0ZSBvZiBwYWlyIGludG8gbG93ZXIgbmliYmxlLiAqLworLyogKi8KKy8qIElSUUwgPSBQQVNTSVZFX0xFVkVMICovCiAKLXZvaWQgQXRvSChjaGFyICogc3JjLCBVQ0hBUiAqIGRlc3QsIGludCBkZXN0bGVuKQordm9pZCBBdG9IKGNoYXIgKnNyYywgdTggKmRlc3QsIGludCBkZXN0bGVuKQogewotCWNoYXIgKiBzcmNwdHI7Ci0JUFVDSEFSIGRlc3RUZW1wOworCWNoYXIgKnNyY3B0cjsKKwl1OCAqZGVzdFRlbXA7CiAKIAlzcmNwdHIgPSBzcmM7Ci0JZGVzdFRlbXAgPSAoUFVDSEFSKSBkZXN0OworCWRlc3RUZW1wID0gKHU4ICopZGVzdDsKIAotCXdoaWxlKGRlc3RsZW4tLSkKLQl7Ci0JCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgotCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KKwl3aGlsZSAoZGVzdGxlbi0tKSB7CisJCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OwkvKiBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLiAqLworCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOwkvKiBBZGQgMm5kIGFzY2lpIGJ5dGUgdG8gYWJvdmUuICovCiAJCWRlc3RUZW1wKys7CiAJfQogfQogCi1WT0lECVJUTVBQYXRjaE1hY0JicEJ1ZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVTE9ORwlJbmRleDsKLQotCS8vIEluaXRpYWxpemUgQkJQIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fQkJQX1JFR19QQVJNUzsgSW5kZXgrKykKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIsIChVQ0hBUilCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwotCX0KLQotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0JLy8gUmUtaW5pdCBCQlAgcmVnaXN0ZXIgZnJvbSBFRVBST00gdmFsdWUKLQlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKLX0KKy8qKysrTWFyayBieSBzaGlhbmcsIG5vdCB1c2Ugbm93LCBuZWVkIHRvIHJlbW92ZSBhZnRlciBjb25maXJtICovCisvKi0tLU1hcmsgYnkgc2hpYW5nLCBub3QgdXNlIG5vdywgbmVlZCB0byByZW1vdmUgYWZ0ZXIgY29uZmlybSAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzYxOCwyOSArMjg3NSwyNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QSW5pdFRpbWVyKAotCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVBWT0lECQkJCQlwVGltZXJGdW5jLAotCUlOCVBWT0lECQkJCQlwRGF0YSwKLQlJTglCT09MRUFOCQkJCQlSZXBlYXQpCit2b2lkIFJUTVBJbml0VGltZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIsCisJCSAgIHZvaWQgKnBUaW1lckZ1bmMsIHZvaWQgKnBEYXRhLCBJTiBCT09MRUFOIFJlcGVhdCkKIHsKLQkvLwotCS8vIFNldCBWYWxpZCB0byBUUlVFIGZvciBsYXRlciB1c2VkLgotCS8vIEl0IHdpbGwgY3Jhc2ggaWYgd2UgY2FuY2VsIGEgdGltZXIgb3Igc2V0IGEgdGltZXIKLQkvLyB0aGF0IHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZSBiZWZvcmUuCi0JLy8KLQlwVGltZXItPlZhbGlkICAgICAgPSBUUlVFOworCS8qICovCisJLyogU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuICovCisJLyogSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lciAqLworCS8qIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4gKi8KKwkvKiAqLworCXBUaW1lci0+VmFsaWQgPSBUUlVFOwogCiAJcFRpbWVyLT5QZXJpb2RpY1R5cGUgPSBSZXBlYXQ7Ci0JcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JcFRpbWVyLT5jb29raWUgPSAoVUxPTkcpIHBEYXRhOworCXBUaW1lci0+U3RhdGUgPSBGQUxTRTsKKwlwVGltZXItPmNvb2tpZSA9ICh1bnNpZ25lZCBsb25nKXBEYXRhOwogCi0jaWZkZWYgUlQyODcwCisjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKIAlwVGltZXItPnBBZCA9IHBBZDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLwogCi0JUlRNUF9PU19Jbml0X1RpbWVyKHBBZCwJJnBUaW1lci0+VGltZXJPYmosCXBUaW1lckZ1bmMsIChQVk9JRCkgcFRpbWVyKTsKKwlSVE1QX09TX0luaXRfVGltZXIocEFkLCAmcFRpbWVyLT5UaW1lck9iaiwgcFRpbWVyRnVuYywgKHZvaWQgKilwVGltZXIpOwogfQogCiAvKgpAQCAtMzY2MSwzMiArMjkxNSwyMyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QU2V0VGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSkKK3ZvaWQgUlRNUFNldFRpbWVyKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwgdW5zaWduZWQgbG9uZyBWYWx1ZSkKIHsKLQlpZiAocFRpbWVyLT5WYWxpZCkKLQl7CisJaWYgKHBUaW1lci0+VmFsaWQpIHsKIAkJcFRpbWVyLT5UaW1lclZhbHVlID0gVmFsdWU7Ci0JCXBUaW1lci0+U3RhdGUgICAgICA9IEZBTFNFOwotCQlpZiAocFRpbWVyLT5QZXJpb2RpY1R5cGUgPT0gVFJVRSkKLQkJeworCQlwVGltZXItPlN0YXRlID0gRkFMU0U7CisJCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKSB7CiAJCQlwVGltZXItPlJlcGVhdCA9IFRSVUU7CiAJCQlSVE1QX1NldFBlcmlvZGljVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7CiAJCQlSVE1QX09TX0FkZF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwogCQl9Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJREJHUFJJTlRfRVJSKCgiUlRNUFNldFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzcwNSwyOCArMjk1MCwyMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QTW9kVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSkKK3ZvaWQgUlRNUE1vZFRpbWVyKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwgdW5zaWduZWQgbG9uZyBWYWx1ZSkKIHsKLQlCT09MRUFOCUNhbmNlbDsKKwlCT09MRUFOIENhbmNlbDsKIAotCWlmIChwVGltZXItPlZhbGlkKQotCXsKKwlpZiAocFRpbWVyLT5WYWxpZCkgewogCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKLQkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQotCQl7CisJCXBUaW1lci0+U3RhdGUgPSBGQUxTRTsKKwkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpIHsKIAkJCVJUTVBDYW5jZWxUaW1lcihwVGltZXIsICZDYW5jZWwpOwogCQkJUlRNUFNldFRpbWVyKHBUaW1lciwgVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJUlRNUF9PU19Nb2RfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIFZhbHVlKTsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCURCR1BSSU5UX0VSUigoIlJUTVBNb2RUaW1lciBmYWlsZWQsIFRpbWVyIGhhc24ndCBiZWVuIGluaXRpYWxpemUhXG4iKSk7CiAJfQogfQpAQCAtMzc1MiwzMiArMjk4OSwyMyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QQ2FuY2VsVGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCU9VVAlCT09MRUFOCQkJCQkqcENhbmNlbGxlZCkKK3ZvaWQgUlRNUENhbmNlbFRpbWVyKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwgT1VUIEJPT0xFQU4gKiBwQ2FuY2VsbGVkKQogewotCWlmIChwVGltZXItPlZhbGlkKQotCXsKKwlpZiAocFRpbWVyLT5WYWxpZCkgewogCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKIAkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7Ci0JCQlSVE1QX09TX0RlbF9UaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgcENhbmNlbGxlZCk7CisKKwkJUlRNUF9PU19EZWxfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBDYW5jZWxsZWQpOwogCiAJCWlmICgqcENhbmNlbGxlZCA9PSBUUlVFKQogCQkJcFRpbWVyLT5TdGF0ZSA9IFRSVUU7CiAKLSNpZmRlZiBSVDI4NzAKLQkJLy8gV2UgbmVlZCB0byBnby10aHJvdWdoIHRoZSBUaW1lclEgdG8gZmluZG91dCB0aGlzIHRpbWVyIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBpZgotCQkvLwkJaXQncyBzdGlsbCB3YWl0aW5nIGZvciBleGVjdXRpb24uCi0KLQkJUlQyODcwX1RpbWVyUV9SZW1vdmUocFRpbWVyLT5wQWQsIHBUaW1lcik7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JfQotCWVsc2UKLQl7Ci0JCS8vCi0JCS8vIE5kaXNNQ2FuY2VsVGltZXIganVzdCBjYW5jZWQgdGhlIHRpbWVyIGFuZCBub3QgbWVhbiByZWxlYXNlIHRoZSB0aW1lci4KLQkJLy8gQW5kIGRvbid0IHNldCB0aGUgIlZhbGlkIiB0byBGYWxzZS4gU28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgdGltZXIgYWdhaW4uCi0JCS8vCisjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKKwkJLyogV2UgbmVlZCB0byBnby10aHJvdWdoIHRoZSBUaW1lclEgdG8gZmluZG91dCB0aGlzIHRpbWVyIGhhbmRsZXIgYW5kIHJlbW92ZSBpdCBpZiAqLworCQkvKiAgICAgICAgICAgICAgaXQncyBzdGlsbCB3YWl0aW5nIGZvciBleGVjdXRpb24uICovCisJCVJ0bXBUaW1lclFSZW1vdmUocFRpbWVyLT5wQWQsIHBUaW1lcik7CisjZW5kaWYgLyogUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8gKi8KKwl9IGVsc2UgewogCQlEQkdQUklOVF9FUlIoKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOwogCX0KIH0KQEAgLTM4MDIsNjQgKzMwMzAsNjQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRNUFNldExFRCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4gVUNIQVIJCQlTdGF0dXMpCit2b2lkIFJUTVBTZXRMRUQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBTdGF0dXMpCiB7Ci0JLy9VTE9ORwkJCWRhdGE7Ci0JVUNIQVIJCQlIaWdoQnl0ZSA9IDA7Ci0JVUNIQVIJCQlMb3dCeXRlOworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgZGF0YTsgKi8KKwl1OCBIaWdoQnl0ZSA9IDA7CisJdTggTG93Qnl0ZTsKIAotCUxvd0J5dGUgPSBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSYweDdmOwotCXN3aXRjaCAoU3RhdHVzKQotCXsKLQkJY2FzZSBMRURfTElOS19ET1dOOgotCQkJSGlnaEJ5dGUgPSAweDIwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlwQWQtPkxlZEluZGljYXRvclN0cmVndGggPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX0xJTktfVVA6Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQkJCUhpZ2hCeXRlID0gMHhhMDsKLQkJCWVsc2UKLQkJCQlIaWdoQnl0ZSA9IDB4NjA7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9SQURJT19PTjoKLQkJCUhpZ2hCeXRlID0gMHgyMDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX0hBTFQ6Ci0JCQlMb3dCeXRlID0gMDsgLy8gRHJpdmVyIHNldHMgTUFDIHJlZ2lzdGVyIGFuZCBNQUMgY29udHJvbHMgTEVECi0JCWNhc2UgTEVEX1JBRElPX09GRjoKLQkJCUhpZ2hCeXRlID0gMDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgTEVEX1dQUzoKLQkJCUhpZ2hCeXRlID0gMHgxMDsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX09OX1NJVEVfU1VSVkVZOgotCQkJSGlnaEJ5dGUgPSAweDA4OwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfUE9XRVJfVVA6Ci0JCQlIaWdoQnl0ZSA9IDB4MDQ7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0TEVEOjpVbmtub3duIFN0YXR1cyAlZFxuIiwgU3RhdHVzKSk7Ci0JCQlicmVhazsKKwlMb3dCeXRlID0gcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUgJiAweDdmOworCXN3aXRjaCAoU3RhdHVzKSB7CisJY2FzZSBMRURfTElOS19ET1dOOgorCQlIaWdoQnl0ZSA9IDB4MjA7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMDsKKwkJYnJlYWs7CisJY2FzZSBMRURfTElOS19VUDoKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKKwkJCUhpZ2hCeXRlID0gMHhhMDsKKwkJZWxzZQorCQkJSGlnaEJ5dGUgPSAweDYwOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfUkFESU9fT046CisJCUhpZ2hCeXRlID0gMHgyMDsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCWJyZWFrOworCWNhc2UgTEVEX0hBTFQ6CisJCUxvd0J5dGUgPSAwOwkvKiBEcml2ZXIgc2V0cyBNQUMgcmVnaXN0ZXIgYW5kIE1BQyBjb250cm9scyBMRUQgKi8KKwljYXNlIExFRF9SQURJT19PRkY6CisJCUhpZ2hCeXRlID0gMDsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCWJyZWFrOworCWNhc2UgTEVEX1dQUzoKKwkJSGlnaEJ5dGUgPSAweDEwOworCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKKwkJYnJlYWs7CisJY2FzZSBMRURfT05fU0lURV9TVVJWRVk6CisJCUhpZ2hCeXRlID0gMHgwODsKKwkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7CisJCWJyZWFrOworCWNhc2UgTEVEX1BPV0VSX1VQOgorCQlIaWdoQnl0ZSA9IDB4MDQ7CisJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLAorCQkJICgiUlRNUFNldExFRDo6VW5rbm93biBTdGF0dXMgJWRcbiIsIFN0YXR1cykpOworCQlicmVhazsKIAl9CiAKLSAgICAvLwotCS8vIEtlZXAgTEVEIHN0YXR1cyBmb3IgTEVEIFNpdGVTdXJ2ZXkgbW9kZS4KLQkvLyBBZnRlciBTaXRlU3VydmV5LCB3ZSB3aWxsIHNldCB0aGUgTEVEIG1vZGUgdG8gcHJldmlvdXMgc3RhdHVzLgotCS8vCisJLyogKi8KKwkvKiBLZWVwIExFRCBzdGF0dXMgZm9yIExFRCBTaXRlU3VydmV5IG1vZGUuICovCisJLyogQWZ0ZXIgU2l0ZVN1cnZleSwgd2Ugd2lsbCBzZXQgdGhlIExFRCBtb2RlIHRvIHByZXZpb3VzIHN0YXR1cy4gKi8KKwkvKiAqLwogCWlmICgoU3RhdHVzICE9IExFRF9PTl9TSVRFX1NVUlZFWSkgJiYgKFN0YXR1cyAhPSBMRURfUE9XRVJfVVApKQogCQlwQWQtPkxlZFN0YXR1cyA9IFN0YXR1czsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTZXRMRUQ6Ok1vZGU9JWQsSGlnaEJ5dGU9MHglMDJ4LExvd0J5dGU9MHglMDJ4XG4iLCBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSwgSGlnaEJ5dGUsIExvd0J5dGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiUlRNUFNldExFRDo6TW9kZT0lZCxIaWdoQnl0ZT0weCUwMngsTG93Qnl0ZT0weCUwMnhcbiIsCisJCSAgcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUsIEhpZ2hCeXRlLCBMb3dCeXRlKSk7CiB9CiAKIC8qCkBAIC0zODg5LDQwICszMTE3LDMyIEBACiAJCSA+IC01NyAgRXhjZWxsZW50CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QU2V0U2lnbmFsTEVEKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiBORElTXzgwMl8xMV9SU1NJIERibSkKK3ZvaWQgUlRNUFNldFNpZ25hbExFRChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIE5ESVNfODAyXzExX1JTU0kgRGJtKQogewotCVVDSEFSCQluTGVkID0gMDsKKwl1OCBuTGVkID0gMDsKIAotCS8vCi0JLy8gaWYgbm90IFNpZ25hbCBTdHJlZ3RoLCB0aGVuIGRvIG5vdGhpbmcuCi0JLy8KLQlpZiAocEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUgIT0gTEVEX01PREVfU0lHTkFMX1NUUkVHVEgpCi0JewotCQlyZXR1cm47Ci0JfQorCWlmIChwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSA9PSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSCkgeworCQlpZiAoRGJtIDw9IC05MCkKKwkJCW5MZWQgPSAwOworCQllbHNlIGlmIChEYm0gPD0gLTgxKQorCQkJbkxlZCA9IDE7CisJCWVsc2UgaWYgKERibSA8PSAtNzEpCisJCQluTGVkID0gMzsKKwkJZWxzZSBpZiAoRGJtIDw9IC02NykKKwkJCW5MZWQgPSA3OworCQllbHNlIGlmIChEYm0gPD0gLTU3KQorCQkJbkxlZCA9IDE1OworCQllbHNlCisJCQluTGVkID0gMzE7CiAKLQlpZiAoRGJtIDw9IC05MCkKLQkJbkxlZCA9IDA7Ci0JZWxzZSBpZiAoRGJtIDw9IC04MSkKLQkJbkxlZCA9IDE7Ci0JZWxzZSBpZiAoRGJtIDw9IC03MSkKLQkJbkxlZCA9IDM7Ci0JZWxzZSBpZiAoRGJtIDw9IC02NykKLQkJbkxlZCA9IDc7Ci0JZWxzZSBpZiAoRGJtIDw9IC01NykKLQkJbkxlZCA9IDE1OwotCWVsc2UKLQkJbkxlZCA9IDMxOwotCi0JLy8KLQkvLyBVcGRhdGUgU2lnbmFsIFN0cmVndGggdG8gZmlybXdhcmUgaWYgY2hhbmdlZC4KLQkvLwotCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVndGggIT0gbkxlZCkKLQl7Ci0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwgcEFkLT5MZWRDbnRsLmZpZWxkLlBvbGFyaXR5KTsKLQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gbkxlZDsKKwkJLyogKi8KKwkJLyogVXBkYXRlIFNpZ25hbCBTdHJlZ3RoIHRvIGZpcm13YXJlIGlmIGNoYW5nZWQuICovCisJCS8qICovCisJCWlmIChwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoICE9IG5MZWQpIHsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MSwgMHhmZiwgbkxlZCwKKwkJCQkJICAgICBwQWQtPkxlZENudGwuZmllbGQuUG9sYXJpdHkpOworCQkJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IG5MZWQ7CisJCX0KIAl9CiB9CiAKQEAgLTM5NDQsMjkgKzMxNjQsMzk0IEBACiAJCUJlZm9yZSBFbmFibGUgUlgsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBlbmFibGVkIEludGVycnVwdC4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBFbmFibGVSeFR4KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVE1QRW5hYmxlUnhUeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CisvKiAgICAgIFdQRE1BX0dMT19DRkdfU1RSVUMgICAgIEdsb0NmZzsgKi8KKy8qICAgICAgdW5zaWduZWQgbG9uZyAgIGkgPSAwOyAqLworCXUzMiByeF9maWx0ZXJfZmxhZzsKKwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QRW5hYmxlUnhUeFxuIikpOwogCi0JLy8gRW5hYmxlIFJ4IERNQS4KKwkvKiBFbmFibGUgUnggRE1BLiAqLwogCVJUMjhYWERNQUVuYWJsZShwQWQpOwogCi0JLy8gZW5hYmxlIFJYIG9mIE1BQyBibG9jawotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCi0JewotCQlVSU5UMzIgcnhfZmlsdGVyX2ZsYWcgPSBBUE5PUk1BTDsKKwkvKiBlbmFibGUgUlggb2YgTUFDIGJsb2NrICovCisJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkgeworCQlyeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOwogCi0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCi0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgICAgIC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOwkvKiBlbmFibGUgUlggb2YgRE1BIGJsb2NrICovCisJfSBlbHNlIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKQorCQkJcnhfZmlsdGVyX2ZsYWcgPSBQU1BYTElOSzsKKwkJZWxzZQorCQkJcnhfZmlsdGVyX2ZsYWcgPSBTVEFOT1JNQUw7CS8qIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uICovCisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgcnhfZmlsdGVyX2ZsYWcpOwogCX0KIAogCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHhjKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gUlRNUEVuYWJsZVJ4VHhcbiIpKTsKIH0KIAorLyorKytBZGQgYnkgc2hpYW5nLCBtb3ZlIGZyb20gb3MvbGludXgvcnRfbWFpbl9kZXYuYyAqLwordm9pZCBDZmdJbml0SG9vayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJcEFkLT5iQnJvYWRDb21IVCA9IFRSVUU7Cit9CiAKK2ludCBydDI4eHhfaW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCWNoYXIgKnBEZWZhdWx0TWFjLCBjaGFyICpwSG9zdE5hbWUpCit7CisJdTMyIGluZGV4OworCXU4IFRtcFBoeTsKKwlpbnQgU3RhdHVzOworCXUzMiBNYWNDc3IwID0gMDsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXsKKwkJLyogSWYgZGlydmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLCAqLworCQkvKiBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uICovCisJCS8qIFJUMjg2MCBQQ0kgKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkgJiYKKwkJICAgIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQlBVVRPX1dBS0VVUF9TVFJVQyBBdXRvV2FrZXVwQ2ZnOworCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOworCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLAorCQkJCQlBdXRvV2FrZXVwQ2ZnLndvcmQpOworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7CisJCX0KKwl9CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwkvKiByZXNldCBBZGFwdGVyIGZsYWdzICovCisJUlRNUF9DTEVBUl9GTEFHUyhwQWQpOworCisJLyogSW5pdCBCc3NUYWIgJiBDaGFubmVsSW5mbyB0YWJibGVzIGZvciBhdXRvIGNoYW5uZWwgc2VsZWN0LiAqLworCisJLyogQWxsb2NhdGUgQkEgUmVvcmRlcmluZyBtZW1vcnkgKi8KKwliYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQocEFkLCBNQVhfUkVPUkRFUklOR19NUERVX05VTSk7CisKKwkvKiBNYWtlIHN1cmUgTUFDIGdldHMgcmVhZHkuICovCisJaW5kZXggPSAwOworCWRvIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCQlwQWQtPk1BQ1ZlcnNpb24gPSBNYWNDc3IwOworCisJCWlmICgocEFkLT5NQUNWZXJzaW9uICE9IDB4MDApCisJCSAgICAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQorCQkJYnJlYWs7CisKKwkJUlRNUHVzZWNEZWxheSgxMCk7CisJfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIk1BQ19DU1IwICBbIFZlcjpSZXY9MHglMDh4XVxuIiwgcEFkLT5NQUNWZXJzaW9uKSk7CisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkvKkl2ZXJzb24gcGF0Y2ggUENJRSBMMSBpc3N1ZSB0byBtYWtlIHN1cmUgdGhhdCBkcml2ZXIgY2FuIGJlIHJlYWQsd3JpdGUgLEJCUCBhbmQgUkYgcmVnaXN0ZXIgIGF0IHBjaWUgTC4xIGxldmVsICovCisJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY0NzcjApOworCQlNYWNDc3IwIHw9IDB4NDAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjQ3NyMCk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVWF9DVFJMID0gMHgleFxuIiwgTWFjQ3NyMCkpOworCX0KKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKworCS8qIFRvIGZpeCBkcml2ZXIgZGlzYWJsZS9lbmFibGUgaGFuZyBpc3N1ZSB3aGVuIHJhZGlvIG9mZiAqLworCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAweDIpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisJLyogRGlzYWJsZSBETUEgKi8KKwlSVDI4WFhETUFEaXNhYmxlKHBBZCk7CisKKwkvKiBMb2FkIDgwNTEgZmlybXdhcmUgKi8KKwlTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlRfRVJSKCgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLAorCQkJICAgICAgU3RhdHVzKSk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZSAqLworCS8qIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIgKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKSB7CisJCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOworCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCVN0YXR1cyA9IFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UX0VSUigoIlJUTVBBbGxvY0RNQU1lbW9yeSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwKKwkJCSAgICAgIFN0YXR1cykpOworCQlnb3RvIGVycjE7CisJfQorCisJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisKKwkvKiBpbml0aWFsaXplIE1MTUUgKi8KKwkvKiAqLworCisJU3RhdHVzID0gUnRtcE1nbXRUYXNrSW5pdChwQWQpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJZ290byBlcnIyOworCisJU3RhdHVzID0gTWxtZUluaXQocEFkKTsKKwlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlRfRVJSKCgiTWxtZUluaXQgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOworCQlnb3RvIGVycjI7CisJfQorCS8qIEluaXRpYWxpemUgcEFkLT5TdGFDZmcsIHBBZC0+QXBDZmcsIHBBZC0+Q29tbW9uQ2ZnIHRvIG1hbnVmYWN0dXJlIGRlZmF1bHQgKi8KKwkvKiAqLworCVVzZXJDZmdJbml0KHBBZCk7CisJU3RhdHVzID0gUnRtcE5ldFRhc2tJbml0KHBBZCk7CisJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycjM7CisKKy8qICAgICAgQ09QWV9NQUNfQUREUihwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQsIG5ldGlmLT5od2FkZHIpOyAqLworLyogICAgICBwQWQtPmJGb3JjZVByaW50VFggPSBUUlVFOyAqLworCisJQ2ZnSW5pdEhvb2socEFkKTsKKworCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOworCisJTWVhc3VyZVJlcVRhYkluaXQocEFkKTsKKwlUcGNSZXFUYWJJbml0KHBBZCk7CisKKwkvKiAqLworCS8qIEluaXQgdGhlIGhhcmR3YXJlLCB3ZSBuZWVkIHRvIGluaXQgYXNpYyBiZWZvcmUgcmVhZCByZWdpc3RyeSwgb3RoZXJ3aXNlIG1hYyByZWdpc3RlciB3aWxsIGJlIHJlc2V0ICovCisJLyogKi8KKwlTdGF0dXMgPSBOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIFRSVUUpOworCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVF9FUlIoKCJOSUNJbml0aWFsaXplQWRhcHRlciBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwKKwkJCSAgICAgIFN0YXR1cykpOworCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIGVycjM7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIjEuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXBBZC0+Q29tbW9uQ2ZnLmJNdWx0aXBsZUlSUCA9IEZBTFNFOworCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJNdWx0aXBsZUlSUCkKKwkJcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgPSBSWF9SSU5HX1NJWkU7CisJZWxzZQorCQlwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCA9IDE7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwkvKkluaXQgQmEgQ2FwYWJpbGl0eSBwYXJhbWV0ZXJzLiAqLworLyogICAgICBSVDI4WFhfQkFfSU5JVChwQWQpOyAqLworCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9CisJICAgICh1OClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7CisJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0KKwkgICAgKHUxNilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7CisJLyogVVBkYXRhIHRvIEhUIElFICovCisJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPQorCSAgICAodTE2KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9CisJICAgICh1MTYpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKKwlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0KKwkgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKKworCS8qIGFmdGVyIHJlYWRpbmcgUmVnaXN0cnksIHdlIG5vdyBrbm93IGlmIGluIEFQIG1vZGUgb3IgU1RBIG1vZGUgKi8KKworCS8qIExvYWQgODA1MSBmaXJtd2FyZTsgY3Jhc2ggd2hlbiBGVyBpbWFnZSBub3QgZXhpc3RlbnQgKi8KKwkvKiBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsgKi8KKwkvKiBpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpICovCisJLyogICAgYnJlYWs7ICovCisKKwlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCisJLyogV2Ugc2hvdWxkIHJlYWQgRUVQUk9NIGZvciBhbGwgY2FzZXMuICBydDI4NjBiICovCisJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMocEFkLCAodTggKilwRGVmYXVsdE1hYyk7CisKKwlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiMy4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCisJTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7CS8qcnQyODYwYiAqLworCisJLyogU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlICovCisJVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKKwlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKKwlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7CisJU2V0Q29tbW9uSFQocEFkKTsKKworCS8qIE5vIHZhbGlkIGNoYW5uZWxzLiAqLworCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJXcm9uZyBjb25maWd1cmF0aW9uLiBObyB2YWxpZCBjaGFubmVsIGZvdW5kLiBDaGVjayBcIkNvbnRyeUNvZGVcIiBhbmQgXCJDaGFubmVsR2VvZ3JhcGh5XCIgc2V0dGluZy5cbiIpKTsKKwkJZ290byBlcnI0OworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX09GRiwKKwkJICgiTUNTIFNldCA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sCisJCSAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSwKKwkJICBwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzNdLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pKTsKKworI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAorCS8qSW5pdCBSVDMweHggUkZSZWdpc3RlcnMgYWZ0ZXIgcmVhZCBSRklDIHR5cGUgZnJvbSBFRVBST00gKi8KKwlOSUNJbml0UkZSZWdpc3RlcnMocEFkKTsKKyNlbmRpZiAvKiBSVE1QX1JGX1JXX1NVUFBPUlQgLy8gKi8KKworLyogICAgICAgICAgICAgIEFQSW5pdGlhbGl6ZShwQWQpOyAqLworCisJLyogKi8KKwkvKiBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwkvKiAqLworCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOworCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCisJLyogODA1MSBmaXJtd2FyZSByZXF1aXJlIHRoZSBzaWduYWwgZHVyaW5nIGJvb3RpbmcgdGltZS4gKi8KKwkvKjIwMDgvMTEvMjg6S0ggbWFya2VkIHRoZSBmb2xsb3dpbmcgY29kZXMgdG8gcGF0Y2ggRnJlcXVlbmN5IG9mZnNldCBidWcgKi8KKwkvKkFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg3MiwgMHhGRiwgMHgwMCwgMHgwMCk7ICovCisKKwlpZiAocEFkICYmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykpIHsKKwkJLyogKi8KKwkJLyogVW5kbyBldmVyeXRoaW5nIGlmIGl0IGZhaWxlZCAqLworCQkvKiAqLworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisvKiAgICAgICAgICAgICAgICAgICAgICBOZGlzTURlcmVnaXN0ZXJJbnRlcnJ1cHQoJnBBZC0+SW50ZXJydXB0KTsgKi8KKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7CisJCX0KKy8qICAgICAgICAgICAgICBSVE1QRnJlZUFkYXB0ZXIocEFkKTsgLy8gd2Ugd2lsbCBmcmVlIGl0IGluIGRpc2Nvbm5lY3QoKSAqLworCX0gZWxzZSBpZiAocEFkKSB7CisJCS8qIE1pY3Jvc29mdCBIQ1QgcmVxdWlyZSBkcml2ZXIgc2VuZCBhIGRpc2Nvbm5lY3QgZXZlbnQgYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLiAqLworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworLyogICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7ICovCisJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7CisKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEIhXG4iKSk7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyk7CisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKKworCQkvKiAqLworCQkvKiBTdXBwb3J0IG11bHRpcGxlIEJ1bGtJbiBJUlAsICovCisJCS8qIHRoZSB2YWx1ZSBvbiBwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUCBtYXkgYmUgbGFyZ2UgdGhhbiAxLiAqLworCQkvKiAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUDsgaW5kZXgrKykgeworCQkJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRVU0JCdWxrUmVjZWl2ZSFcbiIpKTsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCX0JCQkvKiBlbmQgb2YgZWxzZSAqLworCisJLyogU2V0IHVwIHRoZSBNYWMgYWRkcmVzcyAqLworCVJ0bXBPU05ldERldkFkZHJTZXQocEFkLT5uZXRfZGV2LCAmcEFkLT5DdXJyZW50QWRkcmVzc1swXSk7CisKKwlEQkdQUklOVF9TKFN0YXR1cywgKCI8PT09PSBydDI4eHhfaW5pdCwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKKworCXJldHVybiBUUlVFOworCitlcnI0OgorZXJyMzoKKwlNbG1lSGFsdChwQWQpOworZXJyMjoKKwlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHBBZCk7CitlcnIxOgorCisJb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsJLyogZnJlZSBCQSBwb29sICovCisKKwkvKiBzaGFsbCBub3Qgc2V0IHByaXYgdG8gTlVMTCBoZXJlIGJlY2F1c2UgdGhlIHByaXYgZGlkbid0IGJlZW4gZnJlZSB5ZXQuICovCisJLypuZXRfZGV2LT5tbF9wcml2ID0gMDsgKi8KKyNpZmRlZiBTVAorZXJyMDoKKyNlbmRpZiAvKiBTVCAvLyAqLworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicnQyOHh4IEluaXRpYWxpemVkIGZhaWwhXG4iKSk7CisJcmV0dXJuIEZBTFNFOworfQorCisvKi0tLUFkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBvcy9saW51eC9ydF9tYWluX2Rldi5jICovCisKK3N0YXRpYyBpbnQgUnRtcENoaXBPcHNSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBpbmZUeXBlKQoreworCXN0cnVjdCBydF9ydG1wX2NoaXBfb3AgKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKKwlpbnQgc3RhdHVzOworCisJbWVtc2V0KHBDaGlwT3BzLCAwLCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCkpOworCisJLyogc2V0IGVlcHJvbSByZWxhdGVkIGhvb2sgZnVuY3Rpb25zICovCisJc3RhdHVzID0gUnRtcENoaXBPcHNFZXByb21Ib29rKHBBZCwgaW5mVHlwZSk7CisKKwkvKiBzZXQgbWN1IHJlbGF0ZWQgaG9vayBmdW5jdGlvbnMgKi8KKwlzd2l0Y2ggKGluZlR5cGUpIHsKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJY2FzZSBSVE1QX0RFVl9JTkZfUENJOgorCQlwQ2hpcE9wcy0+bG9hZEZpcm13YXJlID0gUnRtcEFzaWNMb2FkRmlybXdhcmU7CisJCXBDaGlwT3BzLT5lcmFzZUZpcm13YXJlID0gUnRtcEFzaWNFcmFzZUZpcm13YXJlOworCQlwQ2hpcE9wcy0+c2VuZENvbW1hbmRUb01jdSA9IFJ0bXBBc2ljU2VuZENvbW1hbmRUb01jdTsKKwkJYnJlYWs7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKwljYXNlIFJUTVBfREVWX0lORl9VU0I6CisJCXBDaGlwT3BzLT5sb2FkRmlybXdhcmUgPSBSdG1wQXNpY0xvYWRGaXJtd2FyZTsKKwkJcENoaXBPcHMtPnNlbmRDb21tYW5kVG9NY3UgPSBSdG1wQXNpY1NlbmRDb21tYW5kVG9NY3U7CisJCWJyZWFrOworI2VuZGlmIC8qIFJUTVBfVVNCX1NVUFBPUlQgLy8gKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgUnRtcFJhRGV2Q3RybEluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBSVE1QX0lORl9UWVBFIGluZlR5cGUpCit7CisJLyp2b2lkICAqaGFuZGxlOyAqLworCisJLyogQXNzaWduIHRoZSBpbnRlcmZhY2UgdHlwZS4gV2UgbmVlZCB1c2UgaXQgd2hlbiBkbyByZWdpc3Rlci9FRVBST00gYWNjZXNzLiAqLworCXBBZC0+aW5mVHlwZSA9IGluZlR5cGU7CisKKwlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlNUQSBEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlpbml0X01VVEVYKCYocEFkLT5Vc2JWZW5kb3JSZXFfc2VtYXBob3JlKSk7CisJb3NfYWxsb2NfbWVtKHBBZCwgKHU4ICoqKSAmIHBBZC0+VXNiVmVuZG9yUmVxQnVmLAorCQkgICAgIE1BWF9QQVJBTV9CVUZGRVJfU0laRSAtIDEpOworCWlmIChwQWQtPlVzYlZlbmRvclJlcUJ1ZiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQWxsb2NhdGUgdmVuZG9yIHJlcXVlc3QgdGVtcCBidWZmZXIgZmFpbGVkIVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisJUnRtcENoaXBPcHNSZWdpc3RlcihwQWQsIGluZlR5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK0JPT0xFQU4gUnRtcFJhRGV2Q3RybEV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCisJUlRNUEZyZWVBZGFwdGVyKHBBZCk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogbm90IHlldCBzdXBwb3J0IE1CU1MgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0ZGV2X2Zyb21fYnNzaWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBGcm9tV2hpY2hCU1NJRCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3AgPSBOVUxMOworCisJeworCQlkZXZfcCA9IHBBZC0+bmV0X2RldjsKKwl9CisKKwlBU1NFUlQoZGV2X3ApOworCXJldHVybiBkZXZfcDsJCS8qIHJldHVybiBvbmUgb2YgTUJTUyAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMzkwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfbWN1LmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9tY3UuYworCisJQWJzdHJhY3Q6CisJTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUJIi4uL3J0X2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChSVDI4NjApIHx8IGRlZmluZWQoUlQzMDkwKQorI2luY2x1ZGUgImZpcm13YXJlLmgiCisjaW5jbHVkZSAiLi4vLi4vcnQzMDkwL2Zpcm13YXJlLmgiCisjZW5kaWYKKyNpZmRlZiBSVDI4NzAKKyNpbmNsdWRlICIuLi8uLi9ydDMwNzAvZmlybXdhcmUuaCIKKyNpbmNsdWRlICJmaXJtd2FyZV8zMDcwLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorCisjaWZkZWYgUlRNUF9NQUNfVVNCCisvKiAqLworLyogUlQyODcwIEZpcm13YXJlIFNwZWMgb25seSB1c2VkIDEgb2N0IGZvciB2ZXJzaW9uIGV4cHJlc3Npb24gKi8KKy8qICovCisjZGVmaW5lIEZJUk1XQVJFX01JTk9SX1ZFUlNJT04JNworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisvKiBOZXcgOGsgYnl0ZSBmaXJtd2FyZSBzaXplIGZvciBSVDMwNzEvUlQzMDcyICovCisjZGVmaW5lIEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSAkweDIwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRV9MRU5HVEgJCQkoc2l6ZW9mIChGaXJtd2FyZUltYWdlKSAvIHNpemVvZih1OCkpCisjZGVmaW5lIEZJUk1XQVJFX01BSk9SX1ZFUlNJT04JCTAKKworI2RlZmluZSBGSVJNV0FSRUlNQUdFVjFfTEVOR1RICQkweDEwMDAKKyNkZWZpbmUgRklSTVdBUkVJTUFHRVYyX0xFTkdUSAkJMHgxMDAwCisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNkZWZpbmUgRklSTVdBUkVfTUlOT1JfVkVSU0lPTgkJMgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQworCisJQXJndW1lbnRzOgorCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSdG1wQXNpY0VyYXNlRmlybXdhcmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRklSTVdBUkVfSU1BR0VfU0laRTsgaSArPSA0KQorCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgaSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisJCUxvYWQgODA1MSBmaXJtd2FyZSBmaWxlIGludG8gTUFDIEFTSUMKKworCUFyZ3VtZW50czoKKwkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKKwkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAorCisJSVJRTCA9IFBBU1NJVkVfTEVWRUwKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSdG1wQXNpY0xvYWRGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl1OCAqcEZpcm13YXJlSW1hZ2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgRmlsZUxlbmd0aCwgSW5kZXg7CisJdTMyIE1hY1JlZyA9IDA7CisjaWZkZWYgUlRNUF9NQUNfVVNCCisJdTMyIFZlcnNpb24gPSAocEFkLT5NQUNWZXJzaW9uID4+IDE2KTsKKyNlbmRpZgorCisJLyogTmV3IDhrIGJ5dGUgZmlybXdhcmUgc2l6ZSBmb3IgUlQzMDcxL1JUMzA3MiAqLworCXsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzM5MChwQWQpKSB7CisJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2VfMzA5MDsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEg7CisJCX0gZWxzZSB7CisJCQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2VfMjg2MDsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFX01BWF9MRU5HVEg7CisJCX0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJLyogdGhlIGZpcm13YXJlIGltYWdlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cyAqLworCQlpZiAoKFZlcnNpb24gIT0gMHgyODYwKSAmJiAoVmVyc2lvbiAhPSAweDI4NzIpICYmIChWZXJzaW9uICE9IDB4MzA3MCkpIHsJLyogdXNlIHRoZSBzZWNvbmQgcGFydCAqLworCQkJLypwcmludGsoIktIOlVzZSBOZXcgVmVyc2lvbixwYXJ0MlxuIik7ICovCisJCQlwRmlybXdhcmVJbWFnZSA9CisJCQkgICAgKHU4ICopJgorCQkJICAgIEZpcm13YXJlSW1hZ2VfMzA3MFtGSVJNV0FSRUlNQUdFVjFfTEVOR1RIXTsKKwkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RIOworCQl9IGVsc2UgeworCQkJLypwcmludGsoIktIOlVzZSBOZXcgVmVyc2lvbixwYXJ0MVxuIik7ICovCisJCQlpZiAoVmVyc2lvbiA9PSAweDMwNzApCisJCQkJcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlXzMwNzA7CisJCQllbHNlCisJCQkJcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlXzI4NzA7CisJCQlGaWxlTGVuZ3RoID0gRklSTVdBUkVJTUFHRVYxX0xFTkdUSDsKKwkJfQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCX0KKworCVJUTVBfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7CisKKwkvKiBjaGVjayBpZiBNQ1UgaXMgcmVhZHkgKi8KKwlJbmRleCA9IDA7CisJZG8geworCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY1JlZyk7CisKKwkJaWYgKE1hY1JlZyAmIDB4ODApCisJCQlicmVhazsKKworCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCX0gd2hpbGUgKEluZGV4KysgPCAxMDAwKTsKKworCWlmIChJbmRleCA+IDEwMDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJOSUNMb2FkRmlybXdhcmU6IE1DVSBpcyBub3QgcmVhZHlcbiIpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09ICVzIChzdGF0dXM9JWQpXG4iLCBfX2Z1bmNfXywgU3RhdHVzKSk7CisKKwlyZXR1cm4gU3RhdHVzOworfQorCitpbnQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggQ29tbWFuZCwKKwkJCSAgICAgdTggVG9rZW4sIHU4IEFyZzAsIHU4IEFyZzEpCit7CisJSE9TVF9DTURfQ1NSX1NUUlVDIEgyTUNtZDsKKwlIMk1fTUFJTEJPWF9TVFJVQyBIMk1NYWlsYm94OworCXVuc2lnbmVkIGxvbmcgaSA9IDA7CisKKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkvKiAzMDkwRiBwb3dlciBzb2x1dGlvbiAzIGhhcyBodyBsaW1pdGF0aW9uIHRoYXQgbmVlZHMgdG8gYmFuIGFsbCBtY3UgY29tbWFuZCAqLworCS8qIHdoZW4gZmlybXdhcmUgaXMgaW4gcmFkaW8gc3RhdGUuICBGb3Igb3RoZXIgY2hpcCBkb2Vzbid0IGhhdmUgdGhpcyBsaW1pdGF0aW9uLiAqLworCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCisJICAgICYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpIHsKKwkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJaWYgKChwQWQtPmJydDMweHhCYW5NY3VDbWQgPT0gVFJVRSkKKwkJICAgICYmIChDb21tYW5kICE9IFdBS0VfTUNVX0NNRCkgJiYgKENvbW1hbmQgIT0gUkZPRkZfTUNVX0NNRCkpIHsKKwkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiBCYW4gTWN1IENtZCAleCBpbiBzbGVlcCBtb2RlXG4iLCBDb21tYW5kKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0gZWxzZSBpZiAoKENvbW1hbmQgPT0gU0xFRVBfTUNVX0NNRCkKKwkJCSAgIHx8IChDb21tYW5kID09IFJGT0ZGX01DVV9DTUQpKSB7CisJCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBUUlVFOworCQl9IGVsc2UgaWYgKENvbW1hbmQgIT0gV0FLRV9NQ1VfQ01EKSB7CisJCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKKwkJfQorCisJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKKworCX0KKwlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCisJICAgICYmIChDb21tYW5kID09IFdBS0VfTUNVX0NNRCkpIHsKKworCQlkbyB7CisJCQlSVE1QX0lPX0ZPUkNFX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwKKwkJCQkJICAgICAmSDJNTWFpbGJveC53b3JkKTsKKwkJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCisJCQkJYnJlYWs7CisKKwkJCVJUTVB1c2VjRGVsYXkoMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLAorCQkJCSAoIkFzaWNTZW5kQ29tbWFuVG9NY3U6Ok1haWwgYm94IGlzIGJ1c3lcbiIpKTsKKwkJfSB3aGlsZSAoaSsrIDwgMTAwKTsKKworCQlpZiAoaSA+PSAxMDApIHsKKwkJCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCUgyTU1haWxib3guZmllbGQuT3duZXIgPSAxOwkvKiBwYXNzIG93bmVyc2hpcCB0byBNQ1UgKi8KKwkJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOworCQlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKKwkJSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlID0gQXJnMDsKKwkJUlRNUF9JT19GT1JDRV9XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCBIMk1NYWlsYm94LndvcmQpOworCisJCUgyTUNtZC53b3JkID0gMDsKKwkJSDJNQ21kLmZpZWxkLkhvc3RDb21tYW5kID0gQ29tbWFuZDsKKwkJUlRNUF9JT19GT1JDRV9XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7CisKKwl9IGVsc2UKKyNlbmRpZiAvKiBQQ0lFX1BTX1NVUFBPUlQgLy8gKi8KKwl7CisJCWRvIHsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAmSDJNTWFpbGJveC53b3JkKTsKKwkJCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCisJCQkJYnJlYWs7CisKKwkJCVJUTVB1c2VjRGVsYXkoMik7CisJCX0gd2hpbGUgKGkrKyA8IDEwMCk7CisKKwkJaWYgKGkgPiAxMDApIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCXsKKwkJCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7CisJCQl9CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKworCQlIMk1NYWlsYm94LmZpZWxkLk93bmVyID0gMTsJLyogcGFzcyBvd25lcnNoaXAgdG8gTUNVICovCisJCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKKwkJSDJNTWFpbGJveC5maWVsZC5IaWdoQnl0ZSA9IEFyZzE7CisJCUgyTU1haWxib3guZmllbGQuTG93Qnl0ZSA9IEFyZzA7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgSDJNTWFpbGJveC53b3JkKTsKKworCQlIMk1DbWQud29yZCA9IDA7CisJCUgyTUNtZC5maWVsZC5Ib3N0Q29tbWFuZCA9IENvbW1hbmQ7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOworCisJCWlmIChDb21tYW5kICE9IDB4ODApIHsKKwkJfQorCX0KKyNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKKwkvKiAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLiAqLworCS8qIEJlZm9yZSBzdGFibGUsIGRvbid0IGlzc3VlIG90aGVyIE1DVSBjb21tYW5kIHRvIHByZXZlbnQgZnJvbSBmaXJtd2FyZSBlcnJvci4gKi8KKwlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKKwkgICAgICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQorCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCisJICAgICYmIChDb21tYW5kID09IFdBS0VfTUNVX0NNRCkpIHsKKwkJUlRNUHVzZWNEZWxheSgyMDAwKTsKKwkJLypQdXQgdGhpcyBpcyBhZnRlciBSRiBwcm9ncmFtbWluZy4gKi8KKwkJLypOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOyAqLworCQkvKnBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOyAqLworCQkvKk5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7ICovCisJfQorI2VuZGlmIC8qIFBDSUVfUFNfU1VQUE9SVCAvLyAqLworCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9ydG1wX3RpbWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RpbWVyLmMKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF90aW1lci5jCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RpbWVyLmMKaW5kZXggNTI1M2U4Ny4uNDJlNDdkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF90aW1lci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYwpAQCAtNDAsMTUgKzQwLDE1IEBACiAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotCiBCVUlMRF9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKLS8vQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKKy8qQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsgKi8KIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSeEFudEV2YWxUaW1lb3V0KTsKIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwogQlVJTERfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCitCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCiBCVUlMRF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKFNjYW5UaW1lb3V0KTsKIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KTsKQEAgLTYxLDQxICs2MSwzMSBAQAogI2lmZGVmIFJUTVBfTUFDX1BDSQogQlVJTERfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOwogQlVJTERfVElNRVJfRlVOQ1RJT04oUmFkaW9PbkV4ZWMpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotQlVJTERfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKK0JVSUxEX1RJTUVSX0ZVTkNUSU9OKFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCi1leHRlcm4gdm9pZCBMZWRDdHJsTWFpbigKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOworZXh0ZXJuIHZvaWQgTGVkQ3RybE1haW4odm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogQlVJTERfVElNRVJfRlVOQ1RJT04oTGVkQ3RybE1haW4pOwogI2VuZGlmCiAKLQogI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCi1zdGF0aWMgdm9pZCBSdG1wVGltZXJRSGFuZGxlKFJUTVBfQURBUFRFUiAqcEFkKQorc3RhdGljIHZvaWQgUnRtcFRpbWVyUUhhbmRsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAogCWludCBzdGF0dXM7CiAjZW5kaWYKLQlSQUxJTktfVElNRVJfU1RSVUNUCSpwVGltZXI7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpwRW50cnk7Ci0JdW5zaWduZWQgbG9uZwlpcnFGbGFnOwotCVJUTVBfT1NfVEFTSyAqcFRhc2s7Ci0KKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXI7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcEVudHJ5OworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKIAogCXBUYXNrID0gJnBBZC0+dGltZXJUYXNrOwotCXdoaWxlKCFwVGFzay0+dGFza19raWxsZWQpCi0JeworCXdoaWxlICghcFRhc2stPnRhc2tfa2lsbGVkKSB7CiAJCXBUaW1lciA9IE5VTEw7CiAKICNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKQEAgLTEwNywzOCArOTcsMzkgQEAKIAkJaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA9PSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQpCiAJCQlicmVhazsKIAotCQkvLyBldmVudCBoYXBwZW5lZC4KLQkJd2hpbGUocEFkLT5UaW1lclEucFFIZWFkKQotCQl7CisJCS8qIGV2ZW50IGhhcHBlbmVkLiAqLworCQl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKSB7CiAJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWcpOwogCQkJcEVudHJ5ID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQkJaWYgKHBFbnRyeSkKLQkJCXsKKwkJCWlmIChwRW50cnkpIHsKIAkJCQlwVGltZXIgPSBwRW50cnktPnBSYVRpbWVyOwogCi0JCQkJLy8gdXBkYXRlIHBRSGVhZAorCQkJCS8qIHVwZGF0ZSBwUUhlYWQgKi8KIAkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwRW50cnktPnBOZXh0OwogCQkJCWlmIChwRW50cnkgPT0gcEFkLT5UaW1lclEucFFUYWlsKQogCQkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOwogCi0JCQkJLy8gcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuCisJCQkJLyogcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuICovCiAJCQkJcEVudHJ5LT5wTmV4dCA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwogCQkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcEVudHJ5OwogCQkJfQogCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWcpOwogCi0JCQlpZiAocFRpbWVyKQotCQkJewotCQkJCWlmICgocFRpbWVyLT5oYW5kbGUgIT0gTlVMTCkgJiYgKCFwQWQtPlBNX0ZsZ1N1c3BlbmQpKQotCQkJCQlwVGltZXItPmhhbmRsZShOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOwotCQkJCWlmICgocFRpbWVyLT5SZXBlYXQpICYmIChwVGltZXItPlN0YXRlID09IEZBTFNFKSkKLQkJCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7CisJCQlpZiAocFRpbWVyKSB7CisJCQkJaWYgKChwVGltZXItPmhhbmRsZSAhPSBOVUxMKQorCQkJCSAgICAmJiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkpCisJCQkJCXBUaW1lci0+aGFuZGxlKE5VTEwsCisJCQkJCQkgICAgICAgKHZvaWQgKilwVGltZXItPmNvb2tpZSwKKwkJCQkJCSAgICAgICBOVUxMLCBwVGltZXIpOworCQkJCWlmICgocFRpbWVyLT5SZXBlYXQpCisJCQkJICAgICYmIChwVGltZXItPlN0YXRlID09IEZBTFNFKSkKKwkJCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosCisJCQkJCQkJICBwVGltZXItPlRpbWVyVmFsdWUpOwogCQkJfQogCQl9CiAKICNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0JCWlmIChzdGF0dXMgIT0gMCkKLQkJeworCQlpZiAoc3RhdHVzICE9IDApIHsKIAkJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKIAkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwogCQkJYnJlYWs7CkBAIC0xNDcsMjIgKzEzOCwxOSBAQAogCX0KIH0KIAotCi1JTlQgUnRtcFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCkKK2ludCBSdG1wVGltZXJRVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpCiB7Ci0JUlRNUF9PU19UQVNLCSpwVGFzazsKLQlQUlRNUF9BREFQVEVSCXBBZDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CiAKLQotCXBUYXNrID0gKFJUTVBfT1NfVEFTSyAqKUNvbnRleHQ7Ci0JcEFkID0gKFBSVE1QX0FEQVBURVIpcFRhc2stPnByaXY7CisJcFRhc2sgPSAoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqKUNvbnRleHQ7CisJcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilwVGFzay0+cHJpdjsKIAogCVJ0bXBPU1Rhc2tDdXN0b21pemUocFRhc2spOwogCiAJUnRtcFRpbWVyUUhhbmRsZShwQWQpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLSVzXG4iLF9fRlVOQ1RJT05fXykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0lc1xuIiwgX19mdW5jX18pKTsKICNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCiAJcFRhc2stPnRhc2tQSUQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CiAjZW5kaWYKQEAgLTE4NiwyMCArMTc0LDE2IEBACiAKIH0KIAotCi1SVE1QX1RJTUVSX1RBU0tfRU5UUlkgKlJ0bXBUaW1lclFJbnNlcnQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKQorc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqUnRtcFRpbWVyUUluc2VydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lcikKIHsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFOb2RlID0gTlVMTCwgKnBRVGFpbDsKIAl1bnNpZ25lZCBsb25nIGlycUZsYWdzOwotCVJUTVBfT1NfVEFTSwkqcFRhc2sgPSAmcEFkLT50aW1lclRhc2s7CisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2sgPSAmcEFkLT50aW1lclRhc2s7CiAKIAlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQlpZiAocEFkLT5UaW1lclEuc3RhdHVzICYgUlRNUF9UQVNLX0NBTl9ET19JTlNFUlQpCi0JewotCQlpZihwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCkKLQkJeworCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkgeworCQlpZiAocEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QpIHsKIAkJCXBRTm9kZSA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwogCQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwUU5vZGUtPnBOZXh0OwogCkBAIC0yMTYsOCArMjAwLDcgQEAKIAl9CiAJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKIAotCWlmIChwUU5vZGUpCi0JeworCWlmIChwUU5vZGUpIHsKICNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKIAkJV0FLRV9VUChwVGFzayk7CiAjZWxzZQpAQCAtMjI4LDI5ICsyMTEsMjMgQEAKIAlyZXR1cm4gcFFOb2RlOwogfQogCi0KLUJPT0xFQU4gUnRtcFRpbWVyUVJlbW92ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpCitCT09MRUFOIFJ0bXBUaW1lclFSZW1vdmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIpCiB7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwTm9kZSwgKnBQcmV2ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGlycUZsYWdzOwogCiAJUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyA+PSBSVE1QX1RBU0tfU1RBVF9JTklURUQpCi0JeworCWlmIChwQWQtPlRpbWVyUS5zdGF0dXMgPj0gUlRNUF9UQVNLX1NUQVRfSU5JVEVEKSB7CiAJCXBOb2RlID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQl3aGlsZSAocE5vZGUpCi0JCXsKKwkJd2hpbGUgKHBOb2RlKSB7CiAJCQlpZiAocE5vZGUtPnBSYVRpbWVyID09IHBUaW1lcikKIAkJCQlicmVhazsKIAkJCXBQcmV2ID0gcE5vZGU7CiAJCQlwTm9kZSA9IHBOb2RlLT5wTmV4dDsKIAkJfQogCi0JCS8vIE5vdyBtb3ZlIGl0IHRvIGZyZWVMaXN0IHF1ZXVlLgotCQlpZiAocE5vZGUpCi0JCXsKKwkJLyogTm93IG1vdmUgaXQgdG8gZnJlZUxpc3QgcXVldWUuICovCisJCWlmIChwTm9kZSkgewogCQkJaWYgKHBOb2RlID09IHBBZC0+VGltZXJRLnBRSGVhZCkKIAkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwTm9kZS0+cE5leHQ7CiAJCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFUYWlsKQpAQCAtMjU4LDcgKzIzNSw3IEBACiAJCQlpZiAocFByZXYgIT0gTlVMTCkKIAkJCQlwUHJldi0+cE5leHQgPSBwTm9kZS0+cE5leHQ7CiAKLQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgorCQkJLyogcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuICovCiAJCQlwTm9kZS0+cE5leHQgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKIAkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcE5vZGU7CiAJCX0KQEAgLTI2OCwxOCArMjQ1LDE2IEBACiAJcmV0dXJuIFRSVUU7CiB9CiAKLQotdm9pZCBSdG1wVGltZXJRRXhpdChSVE1QX0FEQVBURVIgKnBBZCkKK3ZvaWQgUnRtcFRpbWVyUUV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVJUTVBfVElNRVJfVEFTS19FTlRSWSAqcFRpbWVyUTsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwVGltZXJROwogCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CiAKIAlSVE1QX0lOVF9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKQotCXsKKwl3aGlsZSAocEFkLT5UaW1lclEucFFIZWFkKSB7CiAJCXBUaW1lclEgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7CiAJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBUaW1lclEtPnBOZXh0OwotCQkvLyByZW1vdmUgdGhlIHRpbWVRCisJCS8qIHJlbW92ZSB0aGUgdGltZVEgKi8KIAl9CiAJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBOVUxMOwogCW9zX2ZyZWVfbWVtKHBBZCwgcEFkLT5UaW1lclEucFRpbWVyUVBvbGwpOwpAQCAtMjkyLDI3ICsyNjcsMjcgQEAKIAogfQogCi0KLXZvaWQgUnRtcFRpbWVyUUluaXQoUlRNUF9BREFQVEVSICpwQWQpCit2b2lkIFJ0bXBUaW1lclFJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlpbnQJaTsKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkgKnBRTm9kZSwgKnBFbnRyeTsKKwlpbnQgaTsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwUU5vZGUsICpwRW50cnk7CiAJdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKIAogCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOwogCiAJTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKIAotCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUTVBfVElNRVJfVEFTS19FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7Ci0JaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQotCXsKKwlvc19hbGxvY19tZW0ocEFkLCAmcEFkLT5UaW1lclEucFRpbWVyUVBvbGwsCisJCSAgICAgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkpICogVElNRVJfUVVFVUVfU0laRV9NQVgpOworCWlmIChwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCkgewogCQlwRW50cnkgPSBOVUxMOwotCQlwUU5vZGUgPSAoUlRNUF9USU1FUl9UQVNLX0VOVFJZICopcEFkLT5UaW1lclEucFRpbWVyUVBvbGw7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+VGltZXJRLnBUaW1lclFQb2xsLCBzaXplb2YoUlRNUF9USU1FUl9UQVNLX0VOVFJZKSAqIFRJTUVSX1FVRVVFX1NJWkVfTUFYKTsKKwkJcFFOb2RlID0gKHN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkgKilwQWQtPlRpbWVyUS5wVGltZXJRUG9sbDsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5UaW1lclEucFRpbWVyUVBvbGwsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfZW50cnkpICoKKwkJCSAgICAgICBUSU1FUl9RVUVVRV9TSVpFX01BWCk7CiAKIAkJUlRNUF9JTlRfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JCWZvciAoaSA9IDAgO2kgPFRJTUVSX1FVRVVFX1NJWkVfTUFYOyBpKyspCi0JCXsKKwkJZm9yIChpID0gMDsgaSA8IFRJTUVSX1FVRVVFX1NJWkVfTUFYOyBpKyspIHsKIAkJCXBRTm9kZS0+cE5leHQgPSBwRW50cnk7CiAJCQlwRW50cnkgPSBwUU5vZGU7CiAJCQlwUU5vZGUrKzsKQEAgLTMyNCw0ICsyOTksNCBAQAogCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwogCX0KIH0KLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLworI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9ydG1wX3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGtpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdmZGE2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3J0bXBfdGtpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU4NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfdGtpcC5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotLy8gUm90YXRpb24gZnVuY3Rpb25zIG9uIDMyIGJpdCB2YWx1ZXMKLSNkZWZpbmUgUk9MMzIoIEEsIG4gKSBcCi0JKCAoKEEpIDw8IChuKSkgfCAoICgoQSk+PigzMi0obikpKSAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQotI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCi0KLVVJTlQgVGtpcF9TYm94X0xvd2VyWzI1Nl0gPQotewotCTB4QTUsMHg4NCwweDk5LDB4OEQsMHgwRCwweEJELDB4QjEsMHg1NCwKLQkweDUwLDB4MDMsMHhBOSwweDdELDB4MTksMHg2MiwweEU2LDB4OUEsCi0JMHg0NSwweDlELDB4NDAsMHg4NywweDE1LDB4RUIsMHhDOSwweDBCLAotCTB4RUMsMHg2NywweEZELDB4RUEsMHhCRiwweEY3LDB4OTYsMHg1QiwKLQkweEMyLDB4MUMsMHhBRSwweDZBLDB4NUEsMHg0MSwweDAyLDB4NEYsCi0JMHg1QywweEY0LDB4MzQsMHgwOCwweDkzLDB4NzMsMHg1MywweDNGLAotCTB4MEMsMHg1MiwweDY1LDB4NUUsMHgyOCwweEExLDB4MEYsMHhCNSwKLQkweDA5LDB4MzYsMHg5QiwweDNELDB4MjYsMHg2OSwweENELDB4OUYsCi0JMHgxQiwweDlFLDB4NzQsMHgyRSwweDJELDB4QjIsMHhFRSwweEZCLAotCTB4RjYsMHg0RCwweDYxLDB4Q0UsMHg3QiwweDNFLDB4NzEsMHg5NywKLQkweEY1LDB4NjgsMHgwMCwweDJDLDB4NjAsMHgxRiwweEM4LDB4RUQsCi0JMHhCRSwweDQ2LDB4RDksMHg0QiwweERFLDB4RDQsMHhFOCwweDRBLAotCTB4NkIsMHgyQSwweEU1LDB4MTYsMHhDNSwweEQ3LDB4NTUsMHg5NCwKLQkweENGLDB4MTAsMHgwNiwweDgxLDB4RjAsMHg0NCwweEJBLDB4RTMsCi0JMHhGMywweEZFLDB4QzAsMHg4QSwweEFELDB4QkMsMHg0OCwweDA0LAotCTB4REYsMHhDMSwweDc1LDB4NjMsMHgzMCwweDFBLDB4MEUsMHg2RCwKLQkweDRDLDB4MTQsMHgzNSwweDJGLDB4RTEsMHhBMiwweENDLDB4MzksCi0JMHg1NywweEYyLDB4ODIsMHg0NywweEFDLDB4RTcsMHgyQiwweDk1LAotCTB4QTAsMHg5OCwweEQxLDB4N0YsMHg2NiwweDdFLDB4QUIsMHg4MywKLQkweENBLDB4MjksMHhEMywweDNDLDB4NzksMHhFMiwweDFELDB4NzYsCi0JMHgzQiwweDU2LDB4NEUsMHgxRSwweERCLDB4MEEsMHg2QywweEU0LAotCTB4NUQsMHg2RSwweEVGLDB4QTYsMHhBOCwweEE0LDB4MzcsMHg4QiwKLQkweDMyLDB4NDMsMHg1OSwweEI3LDB4OEMsMHg2NCwweEQyLDB4RTAsCi0JMHhCNCwweEZBLDB4MDcsMHgyNSwweEFGLDB4OEUsMHhFOSwweDE4LAotCTB4RDUsMHg4OCwweDZGLDB4NzIsMHgyNCwweEYxLDB4QzcsMHg1MSwKLQkweDIzLDB4N0MsMHg5QywweDIxLDB4REQsMHhEQywweDg2LDB4ODUsCi0JMHg5MCwweDQyLDB4QzQsMHhBQSwweEQ4LDB4MDUsMHgwMSwweDEyLAotCTB4QTMsMHg1RiwweEY5LDB4RDAsMHg5MSwweDU4LDB4MjcsMHhCOSwKLQkweDM4LDB4MTMsMHhCMywweDMzLDB4QkIsMHg3MCwweDg5LDB4QTcsCi0JMHhCNiwweDIyLDB4OTIsMHgyMCwweDQ5LDB4RkYsMHg3OCwweDdBLAotCTB4OEYsMHhGOCwweDgwLDB4MTcsMHhEQSwweDMxLDB4QzYsMHhCOCwKLQkweEMzLDB4QjAsMHg3NywweDExLDB4Q0IsMHhGQywweEQ2LDB4M0EKLX07Ci0KLVVJTlQgVGtpcF9TYm94X1VwcGVyWzI1Nl0gPQotewotCTB4QzYsMHhGOCwweEVFLDB4RjYsMHhGRiwweEQ2LDB4REUsMHg5MSwKLQkweDYwLDB4MDIsMHhDRSwweDU2LDB4RTcsMHhCNSwweDRELDB4RUMsCi0JMHg4RiwweDFGLDB4ODksMHhGQSwweEVGLDB4QjIsMHg4RSwweEZCLAotCTB4NDEsMHhCMywweDVGLDB4NDUsMHgyMywweDUzLDB4RTQsMHg5QiwKLQkweDc1LDB4RTEsMHgzRCwweDRDLDB4NkMsMHg3RSwweEY1LDB4ODMsCi0JMHg2OCwweDUxLDB4RDEsMHhGOSwweEUyLDB4QUIsMHg2MiwweDJBLAotCTB4MDgsMHg5NSwweDQ2LDB4OUQsMHgzMCwweDM3LDB4MEEsMHgyRiwKLQkweDBFLDB4MjQsMHgxQiwweERGLDB4Q0QsMHg0RSwweDdGLDB4RUEsCi0JMHgxMiwweDFELDB4NTgsMHgzNCwweDM2LDB4REMsMHhCNCwweDVCLAotCTB4QTQsMHg3NiwweEI3LDB4N0QsMHg1MiwweERELDB4NUUsMHgxMywKLQkweEE2LDB4QjksMHgwMCwweEMxLDB4NDAsMHhFMywweDc5LDB4QjYsCi0JMHhENCwweDhELDB4NjcsMHg3MiwweDk0LDB4OTgsMHhCMCwweDg1LAotCTB4QkIsMHhDNSwweDRGLDB4RUQsMHg4NiwweDlBLDB4NjYsMHgxMSwKLQkweDhBLDB4RTksMHgwNCwweEZFLDB4QTAsMHg3OCwweDI1LDB4NEIsCi0JMHhBMiwweDVELDB4ODAsMHgwNSwweDNGLDB4MjEsMHg3MCwweEYxLAotCTB4NjMsMHg3NywweEFGLDB4NDIsMHgyMCwweEU1LDB4RkQsMHhCRiwKLQkweDgxLDB4MTgsMHgyNiwweEMzLDB4QkUsMHgzNSwweDg4LDB4MkUsCi0JMHg5MywweDU1LDB4RkMsMHg3QSwweEM4LDB4QkEsMHgzMiwweEU2LAotCTB4QzAsMHgxOSwweDlFLDB4QTMsMHg0NCwweDU0LDB4M0IsMHgwQiwKLQkweDhDLDB4QzcsMHg2QiwweDI4LDB4QTcsMHhCQywweDE2LDB4QUQsCi0JMHhEQiwweDY0LDB4NzQsMHgxNCwweDkyLDB4MEMsMHg0OCwweEI4LAotCTB4OUYsMHhCRCwweDQzLDB4QzQsMHgzOSwweDMxLDB4RDMsMHhGMiwKLQkweEQ1LDB4OEIsMHg2RSwweERBLDB4MDEsMHhCMSwweDlDLDB4NDksCi0JMHhEOCwweEFDLDB4RjMsMHhDRiwweENBLDB4RjQsMHg0NywweDEwLAotCTB4NkYsMHhGMCwweDRBLDB4NUMsMHgzOCwweDU3LDB4NzMsMHg5NywKLQkweENCLDB4QTEsMHhFOCwweDNFLDB4OTYsMHg2MSwweDBELDB4MEYsCi0JMHhFMCwweDdDLDB4NzEsMHhDQywweDkwLDB4MDYsMHhGNywweDFDLAotCTB4QzIsMHg2QSwweEFFLDB4NjksMHgxNywweDk5LDB4M0EsMHgyNywKLQkweEQ5LDB4RUIsMHgyQiwweDIyLDB4RDIsMHhBOSwweDA3LDB4MzMsCi0JMHgyRCwweDNDLDB4MTUsMHhDOSwweDg3LDB4QUEsMHg1MCwweEE1LAotCTB4MDMsMHg1OSwweDA5LDB4MUEsMHg2NSwweEQ3LDB4ODQsMHhEMCwKLQkweDgyLDB4MjksMHg1QSwweDFFLDB4N0IsMHhBOCwweDZELDB4MkMKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiBTQk9YIFRhYmxlICoqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVUNIQVIgU2JveFRhYmxlWzI1Nl0gPQotewotCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCi0JMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKLQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAotCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCi0JMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKLQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAotCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCi0JMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKLQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAotCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCi0JMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKLQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAotCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCi0JMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKLQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAotCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCi0JMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKLQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAotCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCi0JMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKLQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAotCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCi0JMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKLQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAotCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCi0JMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKLQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAotCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCi0JMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKLQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAotCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCi0JMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgotfTsKLQotVk9JRCB4b3JfMzIoCi0JSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYSwKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBiLAotCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Ci0KLVZPSUQgeG9yXzEyOCgKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAotCUlOICBQVUNIQVIgICAgICAgICAgICAgIGIsCi0JT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKLQotVk9JRCBuZXh0X2tleSgKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCi0JSU4gIElOVCAgICAgICAgICAgICAgICAgcm91bmQpOwotCi1WT0lEIGJ5dGVfc3ViKAotCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAotCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Ci0KLVZPSUQgc2hpZnRfcm93KAotCUlOICBQVUNIQVIgICAgICAgICAgICAgIGluLAotCU9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Ci0KLVZPSUQgbWl4X2NvbHVtbigKLQlJTiAgUFVDSEFSICAgICAgICAgICAgICBpbiwKLQlPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwotCi1VQ0hBUiBSVE1QQ2tpcFNib3goCi0JSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7Ci0vLwotLy8gRXhwYW5kZWQgSVYgZm9yIFRLSVAgZnVuY3Rpb24uCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9JVl9DT05UUk9MXwotewotCXVuaW9uIFBBQ0tFRAotCXsKLQkJc3RydWN0IFBBQ0tFRAotCQl7Ci0JCQlVQ0hBUgkJcmMwOwotCQkJVUNIQVIJCXJjMTsKLQkJCVVDSEFSCQlyYzI7Ci0KLQkJCXVuaW9uIFBBQ0tFRAotCQkJewotCQkJCXN0cnVjdCBQQUNLRUQKLQkJCQl7Ci0JCQkJCVVDSEFSCVJzdmQ6NTsKLQkJCQkJVUNIQVIJRXh0SVY6MTsKLQkJCQkJVUNIQVIJS2V5SUQ6MjsKLQkJCQl9CWZpZWxkOwotCQkJCVVDSEFSCQlCeXRlOwotCQkJfQlDT05UUk9MOwotCQl9CWZpZWxkOwotCi0JCVVMT05HCXdvcmQ7Ci0JfQlJVjE2OwotCi0JVUxPTkcJSVYzMjsKLX0JVEtJUF9JViwgKlBUS0lQX0lWOwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb252ZXJ0IGZyb20gVUNIQVJbXSB0byBVTE9ORyBpbiBhIHBvcnRhYmxlIHdheQotCi0JQXJndW1lbnRzOgotICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VTE9ORwlSVE1QVGtpcEdldFVJbnQzMigKLQlJTglQVUNIQVIJcE1JQ0tleSkKLXsKLQlVTE9ORwlyZXMgPSAwOwotCUlOVAkJaTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlyZXMgfD0gKCpwTUlDS2V5KyspIDw8ICg4ICogaSk7Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbnZlcnQgZnJvbSBVTE9ORyB0byBVQ0hBUltdIGluIGEgcG9ydGFibGUgd2F5Ci0KLQlBcmd1bWVudHM6Ci0gICAgICBwRHN0CQkJcG9pbnRlciB0byBkZXN0aW5hdGlvbiBmb3IgY29udmVydCBVTE9ORyB0byBVQ0hBUltdCi0gICAgICB2YWwJCQl0aGUgdmFsdWUgZm9yIGNvbnZlcnQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcFB1dFVJbnQzMigKLQlJTiBPVVQJUFVDSEFSCQlwRHN0LAotCUlOCQlVTE9ORwkJdmFsKQotewotCUlOVCBpOwotCi0JZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkJKnBEc3QrKyA9IChVQ0hBUikgKHZhbCAmIDB4ZmYpOwotCQl2YWwgPj49IDg7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJU2V0IHRoZSBNSUMgS2V5LgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QVGtpcFNldE1JQ0tleSgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglQVUNIQVIJCQlwTUlDS2V5KQotewotCS8vIFNldCB0aGUga2V5Ci0JcFRraXAtPkswID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSk7Ci0JcFRraXAtPksxID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSArIDQpOwotCS8vIGFuZCByZXNldCB0aGUgbWVzc2FnZQotCXBUa2lwLT5MID0gcFRraXAtPkswOwotCXBUa2lwLT5SID0gcFRraXAtPksxOwotCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOwotCXBUa2lwLT5NID0gMDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICB1Q2hhcgkJCUFwcGVuZCB0aGlzIHVDaGFyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFRraXBBcHBlbmRCeXRlKAotCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAotCUlOCVVDSEFSIAkJCXVDaGFyKQotewotCS8vIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIKLQlwVGtpcC0+TSB8PSAodUNoYXIgPDwgKDgqIHBUa2lwLT5uQnl0ZXNJbk0pKTsKLQlwVGtpcC0+bkJ5dGVzSW5NKys7Ci0JLy8gUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLgotCWlmKCBwVGtpcC0+bkJ5dGVzSW5NID49IDQgKQotCXsKLQkJcFRraXAtPkwgXj0gcFRraXAtPk07Ci0JCXBUa2lwLT5SIF49IFJPTDMyKCBwVGtpcC0+TCwgMTcgKTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCXBUa2lwLT5SIF49ICgocFRraXAtPkwgJiAweGZmMDBmZjAwKSA+PiA4KSB8ICgocFRraXAtPkwgJiAweDAwZmYwMGZmKSA8PCA4KTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCXBUa2lwLT5SIF49IFJPTDMyKCBwVGtpcC0+TCwgMyApOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJcFRraXAtPlIgXj0gUk9SMzIoIHBUa2lwLT5MLCAyICk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQkvLyBDbGVhciB0aGUgYnVmZmVyCi0JCXBUa2lwLT5NID0gMDsKLQkJcFRraXAtPm5CeXRlc0luTSA9IDA7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ2FsY3VsYXRlIHRoZSBNSUMgVmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0gICAgICBwQWQJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgIHBTcmMJCQlQb2ludGVyIHRvIHNvdXJjZSBkYXRhIGZvciBDYWxjdWxhdGUgTUlDIFZhbHVlCi0gICAgICBMZW4JCQlJbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgZGF0YQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBUa2lwQXBwZW5kKAotCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JVUlOVAkJCW5CeXRlcykKLXsKLQkvLyBUaGlzIGlzIHNpbXBsZQotCXdoaWxlKG5CeXRlcyA+IDApCi0JewotCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsICpwU3JjKyspOwotCQluQnl0ZXMtLTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlHZXQgdGhlIE1JQyBWYWx1ZS4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0JCXRoZSBNSUMgVmFsdWUgaXMgc3RvcmUgaW4gcEFkLT5Qcml2YXRlSW5mby5NSUMKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBUa2lwR2V0TUlDKAotCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwKQotewotCS8vIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nCi0JUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAweDVhICk7Ci0JUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JUlRNUFRraXBBcHBlbmRCeXRlKHBUa2lwLCAwICk7Ci0JLy8gYW5kIHRoZW4gemVyb2VzIHVudGlsIHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0Ci0Jd2hpbGUoIHBUa2lwLT5uQnl0ZXNJbk0gIT0gMCApCi0JewotCQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKLQl9Ci0JLy8gVGhlIGFwcGVuZEJ5dGUgZnVuY3Rpb24gaGFzIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlc3VsdC4KLQlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDLCBwVGtpcC0+TCk7Ci0JUlRNUFRraXBQdXRVSW50MzIocFRraXAtPk1JQyArIDQsIHBUa2lwLT5SKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUluaXQgVGtpcCBmdW5jdGlvbi4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KLQkJS2V5SWQJCVRLIEtleSBJRAotCQlwVEEJCQlQb2ludGVyIHRvIHRyYW5zbWl0dGVyIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEluaXRUa2lwRW5naW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBLZXksCi0JSU4JVUNIQVIJCQlLZXlJZCwKLQlJTglQVUNIQVIJCQlwVEEsCi0JSU4JUFVDSEFSCQkJcE1JQ0tleSwKLQlJTglQVUNIQVIJCQlwVFNDLAotCU9VVAlQVUxPTkcJCQlwSVYxNiwKLQlPVVQJUFVMT05HCQkJcElWMzIpCi17Ci0JVEtJUF9JVgl0a2lwSXY7Ci0KLQkvLyBQcmVwYXJlIDggYnl0ZXMgVEtJUCBlbmNhcHN1bGF0aW9uIGZvciBNUERVCi0JTmRpc1plcm9NZW1vcnkoJnRraXBJdiwgc2l6ZW9mKFRLSVBfSVYpKTsKLQl0a2lwSXYuSVYxNi5maWVsZC5yYzAgPSAqKHBUU0MgKyAxKTsKLQl0a2lwSXYuSVYxNi5maWVsZC5yYzEgPSAodGtpcEl2LklWMTYuZmllbGQucmMwIHwgMHgyMCkgJiAweDdmOwotCXRraXBJdi5JVjE2LmZpZWxkLnJjMiA9ICpwVFNDOwotCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuRXh0SVYgPSAxOyAgLy8gMDogbm9uLWV4dGVuZGVkIElWLCAxOiBhbiBleHRlbmRlZCBJVgotCXRraXBJdi5JVjE2LmZpZWxkLkNPTlRST0wuZmllbGQuS2V5SUQgPSBLZXlJZDsKLQlOZGlzTW92ZU1lbW9yeSgmdGtpcEl2LklWMzIsIChwVFNDICsgMiksIDQpOyAgIC8vIENvcHkgSVYKLQotCSpwSVYxNiA9IHRraXBJdi5JVjE2LndvcmQ7Ci0JKnBJVjMyID0gdGtpcEl2LklWMzI7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlJbml0IE1JQyBWYWx1ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB3aGljaCBpbmNsdWRlIHNldCBNSUMga2V5ICYKLQkJY2FsY3VsYXRlIGZpcnN0IDE2IGJ5dGVzIChEQSArIFNBICsgcHJpb3JpdHkgKyAgMCkKLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwVEtleSAgICAgICBQb2ludGVyIHRvIHRoZSBUZW1wb3JhbCBLZXkgKFRLKSwgVEsgc2hhbGwgYmUgMTI4Yml0cy4KLQkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCi0JCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEluaXRNSUNFbmdpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEtleSwKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JUFVDSEFSCQkJcFNBLAotCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAotCUlOCVBVQ0hBUgkJCXBNSUNLZXkpCi17Ci0JVUxPTkcgUHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7Ci0KLQkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgotCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwTUlDS2V5KTsKLQkvLyBEQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwREEsIE1BQ19BRERSX0xFTik7Ci0JLy8gU0EKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNBLCBNQUNfQUREUl9MRU4pOwotCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbXBhcmUgTUlDIHZhbHVlIG9mIHJlY2VpdmVkIE1TRFUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgUGxhaW4gdGV4dCBkYXRhCi0JCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcwotCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBsYWluIHRleHQgZGF0YSBleGNsdWRlIE1JQyB2YWx1ZQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFICAgICAgICBNSUMgdmFsdWUgbWF0Y2hlZAotCQlGQUxTRSAgICAgICBNSUMgdmFsdWUgbWlzbWF0Y2hlZAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTglQVUNIQVIJCQlwU0EsCi0JSU4JUFVDSEFSCQkJcE1JQ0tleSwKLQlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKLQlJTglVSU5UCQkJTGVuKQotewotCVVDSEFSCU9sZE1pY1s4XTsKLQlVTE9ORwlQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKLQotCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCi0JUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBNSUNLZXkpOwotCS8vIERBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBEQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBTQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU0EsIE1BQ19BRERSX0xFTik7Ci0JLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOwotCi0JLy8gQ2FsY3VsYXRlIE1JQyB2YWx1ZSBmcm9tIHBsYWluIHRleHQgZGF0YQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwU3JjLCBMZW4pOwotCi0JLy8gR2V0IE1JQyB2YWx1ZGUgZnJvbSByZWNlaXZlZCBmcmFtZQotCU5kaXNNb3ZlTWVtb3J5KE9sZE1pYywgcFNyYyArIExlbiwgOCk7Ci0KLQkvLyBHZXQgTUlDIHZhbHVlIGZyb20gZGVjcnlwdGVkIHBsYWluIGRhdGEKLQlSVE1QVGtpcEdldE1JQygmcEFkLT5Qcml2YXRlSW5mby5SeCk7Ci0KLQkvLyBNb3ZlIE1JQyB2YWx1ZSBmcm9tIE1TRFUsIHRoaXMgc3RlcHMgc2hvdWxkIG1vdmUgdG8gZGF0YSBwYXRoLgotCS8vIFNpbmNlIHRoZSBNSUMgdmFsdWUgbWlnaHQgY3Jvc3MgTVBEVXMuCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlByaXZhdGVJbmZvLlJ4Lk1JQywgT2xkTWljLCA4KSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgpOiBUS0lQIE1JQyBFcnJvciAhXG4iKSk7ICAvL01JQyBlcnJvci4KLQotCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29tcGFyZSBNSUMgdmFsdWUgb2YgcmVjZWl2ZWQgTVNEVQotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwTExDCQlMTEMgaGVhZGVyCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIHJlY2VpdmVkIFBsYWluIHRleHQgZGF0YQotCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKLQkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwbGFpbiB0ZXh0IGRhdGEgZXhjbHVkZSBNSUMgdmFsdWUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgTUlDIHZhbHVlIG1hdGNoZWQKLQkJRkFMU0UgICAgICAgTUlDIHZhbHVlIG1pc21hdGNoZWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBMTEMsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglQVUNIQVIJCQlwREEsCi0JSU4JUFVDSEFSCQkJcFNBLAotCUlOCVBVQ0hBUgkJCXBNSUNLZXksCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVQ0hBUglPbGRNaWNbOF07Ci0JVUxPTkcJUHJpb3JpdHkgPSAwOwotCi0JLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KLQlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcE1JQ0tleSk7Ci0JLy8gREEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcERBLCBNQUNfQUREUl9MRU4pOwotCS8vIFNBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Ci0KLQkvLyBTdGFydCB3aXRoIExMQyBoZWFkZXIKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcExMQywgOCk7Ci0KLQkvLyBDYWxjdWxhdGUgTUlDIHZhbHVlIGZyb20gcGxhaW4gdGV4dCBkYXRhCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTcmMsIExlbik7Ci0KLQkvLyBHZXQgTUlDIHZhbHVkZSBmcm9tIHJlY2VpdmVkIGZyYW1lCi0JTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwU3JjICsgTGVuLCA4KTsKLQotCS8vIEdldCBNSUMgdmFsdWUgZnJvbSBkZWNyeXB0ZWQgcGxhaW4gZGF0YQotCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlJ4KTsKLQotCS8vIE1vdmUgTUlDIHZhbHVlIGZyb20gTVNEVSwgdGhpcyBzdGVwcyBzaG91bGQgbW92ZSB0byBkYXRhIHBhdGguCi0JLy8gU2luY2UgdGhlIE1JQyB2YWx1ZSBtaWdodCBjcm9zcyBNUERVcy4KLQlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+UHJpdmF0ZUluZm8uUnguTUlDLCBPbGRNaWMsIDgpKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygpOiBUS0lQIE1JQyBFcnJvciAhXG4iKSk7ICAvL01JQyBlcnJvci4KLQotCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOwotfQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAotCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSB0cmFuc21pdCBmdW5jdGlvbgotCi0JQXJndW1lbnRzOgotCQlwQWQJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJUE5ESVNfUEFDS0VUCVBvaW50ZXIgdG8gTmRpcyBQYWNrZXQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCQlwRW5jYXAJCQlQb2ludGVyIHRvIExMQyBlbmNhcCBkYXRhCi0JCUxlbkVuY2FwCQlUb3RhbCBlbmNhcCBsZW5ndGgsIG1pZ2h0IGJlIDAgd2hpY2ggaW5kaWNhdGVzIG5vIGVuY2FwCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBFbmNhcCwKLQlJTglQQ0lQSEVSX0tFWQkJcEtleSwKLQlJTglVQ0hBUgkJCWFwaWR4KQotewotCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBVQ0hBUgkJCXBTcmM7Ci0gICAgVUNIQVIgICAgICAgICAgIFVzZXJQcmlvcml0eTsKLQlVQ0hBUgkJCXZsYW5fb2Zmc2V0ID0gMDsKLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQotCVVzZXJQcmlvcml0eSA9IFJUTVBfR0VUX1BBQ0tFVF9VUChwUGFja2V0KTsKLQlwU3JjID0gcFNyY0J1ZlZBOwotCi0JLy8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB2bGFuIHBhY2tldAotCWlmICgoKCoocFNyYyArIDEyKSA8PCA4KSArICoocFNyYyArIDEzKSkgPT0gMHg4MTAwKQotCQl2bGFuX29mZnNldCA9IDQ7Ci0KLQl7Ci0JCVJUTVBJbml0TUlDRW5naW5lKAotCQkJcEFkLAotCQkJcEtleS0+S2V5LAotCQkJcFNyYywKLQkJCXBTcmMgKyA2LAotCQkJVXNlclByaW9yaXR5LAotCQkJcEtleS0+VHhNaWMpOwotCX0KLQotCi0JaWYgKHBFbmNhcCAhPSBOVUxMKQotCXsKLQkJLy8gTExDIGVuY2Fwc3VsYXRpb24KLQkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBFbmNhcCwgNik7Ci0JCS8vIFByb3RvY29sIFR5cGUKLQkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMgKyAxMiArIHZsYW5fb2Zmc2V0LCAyKTsKLQl9Ci0JU3JjQnVmTGVuIC09ICgxNCArIHZsYW5fb2Zmc2V0KTsKLQlwU3JjICs9ICgxNCArIHZsYW5fb2Zmc2V0KTsKLQlkbwotCXsKLQkJaWYgKFNyY0J1ZkxlbiA+IDApCi0JCXsKLQkJCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU3JjLCBTcmNCdWZMZW4pOwotCQl9Ci0KLQkJYnJlYWs7CS8vIE5vIG5lZWQgaGFuZGxlIG5leHQgcGFja2V0Ci0KLQl9CXdoaWxlIChUUlVFKTsJCS8vIEVuZCBvZiBjb3B5aW5nIHBheWxvYWQKLQotCS8vIENvbXB1dGUgdGhlIGZpbmFsIE1JQyBWYWx1ZQotCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlR4KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdGtpcF9zYm94KCkJCQkJCQkJCQkJCQkJCQkJKi8KLS8qIFJldHVybnMgYSAxNiBiaXQgdmFsdWUgZnJvbSBhIDY0SyBlbnRyeSB0YWJsZS4gVGhlIFRhYmxlICovCi0vKiBpcyBzeW50aGVzaXplZCBmcm9tIHR3byAyNTYgZW50cnkgYnl0ZSB3aWRlIHRhYmxlcy4JCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1VSU5UIHRraXBfc2JveChVSU5UIGluZGV4KQotewotCVVJTlQgaW5kZXhfbG93OwotCVVJTlQgaW5kZXhfaGlnaDsKLQlVSU5UIGxlZnQsIHJpZ2h0OwotCi0JaW5kZXhfbG93ID0gKGluZGV4ICUgMjU2KTsKLQlpbmRleF9oaWdoID0gKChpbmRleCA+PiA4KSAlIDI1Nik7Ci0KLQlsZWZ0ID0gVGtpcF9TYm94X0xvd2VyW2luZGV4X2xvd10gKyAoVGtpcF9TYm94X1VwcGVyW2luZGV4X2xvd10gKiAyNTYpOwotCXJpZ2h0ID0gVGtpcF9TYm94X1VwcGVyW2luZGV4X2hpZ2hdICsgKFRraXBfU2JveF9Mb3dlcltpbmRleF9oaWdoXSAqIDI1Nik7Ci0KLQlyZXR1cm4gKGxlZnQgXiByaWdodCk7Ci19Ci0KLVVJTlQgcm90cjEoVUlOVCBhKQotewotCXVuc2lnbmVkIGludCBiOwotCi0JaWYgKChhICYgMHgwMSkgPT0gMHgwMSkKLQl7Ci0JCWIgPSAoYSA+PiAxKSB8IDB4ODAwMDsKLQl9Ci0JZWxzZQotCXsKLQkJYiA9IChhID4+IDEpICYgMHg3ZmZmOwotCX0KLQliID0gYiAlIDY1NTM2OwotCXJldHVybiBiOwotfQotCi1WT0lEIFJUTVBUa2lwTWl4S2V5KAotCVVDSEFSICprZXksCi0JVUNIQVIgKnRhLAotCVVMT05HIHBubCwgLyogTGVhc3Qgc2lnbmlmaWNhbnQgMTYgYml0cyBvZiBQTiAqLwotCVVMT05HIHBuaCwgLyogTW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIFBOICovCi0JVUNIQVIgKnJjNGtleSwKLQlVSU5UICpwMWspCi17Ci0KLQlVSU5UIHRzYzA7Ci0JVUlOVCB0c2MxOwotCVVJTlQgdHNjMjsKLQotCVVJTlQgcHBrMDsKLQlVSU5UIHBwazE7Ci0JVUlOVCBwcGsyOwotCVVJTlQgcHBrMzsKLQlVSU5UIHBwazQ7Ci0JVUlOVCBwcGs1OwotCi0JSU5UIGk7Ci0JSU5UIGo7Ci0KLQl0c2MwID0gKHVuc2lnbmVkIGludCkoKHBuaCA+PiAxNikgJSA2NTUzNik7IC8qIG1zYiAqLwotCXRzYzEgPSAodW5zaWduZWQgaW50KShwbmggJSA2NTUzNik7Ci0JdHNjMiA9ICh1bnNpZ25lZCBpbnQpKHBubCAlIDY1NTM2KTsgLyogbHNiICovCi0KLQkvKiBQaGFzZSAxLCBzdGVwIDEgKi8KLQlwMWtbMF0gPSB0c2MxOwotCXAxa1sxXSA9IHRzYzA7Ci0JcDFrWzJdID0gKFVJTlQpKHRhWzBdICsgKHRhWzFdKjI1NikpOwotCXAxa1szXSA9IChVSU5UKSh0YVsyXSArICh0YVszXSoyNTYpKTsKLQlwMWtbNF0gPSAoVUlOVCkodGFbNF0gKyAodGFbNV0qMjU2KSk7Ci0KLQkvKiBQaGFzZSAxLCBzdGVwIDIgKi8KLQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JewotCQlqID0gMiooaSAmIDEpOwotCQlwMWtbMF0gPSAocDFrWzBdICsgdGtpcF9zYm94KCAocDFrWzRdIF4gKCgyNTYqa2V5WzEral0pICsga2V5W2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbMV0gPSAocDFrWzFdICsgdGtpcF9zYm94KCAocDFrWzBdIF4gKCgyNTYqa2V5WzUral0pICsga2V5WzQral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1syXSA9IChwMWtbMl0gKyB0a2lwX3Nib3goIChwMWtbMV0gXiAoKDI1NiprZXlbOStqXSkgKyBrZXlbOCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzNdID0gKHAxa1szXSArIHRraXBfc2JveCggKHAxa1syXSBeICgoMjU2KmtleVsxMytqXSkgKyBrZXlbMTIral0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1s0XSA9IChwMWtbNF0gKyB0a2lwX3Nib3goIChwMWtbM10gXiAoKCgyNTYqa2V5WzEral0pICsga2V5W2pdKSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzRdID0gKHAxa1s0XSArIGkpICUgNjU1MzY7Ci0JfQotCi0JLyogUGhhc2UgMiwgU3RlcCAxICovCi0JcHBrMCA9IHAxa1swXTsKLQlwcGsxID0gcDFrWzFdOwotCXBwazIgPSBwMWtbMl07Ci0JcHBrMyA9IHAxa1szXTsKLQlwcGs0ID0gcDFrWzRdOwotCXBwazUgPSAocDFrWzRdICsgdHNjMikgJSA2NTUzNjsKLQotCS8qIFBoYXNlMiwgU3RlcCAyICovCi0JcHBrMCA9IHBwazAgKyB0a2lwX3Nib3goIChwcGs1IF4gKCgyNTYqa2V5WzFdKSArIGtleVswXSkpICUgNjU1MzYpOwotCXBwazEgPSBwcGsxICsgdGtpcF9zYm94KCAocHBrMCBeICgoMjU2KmtleVszXSkgKyBrZXlbMl0pKSAlIDY1NTM2KTsKLQlwcGsyID0gcHBrMiArIHRraXBfc2JveCggKHBwazEgXiAoKDI1NiprZXlbNV0pICsga2V5WzRdKSkgJSA2NTUzNik7Ci0JcHBrMyA9IHBwazMgKyB0a2lwX3Nib3goIChwcGsyIF4gKCgyNTYqa2V5WzddKSArIGtleVs2XSkpICUgNjU1MzYpOwotCXBwazQgPSBwcGs0ICsgdGtpcF9zYm94KCAocHBrMyBeICgoMjU2KmtleVs5XSkgKyBrZXlbOF0pKSAlIDY1NTM2KTsKLQlwcGs1ID0gcHBrNSArIHRraXBfc2JveCggKHBwazQgXiAoKDI1NiprZXlbMTFdKSArIGtleVsxMF0pKSAlIDY1NTM2KTsKLQotCXBwazAgPSBwcGswICsgcm90cjEocHBrNSBeICgoMjU2KmtleVsxM10pICsga2V5WzEyXSkpOwotCXBwazEgPSBwcGsxICsgcm90cjEocHBrMCBeICgoMjU2KmtleVsxNV0pICsga2V5WzE0XSkpOwotCXBwazIgPSBwcGsyICsgcm90cjEocHBrMSk7Ci0JcHBrMyA9IHBwazMgKyByb3RyMShwcGsyKTsKLQlwcGs0ID0gcHBrNCArIHJvdHIxKHBwazMpOwotCXBwazUgPSBwcGs1ICsgcm90cjEocHBrNCk7Ci0KLQkvKiBQaGFzZSAyLCBTdGVwIDMgKi8KLSAgICAvKiBQaGFzZSAyLCBTdGVwIDMgKi8KLQotCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsgLyogbXNiICovCi0JdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKLQl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOyAvKiBsc2IgKi8KLQotCXJjNGtleVswXSA9ICh0c2MyID4+IDgpICUgMjU2OwotCXJjNGtleVsxXSA9ICgoKHRzYzIgPj4gOCkgJSAyNTYpIHwgMHgyMCkgJiAweDdmOwotCXJjNGtleVsyXSA9IHRzYzIgJSAyNTY7Ci0JcmM0a2V5WzNdID0gKChwcGs1IF4gKCgyNTYqa2V5WzFdKSArIGtleVswXSkpID4+IDEpICUgMjU2OwotCi0JcmM0a2V5WzRdID0gcHBrMCAlIDI1NjsKLQlyYzRrZXlbNV0gPSAocHBrMCA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVs2XSA9IHBwazEgJSAyNTY7Ci0JcmM0a2V5WzddID0gKHBwazEgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbOF0gPSBwcGsyICUgMjU2OwotCXJjNGtleVs5XSA9IChwcGsyID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzEwXSA9IHBwazMgJSAyNTY7Ci0JcmM0a2V5WzExXSA9IChwcGszID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzEyXSA9IHBwazQgJSAyNTY7Ci0JcmM0a2V5WzEzXSA9IChwcGs0ID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzE0XSA9IHBwazUgJSAyNTY7Ci0JcmM0a2V5WzE1XSA9IChwcGs1ID4+IDgpICUgMjU2OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSgKLQl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMSwKLQlpbnQgaGVhZGVyX2xlbmd0aCwKLQl1bnNpZ25lZCBjaGFyICptcGR1KQotewotCW1pY19oZWFkZXIxWzBdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgLyAyNTYpOwotCW1pY19oZWFkZXIxWzFdID0gKHVuc2lnbmVkIGNoYXIpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOwotCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7ICAgIC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCi0JbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgICAgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KLQltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07ICAgICAgIC8qIEExICovCi0JbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOwotCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKLQltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107Ci0JbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOwotCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKLQltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgICAgIC8qIEEyICovCi0JbWljX2hlYWRlcjFbMTFdID0gbXBkdVsxMV07Ci0JbWljX2hlYWRlcjFbMTJdID0gbXBkdVsxMl07Ci0JbWljX2hlYWRlcjFbMTNdID0gbXBkdVsxM107Ci0JbWljX2hlYWRlcjFbMTRdID0gbXBkdVsxNF07Ci0JbWljX2hlYWRlcjFbMTVdID0gbXBkdVsxNV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMigKLQl1bnNpZ25lZCBjaGFyICptaWNfaGVhZGVyMiwKLQl1bnNpZ25lZCBjaGFyICptcGR1LAotCWludCBhNF9leGlzdHMsCi0JaW50IHFjX2V4aXN0cykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgbWljX2hlYWRlcjJbaV09MHgwMDsKLQotCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07ICAgIC8qIEEzICovCi0JbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKLQltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOwotCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07Ci0JbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKLQltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOwotCi0JLy8gSW4gU2VxdWVuY2UgQ29udHJvbCBmaWVsZCwgbXV0ZSBzZXF1ZW5jZSBudW1lciBiaXRzICgxMi1iaXQpCi0JbWljX2hlYWRlcjJbNl0gPSBtcGR1WzIyXSAmIDB4MGY7ICAgLyogU0MgKi8KLQltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLwotCi0JaWYgKCghcWNfZXhpc3RzKSAmIGE0X2V4aXN0cykKLQl7Ci0JCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmICghYTRfZXhpc3RzKSkKLQl7Ci0JCW1pY19oZWFkZXIyWzhdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgMTUgLSA0ICovCi0JCW1pY19oZWFkZXIyWzldID0gbXBkdVsyNV0gJiAweDAwOwotCX0KLQotCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQotCXsKLQkJZm9yIChpPTA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KLQotCQltaWNfaGVhZGVyMlsxNF0gPSBtcGR1WzMwXSAmIDB4MGY7Ci0JCW1pY19oZWFkZXIyWzE1XSA9IG1wZHVbMzFdICYgMHgwMDsKLQl9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2l2KAotCXVuc2lnbmVkIGNoYXIgKm1pY19pdiwKLQlpbnQgcWNfZXhpc3RzLAotCWludCBhNF9leGlzdHMsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqcG5fdmVjdG9yKQotewotCWludCBpOwotCi0JbWljX2l2WzBdID0gMHg1OTsKLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAgICAvKiBRb1NfVEMgICAgICAgICAgICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQotCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7ICAgLyogbXV0ZSBiaXRzIDctNCAgICAqLwotCWlmICghcWNfZXhpc3RzKQotCQltaWNfaXZbMV0gPSAweDAwOwotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOyAgICAgICAgICAgICAgICAgICAgLyogbWljX2l2WzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLSNpZmRlZiBDT05TSVNURU5UX1BOX09SREVSCi0JCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yW2kgLSA4XTsgICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzA6NV0gKi8KLSNlbHNlCi0JCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQkJbWljX2l2W2ldID0gcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIG1pY19pdls4OjEzXSA9IFBOWzU6MF0gKi8KLSNlbmRpZgotCWkgPSAocGF5bG9hZF9sZW5ndGggLyAyNTYpOwotCWkgPSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikgKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKLQltaWNfaXZbMTVdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAlIDI1Nik7Ci0KLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLwotLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYml0d2lzZV94b3IodW5zaWduZWQgY2hhciAqaW5hLCB1bnNpZ25lZCBjaGFyICppbmIsIHVuc2lnbmVkIGNoYXIgKm91dCkKLXsKLQlpbnQgaTsKLQlmb3IgKGk9MDsgaTwxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gaW5hW2ldIF4gaW5iW2ldOwotCX0KLX0KLQotCi12b2lkIGFlczEyOGsxMjhkKHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqY2lwaGVydGV4dCkKLXsKLQlpbnQgcm91bmQ7Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGVhWzE2XTsKLQl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWJbMTZdOwotCXVuc2lnbmVkIGNoYXIgcm91bmRfa2V5WzE2XTsKLQotCWZvcihpPTA7IGk8MTY7IGkrKykgcm91bmRfa2V5W2ldID0ga2V5W2ldOwotCi0JZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspCi0JewotCQlpZiAocm91bmQgPT0gMCkKLQkJewotCQkJeG9yXzEyOChyb3VuZF9rZXksIGRhdGEsIGNpcGhlcnRleHQpOwotCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0JCX0KLQkJZWxzZSBpZiAocm91bmQgPT0gMTApCi0JCXsKLQkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkJeG9yXzEyOChpbnRlcm1lZGlhdGViLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotCQl9Ci0JCWVsc2UgICAgLyogMSAtIDkgKi8KLQkJewotCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0JCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKLQkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotCQl9Ci0JfQotCi19Ci0KLXZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKAotCXVuc2lnbmVkIGNoYXIgKmN0cl9wcmVsb2FkLAotCWludCBhNF9leGlzdHMsCi0JaW50IHFjX2V4aXN0cywKLQl1bnNpZ25lZCBjaGFyICptcGR1LAotCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvciwKLQlpbnQgYykKLXsKLQotCWludCBpID0gMDsKLQlmb3IgKGk9MDsgaTwxNjsgaSsrKSBjdHJfcHJlbG9hZFtpXSA9IDB4MDA7Ci0JaSA9IDA7Ci0KLQljdHJfcHJlbG9hZFswXSA9IDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgLyogUW9DX0NvbnRyb2wgICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKLQotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0jaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgotCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzA6NV0gKi8KLSNlbHNlCi0JICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLwotI2VuZGlmCi0JY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8vIEN0cgotCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOwotCi19Ci0KLQotLy8KLS8vIFRSVUU6IFN1Y2Nlc3MhCi0vLyBGQUxTRTogRGVjcnlwdCBFcnJvciEKLS8vCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KQotewotCVVDSEFSCQkJS2V5SUQ7Ci0JVUlOVAkJCUhlYWRlckxlbjsKLSAgICBVQ0hBUgkJCWZjMDsKLQlVQ0hBUgkJCWZjMTsKLQlVU0hPUlQJCQlmYzsKLQlVSU5UCQkJZnJhbWVfdHlwZTsKLQlVSU5UCQkJZnJhbWVfc3VidHlwZTsKLSAgICBVSU5UCQkJZnJvbV9kczsKLSAgICBVSU5UCQkJdG9fZHM7Ci0JSU5UCQkJCWE0X2V4aXN0czsKLQlJTlQJCQkJcWNfZXhpc3RzOwotCVVTSE9SVAkJCWR1cmF0aW9uOwotCVVTSE9SVAkJCXNlcV9jb250cm9sOwotCVVTSE9SVAkJCXFvc19jb250cm9sOwotCVVDSEFSCQkJVEFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlTQVtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJUkM0S2V5WzE2XTsKLQlVSU5UCQkJcDFrWzVdOyAvL2ZvciBtaXhfa2V5OwotCVVMT05HCQkJcG5sOy8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KLQlVTE9ORwkJCXBuaDsvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KLQlVSU5UCQkJbnVtX2Jsb2NrczsKLQlVSU5UCQkJcGF5bG9hZF9yZW1haW5kZXI7Ci0JQVJDRk9VUkNPTlRFWFQgCUFyY0ZvdXJDb250ZXh0OwotCVVJTlQJCQljcmMzMiA9IDA7Ci0JVUlOVAkJCXRyYWlsZmNzID0gMDsKLQlVQ0hBUgkJCU1JQ1s4XTsKLQlVQ0hBUgkJCVRyYWlsTUlDWzhdOwotCi0JZmMwID0gKnBEYXRhOwotCWZjMSA9ICoocERhdGEgKyAxKTsKLQotCWZjID0gKigoUFVTSE9SVClwRGF0YSk7Ci0KLQlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKLQlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKLQotICAgIGZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOwotICAgIHRvX2RzID0gKGZjMSAmIDB4MSk7Ci0KLSAgICBhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKLSAgICBxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KLSAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KLSAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8Ci0gICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQotICAgICAgICAgICAgICAgICApOwotCi0JSGVhZGVyTGVuID0gMjQ7Ci0JaWYgKGE0X2V4aXN0cykKLQkJSGVhZGVyTGVuICs9IDY7Ci0KLQlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKLQlLZXlJRCA9IEtleUlEID4+IDY7Ci0KLQlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLCBLZXlJRCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JZHVyYXRpb24gPSAqKChQVVNIT1JUKShwRGF0YSsyKSk7Ci0KLQlzZXFfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzIyKSk7Ci0KLQlpZiAocWNfZXhpc3RzKQotCXsKLQkJaWYgKGE0X2V4aXN0cykKLQkJewotCQkJcW9zX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSszMCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcW9zX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyNCkpOwotCQl9Ci0JfQotCi0JaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAxKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOyAgLy9CU1NJRAotCX0KLQllbHNlIGlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMCApCi0JewotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JfQotCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAwKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKLQl9Ci0JZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDEpCi0JewotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzIyLCBNQUNfQUREUl9MRU4pOwotCX0KLQotCW51bV9ibG9ja3MgPSAoRGF0YUJ5dGVDbnQgLSAxNikgLyAxNjsKLQlwYXlsb2FkX3JlbWFpbmRlciA9IChEYXRhQnl0ZUNudCAtIDE2KSAlIDE2OwotCi0JcG5sID0gKCoocERhdGEgKyBIZWFkZXJMZW4pKSAqIDI1NiArICoocERhdGEgKyBIZWFkZXJMZW4gKyAyKTsKLQlwbmggPSAqKChQVUxPTkcpKHBEYXRhICsgSGVhZGVyTGVuICsgNCkpOwotCXBuaCA9IGNwdTJsZTMyKHBuaCk7Ci0JUlRNUFRraXBNaXhLZXkocFdwYUtleVtLZXlJRF0uS2V5LCBUQSwgcG5sLCBwbmgsIFJDNEtleSwgcDFrKTsKLQotCUFSQ0ZPVVJfSU5JVCgmQXJjRm91ckNvbnRleHQsIFJDNEtleSwgMTYpOwotCi0JQVJDRk9VUl9ERUNSWVBUKCZBcmNGb3VyQ29udGV4dCwgcERhdGEgKyBIZWFkZXJMZW4sIHBEYXRhICsgSGVhZGVyTGVuICsgOCwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4KTsKLQlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gNCwgNCk7Ci0JY3JjMzIgPSBSVE1QX0NBTENfRkNTMzIoUFBQSU5JVEZDUzMyLCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gNCk7ICAvL1NraXAgSVYrRUlWIDggYnl0ZXMgJiBTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLgotCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQotICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIElDViBFcnJvciAhXG4iKSk7CSAvL0lDViBlcnJvci4KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA4IC0gNCwgOCk7Ci0JUlRNUEluaXRNSUNFbmdpbmUocEFkLCBwV3BhS2V5W0tleUlEXS5LZXksIERBLCBTQSwgVXNlclByaW9yaXR5LCBwV3BhS2V5W0tleUlEXS5SeE1pYyk7Ci0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSAxMik7Ci0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uVHgpOwotCU5kaXNNb3ZlTWVtb3J5KE1JQywgcEFkLT5Qcml2YXRlSW5mby5UeC5NSUMsIDgpOwotCi0JaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCi0JCXJldHVybiAoRkFMU0UpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLQotCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gUENJUEhFUl9LRVkJcFdwYUtleSkKLXsKLQlVQ0hBUgkJCUtleUlEOwotCVVJTlQJCQlIZWFkZXJMZW47Ci0JVUNIQVIJCQlQTls2XTsKLQlVSU5UCQkJcGF5bG9hZF9sZW47Ci0JVUlOVAkJCW51bV9ibG9ja3M7Ci0JVUlOVAkJCXBheWxvYWRfcmVtYWluZGVyOwotCVVTSE9SVAkJCWZjOwotCVVDSEFSCQkJZmMwOwotCVVDSEFSCQkJZmMxOwotCVVJTlQJCQlmcmFtZV90eXBlOwotCVVJTlQJCQlmcmFtZV9zdWJ0eXBlOwotCVVJTlQJCQlmcm9tX2RzOwotCVVJTlQJCQl0b19kczsKLQlJTlQJCQkJYTRfZXhpc3RzOwotCUlOVAkJCQlxY19leGlzdHM7Ci0JVUNIQVIJCQlhZXNfb3V0WzE2XTsKLQlpbnQgCQkJcGF5bG9hZF9pbmRleDsKLQlVSU5UIAkJCWk7Ci0JVUNIQVIgCQkJY3RyX3ByZWxvYWRbMTZdOwotCVVDSEFSIAkJCWNoYWluX2J1ZmZlclsxNl07Ci0JVUNIQVIgCQkJcGFkZGVkX2J1ZmZlclsxNl07Ci0JVUNIQVIgCQkJbWljX2l2WzE2XTsKLQlVQ0hBUiAJCQltaWNfaGVhZGVyMVsxNl07Ci0JVUNIQVIgCQkJbWljX2hlYWRlcjJbMTZdOwotCVVDSEFSCQkJTUlDWzhdOwotCVVDSEFSCQkJVHJhaWxNSUNbOF07Ci0KLQlmYzAgPSAqcERhdGE7Ci0JZmMxID0gKihwRGF0YSArIDEpOwotCi0JZmMgPSAqKChQVVNIT1JUKXBEYXRhKTsKLQotCWZyYW1lX3R5cGUgPSAoKGZjMCA+PiAyKSAmIDB4MDMpOwotCWZyYW1lX3N1YnR5cGUgPSAoKGZjMCA+PiA0KSAmIDB4MGYpOwotCi0JZnJvbV9kcyA9IChmYzEgJiAweDIpID4+IDE7Ci0JdG9fZHMgPSAoZmMxICYgMHgxKTsKLQotCWE0X2V4aXN0cyA9IChmcm9tX2RzICYgdG9fZHMpOwotCXFjX2V4aXN0cyA9ICgoZnJhbWVfc3VidHlwZSA9PSAweDA4KSB8fCAgICAvKiBBc3N1bWVkIFFvUyBzdWJ0eXBlcyAqLwotCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwOSkgfHwgICAvKiBMaWtlbHkgdG8gY2hhbmdlLiAgICAqLwotCQkJCSAgKGZyYW1lX3N1YnR5cGUgPT0gMHgwYSkgfHwKLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGIpCi0JCQkJICk7Ci0KLQlIZWFkZXJMZW4gPSAyNDsKLQlpZiAoYTRfZXhpc3RzKQotCQlIZWFkZXJMZW4gKz0gNjsKLQotCUtleUlEID0gKigoUFVDSEFSKShwRGF0YSsgSGVhZGVyTGVuICsgMykpOwotCUtleUlEID0gS2V5SUQgPj4gNjsKLQotCWlmIChwV3BhS2V5W0tleUlEXS5LZXlMZW4gPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdEFFUyBmYWlsZWQhKEtleUlEWyVkXSBMZW5ndGggY2FuIG5vdCBiZSAwKVxuIiwgS2V5SUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVBOWzBdID0gKihwRGF0YSsgSGVhZGVyTGVuKTsKLQlQTlsxXSA9ICoocERhdGErIEhlYWRlckxlbiArIDEpOwotCVBOWzJdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNCk7Ci0JUE5bM10gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA1KTsKLQlQTls0XSA9ICoocERhdGErIEhlYWRlckxlbiArIDYpOwotCVBOWzVdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNyk7Ci0KLQlwYXlsb2FkX2xlbiA9IERhdGFCeXRlQ250IC0gSGVhZGVyTGVuIC0gOCAtIDg7CS8vIDggYnl0ZXMgZm9yIENDTVAgaGVhZGVyICwgOCBieXRlcyBmb3IgTUlDCi0JcGF5bG9hZF9yZW1haW5kZXIgPSAocGF5bG9hZF9sZW4pICUgMTY7Ci0JbnVtX2Jsb2NrcyA9IChwYXlsb2FkX2xlbikgLyAxNjsKLQotCi0KLQkvLyBGaW5kIHN0YXJ0IG9mIHBheWxvYWQKLQlwYXlsb2FkX2luZGV4ID0gSGVhZGVyTGVuICsgODsgLy9JVitFSVYKLQotCWZvciAoaT0wOyBpPCBudW1fYmxvY2tzOyBpKyspCi0JewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQkJcWNfZXhpc3RzLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJUE4sCi0JCQkJCQkJCWkrMSApOwotCi0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgY2hhaW5fYnVmZmVyKTsKLQkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCAxNik7Ci0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JfQotCi0JLy8KLQkvLyBJZiB0aGVyZSBpcyBhIHNob3J0IGZpbmFsIGJsb2NrLCB0aGVuIHBhZCBpdAotCS8vIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCS8vCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkKLQl7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwKLQkJCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJCQlxY19leGlzdHMsCi0JCQkJCQkJCXBEYXRhLAotCQkJCQkJCQlQTiwKLQkJCQkJCQkJbnVtX2Jsb2NrcyArIDEpOwotCi0JCU5kaXNaZXJvTWVtb3J5KHBhZGRlZF9idWZmZXIsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0KLQkJYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0KLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJTmRpc01vdmVNZW1vcnkocERhdGEgKyBwYXlsb2FkX2luZGV4IC0gOCwgY2hhaW5fYnVmZmVyLCBwYXlsb2FkX3JlbWFpbmRlcik7Ci0JCXBheWxvYWRfaW5kZXggKz0gcGF5bG9hZF9yZW1haW5kZXI7Ci0JfQotCi0JLy8KLQkvLyBEZXNjcnlwdCB0aGUgTUlDCi0JLy8KLQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJYTRfZXhpc3RzLAotCQkJCQkJCXFjX2V4aXN0cywKLQkJCQkJCQlwRGF0YSwKLQkJCQkJCQlQTiwKLQkJCQkJCQkwKTsKLQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JTmRpc01vdmVNZW1vcnkocGFkZGVkX2J1ZmZlciwgcERhdGEgKyBwYXlsb2FkX2luZGV4LCA4KTsKLQotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQotCU5kaXNNb3ZlTWVtb3J5KFRyYWlsTUlDLCBjaGFpbl9idWZmZXIsIDgpOwotCi0JLy8KLQkvLyBDYWxjdWxhdGUgTUlDCi0JLy8KLQotCS8vRm9yY2UgdGhlIHByb3RlY3RlZCBmcmFtZSBiaXQgb24KLQkqKHBEYXRhICsgMSkgPSAqKHBEYXRhICsgMSkgfCAweDQwOwotCi0JLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCi0JLy8gQmVjYXVzZSB0aGUgQ0NNUCBoZWFkZXIgaGFzIGJlZW4gcmVtb3ZlZAotCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW47Ci0KLQljb25zdHJ1Y3RfbWljX2l2KAotCQkJCQltaWNfaXYsCi0JCQkJCXFjX2V4aXN0cywKLQkJCQkJYTRfZXhpc3RzLAotCQkJCQlwRGF0YSwKLQkJCQkJcGF5bG9hZF9sZW4sCi0JCQkJCVBOKTsKLQotCWNvbnN0cnVjdF9taWNfaGVhZGVyMSgKLQkJCQkJCW1pY19oZWFkZXIxLAotCQkJCQkJSGVhZGVyTGVuLAotCQkJCQkJcERhdGEpOwotCi0JY29uc3RydWN0X21pY19oZWFkZXIyKAotCQkJCQkJbWljX2hlYWRlcjIsCi0JCQkJCQlwRGF0YSwKLQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCXFjX2V4aXN0cyk7Ci0KLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIG1pY19pdiwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQotCS8vIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIDE2IGJ5dGUgcGF5bG9hZCBibG9jawotCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspCi0JewotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7Ci0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQkvLyBBZGQgb24gdGhlIGZpbmFsIHBheWxvYWQgYmxvY2sgaWYgaXQgbmVlZHMgcGFkZGluZwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCi0JewotCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0JLy8gYWVzX291dCBjb250YWlucyBwYWRkZWQgbWljLCBkaXNjYXJkIG1vc3Qgc2lnbmlmaWNhbnQKLQkvLyA4IGJ5dGVzIHRvIGdlbmVyYXRlIDY0IGJpdCBNSUMKLQlmb3IgKGkgPSAwIDsgaSA8IDg7IGkrKykgTUlDW2ldID0gYWVzX291dFtpXTsKLQotCWlmICghTmRpc0VxdWFsTWVtb3J5KE1JQywgVHJhaWxNSUMsIDgpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUFNvZnREZWNyeXB0QUVTLCBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBhZXMxMjhrMTI4ZCgpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBlcmZvcm1zIGEgMTI4IGJpdCBBRVMgZW5jcnlwdCB3aXRoICAqLwotLyogMTI4IGJpdCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVZPSUQgeG9yXzEyOCgKLQlJTiAgUFVDSEFSICBhLAotCUlOICBQVUNIQVIgIGIsCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCUlOVCBpOwotCi0JZm9yIChpPTA7aTwxNjsgaSsrKQotCXsKLQkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci0JfQotfQotCi1WT0lEIG5leHRfa2V5KAotCUlOICBQVUNIQVIgIGtleSwKLQlJTiAgSU5UICAgICByb3VuZCkKLXsKLQlVQ0hBUiAgICAgICByY29uOwotCVVDSEFSICAgICAgIHNib3hfa2V5WzRdOwotCVVDSEFSICAgICAgIHJjb25fdGFibGVbMTJdID0KLQl7Ci0JCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsCi0JCTB4MWIsIDB4MzYsIDB4MzYsIDB4MzYKLQl9OwotCi0Jc2JveF9rZXlbMF0gPSBSVE1QQ2tpcFNib3goa2V5WzEzXSk7Ci0Jc2JveF9rZXlbMV0gPSBSVE1QQ2tpcFNib3goa2V5WzE0XSk7Ci0Jc2JveF9rZXlbMl0gPSBSVE1QQ2tpcFNib3goa2V5WzE1XSk7Ci0Jc2JveF9rZXlbM10gPSBSVE1QQ2tpcFNib3goa2V5WzEyXSk7Ci0KLQlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07Ci0KLQl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOwotCWtleVswXSA9IGtleVswXSBeIHJjb247Ci0KLQl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7Ci0JeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwotCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotfQotCi1WT0lEIHhvcl8zMigKLQlJTiAgUFVDSEFSICBhLAotCUlOICBQVUNIQVIgIGIsCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCUlOVCBpOwotCi0JZm9yIChpPTA7aTw0OyBpKyspCi0JewotCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLQl9Ci19Ci0KLVZPSUQgYnl0ZV9zdWIoCi0JSU4gIFBVQ0hBUiAgaW4sCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCUlOVCBpOwotCi0JZm9yIChpPTA7IGk8IDE2OyBpKyspCi0JewotCQlvdXRbaV0gPSBSVE1QQ2tpcFNib3goaW5baV0pOwotCX0KLX0KLQotVUNIQVIgUlRNUENraXBTYm94KAotCUlOICBVQ0hBUiAgIGEpCi17Ci0JcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOwotfQotCi1WT0lEIHNoaWZ0X3JvdygKLQlJTiAgUFVDSEFSICBpbiwKLQlPVVQgUFVDSEFSICBvdXQpCi17Ci0Jb3V0WzBdID0gIGluWzBdOwotCW91dFsxXSA9ICBpbls1XTsKLQlvdXRbMl0gPSAgaW5bMTBdOwotCW91dFszXSA9ICBpblsxNV07Ci0Jb3V0WzRdID0gIGluWzRdOwotCW91dFs1XSA9ICBpbls5XTsKLQlvdXRbNl0gPSAgaW5bMTRdOwotCW91dFs3XSA9ICBpblszXTsKLQlvdXRbOF0gPSAgaW5bOF07Ci0Jb3V0WzldID0gIGluWzEzXTsKLQlvdXRbMTBdID0gaW5bMl07Ci0Jb3V0WzExXSA9IGluWzddOwotCW91dFsxMl0gPSBpblsxMl07Ci0Jb3V0WzEzXSA9IGluWzFdOwotCW91dFsxNF0gPSBpbls2XTsKLQlvdXRbMTVdID0gaW5bMTFdOwotfQotCi1WT0lEIG1peF9jb2x1bW4oCi0JSU4gIFBVQ0hBUiAgaW4sCi0JT1VUIFBVQ0hBUiAgb3V0KQotewotCUlOVCAgICAgICAgIGk7Ci0JVUNIQVIgICAgICAgYWRkMWJbNF07Ci0JVUNIQVIgICAgICAgYWRkMWJmN1s0XTsKLQlVQ0hBUiAgICAgICByb3RsWzRdOwotCVVDSEFSICAgICAgIHN3YXBfaGFsZnNbNF07Ci0JVUNIQVIgICAgICAgYW5kZjdbNF07Ci0JVUNIQVIgICAgICAgcm90cls0XTsKLQlVQ0hBUiAgICAgICB0ZW1wWzRdOwotCVVDSEFSICAgICAgIHRlbXBiWzRdOwotCi0JZm9yIChpPTAgOyBpPDQ7IGkrKykKLQl7Ci0JCWlmICgoaW5baV0gJiAweDgwKT09IDB4ODApCi0JCQlhZGQxYltpXSA9IDB4MWI7Ci0JCWVsc2UKLQkJCWFkZDFiW2ldID0gMHgwMDsKLQl9Ci0KLQlzd2FwX2hhbGZzWzBdID0gaW5bMl07ICAgIC8qIFN3YXAgaGFsZnMgKi8KLQlzd2FwX2hhbGZzWzFdID0gaW5bM107Ci0Jc3dhcF9oYWxmc1syXSA9IGluWzBdOwotCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKLQotCXJvdGxbMF0gPSBpblszXTsgICAgICAgIC8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLwotCXJvdGxbMV0gPSBpblswXTsKLQlyb3RsWzJdID0gaW5bMV07Ci0Jcm90bFszXSA9IGluWzJdOwotCi0JYW5kZjdbMF0gPSBpblswXSAmIDB4N2Y7Ci0JYW5kZjdbMV0gPSBpblsxXSAmIDB4N2Y7Ci0JYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7Ci0JYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7Ci0KLQlmb3IgKGkgPSAzOyBpPjA7IGktLSkgICAgLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCi0JewotCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7Ci0JCWlmICgoYW5kZjdbaS0xXSAmIDB4ODApID09IDB4ODApCi0JCXsKLQkJCWFuZGY3W2ldID0gKGFuZGY3W2ldIHwgMHgwMSk7Ci0JCX0KLQl9Ci0JYW5kZjdbMF0gPSBhbmRmN1swXSA8PCAxOwotCWFuZGY3WzBdID0gYW5kZjdbMF0gJiAweGZlOwotCi0JeG9yXzMyKGFkZDFiLCBhbmRmNywgYWRkMWJmNyk7Ci0KLQl4b3JfMzIoaW4sIGFkZDFiZjcsIHJvdHIpOwotCi0JdGVtcFswXSA9IHJvdHJbMF07ICAgICAgICAgLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLwotCXJvdHJbMF0gPSByb3RyWzFdOwotCXJvdHJbMV0gPSByb3RyWzJdOwotCXJvdHJbMl0gPSByb3RyWzNdOwotCXJvdHJbM10gPSB0ZW1wWzBdOwotCi0JeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOwotCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLHRlbXBiKTsKLQl4b3JfMzIodGVtcCwgdGVtcGIsIG91dCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NvbW1vbi9zcGVjdHJ1bS5jCmluZGV4IGM2NThiZjMuLjUxZTM4ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29tbW9uL3NwZWN0cnVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb21tb24vc3BlY3RydW0uYwpAQCAtMjQsNyArMjQsNiBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLQogICAgIE1vZHVsZSBOYW1lOgogCWFjdGlvbi5jCiAKQEAgLTQwLDI0ICszOSwzODIgQEAKICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKICNpbmNsdWRlICJhY3Rpb24uaCIKIAotVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKKy8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIHRoZSBVU0EgKFVTKSAqLworc3RydWN0IHJ0X2RvdDExX3JlZ3VsYXRvcnlfaW5mb3JtYXRpb24gVVNBUmVndWxhdG9yeUluZm9bXSA9IHsKKy8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCisJezAsIHswLCAwLCB7MH0KKwkgICAgIH0KKwkgfQorCSwJCQkvKiBJbnZsaWQgZW50cnkgKi8KKwl7MSwgezQsIDE2LCB7MzYsIDQwLCA0NCwgNDh9CisJICAgICB9CisJIH0KKwksCisJezIsIHs0LCAyMywgezUyLCA1NiwgNjAsIDY0fQorCSAgICAgfQorCSB9CisJLAorCXszLCB7NCwgMjksIHsxNDksIDE1MywgMTU3LCAxNjF9CisJICAgICB9CisJIH0KKwksCisJezQsIHsxMSwgMjMsIHsxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0KKwkgICAgIH0KKwkgfQorCSwKKwl7NSwgezUsIDMwLCB7MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9CisJICAgICB9CisJIH0KKwksCisJezYsIHsxMCwgMTQsIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH0KKwkgICAgIH0KKwkgfQorCSwKKwl7NywgezEwLCAyNywgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfQorCSAgICAgfQorCSB9CisJLAorCXs4LCB7NSwgMTcsIHsxMSwgMTMsIDE1LCAxNywgMTl9CisJICAgICB9CisJIH0KKwksCisJezksIHs1LCAzMCwgezExLCAxMywgMTUsIDE3LCAxOX0KKwkgICAgIH0KKwkgfQorCSwKKwl7MTAsIHsyLCAyMCwgezIxLCAyNX0KKwkgICAgICB9CisJIH0KKwksCisJezExLCB7MiwgMzMsIHsyMSwgMjV9CisJICAgICAgfQorCSB9CisJLAorCXsxMiwgezExLCAzMCwgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0KKwkgICAgICB9CisJIH0KK307CisKKyNkZWZpbmUgVVNBX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoVVNBUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKHN0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uKSkKKworLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gRXVyb3BlICovCitzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbiBFdXJvcGVSZWd1bGF0b3J5SW5mb1tdID0geworLyogICJyZWd1bGF0b3J5IGNsYXNzIiAgIm51bWJlciBvZiBjaGFubmVscyIgICJNYXggVHggUHdyIiAgImNoYW5uZWwgbGlzdCIgKi8KKwl7MCwgezAsIDAsIHswfQorCSAgICAgfQorCSB9CisJLAkJCS8qIEludmFsaWQgZW50cnkgKi8KKwl7MSwgezQsIDIwLCB7MzYsIDQwLCA0NCwgNDh9CisJICAgICB9CisJIH0KKwksCisJezIsIHs0LCAyMCwgezUyLCA1NiwgNjAsIDY0fQorCSAgICAgfQorCSB9CisJLAorCXszLCB7MTEsIDMwLCB7MTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9CisJICAgICB9CisJIH0KKwksCisJezQsIHsxMywgMjAsIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxM30KKwkgICAgIH0KKwkgfQorfTsKKworI2RlZmluZSBFVV9SRUdVTEFUT1JZX0lORk9fU0laRSAoc2l6ZW9mKEV1cm9wZVJlZ3VsYXRvcnlJbmZvKSAvIHNpemVvZihzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbikpCisKKy8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIEphcGFuICovCitzdHJ1Y3QgcnRfZG90MTFfcmVndWxhdG9yeV9pbmZvcm1hdGlvbiBKYXBhblJlZ3VsYXRvcnlJbmZvW10gPSB7CisvKiAgInJlZ3VsYXRvcnkgY2xhc3MiICAibnVtYmVyIG9mIGNoYW5uZWxzIiAgIk1heCBUeCBQd3IiICAiY2hhbm5lbCBsaXN0IiAqLworCXswLCB7MCwgMCwgezB9CisJICAgICB9CisJIH0KKwksCQkJLyogSW52YWxpZCBlbnRyeSAqLworCXsxLCB7NCwgMjIsIHszNCwgMzgsIDQyLCA0Nn0KKwkgICAgIH0KKwkgfQorCSwKKwl7MiwgezMsIDI0LCB7OCwgMTIsIDE2fQorCSAgICAgfQorCSB9CisJLAorCXszLCB7MywgMjQsIHs4LCAxMiwgMTZ9CisJICAgICB9CisJIH0KKwksCisJezQsIHszLCAyNCwgezgsIDEyLCAxNn0KKwkgICAgIH0KKwkgfQorCSwKKwl7NSwgezMsIDI0LCB7OCwgMTIsIDE2fQorCSAgICAgfQorCSB9CisJLAorCXs2LCB7MywgMjIsIHs4LCAxMiwgMTZ9CisJICAgICB9CisJIH0KKwksCisJezcsIHs0LCAyNCwgezE4NCwgMTg4LCAxOTIsIDE5Nn0KKwkgICAgIH0KKwkgfQorCSwKKwl7OCwgezQsIDI0LCB7MTg0LCAxODgsIDE5MiwgMTk2fQorCSAgICAgfQorCSB9CisJLAorCXs5LCB7NCwgMjQsIHsxODQsIDE4OCwgMTkyLCAxOTZ9CisJICAgICB9CisJIH0KKwksCisJezEwLCB7NCwgMjQsIHsxODQsIDE4OCwgMTkyLCAxOTZ9CisJICAgICAgfQorCSB9CisJLAorCXsxMSwgezQsIDIyLCB7MTg0LCAxODgsIDE5MiwgMTk2fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTIsIHs0LCAyNCwgezcsIDgsIDksIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTMsIHs0LCAyNCwgezcsIDgsIDksIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTQsIHs0LCAyNCwgezcsIDgsIDksIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTUsIHs0LCAyNCwgezcsIDgsIDksIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTYsIHs2LCAyNCwgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsxNywgezYsIDI0LCB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezE4LCB7NiwgMjQsIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MTksIHs2LCAyNCwgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsyMCwgezYsIDE3LCB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX0KKwkgICAgICB9CisJIH0KKwksCisJezIxLCB7NiwgMjQsIHs2LCA3LCA4LCA5LCAxMCwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsyMiwgezYsIDI0LCB7NiwgNywgOCwgOSwgMTAsIDExfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MjMsIHs2LCAyNCwgezYsIDcsIDgsIDksIDEwLCAxMX0KKwkgICAgICB9CisJIH0KKwksCisJezI0LCB7NiwgMjQsIHs2LCA3LCA4LCA5LCAxMCwgMTF9CisJICAgICAgfQorCSB9CisJLAorCXsyNSwgezgsIDI0LCB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsyNiwgezgsIDI0LCB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsyNywgezgsIDI0LCB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsyOCwgezgsIDI0LCB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXsyOSwgezgsIDE3LCB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9CisJICAgICAgfQorCSB9CisJLAorCXszMCwgezEzLCAyMywgezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfQorCSAgICAgIH0KKwkgfQorCSwKKwl7MzEsIHsxLCAyMywgezE0fQorCSAgICAgIH0KKwkgfQorCSwKKwl7MzIsIHs0LCAyMiwgezUyLCA1NiwgNjAsIDY0fQorCSAgICAgIH0KKwkgfQorfTsKKworI2RlZmluZSBKUF9SRUdVTEFUT1JZX0lORk9fU0laRSAoc2l6ZW9mKEphcGFuUmVndWxhdG9yeUluZm8pIC8gc2l6ZW9mKHN0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uKSkKKworY2hhciBSVE1QX0dldFR4UHdyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gSFRUUkFOU01JVF9TRVRUSU5HIEhUVHhNb2RlKQoreworCXN0cnVjdCB0eF9wd3JfY2ZnIHsKKwkJdTggTW9kZTsKKwkJdTggTUNTOworCQl1MTYgcmVxOworCQl1OCBzaGlmdDsKKwkJdTMyIEJpdE1hc2s7CisJfTsKKworCXUzMiBWYWx1ZTsKKwlpbnQgSWR4OworCXU4IFBoeU1vZGU7CisJY2hhciBDdXJUeFB3cjsKKwl1OCBUeFB3clJlZiA9IDA7CisJY2hhciBEYWx0YVB3cjsKKwl1bnNpZ25lZCBsb25nIFR4UHdyWzVdOworCisJc3RydWN0IHR4X3B3cl9jZmcgVHhQd3JDZmdbXSA9IHsKKwkJe01PREVfQ0NLLCAwLCAwLCA0LCAweDAwMDAwMGYwfSwKKwkJe01PREVfQ0NLLCAxLCAwLCAwLCAweDAwMDAwMDBmfSwKKwkJe01PREVfQ0NLLCAyLCAwLCAxMiwgMHgwMDAwZjAwMH0sCisJCXtNT0RFX0NDSywgMywgMCwgOCwgMHgwMDAwMGYwMH0sCisKKwkJe01PREVfT0ZETSwgMCwgMCwgMjAsIDB4MDBmMDAwMDB9LAorCQl7TU9ERV9PRkRNLCAxLCAwLCAxNiwgMHgwMDBmMDAwMH0sCisJCXtNT0RFX09GRE0sIDIsIDAsIDI4LCAweGYwMDAwMDAwfSwKKwkJe01PREVfT0ZETSwgMywgMCwgMjQsIDB4MGYwMDAwMDB9LAorCQl7TU9ERV9PRkRNLCA0LCAxLCA0LCAweDAwMDAwMGYwfSwKKwkJe01PREVfT0ZETSwgNSwgMSwgMCwgMHgwMDAwMDAwZn0sCisJCXtNT0RFX09GRE0sIDYsIDEsIDEyLCAweDAwMDBmMDAwfSwKKwkJe01PREVfT0ZETSwgNywgMSwgOCwgMHgwMDAwMGYwMH0KKwkJLCB7TU9ERV9IVE1JWCwgMCwgMSwgMjAsIDB4MDBmMDAwMDB9LAorCQl7TU9ERV9IVE1JWCwgMSwgMSwgMTYsIDB4MDAwZjAwMDB9LAorCQl7TU9ERV9IVE1JWCwgMiwgMSwgMjgsIDB4ZjAwMDAwMDB9LAorCQl7TU9ERV9IVE1JWCwgMywgMSwgMjQsIDB4MGYwMDAwMDB9LAorCQl7TU9ERV9IVE1JWCwgNCwgMiwgNCwgMHgwMDAwMDBmMH0sCisJCXtNT0RFX0hUTUlYLCA1LCAyLCAwLCAweDAwMDAwMDBmfSwKKwkJe01PREVfSFRNSVgsIDYsIDIsIDEyLCAweDAwMDBmMDAwfSwKKwkJe01PREVfSFRNSVgsIDcsIDIsIDgsIDB4MDAwMDBmMDB9LAorCQl7TU9ERV9IVE1JWCwgOCwgMiwgMjAsIDB4MDBmMDAwMDB9LAorCQl7TU9ERV9IVE1JWCwgOSwgMiwgMTYsIDB4MDAwZjAwMDB9LAorCQl7TU9ERV9IVE1JWCwgMTAsIDIsIDI4LCAweGYwMDAwMDAwfSwKKwkJe01PREVfSFRNSVgsIDExLCAyLCAyNCwgMHgwZjAwMDAwMH0sCisJCXtNT0RFX0hUTUlYLCAxMiwgMywgNCwgMHgwMDAwMDBmMH0sCisJCXtNT0RFX0hUTUlYLCAxMywgMywgMCwgMHgwMDAwMDAwZn0sCisJCXtNT0RFX0hUTUlYLCAxNCwgMywgMTIsIDB4MDAwMGYwMDB9LAorCQl7TU9ERV9IVE1JWCwgMTUsIDMsIDgsIDB4MDAwMDBmMDB9CisJfTsKKyNkZWZpbmUgTUFYX1RYUFdSX1RBQl9TSVpFIChzaXplb2YoVHhQd3JDZmcpIC8gc2l6ZW9mKHN0cnVjdCB0eF9wd3JfY2ZnKSkKKworCUN1clR4UHdyID0gMTk7CisKKwkvKiBjaGVjayBUeCBQb3dlciBzZXR0aW5nIGZyb20gVUkuICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOTApIDsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDYwKQkvKiByZWR1Y2UgUHdyIGZvciAxIGRCLiAqLworCQlDdXJUeFB3ciAtPSAxOworCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApCS8qIHJlZHVjZSBQd3IgZm9yIDMgZEIuICovCisJCUN1clR4UHdyIC09IDM7CisJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkJLyogcmVkdWNlIFB3ciBmb3IgNiBkQi4gKi8KKwkJQ3VyVHhQd3IgLT0gNjsKKwllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkpCS8qIHJlZHVjZSBQd3IgZm9yIDkgZEIuICovCisJCUN1clR4UHdyIC09IDk7CisJZWxzZQkJCS8qIHJlZHVjZSBQd3IgZm9yIDEyIGRCLiAqLworCQlDdXJUeFB3ciAtPSAxMjsKKworCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gMTQpIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07CisJCX0gZWxzZSB7CisJCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKKwkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOworCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07CisJCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKKwkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgeworCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07CisJCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKKwkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOworCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107CisJCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKKwkJfSBlbHNlIHsKKwkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOworCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07CisJCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKKwkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOworCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07CisJCX0KKwl9CisKKwlzd2l0Y2ggKEhUVHhNb2RlLmZpZWxkLk1PREUpIHsKKwljYXNlIE1PREVfQ0NLOgorCWNhc2UgTU9ERV9PRkRNOgorCQlWYWx1ZSA9IFR4UHdyWzFdOworCQlUeFB3clJlZiA9IChWYWx1ZSAmIDB4MDAwMDBmMDApID4+IDg7CisKKwkJYnJlYWs7CisKKwljYXNlIE1PREVfSFRNSVg6CisJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpIHsKKwkJCVZhbHVlID0gVHhQd3JbMl07CisJCQlUeFB3clJlZiA9IChWYWx1ZSAmIDB4MDAwMDBmMDApID4+IDg7CisJCX0gZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikgeworCQkJVmFsdWUgPSBUeFB3clszXTsKKwkJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJfQorCQlicmVhazsKKwl9CisKKwlQaHlNb2RlID0gKEhUVHhNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpCisJICAgID8gTU9ERV9IVE1JWCA6IEhUVHhNb2RlLmZpZWxkLk1PREU7CisKKwlmb3IgKElkeCA9IDA7IElkeCA8IE1BWF9UWFBXUl9UQUJfU0laRTsgSWR4KyspIHsKKwkJaWYgKChUeFB3ckNmZ1tJZHhdLk1vZGUgPT0gUGh5TW9kZSkKKwkJICAgICYmIChUeFB3ckNmZ1tJZHhdLk1DUyA9PSBIVFR4TW9kZS5maWVsZC5NQ1MpKSB7CisJCQlWYWx1ZSA9IFR4UHdyW1R4UHdyQ2ZnW0lkeF0ucmVxXTsKKwkJCURhbHRhUHdyID0KKwkJCSAgICBUeFB3clJlZiAtIChjaGFyKSgoVmFsdWUgJiBUeFB3ckNmZ1tJZHhdLkJpdE1hc2spCisJCQkJCSAgICAgICA+PiBUeFB3ckNmZ1tJZHhdLnNoaWZ0KTsKKwkJCUN1clR4UHdyIC09IERhbHRhUHdyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gQ3VyVHhQd3I7Cit9CisKK3ZvaWQgTWVhc3VyZVJlcVRhYkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7CiAKLQlwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKE1FQVNVUkVfUkVRX1RBQiksIEdGUF9BVE9NSUMpOworCXBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiID0KKwkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiksIEdGUF9BVE9NSUMpOwogCWlmIChwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYikKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIsIHNpemVvZihNRUFTVVJFX1JFUV9UQUIpKTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIpKTsKIAllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYi5cbiIsIF9fZnVuY19fKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLlxuIiwKKwkJCSAgX19mdW5jX18pKTsKIAogCXJldHVybjsKIH0KIAotVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgTWVhc3VyZVJlcVRhYkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU5kaXNGcmVlU3BpbkxvY2socEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKIAogCWlmIChwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYikKIAkJa2ZyZWUocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpOwpAQCAtNjYsMTggKzQyMywxNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIFBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxTG9va1VwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCitzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKk1lYXN1cmVSZXFMb29rVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbikKIHsKLQlVSU5UIEhhc2hJZHg7Ci0JUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCXUzMiBIYXNoSWR4OworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIgKnBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpwUHJldkVudHJ5ID0gTlVMTDsKIAotCWlmIChwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC04NiwxMiArNDQxLDEwIEBACiAJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwogCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAKLQl3aGlsZSAocEVudHJ5KQotCXsKKwl3aGlsZSAocEVudHJ5KSB7CiAJCWlmIChwRW50cnktPkRpYWxvZ1Rva2VuID09IERpYWxvZ1Rva2VuKQogCQkJYnJlYWs7Ci0JCWVsc2UKLQkJeworCQllbHNlIHsKIAkJCXBQcmV2RW50cnkgPSBwRW50cnk7CiAJCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OwogCQl9CkBAIC0xMDIsNTAgKzQ1NSw0OSBAQAogCXJldHVybiBwRW50cnk7CiB9CiAKLXN0YXRpYyBQTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUluc2VydCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQorc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpNZWFzdXJlUmVxSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JSU5UIGk7Ci0JVUxPTkcgSGFzaElkeDsKLQlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTCwgcEN1cnJFbnRyeTsKLQlVTE9ORyBOb3c7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBIYXNoSWR4OworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIgKnBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCXVuc2lnbmVkIGxvbmcgTm93OwogCi0JaWYocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCWlmIChwVGFiID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKKwlpZiAocEVudHJ5ID09IE5VTEwpIHsKIAkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFOyBpKyspCi0JCXsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRTsgaSsrKSB7CiAJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwogCQkJcEVudHJ5ID0gJnBUYWItPkNvbnRlbnRbaV07CiAKIAkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKQotCQkJCSYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csICh1bnNpZ25lZCBsb25nKShwRW50cnktPmxhc3RUaW1lICsgTVFfUkVRX0FHRV9PVVQpKSkKKwkJCSAgICAmJiBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93LAorCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKHBFbnRyeS0+CisJCQkJCQkJICAgICAgIGxhc3RUaW1lICsKKwkJCQkJCQkgICAgICAgTVFfUkVRX0FHRV9PVVQpKSkKIAkJCXsKLQkJCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCQkJVUxPTkcgSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7Ci0JCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOworCQkJCXVuc2lnbmVkIGxvbmcgSGFzaElkeCA9CisJCQkJICAgIE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT4KKwkJCQkJCQkgICAgICBEaWFsb2dUb2tlbik7CisJCQkJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpwUHJvYmVFbnRyeSA9CisJCQkJICAgIHBUYWItPkhhc2hbSGFzaElkeF07CiAKLQkJCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCQkJZG8KLQkJCQl7Ci0JCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQkJCXsKLQkJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCQl7Ci0JCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OworCQkJCS8qIHVwZGF0ZSBIYXNoIGxpc3QgKi8KKwkJCQlkbyB7CisJCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpIHsKKwkJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpIHsKKwkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0KKwkJCQkJCQkgICAgcEVudHJ5LT5wTmV4dDsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPQorCQkJCQkJCSAgICBwRW50cnktPnBOZXh0OwogCQkJCQkJfQogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTE1NCw3ICs1MDYsOCBAQAogCQkJCQlwUHJvYmVFbnRyeSA9IHBQcm9iZUVudHJ5LT5wTmV4dDsKIAkJCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7CiAKLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkpKTsKIAkJCQlwVGFiLT5TaXplLS07CiAKIAkJCQlicmVhazsKQEAgLTE2NCwzMCArNTE3LDI0IEBACiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKLQkJeworCQlpZiAoaSA8IE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkgewogCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKIAkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CiAJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKIAkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKIAkJCXBUYWItPlNpemUrKzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBFbnRyeSA9IE5VTEw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgdGFiIGZ1bGwuXG4iLCBfX2Z1bmNfXykpOworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXM6IHBNZWFzdXJlUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19mdW5jX18pKTsKIAkJfQogCi0JCS8vIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCQlpZiAocEVudHJ5KQotCQl7CisJCS8qIGFkZCB0aGlzIE5laWdoYm9yIGVudHJ5IGludG8gSEFTSCB0YWJsZSAqLworCQlpZiAocEVudHJ5KSB7CiAJCQlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7Ci0JCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQkJeworCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkgewogCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwogCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQogCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7CkBAIC0yMDEsNDUgKzU0OCwzNSBAQAogCXJldHVybiBwRW50cnk7CiB9CiAKLXN0YXRpYyBWT0lEIE1lYXN1cmVSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3ZvaWQgTWVhc3VyZVJlcURlbGV0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKQogewotCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIgKnBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CiAKLQlpZihwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KLQotCS8vIGlmIGVtcHR5LCByZXR1cm4KLQlpZiAocFRhYi0+U2l6ZSA9PSAwKQotCXsKKwkvKiBpZiBlbXB0eSwgcmV0dXJuICovCisJaWYgKHBUYWItPlNpemUgPT0gMCkgewogCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwTWVhc3VyZVJlcVRhYiBlbXB0eS5cbiIpKTsKIAkJcmV0dXJuOwogCX0KIAogCXBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSAhPSBOVUxMKQotCXsKLQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQlVTE9ORyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcm9iZUVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKKwlpZiAocEVudHJ5ICE9IE5VTEwpIHsKKwkJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpwUHJldkVudHJ5ID0gTlVMTDsKKwkJdW5zaWduZWQgbG9uZyBIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKKwkJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAKIAkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCWRvCi0JCXsKLQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQl7Ci0JCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQl7CisJCS8qIHVwZGF0ZSBIYXNoIGxpc3QgKi8KKwkJZG8geworCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkgeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpIHsKIAkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTI0OSw3ICs1ODYsNyBAQAogCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CiAJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOworCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkpKTsKIAkJcFRhYi0+U2l6ZS0tOwogCiAJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwpAQCAtMjU4LDI0ICs1OTUsMjQgQEAKIAlyZXR1cm47CiB9CiAKLVZPSUQgVHBjUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgVHBjUmVxVGFiSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7CiAJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwogCi0JcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7CisJcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVxX3RhYiksIEdGUF9BVE9NSUMpOwogCWlmIChwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiKQotCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLCBzaXplb2YoVFBDX1JFUV9UQUIpKTsKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiwgc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVxX3RhYikpOwogCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX2Z1bmNfXykpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIEZhaWwgdG8gYWxsb2MgbWVtb3J5IGZvciBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiLlxuIiwKKwkJCSAgX19mdW5jX18pKTsKIAogCXJldHVybjsKIH0KIAotVk9JRCBUcGNSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQordm9pZCBUcGNSZXFUYWJFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlOZGlzRnJlZVNwaW5Mb2NrKHBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOworCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwogCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCiAJCWtmcmVlKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpOwpAQCAtMjg0LDE4ICs2MjEsMTYgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFMb29rVXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKK3N0YXRpYyBzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqVHBjUmVxTG9va1VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pCiB7Ci0JVUlOVCBIYXNoSWR4OwotCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOworCXUzMiBIYXNoSWR4OworCXN0cnVjdCBydF90cGNfcmVxX3RhYiAqcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBFbnRyeSA9IE5VTEw7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBQcmV2RW50cnkgPSBOVUxMOwogCi0JaWYgKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCWlmIChwVGFiID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zMDQsMTIgKzYzOSwxMCBAQAogCUhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7CiAJcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAotCXdoaWxlIChwRW50cnkpCi0JeworCXdoaWxlIChwRW50cnkpIHsKIAkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCiAJCQlicmVhazsKLQkJZWxzZQotCQl7CisJCWVsc2UgewogCQkJcFByZXZFbnRyeSA9IHBFbnRyeTsKIAkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7CiAJCX0KQEAgLTMyMCw1MSArNjUzLDQ5IEBACiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotCi1zdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxSW5zZXJ0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCitzdGF0aWMgc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKlRwY1JlcUluc2VydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKQogewotCUlOVCBpOwotCVVMT05HIEhhc2hJZHg7Ci0JUFRQQ19SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7Ci0JVUxPTkcgTm93OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgSGFzaElkeDsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV90YWIgKnBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeTsKKwl1bnNpZ25lZCBsb25nIE5vdzsKIAotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOworCWlmIChwVGFiID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlczogcFRwY1JlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOwotCWlmIChwRW50cnkgPT0gTlVMTCkKLQl7CisJaWYgKHBFbnRyeSA9PSBOVUxMKSB7CiAJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkU7IGkrKykKLQkJeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkU7IGkrKykgewogCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKIAkJCXBFbnRyeSA9ICZwVGFiLT5Db250ZW50W2ldOwogCiAJCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKLQkJCQkmJiBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93LCAodW5zaWduZWQgbG9uZykocEVudHJ5LT5sYXN0VGltZSArIFRQQ19SRVFfQUdFX09VVCkpKQorCQkJICAgICYmIFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3csCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZykocEVudHJ5LT4KKwkJCQkJCQkgICAgICAgbGFzdFRpbWUgKworCQkJCQkJCSAgICAgICBUUENfUkVRX0FHRV9PVVQpKSkKIAkJCXsKLQkJCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJCQlVTE9ORyBIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgocEVudHJ5LT5EaWFsb2dUb2tlbik7Ci0JCQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCQkJCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwUHJldkVudHJ5ID0gTlVMTDsKKwkJCQl1bnNpZ25lZCBsb25nIEhhc2hJZHggPQorCQkJCSAgICBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPgorCQkJCQkJCSAgICAgICBEaWFsb2dUb2tlbik7CisJCQkJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKnBQcm9iZUVudHJ5ID0KKwkJCQkgICAgcFRhYi0+SGFzaFtIYXNoSWR4XTsKIAotCQkJCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJCQlkbwotCQkJCXsKLQkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCQkJewotCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQkJCXsKLQkJCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7CisJCQkJLyogdXBkYXRlIEhhc2ggbGlzdCAqLworCQkJCWRvIHsKKwkJCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkgeworCQkJCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkgeworCQkJCQkJCXBUYWItPkhhc2hbSGFzaElkeF0gPQorCQkJCQkJCSAgICBwRW50cnktPnBOZXh0OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9CisJCQkJCQkJICAgIHBFbnRyeS0+cE5leHQ7CiAJCQkJCQl9CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtMzczLDcgKzcwNCw3IEBACiAJCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwogCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKKwkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSkpOwogCQkJCXBUYWItPlNpemUtLTsKIAogCQkJCWJyZWFrOwpAQCAtMzgzLDMwICs3MTQsMjQgQEAKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkUpCi0JCXsKKwkJaWYgKGkgPCBNQVhfVFBDX1JFUV9UQUJfU0laRSkgewogCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKIAkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7CiAJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKIAkJCXBFbnRyeS0+RGlhbG9nVG9rZW4gPSBEaWFsb2dUb2tlbjsKIAkJCXBUYWItPlNpemUrKzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBFbnRyeSA9IE5VTEw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcFRwY1JlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlczogcFRwY1JlcVRhYiB0YWIgZnVsbC5cbiIsIF9fZnVuY19fKSk7CiAJCX0KIAotCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKLQkJaWYgKHBFbnRyeSkKLQkJeworCQkvKiBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUgKi8KKwkJaWYgKHBFbnRyeSkgewogCQkJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7CisJCQlpZiAocFRhYi0+SGFzaFtIYXNoSWR4XSA9PSBOVUxMKSB7CiAJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJcEN1cnJFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07CiAJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCiAJCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKQEAgLTQyMCw0NSArNzQ1LDM1IEBACiAJcmV0dXJuIHBFbnRyeTsKIH0KIAotc3RhdGljIFZPSUQgVHBjUmVxRGVsZXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCitzdGF0aWMgdm9pZCBUcGNSZXFEZWxldGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbikKIHsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfdHBjX3JlcV90YWIgKnBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wVHBjUmVxVGFiOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCi0JaWYocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBUcGNSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fZnVuY19fKSk7CisJaWYgKHBUYWIgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm47CiAJfQotCi0JLy8gaWYgZW1wdHksIHJldHVybgotCWlmIChwVGFiLT5TaXplID09IDApCi0JeworCS8qIGlmIGVtcHR5LCByZXR1cm4gKi8KKwlpZiAocFRhYi0+U2l6ZSA9PSAwKSB7CiAJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBUcGNSZXFUYWIgZW1wdHkuXG4iKSk7CiAJCXJldHVybjsKIAl9CiAKIAlwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbik7Ci0JaWYgKHBFbnRyeSAhPSBOVUxMKQotCXsKLQkJUFRQQ19SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJUFRQQ19SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOworCWlmIChwRW50cnkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcFByZXZFbnRyeSA9IE5VTEw7CisJCXVuc2lnbmVkIGxvbmcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOworCQlzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeSAqcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwogCiAJCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCWRvCi0JCXsKLQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQl7Ci0JCQkJaWYgKHBQcmV2RW50cnkgPT0gTlVMTCkKLQkJCQl7CisJCS8qIHVwZGF0ZSBIYXNoIGxpc3QgKi8KKwkJZG8geworCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkgeworCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpIHsKIAkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CisJCQkJfSBlbHNlIHsKIAkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwogCQkJCX0KIAkJCQlicmVhazsKQEAgLTQ2OCw3ICs3ODMsNyBAQAogCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7CiAJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKIAotCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihUUENfUkVRX0VOVFJZKSk7CisJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVxX2VudHJ5KSk7CiAJCXBUYWItPlNpemUtLTsKIAogCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwpAQCAtNDg3LDEwICs4MDIsOSBAQAogCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVUlOVDY0IEdldEN1cnJlbnRUaW1lU3RhbXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCitzdGF0aWMgdTY0IEdldEN1cnJlbnRUaW1lU3RhbXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCS8vIGdldCBjdXJyZW50IHRpbWUgc3RhbXAuCisJLyogZ2V0IGN1cnJlbnQgdGltZSBzdGFtcC4gKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA0LDExICs4MTgsNzMgQEAKIAlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIFVJTlQ4IEdldEN1clR4UHdyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQ4IFdjaWQpCitzdGF0aWMgdTggR2V0Q3VyVHhQd3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBXY2lkKQogewotCXJldHVybiAxNjsgLyogMTYgZEJtICovCisJcmV0dXJuIDE2OwkJLyogMTYgZEJtICovCit9CisKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlEZXNjcmlwdGlvbjoKKwkJR2V0IEN1cnJlbnQgVHJhbnNtaXQgUG93ZXIuCisKKwlQYXJhbWV0cnM6CisKKwlSZXR1cm4JOiBDdXJyZW50IFRpbWUgU3RhbXAuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwordm9pZCBJbnNlcnRDaGFubmVsUmVwSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTggKnBGcmFtZUJ1ZiwKKwkJCXVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCWNoYXIgKnBDb3VudHJ5LCB1OCBSZWd1bGF0b3J5Q2xhc3MpCit7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXU4IExlbjsKKwl1OCBJRUlkID0gSUVfQVBfQ0hBTk5FTF9SRVBPUlQ7CisJdTggKnBDaExpc3RQdHIgPSBOVUxMOworCisJTGVuID0gMTsKKwlpZiAoc3RybmNtcChwQ291bnRyeSwgIlVTIiwgMikgPT0gMCkgeworCQlpZiAoUmVndWxhdG9yeUNsYXNzID49IFVTQV9SRUdVTEFUT1JZX0lORk9fU0laRSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXM6IFVTQSBVbmtub3cgUmVxdWxhdG9yeSBjbGFzcyAoJWQpXG4iLAorCQkJCSAgX19mdW5jX18sIFJlZ3VsYXRvcnlDbGFzcykpOworCQkJcmV0dXJuOworCQl9CisKKwkJTGVuICs9CisJCSAgICBVU0FSZWd1bGF0b3J5SW5mb1tSZWd1bGF0b3J5Q2xhc3NdLkNoYW5uZWxTZXQuCisJCSAgICBOdW1iZXJPZkNoYW5uZWxzOworCQlwQ2hMaXN0UHRyID0KKwkJICAgIFVTQVJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC5DaGFubmVsTGlzdDsKKwl9IGVsc2UgaWYgKHN0cm5jbXAocENvdW50cnksICJKUCIsIDIpID09IDApIHsKKwkJaWYgKFJlZ3VsYXRvcnlDbGFzcyA+PSBKUF9SRUdVTEFUT1JZX0lORk9fU0laRSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiJXM6IEpQIFVua25vdyBSZXF1bGF0b3J5IGNsYXNzICglZClcbiIsCisJCQkJICBfX2Z1bmNfXywgUmVndWxhdG9yeUNsYXNzKSk7CisJCQlyZXR1cm47CisJCX0KKworCQlMZW4gKz0KKwkJICAgIEphcGFuUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LgorCQkgICAgTnVtYmVyT2ZDaGFubmVsczsKKwkJcENoTGlzdFB0ciA9CisJCSAgICBKYXBhblJlZ3VsYXRvcnlJbmZvW1JlZ3VsYXRvcnlDbGFzc10uQ2hhbm5lbFNldC5DaGFubmVsTGlzdDsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogVW5rbm93IENvdW50cnkgKCVzKVxuIiwKKwkJCQkJICBfX2Z1bmNfXywgcENvdW50cnkpKTsKKwkJcmV0dXJuOworCX0KKworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZJRUlkLAorCQkJICAxLCAmTGVuLAorCQkJICAxLCAmUmVndWxhdG9yeUNsYXNzLAorCQkJICBMZW4gLSAxLCBwQ2hMaXN0UHRyLCBFTkRfT0ZfQVJHUyk7CisKKwkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CisKKwlyZXR1cm47CiB9CiAKIC8qCkBAIC01MjQsMTYgKzkwMCwxMiBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIFZPSUQgSW5zZXJ0RGlhbG9nVG9rZW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggRGlhbG9nVG9rZW4pCit2b2lkIEluc2VydERpYWxvZ1Rva2VuKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwRnJhbWVCdWYsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sIHU4IERpYWxvZ1Rva2VuKQogewotCVVMT05HIFRlbXBMZW47Ci0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKLQkJCQkJMSwJCQkJJkRpYWxvZ1Rva2VuLAotCQkJCQlFTkRfT0ZfQVJHUyk7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sIDEsICZEaWFsb2dUb2tlbiwgRU5EX09GX0FSR1MpOwogCiAJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCkBAIC01NTIsMTkgKzkyNCwxNSBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcUlFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuKQorc3RhdGljIHZvaWQgSW5zZXJ0VHBjUmVxSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBGcmFtZUJ1ZiwgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuKQogewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gMDsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVRVUVTVDsKKwl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJdW5zaWduZWQgbG9uZyBMZW4gPSAwOworCXU4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVFVRVNUOwogCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAotCQkJCQkJMSwJCQkJCQkJJkxlbiwKLQkJCQkJCUVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsICZUZW1wTGVuLAorCQkJICAxLCAmRWxlbWVudElELCAxLCAmTGVuLCBFTkRfT0ZfQVJHUyk7CiAKIAkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47CiAKQEAgLTU4NSwzMCArOTUzLDI1IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi0gc3RhdGljIFZPSUQgSW5zZXJ0VHBjUmVwb3J0SUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggVHhQd3IsCi0JSU4gVUlOVDggTGlua01hcmdpbikKK3ZvaWQgSW5zZXJ0VHBjUmVwb3J0SUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJICAgICAgIHU4IFR4UHdyLCB1OCBMaW5rTWFyZ2luKQogewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTyk7Ci0JVUlOVDggRWxlbWVudElEID0gSUVfVFBDX1JFUE9SVDsKLQlUUENfUkVQT1JUX0lORk8gVHBjUmVwb3J0SUU7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXVuc2lnbmVkIGxvbmcgTGVuID0gc2l6ZW9mKHN0cnVjdCBydF90cGNfcmVwb3J0X2luZm8pOworCXU4IEVsZW1lbnRJRCA9IElFX1RQQ19SRVBPUlQ7CisJc3RydWN0IHJ0X3RwY19yZXBvcnRfaW5mbyBUcGNSZXBvcnRJRTsKIAogCVRwY1JlcG9ydElFLlR4UHdyID0gVHhQd3I7CiAJVHBjUmVwb3J0SUUuTGlua01hcmdpbiA9IExpbmtNYXJnaW47CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJTGVuLAkJCQkJCSZUcGNSZXBvcnRJRSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKKwlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsICZUZW1wTGVuLAorCQkJICAxLCAmRWxlbWVudElELAorCQkJICAxLCAmTGVuLCBMZW4sICZUcGNSZXBvcnRJRSwgRU5EX09GX0FSR1MpOwogCiAJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCi0KIAlyZXR1cm47CiB9CiAKQEAgLTYyNywzMiArOTkwLDI2IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBJbnNlcnRDaFN3QW5uSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2hhbm5lbCwKLQlJTiBVSU5UOCBDaFN3Q250KQorc3RhdGljIHZvaWQgSW5zZXJ0Q2hTd0FubklFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCAqcEZyYW1lQnVmLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCSAgICB1OCBDaFN3TW9kZSwKKwkJCSAgICB1OCBOZXdDaGFubmVsLCB1OCBDaFN3Q250KQogewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gc2l6ZW9mKENIX1NXX0FOTl9JTkZPKTsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQ7Ci0JQ0hfU1dfQU5OX0lORk8gQ2hTd0FubklFOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwl1bnNpZ25lZCBsb25nIExlbiA9IHNpemVvZihzdHJ1Y3QgcnRfY2hfc3dfYW5uX2luZm8pOworCXU4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKKwlzdHJ1Y3QgcnRfY2hfc3dfYW5uX2luZm8gQ2hTd0FubklFOwogCiAJQ2hTd0FubklFLkNoU3dNb2RlID0gQ2hTd01vZGU7CiAJQ2hTd0FubklFLkNoYW5uZWwgPSBOZXdDaGFubmVsOwogCUNoU3dBbm5JRS5DaFN3Q250ID0gQ2hTd0NudDsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCSZMZW4sCi0JCQkJCQlMZW4sCQkJCQkmQ2hTd0FubklFLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZFbGVtZW50SUQsIDEsICZMZW4sIExlbiwgJkNoU3dBbm5JRSwgRU5EX09GX0FSR1MpOwogCiAJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCi0KIAlyZXR1cm47CiB9CiAKQEAgLTY3MSwyNSArMTAyOCwyMSBAQAogCQk3LiBNZWFzdXJlIFN0YXJ0IHRpbWUuCiAJCTguIE1lYXN1cmUgRHVyYXRpb24uCiAKLQogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcUlFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSUUpCitzdGF0aWMgdm9pZCBJbnNlcnRNZWFzdXJlUmVxSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4ICpwRnJhbWVCdWYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkJICAgICAgIHU4IExlbiwgc3RydWN0IHJ0X21lYXN1cmVfcmVxX2luZm8gKiBwTWVhc3VyZVJlcUlFKQogewotCVVMT05HIFRlbXBMZW47Ci0JVUlOVDggTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUVVFU1Q7CisJdW5zaWduZWQgbG9uZyBUZW1wTGVuOworCXU4IEVsZW1lbnRJRCA9IElFX01FQVNVUkVNRU5UX1JFUVVFU1Q7CiAKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJTGVuLAkJCQkJCXBNZWFzdXJlUmVxSUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7CisJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLCAmVGVtcExlbiwKKwkJCSAgMSwgJkVsZW1lbnRJRCwKKwkJCSAgMSwgJkxlbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcV9pbmZvKSwgcE1lYXN1cmVSZXFJRSwgRU5EX09GX0FSR1MpOwogCiAJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCkBAIC03MTMsMzMgKzEwNjYsMjcgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBWT0lEIEluc2VydE1lYXN1cmVSZXBvcnRJRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBQTUVBU1VSRV9SRVBPUlRfSU5GTyBwTWVhc3VyZVJlcG9ydElFLAotCUlOIFVJTlQ4IFJlcG9ydExuZm9MZW4sCi0JSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQorc3RhdGljIHZvaWQgSW5zZXJ0TWVhc3VyZVJlcG9ydElFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHU4ICpwRnJhbWVCdWYsCisJCQkJICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCQkJICBzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbyAqIHBNZWFzdXJlUmVwb3J0SUUsCisJCQkJICB1OCBSZXBvcnRMbmZvTGVuLCB1OCAqcFJlcG9ydEluZm8pCiB7Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW47Ci0JVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwl1bnNpZ25lZCBsb25nIExlbjsKKwl1OCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7CiAKLQlMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykgKyBSZXBvcnRMbmZvTGVuOworCUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbykgKyBSZXBvcnRMbmZvTGVuOwogCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAotCQkJCQkJMSwJCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcG9ydElFLAotCQkJCQkJRU5EX09GX0FSR1MpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwgJlRlbXBMZW4sCisJCQkgIDEsICZFbGVtZW50SUQsCisJCQkgIDEsICZMZW4sIExlbiwgcE1lYXN1cmVSZXBvcnRJRSwgRU5EX09GX0FSR1MpOwogCiAJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwogCi0JaWYgKChSZXBvcnRMbmZvTGVuID4gMCkgJiYgKHBSZXBvcnRJbmZvICE9IE5VTEwpKQotCXsKLQkJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmICsgKnBGcmFtZUxlbiwJCSZUZW1wTGVuLAotCQkJCQkJCVJlcG9ydExuZm9MZW4sCQkJCXBSZXBvcnRJbmZvLAotCQkJCQkJCUVORF9PRl9BUkdTKTsKKwlpZiAoKFJlcG9ydExuZm9MZW4gPiAwKSAmJiAocFJlcG9ydEluZm8gIT0gTlVMTCkpIHsKKwkJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmICsgKnBGcmFtZUxlbiwgJlRlbXBMZW4sCisJCQkJICBSZXBvcnRMbmZvTGVuLCBwUmVwb3J0SW5mbywgRU5EX09GX0FSR1MpOwogCiAJCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKIAl9CkBAIC03NTgsNTMgKzExMDUsNDAgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggTWVhc3VyZVRva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAotCUlOIFVJTlQ4IE1lYXN1cmVDaCwKLQlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKQordm9pZCBNYWtlTWVhc3VyZW1lbnRSZXFGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4ICpwT3V0QnVmZmVyLAorCQkJICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCQkgICAgIHU4IFRvdGFsTGVuLAorCQkJICAgICB1OCBDYXRlZ29yeSwKKwkJCSAgICAgdTggQWN0aW9uLAorCQkJICAgICB1OCBNZWFzdXJlVG9rZW4sCisJCQkgICAgIHU4IE1lYXN1cmVSZXFNb2RlLAorCQkJICAgICB1OCBNZWFzdXJlUmVxVHlwZSwgdTggTnVtT2ZSZXBldGl0aW9ucykKIHsKLQlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgTlN0YXR1czsKLQlVTE9ORyBGcmFtZUxlbjsKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQlNRUFTVVJFX1JFUV9JTkZPIE1lYXN1cmVSZXFJRTsKLQlVSU5UOCBSbVJlcURhaWxvZ1Rva2VuID0gUmFuZG9tQnl0ZShwQWQpOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lID0gR2V0Q3VycmVudFRpbWVTdGFtcChwQWQpOworCXVuc2lnbmVkIGxvbmcgVGVtcExlbjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyBNZWFzdXJlUmVxSUU7CiAKLQkvLyBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLgotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArICpwRnJhbWVMZW4pLCBwRnJhbWVMZW4sIENhdGVnb3J5LAorCQkgICAgICAgQWN0aW9uKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKKwkvKiBmaWxsIERpYWxvZyBUb2tlbiAqLworCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyAqcEZyYW1lTGVuKSwgcEZyYW1lTGVuLAorCQkJICBNZWFzdXJlVG9rZW4pOworCisJLyogZmlsbCBOdW1iZXIgb2YgcmVwZXRpdGlvbnMuICovCisJaWYgKENhdGVnb3J5ID09IENBVEVHT1JZX1JNKSB7CisJCU1ha2VPdXRnb2luZ0ZyYW1lKChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksICZUZW1wTGVuLAorCQkJCSAgMiwgJk51bU9mUmVwZXRpdGlvbnMsIEVORF9PRl9BUkdTKTsKKworCQkqcEZyYW1lTGVuICs9IFRlbXBMZW47CiAJfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19NUlEpOwotCi0JLy8gZmlsbCBEaWFsb2cgVG9rZW4KLQlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIE1lYXN1cmVUb2tlbik7Ci0KLQkvLyBwcmVwYXJlIE1lYXN1cmVtZW50IElFLgotCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVxSUUsIHNpemVvZihNRUFTVVJFX1JFUV9JTkZPKSk7Ci0JTWVhc3VyZVJlcUlFLlRva2VuID0gUm1SZXFEYWlsb2dUb2tlbjsKKwkvKiBwcmVwYXJlIE1lYXN1cmVtZW50IElFLiAqLworCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVxSUUsIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbykpOworCU1lYXN1cmVSZXFJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKIAlNZWFzdXJlUmVxSUUuUmVxTW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CiAJTWVhc3VyZVJlcUlFLlJlcVR5cGUgPSBNZWFzdXJlUmVxVHlwZTsKLQlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5DaE51bSA9IE1lYXN1cmVDaDsKLQlNZWFzdXJlUmVxSUUuTWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gY3B1MmxlNjQoTWVhc3VyZVN0YXJ0VGltZSk7Ci0JTWVhc3VyZVJlcUlFLk1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gY3B1MmxlMTYoTWVhc3VyZUR1cmF0aW9uKTsKLQlJbnNlcnRNZWFzdXJlUmVxSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCAmTWVhc3VyZVJlcUlFKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwlJbnNlcnRNZWFzdXJlUmVxSUUocEFkLCAocE91dEJ1ZmZlciArICpwRnJhbWVMZW4pLCBwRnJhbWVMZW4sCisJCQkgICBUb3RhbExlbiwgJk1lYXN1cmVSZXFJRSk7CiAKIAlyZXR1cm47CiB9CkBAIC04MjEsNDYgKzExNTUsNDYgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggRGlhbG9nVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVRva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAotCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCi0JSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQordm9pZCBFbnF1ZXVlTWVhc3VyZW1lbnRSZXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEQSwKKwkJCSAgIHU4IERpYWxvZ1Rva2VuLAorCQkJICAgdTggTWVhc3VyZVRva2VuLAorCQkJICAgdTggTWVhc3VyZVJlcU1vZGUsCisJCQkgICB1OCBNZWFzdXJlUmVxVHlwZSwKKwkJCSAgIHU4IFJlcG9ydEluZm9MZW4sIHU4ICpwUmVwb3J0SW5mbykKIHsKLQlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgTlN0YXR1czsKLQlVTE9ORyBGcmFtZUxlbjsKLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQlNRUFTVVJFX1JFUE9SVF9JTkZPIE1lYXN1cmVSZXBJRTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBY3RIZHI7CisJc3RydWN0IHJ0X21lYXN1cmVfcmVwb3J0X2luZm8gTWVhc3VyZVJlcElFOwogCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwkvKiBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLiAqLwogCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAodm9pZCAqKSYgcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoY2hhciAqKSYgQWN0SGRyLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7CisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLAorCQkgICAgICAgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfTVJQKTsKIAotCS8vIGZpbGwgRGlhbG9nIFRva2VuCisJLyogZmlsbCBEaWFsb2cgVG9rZW4gKi8KIAlJbnNlcnREaWFsb2dUb2tlbihwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIERpYWxvZ1Rva2VuKTsKIAotCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXBJRSwgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKKwkvKiBwcmVwYXJlIE1lYXN1cmVtZW50IElFLiAqLworCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwSUUsIHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXBvcnRfaW5mbykpOwogCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKLQlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZS53b3JkID0gTWVhc3VyZVJlcU1vZGU7CisJTWVhc3VyZVJlcElFLlJlcG9ydE1vZGUgPSBNZWFzdXJlUmVxTW9kZTsKIAlNZWFzdXJlUmVwSUUuUmVwb3J0VHlwZSA9IE1lYXN1cmVSZXFUeXBlOwotCUluc2VydE1lYXN1cmVSZXBvcnRJRShwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sICZNZWFzdXJlUmVwSUUsIFJlcG9ydEluZm9MZW4sIHBSZXBvcnRJbmZvKTsKKwlJbnNlcnRNZWFzdXJlUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLAorCQkJICAgICAgJk1lYXN1cmVSZXBJRSwgUmVwb3J0SW5mb0xlbiwgcFJlcG9ydEluZm8pOwogCiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwpAQCAtODgwLDM2ICsxMjE0LDM0IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVUUENSZXEoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVQ0hBUiBEaWFsb2dUb2tlbikKK3ZvaWQgRW5xdWV1ZVRQQ1JlcShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwREEsIHU4IERpYWxvZ1Rva2VuKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOwogCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQWN0SGRyOwogCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwkvKiBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLiAqLwogCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAodm9pZCAqKSYgcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoY2hhciAqKSYgQWN0SGRyLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JRKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCSAgICAgICBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUSk7CiAKLQkvLyBmaWxsIERpYWxvZyBUb2tlbgorCS8qIGZpbGwgRGlhbG9nIFRva2VuICovCiAJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CiAKLQkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCisJLyogSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLiAqLwogCUluc2VydFRwY1JlcUlFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbik7CiAKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwpAQCAtOTMwLDM5ICsxMjYyLDM4IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVUUENSZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBEaWFsb2dUb2tlbiwKLQlJTiBVSU5UOCBUeFB3ciwKLQlJTiBVSU5UOCBMaW5rTWFyZ2luKQordm9pZCBFbnF1ZXVlVFBDUmVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgdTggKnBEQSwKKwkJICAgdTggRGlhbG9nVG9rZW4sIHU4IFR4UHdyLCB1OCBMaW5rTWFyZ2luKQogewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOwogCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQWN0SGRyOwogCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KKwkvKiBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLiAqLwogCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwgcERBLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAodm9pZCAqKSYgcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoY2hhciAqKSYgQWN0SGRyLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX1RQQ1JQKTsKKwlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sCisJCSAgICAgICBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUCk7CiAKLQkvLyBmaWxsIERpYWxvZyBUb2tlbgorCS8qIGZpbGwgRGlhbG9nIFRva2VuICovCiAJSW5zZXJ0RGlhbG9nVG9rZW4ocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBEaWFsb2dUb2tlbik7CiAKLQkvLyBJbnNlcnQgVFBDIFJlcXVlc3QgSUUuCi0JSW5zZXJ0VHBjUmVwb3J0SUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBUeFB3ciwgTGlua01hcmdpbik7CisJLyogSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLiAqLworCUluc2VydFRwY1JlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgVHhQd3IsCisJCQkgIExpbmtNYXJnaW4pOwogCiAJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwpAQCAtOTg0LDM0ICsxMzE1LDMzIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVDaFN3QW5uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2gpCit2b2lkIEVucXVldWVDaFN3QW5uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIHU4ICpwREEsIHU4IENoU3dNb2RlLCB1OCBOZXdDaCkKIHsKLQlQVUNIQVIgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgTlN0YXR1czsKLQlVTE9ORyBGcmFtZUxlbjsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbjsKIAotCUhFQURFUl84MDJfMTEgQWN0SGRyOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEFjdEhkcjsKIAotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCisJLyogYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4gKi8KIAlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKLQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOworCQkJIHBBZC0+Q3VycmVudEFkZHJlc3MpOwogCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19mdW5jX18pKTsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKHZvaWQgKikmIHBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fZnVuY19fKSk7CiAJCXJldHVybjsKIAl9Ci0JTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKGNoYXIgKikmIEFjdEhkciwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJRnJhbWVMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19DSEFOTkVMX1NXSVRDSCk7CisJSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLAorCQkgICAgICAgQ0FURUdPUllfU1BFQ1RSVU0sIFNQRUNfQ0hBTk5FTF9TV0lUQ0gpOwogCi0JSW5zZXJ0Q2hTd0FubklFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgQ2hTd01vZGUsIE5ld0NoLCAwKTsKKwlJbnNlcnRDaFN3QW5uSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDaFN3TW9kZSwKKwkJCU5ld0NoLCAwKTsKIAogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKQEAgLTEwMTksNTUgKzEzNDksNDMgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggQ2hhbm5lbCkKK3N0YXRpYyBCT09MRUFOIERmc1JlcXVpcmVtZW50Q2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKQogewogCUJPT0xFQU4gUmVzdWx0ID0gRkFMU0U7Ci0JSU5UIGk7CisJaW50IGk7CiAKLQlkbwotCXsKLQkJLy8gY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLgotCQkvLyBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkKLQkJeworCWRvIHsKKwkJLyogY2hlY2sgREZTIHByb2NlZHVyZSBpcyBydW5uaW5nLiAqLworCQkvKiBtYWtlIHN1cmUgREZTIHByb2NlZHVyZSB3b24ndCBzdGFydCB0d2ljZS4gKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkgewogCQkJUmVzdWx0ID0gRkFMU0U7CiAJCQlicmVhazsKIAkJfQotCi0JCS8vIGNoZWNrIHRoZSBuZXcgY2hhbm5lbCBjYXJyaWVkIGZyb20gQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtbmV0IGlzIHZhbGlkLgotCQlmb3IgKGk9MDsgaTxwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspCi0JCXsKKwkJLyogY2hlY2sgdGhlIG5ldyBjaGFubmVsIGNhcnJpZWQgZnJvbSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1uZXQgaXMgdmFsaWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNoYW5uZWxMaXN0TnVtOyBpKyspIHsKIAkJCWlmICgoQ2hhbm5lbCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCQkJJiYocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID09IDApKQotCQkJewotCQkJCS8vIGZvdW5kIHJhZGFyIHNpZ25hbCBpbiB0aGUgY2hhbm5lbC4gdGhlIGNoYW5uZWwgY2FuJ3QgdXNlIGF0IGxlYXN0IGZvciAzMCBtaW51dGVzLgotCQkJCXBBZC0+Q2hhbm5lbExpc3RbaV0uUmVtYWluaW5nVGltZUZvclVzZSA9IDE4MDA7Ly8zMCBtaW4gPSAxODAwIHNlYworCQkJICAgICYmIChwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPT0gMCkpIHsKKwkJCQkvKiBmb3VuZCByYWRhciBzaWduYWwgaW4gdGhlIGNoYW5uZWwuIHRoZSBjaGFubmVsIGNhbid0IHVzZSBhdCBsZWFzdCBmb3IgMzAgbWludXRlcy4gKi8KKwkJCQlwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPSAxODAwOwkvKjMwIG1pbiA9IDE4MDAgc2VjICovCiAJCQkJUmVzdWx0ID0gVFJVRTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCX0gd2hpbGUoRkFMU0UpOworCX0gd2hpbGUgKEZBTFNFKTsKIAogCXJldHVybiBSZXN1bHQ7CiB9CiAKLVZPSUQgTm90aWZ5Q2hTd0FublRvUGVlckFQcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcFJBLAotCUlOIFBVQ0hBUiBwVEEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggQ2hhbm5lbCkKK3ZvaWQgTm90aWZ5Q2hTd0FublRvUGVlckFQcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBSQSwKKwkJCSAgICB1OCAqcFRBLCB1OCBDaFN3TW9kZSwgdTggQ2hhbm5lbCkKIHsKIH0KIAotc3RhdGljIFZPSUQgU3RhcnRERlNQcm9jZWR1cmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBVSU5UOCBDaFN3TW9kZSkKK3N0YXRpYyB2b2lkIFN0YXJ0REZTUHJvY2VkdXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IENoYW5uZWwsIHU4IENoU3dNb2RlKQogewotCS8vIHN0YXJ0IERGUyBwcm9jZWR1cmUKKwkvKiBzdGFydCBERlMgcHJvY2VkdXJlICovCiAJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IENoYW5uZWw7CiAKIAlOX0NoYW5uZWxDaGVjayhwQWQpOwpAQCAtMTA4Niw3ICsxNDA0LDYgQEAKIAkJMi4gbWVzc2FnZSBsZW5ndGguCiAJCTMuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBpbmZvbWF0aW9uIGJ1ZmZlci4KIAotCiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCkBAIC0xMDk4LDQ0ICsxNDE1LDQ1IEBACiAgICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKICAgICAxICAgIDEgICAgICAgIDEgICAgICAgICAgIDEgICAgICAgICAgICAxCiAqLwotc3RhdGljIEJPT0xFQU4gUGVlckNoU3dBbm5TYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBDSF9TV19BTk5fSU5GTyBwQ2hTd0FubkluZm8pCitzdGF0aWMgQk9PTEVBTiBQZWVyQ2hTd0FublNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHZvaWQgKiBwTXNnLAorCQkJCSB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCQkgc3RydWN0IHJ0X2NoX3N3X2Fubl9pbmZvICogcENoU3dBbm5JbmZvKQogewotCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgcE1zZzsKKwl1OCAqcEZyYW1lUHRyID0gRnItPk9jdGV0OwogCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKKwlzdHJ1Y3QgcnRfZWlkICogZWlkX3B0cjsKIAotCS8vIHNraXAgODAyLjExIGhlYWRlci4KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOworCS8qIHNraXAgODAyLjExIGhlYWRlci4gKi8KKwlNc2dMZW4gLT0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCU1zZ0xlbiAtPSAyOwogCiAJaWYgKHBDaFN3QW5uSW5mbyA9PSBOVUxMKQogCQlyZXR1cm4gcmVzdWx0OwogCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3TW9kZSwgZWlkX3B0ci0+T2N0ZXQsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoYW5uZWwsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd0NudCwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UOgorCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd01vZGUsIGVpZF9wdHItPk9jdGV0LAorCQkJCSAgICAgICAxKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoYW5uZWwsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3Q250LAorCQkJCSAgICAgICBlaWRfcHRyLT5PY3RldCArIDIsIDEpOwogCi0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTExNTQsMjUgKzE0NzIsMjUgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLXN0YXRpYyBCT09MRUFOIFBlZXJNZWFzdXJlUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAotCU9VVCBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUluZm8pCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIHZvaWQgKiBwTXNnLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCQkgICAgdTggKnBEaWFsb2dUb2tlbiwKKwkJCQkgICAgc3RydWN0IHJ0X21lYXN1cmVfcmVxX2luZm8gKiBwTWVhc3VyZVJlcUluZm8sCisJCQkJICAgIHN0cnVjdCBydF9tZWFzdXJlX3JlcSAqIHBNZWFzdXJlUmVxKQogewotCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgcE1zZzsKKwl1OCAqcEZyYW1lUHRyID0gRnItPk9jdGV0OwogCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQlQVUNIQVIgcHRyOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247CisJc3RydWN0IHJ0X2VpZCAqIGVpZF9wdHI7CisJdTggKnB0cjsKKwl1NjQgTWVhc3VyZVN0YXJ0VGltZTsKKwl1MTYgTWVhc3VyZUR1cmF0aW9uOwogCi0JLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJLyogc2tpcCA4MDIuMTEgaGVhZGVyLiAqLworCU1zZ0xlbiAtPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCisJLyogc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuICovCiAJcEZyYW1lUHRyICs9IDI7CiAJTXNnTGVuIC09IDI7CiAKQEAgLTExODMsMjkgKzE1MDEsMzIgQEAKIAlwRnJhbWVQdHIgKz0gMTsKIAlNc2dMZW4gLT0gMTsKIAotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxSW5mby0+UmVxTW9kZS53b3JkLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcVR5cGUsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7Ci0JCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPk1lYXN1cmVSZXEuQ2hOdW0sIHB0ciwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlU3RhcnRUaW1lID0gU1dBUDY0KE1lYXN1cmVTdGFydFRpbWUpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCXBNZWFzdXJlUmVxSW5mby0+TWVhc3VyZVJlcS5NZWFzdXJlRHVyYXRpb24gPSBTV0FQMTYoTWVhc3VyZUR1cmF0aW9uKTsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlRva2VuLCBlaWRfcHRyLT5PY3RldCwKKwkJCQkgICAgICAgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFNb2RlLndvcmQsCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLAorCQkJCSAgICAgICBlaWRfcHRyLT5PY3RldCArIDIsIDEpOworCQkJcHRyID0gKHU4ICopKGVpZF9wdHItPk9jdGV0ICsgMyk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXEtPkNoTnVtLCBwdHIsIDEpOworCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOworCQkJcE1lYXN1cmVSZXEtPk1lYXN1cmVTdGFydFRpbWUgPQorCQkJICAgIFNXQVA2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KCZNZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOworCQkJcE1lYXN1cmVSZXEtPk1lYXN1cmVEdXJhdGlvbiA9IFNXQVAxNihNZWFzdXJlRHVyYXRpb24pOwogCi0JCQkJcmVzdWx0ID0gVFJVRTsKLQkJCQlicmVhazsKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKIAotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOwogCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOworCQllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgKCh1OCAqKSBlaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTEyNDUsMjQgKzE1NjYsMjQgQEAKICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKICAgICAgMCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICAgNS03CiAqLwotc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBNRUFTVVJFX1JFUE9SVF9JTkZPIHBNZWFzdXJlUmVwb3J0SW5mbywKLQlPVVQgUFVJTlQ4IHBSZXBvcnRCdWYpCitzdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcG9ydFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgIHZvaWQgKiBwTXNnLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCQkgICAgICAgdTggKnBEaWFsb2dUb2tlbiwKKwkJCQkgICAgICAgc3RydWN0IHJ0X21lYXN1cmVfcmVwb3J0X2luZm8gKgorCQkJCSAgICAgICBwTWVhc3VyZVJlcG9ydEluZm8sCisJCQkJICAgICAgIHU4ICpwUmVwb3J0QnVmKQogewotCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIEZyID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgcE1zZzsKKwl1OCAqcEZyYW1lUHRyID0gRnItPk9jdGV0OwogCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQlQVUNIQVIgcHRyOworCXN0cnVjdCBydF9laWQgKiBlaWRfcHRyOworCXU4ICpwdHI7CiAKLQkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkvKiBza2lwIDgwMi4xMSBoZWFkZXIuICovCisJTXNnTGVuIC09IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwkvKiBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4gKi8KIAlwRnJhbWVQdHIgKz0gMjsKIAlNc2dMZW4gLT0gMjsKIApAQCAtMTI3Myw1MSArMTU5NCw2MCBAQAogCXBGcmFtZVB0ciArPSAxOwogCU1zZ0xlbiAtPSAxOwogCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydE1vZGUsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKLQkJCQlpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQotCQkJCXsKLQkJCQkJUE1FQVNVUkVfQkFTSUNfUkVQT1JUIHBSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBSZXBvcnRCdWY7Ci0JCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CisJZWlkX3B0ciA9IChzdHJ1Y3QgcnRfZWlkICopIHBGcmFtZVB0cjsKKwl3aGlsZSAoKCh1OCAqKSBlaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPAorCSAgICAgICAoKHU4ICopcEZyYW1lUHRyICsgTXNnTGVuKSkgeworCQlzd2l0Y2ggKGVpZF9wdHItPkVpZCkgeworCQljYXNlIElFX01FQVNVUkVNRU5UX1JFUE9SVDoKKwkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlRva2VuLAorCQkJCSAgICAgICBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRNb2RlLAorCQkJCSAgICAgICBlaWRfcHRyLT5PY3RldCArIDEsIDEpOworCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSwKKwkJCQkgICAgICAgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKKwkJCWlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQkFTSUMpIHsKKwkJCQlzdHJ1Y3QgcnRfbWVhc3VyZV9iYXNpY19yZXBvcnQgKiBwUmVwb3J0ID0KKwkJCQkgICAgKHN0cnVjdCBydF9tZWFzdXJlX2Jhc2ljX3JlcG9ydCAqKSBwUmVwb3J0QnVmOworCQkJCXB0ciA9ICh1OCAqKShlaWRfcHRyLT5PY3RldCArIDMpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwKKwkJCQkJICAgICAgIHB0ciArIDEsIDgpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sCisJCQkJCSAgICAgICBwdHIgKyA5LCAyKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWFwLCBwdHIgKyAxMSwgMSk7CiAKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkKLQkJCQl7Ci0JCQkJCVBNRUFTVVJFX0NDQV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9DQ0FfUkVQT1JUKXBSZXBvcnRCdWY7Ci0JCQkJCXB0ciA9IGVpZF9wdHItPk9jdGV0ICsgMzsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKKwkJCX0gZWxzZSBpZiAocE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRUeXBlID09IFJNX0NDQSkgeworCQkJCXN0cnVjdCBydF9tZWFzdXJlX2NjYV9yZXBvcnQgKiBwUmVwb3J0ID0KKwkJCQkgICAgKHN0cnVjdCBydF9tZWFzdXJlX2NjYV9yZXBvcnQgKikgcFJlcG9ydEJ1ZjsKKwkJCQlwdHIgPSAodTggKikoZWlkX3B0ci0+T2N0ZXQgKyAzKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVTdGFydFRpbWUsCisJCQkJCSAgICAgICBwdHIgKyAxLCA4KTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZUR1cmF0aW9uLAorCQkJCQkgICAgICAgcHRyICsgOSwgMik7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNDQV9CdXN5X0ZyYWN0aW9uLAorCQkJCQkgICAgICAgcHRyICsgMTEsIDEpOwogCi0JCQkJfQotCQkJCWVsc2UgaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9SUElfSElTVE9HUkFNKQotCQkJCXsKLQkJCQkJUE1FQVNVUkVfUlBJX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX1JQSV9SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gZWlkX3B0ci0+T2N0ZXQgKyAzOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5SUElfRGVuc2l0eSwgcHRyICsgMTEsIDgpOwotCQkJCX0KLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJfSBlbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0KKwkJCQkgICBSTV9SUElfSElTVE9HUkFNKSB7CisJCQkJc3RydWN0IHJ0X21lYXN1cmVfcnBpX3JlcG9ydCAqIHBSZXBvcnQgPQorCQkJCSAgICAoc3RydWN0IHJ0X21lYXN1cmVfcnBpX3JlcG9ydCAqKSBwUmVwb3J0QnVmOworCQkJCXB0ciA9ICh1OCAqKShlaWRfcHRyLT5PY3RldCArIDMpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwKKwkJCQkJICAgICAgIHB0ciArIDEsIDgpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sCisJCQkJCSAgICAgICBwdHIgKyA5LCAyKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+UlBJX0RlbnNpdHksIHB0ciArIDExLAorCQkJCQkgICAgICAgOCk7CisJCQl9CisJCQlyZXN1bHQgPSBUUlVFOworCQkJYnJlYWs7CiAKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwkJZWlkX3B0ciA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0xMzM2LDIwICsxNjY2LDE4IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuKQorc3RhdGljIEJPT0xFQU4gUGVlclRwY1JlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdm9pZCAqIHBNc2csCisJCQkJdW5zaWduZWQgbG9uZyBNc2dMZW4sIHU4ICpwRGlhbG9nVG9rZW4pCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOworCXN0cnVjdCBydF9laWQgKiBlaWRfcHRyOwogCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlNc2dMZW4gLT0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCU1zZ0xlbiAtPSAyOwogCkBAIC0xMzYwLDE5ICsxNjg4LDE4IEBACiAJcEZyYW1lUHRyICs9IDE7CiAJTXNnTGVuIC09IDE7CiAKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6Ci0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwllaWRfcHRyID0gKHN0cnVjdCBydF9laWQgKikgcEZyYW1lUHRyOworCXdoaWxlICgoKHU4ICopIGVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8CisJICAgICAgICgodTggKilwRnJhbWVQdHIgKyBNc2dMZW4pKSB7CisJCXN3aXRjaCAoZWlkX3B0ci0+RWlkKSB7CisJCWNhc2UgSUVfVFBDX1JFUVVFU1Q6CisJCQlyZXN1bHQgPSBUUlVFOworCQkJYnJlYWs7CiAKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwkJZWlkX3B0ciA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0xMzkyLDIxICsxNzE5LDIwIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgQk9PTEVBTiBQZWVyVHBjUmVwU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFZPSUQgKnBNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBQVUlOVDggcERpYWxvZ1Rva2VuLAotCU9VVCBQVFBDX1JFUE9SVF9JTkZPIHBUcGNSZXBJbmZvKQorc3RhdGljIEJPT0xFQU4gUGVlclRwY1JlcFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdm9pZCAqIHBNc2csCisJCQkJdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkJdTggKnBEaWFsb2dUb2tlbiwKKwkJCQlzdHJ1Y3QgcnRfdHBjX3JlcG9ydF9pbmZvICogcFRwY1JlcEluZm8pCiB7Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBwTXNnOworCXU4ICpwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7CiAJQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOworCXN0cnVjdCBydF9laWQgKiBlaWRfcHRyOwogCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlNc2dMZW4gLT0gc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKTsKIAotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgorCS8qIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLiAqLwogCXBGcmFtZVB0ciArPSAyOwogCU1zZ0xlbiAtPSAyOwogCkBAIC0xNDE3LDIxICsxNzQzLDIxIEBACiAJcEZyYW1lUHRyICs9IDE7CiAJTXNnTGVuIC09IDE7CiAKLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfVFBDX1JFUE9SVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBUcGNSZXBJbmZvLT5MaW5rTWFyZ2luLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJZWlkX3B0ciA9IChzdHJ1Y3QgcnRfZWlkICopIHBGcmFtZVB0cjsKKwl3aGlsZSAoKCh1OCAqKSBlaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPAorCSAgICAgICAoKHU4ICopcEZyYW1lUHRyICsgTXNnTGVuKSkgeworCQlzd2l0Y2ggKGVpZF9wdHItPkVpZCkgeworCQljYXNlIElFX1RQQ19SRVBPUlQ6CisJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPlR4UHdyLCBlaWRfcHRyLT5PY3RldCwgMSk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPkxpbmtNYXJnaW4sCisJCQkJICAgICAgIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7CisJCQlyZXN1bHQgPSBUUlVFOworCQkJYnJlYWs7CiAKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKKwkJZWlkX3B0ciA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0xNDQ4LDY0ICsxNzc0LDY5IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBQZWVyQ2hTd0FubkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCitzdGF0aWMgdm9pZCBQZWVyQ2hTd0FubkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JQ0hfU1dfQU5OX0lORk8gQ2hTd0FubkluZm87Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JVUNIQVIgaW5kZXggPSAwLCBDaGFubmVsID0gMCwgTmV3Q2hhbm5lbCA9IDA7Ci0JVUxPTkcgQnNzaWR4ID0gMDsKKwlzdHJ1Y3QgcnRfY2hfc3dfYW5uX2luZm8gQ2hTd0FubkluZm87CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwl1OCBpbmRleCA9IDAsIENoYW5uZWwgPSAwLCBOZXdDaGFubmVsID0gMDsKKwl1bnNpZ25lZCBsb25nIEJzc2lkeCA9IDA7CiAKLQlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihDSF9TV19BTk5fSU5GTykpOwotCWlmICghIFBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKKwlOZGlzWmVyb01lbW9yeSgmQ2hTd0FubkluZm8sIHNpemVvZihzdHJ1Y3QgcnRfY2hfc3dfYW5uX2luZm8pKTsKKwlpZiAoIVBlZXJDaFN3QW5uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZDaFN3QW5uSW5mbykpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJJbnZhbGlkIENoYW5uZWwgU3dpdGNoIEFjdGlvbiBGcmFtZS5cbiIpKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCXsKLQkJQnNzaWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEZyLT5IZHIuQWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQlpZiAoQnNzaWR4ID09IEJTU19OT1RfRk9VTkQpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJDaFN3QW5uQWN0aW9uIC0gQnNzaWR4IGlzIG5vdCBmb3VuZFxuIikpOworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCUJzc2lkeCA9CisJCSAgICBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwRnItPkhkci5BZGRyMywKKwkJCQkgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJQZWVyQ2hTd0FubkFjdGlvbiAtIEJzc2lkeCBpcyBub3QgZm91bmRcbiIpKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxuKioqKkJzc2lkeCBpcyAlZCwgQ2hhbm5lbCA9ICVkXG4iLCBpbmRleCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCkpOwotCQloZXhfZHVtcCgiU1NJRCIscEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQnNzaWQgLDYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlxuKioqKkJzc2lkeCBpcyAlZCwgQ2hhbm5lbCA9ICVkXG4iLCBpbmRleCwKKwkJCSAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCkpOworCQloZXhfZHVtcCgiU1NJRCIsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkLCA2KTsKIAogCQlDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKIAkJTmV3Q2hhbm5lbCA9IENoU3dBbm5JbmZvLkNoYW5uZWw7CiAKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKLQkJewotCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgotCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApCisJCSAgICAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkgeworCQkJLyogU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLiAqLworCQkJLyogSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLiAqLwogCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CiAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKLQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CiAJCQlNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOwogCQkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCQkgICAgUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJCS8vIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jCisJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkvKiB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYyAqLwogCi0JCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjawotCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKLQkJCQl7Ci0JCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJLyogY2hhbm5lbCBzYW5pdHkgY2hlY2sgKi8KKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspIHsKKwkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PQorCQkJCSAgICBOZXdDaGFubmVsKSB7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPQorCQkJCQkgICAgTmV3Q2hhbm5lbDsKIAkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7CisJCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwKKwkJCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgQ2hhbm5lbCwgRkFMU0UpOworCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLAorCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwKKwkJCQkJCSAgTmV3Q2hhbm5lbCkpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQkJeworCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pIHsKIAkJCQlEQkdQUklOVF9FUlIoKCImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJlBlZXJDaFN3QW5uQWN0aW9uKGNhbiBub3QgZmluZCBOZXcgQ2hhbm5lbD0lZCBpbiBDaGFubmVsTGlzdFslZF1cbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKIAkJCX0KIAkJfQpAQCAtMTUxNCw3ICsxODQ1LDYgQEAKIAlyZXR1cm47CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMTUyNiwyMCArMTg1NiwyMyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotc3RhdGljIFZPSUQgUGVlck1lYXN1cmVSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQorc3RhdGljIHZvaWQgUGVlck1lYXN1cmVSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCU1FQVNVUkVfUkVRX0lORk8gTWVhc3VyZVJlcUluZm87CisJc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqIHBGciA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwl1OCBEaWFsb2dUb2tlbjsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyBNZWFzdXJlUmVxSW5mbzsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXEgTWVhc3VyZVJlcTsKIAlNRUFTVVJFX1JFUE9SVF9NT0RFIFJlcG9ydE1vZGU7CiAKLQlpZihQZWVyTWVhc3VyZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZNZWFzdXJlUmVxSW5mbykpCi0JeworCWlmIChQZWVyTWVhc3VyZVJlcVNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcUluZm8sCisJICAgICAmTWVhc3VyZVJlcSkpIHsKIAkJUmVwb3J0TW9kZS53b3JkID0gMDsKIAkJUmVwb3J0TW9kZS5maWVsZC5JbmNhcGFibGUgPSAxOwotCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIE1lYXN1cmVSZXFJbmZvLlRva2VuLCBSZXBvcnRNb2RlLndvcmQsIE1lYXN1cmVSZXFJbmZvLlJlcVR5cGUsIDAsIE5VTEwpOworCQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sCisJCQkJICAgICAgTWVhc3VyZVJlcUluZm8uVG9rZW4sIFJlcG9ydE1vZGUud29yZCwKKwkJCQkgICAgICBNZWFzdXJlUmVxSW5mby5SZXFUeXBlLCAwLCBOVUxMKTsKIAl9CiAKIAlyZXR1cm47CkBAIC0xNTU2LDU0ICsxODg5LDY1IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCitzdGF0aWMgdm9pZCBQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JTUVBU1VSRV9SRVBPUlRfSU5GTyBNZWFzdXJlUmVwb3J0SW5mbzsKLQlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlQVUlOVDggcE1lYXN1cmVSZXBvcnRJbmZvOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvIE1lYXN1cmVSZXBvcnRJbmZvOworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJdTggRGlhbG9nVG9rZW47CisJdTggKnBNZWFzdXJlUmVwb3J0SW5mbzsKIAotLy8JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCi0vLwkJcmV0dXJuOworLyogICAgICBpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkgKi8KKy8qICAgICAgICAgICAgICByZXR1cm47ICovCiAKLQlpZiAoKHBNZWFzdXJlUmVwb3J0SW5mbyA9IGttYWxsb2Moc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgdW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgbWVhc3VyZSByZXBvcnQgYnVmZmVyIChzaXplPSV6dSkuXG4iLCBfX2Z1bmNfXywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpKTsKKwlpZiAoKHBNZWFzdXJlUmVwb3J0SW5mbyA9CisJICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9ycGlfcmVwb3J0KSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyB1bmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBtZWFzdXJlIHJlcG9ydCBidWZmZXIgKHNpemU9JXp1KS5cbiIsCisJCQkgIF9fZnVuY19fLCBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcnBpX3JlcG9ydCkpKTsKIAkJcmV0dXJuOwogCX0KIAotCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKLQlOZGlzWmVyb01lbW9yeShwTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKTsKLQlpZiAoUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcG9ydEluZm8sIHBNZWFzdXJlUmVwb3J0SW5mbykpCi0JeworCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKHN0cnVjdCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvKSk7CisJTmRpc1plcm9NZW1vcnkocE1lYXN1cmVSZXBvcnRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcnBpX3JlcG9ydCkpOworCWlmIChQZWVyTWVhc3VyZVJlcG9ydFNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcG9ydEluZm8sCisJICAgICBwTWVhc3VyZVJlcG9ydEluZm8pKSB7CiAJCWRvIHsKLQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOworCQkJc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCi0JCQkvLyBOb3QgYSBhdXRvbm9tb3VzIG1lYXN1cmUgcmVwb3J0LgotCQkJLy8gY2hlY2sgdGhlIGRpYWxvZyB0b2tlbiBmaWVsZC4gZHJvcCBpdCBpZiB0aGUgZGlhbG9nIHRva2VuIGRvZXNuJ3QgbWF0Y2guCisJCQkvKiBOb3QgYSBhdXRvbm9tb3VzIG1lYXN1cmUgcmVwb3J0LiAqLworCQkJLyogY2hlY2sgdGhlIGRpYWxvZyB0b2tlbiBmaWVsZC4gZHJvcCBpdCBpZiB0aGUgZGlhbG9nIHRva2VuIGRvZXNuJ3QgbWF0Y2guICovCiAJCQlpZiAoKERpYWxvZ1Rva2VuICE9IDApCi0JCQkJJiYgKChwRW50cnkgPSBNZWFzdXJlUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSA9PSBOVUxMKSkKKwkJCSAgICAmJiAoKHBFbnRyeSA9IE1lYXN1cmVSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpID09CisJCQkJTlVMTCkpCiAJCQkJYnJlYWs7CiAKIAkJCWlmIChwRW50cnkgIT0gTlVMTCkKIAkJCQlNZWFzdXJlUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7CiAKLQkJCWlmIChNZWFzdXJlUmVwb3J0SW5mby5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQotCQkJewotCQkJCVBNRUFTVVJFX0JBU0lDX1JFUE9SVCBwQmFzaWNSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBNZWFzdXJlUmVwb3J0SW5mbzsKKwkJCWlmIChNZWFzdXJlUmVwb3J0SW5mby5SZXBvcnRUeXBlID09IFJNX0JBU0lDKSB7CisJCQkJc3RydWN0IHJ0X21lYXN1cmVfYmFzaWNfcmVwb3J0ICogcEJhc2ljUmVwb3J0ID0KKwkJCQkgICAgKHN0cnVjdCBydF9tZWFzdXJlX2Jhc2ljX3JlcG9ydCAqKSBwTWVhc3VyZVJlcG9ydEluZm87CiAJCQkJaWYgKChwQmFzaWNSZXBvcnQtPk1hcC5maWVsZC5SYWRhcikKLQkJCQkJJiYgKERmc1JlcXVpcmVtZW50Q2hlY2socEFkLCBwQmFzaWNSZXBvcnQtPkNoTnVtKSA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCU5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMocEFkLCBwRnItPkhkci5BZGRyMSwgcEZyLT5IZHIuQWRkcjIsIDEsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pOwotCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0sIDEpOworCQkJCSAgICAmJgorCQkJCSAgICAoRGZzUmVxdWlyZW1lbnRDaGVjaworCQkJCSAgICAgKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSkgPT0gVFJVRSkpIHsKKwkJCQkJTm90aWZ5Q2hTd0FublRvUGVlckFQcyhwQWQsCisJCQkJCQkJICAgICAgIHBGci0+SGRyLkFkZHIxLAorCQkJCQkJCSAgICAgICBwRnItPkhkci5BZGRyMiwKKwkJCQkJCQkgICAgICAgMSwKKwkJCQkJCQkgICAgICAgcEJhc2ljUmVwb3J0LT4KKwkJCQkJCQkgICAgICAgQ2hOdW0pOworCQkJCQlTdGFydERGU1Byb2NlZHVyZShwQWQsCisJCQkJCQkJICBwQmFzaWNSZXBvcnQtPkNoTnVtLAorCQkJCQkJCSAgMSk7CiAJCQkJfQogCQkJfQogCQl9IHdoaWxlIChGQUxTRSk7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBNZWFzdXJlbWVudCBSZXBvcnQgRnJhbWUuXG4iKSk7CisJfSBlbHNlCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiSW52YWxpZCBNZWFzdXJlbWVudCBSZXBvcnQgRnJhbWUuXG4iKSk7CiAKIAlrZnJlZShwTWVhc3VyZVJlcG9ydEluZm8pOwogCkBAIC0xNjIxLDM0ICsxOTY1LDMzIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBQZWVyVHBjUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIFBlZXJUcGNSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBwRnItPk9jdGV0OwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVVJTlQ4IFR4UHdyID0gR2V0Q3VyVHhQd3IocEFkLCBFbGVtLT5XY2lkKTsKLQlVSU5UOCBMaW5rTWFyZ2luID0gMDsKLQlDSEFSIFJlYWxSc3NpOworCXN0cnVjdCBydF9mcmFtZV84MDJfMTEgKiBwRnIgPSAoc3RydWN0IHJ0X2ZyYW1lXzgwMl8xMSAqKSBFbGVtLT5Nc2c7CisJdTggKnBGcmFtZVB0ciA9IHBGci0+T2N0ZXQ7CisJdTggRGlhbG9nVG9rZW47CisJdTggVHhQd3IgPSBHZXRDdXJUeFB3cihwQWQsIEVsZW0tPldjaWQpOworCXU4IExpbmtNYXJnaW4gPSAwOworCWNoYXIgUmVhbFJzc2k7CiAKLQkvLyBsaW5rIG1hcmdpbjogUmF0aW8gb2YgdGhlIHJlY2VpdmVkIHNpZ25hbCBwb3dlciB0byB0aGUgbWluaW11bSBkZXNpcmVkIGJ5IHRoZSBzdGF0aW9uIChTVEEpLiBUaGUKLQkvLwkJCQlTVEEgbWF5IGluY29ycG9yYXRlIHJhdGUgaW5mb3JtYXRpb24gYW5kIGNoYW5uZWwgY29uZGl0aW9ucywgaW5jbHVkaW5nIGludGVyZmVyZW5jZSwgaW50byBpdHMgY29tcHV0YXRpb24KLQkvLwkJCQlvZiBsaW5rIG1hcmdpbi4KKwkvKiBsaW5rIG1hcmdpbjogUmF0aW8gb2YgdGhlIHJlY2VpdmVkIHNpZ25hbCBwb3dlciB0byB0aGUgbWluaW11bSBkZXNpcmVkIGJ5IHRoZSBzdGF0aW9uIChTVEEpLiBUaGUgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQSBtYXkgaW5jb3Jwb3JhdGUgcmF0ZSBpbmZvcm1hdGlvbiBhbmQgY2hhbm5lbCBjb25kaXRpb25zLCBpbmNsdWRpbmcgaW50ZXJmZXJlbmNlLCBpbnRvIGl0cyBjb21wdXRhdGlvbiAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbGluayBtYXJnaW4uICovCiAKIAlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLAotCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCi0JCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CisJCQkgICAgICAgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLAorCQkJICAgICAgIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7CiAKLQkvLyBza2lwIENhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KKwkvKiBza2lwIENhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4gKi8KIAlwRnJhbWVQdHIgKz0gMjsKIAotCS8vIERpYWxvZyB0b2tlbi4KKwkvKiBEaWFsb2cgdG9rZW4uICovCiAJTmRpc01vdmVNZW1vcnkoJkRpYWxvZ1Rva2VuLCBwRnJhbWVQdHIsIDEpOwogCiAJTGlua01hcmdpbiA9IChSZWFsUnNzaSAvIE1JTl9SQ1ZfUFdSKTsKIAlpZiAoUGVlclRwY1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4pKQotCQlFbnF1ZXVlVFBDUmVwKHBBZCwgcEZyLT5IZHIuQWRkcjIsIERpYWxvZ1Rva2VuLCBUeFB3ciwgTGlua01hcmdpbik7CisJCUVucXVldWVUUENSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIFR4UHdyLAorCQkJICAgICAgTGlua01hcmdpbik7CiAKIAlyZXR1cm47CiB9CkBAIC0xNjY0LDIyICsyMDA3LDIxIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1zdGF0aWMgVk9JRCBQZWVyVHBjUmVwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3N0YXRpYyB2b2lkIFBlZXJUcGNSZXBBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBJbmZvOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7CisJdTggRGlhbG9nVG9rZW47CisJc3RydWN0IHJ0X3RwY19yZXBvcnRfaW5mbyBUcGNSZXBJbmZvOworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwRW50cnkgPSBOVUxMOwogCi0JTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihUUENfUkVQT1JUX0lORk8pKTsKLQlpZiAoUGVlclRwY1JlcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmRGlhbG9nVG9rZW4sICZUcGNSZXBJbmZvKSkKLQl7Ci0JCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKQotCQl7CisJTmRpc1plcm9NZW1vcnkoJlRwY1JlcEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfdHBjX3JlcG9ydF9pbmZvKSk7CisJaWYgKFBlZXJUcGNSZXBTYW5pdHkKKwkgICAgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJlRwY1JlcEluZm8pKSB7CisJCWlmICgocEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pKSAhPSBOVUxMKSB7CiAJCQlUcGNSZXFEZWxldGUocEFkLCBwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCi0JCQkJX19mdW5jX18sIERpYWxvZ1Rva2VuLCBUcGNSZXBJbmZvLlR4UHdyLCBUcGNSZXBJbmZvLkxpbmtNYXJnaW4pKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzOiBEaWFsb2dUb2tlbj0leCwgVHhQd3I9JWQsIExpbmtNYXJnaW49JWRcbiIsCisJCQkJICBfX2Z1bmNfXywgRGlhbG9nVG9rZW4sIFRwY1JlcEluZm8uVHhQd3IsCisJCQkJICBUcGNSZXBJbmZvLkxpbmtNYXJnaW4pKTsKIAkJfQogCX0KIApAQCAtMTY5OCw0MSArMjA0MCwzNyBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyU3BlY3RydW1BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyU3BlY3RydW1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewogCi0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07CisJdTggQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyAxXTsKIAogCWlmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCAhPSBUUlVFKQogCQlyZXR1cm47CiAKLQlzd2l0Y2goQWN0aW9uKQotCXsKLQkJY2FzZSBTUEVDX01SUToKLQkJCS8vIGN1cnJlbnQgcnQyODYwIHVuYWJsZSBkbyBzdWNoIG1lYXN1cmUgc3BlY2lmaWVkIGluIE1lYXN1cmVtZW50IFJlcXVlc3QuCi0JCQkvLyByZWplY3QgYWxsIG1lYXN1cmVtZW50IHJlcXVlc3QuCi0JCQlQZWVyTWVhc3VyZVJlcUFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJc3dpdGNoIChBY3Rpb24pIHsKKwljYXNlIFNQRUNfTVJROgorCQkvKiBjdXJyZW50IHJ0Mjg2MCB1bmFibGUgZG8gc3VjaCBtZWFzdXJlIHNwZWNpZmllZCBpbiBNZWFzdXJlbWVudCBSZXF1ZXN0LiAqLworCQkvKiByZWplY3QgYWxsIG1lYXN1cmVtZW50IHJlcXVlc3QuICovCisJCVBlZXJNZWFzdXJlUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgU1BFQ19NUlA6Ci0JCQlQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBTUEVDX01SUDoKKwkJUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24ocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBTUEVDX1RQQ1JROgotCQkJUGVlclRwY1JlcUFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBTUEVDX1RQQ1JROgorCQlQZWVyVHBjUmVxQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0JCWNhc2UgU1BFQ19UUENSUDoKLQkJCVBlZXJUcGNSZXBBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWJyZWFrOworCWNhc2UgU1BFQ19UUENSUDoKKwkJUGVlclRwY1JlcEFjdGlvbihwQWQsIEVsZW0pOworCQlicmVhazsKIAotCQljYXNlIFNQRUNfQ0hBTk5FTF9TV0lUQ0g6Ci17Ci19Ci0JCQlQZWVyQ2hTd0FubkFjdGlvbihwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBTUEVDX0NIQU5ORUxfU1dJVENIOgorCisJCVBlZXJDaFN3QW5uQWN0aW9uKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCX0KIAogCXJldHVybjsKQEAgLTE3NDcsNDkgKzIwODUsNjMgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUlOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKK2ludCBTZXRfTWVhc3VyZVJlcV9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKQogewotCVVJTlQgQWlkID0gMTsKLQlVSU5UIEFyZ0lkeDsKLQlQVUNIQVIgdGhpc0NoYXI7CisJdTMyIEFpZCA9IDE7CisJdTMyIEFyZ0lkeDsKKwljaGFyICp0aGlzQ2hhcjsKIAogCU1FQVNVUkVfUkVRX01PREUgTWVhc3VyZVJlcU1vZGU7Ci0JVUlOVDggTWVhc3VyZVJlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOwotCVVJTlQ4IE1lYXN1cmVSZXFUeXBlID0gUk1fQkFTSUM7Ci0JVUlOVDggTWVhc3VyZUNoID0gMTsKKwl1OCBNZWFzdXJlUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7CisJdTggTWVhc3VyZVJlcVR5cGUgPSBSTV9CQVNJQzsKKwl1OCBNZWFzdXJlQ2ggPSAxOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lID0gR2V0Q3VycmVudFRpbWVTdGFtcChwQWQpOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcSBNZWFzdXJlUmVxOworCXU4IFRvdGFsTGVuOworCisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQWN0SGRyOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuOworCisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICh2b2lkICopJiBwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX2Z1bmNfXykpOworCQlnb3RvIEVORF9PRl9NRUFTVVJFX1JFUTsKKwl9CiAKIAlBcmdJZHggPSAxOwotCXdoaWxlICgodGhpc0NoYXIgPSBzdHJzZXAoKGNoYXIgKiopJmFyZywgIi0iKSkgIT0gTlVMTCkKLQl7Ci0JCXN3aXRjaChBcmdJZHgpCi0JCXsKLQkJCWNhc2UgMToJLy8gQWlkLgotCQkJCUFpZCA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKLQkJCQlicmVhazsKKwl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpIHsKKwkJc3dpdGNoIChBcmdJZHgpIHsKKwkJY2FzZSAxOgkvKiBBaWQuICovCisJCQlBaWQgPSAodTgpc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOworCQkJYnJlYWs7CiAKLQkJCWNhc2UgMjogLy8gTWVhc3VyZW1lbnQgUmVxdWVzdCBUeXBlLgotCQkJCU1lYXN1cmVSZXFUeXBlID0gc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IE1lYXN1cmVSZXFUeXBlKCVkKVxuIiwgX19mdW5jX18sIE1lYXN1cmVSZXFUeXBlKSk7Ci0JCQkJCXJldHVybiBUUlVFOwotCQkJCX0KLQkJCQlicmVhazsKKwkJY2FzZSAyOgkvKiBNZWFzdXJlbWVudCBSZXF1ZXN0IFR5cGUuICovCisJCQlNZWFzdXJlUmVxVHlwZSA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCWlmIChNZWFzdXJlUmVxVHlwZSA+IDMpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiJXM6IHVua25vdyBNZWFzdXJlUmVxVHlwZSglZClcbiIsCisJCQkJCSAgX19mdW5jX18sIE1lYXN1cmVSZXFUeXBlKSk7CisJCQkJZ290byBFTkRfT0ZfTUVBU1VSRV9SRVE7CisJCQl9CisJCQlicmVhazsKIAotCQkJY2FzZSAzOiAvLyBNZWFzdXJlbWVudCBjaGFubmVsLgotCQkJCU1lYXN1cmVDaCA9IHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKLQkJCQlicmVhazsKKwkJY2FzZSAzOgkvKiBNZWFzdXJlbWVudCBjaGFubmVsLiAqLworCQkJTWVhc3VyZUNoID0gKHU4KXNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKKwkJCWJyZWFrOwogCQl9CiAJCUFyZ0lkeCsrOwogCX0KIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZCwgTWVhc3VyZVJlcVR5cGU9JWQgTWVhc3VyZUNoPSVkXG4iLCBfX2Z1bmNfXywgQWlkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoKSk7Ci0JaWYgKCFWQUxJRF9XQ0lEKEFpZCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX2Z1bmNfXywgQWlkKSk7Ci0JCXJldHVybiBUUlVFOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIlczo6QWlkID0gJWQsIE1lYXN1cmVSZXFUeXBlPSVkIE1lYXN1cmVDaD0lZFxuIiwgX19mdW5jX18sCisJCSAgQWlkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoKSk7CisJaWYgKCFWQUxJRF9XQ0lEKEFpZCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlczogdW5rbm93IHN0YSBvZiBBaWQoJWQpXG4iLCBfX2Z1bmNfXywgQWlkKSk7CisJCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROwogCX0KIAogCU1lYXN1cmVSZXFNb2RlLndvcmQgPSAwOwpAQCAtMTc5NywyNiArMjE0OSw1MiBAQAogCiAJTWVhc3VyZVJlcUluc2VydChwQWQsIE1lYXN1cmVSZXFUb2tlbik7CiAKLQlFbnF1ZXVlTWVhc3VyZW1lbnRSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwKLQkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLCBNZWFzdXJlUmVxVHlwZSwgTWVhc3VyZUNoLCAyMDAwKTsKKwkvKiBidWlsZCBhY3Rpb24gZnJhbWUgaGVhZGVyLiAqLworCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQWN0SGRyLCBTVUJUWVBFX0FDVElPTiwgMCwKKwkJCSBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoY2hhciAqKSYgQWN0SGRyLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlGcmFtZUxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CisKKwlUb3RhbExlbiA9IHNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbykgKyBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxKTsKKworCU1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKHBBZCwgcE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCXNpemVvZihzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfaW5mbyksIENBVEVHT1JZX1JNLCBSTV9CQVNJQywKKwkJCQlNZWFzdXJlUmVxVG9rZW4sIE1lYXN1cmVSZXFNb2RlLndvcmQsCisJCQkJTWVhc3VyZVJlcVR5cGUsIDApOworCisJTWVhc3VyZVJlcS5DaE51bSA9IE1lYXN1cmVDaDsKKwlNZWFzdXJlUmVxLk1lYXN1cmVTdGFydFRpbWUgPSBjcHUybGU2NChNZWFzdXJlU3RhcnRUaW1lKTsKKwlNZWFzdXJlUmVxLk1lYXN1cmVEdXJhdGlvbiA9IGNwdTJsZTE2KDIwMDApOworCisJeworCQl1bnNpZ25lZCBsb25nIFRlbXBMZW47CisJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJlRlbXBMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X21lYXN1cmVfcmVxKSwgJk1lYXN1cmVSZXEsCisJCQkJICBFTkRfT0ZfQVJHUyk7CisJCUZyYW1lTGVuICs9IFRlbXBMZW47CisJfQorCisJTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsICh1MzIpRnJhbWVMZW4pOworCitFTkRfT0ZfTUVBU1VSRV9SRVE6CisJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAogCXJldHVybiBUUlVFOwogfQogCi1JTlQgU2V0X1RwY1JlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKK2ludCBTZXRfVHBjUmVxX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpCiB7Ci0JVUlOVCBBaWQ7CisJdTMyIEFpZDsKIAotCVVJTlQ4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOworCXU4IFRwY1JlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOwogCi0JQWlkID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKKwlBaWQgPSAodTMyKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6QWlkID0gJWRcbiIsIF9fZnVuY19fLCBBaWQpKTsKLQlpZiAoIVZBTElEX1dDSUQoQWlkKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKKwlpZiAoIVZBTElEX1dDSUQoQWlkKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fZnVuY19fLCBBaWQpKTsKIAkJcmV0dXJuIFRSVUU7CiAJfQogCkBAIC0xODI2LDQgKzIyMDQsMyBAQAogCiAJcmV0dXJuIFRSVUU7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY29uZmlnLm1rIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb25maWcubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YmQ1NWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jb25maWcubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotIyBTdXBwb3J0IEFURSBmdW5jdGlvbgotSEFTX0FURT1uCi0KLSMgU3VwcG9ydCAyOHh4IFFBIEFURSBmdW5jdGlvbgotSEFTXzI4eHhfUUE9bgotCi0jIFN1cHBvcnQgV3BhX1N1cHBsaWNhbnQKLUhBU19XUEFfU1VQUExJQ0FOVD1uCi0KLSMgU3VwcG9ydCBOYXRpdmUgV3BhU3VwcGxpY2FudCBmb3IgTmV0d29yayBNYWdhbmdlcgotSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgTmV0IGludGVyZmFjZSBibG9jayB3aGlsZSBUeC1TdyBxdWV1ZSBmdWxsCi1IQVNfQkxPQ0tfTkVUX0lGPW4KLQotI1N1cHBvcnQgREZTIGZ1bmN0aW9uCi1IQVNfREZTX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBDYXJyaWVyLVNlbnNlIGZ1bmN0aW9uCi1IQVNfQ1NfU1VQUE9SVD1uCi0KLSNpZmRlZiBNVUxUSV9DQVJECi0jIFN1cHBvcnQgZm9yIE11bHRpcGxlIENhcmRzCi1IQVNfTUNfU1VQUE9SVD1uCi0jZW5kaWYgLy8gTVVMVElfQ0FSRCAvLwotCi0jU3VwcG9ydCBmb3IgSUVFRTgwMi4xMWUgRExTCi1IQVNfUU9TX0RMU19TVVBQT1JUPW4KLQotI1N1cHBvcnQgZm9yIEVYVF9DSEFOTkVMCi1IQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVD1uCi0KLSNTdXBwb3J0IGZvciBOZXQtU05NUAotSEFTX1NOTVBfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IGZlYXR1cmVzIG9mIFNpbmdsZSBTS1UuCi1IQVNfU0lOR0xFX1NLVV9TVVBQT1JUPW4KLQotI1N1cHBvcnQgZmVhdHVyZXMgb2YgODAyLjExbgotSEFTX0RPVDExX05fU1VQUE9SVD15Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DQyA6PSAkKENST1NTX0NPTVBJTEUpZ2NjCi1MRCA6PSAkKENST1NTX0NPTVBJTEUpbGQKLQotV0ZMQUdTIDo9IC1EQUdHUkVHQVRJT05fU1VQUE9SVCAtRFBJR0dZQkFDS19TVVBQT1JUIC1EV01NX1NVUFBPUlQgIC1ETElOVVggLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotIyBjb25maWcgZm9yIFNUQSBtb2RlCi0KLWlmZXEgKCQoUlQyOHh4X01PREUpLFNUQSkKLVdGTEFHUyArPSAtRENPTkZJR19TVEFfU1VQUE9SVCAtRERCRwotCi1pZmVxICgkKEhBU19XUEFfU1VQUExJQ0FOVCkseSkKLVdGTEFHUyArPSAtRFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1ETkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0FURSkseSkKLVdGTEFHUyArPSAtRFJBTElOS19BVEUKLWlmZXEgKCQoSEFTXzI4eHhfUUEpLHkpCi1XRkxBR1MgKz0gLURSQUxJTktfMjh4eF9RQQotZW5kaWYKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX1NOTVBfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRFNOTVBfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfUU9TX0RMU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EUU9TX0RMU19TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19ET1QxMV9OX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURET1QxMV9OX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0NTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19TSU5HTEVfU0tVX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURTSU5HTEVfU0tVCi1lbmRpZgotCi1lbmRpZgotIyBlbmRpZiBvZiBpZmVxICgkKFJUMjh4eF9NT0RFKSxTVEEpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIENvbW1vbiBjb21waWxlciBmbGFnCi0jCi0KLQotaWZlcSAoJChIQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVCkseSkKLVdGTEFHUyArPSAtREVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLWVuZGlmCi0KLWlmZXEgKCQoQ0hJUFNFVCksMjg3MCkKLVdGTEFHUyArPS1EUlQyODcwCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSw1VlQpCi0jV0ZMQUdTICs9IC1EQ09ORklHXzVWVF9FTkhBTkNFCi1lbmRpZgotCi1pZmVxICgkKEhBU19CTE9DS19ORVRfSUYpLHkpCi1XRkxBR1MgKz0gLURCTE9DS19ORVRfSUYKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0RGU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EREZTX1NVUFBPUlQKLWVuZGlmCi0KLSNpZmRlZiBNVUxUSV9DQVJECi1pZmVxICgkKEhBU19NQ19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1ETVVMVElQTEVfQ0FSRF9TVVBQT1JUCi1lbmRpZgotI2VuZGlmIC8vIE1VTFRJX0NBUkQgLy8KLQotaWZlcSAoJChIQVNfTExURCkseSkKLVdGTEFHUyArPSAtRExMVERfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSVhQKQotV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTgotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxNjApCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESUtBTk9TX1ZYXzFYMAotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxODApCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESUtBTk9TX1ZYXzFYMAotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX1RXSU5QQVNTKQotV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9UV0lOUEFTUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX0RBTlVCRSkKLVdGTEFHUyArPSAtRElORl9EQU5VQkUgLURSVF9CSUdfRU5ESUFOCi1lbmRpZgotCi1pZmVxICgkKFBMQVRGT1JNKSxDQVZNX09DVEVPTikKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLEJSQ01fNjM1OCkKLVdGTEFHUyArPSAtRFJUX0JJR19FTkRJQU4KLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLElORl9BTUFaT05fU0UpCi0jV0ZMQUdTICs9IC1EUlRfQklHX0VORElBTiAtRElORl9BTUFaT05fU0UgLURCR19GVF9TVVBQT1JUCi1XRkxBR1MgKz0gLURSVF9CSUdfRU5ESUFOIC1ESU5GX0FNQVpPTl9TRQotZW5kaWYKLQotI2tlcm5lbCBidWlsZCBvcHRpb25zIGZvciAyLjQKLSMgbW92ZSB0byBNYWtlZmlsZSBvdXRzaWRlIExJTlVYX1NSQyA6PSAvb3B0L3N0YXIva2VybmVsL2xpbnV4LTIuNC4yNy1zdGFyCi0KLWlmZXEgKCQoUExBVEZPUk0pLFNUQVIpCi1DRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXRyaWdyYXBocyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLVVhcm0gLWZuby1jb21tb24gLXBpcGUgLW1hcGNzLTMyIC1EX19MSU5VWF9BUk1fQVJDSF9fPTQgLW1hcmNoPWFybXY0ICAtbXNob3J0LWxvYWQtYnl0ZXMgLW1zb2Z0LWZsb2F0IC1VYXJtIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgJChMSU5VWF9TUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCAkKFdGTEFHUykKLQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksU0lHTUEpCi1DRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtREVNODZYWF9DSElQPUVNODZYWF9DSElQSURfVEFOR08yIC1ERU04NlhYX1JFVklTSU9OPTYgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjg2MF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlICAtbWFiaT0zMiAtbWFyY2g9bWlwczMycjIgLVdhLC0zMiAtV2EsLW1hcmNoPW1pcHMzMnIyIC1XYSwtbWlwczMycjIgLVdhLC0tdHJhcCAtRE1PRFVMRSAkKFdGTEFHUykKLQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksU0lHTUFfODYyMikKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKENST1NTX0NPTVBJTEVfSU5DTFVERSkvaW5jbHVkZSAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLU8yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mbm8tY29tbW9uIC1waXBlIC1mbm8tYnVpbHRpbiAtRF9fbGludXhfXyAtRE5PX01NIC1tYXBjcy0zMiAtbWFyY2g9YXJtdjQgLW10dW5lPWFybTd0ZG1pIC1tc29mdC1mbG9hdCAtRE1PRFVMRSAtbXNob3J0LWxvYWQtYnl0ZXMgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCAtRE1PRFVMRSAkKFdGTEFHUykKLWV4cG9ydCBDRkxBR1MKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLDVWVCkKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbWxpdHRsZS1lbmRpYW4gLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1PMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLW1hcGNzIC1tbm8tc2NoZWQtcHJvbG9nIC1tYWJpPWFwY3MtZ251IC1tbm8tdGh1bWItaW50ZXJ3b3JrIC1EX19MSU5VWF9BUk1fQVJDSF9fPTUgLW1hcmNoPWFybXY1dGUgLW10dW5lPWFybTkyNmVqLXMgLS1wYXJhbSBtYXgtaW5saW5lLWluc25zLXNpbmdsZT00MDAwMCAgLVVhcm0gLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVduby1wb2ludGVyLXNpZ24gLURNT0RVTEUgJChXRkxBR1MpCi0KLWV4cG9ydCBDRkxBR1MKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLElLQU5PU19WMTYwKQotQ0ZMQUdTIDo9IC1EX19LRVJORUxfXyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtL2djYyAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtdGFuZ28yIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLVdhbGwgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1mZnJlZXN0YW5kaW5nIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLXBpcGUgLW1hcmNoPWx4NDE4OSAtV2EsIC1ETU9EVUxFICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSUtBTk9TX1YxODApCi1DRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20vZ2NjIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC10YW5nbzIgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLXRhbmdvMiAtSSQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZ2VuZXJpYyAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gLWZmcmVlc3RhbmRpbmcgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1HIDAgLW1uby1hYmljYWxscyAtZm5vLXBpYyAtcGlwZSAtbWlwczMycjIgLVdhLCAtRE1PRFVMRSAkKFdGTEFHUykKLWV4cG9ydCBDRkxBR1MKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLElORl9UV0lOUEFTUykKLUNGTEFHUyA6PSAtRF9fS0VSTkVMX18gLURNT0RVTEUgLUkkKExJTlVYX1NSQykvaW5jbHVkZSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtRyAwIC1tbm8tYWJpY2FsbHMgLWZuby1waWMgLW1hcmNoPTRrYyAtbWlwczMyIC1XYSwtLXRyYXAgLXBpcGUgLW1sb25nLWNhbGxzICQoV0ZMQUdTKQotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksSU5GX0RBTlVCRSkKLUNGTEFHUyA6PSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAkKFdGTEFHUykgLVd1bmRlZiAtZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAtZmZyZWVzdGFuZGluZyAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlIC1tc29mdC1mbG9hdCAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMyIC1XYSwtbWlwczMyIC1XYSwtLXRyYXAgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMKLWV4cG9ydCBDRkxBR1MKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLEJSQ01fNjM1OCkKLUNGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLW5vc3RkaW5jIC1pd2l0aHByZWZpeCBpbmNsdWRlIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1JICQoTElOVVhfU1JDKS9pbmNsdWRlL2FzbS9nY2MgLUcgMCAtbW5vLWFiaWNhbGxzIC1mbm8tcGljIC1waXBlICAtZmlubGluZS1saW1pdD0xMDAwMDAgLW1hYmk9MzIgLW1hcmNoPW1pcHMzMiAtV2EsLTMyIC1XYSwtbWFyY2g9bWlwczMyIC1XYSwtbWlwczMyIC1XYSwtLXRyYXAgLUkkKExJTlVYX1NSQykvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWJjbTk2M3h4IC1JJChMSU5VWF9TUkMpL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljICAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1ETU9EVUxFIC1tbG9uZy1jYWxscwotZXhwb3J0IENGTEFHUwotZW5kaWYKLQotaWZlcSAoJChQTEFURk9STSksUEMpCi0gICAgaWZuZXEgKCwkKGZpbmRzdHJpbmcgMi40LCQoTElOVVhfU1JDKSkpCi0JIyBMaW51eCAyLjQKLQlDRkxBR1MgOj0gLURfX0tFUk5FTF9fIC1JJChMSU5VWF9TUkMpL2luY2x1ZGUgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uIC1waXBlIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgLW1hcmNoPWk2ODYgLURNT0RVTEUgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAkKExJTlVYX1NSQykvaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICQoV0ZMQUdTKQotCWV4cG9ydCBDRkxBR1MKLSAgICBlbHNlCi0JIyBMaW51eCAyLjYKLQlFWFRSQV9DRkxBR1MgOj0gJChXRkxBR1MpIC1JJChSVDI4eHhfRElSKS9pbmNsdWRlCi0gICAgZW5kaWYKLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLElYUCkKLSAgICAgICAgRVhUUkFfQ0ZMQUdTIDo9IC12ICQoV0ZMQUdTKSAtSSQoUlQyOHh4X0RJUikvaW5jbHVkZSAtbWJpZy1lbmRpYW4KLWVuZGlmCi0KLWlmZXEgKCQoUExBVEZPUk0pLENBVk1fT0NURU9OKQotCUVYVFJBX0NGTEFHUyA6PSAkKFdGTEFHUykgLUkkKFJUMjh4eF9ESVIpL2luY2x1ZGUgXAotCQkJCSAgICAtbWFiaT02NCAkKFdGTEFHUykKLWV4cG9ydCBDRkxBR1MKLWVuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfaG1hYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jcnlwdF9obWFjLmgKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9obWFjLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfaG1hYy5oCmluZGV4IDU1N2NhNzMuLjdhNTY1MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfaG1hYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfaG1hYy5oCkBAIC0yMywxOSArMjMsMjAgQEAKICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIE1vZHVsZSBOYW1lOgotICAgIGNyeXB0X2htYWMuaAorICAgIEhNQUMKIAogICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQorICAgIEZJUFMgMTk4OiBUaGUgS2V5ZWQtSGFzaCBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGUgKEhNQUMpCiAKICAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgSE1BQy1TSEExLCBITUFDLVNIQTI1NgotKi8KLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX0NSWVBUX0hNQUNfSF9fCiAjZGVmaW5lIF9fQ1JZUFRfSE1BQ19IX18KIApAQCAtNDcsMzUgKzQ4LDE4IEBACiAKICNpZmRlZiBTSEExX1NVUFBPUlQKICNkZWZpbmUgSE1BQ19TSEExX1NVUFBPUlQKLVZPSUQgSE1BQ19TSEExICgKLSAgICBJTiAgY29uc3QgVUlOVDggS2V5W10sCi0gICAgSU4gIFVJTlQgS2V5TGVuLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggTUFDW10sCi0gICAgSU4gIFVJTlQgTUFDTGVuKTsKK3ZvaWQgSE1BQ19TSEExKElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgICB1MzIgS2V5TGVuLAorCSAgICAgICBJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbik7CiAjZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCiAKLSNpZmRlZiBTSEEyNTZfU1VQUE9SVAotI2RlZmluZSBITUFDX1NIQTI1Nl9TVVBQT1JUCi1WT0lEIEhNQUNfU0hBMjU2ICgKLSAgICBJTiAgY29uc3QgVUlOVDggS2V5W10sCi0gICAgSU4gIFVJTlQgS2V5TGVuLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggTUFDW10sCi0gICAgSU4gIFVJTlQgTUFDTGVuKTsKLSNlbmRpZiAvKiBTSEEyNTZfU1VQUE9SVCAqLwotCiAjaWZkZWYgTUQ1X1NVUFBPUlQKICNkZWZpbmUgSE1BQ19NRDVfU1VQUE9SVAotVk9JRCBITUFDX01ENSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbik7Cit2b2lkIEhNQUNfTUQ1KElOIGNvbnN0IHU4IEtleVtdLAorCSAgICAgIHUzMiBLZXlMZW4sCisJICAgICAgSU4gY29uc3QgdTggTWVzc2FnZVtdLAorCSAgICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBNQUNbXSwgdTMyIE1BQ0xlbik7CiAjZW5kaWYgLyogTUQ1X1NVUFBPUlQgKi8KIAogI2VuZGlmIC8qIF9fQ1JZUFRfSE1BQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfbWQ1LmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X21kNS5oCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY3J5cHRfbWQ1LmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfbWQ1LmgKaW5kZXggN2VlM2Y0Mi4uMjZmOTc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9tZDUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2NyeXB0X21kNS5oCkBAIC0yMywxOCArMjMsMjAgQEAKICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIE1vZHVsZSBOYW1lOgotICAgIGNyeXB0X21kNS5oCisgICAgTUQ1CiAKICAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKyAgICBSRkMxMzIxOiBUaGUgTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobQogCiAgICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBFZGR5ICAgICAgICAyMDA4LzExLzI0ICAgICAgQ3JlYXRlIG1kNQotKi8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBfX0NSWVBUX01ENV9IX18KICNkZWZpbmUgX19DUllQVF9NRDVfSF9fCkBAIC00OSwzMCArNTEsMjMgQEAKICNkZWZpbmUgTUQ1X1NVUFBPUlQKIAogI2lmZGVmIE1ENV9TVVBQT1JUCi0jZGVmaW5lIE1ENV9CTE9DS19TSVpFICAgIDY0IC8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KLSNkZWZpbmUgTUQ1X0RJR0VTVF9TSVpFICAgMTYgLyogMTI4IGJpdHMgPSAxNiBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQzMiBIYXNoVmFsdWVbNF07Ci0gICAgVUlOVDY0IE1lc3NhZ2VMZW47Ci0gICAgVUlOVDggIEJsb2NrW01ENV9CTE9DS19TSVpFXTsKLSAgICBVSU5UICAgQmxvY2tMZW47Ci19IE1ENV9DVFhfU1RSVUMsICpQTUQ1X0NUWF9TVFJVQzsKKyNkZWZpbmUgTUQ1X0JMT0NLX1NJWkUgICAgNjQJLyogNTEyIGJpdHMgPSA2NCBieXRlcyAqLworI2RlZmluZSBNRDVfRElHRVNUX1NJWkUgICAxNgkvKiAxMjggYml0cyA9IDE2IGJ5dGVzICovCiAKLVZPSUQgTUQ1X0luaXQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCk7Ci1WT0lEIE1ENV9IYXNoICgKLSAgICBJTiAgTUQ1X0NUWF9TVFJVQyAqcE1ENV9DVFgpOwotVk9JRCBNRDVfQXBwZW5kICgKLSAgICBJTiAgTUQ1X0NUWF9TVFJVQyAqcE1ENV9DVFgsCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuKTsKLVZPSUQgTUQ1X0VuZCAoCi0gICAgSU4gIE1ENV9DVFhfU1RSVUMgKnBNRDVfQ1RYLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotVk9JRCBSVF9NRDUgKAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKTsKK3N0cnVjdCBydF9tZDVfY3R4X3N0cnVjIHsKKwl1MzIgSGFzaFZhbHVlWzRdOworCXU2NCBNZXNzYWdlTGVuOworCXU4IEJsb2NrW01ENV9CTE9DS19TSVpFXTsKKwl1MzIgQmxvY2tMZW47Cit9OworCit2b2lkIE1ENV9Jbml0KHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCk7Cit2b2lkIE1ENV9IYXNoKHN0cnVjdCBydF9tZDVfY3R4X3N0cnVjICpwTUQ1X0NUWCk7Cit2b2lkIE1ENV9BcHBlbmQoc3RydWN0IHJ0X21kNV9jdHhfc3RydWMgKnBNRDVfQ1RYLAorCQlJTiBjb25zdCB1OCBNZXNzYWdlW10sIHUzMiBNZXNzYWdlTGVuKTsKK3ZvaWQgTUQ1X0VuZChzdHJ1Y3QgcnRfbWQ1X2N0eF9zdHJ1YyAqcE1ENV9DVFgsIHU4IERpZ2VzdE1lc3NhZ2VbXSk7Cit2b2lkIFJUX01ENShJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgIHUzMiBNZXNzYWdlTGVuLCB1OCBEaWdlc3RNZXNzYWdlW10pOwogI2VuZGlmIC8qIE1ENV9TVVBQT1JUICovCiAKICNlbmRpZiAvKiBfX0NSWVBUX01ENV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfc2hhMi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9jcnlwdF9zaGEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMTFhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvY3J5cHRfc2hhMi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTW9kdWxlIE5hbWU6CisgICAgU0hBMgorCisgICAgQWJzdHJhY3Q6CisgICAgRklQUyAxODAtMjogU2VjdXJlIEhhc2ggU3RhbmRhcmQgKFNIUykKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgRWRkeSAgICAgICAgMjAwOC8xMS8yNCAgICAgIENyZWF0ZSBTSEExCisgICAgRWRkeSAgICAgICAgMjAwOC8wNy8yMyAgICAgIENyZWF0ZSBTSEEyNTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0NSWVBUX1NIQTJfSF9fCisjZGVmaW5lIF9fQ1JZUFRfU0hBMl9IX18KKworI2lmZGVmIENSWVBUX1RFU1RQTEFOCisjaW5jbHVkZSAiY3J5cHRfdGVzdHBsYW4uaCIKKyNlbHNlCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisjZW5kaWYgLyogQ1JZUFRfVEVTVFBMQU4gKi8KKworLyogQWxnb3JpdGhtIG9wdGlvbnMgKi8KKyNkZWZpbmUgU0hBMV9TVVBQT1JUCisKKyNpZmRlZiBTSEExX1NVUFBPUlQKKyNkZWZpbmUgU0hBMV9CTE9DS19TSVpFICAgIDY0CS8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KKyNkZWZpbmUgU0hBMV9ESUdFU1RfU0laRSAgIDIwCS8qIDE2MCBiaXRzID0gMjAgYnl0ZXMgKi8KK3N0cnVjdCBydF9zaGExX2N0eCB7CisJdTMyIEhhc2hWYWx1ZVs1XTsJLyogNSA9IChTSEExX0RJR0VTVF9TSVpFIC8gMzIpICovCisJdTY0IE1lc3NhZ2VMZW47CS8qIHRvdGFsIHNpemUgKi8KKwl1OCBCbG9ja1tTSEExX0JMT0NLX1NJWkVdOworCXUzMiBCbG9ja0xlbjsKK307CisKK3ZvaWQgUlRfU0hBMV9Jbml0KHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgpOwordm9pZCBTSEExX0hhc2goc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCk7Cit2b2lkIFNIQTFfQXBwZW5kKHN0cnVjdCBydF9zaGExX2N0eCAqcFNIQV9DVFgsCisJCSBJTiBjb25zdCB1OCBNZXNzYWdlW10sIHUzMiBNZXNzYWdlTGVuKTsKK3ZvaWQgU0hBMV9FbmQoc3RydWN0IHJ0X3NoYTFfY3R4ICpwU0hBX0NUWCwgdTggRGlnZXN0TWVzc2FnZVtdKTsKK3ZvaWQgUlRfU0hBMShJTiBjb25zdCB1OCBNZXNzYWdlW10sCisJICAgICB1MzIgTWVzc2FnZUxlbiwgdTggRGlnZXN0TWVzc2FnZVtdKTsKKyNlbmRpZiAvKiBTSEExX1NVUFBPUlQgKi8KKworI2VuZGlmIC8qIF9fQ1JZUFRfU0hBMl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZGZzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2Rmcy5oCmluZGV4IGYzNGY2MTguLjVmYmFiMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZGZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9kZnMuaApAQCAtMzYsNTMgKzM2LDQgQEAKICAgICBGb25jaGkgICAgMDMtMTItMjAwNyAgICAgIGNyZWF0ZWQKICovCiAKLSNkZWZpbmUgUkFEQVJfUFVMU0UgMQotI2RlZmluZSBSQURBUl9XSURUSCAyCi0KLSNkZWZpbmUgV0lEVEhfUkRfSURMRSAwCi0jZGVmaW5lIFdJRFRIX1JEX0NIRUNLIDEKLQotCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIENUU19Qcm90ZWN0LAotCUlOIFVJTlQ4IENUU1BlcmlvZCk7Ci0KLVZPSUQgUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSYWRhckRldGVjdFBlcmlvZGljKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1CT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQ2gpOwotCi1VTE9ORyBKYXBSYWRhclR5cGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1VTE9ORyBSVE1QUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBDbGVhblJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1JTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBhcmcpOwotCi1JTlQgU2V0X0xvbmdQdWxzZVJhZGFyVGhfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgYXJnKTsKLQotCitCT09MRUFOIFJhZGFyQ2hhbm5lbENoZWNrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9lZXByb20uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZWVwcm9tLmgKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9lZXByb20uaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9lZXByb20uaAppbmRleCBlZTBlODA3Li4wMzk4MDFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2VlcHJvbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvZWVwcm9tLmgKQEAgLTI0LDU5ICsyNCw0NCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLSAgICBNb2R1bGUgTmFtZToKLSAgICBlZXByb20uaAorCU1vZHVsZSBOYW1lOgorCWVlcHJvbS5oCiAKLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKKwlBYnN0cmFjdDoKKwlNaW5pcG9ydCBoZWFkZXIgZmlsZSBmb3IgZWVwcm9tIHJlbGF0ZWQgaW5mb3JtYXRpb24KIAotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUmV2aXNpb24gSGlzdG9yeToKKwlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKKwktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAjaWZuZGVmIF9fRUVQUk9NX0hfXwogI2RlZmluZSBfX0VFUFJPTV9IX18KIAotCi0KICNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCVB1YmxpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHByb20tYmFzZWQgY2hpcHNldAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcnRtcF9lZV9wcm9tX3JlYWQxNigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVU0hPUlQJCQlPZmZzZXQsCi0JT1VUIFVTSE9SVAkJCSpwVmFsdWUpOwotCi1pbnQgcnRtcF9lZV9wcm9tX3dyaXRlMTYoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUCQkJT2Zmc2V0LAotCUlOIFVTSE9SVAkJCXZhbHVlKTsKLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0KLQotCi0KK2ludCBydG1wX2VlX3Byb21fcmVhZDE2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXUxNiBPZmZzZXQsIHUxNiAqIHBWYWx1ZSk7CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJUHVibGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgdXNiLWJhc2VkIHByb20gY2hpcHNldAorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUlRVU0JSZWFkRUVQUk9NMTYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTE2IG9mZnNldCwgdTE2ICpwRGF0YSk7CisjZW5kaWYgLyogUlRNUF9VU0JfU1VQUE9SVCAvLyAqLwogCiAjaWZkZWYgUlQzMHh4CiAjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi1pbnQgcnRtcF9lZV9lZnVzZV9yZWFkMTYoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVVNIT1JUIE9mZnNldCwKLQlPVVQgVVNIT1JUICpwVmFsdWUpOwotCi1pbnQgcnRtcF9lZV9lZnVzZV93cml0ZTE2KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVTSE9SVCBPZmZzZXQsCi0JSU4gVVNIT1JUIGRhdGEpOwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLworaW50IHJ0bXBfZWVfZWZ1c2VfcmVhZDE2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1MTYgT2Zmc2V0LCB1MTYgKiBwVmFsdWUpOworI2VuZGlmIC8qIFJUTVBfRUZVU0VfU1VQUE9SVCAvLyAqLworI2VuZGlmIC8qIFJUMzB4eCAvLyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCVB1YmxpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHByb20gb3BlcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9ucyBzZXR0aW5nCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUlOVCBSdG1wQ2hpcE9wc0VlcHJvbUhvb2soCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gSU5UCQkJaW5mVHlwZSk7CitpbnQgUnRtcENoaXBPcHNFZXByb21Ib29rKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IGluZlR5cGUpOwogCi0jZW5kaWYgLy8gX19FRVBST01fSF9fIC8vCisjZW5kaWYgLyogX19FRVBST01fSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfcGNpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfcGNpLmgKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3BjaS5oCnJlbmFtZSB0byBkcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfcGNpLmgKaW5kZXggYzJmZWQyOS4uNzc1OWQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvaWZhY2UvcnRtcF9wY2kuaApAQCAtMjUsMTMgKzI1LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KIAotCiAjaWZuZGVmIF9fUlRNUF9QQ0lfSF9fCiAjZGVmaW5lIF9fUlRNUF9QQ0lfSF9fCiAKICNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJCVwKLQkoKFBPU19DT09LSUUpaGFuZGxlKS0+cGNpX2RldiA9IGRldl9wOwotCisJKChzdHJ1Y3Qgb3NfY29va2llICopaGFuZGxlKS0+cGNpX2RldiA9IGRldl9wOwogCiAjaWZkZWYgTElOVVgKIC8vIHNldCBkcml2ZXIgZGF0YQpAQCAtMzksMjYgKzM3LDI1IEBACiAKICNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApCiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQogI2RlZmluZSBTQV9TSElSUSBJUlFGX1NIQVJFRAotI2VuZGlmCiAKICNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKICNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpIFwKLXsJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOyBcCi0JKF9wQWQpLT5IYXZlTXNpID0JcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IH0KKwl7ICAgICBzdHJ1Y3Qgb3NfY29va2llICpfcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopKF9wQWQtPk9TX0Nvb2tpZSk7IFwKKwkJKF9wQWQpLT5IYXZlTXNpID0gcGNpX2VuYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpID09IDAgPyBUUlVFIDogRkFMU0U7IFwKKwl9CiAKICNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKSBcCi17CVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCWlmIChfcEFkLT5IYXZlTXNpID09IFRSVUUpIFwKLQkJcGNpX2Rpc2FibGVfbXNpKF9wT2JqLT5wY2lfZGV2KTsgXAotCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsJfQorCXsgICAgIHN0cnVjdCBvc19jb29raWUgKl9wT2JqID0gKHN0cnVjdCBvc19jb29raWUgKikoX3BBZC0+T1NfQ29va2llKTsgXAorCQlpZiAoX3BBZC0+SGF2ZU1zaSA9PSBUUlVFKSBcCisJCQlwY2lfZGlzYWJsZV9tc2koX3BPYmotPnBjaV9kZXYpOyBcCisJCV9wQWQtPkhhdmVNc2kgPSBGQUxTRTsgIFwKKwl9CiAjZWxzZQotI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkKLSNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKQorI2RlZmluZSBSVE1QX01TSV9FTkFCTEUoX3BBZCkJCWRve313aGlsZSgwKQorI2RlZmluZSBSVE1QX01TSV9ESVNBQkxFKF9wQWQpCQlkb3t9d2hpbGUoMCkKICNlbmRpZiAvLyBQQ0lfTVNJX1NVUFBPUlQgLy8KIAotCiAjZGVmaW5lIFJUTVBfUENJX0RFVl9VTk1BUCgpCQkJCQkJCQkJCVwKIHsJaWYgKG5ldF9kZXYtPmJhc2VfYWRkcikJewkJCQkJCQkJXAogCQlpb3VubWFwKCh2b2lkICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOwkJCQlcCkBAIC02NiwzMiArNjMsNiBAQAogCQkJCQkJCXBjaV9yZXNvdXJjZV9sZW4oZGV2X3AsIDApKTsgfQlcCiAJaWYgKG5ldF9kZXYtPmlycSkgcGNpX3JlbGVhc2VfcmVnaW9ucyhkZXZfcCk7IH0KIAotCi0jZGVmaW5lIFJUTVBfSVJRX1JFUVVFU1QobmV0X2RldikJCQkJCQkJXAotewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2RldikpOwlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJXAotCVJUTVBfTVNJX0VOQUJMRShfcEFkKTsJCQkJCQkJCQlcCi0JaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLAkJXAotCQkJCQkJCXJ0Mjg2MF9pbnRlcnJ1cHQsIFNBX1NISVJRLAkJXAotCQkJCQkJCShuZXRfZGV2KS0+bmFtZSwgKG5ldF9kZXYpKSkpIHsJXAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJyZXF1ZXN0X2lycSAgZXJyb3IoJWQpXG4iLCByZXR2YWwpKTsJXAotCXJldHVybiByZXR2YWw7IH0gfQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2RlZmluZSBSVE1QX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKShSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KSk7CQlcCi0JUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShfcEFkLT5PU19Db29raWUpOwkJCVwKLQlzeW5jaHJvbml6ZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSk7CQkJCQkJXAotCWZyZWVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7CQkJCQlcCi0JUlRNUF9NU0lfRElTQUJMRShfcEFkKTsgfQotI2Vsc2UKLSNkZWZpbmUgUlRNUF9JUlFfUkVMRUFTRShuZXRfZGV2KQkJCQkJCQkJXAotewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2RldikpOwkJXAotCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCQlcCi0JZnJlZV9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsJCQkJCVwKLQlSVE1QX01TSV9ESVNBQkxFKF9wQWQpOyB9Ci0jZW5kaWYKLQogI2RlZmluZSBQQ0lfUkVHX1JFQURfV09SRChwY2lfZGV2LCBvZmZzZXQsIENvbmZpZ3VyYXRpb24pICAgXAogICAgIGlmIChwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsICZyZWcxNikgPT0gMCkgICAgIFwKICAgICAgICAgQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDAsMTEgKzcxLDggQEAKIAogI2RlZmluZSBQQ0lfUkVHX1dJUlRFX1dPUkQocGNpX2Rldiwgb2Zmc2V0LCBDb25maWd1cmF0aW9uKSAgXAogICAgIHJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsIHJlZzE2KTsgICAgICAgICAgXAorICAgIHBjaV93cml0ZV9jb25maWdfd29yZChwY2lfZGV2LCBvZmZzZXQsIHJlZzE2KTsKIAogI2VuZGlmIC8vIExJTlVYIC8vCiAKLQotCi0KICNlbmRpZiAvLyBfX1JUTVBfUENJX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9pZmFjZS9ydG1wX3VzYi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9pZmFjZS9ydG1wX3VzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjM4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL2lmYWNlL3J0bXBfdXNiLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfX1JUTVBfVVNCX0hfXworI2RlZmluZSBfX1JUTVBfVVNCX0hfXworCisjaW5jbHVkZSAiLi4vcnR1c2JfaW8uaCIKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjZW5kaWYgLy8gTElOVVggLy8KKworZXh0ZXJuIHU4IEVwVG9RdWV1ZVs2XTsKKworI2RlZmluZSBSWEJVTEtBR0dSRV9aSVNFCQkJMTIKKyNkZWZpbmUgTUFYX1RYQlVMS19MSU1JVAkJCShMT0NBTF9UWEJVRl9TSVpFKihCVUxLQUdHUkVfWklTRS0xKSkKKyNkZWZpbmUgTUFYX1RYQlVMS19TSVpFCQkJKExPQ0FMX1RYQlVGX1NJWkUqQlVMS0FHR1JFX1pJU0UpCisjZGVmaW5lIE1BWF9SWEJVTEtfU0laRQkJCShMT0NBTF9UWEJVRl9TSVpFKlJYQlVMS0FHR1JFX1pJU0UpCisjZGVmaW5lIE1BWF9NTE1FX0hBTkRMRVJfTUVNT1JZIDIwCisKKy8vIEZsYWdzIGZvciBCdWxrZmxhZ3MgY29udHJvbCBmb3IgYnVsayBvdXQgZGF0YQorLy8KKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTAkJCQkweDAwMDAwMDAxCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9SVFMJCQkJCQkweDAwMDAwMDAyCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9NTE1FCQkJCQkJMHgwMDAwMDAwNAorCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9QU1BPTEwJCQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRwkJCQkweDAwMDAwMDIwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfMgkJCQkweDAwMDAwMDQwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfMwkJCQkweDAwMDAwMDgwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfNAkJCQkweDAwMDAwMTAwCisKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzIJCQkweDAwMDIwMDAwCisjZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zCQkJMHgwMDA0MDAwMAorI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNAkJCTB4MDAwODAwMDAKKworLy8gVE9ETzptb3ZlIHRvIC4vYXRlL2luY2x1ZGUvaWZhY2UvYXRlX3VzYi5oCisKKyNkZWZpbmUgRlJFRV9IVFRYX1JJTkcoX3BDb29raWUsIF9waXBlSWQsIF90eENvbnRleHQpCQkJXAorewkJCQkJCQkJCQlcCisJaWYgKChfdHhDb250ZXh0KS0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gKF90eENvbnRleHQpLT5DdXJXcml0ZVBvc2l0aW9uKQlcCisJewkJCQkJCQkJCQkJCQkJCQkJXAorCQkoX3R4Q29udGV4dCktPmJSaW5nRW1wdHkgPSBUUlVFOwkJCVwKKwl9CQkJCQkJCQkJCQkJCQkJCQlcCisJLypOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJihfcCktPlR4Q291bnQpOyAqL1wKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVVNCIEJ1bGsgb3BlcmF0aW9uIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgTElOVVgKKyNkZWZpbmUgQlVMS0FHR1JFX1pJU0UgICAgICAgICAgMTAwCisjZGVmaW5lIFJUMjhYWF9QVVRfREVWSUNFCQkJCQkJCXVzYl9wdXRfZGV2CisjZGVmaW5lIFJUVVNCX0FMTE9DX1VSQihpc28pCQkJCQkJCXVzYl9hbGxvY191cmIoaXNvLCBHRlBfQVRPTUlDKQorI2RlZmluZSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpCQkJCQkJCXVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpCisjZGVmaW5lIFJUVVNCX1VSQl9BTExPQ19CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBEbWFfYWRkcikJCQl1c2JfYnVmZmVyX2FsbG9jKHBVc2JfRGV2LCBCdWZTaXplLCBHRlBfQVRPTUlDLCBwRG1hX2FkZHIpCisjZGVmaW5lIFJUVVNCX1VSQl9GUkVFX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikJdXNiX2J1ZmZlcl9mcmVlKHBVc2JfRGV2LCBCdWZTaXplLCBwVHJhbnNmZXJCdWYsIERtYV9hZGRyKQorCisjZGVmaW5lIFJUVVNCX0ZSRUVfVVJCKHBVcmIpCXVzYl9mcmVlX3VyYihwVXJiKQorCisvLyB1bmxpbmsgdXJiCisjZGVmaW5lIFJUVVNCX1VOTElOS19VUkIocFVyYikJCXVzYl9raWxsX3VyYihwVXJiKQorCitleHRlcm4gdm9pZCBkdW1wX3VyYihzdHJ1Y3QgdXJiICpwdXJiKTsKKworI2RlZmluZSBJbnRlcmxvY2tlZEluY3JlbWVudAkJYXRvbWljX2luYworI2RlZmluZSBOZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQJYXRvbWljX2luYworI2RlZmluZSBJbnRlcmxvY2tlZERlY3JlbWVudAkJYXRvbWljX2RlYworI2RlZmluZSBOZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQJYXRvbWljX2RlYworI2RlZmluZSBJbnRlcmxvY2tlZEV4Y2hhbmdlCQlhdG9taWNfc2V0CisKKyNlbmRpZiAvLyBMSU5VWCAvLworCisjZGVmaW5lIE5UX1NVQ0NFU1Moc3RhdHVzKQkJCSgoKHN0YXR1cykgPj0wKSA/IChUUlVFKTooRkFMU0UpKQorCisjZGVmaW5lIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVAkJMAorI2RlZmluZSBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9JTgkJMAorI2RlZmluZSBVU0JEX1NIT1JUX1RSQU5TRkVSX09LCQkJMAorI2RlZmluZSBQVVJCCQkJc3RydWN0IHVyYiAqCisKKyNkZWZpbmUgUElSUAkJdm9pZCAqCisjZGVmaW5lIE5ESVNfT0lECXUzMgorI2lmbmRlZiBVU0JfU1RfTk9FUlJPUgorI2RlZmluZSBVU0JfU1RfTk9FUlJPUiAgICAgMAorI2VuZGlmCisKKy8vIHZlbmRvci1zcGVjaWZpYyBjb250cm9sIG9wZXJhdGlvbnMKKyNkZWZpbmUgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMgKCAoMTAwICogT1NfSFopIC8gMTAwMCkKKyNkZWZpbmUgVU5MSU5LX1RJTUVPVVRfTVMJCTMKKwordm9pZCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUoc3RydWN0IHVyYiAqcHVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwordm9pZCBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwordm9pZCBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwordm9pZCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Cit2b2lkIFJUVVNCQnVsa1J4Q29tcGxldGUoc3RydWN0IHVyYiAqcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOworCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjZGVmaW5lIFJUVVNCTWxtZVVwKHBBZCkgXAorCWRvewkJCQkJCQkJICAgIFwKKwkJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqX3BUYXNrID0gJigocEFkKS0+bWxtZVRhc2spO1wKKwkJaWYgKF9wVGFzay0+a3RocmVhZF90YXNrKSBcCisgICAgICAgIHsgXAorCQkJX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgPSBUUlVFOyBcCisJICAgICAgICB3YWtlX3VwKCZfcFRhc2stPmt0aHJlYWRfcSk7IFwKKwkJfSBcCisJfXdoaWxlKDApCisjZWxzZQorI2RlZmluZSBSVFVTQk1sbWVVcChwQWQpCSAgICAgICAgXAorCWRvewkJCQkJCQkJICAgIFwKKwkJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqX3BUYXNrID0gJigocEFkKS0+bWxtZVRhc2spO1wKKwkJQ0hFQ0tfUElEX0xFR0FMSVRZKF9wVGFzay0+dGFza1BJRCkJCSAgICBcCisJCXsgXAorCQkJUlRNUF9TRU1fRVZFTlRfVVAoJihfcFRhc2stPnRhc2tTZW1hKSk7IFwKKwkJfVwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjZGVmaW5lIFJUVVNCQ01EVXAocEFkKSBcCisJZG97CVwKKwkJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqX3BUYXNrID0gJigocEFkKS0+Y21kUVRhc2spOwlcCisJCXsgXAorCQkJX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgPSBUUlVFOyBcCisJICAgICAgICB3YWtlX3VwKCZfcFRhc2stPmt0aHJlYWRfcSk7IFwKKwkJfSBcCisJfXdoaWxlKDApCisKKyNlbHNlCisjZGVmaW5lIFJUVVNCQ01EVXAocEFkKQkgICAgICAgICAgICAgICAgXAorCWRvewkJCQkJCQkJCSAgICBcCisJCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKl9wVGFzayA9ICYoKHBBZCktPmNtZFFUYXNrKTsJXAorCQlDSEVDS19QSURfTEVHQUxJVFkoX3BUYXNrLT50YXNrUElEKQkgICAgXAorCQl7XAorCQkJUlRNUF9TRU1fRVZFTlRfVVAoJihfcFRhc2stPnRhc2tTZW1hKSk7IFwKKwkJfVwKKwl9d2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgICAgMHg0MAorI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgICAgIDB4YzAKKy8vI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfT1VUICAgIDB4NDEKKy8vI2RlZmluZSBJTlRFUkZBQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgIDB4YzEKKworI2RlZmluZSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRwkJMHg4MAorCisjZGVmaW5lIFJUVVNCX1NFVF9CVUxLX0ZMQUcoX00sIF9GKQkoKF9NKS0+QnVsa0ZsYWdzIHw9IChfRikpCisjZGVmaW5lIFJUVVNCX0NMRUFSX0JVTEtfRkxBRyhfTSwgX0YpCSgoX00pLT5CdWxrRmxhZ3MgJj0gfihfRikpCisjZGVmaW5lIFJUVVNCX1RFU1RfQlVMS19GTEFHKF9NLCBfRikJKCgoX00pLT5CdWxrRmxhZ3MgJiAoX0YpKSAhPSAwKQorCisjZGVmaW5lIFJUTVBfSVJRX1JFUVVFU1QobmV0X2RldikJCWRve313aGlsZSgwKQorI2RlZmluZSBSVE1QX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQlkb3t9d2hpbGUoMCkKKworI2VuZGlmIC8vIF9fUlRNUF9VU0JfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ZGIxMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JbWQ1LmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLQlqYW4JCQkxMC0yOC0wMwkJSW5pdGlhbAotCVJpdGEgICAgCTExLTIzLTA0CQlNb2RpZnkgTUQ1IGFuZCBTSEEtMQotKi8KLQotI2lmbmRlZgl1aW50OAotI2RlZmluZQl1aW50OCAgdW5zaWduZWQJY2hhcgotI2VuZGlmCi0KLSNpZm5kZWYJdWludDMyCi0jZGVmaW5lCXVpbnQzMiB1bnNpZ25lZAlsb25nIGludAotI2VuZGlmCi0KLQotI2lmbmRlZglfX01ENV9IX18KLSNkZWZpbmUJX19NRDVfSF9fCi0KLSNkZWZpbmUgTUQ1X01BQ19MRU4gMTYKLQotdHlwZWRlZiBzdHJ1Y3QgX01ENV9DVFggewotICAgIFVJTlQzMiAgIEJ1Zls0XTsgICAgICAgICAgICAgLy8gYnVmZmVycyBvZiBmb3VyIHN0YXRlcwotCVVDSEFSICAgSW5wdXRbNjRdOyAgICAgICAgICAvLyBpbnB1dCBtZXNzYWdlCi0JVUlOVDMyICAgTGVuSW5CaXRDb3VudFsyXTsgICAvLyBsZW5ndGggY291bnRlciBmb3IgaW5wdXQgbWVzc2FnZSwgMCB1cCB0byA2NCBiaXRzCi19ICAgTUQ1X0NUWDsKLQotVk9JRCBNRDVJbml0KE1ENV9DVFggKnBDdHgpOwotVk9JRCBNRDVVcGRhdGUoTUQ1X0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7Ci1WT0lEIE1ENUZpbmFsKFVDSEFSIERpZ2VzdFsxNl0sIE1ENV9DVFggKnBDdHgpOwotVk9JRCBNRDVUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls0XSwgVUlOVDMyIE1lc1sxNl0pOwotCi12b2lkIG1kNV9tYWModTggKmtleSwgc2l6ZV90IGtleV9sZW4sIHU4ICpkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICptYWMpOwotdm9pZCBobWFjX21kNSh1OCAqa2V5LCBzaXplX3Qga2V5X2xlbiwgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1hYyk7Ci0KLS8vCi0vLyBTSEEgY29udGV4dAotLy8KLXR5cGVkZWYJc3RydWN0IF9TSEFfQ1RYCi17Ci0JVUlOVDMyICAgQnVmWzVdOyAgICAgICAgICAgICAvLyBidWZmZXJzIG9mIGZpdmUgc3RhdGVzCi0JVUNIQVIgICBJbnB1dFs4MF07ICAgICAgICAgIC8vIGlucHV0IG1lc3NhZ2UKLQlVSU5UMzIgICBMZW5JbkJpdENvdW50WzJdOyAgIC8vIGxlbmd0aCBjb3VudGVyIGZvciBpbnB1dCBtZXNzYWdlLCAwIHVwIHRvIDY0IGJpdHMKLQotfQlTSEFfQ1RYOwotCi1WT0lEIFNIQUluaXQoU0hBX0NUWCAqcEN0eCk7Ci1VQ0hBUiBTSEFVcGRhdGUoU0hBX0NUWCAqcEN0eCwgVUNIQVIgKnBEYXRhLCBVSU5UMzIgTGVuSW5CeXRlcyk7Ci1WT0lEIFNIQUZpbmFsKFNIQV9DVFggKnBDdHgsIFVDSEFSIERpZ2VzdFsyMF0pOwotVk9JRCBTSEFUcmFuc2Zvcm0oVUlOVDMyIEJ1Zls1XSwgVUlOVDMyIE1lc1syMF0pOwotCi0jZGVmaW5lIFNIQV9ESUdFU1RfTEVOIDIwCi0jZW5kaWYgLy8gX19NRDVfSF9fCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9BRVNfSAotI2RlZmluZQlfQUVTX0gKLQotdHlwZWRlZglzdHJ1Y3QKLXsKLQl1aW50MzIgZXJrWzY0XTsJCS8qIGVuY3J5cHRpb24gcm91bmQJa2V5cyAqLwotCXVpbnQzMiBkcmtbNjRdOwkJLyogZGVjcnlwdGlvbiByb3VuZAlrZXlzICovCi0JaW50CW5yOwkJCQkvKiBudW1iZXIgb2Ygcm91bmRzCSovCi19Ci1hZXNfY29udGV4dDsKLQotaW50CSBydG1wX2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LAl1aW50OCAqa2V5LAlpbnQJbmJpdHMgKTsKLXZvaWQgcnRtcF9hZXNfZW5jcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICk7Ci12b2lkIHJ0bXBfYWVzX2RlY3J5cHQoIGFlc19jb250ZXh0ICpjdHgsCXVpbnQ4IGlucHV0WzE2XSwgdWludDggb3V0cHV0WzE2XSApOwotCi12b2lkIEYoY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCBpbnQgaXRlcmF0aW9ucywgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOwotaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCk7Ci0KLSNlbmRpZiAvKiBhZXMuaAkqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oCmluZGV4IDNkMWE4MjguLjExNDM0MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvbWxtZS5oCkBAIC0zOSwxOCArMzksMjAgQEAKICNpZm5kZWYgX19NTE1FX0hfXwogI2RlZmluZSBfX01MTUVfSF9fCiAKLS8vIG1heGltdW0gc3VwcG9ydGVkIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gLQotLy8gRVNTLCBJQlNTLCBQcml2YWN5LCBTaG9ydCBQcmVhbWJsZSwgU3BlY3RydW0gbWdtdCwgU2hvcnQgU2xvdAorI2luY2x1ZGUgInJ0bXBfZG90MTEuaCIKKworLyogbWF4aW11bSBzdXBwb3J0ZWQgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAtICovCisvKiBFU1MsIElCU1MsIFByaXZhY3ksIFNob3J0IFByZWFtYmxlLCBTcGVjdHJ1bSBtZ210LCBTaG9ydCBTbG90ICovCiAjZGVmaW5lIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk8gICAweDA1MzMKIAogI2RlZmluZSBFTkRfT0ZfQVJHUyAgICAgICAgICAgICAgICAgLTEKICNkZWZpbmUgTEZTUl9NQVNLICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwNTcKLSNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfSU5UViAgICAgICAgIDEwMC8qMjAwKi8gICAgICAgLy8KKyNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfSU5UViAgICAgICAgIDEwMC8qMjAwKi8JLyogKi8KICNkZWZpbmUgTEVBRF9USU1FICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgICAgICAgMTAgIC8qNSovICAgICAgIC8vIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICogTUxNRV9UQVNLX0VYRUNfSU5UViA9IDEgc2VjCi0jZGVmaW5lIFJFT1JERVJfRVhFQ19JTlRWICAgICAgICAgCTEwMCAgICAgICAvLyAwLjEgc2VjCisjZGVmaW5lIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICAgICAgIDEwICAvKjUqLwkvKiBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAqIE1MTUVfVEFTS19FWEVDX0lOVFYgPSAxIHNlYyAqLworI2RlZmluZSBSRU9SREVSX0VYRUNfSU5UViAgICAgICAgIAkxMDAJLyogMC4xIHNlYyAqLwogCi0vLyBUaGUgZGVmaW5pdGlvbiBvZiBSYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uCisvKiBUaGUgZGVmaW5pdGlvbiBvZiBSYWRhciBkZXRlY3Rpb24gZHVyYXRpb24gcmVnaW9uICovCiAjZGVmaW5lIENFCQkwCiAjZGVmaW5lIEZDQwkJMQogI2RlZmluZSBKQVAJCTIKQEAgLTU4LDYyICs2MCw2MSBAQAogI2RlZmluZSBKQVBfVzU2CTQKICNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1CiAKLSNpZmRlZglORElTNTFfTUlOSVBPUlQKLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQwMDAgICAgICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKLSNlbHNlCi0jZGVmaW5lIEJFQUNPTl9MT1NUX1RJTUUgICAgICAgICAgICA0ICogT1NfSFogICAgLy8gMjA0OCBtc2VjID0gMiBzZWMKLSNlbmRpZgorI2RlZmluZSBCRUFDT05fTE9TVF9USU1FICAgICAgICAgICAgNCAqIE9TX0haCS8qIDIwNDggbXNlYyA9IDIgc2VjICovCiAKLSNkZWZpbmUgRExTX1RJTUVPVVQgICAgICAgICAgICAgICAgIDEyMDAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEFVVEhfVElNRU9VVCAgICAgICAgICAgICAgICAzMDAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBBU1NPQ19USU1FT1VUICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgSk9JTl9USU1FT1VUICAgICAgICAgICAgICAgIDIgKiBPU19IWiAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgU0hPUlRfQ0hBTk5FTF9USU1FICAgICAgICAgIDkwICAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIE1JTl9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxMTAgICAgICAgIC8vIHVuaXQ6IG1zZWMsIGZvciBkdWFsIGJhbmQgc2NhbgotI2RlZmluZSBNQVhfQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTQwICAgICAgIC8vIHVuaXQ6IG1zZWMsIGZvciBzaW5nbGUgYmFuZCBzY2FuCi0jZGVmaW5lCUZBU1RfQUNUSVZFX1NDQU5fVElNRQkgICAgMzAgCQkgIC8vIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUKLSNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQgICAgICAgICAvLyBhY3R1YWwgQ3dNaW4gPSAyXkNXX01JTl9JTl9CSVRTIC0gMQotI2RlZmluZSBDV19NQVhfSU5fQklUUyAgICAgICAgICAgICAgMTAgICAgICAgIC8vIGFjdHVhbCBDd01heCA9IDJeQ1dfTUFYX0lOX0JJVFMgLSAxCisjZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwCS8qIHVuaXQ6IG1zZWMgKi8KKyNkZWZpbmUgQVVUSF9USU1FT1VUICAgICAgICAgICAgICAgIDMwMAkvKiB1bml0OiBtc2VjICovCisjZGVmaW5lIEFTU09DX1RJTUVPVVQgICAgICAgICAgICAgICAzMDAJLyogdW5pdDogbXNlYyAqLworI2RlZmluZSBKT0lOX1RJTUVPVVQgICAgICAgICAgICAgICAgMjAwMAkvKiB1bml0OiBtc2VjICovCisjZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MAkvKiB1bml0OiBtc2VjICovCisjZGVmaW5lIE1JTl9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxMTAJLyogdW5pdDogbXNlYywgZm9yIGR1YWwgYmFuZCBzY2FuICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX1RJTUUgICAgICAgICAgICAxNDAJLyogdW5pdDogbXNlYywgZm9yIHNpbmdsZSBiYW5kIHNjYW4gKi8KKyNkZWZpbmUJRkFTVF9BQ1RJVkVfU0NBTl9USU1FCSAgICAzMAkvKiBBY3RpdmUgc2NhbiB3YWl0aW5nIGZvciBwcm9iZSByZXNwb25zZSB0aW1lICovCisjZGVmaW5lIENXX01JTl9JTl9CSVRTICAgICAgICAgICAgICA0CS8qIGFjdHVhbCBDd01pbiA9IDJeQ1dfTUlOX0lOX0JJVFMgLSAxICovCisjZGVmaW5lIExJTktfRE9XTl9USU1FT1VUICAgICAgICAgICAyMDAwMAkvKiB1bml0OiBtc2VjICovCisjZGVmaW5lIEFVVE9fV0FLRVVQX1RJTUVPVVQJCQk3MAkvKnVuaXQ6IG1zZWMgKi8KIAotLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KLS8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCi0vLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCi0jZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQotI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCisjZGVmaW5lIENXX01BWF9JTl9CSVRTICAgICAgICAgICAgICAxMAkvKiBhY3R1YWwgQ3dNYXggPSAyXkNXX01BWF9JTl9CSVRTIC0gMSAqLworCisvKiBOb3RlOiBSU1NJX1RPX0RCTV9PRkZTRVQgaGFzIGJlZW4gY2hhbmdlZCB0byB2YXJpYWJsZSBmb3IgbmV3IFJGICgyMDA0LTA3MjApLiAqLworLyogU0hvdWxkIG5vdCByZWZlciB0byB0aGlzIGNvbnN0YW50IGFueW1vcmUgKi8KKy8qI2RlZmluZSBSU1NJX1RPX0RCTV9PRkZTRVQgICAgICAgICAgMTIwIC8vIGZvciBSVDI1MzAgUlNTSS0xMTUgPSBkQm0gKi8KKyNkZWZpbmUgUlNTSV9GT1JfTUlEX1RYX1BPV0VSICAgICAgIC01NQkvKiAtNTUgZGIgaXMgY29uc2lkZXJlZCBtaWQtZGlzdGFuY2UgKi8KKyNkZWZpbmUgUlNTSV9GT1JfTE9XX1RYX1BPV0VSICAgICAgIC00NQkvKiAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZCAqLworCQkJCQkvKiBlbGlnaWJsZSB0byB1c2UgYSBsb3dlciBUWCBwb3dlciAqLwogI2RlZmluZSBSU1NJX0ZPUl9MT1dFU1RfVFhfUE9XRVIgICAgLTMwCi0vLyNkZWZpbmUgTUlEX1RYX1BPV0VSX0RFTFRBICAgICAgICAgIDAgICAvLyAwIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIG1pZC1kaXN0YW5jZSB0byBBUAotI2RlZmluZSBMT1dfVFhfUE9XRVJfREVMVEEgICAgICAgICAgNiAgICAvLyAtMyBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiB2ZXJ5IHNob3J0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgotI2RlZmluZSBMT1dFU1RfVFhfUE9XRVJfREVMVEEgICAgICAgMTYgICAvLyAtOCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBzaG9ydGVzdCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIKKy8qI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQICovCisjZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2CS8qIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiICovCisjZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNgkvKiAtOCBkYiBmcm9tIGZ1bGwgVFggcG93ZXIgdXBvbiBzaG9ydGVzdCBkaXN0YW5jZS4gMSBncmFkZSBpcyAwLjUgZGIgKi8KIAogI2RlZmluZSBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCAgICAgMAogI2RlZmluZSBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xEICAgMQogI2RlZmluZSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORyAgICAgICAgICAgICAgMjUKICNkZWZpbmUgUlNTSV9ERUxUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKIAotLy8gQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24KKy8qIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uICovCiAjZGVmaW5lIENRSV9JU19HT09EKGNxaSkgICAgICAgICAgICAoKGNxaSkgPj0gNTApCi0vLyNkZWZpbmUgQ1FJX0lTX0ZBSVIoY3FpKSAgICAgICAgICAoKChjcWkpID49IDIwKSAmJiAoKGNxaSkgPCA1MCkpCi0jZGVmaW5lIENRSV9JU19QT09SKGNxaSkgICAgICAgICAgICAoY3FpIDwgNTApICAvLygoKGNxaSkgPj0gNSkgJiYgKChjcWkpIDwgMjApKQorLyojZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKSAqLworI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKQkvKigoKGNxaSkgPj0gNSkgJiYgKChjcWkpIDwgMjApKSAqLwogI2RlZmluZSBDUUlfSVNfQkFEKGNxaSkgICAgICAgICAgICAgKGNxaSA8IDUpCiAjZGVmaW5lIENRSV9JU19ERUFEKGNxaSkgICAgICAgICAgICAoY3FpID09IDApCiAKLS8vIHdlaWdodGluZyBmYWN0b3IgdG8gY2FsY3VsYXRlIENoYW5uZWwgcXVhbGl0eSwgdG90YWwgc2hvdWxkIGJlIDEwMCUKKy8qIHdlaWdodGluZyBmYWN0b3IgdG8gY2FsY3VsYXRlIENoYW5uZWwgcXVhbGl0eSwgdG90YWwgc2hvdWxkIGJlIDEwMCUgKi8KICNkZWZpbmUgUlNTSV9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgNTAKICNkZWZpbmUgVFhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgMzAKICNkZWZpbmUgUlhfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgMjAKIAogI2RlZmluZSBCU1NfTk9UX0ZPVU5EICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCiAKLSNkZWZpbmUgTUFYX0xFTl9PRl9NTE1FX1FVRVVFICAgICAgICAgICAgNDAgLy8xMAorI2RlZmluZSBNQVhfTEVOX09GX01MTUVfUVVFVUUgICAgICAgICAgICA0MAkvKjEwICovCiAKLSNkZWZpbmUgU0NBTl9QQVNTSVZFICAgICAgICAgICAgICAgICAgICAgMTgJCS8vIHNjYW4gd2l0aCBubyBwcm9iZSByZXF1ZXN0LCBvbmx5IHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotI2RlZmluZSBTQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxOQkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKLSNkZWZpbmUJU0NBTl9DSVNDT19QQVNTSVZFCQkJCSAyMAkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuCi0jZGVmaW5lCVNDQU5fQ0lTQ09fQUNUSVZFCQkJCSAyMQkJLy8gU2luZ2xlIGNoYW5uZWwgYWN0aXZlIHNjYW4KLSNkZWZpbmUJU0NBTl9DSVNDT19OT0lTRQkJCQkgMjIJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3Igbm9pc2UgaGlzdG9ncmFtIGNvbGxlY3Rpb24KLSNkZWZpbmUJU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQJCQkgMjMJCS8vIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiBmb3IgY2hhbm5lbCBsb2FkIGNvbGxlY3Rpb24KLSNkZWZpbmUgRkFTVF9TQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgMjQJCS8vIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCisjZGVmaW5lIFNDQU5fUEFTU0lWRSAgICAgICAgICAgICAgICAgICAgIDE4CS8qIHNjYW4gd2l0aCBubyBwcm9iZSByZXF1ZXN0LCBvbmx5IHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSAqLworI2RlZmluZSBTQ0FOX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxOQkvKiBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSAqLworI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCS8qIFNpbmdsZSBjaGFubmVsIHBhc3NpdmUgc2NhbiAqLworI2RlZmluZQlTQ0FOX0NJU0NPX0FDVElWRQkJCQkgMjEJLyogU2luZ2xlIGNoYW5uZWwgYWN0aXZlIHNjYW4gKi8KKyNkZWZpbmUJU0NBTl9DSVNDT19OT0lTRQkJCQkgMjIJLyogU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbiAqLworI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkvKiBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4gZm9yIGNoYW5uZWwgbG9hZCBjb2xsZWN0aW9uICovCisjZGVmaW5lIEZBU1RfU0NBTl9BQ1RJVkUgICAgICAgICAgICAgICAgIDI0CS8qIHNjYW4gd2l0aCBwcm9iZSByZXF1ZXN0LCBhbmQgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCiAKICNkZWZpbmUgTUFDX0FERFJfSVNfR1JPVVAoQWRkcikgICAgICAgKCgoQWRkclswXSkgJiAweDAxKSkKICNkZWZpbmUgTUFDX0FERFJfSEFTSChBZGRyKSAgICAgICAgICAgIChBZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCkBAIC0xMjEsMTMgKzEyMiwxMyBAQAogI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCiAjZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKIAotLy8gTEVEIENvbnRyb2wKLS8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQotLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgorLyogTEVEIENvbnRyb2wgKi8KKy8qIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZSAqLworLyogbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZiAqLwogI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQogI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQogCi0vLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKKy8qIGJpdCBkZWZpbml0aW9uIG9mIHRoZSAyLWJ5dGUgcEJFQUNPTi0+Q2FwYWJpbGl0eSBmaWVsZCAqLwogI2RlZmluZSBDQVBfSVNfRVNTX09OKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDAwMSkgIT0gMCkKICNkZWZpbmUgQ0FQX0lTX0lCU1NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDIpICE9IDApCiAjZGVmaW5lIENBUF9JU19DRl9QT0xMQUJMRV9PTih4KSAgICAgICAgICgoKHgpICYgMHgwMDA0KSAhPSAwKQpAQCAtMTM2LDQ0ICsxMzcsNDQgQEAKICNkZWZpbmUgQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHgpICAgICAgKCgoeCkgJiAweDAwMjApICE9IDApCiAjZGVmaW5lIENBUF9JU19QQkNDX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDQwKSAhPSAwKQogI2RlZmluZSBDQVBfSVNfQUdJTElUWV9PTih4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MDA4MCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX1NQRUNUUlVNX01HTVQoeCkgICAgICAgICAgKCgoeCkgJiAweDAxMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19RT1MoeCkgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMjAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBDQVBfSVNfUU9TKHgpICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDIwMCkgIT0gMCkJLyogODAyLjExZSBkOSAqLwogI2RlZmluZSBDQVBfSVNfU0hPUlRfU0xPVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MDQwMCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX0FQU0QoeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDA4MDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19JTU1FRF9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHgxMDAwKSAhPSAwKSAgLy8gODAyLjExZSBkOQorI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBDQVBfSVNfSU1NRURfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4MTAwMCkgIT0gMCkJLyogODAyLjExZSBkOSAqLwogI2RlZmluZSBDQVBfSVNfRFNTU19PRkRNKHgpICAgICAgICAgICAgICAoKCh4KSAmIDB4MjAwMCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX0RFTEFZX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDQwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIENBUF9JU19ERUxBWV9CQSh4KSAgICAgICAgICAgICAgICgoKHgpICYgMHg0MDAwKSAhPSAwKQkvKiA4MDIuMTFlIGQ5ICovCiAKICNkZWZpbmUgQ0FQX0dFTkVSQVRFKGVzcyxpYnNzLHByaXYsc19wcmUsc19zbG90LHNwZWN0cnVtKSAgKCgoZXNzKSA/IDB4MDAwMSA6IDB4MDAwMCkgfCAoKGlic3MpID8gMHgwMDAyIDogMHgwMDAwKSB8ICgocHJpdikgPyAweDAwMTAgOiAweDAwMDApIHwgKChzX3ByZSkgPyAweDAwMjAgOiAweDAwMDApIHwgKChzX3Nsb3QpID8gMHgwNDAwIDogMHgwMDAwKSB8ICgoc3BlY3RydW0pID8gMHgwMTAwIDogMHgwMDAwKSkKIAotI2RlZmluZSBFUlBfSVNfTk9OX0VSUF9QUkVTRU5UKHgpICAgICAgICAoKCh4KSAmIDB4MDEpICE9IDApICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgRVJQX0lTX1VTRV9QUk9URUNUSU9OKHgpICAgICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKSAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIEVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKHgpICAgICgoKHgpICYgMHgwNCkgIT0gMCkgICAgLy8gODAyLjExZworI2RlZmluZSBFUlBfSVNfTk9OX0VSUF9QUkVTRU5UKHgpICAgICAgICAoKCh4KSAmIDB4MDEpICE9IDApCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgRVJQX0lTX1VTRV9QUk9URUNUSU9OKHgpICAgICAgICAgKCgoeCkgJiAweDAyKSAhPSAwKQkvKiA4MDIuMTFnICovCisjZGVmaW5lIEVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKHgpICAgICgoKHgpICYgMHgwNCkgIT0gMCkJLyogODAyLjExZyAqLwogCi0jZGVmaW5lIERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EICAgICAgIDgvLyAzICAvLyBqdXN0IHRlc3QgYnkgZ2FyeQorI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4CS8qIDMgIC8vIGp1c3QgdGVzdCBieSBnYXJ5ICovCiAjZGVmaW5lIERSU19QRU5BTFRZICAgICAgICAgICAgICAgICAgICAgIDgKIAogI2RlZmluZSBCQV9OT1RVU0UgCTIKLS8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lCisvKkJBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSAqLwogI2RlZmluZSBJTU1FRF9CQSAJMQogI2RlZmluZSBERUxBWV9CQQkwCiAKLS8vIEJBIEluaXRpYXRvciBzdWJmaWVsZCBpbiBERUxCQSBmcmFtZQorLyogQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lICovCiAjZGVmaW5lIE9SSUdJTkFUT1IJMQogI2RlZmluZSBSRUNJUElFTlQJMAogCi0vLyBBRERCQSBTdGF0dXMgQ29kZQorLyogQUREQkEgU3RhdHVzIENvZGUgKi8KICNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9TVUNDRVNTCQkJCQkwCiAjZGVmaW5lIEFEREJBX1JFU1VMVENPREVfUkVGVVNFRAkJCQkJMzcKICNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9JTlZBTElEX1BBUkFNRVRFUlMJCQkzOAogCi0vLyBERUxCQSBSZWFzb24gQ29kZQorLyogREVMQkEgUmVhc29uIENvZGUgKi8KICNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9RU1RBX0xFQVZJTkcJCQkJMzYKICNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9FTkRfQkEJCQkJCQkzNwogI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1VOS05PV05fQkEJCQkJCTM4CiAjZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfVElNRU9VVAkJCQkJMzkKIAotLy8gcmVzZXQgYWxsIE9uZVNlY1R4IGNvdW50ZXJzCisvKiByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMgKi8KICNkZWZpbmUgUkVTRVRfT05FX1NFQ19UWF9DTlQoX19wRW50cnkpIFwKIGlmICgoKF9fcEVudHJ5KSkgIT0gTlVMTCkgXAogeyBcCkBAIC0xODIsOTU3ICsxODMsODY4IEBACiAJKF9fcEVudHJ5KS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7IFwKIH0KIAotLy8KLS8vIDgwMi4xMSBmcmFtZSBmb3JtYXRzCi0vLwotLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLQlVU0hPUlQJQWR2Q29kaW5nOjE7Ci0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotCVVTSE9SVAlNaW1vUHM6MjsvL21vbWkgcG93ZXIgc2FmZQotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlTaG9ydEdJZm9yNDA6MTsJLy9mb3I0ME1IegotCVVTSE9SVAlUeFNUQkM6MTsKLQlVU0hPUlQJUnhTVEJDOjI7Ci0JVVNIT1JUCURlbGF5ZWRCQToxOwkvL3J0Mjg2MGMgbm90IHN1cHBvcnQKLQlVU0hPUlQJQU1zZHVTaXplOjE7CS8vIG9ubHkgc3VwcG9ydCBhcyB6ZXJvCi0JVVNIT1JUCUNDS21vZGVpbjQwOjE7Ci0JVVNIT1JUCVBTTVA6MTsKLQlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKLQlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKLX0gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87CisvKiAqLworLyogODAyLjExIGZyYW1lIGZvcm1hdHMgKi8KKy8qICovCisvKiAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X2NhcF9pbmZvIHsKKwl1MTYgQWR2Q29kaW5nOjE7CisJdTE2IENoYW5uZWxXaWR0aDoxOworCXUxNiBNaW1vUHM6MjsJLyptb21pIHBvd2VyIHNhZmUgKi8KKwl1MTYgR0Y6MTsJCS8qZ3JlZW4gZmllbGQgKi8KKwl1MTYgU2hvcnRHSWZvcjIwOjE7CisJdTE2IFNob3J0R0lmb3I0MDoxOwkvKmZvcjQwTUh6ICovCisJdTE2IFR4U1RCQzoxOworCXUxNiBSeFNUQkM6MjsKKwl1MTYgRGVsYXllZEJBOjE7CS8qcnQyODYwYyBub3Qgc3VwcG9ydCAqLworCXUxNiBBTXNkdVNpemU6MTsJLyogb25seSBzdXBwb3J0IGFzIHplcm8gKi8KKwl1MTYgQ0NLbW9kZWluNDA6MTsKKwl1MTYgUFNNUDoxOworCXUxNiBGb3J0eV9NaHpfSW50b2xlcmFudDoxOworCXUxNiBMU0lHVHhvcFByb1N1cDoxOworfTsKIAotLy8gIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCi19IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOworLyogIEhUIENhcGFiaWxpdHkgSU5GTyBmaWVsZCBpbiBIVCBDYXAgSUUgLiAqLworc3RydWN0IFBBQ0tFRCBydF9odF9jYXBfcGFybSB7CisJdTggTWF4UkFtcGR1RmFjdG9yOjI7CisJdTggTXBkdURlbnNpdHk6MzsKKwl1OCByc3Y6MzsJCS8qbW9taSBwb3dlciBzYWZlICovCit9OwogCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCU1DU1NldFsxMF07Ci0JVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcwotCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOwotCVVDSEFSCVR4UnhOb3RFcXVhbDoxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MTsKLQlVQ0hBUglyc3Y6MzsKLQlVQ0hBUglyc3YzWzNdOwotfSBIVF9NQ1NfU0VULCAqUEhUX01DU19TRVQ7CisvKiAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X21jc19zZXQgeworCXU4IE1DU1NldFsxMF07CisJdTggU3VwUmF0ZVsyXTsJLyogdW5pdCA6IDFNYnBzICovCisJdTggVHhNQ1NTZXREZWZpbmVkOjE7CisJdTggVHhSeE5vdEVxdWFsOjE7CisJdTggVHhTdHJlYW06MjsKKwl1OCBNcGR1RGVuc2l0eToxOworCXU4IHJzdjozOworCXU4IHJzdjNbM107Cit9OwogCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVTSE9SVAlQY286MTsKLQlVU0hPUlQJVHJhblRpbWU6MjsKLQlVU0hPUlQJcnN2OjU7Ly9tb21pIHBvd2VyIHNhZmUKLQlVU0hPUlQJTUNTRmVlZGJhY2s6MjsJLy8wOm5vIE1DUyBmZWVkYmFjaywgMjp1bnNvbGljaXRlZCBNQ1MgZmVlZGJhY2ssIDM6RnVsbCBNQ1MgZmVlZGJhY2ssICAxOnJzdi4KLQlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0Ci0JVVNIT1JUCVJER1N1cHBvcnQ6MTsJLy9yZXZlcnNlIERpcmVjdGlvbiBHcmFudCAgc3VwcG9ydAotCVVTSE9SVAlyc3YyOjQ7Ci19IEVYVF9IVF9DQVBfSU5GTywgKlBFWFRfSFRfQ0FQX0lORk87CisvKiAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2V4dF9odF9jYXBfaW5mbyB7CisJdTE2IFBjbzoxOworCXUxNiBUcmFuVGltZToyOworCXUxNiByc3Y6NTsJCS8qbW9taSBwb3dlciBzYWZlICovCisJdTE2IE1DU0ZlZWRiYWNrOjI7CS8qMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuICovCisJdTE2IFBsdXNIVEM6MTsJLyorSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydCAqLworCXUxNiBSREdTdXBwb3J0OjE7CS8qcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQgKi8KKwl1MTYgcnN2Mjo0OworfTsKIAotLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlSeE5EUENhcGFibGU6MTsKLQlVTE9ORwlUeE5EUENhcGFibGU6MTsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCUNhbGlicmF0aW9uOjI7Ci0JVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOwotCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwTm9Db21CRjoyOwotCVVMT05HCUV4cENvbUJGOjI7Ci0JVUxPTkcJTWluR3JvdXBpbmc6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7Ci0JVUxPTkcJcnN2OjM7Ci19IEhUX0JGX0NBUCwgKlBIVF9CRl9DQVA7CisvKiAgSFQgQmVhbWZvcm1pbmcgZmllbGQgaW4gSFQgQ2FwIElFIC4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfYmZfY2FwIHsKKwl1bnNpZ25lZCBsb25nIFR4QkZSZWNDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBSeFNvdW5kQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgVHhTb3VuZENhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIFJ4TkRQQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgVHhORFBDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBJbXBUeEJGQ2FwYWJsZToxOworCXVuc2lnbmVkIGxvbmcgQ2FsaWJyYXRpb246MjsKKwl1bnNpZ25lZCBsb25nIEV4cENTSUNhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIEV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7CisJdW5zaWduZWQgbG9uZyBFeHBDb21TdGVlckNhcGFibGU6MTsKKwl1bnNpZ25lZCBsb25nIEV4cENTSUZiazoyOworCXVuc2lnbmVkIGxvbmcgRXhwTm9Db21CRjoyOworCXVuc2lnbmVkIGxvbmcgRXhwQ29tQkY6MjsKKwl1bnNpZ25lZCBsb25nIE1pbkdyb3VwaW5nOjI7CisJdW5zaWduZWQgbG9uZyBDU0lCRkFudFN1cDoyOworCXVuc2lnbmVkIGxvbmcgTm9Db21TdGVlckJGQW50U3VwOjI7CisJdW5zaWduZWQgbG9uZyBDb21TdGVlckJGQW50U3VwOjI7CisJdW5zaWduZWQgbG9uZyBDU0lSb3dCRlN1cDoyOworCXVuc2lnbmVkIGxvbmcgQ2hhbkVzdGltYXRpb246MjsKKwl1bnNpZ25lZCBsb25nIHJzdjozOworfTsKIAotLy8gIEhUIGFudGVubmEgc2VsZWN0aW9uIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0FTX0NBUHsKLQlVQ0hBUglBbnRTZWxlY3Q6MTsKLQlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKLQlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKLQlVQ0hBUglFeHBDU0lGYms6MTsKLQlVQ0hBUglBbnRJbmRGYms6MTsKLQlVQ0hBUglSeEFTZWw6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCXJzdjoxOwotfSBIVF9BU19DQVAsICpQSFRfQVNfQ0FQOworLyogIEhUIGFudGVubmEgc2VsZWN0aW9uIGZpZWxkIGluIEhUIENhcCBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X2FzX2NhcCB7CisJdTggQW50U2VsZWN0OjE7CisJdTggRXhwQ1NJRmJrVHhBU0VMOjE7CisJdTggQW50SW5kRmJrVHhBU0VMOjE7CisJdTggRXhwQ1NJRmJrOjE7CisJdTggQW50SW5kRmJrOjE7CisJdTggUnhBU2VsOjE7CisJdTggVHhTb3VuZFBQRFU6MTsKKwl1OCByc3Y6MTsKK307CiAKLS8vIERyYWZ0IDEuMCBzZXQgSUUgbGVuZ3RoIDI2LCBidXQgaXMgZXh0ZW5zaWJsZS4uCisvKiBEcmFmdCAxLjAgc2V0IElFIGxlbmd0aCAyNiwgYnV0IGlzIGV4dGVuc2libGUuLiAqLwogI2RlZmluZSBTSVpFX0hUX0NBUF9JRQkJMjYKLS8vIFRoZSBzdHJ1Y3R1cmUgZm9yIEhUIENhcGFiaWxpdHkgSUUuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0NBUEFCSUxJVFlfSUV7Ci0JSFRfQ0FQX0lORk8JCUh0Q2FwSW5mbzsKLQlIVF9DQVBfUEFSTQkJSHRDYXBQYXJtOwotLy8JSFRfTUNTX1NFVAkJSHRNQ1NTZXQ7Ci0JVUNIQVIJCQlNQ1NTZXRbMTZdOwotCUVYVF9IVF9DQVBfSU5GTwlFeHRIdENhcEluZm87Ci0JSFRfQkZfQ0FQCQlUeEJGQ2FwOwkvLyBiZWFtZm9ybWluZyBjYXAuIHJ0Mjg2MGMgbm90IHN1cHBvcnQgYmVhbWZvcm1pbmcuCi0JSFRfQVNfQ0FQCQlBU0NhcDsJLy9hbnRlbm5hIHNlbGVjdGlvbi4KLX0gSFRfQ0FQQUJJTElUWV9JRSwgKlBIVF9DQVBBQklMSVRZX0lFOworLyogVGhlIHN0cnVjdHVyZSBmb3IgSFQgQ2FwYWJpbGl0eSBJRS4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfY2FwYWJpbGl0eV9pZSB7CisJc3RydWN0IHJ0X2h0X2NhcF9pbmZvIEh0Q2FwSW5mbzsKKwlzdHJ1Y3QgcnRfaHRfY2FwX3Bhcm0gSHRDYXBQYXJtOworLyogICAgICBzdHJ1Y3QgcnRfaHRfbWNzX3NldCAgICAgICAgICAgICAgSHRNQ1NTZXQ7ICovCisJdTggTUNTU2V0WzE2XTsKKwlzdHJ1Y3QgcnRfZXh0X2h0X2NhcF9pbmZvIEV4dEh0Q2FwSW5mbzsKKwlzdHJ1Y3QgcnRfaHRfYmZfY2FwIFR4QkZDYXA7CS8qIGJlYW1mb3JtaW5nIGNhcC4gcnQyODYwYyBub3Qgc3VwcG9ydCBiZWFtZm9ybWluZy4gKi8KKwlzdHJ1Y3QgcnRfaHRfYXNfY2FwIEFTQ2FwOwkvKmFudGVubmEgc2VsZWN0aW9uLiAqLworfTsKIAorLyogODAyLjExbiBkcmFmdDMgcmVsYXRlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICovCisvKiA3LjMuMi42MCAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZUR3ZWxsCQkJCQkJCTIwCS8qIGluIFRVLiBtaW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gYWN0aXZlIE9CU1Mgc2Nhbi4gKi8KKyNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZUR3ZWxsCQkJCQkJCTEwCS8qIGluIFRVLm1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KKyNkZWZpbmUgZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwJCQkJCTMwMAkvKiBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLiAqLworI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8qIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4gKi8KKyNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLyppbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbiAqLworI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8qIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltdW0gKi8KKwkJCQkJCQkJCQkJCQkJCQkvKiAgICAgIGludGVydmFsIGJldHdlZW4gb3ZlcmxhcHBpbmcgQlNTIHNjYW4gb3BlcmF0aW9ucy4gKi8KKyNkZWZpbmUgZG90MTFCU1NTY2FuQWN0aXZpdHlUaHJlc2hvbGQJCQkJCQkyNQkvKiBpbiAlJSwgbWF4IHRvdGFsIHRpbWUgdGhhdCBhIFNUQSBtYXkgYmUgYWN0aXZlIG9uIHRoZSBtZWRpdW0gZHVyaW5nIGEgcGVyaW9kIG9mICovCisJCQkJCQkJCQkJCQkJCQkJLyogICAgICAoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dCAqLworCQkJCQkJCQkJCQkJCQkJCS8qICAgICAgYmVpbmcgb2JsaWdhdGVkIHRvIHBlcmZvcm0gT0JTUyBTY2FuIG9wZXJhdGlvbnMuIGRlZmF1bHQgaXMgMjUoPT0gMC4yNSUpICovCiAKLS8vIDgwMi4xMW4gZHJhZnQzIHJlbGF0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zLgotLy8gNy4zLjIuNjAKLSNkZWZpbmUgZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbAkJCQkJCQkyMAkvLyBpbiBUVS4gbWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIGFjdGl2ZSBPQlNTIHNjYW4uCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5BY3RpdmVEd2VsbAkJCQkJCQkxMAkvLyBpbiBUVS5taW4gYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIGNvbnRpbm91c2x5IHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYW4gcGFzc2l2ZSBPQlNTIHNjYW4uCi0jZGVmaW5lIGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsCQkJCQkzMDAgIC8vIGluIHNlYy4gbWF4IGludGVydmFsIGJldHdlZW4gc2NhbiBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZCB0byBkZXRlY3QgQlNTIGNoYW5uZWwgd2lkdGggdHJpZ2dlciBldmVudHMuCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMDAJLy8gaW4gVFUuIG1pbiB0b3RhbCBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhIHBhc3NpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsCQkJCQkyMAkvL2luIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBhY3RpdmUgT0JTUyBzY2FuCi0jZGVmaW5lIGRvdDExQlNTV2lkdGhDaGFubmVsVHJhbnNhY3Rpb25EZWxheUZhY3RvcgkJCTUJLy8gbWluIHJhdGlvIGJldHdlZW4gdGhlIGRlbGF5IHRpbWUgaW4gcGVyZm9ybWluZyBhIHN3aXRjaCBmcm9tIDIwTUh6IEJTUyB0byAyMC80MCBCU1Mgb3BlcmF0aW9uIGFuZCB0aGUgbWF4aW1hCi0JCQkJCQkJCQkJCQkJCQkJLy8JaW50ZXJ2YWwgYmV0d2VlbiBvdmVybGFwcGluZyBCU1Mgc2NhbiBvcGVyYXRpb25zLgotI2RlZmluZSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZAkJCQkJCTI1CS8vIGluICUlLCBtYXggdG90YWwgdGltZSB0aGF0IGEgU1RBIG1heSBiZSBhY3RpdmUgb24gdGhlIG1lZGl1bSBkdXJpbmcgYSBwZXJpb2Qgb2YKLQkJCQkJCQkJCQkJCQkJCQkvLwkoZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yICogZG90MTFCU1NXaWR0aFRyaWdnZXJTY2FuSW50ZXJ2YWwpIHNlY29uZHMgd2l0aG91dAotCQkJCQkJCQkJCQkJCQkJCS8vCWJlaW5nIG9ibGlnYXRlZCB0byBwZXJmb3JtIE9CU1MgU2NhbiBvcGVyYXRpb25zLiBkZWZhdWx0IGlzIDI1KD09IDAuMjUlKQorc3RydWN0IFBBQ0tFRCBydF9vdmVybGFwX2Jzc19zY2FuX2llIHsKKwl1MTYgU2NhblBhc3NpdmVEd2VsbDsKKwl1MTYgU2NhbkFjdGl2ZUR3ZWxsOworCXUxNiBUcmlnZ2VyU2NhbkludDsJLyogVHJpZ2dlciBzY2FuIGludGVydmFsICovCisJdTE2IFBhc3NpdmVUYWxQZXJDaGFubmVsOwkvKiBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsICovCisJdTE2IEFjdGl2ZVRhbFBlckNoYW5uZWw7CS8qIGFjdGl2ZSB0b3RhbCBwZXIgY2hhbm5lbCAqLworCXUxNiBEZWxheUZhY3RvcjsJLyogQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IgKi8KKwl1MTYgU2NhbkFjdFRocmU7CS8qIFNjYW4gQWN0aXZpdHkgdGhyZXNob2xkICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX09WRVJMQVBfQlNTX1NDQU5fSUV7Ci0JVVNIT1JUCQlTY2FuUGFzc2l2ZUR3ZWxsOwotCVVTSE9SVAkJU2NhbkFjdGl2ZUR3ZWxsOwotCVVTSE9SVAkJVHJpZ2dlclNjYW5JbnQ7CQkJCS8vIFRyaWdnZXIgc2NhbiBpbnRlcnZhbAotCVVTSE9SVAkJUGFzc2l2ZVRhbFBlckNoYW5uZWw7CQkvLyBwYXNzaXZlIHRvdGFsIHBlciBjaGFubmVsCi0JVVNIT1JUCQlBY3RpdmVUYWxQZXJDaGFubmVsOwkJLy8gYWN0aXZlIHRvdGFsIHBlciBjaGFubmVsCi0JVVNIT1JUCQlEZWxheUZhY3RvcjsJCQkJLy8gQlNTIHdpZHRoIGNoYW5uZWwgdHJhbnNpdGlvbiBkZWxheSBmYWN0b3IKLQlVU0hPUlQJCVNjYW5BY3RUaHJlOwkJCQkvLyBTY2FuIEFjdGl2aXR5IHRocmVzaG9sZAotfU9WRVJMQVBfQlNTX1NDQU5fSUUsICpQT1ZFUkxBUF9CU1NfU0NBTl9JRTsKLQotCi0vLyAgNy4zLjIuNTYuIDIwLzQwIENvZXhpc3RlbmNlIGVsZW1lbnQgdXNlZCBpbiAgRWxlbWVudCBJRCA9IDcyID0gSUVfMjA0MF9CU1NfQ09FWElTVAotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfSUV7Ci0gc3RydWN0IFBBQ0tFRCB7Ci0JVUNIQVIJSW5mb1JlcToxOwotCVVDSEFSCUludG9sZXJhbnQ0MDoxOwkJCS8vIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4KLQlVQ0hBUglCU1MyMFdpZHRoUmVxOjE7CQkvLyBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4KLQlVQ0hBUglyc3Y6NTsKLSAgICB9IGZpZWxkOwotIFVDSEFSICAgd29yZDsKKy8qICA3LjMuMi41Ni4gMjAvNDAgQ29leGlzdGVuY2UgZWxlbWVudCB1c2VkIGluICBFbGVtZW50IElEID0gNzIgPSBJRV8yMDQwX0JTU19DT0VYSVNUICovCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9JRSB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IEluZm9SZXE6MTsKKwkJdTggSW50b2xlcmFudDQwOjE7CS8qIEludGVyLUJTUy4gc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQlNTIGZyb20gb3BlcmF0aW5nIGFzIGEgMjAvNDAgTWh6IEJTUy4gKi8KKwkJdTggQlNTMjBXaWR0aFJlcToxOwkvKiBJbnRyYS1CU1Mgc2V0IDEgd2hlbiBwcm9oaWJpdHMgYSByZWNlaXZpbmcgQVAgZnJvbSBvcGVyYXRpbmcgaXRzIEJTUyBhcyBhIDIwLzQwTUh6IEJTUy4gKi8KKwkJdTggcnN2OjU7CisJfSBmaWVsZDsKKwl1OCB3b3JkOwogfSBCU1NfMjA0MF9DT0VYSVNUX0lFLCAqUEJTU18yMDQwX0NPRVhJU1RfSUU7CiAKK3N0cnVjdCBydF90cmlnZ2VyX2V2ZW50YSB7CisJQk9PTEVBTiBiVmFsaWQ7CisJdTggQlNTSURbNl07CisJdTggUmVnQ2xhc3M7CQkvKiBSZWd1bGF0b3J5IENsYXNzICovCisJdTE2IENoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBDRENvdW50ZXI7CS8qIE1haW50YWluIGEgc2VwZXJhdGUgY291bnQgZG93biBjb3VudGVyIGZvciBlYWNoIEV2ZW50IEEuICovCit9OwogCi10eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRBewotCUJPT0xFQU4JCQliVmFsaWQ7Ci0JVUNIQVIJQlNTSURbNl07Ci0JVUNIQVIJUmVnQ2xhc3M7CS8vIFJlZ3VsYXRvcnkgQ2xhc3MKLQlVU0hPUlQJQ2hhbm5lbDsKLQlVTE9ORwlDRENvdW50ZXI7ICAgLy8gTWFpbnRhaW4gYSBzZXBlcmF0ZSBjb3VudCBkb3duIGNvdW50ZXIgZm9yIGVhY2ggRXZlbnQgQS4KLX0gVFJJR0dFUl9FVkVOVEEsICpQVFJJR0dFUl9FVkVOVEE7Ci0KLS8vIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUKLS8vIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4KKy8qIDIwLzQwIHRyaWdnZXIgZXZlbnQgdGFibGUgKi8KKy8qIElmIG9uZSBFdmVudCBBIGRlbGV0ZSBvciBjcmVhdGVkLCBvciBpZiBFdmVudCBCIGlzIGRldGVjdGVkIG9yIG5vdCBkZXRlY3RlZCwgU1RBIHNob3VsZCBzZW5kIDIwNDBCU1NDb2V4aXN0ZW5jZSB0byBBUC4gKi8KICNkZWZpbmUgTUFYX1RSSUdHRVJfRVZFTlQJCTY0Ci10eXBlZGVmIHN0cnVjdCAgX1RSSUdHRVJfRVZFTlRfVEFCewotCVVDSEFSCUV2ZW50QU5vOwotCVRSSUdHRVJfRVZFTlRBCUV2ZW50QVtNQVhfVFJJR0dFUl9FVkVOVF07Ci0JVUxPTkcJCQlFdmVudEJDb3VudERvd247CS8vIENvdW50IGRvd24gY291bnRlciBmb3IgRXZlbnQgQi4KLX0gVFJJR0dFUl9FVkVOVF9UQUIsICpQVFJJR0dFUl9FVkVOVF9UQUI7CitzdHJ1Y3QgcnRfdHJpZ2dlcl9ldmVudF90YWIgeworCXU4IEV2ZW50QU5vOworCXN0cnVjdCBydF90cmlnZ2VyX2V2ZW50YSBFdmVudEFbTUFYX1RSSUdHRVJfRVZFTlRdOworCXVuc2lnbmVkIGxvbmcgRXZlbnRCQ291bnREb3duOwkvKiBDb3VudCBkb3duIGNvdW50ZXIgZm9yIEV2ZW50IEIuICovCit9OwogCi0vLyA3LjMuMjcgMjAvNDAgQnNzIENvZXhpc3RlbmNlIE1nbXQgY2FwYWJpbGl0eSB1c2VkIGluIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBpbmZvcm1hdGlvbiBJRSggSUQgPSAxMjcgPSBJRV9FWFRfQ0FQQUJJTElUWSkuCi0vLwlUaGlzIGlzIHRoZSBmaXJzdCBvY3RldCBhbmQgd2FzIGRlZmluZWQgaW4gODAyLjExbiBEMy4wMyBhbmQgODAyLjExeUQ5LjAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRVhUX0NBUF9JTkZPX0VMRU1FTlR7Ci0JVUNIQVIJQnNzQ29leGlzdE1nbXRTdXBwb3J0OjE7Ci0JVUNIQVIJcnN2OjE7Ci0JVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOwotCVVDSEFSCXJzdjI6NTsKLX1FWFRfQ0FQX0lORk9fRUxFTUVOVCwgKlBFWFRfQ0FQX0lORk9fRUxFTUVOVDsKKy8qIDcuMy4yNyAyMC80MCBCc3MgQ29leGlzdGVuY2UgTWdtdCBjYXBhYmlsaXR5IHVzZWQgaW4gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uIElFKCBJRCA9IDEyNyA9IElFX0VYVF9DQVBBQklMSVRZKS4gKi8KKy8qICAgICAgVGhpcyBpcyB0aGUgZmlyc3Qgb2N0ZXQgYW5kIHdhcyBkZWZpbmVkIGluIDgwMi4xMW4gRDMuMDMgYW5kIDgwMi4xMXlEOS4wICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2V4dF9jYXBfaW5mb19lbGVtZW50IHsKKwl1OCBCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKKwl1OCByc3Y6MTsKKwl1OCBFeHRlbmRDaGFubmVsU3dpdGNoOjE7CisJdTggcnN2Mjo1OworfTsKIAorLyogODAyLjExbiA3LjMuMi42MSAqLworc3RydWN0IFBBQ0tFRCBydF9ic3NfMjA0MF9jb2V4aXN0X2VsZW1lbnQgeworCXU4IEVsZW1lbnRJRDsJLyogSUQgPSBJRV8yMDQwX0JTU19DT0VYSVNUID0gNzIgKi8KKwl1OCBMZW47CisJQlNTXzIwNDBfQ09FWElTVF9JRSBCc3NDb2V4aXN0SWU7Cit9OwogCi0vLyA4MDIuMTFuIDcuMy4yLjYxCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfRUxFTUVOVHsKLQlVQ0hBUgkJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19DT0VYSVNUID0gNzIKLQlVQ0hBUgkJCQkJTGVuOwotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJzc0NvZXhpc3RJZTsKLX1CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQsICpQQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UOworLyo4MDIuMTFuIDcuMy4yLjU5ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2Jzc18yMDQwX2ludG9sZXJhbnRfY2hfcmVwb3J0IHsKKwl1OCBFbGVtZW50SUQ7CS8qIElEID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgPSA3MyAqLworCXU4IExlbjsKKwl1OCBSZWd1bGF0b3J5Q2xhc3M7CisJdTggQ2hMaXN0WzBdOworfTsKIAorLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLworc3RydWN0IFBBQ0tFRCBydF9jaGFfc3dpdGNoX2Fubm91bmNlX2llIHsKKwl1OCBTd2l0Y2hNb2RlOwkvKmNoYW5uZWwgc3dpdGNoIG1vZGUgKi8KKwl1OCBOZXdDaGFubmVsOwkvKiAqLworCXU4IFN3aXRjaENvdW50OwkvKiAqLworfTsKIAotLy84MDIuMTFuIDcuMy4yLjU5Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUewotCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgPSA3MwotCVVDSEFSCQkJCUxlbjsKLQlVQ0hBUgkJCQlSZWd1bGF0b3J5Q2xhc3M7Ci0JVUNIQVIJCQkJQ2hMaXN0WzBdOwotfUJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JULCAqUEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUOworLyogVGhlIHN0cnVjdHVyZSBmb3IgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQgSUUuIFRoaXMgaXMgaW4gODAyLjExbiBEMy4wMyAqLworc3RydWN0IFBBQ0tFRCBydF9zZWNfY2hhX29mZnNldF9pZSB7CisJdTggU2Vjb25kYXJ5Q2hhbm5lbE9mZnNldDsJLyogMTogU2Vjb25kYXJ5IGFib3ZlLCAzOiBTZWNvbmRhcnkgYmVsb3csIDA6IG5vIFNlY29uZGFyeSAqLworfTsKIAorLyogVGhpcyBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gc3RydWN0IHN0cnVjdCBydF9odF9jYXBhYmlsaXR5ICovCitzdHJ1Y3QgcnRfaHRfcGh5X2luZm8geworCUJPT0xFQU4gYkh0RW5hYmxlOwkvKiBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuICovCisJQk9PTEVBTiBiUHJlTkh0OwkvKiBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuICovCisJLypTdWJzdHJhY3QgZnJvbSBIVCBDYXBhYmlsaXR5IElFICovCisJdTggTUNTU2V0WzE2XTsKK307CiAKLS8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRXsKLQlVQ0hBUgkJCVN3aXRjaE1vZGU7CS8vY2hhbm5lbCBzd2l0Y2ggbW9kZQotCVVDSEFSCQkJTmV3Q2hhbm5lbDsJLy8KLQlVQ0hBUgkJCVN3aXRjaENvdW50OwkvLwotfSBDSEFfU1dJVENIX0FOTk9VTkNFX0lFLCAqUENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUU7CisvKlRoaXMgc3RydWN0dXJlIHN1YnN0cmFjdHMgcmFsaW5rIHN1cHBvcnRzIGZyb20gYWxsIDgwMi4xMW4tcmVsYXRlZCBmZWF0dXJlcy4gKi8KKy8qRmVhdHVyZXMgbm90IGxpc3RlZCBoZXJlIGJ1dCBjb250YWluZWQgaW4gODAyLjExbiBzcGVjIGFyZSBub3Qgc3VwcG9ydGVkIGluIHJ0Mjg2MC4gKi8KK3N0cnVjdCBydF9odF9jYXBhYmlsaXR5IHsKKwl1MTYgQ2hhbm5lbFdpZHRoOjE7CisJdTE2IE1pbW9QczoyOwkvKm1pbW8gcG93ZXIgc2FmZSBNTVBTXyAqLworCXUxNiBHRjoxOwkJLypncmVlbiBmaWVsZCAqLworCXUxNiBTaG9ydEdJZm9yMjA6MTsKKwl1MTYgU2hvcnRHSWZvcjQwOjE7CS8qZm9yNDBNSHogKi8KKwl1MTYgVHhTVEJDOjE7CisJdTE2IFJ4U1RCQzoyOwkvKiAyIGJpdHMgKi8KKwl1MTYgQW1zZHVFbmFibGU6MTsJLyogRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuICovCisJdTE2IEFtc2R1U2l6ZToxOwkvKiBNYXggcmVjZWl2aW5nIEEtTVNEVSBzaXplICovCisJdTE2IHJzdjo1OwogCisJLypTdWJzdHJhY3QgZnJvbSBBZGRpb250IEhUIElORk8gSUUgKi8KKwl1OCBNYXhSQW1wZHVGYWN0b3I6MjsKKwl1OCBNcGR1RGVuc2l0eTozOworCXU4IEV4dENoYW5PZmZzZXQ6MjsJLyogUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZyAgICAgdTggICBOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4gKi8KKwl1OCBSZWNvbVdpZHRoOjE7CiAKLS8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDX0NIQV9PRkZTRVRfSUV7Ci0JVUNIQVIJCQlTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OwkgLy8gMTogU2Vjb25kYXJ5IGFib3ZlLCAzOiBTZWNvbmRhcnkgYmVsb3csIDA6IG5vIFNlY29uZGFyeQotfSBTRUNfQ0hBX09GRlNFVF9JRSwgKlBTRUNfQ0hBX09GRlNFVF9JRTsKKwl1MTYgT3BlcmFpb25Nb2RlOjI7CisJdTE2IE5vbkdmUHJlc2VudDoxOworCXUxNiByc3YzOjE7CisJdTE2IE9CU1NfTm9uSFRFeGlzdDoxOworCXUxNiByc3YyOjExOwogCisJLyogTmV3IEV4dGVuc2lvbiBDaGFubmVsIE9mZnNldCBJRSAqLworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJLyogRXh0ZW5zaW9uIENhcGFiaWxpdHkgSUUgPSAxMjcgKi8KKwl1OCBCU1NDb2V4aXN0MjA0MDsKK307CiAKLS8vIFRoaXMgc3RydWN0dXJlIGlzIGV4dHJhY3RlZCBmcm9tIHN0cnVjdCBSVF9IVF9DQVBBQklMSVRZCi10eXBlZGVmIHN0cnVjdCB7Ci0JQk9PTEVBTgkJCWJIdEVuYWJsZTsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KLQlCT09MRUFOCQkJYlByZU5IdDsJIC8vIElmIHdlIHNob3VsZCB1c2UgaHQgcmF0ZS4KLQkvL1N1YnN0cmFjdCBmcm9tIEhUIENhcGFiaWxpdHkgSUUKLQlVQ0hBUgkJCU1DU1NldFsxNl07CS8vb25seSBzdXBvb3J0IE1DUz0wLTE1LDMyICwKLX0gUlRfSFRfUEhZX0lORk8sICpQUlRfSFRfUEhZX0lORk87CisvKiAgIGZpZWxkIGluIEFkZHRpb25hbCBIVCBJbmZvcm1hdGlvbiBJRSAuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2FkZF9odGluZm8geworCXU4IEV4dENoYW5PZmZzZXQ6MjsKKwl1OCBSZWNvbVdpZHRoOjE7CisJdTggUmlmc01vZGU6MTsKKwl1OCBTX1BTTVBTdXA6MTsJLypJbmRpY2F0ZSBzdXBwb3J0IGZvciBzY2hlZHVsZWQgUFNNUCAqLworCXU4IFNlckludGVyR3JhbnU6MzsJLypzZXJ2aWNlIGludGVydmFsIGdyYW51bGFyaXR5ICovCit9OwogCi0vL1RoaXMgc3RydWN0dXJlIHN1YnN0cmFjdHMgcmFsaW5rIHN1cHBvcnRzIGZyb20gYWxsIDgwMi4xMW4tcmVsYXRlZCBmZWF0dXJlcy4KLS8vRmVhdHVyZXMgbm90IGxpc3RlZCBoZXJlIGJ1dCBjb250YWluZWQgaW4gODAyLjExbiBzcGVjIGFyZSBub3Qgc3VwcG9ydGVkIGluIHJ0Mjg2MC4KLXR5cGVkZWYgc3RydWN0IHsKLQlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7Ci0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKLQlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVR4U1RCQzoxOwotCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCi0JVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgotCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQotCVVTSE9SVAlyc3Y6NTsKK3N0cnVjdCBQQUNLRUQgcnRfYWRkX2h0aW5mbzIgeworCXUxNiBPcGVyYWlvbk1vZGU6MjsKKwl1MTYgTm9uR2ZQcmVzZW50OjE7CisJdTE2IHJzdjoxOworCXUxNiBPQlNTX05vbkhURXhpc3Q6MTsKKwl1MTYgcnN2MjoxMTsKK307CiAKLQkvL1N1YnN0cmFjdCBmcm9tIEFkZGlvbnQgSFQgSU5GTyBJRQotCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOwotCVVDSEFSCU1wZHVEZW5zaXR5OjM7Ci0JVUNIQVIJRXh0Q2hhbk9mZnNldDoyOwkvLyBQbGVhc2Ugbm90IHRoZSBkaWZmZXJlbmNlIHdpdGggZm9sbG93aW5nIAlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0KLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3YzOjE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3YyOjExOwotCi0JLy8gTmV3IEV4dGVuc2lvbiBDaGFubmVsIE9mZnNldCBJRQotCVVDSEFSCU5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JLy8gRXh0ZW5zaW9uIENhcGFiaWxpdHkgSUUgPSAxMjcKLQlVQ0hBUglCU1NDb2V4aXN0MjA0MDsKLX0gUlRfSFRfQ0FQQUJJTElUWSwgKlBSVF9IVF9DQVBBQklMSVRZOwotCi0vLyAgIGZpZWxkIGluIEFkZHRpb25hbCBIVCBJbmZvcm1hdGlvbiBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0JVUNIQVIJUmlmc01vZGU6MTsKLQlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKLQlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKLX0gQUREX0hUSU5GTywgKlBBRERfSFRJTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUR7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotCVVTSE9SVAlOb25HZlByZXNlbnQ6MTsKLQlVU0hPUlQJcnN2OjE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3YyOjExOwotfSBBRERfSFRJTkZPMiwgKlBBRERfSFRJTkZPMjsKLQotCi0vLyBUT0RPOiBOZWVkIHN5bmMgd2l0aCBzcGVjIGFib3V0IHRoZSBkZWZpbml0aW9uIG9mIFN0YmNNY3MuIEluIERyYWZ0IDMuMDMsIGl0J3MgcmVzZXJ2ZWQuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUR7Ci0JVVNIT1JUCVN0YmNNY3M6NjsKLQlVU0hPUlQJRHVhbEJlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlTVEJDQmVhY29uOjE7Ci0JVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlQY29QaGFzZToxOwotCVVTSE9SVAlyc3Y6NDsKLX0gQUREX0hUSU5GTzMsICpQQUREX0hUSU5GTzM7CisvKiBUT0RPOiBOZWVkIHN5bmMgd2l0aCBzcGVjIGFib3V0IHRoZSBkZWZpbml0aW9uIG9mIFN0YmNNY3MuIEluIERyYWZ0IDMuMDMsIGl0J3MgcmVzZXJ2ZWQuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2FkZF9odGluZm8zIHsKKwl1MTYgU3RiY01jczo2OworCXUxNiBEdWFsQmVhY29uOjE7CisJdTE2IER1YWxDVFNQcm90ZWN0OjE7CisJdTE2IFNUQkNCZWFjb246MTsKKwl1MTYgTHNpZ1R4b3BQcm90OjE7CS8qIEwtU0lHIFRYT1AgcHJvdGVjdGlvbiBmdWxsIHN1cHBvcnQgKi8KKwl1MTYgUGNvQWN0aXZlOjE7CisJdTE2IFBjb1BoYXNlOjE7CisJdTE2IHJzdjo0OworfTsKIAogI2RlZmluZSBTSVpFX0FERF9IVF9JTkZPX0lFCQkyMgotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKLQlVQ0hBUgkJCQlDb250cm9sQ2hhbjsKLQlBRERfSFRJTkZPCQkJQWRkSHRJbmZvOwotCUFERF9IVElORk8yCQkJQWRkSHRJbmZvMjsKLQlBRERfSFRJTkZPMwkJCUFkZEh0SW5mbzM7Ci0JVUNIQVIJCQkJTUNTU2V0WzE2XTsJCS8vIEJhc2ljIE1DUyBzZXQKLX0gQUREX0hUX0lORk9fSUUsICpQQUREX0hUX0lORk9fSUU7CitzdHJ1Y3QgUEFDS0VEIHJ0X2FkZF9odF9pbmZvX2llIHsKKwl1OCBDb250cm9sQ2hhbjsKKwlzdHJ1Y3QgcnRfYWRkX2h0aW5mbyBBZGRIdEluZm87CisJc3RydWN0IHJ0X2FkZF9odGluZm8yIEFkZEh0SW5mbzI7CisJc3RydWN0IHJ0X2FkZF9odGluZm8zIEFkZEh0SW5mbzM7CisJdTggTUNTU2V0WzE2XTsJLyogQmFzaWMgTUNTIHNldCAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKLQlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OwotfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOworc3RydWN0IFBBQ0tFRCBydF9uZXdfZXh0X2NoYW5faWUgeworCXU4IE5ld0V4dENoYW5PZmZzZXQ7Cit9OwogCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lXzgwMl8xMSB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IE9jdGV0WzFdOworfTsKIAotLy8gNC1ieXRlIEhUQyBmaWVsZC4gIG1heWJlIGluY2x1ZGVkIGluIGFueSBmcmFtZSBleGNlcHQgbm9uLVFPUyBkYXRhIGZyYW1lLiAgVGhlIE9yZGVyIGJpdCBtdXN0IHNldCAxLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVSU5UMzIJCU1BOjE7CS8vbWFuYWdlbWVudCBhY3Rpb24gcGF5bG9hZCBleGlzdCBpbiAoUW9TIE51bGwrSFRDKQotICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAotICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjawotICAgIFVJTlQzMgkJTVJTb3JBU0k6MzsJLy8gTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuCi0gICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KLSAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCi0gICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KLSAgICBVSU5UMzIJCUNhbFNlcToyOyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJQ1NJU1RFRVJJTkc6MjsJLy9DU0kvIFNURUVSSU5HCi0gICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKLSAgICBVSU5UMzIJCXJzdjo1OyAgLy9jYWxpYnJhdGlvbiBzZXF1ZW5jZQotICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJUkRHOjE7CS8vUkRHIC8gTW9yZSBQUERVCi19IEhUX0NPTlRST0wsICpQSFRfQ09OVFJPTDsKKy8qIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuICovCitzdHJ1Y3QgUEFDS0VEIHJ0X21hX2JvZHkgeworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwl1OCBPY3RldFsxXTsKK307CiAKLS8vIDItYnl0ZSBRT1MgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSAgICBVU0hPUlQgICAgICBFT1NQOjE7Ci0gICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQotICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOwotICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7Ci19IFFPU19DT05UUk9MLCAqUFFPU19DT05UUk9MOworc3RydWN0IFBBQ0tFRCBydF9oZWFkZXJfODAyXzMgeworCXU4IERBQWRkcjFbTUFDX0FERFJfTEVOXTsKKwl1OCBTQUFkZHIyW01BQ19BRERSX0xFTl07CisJdTggT2N0ZXRbMl07Cit9OworLyovL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdCAqLworLyogMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluICAgICAgIERFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZGVsYmFfcGFybSB7CisJdTE2IFJzdjoxMTsJCS8qIGFsd2F5cyBzZXQgdG8gMCAqLworCXUxNiBJbml0aWF0b3I6MTsJLyogMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudCAqLworCXUxNiBUSUQ6NDsJCS8qIHZhbHVlIG9mIFRDIG9zIFRTICovCit9OwogCi0vLyAyLWJ5dGUgRnJhbWUgY29udHJvbCBmaWVsZAotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIHsKLQlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCi0JVVNIT1JUCQlUeXBlOjI7CQkJCS8vIE1TRFUgdHlwZQotCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQotCVVTSE9SVAkJVG9EczoxOwkJCQkvLyBUbyBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlGckRzOjE7CQkJCS8vIEZyb20gRFMgaW5kaWNhdGlvbgotCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAotCVVTSE9SVAkJUmV0cnk6MTsJCQkvLyBSZXRyeSBzdGF0dXMgYml0Ci0JVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKLQlVU0hPUlQJCU1vcmVEYXRhOjE7CQkJLy8gTW9yZSBkYXRhIGJpdAotCVVTSE9SVAkJV2VwOjE7CQkJCS8vIFdlcCBkYXRhCi0JVVNIT1JUCQlPcmRlcjoxOwkJCS8vIFN0cmljdCBvcmRlciBleHBlY3RlZAotfSBGUkFNRV9DT05UUk9MLCAqUEZSQU1FX0NPTlRST0w7CisvKiAyLWJ5dGUgQkEgUGFyYW1ldGVyIFNldCBmaWVsZCAgaW4gQUREQkEgZnJhbWVzIHRvIHNpZ25hbCBwYXJtIGZvciBzZXR0aW5nIHVwIGEgQkEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfYmFfcGFybSB7CisJdTE2IEFNU0RVU3VwcG9ydGVkOjE7CS8qIDA6IG5vdCBwZXJtaXR0ZWQgICAgICAgICAgICAgMTogcGVybWl0dGVkICovCisJdTE2IEJBUG9saWN5OjE7CS8qIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQSAqLworCXUxNiBUSUQ6NDsJCS8qIHZhbHVlIG9mIFRDIG9zIFRTICovCisJdTE2IEJ1ZlNpemU6MTA7CS8qIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzciAqLworfTsKIAotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9IRUFERVJfODAyXzExCXsKLSAgICBGUkFNRV9DT05UUk9MICAgRkM7Ci0gICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJQWRkcjNbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQJCQlGcmFnOjQ7Ci0JVVNIT1JUCQkJU2VxdWVuY2U6MTI7Ci0JVUNIQVIJCQlPY3RldFswXTsKLX0JSEVBREVSXzgwMl8xMSwgKlBIRUFERVJfODAyXzExOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FXzgwMl8xMSB7Ci0gICAgSEVBREVSXzgwMl8xMSAgIEhkcjsKLSAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOwotfSAgIEZSQU1FXzgwMl8xMSwgKlBGUkFNRV84MDJfMTE7Ci0KLS8vIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01BX0JPRFkgewotICAgIFVDSEFSICAgICAgICAgICAgQ2F0ZWdvcnk7Ci0gICAgVUNIQVIgICAgICAgICAgICBBY3Rpb247Ci0gICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKLX0gICBNQV9CT0RZLCAqUE1BX0JPRFk7Ci0KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8zCXsKLSAgICBVQ0hBUiAgICAgICAgICAgREFBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBTQUFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIE9jdGV0WzJdOwotfQlIRUFERVJfODAyXzMsICpQSEVBREVSXzgwMl8zOwotLy8vL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdAotLy8gMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluIAlERUxCQSBmcmFtZXMgdG8gdGVybWluYXRlIGFuIGFscmVhZHkgc2V0IHVwIGJBCi10eXBlZGVmIHN0cnVjdCBQQUNLRUR7Ci0gICAgVVNIT1JUICAgICAgUnN2OjExOwkvLyBhbHdheXMgc2V0IHRvIDAKLSAgICBVU0hPUlQgICAgICBJbml0aWF0b3I6MTsJLy8gMTogb3JpZ2luYXRvciAgICAwOnJlY2lwaWVudAotICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUwotfSBERUxCQV9QQVJNLCAqUERFTEJBX1BBUk07Ci0KLS8vIDItYnl0ZSBCQSBQYXJhbWV0ZXIgU2V0IGZpZWxkICBpbiBBRERCQSBmcmFtZXMgdG8gc2lnbmFsIHBhcm0gZm9yIHNldHRpbmcgdXAgYSBCQQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKLSAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKLSAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKLX0gQkFfUEFSTSwgKlBCQV9QQVJNOwotCi0vLyAyLWJ5dGUgQkEgU3RhcnRpbmcgU2VxIENPTlRST0wgZmllbGQKLXR5cGVkZWYgdW5pb24gUEFDS0VEIHsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVU0hPUlQgICAgICBGcmFnTnVtOjQ7CS8vIGFsd2F5cyBzZXQgdG8gMAotCVVTSE9SVCAgICAgIFN0YXJ0U2VxOjEyOyAgIC8vIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQKLSAgICB9ICAgZmllbGQ7Ci0gICAgVVNIT1JUICAgICAgICAgICB3b3JkOworLyogMi1ieXRlIEJBIFN0YXJ0aW5nIFNlcSBDT05UUk9MIGZpZWxkICovCit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQkFTRVFfQ09OVFJPTCB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXUxNiBGcmFnTnVtOjQ7CS8qIGFsd2F5cyBzZXQgdG8gMCAqLworCQl1MTYgU3RhcnRTZXE6MTI7CS8qIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgMXN0IE1TRFUgZm9yIHdoaWNoIHRoaXMgQkFSIGlzIHNlbnQgKi8KKwl9IGZpZWxkOworCXUxNiB3b3JkOwogfSBCQVNFUV9DT05UUk9MLCAqUEJBU0VRX0NPTlRST0w7CiAKLS8vQkFDb250cm9sIGFuZCBCQVJDb250cm9sIGFyZSB0aGUgc2FtZQotLy8gMi1ieXRlIEJBIENPTlRST0wgZmllbGQgaW4gQkEgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3Y6OTsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLX0gQkFfQ09OVFJPTCwgKlBCQV9DT05UUk9MOworLypCQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lICovCisvKiAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZSAqLworc3RydWN0IFBBQ0tFRCBydF9iYV9jb250cm9sIHsKKwl1MTYgQUNLUG9saWN5OjE7CS8qIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sgKi8KKwl1MTYgTVRJRDoxOwkJLypFV0MgVjEuMjQgKi8KKwl1MTYgQ29tcHJlc3NlZDoxOworCXUxNiBSc3Y6OTsKKwl1MTYgVElEOjQ7Cit9OwogCi0vLyAyLWJ5dGUgQkFSIENPTlRST0wgZmllbGQgaW4gQkFSIGZyYW1lCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4KLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgUnN2MTo5OwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotfSBCQVJfQ09OVFJPTCwgKlBCQVJfQ09OVFJPTDsKKy8qIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUgKi8KK3N0cnVjdCBQQUNLRUQgcnRfYmFyX2NvbnRyb2wgeworCXUxNiBBQ0tQb2xpY3k6MTsJLyogMDpub3JtYWwgYWNrLCAgMTpubyBhY2suICovCisJdTE2IE1USUQ6MTsJCS8qaWYgdGhpcyBiaXQxLCB1c2UgIHN0cnVjdCBydF9mcmFtZV9tdGJhX3JlcSwgIGlmIDAsIHVzZSBzdHJ1Y3QgcnRfZnJhbWVfYmFfcmVxICovCisJdTE2IENvbXByZXNzZWQ6MTsKKwl1MTYgUnN2MTo5OworCXUxNiBUSUQ6NDsKK307CiAKLS8vIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgTnVtVElEOjQ7Ci19IE1UQkFSX0NPTlRST0wsICpQTVRCQVJfQ09OVFJPTDsKKy8qIEJBUkNvbnRyb2wgaW4gTVRCQVIgZnJhbWUgKi8KK3N0cnVjdCBQQUNLRUQgcnRfbXRiYXJfY29udHJvbCB7CisJdTE2IEFDS1BvbGljeToxOworCXUxNiBNVElEOjE7CisJdTE2IENvbXByZXNzZWQ6MTsKKwl1MTYgUnN2MTo5OworCXUxNiBOdW1USUQ6NDsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgVVNIT1JUICAgICAgUnN2MToxMjsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLX0gUEVSX1RJRF9JTkZPLCAqUFBFUl9USURfSU5GTzsKK3N0cnVjdCBQQUNLRUQgcnRfcGVyX3RpZF9pbmZvIHsKKwl1MTYgUnN2MToxMjsKKwl1MTYgVElEOjQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0JUEVSX1RJRF9JTkZPICAgICAgUGVyVElEOwotCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOwotfSBFQUNIX1RJRCwgKlBFQUNIX1RJRDsKK3N0cnVjdCBydF9lYWNoX3RpZCB7CisJc3RydWN0IHJ0X3Blcl90aWRfaW5mbyBQZXJUSUQ7CisJQkFTRVFfQ09OVFJPTCBCQVN0YXJ0aW5nU2VxOworfTsKIAorLyogQkFSRVEgQU5EIE1UQkFSRVEgaGF2ZSB0aGUgc2FtZSBzdWJ0eXBlIEJBUiwgODAyLjExbiBCQVIgdXNlIGNvbXByZXNzZWQgYml0bWFwLiAqLworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9iYV9yZXEgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJc3RydWN0IHJ0X2Jhcl9jb250cm9sIEJBUkNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCBCQVN0YXJ0aW5nU2VxOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgewotICAgIEZSQU1FX0NPTlRST0wgICBGQzsKLSAgICBVU0hPUlQgICAgICAgICAgQWlkOwotICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOwotfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX210YmFfcmVxIHsKKwlzdHJ1Y3QgcnRfZnJhbWVfY29udHJvbCBGQzsKKwl1MTYgRHVyYXRpb247CisJdTggQWRkcjFbTUFDX0FERFJfTEVOXTsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXN0cnVjdCBydF9tdGJhcl9jb250cm9sIE1UQkFSQ29udHJvbDsKKwlzdHJ1Y3QgcnRfcGVyX3RpZF9pbmZvIFBlclRJREluZm87CisJQkFTRVFfQ09OVFJPTCBCQVN0YXJ0aW5nU2VxOworfTsKIAotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SVFNfRlJBTUUJewotICAgIEZSQU1FX0NPTlRST0wgICBGQzsKLSAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci19UlRTX0ZSQU1FLCAqUFJUU19GUkFNRTsKKy8qIENvbXByZXNzZWQgZm9ybWF0IGlzIG1hbmRhbnRvcnkgaW4gSFQgU1RBICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX210YmEgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJc3RydWN0IHJ0X2JhX2NvbnRyb2wgQkFDb250cm9sOworCUJBU0VRX0NPTlRST0wgQkFTdGFydGluZ1NlcTsKKwl1OCBCaXRNYXBbOF07Cit9OwogCi0vLyBCQVJFUSBBTkQgTVRCQVJFUSBoYXZlIHRoZSBzYW1lIHN1YnR5cGUgQkFSLCA4MDIuMTFuIEJBUiB1c2UgY29tcHJlc3NlZCBiaXRtYXAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBX1JFUSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTCAgQkFSQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MIAkgQkFTdGFydGluZ1NlcTsKLX0gICBGUkFNRV9CQV9SRVEsICpQRlJBTUVfQkFfUkVROworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9wc21wX2FjdGlvbiB7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgSGRyOworCXU4IENhdGVnb3J5OworCXU4IEFjdGlvbjsKKwl1OCBQc21wOwkJLyogNy4zLjEuMjUgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQV9SRVEgewotCUZSQU1FX0NPTlRST0wgICBGQzsKLQlVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0JVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JTVRCQVJfQ09OVFJPTCAgTVRCQVJDb250cm9sOwotCVBFUl9USURfSU5GTwlQZXJUSURJbmZvOwotCUJBU0VRX0NPTlRST0wgCSBCQVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9hY3Rpb25faGRyIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworfTsKIAotLy8gQ29tcHJlc3NlZCBmb3JtYXQgaXMgbWFuZGFudG9yeSBpbiBIVCBTVEEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfTVRCQSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQV9DT05UUk9MICBCQUNvbnRyb2w7Ci0JQkFTRVFfQ09OVFJPTCAJIEJBU3RhcnRpbmdTZXE7Ci0JVUNIQVIJCUJpdE1hcFs4XTsKLX0gICBGUkFNRV9NVEJBLCAqUEZSQU1FX01UQkE7CisvKkFjdGlvbiBGcmFtZSAqLworLypBY3Rpb24gRnJhbWUgIENhdGVnb3J5OlNwZWN0cnVtLCAgQWN0aW9uOkNoYW5uZWwgU3dpdGNoLiA3LjMuMi4yMCAqLworc3RydWN0IFBBQ0tFRCBydF9jaGFuX3N3aXRjaF9hbm5vdW5jZSB7CisJdTggRWxlbWVudElEOwkvKiBJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCA9IDM3ICovCisJdTggTGVuOworCXN0cnVjdCBydF9jaGFfc3dpdGNoX2Fubm91bmNlX2llIENTQW5ub3VuY2VJZTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUFNNUF9BQ1RJT04gewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCVVDSEFSCVBzbXA7CS8vIDcuMy4xLjI1Ci19ICAgRlJBTUVfUFNNUF9BQ1RJT04sICpQRlJBTUVfUFNNUF9BQ1RJT047CisvKjgwMi4xMW4gOiA3LjMuMi4yMGEgKi8KK3N0cnVjdCBQQUNLRUQgcnRfc2Vjb25kX2NoYW5fb2Zmc2V0IHsKKwl1OCBFbGVtZW50SUQ7CS8qIElEID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVCA9IDYyICovCisJdTggTGVuOworCXN0cnVjdCBydF9zZWNfY2hhX29mZnNldF9pZSBTZWNDaE9mZnNldEllOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9BQ1RJT05fSERSIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLX0gICBGUkFNRV9BQ1RJT05fSERSLCAqUEZSQU1FX0FDVElPTl9IRFI7CitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX3NwZXRydW1fY3MgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJc3RydWN0IHJ0X2NoYW5fc3dpdGNoX2Fubm91bmNlIENTQW5ub3VuY2U7CisJc3RydWN0IHJ0X3NlY29uZF9jaGFuX29mZnNldCBTZWNvbmRDaGFubmVsOworfTsKIAotLy9BY3Rpb24gRnJhbWUKLS8vQWN0aW9uIEZyYW1lICBDYXRlZ29yeTpTcGVjdHJ1bSwgIEFjdGlvbjpDaGFubmVsIFN3aXRjaC4gNy4zLjIuMjAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UgewotCVVDSEFSCQkJCQlFbGVtZW50SUQ7CS8vIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcKLQlVQ0hBUgkJCQkJTGVuOwotCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ1NBbm5vdW5jZUllOwotfSAgIENIQU5fU1dJVENIX0FOTk9VTkNFLCAqUENIQU5fU1dJVENIX0FOTk9VTkNFOworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9hZGRiYV9yZXEgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJdTggVG9rZW47CQkvKiAxICovCisJc3RydWN0IHJ0X2JhX3Bhcm0gQmFQYXJtOwkJLyogIDIgLSAxMCAqLworCXUxNiBUaW1lT3V0VmFsdWU7CS8qIDAgLSAwICovCisJQkFTRVFfQ09OVFJPTCBCYVN0YXJ0U2VxOwkvKiAwLTAgKi8KK307CiAKK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfYWRkYmFfcnNwIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXU4IFRva2VuOworCXUxNiBTdGF0dXNDb2RlOworCXN0cnVjdCBydF9iYV9wYXJtIEJhUGFybTsJCS8qMCAtIDIgKi8KKwl1MTYgVGltZU91dFZhbHVlOworfTsKIAotLy84MDIuMTFuIDogNy4zLjIuMjBhCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1NFQ09ORF9DSEFOX09GRlNFVCB7Ci0JVUNIQVIJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUID0gNjIKLQlVQ0hBUgkJCQlMZW47Ci0JU0VDX0NIQV9PRkZTRVRfSUUJU2VjQ2hPZmZzZXRJZTsKLX0gICBTRUNPTkRfQ0hBTl9PRkZTRVQsICpQU0VDT05EX0NIQU5fT0ZGU0VUOworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9kZWxiYV9yZXEgeworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjsKKwl1OCBDYXRlZ29yeTsKKwl1OCBBY3Rpb247CisJc3RydWN0IHJ0X2RlbGJhX3Bhcm0gRGVsYmFQYXJtOworCXUxNiBSZWFzb25Db2RlOworfTsKIAorLyo3LjIuMS43ICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2ZyYW1lX2JhciB7CisJc3RydWN0IHJ0X2ZyYW1lX2NvbnRyb2wgRkM7CisJdTE2IER1cmF0aW9uOworCXU4IEFkZHIxW01BQ19BRERSX0xFTl07CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlzdHJ1Y3QgcnRfYmFyX2NvbnRyb2wgQmFyQ29udHJvbDsKKwlCQVNFUV9DT05UUk9MIFN0YXJ0aW5nU2VxOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9TUEVUUlVNX0NTIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlDSEFOX1NXSVRDSF9BTk5PVU5DRQlDU0Fubm91bmNlOwotCVNFQ09ORF9DSEFOX09GRlNFVAkJU2Vjb25kQ2hhbm5lbDsKLX0gICBGUkFNRV9TUEVUUlVNX0NTLCAqUEZSQU1FX1NQRVRSVU1fQ1M7CisvKjcuMi4xLjcgKi8KK3N0cnVjdCBQQUNLRUQgcnRfZnJhbWVfYmEgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJc3RydWN0IHJ0X2Jhcl9jb250cm9sIEJhckNvbnRyb2w7CisJQkFTRVFfQ09OVFJPTCBTdGFydGluZ1NlcTsKKwl1OCBiaXRtYXNrWzhdOworfTsKIAorLyogUmFkaW8gTWVhc3VlbWVudCBSZXF1ZXN0IEZyYW1lIEZvcm1hdCAqLworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9ybV9yZXFfYWN0aW9uIHsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI7CisJdTggQ2F0ZWdvcnk7CisJdTggQWN0aW9uOworCXU4IFRva2VuOworCXUxNiBSZXBldGl0aW9uOworCXU4IGRhdGFbMF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47CS8vIDEKLQlCQV9QQVJNCQlCYVBhcm07CSAgICAgIC8vICAyIC0gMTAKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsJLy8gMCAtIDAKLQlCQVNFUV9DT05UUk9MCUJhU3RhcnRTZXE7IC8vIDAtMAotfSAgIEZSQU1FX0FEREJBX1JFUSwgKlBGUkFNRV9BRERCQV9SRVE7CitzdHJ1Y3QgUEFDS0VEIHJ0X2h0X2V4dF9jaGFubmVsX3N3aXRjaF9hbm5vdW5jZW1lbnRfaWUgeworCXU4IElEOworCXU4IExlbmd0aDsKKwl1OCBDaGFubmVsU3dpdGNoTW9kZTsKKwl1OCBOZXdSZWdDbGFzczsKKwl1OCBOZXdDaGFubmVsTnVtOworCXU4IENoYW5uZWxTd2l0Y2hDb3VudDsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUlNQIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsKLQlVU0hPUlQJU3RhdHVzQ29kZTsKLQlCQV9QQVJNCQlCYVBhcm07IC8vMCAtIDIKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKLX0gICBGUkFNRV9BRERCQV9SU1AsICpQRlJBTUVfQUREQkFfUlNQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0RFTEJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JREVMQkFfUEFSTQkJRGVsYmFQYXJtOwotCVVTSE9SVAlSZWFzb25Db2RlOwotfSAgIEZSQU1FX0RFTEJBX1JFUSwgKlBGUkFNRV9ERUxCQV9SRVE7Ci0KLQotLy83LjIuMS43Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBUiB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX0JBUiwgKlBGUkFNRV9CQVI7Ci0KLS8vNy4yLjEuNwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotCVVDSEFSCQliaXRtYXNrWzhdOwotfSAgIEZSQU1FX0JBLCAqUEZSQU1FX0JBOwotCi0KLS8vIFJhZGlvIE1lYXN1ZW1lbnQgUmVxdWVzdCBGcmFtZSBGb3JtYXQKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUk1fUkVRX0FDVElPTiB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47Ci0JVVNIT1JUCVJlcGV0aXRpb247Ci0JVUNIQVIgICBkYXRhWzBdOwotfSAgIEZSQU1FX1JNX1JFUV9BQ1RJT04sICpQRlJBTUVfUk1fUkVRX0FDVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUgkJSUQ7Ci0JVUNIQVIJCUxlbmd0aDsKLQlVQ0hBUgkJQ2hhbm5lbFN3aXRjaE1vZGU7Ci0JVUNIQVIJCU5ld1JlZ0NsYXNzOwotCVVDSEFSCQlOZXdDaGFubmVsTnVtOwotCVVDSEFSCQlDaGFubmVsU3dpdGNoQ291bnQ7Ci19IEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUsICpQSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRTsKLQotCi0vLwotLy8gX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxCi0vLyBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQKLS8vCisvKiAqLworLyogX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxICovCisvKiBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQgKi8KKy8qICovCiAjZGVmaW5lIFNFUV9TVEVQT05FKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExID09ICgoX1NFUTIrMSkgJiBfTGltaXQpKSkKICNkZWZpbmUgU0VRX1NNQUxMRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpCiAjZGVmaW5lIFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgIT0gX1NFUTIpICYmICEoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKSkKICNkZWZpbmUgU0VRX1dJVEhJTl9XSU4oX1NFUTEsIF9TRVEyLCBfV0lOLCBfTGltaXQpIChTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KSAmJiAgXAogCQkJCQkJCQkJCQkJU0VRX1NNQUxMRVIoX1NFUTEsICgoX1NFUTIrX1dJTisxKSZfTGltaXQpLCBfTGltaXQpKQogCi0vLwotLy8gQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKQotLy8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVUNIQVIgICAgICAgQ2ZwQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgIENmcER1clJlbWFpbmluZzsKLX0gQ0ZfUEFSTSwgKlBDRl9QQVJNOworLyogKi8KKy8qIENvbnRlbnRpb24tZnJlZSBwYXJhbWV0ZXIgKHdpdGhvdXQgSUQgYW5kIExlbmd0aCkgKi8KKy8qICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2NmX3Bhcm0geworCUJPT0xFQU4gYlZhbGlkOwkJLyogMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUgKi8KKwl1OCBDZnBDb3VudDsKKwl1OCBDZnBQZXJpb2Q7CisJdTE2IENmcE1heER1cmF0aW9uOworCXUxNiBDZnBEdXJSZW1haW5pbmc7Cit9OwogCi10eXBlZGVmCXN0cnVjdAlfQ0lQSEVSX1NVSVRFCXsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyOwkJLy8gVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyQXV4OwkvLyBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyOwkvLyBHcm91cCBjaXBoZXIKLQlVU0hPUlQJCQkJCQkJUnNuQ2FwYWJpbGl0eTsJLy8gUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24KLQlCT09MRUFOCQkJCQkJCWJNaXhNb2RlOwkJLy8gSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQKLX0JQ0lQSEVSX1NVSVRFLCAqUENJUEhFUl9TVUlURTsKK3N0cnVjdCBydF9jaXBoZXJfc3VpdGUgeworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIFBhaXJDaXBoZXI7CS8qIFVuaWNhc3QgY2lwaGVyIDEsIHRoaXMgb25lIGhhcyBtb3JlIHNlY3VyZWQgY2lwaGVyIHN1aXRlICovCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgUGFpckNpcGhlckF1eDsJLyogVW5pY2FzdCBjaXBoZXIgMiBpZiBBUCBhbm5vdW5jZSB0d28gdW5pY2FzdCBjaXBoZXIgc3VpdGUgKi8KKwlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUyBHcm91cENpcGhlcjsJLyogR3JvdXAgY2lwaGVyICovCisJdTE2IFJzbkNhcGFiaWxpdHk7CS8qIFJTTiBjYXBhYmlsaXR5IGZyb20gYmVhY29uICovCisJQk9PTEVBTiBiTWl4TW9kZTsJLyogSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQgKi8KK307CiAKLS8vIEVEQ0EgY29uZmlndXJhdGlvbiBmcm9tIEFQJ3MgQkVBQ09OL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYkFkZDsgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQotICAgIEJPT0xFQU4gICAgIGJRQWNrOwotICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OwotICAgIEJPT0xFQU4gICAgIGJBUFNEQ2FwYWJsZTsKLS8vICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7Ci0gICAgVUNIQVIgICAgICAgRWRjYVVwZGF0ZUNvdW50OwotICAgIFVDSEFSICAgICAgIEFpZnNuWzRdOyAgICAgICAvLyAwOkFDX0JLLCAxOkFDX0JFLCAyOkFDX1ZJLCAzOkFDX1ZPCi0gICAgVUNIQVIgICAgICAgQ3dtaW5bNF07Ci0gICAgVUNIQVIgICAgICAgQ3dtYXhbNF07Ci0gICAgVVNIT1JUICAgICAgVHhvcFs0XTsgICAgICAvLyBpbiB1bml0IG9mIDMyLXVzCi0gICAgQk9PTEVBTiAgICAgYkFDTVs0XTsgICAgICAvLyAxOiBBZG1pc3Npb24gQ29udHJvbCBvZiBBQ19CSyBpcyBtYW5kYXR0b3J5Ci19IEVEQ0FfUEFSTSwgKlBFRENBX1BBUk07CisvKiBFRENBIGNvbmZpZ3VyYXRpb24gZnJvbSBBUCdzIEJFQUNPTi9Qcm9iZVJzcCAqLworc3RydWN0IHJ0X2VkY2FfcGFybSB7CisJQk9PTEVBTiBiVmFsaWQ7CQkvKiAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZSAqLworCUJPT0xFQU4gYkFkZDsJCS8qIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlICovCisJQk9PTEVBTiBiUUFjazsKKwlCT09MRUFOIGJRdWV1ZVJlcXVlc3Q7CisJQk9PTEVBTiBiVHhvcFJlcXVlc3Q7CisJQk9PTEVBTiBiQVBTRENhcGFibGU7CisvKiAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOyAqLworCXU4IEVkY2FVcGRhdGVDb3VudDsKKwl1OCBBaWZzbls0XTsJCS8qIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8gKi8KKwl1OCBDd21pbls0XTsKKwl1OCBDd21heFs0XTsKKwl1MTYgVHhvcFs0XTsJCS8qIGluIHVuaXQgb2YgMzItdXMgKi8KKwlCT09MRUFOIGJBQ01bNF07CS8qIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkgKi8KK307CiAKLS8vIFFCU1MgTE9BRCBpbmZvcm1hdGlvbiBmcm9tIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQotICAgIFVTSE9SVCAgICAgIFN0YU51bTsKLSAgICBVQ0hBUiAgICAgICBDaGFubmVsVXRpbGl6YXRpb247Ci0gICAgVVNIT1JUICAgICAgUmVtYWluaW5nQWRtaXNzaW9uQ29udHJvbDsgIC8vIGluIHVuaXQgb2YgMzItdXMKLX0gUUJTU19MT0FEX1BBUk0sICpQUUJTU19MT0FEX1BBUk07CisvKiBRQlNTIExPQUQgaW5mb3JtYXRpb24gZnJvbSBRQVAncyBCRUFDT04vUHJvYmVSc3AgKi8KK3N0cnVjdCBydF9xYnNzX2xvYWRfcGFybSB7CisJQk9PTEVBTiBiVmFsaWQ7CQkvKiAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZSAqLworCXUxNiBTdGFOdW07CisJdTggQ2hhbm5lbFV0aWxpemF0aW9uOworCXUxNiBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOwkvKiBpbiB1bml0IG9mIDMyLXVzICovCit9OwogCi0vLyBRQlNTIEluZm8gZmllbGQgaW4gUVNUQSdzIGFzc29jIHJlcQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVQ0hBUgkJVUFQU0RfQUNfVk86MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKLQlVQ0hBUgkJUnN2MToxOwotCVVDSEFSCQlNYXhTUExlbmd0aDoyOwotCVVDSEFSCQlSc3YyOjE7Ci19IFFCU1NfU1RBX0lORk9fUEFSTSwgKlBRQlNTX1NUQV9JTkZPX1BBUk07CisvKiBRQlNTIEluZm8gZmllbGQgaW4gUVNUQSdzIGFzc29jIHJlcSAqLworc3RydWN0IFBBQ0tFRCBydF9xYnNzX3N0YV9pbmZvX3Bhcm0geworCXU4IFVBUFNEX0FDX1ZPOjE7CisJdTggVUFQU0RfQUNfVkk6MTsKKwl1OCBVQVBTRF9BQ19CSzoxOworCXU4IFVBUFNEX0FDX0JFOjE7CisJdTggUnN2MToxOworCXU4IE1heFNQTGVuZ3RoOjI7CisJdTggUnN2MjoxOworfTsKIAotLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFBUCdzIEJlYWNvbi9Qcm9iZVJzcAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotCVVDSEFSCQlSc3Y6MzsKLQlVQ0hBUgkJVUFQU0Q6MTsKLX0gUUJTU19BUF9JTkZPX1BBUk0sICpQUUJTU19BUF9JTkZPX1BBUk07CisvKiBRQlNTIEluZm8gZmllbGQgaW4gUUFQJ3MgQmVhY29uL1Byb2JlUnNwICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3Fic3NfYXBfaW5mb19wYXJtIHsKKwl1OCBQYXJhbVNldENvdW50OjQ7CisJdTggUnN2OjM7CisJdTggVUFQU0Q6MTsKK307CiAKLS8vIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcAotLy8gUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJPT0xFQU4gICAgIGJWYWxpZDsgICAgICAgICAgICAgICAgICAgICAvLyAxOiB2YXJpYWJsZSBjb250YWlucyB2YWxpZCB2YWx1ZQotICAgIEJPT0xFQU4gICAgIGJRQWNrOwotICAgIEJPT0xFQU4gICAgIGJRdWV1ZVJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYlR4b3BSZXF1ZXN0OwotLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKLSAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Ci19IFFPU19DQVBBQklMSVRZX1BBUk0sICpQUU9TX0NBUEFCSUxJVFlfUEFSTTsKKy8qIFFPUyBDYXBhYmlsaXR5IHJlcG9ydGVkIGluIFFBUCdzIEJFQUNPTi9Qcm9iZVJzcCAqLworLyogUU9TIENhcGFiaWxpdHkgc2VudCBvdXQgaW4gUVNUQSdzIEFzc29jaWF0ZVJlcS9SZUFzc29jaWF0ZVJlcSAqLworc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0geworCUJPT0xFQU4gYlZhbGlkOwkJLyogMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUgKi8KKwlCT09MRUFOIGJRQWNrOworCUJPT0xFQU4gYlF1ZXVlUmVxdWVzdDsKKwlCT09MRUFOIGJUeG9wUmVxdWVzdDsKKy8qICBCT09MRUFOICAgICBiTW9yZURhdGFBY2s7ICovCisJdTggRWRjYVVwZGF0ZUNvdW50OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgIElFTGVuOwotICAgIFVDSEFSICAgICAgIElFW01BWF9DVVNUT01fTEVOXTsKLX0gV1BBX0lFXzsKK3N0cnVjdCBydF93cGFfaWUgeworCXU4IElFTGVuOworCXU4IElFW01BWF9DVVNUT01fTEVOXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVQ0hBUiAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICBDaGFubmVsOwotCVVDSEFSICAgQ2VudHJhbENoYW5uZWw7CS8vU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4KLSAgICBVQ0hBUiAgIEJzc1R5cGU7Ci0gICAgVVNIT1JUICBBdGltV2luOwotICAgIFVTSE9SVCAgQmVhY29uUGVyaW9kOworc3RydWN0IHJ0X2Jzc19lbnRyeSB7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXTsKKwl1OCBDaGFubmVsOworCXU4IENlbnRyYWxDaGFubmVsOwkvKlN0b3JlIHRoZSB3aWRlLWJhbmQgY2VudHJhbCBjaGFubmVsIGZvciA0ME1Iei4gIC51c2VkIGluIDQwTUh6IEFQLiBPciB0aGlzIGlzIHRoZSBzYW1lIGFzIENoYW5uZWwuICovCisJdTggQnNzVHlwZTsKKwl1MTYgQXRpbVdpbjsKKwl1MTYgQmVhY29uUGVyaW9kOwogCi0gICAgVUNIQVIgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIFN1cFJhdGVMZW47Ci0gICAgVUNIQVIgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHk7Ci0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JQUREX0hUX0lORk9fSUUgQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQ7Ci0JQ0hBUiAgICBSc3NpOwotICAgIFVDSEFSICAgUHJpdmFjeTsJCQkvLyBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuCi0JVUNIQVIJSGlkZGVuOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW47CisJdTggRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggRXh0UmF0ZUxlbjsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJdTggSHRDYXBhYmlsaXR5TGVuOworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIdEluZm87CS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCXU4IEFkZEh0SW5mb0xlbjsKKwl1OCBOZXdFeHRDaGFuT2Zmc2V0OworCWNoYXIgUnNzaTsKKwl1OCBQcml2YWN5OwkJLyogSW5kaWNhdGUgc2VjdXJpdHkgZnVuY3Rpb24gT04vT0ZGLiBEb24ndCBtZXNzIHVwIHdpdGggYXV0aCBtb2RlLiAqLworCXU4IEhpZGRlbjsKIAotICAgIFVTSE9SVCAgRHRpbVBlcmlvZDsKLSAgICBVU0hPUlQgIENhcGFiaWxpdHlJbmZvOworCXUxNiBEdGltUGVyaW9kOworCXUxNiBDYXBhYmlsaXR5SW5mbzsKIAotICAgIFVTSE9SVCAgQ2ZwQ291bnQ7Ci0gICAgVVNIT1JUICBDZnBQZXJpb2Q7Ci0gICAgVVNIT1JUICBDZnBNYXhEdXJhdGlvbjsKLSAgICBVU0hPUlQgIENmcER1clJlbWFpbmluZzsKLSAgICBVQ0hBUiAgIFNzaWRMZW47Ci0gICAgQ0hBUiAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTE2IENmcENvdW50OworCXUxNiBDZnBQZXJpb2Q7CisJdTE2IENmcE1heER1cmF0aW9uOworCXUxNiBDZnBEdXJSZW1haW5pbmc7CisJdTggU3NpZExlbjsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKIAotICAgIFVMT05HICAgTGFzdEJlYWNvblJ4VGltZTsgLy8gT1MncyB0aW1lc3RhbXAKKwl1bnNpZ25lZCBsb25nIExhc3RCZWFjb25SeFRpbWU7CS8qIE9TJ3MgdGltZXN0YW1wICovCiAKLQlCT09MRUFOCWJTRVM7CisJQk9PTEVBTiBiU0VTOwogCi0JLy8gTmV3IGZvciBXUEEyCi0JQ0lQSEVSX1NVSVRFCQkJCQlXUEE7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUKLQlDSVBIRVJfU1VJVEUJCQkJCVdQQTI7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQTIgY2lwaGVyIHN1aXRlCisJLyogTmV3IGZvciBXUEEyICovCisJc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZSBXUEE7CS8qIEFQIGFubm91bmNlZCBXUEEgY2lwaGVyIHN1aXRlICovCisJc3RydWN0IHJ0X2NpcGhlcl9zdWl0ZSBXUEEyOwkvKiBBUCBhbm5vdW5jZWQgV1BBMiBjaXBoZXIgc3VpdGUgKi8KIAotCS8vIE5ldyBmb3IgbWljcm9zb2Z0IFdQQSBzdXBwb3J0Ci0JTkRJU184MDJfMTFfRklYRURfSUVzCUZpeElFczsKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlQXV4OwkvLyBBZGRpdGlvbiBtb2RlIGZvciBXUEEyIC8gV1BBIGNhcGFibGUgQVAKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCUF1dGhNb2RlOwotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMJV2VwU3RhdHVzOwkJCQkvLyBVbmljYXN0IEVuY3J5cHRpb24gQWxnb3JpdGhtIGV4dHJhY3QgZnJvbSBWQVJfSUUKLQlVU0hPUlQJCQkJCVZhcklFTGVuOwkJCQkvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKLQlVQ0hBUgkJCQkJVmFySUVzW01BWF9WSUVfTEVOXTsKKwkvKiBOZXcgZm9yIG1pY3Jvc29mdCBXUEEgc3VwcG9ydCAqLworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9maXhlZF9pZXMgRml4SUVzOworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVBdXg7CS8qIEFkZGl0aW9uIG1vZGUgZm9yIFdQQTIgLyBXUEEgY2FwYWJsZSBBUCAqLworCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGU7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyBXZXBTdGF0dXM7CS8qIFVuaWNhc3QgRW5jcnlwdGlvbiBBbGdvcml0aG0gZXh0cmFjdCBmcm9tIFZBUl9JRSAqLworCXUxNiBWYXJJRUxlbjsJLyogTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoICovCisJdTggVmFySUVzW01BWF9WSUVfTEVOXTsKIAotCS8vIENDWCBDa2lwIGluZm9ybWF0aW9uCi0gICAgVUNIQVIgICBDa2lwRmxhZzsKKwkvKiBDQ1ggQ2tpcCBpbmZvcm1hdGlvbiAqLworCXU4IENraXBGbGFnOwogCi0JLy8gQ0NYIDIgVFNGCi0JVUNIQVIJUFRTRls0XTsJCS8vIFBhcmVudCBUU0YKLQlVQ0hBUglUVFNGWzhdOwkJLy8gVGFyZ2V0IFRTRgorCS8qIENDWCAyIFRTRiAqLworCXU4IFBUU0ZbNF07CQkvKiBQYXJlbnQgVFNGICovCisJdTggVFRTRls4XTsJCS8qIFRhcmdldCBUU0YgKi8KIAotICAgIC8vIDgwMi4xMWUgZDksIGFuZCBXTU0KLQlFRENBX1BBUk0gICAgICAgICAgIEVkY2FQYXJtOwotCVFPU19DQVBBQklMSVRZX1BBUk0gUW9zQ2FwYWJpbGl0eTsKLQlRQlNTX0xPQURfUEFSTSAgICAgIFFic3NMb2FkOwotICAgIFdQQV9JRV8gICAgIFdwYUlFOwotICAgIFdQQV9JRV8gICAgIFJzbklFOwotfSBCU1NfRU5UUlksICpQQlNTX0VOVFJZOworCS8qIDgwMi4xMWUgZDksIGFuZCBXTU0gKi8KKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEVkY2FQYXJtOworCXN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtIFFvc0NhcGFiaWxpdHk7CisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIFFic3NMb2FkOworCXN0cnVjdCBydF93cGFfaWUgV3BhSUU7CisJc3RydWN0IHJ0X3dwYV9pZSBSc25JRTsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzTnI7Ci0gICAgVUNIQVIgICAgICAgICAgIEJzc092ZXJsYXBOcjsKLSAgICBCU1NfRU5UUlkgICAgICAgQnNzRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOwotfSBCU1NfVEFCTEUsICpQQlNTX1RBQkxFOworc3RydWN0IHJ0X2Jzc190YWJsZSB7CisJdTggQnNzTnI7CisJdTggQnNzT3ZlcmxhcE5yOworCXN0cnVjdCBydF9ic3NfZW50cnkgQnNzRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfTsKIAorc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSB7CisJdW5zaWduZWQgbG9uZyBNYWNoaW5lOworCXVuc2lnbmVkIGxvbmcgTXNnVHlwZTsKKwl1bnNpZ25lZCBsb25nIE1zZ0xlbjsKKwl1OCBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOworCXU4IFJzc2kwOworCXU4IFJzc2kxOworCXU4IFJzc2kyOworCXU4IFNpZ25hbDsKKwl1OCBDaGFubmVsOworCXU4IFdjaWQ7CisJQk9PTEVBTiBPY2N1cGllZDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX1FVRVVFX0VMRU0gewotICAgIFVMT05HICAgICAgICAgICAgIE1hY2hpbmU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTXNnVHlwZTsKLSAgICBVTE9ORyAgICAgICAgICAgICBNc2dMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgTXNnW01HTVRfRE1BX0JVRkZFUl9TSVpFXTsKLSAgICBMQVJHRV9JTlRFR0VSICAgICBUaW1lU3RhbXA7Ci0gICAgVUNIQVIgICAgICAgICAgICAgUnNzaTA7Ci0gICAgVUNIQVIgICAgICAgICAgICAgUnNzaTE7Ci0gICAgVUNIQVIgICAgICAgICAgICAgUnNzaTI7Ci0gICAgVUNIQVIgICAgICAgICAgICAgU2lnbmFsOwotICAgIFVDSEFSICAgICAgICAgICAgIENoYW5uZWw7Ci0gICAgVUNIQVIgICAgICAgICAgICAgV2NpZDsKLSAgICBCT09MRUFOICAgICAgICAgICBPY2N1cGllZDsKLX0gTUxNRV9RVUVVRV9FTEVNLCAqUE1MTUVfUVVFVUVfRUxFTTsKK3N0cnVjdCBydF9tbG1lX3F1ZXVlIHsKKwl1bnNpZ25lZCBsb25nIE51bTsKKwl1bnNpZ25lZCBsb25nIEhlYWQ7CisJdW5zaWduZWQgbG9uZyBUYWlsOworCXNwaW5sb2NrX3QgTG9jazsKKwlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtIEVudHJ5W01BWF9MRU5fT0ZfTUxNRV9RVUVVRV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTnVtOwotICAgIFVMT05HICAgICAgICAgICAgIEhlYWQ7Ci0gICAgVUxPTkcgICAgICAgICAgICAgVGFpbDsKLSAgICBORElTX1NQSU5fTE9DSyAgIExvY2s7Ci0gICAgTUxNRV9RVUVVRV9FTEVNICBFbnRyeVtNQVhfTEVOX09GX01MTUVfUVVFVUVdOwotfSBNTE1FX1FVRVVFLCAqUE1MTUVfUVVFVUU7Cit0eXBlZGVmIHZvaWQoKlNUQVRFX01BQ0hJTkVfRlVOQykgKHZvaWQgKiBBZGFwdG9yLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotdHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgeworCXVuc2lnbmVkIGxvbmcgQmFzZTsKKwl1bnNpZ25lZCBsb25nIE5yU3RhdGU7CisJdW5zaWduZWQgbG9uZyBOck1zZzsKKwl1bnNpZ25lZCBsb25nIEN1cnJTdGF0ZTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgKlRyYW5zRnVuYzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9TVEFURV9NQUNISU5FIHsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOclN0YXRlOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJNc2c7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyU3RhdGU7Ci0gICAgU1RBVEVfTUFDSElORV9GVU5DICAgICAgICAgICAgICpUcmFuc0Z1bmM7Ci19IFNUQVRFX01BQ0hJTkUsICpQU1RBVEVfTUFDSElORTsKKy8qIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZCB0ZW1wb3JhcmxpeSBzZXR0aW5ncyBkdXJpbmcgYSBjb25uZWN0aW9uIGF0dGVtcHQuICovCisvKiBPbmNlIHRoaXMgYXR0ZW1wIHN1Y2NlZWRzLCBhbGwgc2V0dGluZ3Mgd2lsbCBiZSBjb3B5IHRvIHBBZC0+U3RhQWN0aXZlLiAqLworLyogQSBjb25uZWN0aW9uIGF0dGVtcHQgKHVzZXIgc2V0IE9JRCwgcm9hbWluZywgQ0NYIGZhc3Qgcm9hbWluZywuLikgY29uc2lzdHMgb2YgKi8KKy8qIHNldmVyYWwgc3RlcHMgKEpPSU4sIEFVVEgsIEFTU09DIG9yIFJFQVNTT0MpIGFuZCBtYXkgZmFpbCBhdCBhbnkgc3RlcC4gV2UgcHVycG9zZWx5ICovCisvKiBzZXBhcmF0ZSB0aGlzIHVuZGVyLXRyaWFsIHNldHRpbmdzIGF3YXkgZnJvbSBwQWQtPlN0YUFjdGl2ZSBzbyB0aGF0IG9uY2UgKi8KKy8qIHRoaXMgbmV3IGF0dGVtcHQgZmFpbGVkLCBkcml2ZXIgY2FuIGF1dG8tcmVjb3ZlciBiYWNrIHRvIHRoZSBhY3RpdmUgc2V0dGluZ3MuICovCitzdHJ1Y3QgcnRfbWxtZV9hdXggeworCXU4IEJzc1R5cGU7CisJdTggU3NpZFtNQVhfTEVOX09GX1NTSURdOworCXU4IFNzaWRMZW47CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXTsKKwl1OCBBdXRvUmVjb25uZWN0U3NpZFtNQVhfTEVOX09GX1NTSURdOworCXU4IEF1dG9SZWNvbm5lY3RTc2lkTGVuOworCXUxNiBBbGc7CisJdTggU2NhblR5cGU7CisJdTggQ2hhbm5lbDsKKwl1OCBDZW50cmFsQ2hhbm5lbDsKKwl1MTYgQWlkOworCXUxNiBDYXBhYmlsaXR5SW5mbzsKKwl1MTYgQmVhY29uUGVyaW9kOworCXUxNiBDZnBNYXhEdXJhdGlvbjsKKwl1MTYgQ2ZwUGVyaW9kOworCXUxNiBBdGltV2luOwogCisJLyogQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggKi8KKwkvKiBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4gKi8KKwl1OCBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuOworCXU4IEV4dFJhdGVMZW47CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgSHRDYXBhYmlsaXR5OworCXU4IEh0Q2FwYWJpbGl0eUxlbjsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSHRJbmZvOwkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwl1OCBOZXdFeHRDaGFubmVsT2Zmc2V0OworCS8qc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgICAgICBTdXBwb3J0ZWRIdFBoeTsgKi8KIAotLy8gTUxNRSBBVVggZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkIHRlbXBvcmFybGl5IHNldHRpbmdzIGR1cmluZyBhIGNvbm5lY3Rpb24gYXR0ZW1wdC4KLS8vIE9uY2UgdGhpcyBhdHRlbXAgc3VjY2VlZHMsIGFsbCBzZXR0aW5ncyB3aWxsIGJlIGNvcHkgdG8gcEFkLT5TdGFBY3RpdmUuCi0vLyBBIGNvbm5lY3Rpb24gYXR0ZW1wdCAodXNlciBzZXQgT0lELCByb2FtaW5nLCBDQ1ggZmFzdCByb2FtaW5nLC4uKSBjb25zaXN0cyBvZgotLy8gc2V2ZXJhbCBzdGVwcyAoSk9JTiwgQVVUSCwgQVNTT0Mgb3IgUkVBU1NPQykgYW5kIG1heSBmYWlsIGF0IGFueSBzdGVwLiBXZSBwdXJwb3NlbHkKLS8vIHNlcGFyYXRlIHRoaXMgdW5kZXItdHJpYWwgc2V0dGluZ3MgYXdheSBmcm9tIHBBZC0+U3RhQWN0aXZlIHNvIHRoYXQgb25jZQotLy8gdGhpcyBuZXcgYXR0ZW1wdCBmYWlsZWQsIGRyaXZlciBjYW4gYXV0by1yZWNvdmVyIGJhY2sgdG8gdGhlIGFjdGl2ZSBzZXR0aW5ncy4KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FVWCB7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBCc3NUeXBlOwotICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgU3NpZExlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVQ0hBUgkJCQlBdXRvUmVjb25uZWN0U3NpZExlbjsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEFsZzsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNjYW5UeXBlOwotICAgIFVDSEFSICAgICAgICAgICAgICAgQ2hhbm5lbDsKLQlVQ0hBUiAgICAgICAgICAgICAgIENlbnRyYWxDaGFubmVsOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQWlkOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBDZnBNYXhEdXJhdGlvbjsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIENmcFBlcmlvZDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEF0aW1XaW47CisJLyogbmV3IGZvciBRT1MgKi8KKwlzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSBBUFFvc0NhcGFiaWxpdHk7CS8qIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAgKi8KKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEFQRWRjYVBhcm07CS8qIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQICovCisJc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtIEFQUWJzc0xvYWQ7CS8qIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQICovCiAKLQkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAotCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgotCVVDSEFSCQkgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgICAgICAgIFN1cFJhdGVMZW47Ci0JVUNIQVIJCSAgICAgICAgRXh0UmF0ZUxlbjsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JVUNIQVIJCSAgICAgICAgCUh0Q2FwYWJpbGl0eUxlbjsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OworCS8qIG5ldyB0byBrZWVwIFJhbGluayBzcGVjaWZpYyBmZWF0dXJlICovCisJdW5zaWduZWQgbG9uZyBBUFJhbGlua0llOwogCi0gICAgLy8gbmV3IGZvciBRT1MKLSAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAorCXN0cnVjdCBydF9ic3NfdGFibGUgU3NpZEJzc1RhYjsJLyogQVAgbGlzdCBmb3IgdGhlIHNhbWUgU1NJRCAqLworCXN0cnVjdCBydF9ic3NfdGFibGUgUm9hbVRhYjsJLyogQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZyAqLworCXVuc2lnbmVkIGxvbmcgQnNzSWR4OworCXVuc2lnbmVkIGxvbmcgUm9hbUlkeDsKIAotICAgIC8vIG5ldyB0byBrZWVwIFJhbGluayBzcGVjaWZpYyBmZWF0dXJlCi0gICAgVUxPTkcgICAgICAgICAgICAgICBBUFJhbGlua0llOworCUJPT0xFQU4gQ3VyclJlcUlzRnJvbU5kaXM7CiAKLSAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECi0gICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZwotICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OwotICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBBdXRoVGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Cit9OwogCi0JQk9PTEVBTgkJCQlDdXJyUmVxSXNGcm9tTmRpczsKK3N0cnVjdCBydF9tbG1lX2FkZGJhX3JlcSB7CisJdTggV2NpZDsJCS8qICovCisJdTggcEFkZHJbTUFDX0FERFJfTEVOXTsKKwl1OCBCYUJ1ZlNpemU7CisJdTE2IFRpbWVPdXRWYWx1ZTsKKwl1OCBUSUQ7CisJdTggVG9rZW47CisJdTE2IEJhU3RhcnRTZXE7Cit9OwogCi0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBCZWFjb25UaW1lciwgU2NhblRpbWVyOwotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgQXV0aFRpbWVyOwotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgQXNzb2NUaW1lciwgUmVhc3NvY1RpbWVyLCBEaXNhc3NvY1RpbWVyOwotfSBNTE1FX0FVWCwgKlBNTE1FX0FVWDsKK3N0cnVjdCBydF9tbG1lX2RlbGJhX3JlcSB7CisJdTggV2NpZDsJCS8qICovCisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXU4IFRJRDsKKwl1OCBJbml0aWF0b3I7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BRERCQV9SRVFfU1RSVUNUewotCVVDSEFSICAgV2NpZDsJLy8KLQlVQ0hBUiAgIHBBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBCYUJ1ZlNpemU7Ci0JVVNIT1JUCVRpbWVPdXRWYWx1ZTsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUiAgIFRva2VuOwotCVVTSE9SVAlCYVN0YXJ0U2VxOwotfSBNTE1FX0FEREJBX1JFUV9TVFJVQ1QsICpQTUxNRV9BRERCQV9SRVFfU1RSVUNUOworLyogYXNzb2Mgc3RydWN0IGlzIGVxdWFsIHRvIHJlYXNzb2MgKi8KK3N0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSB7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXUxNiBDYXBhYmlsaXR5SW5mbzsKKwl1MTYgTGlzdGVuSW50djsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7Cit9OwogCitzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgeworCXU4IEFkZHJbTUFDX0FERFJfTEVOXTsKKwl1MTYgUmVhc29uOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVMQkFfUkVRX1NUUlVDVHsKLQlVQ0hBUiAgIFdjaWQ7CS8vCi0JVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUglJbml0aWF0b3I7Ci19IE1MTUVfREVMQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0RFTEJBX1JFUV9TVFJVQ1Q7CitzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSB7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXUxNiBBbGc7CisJdW5zaWduZWQgbG9uZyBUaW1lb3V0OworfTsKIAotLy8gYXNzb2Mgc3RydWN0IGlzIGVxdWFsIHRvIHJlYXNzb2MKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FTU09DX1JFUV9TVFJVQ1R7Ci0gICAgVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgQ2FwYWJpbGl0eUluZm87Ci0gICAgVVNIT1JUICAgIExpc3RlbkludHY7Ci0gICAgVUxPTkcgICAgIFRpbWVvdXQ7Ci19IE1MTUVfQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsIE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfUkVBU1NPQ19SRVFfU1RSVUNUOworc3RydWN0IHJ0X21sbWVfZGVhdXRoX3JlcSB7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXUxNiBSZWFzb247Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUewotICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgIFJlYXNvbjsKLX0gTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNULCAqUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVDsKK3N0cnVjdCBydF9tbG1lX2pvaW5fcmVxIHsKKwl1bnNpZ25lZCBsb25nIEJzc0lkeDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FVVEhfUkVRX1NUUlVDVCB7Ci0gICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgQWxnOwotICAgIFVMT05HICAgICAgICBUaW1lb3V0OwotfSBNTE1FX0FVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0FVVEhfUkVRX1NUUlVDVDsKK3N0cnVjdCBydF9tbG1lX3NjYW5fcmVxIHsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dOworCXU4IEJzc1R5cGU7CisJdTggU2NhblR5cGU7CisJdTggU3NpZExlbjsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX0RFQVVUSF9SRVFfU1RSVUNUIHsKLSAgICBVQ0hBUiAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICBSZWFzb247Ci19IE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QsICpQTUxNRV9ERUFVVEhfUkVRX1NUUlVDVDsKK3N0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSB7CisJY2hhciBTc2lkW01BWF9MRU5fT0ZfU1NJRF07CisJdTggU3NpZExlbjsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVTE9ORyAgICAgIEJzc0lkeDsKLX0gTUxNRV9KT0lOX1JFUV9TVFJVQ1Q7CitzdHJ1Y3QgUEFDS0VEIHJ0X2VpZCB7CisJdTggRWlkOworCXU4IExlbjsKKwl1OCBPY3RldFsxXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX1NDQU5fUkVRX1NUUlVDVCB7Ci0gICAgVUNIQVIgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgQnNzVHlwZTsKLSAgICBVQ0hBUiAgICAgIFNjYW5UeXBlOwotICAgIFVDSEFSICAgICAgU3NpZExlbjsKLSAgICBDSEFSICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLX0gTUxNRV9TQ0FOX1JFUV9TVFJVQ1QsICpQTUxNRV9TQ0FOX1JFUV9TVFJVQ1Q7CitzdHJ1Y3QgUEFDS0VEIHJ0X3J0bXBfdHhfcmF0ZV9zd2l0Y2ggeworCXU4IEl0ZW1ObzsKKwl1OCBTVEJDOjE7CisJdTggU2hvcnRHSToxOworCXU4IEJXOjE7CisJdTggUnN2MToxOworCXU4IE1vZGU6MjsKKwl1OCBSc3YyOjI7CisJdTggQ3Vyck1DUzsKKwl1OCBUcmFpblVwOworCXU4IFRyYWluRG93bjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX1NUQVJUX1JFUV9TVFJVQ1QgewotICAgIENIQVIgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLSAgICBVQ0hBUiAgICAgICBTc2lkTGVuOwotfSBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QsICpQTUxNRV9TVEFSVF9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSICAgRWlkOwotICAgIFVDSEFSICAgTGVuOwotICAgIENIQVIgICBPY3RldFsxXTsKLX0gRUlEX1NUUlVDVCwqUEVJRF9TVFJVQ1QsIEJFQUNPTl9FSURfU1RSVUNULCAqUEJFQUNPTl9FSURfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUTVBfVFhfUkFURV9TV0lUQ0gKLXsKLQlVQ0hBUiAgIEl0ZW1ObzsKLQlVQ0hBUglTVEJDOjE7Ci0JVUNIQVIJU2hvcnRHSToxOwotCVVDSEFSCUJXOjE7Ci0JVUNIQVIJUnN2MToxOwotCVVDSEFSCU1vZGU6MjsKLQlVQ0hBUglSc3YyOjI7Ci0JVUNIQVIgICBDdXJyTUNTOwotCVVDSEFSICAgVHJhaW5VcDsKLQlVQ0hBUiAgIFRyYWluRG93bjsKLX0gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBUQlRUX1BSRUxPQURfVElNRSAgICAgICAzODQJLyogdXNlYy4gTG9tZ1ByZWFtYmxlICsgMjQtYnl0ZSBhdCAxTWJwcyAqLwogI2RlZmluZSBERUZBVUxUX0RUSU1fUEVSSU9EICAgICAxCiAKLSNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCi0jZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYworI2RlZmluZSBNQUNfVEFCTEVfQUdFT1VUX1RJTUUJCQkzMDAJLyogdW5pdDogc2VjICovCisjZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkvKiB1bml0OiBzZWMgKi8KICNkZWZpbmUgTUFDX1RBQkxFX0ZVTEwoVGFiKQkJCQkoKFRhYikuc2l6ZSA9PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKIAotLy8gQVAgc2hhbGwgZHJvcCB0aGUgc3RhIGlmIGNvbnRpbmUgVHggZmFpbCBjb3VudCByZWFjaCBpdC4KLSNkZWZpbmUgTUFDX0VOVFJZX0xJRkVfQ0hFQ0tfQ05UCQkyMAkJCS8vIHBhY2tldCBjbnQuCisvKiBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LiAqLworI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCS8qIHBhY2tldCBjbnQuICovCiAKLS8vIFZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPlNzdAorLyogVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0ICovCiB0eXBlZGVmIGVudW0gX1NzdCB7Ci0gICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCi0gICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCi0gICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCisJU1NUX05PVF9BVVRILAkJLyogMDogZXF1aXZhbGVudCB0byBJRUVFIDgwMi4xMS8xOTk5IHN0YXRlIDEgKi8KKwlTU1RfQVVUSCwJCS8qIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyICovCisJU1NUX0FTU09DCQkvKiAyOiBlcXVpdmFsZW50IHRvIElFRUUgODAyLjExLzE5OTkgc3RhdGUgMyAqLwogfSBTU1Q7CiAKLS8vIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPkF1dGhTdGF0ZQorLyogdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlICovCiB0eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7Ci0gICAgQVNfTk9UX0FVVEgsCi0gICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQotICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQotICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQorCUFTX05PVF9BVVRILAorCUFTX0FVVEhfT1BFTiwJCS8qIFNUQSBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIHVzaW5nIE9QRU4gU1lTVEVNICovCisJQVNfQVVUSF9LRVksCQkvKiBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBTSEFSRUQgS0VZICovCisJQVNfQVVUSEVOVElDQVRJTkcJLyogU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWSAqLwogfSBBVVRIX1NUQVRFOwogCi0vL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0CisvKmZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0ICovCiB0eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgewotICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKLSAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCi0gICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgotICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKLSAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0Ci0gICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQotICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKLSAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3Ci0gICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAotICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKLSAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAotICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCi0gICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKLSAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMworCUFTX05PVFVTRSwJCS8qIDAgKi8KKwlBU19ESVNDT05ORUNULAkJLyogMSAqLworCUFTX0RJU0NPTk5FQ1RFRCwJLyogMiAqLworCUFTX0lOSVRJQUxJWkUsCQkvKiAzICovCisJQVNfQVVUSEVOVElDQVRJT04sCS8qIDQgKi8KKwlBU19BVVRIRU5USUNBVElPTjIsCS8qIDUgKi8KKwlBU19JTklUUE1LLAkJLyogNiAqLworCUFTX0lOSVRQU0ssCQkvKiA3ICovCisJQVNfUFRLU1RBUlQsCQkvKiA4ICovCisJQVNfUFRLSU5JVF9ORUdPVElBVElORywJLyogOSAqLworCUFTX1BUS0lOSVRET05FLAkJLyogMTAgKi8KKwlBU19VUERBVEVLRVlTLAkJLyogMTEgKi8KKwlBU19JTlRFR1JJVFlfRkFJTFVSRSwJLyogMTIgKi8KKwlBU19LRVlVUERBVEUsCQkvKiAxMyAqLwogfSBBUF9XUEFfU1RBVEU7CiAKLS8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0CisvKiBmb3Itd3BhIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNCAqLwogdHlwZWRlZiBlbnVtIF9HVEtTdGF0ZSB7Ci0gICAgUkVLRVlfTkVHT1RJQVRJTkcsCi0gICAgUkVLRVlfRVNUQUJMSVNIRUQsCi0gICAgS0VZRVJST1IsCisJUkVLRVlfTkVHT1RJQVRJTkcsCisJUkVLRVlfRVNUQUJMSVNIRUQsCisJS0VZRVJST1IsCiB9IEdUS19TVEFURTsKIAotLy8gIGZvci13cGEgIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNAorLyogIGZvci13cGEgIHZhbHVlIGRvbWFpbiBvZiBwTWFjRW50cnktPldwYVN0YXRlICA4MDIuMWkgRDMgICBwLjExNCAqLwogdHlwZWRlZiBlbnVtIF9XcGFHVEtTdGF0ZSB7Ci0gICAgU0VUS0VZUywKLSAgICBTRVRLRVlTX0RPTkUsCisJU0VUS0VZUywKKwlTRVRLRVlTX0RPTkUsCiB9IFdQQV9HVEtfU1RBVEU7Ci0vLyA9PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBBUCBtbG1lLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PSBlbmQgb2YgQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCi0jZW5kaWYJLy8gTUxNRV9IX18KKyNlbmRpZiAvKiBNTE1FX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvb2lkLmgKaW5kZXggMDIyN2M0YS4uZmQxYzE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9vaWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL29pZC5oCkBAIC0zNywzMiArMzcsMzcgQEAKICNpZm5kZWYgX09JRF9IXwogI2RlZmluZSBfT0lEX0hfCiAKKy8qI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+ICovCiAKKyNpZm5kZWYgVFJVRQogI2RlZmluZSBUUlVFCQkJCTEKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQogI2RlZmluZSBGQUxTRQkJCQkwCi0vLwotLy8gSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKLS8vCi0jZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwICAgLyogbVcgKi8KLSNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAgICAgLyogZEJtICovCi0jZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMCAgIC8qIGRCbSAqLwotI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDYgIC8qIGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYgICAvKiBieXRlIGNvdW50ICovCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0NyAgLyogYnl0ZSBjb3VudCAqLworI2VuZGlmCisvKiAqLworLyogSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMgKi8KKy8qICovCisjZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwCS8qIG1XICovCisjZGVmaW5lIE1BWF9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTEwCS8qIGRCbSAqLworI2RlZmluZSBNSU5fUlNTSV9UUklHR0VSICAgICAgICAgICAgICAgIC0yMDAJLyogZEJtICovCisjZGVmaW5lIE1BWF9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjM0NgkvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgICAgICAgICAgMjU2CS8qIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAyMzQ3CS8qIGJ5dGUgY291bnQgKi8KIAotLy8gbmV3IHR5cGVzIGZvciBNZWRpYSBTcGVjaWZpYyBJbmRpY2F0aW9ucwotLy8gRXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0CisvKiBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zICovCisvKiBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgKi8KICNkZWZpbmUgRVhUQ0hBX05PTkUJCQkwCiAjZGVmaW5lIEVYVENIQV9BQk9WRQkJMHgxCiAjZGVmaW5lIEVYVENIQV9CRUxPVwkJMHgzCiAKLS8vIEJXCisvKiBCVyAqLwogI2RlZmluZSBCQU5EX1dJRFRIXzIwCQkwCiAjZGVmaW5lIEJBTkRfV0lEVEhfNDAJCTEKICNkZWZpbmUgQkFORF9XSURUSF9CT1RICQkyCi0jZGVmaW5lIEJBTkRfV0lEVEhfMTAJCTMJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCi0vLyBTSE9SVEdJCi0jZGVmaW5lIEdBUF9JTlRFUlZBTF80MDAJMQkvLyBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZQorI2RlZmluZSBCQU5EX1dJRFRIXzEwCQkzCS8qIDgwMi4xMWogaGFzIDEwTUh6LiBUaGlzIGRlZmluaXRpb24gaXMgZm9yIGludGVybmFsIHVzYWdlLiBkb2Vzbid0IGZpbGwgaW4gdGhlIElFIG9yIG90aGVyIGZpZWxkLiAqLworLyogU0hPUlRHSSAqLworI2RlZmluZSBHQVBfSU5URVJWQUxfNDAwCTEJLyogb25seSBzdXBwb3J0IGluIEhUIG1vZGUgKi8KICNkZWZpbmUgR0FQX0lOVEVSVkFMXzgwMAkwCiAjZGVmaW5lIEdBUF9JTlRFUlZBTF9CT1RICTIKIApAQCAtNzMsMjQgKzc4LDI0IEBACiAjZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFUyAgICAgICAgOAogI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVggICAgIDE2CiAjZGVmaW5lIE1BQ19BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfRVZFTlQJCQkJMTAgIC8vIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUKLSNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKy8qI2RlZmluZSBNQVhfTlVNX09GX0NIUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OSAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbmMgKi8KKyNkZWZpbmUgTUFYX05VTV9PRl9DSFMJCQkJNTQJLyogMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwCS8qIGVudHJ5ICMgaW4gRVZFTlQgdGFibGUgKi8KKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9NQUMJCQkJMzIJLyogaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEgKi8KICNkZWZpbmUgTUFYX05VTUJFUl9PRl9BQ0wJCQkJNjQKLSNkZWZpbmUgTUFYX0xFTkdUSF9PRl9TVVBQT1JUX1JBVEVTCQkxMiAgICAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0CisjZGVmaW5lIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkJMTIJLyogMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCAqLwogI2RlZmluZSBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQkJCTQKIAotI2RlZmluZSBPSURfR0VOX01BQ0hJTkVfTkFNRSAgICAgICAgICAgICAgIDB4MDAwMTAyMUEKLQogI2RlZmluZSBSVF9RVUVSWV9TSUdOQUxfQ09OVEVYVAkJCQkweDA0MDIKICNkZWZpbmUgUlRfU0VUX0lBUFBfUElEICAgICAgICAgICAgICAgICAJMHgwNDA0CiAjZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1CiAjZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgotCi0vLwotLy8gSUVFRSA4MDIuMTEgT0lEcwotLy8KKyNkZWZpbmUgUlRfUVVFUllfRVZFTlRfVEFCTEUJCQkweDA0MDcKKy8qICovCisvKiBJRUVFIDgwMi4xMSBPSURzICovCisvKiAqLwogI2RlZmluZQlPSURfR0VUX1NFVF9UT0dHTEUJCQkweDgwMDAKKyNkZWZpbmUJT0lEX0dFVF9TRVRfRlJPTV9VSQkJCTB4NDAwMAogCiAjZGVmaW5lIE9JRF84MDJfMTFfQUREX1dFUAkJCTB4MDExMgogI2RlZmluZSBPSURfODAyXzExX0RJU0FTU09DSUFURQkJCTB4MDExNApAQCAtMTAxLDM4ICsxMDYsNDIgQEAKIAogI2RlZmluZQlSVF9PSURfREVWSUNFX05BTUUJCQkJCQkJMHgwNjA3CiAjZGVmaW5lCVJUX09JRF9WRVJTSU9OX0lORk8JCQkJCQkJMHgwNjA4CisjZGVmaW5lCU9JRF84MDJfMTFfQlNTSURfTElTVAkJCQkJCTB4MDYwOQorI2RlZmluZQlPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTCQkJCQkweDA2MEEKICNkZWZpbmUJT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUwkJCQkweDA2MEIKKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUwkJCQkweDA2MEMKKyNkZWZpbmUJT0lEXzgwMl8xMV9SU1NJCQkJCQkJCQkweDA2MEQKKyNkZWZpbmUJT0lEXzgwMl8xMV9TVEFUSVNUSUNTCQkJCQkJMHgwNjBFCiAjZGVmaW5lCU9JRF9HRU5fUkNWX09LCQkJCQkJCQkweDA2MEYKICNkZWZpbmUJT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSCQkJCQkJMHgwNjEwCi0KKyNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgorI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMworI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0CisjZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKKy8qZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgKi8KICNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKICNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKICNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKICNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKIAotLy9ydDI4NjAgLCBrYXRoeQogI2RlZmluZSBSVF9PSURfRFJJVkVSX0RFVklDRV9OQU1FICAgICAgICAgICAgICAgICAgIDB4MDY0NQogI2RlZmluZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUICAgICAgICAgIDB4MDY0NwogCi0vLyBSYWxpbmsgZGVmaW5lZCBPSURzCi0vLyBEZW5uaXMgTGVlIG1vdmUgdG8gcGxhdGZvcm0gc3BlY2lmaWMKLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQotewotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKLSAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRSB7CisJTmRpczgwMl8xMVN0YXR1c1R5cGVfQXV0aGVudGljYXRpb24sCisJTmRpczgwMl8xMVN0YXR1c1R5cGVfTWVkaWFTdHJlYW1Nb2RlLAorCU5kaXM4MDJfMTFTdGF0dXNUeXBlX1BNS0lEX0NhbmRpZGF0ZUxpc3QsCisJTmRpczgwMl8xMVN0YXR1c1R5cGVNYXgJLyogbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kICovCiB9IE5ESVNfODAyXzExX1NUQVRVU19UWVBFLCAqUE5ESVNfODAyXzExX1NUQVRVU19UWVBFOwogCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1NbNl07Cit0eXBlZGVmIHU4IE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KLXsKLSAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOwotfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9zdGF0dXNfaW5kaWNhdGlvbiB7CisJTkRJU184MDJfMTFfU1RBVFVTX1RZUEUgU3RhdHVzVHlwZTsKK307CiAKLS8vIG1hc2sgZm9yIGF1dGhlbnRpY2F0aW9uL2ludGVncml0eSBmaWVsZHMKKy8qIG1hc2sgZm9yIGF1dGhlbnRpY2F0aW9uL2ludGVncml0eSBmaWVsZHMgKi8KICNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0FVVEhfRklFTERTICAgICAgICAweDBmCiAKICNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX1JFQVVUSCAgICAgICAgICAgICAweDAxCkBAIC0xNDAsMzA0ICsxNDksMjgzIEBACiAjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKLXsKLSAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOwotICAgIFVMT05HIEZsYWdzOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXV0aGVudGljYXRpb25fcmVxdWVzdCB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CQkvKiBMZW5ndGggb2Ygc3RydWN0dXJlICovCisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKK307CiAKLS8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCi10eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVTE9ORyBGbGFnczsKLX0gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKKy8qQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuICovCitzdHJ1Y3QgcnRfcG1raWRfY2FuZGlkYXRlIHsKKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKwl1bnNpZ25lZCBsb25nIEZsYWdzOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCi17Ci0gICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCi0gICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKLSAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKLX0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfcG1raWRfY2FuZGlkYXRlX2xpc3QgeworCXVuc2lnbmVkIGxvbmcgVmVyc2lvbjsJCS8qIFZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgTnVtQ2FuZGlkYXRlczsJLyogTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMgKi8KKwlzdHJ1Y3QgcnRfcG1raWRfY2FuZGlkYXRlIENhbmRpZGF0ZUxpc3RbMV07Cit9OwogCi0vL0ZsYWdzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdCBzdHJ1Y3R1cmUKKy8qRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZSAqLwogI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKIAotLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQotewotICAgTmRpczgwMl8xMUZILAotICAgTmRpczgwMl8xMURTLAotICAgIE5kaXM4MDJfMTFPRkRNNSwKLSAgICBOZGlzODAyXzExT0ZETTVfTiwKLSAgICBOZGlzODAyXzExT0ZETTI0LAotICAgIE5kaXM4MDJfMTFPRkRNMjRfTiwKLSAgIE5kaXM4MDJfMTFBdXRvbW9kZSwKLSAgICBOZGlzODAyXzExTmV0d29ya1R5cGVNYXggICAgLy8gbm90IGEgcmVhbCB0eXBlLCBkZWZpbmVkIGFzIGFuIHVwcGVyIGJvdW5kCisvKiBBZGRlZCBuZXcgdHlwZXMgZm9yIE9GRE0gNUcgYW5kIDIuNEcgKi8KK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFIHsKKwlOZGlzODAyXzExRkgsCisJTmRpczgwMl8xMURTLAorCU5kaXM4MDJfMTFPRkRNNSwKKwlOZGlzODAyXzExT0ZETTI0LAorCU5kaXM4MDJfMTFBdXRvbW9kZSwKKwlOZGlzODAyXzExT0ZETTVfTiwKKwlOZGlzODAyXzExT0ZETTI0X04sCisJTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4CS8qIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZCAqLwogfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKLXsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKLX0gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfbmV0d29ya190eXBlX2xpc3QgeworCXUzMiBOdW1iZXJPZkl0ZW1zOwkvKiBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxICovCisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlWzFdOworfTsKIAotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QT1dFUl9NT0RFCi17Ci0gICAgTmRpczgwMl8xMVBvd2VyTW9kZUNBTSwKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCwKLSAgICBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1AsCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1AsCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZU1heCAgICAgIC8vIG5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QT1dFUl9NT0RFIHsKKwlOZGlzODAyXzExUG93ZXJNb2RlQ0FNLAorCU5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQLAorCU5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCwKKwlOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUCwKKwlOZGlzODAyXzExUG93ZXJNb2RlTWF4CS8qIG5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZCAqLwogfSBORElTXzgwMl8xMV9QT1dFUl9NT0RFLCAqUE5ESVNfODAyXzExX1BPV0VSX01PREU7CiAKLXR5cGVkZWYgVUxPTkcgICBORElTXzgwMl8xMV9UWF9QT1dFUl9MRVZFTDsgLy8gaW4gbWlsbGl3YXR0cwordHlwZWRlZiB1bnNpZ25lZCBsb25nIE5ESVNfODAyXzExX1RYX1BPV0VSX0xFVkVMOwkvKiBpbiBtaWxsaXdhdHRzICovCiAKLS8vCi0vLyBSZWNlaXZlZCBTaWduYWwgU3RyZW5ndGggSW5kaWNhdGlvbgotLy8KLXR5cGVkZWYgTE9ORyAgICBORElTXzgwMl8xMV9SU1NJOyAgICAgICAgICAgLy8gaW4gZEJtCisvKiAqLworLyogUmVjZWl2ZWQgU2lnbmFsIFN0cmVuZ3RoIEluZGljYXRpb24gKi8KKy8qICovCit0eXBlZGVmIGxvbmcgTkRJU184MDJfMTFfUlNTSTsJLyogaW4gZEJtICovCiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZICi17Ci0gICBVTE9ORyAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIFVMT05HICAgICAgICAgICBIb3BQYXR0ZXJuOyAgICAgICAgLy8gQXMgZGVmaW5lZCBieSA4MDIuMTEsIE1TQiBzZXQKLSAgIFVMT05HICAgICAgICAgICBIb3BTZXQ7ICAgICAgICAgICAgLy8gdG8gb25lIGlmIG5vbi04MDIuMTEKLSAgIFVMT05HICAgICAgICAgICBEd2VsbFRpbWU7ICAgICAgICAgLy8gdW5pdHMgYXJlIEt1c2VjCi19IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgsICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9jb25maWd1cmF0aW9uX2ZoIHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBsb25nIEhvcFBhdHRlcm47CS8qIEFzIGRlZmluZWQgYnkgODAyLjExLCBNU0Igc2V0ICovCisJdW5zaWduZWQgbG9uZyBIb3BTZXQ7CQkvKiB0byBvbmUgaWYgbm9uLTgwMi4xMSAqLworCXVuc2lnbmVkIGxvbmcgRHdlbGxUaW1lOwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OCi17Ci0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFjb25QZXJpb2Q7ICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYwotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBBVElNV2luZG93OyAgICAgICAgIC8vIHVuaXRzIGFyZSBLdXNlYwotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0NvbmZpZzsgICAgICAgICAgIC8vIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIegotICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCAgICBGSENvbmZpZzsKLX0gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OOworc3RydWN0IHJ0X25kaXNfODAyXzExX2NvbmZpZ3VyYXRpb24geworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGxvbmcgQmVhY29uUGVyaW9kOwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KKwl1bnNpZ25lZCBsb25nIEFUSU1XaW5kb3c7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLworCXVuc2lnbmVkIGxvbmcgRFNDb25maWc7CQkvKiBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHogKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfY29uZmlndXJhdGlvbl9maCBGSENvbmZpZzsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9TVEFUSVNUSUNTCi17Ci0gICBVTE9ORyAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2Ygc3RydWN0dXJlCi0gICBMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGYWlsZWRDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSVFNTdWNjZXNzQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGcmFtZUR1cGxpY2F0ZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgRkNTRXJyb3JDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQTG9jYWxNSUNGYWlsdXJlczsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVtb3RlTUlDRXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBJQ1ZFcnJvcnM7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUENvdW50ZXJNZWFzdXJlc0ludm9rZWQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUFJlcGxheXM7Ci0gICBMQVJHRV9JTlRFR0VSICAgQ0NNUEZvcm1hdEVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QUmVwbGF5czsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QRGVjcnlwdEVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBGb3VyV2F5SGFuZHNoYWtlRmFpbHVyZXM7Ci19IE5ESVNfODAyXzExX1NUQVRJU1RJQ1MsICpQTkRJU184MDJfMTFfU1RBVElTVElDUzsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9zdGF0aXN0aWNzIHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZhaWxlZENvdW50OworCUxBUkdFX0lOVEVHRVIgUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpcGxlUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJUU1N1Y2Nlc3NDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJUU0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEFDS0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZyYW1lRHVwbGljYXRlQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiBGQ1NFcnJvckNvdW50OworCUxBUkdFX0lOVEVHRVIgVEtJUExvY2FsTUlDRmFpbHVyZXM7CisJTEFSR0VfSU5URUdFUiBUS0lQUmVtb3RlTUlDRXJyb3JzOworCUxBUkdFX0lOVEVHRVIgVEtJUElDVkVycm9yczsKKwlMQVJHRV9JTlRFR0VSIFRLSVBDb3VudGVyTWVhc3VyZXNJbnZva2VkOworCUxBUkdFX0lOVEVHRVIgVEtJUFJlcGxheXM7CisJTEFSR0VfSU5URUdFUiBDQ01QRm9ybWF0RXJyb3JzOworCUxBUkdFX0lOVEVHRVIgQ0NNUFJlcGxheXM7CisJTEFSR0VfSU5URUdFUiBDQ01QRGVjcnlwdEVycm9yczsKKwlMQVJHRV9JTlRFR0VSIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKK307CiAKLXR5cGVkZWYgIFVMT05HICBORElTXzgwMl8xMV9LRVlfSU5ERVg7Ci10eXBlZGVmIFVMT05HTE9ORyAgIE5ESVNfODAyXzExX0tFWV9SU0M7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgTkRJU184MDJfMTFfS0VZX0lOREVYOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgTkRJU184MDJfMTFfS0VZX1JTQzsKIAotI2RlZmluZSBNQVhfUkFESVVTX1NSVl9OVU0JCQkyCSAgLy8gODAyLjF4IGZhaWxvdmVyIG51bWJlcgorI2RlZmluZSBNQVhfUkFESVVTX1NSVl9OVU0JCQkyCS8qIDgwMi4xeCBmYWlsb3ZlciBudW1iZXIgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfU1JWX0lORk8gewotCVVJTlQzMgkJCXJhZGl1c19pcDsKLQlVSU5UMzIJCQlyYWRpdXNfcG9ydDsKLQlVQ0hBUgkJCXJhZGl1c19rZXlbNjRdOwotCVVDSEFSCQkJcmFkaXVzX2tleV9sZW47Ci19IFJBRElVU19TUlZfSU5GTywgKlBSQURJVVNfU1JWX0lORk87CitzdHJ1Y3QgUEFDS0VEIHJ0X3JhZGl1c19zcnZfaW5mbyB7CisJdTMyIHJhZGl1c19pcDsKKwl1MzIgcmFkaXVzX3BvcnQ7CisJdTggcmFkaXVzX2tleVs2NF07CisJdTggcmFkaXVzX2tleV9sZW47Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTwotewotCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07Ci0JUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOwotCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCi0gICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKLSAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOwotfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOworc3RydWN0IFBBQ0tFRCBydF9yYWRpdXNfa2V5X2luZm8geworCXU4IHJhZGl1c19zcnZfbnVtOworCXN0cnVjdCBydF9yYWRpdXNfc3J2X2luZm8gcmFkaXVzX3Nydl9pbmZvW01BWF9SQURJVVNfU1JWX05VTV07CisJdTggaWVlZTgwMjF4V0VQOwkvKiBkeW5hbWljIFdFUCAqLworCXU4IGtleV9pbmRleDsKKwl1OCBrZXlfbGVuZ3RoOwkvKiBsZW5ndGggb2Yga2V5IGluIGJ5dGVzICovCisJdTgga2V5X21hdGVyaWFsWzEzXTsKK307CiAKLS8vIEl0J3MgdXNlZCBieSA4MDIuMXggZGFlbW9uIHRvIHJlcXVpcmUgcmVsYXRpdmUgY29uZmlndXJhdGlvbgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SQURJVVNfQ09ORgotewotICAgIFVJTlQzMiAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVDSEFSCQkJbWJzc19udW07CQkJLy8gaW5kaWNhdGUgbXVsdGlwbGUgQlNTIG51bWJlcgotCVVJTlQzMgkJCW93bl9pcF9hZGRyOwotCVVJTlQzMgkJCXJldHJ5X2ludGVydmFsOwotCVVJTlQzMgkJCXNlc3Npb25fdGltZW91dF9pbnRlcnZhbDsKLQlVQ0hBUgkJCUVBUGlmbmFtZVtJRk5BTVNJWl07Ci0JVUNIQVIJCQlFQVBpZm5hbWVfbGVuOwotCVVDSEFSIAkJCVByZUF1dGhpZm5hbWVbSUZOQU1TSVpdOwotCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW47Ci0JUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOC8qTUFYX01CU1NJRF9OVU0qL107Ci19IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOworLyogSXQncyB1c2VkIGJ5IDgwMi4xeCBkYWVtb24gdG8gcmVxdWlyZSByZWxhdGl2ZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3JhZGl1c19jb25mIHsKKwl1MzIgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisJdTggbWJzc19udW07CQkvKiBpbmRpY2F0ZSBtdWx0aXBsZSBCU1MgbnVtYmVyICovCisJdTMyIG93bl9pcF9hZGRyOworCXUzMiByZXRyeV9pbnRlcnZhbDsKKwl1MzIgc2Vzc2lvbl90aW1lb3V0X2ludGVydmFsOworCXU4IEVBUGlmbmFtZVs4XVtJRk5BTVNJWl07CisJdTggRUFQaWZuYW1lX2xlbls4XTsKKwl1OCBQcmVBdXRoaWZuYW1lWzhdW0lGTkFNU0laXTsKKwl1OCBQcmVBdXRoaWZuYW1lX2xlbls4XTsKKwlzdHJ1Y3QgcnRfcmFkaXVzX2tleV9pbmZvIFJhZGl1c0luZm9bOF07Cit9OwogCi0vLyBLZXkgbWFwcGluZyBrZXlzIHJlcXVpcmUgYSBCU1NJRAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0tFWQotewotICAgIFVJTlQgICAgICAgICAgIExlbmd0aDsgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgVUlOVCAgICAgICAgICAgS2V5SW5kZXg7Ci0gICAgVUlOVCAgICAgICAgICAgS2V5TGVuZ3RoOyAgICAgICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCi0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Ci0gICAgTkRJU184MDJfMTFfS0VZX1JTQyBLZXlSU0M7Ci0gICAgVUNIQVIgICAgICAgICAgIEtleU1hdGVyaWFsWzFdOyAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZAotfSBORElTXzgwMl8xMV9LRVksICpQTkRJU184MDJfMTFfS0VZOworLyogS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQgKi8KK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9rZXkgeworCXUzMiBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1MzIgS2V5SW5kZXg7CisJdTMyIEtleUxlbmd0aDsJCS8qIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMgKi8KKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKwlORElTXzgwMl8xMV9LRVlfUlNDIEtleVJTQzsKKwl1OCBLZXlNYXRlcmlhbFsxXTsJLyogdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZCAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfcGFzc3BocmFzZSB7CisJdTMyIEtleUxlbmd0aDsJCS8qIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMgKi8KKwlORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKKwl1OCBLZXlNYXRlcmlhbFsxXTsJLyogdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZCAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1dFUAotewotICAgVUlOVCAgICAgTGVuZ3RoOyAgICAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICBVSU5UICAgICBLZXlJbmRleDsgICAgICAgICAgIC8vIDAgaXMgdGhlIHBlci1jbGllbnQga2V5LCAxLU4gYXJlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbCBrZXlzCi0gICBVSU5UICAgICBLZXlMZW5ndGg7ICAgICAvLyBsZW5ndGggb2Yga2V5IGluIGJ5dGVzCi0gICBVQ0hBUiAgICAgS2V5TWF0ZXJpYWxbMV07Ly8gdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZAotfSBORElTXzgwMl8xMV9XRVAsICpQTkRJU184MDJfMTFfV0VQOworc3RydWN0IHJ0X25kaXNfODAyXzExX3JlbW92ZV9rZXkgeworCXUzMiBMZW5ndGg7CQkvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwl1MzIgS2V5SW5kZXg7CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7Cit9OwogCitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfd2VwIHsKKwl1MzIgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisJdTMyIEtleUluZGV4OwkJLyogMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksIDEtTiBhcmUgdGhlICovCisJLyogZ2xvYmFsIGtleXMgKi8KKwl1MzIgS2V5TGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGtleSBpbiBieXRlcyAqLworCXU4IEtleU1hdGVyaWFsWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCit9OwogCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKLXsKLSAgIE5kaXM4MDJfMTFJQlNTLAotICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAotICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAotICAgTmRpczgwMl8xMU1vbml0b3IsCi0gICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKK3R5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSB7CisJTmRpczgwMl8xMUlCU1MsCisJTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAorCU5kaXM4MDJfMTFBdXRvVW5rbm93biwKKwlOZGlzODAyXzExTW9uaXRvciwKKwlOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXgJLyogTm90IGEgcmVhbCB2YWx1ZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZCAqLwogfSBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFLCAqUE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkU7CiAKLS8vIEFkZCBuZXcgYXV0aGVudGljYXRpb24gbW9kZXMKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQotewotICAgTmRpczgwMl8xMUF1dGhNb2RlT3BlbiwKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCwKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsCi0gICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBLAotICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSywKLSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lLAotICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMiwKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0ssCi0gICAJTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIsCisvKiBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzICovCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgeworCU5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCisJTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkLAorCU5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSywKKwlOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lLAorCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCisJTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSywKKwlOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMiwKIAlOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSywKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZU1heCAgICAgICAgICAgLy8gTm90IGEgcmVhbCBtb2RlLCBkZWZpbmVkIGFzIHVwcGVyIGJvdW5kCisJTmRpczgwMl8xMUF1dGhNb2RlTWF4CS8qIE5vdCBhIHJlYWwgbW9kZSwgZGVmaW5lZCBhcyB1cHBlciBib3VuZCAqLwogfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFLCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU7CiAKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNdOyAgICAgICAgLy8gU2V0IG9mIDggZGF0YSByYXRlcwotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1JBVEVTX0VYW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07ICAvLyBTZXQgb2YgMTYgZGF0YSByYXRlcwordHlwZWRlZiB1OCBORElTXzgwMl8xMV9SQVRFU1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNdOwkvKiBTZXQgb2YgOCBkYXRhIHJhdGVzICovCit0eXBlZGVmIHU4IE5ESVNfODAyXzExX1JBVEVTX0VYW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07CS8qIFNldCBvZiAxNiBkYXRhIHJhdGVzICovCiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfU1NJRAotewotICAgIFVJTlQgICBTc2lkTGVuZ3RoOyAgICAgICAgIC8vIGxlbmd0aCBvZiBTU0lEIGZpZWxkIGJlbG93LCBpbiBieXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW4gYmUgemVyby4KLSAgICBVQ0hBUiAgIFNzaWRbTkRJU184MDJfMTFfTEVOR1RIX1NTSURdOyAgICAgICAgICAgLy8gU1NJRCBpbmZvcm1hdGlvbiBmaWVsZAotfSBORElTXzgwMl8xMV9TU0lELCAqUE5ESVNfODAyXzExX1NTSUQ7CitzdHJ1Y3QgUEFDS0VEIHJ0X25kaXNfODAyXzExX3NzaWQgeworCXUzMiBTc2lkTGVuZ3RoOwkvKiBsZW5ndGggb2YgU1NJRCBmaWVsZCBiZWxvdywgaW4gYnl0ZXM7ICovCisJLyogdGhpcyBjYW4gYmUgemVyby4gKi8KKwl1OCBTc2lkW05ESVNfODAyXzExX0xFTkdUSF9TU0lEXTsJLyogU1NJRCBpbmZvcm1hdGlvbiBmaWVsZCAqLworfTsKIAorc3RydWN0IFBBQ0tFRCBydF9uZGlzX3dsYW5fYnNzaWQgeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgTWFjQWRkcmVzczsJLyogQlNTSUQgKi8KKwl1OCBSZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCBTc2lkOwkvKiBTU0lEICovCisJdW5zaWduZWQgbG9uZyBQcml2YWN5OwkJLyogV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQgKi8KKwlORElTXzgwMl8xMV9SU1NJIFJzc2k7CS8qIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIGluIGRCbSAqLworCU5ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlOworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9jb25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb247CisJTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBJbmZyYXN0cnVjdHVyZU1vZGU7CisJTkRJU184MDJfMTFfUkFURVMgU3VwcG9ydGVkUmF0ZXM7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAotICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07Ci0gICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAotICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCi0gICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOwotICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKLSAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOwotfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOworc3RydWN0IFBBQ0tFRCBydF9uZGlzXzgwMl8xMV9ic3NpZF9saXN0IHsKKwl1MzIgTnVtYmVyT2ZJdGVtczsJLyogaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMSAqLworCXN0cnVjdCBydF9uZGlzX3dsYW5fYnNzaWQgQnNzaWRbMV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKLXsKLSAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOwotfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7CisvKiBBZGRlZCBDYXBhYmlsaXRpZXMsIElFTGVuZ3RoIGFuZCBJRXMgZm9yIGVhY2ggQlNTSUQgKi8KK3N0cnVjdCBQQUNLRUQgcnRfbmRpc193bGFuX2Jzc2lkX2V4IHsKKwl1bnNpZ25lZCBsb25nIExlbmd0aDsJCS8qIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZSAqLworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIE1hY0FkZHJlc3M7CS8qIEJTU0lEICovCisJdTggUmVzZXJ2ZWRbMl07CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgU3NpZDsJLyogU1NJRCAqLworCXUzMiBQcml2YWN5OwkJLyogV0VQIGVuY3J5cHRpb24gcmVxdWlyZW1lbnQgKi8KKwlORElTXzgwMl8xMV9SU1NJIFJzc2k7CS8qIHJlY2VpdmUgc2lnbmFsICovCisJLyogc3RyZW5ndGggaW4gZEJtICovCisJTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2U7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX2NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbjsKKwlORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIEluZnJhc3RydWN0dXJlTW9kZTsKKwlORElTXzgwMl8xMV9SQVRFU19FWCBTdXBwb3J0ZWRSYXRlczsKKwl1bnNpZ25lZCBsb25nIElFTGVuZ3RoOworCXU4IElFc1sxXTsKK307CiAKLS8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50Ci0gICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCi0gICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKLSAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Ci19IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7CitzdHJ1Y3QgUEFDS0VEIHJ0X25kaXNfODAyXzExX2Jzc2lkX2xpc3RfZXggeworCXUzMiBOdW1iZXJPZkl0ZW1zOwkvKiBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxICovCisJc3RydWN0IHJ0X25kaXNfd2xhbl9ic3NpZF9leCBCc3NpZFsxXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAotewotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Ci19IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKK3N0cnVjdCBQQUNLRUQgcnRfbmRpc184MDJfMTFfZml4ZWRfaWVzIHsKKwl1OCBUaW1lc3RhbXBbOF07CisJdTE2IEJlYWNvbkludGVydmFsOworCXUxNiBDYXBhYmlsaXRpZXM7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0ZJWEVEX0lFcwotewotICAgIFVDSEFSIFRpbWVzdGFtcFs4XTsKLSAgICBVU0hPUlQgQmVhY29uSW50ZXJ2YWw7Ci0gICAgVVNIT1JUIENhcGFiaWxpdGllczsKLX0gTkRJU184MDJfMTFfRklYRURfSUVzLCAqUE5ESVNfODAyXzExX0ZJWEVEX0lFczsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgeworCXU4IEVsZW1lbnRJRDsKKwl1OCBMZW5ndGg7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZCAqLworCXU4IGRhdGFbMV07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCi17Ci0gICAgVUNIQVIgRWxlbWVudElEOwotICAgIFVDSEFSIExlbmd0aDsgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIGRhdGEgZmllbGQKLSAgICBVQ0hBUiBkYXRhWzFdOwotfSBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMsICpQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOwogCi10eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQ7CiAKLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBORElTXzgwMl8xMV9BTlRFTk5BOwogCi10eXBlZGVmICBVTE9ORyAgIE5ESVNfODAyXzExX0FOVEVOTkE7Ci0KLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIKLXsKLSAgIE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsLAotICAgTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUAordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiB7CisJTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGwsCisJTmRpczgwMl8xMVByaXZGaWx0ZXI4MDIxeFdFUAogfSBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiwgKlBORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUjsKIAotLy8gQWRkZWQgbmV3IGVuY3J5cHRpb24gdHlwZXMKLS8vIEFsc28gYWxpYXNlZCB0eXBlZGVmIHRvIG5ldyBuYW1lCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1dFUF9TVEFUVVMKLXsKLSAgIE5kaXM4MDJfMTFXRVBFbmFibGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQgPSBOZGlzODAyXzExV0VQRW5hYmxlZCwKLSAgIE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkID0gTmRpczgwMl8xMVdFUERpc2FibGVkLAotICAgTmRpczgwMl8xMVdFUEtleUFic2VudCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFLZXlBYnNlbnQgPSBOZGlzODAyXzExV0VQS2V5QWJzZW50LAotICAgTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbk5vdFN1cHBvcnRlZCA9IE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZCwJLy8gVEtJUCBvciBBRVMgbWl4Ci0gICAgTmRpczgwMl8xMUVuY3J5cHRpb240S2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCwKKy8qIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzICovCisvKiBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZSAqLwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTIHsKKwlOZGlzODAyXzExV0VQRW5hYmxlZCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCisJTmRpczgwMl8xMVdFUERpc2FibGVkLAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCisJTmRpczgwMl8xMVdFUEtleUFic2VudCwKKwlOZGlzODAyXzExRW5jcnlwdGlvbjFLZXlBYnNlbnQgPSBOZGlzODAyXzExV0VQS2V5QWJzZW50LAorCU5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCisJTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAorCU5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8qIFRLSVAgb3IgQUVTIG1peCAqLworCU5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKKwlOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCiAJTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKIH0gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAotICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKKyAgICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKIAotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKLXsKLSAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCit0eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUyB7CisJTmRpczgwMl8xMVJlbG9hZFdFUEtleXMKIH0gTkRJU184MDJfMTFfUkVMT0FEX0RFRkFVTFRTLCAqUE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUzsKIAogI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgICAgICAxCkBAIC00NDgsMzUxICs0MzYsMzQzIEBACiAjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKICNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKLXsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKLX0gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7CitzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYWlfcmVxZmkgeworCXUxNiBDYXBhYmlsaXRpZXM7CisJdTE2IExpc3RlbkludGVydmFsOworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEN1cnJlbnRBUEFkZHJlc3M7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVTRkkKLXsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBTdGF0dXNDb2RlOwotICAgIFVTSE9SVCBBc3NvY2lhdGlvbklkOwotfSBORElTXzgwMl8xMV9BSV9SRVNGSSwgKlBORElTXzgwMl8xMV9BSV9SRVNGSTsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9haV9yZXNmaSB7CisJdTE2IENhcGFiaWxpdGllczsKKwl1MTYgU3RhdHVzQ29kZTsKKwl1MTYgQXNzb2NpYXRpb25JZDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTgotewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIExlbmd0aDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXM7Ci0gICAgTkRJU184MDJfMTFfQUlfUkVRRkkgICAgUmVxdWVzdEZpeGVkSUVzOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIFJlcXVlc3RJRUxlbmd0aDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXF1ZXN0SUVzOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgIEF2YWlsYWJsZVJlc3BvbnNlRml4ZWRJRXM7Ci0gICAgTkRJU184MDJfMTFfQUlfUkVTRkkgICAgUmVzcG9uc2VGaXhlZElFczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXNwb25zZUlFTGVuZ3RoOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgIE9mZnNldFJlc3BvbnNlSUVzOwotfSBORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiwgKlBORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTjsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9hc3NvY2lhdGlvbl9pbmZvcm1hdGlvbiB7CisJdW5zaWduZWQgbG9uZyBMZW5ndGg7CisJdTE2IEF2YWlsYWJsZVJlcXVlc3RGaXhlZElFczsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYWlfcmVxZmkgUmVxdWVzdEZpeGVkSUVzOworCXVuc2lnbmVkIGxvbmcgUmVxdWVzdElFTGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgT2Zmc2V0UmVxdWVzdElFczsKKwl1MTYgQXZhaWxhYmxlUmVzcG9uc2VGaXhlZElFczsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYWlfcmVzZmkgUmVzcG9uc2VGaXhlZElFczsKKwl1bnNpZ25lZCBsb25nIFJlc3BvbnNlSUVMZW5ndGg7CisJdW5zaWduZWQgbG9uZyBPZmZzZXRSZXNwb25zZUlFczsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAotewotICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9ldmVudCB7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3N0YXR1c19pbmRpY2F0aW9uIFN0YXR1czsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXV0aGVudGljYXRpb25fcmVxdWVzdCBSZXF1ZXN0WzFdOworfTsKIAotLy8gODAyLjExIE1lZGlhIHN0cmVhbSBjb25zdHJhaW50cywgYXNzb2NpYXRlZCB3aXRoIE9JRF84MDJfMTFfTUVESUFfU1RSRUFNX01PREUKLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfTUVESUFfU1RSRUFNX01PREUKLXsKLSAgICBOZGlzODAyXzExTWVkaWFTdHJlYW1PZmYsCi0gICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT24sCisvKiA4MDIuMTEgTWVkaWEgc3RyZWFtIGNvbnN0cmFpbnRzLCBhc3NvY2lhdGVkIHdpdGggT0lEXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSAqLwordHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSB7CisJTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAorCU5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAogfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKIAotLy8gUE1LSUQgU3RydWN0dXJlcwotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKKy8qIFBNS0lEIFN0cnVjdHVyZXMgKi8KK3R5cGVkZWYgdTggTkRJU184MDJfMTFfUE1LSURfVkFMVUVbMTZdOwogCi10eXBlZGVmIHN0cnVjdCBfQlNTSURfSU5GTwotewotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotICAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFIFBNS0lEOwotfSBCU1NJRF9JTkZPLCAqUEJTU0lEX0lORk87CitzdHJ1Y3QgcnRfYnNzaWRfaW5mbyB7CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQlNTSUQ7CisJTkRJU184MDJfMTFfUE1LSURfVkFMVUUgUE1LSUQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKLXsKLSAgICBVSU5UICAgIExlbmd0aDsKLSAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OwotICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOwotfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9wbWtpZCB7CisJdTMyIExlbmd0aDsKKwl1MzIgQlNTSURJbmZvQ291bnQ7CisJc3RydWN0IHJ0X2Jzc2lkX2luZm8gQlNTSURJbmZvWzFdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04KLXsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlU3VwcG9ydGVkOwotICAgIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEVuY3J5cHRTdGF0dXNTdXBwb3J0ZWQ7Ci19IE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VOQ1JZUFRJT04sICpQTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTjsKK3N0cnVjdCBydF9uZGlzXzgwMl8xMV9hdXRoZW50aWNhdGlvbl9lbmNyeXB0aW9uIHsKKwlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIEF1dGhNb2RlU3VwcG9ydGVkOworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEVuY3J5cHRTdGF0dXNTdXBwb3J0ZWQ7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQotewotICAgICBVTE9ORyBMZW5ndGg7Ci0gICAgIFVMT05HIFZlcnNpb247Ci0gICAgIFVMT05HIE5vT2ZQTUtJRHM7Ci0gICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOwotICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKLX0gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOworc3RydWN0IHJ0X25kaXNfODAyXzExX2NhcGFiaWxpdHkgeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgVmVyc2lvbjsKKwl1bnNpZ25lZCBsb25nIE5vT2ZQTUtJRHM7CisJdW5zaWduZWQgbG9uZyBOb09mQXV0aEVuY3J5cHRQYWlyc1N1cHBvcnRlZDsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXV0aGVudGljYXRpb25fZW5jcnlwdGlvbgorCSAgICBBdXRoZW50aWNhdGlvbkVuY3J5cHRpb25TdXBwb3J0ZWRbMV07Cit9OwogCi0jZGVmaW5lIFJUX1BSSVZfSU9DVExfRVhUCQkJCQkJCShTSU9DSVdGSVJTVFBSSVYgKyAweDAxKSAvLyBTeW5jLiB3aXRoIEFQIGZvciB3c2MgdXBucCBkYWVtb24KKyNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwMSkJLyogU3luYy4gd2l0aCBBUCBmb3Igd3NjIHVwbnAgZGFlbW9uICovCiAjZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCiAKICNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKICNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKICNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKICNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQorI2RlZmluZSBSVF9QUklWX0lPQ1RMX0VYVAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRSkJLyogU3luYy4gd2l0aCBSVDYxIChmb3Igd3BhX3N1cHBsaWNhbnQpICovCiAjZGVmaW5lIFJUUFJJVl9JT0NUTF9HRVRfTUFDX1RBQkxFCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRikKIAogI2RlZmluZSBSVFBSSVZfSU9DVExfU0hPVwkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgxMSkKIGVudW0gewotICAgIFNIT1dfQ09OTl9TVEFUVVMgPSA0LAotICAgIFNIT1dfRFJWSUVSX1ZFUklPTiA9IDUsCi0gICAgU0hPV19CQV9JTkZPID0gNiwKKwlTSE9XX0NPTk5fU1RBVFVTID0gNCwKKwlTSE9XX0RSVklFUl9WRVJJT04gPSA1LAorCVNIT1dfQkFfSU5GTyA9IDYsCiAJU0hPV19ERVNDX0lORk8gPSA3LAotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1VTQgogCVNIT1dfUlhCVUxLX0lORk8gPSA4LAogCVNIT1dfVFhCVUxLX0lORk8gPSA5LAotI2VuZGlmIC8vIFJUMjg3MCAvLwotICAgIFJBSU9fT0ZGID0gMTAsCi0gICAgUkFJT19PTiA9IDExLAorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCVJBSU9fT0ZGID0gMTAsCisJUkFJT19PTiA9IDExLAogCVNIT1dfQ0ZHX1ZBTFVFID0gMjAsCi0jaWYgIWRlZmluZWQoUlQyODYwKQogCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAotI2VuZGlmCiB9OwogCi0jaWZkZWYgTExURF9TVVBQT1JUCi0vLyBmb3IgY29uc2lzdGVuY3kgd2l0aCBSVDYxCi0jZGVmaW5lIFJUX09JRF9HRVRfUEhZX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NjEKLSNlbmRpZiAvLyBMTFREX1NVUFBPUlQgLy8KKyNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKKyNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgorI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3CiAKLSNpZiBkZWZpbmVkKFJUMjg2MCkgfHwgZGVmaW5lZChSVDMweHgpCi0vLyBOZXcgZm9yIE1lZXRpbmdIb3VzZSBBcGkgc3VwcG9ydAorI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QQVNTUEhSQVNFICAgICAgICAgICAgICAgICAgIDB4MDc0MAkvKiBwYXNzcGhyYXNlIGZvciB3cGEoMiktcHNrICovCisjZGVmaW5lIFJUX09JRF9XU0NfRFJJVkVSX0FVVE9fQ09OTkVDVCAgICAgICAgICAgICAgMHgwNzQxCisjZGVmaW5lIFJUX09JRF9XU0NfUVVFUllfREVGQVVMVF9QUk9GSUxFICAgICAgICAgICAgMHgwNzQyCisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX0NPTk5fQllfUFJPRklMRV9JTkRFWCAgICAgICAgMHgwNzQzCisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgwNzQ0CisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX1NTSUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzQ1CisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX1BJTl9DT0RFICAgICAgICAgICAgICAgICAgICAgMHgwNzQ2CisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzQ3CS8qIFBJTiBvciBQQkMgKi8KKyNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfQ09ORl9NT0RFICAgICAgICAgICAgICAgICAgICAweDA3NDgJLyogRW5yb2xsZWUgb3IgUmVnaXN0cmFyICovCisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX1BST0ZJTEUgICAgICAgICAgICAgICAgICAgICAgMHgwNzQ5CisjZGVmaW5lCVJUX09JRF9XU0NfQ09ORklHX1NUQVRVUwkJCQkJMHgwNzRGCisjZGVmaW5lIFJUX09JRF84MDJfMTFfV1NDX1FVRVJZX1BST0ZJTEUJCQkJMHgwNzUwCisvKiBmb3IgY29uc2lzdGVuY3kgd2l0aCBSVDYxICovCisjZGVmaW5lIFJUX09JRF9XU0NfUVVFUllfU1RBVFVTCQkJCQkJMHgwNzUxCisjZGVmaW5lIFJUX09JRF9XU0NfUElOX0NPREUJCQkJCQkJMHgwNzUyCisjZGVmaW5lIFJUX09JRF9XU0NfVVVJRAkJCQkJCQkJMHgwNzUzCisjZGVmaW5lIFJUX09JRF9XU0NfU0VUX1NFTEVDVEVEX1JFR0lTVFJBUgkJCTB4MDc1NAorI2RlZmluZSBSVF9PSURfV1NDX0VBUE1TRwkJCQkJCQkweDA3NTUKKyNkZWZpbmUgUlRfT0lEX1dTQ19NQU5VRkFDVFVSRVIJCQkJCQkweDA3NTYKKyNkZWZpbmUgUlRfT0lEX1dTQ19NT0RFTF9OQU1FCQkJCQkJMHgwNzU3CisjZGVmaW5lIFJUX09JRF9XU0NfTU9ERUxfTk8JCQkJCQkJMHgwNzU4CisjZGVmaW5lIFJUX09JRF9XU0NfU0VSSUFMX05PCQkJCQkJMHgwNzU5CisjZGVmaW5lIFJUX09JRF9XU0NfTUFDX0FERFJFU1MJCQkJCQkweDA3NjAKKworLyogTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQgKi8KICNkZWZpbmUgT0lEX01IXzgwMl8xWF9TVVBQT1JURUQgICAgICAgICAgICAgICAweEZGRURDMTAwCi0jZW5kaWYKIAotLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISEhCi10eXBlZGVmIHVuaW9uICBfSFRUUkFOU01JVF9TRVRUSU5HIHsKLQlzdHJ1Y3QJewotCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQlVU0hPUlQJCVNob3J0R0k6MTsKLQlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQotCVVTSE9SVAkJcnN2OjI7Ci0JVVNIT1JUCQlUeEJGOjE7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotCX0JZmllbGQ7Ci0JVVNIT1JUCQl3b3JkOwotIH0gSFRUUkFOU01JVF9TRVRUSU5HLCAqUEhUVFJBTlNNSVRfU0VUVElORzsKKy8qIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEgKi8KK3R5cGVkZWYgdW5pb24gX0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0IHsKKwkJdTE2IE1DUzo3OwkvKiBNQ1MgKi8KKwkJdTE2IEJXOjE7CS8qY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6ICovCisJCXUxNiBTaG9ydEdJOjE7CisJCXUxNiBTVEJDOjI7CS8qU1BBQ0UgKi8KKy8qICAgICAgdTE2ICAgICAgICAgIHJzdjozOyAqLworCQl1MTYgcnN2OjI7CisJCXUxNiBUeEJGOjE7CisJCXUxNiBNT0RFOjI7CS8qIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LiAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IEhUVFJBTlNNSVRfU0VUVElORywgKlBIVFRSQU5TTUlUX1NFVFRJTkc7CiAKIHR5cGVkZWYgZW51bSBfUlRfODAyXzExX1BSRUFNQkxFIHsKLSAgICBSdDgwMl8xMVByZWFtYmxlTG9uZywKLSAgICBSdDgwMl8xMVByZWFtYmxlU2hvcnQsCi0gICAgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KKwlSdDgwMl8xMVByZWFtYmxlTG9uZywKKwlSdDgwMl8xMVByZWFtYmxlU2hvcnQsCisJUnQ4MDJfMTFQcmVhbWJsZUF1dG8KIH0gUlRfODAyXzExX1BSRUFNQkxFLCAqUFJUXzgwMl8xMV9QUkVBTUJMRTsKIAotLy8gT25seSBmb3IgU1RBLCBuZWVkIHRvIHN5bmMgd2l0aCBBUAogdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUEhZX01PREUgewogCVBIWV8xMUJHX01JWEVEID0gMCwKIAlQSFlfMTFCLAogCVBIWV8xMUEsCiAJUEhZXzExQUJHX01JWEVELAogCVBIWV8xMUcsCi0JUEhZXzExQUJHTl9NSVhFRCwJLy8gYm90aCBiYW5kICAgNQotCVBIWV8xMU5fMl80RywJCS8vIDExbi1vbmx5IHdpdGggMi40RyBiYW5kICAgCTYKLQlQSFlfMTFHTl9NSVhFRCwJLy8gMi40RyBiYW5kICAgICAgNwotCVBIWV8xMUFOX01JWEVELAkvLyA1RyAgYmFuZCAgICAgICA4Ci0JUEhZXzExQkdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDkKLQlQSFlfMTFBR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgMTAKLQlQSFlfMTFOXzVHLAkJCS8vIDExbi1vbmx5IHdpdGggNUcgYmFuZAkJMTEKKwlQSFlfMTFBQkdOX01JWEVELAkvKiBib3RoIGJhbmQgICA1ICovCisJUEhZXzExTl8yXzRHLAkJLyogMTFuLW9ubHkgd2l0aCAyLjRHIGJhbmQgICAgICA2ICovCisJUEhZXzExR05fTUlYRUQsCQkvKiAyLjRHIGJhbmQgICAgICA3ICovCisJUEhZXzExQU5fTUlYRUQsCQkvKiA1RyAgYmFuZCAgICAgICA4ICovCisJUEhZXzExQkdOX01JWEVELAkvKiBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDkgKi8KKwlQSFlfMTFBR05fTUlYRUQsCS8qIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgMTAgKi8KKwlQSFlfMTFOXzVHLAkJLyogMTFuLW9ubHkgd2l0aCA1RyBiYW5kICAgICAgICAgICAgICAgIDExICovCiB9IFJUXzgwMl8xMV9QSFlfTU9ERTsKIAotLy8gcHV0IGFsbCBwcm9wcmlldGVyeSBmb3ItcXVlcnkgb2JqZWN0cyBoZXJlIHRvIHJlZHVjZSAjIG9mIFF1ZXJ5X09JRAotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9MSU5LX1NUQVRVUyB7Ci0gICAgVUxPTkcgICBDdXJyVHhSYXRlOyAgICAgICAgIC8vIGluIHVuaXRzIG9mIDAuNU1icHMKLSAgICBVTE9ORyAgIENoYW5uZWxRdWFsaXR5OyAgICAgLy8gMC4uMTAwICUKLSAgICBVTE9ORyAgIFR4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAotICAgIFVMT05HICAgUnhCeXRlQ291bnQ7ICAgICAgICAvLyBib3RoIG9rIGFuZCBmYWlsCi0gICAgVUxPTkcJQ2VudHJhbENoYW5uZWw7CQkvLyA0ME1IeiBjZW50cmFsIGNoYW5uZWwgbnVtYmVyCi19IFJUXzgwMl8xMV9MSU5LX1NUQVRVUywgKlBSVF84MDJfMTFfTElOS19TVEFUVVM7CisvKiBwdXQgYWxsIHByb3ByaWV0ZXJ5IGZvci1xdWVyeSBvYmplY3RzIGhlcmUgdG8gcmVkdWNlICMgb2YgUXVlcnlfT0lEICovCitzdHJ1Y3QgcnRfODAyXzExX2xpbmtfc3RhdHVzIHsKKwl1bnNpZ25lZCBsb25nIEN1cnJUeFJhdGU7CS8qIGluIHVuaXRzIG9mIDAuNU1icHMgKi8KKwl1bnNpZ25lZCBsb25nIENoYW5uZWxRdWFsaXR5OwkvKiAwLi4xMDAgJSAqLworCXVuc2lnbmVkIGxvbmcgVHhCeXRlQ291bnQ7CS8qIGJvdGggb2sgYW5kIGZhaWwgKi8KKwl1bnNpZ25lZCBsb25nIFJ4Qnl0ZUNvdW50OwkvKiBib3RoIG9rIGFuZCBmYWlsICovCisJdW5zaWduZWQgbG9uZyBDZW50cmFsQ2hhbm5lbDsJLyogNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlciAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9FVkVOVF9MT0cgewotICAgIExBUkdFX0lOVEVHRVIgICBTeXN0ZW1UaW1lOyAgLy8gdGltZXN0YW1tcCB2aWEgTmRpc0dldEN1cnJlbnRTeXN0ZW1UaW1lKCkKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOwotICAgIFVTSE9SVCAgICAgICAgICBFdmVudDsgICAgICAgLy8gRVZFTlRfeHh4Ci19IFJUXzgwMl8xMV9FVkVOVF9MT0csICpQUlRfODAyXzExX0VWRU5UX0xPRzsKK3N0cnVjdCBydF84MDJfMTFfZXZlbnRfbG9nIHsKKwlMQVJHRV9JTlRFR0VSIFN5c3RlbVRpbWU7CS8qIHRpbWVzdGFtbXAgdmlhIE5kaXNHZXRDdXJyZW50U3lzdGVtVGltZSgpICovCisJdTggQWRkcltNQUNfQUREUl9MRU5HVEhdOworCXUxNiBFdmVudDsJCS8qIEVWRU5UX3h4eCAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9FVkVOVF9UQUJMRSB7Ci0gICAgVUxPTkcgICAgICAgTnVtOwotICAgIFVMT05HICAgICAgIFJzdjsgICAgIC8vIHRvIGFsaWduIExvZ1tdIGF0IExBUkdFX0lORUdFUiBib3VuZGFyeQotICAgIFJUXzgwMl8xMV9FVkVOVF9MT0cgICBMb2dbTUFYX05VTUJFUl9PRl9FVkVOVF07Ci19IFJUXzgwMl8xMV9FVkVOVF9UQUJMRSwgUFJUXzgwMl8xMV9FVkVOVF9UQUJMRTsKK3N0cnVjdCBydF84MDJfMTFfZXZlbnRfdGFibGUgeworCXVuc2lnbmVkIGxvbmcgTnVtOworCXVuc2lnbmVkIGxvbmcgUnN2OwkJLyogdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5ICovCisJc3RydWN0IHJ0XzgwMl8xMV9ldmVudF9sb2cgTG9nW01BWF9OVU1CRVJfT0ZfRVZFTlRdOworfTsKIAotLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJLiBEb24ndCBjaGFuZ2UgdGhpcyBkZWZpbml0aW9uISEhCi10eXBlZGVmIHVuaW9uICBfTUFDSFRUUkFOU01JVF9TRVRUSU5HIHsKLQlzdHJ1Y3QJewotCVVTSE9SVCAgIAlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQlVU0hPUlQJCVNob3J0R0k6MTsKLQlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQotCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotCX0JZmllbGQ7Ci0JVVNIT1JUCQl3b3JkOwotIH0gTUFDSFRUUkFOU01JVF9TRVRUSU5HLCAqUE1BQ0hUVFJBTlNNSVRfU0VUVElORzsKKy8qIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEgKi8KK3R5cGVkZWYgdW5pb24gX01BQ0hUVFJBTlNNSVRfU0VUVElORyB7CisJc3RydWN0IHsKKwkJdTE2IE1DUzo3OwkvKiBNQ1MgKi8KKwkJdTE2IEJXOjE7CS8qY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6ICovCisJCXUxNiBTaG9ydEdJOjE7CisJCXUxNiBTVEJDOjI7CS8qU1BBQ0UgKi8KKwkJdTE2IHJzdjozOworCQl1MTYgTU9ERToyOwkvKiBVc2UgZGVmaW5pdGlvbiBNT0RFX3h4eC4gKi8KKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBNQUNIVFRSQU5TTUlUX1NFVFRJTkcsICpQTUFDSFRUUkFOU01JVF9TRVRUSU5HOwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19FTlRSWSB7Ci0gICAgVUNIQVIgICAgICAgQWRkcltNQUNfQUREUl9MRU5HVEhdOwotICAgIFVDSEFSICAgICAgIEFpZDsKLSAgICBVQ0hBUiAgICAgICBQc207ICAgICAvLyAwOlBXUl9BQ1RJVkUsIDE6UFdSX1NBVkUKLSAgICBVQ0hBUgkJTWltb1BzOyAgLy8gMDpNTVBTX1NUQVRJQywgMTpNTVBTX0RZTkFNSUMsIDM6TU1QU19FbmFibGVkCi0gICAgQ0hBUgkJQXZnUnNzaTA7Ci0JQ0hBUgkJQXZnUnNzaTE7Ci0JQ0hBUgkJQXZnUnNzaTI7Ci0JVUlOVDMyCQlDb25uZWN0ZWRUaW1lOwotICAgIE1BQ0hUVFJBTlNNSVRfU0VUVElORwlUeFJhdGU7Ci19IFJUXzgwMl8xMV9NQUNfRU5UUlksICpQUlRfODAyXzExX01BQ19FTlRSWTsKK3N0cnVjdCBydF84MDJfMTFfbWFjX2VudHJ5IHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTkdUSF07CisJdTggQWlkOworCXU4IFBzbTsJCS8qIDA6UFdSX0FDVElWRSwgMTpQV1JfU0FWRSAqLworCXU4IE1pbW9QczsJCS8qIDA6TU1QU19TVEFUSUMsIDE6TU1QU19EWU5BTUlDLCAzOk1NUFNfRW5hYmxlZCAqLworCWNoYXIgQXZnUnNzaTA7CisJY2hhciBBdmdSc3NpMTsKKwljaGFyIEF2Z1Jzc2kyOworCXUzMiBDb25uZWN0ZWRUaW1lOworCU1BQ0hUVFJBTlNNSVRfU0VUVElORyBUeFJhdGU7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX01BQ19UQUJMRSB7Ci0gICAgVUxPTkcgICAgICAgTnVtOwotICAgIFJUXzgwMl8xMV9NQUNfRU5UUlkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOwotfSBSVF84MDJfMTFfTUFDX1RBQkxFLCAqUFJUXzgwMl8xMV9NQUNfVEFCTEU7CitzdHJ1Y3QgcnRfODAyXzExX21hY190YWJsZSB7CisJdW5zaWduZWQgbG9uZyBOdW07CisJc3RydWN0IHJ0XzgwMl8xMV9tYWNfZW50cnkgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOworfTsKIAotLy8gc3RydWN0dXJlIGZvciBxdWVyeS9zZXQgaGFyZHdhcmUgcmVnaXN0ZXIgLSBNQUMsIEJCUCwgUkYgcmVnaXN0ZXIKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIgewotICAgIFVMT05HICAgSGFyZHdhcmVUeXBlOyAgICAgICAvLyAwOk1BQywgMTpCQlAsIDI6UkYgcmVnaXN0ZXIsIDM6RUVQUk9NCi0gICAgVUxPTkcgICBPZmZzZXQ7ICAgICAgICAgICAgIC8vIFEvUyByZWdpc3RlciBvZmZzZXQgYWRkcgotICAgIFVMT05HICAgRGF0YTsgICAgICAgICAgICAgICAvLyBSL1cgZGF0YSBidWZmZXIKLX0gUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSLCAqUFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUjsKKy8qIHN0cnVjdHVyZSBmb3IgcXVlcnkvc2V0IGhhcmR3YXJlIHJlZ2lzdGVyIC0gTUFDLCBCQlAsIFJGIHJlZ2lzdGVyICovCitzdHJ1Y3QgcnRfODAyXzExX2hhcmR3YXJlX3JlZ2lzdGVyIHsKKwl1bnNpZ25lZCBsb25nIEhhcmR3YXJlVHlwZTsJLyogMDpNQUMsIDE6QkJQLCAyOlJGIHJlZ2lzdGVyLCAzOkVFUFJPTSAqLworCXVuc2lnbmVkIGxvbmcgT2Zmc2V0OwkJLyogUS9TIHJlZ2lzdGVyIG9mZnNldCBhZGRyICovCisJdW5zaWduZWQgbG9uZyBEYXRhOwkJLyogUi9XIGRhdGEgYnVmZmVyICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FQX0NPTkZJRyB7Ci0gICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKLSAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKLSAgICBVTE9ORyAgIElzb2xhdGVJbnRlclN0YVRyYWZmaWM7ICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIGlzb2xhdGlvbgotICAgIFVMT05HICAgSGlkZVNzaWQ7ICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlIGhpZGluZwotICAgIFVMT05HICAgVXNlQkdQcm90ZWN0aW9uOyAgICAvLyAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYKLSAgICBVTE9ORyAgIFVzZVNob3J0U2xvdFRpbWU7ICAgLy8gMC1ubyB1c2UsIDEtdXNlIDktdXMgc2hvcnQgc2xvdCB0aW1lCi0gICAgVUxPTkcgICBSc3YxOyAgICAgICAgICAgICAgIC8vIG11c3QgYmUgMAotICAgIFVMT05HICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAvLyBpZ25vcmUgdXBvbiBTRVQsIHJldHVybiBzeXN0ZW0gZXJyb3IgdXBvbiBRVUVSWQotfSBSVF84MDJfMTFfQVBfQ09ORklHLCAqUFJUXzgwMl8xMV9BUF9DT05GSUc7CitzdHJ1Y3QgcnRfODAyXzExX2FwX2NvbmZpZyB7CisJdW5zaWduZWQgbG9uZyBFbmFibGVUeEJ1cnN0OwkvKiAwLWRpc2FibGUsIDEtZW5hYmxlICovCisJdW5zaWduZWQgbG9uZyBFbmFibGVUdXJib1JhdGU7CS8qIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlICovCisJdW5zaWduZWQgbG9uZyBJc29sYXRlSW50ZXJTdGFUcmFmZmljOwkvKiAwLWRpc2FibGUsIDEtZW5hYmxlIGlzb2xhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgSGlkZVNzaWQ7CQkvKiAwLWRpc2FibGUsIDEtZW5hYmxlIGhpZGluZyAqLworCXVuc2lnbmVkIGxvbmcgVXNlQkdQcm90ZWN0aW9uOwkvKiAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYgKi8KKwl1bnNpZ25lZCBsb25nIFVzZVNob3J0U2xvdFRpbWU7CS8qIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSAqLworCXVuc2lnbmVkIGxvbmcgUnN2MTsJCS8qIG11c3QgYmUgMCAqLworCXVuc2lnbmVkIGxvbmcgU3lzdGVtRXJyb3JCaXRtYXA7CS8qIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZICovCit9OwogCi0vLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7Ci0gICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKLSAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKLSAgICBVTE9ORyAgIEFkaG9jTW9kZTsgCQkJLy8gMC0xMWIgcmF0ZXMgb25seSAoV0lGSSBzcGVjKSwgMSAtIGIvZyBtaXhlZCwgMiAtIGcgb25seQotICAgIFVMT05HICAgSHdSYWRpb1N0YXR1czsgICAgICAvLyAwLU9GRiwgMS1PTiwgZGVmYXVsdCBpcyAxLCBSZWFkLU9ubHkKLSAgICBVTE9ORyAgIFJzdjE7ICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwCi0gICAgVUxPTkcgICBTeXN0ZW1FcnJvckJpdG1hcDsgIC8vIGlnbm9yZSB1cG9uIFNFVCwgcmV0dXJuIHN5c3RlbSBlcnJvciB1cG9uIFFVRVJZCi19IFJUXzgwMl8xMV9TVEFfQ09ORklHLCAqUFJUXzgwMl8xMV9TVEFfQ09ORklHOworLyogc3RydWN0dXJlIHRvIHF1ZXJ5L3NldCBTVEFfQ09ORklHICovCitzdHJ1Y3QgcnRfODAyXzExX3N0YV9jb25maWcgeworCXVuc2lnbmVkIGxvbmcgRW5hYmxlVHhCdXJzdDsJLyogMC1kaXNhYmxlLCAxLWVuYWJsZSAqLworCXVuc2lnbmVkIGxvbmcgRW5hYmxlVHVyYm9SYXRlOwkvKiAwLWRpc2FibGUsIDEtZW5hYmxlIDcyLzEwMG1icHMgdHVyYm8gcmF0ZSAqLworCXVuc2lnbmVkIGxvbmcgVXNlQkdQcm90ZWN0aW9uOwkvKiAwLUFVVE8sIDEtYWx3YXlzIE9OLCAyLWFsd2F5cyBPRkYgKi8KKwl1bnNpZ25lZCBsb25nIFVzZVNob3J0U2xvdFRpbWU7CS8qIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUgKi8KKwl1bnNpZ25lZCBsb25nIEFkaG9jTW9kZTsJLyogMC0xMWIgcmF0ZXMgb25seSAoV0lGSSBzcGVjKSwgMSAtIGIvZyBtaXhlZCwgMiAtIGcgb25seSAqLworCXVuc2lnbmVkIGxvbmcgSHdSYWRpb1N0YXR1czsJLyogMC1PRkYsIDEtT04sIGRlZmF1bHQgaXMgMSwgUmVhZC1Pbmx5ICovCisJdW5zaWduZWQgbG9uZyBSc3YxOwkJLyogbXVzdCBiZSAwICovCisJdW5zaWduZWQgbG9uZyBTeXN0ZW1FcnJvckJpdG1hcDsJLyogaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkgKi8KK307CiAKLS8vCi0vLyAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlCi0vLwotdHlwZWRlZglzdHJ1Y3QJX09JRF9CQUNBUF9TVFJVQwl7Ci0JCVVDSEFSCQlSeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlUeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlQb2xpY3k7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKLQkJVUNIQVIJCU1wZHVEZW5zaXR5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCi0JCVVDSEFSICAgICAgIAlBbXNkdUVuYWJsZTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVQ0hBUiAgICAgICAJQW1zZHVTaXplOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVQ0hBUiAgICAgICAJTU1QU21vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlCT09MRUFOCQlBdXRvQkE7CS8vIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5Ci19IE9JRF9CQUNBUF9TVFJVQywgKlBPSURfQkFDQVBfU1RSVUM7CisvKiAqLworLyogIEZvciBPSUQgUXVlcnkgb3IgU2V0IGFib3V0IEJBIHN0cnVjdHVyZSAqLworLyogKi8KK3N0cnVjdCBydF9vaWRfYmFjYXAgeworCXU4IFJ4QkFXaW5MaW1pdDsKKwl1OCBUeEJBV2luTGltaXQ7CisJdTggUG9saWN5OwkJLyogMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZS4gb3RoZXIgdmFsdWUgaW52YWxpZCAqLworCXU4IE1wZHVEZW5zaXR5OwkvKiAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkICovCisJdTggQW1zZHVFbmFibGU7CS8qRW5hYmxlIEFNU0RVIHRyYW5zbWlzc3Rpb24gKi8KKwl1OCBBbXNkdVNpemU7CS8qIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiB1MzIgIE1TRFVTaXplVG9CeXRlc1tdICAgICAgICA9IHsgMzgzOSwgNzkzNX07ICovCisJdTggTU1QU21vZGU7CQkvKiBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUgKi8KKwlCT09MRUFOIEF1dG9CQTsJCS8qIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5ICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0FDTF9FTlRSWSB7Ci0gICAgVUNIQVIgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVVNIT1JUICBSc3Y7Ci19IFJUXzgwMl8xMV9BQ0xfRU5UUlksICpQUlRfODAyXzExX0FDTF9FTlRSWTsKK3N0cnVjdCBydF84MDJfMTFfYWNsX2VudHJ5IHsKKwl1OCBBZGRyW01BQ19BRERSX0xFTkdUSF07CisJdTE2IFJzdjsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX0FDTCB7Ci0gICAgVUxPTkcgICBQb2xpY3k7ICAgICAgICAgICAgIC8vIDAtZGlzYWJsZSwgMS1wb3NpdGl2ZSBsaXN0LCAyLW5lZ2F0aXZlIGxpc3QKLSAgICBVTE9ORyAgIE51bTsKLSAgICBSVF84MDJfMTFfQUNMX0VOVFJZIEVudHJ5W01BWF9OVU1CRVJfT0ZfQUNMXTsKLX0gUlRfODAyXzExX0FDTCwgKlBSVF84MDJfMTFfQUNMOworc3RydWN0IFBBQ0tFRCBydF9ydF84MDJfMTFfYWNsIHsKKwl1bnNpZ25lZCBsb25nIFBvbGljeTsJCS8qIDAtZGlzYWJsZSwgMS1wb3NpdGl2ZSBsaXN0LCAyLW5lZ2F0aXZlIGxpc3QgKi8KKwl1bnNpZ25lZCBsb25nIE51bTsKKwlzdHJ1Y3QgcnRfODAyXzExX2FjbF9lbnRyeSBFbnRyeVtNQVhfTlVNQkVSX09GX0FDTF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1dEUyB7Ci0gICAgVUxPTkcJCQkJCQlOdW07Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCUVudHJ5WzI0LypNQVhfTlVNX09GX1dEU19MSU5LKi9dOwotCVVMT05HCQkJCQkJS2V5TGVuZ3RoOwotCVVDSEFSCQkJCQkJS2V5TWF0ZXJpYWxbMzJdOwotfSBSVF84MDJfMTFfV0RTLCAqUFJUXzgwMl8xMV9XRFM7CitzdHJ1Y3QgcnRfODAyXzExX3dkcyB7CisJdW5zaWduZWQgbG9uZyBOdW07CisJTkRJU184MDJfMTFfTUFDX0FERFJFU1MgRW50cnlbMjQgLypNQVhfTlVNX09GX1dEU19MSU5LICovIF07CisJdW5zaWduZWQgbG9uZyBLZXlMZW5ndGg7CisJdTggS2V5TWF0ZXJpYWxbMzJdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9UWF9SQVRFU18gewotICAgIFVDSEFSICAgICAgIFN1cFJhdGVMZW47Ci0gICAgVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOwotICAgIFVDSEFSICAgICAgIEV4dFJhdGVMZW47Ci0gICAgVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVNdOwotfSBSVF84MDJfMTFfVFhfUkFURVMsICpQUlRfODAyXzExX1RYX1JBVEVTOworc3RydWN0IHJ0XzgwMl8xMV90eF9yYXRlcyB7CisJdTggU3VwUmF0ZUxlbjsKKwl1OCBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107CisJdTggRXh0UmF0ZUxlbjsKKwl1OCBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Cit9OwogCi0KLS8vIERlZmluaXRpb24gb2YgZXh0cmEgaW5mb3JtYXRpb24gY29kZQotI2RlZmluZQlHRU5FUkFMX0xJTktfVVAJCQkweDAJCQkvLyBMaW5rIGlzIFVwCi0jZGVmaW5lCUdFTkVSQUxfTElOS19ET1dOCQkweDEJCQkvLyBMaW5rIGlzIERvd24KLSNkZWZpbmUJSFdfUkFESU9fT0ZGCQkJMHgyCQkJLy8gSGFyZHdhcmUgcmFkaW8gb2ZmCi0jZGVmaW5lCVNXX1JBRElPX09GRgkJCTB4MwkJCS8vIFNvZnR3YXJlIHJhZGlvIG9mZgotI2RlZmluZQlBVVRIX0ZBSUwJCQkJMHg0CQkJLy8gT3BlbiBhdXRoZW50aWNhdGlvbiBmYWlsCi0jZGVmaW5lCUFVVEhfRkFJTF9LRVlTCQkJMHg1CQkJLy8gU2hhcmVkIGF1dGhlbnRpY2F0aW9uIGZhaWwKLSNkZWZpbmUJQVNTT0NfRkFJTAkJCQkweDYJCQkvLyBBc3NvY2lhdGlvbiBmYWlsZWQKLSNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CQkJLy8gRGVhdXRoZW5jYXRpb24gYmVjYXVzZSBNSUMgZmFpbHVyZQotI2RlZmluZQlFQVBfNFdBWV9USU1FT1VUCQkweDgJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiA0LXdheSBoYW5kc2hha2UgdGltZW91dAotI2RlZmluZQlFQVBfR1JPVVBfS0VZX1RJTUVPVVQJMHg5CQkJLy8gRGVhdXRoZW5jYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0Ci0jZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkJCS8vIEVBUCBzdWNjZWVkCi0jZGVmaW5lCURFVEVDVF9SQURBUl9TSUdOQUwJCTB4YiAgICAgICAgIC8vIFJhZGFyIHNpZ25hbCBvY2N1ciBpbiBjdXJyZW50IGNoYW5uZWwKLSNkZWZpbmUgRVhUUkFfSU5GT19NQVgJCQkweGIJCQkvLyBJbmRpY2F0ZSBMYXN0IE9JRAorLyogRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlICovCisjZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkvKiBMaW5rIGlzIFVwICovCisjZGVmaW5lCUdFTkVSQUxfTElOS19ET1dOCQkweDEJLyogTGluayBpcyBEb3duICovCisjZGVmaW5lCUhXX1JBRElPX09GRgkJCTB4MgkvKiBIYXJkd2FyZSByYWRpbyBvZmYgKi8KKyNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCS8qIFNvZnR3YXJlIHJhZGlvIG9mZiAqLworI2RlZmluZQlBVVRIX0ZBSUwJCQkJMHg0CS8qIE9wZW4gYXV0aGVudGljYXRpb24gZmFpbCAqLworI2RlZmluZQlBVVRIX0ZBSUxfS0VZUwkJCTB4NQkvKiBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbCAqLworI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkvKiBBc3NvY2lhdGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUJRUFQX01JQ19GQUlMVVJFCQkJMHg3CS8qIERlYXV0aGVuY2F0aW9uIGJlY2F1c2UgTUlDIGZhaWx1cmUgKi8KKyNkZWZpbmUJRUFQXzRXQVlfVElNRU9VVAkJMHg4CS8qIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0ICovCisjZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJLyogRGVhdXRoZW5jYXRpb24gb24gZ3JvdXAga2V5IGhhbmRzaGFrZSB0aW1lb3V0ICovCisjZGVmaW5lCUVBUF9TVUNDRVNTCQkJCTB4YQkvKiBFQVAgc3VjY2VlZCAqLworI2RlZmluZQlERVRFQ1RfUkFEQVJfU0lHTkFMCQkweGIJLyogUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbCAqLworI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkvKiBJbmRpY2F0ZSBMYXN0IE9JRCAqLwogCiAjZGVmaW5lIEVYVFJBX0lORk9fQ0xFQVIJCTB4ZmZmZmZmZmYKIAotLy8gVGhpcyBpcyBPSUQgc2V0dGluZyBzdHJ1Y3R1cmUuIFNvIG9ubHkgR0Ygb3IgTU0gYXMgTW9kZS4gVGhpcyBpcyB2YWxpZCB3aGVuIG91ciB3aXJlbHNzIG1vZGUgaGFzIDgwMi4xMW4gaW4gdXNlLgotdHlwZWRlZiBzdHJ1Y3QgewotCVJUXzgwMl8xMV9QSFlfTU9ERQkJUGh5TW9kZTsgCS8vCi0JVUNIQVIJCVRyYW5zbWl0Tm87Ci0JVUNIQVIJCUh0TW9kZTsgCS8vSFRNT0RFX0dGIG9yIEhUTU9ERV9NTQotCVVDSEFSCQlFeHRPZmZzZXQ7CS8vZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgb3IgYmVsb3cKLQlVQ0hBUgkJTUNTOwotCVVDSEFSICAgCUJXOwotCVVDSEFSCQlTVEJDOwotCVVDSEFSCQlTSE9SVEdJOwotCVVDSEFSCQlyc3Y7Ci19IE9JRF9TRVRfSFRfUEhZTU9ERSwgKlBPSURfU0VUX0hUX1BIWU1PREU7Ci0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLXR5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZIHsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotICAgIHVuc2lnbmVkIHNob3J0ICBNT1I7ICAgICAgICAvLyBtYXhpbXVtIG9wZXJhdGlvbmFsIHJhdGUKLSAgICBVQ0hBUiAgICAgICAgICAgcGh5TW9kZTsKLX0gUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSB7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIE51bTsKLSAgICBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZICAgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOwotfSBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEU7Ci0jZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCisvKiBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuICovCitzdHJ1Y3QgcnRfb2lkX3NldF9odF9waHltb2RlIHsKKwlSVF84MDJfMTFfUEhZX01PREUgUGh5TW9kZTsJLyogKi8KKwl1OCBUcmFuc21pdE5vOworCXU4IEh0TW9kZTsJCS8qSFRNT0RFX0dGIG9yIEhUTU9ERV9NTSAqLworCXU4IEV4dE9mZnNldDsJLypleHRlbnNpb24gY2hhbm5lbCBhYm92ZSBvciBiZWxvdyAqLworCXU4IE1DUzsKKwl1OCBCVzsKKwl1OCBTVEJDOworCXU4IFNIT1JUR0k7CisJdTggcnN2OworfTsKIAogI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiAxMjgKIAotdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRF9DTElFTlRfTU9ERQotewotICAgUnQ4MDJfMTFfRF9Ob25lLAotICAgUnQ4MDJfMTFfRF9GbGV4aWJsZSwKLSAgIFJ0ODAyXzExX0RfU3RyaWN0LAordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfRF9DTElFTlRfTU9ERSB7CisJUnQ4MDJfMTFfRF9Ob25lLAorCVJ0ODAyXzExX0RfRmxleGlibGUsCisJUnQ4MDJfMTFfRF9TdHJpY3QsCiB9IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOwogCi10eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KLXsKLQlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQotCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCi19IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOworc3RydWN0IHJ0X2NoYW5uZWxfbGlzdF9pbmZvIHsKKwl1OCBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107CS8qIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkgKi8KKwl1OCBDaGFubmVsTGlzdE51bTsJLyogbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXSAqLworfTsKIAotI2lmZGVmIFJUMjg3MAotLy8gV1NDIGNvbmZpZ3VyZWQgY3JlZGVudGlhbAotdHlwZWRlZglzdHJ1Y3QJX1dTQ19DUkVERU5USUFMCi17Ci0JTkRJU184MDJfMTFfU1NJRAlTU0lEOwkJCQkvLyBtYW5kYXRvcnkKLQlVU0hPUlQJCQkJQXV0aFR5cGU7CQkJLy8gbWFuZGF0b3J5LCAxOiBvcGVuLCAyOiB3cGEtcHNrLCA0OiBzaGFyZWQsIDg6d3BhLCAweDEwOiB3cGEyLCAweDIwOiB3cGEyLXBzawotCVVTSE9SVAkJCQlFbmNyVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG5vbmUsIDI6IHdlcCwgNDogdGtpcCwgODogYWVzCi0JVUNIQVIJCQkJS2V5WzY0XTsJCQkvLyBtYW5kYXRvcnksIE1heGltdW0gNjQgYnl0ZQotCVVTSE9SVAkJCQlLZXlMZW5ndGg7Ci0JVUNIQVIJCQkJTWFjQWRkcls2XTsJCQkvLyBtYW5kYXRvcnksIEFQIE1BQyBhZGRyZXNzCi0JVUNIQVIJCQkJS2V5SW5kZXg7CQkJLy8gb3B0aW9uYWwsIGRlZmF1bHQgaXMgMQotCVVDSEFSCQkJCVJzdmRbM107CQkJLy8gTWFrZSBhbGlnbm1lbnQKLX0JV1NDX0NSRURFTlRJQUwsICpQV1NDX0NSRURFTlRJQUw7CisvKiBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsICovCitzdHJ1Y3QgcnRfd3NjX2NyZWRlbnRpYWwgeworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9zc2lkIFNTSUQ7CS8qIG1hbmRhdG9yeSAqLworCXUxNiBBdXRoVHlwZTsJLyogbWFuZGF0b3J5LCAxOiBvcGVuLCAyOiB3cGEtcHNrLCA0OiBzaGFyZWQsIDg6d3BhLCAweDEwOiB3cGEyLCAweDIwOiB3cGEyLXBzayAqLworCXUxNiBFbmNyVHlwZTsJLyogbWFuZGF0b3J5LCAxOiBub25lLCAyOiB3ZXAsIDQ6IHRraXAsIDg6IGFlcyAqLworCXU4IEtleVs2NF07CQkvKiBtYW5kYXRvcnksIE1heGltdW0gNjQgYnl0ZSAqLworCXUxNiBLZXlMZW5ndGg7CisJdTggTWFjQWRkcls2XTsJLyogbWFuZGF0b3J5LCBBUCBNQUMgYWRkcmVzcyAqLworCXU4IEtleUluZGV4OwkJLyogb3B0aW9uYWwsIGRlZmF1bHQgaXMgMSAqLworCXU4IFJzdmRbM107CQkvKiBNYWtlIGFsaWdubWVudCAqLworfTsKIAotLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKLXR5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQotewotCVVJTlQJCQlQcm9maWxlQ250OwotCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcwotfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKLSNlbmRpZgorLyogV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMgKi8KK3N0cnVjdCBydF93c2NfcHJvZmlsZSB7CisJdTMyIFByb2ZpbGVDbnQ7CisJdTMyIEFwcGx5UHJvZmlsZUlkeDsJLyogYWRkIGJ5IGpvaG5saSwgZml4IFdQUyB0ZXN0IHBsYW4gNS4xLjEgKi8KKwlzdHJ1Y3QgcnRfd3NjX2NyZWRlbnRpYWwgUHJvZmlsZVs4XTsJLyogU3VwcG9ydCB1cCB0byA4IHByb2ZpbGVzICovCit9OwogCi0jZW5kaWYgLy8gX09JRF9IXwotCisjZW5kaWYgLyogX09JRF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9wY2lfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcGNpX21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmNDMwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcGNpX21haW5fZGV2LmMKQEAgLTAsMCArMSwxMTkwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE1vZHVsZSBOYW1lOgorICAgIHBjaV9tYWluX2Rldi5jCisKKyAgICBBYnN0cmFjdDoKKyAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlIGZvciBQQ0kgYmFzZWQgY2hpcHNldHMgaW4gTGludXggcGxhdGZvcm0uCisKKyAgICBSZXZpc2lvbiBIaXN0b3J5OgorICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0CisgICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCisvKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KKy8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KK01PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDI4NjAvUlQzMDkwIFdpcmVsZXNzIExhbiBMaW51eCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicnQzMDkwc3RhIik7CisKKy8qICovCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KKy8qICovCitleHRlcm4gaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitleHRlcm4gaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19leGl0IHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKK3N0YXRpYyBpbnQgX19pbml0IHJ0Mjg2MF9pbml0X21vZHVsZSh2b2lkKTsKKworc3RhdGljIHZvaWQgUlRNUEluaXRQQ0llRGV2aWNlKElOIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJICAgICAgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpOworI2VuZGlmIC8qIENPTkZJR19QTSAvLyAqLworCisvKiAqLworLyogUmFsaW5rIFBDSSBkZXZpY2UgdGFibGUsIGluY2x1ZGUgYWxsIHN1cHBvcnRlZCBjaGlwc2V0cyAqLworLyogKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBydDI4NjBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisjaWZkZWYgUlQyODYwCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzI4NjBfUENJX0RFVklDRV9JRCl9LAkvKlJUMjg2MDIuNEcgKi8KKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjg2MF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMyNzYwX1BDSV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMjc5MF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKFZFTl9BV1RfUENJX1ZFTkRPUl9JRCwgVkVOX0FXVF9QQ0llX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MDgpfSwKKwl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzI4KX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc1OCl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3MjcpfSwKKwl7UENJX0RFVklDRShFRElNQVhfUENJX1ZFTkRPUl9JRCwgMHg3NzM4KX0sCisJe1BDSV9ERVZJQ0UoRURJTUFYX1BDSV9WRU5ET1JfSUQsIDB4Nzc0OCl9LAorCXtQQ0lfREVWSUNFKEVESU1BWF9QQ0lfVkVORE9SX0lELCAweDc3NjgpfSwKKyNlbmRpZgorI2lmZGVmIFJUMzA5MAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMDkwX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzA5Ml9QQ0llX0RFVklDRV9JRCl9LAorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworI2lmZGVmIFJUMzM5MAorCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMzkwX1BDSWVfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMzOTFfUENJZV9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzM5Ml9QQ0llX0RFVklDRV9JRCl9LAorI2VuZGlmIC8qIFJUMzM5MCAvLyAqLworCXswLH0JCQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0Mjg2MF9wY2lfdGJsKTsKKyNpZmRlZiBNT0RVTEVfVkVSU0lPTgorTU9EVUxFX1ZFUlNJT04oU1RBX0RSSVZFUl9WRVJTSU9OKTsKKyNlbmRpZgorCisvKiAqLworLyogT3VyIFBDSSBkcml2ZXIgc3RydWN0dXJlICovCisvKiAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0Mjg2MF9kcml2ZXIgPSB7CituYW1lOgkicnQyODYwIiwKK2lkX3RhYmxlOnJ0Mjg2MF9wY2lfdGJsLAorcHJvYmU6CXJ0Mjg2MF9wcm9iZSwKK3JlbW92ZTpfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCitzdXNwZW5kOnJ0Mjg2MF9zdXNwZW5kLAorcmVzdW1lOnJ0Mjg2MF9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglQQ0kgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19QTQorCit2b2lkIFJUMjg2MFJlamVjdFBlbmRpbmdQYWNrZXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwkvKiBjbGVhciBQUyBwYWNrZXRzICovCisJLyogY2xlYXIgVHhTdyBwYWNrZXRzICovCit9CisKK3N0YXRpYyBpbnQgcnQyODYwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKU5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKKworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgibmV0X2RldiA9PSBOVUxMIVxuIikpOworCX0gZWxzZSB7CisJCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLworCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KKwkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KKwkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKSB7CisJCQkvKiBhdm9pZCB1c2VycyBkbyBzdXNwZW5kIGFmdGVyIGludGVyZmFjZSBpcyBkb3duICovCisKKwkJCS8qIHN0b3AgaW50ZXJmYWNlICovCisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisKKwkJCS8qIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlICovCisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOworCisJCQkvKiBtYXJrIGhhbHQgZmxhZyAqLworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOworCisJCQkvKiB0YWtlIGRvd24gdGhlIGRldmljZSAqLworCQkJcnQyOHh4X2Nsb3NlKChzdHJ1Y3QgbmV0X2RldmljZSAqKW5ldF9kZXYpOworCisJCQlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOworCQl9CisJfQorCisJLyogcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwgKi8KKwkvKiBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQgKi8KKwkvKiBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZCAqLworCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7CisJLyogc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcgKi8KKwlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKKwkvKiBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOworCisJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9zdXNwZW5kKClcbiIpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJ0Mjg2MF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilOVUxMOworCWludCByZXR2YWw7CisKKwkvKiBzZXQgdGhlIHBvd2VyIHN0YXRlIG9mIGEgUENJIGRldmljZSAqLworCS8qIFBDSSBoYXMgNCBwb3dlciBzdGF0ZXMsIERPIChub3JtYWwpIH4gRDMobGVzcyBwb3dlcikgKi8KKwkvKiBpbiBpbmNsdWRlL2xpbnV4L3BjaS5oLCB5b3UgY2FuIGZpbmQgdGhhdCAqLworCS8qICNkZWZpbmUgUENJX0QwICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMCkgKi8KKwkvKiAjZGVmaW5lIFBDSV9EMSAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDEpICovCisJLyogI2RlZmluZSBQQ0lfRDIgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAyKSAqLworCS8qICNkZWZpbmUgUENJX0QzaG90ICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMykgKi8KKwkvKiAjZGVmaW5lIFBDSV9EM2NvbGQgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDQpICovCisJLyogI2RlZmluZSBQQ0lfVU5LTk9XTiAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA1KSAqLworCS8qICNkZWZpbmUgUENJX1BPV0VSX0VSUk9SICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgLTEpICovCisJcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBQQ0lfRDApOworCisJLyogcmVzdG9yZSB0aGUgc2F2ZWQgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlICovCisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisKKwkvKiBpbml0aWFsaXplIGRldmljZSBiZWZvcmUgaXQncyB1c2VkIGJ5IGEgZHJpdmVyICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKSB7CisJCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7CisJCXJldHVybiAwOworCX0KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3Jlc3VtZSgpXG4iKSk7CisKKwlpZiAobmV0X2RldiA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKKwl9IGVsc2UKKwkJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCWlmIChwQWQgIT0gTlVMTCkgeworCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCisJCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLworCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLworCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApIHsKKwkJCS8qIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZCAqLworCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKKworCQkJaWYgKHJ0Mjh4eF9vcGVuKChzdHJ1Y3QgbmV0X2RldmljZSAqKW5ldF9kZXYpICE9IDApIHsKKwkJCQkvKiBvcGVuIGZhaWwgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiPD09PSBydDI4NjBfcmVzdW1lKClcbiIpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQgKi8KKwkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7CisKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CisJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7CisKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisJCX0KKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAvLyAqLworCitzdGF0aWMgaW50IF9faW5pdCBydDI4NjBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnQyODYwX2RyaXZlcik7Cit9CisKKy8qICovCisvKiBEcml2ZXIgbW9kdWxlIHVubG9hZCBmdW5jdGlvbiAqLworLyogKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJ0Mjg2MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChydDI4NjBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocnQyODYwX2NsZWFudXBfbW9kdWxlKTsKKworLyogKi8KKy8qIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLworLyogKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg2MF9wcm9iZShJTiBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgIElOIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXZvaWQgKmhhbmRsZTsKKwljaGFyICpwcmludF9uYW1lOworCXVuc2lnbmVkIGxvbmcgY3NyX2FkZHI7CisJaW50IHJ2ID0gMDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc19uZXRkZXZfb3BfaG9vayBuZXREZXZIb29rOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcHJvYmVcbiIpKTsKKworLypQQ0lEZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCS8qIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UgKi8KKwlpZiAoKHJ2ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJFbmFibGUgUENJIGRldmljZSBmYWlsZWQsIGVycm5vPSVkIVxuIiwgcnYpKTsKKwkJcmV0dXJuIHJ2OworCX0KKworCXByaW50X25hbWUgPSAoY2hhciAqKXBjaV9uYW1lKHBjaV9kZXYpOworCisJaWYgKChydiA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldiwgcHJpbnRfbmFtZSkpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSZXF1ZXN0IFBDSSByZXNvdXJjZSBmYWlsZWQsIGVycm5vPSVkIVxuIiwgcnYpKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyByZWdpc3RlciAqLworCWNzcl9hZGRyID0KKwkgICAgKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisJCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisJaWYgKCFjc3JfYWRkcikgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoImlvcmVtYXAgZmFpbGVkIGZvciBkZXZpY2UgJXMsIHJlZ2lvbiAweCVsWCBAIDB4JWxYXG4iLAorCQkJICBwcmludF9uYW1lLCAodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApLAorCQkJICAodW5zaWduZWQgbG9uZylwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCkpKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6IGF0IDB4JWx4LCBWQSAweCVseCwgSVJRICVkLiBcbiIsIHByaW50X25hbWUsCisJCQkgICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKKwkJCSAgKHVuc2lnbmVkIGxvbmcpY3NyX2FkZHIsIHBjaV9kZXYtPmlycSkpOworCX0KKworCS8qIFNldCBETUEgbWFzdGVyICovCisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKy8qUnRtcERldkluaXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJLyogQWxsb2NhdGUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBhZGFwdGVyIHN0cnVjdHVyZSAqLworCWhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19jb29raWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcygpOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG9zIGhhbmRsZSBmYWlsZWQhXG4iLAorCQkJICBfX2Z1bmNfXykpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkoKHN0cnVjdCBvc19jb29raWUgKiloYW5kbGUpLT5wY2lfZGV2ID0gcGNpX2RldjsKKworCXJ2ID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7CS8qc2hpYW5nOiB3ZSBtYXkgbmVlZCB0aGUgcGNpX2RldiBmb3IgYWxsb2NhdGUgc3RydWN0dXJlIG9mICJzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyIiAqLworCWlmIChydiAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwkvKiBIZXJlIGFyZSB0aGUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBzdHJ1Y3R1cmUgd2l0aCBwY2ktYnVzIHNwZWNpZmljIHBhcmFtZXRlcnMuICovCisJcEFkLT5DU1JCYXNlQWRkcmVzcyA9ICh1OCAqKWNzcl9hZGRyOworCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkgKCJwQWQtPkNTUkJhc2VBZGRyZXNzID0weCVseCwgY3NyX2FkZHI9MHglbHghXG4iLAorCQkgICh1bnNpZ25lZCBsb25nKXBBZC0+Q1NSQmFzZUFkZHJlc3MsIGNzcl9hZGRyKSk7CisJUnRtcFJhRGV2Q3RybEluaXQocEFkLCBSVE1QX0RFVl9JTkZfUENJKTsKKworLypOZXREZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCW5ldF9kZXYgPSBSdG1wUGh5TmV0RGV2SW5pdChwQWQsICZuZXREZXZIb29rKTsKKwlpZiAobmV0X2RldiA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yYWRldjsKKworCS8qIEhlcmUgYXJlIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHBjaS1idXMgc3BlY2lmaWMgcGFyYW1ldGVycy4gKi8KKwluZXRfZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CS8qIEludGVycnVwdCBJUlEgbnVtYmVyICovCisJbmV0X2Rldi0+YmFzZV9hZGRyID0gY3NyX2FkZHI7CS8qIFNhdmUgQ1NSIHZpcnR1YWwgYWRkcmVzcyBhbmQgaXJxIHRvIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgbmV0X2Rldik7CS8qIFNldCBkcml2ZXIgZGF0YSAqLworCisvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIgKi8KKwkvKiBTZXQgdGhlIHN5c2ZzIHBoeXNpY2FsIGRldmljZSByZWZlcmVuY2UgZm9yIHRoZSBuZXR3b3JrIGxvZ2ljYWwgZGV2aWNlCisJICogaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsIGNhdXNlIGEgc3ltbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisJICovCisJU0VUX05FVERFVl9ERVYobmV0X2RldiwgJihwY2lfZGV2LT5kZXYpKTsKKworLypBbGwgZG9uZSwgaXQncyB0aW1lIHRvIHJlZ2lzdGVyIHRoZSBuZXQgZGV2aWNlIHRvIGxpbnV4IGtlcm5lbC4gKi8KKwkvKiBSZWdpc3RlciB0aGlzIGRldmljZSAqLworCXJ2ID0gUnRtcE9TTmV0RGV2QXR0YWNoKG5ldF9kZXYsICZuZXREZXZIb29rKTsKKwlpZiAocnYpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCXBBZC0+U3RhQ2ZnLk9yaURldlR5cGUgPSBuZXRfZGV2LT50eXBlOworCVJUTVBJbml0UENJZURldmljZShwY2lfZGV2LCBwQWQpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NjBfcHJvYmVcbiIpKTsKKworCXJldHVybiAwOwkJLyogcHJvYmUgb2sgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFUlJPUiBIQU5ETEUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCVJ0bXBPU05ldERldkZyZWUobmV0X2Rldik7CisKK2Vycl9vdXRfZnJlZV9yYWRldjoKKwkvKiBmcmVlIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgc3RyY3V0dXJlIGFuZCBvc19jb29raWUgKi8KKwlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKKworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoKHZvaWQgKikoY3NyX2FkZHIpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LCAwKSk7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKKworZXJyX291dDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJICgiPD09PSBydDI4NjBfcHJvYmUgZmFpbGVkIHdpdGggcnYgPSAlZCFcbiIsIHJ2KSk7CisKKwlyZXR1cm4gLUVOT0RFVjsJCS8qIHByb2JlIGZhaWwgKi8KK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0Mjg2MF9yZW1vdmVfb25lKElOIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBjc3JfYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsJLyogcEFkLT5DU1JCYXNlQWRkcmVzczsgKi8KKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg2MF9yZW1vdmVfb25lXG4iKSk7CisKKwlpZiAocEFkICE9IE5VTEwpIHsKKwkJLyogVW5yZWdpc3Rlci9GcmVlIGFsbCBhbGxvY2F0ZWQgbmV0X2RldmljZS4gKi8KKwkJUnRtcFBoeU5ldERldkV4aXQocEFkLCBuZXRfZGV2KTsKKworCQkvKiBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzICovCisJCWlvdW5tYXAoKGNoYXIgKikoY3NyX2FkZHIpKTsKKworCQkvKiByZWxlYXNlIG1lbW9yeSByZWdpb24gKi8KKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKSwKKwkJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKKworCQkvKiBGcmVlIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgcmVsYXRlZCBzdHJ1Y3R1cmVzLiAqLworCQlSdG1wUmFEZXZDdHJsRXhpdChwQWQpOworCisJfSBlbHNlIHsKKwkJLyogVW5yZWdpc3RlciBuZXR3b3JrIGRldmljZSAqLworCQlSdG1wT1NOZXREZXZEZXRhY2gobmV0X2Rldik7CisKKwkJLyogVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcyAqLworCQlpb3VubWFwKChjaGFyICopKG5ldF9kZXYtPmJhc2VfYWRkcikpOworCisJCS8qIHJlbGVhc2UgbWVtb3J5IHJlZ2lvbiAqLworCQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLAorCQkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworCX0KKworCS8qIEZyZWUgdGhlIHJvb3QgbmV0X2RldmljZSAqLworCVJ0bXBPU05ldERldkZyZWUobmV0X2Rldik7CisKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDaGVjayB0aGUgY2hpcHNldCB2ZW5kb3IvcHJvZHVjdCBJRC4KKworQXJndW1lbnRzOgorICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKKworUmV0dXJuIFZhbHVlOgorICAgIFRSVUUJCQkJQ2hlY2sgb2sKKwlGQUxTRQkJCQlDaGVjayBmYWlsCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjayhJTiB2b2lkICpfZGV2X3ApCit7CisJLyogYWx3YXlzIFRSVUUgKi8KKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVBDSWUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgUlRNUEluaXRQQ0llRGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJdTE2IGRldmljZV9pZDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX0RFVklDRV9JRCwgJmRldmljZV9pZCk7CisJZGV2aWNlX2lkID0gbGUyY3B1MTYoZGV2aWNlX2lkKTsKKwlwT2JqLT5EZXZpY2VJRCA9IGRldmljZV9pZDsKKwlpZiAoCisjaWZkZWYgUlQyODYwCisJCSAgIChkZXZpY2VfaWQgPT0gTklDMjg2MF9QQ0llX0RFVklDRV9JRCkgfHwKKwkJICAgKGRldmljZV9pZCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSB8fAorCQkgICAoZGV2aWNlX2lkID09IFZFTl9BV1RfUENJZV9ERVZJQ0VfSUQpIHx8CisjZW5kaWYKKyNpZmRlZiBSVDMwOTAKKwkJICAgKGRldmljZV9pZCA9PSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEKSB8fAorCQkgICAoZGV2aWNlX2lkID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpIHx8CisJCSAgIChkZXZpY2VfaWQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkgfHwKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkJICAgMCkgeworCQl1MzIgTWFjQ3NyMCA9IDAsIEluZGV4ID0gMDsKKwkJZG8geworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfQ1NSMCwgJk1hY0NzcjApOworCisJCQlpZiAoKE1hY0NzcjAgIT0gMHgwMCkgJiYgKE1hY0NzcjAgIT0gMHhGRkZGRkZGRikpCisJCQkJYnJlYWs7CisKKwkJCVJUTVB1c2VjRGVsYXkoMTApOworCQl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKKworCQkvKiBTdXBwb3J0IGFkdmFuY2VkIHBvd2VyIHNhdmUgYWZ0ZXIgMjg5Mi8yNzkwLiAqLworCQkvKiBNQUMgdmVyc2lvbiBhdCBvZmZzZXQgMHgxMDAwIGlzIDB4Mjg3MlhYWFgvMHgyODcwWFhYWChQQ0llLCBVU0IsIFNESU8pLiAqLworCQlpZiAoKE1hY0NzcjAgJiAweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKSB7CisJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpOworCQl9CisJfQorfQorCit2b2lkIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWludCBwb3M7CisJdTE2IHJlZzE2LCBkYXRhMiwgUENJZVBvd2VyU2F2ZUxldmVsLCBDb25maWd1cmF0aW9uOworCXUzMiBNYWNWYWx1ZTsKKwlCT09MRUFOIGJGaW5kSW50ZWwgPSBGQUxTRTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQorCQlyZXR1cm47CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcy49PT0+XG4iLCBfX2Z1bmNfXykpOworCS8qIEluaXQgRUVQUk9NLCBhbmQgc2F2ZSBzZXR0aW5ncyAqLworCWlmICghKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkgeworCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjIsIFBDSWVQb3dlclNhdmVMZXZlbCk7CisJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsICYgMHhmZjsKKworCQlwQWQtPkxua0N0cmxCaXRNYXNrID0gMDsKKwkJaWYgKChQQ0llUG93ZXJTYXZlTGV2ZWwgJiAweGZmKSA9PSAweGZmKSB7CisJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT09PiBQQ0llUG93ZXJTYXZlTGV2ZWwgPSAweCV4LlxuIiwKKwkJCQkgIFBDSWVQb3dlclNhdmVMZXZlbCkpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJUENJZVBvd2VyU2F2ZUxldmVsICY9IDB4MzsKKwkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgyNCwgZGF0YTIpOworCisJCQlpZiAoIQorCQkJICAgICgoKGRhdGEyICYgMHhmZjAwKSA9PSAweDkyMDApCisJCQkgICAgICYmICgoZGF0YTIgJiAweDgwKSAhPSAwKSkpIHsKKwkJCQlpZiAoUENJZVBvd2VyU2F2ZUxldmVsID4gMSkKKwkJCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKKwkJCX0KKworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT4gV3JpdGUgMHg4MyA9IDB4JXguXG4iLAorCQkJCSAgUENJZVBvd2VyU2F2ZUxldmVsKSk7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsCisJCQkJCSAgICAgKHU4KVBDSWVQb3dlclNhdmVMZXZlbCwgMHgwMCk7CisJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjIsIFBDSWVQb3dlclNhdmVMZXZlbCk7CisJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHhmZjsKKwkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IFBDSWVQb3dlclNhdmVMZXZlbCA+PiA2OworCQkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpIHsKKwkJCWNhc2UgMDoJLyogT25seSBzdXBwb3J0IEwwICovCisJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CS8qIE9ubHkgZW5hYmxlIEwwcyAqLworCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgkvKiBlbmFibGUgTDEsIEwwcyAqLworCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAzOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgkvKiBzeW5jIHdpdGggaG9zdCBjbGsgYW5kIGVuYWJsZSBMMSwgTDBzICovCisJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDB4MTAzOworCQkJCWJyZWFrOworCQkJfQorCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7CisJCQlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmYpICE9IDB4ZmYpIHsKKwkJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHgzOworCisJCQkJaWYgKCEKKwkJCQkgICAgKCgoZGF0YTIgJiAweGZmMDApID09IDB4OTIwMCkKKwkJCQkgICAgICYmICgoZGF0YTIgJiAweDgwKSAhPSAwKSkpIHsKKwkJCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEpCisJCQkJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSAxOworCQkJCX0KKworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCI9PT09PiBydDI4eHggV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsCisJCQkJCSAgUENJZVBvd2VyU2F2ZUxldmVsKSk7CisKKwkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsCisJCQkJCQkgICAgICh1OClQQ0llUG93ZXJTYXZlTGV2ZWwsCisJCQkJCQkgICAgIDB4MDApOworCQkJfQorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT4gTG5rQ3RybEJpdE1hc2sgPSAweCV4LlxuIiwKKwkJCQkgIHBBZC0+TG5rQ3RybEJpdE1hc2spKTsKKwkJfQorCX0gZWxzZSBpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpIHsKKwkJdTggTGlua0N0cmxTZXR0aW5nID0gMDsKKworCQkvKiBDaGVjayAzMDkwRSBzcGVjaWFsIHNldHRpbmcgY2hpcC4gKi8KKwkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7CisJCWlmICgoZGF0YTIgPT0gMHg5MjgwKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMjExKSkgeworCQkJcEFkLT5iMzA5MEVTcGVjaWFsQ2hpcCA9IFRSVUU7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiU3BlY2lhbCAzMDkwRSBjaGlwIFxuIikpOworCQl9CisKKwkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY1ZhbHVlKTsKKwkJLyplbmFibGUgV0FLRV9QQ0lFIGZ1bmN0aW9uLCB3aGljaCBmb3JjZXMgdG8gZW5hYmxlIFBDSUUgY2xvY2sgd2hlbiBtcHUgaW50ZXJydXB0IGFzc2VydGluZy4gKi8KKwkJLypGb3JjZSBQQ0lFIDEyNU1IeiBDTEsgdG8gdG9nZ2xlICovCisJCU1hY1ZhbHVlIHw9IDB4NDAyOworCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjVmFsdWUpOworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiIEFVWF9DVFJMID0gMHglMzJ4XG4iLCBNYWNWYWx1ZSkpOworCisJCS8qIGZvciBSVDMweHggRiBhbmQgYWZ0ZXIsIFBDSWUgaW5mdGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzICovCisJCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCisJCSAgICAmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQorCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpIHsKKwkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVYX0NUUkwsICZNYWNWYWx1ZSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIiBSZWFkIEFVWF9DVFJMID0gMHgleFxuIiwgTWFjVmFsdWUpKTsKKwkJCS8qIHR1cm4gb24gYml0IDEyLiAqLworCQkJLyplbmFibGUgMzJLSHogY2xvY2sgbW9kZSBmb3IgcG93ZXIgc2F2aW5nICovCisJCQlNYWNWYWx1ZSB8PSAweDEwMDA7CisJCQlpZiAoTWFjVmFsdWUgIT0gMHhmZmZmZmZmZikgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVWF9DVFJMLCBNYWNWYWx1ZSk7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgICAgICgiIFdyaXRlIEFVWF9DVFJMID0gMHgleFxuIiwKKwkJCQkJICAgICAgTWFjVmFsdWUpKTsKKwkJCQkvKiAxLiBpZiB1c2UgUENJZVBvd2VyU2V0dGluZyBpcyAyIG9yIDMsIG5lZWQgdG8gcHJvZ3JhbSBPU0NfQ1RSTCB0byAweDNmZjExLiAqLworCQkJCU1hY1ZhbHVlID0gMHgzZmYxMTsKKwkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBPU0NfQ1RSTCwgTWFjVmFsdWUpOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkJICAgICAoIiBPU0NfQ1RSTCA9IDB4JXhcbiIsIE1hY1ZhbHVlKSk7CisJCQkJLyogMi4gV3JpdGUgUENJIHJlZ2lzdGVyIENsayByZWYgYml0ICovCisJCQkJUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybChwQWQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBFcnJvciByZWFkIEF1eF9DdHJsIHZhbHVlLiAgRm9yY2UgdG8gdXNlIHNvbHV0aW9uIDEgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkJICgiIEVycm9yIFZhbHVlIGluIEFVWF9DVFJMID0gMHgleFxuIiwKKwkJCQkJICBNYWNWYWx1ZSkpOworCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPSAxOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIgRm9yY2UgdG8gdXNlIHBvd2VyIHNvbHV0aW9uMSBcbiIpKTsKKwkJCX0KKwkJfQorCQkvKiAxLiByZWFkIHNldHRpbmcgZnJvbSBpbmYgZmlsZS4gKi8KKworCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPQorCQkgICAgKHUxNilwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIj09PT0+IHJ0MzB4eCBSZWFkIFBvd2VyTGV2ZWxNb2RlID0gIDB4JXguXG4iLAorCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKwkJLyogMi4gQ2hlY2sgRW5hYmxlTmV3UFMuICovCisJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCisJCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSAxOworCisJCWlmIChJU19WRVJTSU9OX0JFRk9SRV9GKHBBZCkKKwkJICAgICYmIChwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID09IEZBTFNFKSkgeworCQkJLyogQ2hpcCBWZXJzaW9uIEUgb25seSBhbGxvdyAxLCBTbyBmb3JjZSBzZXQgMS4gKi8KKwkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweDE7CisJCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9ICh1MTYpUENJZVBvd2VyU2F2ZUxldmVsOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiPT09PT4gcnQzMHh4IEUgV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsCisJCQkJICBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKKworCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgzLCAweGZmLAorCQkJCQkgICAgICh1OClQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOworCQl9IGVsc2UgeworCQkJLyogQ2hpcCBWZXJzaW9uIEYgYW5kIGFmdGVyIG9ubHkgYWxsb3cgMSBvciAyIG9yIDMuIFRoaXMgbWlnaHQgYmUgbW9kaWZpZWQgYWZ0ZXIgbmV3IGNoaXAgdmVyc2lvbiBjb21lIG91dC4gKi8KKwkJCWlmICghCisJCQkgICAgKChQQ0llUG93ZXJTYXZlTGV2ZWwgPT0gMSkKKwkJCSAgICAgfHwgKFBDSWVQb3dlclNhdmVMZXZlbCA9PSAzKSkpCisJCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIj09PT0+IHJ0MzB4eCBGIFdyaXRlIDB4ODMgQ29tbWFuZCA9IDB4JXguXG4iLAorCQkJCSAgUENJZVBvd2VyU2F2ZUxldmVsKSk7CisJCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9ICh1MTYpUENJZVBvd2VyU2F2ZUxldmVsOworCQkJLyogZm9yIDMwOTBGICwgd2UgbmVlZCB0byBhZGQgaGlnaC1ieXRlIGFyZyBmb3IgMHg4MyBjb21tYW5kIHRvIGluZGljYXRlIHRoZSBsaW5rIGNvbnRyb2wgc2V0dGluZyBpbiAqLworCQkJLyogUENJIENvbmZpZ3VyYXRpb24gU3BhY2UuIEJlY2F1c2UgZmlybXdhcmUgY2FuJ3QgcmVhZCBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSAqLworCQkJaWYgKChwQWQtPlJ0M3h4UmFsaW5rTGlua0N0cmwgJiAweDIpCisJCQkgICAgJiYgKHBBZC0+UnQzeHhIb3N0TGlua0N0cmwgJiAweDIpKSB7CisJCQkJTGlua0N0cmxTZXR0aW5nID0gMTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIj09PT0+IHJ0MzB4eEYgTGlua0N0cmxTZXR0aW5nID0gMHgleC5cbiIsCisJCQkJICBMaW5rQ3RybFNldHRpbmcpKTsKKwkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwKKwkJCQkJICAgICAodTgpUENJZVBvd2VyU2F2ZUxldmVsLAorCQkJCQkgICAgIExpbmtDdHJsU2V0dGluZyk7CisJCX0KKwl9CisJLyogRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0ICovCisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisKKwlpZiAocG9zICE9IDApIHsKKwkJLyogUmFsaW5rIFBDSWUgRGV2aWNlJ3MgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldCAqLworCQlwQWQtPlJMbmtDdHJsT2Zmc2V0ID0gcG9zICsgUENJX0VYUF9MTktDVEw7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsCisJCQkJICAgICAmcmVnMTYpOworCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJlYWQgKFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBSZWdpc3Rlcikgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJCXBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uID0gKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7CisJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQlDb25maWd1cmF0aW9uIHw9ICgweDApOworI2lmZGVmIFJUMjg2MAorCQlpZiAoKHBPYmotPkRldmljZUlEID09IE5JQzI4NjBfUENJZV9ERVZJQ0VfSUQpCisJCSAgICB8fCAocE9iai0+RGV2aWNlSUQgPT0gTklDMjc5MF9QQ0llX0RFVklDRV9JRCkpIHsKKwkJCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7CisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocE9iai0+cGNpX2RldiwKKwkJCQkJICAgICAgcEFkLT5STG5rQ3RybE9mZnNldCwgcmVnMTYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiV3JpdGUgKFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBSZWdpc3RlcikgIG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCQkgIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCBDb25maWd1cmF0aW9uKSk7CisJCX0KKyNlbmRpZiAvKiBSVDI4NjAgLy8gKi8KKworCQlSVE1QRmluZEhvc3RQQ0lEZXYocEFkKTsKKwkJaWYgKHBPYmotPnBhcmVudF9wY2lfZGV2KSB7CisJCQl1MTYgdmVuZG9yX2lkOworCisJCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJICAgICBQQ0lfVkVORE9SX0lELCAmdmVuZG9yX2lkKTsKKwkJCXZlbmRvcl9pZCA9IGxlMmNwdTE2KHZlbmRvcl9pZCk7CisJCQlpZiAodmVuZG9yX2lkID09IFBDSUJVU19JTlRFTF9WRU5ET1IpIHsKKwkJCQliRmluZEludGVsID0gVFJVRTsKKwkJCQlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19UT0dHTEVfTDEpOworCQkJfQorCQkJLyogRmluZCBQQ0ktdG8tUENJIEJyaWRnZSBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0ICovCisJCQlwb3MgPQorCQkJICAgIHBjaV9maW5kX2NhcGFiaWxpdHkocE9iai0+cGFyZW50X3BjaV9kZXYsCisJCQkJCQlQQ0lfQ0FQX0lEX0VYUCk7CisKKwkJCWlmIChwb3MgIT0gMCkgeworCQkJCUJPT0xFQU4gYkNoYW5nZSA9IEZBTFNFOworCQkJCS8qIFBDSS10by1QQ0kgQnJpZGdlIExpbmsgQ29udHJvbCBSZWdpc3RlciBPZmZzZXQgKi8KKwkJCQlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gcG9zICsgUENJX0VYUF9MTktDVEw7CisJCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsCisJCQkJCQkgICAgIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJCQkgICAgICZyZWcxNik7CisJCQkJQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiUmVhZCAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCQkJICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwkJCQlwQWQtPkhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbiA9CisJCQkJICAgIChDb25maWd1cmF0aW9uICYgMHgxMDMpOworCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7CisKKwkJCQlzd2l0Y2ggKHBPYmotPkRldmljZUlEKSB7CisjaWZkZWYgUlQyODYwCisJCQkJY2FzZSBOSUMyODYwX1BDSWVfREVWSUNFX0lEOgorCQkJCWNhc2UgTklDMjc5MF9QQ0llX0RFVklDRV9JRDoKKwkJCQkJYkNoYW5nZSA9IFRSVUU7CisJCQkJCWJyZWFrOworI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworI2lmZGVmIFJUMzA5MAorCQkJCWNhc2UgTklDMzA5MF9QQ0llX0RFVklDRV9JRDoKKwkJCQljYXNlIE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQ6CisJCQkJY2FzZSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEOgorCQkJCQlpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKKwkJCQkJCWJDaGFuZ2UgPSBUUlVFOworCQkJCQlicmVhazsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoYkNoYW5nZSkgeworCQkJCQlyZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOworCQkJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocE9iai0+CisJCQkJCQkJICAgICAgcGFyZW50X3BjaV9kZXYsCisJCQkJCQkJICAgICAgcEFkLT4KKwkJCQkJCQkgICAgICBIb3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCQkgICAgICByZWcxNik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiV3JpdGUgKEhvc3QgUENJLXRvLVBDSSBCcmlkZ2UgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJCQkgIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCIlczogY2Fubm90IGZpbmQgUENJLXRvLVBDSSBCcmlkZ2UgUENJIEV4cHJlc3MgQ2FwYWJpbGl0eSFcbiIsCisJCQkJCSAgX19mdW5jX18pKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXBBZC0+Ukxua0N0cmxPZmZzZXQgPSAwOworCQlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlczogY2Fubm90IGZpbmQgUmFsaW5rIFBDSWUgRGV2aWNlJ3MgUENJIEV4cHJlc3MgQ2FwYWJpbGl0eSFcbiIsCisJCQkgIF9fZnVuY19fKSk7CisJfQorCisJaWYgKGJGaW5kSW50ZWwgPT0gRkFMU0UpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJEb2Vzbid0IGZpbmQgSW50ZWwgUENJIGhvc3QgY29udHJvbGxlci4gXG4iKSk7CisJCS8qIERvZXNuJ3Qgc3dpdGNoIEwwLCBMMSwgU28gc2V0IFBDSWVQb3dlclNhdmVMZXZlbCB0byAweGZmICovCisJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gMHhmZjsKKwkJaWYgKChwQWQtPlJMbmtDdHJsT2Zmc2V0ICE9IDApCisjaWZkZWYgUlQzMDkwCisJCSAgICAmJiAoKHBPYmotPkRldmljZUlEID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpCisJCQl8fCAocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MV9QQ0llX0RFVklDRV9JRCkKKwkJCXx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEKSkKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwkJICAgICkgeworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwKKwkJCQkJICAgICAmcmVnMTYpOworCQkJQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJlYWQgKFJhbGluayAzMHh4IFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCisJCQkJICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJCQlwQWQtPlJMbmtDdHJsQ29uZmlndXJhdGlvbiA9IChDb25maWd1cmF0aW9uICYgMHgxMDMpOworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9ICgweDApOworCQkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LAorCQkJCQkgICAgICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCByZWcxNik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJXcml0ZSAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSAgb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCSAgcG9zICsgUENJX0VYUF9MTktDVEwsIENvbmZpZ3VyYXRpb24pKTsKKwkJfQorCX0KK30KKwordm9pZCBSVE1QRmluZEhvc3RQQ0lEZXYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXUxNiByZWcxNjsKKwl1OCByZWc4OworCXUzMiBEZXZGbjsKKwlzdHJ1Y3QgcGNpX2RldiAqcFBjaV9kZXY7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKKwkJcmV0dXJuOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19mdW5jX18pKTsKKworCXBPYmotPnBhcmVudF9wY2lfZGV2ID0gTlVMTDsKKwlpZiAocE9iai0+cGNpX2Rldi0+YnVzLT5wYXJlbnQpIHsKKwkJZm9yIChEZXZGbiA9IDA7IERldkZuIDwgMjU1OyBEZXZGbisrKSB7CisJCQlwUGNpX2RldiA9CisJCQkgICAgcGNpX2dldF9zbG90KHBPYmotPnBjaV9kZXYtPmJ1cy0+cGFyZW50LCBEZXZGbik7CisJCQlpZiAocFBjaV9kZXYpIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfd29yZChwUGNpX2RldiwgUENJX0NMQVNTX0RFVklDRSwKKwkJCQkJCSAgICAgJnJlZzE2KTsKKwkJCQlyZWcxNiA9IGxlMmNwdTE2KHJlZzE2KTsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwUGNpX2RldiwgUENJX0NCX0NBUkRfQlVTLAorCQkJCQkJICAgICAmcmVnOCk7CisJCQkJaWYgKChyZWcxNiA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkKKwkJCQkgICAgJiYgKHJlZzggPT0gcE9iai0+cGNpX2Rldi0+YnVzLT5udW1iZXIpKSB7CisJCQkJCXBPYmotPnBhcmVudF9wY2lfZGV2ID0gcFBjaV9kZXY7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKworCUFyZ3VtZW50czoKKwkJTGV2ZWwgPSBSRVNUT1JFX0hBTFQgOiBSZXN0b3JlIFBDSSBob3N0IGFuZCBSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgZmllbGQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCisJCUxldmVsID0gT3RoZXIgVmFsdWUgOiBSZXN0b3JlIGZyb20gZG90MTEgcG93ZXIgc2F2ZSBvciByYWRpbyBvZmYgc3RhdHVzLiBBbmQgZm9yY2UgUENJIGhvc3QgTGluayBDb250cm9sIGZpZWxkcyB0byAweDEKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IExldmVsKQoreworCXUxNiBQQ0llUG93ZXJTYXZlTGV2ZWwsIHJlZzE2OworCXUxNiBDb25maWd1cmF0aW9uOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCisJCXJldHVybjsKKworI2lmZGVmIFJUMjg2MAorCWlmICghKChwT2JqLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKQorCSAgICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSkpCisJCXJldHVybjsKKyNlbmRpZiAvKiBSVDI4NjAgLy8gKi8KKwkvKiBDaGVjayBQU0NvbnRyb2wgQ29uZmlndXJhdGlvbiAqLworCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qMzA5MCB3aWxsIG5vdCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29kZXMuICovCisJLyogQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uICovCisKKyNpZmRlZiBSVDMwOTAKKwlpZiAoKHBPYmotPkRldmljZUlEID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpCisJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQorCSAgICB8fCAocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkpCisJCXJldHVybjsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzLj09PT5cbiIsIF9fZnVuY19fKSk7CisJUENJZVBvd2VyU2F2ZUxldmVsID0gcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWw7CisJaWYgKChQQ0llUG93ZXJTYXZlTGV2ZWwgJiAweGZmKSA9PSAweGZmKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJldHVybiAgXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocE9iai0+cGFyZW50X3BjaV9kZXYgJiYgKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJICBDb25maWd1cmF0aW9uKTsKKwkJaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmIChDb25maWd1cmF0aW9uICE9IDB4RkZGRikpIHsKKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJLyogSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuICovCisJCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkgeworCQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5Ib3N0TG5rQ3RybENvbmZpZ3VyYXRpb247CisJCQl9IGVsc2UKKwkJCQlDb25maWd1cmF0aW9uIHw9IDB4MDsKKwkJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJICAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJICAgQ29uZmlndXJhdGlvbik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJSZXN0b3JlIFBDSSBob3N0IDogb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbikpOworCQl9IGVsc2UKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlJlc3RvcmUgUENJIGhvc3QgOiBQQ0lfUkVHX1JFQURfV09SRCBmYWlsZWQgKENvbmZpZ3VyYXRpb24gPSAweCV4KVxuIiwKKwkJCQkgIENvbmZpZ3VyYXRpb24pKTsKKwl9CisKKwlpZiAocE9iai0+cGNpX2RldiAmJiAocEFkLT5STG5rQ3RybE9mZnNldCAhPSAwKSkgeworCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCSAgQ29uZmlndXJhdGlvbik7CisJCWlmICgoQ29uZmlndXJhdGlvbiAhPSAwKSAmJiAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKSB7CisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCS8qIElmIGNhbGwgZnJvbSBpbnRlcmZhY2UgZG93biwgcmVzdG9yZSB0byBvcmdpbmlhbCBzZXR0aW5nLiAqLworCQkJaWYgKExldmVsID09IFJFU1RPUkVfQ0xPU0UpCisJCQkJQ29uZmlndXJhdGlvbiB8PSBwQWQtPlJMbmtDdHJsQ29uZmlndXJhdGlvbjsKKwkJCWVsc2UKKwkJCQlDb25maWd1cmF0aW9uIHw9IDB4MDsKKwkJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCQkgICBDb25maWd1cmF0aW9uKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlJlc3RvcmUgUmFsaW5rIDogb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJCSAgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbikpOworCQl9IGVsc2UKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlJlc3RvcmUgUmFsaW5rIDogUENJX1JFR19SRUFEX1dPUkQgZmFpbGVkIChDb25maWd1cmF0aW9uID0gMHgleClcbiIsCisJCQkJICBDb25maWd1cmF0aW9uKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPD09PVxuIiwgX19mdW5jX18pKTsKK30KKworLyoKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCVJvdXRpbmUgRGVzY3JpcHRpb246CisKKwlBcmd1bWVudHM6CisJCU1heCA6IGxpbWl0IEhvc3QgUENJIGFuZCBSYWxpbmsgUENJZSBkZXZpY2UncyBMSU5LIENPTlRST0wgZmllbGQncyB2YWx1ZS4KKwkJQmVjYXVzZSBub3cgZnJlcXVlbnRseSBzZXQgb3VyIGRldmljZSB0byBtb2RlIDEgb3IgbW9kZSAzIHdpbGwgY2F1c2UgcHJvYmxlbS4KKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgTWF4KQoreworCXUxNiBQQ0llUG93ZXJTYXZlTGV2ZWwsIHJlZzE2OworCXUxNiBDb25maWd1cmF0aW9uOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCisJCXJldHVybjsKKworI2lmZGVmIFJUMjg2MAorCWlmICghKChwT2JqLT5EZXZpY2VJRCA9PSBOSUMyODYwX1BDSWVfREVWSUNFX0lEKQorCSAgICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEKSkpCisJCXJldHVybjsKKyNlbmRpZiAvKiBSVDI4NjAgLy8gKi8KKwkvKiBDaGVjayBQU0NvbnRyb2wgQ29uZmlndXJhdGlvbiAqLworCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCisJCXJldHVybjsKKworCS8qIENoZWNrIGludGVyZmFjZSA6IElmIG5vdCBQQ0llIGludGVyZmFjZSwgcmV0dXJuLiAqLworCS8qQmxvY2sgMzA5MCB0byBlbnRlciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uICovCisKKyNpZmRlZiBSVDMwOTAKKwlpZiAoKHBPYmotPkRldmljZUlEID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpCisJICAgIHx8IChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQorCSAgICB8fCAocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkpCisJCXJldHVybjsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KKwlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sCisJCQkgKCJSVE1QUENJZVBvd2VyTGlua0N0cmwgcmV0dXJuIG9uIGZSVE1QX1BTX0NBTl9HT19TTEVFUCBmbGFnXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcz09PT5cbiIsIF9fZnVuY19fKSk7CisJUENJZVBvd2VyU2F2ZUxldmVsID0gcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWw7CisJaWYgKChQQ0llUG93ZXJTYXZlTGV2ZWwgJiAweGZmKSA9PSAweGZmKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJldHVybiAgXG4iKSk7CisJCXJldHVybjsKKwl9CisJUENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsID4+IDY7CisKKwkvKiBTa2lwIG5vbi1leGlzdCBkZWljZSByaWdodCBhd2F5ICovCisJaWYgKHBPYmotPnBhcmVudF9wY2lfZGV2ICYmIChwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ICE9IDApKSB7CisJCVBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCSAgQ29uZmlndXJhdGlvbik7CisJCXN3aXRjaCAoUENJZVBvd2VyU2F2ZUxldmVsKSB7CisJCWNhc2UgMDoKKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAwICovCisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiAgU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJLyogU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMSAqLworCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7CisJCQlDb25maWd1cmF0aW9uIHw9IDB4MTAzOworCQkJYnJlYWs7CisJCX0KKwkJUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LAorCQkJCSAgIENvbmZpZ3VyYXRpb24pOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIldyaXRlIFBDSSBob3N0IG9mZnNldCAweCV4ID0gMHgleFxuIiwKKwkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbikpOworCX0KKworCWlmIChwT2JqLT5wY2lfZGV2ICYmIChwQWQtPlJMbmtDdHJsT2Zmc2V0ICE9IDApKSB7CisJCS8qIGZpcnN0IDI4OTIgY2hpcCBub3QgYWxsb3cgdG8gZnJlcXVlbnRseSBzZXQgbW9kZSAzLiB3aWxsIGNhdXNlIGhhbmcgcHJvYmxlbS4gKi8KKwkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IE1heCkKKwkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IE1heDsKKworCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCSAgQ29uZmlndXJhdGlvbik7CisJCXN3aXRjaCAoUENJZVBvd2VyU2F2ZUxldmVsKSB7CisJCWNhc2UgMDoKKwkJCS8qIE5vIFBDSSBwb3dlciBzYWZlICovCisJCQkvKiBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMCAuICovCisJCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiAgTDAgKi8KKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAxIC4gKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJQ29uZmlndXJhdGlvbiB8PSAweDE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJLyogTDAgYW5kIEwxICovCisJCQkvKiAgU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJLyogTDAgLCBMMSBhbmQgY2xvY2sgbWFuYWdlbWVudC4gKi8KKwkJCS8qIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDExIGFuZCBiaXQgOCBvZiBMaW5rQ29udHJvbCBvZiAyODkyIHRvIDEgKi8KKwkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOworCQkJQ29uZmlndXJhdGlvbiB8PSAweDEwMzsKKwkJCXBBZC0+YlBDSWNsa09mZiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCQlQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwKKwkJCQkgICBDb25maWd1cmF0aW9uKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJXcml0ZSBSYWxpbmsgZGV2aWNlIDogb2Zmc2V0IDB4JXggPSAweCV4XG4iLAorCQkJICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7CisJfQorCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFBDSWVQb3dlckxpbmtDdHJsIDw9PT09PT09PT09PT09PVxuIikpOworfQorCisvKgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJUm91dGluZSBEZXNjcmlwdGlvbjoKKwkJMS4gV3JpdGUgYSBQQ0kgcmVnaXN0ZXIgZm9yIHJ0MzB4eCBwb3dlciBzb2x1dGlvbiAzCisKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCit2b2lkIFJUTVBydDN4U2V0UENJZVBvd2VyTGlua0N0cmwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCisJdW5zaWduZWQgbG9uZyBIb3N0Q29uZmlndXJhdGlvbiA9IDA7CisJdW5zaWduZWQgbG9uZyBDb25maWd1cmF0aW9uOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJaW50IHBvczsKKwl1MTYgcmVnMTY7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sCisJCSAoIlJUTVBydDN4U2V0UENJZVBvd2VyTGlua0N0cmwuPT09PiAlbHhcbiIsCisJCSAgcEFkLT5TdGFDZmcuUFNDb250cm9sLndvcmQpKTsKKworCS8qIENoZWNrIFBTQ29udHJvbCBDb25maWd1cmF0aW9uICovCisJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBGQUxTRSkKKwkJcmV0dXJuOworCVJUTVBGaW5kSG9zdFBDSURldihwQWQpOworCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikgeworCQkvKiBGaW5kIFBDSS10by1QQ0kgQnJpZGdlIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQgKi8KKwkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX0NBUF9JRF9FWFApOworCisJCWlmIChwb3MgIT0gMCkgeworCQkJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOworCQl9CisJCS8qIElmIGNvbmZpZ3VyYXJlZCB0byB0dXJuIG9uIEwxLiAqLworCQlIb3N0Q29uZmlndXJhdGlvbiA9IDA7CisJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9PSAxKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFbnRlcixQU00gOiBGb3JjZSBBU1BNIFxuIikpOworCisJCQkvKiBTa2lwIG5vbi1leGlzdCBkZWljZSByaWdodCBhd2F5ICovCisJCQlpZiAoKHBBZC0+SG9zdExua0N0cmxPZmZzZXQgIT0gMCkpIHsKKwkJCQlQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCSAgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwKKwkJCQkJCSAgSG9zdENvbmZpZ3VyYXRpb24pOworCQkJCS8qIFByZXBhcmUgQ29uZmlndXJhdGlvbiB0byB3cml0ZSB0byBIb3N0ICovCisJCQkJSG9zdENvbmZpZ3VyYXRpb24gfD0gMHgzOworCQkJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwKKwkJCQkJCSAgIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJCQkgICBIb3N0Q29uZmlndXJhdGlvbik7CisJCQkJcEFkLT5SdDN4eEhvc3RMaW5rQ3RybCA9IEhvc3RDb25maWd1cmF0aW9uOworCQkJCS8qIEJlY2F1c2UgaW4gcnQzMHh4Rm9yY2VBU1BNVGVzdCBNb2RlLCBGb3JjZSB0dXJuIG9uIEwwcywgTDEuICovCisJCQkJLyogRml4IEhvc3RDb25maWd1cmF0aW9uIGJpdDA6MSA9IDB4MyBmb3IgbGF0ZXIgdXNlLiAqLworCQkJCUhvc3RDb25maWd1cmF0aW9uID0gMHgzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQU00gOiBGb3JjZSBBU1BNIDogIgorCQkJCQkgICJIb3N0IGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHglbHhcbiIsCisJCQkJCSAgSG9zdENvbmZpZ3VyYXRpb24pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9sbG93SG9zdEFTUE0gPT0KKwkJCSAgIDEpIHsKKworCQkJLyogU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheSAqLworCQkJaWYgKChwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ICE9IDApKSB7CisJCQkJUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsCisJCQkJCQkgIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsCisJCQkJCQkgIEhvc3RDb25maWd1cmF0aW9uKTsKKwkJCQlwQWQtPlJ0M3h4SG9zdExpbmtDdHJsID0gSG9zdENvbmZpZ3VyYXRpb247CisJCQkJSG9zdENvbmZpZ3VyYXRpb24gJj0gMHgzOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQU00gOiBGb2xsb3cgSG9zdCBBU1BNIDogIgorCQkJCQkgICJIb3N0IGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHglbHhcbiIsCisJCQkJCSAgSG9zdENvbmZpZ3VyYXRpb24pKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBQcmVwYXJlIHRvIHdyaXRlIFJhbGluayBzZXR0aW5nLiAqLworCS8qIEZpbmQgUmFsaW5rIFBDSWUgRGV2aWNlJ3MgRXhwcmVzcyBDYXBhYmlsaXR5IE9mZnNldCAqLworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocE9iai0+cGNpX2RldiwgUENJX0NBUF9JRF9FWFApOworCisJaWYgKHBvcyAhPSAwKSB7CisJCS8qIFJhbGluayBQQ0llIERldmljZSdzIExpbmsgQ29udHJvbCBSZWdpc3RlciBPZmZzZXQgKi8KKwkJcEFkLT5STG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOworCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCSAgICAgJnJlZzE2KTsKKwkJQ29uZmlndXJhdGlvbiA9IGxlMmNwdTE2KHJlZzE2KTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSZWFkIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpICIKKwkJCSAgIm9mZnNldCAweCV4ID0gMHglbHhcbiIsCisJCQkgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKKwkJQ29uZmlndXJhdGlvbiB8PSAweDEwMDsKKwkJaWYgKChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9sbG93SG9zdEFTUE0gPT0gMSkKKwkJICAgIHx8IChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdCA9PSAxKSkgeworCQkJc3dpdGNoIChIb3N0Q29uZmlndXJhdGlvbikgeworCQkJY2FzZSAwOgorCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOworCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOworCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgyOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LAorCQkJCSAgICAgIHJlZzE2KTsKKwkJcEFkLT5SdDN4eFJhbGlua0xpbmtDdHJsID0gQ29uZmlndXJhdGlvbjsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQU00gOldyaXRlIFJhbGluayBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JWx4XG4iLAorCQkJICBDb25maWd1cmF0aW9uKSk7CisJfQorCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sCisJCSAoIlBTTSA6UlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybCA8PT09PT09PT09PT09PT1cbiIpKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0Mjg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI4ZmU1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX1JUMjg2MF9IX18KLSNkZWZpbmUgX19SVDI4NjBfSF9fCi0KLSNkZWZpbmUgUlQyOHh4X0NISVBfTkFNRQkiUlQyODYwIgotCi0jZGVmaW5lIFRYSU5GT19TSVpFICAgICAgICAgICAgICAgMAotI2RlZmluZSBUWFBBRERJTkdfU0laRSAgICAgIAkgIDAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRUVQUk9NIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQsIHZhcikJCVwKLQl2YXIgPSBSVE1QX0VFUFJPTV9SRUFEMTYocEFkLCBvZmZzZXQpCi0KLSNkZWZpbmUgUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YXIpCQlcCi0JUlRNUF9FRVBST01fV1JJVEUxNihwQWQsIG9mZnNldCwgdmFyKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAotCWluaXRfdGhyZWFkX3Rhc2socEFkKTsgTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlKHBBZCk7CVwKLQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCi0vKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KLSNkZWZpbmUgSVJRX0hBTkRMRV9UWVBFICBpcnFyZXR1cm5fdAotCi1JUlFfSEFORExFX1RZUEUKLXJ0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfV1JJVEVfRklSTVdBUkUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCQkJCVwKLQlkb3sJCQkJCQkJCQkJCQkJCQkJXAotCQlVTE9ORwlfaSwgX2Zpcm07CQkJCQkJCQkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBQQkZfU1lTX0NUUkwsIDB4MTAwMDApOwkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCVwKLQkJZm9yKF9pPTA7IF9pPF9Gd0xlbjsgX2krPTQpCQkJCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJXAotCQkJX2Zpcm0gPSBfcEZ3SW1hZ2VbX2ldICsJCQkJCQkJCQlcCi0JCQkgICAoX3BGd0ltYWdlW19pKzNdIDw8IDI0KSArCQkJCQkJCVwKLQkJCSAgIChfcEZ3SW1hZ2VbX2krMl0gPDwgMTYpICsJCQkJCQkJXAotCQkJICAgKF9wRndJbWFnZVtfaSsxXSA8PCA4KTsJCQkJCQkJCVwKLQkJCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBGSVJNV0FSRV9JTUFHRV9CQVNFICsgX2ksIF9maXJtKTsJXAotCQl9CQkJCQkJCQkJCQkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAwKTsJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIoX3BBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAxKTsJCQkJXAotCQkJCQkJCQkJCQkJCQkJCQlcCi0JCS8qIGluaXRpYWxpemUgQkJQIFIvVyBhY2Nlc3MgYWdlbnQgKi8JCQkJCQlcCi0JCVJUTVBfSU9fV1JJVEUzMihfcEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJCQkJCVwKLQkJUlRNUF9JT19XUklURTMyKF9wQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7CQkJCQlcCi0JfXdoaWxlKDApCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFRYIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJZG97fXdoaWxlKDApCi0jZGVmaW5lIFJUMjhYWF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJZG97fXdoaWxlKDApCi0KLQotI2RlZmluZSBSVDI4WFhfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIGZyZWVOdW0sIHBQYWNrZXQpIFwKLQkJKChmcmVlTnVtKSA+PSAoVUxPTkcpKHBUeEJsay0+VG90YWxGcmFnTnVtICsgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KSArIDMpKSAvKiByb3VnaCBlc3RpbWF0ZSB3ZSB3aWxsIHVzZSAzIG1vcmUgZGVzY3JpcHRvci4gKi8KLSNkZWZpbmUgUlQyOFhYX1JFTEVBU0VfREVTQ19SRVNPVVJDRShwQWQsIFF1ZUlkeCkJCQkJCVwKLQkJZG97fXdoaWxlKDApCi0KLSNkZWZpbmUgTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0cocEFkLCBRdWVJZHgsIGZyZWVOdW0sIF9UeEZyYW1lVHlwZSkgXAotCQkoKChmcmVlTnVtICE9IChUWF9SSU5HX1NJWkUtMSkpICYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA9PSAwKSkgfHwgKGZyZWVOdW08MykpCi0JCS8vKCgoZnJlZU51bSkgIT0gKFRYX1JJTkdfU0laRS0xKSkgJiYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID09IDEgLyowKi8pKQotCi0KLSNkZWZpbmUgSEFMX0tpY2tPdXRNZ210VHgoX3BBZCwgX1F1ZUlkeCwgX3BQYWNrZXQsIF9wU3JjQnVmVkEsIF9TcmNCdWZMZW4pCVwKLQkJCVJ0bXBQQ0lNZ210S2lja091dChfcEFkLCBfUXVlSWR4LCBfcFBhY2tldCwgX3BTcmNCdWZWQSwgX1NyY0J1ZkxlbikKLQotI2RlZmluZSBSVE1QX1BLVF9UQUlMX1BBRERJTkcgMAotCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYCTAKLQotI2RlZmluZSBIQUxfV3JpdGVTdWJUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBiSXNMYXN0LCBwRnJlZU51bWJlcikJXAotCQkvKiBSdG1wUENJX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpKi8KLQotI2RlZmluZSBIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCi0JCQlSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sIHBGcmVlTnVtYmVyKSBcCi0JCQlSdG1wUENJX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsayxmcmFtZU51bSwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCBwRnJlZU51bWJlcikKLQotI2RlZmluZSBIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UoX3BBZCwgX3BUeEJsaywgX1RvdGFsTVBEVVNpemUsIF9GaXJzdFR4SWR4KQlcCi0JCQlSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKF9wQWQsIF9wVHhCbGssIF9Ub3RhbE1QRFVTaXplLCBfRmlyc3RUeElkeCkKLQotI2RlZmluZSBIQUxfTGFzdFR4SWR4KF9wQWQsIF9RdWVJZHgsX0xhc3RUeElkeCkgXAotCQkJLypSdG1wUENJRGF0YUxhc3RUeElkeChfcEFkLCBfUXVlSWR4LF9MYXN0VHhJZHgpKi8KLQotI2RlZmluZSBIQUxfS2lja091dFR4KF9wQWQsIF9wVHhCbGssIF9RdWVJZHgpCVwKLQkJCVJUTVBfSU9fV1JJVEUzMigoX3BBZCksIFRYX0NUWF9JRFgwKygoX1F1ZUlkeCkqMHgxMCksIChfcEFkKS0+VHhSaW5nWyhfUXVlSWR4KV0uVHhDcHVJZHgpCi0vKgkJCVJ0bXBQQ0lEYXRhS2lja091dChfcEFkLCBfcFR4QmxrLCBfUXVlSWR4KSovCi0KLSNkZWZpbmUgSEFMX0tpY2tPdXROdWxsRnJhbWVUeChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQlcCi0JCQlNaW5pcG9ydE1NUmVxdWVzdChfcEFkLCBfUXVlSWR4LCBfcE51bGxGcmFtZSwgX2ZyYW1lTGVuKQotCi0jZGVmaW5lIEdFVF9UWFJJTkdfRlJFRU5PKF9wQWQsIF9RdWVJZHgpIFwKLQkoX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4ID4gX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4Q3B1SWR4KQk/IFwKLQkJCShfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhTd0ZyZWVJZHggLSBfcEFkLT5UeFJpbmdbX1F1ZUlkeF0uVHhDcHVJZHggLSAxKSBcCi0JCQkgOglcCi0JCQkoX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4ICsgVFhfUklOR19TSVpFIC0gX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4Q3B1SWR4IC0gMSk7Ci0KLQotI2RlZmluZSBHRVRfTUdNVFJJTkdfRlJFRU5PKF9wQWQpIFwKLQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPiBfcEFkLT5NZ210UmluZy5UeENwdUlkeCkJPyBcCi0JCQkoX3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggLSBfcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDEpIFwKLQkJCSA6CVwKLQkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0gX3BBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxKTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBSWCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8vIG5vIHVzZQotI2RlZmluZSBSVDI4WFhfUkNWX1BLVF9HRVRfSU5JVChwQWQpCi0jZGVmaW5lIFJUMjhYWF9SVl9BX0JVRl9FTkQKLS8vI2RlZmluZSBSVDI4WFhfUlZfQUxMX0JVRl9FTkQKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBBU0lDIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8vIG5vIHVzZQotI2RlZmluZSBSVDI4WFhfRE1BX1BPU1RfV1JJVEUocEFkKQotCi0vLyByZXNldCBNQUMgb2YgYSBzdGF0aW9uIGVudHJ5IHRvIDB4MDAwMDAwMDAwMDAwCi0jZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJCQkJCQlcCi0JQXNpY0RlbFdjaWRUYWIocEFkLCBXY2lkKTsKLQotLy8gYWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCi0jZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KQkJCQkJCQlcCi0JQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkcik7Ci0KLS8vIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQwotI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCc3NJZHgsIFdjaWQpCQkJCQlcCi0JQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBCc3NJZHgsIChVQ0hBUilXY2lkKTsKLQotLy8gYWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSNkZWZpbmUgUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIGFwaWR4LCBLZXlJRCwgcEVudHJ5KQkJXAotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBhcGlkeCwgS2V5SUQsIAkJCQkJXAotCQkJCQkJCXBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uQ2lwaGVyQWxnLCBwRW50cnkpOwotCi0jZGVmaW5lIFJUMjhYWF9TRUNVUklUWV9LRVlfQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQkJCVwKLQl7CS8qIHVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlICovCVwKLQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgYXBpZHgsIEtleUlELAkJCQkJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsCQlcCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uS2V5LAkJCQlcCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W2FwaWR4XVtLZXlJRF0uVHhNaWMsCQkJXAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVthcGlkeF1bS2V5SURdLlJ4TWljKTsJCQlcCi0JCS8qIHVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLwkJCVwKLQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIGFwaWR4LCBLZXlJRCwJCQkJCVwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGcsCQlcCi0JCQkJCQkgIHBFbnRyeSk7IH0KLQotCi0vLyBJbnNlcnQgdGhlIEJBIGJpdG1hcCB0byBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQotI2RlZmluZSBSVDI4WFhfQUREX0JBX1NFU1NJT05fVE9fQVNJQyhfcEFkLCBfQWlkLCBfVElEKQkJCQkJXAotCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAotCQkJVUlOVDMyCV9WYWx1ZSA9IDAsIF9PZmZzZXQ7CQkJCQkJCQkJXAotCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX0FpZCkgKiBIV19XQ0lEX0VOVFJZX1NJWkUgKyA0OwlcCi0JCQlSVE1QX0lPX1JFQUQzMigoX3BBZCksIF9PZmZzZXQsICZfVmFsdWUpOwkJCQkJXAotCQkJX1ZhbHVlIHw9ICgweDEwMDAwPDwoX1RJRCkpOwkJCQkJCQkJXAotCQkJUlRNUF9JT19XUklURTMyKChfcEFkKSwgX09mZnNldCwgX1ZhbHVlKTsJCQkJCVwKLQkJfXdoaWxlKDApCi0KLQotLy8gUmVtb3ZlIHRoZSBCQSBiaXRtYXAgZnJvbSBBU0lDIGZvciB0aGUgV2NpZCBlbnRyeQotLy8JCWJpdG1hcCBmaWVsZCBzdGFydHMgYXQgMHgxMDAwMCBpbiBBU0lDIFdDSUQgdGFibGUKLSNkZWZpbmUgUlQyOFhYX0RFTF9CQV9TRVNTSU9OX0ZST01fQVNJQyhfcEFkLCBfV2NpZCwgX1RJRCkJCQkJXAotCQlkb3sJCQkJCQkJCQkJCQkJCQkJXAotCQkJVUlOVDMyCV9WYWx1ZSA9IDAsIF9PZmZzZXQ7CQkJCQkJCQkJXAotCQkJX09mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoX1djaWQpICogSFdfV0NJRF9FTlRSWV9TSVpFICsgNDsJXAotCQkJUlRNUF9JT19SRUFEMzIoKF9wQWQpLCBfT2Zmc2V0LCAmX1ZhbHVlKTsJCQkJCVwKLQkJCV9WYWx1ZSAmPSAofigweDEwMDAwIDw8IChfVElEKSkpOwkJCQkJCQlcCi0JCQlSVE1QX0lPX1dSSVRFMzIoKF9wQWQpLCBfT2Zmc2V0LCBfVmFsdWUpOwkJCVwKLQkJfXdoaWxlKDApCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gUENJL1VTQiBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApCQkJCVwKLQkoKFBPU19DT09LSUUpaGFuZGxlKS0+cGNpX2RldiA9IGRldl9wOwotCi0vLyBzZXQgZHJpdmVyIGRhdGEKLSNkZWZpbmUgUlQyOFhYX0RSVkRBVEFfU0VUKF9hKQkJCXBjaV9zZXRfZHJ2ZGF0YShfYSwgbmV0X2Rldik7Ci0KLSNkZWZpbmUgUlQyOFhYX1VOTUFQKCkJCQkJCQkJCQkJXAotewlpZiAobmV0X2Rldi0+YmFzZV9hZGRyKQl7CQkJCQkJCQlcCi0JCWlvdW5tYXAoKHZvaWQgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7CQkJCVwKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChkZXZfcCwgMCksCVwKLQkJCQkJCQlwY2lfcmVzb3VyY2VfbGVuKGRldl9wLCAwKSk7IH0JXAotCWlmIChuZXRfZGV2LT5pcnEpIHBjaV9yZWxlYXNlX3JlZ2lvbnMoZGV2X3ApOyB9Ci0KLSNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKLSNkZWZpbmUgUlRNUF9NU0lfRU5BQkxFKF9wQWQpIFwKLXsgCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsgXAotCShfcEFkKS0+SGF2ZU1zaSA9CXBjaV9lbmFibGVfbXNpKF9wT2JqLT5wY2lfZGV2KSA9PSAwID8gVFJVRSA6IEZBTFNFOyB9Ci0KLSNkZWZpbmUgUlRNUF9NU0lfRElTQUJMRShfcEFkKSBcCi17IAlQT1NfQ09PS0lFIF9wT2JqID0gKFBPU19DT09LSUUpKF9wQWQtPk9TX0Nvb2tpZSk7IFwKLQlpZiAoX3BBZC0+SGF2ZU1zaSA9PSBUUlVFKSBcCi0JCXBjaV9kaXNhYmxlX21zaShfcE9iai0+cGNpX2Rldik7IFwKLQlfcEFkLT5IYXZlTXNpID0gRkFMU0U7CX0KLSNlbHNlCi0jZGVmaW5lIFJUTVBfTVNJX0VOQUJMRShfcEFkKQotI2RlZmluZSBSVE1QX01TSV9ESVNBQkxFKF9wQWQpCi0jZW5kaWYgLy8gUENJX01TSV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgU0FfU0hJUlEgSVJRRl9TSEFSRUQKLQotI2RlZmluZSBSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2RldikJCQkJCQkJXAotewlQUlRNUF9BREFQVEVSIF9wQWQgPSAoUFJUTVBfQURBUFRFUikoKG5ldF9kZXYpLT5tbF9wcml2KTsJXAotCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCVwKLQlSVE1QX01TSV9FTkFCTEUoX3BBZCk7CQkJCQkJCQkJXAotCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoX3BPYmotPnBjaV9kZXYtPmlycSwgCQlcCi0JCQkJCQkJcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsCQlcCi0JCQkJCQkJKG5ldF9kZXYpLT5uYW1lLCAobmV0X2RldikpKSkgewlcCi0JCXByaW50aygiUlQyODYwOiByZXF1ZXN0X2lycSAgRVJST1IoJWQpXG4iLCByZXR2YWwpOwlcCi0JcmV0dXJuIHJldHZhbDsgfSB9Ci0KLSNkZWZpbmUgUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCQkJCQkJCQlcCi17CVBSVE1QX0FEQVBURVIgX3BBZCA9IChQUlRNUF9BREFQVEVSKSgobmV0X2RldiktPm1sX3ByaXYpOwkJXAotCVBPU19DT09LSUUgX3BPYmogPSAoUE9TX0NPT0tJRSkoX3BBZC0+T1NfQ29va2llKTsJCQlcCi0Jc3luY2hyb25pemVfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEpOwkJCQkJCVwKLQlmcmVlX2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAobmV0X2RldikpOwkJCQkJXAotCVJUTVBfTVNJX0RJU0FCTEUoX3BBZCk7IH0KLQotI2RlZmluZSBSVDI4WFhfSVJRX0lOSVQocEFkKQkJCQkJCQkJCQlcCi0JewlwQWQtPmludF9lbmFibGVfcmVnID0gKChERUxBWUlOVE1BU0spIHwJCQkJCQlcCi0JCQkJCQkJKFJ4SU5UfFR4RGF0YUludHxUeE1nbXRJbnQpKSAmIH4oMHgwMyk7CVwKLQkJcEFkLT5pbnRfZGlzYWJsZV9tYXNrID0gMDsJCQkJCQkJCQlcCi0JCXBBZC0+aW50X3BlbmRpbmcgPSAwOyB9Ci0KLSNkZWZpbmUgUlQyOFhYX0lSUV9FTkFCTEUocEFkKQkJCQkJCQkJCVwKLQl7CS8qIGNsZWFyIGdhcmJhZ2UgaW50cyAqLwkJCQkJCQkJXAotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgMHhmZmZmZmZmZik7CQlcCi0JCU5JQ0VuYWJsZUludGVycnVwdChwQWQpOyB9Ci0KLSNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UoZGV2X3ApCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gTUxNRSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9NTE1FX0hBTkRMRVIocEFkKQkJCU1sbWVIYW5kbGVyKHBBZCkKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9QUkVfU0FOSVRZX0NIRUNLKHBBZCkKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9TVEFfUVVJQ0tfUlNQX1dBS0VfVVAocEFkKQlcCi0JUlRNUFNldFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgMTAwKTsKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCkJXAotCQlNbG1lUmVzdGFydFN0YXRlTWFjaGluZShwQWQpCi0KLSNkZWZpbmUgUlQyOFhYX0hBTkRMRV9DT1VOVEVSX01FQVNVUkUoX3BBZCwgX3BFbnRyeSkJCVwKLQkJSGFuZGxlQ291bnRlck1lYXN1cmUoX3BBZCwgX3BFbnRyeSkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gUG93ZXIgU2F2ZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKQkJCQlFbnF1ZXVlUHNQb2xsKHBBZCkKLQotLy8KLS8vIERldmljZSBJRCAmIFZlbmRvciBJRCwgdGhlc2UgdmFsdWVzIHNob3VsZCBtYXRjaCBFRVBST00gdmFsdWUKLS8vCi0jZGVmaW5lIE5JQzI4NjBfUENJX0RFVklDRV9JRCAgIDB4MDYwMQotI2RlZmluZSBOSUMyODYwX1BDSWVfREVWSUNFX0lEICAweDA2ODEKLSNkZWZpbmUgTklDMjc2MF9QQ0lfREVWSUNFX0lEICAgMHgwNzAxCQkvLyAxVC8yUiBDYXJkYnVzID8/PwotI2RlZmluZSBOSUMyNzkwX1BDSWVfREVWSUNFX0lEICAweDA3ODEJICAgIC8vIDFULzJSIG1pbmlDYXJkCi0KLSNkZWZpbmUgTklDX1BDSV9WRU5ET1JfSUQgICAgICAgMHgxODE0Ci0KLSNkZWZpbmUgVkVOX0FXVF9QQ0llX0RFVklDRV9JRAkweDEwNTkKLSNkZWZpbmUgVkVOX0FXVF9QQ0lfVkVORE9SX0lECTB4MUEzQgotCi0jZGVmaW5lIEVESU1BWF9QQ0lfVkVORE9SX0lECTB4MTQzMgotCi0vLyBGb3IgUlRNUFBDSWVQb3dlckxpbmtDdHJsUmVzdG9yZSAoKSBmdW5jdGlvbgotI2RlZmluZSBSRVNUT1JFX0hBTFQJCSAgICAxCi0jZGVmaW5lIFJFU1RPUkVfV0FLRVVQCQkgICAgMgotI2RlZmluZSBSRVNUT1JFX0NMT1NFICAgICAgICAgICAzCi0KLSNkZWZpbmUgUG93ZXJTYWZlQ0lECQkxCi0jZGVmaW5lIFBvd2VyUmFkaW9PZmZDSUQJCTIKLSNkZWZpbmUgUG93ZXJXYWtlQ0lECQkzCi0jZGVmaW5lIENJRDBNQVNLCQkweDAwMDAwMGZmCi0jZGVmaW5lIENJRDFNQVNLCQkweDAwMDBmZjAwCi0jZGVmaW5lIENJRDJNQVNLCQkweDAwZmYwMDAwCi0jZGVmaW5lIENJRDNNQVNLCQkweGZmMDAwMDAwCi0KLSNkZWZpbmUgUENJX1JFR19SRUFEX1dPUkQocGNpX2Rldiwgb2Zmc2V0LCBDb25maWd1cmF0aW9uKSAgIFwKLSAgICBpZiAocGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2Rldiwgb2Zmc2V0LCAmcmVnMTYpID09IDApICAgICBcCi0gICAgICAgIENvbmZpZ3VyYXRpb24gPSBsZTJjcHUxNihyZWcxNik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ29uZmlndXJhdGlvbiA9IDA7Ci0KLSNkZWZpbmUgUENJX1JFR19XSVJURV9XT1JEKHBjaV9kZXYsIG9mZnNldCwgQ29uZmlndXJhdGlvbikgIFwKLSAgICByZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpX2Rldiwgb2Zmc2V0LCByZWcxNik7ICAgICAgICAgIFwKLQotI2RlZmluZSBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIExldmVsKSBcCi0gICAgUlQyOHh4UGNpU3RhQXNpY0ZvcmNlV2FrZXVwKHBBZCwgTGV2ZWwpOwotCi0jZGVmaW5lIFJUMjhYWF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApIFwKLSAgICBSVDI4eHhQY2lTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOwotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09OKHBBZCkgXAotICAgIFJUMjh4eFBjaU1sbWVSYWRpb09uKHBBZCk7Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfUkFESU9fT0ZGKHBBZCkgXAotICAgIFJUMjh4eFBjaU1sbWVSYWRpb09GRihwQWQpOwotCi0jZW5kaWYgLy9fX1JUMjg2MF9IX18KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnQyOHh4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODUyNTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydDI4eHguaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ODggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydDI4eHguaAotCi0JQWJzdHJhY3Q6Ci0JUlQyOHh4IEFTSUMgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkgIFdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgIEphbiBMZWUgICAgICAgICAgIEphbi0zLTIwMDYgICAgIGNyZWF0ZWQgZm9yIFJUMjg2MGMKLSovCi0KLSNpZm5kZWYJX19SVDI4WFhfSF9fCi0jZGVmaW5lCV9fUlQyOFhYX0hfXwotCi0KLS8vCi0vLyBQQ0kgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDAwMAotLy8KLSNkZWZpbmUgUENJX0NGRwkJCTB4MDAwMAotI2RlZmluZSBQQ0lfRUVDVFJMCQkJMHgwMDA0Ci0jZGVmaW5lIFBDSV9NQ1VDVFJMCQkJMHgwMDA4Ci0KLXR5cGVkZWYgaW50IE5UU1RBVFVTOwotCi0jZGVmaW5lCU9QVF8xNAkJCTB4MTE0Ci0KLS8vCi0vLyBTQ0gvRE1BIHJlZ2lzdGVycyAtIGJhc2UgYWRkcmVzcyAweDAyMDAKLS8vCi0vLyBJTlRfU09VUkNFX0NTUjogSW50ZXJydXB0IHNvdXJjZSByZWdpc3Rlci4gV3JpdGUgb25lIHRvIGNsZWFyIGNvcnJlc3BvbmRpbmcgYml0Ci0vLwotI2RlZmluZSBETUFfQ1NSMCAgICAgIDB4MjAwCi0jZGVmaW5lIElOVF9TT1VSQ0VfQ1NSICAgICAgMHgyMDAKLXR5cGVkZWYJdW5pb24JX0lOVF9TT1VSQ0VfQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJ4RGVsYXlJTlQ6MTsKLQkJVUlOVDMyCQlUeERlbGF5SU5UOjE7Ci0JCVVJTlQzMgkJUnhEb25lOjE7Ci0JCVVJTlQzMgkJQWMwRG1hRG9uZToxOy8vNAotCQlVSU5UMzIgICAgICAgCUFjMURtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlBYzJEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJQWMzRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUhjY2FEbWFEb25lOjE7IC8vIGJpdDcKLQkJVUlOVDMyICAgICAgIAlNZ210RG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCU1DVUNvbW1hbmRJTlQ6MTsvL2JpdCA5Ci0JCVVJTlQzMiAgICAgICAJUnhUeENvaGVyZW50OjE7Ci0JCVVJTlQzMiAgICAgICAJVEJUVEludDoxOwotCQlVSU5UMzIgICAgICAgCVByZVRCVFQ6MTsKLQkJVUlOVDMyICAgICAgIAlUWEZpZm9TdGF0dXNJbnQ6MTsvL0ZJRk8gU3RhdGlzdGljcyBpcyBmdWxsLCBzdyBzaG91bGQgcmVhZCAweDE3MWMKLQkJVUlOVDMyICAgICAgIAlBdXRvV2FrZXVwOjE7Ly9iaXQxNAotCQlVSU5UMzIgICAgICAgCUdQVGltZXI6MTsKLQkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7Ly9iaXQxNgotCQlVSU5UMzIgICAgICAgCVR4Q29oZXJlbnQ6MTsKLQkJVUlOVDMyICAgICAgIAk6MTQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLQotLy8KLS8vIElOVF9NQVNLX0NTUjogICBJbnRlcnJ1cHQgTUFTSyByZWdpc3Rlci4gICAxOiB0aGUgaW50ZXJydXB0IGlzIG1hc2sgT0ZGCi0vLwotI2RlZmluZSBJTlRfTUFTS19DU1IgICAgICAgIDB4MjA0Ci10eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7Ci0JCVVJTlQzMgkJVHhEZWxheToxOwotCQlVSU5UMzIJCVJ4RG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlBYzFEbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyICAgICAgIAlIY2NhRG1hRG9uZToxOwotCQlVSU5UMzIgICAgICAgCU1nbXREbWFEb25lOjE7Ci0JCVVJTlQzMiAgICAgICAJTUNVQ29tbWFuZElOVDoxOwotCQlVSU5UMzIgICAgICAgCToyMDsKLQkJVUlOVDMyICAgICAgIAlSeENvaGVyZW50OjE7Ci0JCVVJTlQzMiAgICAgICAJVHhDb2hlcmVudDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKLQotI2RlZmluZSBXUERNQV9HTE9fQ0ZHIAkweDIwOAotdHlwZWRlZgl1bmlvbglfV1BETUFfR0xPX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlFbmFibGVUeERNQToxOwotCQlVSU5UMzIJCVR4RE1BQnVzeToxOwotCQlVSU5UMzIJCUVuYWJsZVJ4RE1BOjE7Ci0JCVVJTlQzMgkJUnhETUFCdXN5OjE7Ci0JCVVJTlQzMiAgICAgICAJV1BETUFCdXJzdFNJWkU6MjsKLQkJVUlOVDMyICAgICAgIAlFblRYV3JpdGVCYWNrRERPTkU6MTsKLQkJVUlOVDMyICAgICAgIAlCaWdFbmRpYW46MTsKLQkJVUlOVDMyICAgICAgIAlSWEhkclNjYXRlcjo4OwotCQlVSU5UMzIgICAgICAgCUhEUl9TRUdfTEVOOjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gV1BETUFfR0xPX0NGR19TVFJVQywgKlBXUERNQV9HTE9fQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIFdQRE1BX1JTVF9JRFggCTB4MjBjCi10eXBlZGVmCXVuaW9uCV9XUERNQV9SU1RfSURYX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOwotCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNDoxOwotCQlVSU5UMzIgICAgICAgCVJTVF9EVFhfSURYNToxOwotCQlVSU5UMzIgICAgICAgCXJzdjoxMDsKLQkJVUlOVDMyICAgICAgIAlSU1RfRFJYX0lEWDA6MTsKLQkJVUlOVDMyICAgICAgIAk6MTU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBXUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7Ci0KLSNkZWZpbmUgREVMQVlfSU5UX0NGRyAgMHgwMjEwCi10eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMiAgICAgICAJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIgICAgICAgCVJYRExZX0lOVF9FTjoxOwotCQlVSU5UMzIgICAgICAgCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMiAgICAgICAJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIgICAgICAgCVRYRExZX0lOVF9FTjoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKLXR5cGVkZWYJdW5pb24JX0FJRlNOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCSAgICBVSU5UMzIgICBBaWZzbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCi0JICAgIFVJTlQzMiAgIEFpZnNuMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBSc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBSUZTTl9DU1JfU1RSVUMsICpQQUlGU05fQ1NSX1NUUlVDOwotCi0vLwotLy8gQ1dNSU5fQ1NSOiBDV21pbiBmb3IgZWFjaCBFRENBIEFDCi0vLwotI2RlZmluZSBXTU1fQ1dNSU5fQ0ZHICAgMHgwMjE4Ci10eXBlZGVmCXVuaW9uCV9DV01JTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEN3bWluMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21pbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWluMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNSU5fQ1NSX1NUUlVDLCAqUENXTUlOX0NTUl9TVFJVQzsKLQotLy8KLS8vIENXTUFYX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQwotLy8KLSNkZWZpbmUgV01NX0NXTUFYX0NGRyAgIDB4MDIxYwotdHlwZWRlZgl1bmlvbglfQ1dNQVhfQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICBDd21heDA6NDsgICAgICAgLy8gZm9yIEFDX0JFCi0JICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQ3dtYXgyOjQ7ICAgICAgIC8vIGZvciBBQ19WSQotCSAgICBVSU5UMzIgICBDd21heDM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCi0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUNXTUFYX0NTUl9TVFJVQywgKlBDV01BWF9DU1JfU1RSVUM7Ci0KLS8vCi0vLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOwotCi0vLwotLy8gQUNfVFhPUF9DU1IxOiBBQ19WTy9BQ19WSSBUWE9QIHJlZ2lzdGVyCi0vLwotI2RlZmluZSBXTU1fVFhPUDFfQ0ZHICAgIDB4MDIyNAotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKLQotI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCi0jZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8vTUFDX0NTUjEzCi0jZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYwotI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvL0FDX0JLIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAotI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKLSNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKLSNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAgCS8vQUNfQkUgYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQxICAgICAgMHgwMjQ0Ci0jZGVmaW5lIFRYX0NUWF9JRFgxICAgICAgIDB4MDI0OAotI2RlZmluZSBUWF9EVFhfSURYMSAgICAgIDB4MDI0YwotI2RlZmluZSBUWF9CQVNFX1BUUjIgICAgIDB4MDI1MCAJLy9BQ19WSSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKLSNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4Ci0jZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwIAkvL0FDX1ZPIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAotI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKLSNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKLSNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAgCS8vSENDQSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDQgICAgICAweDAyNzQKLSNkZWZpbmUgVFhfQ1RYX0lEWDQgICAgICAgMHgwMjc4Ci0jZGVmaW5lIFRYX0RUWF9JRFg0ICAgICAgMHgwMjdjCi0jZGVmaW5lIFRYX0JBU0VfUFRSNSAgICAgMHgwMjgwIAkvL01HTVQgYmFzZSBhZGRyZXNzCi0jZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0Ci0jZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAotI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YwotI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1Ci0jZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1Ci0jZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKLSNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MCAJLy9SWCBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgUlhfTUFYX0NOVCAgICAgIDB4MDI5NAotI2RlZmluZSBSWF9DUlhfSURYICAgICAgIDB4MDI5OAotI2RlZmluZSBSWF9EUlhfSURYICAgICAgMHgwMjljCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHICAgICAgMHgwMmEwCi0KLXR5cGVkZWYJdW5pb24JX1VTQl9ETUFfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ1RPdXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBUaW1lT3V0ICBpbiB1bml0IG9mIDMzbnMKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAyNTYgYnl0ZXMKLQkgICAgVUlOVDMyICBwaHljbGVhcjoxOyAgICAgICAgCQkvL3BoeSB3YXRjaCBkb2cgZW5hYmxlLiB3cml0ZSAxCi0JICAgIFVJTlQzMiAgcnN2OjI7Ci0JICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKLQkgICAgVUlOVDMyICBUeG9wSGFsdDoxOyAgICAgICAgLy9IYWx0IFRYT1AgY291bnQgZG93biB3aGVuIFRYIGJ1ZmZlciBpcyBmdWxsLgotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0VuOjE7ICAgICAgICAvL0VuYWJsZSBSeCBCdWxrIEFnZ3JlZ2F0aW9uCi0JICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKLQkgICAgVUlOVDMyICBUeEJ1bGtFbjoxOyAgICAgICAgLy9FbmFibGUgVVNCIERNQSBUeAotCSAgICBVSU5UMzIgIEVwb3V0VmFsaWQ6NjsgICAgICAgIC8vT1VUIGVuZHBvaW50IGRhdGEgdmFsaWQKLQkgICAgVUlOVDMyICBSeEJ1c3k6MTsgICAgICAgIC8vVVNCIERNQSBSWCBGU00gYnVzeQotCSAgICBVSU5UMzIgIFR4QnVzeToxOyAgIAkvL1VTQiBETUEgVFggRlNNIGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVVTQl9ETUFfQ0ZHX1NUUlVDLCAqUFVTQl9ETUFfQ0ZHX1NUUlVDOwotCi0vLwotLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCi0vLwotLy8KLS8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgotI2RlZmluZSAJUEJGX1NZU19DVFJMIAkgMHgwNDAwCi0jZGVmaW5lICAgICBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKLSNkZWZpbmUgCVBCRl9NQVhfUENOVCAJIDB4MDQwQwotI2RlZmluZSAJUEJGX0NUUkwJIAkweDA0MTAKLSNkZWZpbmUgCVBCRl9JTlRfU1RBCSAweDA0MTQKLSNkZWZpbmUgCVBCRl9JTlRfRU5BCSAweDA0MTgKLSNkZWZpbmUgCVRYUlhRX1BDTlQgIAkgMHgwNDM4Ci0jZGVmaW5lIAlQQkZfREJHIAkgCSAweDA0M2MKLSNkZWZpbmUgICAgIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCi0KLS8vIGVGdXNlIHJlZ2lzdGVycwotI2RlZmluZSBFRlVTRV9DVFJMICAgICAgICAgICAgICAweDA1ODAKLSNkZWZpbmUgRUZVU0VfREFUQTAgICAgICAgICAgICAgMHgwNTkwCi0jZGVmaW5lIEVGVVNFX0RBVEExICAgICAgICAgICAgIDB4MDU5NAotI2RlZmluZSBFRlVTRV9EQVRBMiAgICAgICAgICAgICAweDA1OTgKLSNkZWZpbmUgRUZVU0VfREFUQTMgICAgICAgICAgICAgMHgwNTljCi0jZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9TVEFSVCAgIDB4MmQwCi0jZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9FTkQgICAgIDB4MmZjCi0jZGVmaW5lIEVGVVNFX1RBRyAgICAgICAgICAgICAgIDB4MmZlCi0jZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9TSVpFICAgIDQ1Ci0KLXR5cGVkZWYJdW5pb24JX0VGVVNFX0NUUkxfU1RSVUMgewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BT1VUOjY7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9NT0RFOjI7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9MRE9fT0ZGX1RJTUU6NjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PTl9USU1FOjI7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BSU46MTA7Ci0JCVVJTlQzMiAgICAgICAgICAgIFJFU0VSVkVEOjQ7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9LSUNLOjE7Ci0JCVVJTlQzMiAgICAgICAgICAgIFNFTF9FRlVTRToxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JRUZVU0VfQ1RSTF9TVFJVQywgKlBFRlVTRV9DVFJMX1NUUlVDOwotCi0jZGVmaW5lIExET19DRkcwIAkJCQkweDA1ZDQKLSNkZWZpbmUgR1BJT19TV0lUQ0gJCQkJMHgwNWRjCi0KLS8vCi0vLyAgNCAgTUFDICByZWdpc3RlcnMKLS8vCi0vLwotLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKLS8vCi0jZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCi10eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKLQkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOwotCi0jZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQotI2RlZmluZSBNQUNfQUREUl9EVzAgICAgICAgICAgICAJCTB4MTAwOAkJLy8gTUFDIEFERFIgRFcwCi0jZGVmaW5lIE1BQ19BRERSX0RXMSAgICAgICAgICAgCQkgMHgxMDBjCQkvLyBNQUMgQUREUiBEVzEKLS8vCi0vLyBNQUNfQ1NSMjogU1RBIE1BQyByZWdpc3RlciAwCi0vLwotdHlwZWRlZgl1bmlvbglfTUFDX0RXMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfRFcwX1NUUlVDLCAqUE1BQ19EVzBfU1RSVUM7Ci0KLS8vCi0vLyBNQUNfQ1NSMzogU1RBIE1BQyByZWdpc3RlciAxCi0vLwotdHlwZWRlZgl1bmlvbglfTUFDX0RXMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0Ci0JCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQotCQlVQ0hBUgkJVTJNZU1hc2s7Ci0JCVVDSEFSCQlSc3ZkMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzFfU1RSVUMsICpQTUFDX0RXMV9TVFJVQzsKLQotI2RlZmluZSBNQUNfQlNTSURfRFcwICAgICAgICAgICAgCQkweDEwMTAJCS8vIE1BQyBCU1NJRCBEVzAKLSNkZWZpbmUgTUFDX0JTU0lEX0RXMSAgICAgICAgICAgIAkJMHgxMDE0CQkvLyBNQUMgQlNTSUQgRFcxCi0KLS8vCi0vLyBNQUNfQ1NSNTogQlNTSUQgcmVnaXN0ZXIgMQotLy8KLXR5cGVkZWYJdW5pb24JX01BQ19DU1I1X1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0Ci0JCVVDSEFSCQlCeXRlNTsJCSAvLyBCU1NJRCBieXRlIDUKLQkJVVNIT1JUICAgICAgCUJzc0lkTWFzazoyOyAvLyAwOiBvbmUgQlNTSUQsIDEwOiA0IEJTU0lELCAgMDE6IDIgQlNTSUQgLCAxMTogOEJTU0lECi0JCVVTSE9SVAkJTUJzc0Jjbk51bTozOwotCQlVU0hPUlQJCVJzdmQ6MTE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKLQotI2RlZmluZSBNQVhfTEVOX0NGRyAgICAgICAgICAgICAgMHgxMDE4CQkvLyBydDI4NjBiIG1heCAxNmsgYnl0ZXMuIGJpdDEyOjEzIE1heGltdW0gUFNEVSBsZW5ndGggKHBvd2VyIGZhY3RvcikgMDoyXjEzLCAxOjJeMTQsIDI6Ml4xNSwgMzoyXjE2Ci0jZGVmaW5lIEJCUF9DU1JfQ0ZHICAgICAgICAgICAgCQkweDEwMWMJCS8vCi0vLwotLy8gQkJQX0NTUl9DRkc6IEJCUCBzZXJpYWwgY29udHJvbCByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgotCQlVSU5UMzIJCUJCUF9QQVJfRFVSOjE7CQkgICAgIC8vIDA6IDQgTUFDIGNsb2NrIGN5Y2xlcyAgMTogOCBNQUMgY2xvY2sgY3ljbGVzCi0JCVVJTlQzMgkJQkJQX1JXX01PREU6MTsJCS8vIDA6IHVzZSBzZXJpYWwgbW9kZSAgMTpwYXJhbGxlbAotCQlVSU5UMzIJCToxMjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUJCUF9DU1JfQ0ZHX1NUUlVDLCAqUEJCUF9DU1JfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIFJGX0NTUl9DRkcwICAgICAgICAgICAgCQkweDEwMjAKLS8vCi0vLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKLQkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKLQkJVUlOVDMyCQlTZWw6MTsJCQkJLy8gMDpSRl9MRTAgYWN0aXZhdGUgIDE6UkZfTEUxIGFjdGl2YXRlCi0JCVVJTlQzMgkJQnVzeToxOwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcwX1NUUlVDLCAqUFJGX0NTUl9DRkcwX1NUUlVDOwotCi0jZGVmaW5lIFJGX0NTUl9DRkcxICAgICAgICAgICAJCTB4MTAyNAotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKLQkJVUlOVDMyCQlSRkdhcDo1OwkJCS8vIEdhcCBiZXR3ZWVuIEJCX0NPTlRST0xfUkYgYW5kIFJGX0xFLiAwOiAzIHN5c3RlbSBjbG9jayBjeWNsZSAoMzcuNXVzZWMpIDE6IDUgc3lzdGVtIGNsb2NrIGN5Y2xlICg2Mi41dXNlYykKLQkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMV9TVFJVQywgKlBSRl9DU1JfQ0ZHMV9TVFJVQzsKLQotI2RlZmluZSBSRl9DU1JfQ0ZHMiAgICAgICAgICAgCQkweDEwMjgJCS8vCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOwotCi0jZGVmaW5lIExFRF9DRkcgICAgICAgICAgIAkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0Ci10eXBlZGVmCXVuaW9uCV9MRURfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCi0JCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCVNsb3dCbGlua1BlcmlvZDo2OwkJCS8vIHNsb3cgYmxpbmtpbmcgcGVyaW9kLiB1bml0OjFtcwotCQlVSU5UMzIJCXJzdjoyOwotCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCi0JCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQotCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCi0JCVVJTlQzMgkJTGVkUG9sYXI6MTsJCQkvLyBMZWQgUG9sYXJpdHkuICAwOiBhY3RpdmUgbG93MTogYWN0aXZlIGhpZ2gKLQkJVUlOVDMyCQk6MTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUxFRF9DRkdfU1RSVUMsICpQTEVEX0NGR19TVFJVQzsKLQotLy8KLS8vICA0LjIgTUFDIFRJTUlORyAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDExMDApCi0vLwotI2RlZmluZSBYSUZTX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwMAkJIC8vIE1BQ19DU1I4ICBNQUNfQ1NSOQotdHlwZWRlZgl1bmlvbglfSUZTX1NMT1RfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAotCSAgICBVSU5UMzIgIE9mZG1TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlgvVFgKLQkgICAgVUlOVDMyICBPZmRtWGlmc1RpbWU6NDsgICAgICAgIC8vT0ZETSBTSUZTLiB1bml0IDF1cy4gQXBwbGllZCBhZnRlciBPRkRNIFJYIHdoZW4gTUFDIGRvZXNuJ3QgcmVmZXJlbmNlIEJCUCBzaWduYWwgQkJSWEVORAotCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cwotCSAgICBVSU5UMzIgIEJCUnhlbmRFbmFibGU6MTsgICAgICAgIC8vICByZWZlcmVuY2UgUlhFTkQgc2lnbmFsIHRvIGJlZ2luIFhJRlMgZGVmZXIKLQkgICAgVUlOVDMyICByc3Y6MjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUlGU19TTE9UX0NGR19TVFJVQywgKlBJRlNfU0xPVF9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgQktPRkZfU0xPVF9DRkcgICAgICAgICAgICAgMHgxMTA0CQkgLy8gIG1hY19jc3I5IGxhc3QgOCBiaXRzCi0jZGVmaW5lIE5BVl9USU1FX0NGRyAgICAgICAgICAgICAweDExMDgJCSAvLyBOQVYgIChNQUNfQ1NSMTUpCi0jZGVmaW5lIENIX1RJTUVfQ0ZHICAgICAgICAgICAgIDB4MTEwQwkJIAkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKLSNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCi0jZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKLQotI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKLSNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCi0KLS8vCi0vLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZwotCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCi0gICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOwotCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCi0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOCAgCQkvLyB0eHJ4X2NzcjEwCi0jZGVmaW5lIFRTRl9USU1FUl9EVzAgICAgICAgICAgICAgMHgxMTFDICAJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5Ci0jZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwICAJCS8vIG1zYiAzMiBiaXRzLiBSZWFkLW9ubHkuCi0jZGVmaW5lIFRCVFRfVElNRVIgICAgICAgICAgICAgCTB4MTEyNCAgCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0Ci0jZGVmaW5lIElOVF9USU1FUl9DRkcgICAgICAgICAgICAgIAkweDExMjggIAkJLy8KLSNkZWZpbmUgSU5UX1RJTUVSX0VOICAgICAgICAgICAgIAkweDExMmMgIAkJLy8gIEdQLXRpbWVyIGFuZCBwcmUtdGJ0dCBJbnQgZW5hYmxlCi0jZGVmaW5lIENIX0lETEVfU1RBICAgICAgICAgICAgICAJMHgxMTMwICAJCS8vICBjaGFubmVsIGlkbGUgdGltZQotI2RlZmluZSBDSF9CVVNZX1NUQSAgICAgICAgICAgICAgCTB4MTEzNCAgCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKLS8vCi0vLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCi0vLwotI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCi0jZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKLSNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKLS8vCi0vLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyCQk6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKLQotLy8KLS8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKLS8vCi0KLSNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0Ci0jZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKLSNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAotI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCi10eXBlZGVmCXVuaW9uCV9FRENBX0FDX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKLQkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKLQkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKLQkgICAgVUlOVDMyICA6MTI7ICAgICAgIC8vCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFRENBX0FDX0NGR19TVFJVQywgKlBFRENBX0FDX0NGR19TVFJVQzsKLQotI2RlZmluZSBFRENBX1RJRF9BQ19NQVAJMHgxMzEwCi0jZGVmaW5lIFRYX1BXUl9DRkdfMAkweDEzMTQKLSNkZWZpbmUgVFhfUFdSX0NGR18xCTB4MTMxOAotI2RlZmluZSBUWF9QV1JfQ0ZHXzIJMHgxMzFDCi0jZGVmaW5lIFRYX1BXUl9DRkdfMwkweDEzMjAKLSNkZWZpbmUgVFhfUFdSX0NGR180CTB4MTMyNAotI2RlZmluZSBUWF9QSU5fQ0ZHCQkweDEzMjgKLSNkZWZpbmUgVFhfQkFORF9DRkcJMHgxMzJjCQkvLyAweDEgdXNlIHVwcGVyIDIwTUh6LiAwIGp1c2UgbG93ZXIgMjBNSHoKLSNkZWZpbmUgVFhfU1dfQ0ZHMAkJMHgxMzMwCi0jZGVmaW5lIFRYX1NXX0NGRzEJCTB4MTMzNAotI2RlZmluZSBUWF9TV19DRkcyCQkweDEzMzgKLSNkZWZpbmUgVFhPUF9USFJFU19DRkcJCTB4MTMzYwotI2RlZmluZSBUWE9QX0NUUkxfQ0ZHCQkweDEzNDAKLSNkZWZpbmUgVFhfUlRTX0NGRwkJMHgxMzQ0Ci0KLXR5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4Ci10eXBlZGVmCXVuaW9uCV9UWF9USU1FT1VUX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIHJzdjo0OwotCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKLQkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQotCSAgICBVSU5UMzIgICAgICAgVHhvcFRpbWVvdXQ6ODsJLy9UWE9QIHRpbWVvdXQgdmFsdWUgZm9yIFRYT1AgdHJ1bmNhdGlvbi4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKFNMT1RfVElNRSkgPiAoVFhfT1BfVElNRU9VVCkgPiAoUlhfQUNLX1RJTUVPVVQpCi0JICAgIFVJTlQzMiAgICAgICByc3YyOjg7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfUlRZX0NGRwkweDEzNGMKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKLQkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAotdHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QgUEFDS0VEIHsKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCi0JICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KLQkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKLQotI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9IVF9GQktfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzJGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M0RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzVGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M3RkJLOjQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlIVF9GQktfQ0ZHMF9TVFJVQywgKlBIVF9GQktfQ0ZHMF9TVFJVQzsKLQotI2RlZmluZSBIVF9GQktfQ0ZHMQkweDEzNTgKLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotCi0jZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YwotdHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M1RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA0Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNQotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUxHX0ZCS19DRkcwX1NUUlVDLCAqUExHX0ZCS19DRkcwX1NUUlVDOwotCi0jZGVmaW5lIExHX0ZCS19DRkcxCQkweDEzNjAKLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgotCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy89PT09PT09PT09PT09PT09IFByb3RlY3Rpb24gUGFyYW1hdGVyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBDQ0tfUFJPVF9DRkcJMHgxMzY0CQkvL0NDSyBQcm90ZWN0aW9uCi0jZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKLSNkZWZpbmUgQVNJQ19MT05HTkFWCQkyCi0jZGVmaW5lIEFTSUNfUlRTCQkxCi0jZGVmaW5lIEFTSUNfQ1RTCQkyCi10eXBlZGVmCXVuaW9uCV9QUk9UX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3RSYXRlOjE2OwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSByYXRlIGZvciBDQ0sgVFgoUlRTL0NUUy9DRkVuZCkuCi0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0Q3RybDoyOwkvL1Byb3RlY3Rpb24gY29udHJvbCBmcmFtZSB0eXBlIGZvciBDQ0sgVFguIDE6UlRTL0NUUywgMjpDVFMtdG8tc2VsZiwgMDpOb25lLCAzOnJzdgotCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdE5hdjoyOwkvL1RYT1AgcHJvdGVjdGlvbiB0eXBlIGZvciBDQ0sgVFguIDA6Tm9uZSwgMTpTaG9ydE5BVnByb3RlY3QsICAyOkxvbmdOQVZQcm90ZWN0LCAzOnJzdgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93Q2NrOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dNTTIwOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLiAwOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU00MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0YyMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93R0Y0MDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgUlRTVGhFbjoxOwkvL1JUUyB0aHJlc2hvbGQgZW5hYmxlIG9uIENDSyBUWAotCSAgICBVSU5UMzIgICAgICAgcnN2OjU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlQUk9UX0NGR19TVFJVQywgKlBQUk9UX0NGR19TVFJVQzsKLQotI2RlZmluZSBPRkRNX1BST1RfQ0ZHCTB4MTM2OAkJLy9PRkRNIFByb3RlY3Rpb24KLSNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJCS8vTU0yMCBQcm90ZWN0aW9uCi0jZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCQkvL01NNDAgUHJvdGVjdGlvbgotI2RlZmluZSBHRjIwX1BST1RfQ0ZHCTB4MTM3NAkJLy9HRjIwIFByb3RlY3Rpb24KLSNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJCS8vR1I0MCBQcm90ZWN0aW9uCi0jZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJCS8vCi0jZGVmaW5lIEVYUF9BQ0tfVElNRQkweDEzODAJCS8vCi0KLS8vCi0vLyAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkKLS8vCi0jZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJCQkvL1RYUlhfQ1NSMAotI2RlZmluZSBBVVRPX1JTUF9DRkcJMHgxNDA0CQkJLy9UWFJYX0NTUjQKLS8vCi0vLyBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLwotLy8KLXR5cGVkZWYgdW5pb24gX0FVVE9fUlNQX0NGR19TVFJVQyB7Ci0gc3RydWN0IHsKLSAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJFbmFibGU6MTsKLSAgICAgVUlOVDMyICAgICAgIEJBQ0Fja1BvbGljeUVuYWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQotICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIEF1dG9SZXNwb25kZXJQcmVhbWJsZToxOyAgICAvLyAwOmxvbmcsIDE6c2hvcnQgcHJlYW1ibGUKLSAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgRHVhbENUU0VuOjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICBBY2tDdHNQc21CaXQ6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgICA6MjQ7Ci0gfSBmaWVsZDsKLSBVSU5UMzIgICB3b3JkOwotfSBBVVRPX1JTUF9DRkdfU1RSVUMsICpQQVVUT19SU1BfQ0ZHX1NUUlVDOwotCi0jZGVmaW5lIExFR0FDWV9CQVNJQ19SQVRFCTB4MTQwOAkvLyAgVFhSWF9DU1I1ICAgICAgICAgICAweDMwNTQKLSNkZWZpbmUgSFRfQkFTSUNfUkFURQkJMHgxNDBjCi0jZGVmaW5lIEhUX0NUUkxfQ0ZHCQkweDE0MTAKLSNkZWZpbmUgU0lGU19DT1NUX0NGRwkJMHgxNDE0Ci0jZGVmaW5lIFJYX1BBUlNFUl9DRkcJCTB4MTQxOAkvL1NldCBOQVYgZm9yIGFsbCByZWNlaXZlZCBmcmFtZXMKLQotLy8KLS8vICA0LjUgTUFDIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKG9mZnNldDoweDE1MDApCi0vLwotI2RlZmluZSBUWF9TRUNfQ05UMAkJMHgxNTAwCQkvLwotI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CQkvLwotI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkJLy8KLS8vCi0vLyAgNC42IEhDQ0EvUFNNUCAob2Zmc2V0OjB4MTYwMCkKLS8vCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMAkJMHgxNjAwCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMQkJMHgxNjA0Ci0jZGVmaW5lIFRYT1BfSExEUl9FVAkJMHgxNjA4Ci0jZGVmaW5lIFFPU19DRlBPTExfUkFfRFcwCQkweDE2MGMKLSNkZWZpbmUgUU9TX0NGUE9MTF9BMV9EVzEJCTB4MTYxMAotI2RlZmluZSBRT1NfQ0ZQT0xMX1FDCQkweDE2MTQKLS8vCi0vLyAgNC43IE1BQyBTdGF0aXN0aXMgcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNzAwKQotLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDAJCTB4MTcwMAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkJLy8KLQotLy8KLS8vIFJYX1NUQV9DTlQwX1NUUlVDOiBSWCBQTENQIGVycm9yIGNvdW50ICYgUlggQ1JDIGVycm9yIGNvdW50Ci0vLwotdHlwZWRlZgl1bmlvbglfUlhfU1RBX0NOVDBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQ3JjRXJyOwotCSAgICBVU0hPUlQgIFBoeUVycjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX1NUQV9DTlQwX1NUUlVDLCAqUFJYX1NUQV9DTlQwX1NUUlVDOwotCi0vLwotLy8gUlhfU1RBX0NOVDFfU1RSVUM6IFJYIEZhbHNlIENDQSBjb3VudCAmIFJYIExPTkcgZnJhbWUgY291bnQKLS8vCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBGYWxzZUNjYTsKLQkgICAgVVNIT1JUICBQbGNwRXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7Ci0KLS8vCi0vLyBSWF9TVEFfQ05UMl9TVFJVQzoKLS8vCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBSeER1cGxpQ291bnQ7Ci0JICAgIFVTSE9SVCAgUnhGaWZvT3ZlcmZsb3dDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOwotCi0jZGVmaW5lIFRYX1NUQV9DTlQwCQkweDE3MEMJCS8vCi0vLwotLy8gU1RBX0NTUjM6IFRYIEJlYWNvbiBjb3VudAotLy8KLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4RmFpbENvdW50OwotCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKLQotI2RlZmluZSBUWF9TVEFfQ05UMQkJMHgxNzEwCQkvLwotLy8KLS8vIFRYX1NUQV9DTlQxOiBUWCB0eCBjb3VudAotLy8KLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKLQotI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CQkvLwotLy8KLS8vIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudAotLy8KLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OwotCSAgICBVU0hPUlQgIFR4VW5kZXJGbG93Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMl9TVFJVQywgKlBUWF9TVEFfQ05UMl9TVFJVQzsKLQotI2RlZmluZSBUWF9TVEFfRklGTwkJMHgxNzE4CQkvLwotLy8KLS8vIFRYX1NUQV9GSUZPX1NUUlVDOiBUWCBSZXN1bHQgZm9yIHNwZWNpZmljIFBJRCBzdGF0dXMgZmlmbyByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIAliVmFsaWQ6MTsgICAvLyAxOlRoaXMgcmVnaXN0ZXIgY29udGFpbnMgYSB2YWxpZCBUWCByZXN1bHQKLQkJVUlOVDMyICAgICAgIAlQaWRUeXBlOjQ7Ci0JCVVJTlQzMiAgICAgICAJVHhTdWNjZXNzOjE7ICAgLy8gVHggTm8gcmV0cnkgc3VjY2VzcwotCQlVSU5UMzIgICAgICAgCVR4QWdncmU6MTsgICAgLy8gVHggUmV0cnkgU3VjY2VzcwotCQlVSU5UMzIgICAgICAgCVR4QWNrUmVxdWlyZWQ6MTsgICAgLy8gVHggZmFpbAotCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4Ci0vLwkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxNjsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KLQkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KLQkJVUlOVDMyCQlUeEJGOjE7Ci0JCVVJTlQzMgkJUmVzZXJ2ZToyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVAkweDE3MWMKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDBfU1RSVUMsICpQVFhfQUdHX0NOVDBfU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVDEJMHgxNzI0Ci10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplM0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UMV9TVFJVQywgKlBUWF9BR0dfQ05UMV9TVFJVQzsKLQotI2RlZmluZSBUWF9BR0dfQ05UMgkweDE3MjgKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYwotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDNfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplOENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDNfU1RSVUMsICpQVFhfQUdHX0NOVDNfU1RSVUM7Ci0KLS8vIERlYnVnIGNvdW50ZXIKLSNkZWZpbmUgVFhfQUdHX0NOVDQJMHgxNzMwCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0Ci10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOwotCi0jZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7Ci0KLSNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYwotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKLQotI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKLXR5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7Ci0KLS8vCi0vLyBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMAotLy8KLS8vIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4KLSNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKLQotLy8KLS8vIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMAotLy8KLSNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwIC8vOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9Ci0jZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMCAgICAgIC8vIDMyLWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfS0VZX0VOVFJZX1NJWkUgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCi0jZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMCAgICAgIC8vIDQtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19XQ0lEX0FUVFJJX1NJWkUgICA0Ci0jZGVmaW5lIFdDSURfUkVTRVJWRUQgICAgICAgICAgCQkweDZiZmMKLSNkZWZpbmUgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICAgICAgIDB4NmMwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAotI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKLSNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKLQotdHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICBCc3MwS2V5MENpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MwS2V5MUNpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MwS2V5MkNpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MwS2V5M0NpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MxS2V5MENpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MxS2V5MUNpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MxS2V5MkNpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JCVVJTlQzMiAgICAgICBCc3MxS2V5M0NpcGhlckFsZzozOwotCQlVSU5UMzIgICAgICAgOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKLQotLy8gNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQotdHlwZWRlZiBzdHJ1Y3QgX0hXX1dDSURfRU5UUlkgeyAgLy8gOC1ieXRlIHBlciBlbnRyeQotICAgIFVDSEFSICAgQWRkcmVzc1s2XTsKLSAgICBVQ0hBUiAgIFJzdlsyXTsKLX0gSFdfV0NJRF9FTlRSWSwgUEhXX1dDSURfRU5UUlk7Ci0KLQotCi0vLwotLy8gT3RoZXIgb24tY2hpcCBzaGFyZWQgbWVtb3J5IHNwYWNlLCBiYXNlID0gMHgyMDAwCi0vLwotCi0vLyBDSVMgc3BhY2UgLSBiYXNlIGFkZHJlc3MgPSAweDIwMDAKLSNkZWZpbmUgSFdfQ0lTX0JBU0UgICAgICAgICAgICAgMHgyMDAwCi0KLS8vIENhcnJpZXItc2Vuc2UgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIGNhcnJpZXItc2Vuc2UgZnJhbWUgZm9yIGNhcnJpZXItc2Vuc2UgZnVuY3Rpb24uCi0jZGVmaW5lIEhXX0NTX0NUU19CQVNFCQkJMHg3NzAwCi0vLyBERlMgQ1RTIGZyYW1lIGJhc2UgYWRkcmVzcy4gSXQncyB3aGVyZSBtYWMgc3RvcmVzIENUUyBmcmFtZSBmb3IgREZTLgotI2RlZmluZSBIV19ERlNfQ1RTX0JBU0UJCQkweDc3ODAKLSNkZWZpbmUgSFdfQ1RTX0ZSQU1FX1NJWkUJCTB4ODAKLQotLy8gMjAwNC0xMS0wOCBqb2huIC0gc2luY2UgTlVMTCBmcmFtZSB3b24ndCBiZSB0aGF0IGxvbmcgKDI1NiBieXRlKS4gV2Ugc3RlYWwgMTYgdGFpbCBieXRlcwotLy8gdG8gc2F2ZSBkZWJ1Z2dpbmcgc2V0dGluZ3MKLSNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFICAgMHg3N2YwICAvLyAweDc3ZjB+MHg3N2ZmIHRvdGFsIDE2IGJ5dGVzCi0jZGVmaW5lIEhXX0RFQlVHX1NFVFRJTkdfQkFTRTIgICAweDc3NzAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKLQotLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCBtYXhpbXVtIDggTUJTUyBhbmQgaXRzIG1heGltdW0gbGVuZ3RoIGlzIDUxMiBmb3IgZWFjaCBiZWFjb24KLS8vIFRocmVlIHNlY3Rpb24gZGlzY29udGludWUgbWVtb3J5IHNlZ21lbnRzIHdpbGwgYmUgdXNlZC4KLS8vIDEuIFRoZSBvcmlnaW5hbCByZWdpb24gZm9yIEJDTiAwfjMKLS8vIDIuIEV4dHJhY3QgbWVtb3J5IGZyb20gRkNFIHRhYmxlIGZvciBCQ04gNH41Ci0vLyAzLiBFeHRyYWN0IG1lbW9yeSBmcm9tIFBhaXItd2lzZSBrZXkgdGFibGUgZm9yIEJDTiA2fjcKLS8vCSAgSXQgb2NjdXBpZWQgdGhvc2UgbWVtb3J5IG9mIHdjaWQgMjM4fjI1MyBmb3IgQkNOIDYKLS8vCQkJCQkJICAgICAgYW5kIHdjaWQgMjIyfjIzNyBmb3IgQkNOIDcKLSNkZWZpbmUgSFdfQkVBQ09OX01BWF9TSVpFICAgICAgMHgxMDAwIC8qIHVuaXQ6IGJ5dGUgKi8KLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UwICAgICAgICAgMHg3ODAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFMSAgICAgICAgIDB4N0EwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTIgICAgICAgICAweDdDMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UzICAgICAgICAgMHg3RTAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNCAgICAgICAgIDB4NzIwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTUgICAgICAgICAweDc0MDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U2ICAgICAgICAgMHg1REMwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNyAgICAgICAgIDB4NUJDMAotCi0jZGVmaW5lIEhXX0JFQUNPTl9NQVhfQ09VTlQgICAgIDgKLSNkZWZpbmUgSFdfQkVBQ09OX09GRlNFVAkJMHgwMjAwCi0jZGVmaW5lIEhXX0JFQUNPTl9DT05URU5UX0xFTgkoSFdfQkVBQ09OX09GRlNFVCAtIFRYV0lfU0laRSkKLQotLy8gSE9TVC1NQ1Ugc2hhcmVkIG1lbW9yeSAtIGJhc2UgYWRkcmVzcyA9IDB4MjEwMAotI2RlZmluZSBIT1NUX0NNRF9DU1IJCTB4NDA0Ci0jZGVmaW5lIEgyTV9NQUlMQk9YX0NTUiAgICAgICAgIDB4NzAxMAotI2RlZmluZSBIMk1fTUFJTEJPWF9DSUQgICAgICAgICAweDcwMTQKLSNkZWZpbmUgSDJNX01BSUxCT1hfU1RBVFVTICAgICAgMHg3MDFjCi0jZGVmaW5lIEgyTV9JTlRfU1JDICAgICAgICAgICAgIDB4NzAyNAotI2RlZmluZSBIMk1fQkJQX0FHRU5UICAgICAgICAgICAweDcwMjgKLSNkZWZpbmUgTTJIX0NNRF9ET05FX0NTUiAgICAgICAgMHgwMDBjCi0jZGVmaW5lIE1DVV9UWE9QX0FSUkFZX0JBU0UgICAgIDB4MDAwYyAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotI2RlZmluZSBNQ1VfVFhPUF9FTlRSWV9TSVpFICAgICAzMiAgICAgICAvLyBUT0RPOiB0byBiZSBwcm92aWRlZCBieSBBbGJlcnQKLSNkZWZpbmUgTUFYX05VTV9PRl9UWE9QX0VOVFJZICAgMTYgICAgICAgLy8gVE9ETzogbXVzdCBiZSBzYW1lIHdpdGggODA1MSBmaXJtd2FyZQotI2RlZmluZSBNQ1VfTUJPWF9WRVJTSU9OICAgICAgICAweDAxICAgICAvLyBUT0RPOiB0byBiZSBjb25maXJtZWQgYnkgQWxiZXJ0Ci0jZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT05fT0ZGU0VUIDUgICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotCi0vLwotLy8gSG9zdCBETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MjAwIC4gIFRYMC0zPUVEQ0FRaWQwLTMsIFRYND1IQ0NBLCBUWDU9TUdNVCwKLS8vCi0vLwotLy8gIERNQSBSSU5HIERFU0NSSVBUT1IKLS8vCi0jZGVmaW5lIEUyUFJPTV9DU1IgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIElPX0NOVExfQ1NSICAgICAgICAgMHg3N2QwCi0KLSNpZmRlZiBSVDI4NjAKLS8vIDgwNTEgZmlybXdhcmUgaW1hZ2UgZm9yIFJUMjg2MCAtIGJhc2UgYWRkcmVzcyA9IDB4NDAwMAotI2RlZmluZSBGSVJNV0FSRV9JTUFHRV9CQVNFICAgICAweDIwMDAKLSNkZWZpbmUgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUgMHgyMDAwICAgIC8vIDhrYnl0ZQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0vLyA4MDUxIGZpcm13YXJlIGltYWdlIGZvciB1c2IgLSB1c2UgbGFzdC1oYWxmIGJhc2UgYWRkcmVzcyA9IDB4MzAwMAotI2RlZmluZSBGSVJNV0FSRV9JTUFHRV9CQVNFICAgICAweDMwMDAKLSNkZWZpbmUgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUgMHgxMDAwICAgIC8vIDRrYnl0ZQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUeCAvCVJ4IC8gTWdtdCByaW5nIGRlc2NyaXB0b3IgZGVmaW5pdGlvbgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyB0aGUgZm9sbG93aW5nIFBJRCB2YWx1ZXMgYXJlIHVzZWQgdG8gbWFyayBvdXRnb2luZyBmcmFtZSB0eXBlIGluIFRYRC0+UElEIHNvIHRoYXQKLS8vIHByb3BlciBUWCBzdGF0aXN0aWNzIGNhbiBiZSBjb2xsZWN0ZWQgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcwotLy8gYjMtMiBvZiBQSUQgZmllbGQgLQotI2RlZmluZSBQSURfTUdNVAkJCTB4MDUKLSNkZWZpbmUgUElEX0JFQUNPTgkJCTB4MGMKLSNkZWZpbmUgUElEX0RBVEFfTk9STUFMVUNBU1QJIAkweDAyCi0jZGVmaW5lIFBJRF9EQVRBX0FNUERVCSAJMHgwNAotI2RlZmluZSBQSURfREFUQV9OT19BQ0sgICAgCTB4MDgKLSNkZWZpbmUgUElEX0RBVEFfTk9UX05PUk1fQUNLCSAJMHgwMwotLy8gdmFsdWUgZG9tYWluIG9mIHBUeEQtPkhvc3RRSWQgKDQtYml0OiAwfjE1KQotI2RlZmluZSBRSURfQUNfQksgICAgICAgICAgICAgICAxICAgLy8gbWVldCBBQ0kgZGVmaW5pdGlvbiBpbiA4MDIuMTFlCi0jZGVmaW5lIFFJRF9BQ19CRSAgICAgICAgICAgICAgIDAgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKLSNkZWZpbmUgUUlEX0FDX1ZJICAgICAgICAgICAgICAgMgotI2RlZmluZSBRSURfQUNfVk8gICAgICAgICAgICAgICAzCi0jZGVmaW5lIFFJRF9IQ0NBICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNQotI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQkJQICYgUkYJZGVmaW5pdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jZGVmaW5lCUJVU1kJCSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCUlETEUJCSAgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUJUkZfUjAwCQkJCQkgICAgMAotI2RlZmluZQlSRl9SMDEJCQkJCSAgICAxCi0jZGVmaW5lCVJGX1IwMgkJCQkJICAgIDIKLSNkZWZpbmUJUkZfUjAzCQkJCQkgICAgMwotI2RlZmluZQlSRl9SMDQJCQkJCSAgICA0Ci0jZGVmaW5lCVJGX1IwNQkJCQkJICAgIDUKLSNkZWZpbmUJUkZfUjA2CQkJCQkgICAgNgotI2RlZmluZQlSRl9SMDcJCQkJCSAgICA3Ci0jZGVmaW5lCVJGX1IwOAkJCQkJICAgIDgKLSNkZWZpbmUJUkZfUjA5CQkJCQkgICAgOQotI2RlZmluZQlSRl9SMTAJCQkJCSAgICAxMAotI2RlZmluZQlSRl9SMTEJCQkJCSAgICAxMQotI2RlZmluZQlSRl9SMTIJCQkJCSAgICAxMgotI2RlZmluZQlSRl9SMTMJCQkJCSAgICAxMwotI2RlZmluZQlSRl9SMTQJCQkJCSAgICAxNAotI2RlZmluZQlSRl9SMTUJCQkJCSAgICAxNQotI2RlZmluZQlSRl9SMTYJCQkJCSAgICAxNgotI2RlZmluZQlSRl9SMTcJCQkJCSAgICAxNwotI2RlZmluZQlSRl9SMTgJCQkJCSAgICAxOAotI2RlZmluZQlSRl9SMTkJCQkJCSAgICAxOQotI2RlZmluZQlSRl9SMjAJCQkJCSAgICAyMAotI2RlZmluZQlSRl9SMjEJCQkJCSAgICAyMQotI2RlZmluZQlSRl9SMjIJCQkJCSAgICAyMgotI2RlZmluZQlSRl9SMjMJCQkJCSAgICAyMwotI2RlZmluZQlSRl9SMjQJCQkJCSAgICAyNAotI2RlZmluZQlSRl9SMjUJCQkJCSAgICAyNQotI2RlZmluZQlSRl9SMjYJCQkJCSAgICAyNgotI2RlZmluZQlSRl9SMjcJCQkJCSAgICAyNwotI2RlZmluZQlSRl9SMjgJCQkJCSAgICAyOAotI2RlZmluZQlSRl9SMjkJCQkJCSAgICAyOQotI2RlZmluZQlSRl9SMzAJCQkJCSAgICAzMAotI2RlZmluZQlSRl9SMzEJCQkJCSAgICAzMQotCi0jZGVmaW5lCUJCUF9SMAkJCQkJICAgIDAgIC8vIHZlcnNpb24KLSNkZWZpbmUJQkJQX1IxCQkJCSAgICAgICAgMSAgLy8gVFNTSQotI2RlZmluZQlCQlBfUjIgICAgICAgICAgCQkJMiAgLy8gVFggY29uZmlndXJlCi0jZGVmaW5lIEJCUF9SMyAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEJCUF9SNCAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEJCUF9SNSAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEJCUF9SNiAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lCUJCUF9SMTQJCQkgICAgICAgICAgICAxNCAvLyBSWCBjb25maWd1cmUKLSNkZWZpbmUgQkJQX1IxNiAgICAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEJCUF9SMTcgICAgICAgICAgICAgICAgICAgICAxNyAvLyBSWCBzZW5zaWJpbGl0eQotI2RlZmluZSBCQlBfUjE4ICAgICAgICAgICAgICAgICAgICAgMTgKLSNkZWZpbmUgQkJQX1IyMSAgICAgICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIEJCUF9SMjIgICAgICAgICAgICAgICAgICAgICAyMgotI2RlZmluZSBCQlBfUjI0ICAgICAgICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgQkJQX1IyNSAgICAgICAgICAgICAgICAgICAgIDI1Ci0jZGVmaW5lIEJCUF9SMzEgICAgICAgICAgICAgICAgICAgICAzMQotI2RlZmluZSBCQlBfUjQ5ICAgICAgICAgICAgICAgICAgICAgNDkgLy9UU1NJCi0jZGVmaW5lIEJCUF9SNTAgICAgICAgICAgICAgICAgICAgICA1MAotI2RlZmluZSBCQlBfUjUxICAgICAgICAgICAgICAgICAgICAgNTEKLSNkZWZpbmUgQkJQX1I1MiAgICAgICAgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIEJCUF9SNTUgICAgICAgICAgICAgICAgICAgICA1NQotI2RlZmluZSBCQlBfUjYyICAgICAgICAgICAgICAgICAgICAgNjIgLy8gUnggU1EwIFRocmVzaG9sZCBISUdICi0jZGVmaW5lIEJCUF9SNjMgICAgICAgICAgICAgICAgICAgICA2MwotI2RlZmluZSBCQlBfUjY0ICAgICAgICAgICAgICAgICAgICAgNjQKLSNkZWZpbmUgQkJQX1I2NSAgICAgICAgICAgICAgICAgICAgIDY1Ci0jZGVmaW5lIEJCUF9SNjYgICAgICAgICAgICAgICAgICAgICA2NgotI2RlZmluZSBCQlBfUjY3ICAgICAgICAgICAgICAgICAgICAgNjcKLSNkZWZpbmUgQkJQX1I2OCAgICAgICAgICAgICAgICAgICAgIDY4Ci0jZGVmaW5lIEJCUF9SNjkgICAgICAgICAgICAgICAgICAgICA2OQotI2RlZmluZSBCQlBfUjcwICAgICAgICAgICAgICAgICAgICAgNzAgLy8gUnggQUdDIFNRIENDSyBYY29yciB0aHJlc2hvbGQKLSNkZWZpbmUgQkJQX1I3MyAgICAgICAgICAgICAgICAgICAgIDczCi0jZGVmaW5lIEJCUF9SNzUJCQkJCQk3NQotI2RlZmluZSBCQlBfUjc3ICAgICAgICAgICAgICAgICAgICAgNzcKLSNkZWZpbmUgQkJQX1I3OSAgICAgICAgICAgICAgICAgICAgIDc5Ci0jZGVmaW5lIEJCUF9SODAgICAgICAgICAgICAgICAgICAgICA4MAotI2RlZmluZSBCQlBfUjgxICAgICAgICAgICAgICAgICAgICAgODEKLSNkZWZpbmUgQkJQX1I4MiAgICAgICAgICAgICAgICAgICAgIDgyCi0jZGVmaW5lIEJCUF9SODMgICAgICAgICAgICAgICAgICAgICA4MwotI2RlZmluZSBCQlBfUjg0ICAgICAgICAgICAgICAgICAgICAgODQKLSNkZWZpbmUgQkJQX1I4NgkJCQkJCTg2Ci0jZGVmaW5lIEJCUF9SOTEJCQkJCQk5MQotI2RlZmluZSBCQlBfUjkyCQkJCQkJOTIKLSNkZWZpbmUgQkJQX1I5NCAgICAgICAgICAgICAgICAgICAgIDk0IC8vIFR4IEdhaW4gQ29udHJvbAotI2RlZmluZSBCQlBfUjEwMyAgICAgICAgICAgICAgICAgICAgMTAzCi0jZGVmaW5lIEJCUF9SMTA1ICAgICAgICAgICAgICAgICAgICAxMDUKLSNkZWZpbmUgQkJQX1IxMTMgICAgICAgICAgICAgICAgICAgIDExMwotI2RlZmluZSBCQlBfUjExNCAgICAgICAgICAgICAgICAgICAgMTE0Ci0jZGVmaW5lIEJCUF9SMTE1ICAgICAgICAgICAgICAgICAgICAxMTUKLSNkZWZpbmUgQkJQX1IxMTYgICAgICAgICAgICAgICAgICAgIDExNgotI2RlZmluZSBCQlBfUjExNyAgICAgICAgICAgICAgICAgICAgMTE3Ci0jZGVmaW5lIEJCUF9SMTE4ICAgICAgICAgICAgICAgICAgICAxMTgKLSNkZWZpbmUgQkJQX1IxMTkgICAgICAgICAgICAgICAgICAgIDExOQotI2RlZmluZSBCQlBfUjEyMCAgICAgICAgICAgICAgICAgICAgMTIwCi0jZGVmaW5lIEJCUF9SMTIxICAgICAgICAgICAgICAgICAgICAxMjEKLSNkZWZpbmUgQkJQX1IxMjIgICAgICAgICAgICAgICAgICAgIDEyMgotI2RlZmluZSBCQlBfUjEyMyAgICAgICAgICAgICAgICAgICAgMTIzCi0jZGVmaW5lIEJCUF9SMTM4ICAgICAgICAgICAgICAgICAgICAxMzggLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIEFEQyBkeW5hbWljIG9uL29mZiBjb250cm9sCi0KLQotI2RlZmluZSBCQlBSOTRfREVGQVVMVCAgICAgICAgICAgICAgMHgwNiAvLyBBZGQgMSB2YWx1ZSB3aWxsIGdhaW4gMWRiCi0KLSNkZWZpbmUgUlNTSV9GT1JfVkVSWV9MT1dfU0VOU0lCSUxJVFkgLTM1Ci0jZGVmaW5lIFJTU0lfRk9SX0xPV19TRU5TSUJJTElUWSAgICAgIC01OAotI2RlZmluZSBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZICAtODAKLSNkZWZpbmUgUlNTSV9GT1JfTUlEX1NFTlNJQklMSVRZICAgICAgLTkwCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRUVQUk9NIGRlZmluaXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBFRURPICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBFRURJICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBFRUNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBFRVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBFRVJMICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAotCi0jZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREUgICAgICAgICAweDA1Ci0jZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERSAgICAgICAgICAweDA2Ci0jZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERSAgICAgICAgICAweDEwCi0jZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERSAgICAgICAgICAweDEzCi0KLSNkZWZpbmUJTlVNX0VFUFJPTV9CQlBfUEFSTVMJCTE5CQkJLy8gSW5jbHVkZSBOSUMgQ29uZmlnIDAsIDEsIENSLCBUWCBBTEMgc3RlcCwgQkJQcwotI2RlZmluZQlOVU1fRUVQUk9NX1RYX0dfUEFSTVMJCTcKLSNkZWZpbmUJRUVQUk9NX05JQzFfT0ZGU0VUICAgICAgICAgIDB4MzQJCS8vIFRoZSBhZGRyZXNzIGlzIGZyb20gTklDIGNvbmZpZyAwLCBub3QgQkJQIHJlZ2lzdGVyIElECi0jZGVmaW5lCUVFUFJPTV9OSUMyX09GRlNFVCAgICAgICAgICAweDM2CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAotI2RlZmluZQlFRVBST01fQkJQX0JBU0VfT0ZGU0VUCQkweGYwCQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAotI2RlZmluZQlFRVBST01fR19UWF9QV1JfT0ZGU0VUCQkweDUyCi0jZGVmaW5lCUVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUCQkweDYwCi0jZGVmaW5lIEVFUFJPTV9MRUQxX09GRlNFVAkJCTB4M2MKLSNkZWZpbmUgRUVQUk9NX0xFRDJfT0ZGU0VUCQkJMHgzZQotI2RlZmluZSBFRVBST01fTEVEM19PRkZTRVQJCQkweDQwCi0jZGVmaW5lIEVFUFJPTV9MTkFfT0ZGU0VUCQkJMHg0NAotI2RlZmluZSBFRVBST01fUlNTSV9CR19PRkZTRVQJCTB4NDYKLSNkZWZpbmUgRUVQUk9NX1JTU0lfQV9PRkZTRVQJCTB4NGEKLSNkZWZpbmUgRUVQUk9NX0RFRklORV9NQVhfVFhQV1IJCTB4NGUKLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcJMHhkZQkvLyAyME1IWiAyLjRHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RwkweGVlCS8vIDQwTUhaIDIuNEcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RwkJMHhmYQkvLyAyME1IWiA1RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHCQkweDEwYQkvLyA0ME1IWiA1RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCAgICAgIDB4NzgKLSNkZWZpbmUgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgICAgICAweGE2Ci0jZGVmaW5lIEVFUFJPTV9WRVJTSU9OX09GRlNFVCAgICAgICAweDAyCi0jZGVmaW5lCUVFUFJPTV9GUkVRX09GRlNFVAkJCTB4M2EKLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFIAkweGRlCS8vIDIwTUhaIHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9ERUxUQQkJMHg1MAkvLyAyME1IWiBBTkQgNDAgTUhaIHVzZSBkaWZmZXJlbnQgcG93ZXIuIFRoaXMgaXMgZGVsdGEgaW4gNDBNSFouCi0jZGVmaW5lIFZBTElEX0VFUFJPTV9WRVJTSU9OICAgICAgICAxCi0KLS8vIFBhaXJLZXlNb2RlIGRlZmluaXRpb24KLSNkZWZpbmUgUEtNT0RFX05PTkUgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUEtNT0RFX1dFUDY0ICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUEtNT0RFX1dFUDEyOCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUEtNT0RFX1RLSVAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUEtNT0RFX0FFUyAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgUEtNT0RFX0NLSVA2NCAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgUEtNT0RFX0NLSVAxMjggICAgICAgICAgICAgIDYKLSNkZWZpbmUgUEtNT0RFX1RLSVBfTk9fTUlDICAgICAgICAgIDcgICAgICAgLy8gTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gV0NJRCAgZm9ybWF0Ci0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vNy4xCVdDSUQgIEVOVFJZICBmb3JtYXQgIDogOGJ5dGVzCi10eXBlZGVmCXN0cnVjdAlfV0NJRF9FTlRSWV9TVFJVQyB7Ci0JVUNIQVIJCVJYQkFCaXRtYXA3OyAgICAvLyBiaXQwIGZvciBUSUQ4LCBiaXQ3IGZvciBUSUQgMTUKLQlVQ0hBUgkJUlhCQUJpdG1hcDA7ICAgIC8vIGJpdDAgZm9yIFRJRDAsIGJpdDcgZm9yIFRJRCA3Ci0JVUNIQVIJCU1BQ1s2XTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQotfQlXQ0lEX0VOVFJZX1NUUlVDLCAqUFdDSURfRU5UUllfU1RSVUM7Ci0KLS8vOC4xLjEJU0VDVVJJVFkgIEtFWSAgZm9ybWF0ICA6IDhEVwotLy8gMzItYnl0ZSBwZXIgZW50cnksIHRvdGFsIDE2LWVudHJ5IGZvciBzaGFyZWQga2V5IHRhYmxlLCA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi10eXBlZGVmIHN0cnVjdCBfSFdfS0VZX0VOVFJZIHsgICAgICAgICAgLy8gMzItYnl0ZSBwZXIgZW50cnkKLSAgICBVQ0hBUiAgIEtleVsxNl07Ci0gICAgVUNIQVIgICBUeE1pY1s4XTsKLSAgICBVQ0hBUiAgIFJ4TWljWzhdOwotfSBIV19LRVlfRU5UUlksICpQSFdfS0VZX0VOVFJZOwotCi0vLzguMS4yCUlWL0VJViAgZm9ybWF0ICA6IDJEVwotCi0vLzguMS4zCVJYIGF0dHJpYnV0ZSBlbnRyeSBmb3JtYXQgIDogMURXCi10eXBlZGVmCXN0cnVjdAlfTUFDX0FUVFJJQlVURV9TVFJVQyB7Ci0JVUlOVDMyCQlLZXlUYWI6MTsJLy8gMCBmb3Igc2hhcmVkIGtleSB0YWJsZS4gIDEgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQotCVVJTlQzMgkJUGFpcktleU1vZGU6MzsKLQlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECi0JVUlOVDMyCQlSWFdJVURGOjM7Ci0JVUlOVDMyCQlyc3Y6MjI7Ci19CU1BQ19BVFRSSUJVVEVfU1RSVUMsICpQTUFDX0FUVFJJQlVURV9TVFJVQzsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUWCAvIFJYIHJpbmcgZGVzY3JpcHRvciBmb3JtYXQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyB0aGUgZmlyc3QgMjQtYnl0ZSBpbiBUWEQgaXMgY2FsbGVkIFRYSU5GTyBhbmQgd2lsbCBiZSBETUFlZCB0byBNQUMgYmxvY2sgdGhyb3VnaCBUWEZJRk8uCi0vLyBNQUMgYmxvY2sgdXNlIHRoaXMgVFhJTkZPIHRvIGNvbnRyb2wgdGhlIHRyYW5zbWlzc2lvbiBiZWhhdmlvciBvZiB0aGlzIGZyYW1lLgotI2RlZmluZSBGSUZPX01HTVQgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgRklGT19IQ0NBICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEZJRk9fRURDQSAgICAgICAgICAgICAgICAgMgotCi0vLwotLy8gVFggZGVzY3JpcHRvciBmb3JtYXQsIFR4CXJpbmcsIE1nbXQgUmluZwotLy8KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhEX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUHRyMDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCVNETGVuMToxNDsKLQlVSU5UMzIJCUxhc3RTZWMxOjE7Ci0JVUlOVDMyCQlCdXJzdDoxOwotCVVJTlQzMgkJU0RMZW4wOjE0OwotCVVJTlQzMgkJTGFzdFNlYzA6MTsKLQlVSU5UMzIJCURNQURPTkU6MTsKLQkvL1dvcmQyCi0JVUlOVDMyCQlTRFB0cjE7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJcnN2MjoyNDsKLQlVSU5UMzIJCVdJVjoxOwkvLyBXaXJlbGVzcyBJbmZvIFZhbGlkLiAxIGlmIERyaXZlciBhbHJlYWR5IGZpbGwgV0ksICBvIGlmIERNQSBuZWVkcyB0byBjb3B5IFdJIHRvIGNvcnJlY3Rwb3NpdGlvbgotCVVJTlQzMgkJUVNFTDoyOwkvLyBzZWxlY3Qgb24tY2hpcCBGSUZPIElEIGZvciAybmQtc3RhZ2Ugb3V0cHV0IHNjaGVkdWxlci4wOk1HTVQsIDE6SENDQSAyOkVEQ0EKLQlVSU5UMzIJCXJzdjoyOwotCVVJTlQzMgkJVENPOjE7CS8vCi0JVUlOVDMyCQlVQ086MTsJLy8KLQlVSU5UMzIJCUlDTzoxOwkvLwotfQlUWERfU1RSVUMsICpQVFhEX1NUUlVDOwotCi0vLwotLy8gVFhEIFdpcmVsZXNzIEluZm9ybWF0aW9uIGZvcm1hdCBmb3IgVHggcmluZyBhbmQgTWdtdCBSaW5nCi0vLwotLy90eG9wIDogZm9yIHR4b3AgbW9kZQotLy8gMDp0eG9wIGZvciB0aGUgTVBEVSBmcmFtZSB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQyBieSByZWdpc3RlcgotLy8gMS8yLzM6dGhlIE1QRFUgZnJhbWUgaXMgc2VuZCBhZnRlciBQSUZTL2JhY2tvZmYvU0lGUwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9UWFdJX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCUZSQUc6MTsJCS8vIDEgdG8gaW5mb3JtIFRLSVAgZW5naW5lIHRoaXMgaXMgYSBmcmFnbWVudC4KLQlVSU5UMzIJCU1JTU9wczoxOwkvLyB0aGUgcmVtb3RlIHBlZXIgaXMgaW4gZHluYW1pYyBNSU1PLVBTIG1vZGUKLQlVSU5UMzIJCUNGQUNLOjE7Ci0JVUlOVDMyCQlUUzoxOwotCi0JVUlOVDMyCQlBTVBEVToxOwotCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKLQlVSU5UMzIJCXR4b3A6MjsJLy9GT1IgIlRISVMiIGZyYW1lLiAwOkhUIFRYT1AgcnVsZSAsIDE6UElGUyBUWCAsMjpCYWNrb2ZmLCAzOnNpZnMgb25seSB3aGVuIHByZXZpb3VzIGZyYW1lIGV4Y2hhbmdlIGlzIHN1Y2Nlc3NmdWwuCi0JVUlOVDMyCQlyc3Y6NjsKLQotCVVJTlQzMgkJTUNTOjc7Ci0JVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJU2hvcnRHSToxOwotCVVJTlQzMgkJU1RCQzoyOwkvLyAxOiBTVEJDIHN1cHBvcnQgTUNTID0wLTcsICAgMiwzIDogUkVTRVJWRQotCVVJTlQzMgkJSWZzOjE7CS8vCi0JVUlOVDMyCQlyc3YyOjE7Ci0JVUlOVDMyCQlUeEJGOjE7CS8vIDMqMwotCVVJTlQzMgkJUEhZTU9ERToyOwotCS8vIFdvcmQJMQotCVVJTlQzMgkJQUNLOjE7Ci0JVUlOVDMyCQlOU0VROjE7Ci0JVUlOVDMyCQlCQVdpblNpemU6NjsKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKLQlVSU5UMzIJCVBhY2tldElkOjQ7Ci0JLy9Xb3JkMgotCVVJTlQzMgkJSVY7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJRUlWOwotfQlUWFdJX1NUUlVDLCAqUFRYV0lfU1RSVUM7Ci0KLS8vCi0vLyBSeCBkZXNjcmlwdG9yIGZvcm1hdCwgUngJUmluZwotLy8KLSNpZmRlZiBSVDI4NjAKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlhEX1NUUlVDCXsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVNEUDA7Ci0JLy8gV29yZAkxCi0JVUlOVDMyCQlTREwxOjE0OwotCVVJTlQzMgkJUnN2OjI7Ci0JVUlOVDMyCQlTREwwOjE0OwotCVVJTlQzMgkJTFMwOjE7Ci0JVUlOVDMyCQlERE9ORToxOwotCS8vIFdvcmQJMgotCVVJTlQzMgkJU0RQMTsKLQkvLyBXb3JkCTMKLQlVSU5UMzIJCUJBOjE7Ci0JVUlOVDMyCQlEQVRBOjE7Ci0JVUlOVDMyCQlOVUxMREFUQToxOwotCVVJTlQzMgkJRlJBRzoxOwotCVVJTlQzMgkJVTJNOjE7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQlVSU5UMzIJCU1jYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIG11bHRpY2FzdCBmcmFtZQotCVVJTlQzMgkJQmNhc3Q6MTsgICAgICAgICAgICAvLyAxOiB0aGlzIGlzIGEgYnJvYWRjYXN0IGZyYW1lCi0JVUlOVDMyCQlNeUJzczoxOyAgCS8vIDE6IHRoaXMgZnJhbWUgYmVsb25ncyB0byB0aGUgc2FtZSBCU1NJRAotCVVJTlQzMgkJQ3JjOjE7ICAgICAgICAgICAgICAvLyAxOiBDUkMgZXJyb3IKLQlVSU5UMzIJCUNpcGhlckVycjoyOyAgICAgICAgLy8gMDogZGVjcnlwdGlvbiBva2F5LCAxOklDViBlcnJvciwgMjpNSUMgZXJyb3IsIDM6S0VZIG5vdCB2YWxpZAotCVVJTlQzMgkJQU1TRFU6MTsJCS8vIHJ4IHdpdGggODAyLjMgaGVhZGVyLCBub3QgODAyLjExIGhlYWRlci4KLQlVSU5UMzIJCUhUQzoxOwotCVVJTlQzMgkJUlNTSToxOwotCVVJTlQzMgkJTDJQQUQ6MTsKLQlVSU5UMzIJCUFNUERVOjE7Ci0JVUlOVDMyCQlEZWNyeXB0ZWQ6MTsJLy8gdGhpcyBmcmFtZSBpcyBiZWluZyBkZWNyeXB0ZWQuCi0JVUlOVDMyCQlQbGNwU2lnbmFsOjE7CQkvLyBUbyBiZSBtb3ZlZAotCVVJTlQzMgkJUGxjcFJzc2lsOjE7Ly8gVG8gYmUgbW92ZWQKLQlVSU5UMzIJCVJzdjE6MTM7Ci19CVJYRF9TVFJVQywgKlBSWERfU1RSVUMsIFJUMjhYWF9SWERfU1RSVUMsICpQUlQyOFhYX1JYRF9TVFJVQzsKLSNlbmRpZiAvKiBSVDI4NjAgKi8KLQotLy8KLS8vIFJYV0kgd2lyZWxlc3MgaW5mb3JtYXRpb24gZm9ybWF0LCBpbiBQQkYuIGludmlzaWJsZSBpbiBkcml2ZXIuCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUtleUluZGV4OjI7Ci0JVUlOVDMyCQlCU1NJRDozOwotCVVJTlQzMgkJVURGOjM7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlUSUQ6NDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCUZSQUc6NDsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJTUNTOjc7Ci0JVUlOVDMyCQlCVzoxOwotCVVJTlQzMgkJU2hvcnRHSToxOwotCVVJTlQzMgkJU1RCQzoyOwotCVVJTlQzMgkJcnN2OjM7Ci0JVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQkvL1dvcmQyCi0JVUlOVDMyCQlSU1NJMDo4OwotCVVJTlQzMgkJUlNTSTE6ODsKLQlVSU5UMzIJCVJTU0kyOjg7Ci0JVUlOVDMyCQlyc3YxOjg7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJU05SMDo4OwotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJcnN2MjoxNjsKLX0JUlhXSV9TVFJVQywgKlBSWFdJX1NUUlVDOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEhPU1QtTUNVIGNvbW11bmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLwotLy8gSDJNX01BSUxCT1hfQ1NSOiBIb3N0LXRvLU1DVSBNYWlsYm94Ci0vLwotdHlwZWRlZiB1bmlvbiAgX0gyTV9NQUlMQk9YX1NUUlVDIHsKLSAgICBzdHJ1Y3QgewotICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OwotICAgICAgICBVSU5UMzIgICAgICAgSGlnaEJ5dGU6ODsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OwotICAgIH0gICBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOwotCi0vLwotLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCi0vLwotdHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKLSAgICBzdHJ1Y3QgIHsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKLSAgICB9IGZpZWxkOwotICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKLX0gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKLQotLy8KLS8vIE1DVV9MRURDUzogTUNVIExFRCBDb250cm9sIFNldHRpbmcuCi0vLwotdHlwZWRlZiB1bmlvbiAgX01DVV9MRURDU19TVFJVQyB7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUxlZE1vZGU6NzsKLQkJVUNIQVIJCVBvbGFyaXR5OjE7Ci0JfSBmaWVsZDsKLQlVQ0hBUgkJCXdvcmQ7Ci19IE1DVV9MRURDU19TVFJVQywgKlBNQ1VfTEVEQ1NfU1RSVUM7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gUmVnaXN0ZXIgZm9ybWF0Ci0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0KLS8vTkFWX1RJTUVfQ0ZHIDpOQVYKLXR5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlyc3Y6NjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7Ci0KLS8vCi0vLyBSWF9GSUxUUl9DRkc6ICAvUlggY29uZmlndXJhdGlvbiByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX1JYX0ZJTFRSX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlEcm9wQ1JDRXJyOjE7CQkvLyBEcm9wIENSQyBlcnJvcgotCQlVSU5UMzIJCURyb3BQaHlFcnI6MTsJCS8vIERyb3AgcGh5c2ljYWwgZXJyb3IKLQkJVUlOVDMyCQlEcm9wTm90VG9NZToxOwkJLy8gRHJvcCBub3QgdG8gbWUgdW5pY2FzdCBmcmFtZQotCQlVSU5UMzIJCURyb3BOb3RNeUJTU0lEOjE7CQkJLy8gRHJvcCBmcmFtIFRvRHMgYml0IGlzIHRydWUKLQotCQlVSU5UMzIJCURyb3BWZXJFcnI6MTsJICAgIC8vIERyb3AgdmVyc2lvbiBlcnJvciBmcmFtZQotCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCi0JCVVJTlQzMgkJRHJvcEJjYXN0OjE7CQkvLyBEcm9wIGJyb2FkY2FzdCBmcmFtZXMKLQkJVUlOVDMyCQlEcm9wRHVwbGljYXRlOjE7CQkvLyBEcm9wIGR1cGxpY2F0ZSBmcmFtZQotCi0JCVVJTlQzMgkJRHJvcENGRW5kQWNrOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQ0ZFbmQ6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BDdHM6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcFJ0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcFBzUG9sbDoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEJBOjE7CQkvLwotICAgICAgICAJVUlOVDMyICAgICAgIAlEcm9wQkFSOjE7ICAgICAgIC8vCi0KLQkJVUlOVDMyICAgICAgIAlEcm9wUnN2Q250bFR5cGU6MTsKLQkJVUlOVDMyCQk6MTU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9GSUxUUl9DRkdfU1RSVUMsICpQUlhfRklMVFJfQ0ZHX1NUUlVDOwotCi0vLwotLy8gUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfUEhZX0NTUjRfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCi0JCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCi0JCVVJTlQzMgkJSUZTZWxlY3Q6MTsJCQkvLyAxOiBzZWxlY3QgSUYJdG8gcHJvZ3JhbSwJMDogc2VsZWN0IFJGIHRvCXByb2dyYW0KLQkJVUlOVDMyCQlQTExfTEQ6MTsJCQkvLyBSRiBQTExfTEQgc3RhdHVzCi0JCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBSRiBwcm9ncmFtbWluZy4KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVBIWV9DU1I0X1NUUlVDLCAqUFBIWV9DU1I0X1NUUlVDOwotCi0vLwotLy8gU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlcgotLy8KLXR5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKLQlzdHJ1Y3QJewotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7Ci0KLS8vCi0vLyBIT1NUX0NNRF9DU1I6IEZvciBIT1NUIHRvIGludGVycnVwdCBlbWJlZGRlZCBwcm9jZXNzb3IKLS8vCi10eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7Ci0JICAgIFVJTlQzMiAgIFJzdjoyNDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7Ci0KLS8vCi0vLyBBSUZTTl9DU1I6IEFJRlNOIGZvciBlYWNoIEVEQ0EgQUMKLS8vCi0KLQotCi0vLwotLy8gRTJQUk9NX0NTUjogRUVQUk9NIGNvbnRyb2wgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCi0JCVVJTlQzMgkJRWVwcm9tU0s6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbURJOjE7Ci0JCVVJTlQzMgkJRWVwcm9tRE86MTsKLQkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVJzdmQ6MjU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBFMlBST00gZGF0YSBsYXlvdXQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8KLS8vIEVFUFJPTSBhbnRlbm5hIHNlbGVjdCBmb3JtYXQKLS8vCi10eXBlZGVmCXVuaW9uCV9FRVBST01fQU5URU5OQV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUCQlSeFBhdGg6NDsJLy8gMTogMVIsIDI6IDJSLCAzOiAzUgotCQlVU0hPUlQJCVR4UGF0aDo0OwkvLyAxOiAxVCwgMjogMlQKLQkJVVNIT1JUICAgICAgUmZJY1R5cGU6NDsgICAgICAgICAgICAgLy8gc2VlIEUyUFJPTSBkb2N1bWVudAotCQlVU0hPUlQgICAgICBSc3Y6NDsKLQl9CWZpZWxkOwotCVVTSE9SVAkJCXdvcmQ7Ci19CUVFUFJPTV9BTlRFTk5BX1NUUlVDLCAqUEVFUFJPTV9BTlRFTk5BX1NUUlVDOwotCi10eXBlZGVmCXVuaW9uIF9FRVBST01fTklDX0NJTkZJRzJfU1RSVUMJewotCXN0cnVjdCB7Ci0JCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gMTplbmFibGUsIDA6ZGlzYWJsZQotCQlVU0hPUlQJCUR5bmFtaWNUeEFnY0NvbnRyb2w6MTsJCQkvLwotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yRzoxOwkJCQkvLwotCQlVU0hPUlQJCUV4dGVybmFsTE5BRm9yQToxOwkJCS8vIGV4dGVybmFsIExOQSBlbmFibGUgZm9yIDIuNEcKLQkJVVNIT1JUCQlDYXJkYnVzQWNjZWxlcmF0aW9uOjE7CS8vICEhISBOT1RFOiAwIC0gZW5hYmxlLCAxIC0gZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNU2lkZWJhbmRGb3JHOjE7Ci0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKLQkJVVNIT1JUCQlFbmFibGVXUFNQQkM6MTsgICAgICAgICAgICAgICAgIC8vIFdQUyBQQkMgQ29udHJvbCBiaXQKLQkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yRzoxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKLQkJVVNIT1JUCQlCVzQwTUF2YWlsRm9yQToxOwkJCS8vIDA6ZW5hYmxlLCAxOmRpc2FibGUKLQkJVVNIT1JUCQlSc3YxOjE7CQkJCQkvLyBtdXN0IGJlIDAKLQkJVVNIT1JUCQlBbnREaXZlcnNpdHk6MTsJCQkvLyBBbnRlbm5hIGRpdmVyc2l0eQotCQlVU0hPUlQJCVJzdjI6MzsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCURBQ1Rlc3RCaXQ6MTsJCQkvLyBjb250cm9sIGlmIGRyaXZlciBzaG91bGQgcGF0Y2ggdGhlIERBQyBpc3N1ZQotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDLCAqUEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQzsKLQotLy8KLS8vIFRYX1BXUiBWYWx1ZSB2YWxpZCByYW5nZSAweEZBKC02KSB+IDB4MjQoMzYpCi0vLwotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKLQkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOwotCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKLQkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKLQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KLQkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KLQkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7Ci0KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKLQkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKLQkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQotCX0JZmllbGQ7Ci0JVUNIQVIJdmFsdWU7Ci19CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOwotCi0vLwotLy8gUU9TX0NTUjA6IFRYT1AgaG9sZGVyIGFkZHJlc3MwIHJlZ2lzdGVyCi0vLwotdHlwZWRlZgl1bmlvbglfUU9TX0NTUjBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlMDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMAotCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKLQkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCi0JCVVDSEFSCQlCeXRlMzsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUU9TX0NTUjBfU1RSVUMsICpQUU9TX0NTUjBfU1RSVUM7Ci0KLS8vCi0vLyBRT1NfQ1NSMTogVFhPUCBob2xkZXIgYWRkcmVzczEgcmVnaXN0ZXIKLS8vCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGU0OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA0Ci0JCVVDSEFSCQlCeXRlNTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNQotCQlVQ0hBUgkJUnN2ZDA7Ci0JCVVDSEFSCQlSc3ZkMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVFPU19DU1IxX1NUUlVDLCAqUFFPU19DU1IxX1NUUlVDOwotCi0jZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCi0JCVVJTlQJVEVTVENTUl9SRkFDQ19SRUdOVU06NTsJLy8gUkYgcmVnaXN0ZXIgSUQKLQkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVJGX0NTUl9XUjoxOwkJCS8vIDA6IHJlYWQgIDE6IHdyaXRlCi0JCVVJTlQJUkZfQ1NSX0tJQ0s6MTsJCQkvLyBraWNrIFJGIHJlZ2lzdGVyIHJlYWQvd3JpdGUKLQkJVUlOVAlSc3ZkMToxNDsJCQkJLy8gUmVzZXJ2ZWQKLQl9CWZpZWxkOwotCVVJTlQJd29yZDsKLX0JUkZfQ1NSX0NGR19TVFJVQywgKlBSRl9DU1JfQ0ZHX1NUUlVDOwotCi0jZW5kaWYJLy8gX19SVDI4WFhfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9jb25maWcuaAppbmRleCAyMDkzYTgwLi5kMWFkZWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2NvbmZpZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfY29uZmlnLmgKQEAgLTQxLDMyICs0MSwzMSBAQAogI2RlZmluZQlfX1JUX0NPTkZJR19IX18KIAogI2luY2x1ZGUgICAgInJ0bXBfdHlwZS5oIgotI2lmZGVmIExJTlVYCi0jaW5jbHVkZQkicnRfbGludXguaCIKLSNlbmRpZgotI2luY2x1ZGUgICAgInJ0bXBfZGVmLmgiCi0jaW5jbHVkZSAgICAicnQyOHh4LmgiCisjaW5jbHVkZSAicnRtcF9vcy5oIgogCi0jaWZkZWYgUlQyODYwCi0jaW5jbHVkZQkicnQyODYwLmgiCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSNpbmNsdWRlCSIuLi9ydDI4NzAvcnQyODcwLmgiCi0jZW5kaWYgLy8gUlQyODcwIC8vCisjaW5jbHVkZSAicnRtcF9kZWYuaCIKKyNpbmNsdWRlICJydG1wX2NoaXAuaCIKKyNpbmNsdWRlICJydG1wX3RpbWVyLmgiCiAKICNpbmNsdWRlICAgICJvaWQuaCIKICNpbmNsdWRlICAgICJtbG1lLmgiCiAjaW5jbHVkZSAgICAid3BhLmgiCi0jaW5jbHVkZSAgICAibWQ1LmgiCisjaW5jbHVkZSAiY3J5cHRfbWQ1LmgiCisjaW5jbHVkZSAiY3J5cHRfc2hhMi5oIgorI2luY2x1ZGUgImNyeXB0X2htYWMuaCIKICNpbmNsdWRlICAgICJydG1wLmgiCiAjaW5jbHVkZQkiYXAuaCIKICNpbmNsdWRlCSJkZnMuaCIKICNpbmNsdWRlCSJjaGxpc3QuaCIKICNpbmNsdWRlCSJzcGVjdHJ1bS5oIgogCisjaW5jbHVkZSAiZWVwcm9tLmgiCisjaWYgZGVmaW5lZChSVE1QX1BDSV9TVVBQT1JUKSB8fCBkZWZpbmVkKFJUTVBfVVNCX1NVUFBPUlQpCisjaW5jbHVkZSAicnRtcF9tY3UuaCIKKyNlbmRpZgorCiAjaWZkZWYgSUdNUF9TTk9PUF9TVVBQT1JUCiAjaW5jbHVkZSAiaWdtcF9zbm9vcC5oIgotI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLworI2VuZGlmIC8qIElHTVBfU05PT1BfU1VQUE9SVCAvLyAqLwogCi0jZW5kaWYJLy8gX19SVF9DT05GSUdfSF9fCi0KKyNlbmRpZiAvKiBfX1JUX0NPTkZJR19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguYwppbmRleCBlZDI3Yjg1Li45MzU3ZmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5jCkBAIC0yOCwxNDkgKzI4LDExNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSAicnRfY29uZmlnLmgiCiAKLVVMT05HCVJURGVidWdMZXZlbCA9IFJUX0RFQlVHX0VSUk9SOwordW5zaWduZWQgbG9uZyBSVERlYnVnTGV2ZWwgPSBSVF9ERUJVR19FUlJPUjsKIAotQlVJTERfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihBUFNEUGVyaW9kaWNFeGVjKTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEFzaWNSZlR1bmluZ0V4ZWMpOwotI2lmZGVmIFJUMjg3MAotQlVJTERfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQXV0aFRpbWVvdXQpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihMaW5rRG93bkV4ZWMpOwotQlVJTERfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYyk7Ci0jaWZkZWYgUlQyODYwCi1CVUlMRF9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7Ci1CVUlMRF9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyk7Ci0jZW5kaWYKLQotLy8gZm9yIHdpcmVsZXNzIHN5c3RlbSBldmVudCBtZXNzYWdlCisvKiBmb3Igd2lyZWxlc3Mgc3lzdGVtIGV2ZW50IG1lc3NhZ2UgKi8KIGNoYXIgY29uc3QgKnBXaXJlbGVzc1N5c0V2ZW50VGV4dFtJV19TWVNfRVZFTlRfVFlQRV9OVU1dID0gewotCS8vIHN5c3RlbSBzdGF0dXMgZXZlbnQKLSAgICAiaGFkIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5IiwJCQkJCQkJLyogSVdfQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJoYWQgZGlzYXNzb2NpYXRlZCIsCQkJCQkJCQkJLyogSVdfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJoYWQgZGVhdXRoZW50aWNhdGVkIiwJCQkJCQkJCQkvKiBJV19ERUFVVEhfRVZFTlRfRkxBRyAqLwotICAgICJoYWQgYmVlbiBhZ2VkLW91dCBhbmQgZGlzYXNzb2NpYXRlZCIsCQkJCQkvKiBJV19BR0VPVVRfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBDb3VudGVyTWVhc3VyZXMgYXR0YWNrIiwJCQkJCQkvKiBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgcmVwbGF5IGNvdW50ZXIgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCS8qIElXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBSU05JRSBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJCQkvKiBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgTUlDIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkJCS8qIElXX01JQ19ESUZGX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgSUNWIGVycm9yIGluIFJYIiwJCQkJCQkJCS8qIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIE1JQyBlcnJvciBpbiBSWCIsCQkJCQkJCQkvKiBJV19NSUNfRVJST1JfRVZFTlRfRkxBRyAqLwotCSJHcm91cCBLZXkgSGFuZHNoYWtpbmcgdGltZW91dCIsCQkJCQkJLyogSVdfR1JPVVBfSFNfVElNRU9VVF9FVkVOVF9GTEFHICovCi0JIlBhaXJ3aXNlIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJCQkJCQkvKiBJV19QQUlSV0lTRV9IU19USU1FT1VUX0VWRU5UX0ZMQUcgKi8KLQkiUlNOIElFIHNhbml0eSBjaGVjayBmYWlsdXJlIiwJCQkJCQkJLyogSVdfUlNOSUVfU0FOSVRZX0ZBSUxfRVZFTlRfRkxBRyAqLwotCSJzZXQga2V5IGRvbmUgaW4gV1BBL1dQQVBTSyIsCQkJCQkJCS8qIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcgKi8KLQkic2V0IGtleSBkb25lIGluIFdQQTIvV1BBMlBTSyIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcgKi8KLQkiY29ubmVjdHMgd2l0aCBvdXIgd2lyZWxlc3MgY2xpZW50IiwgICAgICAgICAgICAgICAgICAgIC8qIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRyAqLwotCSJkaXNjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLCAgICAgICAgICAgICAgICAgLyogSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcgKi8KLQkic2NhbiBjb21wbGV0ZWQiCQkJCQkJCQkJCS8qIElXX1NDQU5fQ09NUExFVEVEX0VWRU5UX0ZMQUcgKi8KLQkic2NhbiB0ZXJtaW5hdGUhISBCdXN5ISEgRW5xdWV1ZSBmYWlsISEiCQkJCS8qIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcgKi8KLQl9OworCS8qIHN5c3RlbSBzdGF0dXMgZXZlbnQgKi8KKwkiaGFkIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5IiwJLyogSVdfQVNTT0NfRVZFTlRfRkxBRyAqLworCSJoYWQgZGlzYXNzb2NpYXRlZCIsCS8qIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKwkiaGFkIGRlYXV0aGVudGljYXRlZCIsCS8qIElXX0RFQVVUSF9FVkVOVF9GTEFHICovCisJImhhZCBiZWVuIGFnZWQtb3V0IGFuZCBkaXNhc3NvY2lhdGVkIiwJLyogSVdfQUdFT1VUX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgQ291bnRlck1lYXN1cmVzIGF0dGFjayIsCS8qIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAqLworCSJvY2N1cnJlZCByZXBsYXkgY291bnRlciBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJLyogSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHICovCisJIm9jY3VycmVkIFJTTklFIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkvKiBJV19SU05JRV9ESUZGX0VWRU5UX0ZMQUcgKi8KKwkib2NjdXJyZWQgTUlDIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkvKiBJV19NSUNfRElGRl9FVkVOVF9GTEFHICovCisJIm9jY3VycmVkIElDViBlcnJvciBpbiBSWCIsCS8qIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHICovCisJIm9jY3VycmVkIE1JQyBlcnJvciBpbiBSWCIsCS8qIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHICovCisJIkdyb3VwIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJLyogSVdfR1JPVVBfSFNfVElNRU9VVF9FVkVOVF9GTEFHICovCisJIlBhaXJ3aXNlIEtleSBIYW5kc2hha2luZyB0aW1lb3V0IiwJLyogSVdfUEFJUldJU0VfSFNfVElNRU9VVF9FVkVOVF9GTEFHICovCisJIlJTTiBJRSBzYW5pdHkgY2hlY2sgZmFpbHVyZSIsCS8qIElXX1JTTklFX1NBTklUWV9GQUlMX0VWRU5UX0ZMQUcgKi8KKwkic2V0IGtleSBkb25lIGluIFdQQS9XUEFQU0siLAkvKiBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHICovCisJInNldCBrZXkgZG9uZSBpbiBXUEEyL1dQQTJQU0siLAkvKiBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHICovCisJImNvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsCS8qIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRyAqLworCSJkaXNjb25uZWN0cyB3aXRoIG91ciB3aXJlbGVzcyBjbGllbnQiLAkvKiBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRyAqLworCSJzY2FuIGNvbXBsZXRlZCIJLyogSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRyAqLworCSAgICAic2NhbiB0ZXJtaW5hdGUhIEJ1c3khIEVucXVldWUgZmFpbCEiCS8qIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcgKi8KK307CiAKLS8vIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKKy8qIGZvciB3aXJlbGVzcyBJRFNfc3Bvb2ZfYXR0YWNrIGV2ZW50IG1lc3NhZ2UgKi8KIGNoYXIgY29uc3QgKnBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W0lXX1NQT09GX0VWRU5UX1RZUEVfTlVNXSA9IHsKLSAgICAiZGV0ZWN0ZWQgY29uZmxpY3QgU1NJRCIsCQkJCQkJCQkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCQkJCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJCQkJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCQkJCQkJLyogSVdfU1BPT0ZfUFJPQkVfUkVTUF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgYmVhY29uIiwJCQkJCQkJCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkJCQkJCS8qIElXX1NQT09GX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBhdXRoZW50aWNhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgZGVhdXRoZW50aWNhdGlvbiIsCQkJCQkvKiBJV19TUE9PRl9ERUFVVEhfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSIsCQkJLyogSVdfU1BPT0ZfVU5LTk9XTl9NR01UX0VWRU5UX0ZMQUcgKi8KLQkiZGV0ZWN0ZWQgcmVwbGF5IGF0dGFjayIJCQkJCQkJCS8qIElXX1JFUExBWV9BVFRBQ0tfRVZFTlRfRkxBRyAqLwotCX07CisJImRldGVjdGVkIGNvbmZsaWN0IFNTSUQiLAkvKiBJV19DT05GTElDVF9TU0lEX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBhc3NvY2lhdGlvbiByZXNwb25zZSIsCS8qIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIHJlYXNzb2NpYXRpb24gcmVzcG9uc2VzIiwJLyogSVdfU1BPT0ZfUkVBU1NPQ19SRVNQX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBwcm9iZSByZXNwb25zZSIsCS8qIElXX1NQT09GX1BST0JFX1JFU1BfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBzcG9vZmVkIGJlYWNvbiIsCS8qIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHNwb29mZWQgZGlzYXNzb2NpYXRpb24iLAkvKiBJV19TUE9PRl9ESVNBU1NPQ19FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHNwb29mZWQgYXV0aGVudGljYXRpb24iLAkvKiBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCBkZWF1dGhlbnRpY2F0aW9uIiwJLyogSVdfU1BPT0ZfREVBVVRIX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgc3Bvb2ZlZCB1bmtub3duIG1hbmFnZW1lbnQgZnJhbWUiLAkvKiBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCByZXBsYXkgYXR0YWNrIgkvKiBJV19SRVBMQVlfQVRUQUNLX0VWRU5UX0ZMQUcgKi8KK307CiAKLS8vIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UKKy8qIGZvciB3aXJlbGVzcyBJRFNfZmxvb2RpbmdfYXR0YWNrIGV2ZW50IG1lc3NhZ2UgKi8KIGNoYXIgY29uc3QgKnBXaXJlbGVzc0Zsb29kRXZlbnRUZXh0W0lXX0ZMT09EX0VWRU5UX1RZUEVfTlVNXSA9IHsKLQkiZGV0ZWN0ZWQgYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfQVNTT0NfUkVRX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgcmVhc3NvY2lhdGlvbiByZXF1ZXN0IGZsb29kaW5nIiwJCQkJLyogSVdfRkxPT0RfUkVBU1NPQ19SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBwcm9iZSByZXF1ZXN0IGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBkZWF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJCQkJCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJCQkJCS8qIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRyAqLwotCX07CisJImRldGVjdGVkIGF1dGhlbnRpY2F0aW9uIGZsb29kaW5nIiwJLyogSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIGFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkvKiBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCByZWFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkvKiBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIHByb2JlIHJlcXVlc3QgZmxvb2RpbmciLAkvKiBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRyAqLworCSJkZXRlY3RlZCBkaXNhc3NvY2lhdGlvbiBmbG9vZGluZyIsCS8qIElXX0ZMT09EX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KKwkiZGV0ZWN0ZWQgZGVhdXRoZW50aWNhdGlvbiBmbG9vZGluZyIsCS8qIElXX0ZMT09EX0RFQVVUSF9FVkVOVF9GTEFHICovCisJImRldGVjdGVkIDgwMi4xeCBlYXAtcmVxdWVzdCBmbG9vZGluZyIJLyogSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHICovCit9OwogCiAvKiB0aW1lb3V0IC0tIG1zICovCi1WT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQordm9pZCBSVE1QX1NldFBlcmlvZGljVGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCQkgICBJTiB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwl0aW1lb3V0ID0gKCh0aW1lb3V0ICogT1NfSFopIC8gMTAwMCk7CiAJcFRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7CiAJYWRkX3RpbWVyKHBUaW1lcik7CiB9CiAKIC8qIGNvbnZlcnQgTmRpc01Jbml0aWFsaXplVGltZXIgLS0+IFJUTVBfT1NfSW5pdF9UaW1lciAqLwotVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAotCUlOCVBWT0lEIGRhdGEpCit2b2lkIFJUTVBfT1NfSW5pdF9UaW1lcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJCUlOIFRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLCB2b2lkICpkYXRhKQogewogCWluaXRfdGltZXIocFRpbWVyKTsKLSAgICBwVGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylkYXRhOwotICAgIHBUaW1lci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKKwlwVGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylkYXRhOworCXBUaW1lci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKIH0KIAotCi1WT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQordm9pZCBSVE1QX09TX0FkZF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIElOIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKIAlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQogCQlyZXR1cm47CiAKLQl0aW1lb3V0ID0gKCh0aW1lb3V0KkhaKSAvIDEwMDApOworCXRpbWVvdXQgPSAoKHRpbWVvdXQgKiBPU19IWikgLyAxMDAwKTsKIAlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKIAlhZGRfdGltZXIocFRpbWVyKTsKIH0KIAotVk9JRCBSVE1QX09TX01vZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3ZvaWQgUlRNUF9PU19Nb2RfVGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCSAgICAgICBJTiB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JdGltZW91dCA9ICgodGltZW91dCpIWikgLyAxMDAwKTsKKwl0aW1lb3V0ID0gKCh0aW1lb3V0ICogT1NfSFopIC8gMTAwMCk7CiAJbW9kX3RpbWVyKHBUaW1lciwgamlmZmllcyArIHRpbWVvdXQpOwogfQogCi1WT0lEIFJUTVBfT1NfRGVsX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJCSpwVGltZXIsCi0JT1VUCUJPT0xFQU4JCQkJCSpwQ2FuY2VsbGVkKQordm9pZCBSVE1QX09TX0RlbF9UaW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqIHBUaW1lciwKKwkJICAgICAgIE9VVCBCT09MRUFOICogcENhbmNlbGxlZCkKIHsKLQlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQotCXsKKwlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKSB7CiAJCSpwQ2FuY2VsbGVkID0gZGVsX3RpbWVyX3N5bmMocFRpbWVyKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQkqcENhbmNlbGxlZCA9IFRSVUU7CiAJfQogCiB9CiAKLVZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSkKK3ZvaWQgUlRNUF9PU19SZWxlYXNlX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5KQogewotCS8vUlRNUEZyZWVOZGlzUGFja2V0KHBBZCwgKHN0cnVjdCBza19idWZmICopcEVudHJ5KTsKKwkvKlJUTVBGcmVlTmRpc1BhY2tldChwQWQsIChzdHJ1Y3Qgc2tfYnVmZiAqKXBFbnRyeSk7ICovCiB9CiAKLS8vIFVuaWZ5IGFsbCBkZWxheSByb3V0aW5lIGJ5IHVzaW5nIHVkZWxheQotVk9JRCBSVE1QdXNlY0RlbGF5KAotCUlOCVVMT05HCXVzZWMpCisvKiBVbmlmeSBhbGwgZGVsYXkgcm91dGluZSBieSB1c2luZyB1ZGVsYXkgKi8KK3ZvaWQgUlRNUHVzZWNEZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCiB7Ci0JVUxPTkcJaTsKKwl1bnNpZ25lZCBsb25nIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgKHVzZWMgLyA1MCk7IGkrKykKIAkJdWRlbGF5KDUwKTsKQEAgLTE3OSwyOCArMTQ0LDIzIEBACiAJCXVkZWxheSh1c2VjICUgNTApOwogfQogCi12b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqdGltZSkKK3ZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICogdGltZSkKIHsKIAl0aW1lLT51Lkxvd1BhcnQgPSBqaWZmaWVzOwogfQogCi0vLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCi1ORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUCVBVQ0hBUiAqbWVtLAotCUlOCVVMT05HICBzaXplKQorLyogcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTCAqLworaW50IG9zX2FsbG9jX21lbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICoqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCSptZW0gPSAoUFVDSEFSKSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCSptZW0gPSAodTggKilrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwogCWlmICgqbWVtKQogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogCWVsc2UKIAkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKIH0KIAotLy8gcEFkIE1VU1QgYWxsb3cgdG8gYmUgTlVMTAotTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFVDSEFSIG1lbSkKKy8qIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwgKi8KK2ludCBvc19mcmVlX21lbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKm1lbSkKIHsKIAogCUFTU0VSVChtZW0pOwpAQCAtMjA4LDY2ICsxNjgsNjQgQEAKIAlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCit2b2lkICpSdG1wT1NOZXRQa3RBbGxvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIGludCBzaXplKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJLyogQWRkIDIgbW9yZSBieXRlcyBmb3IgaXAgaGVhZGVyIGFsaWdubWVudCAqLworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSArIDIpOwogCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZUZyYWdQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoKQorCXJldHVybiAoKHZvaWQgKilza2IpOworfQorCit2b2lkICpSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKQogewogCXN0cnVjdCBza19idWZmICpwa3Q7CiAKIAlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7CiAKLQlpZiAocGt0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSBmcmFnIHJ4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKKwlpZiAocGt0ID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJjYW4ndCBhbGxvY2F0ZSBmcmFnIHJ4ICVsZCBzaXplIHBhY2tldFxuIiwgTGVuZ3RoKSk7CiAJfQogCi0JaWYgKHBrdCkKLQl7CisJaWYgKHBrdCkgewogCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKIAl9CiAKLQlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OworCXJldHVybiAodm9pZCAqKXBrdDsKIH0KIAotCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKQordm9pZCAqUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJCQkgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkJCSB2b2lkICoqIFZpcnR1YWxBZGRyZXNzKQogewogCXN0cnVjdCBza19idWZmICpwa3Q7CiAKIAlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7CiAKLQlpZiAocGt0ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJjYW4ndCBhbGxvY2F0ZSB0eCAlbGQgc2l6ZSBwYWNrZXRcbiIsTGVuZ3RoKSk7CisJaWYgKHBrdCA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiY2FuJ3QgYWxsb2NhdGUgdHggJWxkIHNpemUgcGFja2V0XG4iLCBMZW5ndGgpKTsKIAl9CiAKLQlpZiAocGt0KQotCXsKKwlpZiAocGt0KSB7CiAJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIHBrdC0+ZGF0YTsKLQl9Ci0JZWxzZQotCXsKLQkJKlZpcnR1YWxBZGRyZXNzID0gKFBWT0lEKSBOVUxMOworCQkqVmlydHVhbEFkZHJlc3MgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwl9IGVsc2UgeworCQkqVmlydHVhbEFkZHJlc3MgPSAodm9pZCAqKU5VTEw7CiAJfQogCi0JcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKKwlyZXR1cm4gKHZvaWQgKilwa3Q7CiB9CiAKLQotVk9JRCBidWlsZF90eF9wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCXBGcmFtZSwKLQlJTglVTE9ORwlGcmFtZUxlbikKK3ZvaWQgYnVpbGRfdHhfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgIHU4ICpwRnJhbWUsIHVuc2lnbmVkIGxvbmcgRnJhbWVMZW4pCiB7CiAKLQlzdHJ1Y3Qgc2tfYnVmZgkqcFR4UGt0OworCXN0cnVjdCBza19idWZmICpwVHhQa3Q7CiAKIAlBU1NFUlQocFBhY2tldCk7CiAJcFR4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CkBAIC0yNzUsMzIgKzIzMywzNiBAQAogCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXQocFR4UGt0LCBGcmFtZUxlbiksIHBGcmFtZSwgRnJhbWVMZW4pOwogfQogCi1WT0lECVJUTVBGcmVlQWRhcHRlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUEZyZWVBZGFwdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSAgICBQT1NfQ09PS0lFIG9zX2Nvb2tpZTsKKwlzdHJ1Y3Qgb3NfY29va2llICpvc19jb29raWU7CiAJaW50IGluZGV4OwogCi0Jb3NfY29va2llPShQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCW9zX2Nvb2tpZSA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CiAKLQlrZnJlZShwQWQtPkJlYWNvbkJ1Zik7Ci0KKwlpZiAocEFkLT5CZWFjb25CdWYpCisJCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKIAogCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLSNpZmRlZiBSVDI4NjAKKworI2lmZGVmIFJUTVBfTUFDX1BDSQogCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0jZW5kaWYKLQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKLQl7Ci0gICAgCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOworI2lmZGVmIFJUMzA5MAorCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7CisjZW5kaWYgLyogUlQzMDkwIC8vICovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykgeworCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbaW5kZXhdKTsKIAkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5EZVF1ZXVlTG9ja1tpbmRleF0pOwogCQlwQWQtPkRlUXVldWVSdW5uaW5nW2luZGV4XSA9IEZBTFNFOwogCX0KIAogCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+aXJxX2xvY2spOwogCi0JdmZyZWUocEFkKTsgLy8gcGNpX2ZyZWVfY29uc2lzdGVudChvc19jb29raWUtPnBjaV9kZXYsc2l6ZW9mKFJUTVBfQURBUFRFUikscEFkLG9zX2Nvb2tpZS0+cEFkX3BhKTsKLQlrZnJlZShvc19jb29raWUpOworCXZmcmVlKHBBZCk7CQkvKiBwY2lfZnJlZV9jb25zaXN0ZW50KG9zX2Nvb2tpZS0+cGNpX2RldixzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlcikscEFkLG9zX2Nvb2tpZS0+cEFkX3BhKTsgKi8KKwlpZiAob3NfY29va2llKQorCQlrZnJlZShvc19jb29raWUpOwogfQogCiBCT09MRUFOIE9TX05lZWRfQ2xvbmVfUGFja2V0KHZvaWQpCkBAIC0zMDgsOCArMjcwLDYgQEAKIAlyZXR1cm4gKEZBTFNFKTsKIH0KIAotCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTMxNyw3ICsyNzcsNyBAQAogCQljbG9uZSBhbiBpbnB1dCBORElTIFBBQ0tFVCB0byBhbm90aGVyIG9uZS4gVGhlIG5ldyBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKIAkJbXVzdCBoYXZlIG9ubHkgb25lIE5ESVMgQlVGRkVSCiAJCXJldHVybiAtIGJ5dGUgY29waWVkLiAwIG1lYW5zIGNhbid0IGNyZWF0ZSBORElTIFBBQ0tFVAotCQlOT1RFOiBpbnRlcm5hbGx5IGNyZWF0ZWQgTkRJU19QQUNLRVQgc2hvdWxkIGJlIGRlc3Ryb3llZCBieSBSVE1QRnJlZU5kaXNQYWNrZXQKKwkJTk9URTogaW50ZXJuYWxseSBjcmVhdGVkIGNoYXIgc2hvdWxkIGJlIGRlc3Ryb3llZCBieSBSVE1QRnJlZU5kaXNQYWNrZXQKIAogCUFyZ3VtZW50czoKIAkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCkBAIC0zMzIsMTEgKzI5MiwxMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJcEluc0FNU0RVSGRyLAotCUlOCVBORElTX1BBQ0tFVAlwSW5QYWNrZXQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCkKK2ludCBSVE1QQ2xvbmVOZGlzUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQlJTiBCT09MRUFOIHBJbnNBTVNEVUhkciwKKwkJCQl2b2lkICpwSW5QYWNrZXQsCisJCQkJdm9pZCAqKiBwcE91dFBhY2tldCkKIHsKIAogCXN0cnVjdCBza19idWZmICpwa3Q7CkBAIC0zNDQsMTkgKzMwMywxOCBAQAogCUFTU0VSVChwSW5QYWNrZXQpOwogCUFTU0VSVChwcE91dFBhY2tldCk7CiAKLQkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAorCS8qIDEuIEFsbG9jYXRlIGEgcGFja2V0ICovCiAJcGt0ID0gZGV2X2FsbG9jX3NrYigyMDQ4KTsKIAotCWlmIChwa3QgPT0gTlVMTCkKLQl7CisJaWYgKHBrdCA9PSBOVUxMKSB7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotIAlza2JfcHV0KHBrdCwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7Ci0JTmRpc01vdmVNZW1vcnkocGt0LT5kYXRhLCBHRVRfT1NfUEtUX0RBVEFQVFIocEluUGFja2V0KSwgR0VUX09TX1BLVF9MRU4ocEluUGFja2V0KSk7CisJc2tiX3B1dChwa3QsIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOworCU5kaXNNb3ZlTWVtb3J5KHBrdC0+ZGF0YSwgR0VUX09TX1BLVF9EQVRBUFRSKHBJblBhY2tldCksCisJCSAgICAgICBHRVRfT1NfUEtUX0xFTihwSW5QYWNrZXQpKTsKIAkqcHBPdXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChwa3QpOwogCi0KIAlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKIAogCXByaW50aygiIyMjQ2xvbmUjIyNcbiIpOwpAQCAtMzY0LDQyICszMjIsNDAgQEAKIAlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAotCi0vLyB0aGUgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIG11c3QgYmUgZnJlZWQgdmlhIFJUTVBGcmVlTmRpc1BhY2tldCgpCi1ORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBQTkRJU19QQUNLRVQgICAqcHBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlciwKLQlJTglVSU5UCQkJSGVhZGVyTGVuLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVJTlQJCQlEYXRhTGVuKQorLyogdGhlIGFsbG9jYXRlZCBORElTIFBBQ0tFVCBtdXN0IGJlIGZyZWVkIHZpYSBSVE1QRnJlZU5kaXNQYWNrZXQoKSAqLworaW50IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHZvaWQgKiogcHBQYWNrZXQsCisJCQkJICAgdTggKnBIZWFkZXIsCisJCQkJICAgdTMyIEhlYWRlckxlbiwKKwkJCQkgICB1OCAqcERhdGEsIHUzMiBEYXRhTGVuKQogewotCVBORElTX1BBQ0tFVAlwUGFja2V0OworCXZvaWQgKnBQYWNrZXQ7CiAJQVNTRVJUKHBEYXRhKTsKIAlBU1NFUlQoRGF0YUxlbik7CiAKLQkvLyAxLiBBbGxvY2F0ZSBhIHBhY2tldAotCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUICopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArIFRYUEFERElOR19TSVpFKTsKLQlpZiAocFBhY2tldCA9PSBOVUxMKQotIAl7CisJLyogMS4gQWxsb2NhdGUgYSBwYWNrZXQgKi8KKwlwUGFja2V0ID0KKwkgICAgKHZvaWQgKiopIGRldl9hbGxvY19za2IoSGVhZGVyTGVuICsgRGF0YUxlbiArCisJCQkJCSAgIFJUTVBfUEtUX1RBSUxfUEFERElORyk7CisJaWYgKHBQYWNrZXQgPT0gTlVMTCkgewogCQkqcHBQYWNrZXQgPSBOVUxMOwogI2lmZGVmIERFQlVHCi0JCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG5cbiIpOworCQlwcmludGsoIlJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQgRmFpbFxuIik7CiAjZW5kaWYKIAkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQotCi0JLy8gMi4gY2xvbmUgdGhlIGZyYW1lIGNvbnRlbnQKKwkvKiAyLiBjbG9uZSB0aGUgZnJhbWUgY29udGVudCAqLwogCWlmIChIZWFkZXJMZW4gPiAwKQogCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCksIHBIZWFkZXIsIEhlYWRlckxlbik7CiAJaWYgKERhdGFMZW4gPiAwKQotCQlOZGlzTW92ZU1lbW9yeShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkgKyBIZWFkZXJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkoR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpICsgSGVhZGVyTGVuLCBwRGF0YSwKKwkJCSAgICAgICBEYXRhTGVuKTsKIAotCS8vIDMuIHVwZGF0ZSBsZW5ndGggb2YgcGFja2V0Ci0gCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBIZWFkZXJMZW4rRGF0YUxlbik7CisJLyogMy4gdXBkYXRlIGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuICsgRGF0YUxlbik7CiAKIAlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKLS8vCXByaW50aygiJXMgOiBwUGFja2V0ID0gJXAsIGxlbiA9ICVkXG4iLCBfX2Z1bmNfXywgcFBhY2tldCwgR0VUX09TX1BLVF9MRU4ocFBhY2tldCkpOworLyogICAgICBwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19mdW5jX18sIHBQYWNrZXQsIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKTsgKi8KIAkqcHBQYWNrZXQgPSBwUGFja2V0OwogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQpAQCAtNDA3LDQyICszNjMsMzQgQEAKIC8qCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBEZXNjcmlwdGlvbjoKLQlUaGlzIHJvdXRpbmUgZnJlZXMgYSBtaW5pcG9ydCBpbnRlcm5hbGx5IGFsbG9jYXRlZCBORElTX1BBQ0tFVCBhbmQgaXRzCisJVGhpcyByb3V0aW5lIGZyZWVzIGEgbWluaXBvcnQgaW50ZXJuYWxseSBhbGxvY2F0ZWQgY2hhciBhbmQgaXRzCiAJY29ycmVzcG9uZGluZyBORElTX0JVRkZFUiBhbmQgYWxsb2NhdGVkIG1lbW9yeS4KICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBSVE1QRnJlZU5kaXNQYWNrZXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQordm9pZCBSVE1QRnJlZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewogCWRldl9rZnJlZV9za2JfYW55KFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpKTsKIH0KIAotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLS8vIE5PVEU6IHdlIGRvIGhhdmUgYW4gYXNzdW1wdGlvbiBoZXJlLCB0aGF0IEJ5dGUwIGFuZCBCeXRlMSBhbHdheXMgcmVhc2lkIGF0IHRoZSBzYW1lCi0vLwkJCSBzY2F0dGVyIGdhdGhlciBidWZmZXIKLU5ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCi0JSU4JUE5ESVNfQlVGRkVSCXBGaXJzdEJ1ZmZlciwKLQlJTglVQ0hBUgkJCURlc2lyZWRPZmZzZXQsCi0JT1VUIFBVQ0hBUgkJCXBCeXRlMCwKLQlPVVQgUFVDSEFSCQkJcEJ5dGUxKQorLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCisvKiBOT1RFOiB3ZSBkbyBoYXZlIGFuIGFzc3VtcHRpb24gaGVyZSwgdGhhdCBCeXRlMCBhbmQgQnl0ZTEgYWx3YXlzIHJlYXNpZCBhdCB0aGUgc2FtZSAqLworLyogICAgICAgICAgICAgICAgICAgICAgIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlciAqLworaW50IFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoY2hhciAqcEZpcnN0QnVmZmVyLAorCQkJCSAgICAgIHU4IERlc2lyZWRPZmZzZXQsCisJCQkJICAgICAgdTggKnBCeXRlMCwgdTggKnBCeXRlMSkKIHsKLSAgICAqcEJ5dGUwID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOwotICAgICpwQnl0ZTEgPSAqKFBVQ0hBUikocEZpcnN0QnVmZmVyICsgRGVzaXJlZE9mZnNldCArIDEpOworCSpwQnl0ZTAgPSAqKHU4ICopKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQpOworCSpwQnl0ZTEgPSAqKHU4ICopKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQgKyAxKTsKIAogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQogCi0KLXZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCit2b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKHZvaWQgKnBQYWNrZXQsCisJCQkgIHN0cnVjdCBydF9wYWNrZXRfaW5mbyAqcFBhY2tldEluZm8sCisJCQkgIHU4ICoqIHBTcmNCdWZWQSwgdTMyICogcFNyY0J1ZkxlbikKIHsKIAlwUGFja2V0SW5mby0+QnVmZmVyQ291bnQgPSAxOwotCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IChjaGFyICopR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwogCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKIAlwUGFja2V0SW5mby0+VG90YWxQYWNrZXRMZW5ndGggPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKIApAQCAtNDUwLDMwICszOTgsMjYgQEAKIAkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogfQogCi12b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQordm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8odm9pZCAqKiBwcFBhY2tldCwKKwkJCSAgICAgIHN0cnVjdCBydF9wYWNrZXRfaW5mbyAqcFBhY2tldEluZm8sCisJCQkgICAgICB1OCAqKiBwU3JjQnVmVkEsIHUzMiAqIHBTcmNCdWZMZW4pCiB7Ci0JUE5ESVNfUEFDS0VUIHBQYWNrZXQgPSBOVUxMOworCXZvaWQgKnBQYWNrZXQgPSBOVUxMOwogCiAJaWYgKCpwcFBhY2tldCkKIAkJcFBhY2tldCA9IEdFVF9PU19QS1RfTkVYVCgqcHBQYWNrZXQpOwogCi0JaWYgKHBQYWNrZXQpCi0JeworCWlmIChwUGFja2V0KSB7CiAJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDE7Ci0JCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPQorCQkgICAgKGNoYXIgKilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CiAJCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMTsKIAkJcFBhY2tldEluZm8tPlRvdGFsUGFja2V0TGVuZ3RoID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7CiAKIAkJKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKIAkJKnBTcmNCdWZMZW4gPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKIAkJKnBwUGFja2V0ID0gR0VUX09TX1BLVF9ORVhUKHBQYWNrZXQpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBQYWNrZXRJbmZvLT5CdWZmZXJDb3VudCA9IDA7CiAJCXBQYWNrZXRJbmZvLT5wRmlyc3RCdWZmZXIgPSBOVUxMOwogCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDA7CkBAIC00ODUsMzYgKzQyOSwxOSBAQAogCX0KIH0KIAotLy8gbm90IHlldCBzdXBwb3J0IE1CU1MKLVBORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCAqRHVwbGljYXRlUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdm9pZCAqcFBhY2tldCwgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0gICAgUE5FVF9ERVYgZGV2X3AgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9pZCAqcFJldFBhY2tldCA9IE5VTEw7CisJdTE2IERhdGFTaXplOworCXU4ICpwRGF0YTsKIAotCWRldl9wID0gcEFkLT5uZXRfZGV2OwotCi0JQVNTRVJUKGRldl9wKTsKLQlyZXR1cm4gZGV2X3A7IC8qIHJldHVybiBvbmUgb2YgTUJTUyAqLwotfQotCi1QTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7Ci0JVVNIT1JUCQkJRGF0YVNpemU7Ci0JVUNIQVIJCQkqcERhdGE7Ci0KLQlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCisJRGF0YVNpemUgPSAodTE2KUdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOworCXBEYXRhID0gKHU4ICopR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwogCiAJc2tiID0gc2tiX2Nsb25lKFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKHNrYikKLQl7CisJaWYgKHNrYikgewogCQlza2ItPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKIAkJcFJldFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHNrYik7CiAJfQpAQCAtNTIzLDI0ICs0NTAsMjEgQEAKIAogfQogCi1QTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCAqZHVwbGljYXRlX3BrdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcEhlYWRlcjgwMl8zLAorCQkJICAgdTMyIEhkckxlbiwKKwkJCSAgIHU4ICpwRGF0YSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUsIHU4IEZyb21XaGljaEJTU0lEKQogewotCXN0cnVjdCBza19idWZmCSpza2I7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9pZCAqcFBhY2tldCA9IE5VTEw7CiAKLQotCWlmICgoc2tiID0gX19kZXZfYWxsb2Nfc2tiKEhkckxlbiArIERhdGFTaXplICsgMiwgTUVNX0FMTE9DX0ZMQUcpKSAhPSBOVUxMKQotCXsKKwlpZiAoKHNrYiA9CisJICAgICBfX2Rldl9hbGxvY19za2IoSGRyTGVuICsgRGF0YVNpemUgKyAyLCBNRU1fQUxMT0NfRkxBRykpICE9IE5VTEwpIHsKIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQkJTmRpc01vdmVNZW1vcnkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCBwSGVhZGVyODAyXzMsIEhkckxlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHNrYi0+dGFpbCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4pOwogCQlza2JfcHV0KHNrYiwgSGRyTGVuKTsKLQkJTmRpc01vdmVNZW1vcnkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCBwRGF0YSwgRGF0YVNpemUpOworCQlOZGlzTW92ZU1lbW9yeShza2ItPnRhaWwsIHBEYXRhLCBEYXRhU2l6ZSk7CiAJCXNrYl9wdXQoc2tiLCBEYXRhU2l6ZSk7CiAJCXNrYi0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwogCQlwUGFja2V0ID0gT1NQS1RfVE9fUlRQS1Qoc2tiKTsKQEAgLTU0OSwyNCArNDczLDIyIEBACiAJcmV0dXJuIHBQYWNrZXQ7CiB9CiAKLQogI2RlZmluZSBUS0lQX1RYX01JQ19TSVpFCQk4Ci1QTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQordm9pZCAqZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHZvaWQgKnBQYWNrZXQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYiwgKm5ld3NrYjsKLQorCXN0cnVjdCBza19idWZmICpza2IsICpuZXdza2I7CiAKIAlza2IgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKLQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBUS0lQX1RYX01JQ19TSVpFKQotCXsKLQkJLy8gYWxsb2MgYSBuZXcgc2tiIGFuZCBjb3B5IHRoZSBwYWNrZXQKLQkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsIEdGUF9BVE9NSUMpOworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IFRLSVBfVFhfTUlDX1NJWkUpIHsKKwkJLyogYWxsb2MgYSBuZXcgc2tiIGFuZCBjb3B5IHRoZSBwYWNrZXQgKi8KKwkJbmV3c2tiID0KKwkJICAgIHNrYl9jb3B5X2V4cGFuZChza2IsIHNrYl9oZWFkcm9vbShza2IpLCBUS0lQX1RYX01JQ19TSVpFLAorCQkJCSAgICBHRlBfQVRPTUlDKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJaWYgKG5ld3NrYiA9PSBOVUxMKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFeHRlbmQgVHguTUlDIGZvciBwYWNrZXQgZmFpbGVkISwgZHJvcHBpbmcgcGFja2V0IVxuIikpOworCQlpZiAobmV3c2tiID09IE5VTEwpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIkV4dGVuZCBUeC5NSUMgZm9yIHBhY2tldCBmYWlsZWQhLCBkcm9wcGluZyBwYWNrZXQhXG4iKSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlza2IgPSBuZXdza2I7CkBAIC01NzUsNDUgKzQ5NywzNyBAQAogCXJldHVybiBPU1BLVF9UT19SVFBLVChza2IpOwogfQogCi0KLQotCi1QTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3ZvaWQgKkNsb25lUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB2b2lkICpwUGFja2V0LAorCQkJIHU4ICpwRGF0YSwgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OwotCXN0cnVjdCBza19idWZmCSpwQ2xvbmVkUGt0OworCXN0cnVjdCBza19idWZmICpwUnhQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBDbG9uZWRQa3Q7CiAKIAlBU1NFUlQocFBhY2tldCk7CiAJcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7CiAKLQkvLyBjbG9uZSB0aGUgcGFja2V0CisJLyogY2xvbmUgdGhlIHBhY2tldCAqLwogCXBDbG9uZWRQa3QgPSBza2JfY2xvbmUocFJ4UGt0LCBNRU1fQUxMT0NfRkxBRyk7CiAKLQlpZiAocENsb25lZFBrdCkKLQl7Ci0gICAgCS8vIHNldCB0aGUgY29ycmVjdCBkYXRhcHRyIGFuZCBkYXRhIGxlbgotICAgIAlwQ2xvbmVkUGt0LT5kZXYgPSBwUnhQa3QtPmRldjsKLSAgICAJcENsb25lZFBrdC0+ZGF0YSA9IHBEYXRhOwotICAgIAlwQ2xvbmVkUGt0LT5sZW4gPSBEYXRhU2l6ZTsKLSAgICAJcENsb25lZFBrdC0+dGFpbCA9IHBDbG9uZWRQa3QtPmRhdGEgKyBwQ2xvbmVkUGt0LT5sZW47CisJaWYgKHBDbG9uZWRQa3QpIHsKKwkJLyogc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuICovCisJCXBDbG9uZWRQa3QtPmRldiA9IHBSeFBrdC0+ZGV2OworCQlwQ2xvbmVkUGt0LT5kYXRhID0gcERhdGE7CisJCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOworCQlwQ2xvbmVkUGt0LT50YWlsID0gcENsb25lZFBrdC0+ZGF0YSArIHBDbG9uZWRQa3QtPmxlbjsKIAkJQVNTRVJUKERhdGFTaXplIDwgMTUzMCk7CiAJfQogCXJldHVybiBwQ2xvbmVkUGt0OwogfQogCi0vLwotLy8gY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuCi0vLwotdm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCisvKiAqLworLyogY2hhbmdlIE9TIHBhY2tldCBEYXRhUHRyIGFuZCBEYXRhTGVuICovCisvKiAqLwordm9pZCB1cGRhdGVfb3NfcGFja2V0X2luZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OworCXN0cnVjdCBza19idWZmICpwT1NQa3Q7CiAKIAlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwogCXBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKQEAgLTYyNCwxNCArNTM4LDEyIEBACiAJcE9TUGt0LT50YWlsID0gcE9TUGt0LT5kYXRhICsgcE9TUGt0LT5sZW47CiB9CiAKLQotdm9pZCB3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCit2b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywKKwkJCQkgdTggKnBIZWFkZXI4MDJfMywKKwkJCQkgdTggRnJvbVdoaWNoQlNTSUQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcE9TUGt0OwogCiAJQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKIAlBU1NFUlQocEhlYWRlcjgwMl8zKTsKQEAgLTY0MywzNyArNTU1LDM1IEBACiAJcE9TUGt0LT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOwogCXBPU1BrdC0+dGFpbCA9IHBPU1BrdC0+ZGF0YSArIHBPU1BrdC0+bGVuOwogCi0JLy8KLQkvLyBjb3B5IDgwMi4zIGhlYWRlcgotCS8vCi0JLy8KKwkvKiAqLworCS8qIGNvcHkgODAyLjMgaGVhZGVyICovCisJLyogKi8KKwkvKiAqLwogCi0JTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBMRU5HVEhfODAyXzMpLCBwSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMyk7CisJTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBMRU5HVEhfODAyXzMpLCBwSGVhZGVyODAyXzMsCisJCSAgICAgICBMRU5HVEhfODAyXzMpOwogfQogCi12b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKK3ZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCkKIHsKIAotCXN0cnVjdCBza19idWZmCSpwUnhQa3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBSeFBrdDsKIAogCUFTU0VSVChwUGFja2V0KTsKIAogCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOwogCi0gICAgLyogUHVzaCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLwogCXBSeFBrdC0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhwUnhQa3QsIHBSeFBrdC0+ZGV2KTsKIAogCW5ldGlmX3J4KHBSeFBrdCk7CiB9CiAKLQotUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAotcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpCitzdHJ1Y3QgcnRfcnRtcF9zZ19saXN0ICoKK3J0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KHZvaWQgKnBQYWNrZXQsIHN0cnVjdCBydF9ydG1wX3NnX2xpc3QgKnNnKQogewogCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKLQlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CisJc2ctPkVsZW1lbnRzWzBdLkFkZHJlc3MgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7CiAJc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwogCXJldHVybiAoc2cpOwogfQpAQCAtNjg3LDEzICs1OTcsMTMgQEAKIAkJcmV0dXJuOwogCiAJcHQgPSBwU3JjQnVmVkE7Ci0JcHJpbnRrKCIlczogJXAsIGxlbiA9ICVkXG4iLHN0ciwgIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKLQlmb3IgKHg9MDsgeDxTcmNCdWZMZW47IHgrKykKLQl7CisJcHJpbnRrKCIlczogJXAsIGxlbiA9ICVkXG4iLCBzdHIsIHBTcmNCdWZWQSwgU3JjQnVmTGVuKTsKKwlmb3IgKHggPSAwOyB4IDwgU3JjQnVmTGVuOyB4KyspIHsKIAkJaWYgKHggJSAxNiA9PSAwKQogCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKIAkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOwotCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOworCQlpZiAoeCAlIDE2ID09IDE1KQorCQkJcHJpbnRrKCJcbiIpOwogCX0KIAlwcmludGsoIlxuIik7CiB9CkBAIC03MTgsMTg3ICs2MjgsMTk3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUTVBTZW5kV2lyZWxlc3NFdmVudCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlFdmVudF9mbGFnLAotCUlOCVBVQ0hBUiAJCQlwQWRkciwKLQlJTglVQ0hBUgkJCUJzc0lkeCwKLQlJTglDSEFSCQkJUnNzaSkKK3ZvaWQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHUxNiBFdmVudF9mbGFnLAorCQkJICAgdTggKnBBZGRyLCB1OCBCc3NJZHgsIGNoYXIgUnNzaSkKIHsKIAotCXVuaW9uIAlpd3JlcV9kYXRhICAgICAgd3JxdTsKLQlQVUNIQVIgCXBCdWYgPSBOVUxMLCBwQnVmUHRyID0gTlVMTDsKLQlVU0hPUlQJZXZlbnQsIHR5cGUsIEJ1ZkxlbjsKLQlVQ0hBUglldmVudF90YWJsZV9sZW4gPSAwOworCS8qdW5pb24gICAgICAgICBpd3JlcV9kYXRhICAgICAgd3JxdTsgKi8KKwljaGFyICpwQnVmID0gTlVMTCwgKnBCdWZQdHIgPSBOVUxMOworCXUxNiBldmVudCwgdHlwZSwgQnVmTGVuOworCXU4IGV2ZW50X3RhYmxlX2xlbiA9IDA7CiAKIAl0eXBlID0gRXZlbnRfZmxhZyAmIDB4RkYwMDsKIAlldmVudCA9IEV2ZW50X2ZsYWcgJiAweDAwRkY7CiAKLQlzd2l0Y2ggKHR5cGUpCi0JewotCQljYXNlIElXX1NZU19FVkVOVF9GTEFHX1NUQVJUOgotCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVDoKKwkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1lTX0VWRU5UX1RZUEVfTlVNOworCQlicmVhazsKIAotCQljYXNlIElXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQ6Ci0JCQlldmVudF90YWJsZV9sZW4gPSBJV19TUE9PRl9FVkVOVF9UWVBFX05VTTsKLQkJCWJyZWFrOworCWNhc2UgSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVDoKKwkJZXZlbnRfdGFibGVfbGVuID0gSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU07CisJCWJyZWFrOwogCi0JCWNhc2UgSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX0ZMT09EX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7CisJY2FzZSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUOgorCQlldmVudF90YWJsZV9sZW4gPSBJV19GTE9PRF9FVkVOVF9UWVBFX05VTTsKKwkJYnJlYWs7CiAJfQogCi0JaWYgKGV2ZW50X3RhYmxlX2xlbiA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgdHlwZSglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLCB0eXBlKSk7CisJaWYgKGV2ZW50X3RhYmxlX2xlbiA9PSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgOiBUaGUgdHlwZSglMHgwMngpIGlzIG5vdCB2YWxpZC5cbiIsIF9fZnVuY19fLAorCQkJICB0eXBlKSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoZXZlbnQgPj0gZXZlbnRfdGFibGVfbGVuKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgZXZlbnQoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywgZXZlbnQpKTsKKwlpZiAoZXZlbnQgPj0gZXZlbnRfdGFibGVfbGVuKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMgOiBUaGUgZXZlbnQoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX2Z1bmNfXywKKwkJCSAgZXZlbnQpKTsKIAkJcmV0dXJuOwogCX0KLQotCS8vQWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IHRoZSBtc2cuCi0JaWYoKHBCdWYgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVhfTEVOLCBHRlBfQVRPTUlDKSkgIT0gTlVMTCkKLQl7Ci0JCS8vUHJlcGFyZSB0aGUgcGF5bG9hZAorCS8qQWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IHRoZSBtc2cuICovCisJaWYgKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpIHsKKwkJLypQcmVwYXJlIHRoZSBwYXlsb2FkICovCiAJCW1lbXNldChwQnVmLCAwLCBJV19DVVNUT01fTUFYX0xFTik7CiAKIAkJcEJ1ZlB0ciA9IHBCdWY7CiAKIAkJaWYgKHBBZGRyKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBTVEEoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpICIsIFBSSU5UX01BQyhwQWRkcikpOworCQkJcEJ1ZlB0ciArPQorCQkJICAgIHNwcmludGYocEJ1ZlB0ciwKKwkJCQkgICAgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwKKwkJCQkgICAgUFJJTlRfTUFDKHBBZGRyKSk7CiAJCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1Mod2xhbiVkKSAiLCBCc3NJZHgpOworCQkJcEJ1ZlB0ciArPQorCQkJICAgIHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIEJTUyh3bGFuJWQpICIsIEJzc0lkeCk7CiAJCWVsc2UKIAkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiKFJUMjg2MCkgIik7CiAKIAkJaWYgKHR5cGUgPT0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzU3lzRXZlbnRUZXh0W2V2ZW50XSk7CisJCQlwQnVmUHRyICs9CisJCQkgICAgc3ByaW50ZihwQnVmUHRyLCAiJXMiLAorCQkJCSAgICBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKIAkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOworCQkJcEJ1ZlB0ciArPQorCQkJICAgIHNwcmludGYocEJ1ZlB0ciwgIiVzIChSU1NJPSVkKSIsCisJCQkJICAgIHBXaXJlbGVzc1Nwb29mRXZlbnRUZXh0W2V2ZW50XSwgUnNzaSk7CiAJCWVsc2UgaWYgKHR5cGUgPT0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NGbG9vZEV2ZW50VGV4dFtldmVudF0pOworCQkJcEJ1ZlB0ciArPQorCQkJICAgIHNwcmludGYocEJ1ZlB0ciwgIiVzIiwKKwkJCQkgICAgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKIAkJZWxzZQogCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7CiAKIAkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOwogCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKIAotCQltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7Ci0JICAgIHdycXUuZGF0YS5mbGFncyA9IEV2ZW50X2ZsYWc7Ci0JCXdycXUuZGF0YS5sZW5ndGggPSBCdWZMZW47Ci0KLQkJLy9zZW5kIHdpcmVsZXNzIGV2ZW50Ci0JICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEJ1Zik7Ci0KLQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX2Z1bmNfXywgcEJ1ZikpOworCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIEV2ZW50X2ZsYWcsIE5VTEwsCisJCQkJCSh1OCAqKXBCdWYsIEJ1Zkxlbik7CisJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgOiAlc1xuIiwgX19mdW5jX18sIHBCdWYpKTsgKi8KIAogCQlrZnJlZShwQnVmKTsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igd2lyZWxlc3MgZXZlbnQuXG4iLCBfX2Z1bmNfXykpOworCX0gZWxzZQorCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIiVzIDogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3aXJlbGVzcyBldmVudC5cbiIsCisJCQkgIF9fZnVuY19fKSk7CiB9CiAKLXZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspCiB7Ci0gICAgc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKLSAgICB3bGFuX25nX3ByaXNtMl9oZWFkZXIgKnBoOwotICAgIGludCByYXRlX2luZGV4ID0gMDsKLSAgICBVU0hPUlQgaGVhZGVyX2xlbiA9IDA7Ci0gICAgVUNIQVIgdGVtcF9oZWFkZXJbNDBdID0gezB9OworCXN0cnVjdCBza19idWZmICpwT1NQa3Q7CisJc3RydWN0IHJ0X3dsYW5fbmdfcHJpc20yX2hlYWRlciAqcGg7CisJaW50IHJhdGVfaW5kZXggPSAwOworCXUxNiBoZWFkZXJfbGVuID0gMDsKKwl1OCB0ZW1wX2hlYWRlcls0MF0gPSB7IDAgfTsKIAotICAgIHVfaW50MzJfdCByYWxpbmtyYXRlWzI1Nl0gPSB7Miw0LDExLDIyLCAxMiwxOCwyNCwzNiw0OCw3Miw5NiwgIDEwOCwgICAxMDksIDExMCwgMTExLCAxMTIsIDEzLCAyNiwgMzksIDUyLDc4LDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzgsMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIDI3LCA1NCw4MSwxMDgsMTYyLCAyMTYsIDI0MywgMjcwLCAvLyBMYXN0IDM4Ci0JNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwgIDE0LCAyOSwgNDMsIDU3LCA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LDg3LDExNSwgMTczLCAyMzAsMjYwLCAyODgsIDMwLCA2MCw5MCwxMjAsMTgwLDI0MCwyNzAsMzAwLDYwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwLDYwMCwgMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwKLQkxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MH07CisJdV9pbnQzMl90IHJhbGlua3JhdGVbMjU2XSA9IHsgMiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDEzLCAyNiwgMzksIDUyLCA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsIDI3LCA1NCwgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLAkvKiBMYXN0IDM4ICovCisJCTU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIDE0LCAyOSwgNDMsIDU3LCA4NywgMTE1LAorCQkgICAgMTMwLCAxNDQsIDI5LCA1OSwgODcsIDExNSwgMTczLCAyMzAsIDI2MCwgMjg4LCAzMCwgNjAsIDkwLAorCQkgICAgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLAorCQkgICAgNjAwLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwKKwkJMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsCisJCSAgICAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLAorCQkgICAgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwKKwkJICAgIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsCisJCSAgICA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwCisJfTsKIAotCi0gICAgQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKLSAgICBpZiAocFJ4QmxrLT5EYXRhU2l6ZSA8IDEwKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBTaXplIGlzIHRvbyBzbWFsbCEgKCVkKVxuIiwgX19mdW5jX18sIHBSeEJsay0+RGF0YVNpemUpKTsKKwlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOworCWlmIChwUnhCbGstPkRhdGFTaXplIDwgMTApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyA6IFNpemUgaXMgdG9vIHNtYWxsISAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJCSAgcFJ4QmxrLT5EYXRhU2l6ZSkpOwogCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0gICAgfQorCX0KIAotICAgIGlmIChwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgPiBSWF9CVUZGRVJfQUdHUkVTSVpFKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBTaXplIGlzIHRvbyBsYXJnZSEgKCV6dSlcbiIsIF9fZnVuY19fLCBwUnhCbGstPkRhdGFTaXplICsgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpKTsKKwlpZiAocFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSA+CisJICAgIFJYX0JVRkZFUl9BR0dSRVNJWkUpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCIlcyA6IFNpemUgaXMgdG9vIGxhcmdlISAoJXp1KVxuIiwgX19mdW5jX18sCisJCQkgIHBSeEJsay0+RGF0YVNpemUgKyBzaXplb2Yoc3RydWN0IHJ0X3dsYW5fbmdfcHJpc20yX2hlYWRlcikpKTsKIAkJZ290byBlcnJfZnJlZV9za19idWZmOwotICAgIH0KKwl9CiAKLSAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7CisJcE9TUGt0ID0gUlRQS1RfVE9fT1NQS1QocFJ4QmxrLT5wUnhQYWNrZXQpOwogCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgQlNTMCk7Ci0gICAgaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuVHlwZSA9PSBCVFlQRV9EQVRBKQotICAgIHsKLSAgICAgICAgcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOwotICAgICAgICBpZiAoKHBSeEJsay0+cEhlYWRlci0+RkMuVG9EcyA9PSAxKSAmJgotICAgICAgICAgICAgKHBSeEJsay0+cEhlYWRlci0+RkMuRnJEcyA9PSAxKSkKLSAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExX1dJVEhfQUREUjQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhlYWRlcl9sZW4gPSBMRU5HVEhfODAyXzExOworCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgeworCQlwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CisJCWlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCisJCSAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQorCQkJaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKKwkJZWxzZQorCQkJaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7CiAKLSAgICAgICAgLy8gUU9TCi0gICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQotICAgIAl7Ci0gICAgCSAgICBoZWFkZXJfbGVuICs9IDI7Ci0gICAgCQkvLyBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKLSAgICAJCXBSeEJsay0+RGF0YVNpemUgLT0yOwotICAgIAl9Ci0KLSAgICAJLy8gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCi0gICAgCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLk9yZGVyKQotICAgIAl7Ci0gICAgCSAgICBoZWFkZXJfbGVuICs9IDQ7Ci0JCQkvLyBEYXRhIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJLyogUU9TICovCisJCWlmIChwUnhCbGstPnBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSB7CisJCQloZWFkZXJfbGVuICs9IDI7CisJCQkvKiBEYXRhIHNraXAgUU9TIGNvbnRvcmwgZmllbGQgKi8KKwkJCXBSeEJsay0+RGF0YVNpemUgLT0gMjsKKwkJfQorCQkvKiBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysgKi8KKwkJaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuT3JkZXIpIHsKKwkJCWhlYWRlcl9sZW4gKz0gNDsKKwkJCS8qIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZCAqLwogCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA0OwotICAgIAl9CisJCX0KKwkJLyogQ29weSBIZWFkZXIgKi8KKwkJaWYgKGhlYWRlcl9sZW4gPD0gNDApCisJCQlOZGlzTW92ZU1lbW9yeSh0ZW1wX2hlYWRlciwgcFJ4QmxrLT5wRGF0YSwgaGVhZGVyX2xlbik7CiAKLSAgICAgICAgLy8gQ29weSBIZWFkZXIKLSAgICAgICAgaWYgKGhlYWRlcl9sZW4gPD0gNDApCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2hlYWRlciwgcFJ4QmxrLT5wRGF0YSwgaGVhZGVyX2xlbik7Ci0KLSAgICAgICAgLy8gc2tpcCBIVyBwYWRkaW5nCi0gICAgCWlmIChwUnhCbGstPlJ4RC5MMlBBRCkKLSAgICAJICAgIHBSeEJsay0+cERhdGEgKz0gKGhlYWRlcl9sZW4gKyAyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcFJ4QmxrLT5wRGF0YSArPSBoZWFkZXJfbGVuOwotICAgIH0gLy9lbmQgaWYKLQorCQkvKiBza2lwIEhXIHBhZGRpbmcgKi8KKwkJaWYgKHBSeEJsay0+UnhELkwyUEFEKQorCQkJcFJ4QmxrLT5wRGF0YSArPSAoaGVhZGVyX2xlbiArIDIpOworCQllbHNlCisJCQlwUnhCbGstPnBEYXRhICs9IGhlYWRlcl9sZW47CisJfQkJCS8qZW5kIGlmICovCiAKIAlpZiAocFJ4QmxrLT5EYXRhU2l6ZSA8IHBPU1BrdC0+bGVuKSB7Ci0gICAgICAgIHNrYl90cmltKHBPU1BrdCxwUnhCbGstPkRhdGFTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5EYXRhU2l6ZSAtIHBPU1BrdC0+bGVuKSk7Ci0gICAgfSAvL2VuZCBpZgorCQlza2JfdHJpbShwT1NQa3QsIHBSeEJsay0+RGF0YVNpemUpOworCX0gZWxzZSB7CisJCXNrYl9wdXQocE9TUGt0LCAocFJ4QmxrLT5EYXRhU2l6ZSAtIHBPU1BrdC0+bGVuKSk7CisJfQkJCS8qZW5kIGlmICovCiAKLSAgICBpZiAoKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpID4gMCkgewotCSAgICBza2JfcHV0KHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOwotCSAgICBza2JfcHVsbChwT1NQa3QsKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKLSAgICB9IC8vZW5kIGlmCisJaWYgKChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSA+IDApIHsKKwkJc2tiX3B1dChwT1NQa3QsIChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7CisJCXNrYl9wdWxsKHBPU1BrdCwgKHBSeEJsay0+cERhdGEgLSBwT1NQa3QtPmRhdGEpKTsKKwl9CQkJLyplbmQgaWYgKi8KIAotICAgIGlmIChza2JfaGVhZHJvb20ocE9TUGt0KSA8IChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSsgaGVhZGVyX2xlbikpIHsKLSAgICAgICAgaWYgKHBza2JfZXhwYW5kX2hlYWQocE9TUGt0LCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgKyBoZWFkZXJfbGVuKSwgMCwgR0ZQX0FUT01JQykpIHsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogUmVhbGxvY2F0ZSBoZWFkZXIgc2l6ZSBvZiBza19idWZmIGZhaWwhXG4iLCBfX2Z1bmNfXykpOworCWlmIChza2JfaGVhZHJvb20ocE9TUGt0KSA8IChzaXplb2Yoc3RydWN0IHJ0X3dsYW5fbmdfcHJpc20yX2hlYWRlcikgKyBoZWFkZXJfbGVuKSkgeworCQlpZiAocHNrYl9leHBhbmRfaGVhZAorCQkgICAgKHBPU1BrdCwgKHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSArIGhlYWRlcl9sZW4pLCAwLAorCQkgICAgIEdGUF9BVE9NSUMpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlcyA6IFJlYWxsb2NhdGUgaGVhZGVyIHNpemUgb2Ygc2tfYnVmZiBmYWlsIVxuIiwKKwkJCQkgIF9fZnVuY19fKSk7CiAJCQlnb3RvIGVycl9mcmVlX3NrX2J1ZmY7Ci0JICAgIH0gLy9lbmQgaWYKLSAgICB9IC8vZW5kIGlmCisJCX0JCS8qZW5kIGlmICovCisJfQkJCS8qZW5kIGlmICovCiAKLSAgICBpZiAoaGVhZGVyX2xlbiA+IDApCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgaGVhZGVyX2xlbiksIHRlbXBfaGVhZGVyLCBoZWFkZXJfbGVuKTsKKwlpZiAoaGVhZGVyX2xlbiA+IDApCisJCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgaGVhZGVyX2xlbiksIHRlbXBfaGVhZGVyLAorCQkJICAgICAgIGhlYWRlcl9sZW4pOwogCi0gICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOwotCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisJcGggPSAoc3RydWN0IHJ0X3dsYW5fbmdfcHJpc20yX2hlYWRlciAqKXNrYl9wdXNoKHBPU1BrdCwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CisJTmRpc1plcm9NZW1vcnkocGgsIHNpemVvZihzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7CiAKLSAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKLQlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKLQlzdHJjcHkocGgtPmRldm5hbWUsIHBBZC0+bmV0X2Rldi0+bmFtZSk7CisJcGgtPm1zZ2NvZGUgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtOworCXBoLT5tc2dsZW4gPSBzaXplb2Yoc3RydWN0IHJ0X3dsYW5fbmdfcHJpc20yX2hlYWRlcik7CisJc3RyY3B5KChjaGFyICopcGgtPmRldm5hbWUsIChjaGFyICopcEFkLT5uZXRfZGV2LT5uYW1lKTsKIAotICAgIHBoLT5ob3N0dGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lOworCXBoLT5ob3N0dGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lOwogCXBoLT5ob3N0dGltZS5zdGF0dXMgPSAwOwogCXBoLT5ob3N0dGltZS5sZW4gPSA0OwogCXBoLT5ob3N0dGltZS5kYXRhID0gamlmZmllczsKQEAgLTkwOCw2MyArODI4LDcxIEBACiAJcGgtPm1hY3RpbWUubGVuID0gMDsKIAlwaC0+bWFjdGltZS5kYXRhID0gMDsKIAotICAgIHBoLT5pc3R4LmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faXN0eDsKKwlwaC0+aXN0eC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHg7CiAJcGgtPmlzdHguc3RhdHVzID0gMDsKIAlwaC0+aXN0eC5sZW4gPSAwOwogCXBoLT5pc3R4LmRhdGEgPSAwOwogCi0gICAgcGgtPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOworCXBoLT5jaGFubmVsLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbDsKIAlwaC0+Y2hhbm5lbC5zdGF0dXMgPSAwOwogCXBoLT5jaGFubmVsLmxlbiA9IDQ7CiAKLSAgICBwaC0+Y2hhbm5lbC5kYXRhID0gKHVfaW50MzJfdClwQWQtPkNvbW1vbkNmZy5DaGFubmVsOworCXBoLT5jaGFubmVsLmRhdGEgPSAodV9pbnQzMl90KSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwogCi0gICAgcGgtPnJzc2kuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpOworCXBoLT5yc3NpLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcnNzaTsKIAlwaC0+cnNzaS5zdGF0dXMgPSAwOwogCXBoLT5yc3NpLmxlbiA9IDQ7Ci0gICAgcGgtPnJzc2kuZGF0YSA9ICh1X2ludDMyX3QpUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kyLCBSU1NJXzIpKTs7CisJcGgtPnJzc2kuZGF0YSA9CisJICAgICh1X2ludDMyX3QpIFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkgICAgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kwLAorCQkJCQkJICBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwKKwkJCQkJCQkJCSBwUnhCbGstPgorCQkJCQkJCQkJIHBSeFdJLT4KKwkJCQkJCQkJCSBSU1NJMSwKKwkJCQkJCQkJCSBSU1NJXzEpLAorCQkJCSAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTIsCisJCQkJCQkgIFJTU0lfMikpOzsKIAogCXBoLT5zaWduYWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWw7CiAJcGgtPnNpZ25hbC5zdGF0dXMgPSAwOwogCXBoLT5zaWduYWwubGVuID0gNDsKLQlwaC0+c2lnbmFsLmRhdGEgPSAwOyAvL3Jzc2kgKyBub2lzZTsKKwlwaC0+c2lnbmFsLmRhdGEgPSAwOwkvKnJzc2kgKyBub2lzZTsgKi8KIAogCXBoLT5ub2lzZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX25vaXNlOwogCXBoLT5ub2lzZS5zdGF0dXMgPSAwOwogCXBoLT5ub2lzZS5sZW4gPSA0OwogCXBoLT5ub2lzZS5kYXRhID0gMDsKIAotICAgIGlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID49IE1PREVfSFRNSVgpCi0gICAgewotICAgIAlyYXRlX2luZGV4ID0gMTYgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPkJXICoxNikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKjMyKSArICgoVUNIQVIpcFJ4QmxrLT5wUnhXSS0+TUNTKTsKLSAgICB9Ci0gICAgZWxzZQotCWlmIChwUnhCbGstPnBSeFdJLT5QSFlNT0RFID09IE1PREVfT0ZETSkKLSAgICAJcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7Ci0gICAgZWxzZQotICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShwUnhCbGstPnBSeFdJLT5NQ1MpOwotICAgIGlmIChyYXRlX2luZGV4IDwgMCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDA7Ci0gICAgaWYgKHJhdGVfaW5kZXggPiAyNTUpCi0gICAgICAgIHJhdGVfaW5kZXggPSAyNTU7CisJaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPj0gTU9ERV9IVE1JWCkgeworCQlyYXRlX2luZGV4ID0KKwkJICAgIDE2ICsgKCh1OClwUnhCbGstPnBSeFdJLT5CVyAqIDE2KSArCisJCSAgICAoKHU4KXBSeEJsay0+cFJ4V0ktPlNob3J0R0kgKiAzMikgKworCQkgICAgKCh1OClwUnhCbGstPnBSeFdJLT5NQ1MpOworCX0gZWxzZSBpZiAocFJ4QmxrLT5wUnhXSS0+UEhZTU9ERSA9PSBNT0RFX09GRE0pCisJCXJhdGVfaW5kZXggPSAodTgpKHBSeEJsay0+cFJ4V0ktPk1DUykgKyA0OworCWVsc2UKKwkJcmF0ZV9pbmRleCA9ICh1OCkocFJ4QmxrLT5wUnhXSS0+TUNTKTsKKwlpZiAocmF0ZV9pbmRleCA8IDApCisJCXJhdGVfaW5kZXggPSAwOworCWlmIChyYXRlX2luZGV4ID4gMjU1KQorCQlyYXRlX2luZGV4ID0gMjU1OwogCiAJcGgtPnJhdGUuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlOwogCXBoLT5yYXRlLnN0YXR1cyA9IDA7CiAJcGgtPnJhdGUubGVuID0gNDsKLSAgICBwaC0+cmF0ZS5kYXRhID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XTsKKwlwaC0+cmF0ZS5kYXRhID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XTsKIAogCXBoLT5mcm1sZW4uZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9mcm1sZW47Ci0gICAgcGgtPmZybWxlbi5zdGF0dXMgPSAwOworCXBoLT5mcm1sZW4uc3RhdHVzID0gMDsKIAlwaC0+ZnJtbGVuLmxlbiA9IDQ7Ci0JcGgtPmZybWxlbi5kYXRhCT0gKHVfaW50MzJfdClwUnhCbGstPkRhdGFTaXplOworCXBoLT5mcm1sZW4uZGF0YSA9ICh1X2ludDMyX3QpIHBSeEJsay0+RGF0YVNpemU7CiAKKwlwT1NQa3QtPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwlwT1NQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocE9TUGt0LCBwT1NQa3QtPmRldik7CisJcE9TUGt0LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCW5ldGlmX3J4KHBPU1BrdCk7CiAKLSAgICBwT1NQa3QtPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLSAgICBwT1NQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocE9TUGt0LCBwT1NQa3QtPmRldik7Ci0gICAgcE9TUGt0LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotICAgIG5ldGlmX3J4KHBPU1BrdCk7Ci0KLSAgICByZXR1cm47CisJcmV0dXJuOwogCiBlcnJfZnJlZV9za19idWZmOgogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CkBAIC05NzIsMzEgKzkwMCw0NzAgQEAKIAogfQogCi12b2lkIHJ0bXBfb3NfdGhyZWFkX2luaXQoUFVDSEFSIHBUaHJlYWROYW1lLCBQVk9JRCBwTm90aWZ5KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCURldmljZSBJUlEgcmVsYXRlZCBmdW5jdGlvbnMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IFJ0bXBPU0lSUVJlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCiB7Ci0JZGFlbW9uaXplKHBUaHJlYWROYW1lIC8qIiVzIixwQWQtPm5ldF9kZXYtPm5hbWUqLyk7CisjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAorCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcE5ldERldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBwTmV0RGV2KTsKKworCUFTU0VSVChwQWQpOworCisJaWYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSB7CisJCXN0cnVjdCBvc19jb29raWUgKl9wT2JqID0gKHN0cnVjdCBvc19jb29raWUgKikocEFkLT5PU19Db29raWUpOworCQlSVE1QX01TSV9FTkFCTEUocEFkKTsKKwkJcmV0dmFsID0KKwkJICAgIHJlcXVlc3RfaXJxKF9wT2JqLT5wY2lfZGV2LT5pcnEsIHJ0Mjg2MF9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCShuZXRfZGV2KS0+bmFtZSwgKG5ldF9kZXYpKTsKKwkJaWYgKHJldHZhbCAhPSAwKQorCQkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IFJ0bXBPU0lSUVJlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwTmV0RGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJQVNTRVJUKHBBZCk7CisKKyNpZmRlZiBSVE1QX1BDSV9TVVBQT1JUCisJaWYgKHBBZC0+aW5mVHlwZSA9PSBSVE1QX0RFVl9JTkZfUENJKSB7CisJCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKShwQWQtPk9TX0Nvb2tpZSk7CisJCXN5bmNocm9uaXplX2lycShwT2JqLT5wY2lfZGV2LT5pcnEpOworCQlmcmVlX2lycShwT2JqLT5wY2lfZGV2LT5pcnEsIChuZXRfZGV2KSk7CisJCVJUTVBfTVNJX0RJU0FCTEUocEFkKTsKKwl9CisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlGaWxlIG9wZW4vY2xvc2UgcmVsYXRlZCBmdW5jdGlvbnMuCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGZpbGUgKlJ0bXBPU0ZpbGVPcGVuKGNoYXIgKnBQYXRoLCBpbnQgZmxhZywgaW50IG1vZGUpCit7CisJc3RydWN0IGZpbGUgKmZpbGVQdHI7CisKKwlmaWxlUHRyID0gZmlscF9vcGVuKHBQYXRoLCBmbGFnLCAwKTsKKwlpZiAoSVNfRVJSKGZpbGVQdHIpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiJXMoKTogRXJyb3IgJWxkIG9wZW5pbmcgJXNcbiIsIF9fZnVuY19fLAorCQkJICAtUFRSX0VSUihmaWxlUHRyKSwgcFBhdGgpKTsKKwl9CisKKwlyZXR1cm4gKHN0cnVjdCBmaWxlICopZmlsZVB0cjsKK30KKworaW50IFJ0bXBPU0ZpbGVDbG9zZShzdHJ1Y3QgZmlsZSAqb3NmZCkKK3sKKwlmaWxwX2Nsb3NlKG9zZmQsIE5VTEwpOworCXJldHVybiAwOworfQorCit2b2lkIFJ0bXBPU0ZpbGVTZWVrKHN0cnVjdCBmaWxlICpvc2ZkLCBpbnQgb2Zmc2V0KQoreworCW9zZmQtPmZfcG9zID0gb2Zmc2V0OworfQorCitpbnQgUnRtcE9TRmlsZVJlYWQoc3RydWN0IGZpbGUgKm9zZmQsIGNoYXIgKnBEYXRhUHRyLCBpbnQgcmVhZExlbikKK3sKKwkvKiBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kICovCisJaWYgKG9zZmQtPmZfb3AgJiYgb3NmZC0+Zl9vcC0+cmVhZCkgeworCQlyZXR1cm4gb3NmZC0+Zl9vcC0+cmVhZChvc2ZkLCBwRGF0YVB0ciwgcmVhZExlbiwgJm9zZmQtPmZfcG9zKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJubyBmaWxlIHJlYWQgbWV0aG9kXG4iKSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK2ludCBSdG1wT1NGaWxlV3JpdGUoc3RydWN0IGZpbGUgKm9zZmQsIGNoYXIgKnBEYXRhUHRyLCBpbnQgd3JpdGVMZW4pCit7CisJcmV0dXJuIG9zZmQtPmZfb3AtPndyaXRlKG9zZmQsIHBEYXRhUHRyLCAoc2l6ZV90KSB3cml0ZUxlbiwKKwkJCQkgJm9zZmQtPmZfcG9zKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRhc2sgY3JlYXRlL21hbmFnZW1lbnQva2lsbCByZWxhdGVkIGZ1bmN0aW9ucy4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgUnRtcE9TVGFza0tpbGwoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2spCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCWludCByZXQgPSBORElTX1NUQVRVU19GQUlMVVJFOworCisJcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilwVGFzay0+cHJpdjsKKworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCWlmIChwVGFzay0+a3RocmVhZF90YXNrKSB7CisJCWt0aHJlYWRfc3RvcChwVGFzay0+a3RocmVhZF90YXNrKTsKKwkJcmV0ID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9CisjZWxzZQorCUNIRUNLX1BJRF9MRUdBTElUWShwVGFzay0+dGFza1BJRCkgeworCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgdGFzayglcykgd2l0aCBwaWQoJWQpIVxuIiwKKwkJICAgICAgIHBUYXNrLT50YXNrTmFtZSwgR0VUX1BJRF9OVU1CRVIocFRhc2stPnRhc2tQSUQpKTsKKwkJbWIoKTsKKwkJcFRhc2stPnRhc2tfa2lsbGVkID0gMTsKKwkJbWIoKTsKKwkJcmV0ID0gS0lMTF9USFJFQURfUElEKHBUYXNrLT50YXNrUElELCBTSUdURVJNLCAxKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJraWxsIHRhc2soJXMpIHdpdGggcGlkKCVkKSBmYWlsZWQocmV0VmFsPSVkKSFcbiIsCisJCQkgICAgICAgcFRhc2stPnRhc2tOYW1lLCBHRVRfUElEX05VTUJFUihwVGFzay0+dGFza1BJRCksCisJCQkgICAgICAgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBUYXNrLT50YXNrQ29tcGxldGUpOworCQkJcFRhc2stPnRhc2tQSUQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7CisJCQlwVGFzay0+dGFza19raWxsZWQgPSAwOworCQkJcmV0ID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgUnRtcE9TVGFza05vdGlmeVRvRXhpdChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaykKK3sKKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwljb21wbGV0ZV9hbmRfZXhpdCgmcFRhc2stPnRhc2tDb21wbGV0ZSwgMCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCit2b2lkIFJ0bXBPU1Rhc2tDdXN0b21pemUoc3RydWN0IHJ0X3J0bXBfb3NfdGFzayAqcFRhc2spCit7CisKKyNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCisKKwlkYWVtb25pemUoKGNoYXIgKikmIHBUYXNrLT50YXNrTmFtZVswXSAvKiIlcyIscEFkLT5uZXRfZGV2LT5uYW1lICovICk7CiAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCiAJLyogc2lnbmFsIHRoYXQgd2UndmUgc3RhcnRlZCB0aGUgdGhyZWFkICovCi0JY29tcGxldGUocE5vdGlmeSk7CisJY29tcGxldGUoJnBUYXNrLT50YXNrQ29tcGxldGUpOworCisjZW5kaWYKIH0KIAotdm9pZCBSVE1QX0luZGljYXRlTWVkaWFTdGF0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK2ludCBSdG1wT1NUYXNrQXR0YWNoKHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrLAorCQkJICAgICBJTiBpbnQgKCpmbikgKHZvaWQgKiksIElOIHZvaWQgKmFyZykKIHsKLQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JewotCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpCi0JCXsKLQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOworCWludCBzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJcFRhc2stPnRhc2tfa2lsbGVkID0gMDsKKwlwVGFzay0+a3RocmVhZF90YXNrID0gTlVMTDsKKwlwVGFzay0+a3RocmVhZF90YXNrID0ga3RocmVhZF9ydW4oZm4sIGFyZywgcFRhc2stPnRhc2tOYW1lKTsKKwlpZiAoSVNfRVJSKHBUYXNrLT5rdGhyZWFkX3Rhc2spKQorCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworI2Vsc2UKKwlwaWRfbnVtYmVyID0ga2VybmVsX3RocmVhZChmbiwgYXJnLCBSVE1QX09TX01HTVRfVEFTS19GTEFHUyk7CisJaWYgKHBpZF9udW1iZXIgPCAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiQXR0YWNoIHRhc2soJXMpIGZhaWxlZCFcbiIsIHBUYXNrLT50YXNrTmFtZSkpOworCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCX0gZWxzZSB7CisJCXBUYXNrLT50YXNrUElEID0gR0VUX1BJRChwaWRfbnVtYmVyKTsKKworCQkvKiBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0ICovCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBUYXNrLT50YXNrQ29tcGxldGUpOworCQlzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCX0KKyNlbmRpZgorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBSdG1wT1NUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaywKKwkJCSAgIGNoYXIgKnBUYXNrTmFtZSwgdm9pZCAqIHBQcml2KQoreworCWludCBsZW47CisKKwlBU1NFUlQocFRhc2spOworCisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCU5kaXNaZXJvTWVtb3J5KCh1OCAqKShwVGFzayksIHNpemVvZihzdHJ1Y3QgcnRfcnRtcF9vc190YXNrKSk7CisjZW5kaWYKKworCWxlbiA9IHN0cmxlbihwVGFza05hbWUpOworCWxlbiA9CisJICAgIGxlbiA+CisJICAgIChSVE1QX09TX1RBU0tfTkFNRV9MRU4gLSAxKSA/IChSVE1QX09TX1RBU0tfTkFNRV9MRU4gLSAxKSA6IGxlbjsKKwlOZGlzTW92ZU1lbW9yeSgmcFRhc2stPnRhc2tOYW1lWzBdLCBwVGFza05hbWUsIGxlbik7CisJcFRhc2stPnByaXYgPSBwUHJpdjsKKworI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlSVE1QX1NFTV9FVkVOVF9JTklUX0xPQ0tFRCgmKHBUYXNrLT50YXNrU2VtYSkpOworCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCisJaW5pdF9jb21wbGV0aW9uKCZwVGFzay0+dGFza0NvbXBsZXRlKTsKKyNlbmRpZgorCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQlpZiAocEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPT0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQpIHsKKwkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CisJCX0gZWxzZSB7CisJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CiAJCX0KIAl9CiB9CiAKK2ludCBSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTMyIGV2ZW50VHlwZSwKKwkJCSAgICBpbnQgZmxhZ3MsCisJCQkgICAgdTggKnBTcmNNYWMsCisJCQkgICAgdTggKnBEYXRhLCB1MzIgZGF0YUxlbikKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisKKwlpZiAoZmxhZ3MgPiAtMSkKKwkJd3JxdS5kYXRhLmZsYWdzID0gZmxhZ3M7CisKKwlpZiAocFNyY01hYykKKwkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwU3JjTWFjLCBNQUNfQUREUl9MRU4pOworCisJaWYgKChwRGF0YSAhPSBOVUxMKSAmJiAoZGF0YUxlbiA+IDApKQorCQl3cnF1LmRhdGEubGVuZ3RoID0gZGF0YUxlbjsKKworCXdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBldmVudFR5cGUsICZ3cnF1LCAoY2hhciAqKXBEYXRhKTsKKwlyZXR1cm4gMDsKK30KKworaW50IFJ0bXBPU05ldERldkFkZHJTZXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYsIHU4ICpwTWFjQWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisKKwluZXRfZGV2ID0gcE5ldERldjsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJLyogd29yay1hcm91bmQgZm9yIHRoZSBTdVNFIGR1ZSB0byBpdCBoYXMgaXQncyBvd24gaW50ZXJmYWNlIG5hbWUgbWFuYWdlbWVudCBzeXN0ZW0uICovCisJeworCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgbmV0X2Rldi0+bmFtZSwKKwkJCSAgICAgICBzdHJsZW4obmV0X2Rldi0+bmFtZSkpOworCX0KKworCU5kaXNNb3ZlTWVtb3J5KG5ldF9kZXYtPmRldl9hZGRyLCBwTWFjQWRkciwgNik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgKglBc3NpZ24gdGhlIG5ldHdvcmsgZGV2IG5hbWUgZm9yIGNyZWF0ZWQgUmFsaW5rIFdpRmkgaW50ZXJmYWNlLgorICAqLworc3RhdGljIGludCBSdG1wT1NOZXREZXZSZXF1ZXN0TmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBjaGFyICpwUHJlZml4U3RyLCBpbnQgZGV2SWR4KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpleGlzdE5ldERldjsKKwljaGFyIHN1ZmZpeE5hbWVbSUZOQU1TSVpdOworCWNoYXIgZGVzaXJlZE5hbWVbSUZOQU1TSVpdOworCWludCBpZk5hbWVJZHgsIHByZWZpeExlbiwgc2xvdE5hbWVMZW47CisJaW50IFN0YXR1czsKKworCXByZWZpeExlbiA9IHN0cmxlbihwUHJlZml4U3RyKTsKKwlBU1NFUlQoKHByZWZpeExlbiA8IElGTkFNU0laKSk7CisKKwlmb3IgKGlmTmFtZUlkeCA9IGRldklkeDsgaWZOYW1lSWR4IDwgMzI7IGlmTmFtZUlkeCsrKSB7CisJCW1lbXNldChzdWZmaXhOYW1lLCAwLCBJRk5BTVNJWik7CisJCW1lbXNldChkZXNpcmVkTmFtZSwgMCwgSUZOQU1TSVopOworCQlzdHJuY3B5KCZkZXNpcmVkTmFtZVswXSwgcFByZWZpeFN0ciwgcHJlZml4TGVuKTsKKworCQlzcHJpbnRmKHN1ZmZpeE5hbWUsICIlZCIsIGlmTmFtZUlkeCk7CisKKwkJc2xvdE5hbWVMZW4gPSBzdHJsZW4oc3VmZml4TmFtZSk7CisJCUFTU0VSVCgoKHNsb3ROYW1lTGVuICsgcHJlZml4TGVuKSA8IElGTkFNU0laKSk7CisJCXN0cmNhdChkZXNpcmVkTmFtZSwgc3VmZml4TmFtZSk7CisKKwkJZXhpc3ROZXREZXYgPSBSdG1wT1NOZXREZXZHZXRCeU5hbWUoZGV2LCAmZGVzaXJlZE5hbWVbMF0pOworCQlpZiAoZXhpc3ROZXREZXYgPT0gTlVMTCkKKwkJCWJyZWFrOworCQllbHNlCisJCQlSdG1wT1NOZXREZXZpY2VSZWZQdXQoZXhpc3ROZXREZXYpOworCX0KKworCWlmIChpZk5hbWVJZHggPCAzMikgeworCQlzdHJjcHkoJmRldi0+bmFtZVswXSwgJmRlc2lyZWROYW1lWzBdKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIkNhbm5vdCByZXF1ZXN0IERldk5hbWUgd2l0aCBwcmVpZngoJXMpIGFuZCBpbiByYW5nZSgwfjMyKSBhcyBzdWZmaXggZnJvbSBPUyFcbiIsCisJCQkgIHBQcmVmaXhTdHIpKTsKKwkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gU3RhdHVzOworfQorCit2b2lkIFJ0bXBPU05ldERldkNsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KQoreworCWRldl9jbG9zZShwTmV0RGV2KTsKK30KKwordm9pZCBSdG1wT1NOZXREZXZGcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KQoreworCUFTU0VSVChwTmV0RGV2KTsKKworCWZyZWVfbmV0ZGV2KHBOZXREZXYpOworfQorCitpbnQgUnRtcE9TTmV0RGV2QWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKiogbmV3X2Rldl9wLCB1MzIgcHJpdkRhdGFTaXplKQoreworCS8qIGFzc2lnbiBpdCBhcyBudWxsIGZpcnN0LiAqLworCSpuZXdfZGV2X3AgPSBOVUxMOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFsbG9jYXRlIGEgbmV0IGRldmljZSB3aXRoIHByaXZhdGUgZGF0YSBzaXplPSVkIVxuIiwKKwkJICBwcml2RGF0YVNpemUpKTsKKwkqbmV3X2Rldl9wID0gYWxsb2NfZXRoZXJkZXYocHJpdkRhdGFTaXplKTsKKwlpZiAoKm5ld19kZXZfcCkKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJZWxzZQorCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBPU05ldERldkdldEJ5TmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwgY2hhciAqcERldk5hbWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBUYXJnZXROZXREZXYgPSBOVUxMOworCisJcFRhcmdldE5ldERldiA9IGRldl9nZXRfYnlfbmFtZShkZXZfbmV0KHBOZXREZXYpLCBwRGV2TmFtZSk7CisKKwlyZXR1cm4gcFRhcmdldE5ldERldjsKK30KKwordm9pZCBSdG1wT1NOZXREZXZpY2VSZWZQdXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpCit7CisJLyoKKwkgICBldmVyeSB0aW1lIGRldl9nZXRfYnlfbmFtZSBpcyBjYWxsZWQsIGFuZCBpdCBoYXMgcmV0dXJuZWQgYSB2YWxpZCBzdHJ1Y3QKKwkgICBuZXRfZGV2aWNlKiwgZGV2X3B1dCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyd2FyZHMsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZQorCSAgIG1hY2hpbmUgaGFuZ3Mgd2hlbiB0aGUgZGV2aWNlIGlzIHVucmVnaXN0ZXJlZCAoc2luY2UgZGV2LT5yZWZjbnQgPiAxKS4KKwkgKi8KKwlpZiAocE5ldERldikKKwkJZGV2X3B1dChwTmV0RGV2KTsKK30KKworaW50IFJ0bXBPU05ldERldkRlc3Rvcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKK3sKKworCS8qIFRPRE86IE5lZWQgdG8gZml4IHRoaXMgKi8KKwlwcmludGsoIldBUk5JTkc6IFRoaXMgZnVuY3Rpb24oJXMpIG5vdCBpbXBsZW1lbnQgeWV0IVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworfQorCit2b2lkIFJ0bXBPU05ldERldkRldGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldikKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihwTmV0RGV2KTsKK30KKworaW50IFJ0bXBPU05ldERldkF0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiwKKwkJICAgICAgIHN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rICpwRGV2T3BIb29rKQoreworCWludCByZXQsIHJ0bmxfbG9ja2VkID0gRkFMU0U7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSdG1wT1NOZXREZXZBdHRhY2goKS0tLT5cbiIpKTsKKwkvKiBJZiB3ZSBuZWVkIGhvb2sgc29tZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgbmV0IGRldmljZSBzdHJ1Y3RydWUsIG5vdyBkbyBpdC4gKi8KKwlpZiAocERldk9wSG9vaykgeworCQlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCisJCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgcE5ldERldik7CisKKwkJcE5ldERldi0+bmV0ZGV2X29wcyA9IHBEZXZPcEhvb2stPm5ldGRldl9vcHM7CisKKwkJLyogT1Mgc3BlY2lmaWMgZmxhZ3MsIGhlcmUgd2UgdXNlZCB0byBpbmRpY2F0ZSBpZiB3ZSBhcmUgdmlydHVhbCBpbnRlcmZhY2UgKi8KKwkJcE5ldERldi0+cHJpdl9mbGFncyA9IHBEZXZPcEhvb2stPnByaXZfZmxhZ3M7CisKKwkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJCXBOZXREZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKwkJfQorCisJCS8qIGNvcHkgdGhlIG5ldCBkZXZpY2UgbWFjIGFkZHJlc3MgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLiAqLworCQlOZGlzTW92ZU1lbW9yeShwTmV0RGV2LT5kZXZfYWRkciwgJnBEZXZPcEhvb2stPmRldkFkZHJbMF0sCisJCQkgICAgICAgTUFDX0FERFJfTEVOKTsKKworCQlydG5sX2xvY2tlZCA9IHBEZXZPcEhvb2stPm5lZWRQcm90Y3RlZDsKKwl9CisKKwlpZiAocnRubF9sb2NrZWQpCisJCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZShwTmV0RGV2KTsKKwllbHNlCisJCXJldCA9IHJlZ2lzdGVyX25ldGRldihwTmV0RGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SdG1wT1NOZXREZXZBdHRhY2goKSwgcmV0PSVkXG4iLCByZXQpKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworCWVsc2UKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICpSdG1wT1NOZXREZXZDcmVhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIGludCBkZXZUeXBlLAorCQkJICAgIGludCBkZXZOdW0sCisJCQkgICAgaW50IHByaXZNZW1TaXplLCBjaGFyICpwTmFtZVByZWZpeCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldiA9IE5VTEw7CisJaW50IHN0YXR1czsKKworCS8qIGFsbG9jYXRlIGEgbmV3IG5ldHdvcmsgZGV2aWNlICovCisJc3RhdHVzID0gUnRtcE9TTmV0RGV2QWxsb2MoJnBOZXREZXYsIDAgLypwcml2TWVtU2l6ZSAqLyApOworCWlmIChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkvKiBhbGxvY2F0aW9uIGZhaWwsIGV4aXQgKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBmYWlsICglcykuLi5cbiIsCisJCQkgIHBOYW1lUHJlZml4KSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGZpbmQgYSBhdmFpbGFibGUgaW50ZXJmYWNlIG5hbWUsIG1heCAzMiBpbnRlcmZhY2VzICovCisJc3RhdHVzID0gUnRtcE9TTmV0RGV2UmVxdWVzdE5hbWUocEFkLCBwTmV0RGV2LCBwTmFtZVByZWZpeCwgZGV2TnVtKTsKKwlpZiAoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJLyogZXJyb3IhIG5vIGFueSBhdmFpbGFibGUgcmEgbmFtZSBjYW4gYmUgdXNlZCEgKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJBc3NpZ24gaW50ZXJmYWNlIG5hbWUgKCVzIHdpdGggc3VmZml4IDB+MzIpIGZhaWxlZC4uLlxuIiwKKwkJCSAgcE5hbWVQcmVmaXgpKTsKKwkJUnRtcE9TTmV0RGV2RnJlZShwTmV0RGV2KTsKKworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlRoZSBuYW1lIG9mIHRoZSBuZXcgJXMgaW50ZXJmYWNlIGlzICVzLi4uXG4iLAorCQkJICBwTmFtZVByZWZpeCwgcE5ldERldi0+bmFtZSkpOworCX0KKworCXJldHVybiBwTmV0RGV2OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9saW51eC5oCmluZGV4IGU4ZDY0YzMuLmY4NTUwOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X2xpbnV4LmgKQEAgLTIzLDI3ICsyMywyMiBAQAogICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgUHJvZ3JhbTogICAgcnRfbGludXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQ3JlYXRlZDogICAgNC8yMS8yMDA2IDE6MTc6MzggUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQXV0aG9yOiAgICAgV3UgWGktS3VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQ29tbWVudHM6ICAgYGRlc2NyaXB0aW9uYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFJldmlzaW9uIDEuMSA0LzIxLzIwMDYgMToxNzozOCBQTSAgeHNpa3VuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEluaXRpYWwgcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBNb2R1bGUgTmFtZToKKwlydF9saW51eC5oCiAKLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKKyAgICBBYnN0cmFjdDoKKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAorICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYgX19SVF9MSU5VWF9IX18KKyNkZWZpbmUgX19SVF9MSU5VWF9IX18KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC02NSw2NCArNjAsNTcgQEAKIAogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLS8vIGxvYWQgZmlybXdhcmUKKy8qIGxvYWQgZmlybXdhcmUgKi8KICNkZWZpbmUgX19LRVJORUxfU1lTQ0FMTFNfXwogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgkvKiBmb3IgZ2V0X3VuYWxpZ25lZCgpICovCiAKKyNkZWZpbmUgS1RIUkVBRF9TVVBQT1JUIDEKKy8qIFJUMjg3MCAyLjEuMC4wIGhhcyBpdCBkaXNhYmxlZCAqLwogCi0jZGVmaW5lIE1FTV9BTExPQ19GTEFHICAgICAgKEdGUF9BVE9NSUMpIC8vKEdGUF9ETUEgfCBHRlBfQVRPTUlDKQorI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNlbmRpZiAvKiBLVEhSRUFEX1NVUFBPUlQgLy8gKi8KIAotI2lmbmRlZiBJRk5BTVNJWgotI2RlZmluZSBJRk5BTVNJWiAxNgotI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVByb2ZpbGUgcmVsYXRlZCBzZWN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vLyNkZWZpbmUgQ09ORklHX0NLSVBfU1VQUE9SVAorI2lmZGVmIFJUTVBfTUFDX1BDSQorI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMi4xLjAuMCIKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKyNkZWZpbmUgU1RBX0RSSVZFUl9WRVJTSU9OCQkJIjIuMS4wLjAiCisvKiBSVDMwNzAgdmVyc2lvbjogMi4xLjEuMCAqLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCitleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglDb21waWxlciByZWxhdGVkIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjdW5kZWYgX19pbmxpbmUKICNkZWZpbmUgX19pbmxpbmUJICAgc3RhdGljIGlubGluZQorI2RlZmluZSBJTgorI2RlZmluZSBPVVQKKyNkZWZpbmUgSU5PVVQKIAotdHlwZWRlZiBpbnQgKCpIQVJEX1NUQVJUX1hNSVRfRlVOQykoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBTcGVjaWZpYyBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGludCAoKkhBUkRfU1RBUlRfWE1JVF9GVU5DKSAoc3RydWN0IHNrX2J1ZmYgKiBza2IsCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYpOwogCi0vLyBhZGQgYnkga2F0aHkKLQotLyogb3JkZXIgb2YgImlmIGRlZmluZWQoKSIgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGZvciAzMDcwIGRyaXZlcgotICAgYm90aCBSVDI4NzAgYW5kIFJUMzA3MCBhcmUgZGVmaW5lZCAqLwotI2lmIGRlZmluZWQoUlQyODYwKQotICNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuZGF0IgotICNkZWZpbmUgU1RBX1JUTVBfRklSTVdBUkVfRklMRV9OQU1FICIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEEuYmluIgotICNkZWZpbmUgU1RBX05JQ19ERVZJQ0VfTkFNRQkJCSJSVDI4NjBTVEEiCi0gI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMS44LjEuMSIKLSNlbGlmIGRlZmluZWQoUlQzMDcwKQotICNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMzA3MFNUQS9SVDMwNzBTVEEuZGF0IgotICNkZWZpbmUgU1RBX1JUMjg3MF9JTUFHRV9GSUxFX05BTUUgICIvZXRjL1dpcmVsZXNzL1JUMzA3MFNUQS9ydDI4NzAuYmluIgotICNkZWZpbmUgU1RBX05JQ19ERVZJQ0VfTkFNRQkJCSJSVDMwNzBTVEEiCi0gI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMi4wLjEuMCIKLSNlbGlmIGRlZmluZWQoUlQyODcwKQotICNkZWZpbmUgU1RBX1BST0ZJTEVfUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9SVDI4NzBTVEEuZGF0IgotICNkZWZpbmUgU1RBX1JUMjg3MF9JTUFHRV9GSUxFX05BTUUgICIvZXRjL1dpcmVsZXNzL1JUMjg3MFNUQS9ydDI4NzAuYmluIgotICNkZWZpbmUgU1RBX05JQ19ERVZJQ0VfTkFNRQkJCSJSVDI4NzBTVEEiCi0gI2RlZmluZSBTVEFfRFJJVkVSX1ZFUlNJT04JCQkiMS40LjAuMCIKLSNlbmRpZgotCi0jaWZkZWYgUlQyODYwCisjaWZkZWYgUlRNUF9NQUNfUENJCiAjaWZuZGVmIFBDSV9ERVZJQ0UKICNkZWZpbmUgUENJX0RFVklDRSh2ZW5kLGRldikgXAogCS52ZW5kb3IgPSAodmVuZCksIC5kZXZpY2UgPSAoZGV2KSwgXAogCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gUENJX0FOWV9JRAotI2VuZGlmIC8vIFBDSV9ERVZJQ0UgLy8KLSNlbmRpZgotCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUihhLGIpCQlcCi0JKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCi0JIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCi0JICgobG9uZykoYikgLSAobG9uZykoYSkgPCAwKSkKLQotI2RlZmluZSBSVE1QX1RJTUVfQUZURVJfRVEoYSxiKQlcCi0JKHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZylhKSAmJiBcCi0JIHR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCAodW5zaWduZWQgbG9uZyliKSAmJiBcCi0JICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCi0jZGVmaW5lIFJUTVBfVElNRV9CRUZPUkUoYSxiKQlSVE1QX1RJTUVfQUZURVJfRVEoYixhKQorI2VuZGlmIC8qIFBDSV9ERVZJQ0UgLy8gKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAogI2RlZmluZSBSVF9NT0RfSU5DX1VTRV9DT1VOVCgpIFwKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgXApAQCAtMTMzLDI2OCArMTIxLDEwNSBAQAogCiAjZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAKLSNkZWZpbmUgT1NfSFoJCQlIWgorI2RlZmluZSBSVE1QX0lOQ19SRUYoX0EpCQkwCisjZGVmaW5lIFJUTVBfREVDX1JFRihfQSkJCTAKKyNkZWZpbmUgUlRNUF9HRVRfUkVGKF9BKQkJMAorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MgKi8KK3N0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglOZXR3b3JrIHJlbGF0ZWQgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgSUZOQU1TSVoKKyNkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgogCiAjZGVmaW5lIEVUSF9MRU5HVEhfT0ZfQUREUkVTUwk2CiAKLSNkZWZpbmUgSU4KLSNkZWZpbmUgT1VUCi0KLSNkZWZpbmUgTkRJU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVAogI2RlZmluZSBORElTX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBORElTX1NUQVRVU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBORElTX1NUQVRVU19JTlZBTElEX0RBVEEJCQkJMHgwMgogI2RlZmluZSBORElTX1NUQVRVU19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgMHgwMwogCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9BSUQJCQkweDAwCQkvLzB4MDB+MHgzZgotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lECQkweDAwCQkvLzB4MDAsMHgxMCwweDIwLDB4MzAKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX1dEUwkJCTB4MTAJCS8vMHg0MCwweDUwLDB4NjAsMHg3MAorI2RlZmluZSBORElTX1NFVF9QQUNLRVRfU1RBVFVTKF9wLCBfc3RhdHVzKQkJCWRve30gd2hpbGUoMCkKKyNkZWZpbmUgTmRpc1dyaXRlRXJyb3JMb2dFbnRyeShfYSwgX2IsIF9jLCBfZCkJCWRve30gd2hpbGUoMCkKKworLyogc3RhdGlzdGljcyBjb3VudGVyICovCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9QQUNLRVRTKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9QQUNLRVRTKF9wQWQsIF9kZXYpCisKKyNkZWZpbmUgU1RBVFNfSU5DX1JYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9FUlJPUlMoX3BBZCwgX2RldikKKyNkZWZpbmUgU1RBVFNfSU5DX1RYX0VSUk9SUyhfcEFkLCBfZGV2KQorCisjZGVmaW5lIFNUQVRTX0lOQ19SWF9EUk9QUEVEKF9wQWQsIF9kZXYpCisjZGVmaW5lIFNUQVRTX0lOQ19UWF9EUk9QUEVEKF9wQWQsIF9kZXYpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJUmFsaW5rIFNwZWNpZmljIG5ldHdvcmsgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQUlECQkJMHgwMAkvKjB4MDB+MHgzZiAqLworI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfTUJTU0lECQkweDAwCS8qMHgwMCwweDEwLDB4MjAsMHgzMCAqLworI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfV0RTCQkJMHgxMAkvKjB4NDAsMHg1MCwweDYwLDB4NzAgKi8KICNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJCQkweDIwCiAjZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNICQkJMHgzMAogI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfRExTCQkJMHg0MAorI2RlZmluZSBORVRfREVWSUNFX1JFQUxfSURYX01BU0sJCTB4MGYJLyogZm9yIGVhY2ggb3BlcmF0aW9uIG1vZGUsIHdlIG1heGltdW0gc3VwcG9ydCAxNSBlbnRpdGllcy4gKi8KIAogI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkwCiAjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCQkxCiAjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkyCiAjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAkzCisjZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMJNAogCi1zdHJ1Y3Qgb3NfbG9jayAgewotCXNwaW5sb2NrX3QJCWxvY2s7Ci0JdW5zaWduZWQgbG9uZyAgCWZsYWdzOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBzaWduYWxpbmcgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIGZpbGUgb3BlcmF0aW9uIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBydF9ydG1wX29zX2ZzX2luZm8geworCWludCBmc3VpZDsKKwlpbnQgZnNnaWQ7CisJbW1fc2VnbWVudF90IGZzOwogfTsKIAorI2RlZmluZSBJU19GSUxFX09QRU5fRVJSKF9mZCkJSVNfRVJSKChfZmQpKQogCi1zdHJ1Y3Qgb3NfY29va2llIHsKLSNpZmRlZiBSVDI4NjAKLQlzdHJ1Y3QgcGNpX2RldiAJCQkqcGNpX2RldjsKLQlzdHJ1Y3QgcGNpX2RldiAJCQkqcGFyZW50X3BjaV9kZXY7Ci0JZG1hX2FkZHJfdAkJICAJCXBBZF9wYTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCXN0cnVjdCB1c2JfZGV2aWNlCQkqcFVzYl9EZXY7Ci0KLQlzdHJ1Y3QgcGlkCSpNTE1FVGhyX3BpZDsKLQlzdHJ1Y3QgcGlkCSpSVFVTQkNtZFRocl9waWQ7Ci0Jc3RydWN0IHBpZAkqVGltZXJRVGhyX3BpZDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJcnhfZG9uZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJbWdtdF9kbWFfZG9uZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMwX2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAlhYzFfZG1hX2RvbmVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgCWFjMl9kbWFfZG9uZV90YXNrOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAJYWMzX2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IAloY2NhX2RtYV9kb25lX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXRidHRfdGFzazsKLSNpZmRlZiBSVDI4NjAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CW51bGxfZnJhbWVfY29tcGxldGVfdGFzazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0JdW5zaWduZWQgbG9uZwkJCWFwZF9waWQ7IC8vODAyLjF4IGRhZW1vbiBwaWQKLQlJTlQJCQkJCQlpb2N0bF9pZl90eXBlOwotCUlOVCAJCQkJCWlvY3RsX2lmOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBzZW1hcGhvcmUgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBvc19sb2NrIHsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIH07CiAKLSN1bmRlZiAgQVNTRVJUCi0jZGVmaW5lIEFTU0VSVCh4KQotCi10eXBlZGVmIHN0cnVjdCBvc19jb29raWUJKiBQT1NfQ09PS0lFOwotdHlwZWRlZiBzdHJ1Y3QgcGNpX2RldiAJCSogUFBDSV9ERVY7Ci10eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlCSogUE5FVF9ERVY7Ci10eXBlZGVmIHZvaWQJCQkJKiBQTkRJU19QQUNLRVQ7Ci10eXBlZGVmIGNoYXIJCQkJTkRJU19QQUNLRVQ7Ci10eXBlZGVmIFBORElTX1BBQ0tFVAkJKiBQUE5ESVNfUEFDS0VUOwotdHlwZWRlZglkbWFfYWRkcl90CQkJTkRJU19QSFlTSUNBTF9BRERSRVNTOwotdHlwZWRlZglkbWFfYWRkcl90CQkJKiBQTkRJU19QSFlTSUNBTF9BRERSRVNTOwotdHlwZWRlZiBzcGlubG9ja190CQkJTkRJU19TUElOX0xPQ0s7Ci10eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CU5ESVNfTUlOSVBPUlRfVElNRVI7Ci10eXBlZGVmIHZvaWQJCQkJKiBORElTX0hBTkRMRTsKLXR5cGVkZWYgY2hhciAJCQkJKiBQTkRJU19CVUZGRVI7Ci0KLQotCi12b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKTsKLQotZG1hX2FkZHJfdCBsaW51eF9wY2lfbWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pOwotdm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pOwotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE1PVkUgVE8gcnRtcC5oID8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0jZGVmaW5lIFBLVFNSQ19ORElTICAgICAgICAgICAgIDB4N2YKLSNkZWZpbmUgUEtUU1JDX0RSSVZFUiAgICAgICAgICAgMHgwZgotI2RlZmluZSBQUklOVF9NQUMoYWRkcikJXAotCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0KLQotCi0jZGVmaW5lIFJUMjg2MF9QQ0lfREVWSUNFX0lECQkweDA2MDEKLQotI2lmZGVmIFJUMjg2MAotI2RlZmluZSBQQ0lfTUFQX1NJTkdMRShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikgXAotCWxpbnV4X3BjaV9tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfc2RfaWR4LCBfZGlyKQotCi0jZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpIFwKLQlsaW51eF9wY2lfdW5tYXBfc2luZ2xlKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQotCi0jZGVmaW5lIFBDSV9BTExPQ19DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikgXAotCXBjaV9hbGxvY19jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3B0cikKLQotI2RlZmluZSBQQ0lfRlJFRV9DT05TSVNURU5UKF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpIFwKLQlwY2lfZnJlZV9jb25zaXN0ZW50KF9wY2lfZGV2LCBfc2l6ZSwgX3ZpcnR1YWxfYWRkciwgX3BoeXNpY2FsX2FkZHIpCi0KLSNkZWZpbmUgREVWX0FMTE9DX1NLQihfbGVuZ3RoKSBcCi0JZGV2X2FsbG9jX3NrYihfbGVuZ3RoKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIFBDSV9NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKSAoVUxPTkcpMAotCi0jZGVmaW5lIFBDSV9VTk1BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotI2RlZmluZSBCRUFDT05fRlJBTUVfRE1BX0NBQ0hFX1dCQUNLKF9wdHIsIF9zaXplKQlcCi0JZG1hX2NhY2hlX3diYWNrKF9wdHIsIF9zaXplKQotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLSNkZWZpbmUgTmRpc01JbmRpY2F0ZVN0YXR1cyhfdywgX3gsIF95LCBfeikKLQotdHlwZWRlZiBzdHJ1Y3QgdGltZXJfbGlzdAlSVE1QX09TX1RJTUVSOwotCi0jaWZkZWYgUlQyODcwCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBUaW1lciBSZWxhdGVkIE1BUkNPIC0tLS0tLS0tLS0tLS0tLSovCi0vLyBJbiBSVDI4NzAsIHdlIGhhdmUgYSBsb3Qgb2YgdGltZXIgZnVuY3Rpb25zIGFuZCB3aWxsIHJlYWQvd3JpdGUgcmVnaXN0ZXIsIGl0J3MKLS8vCW5vdCBhbGxvd2VkIGluIExpbnV4IFVTQiBzdWItc3lzdGVtIHRvIGRvIGl0ICggYmVjYXVzZSBvZiBzbGVlcCBpc3N1ZSB3aGVuIHN1Ym1pdAotLy8gIHRvIGN0cmwgcGlwZSkuIFNvIHdlIG5lZWQgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHRha2UgY2FyZSBpdC4KLQotdHlwZWRlZiBWT0lEICgqUlQyODcwX1RJTUVSX0hBTkRMRSkoCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMxLAotCUlOICBQVk9JRCAgIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMzKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi10eXBlZGVmIHN0cnVjdCAgX1JBTElOS19USU1FUl9TVFJVQ1QgICAgewotICAgIFJUTVBfT1NfVElNRVIJCVRpbWVyT2JqOyAgICAgICAvLyBOZGlzIFRpbWVyIG9iamVjdAotCUJPT0xFQU4JCQkJVmFsaWQ7CQkJLy8gU2V0IHRvIFRydWUgd2hlbiBjYWxsIFJUTVBJbml0VGltZXIKLSAgICBCT09MRUFOICAgICAgICAgICAgIFN0YXRlOyAgICAgICAgICAvLyBUcnVlIGlmIHRpbWVyIGNhbmNlbGxlZAotICAgIEJPT0xFQU4JICAgICAgCQlQZXJpb2RpY1R5cGU7CS8vIFRydWUgaWYgdGltZXIgaXMgcGVyaW9kaWMgdGltZXIKLSAgICBCT09MRUFOICAgICAgICAgICAgIFJlcGVhdDsgICAgICAgICAvLyBUcnVlIGlmIHBlcmlvZGljIHRpbWVyCi0gICAgVUxPTkcgICAgICAgICAgICAgICBUaW1lclZhbHVlOyAgICAgLy8gVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCi0JVUxPTkcJCQkJY29va2llOwkJCS8vIG9zIHNwZWNpZmljIG9iamVjdAotI2lmZGVmIFJUMjg3MAotCVJUMjg3MF9USU1FUl9IQU5ETEUJaGFuZGxlOwotCXZvaWQJCQkJKnBBZDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLX0gICBSQUxJTktfVElNRVJfU1RSVUNULCAqUFJBTElOS19USU1FUl9TVFJVQ1Q7Ci0KLQotI2lmZGVmIFJUMjg3MAotCi10eXBlZGVmIGVudW0gX1JUMjg3MF9LRVJORUxfVEhSRUFEX1NUQVRVU18KLXsKLQlSVDI4NzBfVEhSRUFEX1VOS05PV04gPSAwLAotCVJUMjg3MF9USFJFQURfSU5JVEVEID0gMSwKLQlSVDI4NzBfVEhSRUFEX1JVTk5JTkcgPSAyLAotCVJUMjg3MF9USFJFQURfU1RPUEVEID0gNCwKLX1SVDI4NzBfS0VSTkVMX1RIUkVBRF9TVEFUVVM7Ci0KLSNkZWZpbmUgUlQyODcwX1RIUkVBRF9DQU5fRE9fSU5TRVJUCQkoUlQyODcwX1RIUkVBRF9JTklURUQgfFJUMjg3MF9USFJFQURfUlVOTklORykKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUMjg3MF9USU1FUl9FTlRSWV8KLXsKLQlSQUxJTktfVElNRVJfU1RSVUNUIAkJCSpwUmFUaW1lcjsKLQlzdHJ1Y3QgX1JUMjg3MF9USU1FUl9FTlRSWV8gCSpwTmV4dDsKLX1SVDI4NzBfVElNRVJfRU5UUlk7Ci0KLQotI2RlZmluZSBUSU1FUl9RVUVVRV9TSVpFX01BWAkxMjgKLXR5cGVkZWYgc3RydWN0IF9SVDI4NzBfVElNRVJfUVVFVUVfCi17Ci0JdW5zaWduZWQgaW50CQlzdGF0dXM7Ci0JVUNIQVIJCQkJKnBUaW1lclFQb2xsOwotCVJUMjg3MF9USU1FUl9FTlRSWQkqcFFQb2xsRnJlZUxpc3Q7Ci0JUlQyODcwX1RJTUVSX0VOVFJZIAkqcFFIZWFkOwotCVJUMjg3MF9USU1FUl9FTlRSWSAJKnBRVGFpbDsKLX1SVDI4NzBfVElNRVJfUVVFVUU7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotLy8jZGVmaW5lIERCRwkxCi0KLS8vCi0vLyAgTUFDUk8gZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotLy8KLQotI2lmZGVmIERCRwotZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKLQotI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChMZXZlbCA8PSBSVERlYnVnTGV2ZWwpICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KSAgICBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKLQotCi0jZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRrKCJFUlJPUiEhISAiKTsgICAgICAgICAgXAotICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCQlcCi17CQkJCQkJCQkJXAotCXByaW50ayBGbXQ7CQkJCQlcCi19Ci0KLQotI2Vsc2UKLSNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkKLSNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCi0jZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCi0jZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpCi0jZW5kaWYKLQotCi0vLwotLy8gIHNwaW5fbG9jayBlbmhhbmNlZCBmb3IgTmVzdGVkIHNwaW4gbG9jawotLy8KKy8qICovCisvKiAgc3Bpbl9sb2NrIGVuaGFuY2VkIGZvciBOZXN0ZWQgc3BpbiBsb2NrICovCisvKiAqLwogI2RlZmluZSBOZGlzQWxsb2NhdGVTcGluTG9jayhfX2xvY2spICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzcGluX2xvY2tfaW5pdCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsgICAgICAgICAgICAgICBcCiB9CiAKICNkZWZpbmUgTmRpc0ZyZWVTcGluTG9jayhsb2NrKSAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCisJZG97fXdoaWxlKDApCiAKICNkZWZpbmUgUlRNUF9TRU1fTE9DSyhfX2xvY2spCQkJCQlcCiB7CQkJCQkJCQkJCQkJXAotCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQkJXAorCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCVwKIH0KIAogI2RlZmluZSBSVE1QX1NFTV9VTkxPQ0soX19sb2NrKQkJCQkJXAogewkJCQkJCQkJCQkJCVwKLQlzcGluX3VubG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQkJXAorCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJXAogfQogCi0vLyBzYW1wbGUsIHVzZSBzZW1hcGhvcmUgbG9jayB0byByZXBsYWNlIElSUSBsb2NrLCAyMDA3LzExLzE1CisvKiBzYW1wbGUsIHVzZSBzZW1hcGhvcmUgbG9jayB0byByZXBsYWNlIElSUSBsb2NrLCAyMDA3LzExLzE1ICovCiAjZGVmaW5lIFJUTVBfSVJRX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKIHsJCQkJCQkJCQkJCQkJXAogCV9faXJxZmxhZ3MgPSAwOwkJCQkJCQkJCVwKQEAgLTQwNCw3ICsyMjksNyBAQAogCiAjZGVmaW5lIFJUTVBfSVJRX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCiB7CQkJCQkJCQkJCQkJCVwKLQlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOyBcCisJcEFkLT5pcnFfZGlzYWJsZWQgJj0gMDsJCQkJCQkJXAogCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJCVwKIH0KIApAQCAtNDE4LDc1ICsyNDMsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHNwaW5sb2NrX3QgKikoX19sb2NrKSwgKCh1bnNpZ25lZCBsb25nKV9faXJxZmxhZykpOwlcCiB9CiAKLSNpZmRlZiBSVDI4NjAKLS8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKLSNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZQkJCQkJCQkJCQkJCQkJCVwKLQkJKl9wViA9IDA7CQkJCQkJCQkJCQkJCVwKLX0KLSNkZWZpbmUgUlRNUF9JT19GT1JDRV9SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCi0JKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAotfQotI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0JKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJCVwKLQkoKl9wViA9IHJlYWRiKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQkJXAotfQotI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZWwoX1YsICh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJCQkJCQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZWIoKF9WKSwgKFBVQ0hBUikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQlcCi19Ci0jZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlVSU5UCVZhbDsJCQkJCQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCi0Jd3JpdGV3KChfViksIChQVVNIT1JUKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotI2lmZGVmIFJUMjg3MAotLy9QYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeAotI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCVwKLQlSVFVTQlJlYWRNQUNSZWdpc3RlcihfQSwgX1IsIF9wVikKLQotI2RlZmluZSBSVE1QX0lPX1JFQUQ4KF9BLCBfUiwgX3BWKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQlcCi0JUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKF9BLCBfUiwgX1YpCi0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0JVVNIT1JUCV9WYWwgPSBfVjsJCQkJCQkJCQkJCVwKLQlSVFVTQlNpbmdsZVdyaXRlKF9BLCBfUiwgX1ZhbCk7CQkJCQkJCQlcCi19Ci0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFMTYoX0EsIF9SLCBfVikJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotCVJUVVNCU2luZ2xlV3JpdGUoX0EsIF9SLCBfVik7CQkJCQkJCQlcCi19Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZGVmaW5lIE5kaXNBY3F1aXJlU3BpbkxvY2sJCVJUTVBfU0VNX0xPQ0sKKyNkZWZpbmUgTmRpc1JlbGVhc2VTcGluTG9jawkJUlRNUF9TRU1fVU5MT0NLCiAKICNpZm5kZWYgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKICNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpIFwKQEAgLTUxOSw3ICsyNzcsNzMgQEAKICAgICAgICAgX19yZXQ7IFwKIH0pCiAjZW5kaWYKLSNkZWZpbmUgT05FX1RJQ0sgMQorCisjZGVmaW5lIFJUTVBfU0VNX0VWRU5UX0lOSVRfTE9DS0VEKF9wU2VtYSkJc2VtYV9pbml0KChfcFNlbWEpLCAwKQorI2RlZmluZSBSVE1QX1NFTV9FVkVOVF9JTklUKF9wU2VtYSkJCQlzZW1hX2luaXQoKF9wU2VtYSksIDEpCisjZGVmaW5lIFJUTVBfU0VNX0VWRU5UX1dBSVQoX3BTZW1hLCBfc3RhdHVzKQkoKF9zdGF0dXMpID0gZG93bl9pbnRlcnJ1cHRpYmxlKChfcFNlbWEpKSkKKyNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfVVAoX3BTZW1hKQkJCXVwKF9wU2VtYSkKKworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorI2RlZmluZSBSVE1QX1dBSVRfRVZFTlRfSU5URVJSVVBUSUJMRShfcEFkLCBfcFRhc2spIFwKK3sgXAorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoX3BUYXNrLT5rdGhyZWFkX3EsIFwKKwkJCQkJCQkJIF9wVGFzay0+a3RocmVhZF9ydW5uaW5nIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7IFwKKwkJX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgPSBGQUxTRTsgXAorCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSBcCisJCXsgXAorCQkJUlRNUF9TRVRfRkxBRyhfcEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOyBcCisJCQlicmVhazsgXAorCQl9IFwKK30KKyNlbmRpZgorCisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisjZGVmaW5lIFdBS0VfVVAoX3BUYXNrKSBcCisJZG97IFwKKwkJaWYgKChfcFRhc2spLT5rdGhyZWFkX3Rhc2spIFwKKyAgICAgICAgeyBcCisJCQkoX3BUYXNrKS0+a3RocmVhZF9ydW5uaW5nID0gVFJVRTsgXAorCSAgICAgICAgd2FrZV91cCgmKF9wVGFzayktPmt0aHJlYWRfcSk7IFwKKwkJfSBcCisJfXdoaWxlKDApCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPUyBNZW1vcnkgQWNjZXNzIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1FTV9BTExPQ19GTEFHICAgICAgKEdGUF9BVE9NSUMpCS8qKEdGUF9ETUEgfCBHRlBfQVRPTUlDKSAqLworCisjZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCisjZGVmaW5lIE5kaXNDb3B5TWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtY3B5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKKyNkZWZpbmUgTmRpc1plcm9NZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCkgICAgICAgICBtZW1zZXQoRGVzdGluYXRpb24sIDAsIExlbmd0aCkKKyNkZWZpbmUgTmRpc0ZpbGxNZW1vcnkoRGVzdGluYXRpb24sIExlbmd0aCwgRmlsbCkgICBtZW1zZXQoRGVzdGluYXRpb24sIEZpbGwsIExlbmd0aCkKKyNkZWZpbmUgTmRpc0NtcE1lbW9yeShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpICBtZW1jbXAoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQorI2RlZmluZSBOZGlzRXF1YWxNZW1vcnkoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSAgICghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCisjZGVmaW5lIFJUTVBFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpCSghbWVtY21wKFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkpCisKKyNkZWZpbmUgTWxtZUFsbG9jYXRlTWVtb3J5KF9wQWQsIF9wcFZBKQkJb3NfYWxsb2NfbWVtKF9wQWQsIF9wcFZBLCBNR01UX0RNQV9CVUZGRVJfU0laRSkKKyNkZWZpbmUgTWxtZUZyZWVNZW1vcnkoX3BBZCwgX3BWQSkJCQlvc19mcmVlX21lbShfcEFkLCBfcFZBKQorCisjZGVmaW5lIENPUFlfTUFDX0FERFIoQWRkcjEsIEFkZHIyKSAgICAgICAgICAgICBtZW1jcHkoKEFkZHIxKSwgKEFkZHIyKSwgTUFDX0FERFJfTEVOKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCU9TIHRhc2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUlRNUF9PU19NR01UX1RBU0tfRkxBR1MJQ0xPTkVfVk0KKworI2RlZmluZQlUSFJFQURfUElEX0lOSVRfVkFMVUUJTlVMTAorI2RlZmluZQlHRVRfUElEKF92KQlmaW5kX2dldF9waWQoKF92KSkKKyNkZWZpbmUJR0VUX1BJRF9OVU1CRVIoX3YpCXBpZF9ucigoX3YpKQorI2RlZmluZSBDSEVDS19QSURfTEVHQUxJVFkoX3BpZCkJaWYgKHBpZF9ucigoX3BpZCkpID4gMCkKKyNkZWZpbmUgS0lMTF9USFJFQURfUElEKF9BLCBfQiwgX0MpCWtpbGxfcGlkKChfQSksIChfQiksIChfQykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGltZXIgcmVsYXRlZCBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE9TX0haCQkJSFoKKwordHlwZWRlZiB2b2lkICgqVElNRVJfRlVOQ1RJT04pICh1bnNpZ25lZCBsb25nKTsKKwogI2RlZmluZSBPU19XQUlUKF90aW1lKSBcCiB7CWludCBfaTsgXAogCWxvbmcgX2xvb3AgPSAoKF90aW1lKS8oMTAwMC9PU19IWikpID4gMCA/ICgoX3RpbWUpLygxMDAwL09TX0haKSkgOiAxO1wKQEAgLTUyOCw3MSArMzUyLDI5MiBAQAogCWZvciAoX2k9MDsgX2k8KF9sb29wKTsgX2krKykgXAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChfd2FpdCwgMCwgT05FX1RJQ0spOyB9CiAKKyNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQogCi10eXBlZGVmIHZvaWQgKCpUSU1FUl9GVU5DVElPTikodW5zaWduZWQgbG9uZyk7CisjZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKKwkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKKwkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKKwkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKKyNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCiAKLSNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCisjZGVmaW5lIE9ORV9USUNLIDEKIAotI2RlZmluZSBNbG1lQWxsb2NhdGVNZW1vcnkoX3BBZCwgX3BwVkEpIG9zX2FsbG9jX21lbShfcEFkLCBfcHBWQSwgTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0jZGVmaW5lIE1sbWVGcmVlTWVtb3J5KF9wQWQsIF9wVkEpICAgICBvc19mcmVlX21lbShfcEFkLCBfcFZBKQotCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQkJCVwKLXZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyID0gKFBSQUxJTktfVElNRVJfU1RSVUNUKSBkYXRhOwkJCQlcCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlfZnVuYyhOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOyAJCQkJCQkJXAotCWlmIChwVGltZXItPlJlcGVhdCkJCQkJCQkJCQkJCQkJCQlcCi0JCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBwVGltZXItPlRpbWVyVmFsdWUpOwkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgTmRpc0dldFN5c3RlbVVwVGltZSh1bnNpZ25lZCBsb25nICogdGltZSkKK3sKKwkqdGltZSA9IGppZmZpZXM7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJT1Mgc3BlY2lmaWMgY29va2llIGRhdGEgc3RydWN0dXJlIGJpbmRpbmcgdG8gc3RydWN0IHJ0X3J0bXBfYWRhcHRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgb3NfY29va2llIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50X3BjaV9kZXY7CisJdTE2IERldmljZUlEOworCWRtYV9hZGRyX3QgcEFkX3BhOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXN0cnVjdCB1c2JfZGV2aWNlICpwVXNiX0RldjsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByeF9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IG1nbXRfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYWMwX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGFjMV9kbWFfZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBhYzJfZG1hX2RvbmVfdGFzazsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYWMzX2RtYV9kb25lX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRidHRfdGFzazsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBudWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2s7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ0c19mcmFtZV9jb21wbGV0ZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzazsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KKworCXVuc2lnbmVkIGxvbmcgYXBkX3BpZDsJLyo4MDIuMXggZGFlbW9uIHBpZCAqLworCWludCBpb2N0bF9pZl90eXBlOworCWludCBpb2N0bF9pZjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJT1MgZGVidWdnaW5nIGFuZCBwcmludGluZyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQUklOVF9NQUMoYWRkcikJXAorCWFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0KKworI2lmZGVmIERCRworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgUlREZWJ1Z0xldmVsOworCisjZGVmaW5lIERCR1BSSU5UX1JBVyhMZXZlbCwgRm10KSAgICBcCitkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTGV2ZWwgPD0gUlREZWJ1Z0xldmVsKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9d2hpbGUoMCkKKworI2RlZmluZSBEQkdQUklOVChMZXZlbCwgRm10KSAgICBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkKKworI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByaW50aygiRVJST1IhICIpOyAgICAgICAgICBcCisgICAgcHJpbnRrIEZtdDsgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgREJHUFJJTlRfUyhTdGF0dXMsIEZtdCkJCVwKK3sJCQkJCQkJCQlcCisJcHJpbnRrIEZtdDsJCQkJCVwKK30KKworI2Vsc2UKKyNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkKKyNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCisjZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpCiAjZW5kaWYKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgQlVJTERfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCQkJCQkJCQkJCVwKLXZvaWQgbGludXhfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlQUkFMSU5LX1RJTUVSX1NUUlVDVAlfcFRpbWVyID0gKFBSQUxJTktfVElNRVJfU1RSVUNUKWRhdGE7CQkJCQlcCi0JUlQyODcwX1RJTUVSX0VOVFJZCQkqX3BRTm9kZTsJCQkJCQkJCQkJCQlcCi0JUlRNUF9BREFQVEVSCQkJKl9wQWQ7CQkJCQkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCV9wVGltZXItPmhhbmRsZSA9IF9mdW5jOwkJCQkJCQkJCQkJCQkJCVwKLQlfcEFkID0gKFJUTVBfQURBUFRFUiAqKV9wVGltZXItPnBBZDsJCQkJCQkJCQkJCQlcCi0JX3BRTm9kZSA9IFJUMjg3MF9UaW1lclFfSW5zZXJ0KF9wQWQsIF9wVGltZXIpOyAJCQkJCQkJCQlcCi0JaWYgKChfcFFOb2RlID09IE5VTEwpICYmIChfcEFkLT5UaW1lclEuc3RhdHVzICYgUlQyODcwX1RIUkVBRF9DQU5fRE9fSU5TRVJUKSkJXAotCQlSVE1QX09TX0FkZF9UaW1lcigmX3BUaW1lci0+VGltZXJPYmosIEhaKTsgICAgICAgICAgICAgICAJCQkJCVwKKworI2RlZmluZSBBU1NFUlQoeCkKKwordm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlUaGUgZm9sbG93aW5nIGNvZGUgYXJlIG5vdCByZXZpc2VkLCB0ZW1wb3JhcnkgcHV0IGl0IGhlcmUuCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZpY2UgRE1BIEFjY2VzcyByZWxhdGVkIGRlZmluaXRpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBSVE1QX01BQ19QQ0kKK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCQkJCWludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pOwordm9pZCBsaW51eF9wY2lfdW5tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgaW50IGRpcmVjdGlvbik7CisKKyNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpIFwKKwlsaW51eF9wY2lfbWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKSBcCisJbGludXhfcGNpX3VubWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKKworI2RlZmluZSBQQ0lfQUxMT0NfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF9wdHIpIFwKKwlwY2lfYWxsb2NfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF9wdHIpCisKKyNkZWZpbmUgUENJX0ZSRUVfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKSBcCisJcGNpX2ZyZWVfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKQorCisjZGVmaW5lIERFVl9BTExPQ19TS0IoX2xlbmd0aCkgXAorCWRldl9hbGxvY19za2IoX2xlbmd0aCkKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKyNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9kaXIpICh1bnNpZ25lZCBsb25nKTAKKworI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKQorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCisvKgorICogdW5zaWduZWQgbG9uZworICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coCisgKiAgIGRtYV9hZGRyX3QgIFBoeXNpY2FsQWRkcmVzcyk7CisgKi8KKyNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKKworLyoKKyAqIHVuc2lnbmVkIGxvbmcKKyAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKKyAqICAgZG1hX2FkZHJfdCAgUGh5c2ljYWxBZGRyZXNzKTsKKyAqLworI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCisKKy8qCisgKiB2b2lkCisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKKyAqICAgZG1hX2FkZHJfdCAgUGh5c2ljYWxBZGRyZXNzLAorICogICB1bnNpZ25lZCBsb25nICBWYWx1ZSk7CisgKi8KKyNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAorCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7CisKKy8qCisgKiB2b2lkCisgKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCisgKiAgIGRtYV9hZGRyX3QgIFBoeXNpY2FsQWRkcmVzcywKKyAqICAgdW5zaWduZWQgbG9uZyAgVmFsdWUpOworICovCisjZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQorCisjZGVmaW5lIE5kaXNNSW5kaWNhdGVTdGF0dXMoX3csIF94LCBfeSwgX3opCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2aWNlIFJlZ2lzdGVyIEkvTyBBY2Nlc3MgcmVsYXRlZCBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgUlRNUF9NQUNfUENJCisvKlBhdGNoIGZvciBBU0lDIHR1cnN0IHJlYWQvd3JpdGUgYnVnLCBuZWVkcyB0byByZW1vdmUgYWZ0ZXIgbWV0ZWwgZml4ICovCisjZGVmaW5lIFJUTVBfSU9fUkVBRDMyKF9BLCBfUiwgX3BWKQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQlcCisgICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCisJCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UJCQkJCQkJCQkJCQkJCQlcCisJCSpfcFYgPSAwOwkJCQkJCQkJCQkJCQlcCiB9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCiAKKyNkZWZpbmUgUlRNUF9JT19GT1JDRV9SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCVwKKwkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKSk7CQlcCisJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAorfQogCi0jZGVmaW5lIERFQ0xBUkVfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJXAotdm9pZCBsaW51eF8jI19mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCQlcCisJKCpfcFYgPSByZWFkYigodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJCVwKK30KKyNkZWZpbmUgUlRNUF9JT19XUklURTMyKF9BLCBfUiwgX1YpCQkJCQkJCQkJCQkJXAorewkJCQkJCQkJCQkJCQkJCQkJCQkJXAorICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1MzIgVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZWwoKF9WKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJCQkJCQlcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KIAotI2RlZmluZSBHRVRfVElNRVJfRlVOQ1RJT04oX2Z1bmMpCQkJCVwKLQkJbGludXhfIyNfZnVuYworI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCisJdTMyIFZhbDsJCQkJCQkJCQkJCQkJCQkJXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJCQlcCisJd3JpdGVsKF9WLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQkJCQkJCVwKK30KIAotREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUGVyaW9kaWNFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTWxtZVJzc2lSZXBvcnRFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1J4QW50RXZhbFRpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBUFNEUGVyaW9kaWNFeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQXNpY1JmVHVuaW5nRXhlYyk7Ci0jaWZkZWYgUlQyODcwCi1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblVwZGF0ZUV4ZWMpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmIGRlZmluZWQoUkFMSU5LXzI4ODApIHx8IGRlZmluZWQoUkFMSU5LXzMwNTIpCisjZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGxvbmcgVmFsOyAgICAgICAgICAgICAgICBcCisJdTggX2k7ICAgICAgICAgICAgICAgIFwKKwlfaSA9ICgoX1IpICYgMHgzKTsgICAgICAgICAgICAgXAorCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKChfUikgLSBfaSkpKTsgICBcCisJVmFsID0gVmFsICYgKH4oMHgwMDAwMDBmZiA8PCAoKF9pKSo4KSkpOyAgICAgICAgIFwKKwlWYWwgPSBWYWwgfCAoKHVuc2lnbmVkIGxvbmcpKF9WKSA8PCAoKF9pKSo4KSk7ICAgICAgICAgXAorCXdyaXRlbCgoVmFsKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoKF9SKSAtIF9pKSkpOyAgICBcCit9CisjZWxzZQorI2RlZmluZSBSVE1QX0lPX1dSSVRFOChfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl1MzIgVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZWIoKF9WKSwgKHU4ICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpOwkJXAorfQorI2VuZGlmIC8qICNpZiBkZWZpbmVkKEJSQ01fNjM1OCkgfHwgZGVmaW5lZChSQUxJTktfMjg4MCkgLy8gKi8KIAotREVDTEFSRV9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyk7Ci1ERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKTsKLURFQ0xBUkVfVElNRVJfRlVOQ1RJT04oUHNQb2xsV2FrZUV4ZWMpOwotREVDTEFSRV9USU1FUl9GVU5DVElPTihSYWRpb09uRXhlYyk7CisjZGVmaW5lIFJUTVBfSU9fV1JJVEUxNihfQSwgX1IsIF9WKQkJCQkJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl1MzIgVmFsOwkJCQkJCQkJCQkJCQkJCQlcCisJVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKKwl3cml0ZXcoKF9WKSwgKHUxNiAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAorfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgorLypQYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeCAqLworI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCVwKKwlSVFVTQlJlYWRNQUNSZWdpc3RlcigoX0EpLCAoX1IpLCAodTMyICopKF9wVikpCiAKLXZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKTsKKyNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorfQogCisjZGVmaW5lIFJUTVBfSU9fV1JJVEUzMihfQSwgX1IsIF9WKQkJCQkJCQkJXAorCVJUVVNCV3JpdGVNQUNSZWdpc3RlcigoX0EpLCAoX1IpLCAodTMyKShfVikpCisKKyNkZWZpbmUgUlRNUF9JT19XUklURTgoX0EsIF9SLCBfVikJCQkJCQkJCVwKK3sJCQkJCQkJCQkJCQkJCQkJXAorCXUxNglfVmFsID0gX1Y7CQkJCQkJCQkJCQlcCisJUlRVU0JTaW5nbGVXcml0ZSgoX0EpLCAoX1IpLCAodTE2KShfVmFsKSk7CQkJCQkJCQlcCit9CisKKyNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCVwKKwlSVFVTQlNpbmdsZVdyaXRlKChfQSksIChfUiksICh1MTYpKF9WKSk7CQkJCQkJCQlcCit9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJTmV0d29yayBSZWxhdGVkIGRhdGEgc3RydWN0dXJlIGFuZCBtYXJjbyBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQS1RTUkNfTkRJUyAgICAgICAgICAgICAweDdmCisjZGVmaW5lIFBLVFNSQ19EUklWRVIgICAgICAgICAgIDB4MGYKKworI2RlZmluZSBSVE1QX09TX05FVERFVl9TRVRfUFJJVihfcE5ldERldiwgX3BQcml2KQkoKF9wTmV0RGV2KS0+bWxfcHJpdiA9IChfcFByaXYpKQorI2RlZmluZSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihfcE5ldERldikJCSgoX3BOZXREZXYpLT5tbF9wcml2KQorI2RlZmluZSBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShfcE5ldERldikJKChfcE5ldERldiktPm5hbWUpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9QSFlBRERSKF9QTkVUREVWKQkoKF9QTkVUREVWKS0+ZGV2X2FkZHIpCisKKyNkZWZpbmUgUlRNUF9PU19ORVRERVZfU1RBUlRfUVVFVUUoX3BOZXREZXYpCW5ldGlmX3N0YXJ0X3F1ZXVlKChfcE5ldERldikpCisjZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NUT1BfUVVFVUUoX3BOZXREZXYpCW5ldGlmX3N0b3BfcXVldWUoKF9wTmV0RGV2KSkKKyNkZWZpbmUgUlRNUF9PU19ORVRERVZfV0FLRV9RVUVVRShfcE5ldERldikJbmV0aWZfd2FrZV9xdWV1ZSgoX3BOZXREZXYpKQorI2RlZmluZSBSVE1QX09TX05FVERFVl9DQVJSSUVSX09GRihfcE5ldERldikJbmV0aWZfY2Fycmllcl9vZmYoKF9wTmV0RGV2KSkKKworI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KSBcCisJKHZvaWQgKikocEVudHJ5KQorCisjZGVmaW5lIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSBcCisJKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShwUGFja2V0KQorCisjZGVmaW5lIEdFVF9TR19MSVNUX0ZST01fUEFDS0VUKF9wLCBfc2MpCVwKKyAgICBydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChfcCwgX3NjKQorCisjZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CiAKIC8qCiAgKiBwYWNrZXQgaGVscGVyCkBAIC02MDAsMTYgKzY0NSwyMiBAQAogICogICAgICAgICAgICAgb3MgcGFja2V0IHRvIHJ0IHBhY2tldAogICovCiAjZGVmaW5lIFJUUEtUX1RPX09TUEtUKF9wKQkJKChzdHJ1Y3Qgc2tfYnVmZiAqKShfcCkpCi0jZGVmaW5lIE9TUEtUX1RPX1JUUEtUKF9wKQkJKChQTkRJU19QQUNLRVQpKF9wKSkKKyNkZWZpbmUgT1NQS1RfVE9fUlRQS1QoX3ApCQkoKHZvaWQgKikoX3ApKQogCiAjZGVmaW5lIEdFVF9PU19QS1RfREFUQVBUUihfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkKKyNkZWZpbmUgU0VUX09TX1BLVF9EQVRBUFRSKF9wa3QsIF9kYXRhUHRyKQlcCisJCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGF0YSkgPSAoX2RhdGFQdHIpCiAKICNkZWZpbmUgR0VUX09TX1BLVF9MRU4oX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikKKyNkZWZpbmUgU0VUX09TX1BLVF9MRU4oX3BrdCwgX2xlbikJXAorCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmxlbikgPSAoX2xlbikKIAogI2RlZmluZSBHRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QpIFwKIAkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT50YWlsKQorI2RlZmluZSBTRVRfT1NfUEtUX0RBVEFUQUlMKF9wa3QsIF9zdGFydCwgX2xlbikJXAorCQkoKFJUUEtUX1RPX09TUEtUKF9wa3QpKS0+dGFpbCkgPSAodTggKikoKF9zdGFydCkgKyAoX2xlbikpCiAKICNkZWZpbmUgR0VUX09TX1BLVF9IRUFEKF9wa3QpIFwKIAkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5oZWFkKQpAQCAtNjE5LDYgKzY3MCw4IEBACiAKICNkZWZpbmUgR0VUX09TX1BLVF9ORVRERVYoX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPmRldikKKyNkZWZpbmUgU0VUX09TX1BLVF9ORVRERVYoX3BrdCwgX3BOZXREZXYpCVwKKwkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kZXYpID0gKF9wTmV0RGV2KQogCiAjZGVmaW5lIEdFVF9PU19QS1RfVFlQRShfcGt0KSBcCiAJCShSVFBLVF9UT19PU1BLVChfcGt0KSkKQEAgLTYyNiw2ICs2NzksNyBAQAogI2RlZmluZSBHRVRfT1NfUEtUX05FWFQoX3BrdCkgXAogCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPm5leHQpCiAKKyNkZWZpbmUgT1NfUEtUX0NMT05FRChfcGt0KQkJc2tiX2Nsb25lZChSVFBLVF9UT19PU1BLVChfcGt0KSkKIAogI2RlZmluZSBPU19OVE9IUyhfVmFsKSBcCiAJCShudG9ocyhfVmFsKSkKQEAgLTYzNiw1NSArNjkwLDM2IEBACiAjZGVmaW5lIE9TX0hUT05MKF9WYWwpIFwKIAkJKGh0b25sKF9WYWwpKQogCi0vKiBzdGF0aXN0aWNzIGNvdW50ZXIgKi8KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX1BBQ0tFVFMoX3BBZCwgX2RldikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX1BBQ0tFVFMoX3BBZCwgX2RldikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX0JZVEVTUyhfcEFkLCBfZGV2LCBsZW4pCi0KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX0VSUk9SUyhfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfRVJST1JTKF9wQWQsIF9kZXYpCi0KLSNkZWZpbmUgU1RBVFNfSU5DX1JYX0RST1BQRUQoX3BBZCwgX2RldikKLSNkZWZpbmUgU1RBVFNfSU5DX1RYX0RST1BQRUQoX3BBZCwgX2RldikKLQotCiAjZGVmaW5lIENCX09GRiAgMTAKIAotCi0vLyAgIGNoZWNrIERESyBORElTX1BBQ0tFVCBkYXRhIHN0cnVjdHVyZSBhbmQgZmluZCBvdXQgb25seSBNaW5pcG9ydFJlc2VydmVkRXhbMC4uN10gY2FuIGJlIHVzZWQgYnkgb3VyIGRyaXZlciB3aXRob3V0Ci0vLyAgIGFtYmlndWl0eS4gRmllbGRzIGFmdGVyIHBQYWNrZXQtPk1pbmlwb3J0UmVzZXJ2ZWRFeFs4XSBtYXkgYmUgdXNlZCBieSBvdGhlciB3cmFwcGVyIGxheWVyIHRodXMgY3Jhc2hlcyB0aGUgZHJpdmVyCi0vLwotCi0vLyBVc2VyIFByaW9yaXR5CisvKiBVc2VyIFByaW9yaXR5ICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9VUChfcCwgX3ByaW8pCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdID0gX3ByaW8pCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9VUChfcCkJCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRiswXSkKIAotLy8gRnJhZ21lbnQgIworLyogRnJhZ21lbnQgIyAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKF9wLCBfbnVtKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzFdID0gX251bSkKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0pCiAKLS8vIDB4MCB+MHg3ZjogVFggdG8gQVAncyBvd24gQlNTIHdoaWNoIGhhcyB0aGUgc3BlY2lmaWVkIEFJRC4gaWYgQUlEPjEyNywgc2V0IGJpdCA3IGluIFJUTVBfU0VUX1BBQ0tFVF9FTUFDVEFCIHRvby4KLS8vKHRoaXMgdmFsdWUgYWxzbyBhcyBNQUMob24tY2hpcCBXQ0lEKSB0YWJsZSBpbmRleCkKLS8vIDB4ODB+MHhmZjogVFggdG8gYSBXRFMgbGluay4gYjB+NjogV0RTIGluZGV4CisvKiAweDAgfjB4N2Y6IFRYIHRvIEFQJ3Mgb3duIEJTUyB3aGljaCBoYXMgdGhlIHNwZWNpZmllZCBBSUQuIGlmIEFJRD4xMjcsIHNldCBiaXQgNyBpbiBSVE1QX1NFVF9QQUNLRVRfRU1BQ1RBQiB0b28uICovCisvKih0aGlzIHZhbHVlIGFsc28gYXMgTUFDKG9uLWNoaXAgV0NJRCkgdGFibGUgaW5kZXgpICovCisvKiAweDgwfjB4ZmY6IFRYIHRvIGEgV0RTIGxpbmsuIGIwfjY6IFdEUyBpbmRleCAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0NJRChfcCwgX3dkc2lkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSA9IF93ZHNpZHgpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKF9wKSAgICAgICAgICAJCSgoVUNIQVIpKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzJdKSkKKyNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dDSUQoX3ApICAgICAgICAgIAkJKCh1OCkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0pKQogCi0vLyAweGZmOiBQS1RTUkNfTkRJUywgb3RoZXJzOiBsb2NhbCBUWCBidWZmZXIgaW5kZXguIFRoaXMgdmFsdWUgYWZmZWN0cyBob3cgdG8gYSBwYWNrZXQKKy8qIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldCAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU09VUkNFKF9wLCBfcGt0c3JjKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdID0gX3BrdHNyYykKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1NPVVJDRShfcCkgICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10pCiAKLS8vIFJUUy9DVFMtdG8tc2VsZiBwcm90ZWN0aW9uIG1ldGhvZAorLyogUlRTL0NUUy10by1zZWxmIHByb3RlY3Rpb24gbWV0aG9kICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9SVFMoX3AsIF9udW0pICAgICAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNF0gPSBfbnVtKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfUlRTKF9wKSAgICAgICAgICAJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSkKLS8vIHNlZSBSVE1QX1MoRylFVF9QQUNLRVRfRU1BQ1RBQgorLyogc2VlIFJUTVBfUyhHKUVUX1BBQ0tFVF9FTUFDVEFCICovCiAKLS8vIFRYIHJhdGUgaW5kZXgKKy8qIFRYIHJhdGUgaW5kZXggKi8KICNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1RYUkFURShfcCwgX3JhdGUpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0gPSBfcmF0ZSkKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1RYUkFURShfcCkJCSAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNV0pCiAKLS8vIEZyb20gd2hpY2ggSW50ZXJmYWNlCisvKiBGcm9tIHdoaWNoIEludGVyZmFjZSAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSUYoX3AsIF9pZmR4KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzZdID0gX2lmZHgpCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9JRihfcCkJCSAgCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrNl0pCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCwgX2JzcykJCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoX2JzcykpCkBAIC02OTcsMTAgKzczMiw5IEBACiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9NT1JFREFUQShfcCwgX21vcmViaXQpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10gPSBfbW9yZWJpdCkKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX01PUkVEQVRBKF9wKQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrN10pCiAKLQotLy8KLS8vCVNlcGNpZmljIFBha2NldCBUeXBlIGRlZmluaXRpb24KLS8vCisvKiAqLworLyogICAgICBTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uICovCisvKiAqLwogI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19DQl9PRkZTRVQJMTEKIAogI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQCQkweDAxCkBAIC03MTAsMTAgKzc0NCwxMCBAQAogI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOCQkweDEwCiAjZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVAJMHgyMAogCi0vL1NwZWNpZmljCisvKlNwZWNpZmljICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyhfcCwgX2ZsZykJICAgCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gPSBfZmxnKQogCi0vL0RIQ1AKKy8qREhDUCAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAogCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC03MjMsNyArNzU3LDcgQEAKIAkJCX13aGlsZSgwKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfREhDUChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKQogCi0vL0VBUE9MCisvKkVBUE9MICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9FQVBPTChfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAogCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC03MzMsNyArNzY3LDcgQEAKIAkJCX13aGlsZSgwKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRUFQT0woX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpCiAKLS8vV0FJCisvKldBSSAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfV0FJKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTc0NSw3ICs3NzksNyBAQAogCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1AgfCBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpKQogCi0vL1ZMQU4KKy8qVkxBTiAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVkxBTihfcCwgX2ZsZykgICAJCQkJCQkJCQkJCQkJXAogCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC03NTUsNyArNzg5LDcgQEAKIAkJCX13aGlsZSgwKQogI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfVkxBTihfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKQogCi0vL0xMQy9TTkFQCisvKkxMQy9TTkFQICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9MTENTTkFQKF9wLCBfZmxnKSAgIAkJCQkJCQkJCQkJCQlcCiAJCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKIAkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKQEAgLTc2Niw3ICs4MDAsNyBAQAogCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MTENTTkFQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApCiAKLS8vIElQCisvKiBJUCAqLwogI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfSVBWNChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKIAkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXApAQCAtNzc3LDE0MiArODExLDM1IEBACiAKICNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0lQVjQoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfSVBWNCkKIAotCi0vLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEVBUG9MIGZyYW1lIE1VU1QgYmUgY2xlYXIuCisvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIEVBUG9MIGZyYW1lIE1VU1QgYmUgY2xlYXIuICovCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSA9IF9mbGcpCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzEyXSkKIAorLyogdXNlIGJpdDMgb2YgY2JbQ0JfT0ZGKzE2XSAqLworCiAjZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF81VlQoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSA9IF9mbGcpCiAjZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF81VlQoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSkKIAotI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotI2RlZmluZSBCUklER0VfVEFHIDB4MzU1NjQyNTIgICAgLy8gZGVwZW5kcyBvbiA1VlQgZGVmaW5lIGluIGJyX2lucHV0LmMKLSNlbmRpZgorLyogTWF4IHNrYi0+Y2IgPSA0OEIgPSBbQ0JfT0ZGKzM4XSAqLwogCi0KLSNkZWZpbmUgTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhfcCwgX3N0YXR1cykKLQotCi0jZGVmaW5lIEdFVF9TR19MSVNUX0ZST01fUEFDS0VUKF9wLCBfc2MpCVwKLSAgICBydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChfcCwgX3NjKQotCi0jZGVmaW5lIE5kaXNNb3ZlTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgbWVtbW92ZShEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCi0jZGVmaW5lIE5kaXNaZXJvTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgpICAgICAgICAgbWVtc2V0KERlc3RpbmF0aW9uLCAwLCBMZW5ndGgpCi0jZGVmaW5lIE5kaXNGaWxsTWVtb3J5KERlc3RpbmF0aW9uLCBMZW5ndGgsIEZpbGwpICAgbWVtc2V0KERlc3RpbmF0aW9uLCBGaWxsLCBMZW5ndGgpCi0jZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKLSNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKLQotCi0jZGVmaW5lIFJUTVBfSU5DX1JFRihfQSkJCTAKLSNkZWZpbmUgUlRNUF9ERUNfUkVGKF9BKQkJMAotI2RlZmluZSBSVE1QX0dFVF9SRUYoX0EpCQkwCi0KLQotCi0vKgotICogVUxPTkcKLSAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KAotICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcyk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzKQkJKFBoeXNpY2FsQWRkcmVzcykKLQotLyoKLSAqIFVMT05HCi0gKiBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKLSAqLwotI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goUGh5c2ljYWxBZGRyZXNzKQkJKDApCi0KLS8qCi0gKiBWT0lECi0gKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdygKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCi0gKiAgIElOIFVMT05HICBWYWx1ZSk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coUGh5c2ljYWxBZGRyZXNzLCBWYWx1ZSkJXAotCQkJUGh5c2ljYWxBZGRyZXNzID0gVmFsdWU7Ci0KLS8qCi0gKiBWT0lECi0gKiBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2goCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzLAotICogICBJTiBVTE9ORyAgVmFsdWUpOwotICovCi0jZGVmaW5lIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQotCi0KLS8vQ09OVEFJTklOR19SRUNPUkQocEVudHJ5LCBORElTX1BBQ0tFVCwgTWluaXBvcnRSZXNlcnZlZEV4KTsKLSNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAotCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKLQotI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAotCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCi0KLQotI2lmbmRlZiBDT05UQUlOSU5HX1JFQ09SRAotI2RlZmluZSBDT05UQUlOSU5HX1JFQ09SRChhZGRyZXNzLCB0eXBlLCBmaWVsZCkJCQlcCi0oKHR5cGUgKikoKFBDSEFSKShhZGRyZXNzKSAtIG9mZnNldG9mKHR5cGUsIGZpZWxkKSkpCi0jZW5kaWYKLQotCi0jZGVmaW5lIFJFTEVBU0VfTkRJU19QQUNLRVQoX3BBZCwgX3BQYWNrZXQsIF9TdGF0dXMpICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBGcmVlTmRpc1BhY2tldChfcEFkLCBfcFBhY2tldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLQotI2RlZmluZSBTV0lUQ0hfUGh5QUIoX3BBQSwgX3BCQikgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVTE9ORwlBQUJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HCUFBQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVTE9ORwlCQkJhc2VQYUhpZ2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HCUJCQmFzZVBhTG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2goX3BCQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KF9wQkIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQUFCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQUEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQUFCYXNlUGFMb3cgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEFBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChfcEFBLCBCQkJhc2VQYUhpZ2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3coX3BBQSwgQkJCYXNlUGFMb3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKF9wQkIsIEFBQmFzZVBhSGlnaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhfcEJCLCBBQUJhc2VQYUxvdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0jZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCi0jZGVmaW5lIE5kaXNNQWxsb2NhdGVNYXBSZWdpc3RlcnMoX2EsIF9iLCBfYywgX2QsIF9lKQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCi0KLSNkZWZpbmUgTmRpc0FjcXVpcmVTcGluTG9jawkJUlRNUF9TRU1fTE9DSwotI2RlZmluZSBOZGlzUmVsZWFzZVNwaW5Mb2NrCQlSVE1QX1NFTV9VTkxPQ0sKLQotc3RhdGljIGlubGluZSB2b2lkIE5kaXNHZXRTeXN0ZW1VcFRpbWUoVUxPTkcgKnRpbWUpCi17Ci0JKnRpbWUgPSBqaWZmaWVzOwotfQotCi0vL3BQYWNrZXQgPSBDT05UQUlOSU5HX1JFQ09SRChwRW50cnksIE5ESVNfUEFDS0VULCBNaW5pcG9ydFJlc2VydmVkRXgpOwotI2RlZmluZSBRVUVVRV9FTlRSWV9UT19QS1QocEVudHJ5KSBcCi0JCSgoUE5ESVNfUEFDS0VUKSAocEVudHJ5KSkKLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglPdGhlciBmdW5jdGlvbiBwcm90b3R5cGVzIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFJUTVBfR2V0Q3VycmVudFN5c3RlbVRpbWUoTEFSR0VfSU5URUdFUiAqIHRpbWUpOwogaW50IHJ0Mjh4eF9wYWNrZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAorI2lmZGVmIFJUTVBfTUFDX1BDSQorLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisjZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgaXJxcmV0dXJuX3QKIAorSVJRX0hBTkRMRV9UWVBFIHJ0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotdm9pZCBydG1wX29zX3RocmVhZF9pbml0KFBVQ0hBUiBwVGhyZWFkTmFtZSwgUFZPSUQgcE5vdGlmeSk7CitpbnQgcnQyOHh4X3N0YV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgSU4gT1VUIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwogCi0jaWZkZWYgUlQyODYwCi0jaWYgIWRlZmluZWQoUENJX0NBUF9JRF9FWFApCi0jZGVmaW5lIFBDSV9DQVBfSURfRVhQCQkJICAgIDB4MTAKLSNlbmRpZgorZXh0ZXJuIGludCByYV9tdGRfd3JpdGUoaW50IG51bSwgbG9mZl90IHRvLCBzaXplX3QgbGVuLCBjb25zdCB1X2NoYXIgKiBidWYpOworZXh0ZXJuIGludCByYV9tdGRfcmVhZChpbnQgbnVtLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgdV9jaGFyICogYnVmKTsKIAotI2lmICFkZWZpbmVkKFBDSV9FWFBfTE5LQ1RMKQotI2RlZmluZSBQQ0lfRVhQX0xOS0NUTAkJCSAgICAweDEwCi0jZW5kaWYKKyNkZWZpbmUgR0VUX1BBRF9GUk9NX05FVF9ERVYoX3BBZCwgX25ldF9kZXYpCShfcEFkKSA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopKF9uZXRfZGV2KS0+bWxfcHJpdjsKIAotI2lmICFkZWZpbmVkKFBDSV9DTEFTU19CUklER0VfUENJKQotI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSQkJMHgwNjA0Ci0jZW5kaWYKLQotI2RlZmluZSBQQ0lCVVNfSU5URUxfVkVORE9SICAgICAgICAgMHg4MDg2Ci0jZW5kaWYKLQorI2VuZGlmIC8qIF9fUlRfTElOVVhfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X21haW5fZGV2LmMKaW5kZXggMjJmMzdjZi4uYzNkOTI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9tYWluX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfbWFpbl9kZXYuYwpAQCAtMzMsNTMgKzMzLDMzIEBACiAgICAgUmV2aXNpb24gSGlzdG9yeToKICAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAogICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU2FtcGxlCQlNYXIvMjEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCiAqLwogCiAjaW5jbHVkZSAicnRfY29uZmlnLmgiCiAKLSNkZWZpbmUgRk9SVFlfTUhaX0lOVE9MRVJBTlRfSU5URVJWQUwJKDYwKjEwMDApIC8vIDEgbWluCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFByaXZhdGUgVmFyaWFibGVzIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vc3RhdGljIFJBTElOS19USU1FUl9TVFJVQ1QgICAgIFBlcmlvZGljVGltZXI7CiAKLWNoYXIgKm1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAotY2hhciAqaG9zdG5hbWUgPSAiIjsJCSAgIC8vIGRlZmF1bHQgQ01QQwotbW9kdWxlX3BhcmFtIChtYWMsIGNoYXJwLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MgKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKLQorY2hhciAqbWFjID0gIiI7CQkvKiBkZWZhdWx0IDAwOjAwOjAwOjAwOjAwOjAwICovCitjaGFyICpob3N0bmFtZSA9ICIiOwkJLyogZGVmYXVsdCBDTVBDICovCittb2R1bGVfcGFyYW0obWFjLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1hYywgInJ0Mjh4eDogd2lyZWxlc3MgbWFjIGFkZHIiKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUHJvdG90eXBlcyBvZiBGdW5jdGlvbnMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotZXh0ZXJuIEJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKLWV4dGVybiB2b2lkIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZShQUlRNUF9BREFQVEVSIHBBZCk7Ci1leHRlcm4gTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoSU4gUFJUTVBfQURBUFRFUiBwQWQpOwogCi0jaWZkZWYgUlQyODYwCi1leHRlcm4gdm9pZCBpbml0X3RocmVhZF90YXNrKFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZgorLyogcHVibGljIGZ1bmN0aW9uIHByb3RvdHlwZSAqLworaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitpbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwogCi0vLyBwdWJsaWMgZnVuY3Rpb24gcHJvdG90eXBlCi1JTlQgX19kZXZpbml0IHJ0Mjh4eF9wcm9iZShJTiB2b2lkICpfZGV2X3AsIElOIHZvaWQgKl9kZXZfaWRfcCwKLQkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKKy8qIHByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlICovCitzdGF0aWMgaW50IHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLAorCQkJICAgICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGUKLXN0YXRpYyBpbnQgcnQyOHh4X2luaXQoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotSU5UIHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLCBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0KLXN0YXRpYyB2b2lkIENmZ0luaXRIb29rKFBSVE1QX0FEQVBURVIgcEFkKTsKLQotZXh0ZXJuCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWY7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoCi0gICAgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotCi1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKLSAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzKElOIHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAgKm5ldF9kZXYpOwogCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDMsMjEgKzgzLDY2IEBACiAqLwogaW50IE1haW5WaXJ0dWFsSUZfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIHBBZCAqLwogCWlmIChwQWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisJCXJldHVybiAwOwkvKiBjbG9zZSBvayAqLwogCiAJbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7CiAKKwl7CisJCUJPT0xFQU4gQ2FuY2VsbGVkOworCisJCWlmIChJTkZSQV9PTihwQWQpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpIHsKKwkJCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNSZXE7CisJCQlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpNc2dFbGVtID0KKwkJCSAgICAoc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0pLAorCQkJCQkJCU1FTV9BTExPQ19GTEFHKTsKKworCQkJaWYgKE1zZ0VsZW0pIHsKKwkJCQlDT1BZX01BQ19BRERSKERpc1JlcS5BZGRyLAorCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJRGlzUmVxLlJlYXNvbiA9IFJFQVNPTl9ERUFVVEhfU1RBX0xFQVZJTkc7CisKKwkJCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKKwkJCQlNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROworCQkJCU1zZ0VsZW0tPk1zZ0xlbiA9CisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpOworCQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwKKwkJCQkJICAgICAgIHNpemVvZgorCQkJCQkgICAgICAgKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSkpOworCisJCQkJLyogUHJldmVudCB0byBjb25uZWN0IEFQIGFnYWluIGluIFNUQU1sbWVQZXJpb2RpY0V4ZWMgKi8KKwkJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsCisJCQkJCSAgICAgICBwQWQtPk1sbWVBdXguCisJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZExlbik7CisKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKKwkJCQlrZnJlZShNc2dFbGVtKTsKKwkJCX0KKworCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKKwkJfQorCisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsCisJCQkJJkNhbmNlbGxlZCk7CisJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsCisJCQkJJkNhbmNlbGxlZCk7CisJfQogCiAJVklSVFVBTF9JRl9ET1dOKHBBZCk7CiAKIAlSVF9NT0RfREVDX1VTRV9DT1VOVCgpOwogCi0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCisJcmV0dXJuIDA7CQkvKiBjbG9zZSBvayAqLwogfQogCiAvKgpAQCAtMTQyLDE2ICsxNjcsMTggQEAKICovCiBpbnQgTWFpblZpcnR1YWxJRl9vcGVuKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOworCisJLyogU2FuaXR5IGNoZWNrIGZvciBwQWQgKi8KIAlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvaworCQlyZXR1cm4gMDsJLyogY2xvc2Ugb2sgKi8KIAogCWlmIChWSVJUVUFMX0lGX1VQKHBBZCkgIT0gMCkKIAkJcmV0dXJuIC0xOwogCi0JLy8gaW5jcmVhc2UgTU9EVUxFIHVzZSBjb3VudAorCS8qIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQgKi8KIAlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOwogCiAJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CkBAIC0xODEsNDA5ICsyMDgsMTYwIEBACiAJCSgzKSBCQSBSZW9yZGVyaW5nOiAJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLWludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KQoraW50IHJ0Mjh4eF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKLSAgICBSVE1QX0FEQVBURVIJKnBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0JQk9PTEVBTiAJCUNhbmNlbGxlZCA9IEZBTFNFOwotCVVJTlQzMgkJCWkgPSAwOwotI2lmZGVmIFJUMjg3MAotCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sodW5saW5rX3dha2V1cCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwlCT09MRUFOIENhbmNlbGxlZDsKKwl1MzIgaSA9IDA7CisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh1bmxpbmtfd2FrZXVwKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4eHhfY2xvc2VcbiIpKTsKIAotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7Ci0KLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAorCUNhbmNlbGxlZCA9IEZBTFNFOworCS8qIFNhbml0eSBjaGVjayBmb3IgcEFkICovCiAJaWYgKHBBZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKKwkJcmV0dXJuIDA7CS8qIGNsb3NlIG9rICovCiAKIAl7Ci0JCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKLQkJLy8gTklDTG9hZEZpcm13YXJlIHdpbGwgaGFuZyBmb3JldmVyIHdoZW4gaW50ZXJmYWNlIGlzIHVwIGFnYWluLgotI2lmZGVmIFJUMjg2MAotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSB8fAotCQkJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2VuZGlmCi0gICAgICAgIHsKLSNpZmRlZiBSVDI4NjAKLQkJICAgIEFzaWNGb3JjZVdha2V1cChwQWQsIFJUTVBfSEFMVCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQkJICAgIEFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotI2VuZGlmCi0gICAgICAgIH0KKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfQ0xPU0UpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWlmIChJTkZSQV9PTihwQWQpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCXsKLQkJCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVAlEaXNSZXE7Ci0JCQlNTE1FX1FVRVVFX0VMRU0gKk1zZ0VsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQotCQkJQ09QWV9NQUNfQUREUihEaXNSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HOwotCi0JCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCU1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQlNc2dFbGVtLT5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOwotCi0JCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7Ci0JCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKLQkJCWtmcmVlKE1zZ0VsZW0pOwotCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOworCQkvKiBJZiBkaXJ2ZXIgZG9lc24ndCB3YWtlIHVwIGZpcm13YXJlIGhlcmUsICovCisJCS8qIE5JQ0xvYWRGaXJtd2FyZSB3aWxsIGhhbmcgZm9yZXZlciB3aGVuIGludGVyZmFjZSBpcyB1cCBhZ2Fpbi4gKi8KKwkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwogCQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0jaWZkZWYgQ0NYX1NVUFBPUlQKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5MZWFwQXV0aFRpbWVyLCAmQ2FuY2VsbGVkKTsKLSNlbmRpZgotCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXIsICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAmQ2FuY2VsbGVkKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVNT1ZFX0lOX1BST0dSRVNTKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogCQlNbG1lUmFkaW9PZmYocEFkKTsKLSNpZmRlZiBSVDI4NjAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKIAkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0jZW5kaWYKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAl9CiAKIAlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKIAotCWZvciAoaSA9IDAgOyBpIDwgTlVNX09GX1RYX1JJTkc7IGkrKykKLQl7Ci0JCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpCi0JCXsKLQkJCXByaW50aygiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKSB7CisJCXdoaWxlIChwQWQtPkRlUXVldWVSdW5uaW5nW2ldID09IFRSVUUpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIldhaXRpbmcgZm9yIFR4UXVldWVbJWRdIGRvbmUuLi4uLi4uLi4uXG4iLAorCQkJCSAgaSkpOwogCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKIAkJfQogCX0KIAotI2lmZGVmIFJUMjg3MAotCS8vIGVuc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgdXJicy4KLQlhZGRfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkvKiBlbnN1cmUgdGhlcmUgYXJlIG5vIG1vcmUgYWN0aXZlIHVyYnMuICovCisJYWRkX3dhaXRfcXVldWUoJnVubGlua193YWtldXAsICZ3YWl0KTsKIAlwQWQtPndhaXQgPSAmdW5saW5rX3dha2V1cDsKIAotCS8vIG1heWJlIHdhaXQgZm9yIGRlbGV0aW9ucyB0byBmaW5pc2guCisJLyogbWF5YmUgd2FpdCBmb3IgZGVsZXRpb25zIHRvIGZpbmlzaC4gKi8KIAlpID0gMDsKLQkvL3doaWxlKChpIDwgMjUpICYmIGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKQotCXdoaWxlKGkgPCAyNSkKLQl7CisJLyp3aGlsZSgoaSA8IDI1KSAmJiBhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgKi8KKwl3aGlsZSAoaSA8IDI1KSB7CiAJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CiAKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCWlmIChwQWQtPlBlbmRpbmdSeCA9PSAwKQotCQl7CisJCWlmIChwQWQtPlBlbmRpbmdSeCA9PSAwKSB7CiAJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAotCQltc2xlZXAoVU5MSU5LX1RJTUVPVVRfTVMpOwkvL1RpbWUgaW4gbWlsbGlzZWNvbmQKKwkJbXNsZWVwKFVOTElOS19USU1FT1VUX01TKTsJLypUaW1lIGluIG1pbGxpc2Vjb25kICovCiAJCWkrKzsKIAl9CiAJcEFkLT53YWl0ID0gTlVMTDsKLQlyZW1vdmVfd2FpdF9xdWV1ZSAoJnVubGlua193YWtldXAsICZ3YWl0KTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdW5saW5rX3dha2V1cCwgJndhaXQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0jaWZkZWYgUlQyODcwCi0JLy8gV2UgbmVlZCBjbGVhciB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGV4aXRzIG9mIHRoZSB0aW1lciB0aHJlYWQuCi0JUlQyODcwX1RpbWVyUV9FeGl0KHBBZCk7Ci0JLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKLQlSVDI4eHhUaHJlYWRUZXJtaW5hdGUocEFkKTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCS8vIFN0b3AgTWxtZSBzdGF0ZSBtYWNoaW5lCisJLyogU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUgKi8KIAlNbG1lSGFsdChwQWQpOwogCi0JLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMgb3IgdGFza2xldHMKLQlraWxsX3RocmVhZF90YXNrKHBBZCk7CisJLyogQ2xvc2UgbmV0IHRhc2tsZXRzICovCisJUnRtcE5ldFRhc2tFeGl0KHBBZCk7CiAKLQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJeworCQlNYWNUYWJsZVJlc2V0KHBBZCk7CisJfQogCiAJTWVhc3VyZVJlcVRhYkV4aXQocEFkKTsKIAlUcGNSZXFUYWJFeGl0KHBBZCk7CiAKLSNpZmRlZiBSVDI4NjAKKwkvKiBDbG9zZSBrZXJuZWwgdGhyZWFkcyAqLworCVJ0bXBNZ210VGFza0V4aXQocEFkKTsKKworI2lmZGVmIFJUTVBfTUFDX1BDSQorCXsKKwkJQk9PTEVBTiBicmM7CisJCS8qICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgICBWYWx1ZTsgKi8KKworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKSB7CisJCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKKwkJfQorCQkvKiBSZWNlaXZlIHBhY2tldHMgdG8gY2xlYXIgRE1BIGluZGV4IGFmdGVyIGRpc2FibGUgaW50ZXJydXB0LiAqLworCQkvKlJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQocEFkKTsgKi8KKwkJLyogcHV0IHRvIHJhZGlvIG9mZiB0byBzYXZlIHBvd2VyIHdoZW4gZHJpdmVyIHVubG9hZC4gIEFmdGVyIHJhZGlvb2ZmLCBjYW4ndCB3cml0ZSAvcmVhZCByZWdpc3Rlci4gIFNvIG5lZWQgdG8gZmluaXNoIGFsbCAqLworCQkvKiByZWdpc3RlciBhY2Nlc3MgYmVmb3JlIFJhZGlvIG9mZi4gKi8KKworCQlicmMgPSBSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBSVE1QX0hBTFQsIDApOworCisvKkluICBzb2x1dGlvbiAzIG9mIDMwOTBGLCB0aGUgYlBDSWNsa09mZiB3aWxsIGJlIHNldCB0byBUUlVFIGFmdGVyIGNhbGxpbmcgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmICovCisJCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOworCisJCWlmIChicmMgPT0gRkFMU0UpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIiVzIGNhbGwgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmIGZhaWwhXG4iLAorCQkJCSAgX19mdW5jX18pKTsKKwkJfQorCX0KKworLyoKIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQogCXsKLQkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOworCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKIAl9CiAKIAkvLyBEaXNhYmxlIFJ4LCByZWdpc3RlciB2YWx1ZSBzdXBwb3NlZCB3aWxsIHJlbWFpbiBhZnRlciByZXNldAogCU5JQ0lzc3VlUmVzZXQocEFkKTsKKyovCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQkvLyBGcmVlIElSUQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQkvLyBEZXJlZ2lzdGVyIGludGVycnVwdCBmdW5jdGlvbgotCQlSVDI4WFhfSVJRX1JFTEVBU0UobmV0X2RldikKKwkvKiBGcmVlIElSUSAqLworCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJLyogRGVyZWdpc3RlciBpbnRlcnJ1cHQgZnVuY3Rpb24gKi8KKwkJUnRtcE9TSVJRUmVsZWFzZShuZXRfZGV2KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKIAl9Ci0jZW5kaWYKLQotCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycworCS8qIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycyAqLwogCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7CiAKLQkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKKwkvKiBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UgKi8KIAliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKIAogCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOwogCi0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi19IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KLQotc3RhdGljIGludCBydDI4eHhfaW5pdChJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLSNpZmRlZiBSVDI4NjAKLQlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IChQUlRNUF9BREFQVEVSKW5ldF9kZXYtPm1sX3ByaXY7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlQUlRNUF9BREFQVEVSIAkJCXBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0jZW5kaWYKLQlVSU5UCQkJCQlpbmRleDsKLQlVQ0hBUgkJCQkJVG1wUGh5OwotCU5ESVNfU1RBVFVTCQkJCVN0YXR1czsKLQlVSU5UMzIgCQlNYWNDc3IwID0gMDsKLQotCS8vIEFsbG9jYXRlIEJBIFJlb3JkZXJpbmcgbWVtb3J5Ci0JYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KHBBZCwgTUFYX1JFT1JERVJJTkdfTVBEVV9OVU0pOwotCi0JLy8gTWFrZSBzdXJlIE1BQyBnZXRzIHJlYWR5LgotCWluZGV4ID0gMDsKLQlkbworLyorKytNb2RpZnkgYnkgd29vZHkgdG8gc29sdmUgdGhlIGJ1bGsgZmFpbCsrKyovCiAJewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0JCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7Ci0KLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKLS8qSXZlcnNvbiBwYXRjaCBQQ0lFIEwxIGlzc3VlICovCi0KLQkvLyBEaXNhYmxlIERNQQotCVJUMjhYWERNQURpc2FibGUocEFkKTsKLQotCS8vIExvYWQgODA1MSBmaXJtd2FyZQotCVN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk5JQ0xvYWRGaXJtd2FyZSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMTsKIAl9CiAKLQlOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcyhwQWQpOwotCi0JLy8gRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmUgd2hpY2ggaXMgYXMgc29vbiBhcyBwb3NzaWJsZQotCS8vIFRoaXMgc3RhdGVtZW50IHNob3VsZCBuZXZlciBiZSB0cnVlLiBXZSBtaWdodCBjb25zaWRlciB0byByZW1vdmUgaXQgbGF0ZXIKLSNpZmRlZiBSVDI4NjAKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCXsKLQkJTklDRGlzYWJsZUludGVycnVwdChwQWQpOwotCX0KLSNlbmRpZgotCi0JU3RhdHVzID0gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQWxsb2NETUFNZW1vcnkgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlnb3RvIGVycjE7Ci0JfQotCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSk7Ci0KLQkvLyBpbml0aWFsaXplIE1MTUUKLQkvLwotCi0JU3RhdHVzID0gTWxtZUluaXQocEFkKTsKLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lSW5pdCBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMjsKLQl9Ci0KLQkvLyBJbml0aWFsaXplIHBBZC0+U3RhQ2ZnLCBwQWQtPkFwQ2ZnLCBwQWQtPkNvbW1vbkNmZyB0byBtYW51ZmFjdHVyZSBkZWZhdWx0Ci0JLy8KLQlVc2VyQ2ZnSW5pdChwQWQpOwotCi0jaWZkZWYgUlQyODcwCi0JLy8gV2UgbmVlZCBpbml0IHRpbWVyUSByZWxhdGVkIHN0cnVjdHVyZSBiZWZvcmUgY3JlYXRlIHRoZSB0aW1lciB0aHJlYWQuCi0JUlQyODcwX1RpbWVyUV9Jbml0KHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQlSVDI4WFhfVEFTS19USFJFQURfSU5JVChwQWQsIFN0YXR1cyk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycjE7Ci0KLQlDZmdJbml0SG9vayhwQWQpOwotCi0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOwotCVRwY1JlcVRhYkluaXQocEFkKTsKLQotCS8vCi0JLy8gSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQKLQkvLwotCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyMzsKLQl9Ci0KLQkvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBDb25maWcgRmlsZQotCVN0YXR1cyA9IFJUTVBSZWFkUGFyYW1ldGVyc0hvb2socEFkKTsKLQotCXByaW50aygiMS4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDUmVhZFJlZ1BhcmFtZXRlcnMgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsU3RhdHVzKSk7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLSNpZmRlZiBSVDI4NzAKLQlwQWQtPkNvbW1vbkNmZy5iTXVsdGlwbGVJUlAgPSBGQUxTRTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iTXVsdGlwbGVJUlApCi0JCXBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQID0gUlhfUklOR19TSVpFOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgPSAxOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLSAgIAkvL0luaXQgQmEgQ2FwYWJpbGl0eSBwYXJhbWV0ZXJzLgotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGU7Ci0JLy8gVVBkYXRhIHRvIEhUIElFCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLQotCXByaW50aygiMi4gUGh5IE1vZGUgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSk7Ci0KLQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKLQlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIG1hYyk7Ci0KLQlwcmludGsoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpOwotCi0JTklDSW5pdEFzaWNGcm9tRUVQUk9NKHBBZCk7IC8vcnQyODYwYgotCi0JLy8gU2V0IFBIWSB0byBhcHByb3ByaWF0ZSBtb2RlCi0JVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKLQlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7Ci0JU2V0Q29tbW9uSFQocEFkKTsKLQotCS8vIE5vIHZhbGlkIGNoYW5uZWxzLgotCWlmIChwQWQtPkNoYW5uZWxMaXN0TnVtID09IDApCi0JewotCQlwcmludGsoIldyb25nIGNvbmZpZ3VyYXRpb24uIE5vIHZhbGlkIGNoYW5uZWwgZm91bmQuIENoZWNrIFwiQ29udHJ5Q29kZVwiIGFuZCBcIkNoYW5uZWxHZW9ncmFwaHlcIiBzZXR0aW5nLlxuIik7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLQlwcmludGsoIk1DUyBTZXQgPSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0sCi0gICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10sIHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0pOwotCi0jaWZkZWYgUlQyODcwCi0gICAgLy9Jbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTQotCU5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycyhwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCi0KLQkJLy8KLQkvLyBJbml0aWFsaXplIFJGIHJlZ2lzdGVyIHRvIGRlZmF1bHQgdmFsdWUKLQkvLwotCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCi0jaWZuZGVmIFJUMjg3MAotCS8vIDgwNTEgZmlybXdhcmUgcmVxdWlyZSB0aGUgc2lnbmFsIGR1cmluZyBib290aW5nIHRpbWUuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweEZGLCAweDAwLCAweDAwKTsKLSNlbmRpZgotCi0JaWYgKHBBZCAmJiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQotCXsKLQkJLy8KLQkJLy8gVW5kbyBldmVyeXRoaW5nIGlmIGl0IGZhaWxlZAotCQkvLwotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCQl7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOwotCQl9Ci0JfQotCWVsc2UgaWYgKHBBZCkKLQl7Ci0JCS8vIE1pY3Jvc29mdCBIQ1QgcmVxdWlyZSBkcml2ZXIgc2VuZCBhIGRpc2Nvbm5lY3QgZXZlbnQgYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLgotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQiFcbiIpKTsKLQotCi0jaWZkZWYgUlQyODcwCi0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpOwotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyk7Ci0KLQkJLy8KLQkJLy8gU3VwcG9ydCBtdWx0aXBsZSBCdWxrSW4gSVJQLAotCQkvLyB0aGUgdmFsdWUgb24gcEFkLT5Db21tb25DZmcuTnVtT2ZCdWxrSW5JUlAgbWF5IGJlIGxhcmdlIHRoYW4gMS4KLQkJLy8KLQkJZm9yKGluZGV4PTA7IGluZGV4PHBBZC0+Q29tbW9uQ2ZnLk51bU9mQnVsa0luSVJQOyBpbmRleCsrKQotCQl7Ci0JCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFVTQkJ1bGtSZWNlaXZlIVxuIiApKTsKLQkJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCX0vLyBlbmQgb2YgZWxzZQotCi0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8PT09PSBSVE1QSW5pdGlhbGl6ZSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKLQotCXJldHVybiBUUlVFOwotCi0KLWVycjQ6Ci1lcnIzOgotCU1sbWVIYWx0KHBBZCk7Ci1lcnIyOgotCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKLWVycjE6Ci0Jb3NfZnJlZV9tZW0ocEFkLCBwQWQtPm1wZHVfYmxrX3Bvb2wubWVtKTsgLy8gZnJlZSBCQSBwb29sCi0JUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpOwotCi0JLy8gc2hhbGwgbm90IHNldCBtbF9wcml2IHRvIE5VTEwgaGVyZSBiZWNhdXNlIHRoZSBtbF9wcml2IGRpZG4ndCBiZWVuIGZyZWUgeWV0LgotCS8vbmV0X2Rldi0+bWxfcHJpdiA9IDA7Ci0KLQlwcmludGsoIiEhISAlcyBJbml0aWFsaXplZCBmYWlsICEhIVxuIiwgUlQyOHh4X0NISVBfTkFNRSk7Ci0JcmV0dXJuIEZBTFNFOwotfSAvKiBFbmQgb2YgcnQyOHh4X2luaXQgKi8KLQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyOHh4X2Nsb3NlXG4iKSk7CisJcmV0dXJuIDA7CQkvKiBjbG9zZSBvayAqLworfQkJCQkvKiBFbmQgb2YgcnQyOHh4X2Nsb3NlICovCiAKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTYwMCwyMzQgKzM3OCwxMTYgQEAKIE5vdGU6CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1pbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQoraW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OwotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCWludCByZXR2YWwgPSAwOwotIAlQT1NfQ09PS0lFIHBPYmo7CisJLypzdHJ1Y3Qgb3NfY29va2llICpwT2JqOyAqLwogCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKIAotCS8vIFNhbml0eSBjaGVjayBmb3IgcEFkCi0JaWYgKHBBZCA9PSBOVUxMKQotCXsKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIHBBZCAqLworCWlmIChwQWQgPT0gTlVMTCkgewogCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwogCQkgICBTbyB0aGUgbmV0X2Rldi0+bWxfcHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KIAkJcmV0dXJuIC0xOwogCX0KIAotCS8vIEluaXQKLSAJcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOworCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKSB7CisJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPQorCQkJICAgIChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCX0KKwkvKiBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIFBDSSBkZXZpY2UgKi8KKwkvKiByZWdpc3RlciB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2l0aCB0aGUgb3MgKi8KKwlSdG1wT1NJUlFSZXF1ZXN0KG5ldF9kZXYpOwogCi0JLy8gcmVzZXQgQWRhcHRlciBmbGFncwotCVJUTVBfQ0xFQVJfRkxBR1MocEFkKTsKKwkvKiBJbml0IElSUSBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBwQWQgKi8KKwlSVE1QX0lSUV9JTklUKHBBZCk7CiAKLQkvLyBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIFBDSSBkZXZpY2UKLQkvLyByZWdpc3RlciB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2l0aCB0aGUgb3MKLQlSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2Rldik7Ci0KLQotCS8vIEluaXQgQnNzVGFiICYgQ2hhbm5lbEluZm8gdGFiYmxlcyBmb3IgYXV0byBjaGFubmVsIHNlbGVjdC4KLQotCi0JLy8gQ2hpcCAmIG90aGVyIGluaXQKLQlpZiAocnQyOHh4X2luaXQobmV0X2RldikgPT0gRkFMU0UpCisJLyogQ2hpcCAmIG90aGVyIGluaXQgKi8KKwlpZiAocnQyOHh4X2luaXQocEFkLCBtYWMsIGhvc3RuYW1lKSA9PSBGQUxTRSkKIAkJZ290byBlcnI7CiAKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLmRldl9uYW1lLCBuZXRfZGV2LT5uYW1lLCBzdHJsZW4obmV0X2Rldi0+bmFtZSkpOworCS8qIEVuYWJsZSBJbnRlcnJ1cHQgKi8KKwlSVE1QX0lSUV9FTkFCTEUocEFkKTsKIAotCS8vIFNldCB1cCB0aGUgTWFjIGFkZHJlc3MKLQlOZGlzTW92ZU1lbW9yeShuZXRfZGV2LT5kZXZfYWRkciwgKHZvaWQgKikgcEFkLT5DdXJyZW50QWRkcmVzcywgNik7Ci0KLQkvLyBJbml0IElSUSBwYXJhbWV0ZXJzCi0JUlQyOFhYX0lSUV9JTklUKHBBZCk7Ci0KLQkvLyBWYXJpb3VzIEFQIGZ1bmN0aW9uIGluaXQKLQotCS8vIEVuYWJsZSBJbnRlcnJ1cHQKLQlSVDI4WFhfSVJRX0VOQUJMRShwQWQpOwotCi0JLy8gTm93IEVuYWJsZSBSeFR4CisJLyogTm93IEVuYWJsZSBSeFR4ICovCiAJUlRNUEVuYWJsZVJ4VHgocEFkKTsKIAlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7CiAKIAl7Ci0JVUlOVDMyIHJlZyA9IDA7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOyAgLy8gY2xlYXIgZ2FyYmFnZSBpbnRlcnJ1cHRzCi0JcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOworCQl1MzIgcmVnID0gMDsKKwkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEzMDAsICZyZWcpOwkvKiBjbGVhciBnYXJiYWdlIGludGVycnVwdHMgKi8KKwkJcHJpbnRrKCIweDEzMDAgPSAlMDh4XG4iLCByZWcpOwogCX0KIAotI2lmZGVmIFJUMjg2MAotICAgICAgICBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKHBBZCk7Ci0jZW5kaWYKKwl7CisvKiAgICAgIHUzMiByZWc7ICovCisvKiAgICAgIHU4ICBieXRlOyAqLworLyogICAgICB1MTYgdG1wOyAqLworCisvKiAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgWElGU19USU1FX0NGRywgJnJlZyk7ICovCisKKy8qICAgICAgdG1wID0gMHgwODA1OyAqLworLyogICAgICByZWcgID0gKHJlZyAmIDB4ZmZmZjAwMDApIHwgdG1wOyAqLworLyogICAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBYSUZTX1RJTUVfQ0ZHLCByZWcpOyAqLworCisJfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCVJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUocEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwogCXJldHVybiAocmV0dmFsKTsKIAogZXJyOgorLyorKytBZGQgYnkgc2hpYW5nLCBtb3ZlIGZyb20gcnQyOHh4X2luaXQoKSB0byBoZXJlLiAqLworCVJ0bXBPU0lSUVJlbGVhc2UobmV0X2Rldik7CisvKi0tLUFkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBydDI4eHhfaW5pdCgpIHRvIGhlcmUuICovCiAJcmV0dXJuICgtMSk7Ci19IC8qIEVuZCBvZiBydDI4eHhfb3BlbiAqLworfQkJCQkvKiBFbmQgb2YgcnQyOHh4X29wZW4gKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydDI4NjBfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4JCT0gTWFpblZpcnR1YWxJRl9vcGVuLAotCS5uZG9fc3RvcAkJPSBNYWluVmlydHVhbElGX2Nsb3NlLAotCS5uZG9fZG9faW9jdGwJCT0gcnQyOHh4X3N0YV9pb2N0bCwKLQkubmRvX2dldF9zdGF0cwkJPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzLAotCS5uZG9fdmFsaWRhdGVfYWRkcgk9IE5VTEwsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCi0JLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAotCS5uZG9fc3RhcnRfeG1pdAkJPSBydDI4eHhfc2VuZF9wYWNrZXRzLAorCS5uZG9fb3BlbiA9IE1haW5WaXJ0dWFsSUZfb3BlbiwKKwkubmRvX3N0b3AgPSBNYWluVmlydHVhbElGX2Nsb3NlLAorCS5uZG9fZG9faW9jdGwgPSBydDI4eHhfc3RhX2lvY3RsLAorCS5uZG9fZ2V0X3N0YXRzID0gUlQyOHh4X2dldF9ldGhlcl9zdGF0cywKKwkubmRvX3ZhbGlkYXRlX2FkZHIgPSBOVUxMLAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gZXRoX21hY19hZGRyLAorCS5uZG9fY2hhbmdlX210dSA9IGV0aF9jaGFuZ2VfbXR1LAorCS5uZG9fc3RhcnRfeG1pdCA9IHJ0Mjh4eF9zZW5kX3BhY2tldHMsCiB9OwogCi0vKiBNdXN0IG5vdCBiZSBjYWxsZWQgZm9yIG1kZXYgYW5kIGFwZGV2ICovCi1zdGF0aWMgTkRJU19TVEFUVVMgcnRfaWVlZTgwMjExX2lmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFBSVE1QX0FEQVBURVIgcEFkKQorc3RydWN0IG5ldF9kZXZpY2UgKlJ0bXBQaHlOZXREZXZJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9ydG1wX29zX25ldGRldl9vcF9ob29rICpwTmV0RGV2SG9vaykKIHsKLQlORElTX1NUQVRVUyBTdGF0dXM7Ci0JSU5UICAgICBpPTA7Ci0JQ0hBUiAgICBzbG90X25hbWVbSUZOQU1TSVpdOwotCXN0cnVjdCBuZXRfZGV2aWNlICAgKmRldmljZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IE5VTEw7CisvKiAgICAgIGludCAgICAgICAgICAgICBTdGF0dXM7ICovCiAKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmcnQyOHh4X2l3X2hhbmRsZXJfZGVmOworCW5ldF9kZXYgPQorCSAgICBSdG1wT1NOZXREZXZDcmVhdGUocEFkLCBJTlRfTUFJTiwgMCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiksCisJCQkgICAgICAgSU5GX01BSU5fREVWX05BTUUpOworCWlmIChuZXRfZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrCisJCSAgICAoIlJ0bXBQaHlOZXREZXZJbml0KCk6IGNyZWF0aW9uIGZhaWxlZCBmb3IgbWFpbiBwaHlzaWNhbCBuZXQgZGV2aWNlIVxuIik7CisJCXJldHVybiBOVUxMOwogCX0KIAotCWRldi0+cHJpdl9mbGFncyA9IElOVF9NQUlOOwotCWRldi0+bmV0ZGV2X29wcyA9ICZydDI4NjBfbmV0ZGV2X29wczsKLQkvLyBmaW5kIGF2YWlsYWJsZSBkZXZpY2UgbmFtZQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JewotCQlzcHJpbnRmKHNsb3RfbmFtZSwgIndsYW4lZCIsIGkpOworCU5kaXNaZXJvTWVtb3J5KCh1bnNpZ25lZCBjaGFyICopcE5ldERldkhvb2ssCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2spKTsKKwlwTmV0RGV2SG9vay0+bmV0ZGV2X29wcyA9ICZydDI4NjBfbmV0ZGV2X29wczsKKwlwTmV0RGV2SG9vay0+cHJpdl9mbGFncyA9IElOVF9NQUlOOworCXBOZXREZXZIb29rLT5uZWVkUHJvdGN0ZWQgPSBGQUxTRTsKIAotCQlkZXZpY2UgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChkZXYpLCBzbG90X25hbWUpOwotCQlpZiAoZGV2aWNlICE9IE5VTEwpCi0JCQlkZXZfcHV0KGRldmljZSk7Ci0KLQkJaWYgKGRldmljZSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYoaSA9PSA4KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTm8gYXZhaWxhYmxlIHNsb3QgbmFtZVxuIikpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQllbHNlCi0JewotCQlzcHJpbnRmKGRldi0+bmFtZSwgIndsYW4lZCIsIGkpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQotCXJldHVybiBTdGF0dXM7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLQlfZGV2X2lkX3AJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UgSUQKLQotUmV0dXJuIFZhbHVlOgotICAgIDAJCQkJCVByb2JlIE9LCi0JLUVOT0RFVgkJCQlQcm9iZSBGYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgX19kZXZpbml0ICAgcnQyOHh4X3Byb2JlKAotICAgIElOICB2b2lkICpfZGV2X3AsCi0gICAgSU4gIHZvaWQgKl9kZXZfaWRfcCwKLQlJTiAgVUlOVCBhcmdjLAotCU9VVCBQUlRNUF9BREFQVEVSICpwcEFkKQotewotICAgIHN0cnVjdCAgbmV0X2RldmljZQkqbmV0X2RldjsKLSAgICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCA9IChQUlRNUF9BREFQVEVSKSBOVUxMOwotICAgIElOVCAgICAgICAgICAgICAgICAgc3RhdHVzOwotCVBWT0lECQkJCWhhbmRsZTsKLSNpZmRlZiBSVDI4NjAKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2X3AgPSAoc3RydWN0IHBjaV9kZXYgKilfZGV2X3A7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKV9kZXZfcDsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2X3AgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCi0JZGV2X3AgPSB1c2JfZ2V0X2RldihkZXZfcCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTVEEgRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOwotCi0gICAgbmV0X2RldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihQUlRNUF9BREFQVEVSKSk7Ci0gICAgaWYgKG5ldF9kZXYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50aygiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7Ci0KLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KKwluZXRfZGV2LT5tbF9wcml2ID0gKHZvaWQgKilwQWQ7CisJcEFkLT5uZXRfZGV2ID0gbmV0X2RldjsKIAogCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CiAKLS8qIGZvciBzdXBwb3J0aW5nIE5ldHdvcmsgTWFuYWdlciAqLwotLyogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZQotICogaWYgc2V0IHByaW9yIHRvIHJlZ2lzdHJhdGlvbiB3aWxsIGNhdXNlIGEgc3ltbGluayBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCi0gKi8KLSAgICBTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKGRldl9wLT5kZXYpKTsKKwlyZXR1cm4gbmV0X2RldjsKIAotCS8vIEFsbG9jYXRlIFJUTVBfQURBUFRFUiBtaW5pcG9ydCBhZGFwdGVyIHN0cnVjdHVyZQotCWhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19jb29raWUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpCi0JCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjs7Ci0JUlQyOFhYX0hBTkRMRV9ERVZfQVNTSUdOKGhhbmRsZSwgZGV2X3ApOwotCi0Jc3RhdHVzID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7Ci0JaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7Ci0KLQluZXRfZGV2LT5tbF9wcml2ID0gKFBWT0lEKXBBZDsKLSAgICBwQWQtPm5ldF9kZXYgPSBuZXRfZGV2OyAvLyBtdXN0IGJlIGJlZm9yZSBSVDI4WFhOZXREZXZJbml0KCkKLQotCVJUMjhYWE5ldERldkluaXQoX2Rldl9wLCBuZXRfZGV2LCBwQWQpOwotCi0gICAgcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7Ci0KLQkvLyBQb3N0IGNvbmZpZwotCWlmIChSVDI4WFhQcm9iZVBvc3RDb25maWcoX2Rldl9wLCBwQWQsIDApID09IEZBTFNFKQotCQlnb3RvIGVycl9vdXRfdW5tYXA7Ci0KLQlwQWQtPk9wTW9kZSA9IE9QTU9ERV9TVEE7Ci0KLQkvLyBzYW1wbGUgbW92ZQotCWlmIChydF9pZWVlODAyMTFfaWZfc2V0dXAobmV0X2RldiwgcEFkKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycl9vdXRfdW5tYXA7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGlzIGRldmljZQotICAgIHN0YXR1cyA9IHJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKLSAgICBpZiAoc3RhdHVzKQotICAgICAgICBnb3RvIGVycl9vdXRfdW5tYXA7Ci0KLSAgICAvLyBTZXQgZHJpdmVyIGRhdGEKLQlSVDI4WFhfRFJWREFUQV9TRVQoX2Rldl9wKTsKLQotCSpwcEFkID0gcEFkOwotICAgIHJldHVybiAwOyAvLyBwcm9iZSBvawotCi0KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotZXJyX291dF91bm1hcDoKLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQlSVDI4WFhfVU5NQVAoKTsKLQotZXJyX291dF9mcmVlX25ldGRldjoKLQlmcmVlX25ldGRldihuZXRfZGV2KTsKLQotZXJyX291dDoKLQlSVDI4WFhfUFVUX0RFVklDRShkZXZfcCk7Ci0KLQlyZXR1cm4gLUVOT0RFVjsgLyogcHJvYmUgZmFpbCAqLwotfSAvKiBFbmQgb2YgcnQyOHh4X3Byb2JlICovCi0KK30KIAogLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtODQ5LDM2ICs1MDksMzIgQEAKIGludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHNrYi0+ZGV2OwotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCWludCBzdGF0dXMgPSBORVRERVZfVFhfT0s7Ci0JUE5ESVNfUEFDS0VUIHBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKSBza2I7CisJdm9pZCAqcFBhY2tldCA9ICh2b2lkICopc2tiOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCS8qIFJUMjg3MFNUQSBkb2VzIHRoaXMgaW4gUlRNUFNlbmRQYWNrZXRzKCkgKi8KIAogCXsKLQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2Ugd2UgYXJlIGluIG1vbml0b3IgbW9kZQotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQl7CisJCS8qIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHdlIGFyZSBpbiBtb25pdG9yIG1vZGUgKi8KKwkJaWYgKE1PTklUT1JfT04ocEFkKSkgewogCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJZ290byBkb25lOwogCQl9CiAJfQogCi0gICAgICAgIC8vIEVhcG9sU3RhcnQgc2l6ZSBpcyAxOAotCWlmIChza2ItPmxlbiA8IDE0KQotCXsKLQkJLy9wcmludGsoImJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIHBrdC0+bGVuKTsKKwkvKiBFYXBvbFN0YXJ0IHNpemUgaXMgMTggKi8KKwlpZiAoc2tiLT5sZW4gPCAxNCkgeworCQkvKnByaW50aygiYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgcGt0LT5sZW4pOyAqLwogCQloZXhfZHVtcCgiYmFkIHBhY2tldCIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDApOwotI2lmZGVmIENPTkZJR181VlRfRU5IQU5DRQotICAgIGlmICgqKGludCopKHNrYi0+Y2IpID09IEJSSURHRV9UQUcpIHsKLQkJUlRNUF9TRVRfUEFDS0VUXzVWVChwUGFja2V0LCAxKTsKLSAgICB9Ci0jZW5kaWYKLQotCVNUQVNlbmRQYWNrZXRzKChORElTX0hBTkRMRSlwQWQsIChQUE5ESVNfUEFDS0VUKSAmcFBhY2tldCwgMSk7CisJU1RBU2VuZFBhY2tldHMoKHZvaWQgKilwQWQsICh2b2lkICoqKSYgcFBhY2tldCwgMSk7CiAKIAlzdGF0dXMgPSBORVRERVZfVFhfT0s7CiBkb25lOgpAQCAtODg2LDcgKzU0Miw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtOTAzLDcyICs1NTgsNjkgQEAKIE5vdGU6CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1JTlQgcnQyOHh4X3NlbmRfcGFja2V0cygKLQlJTiBzdHJ1Y3Qgc2tfYnVmZiAJCSpza2JfcCwKLQlJTiBzdHJ1Y3QgbmV0X2RldmljZSAJKm5ldF9kZXYpCitzdGF0aWMgaW50IHJ0Mjh4eF9zZW5kX3BhY2tldHMoSU4gc3RydWN0IHNrX2J1ZmYgKnNrYl9wLAorCQkJICAgICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQogewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpCi0JewotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgKFBORElTX1BBQ0tFVClza2JfcCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgbmV0X2Rldik7CisKKwlpZiAoIShuZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsICh2b2lkICopc2tiX3AsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnNrYl9wLT5jYltDQl9PRkZdLCAxNSk7CisJTmRpc1plcm9NZW1vcnkoKHU4ICopJiBza2JfcC0+Y2JbQ0JfT0ZGXSwgMTUpOwogCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChza2JfcCwgTUFJTl9NQlNTSUQpOwogCiAJcmV0dXJuIHJ0Mjh4eF9wYWNrZXRfeG1pdChza2JfcCk7Cit9CiAKLX0gLyogRW5kIG9mIE1CU1NfVmlydHVhbElGX1BhY2tldFNlbmQgKi8KLQotCi0KLQotdm9pZCBDZmdJbml0SG9vayhQUlRNUF9BREFQVEVSIHBBZCkKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBxdWVyeSAvcHJvYyAqLworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0JcEFkLT5iQnJvYWRDb21IVCA9IFRSVUU7Ci19IC8qIEVuZCBvZiBDZmdJbml0SG9vayAqLworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CiAKLQotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IG5ldF9kZXYtPm1sX3ByaXY7Ci0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgicnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAtLS0+XG4iKSk7CiAKLQlwQWQtPml3X3N0YXRzLnN0YXR1cyA9IDA7IC8vIFN0YXR1cyAtIGRldmljZSBkZXBlbmRlbnQgZm9yIG5vdworCXBBZC0+aXdfc3RhdHMuc3RhdHVzID0gMDsJLyogU3RhdHVzIC0gZGV2aWNlIGRlcGVuZGVudCBmb3Igbm93ICovCiAKLQkvLyBsaW5rIHF1YWxpdHkKLQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9ICgocEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ICogMTIpLzEwICsgMTApOwotCWlmKHBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID4gMTAwKQorCS8qIGxpbmsgcXVhbGl0eSAqLworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQorCQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9CisJCSAgICAoKHBBZC0+TWxtZS5DaGFubmVsUXVhbGl0eSAqIDEyKSAvIDEwICsgMTApOworCisJaWYgKHBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID4gMTAwKQogCQlwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA9IDEwMDsKIAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQlwQWQtPml3X3N0YXRzLnF1YWwubGV2ZWwgPSBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOworCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSB7CisJCXBBZC0+aXdfc3RhdHMucXVhbC5sZXZlbCA9CisJCSAgICBSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAorCQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLAorCQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKKwl9CiAKLQlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgPSBwQWQtPkJicFdyaXRlTGF0Y2hbNjZdOyAvLyBub2lzZSBsZXZlbCAoZEJtKQorCXBBZC0+aXdfc3RhdHMucXVhbC5ub2lzZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFs2Nl07CS8qIG5vaXNlIGxldmVsIChkQm0pICovCiAKIAlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgKz0gMjU2IC0gMTQzOwotCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsgICAgIC8vIEZsYWdzIHRvIGtub3cgaWYgdXBkYXRlZAorCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkID0gMTsJLyogRmxhZ3MgdG8ga25vdyBpZiB1cGRhdGVkICovCiAjaWZkZWYgSVdfUVVBTF9EQk0KLQlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLy8gTGV2ZWwgKyBOb2lzZSBhcmUgZEJtCi0jZW5kaWYgLy8gSVdfUVVBTF9EQk0gLy8KKwlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX0RCTTsJLyogTGV2ZWwgKyBOb2lzZSBhcmUgZEJtICovCisjZW5kaWYgLyogSVdfUVVBTF9EQk0gLy8gKi8KIAotCXBBZC0+aXdfc3RhdHMuZGlzY2FyZC5ud2lkID0gMDsgICAgIC8vIFJ4IDogV3JvbmcgbndpZC9lc3NpZAotCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOyAgICAgIC8vIE1pc3NlZCBiZWFjb25zL3N1cGVyZnJhbWUKKwlwQWQtPml3X3N0YXRzLmRpc2NhcmQubndpZCA9IDA7CS8qIFJ4IDogV3JvbmcgbndpZC9lc3NpZCAqLworCXBBZC0+aXdfc3RhdHMubWlzcy5iZWFjb24gPSAwOwkvKiBNaXNzZWQgYmVhY29ucy9zdXBlcmZyYW1lICovCiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHNcbiIpKTsKIAlyZXR1cm4gJnBBZC0+aXdfc3RhdHM7Ci19IC8qIEVuZCBvZiBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzICovCi0KLQorfQogCiB2b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0jZGVmaW5lIE1BWF9UWF9JTl9UQlRUCQkoMTYpCisvKiNkZWZpbmUgTUFYX1RYX0lOX1RCVFQgICAgICAgICAgICAgICAgKDE2KSAqLwogCiB9CiAKQEAgLTk4OCwxOSArNjQwLDIwIEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKLSAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlJUMjh4eF9nZXRfZXRoZXJfc3RhdHMoSU4gc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICAqbmV0X2RldikKIHsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IE5VTEw7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAogCWlmIChuZXRfZGV2KQotCQlwQWQgPSBuZXRfZGV2LT5tbF9wcml2OworCQlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIG5ldF9kZXYpOwogCi0JaWYgKHBBZCkKLQl7CisJaWYgKHBBZCkgewogCi0JCXBBZC0+c3RhdHMucnhfcGFja2V0cyA9IHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLQkJcEFkLT5zdGF0cy50eF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnJ4X3BhY2tldHMgPQorCQkgICAgcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OworCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPQorCQkgICAgcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwogCiAJCXBBZC0+c3RhdHMucnhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50OwogCQlwQWQtPnN0YXRzLnR4X2J5dGVzID0gcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudDsKQEAgLTEwMTEsMzAgKzY2NCw3MyBAQAogCQlwQWQtPnN0YXRzLnJ4X2Ryb3BwZWQgPSAwOwogCQlwQWQtPnN0YXRzLnR4X2Ryb3BwZWQgPSAwOwogCi0JICAgIHBBZC0+c3RhdHMubXVsdGljYXN0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OyAgIC8vIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCi0JICAgIHBBZC0+c3RhdHMuY29sbGlzaW9ucyA9IHBBZC0+Q291bnRlcnM4MDIzLk9uZUNvbGxpc2lvbiArIHBBZC0+Q291bnRlcnM4MDIzLk1vcmVDb2xsaXNpb25zOyAgLy8gQ29sbGlzaW9uIHBhY2tldHMKKwkJcEFkLT5zdGF0cy5tdWx0aWNhc3QgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCisJCXBBZC0+c3RhdHMuY29sbGlzaW9ucyA9IHBBZC0+Q291bnRlcnM4MDIzLk9uZUNvbGxpc2lvbiArIHBBZC0+Q291bnRlcnM4MDIzLk1vcmVDb2xsaXNpb25zOwkvKiBDb2xsaXNpb24gcGFja2V0cyAqLwogCi0JICAgIHBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cKLQkgICAgcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsvL3BBZC0+V2xhbkNvdW50ZXJzLkZDU0Vycm9yQ291bnQ7ICAgICAvLyByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUmN2QWxpZ25tZW50RXJyb3JzOyAgICAgICAgICAvLyByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yCi0JICAgIHBBZC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOyAgICAgICAgICAgICAgICAgICAvLyByZWN2J3IgZmlmbyBvdmVycnVuCi0JICAgIHBBZC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlciBtaXNzZWQgcGFja2V0CisJCXBBZC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IDA7CisJCXBBZC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SeE5vQnVmZmVyOwkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgKi8KKwkJcEFkLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gMDsJLypwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50OyAgICAgLy8gcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvciAqLworCQlwQWQtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJjdkFsaWdubWVudEVycm9yczsJLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworCQlwQWQtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsJLyogcmVjdidyIGZpZm8gb3ZlcnJ1biAqLworCQlwQWQtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAwOwkvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0ICovCiAKLQkgICAgLy8gZGV0YWlsZWQgdHhfZXJyb3JzCi0JICAgIHBBZC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IDA7CisJCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCQlwQWQtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gMDsKKwkJcEFkLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IDA7CisJCXBBZC0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSAwOworCQlwQWQtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCQlwQWQtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAwOwogCi0JICAgIC8vIGZvciBjc2xpcCBldGMKLQkgICAgcEFkLT5zdGF0cy5yeF9jb21wcmVzc2VkID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9jb21wcmVzc2VkID0gMDsKKwkJLyogZm9yIGNzbGlwIGV0YyAqLworCQlwQWQtPnN0YXRzLnJ4X2NvbXByZXNzZWQgPSAwOworCQlwQWQtPnN0YXRzLnR4X2NvbXByZXNzZWQgPSAwOwogCiAJCXJldHVybiAmcEFkLT5zdGF0czsKLQl9Ci0JZWxzZQotICAgIAlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJcmV0dXJuIE5VTEw7CiB9CiAKK0JPT0xFQU4gUnRtcFBoeU5ldERldkV4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKworCS8qIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgKi8KKwlpZiAobmV0X2RldiAhPSBOVUxMKSB7CisJCXByaW50aworCQkgICAgKCJSdG1wT1NOZXREZXZEZXRhY2goKTogUnRtcE9TTmV0RGV2aWNlRGV0YWNoKCksIGRldi0+bmFtZT0lcyFcbiIsCisJCSAgICAgbmV0X2Rldi0+bmFtZSk7CisJCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKKworfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciBjb250cm9sIGJsb2NrLgorCitBcmd1bWVudHM6CisgICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCisKK1JldHVybiBWYWx1ZToKKwlORElTX1NUQVRVU19TVUNDRVNTCisJTkRJU19TVEFUVVNfRkFJTFVSRQorCU5ESVNfU1RBVFVTX1JFU09VUkNFUworCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KHZvaWQgKmhhbmRsZSwgdm9pZCAqKiBwcEFkKQoreworCisJKnBwQWQgPSAodm9pZCAqKXZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsJLypwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBzaXplb2Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciksIHBoeV9hZGRyKTsgKi8KKworCWlmICgqcHBBZCkgeworCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIpKTsKKwkJKChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopKiBwcEFkKS0+T1NfQ29va2llID0gaGFuZGxlOworCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCX0gZWxzZSB7CisJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wY2lfcmJ1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTBhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3BjaV9yYnVzLmMKQEAgLTAsMCArMSw4NDAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgTW9kdWxlIE5hbWU6CisgICAgcnRfcGNpX3JidXMuYworCisgICAgQWJzdHJhY3Q6CisgICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KKworICAgIFJldmlzaW9uIEhpc3Rvcnk6CisgICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKKyAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitJUlFfSEFORExFX1RZUEUgcnQyODYwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworCitzdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMwX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhYzJfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgYWMzX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTeW1ib2wgJiBNYWNybyBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFJUMjg2MF9JTlRfUlhfRExZCQkJCSgxPDwwKQkvKiBiaXQgMCAqLworI2RlZmluZSBSVDI4NjBfSU5UX1RYX0RMWQkJCQkoMTw8MSkJLyogYml0IDEgKi8KKyNkZWZpbmUgUlQyODYwX0lOVF9SWF9ET05FCQkJCSgxPDwyKQkvKiBiaXQgMiAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORQkJCSgxPDwzKQkvKiBiaXQgMyAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORQkJCSgxPDw0KQkvKiBiaXQgNCAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDMl9ETUFfRE9ORQkJCSgxPDw1KQkvKiBiaXQgNSAqLworI2RlZmluZSBSVDI4NjBfSU5UX0FDM19ETUFfRE9ORQkJCSgxPDw2KQkvKiBiaXQgNiAqLworI2RlZmluZSBSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUJCSgxPDw3KQkvKiBiaXQgNyAqLworI2RlZmluZSBSVDI4NjBfSU5UX01HTVRfRE9ORQkJCSgxPDw4KQkvKiBiaXQgOCAqLworCisjZGVmaW5lIElOVF9SWAkJCVJUMjg2MF9JTlRfUlhfRE9ORQorCisjZGVmaW5lIElOVF9BQzBfRExZCQkoUlQyODYwX0lOVF9BQzBfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX0FDMV9ETFkJCShSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORSkJLyp8IFJUMjg2MF9JTlRfVFhfRExZKSAqLworI2RlZmluZSBJTlRfQUMyX0RMWQkJKFJUMjg2MF9JTlRfQUMyX0RNQV9ET05FKQkvKnwgUlQyODYwX0lOVF9UWF9ETFkpICovCisjZGVmaW5lIElOVF9BQzNfRExZCQkoUlQyODYwX0lOVF9BQzNfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX0hDQ0FfRExZCShSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUpCS8qfCBSVDI4NjBfSU5UX1RYX0RMWSkgKi8KKyNkZWZpbmUgSU5UX01HTVRfRExZCVJUMjg2MF9JTlRfTUdNVF9ET05FCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCUludGVyZmFjZS1kZXBlbmRlZCBtZW1vcnkgYWxsb2NhdGlvbi9GcmVlIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgkJTWFpbmx5IGZvciBIYXJkd2FyZSBUeERlc2MvUnhEZXNjL01nbXREZXNjLCBETUEgTWVtb3J5IGZvciBUeERhdGEvUnhEYXRhLCBldGMuLAorICAqCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gZm9yIFR4RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTMyIEluZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgICAgIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkgICAgICAgZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJKlZpcnR1YWxBZGRyZXNzID0KKwkgICAgKHZvaWQgKilwY2lfYWxsb2NfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBzaXplb2YoY2hhcikgKiBMZW5ndGgsCisJCQkJCSBQaHlzaWNhbEFkZHJlc3MpOworCit9CisKKy8qIEZ1bmN0aW9uIGZvciBNZ210RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCSB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCSBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKworLyogRnVuY3Rpb24gZm9yIFJ4RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7CisKK30KKworLyogRnVuY3Rpb24gZm9yIGZyZWUgYWxsb2NhdGVkIERlc2MgTWVtb3J5LiAqLwordm9pZCBSVE1QX0ZyZWVEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSB2b2lkICpWaXJ0dWFsQWRkcmVzcywKKwkJCSBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBQaHlzaWNhbEFkZHJlc3MpOworfQorCisvKiBGdW5jdGlvbiBmb3IgVHhEYXRhIERNQSBNZW1vcnkgYWxsb2NhdGlvbi4gKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUzMiBJbmRleCwKKwkJCQl1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQlJTiBCT09MRUFOIENhY2hlZCwKKwkJCQl2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCWRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCSpWaXJ0dWFsQWRkcmVzcyA9CisJICAgICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2Rldiwgc2l6ZW9mKGNoYXIpICogTGVuZ3RoLAorCQkJCQkgUGh5c2ljYWxBZGRyZXNzKTsKK30KKwordm9pZCBSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICB2b2lkICpWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcykKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldiwgTGVuZ3RoLCBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICBQaHlzaWNhbEFkZHJlc3MpOworfQorCisvKgorICogRlVOQ1RJT046IEFsbG9jYXRlIGEgY29tbW9uIGJ1ZmZlciBmb3IgRE1BCisgKiBBUkdVTUVOVFM6CisgKiAgICAgQWRhcHRlckhhbmRsZTogIEFkYXB0ZXJIYW5kbGUKKyAqICAgICBMZW5ndGg6ICBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqICAgICBDYWNoZWQ6ICBXaGV0aGVyIG9yIG5vdCB0aGUgbWVtb3J5IGNhbiBiZSBjYWNoZWQKKyAqICAgICBWaXJ0dWFsQWRkcmVzczogIFBvaW50ZXIgdG8gbWVtb3J5IGlzIHJldHVybmVkIGhlcmUKKyAqICAgICBQaHlzaWNhbEFkZHJlc3M6ICBQaHlzaWNhbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdmlydHVhbCBhZGRyZXNzCisgKi8KK3ZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKwkqVmlydHVhbEFkZHJlc3MgPQorCSAgICAodm9pZCAqKXBjaV9hbGxvY19jb25zaXN0ZW50KHBPYmotPnBjaV9kZXYsIHNpemVvZihjaGFyKSAqIExlbmd0aCwKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7Cit9CisKKy8qCisgKiBGVU5DVElPTjogQWxsb2NhdGUgYSBwYWNrZXQgYnVmZmVyIGZvciBETUEKKyAqIEFSR1VNRU5UUzoKKyAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQorICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAorICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQorICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKKyAqIE5vdGVzOgorICogICAgIENhY2hlZCBpcyBpZ25vcmVkOiBhbHdheXMgY2FjaGVkIG1lbW9yeQorICovCit2b2lkICpSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJCSBJTiBCT09MRUFOIENhY2hlZCwKKwkJCQkJIHZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJCSBPVVQgZG1hX2FkZHJfdCAqCisJCQkJCSBQaHlzaWNhbEFkZHJlc3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnBrdDsKKworCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKKworCWlmIChwa3QgPT0gTlVMTCkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoImNhbid0IGFsbG9jYXRlIHJ4ICVsZCBzaXplIHBhY2tldFxuIiwgTGVuZ3RoKSk7CisJfQorCisJaWYgKHBrdCkgeworCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKKwkJKlZpcnR1YWxBZGRyZXNzID0gKHZvaWQgKilwa3QtPmRhdGE7CisJCSpQaHlzaWNhbEFkZHJlc3MgPQorCQkgICAgUENJX01BUF9TSU5HTEUocEFkLCAqVmlydHVhbEFkZHJlc3MsIExlbmd0aCwgLTEsCisJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9IGVsc2UgeworCQkqVmlydHVhbEFkZHJlc3MgPSAodm9pZCAqKU5VTEw7CisJCSpQaHlzaWNhbEFkZHJlc3MgPSAoZG1hX2FkZHJfdClOVUxMOworCX0KKworCXJldHVybiAodm9pZCAqKXBrdDsKK30KKwordm9pZCBJbnZhbGlkX1JlbWFpbmluZ19QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIFZpcnR1YWxBZGRyZXNzKQoreworCWRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzOworCisJUGh5c2ljYWxBZGRyZXNzID0KKwkgICAgUENJX01BUF9TSU5HTEUocEFkLCAodm9pZCAqKShWaXJ0dWFsQWRkcmVzcyArIDE2MDApLAorCQkJICAgUlhfQlVGRkVSX05PUk1TSVpFIC0gMTYwMCwgLTEsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK2ludCBSdG1wTmV0VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfaW5pdCgmcE9iai0+cnhfZG9uZV90YXNrLCByeF9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2ssIG1nbXRfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIGFjMF9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzaywgYWMxX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrLCBhYzJfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIGFjM19kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzaywKKwkJICAgICBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBSdG1wTmV0VGFza0V4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKK30KKworaW50IFJ0bXBNZ210VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCisJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2xvc2Uga2VybmVsIHRocmVhZHMuCisKK0FyZ3VtZW50czoKKwkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5PTkUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3ZvaWQgUnRtcE1nbXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDI4NjBfaW50X2VuYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXUzMiByZWdWYWx1ZTsKKworCXBBZC0+aW50X2Rpc2FibGVfbWFzayAmPSB+KG1vZGUpOworCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKKwkvKmlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgKi8KKwl7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOwkvKiAxOmVuYWJsZSAqLworCX0KKwkvKmVsc2UgKi8KKwkvKiAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7ICovCisKKwlpZiAocmVnVmFsdWUgIT0gMCkKKwkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydDI4NjBfaW50X2Rpc2FibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwl1MzIgcmVnVmFsdWU7CisKKwlwQWQtPmludF9kaXNhYmxlX21hc2sgfD0gbW9kZTsKKwlyZWdWYWx1ZSA9IHBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7CisJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7CS8qIDA6IGRpc2FibGUgKi8KKworCWlmIChyZWdWYWx1ZSA9PSAwKSB7CisJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKgl0YXNrbGV0IHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWRhdGE7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKy8qICAgICAgcHJpbnRrKCJtZ210X2RtYV9kb25lX3Byb2Nlc3NcbiIpOyAqLworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuTWdtdERtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9NR01UX0RMWTsKKworCVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkKTsKKworCS8qIGlmIHlvdSB1c2UgUlRNUF9TRU1fTE9DSywgc29tZXRpbWVzIGtlcm5lbCB3aWxsIGhhbmcgdXAsIG5vIGFueSAqLworCS8qIGJ1ZyByZXBvcnQgb3V0cHV0ICovCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX01HTVRfRExZKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKKwlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcEFkLT5pbnRfcGVuZGluZyAmPSB+KElOVF9SWCk7CisJYlJlc2NoZWR1bGUgPSBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUocEFkLCAwKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAorCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgSU5UX1JYIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFJ4aW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfUlgpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJCXJldHVybjsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJcEFkLT5pbnRfcGVuZGluZyAmPSB+KEZpZm9TdGFGdWxsSW50KTsKKwlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCByb3R0aW5nIHBhY2tldAorCSAqLworCWlmIChwQWQtPmludF9wZW5kaW5nICYgRmlmb1N0YUZ1bGxJbnQpIHsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgUnhpbnQgYWdhaW4gKi8KKworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworLyogICAgICBwcmludGsoImFjMF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsgKi8KKwlJbnRTb3VyY2Uud29yZCA9IDA7CisJSW50U291cmNlLmZpZWxkLkFjM0RtYURvbmUgPSAxOworCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzNfRExZOworCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDM19ETFkpIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMzX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopZGF0YTsKKwlJTlRfU09VUkNFX0NTUl9TVFJVQyBJbnRTb3VyY2U7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCQlyZXR1cm47CisKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCUludFNvdXJjZS53b3JkID0gMDsKKwlJbnRTb3VyY2UuZmllbGQuQWMyRG1hRG9uZSA9IDE7CisJcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMl9ETFk7CisKKwliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKKworCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzJfRExZKSB8fCBiUmVzY2hlZHVsZSkgeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMl9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWRhdGE7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKy8qICAgICAgcHJpbnRrKCJhYzBfZG1hX2RvbmVfcHJvY2Vzc1xuIik7ICovCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzFEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMxX0RMWTsKKworCWJSZXNjaGVkdWxlID0gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkLCBJbnRTb3VyY2UpOworCisJUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCS8qCisJICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIGxvc2Ugb2YgaW50ZXJydXB0cworCSAqLworCWlmICgocEFkLT5pbnRfcGVuZGluZyAmIElOVF9BQzFfRExZKSB8fCBiUmVzY2hlZHVsZSkgeworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLworCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMV9ETFkpOworCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWRhdGE7CisJSU5UX1NPVVJDRV9DU1JfU1RSVUMgSW50U291cmNlOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJQk9PTEVBTiBiUmVzY2hlZHVsZSA9IDA7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkJcmV0dXJuOworCisJcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CisKKy8qICAgICAgcHJpbnRrKCJhYzBfZG1hX2RvbmVfcHJvY2Vzc1xuIik7ICovCisJSW50U291cmNlLndvcmQgPSAwOworCUludFNvdXJjZS5maWVsZC5BYzBEbWFEb25lID0gMTsKKwlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfQUMwX0RMWTsKKworLyogICAgICBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7ICovCisJYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7CisKKwlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgbG9zZSBvZiBpbnRlcnJ1cHRzCisJICovCisJaWYgKChwQWQtPmludF9wZW5kaW5nICYgSU5UX0FDMF9ETFkpIHx8IGJSZXNjaGVkdWxlKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBlbmFibGUgVHhEYXRhSW50IGFnYWluICovCisJcnQyODYwX2ludF9lbmFibGUocEFkLCBJTlRfQUMwX0RMWSk7CisJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqCWludGVycnVwdCBoYW5kbGVyIHJlbGF0ZWQgcHJvY2VkdXJlcy4KKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBwcmludF9pbnRfY291bnQ7CisKK0lSUV9IQU5ETEVfVFlQRSBydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIEludFNvdXJjZTsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJLyogTm90ZSAwMzMxMjAwODogd2UgY2FuIG5vdCByZXR1cm4gaGVyZSBiZWZvcmUKKwkgICBSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSW50U291cmNlLndvcmQpOworCSAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7CisJICAgT3Iga2VybmVsIHdpbGwgcGFuaWMgYWZ0ZXIgaWZjb25maWcgcmEwIGRvd24gc29tZXRpbWVzICovCisKKwkvKiAqLworCS8qIEluaXRhbCB0aGUgSW50ZXJydXB0IHNvdXJjZS4gKi8KKwkvKiAqLworCUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7CisvKiAgICAgIE1jdUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7ICovCisKKwkvKiAqLworCS8qIEdldCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgJiBzYXZlZCB0byBsb2NhbCB2YXJpYWJsZSAqLworCS8qICovCisJLypSVE1QX0lPX1JFQUQzMihwQWQsIHdoZXJlLCAmTWN1SW50U291cmNlLndvcmQpOyAqLworCS8qUlRNUF9JT19XUklURTMyKHBBZCwgLCBNY3VJbnRTb3VyY2Uud29yZCk7ICovCisKKwkvKiAqLworCS8qIEZsYWcgZk9QX1NUQVRVU19ET1pFIE9uLCBtZWFucyBBU0lDIHB1dCB0byBzbGVlcCwgZWxhc2UgbWVhbnMgQVNJQ0sgV2FrZVVwICovCisJLyogQW5kIGF0IHRoZSBzYW1lIHRpbWUsIGNsb2NrIG1heWJlIHR1cm5lZCBvZmYgdGhhdCBzYXkgdGhlcmUgaXMgbm8gRE1BIHNlcnZpY2UuICovCisJLyogd2hlbiBBU0lDIGdldCB0byBzbGVlcC4gKi8KKwkvKiBUbyBwcmV2ZW50IHN5c3RlbSBoYW5nIG9uIHBvd2VyIHNhdmluZy4gKi8KKwkvKiBXZSBuZWVkIHRvIGNoZWNrIGl0IGJlZm9yZSBoYW5kbGUgdGhlIElOVF9TT1VSQ0VfQ1NSLCBBU0lDIG11c3QgYmUgd2FrZSB1cC4gKi8KKwkvKiAqLworCS8qIFJUMjY2MSA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW5ub3QgYmUgcmVhZCBhbmQgd3JpdHRlbi4gKi8KKwkvKiBSVDI4NjAgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4uICovCisvKiAgICAgIGlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgKi8KKwl7CisJCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7CS8qIHdyaXRlIDEgdG8gY2xlYXIgKi8KKwl9CisvKiAgICAgIGVsc2UgKi8KKy8qICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI+Pj5mT1BfU1RBVFVTX0RPWkU8PDxcbiIpKTsgKi8KKworLyogICAgICBSVE1QX0lPX1JFQUQzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCAmSXNyQWZ0ZXJDbGVhcik7ICovCisvKiAgICAgIFJUTVBfSU9fUkVBRDMyKHBBZCwgTUNVX0lOVF9TT1VSQ0VfQ1NSLCAmTWN1SXNyQWZ0ZXJDbGVhcik7ICovCisvKiAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiPT09PT4gUlRNUEhhbmRsZUludGVycnVwdChJU1I9JTA4eCxNY3UgSVNSPSUwOHgsIEFmdGVyIGNsZWFyIElTUj0lMDh4LCBNQ1UgSVNSPSUwOHgpXG4iLCAqLworLyogICAgICAgICAgICAgICAgICAgICAgSW50U291cmNlLndvcmQsIE1jdUludFNvdXJjZS53b3JkLCBJc3JBZnRlckNsZWFyLCBNY3VJc3JBZnRlckNsZWFyKSk7ICovCisKKwkvKiBEbyBub3RoaW5nIGlmIFJlc2V0IGluIHByb2dyZXNzICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsCisJICAgICAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpIHsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwkvKiAqLworCS8qIEhhbmRsZSBpbnRlcnJ1cHQsIHdhbGsgdGhyb3VnaCBhbGwgYml0cyAqLworCS8qIFNob3VsZCBzdGFydCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgaW50ZXJydXB0ICovCisJLyogVGhlIHByaW9yaXR5IGNhbiBiZSBhZGp1c3QgYnkgYWx0ZXJpbmcgcHJvY2Vzc2luZyBpZiBzdGF0ZW1lbnQgKi8KKwkvKiAqLworCisjaWZkZWYgREJHCisKKyNlbmRpZgorCisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisKKwkvKiBJZiByZXF1aXJlZCBzcGlubG9jaywgZWFjaCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGhhcyB0byBhY3F1aXJlICovCisJLyogYW5kIHJlbGVhc2UgaXRzZWxmLiAqLworCS8qICovCisKKwkvKiBEbyBub3RoaW5nIGlmIE5JQyBkb2Vzbid0IGV4aXN0ICovCisJaWYgKEludFNvdXJjZS53b3JkID09IDB4ZmZmZmZmZmYpIHsKKwkJUlRNUF9TRVRfRkxBRyhwQWQsCisJCQkgICAgICAoZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFR4Q29oZXJlbnQpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+VHhDb2hlcmVudDw8PFxuIikpOworCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIFJ4Q29oZXJlbnQpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+UnhDb2hlcmVudDw8PFxuIikpOworCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIEZpZm9TdGFGdWxsSW50KSB7CisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgRmlmb1N0YUZ1bGxJbnQpID09IDApIHsKKwkJCS8qIG1hc2sgRmlmb1N0YUZ1bGxJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIEZpZm9TdGFGdWxsSW50KTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmZpZm9fc3RhdGlzdGljX2Z1bGxfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBGaWZvU3RhRnVsbEludDsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfTUdNVF9ETFkpIHsKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfTUdNVF9ETFkpID09IDApIHsKKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9NR01UX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOworCQl9CisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX01HTVRfRExZOworCX0KKworCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9SWCkgeworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9SWCkgPT0gMCkgeworCisJCQkvKiBtYXNrIFJ4aW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfUlgpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKKwkJfQorCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9SWDsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMzX0RMWSkgeworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDM19ETFkpID09IDApIHsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMzX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMzX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMyX0RMWSkgeworCisJCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMl9ETFkpID09IDApIHsKKwkJCS8qIG1hc2sgVHhEYXRhSW50ICovCisJCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMyX0RMWSk7CisJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7CisJCX0KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMyX0RMWTsKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMxX0RMWSkgeworCisJCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMV9ETFk7CisKKwkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMxX0RMWSkgPT0gMCkgeworCQkJLyogbWFzayBUeERhdGFJbnQgKi8KKwkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzFfRExZKTsKKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwkJfQorCisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMF9ETFkpIHsKKworLyoKKwkJaWYgKEludFNvdXJjZS53b3JkICYgMHgyKSB7CisJCQl1MzIgcmVnOworCQkJUlRNUF9JT19SRUFEMzIocEFkLCBERUxBWV9JTlRfQ0ZHLCAmcmVnKTsKKwkJCXByaW50aygiSW50U291cmNlLndvcmQgPSAlMDh4LCBERUxBWV9SRUcgPSAlMDh4XG4iLCBJbnRTb3VyY2Uud29yZCwgcmVnKTsKKwkJfQorKi8KKwkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMwX0RMWTsKKworCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzBfRExZKSA9PSAwKSB7CisJCQkvKiBtYXNrIFR4RGF0YUludCAqLworCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMF9ETFkpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQl9CisKKwl9CisKKwlpZiAoSW50U291cmNlLndvcmQgJiBQcmVUQlRUSW50KSB7CisJCVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KHBBZCk7CisJfQorCisJaWYgKEludFNvdXJjZS53b3JkICYgVEJUVEludCkgeworCQlSVE1QSGFuZGxlVEJUVEludGVycnVwdChwQWQpOworCX0KKworCXsKKwkJaWYgKEludFNvdXJjZS53b3JkICYgQXV0b1dha2V1cEludCkKKwkJCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKKyAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKi8KK2RtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCQkJCWludCBzZF9pZHgsIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwkvKgorCSAgIC0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQorCSAgID4gRm9yIFR4IEFsbG9jOgorCSAgIG1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCisJICAgU3dJZHg6IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgKKwkgICBwVHhEIDogcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5BbGxvY1ZhOworCisJICAgZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKKwkgICBUeElkeCA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5UeENwdUlkeAorCSAgIFF1ZUlkeDogcFR4QmxrLT5RdWVJZHgKKwkgICBwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOworCisJICAgPiBGb3IgUnggQWxsb2M6CisJICAgc2RfaWR4ID0gLTEKKwkgKi8KKworCXBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopaGFuZGxlOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJaWYgKHNkX2lkeCA9PSAxKSB7CisJCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsazsKKwkJcFR4QmxrID0gKHN0cnVjdCBydF90eF9ibGsgKilwdHI7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwVHhCbGstPnBTcmNCdWZEYXRhLAorCQkJCSAgICAgIHBUeEJsay0+U3JjQnVmTGVuLCBkaXJlY3Rpb24pOworCX0gZWxzZSB7CisJCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CisJfQorCit9CisKK3ZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJICAgIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisKKwlwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKWhhbmRsZTsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCXBjaV91bm1hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcmVjdGlvbik7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfcHJvZmlsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYzQxZjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydF9wcm9maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotc3RhdGljIHZvaWQgSFRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglDSEFSCQkgICpwVmFsdWVTdHIsCi0JSU4JQ0hBUgkJICAqcElucHV0KTsKLQotI2RlZmluZSBFVEhfTUFDX0FERFJfU1RSX0xFTiAxNyAgLy8gaW4gZm9ybWF0IG9mIHh4Onh4Onh4Onh4Onh4Onh4Ci0KLS8vIFdlIGFzc3VtZSB0aGUgczEgaXMgYSBzdGluZywgczIgaXMgYSBtZW1vcnkgc3BhY2Ugd2l0aCA2IGJ5dGVzLiBhbmQgY29udGVudCBvZiBzMSB3aWxsIGJlIGNoYW5nZWQuCi1CT09MRUFOIHJ0c3RybWFjdG9oZXgoY2hhciAqczEsIGNoYXIgKnMyKQotewotCWludCBpID0gMDsKLQljaGFyICpwdG9rUyA9IHMxLCAqcHRva0UgPSBzMTsKLQotCWlmIChzdHJsZW4oczEpICE9IEVUSF9NQUNfQUREUl9TVFJfTEVOKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQl3aGlsZSgoKnB0b2tTKSAhPSAnXDAnKQotCXsKLQkJaWYoKHB0b2tFID0gc3RyY2hyKHB0b2tTLCAnOicpKSAhPSBOVUxMKQotCQkJKnB0b2tFKysgPSAnXDAnOwotCQlpZiAoKHN0cmxlbihwdG9rUykgIT0gMikgfHwgKCFpc3hkaWdpdCgqcHRva1MpKSB8fCAoIWlzeGRpZ2l0KCoocHRva1MrMSkpKSkKLQkJCWJyZWFrOyAvLyBmYWlsCi0JCUF0b0gocHRva1MsICZzMltpKytdLCAxKTsKLQkJcHRva1MgPSBwdG9rRTsKLQkJaWYgKGkgPT0gNikKLQkJCWJyZWFrOyAvLyBwYXJzaW5nIGZpbmlzaGVkCi0JfQotCi0JcmV0dXJuICggaSA9PSA2ID8gVFJVRSA6IEZBTFNFKTsKLQotfQotCi0KLS8vIHdlIGFzc3VtZSB0aGUgczEgYW5kIHMyIGJvdGggYXJlIHN0cmluZ3MuCi1CT09MRUFOIHJ0c3RyY2FzZWNtcChjaGFyICpzMSwgY2hhciAqczIpCi17Ci0JY2hhciAqcDEgPSBzMSwgKnAyID0gczI7Ci0KLQlpZiAoc3RybGVuKHMxKSAhPSBzdHJsZW4oczIpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQl3aGlsZSgqcDEgIT0gJ1wwJykKLQl7Ci0JCWlmKCgqcDEgIT0gKnAyKSAmJiAoKCpwMSBeICpwMikgIT0gMHgyMCkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCXAxKys7Ci0JCXAyKys7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIHdlIGFzc3VtZSB0aGUgczEgKGJ1ZmZlcikgYW5kIHMyIChrZXkpIGJvdGggYXJlIHN0cmluZ3MuCi1jaGFyICogcnRzdHJzdHJ1bmNhc2VjbXAoY2hhciAqIHMxLCBjaGFyICogczIpCi17Ci0JSU5UIGwxLCBsMiwgaTsKLQljaGFyIHRlbXAxLCB0ZW1wMjsKLQotCWwyID0gc3RybGVuKHMyKTsKLQlpZiAoIWwyKQotCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0KLQlsMSA9IHN0cmxlbihzMSk7Ci0KLQl3aGlsZSAobDEgPj0gbDIpCi0JewotCQlsMS0tOwotCi0JCWZvcihpPTA7IGk8bDI7IGkrKykKLQkJewotCQkJdGVtcDEgPSAqKHMxK2kpOwotCQkJdGVtcDIgPSAqKHMyK2kpOwotCi0JCQlpZiAoKCdhJyA8PSB0ZW1wMSkgJiYgKHRlbXAxIDw9ICd6JykpCi0JCQkJdGVtcDEgPSAnQScrKHRlbXAxLSdhJyk7Ci0JCQlpZiAoKCdhJyA8PSB0ZW1wMikgJiYgKHRlbXAyIDw9ICd6JykpCi0JCQkJdGVtcDIgPSAnQScrKHRlbXAyLSdhJyk7Ci0KLQkJCWlmICh0ZW1wMSAhPSB0ZW1wMikKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChpID09IGwyKQotCQkJcmV0dXJuIChjaGFyICopIHMxOwotCi0JCXMxKys7Ci0JfQotCi0JcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAotfQotCi0vL2FkZCBieSBrYXRoeQotCi0gLyoqCi0gICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZwotICAqIEBzMTogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAotICAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCi0gICovCi1jaGFyICogcnRzdHJzdHIoY29uc3QgY2hhciAqIHMxLGNvbnN0IGNoYXIgKiBzMikKLXsKLQlJTlQgbDEsIGwyOwotCi0JbDIgPSBzdHJsZW4oczIpOwotCWlmICghbDIpCi0JCXJldHVybiAoY2hhciAqKSBzMTsKLQotCWwxID0gc3RybGVuKHMxKTsKLQotCXdoaWxlIChsMSA+PSBsMikKLQl7Ci0JCWwxLS07Ci0JCWlmICghbWVtY21wKHMxLHMyLGwyKSkKLQkJCXJldHVybiAoY2hhciAqKSBzMTsKLQkJczErKzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiByc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKLSAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCi0gKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKLSAqICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4gSG93ZXZlciBzdHJzZXAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvbGQgYXJjaGl0ZWN0dXJlLgotICovCi1jaGFyICogX19yc3RydG9rOwotY2hhciAqIHJzdHJ0b2soY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQotewotCWNoYXIgKnNiZWdpbiwgKnNlbmQ7Ci0KLQlzYmVnaW4gID0gcyA/IHMgOiBfX3JzdHJ0b2s7Ci0JaWYgKCFzYmVnaW4pCi0JewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlzYmVnaW4gKz0gc3Ryc3BuKHNiZWdpbixjdCk7Ci0JaWYgKCpzYmVnaW4gPT0gJ1wwJykKLQl7Ci0JCV9fcnN0cnRvayA9IE5VTEw7Ci0JCXJldHVybiggTlVMTCApOwotCX0KLQotCXNlbmQgPSBzdHJwYnJrKCBzYmVnaW4sIGN0KTsKLQlpZiAoc2VuZCAmJiAqc2VuZCAhPSAnXDAnKQotCQkqc2VuZCsrID0gJ1wwJzsKLQotCV9fcnN0cnRvayA9IHNlbmQ7Ci0KLQlyZXR1cm4gKHNiZWdpbik7Ci19Ci0KLS8qKgotICogZGVsaW1pdGNudCAtIHJldHVybiB0aGUgY291bnQgb2YgYSBnaXZlbiBkZWxpbWl0ZXIgaW4gYSBnaXZlbiBzdHJpbmcuCi0gKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZC4KLSAqIEBjdDogVGhlIGRlbGltaXRlciB0byBzZWFyY2ggZm9yLgotICogTm90aWNlIDogV2Ugc3VwcG9zZSB0aGUgZGVsaW1pdGVyIGlzIGEgc2luZ2xlLWNoYXIgc3RyaW5nKGZvciBleGFtcGxlIDogIjsiKS4KLSAqLwotSU5UIGRlbGltaXRjbnQoY2hhciAqIHMsY29uc3QgY2hhciAqIGN0KQotewotCUlOVCBjb3VudCA9IDA7Ci0JLyogcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLwotCWNvbnN0IGNoYXIgKnRva2VuID0gczsKLQotCWZvciAoIDs7ICkKLQl7Ci0JCXRva2VuID0gc3RycGJyayh0b2tlbiwgY3QpOyAvKiBzZWFyY2ggZm9yIGRlbGltaXRlcnMgKi8KLQotICAgICAgICBpZiAoIHRva2VuID09IE5VTEwgKQotCQl7Ci0JCQkvKiBhZHZhbmNlZCB0byB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCS8qIHNraXAgdGhlIGRlbGltaXRlciAqLwotCSAgICArK3Rva2VuOwotCi0JCS8qCi0JCSAqIFByaW50IHRoZSBmb3VuZCB0ZXh0OiB1c2UgbGVuIHdpdGggJS4qcyB0byBzcGVjaWZ5IGZpZWxkIHdpZHRoLgotCQkgKi8KLQotCQkvKiBhY2N1bXVsYXRlIGRlbGltaXRlciBjb3VudCAqLwotCSAgICArK2NvdW50OwotCX0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qCi0gICogY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIHRoZSBzdGFuZGFyZCBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uCi0gICogaW50byBiaW5hcnkgZGF0YS4KLSAgKiByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIHplcm8gaWYgbm90LgotICAqLwotaW50IHJ0aW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgKmFkZHIpCi17Ci0JdW5zaWduZWQgaW50IAl2YWw7Ci0JaW50ICAgICAgICAgCWJhc2UsIG47Ci0JY2hhciAgICAgICAgCWM7Ci0JdW5zaWduZWQgaW50ICAgIHBhcnRzWzRdOwotCXVuc2lnbmVkIGludCAgICAqcHAgPSBwYXJ0czsKLQotCWZvciAoOzspCi0gICAgewotICAgICAgICAgLyoKLSAgICAgICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgotICAgICAgICAgICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6Ci0gICAgICAgICAgKgkweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCi0gICAgICAgICAgKi8KLSAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgICBiYXNlID0gMTA7Ci0gICAgICAgICBpZiAoKmNwID09ICcwJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCi0gICAgICAgICAgICAgICAgIGJhc2UgPSAxNiwgY3ArKzsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIGJhc2UgPSA4OwotICAgICAgICAgfQotICAgICAgICAgd2hpbGUgKChjID0gKmNwKSAhPSAnXDAnKQotICAgICAgICAgewotICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKLSAgICAgICAgICAgICAgICAgY3ArKzsKLSAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKwotICAgICAgICAgICAgICAgICAgICAgKGMgKyAxMCAtIChpc2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpOwotICAgICAgICAgICAgICAgICBjcCsrOwotICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKmNwID09ICcuJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAqIEludGVybmV0IGZvcm1hdDogYS5iLmMuZCBhLmIuYyAgICh3aXRoIGMgdHJlYXRlZCBhcyAxNi1iaXRzKQotICAgICAgICAgICAgICAqIGEuYiAgICAgKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCi0gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgaWYgKHBwID49IHBhcnRzICsgMyB8fCB2YWwgPiAweGZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAqcHArKyA9IHZhbCwgY3ArKzsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgIC8qCi0gICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBqdW5rLgotICAgICAgKi8KLSAgICAgd2hpbGUgKCpjcCkKLSAgICAgICAgIGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmNwKyspKQotICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgIC8qCi0gICAgICAqIENvbmNvY3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgotICAgICAgKi8KLSAgICAgbiA9IHBwIC0gcGFydHMgKyAxOwotICAgICBzd2l0Y2ggKG4pCi0gICAgIHsKLQotICAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDI6ICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmZmZikKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgdmFsIHw9IHBhcnRzWzBdIDw8IDI0OwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KLSAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNik7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBhLmIuYy5kIC0tIDguOC44LjggYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLQotICAgICAqYWRkciA9IGh0b25sKHZhbCk7Ci0gICAgIHJldHVybiAxOwotCi19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBGaW5kIGtleSBzZWN0aW9uIGZvciBHZXQga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkgc2VjdGlvbgotICAgICAgICBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc2VjaW9uIHRvIGJlIGZpbmQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLSAgICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QVUNIQVIgIFJUTVBGaW5kU2VjdGlvbigKLSAgICBJTiAgUENIQVIgICBidWZmZXIpCi17Ci0gICAgQ0hBUiB0ZW1wX2J1ZlszMl07Ci0gICAgUFVDSEFSICBwdHI7Ci0KLSAgICBzdHJjcHkodGVtcF9idWYsICJEZWZhdWx0Iik7Ci0KLSAgICBpZigocHRyID0gcnRzdHJzdHIoYnVmZmVyLCB0ZW1wX2J1ZikpICE9IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gKHB0citzdHJsZW4oIlxuIikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCi0gICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCi0gICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCi0KLSAgICBOb3RlOgotICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRNUEdldEtleVBhcmFtZXRlcigKLSAgICBJTiAgUENIQVIgICBrZXksCi0gICAgT1VUIFBDSEFSICAgZGVzdCwKLSAgICBJTiAgSU5UICAgICBkZXN0c2l6ZSwKLSAgICBJTiAgUENIQVIgICBidWZmZXIpCi17Ci0gICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7Ci0gICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7Ci0gICAgQ0hBUiAqc3RhcnRfcHRyOwotICAgIENIQVIgKmVuZF9wdHI7Ci0gICAgQ0hBUiAqcHRyOwotICAgIENIQVIgKm9mZnNldCA9IDA7Ci0gICAgSU5UICBsZW47Ci0KLQkvL3RlbXBfYnVmMSA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0Jb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjEsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0KLQlpZih0ZW1wX2J1ZjEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0KLQkvL3RlbXBfYnVmMiA9IGttYWxsb2MoTUFYX1BBUkFNX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0Jb3NfYWxsb2NfbWVtKE5VTEwsICZ0ZW1wX2J1ZjIsIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0JaWYodGVtcF9idWYyID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLSAgICAvL2ZpbmQgc2VjdGlvbgotICAgIGlmKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKLQotICAgIC8vc2VhcmNoIGtleQotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOwotICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQotICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOwotCi0gICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKLSAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7Ci0gICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7Ci0gICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKLSAgICBwdHIgPSB0ZW1wX2J1ZjI7Ci0gICAgLy90cmltIHNwYWNlIG9yIHRhYgotICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKLSAgICB7Ci0gICAgICAgIGlmKCAoKnB0ciA9PSAnICcpIHx8ICgqcHRyID09ICdcdCcpICkKLSAgICAgICAgICAgIHB0cisrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGxlbiA9IHN0cmxlbihwdHIpOwotICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7Ci0gICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCi0gICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCi0gICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCi0KLSAgICBOb3RlOgotICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkuCi0gICAgICAgIEl0IGlzIGNhbGxlZCBmb3IgcGFyc2luZyBTU0lEIGFuZCBhbnkga2V5IHN0cmluZy4KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRNUEdldENyaXRpY2FsUGFyYW1ldGVyKAotICAgIElOICBQQ0hBUiAgIGtleSwKLSAgICBPVVQgUENIQVIgICBkZXN0LAotICAgIElOICBJTlQgICAgIGRlc3RzaXplLAotICAgIElOICBQQ0hBUiAgIGJ1ZmZlcikKLXsKLSAgICBVQ0hBUiAqdGVtcF9idWYxID0gTlVMTDsKLSAgICBVQ0hBUiAqdGVtcF9idWYyID0gTlVMTDsKLSAgICBDSEFSICpzdGFydF9wdHI7Ci0gICAgQ0hBUiAqZW5kX3B0cjsKLSAgICBDSEFSICpwdHI7Ci0gICAgQ0hBUiAqb2Zmc2V0ID0gMDsKLSAgICBJTlQgIGxlbjsKLQotCS8vdGVtcF9idWYxID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQotCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQotCS8vdGVtcF9idWYyID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotCX0KLQotICAgIC8vZmluZCBzZWN0aW9uCi0gICAgaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCAiPSIpOwotCi0gICAgLy9zZWFyY2gga2V5Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpPT1OVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RhcnRfcHRyKz1zdHJsZW4oIlxuIik7Ci0gICAgaWYoKGVuZF9wdHI9cnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCi0gICAgICAgZW5kX3B0cj1zdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7Ci0KLSAgICBpZiAoZW5kX3B0cjxzdGFydF9wdHIpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOwotICAgIHRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKLSAgICBsZW4gPSBzdHJsZW4odGVtcF9idWYyKTsKLSAgICBzdHJjcHkodGVtcF9idWYxLCB0ZW1wX2J1ZjIpOwotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIodGVtcF9idWYxLCAiPSIpKSA9PSBOVUxMKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0gICAgc3RyY3B5KHRlbXBfYnVmMiwgc3RhcnRfcHRyKzEpOwotICAgIHB0ciA9IHRlbXBfYnVmMjsKLQotICAgIC8vdHJpbSB0YWIKLSAgICAvKiBXZSBjYW5ub3QgdHJpbSBzcGFjZSgnICcpIGZvciBTU0lEIGFuZCBrZXkgc3RyaW5nLiAqLwotICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKLSAgICB7Ci0gICAgICAgIC8vaWYoICgqcHRyID09ICcgJykgfHwgKCpwdHIgPT0gJ1x0JykgKQotICAgICAgICBpZiggKCpwdHIgPT0gJ1x0JykgKQotICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbGVuID0gc3RybGVuKHB0cik7Ci0gICAgbWVtc2V0KGRlc3QsIDB4MDAsIGRlc3RzaXplKTsKLSAgICBzdHJuY3B5KGRlc3QsIHB0ciwgbGVuID49IGRlc3RzaXplID8gIGRlc3RzaXplOiBsZW4pOwotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICBvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IG11bHRpcGxlIGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGtleSBzdHJpbmcKLSAgICAgICAgZGVzdCAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24KLSAgICAgICAgZGVzdHNpemUgICAgICAgICAgICAgICAgICAgIFRoZSBkYXRhc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24KLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSBnZXQgdGhlIHZhbHVlIHdpdGggdGhlIG1hdGNoZWQga2V5IChjYXNlIGNhc2Utc2Vuc2l0aXZlKQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVE1QR2V0S2V5UGFyYW1ldGVyV2l0aE9mZnNldCgKLSAgICBJTiAgUENIQVIgICBrZXksCi0gICAgT1VUIFBDSEFSICAgZGVzdCwKLSAgICBPVVQJVVNIT1JUCSplbmRfb2Zmc2V0LAotICAgIElOICBJTlQgICAgIGRlc3RzaXplLAotICAgIElOICBQQ0hBUiAgIGJ1ZmZlciwKLSAgICBJTglCT09MRUFOCWJUcmltU3BhY2UpCi17Ci0gICAgVUNIQVIgKnRlbXBfYnVmMSA9IE5VTEw7Ci0gICAgVUNIQVIgKnRlbXBfYnVmMiA9IE5VTEw7Ci0gICAgQ0hBUiAqc3RhcnRfcHRyOwotICAgIENIQVIgKmVuZF9wdHI7Ci0gICAgQ0hBUiAqcHRyOwotICAgIENIQVIgKm9mZnNldCA9IDA7Ci0gICAgSU5UICBsZW47Ci0KLQlpZiAoKmVuZF9vZmZzZXQgPj0gTUFYX0lOSV9CVUZGRVJfU0laRSkKLQkJcmV0dXJuIChGQUxTRSk7Ci0KLQlvc19hbGxvY19tZW0oTlVMTCwgJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQotCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQotCW9zX2FsbG9jX21lbShOVUxMLCAmdGVtcF9idWYyLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCWlmKHRlbXBfYnVmMiA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0gICAgLy9maW5kIHNlY3Rpb24KLQlpZigqZW5kX29mZnNldCA9PSAwKQotICAgIHsKLQkJaWYgKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKLQkJewotCQkJb3NfZnJlZV9tZW0oTlVMTCwgdGVtcF9idWYxKTsKLQkgICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgCSAgICByZXR1cm4gKEZBTFNFKTsKLQkJfQotICAgIH0KLQllbHNlCi0JCW9mZnNldCA9IGJ1ZmZlciArICgqZW5kX29mZnNldCk7Ci0KLSAgICBzdHJjcHkodGVtcF9idWYxLCAiXG4iKTsKLSAgICBzdHJjYXQodGVtcF9idWYxLCBrZXkpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsICI9Iik7Ci0KLSAgICAvL3NlYXJjaCBrZXkKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKG9mZnNldCwgdGVtcF9idWYxKSk9PU5VTEwpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdGFydF9wdHIrPXN0cmxlbigiXG4iKTsKLSAgICBpZigoZW5kX3B0cj1ydHN0cnN0cihzdGFydF9wdHIsICJcbiIpKT09TlVMTCkKLSAgICAgICBlbmRfcHRyPXN0YXJ0X3B0citzdHJsZW4oc3RhcnRfcHRyKTsKLQotICAgIGlmIChlbmRfcHRyPHN0YXJ0X3B0cikKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMSk7Ci0gICAgCW9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotCSplbmRfb2Zmc2V0ID0gZW5kX3B0ciAtIGJ1ZmZlcjsKLQotICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfYnVmMiwgc3RhcnRfcHRyLCBlbmRfcHRyLXN0YXJ0X3B0cik7Ci0gICAgdGVtcF9idWYyW2VuZF9wdHItc3RhcnRfcHRyXT0nXDAnOwotICAgIGxlbiA9IHN0cmxlbih0ZW1wX2J1ZjIpOwotICAgIHN0cmNweSh0ZW1wX2J1ZjEsIHRlbXBfYnVmMik7Ci0gICAgaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cih0ZW1wX2J1ZjEsICI9IikpID09IE5VTEwpCi0gICAgewotCQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIAlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjIpOwotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLSAgICB9Ci0KLSAgICBzdHJjcHkodGVtcF9idWYyLCBzdGFydF9wdHIrMSk7Ci0gICAgcHRyID0gdGVtcF9idWYyOwotICAgIC8vdHJpbSBzcGFjZSBvciB0YWIKLSAgICB3aGlsZSgqcHRyICE9IDB4MDApCi0gICAgewotICAgICAgICBpZigoYlRyaW1TcGFjZSAmJiAoKnB0ciA9PSAnICcpKSB8fCAoKnB0ciA9PSAnXHQnKSApCi0gICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBsZW4gPSBzdHJsZW4ocHRyKTsKLSAgICBtZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOwotICAgIHN0cm5jcHkoZGVzdCwgcHRyLCBsZW4gPj0gZGVzdHNpemUgPyAgZGVzdHNpemU6IGxlbik7Ci0KLQlvc19mcmVlX21lbShOVUxMLCB0ZW1wX2J1ZjEpOwotICAgIG9zX2ZyZWVfbWVtKE5VTEwsIHRlbXBfYnVmMik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotc3RhdGljIGludCBydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCxJTiAgY2hhciAqYnVmZmVyLElOICBVTE9ORyBLZXlUeXBlLElOICBJTlQgQlNTSWR4LElOICBJTlQgS2V5SWR4KQotewotCVBVQ0hBUgkJa2V5YnVmZjsKLQlJTlQJCQlpID0gQlNTSWR4LCBpZHggPSBLZXlJZHg7Ci0JVUxPTkcJCUtleUxlbjsKLQlVQ0hBUgkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCi0Ja2V5YnVmZiA9IGJ1ZmZlcjsKLQlLZXlMZW4gPSBzdHJsZW4oa2V5YnVmZik7Ci0KLQlpZiAoS2V5VHlwZSA9PSAxKQotCXsvL0FzY2lpCi0JCWlmKCAoS2V5TGVuID09IDUpIHx8IChLZXlMZW4gPT0gMTMpKQotCQl7Ci0JCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBrZXlidWZmLCBLZXlMZW4pOwotCQkJaWYgKEtleUxlbiA9PSA1KQotCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCWVsc2UKLQkJCQlDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQkJcEFkLT5TaGFyZWRLZXlbaV1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkkvRih3bGFuJWQpIEtleSVkU3RyPSVzIGFuZCB0eXBlPSVzXG4iLCBpLCBpZHgrMSwga2V5YnVmZiwgKEtleVR5cGUgPT0gMCkgPyAiSGV4IjoiQXNjaWkiKSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQllbHNlCi0JCXsvL0ludmFsaWQga2V5IGxlbmd0aAotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiS2V5JWRTdHIgaXMgSW52YWxpZCBrZXkgbGVuZ3RoISBLZXlMZW4gPSAlbGQhXG4iLCBpZHgrMSwgS2V5TGVuKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQllbHNlCi0Jey8vSGV4IHR5cGUKLQkJaWYoIChLZXlMZW4gPT0gMTApIHx8IChLZXlMZW4gPT0gMjYpKQotCQl7Ci0JCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLktleUxlbiA9IEtleUxlbiAvIDI7Ci0JCQlBdG9IKGtleWJ1ZmYsIHBBZC0+U2hhcmVkS2V5W2ldW2lkeF0uS2V5LCBLZXlMZW4gLyAyKTsKLQkJCWlmIChLZXlMZW4gPT0gMTApCi0JCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQkJZWxzZQotCQkJCUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0JCQlwQWQtPlNoYXJlZEtleVtpXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSS9GKHdsYW4lZCkgS2V5JWRTdHI9JXMgYW5kIHR5cGU9JXNcbiIsIGksIGlkeCsxLCBrZXlidWZmLCAoS2V5VHlwZSA9PSAwKSA/ICJIZXgiOiJBc2NpaSIpKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWVsc2UKLQkJey8vSW52YWxpZCBrZXkgbGVuZ3RoCi0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJL0Yod2xhbiVkKSBLZXklZFN0ciBpcyBJbnZhbGlkIGtleSBsZW5ndGghIEtleUxlbiA9ICVsZCFcbiIsIGksIGlkeCsxLCBLZXlMZW4pKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotfQotc3RhdGljIHZvaWQgcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKLXsKLQljaGFyCQl0b2tfc3RyWzE2XTsKLQlQVUNIQVIJCW1hY3B0cjsKLQlJTlQJCQlpID0gMCwgaWR4OwotCVVMT05HCQlLZXlUeXBlW01BWF9NQlNTSURfTlVNXTsKLQlVTE9ORwkJS2V5SWR4OwotCi0JTmRpc1plcm9NZW1vcnkoS2V5VHlwZSwgTUFYX01CU1NJRF9OVU0pOwotCi0JLy9EZWZhdWx0S2V5SUQKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZWZhdWx0S2V5SUQiLCB0bXBidWYsIDI1LCBidWZmZXIpKQotCXsKLQkJewotCQkJS2V5SWR4ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSk7Ci0JCQllbHNlCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVmYXVsdEtleUlEKDB+Myk9JWRcbiIsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotCQl9Ci0JfQotCi0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDQ7IGlkeCsrKQotCXsKLQkJc3ByaW50Zih0b2tfc3RyLCAiS2V5JWRUeXBlIiwgaWR4ICsgMSk7Ci0JCS8vS2V5MVR5cGUKLQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIodG9rX3N0ciwgdG1wYnVmLCAxMjgsIGJ1ZmZlcikpCi0JCXsKLQkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJICAgIHsKLQkJCSAgICBLZXlUeXBlW2ldID0gc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKLQkJICAgIH0KLQotCQkJewotCQkJCXNwcmludGYodG9rX3N0ciwgIktleSVkU3RyIiwgaWR4ICsgMSk7Ci0JCQkJaWYgKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcih0b2tfc3RyLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKLQkJCQl7Ci0JCQkJCXJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUocEFkLCB0bXBidWYsIEtleVR5cGVbQlNTMF0sIEJTUzAsIGlkeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBjaGFyICp0bXBidWYsIGNoYXIgKmJ1ZmZlcikKLXsKLQlQVUNIQVIJCQkJCW1hY3B0cjsKLQlJTlQJCQkJCQlpPTA7Ci0JQk9PTEVBTgkJCQkJYldtbUVuYWJsZSA9IEZBTFNFOwotCi0JLy9XbW1DYXBhYmxlCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV21tQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCi0JewotCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApIC8vRW5hYmxlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKLQkJCWJXbW1FbmFibGUgPSBUUlVFOwotCQl9Ci0JCWVsc2UgLy9EaXNhYmxlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gRkFMU0U7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXbW1DYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOwotCX0KLQotCS8vQWNrUG9saWN5IGZvciBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTwotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFja1BvbGljeSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCi0JewotCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY2tQb2xpY3lbJWRdPSVkXG4iLCBpLCBwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0pKTsKLQkJfQotCX0KLQotCWlmIChiV21tRW5hYmxlKQotCXsKLQkJLy9BUFNEQ2FwYWJsZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQ2FwYWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gVFJVRTsKLQkJCWVsc2UKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTRENhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSkpOwotCQl9Ci0KLQkJLy9BUFNEQUMgZm9yIEFDX0JFLCBBQ19CSywgQUNfVkksIEFDX1ZPCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFQU0RBQyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCi0JCXsKLQkJCUJPT0xFQU4gYXBzZF9hY1s0XTsKLQotCQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgbWFjcHRyOyBtYWNwdHIgPSByc3RydG9rKE5VTEwsIjsiKSwgaSsrKQotCQkJewotCQkJCWFwc2RfYWNbaV0gPSAoQk9PTEVBTilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTREFDJWQgICVkXG4iLCBpLCAgYXBzZF9hY1tpXSkpOwotCQkJfQotCi0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID0gYXBzZF9hY1swXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPSBhcHNkX2FjWzFdOwotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9IGFwc2RfYWNbMl07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID0gYXBzZF9hY1szXTsKLQkJfQotCX0KLQotfQotCi1ORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQotewotCVBVQ0hBUgkJCQkJc3JjID0gTlVMTDsKLQlzdHJ1Y3QgZmlsZQkJCQkqc3JjZjsKLQlJTlQgCQkJCQlyZXR2YWw7Ci0gICAJbW1fc2VnbWVudF90CQkJb3JnZnM7Ci0JQ0hBUgkJCQkJKmJ1ZmZlcjsKLQlDSEFSCQkJCQkqdG1wYnVmOwotCVVMT05HCQkJCQlSdHNUaHJlc2g7Ci0JVUxPTkcJCQkJCUZyYWdUaHJlc2g7Ci0JVUNIQVIJICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKLQotCVBVQ0hBUgkJCQkJbWFjcHRyOwotCUlOVAkJCQkJCWkgPSAwOwotCi0JYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYoYnVmZmVyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCi0JdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZih0bXBidWYgPT0gTlVMTCkKLQl7Ci0JCWtmcmVlKGJ1ZmZlcik7Ci0gICAgICAgIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXNyYyA9IFNUQV9QUk9GSUxFX1BBVEg7Ci0KLSAgICBvcmdmcyA9IGdldF9mcygpOwotICAgIHNldF9mcyhLRVJORUxfRFMpOwotCi0JaWYgKHNyYyAmJiAqc3JjKQotCXsKLQkJc3JjZiA9IGZpbHBfb3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKLQkJaWYgKElTX0VSUihzcmNmKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFRoZSBvYmplY3QgbXVzdCBoYXZlIGEgcmVhZCBtZXRob2QKLQkJCWlmIChzcmNmLT5mX29wICYmIHNyY2YtPmZfb3AtPnJlYWQpCi0JCQl7Ci0JCQkJbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7Ci0JCQkJcmV0dmFsPXNyY2YtPmZfb3AtPnJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFLCAmc3JjZi0+Zl9wb3MpOwotCQkJCWlmIChyZXR2YWwgPCAwKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJlYWQgJXMgZXJyb3IgJWRcbiIsIHNyYywgLXJldHZhbCkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBzZXQgZmlsZSBwYXJhbWV0ZXIgdG8gcG9ydGNmZwotCQkJCQkvL0NvdW50cnlSZWdpb24KLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbiIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0JCQkJCX0KLQkJCQkJLy9Db3VudHJ5UmVnaW9uQUJhbmQKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeVJlZ2lvbkFCYW5kIiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb3VudHJ5UmVnaW9uQUJhbmQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCkpOwotCQkJCQl9Ci0JCQkJCS8vQ291bnRyeUNvZGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ291bnRyeUNvZGUiLCB0bXBidWYsIDI1LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgdG1wYnVmICwgMik7Ci0KLQkJCQkJCWlmIChzdHJsZW4ocEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpICE9IDApCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gVFJVRTsKLQkJCQkJCX0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlDb2RlPSVzXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkpOwotCQkJCQl9Ci0JCQkJCS8vQ2hhbm5lbEdlb2dyYXBoeQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsR2VvZ3JhcGh5IiwgdG1wYnVmLCAyNSwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJVUNIQVIgR2VvZ3JhcGh5ID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJaWYgKEdlb2dyYXBoeSA8PSBCT1RIKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEdlb2dyYXBoeTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVsyXSA9Ci0JCQkJCQkJCShwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gQk9USCkgPyAnICcgOiAoKHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9PSBJRE9SKSA/ICdJJyA6ICdPJyk7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbEdlb2dyYXBoeT0lZFxuIiwgcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBCT1RIOwotCQkJCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPSAnICc7Ci0JCQkJCX0KLQotCQkJCQl7Ci0JCQkJCQkvL1NTSUQKLQkJCQkJCWlmIChSVE1QR2V0Q3JpdGljYWxQYXJhbWV0ZXIoIlNTSUQiLCB0bXBidWYsIDI1NiwgYnVmZmVyKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPD0gMzIpCi0JCQkJCQkJewotCQkJIAkJCQkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IChVQ0hBUikgc3RybGVuKHRtcGJ1Zik7Ci0JCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKTsKLQkJCQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOwotCQkJCQkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihTU0lEPSVzKVxuIiwgX19mdW5jX18sIHRtcGJ1ZikpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXsKLQkJCQkJCS8vTmV0d29ya1R5cGUKLQkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJOZXR3b3JrVHlwZSIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlcikpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0JCQkJCQkJaWYgKHN0cmNtcCh0bXBidWYsICJBZGhvYyIpID09IDApCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfQURIT0M7Ci0JCQkJCQkJZWxzZSAvL0RlZmF1bHQgSW5mcmFzdHJ1Y3R1cmUgbW9kZQotCQkJCQkJCQlwQWQtPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwotCQkJCQkJCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KE5ldHdvcmtUeXBlPSVkKVxuIiwgX19mdW5jX18sIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vQ2hhbm5lbAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCQkJfQotCQkJCQkvL1dpcmVsZXNzTW9kZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlpbnQgdmFsdWUgID0gMCwgbWF4UGh5TW9kZSA9IFBIWV8xMUc7Ci0KLQkJCQkJCW1heFBoeU1vZGUgPSBQSFlfMTFOXzVHOwotCi0JCQkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCQkJCWlmICh2YWx1ZSA8PSBtYXhQaHlNb2RlKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSB2YWx1ZTsKLQkJCQkJCX0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAvL0Jhc2ljUmF0ZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXAgPSAoVUxPTkcpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCYXNpY1JhdGU9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5CYXNpY1JhdGVCaXRtYXApKTsKLQkJCQkJfQotCQkJCQkvL0JlYWNvblBlcmlvZAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCZWFjb25QZXJpb2QiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAvL1R4UG93ZXIKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhQb3dlciIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFBvd2VyPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKLQkJCQkJfQotCQkJCQkvL0JHUHJvdGVjdGlvbgotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCR1Byb3RlY3Rpb24iLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSAxOiAvL0Fsd2F5cyBPbgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAxOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDA6IC8vQVVUTwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkdQcm90ZWN0aW9uPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7Ci0JCQkJCX0KLQkJCQkJLy9PTEJDRGV0ZWN0aW9uCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRpc2FibGVPTEJDIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJCQkJewotCQkJCQkJCWNhc2UgMTogLy9kaXNhYmxlIE9MQkMgRGV0ZWN0aW9uCi0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAwOiAvL2VuYWJsZSBPTEJDIERldGVjdGlvbgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0PSAwOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk9MQkNEZXRlY3Rpb249JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCkpOwotCQkJCQl9Ci0JCQkJCS8vVHhQcmVhbWJsZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeFByZWFtYmxlIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJCQkJewotCQkJCQkJCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0OwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVMb25nOgotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBSdDgwMl8xMVByZWFtYmxlTG9uZzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeFByZWFtYmxlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSkpOwotCQkJCQl9Ci0JCQkJCS8vUlRTVGhyZXNob2xkCi0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJUU1RocmVzaG9sZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCVJ0c1RocmVzaCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlpZiggKFJ0c1RocmVzaCA+PSAxKSAmJiAoUnRzVGhyZXNoIDw9IE1BWF9SVFNfVEhSRVNIT0xEKSApCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkICA9IChVU0hPUlQpUnRzVGhyZXNoOwotCQkJCQkJZWxzZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVFNUaHJlc2hvbGQ9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkpOwotCQkJCQl9Ci0JCQkJCS8vRnJhZ1RocmVzaG9sZAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJGcmFnVGhyZXNob2xkIiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0KLQkJCQkJCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0JCQkJCQl7IC8vaWxsZWdhbCBGcmFnVGhyZXNoIHNvIHdlIHNldCBpdCB0byBkZWZhdWx0Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChGcmFnVGhyZXNoICUgMiA9PSAxKQotCQkJCQkJewotCQkJCQkJCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50Ci0JCQkJCQkJLy8gb2YgYW4gTVNEVSBvciBNTVBEVSwgd2hpY2ggbWF5IGJlIGVpdGhlciBhbiBldmVuIG9yIGFuIG9kZCBudW1iZXIgb2Ygb2N0ZXRzLgotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotCQkJCQkJfQotCQkJCQkJLy9wQWQtPkNvbW1vbkNmZy5BbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhZ1RocmVzaG9sZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKLQkJCQkJfQotCQkJCQkvL1R4QnVyc3QKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhCdXJzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOwotCQkJCQkJZWxzZSAvL0Rpc2FibGUKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhCdXJzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpKTsKLQkJCQkJfQotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCQkJCQkvL1BrdEFnZ3JlZ2F0ZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJQa3RBZ2dyZWdhdGUiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOwotCQkJCQkJZWxzZSAvL0Rpc2FibGUKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7Ci0jaWZkZWYgUElHR1lCQUNLX1NVUFBPUlQKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsKLSNlbmRpZiAvLyBQSUdHWUJBQ0tfU1VQUE9SVCAvLwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGt0QWdncmVnYXRlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7Ci0JCQkJCX0KLSNlbHNlCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLQkJCQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBGQUxTRTsKLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLQkJCQkJLy8gV21tQ2FwYWJsZQotCQkJCQlydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIGJ1ZmZlcik7Ci0KLQkJCQkJLy9TaG9ydFNsb3QKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiU2hvcnRTbG90IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJaWYoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSAhPSAwKSAgLy9FbmFibGUKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7Ci0JCQkJCQllbHNlIC8vRGlzYWJsZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gRkFMU0U7Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNob3J0U2xvdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUpKTsKLQkJCQkJfQotCQkJCQkvL0lFRUU4MDIxMUgKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSUVFRTgwMjExSCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJCQkJICAgIHsKLSAgICAJCQkJCQlpZihzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApICE9IDApICAvL0VuYWJsZQotICAgIAkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IFRSVUU7Ci0gICAgCQkJCQkJZWxzZSAvL0Rpc2FibGUKLSAgICAJCQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKLQotICAgIAkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklFRUU4MDIxMUg9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIKSk7Ci0JCQkJCSAgICB9Ci0JCQkJCX0KLQkJCQkJLy9DU1BlcmlvZAotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDU1BlcmlvZCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSAwOwotCi0gICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDU1BlcmlvZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QpKTsKLQkJCQkJfQotCi0JCQkJCS8vUkRSZWdpb24KLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUkRSZWdpb24iLCB0bXBidWYsIDEyOCwgYnVmZmVyKSkKLQkJCQkJewotCQkJCQkJaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUF9XNTMiLCA3KSA9PSAwKSB8fCAoc3RybmNtcCh0bXBidWYsICJqYXBfdzUzIiwgNykgPT0gMCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBKQVBfVzUzOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzU2IiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1NiIsIDcpID09IDApKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gSkFQX1c1NjsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwIiwgMykgPT0gMCkpCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBKQVA7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSA1OwotCQkJCQkJfQotCQkJCQkJZWxzZSAgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkZDQyIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImZjYyIsIDMpID09IDApKQotCQkJCQkJewotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gRkNDOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gNTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkNFIiwgMikgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiY2UiLCAyKSA9PSAwKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IENFOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJCQkJfQotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSRFJlZ2lvbj0lZFxuIiwgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24pKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID0gQ0U7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJCQl9Ci0KLQkJCQkJLy9XaXJlbGVzc0V2ZW50Ci0JCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldpcmVsZXNzRXZlbnQiLCB0bXBidWYsIDEwLCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQkJZWxzZQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gMDsJLy8gZGlzYWJsZQotICAgCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKLQkJCQkJfQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0JCQkJCXsKLQkJCQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3Q9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0ID0gMDsJLy8gZGlzYWJsZQotCi0gICAJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXaUZpVGVzdD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpRmlUZXN0KSk7Ci0JCQkJCX0KLQkJCQkJLy9BdXRoTW9kZQotCQkJCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRoTW9kZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQl7Ci0JCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQQVVUTyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid2VwYXV0byIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJTSEFSRUQiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInNoYXJlZCIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQVBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhcHNrIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3Bhbm9uZSIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyUFNLIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEycHNrIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQSIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMiIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvL0VuY3J5cFR5cGUKLQkJCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRW5jcnlwVHlwZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIpKQotCQkJCQl7Ci0JCQkJCQl7Ci0JCQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3ZXAiKSA9PSAwKSkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ0a2lwIikgPT0gMCkpCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImFlcyIpID09IDApKQotCQkJCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0JCQkJCQkJLy8gVXBkYXRlIGFsbCB3ZXBzdGF0dXMgcmVsYXRlZAotCQkJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIJCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQkJCQlwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzIAk9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQkJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyIAkJPSBGQUxTRTsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fZnVuY19fLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXsKLQkJCQkJCWlmKFJUTVBHZXRDcml0aWNhbFBhcmFtZXRlcigiV1BBUFNLIiwgdG1wYnVmLCA1MTIsIGJ1ZmZlcikpCi0JCQkJCQl7Ci0JCQkJCQkJaW50ICAgICBlcnI9MDsKLQotCQkJCQkJCXRtcGJ1ZltzdHJsZW4odG1wYnVmKV0gPSAnXDAnOyAvLyBtYWtlIFNUQSBjYW4gcHJvY2VzcyAuJF4mIGZvciBXUEFQU0sgaW5wdXQKLQotCQkJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCQkJCQkJCSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWVyciA9IDE7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKChzdHJsZW4odG1wYnVmKSA+PSA4KSAmJiAoc3RybGVuKHRtcGJ1ZikgPCA2NCkpCi0JCQkJCQkJewotCQkJCQkJCQlQYXNzd29yZEhhc2goKGNoYXIgKil0bXBidWYsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOwotCi0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHN0cmxlbih0bXBidWYpID09IDY0KQotCQkJCQkJCXsKLQkJCQkJCQkJQXRvSCh0bXBidWYsIGtleU1hdGVyaWFsLCAzMik7Ci0JCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJZXJyID0gMTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6OihXUEFQU0sga2V5LXN0cmluZyByZXF1aXJlZCA4IH4gNjQgY2hhcmFjdGVycyEpXG4iLCBfX2Z1bmNfXykpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChlcnIgPT0gMCkKLQkgICAgICAgICAgICAgICAgICAgICAgICAJCQl7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkJCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkvLyBTdGFydCBTVEEgc3VwcGxpY2FudCBzdGF0ZSBtYWNoaW5lCi0JCQkJCQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1NUQVJUOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihXUEFQU0s9JXMpXG4iLCBfX2Z1bmNfXywgdG1wYnVmKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy9EZWZhdWx0S2V5SUQsIEtleVR5cGUsIEtleVN0cgotCQkJCQlydG1wX3JlYWRfa2V5X3Bhcm1zX2Zyb21fZmlsZShwQWQsIHRtcGJ1ZiwgYnVmZmVyKTsKLQotCQkJCQlIVFBhcmFtZXRlcnNIb29rKHBBZCwgdG1wYnVmLCBidWZmZXIpOwotCi0JCQkJCXsKLQkJCQkJCS8vUFNNb2RlCi0jaWZkZWYgUlQyODYwCi0JCQkJCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUFNNb2RlIiwgdG1wYnVmLCAzMiwgYnVmZmVyKSkKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBTTW9kZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlcikpCi0jZW5kaWYKLQkJCQkJCXsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJNQVhfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJtYXhfcHNwIikgPT0gMCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtKHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gNTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkZhc3RfUFNQIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJmYXN0X3BzcCIpID09IDApCi0JCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkZBU1RfUFNQIikgPT0gMCkpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotCQkJCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiTGVnYWN5X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibGVnYWN5X3BzcCIpID09IDApCi0JCQkJCQkJCQl8fCAoc3RyY21wKHRtcGJ1ZiwgIkxFR0FDWV9QU1AiKSA9PSAwKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0JCQkJCQkJCQkvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLQkJCQkJCQkJCS8vCSAgIE1sbWVTZXRQc21CaXQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLQkJCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID09IEZBTFNFKQotCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTGVnYWN5X1BTUDsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0JCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJeyAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQotCQkJCQkJCQkJLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQotCQkJCQkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOwotCQkJCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJCQkJCQkJfQotCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU01vZGU9JWxkXG4iLCBwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gRmFzdFJvYW1pbmcKLQkJCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJGYXN0Um9hbWluZyIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlcikpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgPT0gMCkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYkZhc3RSb2FtaW5nID0gRkFMU0U7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQWQtPlN0YUNmZy5iRmFzdFJvYW1pbmcgPSBUUlVFOwotCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmFzdFJvYW1pbmc9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJGYXN0Um9hbWluZykpOwotCQkJCQkJfQotCQkJCQkJLy8gUm9hbVRocmVzaG9sZAotCQkJCQkJaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJvYW1UaHJlc2hvbGQiLCB0bXBidWYsIDMyLCBidWZmZXIpKQotCQkJCQkJewotCQkJCQkJCWxvbmcgbEluZm8gPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQkJCQkJaWYgKGxJbmZvID4gOTAgfHwgbEluZm8gPCA2MCkKLQkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gLTcwOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEFkLT5TdGFDZmcuZEJtVG9Sb2FtID0gKENIQVIpKC0xKSpsSW5mbzsKLQotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJvYW1UaHJlc2hvbGQ9JWQgIGRCbVxuIiwgcEFkLT5TdGFDZmcuZEJtVG9Sb2FtKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlRHbldpZmlUZXN0IiwgdG1wYnVmLCAxMCwgYnVmZmVyKSkKLQkJCQkJCXsKLQkJCQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCi0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVEduV2lmaVRlc3Q9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiAlcyBkb2VzIG5vdCBoYXZlIGEgd3JpdGUgbWV0aG9kXG4iLCBzcmMpKTsKLQkJCX0KLQotCQkJcmV0dmFsPWZpbHBfY2xvc2Uoc3JjZixOVUxMKTsKLQotCQkJaWYgKHJldHZhbCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzZXRfZnMob3JnZnMpOwotCi0Ja2ZyZWUoYnVmZmVyKTsKLQlrZnJlZSh0bXBidWYpOwotCi0JcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotc3RhdGljIHZvaWQJSFRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglDSEFSCQkgICpwVmFsdWVTdHIsCi0JSU4JQ0hBUgkJICAqcElucHV0KQotewotCi0JSU5UIFZhbHVlOwotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1BST1RFQ1QiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFByb3RlY3Rpb24gID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNFbmFibGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QU0VuYWJsZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA+IE1NUFNfRU5BQkxFKQotICAgICAgICB7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVE9ETzogYWRkIG1pbW8gcG93ZXIgc2F2aW5nIG1lY2hhbmlzbQotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFMgTW9kZSAgPSAlZFxuIiwgVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFEZWNsaW5lIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBEZWNsaW5lICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9EaXNhYmxlUmVvcmRlcmluZyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FibGVSZW9yZGVyaW5nICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQXV0b0JBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0KSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOwotCSAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7Ci0gICAgICAgIH0KLSAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkE7Ci0JcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3k7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBBdXRvIEJBICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLQkvLyBUeF8rSFRDIGZyYW1lCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0hUQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICAgICAgCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4ICtIVEMgZnJhbWUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0JfQotCi0JLy8gRW5hYmxlIEhUIExpbmsgQWRhcHRhdGlvbiBDb250cm9sCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0xpbmtBZGFwdCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IExpbmsgQWRhcHRhdGlvbiBDb250cm9sID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOwotCX0KLQotCS8vIFJldmVyc2UgRGlyZWN0aW9uIE1lY2hhbmlzbQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SREciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJERyA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKLQl9Ci0KLQotCi0KLQkvLyBUeCBBLU1TVUQgPwotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BTVNEVSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IEEtTVNEVSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLQl9Ci0KLQkvLyBNUERVIERlbnNpdHkKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTXBkdURlbnNpdHkiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkXG4iLCBWYWx1ZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZCAoRGVmYXVsdClcbiIsIDQpKTsKLQkJfQotCX0KLQotCS8vIE1heCBSeCBCQSBXaW5kb3cgU2l6ZQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQVdpblNpemUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gJWRcbiIsIFZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9IDY0IChEZWZ1YWx0KVxuIikpOwotCQl9Ci0KLQl9Ci0KLQkvLyBHdWFyZCBJbnRlcnZhbAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9HSSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IEdJXzQwMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBHdWFyZCBJbnRlcnZhbCA9ICVzXG4iLCAoVmFsdWU9PUdJXzQwMCkgPyAiNDAwIiA6ICI4MDAiICkpOwotCX0KLQotCS8vIEhUIE9wZXJhdGlvbiBNb2RlIDogTWl4ZWQgTW9kZSAsIEdyZWVuIEZpZWxkCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX09wTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IEhUTU9ERV9HRikKLQkJewotCi0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE9wZXJhdGUgTW9kZSA9ICVzXG4iLCAoVmFsdWU9PUhUTU9ERV9HRikgPyAiR3JlZW4gRmllbGQiIDogIk1peGVkIE1vZGUiICkpOwotCX0KLQotCS8vIEZpeGVkIFR4IG1vZGUgOiBDQ0ssIE9GRE0KLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRml4ZWRUeE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQpKQotCXsKLQkJVUNIQVIJZml4X3R4X21vZGU7Ci0KLQkJewotCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7Ci0KLQkJCWlmIChzdHJjbXAocFZhbHVlU3RyLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgIm9mZG0iKSA9PSAwKQotCQkJewotCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiY2NrIikgPT0gMCkKLQkJCXsKLQkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiSFQiKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJodCIpID09IDApCi0JCQl7Ci0JCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQkJCS8vIDEgOiBDQ0sKLQkJCQkvLyAyIDogT0ZETQotCQkJCS8vIG90aGVyd2lzZSA6IEhUCi0JCQkJaWYgKFZhbHVlID09IEZJWEVEX1RYTU9ERV9DQ0sgfHwgVmFsdWUgPT0gRklYRURfVFhNT0RFX09GRE0pCi0JCQkJCWZpeF90eF9tb2RlID0gVmFsdWU7Ci0JCQkJZWxzZQotCQkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQkJfQotCi0JCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaXhlZCBUeCBNb2RlID0gJWRcbiIsIGZpeF90eF9tb2RlKSk7Ci0KLQkJfQotCX0KLQotCi0JLy8gQ2hhbm5lbCBXaWR0aAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CVyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IEJXXzQwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCX0KLQotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQkJcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAoVmFsdWU9PUJXXzQwKSA/ICI0MCBNSHoiIDogIjIwIE1IeiIgKSk7Ci0JfQotCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0VYVENIQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEV4dCBDaGFubmVsID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiQkVMT1ciIDogIkFCT1ZFIiApKTsKLQl9Ci0KLQkvLyBNU0MKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUNTIiwgcFZhbHVlU3RyLCA1MCwgcElucHV0KSkKLQl7Ci0JCXsKLQkJCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQotCQkJaWYgKChWYWx1ZSA+PSAwICYmIFZhbHVlIDw9IDIzKSB8fCAoVmFsdWUgPT0gMzIpKSAvLyAzKjMKLQkJewotCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IFZhbHVlOwotCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9ICVkXG4iLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICA9IE1DU19BVVRPOwotCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogTUNTID0gQVVUT1xuIikpOwotCQl9Ci0JfQotCX0KLQotCS8vIFNUQkMKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfU1RCQyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBTVEJDID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7Ci0JfQotCi0JLy8gNDBfTWh6X0ludG9sZXJhbnQKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfNDBNSFpfSU5UT0xFUkFOVCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IDQwTUhaIElOVE9MRVJBTlQgPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50KSk7Ci0JfQotCS8vSFRfVHhTdHJlYW0KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9UeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCi0JewotCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOiAvLyAzKjMKLQkJCWRlZmF1bHQ6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAzOwotCi0JCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsgLy8gb25seSAyIHR4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKLQkJCQlicmVhazsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogVHggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtKSk7Ci0JfQotCS8vSFRfUnhTdHJlYW0KLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SeFN0cmVhbSIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCkpCi0JewotCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCkpCi0JCXsKLQkJCWNhc2UgMToKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJZGVmYXVsdDoKLQkJCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDM7Ci0KLQkJCQlpZiAocEFkLT5NQUNWZXJzaW9uIDwgUkFMSU5LXzI4ODNfVkVSU0lPTikKLQkJCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAyOyAvLyBvbmx5IDIgcnggc3RyZWFtcyBmb3IgUlQyODYwIHNlcmllcwotCQkJCWJyZWFrOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBSeCBTdHJlYW0gPSAlZFxuIiwgcEFkLT5Db21tb25DZmcuUnhTdHJlYW0pKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTdlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0X3VzYi5jCkBAIC0wLDAgKzEsNzk5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCU1vZHVsZSBOYW1lOgorCXJ0dXNiX2J1bGsuYworCisJQWJzdHJhY3Q6CisKKwlSZXZpc2lvbiBIaXN0b3J5OgorCVdobwkJCVdoZW4JCVdoYXQKKwktLS0tLS0tLQktLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlOYW1lCQlEYXRlCQlNb2RpZmljYXRpb24gbG9ncworCisqLworCisjaW5jbHVkZSAicnRfY29uZmlnLmgiCisKK3ZvaWQgZHVtcF91cmIoc3RydWN0IHVyYiAqcHVyYikKK3sKKwlwcmludGsoInVyYiAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiKTsKKwlwcmludGsoIlx0ZGV2ICAgICAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLCAodW5zaWduZWQgbG9uZylwdXJiLT5kZXYpOworCXByaW50aygiXHRcdGRldi0+c3RhdGUgICAgICAgICAgOjB4JWRcbiIsIHB1cmItPmRldi0+c3RhdGUpOworCXByaW50aygiXHRwaXBlICAgICAgICAgICAgICAgICAgOjB4JTA4eFxuIiwgcHVyYi0+cGlwZSk7CisJcHJpbnRrKCJcdHN0YXR1cyAgICAgICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXR1cyk7CisJcHJpbnRrKCJcdHRyYW5zZmVyX2ZsYWdzICAgICAgICA6MHglMDh4XG4iLCBwdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJcHJpbnRrKCJcdHRyYW5zZmVyX2J1ZmZlciAgICAgICA6MHglMDhseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwlwcmludGsoIlx0dHJhbnNmZXJfYnVmZmVyX2xlbmd0aDolZFxuIiwgcHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJcHJpbnRrKCJcdGFjdHVhbF9sZW5ndGggICAgICAgICA6JWRcbiIsIHB1cmItPmFjdHVhbF9sZW5ndGgpOworCXByaW50aygiXHRzZXR1cF9wYWNrZXQgICAgICAgICAgOjB4JTA4bHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPnNldHVwX3BhY2tldCk7CisJcHJpbnRrKCJcdHN0YXJ0X2ZyYW1lICAgICAgICAgICA6JWRcbiIsIHB1cmItPnN0YXJ0X2ZyYW1lKTsKKwlwcmludGsoIlx0bnVtYmVyX29mX3BhY2tldHMgICAgIDolZFxuIiwgcHVyYi0+bnVtYmVyX29mX3BhY2tldHMpOworCXByaW50aygiXHRpbnRlcnZhbCAgICAgICAgICAgICAgOiVkXG4iLCBwdXJiLT5pbnRlcnZhbCk7CisJcHJpbnRrKCJcdGVycm9yX2NvdW50ICAgICAgICAgICA6JWRcbiIsIHB1cmItPmVycm9yX2NvdW50KTsKKwlwcmludGsoIlx0Y29udGV4dCAgICAgICAgICAgICAgIDoweCUwOGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylwdXJiLT5jb250ZXh0KTsKKwlwcmludGsoIlx0Y29tcGxldGUgICAgICAgICAgICAgIDoweCUwOGx4XG5cbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKXB1cmItPmNvbXBsZXRlKTsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDcmVhdGUga2VybmVsIHRocmVhZHMgJiB0YXNrbGV0cy4KKworQXJndW1lbnRzOgorICAgICpuZXRfZGV2CQkJUG9pbnRlciB0byB3aXJlbGVzcyBuZXQgZGV2aWNlIGludGVyZmFjZQorCitSZXR1cm4gVmFsdWU6CisJTkRJU19TVEFUVVNfU1VDQ0VTUworCU5ESVNfU1RBVFVTX0ZBSUxVUkUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSdG1wTWdtdFRhc2tJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzazsKKwlpbnQgc3RhdHVzOworCisJLyoKKwkgICBDcmVhdCBUaW1lclEgVGhyZWFkLCBXZSBuZWVkIGluaXQgdGltZXJRIHJlbGF0ZWQgc3RydWN0dXJlIGJlZm9yZSBjcmVhdGUgdGhlIHRpbWVyIHRocmVhZC4KKwkgKi8KKwlSdG1wVGltZXJRSW5pdChwQWQpOworCisJcFRhc2sgPSAmcEFkLT50aW1lclRhc2s7CisJUnRtcE9TVGFza0luaXQocFRhc2ssICJSdG1wVGltZXJUYXNrIiwgcEFkKTsKKwlzdGF0dXMgPSBSdG1wT1NUYXNrQXR0YWNoKHBUYXNrLCBSdG1wVGltZXJRVGhyZWFkLCBwVGFzayk7CisJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgUnRtcFRpbWVyUVRocmVhZFxuIiwKKwkJICAgICAgIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBBZC0+bmV0X2RldikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwkvKiBDcmVhdCBNTE1FIFRocmVhZCAqLworCXBUYXNrID0gJnBBZC0+bWxtZVRhc2s7CisJUnRtcE9TVGFza0luaXQocFRhc2ssICJSdG1wTWxtZVRhc2siLCBwQWQpOworCXN0YXR1cyA9IFJ0bXBPU1Rhc2tBdHRhY2gocFRhc2ssIE1sbWVUaHJlYWQsIHBUYXNrKTsKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBNbG1lVGhyZWFkXG4iLAorCQkgICAgICAgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEFkLT5uZXRfZGV2KSk7CisJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOworCX0KKworCS8qIENyZWF0IENvbW1hbmQgVGhyZWFkICovCisJcFRhc2sgPSAmcEFkLT5jbWRRVGFzazsKKwlSdG1wT1NUYXNrSW5pdChwVGFzaywgIlJ0bXBDbWRRVGFzayIsIHBBZCk7CisJc3RhdHVzID0gUnRtcE9TVGFza0F0dGFjaChwVGFzaywgUlRVU0JDbWRUaHJlYWQsIHBUYXNrKTsKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdGFydCBSVFVTQkNtZFRocmVhZFxuIiwKKwkJICAgICAgIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBBZC0+bmV0X2RldikpOworCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKK30KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBDbG9zZSBrZXJuZWwgdGhyZWFkcy4KKworQXJndW1lbnRzOgorCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgTk9ORQorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLwordm9pZCBSdG1wTWdtdFRhc2tFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrOworCisJLyogU2xlZXAgNTAgbWlsbGlzZWNvbmRzIHNvIHBlbmRpbmcgaW8gbWlnaHQgZmluaXNoIG5vcm1hbGx5ICovCisJUlRNUHVzZWNEZWxheSg1MDAwMCk7CisKKwkvKiBXZSB3YW50IHRvIHdhaXQgdW50aWwgYWxsIHBlbmRpbmcgcmVjZWl2ZXMgYW5kIHNlbmRzIHRvIHRoZSAqLworCS8qIGRldmljZSBvYmplY3QuIFdlIGNhbmNlbCBhbnkgKi8KKwkvKiBpcnBzLiBXYWl0IHVudGlsIHNlbmRzIGFuZCByZWNlaXZlcyBoYXZlIHN0b3BwZWQuICovCisJUlRVU0JDYW5jZWxQZW5kaW5nSVJQcyhwQWQpOworCisJLyogV2UgbmVlZCBjbGVhciB0aW1lclEgcmVsYXRlZCBzdHJ1Y3R1cmUgYmVmb3JlIGV4aXRzIG9mIHRoZSB0aW1lciB0aHJlYWQuICovCisJUnRtcFRpbWVyUUV4aXQocEFkKTsKKworCS8qIFRlcm1pbmF0ZSBNbG1lIFRocmVhZCAqLworCXBUYXNrID0gJnBBZC0+bWxtZVRhc2s7CisJcmV0ID0gUnRtcE9TVGFza0tpbGwocFRhc2spOworCWlmIChyZXQgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczoga2lsbCB0YXNrKCVzKSBmYWlsZWQhXG4iLAorCQkJCQkgIFJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBBZC0+CisJCQkJCQkJCSAgICAgbmV0X2RldiksCisJCQkJCSAgcFRhc2stPnRhc2tOYW1lKSk7CisJfQorCisJLyogVGVybWluYXRlIGNtZFEgdGhyZWFkICovCisJcFRhc2sgPSAmcEFkLT5jbWRRVGFzazsKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlpZiAocFRhc2stPmt0aHJlYWRfdGFzaykKKyNlbHNlCisJQ0hFQ0tfUElEX0xFR0FMSVRZKHBUYXNrLT50YXNrUElEKQorI2VuZGlmCisJeworCQltYigpOworCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKKwkJcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUTVBfVEFTS19TVEFUX1NUT1BFRDsKKwkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CisJCW1iKCk7CisJCS8qUlRVU0JDTURVcChwQWQpOyAqLworCQlyZXQgPSBSdG1wT1NUYXNrS2lsbChwVGFzayk7CisJCWlmIChyZXQgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGtpbGwgdGFzayglcykgZmFpbGVkIVxuIiwKKwkJCQkJCSAgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUKKwkJCQkJCSAgKHBBZC0+bmV0X2RldiksCisJCQkJCQkgIHBUYXNrLT50YXNrTmFtZSkpOworCQl9CisJCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVE1QX1RBU0tfU1RBVF9VTktOT1dOOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aW1lciB0aHJlYWQgKi8KKwlwVGFzayA9ICZwQWQtPnRpbWVyVGFzazsKKwlyZXQgPSBSdG1wT1NUYXNrS2lsbChwVGFzayk7CisJaWYgKHJldCA9PSBORElTX1NUQVRVU19GQUlMVVJFKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBraWxsIHRhc2soJXMpIGZhaWxlZCFcbiIsCisJCQkJCSAgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUocEFkLT4KKwkJCQkJCQkJICAgICBuZXRfZGV2KSwKKwkJCQkJICBwVGFzay0+dGFza05hbWUpKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgcnR1c2JfZGF0YW91dF9jb21wbGV0ZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCB1cmIgKnBVcmI7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXU4IEJ1bGtPdXRQaXBlSWQ7CisJaW50IFN0YXR1czsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwSFRUWENvbnRleHQgPSAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBIVFRYQ29udGV4dC0+cEFkOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCS8qIFN0b3JlIEJ1bGtPdXQgUGlwZUlkICovCisJQnVsa091dFBpcGVJZCA9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwlwQWQtPkJ1bGtPdXREYXRhT25lU2VjQ291bnQrKzsKKworCS8qREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJEb25lLUIoJWQpOkk9MHglbHgsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIEJ1bGtPdXRQaXBlSWQsIGluX2ludGVycnVwdCgpLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sICovCisJLyogICAgICAgICAgICAgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsgKi8KKworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID0gRkFMU0U7CisJcEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtCdWxrT3V0UGlwZUlkXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKSB7CisJCXBBZC0+QnVsa091dENvbXBsZXRlKys7CisKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkJcEFkLT5Db3VudGVyczgwMjMuR29vZFRyYW5zbWl0cysrOworCQkvKlJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7ICovCisJCUZSRUVfSFRUWF9SSU5HKHBBZCwgQnVsa091dFBpcGVJZCwgcEhUVFhDb250ZXh0KTsKKwkJLypSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7ICovCisKKwl9IGVsc2UJCQkvKiBTVEFUVVNfT1RIRVIgKi8KKwl7CisJCXU4ICpwQnVmOworCisJCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIrKzsKKworCQlwQnVmID0KKwkJICAgICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgIFdpcmVsZXNzUGFja2V0W3BIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbl07CisKKwkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkJICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCQkgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8CisJCQkJCSAgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpIHsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSBCdWxrT3V0UGlwZUlkOworCQkJcEFkLT5idWxrUmVzZXRSZXFbQnVsa091dFBpcGVJZF0gPSBwQWQtPkJ1bGtPdXRSZXE7CisJCX0KKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CisKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIkJ1bGtPdXREYXRhUGFja2V0IGZhaWxlZDogUmVhc29uQ29kZT0lZCFcbiIsCisJCQkgICAgICBTdGF0dXMpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlx0Pj5CdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLAorCQkJICAgICAgcEFkLT5CdWxrT3V0UmVxLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZSwKKwkJCSAgICAgIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJICAgICAoIlx0Pj5CdWxrT3V0IEhlYWRlcjoleCAleCAleCAleCAleCAleCAleCAleFxuIiwKKwkJCSAgICAgIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10sIHBCdWZbNF0sCisJCQkgICAgICBwQnVmWzVdLCBwQnVmWzZdLCBwQnVmWzddKSk7CisJCS8qREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj4+QnVsa091dENvbXBsZXRlQ2FuY2VsPTB4JXgsIEJ1bGtPdXRDb21wbGV0ZU90aGVyPTB4JXhcbiIsIHBBZC0+QnVsa091dENvbXBsZXRlQ2FuY2VsLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7ICovCisKKwl9CisKKwkvKiAqLworCS8qIGJJblVzZSA9IFRSVUUsIG1lYW5zIHNvbWUgcHJvY2VzcyBhcmUgZmlsbGluZyBUWCBkYXRhLCBhZnRlciB0aGF0IG11c3QgdHVybiBvbiBiV2FpdGluZ0J1bGtPdXQgKi8KKwkvKiBiV2FpdGluZ0J1bGtPdXQgPSBUUlVFLCBtZWFucyB0aGUgVFggZGF0YSBhcmUgd2FpdGluZyBmb3IgYnVsayBvdXQuICovCisJLyogKi8KKwkvKlJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7ICovCisJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9CisJICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pCisJICAgICYmIChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9CisJCShwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyA4KSkKKwkgICAgJiYgIVJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8CisJCQkJICAgICAgQnVsa091dFBpcGVJZCkpKSB7CisJCS8qIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhbGlhYmxlICovCisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CisJCQkJICAgICBCdWxrT3V0UGlwZUlkKSk7CisJfQorCS8qUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOyAqLworCisJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCisJLyogVGhlIHByb3RlY3Rpb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX251bGxfZnJhbWVfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBOdWxsQ29udGV4dDsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwTnVsbENvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBOdWxsQ29udGV4dC0+cEFkOworCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKKworCS8qIFJlc2V0IE51bGwgZnJhbWUgY29udGV4dCBmbGFncyAqLworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBOdWxsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CisJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKSB7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisKKwkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKKwl9IGVsc2UJCQkvKiBTVEFUVVNfT1RIRVIgKi8KKwl7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpKSB7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkJICAgICAoIkJ1bGsgT3V0IE51bGwgRnJhbWUgRmFpbGVkLCBSZWFzb25Db2RlPSVkIVxuIiwKKwkJCQkgICAgICBTdGF0dXMpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPQorCQkJICAgIChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKKwkJfQorCX0KKworCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLworCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKK30KKworc3RhdGljIHZvaWQgcnR1c2JfcnRzX2ZyYW1lX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUlRTQ29udGV4dDsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCWludCBTdGF0dXM7CisJdW5zaWduZWQgbG9uZyBpcnFGbGFnOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwUlRTQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcFJUU0NvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwkvKiBSZXNldCBSVFMgZnJhbWUgY29udGV4dCBmbGFncyAqLworCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCXBSVFNDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CisJcFJUU0NvbnRleHQtPkluVXNlID0gRkFMU0U7CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKSB7CisJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CisJfSBlbHNlCQkJLyogU1RBVFVTX09USEVSICovCisJeworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJCdWxrIE91dCBSVFMgRnJhbWUgRmFpbGVkXG4iKSk7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKKwkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0KKwkJCSAgICAoTUdNVFBJUEVJRFggfCBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRyk7CisJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7CisJCX0KKwl9CisKKwlSVE1QX1NFTV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7CisJcEFkLT5CdWxrT3V0UGVuZGluZ1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0gPSBGQUxTRTsKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdKTsKKworCS8qIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLiAqLworCS8qIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZSAqLworCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworfQorCitzdGF0aWMgdm9pZCBydHVzYl9wc3BvbGxfZnJhbWVfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBQc1BvbGxDb250ZXh0OworCXN0cnVjdCB1cmIgKnBVcmI7CisJaW50IFN0YXR1czsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcFBzUG9sbENvbnRleHQgPSAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBQc1BvbGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCisJLyogUmVzZXQgUHNQb2xsIGNvbnRleHQgZmxhZ3MgKi8KKwlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBQc1BvbGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOworCisJaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikgeworCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOworCX0gZWxzZQkJCS8qIFNUQVRVU19PVEhFUiAqLworCXsKKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpIHsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiQnVsayBPdXQgUFNQb2xsIEZhaWxlZFxuIikpOworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9CisJCQkgICAgKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfQorCX0KKworCVJUTVBfU0VNX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCXBBZC0+QnVsa091dFBlbmRpbmdbMF0gPSBGQUxTRTsKKwlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0pOworCisJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCisJLyogVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lICovCisJUlRVU0JLaWNrQnVsa091dChwQWQpOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgSGFuZGxlIHJlY2VpdmVkIHBhY2tldHMuCisKK0FyZ3VtZW50czoKKwlkYXRhCQkJCS0gVVJCIGluZm9ybWF0aW9uIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIE5vbmUKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK3N0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHVyYiAqcFVyYjsKKwlzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJaW50IFN0YXR1czsKKwl1bnNpZ25lZCBpbnQgSXJxRmxhZ3M7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBSeENvbnRleHQgPSAoc3RydWN0IHJ0X3J4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBSeENvbnRleHQtPnBBZDsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKwlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOworCXBSeENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKKwlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgKz0gcFVyYi0+YWN0dWFsX2xlbmd0aDsKKwkvKk5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmcEFkLT5QZW5kaW5nUngpOyAqLworCXBBZC0+UGVuZGluZ1J4LS07CisKKwlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKSB7CisJCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKKwkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7CisJCWlmIChwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpCS8qIEFzIGphbidzIGNvbW1lbnQsIGl0IG1heSBidWxrLWluIHN1Y2Nlc3MgYnV0IHNpemUgaXMgemVyby4gKi8KKwkJeworCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOworCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgUlhfUklOR19TSVpFKTsKKwkJfQorCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOworCX0gZWxzZQkJCS8qIFNUQVRVU19PVEhFUiAqLworCXsKKwkJcEFkLT5CdWxrSW5Db21wbGV0ZUZhaWwrKzsKKwkJLyogU3RpbGwgcmVhZCB0aGlzIHBhY2tldCBhbHRob3VnaCBpdCBtYXkgY29tdGFpbiB3cm9uZyBieXRlcy4gKi8KKwkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKKworCQkvKiBQYXJzaW5nIGFsbCBwYWNrZXRzLiBiZWNhdXNlIGFmdGVyIHJlc2V0LCB0aGUgaW5kZXggd2lsbCByZXNldCB0byBhbGwgemVyby4gKi8KKwkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJCSAgIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKKwkJCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkJICAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiQnVsayBJbiBGYWlsZWQuIFN0YXR1cz0lZCwgQklJZHg9MHgleCwgQklSSWR4PTB4JXgsIGFjdHVhbF9sZW5ndGg9IDB4JXhcbiIsCisJCQkJICAgICAgU3RhdHVzLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LAorCQkJCSAgICAgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LAorCQkJCSAgICAgIHBSeENvbnRleHQtPnBVcmItPmFjdHVhbF9sZW5ndGgpKTsKKworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUKTsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4sCisJCQkJCQlOVUxMLCAwKTsKKwkJfQorCX0KKworCUFTU0VSVCgocFJ4Q29udGV4dC0+SW5Vc2UgPT0gcFJ4Q29udGV4dC0+SVJQUGVuZGluZykpOworCisJUlRVU0JCdWxrUmVjZWl2ZShwQWQpOworCisJcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX21nbXRfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQ7CisJaW50IGluZGV4OworCXZvaWQgKnBQYWNrZXQ7CisJc3RydWN0IHVyYiAqcFVyYjsKKwlpbnQgU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBNTE1FQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcE1MTUVDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOworCWluZGV4ID0gcE1MTUVDb250ZXh0LT5TZWxmSWR4OworCisJQVNTRVJUKChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4ID09IGluZGV4KSk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOworCisJaWYgKFN0YXR1cyAhPSBVU0JfU1RfTk9FUlJPUikgeworCQkvKkJ1bGstT3V0IGZhaWwgc3RhdHVzIGhhbmRsZSAqLworCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgorCQkgICAgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCisJCSAgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKKwkJICAgICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJCdWxrIE91dCBNTE1FIEZhaWxlZCwgU3RhdHVzPSVkIVxuIiwKKwkJCQkgICAgICBTdGF0dXMpKTsKKwkJCS8qIFRPRE86IEhvdyB0byBoYW5kbGUgYWJvdXQgdGhlIE1MTUVCdWxrT3V0IGZhaWxlZCBpc3N1ZS4gTmVlZCB0byByZXNlbmQgdGhlIG1nbXQgcGt0PyAqLworCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9CisJCQkgICAgKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOworCQl9CisJfQorCisJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKKwlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7CisKKwlSVE1QX0lSUV9MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCS8qIFJlc2V0IE1MTUUgY29udGV4dCBmbGFncyAqLworCXBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKKwlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOworCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSAwOworCisJcFBhY2tldCA9IHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQ7CisJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7CisKKwkvKiBJbmNyZWFzZSBNZ210UmluZyBJbmRleCAqLworCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIE1HTVRfUklOR19TSVpFKTsKKwlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4Kys7CisJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPk1MTUVCdWxrT3V0TG9jaywgSXJxRmxhZ3MpOworCisJLyogTm8tbWF0dGVyIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgZnJlZSB0aGUgbWdtdCBwYWNrZXQuICovCisJaWYgKHBQYWNrZXQpCisJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJLyogZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LiAqLworCX0gZWxzZSB7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkgJiYgKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykpIHsJLyogRm9yIE1nbXQgQnVsay1PdXQgZmFpbGVkLCBpZ25vcmUgaXQgbm93LiAqLworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKworCQkJLyogQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuICovCisJCQkvKiBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUgKi8KKwkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwKKwkJCSAgICBNR01UX1JJTkdfU0laRQorCQkJICAgIC8qIHBNTE1FQ29udGV4dC0+YldhaXRpbmdCdWxrT3V0ID09IFRSVUUgKi8gKSB7CisJCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkJCX0KKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworfQorCitzdGF0aWMgdm9pZCBydHVzYl9hYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTggQnVsa091dFBpcGVJZCA9IDM7CisJc3RydWN0IHVyYiAqcFVyYjsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0dXNiX2RhdGFvdXRfY29tcGxldGUoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkvKiBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuICovCisJfSBlbHNlIHsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkgeworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCSAgICAvKigocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLworCQkJICAgIChwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgorCQkJICAgIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkgeworCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsCisJCQkJCQkgIE1BWF9UWF9QUk9DRVNTKTsKKwkJCX0KKworCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsCisJCQkJCSAgICBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgMyk7CisJCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJ0dXNiX2FjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwl1OCBCdWxrT3V0UGlwZUlkID0gMjsKKwlzdHJ1Y3QgdXJiICpwVXJiOworCisJcFVyYiA9IChzdHJ1Y3QgdXJiICopZGF0YTsKKwlwSFRUWENvbnRleHQgPSAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBIVFRYQ29udGV4dC0+cEFkOworCisJcnR1c2JfZGF0YW91dF9jb21wbGV0ZSgodW5zaWduZWQgbG9uZylwVXJiKTsKKworCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpKSB7CisJCS8qIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4gKi8KKwl9IGVsc2UgeworCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSB7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwKKwkJCQkJCU5VTEwsIDApOworCQl9IGVsc2UgeworCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOworCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgorCQkJICAgIC8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkgICAgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkgICAgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKSB7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwKKwkJCQkJCSAgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkJICAgIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCAyKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcnR1c2JfYWMxX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXU4IEJ1bGtPdXRQaXBlSWQgPSAxOworCXN0cnVjdCB1cmIgKnBVcmI7CisKKwlwVXJiID0gKHN0cnVjdCB1cmIgKilkYXRhOworCXBIVFRYQ29udGV4dCA9IChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcEhUVFhDb250ZXh0LT5wQWQ7CisKKwlydHVzYl9kYXRhb3V0X2NvbXBsZXRlKCh1bnNpZ25lZCBsb25nKXBVcmIpOworCisJaWYgKChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8CisJCQkJICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpIHsKKwkJLyogZG8gbm90aGluZyBhbmQgcmV0dXJuIGRpcmVjdGx5LiAqLworCX0gZWxzZSB7CisJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpIHsKKwkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULAorCQkJCQkJTlVMTCwgMCk7CisJCX0gZWxzZSB7CisJCQlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07CisJCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCisJCQkgICAgLyooKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KKwkJCSAgICAocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKKwkJCSAgICAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpIHsKKwkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLAorCQkJCQkJICBNQVhfVFhfUFJPQ0VTUyk7CisJCQl9CisKKwkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCQkgICAgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IDEpOworCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOworCQl9CisJfQorCXJldHVybjsKKworfQorCitzdGF0aWMgdm9pZCBydHVzYl9hYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF9odF90eF9jb250ZXh0ICpwSFRUWENvbnRleHQ7CisJdTggQnVsa091dFBpcGVJZCA9IDA7CisJc3RydWN0IHVyYiAqcFVyYjsKKworCXBVcmIgPSAoc3RydWN0IHVyYiAqKWRhdGE7CisJcEhUVFhDb250ZXh0ID0gKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwSFRUWENvbnRleHQtPnBBZDsKKworCXJ0dXNiX2RhdGFvdXRfY29tcGxldGUoKHVuc2lnbmVkIGxvbmcpcFVyYik7CisKKwlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkJCSAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkvKiBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuICovCisJfSBlbHNlIHsKKwkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkgeworCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsCisJCQkJCQlOVUxMLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKKwkJCWlmICgocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID4gMCkgJiYKKwkJCSAgICAvKiAgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCisJCQkgICAgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCisJCQkgICAgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKSB7CisJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwKKwkJCQkJCSAgTUFYX1RYX1BST0NFU1MpOworCQkJfQorCisJCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKTsKKwkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKwkJfQorCX0KKworCXJldHVybjsKKworfQorCitpbnQgUnRtcE5ldFRhc2tJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKworCS8qIENyZWF0ZSByZWNlaXZlIHRhc2tsZXQgKi8KKwl0YXNrbGV0X2luaXQoJnBPYmotPnJ4X2RvbmVfdGFzaywgcnhfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrLCBydHVzYl9tZ210X2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBydHVzYl9hYzBfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIHJ0dXNiX2FjMV9kbWFfZG9uZV90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzaywgcnR1c2JfYWMyX2RtYV9kb25lX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKwl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBydHVzYl9hYzNfZG1hX2RvbmVfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssCisJCSAgICAgcnR1c2JfbnVsbF9mcmFtZV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7CisJdGFza2xldF9pbml0KCZwT2JqLT5ydHNfZnJhbWVfY29tcGxldGVfdGFzaywKKwkJICAgICBydHVzYl9ydHNfZnJhbWVfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOworCXRhc2tsZXRfaW5pdCgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2ssCisJCSAgICAgcnR1c2JfcHNwb2xsX2ZyYW1lX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKKworCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOworfQorCit2b2lkIFJ0bXBOZXRUYXNrRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJnBPYmotPnRidHRfdGFzayk7CisJdGFza2xldF9raWxsKCZwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+cnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworCXRhc2tsZXRfa2lsbCgmcE9iai0+cHNwb2xsX2ZyYW1lX2NvbXBsZXRlX3Rhc2spOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaAppbmRleCA5MGZkNDBmLi5jNTBhYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXAuaApAQCAtNDEsMjcwICs0MSwxMzYgQEAKICNkZWZpbmUgX19SVE1QX0hfXwogCiAjaW5jbHVkZSAic3BlY3RydW1fZGVmLmgiCisjaW5jbHVkZSAicnRtcF9kb3QxMS5oIgorI2luY2x1ZGUgInJ0bXBfY2hpcC5oIgogCi0jaW5jbHVkZSAiYWlyb25ldC5oIgorc3RydWN0IHJ0X3J0bXBfYWRhcHRlcjsKIAotI2RlZmluZSBWSVJUVUFMX0lGX0lOQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCsrKQotI2RlZmluZSBWSVJUVUFMX0lGX0RFQyhfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudC0tKQotI2RlZmluZSBWSVJUVUFMX0lGX05VTShfX3BBZCkgKChfX3BBZCktPlZpcnR1YWxJZkNudCkKKy8qI2RlZmluZSBEQkcgICAgICAgICAgIDEgKi8KIAotI2lmZGVmIFJUMjg3MAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVGhlIFRYX0JVRkZFUiBzdHJ1Y3R1cmUgZm9ybXMgdGhlIHRyYW5zbWl0dGVkIFVTQiBwYWNrZXQgdG8gdGhlIGRldmljZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdHlwZWRlZiBzdHJ1Y3QgX19UWF9CVUZGRVJ7Ci0JdW5pb24JewotCQlVQ0hBUgkJCVdpcmVsZXNzUGFja2V0W1RYX0JVRkZFUl9OT1JNU0laRV07Ci0JCUhFQURFUl84MDJfMTEJTnVsbEZyYW1lOwotCQlQU1BPTExfRlJBTUUJUHNQb2xsUGFja2V0OwotCQlSVFNfRlJBTUUJCVJUU0ZyYW1lOwotCX1maWVsZDsKLQlVQ0hBUgkJCUFnZ3JlZ2F0aW9uWzRdOyAgLy9CdWZmZXIgZm9yIHNhdmUgQWdncmVnYXRpb24gc2l6ZS4KLX0gVFhfQlVGRkVSLCAqUFRYX0JVRkZFUjsKKy8qI2RlZmluZSBEQkdfRElBR05PU0UgICAgICAgICAgMSAqLwogCi10eXBlZGVmIHN0cnVjdCBfX0hUVFhfQlVGRkVSewotCXVuaW9uCXsKLQkJVUNIQVIJCQlXaXJlbGVzc1BhY2tldFtNQVhfVFhCVUxLX1NJWkVdOwotCQlIRUFERVJfODAyXzExCU51bGxGcmFtZTsKLQkJUFNQT0xMX0ZSQU1FCVBzUG9sbFBhY2tldDsKLQkJUlRTX0ZSQU1FCQlSVFNGcmFtZTsKLQl9ZmllbGQ7Ci0JVUNIQVIJCQlBZ2dyZWdhdGlvbls0XTsgIC8vQnVmZmVyIGZvciBzYXZlIEFnZ3JlZ2F0aW9uIHNpemUuCi19IEhUVFhfQlVGRkVSLCAqUEhUVFhfQlVGRkVSOwotCi0KLS8vIHVzZWQgdG8gdHJhY2sgZHJpdmVyLWdlbmVyYXRlZCB3cml0ZSBpcnBzCi10eXBlZGVmIHN0cnVjdCBfVFhfQ09OVEVYVAotewotCVBWT0lECQkJcEFkOwkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlQVVJCCQkJcFVyYjsJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVBJUlAJCQlwSXJwOwkJCS8vdXNlZCB0byBjYW5jZWwgcGVuZGluZyBidWxrIG91dC4KLQkJCQkJCQkJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JUFRYX0JVRkZFUgkJVHJhbnNmZXJCdWZmZXI7CS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JVUxPTkcJCQlCdWxrT3V0U2l6ZTsKLQlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7Ci0JVUNIQVIJCQlTZWxmSWR4OwotCUJPT0xFQU4JCQlJblVzZTsKLQlCT09MRUFOCQkJYldhaXRpbmdCdWxrT3V0OyAvLyBhdCBsZWFzdCBvbmUgcGFja2V0IGlzIGluIHRoaXMgVHhDb250ZXh0LCByZWFkeSBmb3IgbWFraW5nIElSUCBhbnl0aW1lLgotCUJPT0xFQU4JCQliRnVsbEZvckJ1bGtPdXQ7IC8vIGFsbCB0eCBidWZmZXIgYXJlIGZ1bGwgLCBzbyB3YWl0aW5nIGZvciB0eCBidWxrb3V0LgotCUJPT0xFQU4JCQlJUlBQZW5kaW5nOwotCUJPT0xFQU4JCQlMYXN0T25lOwotCUJPT0xFQU4JCQliQWdncmVnYXRpYmxlOwotCVVDSEFSCQkJSGVhZGVyXzgwMl8zW0xFTkdUSF84MDJfM107Ci0JVUNIQVIJCQlSc3ZbMl07Ci0JVUxPTkcJCQlEYXRhT2Zmc2V0OwotCVVJTlQJCQlUeFJhdGU7Ci0JZG1hX2FkZHJfdAkJZGF0YV9kbWE7CQkvLyB1cmIgZG1hIG9uIGxpbnV4Ci0KLX0JVFhfQ09OVEVYVCwgKlBUWF9DT05URVhULCAqKlBQVFhfQ09OVEVYVDsKLQotCi0vLyB1c2VkIHRvIHRyYWNrIGRyaXZlci1nZW5lcmF0ZWQgd3JpdGUgaXJwcwotdHlwZWRlZiBzdHJ1Y3QgX0hUX1RYX0NPTlRFWFQKLXsKLQlQVk9JRAkJCXBBZDsJCS8vSW5pdGlhbGl6ZWQgaW4gTWluaXBvcnRJbml0aWFsaXplCi0JUFVSQgkJCXBVcmI7CQkJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlQSVJQCQkJcElycDsJCQkvL3VzZWQgdG8gY2FuY2VsIHBlbmRpbmcgYnVsayBvdXQuCi0JCQkJCQkJCQkvL0luaXRpYWxpemVkIGluIE1pbmlwb3J0SW5pdGlhbGl6ZQotCVBIVFRYX0JVRkZFUglUcmFuc2ZlckJ1ZmZlcjsJLy9Jbml0aWFsaXplZCBpbiBNaW5pcG9ydEluaXRpYWxpemUKLQlVTE9ORwkJCUJ1bGtPdXRTaXplOwkvLyBJbmRpY2F0ZSB0aGUgdG90YWwgYnVsay1vdXQgc2l6ZSBpbiBieXRlcyBpbiBvbmUgYnVsay10cmFuc21pc3Npb24KLQlVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQ7Ci0JQk9PTEVBTgkJCUlSUFBlbmRpbmc7Ci0JQk9PTEVBTgkJCUxhc3RPbmU7Ci0JQk9PTEVBTgkJCWJDdXJXcml0aW5nOwotCUJPT0xFQU4JCQliUmluZ0VtcHR5OwotCUJPT0xFQU4JCQliQ29weVNhdmVQYWQ7Ci0JVUNIQVIJCQlTYXZlZFBhZFs4XTsKLQlVQ0hBUgkJCUhlYWRlcl84MDJfM1tMRU5HVEhfODAyXzNdOwotCVVMT05HCQkJQ3VyV3JpdGVQb3NpdGlvbjsJCS8vIEluZGljYXRlIHRoZSBidWZmZXIgb2Zmc2V0IHdoaWNoIHBhY2tldCB3aWxsIGJlIGluc2VydGVkIHN0YXJ0IGZyb20uCi0JVUxPTkcJCQlDdXJXcml0ZVJlYWxQb3M7CQkvLyBJbmRpY2F0ZSB0aGUgYnVmZmVyIG9mZnNldCB3aGljaCBwYWNrZXQgbm93IGFyZSB3cml0aW5nIHRvLgotCVVMT05HCQkJTmV4dEJ1bGtPdXRQb3NpdGlvbjsJLy8gSW5kaWNhdGUgdGhlIGJ1ZmZlciBzdGFydCBvZmZzZXQgb2YgYSBidWxrLXRyYW5zbWlzc2lvbgotCVVMT05HCQkJRU5leHRCdWxrT3V0UG9zaXRpb247CS8vIEluZGljYXRlIHRoZSBidWZmZXIgZW5kIG9mZnNldCBvZiBhIGJ1bGstdHJhbnNtaXNzaW9uCi0JVUlOVAkJCVR4UmF0ZTsKLQlkbWFfYWRkcl90CQlkYXRhX2RtYTsJCS8vIHVyYiBkbWEgb24gbGludXgKLX0JSFRfVFhfQ09OVEVYVCwgKlBIVF9UWF9DT05URVhULCAqKlBQSFRfVFhfQ09OVEVYVDsKLQotCi0vLwotLy8gU3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgcmVjZWl2ZSBwYWNrZXRzIGFuZCBidWZmZXJzIHRvIGluZGljYXRlCi0vLyByZWNlaXZlIGRhdGEgdG8gdGhlIHByb3RvY29sLgotLy8KLXR5cGVkZWYgc3RydWN0IF9SWF9DT05URVhUCi17Ci0JUFVDSEFSCQkJCVRyYW5zZmVyQnVmZmVyOwotCVBWT0lECQkJCXBBZDsKLQlQSVJQCQkJCXBJcnA7Ly91c2VkIHRvIGNhbmNlbCBwZW5kaW5nIGJ1bGsgaW4uCi0JUFVSQgkJCQlwVXJiOwotCS8vVGhlc2UgMiBCb29sZWFuIHNob3VsZG4ndCBib3RoIGJlIDEgYXQgdGhlIHNhbWUgdGltZS4KLQlVTE9ORwkJCQlCdWxrSW5PZmZzZXQ7CS8vIG51bWJlciBvZiBwYWNrZXRzIHdhaXRpbmcgZm9yIHJlb3JkZXJpbmcgLgotCUJPT0xFQU4JCQkJYlJ4SGFuZGxpbmc7CS8vIE5vdGlmeSB0aGlzIHBhY2tldCBpcyBiZWluZyBwcm9jZXNzIG5vdy4KLQlCT09MRUFOCQkJCUluVXNlOwkJCS8vIFVTQiBIYXJkd2FyZSBPY2N1cGllZC4gV2FpdCBmb3IgVVNCIEhXIHRvIHB1dCBwYWNrZXQuCi0JQk9PTEVBTgkJCQlSZWFkYWJsZTsJCS8vIFJlY2VpdmUgQ29tcGxldGUgYmFjay4gT0sgZm9yIGRyaXZlciB0byBpbmRpY2F0ZSByZWNlaXZpbmcgcGFja2V0LgotCUJPT0xFQU4JCQkJSVJQUGVuZGluZzsJCS8vIFRPRE86IFRvIGJlIHJlbW92ZWQKLQlhdG9taWNfdAkJCUlycExvY2s7Ci0JTkRJU19TUElOX0xPQ0sJCVJ4Q29udGV4dExvY2s7Ci0JZG1hX2FkZHJfdAkJCWRhdGFfZG1hOwkJLy8gdXJiIGRtYSBvbiBsaW51eAotfQlSWF9DT05URVhULCAqUFJYX0NPTlRFWFQ7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLQotLy8KLS8vICBORElTIFZlcnNpb24gZGVmaW5pdGlvbnMKLS8vCi0jaWZkZWYgIE5ESVM1MF9NSU5JUE9SVAotI2RlZmluZSBSVE1QX05ESVNfTUFKT1JfVkVSU0lPTiAgICAgNQotI2RlZmluZSBSVE1QX05ESVNfTUlOT1JfVkVSU0lPTiAgICAgMAotI2VuZGlmCi0KLSNpZmRlZiAgTkRJUzUxX01JTklQT1JUCi0jZGVmaW5lIFJUTVBfTkRJU19NQUpPUl9WRVJTSU9OICAgICA1Ci0jZGVmaW5lIFJUTVBfTkRJU19NSU5PUl9WRVJTSU9OICAgICAxCi0jZW5kaWYKLQotZXh0ZXJuICBjaGFyICAgIE5JQ19WRU5ET1JfREVTQ1tdOwotZXh0ZXJuICBpbnQgICAgIE5JQ19WRU5ET1JfREVTQ19MRU47Ci0KLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIFNOQVBfQUlST05FVFtdOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDaXNjb0NDS01bXTsKLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ2lzY29DQ0tNTGVuOwotZXh0ZXJuCXVuc2lnbmVkIGNoYXIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNFtdOwotZXh0ZXJuCXVuc2lnbmVkIGNoYXIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNExlbjsKLWV4dGVybiAgdW5zaWduZWQgY2hhciAgIENpcGhlclN1aXRlQ0NYVGtpcFtdOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ2lwaGVyU3VpdGVDQ1hUa2lwTGVuOwotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgQ0lTQ09fT1VJW107Ci1leHRlcm4gIFVDSEFSCUJhU2l6ZUFycmF5WzRdOwotCi1leHRlcm4gVUNIQVIgQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXTsKLWV4dGVybiBVQ0hBUiBNVUxUSUNBU1RfQUREUltNQUNfQUREUl9MRU5dOwotZXh0ZXJuIFVDSEFSIFpFUk9fTUFDX0FERFJbTUFDX0FERFJfTEVOXTsKLWV4dGVybiBVTE9ORyBCSVQzMlszMl07Ci1leHRlcm4gVUNIQVIgQklUOFs4XTsKLWV4dGVybiBjaGFyKiBDaXBoZXJOYW1lW107Ci1leHRlcm4gY2hhciogTUNTVG9NYnBzW107Ci1leHRlcm4gVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXTsKLWV4dGVybiBVQ0hBUiBTTkFQXzgwMl8xSFs2XTsKLWV4dGVybiBVQ0hBUiBTTkFQX0JSSURHRV9UVU5ORUxbNl07Ci1leHRlcm4gVUNIQVIgU05BUF9BSVJPTkVUWzhdOwotZXh0ZXJuIFVDSEFSIENLSVBfTExDX1NOQVBbOF07Ci1leHRlcm4gVUNIQVIgRUFQT0xfTExDX1NOQVBbOF07Ci1leHRlcm4gVUNIQVIgRUFQT0xbMl07Ci1leHRlcm4gVUNIQVIgSVBYWzJdOwotZXh0ZXJuIFVDSEFSIEFQUExFX1RBTEtbMl07Ci1leHRlcm4gVUNIQVIgUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAotZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOwotZXh0ZXJuIFVDSEFSIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gOwotZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtaW5bNF07Ci1leHRlcm4gVUNIQVIgZGVmYXVsdF9jd21heFs0XTsKLWV4dGVybiBVQ0hBUiBkZWZhdWx0X3N0YV9haWZzbls0XTsKLWV4dGVybiBVQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdOwotCi1leHRlcm4gVVNIT1JUIFJhdGVVcFBFUltdOwotZXh0ZXJuIFVTSE9SVCBSYXRlRG93blBFUltdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZURvd253YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlVXB3YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZURvd253YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZURvd253YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlVXB3YXJkW107Ci1leHRlcm4gQ0hBUiAgIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZUlkVG9NYnBzW107Ci1leHRlcm4gVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdOwotCi1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBbXTsKLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbjsKLQotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXTsKLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuOwotCi1leHRlcm4gVUNIQVIgIFNzaWRJZTsKLWV4dGVybiBVQ0hBUiAgU3VwUmF0ZUllOwotZXh0ZXJuIFVDSEFSICBFeHRSYXRlSWU7Ci0KLWV4dGVybiBVQ0hBUiAgSHRDYXBJZTsKLWV4dGVybiBVQ0hBUiAgQWRkSHRJbmZvSWU7Ci1leHRlcm4gVUNIQVIgIE5ld0V4dENoYW5JZTsKLQotZXh0ZXJuIFVDSEFSICBFcnBJZTsKLWV4dGVybiBVQ0hBUiAgRHNJZTsKLWV4dGVybiBVQ0hBUiAgVGltSWU7Ci1leHRlcm4gVUNIQVIgIFdwYUllOwotZXh0ZXJuIFVDSEFSICBXcGEySWU7Ci1leHRlcm4gVUNIQVIgIElic3NJZTsKLWV4dGVybiBVQ0hBUiAgQ2N4MkllOwotCi1leHRlcm4gVUNIQVIgIFdQQV9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgUlNOX09VSVtdOwotZXh0ZXJuIFVDSEFSICBXTUVfSU5GT19FTEVNW107Ci1leHRlcm4gVUNIQVIgIFdNRV9QQVJNX0VMRU1bXTsKLWV4dGVybiBVQ0hBUiAgQ2N4MlFvc0luZm9bXTsKLWV4dGVybiBVQ0hBUiAgQ2N4MkllSW5mb1tdOwotZXh0ZXJuIFVDSEFSICBSQUxJTktfT1VJW107Ci1leHRlcm4gVUNIQVIgIFBvd2VyQ29uc3RyYWludElFW107Ci0KLQotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGVbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExR1tdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHW107Ci0KLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFtdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4xU1tdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4yU1tdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW107Ci0KLWV4dGVybiBVQ0hBUiAgUFJFX05fSFRfT1VJW107CisvKisrK0FkZCBieSBzaGlhbmcgZm9yIG1lcmdlIE1pbmlwb3J0TU1SZXF1ZXN0KCkgYW5kIE1pbmlwb3J0RGF0YU1NUmVxdWVzdCgpIGludG8gb25lIGZ1bmN0aW9uICovCisjZGVmaW5lIE1BWF9EQVRBTU1fUkVUUlkJMworI2RlZmluZSBNR01UX1VTRV9RVUVVRV9GTEFHCTB4ODAKKy8qLS0tQWRkIGJ5IHNoaWFuZyBmb3IgbWVyZ2UgTWluaXBvcnRNTVJlcXVlc3QoKSBhbmQgTWluaXBvcnREYXRhTU1SZXF1ZXN0KCkgaW50byBvbmUgZnVuY3Rpb24gKi8KIAogI2RlZmluZQlNQVhTRVEJCSgweEZGRikKIAotc3RydWN0IHJlb3JkZXJpbmdfbXBkdQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUJKm5leHQ7Ci0JUE5ESVNfUEFDS0VUCQkJcFBhY2tldDsJCS8qIGNvdmVydGVkIHRvIDgwMi4zIGZyYW1lICovCi0JaW50CQkJCQkJU2VxdWVuY2U7CQkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgTVBEVSAqLwotCUJPT0xFQU4JCQkJCWJBTVNEVTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIFNOQVBfQUlST05FVFtdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgQ0lTQ09fT1VJW107CitleHRlcm4gdTggQmFTaXplQXJyYXlbNF07CisKK2V4dGVybiB1OCBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOworZXh0ZXJuIHU4IFpFUk9fTUFDX0FERFJbTUFDX0FERFJfTEVOXTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIEJJVDMyWzMyXTsKK2V4dGVybiB1OCBCSVQ4WzhdOworZXh0ZXJuIGNoYXIgKkNpcGhlck5hbWVbXTsKK2V4dGVybiBjaGFyICpNQ1NUb01icHNbXTsKK2V4dGVybiB1OCBSeHdpTUNTVG9PZmRtUmF0ZVsxMl07CitleHRlcm4gdTggU05BUF84MDJfMUhbNl07CitleHRlcm4gdTggU05BUF9CUklER0VfVFVOTkVMWzZdOworZXh0ZXJuIHU4IFNOQVBfQUlST05FVFs4XTsKK2V4dGVybiB1OCBDS0lQX0xMQ19TTkFQWzhdOworZXh0ZXJuIHU4IEVBUE9MX0xMQ19TTkFQWzhdOworZXh0ZXJuIHU4IEVBUE9MWzJdOworZXh0ZXJuIHU4IElQWFsyXTsKK2V4dGVybiB1OCBBUFBMRV9UQUxLWzJdOworZXh0ZXJuIHU4IFJhdGVJZFRvUGxjcFNpZ25hbFsxMl07CS8qIHNlZSBJRUVFODAyLjExYS0xOTk5IHAuMTQgKi8KK2V4dGVybiB1OCBPZmRtUmF0ZVRvUnh3aU1DU1tdOworZXh0ZXJuIHU4IE9mZG1TaWduYWxUb1JhdGVJZFsxNl07CitleHRlcm4gdTggZGVmYXVsdF9jd21pbls0XTsKK2V4dGVybiB1OCBkZWZhdWx0X2N3bWF4WzRdOworZXh0ZXJuIHU4IGRlZmF1bHRfc3RhX2FpZnNuWzRdOworZXh0ZXJuIHU4IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbOF07CisKK2V4dGVybiB1MTYgUmF0ZVVwUEVSW107CitleHRlcm4gdTE2IFJhdGVEb3duUEVSW107CitleHRlcm4gdTggUGh5MTFCTmV4dFJhdGVEb3dud2FyZFtdOworZXh0ZXJuIHU4IFBoeTExQk5leHRSYXRlVXB3YXJkW107CitleHRlcm4gdTggUGh5MTFCR05leHRSYXRlRG93bndhcmRbXTsKK2V4dGVybiB1OCBQaHkxMUJHTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiB1OCBQaHkxMUFOZXh0UmF0ZURvd253YXJkW107CitleHRlcm4gdTggUGh5MTFBTmV4dFJhdGVVcHdhcmRbXTsKK2V4dGVybiBjaGFyIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXTsKK2V4dGVybiB1OCBSYXRlSWRUb01icHNbXTsKK2V4dGVybiB1MTYgUmF0ZUlkVG81MDBLYnBzW107CisKK2V4dGVybiB1OCBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW107CitleHRlcm4gdTggQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbjsKKworZXh0ZXJuIHU4IENpcGhlclN1aXRlV3BhTm9uZUFlc1tdOworZXh0ZXJuIHU4IENpcGhlclN1aXRlV3BhTm9uZUFlc0xlbjsKKworZXh0ZXJuIHU4IFNzaWRJZTsKK2V4dGVybiB1OCBTdXBSYXRlSWU7CitleHRlcm4gdTggRXh0UmF0ZUllOworCitleHRlcm4gdTggSHRDYXBJZTsKK2V4dGVybiB1OCBBZGRIdEluZm9JZTsKK2V4dGVybiB1OCBOZXdFeHRDaGFuSWU7CisKK2V4dGVybiB1OCBFcnBJZTsKK2V4dGVybiB1OCBEc0llOworZXh0ZXJuIHU4IFRpbUllOworZXh0ZXJuIHU4IFdwYUllOworZXh0ZXJuIHU4IFdwYTJJZTsKK2V4dGVybiB1OCBJYnNzSWU7CitleHRlcm4gdTggQ2N4MkllOworZXh0ZXJuIHU4IFdhcGlJZTsKKworZXh0ZXJuIHU4IFdQQV9PVUlbXTsKK2V4dGVybiB1OCBSU05fT1VJW107CitleHRlcm4gdTggV0FQSV9PVUlbXTsKK2V4dGVybiB1OCBXTUVfSU5GT19FTEVNW107CitleHRlcm4gdTggV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIHU4IENjeDJRb3NJbmZvW107CitleHRlcm4gdTggQ2N4MkllSW5mb1tdOworZXh0ZXJuIHU4IFJBTElOS19PVUlbXTsKK2V4dGVybiB1OCBQb3dlckNvbnN0cmFpbnRJRVtdOworCitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFCW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFHW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOworCitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFCR04xU1tdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKK2V4dGVybiB1OCBSYXRlU3dpdGNoVGFibGUxMU4xU1tdOworZXh0ZXJuIHU4IFJhdGVTd2l0Y2hUYWJsZTExTjJTW107CitleHRlcm4gdTggUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOworCitleHRlcm4gdTggUFJFX05fSFRfT1VJW107CisKK3N0cnVjdCBydF9yc3NpX3NhbXBsZSB7CisJY2hhciBMYXN0UnNzaTA7CQkvKiBsYXN0IHJlY2VpdmVkIFJTU0kgKi8KKwljaGFyIExhc3RSc3NpMTsJCS8qIGxhc3QgcmVjZWl2ZWQgUlNTSSAqLworCWNoYXIgTGFzdFJzc2kyOwkJLyogbGFzdCByZWNlaXZlZCBSU1NJICovCisJY2hhciBBdmdSc3NpMDsKKwljaGFyIEF2Z1Jzc2kxOworCWNoYXIgQXZnUnNzaTI7CisJc2hvcnQgQXZnUnNzaTBYODsKKwlzaG9ydCBBdmdSc3NpMVg4OworCXNob3J0IEF2Z1Jzc2kyWDg7CiB9OwogCi1zdHJ1Y3QgcmVvcmRlcmluZ19saXN0Ci17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKLQlpbnQgCXFsZW47CisvKiAqLworLyogIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zICovCisvKiAqLworc3RydWN0IHJ0X3F1ZXVlX2VudHJ5OworCitzdHJ1Y3QgcnRfcXVldWVfZW50cnkgeworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqTmV4dDsKIH07CiAKLXN0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbAotewotCVBWT0lECQkJCQltZW07Ci0JTkRJU19TUElOX0xPQ0sJCQlsb2NrOwotCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgCWZyZWVsaXN0OworLyogUXVldWUgc3RydWN0dXJlICovCitzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyIHsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKkhlYWQ7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpUYWlsOworCXVuc2lnbmVkIGxvbmcgTnVtYmVyOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgCV9SU1NJX1NBTVBMRSB7Ci0JQ0hBUgkJCUxhc3RSc3NpMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUxhc3RSc3NpMTsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUxhc3RSc3NpMjsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUgkJCUF2Z1Jzc2kwOwotCUNIQVIJCQlBdmdSc3NpMTsKLQlDSEFSCQkJQXZnUnNzaTI7Ci0JU0hPUlQJCQlBdmdSc3NpMFg4OwotCVNIT1JUCQkJQXZnUnNzaTFYODsKLQlTSE9SVAkJCUF2Z1Jzc2kyWDg7Ci19IFJTU0lfU0FNUExFOwotCi0vLwotLy8gIFF1ZXVlIHN0cnVjdHVyZSBhbmQgbWFjcm9zCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9FTlRSWSAgICB7Ci0Jc3RydWN0IF9RVUVVRV9FTlRSWSAgICAgKk5leHQ7Ci19ICAgUVVFVUVfRU5UUlksICpQUVVFVUVfRU5UUlk7Ci0KLS8vIFF1ZXVlIHN0cnVjdHVyZQotdHlwZWRlZiBzdHJ1Y3QgIF9RVUVVRV9IRUFERVIgICB7Ci0JUFFVRVVFX0VOVFJZICAgIEhlYWQ7Ci0JUFFVRVVFX0VOVFJZICAgIFRhaWw7Ci0JVUxPTkcgICAgICAgICAgIE51bWJlcjsKLX0gICBRVUVVRV9IRUFERVIsICpQUVVFVUVfSEVBREVSOwotCiAjZGVmaW5lIEluaXRpYWxpemVRdWV1ZUhlYWRlcihRdWV1ZUhlYWRlcikgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUXVldWVIZWFkZXIpLT5UYWlsID0gTlVMTDsgICBcCkBAIC0zMTQsMTAgKzE4MCwxMSBAQAogI2RlZmluZSBSZW1vdmVIZWFkUXVldWUoUXVldWVIZWFkZXIpICAgICAgICAgICAgICAgIFwKIChRdWV1ZUhlYWRlciktPkhlYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVBRVUVVRV9FTlRSWSBwTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCWlmICgoUXVldWVIZWFkZXIpLT5IZWFkICE9IE5VTEwpCQkJCVwKIAl7CQkJCQkJCQkJCQkJXAogCQlwTmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQ7ICAgICAgICAgIFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZC0+TmV4dCA9IE5VTEw7CQlcCiAJCShRdWV1ZUhlYWRlciktPkhlYWQgPSBwTmV4dDsgICAgICAgICAgICAgICAgXAogCQlpZiAocE5leHQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgICAgICAgICAgICBcCkBAIC0zMjcsNDEgKzE5NCw0OSBAQAogCiAjZGVmaW5lIEluc2VydEhlYWRRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSgoUFFVRVVFX0VOVFJZKVF1ZXVlRW50cnkpLT5OZXh0ID0gKFF1ZXVlSGVhZGVyKS0+SGVhZDsgXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKKwkJKChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKilRdWV1ZUVudHJ5KS0+TmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQ7IFwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7ICAgICAgIFwKIAkJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgXAorCQkJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7ICAgXAogCQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogI2RlZmluZSBJbnNlcnRUYWlsUXVldWUoUXVldWVIZWFkZXIsIFF1ZXVlRW50cnkpICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorCSgoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAogCWlmICgoUXVldWVIZWFkZXIpLT5UYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKFF1ZXVlSGVhZGVyKS0+VGFpbC0+TmV4dCA9IChQUVVFVUVfRU5UUlkpKFF1ZXVlRW50cnkpOyBcCisJCShRdWV1ZUhlYWRlciktPlRhaWwtPk5leHQgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOyBcCiAJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5IZWFkID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgIFwKLQkoUXVldWVIZWFkZXIpLT5UYWlsID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCisJCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOyAgICAgICBcCisJKFF1ZXVlSGVhZGVyKS0+VGFpbCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7ICAgICAgICAgICBcCiAJKFF1ZXVlSGVhZGVyKS0+TnVtYmVyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi0vLwotLy8gIE1hY3JvcyBmb3IgZmxhZyBhbmQgcmVmIGNvdW50IG9wZXJhdGlvbnMKLS8vCisjZGVmaW5lIEluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcEVudHJ5LCBRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkJCQlcCit7CQkJCQkJCQkJCQkJCQkJCQkJXAorCSgoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOwkJCQkJCQlcCisJaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpCQkJCQkJCQkJCQlcCisJCShRdWV1ZUhlYWRlciktPlRhaWwtPk5leHQgPSAoc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICopKFF1ZXVlRW50cnkpOwkJCVwKKwllbHNlCQkJCQkJCQkJCQkJCQkJCVwKKwkJKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKikoUXVldWVFbnRyeSk7CQkJCVwKKwkoUXVldWVIZWFkZXIpLT5UYWlsID0gKHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqKShRdWV1ZUVudHJ5KTsJCQkJCVwKKwkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsJCQkJCQkJCQkJCVwKK30KKworLyogKi8KKy8qICBNYWNyb3MgZm9yIGZsYWcgYW5kIHJlZiBjb3VudCBvcGVyYXRpb25zICovCisvKiAqLwogI2RlZmluZSBSVE1QX1NFVF9GTEFHKF9NLCBfRikgICAgICAgKChfTSktPkZsYWdzIHw9IChfRikpCiAjZGVmaW5lIFJUTVBfQ0xFQVJfRkxBRyhfTSwgX0YpICAgICAoKF9NKS0+RmxhZ3MgJj0gfihfRikpCiAjZGVmaW5lIFJUTVBfQ0xFQVJfRkxBR1MoX00pICAgICAgICAoKF9NKS0+RmxhZ3MgPSAwKQogI2RlZmluZSBSVE1QX1RFU1RfRkxBRyhfTSwgX0YpICAgICAgKCgoX00pLT5GbGFncyAmIChfRikpICE9IDApCiAjZGVmaW5lIFJUTVBfVEVTVF9GTEFHUyhfTSwgX0YpICAgICAoKChfTSktPkZsYWdzICYgKF9GKSkgPT0gKF9GKSkKLQotI2lmZGVmIFJUMjg2MAotLy8gTWFjcm8gZm9yIHBvd2VyIHNhdmUgZmxhZy4KKy8qIE1hY3JvIGZvciBwb3dlciBzYXZlIGZsYWcuICovCiAjZGVmaW5lIFJUTVBfU0VUX1BTRkxBRyhfTSwgX0YpICAgICAgICgoX00pLT5QU0ZsYWdzIHw9IChfRikpCiAjZGVmaW5lIFJUTVBfQ0xFQVJfUFNGTEFHKF9NLCBfRikgICAgICgoX00pLT5QU0ZsYWdzICY9IH4oX0YpKQogI2RlZmluZSBSVE1QX0NMRUFSX1BTRkxBR1MoX00pICAgICAgICAoKF9NKS0+UFNGbGFncyA9IDApCiAjZGVmaW5lIFJUTVBfVEVTVF9QU0ZMQUcoX00sIF9GKSAgICAgICgoKF9NKS0+UFNGbGFncyAmIChfRikpICE9IDApCiAjZGVmaW5lIFJUTVBfVEVTVF9QU0ZMQUdTKF9NLCBfRikgICAgICgoKF9NKS0+UFNGbGFncyAmIChfRikpID09IChfRikpCi0jZW5kaWYKIAogI2RlZmluZSBPUFNUQVRVU19TRVRfRkxBRyhfcEFkLCBfRikgICAgICgoX3BBZCktPkNvbW1vbkNmZy5PcFN0YXR1c0ZsYWdzIHw9IChfRikpCiAjZGVmaW5lIE9QU1RBVFVTX0NMRUFSX0ZMQUcoX3BBZCwgX0YpICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJj0gfihfRikpCkBAIC0zODUsNTkgKzI2MCwxMiBAQAogI2RlZmluZSBDS0lQX0tQX09OKF9wKQkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgxMCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKICNkZWZpbmUgQ0tJUF9DTUlDX09OKF9wKQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDA4KSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQogCi0KICNkZWZpbmUgSU5DX1JJTkdfSU5ERVgoX2lkeCwgX1JpbmdTaXplKSAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIChfaWR4KSA9IChfaWR4KzEpICUgKF9SaW5nU2l6ZSk7ICAgICAgIFwKIH0KIAotI2lmZGVmIFJUMjg3MAotLy8gV2Ugd2lsbCBoYXZlIGEgY29zdCBkb3duIHZlcnNpb24gd2hpY2ggbWFjIHZlcnNpb24gaXMgMHgzMDkweHh4eAotI2RlZmluZSBJU19SVDMwOTAoX3BBZCkJCQkJKCgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcxMDAwMCkgfHwgKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwOTAwMDAwKSkKLSNlbHNlCi0jZGVmaW5lIElTX1JUMzA5MChfcEFkKQkJCQkwCi0jZW5kaWYKLSNkZWZpbmUgSVNfUlQzMDcwKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcwMDAwMCkKLSNpZmRlZiBSVDI4NzAKLSNkZWZpbmUgSVNfUlQzMDcxKF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcxMDAwMCkKLSNkZWZpbmUgSVNfUlQzMHh4KF9wQWQpCQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmYwMDAwMCkgPT0gMHgzMDcwMDAwMCkKLSNlbmRpZgotCi0jZGVmaW5lIFJJTkdfUEFDS0VUX0lOSVQoX1R4UmluZywgX2lkeCkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfVHhSaW5nLT5DZWxsW19pZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX1R4UmluZy0+Q2VsbFtfaWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBUWERUX0lOSVQoX1R4RCkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlOZGlzWmVyb01lbW9yeShfVHhELCBUWERfU0laRSk7CVwKLQlfVHhELT5ETUFET05FID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vU2V0IGxhc3QgZGF0YSBzZWdtZW50Ci0jZGVmaW5lIFJJTkdfU0VUX0xBU1REUyhfVHhELCBfSXNTRDApICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKF9Jc1NEMCkge19UeEQtPkxhc3RTZWMwID0gMTt9ICAgICBcCi0gICAgZWxzZSB7X1R4RC0+TGFzdFNlYzEgPSAxO30gICAgIFwKLX0KLQotLy8gSW5jcmVhc2UgVHhUc2MgdmFsdWUgZm9yIG5leHQgdHJhbnNtaXNzaW9uCi0vLyBUT0RPOgotLy8gV2hlbiBpPT02LCBtZWFucyBUU0MgaGFzIGRvbmUgb25lIGZ1bGwgY3ljbGUsIGRvIHJlLWtleWluZyBzdHVmZiBmb2xsb3cgc3BlY3MKLS8vIFNob3VsZCBzZW5kIGEgc3BlY2lhbCBldmVudCBtaWNyb3NvZnQgZGVmaW5lZCB0byByZXF1ZXN0IHJlLWtleQotI2RlZmluZSBJTkNfVFhfVFNDKF90c2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlICgrK190c2NbaV0gPT0gMHgwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoaSA9PSA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IGlzIGNvcGllZCBmcm9tIEFQIGJlYWNvbi4gIERvbid0IG5lZWQgdG8gdXBkYXRlIGhlcmUuCisvKiBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IGlzIGNvcGllZCBmcm9tIEFQIGJlYWNvbi4gIERvbid0IG5lZWQgdG8gdXBkYXRlIGhlcmUuICovCiAjZGVmaW5lIENPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5DaGFubmVsV2lkdGggPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoOyAgICAgIFwKQEAgLTQ1MSwzNDMgKzI3OSw1MiBAQAogCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5SZWNvbVdpZHRoID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGg7ICAgICAgXAogCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5PcGVyYWlvbk1vZGUgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsgICAgICBcCiAJX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk5vbkdmUHJlc2VudCA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OyAgICAgIFwKLQlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUQ2FwYWJpbGl0eS5NQ1NTZXQsIChfcEFkKS0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBzaXplb2YoVUNIQVIpICogMTYpO1wKKwlOZGlzTW92ZU1lbW9yeSgoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUQ2FwYWJpbGl0eS5NQ1NTZXQsIChfcEFkKS0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCBzaXplb2YodTgpKiAxNik7XAogfQogCiAjZGVmaW5lIENPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihfcEFkLCBfcEh0Q2FwYWJpbGl0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUpOwlcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGU9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMpOwlcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4UkFtcGR1RmFjdG9yID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3Rvcik7CVwKKwlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUgPSAodTgpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlPSAodTgpKF9wSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzKTsJXAorCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heFJBbXBkdUZhY3RvciA9ICh1OCkoX3BIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IpOwlcCiB9CiAKLS8vCi0vLyBNQUNSTyBmb3IgMzItYml0IFBDSSByZWdpc3RlciByZWFkIC8gd3JpdGUKLS8vCi0vLyBVc2FnZSA6IFJUTVBfSU9fUkVBRDMyKAotLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAotLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKLS8vICAgICAgICAgICAgICBQVUxPTkcgIHBWYWx1ZSkKLS8vCi0vLyAgICAgICAgIFJUTVBfSU9fV1JJVEUzMigKLS8vICAgICAgICAgICAgICBQUlRNUF9BREFQVEVSIHBBZCwKLS8vICAgICAgICAgICAgICBVTE9ORyBSZWdpc3Rlcl9PZmZzZXQsCi0vLyAgICAgICAgICAgICAgVUxPTkcgVmFsdWUpCi0vLworLyogKi8KKy8qIE1BQ1JPIGZvciAzMi1iaXQgUENJIHJlZ2lzdGVyIHJlYWQgLyB3cml0ZSAqLworLyogKi8KKy8qIFVzYWdlIDogUlRNUF9JT19SRUFEMzIoICovCisvKiAgICAgICAgICAgICAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCAqLworLyogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgUmVnaXN0ZXJfT2Zmc2V0LCAqLworLyogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKiBwVmFsdWUpICovCisvKiAqLworLyogICAgICAgICBSVE1QX0lPX1dSSVRFMzIoICovCisvKiAgICAgICAgICAgICAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCAqLworLyogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgUmVnaXN0ZXJfT2Zmc2V0LCAqLworLyogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgVmFsdWUpICovCisvKiAqLwogCi0vLwotLy8gQkJQICYgUkYgYXJlIHVzaW5nIGluZGlyZWN0IGFjY2Vzcy4gQmVmb3JlIHdyaXRlIGFueSB2YWx1ZSBpbnRvIGl0LgotLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3V0c3RhbmRpbmcgY29tbWFuZCBwZW5kaW5nIHZpYSBjaGVja2luZyBidXN5IGJpdC4KLS8vCi0jZGVmaW5lIE1BWF9CVVNZX0NPVU5UICAxMDAgICAgICAgICAvLyBOdW1iZXIgb2YgcmV0cnkgYmVmb3JlIGZhaWxpbmcgYWNjZXNzIEJCUCAmIFJGIGluZGlyZWN0IHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUMjg2MAotI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUEhZX0NTUjRfU1RSVUMgIFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVMT05HICAgICAgICAgICBCdXN5Q250ID0gMDsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZikgCSAgICAgICAgICAgICAgICBcCi0gICAgewkJCQkJCQkJCQkJCVwKLSAgICAgICAgcmV0dXJuOwkJCQkJCQkJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIFJGX0NTUl9DRkcwLCAmVmFsdWUud29yZCk7ICBcCi0gICAgICAgIGlmIChWYWx1ZS5maWVsZC5CdXN5ID09IElETEUpICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQnVzeUNudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgIHdoaWxlIChCdXN5Q250IDwgTUFYX0JVU1lfQ09VTlQpOyAgICAgICAgICAgXAotICAgIGlmIChCdXN5Q250IDwgTUFYX0JVU1lfQ09VTlQpICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgUkZfQ1NSX0NGRzAsIF9WKTsgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBCQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICAgICAgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAotICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlJlZ051bSA9IF9JOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1dSSVRFMzIoX0EsIEJCUF9DU1JfQ0ZHLCBCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGZvciAoaz0wOyBrPE1BWF9CVVNZX0NPVU5UOyBrKyspICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyBcCi0gICAgICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICgoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gSURMRSkgJiYgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChCYnBDc3IuZmllbGQuUmVnTnVtID09IF9JKSkgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAqKF9wVikgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOyAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIERCR1BSSU5UX0VSUigoIkRGUyBCQlAgcmVhZCBSJWQgZmFpbFxuIiwgX0kpKTsgICAgICBcCi0gICAgICAgICooX3BWKSA9IChfQSktPkJicFdyaXRlTGF0Y2hbX0ldOyAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICB7fQotLy8gUmVhZCBCQlAgcmVnaXN0ZXIgYnkgcmVnaXN0ZXIncyBJRC4gR2VuZXJhdGUgUEVSIHRvIHRlc3QgQkEKLSNkZWZpbmUgUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICAgICAgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaT0wOyBpPE1BWF9CVVNZX0NPVU5UOyBpKyspICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKLSAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3Iud29yZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5mUmVhZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJCUF9SV19NT0RFID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQnVzeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19XUklURTMyKF9BLCBIMk1fQkJQX0FHRU5ULCBCYnBDc3Iud29yZCk7CQkJCVwKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UoX0EsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsJCQkJCVwKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsJCQkJCQkJXAotICAgICAgICBmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKSAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCVJUTVBfSU9fUkVBRDMyKF9BLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwkJCVwKLSAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJREJHUFJJTlRfRVJSKCgiQkJQIHJlYWQgUiVkPTB4JXggZmFpbFxuIiwgX0ksIEJicENzci53b3JkKSk7CVwKLSAgICAgICAgKihfcFYpID0gKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV07ICAgICAgICAgICAgICAgXAotCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAotCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBCQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICAgICAgQnVzeUNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoQnVzeUNudD0wOyBCdXN5Q250PE1BWF9CVVNZX0NPVU5UOyBCdXN5Q250KyspICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19SRUFEMzIoX0EsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOyAgICAgXAotICAgICAgICBpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuVmFsdWUgPSBfVjsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5SZWdOdW0gPSBfSTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUlRNUF9JT19XUklURTMyKF9BLCBCQlBfQ1NSX0NGRywgQmJwQ3NyLndvcmQpOyAgICAgXAotICAgICAgICAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXSA9IF9WOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChCdXN5Q250ID09IE1BWF9CVVNZX0NPVU5UKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgREJHUFJJTlRfRVJSKCgiQkJQIHdyaXRlIFIlZCBmYWlsXG4iLCBfSSkpOyAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFdyaXRlIEJCUCByZWdpc3RlciBieSByZWdpc3RlcidzIElEICYgdmFsdWUKLSNkZWZpbmUgUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQkJQX0NTUl9DRkdfU1RSVUMgIEJicENzcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICAgICAgICAgQnVzeUNudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgoX0EpLT5iUENJY2xrT2ZmID09IEZBTFNFKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoQnVzeUNudD0wOyBCdXN5Q250PE1BWF9CVVNZX0NPVU5UOyBCdXN5Q250KyspICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUlRNUF9JT19SRUFEMzIoX0EsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7CQkJCVwKLSAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCi0JCUFzaWNTZW5kQ29tbWFuZFRvTWN1KF9BLCAweDgwLCAweGZmLCAweDAsIDB4MCk7CQkJCQlcCi0gICAgICAgICAgICBpZiAoX0EtPk9wTW9kZSA9PSBPUE1PREVfQVApICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7CQkJCQkJCVwKLSAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCURCR1BSSU5UX0VSUigoIkJCUCB3cml0ZSBSJWQ9MHgleCBmYWlsXG4iLCBfSSwgQmJwQ3NyLndvcmQpKTsJXAotCQlSVE1QX0lPX1JFQUQzMihfQSwgSDJNX0JCUF9BR0VOVCwgJkJicENzci53b3JkKTsJCQkJXAotCQlCYnBDc3IuZmllbGQuQnVzeSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVJUTVBfSU9fV1JJVEUzMihfQSwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwkJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBSVE1QX1JGX0lPX1dSSVRFMzIoX0EsIF9WKSAgICAgICAgICAgICAgICAgUlRVU0JXcml0ZVJGUmVnaXN0ZXIoX0EsIF9WKQotI2RlZmluZSBSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgUlRVU0JSZWFkQkJQUmVnaXN0ZXIoX0EsIF9JLCBfcFYpCi0jZGVmaW5lIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICBSVFVTQldyaXRlQkJQUmVnaXN0ZXIoX0EsIF9JLCBfVikKLQotI2RlZmluZSBCQlBfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKQkJCVJUVVNCV3JpdGVCQlBSZWdpc3RlcihfQSwgX0ksIF9WKQotI2RlZmluZSBCQlBfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKSAgIAkJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoX0EsIF9JLCBfcFYpCi0jZW5kaWYgLy8gUlQyODcwIC8vCi0KLSNkZWZpbmUgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihjaCwga2h6KSAgeyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgICAga2h6ID0gMjQxMjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgICAga2h6ID0gMjQxNzAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgICAga2h6ID0gMjQyMjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAgICAga2h6ID0gMjQyNzAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiAgICAga2h6ID0gMjQzMjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAgICAga2h6ID0gMjQzNzAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiAgICAga2h6ID0gMjQ0MjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiAgICAga2h6ID0gMjQ0NzAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiAgICAga2h6ID0gMjQ1MjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogICAga2h6ID0gMjQ1NzAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogICAga2h6ID0gMjQ2MjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjogICAga2h6ID0gMjQ2NzAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzogICAga2h6ID0gMjQ3MjAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDogICAga2h6ID0gMjQ4NDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjogIC8qIFVOSUkgKi8gIGtoeiA9IDUxODAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6ICAvKiBVTklJICovICBraHogPSA1MjAwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OiAgLyogVU5JSSAqLyAga2h6ID0gNTIyMDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODogIC8qIFVOSUkgKi8gIGtoeiA9IDUyNDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6ICAvKiBVTklJICovICBraHogPSA1MjYwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU2OiAgLyogVU5JSSAqLyAga2h6ID0gNTI4MDAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDogIC8qIFVOSUkgKi8gIGtoeiA9IDUzMDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNjQ6ICAvKiBVTklJICovICBraHogPSA1MzIwMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OTogLyogVU5JSSAqLyAga2h6ID0gNTc0NTAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTM6IC8qIFVOSUkgKi8gIGtoeiA9IDU3NjUwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU3OiAvKiBVTklJICovICBraHogPSA1Nzg1MDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE2MTogLyogVU5JSSAqLyAga2h6ID0gNTgwNTAwMDsgICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjU6IC8qIFVOSUkgKi8gIGtoeiA9IDU4MjUwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1MDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA0OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1MjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA4OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1NDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTEyOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1NjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTE2OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU1ODAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTIwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2MDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI0OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2MjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI4OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2NDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTMyOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2NjAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM2OiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU2ODAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTQwOiAvKiBIaXBlckxBTjIgKi8gIGtoeiA9IDU3MDAwMDA7ICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTE3MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTE5MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTIxMDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6ICAvKiBKYXBhbiBNTUFDICovICAga2h6ID0gNTIzMDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTg0OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5MjAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDE4ODogLyogSmFwYW4gKi8gICBraHogPSA0OTQwMDAwOyAgIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTI6IC8qIEphcGFuICovICAga2h6ID0gNDk2MDAwMDsgICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTk2OiAvKiBKYXBhbiAqLyAgIGtoeiA9IDQ5ODAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDIwODogLyogSmFwYW4sIG1lYW5zIEowOCAqLyAgIGtoeiA9IDUwNDAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDIxMjogLyogSmFwYW4sIG1lYW5zIEoxMiAqLyAgIGtoeiA9IDUwNjAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDIxNjogLyogSmFwYW4sIG1lYW5zIEoxNiAqLyAgIGtoeiA9IDUwODAwMDA7ICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICBraHogPSAyNDEyMDAwOyAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfQotCi0jZGVmaW5lICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQoa2h6LCBjaCkgIHsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgc3dpdGNoIChraHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQxMjAwMDogICAgY2ggPSAxOyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQxNzAwMDogICAgY2ggPSAyOyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyMjAwMDogICAgY2ggPSAzOyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQyNzAwMDogICAgY2ggPSA0OyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzMjAwMDogICAgY2ggPSA1OyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQzNzAwMDogICAgY2ggPSA2OyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0MjAwMDogICAgY2ggPSA3OyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ0NzAwMDogICAgY2ggPSA4OyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1MjAwMDogICAgY2ggPSA5OyAgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ1NzAwMDogICAgY2ggPSAxMDsgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2MjAwMDogICAgY2ggPSAxMTsgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ2NzAwMDogICAgY2ggPSAxMjsgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ3MjAwMDogICAgY2ggPSAxMzsgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ4NDAwMDogICAgY2ggPSAxNDsgICAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTE4MDAwMDogICAgY2ggPSAzNjsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMDAwMDA6ICAgIGNoID0gNDA7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjIwMDAwOiAgICBjaCA9IDQ0OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTI0MDAwMDogICAgY2ggPSA0ODsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyNjAwMDA6ICAgIGNoID0gNTI7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjgwMDAwOiAgICBjaCA9IDU2OyAgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTMwMDAwMDogICAgY2ggPSA2MDsgIC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUzMjAwMDA6ICAgIGNoID0gNjQ7ICAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1NzQ1MDAwOiAgICBjaCA9IDE0OTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTc2NTAwMDogICAgY2ggPSAxNTM7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU3ODUwMDA6ICAgIGNoID0gMTU3OyAvKiBVTklJICovICBicmVhazsgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODA1MDAwOiAgICBjaCA9IDE2MTsgLyogVU5JSSAqLyAgYnJlYWs7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTgyNTAwMDogICAgY2ggPSAxNjU7IC8qIFVOSUkgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MDAwMDA6ICAgIGNoID0gMTAwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MjAwMDA6ICAgIGNoID0gMTA0OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NDAwMDA6ICAgIGNoID0gMTA4OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NjAwMDA6ICAgIGNoID0gMTEyOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU1ODAwMDA6ICAgIGNoID0gMTE2OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MDAwMDA6ICAgIGNoID0gMTIwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MjAwMDA6ICAgIGNoID0gMTI0OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU2NDAwMDA6ICAgIGNoID0gMTI4OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU2NjAwMDA6ICAgIGNoID0gMTMyOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU2ODAwMDA6ICAgIGNoID0gMTM2OyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDU3MDAwMDA6ICAgIGNoID0gMTQwOyAvKiBIaXBlckxBTjIgKi8gIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUxNzAwMDA6ICAgIGNoID0gMzQ7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOTAwMDA6ICAgIGNoID0gMzg7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMTAwMDA6ICAgIGNoID0gNDI7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUyMzAwMDA6ICAgIGNoID0gNDY7ICAvKiBKYXBhbiBNTUFDICovICAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5MjAwMDA6ICAgIGNoID0gMTg0OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5NDAwMDA6ICAgIGNoID0gMTg4OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5NjAwMDA6ICAgIGNoID0gMTkyOyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5ODAwMDA6ICAgIGNoID0gMTk2OyAvKiBKYXBhbiAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBjYXNlIDUwNDAwMDA6ICAgIGNoID0gMjA4OyAvKiBKYXBhbiwgbWVhbnMgSjA4ICovICBicmVhazsgICBcCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgNTA2MDAwMDogICAgY2ggPSAyMTI7IC8qIEphcGFuLCBtZWFucyBKMTIgKi8gIGJyZWFrOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDgwMDAwOiAgICBjaCA9IDIxNjsgLyogSmFwYW4sIG1lYW5zIEoxNiAqLyAgYnJlYWs7ICAgXAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgIGNoID0gMTsgICAgIGJyZWFrOyAgICAgXAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfQotCi0vLwotLy8gQ29tbW9uIGZyYWdtZW50IGxpc3Qgc3RydWN0dXJlIC0gIElkZW50aWNhbCB0byB0aGUgc2NhdHRlciBnYXRoZXIgZnJhZyBsaXN0IHN0cnVjdHVyZQotLy8KKy8qICovCisvKiBDb21tb24gZnJhZ21lbnQgbGlzdCBzdHJ1Y3R1cmUgLSAgSWRlbnRpY2FsIHRvIHRoZSBzY2F0dGVyIGdhdGhlciBmcmFnIGxpc3Qgc3RydWN0dXJlICovCisvKiAqLworLyojZGVmaW5lIHN0cnVjdCBydF9ydG1wX3NnX2VsZW1lbnQgICAgICAgICBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICovCisvKiNkZWZpbmUgc3RydWN0IHJ0X3J0bXBfc2dfZWxlbWVudCAqUFNDQVRURVJfR0FUSEVSX0VMRU1FTlQgKi8KICNkZWZpbmUgTklDX01BWF9QSFlTX0JVRl9DT1VOVCAgICAgICAgICAgICAgOAogCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIHsKLSAgICBQVk9JRAkJQWRkcmVzczsKLSAgICBVTE9ORwkJTGVuZ3RoOwotICAgIFBVTE9ORwkJUmVzZXJ2ZWQ7Ci19IFJUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQ7CitzdHJ1Y3QgcnRfcnRtcF9zZ19lbGVtZW50IHsKKwl2b2lkICpBZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgKlJlc2VydmVkOworfTsKIAorc3RydWN0IHJ0X3J0bXBfc2dfbGlzdCB7CisJdW5zaWduZWQgbG9uZyBOdW1iZXJPZkVsZW1lbnRzOworCXVuc2lnbmVkIGxvbmcgKlJlc2VydmVkOworCXN0cnVjdCBydF9ydG1wX3NnX2VsZW1lbnQgRWxlbWVudHNbTklDX01BWF9QSFlTX0JVRl9DT1VOVF07Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUIHsKLSAgICBVTE9ORyAgTnVtYmVyT2ZFbGVtZW50czsKLSAgICBQVUxPTkcgUmVzZXJ2ZWQ7Ci0gICAgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UIEVsZW1lbnRzW05JQ19NQVhfUEhZU19CVUZfQ09VTlRdOwotfSBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUOwotCi0vLwotLy8gIFNvbWUgdXRpbGl0eSBtYWNyb3MKLS8vCisvKiAqLworLyogIFNvbWUgdXRpbGl0eSBtYWNyb3MgKi8KKy8qICovCiAjaWZuZGVmIG1pbgogI2RlZmluZSBtaW4oX2EsIF9iKSAgICAgKCgoX2EpIDwgKF9iKSkgPyAoX2EpIDogKF9iKSkKICNlbmRpZgpAQCAtODA1LDExICszNDIsMTEgQEAKICNkZWZpbmUgTU9OSVRPUl9PTihfcCkgICAgICAgICAgICAgICgoKF9wKS0+U3RhQ2ZnLkJzc1R5cGUpID09IEJTU19NT05JVE9SKQogI2RlZmluZSBJRExFX09OKF9wKSAgICAgICAgICAgICAgICAgKCFJTkZSQV9PTihfcCkgJiYgIUFESE9DX09OKF9wKSkKIAotLy8gQ2hlY2sgTEVBUCAmIENDS00gZmxhZ3MKKy8qIENoZWNrIExFQVAgJiBDQ0tNIGZsYWdzICovCiAjZGVmaW5lIExFQVBfT04oX3ApICAgICAgICAgICAgICAgICAoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkKICNkZWZpbmUgTEVBUF9DQ0tNX09OKF9wKSAgICAgICAgICAgICgoKChfcCktPlN0YUNmZy5MZWFwQXV0aE1vZGUpID09IENJU0NPX0F1dGhNb2RlTEVBUCkgJiYgKChfcCktPlN0YUNmZy5MZWFwQXV0aEluZm8uQ0NLTSA9PSBUUlVFKSkKIAotLy8gaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAorLyogaWYgb3JnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZCAqLwogI2RlZmluZSBFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCQlcCiB7CQkJCQkJCQkJCQkJCQkJCVwKIAlpZiAoKCgqKF9wQnVmVkEgKyAxMikgPDwgOCkgKyAqKF9wQnVmVkEgKyAxMykpID4gMTUwMCkJCVwKQEAgLTgyNyw3ICszNjQsNyBAQAogCX0JCQkJCQkJCQkJCQkJCQlcCiB9CiAKLS8vIE5ldyBEZWZpbmUgZm9yIG5ldyBUeCBQYXRoLgorLyogTmV3IERlZmluZSBmb3IgbmV3IFR4IFBhdGguICovCiAjZGVmaW5lIEVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKF9wQnVmVkEsIF9wRXh0cmFMbGNTbmFwRW5jYXApCVwKIHsJCQkJCQkJCQkJCQkJCQkJXAogCWlmICgoKCooX3BCdWZWQSkgPDwgOCkgKyAqKF9wQnVmVkEgKyAxKSkgPiAxNTAwKQkJCVwKQEAgLTg0NSw3ICszODIsNiBAQAogCX0JCQkJCQkJCQkJCQkJCQlcCiB9CiAKLQogI2RlZmluZSBNQUtFXzgwMl8zX0hFQURFUihfcCwgX3BNYWMxLCBfcE1hYzIsIF9wVHlwZSkgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE5kaXNNb3ZlTWVtb3J5KF9wLCBfcE1hYzEsIE1BQ19BRERSX0xFTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtODUzLDEzICszODksMTMgQEAKICAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4gKiAyKSwgX3BUeXBlLCBMRU5HVEhfODAyXzNfVFlQRSk7IFwKIH0KIAotLy8gaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LgotLy8gZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQKLS8vIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUKLS8vIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZAotLy8gTm90ZToKLS8vICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8KLS8vICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQKKy8qIGlmIHBEYXRhIGhhcyBubyBMTEMvU05BUCAobmVpdGhlciBSRkMxMDQyIG5vciBCcmlkZ2UgdHVubmVsKSwga2VlcCBpdCB0aGF0IHdheS4gKi8KKy8qIGVsc2UgaWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIExMQy9TTkFQLWVuY2FwZWQgSVBYIG9yIEFQUExFVEFMSywgcHJlc2VydmUgdGhlIExMQy9TTkFQIGZpZWxkICovCisvKiBlbHNlIHJlbW92ZSB0aGUgTExDL1NOQVAgZmllbGQgZnJvbSB0aGUgcmVzdWx0IEV0aGVybmV0IGZyYW1lICovCisvKiBQYXRjaCBmb3IgV0hRTCBvbmx5LCB3aGljaCBkaWQgbm90IHR1cm4gb24gTmV0YmlvcyBidXQgdXNlIElQWCB3aXRoaW4gaXRzIHBheWxvYWQgKi8KKy8qIE5vdGU6ICovCisvKiAgICAgX3BEYXRhICYgX0RhdGFTaXplIG1heSBiZSBhbHRlcmVkIChyZW1vdmUgOC1ieXRlIExMQy9TTkFQKSBieSB0aGlzIE1BQ1JPICovCisvKiAgICAgX3BSZW1vdmVkTExDU05BUDogcG9pbnRlciB0byByZW1vdmVkIExMQy9TTkFQOyBOVUxMIGlzIG5vdCByZW1vdmVkICovCiAjZGVmaW5lIENPTlZFUlRfVE9fODAyXzMoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBfcERhdGEsIF9EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCkgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY2hhciBMTENfTGVuWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC04NjgsMTMgKzQwNCwxMyBAQAogICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIF9wRGF0YSwgNikgIHx8ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgXAogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBQVUNIQVIgcFByb3RvID0gX3BEYXRhICsgNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1OCAqcFByb3RvID0gX3BEYXRhICsgNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAoKE5kaXNFcXVhbE1lbW9yeShJUFgsIHBQcm90bywgMikgfHwgTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIHBQcm90bywgMikpICYmICBcCiAgICAgICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIF9wRGF0YSwgNikpICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMTENfTGVuWzBdID0gKHU4KShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBMTENfTGVuWzFdID0gKHU4KShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC04ODcsNTUxICs0MjMsNDM3IEBACiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIExMQ19MZW5bMF0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIExMQ19MZW5bMV0gPSAoVUNIQVIpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExMQ19MZW5bMF0gPSAodTgpKF9EYXRhU2l6ZSAvIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExMQ19MZW5bMV0gPSAodTgpKF9EYXRhU2l6ZSAlIDI1Nik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1BS0VfODAyXzNfSEVBREVSKF9wODAyM2hkciwgX3BEQSwgX3BTQSwgTExDX0xlbik7ICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLSNkZWZpbmUgU1dJVENIX0FCKCBfcEFBLCBfcEJCKSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFBWT0lEIHBDQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBDQyA9IF9wQkI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfcEJCID0gX3BBQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9wQUEgPSBwQ0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gRW5xdWV1ZSB0aGlzIGZyYW1lIHRvIE1MTUUgZW5naW5lCi0vLyBXZSBuZWVkIHRvIGVucXVldWUgdGhlIHdob2xlIGZyYW1lIGJlY2F1c2UgTUxNRSBuZWVkIHRvIHBhc3MgZGF0YSB0eXBlCi0vLyBpbmZvcm1hdGlvbiBmcm9tIDgwMi4xMSBoZWFkZXIKLSNpZmRlZiBSVDI4NjAKKy8qIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZSAqLworLyogV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZSAqLworLyogaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyICovCisjaWZkZWYgUlRNUF9NQUNfUENJCiAjZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVJTlQzMiBIaWdoMzJUU0YsIExvdzMyVFNGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdTMyIEhpZ2gzMlRTRiwgTG93MzJUU0Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBSVE1QX0lPX1JFQUQzMihfcEFkLCBUU0ZfVElNRVJfRFcxLCAmSGlnaDMyVFNGKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgUlRNUF9JT19SRUFEMzIoX3BBZCwgVFNGX1RJTUVSX0RXMCwgJkxvdzMyVFNGKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAoVUNIQVIpX1Jzc2kwLCAoVUNIQVIpX1Jzc2kxLChVQ0hBUilfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKFVDSEFSKV9QbGNwU2lnbmFsKTsgICBcCisgICAgTWxtZUVucXVldWVGb3JSZWN2KF9wQWQsIFdjaWQsIEhpZ2gzMlRTRiwgTG93MzJUU0YsICh1OClfUnNzaTAsICh1OClfUnNzaTEsKHU4KV9Sc3NpMixfRnJhbWVTaXplLCBfcEZyYW1lLCAodTgpX1BsY3BTaWduYWwpOyAgIFwKIH0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgogI2RlZmluZSBSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKF9wQWQsIFdjaWQsIF9wRnJhbWUsIF9GcmFtZVNpemUsIF9Sc3NpMCwgX1Jzc2kxLCBfUnNzaTIsIF9QbGNwU2lnbmFsKSAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVSU5UMzIgSGlnaDMyVFNGPTAsIExvdzMyVFNGPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKFVDSEFSKV9Sc3NpMCwgKFVDSEFSKV9Sc3NpMSwoVUNIQVIpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsIChVQ0hBUilfUGxjcFNpZ25hbCk7ICAgXAorICAgIHUzMiBIaWdoMzJUU0Y9MCwgTG93MzJUU0Y9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1sbWVFbnF1ZXVlRm9yUmVjdihfcEFkLCBXY2lkLCBIaWdoMzJUU0YsIExvdzMyVFNGLCAodTgpX1Jzc2kwLCAodTgpX1Jzc2kxLCh1OClfUnNzaTIsX0ZyYW1lU2l6ZSwgX3BGcmFtZSwgKHU4KV9QbGNwU2lnbmFsKTsgICBcCiB9Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLS8vTmVlZCB0byBjb2xsZWN0IGVhY2ggYW50J3MgcnNzaSBjb25jdXJyZW50bHkKLS8vcnNzaTEgaXMgcmVwb3J0IHRvIHBhaXIyIEFudCBhbmQgcnNzMiBpcyByZXByb3QgdG8gcGFpcjEgQW50IHdoZW4gNCBBbnQKLSNkZWZpbmUgQ09MTEVDVF9SWF9BTlRFTk5BX0FWRVJBR0VfUlNTSShfcEFkLCBfcnNzaTEsIF9yc3NpMikJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlTSE9SVAlBdmdSc3NpOwkJCQkJCQkJCQkJCQkJCVwKLQlVQ0hBUglVc2VkQW50OwkJCQkJCQkJCQkJCQkJCVwKLQlpZiAoX3BBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPT0gMCkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJVXNlZEFudCA9IF9wQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50OwkJCQkJCQlcCi0JCUF2Z1Jzc2kgPSBfcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbVXNlZEFudF07CQkJCQkJXAotCQlpZiAoQXZnUnNzaSA8IDApCQkJCQkJCQkJCQkJCVwKLQkJCUF2Z1Jzc2kgPSBBdmdSc3NpIC0gKEF2Z1Jzc2kgPj4gMykgKyBfcnNzaTE7CQkJCQlcCi0JCWVsc2UJCQkJCQkJCQkJCQkJCQkJXAotCQkJQXZnUnNzaSA9IF9yc3NpMSA8PCAzOwkJCQkJCQkJCQkJXAotCQlfcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbVXNlZEFudF0gPSBBdmdSc3NpOwkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQlVc2VkQW50ID0gX3BBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudDsJCQkJCQkJXAotCQlBdmdSc3NpID0gX3BBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW1VzZWRBbnRdOwkJCQkJCVwKLQkJaWYgKChBdmdSc3NpIDwgMCkgJiYgKF9wQWQtPlJ4QW50LkZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZSkpCQlcCi0JCQlBdmdSc3NpID0gQXZnUnNzaSAtIChBdmdSc3NpID4+IDMpICsgX3Jzc2kxOwkJCQkJXAotCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJX3BBZC0+UnhBbnQuRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlID0gVFJVRTsJCQkJCVwKLQkJCUF2Z1Jzc2kgPSBfcnNzaTEgPDwgMzsJCQkJCQkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQlfcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbVXNlZEFudF0gPSBBdmdSc3NpOwkJCQkJCVwKLQkJX3BBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlKys7CQkJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBORElTX1FVRVJZX0JVRkZFUihfTmRpc0J1ZiwgX3BwVkEsIF9wQnVmTGVuKSAgICAgICAgICAgICAgICAgICAgXAotICAgIE5kaXNRdWVyeUJ1ZmZlcihfTmRpc0J1ZiwgX3BwVkEsIF9wQnVmTGVuKQotCi0jZGVmaW5lIE1BQ19BRERSX0VRVUFMKHBBZGRyMSxwQWRkcjIpICAgICAgICAgICBSVE1QRXF1YWxNZW1vcnkoKFBWT0lEKShwQWRkcjEpLCAoUFZPSUQpKHBBZGRyMiksIE1BQ19BRERSX0xFTikKKyNkZWZpbmUgTUFDX0FERFJfRVFVQUwocEFkZHIxLHBBZGRyMikgICAgICAgICAgIFJUTVBFcXVhbE1lbW9yeSgodm9pZCAqKShwQWRkcjEpLCAodm9pZCAqKShwQWRkcjIpLCBNQUNfQUREUl9MRU4pCiAjZGVmaW5lIFNTSURfRVFVQUwoc3NpZDEsIGxlbjEsIHNzaWQyLCBsZW4yKSAgICAoKGxlbjE9PWxlbjIpICYmIChSVE1QRXF1YWxNZW1vcnkoc3NpZDEsIHNzaWQyLCBsZW4xKSkpCiAKLS8vCi0vLyBDaGVjayBpZiBpdCBpcyBKYXBhbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbC4KLS8vCisvKiAqLworLyogQ2hlY2sgaWYgaXQgaXMgSmFwYW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWwuICovCisvKiAqLwogI2RlZmluZSBKYXBhbkNoYW5uZWxDaGVjayhjaGFubmVsKSAgKChjaGFubmVsID09IDUyKSB8fCAoY2hhbm5lbCA9PSA1NikgfHwgKGNoYW5uZWwgPT0gNjApIHx8IChjaGFubmVsID09IDY0KSkKIAotI2lmZGVmIFJUMjg2MAorI2RlZmluZSBTVEFfRVhUUkFfU0VUVElORyhfcEFkKQorCiAjZGVmaW5lIFNUQV9QT1JUX1NFQ1VSRUQoX3BBZCkgXAogeyBcCi0JX3BBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7IFwKLQlSVE1QX1NFVF9QU0ZMQUcoX3BBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsgXAotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihfcEFkKS0+TWFjVGFiTG9jayk7IFwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IF9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAorCUJPT0xFQU4JQ2FuY2VsbGVkOyBcCisJKF9wQWQpLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgXAorCU5kaXNBY3F1aXJlU3BpbkxvY2soJigoX3BBZCktPk1hY1RhYkxvY2spKTsgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSAoX3BBZCktPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAorCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsO1wKIAlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoX3BBZCktPk1hY1RhYkxvY2spOyBcCisJUlRNUENhbmNlbFRpbWVyKCYoKF9wQWQpLT5NbG1lLkxpbmtEb3duVGltZXIpLCAmQ2FuY2VsbGVkKTtcCisJU1RBX0VYVFJBX1NFVFRJTkcoX3BBZCk7IFwKIH0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBTVEFfUE9SVF9TRUNVUkVEKF9wQWQpIFwKLXsgXAotCV9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyBcCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmX3BBZC0+TWFjVGFiTG9jayk7IFwKLQlfcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IF9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAotCU5kaXNSZWxlYXNlU3BpbkxvY2soJl9wQWQtPk1hY1RhYkxvY2spOyBcCi19Ci0jZW5kaWYKIAotLy8KLS8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFR19QQUlSCi17Ci0JVUxPTkcgICBSZWdpc3RlcjsKLQlVTE9ORyAgIFZhbHVlOwotfSBSVE1QX1JFR19QQUlSLCAqUFJUTVBfUkVHX1BBSVI7CisvKiAqLworLyogIERhdGEgYnVmZmVyIGZvciBETUEgb3BlcmF0aW9uLCB0aGUgYnVmZmVyIG11c3QgYmUgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgKi8KKy8qICBCb3RoIERNQSB0byAvIGZyb20gQ1BVIHVzZSB0aGUgc2FtZSBzdHJ1Y3R1cmUuICovCisvKiAqLworc3RydWN0IHJ0X3J0bXBfZG1hYnVmIHsKKwl1bnNpZ25lZCBsb25nIEFsbG9jU2l6ZTsKKwl2b2lkICpBbGxvY1ZhOwkJLyogVHhCdWYgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBBbGxvY1BhOwkvKiBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzICovCit9OwogCi10eXBlZGVmIHN0cnVjdCAgX1JFR19QQUlSCi17Ci0JVUNIQVIgICBSZWdpc3RlcjsKLQlVQ0hBUiAgIFZhbHVlOwotfSBSRUdfUEFJUiwgKlBSRUdfUEFJUjsKKy8qICovCisvKiBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZSAqLworLyogY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIGNoYXIgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yICovCisvKiB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0ICovCisvKiBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIgKi8KKy8qIHRvIGRlc2NyaWJlIHRoZSBwYWNrZXQgYnVmZmVyLiBGb3IgVHgsIGNoYXIgc3RvcmVkIHRoZSB0eCBwYWNrZXQgZGVzY3JpcHRvciAqLworLyogd2hpY2ggZHJpdmVyIHNob3VsZCBBQ0sgdXBwZXIgbGF5ZXIgd2hlbiB0aGUgdHggaXMgcGh5c2ljYWxseSBkb25lIG9yIGZhaWxlZC4gKi8KKy8qICovCitzdHJ1Y3QgcnRfcnRtcF9kbWFjYiB7CisJdW5zaWduZWQgbG9uZyBBbGxvY1NpemU7CS8qIENvbnRyb2wgYmxvY2sgc2l6ZSAqLworCXZvaWQgKkFsbG9jVmE7CQkvKiBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgQWxsb2NQYTsJLyogQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzICovCisJdm9pZCAqcE5kaXNQYWNrZXQ7CisJdm9pZCAqcE5leHROZGlzUGFja2V0OwogCi0vLwotLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkZfUkVHUwotewotCVVDSEFSICAgQ2hhbm5lbDsKLQlVTE9ORyAgIFIxOwotCVVMT05HICAgUjI7Ci0JVUxPTkcgICBSMzsKLQlVTE9ORyAgIFI0OwotfSBSVE1QX1JGX1JFR1MsICpQUlRNUF9SRl9SRUdTOworCXN0cnVjdCBydF9ydG1wX2RtYWJ1ZiBEbWFCdWY7CS8qIEFzc29jaWF0ZWQgRE1BIGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9GUkVRVUVOQ1lfSVRFTSB7Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVQ0hBUglOOwotCVVDSEFSCVI7Ci0JVUNIQVIJSzsKLX0gRlJFUVVFTkNZX0lURU0sICpQRlJFUVVFTkNZX0lURU07CitzdHJ1Y3QgcnRfcnRtcF90eF9yaW5nIHsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFjYiBDZWxsW1RYX1JJTkdfU0laRV07CisJdTMyIFR4Q3B1SWR4OworCXUzMiBUeERtYUlkeDsKKwl1MzIgVHhTd0ZyZWVJZHg7CS8qIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleCAqLworfTsKIAotLy8KLS8vICBEYXRhIGJ1ZmZlciBmb3IgRE1BIG9wZXJhdGlvbiwgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgbWVtb3J5Ci0vLyAgQm90aCBETUEgdG8gLyBmcm9tIENQVSB1c2UgdGhlIHNhbWUgc3RydWN0dXJlLgotLy8KLXR5cGVkZWYgc3RydWN0ICBfUlRNUF9ETUFCVUYKLXsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7Ci0JUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIFR4QnVmIHBoeXNpY2FsIGFkZHJlc3MKLX0gUlRNUF9ETUFCVUYsICpQUlRNUF9ETUFCVUY7CitzdHJ1Y3QgcnRfcnRtcF9yeF9yaW5nIHsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFjYiBDZWxsW1JYX1JJTkdfU0laRV07CisJdTMyIFJ4Q3B1SWR4OworCXUzMiBSeERtYUlkeDsKKwlpbnQgUnhTd1JlYWRJZHg7CS8qIHNvZnR3YXJlIG5leHQgcmVhZCBpbmRleCAqLworfTsKIAorc3RydWN0IHJ0X3J0bXBfbWdtdF9yaW5nIHsKKwlzdHJ1Y3QgcnRfcnRtcF9kbWFjYiBDZWxsW01HTVRfUklOR19TSVpFXTsKKwl1MzIgVHhDcHVJZHg7CisJdTMyIFR4RG1hSWR4OworCXUzMiBUeFN3RnJlZUlkeDsJLyogc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4ICovCit9OwogCi10eXBlZGVmCXVuaW9uCV9IRUFERVJfODAyXzExX1NFUXsKLSAgICBzdHJ1Y3QgewotCVVTSE9SVAkJCUZyYWc6NDsKLQlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKLSAgICB9ICAgZmllbGQ7Ci0gICAgVVNIT1JUICAgICAgICAgICB2YWx1ZTsKLX0JSEVBREVSXzgwMl8xMV9TRVEsICpQSEVBREVSXzgwMl8xMV9TRVE7CisvKiAqLworLyogIFN0YXRpc3RpYyBjb3VudGVyIHN0cnVjdHVyZSAqLworLyogKi8KK3N0cnVjdCBydF9jb3VudGVyXzgwMl8zIHsKKwkvKiBHZW5lcmFsIFN0YXRzICovCisJdW5zaWduZWQgbG9uZyBHb29kVHJhbnNtaXRzOworCXVuc2lnbmVkIGxvbmcgR29vZFJlY2VpdmVzOworCXVuc2lnbmVkIGxvbmcgVHhFcnJvcnM7CisJdW5zaWduZWQgbG9uZyBSeEVycm9yczsKKwl1bnNpZ25lZCBsb25nIFJ4Tm9CdWZmZXI7CiAKLS8vCi0vLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQotLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkVPUkRFUkJVRgotewotCUJPT0xFQU4JCQlJc0Z1bGw7Ci0JUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBUeEJ1ZiB2aXJ0dWFsIGFkZHJlc3MKLQlVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKLQlIRUFERVJfODAyXzExX1NFUQkJCVNlcXVlbmNlOwkvL3N1cHBvcnQgY29tcHJlc3NlZCBiaXRtYXAgQkEsIHNvIG5vIGNvbnNpZGVyIGZyYWdtZW50IGluIEJBCi0JVUNIQVIgCQlEYXRhT2Zmc2V0OwotCVVTSE9SVCAJCURhdGFzaXplOwotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsKLSNpZmRlZiBSVDI4NjAKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIFR4QnVmIHBoeXNpY2FsIGFkZHJlc3MKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCVBVQ0hBUgkJCQkJQWxsb2NQYTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLX0gICBSVE1QX1JFT1JERVJCVUYsICpQUlRNUF9SRU9SREVSQlVGOworCS8qIEV0aGVybmV0IFN0YXRzICovCisJdW5zaWduZWQgbG9uZyBSY3ZBbGlnbm1lbnRFcnJvcnM7CisJdW5zaWduZWQgbG9uZyBPbmVDb2xsaXNpb247CisJdW5zaWduZWQgbG9uZyBNb3JlQ29sbGlzaW9uczsKIAotLy8KLS8vIENvbnRyb2wgYmxvY2sgKERlc2NyaXB0b3IpIGZvciBhbGwgcmluZyBkZXNjcmlwdG9yIERNQSBvcGVyYXRpb24sIGJ1ZmZlciBtdXN0IGJlCi0vLyBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4gTkRJU19QQUNLRVQgc3RvcmVkIHRoZSBiaW5kaW5nIFJ4IHBhY2tldCBkZXNjcmlwdG9yCi0vLyB3aGljaCB3b24ndCBiZSByZWxlYXNlZCwgZHJpdmVyIGhhcyB0byB3YWl0IHVudGlsIHVwcGVyIGxheWVyIHJldHVybiB0aGUgcGFja2V0Ci0vLyBiZWZvcmUgZ2l2ZWluZyB1cCB0aGlzIHJ4IHJpbmcgZGVzY3JpcHRvciB0byBBU0lDLiBORElTX0JVRkZFUiBpcyBhc3NvY2FpdGVkIHBhaXIKLS8vIHRvIGRlc2NyaWJlIHRoZSBwYWNrZXQgYnVmZmVyLiBGb3IgVHgsIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgdHggcGFja2V0IGRlc2NyaXB0b3IKLS8vIHdoaWNoIGRyaXZlciBzaG91bGQgQUNLIHVwcGVyIGxheWVyIHdoZW4gdGhlIHR4IGlzIHBoeXNpY2FsbHkgZG9uZSBvciBmYWlsZWQuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfRE1BQ0IKLXsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBBbGxvY1NpemU7ICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgc2l6ZQotCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayB2aXJ0dWFsIGFkZHJlc3MKLQlORElTX1BIWVNJQ0FMX0FERFJFU1MgICBBbGxvY1BhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgcGh5c2ljYWwgYWRkcmVzcwotCVBORElTX1BBQ0tFVCBwTmRpc1BhY2tldDsKLQlQTkRJU19QQUNLRVQgcE5leHROZGlzUGFja2V0OworfTsKIAotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIERtYUJ1ZjsgICAgICAgICAgICAgLy8gQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZQotfSBSVE1QX0RNQUNCLCAqUFJUTVBfRE1BQ0I7CitzdHJ1Y3QgcnRfY291bnRlcl84MDJfMTEgeworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOworCUxBUkdFX0lOVEVHRVIgTGFzdFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZhaWxlZENvdW50OworCUxBUkdFX0lOVEVHRVIgUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSIE11bHRpcGxlUmV0cnlDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJUU1N1Y2Nlc3NDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJUU0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEFDS0ZhaWx1cmVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIEZyYW1lRHVwbGljYXRlQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZWNlaXZlZEZyYWdtZW50Q291bnQ7CisJTEFSR0VfSU5URUdFUiBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7CisJTEFSR0VfSU5URUdFUiBGQ1NFcnJvckNvdW50OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfQlVGCi17Ci0JUFFVRVVFX0VOVFJZICAgIE5leHQ7Ci0JVUNIQVIgICAgICAgICAgIEluZGV4OwotCVVMT05HICAgICAgICAgICAgICAgICAgIEFsbG9jU2l6ZTsgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBzaXplCi0JUFZPSUQgICAgICAgICAgICAgICAgICAgQWxsb2NWYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHZpcnR1YWwgYWRkcmVzcwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyAgIEFsbG9jUGE7ICAgICAgICAgICAgLy8gQ29udHJvbCBibG9jayBwaHlzaWNhbCBhZGRyZXNzCi19IFJUTVBfVFhCVUYsICpQUlRNUF9UWEJVRjsKK3N0cnVjdCBydF9jb3VudGVyX3JhbGluayB7CisJdW5zaWduZWQgbG9uZyBUcmFuc21pdHRlZEJ5dGVDb3VudDsJLyogYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0ICovCisJdW5zaWduZWQgbG9uZyBSZWNlaXZlZEJ5dGVDb3VudDsJLyogYm90aCBDUkMgb2theSBhbmQgQ1JDIGVycm9yLCB1c2VkIHRvIGNhbGN1bGF0ZSBSWCB0aHJvdWdocHV0ICovCisJdW5zaWduZWQgbG9uZyBCZWVuRGlzYXNzb2NpYXRlZENvdW50OworCXVuc2lnbmVkIGxvbmcgQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQ7CisJdW5zaWduZWQgbG9uZyBQb29yQ1FJUm9hbWluZ0NvdW50OworCXVuc2lnbmVkIGxvbmcgTWdtdFJpbmdGdWxsQ291bnQ7CisJdW5zaWduZWQgbG9uZyBSeENvdW50U2luY2VMYXN0TlVMTDsKKwl1bnNpZ25lZCBsb25nIFJ4Q291bnQ7CisJdW5zaWduZWQgbG9uZyBSeFJpbmdFcnJDb3VudDsKKwl1bnNpZ25lZCBsb25nIEtpY2tUeENvdW50OworCXVuc2lnbmVkIGxvbmcgVHhSaW5nRXJyQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZWFsRmNzRXJyQ291bnQ7CisJdW5zaWduZWQgbG9uZyBQZW5kaW5nTmRpc1BhY2tldENvdW50OwogCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9CVUYKLXsKLQlCT09MRUFOICAgICAgICAgICBJblVzZTsKLQlVTE9ORyAgICAgICAgICAgCUJ5QmFSZWNJbmRleDsKLQlSVE1QX1JFT1JERVJCVUYJTUFQX1JYQnVmW01BWF9SWF9SRU9SREVSQlVGXTsKLX0gUlRNUF9SWEJVRiwgKlBSVE1QX1JYQlVGOwotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfUklORwotewotCVJUTVBfRE1BQ0IgIENlbGxbVFhfUklOR19TSVpFXTsKLQlVSU5UMzIJCVR4Q3B1SWR4OwotCVVJTlQzMgkJVHhEbWFJZHg7Ci0JVUlOVDMyCQlUeFN3RnJlZUlkeDsgCS8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAotfSBSVE1QX1RYX1JJTkcsICpQUlRNUF9UWF9SSU5HOworCXVuc2lnbmVkIGxvbmcgT25lU2VjT3NUeENvdW50W05VTV9PRl9UWF9SSU5HXTsKKwl1bnNpZ25lZCBsb25nIE9uZVNlY0RtYURvbmVDb3VudFtOVU1fT0ZfVFhfUklOR107CisJdTMyIE9uZVNlY1R4RG9uZUNvdW50OworCXVuc2lnbmVkIGxvbmcgT25lU2VjUnhDb3VudDsKKwl1MzIgT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50OworCXUzMiBPbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQ7CisJdTMyIE9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50OworCXUzMiBPbmVTZWNGcmFtZUR1cGxpY2F0ZUNvdW50OwogCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9SWF9SSU5HCi17Ci0JUlRNUF9ETUFDQiAgQ2VsbFtSWF9SSU5HX1NJWkVdOwotCVVJTlQzMgkJUnhDcHVJZHg7Ci0JVUlOVDMyCQlSeERtYUlkeDsKLQlJTlQzMgkJUnhTd1JlYWRJZHg7IAkvLyBzb2Z0d2FyZSBuZXh0IHJlYWQgaW5kZXgKLX0gUlRNUF9SWF9SSU5HLCAqUFJUTVBfUlhfUklORzsKKwl1MzIgT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQ7CS8qIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbHVyZSwgdXNlZCB0byBjYWxjdWxhdGUgVFggdGhyb3VnaHB1dCAqLworCXUzMiBPbmVTZWNUeE5vUmV0cnlPa0NvdW50OworCXUzMiBPbmVTZWNUeFJldHJ5T2tDb3VudDsKKwl1MzIgT25lU2VjVHhGYWlsQ291bnQ7CisJdTMyIE9uZVNlY0ZhbHNlQ0NBQ250OwkvKiBDQ0EgZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyICovCisJdTMyIE9uZVNlY1J4T2tDbnQ7CS8qIFJYIHdpdGhvdXQgZXJyb3IgKi8KKwl1MzIgT25lU2VjUnhPa0RhdGFDbnQ7CS8qIHVuaWNhc3QtdG8tbWUgREFUQSBmcmFtZSBjb3VudCAqLworCXUzMiBPbmVTZWNSeEZjc0VyckNudDsJLyogQ1JDIGVycm9yICovCisJdTMyIE9uZVNlY0JlYWNvblNlbnRDbnQ7CisJdTMyIExhc3RPbmVTZWNUb3RhbFR4Q291bnQ7CS8qIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKyBPbmVTZWNUeFJldHJ5T2tDb3VudCArIE9uZVNlY1R4RmFpbENvdW50ICovCisJdTMyIExhc3RPbmVTZWNSeE9rRGF0YUNudDsJLyogT25lU2VjUnhPa0RhdGFDbnQgKi8KKwl1bnNpZ25lZCBsb25nIER1cGxpY2F0ZVJjdjsKKwl1bnNpZ25lZCBsb25nIFR4QWdnQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeE5vbkFnZ0NvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cyTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2czTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2c0TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2c1TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2c2TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2c3TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2c4TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2c5TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxME1QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTFNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzEyTVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxM01QRFVDb3VudDsKKwl1bnNpZ25lZCBsb25nIFR4QWdnMTRNUERVQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUeEFnZzE1TVBEVUNvdW50OworCXVuc2lnbmVkIGxvbmcgVHhBZ2cxNk1QRFVDb3VudDsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfTUdNVF9SSU5HCi17Ci0JUlRNUF9ETUFDQiAgQ2VsbFtNR01UX1JJTkdfU0laRV07Ci0JVUlOVDMyCQlUeENwdUlkeDsKLQlVSU5UMzIJCVR4RG1hSWR4OwotCVVJTlQzMgkJVHhTd0ZyZWVJZHg7IC8vIHNvZnR3YXJlIG5leHQgZnJlZSB0eCBpbmRleAotfSBSVE1QX01HTVRfUklORywgKlBSVE1QX01HTVRfUklORzsKKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVNEVTsKKwlMQVJHRV9JTlRFR0VSIFRyYW5zbWl0dGVkQU1TRFVDb3VudDsKKwlMQVJHRV9JTlRFR0VSIFJlY2VpdmVkT2N0ZXNJbkFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiBSZWNlaXZlZEFNU0RVQ291bnQ7CisJTEFSR0VfSU5URUdFUiBUcmFuc21pdHRlZEFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiBUcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50OworCUxBUkdFX0lOVEVHRVIgVHJhbnNtaXR0ZWRPY3RldHNJbkFNUERVQ291bnQ7CisJTEFSR0VfSU5URUdFUiBNUERVSW5SZWNlaXZlZEFNUERVQ291bnQ7Cit9OwogCi0vLwotLy8gIFN0YXRpc3RpYyBjb3VudGVyIHN0cnVjdHVyZQotLy8KLXR5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8zCi17Ci0JLy8gR2VuZXJhbCBTdGF0cwotCVVMT05HICAgICAgIEdvb2RUcmFuc21pdHM7Ci0JVUxPTkcgICAgICAgR29vZFJlY2VpdmVzOwotCVVMT05HICAgICAgIFR4RXJyb3JzOwotCVVMT05HICAgICAgIFJ4RXJyb3JzOwotCVVMT05HICAgICAgIFJ4Tm9CdWZmZXI7CitzdHJ1Y3QgcnRfY291bnRlcl9kcnMgeworCS8qIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4gKi8KKwl1MTYgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKKwl1OCBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOworCXU4IFR4UmF0ZVVwUGVuYWx0eTsJLyogZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIEN1cnJUeFJhdGVTdGFibGVUaW1lOwkvKiAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUgKi8KKwlCT09MRUFOIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4gZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCXU4IExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CS8qIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93biAqLworCXU4IExhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOwkvKktlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gKi8KKwl1bnNpZ25lZCBsb25nIExhc3RUeE9rQ291bnQ7Cit9OwogCi0JLy8gRXRoZXJuZXQgU3RhdHMKLQlVTE9ORyAgICAgICBSY3ZBbGlnbm1lbnRFcnJvcnM7Ci0JVUxPTkcgICAgICAgT25lQ29sbGlzaW9uOwotCVVMT05HICAgICAgIE1vcmVDb2xsaXNpb25zOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCXNlY3VyaXR5IGtleSByZWxhdGVkIGRhdGEgc3RydWN0dXJlCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X2NpcGhlcl9rZXkgeworCXU4IEtleVsxNl07CQkvKiByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4ICovCisJdTggUnhNaWNbOF07CQkvKiBtYWtlIGFsaWdubWVudCAqLworCXU4IFR4TWljWzhdOworCXU4IFR4VHNjWzZdOwkJLyogNDhiaXQgVFNDIHZhbHVlICovCisJdTggUnhUc2NbNl07CQkvKiA0OGJpdCBUU0MgdmFsdWUgKi8KKwl1OCBDaXBoZXJBbGc7CS8qIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjggKi8KKwl1OCBLZXlMZW47CisJdTggQnNzSWRbNl07CisJLyogS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQgKi8KKwl1OCBUeXBlOwkJLyogSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yICovCit9OwogCi19IENPVU5URVJfODAyXzMsICpQQ09VTlRFUl84MDJfMzsKKy8qIHN0cnVjdHVyZSB0byBkZWZpbmUgV1BBIEdyb3VwIEtleSBSZWtleSBJbnRlcnZhbCAqLworc3RydWN0IFBBQ0tFRCBydF84MDJfMTFfd3BhX3Jla2V5IHsKKwl1bnNpZ25lZCBsb25nIFJlS2V5TWV0aG9kOwkvKiBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZCAqLworCXVuc2lnbmVkIGxvbmcgUmVLZXlJbnRlcnZhbDsJLyogdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9DT1VOVEVSXzgwMl8xMSB7Ci0JVUxPTkcgICAgICAgICAgIExlbmd0aDsKLQlMQVJHRV9JTlRFR0VSICAgTGFzdFRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSZXRyeUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aXBsZVJldHJ5Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUlRTRmFpbHVyZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBBQ0tGYWlsdXJlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJlY2VpdmVkRnJhZ21lbnRDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotfSBDT1VOVEVSXzgwMl8xMSwgKlBDT1VOVEVSXzgwMl8xMTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglSVFVTQiBJL08gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBydF9zZXRfYXNpY193Y2lkIHsKKwl1bnNpZ25lZCBsb25nIFdDSUQ7CQkvKiBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZCAqLworCXVuc2lnbmVkIGxvbmcgU2V0VGlkOwkJLyogdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIERlbGV0ZVRpZDsJLyogdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMgKi8KKwl1OCBBZGRyW01BQ19BRERSX0xFTl07CS8qIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfUkFMSU5LIHsKLQlVTE9ORyAgICAgICAgICAgVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0Ci0jaWZkZWYgUlQyODYwCi0JVUxPTkcgICAgICAgICAgIExhc3RSZWNlaXZlZEJ5dGVDb3VudDsKLSNlbmRpZgotCVVMT05HICAgICAgICAgICBSZWNlaXZlZEJ5dGVDb3VudDsgICAgICAvLyBib3RoIENSQyBva2F5IGFuZCBDUkMgZXJyb3IsIHVzZWQgdG8gY2FsY3VsYXRlIFJYIHRocm91Z2hwdXQKLQlVTE9ORyAgICAgICAgICAgQmVlbkRpc2Fzc29jaWF0ZWRDb3VudDsKLQlVTE9ORyAgICAgICAgICAgQmFkQ1FJQXV0b1JlY292ZXJ5Q291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFBvb3JDUUlSb2FtaW5nQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIE1nbXRSaW5nRnVsbENvdW50OwotCVVMT05HICAgICAgICAgICBSeENvdW50U2luY2VMYXN0TlVMTDsKLQlVTE9ORyAgICAgICAgICAgUnhDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUnhSaW5nRXJyQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIEtpY2tUeENvdW50OwotCVVMT05HICAgICAgICAgICBUeFJpbmdFcnJDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUmVhbEZjc0VyckNvdW50OwotCVVMT05HICAgICAgICAgICBQZW5kaW5nTmRpc1BhY2tldENvdW50Oworc3RydWN0IHJ0X3NldF9hc2ljX3djaWRfYXR0cmkgeworCXVuc2lnbmVkIGxvbmcgV0NJRDsJCS8qIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkICovCisJdW5zaWduZWQgbG9uZyBDaXBoZXI7CQkvKiBBU0lDIENpcGhlciBkZWZpbml0aW9uICovCisJdTggQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOworfTsKIAotCVVMT05HICAgICAgICAgICBPbmVTZWNPc1R4Q291bnRbTlVNX09GX1RYX1JJTkddOwotCVVMT05HICAgICAgICAgICBPbmVTZWNEbWFEb25lQ291bnRbTlVNX09GX1RYX1JJTkddOwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeERvbmVDb3VudDsKLQlVTE9ORyAgICAgICAgICAgT25lU2VjUnhDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQ7CisvKiBmb3IgVVNCIGludGVyZmFjZSwgYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5ICovCitzdHJ1Y3QgcnRfYWRkX3BhaXJ3aXNlX2tleV9lbnRyeSB7CisJdTggTWFjQWRkcls2XTsKKwl1MTYgTWFjVGFiTWF0Y2hXQ0lEOwkvKiBBU0lDICovCisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgQ2lwaGVyS2V5OworfTsKIAotCVVJTlQzMiAgIAkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKKy8qIENpcGhlciBzdWl0ZSB0eXBlIGZvciBtaXhlZCBtb2RlIGdyb3VwIGNpcGhlciwgUDgwMi4xMWktMjAwNCAqLwordHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEUgeworCUNpcGhlcl9UeXBlX05PTkUsCisJQ2lwaGVyX1R5cGVfV0VQNDAsCisJQ2lwaGVyX1R5cGVfVEtJUCwKKwlDaXBoZXJfVHlwZV9SU1ZELAorCUNpcGhlcl9UeXBlX0NDTVAsCisJQ2lwaGVyX1R5cGVfV0VQMTA0Cit9IFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSwgKlBSVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEU7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLSNpZmRlZiBSVDI4NzAKLQlVTE9ORyAgICAgICAgICAgT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0Ci0jZW5kaWYgLy8gUlQyODcwIC8vCitzdHJ1Y3QgcnRfcm9ndWVhcF9lbnRyeSB7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXU4IEVycm9yQ29kZVsyXTsJLyowMCAwMS1JbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUgKi8KKwkvKjAwIDAyLUF1dGhlbnRpY2F0aW9uIHRpbWVvdXQgKi8KKwkvKjAwIDAzLUNoYWxsZW5nZSBmcm9tIEFQIGZhaWxlZCAqLworCS8qMDAgMDQtQ2hhbGxlbmdlIHRvIEFQIGZhaWxlZCAqLworCUJPT0xFQU4gUmVwb3J0ZWQ7Cit9OwogCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjRmFsc2VDQ0FDbnQ7ICAgICAgLy8gQ0NBIGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rQ250OyAgICAgICAgICAvLyBSWCB3aXRob3V0IGVycm9yCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tEYXRhQ250OyAgICAgIC8vIHVuaWNhc3QtdG8tbWUgREFUQSBmcmFtZSBjb3VudAotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEZjc0VyckNudDsgICAgICAvLyBDUkMgZXJyb3IKLQlVSU5UMzIgICAgICAgICAgT25lU2VjQmVhY29uU2VudENudDsKLQlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1RvdGFsVHhDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKLQlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1J4T2tEYXRhQ250OyAgLy8gT25lU2VjUnhPa0RhdGFDbnQKLQlVTE9ORwkJRHVwbGljYXRlUmN2OwotCVVMT05HCQlUeEFnZ0NvdW50OwotCVVMT05HCQlUeE5vbkFnZ0NvdW50OwotCVVMT05HCQlUeEFnZzFNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2czTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzRNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnNU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c2TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzdNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnOE1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c5TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzEwTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzExTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzEyTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzEzTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzE0TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzE1TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzE2TVBEVUNvdW50Oworc3RydWN0IHJ0X3JvZ3VlYXBfdGFibGUgeworCXU4IFJvZ3VlQXBOcjsKKwlzdHJ1Y3QgcnRfcm9ndWVhcF9lbnRyeSBSb2d1ZUFwRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOworfTsKIAotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVOwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRPY3Rlc0luQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFJlY2VpdmVkQU1TRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkTVBEVXNJbkFNUERVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIE1QRFVJblJlY2VpdmVkQU1QRFVDb3VudDsKLX0gQ09VTlRFUl9SQUxJTkssICpQQ09VTlRFUl9SQUxJTks7CisvKiAqLworLyogQ2lzY28gSUFQUCBmb3JtYXQgKi8KKy8qICovCitzdHJ1Y3QgcnRfY2lzY29faWFwcF9jb250ZW50IHsKKwl1MTYgTGVuZ3RoOwkJLypJQVBQIExlbmd0aCAqLworCXU4IE1lc3NhZ2VUeXBlOwkvKklBUFAgdHlwZSAqLworCXU4IEZ1bmN0aW9uQ29kZTsJLypJQVBQIGZ1bmN0aW9uIHR5cGUgKi8KKwl1OCBEZXN0aW5haW9uTUFDW01BQ19BRERSX0xFTl07CisJdTggU291cmNlTUFDW01BQ19BRERSX0xFTl07CisJdTE2IFRhZzsJCS8qVGFnKGVsZW1lbnQgSUUpIC0gQWRqYWNlbnQgQVAgcmVwb3J0ICovCisJdTE2IFRhZ0xlbmd0aDsJLypMZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIgKi8KKwl1OCBPVUlbNF07CQkvKjB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgKi8KKwl1OCBQcmV2aW91c0FQW01BQ19BRERSX0xFTl07CS8qTUFDIEFkZHJlc3Mgb2YgYWNjZXNzIHBvaW50ICovCisJdTE2IENoYW5uZWw7CisJdTE2IFNzaWRMZW47CisJdTggU3NpZFtNQVhfTEVOX09GX1NTSURdOworCXUxNiBTZWNvbmRzOwkJLypTZWNvbmRzIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBkaXNhc3NvY2lhdGVkLiAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1BJRF9DT1VOVEVSIHsKLQlVTE9ORyAgICAgICAgICAgVHhBY2tSZXF1aXJlZENvdW50OyAgICAgIC8vIENSQyBlcnJvcgotCVVMT05HICAgICAgICAgICBUeEFnZ3JlQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFR4U3VjY2Vzc0NvdW50OyAvLyBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQgKyBPbmVTZWNUeEZhaWxDb3VudAotCVVMT05HCQlMYXN0U3VjY2Vzc1JhdGU7Ci19IFBJRF9DT1VOVEVSLCAqUFBJRF9DT1VOVEVSOworLyoKKyAgKglGcmFnbWVudCBGcmFtZSBzdHJ1Y3R1cmUKKyAgKi8KK3N0cnVjdCBydF9mcmFnbWVudF9mcmFtZSB7CisJdm9pZCAqcEZyYWdQYWNrZXQ7CisJdW5zaWduZWQgbG9uZyBSeFNpemU7CisJdTE2IFNlcXVlbmNlOworCXUxNiBMYXN0RnJhZzsKKwl1bnNpZ25lZCBsb25nIEZsYWdzOwkJLyogU29tZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbi4gYml0IDA6IExMQyBwcmVzZW50ZWQgKi8KK307CiAKLXR5cGVkZWYgc3RydWN0IF9DT1VOVEVSX0RSUyB7Ci0JLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgotCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwotCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwotCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KLQlVTE9ORyAgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQotCUJPT0xFQU4gICAgICAgICBmTm9pc3lFbnZpcm9ubWVudDsKLQlCT09MRUFOICAgICAgICAgZkxhc3RTZWNBY2NvcmRpbmdSU1NJOwotCVVDSEFSICAgICAgICAgICBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uOyAvLyAwOiBubyBjaGFuZ2UsIDE6cmF0ZSBVUCwgMjpyYXRlIGRvd24KLQlVQ0hBUgkJCUxhc3RUaW1lVHhSYXRlQ2hhbmdlQWN0aW9uOyAvL0tlZXAgbGFzdCB0aW1lIHZhbHVlIG9mIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24KLQlVTE9ORwkJCUxhc3RUeE9rQ291bnQ7Ci19IENPVU5URVJfRFJTLCAqUENPVU5URVJfRFJTOworLyogKi8KKy8qIFBhY2tldCBpbmZvcm1hdGlvbiBmb3IgTmRpc1F1ZXJ5UGFja2V0ICovCisvKiAqLworc3RydWN0IHJ0X3BhY2tldF9pbmZvIHsKKwl1MzIgUGh5c2ljYWxCdWZmZXJDb3VudDsJLyogUGh5c2ljYWwgYnJlYWtzIG9mIGJ1ZmZlciBkZXNjcmlwb3IgY2hhaW5lZCAqLworCXUzMiBCdWZmZXJDb3VudDsJLyogTnVtYmVyIG9mIEJ1ZmZlciBkZXNjcmlwdG9yIGNoYWluZWQgKi8KKwl1MzIgVG90YWxQYWNrZXRMZW5ndGg7CS8qIFNlbGYgZXhwbGFpbmVkICovCisJY2hhciAqcEZpcnN0QnVmZmVyOwkvKiBQb2ludGVyIHRvIGZpcnN0IGJ1ZmZlciBkZXNjcmlwdG9yICovCit9OwogCi0vLwotLy8gIEFyY2ZvdXIgU3RydWN0dXJlIEFkZGVkIGJ5IFBhdWxXdQotLy8KLXR5cGVkZWYgc3RydWN0ICBfQVJDRk9VUgotewotCVVJTlQgICAgICAgICAgICBYOwotCVVJTlQgICAgICAgICAgICBZOwotCVVDSEFSICAgICAgICAgICBTVEFURVsyNTZdOwotfSBBUkNGT1VSQ09OVEVYVCwgKlBBUkNGT1VSQ09OVEVYVDsKKy8qICovCisvKiAgQXJjZm91ciBTdHJ1Y3R1cmUgQWRkZWQgYnkgUGF1bFd1ICovCisvKiAqLworc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0IHsKKwl1MzIgWDsKKwl1MzIgWTsKKwl1OCBTVEFURVsyNTZdOworfTsKIAotLy8gTUlNTyBUeCBwYXJhbWV0ZXIsIFNob3J0R0ksIE1DUywgU1RCQywgZXRjLiAgdGhlc2UgYXJlIGZpZWxkcyBpbiBUWFdJIHRvby4ganVzdCBjb3B5IHRvIFRYV0kuCi10eXBlZGVmIHN0cnVjdCAgX1JFQ0VJVkVfU0VUVElORyB7Ci0JVVNIT1JUICAgCU51bU9mUlg6MjsgICAgICAgICAgICAgICAgIC8vIE1JTU8uIFdFIEhBVkUgM1IKLQlVU0hPUlQJCU1vZGU6MjsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQlVU0hPUlQJCVNob3J0R0k6MTsKLQlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQotCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlPRkRNOjE7Ci0JVVNIT1JUCQlNSU1POjE7Ci0gfSBSRUNFSVZFX1NFVFRJTkcsICpQUkVDRUlWRV9TRVRUSU5HOworLyogKi8KKy8qIFRraXAgS2V5IHN0cnVjdHVyZSB3aGljaCBSQzQga2V5ICYgTUlDIGNhbGN1bGF0aW9uICovCisvKiAqLworc3RydWN0IHJ0X3RraXBfa2V5X2luZm8geworCXUzMiBuQnl0ZXNJbk07CQkvKiAjIGJ5dGVzIGluIE0gZm9yIE1JQ0tFWSAqLworCXVuc2lnbmVkIGxvbmcgSVYxNjsKKwl1bnNpZ25lZCBsb25nIElWMzI7CisJdW5zaWduZWQgbG9uZyBLMDsJCS8qIGZvciBNSUNLRVkgTG93ICovCisJdW5zaWduZWQgbG9uZyBLMTsJCS8qIGZvciBNSUNLRVkgSGlnICovCisJdW5zaWduZWQgbG9uZyBMOwkJLyogQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZICovCisJdW5zaWduZWQgbG9uZyBSOwkJLyogQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZICovCisJdW5zaWduZWQgbG9uZyBNOwkJLyogTWVzc2FnZSBhY2N1bXVsYXRvciBmb3IgTUlDS0VZICovCisJdTggUkM0S0VZWzE2XTsKKwl1OCBNSUNbOF07Cit9OwogCi0vLyBTaGFyZWQga2V5IGRhdGEgc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCAgX1dFUF9LRVkgewotCVVDSEFSICAgS2V5TGVuOyAgICAgICAgICAgICAgICAgICAgIC8vIEtleSBsZW5ndGggZm9yIGVhY2gga2V5LCAwOiBlbnRyeSBpcyBpbnZhbGlkCi0JVUNIQVIgICBLZXlbTUFYX0xFTl9PRl9LRVldOyAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAotfSBXRVBfS0VZLCAqUFdFUF9LRVk7CisvKiAqLworLyogUHJpdmF0ZSAvIE1pc2MgZGF0YSwgY291bnRlcnMgZm9yIGRyaXZlciBpbnRlcm5hbCB1c2UgKi8KKy8qICovCitzdHJ1Y3QgcnRfcHJpdmF0ZSB7CisJdTMyIFN5c3RlbVJlc2V0Q250OwkvKiBTeXN0ZW0gcmVzZXQgY291bnRlciAqLworCXUzMiBUeFJpbmdGdWxsQ250OwkvKiBUeCByaW5nIGZ1bGwgb2NjdXJyYW5jZSBudW1iZXIgKi8KKwl1MzIgUGh5UnhFcnJDbnQ7CS8qIFBIWSBSeCBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIgKi8KKwkvKiBWYXJpYWJsZXMgZm9yIFdFUCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiBpbiBydG1wX3dlcC5jICovCisJdTMyIEZDU0NSQzMyOworCXN0cnVjdCBydF9hcmNmb3VyY29udGV4dCBXRVBDT05URVhUOworCS8qIFRraXAgc3R1ZmYgKi8KKwlzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyBUeDsKKwlzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyBSeDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9DSVBIRVJfS0VZIHsKLQlVQ0hBUiAgIEtleVsxNl07ICAgICAgICAgICAgLy8gcmlnaHQgbm93IHdlIGltcGxlbWVudCA0IGtleXMsIDEyOCBiaXRzIG1heAotCVVDSEFSICAgUnhNaWNbOF07CQkJLy8gbWFrZSBhbGlnbm1lbnQKLQlVQ0hBUiAgIFR4TWljWzhdOwotCVVDSEFSICAgVHhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKLQlVQ0hBUiAgIFJ4VHNjWzZdOyAgICAgICAgICAgLy8gNDhiaXQgVFNDIHZhbHVlCi0JVUNIQVIgICBDaXBoZXJBbGc7ICAgICAgICAgIC8vIDAtbm9uZSwgMTpXRVA2NCwgMjpXRVAxMjgsIDM6VEtJUCwgNDpBRVMsIDU6Q0tJUDY0LCA2OkNLSVAxMjgKLQlVQ0hBUiAgIEtleUxlbjsKLQlVQ0hBUiAgIEJzc0lkWzZdOwotICAgICAgICAgICAgLy8gS2V5IGxlbmd0aCBmb3IgZWFjaCBrZXksIDA6IGVudHJ5IGlzIGludmFsaWQKLQlVQ0hBUiAgIFR5cGU7ICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgUGFpcndpc2UvR3JvdXAgd2hlbiByZXBvcnRpbmcgTUlDIGVycm9yCi19IENJUEhFUl9LRVksICpQQ0lQSEVSX0tFWTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglDaGFubmVsIGFuZCBCQlAgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjY2IChCQlAgVFVOSU5HKSAqLworc3RydWN0IHJ0X2JicF9yNjZfdHVuaW5nIHsKKwlCT09MRUFOIGJFbmFibGU7CisJdTE2IEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7CS8qIGRlZmF1bHQgMTAwICovCisJdTE2IEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7CS8qIGRlZmF1bHQgNTEyICovCisJdTggUjY2RGVsdGE7CisJdTggUjY2Q3VycmVudFZhbHVlOworCUJPT0xFQU4gUjY2TG93ZXJVcHBlclNlbGVjdDsJLypCZWZvcmUgTGlua1VwLCBVc2VkIExvd2VyQm91bmQgb3IgVXBwZXJCb3VuZCBhcyBSNjYgdmFsdWUuICovCit9OwogCi10eXBlZGVmIHN0cnVjdCBfQkJQX1RVTklOR19TVFJVQ1QgewotCUJPT0xFQU4gICAgIEVuYWJsZTsKLQlVQ0hBUiAgICAgICBGYWxzZUNjYUNvdW50VXBwZXJCb3VuZDsgIC8vIDEwMCBwZXIgc2VjCi0JVUNIQVIgICAgICAgRmFsc2VDY2FDb3VudExvd2VyQm91bmQ7ICAvLyAxMCBwZXIgc2VjCi0JVUNIQVIgICAgICAgUjE3TG93ZXJCb3VuZDsgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gRTJQUk9NCi0JVUNIQVIgICAgICAgUjE3VXBwZXJCb3VuZDsgICAgICAgICAgICAvLyAweDY4IGFjY29yZGluZyB0byBEYXZpZCBUdW5nCi0JVUNIQVIgICAgICAgQ3VycmVudFIxN1ZhbHVlOwotfSBCQlBfVFVOSU5HLCAqUEJCUF9UVU5JTkc7CisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgY2hhbm5lbCBUWCBwb3dlciAqLworc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIgeworCXUxNiBSZW1haW5pbmdUaW1lRm9yVXNlOwkvKnVuaXQ6IHNlYyAqLworCXU4IENoYW5uZWw7CisJY2hhciBQb3dlcjsKKwljaGFyIFBvd2VyMjsKKwl1OCBNYXhUeFB3cjsKKwl1OCBEZnNSZXE7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBfU09GVF9SWF9BTlRfRElWRVJTSVRZX1NUUlVDVCB7Ci0JVUNIQVIgICAgIEV2YWx1YXRlUGVyaW9kOwkJIC8vIDA6bm90IGV2YWx1dGUgc3RhdHVzLCAxOiBldmFsdWF0ZSBzdGF0dXMsIDI6IHN3aXRjaGluZyBzdGF0dXMKLSNpZmRlZiBSVDI4NzAKLQlVQ0hBUiAgICAgRXZhbHVhdGVTdGFibGVDbnQ7Ci0jZW5kaWYKLQlVQ0hBUiAgICAgUGFpcjFQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKLQlVQ0hBUiAgICAgUGFpcjFTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMSwgMTpBbnQtRTIKLQlVQ0hBUiAgICAgUGFpcjJQcmltYXJ5UnhBbnQ7ICAgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKLQlVQ0hBUiAgICAgUGFpcjJTZWNvbmRhcnlSeEFudDsgICAvLyAwOkFudC1FMywgMTpBbnQtRTQKLQlTSE9SVCAgICAgUGFpcjFBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUxLCBBdmdSc3NpWzFdOkUyCi0JU0hPUlQgICAgIFBhaXIyQXZnUnNzaVsyXTsgICAgICAgLy8gQXZnUnNzaVswXTpFMywgQXZnUnNzaVsxXTpFNAotCVNIT1JUICAgICBQYWlyMUxhc3RBdmdSc3NpOyAgICAgIC8vCi0JU0hPUlQgICAgIFBhaXIyTGFzdEF2Z1Jzc2k7ICAgICAgLy8KLQlVTE9ORyAgICAgUmN2UGt0TnVtV2hlbkV2YWx1YXRlOwotCUJPT0xFQU4gICBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBSeEFudERpdmVyc2l0eVRpbWVyOwotfSBTT0ZUX1JYX0FOVF9ESVZFUlNJVFksICpQU09GVF9SWF9BTlRfRElWRVJTSVRZOworLyogc3RydWN0dXJlIHRvIHN0b3JlIDgwMi4xMWogY2hhbm5lbCBUWCBwb3dlciAqLworc3RydWN0IHJ0X2NoYW5uZWxfMTFqX3R4X3Bvd2VyIHsKKwl1OCBDaGFubmVsOworCXU4IEJXOwkJLyogQldfMTAgb3IgQldfMjAgKi8KKwljaGFyIFBvd2VyOworCWNoYXIgUG93ZXIyOworCXUxNiBSZW1haW5pbmdUaW1lRm9yVXNlOwkvKnVuaXQ6IHNlYyAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0xFQVBfQVVUSF9JTkZPIHsKLQlCT09MRUFOICAgICAgICAgRW5hYmxlZDsgICAgICAgIC8vVHVyZTogRW5hYmxlIExFQVAgQXV0aGVudGljYXRpb24KLQlCT09MRUFOICAgICAgICAgQ0NLTTsgICAgICAgICAgIC8vVHVyZTogVXNlIEZhc3QgUmVhdXRoZW50aWNhdGlvbiB3aXRoIENDS00KLQlVQ0hBUiAgICAgICAgICAgUmVzZXJ2ZVsyXTsKLQlVQ0hBUiAgICAgICAgICAgVXNlck5hbWVbMjU2XTsgIC8vTEVBUCwgVXNlciBuYW1lCi0JVUxPTkcgICAgICAgICAgIFVzZXJOYW1lTGVuOwotCVVDSEFSICAgICAgICAgICBQYXNzd29yZFsyNTZdOyAgLy9MRUFQLCBVc2VyIFBhc3N3b3JkCi0JVUxPTkcgICAgICAgICAgIFBhc3N3b3JkTGVuOwotfSBMRUFQX0FVVEhfSU5GTywgKlBMRUFQX0FVVEhfSU5GTzsKK3N0cnVjdCBydF9zb2Z0X3J4X2FudF9kaXZlcnNpdHkgeworCXU4IEV2YWx1YXRlUGVyaW9kOwkvKiAwOm5vdCBldmFsdXRlIHN0YXR1cywgMTogZXZhbHVhdGUgc3RhdHVzLCAyOiBzd2l0Y2hpbmcgc3RhdHVzICovCisJdTggRXZhbHVhdGVTdGFibGVDbnQ7CisJdTggUGFpcjFQcmltYXJ5UnhBbnQ7CS8qIDA6QW50LUUxLCAxOkFudC1FMiAqLworCXU4IFBhaXIxU2Vjb25kYXJ5UnhBbnQ7CS8qIDA6QW50LUUxLCAxOkFudC1FMiAqLworCXU4IFBhaXIyUHJpbWFyeVJ4QW50OwkvKiAwOkFudC1FMywgMTpBbnQtRTQgKi8KKwl1OCBQYWlyMlNlY29uZGFyeVJ4QW50OwkvKiAwOkFudC1FMywgMTpBbnQtRTQgKi8KKwlzaG9ydCBQYWlyMUF2Z1Jzc2lbMl07CS8qIEF2Z1Jzc2lbMF06RTEsIEF2Z1Jzc2lbMV06RTIgKi8KKwlzaG9ydCBQYWlyMkF2Z1Jzc2lbMl07CS8qIEF2Z1Jzc2lbMF06RTMsIEF2Z1Jzc2lbMV06RTQgKi8KKwlzaG9ydCBQYWlyMUxhc3RBdmdSc3NpOwkvKiAqLworCXNob3J0IFBhaXIyTGFzdEF2Z1Jzc2k7CS8qICovCisJdW5zaWduZWQgbG9uZyBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU7CisJQk9PTEVBTiBGaXJzdFBrdEFycml2ZWRXaGVuRXZhbHVhdGU7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBSeEFudERpdmVyc2l0eVRpbWVyOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgIEVycm9yQ29kZVsyXTsgIC8vMDAgMDEtSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0eXBlCi0JCQkJCQkJCS8vMDAgMDItQXV0aGVudGljYXRpb24gdGltZW91dAotCQkJCQkJCQkvLzAwIDAzLUNoYWxsZW5nZSBmcm9tIEFQIGZhaWxlZAotCQkJCQkJCQkvLzAwIDA0LUNoYWxsZW5nZSB0byBBUCBmYWlsZWQKLQlCT09MRUFOICAgICAgUmVwb3J0ZWQ7Ci19IFJPR1VFQVBfRU5UUlksICpQUk9HVUVBUF9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCVVDSEFSICAgICAgICAgICAgICAgUm9ndWVBcE5yOwotCVJPR1VFQVBfRU5UUlkgICAgICAgUm9ndWVBcEVudHJ5W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKLX0gUk9HVUVBUF9UQUJMRSwgKlBST0dVRUFQX1RBQkxFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JQk9PTEVBTiAgICAgRW5hYmxlOwotCVVDSEFSICAgICAgIERlbHRhOwotCUJPT0xFQU4gICAgIFBsdXNTaWduOwotfSBDQ0tfVFhfUE9XRVJfQ0FMSUJSQVRFLCAqUENDS19UWF9QT1dFUl9DQUxJQlJBVEU7Ci0KLS8vCi0vLyBSZWNlaXZlIFR1cGxlIENhY2hlIEZvcm1hdAotLy8KLXR5cGVkZWYgc3RydWN0ICBfVFVQTEVfQ0FDSEUgICAgewotCUJPT0xFQU4gICAgICAgICBWYWxpZDsKLQlVQ0hBUiAgICAgICAgICAgTWFjQWRkcmVzc1tNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgICAgICBTZXF1ZW5jZTsKLQlVU0hPUlQgICAgICAgICAgRnJhZzsKLX0gVFVQTEVfQ0FDSEUsICpQVFVQTEVfQ0FDSEU7Ci0KLS8vCi0vLyBGcmFnbWVudCBGcmFtZSBzdHJ1Y3R1cmUKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0ZSQUdNRU5UX0ZSQU1FIHsKLQlQTkRJU19QQUNLRVQgICAgcEZyYWdQYWNrZXQ7Ci0JVUxPTkcgICAgICAgUnhTaXplOwotCVVTSE9SVCAgICAgIFNlcXVlbmNlOwotCVVTSE9SVCAgICAgIExhc3RGcmFnOwotCVVMT05HICAgICAgIEZsYWdzOyAgICAgICAgICAvLyBTb21lIGV4dHJhIGZyYW1lIGluZm9ybWF0aW9uLiBiaXQgMDogTExDIHByZXNlbnRlZAotfSBGUkFHTUVOVF9GUkFNRSwgKlBGUkFHTUVOVF9GUkFNRTsKLQotCi0vLwotLy8gUGFja2V0IGluZm9ybWF0aW9uIGZvciBOZGlzUXVlcnlQYWNrZXQKLS8vCi10eXBlZGVmIHN0cnVjdCAgX1BBQ0tFVF9JTkZPICAgIHsKLQlVSU5UICAgICAgICAgICAgUGh5c2ljYWxCdWZmZXJDb3VudDsgICAgLy8gUGh5c2ljYWwgYnJlYWtzIG9mIGJ1ZmZlciBkZXNjcmlwb3IgY2hhaW5lZAotCVVJTlQgICAgICAgICAgICBCdWZmZXJDb3VudCA7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgQnVmZmVyIGRlc2NyaXB0b3IgY2hhaW5lZAotCVVJTlQgICAgICAgICAgICBUb3RhbFBhY2tldExlbmd0aCA7ICAgICAvLyBTZWxmIGV4cGxhaW5lZAotCVBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXI7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGZpcnN0IGJ1ZmZlciBkZXNjcmlwdG9yCi19IFBBQ0tFVF9JTkZPLCAqUFBBQ0tFVF9JTkZPOwotCi0vLwotLy8gVGtpcCBLZXkgc3RydWN0dXJlIHdoaWNoIFJDNCBrZXkgJiBNSUMgY2FsY3VsYXRpb24KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1RLSVBfS0VZX0lORk8gIHsKLQlVSU5UICAgICAgICBuQnl0ZXNJbk07ICAvLyAjIGJ5dGVzIGluIE0gZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIElWMTY7Ci0JVUxPTkcgICAgICAgSVYzMjsKLQlVTE9ORyAgICAgICBLMDsgICAgICAgICAvLyBmb3IgTUlDS0VZIExvdwotCVVMT05HICAgICAgIEsxOyAgICAgICAgIC8vIGZvciBNSUNLRVkgSGlnCi0JVUxPTkcgICAgICAgTDsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCi0JVUxPTkcgICAgICAgUjsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCi0JVUxPTkcgICAgICAgTTsgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciBmb3IgTUlDS0VZCi0JVUNIQVIgICAgICAgUkM0S0VZWzE2XTsKLQlVQ0hBUiAgICAgICBNSUNbOF07Ci19IFRLSVBfS0VZX0lORk8sICpQVEtJUF9LRVlfSU5GTzsKLQotLy8KLS8vIFByaXZhdGUgLyBNaXNjIGRhdGEsIGNvdW50ZXJzIGZvciBkcml2ZXIgaW50ZXJuYWwgdXNlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9fUFJJVkFURV9TVFJVQyB7Ci0JVUlOVCAgICAgICBTeXN0ZW1SZXNldENudDsgICAgICAgICAvLyBTeXN0ZW0gcmVzZXQgY291bnRlcgotCVVJTlQgICAgICAgVHhSaW5nRnVsbENudDsgICAgICAgICAgLy8gVHggcmluZyBmdWxsIG9jY3VycmFuY2UgbnVtYmVyCi0JVUlOVCAgICAgICBQaHlSeEVyckNudDsgICAgICAgICAgICAvLyBQSFkgUnggZXJyb3IgY291bnQsIGZvciBkZWJ1ZyBwdXJwb3NlLCBtaWdodCBtb3ZlIHRvIGdsb2JhbCBjb3VudGVyCi0JLy8gVmFyaWFibGVzIGZvciBXRVAgZW5jcnlwdGlvbiAvIGRlY3J5cHRpb24gaW4gcnRtcF93ZXAuYwotCVVJTlQgICAgICAgRkNTQ1JDMzI7Ci0JQVJDRk9VUkNPTlRFWFQgIFdFUENPTlRFWFQ7Ci0JLy8gVGtpcCBzdHVmZgotCVRLSVBfS0VZX0lORk8gICBUeDsKLQlUS0lQX0tFWV9JTkZPICAgUng7Ci19IFBSSVZBVEVfU1RSVUMsICpQUFJJVkFURV9TVFJVQzsKLQotLy8gc3RydWN0dXJlIHRvIHR1bmUgQkJQIFI2NiAoQkJQIFRVTklORykKLXR5cGVkZWYgc3RydWN0IF9CQlBfUjY2X1RVTklORyB7Ci0JQk9PTEVBTiAgICAgYkVuYWJsZTsKLQlVU0hPUlQgICAgICBGYWxzZUNjYUxvd2VyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCAxMDAKLQlVU0hPUlQgICAgICBGYWxzZUNjYVVwcGVyVGhyZXNob2xkOyAgLy8gZGVmYXVsdCA1MTIKLQlVQ0hBUiAgICAgICBSNjZEZWx0YTsKLQlVQ0hBUiAgICAgICBSNjZDdXJyZW50VmFsdWU7Ci0JQk9PTEVBTgkJUjY2TG93ZXJVcHBlclNlbGVjdDsgLy9CZWZvcmUgTGlua1VwLCBVc2VkIExvd2VyQm91bmQgb3IgVXBwZXJCb3VuZCBhcyBSNjYgdmFsdWUuCi19IEJCUF9SNjZfVFVOSU5HLCAqUEJCUF9SNjZfVFVOSU5HOwotCi0vLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgY2hhbm5lbCBUWCBwb3dlcgotdHlwZWRlZiBzdHJ1Y3QgX0NIQU5ORUxfVFhfUE9XRVIgewotCVVTSE9SVCAgICAgUmVtYWluaW5nVGltZUZvclVzZTsJCS8vdW5pdDogc2VjCi0JVUNIQVIgICAgICBDaGFubmVsOwotCUNIQVIgICAgICAgUG93ZXI7Ci0JQ0hBUiAgICAgICBQb3dlcjI7Ci0JVUNIQVIgICAgICBNYXhUeFB3cjsKLQlVQ0hBUiAgICAgIERmc1JlcTsKLX0gQ0hBTk5FTF9UWF9QT1dFUiwgKlBDSEFOTkVMX1RYX1BPV0VSOwotCi0vLyBzdHJ1Y3R1cmUgdG8gc3RvcmUgODAyLjExaiBjaGFubmVsIFRYIHBvd2VyCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF8xMUpfVFhfUE9XRVIgewotCVVDSEFSICAgICAgQ2hhbm5lbDsKLQlVQ0hBUiAgICAgIEJXOwkvLyBCV18xMCBvciBCV18yMAotCUNIQVIgICAgICAgUG93ZXI7Ci0JQ0hBUiAgICAgICBQb3dlcjI7Ci0JVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKLX0gQ0hBTk5FTF8xMUpfVFhfUE9XRVIsICpQQ0hBTk5FTF8xMUpfVFhfUE9XRVI7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJc3RydWN0dXJlIGZvciByYWRhciBkZXRlY3Rpb24gYW5kIGNoYW5uZWwgc3dpdGNoCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X3JhZGFyX2RldGVjdCB7CisJLypCT09MRUFOICAgICAgICAgICBJRUVFODAyMTFIOyAgICAgICAgICAgICAgICAgICAgIC8vIDA6IGRpc2FibGUsIDE6IGVuYWJsZSBJRUVFODAyLjExaCAqLworCXU4IENTQ291bnQ7CQkvKkNoYW5uZWwgc3dpdGNoIGNvdW50ZXIgKi8KKwl1OCBDU1BlcmlvZDsJCS8qQ2hhbm5lbCBzd2l0Y2ggcGVyaW9kIChiZWFjb24gY291bnQpICovCisJdTggUkRDb3VudDsJCS8qUmFkYXIgZGV0ZWN0aW9uIGNvdW50ZXIgKi8KKwl1OCBSRE1vZGU7CQkvKlJhZGFyIERldGVjdGlvbiBtb2RlICovCisJdTggUkREdXJSZWdpb247CS8qUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbiAqLworCXU4IEJCUFIxNjsKKwl1OCBCQlBSMTc7CisJdTggQkJQUjE4OworCXU4IEJCUFIyMTsKKwl1OCBCQlBSMjI7CisJdTggQkJQUjY0OworCXVuc2lnbmVkIGxvbmcgSW5TZXJ2aWNlTW9uaXRvckNvdW50OwkvKiB1bml0OiBzZWMgKi8KKwl1OCBEZnNTZXNzaW9uVGltZTsKKwlCT09MRUFOIGJGYXN0RGZzOworCXU4IENoTW92aW5nVGltZTsKKwl1OCBMb25nUHVsc2VSYWRhclRoOworfTsKIAogdHlwZWRlZiBlbnVtIF9BQkdCQU5EX1NUQVRFXyB7CiAJVU5LTk9XTl9CQU5ELApAQCAtMTQzOSwyMzQgKzg2MSwyOTEgQEAKIAlBX0JBTkQsCiB9IEFCR0JBTkRfU1RBVEU7CiAKLXR5cGVkZWYgc3RydWN0IF9NTE1FX1NUUlVDVCB7Ci0JLy8gU1RBIHN0YXRlIG1hY2hpbmVzCi0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQ250bE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQXNzb2NNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhSc3BNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFN5bmNNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYVBza01hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgTGVhcE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQWlyb25ldE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXNzb2NGdW5jW0FTU09DX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aEZ1bmNbQVVUSF9GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhSc3BGdW5jW0FVVEhfUlNQX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgU3luY0Z1bmNbU1lOQ19GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIFdwYVBza0Z1bmNbV1BBX1BTS19GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFpcm9uZXRGdW5jW0FJUk9ORVRfRlVOQ19TSVpFXTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBBY3RGdW5jW0FDVF9GVU5DX1NJWkVdOwotCS8vIEFjdGlvbgotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEFjdE1hY2hpbmU7CisjaWZkZWYgUlRNUF9NQUNfUENJCisvKiBQb3dlciBzYXZlIG1ldGhvZCBjb250cm9sICovCit0eXBlZGVmIHVuaW9uIF9QU19DT05UUk9MIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIEVuYWJsZVBTaW5JZGxlOjE7CS8qIEVuYWJsZSByYWRpbyBvZmYgd2hlbiBub3QgY29ubmVjdCB0byBBUC4gcmFkaW8gb24gb25seSB3aGVuIHNpdGVzdXJ2ZXksICovCisJCXVuc2lnbmVkIGxvbmcgRW5hYmxlTmV3UFM6MTsJLyogRW5hYmxlIG5ldyAgQ2hpcCBwb3dlciBzYXZlIGZ1Y250aW9uIC4gTmV3IG1ldGhvZCBjYW4gb25seSBiZSBhcHBsaWVkIGluIGNoaXAgdmVyc2lvbiBhZnRlciAyODcyLiBhbmQgUENJZS4gKi8KKwkJdW5zaWduZWQgbG9uZyBydDMweHhQb3dlck1vZGU6MjsJLyogUG93ZXIgTGV2ZWwgTW9kZSBmb3IgcnQzMHh4IGNoaXAgKi8KKwkJdW5zaWduZWQgbG9uZyBydDMweHhGb2xsb3dIb3N0QVNQTToxOwkvKiBDYXJkIEZvbGxvd3MgSG9zdCdzIHNldHRpbmcgZm9yIHJ0MzB4eCBjaGlwLiAqLworCQl1bnNpZ25lZCBsb25nIHJ0MzB4eEZvcmNlQVNQTVRlc3Q6MTsJLyogRm9yY2UgZW5hYmxlIEwxIGZvciBydDMweHggY2hpcC4gVGhpcyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gcnQzMHh4Rm9sbG93SG9zdEFTUE0gTW9kZS4gKi8KKwkJdW5zaWduZWQgbG9uZyByc3Y6MjY7CS8qIFJhZGlvIE1lYXN1cmVtZW50IEVuYWJsZSAqLworCX0gZmllbGQ7CisJdW5zaWduZWQgbG9uZyB3b3JkOworfSBQU19DT05UUk9MLCAqUFBTX0NPTlRST0w7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBOb3czMjsgICAgICAgICAgIC8vIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0U2VuZE5VTExwc21UaW1lOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCXN0cnVjdHVyZSBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJ0X21sbWUgeworCS8qIFNUQSBzdGF0ZSBtYWNoaW5lcyAqLworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIENudGxNYWNoaW5lOworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIEFzc29jTWFjaGluZTsKKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBBdXRoTWFjaGluZTsKKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBBdXRoUnNwTWFjaGluZTsKKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBTeW5jTWFjaGluZTsKKwlzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSBXcGFQc2tNYWNoaW5lOworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIExlYXBNYWNoaW5lOworCVNUQVRFX01BQ0hJTkVfRlVOQyBBc3NvY0Z1bmNbQVNTT0NfRlVOQ19TSVpFXTsKKwlTVEFURV9NQUNISU5FX0ZVTkMgQXV0aEZ1bmNbQVVUSF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyBBdXRoUnNwRnVuY1tBVVRIX1JTUF9GVU5DX1NJWkVdOworCVNUQVRFX01BQ0hJTkVfRlVOQyBTeW5jRnVuY1tTWU5DX0ZVTkNfU0laRV07CisJU1RBVEVfTUFDSElORV9GVU5DIEFjdEZ1bmNbQUNUX0ZVTkNfU0laRV07CisJLyogQWN0aW9uICovCisJc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgQWN0TWFjaGluZTsKIAotCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJSdW5uaW5nOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFRhc2tMb2NrOwotCU1MTUVfUVVFVUUgICAgICAgICAgICAgIFF1ZXVlOworCS8qIGNvbW1vbiBXUEEgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lIFdwYU1hY2hpbmU7CisJU1RBVEVfTUFDSElORV9GVU5DIFdwYUZ1bmNbV1BBX0ZVTkNfU0laRV07CiAKLQlVSU5UICAgICAgICAgICAgICAgICAgICBTaGlmdFJlZzsKKwl1bnNpZ25lZCBsb25nIENoYW5uZWxRdWFsaXR5OwkvKiAwLi4xMDAsIENoYW5uZWwgUXVhbGl0eSBJbmRpY2F0aW9uIGZvciBSb2FtaW5nICovCisJdW5zaWduZWQgbG9uZyBOb3czMjsJCS8qIGxhdGNoIHRoZSB2YWx1ZSBvZiBOZGlzR2V0U3lzdGVtVXBUaW1lKCkgKi8KKwl1bnNpZ25lZCBsb25nIExhc3RTZW5kTlVMTHBzbVRpbWU7CiAKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBQZXJpb2RpY1RpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIEFQU0RQZXJpb2RpY1RpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtEb3duVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgTGlua1VwVGltZXI7Ci0jaWZkZWYgUlQyODYwCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgYlBzUG9sbFRpbWVyUnVubmluZzsKLSAgICBSQUxJTktfVElNRVJfU1RSVUNUICAgICBQc1BvbGxUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBSYWRpb09uT2ZmVGltZXI7Ci0jZW5kaWYKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JvdW5kOwotCVVMT05HICAgICAgICAgICAgICAgICAgIE9uZVNlY1BlcmlvZGljUm91bmQ7CisJQk9PTEVBTiBiUnVubmluZzsKKwlzcGlubG9ja190IFRhc2tMb2NrOworCXN0cnVjdCBydF9tbG1lX3F1ZXVlIFF1ZXVlOwogCi0JVUNIQVIJCQkJCVJlYWxSeFBhdGg7Ci0JQk9PTEVBTgkJCQkJYkxvd1Rocm91Z2hwdXQ7Ci0JQk9PTEVBTgkJCQkJYkVuYWJsZUF1dG9BbnRlbm5hQ2hlY2s7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVAkJUnhBbnRFdmFsVGltZXI7CisJdTMyIFNoaWZ0UmVnOwogCi0jaWZkZWYgUlQyODcwCi0JVUNIQVIgQ2FsaUJXNDBSZlIyNDsKLQlVQ0hBUiBDYWxpQlcyMFJmUjI0OwotI2VuZGlmIC8vIFJUMjg3MCAvLwotfSBNTE1FX1NUUlVDVCwgKlBNTE1FX1NUUlVDVDsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFBlcmlvZGljVGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBBUFNEUGVyaW9kaWNUaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIExpbmtEb3duVGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBMaW5rVXBUaW1lcjsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwl1OCBiUHNQb2xsVGltZXJSdW5uaW5nOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUHNQb2xsVGltZXI7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciBSYWRpb09uT2ZmVGltZXI7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCisJdW5zaWduZWQgbG9uZyBQZXJpb2RpY1JvdW5kOworCXVuc2lnbmVkIGxvbmcgT25lU2VjUGVyaW9kaWNSb3VuZDsKIAotLy8gc3RydWN0dXJlIGZvciByYWRhciBkZXRlY3Rpb24gYW5kIGNoYW5uZWwgc3dpdGNoCi10eXBlZGVmIHN0cnVjdCBfUkFEQVJfREVURUNUX1NUUlVDVCB7Ci0JVUNIQVIJCUNTQ291bnQ7CQkJLy9DaGFubmVsIHN3aXRjaCBjb3VudGVyCi0JVUNIQVIJCUNTUGVyaW9kOwkJCS8vQ2hhbm5lbCBzd2l0Y2ggcGVyaW9kIChiZWFjb24gY291bnQpCi0JVUNIQVIJCVJEQ291bnQ7CQkJLy9SYWRhciBkZXRlY3Rpb24gY291bnRlcgotCVVDSEFSCQlSRE1vZGU7CQkJCS8vUmFkYXIgRGV0ZWN0aW9uIG1vZGUKLQlVQ0hBUgkJUkREdXJSZWdpb247CQkvL1JhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KLQlVQ0hBUgkJQkJQUjE2OwotCVVDSEFSCQlCQlBSMTc7Ci0JVUNIQVIJCUJCUFIxODsKLQlVQ0hBUgkJQkJQUjIxOwotCVVDSEFSCQlCQlBSMjI7Ci0JVUNIQVIJCUJCUFI2NDsKLQlVTE9ORwkJSW5TZXJ2aWNlTW9uaXRvckNvdW50OyAvLyB1bml0OiBzZWMKLQlVSU5UOAkJRGZzU2Vzc2lvblRpbWU7Ci0JQk9PTEVBTgkJYkZhc3REZnM7Ci0JVUlOVDgJCUNoTW92aW5nVGltZTsKLQlVSU5UOAkJTG9uZ1B1bHNlUmFkYXJUaDsKLX0gUkFEQVJfREVURUNUX1NUUlVDVCwgKlBSQURBUl9ERVRFQ1RfU1RSVUNUOworCXU4IFJlYWxSeFBhdGg7CisJQk9PTEVBTiBiTG93VGhyb3VnaHB1dDsKKwlCT09MRUFOIGJFbmFibGVBdXRvQW50ZW5uYUNoZWNrOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUnhBbnRFdmFsVGltZXI7CiAKLXR5cGVkZWYgZW51bSBfUkVDX0JMT0NLQUNLX1NUQVRVUwotewotICAgIFJlY2lwaWVudF9OT05FPTAsCisjaWZkZWYgUlQzMHh4CisJdTggQ2FsaUJXNDBSZlIyNDsKKwl1OCBDYWxpQlcyMFJmUjI0OworI2VuZGlmCQkJCS8qIFJUMzB4eCAvLyAqLworCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJc3RydWN0IHJ0X3JhbGlua190aW1lciBBdXRvV2FrZXVwVGltZXI7CisJQk9PTEVBTiBBdXRvV2FrZXVwVGltZXJSdW5uaW5nOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCTgwMi4xMSBOIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJlb3JkZXJpbmdfbXBkdSB7CisJc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKKwl2b2lkICpwUGFja2V0OwkvKiBjb3ZlcnRlZCB0byA4MDIuMyBmcmFtZSAqLworCWludCBTZXF1ZW5jZTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBNUERVICovCisJQk9PTEVBTiBiQU1TRFU7Cit9OworCitzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IHsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpuZXh0OworCWludCBxbGVuOworfTsKKworc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sIHsKKwl2b2lkICptZW07CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QgZnJlZWxpc3Q7Cit9OworCit0eXBlZGVmIGVudW0gX1JFQ19CTE9DS0FDS19TVEFUVVMgeworCVJlY2lwaWVudF9OT05FID0gMCwKIAlSZWNpcGllbnRfVVNFRCwKIAlSZWNpcGllbnRfSGFuZGxlUmVzLAotICAgIFJlY2lwaWVudF9BY2NlcHQKKwlSZWNpcGllbnRfQWNjZXB0CiB9IFJFQ19CTE9DS0FDS19TVEFUVVMsICpQUkVDX0JMT0NLQUNLX1NUQVRVUzsKIAotdHlwZWRlZiBlbnVtIF9PUklfQkxPQ0tBQ0tfU1RBVFVTCi17Ci0gICAgT3JpZ2luYXRvcl9OT05FPTAsCit0eXBlZGVmIGVudW0gX09SSV9CTE9DS0FDS19TVEFUVVMgeworCU9yaWdpbmF0b3JfTk9ORSA9IDAsCiAJT3JpZ2luYXRvcl9VU0VELAotICAgIE9yaWdpbmF0b3JfV2FpdFJlcywKLSAgICBPcmlnaW5hdG9yX0RvbmUKKwlPcmlnaW5hdG9yX1dhaXRSZXMsCisJT3JpZ2luYXRvcl9Eb25lCiB9IE9SSV9CTE9DS0FDS19TVEFUVVMsICpQT1JJX0JMT0NLQUNLX1NUQVRVUzsKIAotdHlwZWRlZiBzdHJ1Y3QgX0JBX09SSV9FTlRSWXsKLQlVQ0hBUiAgIFdjaWQ7Ci0JVUNIQVIgICBUSUQ7Ci0JVUNIQVIgICBCQVdpblNpemU7Ci0JVUNIQVIgICBUb2tlbjsKLS8vIFNlcXVlbmNlIGlzIHRvIGZpbGwgZXZlcnkgb3V0Z29pbmcgUW9TIERBVEEgZnJhbWUncyBzZXF1ZW5jZSBmaWVsZCBpbiA4MDIuMTEgaGVhZGVyLgotCVVTSE9SVAlTZXF1ZW5jZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXM7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCBPUklCQVRpbWVyOwotCVBWT0lECXBBZGFwdGVyOwotfSBCQV9PUklfRU5UUlksICpQQkFfT1JJX0VOVFJZOworc3RydWN0IHJ0X2JhX29yaV9lbnRyeSB7CisJdTggV2NpZDsKKwl1OCBUSUQ7CisJdTggQkFXaW5TaXplOworCXU4IFRva2VuOworLyogU2VxdWVuY2UgaXMgdG8gZmlsbCBldmVyeSBvdXRnb2luZyBRb1MgREFUQSBmcmFtZSdzIHNlcXVlbmNlIGZpZWxkIGluIDgwMi4xMSBoZWFkZXIuICovCisJdTE2IFNlcXVlbmNlOworCXUxNiBUaW1lT3V0VmFsdWU7CisJT1JJX0JMT0NLQUNLX1NUQVRVUyBPUklfQkFfU3RhdHVzOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgT1JJQkFUaW1lcjsKKwl2b2lkICpwQWRhcHRlcjsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9CQV9SRUNfRU5UUlkgewotCVVDSEFSICAgV2NpZDsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUiAgIEJBV2luU2l6ZTsJLy8gNy4zLjEuMTQuIGVhY2ggYnVmZmVyIGlzIGNhcGFibGUgb2YgaG9sZGluZyBhIG1heCBBTVNEVSBvciBNU0RVLgotCVVTSE9SVAkJTGFzdEluZFNlcTsKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKLQlSQUxJTktfVElNRVJfU1RSVUNUIFJFQ0JBVGltZXI7Ci0JVUxPTkcJCUxhc3RJbmRTZXFBdFRpbWVyOwotCVVMT05HCQluRHJvcFBhY2tldDsKLQlVTE9ORwkJcmN2U2VxOwotCVJFQ19CTE9DS0FDS19TVEFUVVMgIFJFQ19CQV9TdGF0dXM7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSZVJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jawotCVBWT0lECXBBZGFwdGVyOwotCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QJbGlzdDsKLX0gQkFfUkVDX0VOVFJZLCAqUEJBX1JFQ19FTlRSWTsKK3N0cnVjdCBydF9iYV9yZWNfZW50cnkgeworCXU4IFdjaWQ7CisJdTggVElEOworCXU4IEJBV2luU2l6ZTsJLyogNy4zLjEuMTQuIGVhY2ggYnVmZmVyIGlzIGNhcGFibGUgb2YgaG9sZGluZyBhIG1heCBBTVNEVSBvciBNU0RVLiAqLworCS8qdTggTnVtT2ZSeFBrdDsgKi8KKwkvKnU4ICAgIEN1cmluZGlkeDsgLy8gdGhlIGhlYWQgaW4gdGhlIFJYIHJlb3JkZXJpbmcgYnVmZmVyICovCisJdTE2IExhc3RJbmRTZXE7CisvKiAgICAgIHUxNiAgICAgICAgICBMYXN0SW5kU2VxQXRUaW1lcjsgKi8KKwl1MTYgVGltZU91dFZhbHVlOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUkVDQkFUaW1lcjsKKwl1bnNpZ25lZCBsb25nIExhc3RJbmRTZXFBdFRpbWVyOworCXVuc2lnbmVkIGxvbmcgbkRyb3BQYWNrZXQ7CisJdW5zaWduZWQgbG9uZyByY3ZTZXE7CisJUkVDX0JMT0NLQUNLX1NUQVRVUyBSRUNfQkFfU3RhdHVzOworLyogICAgICB1OCAgIFJ4QnVmSWR4VXNlZDsgKi8KKwkvKiBjb3JyZXNwb25kaW5nIHZpcnR1YWwgYWRkcmVzcyBmb3IgUlggcmVvcmRlcmluZyBwYWNrZXQgc3RvcmFnZS4gKi8KKwkvKlJUTVBfUkVPUkRFUkRNQUJVRiBNQVBfUlhCdWZbTUFYX1JYX1JFT1JERVJCVUZdOyAqLworCXNwaW5sb2NrX3QgUnhSZVJpbmdMb2NrOwkvKiBSeCBSaW5nIHNwaW5sb2NrICovCisvKiAgICAgIHN0cnVjdCBfQkFfUkVDX0VOVFJZICpwTmV4dDsgKi8KKwl2b2lkICpwQWRhcHRlcjsKKwlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0IGxpc3Q7Cit9OwogCitzdHJ1Y3QgcnRfYmFfdGFibGUgeworCXVuc2lnbmVkIGxvbmcgbnVtQXNSZWNpcGllbnQ7CS8qIEkgYW0gcmVjaXBpZW50IG9mIG51bUFzUmVjaXBpZW50IGNsaWVudHMuIFRoZXNlIGNsaWVudCBhcmUgaW4gdGhlIEJBUmVjRW50cnlbXSAqLworCXVuc2lnbmVkIGxvbmcgbnVtQXNPcmlnaW5hdG9yOwkvKiBJIGFtIG9yaWdpbmF0b3Igb2YgICBudW1Bc09yaWdpbmF0b3IgY2xpZW50cy4gVGhlc2UgY2xpZW50cyBhcmUgaW4gdGhlIEJBT3JpRW50cnlbXSAqLworCXVuc2lnbmVkIGxvbmcgbnVtRG9uZU9yaWdpbmF0b3I7CS8qIGNvdW50IERvbmUgT3JpZ2luYXRvciBzZXNzaW9ucyAqLworCXN0cnVjdCBydF9iYV9vcmlfZW50cnkgQkFPcmlFbnRyeVtNQVhfTEVOX09GX0JBX09SSV9UQUJMRV07CisJc3RydWN0IHJ0X2JhX3JlY19lbnRyeSBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlVTE9ORwkJbnVtQXNSZWNpcGllbnQ7CQkvLyBJIGFtIHJlY2lwaWVudCBvZiBudW1Bc1JlY2lwaWVudCBjbGllbnRzLiBUaGVzZSBjbGllbnQgYXJlIGluIHRoZSBCQVJlY0VudHJ5W10KLQlVTE9ORwkJbnVtQXNPcmlnaW5hdG9yOwkvLyBJIGFtIG9yaWdpbmF0b3Igb2YgCW51bUFzT3JpZ2luYXRvciBjbGllbnRzLiBUaGVzZSBjbGllbnRzIGFyZSBpbiB0aGUgQkFPcmlFbnRyeVtdCi0JQkFfT1JJX0VOVFJZICAgICAgIEJBT3JpRW50cnlbTUFYX0xFTl9PRl9CQV9PUklfVEFCTEVdOwotCUJBX1JFQ19FTlRSWSAgICAgICBCQVJlY0VudHJ5W01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsKLX0gQkFfVEFCTEUsICpQQkFfVEFCTEU7CisvKkZvciBRdXJleUJBVGFibGVPSUQgdXNlOyAqLworc3RydWN0IFBBQ0tFRCBydF9vaWRfYmFfcmVjX2VudHJ5IHsKKwl1OCBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJdTggQmFCaXRtYXA7CQkvKiBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSAqLworCXU4IHJzdjsKKwl1OCBCdWZTaXplWzhdOworCVJFQ19CTE9DS0FDS19TVEFUVVMgUkVDX0JBX1N0YXR1c1s4XTsKK307CiAKLS8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Ci10eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfUkVDX0VOVFJZewotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgQmFCaXRtYXA7ICAgLy8gaWYgKEJhQml0bWFwJigxPDxUSUQpKSwgdGhpcyBzZXNzaW9uIHdpdGh7TUFDQWRkciwgVElEfWV4aXN0cywgc28gcmVhZCBCdWZTaXplW1RJRF0gZm9yIEJ1ZmZlclNpemUKLQlVQ0hBUiAgIHJzdjsKLQlVQ0hBUiAgIEJ1ZlNpemVbOF07Ci0JUkVDX0JMT0NLQUNLX1NUQVRVUwlSRUNfQkFfU3RhdHVzWzhdOwotfSBPSURfQkFfUkVDX0VOVFJZLCAqUE9JRF9CQV9SRUNfRU5UUlk7CisvKkZvciBRdXJleUJBVGFibGVPSUQgdXNlOyAqLworc3RydWN0IFBBQ0tFRCBydF9vaWRfYmFfb3JpX2VudHJ5IHsKKwl1OCBNQUNBZGRyW01BQ19BRERSX0xFTl07CisJdTggQmFCaXRtYXA7CQkvKiBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cyAqLworCXU4IHJzdjsKKwl1OCBCdWZTaXplWzhdOworCU9SSV9CTE9DS0FDS19TVEFUVVMgT1JJX0JBX1N0YXR1c1s4XTsKK307CiAKLS8vRm9yIFF1cmV5QkFUYWJsZU9JRCB1c2U7Ci10eXBlZGVmIHN0cnVjdCAgUEFDS0VEIF9PSURfQkFfT1JJX0VOVFJZewotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgQmFCaXRtYXA7ICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZSwgcmVhZCBPUklfQkFfU3RhdHVzW1RJRF0gZm9yIHN0YXR1cwotCVVDSEFSICAgcnN2OwotCVVDSEFSICAgQnVmU2l6ZVs4XTsKLQlPUklfQkxPQ0tBQ0tfU1RBVFVTICBPUklfQkFfU3RhdHVzWzhdOwotfSBPSURfQkFfT1JJX0VOVFJZLCAqUE9JRF9CQV9PUklfRU5UUlk7CitzdHJ1Y3QgcnRfcXVlcnliYV90YWJsZSB7CisJc3RydWN0IHJ0X29pZF9iYV9vcmlfZW50cnkgQkFPcmlFbnRyeVszMl07CisJc3RydWN0IHJ0X29pZF9iYV9yZWNfZW50cnkgQkFSZWNFbnRyeVszMl07CisJdTggT3JpTnVtOwkJLyogTnVtYmVyIG9mIGJlbG93IEJBT3JpRW50cnkgKi8KKwl1OCBSZWNOdW07CQkvKiBOdW1iZXIgb2YgYmVsb3cgQkFSZWNFbnRyeSAqLworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1FVRVJZQkFfVEFCTEV7Ci0JT0lEX0JBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5WzMyXTsKLQlPSURfQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbMzJdOwotCVVDSEFSICAgT3JpTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQU9yaUVudHJ5Ci0JVUNIQVIgICBSZWNOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBUmVjRW50cnkKLX0gUVVFUllCQV9UQUJMRSwgKlBRVUVSWUJBX1RBQkxFOwotCi10eXBlZGVmCXVuaW9uCV9CQUNBUF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSeEJBV2luTGltaXQ6ODsKLQkJVUlOVDMyCQlUeEJBV2luTGltaXQ6ODsKLQkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQotCQlVSU5UMzIJCVBvbGljeToyOwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlCi0JCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKLQkJVUlOVDMyICAgICAgIAlBbXNkdUVuYWJsZToxOwkvL0VuYWJsZSBBTVNEVSB0cmFuc21pc3N0aW9uCi0JCVVJTlQzMiAgICAgICAJQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07Ci0JCVVJTlQzMiAgICAgICAJTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCi0JCVVJTlQzMiAgICAgICAJYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCi0JCVVJTlQzMiAgICAgICAJYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCi0JCVVJTlQzMiAgICAgICAJOjQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwordHlwZWRlZiB1bmlvbiBfQkFDQVBfU1RSVUMgeworCXN0cnVjdCB7CisJCXUzMiBSeEJBV2luTGltaXQ6ODsKKwkJdTMyIFR4QkFXaW5MaW1pdDo4OworCQl1MzIgQXV0b0JBOjE7CS8qIGF1dG9tYXRpY2FsbHkgQkEgKi8KKwkJdTMyIFBvbGljeToyOwkvKiAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlICovCisJCXUzMiBNcGR1RGVuc2l0eTozOworCQl1MzIgQW1zZHVFbmFibGU6MTsJLypFbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbiAqLworCQl1MzIgQW1zZHVTaXplOjE7CS8qIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiB1MzIgIE1TRFVTaXplVG9CeXRlc1tdICAgICAgICA9IHsgMzgzOSwgNzkzNX07ICovCisJCXUzMiBNTVBTbW9kZToyOwkvKiBNSU1PIHBvd2VyIHNhdmUgbW9yZSwgMDpzdGF0aWMsIDE6ZHluYW1pYywgMjpyc3YsIDM6bWltbyBlbmFibGUgKi8KKwkJdTMyIGJIdEFkaG9jOjE7CS8qIGFkaG9jIGNhbiB1c2UgaHQgcmF0ZS4gKi8KKwkJdTMyIGIyMDQwQ29leGlzdFNjYW5TdXA6MTsJLypBcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouICovCisJCXUzMiA6IDQ7CisJfSBmaWVsZDsKKwl1MzIgd29yZDsKIH0gQkFDQVBfU1RSVUMsICpQQkFDQVBfU1RSVUM7CiAKLS8vVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGFsbCA4MDIuMTFuIGNhcmQgSW50ZXJPcHRpYmlsaXR5VGVzdCBhY3Rpb24uIFJlc2V0IGFsbCBOdW0gZXZlcnkgbiBzZWNvbmQuICAoRGV0YWlscyBzZWUgTUxNRVBlcmlvZGljKQotdHlwZWRlZglzdHJ1Y3QJX0lPVF9TVFJVQwl7Ci0JVUNIQVIJCQlUaHJlc2hvbGRbMl07Ci0JVUNIQVIJCQlSZW9yZGVyVGltZU91dE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMF0KLQlVQ0hBUgkJCVJlZnJlc2hOdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzFdCi0JVUxPTkcJCQlPbmVTZWNJbldpbmRvd0NvdW50OwotCVVMT05HCQkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKLQlVTE9ORwkJCU9uZVNlY091dFdpbmRvd0NvdW50OwotCVVDSEFSCQkJRGVsT3JpQWN0OwotCVVDSEFSCQkJRGVsUmVjQWN0OwotCVVDSEFSCQkJUlRTU2hvcnRQcm90OwotCVVDSEFSCQkJUlRTTG9uZ1Byb3Q7Ci0JQk9PTEVBTgkJCWJSVFNMb25nUHJvdE9uOwotCUJPT0xFQU4JCQliTGFzdEF0aGVyb3M7Ci0gICAgQk9PTEVBTgkJCWJDdXJyZW50QXRoZXJvczsKLSAgICBCT09MRUFOICAgICAgICAgYk5vd0F0aGVyb3NCdXJzdE9uOwotCUJPT0xFQU4JCQliTmV4dERpc2FibGVSeEJBOwotICAgIEJPT0xFQU4JCQliVG9nZ2xlOwotfSBJT1RfU1RSVUMsICpQSU9UX1NUUlVDOworc3RydWN0IHJ0X29pZF9hZGRfYmFfZW50cnkgeworCUJPT0xFQU4gSXNSZWNpcGllbnQ7CisJdTggTUFDQWRkcltNQUNfQUREUl9MRU5dOworCXU4IFRJRDsKKwl1OCBuTVNEVTsKKwl1MTYgVGltZU91dDsKKwlCT09MRUFOIGJBbGxUaWQ7CS8qIElmIFRydWUsIGRlbGV0ZSBhbGwgVElEIGZvciBCQSBzZXNzaW9ucyB3aXRoIHRoaXMgTUFDYWRkci4gKi8KK307CiAKLS8vIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IHNldHRpbmcgZm9yIDgwMi4xMW4gdHJhbnNtaXQgc2V0dGluZy4gIFVzZWQgaW4gYWR2YW5jZWQgcGFnZS4KKyNkZWZpbmUgSVNfSFRfU1RBKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworI2RlZmluZSBJU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKKwkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKKworI2RlZmluZSBQRUVSX0lTX0hUX1JBVEUoX3BNYWNFbnRyeSkJXAorCShfcE1hY0VudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQorCisvKlRoaXMgc3RydWN0dXJlIGlzIGZvciBhbGwgODAyLjExbiBjYXJkIEludGVyT3B0aWJpbGl0eVRlc3QgYWN0aW9uLiBSZXNldCBhbGwgTnVtIGV2ZXJ5IG4gc2Vjb25kLiAgKERldGFpbHMgc2VlIE1MTUVQZXJpb2RpYykgKi8KK3N0cnVjdCBydF9pb3QgeworCXU4IFRocmVzaG9sZFsyXTsKKwl1OCBSZW9yZGVyVGltZU91dE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8qIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMF0gKi8KKwl1OCBSZWZyZXNoTnVtW01BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFXTsJLyogY29tcGFyZSB3aXRoIHRocmVzaG9sZFsxXSAqLworCXVuc2lnbmVkIGxvbmcgT25lU2VjSW5XaW5kb3dDb3VudDsKKwl1bnNpZ25lZCBsb25nIE9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7CisJdW5zaWduZWQgbG9uZyBPbmVTZWNPdXRXaW5kb3dDb3VudDsKKwl1OCBEZWxPcmlBY3Q7CisJdTggRGVsUmVjQWN0OworCXU4IFJUU1Nob3J0UHJvdDsKKwl1OCBSVFNMb25nUHJvdDsKKwlCT09MRUFOIGJSVFNMb25nUHJvdE9uOworCUJPT0xFQU4gYkxhc3RBdGhlcm9zOworCUJPT0xFQU4gYkN1cnJlbnRBdGhlcm9zOworCUJPT0xFQU4gYk5vd0F0aGVyb3NCdXJzdE9uOworCUJPT0xFQU4gYk5leHREaXNhYmxlUnhCQTsKKwlCT09MRUFOIGJUb2dnbGU7Cit9OworCisvKiBUaGlzIGlzIHRoZSByZWdpc3RyeSBzZXR0aW5nIGZvciA4MDIuMTFuIHRyYW5zbWl0IHNldHRpbmcuICBVc2VkIGluIGFkdmFuY2VkIHBhZ2UuICovCiB0eXBlZGVmIHVuaW9uIF9SRUdfVFJBTlNNSVRfU0VUVElORyB7Ci0gc3RydWN0IHsKLQkJIFVJTlQzMiAgcnN2MDoxMDsKLQkJIFVJTlQzMiAgVHhCRjoxOwotICAgICAgICAgVUlOVDMyICBCVzoxOyAvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotICAgICAgICAgVUlOVDMyICBTaG9ydEdJOjE7Ci0gICAgICAgICBVSU5UMzIgIFNUQkM6MTsgLy9TUEFDRQotICAgICAgICAgVUlOVDMyICBUUkFOU05POjI7Ci0gICAgICAgICBVSU5UMzIgIEhUTU9ERToxOwotICAgICAgICAgVUlOVDMyICBFWFRDSEE6MjsKLSAgICAgICAgIFVJTlQzMiAgcnN2OjEzOwotICAgIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKKwlzdHJ1Y3QgeworCQkvKnUzMiAgUGh5TW9kZTo0OyAqLworCQkvKnUzMiAgTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MgKi8KKwkJdTMyIHJzdjA6MTA7CisJCXUzMiBUeEJGOjE7CisJCXUzMiBCVzoxOwkvKmNoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IeiAqLworCQl1MzIgU2hvcnRHSToxOworCQl1MzIgU1RCQzoxOwkvKlNQQUNFICovCisJCXUzMiBUUkFOU05POjI7CisJCXUzMiBIVE1PREU6MTsKKwkJdTMyIEVYVENIQToyOworCQl1MzIgcnN2OjEzOworCX0gZmllbGQ7CisJdTMyIHdvcmQ7CiB9IFJFR19UUkFOU01JVF9TRVRUSU5HLCAqUFJFR19UUkFOU01JVF9TRVRUSU5HOwogCi10eXBlZGVmIHVuaW9uICBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKLQlzdHJ1Y3QJewotCQkJVVNIT1JUICAgCU1DUzo3OyAgICAgICAgICAgICAgICAgCS8vIE1DUwotCQkJVVNIT1JUCQlQaHlNb2RlOjQ7Ci0JCQlVU0hPUlQJIAlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KLQkJCVVTSE9SVAkJcnN2OjM7Ci0JfQlmaWVsZDsKLQlVU0hPUlQJCXdvcmQ7Ci0gfSBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcsICpQREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HOwordHlwZWRlZiB1bmlvbiBfREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIHsKKwlzdHJ1Y3QgeworCQl1MTYgTUNTOjc7CS8qIE1DUyAqLworCQl1MTYgUGh5TW9kZTo0OworCQl1MTYgRml4ZWRUeE1vZGU6MjsJLyogSWYgTUNTIGlzbid0IEFVVE8sIGZpeCByYXRlIGluIENDSywgT0ZETSBvciBIVCBtb2RlLiAqLworCQl1MTYgcnN2OjM7CisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HLCAqUERFU0lSRURfVFJBTlNNSVRfU0VUVElORzsKIAotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4JCUlzUmVjaXBpZW50OwotCVVDSEFSICAgTUFDQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgbk1TRFU7Ci0JVVNIT1JUICAgVGltZU91dDsKLQlCT09MRUFOIGJBbGxUaWQ7ICAvLyBJZiBUcnVlLCBkZWxldGUgYWxsIFRJRCBmb3IgQkEgc2Vzc2lvbnMgd2l0aCB0aGlzIE1BQ2FkZHIuCi19IE9JRF9BRERfQkFfRU5UUlksICpQT0lEX0FERF9CQV9FTlRSWTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglVU0ItYmFzZWQgY2hpcCBCZWFjb24gcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJFQUNPTl9CSVRNQVBfTUFTSwkJMHhmZgorc3RydWN0IHJ0X2JlYWNvbl9zeW5jIHsKKwl1OCBCZWFjb25CdWZbSFdfQkVBQ09OX01BWF9DT1VOVF1bSFdfQkVBQ09OX09GRlNFVF07CisJdTggQmVhY29uVHhXSVtIV19CRUFDT05fTUFYX0NPVU5UXVtUWFdJX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgVGltSUVMb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCXVuc2lnbmVkIGxvbmcgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCUJPT0xFQU4gRW5hYmxlQmVhY29uOwkvKiB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLiAqLworCXU4IEJlYWNvbkJpdE1hcDsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLworCXU4IER0aW1CaXRPbjsJLyogTk9URTogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDgsIHRoaXMgcGFyYW1ldGVyIG5lZWQgdG8gY2hhbmdlLiAqLworfTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotLy8KLS8vIE11bHRpcGxlIFNTSUQgc3RydWN0dXJlCi0vLwotI2RlZmluZSBXTEFOX01BWF9OVU1fT0ZfVElNCQkJKChNQVhfTEVOX09GX01BQ19UQUJMRSA+PiAzKSArIDEpIC8qIC84ICsgMSAqLwotI2RlZmluZSBXTEFOX0NUX1RJTV9CQ01DX09GRlNFVAkJMCAvKiB1bml0OiAzMkIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglNdWx0aXBsZSBTU0lEIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXTEFOX01BWF9OVU1fT0ZfVElNCQkJKChNQVhfTEVOX09GX01BQ19UQUJMRSA+PiAzKSArIDEpCS8qIC84ICsgMSAqLworI2RlZmluZSBXTEFOX0NUX1RJTV9CQ01DX09GRlNFVAkJMAkvKiB1bml0OiAzMkIgKi8KIAogLyogY2xlYXIgYmNtYyBUSU0gYml0ICovCiAjZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfQ0xFQVIoYXBpZHgpIFwKQEAgLTE2NzgsMTMyMiArMTE1NywxMDMwIEBACiAKIC8qIGNsZWFyIGEgc3RhdGlvbiBQUyBUSU0gYml0ICovCiAjZGVmaW5lIFdMQU5fTVJfVElNX0JJVF9DTEVBUihhZF9wLCBhcGlkeCwgd2NpZCkgXAotCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAotCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCXsJdTggdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQl1OCBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAogCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gJj0gKH5CSVQ4W2JpdF9vZmZzZXRdKTsgfQogCiAvKiBzZXQgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KICNkZWZpbmUgV0xBTl9NUl9USU1fQklUX1NFVChhZF9wLCBhcGlkeCwgd2NpZCkgXAotCXsJVUNIQVIgdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAotCQlVQ0hBUiBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAorCXsJdTggdGltX29mZnNldCA9IHdjaWQgPj4gMzsgXAorCQl1OCBiaXRfb2Zmc2V0ID0gd2NpZCAmIDB4NzsgXAogCQlhZF9wLT5BcENmZy5NQlNTSURbYXBpZHhdLlRpbUJpdG1hcHNbdGltX29mZnNldF0gfD0gQklUOFtiaXRfb2Zmc2V0XTsgfQogCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIEJFQUNPTl9CSVRNQVBfTUFTSwkJMHhmZgotdHlwZWRlZiBzdHJ1Y3QgX0JFQUNPTl9TWU5DX1NUUlVDVF8KLXsKLQlVQ0hBUiAgICAgICAgCQkJQmVhY29uQnVmW0hXX0JFQUNPTl9NQVhfQ09VTlRdW0hXX0JFQUNPTl9PRkZTRVRdOwotCVVDSEFSCQkJCQlCZWFjb25UeFdJW0hXX0JFQUNPTl9NQVhfQ09VTlRdW1RYV0lfU0laRV07Ci0JVUxPTkcgCQkJCQlUaW1JRUxvY2F0aW9uSW5CZWFjb25bSFdfQkVBQ09OX01BWF9DT1VOVF07Ci0JVUxPTkcJCQkJCUNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbltIV19CRUFDT05fTUFYX0NPVU5UXTsKLQlCT09MRUFOCQkJCQlFbmFibGVCZWFjb247CQkvLyB0cmlnZ2VyIHRvIGVuYWJsZSBiZWFjb24gdHJhbnNtaXNzaW9uLgotCVVDSEFSCQkJCQlCZWFjb25CaXRNYXA7CQkvLyBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuCi0JVUNIQVIJCQkJCUR0aW1CaXRPbjsJCQkvLyBOT1RFOiBJZiB0aGUgTUFYX01CU1NJRF9OVU0gaXMgbGFyZ2VyIHRoYW4gOCwgdGhpcyBwYXJhbWV0ZXIgbmVlZCB0byBjaGFuZ2UuCi19QkVBQ09OX1NZTkNfU1RSVUNUOwotI2VuZGlmIC8vIFJUMjg3MCAvLworLyogY29uZmlndXJhdGlvbiBjb21tb24gdG8gT1BNT0RFX0FQIGFzIHdlbGwgYXMgT1BNT0RFX1NUQSAqLworc3RydWN0IHJ0X2NvbW1vbl9jb25maWcgewogCi10eXBlZGVmIHN0cnVjdCBfTVVMVElTU0lEX1NUUlVDVCB7Ci0JVUNIQVIJCQkJCQkJCUJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NpZExlbjsKLSAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm87CisJQk9PTEVBTiBiQ291bnRyeUZsYWc7CisJdTggQ291bnRyeUNvZGVbM107CisJdTggR2VvZ3JhcGh5OworCXU4IENvdW50cnlSZWdpb247CS8qIEVudW0gb2YgY291bnRyeSByZWdpb24sIDA6RkNDLCAxOklDLCAyOkVUU0ksIDM6U1BBSU4sIDQ6RnJhbmNlLCA1Ok1LSywgNjpNS0sxLCA3OklzcmFlbCAqLworCXU4IENvdW50cnlSZWdpb25Gb3JBQmFuZDsJLyogRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiBmb3IgQSBiYW5kICovCisJdTggUGh5TW9kZTsJCS8qIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVEICovCisJdTE2IERzaWZzOwkJLyogaW4gdW5pdHMgb2YgdXNlYyAqLworCXVuc2lnbmVkIGxvbmcgUGFja2V0RmlsdGVyOwkvKiBQYWNrZXQgZmlsdGVyIGZvciByZWNlaXZpbmcgKi8KKwl1OCBSZWd1bGF0b3J5Q2xhc3M7CiAKLSAgICBQTkVUX0RFViAgICAgICAgICAgICAgICAgICAJCQlNU1NJRERldjsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsJLyogTk9UIE5VTEwtdGVybWluYXRlZCAqLworCXU4IFNzaWRMZW47CQkvKiB0aGUgYWN0dWFsIHNzaWQgbGVuZ3RoIGluIHVzZWQgKi8KKwl1OCBMYXN0U3NpZExlbjsJLyogdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkICovCisJY2hhciBMYXN0U3NpZFtNQVhfTEVOX09GX1NTSURdOwkvKiBOT1QgTlVMTC10ZXJtaW5hdGVkICovCisJdTggTGFzdEJzc2lkW01BQ19BRERSX0xFTl07CiAKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlHcm91cEtleVdlcFN0YXR1czsKLQlXUEFfTUlYX1BBSVJfQ0lQSEVSCQkJCQlXcGFNaXhQYWlyQ2lwaGVyOworCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CisJdTE2IEJlYWNvblBlcmlvZDsKKwl1OCBDaGFubmVsOworCXU4IENlbnRyYWxDaGFubmVsOwkvKiBDZW50cmFsIENoYW5uZWwgd2hlbiB1c2luZyA0ME1IeiBpcyBpbmRpY2F0aW5nLiBub3QgcmVhbCBjaGFubmVsLiAqLwogCi0JVUxPTkcJCQkJCQkJCVR4Q291bnQ7Ci0JVUxPTkcJCQkJCQkJCVJ4Q291bnQ7Ci0JVUxPTkcJCQkJCQkJCVJlY2VpdmVkQnl0ZUNvdW50OwotCVVMT05HCQkJCQkJCQlUcmFuc21pdHRlZEJ5dGVDb3VudDsKLQlVTE9ORwkJCQkJCQkJUnhFcnJvckNvdW50OwotCVVMT05HCQkJCQkJCQlSeERyb3BDb3VudDsKKwl1OCBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKKwl1OCBTdXBSYXRlTGVuOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IEV4dFJhdGVMZW47CisJdTggRGVzaXJlUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CS8qIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUyAqLworCXU4IE1heERlc2lyZWRSYXRlOworCXU4IEV4cGVjdGVkQUNLUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CiAKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ly8gRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuCi0JUlRfSFRfUEhZX0lORk8JCQkJCQlEZXNpcmVkSHRQaHlJbmZvOwotCURFU0lSRURfVFJBTlNNSVRfU0VUVElORyAgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCi0JQk9PTEVBTgkJCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7CisJdW5zaWduZWQgbG9uZyBCYXNpY1JhdGVCaXRtYXA7CS8qIGJhY2t1cCBiYXNpYyByYXRlYml0bWFwICovCiAKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5SWQ7CisJQk9PTEVBTiBiQVBTRENhcGFibGU7CisJQk9PTEVBTiBiSW5TZXJ2aWNlUGVyaW9kOworCUJPT0xFQU4gYkFQU0RBQ19CRTsKKwlCT09MRUFOIGJBUFNEQUNfQks7CisJQk9PTEVBTiBiQVBTREFDX1ZJOworCUJPT0xFQU4gYkFQU0RBQ19WTzsKIAotCVVDSEFSCQkJCQkJCQlUeFJhdGU7ICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMSwgLi4uCi0JVUNIQVIgICAgIAkJCQkJCQlEZXNpcmVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOy8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwotCVVDSEFSCQkJCQkJCQlEZXNpcmVkUmF0ZXNJbmRleDsKLQlVQ0hBUiAgICAgCQkJCQkJCU1heFR4UmF0ZTsgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKKwkvKiBiZWNhdXNlIFRTUEVDIGNhbiBtb2RpZnkgdGhlIEFQU0QgZmxhZywgd2UgbmVlZCB0byBrZWVwIHRoZSBBUFNEIGZsYWcKKwkgICByZXF1ZXN0ZWQgaW4gYXNzb2NpYXRpb24gc3RhZ2UgZnJvbSB0aGUgc3RhdGlvbjsKKwkgICB3ZSBuZWVkIHRvIHJlY292ZXIgdGhlIEFQU0QgZmxhZyBhZnRlciB0aGUgVFNQRUMgaXMgZGVsZXRlZC4gKi8KKwlCT09MRUFOIGJBQ01BUFNEQmFja3VwWzRdOwkvKiBmb3IgZGVsaXZlcnktZW5hYmxlZCAmIHRyaWdnZXItZW5hYmxlZCBib3RoICovCisJQk9PTEVBTiBiQUNNQVBTRFRyWzRdOwkvKiBubyB1c2UgKi8KIAotCVVDSEFSCQkJCQkJCQlUaW1CaXRtYXBzW1dMQU5fTUFYX05VTV9PRl9USU1dOworCUJPT0xFQU4gYk5lZWRTZW5kVHJpZ2dlckZyYW1lOworCUJPT0xFQU4gYkFQU0RGb3JjZVBvd2VyU2F2ZTsJLyogRm9yY2UgcG93ZXIgc2F2ZSBtb2RlLCBzaG91bGQgb25seSB1c2UgaW4gQVBTRC1TVEFVVCAqLworCXVuc2lnbmVkIGxvbmcgVHJpZ2dlclRpbWVyQ291bnQ7CisJdTggTWF4U1BMZW5ndGg7CisJdTggQkJQQ3VycmVudEJXOwkvKiBCV18xMCwgICAgICAgQldfMjAsIEJXXzQwICovCisJLyogbW92ZSB0byBNVUxUSVNTSURfU1RSVUNUIGZvciBNQlNTICovCisJLypIVFRSQU5TTUlUX1NFVFRJTkcgICAgSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4gKi8KKwlSRUdfVFJBTlNNSVRfU0VUVElORyBSZWdUcmFuc21pdFNldHRpbmc7CS8qcmVnaXN0cnkgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuICovCisJLyp1OCAgICAgICBGaXhlZFR4TW9kZTsgICAgICAgICAgICAgIC8vIEZpeGVkIFR4IE1vZGUgKENDSywgT0ZETSksIGZvciBIVCBmaXhlZCB0eCBtb2RlIChHRiwgTUlYKSAsIHJlZmVyIHRvIFJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1vZGUgKi8KKwl1OCBUeFJhdGU7CQkvKiBTYW1lIHZhbHVlIHRvIGZpbGwgaW4gVFhELiBUeFJhdGUgaXMgNi1iaXQgKi8KKwl1OCBNYXhUeFJhdGU7CS8qIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMSAqLworCXU4IFR4UmF0ZUluZGV4OwkvKiBUeCByYXRlIGluZGV4IGluIFJhdGVTd2l0Y2hUYWJsZSAqLworCXU4IFR4UmF0ZVRhYmxlU2l6ZTsJLyogVmFsaWQgVHggcmF0ZSB0YWJsZSBzaXplIGluIFJhdGVTd2l0Y2hUYWJsZSAqLworCS8qQk9PTEVBTiAgICAgICAgICAgICAgIGJBdXRvVHhSYXRlU3dpdGNoOyAqLworCXU4IE1pblR4UmF0ZTsJLyogUkFURV8xLCBSQVRFXzIsIFJBVEVfNV81LCBSQVRFXzExICovCisJdTggUnRzUmF0ZTsJCS8qIFJBVEVfeHh4ICovCisJSFRUUkFOU01JVF9TRVRUSU5HIE1sbWVUcmFuc21pdDsJLyogTUdNVCBmcmFtZSBQSFkgcmF0ZSBzZXR0aW5nIHdoZW4gb3BlcmF0aW4gYXQgSHQgcmF0ZS4gKi8KKwl1OCBNbG1lUmF0ZTsJCS8qIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMgKi8KKwl1OCBCYXNpY01sbWVSYXRlOwkvKiBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMgKi8KIAotICAgIC8vIFdQQQotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNS1szMl07Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1LWzMyXTsKLQlVQ0hBUgkJCQkJCQkJR1RLWzMyXTsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUVFODAyMVg7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlQXV0aDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTm9uY2VbMzJdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRTZWN1cmVkOwotICAgIE5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSICAgICAgICAgIFByaXZhY3lGaWx0ZXI7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFOQ2xhc3MzRGF0YTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOworCXUxNiBSdHNUaHJlc2hvbGQ7CS8qIGluIHVuaXQgb2YgQllURSAqLworCXUxNiBGcmFnbWVudFRocmVzaG9sZDsJLyogaW4gdW5pdCBvZiBCWVRFICovCiAKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU05JRV9MZW5bMl07Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNOX0lFWzJdW01BWF9MRU5fT0ZfUlNOSUVdOworCXU4IFR4UG93ZXI7CQkvKiBpbiB1bml0IG9mIG1XICovCisJdW5zaWduZWQgbG9uZyBUeFBvd2VyUGVyY2VudGFnZTsJLyogMH4xMDAgJSAqLworCXVuc2lnbmVkIGxvbmcgVHhQb3dlckRlZmF1bHQ7CS8qIGtlZXAgZm9yIFR4UG93ZXJQZXJjZW50YWdlICovCisJdTggUHdyQ29uc3RyYWludDsKIAorCUJBQ0FQX1NUUlVDIEJBQ2FwYWJpbGl0eTsJLyogICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MCAqLworCUJBQ0FQX1NUUlVDIFJFR0JBQ2FwYWJpbGl0eTsJLyogICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MCAqLwogCi0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgCQkJVGltSUVMb2NhdGlvbkluQmVhY29uOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIAkJCUNhcGFiaWxpdHlJbmZvTG9jYXRpb25JbkJlYWNvbjsKLSAgICAvLyBvdXRnb2luZyBCRUFDT04gZnJhbWUgYnVmZmVyIGFuZCBjb3JyZXNwb25kaW5nIFRYV0kKLQkvLyBQVFhXSV9TVFJVQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYWNvblR4V0k7IC8vCi0gICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uQnVmW01BWF9CRUFDT05fU0laRV07IC8vIE5PVEU6IEJlYWNvbkJ1ZiBzaG91bGQgYmUgNC1ieXRlIGFsaWduZWQKKwlzdHJ1Y3QgcnRfaW90IElPVGVzdFBhcm07CS8qIDgwMi4xMW4gSW50ZXJPcGJpbGl0eSBUZXN0IFBhcmFtZXRlcjsgKi8KKwl1bnNpZ25lZCBsb25nIFR4UHJlYW1ibGU7CS8qIFJ0ODAyXzExUHJlYW1ibGVMb25nLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQsIFJ0ODAyXzExUHJlYW1ibGVBdXRvICovCisJQk9PTEVBTiBiVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50OwkvKiBNaWNyb3NvZnQgdXNlIDAgYXMgZGlzYWJsZSAqLworCXVuc2lnbmVkIGxvbmcgVXNlQkdQcm90ZWN0aW9uOwkvKiAwOiBhdXRvLCAxOiBhbHdheXMgdXNlLCAyOiBhbHdheXMgbm90IHVzZSAqLworCUJPT0xFQU4gYlVzZVNob3J0U2xvdFRpbWU7CS8qIDA6IGRpc2FibGUsIDEgLSB1c2Ugc2hvcnQgc2xvdCAoOXVzKSAqLworCUJPT0xFQU4gYkVuYWJsZVR4QnVyc3Q7CS8qIDE6IGVuYmxlIFRYIFBBQ0tFVCBCVVJTVCAod2hlbiBCQSBpcyBlc3RhYmxpc2hlZCBvciBBUCBpcyBub3QgYSBsZWdhY3kgV01NIEFQKSwgMDogZGlzYWJsZSBUWCBQQUNLRVQgQlVSU1QgKi8KKwlCT09MRUFOIGJBZ2dyZWdhdGlvbkNhcGFibGU7CS8qIDE6IGVuYWJsZSBUWCBhZ2dyZWdhdGlvbiB3aGVuIHRoZSBwZWVyIHN1cHBvcnRzIGl0ICovCisJQk9PTEVBTiBiUGlnZ3lCYWNrQ2FwYWJsZTsJLyogMTogZW5hYmxlIFRYIHBpZ2d5LWJhY2sgYWNjb3JkaW5nIE1BQydzIHZlcnNpb24gKi8KKwlCT09MRUFOIGJJRUVFODAyMTFIOwkvKiAxOiBlbmFibGUgSUVFRTgwMi4xMWggc3BlYy4gKi8KKwl1bnNpZ25lZCBsb25nIERpc2FibGVPTEJDRGV0ZWN0OwkvKiAwOiBlbmFibGUgT0xCQyBkZXRlY3Q7IDEgZGlzYWJsZSBPTEJDIGRldGVjdCAqLwogCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhpZGVTc2lkOwotCVVJTlQxNgkJCQkJCQkJU3RhdGlvbktlZXBBbGl2ZVRpbWU7IC8vIHVuaXQ6IHNlY29uZAorCUJPT0xFQU4gYlJkZzsKIAotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQU5fVklEOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZMQU5fUHJpb3JpdHk7CisJQk9PTEVBTiBiV21tQ2FwYWJsZTsJLyogMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NICovCisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gQVBRb3NDYXBhYmlsaXR5OwkvKiBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQICovCisJc3RydWN0IHJ0X2VkY2FfcGFybSBBUEVkY2FQYXJtOwkvKiBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCAqLworCXN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSBBUFFic3NMb2FkOwkvKiBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCAqLworCXU4IEFja1BvbGljeVs0XTsJLyogQUNLIHBvbGljeSBvZiB0aGUgc3BlY2lmaWVkIEFDLiBzZWUgQUNLX3h4eCAqLworCUJPT0xFQU4gYkRMU0NhcGFibGU7CS8qIDA6ZGlzYWJsZSBETFMsIDE6ZW5hYmxlIERMUyAqLworCS8qIGEgYml0bWFwIG9mIEJPT0xFQU4gZmxhZ3MuIGVhY2ggYml0IHJlcHJlc2VudCBhbiBvcGVyYXRpb24gc3RhdHVzIG9mIGEgcGFydGljdWxhciAqLworCS8qIEJPT0xFQU4gY29udHJvbCwgZWl0aGVyIE9OIG9yIE9GRi4gVGhlc2UgZmxhZ3Mgc2hvdWxkIGFsd2F5cyBiZSBhY2Nlc3NlZCB2aWEgKi8KKwkvKiBPUFNUQVRVU19URVNUX0ZMQUcoKSwgT1BTVEFUVVNfU0VUX0ZMQUcoKSwgT1BfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuICovCisJLyogc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgT3BTdGF0dXNGbGFnczsKIAotICAgIFJUXzgwMl8xMV9BQ0wJCQkJCQlBY2Nlc3NDb250cm9sTGlzdDsKKwlCT09MRUFOIE5kaXNSYWRpb1N0YXRlT2ZmOwkvKkZvciBIQ1QgMTIuMCwgc2V0IHRoaXMgZmxhZyB0byBUUlVFIGluc3RlYWQgb2YgY2FsbGVkIE1sbWVSYWRpb09mZi4gKi8KKwlBQkdCQU5EX1NUQVRFIEJhbmRTdGF0ZTsJLyogRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4gKi8KIAotCS8vIEVEQ0EgUW9zCi0gICAgQk9PTEVBTgkJCQkJCQkJYldtbUNhcGFibGU7CS8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQotICAgIEJPT0xFQU4JCQkJCQkJCWJETFNDYXBhYmxlOwkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKKwkvKiBJRUVFODAyLjExSC0tREZTLiAqLworCXN0cnVjdCBydF9yYWRhcl9kZXRlY3QgUmFkYXJEZXRlY3Q7CiAKLQlVQ0hBUiAgICAgICAgICAgCQkJCQlEbHNQVEtbNjRdOwkJLy8gRHVlIHRvIHdpbmRvd3MgZGlydmVyIGNvdW50IG9uIG1lZXRpbmdob3VzZSB0byBoYW5kbGUgNC13YXkgc2hha2UKKwkvKiBIVCAqLworCXU4IEJBU2l6ZTsJCS8qIFVTZXIgZGVzaXJlZCBCQVdpbmRvd1NpemUuIFNob3VsZCBub3QgZXhjZWVkIG91ciBtYXggY2FwYWJpbGl0eSAqLworCS8qc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHkgICAgICBTdXBwb3J0ZWRIdFBoeTsgKi8KKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSBEZXNpcmVkSHRQaHk7CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgSHRDYXBhYmlsaXR5OworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIVEluZm87CS8qIFVzZWZ1bCBhcyBBUC4gKi8KKwkvKlRoaXMgSUUgaXMgdXNlZCB3aXRoIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBlbGVtZW50IHdoZW4gY2hhbmdpbmcgdG8gYSBuZXcgNDBNSHouICovCisJLypUaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFtbW91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLiAqLworCXN0cnVjdCBydF9uZXdfZXh0X2NoYW5faWUgTmV3RXh0Q2hhbk9mZnNldDsJLyo3LjMuMi4yMEEsIDEgaWYgZXh0ZW5zaW9uIGNoYW5uZWwgaXMgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbCwgMyBpZiBiZWxvdywgMCBpZiBub3QgcHJlc2VudCAqLwogCi0JLy8gRm9yIDgwMi4xeCBkYWVtb24gc2V0dGluZyBwZXIgQlNTCi0JVUNIQVIJCQkJCQkJCXJhZGl1c19zcnZfbnVtOwotCVJBRElVU19TUlZfSU5GTwkJCQkJCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOworCUJPT0xFQU4gYkhUUHJvdGVjdDsKKwlCT09MRUFOIGJNSU1PUFNFbmFibGU7CisJQk9PTEVBTiBiQkFEZWNsaW5lOworLyoyMDA4LzExLzA1OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLSAqLworCUJPT0xFQU4gYkdyZWVuQVBFbmFibGU7CisvKjIwMDgvMTEvMDU6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+ICovCisJQk9PTEVBTiBiRGlzYWJsZVJlb3JkZXJpbmc7CisJQk9PTEVBTiBiRm9ydHlfTWh6X0ludG9sZXJhbnQ7CisJQk9PTEVBTiBiRXh0Q2hhbm5lbFN3aXRjaEFubm91bmNlbWVudDsKKwlCT09MRUFOIGJSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHM7CisJdW5zaWduZWQgbG9uZyBMYXN0UmN2QlNTV2lkdGhUcmlnZ2VyRXZlbnRzVGltZTsKIAotI2lmZGVmIFJUTDg2NVhfU09DCi0JdW5zaWduZWQgaW50CQkJCQkJbXlsaW5raWQ7CisJdTggVHhCQVNpemU7CisKKwkvKiBFbmFibGUgd2lyZWxlc3MgZXZlbnQgKi8KKwlCT09MRUFOIGJXaXJlbGVzc0V2ZW50OworCUJPT0xFQU4gYldpRmlUZXN0OwkvKiBFbmFibGUgdGhpcyBwYXJhbWV0ZXIgZm9yIFdpRmkgdGVzdCAqLworCisJLyogVHggJiBSeCBTdHJlYW0gbnVtYmVyIHNlbGVjdGlvbiAqLworCXU4IFR4U3RyZWFtOworCXU4IFJ4U3RyZWFtOworCisJQk9PTEVBTiBiSGFyZHdhcmVSYWRpbzsJLyogSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkICovCisKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlCT09MRUFOIGJNdWx0aXBsZUlSUDsJLyogTXVsdGlwbGUgQnVsayBJTiBmbGFnICovCisJdTggTnVtT2ZCdWxrSW5JUlA7CS8qIGlmIGJNdWx0aXBsZUlSUCA9PSBUUlVFLCBOdW1PZkJ1bGtJbklSUCB3aWxsIGJlIDQgb3RoZXJ3aXNlIGJlIDEgKi8KKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSBTdXBwb3J0ZWRIdFBoeTsKKwl1bnNpZ25lZCBsb25nIE1heFBrdE9uZVR4QnVsazsKKwl1OCBUeEJ1bGtGYWN0b3I7CisJdTggUnhCdWxrRmFjdG9yOworCisJQk9PTEVBTiBJc1VwZGF0ZUJlYWNvbjsKKwlzdHJ1Y3QgcnRfYmVhY29uX3N5bmMgKnBCZWFjb25TeW5jOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgQmVhY29uVXBkYXRlVGltZXI7CisJdTMyIEJlYWNvbkFkanVzdDsKKwl1MzIgQmVhY29uRmFjdG9yOworCXUzMiBCZWFjb25SZW1haW47CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCisKKwlzcGlubG9ja190IE1lYXN1cmVSZXFUYWJMb2NrOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV90YWIgKnBNZWFzdXJlUmVxVGFiOworCisJc3BpbmxvY2tfdCBUcGNSZXFUYWJMb2NrOworCXN0cnVjdCBydF90cGNfcmVxX3RhYiAqcFRwY1JlcVRhYjsKKworCUJPT0xFQU4gUFNQWGxpbms7CS8qIDA6IERpc2FibGUuIDE6IEVuYWJsZSAqLworCisjaWYgZGVmaW5lZChSVDMwNXgpfHxkZWZpbmVkKFJUMzB4eCkKKwkvKiByZXF1ZXN0IGJ5IEdhcnksIGZvciBIaWdoIFBvd2VyIGlzc3VlICovCisJdTggSGlnaFBvd2VyUGF0Y2hEaXNhYmxlZDsKICNlbmRpZgogCi0KLQlVSU5UMzIJCQkJCVJjdmRDb25mbGljdFNzaWRDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQXNzb2NSZXNwQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFJlYXNzb2NSZXNwQ291bnQ7Ci0JVUlOVDMyCQkJCQlSY3ZkU3Bvb2ZlZFByb2JlUmVzcENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWRCZWFjb25Db3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkRGlzYXNzb2NDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkQXV0aENvdW50OwotCVVJTlQzMgkJCQkJUmN2ZFNwb29mZWREZWF1dGhDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRTcG9vZmVkVW5rbm93bk1nbXRDb3VudDsKLQlVSU5UMzIJCQkJCVJjdmRSZXBsYXlBdHRhY2tDb3VudDsKLQotCUNIQVIJCQkJCVJzc2lPZlJjdmRDb25mbGljdFNzaWQ7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRBc3NvY1Jlc3A7Ci0JQ0hBUgkJCQkJUnNzaU9mUmN2ZFNwb29mZWRSZWFzc29jUmVzcDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFByb2JlUmVzcDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZEJlYWNvbjsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZERpc2Fzc29jOwotCUNIQVIJCQkJCVJzc2lPZlJjdmRTcG9vZmVkQXV0aDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZERlYXV0aDsKLQlDSEFSCQkJCQlSc3NpT2ZSY3ZkU3Bvb2ZlZFVua25vd25NZ210OwotCUNIQVIJCQkJCVJzc2lPZlJjdmRSZXBsYXlBdHRhY2s7Ci0KLQlCT09MRUFOCQkJCQliQmNuU250UmVxOwotCVVDSEFSCQkJCQlCY25CdWZJZHg7Ci19IE1VTFRJU1NJRF9TVFJVQ1QsICpQTVVMVElTU0lEX1NUUlVDVDsKLQotLy8gY29uZmlndXJhdGlvbiBjb21tb24gdG8gT1BNT0RFX0FQIGFzIHdlbGwgYXMgT1BNT0RFX1NUQQotdHlwZWRlZiBzdHJ1Y3QgX0NPTU1PTl9DT05GSUcgewotCi0JQk9PTEVBTgkJYkNvdW50cnlGbGFnOwotCVVDSEFSCQlDb3VudHJ5Q29kZVszXTsKLQlVQ0hBUgkJR2VvZ3JhcGh5OwotCVVDSEFSICAgICAgIENvdW50cnlSZWdpb247ICAgICAgLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiwgMDpGQ0MsIDE6SUMsIDI6RVRTSSwgMzpTUEFJTiwgNDpGcmFuY2UsIDU6TUtLLCA2Ok1LSzEsIDc6SXNyYWVsCi0JVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbkZvckFCYW5kOwkvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uIGZvciBBIGJhbmQKLQlVQ0hBUiAgICAgICBQaHlNb2RlOyAgICAgICAgICAgIC8vIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVECi0JVVNIT1JUICAgICAgRHNpZnM7ICAgICAgICAgICAgICAvLyBpbiB1bml0cyBvZiB1c2VjCi0JVUxPTkcgICAgICAgUGFja2V0RmlsdGVyOyAgICAgICAvLyBQYWNrZXQgZmlsdGVyIGZvciByZWNlaXZpbmcKLQotCUNIQVIgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAotCVVDSEFSICAgICAgIFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCi0JVUNIQVIgICAgICAgTGFzdFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCi0JQ0hBUiAgICAgICAgTGFzdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAotCVVDSEFSCQlMYXN0QnNzaWRbTUFDX0FERFJfTEVOXTsKLQotCVVDSEFSICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgQmVhY29uUGVyaW9kOwotCVVDSEFSICAgICAgIENoYW5uZWw7Ci0JVUNIQVIgICAgICAgQ2VudHJhbENoYW5uZWw7ICAgIAkvLyBDZW50cmFsIENoYW5uZWwgd2hlbiB1c2luZyA0ME1IeiBpcyBpbmRpY2F0aW5nLiBub3QgcmVhbCBjaGFubmVsLgotCi0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgIERlc2lyZVJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOyAgICAgIC8vIE9JRF84MDJfMTFfREVTSVJFRF9SQVRFUwotCVVDSEFSICAgICAgIE1heERlc2lyZWRSYXRlOwotCVVDSEFSICAgICAgIEV4cGVjdGVkQUNLUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0KLQlVTE9ORyAgICAgICBCYXNpY1JhdGVCaXRtYXA7ICAgICAgICAvLyBiYWNrdXAgYmFzaWMgcmF0ZWJpdG1hcAotCi0JQk9PTEVBTgkJYkFQU0RDYXBhYmxlOwotCUJPT0xFQU4JCWJJblNlcnZpY2VQZXJpb2Q7Ci0JQk9PTEVBTgkJYkFQU0RBQ19CRTsKLQlCT09MRUFOCQliQVBTREFDX0JLOwotCUJPT0xFQU4JCWJBUFNEQUNfVkk7Ci0JQk9PTEVBTgkJYkFQU0RBQ19WTzsKLQlCT09MRUFOCQliTmVlZFNlbmRUcmlnZ2VyRnJhbWU7Ci0JQk9PTEVBTgkJYkFQU0RGb3JjZVBvd2VyU2F2ZTsJLy8gRm9yY2UgcG93ZXIgc2F2ZSBtb2RlLCBzaG91bGQgb25seSB1c2UgaW4gQVBTRC1TVEFVVAotCVVMT05HCQlUcmlnZ2VyVGltZXJDb3VudDsKLQlVQ0hBUgkJTWF4U1BMZW5ndGg7Ci0JVUNIQVIJCUJCUEN1cnJlbnRCVzsJLy8gQldfMTAsIAlCV18yMCwgQldfNDAKLQlSRUdfVFJBTlNNSVRfU0VUVElORyAgICAgICAgUmVnVHJhbnNtaXRTZXR0aW5nOyAvL3JlZ2lzdHJ5IHRyYW5zbWl0IHNldHRpbmcuIHRoaXMgaXMgZm9yIHJlYWRpbmcgcmVnaXN0cnkgc2V0dGluZyBvbmx5LiBub3QgdXNlZnVsLgotCVVDSEFSICAgICAgIFR4UmF0ZTsgICAgICAgICAgICAgICAgIC8vIFNhbWUgdmFsdWUgdG8gZmlsbCBpbiBUWEQuIFR4UmF0ZSBpcyA2LWJpdAotCVVDSEFSICAgICAgIE1heFR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQotCVVDSEFSICAgICAgIFR4UmF0ZUluZGV4OyAgICAgICAgICAgIC8vIFR4IHJhdGUgaW5kZXggaW4gUmF0ZVN3aXRjaFRhYmxlCi0JVUNIQVIgICAgICAgVHhSYXRlVGFibGVTaXplOyAgICAgICAgLy8gVmFsaWQgVHggcmF0ZSB0YWJsZSBzaXplIGluIFJhdGVTd2l0Y2hUYWJsZQotCVVDSEFSICAgICAgIE1pblR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQotCVVDSEFSICAgICAgIFJ0c1JhdGU7ICAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4Ci0JSFRUUkFOU01JVF9TRVRUSU5HCU1sbWVUcmFuc21pdDsgICAvLyBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpbiBhdCBIdCByYXRlLgotCVVDSEFSICAgICAgIE1sbWVSYXRlOyAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMKLQlVQ0hBUiAgICAgICBCYXNpY01sbWVSYXRlOyAgICAgICAgICAvLyBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMKLQotCVVTSE9SVCAgICAgIFJ0c1RocmVzaG9sZDsgICAgICAgICAgIC8vIGluIHVuaXQgb2YgQllURQotCVVTSE9SVCAgICAgIEZyYWdtZW50VGhyZXNob2xkOyAgICAgIC8vIGluIHVuaXQgb2YgQllURQotCi0JVUNIQVIgICAgICAgVHhQb3dlcjsgICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBtVwotCVVMT05HICAgICAgIFR4UG93ZXJQZXJjZW50YWdlOyAgICAgIC8vIDB+MTAwICUKLQlVTE9ORyAgICAgICBUeFBvd2VyRGVmYXVsdDsgICAgICAgICAvLyBrZWVwIGZvciBUeFBvd2VyUGVyY2VudGFnZQotCi0JQkFDQVBfU1RSVUMgICAgICAgIEJBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAotCUJBQ0FQX1NUUlVDICAgICAgICBSRUdCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKLQotCUlPVF9TVFJVQwkJSU9UZXN0UGFybTsJLy8gODAyLjExbiBJbnRlck9wYmlsaXR5IFRlc3QgUGFyYW1ldGVyOwotCVVMT05HICAgICAgIFR4UHJlYW1ibGU7ICAgICAgICAgICAgIC8vIFJ0ODAyXzExUHJlYW1ibGVMb25nLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQsIFJ0ODAyXzExUHJlYW1ibGVBdXRvCi0JQk9PTEVBTiAgICAgYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudDsgICAgIC8vIE1pY3Jvc29mdCB1c2UgMCBhcyBkaXNhYmxlCi0JVUxPTkcgICAgICAgVXNlQkdQcm90ZWN0aW9uOyAgICAgICAgLy8gMDogYXV0bywgMTogYWx3YXlzIHVzZSwgMjogYWx3YXlzIG5vdCB1c2UKLQlCT09MRUFOICAgICBiVXNlU2hvcnRTbG90VGltZTsgICAgICAvLyAwOiBkaXNhYmxlLCAxIC0gdXNlIHNob3J0IHNsb3QgKDl1cykKLQlCT09MRUFOICAgICBiRW5hYmxlVHhCdXJzdDsgICAgICAgICAvLyAxOiBlbmJsZSBUWCBQQUNLRVQgQlVSU1QsIDA6IGRpc2FibGUgVFggUEFDS0VUIEJVUlNUCi0JQk9PTEVBTiAgICAgYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsgICAgICAvLyAxOiBlbmFibGUgVFggYWdncmVnYXRpb24gd2hlbiB0aGUgcGVlciBzdXBwb3J0cyBpdAotCUJPT0xFQU4gICAgIGJQaWdneUJhY2tDYXBhYmxlOwkJLy8gMTogZW5hYmxlIFRYIHBpZ2d5LWJhY2sgYWNjb3JkaW5nIE1BQydzIHZlcnNpb24KLQlCT09MRUFOICAgICBiSUVFRTgwMjExSDsJCQkvLyAxOiBlbmFibGUgSUVFRTgwMi4xMWggc3BlYy4KLQlVTE9ORwkJRGlzYWJsZU9MQkNEZXRlY3Q7CQkvLyAwOiBlbmFibGUgT0xCQyBkZXRlY3Q7IDEgZGlzYWJsZSBPTEJDIGRldGVjdAotCi0JQk9PTEVBTgkJCQliUmRnOwotCi0JQk9PTEVBTiAgICAgICAgICAgICBiV21tQ2FwYWJsZTsgICAgICAgIC8vIDA6ZGlzYWJsZSBXTU0sIDE6ZW5hYmxlIFdNTQotCVFPU19DQVBBQklMSVRZX1BBUk0gQVBRb3NDYXBhYmlsaXR5OyAgICAvLyBRT1MgY2FwYWJpbGl0eSBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JRURDQV9QQVJNICAgICAgICAgICBBUEVkY2FQYXJtOyAgICAgICAgIC8vIEVEQ0EgcGFyYW1ldGVycyBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JUUJTU19MT0FEX1BBUk0gICAgICBBUFFic3NMb2FkOyAgICAgICAgIC8vIFFCU1MgbG9hZCBvZiB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQCi0JVUNIQVIgICAgICAgICAgICAgICBBY2tQb2xpY3lbNF07ICAgICAgIC8vIEFDSyBwb2xpY3kgb2YgdGhlIHNwZWNpZmllZCBBQy4gc2VlIEFDS194eHgKLQlCT09MRUFOCQkJCWJETFNDYXBhYmxlOwkJLy8gMDpkaXNhYmxlIERMUywgMTplbmFibGUgRExTCi0JLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCi0JLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQotCS8vIE9QU1RBVFVTX1RFU1RfRkxBRygpLCBPUFNUQVRVU19TRVRfRkxBRygpLCBPUF9TVEFUVVNfQ0xFQVJfRkxBRygpIG1hY3Jvcy4KLQkvLyBzZWUgZk9QX1NUQVRVU194eHggaW4gUlRNUF9ERUYuQyBmb3IgZGV0YWlsIGJpdCBkZWZpbml0aW9uCi0JVUxPTkcgICAgICAgICAgICAgICBPcFN0YXR1c0ZsYWdzOwotCi0JQk9PTEVBTgkJCQlOZGlzUmFkaW9TdGF0ZU9mZjsgLy9Gb3IgSENUIDEyLjAsIHNldCB0aGlzIGZsYWcgdG8gVFJVRSBpbnN0ZWFkIG9mIGNhbGxlZCBNbG1lUmFkaW9PZmYuCi0JQUJHQkFORF9TVEFURQkJQmFuZFN0YXRlOwkJLy8gRm9yIHNldHRpbmcgQkJQIHVzZWQgb24gQi9HIG9yIEEgbW9kZS4KLQotCS8vIElFRUU4MDIuMTFILS1ERlMuCi0JUkFEQVJfREVURUNUX1NUUlVDVAlSYWRhckRldGVjdDsKLQotCS8vIEhUCi0JVUNIQVIJCQlCQVNpemU7CQkvLyBVU2VyIGRlc2lyZWQgQkFXaW5kb3dTaXplLiBTaG91bGQgbm90IGV4Y2VlZCBvdXIgbWF4IGNhcGFiaWxpdHkKLQkvL1JUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Ci0JUlRfSFRfQ0FQQUJJTElUWQlEZXNpcmVkSHRQaHk7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIVEluZm87CS8vIFVzZWZ1bCBhcyBBUC4KLQkvL1RoaXMgSUUgaXMgdXNlZCB3aXRoIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBlbGVtZW50IHdoZW4gY2hhbmdpbmcgdG8gYSBuZXcgNDBNSHouCi0JLy9UaGlzIElFIGlzIGluY2x1ZGVkIGluIGNoYW5uZWwgc3dpdGNoIGFtbW91bmNlbWVudCBmcmFtZXMgNy40LjEuNSwgYmVhY29ucywgcHJvYmUgUnNwLgotCU5FV19FWFRfQ0hBTl9JRQlOZXdFeHRDaGFuT2Zmc2V0OwkvLzcuMy4yLjIwQSwgMSBpZiBleHRlbnNpb24gY2hhbm5lbCBpcyBhYm92ZSB0aGUgY29udHJvbCBjaGFubmVsLCAzIGlmIGJlbG93LCAwIGlmIG5vdCBwcmVzZW50Ci0KLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiSFRQcm90ZWN0OwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgIGJNSU1PUFNFbmFibGU7Ci0gICAgQk9PTEVBTgkJCQkJYkJBRGVjbGluZTsKLQlCT09MRUFOCQkJCQliRGlzYWJsZVJlb3JkZXJpbmc7Ci0JQk9PTEVBTgkJCQkJYkZvcnR5X01oel9JbnRvbGVyYW50OwotCUJPT0xFQU4JCQkJCWJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50OwotCUJPT0xFQU4JCQkJCWJSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHM7Ci0JVUxPTkcJCQkJCUxhc3RSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHNUaW1lOwotCi0JVUNIQVIJCQkJCVR4QkFTaXplOwotCi0JLy8gRW5hYmxlIHdpcmVsZXNzIGV2ZW50Ci0JQk9PTEVBTgkJCQliV2lyZWxlc3NFdmVudDsKLQlCT09MRUFOCQkJCWJXaUZpVGVzdDsJCQkJLy8gRW5hYmxlIHRoaXMgcGFyYW1ldGVyIGZvciBXaUZpIHRlc3QKLQotCS8vIFR4ICYgUnggU3RyZWFtIG51bWJlciBzZWxlY3Rpb24KLQlVQ0hBUgkJCQlUeFN0cmVhbTsKLQlVQ0hBUgkJCQlSeFN0cmVhbTsKLQotCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0JVUNIQVIJCQkJTWNhc3RUcmFuc21pdE1jczsKLQlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0UGh5TW9kZTsKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLQlCT09MRUFOICAgICAJCWJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCi0KLSNpZmRlZiBSVDI4NzAKLQlCT09MRUFOICAgICAJCWJNdWx0aXBsZUlSUDsgICAgICAgLy8gTXVsdGlwbGUgQnVsayBJTiBmbGFnCi0JVUNIQVIgICAgICAgCQlOdW1PZkJ1bGtJbklSUDsgICAgIC8vIGlmIGJNdWx0aXBsZUlSUCA9PSBUUlVFLCBOdW1PZkJ1bGtJbklSUCB3aWxsIGJlIDQgb3RoZXJ3aXNlIGJlIDEKLSAJUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKLQlVTE9ORwkJCQlNYXhQa3RPbmVUeEJ1bGs7Ci0JVUNIQVIJCQkJVHhCdWxrRmFjdG9yOwotCVVDSEFSCQkJCVJ4QnVsa0ZhY3RvcjsKLQotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVAlCZWFjb25VcGRhdGVUaW1lcjsKLQlVSU5UMzIJCQkJQmVhY29uQWRqdXN0OwotCVVJTlQzMgkJCQlCZWFjb25GYWN0b3I7Ci0JVUlOVDMyCQkJCUJlYWNvblJlbWFpbjsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0gCU5ESVNfU1BJTl9MT0NLCQkJTWVhc3VyZVJlcVRhYkxvY2s7Ci0JUE1FQVNVUkVfUkVRX1RBQgkJcE1lYXN1cmVSZXFUYWI7Ci0KLQlORElTX1NQSU5fTE9DSwkJCVRwY1JlcVRhYkxvY2s7Ci0JUFRQQ19SRVFfVEFCCQkJcFRwY1JlcVRhYjsKLQotCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0JSFRUUkFOU01JVF9TRVRUSU5HCQlNQ2FzdFBoeU1vZGU7Ci0jZW5kaWYgLy8gTUNBU1RfUkFURV9TUEVDSUZJQyAvLwotfSBDT01NT05fQ09ORklHLCAqUENPTU1PTl9DT05GSUc7CisJQk9PTEVBTiBIVF9EaXNhbGxvd1RLSVA7CS8qIFJlc3RyaWN0IHRoZSBlbmNyeXB0aW9uIHR5cGUgaW4gMTFuIEhUIG1vZGUgKi8KK307CiAKIC8qIE1vZGlmaWVkIGJ5IFd1IFhpLUt1biA0LzIxLzIwMDYgKi8KLS8vIFNUQSBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMKLXR5cGVkZWYgc3RydWN0IF9TVEFfQURNSU5fQ09ORklHIHsKLQkvLyBHUk9VUCAxIC0KLQkvLyAgIFVzZXIgY29uZmlndXJhdGlvbiBsb2FkZWQgZnJvbSBSZWdpc3RyeSwgRTJQUk9NIG9yIE9JRF94eHguIFRoZXNlIHNldHRpbmdzIGRlc2NyaWJlCi0JLy8gICB0aGUgdXNlciBpbnRlbmRlZCBjb25maWd1cmF0aW9uLCBidXQgbm90IG5lY2Vzc2FyeSBmdWxseSBlcXVhbCB0byB0aGUgZmluYWwKLQkvLyAgIHNldHRpbmdzIGluIEFDVElWRSBCU1MgYWZ0ZXIgbmVnb3RpYXRpb24vY29tcHJvbWl6ZSB3aXRoIHRoZSBCU1MgaG9sZGVyIChlaXRoZXIKLQkvLyAgIEFQIG9yIElCU1MgaG9sZGVyKS4KLQkvLyAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4Ci0JVUNIQVIgICAgICAgQnNzVHlwZTsgICAgICAgICAgICAgIC8vIEJTU19JTkZSQSBvciBCU1NfQURIT0MKLQlVU0hPUlQgICAgICBBdGltV2luOyAgICAgICAgICAvLyB1c2VkIHdoZW4gc3RhcnRpbmcgYSBuZXcgSUJTUworLyogU1RBIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXR1cyAqLworc3RydWN0IHJ0X3N0YV9hZG1pbl9jb25maWcgeworCS8qIEdST1VQIDEgLSAqLworCS8qICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUgKi8KKwkvKiAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGJ1dCBub3QgbmVjZXNzYXJ5IGZ1bGx5IGVxdWFsIHRvIHRoZSBmaW5hbCAqLworCS8qICAgc2V0dGluZ3MgaW4gQUNUSVZFIEJTUyBhZnRlciBuZWdvdGlhdGlvbi9jb21wcm9taXplIHdpdGggdGhlIEJTUyBob2xkZXIgKGVpdGhlciAqLworCS8qICAgQVAgb3IgSUJTUyBob2xkZXIpLiAqLworCS8qICAgT25jZSBpbml0aWFsaXplZCwgdXNlciBjb25maWd1cmF0aW9uIGNhbiBvbmx5IGJlIGNoYW5nZWQgdmlhIE9JRF94eHggKi8KKwl1OCBCc3NUeXBlOwkJLyogQlNTX0lORlJBIG9yIEJTU19BREhPQyAqLworCXUxNiBBdGltV2luOwkJLyogdXNlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IElCU1MgKi8KIAotCS8vIEdST1VQIDIgLQotCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKLQkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGFuZCBzaG91bGQgYmUgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsCi0JLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIHdpdGhvdXQgY29tcHJvbWlzaW5nIHdpdGggdGhlIEJTUyBob2xkZXIuCi0JLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAotCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyOwotCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyTW9kZTsgICAgICAvLyBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCBvciBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xECi0JVVNIT1JUICAgICAgRGVmYXVsdExpc3RlbkNvdW50OyAgIC8vIGRlZmF1bHQgbGlzdGVuIGNvdW50OwotCVVMT05HICAgICAgIFdpbmRvd3NQb3dlck1vZGU7ICAgICAgICAgICAvLyBQb3dlciBtb2RlIGZvciBBQyBwb3dlcgotCVVMT05HICAgICAgIFdpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOyAgICAvLyBQb3dlciBtb2RlIGZvciBiYXR0ZXJ5IGlmIGV4aXN0cwotCUJPT0xFQU4gICAgIGJXaW5kb3dzQUNDQU1FbmFibGU7ICAgICAgICAvLyBFbmFibGUgQ0FNIHBvd2VyIG1vZGUgd2hlbiBBQyBvbgotCUJPT0xFQU4gICAgIGJBdXRvUmVjb25uZWN0OyAgICAgICAgIC8vIFNldCB0byBUUlVFIHdoZW4gc2V0dGluZyBPSURfODAyXzExX1NTSUQgd2l0aCBubyBtYXRjaGluZyBCU1NJRAotCVVMT05HICAgICAgIFdpbmRvd3NQb3dlclByb2ZpbGU7ICAgIC8vIFdpbmRvd3MgcG93ZXIgcHJvZmlsZSwgZm9yIE5ESVM1LjEgUG5QCisJLyogR1JPVVAgMiAtICovCisJLyogICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZSAqLworCS8qICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYW5kIHNob3VsZCBiZSBhbHdheXMgYXBwbGllZCB0byB0aGUgZmluYWwgKi8KKwkvKiAgIHNldHRpbmdzIGluIEFDVElWRSBCU1Mgd2l0aG91dCBjb21wcm9taXNpbmcgd2l0aCB0aGUgQlNTIGhvbGRlci4gKi8KKwkvKiAgIE9uY2UgaW5pdGlhbGl6ZWQsIHVzZXIgY29uZmlndXJhdGlvbiBjYW4gb25seSBiZSBjaGFuZ2VkIHZpYSBPSURfeHh4ICovCisJdTggUnNzaVRyaWdnZXI7CisJdTggUnNzaVRyaWdnZXJNb2RlOwkvKiBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCBvciBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xEICovCisJdTE2IERlZmF1bHRMaXN0ZW5Db3VudDsJLyogZGVmYXVsdCBsaXN0ZW4gY291bnQ7ICovCisJdW5zaWduZWQgbG9uZyBXaW5kb3dzUG93ZXJNb2RlOwkvKiBQb3dlciBtb2RlIGZvciBBQyBwb3dlciAqLworCXVuc2lnbmVkIGxvbmcgV2luZG93c0JhdHRlcnlQb3dlck1vZGU7CS8qIFBvd2VyIG1vZGUgZm9yIGJhdHRlcnkgaWYgZXhpc3RzICovCisJQk9PTEVBTiBiV2luZG93c0FDQ0FNRW5hYmxlOwkvKiBFbmFibGUgQ0FNIHBvd2VyIG1vZGUgd2hlbiBBQyBvbiAqLworCUJPT0xFQU4gYkF1dG9SZWNvbm5lY3Q7CS8qIFNldCB0byBUUlVFIHdoZW4gc2V0dGluZyBPSURfODAyXzExX1NTSUQgd2l0aCBubyBtYXRjaGluZyBCU1NJRCAqLworCXVuc2lnbmVkIGxvbmcgV2luZG93c1Bvd2VyUHJvZmlsZTsJLyogV2luZG93cyBwb3dlciBwcm9maWxlLCBmb3IgTkRJUzUuMSBQblAgKi8KIAotCS8vIE1JQjppZWVlODAyZG90MTEuZG90MTFzbXQoMSkuZG90MTFTdGF0aW9uQ29uZmlnVGFibGUoMSkKLQlVU0hPUlQgICAgICBQc207ICAgICAgICAgICAgICAgICAgLy8gcG93ZXIgbWFuYWdlbWVudCBtb2RlICAgKFBXUl9BQ1RJVkV8UFdSX1NBVkUpCi0JVVNIT1JUICAgICAgRGlzYXNzb2NSZWFzb247Ci0JVUNIQVIgICAgICAgRGlzYXNzb2NTdGFbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgICBEZWF1dGhSZWFzb247Ci0JVUNIQVIgICAgICAgRGVhdXRoU3RhW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgQXV0aEZhaWxSZWFzb247Ci0JVUNIQVIgICAgICAgQXV0aEZhaWxTdGFbTUFDX0FERFJfTEVOXTsKKwkvKiBNSUI6aWVlZTgwMmRvdDExLmRvdDExc210KDEpLmRvdDExU3RhdGlvbkNvbmZpZ1RhYmxlKDEpICovCisJdTE2IFBzbTsJCS8qIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAgIChQV1JfQUNUSVZFfFBXUl9TQVZFKSAqLworCXUxNiBEaXNhc3NvY1JlYXNvbjsKKwl1OCBEaXNhc3NvY1N0YVtNQUNfQUREUl9MRU5dOworCXUxNiBEZWF1dGhSZWFzb247CisJdTggRGVhdXRoU3RhW01BQ19BRERSX0xFTl07CisJdTE2IEF1dGhGYWlsUmVhc29uOworCXU4IEF1dGhGYWlsU3RhW01BQ19BRERSX0xFTl07CiAKLQlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOyAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlPcmlnV2VwU3RhdHVzOwkvLyBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRAorCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSIFByaXZhY3lGaWx0ZXI7CS8qIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYICovCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBBdXRoTW9kZTsJLyogVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQgKi8KKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIE9yaWdXZXBTdGF0dXM7CS8qIE9yaWdpbmFsIHdlcCBzdGF0dXMgc2V0IGZyb20gT0lEICovCiAKLQkvLyBBZGQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlIGZvciBXUEEyL1dQQSBtb2RlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCUdyb3VwQ2lwaGVyOwkJLy8gTXVsdGljYXN0IGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlQYWlyQ2lwaGVyOwkJCS8vIFVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JQk9PTEVBTgkJCQkJCQkJYk1peENpcGhlcjsJCQkvLyBJbmRpY2F0ZSBjdXJyZW50IFBhaXIgJiBHcm91cCB1c2UgZGlmZmVyZW50IGNpcGhlciBzdWl0ZXMKLQlVU0hPUlQJCQkJCQkJCVJzbkNhcGFiaWxpdHk7CisJLyogQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZSAqLworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIEdyb3VwQ2lwaGVyOwkvKiBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlICovCisJTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgUGFpckNpcGhlcjsJLyogVW5pY2FzdCBjaXBoZXIgc3VpdGUgKi8KKwlCT09MRUFOIGJNaXhDaXBoZXI7CS8qIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcyAqLworCXUxNiBSc25DYXBhYmlsaXR5OwogCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7CisJTkRJU184MDJfMTFfV0VQX1NUQVRVUyBHcm91cEtleVdlcFN0YXR1czsKIAotCVVDSEFSCQlQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCi0JVUNIQVIgICAgICAgUFRLWzY0XTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBUSwotCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCi0JQlNTSURfSU5GTwlTYXZlZFBNS1tQTUtJRF9OT107Ci0JVUlOVAkJU2F2ZWRQTUtOdW07CQkJLy8gU2F2ZWQgUE1LSUQgbnVtYmVyCisJdTggV3BhUGFzc1BocmFzZVs2NF07CS8qIFdQQSBQU0sgcGFzcyBwaHJhc2UgKi8KKwl1MzIgV3BhUGFzc1BocmFzZUxlbjsJLyogdGhlIGxlbmd0aCBvZiBXUEEgUFNLIHBhc3MgcGhyYXNlICovCisJdTggUE1LWzMyXTsJCS8qIFdQQSBQU0sgbW9kZSBQTUsgKi8KKwl1OCBQVEtbNjRdOwkJLyogV1BBIFBTSyBtb2RlIFBUSyAqLworCXU4IEdUS1szMl07CQkvKiBHVEsgZnJvbSBhdXRoZW50aWNhdG9yICovCisJc3RydWN0IHJ0X2Jzc2lkX2luZm8gU2F2ZWRQTUtbUE1LSURfTk9dOworCXUzMiBTYXZlZFBNS051bTsJLyogU2F2ZWQgUE1LSUQgbnVtYmVyICovCiAKLQlVQ0hBUgkJRGVmYXVsdEtleUlkOworCXU4IERlZmF1bHRLZXlJZDsKIAorCS8qIFdQQSA4MDIuMXggcG9ydCBjb250cm9sLCBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCwgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEICovCisJdTggUG9ydFNlY3VyZWQ7CiAKLQkvLyBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRAotCVVDSEFSICAgICAgIFBvcnRTZWN1cmVkOworCS8qIEZvciBXUEEgY291bnRlcm1lYXN1cmVzICovCisJdW5zaWduZWQgbG9uZyBMYXN0TWljRXJyb3JUaW1lOwkvKiByZWNvcmQgbGFzdCBNSUMgZXJyb3IgdGltZSAqLworCXVuc2lnbmVkIGxvbmcgTWljRXJyQ250OwkvKiBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLiAqLworCUJPT0xFQU4gYkJsb2NrQXNzb2M7CS8qIEJsb2NrIGFzc29jaWF0ZSBhdHRlbXB0IGZvciA2MCBzZWNvbmRzIGFmdGVyIGNvdW50ZXIgbWVhc3VyZSBvY2N1cnJlZC4gKi8KKwkvKiBGb3IgV1BBLVBTSyBzdXBwbGljYW50IHN0YXRlICovCisJV1BBX1NUQVRFIFdwYVN0YXRlOwkvKiBEZWZhdWx0IGlzIFNTX05PVFVTRSBhbmQgaGFuZGxlZCBieSBtaWNyb3NvZnQgODAyLjF4ICovCisJdTggUmVwbGF5Q291bnRlcls4XTsKKwl1OCBBTm9uY2VbMzJdOwkvKiBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXJoZW50aWNhdG9yICovCisJdTggU05vbmNlWzMyXTsJLyogU05vbmNlIGZvciBXUEEtUFNLICovCiAKLQkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcwotCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKLQlVTE9ORyAgICAgICBNaWNFcnJDbnQ7ICAgICAgICAgIC8vIFNob3VsZCBiZSAwLCAxLCAyLCB0aGVuIHJlc2V0IHRvIHplcm8gKGFmdGVyIGRpc2Fzc29pY2lhdGlvbikuCi0JQk9PTEVBTiAgICAgYkJsb2NrQXNzb2M7ICAgICAgICAvLyBCbG9jayBhc3NvY2lhdGUgYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcyBhZnRlciBjb3VudGVyIG1lYXN1cmUgb2NjdXJyZWQuCi0JLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQotCVdQQV9TVEFURSAgIFdwYVN0YXRlOyAgICAgICAgICAgLy8gRGVmYXVsdCBpcyBTU19OT1RVU0UgYW5kIGhhbmRsZWQgYnkgbWljcm9zb2Z0IDgwMi4xeAotCVVDSEFSICAgICAgIFJlcGxheUNvdW50ZXJbOF07Ci0JVUNIQVIgICAgICAgQU5vbmNlWzMyXTsgICAgICAgICAvLyBBTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXJoZW50aWNhdG9yCi0JVUNIQVIgICAgICAgU05vbmNlWzMyXTsgICAgICAgICAvLyBTTm9uY2UgZm9yIFdQQS1QU0sKKwl1OCBMYXN0U05SMDsJCS8qIGxhc3QgcmVjZWl2ZWQgQkVBQ09OJ3MgU05SICovCisJdTggTGFzdFNOUjE7CQkvKiBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiBmb3IgMm5kICBhbnRlbm5hICovCisJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlIFJzc2lTYW1wbGU7CisJdW5zaWduZWQgbG9uZyBOdW1PZkF2Z1Jzc2lTYW1wbGU7CiAKLQlVQ0hBUiAgICAgICBMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIKLQlVQ0hBUiAgICAgICBMYXN0U05SMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiBmb3IgMm5kICBhbnRlbm5hCi0JUlNTSV9TQU1QTEUgUnNzaVNhbXBsZTsKLQlVTE9ORyAgICAgICBOdW1PZkF2Z1Jzc2lTYW1wbGU7CisJdW5zaWduZWQgbG9uZyBMYXN0QmVhY29uUnhUaW1lOwkvKiBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBCRUFDT04gUlggdGltZSAqLworCXVuc2lnbmVkIGxvbmcgTGFzdDExYkJlYWNvblJ4VGltZTsJLyogT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFCIEJFQUNPTiBSWCB0aW1lICovCisJdW5zaWduZWQgbG9uZyBMYXN0MTFnQmVhY29uUnhUaW1lOwkvKiBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUcgQkVBQ09OIFJYIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nIExhc3QyME5CZWFjb25SeFRpbWU7CS8qIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDIwTUh6IE4gQkVBQ09OIFJYIHRpbWUgKi8KIAotCVVMT05HICAgICAgIExhc3RCZWFjb25SeFRpbWU7ICAgICAvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBCRUFDT04gUlggdGltZQotCVVMT05HICAgICAgIExhc3QxMWJCZWFjb25SeFRpbWU7ICAvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAxMUIgQkVBQ09OIFJYIHRpbWUKLQlVTE9ORwkJTGFzdDExZ0JlYWNvblJ4VGltZTsJLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFHIEJFQUNPTiBSWCB0aW1lCi0JVUxPTkcJCUxhc3QyME5CZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDIwTUh6IE4gQkVBQ09OIFJYIHRpbWUKKwl1bnNpZ25lZCBsb25nIExhc3RTY2FuVGltZTsJLyogUmVjb3JkIGxhc3Qgc2NhbiB0aW1lIGZvciBpc3N1ZSBCU1NJRF9TQ0FOX0xJU1QgKi8KKwl1bnNpZ25lZCBsb25nIFNjYW5DbnQ7CQkvKiBTY2FuIGNvdW50cyBzaW5jZSBtb3N0IHJlY2VudCBTU0lELCBCU1NJRCwgU0NBTiBPSUQgcmVxdWVzdCAqLworCUJPT0xFQU4gYlN3UmFkaW87CS8qIFNvZnR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbiAqLworCUJPT0xFQU4gYkh3UmFkaW87CS8qIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbiAqLworCUJPT0xFQU4gYlJhZGlvOwkJLyogUmFkaW8gc3RhdGUsIEFuZCBvZiBTdyAmIEh3IHJhZGlvIHN0YXRlICovCisJQk9PTEVBTiBiSGFyZHdhcmVSYWRpbzsJLyogSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkICovCisJQk9PTEVBTiBiU2hvd0hpZGRlblNTSUQ7CS8qIFNob3cgYWxsIGtub3duIFNTSUQgaW4gU1NJRCBsaXN0IGdldCBvcGVyYXRpb24gKi8KIAotCVVMT05HICAgICAgIExhc3RTY2FuVGltZTsgICAgICAgLy8gUmVjb3JkIGxhc3Qgc2NhbiB0aW1lIGZvciBpc3N1ZSBCU1NJRF9TQ0FOX0xJU1QKLQlVTE9ORyAgICAgICBTY2FuQ250OyAgICAgICAgICAgIC8vIFNjYW4gY291bnRzIHNpbmNlIG1vc3QgcmVjZW50IFNTSUQsIEJTU0lELCBTQ0FOIE9JRCByZXF1ZXN0Ci0JQk9PTEVBTiAgICAgYlN3UmFkaW87ICAgICAgICAgICAvLyBTb2Z0d2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KLQlCT09MRUFOICAgICBiSHdSYWRpbzsgICAgICAgICAgIC8vIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gT24vT2ZmLCBUUlVFOiBPbgotCUJPT0xFQU4gICAgIGJSYWRpbzsgICAgICAgICAgICAgLy8gUmFkaW8gc3RhdGUsIEFuZCBvZiBTdyAmIEh3IHJhZGlvIHN0YXRlCi0JQk9PTEVBTiAgICAgYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKLQlCT09MRUFOICAgICBiU2hvd0hpZGRlblNTSUQ7ICAgIC8vIFNob3cgYWxsIGtub3duIFNTSUQgaW4gU1NJRCBsaXN0IGdldCBvcGVyYXRpb24KLSNpZmRlZiBSVDI4NjAKLSAgICBCT09MRUFOCQlBZGhvY0JPbmx5Sm9pbmVkOwkvLyBJbmRpY2F0ZSBBZGhvYyBCIEpvaW4uCi0gICAgQk9PTEVBTgkJQWRob2NCR0pvaW5lZDsJCS8vIEluZGljYXRlIEFkaG9jIEIvRyBKb2luLgotICAgIEJPT0xFQU4JCUFkaG9jMjBOSm9pbmVkOwkJLy8gSW5kaWNhdGUgQWRob2MgMjBNSHogTiBKb2luLgotI2VuZGlmCi0JLy8gTmV3IGZvciBXUEEsIHdpbmRvd3Mgd2FudCB1cyB0byBrZWVwIGFzc29jaWF0aW9uIGluZm9ybWF0aW9uIGFuZAotCS8vIEZpeGVkIElFcyBmcm9tIGxhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2UKLQlORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTiAgICAgQXNzb2NJbmZvOwotCVVTSE9SVCAgICAgICBSZXFWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIgICAgICAgUmVxVmFySUVzW01BWF9WSUVfTEVOXTsJCS8vIFRoZSBjb250ZW50IHNhdmVkIGhlcmUgc2hvdWxkIGJlIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCVVTSE9SVCAgICAgICBSZXNWYXJJRUxlbjsgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIgICAgICAgUmVzVmFySUVzW01BWF9WSUVfTEVOXTsKKwkvKiBOZXcgZm9yIFdQQSwgd2luZG93cyB3YW50IHVzIHRvIGtlZXAgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gYW5kICovCisJLyogRml4ZWQgSUVzIGZyb20gbGFzdCBhc3NvY2lhdGlvbiByZXNwb25zZSAqLworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV9hc3NvY2lhdGlvbl9pbmZvcm1hdGlvbiBBc3NvY0luZm87CisJdTE2IFJlcVZhcklFTGVuOwkvKiBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGggKi8KKwl1OCBSZXFWYXJJRXNbTUFYX1ZJRV9MRU5dOwkvKiBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gKi8KKwl1MTYgUmVzVmFySUVMZW47CS8qIExlbmd0aCBvZiBuZXh0IFZJRSBpbmNsdWRlIEVJRCAmIExlbmd0aCAqLworCXU4IFJlc1ZhcklFc1tNQVhfVklFX0xFTl07CiAKLQlVQ0hBUiAgICAgICBSU05JRV9MZW47Ci0JVUNIQVIgICAgICAgUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOwkvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKwl1OCBSU05JRV9MZW47CisJdTggUlNOX0lFW01BWF9MRU5fT0ZfUlNOSUVdOwkvKiBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gKi8KIAotCS8vIE5ldyB2YXJpYWJsZXMgdXNlZCBmb3IgQ0NYIDEuMAotCUJPT0xFQU4gICAgICAgICAgICAgYkNraXBPbjsKLQlCT09MRUFOICAgICAgICAgICAgIGJDa2lwQ21pY09uOwotCVVDSEFSICAgICAgICAgICAgICAgQ2tpcEZsYWc7Ci0JVUNIQVIgICAgICAgICAgICAgICBHSVZbM107ICAvL2ZvciBDQ1ggaXYKLQlVQ0hBUiAgICAgICAgICAgICAgIFJ4U0VRWzRdOwotCVVDSEFSICAgICAgICAgICAgICAgVHhTRVFbNF07Ci0JVUNIQVIgICAgICAgICAgICAgICBDS0lQTUlDWzRdOwotCVVDSEFSICAgICAgICAgICAgICAgTGVhcEF1dGhNb2RlOwotCUxFQVBfQVVUSF9JTkZPICAgICAgTGVhcEF1dGhJbmZvOwotCVVDSEFSICAgICAgICAgICAgICAgSGFzaFB3ZFsxNl07Ci0JVUNIQVIgICAgICAgICAgICAgICBOZXR3b3JrQ2hhbGxlbmdlWzhdOwotCVVDSEFSICAgICAgICAgICAgICAgTmV0d29ya0NoYWxsZW5nZVJlc3BvbnNlWzI0XTsKLQlVQ0hBUiAgICAgICAgICAgICAgIFBlZXJDaGFsbGVuZ2VbOF07CisJdW5zaWduZWQgbG9uZyBDTEJ1c3lCeXRlczsJLyogU2F2ZSB0aGUgdG90YWwgYnl0ZXMgcmVjZWl2ZWQgZHVybmluZyBjaGFubmVsIGxvYWQgc2NhbiB0aW1lICovCisJdTE2IFJQSURlbnNpdHlbOF07CS8qIEFycmF5IGZvciBSUEkgZGVuc2l0eSBjb2xsZWN0aW9uICovCiAKLQlVQ0hBUiAgICAgICAgICAgICAgIFBlZXJDaGFsbGVuZ2VSZXNwb25zZVsyNF07Ci0JVUNIQVIgICAgICAgICAgICAgICBTZXNzaW9uS2V5WzE2XTsgLy9OZXR3b3JrIHNlc3Npb24ga2V5cyAoTlNLKQotCVJBTElOS19USU1FUl9TVFJVQ1QgTGVhcEF1dGhUaW1lcjsKLQlST0dVRUFQX1RBQkxFICAgICAgIFJvZ3VlQXBUYWI7ICAgLy9DaXNjbyBDQ1gxIFJvZ3VlIEFQIERldGVjdGlvbgorCXU4IFJNUmVxQ250OwkJLyogTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuICovCisJdTggQ3VycmVudFJNUmVxSWR4OwkvKiBOdW1iZXIgb2YgbWVhc3VyZW1lbnQgcmVxdWVzdCBzYXZlZC4gKi8KKwlCT09MRUFOIFBhcmFsbGVsUmVxOwkvKiBQYXJhbGxlbCBtZWFzdXJlbWVudCwgb25seSBvbmUgcmVxdWVzdCBwZXJmb3JtZWQsICovCisJLyogSXQgbXVzdCBiZSB0aGUgc2FtZSBjaGFubmVsIHdpdGggbWF4aW11bSBkdXJhdGlvbiAqLworCXUxNiBQYXJhbGxlbER1cmF0aW9uOwkvKiBNYXhpbXVtIGR1cmF0aW9uIGZvciBwYXJhbGxlbCBtZWFzdXJlbWVudCAqLworCXU4IFBhcmFsbGVsQ2hhbm5lbDsJLyogT25seSBvbmUgY2hhbm5lbCB3aXRoIHBhcmFsbGVsIG1lYXN1cmVtZW50ICovCisJdTE2IElBUFBUb2tlbjsJLyogSUFQUCBkaWFsb2cgdG9rZW4gKi8KKwkvKiBIYWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3RvZ3JhbSBwYXJhbWV0ZXJzICovCisJdTggTkhGYWN0b3I7CQkvKiBQYXJhbWV0ZXIgZm9yIE5vaXNlIGhpc3RvZ3JhbSAqLworCXU4IENMRmFjdG9yOwkJLyogUGFyYW1ldGVyIGZvciBjaGFubmVsIGxvYWQgKi8KIAotCS8vIE5ldyBjb250cm9sIGZsYWdzIGZvciBDQ1gKLQlDQ1hfQ09OVFJPTCAgICAgICAgIENDWENvbnRyb2w7ICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgYWRtaW5pc3RyYXRpb24gc3RhdGUKLQlCT09MRUFOICAgICAgICAgICAgIENDWEVuYWJsZTsgICAgICAgICAgICAgICAgICAvLyBBY3R1YWwgQ0NYIHN0YXRlCi0JVUNIQVIgICAgICAgICAgICAgICBDQ1hTY2FuQ2hhbm5lbDsgICAgICAgICAgICAgLy8gU2VsZWN0ZWQgY2hhbm5lbCBmb3IgQ0NYIGJlYWNvbiByZXF1ZXN0Ci0JVVNIT1JUICAgICAgICAgICAgICBDQ1hTY2FuVGltZTsgICAgICAgICAgICAgICAgLy8gVGltZSBvdXQgdG8gd2FpdCBmb3IgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotCVVDSEFSICAgICAgICAgICAgICAgQ0NYUmVxVHlwZTsgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgcHJvY2Vzc2luZyBDQ1ggcmVxdWVzdCB0eXBlCi0JQlNTX1RBQkxFICAgICAgICAgICBDQ1hCc3NUYWI7ICAgICAgICAgICAgICAgICAgLy8gQlNTIFRhYmxlCi0JVUNIQVIgICAgICAgICAgICAgICBGcmFtZVJlcG9ydEJ1ZlsyMDQ4XTsgICAgICAgLy8gQnVmZmVyIGZvciBjcmVhdGluZyBmcmFtZSByZXBvcnQKLQlVU0hPUlQgICAgICAgICAgICAgIEZyYW1lUmVwb3J0TGVuOyAgICAgICAgICAgICAvLyBDdXJyZW50IEZyYW1lIHJlcG9ydCBsZW5ndGgKLQlVTE9ORyAgICAgICAgICAgICAgIENMQnVzeUJ5dGVzOyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUKLQlVU0hPUlQgICAgICAgICAgICAgIFJQSURlbnNpdHlbOF07ICAgICAgICAgICAgICAvLyBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbgotCS8vIFN0YXJ0IGFkZHJlc3Mgb2YgZWFjaCBCU1MgdGFibGUgd2l0aGluIEZyYW1lUmVwb3J0QnVmCi0JLy8gSXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIHRoZSBSeFBvd2VyIG9mIHRoZSBjb3JyZXNwb25kaW5nIEJzcwotCVVTSE9SVCAgICAgICAgICAgICAgQnNzUmVwb3J0T2Zmc2V0W01BWF9MRU5fT0ZfQlNTX1RBQkxFXTsKLQlVU0hPUlQgICAgICAgICAgICAgIEJlYWNvblRva2VuOyAgICAgICAgICAgICAgICAvLyBUb2tlbiBmb3IgYmVhY29uIHJlcG9ydAotCVVMT05HICAgICAgICAgICAgICAgTGFzdEJzc0luZGV4OyAgICAgICAgICAgICAgIC8vIE1vc3QgY3VycmVudCByZXBvcnRlZCBCc3MgaW5kZXgKLQlSTV9SRVFVRVNUX0FDVElPTiAgIE1lYXN1cmVtZW50UmVxdWVzdFsxNl07ICAgICAvLyBTYXZlZCBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JVUNIQVIgICAgICAgICAgICAgICBSTVJlcUNudDsgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCi0JVUNIQVIgICAgICAgICAgICAgICBDdXJyZW50Uk1SZXFJZHg7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCi0JQk9PTEVBTiAgICAgICAgICAgICBQYXJhbGxlbFJlcTsgICAgICAgICAgICAgICAgLy8gUGFyYWxsZWwgbWVhc3VyZW1lbnQsIG9ubHkgb25lIHJlcXVlc3QgcGVyZm9ybWVkLAotCQkJCQkJCQkJCQkJCS8vIEl0IG11c3QgYmUgdGhlIHNhbWUgY2hhbm5lbCB3aXRoIG1heGltdW0gZHVyYXRpb24KLQlVU0hPUlQgICAgICAgICAgICAgIFBhcmFsbGVsRHVyYXRpb247ICAgICAgICAgICAvLyBNYXhpbXVtIGR1cmF0aW9uIGZvciBwYXJhbGxlbCBtZWFzdXJlbWVudAotCVVDSEFSICAgICAgICAgICAgICAgUGFyYWxsZWxDaGFubmVsOyAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYW5uZWwgd2l0aCBwYXJhbGxlbCBtZWFzdXJlbWVudAotCVVTSE9SVCAgICAgICAgICAgICAgSUFQUFRva2VuOyAgICAgICAgICAgICAgICAgIC8vIElBUFAgZGlhbG9nIHRva2VuCi0JVUNIQVIgICAgICAgICAgICAgICBDQ1hRb3NFQ1dNaW47ICAgICAgICAgICAgICAgLy8gQ2lzY28gUU9TIEVDV01pbiBmb3IgQUMgMAotCVVDSEFSICAgICAgICAgICAgICAgQ0NYUW9zRUNXTWF4OyAgICAgICAgICAgICAgIC8vIENpc2NvIFFPUyBFQ1dNYXggZm9yIEFDIDAKLQkvLyBIYWNrIGZvciBjaGFubmVsIGxvYWQgYW5kIG5vaXNlIGhpc3RvZ3JhbSBwYXJhbWV0ZXJzCi0JVUNIQVIgICAgICAgICAgICAgICBOSEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBOb2lzZSBoaXN0b2dyYW0KLQlVQ0hBUiAgICAgICAgICAgICAgIENMRmFjdG9yOyAgICAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXIgZm9yIGNoYW5uZWwgbG9hZAorCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXI7CisJQk9PTEVBTiBTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmc7CiAKLQlVQ0hBUiAgICAgICAgICAgICAgIEtSS1sxNl07ICAgICAgICAvL0tleSBSZWZyZXNoIEtleS4KLQlVQ0hBUiAgICAgICAgICAgICAgIEJUS1szMl07ICAgICAgICAvL0Jhc2UgVHJhbnNpZW50IEtleQotCUJPT0xFQU4gICAgICAgICAgICAgQ0NLTUxpbmtVcEZsYWc7Ci0JVUxPTkcgICAgICAgICAgICAgICBDQ0tNUk47ICAgIC8vKFJlKUFzc29jaWF0aW9uIHJlcXVlc3QgbnVtYmVyLgotCUxBUkdFX0lOVEVHRVIgICAgICAgQ0NLTUJlYWNvbkF0Sm9pblRpbWVTdGFtcDsgIC8vVFNGIHRpbWVyIGZvciBSZS1hc3NvY2FpdGUgdG8gdGhlIG5ldyBBUAotCVVDSEFSICAgICAgICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0OyAgICAgIC8vaW4gZEJtCi0JVUNIQVIgICAgICAgICAgICAgICBBaXJvbmV0SVBBZGRyZXNzWzRdOyAgICAgICAgLy9lZy4gMTkyLjE2OC4xLjEKLQlCT09MRUFOICAgICAgICAgICAgIENDWEFkamFjZW50QVBSZXBvcnRGbGFnOyAgICAvL2ZsYWcgZm9yIGRldGVybWluaW5nIHJlcG9ydCBBc3NvYyBMb3N0IHRpbWUKLQlDSEFSICAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBTc2lkW01BWF9MRU5fT0ZfU1NJRF07IC8vQWRqYWNlbnQgQVAncyBTU0lEIHJlcG9ydAotCVVDSEFSICAgICAgICAgICAgICAgQ0NYQWRqYWNlbnRBUFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCi0JVUNIQVIgICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQQnNzaWRbTUFDX0FERFJfTEVOXTsgICAgICAgICAvL0FkamFjZW50IEFQJ3MgQlNTSUQgcmVwb3J0Ci0JVVNIT1JUICAgICAgICAgICAgICBDQ1hBZGphY2VudEFQQ2hhbm5lbDsKLQlVTE9ORyAgICAgICAgICAgICAgIENDWEFkamFjZW50QVBMaW5rRG93blRpbWU7ICAvL2ZvciBTcGVjIFMzMi4KKwl1OCBEdGltQ291bnQ7CS8qIDAuLiBEdGltUGVyaW9kLTEgKi8KKwl1OCBEdGltUGVyaW9kOwkvKiBkZWZhdWx0ID0gMyAqLwogCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lcjsKLQlCT09MRUFOCQkJCVN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZzsKKwkvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisJLyogVGhpcyBpcyBvbmx5IGZvciBXSFFMIHRlc3QuICovCisJQk9PTEVBTiBXaHFsVGVzdDsKKwkvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCiAKLQlVQ0hBUiAgICAgICAgICAgCUR0aW1Db3VudDsgICAgICAvLyAwLi4gRHRpbVBlcmlvZC0xCi0JVUNIQVIgICAgICAgICAgIAlEdGltUGVyaW9kOyAgICAgLy8gZGVmYXVsdCA9IDMKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFdwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyOworCS8qIEZhc3QgUm9hbWluZyAqLworCUJPT0xFQU4gYkF1dG9Sb2FtaW5nOwkvKiAwOmRpc2FibGUgYXV0byByb2FtaW5nIGJ5IFJTU0ksIDE6ZW5hYmxlIGF1dG8gcm9hbWluZyBieSBSU1NJICovCisJY2hhciBkQm1Ub1JvYW07CQkvKiB0aGUgY29uZGl0aW9uIHRvIHJvYW0gd2hlbiByZWNlaXZpbmcgUnNzaSBsZXNzIHRoYW4gdGhpcyB2YWx1ZS4gSXQncyBuZWdhdGl2ZSB2YWx1ZS4gKi8KIAotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBUaGlzIGlzIG9ubHkgZm9yIFdIUUwgdGVzdC4KLQlCT09MRUFOCQkJCVdocWxUZXN0OwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlCT09MRUFOIElFRUU4MDIxWDsKKwlCT09MRUFOIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOworCXN0cnVjdCBydF9jaXBoZXJfa2V5IERlc2lyZVNoYXJlZEtleVs0XTsJLyogUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cyAqLworCXU4IERlc2lyZVNoYXJlZEtleUlkOwogCi0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBXcGFEaXNhc3NvY0FuZEJsb2NrQXNzb2NUaW1lcjsKLSAgICAvLyBGYXN0IFJvYW1pbmcKLQlCT09MRUFOCQkgICAgICAgIGJGYXN0Um9hbWluZzsgICAgICAgLy8gMDpkaXNhYmxlIGZhc3Qgcm9hbWluZywgMTplbmFibGUgZmFzdCByb2FtaW5nCi0JQ0hBUgkJICAgICAgICBkQm1Ub1JvYW07ICAgICAgICAgIC8vIHRoZSBjb25kaXRpb24gdG8gcm9hbSB3aGVuIHJlY2VpdmluZyBSc3NpIGxlc3MgdGhhbiB0aGlzIHZhbHVlLiBJdCdzIG5lZ2F0aXZlIHZhbHVlLgorCS8qIDA6IGRyaXZlciBpZ25vcmVzIHdwYV9zdXBwbGljYW50ICovCisJLyogMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24gKi8KKwkvKiAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycyAqLworCXU4IFdwYVN1cHBsaWNhbnRVUDsKKwl1OCBXcGFTdXBwbGljYW50U2NhbkNvdW50OworCUJPT0xFQU4gYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudDsKIAotICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjFYOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXM7Ci0gICAgQ0lQSEVSX0tFWQkgICAgICAgIERlc2lyZVNoYXJlZEtleVs0XTsJLy8gUmVjb3JkIHVzZXIgZGVzaXJlZCBXRVAga2V5cwotICAgIFVDSEFSICAgICAgICAgICAgICAgRGVzaXJlU2hhcmVkS2V5SWQ7CisJY2hhciBkZXZfbmFtZVsxNl07CisJdTE2IE9yaURldlR5cGU7CiAKLSAgICAvLyAwOiBkcml2ZXIgaWdub3JlcyB3cGFfc3VwcGxpY2FudAotICAgIC8vIDE6IHdwYV9zdXBwbGljYW50IGluaXRpYXRlcyBzY2FubmluZyBhbmQgQVAgc2VsZWN0aW9uCi0gICAgLy8gMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFdwYVN1cHBsaWNhbnRVUDsKLQlVQ0hBUgkJCQlXcGFTdXBwbGljYW50U2NhbkNvdW50OworCUJPT0xFQU4gYlRHbldpZmlUZXN0OworCUJPT0xFQU4gYlNjYW5SZXFJc0Zyb21XZWJVSTsKIAotICAgIENIQVIgICAgICAgICAgICAgICAgZGV2X25hbWVbMTZdOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgT3JpRGV2VHlwZTsKKwlIVFRSQU5TTUlUX1NFVFRJTkcgSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsJLyogRm9yIHRyYW5zbWl0IHBoeSBzZXR0aW5nIGluIFRYV0kuICovCisJREVTSVJFRF9UUkFOU01JVF9TRVRUSU5HIERlc2lyZWRUcmFuc21pdFNldHRpbmc7CisJc3RydWN0IHJ0X2h0X3BoeV9pbmZvIERlc2lyZWRIdFBoeUluZm87CisJQk9PTEVBTiBiQXV0b1R4UmF0ZVN3aXRjaDsKIAotICAgIEJPT0xFQU4gICAgICAgICAgICAgYlRHbldpZmlUZXN0OwotCUJPT0xFQU4JCQkgICAgYlNjYW5SZXFJc0Zyb21XZWJVSTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwl1OCBCQlBSMzsKKwkvKiBQUyBDb250cm9sIGhhcyAyIG1lYW5pbmdzIGZvciBhZHZhbmNlZCBwb3dlciBzYXZlIGZ1bmN0aW9uLiAqLworCS8qIDEuIEVuYWJsZVBTaW5JZGxlIDogV2hlbiBubyBjb25uZWN0aW9uLCBhbHdheXMgcmFkaW8gb2ZmIGV4Y2VwdCBuZWVkIHRvIGRvIHNpdGUgc3VydmV5LiAqLworCS8qIDIuIEVuYWJsZU5ld1BTICA6IHdpbGwgc2F2ZSBtb3JlIGN1cnJlbnQgaW4gc2xlZXAgb3IgcmFkaW8gb2ZmIG1vZGUuICovCisJUFNfQ09OVFJPTCBQU0NvbnRyb2w7CisjZW5kaWYJCQkJLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQlIVFRSQU5TTUlUX1NFVFRJTkcJCQkJSFRQaHlNb2RlLCBNYXhIVFBoeU1vZGUsIE1pbkhUUGh5TW9kZTsvLyBGb3IgdHJhbnNtaXQgcGh5IHNldHRpbmcgaW4gVFhXSS4KLQlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7Ci0JUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87Ci0JQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKKwlCT09MRUFOIGJBdXRvQ29ubmVjdEJ5QnNzaWQ7CisJdW5zaWduZWQgbG9uZyBCZWFjb25Mb3N0VGltZTsJLyogc2Vjb25kcyAqLworCUJPT0xFQU4gYkZvcmNlVHhCdXJzdDsJLyogMTogZm9yY2UgZW5ibGUgVFggUEFDS0VUIEJVUlNULCAwOiBkaXNhYmxlICovCit9OwogCi0jaWZkZWYgUlQyODYwCi0gICAgVUNIQVIgICAgICAgQkJQUjM7Ci0jZW5kaWYKLX0gU1RBX0FETUlOX0NPTkZJRywgKlBTVEFfQURNSU5fQ09ORklHOworLyogVGhpcyBkYXRhIHN0cnVjdHVyZSBrZWVwIHRoZSBjdXJyZW50IGFjdGl2ZSBCU1MvSUJTUydzIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGlzIFNUQSAqLworLyogaGFkIGFncmVlZCB1cG9uIGpvaW5pbmcgdGhlIG5ldHdvcmsuIFdoaWNoIG1lYW5zIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzdWFsbHkgZGVjaWRlZCAqLworLyogYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVycmUgKi8KKy8qIGlzIHZhbGlkIG9ubHkgd2hlbiBlaXRoZXIgQURIT0NfT04ocEFkKSBvciBJTkZSQV9PTihwQWQpIGlzIFRSVUUuICovCisvKiBOb3JtYWxseSwgYWZ0ZXIgU0NBTiBvciBmYWlsZWQgcm9hbWluZyBhdHRlbXB0cywgd2UgbmVlZCB0byByZWNvdmVyIGJhY2sgdG8gKi8KKy8qIHRoZSBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncy4gKi8KK3N0cnVjdCBydF9zdGFfYWN0aXZlX2NvbmZpZyB7CisJdTE2IEFpZDsKKwl1MTYgQXRpbVdpbjsJCS8qIGluIGt1c2VjOyBJQlNTIHBhcmFtZXRlciBzZXQgZWxlbWVudCAqLworCXUxNiBDYXBhYmlsaXR5SW5mbzsKKwl1MTYgQ2ZwTWF4RHVyYXRpb247CisJdTE2IENmcFBlcmlvZDsKIAotLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBrZWVwIHRoZSBjdXJyZW50IGFjdGl2ZSBCU1MvSUJTUydzIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGlzIFNUQQotLy8gaGFkIGFncmVlZCB1cG9uIGpvaW5pbmcgdGhlIG5ldHdvcmsuIFdoaWNoIG1lYW5zIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzdWFsbHkgZGVjaWRlZAotLy8gYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVycmUKLS8vIGlzIHZhbGlkIG9ubHkgd2hlbiBlaXRoZXIgQURIT0NfT04ocEFkKSBvciBJTkZSQV9PTihwQWQpIGlzIFRSVUUuCi0vLyBOb3JtYWxseSwgYWZ0ZXIgU0NBTiBvciBmYWlsZWQgcm9hbWluZyBhdHRlbXB0cywgd2UgbmVlZCB0byByZWNvdmVyIGJhY2sgdG8KLS8vIHRoZSBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncy4KLXR5cGVkZWYgc3RydWN0IF9TVEFfQUNUSVZFX0NPTkZJRyB7Ci0JVVNIT1JUICAgICAgQWlkOwotCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgICAgICAgIC8vIGluIGt1c2VjOyBJQlNTIHBhcmFtZXRlciBzZXQgZWxlbWVudAotCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOwotCVVTSE9SVCAgICAgIENmcFBlcmlvZDsKKwkvKiBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaCAqLworCS8qIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLiAqLworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW47CisJdTggRXh0UmF0ZUxlbjsKKwkvKiBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggKi8KKwlzdHJ1Y3QgcnRfaHRfcGh5X2luZm8gU3VwcG9ydGVkUGh5SW5mbzsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eSBTdXBwb3J0ZWRIdFBoeTsKK307CiAKLQkvLyBDb3B5IHN1cHBvcnRlZCByYXRlIGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAotCS8vIEFQJ3Mgc3VwcG9ydGVkIGFuZCBleHRlbmRlZCByYXRlIHNldHRpbmdzLgotCVVDSEFSICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLQkvLyBDb3B5IHN1cHBvcnRlZCBodCBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQlSVF9IVF9QSFlfSU5GTwkJU3VwcG9ydGVkUGh5SW5mbzsKLQlSVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotfSBTVEFfQUNUSVZFX0NPTkZJRywgKlBTVEFfQUNUSVZFX0NPTkZJRzsKK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnk7CiAKLSNpZmRlZiBSVDI4NzAKLS8vIGZvciBVU0IgaW50ZXJmYWNlLCBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXkKLXR5cGVkZWYgc3RydWN0ICAgUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWSB7Ci0gICAgICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgTWFjQWRkcjsKLSAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNUYWJNYXRjaFdDSUQ7ICAgICAgICAvLyBBU0lDCi0gICAgICAgIENJUEhFUl9LRVkgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyS2V5OwotfSBSVF9BRERfUEFJUldJU0VfS0VZX0VOVFJZLCpQUlRfQUREX1BBSVJXSVNFX0tFWV9FTlRSWTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KK3N0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgeworCS8qQ2hvb3NlIDEgZnJvbSBWYWxpZEFzV0RTIGFuZCBWYWxpZEFzQ0xJICB0byB2YWxpZGl6ZS4gKi8KKwlCT09MRUFOIFZhbGlkQXNDTEk7CS8qIFN0YSBtb2RlLCBzZXQgdGhpcyBUUlVFIGFmdGVyIExpbmt1cCx0b28uICovCisJQk9PTEVBTiBWYWxpZEFzV0RTOwkvKiBUaGlzIGlzIFdEUyBFbnRyeS4gb25seSBmb3IgQVAgbW9kZS4gKi8KKwlCT09MRUFOIFZhbGlkQXNBcENsaTsJLypUaGlzIGlzIGEgQVAtQ2xpZW50IGVudHJ5LCBvbmx5IGZvciBBUCBtb2RlIHdoaWNoIGVuYWJsZSBBUC1DbGllbnQgZnVuY3Rpb25zLiAqLworCUJPT0xFQU4gVmFsaWRBc01lc2g7CisJQk9PTEVBTiBWYWxpZEFzRGxzOwkvKiBUaGlzIGlzIERMUyBFbnRyeS4gb25seSBmb3IgU1RBIG1vZGUuICovCisJQk9PTEVBTiBpc0NhY2hlZDsKKwlCT09MRUFOIGJJQW1CYWRBdGhlcm9zOwkvKiBGbGFnIGlmIHRoaXMgaXMgQXRoZXJvcyBjaGlwIHRoYXQgaGFzIElPVCBwcm9ibGVtLiAgV2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgcHJvdGVjdGlvbi4gKi8KIAotLy8gLS0tLS0tLS0tLS0gc3RhcnQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFVVEgtUlNQIFN0YXRlIE1hY2hpbmUgQXV4IGRhdGEgc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCBfQVBfTUxNRV9BVVggewotCVVDSEFSICAgICAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgICAgICAgICAgQWxnOwotCUNIQVIgICAgICAgICAgICAgICAgQ2hhbGxlbmdlW0NJUEhFUl9URVhUX0xFTl07Ci19IEFQX01MTUVfQVVYLCAqUEFQX01MTUVfQVVYOwotCi0vLyBzdHJ1Y3R1cmUgdG8gZGVmaW5lIFdQQSBHcm91cCBLZXkgUmVrZXkgSW50ZXJ2YWwKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlRfODAyXzExX1dQQV9SRUtFWSB7Ci0JVUxPTkcgUmVLZXlNZXRob2Q7ICAgICAgICAgIC8vIG1lY2hhbmlzbSBmb3IgcmVrZXlpbmc6IDA6ZGlzYWJsZSwgMTogdGltZS1iYXNlZCwgMjogcGFja2V0LWJhc2VkCi0JVUxPTkcgUmVLZXlJbnRlcnZhbDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCi19IFJUX1dQQV9SRUtFWSwqUFJUX1dQQV9SRUtFWSwgUlRfODAyXzExX1dQQV9SRUtFWSwgKlBSVF84MDJfMTFfV1BBX1JFS0VZOwotCi10eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFX0VOVFJZIHsKLQkvL0Nob29zZSAxIGZyb20gVmFsaWRBc1dEUyBhbmQgVmFsaWRBc0NMSSAgdG8gdmFsaWRpemUuCi0JQk9PTEVBTgkJVmFsaWRBc0NMSTsJCS8vIFN0YSBtb2RlLCBzZXQgdGhpcyBUUlVFIGFmdGVyIExpbmt1cCx0b28uCi0JQk9PTEVBTgkJVmFsaWRBc1dEUzsJLy8gVGhpcyBpcyBXRFMgRW50cnkuIG9ubHkgZm9yIEFQIG1vZGUuCi0JQk9PTEVBTgkJVmFsaWRBc0FwQ2xpOyAgIC8vVGhpcyBpcyBhIEFQLUNsaWVudCBlbnRyeSwgb25seSBmb3IgQVAgbW9kZSB3aGljaCBlbmFibGUgQVAtQ2xpZW50IGZ1bmN0aW9ucy4KLQlCT09MRUFOCQlWYWxpZEFzTWVzaDsKLQlCT09MRUFOCQlWYWxpZEFzRGxzOwkvLyBUaGlzIGlzIERMUyBFbnRyeS4gb25seSBmb3IgU1RBIG1vZGUuCi0JQk9PTEVBTgkJaXNDYWNoZWQ7Ci0JQk9PTEVBTgkJYklBbUJhZEF0aGVyb3M7CS8vIEZsYWcgaWYgdGhpcyBpcyBBdGhlcm9zIGNoaXAgdGhhdCBoYXMgSU9UIHByb2JsZW0uICBXZSBuZWVkIHRvIHR1cm4gb24gUlRTL0NUUyBwcm90ZWN0aW9uLgotCi0JVUNIQVIgICAgICAgICAJRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7ICAvLyBFbnF1ZXVlIEVBUG9MLVN0YXJ0IGZvciB0cmlnZ2VyaW5nIEVBUCBTTQotCS8vamFuIGZvciB3cGEKLQkvLyByZWNvcmQgd2hpY2ggZW50cnkgcmV2b2tlIE1JQyBGYWlsdXJlICwgaWYgaXQgbGVhdmVzIHRoZSBCU1MgaXRzZWxmLCBBUCB3b24ndCB1cGRhdGUgYU1JQ0ZhaWxUaW1lIE1JQgotCVVDSEFSICAgICAgICAgICBDTVRpbWVyUnVubmluZzsKLQlVQ0hBUiAgICAgICAgICAgYXBpZHg7CQkJLy8gTUJTUyBudW1iZXIKLQlVQ0hBUiAgICAgICAgICAgUlNOSUVfTGVuOwotCVVDSEFSICAgICAgICAgICBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07Ci0JVUNIQVIgICAgICAgICAgIEFOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOwotCVVDSEFSICAgICAgICAgICBSX0NvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07Ci0JVUNIQVIgICAgICAgICAgIFBUS1s2NF07Ci0JVUNIQVIgICAgICAgICAgIFJlVHJ5Q291bnRlcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICAgICAgICAgICAgICBSZXRyeVRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QJCQkJCUVucXVldWVTdGFydEZvclBTS1RpbWVyOwkvLyBBIHRpbWVyIHdoaWNoIGVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgUFNLIFNNCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0JQVBfV1BBX1NUQVRFICAgIFdwYVN0YXRlOwotCUdUS19TVEFURSAgICAgICBHVEtTdGF0ZTsKLQlVU0hPUlQgICAgICAgICAgUG9ydFNlY3VyZWQ7Ci0JTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgIFByaXZhY3lGaWx0ZXI7ICAgICAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKLQlDSVBIRVJfS0VZICAgICAgUGFpcndpc2VLZXk7Ci0JUFZPSUQgICAgICAgICAgIHBBZDsKLSAgICBJTlQJCQkJUE1LSURfQ2FjaGVJZHg7Ci0gICAgVUNIQVIJCQlQTUtJRFtMRU5fUE1LSURdOwotCi0KLQlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBQc01vZGU7Ci0JU1NUICAgICAgICAgICAgIFNzdDsKLQlBVVRIX1NUQVRFICAgICAgQXV0aFN0YXRlOyAvLyBmb3IgU0hBUkVEIEtFWSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIHVzZWQgb25seQotCUJPT0xFQU4JCQlJc1JlYXNzb2NTdGE7CS8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIHJlYXNzb2NpYXRpb24gcHJvY2VkdXJlCi0JVVNIT1JUICAgICAgICAgIEFpZDsKLQlVU0hPUlQgICAgICAgICAgQ2FwYWJpbGl0eUluZm87Ci0JVUNIQVIgICAgICAgICAgIExhc3RSc3NpOwotCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7Ci0JVUlOVDE2CQkJU3RhdGlvbktlZXBBbGl2ZUNvdW50OyAvLyB1bml0OiBzZWNvbmQKLQlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OwotCVFVRVVFX0hFQURFUiAgICBQc1F1ZXVlOwotCi0JVUlOVDMyCQkJU3RhQ29ubmVjdFRpbWU7CQkvLyB0aGUgbGl2ZSB0aW1lIG9mIHRoaXMgc3RhdGlvbiBzaW5jZSBhc3NvY2lhdGVkIHdpdGggQVAKLQotCUJPT0xFQU4JCQliU2VuZEJBUjsKLQlVU0hPUlQJCQlOb0JBRGF0YUNvdW50RG93bjsKLQotCVVJTlQzMiAgIAkJQ2FjaGVkQnVmWzE2XTsJCS8vIFVJTlQgKDQgYnl0ZXMpIGZvciBhbGlnbm1lbnQKLQlVSU5UCQkJVHhCRkNvdW50OyAvLyAzKjMKLQlVSU5UCQkJRklGT0NvdW50OwotCVVJTlQJCQlEZWJ1Z0ZJRk9Db3VudDsKLQlVSU5UCQkJRGVidWdUeENvdW50OwotICAgIEJPT0xFQU4JCQliRGxzSW5pdDsKLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vV0RTIGVudHJ5IG5lZWRzIHRoZXNlCi0vLyBydDI4NjAgYWRkIHRoaXMuIGlmIFZhbGlkQXNXRFM9PVRSVUUsIE1hdGNoV0RTVGFiSWR4IGlzIHRoZSBpbmRleCBpbiBXZHNUYWIuTWFjVGFiCi0JVUlOVAkJCU1hdGNoV0RTVGFiSWR4OwotCVVDSEFSICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlOwotCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlOwotCVVDSEFSICAgICAgICAgICBDdXJyVHhSYXRlSW5kZXg7Ci0JLy8gdG8gcmVjb3JkIHRoZSBlYWNoIFRYIHJhdGUncyBxdWFsaXR5LiAwIGlzIGJlc3QsIHRoZSBiaWdnZXIgdGhlIHdvcnNlLgotCVVTSE9SVCAgICAgICAgICBUeFF1YWxpdHlbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwotCVVJTlQzMgkJCU9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKLQlVSU5UMzIJCQlDb250aW51ZVR4RmFpbENudDsKLQlVSU5UMzIgICAgICAgICAgQ3VyclR4UmF0ZVN0YWJsZVRpbWU7IC8vICMgb2Ygc2Vjb25kIGluIGN1cnJlbnQgVFggcmF0ZQotCVVDSEFSICAgICAgICAgICBUeFJhdGVVcFBlbmFsdHk7ICAgICAgLy8gZXh0cmEgIyBvZiBzZWNvbmQgcGVuYWx0eSBkdWUgdG8gbGFzdCB1bnN0YWJsZSBjb25kaXRpb24KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OwotCUJPT0xFQU4JCQlmTGFzdFNlY0FjY29yZGluZ1JTU0k7Ci0JVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgotCUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCi0JVUxPTkcJCQlMYXN0VHhPa0NvdW50OwotCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwotCi0JLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCi0JLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQotCS8vIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgotCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24uIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAotCVVMT05HICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKLQotCUhUVFJBTlNNSVRfU0VUVElORwlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgotCi0JLy8gSFQgRVdDIE1JTU8tTiB1c2VkIHBhcmFtZXRlcnMKLQlVU0hPUlQJCVJYQkFiaXRtYXA7CS8vIGZpbGwgdG8gb24tY2hpcCAgUlhXSV9CQV9CSVRNQVNLIGluIDguMS4zUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdAotCVVTSE9SVAkJVFhCQWJpdG1hcDsJLy8gVGhpcyBiaXRtYXAgYXMgb3JpZ2luYXRvciwgb25seSBrZWVwIGluIHNvZnR3YXJlIHVzZWQgdG8gbWFyayBBTVBEVSBiaXQgaW4gVFhXSQotCVVTSE9SVAkJVFhBdXRvQkFiaXRtYXA7Ci0JVVNIT1JUCQlCQURlY2xpbmVCaXRtYXA7Ci0JVVNIT1JUCQlCQVJlY1djaWRBcnJheVtOVU1fT0ZfVElEXTsJLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiByZWNpcGllbnQgc2Vzc2lvbi4gaWYgUlhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCi0JVVNIT1JUCQlCQU9yaVdjaWRBcnJheVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCVVTSE9SVAkJQkFPcmlTZXF1ZW5jZVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCi0JLy8gODAyLjExbiBmZWF0dXJlcy4KLQlVQ0hBUgkJTXBkdURlbnNpdHk7Ci0JVUNIQVIJCU1heFJBbXBkdUZhY3RvcjsKLQlVQ0hBUgkJQU1zZHVTaXplOwotCVVDSEFSCQlNbXBzTW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUuCi0KLQlIVF9DQVBBQklMSVRZX0lFCQlIVENhcGFiaWxpdHk7Ci0KLQlCT09MRUFOCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQotCVVDSEFSICAgICAgIFJhdGVMZW47Ci0Jc3RydWN0IF9NQUNfVEFCTEVfRU5UUlkgKnBOZXh0OwotICAgIFVTSE9SVCAgICAgIFR4U2VxW05VTV9PRl9USURdOwotCVVTSE9SVAkJTm9uUW9zRGF0YVNlcTsKLQotCVJTU0lfU0FNUExFCVJzc2lTYW1wbGU7Ci0KLQlVSU5UMzIJCQlUWE1DU0V4cGVjdGVkWzE2XTsKLQlVSU5UMzIJCQlUWE1DU1N1Y2Nlc3NmdWxbMTZdOwotCVVJTlQzMgkJCVRYTUNTRmFpbGVkWzE2XTsKLQlVSU5UMzIJCQlUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOwotI2lmZGVmIFJUMjg3MAotCVVMT05HICAgCQlMYXN0QmVhY29uUnhUaW1lOwotI2VuZGlmCi19IE1BQ19UQUJMRV9FTlRSWSwgKlBNQUNfVEFCTEVfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9NQUNfVEFCTEUgewotCVVTSE9SVAkJCVNpemU7Ci0JTUFDX1RBQkxFX0VOVFJZICpIYXNoW0hBU0hfVEFCTEVfU0laRV07Ci0JTUFDX1RBQkxFX0VOVFJZIENvbnRlbnRbTUFYX0xFTl9PRl9NQUNfVEFCTEVdOwotCVFVRVVFX0hFQURFUiAgICBNY2FzdFBzUXVldWU7Ci0JVUxPTkcgICAgICAgICAgIFBzUUlkbGVDb3VudDsKLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25JblBzbTsKLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25CYWRBdGhlcm9zOwkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBhdGhlcm9zIDgwMi4xMW4gQ2hpcC4gIFdlIG5lZWQgdG8gdXNlIFJUUy9DVFMgd2l0aCBBdGhlcm9zIDgwMiwuMTFuIGNoaXAuCi0JQk9PTEVBTgkJCWZBbnlUeE9QRm9yY2VEaXNhYmxlOwkvLyBDaGVjayBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSBCRSBUeE9QCi0jaWZkZWYgUlQyODcwCi0JQk9PTEVBTgkJCWZBbGxTdGF0aW9uQXNSYWxpbms7IAkvLyBDaGVjayBpZiBhbGwgc3RhdGlvbnMgYXJlIHJhbGluay1jaGlwc2V0Ci0jZW5kaWYKLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb25Jc0xlZ2FjeTsJLy8gQ2hlY2sgaWYgSSB1c2UgbGVnYWN5IHJhdGUgdG8gdHJhbnNtaXQgdG8gbXkgQlNTIFN0YXRpb24vCi0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uTm9uR0Y7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbjIwT25seTsJCS8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuCi0JQk9PTEVBTgkJCWZBbnlTdGF0aW9uTUlNT1BTRHluYW1pYzsgLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgTUlNTyBEeW5hbWljCi0JQk9PTEVBTiAgICAgICAgIGZBbnlCQVNlc3Npb247ICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgQkEgc2Vzc2lvbi4gIEZvcmNlIHR1cm4gb24gUlRTL0NUUwotfSBNQUNfVEFCTEUsICpQTUFDX1RBQkxFOwotCi0jZGVmaW5lIElTX0hUX1NUQShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLSNkZWZpbmUgSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLSNkZWZpbmUgUEVFUl9JU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKLQkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQotdHlwZWRlZiBzdHJ1Y3QgX1dEU19FTlRSWSB7Ci0JQk9PTEVBTiAgICAgICAgIFZhbGlkOwotCVVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0JVUxPTkcgICAgICAgICAgIE5vRGF0YUlkbGVDb3VudDsKLQlzdHJ1Y3QgX1dEU19FTlRSWSAqcE5leHQ7Ci19IFdEU19FTlRSWSwgKlBXRFNfRU5UUlk7CisJdTggRW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmc7CS8qIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNICovCisJLypqYW4gZm9yIHdwYSAqLworCS8qIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCICovCisJdTggQ01UaW1lclJ1bm5pbmc7CisJdTggYXBpZHg7CQkvKiBNQlNTIG51bWJlciAqLworCXU4IFJTTklFX0xlbjsKKwl1OCBSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07CisJdTggQU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJdTggU05vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07CisJdTggUl9Db3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOworCXU4IFBUS1s2NF07CisJdTggUmVUcnlDb3VudGVyOworCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgUmV0cnlUaW1lcjsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIEVucXVldWVTdGFydEZvclBTS1RpbWVyOwkvKiBBIHRpbWVyIHdoaWNoIGVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgUFNLIFNNICovCisJTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBBdXRoTW9kZTsJLyogVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQgKi8KKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIFdlcFN0YXR1czsKKwlORElTXzgwMl8xMV9XRVBfU1RBVFVTIEdyb3VwS2V5V2VwU3RhdHVzOworCUFQX1dQQV9TVEFURSBXcGFTdGF0ZTsKKwlHVEtfU1RBVEUgR1RLU3RhdGU7CisJdTE2IFBvcnRTZWN1cmVkOworCU5ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSIFByaXZhY3lGaWx0ZXI7CS8qIFByaXZhY3lGaWx0ZXIgZW51bSBmb3IgODAyLjFYICovCisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgUGFpcndpc2VLZXk7CisJdm9pZCAqcEFkOworCWludCBQTUtJRF9DYWNoZUlkeDsKKwl1OCBQTUtJRFtMRU5fUE1LSURdOwogCi10eXBlZGVmIHN0cnVjdCAgX1dEU19UQUJMRV9FTlRSWSB7Ci0JVVNIT1JUCQkJU2l6ZTsKLQlVQ0hBUiAgICAgICAgICAgV2RzQWRkcltNQUNfQUREUl9MRU5dOwotCVdEU19FTlRSWSAgICAgICAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOwotCVdEU19FTlRSWSAgICAgICBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKLQlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKLQlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKLQlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVU0hPUlQgICAgICAgICAgT25lU2VjVHhPa0NvdW50OwotCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeFJldHJ5T2tDb3VudDsKLQlVU0hPUlQgICAgICAgICAgT25lU2VjVHhGYWlsQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKLQlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCi19IFdEU19UQUJMRV9FTlRSWSwgKlBXRFNfVEFCTEVfRU5UUlk7CisJdTggQWRkcltNQUNfQUREUl9MRU5dOworCXU4IFBzTW9kZTsKKwlTU1QgU3N0OworCUFVVEhfU1RBVEUgQXV0aFN0YXRlOwkvKiBmb3IgU0hBUkVEIEtFWSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIHVzZWQgb25seSAqLworCUJPT0xFQU4gSXNSZWFzc29jU3RhOwkvKiBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgYSByZWFzc29jaWF0aW9uIHByb2NlZHVyZSAqLworCXUxNiBBaWQ7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXU4IExhc3RSc3NpOworCXVuc2lnbmVkIGxvbmcgTm9EYXRhSWRsZUNvdW50OworCXUxNiBTdGF0aW9uS2VlcEFsaXZlQ291bnQ7CS8qIHVuaXQ6IHNlY29uZCAqLworCXVuc2lnbmVkIGxvbmcgUHNRSWRsZUNvdW50OworCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgUHNRdWV1ZTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFNfRU5UUlkgewotCVBORVRfREVWCQkJZGV2OwotCVVDSEFSCQkJCVZhbGlkOwotCVVDSEFSCQkJCVBoeU1vZGU7Ci0JVUNIQVIJCQkJUGVlcldkc0FkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICBXZXBTdGF0dXM7Ci0JVUNIQVIJCQkJCUtleUlkeDsKLQlDSVBIRVJfS0VZICAgICAgICAgIAlXZHNLZXk7Ci0JSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ci0JUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87Ci0JQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KLX0gUlRfODAyXzExX1dEU19FTlRSWSwgKlBSVF84MDJfMTFfV0RTX0VOVFJZOworCXUzMiBTdGFDb25uZWN0VGltZTsJLyogdGhlIGxpdmUgdGltZSBvZiB0aGlzIHN0YXRpb24gc2luY2UgYXNzb2NpYXRlZCB3aXRoIEFQICovCiAKLXR5cGVkZWYgc3RydWN0IF9XRFNfVEFCTEUgewotCVVDSEFSICAgICAgICAgICAgICAgTW9kZTsKLQlVTE9ORyAgICAgICAgICAgICAgIFNpemU7Ci0JUlRfODAyXzExX1dEU19FTlRSWQlXZHNFbnRyeVtNQVhfV0RTX0VOVFJZXTsKLX0gV0RTX1RBQkxFLCAqUFdEU19UQUJMRTsKKwlCT09MRUFOIGJTZW5kQkFSOworCXUxNiBOb0JBRGF0YUNvdW50RG93bjsKIAotdHlwZWRlZiBzdHJ1Y3QgX0FQQ0xJX1NUUlVDVCB7Ci0JUE5FVF9ERVYJCQkJZGV2OwotI2lmZGVmIFJUTDg2NVhfU09DCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgbXlsaW5raWQ7Ci0jZW5kaWYKLQlCT09MRUFOICAgICAgICAgICAgICAgICBFbmFibGU7CS8vIFNldCBpdCBhcyAxIGlmIHRoZSBhcGNsaSBpbnRlcmZhY2Ugd2FzIGNvbmZpZ3VyZWQgdG8gIjEiICBvciBieSBpd3ByaXYgY21kICJBcENsaUVuYWJsZSIKLQlCT09MRUFOICAgICAgICAgICAgICAgICBWYWxpZDsJLy8gU2V0IGl0IGFzIDEgaWYgdGhlIGFwY2xpIGludGVyZmFjZSBhc3NvY2lhdGVkIHN1Y2Nlc3MgdG8gcmVtb3RlIEFQLgotCVVDSEFSCQkJCQlNYWNUYWJXQ0lEOwkvL1dDSUQgdmFsdWUsIHdoaWNoIHBvaW50IHRvIHRoZSBlbnRyeSBvZiBBU0lDIE1hYyB0YWJsZS4KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBTc2lkTGVuOwotCUNIQVIgICAgICAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwl1MzIgQ2FjaGVkQnVmWzE2XTsJLyogdTMyICg0IGJ5dGVzKSBmb3IgYWxpZ25tZW50ICovCisJdTMyIFR4QkZDb3VudDsJCS8qIDMqMyAqLworCXUzMiBGSUZPQ291bnQ7CisJdTMyIERlYnVnRklGT0NvdW50OworCXUzMiBEZWJ1Z1R4Q291bnQ7CisJQk9PTEVBTiBiRGxzSW5pdDsKIAotCVVDSEFSICAgICAgICAgICAgICAgICAgIENmZ1NzaWRMZW47Ci0JQ0hBUiAgICAgICAgICAgICAgICAgICAgQ2ZnU3NpZFtNQVhfTEVOX09GX1NTSURdOwotCVVDSEFSICAgICAgICAgICAgICAgICAgIENmZ0FwQ2xpQnNzaWRbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBDdXJyZW50QWRkcmVzc1tFVEhfTEVOR1RIX09GX0FERFJFU1NdOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKldEUyBlbnRyeSBuZWVkcyB0aGVzZSAqLworLyogaWYgVmFsaWRBc1dEUz09VFJVRSwgTWF0Y2hXRFNUYWJJZHggaXMgdGhlIGluZGV4IGluIFdkc1RhYi5NYWNUYWIgKi8KKwl1MzIgTWF0Y2hXRFNUYWJJZHg7CisJdTggTWF4U3VwcG9ydGVkUmF0ZTsKKwl1OCBDdXJyVHhSYXRlOworCXU4IEN1cnJUeFJhdGVJbmRleDsKKwkvKiB0byByZWNvcmQgdGhlIGVhY2ggVFggcmF0ZSdzIHF1YWxpdHkuIDAgaXMgYmVzdCwgdGhlIGJpZ2dlciB0aGUgd29yc2UuICovCisJdTE2IFR4UXVhbGl0eVtNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSF07CisvKiAgICAgIHUxNiAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7ICovCisJdTMyIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7CisJdTMyIE9uZVNlY1R4UmV0cnlPa0NvdW50OworCXUzMiBPbmVTZWNUeEZhaWxDb3VudDsKKwl1MzIgQ29udGludWVUeEZhaWxDbnQ7CisJdTMyIEN1cnJUeFJhdGVTdGFibGVUaW1lOwkvKiAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUgKi8KKwl1OCBUeFJhdGVVcFBlbmFsdHk7CS8qIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCVVMT05HICAgICAgICAgICAgICAgICAgIEFwQ2xpUmN2QmVhY29uVGltZTsKKwlCT09MRUFOIGZOb2lzeUVudmlyb25tZW50OworCUJPT0xFQU4gZkxhc3RTZWNBY2NvcmRpbmdSU1NJOworCXU4IExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247CS8qIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93biAqLworCWNoYXIgTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb247CS8qS2VlcCBsYXN0IHRpbWUgdmFsdWUgb2YgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgTGFzdFR4T2tDb3VudDsKKwl1OCBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwogCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgQ3RybEN1cnJTdGF0ZTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBTeW5jQ3VyclN0YXRlOwotCVVMT05HICAgICAgICAgICAgICAgICAgIEF1dGhDdXJyU3RhdGU7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQXNzb2NDdXJyU3RhdGU7Ci0JVUxPTkcJCQkJCVdwYVBza0N1cnJTdGF0ZTsKKwkvKiBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIgKi8KKwkvKiBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhICovCisJLyogQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygpLCBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoKSBtYWNyb3MuICovCisJLyogc2VlIGZPUF9TVEFUVVNfeHh4IGluIFJUTVBfREVGLkMgZm9yIGRldGFpbCBiaXQgZGVmaW5pdGlvbi4gZkNMSUVOVF9TVEFUVVNfQU1TRFVfSU5VU0VEICovCisJdW5zaWduZWQgbG9uZyBDbGllbnRTdGF0dXNGbGFnczsKIAotCVVTSE9SVCAgICAgICAgICAgICAgICAgIEF1dGhSZXFDbnQ7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgQXNzb2NSZXFDbnQ7CisJSFRUUkFOU01JVF9TRVRUSU5HIEhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7CS8qIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLiAqLwogCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgQ2xpZW50U3RhdHVzRmxhZ3M7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgTXBkdURlbnNpdHk7CisJLyogSFQgRVdDIE1JTU8tTiB1c2VkIHBhcmFtZXRlcnMgKi8KKwl1MTYgUlhCQWJpdG1hcDsJLyogZmlsbCB0byBvbi1jaGlwICBSWFdJX0JBX0JJVE1BU0sgaW4gOC4xLjNSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICovCisJdTE2IFRYQkFiaXRtYXA7CS8qIFRoaXMgYml0bWFwIGFzIG9yaWdpbmF0b3IsIG9ubHkga2VlcCBpbiBzb2Z0d2FyZSB1c2VkIHRvIG1hcmsgQU1QRFUgYml0IGluIFRYV0kgKi8KKwl1MTYgVFhBdXRvQkFiaXRtYXA7CisJdTE2IEJBRGVjbGluZUJpdG1hcDsKKwl1MTYgQkFSZWNXY2lkQXJyYXlbTlVNX09GX1RJRF07CS8qIFRoZSBtYXBwaW5nIHdjaWQgb2YgcmVjaXBpZW50IHNlc3Npb24uIGlmIFJYQkFiaXRtYXAgYml0IGlzIG1hc2tlZCAqLworCXUxNiBCQU9yaVdjaWRBcnJheVtOVU1fT0ZfVElEXTsJLyogVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZCAqLworCXUxNiBCQU9yaVNlcXVlbmNlW05VTV9PRl9USURdOwkvKiBUaGUgbWFwcGluZyB3Y2lkIG9mIG9yaWdpbmF0b3Igc2Vzc2lvbi4gaWYgVFhCQWJpdG1hcCBiaXQgaXMgbWFza2VkICovCiAKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAvLyBUaGlzIHNob3VsZCBtYXRjaCB0byB3aGF0ZXZlciBtaWNyb3NvZnQgZGVmaW5lZAotCU5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKKwkvKiA4MDIuMTFuIGZlYXR1cmVzLiAqLworCXU4IE1wZHVEZW5zaXR5OworCXU4IE1heFJBbXBkdUZhY3RvcjsKKwl1OCBBTXNkdVNpemU7CisJdTggTW1wc01vZGU7CQkvKiBNSU1PIHBvd2VyIHNhdmUgbW9yZS4gKi8KIAotCS8vIEFkZCB0byBzdXBwb3J0IGRpZmZlcmVudCBjaXBoZXIgc3VpdGUgZm9yIFdQQTIvV1BBIG1vZGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJR3JvdXBDaXBoZXI7CQkvLyBNdWx0aWNhc3QgY2lwaGVyIHN1aXRlCi0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJCVBhaXJDaXBoZXI7CQkJLy8gVW5pY2FzdCBjaXBoZXIgc3VpdGUKLQlCT09MRUFOCQkJCQkJCQliTWl4Q2lwaGVyOwkJCS8vIEluZGljYXRlIGN1cnJlbnQgUGFpciAmIEdyb3VwIHVzZSBkaWZmZXJlbnQgY2lwaGVyIHN1aXRlcwotCVVTSE9SVAkJCQkJCQkJUnNuQ2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIVENhcGFiaWxpdHk7CiAKLQlVQ0hBUgkJUFNLWzEwMF07CQkJCS8vIHJlc2VydmUgUFNLIGtleSBtYXRlcmlhbAotCVVDSEFSICAgICAgIFBTS0xlbjsKLQlVQ0hBUiAgICAgICBQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCi0JVUNIQVIJCUdUS1szMl07CQkJCS8vIEdUSyBmcm9tIGF1dGhlbnRpY2F0b3IKKwlCT09MRUFOIGJBdXRvVHhSYXRlU3dpdGNoOwogCi0JQ0lQSEVSX0tFWSAgICAgIFNoYXJlZEtleVtTSEFSRV9LRVlfTlVNXTsKLQlVQ0hBUiAgICAgICAgICAgRGVmYXVsdEtleUlkOworCXU4IFJhdGVMZW47CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE5leHQ7CisJdTE2IFR4U2VxW05VTV9PRl9USURdOworCXUxNiBOb25Rb3NEYXRhU2VxOwogCi0JLy8gc3RvcmUgUlNOX0lFIGJ1aWx0IGJ5IGRyaXZlcgotCVVDSEFSCQlSU05fSUVbTUFYX0xFTl9PRl9SU05JRV07ICAvLyBUaGUgY29udGVudCBzYXZlZCBoZXJlIHNob3VsZCBiZSBjb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCVVDSEFSCQlSU05JRV9MZW47CisJc3RydWN0IHJ0X3Jzc2lfc2FtcGxlIFJzc2lTYW1wbGU7CiAKLQkvLyBGb3IgV1BBIGNvdW50ZXJtZWFzdXJlcwotCVVMT05HICAgICAgIExhc3RNaWNFcnJvclRpbWU7ICAgLy8gcmVjb3JkIGxhc3QgTUlDIGVycm9yIHRpbWUKLQlCT09MRUFOICAgICAgICAgICAgICAgICBiQmxvY2tBc3NvYzsgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgorCXUzMiBUWE1DU0V4cGVjdGVkWzE2XTsKKwl1MzIgVFhNQ1NTdWNjZXNzZnVsWzE2XTsKKwl1MzIgVFhNQ1NGYWlsZWRbMTZdOworCXUzMiBUWE1DU0F1dG9GYWxsQmFja1sxNl1bMTZdOwogCi0JLy8gRm9yIFdQQS1QU0sgc3VwcGxpY2FudCBzdGF0ZQotCVVDSEFSICAgICAgIAlTTm9uY2VbMzJdOyAgICAgICAgIC8vIFNOb25jZSBmb3IgV1BBLVBTSwotCVVDSEFSCQkJR05vbmNlWzMyXTsJCQkvLyBHTm9uY2UgZm9yIFdQQS1QU0sgZnJvbSBhdXRoZW50aWNhdG9yCisJdW5zaWduZWQgbG9uZyBMYXN0QmVhY29uUnhUaW1lOwogCi0JSFRUUkFOU01JVF9TRVRUSU5HCQkJCUhUUGh5TW9kZSwgTWF4SFRQaHlNb2RlLCBNaW5IVFBoeU1vZGU7Ci0JUlRfSFRfUEhZX0lORk8JCQkJCURlc2lyZWRIdFBoeUluZm87Ci0JQk9PTEVBTgkJCQkJCQliQXV0b1R4UmF0ZVN3aXRjaDsKLQlERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgICAgICAgCURlc2lyZWRUcmFuc21pdFNldHRpbmc7IC8vIERlc2lyZWQgdHJhbnNtaXQgc2V0dGluZy4KLX0gQVBDTElfU1RSVUNULCAqUEFQQ0xJX1NUUlVDVDsKKwl1bnNpZ25lZCBsb25nIEFzc29jRGVhZExpbmU7Cit9OwogCi0vLyAtLS0tLS0tLS0tLSBlbmQgb2YgQVAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RydWN0IHJ0X21hY190YWJsZSB7CisJdTE2IFNpemU7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgQ29udGVudFtNQVhfTEVOX09GX01BQ19UQUJMRV07CisJc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciBNY2FzdFBzUXVldWU7CisJdW5zaWduZWQgbG9uZyBQc1FJZGxlQ291bnQ7CisJQk9PTEVBTiBmQW55U3RhdGlvbkluUHNtOworCUJPT0xFQU4gZkFueVN0YXRpb25CYWRBdGhlcm9zOwkvKiBDaGVjayBpZiBhbnkgU3RhdGlvbiBpcyBhdGhlcm9zIDgwMi4xMW4gQ2hpcC4gIFdlIG5lZWQgdG8gdXNlIFJUUy9DVFMgd2l0aCBBdGhlcm9zIDgwMiwuMTFuIGNoaXAuICovCisJQk9PTEVBTiBmQW55VHhPUEZvcmNlRGlzYWJsZTsJLyogQ2hlY2sgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgQkUgVHhPUCAqLworCUJPT0xFQU4gZkFsbFN0YXRpb25Bc1JhbGluazsJLyogQ2hlY2sgaWYgYWxsIHN0YXRpb25zIGFyZSByYWxpbmstY2hpcHNldCAqLworCUJPT0xFQU4gZkFueVN0YXRpb25Jc0xlZ2FjeTsJLyogQ2hlY2sgaWYgSSB1c2UgbGVnYWN5IHJhdGUgdG8gdHJhbnNtaXQgdG8gbXkgQlNTIFN0YXRpb24vICovCisJQk9PTEVBTiBmQW55U3RhdGlvbk5vbkdGOwkvKiBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLiAqLworCUJPT0xFQU4gZkFueVN0YXRpb24yME9ubHk7CS8qIENoZWNrIGlmIGFueSBTdGF0aW9uIGNhbid0IHN1cHBvcnQgR0YuICovCisJQk9PTEVBTiBmQW55U3RhdGlvbk1JTU9QU0R5bmFtaWM7CS8qIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIE1JTU8gRHluYW1pYyAqLworCUJPT0xFQU4gZkFueUJBU2Vzc2lvbjsJLyogQ2hlY2sgaWYgdGhlcmUgaXMgQkEgc2Vzc2lvbi4gIEZvcmNlIHR1cm4gb24gUlRTL0NUUyAqLworLyoyMDA4LzEwLzI4OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLSAqLworLyoyMDA4LzEwLzI4OiBLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUC0tPiAqLworfTsKIAotc3RydWN0IHdpZmljb25mCi17Ci0JQk9PTEVBTgliU2hvcnRHSTsKK3N0cnVjdCB3aWZpY29uZiB7CisJQk9PTEVBTiBiU2hvcnRHSTsKIAlCT09MRUFOIGJHcmVlbkZpZWxkOwogfTsKIAorc3RydWN0IHJ0X3J0bXBfZGV2X2luZm8geworCXU4IGNoaXBOYW1lWzE2XTsKKwlSVE1QX0lORl9UWVBFIGluZlR5cGU7Cit9OwogCitzdHJ1Y3QgcnRfcnRtcF9jaGlwX29wIHsKKwkvKiAgQ2FsaWJyYXRpb24gYWNjZXNzIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCisJaW50ICgqZWVpbml0KSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsJLyogaW50ICgqZWVpbml0KShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOyAqLworCWludCAoKmVlcmVhZCkgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2IG9mZnNldCwgdTE2ICpwVmFsdWUpOwkvKiBpbnQgKCplZXJlYWQpKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgaW50IG9mZnNldCwgdTE2ICpwVmFsdWUpOyAqLwogCisJLyogTUNVIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCisJaW50ICgqbG9hZEZpcm13YXJlKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsJLyogaW50ICgqbG9hZEZpcm13YXJlKShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOyAqLworCWludCAoKmVyYXNlRmlybXdhcmUpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwkvKiBpbnQgKCplcmFzZUZpcm13YXJlKShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOyAqLworCWludCAoKnNlbmRDb21tYW5kVG9NY3UpIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGNtZCwgdTggdG9rZW4sIHU4IGFyZzAsIHU4IGFyZzEpOzsJLyogaW50ICgqc2VuZENvbW1hbmRUb01jdSkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjbWQsIHU4IHRva2VuLCB1OCBhcmcwLCB1OCBhcmcxKTsgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX0lORl9QQ0lfQ09ORklHCi17Ci0JUFVDSEFSICAgICAgICAgICAgICAgICAgQ1NSQmFzZUFkZHJlc3M7ICAgICAvLyBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UKLX1JTkZfUENJX0NPTkZJRzsKKwkvKiBSRiBhY2Nlc3MgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKwlzdHJ1Y3QgcnRfcmVnX3BhaXIgKnBSRlJlZ1RhYmxlOworCXZvaWQgKCpBc2ljUmZJbml0KSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKwl2b2lkICgqQXNpY1JmVHVybk9uKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKwl2b2lkICgqQXNpY1JmVHVybk9mZikgKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisJdm9pZCAoKkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKwl2b2lkICgqQXNpY0hhbHRBY3Rpb24pIChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0lORl9VU0JfQ09ORklHCi17Ci0JVUlOVCAgICAgICAgICAgICAgICBCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKLQlVSU5UICAgICAgICAgICAgICAgIEJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKKy8qICovCisvKiAgVGhlIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlICovCisvKiAqLworc3RydWN0IHJ0X3J0bXBfYWRhcHRlciB7CisJdm9pZCAqT1NfQ29va2llOwkvKiBzYXZlIHNwZWNpZmljIHN0cnVjdHVyZSByZWxhdGl2ZSB0byBPUyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXVuc2lnbmVkIGxvbmcgVmlydHVhbElmQ250OwogCi19SU5GX1VTQl9DT05GSUc7CisJc3RydWN0IHJ0X3J0bXBfY2hpcF9vcCBjaGlwT3BzOworCXUxNiBUaGlzVGJ0dE51bVRvTmV4dFdha2VVcDsKIAotCi0KLS8vCi0vLyAgVGhlIG1pbmlwb3J0IGFkYXB0ZXIgc3RydWN0dXJlCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQURBUFRFUgotewotCVBWT0lECQkJCQlPU19Db29raWU7CS8vIHNhdmUgc3BlY2lmaWMgc3RydWN0dXJlIHJlbGF0aXZlIHRvIE9TCi0JUE5FVF9ERVYJCQkJbmV0X2RldjsKLQlVTE9ORwkJCQkJVmlydHVhbElmQ250OwotCi0jaWZkZWYgUlQyODYwCi0gICAgVVNIT1JUCQkgICAgICAgICAgICBMbmtDdHJsQml0TWFzazsKLSAgICBVU0hPUlQJCSAgICAgICAgICAgIFJMbmtDdHJsQ29uZmlndXJhdGlvbjsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBSTG5rQ3RybE9mZnNldDsKLSAgICBVU0hPUlQJCSAgICAgICAgICAgIEhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbjsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBIb3N0TG5rQ3RybE9mZnNldDsKLQlVU0hPUlQJCSAgICAgICAgICAgIFBDSWVQb3dlclNhdmVMZXZlbDsKLSAgIAlCT09MRUFOCQkJCQliUENJY2xrT2ZmOwkJCQkJCS8vIGZsYWcgdGhhdCBpbmRpY2F0ZSBpZiB0aGUgUElDRSBwb3dlciBzdGF0dXMgaW4gQ29uZmlndXJhdGlvbiBTUGFjZS4uCi0gICAJVUxPTkcJCQkJCUNoZWNrRG1hQnVzeUNvdW50OyAgLy8gQ2hlY2sgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBDb3VudC4KLSAgIAlVU0hPUlQJCQkJCVRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwOwotCVVMT05HCQkJCQlTYW1lUnhCeXRlQ291bnQ7Ci0KLQorI2lmZGVmIFJUTVBfTUFDX1BDSQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICBQQ0kgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBQQ0kgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlQVUNIQVIgICAgICAgICAgICAgICAgICBDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQorCXU4ICpDU1JCYXNlQWRkcmVzczsJLyogUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlICovCisJdW5zaWduZWQgaW50IGlycV9udW07CiAKLQlVSU5UCQkJCQlpbnRfZW5hYmxlX3JlZzsKLQlVSU5UCQkJCQlpbnRfZGlzYWJsZV9tYXNrOwotCVVJTlQJCQkJCWludF9wZW5kaW5nOworCXUxNiBMbmtDdHJsQml0TWFzazsKKwl1MTYgUkxua0N0cmxDb25maWd1cmF0aW9uOworCXUxNiBSTG5rQ3RybE9mZnNldDsKKwl1MTYgSG9zdExua0N0cmxDb25maWd1cmF0aW9uOworCXUxNiBIb3N0TG5rQ3RybE9mZnNldDsKKwl1MTYgUENJZVBvd2VyU2F2ZUxldmVsOworCXVuc2lnbmVkIGxvbmcgUnQzeHhIb3N0TGlua0N0cmw7CS8qIFVTZWQgZm9yIDMwOTBGIGNoaXAgKi8KKwl1bnNpZ25lZCBsb25nIFJ0M3h4UmFsaW5rTGlua0N0cmw7CS8qIFVTZWQgZm9yIDMwOTBGIGNoaXAgKi8KKwl1MTYgRGV2aWNlSUQ7CS8qIFJlYWQgZnJvbSBQQ0kgY29uZmlnICovCisJdW5zaWduZWQgbG9uZyBBY2Nlc3NCQlBGYWlsQ291bnQ7CisJQk9PTEVBTiBiUENJY2xrT2ZmOwkvKiBmbGFnIHRoYXQgaW5kaWNhdGUgaWYgdGhlIFBJQ0UgcG93ZXIgc3RhdHVzIGluIENvbmZpZ3VyYXRpb24gU1BhY2UuLiAqLworCUJPT0xFQU4gYlBDSWNsa09mZkRpc2FibGVUeDsJLyogKi8KIAorCUJPT0xFQU4gYnJ0MzB4eEJhbk1jdUNtZDsJLyp3aGVuID0gMHhmZiBtZWFucyBhbGwgY29tbWFuZHMgYXJlIG9rIHRvIHNldCAuICovCisJQk9PTEVBTiBiMzA5MEVTcGVjaWFsQ2hpcDsJLyozMDkwRSBzcGVjaWFsIGNoaXAgdGhhdCB3cml0ZSBFRVBST00gMHgyND0weDkyODAuICovCisJdW5zaWduZWQgbG9uZyBDaGVja0RtYUJ1c3lDb3VudDsJLyogQ2hlY2sgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBDb3VudC4gKi8KIAotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFR4QnVmU3BhY2VbTlVNX09GX1RYX1JJTkddOyAvLyBTaGFyZWQgbWVtb3J5IG9mIGFsbCAxc3QgcHJlLWFsbG9jYXRlZCBUeEJ1ZiBhc3NvY2lhdGVkIHdpdGggZWFjaCBUWEQKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBSeERlc2NSaW5nOyAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIG1lbW9yeSBmb3IgUlggZGVzY3JpcHRvcnMKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeERlc2NSaW5nW05VTV9PRl9UWF9SSU5HXTsgCS8vIFNoYXJlZCBtZW1vcnkgZm9yIFR4IGRlc2NyaXB0b3JzCi0JUlRNUF9UWF9SSU5HICAgICAgICAgICAgVHhSaW5nW05VTV9PRl9UWF9SSU5HXTsgICAgIAkvLyBBQzB+NCArIEhDQ0EKLSNlbmRpZgorCXUzMiBpbnRfZW5hYmxlX3JlZzsKKwl1MzIgaW50X2Rpc2FibGVfbWFzazsKKwl1MzIgaW50X3BlbmRpbmc7CiAKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBpcnFfbG9jazsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBpcnFfZGlzYWJsZWQ7CisJc3RydWN0IHJ0X3J0bXBfZG1hYnVmIFR4QnVmU3BhY2VbTlVNX09GX1RYX1JJTkddOwkvKiBTaGFyZWQgbWVtb3J5IG9mIGFsbCAxc3QgcHJlLWFsbG9jYXRlZCBUeEJ1ZiBhc3NvY2lhdGVkIHdpdGggZWFjaCBUWEQgKi8KKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgUnhEZXNjUmluZzsJLyogU2hhcmVkIG1lbW9yeSBmb3IgUlggZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgcnRfcnRtcF9kbWFidWYgVHhEZXNjUmluZ1tOVU1fT0ZfVFhfUklOR107CS8qIFNoYXJlZCBtZW1vcnkgZm9yIFR4IGRlc2NyaXB0b3JzICovCisJc3RydWN0IHJ0X3J0bXBfdHhfcmluZyBUeFJpbmdbTlVNX09GX1RYX1JJTkddOwkvKiBBQzB+NCArIEhDQ0EgKi8KKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotI2lmZGVmIFJUMjg3MAorCXNwaW5sb2NrX3QgaXJxX2xvY2s7CisJdTggaXJxX2Rpc2FibGVkOworCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgIFVTQiByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0Jc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvcgkJKmNvbmZpZzsKLQlVSU5UCQkJCQkJCQlCdWxrSW5FcEFkZHI7CQkvLyBidWxrLWluIGVuZHBvaW50IGFkZHJlc3MKLQlVSU5UCQkJCQkJCQlCdWxrT3V0RXBBZGRyWzZdOwkvLyBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzCisJc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvciAqY29uZmlnOworCXUzMiBCdWxrSW5FcEFkZHI7CS8qIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcyAqLworCXUzMiBCdWxrT3V0RXBBZGRyWzZdOwkvKiBidWxrLW91dCBlbmRwb2ludCBhZGRyZXNzICovCiAKLQlVSU5UCQkJCQkJCQlOdW1iZXJPZlBpcGVzOwotCVVTSE9SVAkJCQkJCQkJQnVsa091dE1heFBhY2tldFNpemU7Ci0JVVNIT1JUCQkJCQkJCQlCdWxrSW5NYXhQYWNrZXRTaXplOworCXUzMiBOdW1iZXJPZlBpcGVzOworCXUxNiBCdWxrT3V0TWF4UGFja2V0U2l6ZTsKKwl1MTYgQnVsa0luTWF4UGFja2V0U2l6ZTsKIAotCS8vPT09PT09Q29udHJvbCBGbGFncwotCUxPTkcgICAgICAgICAgICAgICAgICAgIAlQZW5kaW5nSW9Db3VudDsKLQlVTE9ORwkJCQkJCUJ1bGtGbGFnczsKLQlCT09MRUFOICAgICAgICAgICAgICAgICAgICAgYlVzYlR4QnVsa0FnZ3JlOwkvLyBGbGFncyBmb3IgYnVsayBvdXQgZGF0YSBwcmlvcml0eQorCS8qPT09PT09Q29udHJvbCBGbGFncyAqLworCWxvbmcgUGVuZGluZ0lvQ291bnQ7CisJdW5zaWduZWQgbG9uZyBCdWxrRmxhZ3M7CisJQk9PTEVBTiBiVXNiVHhCdWxrQWdncmU7CS8qIEZsYWdzIGZvciBidWxrIG91dCBkYXRhIHByaW9yaXR5ICovCiAKKwkvKj09PT09PUNtZCBUaHJlYWQgKi8KKwlzdHJ1Y3QgcnRfY21kcSBDbWRROworCXNwaW5sb2NrX3QgQ21kUUxvY2s7CS8qIENtZFFMb2NrIHNwaW5sb2NrICovCisJc3RydWN0IHJ0X3J0bXBfb3NfdGFzayBjbWRRVGFzazsKIAotCS8vPT09PT09VGltZXIgVGhyZWFkCi0JUlQyODcwX1RJTUVSX1FVRVVFCQlUaW1lclE7Ci0JTkRJU19TUElOX0xPQ0sJCQlUaW1lclFMb2NrOwotCi0KLQkvLz09PT09PUNtZCBUaHJlYWQKLQlDbWRRCQkJCQlDbWRROwotCU5ESVNfU1BJTl9MT0NLCQkJQ21kUUxvY2s7CQkJCS8vIENtZFFMb2NrIHNwaW5sb2NrCi0KLQlCT09MRUFOCQkJCQlUaW1lckZ1bmNfa2lsbDsKLQlCT09MRUFOCQkJCQltbG1lX2tpbGw7Ci0KLQotCS8vPT09PT09U2VtYXBob3JlcyAoZXZlbnQpCi0Jc3RydWN0IHNlbWFwaG9yZQkJCW1sbWVfc2VtYXBob3JlOwkJCS8qIHRvIHNsZWVwIHRocmVhZCBvbgkqLwotCXN0cnVjdCBzZW1hcGhvcmUJCQlSVFVTQkNtZF9zZW1hcGhvcmU7CQkvKiB0byBzbGVlcCB0aHJlYWQgb24JKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJUlRVU0JUaW1lcl9zZW1hcGhvcmU7Ci0Jc3RydWN0IGNvbXBsZXRpb24JCQlUaW1lclFDb21wbGV0ZTsKLQlzdHJ1Y3QgY29tcGxldGlvbgkJCW1sbWVDb21wbGV0ZTsKLQlzdHJ1Y3QgY29tcGxldGlvbgkJCUNtZFFDb21wbGV0ZTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAkJCSp3YWl0OwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCisJLyo9PT09PT1TZW1hcGhvcmVzIChldmVudCkgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIFVzYlZlbmRvclJlcV9zZW1hcGhvcmU7CisJdm9pZCAqVXNiVmVuZG9yUmVxQnVmOworCXdhaXRfcXVldWVfaGVhZF90ICp3YWl0OworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogICAgICBCb3RoIFBDSS9VU0IgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBSQlVTIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJCQkgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgQm90aCBQQ0kvVVNCIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qc3RydWN0IHJ0X3J0bXBfZGV2X2luZm8gICAgICAgICAgICAgICAgIGNoaXBJbmZvOyAqLworCVJUTVBfSU5GX1RZUEUgaW5mVHlwZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICBEcml2ZXIgTWdtdCByZWxhdGVkIHBhcmFtZXRlcnMJCQkJCQkJCQkJCQkJCSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrIG1sbWVUYXNrOworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCisJLyogSWYgeW91IHdhbnQgdXNlIHRpbWVyIHRhc2sgdG8gaGFuZGxlIHRoZSB0aW1lciByZWxhdGVkIGpvYnMsIGVuYWJsZSB0aGlzLiAqLworCXN0cnVjdCBydF9ydG1wX3RpbWVyX3Rhc2tfcXVldWUgVGltZXJROworCXNwaW5sb2NrX3QgVGltZXJRTG9jazsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrIHRpbWVyVGFzazsKKyNlbmRpZgkJCQkvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgIFR4IHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlCT09MRUFOICAgICAgICAgICAgICAgICBEZVF1ZXVlUnVubmluZ1tOVU1fT0ZfVFhfUklOR107ICAvLyBmb3IgZW5zdXJpbmcgUlRVU0JEZVF1ZXVlUGFja2V0IGdldCBjYWxsIG9uY2UKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBEZVF1ZXVlTG9ja1tOVU1fT0ZfVFhfUklOR107CisJQk9PTEVBTiBEZVF1ZXVlUnVubmluZ1tOVU1fT0ZfVFhfUklOR107CS8qIGZvciBlbnN1cmluZyBSVFVTQkRlUXVldWVQYWNrZXQgZ2V0IGNhbGwgb25jZSAqLworCXNwaW5sb2NrX3QgRGVRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwogCi0jaWZkZWYgUlQyODcwCi0JLy8gRGF0YSByZWxhdGVkIGNvbnRleHQgYW5kIEFDIHNwZWNpZmllZCwgNCBBQyBzdXBwb3J0ZWQKLQlORElTX1NQSU5fTE9DSwkJCUJ1bGtPdXRMb2NrWzZdOwkJCS8vIEJ1bGtPdXQgc3BpbmxvY2sgZm9yIDQgQUNzCi0JTkRJU19TUElOX0xPQ0sJCQlNTE1FQnVsa091dExvY2s7CS8vIE1MTUUgQnVsa091dCBsb2NrCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJLyogRGF0YSByZWxhdGVkIGNvbnRleHQgYW5kIEFDIHNwZWNpZmllZCwgNCBBQyBzdXBwb3J0ZWQgKi8KKwlzcGlubG9ja190IEJ1bGtPdXRMb2NrWzZdOwkvKiBCdWxrT3V0IHNwaW5sb2NrIGZvciA0IEFDcyAqLworCXNwaW5sb2NrX3QgTUxNRUJ1bGtPdXRMb2NrOwkvKiBNTE1FIEJ1bGtPdXQgbG9jayAqLwogCi0JSFRfVFhfQ09OVEVYVAkJCVR4Q29udGV4dFtOVU1fT0ZfVFhfUklOR107Ci0JTkRJU19TUElOX0xPQ0sJCQlUeENvbnRleHRRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkJLy8gVHhDb250ZXh0UXVldWUgc3BpbmxvY2sKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCBUeENvbnRleHRbTlVNX09GX1RYX1JJTkddOworCXNwaW5sb2NrX3QgVHhDb250ZXh0UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLyogVHhDb250ZXh0UXVldWUgc3BpbmxvY2sgKi8KIAotCS8vIDQgc2V0cyBvZiBCdWxrIE91dCBpbmRleCBhbmQgcGVuZGluZyBmbGFnCi0JVUNIQVIJCQkJCU5leHRCdWxrT3V0SW5kZXhbNF07CS8vIG9ubHkgdXNlZCBmb3IgNCBFRENBIGJ1bGtvdXQgcGlwZQorCS8qIDQgc2V0cyBvZiBCdWxrIE91dCBpbmRleCBhbmQgcGVuZGluZyBmbGFnICovCisJdTggTmV4dEJ1bGtPdXRJbmRleFs0XTsJLyogb25seSB1c2VkIGZvciA0IEVEQ0EgYnVsa291dCBwaXBlICovCiAKLQlCT09MRUFOCQkJCQlCdWxrT3V0UGVuZGluZ1s2XTsJLy8gdXNlZCBmb3IgdG90YWwgNiBidWxrb3V0IHBpcGUKLQlVQ0hBUgkJCQkJYnVsa1Jlc2V0UGlwZWlkOwotCUJPT0xFQU4JCQkJCU1nbXRCdWxrUGVuZGluZzsKLQlVTE9ORwkJCQkJYnVsa1Jlc2V0UmVxWzZdOwotI2VuZGlmIC8vIFJUMjg3MCAvLworCUJPT0xFQU4gQnVsa091dFBlbmRpbmdbNl07CS8qIHVzZWQgZm9yIHRvdGFsIDYgYnVsa291dCBwaXBlICovCisJdTggYnVsa1Jlc2V0UGlwZWlkOworCUJPT0xFQU4gTWdtdEJ1bGtQZW5kaW5nOworCXVuc2lnbmVkIGxvbmcgYnVsa1Jlc2V0UmVxWzZdOworI2VuZGlmCQkJCS8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JLy8gcmVzb3VyY2UgZm9yIHNvZnR3YXJlIGJhY2tsb2cgcXVldWVzCi0JUVVFVUVfSEVBREVSICAgICAgICAgICAgVHhTd1F1ZXVlW05VTV9PRl9UWF9SSU5HXTsgIC8vIDQgQUMgKyAxIEhDQ0EKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBUeFN3UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLy8gVHhTd1F1ZXVlIHNwaW5sb2NrCisJLyogcmVzb3VyY2UgZm9yIHNvZnR3YXJlIGJhY2tsb2cgcXVldWVzICovCisJc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOwkvKiA0IEFDICsgMSBIQ0NBICovCisJc3BpbmxvY2tfdCBUeFN3UXVldWVMb2NrW05VTV9PRl9UWF9SSU5HXTsJLyogVHhTd1F1ZXVlIHNwaW5sb2NrICovCiAKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBNZ210RGVzY1Jpbmc7ICAgICAgICAgICAgICAgCS8vIFNoYXJlZCBtZW1vcnkgZm9yIE1HTVQgZGVzY3JpcHRvcnMKLQlSVE1QX01HTVRfUklORyAgICAgICAgICBNZ210UmluZzsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBNZ210UmluZ0xvY2s7ICAgICAgICAgICAgICAgCS8vIFByaW8gUmluZyBzcGlubG9jawotCisJc3RydWN0IHJ0X3J0bXBfZG1hYnVmIE1nbXREZXNjUmluZzsJLyogU2hhcmVkIG1lbW9yeSBmb3IgTUdNVCBkZXNjcmlwdG9ycyAqLworCXN0cnVjdCBydF9ydG1wX21nbXRfcmluZyBNZ210UmluZzsKKwlzcGlubG9ja190IE1nbXRSaW5nTG9jazsJLyogUHJpbyBSaW5nIHNwaW5sb2NrICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgUnggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFJUMjg2MAotCVJUTVBfUlhfUklORyAgICAgICAgICAgIFJ4UmluZzsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBSeFJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jawotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JUlhfQ09OVEVYVAkJCQlSeENvbnRleHRbUlhfUklOR19TSVpFXTsgIC8vIDEgZm9yIHJlZHVuZGFudCBtdWx0aXBsZSBJUlAgYnVsayBpbi4KLQlORElTX1NQSU5fTE9DSwkJCUJ1bGtJbkxvY2s7CQkJCS8vIEJ1bGtJbiBzcGlubG9jayBmb3IgNCBBQ3MKLQlVQ0hBUgkJCQkJUGVuZGluZ1J4OwkJCQkvLyBUaGUgTWF4aW1hIHBlbmRpbmcgUnggdmFsdWUgc2hvdWxkIGJlIAlSWF9SSU5HX1NJWkUuCi0JVUNIQVIJCQkJCU5leHRSeEJ1bGtJbkluZGV4OwkJLy8gSW5kaWNhdGUgdGhlIGN1cnJlbnQgUnhDb250ZXh0IEluZGV4IHdoaWNoIGhvbGQgYnkgSG9zdCBjb250cm9sbGVyLgotCVVDSEFSCQkJCQlOZXh0UnhCdWxrSW5SZWFkSW5kZXg7CS8vIEluZGljYXRlIHRoZSBjdXJyZW50IFJ4Q29udGV4dCBJbmRleCB3aGljaCBkcml2ZXIgY2FuIHJlYWQgJiBwcm9jZXNzIGl0LgotCVVMT05HCQkJCQlOZXh0UnhCdWxrSW5Qb3NpdGlvbjsgICAvLyBXYW50IHRvIGNvbnRhdGVuYXRlIDIgVVJCIGJ1ZmZlciB3aGlsZSAxc3QgaXMgYnVsa2luIGZhaWxlZCBVUkIuIFRoaXMgUG9zaXRpb24gaXMgMXN0IFVSQiBUcmFuc2Zlckxlbmd0aC4KLQlVTE9ORwkJCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGg7CS8vIGN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgYnVmZmVyCi0JVUxPTkcJCQkJCVJlYWRQb3NpdGlvbjsJCQkvLyBjdXJyZW50IHJlYWQgcG9zaXRpb24gaW4gYSBwYWNrZXQgYnVmZmVyCi0jZW5kaWYgLy8gUlQyODcwIC8vCiAKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlzdHJ1Y3QgcnRfcnRtcF9yeF9yaW5nIFJ4UmluZzsKKwlzcGlubG9ja190IFJ4UmluZ0xvY2s7CS8qIFJ4IFJpbmcgc3BpbmxvY2sgKi8KKyNpZmRlZiBSVDMwOTAKKwlzcGlubG9ja190IE1jdUNtZExvY2s7CS8qTUNVIENvbW1hbmQgUXVldWUgc3BpbmxvY2sgKi8KKyNlbmRpZgkJCQkvKiBSVDMwOTAgLy8gKi8KKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlzdHJ1Y3QgcnRfcnhfY29udGV4dCBSeENvbnRleHRbUlhfUklOR19TSVpFXTsJLyogMSBmb3IgcmVkdW5kYW50IG11bHRpcGxlIElSUCBidWxrIGluLiAqLworCXNwaW5sb2NrX3QgQnVsa0luTG9jazsJLyogQnVsa0luIHNwaW5sb2NrIGZvciA0IEFDcyAqLworCXU4IFBlbmRpbmdSeDsJLyogVGhlIE1heGltdW0gcGVuZGluZyBSeCB2YWx1ZSBzaG91bGQgYmUgICAgICAgUlhfUklOR19TSVpFLiAqLworCXU4IE5leHRSeEJ1bGtJbkluZGV4OwkvKiBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggaG9sZCBieSBIb3N0IGNvbnRyb2xsZXIuICovCisJdTggTmV4dFJ4QnVsa0luUmVhZEluZGV4OwkvKiBJbmRpY2F0ZSB0aGUgY3VycmVudCBSeENvbnRleHQgSW5kZXggd2hpY2ggZHJpdmVyIGNhbiByZWFkICYgcHJvY2VzcyBpdC4gKi8KKwl1bnNpZ25lZCBsb25nIE5leHRSeEJ1bGtJblBvc2l0aW9uOwkvKiBXYW50IHRvIGNvbnRhdGVuYXRlIDIgVVJCIGJ1ZmZlciB3aGlsZSAxc3QgaXMgYnVsa2luIGZhaWxlZCBVUkIuIFRoaXMgUG9zaXRpb24gaXMgMXN0IFVSQiBUcmFuc2Zlckxlbmd0aC4gKi8KKwl1bnNpZ25lZCBsb25nIFRyYW5zZmVyQnVmZmVyTGVuZ3RoOwkvKiBjdXJyZW50IGxlbmd0aCBvZiB0aGUgcGFja2V0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGxvbmcgUmVhZFBvc2l0aW9uOwkvKiBjdXJyZW50IHJlYWQgcG9zaXRpb24gaW4gYSBwYWNrZXQgYnVmZmVyICovCisjZW5kaWYJCQkJLyogUlRNUF9NQUNfVVNCIC8vICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgQVNJQyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlVSU5UMzIgICAgICAgICAgICAgICAJTUFDVmVyc2lvbjsgICAgICAJLy8gTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4KKwl1MzIgTUFDVmVyc2lvbjsJLyogTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4gKi8KIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIEUyUFJPTQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVMT05HICAgICAgICAgICAgICAgICAgIEVlcHJvbVZlcnNpb247ICAgICAgICAgIC8vIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZAotCVVDSEFSICAgICAgICAgICAgICAgICAgIEVFUFJPTUFkZHJlc3NOdW07ICAgICAgIC8vIDkzYzQ2PTYgIDkzYzY2PTgKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOwotI2lmZGVmIFJUMjg3MAotCUJPT0xFQU4gICAgICAgICAgICAgICAgIEVlcHJvbUFjY2VzczsKLSNlbmRpZgotCVVMT05HICAgICAgICAgICAgICAgICAgIEZpcm13YXJlVmVyc2lvbjsgICAgICAgIC8vIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLgorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEUyUFJPTSAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXVuc2lnbmVkIGxvbmcgRWVwcm9tVmVyc2lvbjsJLyogYnl0ZSAwOiB2ZXJzaW9uLCBieXRlIDE6IHJldmlzaW9uLCBieXRlIDJ+MzogdW51c2VkICovCisJdW5zaWduZWQgbG9uZyBGaXJtd2FyZVZlcnNpb247CS8qIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLiAqLworCXUxNiBFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOworCXU4IEVFUFJPTUFkZHJlc3NOdW07CS8qIDkzYzQ2PTYgIDkzYzY2PTggKi8KKwlCT09MRUFOIEVlcHJvbUFjY2VzczsKKwl1OCBFRnVzZVRhZzsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIEJCUCBDb250cm9sCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwV3JpdGVMYXRjaFsxNDBdOyAgICAgLy8gcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lECi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwUnNzaVRvRGJtRGVsdGE7Ci0JQkJQX1I2Nl9UVU5JTkcgICAgICAgICAgQmJwVHVuaW5nOworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEJCUCBDb250cm9sICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJdTggQmJwV3JpdGVMYXRjaFsxNDBdOwkvKiByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQgKi8KKwljaGFyIEJicFJzc2lUb0RibURlbHRhOwkvKiBjaGFuZ2UgZnJvbSB1OCB0byBjaGFyIGZvciBoaWdoIHBvd2VyICovCisJc3RydWN0IHJ0X2JicF9yNjZfdHVuaW5nIEJicFR1bmluZzsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBSRklDIGNvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgUmZJY1R5cGU7ICAgICAgIC8vIFJGSUNfeHh4Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgUmZGcmVxT2Zmc2V0OyAgIC8vIEZyZXF1ZW5jeSBvZmZzZXQgZm9yIGNoYW5uZWwgc3dpdGNoaW5nCi0JUlRNUF9SRl9SRUdTICAgICAgICAgICAgTGF0Y2hSZlJlZ3M7ICAgIC8vIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRAorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBSRklDIGNvbnRyb2wgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJdTggUmZJY1R5cGU7CQkvKiBSRklDX3h4eCAqLworCXVuc2lnbmVkIGxvbmcgUmZGcmVxT2Zmc2V0OwkvKiBGcmVxdWVuY3kgb2Zmc2V0IGZvciBjaGFubmVsIHN3aXRjaGluZyAqLworCXN0cnVjdCBydF9ydG1wX3JmX3JlZ3MgTGF0Y2hSZlJlZ3M7CS8qIGxhdGNoIHRoIGxhdGVzdCBSRiBwcm9ncmFtbWluZyB2YWx1ZSBzaW5jZSBSRiBJQyBkb2Vzbid0IHN1cHBvcnQgUkVBRCAqLwogCi0JRUVQUk9NX0FOVEVOTkFfU1RSVUMgICAgQW50ZW5uYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgQU50ZW5uYSBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCBmb3IgYSAmIGcuIFdlIG5lZWQgdG8gc2F2ZSBpdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4KLQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMgICAgTmljQ29uZmlnMjsKKwlFRVBST01fQU5URU5OQV9TVFJVQyBBbnRlbm5hOwkvKiBTaW5jZSBBTnRlbm5hIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGZvciBhICYgZy4gV2UgbmVlZCB0byBzYXZlIGl0IGZvciBmdXR1cmUgcmVmZXJlbmNlLiAqLworCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyBOaWNDb25maWcyOwogCi0JLy8gVGhpcyBzb2Z0IFJ4IEFudGVubmEgRGl2ZXJzaXR5IG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgd2hlbiB1c2VyIHNldAotCS8vIFJYIEFudGVubmEgPSBESVZFUlNJVFkgT04KLQlTT0ZUX1JYX0FOVF9ESVZFUlNJVFkgICBSeEFudDsKKwkvKiBUaGlzIHNvZnQgUnggQW50ZW5uYSBEaXZlcnNpdHkgbWVjaGFuaXNtIGlzIHVzZWQgb25seSB3aGVuIHVzZXIgc2V0ICovCisJLyogUlggQW50ZW5uYSA9IERJVkVSU0lUWSBPTiAqLworCXN0cnVjdCBydF9zb2Z0X3J4X2FudF9kaXZlcnNpdHkgUnhBbnQ7CiAKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBSRlByb2dTZXE7Ci0JQ0hBTk5FTF9UWF9QT1dFUiAgICAgICAgVHhQb3dlcltNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAgICAgLy8gU3RvcmUgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscy4KLQlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIQU5ORUxTXTsgICAvLyBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5Ci0JQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgVHhQb3dlcjExSltNQVhfTlVNX09GXzExSkNIQU5ORUxTXTsgICAgICAgLy8gODAyLjExaiBjaGFubmVsIGFuZCBidwotCUNIQU5ORUxfMTFKX1RYX1BPV0VSICAgIENoYW5uZWxMaXN0MTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKKwl1OCBSRlByb2dTZXE7CisJc3RydWN0IHJ0X2NoYW5uZWxfdHhfcG93ZXIgVHhQb3dlcltNQVhfTlVNX09GX0NIQU5ORUxTXTsJLyogU3RvcmUgVHggcG93ZXIgdmFsdWUgZm9yIGFsbCBjaGFubmVscy4gKi8KKwlzdHJ1Y3QgcnRfY2hhbm5lbF90eF9wb3dlciBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIQU5ORUxTXTsJLyogbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleSAqLworCXN0cnVjdCBydF9jaGFubmVsXzExal90eF9wb3dlciBUeFBvd2VyMTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOwkvKiA4MDIuMTFqIGNoYW5uZWwgYW5kIGJ3ICovCisJc3RydWN0IHJ0X2NoYW5uZWxfMTFqX3R4X3Bvd2VyIENoYW5uZWxMaXN0MTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOwkvKiBsaXN0IGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMgZm9yIHNpdGUgc3VydmV5ICovCiAKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBDaGFubmVsTGlzdE51bTsgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCi0JVUNIQVIJCQkJCUJicDk0OwotCUJPT0xFQU4JCQkJCUJicEZvckNDSzsKLQlVTE9ORwkJVHgyME1Qd3JDZmdBQmFuZFs1XTsKLQlVTE9ORwkJVHgyME1Qd3JDZmdHQmFuZFs1XTsKLQlVTE9ORwkJVHg0ME1Qd3JDZmdBQmFuZFs1XTsKLQlVTE9ORwkJVHg0ME1Qd3JDZmdHQmFuZFs1XTsKKwl1OCBDaGFubmVsTGlzdE51bTsJLyogbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXSAqLworCXU4IEJicDk0OworCUJPT0xFQU4gQmJwRm9yQ0NLOworCXVuc2lnbmVkIGxvbmcgVHgyME1Qd3JDZmdBQmFuZFs1XTsKKwl1bnNpZ25lZCBsb25nIFR4MjBNUHdyQ2ZnR0JhbmRbNV07CisJdW5zaWduZWQgbG9uZyBUeDQwTVB3ckNmZ0FCYW5kWzVdOworCXVuc2lnbmVkIGxvbmcgVHg0ME1Qd3JDZmdHQmFuZFs1XTsKIAotCUJPT0xFQU4gICAgIGJBdXRvVHhBZ2NBOyAgICAgICAgICAgICAgICAvLyBFbmFibGUgZHJpdmVyIGF1dG8gVHggQWdjIGNvbnRyb2wKLQlVQ0hBUgkgICAgVHNzaVJlZkE7CQkJCQkvLyBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4KLQlVQ0hBUgkgICAgVHNzaVBsdXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBpbmNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUc3NpTWludXNCb3VuZGFyeUFbNV07CQkvLyBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLgotCVVDSEFSCSAgICBUeEFnY1N0ZXBBOwkJCQkJLy8gU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUKLQlDSEFSCQlUeEFnY0NvbXBlbnNhdGVBOwkJCS8vIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpCisJQk9PTEVBTiBiQXV0b1R4QWdjQTsJLyogRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sICovCisJdTggVHNzaVJlZkE7CQkvKiBTdG9yZSBUc3NpIHJlZmVyZW5jZSB2YWx1ZSBhcyAyNSB0ZW1wZXJhdHVyZS4gKi8KKwl1OCBUc3NpUGx1c0JvdW5kYXJ5QVs1XTsJLyogVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4gKi8KKwl1OCBUc3NpTWludXNCb3VuZGFyeUFbNV07CS8qIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuICovCisJdTggVHhBZ2NTdGVwQTsJLyogU3RvcmUgVHggVFNTSSBkZWx0YSBpbmNyZW1lbnQgLyBkZWNyZW1lbnQgdmFsdWUgKi8KKwljaGFyIFR4QWdjQ29tcGVuc2F0ZUE7CS8qIFN0b3JlIHRoZSBjb21wZW5zYXRpb24gKFR4QWdjU3RlcCAqIChpZHgtMSkpICovCiAKLQlCT09MRUFOICAgICBiQXV0b1R4QWdjRzsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCi0JVUNIQVIJICAgIFRzc2lSZWZHOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCi0JVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KLQlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlHWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KLQlVQ0hBUgkgICAgVHhBZ2NTdGVwRzsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCi0JQ0hBUgkJVHhBZ2NDb21wZW5zYXRlRzsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQorCUJPT0xFQU4gYkF1dG9UeEFnY0c7CS8qIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbCAqLworCXU4IFRzc2lSZWZHOwkJLyogU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuICovCisJdTggVHNzaVBsdXNCb3VuZGFyeUdbNV07CS8qIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuICovCisJdTggVHNzaU1pbnVzQm91bmRhcnlHWzVdOwkvKiBUc3NpIGJvdW5kYXJ5IGZvciBkZWNyZWFzZSBUeCBwb3dlciB0byBjb21wZW5zYXRlLiAqLworCXU4IFR4QWdjU3RlcEc7CS8qIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlICovCisJY2hhciBUeEFnY0NvbXBlbnNhdGVHOwkvKiBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSAqLwogCi0JLy8rKytGb3IgUlQyODcwLCB0aGUgcGFyYW1ldGVyZXMgaXMgc3RhcnQgZnJvbSBCR1Jzc2lPZmZzZXQxIH4gQkdSc3NpT2Zmc2V0MwotCUNIQVIJCUJHUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aAotCUNIQVIJCUJHUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlCi0JQ0hBUgkJQkdSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUKLQkvLy0tLQorCWNoYXIgQkdSc3NpT2Zmc2V0MDsJLyogU3RvcmUgQi9HIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NDZoICovCisJY2hhciBCR1Jzc2lPZmZzZXQxOwkvKiBTdG9yZSBCL0cgUlNTSSMxIE9mZnNldCB2YWx1ZSAqLworCWNoYXIgQkdSc3NpT2Zmc2V0MjsJLyogU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUgKi8KIAotCS8vKysrRm9yIFJUMjg3MCwgdGhlIHBhcmFtZXRlcmVzIGlzIHN0YXJ0IGZyb20gQVJzc2lPZmZzZXQxIH4gQVJzc2lPZmZzZXQzCi0JQ0hBUgkJQVJzc2lPZmZzZXQwOwkJCQkvLyBTdG9yZSBBIFJTU0kjMCBPZmZzZXQgdmFsdWUgb24gRUVQUk9NIDB4NEFoCi0JQ0hBUgkJQVJzc2lPZmZzZXQxOwkJCQkvLyBTdG9yZSBBIFJTU0kjMSBPZmZzZXQgdmFsdWUKLQlDSEFSCQlBUnNzaU9mZnNldDI7CQkJCS8vIFN0b3JlIEEgUlNTSSMyIE9mZnNldCB2YWx1ZQotCS8vLS0tCisJY2hhciBBUnNzaU9mZnNldDA7CS8qIFN0b3JlIEEgUlNTSSMwIE9mZnNldCB2YWx1ZSBvbiBFRVBST00gMHg0QWggKi8KKwljaGFyIEFSc3NpT2Zmc2V0MTsJLyogU3RvcmUgQSBSU1NJIzEgT2Zmc2V0IHZhbHVlICovCisJY2hhciBBUnNzaU9mZnNldDI7CS8qIFN0b3JlIEEgUlNTSSMyIE9mZnNldCB2YWx1ZSAqLwogCi0JQ0hBUgkJQkxOQUdhaW47CQkJCQkvLyBTdG9yZSBCL0cgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgb24gRUVQUk9NIDB4NDRoCi0JQ0hBUgkJQUxOQUdhaW4wOwkJCQkJLy8gU3RvcmUgQSBleHRlcm5hbCBMTkEjMCB2YWx1ZSBmb3IgY2gzNn42NAotCUNIQVIJCUFMTkFHYWluMTsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzEgdmFsdWUgZm9yIGNoMTAwfjEyOAotCUNIQVIJCUFMTkFHYWluMjsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzIgdmFsdWUgZm9yIGNoMTMyfjE2NQorCWNoYXIgQkxOQUdhaW47CQkvKiBTdG9yZSBCL0cgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgb24gRUVQUk9NIDB4NDRoICovCisJY2hhciBBTE5BR2FpbjA7CQkvKiBTdG9yZSBBIGV4dGVybmFsIExOQSMwIHZhbHVlIGZvciBjaDM2fjY0ICovCisJY2hhciBBTE5BR2FpbjE7CQkvKiBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjggKi8KKwljaGFyIEFMTkFHYWluMjsJCS8qIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzIgdmFsdWUgZm9yIGNoMTMyfjE2NSAqLworI2lmZGVmIFJUMzB4eAorCS8qIGZvciAzNTcyICovCisJdTggQmJwMjU7CisJdTggQmJwMjY7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gTEVEIGNvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTUNVX0xFRENTX1NUUlVDCQlMZWRDbnRsOwotCVVTSE9SVAkJCQlMZWQxOwkvLyByZWFkIGZyb20gRUVQUk9NIDB4M2MKLQlVU0hPUlQJCQkJTGVkMjsJLy8gRUVQUk9NIDB4M2UKLQlVU0hPUlQJCQkJTGVkMzsJLy8gRUVQUk9NIDB4NDAKLQlVQ0hBUgkJCQlMZWRJbmRpY2F0b3JTdHJlZ3RoOwotCVVDSEFSCQkJCVJzc2lTaW5nYWxzdHJlbmd0aE9mZmV0OwotICAgIEJPT0xFQU4JCQkJYkxlZE9uU2Nhbm5pbmc7Ci0JVUNIQVIJCQkJTGVkU3RhdHVzOworCXU4IFR4TWl4ZXJHYWluMjRHOwkvKiBUeCBtaXhlciBnYWluIHZhbHVlIGZyb20gRUVQUk9NIHRvIGltcHJvdmUgVHggRVZNIC8gVHggREFDLCAyLjRHICovCisJdTggVHhNaXhlckdhaW41RzsKKyNlbmRpZgkJCQkvKiBSVDMweHggLy8gKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogTEVEIGNvbnRyb2wgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJTUNVX0xFRENTX1NUUlVDIExlZENudGw7CisJdTE2IExlZDE7CQkvKiByZWFkIGZyb20gRUVQUk9NIDB4M2MgKi8KKwl1MTYgTGVkMjsJCS8qIEVFUFJPTSAweDNlICovCisJdTE2IExlZDM7CQkvKiBFRVBST00gMHg0MCAqLworCXU4IExlZEluZGljYXRvclN0cmVuZ3RoOworCXU4IFJzc2lTaW5nYWxzdHJlbmd0aE9mZmV0OworCUJPT0xFQU4gYkxlZE9uU2Nhbm5pbmc7CisJdTggTGVkU3RhdHVzOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgIDgwMi4xMSByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy8gb3V0Z29pbmcgQkVBQ09OIGZyYW1lIGJ1ZmZlciBhbmQgY29ycmVzcG9uZGluZyBUWEQKLQlUWFdJX1NUUlVDICAgICAgICAgICAgICAJQmVhY29uVHhXSTsKLQlQVUNIQVIJCQkJCQlCZWFjb25CdWY7Ci0JVVNIT1JUCQkJCQkJQmVhY29uT2Zmc2V0W0hXX0JFQUNPTl9NQVhfQ09VTlRdOworCS8qIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhEICovCisJc3RydWN0IHJ0X3R4d2kgQmVhY29uVHhXSTsKKwl1OCAqQmVhY29uQnVmOworCXUxNiBCZWFjb25PZmZzZXRbSFdfQkVBQ09OX01BWF9DT1VOVF07CiAKLQkvLyBwcmUtYnVpbGQgUFMtUE9MTCBhbmQgTlVMTCBmcmFtZSB1cG9uIGxpbmsgdXAuIGZvciBlZmZpY2llbmN5IHB1cnBvc2UuCi0JUFNQT0xMX0ZSQU1FICAgICAgICAgICAgCVBzUG9sbEZyYW1lOwotCUhFQURFUl84MDJfMTEgICAgICAgICAgIAlOdWxsRnJhbWU7CisJLyogcHJlLWJ1aWxkIFBTLVBPTEwgYW5kIE5VTEwgZnJhbWUgdXBvbiBsaW5rIHVwLiBmb3IgZWZmaWNpZW5jeSBwdXJwb3NlLiAqLworCXN0cnVjdCBydF9wc3BvbGxfZnJhbWUgUHNQb2xsRnJhbWU7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgTnVsbEZyYW1lOwogCi0jaWZkZWYgUlQyODcwCi0JVFhfQ09OVEVYVAkJCQlCZWFjb25Db250ZXh0W0JFQUNPTl9SSU5HX1NJWkVdOwotCVRYX0NPTlRFWFQJCQkJTnVsbENvbnRleHQ7Ci0JVFhfQ09OVEVYVAkJCQlQc1BvbGxDb250ZXh0OwotCVRYX0NPTlRFWFQJCQkJUlRTQ29udGV4dDsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCBCZWFjb25Db250ZXh0W0JFQUNPTl9SSU5HX1NJWkVdOworCXN0cnVjdCBydF90eF9jb250ZXh0IE51bGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0IFBzUG9sbENvbnRleHQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgUlRTQ29udGV4dDsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAorLyo9PT09PT09PT1BUD09PT09PT09PT09ICovCiAKKy8qPT09PT09PVNUQT09PT09PT09PT09ICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAmIG9wZXJhdGlvbiBzdGF0dXMgKi8KKwkvKiB1c2VkIG9ubHkgd2hlbiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlzdHJ1Y3QgcnRfc3RhX2FkbWluX2NvbmZpZyBTdGFDZmc7CS8qIHVzZXIgZGVzaXJlZCBzZXR0aW5ncyAqLworCXN0cnVjdCBydF9zdGFfYWN0aXZlX2NvbmZpZyBTdGFBY3RpdmU7CS8qIHZhbGlkIG9ubHkgd2hlbiBBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkgKi8KKwljaGFyIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CS8qIG5pY2tuYW1lLCBvbmx5IHVzZWQgaW4gdGhlIGl3Y29uZmlnIGkvZiAqLworCWludCBQcmVNZWRpYVN0YXRlOwogCi0vLz09PT09PT09PUFQPT09PT09PT09PT0KKy8qPT09PT09PUNvbW1vbj09PT09PT09PT09ICovCisJLyogT1AgbW9kZTogZWl0aGVyIEFQIG9yIFNUQSAqLworCXU4IE9wTW9kZTsJCS8qIE9QTU9ERV9TVEEsIE9QTU9ERV9BUCAqLwogCisJaW50IEluZGljYXRlTWVkaWFTdGF0ZTsJLyogQmFzZSBvbiBJbmRpY2F0aW9uIHN0YXRlLCBkZWZhdWx0IGlzIE5kaXNNZWRpYVN0YXRlRGlzQ29ubmVjdGVkICovCiAKLS8vPT09PT09PVNUQT09PT09PT09PT09Ci0vKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiAmIG9wZXJhdGlvbiBzdGF0dXMKLQkvLyB1c2VkIG9ubHkgd2hlbiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlTVEFfQURNSU5fQ09ORklHICAgICAgICBTdGFDZmc7ICAgICAgICAgICAvLyB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKLQlTVEFfQUNUSVZFX0NPTkZJRyAgICAgICBTdGFBY3RpdmU7ICAgICAgICAgLy8gdmFsaWQgb25seSB3aGVuIEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKQotCUNIQVIgICAgICAgICAgICAgICAgICAgIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOyAvLyBuaWNrbmFtZSwgb25seSB1c2VkIGluIHRoZSBpd2NvbmZpZyBpL2YKLQlORElTX01FRElBX1NUQVRFICAgICAgICBQcmVNZWRpYVN0YXRlOworCS8qIE1BVCByZWxhdGVkIHBhcmFtZXRlcnMgKi8KIAotLy89PT09PT09Q29tbW9uPT09PT09PT09PT0KLQkvLyBPUCBtb2RlOiBlaXRoZXIgQVAgb3IgU1RBCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgT3BNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8vIE9QTU9ERV9TVEEsIE9QTU9ERV9BUAorCS8qIGNvbmZpZ3VyYXRpb246IHJlYWQgZnJvbSBSZWdpc3RyeSAmIEUyUFJPTSAqLworCUJPT0xFQU4gYkxvY2FsQWRtaW5NQUM7CS8qIFVzZSB1c2VyIGNoYW5nZWQgTUFDICovCisJdTggUGVybWFuZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOwkvKiBGYWN0b3J5IGRlZmF1bHQgTUFDIGFkZHJlc3MgKi8KKwl1OCBDdXJyZW50QWRkcmVzc1tNQUNfQUREUl9MRU5dOwkvKiBVc2VyIGNoYW5nZWQgTUFDIGFkZHJlc3MgKi8KIAotCU5ESVNfTUVESUFfU1RBVEUgICAgICAgIEluZGljYXRlTWVkaWFTdGF0ZTsJCQkvLyBCYXNlIG9uIEluZGljYXRpb24gc3RhdGUsIGRlZmF1bHQgaXMgTmRpc01lZGlhU3RhdGVEaXNDb25uZWN0ZWQKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBjb21tb24gY29uZmlndXJhdGlvbiB0byBib3RoIE9QTU9ERV9TVEEgYW5kIE9QTU9ERV9BUCAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCXN0cnVjdCBydF9jb21tb25fY29uZmlnIENvbW1vbkNmZzsKKwlzdHJ1Y3QgcnRfbWxtZSBNbG1lOwogCisJLyogQVAgbmVlZHMgdGhvc2UgdmFpYWJsZXMgZm9yIHNpdGUgc3VydmV5IGZlYXR1cmUuICovCisJc3RydWN0IHJ0X21sbWVfYXV4IE1sbWVBdXg7CS8qIHRlbXBvcmFyeSBzZXR0aW5ncyB1c2VkIGR1cmluZyBNTE1FIHN0YXRlIG1hY2hpbmUgKi8KKwlzdHJ1Y3QgcnRfYnNzX3RhYmxlIFNjYW5UYWI7CS8qIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQgKi8KIAotCS8vIGNvbmZpZ3VyYXRpb246IHJlYWQgZnJvbSBSZWdpc3RyeSAmIEUyUFJPTQotCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJMb2NhbEFkbWluTUFDOyAgICAgICAgICAgICAvLyBVc2UgdXNlciBjaGFuZ2VkIE1BQwotCVVDSEFSICAgICAgICAgICAgICAgICAgIFBlcm1hbmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgLy8gRmFjdG9yeSBkZWZhdWx0IE1BQyBhZGRyZXNzCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgICAvLyBVc2VyIGNoYW5nZWQgTUFDIGFkZHJlc3MKKwkvKkFib3V0IE1hY1RhYiwgdGhlIHN0YSBkcml2ZXIgd2lsbCB1c2UgIzAgYW5kICMxIGZvciBtdWx0aWNhc3QgYW5kIEFQLiAqLworCXN0cnVjdCBydF9tYWNfdGFibGUgTWFjVGFiOwkvKiBBU0lDIG9uLWNoaXAgV0NJRCBlbnRyeSB0YWJsZS4gIEF0IFRYLCBBU0lDIGFsd2F5cyB1c2Uga2V5IGFjY29yZGluZyB0byB0aGlzIG9uLWNoaXAgdGFibGUuICovCisJc3BpbmxvY2tfdCBNYWNUYWJMb2NrOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gY29tbW9uIGNvbmZpZ3VyYXRpb24gdG8gYm90aCBPUE1PREVfU1RBIGFuZCBPUE1PREVfQVAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlDT01NT05fQ09ORklHICAgICAgICAgICBDb21tb25DZmc7Ci0JTUxNRV9TVFJVQ1QgICAgICAgICAgICAgTWxtZTsKKwlzdHJ1Y3QgcnRfYmFfdGFibGUgQkFUYWJsZTsKIAotCS8vIEFQIG5lZWRzIHRob3NlIHZhaWFibGVzIGZvciBzaXRlIHN1cnZleSBmZWF0dXJlLgotCU1MTUVfQVVYICAgICAgICAgICAgICAgIE1sbWVBdXg7ICAgICAgICAgICAvLyB0ZW1wb3Jhcnkgc2V0dGluZ3MgdXNlZCBkdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lCi0JQlNTX1RBQkxFICAgICAgICAgICAgICAgU2NhblRhYjsgICAgICAgICAgIC8vIHN0b3JlIHRoZSBsYXRlc3QgU0NBTiByZXN1bHQKKwlzcGlubG9ja190IEJBVGFiTG9jazsKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyIFJFQ0JBVGltZXI7CiAKLQkvL0Fib3V0IE1hY1RhYiwgdGhlIHN0YSBkcml2ZXIgd2lsbCB1c2UgIzAgYW5kICMxIGZvciBtdWx0aWNhc3QgYW5kIEFQLgotCU1BQ19UQUJMRSAgICAgICAgICAgICAgICAgTWFjVGFiOyAgICAgLy8gQVNJQyBvbi1jaGlwIFdDSUQgZW50cnkgdGFibGUuICBBdCBUWCwgQVNJQyBhbHdheXMgdXNlIGtleSBhY2NvcmRpbmcgdG8gdGhpcyBvbi1jaGlwIHRhYmxlLgotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1hY1RhYkxvY2s7CisJLyogZW5jcnlwdGlvbi9kZWNyeXB0aW9uIEtFWSB0YWJsZXMgKi8KKwlzdHJ1Y3QgcnRfY2lwaGVyX2tleSBTaGFyZWRLZXlbTUFYX01CU1NJRF9OVU1dWzRdOwkvKiBTVEEgYWx3YXlzIHVzZSBTaGFyZWRLZXlbQlNTMF1bMC4uM10gKi8KIAotCUJBX1RBQkxFCQkJQkFUYWJsZTsKKwkvKiBSWCByZS1hc3NlbWJseSBidWZmZXIgZm9yIGZyYWdtZW50YXRpb24gKi8KKwlzdHJ1Y3QgcnRfZnJhZ21lbnRfZnJhbWUgRnJhZ0ZyYW1lOwkvKiBGcmFtZSBzdG9yYWdlIGZvciBmcmFnbWVudCBmcmFtZSAqLwogCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgQkFUYWJMb2NrOwotCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKKwkvKiB2YXJpb3VzIENvdW50ZXJzICovCisJc3RydWN0IHJ0X2NvdW50ZXJfODAyXzMgQ291bnRlcnM4MDIzOwkvKiA4MDIuMyBjb3VudGVycyAqLworCXN0cnVjdCBydF9jb3VudGVyXzgwMl8xMSBXbGFuQ291bnRlcnM7CS8qIDgwMi4xMSBNSUIgY291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl9yYWxpbmsgUmFsaW5rQ291bnRlcnM7CS8qIFJhbGluayBwcm9wcmlldHkgY291bnRlcnMgKi8KKwlzdHJ1Y3QgcnRfY291bnRlcl9kcnMgRHJzQ291bnRlcnM7CS8qIGNvdW50ZXJzIGZvciBEeW5hbWljIFRYIFJhdGUgU3dpdGNoaW5nICovCisJc3RydWN0IHJ0X3ByaXZhdGUgUHJpdmF0ZUluZm87CS8qIFByaXZhdGUgaW5mb3JtYXRpb24gJiBjb3VudGVycyAqLwogCi0JLy8gZW5jcnlwdGlvbi9kZWNyeXB0aW9uIEtFWSB0YWJsZXMKLQlDSVBIRVJfS0VZICAgICAgICAgICAgICBTaGFyZWRLZXlbTUFYX01CU1NJRF9OVU1dWzRdOyAvLyBTVEEgYWx3YXlzIHVzZSBTaGFyZWRLZXlbQlNTMF1bMC4uM10KKwkvKiBmbGFncywgc2VlIGZSVE1QX0FEQVBURVJfeHh4IGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBGbGFnczsJCS8qIFJlcHJlc2VudCBjdXJyZW50IGRldmljZSBzdGF0dXMgKi8KKwl1bnNpZ25lZCBsb25nIFBTRmxhZ3M7CQkvKiBQb3dlciBTYXZlIG9wZXJhdGlvbiBmbGFnLiAqLwogCi0JCS8vIFJYIHJlLWFzc2VtYmx5IGJ1ZmZlciBmb3IgZnJhZ21lbnRhdGlvbgotCUZSQUdNRU5UX0ZSQU1FICAgICAgICAgIEZyYWdGcmFtZTsgICAgICAgICAgICAgICAgICAvLyBGcmFtZSBzdG9yYWdlIGZvciBmcmFnbWVudCBmcmFtZQorCS8qIGN1cnJlbnQgVFggc2VxdWVuY2UgIyAqLworCXUxNiBTZXF1ZW5jZTsKIAotCS8vIHZhcmlvdXMgQ291bnRlcnMKLQlDT1VOVEVSXzgwMl8zICAgICAgICAgICBDb3VudGVyczgwMjM7ICAgICAgICAgICAgICAgLy8gODAyLjMgY291bnRlcnMKLQlDT1VOVEVSXzgwMl8xMSAgICAgICAgICBXbGFuQ291bnRlcnM7ICAgICAgICAgICAgICAgLy8gODAyLjExIE1JQiBjb3VudGVycwotCUNPVU5URVJfUkFMSU5LICAgICAgICAgIFJhbGlua0NvdW50ZXJzOyAgICAgICAgICAgICAvLyBSYWxpbmsgcHJvcHJpZXR5IGNvdW50ZXJzCi0JQ09VTlRFUl9EUlMgICAgICAgICAgICAgRHJzQ291bnRlcnM7ICAgICAgICAgICAgICAgIC8vIGNvdW50ZXJzIGZvciBEeW5hbWljIFRYIFJhdGUgU3dpdGNoaW5nCi0JUFJJVkFURV9TVFJVQyAgICAgICAgICAgUHJpdmF0ZUluZm87ICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgaW5mb3JtYXRpb24gJiBjb3VudGVycworCS8qIENvbnRyb2wgZGlzY29ubmVjdCAvIGNvbm5lY3QgZXZlbnQgZ2VuZXJhdGlvbiAqLworCS8qKysrRGlkbid0IHVzZWQgYW55bW9yZSAqLworCXVuc2lnbmVkIGxvbmcgTGlua0Rvd25UaW1lOworCS8qLS0tICovCisJdW5zaWduZWQgbG9uZyBMYXN0UnhSYXRlOworCXVuc2lnbmVkIGxvbmcgTGFzdFR4UmF0ZTsKKwkvKisrK1VzZWQgb25seSBmb3IgU3RhdGlvbiAqLworCUJPT0xFQU4gYkNvbmZpZ0NoYW5nZWQ7CS8qIENvbmZpZyBDaGFuZ2UgZmxhZyBmb3IgdGhlIHNhbWUgU1NJRCBzZXR0aW5nICovCisJLyotLS0gKi8KIAotCS8vIGZsYWdzLCBzZWUgZlJUTVBfQURBUFRFUl94eHggZmxhZ3MKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBGbGFnczsgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwcmVzZW50IGN1cnJlbnQgZGV2aWNlIHN0YXR1cwotI2lmZGVmIFJUMjg2MAotCVVMT05HICAgICAgICAgICAgICAgICAgIFBTRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAvLyBQb3dlciBTYXZlIG9wZXJhdGlvbiBmbGFnLgotI2VuZGlmCisJdW5zaWduZWQgbG9uZyBFeHRyYUluZm87CS8qIEV4dHJhIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5aW5nIHN0YXR1cyAqLworCXVuc2lnbmVkIGxvbmcgU3lzdGVtRXJyb3JCaXRtYXA7CS8qIGIwOiBFMlBST00gdmVyc2lvbiBlcnJvciAqLwogCi0JLy8gY3VycmVudCBUWCBzZXF1ZW5jZSAjCi0JVVNIT1JUICAgICAgICAgICAgICAgICAgU2VxdWVuY2U7CisJLyorKytEaWRuJ3QgdXNlZCBhbnltb3JlICovCisJdW5zaWduZWQgbG9uZyBNYWNJY1ZlcnNpb247CS8qIE1BQy9CQlAgc2VyaWFsIGludGVyZmFjZSBpc3N1ZSBzb2x2ZWQgYWZ0ZXIgdmVyLkQgKi8KKwkvKi0tLSAqLwogCi0JLy8gQ29udHJvbCBkaXNjb25uZWN0IC8gY29ubmVjdCBldmVudCBnZW5lcmF0aW9uCi0JLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgTGlua0Rvd25UaW1lOwotCS8vLS0tCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFJ4UmF0ZTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBMYXN0VHhSYXRlOwotCS8vKysrVXNlZCBvbmx5IGZvciBTdGF0aW9uCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgYkNvbmZpZ0NoYW5nZWQ7ICAgICAgICAgLy8gQ29uZmlnIENoYW5nZSBmbGFnIGZvciB0aGUgc2FtZSBTU0lEIHNldHRpbmcKLQkvLy0tLQorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN5c3RlbSBldmVudCBsb2cgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlzdHJ1Y3QgcnRfODAyXzExX2V2ZW50X3RhYmxlIEV2ZW50VGFiOwogCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgRXh0cmFJbmZvOyAgICAgICAgICAgICAgLy8gRXh0cmEgaW5mb3JtYXRpb24gZm9yIGRpc3BsYXlpbmcgc3RhdHVzCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgU3lzdGVtRXJyb3JCaXRtYXA7ICAgICAgLy8gYjA6IEUyUFJPTSB2ZXJzaW9uIGVycm9yCi0KLQkvLysrK0RpZG4ndCB1c2VkIGFueW1vcmUKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBNYWNJY1ZlcnNpb247ICAgICAgICAgICAvLyBNQUMvQkJQIHNlcmlhbCBpbnRlcmZhY2UgaXNzdWUgc29sdmVkIGFmdGVyIHZlci5ECi0JLy8tLS0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFN5c3RlbSBldmVudCBsb2cKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlSVF84MDJfMTFfRVZFTlRfVEFCTEUgICBFdmVudFRhYjsKLQotCi0JQk9PTEVBTgkJSFRDRW5hYmxlOworCUJPT0xFQU4gSFRDRW5hYmxlOwogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCS8qICAgICAgU3RhdGlzdGljIHJlbGF0ZWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgUlQyODcwCi0JVUxPTkcJCQkJCQlCdWxrT3V0RGF0YU9uZVNlY0NvdW50OwotCVVMT05HCQkJCQkJQnVsa0luRGF0YU9uZVNlY0NvdW50OwotCVVMT05HCQkJCQkJQnVsa0xhc3RPbmVTZWNDb3VudDsgLy8gQnVsa091dERhdGFPbmVTZWNDb3VudCArIEJ1bGtJbkRhdGFPbmVTZWNDb3VudAotCVVMT05HCQkJCQkJd2F0Y2hEb2dSeENudDsKLQlVTE9ORwkJCQkJCXdhdGNoRG9nUnhPdmVyRmxvd0NudDsKLQlVTE9ORwkJCQkJCXdhdGNoRG9nVHhQZW5kaW5nQ250W05VTV9PRl9UWF9SSU5HXTsKLSNlbmRpZiAvLyBSVDI4NzAgLy8KKyNpZmRlZiBSVE1QX01BQ19VU0IKKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXREYXRhT25lU2VjQ291bnQ7CisJdW5zaWduZWQgbG9uZyBCdWxrSW5EYXRhT25lU2VjQ291bnQ7CisJdW5zaWduZWQgbG9uZyBCdWxrTGFzdE9uZVNlY0NvdW50OwkvKiBCdWxrT3V0RGF0YU9uZVNlY0NvdW50ICsgQnVsa0luRGF0YU9uZVNlY0NvdW50ICovCisJdW5zaWduZWQgbG9uZyB3YXRjaERvZ1J4Q250OworCXVuc2lnbmVkIGxvbmcgd2F0Y2hEb2dSeE92ZXJGbG93Q250OworCXVuc2lnbmVkIGxvbmcgd2F0Y2hEb2dUeFBlbmRpbmdDbnRbTlVNX09GX1RYX1JJTkddOworCWludCBUcmFuc2ZlcmVkTGVuZ3RoW05VTV9PRl9UWF9SSU5HXTsKKyNlbmRpZgkJCQkvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAotCUJPT0xFQU4JCQkJCQliVXBkYXRlQmNuQ250RG9uZTsKLQlVTE9ORwkJCQkJCXdhdGNoRG9nTWFjRGVhZGxvY2s7CS8vIHByZXZlbnQgTUFDL0JCUCBpbnRvIGRlYWRsb2NrIGNvbmRpdGlvbgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBERUJVRyBwYXJhbWVydHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQk9PTEVBTgkJYkJhbkFsbEJhU2V0dXA7Ci0JQk9PTEVBTgkJYlByb21pc2N1b3VzOworCUJPT0xFQU4gYlVwZGF0ZUJjbkNudERvbmU7CisJdW5zaWduZWQgbG9uZyB3YXRjaERvZ01hY0RlYWRsb2NrOwkvKiBwcmV2ZW50IE1BQy9CQlAgaW50byBkZWFkbG9jayBjb25kaXRpb24gKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogREVCVUcgcGFyYW1lcnRzICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIERlYnVnU2V0dGluZ1s0XTsgKi8KKwlCT09MRUFOIGJCYW5BbGxCYVNldHVwOworCUJPT0xFQU4gYlByb21pc2N1b3VzOwogCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIHJ0Mjg2MGMgZW11bGF0aW9uLXVzZSBQYXJhbWV0ZXJzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVMT05HCQlydHNhY2N1WzMwXTsKLQlVTE9ORwkJY3RzYWNjdVszMF07Ci0JVUxPTkcJCWNmZW5kYWNjdVszMF07Ci0JVUxPTkcJCWJhY29udGVudFsxNl07Ci0JVUxPTkcJCXJ4aW50W1JYX1JJTkdfU0laRSsxXTsKLQlVQ0hBUgkJcmN2YmFbNjBdOwotCUJPT0xFQU4JCWJMaW5rQWRhcHQ7Ci0JQk9PTEVBTgkJYkZvcmNlUHJpbnRUWDsKLQlCT09MRUFOCQliRm9yY2VQcmludFJYOwotCUJPT0xFQU4JCWJEaXNhYmxlc2Nhbm5pbmc7CQkvL2RlZmluZWQgaW4gUlQyODcwIFVTQgotCUJPT0xFQU4JCWJTdGFGaWZvVGVzdDsKLQlCT09MRUFOCQliUHJvdGVjdGlvblRlc3Q7Ci0JQk9PTEVBTgkJYkhDQ0FUZXN0OwotCUJPT0xFQU4JCWJHZW5PbmVIQ0NBOwotCUJPT0xFQU4JCWJCcm9hZENvbUhUOwotCS8vKysrRm9sbG93aW5nIGFkZCBmcm9tIFJUMjg3MCBVU0IuCi0JVUxPTkcJCUJ1bGtPdXRSZXE7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZTsKLQlVTE9ORwkJQnVsa091dENvbXBsZXRlT3RoZXI7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLy8gc2VlbXMgbm90IHVzZSBub3c/Ci0JVUxPTkcJCUJ1bGtJblJlcTsKLQlVTE9ORwkJQnVsa0luQ29tcGxldGU7Ci0JVUxPTkcJCUJ1bGtJbkNvbXBsZXRlRmFpbDsKLQkvLy0tLQorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBydDI4NjBjIGVtdWxhdGlvbi11c2UgUGFyYW1ldGVycyAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBydHNhY2N1WzMwXTsgKi8KKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBjdHNhY2N1WzMwXTsgKi8KKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICBjZmVuZGFjY3VbMzBdOyAqLworCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIGJhY29udGVudFsxNl07ICovCisJLyp1bnNpZ25lZCBsb25nICAgICAgICAgcnhpbnRbUlhfUklOR19TSVpFKzFdOyAqLworCS8qdTggICAgICAgICByY3ZiYVs2MF07ICovCisJQk9PTEVBTiBiTGlua0FkYXB0OworCUJPT0xFQU4gYkZvcmNlUHJpbnRUWDsKKwlCT09MRUFOIGJGb3JjZVByaW50Ulg7CisJLypCT09MRUFOICAgICAgICAgICAgICAgYkRpc2FibGVzY2FubmluZzsgICAgICAgICAgICAgICAvL2RlZmluZWQgaW4gUlQyODcwIFVTQiAqLworCUJPT0xFQU4gYlN0YUZpZm9UZXN0OworCUJPT0xFQU4gYlByb3RlY3Rpb25UZXN0OworCUJPT0xFQU4gYkJyb2FkQ29tSFQ7CisJLyorKytGb2xsb3dpbmcgYWRkIGZyb20gUlQyODcwIFVTQi4gKi8KKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRSZXE7CisJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGU7CisJdW5zaWduZWQgbG9uZyBCdWxrT3V0Q29tcGxldGVPdGhlcjsKKwl1bnNpZ25lZCBsb25nIEJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLyogc2VlbXMgbm90IHVzZSBub3c/ICovCisJdW5zaWduZWQgbG9uZyBCdWxrSW5SZXE7CisJdW5zaWduZWQgbG9uZyBCdWxrSW5Db21wbGV0ZTsKKwl1bnNpZ25lZCBsb25nIEJ1bGtJbkNvbXBsZXRlRmFpbDsKKwkvKi0tLSAqLwogCi0gICAgc3RydWN0IHdpZmljb25mCQkJV0lGSXRlc3RiZWQ7CisJc3RydWN0IHdpZmljb25mIFdJRkl0ZXN0YmVkOwogCiAJc3RydWN0IHJlb3JkZXJpbmdfbXBkdV9wb29sIG1wZHVfYmxrX3Bvb2w7CiAKLQlVTE9ORwkJCQkJT25lU2Vjb25kbm9uQkVwYWNrZXRzOwkJLy8gcmVjb3JkIG5vbiBCRSBwYWNrZXRzIHBlciBzZWNvbmQKKwl1bnNpZ25lZCBsb25nIE9uZVNlY29uZG5vbkJFcGFja2V0czsJLyogcmVjb3JkIG5vbiBCRSBwYWNrZXRzIHBlciBzZWNvbmQgKi8KIAotICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgIGl3X3N0YXRzOworI2lmZGVmIExJTlVYCisJc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdfc3RhdHM7CiAKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyNlbmRpZgkJCQkvKiBMSU5VWCAvLyAqLwogCi0JVUxPTkcJCQkJCVRidHRUaWNrQ291bnQ7CisJdW5zaWduZWQgbG9uZyBUYnR0VGlja0NvdW50OwogI2lmZGVmIFBDSV9NU0lfU1VQUE9SVAotCUJPT0xFQU4JCQkJCUhhdmVNc2k7Ci0jZW5kaWYgLy8gUENJX01TSV9TVVBQT1JUIC8vCisJQk9PTEVBTiBIYXZlTXNpOworI2VuZGlmCQkJCS8qIFBDSV9NU0lfU1VQUE9SVCAvLyAqLwogCi0KLQlVQ0hBUgkJCQkJaXNfb247CisJdTggaXNfb247CiAKICNkZWZpbmUgVElNRV9CQVNFCQkJKDEwMDAwMDAvT1NfSFopCiAjZGVmaW5lIFRJTUVfT05FX1NFQ09ORAkJKDEwMDAwMDAvVElNRV9CQVNFKQotCVVDSEFSCQkJCQlmbGdfYmVfYWRqdXN0OwotCVVMT05HCQkJCQliZV9hZGp1c3RfbGFzdF90aW1lOworCXU4IGZsZ19iZV9hZGp1c3Q7CisJdW5zaWduZWQgbG9uZyBiZV9hZGp1c3RfbGFzdF90aW1lOwogCisJdTggRmxnQ3RzRW5hYmxlZDsKKwl1OCBQTV9GbGdTdXNwZW5kOwogCi0KLQlVSU5UOAkJCQkJUE1fRmxnU3VzcGVuZDsKLQotI2lmZGVmIFJUMjg3MAotCUJPT0xFQU4JCWJVc2VFZnVzZTsKLSNlbmRpZgotfSBSVE1QX0FEQVBURVIsICpQUlRNUF9BREFQVEVSOwotCi0vLwotLy8gQ2lzY28gSUFQUCBmb3JtYXQKLS8vCi10eXBlZGVmIHN0cnVjdCAgX0NJU0NPX0lBUFBfQ09OVEVOVF8KLXsKLQlVU0hPUlQgICAgIExlbmd0aDsgICAgICAgIC8vSUFQUCBMZW5ndGgKLQlVQ0hBUiAgICAgIE1lc3NhZ2VUeXBlOyAgICAgIC8vSUFQUCB0eXBlCi0JVUNIQVIgICAgICBGdW5jdGlvbkNvZGU7ICAgICAvL0lBUFAgZnVuY3Rpb24gdHlwZQotCVVDSEFSICAgICAgRGVzdGluYWlvbk1BQ1tNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgU291cmNlTUFDW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICBUYWc7ICAgICAgICAgICAvL1RhZyhlbGVtZW50IElFKSAtIEFkamFjZW50IEFQIHJlcG9ydAotCVVTSE9SVCAgICAgVGFnTGVuZ3RoOyAgICAgLy9MZW5ndGggb2YgZWxlbWVudCBub3QgaW5jbHVkaW5nIDQgYnl0ZSBoZWFkZXIKLQlVQ0hBUiAgICAgIE9VSVs0XTsgICAgICAgICAgIC8vMHgwMCwgMHg0MCwgMHg5NiwgMHgwMAotCVVDSEFSICAgICAgUHJldmlvdXNBUFtNQUNfQUREUl9MRU5dOyAgICAgICAvL01BQyBBZGRyZXNzIG9mIGFjY2VzcyBwb2ludAotCVVTSE9SVCAgICAgQ2hhbm5lbDsKLQlVU0hPUlQgICAgIFNzaWRMZW47Ci0JVUNIQVIgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVVNIT1JUICAgICBTZWNvbmRzOyAgICAgICAgICAvL1NlY29uZHMgdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGRpc2Fzc29jaWF0ZWQuCi19IENJU0NPX0lBUFBfQ09OVEVOVCwgKlBDSVNDT19JQVBQX0NPTlRFTlQ7CisjaWZkZWYgUlQzMHh4CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisJQk9PTEVBTiBiVXNlRWZ1c2U7CisJdTggRUVQUk9NSW1hZ2VbMTAyNF07CisjZW5kaWYJCQkJLyogUlRNUF9FRlVTRV9TVVBQT1JUIC8vICovCisjZW5kaWYJCQkJLyogUlQzMHh4IC8vICovCit9OwogCiAjZGVmaW5lIERFTEFZSU5UTUFTSwkJMHgwMDAzZmZmYgogI2RlZmluZSBJTlRNQVNLCQkJCTB4MDAwM2ZmZmIKICNkZWZpbmUgSW5kTWFzawkJCQkweDAwMDNmZmZjCi0jZGVmaW5lIFJ4SU5UCQkJCTB4MDAwMDAwMDUJLy8gRGVsYXllZCBSeCBvciBpbmRpdmkgcngKLSNkZWZpbmUgVHhEYXRhSW50CQkJMHgwMDAwMDBmYQkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAotI2RlZmluZSBUeE1nbXRJbnQJCQkweDAwMDAwMTAyCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4Ci0jZGVmaW5lIFR4Q29oZXJlbnQJCQkweDAwMDIwMDAwCS8vIHR4IGNvaGVyZW50Ci0jZGVmaW5lIFJ4Q29oZXJlbnQJCQkweDAwMDEwMDAwCS8vIHJ4IGNvaGVyZW50Ci0jZGVmaW5lIE1jdUNvbW1hbmQJCQkweDAwMDAwMjAwCS8vIG1jdQotI2RlZmluZSBQcmVUQlRUSW50CQkJMHgwMDAwMTAwMAkvLyBQcmUtVEJUVCBpbnRlcnJ1cHQKLSNkZWZpbmUgVEJUVEludAkJCQkweDAwMDAwODAwCQkvLyBUQlRUIGludGVycnVwdAotI2RlZmluZSBHUFRpbWVPdXRJbnQJCQkweDAwMDA4MDAwCQkvLyBHUHRpbWVvdXQgaW50ZXJydXB0Ci0jZGVmaW5lIEF1dG9XYWtldXBJbnQJCTB4MDAwMDQwMDAJCS8vIEF1dG9XYWtldXBJbnQgaW50ZXJydXB0Ci0jZGVmaW5lIEZpZm9TdGFGdWxsSW50CQkJMHgwMDAwMjAwMAkvLyAgZmlmbyBzdGF0aXN0aWNzIGZ1bGwgaW50ZXJydXB0CisjZGVmaW5lIFJ4SU5UCQkJCTB4MDAwMDAwMDUJLyogRGVsYXllZCBSeCBvciBpbmRpdmkgcnggKi8KKyNkZWZpbmUgVHhEYXRhSW50CQkJMHgwMDAwMDBmYQkvKiBEZWxheWVkIFR4IG9yIGluZGl2aSB0eCAqLworI2RlZmluZSBUeE1nbXRJbnQJCQkweDAwMDAwMTAyCS8qIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4ICovCisjZGVmaW5lIFR4Q29oZXJlbnQJCQkweDAwMDIwMDAwCS8qIHR4IGNvaGVyZW50ICovCisjZGVmaW5lIFJ4Q29oZXJlbnQJCQkweDAwMDEwMDAwCS8qIHJ4IGNvaGVyZW50ICovCisjZGVmaW5lIE1jdUNvbW1hbmQJCQkweDAwMDAwMjAwCS8qIG1jdSAqLworI2RlZmluZSBQcmVUQlRUSW50CQkJMHgwMDAwMTAwMAkvKiBQcmUtVEJUVCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVEJUVEludAkJCQkweDAwMDAwODAwCS8qIFRCVFQgaW50ZXJydXB0ICovCisjZGVmaW5lIEdQVGltZU91dEludAkJCTB4MDAwMDgwMDAJLyogR1B0aW1lb3V0IGludGVycnVwdCAqLworI2RlZmluZSBBdXRvV2FrZXVwSW50CQkweDAwMDA0MDAwCS8qIEF1dG9XYWtldXBJbnQgaW50ZXJydXB0ICovCisjZGVmaW5lIEZpZm9TdGFGdWxsSW50CQkJMHgwMDAwMjAwMAkvKiAgZmlmbyBzdGF0aXN0aWNzIGZ1bGwgaW50ZXJydXB0ICovCiAKLQotdHlwZWRlZiBzdHJ1Y3QgX1JYX0JMS18KLXsKLQlSVDI4WFhfUlhEX1NUUlVDCVJ4RDsKLQlQUlhXSV9TVFJVQwkJCXBSeFdJOwotCVBIRUFERVJfODAyXzExCQlwSGVhZGVyOwotCVBORElTX1BBQ0tFVAkJcFJ4UGFja2V0OwotCVVDSEFSCQkJCSpwRGF0YTsKLQlVU0hPUlQJCQkJRGF0YVNpemU7Ci0JVVNIT1JUCQkJCUZsYWdzOwotCVVDSEFSCQkJCVVzZXJQcmlvcml0eTsJLy8gZm9yIGNhbGN1bGF0ZSBUS0lQIE1JQyB1c2luZwotfSBSWF9CTEs7Ci0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKglSeCBQYXRoIHNvZnR3YXJlIGNvbnRyb2wgYmxvY2sgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgcnRfcnhfYmxrIHsKKwlSVDI4WFhfUlhEX1NUUlVDIFJ4RDsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQ7CisJdTggKnBEYXRhOworCXUxNiBEYXRhU2l6ZTsKKwl1MTYgRmxhZ3M7CisJdTggVXNlclByaW9yaXR5OwkvKiBmb3IgY2FsY3VsYXRlIFRLSVAgTUlDIHVzaW5nICovCit9OwogCiAjZGVmaW5lIFJYX0JMS19TRVRfRkxBRyhfcFJ4QmxrLCBfZmxhZykJCShfcFJ4QmxrLT5GbGFncyB8PSBfZmxhZykKICNkZWZpbmUgUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBfZmxhZykJKF9wUnhCbGstPkZsYWdzICYgX2ZsYWcpCiAjZGVmaW5lIFJYX0JMS19DTEVBUl9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCiAKLQogI2RlZmluZSBmUlhfV0RTCQkJMHgwMDAxCiAjZGVmaW5lIGZSWF9BTVNEVSAgICAgICAweDAwMDIKICNkZWZpbmUgZlJYX0FSQUxJTksgICAgIDB4MDAwNApAQCAtMzAxMiw2ICsyMTk5LDkgQEAKICNkZWZpbmUgTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFECTE0CiAjZGVmaW5lIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRAkgMgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoJVHggUGF0aCBzb2Z0d2FyZSBjb250cm9sIGJsb2NrIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBUWF9VTktPV05fRlJBTUUJCQkweDAwCiAjZGVmaW5lIFRYX01DQVNUX0ZSQU1FCQkJMHgwMQogI2RlZmluZSBUWF9MRUdBQ1lfRlJBTUUJCQkweDAyCkBAIC0zMDIwLDExNCArMjIxMCw2NSBAQAogI2RlZmluZSBUWF9SQUxJTktfRlJBTUUJCQkweDEwCiAjZGVmaW5lIFRYX0ZSQUdfRlJBTUUJCQkweDIwCiAKKy8qICAgICAgQ3VycmVudGx5IHRoZSBzaXplb2Yoc3RydWN0IHJ0X3R4X2JsaykgaXMgMTQ4IGJ5dGVzLiAqLworc3RydWN0IHJ0X3R4X2JsayB7CisJdTggUXVlSWR4OworCXU4IFR4RnJhbWVUeXBlOwkvKiBJbmRpY2F0ZSB0aGUgVHJhbnNtaXNzaW9uIHR5cGUgb2YgdGhlIGFsbCBmcmFtZXMgaW4gb25lIGJhdGNoICovCisJdTggVG90YWxGcmFtZU51bTsJLyogVG90YWwgZnJhbWUgbnVtYmVyIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoICovCisJdTE2IFRvdGFsRnJhZ051bTsJLyogVG90YWwgZnJhbWUgZnJhZ21lbnRzIHJlcXVpcmVkIGluIG9uZSBiYXRjaCAqLworCXUxNiBUb3RhbEZyYW1lTGVuOwkvKiBUb3RhbCBsZW5ndGggb2YgYWxsIGZyYW1lcyB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaCAqLwogCi0vLwlDdXJyZW50bHkgdGhlIHNpemVvZihUWF9CTEspIGlzIDE0OCBieXRlcy4KLXR5cGVkZWYgc3RydWN0IF9UWF9CTEtfCi17Ci0JVUNIQVIJCQkJUXVlSWR4OwotCVVDSEFSCQkJCVR4RnJhbWVUeXBlOwkJCQkvLyBJbmRpY2F0ZSB0aGUgVHJhbnNtaXNzaW9uIHR5cGUgb2YgdGhlIGFsbCBmcmFtZXMgaW4gb25lIGJhdGNoCi0JVUNIQVIJCQkJVG90YWxGcmFtZU51bTsJCQkJLy8gVG90YWwgZnJhbWUgbnVtYmVyIHdhbnQgdG8gc2VuZC1vdXQgaW4gb25lIGJhdGNoCi0JVVNIT1JUCQkJCVRvdGFsRnJhZ051bTsJCQkJLy8gVG90YWwgZnJhbWUgZnJhZ21lbnRzIHJlcXVpcmVkIGluIG9uZSBiYXRjaAotCVVTSE9SVAkJCQlUb3RhbEZyYW1lTGVuOwkJCQkvLyBUb3RhbCBsZW5ndGggb2YgYWxsIGZyYW1lcyB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAorCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgVHhQYWNrZXRMaXN0OworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeTsJLyogTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcyAqLworCUhUVFJBTlNNSVRfU0VUVElORyAqcFRyYW5zbWl0OwogCi0JUVVFVUVfSEVBREVSCQlUeFBhY2tldExpc3Q7Ci0JTUFDX1RBQkxFX0VOVFJZCQkqcE1hY0VudHJ5OwkJCQkJLy8gTlVMTDogcGFja2V0IHdpdGggODAyLjExIFJBIGZpZWxkIGlzIG11bHRpY2FzdC9icm9hZGNhc3QgYWRkcmVzcwotCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0OworCS8qIEZvbGxvd2luZyBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIHBhY2tldC4gKi8KKwl2b2lkICpwUGFja2V0OworCXU4ICpwU3JjQnVmSGVhZGVyOwkvKiBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YSAqLworCXU4ICpwU3JjQnVmRGF0YTsJLyogUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MgKi8KKwl1MzIgU3JjQnVmTGVuOwkJLyogTGVuZ3RoIG9mIHBhY2tldCBwYXlsb2FkIHdoaWNoIG5vdCBpbmNsdWRpbmcgTGF5ZXIgMiBoZWFkZXIgKi8KKwl1OCAqcEV4dHJhTGxjU25hcEVuY2FwOwkvKiBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkICovCisJdTggSGVhZGVyQnVmWzEyOF07CS8qIFRlbXBCdWZmZXIgZm9yIFRYX0lORk8gKyBUWF9XSSArIDgwMi4xMSBIZWFkZXIgKyBwYWRkaW5nICsgQU1TRFUgU3ViSGVhZGVyICsgTExDL1NOQVAgKi8KKwkvKlJUMjg3MCAyLjEuMC4wIHVzZXMgb25seSA4MCBieXRlcyAqLworCS8qUlQzMDcwIDIuMS4xLjAgdXNlcyBvbmx5IDk2IGJ5dGVzICovCisJLypSVDMwOTAgMi4xLjAuMCB1c2VzIG9ubHkgOTYgYnl0ZXMgKi8KKwl1OCBNcGR1SGVhZGVyTGVuOwkvKiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBOT1QgaW5jbHVkaW5nIHRoZSBwYWRkaW5nICovCisJdTggSGRyUGFkTGVuOwkvKiByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOyAqLworCXU4IGFwaWR4OwkJLyogVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0ICovCisJdTggV2NpZDsJCS8qIFRoZSBNQUMgZW50cnkgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldCAqLworCXU4IFVzZXJQcmlvcml0eTsJLyogcHJpb3JpdHkgY2xhc3Mgb2YgcGFja2V0ICovCisJdTggRnJhbWVHYXA7CQkvKiB3aGF0IGtpbmQgb2YgSUZTIHRoaXMgcGFja2V0IHVzZSAqLworCXU4IE1wZHVSZXFOdW07CS8qIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZSAqLworCXU4IFR4UmF0ZTsJCS8qIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/ICovCisJdTggQ2lwaGVyQWxnOwkvKiBjaXBoZXIgYWxvZ3JpdGhtICovCisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBLZXk7CiAKLQkvLyBGb2xsb3dpbmcgc3RydWN0dXJlIHVzZWQgZm9yIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBwYWNrZXQuCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0OwotCVBVQ0hBUgkJCQlwU3JjQnVmSGVhZGVyOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIGhlYWQgb2Ygc2tfYnVmZi0+ZGF0YQotCVBVQ0hBUgkJCQlwU3JjQnVmRGF0YTsJCQkJLy8gUmVmZXJlbmNlIHRvIHRoZSBza19idWZmLT5kYXRhLCB3aWxsIGNoYW5nZWQgZGVwZW5kcyBvbiBoYW5sZGluZyBwcm9ncmVzc3MKLQlVSU5UCQkJCVNyY0J1ZkxlbjsJCQkJCS8vIExlbmd0aCBvZiBwYWNrZXQgcGF5bG9hZCB3aGljaCBub3QgaW5jbHVkaW5nIExheWVyIDIgaGVhZGVyCi0JUFVDSEFSCQkJCXBFeHRyYUxsY1NuYXBFbmNhcDsJCQkvLyBOVUxMIG1lYW5zIG5vIGV4dHJhIExMQy9TTkFQIGlzIHJlcXVpcmVkCi0JVUNIQVIJCQkJSGVhZGVyQnVmWzgwXTsJCQkJLy8gVGVtcEJ1ZmZlciBmb3IgVFhfSU5GTyArIFRYX1dJICsgODAyLjExIEhlYWRlciArIHBhZGRpbmcgKyBBTVNEVSBTdWJIZWFkZXIgKyBMTEMvU05BUAotCVVDSEFSCQkJCU1wZHVIZWFkZXJMZW47CQkJCS8vIDgwMi4xMSBoZWFkZXIgbGVuZ3RoIE5PVCBpbmNsdWRpbmcgdGhlIHBhZGRpbmcKLQlVQ0hBUgkJCQlIZHJQYWRMZW47CQkJCQkvLyByZWNvcmRpbmcgSGVhZGVyIFBhZGRpbmcgTGVuZ3RoOwotCVVDSEFSCQkJCWFwaWR4OwkJCQkJCS8vIFRoZSBpbnRlcmZhY2UgYXNzb2NpYXRlZCB0byB0aGlzIHBhY2tldAotCVVDSEFSCQkJCVdjaWQ7CQkJCQkJLy8gVGhlIE1BQyBlbnRyeSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0Ci0JVUNIQVIJCQkJVXNlclByaW9yaXR5OwkJCQkvLyBwcmlvcml0eSBjbGFzcyBvZiBwYWNrZXQKLQlVQ0hBUgkJCQlGcmFtZUdhcDsJCQkJCS8vIHdoYXQga2luZCBvZiBJRlMgdGhpcyBwYWNrZXQgdXNlCi0JVUNIQVIJCQkJTXBkdVJlcU51bTsJCQkJCS8vIG51bWJlciBvZiBmcmFnbWVudHMgb2YgdGhpcyBmcmFtZQotCVVDSEFSCQkJCVR4UmF0ZTsJCQkJCQkvLyBUT0RPOiBPYnNvbGV0ZWQ/IFNob3VsZCBjaGFuZ2UgdG8gTUNTPwotCVVDSEFSCQkJCUNpcGhlckFsZzsJCQkJCS8vIGNpcGhlciBhbG9ncml0aG0KLQlQQ0lQSEVSX0tFWQkJCXBLZXk7CisJdTE2IEZsYWdzOwkJLypTZWUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBkZXRhaWwuICovCiAKKwkvKllPVSBTSE9VTEQgTk9UIFRPVUNIIElUISBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3IgaGFyZHdhcmUtZGVwZW5kZWQgbGF5ZXIuICovCisJdW5zaWduZWQgbG9uZyBQcml2OwkJLyogSGFyZHdhcmUgc3BlY2lmaWMgdmFsdWUgc2F2ZWQgaW4gaGVyZS4gKi8KK307CiAKLQotCVVTSE9SVAkJCQlGbGFnczsJCQkJCQkvL1NlZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIGRldGFpbC4KLQotCS8vWU9VIFNIT1VMRCBOT1QgVE9VQ0ggSVQhIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIGZvciBoYXJkd2FyZS1kZXBlbmRlZCBsYXllci4KLQlVTE9ORwkJCQlQcml2OwkJCQkJCS8vIEhhcmR3YXJlIHNwZWNpZmljIHZhbHVlIHNhdmVkIGluIGhlcmUuCi19IFRYX0JMSywgKlBUWF9CTEs7Ci0KLQotI2RlZmluZSBmVFhfYlJ0c1JlcXVpcmVkCQkweDAwMDEJLy8gSW5kaWNhdGUgaWYgbmVlZCBzZW5kIFJUUyBmcmFtZSBmb3IgcHJvdGVjdGlvbi4gTm90IHVzZWQgaW4gUlQyODYwL1JUMjg3MC4KLSNkZWZpbmUgZlRYX2JBY2tSZXF1aXJlZCAgICAgICAJMHgwMDAyCS8vIHRoZSBwYWNrZXQgbmVlZCBhY2sgcmVzcG9uc2UKLSNkZWZpbmUgZlRYX2JQaWdneUJhY2sgICAgIAkJMHgwMDA0CS8vIExlZ2FjeSBkZXZpY2UgdXNlIFBpZ2diYWNrIG9yIG5vdAotI2RlZmluZSBmVFhfYkhUUmF0ZSAgICAgICAgIAkweDAwMDgJLy8gYWxsb3cgdG8gdXNlIEhUIHJhdGUKLSNkZWZpbmUgZlRYX2JGb3JjZU5vblFvUyAgICAgICAJMHgwMDEwCS8vIGZvcmNlIHRvIHRyYW5zbWl0IGZyYW1lIHdpdGhvdXQgV01NLVFvUyBpbiBIVCBtb2RlCi0jZGVmaW5lIGZUWF9iQWxsb3dGcmFnICAgICAgIAkweDAwMjAJLy8gYWxsb3cgdG8gZnJhZ21lbnQgdGhlIHBhY2tldCwgQS1NUERVLCBBLU1TRFUsIEEtUmFsaW5rIGlzIG5vdCBhbGxvd2VkIHRvIGZyYWdtZW50Ci0jZGVmaW5lIGZUWF9iTW9yZURhdGEJCQkweDAwNDAJLy8gdGhlcmUgYXJlIG1vcmUgZGF0YSBwYWNrZXRzIGluIFBvd2VyU2F2ZSBRdWV1ZQotI2RlZmluZSBmVFhfYldNTQkJCQkweDAwODAJLy8gUU9TIERhdGEKLQorI2RlZmluZSBmVFhfYlJ0c1JlcXVpcmVkCQkweDAwMDEJLyogSW5kaWNhdGUgaWYgbmVlZCBzZW5kIFJUUyBmcmFtZSBmb3IgcHJvdGVjdGlvbi4gTm90IHVzZWQgaW4gUlQyODYwL1JUMjg3MC4gKi8KKyNkZWZpbmUgZlRYX2JBY2tSZXF1aXJlZCAgICAgICAJMHgwMDAyCS8qIHRoZSBwYWNrZXQgbmVlZCBhY2sgcmVzcG9uc2UgKi8KKyNkZWZpbmUgZlRYX2JQaWdneUJhY2sgICAgIAkJMHgwMDA0CS8qIExlZ2FjeSBkZXZpY2UgdXNlIFBpZ2diYWNrIG9yIG5vdCAqLworI2RlZmluZSBmVFhfYkhUUmF0ZSAgICAgICAgIAkweDAwMDgJLyogYWxsb3cgdG8gdXNlIEhUIHJhdGUgKi8KKyNkZWZpbmUgZlRYX2JGb3JjZU5vblFvUyAgICAgICAJMHgwMDEwCS8qIGZvcmNlIHRvIHRyYW5zbWl0IGZyYW1lIHdpdGhvdXQgV01NLVFvUyBpbiBIVCBtb2RlICovCisjZGVmaW5lIGZUWF9iQWxsb3dGcmFnICAgICAgIAkweDAwMjAJLyogYWxsb3cgdG8gZnJhZ21lbnQgdGhlIHBhY2tldCwgQS1NUERVLCBBLU1TRFUsIEEtUmFsaW5rIGlzIG5vdCBhbGxvd2VkIHRvIGZyYWdtZW50ICovCisjZGVmaW5lIGZUWF9iTW9yZURhdGEJCQkweDAwNDAJLyogdGhlcmUgYXJlIG1vcmUgZGF0YSBwYWNrZXRzIGluIFBvd2VyU2F2ZSBRdWV1ZSAqLworI2RlZmluZSBmVFhfYldNTQkJCQkweDAwODAJLyogUU9TIERhdGEgKi8KICNkZWZpbmUgZlRYX2JDbGVhckVBUEZyYW1lCQkweDAxMDAKIAotI2RlZmluZSBUWF9CTEtfQVNTSUdOX0ZMQUcoX3BUeEJsaywgX2ZsYWcsIHZhbHVlKQlcCi0JCWRvIHsJCQkJCQkJCQkJXAotCQkJaWYgKHZhbHVlKSAJCQkJCQkJCVwKLQkJCQkoX3BUeEJsay0+RmxhZ3MgfD0gX2ZsYWcpIAkJCVwKLQkJCWVsc2UgCQkJCQkJCQkJXAotCQkJCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkJCVwKLQkJfXdoaWxlKDApCi0KICNkZWZpbmUgVFhfQkxLX1NFVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkJKF9wVHhCbGstPkZsYWdzIHw9IF9mbGFnKQogI2RlZmluZSBUWF9CTEtfVEVTVF9GTEFHKF9wVHhCbGssIF9mbGFnKQkoKChfcFR4QmxrLT5GbGFncyAmIF9mbGFnKSA9PSBfZmxhZykgPyAxIDogMCkKICNkZWZpbmUgVFhfQkxLX0NMRUFSX0ZMQUcoX3BUeEJsaywgX2ZsYWcpCShfcFR4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKIAotCi0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgUlQyODYwCi0vLwotLy8gRW5hYmxlICYgRGlzYWJsZSBOSUMgaW50ZXJydXB0IHZpYSB3cml0aW5nIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCi0vLyBTaW5jZSBpdCB1c2UgQURBUFRFUiBzdHJ1Y3R1cmUsIGl0IGhhdmUgdG8gYmUgcHV0IGFmdGVyIHN0cnVjdHVyZSBkZWZpbml0aW9uLgotLy8KLV9faW5saW5lICAgIFZPSUQgICAgTklDRGlzYWJsZUludGVycnVwdCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKLXsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBJTlRfTUFTS19DU1IsIDB4MCk7ICAgICAvLyAwOiBkaXNhYmxlCi0JLy9SVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfSU5UX0VOQSwgMHgwKTsJIAkvLyAweDQxOCBpcyBmb3IgZmlybXdhcmUgLiBTVyBkb2Vzbid0IGhhbmRsZSBoZXJlLgotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Ci19Ci0KLV9faW5saW5lICAgIFZPSUQgICAgTklDRW5hYmxlSW50ZXJydXB0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQotewotCS8vCi0JLy8gRmxhZyAiZk9QX1NUQVRVU19ET1pFIiBPbiwgbWVhbnMgQVNJQyBwdXQgdG8gc2xlZXAsIGVsc2UgbWVhbnMgQVNJQyBXYWtlVXAKLQkvLyBUbyBwcmV2ZW50IFN5c3RlbSBoYW5nLCB3ZSBzaG91bGQgZW5hbGJlIHRoZSBpbnRlcnJ1cHQgd2hlbgotCS8vIEFTSUMgaXMgYWxyZWFkeSBXYWtlIFVwLgotCS8vCi0gICAgLy8gUlQyNjYxID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbm5vdCBiZSByZWFkIGFuZCB3cml0dGVuLgotCS8vIFJUMjg2MCA9PiB3aGVuIEFTSUMgaXMgc2xlZXBpbmcsIE1BQyByZWdpc3RlciBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbi4KLQkvL2lmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcEFkLT5pbnRfZW5hYmxlX3JlZyAvKkRFTEFZSU5UTUFTSyovKTsgICAgIC8vIDE6ZW5hYmxlCi0JfQotCS8vZWxzZQotCS8vCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfRE9aRSAhXG4iKSk7Ci0KLQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9JTlRfRU5BLCAweDAwMDAwMDMwKTsgLy8gMSA6IGVuYWJsZQotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpOwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgQ29udmVydE11bHRpY2FzdElQMk1BQygKLQlJTiBQVUNIQVIgcElwQWRkciwKLQlJTiBQVUNIQVIgKnBwTWFjQWRkciwKLQlJTiBVSU5UMTYgUHJvdG9UeXBlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCU90aGVyIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgQ29udmVydE11bHRpY2FzdElQMk1BQyh1OCAqcElwQWRkciwKKwkJCQkJICB1OCAqKiBwcE1hY0FkZHIsCisJCQkJCSAgdTE2IFByb3RvVHlwZSkKIHsKIAlpZiAocElwQWRkciA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC0zMTM1LDI0MTQgKzIyNzYsMTQ1MCBAQAogCWlmIChwcE1hY0FkZHIgPT0gTlVMTCB8fCAqcHBNYWNBZGRyID09IE5VTEwpCiAJCXJldHVybjsKIAotCXN3aXRjaCAoUHJvdG9UeXBlKQotCXsKLQkJY2FzZSBFVEhfUF9JUFY2OgotLy8JCQltZW1zZXQoKnBwTWFjQWRkciwgMCwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJCSooKnBwTWFjQWRkcikgPSAweDMzOwotCQkJKigqcHBNYWNBZGRyICsgMSkgPSAweDMzOwotCQkJKigqcHBNYWNBZGRyICsgMikgPSBwSXBBZGRyWzEyXTsKLQkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107Ci0JCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMTRdOwotCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzE1XTsKLQkJCWJyZWFrOworCXN3aXRjaCAoUHJvdG9UeXBlKSB7CisJY2FzZSBFVEhfUF9JUFY2OgorLyogICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7ICovCisJCSooKnBwTWFjQWRkcikgPSAweDMzOworCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MzM7CisJCSooKnBwTWFjQWRkciArIDIpID0gcElwQWRkclsxMl07CisJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxM107CisJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsxNF07CisJCSooKnBwTWFjQWRkciArIDUpID0gcElwQWRkclsxNV07CisJCWJyZWFrOwogCi0JCWNhc2UgRVRIX1BfSVA6Ci0JCWRlZmF1bHQ6Ci0vLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCQkJKigqcHBNYWNBZGRyKSA9IDB4MDE7Ci0JCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7Ci0JCQkqKCpwcE1hY0FkZHIgKyAyKSA9IDB4NWU7Ci0JCQkqKCpwcE1hY0FkZHIgKyAzKSA9IHBJcEFkZHJbMV0gJiAweDdmOwotCQkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOwotCQkJKigqcHBNYWNBZGRyICsgNSkgPSBwSXBBZGRyWzNdOwotCQkJYnJlYWs7CisJY2FzZSBFVEhfUF9JUDoKKwlkZWZhdWx0OgorLyogICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7ICovCisJCSooKnBwTWFjQWRkcikgPSAweDAxOworCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MDA7CisJCSooKnBwTWFjQWRkciArIDIpID0gMHg1ZTsKKwkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzFdICYgMHg3ZjsKKwkJKigqcHBNYWNBZGRyICsgNCkgPSBwSXBBZGRyWzJdOworCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbM107CisJCWJyZWFrOwogCX0KIAogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBSVDI4NjAgKi8KIAotLy8KLS8vICBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfaW5pdC5jCi0vLwotTkRJU19TVEFUVVMgUlRNUEFsbG9jQWRhcHRlckJsb2NrKAotCUlOIFBWT0lECQkJaGFuZGxlLAotCU9VVCBQUlRNUF9BREFQVEVSICAgKnBwQWRhcHRlcgotCSk7CitjaGFyICpHZXRQaHlNb2RlKGludCBNb2RlKTsKK2NoYXIgKkdldEJXKGludCBCVyk7CiAKLU5ESVNfU1RBVFVTIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkCi0JKTsKKy8qICovCisvKiAgUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2luaXQuYyAqLworLyogKi8KK2ludCBSVE1QQWxsb2NBZGFwdGVyQmxvY2sodm9pZCAqaGFuZGxlLAorCQkJCSAgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqICogcHBBZGFwdGVyKTsKIAotTkRJU19TVEFUVVMJUlRNUFJlYWRQYXJhbWV0ZXJzSG9vaygKLQlJTglQUlRNUF9BREFQVEVSIHBBZAotCSk7CitpbnQgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QRnJlZUFkYXB0ZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQKLQkpOwordm9pZCBSVE1QRnJlZUFkYXB0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTkRJU19TVEFUVVMgTklDUmVhZFJlZ1BhcmFtZXRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotCUlOICBORElTX0hBTkRMRSAgICAgICAgIFdyYXBwZXJDb25maWd1cmF0aW9uQ29udGV4dAotCSk7CitpbnQgTklDUmVhZFJlZ1BhcmFtZXRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICpXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQpOwogCi0jaWZkZWYgUlQyODcwCi1WT0lEIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCit2b2lkIE5JQ0luaXRSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTglQVUNIQVIJCQkJbWFjX2FkZHIpOwordm9pZCBSdG1wQ2hpcE9wc1JGSG9vayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOworaW50IFJUMzB4eFdyaXRlUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICB1OCByZWdJRCwgdTggdmFsdWUpOwogCi1WT0lEIE5JQ0luaXRUeFJ4UmluZ0FuZEJhY2tsb2dRdWV1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitpbnQgUlQzMHh4UmVhZFJGUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1OCByZWdJRCwgdTggKnBWYWx1ZSk7CisjZW5kaWYgLyogUlRNUF9SRl9SV19TVVBQT1JUIC8vICovCiAKLU5ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBZGFwdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KTsKK3ZvaWQgTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqbWFjX2FkZHIpOwogCi1ORElTX1NUQVRVUyBOSUNJbml0aWFsaXplQXNpYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCk7Ci0jaWZkZWYgUlQyODYwCi1WT0lEIE5JQ1Jlc3RvcmVCQlBWYWx1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYKLVZPSUQgTklDSXNzdWVSZXNldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIE5JQ0luaXRBc2ljRnJvbUVFUFJPTShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBSaW5nQ2xlYW5VcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlKTsKK2ludCBOSUNJbml0aWFsaXplQWRhcHRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkhhcmRSZXNldCk7CiAKLVZPSUQgVXNlckNmZ0luaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworaW50IE5JQ0luaXRpYWxpemVBc2ljKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiSGFyZFJlc2V0KTsKIAotVk9JRCBOSUNSZXNldEZyb21FcnJvcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIE5JQ0lzc3VlUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBOSUNFcmFzZUZpcm13YXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUlRNUFJpbmdDbGVhblVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggUmluZ1R5cGUpOwogCi1ORElTX1NUQVRVUyBOSUNMb2FkRmlybXdhcmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBVc2VyQ2ZnSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1ORElTX1NUQVRVUyBOSUNMb2FkUmF0ZVN3aXRjaGluZ1BhcmFtcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIE5JQ1Jlc2V0RnJvbUVycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gTklDQ2hlY2tGb3JIYW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK2ludCBOSUNMb2FkRmlybXdhcmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBOSUNFcmFzZUZpcm13YXJlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworaW50IE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVMT05HCVJUTVBOb3RBbGxaZXJvKAotCUlOCVBWT0lECXBTcmMxLAotCUlOCVVMT05HCUxlbmd0aCk7CitCT09MRUFOIE5JQ0NoZWNrRm9ySGFuZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBaZXJvTWVtb3J5KAotCUlOICBQVk9JRCAgIHBTcmMsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKK3ZvaWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVMT05HIFJUTVBDb21wYXJlTWVtb3J5KAotCUlOICBQVk9JRCAgIHBTcmMxLAotCUlOICBQVk9JRCAgIHBTcmMyLAotCUlOICBVTE9ORyAgIExlbmd0aCk7Cit2b2lkIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlRNUE1vdmVNZW1vcnkoCi0JT1VUIFBWT0lEICAgcERlc3QsCi0JSU4gIFBWT0lEICAgcFNyYywKLQlJTiAgVUxPTkcgICBMZW5ndGgpOwordm9pZCBSVE1QWmVyb01lbW9yeSh2b2lkICpwU3JjLCB1bnNpZ25lZCBsb25nIExlbmd0aCk7CiAKLVZPSUQgQXRvSCgKLQljaGFyCSpzcmMsCi0JVUNIQVIJKmRlc3QsCi0JaW50CQlkZXN0bGVuKTsKK3Vuc2lnbmVkIGxvbmcgUlRNUENvbXBhcmVNZW1vcnkodm9pZCAqcFNyYzEsIHZvaWQgKnBTcmMyLCB1bnNpZ25lZCBsb25nIExlbmd0aCk7CiAKLVVDSEFSIEJ0b0goCi0JY2hhciBjaCk7Cit2b2lkIFJUTVBNb3ZlTWVtb3J5KHZvaWQgKnBEZXN0LCB2b2lkICpwU3JjLCB1bnNpZ25lZCBsb25nIExlbmd0aCk7CiAKLVZPSUQgUlRNUFBhdGNoTWFjQmJwQnVnKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgQXRvSChjaGFyICpzcmMsIHU4ICpkZXN0LCBpbnQgZGVzdGxlbik7CiAKLVZPSUQgUlRNUEluaXRUaW1lcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICAgICAgcEFkLAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JSU4gIFBWT0lEICAgICAgICAgICAgICAgICAgIHBUaW1lckZ1bmMsCi0JSU4JUFZPSUQJCQkJCXBEYXRhLAotCUlOICBCT09MRUFOICAgICAgICAgICAgICAgICBSZXBlYXQpOwordTggQnRvSChjaGFyIGNoKTsKIAotVk9JRCBSVE1QU2V0VGltZXIoCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKLQlJTiAgVUxPTkcgICAgICAgICAgICAgICAgICAgVmFsdWUpOwordm9pZCBSVE1QUGF0Y2hNYWNCYnBCdWcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAordm9pZCBSVE1QSW5pdFRpbWVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLAorCQkgICB2b2lkICpwVGltZXJGdW5jLCB2b2lkICpwRGF0YSwgSU4gQk9PTEVBTiBSZXBlYXQpOwogCi1WT0lEIFJUTVBNb2RUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKTsKK3ZvaWQgUlRNUFNldFRpbWVyKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwgdW5zaWduZWQgbG9uZyBWYWx1ZSk7CiAKLVZPSUQgUlRNUENhbmNlbFRpbWVyKAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JT1VUIEJPT0xFQU4gICAgICAgICAgICAgICAgICpwQ2FuY2VsbGVkKTsKK3ZvaWQgUlRNUE1vZFRpbWVyKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciwgdW5zaWduZWQgbG9uZyBWYWx1ZSk7CiAKLVZPSUQgUlRNUFNldExFRCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4gVUNIQVIJCQlTdGF0dXMpOwordm9pZCBSVE1QQ2FuY2VsVGltZXIoc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyLCBPVVQgQk9PTEVBTiAqIHBDYW5jZWxsZWQpOwogCi1WT0lEIFJUTVBTZXRTaWduYWxMRUQoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOIE5ESVNfODAyXzExX1JTU0kgRGJtKTsKK3ZvaWQgUlRNUFNldExFRChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFN0YXR1cyk7CiAKLVZPSUQgUlRNUEVuYWJsZVJ4VHgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVE1QU2V0U2lnbmFsTEVEKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pOwogCi0vLwotLy8gcHJvdG90eXBlIGluIGFjdGlvbi5jCi0vLwotVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Cit2b2lkIFJUTVBFbmFibGVSeFR4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUFEREJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisvKiAqLworLyogcHJvdG90eXBlIGluIGFjdGlvbi5jICovCisvKiAqLwordm9pZCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywKKwkJCSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwogCi1WT0lEIE1sbWVERUxCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lQUREQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBNbG1lRExTQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVERUxCQUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIE1sbWVJbnZhbGlkQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVETFNBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBNbG1lUU9TQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVJbnZhbGlkQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVRT1NBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckFkZEJBUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckRlbEJBQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJBZGRCQVJzcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyRGVsQkFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBTZW5kUFNNUEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCVdjaWQsCi0JSU4gVUNIQVIJCQlQc21wKTsKK3ZvaWQgUGVlckJBQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlclJNQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFNlbmRQU01QQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggV2NpZCwgdTggUHNtcCk7CiAKLVZPSUQgUGVlclB1YmxpY0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyUk1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVySFRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlclB1YmxpY0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJRT1NBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckhUQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUkVDQkFUaW1lclRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgUGVlclFPU0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIE9SSUJBVGltZXJUaW1lb3V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUkVDQkFUaW1lclRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFNlbmRSZWZyZXNoQkFSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5KTsKK3ZvaWQgT1JJQkFUaW1lclRpbWVvdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBY3RIZWFkZXJJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gUFVDSEFSIEFkZHIxLAotICAgIElOIFBVQ0hBUiBBZGRyMiwKLSAgICBJTiBQVUNIQVIgQWRkcjMpOwordm9pZCBTZW5kUmVmcmVzaEJBUihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgQmFySGVhZGVySW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQgUEZSQU1FX0JBUiBwQ250bEJhciwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFBVQ0hBUiBwU0EpOwordm9pZCBBY3RIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCSAgIHU4ICpBZGRyMSwgdTggKkFkZHIyLCB1OCAqQWRkcjMpOwogCi1WT0lEIEluc2VydEFjdEZpZWxkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IENhdGVnb3J5LAotCUlOIFVJTlQ4IEFjdENvZGUpOwordm9pZCBCYXJIZWFkZXJJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X2ZyYW1lX2JhciAqIHBDbnRsQmFyLCB1OCAqcERBLCB1OCAqcFNBKTsKIAotQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JSU4gUEZSQU1FX0JBX1JFUSBwTXNnKTsKK3ZvaWQgSW5zZXJ0QWN0RmllbGQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwgdTggQ2F0ZWdvcnksIHU4IEFjdENvZGUpOwogCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBydG1wX2RhdGEuYwotLy8KLUJPT0xFQU4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CitCT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1bnNpZ25lZCBsb25nIFdjaWQsCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSAqIHBNc2cpOwogCi1CT09MRUFOIFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApOworLyogKi8KKy8qIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9kYXRhLmMgKi8KKy8qICovCitCT09MRUFOIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK0JPT0xFQU4gUlRNUEhhbmRsZVR4UmluZ0RtYURvbmVJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgSU5UX1NPVVJDRV9DU1JfU1RSVUMgVHhSaW5nQml0bWFwKTsKIAotVk9JRCBSVE1QSGFuZGxlVEJUVEludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLXZvaWQgUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lECVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK3ZvaWQgUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwUHJldkFkZHIxLAotCUlOICBQVUNIQVIgICAgICAgICAgcDgwMjNoZHIpOwordm9pZCBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFBlZXJJc0FnZ3JlT24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFVMT05HICAgICAgICAgIFR4UmF0ZSwKLSAgICBJTiAgUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpOworQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggKnBQcmV2QWRkcjEsIHU4ICpwODAyM2hkcik7CiAKLU5ESVNfU1RBVFVTIFNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoCi0JSU4gIFBORElTX0JVRkZFUiAgICBwRmlyc3RCdWZmZXIsCi0JSU4gIFVDSEFSICAgICAgICAgICBEZXNpcmVkT2Zmc2V0LAotCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUwLAotCU9VVCBQVUNIQVIgICAgICAgICAgcEJ5dGUxKTsKK0JPT0xFQU4gUGVlcklzQWdncmVPbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgVHhSYXRlLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnkpOwogCi1ORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CitpbnQgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihjaGFyICpwRmlyc3RCdWZmZXIsCisJCQkJICAgICAgdTggRGVzaXJlZE9mZnNldCwKKwkJCQkgICAgICB1OCAqcEJ5dGUwLCB1OCAqcEJ5dGUxKTsKIAotVk9JRCBTVEFTZW5kUGFja2V0cygKLQlJTiAgTkRJU19IQU5ETEUgICAgIE1pbmlwb3J0QWRhcHRlckNvbnRleHQsCi0JSU4gIFBQTkRJU19QQUNLRVQgICBwcFBhY2tldEFycmF5LAotCUlOICBVSU5UICAgICAgICAgICAgTnVtYmVyT2ZQYWNrZXRzKTsKK2ludCBTVEFTZW5kUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCk7CiAKLVZPSUQgUlRNUERlUXVldWVQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAJSU4JQk9PTEVBTgkJCWJJbnRDb250ZXh0LAotCUlOICBVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVQ0hBUgkJCU1heF9UeF9QYWNrZXRzKTsKK3ZvaWQgU1RBU2VuZFBhY2tldHModm9pZCAqTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwkJICAgIHZvaWQgKipwcFBhY2tldEFycmF5LCB1MzIgTnVtYmVyT2ZQYWNrZXRzKTsKIAotTkRJU19TVEFUVVMJUlRNUEhhcmRUcmFuc21pdCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gIFVDSEFSCQkJUXVlSWR4LAotCU9VVAlQVUxPTkcJCQlwRnJlZVRYRExlZnQpOwordm9pZCBSVE1QRGVRdWV1ZVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBJTiBCT09MRUFOIGJJbnRDb250ZXh0LAorCQkgICAgICAgdTggUXVlSWR4LCB1OCBNYXhfVHhfUGFja2V0cyk7CiAKLU5ESVNfU1RBVFVTCVNUQUhhcmRUcmFuc21pdCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBUWF9CTEsJCQkqcFR4QmxrLAotCUlOICBVQ0hBUgkJCVF1ZUlkeCk7CitpbnQgUlRNUEhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHZvaWQgKnBQYWNrZXQsCisJCQkgICAgIHU4IFF1ZUlkeCwgdW5zaWduZWQgbG9uZyAqcEZyZWVUWERMZWZ0KTsKIAotVk9JRCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOworaW50IFNUQUhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLCB1OCBRdWVJZHgpOwogCi1ORElTX1NUQVRVUyBSVE1QRnJlZVRYRFJlcXVlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSaW5nVHlwZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIE51bWJlclJlcXVpcmVkLAotCUlOIAlQVUNIQVIgICAgICAgICAgRnJlZU51bWJlcklzKTsKK3ZvaWQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKK2ludCBSVE1QRnJlZVRYRFJlcXVlc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgIHU4IFJpbmdUeXBlLAorCQkJICAgICAgIHU4IE51bWJlclJlcXVpcmVkLCB1OCAqRnJlZU51bWJlcklzKTsKIAotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKK2ludCBNbG1lSGFyZFRyYW5zbWl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggUXVlSWR4LCB2b2lkICpwUGFja2V0KTsKIAotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIJUXVlSWR4LAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7CitpbnQgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCk7CiAKLVVTSE9SVCAgUlRNUENhbGNEdXJhdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJhdGUsCi0JSU4gIFVMT05HICAgICAgICAgICBTaXplKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKK2ludCBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICB1OCBRdWVJZHgsIHZvaWQgKnBQYWNrZXQpOwogCi1WT0lEIFJUTVBXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOICBCT09MRUFOICAgIAkJRlJBRywKLQlJTiAgQk9PTEVBTiAgICAJCUNGQUNLLAotCUlOICBCT09MRUFOICAgIAkJSW5zVGltZXN0YW1wLAotCUlOCUJPT0xFQU4JCQlBTVBEVSwKLQlJTglCT09MRUFOCQkJQWNrLAotCUlOCUJPT0xFQU4JCQlOU2VxLAkJLy8gSFcgbmV3IGEgc2VxdWVuY2UuCi0JSU4JVUNIQVIJCQlCQVNpemUsCi0JSU4JVUNIQVIJCQlXQ0lELAotCUlOCVVMT05HCQkJTGVuZ3RoLAotCUlOICBVQ0hBUiAgICAgIAkJUElELAotCUlOCVVDSEFSCQkJVElELAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJVHhvcG1vZGUsCi0JSU4JQk9PTEVBTgkJCUNmQWNrLAotCUlOCUhUVFJBTlNNSVRfU0VUVElORwkqcFRyYW5zbWl0KTsKK2ludCBNbG1lRGF0YUhhcmRUcmFuc21pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHU4IFF1ZUlkeCwgdm9pZCAqcFBhY2tldCk7CiAKK3ZvaWQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF90eGQgKiBwVHhELCBJTiBCT09MRUFOIGJXSVYsIHU4IFFTRUwpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi1WT0lEIFJUTVBXcml0ZVR4V0lfRGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JT1VUIFBUWFdJX1NUUlVDCQlwVHhXSSwKLQlJTglUWF9CTEsJCQkJKnBUeEJsayk7Cit1MTYgUlRNUENhbGNEdXJhdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFJhdGUsIHVuc2lnbmVkIGxvbmcgU2l6ZSk7CiAKK3ZvaWQgUlRNUFdyaXRlVHhXSShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eHdpICogcFR4V0ksIElOIEJPT0xFQU4gRlJBRywgSU4gQk9PTEVBTiBDRkFDSywgSU4gQk9PTEVBTiBJbnNUaW1lc3RhbXAsIElOIEJPT0xFQU4gQU1QRFUsIElOIEJPT0xFQU4gQWNrLCBJTiBCT09MRUFOIE5TZXEsCS8qIEhXIG5ldyBhIHNlcXVlbmNlLiAqLworCQkgICB1OCBCQVNpemUsCisJCSAgIHU4IFdDSUQsCisJCSAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkgICB1OCBQSUQsCisJCSAgIHU4IFRJRCwKKwkJICAgdTggVHhSYXRlLAorCQkgICB1OCBUeG9wbW9kZSwKKwkJICAgSU4gQk9PTEVBTiBDZkFjaywgSU4gSFRUUkFOU01JVF9TRVRUSU5HICogcFRyYW5zbWl0KTsKIAotVk9JRCBSVE1QV3JpdGVUeFdJX0NhY2hlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKK3ZvaWQgUlRNUFdyaXRlVHhXSV9EYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF90eHdpICogcFR4V0ksIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsayk7CiAKLVZPSUQgUlRNUFdyaXRlVHhEZXNjcmlwdG9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBUWERfU1RSVUMJCXBUeEQsCi0JSU4JQk9PTEVBTgkJCWJXSVYsCi0JSU4JVUNIQVIJCQlRU0VMKTsKK3ZvaWQgUlRNUFdyaXRlVHhXSV9DYWNoZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgc3RydWN0IHJ0X3R4d2kgKiBwVHhXSSwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKTsKIAotVk9JRCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5ESVNfU1RBVFVTIE1pbmlwb3J0TU1SZXF1ZXN0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuZ3RoKTsKK2ludCBNaW5pcG9ydE1NUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBRdWVJZHgsIHU4ICpwRGF0YSwgdTMyIExlbmd0aCk7CiAKLVZPSUQgUlRNUFNlbmROdWxsRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBUeFJhdGUsCi0JSU4JQk9PTEVBTgkJCWJRb3NOdWxsKTsKKy8qKysrbWFyayBieSBzaGlhbmcsIG5vdyB0aGlzIGZ1bmN0aW9uIG1lcmdlIHRvIE1pbmlwb3J0TU1SZXF1ZXN0KCkgKi8KKy8qLS0tbWFyayBieSBzaGlhbmcsIG5vdyB0aGlzIGZ1bmN0aW9uIG1lcmdlIHRvIE1pbmlwb3J0TU1SZXF1ZXN0KCkgKi8KIAotVk9JRCBSVE1QU2VuZERpc2Fzc29jaWF0aW9uRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSVE1QU2VuZE51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBUeFJhdGUsIElOIEJPT0xFQU4gYlFvc051bGwpOwogCi1WT0lEIFJUTVBTZW5kUlRTRnJhbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4JdW5zaWduZWQgaW50CU5leHRNcGR1U2l6ZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJUU1JhdGUsCi0JSU4gIFVTSE9SVCAgICAgICAgICBBY2tEdXJhdGlvbiwKLQlJTiAgVUNIQVIgICAgICAgICAgIFF1ZUlkeCwKLQlJTiAgVUNIQVIJCQlGcmFtZUdhcCk7Cit2b2lkIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1QUVVFVUVfSEVBREVSICAgUlRNUENoZWNrVHhTd1F1ZXVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBVQ0hBUiAgICAgICAgICAgKlF1ZUlkeCk7Cit2b2lkIFJUTVBTZW5kUlRTRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICB1OCAqcERBLAorCQkgICAgICBJTiB1bnNpZ25lZCBpbnQgTmV4dE1wZHVTaXplLAorCQkgICAgICB1OCBUeFJhdGUsCisJCSAgICAgIHU4IFJUU1JhdGUsCisJCSAgICAgIHUxNiBBY2tEdXJhdGlvbiwKKwkJICAgICAgdTggUXVlSWR4LCB1OCBGcmFtZUdhcCk7CiAKLVZPSUQgUlRNUFJlcG9ydE1pY0Vycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQQ0lQSEVSX0tFWSAgICAgcFdwYUtleSk7CitzdHJ1Y3QgcnRfcXVldWVfaGVhZGVyICpSVE1QQ2hlY2tUeFN3UXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqIFF1ZUlkeCk7CiAKLVZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUlRNUFJlcG9ydE1pY0Vycm9yKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBXcGFLZXkpOwogCi1WT0lEICAgIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAotICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOICBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglCT09MRUFOICAgIHBJbnNBTVNEVUhkciwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBJblBhY2tldCwKLQlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KTsKK3ZvaWQgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2Modm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJCXZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQl2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkJdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgICpwUGFja2V0LAotCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKLQlJTiAgVUlOVCAgICAgICAgICAgIEhlYWRlckxlbiwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAotCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbik7Cit2b2lkIFdwYVN0YVBhaXJ3aXNlS2V5U2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwordm9pZCBXcGFTdGFHcm91cEtleVNldHRpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBSVE1QRnJlZVRYRFVwb25UeERtYURvbmUoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gVUNIQVIgICAgICAgICAgICBRdWVJZHgpOworaW50IFJUTVBDbG9uZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCUlOIEJPT0xFQU4gcEluc0FNU0RVSGRyLAorCQkJCXZvaWQgKnBJblBhY2tldCwKKwkJCQl2b2lkICoqIHBwT3V0UGFja2V0KTsKIAotQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOworaW50IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgIHZvaWQgKiogcFBhY2tldCwKKwkJCQkgICB1OCAqcEhlYWRlciwKKwkJCQkgICB1MzIgSGVhZGVyTGVuLAorCQkJCSAgIHU4ICpwRGF0YSwgdTMyIERhdGFMZW4pOwogCit2b2lkIFJUTVBGcmVlTmRpc1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpOwogCi1CT09MRUFOIFJUTVBDaGVja0V0aGVyVHlwZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7CitCT09MRUFOIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFF1ZUlkeCk7CiAKK0JPT0xFQU4gUlRNUENoZWNrREhDUEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdm9pZCAqcFBhY2tldCk7CiAKLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMKLS8vCi1WT0lEIFJUTVBJbml0V2VwRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KTsKIAotVk9JRCBSVE1QRW5jcnlwdERhdGEoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOworLyogKi8KKy8qIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF93ZXAuYyAqLworLyogKi8KK3ZvaWQgUlRNUEluaXRXZXBFbmdpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBLZXksCisJCSAgICAgICB1OCBLZXlJZCwgdTggS2V5TGVuLCB1OCAqcERlc3QpOwogCi1CT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQsCi0JSU4gUFVDSEFSCQkJcERhdGEsCi0JSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KTsKK3ZvaWQgUlRNUEVuY3J5cHREYXRhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB1OCAqcFNyYywgdTggKnBEZXN0LCB1MzIgTGVuKTsKIAotVk9JRCBSVE1QU2V0SUNWKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRXRVAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBEYXRhLAorCQkJICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBHcm91cEtleSk7CiAKLVZPSUQgQVJDRk9VUl9JTklUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgVUlOVCAgICAgICAgICAgIEtleUxlbik7Cit2b2lkIFJUTVBTZXRJQ1Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcERlc3QpOwogCi1VQ0hBUiAgIEFSQ0ZPVVJfQllURSgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUICAgICBDdHgpOwordm9pZCBBUkNGT1VSX0lOSVQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsIHU4ICpwS2V5LCB1MzIgS2V5TGVuKTsKIAotVk9JRCBBUkNGT1VSX0RFQ1JZUFQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwordTggQVJDRk9VUl9CWVRFKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4KTsKIAotVk9JRCBBUkNGT1VSX0VOQ1JZUFQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwordm9pZCBBUkNGT1VSX0RFQ1JZUFQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsCisJCSAgICAgdTggKnBEZXN0LCB1OCAqcFNyYywgdTMyIExlbik7CiAKLVZPSUQgV1BBQVJDRk9VUl9FTkNSWVBUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKK3ZvaWQgQVJDRk9VUl9FTkNSWVBUKHN0cnVjdCBydF9hcmNmb3VyY29udGV4dCAqQ3R4LAorCQkgICAgIHU4ICpwRGVzdCwgdTggKnBTcmMsIHUzMiBMZW4pOwogCi1VSU5UIFJUTVBfQ0FMQ19GQ1MzMigKLQlJTiAgVUlOVCAgIEZjcywKLQlJTiAgUFVDSEFSICBDcCwKLQlJTiAgSU5UICAgICBMZW4pOwordm9pZCBXUEFBUkNGT1VSX0VOQ1JZUFQoc3RydWN0IHJ0X2FyY2ZvdXJjb250ZXh0ICpDdHgsCisJCQl1OCAqcERlc3QsIHU4ICpwU3JjLCB1MzIgTGVuKTsKIAotLy8KLS8vIE1MTUUgcm91dGluZXMKLS8vCit1MzIgUlRNUF9DQUxDX0ZDUzMyKHUzMiBGY3MsIHU4ICpDcCwgaW50IExlbik7CiAKLS8vIEFzaWMvUkYvQkJQIHJlbGF0ZWQgZnVuY3Rpb25zCisvKiAqLworLyogTUxNRSByb3V0aW5lcyAqLworLyogKi8KIAotVk9JRCBBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CisvKiBBc2ljL1JGL0JCUCByZWxhdGVkIGZ1bmN0aW9ucyAqLwogCi1WT0lEIAlBc2ljVXBkYXRlUHJvdGVjdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gCQlVU0hPUlQJCQlPcGVyYWlvbk1vZGUsCi0JSU4gCQlVQ0hBUgkJCVNldE1hc2ssCi0JSU4JCUJPT0xFQU4JCQliRGlzYWJsZUJHUHJvdGVjdCwKLQlJTgkJQk9PTEVBTgkJCWJOb25HRkV4aXN0KTsKK3ZvaWQgQXNpY0FkanVzdFR4UG93ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCUNoYW5uZWwsCi0JSU4JQk9PTEVBTgkJCWJTY2FuKTsKK3ZvaWQgQXNpY1VwZGF0ZVByb3RlY3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTE2IE9wZXJhaW9uTW9kZSwKKwkJICAgICAgIHU4IFNldE1hc2ssCisJCSAgICAgICBJTiBCT09MRUFOIGJEaXNhYmxlQkdQcm90ZWN0LCBJTiBCT09MRUFOIGJOb25HRkV4aXN0KTsKIAotVk9JRCBBc2ljTG9ja0NoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCkgOwordm9pZCBBc2ljU3dpdGNoQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBDaGFubmVsLCBJTiBCT09MRUFOIGJTY2FuKTsKIAotVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIEFzaWNMb2NrQ2hhbm5lbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENoYW5uZWwpOwogCi1WT0lEIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit2b2lkIEFzaWNSZlR1bmluZ0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBBc2ljRm9yY2VTbGVlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzaWNSZXNldEJCUEFnZW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY0ZvcmNlV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotI2lmZGVmIFJUMjg2MAotCUlOIFVDSEFSICAgIAkgTGV2ZWwpOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JSU4gQk9PTEVBTiAgICBiRnJvbVR4KTsKLSNlbmRpZgordm9pZCBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKIAotVk9JRCBBc2ljU2V0QnNzaWQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQnNzaWQpOwordm9pZCBBc2ljRm9yY2VTbGVlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNTZXRNY2FzdFdDKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgQXNpY0ZvcmNlV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBiRnJvbVR4KTsKIAotVk9JRCBBc2ljRGVsV2NpZFRhYigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUglXY2lkKTsKK3ZvaWQgQXNpY1NldEJzc2lkKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBCc3NpZCk7CiAKLVZPSUQgQXNpY0VuYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzaWNTZXRNY2FzdFdDKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY0Rpc2FibGVSREcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc2ljRGVsV2NpZFRhYihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IFdjaWQpOwogCi1WT0lEIEFzaWNEaXNhYmxlU3luYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEFzaWNFbmFibGVSREcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljRW5hYmxlQnNzU3luYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIEFzaWNEaXNhYmxlUkRHKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY0VuYWJsZUlic3NTeW5jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgQXNpY0Rpc2FibGVTeW5jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1NldEVkY2FQYXJtKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBFRENBX1BBUk0gICAgcEVkY2FQYXJtKTsKK3ZvaWQgQXNpY0VuYWJsZUJzc1N5bmMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBBc2ljU2V0U2xvdFRpbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSk7Cit2b2lkIEFzaWNFbmFibGVJYnNzU3luYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNBZGRTaGFyZWRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAotCUlOIFVDSEFSICAgICAgICAgS2V5SWR4LAotCUlOIFVDSEFSICAgICAgICAgQ2lwaGVyQWxnLAotCUlOIFBVQ0hBUiAgICAgICAgcEtleSwKLQlJTiBQVUNIQVIgICAgICAgIHBUeE1pYywKLQlJTiBQVUNIQVIgICAgICAgIHBSeE1pYyk7Cit2b2lkIEFzaWNTZXRFZGNhUGFybShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9lZGNhX3Bhcm0gKnBFZGNhUGFybSk7CiAKLVZPSUQgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgICBLZXlJZHgpOwordm9pZCBBc2ljU2V0U2xvdFRpbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKTsKIAotVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKK3ZvaWQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHU4IEJzc0luZGV4LAorCQkJICAgdTggS2V5SWR4LAorCQkJICAgdTggQ2lwaGVyQWxnLAorCQkJICAgdTggKnBLZXksIHU4ICpwVHhNaWMsIHU4ICpwUnhNaWMpOwogCi1WT0lEIEFzaWNVcGRhdGVXQ0lESVZFSVYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFVMT05HICAgICAgICB1SVYsCi0JSU4gVUxPTkcgICAgICAgIHVFSVYpOwordm9pZCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTggQnNzSW5kZXgsIHU4IEtleUlkeCk7CiAKLVZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyKTsKK3ZvaWQgQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1MTYgV0NJRCwKKwkJCSAgICAgdTggQnNzSW5kZXgsCisJCQkgICAgIHU4IENpcGhlckFsZywKKwkJCSAgICAgSU4gQk9PTEVBTiBiVXNlUGFpcmV3aXNlS2V5VGFibGUpOwogCi1WT0lEIEFzaWNBZGRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSCQlLZXlJZHgsCi0JSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCi0JSU4gQk9PTEVBTgkJYlR4S2V5KTsKK3ZvaWQgQXNpY1VwZGF0ZVdDSURJVkVJVihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IFdDSUQsIHVuc2lnbmVkIGxvbmcgdUlWLCB1bnNpZ25lZCBsb25nIHVFSVYpOwogCi1WT0lEIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCi0JSU4gVUNIQVIJCVdDSUQsCi0JSU4gQ0lQSEVSX0tFWQkJICpwQ2lwaGVyS2V5KTsKK3ZvaWQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHUxNiBXQ0lELCB1OCAqcEFkZHIpOwogCi1WT0lEIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBVQ0hBUgkJIEJzc0lkeCwKLQlJTiBVQ0hBUgkJIFdjaWQpOwordm9pZCBBc2ljQWRkS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHUxNiBXQ0lELAorCQkgICAgIHU4IEJzc0luZGV4LAorCQkgICAgIHU4IEtleUlkeCwKKwkJICAgICBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcENpcGhlcktleSwKKwkJICAgICBJTiBCT09MRUFOIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSwgSU4gQk9PTEVBTiBiVHhLZXkpOwogCi1CT09MRUFOIEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQ29tbWFuZCwKLQlJTiBVQ0hBUiAgICAgICAgIFRva2VuLAotCUlOIFVDSEFSICAgICAgICAgQXJnMCwKLQlJTiBVQ0hBUiAgICAgICAgIEFyZzEpOwotI2lmZGVmIFJUMjg2MAotQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQpOwotI2VuZGlmCi1WT0lEIE1hY0FkZHJSYW5kb21Cc3NpZCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUFVDSEFSIHBBZGRyKTsKK3ZvaWQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCAqcEFkZHIsCisJCQkgICAgIHU4IFdDSUQsIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwQ2lwaGVyS2V5KTsKIAotVk9JRCBNZ3RNYWNIZWFkZXJJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgICBwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKTsKK3ZvaWQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4IEJzc0lkeCwgdTggV2NpZCk7CiAKLVZPSUQgTWxtZVJhZGlvT2ZmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK0JPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCBDb21tYW5kLAorCQkJICAgICB1OCBUb2tlbiwgdTggQXJnMCwgdTggQXJnMSk7CiAKLVZPSUQgTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOworI2lmZGVmIFJUTVBfTUFDX1BDSQorQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IENvbW1hbmQpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCit2b2lkIE1hY0FkZHJSYW5kb21Cc3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcik7CiAKLVZPSUQgQnNzVGFibGVJbml0KAotCUlOIEJTU19UQUJMRSAqVGFiKTsKK3ZvaWQgTWd0TWFjSGVhZGVySW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhkcjgwMjExLAorCQkgICAgICB1OCBTdWJUeXBlLAorCQkgICAgICB1OCBUb0RzLCB1OCAqcERBLCB1OCAqcEJzc2lkKTsKIAotVk9JRCBCQVRhYmxlSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBCQV9UQUJMRSAqVGFiKTsKK3ZvaWQgTWxtZVJhZGlvT2ZmKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVMT05HIEJzc1RhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCk7Cit2b2lkIE1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgICAgcEJzc2lkLAotCUlOIFBVQ0hBUiAgICBwU3NpZCwKLQlJTiBVQ0hBUiAgICAgU3NpZExlbiwKLQlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7Cit2b2lkIEJzc1RhYmxlSW5pdChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIpOwogCi1VTE9ORyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiAgICBCc3NpZCwKLQlJTiBQVUNIQVIgICAgcFNzaWQsCi0JSU4gVUNIQVIgICAgIFNzaWRMZW4sCi0JSU4gVUNIQVIgICAgIENoYW5uZWwpOwordm9pZCBCQVRhYmxlSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9iYV90YWJsZSAqVGFiKTsKIAotVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAotCUlOIE9VVCAgUEJTU19UQUJMRSBwVGFiLAotCUlOICAgICAgUFVDSEFSIHBCc3NpZCwKLQlJTiAgICAgIFVDSEFSIENoYW5uZWwpOwordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNlYXJjaChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsIHU4ICpwQnNzaWQsIHU4IENoYW5uZWwpOwogCi1WT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpOwordW5zaWduZWQgbG9uZyBCc3NTc2lkVGFibGVTZWFyY2goc3RydWN0IHJ0X2Jzc190YWJsZSAqVGFiLAorCQkJIHU4ICpwQnNzaWQsCisJCQkgdTggKnBTc2lkLCB1OCBTc2lkTGVuLCB1OCBDaGFubmVsKTsKIAotVk9JRCAgQnNzRW50cnlTZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIFBCU1NfRU5UUlkgcEJzcywKLQlJTiBQVUNIQVIgcEJzc2lkLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVU0hPUlQgQmVhY29uUGVyaW9kLAotCUlOIFBDRl9QQVJNIENmUGFybSwKLQlJTiBVU0hPUlQgQXRpbVdpbiwKLQlJTiBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBBRERfSFRfSU5GT19JRSAqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JSU4gVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gVUNIQVIJCQlBZGRIdEluZm9MZW4sCi0JSU4gVUNIQVIJCQlOZXdFeHRDaGFuT2Zmc2V0LAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOwordW5zaWduZWQgbG9uZyBCc3NUYWJsZVNlYXJjaFdpdGhTU0lEKHN0cnVjdCBydF9ic3NfdGFibGUgKlRhYiwKKwkJCSAgICAgdTggKkJzc2lkLAorCQkJICAgICB1OCAqcFNzaWQsCisJCQkgICAgIHU4IFNzaWRMZW4sIHU4IENoYW5uZWwpOwogCi1VTE9ORyAgQnNzVGFibGVTZXRFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUEJTU19UQUJMRSBwVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gQ0ZfUEFSTSAqQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7Cit1bnNpZ25lZCBsb25nIEJzc1NzaWRUYWJsZVNlYXJjaEJ5U1NJRChzdHJ1Y3QgcnRfYnNzX3RhYmxlICpUYWIsCisJCQkgICAgICAgdTggKnBTc2lkLCB1OCBTc2lkTGVuKTsKIAotVk9JRCBCQVRhYmxlSW5zZXJ0RW50cnkoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUIEFpZCwKLSAgICBJTiBVU0hPUlQJCVRpbWVPdXRWYWx1ZSwKLQlJTiBVU0hPUlQJCVN0YXJ0aW5nU2VxLAotICAgIElOIFVDSEFSIFRJRCwKLQlJTiBVQ0hBUiBCQVdpblNpemUsCi0JSU4gVUNIQVIgT3JpZ2luYXRvclN0YXR1cywKLSAgICBJTiBCT09MRUFOIElzUmVjaXBpZW50KTsKK3ZvaWQgQnNzVGFibGVEZWxldGVFbnRyeShzdHJ1Y3QgcnRfYnNzX3RhYmxlICpwVGFiLAorCQkJIHU4ICpwQnNzaWQsIHU4IENoYW5uZWwpOwogCi1WT0lEIEJzc1RhYmxlU3NpZFNvcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JT1VUIEJTU19UQUJMRSAqT3V0VGFiLAotCUlOICBDSEFSIFNzaWRbXSwKLQlJTiAgVUNIQVIgU3NpZExlbik7Cit2b2lkIEJBVGFibGVEZWxldGVPUklFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwQkFPUklFbnRyeSk7CiAKLVZPSUQgIEJzc1RhYmxlU29ydEJ5UnNzaSgKLQlJTiBPVVQgQlNTX1RBQkxFICpPdXRUYWIpOwordm9pZCBCc3NFbnRyeVNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3MsIHU4ICpwQnNzaWQsIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1MTYgQmVhY29uUGVyaW9kLCBzdHJ1Y3QgcnRfY2ZfcGFybSAqIENmUGFybSwgdTE2IEF0aW1XaW4sIHUxNiBDYXBhYmlsaXR5SW5mbywgdTggU3VwUmF0ZVtdLCB1OCBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4IEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCSB1OCBIdENhcGFiaWxpdHlMZW4sCisJCSB1OCBBZGRIdEluZm9MZW4sCisJCSB1OCBOZXdFeHRDaGFuT2Zmc2V0LAorCQkgdTggQ2hhbm5lbCwKKwkJIGNoYXIgUnNzaSwKKwkJIElOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAorCQkgdTggQ2tpcEZsYWcsCisJCSBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCSBzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSAqcFFvc0NhcGFiaWxpdHksCisJCSBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwKKwkJIHUxNiBMZW5ndGhWSUUsIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpOwogCi1WT0lEIEJzc0NpcGhlclBhcnNlKAotCUlOIE9VVCAgUEJTU19FTlRSWSAgcEJzcyk7Cit1bnNpZ25lZCBsb25nIEJzc1RhYmxlU2V0RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfYnNzX3RhYmxlICpwVGFiLCB1OCAqcEJzc2lkLCBjaGFyIFNzaWRbXSwgdTggU3NpZExlbiwgdTggQnNzVHlwZSwgdTE2IEJlYWNvblBlcmlvZCwgc3RydWN0IHJ0X2NmX3Bhcm0gKiBDZlBhcm0sIHUxNiBBdGltV2luLCB1MTYgQ2FwYWJpbGl0eUluZm8sIHU4IFN1cFJhdGVbXSwgdTggU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCQkgICAgICAgdTggSHRDYXBhYmlsaXR5TGVuLAorCQkgICAgICAgdTggQWRkSHRJbmZvTGVuLAorCQkgICAgICAgdTggTmV3RXh0Q2hhbk9mZnNldCwKKwkJICAgICAgIHU4IENoYW5uZWwsCisJCSAgICAgICBjaGFyIFJzc2ksCisJCSAgICAgICBJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKKwkJICAgICAgIHU4IENraXBGbGFnLAorCQkgICAgICAgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLAorCQkgICAgICAgc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gKnBRb3NDYXBhYmlsaXR5LAorCQkgICAgICAgc3RydWN0IHJ0X3Fic3NfbG9hZF9wYXJtICpwUWJzc0xvYWQsCisJCSAgICAgICB1MTYgTGVuZ3RoVklFLCBzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFKTsKIAotTkRJU19TVEFUVVMgIE1sbWVRdWV1ZUluaXQoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwordm9pZCBCQVRhYmxlSW5zZXJ0RW50cnkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTE2IEFpZCwKKwkJCXUxNiBUaW1lT3V0VmFsdWUsCisJCQl1MTYgU3RhcnRpbmdTZXEsCisJCQl1OCBUSUQsCisJCQl1OCBCQVdpblNpemUsCisJCQl1OCBPcmlnaW5hdG9yU3RhdHVzLCBJTiBCT09MRUFOIElzUmVjaXBpZW50KTsKIAotVk9JRCAgTWxtZVF1ZXVlRGVzdHJveSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7Cit2b2lkIEJzc1RhYmxlU3NpZFNvcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICBzdHJ1Y3QgcnRfYnNzX3RhYmxlICpPdXRUYWIsIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuKTsKIAotQk9PTEVBTiBNbG1lRW5xdWV1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZyk7Cit2b2lkIEJzc1RhYmxlU29ydEJ5UnNzaShzdHJ1Y3QgcnRfYnNzX3RhYmxlICpPdXRUYWIpOwogCi1CT09MRUFOIE1sbWVFbnF1ZXVlRm9yUmVjdigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBVTE9ORyBXY2lkLAotCUlOIFVMT05HIFRpbWVTdGFtcEhpZ2gsCi0JSU4gVUxPTkcgVGltZVN0YW1wTG93LAotCUlOIFVDSEFSIFJzc2kwLAotCUlOIFVDSEFSIFJzc2kxLAotCUlOIFVDSEFSIFJzc2kyLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBQVk9JRCBNc2csCi0JSU4gVUNIQVIgU2lnbmFsKTsKK3ZvaWQgQnNzQ2lwaGVyUGFyc2Uoc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzcyk7CiAKK2ludCBNbG1lUXVldWVJbml0KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSk7CiAKLUJPT0xFQU4gTWxtZURlcXVldWUoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUsCi0JT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pOwordm9pZCBNbG1lUXVldWVEZXN0cm95KHN0cnVjdCBydF9tbG1lX3F1ZXVlICpRdWV1ZSk7CiAKLVZPSUQgICAgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworQk9PTEVBTiBNbG1lRW5xdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1bnNpZ25lZCBsb25nIE1hY2hpbmUsCisJCSAgICB1bnNpZ25lZCBsb25nIE1zZ1R5cGUsIHVuc2lnbmVkIGxvbmcgTXNnTGVuLCB2b2lkICogTXNnKTsKIAotQk9PTEVBTiAgTWxtZVF1ZXVlRW1wdHkoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOworQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3Yoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdW5zaWduZWQgbG9uZyBXY2lkLAorCQkJICAgdW5zaWduZWQgbG9uZyBUaW1lU3RhbXBIaWdoLAorCQkJICAgdW5zaWduZWQgbG9uZyBUaW1lU3RhbXBMb3csCisJCQkgICB1OCBSc3NpMCwKKwkJCSAgIHU4IFJzc2kxLAorCQkJICAgdTggUnNzaTIsCisJCQkgICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdm9pZCAqTXNnLCB1OCBTaWduYWwpOwogCi1CT09MRUFOICBNbG1lUXVldWVGdWxsKAotCUlOIE1MTUVfUVVFVUUgKlF1ZXVlKTsKK0JPT0xFQU4gTWxtZURlcXVldWUoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICoqIEVsZW0pOwogCi1CT09MRUFOICBNc2dUeXBlU3Vic3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKTsKK3ZvaWQgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBTdGF0ZU1hY2hpbmVJbml0KAotCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpOworQk9PTEVBTiBNbG1lUXVldWVFbXB0eShzdHJ1Y3QgcnRfbWxtZV9xdWV1ZSAqUXVldWUpOwogCi1WT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFVMT05HIFN0LAotCVVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRik7CitCT09MRUFOIE1sbWVRdWV1ZUZ1bGwoc3RydWN0IHJ0X21sbWVfcXVldWUgKlF1ZXVlKTsKIAotVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK0JPT0xFQU4gTXNnVHlwZVN1YnN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lLAorCQkgICAgIGludCAqIE1hY2hpbmUsIGludCAqIE1zZ1R5cGUpOwogCi1WT0lEIERyb3AoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sCisJCSAgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAorCQkgICAgICB1bnNpZ25lZCBsb25nIFN0TnIsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgTXNnTnIsCisJCSAgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAorCQkgICAgICB1bnNpZ25lZCBsb25nIEluaXRTdGF0ZSwgdW5zaWduZWQgbG9uZyBCYXNlKTsKIAotVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Cit2b2lkIFN0YXRlTWFjaGluZVNldEFjdGlvbihzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgU3QsIHVuc2lnbmVkIGxvbmcgTXNnLCBJTiBTVEFURV9NQUNISU5FX0ZVTkMgRik7CiAKLVZPSUQgUmVhc3NvY1RpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEFzc29jVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBEcm9wKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgRGlzYXNzb2NUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIEFzc29jU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sCisJCQkgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwogCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSZWFzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEFzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIERpc2Fzc29jVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBQZWVyQXNzb2NSc3BBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQgTWxtZUFzc29jUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlclJlYXNzb2NSc3BBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVSZWFzc29jUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckRpc2Fzc29jQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJBc3NvY1JzcEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEFzc29jVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlclJlYXNzb2NSc3BBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCAgUmVhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJEaXNhc3NvY0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICBDbHMzZXJyQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEFkZHIpOwordm9pZCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIEFzc29jVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJlYXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbHMzZXJyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKTsKIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLSNpZmRlZiBSVDI4NzAKLVZPSUQgTWxtZUNudGxDb25maXJtKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVVNIT1JUIE1zZyk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCit2b2lkIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgIENvbXBvc2VQc1BvbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICBDb21wb3NlTnVsbEZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCk7CisjaWZkZWYgUlRNUF9NQUNfVVNCCit2b2lkIE1sbWVDbnRsQ29uZmlybShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgTXNnVHlwZSwgdTE2IE1zZyk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLVZPSUQgIEFzc29jUG9zdFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkcjIsCi0JSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiAgVVNIT1JUIEFpZCwKLQlJTiAgVUNIQVIgU3VwUmF0ZVtdLAotCUlOICBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOICBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0JSU4gIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOwordm9pZCBDb21wb3NlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXV0aFN0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gUFNUQVRFX01BQ0hJTkUgc20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKK3ZvaWQgQ29tcG9zZU51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEF1dGhUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIEFzc29jUG9zdFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICB1OCAqcEFkZHIyLAorCQkgICB1MTYgQ2FwYWJpbGl0eUluZm8sCisJCSAgIHUxNiBBaWQsCisJCSAgIHU4IFN1cFJhdGVbXSwKKwkJICAgdTggU3VwUmF0ZUxlbiwKKwkJICAgdTggRXh0UmF0ZVtdLAorCQkgICB1OCBFeHRSYXRlTGVuLAorCQkgICBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sCisJCSAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgdTggSHRDYXBhYmlsaXR5TGVuLCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvKTsKKwordm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpzbSwgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKKwordm9pZCBBdXRoVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVBdXRoUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEF1dGhUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ2xzMmVyckFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyKTsKK3ZvaWQgQ2xzMmVyckFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcik7CiAKLVZPSUQgTWxtZURlYXV0aFJlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgTWxtZURlYXV0aFJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBJbnZhbGlkU3RhdGVXaGVuQXV0aChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFNUQVRFX01BQ0hJTkUgU20sCi0JSU4gIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKK3ZvaWQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sCisJCQkgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAotVk9JRCBQZWVyRGVhdXRoQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJEZWF1dGhBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCi0JSU4gIFVTSE9SVCBBbGcsCi0JSU4gIFVTSE9SVCBTZXEsCi0JSU4gIFVTSE9SVCBSZWFzb24sCi0JSU4gIFVTSE9SVCBTdGF0dXMpOwordm9pZCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMSwKKwkJCQkgdTE2IEFsZywKKwkJCQkgdTE2IFNlcSwKKwkJCQkgdTE2IFJlYXNvbiwgdTE2IFN0YXR1cyk7CiAKLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIGRscy5jCi0vLworLyogKi8KKy8qIFByaXZhdGUgcm91dGluZXMgaW4gZGxzLmMgKi8KKy8qICovCiAKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLVZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlNtLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Cit2b2lkIFN5bmNTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLAorCQkJICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwogCi1WT0lEIEJlYWNvblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgQmVhY29uVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFNjYW5UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFNjYW5UaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU2NhbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgSW52YWxpZFN0YXRlV2hlblNjYW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuSm9pbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIEludmFsaWRTdGF0ZVdoZW5TdGFydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBFbnF1ZXVlUHJvYmVSZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gU2NhblJ1bm5pbmcoCi0JCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0JPT0xFQU4gU2NhblJ1bm5pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotVk9JRCBNbG1lQ250bEluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKK3ZvaWQgTWxtZUNudGxJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKIAotVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTLAorCQkJCSAgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bElkbGVQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsSWRsZVByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsT2lkU2NhblByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsT2lkU2NhblByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsT2lkU3NpZFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwordm9pZCBDbnRsT2lkU3NpZFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwordm9pZCBDbnRsT2lkUlRCc3NpZFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKiBFbGVtKTsKK3ZvaWQgQ250bE1sbWVSb2FtaW5nUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdERpc2Fzc29jUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0Sm9pblByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0Sm9pblByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBDbnRsV2FpdFJlYXNzb2NQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXRTdGFydFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENudGxXYWl0U3RhcnRQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQ250bFdhaXRBdXRoUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXRBdXRoUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIENudGxXYWl0QXV0aFByb2MyKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXRBdXRoUHJvYzIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgQ250bFdhaXRBc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBMaW5rVXAoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSIEJzc1R5cGUpOwordm9pZCBMaW5rVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBCc3NUeXBlKTsKIAotVk9JRCBMaW5rRG93bigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgICAgIElzUmVxRnJvbUFQKTsKK3ZvaWQgTGlua0Rvd24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIElzUmVxRnJvbUFQKTsKIAotVk9JRCBJdGVyYXRlT25Cc3NUYWIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBJdGVyYXRlT25Cc3NUYWIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBJdGVyYXRlT25Cc3NUYWIyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTs7Cit2b2lkIEl0ZXJhdGVPbkJzc1RhYjIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTs7CiAKLVZPSUQgSm9pblBhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCi0JSU4gIFVMT05HIEJzc0lkeCk7Cit2b2lkIEpvaW5QYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgKkpvaW5SZXEsIHVuc2lnbmVkIGxvbmcgQnNzSWR4KTsKIAotVk9JRCBBc3NvY1Bhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE9VVCBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKkFzc29jUmVxLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JSU4gIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiAgVUxPTkcgVGltZW91dCwKLQlJTiAgVVNIT1JUIExpc3RlbkludHYpOwordm9pZCBBc3NvY1Bhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxICpBc3NvY1JlcSwKKwkJICAgdTggKnBBZGRyLAorCQkgICB1MTYgQ2FwYWJpbGl0eUluZm8sCisJCSAgIHVuc2lnbmVkIGxvbmcgVGltZW91dCwgdTE2IExpc3RlbkludHYpOwogCi1WT0lEIFNjYW5QYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAotCUlOICBDSEFSIFNzaWRbXSwKLQlJTiAgVUNIQVIgU3NpZExlbiwKLQlJTiAgVUNIQVIgQnNzVHlwZSwKLQlJTiAgVUNIQVIgU2NhblR5cGUpOwordm9pZCBTY2FuUGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgIHN0cnVjdCBydF9tbG1lX3NjYW5fcmVxICpTY2FuUmVxLAorCQkgIGNoYXIgU3NpZFtdLAorCQkgIHU4IFNzaWRMZW4sIHU4IEJzc1R5cGUsIHU4IFNjYW5UeXBlKTsKIAotVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKLQlJTiAgUFVDSEFSIHBBZGRyLAotCUlOICBVU0hPUlQgUmVhc29uKTsKK3ZvaWQgRGlzYXNzb2NQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSAqRGlzYXNzb2NSZXEsCisJCSAgICAgIHU4ICpwQWRkciwgdTE2IFJlYXNvbik7CiAKLVZPSUQgU3RhcnRQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCi0JSU4gIENIQVIgU3NpZFtdLAotCUlOICBVQ0hBUiBTc2lkTGVuKTsKK3ZvaWQgU3RhcnRQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSAqU3RhcnRSZXEsCisJCSAgIGNoYXIgU3NpZFtdLCB1OCBTc2lkTGVuKTsKIAotVk9JRCBBdXRoUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE9VVCBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqQXV0aFJlcSwKLQlJTiAgUFVDSEFSIHBBZGRyLAotCUlOICBVU0hPUlQgQWxnKTsKK3ZvaWQgQXV0aFBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICBzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSAqQXV0aFJlcSwKKwkJICB1OCAqcEFkZHIsIHUxNiBBbGcpOwogCi1WT0lEIEVucXVldWVQc1BvbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBFbnF1ZXVlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgRW5xdWV1ZUJlYWNvbkZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgRW5xdWV1ZUJlYWNvbkZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVKb2luUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIE1sbWVTY2FuUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBNbG1lU3RhcnRSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBTY2FuVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgU2NhblRpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBCZWFjb25UaW1lb3V0QXRKb2luQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotVk9JRCBQZWVyQmVhY29uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyQmVhY29uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUGVlclByb2JlUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgU2Nhbk5leHRDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgU2Nhbk5leHRDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVMT05HIE1ha2VJYnNzQmVhY29uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3Vuc2lnbmVkIGxvbmcgTWFrZUlic3NCZWFjb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBDQ1hBZGphY2VudEFQUmVwb3J0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK0JPT0xFQU4gTWxtZVNjYW5SZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB2b2lkICogTXNnLAorCQkJICB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSAgdTggKiBCc3NUeXBlLAorCQkJICBjaGFyIHNzaWRbXSwKKwkJCSAgdTggKiBTc2lkTGVuLCB1OCAqIFNjYW5UeXBlKTsKIAotQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFVDSEFSICpCc3NUeXBlLAotCU9VVCBDSEFSIHNzaWRbXSwKLQlPVVQgVUNIQVIgKlNzaWRMZW4sCi0JT1VUIFVDSEFSICpTY2FuVHlwZSk7CitCT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIHZvaWQgKiBNc2csCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJCSAgICB1OCBNc2dDaGFubmVsLAorCQkJCSAgICB1OCAqcEFkZHIyLAorCQkJCSAgICB1OCAqcEJzc2lkLAorCQkJCSAgICBjaGFyIFNzaWRbXSwKKwkJCQkgICAgdTggKiBwU3NpZExlbiwKKwkJCQkgICAgdTggKiBwQnNzVHlwZSwKKwkJCQkgICAgdTE2ICogcEJlYWNvblBlcmlvZCwKKwkJCQkgICAgdTggKiBwQ2hhbm5lbCwKKwkJCQkgICAgdTggKiBwTmV3Q2hhbm5lbCwKKwkJCQkgICAgT1VUIExBUkdFX0lOVEVHRVIgKiBwVGltZXN0YW1wLAorCQkJCSAgICBzdHJ1Y3QgcnRfY2ZfcGFybSAqIHBDZlBhcm0sCisJCQkJICAgIHUxNiAqIHBBdGltV2luLAorCQkJCSAgICB1MTYgKiBwQ2FwYWJpbGl0eUluZm8sCisJCQkJICAgIHU4ICogcEVycCwKKwkJCQkgICAgdTggKiBwRHRpbUNvdW50LAorCQkJCSAgICB1OCAqIHBEdGltUGVyaW9kLAorCQkJCSAgICB1OCAqIHBCY2FzdEZsYWcsCisJCQkJICAgIHU4ICogcE1lc3NhZ2VUb01lLAorCQkJCSAgICB1OCBTdXBSYXRlW10sCisJCQkJICAgIHU4ICogcFN1cFJhdGVMZW4sCisJCQkJICAgIHU4IEV4dFJhdGVbXSwKKwkJCQkgICAgdTggKiBwRXh0UmF0ZUxlbiwKKwkJCQkgICAgdTggKiBwQ2tpcEZsYWcsCisJCQkJICAgIHU4ICogcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkgICAgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLAorCQkJCSAgICBzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gKnBRYnNzTG9hZCwKKwkJCQkgICAgc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gKnBRb3NDYXBhYmlsaXR5LAorCQkJCSAgICB1bnNpZ25lZCBsb25nICogcFJhbGlua0llLAorCQkJCSAgICB1OCAqIHBIdENhcGFiaWxpdHlMZW4sCisJCQkJICAgIHU4ICogcFByZU5IdENhcGFiaWxpdHlMZW4sCisJCQkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJCQkgICAgdTggKiBBZGRIdEluZm9MZW4sCisJCQkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIEFkZEh0SW5mbywKKwkJCQkgICAgdTggKiBOZXdFeHRDaGFubmVsLAorCQkJCSAgICB1MTYgKiBMZW5ndGhWSUUsCisJCQkJICAgIHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUpOwogCi1CT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JSU4gIFVDSEFSIE1zZ0NoYW5uZWwsCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFBVQ0hBUiBwQnNzaWQsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0JT1VUIFVDSEFSICpwQnNzVHlwZSwKLQlPVVQgVVNIT1JUICpwQmVhY29uUGVyaW9kLAotCU9VVCBVQ0hBUiAqcENoYW5uZWwsCi0JT1VUIFVDSEFSICpwTmV3Q2hhbm5lbCwKLQlPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKLQlPVVQgQ0ZfUEFSTSAqcENmUGFybSwKLQlPVVQgVVNIT1JUICpwQXRpbVdpbiwKLQlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0JT1VUIFVDSEFSICpwRXJwLAotCU9VVCBVQ0hBUiAqcER0aW1Db3VudCwKLQlPVVQgVUNIQVIgKnBEdGltUGVyaW9kLAotCU9VVCBVQ0hBUiAqcEJjYXN0RmxhZywKLQlPVVQgVUNIQVIgKnBNZXNzYWdlVG9NZSwKLQlPVVQgVUNIQVIgU3VwUmF0ZVtdLAotCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0JT1VUIFVDSEFSIEV4dFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotCU9VVAlVQ0hBUiAqcENraXBGbGFnLAotCU9VVAlVQ0hBUiAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLQlPVVQgUEVEQ0FfUEFSTSAgICAgICBwRWRjYVBhcm0sCi0JT1VUIFBRQlNTX0xPQURfUEFSTSAgcFFic3NMb2FkLAotCU9VVCBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlPVVQgVUxPTkcgKnBSYWxpbmtJZSwKLQlPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKLQlPVVQgVUNIQVIJCSAqcFByZU5IdENhcGFiaWxpdHlMZW4sCi0JT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUIFVDSEFSCQkgKkFkZEh0SW5mb0xlbiwKLQlPVVQgQUREX0hUX0lORk9fSUUgKkFkZEh0SW5mbywKLQlPVVQgVUNIQVIgKk5ld0V4dENoYW5uZWwsCi0JT1VUIFVTSE9SVCAqTGVuZ3RoVklFLAotCU9VVCBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOworQk9PTEVBTiBQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB2b2lkICogcE1zZywKKwkJCQkgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHU4ICpwQWRkcjIpOwogCi1CT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMik7CitCT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHZvaWQgKiBwTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbik7CiAKLUJPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKTsKK0JPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHU4IFdjaWQsIHZvaWQgKiBwTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbik7CiAKLUJPT0xFQU4gUGVlckRlbEJBQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSIFdjaWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pOworQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBcEFkZHIsCisJCQkgICB1MTYgKiBDYXBhYmlsaXR5SW5mbywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKiBUaW1lb3V0LCB1MTYgKiBMaXN0ZW5JbnR2KTsKIAotQk9PTEVBTiBNbG1lQXNzb2NSZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFwQWRkciwKLQlPVVQgVVNIT1JUICpDYXBhYmlsaXR5SW5mbywKLQlPVVQgVUxPTkcgKlRpbWVvdXQsCi0JT1VUIFVTSE9SVCAqTGlzdGVuSW50dik7CitCT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdm9pZCAqIE1zZywKKwkJCSAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgIHU4ICpwQWRkciwKKwkJCSAgdW5zaWduZWQgbG9uZyAqIFRpbWVvdXQsIHUxNiAqIEFsZyk7CiAKLUJPT0xFQU4gTWxtZUF1dGhSZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIsCi0JT1VUIFVMT05HICpUaW1lb3V0LAotCU9VVCBVU0hPUlQgKkFsZyk7CitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICBjaGFyIFNzaWRbXSwgdTggKiBTc2lkbGVuKTsKIAotQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBDSEFSIFNzaWRbXSwKLQlPVVQgVUNIQVIgKlNzaWRsZW4pOworQk9PTEVBTiBQZWVyQXV0aFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB2b2lkICogTXNnLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCSAgICAgICB1OCAqcEFkZHIsCisJCSAgICAgICB1MTYgKiBBbGcsCisJCSAgICAgICB1MTYgKiBTZXEsCisJCSAgICAgICB1MTYgKiBTdGF0dXMsIGNoYXIgQ2hsZ1RleHRbXSk7CiAKLUJPT0xFQU4gUGVlckF1dGhTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIsCi0JT1VUIFVTSE9SVCAqQWxnLAotCU9VVCBVU0hPUlQgKlNlcSwKLQlPVVQgVVNIT1JUICpTdGF0dXMsCi0JT1VUIENIQVIgQ2hsZ1RleHRbXSk7CitCT09MRUFOIFBlZXJBc3NvY1JzcFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKiBwTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBBZGRyMiwgdTE2ICogcENhcGFiaWxpdHlJbmZvLCB1MTYgKiBwU3RhdHVzLCB1MTYgKiBwQWlkLCB1OCBTdXBSYXRlW10sIHU4ICogcFN1cFJhdGVMZW4sIHU4IEV4dFJhdGVbXSwgdTggKiBwRXh0UmF0ZUxlbiwgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvLAkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwkJCSAgIHU4ICogcEh0Q2FwYWJpbGl0eUxlbiwKKwkJCSAgIHU4ICogcEFkZEh0SW5mb0xlbiwKKwkJCSAgIHU4ICogcE5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkgICBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sIHU4ICogcENraXBGbGFnKTsKIAotQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLQlPVVQgVVNIT1JUICpwU3RhdHVzLAotCU9VVCBVU0hPUlQgKnBBaWQsCi0JT1VUIFVDSEFSIFN1cFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotCU9VVCBVQ0hBUiBFeHRSYXRlW10sCi0JT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0gICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0gICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAotCU9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlPVVQgVUNIQVIgKnBDa2lwRmxhZyk7CitCT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFkZHIyLCB1MTYgKiBSZWFzb24pOwogCi1CT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFVTSE9SVCAqUmVhc29uKTsKK0JPT0xFQU4gUGVlcldwYU1lc3NhZ2VTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfZWFwb2xfcGFja2V0ICogcE1zZywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICAgIHU4IE1zZ1R5cGUsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLUJPT0xFQU4gUGVlckRlYXV0aFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFVTSE9SVCAqUmVhc29uKTsKK0JPT0xFQU4gUGVlckRlYXV0aFNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdm9pZCAqIE1zZywKKwkJCSB1bnNpZ25lZCBsb25nIE1zZ0xlbiwKKwkJCSB1OCAqcEFkZHIyLCB1MTYgKiBSZWFzb24pOwogCi1CT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4pOworQk9PTEVBTiBQZWVyUHJvYmVSZXFTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqIE1zZywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgTXNnTGVuLAorCQkJICAgdTggKnBBZGRyMiwKKwkJCSAgIGNoYXIgU3NpZFtdLCB1OCAqIHBTc2lkTGVuKTsKIAotQk9PTEVBTiBHZXRUaW1CaXQoCi0JSU4gIENIQVIgKlB0ciwKLQlJTiAgVVNIT1JUIEFpZCwKLQlPVVQgVUNIQVIgKlRpbUxlbiwKLQlPVVQgVUNIQVIgKkJjYXN0RmxhZywKLQlPVVQgVUNIQVIgKkR0aW1Db3VudCwKLQlPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCi0JT1VUIFVDSEFSICpNZXNzYWdlVG9NZSk7CitCT09MRUFOIEdldFRpbUJpdChjaGFyICogUHRyLAorCQkgIHUxNiBBaWQsCisJCSAgdTggKiBUaW1MZW4sCisJCSAgdTggKiBCY2FzdEZsYWcsCisJCSAgdTggKiBEdGltQ291bnQsCisJCSAgdTggKiBEdGltUGVyaW9kLCB1OCAqIE1lc3NhZ2VUb01lKTsKIAotVUNIQVIgQ2hhbm5lbFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKTsKK3U4IENoYW5uZWxTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBjaGFubmVsKTsKIAotTkRJU184MDJfMTFfTkVUV09SS19UWVBFIE5ldHdvcmtUeXBlSW5Vc2VTYW5pdHkoCi0JSU4gUEJTU19FTlRSWSBwQnNzKTsKK05ESVNfODAyXzExX05FVFdPUktfVFlQRSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KHN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3MpOwogCi1CT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKTsKK0JPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHZvaWQgKiBNc2csIHVuc2lnbmVkIGxvbmcgTXNnTGVuKTsKIAotQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMik7CitCT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLCB1bnNpZ25lZCBsb25nIE1zZ0xlbiwgdTggKnBBZGRyMik7CiAKLVVMT05HIE1ha2VPdXRnb2luZ0ZyYW1lKAotCU9VVCBDSEFSICpCdWZmZXIsCi0JT1VUIFVMT05HICpMZW5ndGgsIC4uLik7Cit1bnNpZ25lZCBsb25nIE1ha2VPdXRnb2luZ0ZyYW1lKHU4ICogQnVmZmVyLCB1bnNpZ25lZCBsb25nICogTGVuZ3RoLCAuLi4pOwogCi1WT0lEICBMZnNySW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgU2VlZCk7Cit2b2lkIExmc3JJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBTZWVkKTsKIAotVUNIQVIgUmFuZG9tQnl0ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit1OCBSYW5kb21CeXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBUeFJhdGUpOwordm9pZCBBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcFR4UmF0ZSk7CiAKLVZPSUQgIE1sbWVQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgTWxtZVBlcmlvZGljRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIExpbmtEb3duRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwordm9pZCBMaW5rRG93bkV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CiAKLVZPSUQgU1RBTWxtZVBlcmlvZGljRXhlYygKLQlQUlRNUF9BREFQVEVSIHBBZCk7Cit2b2lkIFNUQU1sbWVQZXJpb2RpY0V4ZWMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lQXV0b1NjYW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBNbG1lQXV0b1NjYW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIE1sbWVWYWxpZGF0ZVNTSUQoCi0JSU4gUFVDSEFSIHBTc2lkLAotCUlOIFVDSEFSICBTc2lkTGVuKTsKK0JPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCh1OCAqcFNzaWQsIHU4IFNzaWRMZW4pOwogCi1WT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgICAgTm93MzIpOwordm9pZCBNbG1lQ2hlY2tGb3JSb2FtaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdW5zaWduZWQgbG9uZyBOb3czMik7CiAKLVZPSUQgTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVMT05HICAgICAgICAgICBOb3cpOworQk9PTEVBTiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBNbG1lU2V0VHhSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSk7Cit2b2lkIE1sbWVTZXRUeFJhdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9ydG1wX3R4X3JhdGVfc3dpdGNoICogcFR4UmF0ZSk7CiAKLVZPSUQgTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFVDSEFSCQkJCSpwcFRhYmxlLAotCUlOIFBVQ0hBUgkJCQlwVGFibGVTaXplLAotCUlOIFBVQ0hBUgkJCQlwSW5pdFR4UmF0ZUlkeCk7Cit2b2lkIE1sbWVTZWxlY3RUeFJhdGVUYWJsZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICB1OCAqKiBwcFRhYmxlLAorCQkJICAgdTggKnBUYWJsZVNpemUsIHU4ICpwSW5pdFR4UmF0ZUlkeCk7CiAKLVZPSUQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIE5vdyk7Cit2b2lkIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBNYWNFbnRyeSwgdW5zaWduZWQgbG9uZyBOb3cpOwogCi1WT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyAgICBOb3czMik7Cit2b2lkIE1sbWVDaGVja1BzbUNoYW5nZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgTm93MzIpOwogCi1WT0lEIE1sbWVTZXRQc21CaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHBzbSk7Cit2b2lkIE1sbWVTZXRQc21CaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1MTYgcHNtKTsKIAotVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVHhQcmVhbWJsZSk7Cit2b2lkIE1sbWVTZXRUeFByZWFtYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2IFR4UHJlYW1ibGUpOwogCi1WT0lEIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCwKLQlJTiAJQk9PTEVBTgkJIAliTGlua1VwLAotCUlOCVVDSEFSCQkJYXBpZHgpOwordm9pZCBNbG1lVXBkYXRlVHhSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBJTiBCT09MRUFOIGJMaW5rVXAsIHU4IGFwaWR4KTsKIAotVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIgCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpOwordm9pZCBNbG1lVXBkYXRlSHRUeFJhdGVzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggYXBpZHgpOwogCi1WT0lEICAgIFJUTVBDaGVja1JhdGVzKAotCUlOICAgICAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBPVVQgIFVDSEFSICAgICAgICAgICBTdXBSYXRlW10sCi0JSU4gT1VUICBVQ0hBUiAgICAgICAgICAgKlN1cFJhdGVMZW4pOwordm9pZCBSVE1QQ2hlY2tSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICBJTiB1OCBTdXBSYXRlW10sIElOIHU4ICogU3VwUmF0ZUxlbik7CiAKLUJPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCi0JSU4gVUNIQVIJCUNoYW5uZWwpOworQk9PTEVBTiBSVE1QQ2hlY2tDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1OCBDZW50cmFsQ2hhbm5lbCwgdTggQ2hhbm5lbCk7CiAKLUJPT0xFQU4gCVJUTVBDaGVja0h0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVUNIQVIJV2NpZCwKLQlJTiBPVVQJSFRfQ0FQQUJJTElUWV9JRQkJCSpwSHRDYXBhYmlsaXR5LAotCUlOIE9VVAlBRERfSFRfSU5GT19JRQkJCSpwQWRkSHRJbmZvKTsKK0JPT0xFQU4gUlRNUENoZWNrSHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggV2NpZCwKKwkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pOwogCi1WT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCQkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkJICB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUTVBVcGRhdGVNbG1lUmF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1DSEFSIFJUTVBNYXhSc3NpKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIENIQVIJCQkJUnNzaTAsCi0JSU4gQ0hBUgkJCQlSc3NpMSwKLQlJTiBDSEFSCQkJCVJzc2kyKTsKK2NoYXIgUlRNUE1heFJzc2koc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgY2hhciBSc3NpMCwgY2hhciBSc3NpMSwgY2hhciBSc3NpMik7CiAKLVZPSUQgQXNpY1NldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KTsKKyNpZmRlZiBSVDMweHgKK3ZvaWQgQXNpY1NldFJ4QW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQW50KTsKIAotVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNSeEFudEV2YWxUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CisjaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCisvKjIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2U8LS0gKi8KK2ludCBzZXRfZUZ1c2VHZXRGcmVlQmxvY2tDb3VudF9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotVk9JRCBBUFNEUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7CitpbnQgc2V0X2VGdXNlZHVtcF9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKK3ZvaWQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXUxNiBPZmZzZXQsCisJCQkJdTE2IExlbmd0aCwgdTE2ICogcERhdGEpOwogCi1VQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpOworaW50IFJ0bXBFZnVzZVN1cHBvcnRDaGVjayhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCi0JCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCi0JCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKK3ZvaWQgZUZ1c2VHZXRGcmVlQmxvY2tDb3VudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUzMiAqRWZ1c2VGcmVlQmxvY2spOwogCi1CT09MRUFOIFJUTVBBdXRvUmF0ZVN3aXRjaENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkKTsKK2ludCBlRnVzZV9pbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisvKjIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4gKi8KKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KIAotTkRJU19TVEFUVVMgTWxtZUluaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworLyogYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAgKi8KK3ZvaWQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWxtZUhhbmRsZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIE1sbWVIYWx0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKy8qIGVuZCBqb2hubGkgKi8KIAotVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7CisjaWZkZWYgUlQzMDcwCit2b2lkIE5JQ0luaXRSVDMwNzBSRlJlZ2lzdGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworI2VuZGlmIC8qIFJUMzA3MCAvLyAqLworI2lmZGVmIFJUMzA5MAordm9pZCBOSUNJbml0UlQzMDkwUkZSZWdpc3RlcnMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KIAotVk9JRCBCdWlsZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUlQzMHh4SGFsdEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1VQ0hBUiBGaXJzdENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVDMweHhTZXRSeEFudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEFudCk7CisjZW5kaWYgLyogUlQzMHh4IC8vICovCiAKLVVDSEFSIE5leHRDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiBjaGFubmVsKTsKK3ZvaWQgQXNpY0V2YWx1YXRlUnhBbnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKK3ZvaWQgQXNpY1J4QW50RXZhbFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCQkgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVVNIT1JUIFJUTVBfRUVQUk9NX1JFQUQxNigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVVNIT1JUIE9mZnNldCk7Cit2b2lkIEFQU0RQZXJpb2RpY0V4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAotVk9JRCBSVE1QX0VFUFJPTV9XUklURTE2KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVU0hPUlQgT2Zmc2V0LAotCUlOICBVU0hPUlQgRGF0YSk7CitCT09MRUFOIFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2goc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi0vLwotLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHJ0bXBfdGtpcC5jCi0vLwotVk9JRCAgICBSVE1QSW5pdFRraXBFbmdpbmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwVEtleSwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFRBLAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBUU0MsCi0JT1VUIFBVTE9ORyAgICAgICAgICBwSVYxNiwKLQlPVVQgUFVMT05HICAgICAgICAgIHBJVjMyKTsKK3U4IFJUTVBTdGFGaXhlZFR4TW9kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgICAgUlRNUEluaXRNSUNFbmdpbmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSk7Cit2b2lkIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcodTggZml4ZWRfdHhfbW9kZSwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotQk9PTEVBTiBSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAotCUlOCVVDSEFSCQkJVXNlclByaW9yaXR5LAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKK0JPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCAgICBSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0LAotCUlOICBQVUNIQVIgICAgICAgICAgcEVuY2FwLAotCUlOICBQQ0lQSEVSX0tFWSAgICAgcEtleSwKLQlJTglVQ0hBUgkJCWFwaWR4KTsKK2ludCBNbG1lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIFJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlV2l0aExMQygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBMTEMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Cit2b2lkIE1sbWVIYW5kbGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgICAgUlRNUFRraXBBcHBlbmRCeXRlKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXAsCi0JSU4gIFVDSEFSICAgICAgICAgICB1Q2hhcik7Cit2b2lkIE1sbWVIYWx0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgICAgUlRNUFRraXBBcHBlbmQoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBuQnl0ZXMpOwordm9pZCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEICAgIFJUTVBUa2lwR2V0TUlDKAotCUlOICBQVEtJUF9LRVlfSU5GTyAgcFRraXApOwordm9pZCBCdWlsZENoYW5uZWxMaXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOwordTggRmlyc3RDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUJPT0xFQU4gUlRNUFNvZnREZWNyeXB0QUVTKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwRGF0YSwKLQlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KTsKK3U4IE5leHRDaGFubmVsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggY2hhbm5lbCk7CiAKLS8vCi0vLyBQcm90b3R5cGVzIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gY21tX2luZm8uYwotLy8KLU5ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVk9JRCAgICAgICAgICAgcEJ1Zik7Cit2b2lkIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4IEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CiAKLVZPSUQgICAgUlRNUFdQQVJlbW92ZUFsbEtleXMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOworLyogKi8KKy8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBydG1wX3RraXAuYyAqLworLyogKi8KK3ZvaWQgUlRNUEluaXRUa2lwRW5naW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXU4ICpwVEtleSwKKwkJCXU4IEtleUlkLAorCQkJdTggKnBUQSwKKwkJCXU4ICpwTUlDS2V5LAorCQkJdTggKnBUU0MsIHVuc2lnbmVkIGxvbmcgKnBJVjE2LCB1bnNpZ25lZCBsb25nICpwSVYzMik7CiAKLUJPT0xFQU4gUlRNUENoZWNrU3RyUHJpbnRBYmxlKAotICAgIElOICBDSEFSICpwSW5QdXRTdHIsCi0gICAgSU4gIFVDSEFSIHN0ckxlbik7Cit2b2lkIFJUTVBJbml0TUlDRW5naW5lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwS2V5LAorCQkgICAgICAgdTggKnBEQSwKKwkJICAgICAgIHU4ICpwU0EsIHU4IFVzZXJQcmlvcml0eSwgdTggKnBNSUNLZXkpOwogCi1WT0lEICAgIFJUTVBTZXRQaHlNb2RlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyBwaHltb2RlKTsKK0JPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4ICpwU3JjLAorCQkJCXU4ICpwREEsCisJCQkJdTggKnBTQSwKKwkJCQl1OCAqcE1JQ0tleSwKKwkJCQl1OCBVc2VyUHJpb3JpdHksIHUzMiBMZW4pOwogCi1WT0lECVJUTVBVcGRhdGVIVElFKAotCUlOCVJUX0hUX0NBUEFCSUxJVFkJKnBSdEh0LAotCUlOCQlVQ0hBUgkJCQkqcE1jc1NldCwKLQlPVVQJCUhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUCQlBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pOwordm9pZCBSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdm9pZCAqcFBhY2tldCwKKwkJCSAgIHU4ICpwRW5jYXAsCisJCQkgICBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcEtleSwgdTggYXBpZHgpOwogCi1WT0lECVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCc3NJZHgsCi0JSU4gCVVDSEFSCQkgCUtleUlkeCwKLQlJTiAJVUNIQVIJCSAJQ2lwaGVyQWxnLAotCUlOIAlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Cit2b2lkIFJUTVBUa2lwQXBwZW5kQnl0ZShzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXAsIHU4IHVDaGFyKTsKIAotQ0hBUiAqR2V0RW5jcnlwdFR5cGUoCi0JQ0hBUiBlbmMpOwordm9pZCBSVE1QVGtpcEFwcGVuZChzdHJ1Y3QgcnRfdGtpcF9rZXlfaW5mbyAqcFRraXAsIHU4ICpwU3JjLCB1MzIgbkJ5dGVzKTsKIAotQ0hBUiAqR2V0QXV0aE1vZGUoCi0JQ0hBUiBhdXRoKTsKK3ZvaWQgUlRNUFRraXBHZXRNSUMoc3RydWN0IHJ0X3RraXBfa2V5X2luZm8gKnBUa2lwKTsKIAotVk9JRCBSVE1QSW9jdGxHZXRTaXRlU3VydmV5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpOworQk9PTEVBTiBSVE1QU29mdERlY3J5cHRUS0lQKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICB1OCAqcERhdGEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBEYXRhQnl0ZUNudCwKKwkJCSAgICB1OCBVc2VyUHJpb3JpdHksIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5KTsKIAotVk9JRCBSVE1QSW9jdGxHZXRNYWNUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEgKndycSk7CitCT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ250LCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSk7CiAKLVZPSUQgICAgUlRNUEFkZEJTU0lEQ2lwaGVyKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCUFpZCwKLSAgICBJTiAgUE5ESVNfODAyXzExX0tFWSAgICBwS2V5LAotICAgIElOICBVQ0hBUiAgIENpcGhlckFsZyk7CisvKiAqLworLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMgKi8KKy8qICovCitpbnQgUlRfQ2ZnU2V0Q291bnRyeVJlZ2lvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZywgaW50IGJhbmQpOwogCi1WT0lECVJUTVBTZXRIVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglPSURfU0VUX0hUX1BIWU1PREUgKnBIVFBoeU1vZGUpOworaW50IFJUX0NmZ1NldFdpcmVsZXNzTW9kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLVZPSUQJUlRNUFNldEluZGl2aWR1YWxIVCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpOworaW50IFJUX0NmZ1NldFNob3J0U2xvdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLVZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCi0JSU4JUFVDSEFSIAkJCXBBZGRyLAotCUlOICBVQ0hBUgkJCUJzc0lkeCwKLQlJTglDSEFSCQkJUnNzaSk7CitpbnQgUlRfQ2ZnU2V0V2VwS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgIGNoYXIgKmtleVN0cmluZywKKwkJICAgIHN0cnVjdCBydF9jaXBoZXJfa2V5ICpwU2hhcmVkS2V5LCBpbnQga2V5SWR4KTsKIAotLy8KLS8vIHByb3RvdHlwZSBpbiB3cGEuYwotLy8KLUJPT0xFQU4gV3BhTXNnVHlwZVN1YnN0KAotCUlOICBVQ0hBUiAgIEVBUFR5cGUsCi0JT1VUIElOVAkJKk1zZ1R5cGUpOworaW50IFJUX0NmZ1NldFdQQVBTS0tleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBjaGFyICprZXlTdHJpbmcsCisJCSAgICAgICB1OCAqIHBIYXNoU3RyLAorCQkgICAgICAgaW50IGhhc2hTdHJMZW4sIHU4ICpwUE1LQnVmKTsKIAotVk9JRCBXcGFQc2tTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAgICAgICAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOworLyogKi8KKy8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBjbW1faW5mby5jICovCisvKiAqLwordm9pZCBSVE1QV1BBUmVtb3ZlQWxsS2V5cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSVE1QU2V0UGh5TW9kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHVuc2lnbmVkIGxvbmcgcGh5bW9kZSk7CiAKLVZPSUQgICAgV3BhUGFpck1zZzFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJUTVBVcGRhdGVIVElFKHN0cnVjdCBydF9odF9jYXBhYmlsaXR5ICpwUnRIdCwKKwkJICAgIHU4ICogcE1jc1NldCwKKwkJICAgIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwKKwkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8pOwogCi1WT0lEICAgIFdwYVBhaXJNc2czQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1OCBCc3NJZHgsCisJCQkgICAgICAgdTggS2V5SWR4LAorCQkJICAgICAgIHU4IENpcGhlckFsZywgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCAgICBXcGFHcm91cE1zZzFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7CitjaGFyICpHZXRFbmNyeXB0VHlwZShjaGFyIGVuYyk7CiAKLVZPSUQgICAgV3BhTWFjSGVhZGVySW5pdCgKLQlJTiAgICAgIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gT1VUICBQSEVBREVSXzgwMl8xMSAgcEhkcjgwMjExLAotCUlOICAgICAgVUNIQVIgICAgICAgICAgIHdlcCwKLQlJTiAgICAgIFBVQ0hBUiAgICAgICAgICBwQWRkcjEpOworY2hhciAqR2V0QXV0aE1vZGUoY2hhciBhdXRoKTsKIAotVk9JRCAgICBXcGEyUGFpck1zZzFBY3Rpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIFJUTVBTZXRIVChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9vaWRfc2V0X2h0X3BoeW1vZGUgKnBIVFBoeU1vZGUpOwogCi1WT0lEICAgIFdwYTJQYWlyTXNnM0FjdGlvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3ZvaWQgUlRNUFNldEluZGl2aWR1YWxIVChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IGFwaWR4KTsKIAotQk9PTEVBTiBQYXJzZUtleURhdGEoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCi0JSU4JVUNIQVIJCQliUGFpcmV3aXNlKTsKK3ZvaWQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHUxNiBFdmVudF9mbGFnLAorCQkJICAgdTggKnBBZGRyLCB1OCBCc3NJZHgsIGNoYXIgUnNzaSk7CiAKLVZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCi0gICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKTsKK2NoYXIgQ29udmVydFRvUnNzaShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgUnNzaSwgdTggUnNzaU51bWJlcik7CiAKLVZPSUQgICAgSE1BQ19TSEExKAotCUlOICBVQ0hBUiAgICp0ZXh0LAotCUlOICBVSU5UICAgIHRleHRfbGVuLAotCUlOICBVQ0hBUiAgICprZXksCi0JSU4gIFVJTlQgICAga2V5X2xlbiwKLQlJTiAgVUNIQVIgICAqZGlnZXN0KTsKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlGdW5jdGlvbiBwcm90b3R5cGUgaW4gY21tX3dwYS5jCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit2b2lkIFJUTVBUb1dpcmVsZXNzU3RhKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJICAgICAgIHU4ICpwSGVhZGVyODAyXzMsCisJCSAgICAgICB1MzIgSGRyTGVuLAorCQkgICAgICAgdTggKnBEYXRhLAorCQkgICAgICAgdTMyIERhdGFMZW4sIElOIEJPT0xFQU4gYkNsZWFyRnJhbWUpOwogCi1WT0lEICAgIFBSRigKLQlJTiAgVUNIQVIgICAqa2V5LAotCUlOICBJTlQgICAgIGtleV9sZW4sCi0JSU4gIFVDSEFSICAgKnByZWZpeCwKLQlJTiAgSU5UICAgICBwcmVmaXhfbGVuLAotCUlOICBVQ0hBUiAgICpkYXRhLAotCUlOICBJTlQgICAgIGRhdGFfbGVuLAotCU9VVCBVQ0hBUiAgICpvdXRwdXQsCi0JSU4gIElOVCAgICAgbGVuKTsKK3ZvaWQgV3BhRGVyaXZlUFRLKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICB1OCAqIFBNSywKKwkJICB1OCAqIEFOb25jZSwKKwkJICB1OCAqIEFBLAorCQkgIHU4ICogU05vbmNlLAorCQkgIHU4ICogU0EsIHU4ICogb3V0cHV0LCB1MzIgbGVuKTsKIAotVk9JRCAgICBDQ0tNUFJGKAotCUlOICBVQ0hBUiAgICprZXksCi0JSU4gIElOVCAgICAga2V5X2xlbiwKLQlJTiAgVUNIQVIgICAqZGF0YSwKLQlJTiAgSU5UICAgICBkYXRhX2xlbiwKLQlPVVQgVUNIQVIgICAqb3V0cHV0LAotCUlOICBJTlQgICAgIGxlbik7Cit2b2lkIEdlblJhbmRvbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICogbWFjQWRkciwgdTggKiByYW5kb20pOwogCi1WT0lEIFdwYUNvdW50UFRLKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICpQTUssCi0JSU4gIFVDSEFSICAgKkFOb25jZSwKLQlJTiAgVUNIQVIgICAqQUEsCi0JSU4gIFVDSEFSICAgKlNOb25jZSwKLQlJTiAgVUNIQVIgICAqU0EsCi0JT1VUIFVDSEFSICAgKm91dHB1dCwKLQlJTiAgVUlOVCAgICBsZW4pOworQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgdTggKnBEYXRhLAorCQkJICB1bnNpZ25lZCBsb25nIERhdGFCeXRlQ291bnQsIHU4IEZyb21XaGljaEJTU0lEKTsKIAotVk9JRCAgICBHZW5SYW5kb20oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQkqbWFjQWRkciwKLQlPVVQJVUNIQVIJCQkqcmFuZG9tKTsKK3ZvaWQgQUVTX0dUS19LRVlfVU5XUkFQKHU4ICoga2V5LAorCQkJdTggKiBwbGFpbnRleHQsCisJCQl1MzIgY19sZW4sIHU4ICogY2lwaGVydGV4dCk7CiAKLS8vCi0vLyBwcm90b3R5cGUgaW4gYWlyb25ldC5jCi0vLwotVk9JRCAgICBBaXJvbmV0U3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgICAgICAgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyAgVHJhbnNbXSk7CitCT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCAqcEtleURhdGEsCisJCQkgICAgICB1OCBLZXlEYXRhTGVuLAorCQkJICAgICAgdTggR3JvdXBLZXlJbmRleCwKKwkJCSAgICAgIHU4IE1zZ1R5cGUsCisJCQkgICAgICBJTiBCT09MRUFOIGJXUEEyLCBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkpOwogCi1WT0lEICAgIEFpcm9uZXRNc2dBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Cit2b2lkIENvbnN0cnVjdEVhcG9sTXNnKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJICAgICAgIHU4IEdyb3VwS2V5V2VwU3RhdHVzLAorCQkgICAgICAgdTggTXNnVHlwZSwKKwkJICAgICAgIHU4IERlZmF1bHRLZXlJZHgsCisJCSAgICAgICB1OCAqIEtleU5vbmNlLAorCQkgICAgICAgdTggKiBUeFJTQywKKwkJICAgICAgIHU4ICogR1RLLAorCQkgICAgICAgdTggKiBSU05JRSwKKwkJICAgICAgIHU4IFJTTklFX0xlbiwgc3RydWN0IHJ0X2VhcG9sX3BhY2tldCAqIHBNc2cpOwogCi1WT0lEICAgIEFpcm9uZXRSZXF1ZXN0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOworaW50IFJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCQkgSU4gTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMKKwkJCQkJIEdyb3VwQ2lwaGVyLAorCQkJCQkgc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBTaGFyZF9rZXkpOwogCi1WT0lEICAgIENoYW5uZWxMb2FkUmVxdWVzdEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIEluZGV4KTsKK3ZvaWQgUlRNUE1ha2VSU05JRShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgIHUzMiBBdXRoTW9kZSwgdTMyIFdlcFN0YXR1cywgdTggYXBpZHgpOwogCi1WT0lEICAgIE5vaXNlSGlzdFJlcXVlc3RBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7CisvKiAqLworLyogZnVuY3Rpb24gcHJvdG90eXBlIGluIGFwX3dwYS5jICovCisvKiAqLwordm9pZCBSVE1QR2V0VHhUc2NGcm9tQXNpYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHU4IGFwaWR4LCB1OCAqcFR4VHNjKTsKIAotVk9JRCAgICBCZWFjb25SZXF1ZXN0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOwordm9pZCBBUEluc3RhbGxQYWlyd2lzZUtleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgICAgQWlyb25ldFJlcG9ydEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKK3UzMiBBUFZhbGlkYXRlUlNOSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJICAgICB1OCAqcFJzbkllLCB1OCByc25pZV9sZW4pOwogCi1WT0lEICAgIENoYW5uZWxMb2FkUmVwb3J0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOwordm9pZCBIYW5kbGVDb3VudGVyTWVhc3VyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSk7CiAKLVZPSUQgICAgTm9pc2VIaXN0UmVwb3J0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiAgICAgICAgICAgSW5kZXgpOwordm9pZCBXUEFTdGFydDRXYXlIUyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHVuc2lnbmVkIGxvbmcgVGltZUludGVydmFsKTsKIAotVk9JRCAgICBBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBXUEFTdGFydDJXYXlHcm91cEhTKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5KTsKIAotVk9JRCAgICBCZWFjb25SZXBvcnRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBJbmRleCk7Cit2b2lkIFBlZXJQYWlyTXNnMUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi1WT0lEICAgIEFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotCUlOICBVTE9ORyAgICAgICAgICAgICAgIEluZGV4LAotCUlOICBQTUxNRV9RVUVVRV9FTEVNICAgIHBFbGVtKTsKK3ZvaWQgUGVlclBhaXJNc2cyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgICAgQWlyb25ldENyZWF0ZUJlYWNvblJlcG9ydEZyb21Cc3NUYWJsZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOwordm9pZCBQZWVyUGFpck1zZzNBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAotQ0hBUiAgICBDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBDSEFSCQkJCVJzc2ksCi0JSU4gVUNIQVIgICAgUnNzaU51bWJlcik7Cit2b2lkIFBlZXJQYWlyTXNnNEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pOwogCi0vLwotLy8gZnVuY3Rpb24gcHJvdG90eXBlIGluIGNtbV93cGEuYwotLy8KLUJPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4gUFVDSEFSIAkJCXBEYXRhLAotCUlOIFVMT05HIAkJCURhdGFCeXRlQ291bnQsCi0JSU4gVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Cit2b2lkIFBlZXJHcm91cE1zZzFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSk7CiAKLVZPSUQgQUVTX0dUS19LRVlfVU5XUkFQKAotCUlOICBVQ0hBUiAgICprZXksCi0JT1VUIFVDSEFSICAgKnBsYWludGV4dCwKLQlJTglVQ0hBUgljX2xlbiwKLQlJTiAgVUNIQVIgICAqY2lwaGVydGV4dCk7Cit2b2lkIFBlZXJHcm91cE1zZzJBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSB2b2lkICogTXNnLCB1MzIgTXNnTGVuKTsKIAotVk9JRCBSVE1QTWFrZVJTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCi0JSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCi0JSU4JVUNIQVIJCQlhcGlkeCk7Cit2b2lkIFdwYURlcml2ZUdUSyh1OCAqIFBNSywKKwkJICB1OCAqIEdOb25jZSwKKwkJICB1OCAqIEFBLCB1OCAqIG91dHB1dCwgdTMyIGxlbik7CiAKLS8vCi0vLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYXBfd3BhLmMKLS8vCit2b2lkIEFFU19HVEtfS0VZX1dSQVAodTggKiBrZXksCisJCSAgICAgIHU4ICogcGxhaW50ZXh0LAorCQkgICAgICB1MzIgcF9sZW4sIHU4ICogY2lwaGVydGV4dCk7CiAKLVZPSUQgSGFuZGxlQ291bnRlck1lYXN1cmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKKy8qdHlwZWRlZiB2b2lkICgqVElNRVJfRlVOQ1RJT04pKHVuc2lnbmVkIGxvbmcpOyAqLwogCiAvKiB0aW1lb3V0IC0tIG1zICovCi1WT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKK3ZvaWQgUlRNUF9TZXRQZXJpb2RpY1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkJICAgSU4gdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIAotVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAotCUlOCVBWT0lEIGRhdGEpOwordm9pZCBSVE1QX09TX0luaXRfVGltZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCQlJTiBUSU1FUl9GVU5DVElPTiBmdW5jdGlvbiwgdm9pZCAqZGF0YSk7CiAKLVZPSUQgUlRNUF9PU19BZGRfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCk7Cit2b2lkIFJUTVBfT1NfQWRkX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgSU4gdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIAotVk9JRCBSVE1QX09TX01vZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKK3ZvaWQgUlRNUF9PU19Nb2RfVGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKiBwVGltZXIsCisJCSAgICAgICBJTiB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogCit2b2lkIFJUTVBfT1NfRGVsX1RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogcFRpbWVyLAorCQkgICAgICAgT1VUIEJPT0xFQU4gKiBwQ2FuY2VsbGVkKTsKIAotVk9JRCBSVE1QX09TX0RlbF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCSpwVGltZXIsCi0JT1VUCUJPT0xFQU4JCQkJICpwQ2FuY2VsbGVkKTsKK3ZvaWQgUlRNUF9PU19SZWxlYXNlX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcEVudHJ5KTsKIAordm9pZCBSVE1QdXNlY0RlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYyk7CiAKLVZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSk7CitpbnQgb3NfYWxsb2NfbWVtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1OCAqKiBtZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKLVZPSUQgUlRNUHVzZWNEZWxheSgKLQlJTglVTE9ORwl1c2VjKTsKK2ludCBvc19mcmVlX21lbShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKm1lbSk7CiAKLU5ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQJUFVDSEFSICptZW0sCi0JSU4JVUxPTkcgIHNpemUpOwordm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSAgICAgICBJTiBCT09MRUFOIENhY2hlZCwKKwkJCSAgICAgICB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJICAgICAgIGRtYV9hZGRyX3QgKlBoeXNpY2FsQWRkcmVzcyk7CiAKLU5ESVNfU1RBVFVTIG9zX2ZyZWVfbWVtKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBVQ0hBUiBtZW0pOwordm9pZCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKK2ludCBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSh2b2lkICpoYW5kbGUsIHZvaWQgKiogcHBBZCk7CiAKLXZvaWQgUlRNUF9BbGxvY2F0ZVNoYXJlZE1lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwordm9pZCBSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1MzIgSW5kZXgsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpOwogCi1WT0lEIFJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwordm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdTMyIEluZGV4LAorCQkJCXVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJCUlOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCXZvaWQgKiogVmlydHVhbEFkZHJlc3MsCisJCQkJZG1hX2FkZHJfdCAqUGh5c2ljYWxBZGRyZXNzKTsKIAotTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCi0JSU4gUFZPSUQJaGFuZGxlLAotCU9VVAlQVk9JRAkqcHBBZCk7Cit2b2lkIFJUTVBfRnJlZUZpcnN0VHhCdWZmZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJICAgIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJICAgIHZvaWQgKlZpcnR1YWxBZGRyZXNzLAorCQkJICAgIGRtYV9hZGRyX3QgUGh5c2ljYWxBZGRyZXNzKTsKIAotdm9pZCBSVE1QX0FsbG9jYXRlVHhEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVJTlQJSW5kZXgsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKK3ZvaWQgUlRNUF9BbGxvY2F0ZU1nbXREZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkJIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCSB2b2lkICoqIFZpcnR1YWxBZGRyZXNzLAorCQkJCSBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpOwogCi12b2lkIFJUTVBfQWxsb2NhdGVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVJTlQJSW5kZXgsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKK3ZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBMZW5ndGgsCisJCQkgICAgICAgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkgICAgICAgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCSAgICAgICBkbWFfYWRkcl90ICpQaHlzaWNhbEFkZHJlc3MpOwogCi12b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwordm9pZCBSVE1QX0ZyZWVEZXNjTWVtb3J5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCSB2b2lkICpWaXJ0dWFsQWRkcmVzcywKKwkJCSBkbWFfYWRkcl90IFBoeXNpY2FsQWRkcmVzcyk7CiAKLXZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwordm9pZCAqUnRtcE9TTmV0UGt0QWxsb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBpbnQgc2l6ZSk7CiAKLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKK3ZvaWQgKlJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB1bnNpZ25lZCBsb25nIExlbmd0aCwKKwkJCQkJIElOIEJPT0xFQU4gQ2FjaGVkLAorCQkJCQkgdm9pZCAqKiBWaXJ0dWFsQWRkcmVzcywKKwkJCQkJIE9VVCBkbWFfYWRkcl90ICoKKwkJCQkJIFBoeXNpY2FsQWRkcmVzcyk7CiAKLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpOwordm9pZCAqUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgTGVuZ3RoLAorCQkJCQkgSU4gQk9PTEVBTiBDYWNoZWQsCisJCQkJCSB2b2lkICoqIFZpcnR1YWxBZGRyZXNzKTsKIAotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCk7Cit2b2lkICpSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgTGVuZ3RoKTsKIAotdm9pZCBSVE1QX1F1ZXJ5UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JT1VUIFBBQ0tFVF9JTkZPICAqcFBhY2tldEluZm8sCi0JT1VUIFBVQ0hBUgkJICpwU3JjQnVmVkEsCi0JT1VUCVVJTlQJCSAqcFNyY0J1Zkxlbik7Cit2b2lkIFJUTVBfUXVlcnlQYWNrZXRJbmZvKHZvaWQgKnBQYWNrZXQsCisJCQkgIHN0cnVjdCBydF9wYWNrZXRfaW5mbyAqcFBhY2tldEluZm8sCisJCQkgIHU4ICoqIHBTcmNCdWZWQSwgdTMyICogcFNyY0J1Zkxlbik7CiAKLXZvaWQgUlRNUF9RdWVyeU5leHRQYWNrZXRJbmZvKAotCUlOICBQTkRJU19QQUNLRVQgKnBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOwordm9pZCBSVE1QX1F1ZXJ5TmV4dFBhY2tldEluZm8odm9pZCAqKiBwcFBhY2tldCwKKwkJCSAgICAgIHN0cnVjdCBydF9wYWNrZXRfaW5mbyAqcFBhY2tldEluZm8sCisJCQkgICAgICB1OCAqKiBwU3JjQnVmVkEsIHUzMiAqIHBTcmNCdWZMZW4pOwogCitCT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsayk7CiAKLUJPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSyAqcFR4QmxrKTsKK3N0cnVjdCBydF9ydG1wX3NnX2xpc3QgKgorcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQodm9pZCAqcFBhY2tldCwgc3RydWN0IHJ0X3J0bXBfc2dfbGlzdCAqc2cpOwogCit2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHZvaWQgKnBQYWNrZXQpOwogCi1QUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUCi1ydF9nZXRfc2dfbGlzdF9mcm9tX3BhY2tldChQTkRJU19QQUNLRVQgcFBhY2tldCwgUlRNUF9TQ0FUVEVSX0dBVEhFUl9MSVNUICpzZyk7Cit1MzIgQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KTsKIAorc3RydWN0IG5ldF9kZXZpY2UgKmdldF9uZXRkZXZfZnJvbV9ic3NpZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEZyb21XaGljaEJTU0lEKTsKIAotIHZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKK3ZvaWQgKmR1cGxpY2F0ZV9wa3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgdTggKnBIZWFkZXI4MDJfMywKKwkJCSAgIHUzMiBIZHJMZW4sCisJCQkgICB1OCAqcERhdGEsCisJCQkgICB1bnNpZ25lZCBsb25nIERhdGFTaXplLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKK3ZvaWQgKmR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCSB2b2lkICpwT2xkUGt0KTsKIAotVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Cit2b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgIHN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIE5vdzMyKTsKIAotUE5FVF9ERVYgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwordm9pZCBCQU9yaVNlc3Npb25TZXRVcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCSAgICAgICB1OCBUSUQsCisJCSAgICAgICB1MTYgVGltZU91dCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgRGVsYXlUaW1lLCBJTiBCT09MRUFOIGlzRm9yY2VkKTsKIAotCi1QTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1QTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwT2xkUGt0KTsKLQotdm9pZCBiYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUEJBX1JFQ19FTlRSWQlwQkFFbnRyeSwKLQlJTiBVTE9ORwkJCU5vdzMyKTsKLQotCi1WT0lEIEJBT3JpU2Vzc2lvblNldFVwKAotCQkJSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQlJTiBNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQkJCUlOIFVDSEFSCQkJVElELAotCQkJSU4gVVNIT1JUCQkJVGltZU91dCwKLQkJCUlOIFVMT05HCQkJRGVsYXlUaW1lLAotCQkJSU4gQk9PTEVBTgkJaXNGb3JjZWQpOwotCi1WT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAotCUlOIE9VVAlQUlRNUF9BREFQVEVSIHBBZCwKLQlJTgkJVUNIQVIgV2NpZCk7Cit2b2lkIEJBU2Vzc2lvblRlYXJEb3duQUxMKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggV2NpZCk7CiAKIEJPT0xFQU4gT1NfTmVlZF9DbG9uZV9QYWNrZXQodm9pZCk7CiAKK3ZvaWQgYnVpbGRfdHhfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgIHU4ICpwRnJhbWUsIHVuc2lnbmVkIGxvbmcgRnJhbWVMZW4pOwogCi1WT0lEIGJ1aWxkX3R4X3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJcEZyYW1lLAotCUlOCVVMT05HCUZyYW1lTGVuKTsKK3ZvaWQgQkFPcmlTZXNzaW9uVGVhckRvd24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBXY2lkLAorCQkJICB1OCBUSUQsCisJCQkgIElOIEJPT0xFQU4gYlBhc3NpdmUsIElOIEJPT0xFQU4gYkZvcmNlU2VuZCk7CiAKK3ZvaWQgQkFSZWNTZXNzaW9uVGVhckRvd24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBXY2lkLCB1OCBUSUQsIElOIEJPT0xFQU4gYlBhc3NpdmUpOwogCi1WT0lEIEJBT3JpU2Vzc2lvblRlYXJEb3duKAotCUlOIE9VVAlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVUNIQVIJCQlXY2lkLAotCUlOCQlVQ0hBUgkJCVRJRCwKLQlJTgkJQk9PTEVBTgkJCWJQYXNzaXZlLAotCUlOCQlCT09MRUFOCQkJYkZvcmNlU2VuZCk7CitCT09MRUFOIGJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGludCBudW0pOwordm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKLQlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCQkJV2NpZCwKLQlJTgkJVUNIQVIJCQlUSUQsCi0JSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSk7CitjaGFyICpyc3RydG9rKGNoYXIgKnMsIElOIGNvbnN0IGNoYXIgKmN0KTsKIAotQk9PTEVBTiBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX2luaXQoUFJUTVBfQURBUFRFUiBwQWQsIGludCBudW0pOwotdm9pZCBiYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UoUFJUTVBfQURBUFRFUiBwQWQpOworLyovLy8vLy8vLyBjb21tb24gaW9jdGwgZnVuY3Rpb25zIC8vLy8vLy8vLy8gKi8KK2ludCBTZXRDb21tb25IVChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1CT09MRUFOIHJ0c3RybWFjdG9oZXgoCi0JSU4gY2hhciAqczEsCi0JSU4gY2hhciAqczIpOworaW50IFdwYUNoZWNrRWFwQ29kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1OCAqcEZyYW1lLCB1MTYgRnJhbWVMZW4sIHUxNiBPZmZTZXQpOwogCi1CT09MRUFOIHJ0c3RyY2FzZWNtcCgKLQlJTiBjaGFyICpzMSwKLQlJTiBjaGFyICpzMik7Cit2b2lkIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICBJTiBCT09MRUFOIGJVbmljYXN0KTsKIAotY2hhciAqcnRzdHJzdHJ1bmNhc2VjbXAoCi0JSU4gY2hhciAqczEsCi0JSU4gY2hhciAqczIpOworaW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLWNoYXIgICAgKnJ0c3Ryc3RyKAotCUlOCWNvbnN0IGNoYXIgKiBzMSwKLQlJTgljb25zdCBjaGFyICogczIpOworQk9PTEVBTiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGFyZ2MpOwogCi1jaGFyICpyc3RydG9rKAotCUlOIGNoYXIgKiBzLAotCUlOIGNvbnN0IGNoYXIgKiBjdCk7CisvKiBBTVBEVSBwYWNrZXQgaW5kaWNhdGlvbiAqLwordm9pZCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLWludCBydGluZXRfYXRvbigKLQljb25zdCBjaGFyICpjcCwKLQl1bnNpZ25lZCBpbnQgKmFkZHIpOworLyogQU1TRFUgcGFja2V0IGluZGljYXRpb24gKi8KK3ZvaWQgSW5kaWNhdGVfQU1TRFVfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCi0vLy8vLy8vLy8vIGNvbW1vbiBpb2N0bCBmdW5jdGlvbnMgLy8vLy8vLy8vLwotSU5UIFNldF9Ecml2ZXJWZXJzaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKKy8qIE5vcm1hbCBsZWdhY3kgUnggcGFja2V0IGluZGljYXRpb24gKi8KK3ZvaWQgSW5kaWNhdGVfTGVnYWN5X1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLUlOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Cit2b2lkIEluZGljYXRlX0VBUE9MX1BhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwordm9pZCB1cGRhdGVfb3NfcGFja2V0X2luZm8oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLUlOVCBTZXRfV2lyZWxlc3NNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK3ZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLAorCQkJCSB1OCAqcEhlYWRlcjgwMl8zLAorCQkJCSB1OCBGcm9tV2hpY2hCU1NJRCk7CiAKLUlOVCBTZXRfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfU2hvcnRTbG90X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9UeFBvd2VyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UIFNldF9CR1Byb3RlY3Rpb25fUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQVUNIQVIJCQlhcmcpOwotCi1JTlQgU2V0X1R4UHJlYW1ibGVfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQVUNIQVIJCQlhcmcpOwotCi1JTlQgU2V0X1JUU1RocmVzaG9sZF9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCWFyZyk7Ci0KLUlOVCBTZXRfVHhCdXJzdF9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCWFyZyk7Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi1JTlQJU2V0X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBVQ0hBUgkJCWFyZyk7Ci0jZW5kaWYKLQotSU5UCVNldF9JRUVFODAyMTFIX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotI2lmZGVmIERCRwotSU5UCVNldF9EZWJ1Z19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0jZW5kaWYKLQotSU5UCVNob3dfRGVzY0luZm9fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0JBU2V0dXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0JBRGVjbGluZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFPcmlUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRCd19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdFN0YmNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0SHRjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9IdExpbmtBZGFwdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRBbXNkdV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNaW1vUHNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi0KLUlOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldF9Gb3JjZUdGX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UCVNldENvbW1vbkhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotSU5UCVNldF9TZW5kUFNNUEFjdGlvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNSU1PUFNtb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotCi1JTlQJU2V0X0h0VHhCQVNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotCi1JTlQJICAgIFdwYUNoZWNrRWFwQ29kZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIAlwQWQsCi0JSU4gIFBVQ0hBUgkJCQlwRnJhbWUsCi0JSU4gIFVTSE9SVAkJCQlGcmFtZUxlbiwKLQlJTiAgVVNIT1JUCQkJCU9mZlNldCk7Ci0KLVZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotICAgIElOICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0KTsKLQotaW50IHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKAotCUlOICBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLUJPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUJPT0xFQU4JCQlhcmdjKTsKLQotLy8gQU1QRFUgcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLS8vIEFNU0RVIHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0vLyBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotdm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLXZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSk7Ci0KLS8vIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIKKy8qIHJlbW92ZSBMTEMgYW5kIGdldCA4MDJfMyBIZWFkZXIgKi8KICNkZWZpbmUgIFJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMoX3BSeEJsaywgX3BIZWFkZXI4MDJfMykJXAogewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBVQ0hBUiBfcFJlbW92ZWRMTENTTkFQID0gTlVMTCwgX3BEQSwgX3BTQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdTggKl9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMLCAqX3BEQSwgKl9wU0E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJaWYgKFJYX0JMS19URVNUX0ZMQUcoX3BSeEJsaywgZlJYX01FU0gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlfcERBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCV9wU0EgPSAoUFVDSEFSKV9wUnhCbGstPnBIZWFkZXIgKyBzaXplb2YoSEVBREVSXzgwMl8xMSk7ICAgICAgICAgICAgICAgIFwKKwkJX3BTQSA9ICh1OCAqKV9wUnhCbGstPnBIZWFkZXIgKyBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOyAgICAgICAgICAgICAgICBcCiAJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NTY1LDEzMyArMzc0MiwxMjIgQEAKIAkJX3BSeEJsay0+RGF0YVNpemUsIF9wUmVtb3ZlZExMQ1NOQVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi1WT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK3ZvaWQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICB2b2lkICpwUGFja2V0LAorCQkJCQkgIHU4IEZyb21XaGljaEJTU0lEKTsKIAogI2RlZmluZSBBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUylcCiAJCQlTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpOwotCQkJLy9hbm5vdW5jZV84MDJfM19wYWNrZXQoX3BBZCwgX3BQYWNrZXQpOworCQkJLyphbm5vdW5jZV84MDJfM19wYWNrZXQoX3BBZCwgX3BQYWNrZXQpOyAqLwogCi1QTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwordm9pZCAqRHVwbGljYXRlUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdm9pZCAqcFBhY2tldCwgdTggRnJvbVdoaWNoQlNTSUQpOwogCit2b2lkICpDbG9uZVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdm9pZCAqcFBhY2tldCwKKwkJCSB1OCAqcERhdGEsIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUpOwogCi1QTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSk7CisvKiBOb3JtYWwsIEFNUERVIG9yIEFNU0RVICovCit2b2lkIENtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpOwogCit2b2lkIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICAgICBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGssIHU4IEZyb21XaGljaEJTU0lEKTsKIAotLy8gTm9ybWFsLCBBTVBEVSBvciBBTVNEVQotVk9JRCBDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKK3ZvaWQgVXBkYXRlX1Jzc2lfU2FtcGxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF9yc3NpX3NhbXBsZSAqcFJzc2ksIHN0cnVjdCBydF9yeHdpICogcFJ4V0kpOwogCi1WT0lEIENtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwordm9pZCAqR2V0UGFja2V0RnJvbVJ4UmluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIE9VVCBQUlQyOFhYX1JYRF9TVFJVQyBwU2F2ZVJ4RCwKKwkJCQkgT1VUIEJPT0xFQU4gKiBwYlJlc2NoZWR1bGUsCisJCQkJIElOIHUzMiAqIHBSeFBlbmRpbmcpOwogCi1WT0lEIFVwZGF0ZV9Sc3NpX1NhbXBsZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBSU1NJX1NBTVBMRQkJKnBSc3NpLAotCUlOIFBSWFdJX1NUUlVDCQlwUnhXSSk7Cit2b2lkICpSVE1QRGVGcmFnbWVudERhdGFGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsayk7CiAKLVBORElTX1BBQ0tFVCBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogZW51bSB7Ci0JRElEbXNnX2xueGluZF93bGFuc25pZmZybQkJPSAweDAwMDAwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUJPSAweDAwMDEwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZQk9IDB4MDAwMjAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsCT0gMHgwMDAzMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kJCT0gMHgwMDA0MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxCQk9IDB4MDAwNTAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwJPSAweDAwMDYwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UJCT0gMHgwMDA3MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUJCT0gMHgwMDA4MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHgJCT0gMHgwMDA5MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbgk9IDB4MDAwQTAwNDQKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtID0gMHgwMDAwMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lID0gMHgwMDAxMDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX21hY3RpbWUgPSAweDAwMDIwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fY2hhbm5lbCA9IDB4MDAwMzAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yc3NpID0gMHgwMDA0MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxID0gMHgwMDA1MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbCA9IDB4MDAwNjAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9ub2lzZSA9IDB4MDAwNzAwNDQsCisJRElEbXNnX2xueGluZF93bGFuc25pZmZybV9yYXRlID0gMHgwMDA4MDA0NCwKKwlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHggPSAweDAwMDkwMDQ0LAorCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuID0gMHgwMDBBMDA0NAogfTsKIGVudW0gewotCVA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWUJPSAweDAwCisJUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZSA9IDB4MDAKIH07CiBlbnVtIHsKLQlQODAyMTFFTlVNX3RydXRoX2ZhbHNlCQkJPSAweDAwLAotCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZQkJCT0gMHgwMQorCVA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UgPSAweDAwLAorCVA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSA9IDB4MDEKIH07CiAKIC8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiBkaWQ7Ci0gICAgICAgIFVJTlQxNiBzdGF0dXM7Ci0gICAgICAgIFVJTlQxNiBsZW47Ci0gICAgICAgIFVJTlQzMiBkYXRhOwotfSBwODAyMTFpdGVtX3VpbnQzMl90Oworc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIHsKKwl1MzIgZGlkOworCXUxNiBzdGF0dXM7CisJdTE2IGxlbjsKKwl1MzIgZGF0YTsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyIG1zZ2NvZGU7Ci0gICAgICAgIFVJTlQzMiBtc2dsZW47CitzdHJ1Y3QgcnRfd2xhbl9uZ19wcmlzbTJfaGVhZGVyIHsKKwl1MzIgbXNnY29kZTsKKwl1MzIgbXNnbGVuOwogI2RlZmluZSBXTEFOX0RFVk5BTUVMRU5fTUFYIDE2Ci0gICAgICAgIFVJTlQ4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaG9zdHRpbWU7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgbWFjdGltZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBjaGFubmVsOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJzc2k7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc3E7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3Qgc2lnbmFsOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHJhdGU7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgaXN0eDsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBmcm1sZW47Ci19IHdsYW5fbmdfcHJpc20yX2hlYWRlcjsKKwl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOworCXN0cnVjdCBydF9wODAyMTFpdGVtX3VpbnQzMiBob3N0dGltZTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgbWFjdGltZTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgY2hhbm5lbDsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgcnNzaTsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgc3E7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIHNpZ25hbDsKKwlzdHJ1Y3QgcnRfcDgwMjExaXRlbV91aW50MzIgbm9pc2U7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIHJhdGU7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIGlzdHg7CisJc3RydWN0IHJ0X3A4MDIxMWl0ZW1fdWludDMyIGZybWxlbjsKK307CiAKIC8qIFRoZSByYWRpbyBjYXB0dXJlIGhlYWRlciBwcmVjZWRlcyB0aGUgODAyLjExIGhlYWRlci4gKi8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB7Ci0gICAgVUlOVDgJaXRfdmVyc2lvbjsJLyogVmVyc2lvbiAwLiBPbmx5IGluY3JlYXNlcworc3RydWN0IFBBQ0tFRCBydF9pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHsKKwl1OCBpdF92ZXJzaW9uOwkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCiAJCQkJICogZm9yIGRyYXN0aWMgY2hhbmdlcywKIAkJCQkgKiBpbnRyb2R1Y3Rpb24gb2YgY29tcGF0aWJsZQogCQkJCSAqIG5ldyBmaWVsZHMgZG9lcyBub3QgY291bnQuCiAJCQkJICovCi0gICAgVUlOVDgJaXRfcGFkOwotICAgIFVJTlQxNiAgICAgaXRfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKKwl1OCBpdF9wYWQ7CisJdTE2IGl0X2xlbjsJCS8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKIAkJCQkgKiBoZWFkZXIgaW4gYnl0ZXMsIGluY2x1ZGluZwogCQkJCSAqIGl0X3ZlcnNpb24sIGl0X3BhZCwKIAkJCQkgKiBpdF9sZW4sIGFuZCBkYXRhIGZpZWxkcy4KIAkJCQkgKi8KLSAgICBVSU5UMzIgICBpdF9wcmVzZW50OwkvKiBBIGJpdG1hcCB0ZWxsaW5nIHdoaWNoCi0JCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQotCQkJCQkgKiAoMHg4MDAwMDAwMCkgdG8gZXh0ZW5kIHRoZQotCQkJCQkgKiBiaXRtYXAgYnkgYW5vdGhlciAzMiBiaXRzLgotCQkJCQkgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgYXJlIG1hZGUKLQkJCQkJICogYnkgc2V0dGluZyBiaXQgMzEuCi0JCQkJCSAqLwotfWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgOworCXUzMiBpdF9wcmVzZW50OwkvKiBBIGJpdG1hcCB0ZWxsaW5nIHdoaWNoCisJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCisJCQkJICogKDB4ODAwMDAwMDApIHRvIGV4dGVuZCB0aGUKKwkJCQkgKiBiaXRtYXAgYnkgYW5vdGhlciAzMiBiaXRzLgorCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQorCQkJCSAqIGJ5IHNldHRpbmcgYml0IDMxLgorCQkJCSAqLworfTsKIAogZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSB7Ci0gICAgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMKKwlJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCisJSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTID0gMSwKKwlJRUVFODAyMTFfUkFESU9UQVBfUkFURSA9IDIsCisJSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwgPSAzLAorCUlFRUU4MDIxMV9SQURJT1RBUF9GSFNTID0gNCwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCA9IDUsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlROT0lTRSA9IDYsCisJSUVFRTgwMjExX1JBRElPVEFQX0xPQ0tfUVVBTElUWSA9IDcsCisJSUVFRTgwMjExX1JBRElPVEFQX1RYX0FUVEVOVUFUSU9OID0gOCwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT04gPSA5LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVIgPSAxMCwKKwlJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQSA9IDExLAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUwgPSAxMiwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgPSAxMwogfTsKIAogI2RlZmluZSBXTEFOX1JBRElPVEFQX1BSRVNFTlQgKAkJCVwKQEAgLTU3MDAsNzM3ICszODY2LDQ5MSBAQAogCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9SQVRFKSAgfCAJXAogCSAwKQogCi10eXBlZGVmIHN0cnVjdCBfd2xhbl9yYWRpb3RhcF9oZWFkZXIgewotCWllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgd3RfaWhkcjsKLQlJTlQ2NCB3dF90c2Z0OwotCVVJTlQ4IHd0X2ZsYWdzOwotCVVJTlQ4IHd0X3JhdGU7Ci19IHdsYW5fcmFkaW90YXBfaGVhZGVyOworc3RydWN0IHJ0X3dsYW5fcmFkaW90YXBfaGVhZGVyIHsKKwlzdHJ1Y3QgcnRfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB3dF9paGRyOworCWxvbmcgbG9uZyB3dF90c2Z0OworCXU4IHd0X2ZsYWdzOworCXU4IHd0X3JhdGU7Cit9OwogLyogRGVmaW5pdGlvbiBmcm9tIG1hZHdpZmkgKi8KIAotdm9pZCBzZW5kX21vbml0b3JfcGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKTsKK3ZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspOwogCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKLXN0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAotICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3ZvaWQgUlRNUFNldERlc2lyZWRSYXRlcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwgbG9uZyBSYXRlcyk7CiAKLVZPSUQgICAgUlRNUFNldERlc2lyZWRSYXRlcygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBMT05HICAgICAgICAgICAgUmF0ZXMpOworaW50IFNldF9GaXhlZFR4TW9kZV9Qcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqYXJnKTsKIAotSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7CitCT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjayhJTiB2b2lkICpfZGV2X3ApOwogCi1zdGF0aWMgaW5saW5lIGNoYXIqIEdldFBoeU1vZGUoCi0JaW50IE1vZGUpCi17Ci0Jc3dpdGNoKE1vZGUpCi0JewotCQljYXNlIE1PREVfQ0NLOgotCQkJcmV0dXJuICJDQ0siOwordm9pZCBSVDI4WFhETUFEaXNhYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLQkJY2FzZSBNT0RFX09GRE06Ci0JCQlyZXR1cm4gIk9GRE0iOwotCQljYXNlIE1PREVfSFRNSVg6Ci0JCQlyZXR1cm4gIkhUTUlYIjsKK3ZvaWQgUlQyOFhYRE1BRW5hYmxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLQkJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKLQkJCXJldHVybiAiR1JFRU4iOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJOL0EiOwotCX0KLX0KK3ZvaWQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgaW50IGFwaWR4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgQmVhY29uTGVuLCB1bnNpZ25lZCBsb25nIFVwZGF0ZVBvcyk7CiAKK2ludCBydDI4eHhfaW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCWNoYXIgKnBEZWZhdWx0TWFjLCBjaGFyICpwSG9zdE5hbWUpOwogCi1zdGF0aWMgaW5saW5lIGNoYXIqIEdldEJXKAotCWludCBCVykKLXsKLQlzd2l0Y2goQlcpCi0JewotCQljYXNlIEJXXzEwOgotCQkJcmV0dXJuICIxME0iOworaW50IFJ0bXBOZXRUYXNrSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi0JCWNhc2UgQldfMjA6Ci0JCQlyZXR1cm4gIjIwTSI7Ci0JCWNhc2UgQldfNDA6Ci0JCQlyZXR1cm4gIjQwTSI7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIk4vQSI7Ci0JfQotfQordm9pZCBSdG1wTmV0VGFza0V4aXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAoraW50IFJ0bXBNZ210VGFza0luaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDI4eHhUaHJlYWRUZXJtaW5hdGUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi1CT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKLQlJTiB2b2lkICpfZGV2X3ApOwotCi1CT09MRUFOIFJUMjhYWE5ldERldkluaXQoCi0JSU4gdm9pZCAJCQkJKl9kZXZfcCwKLQlJTiBzdHJ1Y3QgIG5ldF9kZXZpY2UJKm5ldF9kZXYsCi0JSU4gUlRNUF9BREFQVEVSIAkJKnBBZCk7Ci0KLUJPT0xFQU4gUlQyOFhYUHJvYmVQb3N0Q29uZmlnKAotCUlOIHZvaWQgCQkJCSpfZGV2X3AsCi0JSU4gUlRNUF9BREFQVEVSIAkJKnBBZCwKLQlJTiBJTlQzMgkJCQlhcmdjKTsKLQotVk9JRCBSVDI4WFhETUFEaXNhYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpOwotCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIgCQkqcEFkKTsKLQotVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAotCUlOIFJUTVBfQURBUFRFUiAqIHBBZCwKLQlJTiBJTlQgYXBpZHgsCi0JSU4gVUxPTkcgQmVhY29uTGVuLAotCUlOIFVMT05HIFVwZGF0ZVBvcyk7Ci0KLUlOVCBydDI4eHhfc3RhX2lvY3RsKAotCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAotCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAotCUlOCUlOVAkJCWNtZCk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAotCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCi0JSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKLQotCi12b2lkIGtpbGxfdGhyZWFkX3Rhc2soUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSdG1wTWdtdFRhc2tFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKIHZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLSNpZmRlZiBSVDI4NjAKLS8vCi0vLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfMjg2MC5jCi0vLwotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK3N0cnVjdCBuZXRfZGV2aWNlICpSdG1wUGh5TmV0RGV2SW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfcnRtcF9vc19uZXRkZXZfb3BfaG9vayAqcE5ldEhvb2spOwogCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOworQk9PTEVBTiBSdG1wUGh5TmV0RGV2RXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKIAotVVNIT1JUIFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYW1lTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CitpbnQgUnRtcFJhRGV2Q3RybEluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBSVE1QX0lORl9UWVBFIGluZlR5cGUpOwogCi1VU0hPUlQJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlmcmFnTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CitCT09MRUFOIFJ0bXBSYURldkN0cmxFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVVTSE9SVCBSdG1wUENJX1dyaXRlU3ViVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7CisjaWZkZWYgUlRNUF9NQUNfUENJCisvKiAqLworLyogRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhX3BjaS5jICovCisvKiAqLwordTE2IFJ0bXBQQ0lfV3JpdGVUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkgICAgICAgSU4gQk9PTEVBTiBiSXNMYXN0LCB1MTYgKiBGcmVlTnVtYmVyKTsKIAotVk9JRCBSdG1wUENJX0ZpbmFsV3JpdGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVVNIT1JUCQkJdG90YWxNUERVU2l6ZSwKLQlJTglVU0hPUlQJCQlGaXJzdFR4SWR4KTsKK3UxNiBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgICBJTiBCT09MRUFOIGJJc0xhc3QsCisJCQkJICAgICB1MTYgKiBGcmVlTnVtYmVyKTsKIAotVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlMYXN0VHhJZHgpOwordTE2IFJ0bXBQQ0lfV3JpdGVNdWx0aVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgIHU4IGZyYW1lTnVtLCB1MTYgKiBGcmVlTnVtYmVyKTsKIAotVk9JRCBSdG1wUENJRGF0YUtpY2tPdXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCVF1ZUlkeCk7Cit1MTYgUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgdTggZnJhZ051bSwgdTE2ICogRnJlZU51bWJlcik7CiAKK3UxNiBSdG1wUENJX1dyaXRlU3ViVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICBJTiBCT09MRUFOIGJJc0xhc3QsIHUxNiAqIEZyZWVOdW1iZXIpOwogCi1pbnQgUnRtcFBDSU1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTiBVQ0hBUiAJCQlRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKLQlJTiBVSU5UIAkJCVNyY0J1Zkxlbik7Cit2b2lkIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgdTE2IHRvdGFsTVBEVVNpemUsCisJCQkJICB1MTYgRmlyc3RUeElkeCk7CiAKK3ZvaWQgUnRtcFBDSURhdGFMYXN0VHhJZHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBRdWVJZHgsIHUxNiBMYXN0VHhJZHgpOwogCi1ORElTX1NUQVRVUyBSVE1QQ2hlY2tSeEVycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQSEVBREVSXzgwMl8xMSAgcEhlYWRlciwKLQlJTglQUlhXSV9TVFJVQwlwUnhXSSwKLQlJTiAgUFJUMjhYWF9SWERfU1RSVUMgICAgICBwUnhEKTsKK3ZvaWQgUnRtcFBDSURhdGFLaWNrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCXN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywgdTggUXVlSWR4KTsKIAotVk9JRCBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSdG1wUENJTWdtdEtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggUXVlSWR4LAorCQkgICAgICAgdm9pZCAqcFBhY2tldCwKKwkJICAgICAgIHU4ICpwU3JjQnVmVkEsIHUzMiBTcmNCdWZMZW4pOwogCi1WT0lEIFJUTVBGaW5kSG9zdFBDSURldigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRNUENoZWNrUnhFcnJvcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciwKKwkJCSAgICAgc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSwgSU4gUFJUMjhYWF9SWERfU1RSVUMgcFJ4RCk7CiAKLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgIFVDSEFSCQlMZXZlbCk7CitCT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09mZihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBMZXZlbCwgdTE2IFRidHROdW1Ub05leHRXYWtlVXApOwogCi1WT0lEIFJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIAlVU0hPUlQJCU1heCk7CitCT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggTGV2ZWwpOwogCi1WT0lEIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAotCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCk7Cit2b2lkIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotQk9PTEVBTiBSVDI4eHhQY2lBc2ljUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgTGV2ZWwpOwordm9pZCBSVE1QRmluZEhvc3RQQ0lEZXYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgCSBMZXZlbCk7Cit2b2lkIFJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBMZXZlbCk7CiAKLVZPSUQgUlQyOHh4UGNpU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOwordm9pZCBSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUxNiBNYXgpOwogCi1WT0lEIFBzUG9sbFdha2VFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Cit2b2lkIFJUTVBydDN4U2V0UENJZVBvd2VyTGlua0N0cmwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCAgUmFkaW9PbkV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKK3ZvaWQgUHNQb2xsV2FrZUV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK3ZvaWQgUmFkaW9PbkV4ZWModm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpOwogCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09GRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLyogUlQyODYwICovCit2b2lkIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYkZyb21UeCk7CiAKLVZPSUQgQXNpY1R1cm5PZmZSRkNsaygKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTglVQ0hBUiAgICAgICAgICAgQ2hhbm5lbCk7Cit2b2lkIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKIAotVk9JRCBBc2ljVHVybk9uUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCk7Cit2b2lkIFJUMjh4eFBjaU1sbWVSYWRpb09uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTIFJUMzB4eFdyaXRlUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJlZ0lELAotCUlOCVVDSEFSCQkJVmFsdWUpOwordm9pZCBSVDI4eHhQY2lNbG1lUmFkaW9PRkYoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotTlRTVEFUVVMgUlQzMHh4UmVhZFJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlSZWdJRCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpOworI2lmZGVmIFJUTVBfTUFDX1VTQgorLyogKi8KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZSBpbiBydHVzYl9idWxrLmMgKi8KKy8qICovCit2b2lkIFJUVVNCSW5pdFR4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBUeENvbnRleHQsCisJCSAgICAgdTggQnVsa091dFBpcGVJZCwgSU4gdXNiX2NvbXBsZXRlX3QgRnVuYyk7CiAKLVVDSEFSIGVGdXNlUmVhZFJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpOwordm9pZCBSVFVTQkluaXRIVFR4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcFR4Q29udGV4dCwKKwkJICAgICAgIHU4IEJ1bGtPdXRQaXBlSWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIEJ1bGtPdXRTaXplLCBJTiB1c2JfY29tcGxldGVfdCBGdW5jKTsKIAotVk9JRCBlRnVzZVJlYWRQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgCUlOCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLSAgCUlOCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0gIAlPVVQJUFVTSE9SVCBscE91dEJ1ZmZlciwKLSAgCUlOCVVMT05HIG5PdXRCdWZmZXJTaXplCi0pOwordm9pZCBSVFVTQkluaXRSeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dCk7CiAKLU5UU1RBVFVTIGVGdXNlUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCUxlbmd0aCk7Cit2b2lkIFJUVVNCQ2xlYW5VcERhdGFCdWxrT3V0UXVldWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBlRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKTsKK3ZvaWQgUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKTsKK3ZvaWQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggQnVsa091dFBpcGVJZCwgdTggSW5kZXgpOwogCi1WT0lEIGVGdXNlV3JpdGVQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLQlVTE9ORyBuSW5CdWZmZXJTaXplLAotICAJUFVDSEFSIGxwT3V0QnVmZmVyLAotICAJVUxPTkcgbk91dEJ1ZmZlclNpemUKLSk7Cit2b2lkIFJUVVNCQnVsa091dE51bGxGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1OVFNUQVRVUyBlRnVzZVdyaXRlKAotICAgCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpOwordm9pZCBSVFVTQkJ1bGtPdXRSVFNGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1JTlQgc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvYygKLSAgIAlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotSU5UIHNldF9lRnVzZWR1bXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLUlOVCBzZXRfZUZ1c2VMb2FkRnJvbUJpbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Cit2b2lkIFJUVVNCQnVsa091dE1MTUVQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBJbmRleCk7CiAKLU5UU1RBVFVTIGVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKTsKK3ZvaWQgUlRVU0JCdWxrT3V0UHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKTsKK3ZvaWQgUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSIAlwQWQpOwordm9pZCBSVFVTQktpY2tCdWxrT3V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQzMHh4TG9hZFJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUiAJcEFkKTsKK3ZvaWQgUlRVU0JCdWxrUmVjZWl2ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIgCXBBZCk7Cit2b2lkIERvQnVsa0luKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLSNpZmRlZiBSVDI4NzAKLS8vCi0vLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfYnVsay5jCi0vLwotVk9JRAlSVFVTQkluaXRUeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYX0NPTlRFWFQJCXBUeENvbnRleHQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCXVzYl9jb21wbGV0ZV90CUZ1bmMpOwordm9pZCBSVFVTQkluaXRSeERlc2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dCk7CiAKLVZPSUQJUlRVU0JJbml0SFRUeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JVUxPTkcJCQlCdWxrT3V0U2l6ZSwKLQlJTgl1c2JfY29tcGxldGVfdAlGdW5jKTsKK3ZvaWQgUlRVU0JCdWxrUnhIYW5kbGUoSU4gdW5zaWduZWQgbG9uZyBkYXRhKTsKIAotVk9JRCBSVFVTQkNsZWFuVXBEYXRhQnVsa091dFF1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKKy8qICovCisvKiBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfaW8uYyAqLworLyogKi8KK2ludCBSVFVTQk11bHRpUmVhZChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQl1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpOwogCi1WT0lEIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCTXVsdGlXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKTsKIAotVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTglVQ0hBUgkJCUluZGV4KTsKK2ludCBSVFVTQk11bHRpV3JpdGVfT25lQnl0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSk7CiAKLVZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQlJlYWRCQlBSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBJZCwgdTggKnBWYWx1ZSk7CiAKLVZPSUQgUlRVU0JCdWxrT3V0UlRTRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCV3JpdGVCQlBSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggSWQsIHU4IFZhbHVlKTsKIAotVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCV3JpdGVSRlJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTMyIFZhbHVlKTsKIAotVk9JRCBSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKK2ludCBSVFVTQl9WZW5kb3JSZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTMyIFRyYW5zZmVyRmxhZ3MsCisJCQkgICAgIHU4IFJlc2VydmVkQml0cywKKwkJCSAgICAgdTggUmVxdWVzdCwKKwkJCSAgICAgdTE2IFZhbHVlLAorCQkJICAgICB1MTYgSW5kZXgsCisJCQkgICAgIHZvaWQgKlRyYW5zZmVyQnVmZmVyLAorCQkJICAgICB1MzIgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOwogCi1WT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCk7CitpbnQgUlRVU0JSZWFkRUVQUk9NKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSB1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpOwogCi1WT0lEIFJUVVNCQnVsa091dFBzUG9sbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JXcml0ZUVFUFJPTShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCk7CiAKLVZPSUQgUlRVU0JDbGVhblVwTUxNRUJ1bGtPdXRRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUVVNCUHV0VG9TbGVlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUVVNCS2lja0J1bGtPdXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQpOworaW50IFJUVVNCV2FrZVVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQJUlRVU0JCdWxrUmVjZWl2ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Cit2b2lkIFJUVVNCSW5pdGlhbGl6ZUNtZFEoc3RydWN0IHJ0X2NtZHEgKmNtZHEpOwogCi1WT0lEIERvQnVsa0luKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKK2ludCBSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgIElOIE5ESVNfT0lEIE9pZCwKKwkJCQkgICAgSU4gQk9PTEVBTiBTZXRJbmZvcm1hdGlvbiwKKwkJCQkgICAgdm9pZCAqcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICB1MzIgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwogCi1WT0lEIFJUVVNCSW5pdFJ4RGVzYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFJYX0NPTlRFWFQJCXBSeENvbnRleHQpOworaW50IFJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgSU4gTkRJU19PSUQgT2lkLAorCQkJCSAgICB2b2lkICpwSW5mb3JtYXRpb25CdWZmZXIsCisJCQkJICAgIHUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CiAKLS8vCi0vLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfaW8uYwotLy8KLU5UU1RBVFVTIFJUVVNCTXVsdGlSZWFkKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlPVVQJUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKTsKK3ZvaWQgUlRVU0JEZXF1ZXVlQ21kKHN0cnVjdCBydF9jbWRxICpjbWRxLCBzdHJ1Y3QgcnRfY21kcWVsbXQgKiAqIHBjbWRxZWxtdCk7CiAKLU5UU1RBVFVTIFJUVVNCTXVsdGlXcml0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKTsKK2ludCBSVFVTQkNtZFRocmVhZChJTiB2b2lkICpDb250ZXh0KTsKIAotTlRTVEFUVVMgUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhKTsKK3ZvaWQgUlRVU0JCc3NCZWFjb25FeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTIFJUVVNCUmVhZEJCUFJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSWQsCi0JSU4JUFVDSEFSCQkJcFZhbHVlKTsKK3ZvaWQgUlRVU0JCc3NCZWFjb25TdG9wKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTIFJUVVNCV3JpdGVCQlBSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUlkLAotCUlOCVVDSEFSCQkJVmFsdWUpOwotCi1OVFNUQVRVUyBSVFVTQldyaXRlUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVSU5UMzIJCQlWYWx1ZSk7Ci0KLU5UU1RBVFVTIFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVDMyCQkJVHJhbnNmZXJGbGFncywKLQlJTglVQ0hBUgkJCVJlc2VydmVkQml0cywKLQlJTglVQ0hBUgkJCVJlcXVlc3QsCi0JSU4JVVNIT1JUCQkJVmFsdWUsCi0JSU4JVVNIT1JUCQkJSW5kZXgsCi0JSU4JUFZPSUQJCQlUcmFuc2ZlckJ1ZmZlciwKLQlJTglVSU5UMzIJCQlUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7Ci0KLU5UU1RBVFVTIFJUVVNCUmVhZEVFUFJPTSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCk7Ci0KLU5UU1RBVFVTIFJUVVNCV3JpdGVFRVBST00oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCk7Ci0KLVZPSUQgUlRVU0JQdXRUb1NsZWVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotTlRTVEFUVVMgUlRVU0JXYWtlVXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUVVNCSW5pdGlhbGl6ZUNtZFEoCi0JSU4JUENtZFEJY21kcSk7Ci0KLU5ESVNfU1RBVFVTCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU5ESVNfT0lECQlPaWQsCi0JSU4JQk9PTEVBTgkJCVNldEluZm9ybWF0aW9uLAotCUlOCVBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAotCUlOCVVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKLQotTkRJU19TVEFUVVMgUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gTkRJU19PSUQJCQlPaWQsCi0JSU4gUFZPSUQJCQlwSW5mb3JtYXRpb25CdWZmZXIsCi0JSU4gVUlOVDMyCQkJSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwotCi1WT0lEIFJUVVNCRGVxdWV1ZUNtZCgKLQlJTglQQ21kUQkJY21kcSwKLQlPVVQJUENtZFFFbG10CSpwY21kcWVsbXQpOwotCi1JTlQgUlRVU0JDbWRUaHJlYWQoCi0JSU4gT1VUIFBWT0lEIENvbnRleHQpOwotCi1JTlQgVGltZXJRVGhyZWFkKAotCUlOIE9VVCBQVk9JRCBDb250ZXh0KTsKLQotUlQyODcwX1RJTUVSX0VOVFJZICpSVDI4NzBfVGltZXJRX0luc2VydCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpOwotCi1CT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcik7Ci0KLXZvaWQgUlQyODcwX1RpbWVyUV9FeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotdm9pZCBSVDI4NzBfVGltZXJRX0luaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25FeGl0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKK3ZvaWQgUlRVU0JCc3NCZWFjb25TdGFydChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFJUMjg3MF9Cc3NCZWFjb25TdG9wKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKK3ZvaWQgUlRVU0JCc3NCZWFjb25Jbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUlQyODcwX0Jzc0JlYWNvblN0YXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqIHBBZCk7Cit2b2lkIFJUVVNCV2F0Y2hEb2coc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDI4NzBfQnNzQmVhY29uSW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CitpbnQgUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1MTYgT2Zmc2V0LCB1MzIgVmFsdWUpOwogCi1WT0lEIFJUMjg3MF9XYXRjaERvZygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7CitpbnQgUlRVU0JSZWFkTUFDUmVnaXN0ZXIoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICAgdTE2IE9mZnNldCwgdTMyICpwVmFsdWUpOwogCi1OVFNUQVRVUyBSVFVTQldyaXRlTUFDUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVVJTlQzMgkJCVZhbHVlKTsKK2ludCBSVFVTQlNpbmdsZVdyaXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTE2IE9mZnNldCwgdTE2IFZhbHVlKTsKIAotTlRTVEFUVVMgUlRVU0JSZWFkTUFDUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUlOVDMyCQkJcFZhbHVlKTsKK2ludCBSVFVTQkZpcm13YXJlV3JpdGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4ICpwRndJbWFnZSwgdW5zaWduZWQgbG9uZyBGd0xlbik7CiAKLU5UU1RBVFVTIFJUVVNCU2luZ2xlV3JpdGUoCi0JSU4gCVJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JVVNIT1JUCQkJVmFsdWUpOworaW50IFJUVVNCVmVuZGVyUmVzZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotTlRTVEFUVVMgUlRVU0JGaXJtd2FyZVJ1bigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7CitpbnQgUlRVU0JTZXRIYXJkV2FyZVJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLCB2b2lkICpwQnVmKTsKIAotTlRTVEFUVVMgUlRVU0JGaXJtd2FyZVdyaXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUgkJcEZ3SW1hZ2UsCi0JSU4gVUxPTkcJCUZ3TGVuKTsKK2ludCBSVFVTQlF1ZXJ5SGFyZFdhcmVSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwKKwkJCQkgICAgICAgdm9pZCAqcEJ1Zik7CiAKLU5UU1RBVFVTCVJUVVNCRmlybXdhcmVPcG1vZGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVSU5UMzIJCQlwVmFsdWUpOwordm9pZCBDTURIYW5kbGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLU5UU1RBVFVTCVJUVVNCVmVuZGVyUmVzZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOworaW50IFJUVVNCV3JpdGVIV01BQ0FkZHJlc3Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIpOwogCi1WT0lEIENNREhhbmRsZXIoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBNYWNUYWJsZUluaXRpYWxpemUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAordm9pZCBNbG1lU2V0UHNtKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTE2IHBzbSk7CiAKLU5ESVNfU1RBVFVTCSBDcmVhdGVUaHJlYWRzKAotCUlOCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ICk7CitpbnQgUlRNUFdQQUFkZEtleVByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwQnVmKTsKIAordm9pZCBBc2ljUnhBbnRFdmFsQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgTWFjVGFibGVJbml0aWFsaXplKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKK3ZvaWQgYXBwZW5kX3BrdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCXU4ICpwSGVhZGVyODAyXzMsCisJCXUzMiBIZHJMZW4sCisJCXU4ICpwRGF0YSwKKwkJdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSwgdm9pZCAqKiBwcFBhY2tldCk7CiAKLVZPSUQgTWxtZVNldFBzbSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgcHNtKTsKK3UzMiBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJdm9pZCAqcFBhY2tldCwKKwkJCQl1OCAqcERhdGEsIHVuc2lnbmVkIGxvbmcgRGF0YVNpemUpOwogCi1ORElTX1NUQVRVUyBSVE1QV1BBQWRkS2V5UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOworaW50IFJUTVBDaGVja1J4RXJyb3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXIsCisJCQkgICAgIHN0cnVjdCBydF9yeHdpICogcFJ4V0ksCisJCQkgICAgIElOIFBSVDI4WFhfUlhEX1NUUlVDIHBSeElORk8pOwogCi1WT0lEIEFzaWNSeEFudEV2YWxBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSVFVTQk1sbWVIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWdtdCAqcE1nbXQpOwogCi1ORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCi0JSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTyk7CitpbnQgTWxtZVRocmVhZCh2b2lkICpDb250ZXh0KTsKIAotSU5UIE1sbWVUaHJlYWQoCi0JSU4gUFZPSUQgQ29udGV4dCk7CisvKiAqLworLyogRnVuY3Rpb24gUHJvdG90eXBlIGluIHJ0dXNiX2RhdGEuYyAqLworLyogKi8KK2ludCBSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgIHU4IEJ1bGtPdXRQaXBlSWQsCisJCQkJICAgICAgIHUzMiBOdW1iZXJSZXF1aXJlZCk7CiAKLS8vCi0vLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gcnR1c2JfZGF0YS5jCi0vLwotTkRJU19TVEFUVVMJUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCVVJTlQzMgkJCU51bWJlclJlcXVpcmVkKTsKK0JPT0xFQU4gUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQnVsa091dFBpcGVJZCk7CiAKK3ZvaWQgUlRNUFdyaXRlVHhJbmZvKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICBzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvLAorCQkgICAgIHUxNiBVU0JETUFwa3RMZW4sCisJCSAgICAgSU4gQk9PTEVBTiBiV2l2LAorCQkgICAgIHU4IFF1ZXVlU2VsLCB1OCBOZXh0VmFsaWQsIHU4IFR4QnVyc3QpOwogCi1CT09MRUFOCVJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVQ0hBUgkJQnVsa091dFBpcGVJZCk7CisvKiAqLworLyogRnVuY3Rpb24gUHJvdG90eXBlIGluIGNtbV9kYXRhX3VzYi5jICovCisvKiAqLwordTE2IFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywKKwkJCQkgIElOIEJPT0xFQU4gYklzTGFzdCwgdTE2ICogRnJlZU51bWJlcik7CiAKK3UxNiBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgICBJTiBCT09MRUFOIGJJc0xhc3QsCisJCQkJICAgICB1MTYgKiBGcmVlTnVtYmVyKTsKIAotVk9JRCBSVE1QV3JpdGVUeEluZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYSU5GT19TVFJVQyAJcFR4SW5mbywKLQlJTgkgIFVTSE9SVAkJVVNCRE1BcGt0TGVuLAotCUlOCSAgQk9PTEVBTgkJYldpdiwKLQlJTgkgIFVDSEFSCQkJUXVldWVTZWwsCi0JSU4JICBVQ0hBUgkJCU5leHRWYWxpZCwKLQlJTgkgIFVDSEFSCQkJVHhCdXJzdCk7Cit1MTYgUnRtcFVTQl9Xcml0ZUZyYWdUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssCisJCQkJICAgdTggZnJhZ051bSwgdTE2ICogRnJlZU51bWJlcik7CiAKLS8vCi0vLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfMjg3MC5jCi0vLwotVVNIT1JUIFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK3UxNiBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgICB1OCBmcmFtZU51bSwgdTE2ICogRnJlZU51bWJlcik7CiAKLVVTSE9SVCBSdG1wVVNCX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcik7Cit2b2lkIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2Uoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLAorCQkJCSAgdTE2IHRvdGFsTVBEVVNpemUsIHUxNiBUeElkeCk7CiAKLVVTSE9SVAlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCWZyYWdOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKK3ZvaWQgUnRtcFVTQkRhdGFMYXN0VHhJZHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1OCBRdWVJZHgsIHUxNiBUeElkeCk7CiAKLVVTSE9SVCBSdG1wVVNCX1dyaXRlTXVsdGlUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlmcmFtZU51bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwordm9pZCBSdG1wVVNCRGF0YUtpY2tPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrLCB1OCBRdWVJZHgpOwogCi1WT0lEIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAotI2lmZGVmIFJUMjg2MAotCUlOCVVTSE9SVAkJCUZpcnN0VHhJZHgpOwotI2VuZGlmCi0JSU4JVVNIT1JUCQkJVHhJZHgpOworaW50IFJ0bXBVU0JNZ210S2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICB1OCBRdWVJZHgsCisJCSAgICAgICB2b2lkICpwUGFja2V0LAorCQkgICAgICAgdTggKnBTcmNCdWZWQSwgdTMyIFNyY0J1Zkxlbik7CiAKLVZPSUQgUnRtcFVTQkRhdGFMYXN0VHhJZHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JVVNIT1JUCQkJVHhJZHgpOwordm9pZCBSdG1wVVNCTnVsbEZyYW1lS2lja091dChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHU4IFF1ZUlkeCwKKwkJCSAgICAgdTggKiBwTnVsbEZyYW1lLCB1MzIgZnJhbWVMZW4pOwogCi1WT0lEIFJ0bXBVU0JEYXRhS2lja091dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KTsKK3ZvaWQgUnRtcFVzYlN0YUFzaWNGb3JjZVdha2V1cFRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJCSAgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQkgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkJICAgICAgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKTsKIAordm9pZCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBJTiBCT09MRUFOIGJGcm9tVHgpOwogCi1pbnQgUnRtcFVTQk1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTiBVQ0hBUiAJCQlRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKLQlJTiBVSU5UIAkJCVNyY0J1Zkxlbik7Cit2b2lkIFJUMjh4eFVzYlN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJIHUxNiBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKIAotVk9JRCBSdG1wVVNCTnVsbEZyYW1lS2lja091dCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVQ0hBUgkJUXVlSWR4LAotCUlOIFVDSEFSCQkqcE51bGxGcmFtZSwKLQlJTiBVSU5UMzIJCWZyYW1lTGVuKTsKK3ZvaWQgUlQyOHh4VXNiTWxtZVJhZGlvT24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKIAotVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KTsKK3ZvaWQgUlQyOHh4VXNiTWxtZVJhZGlvT0ZGKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLVZPSUQgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApOwordm9pZCBBc2ljVHVybk9mZlJGQ2xrKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggQ2hhbm5lbCk7CiAKLVZPSUQgUlQyOHh4VXNiTWxtZVJhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc2ljVHVybk9uUkZDbGsoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBDaGFubmVsKTsKIAotVk9JRCBSVDI4eHhVc2JNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCitpbnQgUnRtcFRpbWVyUVRocmVhZChJTiB2b2lkICpDb250ZXh0KTsKIAotSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcE5hbWUsCi0JSU4JUFVDSEFSCQkJcEJ1Zik7CitzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpSdG1wVGltZXJRSW5zZXJ0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFRpbWVyKTsKIAotUENIQVIgICBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCi0gICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpOworQk9PTEVBTiBSdG1wVGltZXJRUmVtb3ZlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSBzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpwVGltZXIpOwogCi1QQ0hBUiAgIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCi0gICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpOwordm9pZCBSdG1wVGltZXJRRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIEFzaWNTdGFCYnBUdW5pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBSdG1wVGltZXJRSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOworI2VuZGlmIC8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCiAKLSNpZmRlZiBSVDI4NjAKLVZPSUQgQXNpY1Jlc2V0RnJvbURNQUJ1c3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBBc2ljU3RhQmJwVHVuaW5nKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgQXNpY1Jlc2V0QkJQKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK0JPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgIHU4IE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCisJCQkgICAgc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgKiBwSHRDYXBhYmlsaXR5LAorCQkJICAgIHU4IEh0Q2FwYWJpbGl0eUxlbiwKKwkJCSAgICBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvLAorCQkJICAgIHU4IEFkZEh0SW5mb0xlbiwgdTE2IENhcGFiaWxpdHlJbmZvKTsKIAotVk9JRCBBc2ljUmVzZXRNQUMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOworQk9PTEVBTiBBVVRIX1JlcVNlbmQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKnBFbGVtLAorCQkgICAgIHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBBdXRoVGltZXIsCisJCSAgICAgY2hhciAqcFNNTmFtZSwKKwkJICAgICB1MTYgU2VxTm8sCisJCSAgICAgdTggKnBOZXdFbGVtZW50LCB1bnNpZ25lZCBsb25nIEVsZW1lbnRMZW4pOwogCi1WT0lEIEFzaWNSZXNldFBCRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKLUJPT0xFQU4gU3RhQWRkTWFjVGFibGVFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLQlJTiAgVUNIQVIJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLQlJTiAgSFRfQ0FQQUJJTElUWV9JRQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiAgVUNIQVIJCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOICBVU0hPUlQgICAgICAgIAkJQ2FwYWJpbGl0eUluZm8pOwotI2VuZGlmCit2b2lkIFJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLXZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwordm9pZCBSZVN5bmNCZWFjb25UaW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CiAKLVZPSUQgUmVTeW5jQmVhY29uVGltZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Cit2b2lkIFJUTVBTZXRBR0NJbml0VmFsdWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBCYW5kV2lkdGgpOwogCi1WT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlCYW5kV2lkdGgpOworaW50IHJ0Mjh4eF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAotaW50IHJ0Mjh4eF9jbG9zZShJTiBQTkVUX0RFViBkZXYpOwotaW50IHJ0Mjh4eF9vcGVuKElOIFBORVRfREVWIGRldik7CisjZGVmaW5lIFZJUlRVQUxfSUZfSU5DKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KyspCisjZGVmaW5lIFZJUlRVQUxfSUZfREVDKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250LS0pCisjZGVmaW5lIFZJUlRVQUxfSUZfTlVNKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KQogCi1fX2lubGluZSBJTlQgVklSVFVBTF9JRl9VUChQUlRNUF9BREFQVEVSIHBBZCkKKyNpZmRlZiBMSU5VWAorX19pbmxpbmUgaW50IFZJUlRVQUxfSUZfVVAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCi0JewotCQlpZiAocnQyOHh4X29wZW4ocEFkLT5uZXRfZGV2KSAhPSAwKQorCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApIHsKKwkJaWYgKHJ0Mjh4eF9vcGVuKHBBZC0+bmV0X2RldikgIT0gMCkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgicnQyOHh4X29wZW4gcmV0dXJuIGZhaWwhXG4iKSk7CiAJCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQl7CisJCX0KKwl9IGVsc2UgewogCX0KIAlWSVJUVUFMX0lGX0lOQyhwQWQpOwogCXJldHVybiAwOwogfQogCi1fX2lubGluZSBWT0lEIFZJUlRVQUxfSUZfRE9XTihQUlRNUF9BREFQVEVSIHBBZCkKK19faW5saW5lIHZvaWQgVklSVFVBTF9JRl9ET1dOKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlWSVJUVUFMX0lGX0RFQyhwQWQpOwogCWlmIChWSVJUVUFMX0lGX05VTShwQWQpID09IDApCiAJCXJ0Mjh4eF9jbG9zZShwQWQtPm5ldF9kZXYpOwogCXJldHVybjsKIH0KKyNlbmRpZiAvKiBMSU5VWCAvLyAqLwogCisvKgorCU9TIFJlbGF0ZWQgZnVuY2l0b24gcHJvdG90eXBlIGRlZmluaXRpb25zLgorCVRPRE86IE1heWJlIHdlIG5lZWQgdG8gbW92ZSB0aGVzZSBmdW5jdGlvbiBwcm90b3R5cGVzIHRvIG90aGVyIHByb3BlciBwbGFjZS4KKyovCitpbnQgUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHUzMiBldmVudFR5cGUsCisJCQkgICAgaW50IGZsYWdzLAorCQkJICAgIHU4ICpwU3JjTWFjLAorCQkJICAgIHU4ICpwRGF0YSwgdTMyIGRhdGFMZW4pOwogCi0jZW5kaWYgIC8vIF9fUlRNUF9IX18KK2ludCBSdG1wT1NOZXREZXZBZGRyU2V0KHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LCB1OCAqcE1hY0FkZHIpOwogCitpbnQgUnRtcE9TTmV0RGV2QXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2LAorCQkgICAgICAgc3RydWN0IHJ0X3J0bXBfb3NfbmV0ZGV2X29wX2hvb2sgKnBEZXZPcEhvb2spOworCit2b2lkIFJ0bXBPU05ldERldkNsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2KTsKKwordm9pZCBSdG1wT1NOZXREZXZEZXRhY2goc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCitpbnQgUnRtcE9TTmV0RGV2QWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKiogcE5ld05ldERldiwgdTMyIHByaXZEYXRhU2l6ZSk7CisKK3ZvaWQgUnRtcE9TTmV0RGV2RnJlZShzdHJ1Y3QgbmV0X2RldmljZSAqcE5ldERldik7CisKK3N0cnVjdCBuZXRfZGV2aWNlICpSdG1wT1NOZXREZXZHZXRCeU5hbWUoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYsIGNoYXIgKnBEZXZOYW1lKTsKKwordm9pZCBSdG1wT1NOZXREZXZpY2VSZWZQdXQoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCitzdHJ1Y3QgbmV0X2RldmljZSAqUnRtcE9TTmV0RGV2Q3JlYXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBpbnQgZGV2VHlwZSwKKwkJCSAgICBpbnQgZGV2TnVtLAorCQkJICAgIGludCBwcml2TWVtU2l6ZSwgY2hhciAqcE5hbWVQcmVmaXgpOworCisvKgorCVRhc2sgb3BlcmF0aW9uIHJlbGF0ZWQgZnVuY3Rpb24gcHJvdG90eXBlcworKi8KK3ZvaWQgUnRtcE9TVGFza0N1c3RvbWl6ZShzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzayk7CisKK2ludCBSdG1wT1NUYXNrTm90aWZ5VG9FeGl0KHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrKTsKKworaW50IFJ0bXBPU1Rhc2tLaWxsKHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrKTsKKworaW50IFJ0bXBPU1Rhc2tJbml0KHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrLAorCQkJICAgY2hhciAqcFRhc2tOYW1lLCB2b2lkICogcFByaXYpOworCitpbnQgUnRtcE9TVGFza0F0dGFjaChzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzaywKKwkJCSAgICAgSU4gaW50ICgqZm4pICh2b2lkICopLCBJTiB2b2lkICphcmcpOworCisvKgorCUZpbGUgb3BlcmF0aW9uIHJlbGF0ZWQgZnVuY3Rpb24gcHJvdG90eXBlcworKi8KK3N0cnVjdCBmaWxlICpSdG1wT1NGaWxlT3BlbihJTiBjaGFyICpwUGF0aCwgSU4gaW50IGZsYWcsIElOIGludCBtb2RlKTsKKworaW50IFJ0bXBPU0ZpbGVDbG9zZShzdHJ1Y3QgZmlsZSAqb3NmZCk7CisKK3ZvaWQgUnRtcE9TRmlsZVNlZWsoc3RydWN0IGZpbGUgKm9zZmQsIElOIGludCBvZmZzZXQpOworCitpbnQgUnRtcE9TRmlsZVJlYWQoc3RydWN0IGZpbGUgKm9zZmQsIElOIGNoYXIgKnBEYXRhUHRyLCBJTiBpbnQgcmVhZExlbik7CisKK2ludCBSdG1wT1NGaWxlV3JpdGUoc3RydWN0IGZpbGUgKm9zZmQsIElOIGNoYXIgKnBEYXRhUHRyLCBJTiBpbnQgd3JpdGVMZW4pOworCisjZW5kaWYgLyogX19SVE1QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NoaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9jaGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkZjJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9jaGlwLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFsaW5rIFRlY2ggSW5jLgorICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAorICogSHNpbmNodSBDb3VudHkgMzAyLAorICogVGFpd2FuLCBSLk8uQy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJTW9kdWxlIE5hbWU6CisJcnRtcF9jaGlwLmgKKworCUFic3RyYWN0OgorCVJhbGluayBXaXJlbGVzcyBDaGlwIHJlbGF0ZWQgZGVmaW5pdGlvbiAmIHN0cnVjdHVyZXMKKworCVJldmlzaW9uIEhpc3Rvcnk6CisJV2hvCQkJV2hlbgkJICBXaGF0CisJLS0tLS0tLS0JLS0tLS0tLS0tLQkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJX19SVE1QX0NISVBfSF9fCisjZGVmaW5lCV9fUlRNUF9DSElQX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisKKyNpZmRlZiBSVDI4NjAKKyNpbmNsdWRlICJjaGlwL3J0Mjg2MC5oIgorI2VuZGlmIC8qIFJUMjg2MCAvLyAqLworI2lmZGVmIFJUMjg3MAorI2luY2x1ZGUgImNoaXAvcnQyODcwLmgiCisjZW5kaWYgLyogUlQyODcwIC8vICovCisjaWZkZWYgUlQzMDcwCisjaW5jbHVkZSAiY2hpcC9ydDMwNzAuaCIKKyNlbmRpZiAvKiBSVDMwNzAgLy8gKi8KKyNpZmRlZiBSVDMwOTAKKyNpbmNsdWRlICJjaGlwL3J0MzA5MC5oIgorI2VuZGlmIC8qIFJUMzA5MCAvLyAqLworCisvKiBXZSB3aWxsIGhhdmUgYSBjb3N0IGRvd24gdmVyc2lvbiB3aGljaCBtYWMgdmVyc2lvbiBpcyAweDMwOTB4eHh4ICovCisvKiAqLworLyogUlQzMDkwQSBmYWN0cyAqLworLyogKi8KKy8qIGEpIDIuNCBHSHogKi8KKy8qIGIpIFJlcGxhY2VtZW50IGZvciBSVDMwOTAgKi8KKy8qIGMpIEludGVybmFsIExOQSAqLworLyogZCkgSW50ZXJmZXJlbmNlIG92ZXIgY2hhbm5lbCAjMTQgKi8KKy8qIGUpIE5ldyBCQlAgZmVhdHVyZXMgKGUuZy4sIFNJRyByZS1tb2R1bGF0aW9uKSAqLworLyogKi8KKyNkZWZpbmUgSVNfUlQzMDkwQShfcEFkKQkJCQkoKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwOTAwMDAwKSkKKworLyogV2Ugd2lsbCBoYXZlIGEgY29zdCBkb3duIHZlcnNpb24gd2hpY2ggbWFjIHZlcnNpb24gaXMgMHgzMDkweHh4eCAqLworI2RlZmluZSBJU19SVDMwOTAoX3BBZCkJCQkJKCgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcxMDAwMCkgfHwgKElTX1JUMzA5MEEoX3BBZCkpKQorCisjZGVmaW5lIElTX1JUMzA3MChfcEFkKQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweGZmZmYwMDAwKSA9PSAweDMwNzAwMDAwKQorI2RlZmluZSBJU19SVDMwNzEoX3BBZCkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcxMDAwMCkKKyNkZWZpbmUgSVNfUlQyMDcwKF9wQWQpCQkoKChfcEFkKS0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSB8fCAoKF9wQWQpLT5FRnVzZVRhZyA9PSAweDI3KSkKKworI2RlZmluZSBJU19SVDMweHgoX3BBZCkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmYwMDAwMCkgPT0gMHgzMDcwMDAwMHx8SVNfUlQzMDkwQShfcEFkKSkKKy8qI2RlZmluZSBJU19SVDMwNVgoX3BBZCkgICAgICAgICAgICAgICAoKF9wQWQpLT5NQUNWZXJzaW9uID09IDB4Mjg3MjAyMDApICovCisKKy8qIFJUMzU3MiwgMzU5MiwgMzU2MiwgMzA2MiBzaGFyZSB0aGUgc2FtZSBNQUMgdmVyc2lvbiAqLworI2RlZmluZSBJU19SVDM1NzIoX3BBZCkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzNTcyMDAwMCkKKyNkZWZpbmUgSVNfVkVSU0lPTl9CRUZPUkVfRihfcEFkKQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uJjB4ZmZmZikgPD0gMHgwMjExKQorLyogRiB2ZXJzaW9uIGlzIDB4MDIxMiwgRSB2ZXJzaW9uIGlzIDB4MDIxMS4gMzA5eCBjYW4gc2F2ZSBtb3JlIHBvd2VyIGFmdGVyIEYgdmVyc2lvbi4gKi8KKyNkZWZpbmUgSVNfVkVSU0lPTl9BRlRFUl9GKF9wQWQpCQkJKCgoKF9wQWQpLT5NQUNWZXJzaW9uJjB4ZmZmZikgPj0gMHgwMjEyKSB8fCAoKChfcEFkKS0+YjMwOTBFU3BlY2lhbENoaXAgPT0gVFJVRSkpKQorLyogKi8KKy8qIFJUMzM5MCBmYWN0cyAqLworLyogKi8KKy8qIGEpIEJhc2Ugb24gUlQzMDkwIChSRiBJQzogUlQzMDIwKSAqLworLyogYikgMi40IEdIeiAqLworLyogYykgMXgxICovCisvKiBkKSBTaW5nbGUgY2hpcCAqLworLyogZSkgSW50ZXJuYWwgY29tcG9uZW50czogUEEgYW5kIExOQSAqLworLyogKi8KKy8qUlQzMzkwLFJUMzM3MCAqLworI2RlZmluZSBJU19SVDMzOTAoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweEZGRkYwMDAwKSA9PSAweDMzOTAwMDAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFBDSSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMDAwICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQ0hJUF9QQ0lfQ0ZHCQkweDAwMDAKKyNkZWZpbmUgQ0hJUF9QQ0lfRUVDVFJMCQkweDAwMDQKKyNkZWZpbmUgQ0hJUF9QQ0lfTUNVQ1RSTAkweDAwMDgKKworI2RlZmluZSBPUFRfMTQJCQkweDExNAorCisjZGVmaW5lIFJFVFJZX0xJTUlUCQkxMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEJCUCAmIFJGICAgICBkZWZpbml0aW9uICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUJQlVTWQkJICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUJSURMRQkJICAgICAgICAgICAgICAgIDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBFRVBST00gZGVmaW5pdGlvbiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEVFRE8gICAgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEVFREkgICAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEVFQ1MgICAgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEVFU0sgICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVFUkwgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERSAgICAgICAgIDB4MDUKKyNkZWZpbmUgRUVQUk9NX1JFQURfT1BDT0RFICAgICAgICAgIDB4MDYKKyNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAgICAgICAgIDB4MTAKKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAgICAgICAgIDB4MTMKKworI2RlZmluZSBOVU1fRUVQUk9NX0JCUF9QQVJNUwkJMTkJLyogSW5jbHVkZSBOSUMgQ29uZmlnIDAsIDEsIENSLCBUWCBBTEMgc3RlcCwgQkJQcyAqLworI2RlZmluZSBOVU1fRUVQUk9NX1RYX0dfUEFSTVMJCTcKKyNkZWZpbmUgRUVQUk9NX05JQzFfT0ZGU0VUICAgICAgICAgIDB4MzQJLyogVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQgKi8KKyNkZWZpbmUgRUVQUk9NX05JQzJfT0ZGU0VUICAgICAgICAgIDB4MzYJLyogVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQgKi8KKyNkZWZpbmUgRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkvKiBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRCAqLworI2RlZmluZSBFRVBST01fR19UWF9QV1JfT0ZGU0VUCQkweDUyCisjZGVmaW5lIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUCQkweDYwCisjZGVmaW5lIEVFUFJPTV9MRUQxX09GRlNFVAkJCTB4M2MKKyNkZWZpbmUgRUVQUk9NX0xFRDJfT0ZGU0VUCQkJMHgzZQorI2RlZmluZSBFRVBST01fTEVEM19PRkZTRVQJCQkweDQwCisjZGVmaW5lIEVFUFJPTV9MTkFfT0ZGU0VUCQkJMHg0NAorI2RlZmluZSBFRVBST01fUlNTSV9CR19PRkZTRVQJCTB4NDYKKyNkZWZpbmUgRUVQUk9NX1RYTUlYRVJfR0FJTl8yXzRHCTB4NDgKKyNkZWZpbmUgRUVQUk9NX1JTU0lfQV9PRkZTRVQJCTB4NGEKKyNkZWZpbmUgRUVQUk9NX1RYTUlYRVJfR0FJTl81RwkJMHg0YworI2RlZmluZSBFRVBST01fREVGSU5FX01BWF9UWFBXUgkJMHg0ZQorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RwkweGRlCS8qIDIwTUhaIDIuNEcgdHggcG93ZXIuICovCisjZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV80ME1IWl8yXzRHCTB4ZWUJLyogNDBNSFogMi40RyB0eCBwb3dlci4gKi8KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzVHCQkweGZhCS8qIDIwTUhaIDVHIHR4IHBvd2VyLiAqLworI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfNUcJCTB4MTBhCS8qIDQwTUhaIDVHIHR4IHBvd2VyLiAqLworI2RlZmluZSBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICAgICAgMHg3OAorI2RlZmluZSBFRVBST01fQV9UWDJfUFdSX09GRlNFVCAgICAgIDB4YTYKKy8qI2RlZmluZSBFRVBST01fSmFwYW5fVFhfUFdSX09GRlNFVCAgICAgIDB4OTAgLy8gODAyLjExaiAqLworLyojZGVmaW5lIEVFUFJPTV9KYXBhbl9UWDJfUFdSX09GRlNFVCAgICAgIDB4YmUgKi8KKy8qI2RlZmluZSBFRVBST01fVFNTSV9SRUZfT0ZGU0VUICAgICAgICAweDU0ICovCisvKiNkZWZpbmUgRUVQUk9NX1RTU0lfREVMVEFfT0ZGU0VUICAgICAgMHgyNCAqLworLyojZGVmaW5lIEVFUFJPTV9DQ0tfVFhfUFdSX09GRlNFVCAgMHg2MiAqLworLyojZGVmaW5lIEVFUFJPTV9DQUxJQlJBVEVfT0ZGU0VUICAgICAgIDB4N2MgKi8KKyNkZWZpbmUgRUVQUk9NX1ZFUlNJT05fT0ZGU0VUICAgICAgIDB4MDIKKyNkZWZpbmUgRUVQUk9NX0ZSRVFfT0ZGU0VUCQkJMHgzYQorI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEUJMHhkZQkvKiAyME1IWiBwb3dlci4gKi8KKyNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfREVMVEEJCTB4NTAJLyogMjBNSFogQU5EIDQwIE1IWiB1c2UgZGlmZmVyZW50IHBvd2VyLiBUaGlzIGlzIGRlbHRhIGluIDQwTUhaLiAqLworI2RlZmluZSBWQUxJRF9FRVBST01fVkVSU0lPTiAgICAgICAgMQorCisvKgorICAqICAgRUVQUk9NIG9wZXJhdGlvbiByZWxhdGVkIG1hcmNvcworICAqLworI2RlZmluZSBSVDI4eHhfRUVQUk9NX1JFQUQxNihfcEFkLCBfb2Zmc2V0LCBfdmFsdWUpCQkJXAorCShfcEFkKS0+Y2hpcE9wcy5lZXJlYWQoKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKikoX3BBZCksICh1MTYpKF9vZmZzZXQpLCAodTE2ICopJihfdmFsdWUpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgRTJQUk9NIGRhdGEgbGF5b3V0ICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICovCisvKiBNQ1VfTEVEQ1M6IE1DVSBMRUQgQ29udHJvbCBTZXR0aW5nLiAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX01DVV9MRURDU19TVFJVQyB7CisJc3RydWN0IHsKKwkJdTggTGVkTW9kZTo3OworCQl1OCBQb2xhcml0eToxOworCX0gZmllbGQ7CisJdTggd29yZDsKK30gTUNVX0xFRENTX1NUUlVDLCAqUE1DVV9MRURDU19TVFJVQzsKKworLyogKi8KKy8qIEVFUFJPTSBhbnRlbm5hIHNlbGVjdCBmb3JtYXQgKi8KKy8qICovCit0eXBlZGVmIHVuaW9uIF9FRVBST01fQU5URU5OQV9TVFJVQyB7CisJc3RydWN0IHsKKwkJdTE2IFJ4UGF0aDo0OwkvKiAxOiAxUiwgMjogMlIsIDM6IDNSICovCisJCXUxNiBUeFBhdGg6NDsJLyogMTogMVQsIDI6IDJUICovCisJCXUxNiBSZkljVHlwZTo0OwkvKiBzZWUgRTJQUk9NIGRvY3VtZW50ICovCisJCXUxNiBSc3Y6NDsKKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBFRVBST01fQU5URU5OQV9TVFJVQywgKlBFRVBST01fQU5URU5OQV9TVFJVQzsKKwordHlwZWRlZiB1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLyogMTplbmFibGUsIDA6ZGlzYWJsZSAqLworCQl1MTYgRHluYW1pY1R4QWdjQ29udHJvbDoxOwkvKiAqLworCQl1MTYgRXh0ZXJuYWxMTkFGb3JHOjE7CS8qICovCisJCXUxNiBFeHRlcm5hbExOQUZvckE6MTsJLyogZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RyAqLworCQl1MTYgQ2FyZGJ1c0FjY2VsZXJhdGlvbjoxOwkvKiAhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlICovCisJCXUxNiBCVzQwTVNpZGViYW5kRm9yRzoxOworCQl1MTYgQlc0ME1TaWRlYmFuZEZvckE6MTsKKwkJdTE2IEVuYWJsZVdQU1BCQzoxOwkvKiBXUFMgUEJDIENvbnRyb2wgYml0ICovCisJCXUxNiBCVzQwTUF2YWlsRm9yRzoxOwkvKiAwOmVuYWJsZSwgMTpkaXNhYmxlICovCisJCXUxNiBCVzQwTUF2YWlsRm9yQToxOwkvKiAwOmVuYWJsZSwgMTpkaXNhYmxlICovCisJCXUxNiBSc3YxOjE7CS8qIG11c3QgYmUgMCAqLworCQl1MTYgQW50RGl2ZXJzaXR5OjE7CS8qIEFudGVubmEgZGl2ZXJzaXR5ICovCisJCXUxNiBSc3YyOjM7CS8qIG11c3QgYmUgMCAqLworCQl1MTYgREFDVGVzdEJpdDoxOwkvKiBjb250cm9sIGlmIGRyaXZlciBzaG91bGQgcGF0Y2ggdGhlIERBQyBpc3N1ZSAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IEVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQywgKlBFRVBST01fTklDX0NPTkZJRzJfU1RSVUM7CisKKy8qICovCisvKiBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KSAqLworLyogKi8KK3R5cGVkZWYgdW5pb24gX0VFUFJPTV9UWF9QV1JfU1RSVUMgeworCXN0cnVjdCB7CisJCWNoYXIgQnl0ZTA7CS8qIExvdyBCeXRlICovCisJCWNoYXIgQnl0ZTE7CS8qIEhpZ2ggQnl0ZSAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IEVFUFJPTV9UWF9QV1JfU1RSVUMsICpQRUVQUk9NX1RYX1BXUl9TVFJVQzsKKwordHlwZWRlZiB1bmlvbiBfRUVQUk9NX1ZFUlNJT05fU1RSVUMgeworCXN0cnVjdCB7CisJCXU4IEZhZVJlbGVhc2VOdW1iZXI7CS8qIExvdyBCeXRlICovCisJCXU4IFZlcnNpb247CS8qIEhpZ2ggQnl0ZSAqLworCX0gZmllbGQ7CisJdTE2IHdvcmQ7Cit9IEVFUFJPTV9WRVJTSU9OX1NUUlVDLCAqUEVFUFJPTV9WRVJTSU9OX1NUUlVDOworCit0eXBlZGVmIHVuaW9uIF9FRVBST01fTEVEX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1MTYgUG9sYXJpdHlSRFlfRzoxOwkvKiBQb2xhcml0eSBSRFlfRyBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlSRFlfQToxOwkvKiBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlBQ1Q6MTsJLyogUG9sYXJpdHkgQUNUIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eUdQSU9fMDoxOwkvKiBQb2xhcml0eSBHUElPIzAgc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5R1BJT18xOjE7CS8qIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLiAqLworCQl1MTYgUG9sYXJpdHlHUElPXzI6MTsJLyogUG9sYXJpdHkgR1BJTyMyIHNldHRpbmcuICovCisJCXUxNiBQb2xhcml0eUdQSU9fMzoxOwkvKiBQb2xhcml0eSBHUElPIzMgc2V0dGluZy4gKi8KKwkJdTE2IFBvbGFyaXR5R1BJT180OjE7CS8qIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLiAqLworCQl1MTYgTGVkTW9kZTo1OwkvKiBMZWQgbW9kZS4gKi8KKwkJdTE2IFJzdmQ6MzsJLyogUmVzZXJ2ZWQgKi8KKwl9IGZpZWxkOworCXUxNiB3b3JkOworfSBFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7CisKK3R5cGVkZWYgdW5pb24gX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDIHsKKwlzdHJ1Y3QgeworCQl1OCBEZWx0YVZhbHVlOjY7CS8qIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkgKi8KKwkJdTggVHlwZToxOwkvKiAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlICovCisJCXU4IFR4UG93ZXJFbmFibGU6MTsJLyogRW5hYmxlICovCisJfSBmaWVsZDsKKwl1OCB2YWx1ZTsKK30gRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUMsICpQRUVQUk9NX1RYUE9XRVJfREVMVEFfU1RSVUM7CisKKyNlbmRpZiAvKiBfX1JUTVBfQ0hJUF9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfY2tpcG1pYy5oCmluZGV4IDM5OTU1YjkuLjZmZjkzNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9ja2lwbWljLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2NraXBtaWMuaApAQCAtMzcsNDIgKzM3LDI3IEBACiAjaWZuZGVmCV9fUlRNUF9DS0lQTUlDX0hfXwogI2RlZmluZQlfX1JUTVBfQ0tJUE1JQ19IX18KIAotdHlwZWRlZglzdHJ1Y3QJX01JQ19DT05URVhUCXsKK3N0cnVjdCBydF9taWNfY29udGV4dCB7CiAJLyogLS0tIE1NSCBjb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JVUNIQVIJCUNLWzE2XTsJCQkJLyogdGhlIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JVUNIQVIJCWNvZWZmaWNpZW50WzE2XTsJLyogY3VycmVudCBhZXMgY291bnRlciBtb2RlIGNvZWZmaWNpZW50cyAgICAgICovCi0JVUxPTkdMT05HCWFjY3VtOwkJCQkvKiBhY2N1bXVsYXRlZCBtaWMsIHJlZHVjZWQgdG8gdTMyIGluIGZpbmFsKCkgKi8KLQlVSU5UCQlwb3NpdGlvbjsJCQkvKiBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZSAgKi8KLQlVQ0hBUgkJcGFydFs0XTsJCQkvKiBmb3IgY29udmVyc2lvbiBvZiBtZXNzYWdlIHRvIHUzMiBmb3IgbW1oICAgKi8KLX0JTUlDX0NPTlRFWFQsICpQTUlDX0NPTlRFWFQ7CisJdTggQ0tbMTZdOwkJLyogdGhlIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTggY29lZmZpY2llbnRbMTZdOwkvKiBjdXJyZW50IGFlcyBjb3VudGVyIG1vZGUgY29lZmZpY2llbnRzICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgYWNjdW07CS8qIGFjY3VtdWxhdGVkIG1pYywgcmVkdWNlZCB0byB1MzIgaW4gZmluYWwoKSAqLworCXUzMiBwb3NpdGlvbjsJCS8qIGN1cnJlbnQgcG9zaXRpb24gKGJ5dGUgb2Zmc2V0KSBpbiBtZXNzYWdlICAqLworCXU4IHBhcnRbNF07CQkvKiBmb3IgY29udmVyc2lvbiBvZiBtZXNzYWdlIHRvIHUzMiBmb3IgbW1oICAgKi8KK307CiAKLVZPSUQgeG9yXzEyOCgKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBhLAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGIsCi0gICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKK3ZvaWQgeG9yXzEyOCh1OCAqYSwgdTggKmIsIHU4ICpvdXQpOwogCi1VQ0hBUiBSVE1QQ2tpcFNib3goCi0gICAgSU4gIFVDSEFSICAgICAgICAgICAgICAgYSk7Cit1OCBSVE1QQ2tpcFNib3godTggYSk7CiAKLVZPSUQgeG9yXzMyKAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGEsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgYiwKLSAgICBPVVQgUFVDSEFSICAgICAgICAgICAgICBvdXQpOwordm9pZCB4b3JfMzIodTggKmEsIHU4ICpiLCB1OCAqb3V0KTsKIAotVk9JRCBuZXh0X2tleSgKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBrZXksCi0gICAgSU4gIElOVCAgICAgICAgICAgICAgICAgcm91bmQpOwordm9pZCBuZXh0X2tleSh1OCAqa2V5LCBpbnQgcm91bmQpOwogCi1WT0lEIGJ5dGVfc3ViKAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAotICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Cit2b2lkIGJ5dGVfc3ViKHU4ICppbiwgdTggKm91dCk7CiAKLVZPSUQgc2hpZnRfcm93KAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIGluLAotICAgIE9VVCBQVUNIQVIgICAgICAgICAgICAgIG91dCk7Cit2b2lkIHNoaWZ0X3Jvdyh1OCAqaW4sIHU4ICpvdXQpOwogCi1WT0lEIG1peF9jb2x1bW4oCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICAgICAgaW4sCi0gICAgT1VUIFBVQ0hBUiAgICAgICAgICAgICAgb3V0KTsKK3ZvaWQgbWl4X2NvbHVtbih1OCAqaW4sIHU4ICpvdXQpOwogCi0jZW5kaWYgLy9fX1JUTVBfQ0tJUE1JQ19IX18KKyNlbmRpZiAvKl9fUlRNUF9DS0lQTUlDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2RlZi5oCmluZGV4IGY1ZmVlNTcuLjljNTRiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZGVmLmgKQEAgLTQxLDkgKzQxLDkgQEAKIAogI2luY2x1ZGUgIm9pZC5oIgogCi0vLwotLy8gIERlYnVnIGluZm9ybWF0aW9uIHZlcmJvc2l0eTogbG93ZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciB1cmdlbmN5Ci0vLworLyogKi8KKy8qICBEZWJ1ZyBpbmZvcm1hdGlvbiB2ZXJib3NpdHk6IGxvd2VyIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgdXJnZW5jeSAqLworLyogKi8KICNkZWZpbmUgUlRfREVCVUdfT0ZGICAgICAgICAwCiAjZGVmaW5lIFJUX0RFQlVHX0VSUk9SICAgICAgMQogI2RlZmluZSBSVF9ERUJVR19XQVJOICAgICAgIDIKQEAgLTUxLDExMSArNTEsMTAxIEBACiAjZGVmaW5lIFJUX0RFQlVHX0lORk8gICAgICAgNAogI2RlZmluZSBSVF9ERUJVR19MT1VEICAgICAgIDUKIAotI2RlZmluZSBOSUNfVEFHICAgICAgICAgICAgICgoVUxPTkcpJzA2ODInKQotI2RlZmluZSBOSUNfREJHX1NUUklORyAgICAgICgiKipSVDI4eHgqKiIpCisjZGVmaW5lIE5JQ19UQUcgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKScwNjgyJykKKyNkZWZpbmUgTklDX0RCR19jaGFyICAgICAgKCIqKlJUMjh4eCoqIikKIAotI2RlZmluZSBSQUxJTktfMjg4M19WRVJTSU9OCQkoKFVJTlQzMikweDI4ODMwMzAwKQotI2RlZmluZSBSQUxJTktfMjg4MEVfVkVSU0lPTgkoKFVJTlQzMikweDI4NzIwMjAwKQotI2RlZmluZSBSQUxJTktfMzA3MF9WRVJTSU9OCQkoKFVJTlQzMikweDMwNzAwMjAwKQotCi0vLwotLy8gTkRJUyB2ZXJzaW9uIGluIHVzZSBieSB0aGUgTklDIGRyaXZlci4KLS8vIFRoZSBoaWdoIGJ5dGUgaXMgdGhlIG1ham9yIHZlcnNpb24uIFRoZSBsb3cgYnl0ZSBpcyB0aGUgbWlub3IgdmVyc2lvbi4KLS8vCi0jaWZkZWYgIE5ESVM1MV9NSU5JUE9SVAotI2RlZmluZSBOSUNfRFJJVkVSX1ZFUlNJT04gICAgICAweDA1MDEKLSNlbHNlCi0jZGVmaW5lIE5JQ19EUklWRVJfVkVSU0lPTiAgICAgIDB4MDUwMAotI2VuZGlmCi0KLS8vCi0vLyBORElTIG1lZGlhIHR5cGUsIGN1cnJlbnQgaXMgZXRoZXJuZXQsIGNoYW5nZSBpZiBuYXRpdmUgd2lyZWxlc3Mgc3VwcG9ydGVkCi0vLwotI2RlZmluZSBOSUNfTUVESUFfVFlQRSAgICAgICAgICBOZGlzTWVkaXVtODAyXzMKLSNkZWZpbmUgTklDX1BDSV9IRFJfTEVOR1RIICAgICAgMHhlMgotI2RlZmluZSBOSUNfTUFYX1BBQ0tFVF9TSVpFICAgICAyMzA0Ci0jZGVmaW5lIE5JQ19IRUFERVJfU0laRSAgICAgICAgIDE0Ci0jZGVmaW5lIE1BWF9NQVBfUkVHSVNURVJTX05FRURFRCAzMgotI2RlZmluZSBNSU5fTUFQX1JFR0lTVEVSU19ORUVERUQgMiAgIC8vVG9kbzogc2hvdWxkIGNvbnNpZGVyIGZyYWdtZW50IGlzc3VlLgotCi0vLwotLy8gaW50ZXJmYWNlIHR5cGUsIHdlIHVzZSBQQ0kKLS8vCi0jZGVmaW5lIE5JQ19JTlRFUkZBQ0VfVFlQRSAgICAgIE5kaXNJbnRlcmZhY2VQY2kKLSNkZWZpbmUgTklDX0lOVEVSUlVQVF9NT0RFICAgICAgTmRpc0ludGVycnVwdExldmVsU2Vuc2l0aXZlCi0KLS8vCi0vLyBidWZmZXIgc2l6ZSBwYXNzZWQgaW4gTmRpc01RdWVyeUFkYXB0ZXJSZXNvdXJjZXMKLS8vIFdlIHNob3VsZCBvbmx5IG5lZWQgdGhyZWUgYWRhcHRlciByZXNvdXJjZXMgKElPLCBpbnRlcnJ1cHQgYW5kIG1lbW9yeSksCi0vLyBTb21lIGRldmljZXMgZ2V0IGV4dHJhIHJlc291cmNlcywgc28gaGF2ZSByb29tIGZvciAxMCByZXNvdXJjZXMKLS8vICAgICAgICAgICAgICAgICAgICBVRl9TSVpFICAgKHNpemVvZihORElTX1JFU09VUkNFX0xJU1QpICsgKDEwKnNpemVvZihDTV9QQVJUSUFMX1JFU09VUkNFX0RFU0NSSVBUT1IpKSkKLQotCi0jZGVmaW5lIE5JQ19SRVNPVVJDRV9CLy8KLS8vIElPIHNwYWNlIGxlbmd0aAotLy8KLSNkZWZpbmUgTklDX01BUF9JT1NQQUNFX0xFTkdUSCAgc2l6ZW9mKENTUl9TVFJVQykKLQotI2RlZmluZSBNQVhfUlhfUEtUX0xFTgkxNTIwCi0KLS8vCi0vLyBFbnRyeSBudW1iZXIgZm9yIGVhY2ggRE1BIGRlc2NyaXB0b3IgcmluZwotLy8KLQotI2lmZGVmIFJUMjg2MAotI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA2NCAvLzY0Ci0jZGVmaW5lIE1HTVRfUklOR19TSVpFICAgICAgICAgIDEyOAotI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgICAgICAgICAxMjggLy82NAotI2RlZmluZSBNQVhfVFhfUFJPQ0VTUyAgICAgICAgICBUWF9SSU5HX1NJWkUgLy84Ci0jZGVmaW5lIE1BWF9ETUFfRE9ORV9QUk9DRVNTICAgIFRYX1JJTkdfU0laRQotI2RlZmluZSBNQVhfVFhfRE9ORV9QUk9DRVNTICAgICBUWF9SSU5HX1NJWkUgLy84Ci0jZGVmaW5lIExPQ0FMX1RYQlVGX1NJWkUgICAgICAgIDIKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgICAgICA4IC8vIDEKKyNpZmRlZiBSVE1QX01BQ19VU0IKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgICAgICAgOAkvKiAxICovCiAjZGVmaW5lIFBSSU9fUklOR19TSVpFICAgICAgICAgIDgKLSNkZWZpbmUgTUdNVF9SSU5HX1NJWkUgICAgICAgMzIgLy8gUFJJT19SSU5HX1NJWkUKKyNkZWZpbmUgTUdNVF9SSU5HX1NJWkUJCTMyCS8qIFBSSU9fUklOR19TSVpFICovCiAjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAgICAgIDgKICNkZWZpbmUgTUFYX1RYX1BST0NFU1MgICAgICAgICAgNAogI2RlZmluZSBMT0NBTF9UWEJVRl9TSVpFICAgICAgICAyMDQ4Ci0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLSNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4IC8vNjQgLy8zMgorLyojZGVmaW5lIFBBQ0tFRCAqLworCisjZGVmaW5lIFJBTElOS18yODgzX1ZFUlNJT04JCSgodTMyKTB4Mjg4MzAzMDApCisjZGVmaW5lIFJBTElOS18yODgwRV9WRVJTSU9OCSgodTMyKTB4Mjg3MjAyMDApCisjZGVmaW5lIFJBTElOS18zMDcwX1ZFUlNJT04JCSgodTMyKTB4MzA3MDAyMDApCisKKyNkZWZpbmUgTUFYX1JYX1BLVF9MRU4JMTUyMAorCisvKiAqLworLyogRW50cnkgbnVtYmVyIGZvciBlYWNoIERNQSBkZXNjcmlwdG9yIHJpbmcgKi8KKy8qICovCisKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgICAgICAgNjQJLyo2NCAqLworI2RlZmluZSBNR01UX1JJTkdfU0laRSAgICAgICAgICAxMjgKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgICAgICAgMTI4CS8qNjQgKi8KKyNkZWZpbmUgTUFYX1RYX1BST0NFU1MgICAgICAgICAgVFhfUklOR19TSVpFCS8qOCAqLworI2RlZmluZSBNQVhfRE1BX0RPTkVfUFJPQ0VTUyAgICBUWF9SSU5HX1NJWkUKKyNkZWZpbmUgTUFYX1RYX0RPTkVfUFJPQ0VTUyAgICAgVFhfUklOR19TSVpFCS8qOCAqLworI2RlZmluZSBMT0NBTF9UWEJVRl9TSVpFICAgICAgICAyCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKyNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4CS8qNjQgLy8zMiAqLwogI2RlZmluZSBOVU1fT0ZfTE9DQUxfVFhCVUYgICAgICAyCiAjZGVmaW5lIFRYRF9TSVpFICAgICAgICAgICAgICAgIDE2CiAjZGVmaW5lIFRYV0lfU0laRSAgICAgICAgICAgICAgIDE2CiAjZGVmaW5lIFJYRF9TSVpFICAgICAgICAgICAgICAgCTE2CiAjZGVmaW5lIFJYV0lfU0laRSAgICAgICAgICAgICAJMTYKLS8vIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgODAyLjExIEhlYWRlciBTaXplICsgQU1TRFUgc3ViIGZyYW1lIGhlYWRlcgotI2RlZmluZSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFICA5NiAgICAvLyBvbmx5IHRoZSAxc3QgcGh5c2ljYWwgYnVmZmVyIGlzIHByZS1hbGxvY2F0ZWQKLSNkZWZpbmUgTUdNVF9ETUFfQlVGRkVSX1NJWkUgICAgMTUzNiAvLzIwNDgKLSNkZWZpbmUgUlhfQlVGRkVSX0FHR1JFU0laRSAgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2Ci0jZGVmaW5lIFJYX0JVRkZFUl9OT1JNU0laRSAgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgorLyogVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyA4MDIuMTEgSGVhZGVyIFNpemUgKyBBTVNEVSBzdWIgZnJhbWUgaGVhZGVyICovCisjZGVmaW5lIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkUgIDk2CS8qIG9ubHkgdGhlIDFzdCBwaHlzaWNhbCBidWZmZXIgaXMgcHJlLWFsbG9jYXRlZCAqLworI2RlZmluZSBNR01UX0RNQV9CVUZGRVJfU0laRSAgICAxNTM2CS8qMjA0OCAqLworI2RlZmluZSBSWF9CVUZGRVJfQUdHUkVTSVpFICAgICAzODQwCS8qMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYgKi8KKyNkZWZpbmUgUlhfQlVGRkVSX05PUk1TSVpFICAgICAgMzg0MAkvKjM5MDQgLy8zOTY4IC8vNDA5NiAvLzIwNDggLy80MDk2ICovCiAjZGVmaW5lIFRYX0JVRkZFUl9OT1JNU0laRQkJUlhfQlVGRkVSX05PUk1TSVpFCi0jZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAgICAgICAgIDIzNDYgICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gODAyLjExIGZyYW1lIHNpemUKLSNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX1NJWkUgICAgMzg0MCAvLzM5MDQgLy8zOTY4IC8vNDA5NgorI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgICAgICAgICAyMzQ2CS8qIE1heGltdW0gODAyLjExIGZyYW1lIHNpemUgKi8KKyNkZWZpbmUgTUFYX0FHR1JFR0FUSU9OX1NJWkUgICAgMzg0MAkvKjM5MDQgLy8zOTY4IC8vNDA5NiAqLwogI2RlZmluZSBNQVhfTlVNX09GX1RVUExFX0NBQ0hFICAyCiAjZGVmaW5lIE1BWF9NQ0FTVF9MSVNUX1NJWkUgICAgIDMyCiAjZGVmaW5lIE1BWF9MRU5fT0ZfVkVORE9SX0RFU0MgIDY0Ci0vLyNkZWZpbmUgTUFYX1NJWkVfT0ZfTUNBU1RfUFNRICAgKE5VTV9PRl9MT0NBTF9UWEJVRiA+PiAyKSAvLyBBUCB3b24ndCBzcGVuZCBtb3JlIHRoYW4gMS80IG9mIHRvdGFsIGJ1ZmZlcnMgb24gTS9CQ0FTVCBQU1EKKy8qI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAoTlVNX09GX0xPQ0FMX1RYQlVGID4+IDIpIC8vIEFQIHdvbid0IHNwZW5kIG1vcmUgdGhhbiAxLzQgb2YgdG90YWwgYnVmZmVycyBvbiBNL0JDQVNUIFBTUSAqLwogI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAgICAgICAgICAgICAzMgogCiAjZGVmaW5lIE1BWF9SWF9QUk9DRVNTX0NOVAkoUlhfUklOR19TSVpFKQogCisvKgorCVdNTSBOb3RlOiBJZiBtZW1vcnkgb2YgeW91ciBzeXN0ZW0gaXMgbm90IG11Y2gsIHBsZWFzZSByZWR1Y2UgdGhlIGRlZmluaXRpb247CisJb3Igd2hlbiB5b3UgZG8gV01NIHRlc3QsIHRoZSBxdWV1ZSBmb3IgbG93IHByaW9yaXR5IEFDIHdpbGwgYmUgZnVsbCwgaS5lLgorCVRYX1JJTkdfU0laRSArIE1BWF9QQUNLRVRTX0lOX1FVRVVFIHBhY2tldHMgZm9yIHRoZSBBQyB3aWxsIGJlIGJ1ZmZlcmVkIGluCisJV0xBTiwgbWF5YmUgbm8gYW55IHBhY2tldCBidWZmZXIgY2FuIGJlIGdvdCBpbiBFdGhlcm5ldCBkcml2ZXIuCiAKLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUVVFVUUJCQkJKDUxMikgLy8oNTEyKSAgICAvLyB0byBwYXNzIFdNTSBBNS1XUEFQU0sKKwlTb21ldGltZXMgbm8gcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlciwgdGhlIHN5c3RlbSB3aWxsCisJc2VuZCBmbG93IGNvbnRyb2wgcGFja2V0IHRvIHRoZSBzZW5kZXIgdG8gc2xvdyBkb3duIGl0cyBzZW5kaW5nIHJhdGUuCisJU28gbm8gV01NIGNhbiBiZSBzYXcgaW4gdGhlIGFpci4KKyovCisKKy8qCisJTmVlZCB0byB1c2UgNjQgaW4gdnh3b3JrcyBmb3IgdGVzdCBjYXNlIFdNTSBBNS1UMDcKKwlUd28gZG5saW5rICgxME1icHMpIGZyb20gYSBXTU0gc3RhdGlvbiB0byBhIG5vbi1XTU0gc3RhdGlvbi4KKwlJZiB1c2UgMjU2LCBxdWV1ZSBpcyBub3QgZW5vdWdoLgorCUFuZCBpbiBydF9tYWluX2VuZC5jLCBjbENvbmZpZy5jbE51bSA9IFJYX1JJTkdfU0laRSAqIDM7IGlzIGNoYW5nZWQgdG8KKwljbENvbmZpZy5jbE51bSA9IFJYX1JJTkdfU0laRSAqIDQ7CisqLworLyogVE9ETzogRm9yIFZ4V29ya3MgdGhlIHNpemUgaXMgMjU2LiBTaGFsbCB3ZSBjYWhuZ2UgdGhlIHZhbHVlIGFzIDI1NiBmb3IgYWxsIE9TPz8/Pz8gKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUVVFVUUJCQkJKDUxMikJLyooNTEyKSAgICAvLyB0byBwYXNzIFdNTSBBNS1XUEFQU0sgKi8KKwogI2RlZmluZSBNQVhfUEFDS0VUU19JTl9NQ0FTVF9QU19RVUVVRQkJMzIKLSNkZWZpbmUgTUFYX1BBQ0tFVFNfSU5fUFNfUVVFVUUJCQkJMTI4CS8vMzIKLSNkZWZpbmUgV01NX05VTV9PRl9BQyAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogQUMwLCBBQzEsIEFDMiwgYW5kIEFDMyAqLworI2RlZmluZSBNQVhfUEFDS0VUU19JTl9QU19RVUVVRQkJCQkxMjgJLyozMiAqLworI2RlZmluZSBXTU1fTlVNX09GX0FDICAgICAgICAgICAgICAgICAgICAgICA0CS8qIEFDMCwgQUMxLCBBQzIsIGFuZCBBQzMgKi8KIAorI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAorLyoyMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tICovCiAjZGVmaW5lIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRQkJCQkJMTAyNAorI2RlZmluZSBFRlVTRV9CVUZGRVJfUEFUSAkJCQkJCSIvdG1wL1JUMzB4eEVFUFJPTS5iaW4iCisvKjIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4gKi8KKyNlbmRpZiAvKiBSVE1QX0VGVVNFX1NVUFBPUlQgLy8gKi8KIAotLy8gUnhGaWx0ZXIKKy8qIFJ4RmlsdGVyICovCiAjZGVmaW5lIFNUQU5PUk1BTAkgMHgxN2Y5NwogI2RlZmluZSBBUE5PUk1BTAkgMHgxNWY5NwotLy8KLS8vICBSVE1QX0FEQVBURVIgZmxhZ3MKLS8vCisjZGVmaW5lIFBTUFhMSU5LCSAweDE3ZjkzCisvKiAqLworLyogIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgZmxhZ3MgKi8KKy8qICovCiAjZGVmaW5lIGZSVE1QX0FEQVBURVJfTUFQX1JFR0lTVEVSICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBmUlRNUF9BREFQVEVSX0hBUkRXQVJFX0VSUk9SICAgICAgICAweDAwMDAwMDA0CkBAIC0xODEsMTMgKzE3MSwxMyBAQAogI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQU5fMjA0MCAJCQkweDA0MDAwMDAwCiAjZGVmaW5lCWZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQJCTB4MDgwMDAwMDAKIAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NUQVJUX1VQICAgICAgICAgCQkweDEwMDAwMDAwCS8vRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguCisjZGVmaW5lIGZSVE1QX0FEQVBURVJfU1RBUlRfVVAgICAgICAgICAJCTB4MTAwMDAwMDAJLypEZXZpdmUgYWxyZWFkeSBpbml0aWFsaXplZCBhbmQgZW5hYmxlZCBUeC9SeC4gKi8KICNkZWZpbmUgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UgICAgMHgyMDAwMDAwMAogI2RlZmluZSBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGICAgICAgICAweDQwMDAwMDAwCiAKLS8vCi0vLyAgU1RBIG9wZXJhdGlvbiBzdGF0dXMgZmxhZ3MKLS8vCisvKiAqLworLyogIFNUQSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzICovCisvKiAqLwogI2RlZmluZSBmT1BfU1RBVFVTX0lORlJBX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIGZPUF9TVEFUVVNfQURIT0NfT04gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCAgICAgMHgwMDAwMDAwNApAQCAtMTk3LDI4ICsxODcsMzQgQEAKICNkZWZpbmUgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQgICAgMHgwMDAwMDA4MAogI2RlZmluZSBmT1BfU1RBVFVTX1dNTV9JTlVTRUQgICAgICAgICAgICAgICAweDAwMDAwMTAwCiAjZGVmaW5lIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19ET1pFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgLy8gZGVidWcgcHVycG9zZQotI2RlZmluZSBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQgICAgICAgICAweDAwMDAwODAwICAvLyBwaWdneS1iYWNrLCBhbmQgYWdncmVnYXRpb24KKyNkZWZpbmUgZk9QX1NUQVRVU19ET1pFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAkvKiBkZWJ1ZyBwdXJwb3NlICovCisjZGVmaW5lIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCAgICAgICAgIDB4MDAwMDA4MDAJLyogcGlnZ3ktYmFjaywgYW5kIGFnZ3JlZ2F0aW9uICovCiAjZGVmaW5lIGZPUF9TVEFUVVNfQVBTRF9JTlVTRUQJCQkJMHgwMDAwMTAwMAogI2RlZmluZSBmT1BfU1RBVFVTX1RYX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDIwMDAKICNkZWZpbmUgZk9QX1NUQVRVU19NQVhfUkVUUllfRU5BQkxFRAkJMHgwMDAwNDAwMAogI2RlZmluZSBmT1BfU1RBVFVTX1dBS0VVUF9OT1cgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UKIAotI2lmZGVmIFJUMjg2MAotLy8KLS8vICBSVE1QX0FEQVBURVIgUFNGbGFncyA6IHJlbGF0ZWQgdG8gYWR2YW5jZWQgcG93ZXIgc2F2ZS4KLS8vCi0vLyBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBjYW4gZ28gdG8gc2xlZXAgbW9kZSBmcm9tIG5vdy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBBRlRFUiBsaW5rIHVwCisvKiAqLworLyogIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgUFNGbGFncyA6IHJlbGF0ZWQgdG8gYWR2YW5jZWQgcG93ZXIgc2F2ZS4gKi8KKy8qICovCisvKiBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBjYW4gZ28gdG8gc2xlZXAgbW9kZSBmcm9tIG5vdy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBBRlRFUiBsaW5rIHVwICovCiAjZGVmaW5lIGZSVE1QX1BTX0NBTl9HT19TTEVFUCAgICAgICAgICAweDAwMDAwMDAxCi0vLyBJbmRpY2F0ZSB3aGV0aGVyIGRyaXZlciBoYXMgaXNzdWUgYSBMaW5rQ29udHJvbCBjb21tYW5kIHRvIFBDSWUgTDEKKy8qIEluZGljYXRlIHdoZXRoZXIgZHJpdmVyIGhhcyBpc3N1ZSBhIExpbmtDb250cm9sIGNvbW1hbmQgdG8gUENJZSBMMSAqLwogI2RlZmluZSBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCAgICAgICAgICAweDAwMDAwMDAyCi0vLyBJbmRpY2F0ZSBkcml2ZXIgc2hvdWxkIGRpc2FibGUga2ljayBvZmYgaGFyZHdhcmUgdG8gc2VuZCBwYWNrZXRzIGZyb20gbm93LgorLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGtpY2sgb2ZmIGhhcmR3YXJlIHRvIHNlbmQgcGFja2V0cyBmcm9tIG5vdy4gKi8KICNkZWZpbmUgZlJUTVBfUFNfRElTQUJMRV9UWCAgICAgICAgIDB4MDAwMDAwMDQKLS8vIEluZGljYXRlIGRyaXZlciBzaG91bGQgSU1NRURJQVRFTFkgZm8gdG8gc2xlZXAgYWZ0ZXIgcmVjZWl2aW5nIEFQJ3MgYmVhY29uIGluIHdoaWNoICBkb2Vzbid0IGluZGljYXRlIHVuaWNhdGUgbm9yIG11bHRpY2FzdCBwYWNrZXRzIGZvciBtZQotLy8uIFRoaXMgZmxhZyBpcyB1c2VkIE9OTFkgaW4gUlRNUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLgorLyogSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBJTU1FRElBVEVMWSBmbyB0byBzbGVlcCBhZnRlciByZWNlaXZpbmcgQVAncyBiZWFjb24gaW4gd2hpY2ggIGRvZXNuJ3QgaW5kaWNhdGUgdW5pY2F0ZSBub3IgbXVsdGljYXN0IHBhY2tldHMgZm9yIG1lICovCisvKi4gVGhpcyBmbGFnIGlzIHVzZWQgT05MWSBpbiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0IHJvdXRpbmUuICovCiAjZGVmaW5lIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyAgICAgICAgIDB4MDAwMDAwMDgKLSNlbmRpZgorI2RlZmluZSBmUlRNUF9QU19UT0dHTEVfTDEJCTB4MDAwMDAwMTAJLyogVXNlIFRvZ2dsZSBMMSBtZWNoYW5pc20gZm9yIHJ0Mjh4eCBQQ0llICovCisKKyNpZmRlZiBSVDMwOTAKKyNkZWZpbmUgV0FLRV9NQ1VfQ01ECQkJCTB4MzEKKyNkZWZpbmUgU0xFRVBfTUNVX0NNRAkJCQkJMHgzMAorI2RlZmluZSBSRk9GRl9NQ1VfQ01ECQkJCTB4MzUKKyNlbmRpZiAvKiBSVDMwOTAgLy8gKi8KIAogI2RlZmluZSBDQ0tTRVRQUk9URUNUCQkweDEKICNkZWZpbmUgT0ZETVNFVFBST1RFQ1QJCTB4MgpAQCAtMjI4LDEyICsyMjQsMTIgQEAKICNkZWZpbmUgR1I0MFNFVFBST1RFQ1QJCTB4MjAKICNkZWZpbmUgQUxMTl9TRVRQUk9URUNUCQkoR1I0MFNFVFBST1RFQ1QgfCBHRjIwU0VUUFJPVEVDVCB8IE1NNDBTRVRQUk9URUNUIHwgTU0yMFNFVFBST1RFQ1QpCiAKLS8vCi0vLyAgQVAncyBjbGllbnQgdGFibGUgb3BlcmF0aW9uIHN0YXR1cyBmbGFncwotLy8KLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUgICAgICAgICAgMHgwMDAwMDAwMSAgLy8gQ0xJRU5UIGNhbiBwYXJzZSBRT1MgREFUQSBmcmFtZQotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFICAweDAwMDAwMDAyICAvLyBDTElFTlQgY2FuIHJlY2VpdmUgUmFsaW5rJ3MgcHJvcHJpZXRhcnkgVFggYWdncmVnYXRpb24gZnJhbWUKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUgICAgMHgwMDAwMDAwNCAgLy8gQ0xJRU5UIHN1cHBvcnQgcGlnZ3ktYmFjaworLyogKi8KKy8qICBBUCdzIGNsaWVudCB0YWJsZSBvcGVyYXRpb24gc3RhdHVzIGZsYWdzICovCisvKiAqLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSAgICAgICAgICAweDAwMDAwMDAxCS8qIENMSUVOVCBjYW4gcGFyc2UgUU9TIERBVEEgZnJhbWUgKi8KKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSAgMHgwMDAwMDAwMgkvKiBDTElFTlQgY2FuIHJlY2VpdmUgUmFsaW5rJ3MgcHJvcHJpZXRhcnkgVFggYWdncmVnYXRpb24gZnJhbWUgKi8KKyNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUgICAgMHgwMDAwMDAwNAkvKiBDTElFTlQgc3VwcG9ydCBwaWdneS1iYWNrICovCiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDAwMDgKICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRQkJMHgwMDAwMDAxMAogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFCQkweDAwMDAwMDIwCkBAIC0yNDIsNDcgKzIzOCw0OCBAQAogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRQkJCTB4MDAwMDAxMDAKICNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUJCQkweDAwMDAwMjAwCiAjZGVmaW5lIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUgIDB4MDAwMDA0MDAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQVBTRF9DQVBBQkxFICAgICAgICAgMHgwMDAwMDgwMCAgLyogVUFQU0QgU1RBVElPTiAqLworI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BUFNEX0NBUEFCTEUgICAgICAgICAweDAwMDAwODAwCS8qIFVBUFNEIFNUQVRJT04gKi8KIAogI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVAkJMHgwMDEwMDAwMAotLy8KLS8vICBTVEEgY29uZmlndXJhdGlvbiBmbGFncwotLy8KKy8qICovCisvKiAgU1RBIGNvbmZpZ3VyYXRpb24gZmxhZ3MgKi8KKy8qICovCiAKLS8vIDgwMi4xMW4gT3BlcmF0aW5nIE1vZGUgRGVmaW5pdGlvbi4gMC0zIGFsc28gdXNlZCBpbiBBU0lDVVBkYXRlUHJvdGVjdCBzd2l0Y2ggY2FzZQorLyogODAyLjExbiBPcGVyYXRpbmcgTW9kZSBEZWZpbml0aW9uLiAwLTMgYWxzbyB1c2VkIGluIEFTSUNVUGRhdGVQcm90ZWN0IHN3aXRjaCBjYXNlICovCiAjZGVmaW5lIEhUX05PX1BST1RFQ1QJMAogI2RlZmluZSBIVF9MRUdBQ1lfUFJPVEVDVAkxCiAjZGVmaW5lIEhUXzQwX1BST1RFQ1QJMgogI2RlZmluZSBIVF8yMDQwX1BST1RFQ1QJMwogI2RlZmluZSBIVF9SVFNDVFNfNk0JNwotLy9mb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4KLSNkZWZpbmUgSFRfQVRIRVJPUwk4CS8vIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4KLSNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvLyBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LgorLypmb2xsb3dpbmcgaXMgb3VyIG93biBkZWZpbml0aW9uIGluIG9yZGVyIHRvIHR1cm4gb24gb3VyIEFTSUMgcHJvdGVjdGlvbiByZWdpc3RlciBpbiBJTkZSQVNUUlVDVFVSRS4gKi8KKyNkZWZpbmUgSFRfQVRIRVJPUwk4CS8qIHJ0Mjg2MGMgaGFzIHByb2JsZW0gd2l0aCBhdGhlcm9zIGNoaXAuIHdlIG5lZWQgdG8gdHVybiBvbiBSVFMvQ1RTIC4gKi8KKyNkZWZpbmUgSFRfRk9SQ0VSVFNDVFMJOQkvKiBGb3JjZSB0dXJuIG9uIFJUUy9DVFMgZmlyc3QuIHRoZW4gZ28gdG8gZXZhbHVhdGUgaWYgdGhpcyBmb3JjZSBSVFMgaXMgbmVjZXNzYXJ5LiAqLwogCi0vLwotLy8gUlggUGFja2V0IEZpbHRlciBjb250cm9sIGZsYWdzLiBBcHBseSBvbiBwQWQtPlBhY2tldEZpbHRlcgotLy8KKy8qICovCisvKiBSWCBQYWNrZXQgRmlsdGVyIGNvbnRyb2wgZmxhZ3MuIEFwcGx5IG9uIHBBZC0+UGFja2V0RmlsdGVyICovCisvKiAqLwogI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QgICAgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECiAjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCiAjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0JST0FEQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCiAjZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0FMTF9NVUxUSUNBU1QgICAgIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAorI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9QUk9NSVNDVU9VUyAgICAgICBORElTX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCiAKLS8vCi0vLyBFcnJvciBjb2RlIHNlY3Rpb24KLS8vCi0vLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9OT1RfRk9VTkQKKy8qICovCisvKiBFcnJvciBjb2RlIHNlY3Rpb24gKi8KKy8qICovCisvKiBORElTX0VSUk9SX0NPREVfQURBUFRFUl9OT1RfRk9VTkQgKi8KICNkZWZpbmUgRVJSTE9HX1JFQURfUENJX1NMT1RfRkFJTEVEICAgICAweDAwMDAwMTAxTAogI2RlZmluZSBFUlJMT0dfV1JJVEVfUENJX1NMT1RfRkFJTEVEICAgIDB4MDAwMDAxMDJMCiAjZGVmaW5lIEVSUkxPR19WRU5ET1JfREVWSUNFX05PTUFUQ0ggICAgMHgwMDAwMDEwM0wKIAotLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfRElTQUJMRUQKKy8qIE5ESVNfRVJST1JfQ09ERV9BREFQVEVSX0RJU0FCTEVEICovCiAjZGVmaW5lIEVSUkxPR19CVVNfTUFTVEVSX0RJU0FCTEVEICAgICAgMHgwMDAwMDIwMUwKIAotLy8gTkRJU19FUlJPUl9DT0RFX1VOU1VQUE9SVEVEX0NPTkZJR1VSQVRJT04KKy8qIE5ESVNfRVJST1JfQ09ERV9VTlNVUFBPUlRFRF9DT05GSUdVUkFUSU9OICovCiAjZGVmaW5lIEVSUkxPR19JTlZBTElEX1NQRUVEX0RVUExFWCAgICAgMHgwMDAwMDMwMUwKICNkZWZpbmUgRVJSTE9HX1NFVF9TRUNPTkRBUllfRkFJTEVEICAgICAweDAwMDAwMzAyTAogCi0vLyBORElTX0VSUk9SX0NPREVfT1VUX09GX1JFU09VUkNFUworLyogTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMgKi8KICNkZWZpbmUgRVJSTE9HX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAweDAwMDAwNDAxTAogI2RlZmluZSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlkgICAgIDB4MDAwMDA0MDJMCiAjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUFQX1JFR0lTVEVSUyAgICAgMHgwMDAwMDQwM0wKQEAgLTI5MiwyMiArMjg5LDIxIEBACiAjZGVmaW5lIEVSUkxPR19PVVRfT0ZfTkRJU19QQUNLRVQgICAgICAgMHgwMDAwMDQwN0wKICNkZWZpbmUgRVJSTE9HX09VVF9PRl9MT09LQVNJREVfTUVNT1JZICAweDAwMDAwNDA4TAogCi0vLyBORElTX0VSUk9SX0NPREVfSEFSRFdBUkVfRkFJTFVSRQorLyogTkRJU19FUlJPUl9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUgKi8KICNkZWZpbmUgRVJSTE9HX1NFTEZURVNUX0ZBSUxFRCAgICAgICAgICAweDAwMDAwNTAxTAogI2RlZmluZSBFUlJMT0dfSU5JVElBTElaRV9BREFQVEVSICAgICAgIDB4MDAwMDA1MDJMCiAjZGVmaW5lIEVSUkxPR19SRU1PVkVfTUlOSVBPUlQgICAgICAgICAgMHgwMDAwMDUwM0wKIAotLy8gTkRJU19FUlJPUl9DT0RFX1JFU09VUkNFX0NPTkZMSUNUCisvKiBORElTX0VSUk9SX0NPREVfUkVTT1VSQ0VfQ09ORkxJQ1QgKi8KICNkZWZpbmUgRVJSTE9HX01BUF9JT19TUEFDRSAgICAgICAgICAgICAweDAwMDAwNjAxTAogI2RlZmluZSBFUlJMT0dfUVVFUllfQURBUFRFUl9SRVNPVVJDRVMgIDB4MDAwMDA2MDJMCiAjZGVmaW5lIEVSUkxPR19OT19JT19SRVNPVVJDRSAgICAgICAgICAgMHgwMDAwMDYwM0wKICNkZWZpbmUgRVJSTE9HX05PX0lOVEVSUlVQVF9SRVNPVVJDRSAgICAweDAwMDAwNjA0TAogI2RlZmluZSBFUlJMT0dfTk9fTUVNT1JZX1JFU09VUkNFICAgICAgIDB4MDAwMDA2MDVMCiAKLQotLy8gV0RTIGRlZmluaXRpb24KKy8qIFdEUyBkZWZpbml0aW9uICovCiAjZGVmaW5lCU1BWF9XRFNfRU5UUlkgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICA2MCAgICAvLyBXRFMgbGlua3MgdXNlcyBwYWlyd2lzZSBrZXkjNjAgfiA2MyBpbiBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZQorI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAJLyogV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUgKi8KIAogI2RlZmluZQlXRFNfRElTQUJMRV9NT0RFICAgICAgICAgICAgMAogI2RlZmluZQlXRFNfUkVTVFJJQ1RfTU9ERSAgICAgICAgICAgMQpAQCAtMzE1LDIzICszMTEsMjAgQEAKICNkZWZpbmUJV0RTX1JFUEVBVEVSX01PREUgICAgICAgICAgIDMKICNkZWZpbmUJV0RTX0xBWllfTU9ERSAgICAgICAgICAgICAgIDQKIAotCiAjZGVmaW5lIE1BWF9NRVNIX05VTQkJCQkwCiAKICNkZWZpbmUgTUFYX0FQQ0xJX05VTQkJCQkwCiAKICNkZWZpbmUgTUFYX01CU1NJRF9OVU0JCQkJMQotI2lmIGRlZmluZWQoUlQyODYwKSB8fCBkZWZpbmVkKFJUMzB4eCkKICNpZmRlZiBNQlNTX1NVUFBPUlQKICN1bmRlZglNQVhfTUJTU0lEX05VTQogI2RlZmluZSBNQVhfTUJTU0lEX05VTQkJCQkoOCAtIE1BWF9NRVNIX05VTSAtIE1BWF9BUENMSV9OVU0pCi0jZW5kaWYgLy8gTUJTU19TVVBQT1JUIC8vCi0jZW5kaWYKKyNlbmRpZiAvKiBNQlNTX1NVUFBPUlQgLy8gKi8KIAogLyogc2FuaXR5IGNoZWNrIGZvciBhcGlkeCAqLwogI2RlZmluZSBNQlNTX01SX0FQSURYX1NBTklUWV9DSEVDSyhhcGlkeCkgXAogICAgIHsgaWYgKGFwaWR4ID4gTUFYX01CU1NJRF9OVU0pIHsgXAotICAgICAgICAgIHByaW50aygiJXM+IEVycm9yISBhcGlkeCA9ICVkID4gTUFYX01CU1NJRF9OVU0hXG4iLCBfX2Z1bmNfXywgYXBpZHgpOyBcCisgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM+IEVycm9yISBhcGlkeCA9ICVkID4gTUFYX01CU1NJRF9OVU0hXG4iLCBfX2Z1bmNfXywgYXBpZHgpKTsgXAogCSAgYXBpZHggPSBNQUlOX01CU1NJRDsgfSB9CiAKICNkZWZpbmUgVkFMSURfV0NJRChfd2NpZCkJKChfd2NpZCkgPiAwICYmIChfd2NpZCkgPCBNQVhfTEVOX09GX01BQ19UQUJMRSApCkBAIC0zMzksMTIgKzMzMiwxMSBAQAogI2RlZmluZSBNQUlOX01CU1NJRCAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBGSVJTVF9NQlNTSUQgICAgICAgICAgICAgICAgMQogCi0KICNkZWZpbmUgTUFYX0JFQUNPTl9TSVpFCQkJCTUxMgotLy8gSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDYsCi0vLyBpdCBzaGFsbCByZXNlcnZlIHNvbWUgV0NJRCBzcGFjZSh3Y2lkIDIyMn4yNTMpIGZvciBiZWFjb24gZnJhbWVzLgotLy8gLQl0aGVzZSB3Y2lkIDIzOH4yNTMgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNihyYTYpLgotLy8gLQl0aGVzZSB3Y2lkIDIyMn4yMzcgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNyhyYTcpLgorLyogSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDYsICovCisvKiBpdCBzaGFsbCByZXNlcnZlIHNvbWUgV0NJRCBzcGFjZSh3Y2lkIDIyMn4yNTMpIGZvciBiZWFjb24gZnJhbWVzLiAqLworLyogLSAgICB0aGVzZSB3Y2lkIDIzOH4yNTMgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNihyYTYpLiAqLworLyogLSAgICB0aGVzZSB3Y2lkIDIyMn4yMzcgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNyhyYTcpLiAqLwogI2lmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA4KQogI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIyMgogI2VsaWYgZGVmaW5lZChNQVhfTUJTU0lEX05VTSkgJiYgKE1BWF9NQlNTSURfTlVNID09IDcpCkBAIC0zNTMsMTcgKzM0NSwxNyBAQAogI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTI1NQogI2VuZGlmCiAKLS8vIFRoZW4gZGVkaWNhdGUgd2NpZCBvZiBERlMgYW5kIENhcnJpZXItU2Vuc2UuCisvKiBUaGVuIGRlZGljYXRlIHdjaWQgb2YgREZTIGFuZCBDYXJyaWVyLVNlbnNlLiAqLwogI2RlZmluZSBERlNfQ1RTX1dDSUQgCQkoSFdfUkVTRVJWRURfV0NJRCAtIDEpCiAjZGVmaW5lIENTX0NUU19XQ0lEIAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQogI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQogCi0vLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KLS8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgorLyogSWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhlIG1heGltdW0gYXZhaWxhYmxlIHdjaWQgZm9yIHRoZSBhc3NvY2lhdGVkIFNUQSBpcyAyMTEuICovCisvKiBJZiBNQVhfTUJTU0lEX05VTSBpcyA3LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIyOC4gKi8KICNkZWZpbmUgTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAkoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gTUFYX01CU1NJRF9OVU0gLSAxKQogCi0vLyBUWCBuZWVkIFdDSUQgdG8gZmluZCBDaXBoZXIgS2V5Ci0vLyB0aGVzZSB3Y2lkIDIxMiB+IDIxOSBhcmUgcmVzZXJ2ZWQgZm9yIGJjL21jIHBhY2tldHMgaWYgTUFYX01CU1NJRF9OVU0gaXMgOC4KKy8qIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkgKi8KKy8qIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LiAqLwogI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCiAJewkJCQkJCQkJCQlcCiAJCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXApAQCAtMzcxLDggKzM2Myw3IEBACiAKICNkZWZpbmUgSXNHcm91cEtleVdDSUQoX193Y2lkKSAoKChfX3djaWQpIDwgTEFTVF9TUEVDSUZJQ19XQ0lEKSAmJiAoKF9fd2NpZCkgPj0gKExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkpKSkKIAotCi0vLyBkZWZpbml0aW9uIHRvIHN1cHBvcnQgbXVsdGlwbGUgQlNTSUQKKy8qIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRCAqLwogI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgpAQCAtMzgyLDI2ICszNzMsMjYgQEAKICNkZWZpbmUgQlNTNiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CiAjZGVmaW5lIEJTUzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwogCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBMZW5ndGggZGVmaW5pdGlvbnMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiBMZW5ndGggZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgUEVFUl9LRVlfTk8gICAgICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIE1BQ19BRERSX0xFTiAgICAgICAgICAgICAgICAgICAgNgogI2RlZmluZSBUSU1FU1RBTVBfTEVOICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgICAgICBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotI2RlZmluZSBNQVhfTEVOX09GX0tFWSAgICAgICAgICAgICAgICAgIDMyICAgICAgLy8gMzIgb2N0ZXRzID09IDI1NiBiaXRzLCBSZWRlZmluZSBmb3IgV1BBCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQ0hBTk5FTFMgICAgICAgICAgICAgTUFYX05VTV9PRl9DSFMgICAgICAvLyAxNCBjaGFubmVscyBAMi40RyArICAxMkBVTklJICsgNCBATU1BQyArIDExIEBIaXBlckxBTjIgKyA3IEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgotI2RlZmluZSBNQVhfTlVNX09GXzExSkNIQU5ORUxTICAgICAgICAgICAgIDIwICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24KKyNkZWZpbmUgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMgICAgICBNQVhfTEVOR1RIX09GX1NVUFBPUlRfUkFURVMJLyogMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCAqLworI2RlZmluZSBNQVhfTEVOX09GX0tFWSAgICAgICAgICAgICAgICAgIDMyCS8qIDMyIG9jdGV0cyA9PSAyNTYgYml0cywgUmVkZWZpbmUgZm9yIFdQQSAqLworI2RlZmluZSBNQVhfTlVNX09GX0NIQU5ORUxTICAgICAgICAgICAgIE1BWF9OVU1fT0ZfQ0hTCS8qIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uICovCisjZGVmaW5lIE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFMgICAgICAgICAgICAgMjAJLyogMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24gKi8KICNkZWZpbmUgTUFYX0xFTl9PRl9TU0lEICAgICAgICAgICAgICAgICAzMgogI2RlZmluZSBDSVBIRVJfVEVYVF9MRU4gICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBIQVNIX1RBQkxFX1NJWkUgICAgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBNQVhfVklFX0xFTiAgICAgICAgICAgICAgICAgICAgIDEwMjQgICAvLyBOZXcgZm9yIFdQQSBjaXBoZXIgc3VpdGUgdmFyaWFibGUgSUUgc2l6ZXMuCisjZGVmaW5lIE1BWF9WSUVfTEVOICAgICAgICAgICAgICAgICAgICAgMTAyNAkvKiBOZXcgZm9yIFdQQSBjaXBoZXIgc3VpdGUgdmFyaWFibGUgSUUgc2l6ZXMuICovCiAjZGVmaW5lIE1BWF9TVVBQT1JUX01DUyAgICAgICAgICAgICAzMgorI2RlZmluZSBNQVhfTlVNX09GX0JCUF9MQVRDSCAgICAgICAgICAgICAxNDAKIAotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEFTSUMgV0NJRCBUYWJsZSBkZWZpbml0aW9uLgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgQlNTSURfV0NJRAkJMQkvLyBpbiBpbmZyYSBtb2RlLCBhbHdheXMgcHV0IGJzc2lkIHdpdGggdGhpcyBXQ0lECisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogQVNJQyBXQ0lEIFRhYmxlIGRlZmluaXRpb24uICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2RlZmluZSBCU1NJRF9XQ0lECQkxCS8qIGluIGluZnJhIG1vZGUsIGFsd2F5cyBwdXQgYnNzaWQgd2l0aCB0aGlzIFdDSUQgKi8KICNkZWZpbmUgTUNBU1RfV0NJRAkweDAKICNkZWZpbmUgQlNTME1jYXN0X1dDSUQJMHgwCiAjZGVmaW5lIEJTUzFNY2FzdF9XQ0lECTB4ZjgKQEAgLTQxNSwxMCArNDA2LDEwIEBACiAKICNkZWZpbmUgTUFYX05VTV9PRl9BQ0xfTElTVAkJCQlNQVhfTlVNQkVSX09GX0FDTAogCi0jZGVmaW5lIE1BWF9MRU5fT0ZfTUFDX1RBQkxFICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9NQUMgLy8gaWYgTUFYX01CU1NJRF9OVU0gaXMgOCwgdGhpcyB2YWx1ZSBjYW4ndCBiZSBsYXJnZXIgdGhhbiAyMTEKKyNkZWZpbmUgTUFYX0xFTl9PRl9NQUNfVEFCTEUgICAgICAgICAgICBNQVhfTlVNQkVSX09GX01BQwkvKiBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGlzIHZhbHVlIGNhbid0IGJlIGxhcmdlciB0aGFuIDIxMSAqLwogCiAjaWYgTUFYX0xFTl9PRl9NQUNfVEFCTEU+TUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRAotI2Vycm9yIE1BWF9MRU5fT0ZfTUFDX1RBQkxFIGNhbiBub3QgYmUgbGFyZ2VyIHRoYW4gTUFYX0FWQUlMQUJMRV9DTElFTlRfV0NJRCEhISEKKyNlcnJvciBNQVhfTEVOX09GX01BQ19UQUJMRSBjYW4gbm90IGJlIGxhcmdlciB0aGFuIE1BWF9BVkFJTEFCTEVfQ0xJRU5UX1dDSUQhCiAjZW5kaWYKIAogI2RlZmluZSBNQVhfTlVNX09GX1dEU19MSU5LX1BFUkJTU0lECSAgICAgICAgICAgIDMKQEAgLTQyOCw0MiArNDE5LDQxIEBACiAKICNkZWZpbmUgTlVNX09GX1RJRAkJCTgKICNkZWZpbmUgTUFYX0FJRF9CQSAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikJIC8vQmxvY2sgQUNLIHJlY2lwaWVudAotI2RlZmluZSBNQVhfTEVOX09GX0JBX09SSV9UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikvLyAgIChOVU1fT0ZfVElEKk1BWF9BSURfQkEgKyAzMikgICAvLyBCbG9jayBBQ0sgb3JpZ2luYXRvcgorI2RlZmluZSBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRSAgICAgICAgICAoKE5VTV9PRl9USUQgKiBNQVhfTEVOX09GX01BQ19UQUJMRSkvMikJLyogICAoTlVNX09GX1RJRCpNQVhfQUlEX0JBICsgMzIpICAgICAgICAvL0Jsb2NrIEFDSyByZWNpcGllbnQgKi8KKyNkZWZpbmUgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUgICAgICAgICAgKChOVU1fT0ZfVElEICogTUFYX0xFTl9PRl9NQUNfVEFCTEUpLzIpCS8qICAgKE5VTV9PRl9USUQqTUFYX0FJRF9CQSArIDMyKSAgIC8vIEJsb2NrIEFDSyBvcmlnaW5hdG9yICovCiAjZGVmaW5lIE1BWF9MRU5fT0ZfQlNTX1RBQkxFICAgICAgICAgICAgIDY0CiAjZGVmaW5lIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNCQkJIDUxMgogCi0vLyBrZXkgcmVsYXRlZCBkZWZpbml0aW9ucworLyoga2V5IHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgU0hBUkVfS0VZX05VTSAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1BWF9MRU5fT0ZfU0hBUkVfS0VZICAgICAgICAgICAgMTYgICAgLy8gYnl0ZSBjb3VudAotI2RlZmluZSBNQVhfTEVOX09GX1BFRVJfS0VZICAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKLSNkZWZpbmUgUEFJUldJU0VfS0VZX05VTSAgICAgICAgICAgICAgICA2NCAgICAvLyBpbiBNQUMgQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKKyNkZWZpbmUgTUFYX0xFTl9PRl9TSEFSRV9LRVkgICAgICAgICAgICAxNgkvKiBieXRlIGNvdW50ICovCisjZGVmaW5lIE1BWF9MRU5fT0ZfUEVFUl9LRVkgICAgICAgICAgICAgMTYJLyogYnl0ZSBjb3VudCAqLworI2RlZmluZSBQQUlSV0lTRV9LRVlfTlVNICAgICAgICAgICAgICAgIDY0CS8qIGluIE1BQyBBU0lDIHBhaXJ3aXNlIGtleSB0YWJsZSAqLwogI2RlZmluZSBHUk9VUF9LRVlfTlVNICAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgUE1LX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgICAgIDYwICAgIC8vIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCi0jZGVmaW5lCVBNS0lEX05PICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgLy8gTnVtYmVyIG9mIFBNS0lEIHNhdmVkIHN1cHBvcnRlZAorI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgICAgIDYwCS8qIFdEUyBsaW5rcyB1c2VzIHBhaXJ3aXNlIGtleSM2MCB+IDYzIGluIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlICovCisjZGVmaW5lCVBNS0lEX05PICAgICAgICAgICAgICAgICAgICAgICAgNAkvKiBOdW1iZXIgb2YgUE1LSUQgc2F2ZWQgc3VwcG9ydGVkICovCiAjZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9CVUZGRVIgICAgICAgICAgMjA0OAogCi0vLyBwb3dlciBzdGF0dXMgcmVsYXRlZCBkZWZpbml0aW9ucworLyogcG93ZXIgc3RhdHVzIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgUFdSX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIFBXUl9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBQV1JfTU1QUyAgICAgICAgICAgICAgICAgICAgICAgIDIJCQkvL01JTU8gcG93ZXIgc2F2ZQorI2RlZmluZSBQV1JfTU1QUyAgICAgICAgICAgICAgICAgICAgICAgIDIJLypNSU1PIHBvd2VyIHNhdmUgKi8KIAotLy8gQXV0aCBhbmQgQXNzb2MgbW9kZSByZWxhdGVkIGRlZmluaXRpb25zCisvKiBBdXRoIGFuZCBBc3NvYyBtb2RlIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIEFVVEhfTU9ERV9LRVkgICAgICAgICAgICAgICAgICAgMHgwMQogCi0vLyBCU1MgVHlwZSBkZWZpbml0aW9ucwotI2RlZmluZSBCU1NfQURIT0MgICAgICAgICAgICAgICAgICAgICAgIDAgIC8vID0gTmRpczgwMl8xMUlCU1MKLSNkZWZpbmUgQlNTX0lORlJBICAgICAgICAgICAgICAgICAgICAgICAxICAvLyA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZQotI2RlZmluZSBCU1NfQU5ZICAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8vID0gTmRpczgwMl8xMUF1dG9Vbmtub3duCi0jZGVmaW5lIEJTU19NT05JVE9SCQkJICAgICAgICAgICAgMyAgLy8gPSBOZGlzODAyXzExTW9uaXRvcgorLyogQlNTIFR5cGUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQlNTX0FESE9DICAgICAgICAgICAgICAgICAgICAgICAwCS8qID0gTmRpczgwMl8xMUlCU1MgKi8KKyNkZWZpbmUgQlNTX0lORlJBICAgICAgICAgICAgICAgICAgICAgICAxCS8qID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlICovCisjZGVmaW5lIEJTU19BTlkgICAgICAgICAgICAgICAgICAgICAgICAgMgkvKiA9IE5kaXM4MDJfMTFBdXRvVW5rbm93biAqLworI2RlZmluZSBCU1NfTU9OSVRPUgkJCSAgICAgICAgICAgIDMJLyogPSBOZGlzODAyXzExTW9uaXRvciAqLwogCi0KLS8vIFJlYXNvbiBjb2RlIGRlZmluaXRpb25zCisvKiBSZWFzb24gY29kZSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBSRUFTT05fUkVTRVJWRUQgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgUkVBU09OX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFJFQVNPTl9OT19MT05HRVJfVkFMSUQgICAgICAgICAgMgorI2RlZmluZSBSRUFTT05fTk9fbG9uZ0VSX1ZBTElEICAgICAgICAgIDIKICNkZWZpbmUgUkVBU09OX0RFQVVUSF9TVEFfTEVBVklORyAgICAgICAzCiAjZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19JTkFDVElWRSAgICAgICAgNAogI2RlZmluZSBSRUFTT05fRElTQVNTUENfQVBfVU5BQkxFICAgICAgIDUKQEAgLTQ5NSw3ICs0ODUsNyBAQAogI2RlZmluZSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVCAgICAgICAgMzkKICNkZWZpbmUgUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQgICAgIDQ1CiAKLS8vIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zCisvKiBTdGF0dXMgY29kZSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBNTE1FX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTUxNRV9VTlNQRUNJRllfRkFJTCAgICAgICAgICAgICAxCiAjZGVmaW5lIE1MTUVfQ0FOTk9UX1NVUFBPUlRfQ0FQICAgICAgICAgMTAKQEAgLTUxNSw2ICs1MDUsOSBAQAogI2RlZmluZSBNTE1FX1FPU19VTlNQRUNJRlkgICAgICAgICAgICAgICAgMzIKICNkZWZpbmUgTUxNRV9SRVFVRVNUX0RFQ0xJTkVEICAgICAgICAgICAgIDM3CiAjZGVmaW5lIE1MTUVfUkVRVUVTVF9XSVRIX0lOVkFMSURfUEFSQU0gICAzOAorI2RlZmluZSBNTE1FX0lOVkFMSURfR1JPVVBfQ0lQSEVSCSAgNDEKKyNkZWZpbmUgTUxNRV9JTlZBTElEX1BBSVJXSVNFX0NJUEhFUgkgIDQyCisjZGVmaW5lIE1MTUVfSU5WQUxJRF9BS01QCQkJICA0MwogI2RlZmluZSBNTE1FX0RMU19OT1RfQUxMT1dfSU5fUUJTUyAgICAgICAgNDgKICNkZWZpbmUgTUxNRV9ERVNUX1NUQV9OT1RfSU5fUUJTUyAgICAgICAgIDQ5CiAjZGVmaW5lIE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQSAgICAgICA1MApAQCAtNTI0LDcgKzUxNyw3IEBACiAjZGVmaW5lIE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1QgICAgICAgMHg1MwogI2RlZmluZSBNTE1FX01BQ19UQUJMRV9GQUlMICAgICAgICAgICAgIDB4NTQKIAotLy8gSUUgY29kZQorLyogSUUgY29kZSAqLwogI2RlZmluZSBJRV9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgSUVfU1VQUF9SQVRFUyAgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIElFX0ZIX1BBUk0gICAgICAgICAgICAgICAgICAgICAgMgpAQCAtNTMyLDk0ICs1MjUsOTUgQEAKICNkZWZpbmUgSUVfQ0ZfUEFSTSAgICAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIElFX1RJTSAgICAgICAgICAgICAgICAgICAgICAgICAgNQogI2RlZmluZSBJRV9JQlNTX1BBUk0gICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgSUVfQ09VTlRSWSAgICAgICAgICAgICAgICAgICAgICA3ICAgICAvLyA4MDIuMTFkCi0jZGVmaW5lIElFXzgwMl8xMURfUkVRVUVTVCAgICAgICAgICAgICAgMTAgICAgLy8gODAyLjExZAotI2RlZmluZSBJRV9RQlNTX0xPQUQgICAgICAgICAgICAgICAgICAgIDExICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfRURDQV9QQVJBTUVURVIgICAgICAgICAgICAgICAxMiAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1RTUEVDICAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9UQ0xBUyAgICAgICAgICAgICAgICAgICAgICAgIDE0ICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICAxNSAgICAvLyA4MDIuMTFlIGQ5CisjZGVmaW5lIElFX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgICAgNwkvKiA4MDIuMTFkICovCisjZGVmaW5lIElFXzgwMl8xMURfUkVRVUVTVCAgICAgICAgICAgICAgMTAJLyogODAyLjExZCAqLworI2RlZmluZSBJRV9RQlNTX0xPQUQgICAgICAgICAgICAgICAgICAgIDExCS8qIDgwMi4xMWUgZDkgKi8KKyNkZWZpbmUgSUVfRURDQV9QQVJBTUVURVIgICAgICAgICAgICAgICAxMgkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIElFX1RTUEVDICAgICAgICAgICAgICAgICAgICAgICAgMTMJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBJRV9UQ0xBUyAgICAgICAgICAgICAgICAgICAgICAgIDE0CS8qIDgwMi4xMWUgZDkgKi8KKyNkZWZpbmUgSUVfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICAxNQkvKiA4MDIuMTFlIGQ5ICovCiAjZGVmaW5lIElFX0NIQUxMRU5HRV9URVhUICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSUVfUE9XRVJfQ09OU1RSQUlOVCAgICAgICAgICAgICAzMiAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfUE9XRVJfQ0FQQUJJTElUWSAgICAgICAgICAgICAzMyAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfVFBDX1JFUVVFU1QgICAgICAgICAgICAgICAgICAzNCAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfVFBDX1JFUE9SVCAgICAgICAgICAgICAgICAgICAzNSAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfU1VQUF9DSEFOTkVMUyAgICAgICAgICAgICAgICAzNiAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UICAzNyAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVCAgICAgICAgICAzOCAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfUkVQT1JUICAgICAgICAgICAzOSAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfUVVJRVQgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfSUJTU19ERlMgICAgICAgICAgICAgICAgICAgICA0MSAgICAvLyA4MDIuMTFoIGQzLjMKLSNkZWZpbmUgSUVfRVJQICAgICAgICAgICAgICAgICAgICAgICAgICA0MiAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIElFX1RTX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNDMgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9UQ0xBU19QUk9DRVNTSU5HICAgICAgICAgICAgIDQ0ICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfUU9TX0NBUEFCSUxJVFkgICAgICAgICAgICAgICA0NiAgICAvLyA4MDIuMTFlIGQ2Ci0jZGVmaW5lIElFX0hUX0NBUCAgICAgICAgICAgICAgICAgICAgICAgNDUgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKLSNkZWZpbmUgSUVfQVBfQ0hBTk5FTF9SRVBPUlQJCQk1MSAgICAvLyA4MDIuMTFrIGQ2Ci0jZGVmaW5lIElFX0hUX0NBUDIgICAgICAgICAgICAgICAgICAgICAgICAgNTIgICAgLy8gODAyLjExbiBkMS4gSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKLSNkZWZpbmUgSUVfUlNOICAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyA4MDIuMTFpIGQzLjAKLSNkZWZpbmUgSUVfV1BBMiAgICAgICAgICAgICAgICAgICAgICAgICA0OCAgICAvLyBXUEEyCi0jZGVmaW5lIElFX0VYVF9TVVBQX1JBVEVTICAgICAgICAgICAgICAgNTAgICAgLy8gODAyLjExZwotI2RlZmluZSBJRV9TVVBQX1JFR19DTEFTUyAgICAgICAgICAgICAgIDU5ICAgIC8vIDgwMi4xMXkuIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzZXMuCi0jZGVmaW5lIElFX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQJNjAJLy8gODAyLjExbgotI2RlZmluZSBJRV9BRERfSFQgICAgICAgICAgICAgICAgICAgICAgICAgNjEgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAotI2RlZmluZSBJRV9BRERfSFQyICAgICAgICAgICAgICAgICAgICAgICAgNTMgICAgLy8gODAyLjExbiBkMS4gQURESVRJT05BTCBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRAorI2RlZmluZSBJRV9QT1dFUl9DT05TVFJBaW50ICAgICAgICAgICAgIDMyCS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9QT1dFUl9DQVBBQklMSVRZICAgICAgICAgICAgIDMzCS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9UUENfUkVRVUVTVCAgICAgICAgICAgICAgICAgIDM0CS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9UUENfUkVQT1JUICAgICAgICAgICAgICAgICAgIDM1CS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9TVVBQX0NIQU5ORUxTICAgICAgICAgICAgICAgIDM2CS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlQgIDM3CS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUICAgICAgICAgIDM4CS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQgICAgICAgICAgIDM5CS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9RVUlFVCAgICAgICAgICAgICAgICAgICAgICAgIDQwCS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9JQlNTX0RGUyAgICAgICAgICAgICAgICAgICAgIDQxCS8qIDgwMi4xMWggZDMuMyAqLworI2RlZmluZSBJRV9FUlAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyCS8qIDgwMi4xMWcgKi8KKyNkZWZpbmUgSUVfVFNfREVMQVkgICAgICAgICAgICAgICAgICAgICA0MwkvKiA4MDIuMTFlIGQ5ICovCisjZGVmaW5lIElFX1RDTEFTX1BST0NFU1NJTkcgICAgICAgICAgICAgNDQJLyogODAyLjExZSBkOSAqLworI2RlZmluZSBJRV9RT1NfQ0FQQUJJTElUWSAgICAgICAgICAgICAgIDQ2CS8qIDgwMi4xMWUgZDYgKi8KKyNkZWZpbmUgSUVfSFRfQ0FQICAgICAgICAgICAgICAgICAgICAgICA0NQkvKiA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRCAqLworI2RlZmluZSBJRV9BUF9DSEFOTkVMX1JFUE9SVAkJCTUxCS8qIDgwMi4xMWsgZDYgKi8KKyNkZWZpbmUgSUVfSFRfQ0FQMiAgICAgICAgICAgICAgICAgICAgICAgICA1MgkvKiA4MDIuMTFuIGQxLiBIVCBDQVBBQklMSVRZLiBFTEVNRU5UIElEIFRCRCAqLworI2RlZmluZSBJRV9SU04gICAgICAgICAgICAgICAgICAgICAgICAgIDQ4CS8qIDgwMi4xMWkgZDMuMCAqLworI2RlZmluZSBJRV9XUEEyICAgICAgICAgICAgICAgICAgICAgICAgIDQ4CS8qIFdQQTIgKi8KKyNkZWZpbmUgSUVfRVhUX1NVUFBfUkFURVMgICAgICAgICAgICAgICA1MAkvKiA4MDIuMTFnICovCisjZGVmaW5lIElFX1NVUFBfUkVHX0NMQVNTICAgICAgICAgICAgICAgNTkJLyogODAyLjExeS4gU3VwcG9ydGVkIHJlZ3VsYXRvcnkgY2xhc3Nlcy4gKi8KKyNkZWZpbmUgSUVfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVAk2MAkvKiA4MDIuMTFuICovCisjZGVmaW5lIElFX0FERF9IVCAgICAgICAgICAgICAgICAgICAgICAgICA2MQkvKiA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJEICovCisjZGVmaW5lIElFX0FERF9IVDIgICAgICAgICAgICAgICAgICAgICAgICA1MwkvKiA4MDIuMTFuIGQxLiBBRERJVElPTkFMIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJEICovCiAKKy8qIEZvciA4MDIuMTFuIEQzLjAzICovCisvKiNkZWZpbmUgSUVfTkVXX0VYVF9DSEFfT0ZGU0VUICAgICAgICAgICAgIDYyICAgIC8vIDgwMi4xMW4gZDEuIE5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgZWxlbWV0ICovCisjZGVmaW5lIElFX1NFQ09OREFSWV9DSF9PRkZTRVQJCTYyCS8qIDgwMi4xMW4gRDMuMDMgICAgICAgIFNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50ICovCisjZGVmaW5lIElFX1dBUEkJCQkJCQkJNjgJLyogV0FQSSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisjZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MgkvKiA4MDIuMTFuIEQzLjAuMyAqLworI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMJLyogODAyLjExbiBEMy4wMyAqLworI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQJLyogODAyLjExbiBEMy4wMyAqLworI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcJLyogODAyLjExbiBEMy4wMyAqLwogCi0vLyBGb3IgODAyLjExbiBEMy4wMwotLy8jZGVmaW5lIElFX05FV19FWFRfQ0hBX09GRlNFVCAgICAgICAgICAgICA2MiAgICAvLyA4MDIuMTFuIGQxLiBOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IGVsZW1ldAotI2RlZmluZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUCQk2MgkvLyA4MDIuMTFuIEQzLjAzCVNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50Ci0jZGVmaW5lIElFXzIwNDBfQlNTX0NPRVhJU1QgICAgICAgICAgICAgICA3MiAgICAvLyA4MDIuMTFuIEQzLjAuMwotI2RlZmluZSBJRV8yMDQwX0JTU19JTlRPTEVSQU5UX1JFUE9SVCAgICAgNzMgICAgLy8gODAyLjExbiBEMy4wMwotI2RlZmluZSBJRV9PVkVSTEFQQlNTX1NDQU5fUEFSTSAgICAgICAgICAgNzQgICAgLy8gODAyLjExbiBEMy4wMwotI2RlZmluZSBJRV9FWFRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAxMjcgICAvLyA4MDIuMTFuIEQzLjAzCisjZGVmaW5lIElFX1dQQSAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxCS8qIFdQQSAqLworI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMQkvKiBXaWZpIFdNTSAoV01FKSAqLwogCisjZGVmaW5lIE9VSV9CUk9BRENPTV9IVCAgICAgICAgICAgICAgNTEJLyogKi8KKyNkZWZpbmUgT1VJX0JST0FEQ09NX0hUQUREICAgICAgICAgICAgICA1MgkvKiAqLworI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxCS8qICovCisjZGVmaW5lIE9VSV9QUkVOX0FERF9IVCAgICAgICAgICAgICAgNTIJLyogKi8KIAotI2RlZmluZSBJRV9XUEEgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMSAgIC8vIFdQQQotI2RlZmluZSBJRV9WRU5ET1JfU1BFQ0lGSUMgICAgICAgICAgICAgIDIyMSAgIC8vIFdpZmkgV01NIChXTUUpCi0KLSNkZWZpbmUgT1VJX0JST0FEQ09NX0hUICAgICAgICAgICAgICA1MSAgIC8vCi0jZGVmaW5lIE9VSV9CUk9BRENPTV9IVEFERCAgICAgICAgICAgICAgNTIgICAvLwotI2RlZmluZSBPVUlfUFJFTl9IVF9DQVAgICAgICAgICAgICAgIDUxICAgLy8KLSNkZWZpbmUgT1VJX1BSRU5fQUREX0hUICAgICAgICAgICAgICA1MiAgIC8vCi0KLS8vIENDWCBpbmZvcm1hdGlvbgotI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMyAgIC8vIENDWDEuMCBJRCA4NUggZm9yIENLSVAKLSNkZWZpbmUgSUVfQVBfVFhfUE9XRVIgICAgICAgICAgICAgICAgICAxNTAgICAvLyBDQ1ggMi4wIGZvciBBUCB0cmFuc21pdCBwb3dlcgotI2RlZmluZSBJRV9NRUFTVVJFTUVOVF9DQVBBQklMSVRZICAgICAgIDIyMSAgIC8vIENDWCAyLjAKKy8qIENDWCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBJRV9BSVJPTkVUX0NLSVAgICAgICAgICAgICAgICAgIDEzMwkvKiBDQ1gxLjAgSUQgODVIIGZvciBDS0lQICovCisjZGVmaW5lIElFX0FQX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgMTUwCS8qIENDWCAyLjAgZm9yIEFQIHRyYW5zbWl0IHBvd2VyICovCisjZGVmaW5lIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFkgICAgICAgMjIxCS8qIENDWCAyLjAgKi8KICNkZWZpbmUgSUVfQ0NYX1YyICAgICAgICAgICAgICAgICAgICAgICAyMjEKLSNkZWZpbmUgSUVfQUlST05FVF9JUEFERFJFU1MgICAgICAgICAgICAxNDkgICAvLyBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzCi0jZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2ICAgLy8gQ0NYIElEIDlDSCBmb3IgQ0NLTSBSZWFzc29jaWF0aW9uIFJlcXVlc3QgZWxlbWVudAorI2RlZmluZSBJRV9BSVJPTkVUX0lQQUREUkVTUyAgICAgICAgICAgIDE0OQkvKiBDQ1ggSUQgOTVIIGZvciBJUCBBZGRyZXNzICovCisjZGVmaW5lIElFX0FJUk9ORVRfQ0NLTVJFQVNTT0MgICAgICAgICAgMTU2CS8qIENDWCBJRCA5Q0ggZm9yIENDS00gUmVhc3NvY2lhdGlvbiBSZXF1ZXN0IGVsZW1lbnQgKi8KICNkZWZpbmUgQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggICAgICAgICAzMAogI2RlZmluZSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEggICAgICAgIDEwCiAjZGVmaW5lIEFJUk9ORVRfQ0NLTVJFQVNTT0NfTEVOR1RIICAgICAgMjQKIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE1MTUUgc3RhdGUgbWFjaGluZSBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIE1MTUUgc3RhdGUgbWFjaGluZSBkZWZpbml0aW9uICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0vLyBTVEEgTUxNRSBzdGF0ZSBtYWhjaW5lcworLyogU1RBIE1MTUUgc3RhdGUgbWFoY2luZXMgKi8KICNkZWZpbmUgQVNTT0NfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAxCiAjZGVmaW5lIEFVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgMgogI2RlZmluZSBBVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgICAgIDMKICNkZWZpbmUgU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgICA0CiAjZGVmaW5lIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgNQogI2RlZmluZSBXUEFfUFNLX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDYKLSNkZWZpbmUgTEVBUF9TVEFURV9NQUNISU5FICAgICAgICAgICAgICA3CisvKiNkZWZpbmUgTEVBUF9TVEFURV9NQUNISU5FICAgICAgICAgICAgICA3ICovCiAjZGVmaW5lIEFJUk9ORVRfU1RBVEVfTUFDSElORSAgICAgICAgICAgOAogI2RlZmluZSBBQ1RJT05fU1RBVEVfTUFDSElORSAgICAgICAgICAgOQogCi0vLyBBUCBNTE1FIHN0YXRlIG1hY2hpbmVzCisvKiBBUCBNTE1FIHN0YXRlIG1hY2hpbmVzICovCiAjZGVmaW5lIEFQX0FTU09DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgMTEKICNkZWZpbmUgQVBfQVVUSF9TVEFURV9NQUNISU5FICAgICAgICAgICAxMgotI2RlZmluZSBBUF9BVVRIX1JTUF9TVEFURV9NQUNISU5FICAgICAgIDEzCiAjZGVmaW5lIEFQX1NZTkNfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTQKICNkZWZpbmUgQVBfQ05UTF9TVEFURV9NQUNISU5FICAgICAgICAgICAxNQotI2RlZmluZSBBUF9XUEFfU1RBVEVfTUFDSElORSAgICAgICAgICAgIDE2CisjZGVmaW5lIFdTQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgMTcKKyNkZWZpbmUgV1NDX1VQTlBfU1RBVEVfTUFDSElORQkJICAgIDE4CiAKLS8vCi0vLyBTVEEncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisjZGVmaW5lIFdQQV9TVEFURV9NQUNISU5FCQkJMjMKKworLyogKi8KKy8qIFNUQSdzIENPTlRST0wvQ09OTkVDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQ05UTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIENOVExfV0FJVF9ESVNBU1NPQyAgICAgICAgICAgICAgMQogI2RlZmluZSBDTlRMX1dBSVRfSk9JTiAgICAgICAgICAgICAgICAgIDIKQEAgLTYzMCw5ICs2MjQsOSBAQAogI2RlZmluZSBDTlRMX1dBSVRfQVVUSDIgICAgICAgICAgICAgICAgIDcKICNkZWZpbmUgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU4gICAgICAgICA4CiAjZGVmaW5lIENOVExfV0FJVF9PSURfRElTQVNTT0MgICAgICAgICAgOQotI2lmZGVmIFJUMjg3MAorI2lmZGVmIFJUTVBfTUFDX1VTQgogI2RlZmluZSBDTlRMX1dBSVRfU0NBTl9GT1JfQ09OTkVDVCAgICAgIDEwCi0jZW5kaWYgLy8gUlQyODcwIC8vCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKICNkZWZpbmUgTVQyX0FTU09DX0NPTkYgICAgICAgICAgICAgICAgICAzNAogI2RlZmluZSBNVDJfQVVUSF9DT05GICAgICAgICAgICAgICAgICAgIDM1CkBAIC02NDYsMTMgKzY0MCwxNCBAQAogI2RlZmluZSBNVDJfR0VUX0NPTkYgICAgICAgICAgICAgICAgICAgIDQzCiAjZGVmaW5lIE1UMl9TRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDQKICNkZWZpbmUgTVQyX1JFU0VUX0NPTkYgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBNVDJfRlRfT1REX0NPTkYJCQkJCTQ2CiAjZGVmaW5lIE1UMl9NTE1FX1JPQU1JTkdfUkVRICAgICAgICAgICAgNTIKIAogI2RlZmluZSBDTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIDEKIAotLy8KLS8vIFNUQSdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIFNUQSdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBU1NPQ19JRExFICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIFJFQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAgMgpAQCAtNjc1LDI0ICs2NzAsMjYgQEAKIAogI2RlZmluZSBBU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAgIChNQVhfQVNTT0NfU1RBVEUgKiBNQVhfQVNTT0NfTVNHKQogCi0vLwotLy8gQUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIEFDVCBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQUNUX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBNQVhfQUNUX1NUQVRFICAgICAgICAgICAgICAgICAxCiAKICNkZWZpbmUgQUNUX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAgMAogCi0vL1Rob3NlIFBFRVJfeHhfQ0FURSBudW1iZXIgaXMgYmFzZWQgb24gcmVhbCBDYXRlZ2FyeSB2YWx1ZSBpbiBJRUVFIHNwZWMuIFBsZWFzZSBkb24nZXMgbW9kaWZ5IGl0IGJ5IHlvdXIgc2VsZi4KLS8vQ2F0ZWdvcnkKKy8qVGhvc2UgUEVFUl94eF9DQVRFIG51bWJlciBpcyBiYXNlZCBvbiByZWFsIENhdGVnYXJ5IHZhbHVlIGluIElFRUUgc3BlYy4gUGxlYXNlIGRvbidlcyBtb2RpZnkgaXQgYnkgeW91ciBzZWxmLiAqLworLypDYXRlZ29yeSAqLwogI2RlZmluZSBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1UMl9QRUVSX1FPU19DQVRFICAgICAgICAgICAgICAxCiAjZGVmaW5lIE1UMl9QRUVSX0RMU19DQVRFICAgICAgICAgICAgIDIKICNkZWZpbmUgTVQyX1BFRVJfQkFfQ0FURSAgICAgICAgICAgICAzCiAjZGVmaW5lIE1UMl9QRUVSX1BVQkxJQ19DQVRFICAgICAgICAgICAgIDQKICNkZWZpbmUgTVQyX1BFRVJfUk1fQ0FURSAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1UMl9QRUVSX0hUX0NBVEUgICAgICAgICAgICAgNwkvLwk3LjQuNworLyogIkZUX0NBVEVHT1JZX0JTU19UUkFOU0lUSU9OIGVxdWFsIHRvIDYiIGlzIGRlZmluZWQgZmlsZSBvZiAiZG90MTFyX2Z0LmgiICovCisjZGVmaW5lIE1UMl9QRUVSX0hUX0NBVEUgICAgICAgICAgICAgNwkvKiAgICAgIDcuNC43ICovCiAjZGVmaW5lIE1BWF9QRUVSX0NBVEVfTVNHICAgICAgICAgICAgICAgICAgIDcKKwogI2RlZmluZSBNVDJfTUxNRV9BRERfQkFfQ0FURSAgICAgICAgICAgICA4CiAjZGVmaW5lIE1UMl9NTE1FX09SSV9ERUxCQV9DQVRFICAgICAgICAgICAgIDkKICNkZWZpbmUgTVQyX01MTUVfUkVDX0RFTEJBX0NBVEUgICAgICAgICAgICAgMTAKQEAgLTcwMSw3ICs2OTgsNyBAQAogI2RlZmluZSBNVDJfQUNUX0lOVkFMSUQgICAgICAgICAgICAgMTMKICNkZWZpbmUgTUFYX0FDVF9NU0cgICAgICAgICAgICAgICAgICAgMTQKIAotLy9DYXRlZ29yeSBmaWVsZAorLypDYXRlZ29yeSBmaWVsZCAqLwogI2RlZmluZSBDQVRFR09SWV9TUEVDVFJVTQkJMAogI2RlZmluZSBDQVRFR09SWV9RT1MJCQkxCiAjZGVmaW5lIENBVEVHT1JZX0RMUwkJCTIKQEAgLTcxMCwzOCArNzA3LDM1IEBACiAjZGVmaW5lIENBVEVHT1JZX1JNCQkJNQogI2RlZmluZSBDQVRFR09SWV9IVAkJCTcKIAotCi0vLyBETFMgQWN0aW9uIGZyYW1lIGRlZmluaXRpb24KKy8qIERMUyBBY3Rpb24gZnJhbWUgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBBQ1RJT05fRExTX1JFUVVFU1QJCQkwCiAjZGVmaW5lIEFDVElPTl9ETFNfUkVTUE9OU0UJCQkxCiAjZGVmaW5lIEFDVElPTl9ETFNfVEVBUkRPV04JCQkyCiAKLS8vU3BlY3RydW0gIEFjdGlvbiBmaWVsZCB2YWx1ZSA4MDIuMTFoIDcuNC4xCi0jZGVmaW5lIFNQRUNfTVJRCTAJLy8gUmVxdWVzdAotI2RlZmluZSBTUEVDX01SUAkxCS8vUmVwb3J0CisvKlNwZWN0cnVtICBBY3Rpb24gZmllbGQgdmFsdWUgODAyLjExaCA3LjQuMSAqLworI2RlZmluZSBTUEVDX01SUQkwCS8qIFJlcXVlc3QgKi8KKyNkZWZpbmUgU1BFQ19NUlAJMQkvKlJlcG9ydCAqLwogI2RlZmluZSBTUEVDX1RQQ1JRCTIKICNkZWZpbmUgU1BFQ19UUENSUAkzCiAjZGVmaW5lIFNQRUNfQ0hBTk5FTF9TV0lUQ0gJNAogCi0KLS8vQkEgIEFjdGlvbiBmaWVsZCB2YWx1ZQorLypCQSAgQWN0aW9uIGZpZWxkIHZhbHVlICovCiAjZGVmaW5lIEFEREJBX1JFUQkwCiAjZGVmaW5lIEFEREJBX1JFU1AJMQogI2RlZmluZSBERUxCQSAgIDIKIAotLy9QdWJsaWMncyAgQWN0aW9uIGZpZWxkIHZhbHVlIGluIFB1YmxpYyBDYXRlZ29yeS4gIFNvbWUgaW4gODAyLjExeSBhbmQgc29tZSBpbiAxMW4KLSNkZWZpbmUgQUNUSU9OX0JTU18yMDQwX0NPRVhJU1QJCQkJMAkvLyAxMW4KLSNkZWZpbmUgQUNUSU9OX0RTRV9FTkFCTEVNRU5UCQkJCQkxCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfREVFTkFCTEVNRU5UCQkJCTIJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9SRUdfTE9DQVRJT05fQU5OT1VOQ0UJMwkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRVhUX0NIX1NXSVRDSF9BTk5PVU5DRQkJNAkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUQkJCTUJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVBPUlQJCTYJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX01FQVNVUkVNRU5UX1BJTE9UX0FDVElPTgkJNyAgCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfUE9XRVJfQ09OU1RSQUlOVAkJCTgJLy8gMTF5IEQ5LjAKKy8qUHVibGljJ3MgIEFjdGlvbiBmaWVsZCB2YWx1ZSBpbiBQdWJsaWMgQ2F0ZWdvcnkuICBTb21lIGluIDgwMi4xMXkgYW5kIHNvbWUgaW4gMTFuICovCisjZGVmaW5lIEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUCQkJCTAJLyogMTFuICovCisjZGVmaW5lIEFDVElPTl9EU0VfRU5BQkxFTUVOVAkJCQkJMQkvKiAxMXkgRDkuMCAqLworI2RlZmluZSBBQ1RJT05fRFNFX0RFRU5BQkxFTUVOVAkJCQkyCS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9EU0VfUkVHX0xPQ0FUSU9OX0FOTk9VTkNFCTMJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX0VYVF9DSF9TV0lUQ0hfQU5OT1VOQ0UJCTQJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVEJCQk1CS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9EU0VfTUVBU1VSRU1FTlRfUkVQT1JUCQk2CS8qIDExeSBEOS4wICovCisjZGVmaW5lIEFDVElPTl9NRUFTVVJFTUVOVF9QSUxPVF9BQ1RJT04JCTcJLyogMTF5IEQ5LjAgKi8KKyNkZWZpbmUgQUNUSU9OX0RTRV9QT1dFUl9DT05TVFJBSU5UCQkJOAkvKiAxMXkgRDkuMCAqLwogCi0KLS8vSFQgIEFjdGlvbiBmaWVsZCB2YWx1ZQorLypIVCAgQWN0aW9uIGZpZWxkIHZhbHVlICovCiAjZGVmaW5lIE5PVElGWV9CV19BQ1RJT04JCQkJMAogI2RlZmluZSBTTVBTX0FDVElPTgkJCQkJCTEKICNkZWZpbmUgUFNNUF9BQ1RJT04gICAJCQkJCTIKQEAgLTc1Myw5ICs3NDcsOSBAQAogI2RlZmluZSBIVF9JTkZPX0VYQ0hBTkdFCQkJCTgKIAogI2RlZmluZSBBQ1RfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAoTUFYX0FDVF9TVEFURSAqIE1BWF9BQ1RfTVNHKQotLy8KLS8vIFNUQSdzIEFVVEhFTlRJQ0FUSU9OIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZ2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAgICAyCkBAIC03NjksOSArNzYzLDkgQEAKIAogI2RlZmluZSBBVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfQVVUSF9TVEFURSAqIE1BWF9BVVRIX01TRykKIAotLy8KLS8vIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLworLyogKi8KKy8qIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQVVUSF9SU1BfV0FJVF9DSEFMICAgICAgICAgICAgICAxCiAjZGVmaW5lIE1BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgICAgMgpAQCAtNzg0LDEwICs3NzgsMTAgQEAKIAogI2RlZmluZSBBVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgICAgIChNQVhfQVVUSF9SU1BfU1RBVEUgKiBNQVhfQVVUSF9SU1BfTVNHKQogCi0vLwotLy8gU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQorLyogKi8KKy8qIFNUQSdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCisjZGVmaW5lIFNZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMAkvKiBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZSAqLwogI2RlZmluZSBKT0lOX1dBSVRfQkVBQ09OICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgU0NBTl9MSVNURU4gICAgICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIE1BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgICAgMwpAQCAtODA3LDcgKzgwMSw3IEBACiAKICNkZWZpbmUgU1lOQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAgICAoTUFYX1NZTkNfU1RBVEUgKiBNQVhfU1lOQ19NU0cpCiAKLS8vTWVzc2FnZXMgZm9yIHRoZSBETFMgc3RhdGUgbWFjaGluZQorLypNZXNzYWdlcyBmb3IgdGhlIERMUyBzdGF0ZSBtYWNoaW5lICovCiAjZGVmaW5lIERMU19JRExFCQkJCQkJMAogI2RlZmluZSBNQVhfRExTX1NUQVRFCQkJCQkxCiAKQEAgLTgyMSw0NSArODE1LDE4IEBACiAKICNkZWZpbmUgRExTX0ZVTkNfU0laRQkJCQkJKE1BWF9ETFNfU1RBVEUgKiBNQVhfRExTX01TRykKIAotLy8KLS8vIFNUQSdzIFdQQS1QU0sgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIFdQQV9QU0tfSURMRQkJCQkJMAotI2RlZmluZSBNQVhfV1BBX1BTS19TVEFURQkJCQkxCisvKiAqLworLyogV1NDIFN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogCi0jZGVmaW5lIFdQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1BWF9XUEFfUFNLX01TRyAgICAgICAgICAgICAgICAgNQotCi0jZGVmaW5lCVdQQV9QU0tfRlVOQ19TSVpFCQkJCShNQVhfV1BBX1BTS19TVEFURSAqIE1BWF9XUEFfUFNLX01TRykKLQotLy8KLS8vIFNUQSdzIENJU0NPLUFJUk9ORVQgU3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFJUk9ORVRfSURMRQkJCQkJMAotI2RlZmluZQlBSVJPTkVUX1NDQU5OSU5HCQkJCTEKLSNkZWZpbmUgTUFYX0FJUk9ORVRfU1RBVEUJCQkJMgotCi0jZGVmaW5lIEFJUk9ORVRfTUFDSElORV9CQVNFCQkgICAgMAotI2RlZmluZSBNVDJfQUlST05FVF9NU0cJCQkJICAgIDAKLSNkZWZpbmUgTVQyX0FJUk9ORVRfU0NBTl9SRVEJCSAgICAxCi0jZGVmaW5lIE1UMl9BSVJPTkVUX1NDQU5fRE9ORQkJICAgIDIKLSNkZWZpbmUgTUFYX0FJUk9ORVRfTVNHCQkJCSAgICAzCi0KLSNkZWZpbmUJQUlST05FVF9GVU5DX1NJWkUJCQkJKE1BWF9BSVJPTkVUX1NUQVRFICogTUFYX0FJUk9ORVRfTVNHKQotCi0vLwotLy8gQVAncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogQVAncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFQX0NOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgMQogCi0vLwotLy8gQVAncyBBU1NPQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBBUCdzIEFTU09DIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjICovCisvKiAqLwogI2RlZmluZSBBUF9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgQVBfTUFYX0FTU09DX1NUQVRFICAgICAgICAgICAgICAxCiAKQEAgLTg3MywzNiArODQwLDI1IEBACiAKICNkZWZpbmUgQVBfQVNTT0NfRlVOQ19TSVpFICAgICAgICAgICAgICAoQVBfTUFYX0FTU09DX1NUQVRFICogQVBfTUFYX0FTU09DX01TRykKIAotLy8KLS8vIEFQJ3MgQVVUSEVOVElDQVRJT04gc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCisvKiAqLworLyogQVAncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIyAqLworLyogKi8KICNkZWZpbmUgQVBfQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFQX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMQogCiAjZGVmaW5lIEFQX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAogI2RlZmluZSBBUE1UMl9NTE1FX0RFQVVUSF9SRVEgICAgICAgICAgIDAKICNkZWZpbmUgQVBNVDJfQ0xTMkVSUiAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQX01BWF9BVVRIX01TRyAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVBNVDJfUEVFUl9BVVRIX1JFUQkJCQkzCisjZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9DT05GSVJNCQkJNAorI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDUKIAogI2RlZmluZSBBUF9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfQVVUSF9TVEFURSAqIEFQX01BWF9BVVRIX01TRykKIAotLy8KLS8vIEFQJ3MgQVVUSC1SU1Agc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX0FVVEhfUlNQX0lETEUgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9NQVhfQVVUSF9SU1BfU1RBVEUgICAgICAgICAgIDEKLQotI2RlZmluZSBBUF9BVVRIX1JTUF9NQUNISU5FX0JBU0UgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAwCi0jZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQVBfTUFYX0FVVEhfUlNQX01TRyAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVBfQVVUSF9SU1BfRlVOQ19TSVpFICAgICAgICAgICAoQVBfTUFYX0FVVEhfUlNQX1NUQVRFICogQVBfTUFYX0FVVEhfUlNQX01TRykKLQotLy8KLS8vIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KKy8qICovCisvKiBBUCdzIFNZTkMgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCiAjZGVmaW5lIEFQX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBBUF9TQ0FOX0xJU1RFTgkJCQkJMQogI2RlZmluZSBBUF9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgIDIKQEAgLTkxOCwzMCArODc0LDMwIEBACiAKICNkZWZpbmUgQVBfU1lOQ19GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBfTUFYX1NZTkNfU1RBVEUgKiBBUF9NQVhfU1lOQ19NU0cpCiAKLS8vCi0vLyBBUCdzIFdQQSBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVBfV1BBX1BUSyAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQX01BWF9XUEFfUFRLX1NUQVRFICAgICAgICAgICAgMQorLyogKi8KKy8qIENvbW1vbiBXUEEgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMgKi8KKy8qICovCisjZGVmaW5lIFdQQV9QVEsgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfV1BBX1BUS19TVEFURSAgICAgICAgICAgIDEKIAotI2RlZmluZSBBUF9XUEFfTUFDSElORV9CQVNFICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQVBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEFQTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICAgNAotI2RlZmluZSBBUF9NQVhfV1BBX01TRyAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgV1BBX01BQ0hJTkVfQkFTRSAgICAgICAgICAgICAwCisjZGVmaW5lIE1UMl9FQVBQYWNrZXQgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNVDJfRUFQT0xTdGFydCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVQyX0VBUE9MTG9nb2ZmICAgICAgICAgICAgICAyCisjZGVmaW5lIE1UMl9FQVBPTEtleSAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVDJfRUFQT0xBU0ZBbGVydCAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1dQQV9NU0cgICAgICAgICAgICAgICAgICA1CiAKLSNkZWZpbmUgQVBfV1BBX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAoQVBfTUFYX1dQQV9QVEtfU1RBVEUgKiBBUF9NQVhfV1BBX01TRykKKyNkZWZpbmUgV1BBX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAoTUFYX1dQQV9QVEtfU1RBVEUgKiBNQVhfV1BBX01TRykKIAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgaGVhZGVyIEZDLlR5dGUsIHdoaWNoIGlzIGIzLi5iMiBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgorLyogdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBoZWFkZXIgRkMuVHl0ZSwgd2hpY2ggaXMgYjMuLmIyIG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyICovCiAjZGVmaW5lIEJUWVBFX01HTVQgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEJUWVBFX0NOVEwgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIEJUWVBFX0RBVEEgICAgICAgICAgICAgICAgICAyCiAKLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgTUdNVCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisvKiB2YWx1ZSBkb21haW4gb2YgODAyLjExIE1HTVQgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlciAqLwogI2RlZmluZSBTVUJUWVBFX0FTU09DX1JFUSAgICAgICAgICAgMAogI2RlZmluZSBTVUJUWVBFX0FTU09DX1JTUCAgICAgICAgICAgMQogI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUkVRICAgICAgICAgMgpAQCAtOTU2LDcgKzkxMiw3IEBACiAjZGVmaW5lIFNVQlRZUEVfQUNUSU9OICAgICAgICAgICAgICAxMwogI2RlZmluZSBTVUJUWVBFX0FDVElPTl9OT19BQ0sgICAgICAgICAgICAgIDE0CiAKLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgQ05UTCBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisvKiB2YWx1ZSBkb21haW4gb2YgODAyLjExIENOVEwgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlciAqLwogI2RlZmluZSBTVUJUWVBFX1dSQVBQRVIgICAgICAgCTcKICNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0tfUkVRICAgICAgIDgKICNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0sgICAgICAgICAgIDkKQEAgLTk2Nyw3ICs5MjMsNyBAQAogI2RlZmluZSBTVUJUWVBFX0NGRU5EICAgICAgICAgICAgICAgMTQKICNkZWZpbmUgU1VCVFlQRV9DRkVORF9DRkFDSyAgICAgICAgIDE1CiAKLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgREFUQSBmcmFtZSdzIEZDLnN1YnR5cGUsIHdoaWNoIGlzIGI3Li40IG9mIHRoZSAxc3QtYnl0ZSBvZiBNQUMgaGVhZGVyCisvKiB2YWx1ZSBkb21haW4gb2YgODAyLjExIERBVEEgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlciAqLwogI2RlZmluZSBTVUJUWVBFX0RBVEEgICAgICAgICAgICAgICAgMAogI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZBQ0sgICAgICAgICAgMQogI2RlZmluZSBTVUJUWVBFX0RBVEFfQ0ZQT0xMICAgICAgICAgMgpAQCAtOTg1LDE1ICs5NDEsMTUgQEAKICNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZQT0xMICAgICAgICAgIDE0CiAjZGVmaW5lIFNVQlRZUEVfUU9TX0NGQUNLX0NGUE9MTCAgICAxNQogCi0vLyBBQ0sgcG9saWN5IG9mIFFPUyBDb250cm9sIGZpZWxkIGJpdCA2OjUKLSNkZWZpbmUgTk9STUFMX0FDSyAgICAgICAgICAgICAgICAgIDB4MDAgIC8vIGI2OjUgPSAwMAotI2RlZmluZSBOT19BQ0sgICAgICAgICAgICAgICAgICAgICAgMHgyMCAgLy8gYjY6NSA9IDAxCi0jZGVmaW5lIE5PX0VYUExJQ0lUX0FDSyAgICAgICAgICAgICAweDQwICAvLyBiNjo1ID0gMTAKLSNkZWZpbmUgQkxPQ0tfQUNLICAgICAgICAgICAgICAgICAgIDB4NjAgIC8vIGI2OjUgPSAxMQorLyogQUNLIHBvbGljeSBvZiBRT1MgQ29udHJvbCBmaWVsZCBiaXQgNjo1ICovCisjZGVmaW5lIE5PUk1BTF9BQ0sgICAgICAgICAgICAgICAgICAweDAwCS8qIGI2OjUgPSAwMCAqLworI2RlZmluZSBOT19BQ0sgICAgICAgICAgICAgICAgICAgICAgMHgyMAkvKiBiNjo1ID0gMDEgKi8KKyNkZWZpbmUgTk9fRVhQTElDSVRfQUNLICAgICAgICAgICAgIDB4NDAJLyogYjY6NSA9IDEwICovCisjZGVmaW5lIEJMT0NLX0FDSyAgICAgICAgICAgICAgICAgICAweDYwCS8qIGI2OjUgPSAxMSAqLwogCi0vLwotLy8gcnRtcF9kYXRhLmMgdXNlIHRoZXNlIGRlZmluaXRpb24KLS8vCisvKiAqLworLyogcnRtcF9kYXRhLmMgdXNlIHRoZXNlIGRlZmluaXRpb24gKi8KKy8qICovCiAjZGVmaW5lIExFTkdUSF84MDJfMTEgICAgICAgICAgICAgICAyNAogI2RlZmluZSBMRU5HVEhfODAyXzExX0FORF9IICAgICAgICAgMzAKICNkZWZpbmUgTEVOR1RIXzgwMl8xMV9DUkNfSCAgICAgICAgIDM0CkBAIC0xMDA3LDQyICs5NjMsNDIgQEAKICNkZWZpbmUgTEVOR1RIX0NSQyAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTUFYX1NFUV9OVU1CRVIgICAgICAgICAgICAgIDB4MGZmZgogI2RlZmluZSBMRU5HVEhfODAyXzNfTk9fVFlQRQkJMTIKLSNkZWZpbmUgTEVOR1RIXzgwMl8xUQkJCQk0IC8qIFZMQU4gcmVsYXRlZCAqLworI2RlZmluZSBMRU5HVEhfODAyXzFRCQkJCTQJLyogVkxBTiByZWxhdGVkICovCiAKLS8vIFNUQV9DU1I0LmZpZWxkLlR4UmVzdWx0CisvKiBTVEFfQ1NSNC5maWVsZC5UeFJlc3VsdCAqLwogI2RlZmluZSBUWF9SRVNVTFRfU1VDQ0VTUyAgICAgICAgICAgMAogI2RlZmluZSBUWF9SRVNVTFRfWkVST19MRU5HVEggICAgICAgMQogI2RlZmluZSBUWF9SRVNVTFRfVU5ERVJfUlVOICAgICAgICAgMgogI2RlZmluZSBUWF9SRVNVTFRfT0hZX0VSUk9SICAgICAgICAgNAogI2RlZmluZSBUWF9SRVNVTFRfUkVUUllfRkFJTCAgICAgICAgNgogCi0vLyBBbGwgUEhZIHJhdGUgc3VtbWFyeSBpbiBUWEQKLS8vIFByZWFtYmxlIE1PREUgaW4gVHhECisvKiBBbGwgUEhZIHJhdGUgc3VtbWFyeSBpbiBUWEQgKi8KKy8qIFByZWFtYmxlIE1PREUgaW4gVHhEICovCiAjZGVmaW5lIE1PREVfQ0NLCTAKICNkZWZpbmUgTU9ERV9PRkRNICAgMQogI2RlZmluZSBNT0RFX0hUTUlYCTIKICNkZWZpbmUgTU9ERV9IVEdSRUVORklFTEQJMwogCi0vLyBNQ1MgZm9yIENDSy4gIEJXLlNHSS5TVEJDIGFyZSByZXNlcnZlZAotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQkvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcwotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDQJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzLiBzaG9ydCBpcyBmb3JiaWRkZW4gaW4gMU1icHMKLSNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgNQkvLyBzaG9ydCBwcmVhbWJsZSBDQ0sgMk1icHMKKy8qIE1DUyBmb3IgQ0NLLiAgQlcuU0dJLlNUQkMgYXJlIHJlc2VydmVkICovCisjZGVmaW5lIE1DU19sb25nUF9SQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAkvKiBsb25nIHByZWFtYmxlIENDSyAxTWJwcyAqLworI2RlZmluZSBNQ1NfbG9uZ1BfUkFURV8yICAgICAgICAgICAgICAgICAgICAgIDEJLyogbG9uZyBwcmVhbWJsZSBDQ0sgMU1icHMgKi8KKyNkZWZpbmUgTUNTX2xvbmdQX1JBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1DU19sb25nUF9SQVRFXzExICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMSAgICAgICAgICAgICAgICAgICAgICA0CS8qIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzLiBzaG9ydCBpcyBmb3JiaWRkZW4gaW4gMU1icHMgKi8KKyNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgNQkvKiBzaG9ydCBwcmVhbWJsZSBDQ0sgMk1icHMgKi8KICNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgNgogI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICA3Ci0vLyBUbyBzZW5kIGR1cGxpY2F0ZSBsZWdhY3kgT0ZETS4gc2V0IEJXPUJXXzQwLiAgU0dJLlNUQkMgYXJlIHJlc2VydmVkCi0jZGVmaW5lIE1DU19SQVRFXzYgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vIGxlZ2FjeSBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzkgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMTIgICAgICAgICAgICAgICAgICAgICAyICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDMgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgNCAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgNiAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDcgLy8gT0ZETQotLy8gSFQKLSNkZWZpbmUgTUNTXzAJCTAJLy8gMVMKKy8qIFRvIHNlbmQgZHVwbGljYXRlIGxlZ2FjeSBPRkRNLiBzZXQgQlc9QldfNDAuICBTR0kuU1RCQyBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUNTX1JBVEVfNiAgICAgICAgICAgICAgICAgICAgICAwCS8qIGxlZ2FjeSBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzkgICAgICAgICAgICAgICAgICAgICAgMQkvKiBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzEyICAgICAgICAgICAgICAgICAgICAgMgkvKiBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgMwkvKiBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgNAkvKiBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzM2ICAgICAgICAgICAgICAgICAgICAgNQkvKiBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgNgkvKiBPRkRNICovCisjZGVmaW5lIE1DU19SQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgNwkvKiBPRkRNICovCisvKiBIVCAqLworI2RlZmluZSBNQ1NfMAkJMAkvKiAxUyAqLwogI2RlZmluZSBNQ1NfMQkJMQogI2RlZmluZSBNQ1NfMgkJMgogI2RlZmluZSBNQ1NfMwkJMwpAQCAtMTA1MCw3ICsxMDA2LDcgQEAKICNkZWZpbmUgTUNTXzUJCTUKICNkZWZpbmUgTUNTXzYJCTYKICNkZWZpbmUgTUNTXzcJCTcKLSNkZWZpbmUgTUNTXzgJCTgJLy8gMlMKKyNkZWZpbmUgTUNTXzgJCTgJLyogMlMgKi8KICNkZWZpbmUgTUNTXzkJCTkKICNkZWZpbmUgTUNTXzEwCQkxMAogI2RlZmluZSBNQ1NfMTEJCTExCkBAIC0xMDU4LDcgKzEwMTQsNyBAQAogI2RlZmluZSBNQ1NfMTMJCTEzCiAjZGVmaW5lIE1DU18xNAkJMTQKICNkZWZpbmUgTUNTXzE1CQkxNQotI2RlZmluZSBNQ1NfMTYJCTE2CS8vIDMqMworI2RlZmluZSBNQ1NfMTYJCTE2CS8qIDMqMyAqLwogI2RlZmluZSBNQ1NfMTcJCTE3CiAjZGVmaW5lIE1DU18xOAkJMTgKICNkZWZpbmUgTUNTXzE5CQkxOQpAQCAtMTA2OSw0OSArMTAyNSw0OCBAQAogI2RlZmluZSBNQ1NfMzIJCTMyCiAjZGVmaW5lIE1DU19BVVRPCQkzMwogCi0vLyBPSURfSFRQSFlNT0RFCi0vLyBNT0RFCisvKiBPSURfSFRQSFlNT0RFICovCisvKiBNT0RFICovCiAjZGVmaW5lIEhUTU9ERV9NTQkwCiAjZGVmaW5lIEhUTU9ERV9HRgkxCiAKLS8vIEZpeGVkIFR4IE1PREUgLSBIVCwgQ0NLIG9yIE9GRE0KKy8qIEZpeGVkIFR4IE1PREUgLSBIVCwgQ0NLIG9yIE9GRE0gKi8KICNkZWZpbmUgRklYRURfVFhNT0RFX0hUCQkwCiAjZGVmaW5lIEZJWEVEX1RYTU9ERV9DQ0sJMQogI2RlZmluZSBGSVhFRF9UWE1PREVfT0ZETSAJMgotLy8gQlcKKy8qIEJXICovCiAjZGVmaW5lIEJXXzIwCQlCQU5EX1dJRFRIXzIwCiAjZGVmaW5lIEJXXzQwCQlCQU5EX1dJRFRIXzQwCiAjZGVmaW5lIEJXX0JPVEgJCUJBTkRfV0lEVEhfQk9USAotI2RlZmluZSBCV18xMAkJQkFORF9XSURUSF8xMAkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KKyNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLyogODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuICovCiAKLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCisvKiBTSE9SVEdJICovCisjZGVmaW5lIEdJXzQwMAkJR0FQX0lOVEVSVkFMXzQwMAkvKiBvbmx5IHN1cHBvcnQgaW4gSFQgbW9kZSAqLwogI2RlZmluZSBHSV9CT1RICQlHQVBfSU5URVJWQUxfQk9USAogI2RlZmluZSBHSV84MDAJCUdBUF9JTlRFUlZBTF84MDAKLS8vIFNUQkMKKy8qIFNUQkMgKi8KICNkZWZpbmUgU1RCQ19OT05FCTAKLSNkZWZpbmUgU1RCQ19VU0UJMQkvLyBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeQotI2RlZmluZSBSWFNUQkNfT05FCTEJLy8gcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0KLSNkZWZpbmUgUlhTVEJDX1RXTwkyCS8vIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbQotI2RlZmluZSBSWFNUQkNfVEhSCTMJLy8gcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0KLS8vIE1DUyBGRUVEQkFDSwotI2RlZmluZSBNQ1NGQktfTk9ORQkwICAvLyBub3Qgc3VwcG9ydCBtY3MgZmVlZGJhY2sgLwotI2RlZmluZSBNQ1NGQktfUlNWCTEJLy8gcmVzZXJ2ZWQKLSNkZWZpbmUgTUNTRkJLX1VOU09MSUNJVAkyCS8vIG9ubHkgc3VwcG9ydCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKLSNkZWZpbmUgTUNTRkJLX01SUQkzCS8vIHJlc3BvbnNlIHRvIGJvdGggTVJRIGFuZCB1bnNvbGljdCBtY3MgZmVlZGJhY2sKKyNkZWZpbmUgU1RCQ19VU0UJMQkvKiBsaW1pdGVkIHVzZSBpbiBydDI4NjBiIHBoeSAqLworI2RlZmluZSBSWFNUQkNfT05FCTEJLyogcnggc3VwcG9ydCBvZiBvbmUgc3BhdGlhbCBzdHJlYW0gKi8KKyNkZWZpbmUgUlhTVEJDX1RXTwkyCS8qIHJ4IHN1cHBvcnQgb2YgMSBhbmQgMiBzcGF0aWFsIHN0cmVhbSAqLworI2RlZmluZSBSWFNUQkNfVEhSCTMJLyogcnggc3VwcG9ydCBvZiAxfjMgc3BhdGlhbCBzdHJlYW0gKi8KKy8qIE1DUyBGRUVEQkFDSyAqLworI2RlZmluZSBNQ1NGQktfTk9ORQkwCS8qIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvICovCisjZGVmaW5lIE1DU0ZCS19SU1YJMQkvKiByZXNlcnZlZCAqLworI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLyogb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjayAqLworI2RlZmluZSBNQ1NGQktfTVJRCTMJLyogcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjayAqLwogCi0vLyBNSU1PIHBvd2VyIHNhZmUKKy8qIE1JTU8gcG93ZXIgc2FmZSAqLwogI2RlZmluZQlNTVBTX1NUQVRJQwkwCiAjZGVmaW5lCU1NUFNfRFlOQU1JQwkJMQogI2RlZmluZSAgIE1NUFNfUlNWCQkyCiAjZGVmaW5lIE1NUFNfRU5BQkxFCQkzCiAKLQotLy8gQS1NU0RVIHNpemUKKy8qIEEtTVNEVSBzaXplICovCiAjZGVmaW5lCUFNU0RVXzAJMAogI2RlZmluZQlBTVNEVV8xCQkxCiAKLS8vIE1DUyB1c2UgNyBiaXRzCisvKiBNQ1MgdXNlIDcgYml0cyAqLwogI2RlZmluZSBUWFJBVEVNSU1PCQkweDgwCiAjZGVmaW5lIFRYUkFURU1DUwkJMHg3RgogI2RlZmluZSBUWFJBVEVPRkRNCQkweDdGCkBAIC0xMTE5LDczICsxMDc0LDc3IEBACiAjZGVmaW5lIFJBVEVfMiAgICAgICAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIFJBVEVfNV81ICAgICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIFJBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFJBVEVfNiAgICAgICAgICAgICAgICAgICAgICA0ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzkgICAgICAgICAgICAgICAgICAgICAgNSAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8xMiAgICAgICAgICAgICAgICAgICAgIDYgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMTggICAgICAgICAgICAgICAgICAgICA3ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgOCAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDkgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfNDggICAgICAgICAgICAgICAgICAgICAxMCAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzU0ICAgICAgICAgICAgICAgICAgICAgMTEgIC8vIE9GRE0KKyNkZWZpbmUgUkFURV82ICAgICAgICAgICAgICAgICAgICAgIDQJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzkgICAgICAgICAgICAgICAgICAgICAgNQkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2CS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDcJLyogT0ZETSAqLworI2RlZmluZSBSQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgOAkvKiBPRkRNICovCisjZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5CS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV80OCAgICAgICAgICAgICAgICAgICAgIDEwCS8qIE9GRE0gKi8KKyNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExCS8qIE9GRE0gKi8KICNkZWZpbmUgUkFURV9GSVJTVF9PRkRNX1JBVEUgICAgICAgIFJBVEVfNgogI2RlZmluZSBSQVRFX0xBU1RfT0ZETV9SQVRFICAgICAgICAJUkFURV81NAotI2RlZmluZSBSQVRFXzZfNSAgICAgICAgICAgICAgICAgICAgMTIgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzEzICAgICAgICAgICAgICAgICAgICAgMTMgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzE5XzUgICAgICAgICAgICAgICAgICAgMTQgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzI2ICAgICAgICAgICAgICAgICAgICAgMTUgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzM5ICAgICAgICAgICAgICAgICAgICAgMTYgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzUyICAgICAgICAgICAgICAgICAgICAgMTcgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzU4XzUgICAgICAgICAgICAgICAgICAgMTggIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzY1ICAgICAgICAgICAgICAgICAgICAgMTkgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzc4ICAgICAgICAgICAgICAgICAgICAgMjAgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzEwNCAgICAgICAgICAgICAgICAgICAgMjEgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzExNyAgICAgICAgICAgICAgICAgICAgMjIgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzEzMCAgICAgICAgICAgICAgICAgICAgMjMgIC8vIEhUIG1peAotLy8jZGVmaW5lIFJBVEVfQVVUT19TV0lUQ0ggICAgICAgICAgICAyNTUgLy8gZm9yIFN0YUNmZy5GaXhlZFR4UmF0ZSBvbmx5CisjZGVmaW5lIFJBVEVfNl81ICAgICAgICAgICAgICAgICAgICAxMgkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8xMyAgICAgICAgICAgICAgICAgICAgIDEzCS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzE5XzUgICAgICAgICAgICAgICAgICAgMTQJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMjYgICAgICAgICAgICAgICAgICAgICAxNQkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8zOSAgICAgICAgICAgICAgICAgICAgIDE2CS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzUyICAgICAgICAgICAgICAgICAgICAgMTcJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfNThfNSAgICAgICAgICAgICAgICAgICAxOAkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV82NSAgICAgICAgICAgICAgICAgICAgIDE5CS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzc4ICAgICAgICAgICAgICAgICAgICAgMjAJLyogSFQgbWl4ICovCisjZGVmaW5lIFJBVEVfMTA0ICAgICAgICAgICAgICAgICAgICAyMQkvKiBIVCBtaXggKi8KKyNkZWZpbmUgUkFURV8xMTcgICAgICAgICAgICAgICAgICAgIDIyCS8qIEhUIG1peCAqLworI2RlZmluZSBSQVRFXzEzMCAgICAgICAgICAgICAgICAgICAgMjMJLyogSFQgbWl4ICovCisvKiNkZWZpbmUgUkFURV9BVVRPX1NXSVRDSCAgICAgICAgICAgIDI1NSAvLyBmb3IgU3RhQ2ZnLkZpeGVkVHhSYXRlIG9ubHkgKi8KICNkZWZpbmUgSFRSQVRFXzAgICAgICAgICAgICAgICAgICAgICAgMTIKICNkZWZpbmUgUkFURV9GSVJTVF9NTV9SQVRFICAgICAgICBIVFJBVEVfMAogI2RlZmluZSBSQVRFX0ZJUlNUX0hUX1JBVEUgICAgICAgIEhUUkFURV8wCiAjZGVmaW5lIFJBVEVfTEFTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAogCi0vLyBwVHhXSS0+dHhvcAotI2RlZmluZSBJRlNfSFRUWE9QICAgICAgICAgICAgICAgICAwCS8vIFRoZSB0eG9wIHdpbGwgYmUgaGFuZGxlcyBieSBBU0lDLgorLyogcFR4V0ktPnR4b3AgKi8KKyNkZWZpbmUgSUZTX0hUVFhPUCAgICAgICAgICAgICAgICAgMAkvKiBUaGUgdHhvcCB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQy4gKi8KICNkZWZpbmUgSUZTX1BJRlMgICAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgSUZTX1NJRlMgICAgICAgICAgICAgICAgICAgIDIKICNkZWZpbmUgSUZTX0JBQ0tPRkYgICAgICAgICAgICAgICAgIDMKIAotLy8gcFR4RC0+UmV0cnlNb2RlCi0jZGVmaW5lIExPTkdfUkVUUlkgICAgICAgICAgICAgICAgICAxCisvKiBwVHhELT5SZXRyeU1vZGUgKi8KKyNkZWZpbmUgbG9uZ19SRVRSWSAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgU0hPUlRfUkVUUlkgICAgICAgICAgICAgICAgIDAKIAotLy8gQ291bnRyeSBSZWdpb24gZGVmaW5pdGlvbgorLyogQ291bnRyeSBSZWdpb24gZGVmaW5pdGlvbiAqLwogI2RlZmluZSBSRUdJT05fTUlOSU1VTV9CR19CQU5EICAgICAgICAgICAgMAotI2RlZmluZSBSRUdJT05fMF9CR19CQU5EICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAxLTExCi0jZGVmaW5lIFJFR0lPTl8xX0JHX0JBTkQgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDEtMTMKLSNkZWZpbmUgUkVHSU9OXzJfQkdfQkFORCAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMTAtMTEKLSNkZWZpbmUgUkVHSU9OXzNfQkdfQkFORCAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMTAtMTMKLSNkZWZpbmUgUkVHSU9OXzRfQkdfQkFORCAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQKLSNkZWZpbmUgUkVHSU9OXzVfQkdfQkFORCAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMS0xNAotI2RlZmluZSBSRUdJT05fNl9CR19CQU5EICAgICAgICAgICAgICAgICAgNiAgICAgICAvLyAzLTkKLSNkZWZpbmUgUkVHSU9OXzdfQkdfQkFORCAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gNS0xMwotI2RlZmluZSBSRUdJT05fMzFfQkdfQkFORCAgICAgICAgICAgICAgICAgMzEgICAgICAgLy8gNS0xMworI2RlZmluZSBSRUdJT05fMF9CR19CQU5EICAgICAgICAgICAgICAgICAgMAkvKiAxLTExICovCisjZGVmaW5lIFJFR0lPTl8xX0JHX0JBTkQgICAgICAgICAgICAgICAgICAxCS8qIDEtMTMgKi8KKyNkZWZpbmUgUkVHSU9OXzJfQkdfQkFORCAgICAgICAgICAgICAgICAgIDIJLyogMTAtMTEgKi8KKyNkZWZpbmUgUkVHSU9OXzNfQkdfQkFORCAgICAgICAgICAgICAgICAgIDMJLyogMTAtMTMgKi8KKyNkZWZpbmUgUkVHSU9OXzRfQkdfQkFORCAgICAgICAgICAgICAgICAgIDQJLyogMTQgKi8KKyNkZWZpbmUgUkVHSU9OXzVfQkdfQkFORCAgICAgICAgICAgICAgICAgIDUJLyogMS0xNCAqLworI2RlZmluZSBSRUdJT05fNl9CR19CQU5EICAgICAgICAgICAgICAgICAgNgkvKiAzLTkgKi8KKyNkZWZpbmUgUkVHSU9OXzdfQkdfQkFORCAgICAgICAgICAgICAgICAgIDcJLyogNS0xMyAqLworI2RlZmluZSBSRUdJT05fMzFfQkdfQkFORCAgICAgICAgICAgICAgICAgMzEJLyogNS0xMyAqLwogI2RlZmluZSBSRUdJT05fTUFYSU1VTV9CR19CQU5EICAgICAgICAgICAgNwogCiAjZGVmaW5lIFJFR0lPTl9NSU5JTVVNX0FfQkFORCAgICAgICAgICAgICAwCi0jZGVmaW5lIFJFR0lPTl8wX0FfQkFORCAgICAgICAgICAgICAgICAgICAwICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzFfQV9CQU5EICAgICAgICAgICAgICAgICAgIDEgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAotI2RlZmluZSBSRUdJT05fMl9BX0JBTkQgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQKLSNkZWZpbmUgUkVHSU9OXzNfQV9CQU5EICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MQotI2RlZmluZSBSRUdJT05fNF9BX0JBTkQgICAgICAgICAgICAgICAgICAgNCAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fNV9BX0JBTkQgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAxNDksIDE1MywgMTU3LCAxNjEKLSNkZWZpbmUgUkVHSU9OXzZfQV9CQU5EICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgKLSNkZWZpbmUgUkVHSU9OXzdfQV9CQU5EICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzhfQV9CQU5EICAgICAgICAgICAgICAgICAgIDggICAgICAgLy8gNTIsIDU2LCA2MCwgNjQKLSNkZWZpbmUgUkVHSU9OXzlfQV9CQU5EICAgICAgICAgICAgICAgICAgIDkgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzEwX0FfQkFORCAgICAgICAgICAgICAgICAgIDEwCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0FfQkFORCAgICAgICAgICAgICAxMQorI2RlZmluZSBSRUdJT05fMF9BX0JBTkQgICAgICAgICAgICAgICAgICAgMAkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1ICovCisjZGVmaW5lIFJFR0lPTl8xX0FfQkFORCAgICAgICAgICAgICAgICAgICAxCS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAgKi8KKyNkZWZpbmUgUkVHSU9OXzJfQV9CQU5EICAgICAgICAgICAgICAgICAgIDIJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0ICovCisjZGVmaW5lIFJFR0lPTl8zX0FfQkFORCAgICAgICAgICAgICAgICAgICAzCS8qIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEgKi8KKyNkZWZpbmUgUkVHSU9OXzRfQV9CQU5EICAgICAgICAgICAgICAgICAgIDQJLyogMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUgKi8KKyNkZWZpbmUgUkVHSU9OXzVfQV9CQU5EICAgICAgICAgICAgICAgICAgIDUJLyogMTQ5LCAxNTMsIDE1NywgMTYxICovCisjZGVmaW5lIFJFR0lPTl82X0FfQkFORCAgICAgICAgICAgICAgICAgICA2CS8qIDM2LCA0MCwgNDQsIDQ4ICovCisjZGVmaW5lIFJFR0lPTl83X0FfQkFORCAgICAgICAgICAgICAgICAgICA3CS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MyAqLworI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOAkvKiA1MiwgNTYsIDYwLCA2NCAqLworI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOQkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSAqLworI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJLyogMzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1ICovCisjZGVmaW5lIFJFR0lPTl8xMV9BX0JBTkQgICAgICAgICAgICAgICAgICAxMQkvKiAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDE0OSwgMTUzLCAxNTcsIDE2MSAqLworI2RlZmluZSBSRUdJT05fMTJfQV9CQU5EICAgICAgICAgICAgICAgICAgMTIJLyogMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCAqLworI2RlZmluZSBSRUdJT05fMTNfQV9CQU5EICAgICAgICAgICAgICAgICAgMTMJLyogNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEgKi8KKyNkZWZpbmUgUkVHSU9OXzE0X0FfQkFORCAgICAgICAgICAgICAgICAgIDE0CS8qIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NSAqLworI2RlZmluZSBSRUdJT05fMTVfQV9CQU5EICAgICAgICAgICAgICAgICAgMTUJLyogMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUsIDE2OSwgMTczICovCisjZGVmaW5lIFJFR0lPTl9NQVhJTVVNX0FfQkFORCAgICAgICAgICAgICAxNQogCi0vLyBwVHhELT5DaXBoZXJBbGcKKy8qIHBUeEQtPkNpcGhlckFsZyAqLwogI2RlZmluZSBDSVBIRVJfTk9ORSAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBDSVBIRVJfV0VQNjQgICAgICAgICAgICAgICAgMQogI2RlZmluZSBDSVBIRVJfV0VQMTI4ICAgICAgICAgICAgICAgMgpAQCAtMTE5MywyMCArMTE1MiwxMCBAQAogI2RlZmluZSBDSVBIRVJfQUVTICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBDSVBIRVJfQ0tJUDY0ICAgICAgICAgICAgICAgNQogI2RlZmluZSBDSVBIRVJfQ0tJUDEyOCAgICAgICAgICAgICAgNgotI2RlZmluZSBDSVBIRVJfVEtJUF9OT19NSUMgICAgICAgICAgNyAgICAgICAvLyBNSUMgYXBwZW5kZWQgYnkgZHJpdmVyOiBub3QgYSB2YWxpZCB2YWx1ZSBpbiBoYXJkd2FyZSBrZXkgdGFibGUKKyNkZWZpbmUgQ0lQSEVSX1RLSVBfTk9fTUlDICAgICAgICAgIDcJLyogTUlDIGFwcGVuZGVkIGJ5IGRyaXZlcjogbm90IGEgdmFsaWQgdmFsdWUgaW4gaGFyZHdhcmUga2V5IHRhYmxlICovCiAjZGVmaW5lIENJUEhFUl9TTVM0CQkJCQk4CiAKLS8vIHZhbHVlIGRvbWFpbiBvZiBwQWQtPlJmSWNUeXBlCi0jZGVmaW5lIFJGSUNfMjgyMCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDIuNEcgMlQzUgotI2RlZmluZSBSRklDXzI4NTAgICAgICAgICAgICAgICAgICAgMiAgICAgICAvLyAyLjRHLzVHIDJUM1IKLSNkZWZpbmUgUkZJQ18yNzIwICAgICAgICAgICAgICAgICAgIDMgICAgICAgLy8gMi40RyAxVDJSCi0jZGVmaW5lIFJGSUNfMjc1MCAgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDIuNEcvNUcgMVQyUgotI2RlZmluZSBSRklDXzMwMjAgICAgICAgICAgICAgICAgICAgNSAgICAgICAvLyAyLjRHIDFUMVIKLSNkZWZpbmUgUkZJQ18yMDIwICAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMi40RyBCL0cKLSNkZWZpbmUgUkZJQ18zMDIxICAgICAgICAgICAgICAgICAgIDcgICAgICAgLy8gMi40RyAxVDJSCi0jZGVmaW5lIFJGSUNfMzAyMiAgICAgICAgICAgICAgICAgICA4ICAgICAgIC8vIDIuNEcgMlQyUgotCi0vLyBMRUQgU3RhdHVzLgorLyogTEVEIFN0YXR1cy4gKi8KICNkZWZpbmUgTEVEX0xJTktfRE9XTiAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTEVEX0xJTktfVVAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgTEVEX1JBRElPX09GRiAgICAgICAgICAgICAgIDIKQEAgLTEyMTYsMzUgKzExNjUsMzUgQEAKICNkZWZpbmUgTEVEX09OX1NJVEVfU1VSVkVZICAgICAgICAgIDYKICNkZWZpbmUgTEVEX1BPV0VSX1VQICAgICAgICAgICAgICAgIDcKIAotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+TGVkQ250bC5MZWRNb2RlIGFuZCBFMlBST00KKy8qIHZhbHVlIGRvbWFpbiBvZiBwQWQtPkxlZENudGwuTGVkTW9kZSBhbmQgRTJQUk9NICovCiAjZGVmaW5lIExFRF9NT0RFX0RFRkFVTFQgICAgICAgICAgICAwCiAjZGVmaW5lIExFRF9NT0RFX1RXT19MRUQJCQkxCi0jZGVmaW5lIExFRF9NT0RFX1NJR05BTF9TVFJFR1RICQk4ICAvLyBFRVBST00gZGVmaW5lID04CisvKiNkZWZpbmUgTEVEX01PREVfU0lHTkFMX1NUUkVHVEggICAgICAgICAgICAgICA4ICAvLyBFRVBST00gZGVmaW5lID04ICovCisjZGVmaW5lIExFRF9NT0RFX1NJR05BTF9TVFJFR1RICQkweDQwCS8qIEVFUFJPTSBkZWZpbmUgPSA2NCAqLwogCi0vLyBSQzQgaW5pdCB2YWx1ZSwgdXNlZCBmcm8gV0VQICYgVEtJUAotI2RlZmluZSBQUFBJTklURkNTMzIgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiAgIC8qIEluaXRpYWwgRkNTIHZhbHVlICovCisvKiBSQzQgaW5pdCB2YWx1ZSwgdXNlZCBmcm8gV0VQICYgVEtJUCAqLworI2RlZmluZSBQUFBJTklURkNTMzIgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgkvKiBJbml0aWFsIEZDUyB2YWx1ZSAqLwogCi0vLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQuIDgwMi4xWCBjb250cm9sbGVkIHBvcnQgZGVmaW5pdGlvbgorLyogdmFsdWUgZG9tYWluIG9mIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkLiA4MDIuMVggY29udHJvbGxlZCBwb3J0IGRlZmluaXRpb24gKi8KICNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQgICAgIDEKICNkZWZpbmUgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEIDIKIAogI2RlZmluZSBQQUlSV0lTRV9LRVkgICAgICAgICAgICAgICAgMQogI2RlZmluZSBHUk9VUF9LRVkgICAgICAgICAgICAgICAgICAgMgogCi0vL2RlZmluaXRpb24gb2YgRFJTCisvKmRlZmluaXRpb24gb2YgRFJTICovCiAjZGVmaW5lIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENICTMyCiAKLQotLy8gcHJlLWFsbG9jYXRlZCBmcmVlIE5ESVMgUEFDS0VUL0JVRkZFUiBwb2xsIGZvciBpbnRlcm5hbCB1c2FnZQorLyogcHJlLWFsbG9jYXRlZCBmcmVlIE5ESVMgUEFDS0VUL0JVRkZFUiBwb2xsIGZvciBpbnRlcm5hbCB1c2FnZSAqLwogI2RlZmluZSBNQVhfTlVNX09GX0ZSRUVfTkRJU19QQUNLRVQgMTI4CiAKLS8vQmxvY2sgQUNLCisvKkJsb2NrIEFDSyAqLwogI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRiAgIDY0CiAjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGICAgNjQKICNkZWZpbmUgREVGQVVMVF9UWF9USU1FT1VUICAgMzAKICNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUICAgMzAKIAotLy8gZGVmaW5pdGlvbiBvZiBSZWNpcGllbnQgb3IgT3JpZ2luYXRvcgorLyogZGVmaW5pdGlvbiBvZiBSZWNpcGllbnQgb3IgT3JpZ2luYXRvciAqLwogI2RlZmluZSBJX1JFQ0lQSUVOVCAgICAgICAgICAgICAgICAgIFRSVUUKICNkZWZpbmUgSV9PUklHSU5BVE9SICAgICAgICAgICAgICAgICAgIEZBTFNFCiAKQEAgLTEyNTIsNDYgKzEyMDEsNDUgQEAKICNkZWZpbmUgREVGQVVMVF9SRl9UWF9QT1dFUiAgICAgICAgIDUKIAogI2RlZmluZSBNQVhfSU5JX0JVRkZFUl9TSVpFCQkJNDA5NgotI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KSAvLyBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpCi0JCQkJCQkJCQkJCS8vMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKQotCQkJCQkJCQkJCQkvLzY0IDogTUFYX05VTV9PRl9BQ0xfTElTVAotLy8gZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZQorI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KQkvKiBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpICovCisJCQkJCQkJCQkJCS8qMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKSAqLworCQkJCQkJCQkJCQkvKjY0IDogTUFYX05VTV9PRl9BQ0xfTElTVCAqLworLyogZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZSAqLwogI2RlZmluZSBPUE1PREVfU1RBICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBPUE1PREVfQVAgICAgICAgICAgICAgICAgICAgMQotLy8jZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZQorLyojZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZSAqLwogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyB2YWx1ZSBkb21haW4gZm9yIHBBZC0+RXZlbnRUYWIuTG9nW10uRXZlbnQKLSNkZWZpbmUgRVZFTlRfUkVTRVRfQUNDRVNTX1BPSU5UICAgIDAgLy8gTG9nID0gImhoOm1tOnNzICAgUmVzdGFydCBBY2Nlc3MgUG9pbnQiCi0jZGVmaW5lIEVWRU5UX0FTU09DSUFURUQgICAgICAgICAgICAxIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSBhc3NvY2lhdGVkIgotI2RlZmluZSBFVkVOVF9ESVNBU1NPQ0lBVEVEICAgICAgICAgMiAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgbGVmdCB0aGlzIEJTUyIKLSNkZWZpbmUgRVZFTlRfQUdFRF9PVVQgICAgICAgICAgICAgIDMgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IHdhcyBhZ2VkLW91dCBhbmQgcmVtb3ZlZCBmcm9tIHRoaXMgQlNTIgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50ICovCisjZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT2ludCAgICAwCS8qIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IiAqLworI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMQkvKiBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIgKi8KKyNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIJLyogTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiICovCisjZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzCS8qIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIgKi8KICNkZWZpbmUgRVZFTlRfQ09VTlRFUl9NICAgICAgICAgICAgIDQKICNkZWZpbmUgRVZFTlRfSU5WQUxJRF9QU0sgICAgICAgICAgIDUKICNkZWZpbmUgRVZFTlRfTUFYX0VWRU5UX1RZUEUgICAgICAgIDYKLS8vID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09CisvKiA9PT09IGVuZCBvZiBBUCBydG1wX2RlZi5oID09PT09PT09PT09PSAqLwogCi0vLyBkZWZpbml0aW9uIFJTU0kgTnVtYmVyCisvKiBkZWZpbml0aW9uIFJTU0kgTnVtYmVyICovCiAjZGVmaW5lIFJTU0lfMAkJCQkJMAogI2RlZmluZSBSU1NJXzEJCQkJCTEKICNkZWZpbmUgUlNTSV8yCQkJCQkyCiAKLS8vIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uCi0jZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLy8gTm90IGZvdW5kIHJhZGFyIHNpZ25hbAotI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLy8gRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2gKLSNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLy8gQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQKKy8qIGRlZmluaXRpb24gb2YgcmFkYXIgZGV0ZWN0aW9uICovCisjZGVmaW5lIFJEX05PUk1BTF9NT0RFCQkJCTAJLyogTm90IGZvdW5kIHJhZGFyIHNpZ25hbCAqLworI2RlZmluZSBSRF9TV0lUQ0hJTkdfTU9ERQkJCTEJLyogRm91bmQgcmFkYXIgc2lnbmFsLCBhbmQgZG9pbmcgY2hhbm5lbCBzd2l0Y2ggKi8KKyNkZWZpbmUgUkRfU0lMRU5DRV9NT0RFCQkJCTIJLyogQWZ0ZXIgY2hhbm5lbCBzd2l0Y2gsIG5lZWQgdG8gYmUgc2lsZW5jZSBhIHdoaWxlIHRvIGVuc3VyZSByYWRhciBub3QgZm91bmQgKi8KIAotLy9Ecml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLgorLypEcml2ZXIgZGVmaW5lZCBjaWQgZm9yIG1hcHBpbmcgc3RhdHVzIGFuZCBjb21tYW5kLiAqLwogI2RlZmluZSAgU0xFRVBDSUQJMHgxMQogI2RlZmluZSAgV0FLRUNJRAkweDIyCiAjZGVmaW5lICBRVUVSWVBPV0VSQ0lECTB4MzMKICNkZWZpbmUgIE9XTkVSTUNVCTB4MQogI2RlZmluZSAgT1dORVJDUFUJMHgwCiAKLS8vIE1CU1NJRCBkZWZpbml0aW9uCisvKiBNQlNTSUQgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBFTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICAgMHhGRgogCi0KIC8qIEFmdGVyIExpbnV4IDIuNi45LAogICogVkxBTiBtb2R1bGUgdXNlIFByaXZhdGUgKGZyb20gdXNlcikgaW50ZXJmYWNlIGZsYWdzIChuZXRkZXZpY2UtPnByaXZfZmxhZ3MpLgogICogI2RlZmluZSBJRkZfODAyXzFRX1ZMQU4gMHgxICAgICAgICAgLS0gICAgODAyLjFRIFZMQU4gZGV2aWNlLiAgaW4gaWYuaApAQCAtMTMwNSwxOSArMTI1MywyMSBAQAogI2RlZmluZSBJTlRfQVBDTEkgICAgICAgICAgICAgICAgICAgMHgwNDAwCiAjZGVmaW5lIElOVF9NRVNIICAgICAgICAgICAgICAgICAgIAkweDA1MDAKIAotLy8gVXNlIGJpdG1hcCB0byBhbGxvdyBjb2V4aXN0IG9mIEFURV9UWEZSQU1FIGFuZCBBVEVfUlhGUkFNRShpLmUuLHRvIHN1cHBvcnQgTG9vcEJhY2sgbW9kZSkKKyNkZWZpbmUgSU5GX01BSU5fREVWX05BTUUJCSJ3bGFuIgorI2RlZmluZSBJTkZfTUJTU0lEX0RFVl9OQU1FCQkicmEiCisjZGVmaW5lIElORl9XRFNfREVWX05BTUUJCSJ3ZHMiCisjZGVmaW5lIElORl9BUENMSV9ERVZfTkFNRQkJImFwY2xpIgorI2RlZmluZSBJTkZfTUVTSF9ERVZfTkFNRQkJIm1lc2giCiAKLS8vIFdFUCBLZXkgVFlQRQorLyogV0VQIEtleSBUWVBFICovCiAjZGVmaW5lIFdFUF9IRVhBREVDSU1BTF9UWVBFICAgIDAKICNkZWZpbmUgV0VQX0FTQ0lJX1RZUEUgICAgICAgICAgMQogCi0KLQotLy8gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KKy8qIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uICovCiAvKiBNYXggbnVtYmVyIG9mIGNoYXIgaW4gY3VzdG9tIGV2ZW50LCByZWZlciB0byB3aXJlbGVzc190b29scy4yOC93aXJlbGVzcy4yMC5oICovCiAjZGVmaW5lIElXX0NVU1RPTV9NQVhfTEVOCQkJCSAgCQkJMjU1CS8qIEluIGJ5dGVzICovCiAKLS8vIEZvciBzeXN0ZW0gZXZlbnQgLSBzdGFydAorLyogRm9yIHN5c3RlbSBldmVudCAtIHN0YXJ0ICovCiAjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX1NUQVJUICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCiAjZGVmaW5lCUlXX0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCiAjZGVmaW5lCUlXX0RJU0FTU09DX0VWRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCkBAIC0xMzM4LDEyICsxMjg4LDEyIEBACiAjZGVmaW5lIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHCQkJCQkweDAyMTAKICNkZWZpbmUgSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRwkJCQkweDAyMTEKICNkZWZpbmUgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRwkJCQkweDAyMTIKLS8vIGlmIGFkZCBuZXcgc3lzdGVtIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NZU19FVkVOVF9GTEFHX0VORAorLyogaWYgYWRkIG5ldyBzeXN0ZW0gZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1lTX0VWRU5UX0ZMQUdfRU5EICovCiAjZGVmaW5lCUlXX1NZU19FVkVOVF9GTEFHX0VORCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjEyCiAjZGVmaW5lCUlXX1NZU19FVkVOVF9UWVBFX05VTQkJCQkJCShJV19TWVNfRVZFTlRfRkxBR19FTkQgLSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCArIDEpCi0vLyBGb3Igc3lzdGVtIGV2ZW50IC0gZW5kCisvKiBGb3Igc3lzdGVtIGV2ZW50IC0gZW5kICovCiAKLS8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBzdGFydAorLyogRm9yIHNwb29mIGF0dGFjayBldmVudCAtIHN0YXJ0ICovCiAjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwMzAwCiAjZGVmaW5lIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRwkJCQkJMHgwMzAwCiAjZGVmaW5lIElXX1NQT09GX0FTU09DX1JFU1BfRVZFTlRfRkxBRwkJCQkweDAzMDEKQEAgLTEzNTUsMTIgKzEzMDUsMTIgQEAKICNkZWZpbmUgSVdfU1BPT0ZfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNwogI2RlZmluZSBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRwkJCTB4MDMwOAogI2RlZmluZSBJV19SRVBMQVlfQVRUQUNLX0VWRU5UX0ZMQUcJCQkJCTB4MDMwOQotLy8gaWYgYWRkIG5ldyBzcG9vZiBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQKKy8qIGlmIGFkZCBuZXcgc3Bvb2YgYXR0YWNrIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICovCiAjZGVmaW5lCUlXX1NQT09GX0VWRU5UX0ZMQUdfRU5EICAgICAgICAgICAgICAgICAgICAgMHgwMzA5CiAjZGVmaW5lCUlXX1NQT09GX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX1NQT09GX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCArIDEpCi0vLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kCisvKiBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gZW5kICovCiAKLS8vIEZvciBmbG9vZGluZyBhdHRhY2sgZXZlbnQgLSBzdGFydAorLyogRm9yIGZsb29kaW5nIGF0dGFjayBldmVudCAtIHN0YXJ0ICovCiAjZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwNDAwCiAjZGVmaW5lIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDAwCiAjZGVmaW5lIElXX0ZMT09EX0FTU09DX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMQpAQCAtMTM2OSwxOCArMTMxOSwxOCBAQAogI2RlZmluZSBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHCQkJCTB4MDQwNAogI2RlZmluZSBJV19GTE9PRF9ERUFVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDA1CiAjZGVmaW5lIElXX0ZMT09EX0VBUF9SRVFfRVZFTlRfRkxBRwkJCQkJMHgwNDA2Ci0vLyBpZiBhZGQgbmV3IGZsb29kaW5nIGF0dGFjayBldmVudCBmbGFnLCBwbGVhc2UgdXBhZHRlIHRoZSBJV19GTE9PRF9FVkVOVF9GTEFHX0VORAorLyogaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgKi8KICNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgCTB4MDQwNgogI2RlZmluZQlJV19GTE9PRF9FVkVOVF9UWVBFX05VTQkJCQkJCShJV19GTE9PRF9FVkVOVF9GTEFHX0VORCAtIElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQotLy8gRm9yIGZsb29kaW5nIGF0dGFjayAtIGVuZAorLyogRm9yIGZsb29kaW5nIGF0dGFjayAtIGVuZCAqLwogCi0vLyBFbmQgLSBXSVJFTEVTUyBFVkVOVFMgZGVmaW5pdGlvbgorLyogRW5kIC0gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24gKi8KIAotLy8gZGVmaW5pdGlvbiBmb3IgRExTLCBrYXRoeQorLyogZGVmaW5pdGlvbiBmb3IgRExTLCBrYXRoeSAqLwogI2RlZmluZQlNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZICAgMQogI2RlZmluZQlNQVhfTlVNX09GX0RMU19FTlRSWSAgICAgICAgTUFYX05VTUJFUl9PRl9ETFNfRU5UUlkKIAotLy9CbG9jayBBQ0sgLCBydDI4NjAsIGthdGh5CisvKkJsb2NrIEFDSywga2F0aHkgKi8KICNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYJCTY0CiAjZGVmaW5lIE1BWF9SWF9SRU9SREVSQlVGCQk2NAogI2RlZmluZSBERUZBVUxUX1RYX1RJTUVPVVQJCTMwCkBAIC0xMzkyLDY1ICsxMzQyLDQ4IEBACiAjZGVmaW5lIElXX0VTU0lEX01BWF9TSVpFICAgCQkzMgogI2VuZGlmCiAKLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0jZGVmaW5lIE1DQVNUX0RJU0FCTEUJMAotI2RlZmluZSBNQ0FTVF9DQ0sJCTEKLSNkZWZpbmUgTUNBU1RfT0ZETQkJMgotI2RlZmluZSBNQ0FTVF9IVE1JWAkJMwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQotI2lmZGVmIFJUMjg2MAotLy8gRm9yIEFzaWNSYWRpb09mZi9Bc2ljUmFkaW9Pbi9Bc2ljRm9yY2VXYWtldXAgZnVuY3Rpb24KLS8vIFRoaXMgaXMgdG8gaW5kaWNhdGUgZnJvbSB3aGVyZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCi0jZGVmaW5lIERPVDExUE9XRVJTQVZFCQkwCS8vIFRPIGRvIC4xMSBwb3dlciBzYXZlIHNsZWVwCi0jZGVmaW5lIEdVSVJBRElPX09GRgkJMQkvLyBUbyBwZXJmb3JtIFJhZGlvIE9GZiBjb21tYW5kIGZyb20gR1VJCi0jZGVmaW5lIFJUTVBfSEFMVAkJCTIJLy8gQ2FsbGVkIGZyb20gSGFsdCBoYW5kbGVyLgotI2RlZmluZSBHVUlfSURMRV9QT1dFUl9TQVZFCTMJLy8gQ2FsbCB0byBzbGVlcCBiZWZvcmUgbGluayB1cCB3aXRoIEFQCi0jZGVmaW5lIEZST01fVFgJCQkJNAkvLyBGb3JjZSB3YWtlIHVwIGZyb20gVHggcGFja2V0LgotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0vLyBGb3IgQXNpY1JhZGlvT2ZmL0FzaWNSYWRpb09uIGZ1bmN0aW9uCisvKiBGb3IgQXNpY1JhZGlvT2ZmL0FzaWNSYWRpb09uIGZ1bmN0aW9uICovCiAjZGVmaW5lIERPVDExUE9XRVJTQVZFCQkwCiAjZGVmaW5lIEdVSVJBRElPX09GRgkJMQogI2RlZmluZSBSVE1QX0hBTFQJCSAgICAyCiAjZGVmaW5lIEdVSV9JRExFX1BPV0VSX1NBVkUJCTMKLSNlbmRpZgorLyogLS0gKi8KIAotLy8gZGVmaW5pdGlvbiBmb3IgV3BhU3VwcG9ydCBmbGFnCisvKiBkZWZpbml0aW9uIGZvciBXcGFTdXBwb3J0IGZsYWcgKi8KICNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRElTQUJMRQkJCQkwCiAjZGVmaW5lIFdQQV9TVVBQTElDQU5UX0VOQUJMRQkJCQkxCiAjZGVmaW5lCVdQQV9TVVBQTElDQU5UX0VOQUJMRV9XSVRIX1dFQl9VSQkyCiAKLS8vIEVuZGlhbiBieXRlIHN3YXBwaW5nIGNvZGVzCisvKiBFbmRpYW4gYnl0ZSBzd2FwcGluZyBjb2RlcyAqLwogI2RlZmluZSBTV0FQMTYoeCkgXAotICAgICgoVUlOVDE2KSggXAotICAgICgoKFVJTlQxNikoeCkgJiAoVUlOVDE2KSAweDAwZmZVKSA8PCA4KSB8IFwKLSAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHhmZjAwVSkgPj4gOCkgKSkKKyAgICAoKHUxNikoIFwKKyAgICAoKCh1MTYpKHgpICYgKHUxNikweDAwZmZVKSA8PCA4KSB8IFwKKyAgICAoKCh1MTYpKHgpICYgKHUxNikweGZmMDBVKSA+PiA4KSApKQogCiAjZGVmaW5lIFNXQVAzMih4KSBcCi0gICAgKChVSU5UMzIpKCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMDAwZmZVTCkgPDwgMjQpIHwgXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4ZmYwMDAwMDBVTCkgPj4gMjQpICkpCisgICAgKCh1MzIpKCBcCisgICAgKCgodTMyKSh4KSAmICh1MzIpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCisgICAgKCgodTMyKSh4KSAmICh1MzIpMHgwMDAwZmYwMFVMKSA8PCAgOCkgfCBcCisgICAgKCgodTMyKSh4KSAmICh1MzIpMHgwMGZmMDAwMFVMKSA+PiAgOCkgfCBcCisgICAgKCgodTMyKSh4KSAmICh1MzIpMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKIAogI2RlZmluZSBTV0FQNjQoeCkgXAotICAgICgoVUlOVDY0KSggXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCisgICAgKCh1NjQpKCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMDAwMDAwMDAwZmYwMDAwVUxMKSA8PCAyNCkgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAorICAgICh1NjQpKCgodTY0KSh4KSAmICh1NjQpMHgwMDAwZmYwMDAwMDAwMDAwVUxMKSA+PiAyNCkgfCBcCisgICAgKHU2NCkoKCh1NjQpKHgpICYgKHU2NCkweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8IFwKKyAgICAodTY0KSgoKHU2NCkoeCkgJiAodTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCiAKLSNkZWZpbmUgY3B1MmxlNjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBsZTJjcHU2NCh4KSAoKFVJTlQ2NCkoeCkpCi0jZGVmaW5lIGNwdTJsZTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgbGUyY3B1MzIoeCkgKChVSU5UMzIpKHgpKQotI2RlZmluZSBjcHUybGUxNih4KSAoKFVJTlQxNikoeCkpCi0jZGVmaW5lIGxlMmNwdTE2KHgpICgoVUlOVDE2KSh4KSkKKyNkZWZpbmUgY3B1MmxlNjQoeCkgKCh1NjQpKHgpKQorI2RlZmluZSBsZTJjcHU2NCh4KSAoKHU2NCkoeCkpCisjZGVmaW5lIGNwdTJsZTMyKHgpICgodTMyKSh4KSkKKyNkZWZpbmUgbGUyY3B1MzIoeCkgKCh1MzIpKHgpKQorI2RlZmluZSBjcHUybGUxNih4KSAoKHUxNikoeCkpCisjZGVmaW5lIGxlMmNwdTE2KHgpICgodTE2KSh4KSkKICNkZWZpbmUgY3B1MmJlNjQoeCkgU1dBUDY0KCh4KSkKICNkZWZpbmUgYmUyY3B1NjQoeCkgU1dBUDY0KCh4KSkKICNkZWZpbmUgY3B1MmJlMzIoeCkgU1dBUDMyKCh4KSkKQEAgLTE0NTgsNiArMTM5MSwzNiBAQAogI2RlZmluZSBjcHUyYmUxNih4KSBTV0FQMTYoKHgpKQogI2RlZmluZSBiZTJjcHUxNih4KSBTV0FQMTYoKHgpKQogCi0jZW5kaWYgIC8vIF9fUlRNUF9ERUZfSF9fCisjZGVmaW5lIEFCUyhfeCwgX3kpICgoX3gpID4gKF95KSkgPyAoKF94KSAtKF95KSkgOiAoKF95KSAtKF94KSkKIAorI2RlZmluZSBBMkRlYyhfWCwgX3ApCQkJCVwKK3sJCQkJCQkJCQlcCisJdTggKnA7CQkJCQkJXAorCV9YID0gMDsJCQkJCQkJXAorCXAgPSBfcDsJCQkJCQkJXAorCXdoaWxlICgoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpKQkJXAorCXsJCQkJCQkJCQkJCQlcCisJCWlmICgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkJCVwKKwkJCV9YID0gX1ggKiAxMCArICpwIC0gNDg7CQkJCQlcCisJCXArKzsJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9CiAKKyNkZWZpbmUgQTJIZXgoX1gsIF9wKQkJCQlcCitkb3sJCQkJCQkJCQlcCisJY2hhciAqX19wOwkJCQkJCVwKKwkoX1gpID0gMDsJCQkJCQkJXAorCV9fcCA9IChjaGFyICopKF9wKTsJCQkJCQkJXAorCXdoaWxlICgoKCpfX3AgPj0gJ2EnKSAmJiAoKl9fcCA8PSAnZicpKSB8fCAoKCpfX3AgPj0gJ0EnKSAmJiAoKl9fcCA8PSAnRicpKSB8fCAoKCpfX3AgPj0gJzAnKSAmJiAoKl9fcCA8PSAnOScpKSkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlpZiAoKCpfX3AgPj0gJ2EnKSAmJiAoKl9fcCA8PSAnZicpKQkJCQlcCisJCQkoX1gpID0gKF9YKSAqIDE2ICsgKl9fcCAtIDg3OwkJCQkJXAorCQllbHNlIGlmICgoKl9fcCA+PSAnQScpICYmICgqX19wIDw9ICdGJykpCQlcCisJCQkoX1gpID0gKF9YKSAqIDE2ICsgKl9fcCAtIDU1OwkJCQkJXAorCQllbHNlIGlmICgoKl9fcCA+PSAnMCcpICYmICgqX19wIDw9ICc5JykpCQlcCisJCQkoX1gpID0gKF9YKSAqIDE2ICsgKl9fcCAtIDQ4OwkJCQkJXAorCQlfX3ArKzsJCQkJCQkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9d2hpbGUoMCkKKworI2VuZGlmIC8qIF9fUlRNUF9ERUZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZG90MTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9kb3QxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGFiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfZG90MTEuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fRE9UMTFfQkFTRV9IX18KKyNkZWZpbmUgX19ET1QxMV9CQVNFX0hfXworCisjaW5jbHVkZSAicnRtcF90eXBlLmgiCisKKy8qIDQtYnl0ZSBIVEMgZmllbGQuICBtYXliZSBpbmNsdWRlZCBpbiBhbnkgZnJhbWUgZXhjZXB0IG5vbi1RT1MgZGF0YSBmcmFtZS4gIFRoZSBPcmRlciBiaXQgbXVzdCBzZXQgMS4gKi8KK3N0cnVjdCBQQUNLRUQgcnRfaHRfY29udHJvbCB7CisJdTMyIE1BOjE7CQkvKm1hbmFnZW1lbnQgYWN0aW9uIHBheWxvYWQgZXhpc3QgaW4gKFFvUyBOdWxsK0hUQykgKi8KKwl1MzIgVFJROjE7CQkvKnNvdW5kaW5nIHJlcXVlc3QgKi8KKwl1MzIgTVJROjE7CQkvKk1DUyBmZWVkYmFjay4gUmVxdWVzdCBmb3IgYSBNQ1MgZmVlZGJhY2sgKi8KKwl1MzIgTVJTb3JBU0k6MzsJLyogTVJRIFNlcXVlbmNlIGlkZW50aWZpZXIuIHVuY2hhbmdlZCBkdXJpbmcgZW50aXJlIHByb2NlZHVyZS4gMHgwMDAtMHgxMTAuICovCisJdTMyIE1GUzozOwkJLypTRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4gKi8KKwl1MzIgTUZCb3JBU0M6NzsJLypMaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUgKi8KKwl1MzIgQ2FsUG9zOjI7CS8qIGNhbGlicmF0aW9uIHBvc2l0aW9uICovCisJdTMyIENhbFNlcToyOwkvKmNhbGlicmF0aW9uIHNlcXVlbmNlICovCisJdTMyIEZCS1JlcToyOwkvKmZlZWRiYWNrIHJlcXVlc3QgKi8KKwl1MzIgQ1NJU1RFRVJJTkc6MjsJLypDU0kvIFNURUVSSU5HICovCisJdTMyIFpMRkFubm91Y2U6MTsJLyogWkxGIGFubm91bmNlbWVudCAqLworCXUzMiByc3Y6NTsJCS8qY2FsaWJyYXRpb24gc2VxdWVuY2UgKi8KKwl1MzIgQUNDb25zdHJhaW50OjE7CS8qZmVlZGJhY2sgcmVxdWVzdCAqLworCXUzMiBSREc6MTsJCS8qUkRHIC8gTW9yZSBQUERVICovCit9OworCisvKiAyLWJ5dGUgUU9TIENPTlRST0wgZmllbGQgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcW9zX2NvbnRyb2wgeworCXUxNiBUSUQ6NDsKKwl1MTYgRU9TUDoxOworCXUxNiBBY2tQb2xpY3k6MjsJLyowOiBub3JtYWwgQUNLIDE6Tm8gQUNLIDI6c2NoZWR1bGVkIHVuZGVyIE1UQkEvUFNNUCAgMzogQkEgKi8KKwl1MTYgQU1zZHVQcmVzZW50OjE7CisJdTE2IFR4b3BfUXVldWVTaXplOjg7Cit9OworCisvKiAyLWJ5dGUgRnJhbWUgY29udHJvbCBmaWVsZCAqLworc3RydWN0IFBBQ0tFRCBydF9mcmFtZV9jb250cm9sIHsKKwl1MTYgVmVyOjI7CQkvKiBQcm90b2NvbCB2ZXJzaW9uICovCisJdTE2IFR5cGU6MjsJCS8qIE1TRFUgdHlwZSAqLworCXUxNiBTdWJUeXBlOjQ7CS8qIE1TRFUgc3VidHlwZSAqLworCXUxNiBUb0RzOjE7CQkvKiBUbyBEUyBpbmRpY2F0aW9uICovCisJdTE2IEZyRHM6MTsJCS8qIEZyb20gRFMgaW5kaWNhdGlvbiAqLworCXUxNiBNb3JlRnJhZzoxOwkvKiBNb3JlIGZyYWdtZW50IGJpdCAqLworCXUxNiBSZXRyeToxOwkJLyogUmV0cnkgc3RhdHVzIGJpdCAqLworCXUxNiBQd3JNZ210OjE7CS8qIFBvd2VyIG1hbmFnZW1lbnQgYml0ICovCisJdTE2IE1vcmVEYXRhOjE7CS8qIE1vcmUgZGF0YSBiaXQgKi8KKwl1MTYgV2VwOjE7CQkvKiBXZXAgZGF0YSAqLworCXUxNiBPcmRlcjoxOwkJLyogU3RyaWN0IG9yZGVyIGV4cGVjdGVkICovCit9OworCitzdHJ1Y3QgUEFDS0VEIHJ0X2hlYWRlcl84MDJfMTEgeworCXN0cnVjdCBydF9mcmFtZV9jb250cm9sIEZDOworCXUxNiBEdXJhdGlvbjsKKwl1OCBBZGRyMVtNQUNfQUREUl9MRU5dOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJdTggQWRkcjNbTUFDX0FERFJfTEVOXTsKKwl1MTYgRnJhZzo0OworCXUxNiBTZXF1ZW5jZToxMjsKKwl1OCBPY3RldFswXTsKK307CisKK3N0cnVjdCBQQUNLRUQgcnRfcHNwb2xsX2ZyYW1lIHsKKwlzdHJ1Y3QgcnRfZnJhbWVfY29udHJvbCBGQzsKKwl1MTYgQWlkOworCXU4IEJzc2lkW01BQ19BRERSX0xFTl07CisJdTggVGFbTUFDX0FERFJfTEVOXTsKK307CisKK3N0cnVjdCBQQUNLRUQgcnRfcnRzX2ZyYW1lIHsKKwlzdHJ1Y3QgcnRfZnJhbWVfY29udHJvbCBGQzsKKwl1MTYgRHVyYXRpb247CisJdTggQWRkcjFbTUFDX0FERFJfTEVOXTsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworfTsKKworI2VuZGlmIC8qIF9fRE9UMTFfQkFTRV9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9pZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX2lmYWNlLmgKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2lmYWNlLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9pZmFjZS5oCmluZGV4IDE2OGQwNzkuLjgwOGMwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9pZmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9pZmFjZS5oCkBAIC0zOCw0NCArMzgsMzggQEAKICNkZWZpbmUgX19SVE1QX0lGQUNFX0hfXwogCiAjaWZkZWYgUlRNUF9QQ0lfU1VQUE9SVAotI2luY2x1ZGUgInJ0bXBfcGNpLmgiCi0jZW5kaWYgLy8gUlRNUF9QQ0lfU1VQUE9SVCAvLworI2luY2x1ZGUgImlmYWNlL3J0bXBfcGNpLmgiCisjZW5kaWYgLyogUlRNUF9QQ0lfU1VQUE9SVCAvLyAqLworI2lmZGVmIFJUTVBfVVNCX1NVUFBPUlQKKyNpbmNsdWRlICJpZmFjZS9ydG1wX3VzYi5oIgorI2VuZGlmIC8qIFJUTVBfVVNCX1NVUFBPUlQgLy8gKi8KIAorc3RydWN0IHJ0X2luZl9wY2lfY29uZmlnIHsKKwl1bnNpZ25lZCBsb25nIENTUkJhc2VBZGRyZXNzOwkvKiBQQ0kgTU1JTyBCYXNlIEFkZHJlc3MsIGFsbCBhY2Nlc3Mgd2lsbCB1c2UgKi8KKwl1bnNpZ25lZCBpbnQgaXJxX251bTsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9JTkZfUENJX0NPTkZJR18KLXsKLQl1bnNpZ25lZCBsb25nCUNTUkJhc2VBZGRyZXNzOyAgICAgLy8gUENJIE1NSU8gQmFzZSBBZGRyZXNzLCBhbGwgYWNjZXNzIHdpbGwgdXNlCi0JdW5zaWduZWQgaW50CWlycV9udW07Ci19SU5GX1BDSV9DT05GSUc7CitzdHJ1Y3QgcnRfaW5mX3VzYl9jb25maWcgeworCXU4IEJ1bGtJbkVwQWRkcjsJLyogYnVsay1pbiBlbmRwb2ludCBhZGRyZXNzICovCisJdTggQnVsa091dEVwQWRkcls2XTsJLyogYnVsay1vdXQgZW5kcG9pbnQgYWRkcmVzcyAqLworfTsKIAorc3RydWN0IHJ0X2luZl9yYnVzX2NvbmZpZyB7CisJdW5zaWduZWQgbG9uZyBjc3JfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaXJxOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX0lORl9VU0JfQ09ORklHXwotewotCVVJTlQ4ICAgICAgICAgICAgICAgIEJ1bGtJbkVwQWRkcjsJCS8vIGJ1bGstaW4gZW5kcG9pbnQgYWRkcmVzcwotCVVJTlQ4ICAgICAgICAgICAgICAgIEJ1bGtPdXRFcEFkZHJbNl07CS8vIGJ1bGstb3V0IGVuZHBvaW50IGFkZHJlc3MKLX1JTkZfVVNCX0NPTkZJRzsKLQotCi10eXBlZGVmIHN0cnVjdCBfSU5GX1JCVVNfQ09ORklHXwotewotCXVuc2lnbmVkIGxvbmcJCWNzcl9hZGRyOwotCXVuc2lnbmVkIGludAkJaXJxOwotfUlORl9SQlVTX0NPTkZJRzsKLQotCi10eXBlZGVmIGVudW0gX1JUTVBfSU5GX1RZUEVfCi17Cit0eXBlZGVmIGVudW0gX1JUTVBfSU5GX1RZUEVfIHsKIAlSVE1QX0RFVl9JTkZfVU5LTk9XTiA9IDAsCiAJUlRNUF9ERVZfSU5GX1BDSSA9IDEsCiAJUlRNUF9ERVZfSU5GX1VTQiA9IDIsCiAJUlRNUF9ERVZfSU5GX1JCVVMgPSA0LAotfVJUTVBfSU5GX1RZUEU7Cit9IFJUTVBfSU5GX1RZUEU7CiAKK3R5cGVkZWYgdW5pb24gX1JUTVBfSU5GX0NPTkZJR18geworCXN0cnVjdCBydF9pbmZfcGNpX2NvbmZpZyBwY2lDb25maWc7CisJc3RydWN0IHJ0X2luZl91c2JfY29uZmlnIHVzYkNvbmZpZzsKKwlzdHJ1Y3QgcnRfaW5mX3JidXNfY29uZmlnIHJidXNDb25maWc7Cit9IFJUTVBfSU5GX0NPTkZJRzsKIAotdHlwZWRlZiB1bmlvbiBfUlRNUF9JTkZfQ09ORklHX3sKLQlzdHJ1Y3QgX0lORl9QQ0lfQ09ORklHXwkJCXBjaUNvbmZpZzsKLQlzdHJ1Y3QgX0lORl9VU0JfQ09ORklHXwkJCXVzYkNvbmZpZzsKLQlzdHJ1Y3QgX0lORl9SQlVTX0NPTkZJR18JCXJidXNDb25maWc7Ci19UlRNUF9JTkZfQ09ORklHOwotCi0jZW5kaWYgLy8gX19SVE1QX0lGQUNFX0hfXyAvLworI2VuZGlmIC8qIF9fUlRNUF9JRkFDRV9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9tY3UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9tY3UuaApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWN1LmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF9tY3UuaAppbmRleCBlMWIyZmVlLi5kMDk4N2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWN1LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX21jdS5oCkBAIC0zOCwxOCArMzgsMTIgQEAKICNpZm5kZWYgX19SVE1QX01DVV9IX18KICNkZWZpbmUgX19SVE1QX01DVV9IX18KIAoraW50IFJ0bXBBc2ljRXJhc2VGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1JTlQgUnRtcEFzaWNFcmFzZUZpcm13YXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK2ludCBSdG1wQXNpY0xvYWRGaXJtd2FyZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1ORElTX1NUQVRVUyBSdG1wQXNpY0xvYWRGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7CitpbnQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgdTggQ29tbWFuZCwKKwkJCSAgICAgdTggVG9rZW4sIHU4IEFyZzAsIHU4IEFyZzEpOwogCi1JTlQgUnRtcEFzaWNTZW5kQ29tbWFuZFRvTWN1KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCwKLQlJTiBVQ0hBUgkJIFRva2VuLAotCUlOIFVDSEFSCQkgQXJnMCwKLQlJTiBVQ0hBUgkJIEFyZzEpOwotCi0jZW5kaWYgLy8gX19SVE1QX01DVV9IX18gLy8KKyNlbmRpZiAvKiBfX1JUTVBfTUNVX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX29zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfb3MuaApzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfb3MuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX29zLmgKaW5kZXggNTY0NmIyZC4uOTRjMzBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX29zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX29zLmgKQEAgLTM0LDE0ICszNCwxMiBAQAogICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi0KICNpZm5kZWYgX19SVE1QX09TX0hfXwogI2RlZmluZSBfX1JUTVBfT1NfSF9fCiAKICNpZmRlZiBMSU5VWAogI2luY2x1ZGUgInJ0X2xpbnV4LmgiCi0jZW5kaWYgLy8gTElOVVggLy8KLQorI2VuZGlmIC8qIExJTlVYIC8vICovCiAKIC8qCiAJVGhpcyBkYXRhIHN0cnVjdHVyZSBtYWlubHkgc3RyaXAgc29tZSBjYWxsYmFjayBmdW5jdGlvbiBkZWZpbmVkIGluCkBAIC01MCw0NCArNDgsNDMgQEAKIAlUaGUgZGVmaW5pdGlvbiBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIG1heSB2YXJpb3VzIGRlcGVuZHMgb24gZGlmZmVyZW50CiAJT1MuIFVzZSBpdCBjYXJlZnVsbHkuCiAqLwotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfT1NfTkVUREVWX09QX0hPT0tfCi17CitzdHJ1Y3QgcnRfcnRtcF9vc19uZXRkZXZfb3BfaG9vayB7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpuZXRkZXZfb3BzOwotCXZvaWQJCQkqcHJpdjsKLQlpbnQJCQlwcml2X2ZsYWdzOworCXZvaWQgKnByaXY7CisJaW50IHByaXZfZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBkZXZBZGRyWzZdOwotCXVuc2lnbmVkIGNoYXIJZGV2TmFtZVsxNl07Ci0JdW5zaWduZWQgY2hhcgluZWVkUHJvdGN0ZWQ7Ci19UlRNUF9PU19ORVRERVZfT1BfSE9PSywgKlBSVE1QX09TX05FVERFVl9PUF9IT09LOworCXVuc2lnbmVkIGNoYXIgZGV2TmFtZVsxNl07CisJdW5zaWduZWQgY2hhciBuZWVkUHJvdGN0ZWQ7Cit9OwogCi0KLXR5cGVkZWYgZW51bSBfUlRNUF9UQVNLX1NUQVRVU18KLXsKK3R5cGVkZWYgZW51bSBfUlRNUF9UQVNLX1NUQVRVU18gewogCVJUTVBfVEFTS19TVEFUX1VOS05PV04gPSAwLAogCVJUTVBfVEFTS19TVEFUX0lOSVRFRCA9IDEsCiAJUlRNUF9UQVNLX1NUQVRfUlVOTklORyA9IDIsCiAJUlRNUF9UQVNLX1NUQVRfU1RPUEVEID0gNCwKLX1SVE1QX1RBU0tfU1RBVFVTOworfSBSVE1QX1RBU0tfU1RBVFVTOwogI2RlZmluZSBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVAkJKFJUTVBfVEFTS19TVEFUX0lOSVRFRCB8UlRNUF9UQVNLX1NUQVRfUlVOTklORykKIAogI2RlZmluZSBSVE1QX09TX1RBU0tfTkFNRV9MRU4JMTYKLXR5cGVkZWYgc3RydWN0IF9SVE1QX09TX1RBU0tfCi17Ci0JY2hhcgkJCQkJdGFza05hbWVbUlRNUF9PU19UQVNLX05BTUVfTEVOXTsKLQl2b2lkCQkJCQkqcHJpdjsKLQkvL3Vuc2lnbmVkIGxvbmcJCXRhc2tGbGFnczsKLQlSVE1QX1RBU0tfU1RBVFVTCXRhc2tTdGF0dXM7CitzdHJ1Y3QgcnRfcnRtcF9vc190YXNrIHsKKwljaGFyIHRhc2tOYW1lW1JUTVBfT1NfVEFTS19OQU1FX0xFTl07CisJdm9pZCAqcHJpdjsKKwkvKnVuc2lnbmVkIGxvbmcgICAgICAgICB0YXNrRmxhZ3M7ICovCisJUlRNUF9UQVNLX1NUQVRVUyB0YXNrU3RhdHVzOwogI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKLQlSVE1QX09TX1NFTQkJCXRhc2tTZW1hOwotCVJUTVBfT1NfUElECQkJdGFza1BJRDsKLQlzdHJ1Y3QgY29tcGxldGlvbgkJdGFza0NvbXBsZXRlOworCXN0cnVjdCBzZW1hcGhvcmUgdGFza1NlbWE7CisJc3RydWN0IHBpZCAqdGFza1BJRDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0YXNrQ29tcGxldGU7CiAjZW5kaWYKLQl1bnNpZ25lZCBjaGFyCQkJdGFza19raWxsZWQ7CisJdW5zaWduZWQgY2hhciB0YXNrX2tpbGxlZDsKICNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmt0aHJlYWRfdGFzazsKLQl3YWl0X3F1ZXVlX2hlYWRfdAkJa3RocmVhZF9xOwotCUJPT0xFQU4JCQkJCWt0aHJlYWRfcnVubmluZzsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt0aHJlYWRfdGFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBrdGhyZWFkX3E7CisJQk9PTEVBTiBrdGhyZWFkX3J1bm5pbmc7CiAjZW5kaWYKLX1SVE1QX09TX1RBU0s7Cit9OwogCi0jZW5kaWYgLy8gX19STVRQX09TX0hfXyAvLworaW50IFJ0bXBPU0lSUVJlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworaW50IFJ0bXBPU0lSUVJlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOworCisjZW5kaWYgLyogX19STVRQX09TX0hfXyAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3RpbWVyLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdGltZXIuaApzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdGltZXIuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKaW5kZXggZGZhYzEyNC4uMjhiOGFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX3RpbWVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3RpbWVyLmgKQEAgLTQzLDY5ICs0Myw2MiBAQAogCiAjaW5jbHVkZSAicnRtcF9vcy5oIgogCi0KICNkZWZpbmUgREVDTEFSRV9USU1FUl9GVU5DVElPTihfZnVuYykJCQlcCiAJdm9pZCBydG1wX3RpbWVyXyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQogCiAjZGVmaW5lIEdFVF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJXAogCXJ0bXBfdGltZXJfIyNfZnVuYwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tIFRpbWVyIFJlbGF0ZWQgTUFSQ08gLS0tLS0tLS0tLS0tLS0tKi8KLS8vIEluIHNvbWUgb3Mgb3IgY2hpcHNldCwgd2UgaGF2ZSBhIGxvdCBvZiB0aW1lciBmdW5jdGlvbnMgYW5kIHdpbGwgcmVhZC93cml0ZSByZWdpc3RlciwKLS8vICAgaXQncyBub3QgYWxsb3dlZCBpbiBMaW51eCBVU0Igc3ViLXN5c3RlbSB0byBkbyBpdCAoIGJlY2F1c2Ugb2Ygc2xlZXAgaXNzdWUgd2hlbgotLy8gIHN1Ym1pdCB0byBjdHJsIHBpcGUpLiBTbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiB0byB0YWtlIGNhcmUgaXQuCisvKiBJbiBzb21lIG9zIG9yIGNoaXBzZXQsIHdlIGhhdmUgYSBsb3Qgb2YgdGltZXIgZnVuY3Rpb25zIGFuZCB3aWxsIHJlYWQvd3JpdGUgcmVnaXN0ZXIsICovCisvKiAgIGl0J3Mgbm90IGFsbG93ZWQgaW4gTGludXggVVNCIHN1Yi1zeXN0ZW0gdG8gZG8gaXQgKCBiZWNhdXNlIG9mIHNsZWVwIGlzc3VlIHdoZW4gKi8KKy8qICBzdWJtaXQgdG8gY3RybCBwaXBlKS4gU28gd2UgbmVlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIGl0LiAqLwogCiAjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLXR5cGVkZWYgVk9JRCAoKlJUTVBfVElNRVJfVEFTS19IQU5ETEUpKAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMSwKLQlJTiAgUFZPSUQgICBGdW5jdGlvbkNvbnRleHQsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMyLAotCUlOICBQVk9JRCAgIFN5c3RlbVNwZWNpZmljMyk7Ci0jZW5kaWYgLy8gUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8KK3R5cGVkZWYgdm9pZCgqUlRNUF9USU1FUl9UQVNLX0hBTkRMRSkgKHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJCQkgICAgICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkJCSAgICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkJICAgICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMyk7CisjZW5kaWYgLyogUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQgLy8gKi8KIAotdHlwZWRlZiBzdHJ1Y3QgIF9SQUxJTktfVElNRVJfU1RSVUNUICAgIHsKLQlSVE1QX09TX1RJTUVSCQlUaW1lck9iajsgICAgICAgLy8gTmRpcyBUaW1lciBvYmplY3QKLQlCT09MRUFOCQkJCVZhbGlkOwkJCS8vIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyCi0JQk9PTEVBTgkJCQlTdGF0ZTsgICAgICAgICAgLy8gVHJ1ZSBpZiB0aW1lciBjYW5jZWxsZWQKLQlCT09MRUFOCQkJCVBlcmlvZGljVHlwZTsJLy8gVHJ1ZSBpZiB0aW1lciBpcyBwZXJpb2RpYyB0aW1lcgotCUJPT0xFQU4JCQkJUmVwZWF0OyAgICAgICAgIC8vIFRydWUgaWYgcGVyaW9kaWMgdGltZXIKLQlVTE9ORwkJCQlUaW1lclZhbHVlOyAgICAgLy8gVGltZXIgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCi0JVUxPTkcJCQkJY29va2llOwkJCS8vIG9zIHNwZWNpZmljIG9iamVjdAorc3RydWN0IHJ0X3JhbGlua190aW1lciB7CisJc3RydWN0IHRpbWVyX2xpc3QgVGltZXJPYmo7CS8qIE5kaXMgVGltZXIgb2JqZWN0ICovCisJQk9PTEVBTiBWYWxpZDsJCS8qIFNldCB0byBUcnVlIHdoZW4gY2FsbCBSVE1QSW5pdFRpbWVyICovCisJQk9PTEVBTiBTdGF0ZTsJCS8qIFRydWUgaWYgdGltZXIgY2FuY2VsbGVkICovCisJQk9PTEVBTiBQZXJpb2RpY1R5cGU7CS8qIFRydWUgaWYgdGltZXIgaXMgcGVyaW9kaWMgdGltZXIgKi8KKwlCT09MRUFOIFJlcGVhdDsJCS8qIFRydWUgaWYgcGVyaW9kaWMgdGltZXIgKi8KKwl1bnNpZ25lZCBsb25nIFRpbWVyVmFsdWU7CS8qIFRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcyAqLworCXVuc2lnbmVkIGxvbmcgY29va2llOwkJLyogb3Mgc3BlY2lmaWMgb2JqZWN0ICovCiAjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQlSVE1QX1RJTUVSX1RBU0tfSEFORExFCWhhbmRsZTsKLQl2b2lkCQkJCQkqcEFkOwotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi19UkFMSU5LX1RJTUVSX1NUUlVDVCwgKlBSQUxJTktfVElNRVJfU1RSVUNUOwotCisJUlRNUF9USU1FUl9UQVNLX0hBTkRMRSBoYW5kbGU7CisJdm9pZCAqcEFkOworI2VuZGlmCQkJCS8qIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vICovCit9OwogCiAjaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLXR5cGVkZWYgc3RydWN0IF9SVE1QX1RJTUVSX1RBU0tfRU5UUllfCi17Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVAkJCSpwUmFUaW1lcjsKLQlzdHJ1Y3QgX1JUTVBfVElNRVJfVEFTS19FTlRSWV8JKnBOZXh0OwotfVJUTVBfVElNRVJfVEFTS19FTlRSWTsKLQorc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSB7CisJc3RydWN0IHJ0X3JhbGlua190aW1lciAqcFJhVGltZXI7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcE5leHQ7Cit9OwogCiAjZGVmaW5lIFRJTUVSX1FVRVVFX1NJWkVfTUFYCTEyOAotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVElNRVJfVEFTS19RVUVVRV8KLXsKLQl1bnNpZ25lZCBpbnQJCQkJc3RhdHVzOwotCXVuc2lnbmVkIGNoYXIJCQkJKnBUaW1lclFQb2xsOwotCVJUTVBfVElNRVJfVEFTS19FTlRSWQkqcFFQb2xsRnJlZUxpc3Q7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpwUUhlYWQ7Ci0JUlRNUF9USU1FUl9UQVNLX0VOVFJZCSpwUVRhaWw7Ci19UlRNUF9USU1FUl9UQVNLX1FVRVVFOworc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19xdWV1ZSB7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyICpwVGltZXJRUG9sbDsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwUVBvbGxGcmVlTGlzdDsKKwlzdHJ1Y3QgcnRfcnRtcF90aW1lcl90YXNrX2VudHJ5ICpwUUhlYWQ7CisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqcFFUYWlsOworfTsKIAogI2RlZmluZSBCVUlMRF9USU1FUl9GVU5DVElPTihfZnVuYykJCQkJCQkJCQkJXAogdm9pZCBydG1wX3RpbWVyXyMjX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQkJCQkJCQkJCQlcCiB7CQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlQUkFMSU5LX1RJTUVSX1NUUlVDVAlfcFRpbWVyID0gKFBSQUxJTktfVElNRVJfU1RSVUNUKWRhdGE7CQkJCVwKLQlSVE1QX1RJTUVSX1RBU0tfRU5UUlkJKl9wUU5vZGU7CQkJCQkJCQkJCVwKLQlSVE1QX0FEQVBURVIJCQkqX3BBZDsJCQkJCQkJCQkJCVwKKwlzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICpfcFRpbWVyID0gKHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKilkYXRhOwkJCQlcCisJc3RydWN0IHJ0X3J0bXBfdGltZXJfdGFza19lbnRyeSAqX3BRTm9kZTsJCQkJCQkJCQkJXAorCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKl9wQWQ7CQkJCQkJCQkJCQlcCiAJCQkJCQkJCQkJCQkJCQkJCQkJXAogCV9wVGltZXItPmhhbmRsZSA9IF9mdW5jOwkJCQkJCQkJCQkJCQlcCi0JX3BBZCA9IChSVE1QX0FEQVBURVIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCVwKKwlfcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilfcFRpbWVyLT5wQWQ7CQkJCQkJCQkJCVwKIAlfcFFOb2RlID0gUnRtcFRpbWVyUUluc2VydChfcEFkLCBfcFRpbWVyKTsJCQkJCQkJCVwKIAlpZiAoKF9wUU5vZGUgPT0gTlVMTCkgJiYgKF9wQWQtPlRpbWVyUS5zdGF0dXMgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkpCVwKIAkJUlRNUF9PU19BZGRfVGltZXIoJl9wVGltZXItPlRpbWVyT2JqLCBPU19IWik7CQkJCQkJCVwKQEAgLTExNCwyMyArMTA3LDIzIEBACiAjZGVmaW5lIEJVSUxEX1RJTUVSX0ZVTkNUSU9OKF9mdW5jKQkJCQkJCQkJCQlcCiB2b2lkIHJ0bXBfdGltZXJfIyNfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCQkJCQkJCQkJCVwKIHsJCQkJCQkJCQkJCQkJCQkJCQkJXAotCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciA9IChQUkFMSU5LX1RJTUVSX1NUUlVDVCkgZGF0YTsJCQkJXAorCXN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBUaW1lciA9IChzdHJ1Y3QgcnRfcmFsaW5rX3RpbWVyICopZGF0YTsJCQkJXAogCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQlfZnVuYyhOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOwkJCQkJCQlcCisJX2Z1bmMoTlVMTCwgKHZvaWQgKilwVGltZXItPmNvb2tpZSwgTlVMTCwgcFRpbWVyKTsJCQkJCQkJXAogCWlmIChwVGltZXItPlJlcGVhdCkJCQkJCQkJCQkJCQkJCVwKIAkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7CQkJXAogfQotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi0KKyNlbmRpZiAvKiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLyAqLwogCiBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKE1sbWVQZXJpb2RpY0V4ZWMpOwogREVDTEFSRV9USU1FUl9GVU5DVElPTihNbG1lUnNzaVJlcG9ydEV4ZWMpOwogREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCk7CiBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKEFQU0RQZXJpb2RpY0V4ZWMpOwogREVDTEFSRV9USU1FUl9GVU5DVElPTihBc2ljUmZUdW5pbmdFeGVjKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKK0RFQ0xBUkVfVElNRVJfRlVOQ1RJT04oQmVhY29uVXBkYXRlRXhlYyk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAogREVDTEFSRV9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KTsKIERFQ0xBUkVfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpOwogREVDTEFSRV9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCk7CkBAIC0xNDMsMjAgKzEzNiwxMiBAQAogREVDTEFSRV9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyk7CiBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKTsKIAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotREVDTEFSRV9USU1FUl9GVU5DVElPTihEbHNUaW1lb3V0QWN0aW9uKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCisjaWZkZWYgUlRNUF9NQUNfVVNCCitERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKFJ0bXBVc2JTdGFBc2ljRm9yY2VXYWtldXBUaW1lb3V0KTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogI2lmIGRlZmluZWQoQVBfTEVEKSB8fCBkZWZpbmVkKFNUQV9MRUQpCiBERUNMQVJFX1RJTUVSX0ZVTkNUSU9OKExlZEN0cmxNYWluKTsKICNlbmRpZgogCi0KLQotI2VuZGlmIC8vIF9fUlRNUF9USU1FUl9IX18gLy8KKyNlbmRpZiAvKiBfX1JUTVBfVElNRVJfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9ydG1wX3R5cGUuaAppbmRleCAxZmQ3ZGYxLi5kOWJiMmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0bXBfdHlwZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnRtcF90eXBlLmgKQEAgLTM4LDU3ICszOCw1MiBAQAogI2lmbmRlZiBfX1JUTVBfVFlQRV9IX18KICNkZWZpbmUgX19SVE1QX1RZUEVfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiAjZGVmaW5lIFBBQ0tFRCAgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCiAKLS8vIFB1dCBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVjbGFyYXRpb24gaGVyZQotLy8gRm9yIGV4YW1wbGUsIGxpbnV4IHR5cGUgZGVmaW5pdGlvbgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQlVSU5UODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCVVJTlQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50CQlVSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVSU5UNjQ7Ci10eXBlZGVmIGludAkJCQkJSU5UMzI7Ci10eXBlZGVmIGxvbmcgbG9uZyAJCQlJTlQ2NDsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICoJCQlQVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0ICoJCVBVSU5UMTY7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAqCQkJUFVJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICoJUFVJTlQ2NDsKLXR5cGVkZWYgaW50CSoJCQkJCVBJTlQzMjsKLXR5cGVkZWYgbG9uZyBsb25nICogCQkJUElOVDY0OwotCi10eXBlZGVmIHNpZ25lZCBjaGFyCQkJQ0hBUjsKLXR5cGVkZWYgc2lnbmVkIHNob3J0CQlTSE9SVDsKLXR5cGVkZWYgc2lnbmVkIGludAkJCUlOVDsKLXR5cGVkZWYgc2lnbmVkIGxvbmcJCQlMT05HOwotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCUxPTkdMT05HOwotCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJVUNIQVI7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlVU0hPUlQ7Ci10eXBlZGVmIHVuc2lnbmVkIGludAkJVUlOVDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwkJVUxPTkc7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwlVTE9OR0xPTkc7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJQk9PTEVBTjsKLXR5cGVkZWYgdm9pZAkJCQlWT0lEOwotCi10eXBlZGVmIFZPSUQgKgkJCQlQVk9JRDsKLXR5cGVkZWYgQ0hBUiAqCQkJCVBDSEFSOwotdHlwZWRlZiBVQ0hBUiAqIAkJCVBVQ0hBUjsKLXR5cGVkZWYgVVNIT1JUICoJCQlQVVNIT1JUOwotdHlwZWRlZiBMT05HICoJCQkJUExPTkc7Ci10eXBlZGVmIFVMT05HICoJCQkJUFVMT05HOwotdHlwZWRlZiBVSU5UICoJCQkJUFVJTlQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50CU5ESVNfTUVESUFfU1RBVEU7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQk9PTEVBTjsKIAogdHlwZWRlZiB1bmlvbiBfTEFSR0VfSU5URUdFUiB7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgVUlOVCBMb3dQYXJ0OwotICAgICAgICBJTlQzMiBIaWdoUGFydDsKLSAgICB9IHU7Ci0gICAgSU5UNjQgUXVhZFBhcnQ7CisJc3RydWN0IHsKKwkJdTMyIExvd1BhcnQ7CisJCWludCBIaWdoUGFydDsKKwl9IHU7CisJbG9uZyBsb25nIFF1YWRQYXJ0OwogfSBMQVJHRV9JTlRFR0VSOwogCi0jZW5kaWYgIC8vIF9fUlRNUF9UWVBFX0hfXworLyogKi8KKy8qIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uICovCisvKiAqLworc3RydWN0IHJ0X3J0bXBfcmVnX3BhaXIgeworCXVuc2lnbmVkIGxvbmcgUmVnaXN0ZXI7CisJdW5zaWduZWQgbG9uZyBWYWx1ZTsKK307CiAKK3N0cnVjdCBydF9yZWdfcGFpciB7CisJdTggUmVnaXN0ZXI7CisJdTggVmFsdWU7Cit9OworCisvKiAqLworLyogUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24gKi8KKy8qICovCitzdHJ1Y3QgcnRfcnRtcF9yZl9yZWdzIHsKKwl1OCBDaGFubmVsOworCXVuc2lnbmVkIGxvbmcgUjE7CisJdW5zaWduZWQgbG9uZyBSMjsKKwl1bnNpZ25lZCBsb25nIFIzOworCXVuc2lnbmVkIGxvbmcgUjQ7Cit9OworCitzdHJ1Y3QgcnRfZnJlcXVlbmN5X2l0ZW0geworCXU4IENoYW5uZWw7CisJdTggTjsKKwl1OCBSOworCXU4IEs7Cit9OworCisjZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKKyNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTAkJMHgwMQorCisjZW5kaWYgLyogX19SVE1QX1RZUEVfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0dXNiX2lvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3J0dXNiX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhMmZlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvcnR1c2JfaW8uaApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWxpbmsgVGVjaCBJbmMuCisgKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCisgKiBIc2luY2h1IENvdW50eSAzMDIsCisgKiBUYWl3YW4sIFIuTy5DLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9fUlRVU0JfSU9fSF9fCisjZGVmaW5lIF9fUlRVU0JfSU9fSF9fCisKKyNpbmNsdWRlICJydG1wX3R5cGUuaCIKKworLyogTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAxCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1VOUExVRyAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDIJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfU1dJVENIX0ZVTkNUSU9OICAgICAgICAgICAgMHgwRDczMDEwMwkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQyAgICAgICAgICAgICAgICAgICAweDBENzMwMTA3CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfTVVMVElfUkVBRF9NQUMgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDgJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFICAgICAgICAgICAgICAgMHgwRDczMDEwQQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRCAgICAgICAgICAgICAgICAweDBENzMwMTBCCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VOVEVSX1RFU1RNT0RFICAgICAgICAgICAgIDB4MEQ3MzAxMEMJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRVhJVF9URVNUTU9ERSAgICAgICAgICAgICAgMHgwRDczMDEwRAkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9XUklURV9CQlAgICAgICAgICAgICAgICAgICAweDBENzMwMTE5CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1JFQURfQkJQICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMTgJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfUkYgICAgICAgICAgICAgICAgICAgMHgwRDczMDExQQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9GTElQX0lRICAgICAgICAgICAgICAgICAgICAweDBENzMwMTFECS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTAJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9QU01fQklUCQkJCTB4MEQ3MzAyMTIJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfUkFESU8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNAkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1VQREFURV9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAweDBENzMwMjE2CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfODAyXzExX0FERF9LRVlfV0VQICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTgJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9GUk9NX0VSUk9SICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX0xJTktfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjFCCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9ORElTICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUMJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9DSEVDS19HUElPICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX0ZPUkNFX1dBS0VfVVAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjIyCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX0JXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjUJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyNgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSURfQ0lQSEVSICAgICAgICAgICAgICAweDBENzMwMjI3CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfUUtFUklPRElDX0VYRUNVVCAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyM0QJLyogY21kICovCisjZGVmaW5lIFJUX0NNRF9TRVRfS0VZX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyOAkvKiBjbWQgKi8KKyNkZWZpbmUgUlRfQ01EX1NFVF9SWF9XQ0lEX1RBQkxFICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI5CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlkgICAgICAgICAgICAgIDB4MEQ3MzAyM0UJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF9TRVRfR1JPVVBfS0VZCQkJCQkJMHgwRDczMDIzRgkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEX1NFVF9QQUlSV0lTRV9LRVkJCQkJCTB4MEQ3MzAyNDAJLyogY21kICovCisKKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9RVUVSWV9IQVJEV0FSRV9SRUdJU1RFUiAgICAweDBENzEwMTA1CS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9QSFlfTU9ERSAgICAgICAgICAgICAgIDB4MEQ3OTAxMEMJLyogY21kICovCisjZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1NUQV9DT05GSUcgICAgICAgICAgICAgMHgwRDc5MDExMQkvKiBjbWQgKi8KKyNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUFJFQU1CTEUgICAgICAgICAgICAgICAweDBENzkwMTAxCS8qIGNtZCAqLworI2RlZmluZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRQkJCTB4MEQ3OTAxMDIJLyogY21kICovCisvKiBhZGQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0ICovCisjZGVmaW5lIENNRFRIUkVBRF9VUERBVEVfUFJPVEVDVAkJCQkJMHgwRDc5MDEwMwkvKiBjbWQgKi8KKy8qIGVuZCBqb2hubGkgKi8KKworLypDTURUSFJFQURfTVVMVElfUkVBRF9NQUMgKi8KKy8qQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQyAqLworLypDTURUSFJFQURfVkVORE9SX0VFUFJPTV9SRUFEICovCisvKkNNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFICovCitzdHJ1Y3QgcnRfY21kaGFuZGxlcl90bHYgeworCXUxNiBPZmZzZXQ7CisJdTE2IExlbmd0aDsKKwl1OCBEYXRhRmlyc3Q7Cit9OworCitzdHJ1Y3QgcnRfY21kcWVsbXQ7CisKK3N0cnVjdCBydF9jbWRxZWxtdCB7CisJdTMyIGNvbW1hbmQ7CisJdm9pZCAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgYnVmZmVybGVuZ3RoOworCUJPT0xFQU4gQ21kRnJvbU5kaXM7CisJQk9PTEVBTiBTZXRPcGVyYXRpb247CisJc3RydWN0IHJ0X2NtZHFlbG10ICpuZXh0OworfTsKKworc3RydWN0IHJ0X2NtZHEgeworCXUzMiBzaXplOworCXN0cnVjdCBydF9jbWRxZWxtdCAqaGVhZDsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKnRhaWw7CisJdTMyIENtZFFTdGF0ZTsKK307CisKKyNkZWZpbmUgRW5xdWV1ZUNtZChjbWRxLCBjbWRxZWxtdCkJCVwKK3sJCQkJCQkJCQkJXAorCWlmIChjbWRxLT5zaXplID09IDApCQkJCVwKKwkJY21kcS0+aGVhZCA9IGNtZHFlbG10OwkJCVwKKwllbHNlCQkJCQkJCQlcCisJCWNtZHEtPnRhaWwtPm5leHQgPSBjbWRxZWxtdDsJXAorCWNtZHEtPnRhaWwgPSBjbWRxZWxtdDsJCQkJXAorCWNtZHFlbG10LT5uZXh0ID0gTlVMTDsJCQkJXAorCWNtZHEtPnNpemUrKzsJCQkJCQlcCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVVTQiBDbWQgdG8gQVNJQyBSZWxhdGVkIE1BQ1JPCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlc2V0IE1BQyBvZiBhIHN0YXRpb24gZW50cnkgdG8gMHhGRkZGRkZGRkZGRkYgKi8KKyNkZWZpbmUgUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgV2NpZCkJCQkJCVwKKwl7CXN0cnVjdCBydF9zZXRfYXNpY193Y2lkCVNldEFzaWNXY2lkOwkJCQkJCVwKKwkJU2V0QXNpY1djaWQuV0NJRCA9IFdjaWQ7CQkJCQkJCQlcCisJCVNldEFzaWNXY2lkLlNldFRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJXAorCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKKwkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwJXAorCQkJCSZTZXRBc2ljV2NpZCwgc2l6ZW9mKHN0cnVjdCBydF9zZXRfYXNpY193Y2lkKSk7CX0KKworLyogYWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlICovCisjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX0FERChwQWQsIHBFbnRyeSkJCQkJCQkJXAorCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1NFVF9DTElFTlRfTUFDX0VOVFJZLAlcCisJCQkJCQkJcEVudHJ5LCBzaXplb2Yoc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSkpOworCisvKiBhZGQgYnkgam9obmxpLCBmaXggImluX2ludGVycnVwdCIgZXJyb3Igd2hlbiBjYWxsICJNYWNUYWJsZURlbGV0ZUVudHJ5IiBpbiBSeCB0YXNrbGV0ICovCisvKiBTZXQgTUFDIHJlZ2lzdGVyIHZhbHVlIGFjY29yZGluZyBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBSVE1QX1VQREFURV9QUk9URUNUKHBBZCkJXAorCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1VQREFURV9QUk9URUNULCBOVUxMLCAwKTsKKy8qIGVuZCBqb2hubGkgKi8KKworLyogcmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDICovCisvKiB5ZXQgaW1wbGVtZW50ICovCisjZGVmaW5lIFJUTVBfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCc3NJZHgsIFdjaWQpCisKKy8qIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisjZGVmaW5lIFJUTVBfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgYXBpZHgsIEtleUlELCBwRW50cnkpCQkJCQkJXAorCXsJUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgcEVudHJ5LT5BaWQpOwkJCQkJCQkJXAorCQlpZiAocEVudHJ5LT5BaWQgPj0gMSkgewkJCQkJCQkJCQkJCQkJXAorCQkJc3RydWN0IHJ0X3NldF9hc2ljX3djaWRfYXR0cmkJU2V0QXNpY1djaWRBdHRyaTsJCQkJCQkJCVwKKwkJCVNldEFzaWNXY2lkQXR0cmkuV0NJRCA9IHBFbnRyeS0+QWlkOwkJCQkJCQkJCVwKKwkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgkJCQlcCisJCQkJKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpKQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGc7CVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCisJCQllbHNlIGlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCQkJCQlcCisJCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAorCQkJCVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGc7CVwKKwkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCisJCQllbHNlIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gMDsJCQkJCQkJCQkJXAorICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYWlkIGNpcGhlciA9ICVsZFxuIixTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikpOyAgICAgICBcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiwJCQlcCisJCQkJCQkJJlNldEFzaWNXY2lkQXR0cmksIHNpemVvZihzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZF9hdHRyaSkpOyB9IH0KKworLyogSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkgKi8KKyNkZWZpbmUgUlRNUF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKF9wQWQsIF9BaWQsIF9USUQpCQkJCQlcCisJCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCQlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfQWlkKTsJCQkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5TZXRUaWQgPSAoMHgxMDAwMDw8KF9USUQpKTsJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCkpOwlcCisJCX13aGlsZSgwKQorCisvKiBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5ICovCisjZGVmaW5lIFJUTVBfREVMX0JBX1NFU1NJT05fRlJPTV9BU0lDKF9wQWQsIF9XY2lkLCBfVElEKQkJCQlcCisJCWRvewkJCQkJCQkJCQkJCQkJCQlcCisJCQlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZAlTZXRBc2ljV2NpZDsJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuV0NJRCA9IChfV2NpZCk7CQkJCQkJCQkJXAorCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4ZmZmZmZmZmYpOwkJCQkJCQlcCisJCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAoMHgxMDAwMDw8KF9USUQpICk7CQkJCQlcCisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZCgoX3BBZCksIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lELCAmU2V0QXNpY1djaWQsIHNpemVvZihzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCkpOwlcCisJCX13aGlsZSgwKQorCisjZW5kaWYgLyogX19SVFVTQl9JT19IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW0uaAppbmRleCAwYTg3OGJhLi42NDhmZDYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zcGVjdHJ1bS5oCkBAIC0yMyw3ICsyMyw3IEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLworICovCiAKICNpZm5kZWYgX19TUEVDVFJVTV9IX18KICNkZWZpbmUgX19TUEVDVFJVTV9IX18KQEAgLTMxLDExMiArMzEsNyBAQAogI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgogI2luY2x1ZGUgInNwZWN0cnVtX2RlZi5oIgogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1RQQ19SRVBPUlRfSU5GTwotewotCVVJTlQ4IFR4UHdyOwotCVVJTlQ4IExpbmtNYXJnaW47Ci19IFRQQ19SRVBPUlRfSU5GTywgKlBUUENfUkVQT1JUX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hfU1dfQU5OX0lORk8KLXsKLQlVSU5UOCBDaFN3TW9kZTsKLQlVSU5UOCBDaGFubmVsOwotCVVJTlQ4IENoU3dDbnQ7Ci19IENIX1NXX0FOTl9JTkZPLCAqUENIX1NXX0FOTl9JTkZPOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVFfTU9ERQotewotCXN0cnVjdCBQQUNLRUQKLQl7Ci0JCVVJTlQ4IFJldjA6MTsKLQkJVUlOVDggRW5hYmxlOjE7Ci0JCVVJTlQ4IFJlcXVlc3Q6MTsKLQkJVUlOVDggUmVwb3J0OjE7Ci0JCVVJTlQ4IFJldjE6NDsKLQl9IGZpZWxkOwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfUkVRX01PREUsICpQTUVBU1VSRV9SRVFfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUQotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci19IE1FQVNVUkVfUkVRLCAqUE1FQVNVUkVfUkVROwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRX0lORk8KLXsKLQlVSU5UOCBUb2tlbjsKLQlNRUFTVVJFX1JFUV9NT0RFIFJlcU1vZGU7Ci0JVUlOVDggUmVxVHlwZTsKLQlNRUFTVVJFX1JFUSBNZWFzdXJlUmVxOwotfSBNRUFTVVJFX1JFUV9JTkZPLCAqUE1FQVNVUkVfUkVRX0lORk87Ci0KLXR5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAKLXsKLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBCU1M6MTsKLQkJVUlOVDggT2ZkbVByZWFtYmxlOjE7Ci0JCVVJTlQ4IFVuaWRlbnRpZmllZFNpZ25hbDoxOwotCQlVSU5UOCBSYWRhcjoxOwotCQlVSU5UOCBVbm1lYXN1cmU6MTsKLQkJVUlOVDggUmV2OjM7Ci0JfSBmaWVsZDsKLQlVSU5UOCB3b3JkOwotfSBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAsICpQTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQlNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAgTWFwOwotfSBNRUFTVVJFX0JBU0lDX1JFUE9SVCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX0NDQV9SRVBPUlQKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotCVVJTlQ4IENDQV9CdXN5X0ZyYWN0aW9uOwotfSBNRUFTVVJFX0NDQV9SRVBPUlQsICpQTUVBU1VSRV9DQ0FfUkVQT1JUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUlBJX1JFUE9SVAotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0JVUlOVDggUlBJX0RlbnNpdHlbOF07Ci19IE1FQVNVUkVfUlBJX1JFUE9SVCwgKlBNRUFTVVJFX1JQSV9SRVBPUlQ7Ci0KLXR5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9NT0RFCi17Ci0Jc3RydWN0IFBBQ0tFRAotCXsKLQkJVUlOVDggTGF0ZToxOwotCQlVSU5UOCBJbmNhcGFibGU6MTsKLQkJVUlOVDggUmVmdXNlZDoxOwotCQlVSU5UOCBSZXY6NTsKLQl9IGZpZWxkOwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfUkVQT1JUX01PREUsICpQTUVBU1VSRV9SRVBPUlRfTU9ERTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9JTkZPCi17Ci0JVUlOVDggVG9rZW47Ci0JTUVBU1VSRV9SRVBPUlRfTU9ERSBSZXBvcnRNb2RlOwotCVVJTlQ4IFJlcG9ydFR5cGU7Ci0JVUlOVDggT2N0ZWN0WzBdOwotfSBNRUFTVVJFX1JFUE9SVF9JTkZPLCAqUE1FQVNVUkVfUkVQT1JUX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUVVJRVRfSU5GTwotewotCVVJTlQ4IFF1aWV0Q250OwotCVVJTlQ4IFF1aWV0UGVyaW9kOwotCVVJTlQ4IFF1aWV0RHVyYXRpb247Ci0JVUlOVDggUXVpZXRPZmZzZXQ7Ci19IFFVSUVUX0lORk8sICpQUVVJRVRfSU5GTzsKK2NoYXIgUlRNUF9HZXRUeFB3cihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEhUVFJBTlNNSVRfU0VUVElORyBIVFR4TW9kZSk7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE1MCwxNCArNDUsMTYgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVxKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggTWVhc3VyZVRva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAotCUlOIFVJTlQ4IE1lYXN1cmVDaCwKLQlJTiBVSU5UMTYgTWVhc3VyZUR1cmF0aW9uKTsKK3ZvaWQgTWFrZU1lYXN1cmVtZW50UmVxRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCAqcE91dEJ1ZmZlciwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyAqcEZyYW1lTGVuLAorCQkJICAgICB1OCBUb3RhbExlbiwKKwkJCSAgICAgdTggQ2F0ZWdvcnksCisJCQkgICAgIHU4IEFjdGlvbiwKKwkJCSAgICAgdTggTWVhc3VyZVRva2VuLAorCQkJICAgICB1OCBNZWFzdXJlUmVxTW9kZSwKKwkJCSAgICAgdTggTWVhc3VyZVJlcVR5cGUsCisJCQkgICAgIHU4IE51bU9mUmVwZXRpdGlvbnMpOwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xNzEsMTUgKzY4LDEzIEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVNZWFzdXJlbWVudFJlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBSZXBvcnRJbmZvTGVuLAotCUlOIFBVSU5UOCBwUmVwb3J0SW5mbyk7Cit2b2lkIEVucXVldWVNZWFzdXJlbWVudFJlcChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB1OCAqcERBLAorCQkJICAgdTggRGlhbG9nVG9rZW4sCisJCQkgICB1OCBNZWFzdXJlVG9rZW4sCisJCQkgICB1OCBNZWFzdXJlUmVxTW9kZSwKKwkJCSAgIHU4IE1lYXN1cmVSZXFUeXBlLAorCQkJICAgdTggUmVwb3J0SW5mb0xlbiwgdTggKnBSZXBvcnRJbmZvKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTkzLDEwICs4OCw3IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVUUENSZXEoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVQ0hBUiBEaWFsb2dUb2tlbik7Cit2b2lkIEVucXVldWVUUENSZXEoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcERBLCB1OCBEaWFsb2dUb2tlbik7CiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIxMCwxMiArMTAyLDkgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pOwordm9pZCBFbnF1ZXVlVFBDUmVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgdTggKnBEQSwKKwkJICAgdTggRGlhbG9nVG9rZW4sIHU4IFR4UHdyLCB1OCBMaW5rTWFyZ2luKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjMxLDExICsxMjAsOCBAQAogCVJldHVybgk6IE5vbmUuCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBFbnF1ZXVlQ2hTd0FubigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IENoU3dNb2RlLAotCUlOIFVJTlQ4IE5ld0NoKTsKK3ZvaWQgRW5xdWV1ZUNoU3dBbm4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgdTggKnBEQSwgdTggQ2hTd01vZGUsIHU4IE5ld0NoKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjQ5LDkgKzEzNSw3IEBACiAJUmV0dXJuCTogTm9uZS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwordm9pZCBQZWVyU3BlY3RydW1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjYyLDMxICsxNDYsNDQgQEAKIAlSZXR1cm4JOiBOb25lLgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUlOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7CitpbnQgU2V0X01lYXN1cmVSZXFfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLUlOVCBTZXRfVHBjUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKK2ludCBTZXRfVHBjUmVxX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBjaGFyICphcmcpOwogCi1WT0lEIE1lYXN1cmVSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKK2ludCBTZXRfUHdyQ29uc3RyYWludChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIGNoYXIgKmFyZyk7CiAKLVZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBNZWFzdXJlUmVxVGFiSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFRwY1JlcVRhYkluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwordm9pZCBNZWFzdXJlUmVxVGFiRXhpdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpOwogCi1WT0lEIFRwY1JlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOworc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5ICpNZWFzdXJlUmVxTG9va1VwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggRGlhbG9nVG9rZW4pOwogCi1WT0lEIE5vdGlmeUNoU3dBbm5Ub1BlZXJBUHMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBSQSwKLQlJTiBQVUNIQVIgcFRBLAotCUlOIFVJTlQ4IENoU3dNb2RlLAotCUlOIFVJTlQ4IENoYW5uZWwpOwotI2VuZGlmIC8vIF9fU1BFQ1RSVU1fSF9fIC8vCitzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKk1lYXN1cmVSZXFJbnNlcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBEaWFsb2dUb2tlbik7CiAKK3ZvaWQgTWVhc3VyZVJlcURlbGV0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IERpYWxvZ1Rva2VuKTsKKwordm9pZCBJbnNlcnRDaGFubmVsUmVwSUUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTggKnBGcmFtZUJ1ZiwKKwkJCXVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJCWNoYXIgKnBDb3VudHJ5LCB1OCBSZWd1bGF0b3J5Q2xhc3MpOworCit2b2lkIEluc2VydFRwY1JlcG9ydElFKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4ICpwRnJhbWVCdWYsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpwRnJhbWVMZW4sCisJCSAgICAgICB1OCBUeFB3ciwgdTggTGlua01hcmdpbik7CisKK3ZvaWQgSW5zZXJ0RGlhbG9nVG9rZW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgICAgdTggKnBGcmFtZUJ1ZiwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwgdTggRGlhbG9nVG9rZW4pOworCit2b2lkIFRwY1JlcVRhYkluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKTsKKwordm9pZCBUcGNSZXFUYWJFeGl0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKK3ZvaWQgTm90aWZ5Q2hTd0FublRvUGVlckFQcyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBSQSwKKwkJCSAgICB1OCAqcFRBLCB1OCBDaFN3TW9kZSwgdTggQ2hhbm5lbCk7CisKK3ZvaWQgUmd1Q2xhc3NfQnVpbGRCY25DaExpc3Qoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICB1OCAqcEJ1ZiwgdW5zaWduZWQgbG9uZyAqcEJ1Zkxlbik7CisjZW5kaWYgLyogX19TUEVDVFJVTV9IX18gLy8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oCmluZGV4IDRjYTQ4MTcuLjhmZmNmYjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3NwZWN0cnVtX2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3BlY3RydW1fZGVmLmgKQEAgLTM5LDEzICszOSw2MiBAQAogI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KICNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCiAKLSNkZWZpbmUgTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCQkzCisjZGVmaW5lIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQkJMzIKICNkZWZpbmUgTUFYX0hBU0hfTUVBU1VSRV9SRVFfVEFCX1NJWkUJTUFYX01FQVNVUkVfUkVRX1RBQl9TSVpFCiAKLSNkZWZpbmUgTUFYX1RQQ19SRVFfVEFCX1NJWkUJCQkzCisjZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMzIKICNkZWZpbmUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRQkJTUFYX1RQQ19SRVFfVEFCX1NJWkUKIAotI2RlZmluZSBNSU5fUkNWX1BXUgkJCQkxMDAJCS8qIE5lZ2F0aXZlIHZhbHVlICgoZEJtKSAqLworI2RlZmluZSBNSU5fUkNWX1BXUgkJCQkxMDAJLyogTmVnYXRpdmUgdmFsdWUgKChkQm0pICovCisKKyNkZWZpbmUgVFBDX1JFUV9BR0VfT1VUCQkJNTAwCS8qIG1zICovCisjZGVmaW5lIE1RX1JFUV9BR0VfT1VUCQkJNTAwCS8qIG1zICovCisKKyNkZWZpbmUgVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoX0RpYWxvZ1Rva2VuKQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFKQorI2RlZmluZSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJCSgoX0RpYWxvZ1Rva2VuKSAlIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKKworc3RydWN0IHJ0X21lYXN1cmVfcmVxX2VudHJ5OworCitzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgeworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSAqcE5leHQ7CisJdW5zaWduZWQgbG9uZyBsYXN0VGltZTsKKwlCT09MRUFOIFZhbGlkOworCXU4IERpYWxvZ1Rva2VuOworCXU4IE1lYXN1cmVEaWFsb2dUb2tlblszXTsJLyogMDpiYXNpYyBtZWFzdXJlLCAxOiBDQ0EgbWVhc3VyZSwgMjogUlBJX0hpc3RvZ3JhbSBtZWFzdXJlLiAqLworfTsKKworc3RydWN0IHJ0X21lYXN1cmVfcmVxX3RhYiB7CisJdTggU2l6ZTsKKwlzdHJ1Y3QgcnRfbWVhc3VyZV9yZXFfZW50cnkgKkhhc2hbTUFYX0hBU0hfTUVBU1VSRV9SRVFfVEFCX1NJWkVdOworCXN0cnVjdCBydF9tZWFzdXJlX3JlcV9lbnRyeSBDb250ZW50W01BWF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Cit9OworCitzdHJ1Y3QgcnRfdHBjX3JlcV9lbnRyeTsKKworc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgeworCXN0cnVjdCBydF90cGNfcmVxX2VudHJ5ICpwTmV4dDsKKwl1bnNpZ25lZCBsb25nIGxhc3RUaW1lOworCUJPT0xFQU4gVmFsaWQ7CisJdTggRGlhbG9nVG9rZW47Cit9OworCitzdHJ1Y3QgcnRfdHBjX3JlcV90YWIgeworCXU4IFNpemU7CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgKkhhc2hbTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRV07CisJc3RydWN0IHJ0X3RwY19yZXFfZW50cnkgQ29udGVudFtNQVhfVFBDX1JFUV9UQUJfU0laRV07Cit9OworCisvKiBUaGUgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiAqLworc3RydWN0IHJ0X2RvdDExX2NoYW5uZWxfc2V0IHsKKwl1OCBOdW1iZXJPZkNoYW5uZWxzOworCXU4IE1heFR4UHdyOworCXU4IENoYW5uZWxMaXN0WzE2XTsKK307CisKK3N0cnVjdCBydF9kb3QxMV9yZWd1bGF0b3J5X2luZm9ybWF0aW9uIHsKKwl1OCBSZWd1bGF0b3J5Q2xhc3M7CisJc3RydWN0IHJ0X2RvdDExX2NoYW5uZWxfc2V0IENoYW5uZWxTZXQ7Cit9OwogCiAjZGVmaW5lIFJNX1RQQ19SRVEJCQkJMAogI2RlZmluZSBSTV9NRUFTVVJFX1JFUQkJCTEKQEAgLTUzLDQzICsxMDIsMTAxIEBACiAjZGVmaW5lIFJNX0JBU0lDCQkJCTAKICNkZWZpbmUgUk1fQ0NBCQkJCQkxCiAjZGVmaW5lIFJNX1JQSV9ISVNUT0dSQU0JCTIKKyNkZWZpbmUgUk1fQ0hfTE9BRAkJCQkzCisjZGVmaW5lIFJNX05PSVNFX0hJU1RPR1JBTQkJNAogCi0jZGVmaW5lIFRQQ19SRVFfQUdFX09VVAkJCTUwMAkJLyogbXMgKi8KLSNkZWZpbmUgTVFfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3RwY19yZXBvcnRfaW5mbyB7CisJdTggVHhQd3I7CisJdTggTGlua01hcmdpbjsKK307CiAKLSNkZWZpbmUgVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoX0RpYWxvZ1Rva2VuKQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFKQotI2RlZmluZSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJCSgoX0RpYWxvZ1Rva2VuKSAlIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKK3N0cnVjdCBQQUNLRUQgcnRfY2hfc3dfYW5uX2luZm8geworCXU4IENoU3dNb2RlOworCXU4IENoYW5uZWw7CisJdTggQ2hTd0NudDsKK307CiAKLXR5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWQotewotCXN0cnVjdCBfTUVBU1VSRV9SRVFfRU5UUlkgKnBOZXh0OwotCVVMT05HIGxhc3RUaW1lOwotCUJPT0xFQU4JVmFsaWQ7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JVUlOVDggTWVhc3VyZURpYWxvZ1Rva2VuWzNdOwkvLyAwOmJhc2ljIG1lYXN1cmUsIDE6IENDQSBtZWFzdXJlLCAyOiBSUElfSGlzdG9ncmFtIG1lYXN1cmUuCi19IE1FQVNVUkVfUkVRX0VOVFJZLCAqUE1FQVNVUkVfUkVRX0VOVFJZOwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVRX01PREUgeworCXN0cnVjdCBQQUNLRUQgeworCQl1OCBQYXJhbGxlbDoxOworCQl1OCBFbmFibGU6MTsKKwkJdTggUmVxdWVzdDoxOworCQl1OCBSZXBvcnQ6MTsKKwkJdTggRHVyYXRpb25NYW5kYXRvcnk6MTsKKwkJIHU4OjM7CisJfSBmaWVsZDsKKwl1OCB3b3JkOworfSBNRUFTVVJFX1JFUV9NT0RFLCAqUE1FQVNVUkVfUkVRX01PREU7CiAKLXR5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9UQUIKLXsKLQlVQ0hBUiBTaXplOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBIYXNoW01BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFXTsKLQlNRUFTVVJFX1JFUV9FTlRSWSBDb250ZW50W01BWF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Ci19IE1FQVNVUkVfUkVRX1RBQiwgKlBNRUFTVVJFX1JFUV9UQUI7CitzdHJ1Y3QgUEFDS0VEIHJ0X21lYXN1cmVfcmVxIHsKKwl1OCBDaE51bTsKKwl1NjQgTWVhc3VyZVN0YXJ0VGltZTsKKwl1MTYgTWVhc3VyZUR1cmF0aW9uOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1RQQ19SRVFfRU5UUlkKLXsKLQlzdHJ1Y3QgX1RQQ19SRVFfRU5UUlkgKnBOZXh0OwotCVVMT05HIGxhc3RUaW1lOwotCUJPT0xFQU4gVmFsaWQ7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci19IFRQQ19SRVFfRU5UUlksICpQVFBDX1JFUV9FTlRSWTsKK3N0cnVjdCBQQUNLRUQgcnRfbWVhc3VyZV9yZXFfaW5mbyB7CisJdTggVG9rZW47CisJTUVBU1VSRV9SRVFfTU9ERSBSZXFNb2RlOworCXU4IFJlcVR5cGU7CisJdTggT2N0WzBdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1RQQ19SRVFfVEFCCi17Ci0JVUNIQVIgU2l6ZTsKLQlQVFBDX1JFUV9FTlRSWSBIYXNoW01BWF9IQVNIX1RQQ19SRVFfVEFCX1NJWkVdOwotCVRQQ19SRVFfRU5UUlkgQ29udGVudFtNQVhfVFBDX1JFUV9UQUJfU0laRV07Ci19IFRQQ19SRVFfVEFCLCAqUFRQQ19SRVFfVEFCOwordHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IEJTUzoxOwogCi0jZW5kaWYgLy8gX19TUEVDVFJVTV9ERUZfSF9fIC8vCisJCXU4IE9mZG1QcmVhbWJsZToxOworCQl1OCBVbmlkZW50aWZpZWRTaWduYWw6MTsKKwkJdTggUmFkYXI6MTsKKwkJdTggVW5tZWFzdXJlOjE7CisJCXU4IFJldjozOworCX0gZmllbGQ7CisJdTggd29yZDsKK30gTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQLCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUDsKIAorc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX2Jhc2ljX3JlcG9ydCB7CisJdTggQ2hOdW07CisJdTY0IE1lYXN1cmVTdGFydFRpbWU7CisJdTE2IE1lYXN1cmVEdXJhdGlvbjsKKwlNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVAgTWFwOworfTsKKworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX2NjYV9yZXBvcnQgeworCXU4IENoTnVtOworCXU2NCBNZWFzdXJlU3RhcnRUaW1lOworCXUxNiBNZWFzdXJlRHVyYXRpb247CisJdTggQ0NBX0J1c3lfRnJhY3Rpb247Cit9OworCitzdHJ1Y3QgUEFDS0VEIHJ0X21lYXN1cmVfcnBpX3JlcG9ydCB7CisJdTggQ2hOdW07CisJdTY0IE1lYXN1cmVTdGFydFRpbWU7CisJdTE2IE1lYXN1cmVEdXJhdGlvbjsKKwl1OCBSUElfRGVuc2l0eVs4XTsKK307CisKK3R5cGVkZWYgdW5pb24gUEFDS0VEIF9NRUFTVVJFX1JFUE9SVF9NT0RFIHsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggTGF0ZToxOworCQl1OCBJbmNhcGFibGU6MTsKKwkJdTggUmVmdXNlZDoxOworCQl1OCBSZXY6NTsKKwl9IGZpZWxkOworCXU4IHdvcmQ7Cit9IE1FQVNVUkVfUkVQT1JUX01PREUsICpQTUVBU1VSRV9SRVBPUlRfTU9ERTsKKworc3RydWN0IFBBQ0tFRCBydF9tZWFzdXJlX3JlcG9ydF9pbmZvIHsKKwl1OCBUb2tlbjsKKwl1OCBSZXBvcnRNb2RlOworCXU4IFJlcG9ydFR5cGU7CisJdTggT2N0ZWN0WzBdOworfTsKKworc3RydWN0IFBBQ0tFRCBydF9xdWlldF9pbmZvIHsKKwl1OCBRdWlldENudDsKKwl1OCBRdWlldFBlcmlvZDsKKwl1MTYgUXVpZXREdXJhdGlvbjsKKwl1MTYgUXVpZXRPZmZzZXQ7Cit9OworCisjZW5kaWYgLyogX19TUEVDVFJVTV9ERUZfSF9fIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9haXJvbmV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZjRhMTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYWlyb25ldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxMiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWFpcm9uZXQuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCi0qLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCWFzc29jaWF0aW9uCXN0YXRlIG1hY2hpbmUgaW5pdCwJaW5jbHVkaW5nIHN0YXRlCXRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKLQlQYXJhbWV0ZXJzOgotCQlTIC0JcG9pbnRlcgl0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQJQWlyb25ldFN0YXRlTWFjaGluZUluaXQoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVNUQVRFX01BQ0hJTkUJCSpTLAotCU9VVAlTVEFURV9NQUNISU5FX0ZVTkMJVHJhbnNbXSkKLXsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsCVRyYW5zLCBNQVhfQUlST05FVF9TVEFURSwgTUFYX0FJUk9ORVRfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFJUk9ORVRfSURMRSwgQUlST05FVF9NQUNISU5FX0JBU0UpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBSVJPTkVUX0lETEUsIE1UMl9BSVJPTkVUX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0TXNnQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUlST05FVF9JRExFLCBNVDJfQUlST05FVF9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVxdWVzdEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFJUk9ORVRfU0NBTk5JTkcsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgKFNUQVRFX01BQ0hJTkVfRlVOQylBaXJvbmV0UmVwb3J0QWN0aW9uKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIGlzCXN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCi0JCVdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCi0JCVVzZQlib3RoIGluCVdQQSwgYW5kIFdQQVBTSwljYXNlLgotCQlJbiB0aGlzCWZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudAlmdW5jdGlvbnMgYWNjb3JkaW5nCXRvIHRoZSByZWNlaXZlZAlwYWNrZXQuCSAzIGNhdGVnb3JpZXMgYXJlIDoKLQkJICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKLQkJICAyLiAgTUlDIGVycm9yCShDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldAlmcm9tIFNUQS4KLQkJICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZQlmcm9tIFNUQQotCVJldHVybjoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQWlyb25ldE1zZ0FjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNTE1FX1FVRVVFX0VMRU0JKkVsZW0pCi17Ci0JVVNIT1JUCQkJCQkJCUxlbmd0aDsKLQlVQ0hBUgkJCQkJCQlJbmRleCwgaTsKLQlQVUNIQVIJCQkJCQkJcERhdGE7Ci0JUEFJUk9ORVRfUk1fUkVRVUVTVF9GUkFNRQkJcFJNUmVxOwotCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxRWxlbTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLS0tPiBBaXJvbmV0TXNnQWN0aW9uXG4iKSk7Ci0KLQkvLyAwLiBHZXQgQWlyb25ldCBJQVBQIGhlYWRlciBmaXJzdAotCXBSTVJlcSA9IChQQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTFdOwotCXBEYXRhICA9IChQVUNIQVIpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV07Ci0KLQkvLyAxLiBDaGFuZ2UgZW5kaWFuIGZvcm1hdCBmb3JtIG5ldHdvcmsgdG8gbGl0dGxlIGVuZGlhbgotCUxlbmd0aCA9IGJlMmNwdTE2KHBSTVJlcS0+SUFQUC5MZW5ndGgpOwotCi0JLy8gMi4wIFNhbml0eSBjaGVjaywgdGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBDQ1ggMi4wIHN1cHBvcnQgaXMgZW5hYmxlZAotCWlmIChwQWQtPlN0YUNmZy5DQ1hFbmFibGUgIT0gVFJVRSkKLQkJcmV0dXJuOwotCi0JLy8gMi4xIFJhZGlvIG1lYXN1cmVtZW50IG11c3QgYmUgb24KLQlpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5STUVuYWJsZSAhPSAxKQotCQlyZXR1cm47Ci0KLQkvLyAyLjIuIERlYnVnIHByaW50IGFsbCBiaXQgaW5mb3JtYXRpb24KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIElEICYgTGVuZ3RoICVkXG4iLCBMZW5ndGgpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIFR5cGUgJXhcbiIsIHBSTVJlcS0+SUFQUC5UeXBlKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUFQUCBTdWJUeXBlICV4XG4iLCBwUk1SZXEtPklBUFAuU3ViVHlwZSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklBUFAgRGlhbG9nIFRva2VuICV4XG4iLCBwUk1SZXEtPklBUFAuVG9rZW4pKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIEFjdGl2YXRpb24gRGVsYXkgJXhcbiIsIHBSTVJlcS0+RGVsYXkpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJQVBQIE1lYXN1cmVtZW50IE9mZnNldCAleFxuIiwgcFJNUmVxLT5PZmZzZXQpKTsKLQotCS8vIDMuIENoZWNrIElBUFAgZnJhbWUgdHlwZSwgaXQgbXVzdCBiZSAweDMyIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbgotCWlmIChwUk1SZXEtPklBUFAuVHlwZSAhPSBBSVJPTkVUX0lBUFBfVFlQRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgdHlwZSBmb3IgQ2lzY28gQWlyb25ldCBleHRlbnNpb25cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIDQuIENoZWNrIElBUFAgZnJhbWUgc3VidHlwZSwgaXQgbXVzdCBiZSAweDAxIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiByZXF1ZXN0LgotCS8vICAgIFNpbmNlIHdlIGFyZSBhY3RpbmcgYXMgY2xpZW50IG9ubHksIHdlIHdpbGwgZGlzcmVnYXJkcyByZXBseSBzdWJ0eXBlLgotCWlmIChwUk1SZXEtPklBUFAuU3ViVHlwZSAhPSBBSVJPTkVUX0lBUFBfU1VCVFlQRV9SRVFVRVNUKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgSUFQUCBzdWJ0eXBlIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvblxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gNS4gVmVyaWZ5IERlc3RpbmF0aW9uIE1BQyBhbmQgU291cmNlIE1BQywgYm90aCBzaG91bGQgYmUgYWxsIHplcm9zLgotCWlmICghIE1BQ19BRERSX0VRVUFMKHBSTVJlcS0+SUFQUC5EQSwgWkVST19NQUNfQUREUikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcm9uZyBJQVBQIERBIGZvciBDaXNjbyBBaXJvbmV0IGV4dGVuc2lvbiwgaXQncyBub3QgWmVyb1xuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEgTUFDX0FERFJfRVFVQUwocFJNUmVxLT5JQVBQLlNBLCBaRVJPX01BQ19BRERSKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIldyb25nIElBUFAgU0EgZm9yIENpc2NvIEFpcm9uZXQgZXh0ZW5zaW9uLCBpdCdzIG5vdCBaZXJvXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyA2LiBSZWluaXQgYWxsIHJlcG9ydCByZWxhdGVkIGZpZWxkcwotCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLCAyMDQ4KTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXQsIHNpemVvZihVU0hPUlQpICogTUFYX0xFTl9PRl9CU1NfVEFCTEUpOwotCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdCwgc2l6ZW9mKFJNX1JFUVVFU1RfQUNUSU9OKSAqIDQpOwotCi0JLy8gNy4gUG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGZpcnN0IGVsZW1lbnQgcmVwb3J0IGVsZW1lbnQKLQlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAgID0gTEVOR1RIXzgwMl8xMSArIHNpemVvZihBSVJPTkVUX0lBUFBfSEVBREVSKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGUiBsZW4gPSAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKLQlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggICAgID0gMHhmZjsKLQlwQWQtPlN0YUNmZy5STVJlcUNudCAgICAgICAgID0gMDsKLQlwQWQtPlN0YUNmZy5QYXJhbGxlbFJlcSAgICAgID0gRkFMU0U7Ci0JcEFkLT5TdGFDZmcuUGFyYWxsZWxEdXJhdGlvbiA9IDA7Ci0JcEFkLT5TdGFDZmcuUGFyYWxsZWxDaGFubmVsICA9IDA7Ci0JcEFkLT5TdGFDZmcuSUFQUFRva2VuICAgICAgICA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKLQlwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggID0gMDsKLQlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAgICAgID0gMDsKLQkvLyBSZXNldCB0aGUgc3RhdGlzdGljcwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOwotCi0JSW5kZXggPSAwOwotCi0JLy8gOC4gU2F2ZSBkaWFsb2cgdG9rZW4gZm9yIHJlcG9ydAotCXBBZC0+U3RhQ2ZnLklBUFBUb2tlbiA9IHBSTVJlcS0+SUFQUC5Ub2tlbjsKLQotCS8vIFNhdmUgQWN0aXZhdGlvbiBkZWxheSAmIG1lYXN1cmVtZW50IG9mZnNldCwgTm90IHJlYWxseSBuZWVkZWQKLQotCS8vIDkuIFBvaW50IHRvIHRoZSBmaXJzdCByZXF1ZXN0IGVsZW1lbnQKLQlwRGF0YSArPSBzaXplb2YoQUlST05FVF9STV9SRVFVRVNUX0ZSQU1FKTsKLQkvLyAgICBMZW5ndGggc2hvdWxkIGV4Y2x1ZGUgdGhlIENJU0NPIEFpcm9uZXQgU05BUCBoZWFkZXIKLQlMZW5ndGggLT0gKHNpemVvZihBSVJPTkVUX1JNX1JFUVVFU1RfRlJBTUUpIC0gTEVOR1RIXzgwMl8xX0gpOwotCi0JLy8gMTAuIFN0YXJ0IFBhcnNpbmcgdGhlIE1lYXN1cmVtZW50IGVsZW1lbnRzLgotCS8vICAgIEJlIGNhcmVmdWwgYWJvdXQgbXVsdGlwbGUgTVIgZWxlbWVudHMgd2l0aGluIG9uZSBmcmFtZXMuCi0Jd2hpbGUgKExlbmd0aCA+IDApCi0JewotCQlwUmVxRWxlbSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pIHBEYXRhOwotCQlzd2l0Y2ggKHBSZXFFbGVtLT5SZXFFbGVtLkVpZCkKLQkJewotCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVFVRVNUOgotCQkJCS8vIEZyb20gdGhlIGV4YW1wbGUsIGl0IHNlZW1zIHdlIG9ubHkgbmVlZCB0byBzdXBwb3J0IG9uZSByZXF1ZXN0IGluIG9uZSBmcmFtZQotCQkJCS8vIFRoZXJlIGlzIG5vIG11bHRpcGxlIHJlcXVlc3QgaW4gb25lIGZyYW1lLgotCQkJCS8vIEJlc2lkZXMsIGxvb2tzIGxpa2Ugd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhlIG1lYXN1cmVtZW50IHJlcXVlc3Qgb25seS4KLQkJCQkvLyBUaGUgbWVhc3VyZW1lbnQgcmVxdWVzdCBpcyBhbHdheXMgNCBieXRlcy4KLQotCQkJCS8vIFN0YXJ0IHBhcnNpbmcgdGhpcyB0eXBlIG9mIHJlcXVlc3QuCi0JCQkJLy8gMC4gRWlkIGlzIElFX01FQVNVUkVNRU5UX1JFUVVFU1QKLQkJCQkvLyAxLiBMZW5ndGggZGlkbid0IGluY2x1ZGUgRWlkIGFuZCBMZW5ndGggZmllbGQsIGl0IGFsd2F5cyBiZSA4LgotCQkJCS8vIDIuIE1lYXN1cmVtZW50IFRva2VuLCB3ZSBubmVkIHRvIHNhdmUgaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHJlcG9ydC4KLQkJCQkvLyAzLiBNZWFzdXJlbWVudCBNb2RlLCBBbHRob3VnaCB0aGVyZSBhcmUgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkaW4ndCBzZWUgdmFsdWUgb3RoZXIgdGhhbgotCQkJCS8vICAgIDAgZnJvbSB0ZXN0IHNwZWNzIGV4YW1wbGVzLgotCQkJCS8vIDQuIE1lYXN1cmVtZW50IFR5cGUsIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGRvLgotCQkJCXN3aXRjaCAocFJlcUVsZW0tPlJlcUVsZW0uVHlwZSkKLQkJCQl7Ci0JCQkJCWNhc2UgTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE6Ci0JCQkJCWNhc2UgTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVROgotCQkJCQljYXNlIE1TUk5fVFlQRV9CRUFDT05fUkVROgotCQkJCQkJLy8gQ2hlY2sgdGhlIEVuYWJsZSBub24tc2VydmluZyBjaGFubmVsIG1lYXN1cmVtZW50IGNvbnRyb2wKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkRDUk1FbmFibGUgPT0gMCkKLQkJCQkJCXsKLQkJCQkJCQkvLyBDaGVjayBjaGFubmVsIGJlZm9yZSBlbnF1ZXVlIHRoZSBhY3Rpb24KLQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkNoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJLy8gSWYgb2ZmIGNoYW5uZWwgbWVhc3VyZW1lbnQsIGNoZWNrIHRoZSBUVSBkdXJhdGlvbiBsaW1pdAotCQkJCQkJCWlmIChwUmVxRWxlbS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCQkJCQlpZiAocFJlcUVsZW0tPk1lYXN1cmVtZW50LkR1cmF0aW9uID4gcEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5UdUxpbWl0KQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIFNhdmUgcmVxdWVzdHMgYW5kIGV4ZWN1dGUgYWN0aW9ucyBsYXRlcgotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0sIHBSZXFFbGVtLCBzaXplb2YoUk1fUkVRVUVTVF9BQ1RJT04pKTsKLQkJCQkJCUluZGV4ICs9IDE7Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIE1TUk5fVFlQRV9GUkFNRV9SRVE6Ci0JCQkJCQkvLyBTaW5jZSBpdCdzIG9wdGlvbiwgd2Ugd2lsbCBzdXBwb3J0IGxhdGVyCi0JCQkJCQkvLyBGcmFtZVJlcXVlc3RBY3Rpb24ocEFkLCBwRGF0YSk7Ci0JCQkJCQlicmVhazsKLQotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLy8gUG9pbnQgdG8gbmV4dCBNZWFzdXJlbWVudCByZXF1ZXN0Ci0JCQkJcERhdGEgICs9IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7Ci0JCQkJTGVuZ3RoIC09IHNpemVvZihSTV9SRVFVRVNUX0FDVElPTik7Ci0JCQkJYnJlYWs7Ci0KLQkJCS8vIFdlIGFjY2VwdCByZXF1ZXN0IG9ubHksIGFsbCBvdGhlcnMgYXJlIGRyb3BwZWQKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVQT1JUOgotCQkJY2FzZSBJRV9BUF9UWF9QT1dFUjoKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWToKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLy8gMTEuIFVwZGF0ZSBzb21lIGZsYWdzIGFuZCBpbmRleAotCXBBZC0+U3RhQ2ZnLlJNUmVxQ250ID0gSW5kZXg7Ci0KLQlpZiAoSW5kZXgpCi0JewotCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9SRVEsIDAsIE5VTEwpOwotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLS0tIEFpcm9uZXRNc2dBY3Rpb25cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFpcm9uZXRSZXF1ZXN0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLXsKLQlQUk1fUkVRVUVTVF9BQ1RJT04JcFJlcTsKLQotCS8vIDEuIFBvaW50IHRvIG5leHQgcmVxdWVzdCBlbGVtZW50Ci0JcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4XTsKLQotCS8vIDIuIFBhcnNlIG1lYXN1cmVtZW50IHR5cGUgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb25zCi0JaWYgKHBSZXEtPlJlcUVsZW0uVHlwZSA9PSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUSkKLQkJLy8gQ2hhbm5lbCBMb2FkIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQotCQkvLyBOb2lzZSBIaXN0b2dyYW0gbWVhc3VyZW1lbnQgcmVxdWVzdAotCQlOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCi0JCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCUJlYWNvblJlcXVlc3RBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCWVsc2UKLQkJLy8gVW5rbm93bi4gRG8gbm90aGluZyBhbmQgcmV0dXJuLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJcmV0dXJuOwotCi0JLy8gMy4gUGVlayBpbnRvIHRoZSBuZXh0IHJlcXVlc3QsIGlmIGl0J3MgcGFyYWxsZWwsIHdlIHdpbGwgdXBkYXRlIHRoZSBzY2FuIHRpbWUgdG8gdGhlIGxhcmdlc3Qgb25lCi0JaWYgKChwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHggKyAxKSA8IHBBZC0+U3RhQ2ZnLlJNUmVxQ250KQotCXsKLQkJcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4ICsgMV07Ci0JCS8vIENoZWNrIGZvciBwYXJhbGxlbCBiaXQKLQkJaWYgKChwUmVxLT5SZXFFbGVtLk1vZGUgJiAweDAxKSAmJiAocFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCA9PSBwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCkpCi0JCXsKLQkJCS8vIFVwZGF0ZSBwYXJhbGxlbCBtb2RlIHJlcXVlc3QgaW5mb3JtYXRpb24KLQkJCXBBZC0+U3RhQ2ZnLlBhcmFsbGVsUmVxID0gVFJVRTsKLQkJCXBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lID0gKChwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiA+IHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSA/Ci0JCQkocFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24pIDogKHBBZC0+U3RhQ2ZnLkNDWFNjYW5UaW1lKSk7Ci0JCX0KLQl9Ci0KLQkvLyA0LiBDYWxsIFJUMjhYWF9NTE1FX0hBTkRMRVIgdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdCBtbG1lIGNvbW1hbmRzLCBTY2FuIHJlcXVlc3QgaXMgdGhlIG9ubHkgb25lIHVzZWQKLQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBjaGFubmVsIGxvYWQgcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAotCQl0byBzdXBwb3J0Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJSW5kZXgpCi17Ci0JUFJNX1JFUVVFU1RfQUNUSU9OCQkJCXBSZXE7Ci0JTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOwotCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKLQlORElTX1NUQVRVUwkJCQkJCU5TdGF0dXM7Ci0JUFVDSEFSCQkJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBIRUFERVJfODAyXzExCQkJCQlwTnVsbEZyYW1lOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JcFJlcSA9IChQUk1fUkVRVUVTVF9BQ1RJT04pICZwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdOwotCU5kaXNaZXJvTWVtb3J5KFplcm9Tc2lkLCAzMik7Ci0KLQkvLyBQcmVwYXJlIGZvciBzcGVjaWFsIHNjYW4gcmVxdWVzdAotCS8vIFRoZSBzY2FuIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IHdpdGggb3VyIEFjdGl2ZSwgUGFzc2l2ZSBzY2FuIGRlZmluaXRpb24uCi0JLy8gRm9yIENDWDIsIEFjdGl2ZSBtZWFucyBzZW5kIG91dCBwcm9iZSByZXF1ZXN0IHdpdGggYnJvYWRjYXN0IEJTU0lELgotCS8vIFBhc3NpdmUgbWVhbnMgbm8gcHJvYmUgcmVxdWVzdCBzZW50LCBvbmx5IGxpc3RlbiB0byB0aGUgYmVhY29ucy4KLQkvLyBUaGUgY2hhbm5lbCBzY2FubmVkIGlzIGZpeGVkIGFzIHNwZWNpZmllZCwgbm8gbmVlZCB0byBzY2FuIGFsbCBjaGFubmVscy4KLQkvLyBUaGUgc2NhbiB3YWl0IHRpbWUgaXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvby4KLQkvLyBQYXNzaXZlIHNjYW4gTW9kZQotCi0JLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKLQlpZiAoKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSAmJiAoSW5kZXggPT0gMCkpCi0JCXJldHVybjsKLQotCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKLQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgWmVyb1NzaWQsIDAsIEJTU19BTlksIFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKTsKLQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0KLQkvLyBSZXNldCBzb21lIGludGVybmFsIGNvbnRyb2wgZmxhZ3MgdG8gbWFrZSBzdXJlIHRoaXMgc2NhbiB3b3Jrcy4KLQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7Ci0JcEFkLT5TdGFDZmcuU2NhbkNudCAgICAgICAgPSAwOwotCXBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsID0gcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbDsKLQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHVyYXRpb24gJWQsIENoYW5uZWwgJWQhXG4iLCBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbiwgcFJlcS0+TWVhc3VyZW1lbnQuQ2hhbm5lbCkpOwotCi0JLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCi0JaWYgKHBBZC0+U3RhQ2ZnLkNDWFNjYW5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JewotCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXJldHVybjsKLQotCQlwTnVsbEZyYW1lID0gKFBIRUFERVJfODAyXzExKSBwT3V0QnVmZmVyOzsKLQkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7Ci0JCXBOdWxsRnJhbWUtPkZDLlR5cGUgCT0gQlRZUEVfREFUQTsKLQkJcE51bGxGcmFtZS0+RkMuUHdyTWdtdAk9IFBXUl9TQVZFOwotCi0JCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOwotCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCX0KLQotCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgICAgID0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVE7Ci0JcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgICAgPSAwOwotCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgMHgxMDEwKTsKLQotCS8vIFNldCBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZwotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UKTsKLQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ2hhbm5lbExvYWRSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBub2lzZSBoaXN0b2dyYW0gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAotCQl0byBzdXBwb3J0Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJTm9pc2VIaXN0UmVxdWVzdEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KQotewotCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOwotCU1MTUVfU0NBTl9SRVFfU1RSVUNUCQkJU2NhblJlcTsKLQlVQ0hBUgkJCQkJCQlaZXJvU3NpZFszMl0sIGk7Ci0JTkRJU19TVEFUVVMJCQkJCQlOU3RhdHVzOwotCVBVQ0hBUgkJCQkJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlQSEVBREVSXzgwMl8xMQkJCQkJcE51bGxGcmFtZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07Ci0JTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKLQotCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0Ci0JLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KLQkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCi0JLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgotCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgotCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgotCS8vIFBhc3NpdmUgc2NhbiBNb2RlCi0KLQkvLyBDb250cm9sIHN0YXRlIG1hY2hpbmUgaXMgbm90IGlkbGUsIHJlamVjdCB0aGUgcmVxdWVzdAotCWlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpICYmIChJbmRleCA9PSAwKSkKLQkJcmV0dXJuOwotCi0JLy8gRmlsbCBvdXQgc3R1ZmYgZm9yIHNjYW4gcmVxdWVzdAotCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19OT0lTRSk7Ci0JTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCi0JLy8gUmVzZXQgc29tZSBpbnRlcm5hbCBjb250cm9sIGZsYWdzIHRvIG1ha2Ugc3VyZSB0aGlzIHNjYW4gd29ya3MuCi0JQnNzVGFibGVJbml0KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIpOwotCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKLQlwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCA9IHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWw7Ci0JcEFkLT5TdGFDZmcuQ0NYU2NhblRpbWUgICAgPSBwUmVxLT5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkR1cmF0aW9uICVkLCBDaGFubmVsICVkIVxuIiwgcFJlcS0+TWVhc3VyZW1lbnQuRHVyYXRpb24sIHBSZXEtPk1lYXN1cmVtZW50LkNoYW5uZWwpKTsKLQotCS8vIElmIGl0J3Mgbm9uIHNlcnZpbmcgY2hhbm5lbCBzY2FuLCBzZW5kIG91dCBhIG51bGwgZnJhbWUgd2l0aCBQU00gYml0IG9uLgotCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCXsKLQkJLy8gVXNlIE1MTUUgZW5xdWV1ZSBtZXRob2QKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmIChOU3RhdHVzCSE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQlyZXR1cm47Ci0KLQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJLy8gTWFrZSB0aGUgcG93ZXIgc2F2ZSBOdWxsIGZyYW1lIHdpdGggUFNNIGJpdCBvbgotCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcE51bGxGcmFtZSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7Ci0JCXBOdWxsRnJhbWUtPkZDLlR5cGUgIAk9IEJUWVBFX0RBVEE7Ci0JCXBOdWxsRnJhbWUtPkZDLlB3ck1nbXQJPSBQV1JfU0FWRTsKLQotCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQl9Ci0KLQkvLyBSZXNldCB0aGUgc3RhdGlzdGljcwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gPSAwOwotCi0JLy8gRW5hYmxlIFJ4IHdpdGggcHJvbWlzY3VvdXMgcmVjZXB0aW9uCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCAweDEwMTApOwotCi0JLy8gU2V0IGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOwotCi0JcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfU0NBTk5JTkc7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb2lzZUhpc3RSZXF1ZXN0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBCZWFjb24gcmVwb3J0IGFjdGlvbiwgc3BlY2lhbCBzY2FuIG9wZXJhdGlvbiBhZGRlZAotCQl0byBzdXBwb3J0Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCXBEYXRhCQlTdGFydCBmcm9tIGVsZW1lbnQgSUQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQmVhY29uUmVxdWVzdEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KQotewotCVBSTV9SRVFVRVNUX0FDVElPTgkJCQlwUmVxOwotCU5ESVNfU1RBVFVTCQkJCQkJTlN0YXR1czsKLQlQVUNIQVIJCQkJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUEhFQURFUl84MDJfMTEJCQkJCXBOdWxsRnJhbWU7Ci0JTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOwotCVVDSEFSCQkJCQkJCVplcm9Tc2lkWzMyXTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcXVlc3RBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF07Ci0JTmRpc1plcm9NZW1vcnkoWmVyb1NzaWQsIDMyKTsKLQotCS8vIFByZXBhcmUgZm9yIHNwZWNpYWwgc2NhbiByZXF1ZXN0Ci0JLy8gVGhlIHNjYW4gZGVmaW5pdGlvbiBpcyBkaWZmZXJlbnQgd2l0aCBvdXIgQWN0aXZlLCBQYXNzaXZlIHNjYW4gZGVmaW5pdGlvbi4KLQkvLyBGb3IgQ0NYMiwgQWN0aXZlIG1lYW5zIHNlbmQgb3V0IHByb2JlIHJlcXVlc3Qgd2l0aCBicm9hZGNhc3QgQlNTSUQuCi0JLy8gUGFzc2l2ZSBtZWFucyBubyBwcm9iZSByZXF1ZXN0IHNlbnQsIG9ubHkgbGlzdGVuIHRvIHRoZSBiZWFjb25zLgotCS8vIFRoZSBjaGFubmVsIHNjYW5uZWQgaXMgZml4ZWQgYXMgc3BlY2lmaWVkLCBubyBuZWVkIHRvIHNjYW4gYWxsIGNoYW5uZWxzLgotCS8vIFRoZSBzY2FuIHdhaXQgdGltZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdG9vLgotCWlmIChwUmVxLT5NZWFzdXJlbWVudC5TY2FuTW9kZSA9PSBNU1JOX1NDQU5fTU9ERV9QQVNTSVZFKQotCXsKLQkJLy8gUGFzc2l2ZSBzY2FuIE1vZGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGFzc2l2ZSBTY2FuIE1vZGUhXG4iKSk7Ci0KLQkJLy8gQ29udHJvbCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBpZGxlLCByZWplY3QgdGhlIHJlcXVlc3QKLQkJaWYgKChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgJiYgKEluZGV4ID09IDApKQotCQkJcmV0dXJuOwotCi0JCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKLQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOX0NJU0NPX1BBU1NJVkUpOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCi0JCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgotCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7Ci0JCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKLQkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOwotCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOwotCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7Ci0KLQkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCi0JCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQl7Ci0JCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXJldHVybjsKLQotCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KLQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7Ci0JCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7Ci0JCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOwotCi0JCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCX0KLQotCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKLQl9Ci0JZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQUNUSVZFKQotCXsKLQkJLy8gQWN0aXZlIHNjYW4gTW9kZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY3RpdmUgU2NhbiBNb2RlIVxuIikpOwotCi0JCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBpcyBub3QgaWRsZSwgcmVqZWN0IHRoZSByZXF1ZXN0Ci0JCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLQkJCXJldHVybjsKLQotCQkvLyBGaWxsIG91dCBzdHVmZiBmb3Igc2NhbiByZXF1ZXN0Ci0JCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBaZXJvU3NpZCwgMCwgQlNTX0FOWSwgU0NBTl9DSVNDT19BQ1RJVkUpOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCi0JCS8vIFJlc2V0IHNvbWUgaW50ZXJuYWwgY29udHJvbCBmbGFncyB0byBtYWtlIHN1cmUgdGhpcyBzY2FuIHdvcmtzLgotCQlCc3NUYWJsZUluaXQoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYik7Ci0JCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgICAgICAgID0gMDsKLQkJcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwgPSBwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsOwotCQlwQWQtPlN0YUNmZy5DQ1hTY2FuVGltZSAgICA9IHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uOwotCQlwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICAgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEdXJhdGlvbiAlZCFcbiIsIHBSZXEtPk1lYXN1cmVtZW50LkR1cmF0aW9uKSk7Ci0KLQkJLy8gSWYgaXQncyBub24gc2VydmluZyBjaGFubmVsIHNjYW4sIHNlbmQgb3V0IGEgbnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24uCi0JCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQl7Ci0JCQkvLyBVc2UgTUxNRSBlbnF1ZXVlIG1ldGhvZAotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXJldHVybjsKLQotCQkJcE51bGxGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJCS8vIE1ha2UgdGhlIHBvd2VyIHNhdmUgTnVsbCBmcmFtZSB3aXRoIFBTTSBiaXQgb24KLQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCBwTnVsbEZyYW1lLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCXBOdWxsRnJhbWUtPkR1cmF0aW9uIAk9IDA7Ci0JCQlwTnVsbEZyYW1lLT5GQy5UeXBlICAgICA9IEJUWVBFX0RBVEE7Ci0JCQlwTnVsbEZyYW1lLT5GQy5Qd3JNZ210ICA9IFBXUl9TQVZFOwotCi0JCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKLQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCX0KLQotCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9TQ0FOTklORzsKLQl9Ci0JZWxzZSBpZiAocFJlcS0+TWVhc3VyZW1lbnQuU2Nhbk1vZGUgPT0gTVNSTl9TQ0FOX01PREVfQkVBQ09OX1RBQkxFKQotCXsKLQkJLy8gQmVhY29uIHJlcG9ydCBNb2RlLCByZXBvcnQgYWxsIHRoZSBBUFMgaW4gY3VycmVudCBic3MgdGFibGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uIFJlcG9ydCBNb2RlIVxuIikpOwotCi0JCS8vIENvcHkgY3VycmVudCBCU1MgdGFibGUgdG8gQ0NYIHRhYmxlLCB3ZSBjYW4gb21pdCB0aGlzIHN0ZXAgbGF0ZXIgb24uCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIsICZwQWQtPlNjYW5UYWIsIHNpemVvZihCU1NfVEFCTEUpKTsKLQotCQkvLyBDcmVhdGUgYmVhY29uIHJlcG9ydCBmcm9tIEJzcyB0YWJsZQotCQlBaXJvbmV0Q3JlYXRlQmVhY29uUmVwb3J0RnJvbUJzc1RhYmxlKHBBZCk7Ci0KLQkJLy8gU2V0IHN0YXRlIHRvIHNjYW5uaW5nCi0JCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX1NDQU5OSU5HOwotCi0JCS8vIEVucXVldWUgcmVwb3J0IHJlcXVlc3QKLQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKLQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIFdyb25nIHNjYW4gTW9kZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcm9uZyBTY2FuIE1vZGUhXG4iKSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmVhY29uUmVxdWVzdEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFpcm9uZXRSZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQotewotCVBSTV9SRVFVRVNUX0FDVElPTglwUmVxOwotCVVMT05HCQkJCU5vdzMyOwotCi0gICAgTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOwotCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3czMjsKLQotCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gMS4gUGFyc2UgbWVhc3VyZW1lbnQgdHlwZSBhbmQgY2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbnMKLQlpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9DSEFOTkVMX0xPQURfUkVRKQotCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAotCQlDaGFubmVsTG9hZFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZSBpZiAocFJlcS0+UmVxRWxlbS5UeXBlID09IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUSkKLQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJTm9pc2VIaXN0UmVwb3J0QWN0aW9uKHBBZCwgcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4KTsKLQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0JFQUNPTl9SRVEpCi0JCS8vIEJlYWNvbiBtZWFzdXJlbWVudCByZXF1ZXN0Ci0JCUJlYWNvblJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0JZWxzZQotCQkvLyBVbmtub3duLiBEbyBub3RoaW5nIGFuZCByZXR1cm4KLQkJOwotCi0JLy8gMi4gUG9pbnQgdG8gdGhlIGNvcnJlY3QgaW5kZXggb2YgYWN0aW9uIGVsZW1lbnQsIHN0YXJ0IGZyb20gMAotCXBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCsrOwotCi0JLy8gMy4gQ2hlY2sgZm9yIHBhcmFsbGVsIGFjdGlvbnMKLQlpZiAocEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPT0gVFJVRSkKLQl7Ci0JCXBSZXEgPSAoUFJNX1JFUVVFU1RfQUNUSU9OKSAmcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W3BBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeF07Ci0KLQkJLy8gUHJvY2VzcyBuZXh0IGFjdGlvbiByaWdodCBhd2F5Ci0JCWlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX0NIQU5ORUxfTE9BRF9SRVEpCi0JCQkvLyBDaGFubmVsIExvYWQgbWVhc3VyZW1lbnQgcmVxdWVzdAotCQkJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24ocEFkLCBwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHgpOwotCQllbHNlIGlmIChwUmVxLT5SZXFFbGVtLlR5cGUgPT0gTVNSTl9UWVBFX05PSVNFX0hJU1RfUkVRKQotCQkJLy8gTm9pc2UgSGlzdG9ncmFtIG1lYXN1cmVtZW50IHJlcXVlc3QKLQkJCU5vaXNlSGlzdFJlcG9ydEFjdGlvbihwQWQsIHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCk7Ci0KLQkJcEFkLT5TdGFDZmcuUGFyYWxsZWxSZXEgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4Kys7Ci0JfQotCi0JaWYgKHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeCA+PSBwQWQtPlN0YUNmZy5STVJlcUNudCkKLQl7Ci0JCS8vIDQuIFRoZXJlIGlzIG5vIG1vcmUgdW5wcm9jZXNzZWQgbWVhc3VyZW1lbnQgcmVxdWVzdCwgZ28gZm9yIHRyYW5zbWl0IHRoaXMgcmVwb3J0Ci0JCUFpcm9uZXRGaW5hbFJlcG9ydEFjdGlvbihwQWQpOwotCQlwQWQtPk1sbWUuQWlyb25ldE1hY2hpbmUuQ3VyclN0YXRlID0gQUlST05FVF9JRExFOwotCX0KLQllbHNlCi0JewotCQlwUmVxID0gKFBSTV9SRVFVRVNUX0FDVElPTikgJnBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtwQWQtPlN0YUNmZy5DdXJyZW50Uk1SZXFJZHhdOwotCi0JCWlmIChwUmVxLT5NZWFzdXJlbWVudC5DaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCXsKLQkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKLQkJfQotCi0JCS8vIDUuIFRoZXJlIGFyZSBtb3JlIHJlcXVlc3RzIHRvIGJlIG1lYXN1cmUKLQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fUkVRLCAwLCBOVUxMKTsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFpcm9uZXRSZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JUFVDSEFSCQkJCQlwRGVzdDsKLQlQQUlST05FVF9JQVBQX0hFQURFUglwSUFQUDsKLQlQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXI7Ci0JVUNIQVIJCQkJCUFja1JhdGUgPSBSQVRFXzI7Ci0JVVNIT1JUCQkJCQlBY2tEdXJhdGlvbiA9IDA7Ci0JTkRJU19TVEFUVVMJCQkJTlN0YXR1czsKLQlQVUNIQVIJCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVVMT05HCQkJCQlGcmFtZUxlbiA9IDA7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBaXJvbmV0RmluYWxSZXBvcnRBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyAwLiBTZXQgdXAgdGhlIGZyYW1lIHBvaW50ZXIsIEZyYW1lIHdhcyBpbml0ZWQgYXQgdGhlIGVuZCBvZiBtZXNzYWdlIGFjdGlvbgotCXBEZXN0ID0gJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW0xFTkdUSF84MDJfMTFdOwotCi0JLy8gMS4gVXBkYXRlIHJlcG9ydCBJQVBQIGZpZWxkcwotCXBJQVBQID0gKFBBSVJPTkVUX0lBUFBfSEVBREVSKSBwRGVzdDsKLQotCS8vIDIuIENvcHkgQ2lzY28gU05BUCBoZWFkZXIKLQlOZGlzTW92ZU1lbW9yeShwSUFQUC0+Q2lzY29TbmFwSGVhZGVyLCBTTkFQX0FJUk9ORVQsIExFTkdUSF84MDJfMV9IKTsKLQotCS8vIDMuIG5ldHdvcmsgb3JkZXIgZm9yIHRoaXMgMTZiaXQgbGVuZ3RoCi0JcElBUFAtPkxlbmd0aCAgPSBjcHUyYmUxNihwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCk7Ci0KLQkvLyAzLjEgc2FuaXR5IGNoZWNrIHRoZSByZXBvcnQgbGVuZ3RoLCBpZ25vcmUgaXQgaWYgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQKLQlpZiAoYmUyY3B1MTYocElBUFAtPkxlbmd0aCkgPD0gMTgpCi0JCXJldHVybjsKLQotCS8vIDQuIFR5cGUgbXVzdCBiZSAweDMyCi0JcElBUFAtPlR5cGUgICAgPSBBSVJPTkVUX0lBUFBfVFlQRTsKLQotCS8vIDUuIFN1YlR5cGUgZm9yIHJlcG9ydCBtdXN0IGJlIDB4ODEKLQlwSUFQUC0+U3ViVHlwZSA9IEFJUk9ORVRfSUFQUF9TVUJUWVBFX1JFUE9SVDsKLQotCS8vIDYuIERBIGlzIG5vdCB1c2VkIGFuZCBtdXN0IGJlIHplcm8sIGFsdGhvdWdoIHRoZSB3aG9sZSBmcmFtZSB3YXMgY2xlYXJlZCBhdCB0aGUgc3RhcnQgb2YgZnVuY3Rpb24KLQkvLyAgICBXZSB3aWxsIGRvIGl0IGFnYWluIGhlcmUuIFdlIGNhbiB1c2UgQlNTSUQgaW5zdGVhZAotCUNPUFlfTUFDX0FERFIocElBUFAtPkRBLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQkvLyA3LiBTQSBpcyB0aGUgY2xpZW50IHJlcG9ydGluZyB3aGljaCBtdXN0IGJlIG91ciBNQUMKLQlDT1BZX01BQ19BRERSKHBJQVBQLT5TQSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQkvLyA4LiBDb3B5IHRoZSBzYXZlZCBkaWFsb2cgdG9rZW4KLQlwSUFQUC0+VG9rZW4gPSBwQWQtPlN0YUNmZy5JQVBQVG9rZW47Ci0KLQkvLyA5LiBNYWtlIHRoZSBSZXBvcnQgZnJhbWUgODAyLjExIGhlYWRlcgotCS8vICAgIFJldXNlIGZ1bmN0aW9uIGluIHdwYS5jCi0JcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWY7Ci0JcEFkLT5TZXF1ZW5jZSArKzsKLQlXcGFNYWNIZWFkZXJJbml0KHBBZCwgcEhlYWRlciwgMCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JLy8gQUNLIHNpemUJaXMgMTQgaW5jbHVkZSBDUkMsIGFuZCBpdHMgcmF0ZQlpcyBiYXNlZCBvbiByZWFsIHRpbWUgaW5mb3JtYXRpb24KLQlBY2tSYXRlICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgQWNrUmF0ZSwgMTQpOwotCXBIZWFkZXItPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKLQotCS8vIFVzZSBNTE1FIGVucXVldWUgbWV0aG9kCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cwkhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm47Ci0KLQkvLyAxMC4gUHJlcGFyZSByZXBvcnQgZnJhbWUgd2l0aCBkeW5hbWljIG91dGJ1ZmZlci4gSnVzdCBzaW1wbHkgY29weSBldmVyeXRoaW5nLgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4sIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmLAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCS8vIDExLiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCXBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgPSBNU1JOX1RZUEVfVU5VU0VEOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWlyb25ldEZpbmFsUmVwb3J0QWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQ2hhbm5lbExvYWRSZXBvcnRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKLXsKLQlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKLQlQQ0hBTk5FTF9MT0FEX1JFUE9SVAkJcExvYWQ7Ci0JUFVDSEFSCQkJCQkJcERlc3Q7Ci0JVUNIQVIJCQkJCQlDQ0FCdXN5RnJhY3Rpb247Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIERpc2FibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24sIG1ha2UgaXQgYmFjayB0byBub3JtYWwKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7IC8vIFN0YWlvbiBub3QgZHJvcCBjb250cm9sIGZyYW1lIHdpbGwgZmFpbCBXaUZpIENlcnRpZmljYXRpb24uCi0KLQkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCi0JcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOwotCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKLQotCS8vIDEuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCi0JcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOwotCS8vIEZpeGVkIExlbmd0aCBhdCA5LCBub3QgaW5jbHVkZSBFaWQgYW5kIGxlbmd0aCBmaWVsZHMKLQlwUmVwb3J0LT5MZW5ndGggPSA5OwotCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Ub2tlbjsKLQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLlJlcUVsZW0uTW9kZTsKLQlwUmVwb3J0LT5UeXBlICAgPSBNU1JOX1RZUEVfQ0hBTk5FTF9MT0FEX1JFUTsKLQotCS8vIDIuIEZpbGwgY2hhbm5lbCByZXBvcnQgbWVhc3VyZW1lbnQgZGF0YQotCXBEZXN0ICs9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0JcExvYWQgID0gKFBDSEFOTkVMX0xPQURfUkVQT1JUKSBwRGVzdDsKLQlwTG9hZC0+Q2hhbm5lbCAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkNoYW5uZWw7Ci0JcExvYWQtPlNwYXJlICAgID0gMDsKLQlwTG9hZC0+RHVyYXRpb24gPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbSW5kZXhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOwotCi0JLy8gMy4gQ2FsY3VsYXRlIHRoZSBDQ0EgQnVzeSBGcmFjdGlvbgotCS8vICAgIChCeXRlcyArIEFDSyBzaXplKSAqIDggLyBUeCBzcGVlZCAqIDI1NSAvIDEwMDAgLyBtZWFzdXJlbWVudCBkdXJhdGlvbiwgdXNlIDI0IHVzIFR4IHNwZWVkCi0JLy8gICAgID0gIChCeXRlcyArIEFDSykgLyAxMiAvIGR1cmF0aW9uCi0JLy8gICAgIDkgaXMgdGhlIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yCi0JLy8gQ0NBQnVzeUZyYWN0aW9uID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMgLyA5IC8gcExvYWQtPkR1cmF0aW9uKTsKLQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIHBBZC0+U3RhQ2ZnLkNMRmFjdG9yIC8gcExvYWQtPkR1cmF0aW9uKTsKLQlpZiAoQ0NBQnVzeUZyYWN0aW9uIDwgMTApCi0JCQlDQ0FCdXN5RnJhY3Rpb24gPSAoVUNIQVIpIChwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyAvIDMgLyBwTG9hZC0+RHVyYXRpb24pICsgMTsKLQotCXBMb2FkLT5DQ0FCdXN5ID0gQ0NBQnVzeUZyYWN0aW9uOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNMQnVzeUJ5dGUgJWxkLCBEdXJhdGlvbiAlZCwgUmVzdWx0LCAlZFxuIiwgcEFkLT5TdGFDZmcuQ0xCdXN5Qnl0ZXMsIHBMb2FkLT5EdXJhdGlvbiwgQ0NBQnVzeUZyYWN0aW9uKSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiAlZFxuIiwgcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4pKTsKLQlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSAoc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSArIHNpemVvZihDSEFOTkVMX0xPQURfUkVQT1JUKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhbWVSZXBvcnRMZW4gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci0KLQkvLyA0LiBDbGVhciBjaGFubmVsIGxvYWQgbWVhc3VyZW1lbnQgZmxhZwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fTUVBU1VSRU1FTlQpOwotCi0JLy8gNS4gcmVzZXQgdG8gaWRsZSBzdGF0ZQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGFubmVsTG9hZFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5vaXNlSGlzdFJlcG9ydEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KQotewotCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OwotCVBOT0lTRV9ISVNUX1JFUE9SVAkJCXBOb2lzZTsKLQlQVUNIQVIJCQkJCQlwRGVzdDsKLQlVQ0hBUgkJCQkJCWksTm9pc2VDbnQ7Ci0JVVNIT1JUCQkJCQkJVG90YWxSUElDbnQsIFRvdGFsUlBJU3VtOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm9pc2VIaXN0UmVwb3J0QWN0aW9uIC0tLS0tPlxuIikpOwotCi0JLy8gMC4gRGlzYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbiwgbWFrZSBpdCBiYWNrIHRvIG5vcm1hbAotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KLQkvLyAxLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCi0JcERlc3QgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW5dOwotCXBSZXBvcnQgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKLQotCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGVsZW1lbnQgZmllbGQuCi0JcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOwotCS8vIEZpeGVkIExlbmd0aCBhdCAxNiwgbm90IGluY2x1ZGUgRWlkIGFuZCBsZW5ndGggZmllbGRzCi0JcFJlcG9ydC0+TGVuZ3RoID0gMTY7Ci0JcFJlcG9ydC0+VG9rZW4gID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5SZXFFbGVtLlRva2VuOwotCXBSZXBvcnQtPk1vZGUgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uUmVxRWxlbS5Nb2RlOwotCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9OT0lTRV9ISVNUX1JFUTsKLQotCS8vIDMuIEZpbGwgbm9pc2UgaGlzdG9ncmFtIHJlcG9ydCBtZWFzdXJlbWVudCBkYXRhCi0JcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQlwTm9pc2UgID0gKFBOT0lTRV9ISVNUX1JFUE9SVCkgcERlc3Q7Ci0JcE5vaXNlLT5DaGFubmVsICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtJbmRleF0uTWVhc3VyZW1lbnQuQ2hhbm5lbDsKLQlwTm9pc2UtPlNwYXJlICAgID0gMDsKLQlwTm9pc2UtPkR1cmF0aW9uID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W0luZGV4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQkvLyA0LiBGaWxsIE5vaXNlIGhpc3RvZ3JhbSwgdGhlIHRvdGFsIFJQSSBjb3VudHMgc2hvdWxkIGJlIDAuNCAqIFRVCi0JLy8gICAgV2UgZXN0aW1hdGUgNDAwMCBub3JtYWwgcGFja2V0cyByZWNlaXZlZCBkdXJuaW5nIDEwIHNlY29uZHMgdGVzdC4KLQkvLyAgICBBZGp1c3QgaXQgaWYgcmVxdWlyZWQuCi0JLy8gMyBpcyBhIGdvb2QgdmFsdWUgZm9yIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yCi0JLy8gVG90YWxSUElDbnQgPSBwTm9pc2UtPkR1cmF0aW9uICogMyAvIDEwOwotCVRvdGFsUlBJQ250ID0gcE5vaXNlLT5EdXJhdGlvbiAqIHBBZC0+U3RhQ2ZnLk5IRmFjdG9yIC8gMTA7Ci0JVG90YWxSUElTdW0gPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCVRvdGFsUlBJU3VtICs9IHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV07Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJQSSAlZCBDb251dHMgJWRcbiIsIGksIHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0pKTsKLQl9Ci0KLQkvLyBEb3VibGUgY2hlY2sgaWYgdGhlIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4gb3VyIGV4cGVjdGF0aW9uLgotCS8vIFdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIHRoZSB0b3RhbCBudW1iZXIgcGx1cyBhIGZyYWN0aW9uLgotCWlmIChUb3RhbFJQSVN1bSA+IFRvdGFsUlBJQ250KQotCQlUb3RhbFJQSUNudCA9IFRvdGFsUlBJU3VtICsgcE5vaXNlLT5EdXJhdGlvbiAvIDIwOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVG90YWwgUlBJIENvbnV0cyAlZFxuIiwgVG90YWxSUElDbnQpKTsKLQotCS8vIDUuIEluaXRpYWxpemUgbm9pc2UgY291bnQgZm9yIHRoZSB0b3RhbCBzdW1tYXRpb24gb2YgMHhmZgotCU5vaXNlQ250ID0gMDsKLQlmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQotCXsKLQkJcE5vaXNlLT5EZW5zaXR5W2ldID0gKFVDSEFSKSAocEFkLT5TdGFDZmcuUlBJRGVuc2l0eVtpXSAqIDI1NSAvIFRvdGFsUlBJQ250KTsKLQkJaWYgKChwTm9pc2UtPkRlbnNpdHlbaV0gPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbaV0gIT0gMCkpCi0JCQlwTm9pc2UtPkRlbnNpdHlbaV0rKzsKLQkJTm9pc2VDbnQgKz0gcE5vaXNlLT5EZW5zaXR5W2ldOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXBvcnRlZCBSUElbJWRdICA9IDB4JTAyeFxuIiwgaSwgcE5vaXNlLT5EZW5zaXR5W2ldKSk7Ci0JfQotCi0JLy8gNi4gUlBJWzBdIHJlcHJlc2VudHMgdGhlIHJlc3Qgb2YgY291bnRzCi0JcE5vaXNlLT5EZW5zaXR5WzBdID0gMHhmZiAtIE5vaXNlQ250OwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlcG9ydGVkIFJQSVswXSAgPSAweCUwMnhcbiIsIHBOb2lzZS0+RGVuc2l0eVswXSkpOwotCi0JcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRMZW4gKz0gKHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCkgKyBzaXplb2YoTk9JU0VfSElTVF9SRVBPUlQpKTsKLQotCS8vIDcuIENsZWFyIGNoYW5uZWwgbG9hZCBtZWFzdXJlbWVudCBmbGFnCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVCk7Ci0KLQkvLyA4LiByZXNldCB0byBpZGxlIHN0YXRlCi0JcEFkLT5NbG1lLkFpcm9uZXRNYWNoaW5lLkN1cnJTdGF0ZSA9IEFJUk9ORVRfSURMRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vaXNlSGlzdFJlcG9ydEFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgQmVhY29uIHJlcG9ydCBhY3Rpb24sCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUJlYWNvblJlcG9ydEFjdGlvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUluZGV4KQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJlYWNvblJlcG9ydEFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIExvb2tzIGxpa2Ugd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0aGluZyBuZWVkIHRvIGRvIGhlcmUuCi0JLy8gQWxsIG1lYXN1cmVtZW50IHJlcG9ydCBhbHJlYWR5IGZpbmlzaGVkIGluIEFkZEJlYWNvblJlcG9ydAotCS8vIFRoZSBsZW5ndGggaXMgaW4gdGhlIEZyYW1lUmVwb3J0TGVuCi0KLQkvLyByZXNldCBCZWFjb24gaW5kZXggZm9yIG5leHQgYmVhY29uIHJlcXVlc3QKLQlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSAweGZmOwotCi0JLy8gcmVzZXQgdG8gaWRsZSBzdGF0ZQotCXBBZC0+TWxtZS5BaXJvbmV0TWFjaGluZS5DdXJyU3RhdGUgPSBBSVJPTkVUX0lETEU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25SZXBvcnRBY3Rpb24gPC0tLS0tXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFpcm9uZXRBZGRCZWFjb25SZXBvcnQoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVVMT05HCQkJCUluZGV4LAotCUlOCVBNTE1FX1FVRVVFX0VMRU0JcEVsZW0pCi17Ci0JUFZPSUQJCQkJCQlwTXNnOwotCVBVQ0hBUgkJCQkJCXBTcmMsIHBEZXN0OwotCVVDSEFSCQkJCQkJUmVxSWR4OwotCVVMT05HCQkJCQkJTXNnTGVuOwotCVVTSE9SVAkJCQkJCUxlbmd0aDsKLQlQRlJBTUVfODAyXzExCQkJCXBGcmFtZTsKLQlQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQJcFJlcG9ydDsKLQlQRUlEX1NUUlVDVAkJCSAgICAgICAgcEVpZDsKLQlQQkVBQ09OX1JFUE9SVAkJCQlwQmVhY29uUmVwb3J0OwotCVBCU1NfRU5UUlkJCQkJCXBCc3M7Ci0KLQkvLyAwLiBTZXR1cCBwb2ludGVyIGZvciBwcm9jZXNzaW5nIGJlYWNvbiAmIHByb2JlIHJlc3BvbnNlCi0JcE1zZyAgID0gcEVsZW0tPk1zZzsKLQlNc2dMZW4gPSBwRWxlbS0+TXNnTGVuOwotCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBwTXNnOwotCXBTcmMgICA9IHBGcmFtZS0+T2N0ZXQ7CQkJCS8vIFN0YXJ0IGZyb20gQVAgVFNGCi0JcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOwotCVJlcUlkeCA9IHBBZC0+U3RhQ2ZnLkN1cnJlbnRSTVJlcUlkeDsKLQotCS8vIDEgQ2hlY2sgdGhlIEluZGV4LCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZSB0aGlzIGVudHJ5LCBvbmx5IHVwZGF0ZSB0aGUgYXZlcmFnZSBSU1NJCi0JaWYgKChJbmRleCA8PSBwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXgpICYmIChwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggIT0gMHhmZikpCi0JewotCQlwRGVzdCAgPSAoUFVDSEFSKSAmcEFkLT5TdGFDZmcuRnJhbWVSZXBvcnRCdWZbcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XV07Ci0JCS8vIFBvaW50IHRvIGJzcyByZXBvcnQgaW5mb3JtYXRpb24KLQkJcERlc3QgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQkJcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7Ci0KLQkJLy8gVXBkYXRlIFJ4IHBvd2VyLCBpbiBkQm0KLQkJLy8gR2V0IHRoZSBvcmlnaW5hbCBSU1NJIHJlYWRiYWNrIGZyb20gQkJQCi0JCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKz0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQkJLy8gQXZlcmFnZSB0aGUgUnNzaSByZWFkaW5nCi0JCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgID0gKHBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgKyBwQnNzLT5Sc3NpKSAvIDI7Ci0JCS8vIEdldCB0byBkQm0gZm9ybWF0Ci0JCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgLT0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAotCQkJcEJzcy0+QnNzaWRbMF0sIHBCc3MtPkJzc2lkWzFdLCBwQnNzLT5Cc3NpZFsyXSwKLQkJCXBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdIFJzc2kgJWQsIEF2ZyBSc3NpICVkXG4iLCBJbmRleCwgKHBCc3MtPlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGcmFtZVJlcG9ydExlbiA9ICVkXG4iLCBwQWQtPlN0YUNmZy5Cc3NSZXBvcnRPZmZzZXRbSW5kZXhdKSk7Ci0KLQkJLy8gVXBkYXRlIG90aGVyIGluZm9ybWF0aW9uIGhlcmUKLQotCQkvLyBEb25lCi0JCXJldHVybjsKLQl9Ci0KLQkvLyAyLiBVcGRhdGUgcmVwb3J0ZWQgSW5kZXgKLQlwQWQtPlN0YUNmZy5MYXN0QnNzSW5kZXggPSBJbmRleDsKLQotCS8vIDMuIFNldHVwIHRoZSBidWZmZXIgYWRkcmVzcyBmb3IgY29weWluZyB0aGlzIEJTU0lEIGludG8gcmVwb3J0aW5nIGZyYW1lCi0JLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KLQlwRGVzdCA9IChQVUNIQVIpICZwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydEJ1ZltwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbl07Ci0KLQkvLyA0LiBTYXZlIHRoZSBzdGFydCBvZmZzZXQgb2YgZWFjaCBCc3MgaW4gcmVwb3J0IGZyYW1lCi0JcEFkLT5TdGFDZmcuQnNzUmVwb3J0T2Zmc2V0W0luZGV4XSA9IHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuOwotCi0JLy8gNS4gRmlsbCBNZWFzdXJlbWVudCByZXBvcnQgZmllbGRzCi0JcFJlcG9ydCA9IChQTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpIHBEZXN0OwotCXBSZXBvcnQtPkVpZCA9IElFX01FQVNVUkVNRU5UX1JFUE9SVDsKLQlwUmVwb3J0LT5MZW5ndGggPSAwOwotCXBSZXBvcnQtPlRva2VuICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLlJlcUVsZW0uVG9rZW47Ci0JcFJlcG9ydC0+TW9kZSAgID0gcEFkLT5TdGFDZmcuTWVhc3VyZW1lbnRSZXF1ZXN0W1JlcUlkeF0uUmVxRWxlbS5Nb2RlOwotCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROwotCUxlbmd0aCAgICAgICAgICA9IHNpemVvZihNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVCk7Ci0JcERlc3QgICAgICAgICAgKz0gc2l6ZW9mKE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKTsKLQotCS8vIDYuIFN0YXJ0IHRoZWJlYWNvbiByZXBvcnQgZm9ybWF0Ci0JcEJlYWNvblJlcG9ydCA9IChQQkVBQ09OX1JFUE9SVCkgcERlc3Q7Ci0JcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKLQlMZW5ndGggICAgICAgKz0gc2l6ZW9mKEJFQUNPTl9SRVBPUlQpOwotCi0JLy8gNy4gQ29weSBDaGFubmVsIG51bWJlcgotCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKLQlwQmVhY29uUmVwb3J0LT5TcGFyZSAgICAgICAgICA9IDA7Ci0JcEJlYWNvblJlcG9ydC0+RHVyYXRpb24gICAgICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5NZWFzdXJlbWVudC5EdXJhdGlvbjsKLQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7Ci0JLy8gOC4gUnggcG93ZXIsIGluIGRCbQotCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCc3NpZCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAiLAotCQlwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAotCQlwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnhQb3dlclslbGRdLCBSc3NpICVkXG4iLCBJbmRleCwgcEJlYWNvblJlcG9ydC0+UnhQb3dlciAtIDI1NikpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZyYW1lUmVwb3J0TGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci0KLQlwQmVhY29uUmVwb3J0LT5CZWFjb25JbnRlcnZhbCA9IHBCc3MtPkJlYWNvblBlcmlvZDsKLQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwRnJhbWUtPkhkci5BZGRyMyk7Ci0JTmRpc01vdmVNZW1vcnkocEJlYWNvblJlcG9ydC0+UGFyZW50VFNGLCBwU3JjLCA0KTsKLQlOZGlzTW92ZU1lbW9yeShwQmVhY29uUmVwb3J0LT5UYXJnZXRUU0YsICZwRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JTmRpc01vdmVNZW1vcnkoJnBCZWFjb25SZXBvcnQtPlRhcmdldFRTRls0XSwgJnBFbGVtLT5UaW1lU3RhbXAudS5IaWdoUGFydCwgNCk7Ci0KLQkvLyA5LiBTa2lwIHRoZSBiZWFjb24gZnJhbWUgYW5kIG9mZnNldCB0byBzdGFydCBvZiBjYXBhYmlsaXR5aW5mbyBzaW5jZSB3ZSBhbHJlYWR5IHByb2Nlc3NlZCBjYXBhYmlsaXR5aW5mbwotCXBTcmMgKz0gKFRJTUVTVEFNUF9MRU4gKyAyKTsKLQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9ICooVVNIT1JUICopcFNyYzsKLQotCS8vIDEwLiBQb2ludCB0byBzdGFydCBvZiBlbGVtZW50IElECi0JcFNyYyArPSAyOwotCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7Ci0KLQkvLyAxMS4gU3RhcnQgcHJvY2VzcyBhbGwgdmFyaWFibGUgRWlkIG9heWxvYWQgYW5kIGFkZCB0aGUgYXBwcm9wcmlhdGUgdG8gdGhlIGZyYW1lIHJlcG9ydAotCXdoaWxlICgoKFBVQ0hBUikgcEVpZCArIHBFaWQtPkxlbiArIDEpIDwgKChQVUNIQVIpIHBGcmFtZSArIE1zZ0xlbikpCi0JewotCQkvLyBPbmx5IGxpbWl0ZWQgRUlEIGFyZSByZXF1aXJlZCB0byByZXBvcnQgZm9yIENDWCAyLiBJdCBpbmNsdWRlcyBTU0lELCBTdXBwb3J0ZWQgcmF0ZSwKLQkJLy8gRkggcGFyYW1lbnRlciBzZXQsIERTIHBhcmFtZXRlciBzZXQsIENGIHBhcmFtZXRlciBzZXQsIElCU1MgcGFyYW1ldGVyIHNldCwKLQkJLy8gVElNIChyZXBvcnQgZmlyc3QgNCBieXRlcyBvbmx5LCByYWRpbyBtZWFzdXJlbWVudCBjYXBhYmlsaXR5Ci0JCXN3aXRjaCAocEVpZC0+RWlkKQotCQl7Ci0JCQljYXNlIElFX1NTSUQ6Ci0JCQljYXNlIElFX1NVUFBfUkFURVM6Ci0JCQljYXNlIElFX0ZIX1BBUk06Ci0JCQljYXNlIElFX0RTX1BBUk06Ci0JCQljYXNlIElFX0NGX1BBUk06Ci0JCQljYXNlIElFX0lCU1NfUEFSTToKLQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgcEVpZC0+TGVuICsgMik7Ci0JCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElFX01FQVNVUkVNRU5UX0NBUEFCSUxJVFk6Ci0JCQkJLy8gU2luY2UgdGhpcyBJRSBpcyBkdXBsaWNhdGVkIHdpdGggV1BBIHNlY3VyaXR5IElFLCB3ZSBoYXMgdG8gZG8gc2FuaXR5IGNoZWNrIGJlZm9yZQotCQkJCS8vIHJlY29nbml6ZSBpdC4KLQkJCQkvLyAxLiBJdCBhbHNvIGhhcyBmaXhlZCA2IGJ5dGVzIElFIGxlbmd0aC4KLQkJCQlpZiAocEVpZC0+TGVuICE9IDYpCi0JCQkJCWJyZWFrOwotCQkJCS8vIDIuIENoZWNrIHRoZSBDaXNjbyBBaXJvbmV0IE9VSQotCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkoQ0lTQ09fT1VJLCAocFNyYyArIDIpLCAzKSkKLQkJCQl7Ci0JCQkJCS8vIE1hdGNoZWQsIHRoaXMgaXMgd2hhdCB3ZSB3YW50Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwRWlkLCBwRWlkLT5MZW4gKyAyKTsKLQkJCQkJcERlc3QgICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQkJTGVuZ3RoICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUVfVElNOgotCQkJCWlmIChwRWlkLT5MZW4gPiA0KQotCQkJCXsKLQkJCQkJLy8gTWF5IHRydW5jYXRlIGFuZCByZXBvcnQgdGhlIGZpcnN0IDQgYnl0ZXMgb25seSwgd2l0aCB0aGUgZWlkICYgbGVuLCB0b3RhbCBzaG91bGQgYmUgNgotCQkJCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgcEVpZCwgNik7Ci0JCQkJCXBEZXN0ICArPSA2OwotCQkJCQlMZW5ndGggKz0gNjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocERlc3QsIHBFaWQsIHBFaWQtPkxlbiArIDIpOwotCQkJCQlwRGVzdCAgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCQlMZW5ndGggKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQkvLyAxMi4gTW92ZSB0byBuZXh0IGVsZW1lbnQgSUQKLQkJcFNyYyArPSAoMiArIHBFaWQtPkxlbik7Ci0JCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBTcmM7Ci0JfQotCi0JLy8gMTMuIFVwZGF0ZSB0aGUgbGVuZ3RoIGluIHRoZSBoZWFkZXIsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCi0JcFJlcG9ydC0+TGVuZ3RoID0gTGVuZ3RoIC0gNDsKLQotCS8vIDE0LiBVcGRhdGUgdGhlIGZyYW1lIHJlcG9ydCBidWZmZXIgZGF0YSBsZW5ndGgKLQlwQWQtPlN0YUNmZy5GcmFtZVJlcG9ydExlbiArPSBMZW5ndGg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRlIgbGVuID0gJWRcbiIsIHBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCQlJbmRleAkJQ3VycmVudCBCU1NJRCBpbiBDQ1hCc3N0YWIgZW50cnkgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFpcm9uZXRDcmVhdGVCZWFjb25SZXBvcnRGcm9tQnNzVGFibGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkKQotewotCVBNRUFTVVJFTUVOVF9SRVBPUlRfRUxFTUVOVAlwUmVwb3J0OwotCVBCRUFDT05fUkVQT1JUCQkJCXBCZWFjb25SZXBvcnQ7Ci0JVUNIQVIJCQkJCQlJbmRleCwgUmVxSWR4OwotCVVTSE9SVAkJCQkJCUxlbmd0aDsKLQlQVUNIQVIJCQkJCQlwRGVzdDsKLQlQQlNTX0VOVFJZCQkJCQlwQnNzOwotCi0JLy8gMC4gc2V0dXAgYmFzZSBwb2ludGVyCi0JUmVxSWR4ID0gcEFkLT5TdGFDZmcuQ3VycmVudFJNUmVxSWR4OwotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc05yOyBJbmRleCsrKQotCXsKLQkJLy8gMS4gU2V0dXAgdGhlIGJ1ZmZlciBhZGRyZXNzIGZvciBjb3B5aW5nIHRoaXMgQlNTSUQgaW50byByZXBvcnRpbmcgZnJhbWUKLQkJLy8gICAgVGhlIG9mZnNldCBzaG91bGQgc3RhcnQgYWZ0ZXIgODAyLjExIGhlYWRlciBhbmQgcmVwb3J0IGZyYW1lIGhlYWRlci4KLQkJcERlc3QgID0gKFBVQ0hBUikgJnBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0QnVmW3BBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuXTsKLQkJcEJzcyAgID0gKFBCU1NfRU5UUlkpICZwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSW5kZXhdOwotCQlMZW5ndGggPSAwOwotCi0JCS8vIDIuIEZpbGwgTWVhc3VyZW1lbnQgcmVwb3J0IGZpZWxkcwotCQlwUmVwb3J0ICAgICAgICAgPSAoUE1FQVNVUkVNRU5UX1JFUE9SVF9FTEVNRU5UKSBwRGVzdDsKLQkJcFJlcG9ydC0+RWlkICAgID0gSUVfTUVBU1VSRU1FTlRfUkVQT1JUOwotCQlwUmVwb3J0LT5MZW5ndGggPSAwOwotCQlwUmVwb3J0LT5Ub2tlbiAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLlRva2VuOwotCQlwUmVwb3J0LT5Nb2RlICAgPSBwQWQtPlN0YUNmZy5NZWFzdXJlbWVudFJlcXVlc3RbUmVxSWR4XS5SZXFFbGVtLk1vZGU7Ci0JCXBSZXBvcnQtPlR5cGUgICA9IE1TUk5fVFlQRV9CRUFDT05fUkVROwotCQlMZW5ndGggICAgICAgICAgPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOwotCQlwRGVzdCAgICAgICAgICArPSBzaXplb2YoTUVBU1VSRU1FTlRfUkVQT1JUX0VMRU1FTlQpOwotCi0JCS8vIDMuIFN0YXJ0IHRoZSBiZWFjb24gcmVwb3J0IGZvcm1hdAotCQlwQmVhY29uUmVwb3J0ID0gKFBCRUFDT05fUkVQT1JUKSBwRGVzdDsKLQkJcERlc3QgICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKLQkJTGVuZ3RoICAgICAgICs9IHNpemVvZihCRUFDT05fUkVQT1JUKTsKLQotCQkvLyA0LiBDb3B5IENoYW5uZWwgbnVtYmVyCi0JCXBCZWFjb25SZXBvcnQtPkNoYW5uZWwgICAgICAgID0gcEJzcy0+Q2hhbm5lbDsKLQkJcEJlYWNvblJlcG9ydC0+U3BhcmUgICAgICAgICAgPSAwOwotCQlwQmVhY29uUmVwb3J0LT5EdXJhdGlvbiAgICAgICA9IHBBZC0+U3RhQ2ZnLk1lYXN1cmVtZW50UmVxdWVzdFtSZXFJZHhdLk1lYXN1cmVtZW50LkR1cmF0aW9uOwotCQlwQmVhY29uUmVwb3J0LT5QaHlUeXBlICAgICAgICA9ICgocEJzcy0+U3VwUmF0ZUxlbitwQnNzLT5FeHRSYXRlTGVuID4gNCkgPyBQSFlfRVJQIDogUEhZX0RTUyk7Ci0JCXBCZWFjb25SZXBvcnQtPlJ4UG93ZXIgICAgICAgID0gcEJzcy0+UnNzaSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0JCXBCZWFjb25SZXBvcnQtPkJlYWNvbkludGVydmFsID0gcEJzcy0+QmVhY29uUGVyaW9kOwotCQlwQmVhY29uUmVwb3J0LT5DYXBhYmlsaXR5SW5mbyA9IHBCc3MtPkNhcGFiaWxpdHlJbmZvOwotCQlDT1BZX01BQ19BRERSKHBCZWFjb25SZXBvcnQtPkJTU0lELCBwQnNzLT5Cc3NpZCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlBhcmVudFRTRiwgcEJzcy0+UFRTRiwgNCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBCZWFjb25SZXBvcnQtPlRhcmdldFRTRiwgcEJzcy0+VFRTRiwgOCk7Ci0KLQkJLy8gNS4gQ3JlYXRlIFNTSUQKLQkJKnBEZXN0KysgPSAweDAwOwotCQkqcERlc3QrKyA9IHBCc3MtPlNzaWRMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKLQkJcERlc3QgICs9IHBCc3MtPlNzaWRMZW47Ci0JCUxlbmd0aCArPSAoMiArIHBCc3MtPlNzaWRMZW4pOwotCi0JCS8vIDYuIENyZWF0ZSBTdXBwb3J0UmF0ZXMKLQkJKnBEZXN0KysgPSAweDAxOwotCQkqcERlc3QrKyA9IHBCc3MtPlN1cFJhdGVMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEZXN0LCBwQnNzLT5TdXBSYXRlLCBwQnNzLT5TdXBSYXRlTGVuKTsKLQkJcERlc3QgICs9IHBCc3MtPlN1cFJhdGVMZW47Ci0JCUxlbmd0aCArPSAoMiArIHBCc3MtPlN1cFJhdGVMZW4pOwotCi0JCS8vIDcuIERTIFBhcmFtZXRlcgotCQkqcERlc3QrKyA9IDB4MDM7Ci0JCSpwRGVzdCsrID0gMTsKLQkJKnBEZXN0KysgPSBwQnNzLT5DaGFubmVsOwotCQlMZW5ndGggICs9IDM7Ci0KLQkJLy8gOC4gSUJTUyBwYXJhbWV0ZXIgaWYgcHJlc2VudHMKLQkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQl7Ci0JCQkqcERlc3QrKyA9IDB4MDY7Ci0JCQkqcERlc3QrKyA9IDI7Ci0JCQkqKFBVU0hPUlQpIHBEZXN0ID0gcEJzcy0+QXRpbVdpbjsKLQkJCXBEZXN0ICAgKz0gMjsKLQkJCUxlbmd0aCAgKz0gNDsKLQkJfQotCi0JCS8vIDkuIFVwZGF0ZSBsZW5ndGggZmllbGQsIG5vdCBpbmNsdWRlIEVJRCBhbmQgbGVuZ3RoCi0JCXBSZXBvcnQtPkxlbmd0aCA9IExlbmd0aCAtIDQ7Ci0KLQkJLy8gMTAuIFVwZGF0ZSB0b3RhbCBmcmFtZSBzaXplCi0JCXBBZC0+U3RhQ2ZnLkZyYW1lUmVwb3J0TGVuICs9IExlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXNzb2MuYwppbmRleCAxYTU4NzE1Li43MDU1ZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hc3NvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Fzc29jLmMKQEAgLTM2LDMxICszNiwzMSBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotVUNIQVIJQ2lwaGVyV3BhVGVtcGxhdGVbXSA9IHsKLQkJMHhkZCwgCQkJCQkvLyBXUEEgSUUKLQkJMHgxNiwJCQkJCS8vIExlbmd0aAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKK3U4IENpcGhlcldwYVRlbXBsYXRlW10gPSB7CisJMHhkZCwJCQkvKiBXUEEgSUUgKi8KKwkweDE2LAkJCS8qIExlbmd0aCAqLworCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8qIG91aSAqLworCTB4MDEsIDB4MDAsCQkvKiBWZXJzaW9uICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLyogTXVsdGljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIE51bWJlciBvZiB1bmljYXN0ICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLyogdW5pY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMQkvKiBhdXRoZW50aWNhdGlvbiAqLworfTsKIAotVUNIQVIJQ2lwaGVyV3BhMlRlbXBsYXRlW10gPSB7Ci0JCTB4MzAsCQkJCQkvLyBSU04gSUUKLQkJMHgxNCwJCQkJCS8vIExlbmd0aAotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIGdyb3VwIGNpcGhlciwgVEtJUAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgcGFpcndpc2UKLQkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIGF1dGhlbnRpY2F0aW9uCi0JCTB4MDAsIDB4MDAsCQkJCS8vIFJTTiBjYXBhYmlsaXR5Ci0JCX07Cit1OCBDaXBoZXJXcGEyVGVtcGxhdGVbXSA9IHsKKwkweDMwLAkJCS8qIFJTTiBJRSAqLworCTB4MTQsCQkJLyogTGVuZ3RoICovCisJMHgwMSwgMHgwMCwJCS8qIFZlcnNpb24gKi8KKwkweDAwLCAweDBmLCAweGFjLCAweDAyLAkvKiBncm91cCBjaXBoZXIsIFRLSVAgKi8KKwkweDAxLCAweDAwLAkJLyogbnVtYmVyIG9mIHBhaXJ3aXNlICovCisJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLyogdW5pY2FzdCAqLworCTB4MDEsIDB4MDAsCQkvKiBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kICovCisJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLyogYXV0aGVudGljYXRpb24gKi8KKwkweDAwLCAweDAwLAkJLyogUlNOIGNhcGFiaWxpdHkgKi8KK307CiAKLVVDSEFSCUNjeDJJZUluZm9bXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMywgMHgwMn07Cit1OCBDY3gySWVJbmZvW10gPSB7IDB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDIgfTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNzMsNTUgKzczLDg0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqUywKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIEFzc29jU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotCVN0YXRlTWFjaGluZUluaXQoUywgVHJhbnMsIE1BWF9BU1NPQ19TVEFURSwgTUFYX0FTU09DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBU1NPQ19JRExFLCBBU1NPQ19NQUNISU5FX0JBU0UpOworCVN0YXRlTWFjaGluZUluaXQoUywgVHJhbnMsIE1BWF9BU1NPQ19TVEFURSwgTUFYX0FTU09DX01TRywKKwkJCSAoU1RBVEVfTUFDSElORV9GVU5DKSBEcm9wLCBBU1NPQ19JRExFLAorCQkJIEFTU09DX01BQ0hJTkVfQkFTRSk7CiAKLQkvLyBmaXJzdCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBc3NvY1JlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVSZWFzc29jUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVEaXNhc3NvY1JlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOworCS8qIGZpcnN0IGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lQXNzb2NSZXFBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVSZWFzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgTWxtZURpc2Fzc29jUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfSURMRSwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckRpc2Fzc29jQWN0aW9uKTsKIAotCS8vIHNlY29uZCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckFzc29jUnNwQWN0aW9uKTsKLQkvLwotCS8vIFBhdGNoIDNDb20gQVAgTU9kZTozQ1JXRTQ1NEc3MgotCS8vIFdlIHNlbmQgQXNzb2MgcmVxdWVzdCBmcmFtZSB0byB0aGlzIEFQLCBpdCBhbHdheXMgc2VuZCBSZWFzc29jIFJzcCBub3QgQXNzb2NpYXRlIFJzcC4KLQkvLwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckFzc29jUnNwQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9BU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUFzc29jVGltZW91dEFjdGlvbik7CisJLyogc2Vjb25kIGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykKKwkJCSAgICAgIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJBc3NvY1JzcEFjdGlvbik7CisJLyogKi8KKwkvKiBQYXRjaCAzQ29tIEFQIE1PZGU6M0NSV0U0NTRHNzIgKi8KKwkvKiBXZSBzZW5kIEFzc29jIHJlcXVlc3QgZnJhbWUgdG8gdGhpcyBBUCwgaXQgYWx3YXlzIHNlbmQgUmVhc3NvYyBSc3Agbm90IEFzc29jaWF0ZSBSc3AuICovCisJLyogKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX1JFQVNTT0NfUlNQLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckFzc29jUnNwQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9BU1NPQ19USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgQXNzb2NUaW1lb3V0QWN0aW9uKTsKIAotCS8vIHRoaXJkIGNvbHVtbgotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGlzYXNzb2NBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7Ci0JLy8KLQkvLyBQYXRjaCwgQVAgZG9lc24ndCBzZW5kIFJlYXNzb2NpYXRlIFJzcCBmcmFtZSB0byBTdGF0aW9uLgotCS8vCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9QRUVSX0FTU09DX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUmVhc3NvY1JzcEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9SRUFTU09DX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVhc3NvY1RpbWVvdXRBY3Rpb24pOworCS8qIHRoaXJkIGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykKKwkJCSAgICAgIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyRGlzYXNzb2NBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9SRUFTU09DX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJSZWFzc29jUnNwQWN0aW9uKTsKKwkvKiAqLworCS8qIFBhdGNoLCBBUCBkb2Vzbid0IHNlbmQgUmVhc3NvY2lhdGUgUnNwIGZyYW1lIHRvIFN0YXRpb24uICovCisJLyogKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfQVNTT0NfUlNQLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlclJlYXNzb2NSc3BBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUkVBU1NPQ19USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUmVhc3NvY1RpbWVvdXRBY3Rpb24pOwogCi0JLy8gZm91cnRoIGNvbHVtbgotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKURpc2Fzc29jVGltZW91dEFjdGlvbik7CisJLyogZm91cnRoIGNvbHVtbiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlbkFzc29jKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykKKwkJCSAgICAgIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckRpc2Fzc29jQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9ESVNBU1NPQ19USU1FT1VULAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKTsKIAotCS8vIGluaXRpYWxpemUgdGhlIHRpbWVyCi0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCS8qIGluaXRpYWxpemUgdGhlIHRpbWVyICovCisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwKKwkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKEFzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwKKwkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKFJlYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwKKwkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKERpc2Fzc29jVGltZW91dCksIHBBZCwgRkFMU0UpOwogfQogCiAvKgpAQCAtMTM2LDIwICsxNjUsMjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQkJCQkgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JCQkJIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgQXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSAgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKIAkJcmV0dXJuOwogCiAJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiB9CiAKIC8qCkBAIC0xNjQsMjAgKzE5MywyMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBSZWFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCit2b2lkIFJlYXNzb2NUaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgIHZvaWQgKlN5c3RlbVNwZWNpZmljMiwgdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCisJLyogRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuICovCisJLyogVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0ICovCisJaWYgKFJUTVBfVEVTVF9GTEFHCisJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCiAJCXJldHVybjsKIAogCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7CiB9CiAKIC8qCkBAIC0xOTIsMjAgKzIyMSwyMCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBEaXNhc3NvY1RpbWVvdXQoSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCQkJCQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBEaXNhc3NvY1RpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgICAgIHZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJICAgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLworCWlmIChSVE1QX1RFU1RfRkxBRworCSAgICAocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQogCQlyZXR1cm47CiAKIAlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKLQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKIH0KIAogLyoKQEAgLTIzMCwzNDkgKzI1OSwzMTUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUFzc29jUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZUFzc29jUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUgkJCUFwQWRkcls2XTsKLQlIRUFERVJfODAyXzExCUFzc29jSGRyOwotCVVDSEFSCQkJQ2N4MkxlbiA9IDU7Ci0JVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCVVTSE9SVAkJCUxpc3RlbkludHY7Ci0JVUxPTkcJCQlUaW1lb3V0OwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVTE9ORwkJCXRtcDsKLQlVU0hPUlQJCQlWYXJJZXNPZmZzZXQ7Ci0JVUNIQVIJCQlDa2lwRmxhZzsKLQlVQ0hBUgkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlcltDS0lQX05FR09USUFUSU9OX0xFTkdUSF07Ci0JVUNIQVIJCQlBaXJvbmV0Q2tpcEllID0gSUVfQUlST05FVF9DS0lQOwotCVVDSEFSCQkJQWlyb25ldENraXBMZW4gPSBDS0lQX05FR09USUFUSU9OX0xFTkdUSDsKLQlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NJRSA9IElFX0FJUk9ORVRfSVBBRERSRVNTOwotCVVDSEFSCQkJQWlyb25ldElQQWRkcmVzc0xlbiA9IEFJUk9ORVRfSVBBRERSRVNTX0xFTkdUSDsKLQlVQ0hBUgkJCUFpcm9uZXRJUEFkZHJlc3NCdWZmZXJbQUlST05FVF9JUEFERFJFU1NfTEVOR1RIXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwfTsKLQlVU0hPUlQJCQlTdGF0dXM7CisJdTggQXBBZGRyWzZdOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEFzc29jSGRyOworCXU4IFdtZUllWzldID0KKwkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsCisgICAgICAgMHgwMCB9OworCXUxNiBMaXN0ZW5JbnR2OworCXVuc2lnbmVkIGxvbmcgVGltZW91dDsKKwl1MTYgQ2FwYWJpbGl0eUluZm87CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdTE2IFZhckllc09mZnNldDsKKwl1MTYgU3RhdHVzOwogCi0JLy8gQmxvY2sgYWxsIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kCi0JaWYgKHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEJsb2NrIEFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBCbG9jayBBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOwogCX0KLQkvLyBjaGVjayBzYW5pdHkgZmlyc3QKLQllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCi0JeworCS8qIGNoZWNrIHNhbml0eSBmaXJzdCAqLworCWVsc2UgaWYgKE1sbWVBc3NvY1JlcVNhbml0eQorCQkgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLAorCQkgICZUaW1lb3V0LCAmTGlzdGVuSW50dikpIHsKIAkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7CiAKLQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKKwkJLyogR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KIAkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLQkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKIAkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIAkJCXJldHVybjsKIAkJfQotCi0JCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKLQkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKKwkJLyogQWRkIGJ5IEphbWVzIDAzLzA2LzI3ICovCisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9uZGlzXzgwMl8xMV9hc3NvY2lhdGlvbl9pbmZvcm1hdGlvbik7CisJCS8qIEFzc29jaWF0aW9uIGRvbid0IG5lZWQgdG8gcmVwb3J0IE1BQyBhZGRyZXNzICovCiAJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5BdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXMgPQotCQkJTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTIHwgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUw7Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuTGlzdGVuSW50ZXJ2YWwgPSBMaXN0ZW5JbnR2OwotCQkvLyBPbmx5IHJlYXNzb2NpYXRlIG5lZWQgdGhpcwotCQkvL0NPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DdXJyZW50QVBBZGRyZXNzLCBBcEFkZHIpOwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVxdWVzdElFcyA9IHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTik7CisJCSAgICBORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfAorCQkgICAgTkRJU184MDJfMTFfQUlfUkVRRklfTElTVEVOSU5URVJWQUw7CisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5SZXF1ZXN0Rml4ZWRJRXMuQ2FwYWJpbGl0aWVzID0KKwkJICAgIENhcGFiaWxpdHlJbmZvOworCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkxpc3RlbkludGVydmFsID0KKwkJICAgIExpc3RlbkludHY7CisJCS8qIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzICovCisJCS8qQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7ICovCisJCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0KKwkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXNzb2NpYXRpb25faW5mb3JtYXRpb24pOwogCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgTUFYX1ZJRV9MRU4pOwotCQkvLyBGaXJzdCBhZGQgU1NJRAorCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKKwkJLyogRmlyc3QgYWRkIFNTSUQgKi8KIAkJVmFySWVzT2Zmc2V0ID0gMDsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLAorCQkJICAgICAgIDEpOwogCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sIDEpOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsCisJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKIAkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LAorCQkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CiAJCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKIAotCQkvLyBTZWNvbmQgYWRkIFN1cHBvcnRlZCByYXRlcwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZTdXBSYXRlSWUsIDEpOworCQkvKiBTZWNvbmQgYWRkIFN1cHBvcnRlZCByYXRlcyAqLworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZTdXBSYXRlSWUsCisJCQkgICAgICAgMSk7CiAJCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwKKwkJCSAgICAgICAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIDEpOwogCQlWYXJJZXNPZmZzZXQgKz0gMTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsCisJCQkgICAgICAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKIAkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuOwotCQkvLyBFbmQgQWRkIGJ5IEphbWVzCisJCS8qIEVuZCBBZGQgYnkgSmFtZXMgKi8KIAotICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSBUUlVFKSkKLSAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvIHw9IDB4MDEwMDsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpICYmCisJCSAgICAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gVFJVRSkpCisJCQlDYXBhYmlsaXR5SW5mbyB8PSAweDAxMDA7CiAKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIEFTU09DIHJlcXVlc3QuLi5cbiIpKTsKLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBc3NvY0hkciwgU1VCVFlQRV9BU1NPQ19SRVEsIDAsIEFwQWRkciwgQXBBZGRyKTsKKwkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBc3NvY0hkciwgU1VCVFlQRV9BU1NPQ19SRVEsIDAsIEFwQWRkciwKKwkJCQkgQXBBZGRyKTsKIAotCQkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwJJkFzc29jSGRyLAotCQkJCQkJICAyLAkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCSAgMiwJCQkJCQkmTGlzdGVuSW50diwKLQkJCQkJCSAgMSwJCQkJCQkmU3NpZEllLAotCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3NpZExlbiwKLQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIAlwQWQtPk1sbWVBdXguU3NpZCwKLQkJCQkJCSAgMSwJCQkJCQkmU3VwUmF0ZUllLAotCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKLQkJCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sICBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkvKiBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdCAqLworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLCAmQXNzb2NIZHIsCisJCQkJICAyLCAmQ2FwYWJpbGl0eUluZm8sCisJCQkJICAyLCAmTGlzdGVuSW50diwKKwkJCQkgIDEsICZTc2lkSWUsCisJCQkJICAxLCAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJICAxLCAmU3VwUmF0ZUllLAorCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLAorCQkJCSAgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sIHBBZC0+TWxtZUF1eC5TdXBSYXRlLAorCQkJCSAgRU5EX09GX0FSR1MpOwogCi0JCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKQotCQl7Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCWlmIChwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiAhPSAwKSB7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCSAgMSwgJkV4dFJhdGVJZSwKKwkJCQkJICAxLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCisJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGUsIEVORF9PRl9BUkdTKTsKIAkJCUZyYW1lTGVuICs9IHRtcDsKIAkJfQotCi0JCS8vIEhUCi0JCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCQl7Ci0JCQlVTE9ORyBUbXBMZW47Ci0JCQlVQ0hBUiBIdExlbjsKLQkJCVVDSEFSIEJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307Ci0JCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpCi0JCQl7CisJCS8qIEhUICovCisJCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkgeworCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQl1OCBIdExlbjsKKwkJCXU4IEJST0FEQ09NWzRdID0geyAweDAsIDB4OTAsIDB4NGMsIDB4MzMgfTsKKwkJCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJQcmVOSHQgPT0gVFJVRSkgewogCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCAxLCAmV3BhSWUsIDEsICZIdExlbiwKKwkJCQkJCSAgNCwgJkJST0FEQ09NWzBdLAorCQkJCQkJICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfSBlbHNlIHsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkgICZUbXBMZW4sIDEsICZIdENhcEllLCAxLAorCQkJCQkJICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKIAkJCX0KIAkJCUZyYW1lTGVuICs9IFRtcExlbjsKIAkJfQotCi0JCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCi0JCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCi0JCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCS8qIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OICovCisJCS8qIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykgKi8KKwkJLyogMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORCAqLworCQkvKiAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrICovCisJCS8qIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTiAqLworCQkvKiBDYXNlIElJOiAoQWdncmVnYXRpb24pICovCisJCS8qIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQgKi8KKwkJLyogMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTiAqLworCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkgeworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkKKwkJCSAgICAmJiAoKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykpIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCQl1OCBSYWxpbmtJZVs5XSA9CisJCQkJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLAorCQkJICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkgICZUbXBMZW4sIDksIFJhbGlua0llLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOworCQkJfSBlbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpIHsKKwkJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCQl1OCBSYWxpbmtJZVs5XSA9CisJCQkJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLAorCQkJICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkgICZUbXBMZW4sIDksIFJhbGlua0llLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwogCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA2LCAweDAwLCAweDAwLCAweDAwfTsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKLQkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQl1OCBSYWxpbmtJZVs5XSA9CisJCQkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDYsCisJCSAgICAweDAwLCAweDAwLCAweDAwIH07CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZUbXBMZW4sIDksCisJCQkJCSAgUmFsaW5rSWUsIEVORF9PRl9BUkdTKTsKIAkJCUZyYW1lTGVuICs9IFRtcExlbjsKIAkJfQogCi0JCWlmIChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5iVmFsaWQpCi0JCXsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKQotCQkJewotCQkJCVFCU1NfU1RBX0lORk9fUEFSTSBRb3NJbmZvOworCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKSB7CisJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCQkgICAgJiYgcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSB7CisJCQkJc3RydWN0IHJ0X3Fic3Nfc3RhX2luZm9fcGFybSBRb3NJbmZvOwogCi0JCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sIHNpemVvZihRQlNTX1NUQV9JTkZPX1BBUk0pKTsKKwkJCQlOZGlzWmVyb01lbW9yeSgmUW9zSW5mbywKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19zdGFfaW5mb19wYXJtKSk7CiAJCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7CiAJCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7CiAJCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7CiAJCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87Ci0JCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOwotCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOwotCQkJfQotCQkJZWxzZQotCQkJewotICAgICAgICAgICAgICAgIC8vIFRoZSBQYXJhbWV0ZXIgU2V0IENvdW50IGlzIHNldCB0byChpzChqCBpbiB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZXMKLSAgICAgICAgICAgICAgICAvLyBXbWVJZVs4XSB8PSAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICYgMHgwZik7CisJCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9CisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOworCQkJCVdtZUllWzhdIHw9ICoodTggKikmIFFvc0luZm87CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBQYXJhbWV0ZXIgU2V0IENvdW50IGlzIHNldCB0byChpzChqCBpbiB0aGUgYXNzb2NpYXRpb24gcmVxdWVzdCBmcmFtZXMgKi8KKwkJCQkvKiBXbWVJZVs4XSB8PSAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICYgMHgwZik7ICovCiAJCQl9CiAKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgJnRtcCwKLQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgJldtZUllWzBdLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkgIDksICZXbWVJZVswXSwgRU5EX09GX0FSR1MpOwogCQkJRnJhbWVMZW4gKz0gdG1wOwogCQl9Ci0KLQkJLy8KLQkJLy8gTGV0IFdQQSgjMjIxKSBFbGVtZW50IElEIG9uIHRoZSBlbmQgb2YgdGhpcyBhc3NvY2lhdGlvbiBmcmFtZS4KLQkJLy8gT3RoZXJ3aXNlIHNvbWUgQVAgd2lsbCBmYWlsIG9uIHBhcnNpbmcgRWxlbWVudCBJRCBhbmQgc2V0IHN0YXR1cyBmYWlsIG9uIEFzc29jIFJzcC4KLQkJLy8gRm9yIGV4YW1wbGU6IFB1dCBWZW5kb3IgU3BlY2lmaWMgSUUgb24gdGhlIGZyb250IG9mIFdQQSBJRS4KLQkJLy8gVGhpcyBoYXBwZW5zIG9uIEFQIChNb2RlbCBObzpMaW5rc3lzIFdSSzU0RykKLQkJLy8KKwkJLyogKi8KKwkJLyogTGV0IFdQQSgjMjIxKSBFbGVtZW50IElEIG9uIHRoZSBlbmQgb2YgdGhpcyBhc3NvY2lhdGlvbiBmcmFtZS4gKi8KKwkJLyogT3RoZXJ3aXNlIHNvbWUgQVAgd2lsbCBmYWlsIG9uIHBhcnNpbmcgRWxlbWVudCBJRCBhbmQgc2V0IHN0YXR1cyBmYWlsIG9uIEFzc29jIFJzcC4gKi8KKwkJLyogRm9yIGV4YW1wbGU6IFB1dCBWZW5kb3IgU3BlY2lmaWMgSUUgb24gdGhlIGZyb250IG9mIFdQQSBJRS4gKi8KKwkJLyogVGhpcyBoYXBwZW5zIG9uIEFQIChNb2RlbCBObzpMaW5rc3lzIFdSSzU0RykgKi8KKwkJLyogKi8KIAkJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JCQkpCi0gICAgICAgICAgICApCi0JCXsKLQkJCVVDSEFSIFJTTkllID0gSUVfV1BBOworCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSB8fAorCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8CisJCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCSAgICApCisJCSAgICApIHsKKwkJCXU4IFJTTkllID0gSUVfV1BBOwogCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKQotCQkJeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQorCQkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpKSB7CiAJCQkJUlNOSWUgPSBJRV9XUEEyOwogCQkJfQogCi0JCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IDEpCi0gICAgICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPQorCQkJICAgICBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJCQkgICAgJiYgKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0gRkFMU0UpKQorCQkJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwKKwkJCQkJICAgICAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKIAotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdAotCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JCQl7Ci0JCQkgICAgSU5UICAgICBpZHg7Ci0gICAgICAgICAgICAgICAgQk9PTEVBTiBGb3VuZFBNSyA9IEZBTFNFOwotCQkJCS8vIFNlYXJjaCBjaGNoZWQgUE1LSUQsIGFwcGVuZCBpdCBpZiBleGlzdGVkCi0JCQkJZm9yIChpZHggPSAwOyBpZHggPCBQTUtJRF9OTzsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KEFwQWRkciwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsIDYpKQotCQkJCQl7CisJCQkvKiBDaGVjayBmb3IgV1BBIFBNSyBjYWNoZSBsaXN0ICovCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgeworCQkJCWludCBpZHg7CisJCQkJQk9PTEVBTiBGb3VuZFBNSyA9IEZBTFNFOworCQkJCS8qIFNlYXJjaCBjaGNoZWQgUE1LSUQsIGFwcGVuZCBpdCBpZiBleGlzdGVkICovCisJCQkJZm9yIChpZHggPSAwOyBpZHggPCBQTUtJRF9OTzsgaWR4KyspIHsKKwkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeQorCQkJCQkgICAgKEFwQWRkciwKKwkJCQkJICAgICAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5CU1NJRCwKKwkJCQkJICAgICA2KSkgewogCQkJCQkJRm91bmRQTUsgPSBUUlVFOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KIAkJCQl9Ci0KLQkJCQlpZiAoRm91bmRQTUspCi0JCQkJewotCQkJCQkvLyBTZXQgUE1LIG51bWJlcgotCQkJCQkqKFBVU0hPUlQpICZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuXSA9IDE7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMl0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLlBNS0lELCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArPSAxODsKKwkJCQlpZiAoRm91bmRQTUspIHsKKwkJCQkJLyogU2V0IFBNSyBudW1iZXIgKi8KKwkJCQkJKih1MTYgKikmIHBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPgorCQkJCQkJCQkJU3RhQ2ZnLgorCQkJCQkJCQkJUlNOSUVfTGVuXQorCQkJCQkgICAgPSAxOworCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICAgUlNOX0lFW3BBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgIFJTTklFX0xlbiArIDJdLAorCQkJCQkJICAgICAgICZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHhdLlBNS0lELCAxNik7CisJCQkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiArPSAxODsKIAkJCQl9CiAJCQl9CiAKLQkJCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gMSkKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgIAkJJnRtcCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgIAlFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAJCSZ0bXAsCi0JCQkJICAgICAgICAgICAgICAJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgCUVORF9PRl9BUkdTKTsKKwkJCWlmICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09CisJCQkgICAgIFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKKwkJCSAgICAmJiAocEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9PQorCQkJCVRSVUUpKSB7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTl9JRSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfSBlbHNlIHsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJCQkgIDEsICZSU05JZSwKKwkJCQkJCSAgMSwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCQkJICBwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKIAkJCX0KIAogCQkJRnJhbWVMZW4gKz0gdG1wOwogCi0JCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IDEpCi0JCQl7Ci0JICAgICAgICAgICAgLy8gQXBwZW5kIFZhcmlhYmxlIElFCi0JICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOwotCSAgICAgICAgICAgIFZhckllc09mZnNldCArPSAxOwotCSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7Ci0JICAgICAgICAgICAgVmFySWVzT2Zmc2V0ICs9IDE7CisJCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPQorCQkJICAgICBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0KKwkJCQlGQUxTRSkpIHsKKwkJCQkvKiBBcHBlbmQgVmFyaWFibGUgSUUgKi8KKwkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKworCQkJCQkgICAgICAgVmFySWVzT2Zmc2V0LCAmUlNOSWUsIDEpOworCQkJCVZhckllc09mZnNldCArPSAxOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArCisJCQkJCSAgICAgICBWYXJJZXNPZmZzZXQsCisJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCAxKTsKKwkJCQlWYXJJZXNPZmZzZXQgKz0gMTsKIAkJCX0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LAorCQkJCSAgICAgICBwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CiAJCQlWYXJJZXNPZmZzZXQgKz0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOwogCi0JCQkvLyBTZXQgVmFyaWFibGUgSUVzIExlbmd0aAorCQkJLyogU2V0IFZhcmlhYmxlIElFcyBMZW5ndGggKi8KIAkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OwogCQl9CiAKLQkJLy8gV2UgaGF2ZSB1cGRhdGUgdGhhdCBhdCBQZWVyQmVhY29uQXRKb2luUmVxdWVzdCgpCi0JCUNraXBGbGFnID0gcEFkLT5TdGFDZmcuQ2tpcEZsYWc7Ci0JCWlmIChDa2lwRmxhZyAhPSAwKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShDa2lwTmVnb3RpYXRpb25CdWZmZXIsIENLSVBfTkVHT1RJQVRJT05fTEVOR1RIKTsKLQkJCUNraXBOZWdvdGlhdGlvbkJ1ZmZlclsyXSA9IDB4NjY7Ci0JCQkvLyBNYWtlIGl0IHRyeSBLUCAmIE1JQywgc2luY2Ugd2UgaGF2ZSB0byBmb2xsb3cgdGhlIHJlc3VsdCBmcm9tIEFzc29jUnNwCi0JCQlDa2lwTmVnb3RpYXRpb25CdWZmZXJbOF0gPSAweDE4OwotCQkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyW0NLSVBfTkVHT1RJQVRJT05fTEVOR1RIIC0gMV0gPSAweDIyOwotCQkJQ2tpcEZsYWcgPSAweDE4OwotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sIAkmdG1wLAotCQkJCQkJMSwJCQkJCQkgIAkJJkFpcm9uZXRDa2lwSWUsCi0JCQkJCQkxLAkJCQkJCSAgCQkmQWlyb25ldENraXBMZW4sCi0JCQkJCQlBaXJvbmV0Q2tpcExlbiwgCQkgIAkJQ2tpcE5lZ290aWF0aW9uQnVmZmVyLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQkJLy8gQWRkIENDWCB2MiByZXF1ZXN0IGlmIENDWDIgYWRtaW4gc3RhdGUgaXMgb24KLQkJaWYgKHBBZC0+U3RhQ2ZnLkNDWENvbnRyb2wuZmllbGQuRW5hYmxlID09IDEpCi0JCXsKLQotCQkJLy8KLQkJCS8vIEFkZCBBaXJvbmV0SVBBZGRyZXNzSUUgZm9yIENpc2NvIENDWCAyLlgKLQkJCS8vIEFkZCBDQ1ggVmVyc2lvbgotCQkJLy8KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKLQkJCQkJCTEsCQkJCQkJCSZBaXJvbmV0SVBBZGRyZXNzSUUsCi0JCQkJCQkxLAkJCQkJCQkmQWlyb25ldElQQWRkcmVzc0xlbiwKLQkJCQkJCUFpcm9uZXRJUEFkZHJlc3NMZW4sCQlBaXJvbmV0SVBBZGRyZXNzQnVmZmVyLAotCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKLQkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAotCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSB0bXA7Ci0KLQkJCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNwotCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKLQkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OwotCQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RJRUxlbmd0aCA9IFZhckllc09mZnNldDsKLQotCQkJLy8gT2Zmc2V0UmVzcG9uc2VJRXMgZm9sbG93IFJlcVZhcklFCi0JCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uT2Zmc2V0UmVzcG9uc2VJRXMgPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pICsgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47Ci0JCQkvLyBFbmQgQWRkIGJ5IEphbWVzCi0JCX0KLQotCiAJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCiAJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsIFRpbWVvdXQpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX1dBSVRfUlNQOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxlZC4gQlVHISEhISEhIFxuIikpOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBNbG1lQXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9CiAKIH0KQEAgLTU5NCwxODcgKzU4OSwxNjggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lUmVhc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIJCQlBcEFkZHJbNl07Ci0JSEVBREVSXzgwMl8xMQlSZWFzc29jSGRyOwotCVVDSEFSCQkJQ2N4MkxlbiA9IDU7Ci0JVUNIQVIJCQlXbWVJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCVVTSE9SVAkJCUNhcGFiaWxpdHlJbmZvLCBMaXN0ZW5JbnR2OwotCVVMT05HCQkJVGltZW91dDsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JTkRJU19TVEFUVVMJCU5TdGF0dXM7Ci0JVUxPTkcJCQl0bXA7Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVVNIT1JUCQkJU3RhdHVzOworCXU4IEFwQWRkcls2XTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBSZWFzc29jSGRyOworCXU4IFdtZUllWzldID0KKwkgICAgeyBJRV9WRU5ET1JfU1BFQ0lGSUMsIDB4MDcsIDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsCisgICAgICAgMHgwMCB9OworCXUxNiBDYXBhYmlsaXR5SW5mbywgTGlzdGVuSW50djsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdTE2IFN0YXR1czsKIAotCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAotCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBCbG9jayBSZUFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOworCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBCbG9jayBSZUFzc29jIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwogCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOwogCX0KLQkvLyB0aGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgdGhlIGFzc29jaWF0aW9uCi0JZWxzZSBpZihNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCi0JeworCS8qIHRoZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRpb24gKi8KKwllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkKKwkJIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBcEFkZHIsICZDYXBhYmlsaXR5SW5mbywKKwkJICAmVGltZW91dCwgJkxpc3RlbkludHYpKSB7CiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CisJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwkJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7CiAJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7CiAKLQkJLy8gbWFrZSBmcmFtZSwgdXNlIGJzc2lkIGFzIHRoZSBBUCBhZGRyZXNzPz8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZSZWFzc29jSGRyLAotCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmTGlzdGVuSW50diwKLQkJCQkJCSAgTUFDX0FERFJfTEVOLCAgICAgICAgICAgICBBcEFkZHIsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJLyogbWFrZSBmcmFtZSwgdXNlIGJzc2lkIGFzIHRoZSBBUCBhZGRyZXNzPz8gKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFNlbmQgUkUtQVNTT0MgcmVxdWVzdC4uLlxuIikpOworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJlJlYXNzb2NIZHIsIFNVQlRZUEVfUkVBU1NPQ19SRVEsIDAsCisJCQkJIEFwQWRkciwgQXBBZGRyKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLAorCQkJCSAgJlJlYXNzb2NIZHIsIDIsICZDYXBhYmlsaXR5SW5mbywgMiwKKwkJCQkgICZMaXN0ZW5JbnR2LCBNQUNfQUREUl9MRU4sIEFwQWRkciwgMSwgJlNzaWRJZSwKKwkJCQkgIDEsICZwQWQtPk1sbWVBdXguU3NpZExlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgMSwKKwkJCQkgICZTdXBSYXRlSWUsIDEsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkgIEVORF9PRl9BUkdTKTsKIAotCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJICAgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkgeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkgIDEsICZFeHRSYXRlSWUsCisJCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFTkRfT0ZfQVJHUyk7CiAJCQlGcmFtZUxlbiArPSB0bXA7CiAJCX0KIAotCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJCXsKLQkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKKwkJaWYgKHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJWYWxpZCkgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZQorCQkJICAgICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgeworCQkJCXN0cnVjdCBydF9xYnNzX3N0YV9pbmZvX3Bhcm0gUW9zSW5mbzsKIAotCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJlFvc0luZm8sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fic3Nfc3RhX2luZm9fcGFybSkpOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfQkUgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfQksgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfVkkgPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJOwogCQkJCVFvc0luZm8uVUFQU0RfQUNfVk8gPSBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPOwotCQkJCVFvc0luZm8uTWF4U1BMZW5ndGggPSBwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aDsKLQkJCQlXbWVJZVs4XSB8PSAqKFBVQ0hBUikmUW9zSW5mbzsKKwkJCQlRb3NJbmZvLk1heFNQTGVuZ3RoID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGg7CisJCQkJV21lSWVbOF0gfD0gKih1OCAqKSYgUW9zSW5mbzsKIAkJCX0KIAotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSB0bXA7Ci0JCX0KLQotCQkvLyBIVAotCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgSHRMZW47Ci0JCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OwotCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQotCQkJewotCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCX0KLQotCQkvLyBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTgotCQkvLyBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjawotCQkvLyAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJLy8gQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpCi0JCXsKLQkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpICYmICgocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfTsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLCAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFsaW5rSWUsCi0JCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVVMT05HIFRtcExlbjsKLQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyK0ZyYW1lTGVuLAkJICZUbXBMZW4sCi0JCQkJCQkJICA5LAkJCQkJCSBSYWxpbmtJZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJfQotCi0JCS8vIEFkZCBDQ1ggdjIgcmVxdWVzdCBpZiBDQ1gyIGFkbWluIHN0YXRlIGlzIG9uCi0JCWlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAxKQotCQl7Ci0JCQkvLwotCQkJLy8gQWRkIENDWCBWZXJzaW9uCi0JCQkvLwogCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAotCQkJCQkJMSwJCQkJCQkJJkNjeDJJZSwKLQkJCQkJCTEsCQkJCQkJCSZDY3gyTGVuLAotCQkJCQkJQ2N4MkxlbiwJCQkJICAgIENjeDJJZUluZm8sCi0JCQkJCQlFTkRfT0ZfQVJHUyk7CisJCQkJCSAgOSwgJldtZUllWzBdLCBFTkRfT0ZfQVJHUyk7CiAJCQlGcmFtZUxlbiArPSB0bXA7CiAJCX0KKwkJLyogSFQgKi8KKwkJaWYgKChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID4gMCkKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKSB7CisJCQl1bnNpZ25lZCBsb25nIFRtcExlbjsKKwkJCXU4IEh0TGVuOworCQkJdTggQlJPQURDT01bNF0gPSB7IDB4MCwgMHg5MCwgMHg0YywgMHgzMyB9OworCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKSB7CisJCQkJSHRMZW4gPSBTSVpFX0hUX0NBUF9JRSArIDQ7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCAxLCAmV3BhSWUsIDEsICZIdExlbiwKKwkJCQkJCSAgNCwgJkJST0FEQ09NWzBdLAorCQkJCQkJICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkJICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJfSBlbHNlIHsKKwkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkgICZUbXBMZW4sIDEsICZIdENhcEllLCAxLAorCQkJCQkJICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCSAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCX0KKwkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJfQorCQkvKiBhZGQgUmFsaW5rIHByb3ByaWV0YXJ5IElFIHRvIGluZm9ybSBBUCB0aGlzIFNUQSBpcyBnb2luZyB0byB1c2UgQUdHUkVHQVRJT04gb3IgUElHR1ktQkFDSytBR0dSRUdBVElPTiAqLworCQkvKiBDYXNlIEk6IChBZ2dyZWdhdGlvbiArIFBpZ2d5LUJhY2spICovCisJCS8qIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQgKi8KKwkJLyogMi4gTWFjIHN1cHBvcnQgcGlnZ3ktYmFjayAqLworCQkvKiAzLiBBUCBhbm5vdWNlcyBpdCdzIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04gKi8KKwkJLyogQ2FzZSBJSTogKEFnZ3JlZ2F0aW9uKSAqLworCQkvKiAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5EICovCisJCS8qIDIuIEFQIGFubm91Y2VzIGl0J3MgQUdHUkVHQVRJT04tY2FwYWJsZSBpbiBCRUFDT04gKi8KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpIHsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpCisJCQkgICAgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywKKwkJCSAgICAweDAzLCAweDAwLCAweDAwLCAweDAwIH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCA5LCBSYWxpbmtJZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXBMZW47CisJCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJCSAgICB7IElFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywKKwkJCSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwIH07CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAorCQkJCQkJICAmVG1wTGVuLCA5LCBSYWxpbmtJZSwKKwkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCUZyYW1lTGVuICs9IFRtcExlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJdTggUmFsaW5rSWVbOV0gPQorCQkJICAgIHsgSUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA0LAorCQkgICAgMHgwMCwgMHgwMCwgMHgwMCB9OworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVG1wTGVuLCA5LAorCQkJCQkgIFJhbGlua0llLCBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSBUbXBMZW47CisJCX0KIAogCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKIAotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsIFRpbWVvdXQpOyAvKiBpbiBtU2VjICovCisJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwgVGltZW91dCk7CS8qIGluIG1TZWMgKi8KIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBSRUFTU09DX1dBSVRfUlNQOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZVJlYXNzb2NSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkLiBCVUchISEhIFxuIikpOworCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyFcbiIpKTsKIAkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKIAl9CiB9CiAKQEAgLTc4OSw1MSArNzY1LDUwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVEaXNhc3NvY1JlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCBwRGlzYXNzb2NSZXE7Ci0JSEVBREVSXzgwMl8xMSAgICAgICAgIERpc2Fzc29jSGRyOwotCVBIRUFERVJfODAyXzExICAgICAgICBwRGlzYXNzb2NIZHI7Ci0JUFVDSEFSICAgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVMT05HICAgICAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JTkRJU19TVEFUVVMgICAgICAgICAgIE5TdGF0dXM7Ci0JQk9PTEVBTiAgICAgICAgICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVMT05HICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gMDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgU3RhdHVzOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSAqcERpc2Fzc29jUmVxOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIERpc2Fzc29jSGRyOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcERpc2Fzc29jSGRyOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwlpbnQgTlN0YXR1czsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCXVuc2lnbmVkIGxvbmcgVGltZW91dCA9IDUwMDsKKwl1MTYgU3RhdHVzOwogCi0JLy8gc2tpcCBzYW5pdHkgY2hlY2sKLQlwRGlzYXNzb2NSZXEgPSAoUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkoRWxlbS0+TXNnKTsKKwkvKiBza2lwIHNhbml0eSBjaGVjayAqLworCXBEaXNhc3NvY1JlcSA9IChzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgKikoRWxlbS0+TXNnKTsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gTWxtZURpc2Fzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIikpOworCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVNTT0MgLSBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkXG4iKSk7CiAJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOwogCQlyZXR1cm47CiAJfQogCi0KLQogCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFNlbmQgRElTQVNTT0MgcmVxdWVzdFtCU1NJRDo6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggKFJlYXNvbj0lZClcbiIsCi0JCQkJcERpc2Fzc29jUmVxLT5BZGRyWzBdLCBwRGlzYXNzb2NSZXEtPkFkZHJbMV0sIHBEaXNhc3NvY1JlcS0+QWRkclsyXSwKLQkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbM10sIHBEaXNhc3NvY1JlcS0+QWRkcls0XSwgcERpc2Fzc29jUmVxLT5BZGRyWzVdLCBwRGlzYXNzb2NSZXEtPlJlYXNvbikpOwotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBEaXNhc3NvY1JlcS0+QWRkciwgcERpc2Fzc29jUmVxLT5BZGRyKTsJLy8gcGF0Y2ggcGVhcCB0dGxzIHN3aXRjaGluZyBpc3N1ZQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEaXNhc3NvY0hkciwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgJnBEaXNhc3NvY1JlcS0+UmVhc29uLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBTZW5kIERJU0FTU09DIHJlcXVlc3RbQlNTSUQ6OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IChSZWFzb249JWQpXG4iLAorCQkgIHBEaXNhc3NvY1JlcS0+QWRkclswXSwgcERpc2Fzc29jUmVxLT5BZGRyWzFdLAorCQkgIHBEaXNhc3NvY1JlcS0+QWRkclsyXSwgcERpc2Fzc29jUmVxLT5BZGRyWzNdLAorCQkgIHBEaXNhc3NvY1JlcS0+QWRkcls0XSwgcERpc2Fzc29jUmVxLT5BZGRyWzVdLAorCQkgIHBEaXNhc3NvY1JlcS0+UmVhc29uKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcERpc2Fzc29jUmVxLT5BZGRyLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwkvKiBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlICovCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLCAmRGlzYXNzb2NIZHIsCisJCQkgIDIsICZwRGlzYXNzb2NSZXEtPlJlYXNvbiwgRU5EX09GX0FSR1MpOwogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCi0JLy8gVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAKLQkvLyBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lCi0JLy8gVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4KLQlwRGlzYXNzb2NIZHIgPSAoUEhFQURFUl84MDJfMTEpcE91dEJ1ZmZlcjsKKwkvKiBUbyBwYXRjaCBJbnN0YW5jZSBhbmQgQnVmZmFsbyhOKSBBUCAqLworCS8qIERyaXZlciBoYXMgdG8gc2VuZCBkZWF1dGggdG8gSW5zdGFuY2UgQVAsIGJ1dCBCdWZmYWxvKE4pIG5lZWRzIHRvIHNlbmQgZGlzYXNzb2MgdG8gcmVzZXQgQXV0aGVudGljYXRvcidzIHN0YXRlIG1hY2hpbmUgKi8KKwkvKiBUaGVyZWZvcmUsIHdlIHNlbmQgYm90aCBvZiB0aGVtLiAqLworCXBEaXNhc3NvY0hkciA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBwT3V0QnVmZmVyOwogCXBEaXNhc3NvY0hkci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfREVBVVRIOwogCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCkBAIC04NDIsMTQgKzgxNywxMSBAQAogCXBBZC0+U3RhQ2ZnLkRpc2Fzc29jUmVhc29uID0gUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOwogCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBEaXNhc3NvY1JlcS0+QWRkcik7CiAKLQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLworCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsIFRpbWVvdXQpOwkvKiBpbiBtU2VjICovCiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBESVNBU1NPQ19XQUlUX1JTUDsKIAotICAgIHsKLSAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLSAgICB9CisJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKKwogfQogCiAvKgpAQCAtODYzLDk0ICs4MzUsODEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlckFzc29jUnNwQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBTdGF0dXMsIEFpZDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIgICAgICAgICBDa2lwRmxhZzsKLQlFRENBX1BBUk0gICAgIEVkY2FQYXJtOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOworCXUxNiBDYXBhYmlsaXR5SW5mbywgU3RhdHVzLCBBaWQ7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIFN1cFJhdGVMZW47CisJdTggRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCXU4IENraXBGbGFnOworCXN0cnVjdCBydF9lZGNhX3Bhcm0gRWRjYVBhcm07CisJc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUgSHRDYXBhYmlsaXR5OworCXN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSBBZGRIdEluZm87CS8qIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRSAqLworCXU4IEh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwogCi0JaWYgKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCi0JCSZIdENhcGFiaWxpdHksJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCi0JewotCQkvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KLQkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQotCQkJewotI2lmZGVmIFJUMjg2MAotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKwlpZiAoUGVlckFzc29jUnNwU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLAorCSAgICAgJkFpZCwgU3VwUmF0ZSwgJlN1cFJhdGVMZW4sIEV4dFJhdGUsICZFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCSAgICAgJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwgJk5ld0V4dENoYW5uZWxPZmZzZXQsCisJICAgICAmRWRjYVBhcm0sICZDa2lwRmxhZykpIHsKKwkJLyogVGhlIGZyYW1lIGlzIGZvciBtZSA/ICovCisJCWlmIChNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUGVlckFzc29jUnNwQWN0aW9uKCk6QVNTT0MgLSByZWNlaXZlIEFTU09DX1JTUCB0byBtZSAoc3RhdHVzPSVkKVxuIiwKKwkJCQkgIFN0YXR1cykpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsCisJCQkJICBFbGVtLT5XY2lkLAorCQkJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsCisJCQkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCSAgQ2xpZW50U3RhdHVzRmxhZ3MpKTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsCisJCQkJCSZUaW1lckNhbmNlbGxlZCk7CiAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKwkJCWlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKSB7CisJCQkJdTggTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7CisJCQkJdTggaWR4OwogCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJCVVDSEFSCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IDA7Ci0JCQkJVUNIQVIJCQlpZHg7Ci0KLQkJCQkvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQotCQkJICAgIGZvciAoaWR4PTA7IGlkeDxTdXBSYXRlTGVuOyBpZHgrKykKLSAgICAgICAgICAgICAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cFJhdGVbaWR4XSAmIDB4N2Y7Ci0JCQkgICAgfQotCi0JCQkJZm9yIChpZHg9MDsgaWR4PEV4dFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoRXh0UmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gRXh0UmF0ZVtpZHhdICYgMHg3ZjsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJLy8gZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NgotCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKLQkJCQkJJkVkY2FQYXJtLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sICZBZGRIdEluZm8pOwotCi0JCQkJU3RhQWRkTWFjVGFibGVFbnRyeShwQWQsICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLCAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sIENhcGFiaWxpdHlJbmZvKTsKLSNlbmRpZgotCQkJCXBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gQ2tpcEZsYWc7Ci0JCQkJaWYgKENraXBGbGFnICYgMHgxOCkKLQkJCQl7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlR4U0VRLCA0KTsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUnhTRVEsIDQpOwotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5DS0lQTUlDLCA0KTsKLQkJCQkJcEFkLT5TdGFDZmcuR0lWWzBdID0gUmFuZG9tQnl0ZShwQWQpOwotCQkJCQlwQWQtPlN0YUNmZy5HSVZbMV0gPSBSYW5kb21CeXRlKHBBZCk7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkdJVlsyXSA9IFJhbmRvbUJ5dGUocEFkKTsKLQkJCQkJcEFkLT5TdGFDZmcuYkNraXBPbiA9IFRSVUU7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjxDQ1g+IHBBZC0+U3RhQ2ZnLkNraXBGbGFnID0gMHglMDJ4XG4iLCBwQWQtPlN0YUNmZy5Da2lwRmxhZykpOworCQkJCS8qIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlICovCisJCQkJZm9yIChpZHggPSAwOyBpZHggPCBTdXBSYXRlTGVuOyBpZHgrKykgeworCQkJCQlpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8CisJCQkJCSAgICAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCisJCQkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0KKwkJCQkJCSAgICBTdXBSYXRlW2lkeF0gJiAweDdmOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKKworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgRXh0UmF0ZUxlbjsgaWR4KyspIHsKKwkJCQkJaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPAorCQkJCQkgICAgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9CisJCQkJCQkgICAgRXh0UmF0ZVtpZHhdICYgMHg3ZjsKKwkJCQl9CisJCQkJLyogZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NiAqLworCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwKKwkJCQkJICAgICAgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwKKwkJCQkJICAgICAgRXh0UmF0ZUxlbiwgJkVkY2FQYXJtLAorCQkJCQkgICAgICAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sCisJCQkJCSAgICAgICZBZGRIdEluZm8pOworCisJCQkJU3RhQWRkTWFjVGFibGVFbnRyeShwQWQsCisJCQkJCQkgICAgJnBBZC0+TWFjVGFiLgorCQkJCQkJICAgIENvbnRlbnRbQlNTSURfV0NJRF0sCisJCQkJCQkgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKwkJCQkJCSAgICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJICAgIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbywKKwkJCQkJCSAgICBBZGRIdEluZm9MZW4sCisJCQkJCQkgICAgQ2FwYWJpbGl0eUluZm8pOwogCQkJfQogCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkgICAgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gUGVlckFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKIAl9CiB9CiAKQEAgLTk2NSw2MSArOTI0LDYyIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgUGVlclJlYXNzb2NSc3BBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVTSE9SVCAgICAgIFN0YXR1czsKLQlVU0hPUlQgICAgICBBaWQ7Ci0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIFN1cFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICBDa2lwRmxhZzsKLQlCT09MRUFOICAgICBUaW1lckNhbmNlbGxlZDsKLQlFRENBX1BBUk0gICBFZGNhUGFybTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwl1MTYgQ2FwYWJpbGl0eUluZm87CisJdTE2IFN0YXR1czsKKwl1MTYgQWlkOworCXU4IFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOworCXU4IEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlTGVuOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJdTggQ2tpcEZsYWc7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEVkY2FQYXJtOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSHRJbmZvOwkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwl1OCBIdENhcGFiaWxpdHlMZW47CisJdTggQWRkSHRJbmZvTGVuOworCXU4IE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwogCi0JaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQotCXsKLQkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPworCWlmIChQZWVyQXNzb2NSc3BTYW5pdHkKKwkgICAgKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsCisJICAgICAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sICZIdENhcGFiaWxpdHksCisJICAgICAmQWRkSHRJbmZvLCAmSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvTGVuLCAmTmV3RXh0Q2hhbm5lbE9mZnNldCwKKwkgICAgICZFZGNhUGFybSwgJkNraXBGbGFnKSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCS8qIFRoZSBmcmFtZSBpcyBmb3IgbWUgPyAqLwogCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQVNTT0MgLSByZWNlaXZlIFJFQVNTT0NfUlNQIHRvIG1lIChzdGF0dXM9JWQpXG4iLAorCQkJCSAgU3RhdHVzKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5SZWFzc29jVGltZXIsCisJCQkJCSZUaW1lckNhbmNlbGxlZCk7CiAKLQkJCWlmKFN0YXR1cyA9PSBNTE1FX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJLy8gZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NgotCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwKLQkJCQkJICZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKKwkJCWlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKSB7CisJCQkJLyogZ28gdG8gcHJvY2VkdXJlIGxpc3RlZCBvbiBwYWdlIDM3NiAqLworCQkJCUFzc29jUG9zdFByb2MocEFkLCBBZGRyMiwgQ2FwYWJpbGl0eUluZm8sIEFpZCwKKwkJCQkJICAgICAgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwKKwkJCQkJICAgICAgRXh0UmF0ZUxlbiwgJkVkY2FQYXJtLAorCQkJCQkgICAgICAmSHRDYXBhYmlsaXR5LCBIdENhcGFiaWxpdHlMZW4sCisJCQkJCSAgICAgICZBZGRIdEluZm8pOwogCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgfQorCQkJCXsKKwkJCQkJd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKKwkJCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsCisJCQkJCQkJCS0xLAorCQkJCQkJCQkmcEFkLT5NbG1lQXV4LgorCQkJCQkJCQlCc3NpZFswXSwgTlVMTCwKKwkJCQkJCQkJMCk7CisJCQkJfQogCiAJCQl9Ci0KLQkJCXsKLQkJCQkvLyBDa2lwRmxhZyBpcyBubyB1c2UgZm9yIHJlYXNzb2NpYXRlCi0JCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCQkJfQorCQkJLyogQ2tpcEZsYWcgaXMgbm8gdXNlIGZvciByZWFzc29jaWF0ZSAqLworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkgICAgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CiAJCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyUmVhc3NvY1JzcEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKIAl9CiAKIH0KQEAgLTEwMzQsMzAgKzk5NCwxOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBc3NvY1Bvc3RQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQWRkcjIsCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVTSE9SVCBBaWQsCi0JSU4gVUNIQVIgU3VwUmF0ZVtdLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gVUNIQVIgRXh0UmF0ZVtdLAotCUlOIFVDSEFSIEV4dFJhdGVMZW4sCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0JSU4gVUNIQVIgSHRDYXBhYmlsaXR5TGVuLAotCUlOIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCit2b2lkIEFzc29jUG9zdFByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCAqcEFkZHIyLCB1MTYgQ2FwYWJpbGl0eUluZm8sIHUxNiBBaWQsIHU4IFN1cFJhdGVbXSwgdTggU3VwUmF0ZUxlbiwgdTggRXh0UmF0ZVtdLCB1OCBFeHRSYXRlTGVuLCBzdHJ1Y3QgcnRfZWRjYV9wYXJtICpwRWRjYVBhcm0sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgdTggSHRDYXBhYmlsaXR5TGVuLCBzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgKiBwQWRkSHRJbmZvKQkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KIHsKLQlVTE9ORyBJZHg7CisJdW5zaWduZWQgbG9uZyBJZHg7CiAKIAlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJTU19JTkZSQTsKIAlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkZHIyKTsKIAlwQWQtPk1sbWVBdXguQWlkID0gQWlkOwotCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKKwlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gPQorCSAgICBDYXBhYmlsaXR5SW5mbyAmIFNVUFBPUlRFRF9DQVBBQklMSVRZX0lORk87CiAKLQkvLyBTb21lIEhUIEFQIG1pZ2h0IGxvc3QgV01NIElFLiBXZSBhZGQgV01NIG91cnNlbHZlcy4gYmVhY3Vhc2UgSFQgcmVxdWlyZXMgUW9TIG9uLgotCWlmICgoSHRDYXBhYmlsaXR5TGVuID4gMCkgJiYgKHBFZGNhUGFybS0+YlZhbGlkID09IEZBTFNFKSkKLQl7CisJLyogU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlYWN1YXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4gKi8KKwlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpIHsKIAkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOwogCQlwRWRjYVBhcm0tPkFpZnNuWzBdID0gMzsKIAkJcEVkY2FQYXJtLT5BaWZzblsxXSA9IDc7CkBAIC0xMDc0LDg4ICsxMDIyLDExMyBAQAogCQlwRWRjYVBhcm0tPkN3bWF4WzJdID0gNDsKIAkJcEVkY2FQYXJtLT5Dd21heFszXSA9IDM7CiAKLQkJcEVkY2FQYXJtLT5UeG9wWzBdICA9IDA7Ci0JCXBFZGNhUGFybS0+VHhvcFsxXSAgPSAwOwotCQlwRWRjYVBhcm0tPlR4b3BbMl0gID0gOTY7Ci0JCXBFZGNhUGFybS0+VHhvcFszXSAgPSA0ODsKKwkJcEVkY2FQYXJtLT5UeG9wWzBdID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzFdID0gMDsKKwkJcEVkY2FQYXJtLT5UeG9wWzJdID0gOTY7CisJCXBFZGNhUGFybS0+VHhvcFszXSA9IDQ4OwogCiAJfQogCi0JTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKHN0cnVjdCBydF9lZGNhX3Bhcm0pKTsKIAotCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzCisJLyogZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgcmF0ZXMgKi8KIAlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CiAJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwogCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LlN1cFJhdGUsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7CiAKLQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcworCS8qIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzICovCiAJcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwogCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKIAlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwogCi0JaWYgKEh0Q2FwYWJpbGl0eUxlbiA+IDApCi0JeworCWlmIChIdENhcGFiaWxpdHlMZW4gPiAwKSB7CiAJCVJUTVBDaGVja0h0KHBBZCwgQlNTSURfV0NJRCwgcEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyk7CiAJfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+ICBBUC5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFzc29jUG9zdFByb2M9PT0+ICBBUC5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsCisJCSAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gICAgKE1tcHM9JWQsIEFtc2R1U2l6ZT0lZCwgKVxuIiwKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQXNzb2NQb3N0UHJvYz09PT4gICAgKE1tcHM9JWQsIEFtc2R1U2l6ZT0lZCwgKVxuIiwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1tcHNNb2RlLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQU1zZHVTaXplKSk7CiAKLQkvLyBTZXQgTmV3IFdQQSBpbmZvcm1hdGlvbgorCS8qIFNldCBOZXcgV1BBIGluZm9ybWF0aW9uICovCiAJSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkZHIyLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0JaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCXsKKwlpZiAoSWR4ID09IEJTU19OT1RfRk9VTkQpIHsKIAkJREJHUFJJTlRfRVJSKCgiQVNTT0MgLSBDYW4ndCBmaW5kIEJTUyBhZnRlciByZWNlaXZpbmcgQXNzb2MgcmVzcG9uc2VcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gSW5pdCB2YXJpYWJsZQorCX0gZWxzZSB7CisJCS8qIEluaXQgdmFyaWFibGUgKi8KIAkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAwOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7CisJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLAorCQkJICAgICAgIE1BWF9MRU5fT0ZfUlNOSUUpOwogCi0JCS8vIFN0b3JlIGFwcHJvcHJpYXRlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIGxhdGVyCi0JCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSAmJiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW4gIT0gMCkpCi0JCXsKLQkJCVBVQ0hBUiAgICAgICAgICAgICAgcFZJRTsKLQkJCVVTSE9SVCAgICAgICAgICAgICAgbGVuOwotCQkJUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOworCQkvKiBTdG9yZSBhcHByb3ByaWF0ZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBsYXRlciAqLworCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJICAgICYmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbiAhPSAwKSkgeworCQkJdTggKnBWSUU7CisJCQl1MTYgbGVuOworCQkJc3RydWN0IHJ0X2VpZCAqIHBFaWQ7CiAKIAkJCXBWSUUgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRXM7Ci0JCQlsZW4JID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVmFySUVMZW47CisJCQlsZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbjsKKwkJCS8qS0ggbmVlZCB0byBjaGVjayBhZ2FpbiAqLworCQkJLyogRG9uJ3QgYWxsb3cgdG8gZ28gdG8gc2xlZXAgbW9kZSBpZiBhdXRobW9kZSBpcyBXUEEtcmVsYXRlZC4gKi8KKwkJCS8qVGhpcyBjYW4gbWFrZSBBdXRoZW50aWNhdGlvbiBwcm9jZXNzIG1vcmUgc21vb3RobHkuICovCisJCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7CiAKLQkJCXdoaWxlIChsZW4gPiAwKQotCQkJewotCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7Ci0JCQkJLy8gRm9yIFdQQS9XUEFQU0sKLQkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQotCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKLQkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOworCQkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCQlwRWlkID0gKHN0cnVjdCBydF9laWQgKikgcFZJRTsKKwkJCQkvKiBGb3IgV1BBL1dQQVBTSyAqLworCQkJCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkKKwkJCQkgICAgJiYKKwkJCQkgICAgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCisJCQkJICAgICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEEKKwkJCQkJfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkgeworCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgICBDb250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkJICAgICAgIFJTTl9JRSwgcFZJRSwKKwkJCQkJCSAgICAgICAocEVpZC0+TGVuICsgMikpOworCQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLgorCQkJCQkgICAgUlNOSUVfTGVuID0gKHBFaWQtPkxlbiArIDIpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOwogCQkJCX0KLQkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCi0JCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKLQkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKKwkJCQkvKiBGb3IgV1BBMi9XUEEyUFNLICovCisJCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pCisJCQkJCSAmJgorCQkJCQkgKE5kaXNFcXVhbE1lbW9yeQorCQkJCQkgIChwRWlkLT5PY3RldCArIDIsIFJTTl9PVUksIDMpKQorCQkJCQkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMgorCQkJCQkgICAgIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJCSAgICAgICBSU05fSUUsIHBWSUUsCisJCQkJCQkgICAgICAgKHBFaWQtPkxlbiArIDIpKTsKKwkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgIFJTTklFX0xlbiA9IChwRWlkLT5MZW4gKyAyKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJBc3NvY1Bvc3RQcm9jPT09PiBTdG9yZSBSU05fSUUgZm9yIFdQQTIgU00gbmVnb3RpYXRpb24gXG4iKSk7CiAJCQkJfQogCiAJCQkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJbGVuICAtPSAocEVpZC0+TGVuICsgMik7CisJCQkJbGVuIC09IChwRWlkLT5MZW4gKyAyKTsKIAkJCX0KKwogCQl9CiAKLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IDApCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IG5vIFJTTl9JRSBcbiIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWhleF9kdW1wKCJSU05fSUUiLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pOworCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gMCkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQXNzb2NQb3N0UHJvYz09PT4gbm8gUlNOX0lFIFxuIikpOworCQl9IGVsc2UgeworCQkJaGV4X2R1bXAoIlJTTl9JRSIsCisJCQkJIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLAorCQkJCSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7CiAJCX0KIAl9CiB9CkBAIC0xMTcxLDQzICsxMTQ0LDM2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJEaXNhc3NvY0FjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgICAgUmVhc29uOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJdTE2IFJlYXNvbjsKIAogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKClcbiIpKTsKLQlpZihQZWVyRGlzYXNzb2NTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZSZWFzb24pKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyRGlzYXNzb2NBY3Rpb24oKSBSZWFzb24gPSAlZFxuIiwgUmVhc29uKSk7Ci0JCWlmIChJTkZSQV9PTihwQWQpICYmIE1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBBZGRyMikpCi0JCXsKKwlpZiAoUGVlckRpc2Fzc29jU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmUmVhc29uKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgUmVhc29uID0gJWRcbiIsCisJCQkgIFJlYXNvbikpOworCQlpZiAoSU5GUkFfT04ocEFkKQorCQkgICAgJiYgTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIEFkZHIyKSkgewogCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQl7Ci0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsCisJCQkJCQkgICAgICBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLAorCQkJCQkJICAgICAgcEFkLT5NYWNUYWIuCisJCQkJCQkgICAgICBDb250ZW50W0JTU0lEX1dDSURdLkFkZHIsCisJCQkJCQkgICAgICBCU1MwLCAwKTsKIAkJCX0KIAotCQkJLy8KLQkJCS8vIEdldCBDdXJyZW50IFN5c3RlbSB0aW1lIGFuZCBUdXJuIG9uIEFkamFjZW50QVBSZXBvcnQKLQkJCS8vCi0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQTGlua0Rvd25UaW1lKTsKLQkJCXBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBSZXBvcnRGbGFnID0gVFJVRTsKIAkJCUxpbmtEb3duKHBBZCwgVFJVRSk7CiAJCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKLSAgICAgICAgICAgIH0KKwkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwKKwkJCQkJCTApOwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKIAl9CiAKIH0KQEAgLTEyMjMsMTEgKzExODksOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBBc3NvY1RpbWVvdXRBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgU3RhdHVzOworCXUxNiBTdGF0dXM7CiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBBc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKIAlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKQEAgLTEyNDMsMTEgKzEyMDcsOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBSZWFzc29jVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFJlYXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgIFN0YXR1czsKKwl1MTYgU3RhdHVzOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUmVhc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKIAlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKQEAgLTEyNjMsNTEgKzEyMjUsNDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgIFN0YXR1czsKKwl1MTYgU3RhdHVzOwogCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gRGlzYXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsCisJCSAgICAmU3RhdHVzKTsKIH0KIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuQXNzb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlbkFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCi0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJdTE2IFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuQXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKKwkJICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwogCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKIAlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwogCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIH0KIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gSW52YWxpZFN0YXRlV2hlblJlYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCisJCSAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKIAlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKIH0KIAotVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2Moc3RhdGU9JWxkKSwgcmVzZXQgQVNTT0Mgc3RhdGUgbWFjaGluZVxuIiwKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUpKTsKKwl1MTYgU3RhdHVzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7CiAJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLAorCQkgICAgJlN0YXR1cyk7CiB9CiAKIC8qCkBAIC0xMzIzLDMzICsxMjgzLDMxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIENsczNlcnJBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkcikKK3ZvaWQgQ2xzM2VyckFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4ICpwQWRkcikKIHsKLQlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7Ci0JUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKLQlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKLQlVU0hPUlQgICAgICAgICAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzNFUlI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgRGlzYXNzb2NIZHI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwRGlzYXNzb2NIZHI7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCWludCBOU3RhdHVzOworCXUxNiBSZWFzb24gPSBSRUFTT05fQ0xTM0VSUjsKIAotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLwogCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJCXJldHVybjsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ2xhc3MgMyBFcnJvciwgU2VuZCBESVNBU1NPQyBmcmFtZVxuIikpOwotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBBZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0JCQkJCSAgRU5EX09GX0FSR1MpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJBU1NPQyAtIENsYXNzIDMgRXJyb3IsIFNlbmQgRElTQVNTT0MgZnJhbWVcbiIpKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRpc2Fzc29jSGRyLCBTVUJUWVBFX0RJU0FTU09DLCAwLCBwQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwkvKiBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlICovCisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLCAmRGlzYXNzb2NIZHIsCisJCQkgIDIsICZSZWFzb24sIEVORF9PRl9BUkdTKTsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAotCS8vIFRvIHBhdGNoIEluc3RhbmNlIGFuZCBCdWZmYWxvKE4pIEFQCi0JLy8gRHJpdmVyIGhhcyB0byBzZW5kIGRlYXV0aCB0byBJbnN0YW5jZSBBUCwgYnV0IEJ1ZmZhbG8oTikgbmVlZHMgdG8gc2VuZCBkaXNhc3NvYyB0byByZXNldCBBdXRoZW50aWNhdG9yJ3Mgc3RhdGUgbWFjaGluZQotCS8vIFRoZXJlZm9yZSwgd2Ugc2VuZCBib3RoIG9mIHRoZW0uCi0JcERpc2Fzc29jSGRyID0gKFBIRUFERVJfODAyXzExKXBPdXRCdWZmZXI7CisJLyogVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAgKi8KKwkvKiBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lICovCisJLyogVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4gKi8KKwlwRGlzYXNzb2NIZHIgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcE91dEJ1ZmZlcjsKIAlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKIAlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIApAQCAtMTM1OSwzNTIgKzEzMTcsMjcxIEBACiAJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EaXNhc3NvY1N0YSwgcEFkZHIpOwogfQogCi0gLyoKLQkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkgRGVzY3JpcHRpb246Ci0JCSBTd2l0Y2ggYmV0d2VlbiBXRVAgYW5kIENLSVAgdXBvbiBuZXcgYXNzb2NpYXRpb24gdXAuCi0JIFBhcmFtZXRlcnM6Ci0KLQkgSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgKi8KLVZPSUQgU3dpdGNoQmV0d2VlbldlcEFuZENraXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCitpbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWludCAgICAgICAgICAgIGk7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgIGNzcjE7CisJY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7IDAgfTsKIAotCS8vIGlmIEtQIGlzIHJlcXVpcmVkLiBjaGFuZ2UgdGhlIENpcGhlckFsZyBpbiBoYXJkd2FyZSBzaGFyZCBrZXkgdGFibGUgZnJvbSBXRVAKLQkvLyB0byBDS0lQLiBlbHNlIHJlbWFpbiBhcyBXRVAKLQlpZiAocEFkLT5TdGFDZmcuYkNraXBPbiAmJiAocEFkLT5TdGFDZmcuQ2tpcEZsYWcgJiAweDEwKSkKLQl7Ci0JCS8vIG1vZGlmeSBoYXJkd2FyZSBrZXkgdGFibGUgc28gdGhhdCBNQUMgdXNlIGNvcnJlY3QgYWxnb3JpdGhtIHRvIGRlY3J5cHQgUlgKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSwgJmNzcjEud29yZCk7Ci0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7Ci0KLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKLQotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9PSBDSVBIRVJfV0VQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IENJUEhFUl9DS0lQMTI4OwotCi0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkzQ2lwaGVyQWxnID0gQ0lQSEVSX0NLSVAxMjg7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFLCBjc3IxLndvcmQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hCZXR3ZWVuV2VwQW5kQ2tpcDogbW9kaWZ5IEJTUzAgY2lwaGVyIHRvICVzXG4iLCBDaXBoZXJOYW1lW2NzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGddKSk7Ci0KLQkJLy8gbW9kaWZ5IHNvZnR3YXJlIGtleSB0YWJsZSBzbyB0aGF0IGRyaXZlciBjYW4gc3BlY2lmeSBjb3JyZWN0IGFsZ29yaXRobSBpbiBUWEQgdXBvbiBUWAotCQlmb3IgKGk9MDsgaTxTSEFSRV9LRVlfTlVNOyBpKyspCi0JCXsKLQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9DS0lQNjQ7Ci0JCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkKLQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfQ0tJUDEyODsKLQkJfQotCX0KLQotCS8vIGVsc2UgaWYgS1AgTk9UIGludXNlZC4gY2hhbmdlIHRoZSBDaXBoZXJBbGcgaW4gaGFyZHdhcmUgc2hhcmQga2V5IHRhYmxlIGZyb20gQ0tJUAotCS8vIHRvIFdFUC4KLQllbHNlCi0JewotCQkvLyBtb2RpZnkgaGFyZHdhcmUga2V5IHRhYmxlIHNvIHRoYXQgTUFDIHVzZSBjb3JyZWN0IGFsZ29yaXRobSB0byBkZWNyeXB0IFJYCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsICZjc3IxLndvcmQpOwotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JCWlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQllbHNlIGlmIChjc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MUNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLQkJaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVA2NCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCWVsc2UgaWYgKGNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPT0gQ0lQSEVSX0NLSVAxMjgpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLQotCQlpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDY0KQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJZWxzZSBpZiAoY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9PSBDSVBIRVJfQ0tJUDEyOCkKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JCS8vIG1vZGlmeSBzb2Z0d2FyZSBrZXkgdGFibGUgc28gdGhhdCBkcml2ZXIgY2FuIHNwZWNpZnkgY29ycmVjdCBhbGdvcml0aG0gaW4gVFhEIHVwb24gVFgKLQkJZm9yIChpPTA7IGk8U0hBUkVfS0VZX05VTTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQNjQpCi0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQkJZWxzZSBpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID09IENJUEhFUl9DS0lQMTI4KQotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0JCX0KLQotCQkvLwotCQkvLyBPbiBXUEEtTk9ORSwgbXVzdCB1cGRhdGUgQ2lwaGVyQWxnLgotCQkvLyBCZWNhdXNlIHRoZSBPSURfODAyXzExX1dFUF9TVEFUVVMgd2FzIGJlZW4gc2V0IGFmdGVyIE9JRF84MDJfMTFfQUREX0tFWQotCQkvLyBhbmQgQ2lwaGVyQWxnIHdpbGwgYmUgQ0lQSEVSX05PTkUgYnkgV2luZG93cyBaZXJvQ29uZmlnLgotCQkvLyBTbyB3ZSBuZWVkIHRvIHVwZGF0ZSBDaXBoZXJBbGcgYWZ0ZXIgY29ubmVjdC4KLQkJLy8KLQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCXsKLQkJCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiAhPSAwKQotCQkJCXsKLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJCQl7Ci0JCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCQkJewotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGc7Ci0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMV0uQ2lwaGVyQWxnOwotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZzsKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGc7Ci0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UsIGNzcjEud29yZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaEJldHdlZW5XZXBBbmRDa2lwOiBtb2RpZnkgQlNTMCBjaXBoZXIgdG8gJXNcbiIsIENpcGhlck5hbWVbY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZ10pKTsKLQl9Ci19Ci0KLWludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKLQlJTiAgUlRNUF9BREFQVEVSICpwQWQpCi17Ci0gICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OwotCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuIDw9IElXX0NVU1RPTV9NQVgpCi0gICAgewotICAgICAgICB3cnF1LmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUmVxVmFySUVMZW47Ci0gICAgICAgIG1lbWNweShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOwotICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkFTU09DUkVRSUUsICZ3cnF1LCBjdXN0b20pOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKKwlpZiAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPD0gSVdfQ1VTVE9NX01BWCkgeworCQlOZGlzTW92ZU1lbW9yeShjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywKKwkJCSAgICAgICBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7CisJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkFTU09DUkVRSUUsIC0xLCBOVUxMLCBjdXN0b20sCisJCQkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKTsKKwl9IGVsc2UKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA+IE1BWF9DVVNUT01fTEVOXG4iKSk7CiAKIAlyZXR1cm4gMDsKIAogfQogCi0jaWZkZWYgUlQyODcwCi1CT09MRUFOIFN0YUFkZE1hY1RhYmxlRW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4gIFVDSEFSCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCi0JSU4gIEhUX0NBUEFCSUxJVFlfSUUJKnBIdENhcGFiaWxpdHksCi0JSU4gIFVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiAgVVNIT1JUICAgICAgICAJCUNhcGFiaWxpdHlJbmZvKQorQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnksCisJCQkgICAgdTggTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKKwkJCSAgICBzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSAqIHBIdENhcGFiaWxpdHksCisJCQkgICAgdTggSHRDYXBhYmlsaXR5TGVuLAorCQkJICAgIHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSAqIHBBZGRIdEluZm8sCisJCQkgICAgdTggQWRkSHRJbmZvTGVuLCB1MTYgQ2FwYWJpbGl0eUluZm8pCiB7Ci0JVUNIQVIgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKwl1OCBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKIAogCWlmIChBREhPQ19PTihwQWQpKQogCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CiAKLQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCi0gICAgewotICAgICAgICBjYXNlIDEwODogTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNTQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKLSAgICAgICAgY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjQ7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfOTsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0gICAgfQorCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykgeworCWNhc2UgMTA4OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsKKwkJYnJlYWs7CisJY2FzZSA5NjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7CisJCWJyZWFrOworCWNhc2UgNzI6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OworCQlicmVhazsKKwljYXNlIDQ4OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsKKwkJYnJlYWs7CisJY2FzZSAzNjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOworCQlicmVhazsKKwljYXNlIDE4OgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OworCQlicmVhazsKKwljYXNlIDEyOgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OworCQlicmVhazsKKwljYXNlIDIyOgorCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNV81OworCQlicmVhazsKKwljYXNlIDQ6CisJCU1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7CisJCWJyZWFrOworCX0KIAotICAgIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKQorCSAgICAmJiAoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSkKKwkJcmV0dXJuIEZBTFNFOwogCi0JLy8gMTFuIG9ubHkKLQlpZiAoKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpJiYgKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKKwkvKiAxMW4gb25seSAqLworCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl8yXzRHKQorCSAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpCisJICAgICYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCiAJCXJldHVybiBGQUxTRTsKIAogCWlmICghcEVudHJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7CisJCXJldHVybiBGQUxTRTsKIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JaWYgKHBFbnRyeSkKLQl7CisJaWYgKHBFbnRyeSkgewogCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CiAJCWlmICgoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB8fAotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikpCi0JCXsKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpKSB7CiAJCQlwRW50cnktPlJhdGVMZW4gPSA0OwogCQkJaWYgKE1heFN1cHBvcnRlZFJhdGUgPj0gUkFURV9GSVJTVF9PRkRNX1JBVEUpCiAJCQkJTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXBFbnRyeS0+UmF0ZUxlbiA9IDEyOwogCiAJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQgPSAwOwogCQlwRW50cnktPk1pbkhUUGh5TW9kZS53b3JkID0gMDsKIAkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IDA7CiAJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IE1heFN1cHBvcnRlZFJhdGU7Ci0JCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJeworCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpIHsKIAkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwogCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7CiAJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7CiAJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKKwkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCQkgICAgT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKIAkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOworCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CisJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPQorCQkJICAgIE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07CiAJCX0KIAkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvOwotCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKLQkJQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOworCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LAorCQkJCQkgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksCisJCQkJCSBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSk7CiAJfQogCi0JLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCi0JaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JewotCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKLQkJQ0hBUiAgICBpOworCU5kaXNaZXJvTWVtb3J5KCZwRW50cnktPkhUQ2FwYWJpbGl0eSwgc2l6ZW9mKHBFbnRyeS0+SFRDYXBhYmlsaXR5KSk7CisJLyogSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuICovCisJaWYgKChIdENhcGFiaWxpdHlMZW4gIT0gMCkKKwkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpIHsKKwkJdTggaiwgYml0bWFzazsJLyprLGJpdG1hc2s7ICovCisJCWNoYXIgaTsKIAogCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7Ci0JCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKLQkJeworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSk7CisJCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGKQorCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpIHsKIAkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwogCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7CiAJCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwogCQl9CiAKLQkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCWlmICgocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkgJiYKKwkJICAgIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSAmJgorCQkgICAgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKKwkJICAgICB8fCAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJICYmIChwQWRkSHRJbmZvLT5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PQorCQkJICAgICBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLgorCQkJICAgICBFeHRDaGFuT2Zmc2V0KSkpKSB7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzQwOworCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9CisJCQkgICAgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuCisJCQkgICAgICBTaG9ydEdJZm9yNDApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby4KKwkJCQkJICAgICAgIFNob3J0R0lmb3I0MCkpOworCQl9IGVsc2UgewogCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7CisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0KKwkJCSAgICAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS4KKwkJCSAgICAgIFNob3J0R0lmb3IyMCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLgorCQkJCQkgICAgICAgU2hvcnRHSWZvcjIwKSk7CiAJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7CiAJCX0KIAotCQkvLyAzKjMKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCi0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5UeEJGID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7CisJCS8qIDMqMyAqLworCQlpZiAocEFkLT5NQUNWZXJzaW9uID49IFJBTElOS18yODgzX1ZFUlNJT04KKwkJICAgICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCisJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5UeEJGID0KKwkJCSAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKIAotCQkvLyBmaW5kIG1heCBmaXhlZCByYXRlCi0JCWZvciAoaT0yMzsgaT49MDsgaS0tKSAvLyAzKjMKKwkJLyogZmluZCBtYXggZml4ZWQgcmF0ZSAqLworCQlmb3IgKGkgPSAyMzsgaSA+PSAwOyBpLS0pCS8qIDMqMyAqLwogCQl7Ci0JCQlqID0gaS84OwotCQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOwotCQkJaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFtqXSAmIGJpdG1hc2spICYmIChwSHRDYXBhYmlsaXR5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKLQkJCXsKKwkJCWogPSBpIC8gODsKKwkJCWJpdG1hc2sgPSAoMSA8PCAoaSAtIChqICogOCkpKTsKKwkJCWlmICgocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0gJiBiaXRtYXNrKQorCQkJICAgICYmIChwSHRDYXBhYmlsaXR5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkgewogCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoaT09MCkKKwkJCWlmIChpID09IDApCiAJCQkJYnJlYWs7CiAJCX0KIAotCi0JCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKQotCQkJewotCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCisJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgeworCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID09IDMyKSB7CisJCQkJLyogRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUgKi8KIAkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7CiAJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7CiAJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7CiAJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7CiAJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7Ci0JCQl9Ci0JCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJewotCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKLQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOworCQkJfSBlbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPgorCQkJCSAgIHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpIHsKKwkJCQkvKiBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTICovCisJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0KKwkJCQkgICAgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKIAkJCX0KIAkJfQogCi0JCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7CisJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPQorCQkgICAgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby4KKwkJICAgICBSeFNUQkMgJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQykpOwogCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1wZHVEZW5zaXR5OwotCQlwRW50cnktPk1heFJBbXBkdUZhY3RvciA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7Ci0JCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLk1pbW9QczsKLQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZTsKKwkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPQorCQkgICAgcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKKwkJcEVudHJ5LT5NbXBzTW9kZSA9ICh1OClwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzOworCQlwRW50cnktPkFNc2R1U2l6ZSA9ICh1OClwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQU1zZHVTaXplOwogCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKIAotCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlICYmIChwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IEZBTFNFKSkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOworCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBGQUxTRSkpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKIAkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yNDApCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1NHSTQwX0NBUEFCTEUpOwogCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRSk7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKIAkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5SeFNUQkMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7CiAJCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKKwkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOworCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZworCQkgICAgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKIAkJaWYgKHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOwotCX0KLQllbHNlCi0JeworCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKKwkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LAorCQkJICAgICAgIEh0Q2FwYWJpbGl0eUxlbik7CisJfSBlbHNlIHsKIAkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Jc0xlZ2FjeSA9IFRSVUU7CiAJfQogCi0JTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCBwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCiAJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7CiAJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwogCi0JLy8gU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sKLQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQl7Ci0JCVBVQ0hBUgkJCQkJcFRhYmxlOwotCQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwkvKiBTZXQgYXNpYyBhdXRvIGZhbGwgYmFjayAqLworCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKSB7CisJCXU4ICpwVGFibGU7CisJCXU4IFRhYmxlU2l6ZSA9IDA7CiAKLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOworCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsCisJCQkJICAgICAgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKIAkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKKwl9IGVsc2UgeworCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7CisJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7CiAJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKIAotCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KLQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwkJLyogSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuICovCisJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKHU4KXBBZC0+U3RhQ2ZnLgorCQkJCQkgIERlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuCisJCQkJCSAgRml4ZWRUeE1vZGUsIHBFbnRyeSk7CiAJfQogCiAJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwpAQCAtMTcxNSwxNSArMTU5MiwxNCBAQAogCiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKIAotICAgIHsKLSAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgICAgICB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOworCXsKKwkJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCQl3ZXh0X25vdGlmeV9ldmVudF9hc3NvYyhwQWQpOwogCi0gICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocEFkLT5uZXRfZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOworCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwogCi0gICAgfQorCX0KIAlyZXR1cm4gVFJVRTsKIH0KLSNlbmRpZiAvKiBSVDI4NzAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGguYwppbmRleCBkODQxNGVhLi40MDRiZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aC5jCkBAIC01NSwyNyArNTUsMzUgQEAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCiAKLXZvaWQgQXV0aFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQordm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgIHN0cnVjdCBydF9zdGF0ZV9tYWNoaW5lICpTbSwgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9TVEFURSwgTUFYX0FVVEhfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIEFVVEhfUkVRX0lETEUsIEFVVEhfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfU1RBVEUsIE1BWF9BVVRIX01TRywKKwkJCSAoU1RBVEVfTUFDSElORV9GVU5DKSBEcm9wLCBBVVRIX1JFUV9JRExFLAorCQkJIEFVVEhfTUFDSElORV9CQVNFKTsKIAotICAgIC8vIHRoZSBmaXJzdCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUkVRX0lETEUsIE1UMl9NTE1FX0FVVEhfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVBdXRoUmVxQWN0aW9uKTsKKwkvKiB0aGUgZmlyc3QgY29sdW1uICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JFUV9JRExFLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVBdXRoUmVxQWN0aW9uKTsKIAotICAgIC8vIHRoZSBzZWNvbmQgY29sdW1uCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkF1dGgpOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTIsIE1UMl9QRUVSX0FVVEhfRVZFTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX0FVVEhfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylBdXRoVGltZW91dEFjdGlvbik7CisJLyogdGhlIHNlY29uZCBjb2x1bW4gKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5BdXRoKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfUEVFUl9BVVRIX0VWRU4sCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX0FVVEhfVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEF1dGhUaW1lb3V0QWN0aW9uKTsKIAotICAgIC8vIHRoZSB0aGlyZCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKKwkvKiB0aGUgdGhpcmQgY29sdW1uICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuQXV0aCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLAorCQkJICAgICAgKFNUQVRFX01BQ0hJTkVfRlVOQykgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9XQUlUX1NFUTQsIE1UMl9BVVRIX1RJTUVPVVQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBBdXRoVGltZW91dEFjdGlvbik7CiAKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBdXRoVGltZW91dCksIHBBZCwgRkFMU0UpOworCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwKKwkJICAgICAgR0VUX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KSwgcEFkLCBGQUxTRSk7CiB9CiAKIC8qCkBAIC04NywzMSArOTUsMjggQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXV0aFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBBdXRoVGltZW91dCh2b2lkICpTeXN0ZW1TcGVjaWZpYzEsCisJCSB2b2lkICpGdW5jdGlvbkNvbnRleHQsCisJCSB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEggLSBBdXRoVGltZW91dFxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBBdXRoVGltZW91dFxuIikpOwogCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KKwlpZiAoUlRNUF9URVNUX0ZMQUcKKwkgICAgKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKIAkJcmV0dXJuOwogCi0JLy8gc2VuZCBhIGRlLWF1dGggdG8gcmVzZXQgQVAncyBzdGF0ZSBtYWNoaW5lIChQYXRjaCBBUC1EaXI2MzUpCisJLyogc2VuZCBhIGRlLWF1dGggdG8gcmVzZXQgQVAncyBzdGF0ZSBtYWNoaW5lIChQYXRjaCBBUC1EaXI2MzUpICovCiAJaWYgKHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPT0gQVVUSF9XQUlUX1NFUTIpCiAJCUNsczJlcnJBY3Rpb24ocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwogCi0KLSAgICBNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfVElNRU9VVCwgMCwgTlVMTCk7Ci0gICAgUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9USU1FT1VULCAwLCBOVUxMKTsKKwlSVE1QX01MTUVfSEFORExFUihwQWQpOwogfQogCi0KIC8qCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBEZXNjcmlwdGlvbjoKQEAgLTEyMCw2NyArMTI1LDE5IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIE1sbWVBdXRoUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZUF1dGhSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIFVDSEFSICAgICAgICAgICAgICBBZGRyWzZdOwotICAgIFVTSE9SVCAgICAgICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgICAgICBUaW1lb3V0OwotICAgIEhFQURFUl84MDJfMTEgICAgICBBdXRoSGRyOwotICAgIEJPT0xFQU4gICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKLSAgICBORElTX1NUQVRVUyAgICAgICAgTlN0YXR1czsKLSAgICBQVUNIQVIgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgVUxPTkcgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKKwlpZiAoQVVUSF9SZXFTZW5kCisJICAgIChwQWQsIEVsZW0sICZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAiQVVUSCIsIDEsIE5VTEwsIDApKQorCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTI7CisJZWxzZSB7CisJCXUxNiBTdGF0dXM7CiAKLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIikpOwotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOwogCX0KLSAgICBlbHNlIGlmKE1sbWVBdXRoUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIsICZUaW1lb3V0LCAmQWxnKSkKLSAgICB7Ci0gICAgICAgIC8vIHJlc2V0IHRpbWVyCi0gICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLSAgICAgICAgQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIpOwotICAgICAgICBwQWQtPk1sbWVBdXguQWxnICA9IEFsZzsKLSAgICAgICAgU2VxID0gMTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotCi0gICAgICAgIE5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0gICAgICAgIGlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVBdXRoUmVxQWN0aW9uKEFsZzolZCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIiwgQWxnKSk7Ci0gICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLSAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMxIChBbGc9JWQpLi4uXG4iLCBBbGcpKTsKLSAgICAgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmQXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmU2VxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLSAgICAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsIFRpbWVvdXQpOwotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UX0VSUigoIkFVVEggLSBNbG1lQXV0aFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWRcbiIpKTsKLSAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgIFN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgIH0KIH0KIAogLyoKQEAgLTE5MSwxMDIgKzE0OCwxMzAgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgICAgU2VxLCBTdGF0dXMsIFJlbW90ZVN0YXR1cywgQWxnOwotICAgIFVDSEFSICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKLSAgICBVQ0hBUiAgICAgICAgIEN5cGVyQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOICsgOCArIDhdOwotICAgIFVDSEFSICAgICAgICAgRWxlbWVudFsyXTsKLSAgICBIRUFERVJfODAyXzExIEF1dGhIZHI7Ci0gICAgQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLSAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLSAgICBVU0hPUlQgICAgICAgIFN0YXR1czI7CisJdTggQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1MTYgU2VxLCBTdGF0dXMsIFJlbW90ZVN0YXR1cywgQWxnOworCXU4IENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07CisJdTggQ3lwZXJDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU4gKyA4ICsgOF07CisJdTggRWxlbWVudFsyXTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBdXRoSGRyOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCWludCBOU3RhdHVzOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXUxNiBTdGF0dXMyOwogCi0gICAgaWYgKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCBDaGxnVGV4dCkpCi0gICAgewotICAgICAgICBpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSMyIHRvIG1lIChBbGc9JWQsIFN0YXR1cz0lZClcbiIsIEFsZywgU3RhdHVzKSk7Ci0gICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJaWYgKFBlZXJBdXRoU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywKKwkgICAgIChjaGFyICopQ2hsZ1RleHQpKSB7CisJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEFkZHIyKSAmJiBTZXEgPT0gMikgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQVVUSCAtIFJlY2VpdmUgQVVUSF9SU1Agc2VxIzIgdG8gbWUgKEFsZz0lZCwgU3RhdHVzPSVkKVxuIiwKKwkJCQkgIEFsZywgU3RhdHVzKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCisJCQkJCSZUaW1lckNhbmNlbGxlZCk7CiAKLSAgICAgICAgICAgIGlmIChTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIE1vZGUgIkxFQVAiIGhhcyBhbGxvdyBmb3IgQ0NYIDEuWAotICAgICAgICAgICAgICAgIGlmICgocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc2hhcmVkIGtleSwgbmVlZCB0byBiZSBjaGFsbGVuZ2VkCi0gICAgICAgICAgICAgICAgICAgIFNlcSsrOwotICAgICAgICAgICAgICAgICAgICBSZW1vdGVTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisJCQlpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykgeworCQkJCS8qIEF1dGhlbnRpY2F0aW9uIE1vZGUgIkxFQVAiIGhhcyBhbGxvdyBmb3IgQ0NYIDEuWCAqLworCQkJCWlmIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pIHsKKwkJCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJCSAgICBBVVRIX1JFUV9JRExFOworCQkJCQlNbG1lRW5xdWV1ZShwQWQsCisJCQkJCQkgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCQkgICAgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogMi4gc2hhcmVkIGtleSwgbmVlZCB0byBiZSBjaGFsbGVuZ2VkICovCisJCQkJCVNlcSsrOworCQkJCQlSZW1vdGVTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CiAKLQkJCQkJLy8gR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMyID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotICAgICAgICAgICAgICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1czIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9CisJCQkJCS8qIEdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJCQkJCU5TdGF0dXMgPQorCQkJCQkgICAgTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwKKwkJCQkJCQkgICAgICAgJnBPdXRCdWZmZXIpOworCQkJCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJBVVRIIC0gUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworCQkJCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLgorCQkJCQkJICAgIEN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCQkJCQlTdGF0dXMyID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQkJCQkJTWxtZUVucXVldWUocEFkLAorCQkJCQkJCSAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKKwkJCQkJCQkgICAgTVQyX0FVVEhfQ09ORiwgMiwKKwkJCQkJCQkgICAgJlN0YXR1czIpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CiAKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFNlbmQgQVVUSCByZXF1ZXN0IHNlcSMzLi4uXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyMiwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICAgICAgICAgICAgICAgICAgQXV0aEhkci5GQy5XZXAgPSAxOwotICAgICAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IGNoYWxsZW5nZSB0ZXh0ICYgYXV0aCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBSVE1QSW5pdFdlcEVuZ2luZSgKLSAgICAgICAgICAgICAgICAgICAgCXBBZCwKLSAgICAgICAgICAgICAgICAgICAgCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotICAgICAgICAgICAgICAgICAgICAJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotICAgICAgICAgICAgICAgICAgICAJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4sCi0gICAgICAgICAgICAgICAgICAgIAlDeXBlckNobGdUZXh0KTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzMuLi5cbiIpKTsKKwkJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLAorCQkJCQkJCSBTVUJUWVBFX0FVVEgsIDAsIEFkZHIyLAorCQkJCQkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOworCQkJCQlBdXRoSGRyLkZDLldlcCA9IDE7CisJCQkJCS8qIEVuY3J5cHQgY2hhbGxlbmdlIHRleHQgJiBhdXRoIGluZm9ybWF0aW9uICovCisJCQkJCVJUTVBJbml0V2VwRW5naW5lKHBBZCwKKwkJCQkJCQkgIHBBZC0+CisJCQkJCQkJICBTaGFyZWRLZXlbQlNTMF1bcEFkLT4KKwkJCQkJCQkJCSAgU3RhQ2ZnLgorCQkJCQkJCQkJICBEZWZhdWx0S2V5SWRdLgorCQkJCQkJCSAgS2V5LAorCQkJCQkJCSAgcEFkLT5TdGFDZmcuCisJCQkJCQkJICBEZWZhdWx0S2V5SWQsCisJCQkJCQkJICBwQWQtPgorCQkJCQkJCSAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+CisJCQkJCQkJCQkgIFN0YUNmZy4KKwkJCQkJCQkJCSAgRGVmYXVsdEtleUlkXS4KKwkJCQkJCQkgIEtleUxlbiwKKwkJCQkJCQkgIEN5cGVyQ2hsZ1RleHQpOwogCi0JCQkJCUFsZyA9IGNwdTJsZTE2KCooVVNIT1JUICopJkFsZyk7Ci0JCQkJCVNlcSA9IGNwdTJsZTE2KCooVVNIT1JUICopJlNlcSk7Ci0JCQkJCVJlbW90ZVN0YXR1cz0gY3B1MmxlMTYoKihVU0hPUlQgKikmUmVtb3RlU3RhdHVzKTsKKwkJCQkJQWxnID0gY3B1MmxlMTYoKih1MTYgKikgJiBBbGcpOworCQkJCQlTZXEgPSBjcHUybGUxNigqKHUxNiAqKSAmIFNlcSk7CisJCQkJCVJlbW90ZVN0YXR1cyA9CisJCQkJCSAgICBjcHUybGUxNigqKHUxNiAqKSAmCisJCQkJCQkgICAgIFJlbW90ZVN0YXR1cyk7CiAKLQkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJkFsZywgQ3lwZXJDaGxnVGV4dCArIDQsIDIpOwotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmU2VxLCBDeXBlckNobGdUZXh0ICsgNiwgMik7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZSZW1vdGVTdGF0dXMsIEN5cGVyQ2hsZ1RleHQgKyA4LCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKHU4ICopJiBBbGcsCisJCQkJCQkJQ3lwZXJDaGxnVGV4dCArIDQsIDIpOworCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAodTggKikmIFNlcSwKKwkJCQkJCQlDeXBlckNobGdUZXh0ICsgNiwgMik7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsCisJCQkJCQkJKHU4ICopJiBSZW1vdGVTdGF0dXMsCisJCQkJCQkJQ3lwZXJDaGxnVGV4dCArIDgsIDIpOwogCQkJCQlFbGVtZW50WzBdID0gMTY7CiAJCQkJCUVsZW1lbnRbMV0gPSAxMjg7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIEVsZW1lbnQsIEN5cGVyQ2hsZ1RleHQgKyAxMCwgMik7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIENobGdUZXh0LCBDeXBlckNobGdUZXh0ICsgMTIsIDEyOCk7CisJCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIEVsZW1lbnQsCisJCQkJCQkJQ3lwZXJDaGxnVGV4dCArIDEwLCAyKTsKKwkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgQ2hsZ1RleHQsCisJCQkJCQkJQ3lwZXJDaGxnVGV4dCArIDEyLAorCQkJCQkJCTEyOCk7CiAJCQkJCVJUTVBTZXRJQ1YocEFkLCBDeXBlckNobGdUZXh0ICsgMTQwKTsKLSAgICAgICAgICAgICAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9URVhUX0xFTiArIDE2LCAgICAgQ3lwZXJDaGxnVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgICAgICAgICAgICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLSAgICAgICAgICAgICAgICAJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKwkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCQkJCQkgICZBdXRoSGRyLAorCQkJCQkJCSAgQ0lQSEVSX1RFWFRfTEVOICsgMTYsCisJCQkJCQkJICBDeXBlckNobGdUZXh0LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsCisJCQkJCQkJICBGcmFtZUxlbik7CisJCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLSAgICAgICAgICAgICAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBBVVRIX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOwotICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKLSAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhTYW5pdHkoKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwotICAgIH0KKwkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAorCQkJCQkJICAgICBBVVRIX1RJTUVPVVQpOworCQkJCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkJICAgIEFVVEhfV0FJVF9TRVE0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisJCQkJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworCQkJCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCisJCQkJCSAgICBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVVUSCAtIFBlZXJBdXRoU2FuaXR5KCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CiB9CiAKIC8qCkBAIC0yOTcsMzYgKzI4MiwzNSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLSAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOwotICAgIENIQVIgICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKLSAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCXU4IEFkZHIyW01BQ19BRERSX0xFTl07CisJdTE2IEFsZywgU2VxLCBTdGF0dXM7CisJY2hhciBDaGxnVGV4dFtDSVBIRVJfVEVYVF9MRU5dOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CiAKLSAgICBpZihQZWVyQXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywgQ2hsZ1RleHQpKQotICAgIHsKLSAgICAgICAgaWYoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSM0IHRvIG1lXG4iKSk7Ci0gICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CisJaWYgKFBlZXJBdXRoU2FuaXR5CisJICAgIChwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkFsZywgJlNlcSwgJlN0YXR1cywKKwkgICAgIENobGdUZXh0KSkgeworCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyMikgJiYgU2VxID09IDQpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkFVVEggLSBSZWNlaXZlIEFVVEhfUlNQIHNlcSM0IHRvIG1lXG4iKSk7CisJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5BdXRoVGltZXIsCisJCQkJCSZUaW1lckNhbmNlbGxlZCk7CiAKLSAgICAgICAgICAgIGlmIChTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOwotICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKLSAgICAgICAgICAgIH0KKwkJCWlmIChTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKSB7CisJCQkJcEFkLT5TdGFDZmcuQXV0aEZhaWxSZWFzb24gPSBTdGF0dXM7CisJCQkJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5BdXRoRmFpbFN0YSwgQWRkcjIpOworCQkJfQogCi0gICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxNEFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7Ci0gICAgfQorCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLAorCQkJCSAgICAyLCAmU3RhdHVzKTsKKwkJfQorCX0gZWxzZSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKKwl9CiB9CiAKIC8qCkBAIC0zMzcsNDcgKzMyMSw0OSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZURlYXV0aFJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqcEluZm87Ci0gICAgSEVBREVSXzgwMl8xMSBEZWF1dGhIZHI7Ci0gICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLSAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0gICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgVVNIT1JUICAgICAgICBTdGF0dXM7CisJc3RydWN0IHJ0X21sbWVfZGVhdXRoX3JlcSAqcEluZm87CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgRGVhdXRoSGRyOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1MTYgU3RhdHVzOwogCi0gICAgcEluZm8gPSAoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAqKUVsZW0tPk1zZzsKKwlwSW5mbyA9IChzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxICopRWxlbS0+TXNnOwogCi0gICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIE1sbWVEZWF1dGhSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOwotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOwotICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQVVUSCAtIE1sbWVEZWF1dGhSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbFxuIikpOworCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9GQUlMX05PX1JFU09VUkNFOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CisJCXJldHVybjsKKwl9CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBERS1BVVRIIHJlcXVlc3QgKFJlYXNvbj0lZCkuLi5cbiIsIHBJbmZvLT5SZWFzb24pKTsKLSAgICBNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBJbmZvLT5BZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgIE1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCZEZWF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZwSW5mby0+UmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVVUSCAtIFNlbmQgREUtQVVUSCByZXF1ZXN0IChSZWFzb249JWQpLi4uXG4iLAorCQkgIHBJbmZvLT5SZWFzb24pKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkRlYXV0aEhkciwgU1VCVFlQRV9ERUFVVEgsIDAsIHBJbmZvLT5BZGRyLAorCQkJIHBBZC0+TWxtZUF1eC5Cc3NpZCk7CisJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLCBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLAorCQkJICAmRGVhdXRoSGRyLCAyLCAmcEluZm8tPlJlYXNvbiwgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLSAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBwSW5mby0+UmVhc29uOwotICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwSW5mby0+QWRkcik7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7CisJcEFkLT5TdGFDZmcuRGVhdXRoUmVhc29uID0gcEluZm8tPlJlYXNvbjsKKwlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEluZm8tPkFkZHIpOworCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOworCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfREVBVVRIX0NPTkYsIDIsICZTdGF0dXMpOwogCi0JLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uCisJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uICovCiAJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ERUFVVEhfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKKwkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsCisJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCSAgICAgIEJTUzAsIDApOwogfQogCiAvKgpAQCAtMzg4LDE1ICszNzQsMTMgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBBdXRoVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0gICAgVVNIT1JUIFN0YXR1czsKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gQXV0aFRpbWVvdXRBY3Rpb25cbiIpKTsKLSAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICBTdGF0dXMgPSBNTE1FX1JFSl9USU1FT1VUOwotICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7CisJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKKwlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKIH0KIAogLyoKQEAgLTQwNywxNSArMzkxLDE1IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkF1dGgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotICAgIFVTSE9SVCBTdGF0dXM7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEludmFsaWRTdGF0ZVdoZW5BdXRoIChzdGF0ZT0lbGQpLCByZXNldCBBVVRIIHN0YXRlIG1hY2hpbmVcbiIsIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUpKTsKLSAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICBTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUpKTsKKwlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOworCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwogfQogCiAvKgpAQCAtNDMwLDMxICs0MTQsMTA0IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIENsczJlcnJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFVDSEFSIHBBZGRyKQordm9pZCBDbHMyZXJyQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgdTggKnBBZGRyKQogewotICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOwotICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFVTSE9SVCAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgRGVhdXRoSGRyOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1MTYgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7CiAKLSAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybjsKKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkvKkdldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5ICovCisJaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuOwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIENsYXNzIDIgZXJyb3IsIFNlbmQgREVBVVRIIGZyYW1lLi4uXG4iKSk7Ci0gICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwQWRkciwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKLSAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGVhdXRoSGRyLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLSAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQVVUSCAtIENsYXNzIDIgZXJyb3IsIFNlbmQgREVBVVRIIGZyYW1lLi4uXG4iKSk7CisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZEZWF1dGhIZHIsIFNVQlRZUEVfREVBVVRILCAwLCBwQWRkciwKKwkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCSAgJkRlYXV0aEhkciwgMiwgJlJlYXNvbiwgRU5EX09GX0FSR1MpOworCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7CiAKLSAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBSZWFzb247Ci0gICAgQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBBZGRyKTsKKwlwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBSZWFzb247CisJQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5EZWF1dGhTdGEsIHBBZGRyKTsKIH0KIAorQk9PTEVBTiBBVVRIX1JlcVNlbmQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICAgIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKnBFbGVtLAorCQkgICAgIHN0cnVjdCBydF9yYWxpbmtfdGltZXIgKnBBdXRoVGltZXIsCisJCSAgICAgY2hhciAqcFNNTmFtZSwKKwkJICAgICB1MTYgU2VxTm8sCisJCSAgICAgdTggKnBOZXdFbGVtZW50LCB1bnNpZ25lZCBsb25nIEVsZW1lbnRMZW4pCit7CisJdTE2IEFsZywgU2VxLCBTdGF0dXM7CisJdTggQWRkcls2XTsKKwl1bnNpZ25lZCBsb25nIFRpbWVvdXQ7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQXV0aEhkcjsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOworCWludCBOU3RhdHVzOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMCwgdG1wID0gMDsKIAorCS8qIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCAqLworCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMgLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIiwKKwkJCSAgcFNNTmFtZSkpOworCQlwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKKwkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwKKwkJCSAgICAmU3RhdHVzKTsKKwl9IGVsc2UKKwkgICAgaWYgKE1sbWVBdXRoUmVxU2FuaXR5CisJCShwQWQsIHBFbGVtLT5Nc2csIHBFbGVtLT5Nc2dMZW4sIEFkZHIsICZUaW1lb3V0LCAmQWxnKSkgeworCQkvKiByZXNldCB0aW1lciAqLworCQlSVE1QQ2FuY2VsVGltZXIocEF1dGhUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKKworCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcik7CisJCXBBZC0+TWxtZUF1eC5BbGcgPSBBbGc7CisJCVNlcSA9IFNlcU5vOworCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7CisKKwkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKEFsZzolZCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIiwKKwkJCQkgIHBTTU5hbWUsIEFsZykpOworCQkJcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7CisJCQlTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7CisJCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLAorCQkJCSAgICAyLCAmU3RhdHVzKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXMgLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMSAoQWxnPSVkKS4uLlxuIiwgcFNNTmFtZSwKKwkJCSAgQWxnKSk7CisJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyLAorCQkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOworCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksCisJCQkJICAmQXV0aEhkciwgMiwgJkFsZywgMiwgJlNlcSwgMiwgJlN0YXR1cywKKwkJCQkgIEVORF9PRl9BUkdTKTsKKworCQlpZiAocE5ld0VsZW1lbnQgJiYgRWxlbWVudExlbikgeworCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkgIEVsZW1lbnRMZW4sIHBOZXdFbGVtZW50LCBFTkRfT0ZfQVJHUyk7CisJCQlGcmFtZUxlbiArPSB0bXA7CisJCX0KKworCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKKwkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKKworCQlSVE1QU2V0VGltZXIocEF1dGhUaW1lciwgVGltZW91dCk7CisJCXJldHVybiBUUlVFOworCX0gZWxzZSB7CisJCURCR1BSSU5UX0VSUigoIiVzIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iLAorCQkJICAgICAgcFNNTmFtZSkpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvYXV0aF9yc3AuYwppbmRleCBjYzYzOWIxLi41YjAxOGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9hdXRoX3JzcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2F1dGhfcnNwLmMKQEAgLTQ3LDE4ICs0NywyMSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBQU1RBVEVfTUFDSElORSBTbSwKLSAgICBJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3ZvaWQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqU20sCisJCQkgICAgIElOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotICAgIFN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfQVVUSF9SU1BfU1RBVEUsIE1BWF9BVVRIX1JTUF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SU1BfSURMRSwgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKKwlTdGF0ZU1hY2hpbmVJbml0KFNtLCBUcmFucywgTUFYX0FVVEhfUlNQX1NUQVRFLCBNQVhfQVVUSF9SU1BfTVNHLAorCQkJIChTVEFURV9NQUNISU5FX0ZVTkMpIERyb3AsIEFVVEhfUlNQX0lETEUsCisJCQkgQVVUSF9SU1BfTUFDSElORV9CQVNFKTsKIAotICAgIC8vIGNvbHVtbiAxCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9JRExFLCBNVDJfUEVFUl9ERUFVVEgsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRlYXV0aEFjdGlvbik7CisJLyogY29sdW1uIDEgKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX0lETEUsIE1UMl9QRUVSX0RFQVVUSCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEZWF1dGhBY3Rpb24pOwogCi0gICAgLy8gY29sdW1uIDIKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX1dBSVRfQ0hBTCwgTVQyX1BFRVJfREVBVVRILCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEZWF1dGhBY3Rpb24pOworCS8qIGNvbHVtbiAyICovCisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9XQUlUX0NIQUwsIE1UMl9QRUVSX0RFQVVUSCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJEZWF1dGhBY3Rpb24pOwogCiB9CiAKQEAgLTcwLDM5ICs3MywzMiBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFBlZXJBdXRoU2ltcGxlUnNwR2VuQW5kU2VuZCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0gICAgSU4gVVNIT1JUIEFsZywKLSAgICBJTiBVU0hPUlQgU2VxLAotICAgIElOIFVTSE9SVCBSZWFzb24sCi0gICAgSU4gVVNIT1JUIFN0YXR1cykKK3ZvaWQgUGVlckF1dGhTaW1wbGVSc3BHZW5BbmRTZW5kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGRyODAyMTEsCisJCQkJIHUxNiBBbGcsCisJCQkJIHUxNiBTZXEsCisJCQkJIHUxNiBSZWFzb24sIHUxNiBTdGF0dXMpCiB7Ci0gICAgSEVBREVSXzgwMl8xMSAgICAgQXV0aEhkcjsKLSAgICBVTE9ORyAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgUFVDSEFSICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICAgICAgTlN0YXR1czsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBBdXRoSGRyOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwlpbnQgTlN0YXR1czsKIAotICAgIGlmIChSZWFzb24gIT0gTUxNRV9TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlciBBVVRIIGZhaWwuLi5cbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKwlpZiAoUmVhc29uICE9IE1MTUVfU1VDQ0VTUykgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyIEFVVEggZmFpbC4uLlxuIikpOworCQlyZXR1cm47CisJfQorCS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KKwlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOworCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybjsKIAotCS8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgQVVUSCByZXNwb25zZSAoc2VxIzIpLi4uXG4iKSk7Ci0gICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmU2VxLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2VuZCBBVVRIIHJlc3BvbnNlIChzZXEjMikuLi5cbiIpKTsKKwlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkF1dGhIZHIsIFNVQlRZUEVfQVVUSCwgMCwgcEhkcjgwMjExLT5BZGRyMiwKKwkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOworCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwKKwkJCSAgJkF1dGhIZHIsIDIsICZBbGcsIDIsICZTZXEsIDIsICZSZWFzb24sIEVORF9PRl9BUkdTKTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKIAlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogfQogCkBAIC0xMTQsMzUgKzExMCwzMyBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFBlZXJEZWF1dGhBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUE1MTUVfUVVFVUVfRUxFTSBFbGVtKQordm9pZCBQZWVyRGVhdXRoQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLSAgICBVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICAgIFJlYXNvbjsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCXUxNiBSZWFzb247CiAKLSAgICBpZiAoUGVlckRlYXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCi0gICAgewotICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSAmJiBNQUNfQUREUl9FUVVBTChBZGRyMiwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gcmVjZWl2ZSBERS1BVVRIIGZyb20gb3VyIEFQIChSZWFzb249JWQpXG4iLCBSZWFzb24pKTsKKwlpZiAoUGVlckRlYXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpIHsKKwkJaWYgKElORlJBX09OKHBBZCkKKwkJICAgICYmIE1BQ19BRERSX0VRVUFMKEFkZHIyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCkKKwkJICAgICkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQVVUSF9SU1AgLSByZWNlaXZlIERFLUFVVEggZnJvbSBvdXIgQVAgKFJlYXNvbj0lZClcbiIsCisJCQkJICBSZWFzb24pKTsKIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLSAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotICAgICAgICAgICAgfQorCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLAorCQkJCQkJMCk7CiAKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgorCQkJLyogc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBkZWF1dGhlbnRpY2F0aW9uICovCiAJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfREVBVVRIX0VWRU5UX0ZMQUcsCisJCQkJCQkgICAgICBwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICAgIENvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkJCSAgICAgIEJTUzAsIDApOwogCi0gICAgICAgICAgICBMaW5rRG93bihwQWQsIFRSVUUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSF9SU1AgLSBQZWVyRGVhdXRoQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9CisJCQlMaW5rRG93bihwQWQsIFRSVUUpOworCQl9CisJfSBlbHNlIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJBVVRIX1JTUCAtIFBlZXJEZWF1dGhBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOworCX0KIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvY29ubmVjdC5jCmluZGV4IDdiYzc1YWIuLjE3ZTU5YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL2Nvbm5lY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9jb25uZWN0LmMKQEAgLTM2LDM0ICszNiwzOSBAQAogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdID0gewotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZVRraXApIC8gc2l6ZW9mKFVDSEFSKSk7Cit1OCBDaXBoZXJTdWl0ZVdwYU5vbmVUa2lwW10gPSB7CisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLyogb3VpICovCisJMHgwMSwgMHgwMCwJCS8qIFZlcnNpb24gKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvKiBNdWx0aWNhc3QgKi8KKwkweDAxLCAweDAwLAkJLyogTnVtYmVyIG9mIHVuaWNhc3QgKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvKiB1bmljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QgKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDAwCS8qIGF1dGhlbnRpY2F0aW9uICovCit9OwogCi1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXSA9IHsKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1bmljYXN0Ci0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDQsCS8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDUwLCAweGYyLCAweDAwCS8vIGF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZUFlcykgLyBzaXplb2YoVUNIQVIpKTsKK3U4IENpcGhlclN1aXRlV3BhTm9uZVRraXBMZW4gPQorICAgIChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lVGtpcCkgLyBzaXplb2YodTgpKTsKIAotLy8gVGhlIGZvbGxvd2luZyBNQUNSTyBpcyBjYWxsZWQgYWZ0ZXIgMS4gc3RhcnRpbmcgYW4gbmV3IElCU1MsIDIuIHN1Y2Nlc2Z1bGx5IEpPSU4gYW4gSUJTUywKLS8vIG9yIDMuIHN1Y2Nlc2Z1bGx5IEFTU09DSUFURSB0byBhIEJTUywgNC4gc3VjY2Vzc2Z1bGx5IFJFX0FTU09DSUFURSB0byBhIEJTUwotLy8gQWxsIHNldHRpbmdzIHN1Y2Nlc3NmdWx5IG5lZ290aWF0ZWQgZnVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZXMgYmVjb21lIGZpbmFsIHNldHRpbmdzCi0vLyBhbmQgYXJlIGNvcGllZCB0byBwQWQtPlN0YUFjdGl2ZQordTggQ2lwaGVyU3VpdGVXcGFOb25lQWVzW10gPSB7CisJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwJLyogb3VpICovCisJMHgwMSwgMHgwMCwJCS8qIFZlcnNpb24gKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvKiBNdWx0aWNhc3QgKi8KKwkweDAxLCAweDAwLAkJLyogTnVtYmVyIG9mIHVuaWNhc3QgKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvKiB1bmljYXN0ICovCisJMHgwMSwgMHgwMCwJCS8qIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QgKi8KKwkweDAwLCAweDUwLCAweGYyLCAweDAwCS8qIGF1dGhlbnRpY2F0aW9uICovCit9OworCit1OCBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNMZW4gPQorICAgIChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lQWVzKSAvIHNpemVvZih1OCkpOworCisvKiBUaGUgZm9sbG93aW5nIE1BQ1JPIGlzIGNhbGxlZCBhZnRlciAxLiBzdGFydGluZyBhbiBuZXcgSUJTUywgMi4gc3VjY2VzZnVsbHkgSk9JTiBhbiBJQlNTLCAqLworLyogb3IgMy4gc3VjY2VzZnVsbHkgQVNTT0NJQVRFIHRvIGEgQlNTLCA0LiBzdWNjZXNzZnVsbHkgUkVfQVNTT0NJQVRFIHRvIGEgQlNTICovCisvKiBBbGwgc2V0dGluZ3Mgc3VjY2Vzc2Z1bHkgbmVnb3RpYXRlZCBmdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lcyBiZWNvbWUgZmluYWwgc2V0dGluZ3MgKi8KKy8qIGFuZCBhcmUgY29waWVkIHRvIHBBZC0+U3RhQWN0aXZlICovCiAjZGVmaW5lIENPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlOZGlzWmVyb01lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwkJCQkJCQlcCiAJKF9wQWQpLT5Db21tb25DZmcuU3NpZExlbiA9IChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+Q29tbW9uQ2ZnLlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZExlbik7IFwKIAlDT1BZX01BQ19BRERSKChfcEFkKS0+Q29tbW9uQ2ZnLkJzc2lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgICAgICAgICAgICAgICAgICBcCkBAIC03OSw5ICs4NCw5IEBACiAJTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuKTtcCiAJKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbik7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCAmKF9wQWQpLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTtcCi0JTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmKF9wQWQpLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBFZGNhUGFybSwgJihfcEFkKS0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpO1wKKwlOZGlzTW92ZU1lbW9yeSgmKF9wQWQpLT5Db21tb25DZmcuQVBRb3NDYXBhYmlsaXR5LCAmKF9wQWQpLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtKSk7XAorCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmKF9wQWQpLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTtcCiAJQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIChfcEFkKS0+TWxtZUF1eC5Cc3NpZCk7ICAgICAgXAogCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWlkID0gKF9wQWQpLT5NbG1lQXV4LkFpZDsgICAgICAgICAgICAgICAgICAgICAgIFwKIAkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IChfcEFkKS0+U3RhQ2ZnLlBhaXJDaXBoZXI7XApAQCAtOTcsMTMgKzEwMiwxMSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIE1sbWVDbnRsSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKK3ZvaWQgTWxtZUNudGxJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICBzdHJ1Y3QgcnRfc3RhdGVfbWFjaGluZSAqUywgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQogewotCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBkaWZmZXJzIGZyb20gb3RoZXIgc3RhdGUgbWFjaGluZXMsIHRoZSBpbnRlcmZhY2UKLQkvLyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UKKwkvKiBDb250cm9sIHN0YXRlIG1hY2hpbmUgZGlmZmVycyBmcm9tIG90aGVyIHN0YXRlIG1hY2hpbmVzLCB0aGUgaW50ZXJmYWNlICovCisJLyogZm9sbG93cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlICovCiAJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKIH0KIApAQCAtMTE1LDExOCArMTE4LDEwOCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVDbnRsTWFjaGluZVBlcmZvcm1BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlMsCisJCQkJICBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCXN3aXRjaChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlKQotCXsKLQkJY2FzZSBDTlRMX0lETEU6Ci0JCQl7Ci0JCQkJQ250bElkbGVQcm9jKHBBZCwgRWxlbSk7CisJc3dpdGNoIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlKSB7CisJY2FzZSBDTlRMX0lETEU6CisJCUNudGxJZGxlUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKwljYXNlIENOVExfV0FJVF9ESVNBU1NPQzoKKwkJQ250bFdhaXREaXNhc3NvY1Byb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisJY2FzZSBDTlRMX1dBSVRfSk9JTjoKKwkJQ250bFdhaXRKb2luUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKworCQkvKiBDTlRMX1dBSVRfUkVBU1NPQyBpcyB0aGUgb25seSBzdGF0ZSBpbiBDTlRMIG1hY2hpbmUgdGhhdCBkb2VzICovCisJCS8qIG5vdCB0cmlnZ2VyZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSAiUlRNUFNldEluZm9ybWF0aW9uKE9JRF94eHgpIi4gKi8KKwkJLyogVGhlcmVmb3JlIG5vdCBwcm90ZWN0ZWQgYnkgTkRJUydzICJvbmx5IG9uZSBvdXRzdGFuZGluZyBPSUQgcmVxdWVzdCIgKi8KKwkJLyogcnVsZS4gV2hpY2ggbWVhbnMgTkRJUyBtYXkgU0VUIE9JRCBpbiB0aGUgbWlkZGxlIG9mIFJPQU1pbmcgYXR0ZW1wdHMuICovCisJCS8qIEN1cnJlbnQgYXBwcm9hY2ggaXMgdG8gYmxvY2sgbmV3IFNFVCByZXF1ZXN0IGF0IFJUTVBTZXRJbmZvcm1hdGlvbigpICovCisJCS8qIHdoZW4gQ250bE1hY2hpbmUuQ3VyclN0YXRlIGlzIG5vdCBDTlRMX0lETEUgKi8KKwljYXNlIENOVExfV0FJVF9SRUFTU09DOgorCQlDbnRsV2FpdFJlYXNzb2NQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCisJY2FzZSBDTlRMX1dBSVRfU1RBUlQ6CisJCUNudGxXYWl0U3RhcnRQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQ05UTF9XQUlUX0FVVEg6CisJCUNudGxXYWl0QXV0aFByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CisJY2FzZSBDTlRMX1dBSVRfQVVUSDI6CisJCUNudGxXYWl0QXV0aFByb2MyKHBBZCwgRWxlbSk7CisJCWJyZWFrOworCWNhc2UgQ05UTF9XQUlUX0FTU09DOgorCQlDbnRsV2FpdEFzc29jUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKKworCWNhc2UgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU46CisJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpIHsKKwkJCS8qIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZSAqLworCQkJLyogd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcyAqLworCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKKworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworCQkJLyogKi8KKwkJCS8qIFNldCBMRUQgc3RhdHVzIHRvIHByZXZpb3VzIHN0YXR1cy4gKi8KKwkJCS8qICovCisJCQlpZiAocEFkLT5iTGVkT25TY2FubmluZykgeworCQkJCXBBZC0+YkxlZE9uU2Nhbm5pbmcgPSBGQUxTRTsKKwkJCQlSVE1QU2V0TEVEKHBBZCwgcEFkLT5MZWRTdGF0dXMpOwogCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0RJU0FTU09DOgotCQkJQ250bFdhaXREaXNhc3NvY1Byb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9KT0lOOgotCQkJQ250bFdhaXRKb2luUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAKLQkJLy8gQ05UTF9XQUlUX1JFQVNTT0MgaXMgdGhlIG9ubHkgc3RhdGUgaW4gQ05UTCBtYWNoaW5lIHRoYXQgZG9lcwotCQkvLyBub3QgdHJpZ2dlcmVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgIlJUTVBTZXRJbmZvcm1hdGlvbihPSURfeHh4KSIuCi0JCS8vIFRoZXJlZm9yZSBub3QgcHJvdGVjdGVkIGJ5IE5ESVMncyAib25seSBvbmUgb3V0c3RhbmRpbmcgT0lEIHJlcXVlc3QiCi0JCS8vIHJ1bGUuIFdoaWNoIG1lYW5zIE5ESVMgbWF5IFNFVCBPSUQgaW4gdGhlIG1pZGRsZSBvZiBST0FNaW5nIGF0dGVtcHRzLgotCQkvLyBDdXJyZW50IGFwcHJvYWNoIGlzIHRvIGJsb2NrIG5ldyBTRVQgcmVxdWVzdCBhdCBSVE1QU2V0SW5mb3JtYXRpb24oKQotCQkvLyB3aGVuIENudGxNYWNoaW5lLkN1cnJTdGF0ZSBpcyBub3QgQ05UTF9JRExFCi0JCWNhc2UgQ05UTF9XQUlUX1JFQVNTT0M6Ci0JCQlDbnRsV2FpdFJlYXNzb2NQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIENOVExfV0FJVF9TVEFSVDoKLQkJCUNudGxXYWl0U3RhcnRQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfQVVUSDoKLQkJCUNudGxXYWl0QXV0aFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9BVVRIMjoKLQkJCUNudGxXYWl0QXV0aFByb2MyKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfQVNTT0M6Ci0JCQlDbnRsV2FpdEFzc29jUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjoKLQkJCWlmKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NDQU5fQ09ORikKLQkJCXsKLQkJCQkvLyBSZXN1bWUgVHhSaW5nIGFmdGVyIFNDQU5JTkcgY29tcGxldGUuIFdlIGhvcGUgdGhlIG91dC1vZi1zZXJ2aWNlIHRpbWUKLQkJCQkvLyB3b24ndCBiZSB0b28gbG9uZyB0byBsZXQgdXBwZXIgbGF5ZXIgdGltZS1vdXQgdGhlIHdhaXRpbmcgZnJhbWVzCi0JCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKLQkJCQlpZiAocEFkLT5TdGFDZmcuQ0NYUmVxVHlwZSAhPSBNU1JOX1RZUEVfVU5VU0VEKQotCQkJCXsKLQkJCQkJLy8gQ2lzY28gc2NhbiByZXF1ZXN0IGlzIGZpbmlzaGVkLCBwcmVwYXJlIGJlYWNvbiByZXBvcnQKLQkJCQkJTWxtZUVucXVldWUocEFkLCBBSVJPTkVUX1NUQVRFX01BQ0hJTkUsIE1UMl9BSVJPTkVUX1NDQU5fRE9ORSwgMCwgTlVMTCk7Ci0JCQkJfQotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLSAgICAgICAgICAgICAgICAvLwotCQkJCS8vIFNldCBMRUQgc3RhdHVzIHRvIHByZXZpb3VzIHN0YXR1cy4KLQkJCQkvLwotCQkJCWlmIChwQWQtPmJMZWRPblNjYW5uaW5nKQotCQkJCXsKLQkJCQkJcEFkLT5iTGVkT25TY2FubmluZyA9IEZBTFNFOwotCQkJCQlSVE1QU2V0TEVEKHBBZCwgcEFkLT5MZWRTdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKLQkJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKQotCQkJewotCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQl9Ci0JCQlicmVhazsKLSNpZmRlZiBSVDI4NzAKLQkJLy8KLQkJLy8gVGhpcyBzdGF0ZSBpcyBmb3IgdGhhdCB3ZSB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQVAgYnV0Ci0JCS8vIGl0IGRpZG4ndCBmaW5kIG9uIEJTUyBMaXN0IHRhYmxlLiBTbyB3ZSBuZWVkIHRvIHNjYW4gdGhlIGFpciBmaXJzdCwKLQkJLy8gYWZ0ZXIgdGhhdCB3ZSBjYW4gdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGRlc2lyZWQgQVAgaWYgYXZhaWxhYmxlLgotCQkvLwotCQljYXNlIENOVExfV0FJVF9TQ0FOX0ZPUl9DT05ORUNUOgotCQkJaWYoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU0NBTl9DT05GKQotCQkJewotCQkJCS8vIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZQotCQkJCS8vIHdvbid0IGJlIHRvbyBsb25nIHRvIGxldCB1cHBlciBsYXllciB0aW1lLW91dCB0aGUgd2FpdGluZyBmcmFtZXMKLQkJCQlSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbihwQWQpOworCWNhc2UgQ05UTF9XQUlUX09JRF9ESVNBU1NPQzoKKwkJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpIHsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKwkJfQorCQlicmVhazsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkJLyogKi8KKwkJLyogVGhpcyBzdGF0ZSBpcyBmb3IgdGhhdCB3ZSB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQVAgYnV0ICovCisJCS8qIGl0IGRpZG4ndCBmaW5kIG9uIEJTUyBMaXN0IHRhYmxlLiBTbyB3ZSBuZWVkIHRvIHNjYW4gdGhlIGFpciBmaXJzdCwgKi8KKwkJLyogYWZ0ZXIgdGhhdCB3ZSBjYW4gdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIGRlc2lyZWQgQVAgaWYgYXZhaWxhYmxlLiAqLworCQkvKiAqLworCWNhc2UgQ05UTF9XQUlUX1NDQU5fRk9SX0NPTk5FQ1Q6CisJCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpIHsKKwkJCS8qIFJlc3VtZSBUeFJpbmcgYWZ0ZXIgU0NBTklORyBjb21wbGV0ZS4gV2UgaG9wZSB0aGUgb3V0LW9mLXNlcnZpY2UgdGltZSAqLworCQkJLyogd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcyAqLworCQkJUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24ocEFkKTsKICNpZmRlZiBDQ1hfU1VQUE9SVAotCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpCi0JCQkJewotCQkJCQkvLyBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydAotCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFJUk9ORVRfU1RBVEVfTUFDSElORSwgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKLQkJCQl9Ci0jZW5kaWYgLy8gQ0NYX1NVUFBPUlQgLy8KLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0JCQkJLy8KLQkJCQkvLyBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCB0by4KLQkJCQkvLwotCQkJCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQkJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPiAwKQotCQkJCXsKLQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJCX0KKwkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlICE9IE1TUk5fVFlQRV9VTlVTRUQpIHsKKwkJCQkvKiBDaXNjbyBzY2FuIHJlcXVlc3QgaXMgZmluaXNoZWQsIHByZXBhcmUgYmVhY29uIHJlcG9ydCAqLworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQUlST05FVF9TVEFURV9NQUNISU5FLAorCQkJCQkgICAgTVQyX0FJUk9ORVRfU0NBTl9ET05FLCAwLCBOVUxMKTsKIAkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIFJUMjg3MCAvLwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlRfRVJSKCgiIUVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKSk7Ci0JCQlicmVhazsKKyNlbmRpZiAvKiBDQ1hfU1VQUE9SVCAvLyAqLworCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKKworCQkJLyogKi8KKwkJCS8qIENoZWNrIGlmIHdlIGNhbiBjb25uZWN0IHRvLiAqLworCQkJLyogKi8KKwkJCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsCisJCQkJCSAoY2hhciAqKSBwQWQtPk1sbWVBdXguCisJCQkJCSBBdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkJIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbik7CisJCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPiAwKSB7CisJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOworCQkJfQorCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLworCWRlZmF1bHQ6CisJCURCR1BSSU5UX0VSUigoIkVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLAorCQkJICAgICAgRWxlbS0+TXNnVHlwZSkpOworCQlicmVhazsKIAl9CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgpAQCAtMjM1LDkyICsyMjgsOTUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsSWRsZVByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsSWRsZVByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNhc3NvY1JlcTsKIAogCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKIAkJcmV0dXJuOwogCi0Jc3dpdGNoKEVsZW0tPk1zZ1R5cGUpCi0JewotCQljYXNlIE9JRF84MDJfMTFfU1NJRDoKLQkJCUNudGxPaWRTc2lkUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7CisJc3dpdGNoIChFbGVtLT5Nc2dUeXBlKSB7CisJY2FzZSBPSURfODAyXzExX1NTSUQ6CisJCUNudGxPaWRTc2lkUHJvYyhwQWQsIEVsZW0pOworCQlicmVhazsKIAotCQljYXNlIE9JRF84MDJfMTFfQlNTSUQ6Ci0JCQlDbnRsT2lkUlRCc3NpZFByb2MocEFkLEVsZW0pOwotCQkJYnJlYWs7CisJY2FzZSBPSURfODAyXzExX0JTU0lEOgorCQlDbnRsT2lkUlRCc3NpZFByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTjoKLQkJCUNudGxPaWRTY2FuUHJvYyhwQWQsRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgorCQlDbnRsT2lkU2NhblByb2MocEFkLCBFbGVtKTsKKwkJYnJlYWs7CiAKLQkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7CisJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKKwkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEpLCAmRGlzYXNzb2NSZXEpOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKIAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkpCi0gICAgICAgICAgICB7Ci0gICAgCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotICAgIAkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLSAgICAJCQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotICAgIAkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLSAgICAgICAgICAgIH0KLQkJCWJyZWFrOworCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9CisJCSAgICBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkpIHsKKwkJCS8qIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQgKi8KKwkJCS8qIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4gKi8KKwkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IDMyOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLAorCQkJCSAgICAgICBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQl9CisJCWJyZWFrOwogCi0JCWNhc2UgTVQyX01MTUVfUk9BTUlOR19SRVE6Ci0JCQlDbnRsTWxtZVJvYW1pbmdQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKKwljYXNlIE1UMl9NTE1FX1JPQU1JTkdfUkVROgorCQlDbnRsTWxtZVJvYW1pbmdQcm9jKHBBZCwgRWxlbSk7CisJCWJyZWFrOwogCi0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUU6Ci0gICAgICAgICAgICBXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUocEFkLCBFbGVtKTsKLSAgICAgICAgICAgIGJyZWFrOworCWNhc2UgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUU6CisJCVdwYU1pY0ZhaWx1cmVSZXBvcnRGcmFtZShwQWQsIEVsZW0pOworCQlicmVhazsKIAotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLEVsZW0tPk1zZ1R5cGUpKTsKLQkJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQ05UTCAtIElsbGVnYWwgbWVzc2FnZSBpbiBDbnRsSWRsZVByb2MoTXNnVHlwZT0lbGQpXG4iLAorCQkJICBFbGVtLT5Nc2dUeXBlKSk7CisJCWJyZWFrOwogCX0KIH0KIAotVk9JRCBDbnRsT2lkU2NhblByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsT2lkU2NhblByb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCU1MTUVfU0NBTl9SRVFfU1RSVUNUICAgICAgIFNjYW5SZXE7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgICAgQnNzSWR4ID0gQlNTX05PVF9GT1VORDsKLQlCU1NfRU5UUlkgICAgICAgICAgICAgICAgICBDdXJyQnNzOworCXN0cnVjdCBydF9tbG1lX3NjYW5fcmVxIFNjYW5SZXE7CisJdW5zaWduZWQgbG9uZyBCc3NJZHggPSBCU1NfTk9UX0ZPVU5EOworCXN0cnVjdCBydF9ic3NfZW50cnkgQ3VyckJzczsKIAotCS8vIHJlY29yZCBjdXJyZW50IEJTUyBpZiBuZXR3b3JrIGlzIGNvbm5lY3RlZC4KLQkvLyAyMDAzLTItMTMgZG8gbm90IGluY2x1ZGUgY3VycmVudCBJQlNTIGlmIHRoaXMgaXMgdGhlIG9ubHkgU1RBIGluIHRoaXMgSUJTUy4KLQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCXsKLQkJQnNzSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmQ3VyckJzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7CisJLyogcmVjb3JkIGN1cnJlbnQgQlNTIGlmIG5ldHdvcmsgaXMgY29ubmVjdGVkLiAqLworCS8qIDIwMDMtMi0xMyBkbyBub3QgaW5jbHVkZSBjdXJyZW50IElCU1MgaWYgdGhpcyBpcyB0aGUgb25seSBTVEEgaW4gdGhpcyBJQlNTLiAqLworCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpIHsKKwkJQnNzSWR4ID0KKwkJICAgIEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkgICAgICAgKHU4ICopcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkgICAgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisJCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkgeworCQkJTmRpc01vdmVNZW1vcnkoJkN1cnJCc3MsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9ic3NfZW50cnkpKTsKIAkJfQogCX0KLQotCS8vIGNsZWFuIHVwIHByZXZpb3VzIFNDQU4gcmVzdWx0LCBhZGQgY3VycmVudCBCU1MgYmFjayB0byB0YWJsZSBpZiBhbnkKKwkvKiBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55ICovCiAJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCS8vIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQKLQkJLy8gICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlCi0JCS8vICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUKLQkJLy8gICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4KLQkJLy8gVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQKLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKKwlpZiAoQnNzSWR4ICE9IEJTU19OT1RfRk9VTkQpIHsKKwkJLyogRERLIE5vdGU6IElmIHRoZSBOSUMgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBCU1NJRCBhbmQgU1NJRCAqLworCQkvKiAgICB0aGF0IGFyZSBub3QgY29udGFpbmVkIGluIHRoZSBsaXN0IG9mIEJTU0lEcyBnZW5lcmF0ZWQgYnkgdGhpcyBzY2FuLCB0aGUgKi8KKwkJLyogICAgQlNTSUQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIEJTU0lEIGFuZCBTU0lEIHNob3VsZCBiZSAqLworCQkvKiAgICBhcHBlbmRlZCB0byB0aGUgbGlzdCBvZiBCU1NJRHMgaW4gdGhlIE5JQydzIGRhdGFiYXNlLiAqLworCQkvKiBUbyBlbnN1cmUgdGhpcywgd2UgYXBwZW5kIHRoaXMgQlNTIGFzIHRoZSBmaXJzdCBlbnRyeSBpbiBTQ0FOIHJlc3VsdCAqLworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5WzBdLCAmQ3VyckJzcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc19lbnRyeSkpOwogCQlwQWQtPlNjYW5UYWIuQnNzTnIgPSAxOwogCX0KIAotCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAiIiwgMCwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOworCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAoY2hhciAqKUVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBCU1NfQU5ZLAorCQkgICAgIFNDQU5fQUNUSVZFKTsKIAlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsCi0JCXNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKKwkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSksICZTY2FuUmVxKTsKIAlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47CiB9CiAKQEAgLTMzMywxNzEgKzMyOSwxNzQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsT2lkU3NpZFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKK3ZvaWQgQ250bE9pZFNzaWRQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlQTkRJU184MDJfMTFfU1NJRCAgICAgICAgICBwT2lkU3NpZCA9IChORElTXzgwMl8xMV9TU0lEICopRWxlbS0+TXNnOwotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgIERpc2Fzc29jUmVxOwotCVVMT05HCQkJCQkgICBOb3c7CisJc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQgKiBwT2lkU3NpZCA9IChzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCAqKSBFbGVtLT5Nc2c7CisJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc2Fzc29jUmVxOworCXVuc2lnbmVkIGxvbmcgTm93OwogCi0jaWZkZWYgUlQyODYwCi0JLy8gQkJQIGFuZCBSRiBhcmUgbm90IGFjY2Vzc2libGUgaW4gUFMgbW9kZSwgd2UgaGFzIHRvIHdha2UgdGhlbSB1cCBmaXJzdAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBSVE1QX0hBTFQpOwotI2VuZGlmCi0KLQkvLyBTdGVwIDEuIHJlY29yZCB0aGUgZGVzaXJlZCB1c2VyIHNldHRpbmdzIHRvIE1sbWVBdXgKKwkvKiBTdGVwIDEuIHJlY29yZCB0aGUgZGVzaXJlZCB1c2VyIHNldHRpbmdzIHRvIE1sbWVBdXggKi8KIAlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKIAlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcE9pZFNzaWQtPlNzaWQsIHBPaWRTc2lkLT5Tc2lkTGVuZ3RoKTsKLQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IChVQ0hBUilwT2lkU3NpZC0+U3NpZExlbmd0aDsKKwlwQWQtPk1sbWVBdXguU3NpZExlbiA9ICh1OClwT2lkU3NpZC0+U3NpZExlbmd0aDsKIAlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7CiAJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOwogCisJcEFkLT5TdGFDZmcuYkF1dG9Db25uZWN0QnlCc3NpZCA9IEZBTFNFOwogCi0JLy8KLQkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCi0JLy8KKwkvKiAqLworCS8qIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4gKi8KKwkvKiAqLwogCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwKKwkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKIAlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKIAotCS8vIHN0ZXAgMi4gZmluZCBhbGwgbWF0Y2hpbmcgQlNTIGluIHRoZSBsYXN0ZXN0IFNDQU4gcmVzdWx0IChpbkJzc1RhYikKLQkvLyAgICAmIGxvZyB0aGVtIGludG8gTWxtZUF1eC5Tc2lkQnNzVGFiIGZvciBsYXRlci1vbiBpdGVyYXRpb24uIFNvcnQgYnkgUlNTSSBvcmRlcgotCUJzc1RhYmxlU3NpZFNvcnQocEFkLCAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJLyogc3RlcCAyLiBmaW5kIGFsbCBtYXRjaGluZyBCU1MgaW4gdGhlIGxhc3Rlc3QgU0NBTiByZXN1bHQgKGluQnNzVGFiKSAqLworCS8qICAgICYgbG9nIHRoZW0gaW50byBNbG1lQXV4LlNzaWRCc3NUYWIgZm9yIGxhdGVyLW9uIGl0ZXJhdGlvbi4gU29ydCBieSBSU1NJIG9yZGVyICovCisJQnNzVGFibGVTc2lkU29ydChwQWQsICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwKKwkJCSAoY2hhciAqKXBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gJWQgQlNTIG9mICVkIEJTUyBtYXRjaCB0aGUgZGVzaXJlICglZClTU0lEIC0gJXNcbiIsCi0JCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtICVkIEJTUyBvZiAlZCBCU1MgbWF0Y2ggdGhlIGRlc2lyZSAoJWQpU1NJRCAtICVzXG4iLAorCQkgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yLCBwQWQtPlNjYW5UYWIuQnNzTnIsCisJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CiAJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKIAogCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLQkJKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZExlbikgJiYKLQkJTmRpc0VxdWFsTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pICYmCi0JCU1BQ19BRERSX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpCi0JewotCQkvLyBDYXNlIDEuIGFscmVhZHkgY29ubmVjdGVkIHdpdGggYW4gQVAgd2hvIGhhcyB0aGUgZGVzaXJlZCBTU0lECi0JCS8vICAgICAgICAgd2l0aCBoaWdoZXN0IFJTU0kKKwkgICAgKHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4gPT0KKwkgICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWRMZW4pCisJICAgICYmIE5kaXNFcXVhbE1lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJICAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLlNzaWQsCisJCQkgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZExlbikKKwkgICAgJiYgTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkgICAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Cc3NpZCkpIHsKKwkJLyogQ2FzZSAxLiBhbHJlYWR5IGNvbm5lY3RlZCB3aXRoIGFuIEFQIHdobyBoYXMgdGhlIGRlc2lyZWQgU1NJRCAqLworCQkvKiAgICAgICAgIHdpdGggaGlnaGVzdCBSU1NJICovCiAKLQkJLy8gQWRkIGNoZWNraW5nIE1vZGUgIkxFQVAiIGZvciBDQ1ggMS4wCisJCS8qIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMCAqLwogCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQkJCSApICYmCi0JCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkJewotCQkJLy8gY2FzZSAxLjEgRm9yIFdQQSwgV1BBLVBTSywgaWYgdGhlIDF4IHBvcnQgaXMgbm90IHNlY3VyZWQsIHdlIGhhdmUgdG8gcmVkbwotCQkJLy8gICAgICAgICAgY29ubmVjdGlvbiBwcm9jZXNzCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8CisJCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8CisJCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJCSAgICApICYmCisJCSAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkgeworCQkJLyogY2FzZSAxLjEgRm9yIFdQQSwgV1BBLVBTSywgaWYgdGhlIDF4IHBvcnQgaXMgbm90IHNlY3VyZWQsIHdlIGhhdmUgdG8gcmVkbyAqLworCQkJLyogICAgICAgICAgY29ubmVjdGlvbiBwcm9jZXNzICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwKKwkJCQkJIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwKKwkJCQkgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwKKwkJCQkgICAgJkRpc2Fzc29jUmVxKTsKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5iQ29uZmlnQ2hhbmdlZCA9PSBUUlVFKQotCQl7Ci0JCQkvLyBjYXNlIDEuMiBJbXBvcnRhbnQgQ29uZmlnIGhhcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29ubmVjdCB0byB0aGUgc2FtZSBBUAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgQmVjYXVzZSBjb25maWcgY2hhbmdlZC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOworCQl9IGVsc2UgaWYgKHBBZC0+YkNvbmZpZ0NoYW5nZWQgPT0gVFJVRSkgeworCQkJLyogY2FzZSAxLjIgSW1wb3J0YW50IENvbmZpZyBoYXMgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gdGhlIHNhbWUgQVAgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIEJlY2F1c2UgY29uZmlnIGNoYW5nZWQuLi5cbiIpKTsKKwkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsCisJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJICAgIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSksCisJCQkJICAgICZEaXNhc3NvY1JlcSk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gY2FzZSAxLjMuIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBTU0lEIHdpdGggaGlnaGVzdCBSU1NJLgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGFscmVhZHkgd2l0aCB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfU1NJRCByZXF1ZXN0XG4iKSk7Ci0JCQkvLwotCQkJLy8gKEhDVCAxMi4xKSAxY193bGFuX21lZGlhZXZlbnRzIHJlcXVpcmVkCi0JCQkvLyBtZWRpYSBjb25uZWN0IGV2ZW50cyBhcmUgaW5kaWNhdGVkIHdoZW4gYXNzb2NpYXRpbmcgd2l0aCB0aGUgc2FtZSBBUAotCQkJLy8KLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCS8vCi0JCQkJLy8gU2luY2UgTWVkaWFTdGF0ZSBhbHJlYWR5IGlzIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCi0JCQkJLy8gV2UganVzdCBpbmRpY2F0ZSB0aGUgY29ubmVjdCBldmVudCBhZ2FpbiB0byBtZWV0IHRoZSBXSFFMIHJlcXVpcmVkLgotCQkJCS8vCi0JCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJfSBlbHNlIHsKKwkJCS8qIGNhc2UgMS4zLiBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NJRCB3aXRoIGhpZ2hlc3QgUlNTSS4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBhbHJlYWR5IHdpdGggdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX1NTSUQgcmVxdWVzdFxuIikpOworCQkJLyogKi8KKwkJCS8qIChIQ1QgMTIuMSkgMWNfd2xhbl9tZWRpYWV2ZW50cyByZXF1aXJlZCAqLworCQkJLyogbWVkaWEgY29ubmVjdCBldmVudHMgYXJlIGluZGljYXRlZCB3aGVuIGFzc29jaWF0aW5nIHdpdGggdGhlIHNhbWUgQVAgKi8KKwkJCS8qICovCisJCQlpZiAoSU5GUkFfT04ocEFkKSkgeworCQkJCS8qICovCisJCQkJLyogU2luY2UgTWVkaWFTdGF0ZSBhbHJlYWR5IGlzIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkICovCisJCQkJLyogV2UganVzdCBpbmRpY2F0ZSB0aGUgY29ubmVjdCBldmVudCBhZ2FpbiB0byBtZWV0IHRoZSBXSFFMIHJlcXVpcmVkLiAqLworCQkJCS8qICovCisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKIAkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJCQkJcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwICovCiAJCQl9CiAKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0gICAgICAgICAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0gICAgICAgICAgICB9CisJCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsCisJCQkJCQkmcEFkLT5NbG1lQXV4LkJzc2lkWzBdLCBOVUxMLAorCQkJCQkJMCk7CiAJCX0KLQl9Ci0JZWxzZSBpZiAoSU5GUkFfT04ocEFkKSkKLQl7Ci0JCS8vCi0JCS8vIEZvciBSVDYxCi0JCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCi0JCS8vIFJUNjEgbWF5IGxvc3QgU1NJRCwgYW5kIG5vdCBjb25uZWN0IHRvIE5EVEVTVF9XRVBfQVAyIGFuZCB3aWxsIGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYnkgQXV0b3JlY29ubmVjdAotCQkvLyBCdXQgbWVkaWEgc3RhdHVzIGlzIGNvbm5lY3RlZCwgc28gdGhlIFNTSUQgbm90IHJlcG9ydCBjb3JyZWN0bHkuCi0JCS8vCi0JCWlmICghU1NJRF9FUVVBTChwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKQotCQl7Ci0JCQkvLwotCQkJLy8gRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LgotCQkJLy8KKwl9IGVsc2UgaWYgKElORlJBX09OKHBBZCkpIHsKKwkJLyogKi8KKwkJLyogRm9yIFJUNjEgKi8KKwkJLyogWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkgKi8KKwkJLyogUlQ2MSBtYXkgbG9zdCBTU0lELCBhbmQgbm90IGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYW5kIHdpbGwgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBieSBBdXRvcmVjb25uZWN0ICovCisJCS8qIEJ1dCBtZWRpYSBzdGF0dXMgaXMgY29ubmVjdGVkLCBzbyB0aGUgU1NJRCBub3QgcmVwb3J0IGNvcnJlY3RseS4gKi8KKwkJLyogKi8KKwkJaWYgKCFTU0lEX0VRVUFMCisJCSAgICAocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJICAgICBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pKSB7CisJCQkvKiAqLworCQkJLyogRGlmZmVyZW50IFNTSUQgbWVhbnMgbm90IFJvYW1pbmcgY2FzZSwgc28gd2UgbGV0IExpbmtEb3duKCkgdG8gSW5kaWNhdGUgYSBkaXNjb25uZWN0IGV2ZW50LiAqLworCQkJLyogKi8KIAkJCXBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IFRSVUU7CiAJCX0KLQkJLy8gY2FzZSAyLiBhY3RpdmUgSU5GUkEgYXNzb2NpYXRpb24gZXhpc3RlbnQKLQkJLy8gICAgcm9hbWluZyBpcyBkb25lIHdpdGhpbiBtaW5pcG9ydCBkcml2ZXIsIG5vdGhpbmcgdG8gZG8gd2l0aCBjb25maWd1cmF0aW9uCi0JCS8vICAgIHV0aWxpdHkuIHNvIHVwb24gYSBuZXcgU0VUKE9JRF84MDJfMTFfU1NJRCkgaXMgcmVjZWl2ZWQsIHdlIGp1c3QKLQkJLy8gICAgZGlzYXNzb2NpYXRlIHdpdGggdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUCwKLQkJLy8gICAgdGhlbiBwZXJmb3JtIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggdGhpcyBuZXcgU1NJRCwgbm8gbWF0dGVyIHRoZQotCQkvLyAgICBuZXcvb2xkIFNTSUQgYXJlIHRoZSBzYW1lIG9yIG5vdC4KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKLQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CisJCS8qIGNhc2UgMi4gYWN0aXZlIElORlJBIGFzc29jaWF0aW9uIGV4aXN0ZW50ICovCisJCS8qICAgIHJvYW1pbmcgaXMgZG9uZSB3aXRoaW4gbWluaXBvcnQgZHJpdmVyLCBub3RoaW5nIHRvIGRvIHdpdGggY29uZmlndXJhdGlvbiAqLworCQkvKiAgICB1dGlsaXR5LiBzbyB1cG9uIGEgbmV3IFNFVChPSURfODAyXzExX1NTSUQpIGlzIHJlY2VpdmVkLCB3ZSBqdXN0ICovCisJCS8qICAgIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAsICovCisJCS8qICAgIHRoZW4gcGVyZm9ybSBhIG5ldyBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgbmV3IFNTSUQsIG5vIG1hdHRlciB0aGUgKi8KKwkJLyogICAgbmV3L29sZCBTU0lEIGFyZSB0aGUgc2FtZSBvciBub3QuICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAuLi5cbiIpKTsKKwkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7CiAJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAotCQkJCQlzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKKwkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwgJkRpc2Fzc29jUmVxKTsKIAkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwl9IGVsc2UgeworCQlpZiAoQURIT0NfT04ocEFkKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOwogCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCSAgICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CiAJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOwogCQl9CiAKIAkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9PSAwKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpICYmCi0JCQkocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgotCQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSA9PSBUUlVFKQotCQkJKQotCQl7Ci0JCQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOworCQkgICAgKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpICYmCisJCSAgICAocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgorCQkgICAgKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKQorCQkgICAgID09IFRSVUUpCisJCSAgICApIHsKKwkJCXN0cnVjdCBydF9tbG1lX3NjYW5fcmVxIFNjYW5SZXE7CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNudGxPaWRTc2lkUHJvYygpOkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IHNjYW5cbiIpKTsKLQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwgc2l6ZW9mKE1MTUVfU0NBTl9SRVFfU1RSVUNUKSwgJlNjYW5SZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7CisJCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgKGNoYXIgKilwQWQtPk1sbWVBdXguU3NpZCwKKwkJCQkgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLAorCQkJCSAgICAgU0NBTl9BQ1RJVkUpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEpLCAmU2NhblJlcSk7CisJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCSAgICBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwkJCS8qIFJlc2V0IE1pc3NlZCBzY2FuIG51bWJlciAqLwogCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CiAJCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKIAkJfQogCX0KIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAJRGVzY3JpcHRpb246CkBAIC01MDYsMTY1ICs1MDUsMTk2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bE9pZFJUQnNzaWRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCit2b2lkIENudGxPaWRSVEJzc2lkUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUxPTkcgICAgICAgQnNzSWR4OwotCVBVQ0hBUiAgICAgIHBPaWRCc3NpZCA9IChQVUNIQVIpRWxlbS0+TXNnOwotCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKLQlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICAgICAgSm9pblJlcTsKKwl1bnNpZ25lZCBsb25nIEJzc0lkeDsKKwl1OCAqcE9pZEJzc2lkID0gKHU4ICopRWxlbS0+TXNnOworCXN0cnVjdCBydF9tbG1lX2Rpc2Fzc29jX3JlcSBEaXNhc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9qb2luX3JlcSBKb2luUmVxOwogCi0JLy8gcmVjb3JkIHVzZXIgZGVzaXJlZCBzZXR0aW5ncworCS8qIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MgKi8KIAlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcE9pZEJzc2lkKTsKIAlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7CiAKLQkvLwotCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KLQkvLwotCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0KLQkvLyBmaW5kIHRoZSBkZXNpcmVkIEJTUyBpbiB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0IHRhYmxlCisJLyogZmluZCB0aGUgZGVzaXJlZCBCU1MgaW4gdGhlIGxhdGVzdCBTQ0FOIHJlc3VsdCB0YWJsZSAqLwogCUJzc0lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBPaWRCc3NpZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHJlcGx5IE5ESVNfU1RBVFVTX05PVF9BQ0NFUFRFRFxuIikpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOworCWlmIChCc3NJZHggPT0gQlNTX05PVF9GT1VORCkgeworCQlzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSBTY2FuUmVxOworCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiQ05UTCAtIEJTU0lEIG5vdCBmb3VuZC4gcmVwbHkgTkRJU19TVEFUVVNfTk9UX0FDQ0VQVEVEXG4iKSk7CisJCS8qcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsgKi8KKworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHN0YXJ0IGEgbmV3IHNjYW5cbiIpKTsKKwkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChjaGFyICopcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfc2Nhbl9yZXEpLCAmU2NhblJlcSk7CisJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKKwkJLyogUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyICovCisJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSk7CiAJCXJldHVybjsKIAl9CisJLyogKi8KKwkvKiBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuICovCisJLyogKi8KKwlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CisJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0KKwkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsCisJCSAgICAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkLAorCQkgICAgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbik7CiAKLQkvLyBjb3B5IHRoZSBtYXRjaGVkIEJTUyBlbnRyeSBmcm9tIFNjYW5UYWIgdG8gTWxtZUF1eC5Tc2lkQnNzVGFiLiBXaHk/Ci0JLy8gQmVjYXVzZSB3ZSBuZWVkIHRoaXMgZW50cnkgdG8gYmVjb21lIHRoZSBKT0lOIHRhcmdldCBpbiBsYXRlciBvbiBTWU5DIHN0YXRlIG1hY2hpbmUKKwkvKiBjb3B5IHRoZSBtYXRjaGVkIEJTUyBlbnRyeSBmcm9tIFNjYW5UYWIgdG8gTWxtZUF1eC5Tc2lkQnNzVGFiLiBXaHk/ICovCisJLyogQmVjYXVzZSB3ZSBuZWVkIHRoaXMgZW50cnkgdG8gYmVjb21lIHRoZSBKT0lOIHRhcmdldCBpbiBsYXRlciBvbiBTWU5DIHN0YXRlIG1hY2hpbmUgKi8KIAlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKIAlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IDE7Ci0JTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKKwlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0sCisJCSAgICAgICAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihzdHJ1Y3QgcnRfYnNzX2VudHJ5KSk7CiAKLQkvLyAyMDAyLTExLTI2IHNraXAgdGhlIGZvbGxvd2luZyBjaGVja2luZy4gaS5lLiBpZiB1c2VyIHdhbnRzIHRvIHJlLWNvbm5lY3QgdG8gc2FtZSBBUAotCS8vICAgd2UganVzdCBmb2xsb3cgbm9ybWFsIHByb2NlZHVyZS4gVGhlIHJlYXNvbiBvZiB1c2VyIGRvaW5nIHRoaXMgbWF5IGJlY2F1c2UgaGUvc2hlIGNoYW5nZWQKLQkvLyAgIEFQIHRvIGFub3RoZXIgY2hhbm5lbCwgYnV0IHdlIHN0aWxsIHJlY2VpdmVkIEJFQUNPTiBmcm9tIGl0IHRodXMgZG9uJ3QgY2xhaW0gTGluayBEb3duLgotCS8vICAgU2luY2UgdXNlciBrbm93cyBoZSdzIGNoYW5nZWQgQVAgY2hhbm5lbCwgaGUnbGwgcmUtY29ubmVjdCBhZ2Fpbi4gQnkgc2tpcHBpbmcgdGhlIGZvbGxvd2luZwotCS8vICAgY2hlY2tpbmcsIHdlJ2xsIGRpc2Fzc29jaWF0ZSB0aGVuIHJlLWRvIG5vcm1hbCBhc3NvY2lhdGlvbiB3aXRoIHRoaXMgQVAgYXQgdGhlIG5ldyBjaGFubmVsLgotCS8vIDIwMDMtMS02IFJlLWVuYWJsZSB0aGlzIGZlYXR1cmUgYmFzZWQgb24gbWljcm9zb2Z0IHJlcXVpcmVtZW50IHdoaWNoIHByZWZlciBub3QgdG8gcmUtZG8KLQkvLyAgIGNvbm5lY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzYW1lIEJTU0lELgotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLQkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBPaWRCc3NpZCkpCisJLyogQWRkIFNTSUQgaW50byBNbG1lQXV4IGZvciBzaXRlIHN1cmV5IGpvaW5pbmcgaGlkZGVuIFNTSUQgKi8KKwlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWRMZW47CisJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLlNzaWQsCisJCSAgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CisKIAl7Ci0JCS8vIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBzYW1lIEJTU0lELCBnbyBiYWNrIHRvIGlkbGUgc3RhdGUgZGlyZWN0bHkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGFscmVhZHkgaW4gdGhpcyBCU1NJRC4gaWdub3JlIHRoaXMgU0VUX0JTU0lEIHJlcXVlc3RcbiIpKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLQotICAgICAgICAgICAgICAgIG1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0KLSAgICAgICAgICAgIH0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKElORlJBX09OKHBBZCkpCi0JCXsKLQkJCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgLi4uXG4iKSk7Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAotCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CisJCQkvKiBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIC4uLlxuIikpOworCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwKKwkJCQkJIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJCQkgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwKKwkJCQkgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwKKwkJCQkgICAgJkRpc2Fzc29jUmVxKTsKIAogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChBREhPQ19PTihwQWQpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChBREhPQ19PTihwQWQpKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIkNOVEwgLSBkcm9wIGN1cnJlbnQgQURIT0NcbiIpKTsKIAkJCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CisJCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQkgICAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CiAJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQyFcbiIpKTsKKwkJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEMhXG4iKSk7CiAJCQl9Ci0KLQkJCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cwotCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwotCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJLyogQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzICovCisJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOworCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CiAJCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CiAKLQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJCS8vIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZwotCQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZwotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCQkJLyogQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZyAqLworCQkJLyogU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nICovCisJCQkvKiBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nICovCisJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSB7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuCisJCQkJICAgIEdyb3VwQ2lwaGVyOwogCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOwotCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OwotCQkJCWVsc2UJLy8gVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCSAgICBQYWlyQ2lwaGVyKQorCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCQkJICAgIFBhaXJDaXBoZXI7CisJCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCQkgUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJCQkgICAgUGFpckNpcGhlckF1eDsKKwkJCQllbHNlCS8qIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUCAqLworCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0KKwkJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQkJfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSB7CisJCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPQorCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLgorCQkJCSAgICBHcm91cENpcGhlcjsKKworCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkgICAgUGFpckNpcGhlcikKKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLgorCQkJCQkgICAgUGFpckNpcGhlcjsKKwkJCQllbHNlIGlmIChwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLgorCQkJCQkgUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCisJCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkJICAgIFBhaXJDaXBoZXJBdXg7CisJCQkJZWxzZQkvKiBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAgKi8KKwkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkJLyogUlNOIGNhcGFiaWxpdHkgKi8KKwkJCQlwQWQtPlN0YUNmZy5Sc25DYXBhYmlsaXR5ID0KKwkJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCQkgICAgUnNuQ2FwYWJpbGl0eTsKIAkJCX0KLQkJCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLkdyb3VwQ2lwaGVyOwotCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7Ci0JCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eDsKLQkJCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQotCQkJCS8vIFJTTiBjYXBhYmlsaXR5Ci0JCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKLQkJCX0KLQotCQkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZwotCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKLQkJCWlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCi0JCQl7Ci0JCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKLQkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7Ci0JCQl9Ci0JCQkvLyBObyBhY3RpdmUgYXNzb2NpYXRpb24sIGpvaW4gdGhlIEJTUyBpbW1lZGlhdGVseQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW5pbmcgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBPaWRCc3NpZFswXSxwT2lkQnNzaWRbMV0scE9pZEJzc2lkWzJdLHBPaWRCc3NpZFszXSxwT2lkQnNzaWRbNF0scE9pZEJzc2lkWzVdKSk7CisJCQkvKiBTZXQgTWl4IGNpcGhlciBmbGFnICovCisJCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0KKwkJCSAgICAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PQorCQkJICAgICBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7CisJCQkvKmlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCisJCQkgICB7CisJCQkgICAvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQorCQkJICAgUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOworCQkJICAgfSAqLworCQkJLyogTm8gYWN0aXZlIGFzc29jaWF0aW9uLCBqb2luIHRoZSBCU1MgaW1tZWRpYXRlbHkgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBqb2luaW5nICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKKwkJCQkgIHBPaWRCc3NpZFswXSwgcE9pZEJzc2lkWzFdLCBwT2lkQnNzaWRbMl0sCisJCQkJICBwT2lkQnNzaWRbM10sIHBPaWRCc3NpZFs0XSwgcE9pZEJzc2lkWzVdKSk7CiAKIAkJCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBwQWQtPk1sbWVBdXguQnNzSWR4KTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwgJkpvaW5SZXEpOworCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfam9pbl9yZXEpLCAmSm9pblJlcSk7CiAKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKIAkJfQogCX0KIH0KIAotLy8gUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lCi0vLyBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMKLS8vIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZQotLy8gdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4KLS8vIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPwotLy8gb3IgYmVlbiBjb3JydXB0ZWQgYnkgb3RoZXIgIlNFVCBPSUQiPwotLy8KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKKy8qIFJvYW1pbmcgaXMgdGhlIG9ubHkgZXh0ZXJuYWwgcmVxdWVzdCB0cmlnZ2VyaW5nIENOVEwgc3RhdGUgbWFjaGluZSAqLworLyogZGVzcGl0ZSBvZiBvdGhlciAiU0VUIE9JRCIgb3BlcmF0aW9uLiBBbGwgIlNFVCBPSUQiIHJlbGF0ZWQgb2VyYXRpb25zICovCisvKiBoYXBwZW4gaW4gc2VxdWVuY2UsIGJlY2F1c2Ugbm8gb3RoZXIgU0VUIE9JRCB3aWxsIGJlIHNlbnQgdG8gdGhpcyBkZXZpY2UgKi8KKy8qIHVudGlsIHRoZSB0aGUgcHJldmlvdXMgU0VUIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSAoc3VjY2Vzc2Z1bCBvIGZhaWxlZCkuICovCisvKiBTbywgaG93IGRvIHdlIHF1YXJhbnRlZSB0aGlzIFJPQU1JTkcgcmVxdWVzdCB3b24ndCBjb3JydXB0IG90aGVyICJTRVQgT0lEIj8gKi8KKy8qIG9yIGJlZW4gY29ycnVwdGVkIGJ5IG90aGVyICJTRVQgT0lEIj8gKi8KKy8qICovCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgQ250bE1sbWVSb2FtaW5nUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JLy8gVE9ETzoKLQkvLyBBUCBpbiBkaWZmZXJlbnQgY2hhbm5lbCBtYXkgc2hvdyBsb3dlciBSU1NJIHRoYW4gYWN0dWFsIHZhbHVlPz8KLQkvLyBzaG91bGQgd2UgYWRkIGEgd2VpZ2h0aW5nIGZhY3RvciB0byBjb21wZW5zYXRlIGl0PwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIFJvYW1pbmcgaW4gTWxtZUF1eC5Sb2FtVGFiLi4uXG4iKSk7CisJdTggQkJQVmFsdWUgPSAwOwogCi0JTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCAmcEFkLT5NbG1lQXV4LlJvYW1UYWIsIHNpemVvZihwQWQtPk1sbWVBdXguUm9hbVRhYikpOwotCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnI7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJvYW1pbmcgaW4gTWxtZUF1eC5Sb2FtVGFiLi4uXG4iKSk7CiAKLQlCc3NUYWJsZVNvcnRCeVJzc2koJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiKTsKLQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKLQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwl7CisJCS8qTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyAoZmFzdCkgcm9hbWluZy4gKi8KKwkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOworCQlCQlBWYWx1ZSAmPSAofjB4MTgpOworCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKKwkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLCAmcEFkLT5NbG1lQXV4LlJvYW1UYWIsCisJCQkgICAgICAgc2l6ZW9mKHBBZC0+TWxtZUF1eC5Sb2FtVGFiKSk7CisJCXBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yID0gcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnI7CisKKwkJQnNzVGFibGVTb3J0QnlSc3NpKCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYik7CisJCXBBZC0+TWxtZUF1eC5Cc3NJZHggPSAwOworCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKKwl9CiB9CiAKIC8qCkBAIC02NzUsMzQgKzcwNSwzNSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXREaXNhc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCU1MTUVfU1RBUlRfUkVRX1NUUlVDVCAgICAgU3RhcnRSZXE7CisJc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxIFN0YXJ0UmVxOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCi0JeworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9ESVNBU1NPQ19DT05GKSB7CiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWxcbiIpKTsKIAotCSAgICBpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCXsKLQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfRElTQVNTT0NfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CiAJCX0KIAogCQlMaW5rRG93bihwQWQsIEZBTFNFKTsKIAotCQkvLyBjYXNlIDEuIG5vIG1hdGNoaW5nIEJTUywgYW5kIHVzZXIgd2FudHMgQURIT0MsIHNvIHdlIGp1c3Qgc3RhcnQgYSBuZXcgb25lCi0JCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnI9PTApICYmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOwotCQkJU3RhcnRQYXJtRmlsbChwQWQsICZTdGFydFJlcSwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCQkvKiBjYXNlIDEuIG5vIG1hdGNoaW5nIEJTUywgYW5kIHVzZXIgd2FudHMgQURIT0MsIHNvIHdlIGp1c3Qgc3RhcnQgYSBuZXcgb25lICovCisJCWlmICgocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPT0gMCkKKwkJICAgICYmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBObyBtYXRjaGluZyBCU1MsIHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoY2hhciAqKXBBZC0+TWxtZUF1eC5Tc2lkLAorCQkJCSAgICAgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKKwkJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEpLCAmU3RhcnRSZXEpOwogCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9TVEFSVDsKIAkJfQotCQkvLyBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTCi0JCWVsc2UKLQkJeworCQkvKiBjYXNlIDIuIHRyeSBlYWNoIG1hdGNoZWQgQlNTICovCisJCWVsc2UgewogCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7CiAKIAkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwpAQCAtNzE4LDc0ICs3NDksODEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsV2FpdEpvaW5Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgQ250bFdhaXRKb2luUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKLQlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgQXV0aFJlcTsKKwl1MTYgUmVhc29uOworCXN0cnVjdCBydF9tbG1lX2F1dGhfcmVxIEF1dGhSZXE7CiAKLQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7Ci0JCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQotCQl7Ci0JCQkvLyAxLiBqb2luZWQgYW4gSUJTUywgd2UgYXJlIHByZXR0eSBtdWNoIGRvbmUgaGVyZQotCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXsKLQkJCSAgICAvLwotCQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgotCQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KLQkJCQkvLwotCQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCSAgICkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9KT0lOX0NPTkYpIHsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YodTE2KSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKSB7CisJCQkvKiAxLiBqb2luZWQgYW4gSUJTUywgd2UgYXJlIHByZXR0eSBtdWNoIGRvbmUgaGVyZSAqLworCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19BREhPQykgeworCQkJCS8qICovCisJCQkJLyogNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46ICovCisJCQkJLyogQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLiAqLworCQkJCS8qICovCisJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorCQkJCSAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsCisJCQkJCQkgICAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkJCSAgICApIHsKKwkJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJCSAgICBDTlRMX0lETEU7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQ05UTCAtIENoYW5uZWw9JWQsIEpvaW4gYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLAorCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAKIAkJCQlMaW5rVXAocEFkLCBCU1NfQURIT0MpOwogCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGpvaW4gdGhlIElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCi0JCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbMF0scEFkLT5Db21tb25DZmcuQnNzaWRbMV0scEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCi0JCQkJcEFkLT5Db21tb25DZmcuQnNzaWRbM10scEFkLT5Db21tb25DZmcuQnNzaWRbNF0scEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiQ05UTCAtIGpvaW4gdGhlIElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbMF0sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbM10sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCisJCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKIAotICAgICAgICAgICAgICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7CisJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKIAkJCX0KLQkJCS8vIDIuIGpvaW5lZCBhIG5ldyBJTkZSQSBuZXR3b3JrLCBzdGFydCBmcm9tIGF1dGhlbnRpY2F0aW9uCi0JCQllbHNlCi0JCQl7CisJCQkvKiAyLiBqb2luZWQgYSBuZXcgSU5GUkEgbmV0d29yaywgc3RhcnQgZnJvbSBhdXRoZW50aWNhdGlvbiAqLworCQkJZWxzZSB7CiAJCQkJewotCQkJCQkvLyBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0Ci0JCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSB8fAotCQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQotCQkJCQl7Ci0JCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpOworCQkJCQkvKiBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0ICovCisJCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQkJCSAgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCQkJCU5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKSB7CisJCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwKKwkJCQkJCQkgICAgIHBBZC0+TWxtZUF1eC5Cc3NpZCwKKwkJCQkJCQkgICAgIEFVVEhfTU9ERV9LRVkpOworCQkJCQl9IGVsc2UgeworCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsCisJCQkJCQkJICAgICBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkJICAgICBBVVRIX01PREVfT1BFTik7CiAJCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKLQkJCQkJfQorCQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwKKwkJCQkJCSAgICBNVDJfTUxNRV9BVVRIX1JFUSwKKwkJCQkJCSAgICBzaXplb2YKKwkJCQkJCSAgICAoc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEpLAorCQkJCQkJICAgICZBdXRoUmVxKTsKIAkJCQl9Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKIAotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVVUSDsKKwkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0KKwkJCQkgICAgQ05UTF9XQUlUX0FVVEg7CiAJCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyAzLiBmYWlsZWQsIHRyeSBuZXh0IEJTUworCQl9IGVsc2UgeworCQkJLyogMy4gZmFpbGVkLCB0cnkgbmV4dCBCU1MgKi8KIAkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKIAkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwogCQl9CiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAlEZXNjcmlwdGlvbjoKQEAgLTc5NCw3NCArODMyLDg2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRTdGFydFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdFN0YXJ0UHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgUmVzdWx0OworCXUxNiBSZXN1bHQ7CiAKLQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU1RBUlRfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkgICAgLy8KLQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgotCQkJLy8gQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLgotCQkJLy8KLQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkgICApCi0JCQl7CisJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1NUQVJUX0NPTkYpIHsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YodTE2KSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKSB7CisJCQkvKiAqLworCQkJLyogNUcgYmFuZHMgcnVsZXMgb2YgSmFwYW46ICovCisJCQkvKiBBZCBob2MgbXVzdCBiZSBkaXNhYmxlZCBpbiBXNTMoY2g1Miw1Niw2MCw2NCkgY2hhbm5lbHMuICovCisJCQkvKiAqLworCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJgorCQkJICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKKwkJCSAgICApIHsKIAkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBTdGFydCBhZGhvYyBvbiBXNTMoNTIsNTYsNjAsNjQpIENoYW5uZWxzIGFyZSBub3QgYWNjZXB0ZWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiQ05UTCAtIENoYW5uZWw9JWQsIFN0YXJ0IGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7CiAJCQkJcmV0dXJuOwogCQkJfQotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJeworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJICAgICAgIE1DU1NldFswXSwgMTYpOworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgewogCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7CiAJCQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0JCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwgMTYpOwotCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywKKwkJCQkJICAgICAgICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CisJCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELAorCQkJCQkgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKKwkJCQkJICAgICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0KKwkJCQkgICAgVFJVRTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby4KKwkJCQkJICAgICAgIE1DU1NldFswXSwKKwkJCQkJICAgICAgICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuCisJCQkJCSAgICAgICBNQ1NTZXRbMF0sIDE2KTsKKwkJCQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHCisJCQkJICAgIChwQWQpOwogCi0JCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCi0JCQkJCShwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOworCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkgICAgIENoYW5uZWxXaWR0aCA9PSBCV180MCkKKwkJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uCisJCQkJCUV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkgeworCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPQorCQkJCQkgICAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7CisJCQkJfSBlbHNlCisJCQkJICAgIGlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby4KKwkJCQkJIENoYW5uZWxXaWR0aCA9PSBCV180MCkKKwkJCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uCisJCQkJCSAgICBFeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpIHsKKwkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0KKwkJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwogCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgotCQkJCQkJIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJfSBlbHNlIHsKKwkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9CisJCQkJICAgIEZBTFNFOwogCQkJfQogCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQkvLyBCZWZvcmUgc2VuZCBiZWFjb24sIGRyaXZlciBuZWVkIGRvIHJhZGFyIGRldGVjdGlvbgotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQgKQotCQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkJCSYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfU0lMRU5DRV9NT0RFOworCQkJLyogQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24gKi8KKwkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQorCQkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQorCQkJICAgICYmIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpIHsKKwkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPQorCQkJCSAgICBSRF9TSUxFTkNFX01PREU7CiAJCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCA9IDA7CiAJCQl9CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBzdGFydCBhIG5ldyBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gU3RhcnQgSUJTUyBmYWlsLiBCVUchISEhIVxuIikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIHN0YXJ0IGEgbmV3IElCU1MgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCisJCQkJICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pKTsKKwkJfSBlbHNlIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBTdGFydCBJQlNTIGZhaWwuIEJVRyFcbiIpKTsKIAkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CiAJCX0KIAl9CkBAIC04NzUsNTIgKzkyNSw1NyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIENudGxXYWl0QXV0aFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdEF1dGhQcm9jKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKLQlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOwotCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKKwl1MTYgUmVhc29uOworCXN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSBBc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSBBdXRoUmVxOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJeworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpIHsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YodTE2KSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKSB7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOwotCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJkFzc29jUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJICAgICAgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAorCQkJCSAgICAgIEFTU09DX1RJTUVPVVQsCisJCQkJICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50KTsKIAogCQkJewotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwKKwkJCQkJICAgIE1UMl9NTE1FX0FTU09DX1JFUSwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEpLAorCQkJCQkgICAgJkFzc29jUmVxKTsKIAotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfQVNTT0M7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9CisJCQkJICAgIENOVExfV0FJVF9BU1NPQzsKIAkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFRoaXMgZmFpbCBtYXkgYmVjYXVzZSBvZiB0aGUgQVAgYWxyZWFkeSBrZWVwIHVzIGluIGl0cyBNQUMgdGFibGUgd2l0aG91dAotCQkJLy8gYWdlaW5nLW91dC4gVGhlIHByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHQgbXVzdCBoYXZlIGxldCBpdCByZW1vdmUgdXMuCi0JCQkvLyBzbyB0cnkgQXV0aGVudGljYXRpb24gYWdhaW4gbWF5IGhlbHAuIEZvciBELUxpbmsgRFdMLTkwMEFQKyBjb21wYXRpYmlsaXR5LgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IGFnYWluLi4uXG4iKSk7CisJCX0gZWxzZSB7CisJCQkvKiBUaGlzIGZhaWwgbWF5IGJlY2F1c2Ugb2YgdGhlIEFQIGFscmVhZHkga2VlcCB1cyBpbiBpdHMgTUFDIHRhYmxlIHdpdGhvdXQgKi8KKwkJCS8qIGFnZWluZy1vdXQuIFRoZSBwcmV2aW91cyBhdXRoZW50aWNhdGlvbiBhdHRlbXB0IG11c3QgaGF2ZSBsZXQgaXQgcmVtb3ZlIHVzLiAqLworCQkJLyogc28gdHJ5IEF1dGhlbnRpY2F0aW9uIGFnYWluIG1heSBoZWxwLiBGb3IgRC1MaW5rIERXTC05MDBBUCsgY29tcGF0aWJpbGl0eS4gKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBBVVRIIEZBSUwsIHRyeSBhZ2Fpbi4uLlxuIikpOwogCiAJCQl7Ci0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8Ci0JCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkKLQkJCQl7Ci0JCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKLQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKTsKKwkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCisJCQkJICAgIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCQlOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSkgeworCQkJCQkvKiBlaXRoZXIgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkIG9yIE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gsIHRyeSBzaGFyZWQga2V5IGZpcnN0ICovCisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLAorCQkJCQkJICAgICBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkgICAgIEFVVEhfTU9ERV9LRVkpOworCQkJCX0gZWxzZSB7CisJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLAorCQkJCQkJICAgICBwQWQtPk1sbWVBdXguQnNzaWQsCisJCQkJCQkgICAgIEFVVEhfTU9ERV9PUEVOKTsKIAkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7Ci0JCQkJfQotCQkJfQotCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOworCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLAorCQkJCQkgICAgTVQyX01MTUVfQVVUSF9SRVEsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEpLAorCQkJCQkgICAgJkF1dGhSZXEpOwogCisJCQl9CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOwogCQl9CiAJfQpAQCAtOTM0LDQ0ICs5ODksNDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIENudGxXYWl0QXV0aFByb2MyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgIFJlYXNvbjsKLQlNTE1FX0FTU09DX1JFUV9TVFJVQ1QgICAgICAgIEFzc29jUmVxOwotCU1MTUVfQVVUSF9SRVFfU1RSVUNUICAgICAgICAgQXV0aFJlcTsKKwl1MTYgUmVhc29uOworCXN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSBBc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9hdXRoX3JlcSBBdXRoUmVxOwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJeworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BVVRIX0NPTkYpIHsKKwkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YodTE2KSk7CisJCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKSB7CiAJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOwotCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgotCQkJCSAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpKQorCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLAorCQkJCSAgICAgIHBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbywKKwkJCQkgICAgICBBU1NPQ19USU1FT1VULAorCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CiAJCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7Ci0JCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTmRpczgwMl8xMUF1dGhNb2RlT3Blbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBVVRIX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FVVEhfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FVVEhfUkVRX1NUUlVDVCksICZBdXRoUmVxKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsCisJCQkJCSAgICBNVDJfTUxNRV9BU1NPQ19SRVEsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfYXNzb2NfcmVxKSwKKwkJCQkJICAgICZBc3NvY1JlcSk7CiAKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCSAgICBDTlRMX1dBSVRfQVNTT0M7CiAJCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gbm90IHN1Y2Nlc3MsIHRyeSBuZXh0IEJTUwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBVVRIIEZBSUwsIGdpdmUgdXA7IHRyeSBuZXh0IEJTU1xuIikpOwotCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7IC8vPz8/Pz8/PworCQl9IGVsc2UgeworCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQorCQkJICAgICYmIChwQWQtPk1sbWVBdXguQWxnID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiQ05UTCAtIEFVVEggRkFJTCwgdHJ5IE9QRU4gc3lzdGVtLi4uXG4iKSk7CisJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwKKwkJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKKwkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwKKwkJCQkJICAgIE1UMl9NTE1FX0FVVEhfUkVRLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2F1dGhfcmVxKSwKKwkJCQkJICAgICZBdXRoUmVxKTsKKworCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPQorCQkJCSAgICBDTlRMX1dBSVRfQVVUSDI7CisJCQl9IGVsc2UgeworCQkJCS8qIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MgKi8KKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiQ05UTCAtIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7CisJCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsJLyo/Pz8/Pz8/ICovCiAJCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOwogCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwogCQkJfQpAQCAtOTg3LDMwICsxMDQ3LDMwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRBc3NvY1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBDbnRsV2FpdEFzc29jUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVVNIT1JUICAgICAgUmVhc29uOworCXUxNiBSZWFzb247CiAKLQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVNTT0NfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJeworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9BU1NPQ19DT05GKSB7CisJCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKHUxNikpOworCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSB7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCQkJICAgICAgQlNTMCwgMCk7CisJCQl9CisKIAkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFzc29jaWF0aW9uIHN1Y2Nlc3NmdWwgb24gQlNTICMlbGRcbiIscEFkLT5NbG1lQXV4LkJzc0lkeCkpOwotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQl7Ci0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gQXNzb2NpYXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MgKi8KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBBc3NvY2lhdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKIAkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKIAkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwogCQl9CkBAIC0xMDI1LDUyICsxMDg1LDUxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIENudGxXYWl0UmVhc3NvY1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCAgICAgIFJlc3VsdDsKKwl1MTYgUmVzdWx0OwogCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1JFQVNTT0NfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJLy8KLQkJCS8vIE5ESVMgcmVxdWlyZXMgYSBuZXcgTGluayBVUCBpbmRpY2F0aW9uIGJ1dCBubyBMaW5rIERvd24gZm9yIFJFLUFTU09DCi0JCQkvLworCWlmIChFbGVtLT5Nc2dUeXBlID09IE1UMl9SRUFTU09DX0NPTkYpIHsKKwkJTmRpc01vdmVNZW1vcnkoJlJlc3VsdCwgRWxlbS0+TXNnLCBzaXplb2YodTE2KSk7CisJCWlmIChSZXN1bHQgPT0gTUxNRV9TVUNDRVNTKSB7CisJCQkvKiBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGFzc29jaWF0aW9uICovCisJCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfQVNTT0NfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCQkJICAgICAgQlNTMCwgMCk7CisKKwkJCS8qICovCisJCQkvKiBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQyAqLworCQkJLyogKi8KIAkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7CiAKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgYXNzb2NpYXRpb24KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCiAJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFJlLWFzc29jaXRpb24gc3VjY2Vzc2Z1bCBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKLQkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7Ci0JCQlJdGVyYXRlT25Cc3NUYWIyKHBBZCk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLAorCQkJCSAgcEFkLT5NbG1lQXV4LlJvYW1JZHgpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlYXNzb2MgZmFpbGVkLCB0cnkgdG8gcGljayBuZXh0IEJTUyBpbiB0aGUgQlNTIFRhYmxlICovCisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5Sb2FtSWR4KSk7CisJCQl7CisJCQkJcEFkLT5NbG1lQXV4LlJvYW1JZHgrKzsKKwkJCQlJdGVyYXRlT25Cc3NUYWIyKHBBZCk7CisJCQl9CiAJCX0KIAl9CiB9CiAKLQotI2lmZGVmIFJUMjg3MAotVk9JRAlBZGhvY1R1cm5PblFvcygKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEFkaG9jVHVybk9uUW9zKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKICNkZWZpbmUgQUMwX0RFRl9UWE9QCQkwCiAjZGVmaW5lIEFDMV9ERUZfVFhPUAkJMAogI2RlZmluZSBBQzJfREVGX1RYT1AJCTk0CiAjZGVmaW5lIEFDM19ERUZfVFhPUAkJNDcKIAotCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7CisJLyogVHVybiBvbiBRT3MgaWYgdXNlIEhUIHJhdGUuICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7CiAJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OwpAQCAtMTA4NywxNCArMTE0NiwxMyBAQAogCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKIAkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7CiAKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gQUMyX0RFRl9UWE9QOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gQUMzX0RFRl9UWE9QOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gPSAwOworCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gPSBBQzJfREVGX1RYT1A7CisJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFszXSA9IEFDM19ERUZfVFhPUDsKIAl9CiAJQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwogfQotI2VuZGlmIC8qIFJUMjg3MCAqLwogCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMTA0LDExMCArMTE2Miw4MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIExpbmtVcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBCc3NUeXBlKQordm9pZCBMaW5rVXAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBCc3NUeXBlKQogewotCVVMT05HCU5vdzsKLQlVSU5UMzIJRGF0YTsKLQlCT09MRUFOCUNhbmNlbGxlZDsKLQlVQ0hBUglWYWx1ZSA9IDAsIGlkeDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEwsICpwQ3VyckVudHJ5OworCXVuc2lnbmVkIGxvbmcgTm93OworCXUzMiBEYXRhOworCUJPT0xFQU4gQ2FuY2VsbGVkOworCXU4IFZhbHVlID0gMCwgaWR4ID0gMCwgSGFzaElkeCA9IDA7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnkgPSBOVUxMOwogCi0jaWZkZWYgUlQyODYwCi0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkpCi0JewotCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9IQUxUKTsKLQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisJLyogSW5pdCBDaGFubmVsUXVhbGl0eSB0byBwcmV2ZW50IERFQURfQ1FJIGF0IGluaXRpYWwgTGlua1VwICovCisJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gNTA7CisKKwlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlpZiAocEVudHJ5KSB7CisJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKKwkJcEVudHJ5ID0gTlVMTDsKIAl9Ci0jZW5kaWYKIAogCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwogCi0JLy8KLQkvLyBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbgotCS8vIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwKLQkvLyAhISEgTElOSyBET1dOICEhIQotCS8vIFs4ODg4OF0gT0lEXzgwMl8xMV9TU0lEIHNob3VsZCBoYXZlIHJldHVybmVkIE5EVEVTVF9XRVBfQVAyKFJldHVybmVkOiApCi0JLy8KLQkvLyBUbyBwcmV2ZW50IERpc2Fzc29jVGltZW91dEFjdGlvbiB0byBjYWxsIExpbmsgZG93biBhZnRlciB3ZSBsaW5rIHVwLAotCS8vIGNhbmNlbCB0aGUgRGlzYXNzb2NUaW1lciBubyBtYXR0ZXIgd2hhdCBpdCBzdGFydCBvciBub3QuCi0JLy8KLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7CisJLyogKi8KKwkvKiBBU1NPQyAtIERpc2Fzc29jVGltZW91dEFjdGlvbiAqLworCS8qIENOVEwgLSBEaXMtYXNzb2NpYXRlIHN1Y2Nlc3NmdWwgKi8KKwkvKiAhIExJTksgRE9XTiAhICovCisJLyogWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkgKi8KKwkvKiAqLworCS8qIFRvIHByZXZlbnQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uIHRvIGNhbGwgTGluayBkb3duIGFmdGVyIHdlIGxpbmsgdXAsICovCisJLyogY2FuY2VsIHRoZSBEaXNhc3NvY1RpbWVyIG5vIG1hdHRlciB3aGF0IGl0IHN0YXJ0IG9yIG5vdC4gKi8KKwkvKiAqLworCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICZDYW5jZWxsZWQpOwogCiAJQ09QWV9TRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKIAogCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKIAotCS8vIEl0J3MgcXVpdGUgZGlmZmljdWx0IHRvIHRlbGwgaWYgYSBuZXdseSBhZGRlZCBLRVkgaXMgV0VQIG9yIENLSVAgdW50aWwgYSBuZXcgQlNTCi0JLy8gaXMgZm9ybWVkIChlaXRoZXIgQVNTT0MvUkUtQVNTT0MgZG9uZSBvciBJQlNTIHN0YXJ0ZWQuIExpbmtVUCBzaG91bGQgYmUgYSBzYWZlIHBsYWNlCi0JLy8gdG8gZXhhbWluZSBpZiBjaXBoZXIgYWxnb3JpdGhtIHN3aXRjaGluZyBpcyByZXF1aXJlZC4KLQkvL3J0Mjg2MGIuIERvbid0IGtub3cgd2h5IG5lZWQgdGhpcwotCVN3aXRjaEJldHdlZW5XZXBBbmRDa2lwKHBBZCk7Ci0KLSNpZmRlZiBSVDI4NjAKLQkvLyBCZWZvcmUgcG93ZXIgc2F2ZSBiZWZvcmUgbGluayB1cCBmdW5jdGlvbiwgV2Ugd2lsbCBmb3JjZSB1c2UgMVIuCi0JLy8gU28gYWZ0ZXIgbGluayB1cCwgY2hlY2sgUnggYW50ZW5uYSAjIGFnYWluLgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCS8qIEJlZm9yZSBwb3dlciBzYXZlIGJlZm9yZSBsaW5rIHVwIGZ1bmN0aW9uLCBXZSB3aWxsIGZvcmNlIHVzZSAxUi4gKi8KKwkvKiBTbyBhZnRlciBsaW5rIHVwLCBjaGVjayBSeCBhbnRlbm5hICMgYWdhaW4uICovCiAJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKLQl7CisJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykgewogCQlWYWx1ZSB8PSAoMHgxMCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCXsKKwl9IGVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikgewogCQlWYWx1ZSB8PSAoMHg4KTsKLQl9Ci0JZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JeworCX0gZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKSB7CiAJCVZhbHVlIHw9ICgweDApOwogCX0KIAlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBWYWx1ZSk7CiAJcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZiAvKiBSVDI4NjAgKi8KKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKLQl7CisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CiAJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKIAotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKLQkJfQotCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDIpICYmCi0JCQkJIChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCAgPT0gQldfNDApICYmCi0JCQkJIChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLQkJfQotI2lmZGVmIFJUMjg3MAogCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQogCQkJQWRob2NUdXJuT25Rb3MocEFkKTsKLSNlbmRpZgogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIUFkaG9jIExJTksgVVAgISEhIFxuIiApKTsKLQl9Ci0JZWxzZQotCXsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQWRob2MgTElOSyBVUCFcbiIpKTsKKwl9IGVsc2UgewogCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhSW5mcmEgTElOSyBVUCAhISEgXG4iICkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbmZyYSBMSU5LIFVQIVxuIikpOwogCX0KIAotCS8vIDMqMwotCS8vIHJlc2V0IFR4IGJlYW1mb3JtaW5nIGJpdAorCS8qIDMqMyAqLworCS8qIHJlc2V0IFR4IGJlYW1mb3JtaW5nIGJpdCAqLwogCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKIAlWYWx1ZSAmPSAofjB4MDEpOwogCVZhbHVlIHw9IHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5UeEJGOwogCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKIAotCS8vIENoYW5nZSB0byBBUCBjaGFubmVsCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCXsKLQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkvKiBDaGFuZ2UgdG8gQVAgY2hhbm5lbCAqLworCWlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPiBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCSAgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkvKiBNdXN0IHVzaW5nIDQwTUh6LiAqLwogCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKIAkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CkBAIC0xMjE3LDM0ICsxMjQ2LDM1IEBACiAJCVZhbHVlIHw9IDB4MTA7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIFZhbHVlKTsKIAotCQkvLyAgUlggOiBjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIKKwkJLyogIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyICovCiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKIAkJVmFsdWUgJj0gKH4weDIwKTsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotI2lmZGVmIFJUMjg2MAotICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKIAkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOwogCQlEYXRhICY9IDB4ZmZmZmZmZmU7CiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKIAotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKKwkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKSB7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxQSk7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgMHgwQSk7CiAJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxNik7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDI4NjBDICFcbiIpKTsKIAkJfQogCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhITQwTUh6IExvd2VyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBCZWxvdy4gQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7Ci0JfQotCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotICAgIHsKLQkgICAgLy8gTXVzdCB1c2luZyA0ME1Iei4KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI0ME1IeiBMb3dlciBMSU5LIFVQISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJfSBlbHNlIGlmICgocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQorCQkgICAmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09CisJCSAgICAgICBCV180MCkpIHsKKwkJLyogTXVzdCB1c2luZyA0ME1Iei4gKi8KIAkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7CiAKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOwogCQlWYWx1ZSAmPSAofjB4MTgpOwpAQCAtMTI1NiwyNSArMTI4NiwyNCBAQAogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgRGF0YSk7CiAKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCSAgICBWYWx1ZSB8PSAoMHgyMCk7CisJCVZhbHVlIHw9ICgweDIwKTsKIAkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotI2lmZGVmIFJUMjg2MAotICAgICAgICBwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCXBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCiAKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQl7CisJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkgewogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MUEpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MEEpOwogCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzMsIDB4MTYpOwotCQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0Mjg2MEMgIVxuIikpOwogCQl9CiAKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDQwTUh6IFVwcGVyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBVcHBlckNlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCSAgICBwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI0ME1IeiBVcHBlciBMSU5LIFVQISBDb250cm9sIENoYW5uZWwgYXQgVXBwZXJDZW50cmFsID0gJWQgXG4iLAorCQkJICBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCX0gZWxzZSB7CisJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwogCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CiAJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwogCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKQEAgLTEyOTAsNTExICsxMzE5LDUzMyBAQAogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7CiAJCVZhbHVlICY9ICh+MHgyMCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVDI4NjAKLSAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZgorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJeworCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApIHsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKIAkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0Mjg2MEMgIVxuIikpOwogCQl9CiAKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDIwTUh6IExJTksgVVAgISEhIFxuIiApKTsKLSAgICB9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjIwTUh6IExJTksgVVAhXG4iKSk7CisJfQogCiAJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7Ci0JLy8KLQkvLyBTYXZlIEJCUF9SNjYgdmFsdWUsIGl0IHdpbGwgYmUgdXNlZCBpbiBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24KLQkvLwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChCc3NUeXBlPSVkLCBBSUQ9JWQsIHNzaWQ9JXMsIENoYW5uZWw9JWQsIENlbnRyYWxDaGFubmVsID0gJWQpXG4iLAotCQlCc3NUeXBlLCBwQWQtPlN0YUFjdGl2ZS5BaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJLyogKi8KKwkvKiBTYXZlIEJCUF9SNjYgdmFsdWUsIGl0IHdpbGwgYmUgdXNlZCBpbiBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24gKi8KKwkvKiAqLworCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsCisJCQkJICAgICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChEZW5zaXR5ID0lZCwgKVxuIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NcGR1RGVuc2l0eSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJMSU5LIFVQISAoQnNzVHlwZT0lZCwgQUlEPSVkLCBzc2lkPSVzLCBDaGFubmVsPSVkLCBDZW50cmFsQ2hhbm5lbCA9ICVkKVxuIiwKKwkJICBCc3NUeXBlLCBwQWQtPlN0YUFjdGl2ZS5BaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpKTsKIAotCQlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkxJTksgVVAhIChEZW5zaXR5ID0lZCwgKVxuIiwKKwkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1wZHVEZW5zaXR5KSk7CisKKwlBc2ljU2V0QnNzaWQocEFkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAKIAlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsKIAlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7CiAKLQkvLyBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uZm9yIGxlZ2FjeSByYXRlLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgUlRTIHRocmVzaG9sZCwgYnV0IG5vcm1hbGx5IGl0IHdpbGwgbm90IGhpdAotCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKE9GRE1TRVRQUk9URUNUIHwgQ0NLU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKwkvKiBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uZm9yIGxlZ2FjeSByYXRlLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgUlRTIHRocmVzaG9sZCwgYnV0IG5vcm1hbGx5IGl0IHdpbGwgbm90IGhpdCAqLworCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKE9GRE1TRVRQUk9URUNUIHwgQ0NLU0VUUFJPVEVDVCksIFRSVUUsCisJCQkgIEZBTFNFKTsKIAotCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpCi0JewotCQkvLyBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLgotICAgIAlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKQotICAgIAl7Ci0gICAgCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKLSAgICAJfQotICAgIAllbHNlCi0gICAJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7CisJaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKSkgeworCQkvKiBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLiAqLworCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSB7CisJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCSAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgIE9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwKKwkJCQkJICBUUlVFKTsKKwkJfSBlbHNlCisJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCSAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgIE9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwKKwkJCQkJICBGQUxTRSk7CiAJfQogCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+RHJzQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX0RSUykpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkRyc0NvdW50ZXJzLCBzaXplb2Yoc3RydWN0IHJ0X2NvdW50ZXJfZHJzKSk7CiAKIAlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCXBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKwlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OwkvKiBsYXN0IFJYIHRpbWVzdGFtcCAqLwogCiAJaWYgKChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlICE9IFJ0ODAyXzExUHJlYW1ibGVMb25nKSAmJgotCQlDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04ocEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8pKQotCXsKKwkgICAgQ0FQX0lTX1NIT1JUX1BSRUFNQkxFX09OKHBBZC0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvKSkgewogCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCk7CiAJfQogCiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKIAotCWlmIChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPT0gUkRfU0lMRU5DRV9NT0RFKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID09IFJEX1NJTEVOQ0VfTU9ERSkgewogCX0KIAlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRE1vZGUgPSBSRF9OT1JNQUxfTU9ERTsKIAotCWlmIChCc3NUeXBlID09IEJTU19BREhPQykKLQl7CisJaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKSB7CiAJCU1ha2VJYnNzQmVhY29uKHBBZCk7CiAJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCi0JCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCQl7Ci0JCQk7IC8vRG8gbm90aGluZwotCQl9Ci0JCWVsc2UKLQkJeworCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpCisJCSAgICAmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKSB7CisJCQk7CS8qRG8gbm90aGluZyAqLworCQl9IGVsc2UgewogCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7CiAJCX0KIAotCQkvLyBJbiBhZCBob2MgbW9kZSwgdXNlIE1BQyB0YWJsZSBmcm9tIGluZGV4IDEuCi0JCS8vIHAucyBBU0lDIHVzZSBhbGwgMHhmZiBhcyB0ZXJtaW5hdGlvbiBvZiBXQ0lEIHRhYmxlIHNlYXJjaC5UbyBwcmV2ZW50IGl0J3MgMHhmZi1mZi1mZi1mZi1mZi1mZiwgV3JpdGUgMCBoZXJlLgorCQkvKiBJbiBhZCBob2MgbW9kZSwgdXNlIE1BQyB0YWJsZSBmcm9tIGluZGV4IDEuICovCisJCS8qIHAucyBBU0lDIHVzZSBhbGwgMHhmZiBhcyB0ZXJtaW5hdGlvbiBvZiBXQ0lEIHRhYmxlIHNlYXJjaC5UbyBwcmV2ZW50IGl0J3MgMHhmZi1mZi1mZi1mZi1mZi1mZiwgV3JpdGUgMCBoZXJlLiAqLwogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9CQVNFLCAweDAwKTsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgMHgxODA4LCAweDAwKTsKIAotCQkvLyBJZiBXRVAgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYwotCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCisJCS8qIElmIFdFUCBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljICovCisJCS8qIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkgKi8KIAotCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCQl7Ci0JCQlQVUNIQVIJS2V5OwotCQkJVUNIQVIgCUNpcGhlckFsZzsKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgeworCQkJdTggKktleTsKKwkJCXU4IENpcGhlckFsZzsKIAotCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCi0gICAgICAgIAl7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKSB7CiAJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7Ci0gICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisJCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CiAKLQkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQotCQkJCXsKLQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLSAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkgeworCQkJCQkvKiBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYyAqLworCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsCisJCQkJCQkJICAgICAgQ2lwaGVyQWxnLCBLZXksCisJCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQkJCXsKLQkJCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIE5VTEwpOworCQkJCQlpZiAoaWR4ID09IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkgeworCQkJCQkJLyogVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUgKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgTlVMTCk7CiAJCQkJCX0KIAkJCQl9CiAKLQogCQkJfQogCQl9Ci0JCS8vIElmIFdQQU5vbmUgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYwotCQkvLyBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApCi0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CS8vIGFsd2F5cyBiZSB6ZXJvCisJCS8qIElmIFdQQU5vbmUgaXMgZW5hYmxlZCwgYWRkIGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIGludG8gQXNpYyAqLworCQkvKiBGaWxsIGluIFNoYXJlZCBLZXkgVGFibGUob2Zmc2V0OiAweDZjMDApIGFuZCBTaGFyZWQgS2V5IE1vZGUob2Zmc2V0OiAweDcwMDApICovCisJCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHsKKwkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7CS8qIGFsd2F5cyBiZSB6ZXJvICovCiAKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEFkLT5TdGFDZmcuUE1LLCBMRU5fVEtJUF9FSyk7CisJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLlBNSywgTEVOX1RLSVBfRUspOwogCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAgICAgewotICAgIAkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBNS1sxNl0sIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0KLQkJCS8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0JCQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsCisJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuUE1LWzE2XSwKKwkJCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCSAgICAgICAmcEFkLT5TdGFDZmcuUE1LWzE2XSwKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisJCQl9CisJCQkvKiBEZWNpZGUgaXRzIENoaXBlckFsZyAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQogCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PQorCQkJCSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQogCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCQllbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5rbm93IENpcGhlciAoPSVkKSwgc2V0IENpcGhlciB0byBBRVNcbiIsIHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIpKTsKKwkJCWVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJVbmtub3cgQ2lwaGVyICg9JWQpLCBzZXQgQ2lwaGVyIHRvIEFFU1xuIiwKKwkJCQkJICBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyKSk7CiAJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLSAgICAgICAgICAgIH0KKwkJCX0KIAotCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKKwkJCS8qIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljICovCiAJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCSAgMCwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKKwkJCQkJICAgICAgQlNTMCwKKwkJCQkJICAgICAgMCwKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CiAKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCi0JCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCS8qIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlICovCisJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgMCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uCisJCQkJCQkgIENpcGhlckFsZywgTlVMTCk7CiAKIAkJfQogCi0JfQotCWVsc2UgLy8gQlNTX0lORlJBCisJfSBlbHNlCQkJLyogQlNTX0lORlJBICovCiAJewotCQkvLyBDaGVjayB0aGUgbmV3IFNTSUQgd2l0aCBsYXN0IFNTSUQKLQkJd2hpbGUgKENhbmNlbGxlZCA9PSBUUlVFKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4gPT0gcEFkLT5Db21tb25DZmcuU3NpZExlbikKLQkJCXsKLQkJCQlpZiAoUlRNUENvbXBhcmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKSA9PSAwKQotCQkJCXsKLQkJCQkJLy8gTGluayB0byB0aGUgb2xkIG9uZSBubyBsaW5rZG93biBpcyByZXF1aXJlZC4KKwkJLyogQ2hlY2sgdGhlIG5ldyBTU0lEIHdpdGggbGFzdCBTU0lEICovCisJCXdoaWxlIChDYW5jZWxsZWQgPT0gVFJVRSkgeworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID09CisJCQkgICAgcEFkLT5Db21tb25DZmcuU3NpZExlbikgeworCQkJCWlmIChSVE1QQ29tcGFyZU1lbW9yeQorCQkJCSAgICAocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsCisJCQkJICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJCSAgICAgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pID09IDApIHsKKwkJCQkJLyogTGluayB0byB0aGUgb2xkIG9uZSBubyBsaW5rZG93biBpcyByZXF1aXJlZC4gKi8KIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJLy8gU2VuZCBsaW5rIGRvd24gZXZlbnQgYmVmb3JlIHNldCB0byBsaW5rIHVwCisJCQkvKiBTZW5kIGxpbmsgZG93biBldmVudCBiZWZvcmUgc2V0IHRvIGxpbmsgdXAgKi8KIAkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CiAJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQUEhXG4iKSk7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBQSFcbiIpKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJLy8KLQkJLy8gT24gV1BBIG1vZGUsIFJlbW92ZSBBbGwgS2V5cyBpZiBub3QgY29ubmVjdCB0byB0aGUgbGFzdCBCU1NJRAotCQkvLyBLZXkgd2lsbCBiZSBzZXQgYWZ0ZXIgNC13YXkgaGFuZHNoYWtlLgotCQkvLwotCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCi0JCXsKLQkJCVVMT05HIAkJSVY7CisJCS8qICovCisJCS8qIE9uIFdQQSBtb2RlLCBSZW1vdmUgQWxsIEtleXMgaWYgbm90IGNvbm5lY3QgdG8gdGhlIGxhc3QgQlNTSUQgKi8KKwkJLyogS2V5IHdpbGwgYmUgc2V0IGFmdGVyIDQtd2F5IGhhbmRzaGFrZS4gKi8KKwkJLyogKi8KKwkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgeworCQkJdW5zaWduZWQgbG9uZyBJVjsKIAotCQkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCQkJLyogUmVtb3ZlIGFsbCBXUEEga2V5cyAqLworCQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwogCQkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKIAkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CisJCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0KKwkJCSAgICBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwogCi0JCQkvLyBGaXhlZCBjb25uZWN0aW9uIGZhaWxlZCB3aXRoIFJhbmdlIE1heGltaXplciAtIDUxNSBBUCAoTWFydmVsbCBDaGlwKSB3aGVuIHNlY3VyaXR5IGlzIFdQQVBTSy9US0lQCi0JCQkvLyBJZiBJViByZWxhdGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlIGluIEdyb3VwTXNnMiwgQVAgd291bGQgaWdub3JlIHRoaXMgbWVzc2FnZS4KLQkJCUlWID0gMDsKKwkJCS8qIEZpeGVkIGNvbm5lY3Rpb24gZmFpbGVkIHdpdGggUmFuZ2UgTWF4aW1pemVyIC0gNTE1IEFQIChNYXJ2ZWxsIENoaXApIHdoZW4gc2VjdXJpdHkgaXMgV1BBUFNLL1RLSVAgKi8KKwkJCS8qIElmIElWIHJlbGF0ZWQgdmFsdWVzIGFyZSB0b28gbGFyZ2UgaW4gR3JvdXBNc2cyLCBBUCB3b3VsZCBpZ25vcmUgdGhpcyBtZXNzYWdlLiAqLworCQkJSVYgPSAxOwogCQkJSVYgfD0gKHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7CiAJCQlBc2ljVXBkYXRlV0NJRElWRUlWKHBBZCwgQlNTSURfV0NJRCwgSVYsIDApOwotCi0jaWZkZWYgUlQyODYwCi0JCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0jZW5kaWYKIAkJfQotCQkvLyBOT1RFOgotCQkvLyB0aGUgZGVjaXNpb24gb2YgdXNpbmcgInNob3J0IHNsb3QgdGltZSIgb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkgZHVlIHRvCi0JCS8vIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisJCS8qIE5PVEU6ICovCisJCS8qIHRoZSBkZWNpc2lvbiBvZiB1c2luZyAic2hvcnQgc2xvdCB0aW1lIiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSBkdWUgdG8gKi8KKwkJLyogbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUgKi8KIAotCQkvLyBOT1RFOgotCQkvLyB0aGUgZGVjaXNpb24gdG8gdXNlICJSVEMvQ1RTIiBvciAiQ1RTLXRvLXNlbGYiIHByb3RlY3Rpb24gb3Igbm90IG1heSBjaGFuZ2UgZHluYW1pY2FsbHkKLQkJLy8gZHVlIHRvIG5ldyBTVEEgYXNzb2NpYXRpb24gdG8gdGhlIEFQLiBzbyB3ZSBoYXZlIHRvIGRlY2lkZSB0aGF0IHVwb24gcGFyc2luZyBCRUFDT04sIG5vdCBoZXJlCisJCS8qIE5PVEU6ICovCisJCS8qIHRoZSBkZWNpc2lvbiB0byB1c2UgIlJUQy9DVFMiIG9yICJDVFMtdG8tc2VsZiIgcHJvdGVjdGlvbiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseSAqLworCQkvKiBkdWUgdG8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUgKi8KIAogCQlDb21wb3NlUHNQb2xsKHBBZCk7CiAJCUNvbXBvc2VOdWxsRnJhbWUocEFkKTsKIAotCQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKKwkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKIAotCQkvLyBBZGQgQlNTSUQgdG8gV0NJRCBzZWFyY2ggdGFibGUKKwkJLyogQWRkIEJTU0lEIHRvIFdDSUQgc2VhcmNoIHRhYmxlICovCiAJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIEJTU0lEX1dDSUQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCQkvLyBhZGQgdGhpcyBCU1NJRCBlbnRyeSBpbnRvIEhBU0ggdGFibGUKLQkJewotCQkJVUNIQVIgSGFzaElkeDsKKwkJLyogSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBwYWlld2lzZSBhbmQgc2hhcmVkIGtleSAqLworCQlpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApICYmCisJCSAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkJICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKSB8fAorCQkgICAgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkgJiYKKwkJICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkpIHsKKwkJCXU4ICpLZXk7CisJCQl1OCBDaXBoZXJBbGc7CiAKLQkJCS8vcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0JCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0JCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpCi0JCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKLQkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKLQkJCX0KLQkJfQotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0KLQkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBwYWlld2lzZSBhbmQgc2hhcmVkIGtleQotICAgICAgICBpZiAoKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApJiYKLSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSYmCi0gICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSkgfHwKLSAgICAgICAgICAgICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpJiYKLSAgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkpKQotCQl7Ci0JCQlQVUNIQVIJS2V5OwotCQkJVUNIQVIgCUNpcGhlckFsZzsKLQotCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCi0gICAgICAgIAl7CisJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKSB7CiAJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7Ci0gICAgCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CisJCQkJS2V5ID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXk7CiAKLQkJCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiAwKQotCQkJCXsKLQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLSAgICAJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisJCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkgeworCQkJCQkvKiBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYyAqLworCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBpZHgsCisJCQkJCQkJICAgICAgQ2lwaGVyQWxnLCBLZXksCisJCQkJCQkJICAgICAgTlVMTCwgTlVMTCk7CiAKLQkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQkJCXsKLQkJCQkJCS8vIEFzc2lnbiBncm91cCBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpIHsKKwkJCQkJCS8qIEFzc2lnbiBncm91cCBrZXkgaW5mbyAqLworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCQkgIGlkeCwKKwkJCQkJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkJCQkJICBOVUxMKTsKIAotCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisJCQkJCQlwRW50cnktPkFpZCA9IEJTU0lEX1dDSUQ7CisJCQkJCQkvKiBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8gKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgcEVudHJ5KTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCi0JCS8vIG9ubHkgSU5GUkFTVFJVQ1RVUkUgbW9kZSBuZWVkIHRvIGluZGljYXRlIGNvbm5lY3Rpdml0eSBpbW1lZGlhdGVseTsgQURIT0MgbW9kZQotCQkvLyBzaG91bGQgd2FpdCB1bnRpbCBhdCBsZWFzdCAyIGFjdGl2ZSBub2RlcyBpbiB0aGlzIEJTU0lELgorCQkvKiBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgbmVlZCB0byBpbmRpY2F0ZSBjb25uZWN0aXZpdHkgaW1tZWRpYXRlbHk7IEFESE9DIG1vZGUgKi8KKwkJLyogc2hvdWxkIHdhaXQgdW50aWwgYXQgbGVhc3QgMiBhY3RpdmUgbm9kZXMgaW4gdGhpcyBCU1NJRC4gKi8KIAkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CiAKLSAgICAgICAgLy8gRm9yIEdVSSArKwotCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCXsKKwkJLyogRm9yIEdVSSArKyAqLworCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHsKIAkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLSNpZmRlZiBSVDI4NzAKIAkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0jZW5kaWYKKwkJfSBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAorCQkJICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQorCQl7CisJCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09CisJCQkgICAgV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKKwkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5MaW5rRG93blRpbWVyLAorCQkJCQkgICAgIExJTktfRE9XTl9USU1FT1VUKTsKIAkJfQotICAgICAgICAvLyAtLQotI2lmZGVmIFJUMjg2MAotCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotI2VuZGlmCisJCS8qIC0tICovCiAKLQkJLy8gQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4KLSAgICAgICAgTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQkJUlRNUE1vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSBCU1NJRF9XQ0lEOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLnBBZCA9IHBBZDsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5WYWxpZEFzQ0xJID0gVFJVRTsJLy9BbHRob3VnaCB0aGlzIGlzIGJzc2lkLi5zdGlsbCBzZXQgVmFsaWRBc0NsCi0JCXBBZC0+TWFjVGFiLlNpemUgPSAxOwkvLyBpbmZyYSBtb2RlIGFsd2F5cyBzZXQgTUFDdGFiIHNpemUgPTEuCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uU3N0ID0gU1NUX0FTU09DOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkF1dGhTdGF0ZSA9IFNTVF9BU1NPQzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJLyogQWRkIEJTU0lEIGluIG15IE1BQyBUYWJsZS4gKi8KKwkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwkJLyogYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZSAqLworCQlpZiAocEVudHJ5KSB7CisJCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlpZiAocEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9PSBOVUxMKSB7CisJCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKKwkJCX0gZWxzZSB7CisJCQkJcEN1cnJFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07CisJCQkJd2hpbGUgKHBDdXJyRW50cnktPnBOZXh0ICE9IE5VTEwpIHsKKwkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OworCQkJCX0KKwkJCQlwQ3VyckVudHJ5LT5wTmV4dCA9IHBFbnRyeTsKKwkJCX0KKwkJfQorCQlSVE1QTW92ZU1lbW9yeShwRW50cnktPkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJICAgICAgIE1BQ19BRERSX0xFTik7CisJCXBFbnRyeS0+QWlkID0gQlNTSURfV0NJRDsKKwkJcEVudHJ5LT5wQWQgPSBwQWQ7CisJCXBFbnRyeS0+VmFsaWRBc0NMSSA9IFRSVUU7CS8qQWx0aG91Z2ggdGhpcyBpcyBic3NpZC4uc3RpbGwgc2V0IFZhbGlkQXNDbCAqLworCQlwQWQtPk1hY1RhYi5TaXplID0gMTsJLyogaW5mcmEgbW9kZSBhbHdheXMgc2V0IE1BQ3RhYiBzaXplID0xLiAqLworCQlwRW50cnktPlNzdCA9IFNTVF9BU1NPQzsKKwkJcEVudHJ5LT5BdXRoU3RhdGUgPSBTU1RfQVNTT0M7CisJCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKKwkJcEVudHJ5LT5XZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7CisJCWlmIChwRW50cnktPkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CisJCQlwRW50cnktPldwYVN0YXRlID0gQVNfTk9UVVNFOworCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7CisJCX0gZWxzZSB7CisJCQlwRW50cnktPldwYVN0YXRlID0gQVNfUFRLU1RBUlQ7CisJCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOworCQl9CisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkxJTksgVVAhICBDbGllbnRTdGF0dXNGbGFncz0lbHgpXG4iLAorCQkJICBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CiAKIAkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBUUlVFLCBCU1MwKTsKIAkJTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISAoU3RhQWN0aXZlLmJIdEVuYWJsZSA9JWQsIClcbiIsIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlKSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTElOSyBVUCEgKFN0YUFjdGl2ZS5iSHRFbmFibGUgPSVkLCApXG4iLAorCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSkpOwogCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKQotCQkJewotCi0JCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOwotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwotICAgICAgICAgICAgICAgIFJUTVBTZXRQaWdneUJhY2socEFkLCBUUlVFKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUdXJuIG9uIFBpZ2d5LUJhY2tcbiIpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpIHsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUpCisJCQkgICAgJiYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykgeworCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwKKwkJCQkJCSAgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEKTsKKwkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsCisJCQkJCQkgIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKKwkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKKwkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJCSAgICAgICBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSk7CisJCQkJUlRNUFNldFBpZ2d5QmFjayhwQWQsIFRSVUUpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJUdXJuIG9uIFBpZ2d5LUJhY2tcbiIpKTsKKwkJCX0gZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKSB7CisJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLAorCQkJCQkJICBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7CisJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksCisJCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlJhbGluayBBZ2dyZWdhdGlvblxuIikpOwogCQkJfQogCQl9CiAKLQkJaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICE9IDB4MCkKLQkJewotCQkJaWYgKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCi0JCQl7CisJCWlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApIHsKKwkJCWlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRworCQkJICAgIChwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkgewogCQkJCUFzaWNFbmFibGVSREcocEFkKTsKIAkJCX0KLQogCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwKKwkJCQkJICAgICAgIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJfSBlbHNlIHsKIAkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKKwkJCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksCisJCQkJCQkgZkNMSUVOVF9TVEFUVVNfUkFMSU5LX0NISVBTRVQpOwogCQl9CiAJfQogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVCBFdmVudCBCIS5CQUNhcGFiaWxpdHkgPSAleC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAlbHhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIk5ESVNfU1RBVFVTX01FRElBX0NPTk5FQ1QgRXZlbnQgQiEuQkFDYXBhYmlsaXR5ID0gJXguIENsaWVudFN0YXR1c0ZsYWdzID0gJWx4XG4iLAorCQkgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkLAorCQkgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKIAotCS8vIFNldCBMRUQKKwkvKiBTZXQgTEVEICovCiAJUlRNUFNldExFRChwQWQsIExFRF9MSU5LX1VQKTsKIAogCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKIAlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7Ci0JcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOyAgICAgICAgLy8gUmVzZXQgY29uZmlnIGZsYWcKLQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAorCXBBZC0+YkNvbmZpZ0NoYW5nZWQgPSBGQUxTRTsJLyogUmVzZXQgY29uZmlnIGZsYWcgKi8KKwlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsJLyogVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uIHRvIGxpbmsgaXMgdXAgKi8KIAotCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCisJLyogU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sgKi8KIAl7Ci0JCVBVQ0hBUgkJCQkJcFRhYmxlOwotCQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKKwkJdTggKnBUYWJsZTsKKwkJdTggVGFibGVTaXplID0gMDsKIAotCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KTsKKwkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sCisJCQkJICAgICAgJnBUYWJsZSwgJlRhYmxlU2l6ZSwKKwkJCQkgICAgICAmcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXgpOwogCQlBc2ljVXBkYXRlQXV0b0ZhbGxCYWNrVGFibGUocEFkLCBwVGFibGUpOwogCX0KIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0gICAgcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS53b3JkOwotICAgIHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKLQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpCi0JeworCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKKwlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKSB7CiAJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKIAogCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKQogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKIAotCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA+IE1DU183KSB8fCAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKSkKKwkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPiBNQ1NfNykKKwkJICAgIHx8IChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMzIpKQogCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKIAotCQkvLyBJZiB0aGUgbGVnYWN5IG1vZGUgaXMgc2V0LCBvdmVyd3JpdGUgdGhlIHRyYW5zbWl0IHNldHRpbmcgb2YgdGhpcyBlbnRyeS4KKwkJLyogSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuICovCiAJCWlmIChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkKLQkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7Ci0JfQotCWVsc2UKKwkJCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKHU4KXBBZC0+U3RhQ2ZnLgorCQkJCQkJICBEZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCQkJICBGaXhlZFR4TW9kZSwgcEVudHJ5KTsKKwl9IGVsc2UKIAkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7CiAJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKIAotCS8vICBMZXQgTGluayBTdGF0dXMgUGFnZSBkaXNwbGF5IGZpcnN0IGluaXRpYWwgcmF0ZS4KLQlwQWQtPkxhc3RUeFJhdGUgPSAoVVNIT1JUKShwRW50cnktPkhUUGh5TW9kZS53b3JkKTsKLQkvLyBTZWxlY3QgREFDIGFjY29yZGluZyB0byBIVCBvciBMZWdhY3kKLQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gIT0gMHgwMCkKLQl7CisJLyogIExldCBMaW5rIFN0YXR1cyBQYWdlIGRpc3BsYXkgZmlyc3QgaW5pdGlhbCByYXRlLiAqLworCXBBZC0+TGFzdFR4UmF0ZSA9ICh1MTYpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOworCS8qIFNlbGVjdCBEQUMgYWNjb3JkaW5nIHRvIEhUIG9yIExlZ2FjeSAqLworCWlmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSAhPSAweDAwKSB7CiAJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJlZhbHVlKTsKIAkJVmFsdWUgJj0gKH4weDE4KTsKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQkJewotCQkgICAgVmFsdWUgfD0gMHgxMDsKKwkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikgeworCQkJVmFsdWUgfD0gMHgxMDsKIAkJfQogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmVmFsdWUpOwogCQlWYWx1ZSAmPSAofjB4MTgpOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBWYWx1ZSk7CiAJfQogCi0JaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQotCXsKLQl9Ci0JZWxzZSBpZiAocEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPT0gMCkKLQl7Ci0JICAgIC8vIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLgotCSAgICAvLyBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuCisJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSB7CisJfSBlbHNlIGlmIChwRW50cnktPk1heFJBbXBkdUZhY3RvciA9PSAwKSB7CisJCS8qIElmIEhUIEFQIGRvZXNuJ3Qgc3VwcG9ydCBNYXhSQW1wZHVGYWN0b3IgPSAxLCB3ZSBuZWVkIHRvIHNldCBtYXggUFNEVSB0byAwLiAqLworCQkvKiBCZWNhdXNlIG91ciBJbml0IHZhbHVlIGlzIDEgYXQgTUFDUmVnVGFibGUuICovCiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDBmZmYpOwogCX0KLQotCS8vIFBhdGNoIGZvciBNYXJ2ZWwgQVAgdG8gZ2FpbiBoaWdoIHRocm91Z2hwdXQKLQkvLyBOZWVkIHRvIHNldCBhcyBmb2xsb3dpbmcsCi0JLy8gMS4gU2V0IHR4b3AgaW4gcmVnaXN0ZXItRURDQV9BQzBfQ0ZHIGFzIDB4NjAKLQkvLyAyLiBTZXQgRW5UWFdyaXRlQmFja0RET05FIGluIHJlZ2lzdGVyLVdQRE1BX0dMT19DRkcgYXMgemVybwotCS8vIDMuIFBCRl9NQVhfUENOVCBhcyAweDFGM0ZCRjlGCi0JLy8gNC4ga2ljayBwZXIgdHdvIHBhY2tldHMgd2hlbiBkZXF1ZXVlCi0JLy8KLQkvLyBUeG9wIGNhbiBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gUkRHIGlzIG9mZiwgV01NIGlzIGRpc2FibGUgYW5kIFR4QnVyc3QgaXMgZW5hYmxlCi0JLy8KLQkvLyBpZiAxLiBMZWdhY3kgQVAgV01NIG9uLCAgb3IgMi4gMTFuIEFQLCBBTVBEVSBkaXNhYmxlLiAgRm9yY2UgdHVybiBvZmYgYnVyc3Qgbm8gbWF0dGVyIHdoYXQgYkVuYWJsZVR4QnVyc3QgaXMuCi0JaWYgKAotCQkhKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID09IDEgJiYgcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkgJiYKLQkJKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCi0JCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkpKQotCXsKKwkvKiBQYXRjaCBmb3IgTWFydmVsIEFQIHRvIGdhaW4gaGlnaCB0aHJvdWdocHV0ICovCisJLyogTmVlZCB0byBzZXQgYXMgZm9sbG93aW5nLCAqLworCS8qIDEuIFNldCB0eG9wIGluIHJlZ2lzdGVyLUVEQ0FfQUMwX0NGRyBhcyAweDYwICovCisJLyogMi4gU2V0IEVuVFhXcml0ZUJhY2tERE9ORSBpbiByZWdpc3Rlci1XUERNQV9HTE9fQ0ZHIGFzIHplcm8gKi8KKwkvKiAzLiBQQkZfTUFYX1BDTlQgYXMgMHgxRjNGQkY5RiAqLworCS8qIDQuIGtpY2sgcGVyIHR3byBwYWNrZXRzIHdoZW4gZGVxdWV1ZSAqLworCS8qICovCisJLyogVHhvcCBjYW4gb25seSBiZSBtb2RpZmllZCB3aGVuIFJERyBpcyBvZmYsIFdNTSBpcyBkaXNhYmxlIGFuZCBUeEJ1cnN0IGlzIGVuYWJsZSAqLworCS8qICovCisJLyogaWYgMS4gTGVnYWN5IEFQIFdNTSBvbiwgIG9yIDIuIDExbiBBUCwgQU1QRFUgZGlzYWJsZS4gIEZvcmNlIHR1cm4gb2ZmIGJ1cnN0IG5vIG1hdHRlciB3aGF0IGJFbmFibGVUeEJ1cnN0IGlzLiAqLworCWlmICghKChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9PSAxKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkpCisJICAgICYmIChwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0ID09IEZBTFNFKQorCSAgICAmJgorCSAgICAoKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBGQUxTRSkKKwkgICAgICAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQorCSAgICAgfHwgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9PSBUUlVFKQorCQkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkpKSB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7Ci0JCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCURhdGEgJj0gMHhGRkZGRkYwMDsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKIAogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRjdGOUYpOwogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDFcbiIpKTsKLQl9Ci0JZWxzZQotCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKLQl7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkgewogCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOwotCQlEYXRhICB8PSAweDYwOworCQlEYXRhICY9IDB4RkZGRkZGMDA7CisJCURhdGEgfD0gMHg2MDsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKIAkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBUUlVFOwogCiAJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9NQVhfUENOVCwgMHgxRjNGQkY5Rik7CiAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlR4YnVyc3QgMlxuIikpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7Ci0JCURhdGEgICY9IDB4RkZGRkZGMDA7CisJCURhdGEgJj0gMHhGRkZGRkYwMDsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBEYXRhKTsKIAogCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfTUFYX1BDTlQsIDB4MUYzRjdGOUYpOwogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeGJ1cnN0IDNcbiIpKTsKIAl9CiAKLQkvLyBSZS1jaGVjayB0byB0dXJuIG9uIFRYIGJ1cnN0IG9yIG5vdC4KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID09IFRSVUUpICYmICgoU1RBX1dFUF9PTihwQWQpKXx8KFNUQV9US0lQX09OKHBBZCkpKSkKLQl7CisJLyogUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuICovCisJaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKQorCSAgICAmJiAoKFNUQV9XRVBfT04ocEFkKSkgfHwgKFNUQV9US0lQX09OKHBBZCkpKSkgewogCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBUUlVFOwotCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JCXsKLQkJICAgIFVJTlQzMiBNQUNWYWx1ZSA9IDA7Ci0JCQkvLyBGb3JjZSBkaXNhYmxlICBUWE9QIHZhbHVlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgYWN0aW9uIGluIE1MTUVVcGRhdGVQcm90ZWN0IHRvby4KLQkJCS8vIEkgZGlkbid0IGNoYW5nZSBQQkZfTUFYX1BDTlQgc2V0dGluZy4KKwkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSB7CisJCQl1MzIgTUFDVmFsdWUgPSAwOworCQkJLyogRm9yY2UgZGlzYWJsZSAgVFhPUCB2YWx1ZSBpbiB0aGlzIGNhc2UuIFRoZSBzYW1lIGFjdGlvbiBpbiBNTE1FVXBkYXRlUHJvdGVjdCB0b28uICovCisJCQkvKiBJIGRpZG4ndCBjaGFuZ2UgUEJGX01BWF9QQ05UIHNldHRpbmcuICovCiAJCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlICAmPSAweEZGRkZGRjAwOworCQkJTUFDVmFsdWUgJj0gMHhGRkZGRkYwMDsKIAkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgTUFDVmFsdWUpOwogCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5leHREaXNhYmxlUnhCQSA9IEZBTFNFOwogCX0KIAogCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gRkFMU0U7CiAJQ09QWV9NQUNfQUREUihwQWQtPkNvbW1vbkNmZy5MYXN0QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFwQWQtPmJOZXh0RGlzYWJsZVJ4QkE9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBKSk7Ci0JLy8gQlNTSUQgYWRkIGluIG9uZSBNQUMgZW50cnkgdG9vLiAgQmVjYXVzZSBpbiBUeCwgQVNJQyBuZWVkIHRvIGNoZWNrIENpcGhlciBhbmQgSVYvRUlWLCBCQWJpdG1hcAotCS8vIFB0aGVyIGluZm9ybWF0aW9uIGluIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGRyaXZlci4KLQkvLyBOb3RlOiBBcyBTVEEsIFRoZSBNQUNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4gUGFpcndpc2VLZXkgYW5kIFNoYXJlZCBLZXkgZm9yIEJTUzAgYXJlIHRoZSBzYW1lLgorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJwQWQtPmJOZXh0RGlzYWJsZVJ4QkE9ICVkIFxuIiwKKwkJICBwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEpKTsKKwkvKiBCU1NJRCBhZGQgaW4gb25lIE1BQyBlbnRyeSB0b28uICBCZWNhdXNlIGluIFR4LCBBU0lDIG5lZWQgdG8gY2hlY2sgQ2lwaGVyIGFuZCBJVi9FSVYsIEJBYml0bWFwICovCisJLyogUHRoZXIgaW5mb3JtYXRpb24gaW4gTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0gaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJpdmVyLiAqLworCS8qIE5vdGU6IEFzIFNUQSwgVGhlIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdLiBQYWlyd2lzZUtleSBhbmQgU2hhcmVkIEtleSBmb3IgQlNTMCBhcmUgdGhlIHNhbWUuICovCiAKLSAgICBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLSAgICB7Ci0gICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgeworCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJCSAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgorCQkgICAgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKSkgOworCQllbHNlIHsKKwkJCXBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7CisJCQlwQWQtPlN0YUNmZy5Qcml2YWN5RmlsdGVyID0KKwkJCSAgICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKKwkJfQogCX0KIAogCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOwogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKLSAgICAvLwotCS8vIFBhdGNoIEF0aGVyb3MgQVAgVFggd2lsbCBicmVha2Rvd24gaXNzdWUuCi0JLy8gQVAgTW9kZWw6IERMaW5rIERXTC04MjAwQVAKLQkvLwotCWlmIChJTkZSQV9PTihwQWQpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgU1RBX1RLSVBfT04ocEFkKSkKLQl7CisJLyogKi8KKwkvKiBQYXRjaCBBdGhlcm9zIEFQIFRYIHdpbGwgYnJlYWtkb3duIGlzc3VlLiAqLworCS8qIEFQIE1vZGVsOiBETGluayBEV0wtODIwMEFQICovCisJLyogKi8KKwlpZiAoSU5GUkFfT04ocEFkKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpCisJICAgICYmIFNUQV9US0lQX09OKHBBZCkpIHsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMSk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfUEFSU0VSX0NGRywgMHgwMCk7CiAJfQogCiAJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUyk7Ci0jaWZkZWYgUlQyODYwCisKIAlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTE4MjIsMjIwICsxODczLDE5MCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIExpbmtEb3duKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBCT09MRUFOICAgICAgSXNSZXFGcm9tQVApCit2b2lkIExpbmtEb3duKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBJc1JlcUZyb21BUCkKIHsKLQlVQ0hBUgkJCSAgICBpLCBCeXRlVmFsdWUgPSAwOwotI2lmZGVmIFJUMjg2MAotCUJPT0xFQU4JCUNhbmNlbGxlZDsKLSNlbmRpZgorCXU4IGksIEJ5dGVWYWx1ZSA9IDA7CiAKLQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgorCS8qIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uICovCiAJaWYgKE1PTklUT1JfT04ocEFkKSkKIAkJcmV0dXJuOwogCi0jaWZkZWYgUlQyODYwCiAJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0KLQkvLyBOb3QgYWxsb3cgZ28gdG8gc2xlZXAgd2l0aGluIGxpbmtkb3duIGZ1bmN0aW9uLgorCS8qQ29tbWVudCB0aGUgY29kZXMsIGJlYXN1ZSB0aGUgbGluZSAyMjkxIGNhbGwgdGhlIHNhbWUgZnVuY3Rpb24uICovCisJLypSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwgICAgICAgICAgICAgICAmQ2FuY2VsbGVkKTsgKi8KKwkvKiBOb3QgYWxsb3cgZ28gdG8gc2xlZXAgd2l0aGluIGxpbmtkb3duIGZ1bmN0aW9uLiAqLwogCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZgogCi0gICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCXsKLQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU1RBX0xJTktET1dOX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KSB7CisJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLAorCQkJCSAgICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwKKwkJCQkgICAgICBCU1MwLCAwKTsKIAl9CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOICEhIVxuIikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxJTksgRE9XTiFcbiIpKTsKIAlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwogCi0jaWZkZWYgUlQyODYwCi0gICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLSAgICB7Ci0JICAgIEJPT0xFQU4gQ2FuY2VsbGVkOwotICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0gICAgfQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgeworCQlCT09MRUFOIENhbmNlbGxlZDsKKwkJcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBGQUxTRTsKKwkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsICZDYW5jZWxsZWQpOworCX0KIAotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpIHx8Ci0JCVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkgfHwKLQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkKLSAgICB7Ci0JCUFzaWNGb3JjZVdha2V1cChwQWQsIFJUTVBfSEFMVCk7Ci0gICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotICAgIH0KKwlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KIAotICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotI2VuZGlmCi0JaWYgKEFESE9DX09OKHBBZCkpCQkvLyBBZGhvYyBtb2RlIGxpbmsgZG93bgorCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCisJICAgIHx8IFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkKKwkgICAgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkgeworCQlBVVRPX1dBS0VVUF9TVFJVQyBBdXRvV2FrZXVwQ2ZnOworCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKKwkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKKwkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOworCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKKwl9CisjaWZkZWYgUlRNUF9NQUNfUENJCisJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisKKwlpZiAoQURIT0NfT04ocEFkKSkJLyogQWRob2MgbW9kZSBsaW5rIGRvd24gKi8KIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMSEhIVxuIikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMSU5LIERPV04gMSFcbiIpKTsKIAogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19BREhPQ19PTik7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CiAJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7CiAJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTWFjVGFiLlNpemU9JWQgISEhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7Ci0JfQotCWVsc2UJCQkJCS8vIEluZnJhIHN0cnVjdHVyZSBtb2RlCisJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CisJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiBNYWNUYWIuU2l6ZT0lZCAhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7CisJfSBlbHNlCQkJLyogSW5mcmEgc3RydWN0dXJlIG1vZGUgKi8KIAl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMiEhIVxuIikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJMSU5LIERPV04gMiFcbiIpKTsKIAogCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CiAKLQkJLy8gU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbgorCQkvKiBTYXZlZCBsYXN0IFNTSUQgZm9yIGxpbmt1cCBjb21wYXJpc29uICovCiAJCXBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuKTsKKwkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuTGFzdFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkgICAgICAgcEFkLT5Db21tb25DZmcuTGFzdFNzaWRMZW4pOwogCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQlpZiAocEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID09IFRSVUUpCi0JCXsKKwkJaWYgKHBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9PSBUUlVFKSB7CiAJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwogCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLSAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUIEV2ZW50IEEhXG4iKSk7CisJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOwogCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICAvLwotCQkJLy8gSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4KLQkJCS8vIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsCi0JCQkvLyB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4KLQkJCS8vIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4KLQkJCS8vCi0JCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJfSBlbHNlIHsKKwkJCS8qICovCisJCQkvKiBJZiBkaXNhc3NvY2lhdGlvbiByZXF1ZXN0IGlzIGZyb20gTkRJUywgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRlbGV0ZSBCU1NJRCBmcm9tIGVudHJ5LiAqLworCQkJLyogT3RoZXJ3aXNlIGxvc3QgYmVhY29uIG9yIHJlY2VpdmUgRGUtQXV0aGVudGljYXRpb24gZnJvbSBBUCwgKi8KKwkJCS8qIHRoZW4gd2Ugc2hvdWxkIGRlbGV0ZSBCU1NJRCBmcm9tIEJzc1RhYmxlLiAqLworCQkJLyogSWYgd2UgZG9uJ3QgZGVsZXRlIGZyb20gZW50cnksIHJvYW1pbmcgd2lsbCBmYWlsLiAqLworCQkJLyogKi8KKwkJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKIAkJfQogCi0JCS8vIHJlc3RvcmUgYmFjayB0byAtCi0JCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQotCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KLQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQorCQkvKiByZXN0b3JlIGJhY2sgdG8gLSAqLworCQkvKiAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUgKi8KKwkJLyogICAgICAyLiB0dXJuIG9uL29mZiBSVFMvQ1RTIGFuZC9vciBDVFMtdG8tc2VsZiBwcm90ZWN0aW9uICovCisJCS8qICAgICAgMy4gc2hvcnQgcHJlYW1ibGUgKi8KIAkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOwogCi0JCWlmIChwQWQtPlN0YUNmZy5DQ1hBZGphY2VudEFQUmVwb3J0RmxhZyA9PSBUUlVFKQotCQl7Ci0JCQkvLwotCQkJLy8gUmVjb3JkIGN1cnJlbnQgQVAncyBpbmZvcm1hdGlvbi4KLQkJCS8vIGZvciBsYXRlciB1c2VkIHJlcG9ydGluZyBBZGphY2VudCBBUCByZXBvcnQuCi0JCQkvLwotCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQkJcEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWRMZW4gPSBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUFNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+U3RhQ2ZnLkNDWEFkamFjZW50QVBTc2lkTGVuKTsKLQkJCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQ0NYQWRqYWNlbnRBUEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCX0KIAl9CiAKLQlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKKwlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgewogCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJID09IFRSVUUpCi0JCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWRkcik7CisJCQlNYWNUYWJsZURlbGV0ZUVudHJ5KHBBZCwgcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQsCisJCQkJCSAgICBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOwogCX0KIAotCXBBZC0+U3RhQ2ZnLkNDWFFvc0VDV01pbgk9IDQ7Ci0JcEFkLT5TdGFDZmcuQ0NYUW9zRUNXTWF4CT0gMTA7Ci0KLQlBc2ljU2V0U2xvdFRpbWUocEFkLCBUUlVFKTsgLy9GQUxTRSk7CisJQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7CS8qRkFMU0UpOyAqLwogCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOwogCi0JLy8gU2V0IExFRAorCS8qIFNldCBMRUQgKi8KIAlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7Ci0gICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlZ3RoID0gMHhGMDsKLSAgICBSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuCisJcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDB4RjA7CisJUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvKiBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LiAqLwogCi0JCUFzaWNEaXNhYmxlU3luYyhwQWQpOworCUFzaWNEaXNhYmxlU3luYyhwQWQpOwogCiAJcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOwogCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKIAotCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLQl7Ci0JCS8vIFJlbW92ZSBTdGFDZmcgSW5mb3JtYXRpb24gYWZ0ZXIgbGluayBkb3duCisJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSB7CisJCS8qIFJlbW92ZSBTdGFDZmcgSW5mb3JtYXRpb24gYWZ0ZXIgbGluayBkb3duICovCiAJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBNQUNfQUREUl9MRU4pOwogCQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwogCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gMDsKIAl9CiAKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIHNpemVvZihzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSk7CiAJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CiAJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwogCi0JLy8gUmVzZXQgV1BBLVBTSyBzdGF0ZS4gT25seSByZXNldCB3aGVuIHN1cHBsaWNhbnQgZW5hYmxlZAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdGF0ZSAhPSBTU19OT1RVU0UpCi0JeworCS8qIFJlc2V0IFdQQS1QU0sgc3RhdGUuIE9ubHkgcmVzZXQgd2hlbiBzdXBwbGljYW50IGVuYWJsZWQgKi8KKwlpZiAocEFkLT5TdGFDZmcuV3BhU3RhdGUgIT0gU1NfTk9UVVNFKSB7CiAJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0JCS8vIENsZWFyIFJlcGxheSBjb3VudGVyCisJCS8qIENsZWFyIFJlcGxheSBjb3VudGVyICovCiAJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOworCiAJfQotCi0KLQkvLwotCS8vIGlmIGxpbmsgZG93biBjb21lIGZyb20gQVAsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBXUEEga2V5cyBvbiBXUEEgbW9kZS4KLQkvLyBvdGhlcndpc2Ugd2lsbCBjYXVzZSA0LXdheSBoYW5kc2hha2luZyBmYWlsZWQsIHNpbmNlIHRoZSBXUEEga2V5IG5vdCBlbXB0eS4KLQkvLwotCWlmICgoSXNSZXFGcm9tQVApICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCXsKLQkJLy8gUmVtb3ZlIGFsbCBXUEEga2V5cworCS8qICovCisJLyogaWYgbGluayBkb3duIGNvbWUgZnJvbSBBUCwgd2UgbmVlZCB0byByZW1vdmUgYWxsIFdQQSBrZXlzIG9uIFdQQSBtb2RlLiAqLworCS8qIG90aGVyd2lzZSB3aWxsIGNhdXNlIDQtd2F5IGhhbmRzaGFraW5nIGZhaWxlZCwgc2luY2UgdGhlIFdQQSBrZXkgbm90IGVtcHR5LiAqLworCS8qICovCisJaWYgKChJc1JlcUZyb21BUCkgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpIHsKKwkJLyogUmVtb3ZlIGFsbCBXUEEga2V5cyAqLwogCQlSVE1QV1BBUmVtb3ZlQWxsS2V5cyhwQWQpOwogCX0KKwkvKiA4MDIuMXggcG9ydCBjb250cm9sICovCiAKLQkvLyA4MDIuMXggcG9ydCBjb250cm9sCi0KLQkvLyBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQCi0JLy8gTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4KKwkvKiBQcmV2ZW50IGNsZWFyIFBvcnRTZWN1cmVkIGhlcmUgd2l0aCBzdGF0aWMgV0VQICovCisJLyogTmV0d29ya01hbmdlciBzZXQgc2VjdXJpdHkgcG9saWN5IGZpcnN0IHRoZW4gc2V0IFNTSUQgdG8gY29ubmVjdCBBUC4gKi8KIAlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCi0JCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpICYmCi0JCShwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gRkFMU0UpKQotCXsKKwkgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKKwkgICAgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBGQUxTRSkpIHsKIAkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKIAkJcEFkLT5TdGFDZmcuUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7CiAJfQogCiAJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKKwlOZGlzWmVyb01lbW9yeSgmcEFkLT5NYWNUYWIsIHNpemVvZihzdHJ1Y3QgcnRfbWFjX3RhYmxlKSk7CiAJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOwogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7CiAKIAlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPSAwOwogCi0JLy8gVHVybiBvZmYgQ2tpcCBjb250cm9sIGZsYWcKLQlwQWQtPlN0YUNmZy5iQ2tpcE9uID0gRkFMU0U7Ci0JcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gRkFMU0U7Ci0KLSAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKKwkvKiBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cCAqLwogCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047CiAKLSNpZmRlZiBSVDI4NjAKLSAgICBwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID0gRkFMU0U7Ci0JcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IEZBTFNFOwotCXBBZC0+U3RhQ2ZnLkFkaG9jMjBOSm9pbmVkID0gRkFMU0U7Ci0jZW5kaWYKLSAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7CiAKLQkvLyBSZXNldCB0aGUgQ3VycmVudCBBUCdzIElQIGFkZHJlc3MKLQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5BaXJvbmV0SVBBZGRyZXNzLCA0KTsKLSNpZmRlZiBSVDI4NzAKKyNpZmRlZiBSVE1QX01BQ19VU0IKIAlwQWQtPmJVc2JUeEJ1bGtBZ2dyZSA9IEZBTFNFOwotI2VuZGlmIC8vIFJUMjg3MCAvLworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCi0JLy8gQ2xlYW4gYXNzb2NpYXRpb24gaW5mb3JtYXRpb24KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuQXNzb2NJbmZvLCBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pKTsKLQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKKwkvKiBDbGVhbiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbiAqLworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Bc3NvY0luZm8sCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX2Fzc29jaWF0aW9uX2luZm9ybWF0aW9uKSk7CisJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkxlbmd0aCA9CisJICAgIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfYXNzb2NpYXRpb25faW5mb3JtYXRpb24pOwogCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gMDsKIAlwQWQtPlN0YUNmZy5SZXNWYXJJRUxlbiA9IDA7CiAKLQkvLwotCS8vIFJlc2V0IFJTU0kgdmFsdWUgYWZ0ZXIgbGluayBkb3duCi0JLy8KKwkvKiAqLworCS8qIFJlc2V0IFJTU0kgdmFsdWUgYWZ0ZXIgbGluayBkb3duICovCisJLyogKi8KIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwID0gMDsKIAlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDggPSAwOwogCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPSAwOwpAQCAtMjA0MywzNyArMjA2NCwzNiBAQAogCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPSAwOwogCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9IDA7CiAKLQkvLyBSZXN0b3JlIE1sbWVSYXRlCisJLyogUmVzdG9yZSBNbG1lUmF0ZSAqLwogCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKIAlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKIAotCS8vCi0JLy8gQWZ0ZXIgTGluayBkb3duLCByZXNldCBwaWdneS1iYWNrIHNldHRpbmcgaW4gQVNJQy4gRGlzYWJsZSBSREcuCi0JLy8KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKKwkvKiAqLworCS8qIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLiAqLworCS8qICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkgewogCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQnl0ZVZhbHVlKTsKIAkJQnl0ZVZhbHVlICY9ICh+MHgxOCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJ5dGVWYWx1ZSk7CiAJfQotCi0JLy8gUmVzZXQgREFDCisJLyogUmVzZXQgREFDICovCiAJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQnl0ZVZhbHVlKTsKIAlCeXRlVmFsdWUgJj0gKH4weDE4KTsKLQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCXsKKwlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSB7CiAJCUJ5dGVWYWx1ZSB8PSAweDEwOwogCX0KIAlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCeXRlVmFsdWUpOwogCi0JUlRNUFNldFBpZ2d5QmFjayhwQWQsRkFMU0UpOworCVJUTVBTZXRQaWdneUJhY2socEFkLCBGQUxTRSk7CiAJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUElHR1lCQUNLX0lOVVNFRCk7CiAKIAlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkOwogCi0JLy8gUmVzdG9yZSBhbGwgc2V0dGluZ3MgaW4gdGhlIGZvbGxvd2luZy4KLQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsIChBTExOX1NFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxPRkRNU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKKwkvKiBSZXN0b3JlIGFsbCBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nLiAqLworCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwKKwkJCSAgKEFMTE5fU0VUUFJPVEVDVCB8IENDS1NFVFBST1RFQ1QgfCBPRkRNU0VUUFJPVEVDVCksCisJCQkgIFRSVUUsIEZBTFNFKTsKIAlBc2ljRGlzYWJsZVJERyhwQWQpOwogCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gRkFMU0U7CiAJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTm93QXRoZXJvc0J1cnN0T24gPSBGQUxTRTsKQEAgLTIwODEsMzAgKzIxMDEsMTcgQEAKIAlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQVhfTEVOX0NGRywgMHgxZmZmKTsKIAlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKIAotI2lmZGVmIFJUMjg2MAotCS8vIEFsbG93IGdvIHRvIHNsZWVwIGFmdGVyIGxpbmtkb3duIHN0ZXBzLgorLyogQWxsb3cgZ28gdG8gc2xlZXAgYWZ0ZXIgbGlua2Rvd24gc3RlcHMuICovCiAJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZgogCi0JewotCQl1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0JCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgTUFDX0FERFJfTEVOKTsKLQkJd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7CisKKyNpZmRlZiBSVDMweHgKKwlpZiAoKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzM5MChwQWQpKQorCSAgICAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEgfHwgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA+IDEpKSB7CisJCVJUTVBfQVNJQ19NTVBTX0RJU0FCTEUocEFkKTsKIAl9Ci0KLQlpZiAoSVNfUlQzMDkwKHBBZCkpCi0JewotCQlVSU5UMzIJCQkJbWFjZGF0YTsKLQkJLy8gZGlzYWJsZSBNTVBTIEJCUCBjb250cm9sIHJlZ2lzdGVyCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJ5dGVWYWx1ZSk7Ci0JCUJ5dGVWYWx1ZSAmPSB+KDB4MDQpOwkvL2JpdCAyCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJ5dGVWYWx1ZSk7Ci0KLQkJLy8gZGlzYWJsZSBNTVBTIE1BQyBjb250cm9sIHJlZ2lzdGVyCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMjEwLCAmbWFjZGF0YSk7Ci0JCW1hY2RhdGEgJj0gfigweDA5KTsJLy9iaXQgMCwgMwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAweDEyMTAsIG1hY2RhdGEpOwotCX0KKyNlbmRpZiAvKiBSVDMweHggLy8gKi8KIH0KIAogLyoKQEAgLTIxMTUsMTEyICsyMTIyLDE0OCBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgSXRlcmF0ZU9uQnNzVGFiKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICBTdGFydFJlcTsKLQlNTE1FX0pPSU5fUkVRX1NUUlVDVCAgICBKb2luUmVxOwotCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKKwlzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEgU3RhcnRSZXE7CisJc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgSm9pblJlcTsKKwl1bnNpZ25lZCBsb25nIEJzc0lkeDsKIAotCS8vIENoYW5nZSB0aGUgd2Vwc3RhdHVzIHRvIG9yaWdpbmFsIHdlcHN0YXR1cwotCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CisJLyogQ2hhbmdlIHRoZSB3ZXBzdGF0dXMgdG8gb3JpZ2luYWwgd2Vwc3RhdHVzICovCisJcEFkLT5TdGFDZmcuV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKKwlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKIAlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7CiAKIAlCc3NJZHggPSBwQWQtPk1sbWVBdXguQnNzSWR4OwotCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikKLQl7Ci0JCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCi0JCS8vIFdlIGNhbiBvbmx5IGNvbm5lY3QgdG8gQVAgd2l0aCBsZXNzIHNlY3VyZWQgY2lwaGVyIHNldHRpbmcKLQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLkdyb3VwQ2lwaGVyOworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikgeworCQkvKiBDaGVjayBjaXBoZXIgc3VpdGUsIEFQIG11c3QgaGF2ZSBtb3JlIHNlY3VyZWQgY2lwaGVyIHRoYW4gc3RhdGlvbiBzZXR0aW5nICovCisJCS8qIFNldCB0aGUgUGFpcndpc2UgYW5kIEdyb3VwIGNpcGhlciB0byBtYXRjaCB0aGUgaW50ZW5kZWQgQVAgc2V0dGluZyAqLworCQkvKiBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nICovCisJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQorCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpIHsKKwkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0KKwkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS4KKwkJCSAgICBHcm91cENpcGhlcjsKIAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyOwotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXg7Ci0JCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLgorCQkJICAgIFBhaXJDaXBoZXIpCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uCisJCQkJICAgIFdQQS5QYWlyQ2lwaGVyOworCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuCisJCQkJIFBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLgorCQkJCSAgICBXUEEuUGFpckNpcGhlckF1eDsKKwkJCWVsc2UJLyogVGhlcmUgaXMgbm8gUGFpckNpcGhlciBBdXgsIGRvd25ncmFkZSBvdXIgY2FwYWJpbGl0eSB0byBUS0lQICovCisJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCX0gZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQkgICB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0KKwkJCSAgICAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkgeworCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPQorCQkJICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCSAgICBHcm91cENpcGhlcjsKKworCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PQorCQkJICAgIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi4KKwkJCSAgICBQYWlyQ2lwaGVyKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLgorCQkJCSAgICBXUEEyLlBhaXJDaXBoZXI7CisJCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuCisJCQkJIFBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQorCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLgorCQkJCSAgICBXUEEyLlBhaXJDaXBoZXJBdXg7CisJCQllbHNlCS8qIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUCAqLworCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOworCisJCQkvKiBSU04gY2FwYWJpbGl0eSAqLworCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9CisJCQkgICAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLgorCQkJICAgIFJzbkNhcGFiaWxpdHk7CiAJCX0KLQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuR3JvdXBDaXBoZXI7CisJCS8qIFNldCBNaXggY2lwaGVyIGZsYWcgKi8KKwkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9CisJCSAgICAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PQorCQkgICAgIHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKKwkJLyppZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQorCQkgICB7CisJCSAgIC8vIElmIG1peCBjaXBoZXIsIHJlLWJ1aWxkIFJTTklFCisJCSAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCAwKTsKKwkJICAgfSAqLwogCi0JCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcjsKLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4ICE9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQllbHNlCS8vIFRoZXJlIGlzIG5vIFBhaXJDaXBoZXIgQXV4LCBkb3duZ3JhZGUgb3VyIGNhcGFiaWxpdHkgdG8gVEtJUAotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCi0JCQkvLyBSU04gY2FwYWJpbGl0eQotCQkJcEFkLT5TdGFDZmcuUnNuQ2FwYWJpbGl0eSA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Sc25DYXBhYmlsaXR5OwotCQl9Ci0KLQkJLy8gU2V0IE1peCBjaXBoZXIgZmxhZwotCQlwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID0gKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIpID8gRkFMU0UgOiBUUlVFOwotCQlpZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQotCQl7Ci0JCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQotCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOcikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwKKwkJCSAgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIpKTsKIAkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIEJzc0lkeCk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9KT0lOX1JFUSwgc2l6ZW9mKE1MTUVfSk9JTl9SRVFfU1RSVUNUKSwKLQkJCQkJJkpvaW5SZXEpOworCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2pvaW5fcmVxKSwgJkpvaW5SZXEpOwogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0pPSU47Ci0JfQotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBCU1MgZmFpbDsgc3RhcnQgYSBuZXcgQURIT0MgKFNzaWQ9JXMpLi4uXG4iLHBBZC0+TWxtZUF1eC5Tc2lkKSk7Ci0JCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsIHNpemVvZihNTE1FX1NUQVJUX1JFUV9TVFJVQ1QpLCAmU3RhcnRSZXEpOworCX0gZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJDTlRMIC0gQWxsIEJTUyBmYWlsOyBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIsCisJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkKSk7CisJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIChjaGFyICopcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkgICAgICBwQWQtPk1sbWVBdXguU3NpZExlbik7CisJCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSksICZTdGFydFJlcSk7CiAJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7Ci0JfQotCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl9IGVsc2UJCQkvKiBubyBtb3JlIEJTUyAqLwogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCByb2FtaW5nIGZhaWxlZCwgc3RheSBAIGNoICMlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7CisKKwkJeworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLAorCQkJCSAgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5TY2FuVGFiLkJzc05yKSk7CisJCX0KKwogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwogCX0KIH0KIAotLy8gZm9yIHJlLWFzc29jaWF0aW9uIG9ubHkKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBJdGVyYXRlT25Cc3NUYWIyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQorLyogZm9yIHJlLWFzc29jaWF0aW9uIG9ubHkgKi8KKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBJdGVyYXRlT25Cc3NUYWIyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCBSZWFzc29jUmVxOwotCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKLQlCU1NfRU5UUlkgICAgICAgICAgICAgICAqcEJzczsKKwlzdHJ1Y3QgcnRfbWxtZV9hc3NvY19yZXEgUmVhc3NvY1JlcTsKKwl1bnNpZ25lZCBsb25nIEJzc0lkeDsKKwlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzOwogCiAJQnNzSWR4ID0gcEFkLT5NbG1lQXV4LlJvYW1JZHg7CiAJcEJzcyA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NFbnRyeVtCc3NJZHhdOwogCi0JaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Sb2FtVGFiLkJzc05yKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGl0ZXJhdGUgQlNTICVsZCBvZiAlZFxuIiwgQnNzSWR4LCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikpOworCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwKKwkJCSAgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKIAogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwsIEZBTFNFKTsKIAkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCk7CiAKLQkJLy8gcmVhc3NvY2lhdGUgbWVzc2FnZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGFzc29jaWF0ZSBtZXNzYWdlCi0JCUFzc29jUGFybUZpbGwocEFkLCAmUmVhc3NvY1JlcSwgcEJzcy0+QnNzaWQsIHBCc3MtPkNhcGFiaWxpdHlJbmZvLAotCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7CisJCS8qIHJlYXNzb2NpYXRlIG1lc3NhZ2UgaGFzIHRoZSBzYW1lIHN0cnVjdHVyZSBhcyBhc3NvY2lhdGUgbWVzc2FnZSAqLworCQlBc3NvY1Bhcm1GaWxsKHBBZCwgJlJlYXNzb2NSZXEsIHBCc3MtPkJzc2lkLAorCQkJICAgICAgcEJzcy0+Q2FwYWJpbGl0eUluZm8sIEFTU09DX1RJTUVPVVQsCisJCQkgICAgICBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwogCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLAotCQkJCQlzaXplb2YoTUxNRV9SRUFTU09DX1JFUV9TVFJVQ1QpLCAmUmVhc3NvY1JlcSk7CisJCQkgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2Fzc29jX3JlcSksICZSZWFzc29jUmVxKTsKIAogCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7Ci0JfQotCWVsc2UgLy8gbm8gbW9yZSBCU1MKKwl9IGVsc2UJCQkvKiBubyBtb3JlIEJTUyAqLwogCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFsbCBmYXN0IHJvYW1pbmcgZmFpbGVkLCBiYWNrIHRvIGNoICMlZFxuIixwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKworCQl7CisJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ05UTCAtIEFsbCByb2FtaW5nIGZhaWxlZCwgcmVzdG9yZSB0byBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIsCisJCQkJICBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKKwkJfQorCiAJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7CiAJfQogfQpAQCAtMjIzMywxMCArMjI3Niw4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgSm9pblBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX0pPSU5fUkVRX1NUUlVDVCAqSm9pblJlcSwKLQlJTiBVTE9ORyBCc3NJZHgpCit2b2lkIEpvaW5QYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgKkpvaW5SZXEsIHVuc2lnbmVkIGxvbmcgQnNzSWR4KQogewogCUpvaW5SZXEtPkJzc0lkeCA9IEJzc0lkeDsKIH0KQEAgLTIyNDksMTUgKzIyOTAsMTIgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBTY2FuUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfU0NBTl9SRVFfU1RSVUNUICpTY2FuUmVxLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVQ0hBUiBTY2FuVHlwZSkKK3ZvaWQgU2NhblBhcm1GaWxsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICBzdHJ1Y3QgcnRfbWxtZV9zY2FuX3JlcSAqU2NhblJlcSwKKwkJICBjaGFyIFNzaWRbXSwKKwkJICB1OCBTc2lkTGVuLCB1OCBCc3NUeXBlLCB1OCBTY2FuVHlwZSkKIHsKLSAgICBOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCU5kaXNaZXJvTWVtb3J5KFNjYW5SZXEtPlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7CiAJU2NhblJlcS0+U3NpZExlbiA9IFNzaWRMZW47CiAJTmRpc01vdmVNZW1vcnkoU2NhblJlcS0+U3NpZCwgU3NpZCwgU3NpZExlbik7CiAJU2NhblJlcS0+QnNzVHlwZSA9IEJzc1R5cGU7CkBAIC0yMjcyLDExICsyMzEwLDkgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBTdGFydFBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKlN0YXJ0UmVxLAotCUlOIENIQVIgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4pCit2b2lkIFN0YXJ0UGFybUZpbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkgICBzdHJ1Y3QgcnRfbWxtZV9zdGFydF9yZXEgKlN0YXJ0UmVxLAorCQkgICBjaGFyIFNzaWRbXSwgdTggU3NpZExlbikKIHsKIAlBU1NFUlQoU3NpZExlbiA8PSBNQVhfTEVOX09GX1NTSUQpOwogCU5kaXNNb3ZlTWVtb3J5KFN0YXJ0UmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKQEAgLTIyOTEsMTEgKzIzMjcsOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIEF1dGhQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFVTSE9SVCBBbGcpCit2b2lkIEF1dGhQYXJtRmlsbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgc3RydWN0IHJ0X21sbWVfYXV0aF9yZXEgKkF1dGhSZXEsCisJCSAgdTggKnBBZGRyLCB1MTYgQWxnKQogewogCUNPUFlfTUFDX0FERFIoQXV0aFJlcS0+QWRkciwgcEFkZHIpOwogCUF1dGhSZXEtPkFsZyA9IEFsZzsKQEAgLTIzMTAsODIgKzIzNDQsMTA5IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi0KLQotI2lmZGVmIFJUMjg3MAotCi1WT0lEIE1sbWVDbnRsQ29uZmlybSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVTSE9SVCBNc2cpCisjaWZkZWYgUlRNUF9NQUNfUENJCit2b2lkIENvbXBvc2VQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1zZ1R5cGUsIHNpemVvZihVU0hPUlQpLCAmTXNnKTsKLX0KLSNlbmRpZgotCi1WT0lEIENvbXBvc2VQc1BvbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0jaWZkZWYgUlQyODcwCi0JUFRYSU5GT19TVFJVQwkJcFR4SW5mbzsKLQlQVFhXSV9TVFJVQwkJcFR4V0k7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb21wb3NlUHNQb2xsXG4iKSk7Ci0jZW5kaWYKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKFBTUE9MTF9GUkFNRSkpOwotCi0jaWZkZWYgUlQyODcwCi0JcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gMDsKLSNlbmRpZgorCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2Yoc3RydWN0IHJ0X3BzcG9sbF9mcmFtZSkpOwogCXBBZC0+UHNQb2xsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0NOVEw7CiAJcEFkLT5Qc1BvbGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9QU19QT0xMOwogCXBBZC0+UHNQb2xsRnJhbWUuQWlkID0gcEFkLT5TdGFBY3RpdmUuQWlkIHwgMHhDMDAwOwogCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5UYSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLSNpZmRlZiBSVDI4NzAKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFswXSwgMTAwKTsKLQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07Ci0JUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKFBTUE9MTF9GUkFNRSkrVFhXSV9TSVpFKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7Ci0JcFR4V0kgPSAoUFRYV0lfU1RSVUMpJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOwotCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLCBCU1NJRF9XQ0lELCAoc2l6ZW9mKFBTUE9MTF9GUkFNRSkpLAotCQkwLCAgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JUlRNUE1vdmVNZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFK1RYSU5GT19TSVpFXSwgJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKLQkvLyBBcHBlbmQgNCBleHRyYSB6ZXJvIGJ5dGVzLgotCXBBZC0+UHNQb2xsQ29udGV4dC5CdWxrT3V0U2l6ZSA9ICBUWElORk9fU0laRSArIFRYV0lfU0laRSArIHNpemVvZihQU1BPTExfRlJBTUUpICsgNDsKLSNlbmRpZgogfQogCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgQ29tcG9zZU51bGxGcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKKy8qIElSUUwgPSBESVNQQVRDSF9MRVZFTCAqLwordm9pZCBDb21wb3NlTnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLSNpZmRlZiBSVDI4NzAKLQlQVFhJTkZPX1NUUlVDCQlwVHhJbmZvOwotCVBUWFdJX1NUUlVDCQlwVHhXSTsKLSNlbmRpZgotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CiAJcEFkLT5OdWxsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0RBVEE7CiAJcEFkLT5OdWxsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfTlVMTF9GVU5DOwogCXBBZC0+TnVsbEZyYW1lLkZDLlRvRHMgPSAxOwogCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKIAlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0jaWZkZWYgUlQyODcwCi0JUlRNUFplcm9NZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAxMDApOwotCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07Ci0JUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoc2l6ZW9mKEhFQURFUl84MDJfMTEpK1RYV0lfU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOwotCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtUWElORk9fU0laRV07Ci0JUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2YoSEVBREVSXzgwMl8xMSkpLAotCQkwLCAwLCAoVUNIQVIpcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUywgSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5OdWxsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFK1RYSU5GT19TSVpFXSwgJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKLSNlbmRpZgorfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgordm9pZCBNbG1lQ250bENvbmZpcm0oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1bnNpZ25lZCBsb25nIE1zZ1R5cGUsIHUxNiBNc2cpCit7CisJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTXNnVHlwZSwgc2l6ZW9mKHUxNiksCisJCSAgICAmTXNnKTsKIH0KIAordm9pZCBDb21wb3NlUHNQb2xsKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgcnRfdHhpbmZvICpwVHhJbmZvOworCXN0cnVjdCBydF90eHdpICogcFR4V0k7CiAKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDb21wb3NlUHNQb2xsXG4iKSk7CisJTmRpc1plcm9NZW1vcnkoJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSk7CiAKKwlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSAwOworCXBBZC0+UHNQb2xsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0NOVEw7CisJcEFkLT5Qc1BvbGxGcmFtZS5GQy5TdWJUeXBlID0gU1VCVFlQRV9QU19QT0xMOworCXBBZC0+UHNQb2xsRnJhbWUuQWlkID0gcEFkLT5TdGFBY3RpdmUuQWlkIHwgMHhDMDAwOworCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCUNPUFlfTUFDX0FERFIocEFkLT5Qc1BvbGxGcmFtZS5UYSwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisKKwlSVE1QWmVyb01lbW9yeSgmcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkJICAgICAgIFdpcmVsZXNzUGFja2V0WzBdLCAxMDApOworCXBUeEluZm8gPQorCSAgICAoc3RydWN0IHJ0X3R4aW5mbyAqKSYgcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkgICAgV2lyZWxlc3NQYWNrZXRbMF07CisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywKKwkJCSh1MTYpKHNpemVvZihzdHJ1Y3QgcnRfcHNwb2xsX2ZyYW1lKSArIFRYV0lfU0laRSksIFRSVUUsCisJCQlFcFRvUXVldWVbTUdNVFBJUEVJRFhdLCBGQUxTRSwgRkFMU0UpOworCXBUeFdJID0KKwkgICAgKHN0cnVjdCBydF90eHdpICopICYgcEFkLT5Qc1BvbGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkgICAgV2lyZWxlc3NQYWNrZXRbVFhJTkZPX1NJWkVdOworCVJUTVBXcml0ZVR4V0kocEFkLCBwVHhXSSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCAwLAorCQkgICAgICBCU1NJRF9XQ0lELCAoc2l6ZW9mKHN0cnVjdCBydF9wc3BvbGxfZnJhbWUpKSwgMCwgMCwKKwkJICAgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsCisJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJUlRNUE1vdmVNZW1vcnkoJnBBZC0+UHNQb2xsQ29udGV4dC5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuCisJCSAgICAgICBXaXJlbGVzc1BhY2tldFtUWFdJX1NJWkUgKyBUWElORk9fU0laRV0sCisJCSAgICAgICAmcEFkLT5Qc1BvbGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9wc3BvbGxfZnJhbWUpKTsKKwkvKiBBcHBlbmQgNCBleHRyYSB6ZXJvIGJ5dGVzLiAqLworCXBBZC0+UHNQb2xsQ29udGV4dC5CdWxrT3V0U2l6ZSA9CisJICAgIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgc2l6ZW9mKHN0cnVjdCBydF9wc3BvbGxfZnJhbWUpICsgNDsKK30KKworLyogSVJRTCA9IERJU1BBVENIX0xFVkVMICovCit2b2lkIENvbXBvc2VOdWxsRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQoreworCXN0cnVjdCBydF90eGluZm8gKnBUeEluZm87CisJc3RydWN0IHJ0X3R4d2kgKiBwVHhXSTsKKworCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk51bGxGcmFtZSwgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSk7CisJcEFkLT5OdWxsRnJhbWUuRkMuVHlwZSA9IEJUWVBFX0RBVEE7CisJcEFkLT5OdWxsRnJhbWUuRkMuU3ViVHlwZSA9IFNVQlRZUEVfTlVMTF9GVU5DOworCXBBZC0+TnVsbEZyYW1lLkZDLlRvRHMgPSAxOworCUNPUFlfTUFDX0FERFIocEFkLT5OdWxsRnJhbWUuQWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJUlRNUFplcm9NZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgICAgV2lyZWxlc3NQYWNrZXRbMF0sIDEwMCk7CisJcFR4SW5mbyA9CisJICAgIChzdHJ1Y3QgcnRfdHhpbmZvICopJiBwQWQtPk51bGxDb250ZXh0LlRyYW5zZmVyQnVmZmVyLT5maWVsZC4KKwkgICAgV2lyZWxlc3NQYWNrZXRbMF07CisJUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywKKwkJCSh1MTYpKHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkgKyBUWFdJX1NJWkUpLCBUUlVFLAorCQkJRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsIEZBTFNFKTsKKwlwVHhXSSA9CisJICAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAmIHBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCSAgICBXaXJlbGVzc1BhY2tldFtUWElORk9fU0laRV07CisJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsCisJCSAgICAgIEJTU0lEX1dDSUQsIChzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKSwgMCwgMCwKKwkJICAgICAgKHU4KXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsCisJCSAgICAgIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7CisJUlRNUE1vdmVNZW1vcnkoJnBBZC0+TnVsbENvbnRleHQuVHJhbnNmZXJCdWZmZXItPmZpZWxkLgorCQkgICAgICAgV2lyZWxlc3NQYWNrZXRbVFhXSV9TSVpFICsgVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwlwQWQtPk51bGxDb250ZXh0LkJ1bGtPdXRTaXplID0KKwkgICAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKK30KKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjM5Nyw3MyArMjQ1OCw3MSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1VTE9ORyBNYWtlSWJzc0JlYWNvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3Vuc2lnbmVkIGxvbmcgTWFrZUlic3NCZWFjb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSICAgICAgICAgRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKLQlVQ0hBUiAgICAgICAgIExvY2FsRXJwSWVbM10gPSB7SUVfRVJQLCAxLCAweDA0fTsKLQlIRUFERVJfODAyXzExIEJjbkhkcjsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOworCXU4IERzTGVuID0gMSwgSWJzc0xlbiA9IDI7CisJdTggTG9jYWxFcnBJZVszXSA9IHsgSUVfRVJQLCAxLCAweDA0IH07CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgQmNuSGRyOworCXUxNiBDYXBhYmlsaXR5SW5mbzsKIAlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JUFRYV0lfU1RSVUMJICBwVHhXSSA9ICZwQWQtPkJlYWNvblR4V0k7Ci0JQ0hBUiAgICAgICAgICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKLQlCT09MRUFOICAgICAgIFByaXZhY3k7Ci0JVUNIQVIgICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW4gPSAwOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlTGVuID0gMDsKLQlVQ0hBUiAgICAgICAgIFJTTkllID0gSUVfV1BBOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXN0cnVjdCBydF90eHdpICogcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOworCXU4ICpwQmVhY29uRnJhbWUgPSBwQWQtPkJlYWNvbkJ1ZjsKKwlCT09MRUFOIFByaXZhY3k7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggU3VwUmF0ZUxlbiA9IDA7CisJdTggRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggRXh0UmF0ZUxlbiA9IDA7CisJdTggUlNOSWUgPSBJRV9XUEE7CiAKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKQotCXsKLQkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcwotCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCi0JCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcwotCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcworCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQorCSAgICAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkpIHsKKwkJU3VwUmF0ZVswXSA9IDB4ODI7CS8qIDEgbWJwcyAqLworCQlTdXBSYXRlWzFdID0gMHg4NDsJLyogMiBtYnBzICovCisJCVN1cFJhdGVbMl0gPSAweDhiOwkvKiA1LjUgbWJwcyAqLworCQlTdXBSYXRlWzNdID0gMHg5NjsJLyogMTEgbWJwcyAqLwogCQlTdXBSYXRlTGVuID0gNDsKIAkJRXh0UmF0ZUxlbiA9IDA7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQl7Ci0JCVN1cFJhdGVbMF0gID0gMHg4QzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQlTdXBSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZVsyXSAgPSAweDk4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQlTdXBSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbNF0gID0gMHhiMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZUxlbiAgPSA4OwotCQlFeHRSYXRlTGVuICA9IDA7CisJfSBlbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIHsKKwkJU3VwUmF0ZVswXSA9IDB4OEM7CS8qIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJU3VwUmF0ZVsxXSA9IDB4MTI7CS8qIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJU3VwUmF0ZVsyXSA9IDB4OTg7CS8qIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlICovCisJCVN1cFJhdGVbM10gPSAweDI0OwkvKiAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlTdXBSYXRlWzRdID0gMHhiMDsJLyogMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUgKi8KKwkJU3VwUmF0ZVs1XSA9IDB4NDg7CS8qIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCVN1cFJhdGVbNl0gPSAweDYwOwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlTdXBSYXRlWzddID0gMHg2YzsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJU3VwUmF0ZUxlbiA9IDg7CisJCUV4dFJhdGVMZW4gPSAwOwogCi0JCS8vCi0JCS8vIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5Ci0JCS8vCisJCS8qICovCisJCS8qIEFsc28gVXBkYXRlIE1sbWVSYXRlICYgUnRzUmF0ZSBmb3IgRyBvbmx5ICYgQSBvbmx5ICovCisJCS8qICovCiAJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwogCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwogCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JfQotCWVsc2UKLQl7Ci0JCVN1cFJhdGVbMF0gPSAweDgyOyAvLyAxIG1icHMKLQkJU3VwUmF0ZVsxXSA9IDB4ODQ7IC8vIDIgbWJwcwotCQlTdXBSYXRlWzJdID0gMHg4YjsgLy8gNS41IG1icHMKLQkJU3VwUmF0ZVszXSA9IDB4OTY7IC8vIDExIG1icHMKKwkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9CisJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0KKwkJICAgIE1PREVfT0ZETTsKKwkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9CisJCSAgICBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07CisJfSBlbHNlIHsKKwkJU3VwUmF0ZVswXSA9IDB4ODI7CS8qIDEgbWJwcyAqLworCQlTdXBSYXRlWzFdID0gMHg4NDsJLyogMiBtYnBzICovCisJCVN1cFJhdGVbMl0gPSAweDhiOwkvKiA1LjUgbWJwcyAqLworCQlTdXBSYXRlWzNdID0gMHg5NjsJLyogMTEgbWJwcyAqLwogCQlTdXBSYXRlTGVuID0gNDsKIAotCQlFeHRSYXRlWzBdICA9IDB4MEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCi0JCUV4dFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzJdICA9IDB4MTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVbNF0gID0gMHgzMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCi0JCUV4dFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVMZW4gID0gODsKKwkJRXh0UmF0ZVswXSA9IDB4MEM7CS8qIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsICovCisJCUV4dFJhdGVbMV0gPSAweDEyOwkvKiA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCUV4dFJhdGVbMl0gPSAweDE4OwkvKiAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgKi8KKwkJRXh0UmF0ZVszXSA9IDB4MjQ7CS8qIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCUV4dFJhdGVbNF0gPSAweDMwOwkvKiAyNCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgKi8KKwkJRXh0UmF0ZVs1XSA9IDB4NDg7CS8qIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzICovCisJCUV4dFJhdGVbNl0gPSAweDYwOwkvKiA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcyAqLworCQlFeHRSYXRlWzddID0gMHg2YzsJLyogNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMgKi8KKwkJRXh0UmF0ZUxlbiA9IDg7CiAJfQogCiAJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47CkBAIC0yNDcxLDk5ICsyNTMwLDk2IEBACiAJcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IEV4dFJhdGVMZW47CiAJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgRXh0UmF0ZUxlbik7CiAKLQkvLyBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8Ci0JCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKLQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKwkvKiBjb21wb3NlIElCU1MgYmVhY29uIGZyYW1lICovCisJTWd0TWFjSGVhZGVySW5pdChwQWQsICZCY25IZHIsIFNVQlRZUEVfQkVBQ09OLCAwLCBCUk9BRENBU1RfQUREUiwKKwkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCSAgICB8fCAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOworCUNhcGFiaWxpdHlJbmZvID0KKwkgICAgQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksCisJCQkgKHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwKKwkJCSAwLCAwKTsKIAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSwgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgICAgICAgICZCY25IZHIsCi0JCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVMZW4sCi0JCQkJCSAgU3VwUmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgU3VwUmF0ZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNMZW4sCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0xlbiwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lLCAmRnJhbWVMZW4sCisJCQkgIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSksICZCY25IZHIsCisJCQkgIFRJTUVTVEFNUF9MRU4sICZGYWtlVGltZXN0YW1wLAorCQkJICAyLCAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAorCQkJICAyLCAmQ2FwYWJpbGl0eUluZm8sCisJCQkgIDEsICZTc2lkSWUsCisJCQkgIDEsICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAorCQkJICAxLCAmU3VwUmF0ZUllLAorCQkJICAxLCAmU3VwUmF0ZUxlbiwKKwkJCSAgU3VwUmF0ZUxlbiwgU3VwUmF0ZSwKKwkJCSAgMSwgJkRzSWUsCisJCQkgIDEsICZEc0xlbiwKKwkJCSAgMSwgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkgIDEsICZJYnNzSWUsCisJCQkgIDEsICZJYnNzTGVuLCAyLCAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwgRU5EX09GX0FSR1MpOwogCi0JLy8gYWRkIEVSUF9JRSBhbmQgRVhUX1JBRSBJRSBvZiBpbiA4MDIuMTFnCi0JaWYgKEV4dFJhdGVMZW4pCi0JewotCQlVTE9ORwl0bXA7CisJLyogYWRkIEVSUF9JRSBhbmQgRVhUX1JBRSBJRSBvZiBpbiA4MDIuMTFnICovCisJaWYgKEV4dFJhdGVMZW4pIHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CiAKLQkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICAgICAgICAgJnRtcCwKLQkJCQkJCSAgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxFcnBJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCi0JCQkJCQkgIEV4dFJhdGVMZW4sICAgICAgICAgICAgICAgICAgICAgIEV4dFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJICAzLCBMb2NhbEVycEllLAorCQkJCSAgMSwgJkV4dFJhdGVJZSwKKwkJCQkgIDEsICZFeHRSYXRlTGVuLAorCQkJCSAgRXh0UmF0ZUxlbiwgRXh0UmF0ZSwgRU5EX09GX0FSR1MpOworCQlGcmFtZUxlbiArPSB0bXA7CisJfQorCS8qIElmIGFkaG9jIHNlY3J1aXR5IGlzIHNldCBmb3IgV1BBLU5vbmUsIGFwcGVuZCB0aGUgY2lwaGVyIHN1aXRlIElFICovCisJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpIHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCVJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLAorCQkJICAgICAgQlNTMCk7CisKKwkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sICZ0bXAsCisJCQkJICAxLCAmUlNOSWUsCisJCQkJICAxLCAmcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAorCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLCBwQWQtPlN0YUNmZy5SU05fSUUsCisJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCUZyYW1lTGVuICs9IHRtcDsKIAl9CiAKLQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQotCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCXsKLQkJVUxPTkcgdG1wOwotICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7CisJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKSB7CisJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQl1OCBIdExlbiwgSHRMZW4xOwogCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgCSZ0bXAsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZSU05JZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJCXBBZC0+U3RhQ2ZnLlJTTl9JRSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlGcmFtZUxlbiArPSB0bXA7Ci0JfQotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCXsKLQkJVUxPTkcgVG1wTGVuOwotCQlVQ0hBUiBIdExlbiwgSHRMZW4xOwotCi0JCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCisJCS8qIGFkZCBIVCBDYXBhYmlsaXR5IElFICovCiAJCUh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSk7CiAJCUh0TGVuMSA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pOwogCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZStGcmFtZUxlbiwJJlRtcExlbiwKLQkJCQkJCSAgMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCSAgMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkgIEh0TGVuLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKLQkJCQkJCSAgMSwJCQkJCQkmQWRkSHRJbmZvSWUsCi0JCQkJCQkgIDEsCQkJCQkJJkh0TGVuMSwKLQkJCQkJCSAgSHRMZW4xLAkJCQkJJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywKLQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUgKyBGcmFtZUxlbiwgJlRtcExlbiwKKwkJCQkgIDEsICZIdENhcEllLAorCQkJCSAgMSwgJkh0TGVuLAorCQkJCSAgSHRMZW4sICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCisJCQkJICAxLCAmQWRkSHRJbmZvSWUsCisJCQkJICAxLCAmSHRMZW4xLAorCQkJCSAgSHRMZW4xLCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAorCQkJCSAgRU5EX09GX0FSR1MpOwogCiAJCUZyYW1lTGVuICs9IFRtcExlbjsKIAl9Ci0KLQkvL2JlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmCi0gICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLSAgICB7Ci0JUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAotCQlQSURfTUdNVCwgUElEX0JFQUNPTiwgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFNldCB0byB1c2UgMU1icHMgZm9yIEFkaG9jIGJlYWNvbi4KKwkvKmJlYWNvbiB1c2UgcmVzZXJ2ZWQgV0NJRCAweGZmICovCisJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgeworCQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIEZBTFNFLAorCQkJICAgICAgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sIFBJRF9NR01ULCBQSURfQkVBQ09OLAorCQkJICAgICAgUkFURV8xLCBJRlNfSFRUWE9QLCBGQUxTRSwKKwkJCSAgICAgICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOworCX0gZWxzZSB7CisJCS8qIFNldCB0byB1c2UgMU1icHMgZm9yIEFkaG9jIGJlYWNvbi4gKi8KIAkJSFRUUkFOU01JVF9TRVRUSU5HIFRyYW5zbWl0OwotICAgICAgICBUcmFuc21pdC53b3JkID0gMDsKLSAgICAgICAgUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsICBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLAotICAgIAkJUElEX01HTVQsIFBJRF9CRUFDT04sIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZUcmFuc21pdCk7Ci0gICAgfQorCQlUcmFuc21pdC53b3JkID0gMDsKKwkJUlRNUFdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIFRSVUUsIEZBTFNFLCBGQUxTRSwKKwkJCSAgICAgIFRSVUUsIDAsIDB4ZmYsIEZyYW1lTGVuLCBQSURfTUdNVCwgUElEX0JFQUNPTiwKKwkJCSAgICAgIFJBVEVfMSwgSUZTX0hUVFhPUCwgRkFMU0UsICZUcmFuc21pdCk7CisJfQogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFrZUlic3NCZWFjb24gKGxlbj0lbGQpLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkLCBDaGFubmVsPSVkLCBQaHlNb2RlPSVkXG4iLAotCQkJCQlGcmFtZUxlbiwgU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJNYWtlSWJzc0JlYWNvbiAobGVuPSVsZCksIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIENoYW5uZWw9JWQsIFBoeU1vZGU9JWRcbiIsCisJCSAgRnJhbWVMZW4sIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW4sIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCSAgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwogCXJldHVybiBGcmFtZUxlbjsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9ydG1wX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCmluZGV4IGY3NTFhYjYuLjVkMzQ4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3J0bXBfZGF0YS5jCkBAIC0zMywxMTEgKzMzLDE2NyBAQAogCVJldmlzaW9uIEhpc3Rvcnk6CiAJV2hvIAkJV2hlbgkJCVdoYXQKIAktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJICAgICAgQXVnLzE3LzA0CQltYWpvciBtb2RpZmljYXRpb24gZm9yIFJUMjU2MS8yNjYxCi0JSmFuIExlZQkgICAgICBNYXIvMTcvMDYJCW1ham9yIG1vZGlmaWNhdGlvbiBmb3IgUlQyODYwIE5ldyBSaW5nIERlc2lnbgogKi8KICNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAotCi0KLVZPSUQgU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQordm9pZCBTVEFSeEVBUE9MRnJhbWVJbmRpY2F0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwKKwkJCSAgICAgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrLCB1OCBGcm9tV2hpY2hCU1NJRCkKIHsKLQlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlVQ0hBUgkJCSpwVG1wQnVmOworCVBSVDI4WFhfUlhEX1NUUlVDIHBSeEQgPSAmKHBSeEJsay0+UnhEKTsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKKwl1OCAqcFRtcEJ1ZjsKIAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApCi0JewotCQkvLyBBbGwgRUFQb0wgZnJhbWVzIGhhdmUgdG8gcGFzcyB0byB1cHBlciBsYXllciAoZXguIFdQQV9TVVBQTElDQU5UIGRhZW1vbikKLQkJLy8gVEJEIDogcHJvY2VzcyBmcmFnbWVudGVkIEVBUG9sIGZyYW1lcworCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKKwkJLyogQWxsIEVBUG9MIGZyYW1lcyBoYXZlIHRvIHBhc3MgdG8gdXBwZXIgbGF5ZXIgKGV4LiBXUEFfU1VQUExJQ0FOVCBkYWVtb24pICovCisJCS8qIFRCRCA6IHByb2Nlc3MgZnJhZ21lbnRlZCBFQVBvbCBmcmFtZXMgKi8KIAkJewotCQkJLy8gSW4gODAyLjF4IG1vZGUsIGlmIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAtU1VDQ0VTUyBwYWNrZXQsIHR1cm4gb24gdGhlIFBvcnRTZWN1cmVkIHZhcmlhYmxlCi0JCQlpZiAoIHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFICYmCi0JCQkJIChFQVBfQ09ERV9TVUNDRVNTID09IFdwYUNoZWNrRWFwQ29kZShwQWQsIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIExFTkdUSF84MDJfMV9IKSkpCi0JCQl7Ci0JCQkJUFVDSEFSCUtleTsKLQkJCQlVQ0hBUiAJQ2lwaGVyQWxnOwotCQkJCWludCAgICAgaWR4ID0gMDsKKwkJCS8qIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZSAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFICYmCisJCQkgICAgKEVBUF9DT0RFX1NVQ0NFU1MgPT0KKwkJCSAgICAgV3BhQ2hlY2tFYXBDb2RlKHBBZCwgcFJ4QmxrLT5wRGF0YSwKKwkJCQkJICAgICBwUnhCbGstPkRhdGFTaXplLAorCQkJCQkgICAgIExFTkdUSF84MDJfMV9IKSkpIHsKKwkJCQl1OCAqS2V5OworCQkJCXU4IENpcGhlckFsZzsKKwkJCQlpbnQgaWR4ID0gMDsKIAotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1TVUNDRVNTIFBhY2tldFxuIikpOworCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIlJlY2VpdmUgRUFQLVNVQ0NFU1MgUGFja2V0XG4iKSk7CisJCQkJLypwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLwogCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKIAotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlkeCA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleUlkOwotICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5DaXBoZXJBbGc7Ci0JCQkJCUtleSA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleTsKKwkJCQlpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0KKwkJCQkgICAgRkFMU0UpIHsKKwkJCQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQ7CisJCQkJCUNpcGhlckFsZyA9CisJCQkJCSAgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS4KKwkJCQkJICAgIENpcGhlckFsZzsKKwkJCQkJS2V5ID0KKwkJCQkJICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLgorCQkJCQkgICAgS2V5OwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4gPiAwKQotICAgIAkJCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOworCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uCisJCQkJCSAgICBLZXlMZW4gPiAwKSB7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPQorCQkJCQkJICAgICZwQWQtPk1hY1RhYi4KKwkJCQkJCSAgICBDb250ZW50W0JTU0lEX1dDSURdOwogCi0JCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYwotCQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7CisJCQkJCQkvKiBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYyAqLworCQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwKKwkJCQkJCQkJICAgICAgaWR4LAorCQkJCQkJCQkgICAgICBDaXBoZXJBbGcsCisJCQkJCQkJCSAgICAgIEtleSwgTlVMTCwKKwkJCQkJCQkJICAgICAgTlVMTCk7CiAKLQkJCQkJCS8vIEFzc2lnbiBncm91cCBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKKwkJCQkJCS8qIEFzc2lnbiBncm91cCBrZXkgaW5mbyAqLworCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkJCQkgIEJTUzAsCisJCQkJCQkJCQkgIGlkeCwKKwkJCQkJCQkJCSAgQ2lwaGVyQWxnLAorCQkJCQkJCQkJICBOVUxMKTsKIAotCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7CisJCQkJCQkvKiBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8gKi8KKwkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkJICBCU1MwLAorCQkJCQkJCQkJICBpZHgsCisJCQkJCQkJCQkgIENpcGhlckFsZywKKwkJCQkJCQkJCSAgcEVudHJ5KTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQkJCQl1bmlvbgotCQkJCQkJewotCQkJCQkJCWNoYXIgYnVmW3NpemVvZihORElTXzgwMl8xMV9XRVApK01BWF9MRU5fT0ZfS0VZLSAxXTsKLQkJCQkJCQlORElTXzgwMl8xMV9XRVAga2V5aW5mbzsKLQkJCQkJCX0gIFdlcEtleTsKKwkJCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkJCSAgICBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJCXBBZC0+RXh0cmFJbmZvID0KKwkJCQkJCSAgICBHRU5FUkFMX0xJTktfVVA7CisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCQkJCQl1bmlvbiB7CisJCQkJCQkJY2hhciBidWZbc2l6ZW9mCisJCQkJCQkJCSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3dlcCkKKwkJCQkJCQkJICsKKwkJCQkJCQkJIE1BWF9MRU5fT0ZfS0VZCisJCQkJCQkJCSAtIDFdOworCQkJCQkJCXN0cnVjdCBydF9uZGlzXzgwMl8xMV93ZXAga2V5aW5mbzsKKwkJCQkJCX0KKwkJCQkJCVdlcEtleTsKIAkJCQkJCWludCBsZW47CiAKKwkJCQkJCU5kaXNaZXJvTWVtb3J5KCZXZXBLZXksCisJCQkJCQkJICAgICAgIHNpemVvZihXZXBLZXkpKTsKKwkJCQkJCWxlbiA9CisJCQkJCQkgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOwogCi0JCQkJCQlOZGlzWmVyb01lbW9yeSgmV2VwS2V5LCBzaXplb2YoV2VwS2V5KSk7Ci0JCQkJCQlsZW4gPXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKKwkJCQkJCU5kaXNNb3ZlTWVtb3J5KFdlcEtleS5rZXlpbmZvLgorCQkJCQkJCSAgICAgICBLZXlNYXRlcmlhbCwKKwkJCQkJCQkgICAgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlc2lyZVNoYXJlZEtleQorCQkJCQkJCSAgICAgICBbaWR4XS5LZXksCisJCQkJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZXNpcmVTaGFyZWRLZXkKKwkJCQkJCQkgICAgICAgW2lkeF0uS2V5TGVuKTsKIAotCQkJCQkJTmRpc01vdmVNZW1vcnkoV2VwS2V5LmtleWluZm8uS2V5TWF0ZXJpYWwsCi0JCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbik7Ci0KLQkJCQkJCVdlcEtleS5rZXlpbmZvLktleUluZGV4ID0gMHg4MDAwMDAwMCArIGlkeDsKKwkJCQkJCVdlcEtleS5rZXlpbmZvLktleUluZGV4ID0KKwkJCQkJCSAgICAweDgwMDAwMDAwICsgaWR4OwogCQkJCQkJV2VwS2V5LmtleWluZm8uS2V5TGVuZ3RoID0gbGVuOwotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPShVQ0hBUikgKGxlbiA8PSA1ID8gNSA6IDEzKTsKKwkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uCisJCQkJCQkgICAgS2V5TGVuID0KKwkJCQkJCSAgICAodTgpKGxlbiA8PSA1ID8gNSA6IDEzKTsKIAotCQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQkJCQkJCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotCQkJCQkJLy8gbmVlZCB0byBlbnF1ZXVlIGNtZCB0byB0aHJlYWQKLQkJCQkJCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKHBBZCwgT0lEXzgwMl8xMV9BRERfV0VQLCBUUlVFLCAmV2VwS2V5LCBzaXplb2YoV2VwS2V5LmtleWluZm8pICsgbGVuIC0gMSk7Ci0jZW5kaWYgLy8gUlQyODcwIC8vCi0JCQkJCQkvLyBGb3IgUHJldmVudGluZyBTaGFyZEtleSBUYWJsZSBpcyBjbGVhcmVkIGJ5IHJlbW92ZSBrZXkgcHJvY2VkdXJlLgotICAgIAkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA9IHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5LAotCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5LAotCQkJCQkJCQkJICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuKTsKLSAgICAJCQkJfQorCQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJCQkJcEFkLT5FeHRyYUluZm8gPQorCQkJCQkJICAgIEdFTkVSQUxfTElOS19VUDsKKwkJCQkJCS8qIG5lZWQgdG8gZW5xdWV1ZSBjbWQgdG8gdGhyZWFkICovCisJCQkJCQlSVFVTQkVucXVldWVDbWRGcm9tTmRpcyhwQWQsCisJCQkJCQkJCQlPSURfODAyXzExX0FERF9XRVAsCisJCQkJCQkJCQlUUlVFLAorCQkJCQkJCQkJJldlcEtleSwKKwkJCQkJCQkJCXNpemVvZgorCQkJCQkJCQkJKFdlcEtleS4KKwkJCQkJCQkJCSBrZXlpbmZvKQorCQkJCQkJCQkJKyBsZW4gLQorCQkJCQkJCQkJMSk7CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCisJCQkJCQkvKiBGb3IgUHJldmVudGluZyBTaGFyZEtleSBUYWJsZSBpcyBjbGVhcmVkIGJ5IHJlbW92ZSBrZXkgcHJvY2VkdXJlLiAqLworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS4KKwkJCQkJCSAgICBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLgorCQkJCQkJICAgIEtleUxlbiA9CisJCQkJCQkgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT4KKwkJCQkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICAgICAgIFtpZHhdLktleSwKKwkJCQkJCQkgICAgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlc2lyZVNoYXJlZEtleQorCQkJCQkJCSAgICAgICBbaWR4XS5LZXksCisJCQkJCQkJICAgICAgIHBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICAgICBEZXNpcmVTaGFyZWRLZXkKKwkJCQkJCQkgICAgICAgW2lkeF0uS2V5TGVuKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAogCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwogCQkJcmV0dXJuOwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIFNwZWNpYWwgREFUQSBmcmFtZSB0aGF0IGhhcyB0byBwYXNzIHRvIE1MTUUKLQkJLy8JIDEuIENpc2NvIEFpcm9uZXQgZnJhbWVzIGZvciBDQ1gyLiBXZSBuZWVkIHBhc3MgaXQgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCi0JCS8vCSAyLiBFQVBPTCBoYW5kc2hha2luZyBmcmFtZXMgd2hlbiBkcml2ZXIgc3VwcGxpY2FudCBlbmFibGVkLCBwYXNzIHRvIE1MTUUgZm9yIHNwZWNpYWwgcHJvY2VzcworCX0gZWxzZSB7CisJCS8qIFNwZWNpYWwgREFUQSBmcmFtZSB0aGF0IGhhcyB0byBwYXNzIHRvIE1MTUUgKi8KKwkJLyogICAgICAgMS4gQ2lzY28gQWlyb25ldCBmcmFtZXMgZm9yIENDWDIuIFdlIG5lZWQgcGFzcyBpdCB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MgKi8KKwkJLyogICAgICAgMi4gRUFQT0wgaGFuZHNoYWtpbmcgZnJhbWVzIHdoZW4gZHJpdmVyIHN1cHBsaWNhbnQgZW5hYmxlZCwgcGFzcyB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MgKi8KIAkJewogCQkJcFRtcEJ1ZiA9IHBSeEJsay0+cERhdGEgLSBMRU5HVEhfODAyXzExOwogCQkJTmRpc01vdmVNZW1vcnkocFRtcEJ1ZiwgcFJ4QmxrLT5wSGVhZGVyLCBMRU5HVEhfODAyXzExKTsKLQkJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcFRtcEJ1ZiwgcFJ4QmxrLT5EYXRhU2l6ZSArIExFTkdUSF84MDJfMTEsIHBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiEhISByZXBvcnQgRUFQT0wvQUlST05FVCBEQVRBIHRvIE1MTUUgKGxlbj0lZCkgISEhXG4iLCBwUnhCbGstPkRhdGFTaXplKSk7CisJCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCisJCQkJCQkgIHBUbXBCdWYsCisJCQkJCQkgIHBSeEJsay0+RGF0YVNpemUgKworCQkJCQkJICBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsCisJCQkJCQkgIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLAorCQkJCQkJICBwUnhELT5QbGNwU2lnbmFsKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgicmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICFcbiIsCisJCQkJICAgICAgcFJ4QmxrLT5EYXRhU2l6ZSkpOwogCQl9CiAJfQogCkBAIC0xNDYsNDk1ICsyMDIsNDgzIEBACiAKIH0KIAotVk9JRCBTVEFSeERhdGFGcmFtZUFubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5LAorCQkJICAgIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaywgdTggRnJvbVdoaWNoQlNTSUQpCiB7CiAKLQkvLyBub24tRUFQIGZyYW1lCi0JaWYgKCFSVE1QQ2hlY2tXUEFmcmFtZShwQWQsIHBFbnRyeSwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSwgRnJvbVdoaWNoQlNTSUQpKQotCXsKKwkvKiBub24tRUFQIGZyYW1lICovCisJaWYgKCFSVE1QQ2hlY2tXUEFmcmFtZQorCSAgICAocEFkLCBwRW50cnksIHBSeEJsay0+cERhdGEsIHBSeEJsay0+RGF0YVNpemUsIEZyb21XaGljaEJTU0lEKSkgeworCiAJCXsKLQkJCS8vIGRyb3AgYWxsIG5vbi1FQVAgREFUQSBmcmFtZSBiZWZvcmUKLQkJCS8vIHRoaXMgY2xpZW50J3MgUG9ydC1BY2Nlc3MtQ29udHJvbCBpcyBzZWN1cmVkCi0JCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5XZXApCi0JCQl7Ci0JCQkJLy8gdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQotCQkJCXsKLQkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCS8qIGRyb3AgYWxsIG5vbi1FQVAgREFUQSBmcmFtZSBiZWZvcmUgKi8KKwkJCS8qIHRoaXMgY2xpZW50J3MgUG9ydC1BY2Nlc3MtQ29udHJvbCBpcyBzZWN1cmVkICovCisJCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5XZXApIHsKKwkJCQkvKiB1bnN1cHBvcnRlZCBjaXBoZXIgc3VpdGUgKi8KKwkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpIHsKKwkJCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsCisJCQkJCQkJICAgIHBSeEJsay0+cFJ4UGFja2V0LAorCQkJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBlbmNyeXB0aW9uIGluLXVzZSBidXQgcmVjZWl2ZSBhIG5vbi1FQVBPTCBjbGVhciB0ZXh0IGZyYW1lLCBkcm9wIGl0Ci0JCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgJiYKLQkJCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCQkJewotCQkJCQkvLyByZWxlYXNlIHBhY2tldAotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBlbmNyeXB0aW9uIGluLXVzZSBidXQgcmVjZWl2ZSBhIG5vbi1FQVBPTCBjbGVhciB0ZXh0IGZyYW1lLCBkcm9wIGl0ICovCisJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0KKwkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCisJCQkJICAgICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PQorCQkJCQlXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKSB7CisJCQkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLAorCQkJCQkJCSAgICBwUnhCbGstPnBSeFBhY2tldCwKKwkJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQkJCXJldHVybjsKIAkJCQl9CiAJCQl9CiAJCX0KIAkJUlhfQkxLX0NMRUFSX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKLQkJaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FSQUxJTkspKQotCQl7Ci0JCQkvLyBOb3JtYWwgbGVnYWN5LCBBTVBEVSBvciBBTVNEVQotCQkJQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCWlmICghUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKSkgeworCQkJLyogTm9ybWFsIGxlZ2FjeSwgQU1QRFUgb3IgQU1TRFUgKi8KKwkJCUNtbVJ4bm9uUmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBSeEJsaywKKwkJCQkJCSAgICBGcm9tV2hpY2hCU1NJRCk7CiAKKwkJfSBlbHNlIHsKKwkJCS8qIEFSQUxJTksgKi8KKwkJCUNtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLAorCQkJCQkJIEZyb21XaGljaEJTU0lEKTsKIAkJfQotCQllbHNlCi0JCXsKLQkJCS8vIEFSQUxJTksKLQkJCUNtbVJ4UmFsaW5rRnJhbWVJbmRpY2F0ZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKIAotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKLQkJeworCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkKKwkJICAgICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpIHsKIAkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUKLQkJCS8vICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllcgotCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOworCQl9IGVsc2UgeworCQkJLyogRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUgKi8KKwkJCS8qICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllciAqLworCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywKKwkJCQkJCUZyb21XaGljaEJTU0lEKTsKIAkJfQogCX0KIH0KIAotCi0vLyBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUKLUJPT0xFQU4gU1RBQ2hlY2tUa2lwTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKKy8qIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZSAqLworQk9PTEVBTiBTVEFDaGVja1RraXBNSUNWYWx1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSwgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrKQogewotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlVQ0hBUgkJCVVzZXJQcmlvcml0eSA9IHBSeEJsay0+VXNlclByaW9yaXR5OwotCVBDSVBIRVJfS0VZCQlwV3BhS2V5OwotCVVDSEFSCQkJKnBEQSwgKnBTQTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7CisJdTggKnBEYXRhID0gcFJ4QmxrLT5wRGF0YTsKKwl1MTYgRGF0YVNpemUgPSBwUnhCbGstPkRhdGFTaXplOworCXU4IFVzZXJQcmlvcml0eSA9IHBSeEJsay0+VXNlclByaW9yaXR5OworCXN0cnVjdCBydF9jaXBoZXJfa2V5ICpwV3BhS2V5OworCXU4ICpwREEsICpwU0E7CiAKIAlwV3BhS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BSeEJsay0+cFJ4V0ktPktleUluZGV4XTsKIAogCXBEQSA9IHBIZWFkZXItPkFkZHIxOwotCWlmIChSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0lORlJBKSkKLQl7CisJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpKSB7CiAJCXBTQSA9IHBIZWFkZXItPkFkZHIzOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXBTQSA9IHBIZWFkZXItPkFkZHIyOwogCX0KIAogCWlmIChSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShwQWQsCi0JCQkJCQkJCXBEYXRhLAotCQkJCQkJCQlwREEsCi0JCQkJCQkJCXBTQSwKLQkJCQkJCQkJcFdwYUtleS0+UnhNaWMsCi0JCQkJCQkJCVVzZXJQcmlvcml0eSwKLQkJCQkJCQkJRGF0YVNpemUpID09IEZBTFNFKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yIDJcbiIpKTsKKwkJCQkgICAgcERhdGEsCisJCQkJICAgIHBEQSwKKwkJCQkgICAgcFNBLAorCQkJCSAgICBwV3BhS2V5LT5SeE1pYywKKwkJCQkgICAgVXNlclByaW9yaXR5LCBEYXRhU2l6ZSkgPT0gRkFMU0UpIHsKKwkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJ4IE1JQyBWYWx1ZSBlcnJvciAyXG4iKSk7CiAKLQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKLQkJewotCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLCAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFIDogRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJeworCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSB7CisJCQlXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChwQWQsCisJCQkJCQkJIChwV3BhS2V5LT5UeXBlID09CisJCQkJCQkJICBQQUlSV0lTRUtFWSkgPyBUUlVFIDoKKwkJCQkJCQkgRkFMU0UpOworCQl9IGVsc2UgewogCQkJUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgcFdwYUtleSk7CiAJCX0KIAotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsCisJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCiAJcmV0dXJuIFRSVUU7CiB9CiAKLQotLy8KLS8vIEFsbCBSeCByb3V0aW5lcyB1c2UgUlhfQkxLIHN0cnVjdHVyZSB0byBoYW5kZSByeCBldmVudHMKLS8vIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIGJ1aWxkIHBSeEJsayBhdHRyaWJ1dGVzCi0vLyAgMS4gcEhlYWRlciBwb2ludGVyIHRvIDgwMi4xMSBIZWFkZXIKLS8vICAyLiBwRGF0YSBwb2ludGVyIHRvIHBheWxvYWQgaW5jbHVkaW5nIExMQyAoanVzdCBza2lwIEhlYWRlcikKLS8vICAzLiBzZXQgcGF5bG9hZCBzaXplIGluY2x1ZGluZyBMTEMgdG8gRGF0YVNpemUKLS8vICA0LiBzZXQgc29tZSBmbGFncyB3aXRoIFJYX0JMS19TRVRfRkxBRygpCi0vLwotVk9JRCBTVEFIYW5kbGVSeERhdGFGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQorLyogKi8KKy8qIEFsbCBSeCByb3V0aW5lcyB1c2Ugc3RydWN0IHJ0X3J4X2JsayBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzICovCisvKiBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcyAqLworLyogIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyICovCisvKiAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpICovCisvKiAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplICovCisvKiAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKSAqLworLyogKi8KK3ZvaWQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfcnhfYmxrICpwUnhCbGspCiB7Ci0JUFJUMjhYWF9SWERfU1RSVUMJCQkJcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOwotCVBSWFdJX1NUUlVDCQkJCQkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotCVBIRUFERVJfODAyXzExCQkJCQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAkJCQkJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JQk9PTEVBTiAJCQkJCQliRnJhZ21lbnQgPSBGQUxTRTsKLQlNQUNfVEFCTEVfRU5UUlkJICAgIAkJCSpwRW50cnkgPSBOVUxMOwotCVVDSEFSCQkJCQkJCUZyb21XaGljaEJTU0lEID0gQlNTMDsKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJQcmlvcml0eSA9IDA7CisJUFJUMjhYWF9SWERfU1RSVUMgcFJ4RCA9ICYocFJ4QmxrLT5SeEQpOworCXN0cnVjdCBydF9yeHdpICogcFJ4V0kgPSBwUnhCbGstPnBSeFdJOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKKwl2b2lkICpwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlCT09MRUFOIGJGcmFnbWVudCA9IEZBTFNFOworCXN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKnBFbnRyeSA9IE5VTEw7CisJdTggRnJvbVdoaWNoQlNTSUQgPSBCU1MwOworCXU4IFVzZXJQcmlvcml0eSA9IDA7CiAKIAl7Ci0JCS8vIGJlZm9yZSBMSU5LIFVQLCBhbGwgREFUQSBmcmFtZXMgYXJlIHJlamVjdGVkCi0JCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQl7Ci0JCQkvLyByZWxlYXNlIHBhY2tldAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCS8qIGJlZm9yZSBMSU5LIFVQLCBhbGwgREFUQSBmcmFtZXMgYXJlIHJlamVjdGVkICovCisJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwKKwkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lcwotCQlpZiAocFJ4RC0+TXlCc3MgPT0gMCkKLQkJeworCQkvKiBEcm9wIG5vdCBteSBCU1MgZnJhbWVzICovCisJCWlmIChwUnhELT5NeUJzcyA9PSAwKSB7CiAJCQl7Ci0JCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CiAKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCsrOwotCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkpCi0JCXsKLQkJCVVDSEFSICpwRGF0YTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiYkFQU0RDYXBhYmxlXG4iKSk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUKKwkJICAgICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlCisJCSAgICAmJiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKSB7CisJCQl1OCAqcERhdGE7CisJCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCAoImJBUFNEQ2FwYWJsZVxuIikpOwogCi0JCQkvLyBRb3MgYml0IDQKLQkJCXBEYXRhID0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMTsKLQkJCWlmICgoKnBEYXRhID4+IDQpICYgMHgwMSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJ4RG9uZS0gUmN2IEVPU1AgZnJhbWUsIGRyaXZlciBtYXkgZmFsbCBpbnRvIHNsZWVwXG4iKSk7CisJCQkvKiBRb3MgYml0IDQgKi8KKwkJCXBEYXRhID0gKHU4ICopcEhlYWRlciArIExFTkdUSF84MDJfMTE7CisJCQlpZiAoKCpwRGF0YSA+PiA0KSAmIDB4MDEpIHsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLAorCQkJCQkgKCJSeERvbmUtIFJjdiBFT1NQIGZyYW1lLCBkcml2ZXIgbWF5IGZhbGwgaW50byBzbGVlcFxuIikpOwogCQkJCXBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QgPSBGQUxTRTsKIAotCQkJCS8vIEZvcmNlIGRyaXZlciB0byBmYWxsIGludG8gc2xlZXAgbW9kZSB3aGVuIHJjdiBFT1NQIGZyYW1lCi0JCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQkJCXsKLQkJCQkJVVNIT1JUICBUYnR0TnVtVG9OZXh0V2FrZVVwOwotCQkJCQlVU0hPUlQgIE5leHREdGltID0gcEFkLT5TdGFDZmcuRHRpbVBlcmlvZDsKLQkJCQkJVUxPTkcgICBOb3c7CisJCQkJLyogRm9yY2UgZHJpdmVyIHRvIGZhbGwgaW50byBzbGVlcCBtb2RlIHdoZW4gcmN2IEVPU1AgZnJhbWUgKi8KKwkJCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpIHsKKwkJCQkJdTE2IFRidHROdW1Ub05leHRXYWtlVXA7CisJCQkJCXUxNiBOZXh0RHRpbSA9CisJCQkJCSAgICBwQWQtPlN0YUNmZy5EdGltUGVyaW9kOworCQkJCQl1bnNpZ25lZCBsb25nIE5vdzsKIAogCQkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJCQlOZXh0RHRpbSAtPSAoVVNIT1JUKShOb3cgLSBwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lKS9wQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisJCQkJCU5leHREdGltIC09CisJCQkJCSAgICAodTE2KShOb3cgLQorCQkJCQkJICAgICAgcEFkLT5TdGFDZmcuCisJCQkJCQkgICAgICBMYXN0QmVhY29uUnhUaW1lKSAvCisJCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CiAKLQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudDsKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKKwkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9CisJCQkJCSAgICBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKQorCQkJCQkgICAgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPiBOZXh0RHRpbSkpCiAJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07CiAKLQkJCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKLQkJCQkJLy8gaWYgV01NLUFQU0QgaXMgZmFpbGVkLCB0cnkgdG8gZGlzYWJsZSBmb2xsb3dpbmcgbGluZQotCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOworCQkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX1NBVkUpOworCQkJCQkvKiBpZiBXTU0tQVBTRCBpcyBmYWlsZWQsIHRyeSB0byBkaXNhYmxlIGZvbGxvd2luZyBsaW5lICovCisJCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKHBBZCwKKwkJCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCk7CiAJCQkJfQogCQkJfQogCi0JCQlpZiAoKHBIZWFkZXItPkZDLk1vcmVEYXRhKSAmJiAocEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIGFub3RoZXIgdHJpZ2dlciBmcmFtZSB3aGVuIE1vcmUgRGF0YSBiaXQgaXMgc2V0IHRvIDFcbiIpKTsKKwkJCWlmICgocEhlYWRlci0+RkMuTW9yZURhdGEpCisJCQkgICAgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJJblNlcnZpY2VQZXJpb2QpKSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIlNlbmRpbmcgYW5vdGhlciB0cmlnZ2VyIGZyYW1lIHdoZW4gTW9yZSBEYXRhIGJpdCBpcyBzZXQgdG8gMVxuIikpOwogCQkJfQogCQl9Ci0KLQkJLy8gRHJvcCBOVUxMLCBDRi1BQ0sobm8gZGF0YSksIENGLVBPTEwobm8gZGF0YSksIGFuZCBDRi1BQ0srQ0YtUE9MTChubyBkYXRhKSBkYXRhIGZyYW1lCi0JCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDQpKSAvLyBiaXQgMiA6IG5vIERBVEEKKwkJLyogRHJvcCBOVUxMLCBDRi1BQ0sobm8gZGF0YSksIENGLVBPTEwobm8gZGF0YSksIGFuZCBDRi1BQ0srQ0YtUE9MTChubyBkYXRhKSBkYXRhIGZyYW1lICovCisJCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDQpKQkvKiBiaXQgMiA6IG5vIERBVEEgKi8KIAkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCXJldHVybjsKIAkJfQorCQkvKiBEcm9wIG5vdCBteSBCU1MgZnJhbWUgKHdlIGNhbiBub3Qgb25seSBjaGVjayB0aGUgTXlCc3MgYml0IGluIFJ4RCkgKi8KIAotCSAgICAvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWUgKHdlIGNhbiBub3Qgb25seSBjaGVjayB0aGUgTXlCc3MgYml0IGluIFJ4RCkKLQotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJewotCQkJLy8gSW5mcmFzdHJ1Y3R1cmUgbW9kZSwgY2hlY2sgYWRkcmVzcyAyIGZvciBCU1NJRAotCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkoJnBIZWFkZXItPkFkZHIyLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKQotCQkJewotCQkJCS8vIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lECi0JICAgICAgICAgICAgLy8gcmVsZWFzZSBwYWNrZXQKLQkgICAgICAgICAgICBSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJaWYgKElORlJBX09OKHBBZCkpIHsKKwkJCS8qIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQgKi8KKwkJCWlmICghUlRNUEVxdWFsTWVtb3J5CisJCQkgICAgKCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkgeworCQkJCS8qIFJlY2VpdmUgZnJhbWUgbm90IG15IEJTU0lEICovCisJCQkJLyogcmVsZWFzZSBwYWNrZXQgKi8KKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJfQotCQllbHNlCS8vIEFkLUhvYyBtb2RlIG9yIE5vdCBhc3NvY2lhdGVkCisJCX0gZWxzZQkJLyogQWQtSG9jIG1vZGUgb3IgTm90IGFzc29jaWF0ZWQgKi8KIAkJewotCQkJLy8gQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQKLQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKLQkJCXsKLQkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAotCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0Ci0JICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkvKiBBZC1Ib2MgbW9kZSwgY2hlY2sgYWRkcmVzcyAzIGZvciBCU1NJRCAqLworCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkKKwkJCSAgICAoJnBIZWFkZXItPkFkZHIzLCAmcEFkLT5Db21tb25DZmcuQnNzaWQsIDYpKSB7CisJCQkJLyogUmVjZWl2ZSBmcmFtZSBub3QgbXkgQlNTSUQgKi8KKwkJCQkvKiByZWxlYXNlIHBhY2tldCAqLworCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CiAKLQkJLy8KLQkJLy8gZmluZCBwRW50cnkKLQkJLy8KLQkJaWYgKHBSeFdJLT5XaXJlbGVzc0NsaUlEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXsKKwkJLyogKi8KKwkJLyogZmluZCBwRW50cnkgKi8KKwkJLyogKi8KKwkJaWYgKHBSeFdJLT5XaXJlbGVzc0NsaUlEIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpIHsKIAkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIDEuIHJlbGVhc2UgcGFja2V0IGlmIGluZnJhIG1vZGUKLQkJCS8vIDIuIG5ldyBhIHBFbnRyeSBpZiBhZC1ob2MgbW9kZQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCX0gZWxzZSB7CisJCQkvKiAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlICovCisJCQkvKiAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUgKi8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCXJldHVybjsKIAkJfQogCi0JCS8vIGluZnJhIG9yIGFkLWhvYwotCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJeworCQkvKiBpbmZyYSBvciBhZC1ob2MgKi8KKwkJaWYgKElORlJBX09OKHBBZCkpIHsKIAkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9JTkZSQSk7CiAJCQlBU1NFUlQocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPT0gQlNTSURfV0NJRCk7CiAJCX0KLQotCQkvLyBjaGVjayBBdGhlcm9zIENsaWVudAotCQlpZiAoKHBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPT0gRkFMU0UpICYmICAocFJ4RC0+QU1QRFUgPT0gMSkgJiYgKHBIZWFkZXItPkZDLlJldHJ5ICkpCi0JCXsKKwkJLyogY2hlY2sgQXRoZXJvcyBDbGllbnQgKi8KKwkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAocFJ4RC0+QU1QRFUgPT0gMSkKKwkJICAgICYmIChwSGVhZGVyLT5GQy5SZXRyeSkpIHsKIAkJCXBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPSBUUlVFOwogCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iQ3VycmVudEF0aGVyb3MgPSBUUlVFOwogCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBUUlVFOwotCQkJaWYgKCFTVEFfQUVTX09OKHBBZCkpCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCA4LCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIEZBTFNFKTsKKwkJCWlmICghU1RBX0FFU19PTihwQWQpKSB7CisJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCA4LCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsCisJCQkJCQkgIEZBTFNFKTsKIAkJCX0KIAkJfQogCX0KIAotCXBSeEJsay0+cERhdGEgPSAoVUNIQVIgKilwSGVhZGVyOworCXBSeEJsay0+cERhdGEgPSAodTggKikgcEhlYWRlcjsKIAotCS8vCi0JLy8gdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUKLQkvLyA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZwotCS8vCisJLyogKi8KKwkvKiB1cGRhdGUgUnhCbGstPnBEYXRhLCBEYXRhU2l6ZSAqLworCS8qIDgwMi4xMSBIZWFkZXIsIFFPUywgSFRDLCBIdyBQYWRkaW5nICovCisJLyogKi8KIAotCS8vIDEuIHNraXAgODAyLjExIEhFQURFUgorCS8qIDEuIHNraXAgODAyLjExIEhFQURFUiAqLwogCXsKIAkJcFJ4QmxrLT5wRGF0YSArPSBMRU5HVEhfODAyXzExOwogCQlwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7CiAJfQogCi0JLy8gMi4gUU9TCi0JaWYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KQotCXsKKwkvKiAyLiBRT1MgKi8KKwlpZiAocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpIHsKIAkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1FPUyk7CiAJCVVzZXJQcmlvcml0eSA9ICoocFJ4QmxrLT5wRGF0YSkgJiAweDBmOwotCQkvLyBiaXQgNyBpbiBRb1MgQ29udHJvbCBmaWVsZCBzaWduYWxzIHRoZSBIVCBBLU1TRFUgZm9ybWF0Ci0JCWlmICgoKnBSeEJsay0+cERhdGEpICYgMHg4MCkKLQkJeworCQkvKiBiaXQgNyBpbiBRb1MgQ29udHJvbCBmaWVsZCBzaWduYWxzIHRoZSBIVCBBLU1TRFUgZm9ybWF0ICovCisJCWlmICgoKnBSeEJsay0+cERhdGEpICYgMHg4MCkgewogCQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKTsKIAkJfQotCi0JCS8vIHNraXAgUU9TIGNvbnRvcmwgZmllbGQKKwkJLyogc2tpcCBRT1MgY29udG9ybCBmaWVsZCAqLwogCQlwUnhCbGstPnBEYXRhICs9IDI7Ci0JCXBSeEJsay0+RGF0YVNpemUgLT0yOworCQlwUnhCbGstPkRhdGFTaXplIC09IDI7CiAJfQogCXBSeEJsay0+VXNlclByaW9yaXR5ID0gVXNlclByaW9yaXR5OwogCi0JLy8gMy4gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrCi0JaWYgKHBIZWFkZXItPkZDLk9yZGVyKQotCXsKKwkvKiBjaGVjayBpZiBuZWVkIHRvIHJlc2VuZCBQUyBQb2xsIHdoZW4gcmVjZWl2ZWQgcGFja2V0IHdpdGggTW9yZURhdGEgPSAxICovCisJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIChwSGVhZGVyLT5GQy5Nb3JlRGF0YSA9PSAxKSkgeworCQlpZiAoKCgoVXNlclByaW9yaXR5ID09IDApIHx8IChVc2VyUHJpb3JpdHkgPT0gMykpICYmCisJCSAgICAgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSA9PSAwKSB8fAorCQkgICAgKCgoVXNlclByaW9yaXR5ID09IDEpIHx8IChVc2VyUHJpb3JpdHkgPT0gMikpICYmCisJCSAgICAgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9PSAwKSB8fAorCQkgICAgKCgoVXNlclByaW9yaXR5ID09IDQpIHx8IChVc2VyUHJpb3JpdHkgPT0gNSkpICYmCisJCSAgICAgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9PSAwKSB8fAorCQkgICAgKCgoVXNlclByaW9yaXR5ID09IDYpIHx8IChVc2VyUHJpb3JpdHkgPT0gNykpICYmCisJCSAgICAgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyA9PSAwKSkgeworCQkJLyogbm9uLVVBUFNEIGRlbGl2ZXJ5LWVuYWJsZWQgQUMgKi8KKwkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CisJCX0KKwl9CisJLyogMy4gT3JkZXIgYml0OiBBLVJhbGluayBvciBIVEMrICovCisJaWYgKHBIZWFkZXItPkZDLk9yZGVyKSB7CiAjaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkpCisJCWlmICgocFJ4V0ktPlBIWU1PREUgPD0gTU9ERV9PRkRNKQorCQkgICAgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkpCiAJCXsKIAkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKTsKLQkJfQotCQllbHNlCi0jZW5kaWYKKwkJfSBlbHNlCisjZW5kaWYgLyogQUdHUkVHQVRJT05fU1VQUE9SVCAvLyAqLwogCQl7CiAJCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSFRDKTsKLQkJCS8vIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKKwkJCS8qIHNraXAgSFRDIGNvbnRvcmwgZmllbGQgKi8KIAkJCXBSeEJsay0+cERhdGEgKz0gNDsKIAkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKIAkJfQogCX0KLQotCS8vIDQuIHNraXAgSFcgcGFkZGluZwotCWlmIChwUnhELT5MMlBBRCkKLQl7Ci0JCS8vIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyCi0JCS8vIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcKKwkvKiA0LiBza2lwIEhXIHBhZGRpbmcgKi8KKwlpZiAocFJ4RC0+TDJQQUQpIHsKKwkJLyoganVzdCBtb3ZlIHBEYXRhIHBvaW50ZXIgKi8KKwkJLyogYmVjYXVzZSBEYXRhU2l6ZSBleGNsdWRpbmcgSFcgcGFkZGluZyAqLwogCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfUEFEKTsKIAkJcFJ4QmxrLT5wRGF0YSArPSAyOwogCX0KIAotCWlmIChwUnhELT5CQSkKLQl7CisJaWYgKHBSeEQtPkJBKSB7CiAJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSk7CiAJfQotCi0JLy8KLQkvLyBDYXNlIEkgIFByb2Nlc3MgQnJvYWRjYXN0ICYgTXVsdGljYXN0IGRhdGEgZnJhbWUKLQkvLwotCWlmIChwUnhELT5CY2FzdCB8fCBwUnhELT5NY2FzdCkKLQl7CisJLyogKi8KKwkvKiBDYXNlIEkgIFByb2Nlc3MgQnJvYWRjYXN0ICYgTXVsdGljYXN0IGRhdGEgZnJhbWUgKi8KKwkvKiAqLworCWlmIChwUnhELT5CY2FzdCB8fCBwUnhELT5NY2FzdCkgewogCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudCk7CiAKLQkJLy8gRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbgotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKKwkJLyogRHJvcCBNY2FzdC9CY2FzdCBmcmFtZSB3aXRoIGZyYWdtZW50IGJpdCBvbiAqLworCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpIHsKKwkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlyZXR1cm47CiAJCX0KLQotCQkvLyBGaWx0ZXIgb3V0IEJjYXN0IGZyYW1lIHdoaWNoIEFQIHJlbGF5ZWQgZm9yIHVzCi0JCWlmIChwSGVhZGVyLT5GQy5GckRzICYmIE1BQ19BRERSX0VRVUFMKHBIZWFkZXItPkFkZHIzLCBwQWQtPkN1cnJlbnRBZGRyZXNzKSkKLQkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkvKiBGaWx0ZXIgb3V0IEJjYXN0IGZyYW1lIHdoaWNoIEFQIHJlbGF5ZWQgZm9yIHVzICovCisJCWlmIChwSGVhZGVyLT5GQy5GckRzCisJCSAgICAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpIHsKKwkJCS8qIHJlbGVhc2UgcGFja2V0ICovCisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQlyZXR1cm47CiAJCX0KIAogCQlJbmRpY2F0ZV9MZWdhY3lfUGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CiAJCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAocFJ4RC0+VTJNKQotCXsKLQkJcEFkLT5MYXN0UnhSYXRlID0gKFVTSE9SVCkoKHBSeFdJLT5NQ1MpICsgKHBSeFdJLT5CVyA8PDcpICsgKHBSeFdJLT5TaG9ydEdJIDw8OCkrIChwUnhXSS0+UEhZTU9ERSA8PDE0KSkgOworCX0gZWxzZSBpZiAocFJ4RC0+VTJNKSB7CisJCXBBZC0+TGFzdFJ4UmF0ZSA9CisJCSAgICAodTE2KSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8IDcpICsKKwkJCSAgICAgIChwUnhXSS0+U2hvcnRHSSA8PCA4KSArIChwUnhXSS0+UEhZTU9ERSA8PCAxNCkpOwogCi0JCWlmIChBREhPQ19PTihwQWQpKQotCQl7CisJCWlmIChBREhPQ19PTihwQWQpKSB7CiAJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKIAkJCWlmIChwRW50cnkpCi0JCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOworCQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRW50cnktPlJzc2lTYW1wbGUsCisJCQkJCQkgICBwUnhXSSk7CiAJCX0KIAotCiAJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBwUnhXSSk7CiAKLQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKLQkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAoVUNIQVIpKHBSeFdJLT5TTlIxKTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAodTgpKHBSeFdJLT5TTlIwKTsKKwkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAodTgpKHBSeFdJLT5TTlIxKTsKIAogCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250Kys7CiAKKwkJaWYgKCEoKHBIZWFkZXItPkZyYWcgPT0gMCkgJiYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IDApKSkgeworCQkJLyogcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cyAqLworCQkJLyogcmV0dXJuIGNvbXBsZXRlIGZyYW1lIChwUnhQYWNrZXQpIG9yIE5VTEwgKi8KKwkJCWJGcmFnbWVudCA9IFRSVUU7CisJCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7CisJCX0KIAotICAgIAlpZiAoISgocEhlYWRlci0+RnJhZyA9PSAwKSAmJiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gMCkpKQotICAgIAl7Ci0gICAgCQkvLyByZS1hc3NlbWJsZSB0aGUgZnJhZ21lbnRlZCBwYWNrZXRzCi0gICAgCQkvLyByZXR1cm4gY29tcGxldGUgZnJhbWUgKHBSeFBhY2tldCkgb3IgTlVMTAotICAgIAkJYkZyYWdtZW50ID0gVFJVRTsKLSAgICAJCXBSeFBhY2tldCA9IFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKHBBZCwgcFJ4QmxrKTsKLSAgICAJfQotCi0gICAgCWlmIChwUnhQYWNrZXQpCi0gICAgCXsKKwkJaWYgKHBSeFBhY2tldCkgewogCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOwogCi0gICAgCQkvLyBwcm9jZXNzIGNvbXBsZXRlIGZyYW1lCi0gICAgCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpICYmIChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKLSAgICAJCXsKLQkJCQkvLyBNaW51cyBNSUMgbGVuZ3RoCisJCQkvKiBwcm9jZXNzIGNvbXBsZXRlIGZyYW1lICovCisJCQlpZiAoYkZyYWdtZW50ICYmIChwUnhELT5EZWNyeXB0ZWQpCisJCQkgICAgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09CisJCQkJTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkpIHsKKwkJCQkvKiBNaW51cyBNSUMgbGVuZ3RoICovCiAJCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA4OwogCi0gICAgCQkJLy8gRm9yIFRLSVAgZnJhbWUsIGNhbGN1bGF0ZSB0aGUgTUlDIHZhbHVlCi0gICAgCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09IEZBTFNFKQotICAgIAkJCXsKLSAgICAJCQkJcmV0dXJuOwotICAgIAkJCX0KLSAgICAJCX0KKwkJCQkvKiBGb3IgVEtJUCBmcmFtZSwgY2FsY3VsYXRlIHRoZSBNSUMgdmFsdWUgKi8KKwkJCQlpZiAoU1RBQ2hlY2tUa2lwTUlDVmFsdWUocEFkLCBwRW50cnksIHBSeEJsaykgPT0KKwkJCQkgICAgRkFMU0UpIHsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KIAotICAgIAkJU1RBUnhEYXRhRnJhbWVBbm5vdW5jZShwQWQsIHBFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7CisJCQlTVEFSeERhdGFGcmFtZUFubm91bmNlKHBBZCwgcEVudHJ5LCBwUnhCbGssCisJCQkJCSAgICAgICBGcm9tV2hpY2hCU1NJRCk7CiAJCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJZWxzZQotICAgIAl7Ci0gICAgCQkvLyBqdXN0IHJldHVybgotICAgIAkJLy8gYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsCi0gICAgCQkvLyBpZiBwYWNrZXQgaXMgZnJhZ21lbnRlZAotICAgIAkJcmV0dXJuOwotICAgIAl9CisJCX0gZWxzZSB7CisJCQkvKiBqdXN0IHJldHVybiAqLworCQkJLyogYmVjYXVzZSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZSgpIHdpbGwgcmVsZWFzZSByeCBwYWNrZXQsICovCisJCQkvKiBpZiBwYWNrZXQgaXMgZnJhZ21lbnRlZCAqLworCQkJcmV0dXJuOworCQl9CiAJfQogCiAJQVNTRVJUKDApOwotCS8vIHJlbGVhc2UgcGFja2V0CisJLyogcmVsZWFzZSBwYWNrZXQgKi8KIAlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIH0KIAotVk9JRCBTVEFIYW5kbGVSeE1nbXRGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQordm9pZCBTVEFIYW5kbGVSeE1nbXRGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9yeF9ibGsgKnBSeEJsaykKIHsKLQlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKKwlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEID0gJihwUnhCbGstPlJ4RCk7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCXZvaWQgKnBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwogCi0JZG8KLQl7CisJZG8gewogCi0JCS8vIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uCi0JCWlmIChwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID09IDAgJiYKLQkJICAgIHBIZWFkZXItPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9CRUFDT04gJiYKLQkJICAgIE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkgewotCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsIHBSeFdJKTsKLQotCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjAgPSAoVUNIQVIpKHBSeFdJLT5TTlIwKTsKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7Ci0JCX0KLQotI2lmZGVmIFJUMjg3MAotCQkvLyBjb2xsZWN0IHJzc2kgaW5mb3JtYXRpb24gZm9yIGFudGVubmEgZGl2ZXJzaXR5Ci0JCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQotCQl7Ci0JCQlpZiAoKHBSeEQtPlUyTSkgfHwgKChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKSAmJiAoTUFDX0FERFJfRVFVQUwoJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCAmcEhlYWRlci0+QWRkcjIpKSkpCi0JCQl7Ci0JCQkJCUNPTExFQ1RfUlhfQU5URU5OQV9BVkVSQUdFX1JTU0kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgKFVDSEFSKXBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgMCk7IC8vTm90ZTogUlNTSTIgbm90IHVzZWQgb24gUlQ3MwotCQkJCQlwQWQtPlN0YUNmZy5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7CisJCS8qIGNoZWNrIGlmIG5lZWQgdG8gcmVzZW5kIFBTIFBvbGwgd2hlbiByZWNlaXZlZCBwYWNrZXQgd2l0aCBNb3JlRGF0YSA9IDEgKi8KKwkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpCisJCSAgICAmJiAocEhlYWRlci0+RkMuTW9yZURhdGEgPT0gMSkpIHsKKwkJCS8qIGZvciBVQVBTRCwgYWxsIG1hbmFnZW1lbnQgZnJhbWVzIHdpbGwgYmUgVk8gcHJpb3JpdHkgKi8KKwkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID09IDApIHsKKwkJCQkvKiBub24tVUFQU0QgZGVsaXZlcnktZW5hYmxlZCBBQyAqLworCQkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7CiAJCQl9CiAJCX0KLSNlbmRpZgogCi0JCS8vIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZQotCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotCQl7CisJCS8qIFRPRE86IGlmIE1vcmVEYXRhID09IDAsIHN0YXRpb24gY2FuIGdvIHRvIHNsZWVwICovCisKKwkJLyogV2Ugc2hvdWxkIGNvbGxlY3QgUlNTSSBub3Qgb25seSBVMk0gZGF0YSBidXQgYWxzbyBteSBiZWFjb24gKi8KKwkJaWYgKChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQorCQkgICAgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkKKwkJICAgICYmIChwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID09IDApKSB7CisJCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOworCisJCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9ICh1OCkocFJ4V0ktPlNOUjApOworCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAodTgpKHBSeFdJLT5TTlIxKTsKKwkJfQorCisJCS8qIEZpcnN0IGNoZWNrIHRoZSBzaXplLCBpdCBNVVNUIG5vdCBleGNlZWQgdGhlIG1sbWUgcXVldWUgc2l6ZSAqLworCQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKSB7CiAJCQlEQkdQUklOVF9FUlIoKCJTVEFIYW5kbGVSeE1nbXRGcmFtZTogZnJhbWUgdG9vIGxhcmdlLCBzaXplID0gJWQgXG4iLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSk7CiAJCQlicmVhazsKIAkJfQogCi0JCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlciwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKLQkJCQkJCQkJCXBSeFdJLT5SU1NJMCwgcFJ4V0ktPlJTU0kxLCBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOworCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsCisJCQkJCSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwKKwkJCQkJICBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwKKwkJCQkJICBwUnhXSS0+UlNTSTIsIHBSeEQtPlBsY3BTaWduYWwpOwogCX0gd2hpbGUgKEZBTFNFKTsKIAogCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCi1WT0lEIFNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCit2b2lkIFNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2JsayAqcFJ4QmxrKQogewotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7CisJc3RydWN0IHJ0X3J4d2kgKiBwUnhXSSA9IHBSeEJsay0+cFJ4V0k7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKiBwSGVhZGVyID0gcFJ4QmxrLT5wSGVhZGVyOworCXZvaWQgKnBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwogCi0Jc3dpdGNoIChwSGVhZGVyLT5GQy5TdWJUeXBlKQotCXsKLQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6Ci0JCQl7Ci0JCQkJQ250bEVucXVldWVGb3JSZWN2KHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50KSwgKFBGUkFNRV9CQV9SRVEpcEhlYWRlcik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKLQkJY2FzZSBTVUJUWVBFX0FDSzoKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCXN3aXRjaCAocEhlYWRlci0+RkMuU3ViVHlwZSkgeworCWNhc2UgU1VCVFlQRV9CTE9DS19BQ0tfUkVROgorCQl7CisJCQlDbnRsRW5xdWV1ZUZvclJlY3YocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwKKwkJCQkJICAgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpLAorCQkJCQkgICAoc3RydWN0IHJ0X2ZyYW1lX2JhX3JlcSAqKSBwSGVhZGVyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgorCWNhc2UgU1VCVFlQRV9BQ0s6CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiAJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNjU0LDE0MSArNjk4LDEyNyBAQAogCQlOZWVkIHRvIGNvbnNpZGVyIFFPUyBEQVRBIGZvcm1hdCB3aGVuIGNvbnZlcnRpbmcgdG8gODAyLjMKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1CT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJYXJnYykKK0JPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgSU4gQk9PTEVBTiBhcmdjKQogewotCU5ESVNfU1RBVFVTCQkJU3RhdHVzOwotCVVJTlQzMgkJCVJ4UHJvY2Vzc2VkLCBSeFBlbmRpbmc7Ci0JQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0JUlQyOFhYX1JYRF9TVFJVQwkqcFJ4RDsKLQlVQ0hBUgkJCSpwRGF0YTsKLQlQUlhXSV9TVFJVQwkJcFJ4V0k7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldDsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyOwotCVJYX0JMSwkJCVJ4Q2VsbDsKKwlpbnQgU3RhdHVzOworCXUzMiBSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOworCUJPT0xFQU4gYlJlc2NoZWR1bGUgPSBGQUxTRTsKKwlQUlQyOFhYX1JYRF9TVFJVQyBwUnhEOworCXU4ICpwRGF0YTsKKwlzdHJ1Y3QgcnRfcnh3aSAqIHBSeFdJOworCXZvaWQgKnBSeFBhY2tldDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZWFkZXI7CisJc3RydWN0IHJ0X3J4X2JsayBSeENlbGw7CiAKIAlSeFByb2Nlc3NlZCA9IFJ4UGVuZGluZyA9IDA7CiAKLQkvLyBwcm9jZXNzIHdob2xlIHJ4IHJpbmcKLQl3aGlsZSAoMSkKLQl7CisJLyogcHJvY2VzcyB3aG9sZSByeCByaW5nICovCisJd2hpbGUgKDEpIHsKIAogCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8Ci0JCQkhUlRNUF9URVNUX0ZMQUcocEFkLGZSVE1QX0FEQVBURVJfU1RBUlRfVVApKQotCQl7CisJCQkJICAgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8CisJCQkJICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJCQkgICBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8CisJCSAgICAhUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkgewogCQkJYnJlYWs7CiAJCX0KLQotI2lmZGVmIFJUMjg2MAotCQlpZiAoUnhQcm9jZXNzZWQrKyA+IE1BWF9SWF9QUk9DRVNTX0NOVCkKLQkJewotCQkJLy8gbmVlZCB0byByZXNjaGVkdWxlIHJ4IGhhbmRsZQorI2lmZGVmIFJUTVBfTUFDX1BDSQorCQlpZiAoUnhQcm9jZXNzZWQrKyA+IE1BWF9SWF9QUk9DRVNTX0NOVCkgeworCQkJLyogbmVlZCB0byByZXNjaGVkdWxlIHJ4IGhhbmRsZSAqLwogCQkJYlJlc2NoZWR1bGUgPSBUUlVFOwogCQkJYnJlYWs7CiAJCX0KLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JCVJ4UHJvY2Vzc2VkICsrOyAvLyB0ZXN0CisJCVJ4UHJvY2Vzc2VkKys7CS8qIHRlc3QgKi8KIAotCQkvLyAxLiBhbGxvY2F0ZSBhIG5ldyBkYXRhIHBhY2tldCBpbnRvIHJ4IHJpbmcgdG8gcmVwbGFjZSByZWNlaXZlZCBwYWNrZXQKLQkJLy8gICAgdGhlbiBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKLQkJLy8gMi4gdGhlIGNhbGxlZSBtdXN0IHRha2UgY2hhcmdlIG9mIHJlbGVhc2Ugb2YgcGFja2V0Ci0JCS8vIDMuIEFzIGZhciBhcyBkcml2ZXIgaXMgY29uY2VybmVkICwKLQkJLy8gICAgdGhlIHJ4IHBhY2tldCBtdXN0Ci0JCS8vICAgICAgYS4gYmUgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyIG9yCi0JCS8vICAgICAgYi4gYmUgcmVsZWFzZWQgaWYgaXQgaXMgZGlzY2FyZGVkCi0JCXBSeFBhY2tldCA9IEdldFBhY2tldEZyb21SeFJpbmcocEFkLCAmKFJ4Q2VsbC5SeEQpLCAmYlJlc2NoZWR1bGUsICZSeFBlbmRpbmcpOwotCQlpZiAocFJ4UGFja2V0ID09IE5VTEwpCi0JCXsKLQkJCS8vIG5vIG1vcmUgcGFja2V0IHRvIHByb2Nlc3MKKwkJLyogMS4gYWxsb2NhdGUgYSBuZXcgZGF0YSBwYWNrZXQgaW50byByeCByaW5nIHRvIHJlcGxhY2UgcmVjZWl2ZWQgcGFja2V0ICovCisJCS8qICAgIHRoZW4gcHJvY2Vzc2luZyB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisJCS8qIDIuIHRoZSBjYWxsZWUgbXVzdCB0YWtlIGNoYXJnZSBvZiByZWxlYXNlIG9mIHBhY2tldCAqLworCQkvKiAzLiBBcyBmYXIgYXMgZHJpdmVyIGlzIGNvbmNlcm5lZCAsICovCisJCS8qICAgIHRoZSByeCBwYWNrZXQgbXVzdCAqLworCQkvKiAgICAgIGEuIGJlIGluZGljYXRlZCB0byB1cHBlciBsYXllciBvciAqLworCQkvKiAgICAgIGIuIGJlIHJlbGVhc2VkIGlmIGl0IGlzIGRpc2NhcmRlZCAqLworCQlwUnhQYWNrZXQgPQorCQkgICAgR2V0UGFja2V0RnJvbVJ4UmluZyhwQWQsICYoUnhDZWxsLlJ4RCksICZiUmVzY2hlZHVsZSwKKwkJCQkJJlJ4UGVuZGluZyk7CisJCWlmIChwUnhQYWNrZXQgPT0gTlVMTCkgeworCQkJLyogbm8gbW9yZSBwYWNrZXQgdG8gcHJvY2VzcyAqLwogCQkJYnJlYWs7CiAJCX0KLQotCQkvLyBnZXQgcnggcmluZyBkZXNjcmlwdG9yCisJCS8qIGdldCByeCByaW5nIGRlc2NyaXB0b3IgKi8KIAkJcFJ4RCA9ICYoUnhDZWxsLlJ4RCk7Ci0JCS8vIGdldCByeCBkYXRhIGJ1ZmZlcgotCQlwRGF0YQk9IEdFVF9PU19QS1RfREFUQVBUUihwUnhQYWNrZXQpOwotCQlwUnhXSQk9IChQUlhXSV9TVFJVQykgcERhdGE7Ci0JCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIChwRGF0YStSWFdJX1NJWkUpIDsKKwkJLyogZ2V0IHJ4IGRhdGEgYnVmZmVyICovCisJCXBEYXRhID0gR0VUX09TX1BLVF9EQVRBUFRSKHBSeFBhY2tldCk7CisJCXBSeFdJID0gKHN0cnVjdCBydF9yeHdpICopIHBEYXRhOworCQlwSGVhZGVyID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIChwRGF0YSArIFJYV0lfU0laRSk7CiAKLQkJLy8gYnVpbGQgUnhDZWxsCisJCS8qIGJ1aWxkIFJ4Q2VsbCAqLwogCQlSeENlbGwucFJ4V0kgPSBwUnhXSTsKIAkJUnhDZWxsLnBIZWFkZXIgPSBwSGVhZGVyOwogCQlSeENlbGwucFJ4UGFja2V0ID0gcFJ4UGFja2V0OwotCQlSeENlbGwucERhdGEgPSAoVUNIQVIgKikgcEhlYWRlcjsKKwkJUnhDZWxsLnBEYXRhID0gKHU4ICopIHBIZWFkZXI7CiAJCVJ4Q2VsbC5EYXRhU2l6ZSA9IHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQ7CiAJCVJ4Q2VsbC5GbGFncyA9IDA7CiAKLQkJLy8gSW5jcmVhc2UgVG90YWwgcmVjZWl2ZSBieXRlIGNvdW50ZXIgYWZ0ZXIgcmVhbCBkYXRhIHJlY2VpdmVkIG5vIG1hdGVyIGFueSBlcnJvciBvciBub3QKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudCArPSAgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ICsrOworCQkvKiBJbmNyZWFzZSBUb3RhbCByZWNlaXZlIGJ5dGUgY291bnRlciBhZnRlciByZWFsIGRhdGEgcmVjZWl2ZWQgbm8gbWF0ZXIgYW55IGVycm9yIG9yIG5vdCAqLworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50ICs9CisJCSAgICBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50ICs9CisJCSAgICBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQrKzsKIAogCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLlJlY2VpdmVkRnJhZ21lbnRDb3VudCk7CiAKIAkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPCAxNCkKIAkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAKLSAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJewotICAgICAgICAgICAgc2VuZF9tb25pdG9yX3BhY2tldHMocEFkLCAmUnhDZWxsKTsKKwkJaWYgKE1PTklUT1JfT04ocEFkKSkgeworCQkJc2VuZF9tb25pdG9yX3BhY2tldHMocEFkLCAmUnhDZWxsKTsKIAkJCWJyZWFrOwogCQl9Ci0JCS8qIFJUMjg3MCBpbnZva2VzIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgpIGluIHJ0dXNiX2J1bGsuYyAqLwogCi0JCS8vIENoZWNrIGZvciBhbGwgUnhEIGVycm9ycworCQkvKiBTVEFSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKSBpcyBjYWxsZWQgaW4gcnR1c2JfYnVsay5jICovCisKKwkJLyogQ2hlY2sgZm9yIGFsbCBSeEQgZXJyb3JzICovCiAJCVN0YXR1cyA9IFJUTVBDaGVja1J4RXJyb3IocEFkLCBwSGVhZGVyLCBwUnhXSSwgcFJ4RCk7CiAKLQkJLy8gSGFuZGxlIHRoZSByZWNlaXZlZCBmcmFtZQotCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCXN3aXRjaCAocEhlYWRlci0+RkMuVHlwZSkKLQkJCXsKLQkJCQkvLyBDQVNFIEksIHJlY2VpdmUgYSBEQVRBIGZyYW1lCi0JCQkJY2FzZSBCVFlQRV9EQVRBOgorCQkvKiBIYW5kbGUgdGhlIHJlY2VpdmVkIGZyYW1lICovCisJCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQkJc3dpdGNoIChwSGVhZGVyLT5GQy5UeXBlKSB7CisJCQkJLyogQ0FTRSBJLCByZWNlaXZlIGEgREFUQSBmcmFtZSAqLworCQkJY2FzZSBCVFlQRV9EQVRBOgogCQkJCXsKLQkJCQkJLy8gcHJvY2VzcyBEQVRBIGZyYW1lCisJCQkJCS8qIHByb2Nlc3MgREFUQSBmcmFtZSAqLwogCQkJCQlTVEFIYW5kbGVSeERhdGFGcmFtZShwQWQsICZSeENlbGwpOwogCQkJCX0KIAkJCQlicmVhazsKLQkJCQkvLyBDQVNFIElJLCByZWNlaXZlIGEgTUdNVCBmcmFtZQotCQkJCWNhc2UgQlRZUEVfTUdNVDoKKwkJCQkvKiBDQVNFIElJLCByZWNlaXZlIGEgTUdNVCBmcmFtZSAqLworCQkJY2FzZSBCVFlQRV9NR01UOgogCQkJCXsKIAkJCQkJU1RBSGFuZGxlUnhNZ210RnJhbWUocEFkLCAmUnhDZWxsKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQkJLy8gQ0FTRSBJSUkuIHJlY2VpdmUgYSBDTlRMIGZyYW1lCi0JCQkJY2FzZSBCVFlQRV9DTlRMOgorCQkJCS8qIENBU0UgSUlJLiByZWNlaXZlIGEgQ05UTCBmcmFtZSAqLworCQkJY2FzZSBCVFlQRV9DTlRMOgogCQkJCXsKIAkJCQkJU1RBSGFuZGxlUnhDb250cm9sRnJhbWUocEFkLCAmUnhDZWxsKTsKIAkJCQl9CiAJCQkJYnJlYWs7Ci0JCQkJLy8gZGlzY2FyZCBvdGhlciB0eXBlCi0JCQkJZGVmYXVsdDoKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJCWJyZWFrOworCQkJCS8qIGRpc2NhcmQgb3RoZXIgdHlwZSAqLworCQkJZGVmYXVsdDoKKwkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LAorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQkJCWJyZWFrOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnMrKzsKLQkJCS8vIGRpc2NhcmQgdGhpcyBmcmFtZQotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCQkvKiBkaXNjYXJkIHRoaXMgZnJhbWUgKi8KKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJfQogCX0KIAotI2lmZGVmIFJUMjg2MAotCS8vIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyBpcyBzZXQgaWYgcmVjZWl2aW5nIGJlYWNvbi4KLQlpZiAoUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVykgJiYgKElORlJBX09OKHBBZCkpKQotCXsKLQkJUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19HT19UT19TTEVFUF9OT1cpOwotCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIHBBZC0+VGhpc1RidHROdW1Ub05leHRXYWtlVXApOwotCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCX0KLSNlbmRpZgogCXJldHVybiBiUmVzY2hlZHVsZTsKIH0KIApAQCAtODAzLDE1ICs4MzMsOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVE1QSGFuZGxlVHdha2V1cEludGVycnVwdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotI2lmZGVmIFJUMjg2MAotCUFzaWNGb3JjZVdha2V1cChwQWQsIERPVDExUE9XRVJTQVZFKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAogCUFzaWNGb3JjZVdha2V1cChwQWQsIEZBTFNFKTsKLSNlbmRpZgogfQogCiAvKgpAQCAtODIwLDkgKzg0NCw5IEBACiAgICAgRWFybHkgY2hlY2tpbmcgYW5kIE9TLWRlcGVuZWQgcGFyc2luZyBmb3IgVHggcGFja2V0IHNlbmQgdG8gb3VyIFNUQSBkcml2ZXIuCiAKIEFyZ3VtZW50czoKLSAgICBORElTX0hBTkRMRSAJTWluaXBvcnRBZGFwdGVyQ29udGV4dAlQb2ludGVyIHJlZmVyIHRvIHRoZSBkZXZpY2UgaGFuZGxlLCBpLmUuLCB0aGUgcEFkLgotCVBQTkRJU19QQUNLRVQJcHBQYWNrZXRBcnJheQkJCVRoZSBwYWNrZXQgYXJyYXkgbmVlZCB0byBkbyB0cmFuc21pc3Npb24uCi0JVUlOVAkJCU51bWJlck9mUGFja2V0cwkJCU51bWJlciBvZiBwYWNrZXQgaW4gcGFja2V0IGFycmF5LgorICAgIHZvaWQgKglNaW5pcG9ydEFkYXB0ZXJDb250ZXh0CVBvaW50ZXIgcmVmZXIgdG8gdGhlIGRldmljZSBoYW5kbGUsIGkuZS4sIHRoZSBwQWQuCisJdm9pZCAqKglwcFBhY2tldEFycmF5CQkJVGhlIHBhY2tldCBhcnJheSBuZWVkIHRvIGRvIHRyYW5zbWlzc2lvbi4KKwl1MzIJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KIAogUmV0dXJuIFZhbHVlOgogCU5PTkUKQEAgLTgzMiw0NyArODU2LDM5IEBACiAJWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRCBTVEFTZW5kUGFja2V0cygKLQlJTglORElTX0hBTkRMRQkJTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKLQlJTglQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXksCi0JSU4JVUlOVAkJCU51bWJlck9mUGFja2V0cykKK3ZvaWQgU1RBU2VuZFBhY2tldHModm9pZCAqTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKKwkJICAgIHZvaWQgKipwcFBhY2tldEFycmF5LCB1MzIgTnVtYmVyT2ZQYWNrZXRzKQogewotCVVJTlQJCQlJbmRleDsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0OwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCUJPT0xFQU4JCQlhbGxvd1RvU2VuZCA9IEZBTFNFOworCXUzMiBJbmRleDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKU1pbmlwb3J0QWRhcHRlckNvbnRleHQ7CisJdm9pZCAqcFBhY2tldDsKKwlCT09MRUFOIGFsbG93VG9TZW5kID0gRkFMU0U7CiAKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykKLQl7CisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTnVtYmVyT2ZQYWNrZXRzOyBJbmRleCsrKSB7CiAJCXBQYWNrZXQgPSBwcFBhY2tldEFycmF5W0luZGV4XTsKIAotCQlkbwotCQl7Ci0JCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSB8fAotCQkJCVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpKQotCQkJewotCQkJCS8vIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIGhhcmR3YXJlIGlzIGluIHJlc2V0IHN0YXRlCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoIUlORlJBX09OKHBBZCkgJiYgIUFESE9DX09OKHBBZCkpCi0JCQl7Ci0JCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgdGhlcmUgYXJlIG5vIHBoeXNpY2FsIGNvbm5lY3Rpb24geWV0Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIFJlY29yZCB0aGF0IG9yaWduYWwgcGFja2V0IHNvdXJjZSBpcyBmcm9tIE5ESVMgbGF5ZXIsc28gdGhhdAotCQkJCS8vIGxhdGVyIG9uIGRyaXZlciBrbm93cyBob3cgdG8gcmVsZWFzZSB0aGlzIE5ESVMgUEFDS0VUCi0JCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgMCk7IC8vIHRoaXMgZmllbGQgaXMgdXNlbGVzcyB3aGVuIGluIFNUQSBtb2RlCisJCWRvIHsKKwkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpCisJCQkgICAgfHwgUlRNUF9URVNUX0ZMQUcocEFkLAorCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpCisJCQkgICAgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpIHsKKwkJCQkvKiBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSBoYXJkd2FyZSBpcyBpbiByZXNldCBzdGF0ZSAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICghSU5GUkFfT04ocEFkKSAmJiAhQURIT0NfT04ocEFkKSkgeworCQkJCS8qIERyb3Agc2VuZCByZXF1ZXN0IHNpbmNlIHRoZXJlIGFyZSBubyBwaHlzaWNhbCBjb25uZWN0aW9uIHlldCAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBSZWNvcmQgdGhhdCBvcmlnbmFsIHBhY2tldCBzb3VyY2UgaXMgZnJvbSBORElTIGxheWVyLHNvIHRoYXQgKi8KKwkJCQkvKiBsYXRlciBvbiBkcml2ZXIga25vd3MgaG93IHRvIHJlbGVhc2UgdGhpcyBORElTIFBBQ0tFVCAqLworCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOwkvKiB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZSAqLwogCQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwgTkRJU19TVEFUVVNfUEVORElORyk7CisJCQkJTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhwUGFja2V0LAorCQkJCQkJICAgICAgIE5ESVNfU1RBVFVTX1BFTkRJTkcpOwogCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCsrOwogCiAJCQkJYWxsb3dUb1NlbmQgPSBUUlVFOwogCQkJfQotCQl9IHdoaWxlKEZBTFNFKTsKKwkJfSB3aGlsZSAoRkFMU0UpOwogCiAJCWlmIChhbGxvd1RvU2VuZCA9PSBUUlVFKQogCQkJU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOwpAQCAtODgwLDEyICs4OTYsMTEgQEAKIAkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAl9CiAKLQkvLyBEZXF1ZXVlIG91dGdvaW5nIGZyYW1lcyBmcm9tIFR4U3dRdWV1ZVtdIGFuZCBwcm9jZXNzIGl0CisJLyogRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdCAqLwogCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7CiAKIH0KIAotCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBSb3V0aW5lIERlc2NyaXB0aW9uOgpAQCAtODk4LDIwMSArOTEzLDE5OSBAQAogCXBQYWNrZXQgCVBvaW50ZXIgdG8gc2VuZCBwYWNrZXQKIAogUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCQlJZiBzdWNjZXMgdG8gcXVldWUgdGhlIHBhY2tldCBpbnRvIFR4U3dRdWV1ZS4KKwlORElTX1NUQVRVU19TVUNDRVNTCQkJSWYgc3VjY2VzcyB0byBxdWV1ZSB0aGUgcGFja2V0IGludG8gVHhTd1F1ZXVlLgogCU5ESVNfU1RBVFVTX0ZBSUxVUkUJCQlJZiBmYWlsZWQgdG8gZG8gZW4tcXVldWUuCiAKIE5vdGU6CiAJWW91IG9ubHkgY2FuIHB1dCBPUy1pbmRlcGVuZWQgJiBTVEEgcmVsYXRlZCBjb2RlIGluIGhlcmUuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1ORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQoraW50IFNUQVNlbmRQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICpwUGFja2V0KQogewotCVBBQ0tFVF9JTkZPIAlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVVJTlQJCQlBbGxvd0ZyYWdTaXplOwotCVVDSEFSCQkJTnVtYmVyT2ZGcmFnOwotCVVDSEFSCQkJUXVlSWR4LCBVc2VyUHJpb3JpdHk7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMOwotCXVuc2lnbmVkIGludCAJSXJxRmxhZ3M7Ci0JVUNIQVIJCQlGbGdJc0lQID0gMDsKLQlVQ0hBUgkJCVJhdGU7CisJc3RydWN0IHJ0X3BhY2tldF9pbmZvIFBhY2tldEluZm87CisJdTggKnBTcmNCdWZWQTsKKwl1MzIgU3JjQnVmTGVuOworCXUzMiBBbGxvd0ZyYWdTaXplOworCXU4IE51bWJlck9mRnJhZzsKKwl1OCBSVFNSZXF1aXJlZDsKKwl1OCBRdWVJZHgsIFVzZXJQcmlvcml0eTsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGludCBJcnFGbGFnczsKKwl1OCBGbGdJc0lQID0gMDsKKwl1OCBSYXRlOwogCi0JLy8gUHJlcGFyZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBidWZmZXIgZGVzY3JpcHRvcgotCS8vIGNoYWluZWQgd2l0aGluIGEgc2luZ2xlIE5ESVMgcGFja2V0LgorCS8qIFByZXBhcmUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkvKiBjaGFpbmVkIHdpdGhpbiBhIHNpbmdsZSBORElTIHBhY2tldC4gKi8KIAlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7CiAKLQlpZiAocFNyY0J1ZlZBID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQgLS0+IHBTcmNCdWZWQSA9PSBOVUxMICEhIVNyY0J1Zkxlbj0leFxuIixTcmNCdWZMZW4pKTsKLQkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCi0JCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJaWYgKHBTcmNCdWZWQSA9PSBOVUxMKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgIVNyY0J1Zkxlbj0leFxuIiwKKwkJCSAgU3JjQnVmTGVuKSk7CisJCS8qIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLworCQkvKiByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllciAqLwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAotCi0JaWYgKFNyY0J1ZkxlbiA8IDE0KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJTVEFTZW5kUGFja2V0IC0tPiBOZGlzIFBhY2tldCBidWZmZXIgZXJyb3IgISEhXG4iKSk7CisJaWYgKFNyY0J1ZkxlbiA8IDE0KSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yIVxuIikpOwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJfQotCi0JLy8gSW4gSFQgcmF0ZSBhZGhvYyBtb2RlLCBBLU1QRFUgaXMgb2Z0ZW4gdXNlZC4gU28gbmVlZCB0byBsb29rdXAgQkEgVGFibGUgYW5kIE1BQyBFbnRyeS4KLQkvLyBOb3RlIG11bHRpY2FzdCBwYWNrZXRzIGluIGFkaG9jIGFsc28gdXNlIEJTU0lEX1dDSUQgaW5kZXguCisJLyogSW4gSFQgcmF0ZSBhZGhvYyBtb2RlLCBBLU1QRFUgaXMgb2Z0ZW4gdXNlZC4gU28gbmVlZCB0byBsb29rdXAgQkEgVGFibGUgYW5kIE1BQyBFbnRyeS4gKi8KKwkvKiBOb3RlIG11bHRpY2FzdCBwYWNrZXRzIGluIGFkaG9jIGFsc28gdXNlIEJTU0lEX1dDSUQgaW5kZXguICovCiAJewotCQlpZihJTkZSQV9PTihwQWQpKQotCQl7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CiAJCQl7Ci0JCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIEJTU0lEX1dDSUQpOwotCQkJUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKLQkJfQotCQl9Ci0JCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkKLQkJCXsKKwkJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCBCU1NJRF9XQ0lEKTsKKwkJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOworCQkJfQorCQl9IGVsc2UgaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkgewogCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIE1DQVNUX1dDSUQpOwogCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBTcmNCdWZWQSk7CiAJCQl9CiAJCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOwogCQl9CiAJfQogCi0JaWYgKCFwRW50cnkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlNUQVNlbmRQYWNrZXQtPkNhbm5vdCBmaW5kIHBFbnRyeSglMng6JTJ4OiUyeDolMng6JTJ4OiUyeCkgaW4gTWFjVGFiIVxuIiwgUFJJTlRfTUFDKHBTcmNCdWZWQSkpKTsKLQkJLy8gUmVzb3VyZWNlIGlzIGxvdywgc3lzdGVtIGRpZCBub3QgYWxsb2NhdGUgdmlydHVhbCBhZGRyZXNzCi0JCS8vIHJldHVybiBORElTX1NUQVRVU19GQUlMVVJFIGRpcmVjdGx5IHRvIHVwcGVyIGxheWVyCisJaWYgKCFwRW50cnkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJTVEFTZW5kUGFja2V0LT5DYW5ub3QgZmluZCBwRW50cnkoJTJ4OiUyeDolMng6JTJ4OiUyeDolMngpIGluIE1hY1RhYiFcbiIsCisJCQkgIFBSSU5UX01BQyhwU3JjQnVmVkEpKSk7CisJCS8qIFJlc291cmVjZSBpcyBsb3csIHN5c3RlbSBkaWQgbm90IGFsbG9jYXRlIHZpcnR1YWwgYWRkcmVzcyAqLworCQkvKiByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBkaXJlY3RseSB0byB1cHBlciBsYXllciAqLwogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAogCWlmIChBREhPQ19PTihwQWQpCi0JCSkKLQl7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIChVQ0hBUilwRW50cnktPkFpZCk7CisJICAgICkgeworCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAodTgpcEVudHJ5LT5BaWQpOwogCX0KLQotCS8vCi0JLy8gQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4KLQkvLwkJSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuCisJLyogKi8KKwkvKiBDaGVjayB0aGUgRXRoZXJuZXQgRnJhbWUgdHlwZSBvZiB0aGlzIHBhY2tldCwgYW5kIHNldCB0aGUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDIGZsYWdzLiAqLworCS8qICAgICAgICAgICAgICBIZXJlIHdlIHNldCB0aGUgUEFDS0VUX1NQRUNJRklDIGZsYWdzKExMQywgVkxBTiwgREhDUC9BUlAsIEVBUE9MKS4gKi8KIAlSVE1QQ2hlY2tFdGhlclR5cGUocEFkLCBwUGFja2V0KTsKIAotCi0KLQkvLwotCS8vIFdQQSA4MDIuMXggc2VjdXJlZCBwb3J0IGNvbnRyb2wgLSBkcm9wIGFsbCBub24tODAyLjF4IGZyYW1lIGJlZm9yZSBwb3J0IHNlY3VyZWQKLQkvLworCS8qICovCisJLyogV1BBIDgwMi4xeCBzZWN1cmVkIHBvcnQgY29udHJvbCAtIGRyb3AgYWxsIG5vbi04MDIuMXggZnJhbWUgYmVmb3JlIHBvcnQgc2VjdXJlZCAqLworCS8qICovCiAJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQotCQkgICkKLQkJICAmJiAoKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkgfHwgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA+PSAyKSkKLQkJICAmJiAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBQYWNrZXQpPT0gRkFMU0UpCi0JCSAgKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFTZW5kUGFja2V0IC0tPiBEcm9wIHBhY2tldCBiZWZvcmUgcG9ydCBzZWN1cmVkICEhIVxuIikpOworCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJICAgICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisJICAgICkKKwkgICAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCisJCXx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCisJICAgICYmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCkgPT0gRkFMU0UpCisJICAgICkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlNUQVNlbmRQYWNrZXQgLS0+IERyb3AgcGFja2V0IGJlZm9yZSBwb3J0IHNlY3VyZWQhXG4iKSk7CiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCX0KIAorCS8qIFNURVAgMS4gRGVjaWRlIG51bWJlciBvZiBmcmFnbWVudHMgcmVxdWlyZWQgdG8gZGVsaXZlciB0aGlzIE1TRFUuICovCisJLyogICAgICAgICBUaGUgZXN0aW1hdGlvbiBoZXJlIGlzIG5vdCB2ZXJ5IGFjY3VyYXRlIGJlY2F1c2UgZGlmZmljdWx0IHRvICovCisJLyogICAgICAgICB0YWtlIGVuY3J5cHRpb24gb3ZlcmhlYWQgaW50byBjb25zaWRlcmF0aW9uIGhlcmUuIFRoZSByZXN1bHQgKi8KKwkvKiAgICAgICAgICJOdW1iZXJPZkZyYWciIGlzIHRoZW4ganVzdCB1c2VkIHRvIHByZS1jaGVjayBpZiBlbm91Z2ggZnJlZSAqLworCS8qICAgICAgICAgVFhEIGFyZSBhdmFpbGFibGUgdG8gaG9sZCB0aGlzIE1TRFUuICovCiAKLQkvLyBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLgotCS8vCSAgIFRoZSBlc3RpbWF0aW9uIGhlcmUgaXMgbm90IHZlcnkgYWNjdXJhdGUgYmVjYXVzZSBkaWZmaWN1bHQgdG8KLQkvLwkgICB0YWtlIGVuY3J5cHRpb24gb3ZlcmhlYWQgaW50byBjb25zaWRlcmF0aW9uIGhlcmUuIFRoZSByZXN1bHQKLQkvLwkgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUKLQkvLwkgICBUWEQgYXJlIGF2YWlsYWJsZSB0byBob2xkIHRoaXMgTVNEVS4KLQotCi0JaWYgKCpwU3JjQnVmVkEgJiAweDAxKQkvLyBmcmFnbWVudGF0aW9uIG5vdCBhbGxvd2VkIG9uIG11bHRpY2FzdCAmIGJyb2FkY2FzdAorCWlmICgqcFNyY0J1ZlZBICYgMHgwMSkJLyogZnJhZ21lbnRhdGlvbiBub3QgYWxsb3dlZCBvbiBtdWx0aWNhc3QgJiBicm9hZGNhc3QgKi8KIAkJTnVtYmVyT2ZGcmFnID0gMTsKIAllbHNlIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpCi0JCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgorCQlOdW1iZXJPZkZyYWcgPSAxOwkvKiBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24gKi8KIAllbHNlIGlmIChDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCkpCi0JCU51bWJlck9mRnJhZyA9IDE7CS8vIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgotCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUTUlYKSB8fCAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpKQotCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBNSU1PIFJBVEUgb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCi0JZWxzZQotCXsKLQkJLy8gVGhlIGNhbGN1bGF0ZWQgIk51bWJlck9mRnJhZyIgaXMgYSByb3VnaCBlc3RpbWF0aW9uIGJlY2F1c2Ugb2YgdmFyaW91cwotCQkvLyBlbmNyeXB0aW9uL2VuY2Fwc3VsYXRpb24gb3ZlcmhlYWQgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhpcyBudW1iZXIgaXMganVzdAotCQkvLyB1c2VkIHRvIG1ha2Ugc3VyZSBlbm91Z2ggZnJlZSBUWEQgYXJlIGF2YWlsYWJsZSBiZWZvcmUgZnJhZ21lbnRhdGlvbiB0YWtlcyBwbGFjZS4KLQkJLy8gSW4gY2FzZSB0aGUgYWN0dWFsIHJlcXVpcmVkIG51bWJlciBvZiBmcmFnbWVudHMgb2YgYW4gTkRJUyBwYWNrZXQKLQkJLy8gZXhjY2VlZHMgIk51bWJlck9mRnJhZyJjYWN1bGF0ZWQgaGVyZSBhbmQgbm90IGVub3VnaCBmcmVlIFRYRCBhdmFpbGFibGUsIHRoZQotCQkvLyBsYXN0IGZyYWdtZW50IChpLmUuIGxhc3QgTVBEVSkgd2lsbCBiZSBkcm9wcGVkIGluIFJUTVBIYXJkVHJhbnNtaXQoKSBkdWUgdG8gb3V0IG9mCi0JCS8vIHJlc291cmNlLCBhbmQgdGhlIE5ESVMgcGFja2V0IHdpbGwgYmUgaW5kaWNhdGVkIE5ESVNfU1RBVFVTX0ZBSUxVUkUuIFRoaXMgc2hvdWxkCi0JCS8vIHJhcmVseSBoYXBwZW4gYW5kIHRoZSBwZW5hbHR5IGlzIGp1c3QgbGlrZSBhIFRYIFJFVFJZIGZhaWwuIEFmZm9yZGFibGUuCisJCU51bWJlck9mRnJhZyA9IDE7CS8qIEFnZ3JlZ2F0aW9uIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbiAqLworCWVsc2UgaWYgKChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9PSBNT0RFX0hUTUlYKQorCQkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKKwkJTnVtYmVyT2ZGcmFnID0gMTsJLyogTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbiAqLworCWVsc2UgeworCQkvKiBUaGUgY2FsY3VsYXRlZCAiTnVtYmVyT2ZGcmFnIiBpcyBhIHJvdWdoIGVzdGltYXRpb24gYmVjYXVzZSBvZiB2YXJpb3VzICovCisJCS8qIGVuY3J5cHRpb24vZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBub3QgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGlzIG51bWJlciBpcyBqdXN0ICovCisJCS8qIHVzZWQgdG8gbWFrZSBzdXJlIGVub3VnaCBmcmVlIFRYRCBhcmUgYXZhaWxhYmxlIGJlZm9yZSBmcmFnbWVudGF0aW9uIHRha2VzIHBsYWNlLiAqLworCQkvKiBJbiBjYXNlIHRoZSBhY3R1YWwgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYWdtZW50cyBvZiBhbiBORElTIHBhY2tldCAqLworCQkvKiBleGNjZWVkcyAiTnVtYmVyT2ZGcmFnImNhY3VsYXRlZCBoZXJlIGFuZCBub3QgZW5vdWdoIGZyZWUgVFhEIGF2YWlsYWJsZSwgdGhlICovCisJCS8qIGxhc3QgZnJhZ21lbnQgKGkuZS4gbGFzdCBNUERVKSB3aWxsIGJlIGRyb3BwZWQgaW4gUlRNUEhhcmRUcmFuc21pdCgpIGR1ZSB0byBvdXQgb2YgKi8KKwkJLyogcmVzb3VyY2UsIGFuZCB0aGUgTkRJUyBwYWNrZXQgd2lsbCBiZSBpbmRpY2F0ZWQgTkRJU19TVEFUVVNfRkFJTFVSRS4gVGhpcyBzaG91bGQgKi8KKwkJLyogcmFyZWx5IGhhcHBlbiBhbmQgdGhlIHBlbmFsdHkgaXMganVzdCBsaWtlIGEgVFggUkVUUlkgZmFpbC4gQWZmb3JkYWJsZS4gKi8KIAotCQlBbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOwotCQlOdW1iZXJPZkZyYWcgPSAoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgLyBBbGxvd0ZyYWdTaXplKSArIDE7Ci0JCS8vIFRvIGdldCBhY2N1cmF0ZSBudW1iZXIgb2YgZnJhZ21lbnRhdGlvbiwgTWludXMgMSBpZiB0aGUgc2l6ZSBqdXN0IG1hdGNoIHRvIGFsbG93YWJsZSBmcmFnbWVudCBzaXplCi0JCWlmICgoKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggLSBMRU5HVEhfODAyXzMgKyBMRU5HVEhfODAyXzFfSCkgJSBBbGxvd0ZyYWdTaXplKSA9PSAwKQotCQl7CisJCUFsbG93RnJhZ1NpemUgPQorCQkgICAgKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLQorCQkgICAgTEVOR1RIX0NSQzsKKwkJTnVtYmVyT2ZGcmFnID0KKwkJICAgICgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArCisJCSAgICAgIExFTkdUSF84MDJfMV9IKSAvIEFsbG93RnJhZ1NpemUpICsgMTsKKwkJLyogVG8gZ2V0IGFjY3VyYXRlIG51bWJlciBvZiBmcmFnbWVudGF0aW9uLCBNaW51cyAxIGlmIHRoZSBzaXplIGp1c3QgbWF0Y2ggdG8gYWxsb3dhYmxlIGZyYWdtZW50IHNpemUgKi8KKwkJaWYgKCgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArCisJCSAgICAgIExFTkdUSF84MDJfMV9IKSAlIEFsbG93RnJhZ1NpemUpID09IDApIHsKIAkJCU51bWJlck9mRnJhZy0tOwogCQl9CiAJfQogCi0JLy8gU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQKKwkvKiBTYXZlIGZyYWdtZW50IG51bWJlciB0byBOZGlzIHBhY2tldCByZXNlcnZlZCBmaWVsZCAqLwogCVJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCwgTnVtYmVyT2ZGcmFnKTsKIAorCS8qIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzogKi8KKwkvKiAgICAgICAgIElmIG11bHRpcGxlIGZyYWdtZW50IHJlcXVpcmVkLCBSVFMgaXMgcmVxdWlyZWQgb25seSBmb3IgdGhlIGZpcnN0IGZyYWdtZW50ICovCisJLyogICAgICAgICBpZiB0aGUgZnJhZ21lbnQgc2l6ZSBsYXJnZSB0aGFuIFJUUyB0aHJlc2hvbGQgKi8KKwkvKiAgICAgRm9yIFJUMjh4eCwgTGV0IEFTSUMgc2VuZCBSVFMvQ1RTICovCisvKiAgICAgIFJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgMCk7ICovCisJaWYgKE51bWJlck9mRnJhZyA+IDEpCisJCVJUU1JlcXVpcmVkID0KKwkJICAgIChwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA+CisJCSAgICAgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSA/IDEgOiAwOworCWVsc2UKKwkJUlRTUmVxdWlyZWQgPQorCQkgICAgKFBhY2tldEluZm8uVG90YWxQYWNrZXRMZW5ndGggPgorCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkgPyAxIDogMDsKIAotCS8vIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzoKLQkvLwkgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudAotCS8vCSAgIGlmIHRoZSBmcmFnbWVudCBzaXplIGxhcmdlIHRoYW4gUlRTIHRocmVzaG9sZAotCS8vICAgICBGb3IgUlQyOHh4LCBMZXQgQVNJQyBzZW5kIFJUUy9DVFMKLQlSVE1QX1NFVF9QQUNLRVRfUlRTKHBQYWNrZXQsIDApOworCS8qIFNhdmUgUlRTIHJlcXVpcmVtZW50IHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkICovCisJUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCBSVFNSZXF1aXJlZCk7CiAJUlRNUF9TRVRfUEFDS0VUX1RYUkFURShwUGFja2V0LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUpOwogCi0JLy8KLQkvLyBTVEVQIDMuIFRyYWZmaWMgY2xhc3NpZmljYXRpb24uIG91dGNvbWUgPSA8VXNlclByaW9yaXR5LCBRdWVJZHg+Ci0JLy8KKwkvKiAqLworCS8qIFNURVAgMy4gVHJhZmZpYyBjbGFzc2lmaWNhdGlvbi4gb3V0Y29tZSA9IDxVc2VyUHJpb3JpdHksIFF1ZUlkeD4gKi8KKwkvKiAqLwogCVVzZXJQcmlvcml0eSA9IDA7Ci0JUXVlSWR4CQkgPSBRSURfQUNfQkU7Ci0jaWZkZWYgUlQyODYwCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkpCi0jZW5kaWYKLSNpZmRlZiBSVDI4NzAKKwlRdWVJZHggPSBRSURfQUNfQkU7CiAJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYKLQkJQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpCi0jZW5kaWYKLQl7Ci0JCVVTSE9SVCBQcm90b2NvbDsKLQkJVUNIQVIgIExsY1NuYXBMZW4gPSAwLCBCeXRlMCwgQnl0ZTE7Ci0JCWRvCi0JCXsKLQkJCS8vIGdldCBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZAotCQkJUHJvdG9jb2wgPSAoVVNIT1JUKSgocFNyY0J1ZlZBWzEyXSA8PCA4KSArIHBTcmNCdWZWQVsxM10pOwotCQkJaWYgKFByb3RvY29sIDw9IDE1MDApCi0JCQl7Ci0JCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAKLQkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgNiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJICAgIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSB7CisJCXUxNiBQcm90b2NvbDsKKwkJdTggTGxjU25hcExlbiA9IDAsIEJ5dGUwLCBCeXRlMTsKKwkJZG8geworCQkJLyogZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkICovCisJCQlQcm90b2NvbCA9CisJCQkgICAgKHUxNikoKHBTcmNCdWZWQVsxMl0gPDwgOCkgKyBwU3JjQnVmVkFbMTNdKTsKKwkJCWlmIChQcm90b2NvbCA8PSAxNTAwKSB7CisJCQkJLyogZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkIGZyb20gTExDL1NOQVAgKi8KKwkJCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcgorCQkJCSAgICAoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIsIExFTkdUSF84MDJfMyArIDYsCisJCQkJICAgICAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAkJCQkJYnJlYWs7CiAKLQkJCQlQcm90b2NvbCA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKKwkJCQlQcm90b2NvbCA9ICh1MTYpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKIAkJCQlMbGNTbmFwTGVuID0gODsKIAkJCX0KLQotCQkJLy8gYWx3YXlzIEFDX0JFIGZvciBub24tSVAgcGFja2V0CisJCQkvKiBhbHdheXMgQUNfQkUgZm9yIG5vbi1JUCBwYWNrZXQgKi8KIAkJCWlmIChQcm90b2NvbCAhPSAweDA4MDApCiAJCQkJYnJlYWs7CiAKLQkJCS8vIGdldCBJUCBoZWFkZXIKLQkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyBMbGNTbmFwTGVuLCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCS8qIGdldCBJUCBoZWFkZXIgKi8KKwkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyCisJCQkgICAgKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyBMbGNTbmFwTGVuLAorCQkJICAgICAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKIAkJCQlicmVhazsKIAotCQkJLy8gcmV0dXJuIEFDX0JFIGlmIHBhY2tldCBpcyBub3QgSVB2NAorCQkJLyogcmV0dXJuIEFDX0JFIGlmIHBhY2tldCBpcyBub3QgSVB2NCAqLwogCQkJaWYgKChCeXRlMCAmIDB4ZjApICE9IDB4NDApCiAJCQkJYnJlYWs7CiAKQEAgLTExMDAsNjMgKzExMTMsNTkgQEAKIAkJCVVzZXJQcmlvcml0eSA9IChCeXRlMSAmIDB4ZTApID4+IDU7CiAJCQlRdWVJZHggPSBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W1VzZXJQcmlvcml0eV07CiAKLQkJCS8vIFRPRE86IGhhdmUgdG8gY2hlY2sgQUNNIGJpdC4gYXBwbHkgVFNQRUMgaWYgQUNNIGlzIE9OCi0JCQkvLyBUT0RPOiBkb3duZ3JhZGUgVVAgJiBRdWVJZHggYmVmb3JlIHBhc3NpbmcgQUNNCi0JCQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQUNNW1F1ZUlkeF0pCi0JCQl7CisJCQkvKiBUT0RPOiBoYXZlIHRvIGNoZWNrIEFDTSBiaXQuIGFwcGx5IFRTUEVDIGlmIEFDTSBpcyBPTiAqLworCQkJLyogVE9ETzogZG93bmdyYWRlIFVQICYgUXVlSWR4IGJlZm9yZSBwYXNzaW5nIEFDTSAqLworCQkJLyoKKwkJCSAgIFVuZGVyIFdNTSBBQ00gY29udHJvbCwgd2UgZG9udCBuZWVkIHRvIGNoZWNrIHRoZSBiaXQ7CisJCQkgICBPciB3aGVuIGEgVFNQRUMgaXMgYnVpbHQgZm9yIFZPIGJ1dCB3ZSB3aWxsIGNoYW5nZSB0byBpc3N1ZQorCQkJICAgQkEgc2Vzc2lvbiBmb3IgQkUgaGVyZSwgc28gd2Ugd2lsbCBub3QgdXNlIEJBIHRvIHNlbmQgVk8gcGFja2V0cy4KKwkJCSAqLworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFDTVtRdWVJZHhdKSB7CiAJCQkJVXNlclByaW9yaXR5ID0gMDsKLQkJCQlRdWVJZHgJCSA9IFFJRF9BQ19CRTsKKwkJCQlRdWVJZHggPSBRSURfQUNfQkU7CiAJCQl9CiAJCX0gd2hpbGUgKEZBTFNFKTsKIAl9CiAKIAlSVE1QX1NFVF9QQUNLRVRfVVAocFBhY2tldCwgVXNlclByaW9yaXR5KTsKIAotCi0KLQkvLyBNYWtlIHN1cmUgU2VuZFR4V2FpdCBxdWV1ZSByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKKwkvKiBNYWtlIHN1cmUgU2VuZFR4V2FpdCBxdWV1ZSByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMgKi8KIAlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKQotCXsKKwlpZiAocEFkLT5UeFN3UXVldWVbUXVlSWR4XS5OdW1iZXIgPj0gTUFYX1BBQ0tFVFNfSU5fUVVFVUUpIHsKIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7CiAJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAogCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0JZWxzZQotCXsKLQkJSW5zZXJ0VGFpbFF1ZXVlKCZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOworCX0gZWxzZSB7CisJCUluc2VydFRhaWxRdWV1ZUFjKHBBZCwgcEVudHJ5LCAmcEFkLT5UeFN3UXVldWVbUXVlSWR4XSwKKwkJCQkgIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7CiAJfQogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwogCi0gICAgaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID09IFRSVUUpJiYKLSNpZmRlZiBSVDI4NjAKLSAgICAgICAgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpKQotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0gICAgICAgIElTX0hUX1NUQShwRW50cnkpKQotI2VuZGlmCi0JewotCQlpZiAoKChwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKLSAgICAgICAgICAgICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKLSAgICAgICAgICAgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQotCQkJIC8vIEZvciBJT1QgY29tcGF0aWJpbGl0eSwgaWYKLQkJCSAvLyAxLiBJdCBpcyBSYWxpbmsgY2hpcCBvcgotCQkJIC8vIDIuIEl0IGlzIE9QRU4gb3IgQUVTIG1vZGUsCi0JCQkgLy8gdGhlbiBCQSBzZXNzaW9uIGNhbiBiZSBidWxpdC4KLQkJCSAmJiAoKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiBwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApIHx8Ci0JCQkgCSAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkIHx8IHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQkJKQotCQl7Ci0JCQlCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgMCwgMCwgMTAsIEZBTFNFKTsKKwlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gVFJVRSkgJiYKKwkgICAgSVNfSFRfU1RBKHBFbnRyeSkpIHsKKwkJLypzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsgKi8KKwkJaWYgKCgocEVudHJ5LT5UWEJBYml0bWFwICYgKDEgPDwgVXNlclByaW9yaXR5KSkgPT0gMCkgJiYKKwkJICAgICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMSA8PCBVc2VyUHJpb3JpdHkpKSA9PSAwKSAmJgorCQkgICAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCisJCSAgICAvKiBGb3IgSU9UIGNvbXBhdGliaWxpdHksIGlmICovCisJCSAgICAvKiAxLiBJdCBpcyBSYWxpbmsgY2hpcCBvciAqLworCQkgICAgLyogMi4gSXQgaXMgT1BFTiBvciBBRVMgbW9kZSwgKi8KKwkJICAgIC8qIHRoZW4gQkEgc2Vzc2lvbiBjYW4gYmUgYnVsaXQuICovCisJCSAgICAmJiAoKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiBwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApCisJCQl8fCAocEVudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUEVuYWJsZWQKKwkJCSAgICAmJiBwRW50cnktPldlcFN0YXR1cyAhPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorCQkgICAgKSB7CisJCQlCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgVXNlclByaW9yaXR5LCAwLCAxMCwKKwkJCQkJICBGQUxTRSk7CiAJCX0KIAl9CiAKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY09zVHhDb3VudFtRdWVJZHhdKys7IC8vIFRPRE86IGZvciBkZWJ1ZyBvbmx5LiB0byBiZSByZW1vdmVkCisJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNPc1R4Q291bnRbUXVlSWR4XSsrOwkvKiBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZCAqLwogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTExNzksMTIzICsxMTg4LDEzMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLworI2lmZGVmIFJUTVBfTUFDX1BDSQoraW50IFJUTVBGcmVlVFhEUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTggUXVlSWR4LAorCQkJICAgICAgIHU4IE51bWJlclJlcXVpcmVkLCB1OCAqRnJlZU51bWJlcklzKQoreworCXVuc2lnbmVkIGxvbmcgRnJlZU51bWJlciA9IDA7CisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAKLSNpZmRlZiBSVDI4NzAKKwlzd2l0Y2ggKFF1ZUlkeCkgeworCWNhc2UgUUlEX0FDX0JLOgorCWNhc2UgUUlEX0FDX0JFOgorCWNhc2UgUUlEX0FDX1ZJOgorCWNhc2UgUUlEX0FDX1ZPOgorCQlpZiAocEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCA+CisJCSAgICBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KQorCQkJRnJlZU51bWJlciA9CisJCQkgICAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCAtCisJCQkgICAgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7CisJCWVsc2UKKwkJCUZyZWVOdW1iZXIgPQorCQkJICAgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLQorCQkJICAgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOworCisJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQorCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisKKwljYXNlIFFJRF9NR01UOgorCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCisJCQlGcmVlTnVtYmVyID0KKwkJCSAgICBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtCisJCQkgICAgMTsKKwkJZWxzZQorCQkJRnJlZU51bWJlciA9CisJCQkgICAgcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0KKwkJCSAgICBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKKworCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKKwkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOworCQlicmVhazsKKwl9CisJKkZyZWVOdW1iZXJJcyA9ICh1OClGcmVlTnVtYmVyOworCisJcmV0dXJuIChTdGF0dXMpOworfQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworI2lmZGVmIFJUTVBfTUFDX1VTQgogLyoKIAlBY3R1YWxseSwgdGhpcyBmdW5jdGlvbiB1c2VkIHRvIGNoZWNrIGlmIHRoZSBUeEhhcmR3YXJlIFF1ZXVlIHN0aWxsIGhhcyBmcmFtZSBuZWVkIHRvIHNlbmQuCiAJSWYgbm8gZnJhbWUgbmVlZCB0byBzZW5kLCBnbyB0byBzbGVlcCwgZWxzZSwgc3RpbGwgd2FrZSB1cC4KICovCi0jZW5kaWYKLU5ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCQkJUXVlSWR4LAotCUlOCQlVQ0hBUgkJCU51bWJlclJlcXVpcmVkLAotCUlOCQlQVUNIQVIJCQlGcmVlTnVtYmVySXMpCitpbnQgUlRNUEZyZWVUWERSZXF1ZXN0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1OCBRdWVJZHgsCisJCQkgICAgICAgdTggTnVtYmVyUmVxdWlyZWQsIHU4ICpGcmVlTnVtYmVySXMpCiB7Ci0jaWZkZWYgUlQyODYwCi0JVUxPTkcJCUZyZWVOdW1iZXIgPSAwOwotI2VuZGlmCi0JTkRJU19TVEFUVVMgCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0jaWZkZWYgUlQyODcwCi0JdW5zaWduZWQgbG9uZyAgIElycUZsYWdzOwotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKLSNlbmRpZgorCS8qdW5zaWduZWQgbG9uZyAgICAgICAgIEZyZWVOdW1iZXIgPSAwOyAqLworCWludCBTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKIAotCXN3aXRjaCAoUXVlSWR4KQotCXsKLQkJY2FzZSBRSURfQUNfQks6Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQljYXNlIFFJRF9BQ19WSToKLQkJY2FzZSBRSURfQUNfVk86Ci0JCWNhc2UgUUlEX0hDQ0E6Ci0jaWZkZWYgUlQyODYwCi0JCQlpZiAocEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCA+IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgpCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggLSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKLQkJCWVsc2UKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeFN3RnJlZUlkeCArIFRYX1JJTkdfU0laRSAtIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHggLSAxOwotCi0JCQlpZiAoRnJlZU51bWJlciA+PSBOdW1iZXJSZXF1aXJlZCkKLQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQl7Ci0JCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0JCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCQkJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICE9IHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pIHx8Ci0JCQkJCShwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpCi0JCQkJewotCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJCX0KLQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQkJCX0KLSNlbmRpZgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRSURfTUdNVDoKLSNpZmRlZiBSVDI4NjAKLQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID4gcEFkLT5NZ210UmluZy5UeENwdUlkeCkKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCAtIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHggLSAxOwotCQkJZWxzZQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICsgTUdNVF9SSU5HX1NJWkUgLSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKLQotCQkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCi0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAotCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggIT0gTUdNVF9SSU5HX1NJWkUpCisJc3dpdGNoIChRdWVJZHgpIHsKKwljYXNlIFFJRF9BQ19CSzoKKwljYXNlIFFJRF9BQ19CRToKKwljYXNlIFFJRF9BQ19WSToKKwljYXNlIFFJRF9BQ19WTzoKKwkJeworCQkJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07CisJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLAorCQkJCSAgICAgIElycUZsYWdzKTsKKwkJCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICE9CisJCQkgICAgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pCisJCQkgICAgfHwgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSkgewogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQllbHNlCisJCQl9IGVsc2UgewogCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJUTVBGcmVlVFhEUmVxdWVzdDo6SW52YWxpZCBRdWVJZHgoPSVkKVxuIiwgUXVlSWR4KSk7Ci0JCQlicmVhazsKKwkJCX0KKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwKKwkJCQkJSXJxRmxhZ3MpOworCQl9CisJCWJyZWFrOworCWNhc2UgUUlEX01HTVQ6CisJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ICE9IE1HTVRfUklOR19TSVpFKQorCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKKwkJZWxzZQorCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOworCQlicmVhazsKIAl9Ci0jaWZkZWYgUlQyODYwCi0JKkZyZWVOdW1iZXJJcyA9IChVQ0hBUilGcmVlTnVtYmVyOwotI2VuZGlmCiAKIAlyZXR1cm4gKFN0YXR1cyk7CiB9CisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCiAKLQotCi1WT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIH0KIAotVk9JRAlSVE1QU2VuZE51bGxGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVR4UmF0ZSwKLQlJTglCT09MRUFOIAkJYlFvc051bGwpCit2b2lkIFJUTVBTZW5kTnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJICAgICAgIHU4IFR4UmF0ZSwgSU4gQk9PTEVBTiBiUW9zTnVsbCkKIHsKLQlVQ0hBUglOdWxsRnJhbWVbNDhdOwotCVVMT05HCUxlbmd0aDsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKKwl1OCBOdWxsRnJhbWVbNDhdOworCXVuc2lnbmVkIGxvbmcgTGVuZ3RoOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcl84MDJfMTE7CiAKLSAgICAvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sCi0gICAgaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCQkgIHx8IChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkKLSAgICAgICAgKSAmJgotICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCXsKKwkvKiBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sICovCisJaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAorCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKKwkgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAorCSAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCisJICAgICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCisJICAgICkgJiYgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpIHsKIAkJcmV0dXJuOwogCX0KIAogCU5kaXNaZXJvTWVtb3J5KE51bGxGcmFtZSwgNDgpOwotCUxlbmd0aCA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwlMZW5ndGggPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIE51bGxGcmFtZTsKKwlwSGVhZGVyXzgwMl8xMSA9IChzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqKSBOdWxsRnJhbWU7CiAKIAlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7CiAJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKQEAgLTEzMDQsOTcgKzEzMjIsODQgQEAKIAlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7CiAJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAotCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQotCXsKKwlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkgewogCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOworCX0gZWxzZSB7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0KKwkJICAgIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpID8gMSA6IDA7CiAJfQotCWVsc2UKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgPyAxOiAwOwotCX0KLQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKKwlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPQorCSAgICBwQWQtPkNvbW1vbkNmZy5Ec2lmcyArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBUeFJhdGUsIDE0KTsKIAogCXBBZC0+U2VxdWVuY2UrKzsKIAlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwogCi0JLy8gUHJlcGFyZSBRb3NOdWxsIGZ1bmN0aW9uIGZyYW1lCi0JaWYgKGJRb3NOdWxsKQotCXsKKwkvKiBQcmVwYXJlIFFvc051bGwgZnVuY3Rpb24gZnJhbWUgKi8KKwlpZiAoYlFvc051bGwpIHsKIAkJcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX1FPU19OVUxMOwogCi0JCS8vIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMKLQkJTnVsbEZyYW1lW0xlbmd0aF0JPSAgMDsKLQkJTnVsbEZyYW1lW0xlbmd0aCsxXSA9ICAwOwotCQlMZW5ndGggKz0gMjsvLyBpZiBwYWQgd2l0aCAyIGJ5dGVzIGZvciBhbGlnbm1lbnQsIEFQU0Qgd2lsbCBmYWlsCisJCS8qIGNvcHkgUU9TIGNvbnRyb2wgYnl0ZXMgKi8KKwkJTnVsbEZyYW1lW0xlbmd0aF0gPSAwOworCQlOdWxsRnJhbWVbTGVuZ3RoICsgMV0gPSAwOworCQlMZW5ndGggKz0gMjsJLyogaWYgcGFkIHdpdGggMiBieXRlcyBmb3IgYWxpZ25tZW50LCBBUFNEIHdpbGwgZmFpbCAqLwogCX0KIAogCUhBTF9LaWNrT3V0TnVsbEZyYW1lVHgocEFkLCAwLCBOdWxsRnJhbWUsIExlbmd0aCk7CiAKIH0KIAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lECVJUTVBTZW5kUlRTRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCXVuc2lnbmVkIGludAlOZXh0TXBkdVNpemUsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlSVFNSYXRlLAotCUlOCVVTSE9SVAkJCUFja0R1cmF0aW9uLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVDSEFSCQkJRnJhbWVHYXApCisvKiBJUlFMID0gRElTUEFUQ0hfTEVWRUwgKi8KK3ZvaWQgUlRNUFNlbmRSVFNGcmFtZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgIHU4ICpwREEsCisJCSAgICAgIElOIHVuc2lnbmVkIGludCBOZXh0TXBkdVNpemUsCisJCSAgICAgIHU4IFR4UmF0ZSwKKwkJICAgICAgdTggUlRTUmF0ZSwKKwkJICAgICAgdTE2IEFja0R1cmF0aW9uLCB1OCBRdWVJZHgsIHU4IEZyYW1lR2FwKQogewogfQogCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBGSU5EIEVOQ1JZUFQgS0VZIEFORCBERUNJREUgQ0lQSEVSIEFMR09SSVRITQotLy8JCUZpbmQgdGhlIFdQQSBrZXksIGVpdGhlciBHcm91cCBvciBQYWlyd2lzZSBLZXkKLS8vCQlMRUFQICsgVEtJUCBhbHNvIHVzZSBXUEEga2V5LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlY2lkZSBXRVAgYml0IGFuZCBjaXBoZXIgc3VpdGUgdG8gYmUgdXNlZC4gU2FtZSBjaXBoZXIgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHdob2xlIGZyYWdtZW50IGJ1cnN0Ci0vLyBJbiBDaXNjbyBDQ1ggMi4wIExlYXAgQXV0aGVudGljYXRpb24KLS8vCQkgICBXZXBTdGF0dXMgaXMgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCBidXQgdGhlIGtleSB3aWxsIHVzZSBQYWlyd2lzZUtleQotLy8JCSAgIEluc3RlYWQgb2YgdGhlIFNoYXJlZEtleSwgU2hhcmVkS2V5IExlbmd0aCBtYXkgYmUgWmVyby4KLVZPSUQgU1RBRmluZENpcGhlckFsZ29yaXRobSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICBGSU5EIEVOQ1JZUFQgS0VZIEFORCBERUNJREUgQ0lQSEVSIEFMR09SSVRITSAqLworLyogICAgICAgICAgICAgIEZpbmQgdGhlIFdQQSBrZXksIGVpdGhlciBHcm91cCBvciBQYWlyd2lzZSBLZXkgKi8KKy8qICAgICAgICAgICAgICBMRUFQICsgVEtJUCBhbHNvIHVzZSBXUEEga2V5LiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERlY2lkZSBXRVAgYml0IGFuZCBjaXBoZXIgc3VpdGUgdG8gYmUgdXNlZC4gU2FtZSBjaXBoZXIgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHdob2xlIGZyYWdtZW50IGJ1cnN0ICovCisvKiBJbiBDaXNjbyBDQ1ggMi4wIExlYXAgQXV0aGVudGljYXRpb24gKi8KKy8qICAgICAgICAgICAgICAgICBXZXBTdGF0dXMgaXMgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCBidXQgdGhlIGtleSB3aWxsIHVzZSBQYWlyd2lzZUtleSAqLworLyogICAgICAgICAgICAgICAgIEluc3RlYWQgb2YgdGhlIFNoYXJlZEtleSwgU2hhcmVkS2V5IExlbmd0aCBtYXkgYmUgWmVyby4gKi8KK3ZvaWQgU1RBRmluZENpcGhlckFsZ29yaXRobShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlDaXBoZXI7CQkJCS8vIFRvIGluZGljYXRlIGNpcGhlciB1c2VkIGZvciB0aGlzIHBhY2tldAotCVVDSEFSCQkJCQkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwkJLy8gY2lwaGVyIGFsb2dyaXRobQotCVVDSEFSCQkJCQkJCUtleUlkeCA9IDB4ZmY7Ci0JUFVDSEFSCQkJCQkJCXBTcmNCdWZWQTsKLQlQQ0lQSEVSX0tFWQkJCQkJCXBLZXkgPSBOVUxMOworCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTIENpcGhlcjsJLyogVG8gaW5kaWNhdGUgY2lwaGVyIHVzZWQgZm9yIHRoaXMgcGFja2V0ICovCisJdTggQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CS8qIGNpcGhlciBhbG9ncml0aG0gKi8KKwl1OCBLZXlJZHggPSAweGZmOworCXU4ICpwU3JjQnVmVkE7CisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBLZXkgPSBOVUxMOwogCiAJcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBUeEJsay0+cFBhY2tldCk7CiAKIAl7Ci0JICAgIC8vIFNlbGVjdCBDaXBoZXIKLQkgICAgaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQotCSAgICAgICAgQ2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7IC8vIENpcGhlciBmb3IgTXVsdGljYXN0IG9yIEJyb2FkY2FzdAotCSAgICBlbHNlCi0JICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyOyAvLyBDaXBoZXIgZm9yIFVuaWNhc3QKKwkJLyogU2VsZWN0IENpcGhlciAqLworCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCisJCQlDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsJLyogQ2lwaGVyIGZvciBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0ICovCisJCWVsc2UKKwkJCUNpcGhlciA9IHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXI7CS8qIENpcGhlciBmb3IgVW5pY2FzdCAqLwogCi0JCWlmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKLQkJewotCQkJQVNTRVJUKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA8PSBDSVBIRVJfQ0tJUDEyOCk7CisJCWlmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkgeworCQkJQVNTRVJUKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA8PQorCQkJICAgICAgIENJUEhFUl9DS0lQMTI4KTsKIAotCQkJLy8gNC13YXkgaGFuZHNoYWtpbmcgZnJhbWUgbXVzdCBiZSBjbGVhcgotCQkJaWYgKCEoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQ2xlYXJFQVBGcmFtZSkpICYmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcpICYmCi0JCQkJKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbikpCi0JCQl7CisJCQkvKiA0LXdheSBoYW5kc2hha2luZyBmcmFtZSBtdXN0IGJlIGNsZWFyICovCisJCQlpZiAoIShUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JDbGVhckVBUEZyYW1lKSkKKwkJCSAgICAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKQorCQkJICAgICYmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKSB7CiAJCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOwogCQkJCUtleUlkeCA9IDA7CiAJCQl9Ci0JCX0KLQkJZWxzZSBpZiAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCi0JCXsKLQkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JCX0KLQkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCSAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpIC8vIG11bHRpY2FzdAorCQl9IGVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB7CisJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CisJCX0gZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAorCQkJICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgeworCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKQkvKiBtdWx0aWNhc3QgKi8KIAkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7CiAJCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pCiAJCQkJS2V5SWR4ID0gMDsKQEAgLTE0MDQsMTYgKzE0MDksMTcgQEAKIAogCQlpZiAoS2V5SWR4ID09IDB4ZmYpCiAJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB8fCAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gMCkpCisJCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkKKwkJCSB8fCAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gMCkpCiAJCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkgICAgZWxzZSBpZiAoIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAmJgotCSAgICAgICAgICAgICAoQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpICYmCi0JICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkgJiYKLQkgICAgICAgICAgICAgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJZWxzZQotCQl7Ci0JCQkvL0hlYWRlcl84MDJfMTEuRkMuV2VwID0gMTsKKwkJZWxzZSBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCisJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgorCQkJIChwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSkgJiYKKwkJCSAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0KKwkJCSAgV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKKwkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQllbHNlIHsKKwkJCS8qSGVhZGVyXzgwMl8xMS5GQy5XZXAgPSAxOyAqLwogCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7CiAJCQlwS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF07CiAJCX0KQEAgLTE0MjMsNDcgKzE0MjksNDcgQEAKIAlwVHhCbGstPnBLZXkgPSBwS2V5OwogfQogCi0KLVZPSUQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFRYX0JMSyAgICAgICAgICAqcFR4QmxrKQordm9pZCBTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqcEhlYWRlcl84MDJfMTE7CiAKLQkvLwotCS8vIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUgotCS8vCisJLyogKi8KKwkvKiBNQUtFIEEgQ09NTU9OIDgwMi4xMSBIRUFERVIgKi8KKwkvKiAqLwogCi0JLy8gbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7CisJLyogbm9ybWFsIHdsYW4gaGVhZGVyIHNpemUgOiAyNCBvY3RldHMgKi8KKwlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpOwogCi0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOworCXBIZWFkZXJfODAyXzExID0KKwkgICAgKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopICYgcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwogCi0JTmRpc1plcm9NZW1vcnkocEhlYWRlcl84MDJfMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7CisJTmRpc1plcm9NZW1vcnkocEhlYWRlcl84MDJfMTEsIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOwogCiAJcEhlYWRlcl84MDJfMTEtPkZDLkZyRHMgPSAwOwogCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9ICgoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgPyBTVUJUWVBFX1FEQVRBIDogU1VCVFlQRV9EQVRBKTsKKwlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9CisJICAgICgoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgPyBTVUJUWVBFX1FEQVRBIDoKKwkgICAgIFNVQlRZUEVfREFUQSk7CiAKLSAgICBpZiAocFR4QmxrLT5wTWFjRW50cnkpCi0JewotCQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpKQotCQl7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcTsKLQkJCXBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxID0gKHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxKzEpICYgTUFYU0VROwotCQl9Ci0JCWVsc2UKLQkJeworCWlmIChwVHhCbGstPnBNYWNFbnRyeSkgeworCQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpKSB7CisJCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPQorCQkJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxOworCQkJcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgPQorCQkJICAgIChwVHhCbGstPnBNYWNFbnRyeS0+Tm9uUW9zRGF0YVNlcSArIDEpICYgTUFYU0VROworCQl9IGVsc2UgewogCQkJewotICAgIAkgICAgcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XTsKLSAgICAJICAgIHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKLSAgICAJfQotCX0KLQl9Ci0JZWxzZQotCXsKKwkJCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPQorCQkJCSAgICBwVHhCbGstPnBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT4KKwkJCQkJCQkgICAgIFVzZXJQcmlvcml0eV07CisJCQkJcFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSA9CisJCQkJICAgIChwVHhCbGstPnBNYWNFbnRyeS0+CisJCQkJICAgICBUeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gKyAxKSAmIE1BWFNFUTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CiAJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7Ci0JCXBBZC0+U2VxdWVuY2UgPSAocEFkLT5TZXF1ZW5jZSsxKSAmIE1BWFNFUTsgLy8gbmV4dCBzZXF1ZW5jZQorCQlwQWQtPlNlcXVlbmNlID0gKHBBZC0+U2VxdWVuY2UgKyAxKSAmIE1BWFNFUTsJLyogbmV4dCBzZXF1ZW5jZSAqLwogCX0KIAogCXBIZWFkZXJfODAyXzExLT5GcmFnID0gMDsKQEAgLTE0NzEsMjAgKzE0NzcsMjMgQEAKIAlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7CiAKIAl7Ci0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7CisJCWlmIChJTkZSQV9PTihwQWQpKSB7CiAJCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7Ci0JCX0KLQkJfQotCQllbHNlIGlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMSwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsCisJCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwKKwkJCQkJICAgICAgcEFkLT5DdXJyZW50QWRkcmVzcyk7CisJCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsCisJCQkJCSAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQkJcEhlYWRlcl84MDJfMTEtPkZDLlRvRHMgPSAxOworCQkJfQorCQl9IGVsc2UgaWYgKEFESE9DX09OKHBBZCkpIHsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLAorCQkJCSAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwKKwkJCQkgICAgICBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKKwkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIzLAorCQkJCSAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKIAkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKIAkJfQogCX0KQEAgLTE0OTIsMTA3ICsxNTAxLDEwNyBAQAogCWlmIChwVHhCbGstPkNpcGhlckFsZyAhPSBDSVBIRVJfTk9ORSkKIAkJcEhlYWRlcl84MDJfMTEtPkZDLldlcCA9IDE7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLSAgICAJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKIAllbHNlCi0gICAgCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CisJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CiB9CiAKLVZPSUQgU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcigKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gVFhfQkxLCQkJKnBUeEJsaywKLQlJTiBVQ0hBUgkJCSpwSGVhZGVyKQordm9pZCBTVEFCdWlsZENhY2hlODAyXzExSGVhZGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGssIHU4ICogcEhlYWRlcikKIHsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcE1hY0VudHJ5OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICogcEhlYWRlcjgwMjExOwogCi0JcEhlYWRlcjgwMjExID0gKFBIRUFERVJfODAyXzExKXBIZWFkZXI7CisJcEhlYWRlcjgwMjExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXI7CiAJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7CiAKLQkvLwotCS8vIFVwZGF0ZSB0aGUgY2FjaGVkIDgwMi4xMSBIRUFERVIKLQkvLworCS8qICovCisJLyogVXBkYXRlIHRoZSBjYWNoZWQgODAyLjExIEhFQURFUiAqLworCS8qICovCiAKLQkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cwotCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKKwkvKiBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cyAqLworCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSk7CiAKLQkvLyBNb3JlIEJpdAorCS8qIE1vcmUgQml0ICovCiAJcEhlYWRlcjgwMjExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKIAotCS8vIFNlcXVlbmNlCisJLyogU2VxdWVuY2UgKi8KIAlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07Ci0gICAgcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0rMSkgJiBNQVhTRVE7CisJcE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPQorCSAgICAocE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gKyAxKSAmIE1BWFNFUTsKIAogCXsKLQkJLy8gVGhlIGFkZHIzIG9mIG5vcm1hbCBwYWNrZXQgc2VuZCBmcm9tIERTIGlzIERlc3QgTWFjIGFkZHJlc3MuCisJCS8qIENoZWNrIGlmIHRoZSBmcmFtZSBjYW4gYmUgc2VudCB0aHJvdWdoIERMUyBkaXJlY3QgbGluayBpbnRlcmZhY2UgKi8KKwkJLyogSWYgcGFja2V0IGNhbiBiZSBzZW50IHRocm91Z2ggRExTLCB0aGVuIGZvcmNlIGFnZ3JlZ2F0aW9uIGRpc2FibGUuIChIYXJkIHRvIGRldGVybWluZSBwZWVyIFNUQSdzIGNhcGFiaWxpdHkpICovCisKKwkJLyogVGhlIGFkZHIzIG9mIG5vcm1hbCBwYWNrZXQgc2VuZCBmcm9tIERTIGlzIERlc3QgTWFjIGFkZHJlc3MuICovCiAJCWlmIChBREhPQ19PTihwQWQpKQotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyODAyMTEtPkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsCisJCQkJICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCQllbHNlCi0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7CisJCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsCisJCQkJICAgICAgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKIAl9CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLSAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7CisJCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOwogCWVsc2UKLSAgICAJcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7CisJCXBIZWFkZXI4MDIxMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwogfQogCi1zdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQorc3RhdGljIGlubGluZSB1OCAqU1RBX0J1aWxkX0FSYWxpbmtfRnJhbWVfSGVhZGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJCSAgICBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQTkRJU19QQUNLRVQJcE5leHRQYWNrZXQ7Ci0JVUlOVDMyCQkJbmV4dEJ1ZkxlbjsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqcEhlYWRlcl84MDJfMTE7CisJdm9pZCAqcE5leHRQYWNrZXQ7CisJdTMyIG5leHRCdWZMZW47CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwUUVudHJ5OwogCiAJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwogCi0KIAlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKIAotCS8vIHN0ZWFsICJvcmRlciIgYml0IHRvIG1hcmsgImFnZ3JlZ2F0aW9uIgorCS8qIHN0ZWFsICJvcmRlciIgYml0IHRvIG1hcmsgImFnZ3JlZ2F0aW9uIiAqLwogCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7CiAKLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwkvKiBza2lwIGNvbW1vbiBoZWFkZXIgKi8KIAlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKIAotCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pKQotCXsKLQkJLy8KLQkJLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkJLy8KKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgeworCQkvKiAqLworCQkvKiBidWlsZCBRT1MgQ29udHJvbCBieXRlcyAqLworCQkvKiAqLwogCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwogCi0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOworCQkqKHBIZWFkZXJCdWZQdHIgKyAxKSA9IDA7CisJCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7CiAJfQorCS8qIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlci4gTExDIGhlYWRlciBzaG91bGQgYXQgNC1ieXRlcyBhbGlnbWVudC4gKi8KKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CiAKLQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuCi0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwotCi0JLy8gRm9yIFJBIEFnZ3JlZ2F0aW9uLAotCS8vIHB1dCB0aGUgMm5kIE1TRFUgbGVuZ3RoKGV4dHJhIDItYnl0ZSBmaWVsZCkgYWZ0ZXIgUU9TX0NPTlRST0wgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKwkvKiBGb3IgUkEgQWdncmVnYXRpb24sICovCisJLyogcHV0IHRoZSAybmQgTVNEVSBsZW5ndGgoZXh0cmEgMi1ieXRlIGZpZWxkKSBhZnRlciBzdHJ1Y3QgcnRfcW9zX2NvbnRyb2wgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KIAlwUUVudHJ5ID0gcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZDsKLQlwTmV4dFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BLVChwUUVudHJ5KTsKKwlwTmV4dFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKIAluZXh0QnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocE5leHRQYWNrZXQpOwogCWlmIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwTmV4dFBhY2tldCkpCiAJCW5leHRCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAotCSpwSGVhZGVyQnVmUHRyID0gKFVDSEFSKW5leHRCdWZMZW4gJiAweGZmOwotCSoocEhlYWRlckJ1ZlB0cisxKSA9IChVQ0hBUikobmV4dEJ1ZkxlbiA+PiA4KTsKKwkqcEhlYWRlckJ1ZlB0ciA9ICh1OCluZXh0QnVmTGVuICYgMHhmZjsKKwkqKHBIZWFkZXJCdWZQdHIgKyAxKSA9ICh1OCkobmV4dEJ1ZkxlbiA+PiA4KTsKIAogCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKQEAgLTE2MDEsMTk4ICsxNjEwLDIwNyBAQAogCiB9CiAKLXN0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQorc3RhdGljIGlubGluZSB1OCAqU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJCQkgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOy8vLCBwU2F2ZUJ1ZlB0cjsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQorCXU4ICpwSGVhZGVyQnVmUHRyOwkvKiwgcFNhdmVCdWZQdHI7ICovCisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOwogCiAJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7CiAJU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwogCiAJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJfODAyXzExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CiAKLQkvLyBza2lwIGNvbW1vbiBoZWFkZXIKKwkvKiBza2lwIGNvbW1vbiBoZWFkZXIgKi8KIAlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKIAotCS8vCi0JLy8gYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMKLQkvLworCS8qICovCisJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkvKiAqLwogCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7CiAKLQkvLwotCS8vIEEtTVNEVSBwYWNrZXQKLQkvLworCS8qICovCisJLyogQS1NU0RVIHBhY2tldCAqLworCS8qICovCiAJKnBIZWFkZXJCdWZQdHIgfD0gMHg4MDsKIAotCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JcEhlYWRlckJ1ZlB0ciArPTI7CisJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAwOworCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKIAotCS8vcFNhdmVCdWZQdHIgPSBwSGVhZGVyQnVmUHRyOworCS8qcFNhdmVCdWZQdHIgPSBwSGVhZGVyQnVmUHRyOyAqLwogCi0JLy8KLQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKLQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKLQkvLwotCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAotCS8vCi0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKwkvKiAqLworCS8qIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlciAqLworCS8qIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudCAqLworCS8qICovCisJLyogQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBAICovCisJLyogKi8KKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlckJ1ZlB0ciA9ICh1OCAqKVJPVU5EX1VQKHBIZWFkZXJCdWZQdHIsIDQpOworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7CiAKIAlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKIAogfQogCi0KLVZPSUQgU1RBX0FNUERVX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCit2b2lkIFNUQV9BTVBEVV9GcmFtZV9UeChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaykKIHsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnk7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExICpwSGVhZGVyXzgwMl8xMTsKKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwl1MTYgRnJlZU51bWJlcjsKKwlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwTWFjRW50cnk7CisJQk9PTEVBTiBiVkxBTlBrdDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBRRW50cnk7CiAKIAlBU1NFUlQocFR4QmxrKTsKIAotCXdoaWxlKHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCi0JeworCXdoaWxlIChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKSB7CiAJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKIAkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCQlpZiAoIFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpIHsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisJCWJWTEFOUGt0ID0KKwkJICAgIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKIAogCQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCi0JCXsKLQkJCS8vIE5PVEU6IFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNpemUgb2YgcE1hY0VudHJ5LT5DYWNoZWRCdWZbXSBpcyBzbWFsbGVyIHRoYW4gcFR4QmxrLT5IZWFkZXJCdWZbXSEhISEKLQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSwgKFBVQ0hBUikmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sIFRYV0lfU0laRSArIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXSk7CisJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkKSB7CisJCQkvKiBOT1RFOiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaXplIG9mIHBNYWNFbnRyeS0+Q2FjaGVkQnVmW10gaXMgc21hbGxlciB0aGFuIHBUeEJsay0+SGVhZGVyQnVmW10hICovCisJCQlOZGlzTW92ZU1lbW9yeSgodTggKikmIHBUeEJsay0+CisJCQkJICAgICAgIEhlYWRlckJ1ZltUWElORk9fU0laRV0sCisJCQkJICAgICAgICh1OCAqKSYgcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0sCisJCQkJICAgICAgIFRYV0lfU0laRSArIHNpemVvZihzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSkpOworCQkJcEhlYWRlckJ1ZlB0ciA9CisJCQkgICAgKHU4ICopKCZwVHhCbGstPgorCQkJCSAgICAgIEhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV0pOwogCQkJU1RBQnVpbGRDYWNoZTgwMl8xMUhlYWRlcihwQWQsIHBUeEJsaywgcEhlYWRlckJ1ZlB0cik7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKIAkJCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKIAotCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07CisJCQlwSGVhZGVyQnVmUHRyID0KKwkJCSAgICAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwogCQl9CiAKKwkJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKIAotCQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7Ci0KLQkJLy8gc2tpcCBjb21tb24gaGVhZGVyCisJCS8qIHNraXAgY29tbW9uIGhlYWRlciAqLwogCQlwSGVhZGVyQnVmUHRyICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKIAotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLworCQkvKiAqLworCQkvKiBidWlsZCBRT1MgQ29udHJvbCBieXRlcyAqLworCQkvKiAqLwogCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCi0JCS8vCi0JCS8vIGJ1aWxkIEhUQysKLQkJLy8gSFRDIGNvbnRyb2wgZmlsZWQgZm9sbG93aW5nIFFvUyBmaWVsZAotCQkvLwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocFR4QmxrLT5wTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKLQkJewotCQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJLy8gbWFyayBIVEMgYml0CisJCS8qICovCisJCS8qIGJ1aWxkIEhUQysgKi8KKwkJLyogSFRDIGNvbnRyb2wgZmlsZWQgZm9sbG93aW5nIFFvUyBmaWVsZCAqLworCQkvKiAqLworCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPT0gVFJVRSkKKwkJICAgICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBUeEJsay0+cE1hY0VudHJ5LAorCQkJCQkgICAgICAgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUpKSB7CisJCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCA9PSBGQUxTRSkgeworCQkJCS8qIG1hcmsgSFRDIGJpdCAqLwogCQkJCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7CiAKIAkJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCA0KTsKLQkJCQkqKHBIZWFkZXJCdWZQdHIrMykgfD0gMHg4MDsKKwkJCQkqKHBIZWFkZXJCdWZQdHIgKyAzKSB8PSAweDgwOwogCQkJfQogCQkJcEhlYWRlckJ1ZlB0ciArPSA0OwogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDQ7CiAJCX0KLQotCQkvL3BUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhlYWRlckJ1ZiAtIFRYV0lfU0laRSAtIFRYSU5GT19TSVpFOworCQkvKnBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhlYWRlckJ1ZiAtIFRYV0lfU0laRSAtIFRYSU5GT19TSVpFOyAqLwogCQlBU1NFUlQocFR4QmxrLT5NcGR1SGVhZGVyTGVuID49IDI0KTsKIAotCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQkvKiBza2lwIDgwMi4zIGhlYWRlciAqLwogCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzM7CiAKLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCS8qIHNraXAgdmxhbiB0YWcgKi8KKwkJaWYgKGJWTEFOUGt0KSB7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzFROwogCQl9Ci0KLQkJLy8KLQkJLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JCS8vIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudAotCQkvLwotCQkvLyBAQEAgTXBkdUhlYWRlckxlbiBleGNsdWRpbmcgcGFkZGluZyBAQEAKLQkJLy8KLQkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQkJcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOworCQkvKiAqLworCQkvKiBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIgKi8KKwkJLyogTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50ICovCisJCS8qICovCisJCS8qIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQCAqLworCQkvKiAqLworCQlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKXBIZWFkZXJCdWZQdHI7CisJCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwkJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKIAogCQl7CiAKLQkJCS8vCi0JCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCQkvLwotCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0JCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJLyogKi8KKwkJCS8qIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMgKi8KKwkJCS8qICovCisJCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPgorCQkJCQkJCSAgICBwU3JjQnVmRGF0YSAtIDIsCisJCQkJCQkJICAgIHBUeEJsay0+CisJCQkJCQkJICAgIHBFeHRyYUxsY1NuYXBFbmNhcCk7CisJCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLAorCQkJCQkgICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwogCQkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCQkvLyBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJCSAgICAgICBwVHhCbGstPnBTcmNCdWZEYXRhIC0gMiwgMik7CiAJCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJCX0KIAogCQl9CiAKLQkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpCi0JCXsKLSAgICAgICAgICAgIFJUTVBXcml0ZVR4V0lfQ2FjaGUocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJaWYgKHBNYWNFbnRyeS0+aXNDYWNoZWQpIHsKKwkJCVJUTVBXcml0ZVR4V0lfQ2FjaGUocEFkLAorCQkJCQkgICAgKHN0cnVjdCBydF90eHdpICopICgmcFR4QmxrLT4KKwkJCQkJCQkgICBIZWFkZXJCdWYKKwkJCQkJCQkgICBbVFhJTkZPX1NJWkVdKSwKKwkJCQkJICAgIHBUeEJsayk7CisJCX0gZWxzZSB7CisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLAorCQkJCQkgICAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPgorCQkJCQkJCSAgSGVhZGVyQnVmCisJCQkJCQkJICBbVFhJTkZPX1NJWkVdKSwKKwkJCQkJICAgcFR4QmxrKTsKIAotCQkJTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBNYWNFbnRyeS0+Q2FjaGVkQnVmWzBdKSwgc2l6ZW9mKHBNYWNFbnRyeS0+Q2FjaGVkQnVmKSk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgKHBIZWFkZXJCdWZQdHIgLSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSkpOworCQkJTmRpc1plcm9NZW1vcnkoKHU4ICopKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksCisJCQkJICAgICAgIHNpemVvZihwTWFjRW50cnktPkNhY2hlZEJ1ZikpOworCQkJTmRpc01vdmVNZW1vcnkoKHU4ICopKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksCisJCQkJICAgICAgICh1OCAqKSgmcFR4QmxrLT4KKwkJCQkJCSBIZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwKKwkJCQkgICAgICAgKHBIZWFkZXJCdWZQdHIgLQorCQkJCQkodTggKikoJnBUeEJsay0+CisJCQkJCQkgIEhlYWRlckJ1ZltUWElORk9fU0laRV0pKSk7CiAJCQlwTWFjRW50cnktPmlzQ2FjaGVkID0gVFJVRTsKIAkJfQogCi0JCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50CisJCS8qIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50ICovCiAJCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51Lkxvd1BhcnQgKys7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50LlF1YWRQYXJ0ICs9IHBUeEJsay0+U3JjQnVmTGVuOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE1QRFVzSW5BTVBEVUNvdW50LnUuCisJCQkgICAgTG93UGFydCsrOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1QRFVDb3VudC4KKwkJCSAgICBRdWFkUGFydCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKIAkJfQogCi0JCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkJLypGcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOyAqLwogCiAJCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKIAotCQkvLwotCQkvLyBLaWNrIG91dCBUeAotCQkvLwotI2lmZGVmIFJUMjg2MAorCQkvKiAqLworCQkvKiBLaWNrIG91dCBUeCAqLworCQkvKiAqLwogCQlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLSNlbmRpZgogCQkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwogCiAJCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKQEAgLTE4MDEsMTE4ICsxODE5LDEyNCBAQAogCiB9CiAKLQotVk9JRCBTVEFfQU1TRFVfRnJhbWVfVHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKK3ZvaWQgU1RBX0FNU0RVX0ZyYW1lX1R4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVU0hPUlQJCQlzdWJGcmFtZVBheWxvYWRMZW4gPSAwOwkvLyBBTVNEVSBTdWJmcmFtZSBsZW5ndGggd2l0aG91dCBBTVNEVS1IZWFkZXIgLyBQYWRkaW5nLgotCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKLQlVQ0hBUgkJCSpzdWJGcmFtZUhlYWRlcjsKLQlVQ0hBUgkJCXBhZGRpbmcgPSAwOwotCVVTSE9SVAkJCUZpcnN0VHggPSAwLCBMYXN0VHhJZHggPSAwOwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlpbnQgCQkJZnJhbWVOdW0gPSAwOwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCisJdTggKnBIZWFkZXJCdWZQdHI7CisJdTE2IEZyZWVOdW1iZXI7CisJdTE2IHN1YkZyYW1lUGF5bG9hZExlbiA9IDA7CS8qIEFNU0RVIFN1YmZyYW1lIGxlbmd0aCB3aXRob3V0IEFNU0RVLUhlYWRlciAvIFBhZGRpbmcuICovCisJdTE2IHRvdGFsTVBEVVNpemUgPSAwOworCXU4ICpzdWJGcmFtZUhlYWRlcjsKKwl1OCBwYWRkaW5nID0gMDsKKwl1MTYgRmlyc3RUeCA9IDAsIExhc3RUeElkeCA9IDA7CisJQk9PTEVBTiBiVkxBTlBrdDsKKwlpbnQgZnJhbWVOdW0gPSAwOworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAogCUFTU0VSVChwVHhCbGspOwogCiAJQVNTRVJUKChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPiAxKSk7CiAKLQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQotCXsKKwl3aGlsZSAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkgewogCQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJCXBUeEJsay0+cFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwUUVudHJ5KTsKLQkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CisJCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpIHsKKwkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsCisJCQkJCSAgICBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CisJCWJWTEFOUGt0ID0KKwkJICAgIChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKIAotCQkvLyBza2lwIDgwMi4zIGhlYWRlcgorCQkvKiBza2lwIDgwMi4zIGhlYWRlciAqLwogCQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCQlwVHhCbGstPlNyY0J1ZkxlbiAgLT0gTEVOR1RIXzgwMl8zOworCQlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzM7CiAKLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJCS8qIHNraXAgdmxhbiB0YWcgKi8KKwkJaWYgKGJWTEFOUGt0KSB7CisJCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IExFTkdUSF84MDJfMVE7CisJCQlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzFROwogCQl9CiAKLQkJaWYgKGZyYW1lTnVtID09IDApCi0JCXsKLQkJCXBIZWFkZXJCdWZQdHIgPSBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKHBBZCwgcFR4QmxrKTsKKwkJaWYgKGZyYW1lTnVtID09IDApIHsKKwkJCXBIZWFkZXJCdWZQdHIgPQorCQkJICAgIFNUQV9CdWlsZF9BTVNEVV9GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOwogCi0JCQkvLyBOT1RFOiBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQkJfQotCQllbHNlCi0JCXsKKwkJCS8qIE5PVEU6IFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuICovCisJCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLAorCQkJCQkgICAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPgorCQkJCQkJCSAgSGVhZGVyQnVmCisJCQkJCQkJICBbVFhJTkZPX1NJWkVdKSwKKwkJCQkJICAgcFR4QmxrKTsKKwkJfSBlbHNlIHsKIAkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbMF07Ci0JCQlwYWRkaW5nID0gUk9VTkRfVVAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbiwgNCkgLSAoTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHN1YkZyYW1lUGF5bG9hZExlbik7Ci0JCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCBwYWRkaW5nICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCk7CisJCQlwYWRkaW5nID0KKwkJCSAgICBST1VORF9VUChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsKKwkJCQkgICAgIHN1YkZyYW1lUGF5bG9hZExlbiwKKwkJCQkgICAgIDQpIC0gKExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKworCQkJCQkgICBzdWJGcmFtZVBheWxvYWRMZW4pOworCQkJTmRpc1plcm9NZW1vcnkocEhlYWRlckJ1ZlB0ciwKKwkJCQkgICAgICAgcGFkZGluZyArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSBwYWRkaW5nOwogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gcGFkZGluZzsKIAkJfQogCi0JCS8vCi0JCS8vIEEtTVNEVSBzdWJmcmFtZQotCQkvLyAgIERBKDYpK1NBKDYpK0xlbmd0aCgyKSArIExMQy9TTkFQIEVuY2FwCi0JCS8vCisJCS8qICovCisJCS8qIEEtTVNEVSBzdWJmcmFtZSAqLworCQkvKiAgIERBKDYpK1NBKDYpK0xlbmd0aCgyKSArIExMQy9TTkFQIEVuY2FwICovCisJCS8qICovCiAJCXN1YkZyYW1lSGVhZGVyID0gcEhlYWRlckJ1ZlB0cjsKIAkJc3ViRnJhbWVQYXlsb2FkTGVuID0gcFR4QmxrLT5TcmNCdWZMZW47CiAKIAkJTmRpc01vdmVNZW1vcnkoc3ViRnJhbWVIZWFkZXIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgMTIpOwogCi0KIAkJcEhlYWRlckJ1ZlB0ciArPSBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwogCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKIAotCi0JCS8vCi0JCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkJLy8KLQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7CisJCS8qICovCisJCS8qIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMgKi8KKwkJLyogKi8KKwkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YSAtIDIsCisJCQkJCQkgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwogCiAJCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOwogCi0JCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJICAgICAgIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gNjsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKKwkJCS8qIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKSAqLworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YSAtIDIsCisJCQkJICAgICAgIDIpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOwogCQkJc3ViRnJhbWVQYXlsb2FkTGVuICs9IExFTkdUSF84MDJfMV9IOwogCQl9Ci0KLQkJLy8gdXBkYXRlIHN1YkZyYW1lIExlbmd0aCBmaWVsZAorCQkvKiB1cGRhdGUgc3ViRnJhbWUgTGVuZ3RoIGZpZWxkICovCiAJCXN1YkZyYW1lSGVhZGVyWzEyXSA9IChzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGMDApID4+IDg7CiAJCXN1YkZyYW1lSGVhZGVyWzEzXSA9IHN1YkZyYW1lUGF5bG9hZExlbiAmIDB4RkY7CiAKIAkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKIAotCQlpZiAoZnJhbWVOdW0gPT0wKQotCQkJRmlyc3RUeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJaWYgKGZyYW1lTnVtID09IDApCisJCQlGaXJzdFR4ID0KKwkJCSAgICBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLAorCQkJCQkJICAgICAmRnJlZU51bWJlcik7CiAJCWVsc2UKLQkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJCUxhc3RUeElkeCA9CisJCQkgICAgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwKKwkJCQkJCSAgICAgJkZyZWVOdW1iZXIpOwogCiAJCWZyYW1lTnVtKys7CiAKIAkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwogCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7CiAKLQkJLy8gY2FsY3VsYXRlIFRyYW5zbWl0dGVkIEFNU0RVIENvdW50IGFuZCBCeXRlQ291bnQKKwkJLyogY2FsY3VsYXRlIFRyYW5zbWl0dGVkIEFNU0RVIENvdW50IGFuZCBCeXRlQ291bnQgKi8KIAkJewotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEFNU0RVQ291bnQudS5Mb3dQYXJ0ICsrOwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1TRFUuUXVhZFBhcnQgKz0gdG90YWxNUERVU2l6ZTsKKwkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVNEVUNvdW50LnUuTG93UGFydCsrOworCQkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZE9jdGV0c0luQU1TRFUuUXVhZFBhcnQgKz0KKwkJCSAgICB0b3RhbE1QRFVTaXplOwogCQl9CiAKIAl9CkBAIC0xOTIwLDM4ICsxOTQ0LDMxIEBACiAJSEFMX0ZpbmFsV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCB0b3RhbE1QRFVTaXplLCBGaXJzdFR4KTsKIAlIQUxfTGFzdFR4SWR4KHBBZCwgcFR4QmxrLT5RdWVJZHgsIExhc3RUeElkeCk7CiAKLQkvLwotCS8vIEtpY2sgb3V0IFR4Ci0JLy8KLSNpZmRlZiBSVDI4NjAKKwkvKiAqLworCS8qIEtpY2sgb3V0IFR4ICovCisJLyogKi8KIAlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKSkKLSNlbmRpZgogCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CiB9CiAKLVZPSUQgU1RBX0xlZ2FjeV9GcmFtZV9UeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQordm9pZCBTVEFfTGVnYWN5X0ZyYW1lX1R4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOworCXU4ICpwSGVhZGVyQnVmUHRyOworCXUxNiBGcmVlTnVtYmVyOworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwUUVudHJ5OwogCiAJQVNTRVJUKHBUeEJsayk7CiAKLQogCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKIAlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7Ci0JaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQl7CisJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkgewogCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX01DQVNUX0ZSQU1FKQotCXsKKwlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9NQ0FTVF9GUkFNRSkgewogCQlJTkNfQ09VTlRFUjY0KHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudCk7CiAJfQogCkBAIC0xOTY4LDE4MSArMTk4NSwxODcgQEAKIAlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKIAlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CiAKLQotCS8vIHNraXAgODAyLjMgaGVhZGVyCisJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7CisJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0JLy8gc2tpcCB2bGFuIHRhZwotCWlmIChiVkxBTlBrdCkKLQl7Ci0JCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKKwkvKiBza2lwIHZsYW4gdGFnICovCisJaWYgKGJWTEFOUGt0KSB7CisJCXBUeEJsay0+cFNyY0J1ZkRhdGEgKz0gTEVOR1RIXzgwMl8xUTsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAl9CiAKIAlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7CisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKIAotCS8vIHNraXAgY29tbW9uIGhlYWRlcgorCS8qIHNraXAgY29tbW9uIGhlYWRlciAqLwogCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwogCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKKwlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgeworCQkvKiAqLworCQkvKiBidWlsZCBRT1MgQ29udHJvbCBieXRlcyAqLworCQkvKiAqLworCQkqKHBIZWFkZXJCdWZQdHIpID0KKwkJICAgICgocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKSB8IChwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCSAgICAgIEFja1BvbGljeVtwVHhCbGstPgorCQkJCQkJCQlRdWVJZHhdIDw8IDUpKTsKKwkJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCX0KLQotCS8vIFRoZSByZW1haW5pbmcgY29udGVudCBvZiBNUERVIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKKwkvKiBUaGUgcmVtYWluaW5nIGNvbnRlbnQgb2YgTVBEVSBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudCAqLworCXBUeEJsay0+SGRyUGFkTGVuID0gKHVuc2lnbmVkIGxvbmcpcEhlYWRlckJ1ZlB0cjsKKwlwSGVhZGVyQnVmUHRyID0gKHU4ICopUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7CisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKIAogCXsKIAotCQkvLwotCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCS8vCi0JCS8vCi0gICAJCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAotCQkvLyB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkCi0JCS8vCi0JCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0JCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJewotCQkJVUNIQVIgdmxhbl9zaXplOworCQkvKiAqLworCQkvKiBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzICovCisJCS8qICovCisJCS8qICovCisJCS8qIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLCAqLworCQkvKiB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkICovCisJCS8qICovCisJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLAorCQkJCQkJICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApIHsKKwkJCXU4IHZsYW5fc2l6ZTsKIAotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwKKwkJCQkgICAgICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwogCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJLy8gc2tpcCB2bGFuIHRhZwotCQkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKzEyK3ZsYW5fc2l6ZSwgMik7CisJCQkvKiBza2lwIHZsYW4gdGFnICovCisJCQl2bGFuX3NpemUgPSAoYlZMQU5Qa3QpID8gTEVOR1RIXzgwMl8xUSA6IDA7CisJCQkvKiBnZXQgMiBvY3RldHMgKFR5cGVvZkxlbikgKi8KKwkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJICAgICAgIHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIDEyICsgdmxhbl9zaXplLAorCQkJCSAgICAgICAyKTsKIAkJCXBIZWFkZXJCdWZQdHIgKz0gMjsKIAkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAkJfQogCiAJfQogCi0JLy8KLQkvLyBwcmVwYXJlIGZvciBUWFdJCi0JLy8gdXNlIFdjaWQgYXMgS2V5IEluZGV4Ci0JLy8KKwkvKiAqLworCS8qIHByZXBhcmUgZm9yIFRYV0kgKi8KKwkvKiB1c2UgV2NpZCBhcyBLZXkgSW5kZXggKi8KKwkvKiAqLwogCi0JUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoc3RydWN0IHJ0X3R4d2kgKikgKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLAorCQkJICAgcFR4QmxrKTsKIAotCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKKwkvKkZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7ICovCiAKIAlIQUxfV3JpdGVUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBUUlVFLCAmRnJlZU51bWJlcik7CiAKIAlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CiAJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwogCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0jaWZkZWYgUlQyODYwCisJLyogKi8KKwkvKiBLaWNrIG91dCBUeCAqLworCS8qICovCiAJaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0jZW5kaWYKIAkJSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwogfQogCi0KLVZPSUQgU1RBX0FSYWxpbmtfRnJhbWVfVHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKK3ZvaWQgU1RBX0FSYWxpbmtfRnJhbWVfVHgoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfdHhfYmxrICpwVHhCbGspCiB7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKLQlVU0hPUlQJCQlGaXJzdFR4LCBMYXN0VHhJZHg7Ci0JaW50IAkJCWZyYW1lTnVtID0gMDsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KKwl1OCAqcEhlYWRlckJ1ZlB0cjsKKwl1MTYgRnJlZU51bWJlcjsKKwl1MTYgdG90YWxNUERVU2l6ZSA9IDA7CisJdTE2IEZpcnN0VHgsIExhc3RUeElkeDsKKwlpbnQgZnJhbWVOdW0gPSAwOworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwUUVudHJ5OwogCiAJQVNTRVJUKHBUeEJsayk7CiAKLQlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcj09IDIpKTsKKwlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAyKSk7CiAKLQotCUZpcnN0VHggPSBMYXN0VHhJZHggPSAwOyAgLy8gSXMgaXQgb2sgaW5pdCB0aGV5IGFzIDA/Ci0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7CisJRmlyc3RUeCA9IExhc3RUeElkeCA9IDA7CS8qIElzIGl0IG9rIGluaXQgdGhleSBhcyAwPyAqLworCXdoaWxlIChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKSB7CiAJCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKIAkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwogCi0JCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOworCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKSB7CisJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LAorCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOworCQliVkxBTlBrdCA9CisJCSAgICAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7CiAKLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkJLyogc2tpcCA4MDIuMyBoZWFkZXIgKi8KIAkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKwkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8zOwogCi0JCS8vIHNraXAgdmxhbiB0YWcKLQkJaWYgKGJWTEFOUGt0KQotCQl7Ci0JCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROworCQkvKiBza2lwIHZsYW4gdGFnICovCisJCWlmIChiVkxBTlBrdCkgeworCQkJcFR4QmxrLT5wU3JjQnVmRGF0YSArPSBMRU5HVEhfODAyXzFROworCQkJcFR4QmxrLT5TcmNCdWZMZW4gLT0gTEVOR1RIXzgwMl8xUTsKIAkJfQogCi0JCWlmIChmcmFtZU51bSA9PSAwKQotCQl7CS8vIEZvciBmaXJzdCBmcmFtZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgKyBwYWRkaW5nKG9wdGlvbmFsKSArIFJBLUFHRy1MRU4gKyBTTkFQIEhlYWRlcgorCQlpZiAoZnJhbWVOdW0gPT0gMCkgewkvKiBGb3IgZmlyc3QgZnJhbWUsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyICsgcGFkZGluZyhvcHRpb25hbCkgKyBSQS1BR0ctTEVOICsgU05BUCBIZWFkZXIgKi8KIAotCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7CisJCQlwSGVhZGVyQnVmUHRyID0KKwkJCSAgICBTVEFfQnVpbGRfQVJhbGlua19GcmFtZV9IZWFkZXIocEFkLCBwVHhCbGspOwogCi0JCQkvLyBJdCdzIG9rIHdyaXRlIHRoZSBUeFdJIGhlcmUsIGJlY2F1c2UgdGhlIFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAotCQkJLy8Jd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGZpbmFsIGZyYW1lIHdhcyBoYW5kbGVkLgotCQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKKwkJCS8qIEl0J3Mgb2sgd3JpdGUgdGhlIFR4V0kgaGVyZSwgYmVjYXVzZSB0aGUgVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ICovCisJCQkvKiAgICAgIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBmaW5hbCBmcmFtZSB3YXMgaGFuZGxlZC4gKi8KKwkJCVJUTVBXcml0ZVR4V0lfRGF0YShwQWQsCisJCQkJCSAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+CisJCQkJCQkJICBIZWFkZXJCdWYKKwkJCQkJCQkgIFtUWElORk9fU0laRV0pLAorCQkJCQkgICBwVHhCbGspOwogCisJCQkvKiAqLworCQkJLyogSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cyAqLworCQkJLyogKi8KKwkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+CisJCQkJCQkJICAgIHBTcmNCdWZEYXRhIC0gMiwKKwkJCQkJCQkgICAgcFR4QmxrLT4KKwkJCQkJCQkgICAgcEV4dHJhTGxjU25hcEVuY2FwKTsKIAotCQkJLy8KLQkJCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkJCS8vCi0JCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX09GRlNFVChwVHhCbGstPnBTcmNCdWZEYXRhLTIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQotCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKKwkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkJCSAgICAgICBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7CiAJCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7CisJCQkJLyogZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pICovCisJCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwKKwkJCQkJICAgICAgIHBUeEJsay0+cFNyY0J1ZkRhdGEgLSAyLCAyKTsKIAkJCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJewkvLyBGb3Igc2Vjb25kIGFnZ3JlZ2F0ZWQgZnJhbWUsIHdlIG5lZWQgY3JlYXRlIHRoZSA4MDIuMyBoZWFkZXIgdG8gaGVhZGVyQnVmLCBiZWNhdXNlIFBDSSB3aWxsIGNvcHkgaXQgdG8gU0RQdHIwLgorCQl9IGVsc2UgewkvKiBGb3Igc2Vjb25kIGFnZ3JlZ2F0ZWQgZnJhbWUsIHdlIG5lZWQgY3JlYXRlIHRoZSA4MDIuMyBoZWFkZXIgdG8gaGVhZGVyQnVmLCBiZWNhdXNlIFBDSSB3aWxsIGNvcHkgaXQgdG8gU0RQdHIwLiAqLwogCiAJCQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmWzBdOwogCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gMDsKIAotCQkJLy8gQS1SYWxpbmsgc3ViLXNlcXVlbnQgZnJhbWUgaGVhZGVyIGlzIHRoZSBzYW1lIGFzIDgwMi4zIGhlYWRlci4KLQkJCS8vICAgREEoNikrU0EoNikrRnJhbWVUeXBlKDIpCi0JCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKKwkJCS8qIEEtUmFsaW5rIHN1Yi1zZXF1ZW50IGZyYW1lIGhlYWRlciBpcyB0aGUgc2FtZSBhcyA4MDIuMyBoZWFkZXIuICovCisJCQkvKiAgIERBKDYpK1NBKDYpK0ZyYW1lVHlwZSgyKSAqLworCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLAorCQkJCSAgICAgICAxMik7CiAJCQlwSGVhZGVyQnVmUHRyICs9IDEyOwotCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOworCQkJLyogZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pICovCisJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhIC0gMiwKKwkJCQkgICAgICAgMik7CiAJCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQ7CiAJCX0KIAogCQl0b3RhbE1QRFVTaXplICs9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwogCi0JCS8vRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJaWYgKGZyYW1lTnVtID09MCkKLQkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7CisJCS8qRnJlZU51bWJlciA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsgKi8KKwkJaWYgKGZyYW1lTnVtID09IDApCisJCQlGaXJzdFR4ID0KKwkJCSAgICBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLAorCQkJCQkJICAgICAmRnJlZU51bWJlcik7CiAJCWVsc2UKLQkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKKwkJCUxhc3RUeElkeCA9CisJCQkgICAgSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwKKwkJCQkJCSAgICAgJkZyZWVOdW1iZXIpOwogCiAJCWZyYW1lTnVtKys7CiAKQEAgLTIxNTUsNDAgKzIxNzgsMzQgQEAKIAlIQUxfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIEZpcnN0VHgpOwogCUhBTF9MYXN0VHhJZHgocEFkLCBwVHhCbGstPlF1ZUlkeCwgTGFzdFR4SWR4KTsKIAotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotI2lmZGVmIFJUMjg2MAorCS8qICovCisJLyogS2ljayBvdXQgVHggKi8KKwkvKiAqLwogCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotI2VuZGlmCiAJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKIAogfQogCi0KLVZPSUQgU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKK3ZvaWQgU1RBX0ZyYWdtZW50X0ZyYW1lX1R4KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3R4X2JsayAqcFR4QmxrKQogewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVQ0hBUiAJCQlmcmFnTnVtID0gMDsKLQlQQUNLRVRfSU5GTwkJUGFja2V0SW5mbzsKLQlVU0hPUlQJCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOwotCVVJTlQzMgkJCUZyZWVNcGR1U2l6ZSwgU3JjUmVtYWluaW5nQnl0ZXM7Ci0JVVNIT1JUCQkJQWNrRHVyYXRpb247Ci0JVUlOVCAJCQlOZXh0TXBkdVNpemU7Ci0JQk9PTEVBTgkJCWJWTEFOUGt0OwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKnBIZWFkZXJfODAyXzExOworCXU4ICpwSGVhZGVyQnVmUHRyOworCXUxNiBGcmVlTnVtYmVyOworCXU4IGZyYWdOdW0gPSAwOworCXN0cnVjdCBydF9wYWNrZXRfaW5mbyBQYWNrZXRJbmZvOworCXUxNiBFbmNyeXB0aW9uT3ZlcmhlYWQgPSAwOworCXUzMiBGcmVlTXBkdVNpemUsIFNyY1JlbWFpbmluZ0J5dGVzOworCXUxNiBBY2tEdXJhdGlvbjsKKwl1MzIgTmV4dE1wZHVTaXplOworCUJPT0xFQU4gYlZMQU5Qa3Q7CisJc3RydWN0IHJ0X3F1ZXVlX2VudHJ5ICpwUUVudHJ5OworCUhUVFJBTlNNSVRfU0VUVElORyAqcFRyYW5zbWl0OwogCiAJQVNTRVJUKHBUeEJsayk7CiAKIAlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7CiAJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JeworCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpIHsKIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCXJldHVybjsKIAl9CkBAIC0yMTk5LDExMiArMjIxNiwxMjUgQEAKIAlTVEFGaW5kQ2lwaGVyQWxnb3JpdGhtKHBBZCwgcFR4QmxrKTsKIAlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7CiAKLQlpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JewotCQlwVHhCbGstPnBQYWNrZXQgPSBkdXBsaWNhdGVfcGt0X3dpdGhfVEtJUF9NSUMocEFkLCBwVHhCbGstPnBQYWNrZXQpOworCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgeworCQlwVHhCbGstPnBQYWNrZXQgPQorCQkgICAgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKHBBZCwgcFR4QmxrLT5wUGFja2V0KTsKIAkJaWYgKHBUeEJsay0+cFBhY2tldCA9PSBOVUxMKQogCQkJcmV0dXJuOwotCQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwVHhCbGstPnBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAmcFR4QmxrLT5TcmNCdWZMZW4pOworCQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwVHhCbGstPnBQYWNrZXQsICZQYWNrZXRJbmZvLAorCQkJCSAgICAgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCQkgICAgICZwVHhCbGstPlNyY0J1Zkxlbik7CiAJfQotCi0JLy8gc2tpcCA4MDIuMyBoZWFkZXIKKwkvKiBza2lwIDgwMi4zIGhlYWRlciAqLwogCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKKwlwVHhCbGstPlNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzM7CiAKLQotCS8vIHNraXAgdmxhbiB0YWcKLQlpZiAoYlZMQU5Qa3QpCi0JewotCQlwVHhCbGstPnBTcmNCdWZEYXRhCSs9IExFTkdUSF84MDJfMVE7Ci0JCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7CisJLyogc2tpcCB2bGFuIHRhZyAqLworCWlmIChiVkxBTlBrdCkgeworCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IExFTkdUSF84MDJfMVE7CisJCXBUeEJsay0+U3JjQnVmTGVuIC09IExFTkdUSF84MDJfMVE7CiAJfQogCiAJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKXBIZWFkZXJCdWZQdHI7CisJcEhlYWRlcl84MDJfMTEgPSAoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKIAotCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCisJLyogc2tpcCBjb21tb24gaGVhZGVyICovCiAJcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47CiAKLQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKLQl7Ci0JCS8vCi0JCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JCS8vCisJaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpIHsKKwkJLyogKi8KKwkJLyogYnVpbGQgUU9TIENvbnRyb2wgYnl0ZXMgKi8KKwkJLyogKi8KIAkJKnBIZWFkZXJCdWZQdHIgPSAocFR4QmxrLT5Vc2VyUHJpb3JpdHkgJiAweDBGKTsKIAotCQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAwOwotCQlwSGVhZGVyQnVmUHRyICs9MjsKKwkJKihwSGVhZGVyQnVmUHRyICsgMSkgPSAwOworCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwogCX0KKwkvKiAqLworCS8qIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlciAqLworCS8qIExMQyBoZWFkZXIgc2hvdWxkIGxvY2F0ZSBhdCA0LW9jdGV0cyBhbGlnbWVudCAqLworCS8qICovCisJcFR4QmxrLT5IZHJQYWRMZW4gPSAodW5zaWduZWQgbG9uZylwSGVhZGVyQnVmUHRyOworCXBIZWFkZXJCdWZQdHIgPSAodTggKilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKKwlwVHhCbGstPkhkclBhZExlbiA9ICh1bnNpZ25lZCBsb25nKShwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZHJQYWRMZW4pOwogCi0JLy8KLQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKLQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKLQkvLwotCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JcEhlYWRlckJ1ZlB0ciA9IChQQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQotCi0JLy8KLQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JLy8KLQkvLwotICAgCS8vIGlmIG9yaWdpbmFsIEV0aGVybmV0IGZyYW1lIGNvbnRhaW5zIG5vIExMQy9TTkFQLAotCS8vIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKLQkvLwotCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfU1RBUlQocFR4QmxrLT5wU3JjQnVmSGVhZGVyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0JaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCXsKLQkJVUNIQVIgdmxhbl9zaXplOworCS8qICovCisJLyogSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cyAqLworCS8qICovCisJLyogKi8KKwkvKiBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwgKi8KKwkvKiB0aGVuIGFuIGV4dHJhIExMQy9TTkFQIGVuY2FwIGlzIHJlcXVpcmVkICovCisJLyogKi8KKwlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwKKwkJCQkJICAgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOworCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkgeworCQl1OCB2bGFuX3NpemU7CiAKIAkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwogCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCS8vIHNraXAgdmxhbiB0YWcKLQkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKLQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOworCQkvKiBza2lwIHZsYW4gdGFnICovCisJCXZsYW5fc2l6ZSA9IChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKKwkJLyogZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pICovCisJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsCisJCQkgICAgICAgcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgMTIgKyB2bGFuX3NpemUsIDIpOwogCQlwSGVhZGVyQnVmUHRyICs9IDI7CiAJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKIAl9CiAKKwkvKiBJZiBUS0lQIGlzIHVzZWQgYW5kIGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQuIERyaXZlciBoYXMgdG8gKi8KKwkvKiAgICAgIGFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlciAqLworCS8qICAgICAgTUFDIEFTSUMgd2lsbCBvbmx5IHBlcmZvcm0gSVYvRUlWL0lDViBpbnNlcnRpb24gYnV0IG5vIFRLSVAgTUlDICovCisJaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB7CisJCVJUTVBDYWxjdWxhdGVNSUNWYWx1ZShwQWQsIHBUeEJsay0+cFBhY2tldCwKKwkJCQkgICAgICBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgcFR4QmxrLT5wS2V5LAorCQkJCSAgICAgIDApOwogCi0JLy8gSWYgVEtJUCBpcyB1c2VkIGFuZCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLiBEcml2ZXIgaGFzIHRvCi0JLy8JYXBwZW5kIFRLSVAgTUlDIGF0IHRhaWwgb2YgdGhlIHNjYXR0ZXIgYnVmZmVyCi0JLy8JTUFDIEFTSUMgd2lsbCBvbmx5IHBlcmZvcm0gSVYvRUlWL0lDViBpbnNlcnRpb24gYnV0IG5vIFRLSVAgTUlDCi0JaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQotCXsKLQotCQkvLyBOT1RFOiBET04nVCByZWZlciB0aGUgc2tiLT5sZW4gZGlyZWN0bHkgYWZ0ZXIgZm9sbG93aW5nIGNvcHkuIEJlY2FzdWUgdGhlIGxlbmd0aCBpcyBub3QgYWRqdXN0Ci0JCS8vCQkJdG8gY29ycmVjdCBsZW5naHQsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuCi0JCU5kaXNNb3ZlTWVtb3J5KHBUeEJsay0+cFNyY0J1ZkRhdGEgKyBwVHhCbGstPlNyY0J1ZkxlbiwgJnBBZC0+UHJpdmF0ZUluZm8uVHguTUlDWzBdLCA4KTsKLQkJLy9za2JfcHV0KChSVFBLVF9UT19PU1BLVChwVHhCbGstPnBQYWNrZXQpKS0+dGFpbCwgOCk7CisJCS8qIE5PVEU6IERPTidUIHJlZmVyIHRoZSBza2ItPmxlbiBkaXJlY3RseSBhZnRlciBmb2xsb3dpbmcgY29weS4gQmVjYXN1ZSB0aGUgbGVuZ3RoIGlzIG5vdCBhZGp1c3QgKi8KKwkJLyogICAgICAgICAgICAgICAgICAgICAgdG8gY29ycmVjdCBsZW5naHQsIHJlZmVyIHRvIHBUeEJsay0+U3JjQnVmTGVuIGZvciB0aGUgcGFja2V0IGxlbmd0aCBpbiBmb2xsb3dpbmcgcHJvZ3Jlc3MuICovCisJCU5kaXNNb3ZlTWVtb3J5KHBUeEJsay0+cFNyY0J1ZkRhdGEgKyBwVHhCbGstPlNyY0J1ZkxlbiwKKwkJCSAgICAgICAmcEFkLT5Qcml2YXRlSW5mby5UeC5NSUNbMF0sIDgpOworCQkvKnNrYl9wdXQoKFJUUEtUX1RPX09TUEtUKHBUeEJsay0+cFBhY2tldCkpLT50YWlsLCA4KTsgKi8KIAkJcFR4QmxrLT5TcmNCdWZMZW4gKz0gODsKIAkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IDg7CiAJCXBUeEJsay0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVBfTk9fTUlDOwogCX0KLQotCS8vCi0JLy8gY2FsY3VhdGUgdGhlIG92ZXJoZWFkIGJ5dGVzIHRoYXQgZW5jcnlwdGlvbiBhbGdvcml0aG0gbWF5IGFkZC4gVGhpcwotCS8vIGFmZmVjdHMgdGhlIGNhbGN1bGF0ZSBvZiAiZHVyYXRpb24iIGZpZWxkCi0JLy8KLQlpZiAoKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVA2NCkgfHwgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9XRVAxMjgpKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSA4OyAvL1dFUDogSVZbNF0gKyBJQ1ZbNF07CisJLyogKi8KKwkvKiBjYWxjdWF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzICovCisJLyogYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQgKi8KKwkvKiAqLworCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KQorCSAgICB8fCAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkpCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDg7CS8qV0VQOiBJVls0XSArIElDVls0XTsgKi8KIAllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0sIE1JQyB3aWxsIGJlIGFkZGVkIHRvIFRvdGFsUGFja2V0TGVuZ3RoCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOwkvKlRLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdLCBNSUMgd2lsbCBiZSBhZGRlZCB0byBUb3RhbFBhY2tldExlbmd0aCAqLwogCWVsc2UgaWYgKHBUeEJsay0+Q2lwaGVyQWxnID09IENJUEhFUl9US0lQKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAyMDsvL1RLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdICsgTUlDWzhdCisJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDIwOwkvKlRLSVA6IElWWzRdICsgRUlWWzRdICsgSUNWWzRdICsgTUlDWzhdICovCiAJZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTY7CS8vIEFFUzogSVZbNF0gKyBFSVZbNF0gKyBNSUNbOF0KKwkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMTY7CS8qIEFFUzogSVZbNF0gKyBFSVZbNF0gKyBNSUNbOF0gKi8KIAllbHNlCiAJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7CiAKLQkvLyBkZWNpZGUgaG93IG11Y2ggdGltZSBhbiBBQ0svQ1RTIGZyYW1lIHdpbGwgY29uc3VtZSBpbiB0aGUgYWlyCi0JQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW3BUeEJsay0+VHhSYXRlXSwgMTQpOworCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OworCS8qIERlY2lkZSB0aGUgVFggcmF0ZSAqLworCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCisJCXBUeEJsay0+VHhSYXRlID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7CisJZWxzZSBpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKwkJcFR4QmxrLT5UeFJhdGUgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUyArIFJBVEVfRklSU1RfT0ZETV9SQVRFOworCWVsc2UKKwkJcFR4QmxrLT5UeFJhdGUgPSBSQVRFXzZfNTsKIAotCS8vIEluaXQgdGhlIHRvdGFsIHBheWxvYWQgbGVuZ3RoIG9mIHRoaXMgZnJhbWUuCisJLyogZGVjaWRlIGhvdyBtdWNoIHRpbWUgYW4gQUNLL0NUUyBmcmFtZSB3aWxsIGNvbnN1bWUgaW4gdGhlIGFpciAqLworCWlmIChwVHhCbGstPlR4UmF0ZSA8PSBSQVRFX0xBU1RfT0ZETV9SQVRFKQorCQlBY2tEdXJhdGlvbiA9CisJCSAgICBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwKKwkJCQkgICAgIHBBZC0+Q29tbW9uQ2ZnLkV4cGVjdGVkQUNLUmF0ZVtwVHhCbGstPgorCQkJCQkJCQkgICAgVHhSYXRlXSwKKwkJCQkgICAgIDE0KTsKKwllbHNlCisJCUFja0R1cmF0aW9uID0gUlRNUENhbGNEdXJhdGlvbihwQWQsIFJBVEVfNl81LCAxNCk7CisKKwkvKiBJbml0IHRoZSB0b3RhbCBwYXlsb2FkIGxlbmd0aCBvZiB0aGlzIGZyYW1lLiAqLwogCVNyY1JlbWFpbmluZ0J5dGVzID0gcFR4QmxrLT5TcmNCdWZMZW47CiAKIAlwVHhCbGstPlRvdGFsRnJhZ051bSA9IDB4ZmY7CkBAIC0yMzE1LDI1ICsyMzQ1LDI4IEBACiAKIAkJRnJlZU1wZHVTaXplIC09IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKIAotCQlpZiAoU3JjUmVtYWluaW5nQnl0ZXMgPD0gRnJlZU1wZHVTaXplKQotCQl7CS8vIHRoaXMgaXMgdGhlIGxhc3Qgb3Igb25seSBmcmFnbWVudAorCQlpZiAoU3JjUmVtYWluaW5nQnl0ZXMgPD0gRnJlZU1wZHVTaXplKSB7CS8qIHRoaXMgaXMgdGhlIGxhc3Qgb3Igb25seSBmcmFnbWVudCAqLwogCiAJCQlwVHhCbGstPlNyY0J1ZkxlbiA9IFNyY1JlbWFpbmluZ0J5dGVzOwogCiAJCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAwOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKKwkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9CisJCQkgICAgcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKIAotCQkJLy8gSW5kaWNhdGUgdGhlIGxvd2VyIGxheWVyIHRoYXQgdGhpcydzIHRoZSBsYXN0IGZyYWdtZW50LgorCQkJLyogSW5kaWNhdGUgdGhlIGxvd2VyIGxheWVyIHRoYXQgdGhpcydzIHRoZSBsYXN0IGZyYWdtZW50LiAqLwogCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSBmcmFnTnVtOwotCQl9Ci0JCWVsc2UKLQkJewkvLyBtb3JlIGZyYWdtZW50IGlzIHJlcXVpcmVkCisJCX0gZWxzZSB7CS8qIG1vcmUgZnJhZ21lbnQgaXMgcmVxdWlyZWQgKi8KIAogCQkJcFR4QmxrLT5TcmNCdWZMZW4gPSBGcmVlTXBkdVNpemU7CiAKLQkJCU5leHRNcGR1U2l6ZSA9IG1pbigoKFVJTlQpU3JjUmVtYWluaW5nQnl0ZXMgLSBwVHhCbGstPlNyY0J1ZkxlbiksICgoVUlOVClwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCkpOworCQkJTmV4dE1wZHVTaXplID0KKwkJCSAgICBtaW4oKCh1MzIpU3JjUmVtYWluaW5nQnl0ZXMgLSBwVHhCbGstPlNyY0J1ZkxlbiksCisJCQkJKCh1MzIpcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKIAkJCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRnJhZyA9IDE7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAoMyAqIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzKSArICgyICogQWNrRHVyYXRpb24pICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIHBUeEJsay0+VHhSYXRlLCBOZXh0TXBkdVNpemUgKyBFbmNyeXB0aW9uT3ZlcmhlYWQpOworCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0KKwkJCSAgICAoMyAqIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzKSArICgyICogQWNrRHVyYXRpb24pICsKKwkJCSAgICBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcFR4QmxrLT5UeFJhdGUsCisJCQkJCSAgICAgTmV4dE1wZHVTaXplICsgRW5jcnlwdGlvbk92ZXJoZWFkKTsKIAkJfQogCiAJCWlmIChmcmFnTnVtID09IDApCkBAIC0yMzQxLDE2ICsyMzc0LDE5IEBACiAJCWVsc2UKIAkJCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfU0lGUzsKIAotCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOworCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLAorCQkJCSAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAoJnBUeEJsay0+CisJCQkJCQkgIEhlYWRlckJ1ZltUWElORk9fU0laRV0pLAorCQkJCSAgIHBUeEJsayk7CiAKIAkJSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sICZGcmVlTnVtYmVyKTsKIAogCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7CiAJCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKIAotCQkvLyBVcGRhdGUgdGhlIGZyYW1lIG51bWJlciwgcmVtYWluaW5nIHNpemUgb2YgdGhlIE5ESVMgcGFja2V0IHBheWxvYWQuCisJCS8qIFVwZGF0ZSB0aGUgZnJhbWUgbnVtYmVyLCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgTkRJUyBwYWNrZXQgcGF5bG9hZC4gKi8KIAotCQkvLyBzcGFjZSBmb3IgODAyLjExIGhlYWRlci4KKwkJLyogc3BhY2UgZm9yIDgwMi4xMSBoZWFkZXIuICovCiAJCWlmIChmcmFnTnVtID09IDAgJiYgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCiAJCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gLT0gTEVOR1RIXzgwMl8xX0g7CiAKQEAgLTIzNTgsMTcgKzIzOTQsMTcgQEAKIAkJU3JjUmVtYWluaW5nQnl0ZXMgLT0gcFR4QmxrLT5TcmNCdWZMZW47CiAJCXBUeEJsay0+cFNyY0J1ZkRhdGEgKz0gcFR4QmxrLT5TcmNCdWZMZW47CiAKLQkJcEhlYWRlcl84MDJfMTEtPkZyYWcrKzsJIC8vIGluY3JlYXNlIEZyYWcgIworCQlwSGVhZGVyXzgwMl8xMS0+RnJhZysrOwkvKiBpbmNyZWFzZSBGcmFnICMgKi8KIAotCX13aGlsZShTcmNSZW1haW5pbmdCeXRlcyA+IDApOworCX0gd2hpbGUgKFNyY1JlbWFpbmluZ0J5dGVzID4gMCk7CiAKLQkvLwotCS8vIEtpY2sgb3V0IFR4Ci0JLy8KLQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7CisJLyogKi8KKwkvKiBLaWNrIG91dCBUeCAqLworCS8qICovCisJaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCisJCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKIH0KIAotCiAjZGVmaW5lIFJFTEVBU0VfRlJBTUVTX09GX1RYQkxLKF9wQWQsIF9wVHhCbGssIF9wUUVudHJ5LCBfU3RhdHVzKSAJCQkJCQkJCQkJXAogCQl3aGlsZShfcFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkJCQkJCQkJCQkJCQkJCVwKIAkJewkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCkBAIC0yMzc2LDcgKzI0MTIsNiBAQAogCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBRVUVVRV9FTlRSWV9UT19QQUNLRVQoX3BRRW50cnkpLCBfU3RhdHVzKTsJXAogCQl9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjM4Nyw3ICsyNDIyLDcgQEAKIAogCUFyZ3VtZW50czoKIAkJcEFkIAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKKwkJdm9pZCAqCVBvaW50ZXIgdG8gb3V0Z29pbmcgTmRpcyBmcmFtZQogCQlOdW1iZXJPZkZyYWcJTnVtYmVyIG9mIGZyYWdtZW50IHJlcXVpcmVkCiAKIAlSZXR1cm4gVmFsdWU6CkBAIC0yMzk5LDEyMiArMjQzNCwxMTcgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIFNUQUhhcmRUcmFuc21pdCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBUWF9CTEsgCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCVF1ZUlkeCkKK2ludCBTVEFIYXJkVHJhbnNtaXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHN0cnVjdCBydF90eF9ibGsgKnBUeEJsaywgdTggUXVlSWR4KQogewotCU5ESVNfUEFDS0VUCQkqcFBhY2tldDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKKwljaGFyICpwUGFja2V0OworCXN0cnVjdCBydF9xdWV1ZV9lbnRyeSAqcFFFbnRyeTsKIAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNURVAgMC4gRE8gU0FOSVRZIENIRUNLIEFORCBTT01FIEVBUkxZIFBSRVBBUkFUSU9OLgotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU1RFUCAwLiBETyBTQU5JVFkgQ0hFQ0sgQU5EIFNPTUUgRUFSTFkgUFJFUEFSQVRJT04uICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogKi8KIAlBU1NFUlQocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKTsKLQlpZiAocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFR4QmxrLT5Ub3RhbEZyYW1lTnVtID09ICVsZCFcbiIsIHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikpOworCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkID09IE5VTEwpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJwVHhCbGstPlRvdGFsRnJhbWVOdW0gPT0gJWxkIVxuIiwKKwkJCSAgcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKSk7CiAJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwogCX0KIAogCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCk7CiAKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDEuIFdBS0UgVVAgUEhZCi0JLy8JCW91dGdvaW5nIGZyYW1lIGFsd2F5cyB3YWtldXAgUEhZIHRvIHByZXZlbnQgZnJhbWUgbG9zdCBhbmQKLQkvLwkJdHVybiBvZmYgUFNNIGJpdCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gbm90IHRvIGNoYW5nZSBQU00gYml0LCBqdXN0IHNlbmQgdGhpcyBmcmFtZSBvdXQ/Ci0JaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCSAgICBEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0ZvcmNlV2FrZXVwIEF0IEhhcmRUeFxuIikpOwotI2lmZGVmIFJUMjg2MAotCQlBc2ljRm9yY2VXYWtldXAocEFkLCBGUk9NX1RYKTsKLSNlbmRpZgotI2lmZGVmIFJUMjg3MAorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFNURVAgMS4gV0FLRSBVUCBQSFkgKi8KKwkvKiAgICAgICAgICAgICAgb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0IGFuZCAqLworCS8qICAgICAgICAgICAgICB0dXJuIG9mZiBQU00gYml0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBub3QgdG8gY2hhbmdlIFBTTSBiaXQsIGp1c3Qgc2VuZCB0aGlzIGZyYW1lIG91dD8gKi8KKwlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKKwkgICAgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCJBc2ljRm9yY2VXYWtldXAgQXQgSGFyZFR4XG4iKSk7CisjaWZkZWYgUlRNUF9NQUNfUENJCiAJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotI2VuZGlmCisjZW5kaWYgLyogUlRNUF9NQUNfUENJIC8vICovCisjaWZkZWYgUlRNUF9NQUNfVVNCCisJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX0ZPUkNFX1dBS0VfVVAsIE5VTEwsIDApOworI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwogCX0KLQotCS8vIEl0IHNob3VsZCBub3QgY2hhbmdlIFBTTSBiaXQsIHdoZW4gQVBTRCB0dXJuIG9uLgotCWlmICgoIShwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpICYmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlID09IEZBTFNFKSkKLQkJfHwgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwVHhCbGstPnBQYWNrZXQpKQotCQl8fCAoUlRNUF9HRVRfUEFDS0VUX1dBSShwVHhCbGstPnBQYWNrZXQpKSkKLQl7CisJLyogSXQgc2hvdWxkIG5vdCBjaGFuZ2UgUFNNIGJpdCwgd2hlbiBBUFNEIHR1cm4gb24uICovCisJaWYgKCghCisJICAgICAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJICAgICAgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCisJICAgICAmJiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSA9PSBGQUxTRSkpCisJICAgIHx8IChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKKwkgICAgfHwgKFJUTVBfR0VUX1BBQ0tFVF9XQUkocFR4QmxrLT5wUGFja2V0KSkpIHsKIAkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCi0gICAgICAgICAgICAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApKQotCQkJTWxtZVNldFBzbUJpdChwQWQsIFBXUl9BQ1RJVkUpOworCQkgICAgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0KKwkJICAgICBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApKQorCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9BQ1RJVkUpOwogCX0KIAotCXN3aXRjaCAocFR4QmxrLT5UeEZyYW1lVHlwZSkKLQl7Ci0JCWNhc2UgVFhfQU1QRFVfRlJBTUU6Ci0JCQkJU1RBX0FNUERVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKLQkJCWJyZWFrOwotCQljYXNlIFRYX0FNU0RVX0ZSQU1FOgotCQkJCVNUQV9BTVNEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9MRUdBQ1lfRlJBTUU6Ci0JCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9NQ0FTVF9GUkFNRToKLQkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKLQkJCWJyZWFrOwotCQljYXNlIFRYX1JBTElOS19GUkFNRToKLQkJCQlTVEFfQVJhbGlua19GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9GUkFHX0ZSQU1FOgotCQkJCVNUQV9GcmFnbWVudF9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXsKLQkJCQkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNlbmQgYSBwYWNla3Qgd2FzIG5vdCBjbGFzc2lmaWVkISEgSXQgc2hvdWxkIG5vdCBoYXBwZW4hXG4iKSk7Ci0JCQkJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKQotCQkJCXsKLQkJCQkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCQkJCQlpZiAocFBhY2tldCkKLQkJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQl9CisJc3dpdGNoIChwVHhCbGstPlR4RnJhbWVUeXBlKSB7CisJY2FzZSBUWF9BTVBEVV9GUkFNRToKKwkJU1RBX0FNUERVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9BTVNEVV9GUkFNRToKKwkJU1RBX0FNU0RVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9MRUdBQ1lfRlJBTUU6CisJCVNUQV9MZWdhY3lfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQlicmVhazsKKwljYXNlIFRYX01DQVNUX0ZSQU1FOgorCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9SQUxJTktfRlJBTUU6CisJCVNUQV9BUmFsaW5rX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKKwkJYnJlYWs7CisJY2FzZSBUWF9GUkFHX0ZSQU1FOgorCQlTVEFfRnJhZ21lbnRfRnJhbWVfVHgocEFkLCBwVHhCbGspOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl7CisJCQkvKiBJdCBzaG91bGQgbm90IGhhcHBlbmVkISAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJICgiU2VuZCBhIHBhY2tldCB3YXMgbm90IGNsYXNzaWZpZWQhIEl0IHNob3VsZCBub3QgaGFwcGVuIVxuIikpOworCQkJd2hpbGUgKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcikgeworCQkJCXBRRW50cnkgPQorCQkJCSAgICBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKKwkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOworCQkJCWlmIChwUGFja2V0KQorCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwKKwkJCQkJCQkgICAgTkRJU19TVEFUVVNfRkFJTFVSRSk7CiAJCQl9Ci0JCQlicmVhazsKKwkJfQorCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogCiB9CiAKLVVMT05HICBIYXNoQnl0ZXNQb2x5bm9taWFsKFVDSEFSICp2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKK3Vuc2lnbmVkIGxvbmcgSGFzaEJ5dGVzUG9seW5vbWlhbCh1OCAqIHZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuKQogewotICAgdW5zaWduZWQgY2hhciAqd29yZCA9IHZhbHVlOwotICAgdW5zaWduZWQgaW50IHJldCA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICp3b3JkID0gdmFsdWU7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAKLSAgIGZvcihpPTA7IGkgPCBsZW47IGkrKykKLSAgIHsKLQkgIGludCBtb2QgPSBpICUgMzI7Ci0JICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPDwgbW9kOwotCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pID4+ICgzMiAtIG1vZCk7Ci0gICB9Ci0gICByZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgbW9kID0gaSAlIDMyOworCQlyZXQgXj0gKHVuc2lnbmVkIGludCkod29yZFtpXSkgPDwgbW9kOworCQlyZXQgXj0gKHVuc2lnbmVkIGludCkod29yZFtpXSkgPj4gKDMyIC0gbW9kKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKK3ZvaWQgU3RhX0Fubm91bmNlX29yX0ZvcndhcmRfODAyXzNfUGFja2V0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkJICB2b2lkICpwUGFja2V0LAorCQkJCQkgIHU4IEZyb21XaGljaEJTU0lEKQogewotCWlmIChUUlVFCi0JCSkKLQl7CisJaWYgKFRSVUUpIHsKIAkJYW5ub3VuY2VfODAyXzNfcGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIHJlbGVhc2UgcGFja2V0CisJfSBlbHNlIHsKKwkJLyogcmVsZWFzZSBwYWNrZXQgKi8KIAkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwogCX0KIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYwppbmRleCA3ZDUzMGY2Li44ZjlmZDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zYW5pdHkuYwpAQCAtMzYsMTUgKzM2LDE1IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi1leHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107CitleHRlcm4gdTggQ0lTQ09fT1VJW107CiAKLWV4dGVybiBVQ0hBUglXUEFfT1VJW107Ci1leHRlcm4gVUNIQVIJUlNOX09VSVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107Ci1leHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKLWV4dGVybiBVQ0hBUglSQUxJTktfT1VJW107Ci1leHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107CitleHRlcm4gdTggV1BBX09VSVtdOworZXh0ZXJuIHU4IFJTTl9PVUlbXTsKK2V4dGVybiB1OCBXTUVfSU5GT19FTEVNW107CitleHRlcm4gdTggV01FX1BBUk1fRUxFTVtdOworZXh0ZXJuIHU4IENjeDJRb3NJbmZvW107CitleHRlcm4gdTggUkFMSU5LX09VSVtdOworZXh0ZXJuIHU4IEJST0FEQ09NX09VSVtdOwogCiAvKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC01NCwyNyArNTQsMjUgQEAKICAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gTWxtZVN0YXJ0UmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCitCT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICBjaGFyIFNzaWRbXSwgdTggKiBwU3NpZExlbikKIHsKLSAgICBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKkluZm87CisJc3RydWN0IHJ0X21sbWVfc3RhcnRfcmVxICpJbmZvOwogCi0gICAgSW5mbyA9IChNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKikoTXNnKTsKKwlJbmZvID0gKHN0cnVjdCBydF9tbG1lX3N0YXJ0X3JlcSAqKShNc2cpOwogCi0gICAgaWYgKEluZm8tPlNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgbGVuZ3RoXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKEluZm8tPlNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJNbG1lU3RhcnRSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgbGVuZ3RoXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CiAKLSAgICAqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOwotICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7CisJKnBTc2lkTGVuID0gSW5mby0+U3NpZExlbjsKKwlOZGlzTW92ZU1lbW9yeShTc2lkLCBJbmZvLT5Tc2lkLCAqcFNzaWRMZW4pOwogCi0gICAgcmV0dXJuIFRSVUU7CisJcmV0dXJuIFRSVUU7CiB9CiAKIC8qCkBAIC04OCwyMTEgKzg2LDE2MSBAQAogCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqcE1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCi0gICAgT1VUIFVTSE9SVCAqcEFpZCwKLSAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0gICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotICAgIE9VVCBIVF9DQVBBQklMSVRZX0lFCQkqcEh0Q2FwYWJpbGl0eSwKLSAgICBPVVQgQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLSAgICBPVVQgVUNIQVIJCQkqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVUNIQVIJCQkqcEFkZEh0SW5mb0xlbiwKLSAgICBPVVQgVUNIQVIJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQsCi0gICAgT1VUIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotICAgIE9VVCBVQ0hBUiAqcENraXBGbGFnKQorQk9PTEVBTiBQZWVyQXNzb2NSc3BTYW5pdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB2b2lkICogcE1zZywgdW5zaWduZWQgbG9uZyBNc2dMZW4sIHU4ICpwQWRkcjIsIHUxNiAqIHBDYXBhYmlsaXR5SW5mbywgdTE2ICogcFN0YXR1cywgdTE2ICogcEFpZCwgdTggU3VwUmF0ZVtdLCB1OCAqIHBTdXBSYXRlTGVuLCB1OCBFeHRSYXRlW10sIHU4ICogcEV4dFJhdGVMZW4sIHN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llICogcEh0Q2FwYWJpbGl0eSwgc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llICogcEFkZEh0SW5mbywJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJCQkgICB1OCAqIHBIdENhcGFiaWxpdHlMZW4sCisJCQkgICB1OCAqIHBBZGRIdEluZm9MZW4sCisJCQkgICB1OCAqIHBOZXdFeHRDaGFubmVsT2Zmc2V0LAorCQkJICAgc3RydWN0IHJ0X2VkY2FfcGFybSAqcEVkY2FQYXJtLCB1OCAqIHBDa2lwRmxhZykKIHsKLSAgICBDSEFSICAgICAgICAgIEllVHlwZSwgKlB0cjsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0gICAgUEVJRF9TVFJVQ1QgICBwRWlkOwotICAgIFVMT05HICAgICAgICAgTGVuZ3RoID0gMDsKKwljaGFyIEllVHlwZSwgKlB0cjsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgcE1zZzsKKwlzdHJ1Y3QgcnRfZWlkICogcEVpZDsKKwl1bnNpZ25lZCBsb25nIExlbmd0aCA9IDA7CiAKIAkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwogCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKIAkqcEFkZEh0SW5mb0xlbiA9IDA7Ci0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBQdHIgPSBwRnJhbWUtPk9jdGV0OwotICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOworCUNPUFlfTUFDX0FERFIocEFkZHIyLCBwRnJhbWUtPkhkci5BZGRyMik7CisJUHRyID0gKGNoYXIgKilwRnJhbWUtPk9jdGV0OworCUxlbmd0aCArPSBMRU5HVEhfODAyXzExOwogCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCAmcEZyYW1lLT5PY3RldFswXSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7Ci0gICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgICAgICAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7Ci0gICAgKnBDa2lwRmxhZyA9IDA7Ci0gICAgKnBFeHRSYXRlTGVuID0gMDsKLSAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOworCU5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOworCUxlbmd0aCArPSAyOworCU5kaXNNb3ZlTWVtb3J5KHBTdGF0dXMsICZwRnJhbWUtPk9jdGV0WzJdLCAyKTsKKwlMZW5ndGggKz0gMjsKKwkqcENraXBGbGFnID0gMDsKKwkqcEV4dFJhdGVMZW4gPSAwOworCXBFZGNhUGFybS0+YlZhbGlkID0gRkFMU0U7CiAKLSAgICBpZiAoKnBTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQotICAgICAgICByZXR1cm4gVFJVRTsKKwlpZiAoKnBTdGF0dXMgIT0gTUxNRV9TVUNDRVNTKQorCQlyZXR1cm4gVFJVRTsKIAotICAgIE5kaXNNb3ZlTWVtb3J5KHBBaWQsICZwRnJhbWUtPk9jdGV0WzRdLCAyKTsKLSAgICBMZW5ndGggKz0gMjsKKwlOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7CisJTGVuZ3RoICs9IDI7CiAKLSAgICAvLyBBaWQgYWxyZWFkeSBzd2FwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybQotICAgICpwQWlkID0gKCpwQWlkKSAmIDB4M2ZmZjsgLy8gQUlEIGlzIGxvdyAxNC1iaXQKKwkvKiBBaWQgYWxyZWFkeSBzd2FwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybSAqLworCSpwQWlkID0gKCpwQWlkKSAmIDB4M2ZmZjsJLyogQUlEIGlzIGxvdyAxNC1iaXQgKi8KIAotICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFs2XTsKLSAgICAqcFN1cFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0WzddOwotICAgIGlmICgoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpIHx8ICgqcFN1cFJhdGVMZW4gPiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRlZFJhdGVzIElFXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCAmcEZyYW1lLT5PY3RldFs4XSwgKnBTdXBSYXRlTGVuKTsKKwkvKiAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCUllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbNl07CisJKnBTdXBSYXRlTGVuID0gcEZyYW1lLT5PY3RldFs3XTsKKwlpZiAoKEllVHlwZSAhPSBJRV9TVVBQX1JBVEVTKQorCSAgICB8fCAoKnBTdXBSYXRlTGVuID4gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUGVlckFzc29jUnNwU2FuaXR5IGZhaWwgLSB3cm9uZyBTdXBwb3J0ZWRSYXRlcyBJRVxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlCisJCU5kaXNNb3ZlTWVtb3J5KFN1cFJhdGUsICZwRnJhbWUtPk9jdGV0WzhdLCAqcFN1cFJhdGVMZW4pOwogCi0gICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArICpwU3VwUmF0ZUxlbjsKKwlMZW5ndGggPSBMZW5ndGggKyAyICsgKnBTdXBSYXRlTGVuOwogCi0gICAgLy8gbWFueSBBUCBpbXBsZW1lbnQgcHJvcHJpZXRhcnkgSUVzIGluIG5vbi1zdGFuZGFyZCBvcmRlciwgd2UnZCBiZXR0ZXIKLSAgICAvLyB0b2xlcmF0ZSBtaXMtb3JkZXJlZCBJRXMgdG8gZ2V0IGJlc3QgY29tcGF0aWJpbGl0eQotICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpICZwRnJhbWUtPk9jdGV0WzggKyAoKnBTdXBSYXRlTGVuKV07CisJLyogbWFueSBBUCBpbXBsZW1lbnQgcHJvcHJpZXRhcnkgSUVzIGluIG5vbi1zdGFuZGFyZCBvcmRlciwgd2UnZCBiZXR0ZXIgKi8KKwkvKiB0b2xlcmF0ZSBtaXMtb3JkZXJlZCBJRXMgdG8gZ2V0IGJlc3QgY29tcGF0aWJpbGl0eSAqLworCXBFaWQgPSAoc3RydWN0IHJ0X2VpZCAqKSAmIHBGcmFtZS0+T2N0ZXRbOCArICgqcFN1cFJhdGVMZW4pXTsKIAotICAgIC8vIGdldCB2YXJpYWJsZSBmaWVsZHMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgd2hpbGUgKChMZW5ndGggKyAyICsgcEVpZC0+TGVuKSA8PSBNc2dMZW4pCi0gICAgewotICAgICAgICBzd2l0Y2ggKHBFaWQtPkVpZCkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJLyogZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIgKi8KKwl3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikgeworCQlzd2l0Y2ggKHBFaWQtPkVpZCkgeworCQljYXNlIElFX0VYVF9TVVBQX1JBVEVTOgorCQkJaWYgKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgeworCQkJCU5kaXNNb3ZlTWVtb3J5KEV4dFJhdGUsIHBFaWQtPk9jdGV0LCBwRWlkLT5MZW4pOworCQkJCSpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKKwkJCX0KKwkJCWJyZWFrOwogCi0gICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVA6Ci0gICAgICAgICAgICBjYXNlIElFX0hUX0NBUDI6Ci0JCQlpZiAocEVpZC0+TGVuID49IFNJWkVfSFRfQ0FQX0lFKSAgLy9Ob3RlOiBhbGxvdyBleHRlbnNpb24uISEKKwkJY2FzZSBJRV9IVF9DQVA6CisJCWNhc2UgSUVfSFRfQ0FQMjoKKwkJCWlmIChwRWlkLT5MZW4gPj0gU0laRV9IVF9DQVBfSUUpCS8qTm90ZTogYWxsb3cgZXh0ZW5zaW9uISAqLwogCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksIHBFaWQtPk9jdGV0LCBTSVpFX0hUX0NBUF9JRSk7CisJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsCisJCQkJCSAgICAgICBTSVpFX0hUX0NBUF9JRSk7CiAKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pKTsKKwkJCQkqKHUxNiAqKSAoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPQorCQkJCSAgICBjcHUybGUxNigqKHUxNiAqKQorCQkJCQkgICAgICgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7CisJCQkJKih1MTYgKikgKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0KKwkJCQkgICAgY3B1MmxlMTYoKih1MTYgKikKKwkJCQkJICAgICAoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOwogCiAJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gXG4iKSk7CisJCQl9IGVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCSAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gXG4iKSk7CiAJCQl9CiAKLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKLSAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUMjoKLQkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKLQkJCXsKLQkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQotCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwkJCWJyZWFrOworCQljYXNlIElFX0FERF9IVDoKKwkJY2FzZSBJRV9BRERfSFQyOgorCQkJaWYgKHBFaWQtPkxlbiA+PSBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSkgeworCQkJCS8qIFRoaXMgSUUgYWxsb3dzIGV4dGVuc2lvbiwgYnV0IHdlIGNhbiBpZ25vcmUgZXh0cmEgYnl0ZXMgYmV5b25kIG91ciBrbm93bGVkZ2UgLCBzbyBvbmx5ICovCisJCQkJLyogY29weSBmaXJzdCBzaXplb2Yoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGRIdEluZm8sIHBFaWQtPk9jdGV0LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCi0JCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzIpKTsKLQkJCQkqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykpOworCQkJCSoodTE2ICopICgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikgPQorCQkJCSAgICBjcHUybGUxNigqKHUxNiAqKQorCQkJCQkgICAgICgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMikpOworCQkJCSoodTE2ICopICgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykgPQorCQkJCSAgICBjcHUybGUxNigqKHUxNiAqKQorCQkJCQkgICAgICgmcEFkZEh0SW5mby0+QWRkSHRJbmZvMykpOwogCiAJCQkJKnBBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkJICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfQUREX0hULiBcbiIpKTsKIAkJCX0KIAotCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSUVfU0VDT05EQVJZX0NIX09GRlNFVDoKLQkJCWlmIChwRWlkLT5MZW4gPT0gMSkKLQkJCXsKKwkJCWJyZWFrOworCQljYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6CisJCQlpZiAocEVpZC0+TGVuID09IDEpIHsKIAkJCQkqcE5ld0V4dENoYW5uZWxPZmZzZXQgPSBwRWlkLT5PY3RldFswXTsKKwkJCX0gZWxzZSB7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwKKwkJCQkJICgiUGVlckFzc29jUnNwU2FuaXR5IC0gd3JvbmcgSUVfU0VDT05EQVJZX0NIX09GRlNFVC4gXG4iKSk7CiAJCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgorCQkJLyogaGFuZGxlIFdNRSBQQVJBTVRFUiBFTEVNRU5UICovCisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KQorCQkJICAgICYmIChwRWlkLT5MZW4gPT0gMjQpKSB7CisJCQkJdTggKnB0cjsKKwkJCQlpbnQgaTsKKworCQkJCS8qIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzICovCisJCQkJcEVkY2FQYXJtLT5iVmFsaWQgPSBUUlVFOworCQkJCXBFZGNhUGFybS0+YlFBY2sgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDEwOyAqLworCQkJCXBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCA9IEZBTFNFOwkvKiBwRWlkLT5PY3RldFswXSAmIDB4MjA7ICovCisJCQkJcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgPSBGQUxTRTsJLyogcEVpZC0+T2N0ZXRbMF0gJiAweDQwOyAqLworCQkJCS8qcEVkY2FQYXJtLT5iTW9yZURhdGFBY2sgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDgwOyAqLworCQkJCXBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0KKwkJCQkgICAgcEVpZC0+T2N0ZXRbNl0gJiAweDBmOworCQkJCXBFZGNhUGFybS0+YkFQU0RDYXBhYmxlID0KKwkJCQkgICAgKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKKwkJCQlwdHIgPSAodTggKikmIHBFaWQtPk9jdGV0WzhdOworCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCQkJdTggYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OwkvKiBiNX42IGlzIEFDIElOREVYICovCisJCQkJCXBFZGNhUGFybS0+YkFDTVthY2ldID0gKCgoKnB0cikgJiAweDEwKSA9PSAweDEwKTsJLyogYjUgaXMgQUNNICovCisJCQkJCXBFZGNhUGFybS0+QWlmc25bYWNpXSA9ICgqcHRyKSAmIDB4MGY7CS8qIGIwfjMgaXMgQUlGU04gKi8KKwkJCQkJcEVkY2FQYXJtLT5Dd21pblthY2ldID0gKihwdHIgKyAxKSAmIDB4MGY7CS8qIGIwfjQgaXMgQ3dtaW4gKi8KKwkJCQkJcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIgKyAxKSA+PiA0OwkvKiBiNX44IGlzIEN3bWF4ICovCisJCQkJCXBFZGNhUGFybS0+VHhvcFthY2ldID0gKihwdHIgKyAyKSArIDI1NiAqICgqKHB0ciArIDMpKTsJLyogaW4gdW5pdCBvZiAzMi11cyAqLworCQkJCQlwdHIgKz0gNDsJLyogcG9pbnQgdG8gbmV4dCBBQyAqLworCQkJCX0KIAkJCX0KLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX0FJUk9ORVRfQ0tJUDoKLSAgICAgICAgICAgICAgICAvLyAwLiBDaGVjayBBaXJvbmV0IElFIGxlbmd0aCwgaXQgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gMjgKLSAgICAgICAgICAgICAgICAvLyAgICBDaXNjbydzIEFQIFZ4V29yayB2ZXJzaW9uKHdpbGwgbm90IGJlIHN1cHBvcnRlZCkgdXNlZCB0aGlzIElFIGxlbmd0aCBhcyAyOAotICAgICAgICAgICAgICAgIC8vICAgIENpc2NvJ3MgQVAgSU9TIHZlcnNpb24gdXNlZCB0aGlzIElFIGxlbmd0aCBhcyAzMAotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPCAoQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggLSAyKSkKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUGVlckFzc29jUnNwU2FuaXR5IC0gaWdub3JlIHVucmVjb2duaXplZCBFSUQgPSAlZFxuIiwKKwkJCQkgIHBFaWQtPkVpZCkpOworCQkJYnJlYWs7CisJCX0KIAotICAgICAgICAgICAgICAgIC8vIDEuIENvcHkgQ0tJUCBmbGFnIGJ5dGUgdG8gYnVmZmVyIGZvciBwcm9jZXNzCi0gICAgICAgICAgICAgICAgKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJTGVuZ3RoID0gTGVuZ3RoICsgMiArIHBFaWQtPkxlbjsKKwkJcEVpZCA9IChzdHJ1Y3QgcnRfZWlkICopICgodTggKikgcEVpZCArIDIgKyBwRWlkLT5MZW4pOworCX0KIAotICAgICAgICAgICAgY2FzZSBJRV9BSVJPTkVUX0lQQUREUkVTUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuICE9IDB4MEEpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgQ2lzY28gQWlyb25ldCBJUCBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENJU0NPX09VSSwgMykgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuQWlyb25ldElQQWRkcmVzcywgcEVpZC0+T2N0ZXQgKyA0LCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gQ0NYMiwgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWx1ZQotICAgICAgICAgICAgLy8gY2FzZSBJRV9DQ1hfVjI6Ci0gICAgICAgICAgICBjYXNlIElFX1ZFTkRPUl9TUEVDSUZJQzoKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgV01FIFBBUkFNVEVSIEVMRU1FTlQKLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfUEFSTV9FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDI0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBVQ0hBUiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNpbmcgRURDQSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlZhbGlkICAgICAgICAgID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUUFjayAgICAgICAgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDEwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRdWV1ZVJlcXVlc3QgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MjA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlR4b3BSZXF1ZXN0ICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg0MDsKLSAgICAgICAgICAgICAgICAgICAgLy9wRWRjYVBhcm0tPmJNb3JlRGF0YUFjayAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgQ0NYIElFCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMC4gQ2hlY2sgdGhlIHNpemUgYW5kIENDWCBhZG1pbiBjb250cm9sCi0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5DQ1hDb250cm9sLmZpZWxkLkVuYWJsZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFR1cm4gQ0NYMiBpZiBtYXRjaGVkCi0gICAgICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIENjeDJJZUluZm8sIDUpID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5DQ1hFbmFibGUgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwU2FuaXR5IC0gaWdub3JlIHVucmVjb2duaXplZCBFSUQgPSAlZFxuIiwgcEVpZC0+RWlkKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBMZW5ndGggPSBMZW5ndGggKyAyICsgcEVpZC0+TGVuOwotICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLSAgICB9Ci0KLSAgICAvLyBGb3JjZSBDQ1gyIGVuYWJsZSB0byBUUlVFIGZvciB0aG9zZSBBUCBkaWRuJ3QgcmVwbGF5IENDWCB2MiBJRSwgd2Ugc3RpbGwgZm9yY2UgaXQgdG8gYmUgb24KLSAgICBpZiAocEFkLT5TdGFDZmcuQ0NYQ29udHJvbC5maWVsZC5FbmFibGUgPT0gMSkKLSAgICAgICAgcEFkLT5TdGFDZmcuQ0NYRW5hYmxlID0gVFJVRTsKLQotICAgIHJldHVybiBUUlVFOworCXJldHVybiBUUlVFOwogfQogCiAvKgpAQCAtMzA2LDQ3ICsyNTQsNDYgQEAKIAogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLUJPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4pCitCT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICB2b2lkICogTXNnLAorCQkJICAgdW5zaWduZWQgbG9uZyBNc2dMZW4sCisJCQkgICB1OCAqcEFkZHIyLAorCQkJICAgY2hhciBTc2lkW10sIHU4ICogcFNzaWRMZW4pCiB7Ci0gICAgVUNIQVIgICAgICAgICBJZHg7Ci0gICAgVUNIQVIJICAgICAgUmF0ZUxlbjsKLSAgICBDSEFSICAgICAgICAgIEllVHlwZTsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKKwl1OCBJZHg7CisJdTggUmF0ZUxlbjsKKwljaGFyIEllVHlwZTsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lID0gKHN0cnVjdCBydF9mcmFtZV84MDJfMTEgKikgTXNnOwogCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKKwlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwogCi0gICAgaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFswXSxwRnJhbWUtPk9jdGV0WzFdKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisJaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpCisJICAgIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIsCisJCQkgIHBGcmFtZS0+T2N0ZXRbMF0sIHBGcmFtZS0+T2N0ZXRbMV0pKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KIAotICAgICpwU3NpZExlbiA9IHBGcmFtZS0+T2N0ZXRbMV07Ci0gICAgTmRpc01vdmVNZW1vcnkoU3NpZCwgJnBGcmFtZS0+T2N0ZXRbMl0sICpwU3NpZExlbik7CisJKnBTc2lkTGVuID0gcEZyYW1lLT5PY3RldFsxXTsKKwlOZGlzTW92ZU1lbW9yeShTc2lkLCAmcEZyYW1lLT5PY3RldFsyXSwgKnBTc2lkTGVuKTsKIAotICAgIElkeCA9ICpwU3NpZExlbiArIDI7CisJSWR4ID0gKnBTc2lkTGVuICsgMjsKIAotICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFtJZHhdOwotICAgIFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0W0lkeCArIDFdOwotICAgIGlmIChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydFJhdGVzIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0W0lkeF0scEZyYW1lLT5PY3RldFtJZHgrMV0pKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKFJhdGVMZW4gPCA4KSkKLSAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KKwkvKiAtLSBnZXQgc3VwcG9ydGVkIHJhdGVzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlciAqLworCUllVHlwZSA9IHBGcmFtZS0+T2N0ZXRbSWR4XTsKKwlSYXRlTGVuID0gcEZyYW1lLT5PY3RldFtJZHggKyAxXTsKKwlpZiAoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJQZWVyUHJvYmVSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRSYXRlcyBJRShUeXBlPSVkLExlbj0lZClcbiIsCisJCQkgIHBGcmFtZS0+T2N0ZXRbSWR4XSwgcEZyYW1lLT5PY3RldFtJZHggKyAxXSkpOworCQlyZXR1cm4gRkFMU0U7CisJfSBlbHNlIHsKKwkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmIChSYXRlTGVuIDwgOCkpCisJCQlyZXR1cm4gKEZBTFNFKTsKKwl9CiAKLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTM1Nyw2MiArMzA0LDU4IEBACiAKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1CT09MRUFOIEdldFRpbUJpdCgKLSAgICBJTiBDSEFSICpQdHIsCi0gICAgSU4gVVNIT1JUIEFpZCwKLSAgICBPVVQgVUNIQVIgKlRpbUxlbiwKLSAgICBPVVQgVUNIQVIgKkJjYXN0RmxhZywKLSAgICBPVVQgVUNIQVIgKkR0aW1Db3VudCwKLSAgICBPVVQgVUNIQVIgKkR0aW1QZXJpb2QsCi0gICAgT1VUIFVDSEFSICpNZXNzYWdlVG9NZSkKK0JPT0xFQU4gR2V0VGltQml0KGNoYXIgKiBQdHIsCisJCSAgdTE2IEFpZCwKKwkJICB1OCAqIFRpbUxlbiwKKwkJICB1OCAqIEJjYXN0RmxhZywKKwkJICB1OCAqIER0aW1Db3VudCwKKwkJICB1OCAqIER0aW1QZXJpb2QsIHU4ICogTWVzc2FnZVRvTWUpCiB7Ci0gICAgVUNIQVIgICAgICAgICAgQml0Q250bCwgTjEsIE4yLCBNeUJ5dGUsIE15Qml0OwotICAgIENIQVIgICAgICAgICAgKklkeFB0cjsKKwl1OCBCaXRDbnRsLCBOMSwgTjIsIE15Qnl0ZSwgTXlCaXQ7CisJY2hhciAqSWR4UHRyOwogCi0gICAgSWR4UHRyID0gUHRyOworCUlkeFB0ciA9IFB0cjsKIAotICAgIElkeFB0ciArKzsKLSAgICAqVGltTGVuID0gKklkeFB0cjsKKwlJZHhQdHIrKzsKKwkqVGltTGVuID0gKklkeFB0cjsKIAotICAgIC8vIGdldCBEVElNIENvdW50IGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIgKys7Ci0gICAgKkR0aW1Db3VudCA9ICpJZHhQdHI7CisJLyogZ2V0IERUSU0gQ291bnQgZnJvbSBUSU0gZWxlbWVudCAqLworCUlkeFB0cisrOworCSpEdGltQ291bnQgPSAqSWR4UHRyOwogCi0gICAgLy8gZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIrKzsKLSAgICAqRHRpbVBlcmlvZCA9ICpJZHhQdHI7CisJLyogZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQgKi8KKwlJZHhQdHIrKzsKKwkqRHRpbVBlcmlvZCA9ICpJZHhQdHI7CiAKLSAgICAvLyBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudAotICAgIElkeFB0cisrOwotICAgIEJpdENudGwgPSAqSWR4UHRyOworCS8qIGdldCBCaXRtYXAgQ29udHJvbCBmcm9tIFRJTSBlbGVtZW50ICovCisJSWR4UHRyKys7CisJQml0Q250bCA9ICpJZHhQdHI7CiAKLSAgICBpZiAoKCpEdGltQ291bnQgPT0gMCkgJiYgKEJpdENudGwgJiAweDAxKSkKLSAgICAgICAgKkJjYXN0RmxhZyA9IFRSVUU7Ci0gICAgZWxzZQotICAgICAgICAqQmNhc3RGbGFnID0gRkFMU0U7CisJaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCisJCSpCY2FzdEZsYWcgPSBUUlVFOworCWVsc2UKKwkJKkJjYXN0RmxhZyA9IEZBTFNFOwogCi0gICAgLy8gUGFyc2UgUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgTjEgPSBCaXRDbnRsICYgMHhmZTsgICAgLy8gTjEgaXMgdGhlIGZpcnN0IGJpdG1hcCBieXRlIwotICAgIE4yID0gKlRpbUxlbiAtIDQgKyBOMTsgIC8vIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIworCS8qIFBhcnNlIFBhcnRpYWwgVmlydHVhbCBCaXRtYXAgZnJvbSBUSU0gZWxlbWVudCAqLworCU4xID0gQml0Q250bCAmIDB4ZmU7CS8qIE4xIGlzIHRoZSBmaXJzdCBiaXRtYXAgYnl0ZSMgKi8KKwlOMiA9ICpUaW1MZW4gLSA0ICsgTjE7CS8qIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIyAqLwogCi0gICAgaWYgKChBaWQgPCAoTjEgPDwgMykpIHx8IChBaWQgPj0gKChOMiArIDEpIDw8IDMpKSkKLSAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXkgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgYml0bWFwIGJ5dGUtc3RyZWFtCi0gICAgICAgIE15Qml0ID0gQWlkICUgMTYgLSAoKE15Qnl0ZSAmIDB4MDEpPyA4OjApOworCWlmICgoQWlkIDwgKE4xIDw8IDMpKSB8fCAoQWlkID49ICgoTjIgKyAxKSA8PCAzKSkpCisJCSpNZXNzYWdlVG9NZSA9IEZBTFNFOworCWVsc2UgeworCQlNeUJ5dGUgPSAoQWlkID4+IDMpIC0gTjE7CS8qIG15IGJ5dGUgcG9zaXRpb24gaW4gdGhlIGJpdG1hcCBieXRlLXN0cmVhbSAqLworCQlNeUJpdCA9IEFpZCAlIDE2IC0gKChNeUJ5dGUgJiAweDAxKSA/IDggOiAwKTsKIAotICAgICAgICBJZHhQdHIgKz0gKE15Qnl0ZSArIDEpOworCQlJZHhQdHIgKz0gKE15Qnl0ZSArIDEpOwogCi0gICAgICAgIC8vaWYgKCpJZHhQdHIpCi0gICAgICAgIC8vICAgIERCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiVElNIGJpdG1hcCA9IDB4JTAyeFxuIiwgKklkeFB0cikpOworCQkvKmlmICgqSWR4UHRyKSAqLworCQkvKiAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlRJTSBiaXRtYXAgPSAweCUwMnhcbiIsICpJZHhQdHIpKTsgKi8KIAotICAgICAgICBpZiAoKklkeFB0ciAmICgweDAxIDw8IE15Qml0KSkKLSAgICAgICAgICAgICpNZXNzYWdlVG9NZSA9IFRSVUU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICpNZXNzYWdlVG9NZSA9IEZBTFNFOwotICAgIH0KKwkJaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCisJCQkqTWVzc2FnZVRvTWUgPSBUUlVFOworCQllbHNlCisJCQkqTWVzc2FnZVRvTWUgPSBGQUxTRTsKKwl9CiAKLSAgICByZXR1cm4gVFJVRTsKKwlyZXR1cm4gVFJVRTsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvc3luYy5jCmluZGV4IGE2ZTQzNjIuLmNiZTkwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3N5bmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YS9zeW5jLmMKQEAgLTM3LDQ1ICszNyw3IEBACiAqLwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgogCi0jaWZkZWYgUlQyODYwCi0jZGVmaW5lIEFDMF9ERUZfVFhPUAkJMAotI2RlZmluZSBBQzFfREVGX1RYT1AJCTAKLSNkZWZpbmUgQUMyX0RFRl9UWE9QCQk5NAotI2RlZmluZSBBQzNfREVGX1RYT1AJCTQ3Ci0KLVZPSUQJQWRob2NUdXJuT25Rb3MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKQotewotCS8vIFR1cm4gb24gUU9zIGlmIHVzZSBIVCByYXRlLgotCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9PSBGQUxTRSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID0gVFJVRTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblswXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMV0gPSA3OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzJdID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblszXSA9IDE7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblswXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMV0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzJdID0gMzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblszXSA9IDI7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFswXSA9IDEwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gNjsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFsyXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbM10gPSAzOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFswXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMV0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzJdICA9IEFDMl9ERUZfVFhPUDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IEFDM19ERUZfVFhPUDsKLQl9Ci0JQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwotfQotI2VuZGlmIC8qIFJUMjg2MCAqLwotI2lmZGVmIFJUMjg3MAotI2RlZmluZSBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FCSgyKk9TX0haKQkvLyAyIHNlYwotI2VuZGlmCisjZGVmaW5lIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUJKDIqT1NfSFopCS8qIDIgc2VjICovCiAKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg4LDM4ICs1MCw1NiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCit2b2lkIFN5bmNTdGF0ZU1hY2hpbmVJbml0KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgc3RydWN0IHJ0X3N0YXRlX21hY2hpbmUgKlNtLCBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCiB7Ci0JU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9TWU5DX1NUQVRFLCBNQVhfU1lOQ19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgU1lOQ19JRExFLCBTWU5DX01BQ0hJTkVfQkFTRSk7CisJU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9TWU5DX1NUQVRFLCBNQVhfU1lOQ19NU0csCisJCQkgKFNUQVRFX01BQ0hJTkVfRlVOQykgRHJvcCwgU1lOQ19JRExFLAorCQkJIFNZTkNfTUFDSElORV9CQVNFKTsKIAotCS8vIGNvbHVtbiAxCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVTY2FuUmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUpvaW5SZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TVEFSVF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVN0YXJ0UmVxQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclByb2JlUmVxQWN0aW9uKTsKKwkvKiBjb2x1bW4gMSAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVTY2FuUmVxQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfSk9JTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBNbG1lSm9pblJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NUQVJUX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIE1sbWVTdGFydFJlcUFjdGlvbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX0JFQUNPTiwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJCZWFjb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9QUk9CRV9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyUHJvYmVSZXFBY3Rpb24pOwogCi0JLy9jb2x1bW4gMgotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbik7CisJLypjb2x1bW4gMiAqLworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU0NBTl9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuU2Nhbik7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfTUxNRV9KT0lOX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9NTE1FX1NUQVJUX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5TdGFydCk7CisJU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfUEVFUl9CRUFDT04sCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBQZWVyQmVhY29uQXRKb2luQWN0aW9uKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEpPSU5fV0FJVF9CRUFDT04sIE1UMl9CRUFDT05fVElNRU9VVCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24pOwogCi0JLy8gY29sdW1uIDMKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU2Nhbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfUEVFUl9QUk9CRV9SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0U2NhbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1NDQU5fVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylTY2FuVGltZW91dEFjdGlvbik7CisJLyogY29sdW1uIDMgKi8KKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TQ0FOX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5TY2FuKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9KT0lOX1JFUSwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIEludmFsaWRTdGF0ZVdoZW5Kb2luKTsKKwlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9TVEFSVF9SRVEsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBJbnZhbGlkU3RhdGVXaGVuU3RhcnQpOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX0JFQUNPTiwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX1BST0JFX1JTUCwKKwkJCSAgICAgIChTVEFURV9NQUNISU5FX0ZVTkMpIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOworCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9TQ0FOX1RJTUVPVVQsCisJCQkgICAgICAoU1RBVEVfTUFDSElORV9GVU5DKSBTY2FuVGltZW91dEFjdGlvbik7CiAKLQkvLyB0aW1lciBpbml0Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKKwkvKiB0aW1lciBpbml0ICovCisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsCisJCSAgICAgIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25UaW1lb3V0KSwgcEFkLCBGQUxTRSk7CisJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAorCQkgICAgICBHRVRfVElNRVJfRlVOQ1RJT04oU2NhblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKIH0KIAogLyoKQEAgLTEzMSwzNiArMTExLDM1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEJlYWNvblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQordm9pZCBCZWFjb25UaW1lb3V0KHZvaWQgKlN5c3RlbVNwZWNpZmljMSwKKwkJICAgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgICB2b2lkICpTeXN0ZW1TcGVjaWZpYzIsIHZvaWQgKlN5c3RlbVNwZWNpZmljMykKIHsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNZTkMgLSBCZWFjb25UaW1lb3V0XG4iKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRcbiIpKTsKIAotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAorCS8qIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLiAqLworCS8qIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdCAqLwogCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCiAJCXJldHVybjsKIAogCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCQkpCi0JewotCQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOworCSAgICApIHsKKwkJdTggQkJQVmFsdWUgPSAwOwogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7CiAJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKIAkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwogCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwogCQlCQlBWYWx1ZSB8PSAweDEwOwogCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIsCisJCQkgIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKIAl9CiAKIAlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX0JFQUNPTl9USU1FT1VULCAwLCBOVUxMKTsKLQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZCk7CisJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKIH0KIAogLyoKQEAgLTE3MiwzMiArMTUxLDI4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFNjYW5UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgU2NhblRpbWVvdXQodm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkgdm9pZCAqRnVuY3Rpb25Db250ZXh0LAorCQkgdm9pZCAqU3lzdGVtU3BlY2lmaWMyLCB2b2lkICpTeXN0ZW1TcGVjaWZpYzMpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OwogCi0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4gKi8KKwkvKiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQgKi8KIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQogCQlyZXR1cm47CiAKLQlpZiAoTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX1RJTUVPVVQsIDAsIE5VTEwpKQotCXsKLQkJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOwotCX0KLQllbHNlCi0JewotCQkvLyBUbyBwcmV2ZW50IFN5bmNNYWNoaW5lLkN1cnJTdGF0ZSBpcyBTQ0FOX0xJU1RFTiBmb3JldmVyLgorCWlmIChNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fVElNRU9VVCwgMCwgTlVMTCkpIHsKKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKKwl9IGVsc2UgeworCQkvKiBUbyBwcmV2ZW50IFN5bmNNYWNoaW5lLkN1cnJTdGF0ZSBpcyBTQ0FOX0xJU1RFTiBmb3JldmVyLiAqLwogCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7CiAJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOwotCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCXsKLQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NDQU5fRU5RVUVVRV9GQUlMX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkgeworCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwKKwkJCQkJICAgICAgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRywKKwkJCQkJICAgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJICAgICAgQWRkciwgQlNTMCwgMCk7CiAJCX0KIAl9CiB9CkBAIC0yMDgsODEgKzE4Myw3OCBAQAogCQlNTE1FIFNDQU4gcmVxIHN0YXRlIG1hY2hpbmUgcHJvY2VkdXJlCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBNbG1lU2NhblJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIE1sbWVTY2FuUmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIFNjYW5UeXBlLCBCc3NUeXBlLCBCQlBWYWx1ZSA9IDA7Ci0JQk9PTEVBTiAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUxPTkcJCSAgIE5vdzsKLQlVU0hPUlQgICAgICAgICBTdGF0dXM7Ci0JUEhFQURFUl84MDJfMTEgcEhkcjgwMjExOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgIE5TdGF0dXM7CisJdTggU3NpZFtNQVhfTEVOX09GX1NTSURdLCBTc2lkTGVuLCBTY2FuVHlwZSwgQnNzVHlwZSwgQkJQVmFsdWUgPSAwOworCUJPT0xFQU4gVGltZXJDYW5jZWxsZWQ7CisJdW5zaWduZWQgbG9uZyBOb3c7CisJdTE2IFN0YXR1czsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSAqIHBIZHI4MDIxMTsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJaW50IE5TdGF0dXM7CiAKLQkvLyBDaGVjayB0aGUgdG90YWwgc2NhbiB0cmllcyBmb3Igb25lIHNpbmdsZSBPSUQgY29tbWFuZAotCS8vIElmIHRoaXMgaXMgdGhlIENDWCAyLjAgQ2FzZSwgc2tpcCB0aGF0IQotCWlmICggIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKKwkvKiBDaGVjayB0aGUgdG90YWwgc2NhbiB0cmllcyBmb3Igb25lIHNpbmdsZSBPSUQgY29tbWFuZCAqLworCS8qIElmIHRoaXMgaXMgdGhlIENDWCAyLjAgQ2FzZSwgc2tpcCB0aGF0ISAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbiBiZWZvcmUgU3RhcnR1cFxuIikpOwogCQlyZXR1cm47CiAJfQotCi0JLy8gSW5jcmVhc2UgdGhlIHNjYW4gcmV0cnkgY291bnRlcnMuCisJLyogSW5jcmVhc2UgdGhlIHNjYW4gcmV0cnkgY291bnRlcnMuICovCiAJcEFkLT5TdGFDZmcuU2NhbkNudCsrOwogCi0jaWZkZWYgUlQyODYwCi0gICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpICYmCi0gICAgICAgIChJRExFX09OKHBBZCkpICYmCi0JCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSAmJgorCSAgICAoSURMRV9PTihwQWQpKSAmJgorCSAgICAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCisJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkgeworCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKSB7CisJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwKKwkJCQkJICAgICAweDAyKTsKKwkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKKwkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUFNNIC0gSXNzdWUgV2FrZSB1cCBjb21tYW5kIFxuIikpOworCQl9IGVsc2UgeworCQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKKwkJfQogCX0KLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JLy8gZmlyc3QgY2hlY2sgdGhlIHBhcmFtZXRlciBzYW5pdHkKKwkvKiBmaXJzdCBjaGVjayB0aGUgcGFyYW1ldGVyIHNhbml0eSAqLwogCWlmIChNbG1lU2NhblJlcVNhbml0eShwQWQsCi0JCQkJCQkgIEVsZW0tPk1zZywKLQkJCQkJCSAgRWxlbS0+TXNnTGVuLAotCQkJCQkJICAmQnNzVHlwZSwKLQkJCQkJCSAgU3NpZCwKLQkJCQkJCSAgJlNzaWRMZW4sCi0JCQkJCQkgICZTY2FuVHlwZSkpCi0JeworCQkJICAgICAgRWxlbS0+TXNnLAorCQkJICAgICAgRWxlbS0+TXNnTGVuLAorCQkJICAgICAgJkJzc1R5cGUsIChjaGFyICopU3NpZCwgJlNzaWRMZW4sICZTY2FuVHlwZSkpIHsKIAotCQkvLyBDaGVjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0IHJlcXVlc3QKLQkJLy8gU3VzcGVuZCBNU0RVIG9ubHkgYXQgc2NhbiByZXF1ZXN0LCBub3QgdGhlIGxhc3QgdHdvIG1lbnRpb25lZAotCQlpZiAoKFNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRCkpCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hTY2FuQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCVJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbihwQWQpOwkJCS8vIFN1c3BlbmQgTVNEVSB0cmFuc21pc3Npb24gaGVyZQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiBoZXJlCi0JCQlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24ocEFkKTsKLQkJfQorCQkvKiBDaGVjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0IHJlcXVlc3QgKi8KKwkJLyogU3VzcGVuZCBNU0RVIG9ubHkgYXQgc2NhbiByZXF1ZXN0LCBub3QgdGhlIGxhc3QgdHdvIG1lbnRpb25lZCAqLworCQkvKiBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUgKi8KKwkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7CiAKLQkJLy8KLQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCi0JCS8vIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLgotCQkvLyBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZQotCQkvLwotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKLQkJewotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7Ci0JCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKKwkJLyogKi8KKwkJLyogVG8gcHJldmVudCBkYXRhIGxvc3QuICovCisJCS8qIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLiAqLworCQkvKiBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZSAqLworCQkvKiAqLworCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpCisJCSAgICAmJiAoSU5GUkFfT04ocEFkKSkpIHsKKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAodm9pZCAqKSYgcE91dEJ1ZmZlcik7CisJCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKSB7CisJCQkJcEhkcjgwMjExID0gKHN0cnVjdCBydF9oZWFkZXJfODAyXzExICopIHBPdXRCdWZmZXI7CisJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwKKwkJCQkJCSBTVUJUWVBFX05VTExfRlVOQywgMSwKKwkJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwKKwkJCQkJCSBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CiAJCQkJcEhkcjgwMjExLT5EdXJhdGlvbiA9IDA7CiAJCQkJcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKIAkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKIAotCQkJCS8vIFNlbmQgdXNpbmcgcHJpb3JpdHkgcXVldWUKLQkJCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKKwkJCQkvKiBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlICovCisJCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLAorCQkJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZSBmb3Igb2ZmIGNoYW5uZWwgUk1cbiIpKTsKIAkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CiAJCQl9CkBAIC0yOTAsMzggKzI2MiwzMiBAQAogCiAJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CiAJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwkJLyogcmVzZXQgYWxsIHRoZSB0aW1lcnMgKi8KIAkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7CiAJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAotCQkvLyByZWNvcmQgZGVzaXJlZCBCU1MgcGFyYW1ldGVycworCQkvKiByZWNvcmQgZGVzaXJlZCBCU1MgcGFyYW1ldGVycyAqLwogCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7CiAJCXBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9IFNjYW5UeXBlOwogCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOworCQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKIAkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOwogCi0JCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGNoYW5uZWwKKwkJLyogc3RhcnQgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbCAqLwogCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOwogCi0JCS8vIENoYW5nZSB0aGUgc2NhbiBjaGFubmVsIHdoZW4gZGVhbGluZyB3aXRoIENDWCBiZWFjb24gcmVwb3J0Ci0JCWlmICgoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fCAoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8Ci0JCQkoU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpIHx8IChTY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSkKLQkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWw7Ci0KLQkJLy8gTGV0IEJCUCByZWdpc3RlciBhdCAyME1IeiB0byBkbyBzY2FuCisJCS8qIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbiAqLwogCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CiAJCUJCUFZhbHVlICY9ICh+MHgxOCk7CiAJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7CiAJCVNjYW5OZXh0Q2hhbm5lbChwQWQpOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCURCR1BSSU5UX0VSUigoIlNZTkMgLSBNbG1lU2NhblJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsXG4iKSk7CiAJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJCVN0YXR1cyA9IE1MTUVfSU5WQUxJRF9GT1JNQVQ7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOworCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOwogCX0KIH0KIApAQCAtMzMxLDQ5ICsyOTcsNDcgQEAKIAkJTUxNRSBKT0lOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBNbG1lSm9pblJlcUFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7Ci0JVUNIQVIgICAgICAgIEJCUFZhbHVlID0gMDsKLQlCU1NfRU5UUlkgICAgKnBCc3M7Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlIRUFERVJfODAyXzExIEhkcjgwMjExOwotCU5ESVNfU1RBVFVTICAgTlN0YXR1czsKLQlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBVQ0hBUiAgICAgICAgcFN1cFJhdGUgPSBOVUxMOwotCVVDSEFSICAgICAgICAgU3VwUmF0ZUxlbjsKLQlQVUNIQVIgICAgICAgIHBFeHRSYXRlID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgICBBU3VwUmF0ZVtdID0gezB4OEMsIDB4MTIsIDB4OTgsIDB4MjQsIDB4YjAsIDB4NDgsIDB4NjAsIDB4NkN9OwotCVVDSEFSICAgICAgICAgQVN1cFJhdGVMZW4gPSBzaXplb2YoQVN1cFJhdGUpL3NpemVvZihVQ0hBUik7Ci0JTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKnBJbmZvID0gKE1MTUVfSk9JTl9SRVFfU1RSVUNUICopKEVsZW0tPk1zZyk7CisJdTggQkJQVmFsdWUgPSAwOworCXN0cnVjdCBydF9ic3NfZW50cnkgKnBCc3M7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwlzdHJ1Y3QgcnRfaGVhZGVyXzgwMl8xMSBIZHI4MDIxMTsKKwlpbnQgTlN0YXR1czsKKwl1bnNpZ25lZCBsb25nIEZyYW1lTGVuID0gMDsKKwl1OCAqcE91dEJ1ZmZlciA9IE5VTEw7CisJdTggKnBTdXBSYXRlID0gTlVMTDsKKwl1OCBTdXBSYXRlTGVuOworCXU4ICpwRXh0UmF0ZSA9IE5VTEw7CisJdTggRXh0UmF0ZUxlbjsKKwl1OCBBU3VwUmF0ZVtdID0geyAweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDIH07CisJdTggQVN1cFJhdGVMZW4gPSBzaXplb2YoQVN1cFJhdGUpIC8gc2l6ZW9mKHU4KTsKKwlzdHJ1Y3QgcnRfbWxtZV9qb2luX3JlcSAqcEluZm8gPSAoc3RydWN0IHJ0X21sbWVfam9pbl9yZXEgKikoRWxlbS0+TXNnKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBNbG1lSm9pblJlcUFjdGlvbihCU1MgIyVsZClcbiIsIHBJbmZvLT5Cc3NJZHgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiU1lOQyAtIE1sbWVKb2luUmVxQWN0aW9uKEJTUyAjJWxkKVxuIiwgcEluZm8tPkJzc0lkeCkpOwogCi0jaWZkZWYgUlQyODYwCi0gICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FEVkFOQ0VfUE9XRVJfU0FWRV9QQ0lFX0RFVklDRSkpICYmCi0gICAgICAgIChJRExFX09OKHBBZCkpICYmCi0JCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCXsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSAmJgorCSAgICAoSURMRV9PTihwQWQpKSAmJgorCSAgICAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpICYmCisJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkgewogCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOwogCX0KLSNlbmRpZgorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLwogCi0JLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKKwkvKiByZXNldCBhbGwgdGhlIHRpbWVycyAqLwogCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAogCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbcEluZm8tPkJzc0lkeF07CiAKLQkvLyByZWNvcmQgdGhlIGRlc2lyZWQgU1NJRCAmIEJTU0lEIHdlJ3JlIHdhaXRpbmcgZm9yCisJLyogcmVjb3JkIHRoZSBkZXNpcmVkIFNTSUQgJiBCU1NJRCB3ZSdyZSB3YWl0aW5nIGZvciAqLwogCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQnNzLT5Cc3NpZCk7CiAKLQkvLyBJZiBBUCdzIFNTSUQgaXMgbm90IGhpZGRlbiwgaXQgaXMgT0sgZm9yIHVwZGF0aW5nIHNzaWQgdG8gTWxtZUF1eCBhZ2Fpbi4KLQlpZiAocEJzcy0+SGlkZGVuID09IDApCi0JeworCS8qIElmIEFQJ3MgU1NJRCBpcyBub3QgaGlkZGVuLCBpdCBpcyBPSyBmb3IgdXBkYXRpbmcgc3NpZCB0byBNbG1lQXV4IGFnYWluLiAqLworCWlmIChwQnNzLT5IaWRkZW4gPT0gMCkgeworCQlSVE1QWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKIAkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4pOwogCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBCc3MtPlNzaWRMZW47CiAJfQpAQCAtMzgyLDg4ICszNDYsODcgQEAKIAlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBCc3MtPkNoYW5uZWw7CiAJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEJzcy0+Q2VudHJhbENoYW5uZWw7CiAKLQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KKwkvKiBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4gKi8KIAlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7CiAJQkJQVmFsdWUgJj0gKH4weDE4KTsKIAlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7CisKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQkJQIFI0IHRvIDIwTUh6LmxcbiIpKTsKIAotCS8vIHN3aXRjaCBjaGFubmVsIGFuZCB3YWl0aW5nIGZvciBiZWFjb24gdGltZXIKKwkvKiBzd2l0Y2ggY2hhbm5lbCBhbmQgd2FpdGluZyBmb3IgYmVhY29uIHRpbWVyICovCiAJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOwogCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgSk9JTl9USU1FT1VUKTsKIAotICAgIGRvCi0JeworCWRvIHsKIAkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKLSAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgotICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQotICAgICAgICAgICAgKQotCQl7Ci0JCQkvLwotCQkJLy8gV2UgY2FuJ3Qgc2VuZCBhbnkgUHJvYmUgcmVxdWVzdCBmcmFtZSB0byBtZWV0IDgwMi4xMWguCi0JCQkvLworCQkgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgorCQkgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQorCQkgICAgKSB7CisJCQkvKiAqLworCQkJLyogV2UgY2FuJ3Qgc2VuZCBhbnkgUHJvYmUgcmVxdWVzdCBmcmFtZSB0byBtZWV0IDgwMi4xMWguICovCisJCQkvKiAqLwogCQkJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQogCQkJCWJyZWFrOwogCQl9Ci0KLQkJLy8KLQkJLy8gc2VuZCBwcm9iZSByZXF1ZXN0Ci0JCS8vCisJCS8qICovCisJCS8qIHNlbmQgcHJvYmUgcmVxdWVzdCAqLworCQkvKiAqLwogCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCQlpZiAoTlN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCQl7CisJCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA8PSAxNCkgewogCQkJCXBTdXBSYXRlID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZTsKIAkJCQlTdXBSYXRlTGVuID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbjsKIAkJCQlwRXh0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGU7CiAJCQkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8KLQkJCQkvLyBPdmVyd3JpdGUgU3VwcG9ydCBSYXRlLCBDQ0sgcmF0ZSBhcmUgbm90IGFsbG93ZWQKLQkJCQkvLworCQkJfSBlbHNlIHsKKwkJCQkvKiAqLworCQkJCS8qIE92ZXJ3cml0ZSBTdXBwb3J0IFJhdGUsIENDSyByYXRlIGFyZSBub3QgYWxsb3dlZCAqLworCQkJCS8qICovCiAJCQkJcFN1cFJhdGUgPSBBU3VwUmF0ZTsKIAkJCQlTdXBSYXRlTGVuID0gQVN1cFJhdGVMZW47CiAJCQkJRXh0UmF0ZUxlbiA9IDA7CiAJCQl9CiAKIAkJCWlmIChwQWQtPk1sbWVBdXguQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZIZHI4MDIxMSwgU1VCVFlQRV9QUk9CRV9SRVEsIDAsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkJzc2lkKTsKKwkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLAorCQkJCQkJIFNVQlRZUEVfUFJPQkVfUkVRLCAwLAorCQkJCQkJIHBBZC0+TWxtZUF1eC5Cc3NpZCwKKwkJCQkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOwogCQkJZWxzZQotCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsCisJCQkJCQkgU1VCVFlQRV9QUk9CRV9SRVEsIDAsCisJCQkJCQkgQlJPQURDQVNUX0FERFIsCisJCQkJCQkgQlJPQURDQVNUX0FERFIpOwogCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkJICBwQWQtPk1sbWVBdXguU3NpZExlbiwJICAgIHBBZC0+TWxtZUF1eC5Tc2lkLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIFN1cFJhdGVMZW4sICAgICAgICAgICAgICAgcFN1cFJhdGUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkhkcjgwMjExLAorCQkJCQkgIDEsICZTc2lkSWUsCisJCQkJCSAgMSwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAorCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkLCAxLCAmU3VwUmF0ZUllLCAxLAorCQkJCQkgICZTdXBSYXRlTGVuLCBTdXBSYXRlTGVuLCBwU3VwUmF0ZSwKKwkJCQkJICBFTkRfT0ZfQVJHUyk7CiAKLQkJCWlmIChFeHRSYXRlTGVuKQotCQkJewotCQkJCVVMT05HIFRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSAgRXh0UmF0ZUxlbiwgICAgICAgICAgICAgICAgICAgICAgIHBFeHRSYXRlLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCWlmIChFeHRSYXRlTGVuKSB7CisJCQkJdW5zaWduZWQgbG9uZyBUbXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmVG1wLAorCQkJCQkJICAxLCAmRXh0UmF0ZUllLAorCQkJCQkJICAxLCAmRXh0UmF0ZUxlbiwKKwkJCQkJCSAgRXh0UmF0ZUxlbiwgcEV4dFJhdGUsCisJCQkJCQkgIEVORF9PRl9BUkdTKTsKIAkJCQlGcmFtZUxlbiArPSBUbXA7CiAJCQl9CiAKLQogCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7CiAJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCQl9Ci0gICAgfSB3aGlsZSAoRkFMU0UpOworCX0gd2hpbGUgKEZBTFNFKTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBTd2l0Y2ggdG8gY2ggJWQsIFdhaXQgQkVBQ09OIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBCc3MtPkNoYW5uZWwsIHBCc3MtPkJzc2lkWzBdLCBwQnNzLT5Cc3NpZFsxXSwgcEJzcy0+QnNzaWRbMl0sIHBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiU1lOQyAtIFN3aXRjaCB0byBjaCAlZCwgV2FpdCBCRUFDT04gZnJvbSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJICBwQnNzLT5DaGFubmVsLCBwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLAorCQkgIHBCc3MtPkJzc2lkWzNdLCBwQnNzLT5Cc3NpZFs0XSwgcEJzcy0+QnNzaWRbNV0pKTsKIAogCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBKT0lOX1dBSVRfQkVBQ09OOwogfQpAQCAtNDc0LDk1ICs0MzcsMTEwIEBACiAJCU1MTUUgU1RBUlQgUmVxdWVzdCBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZSwgc3RhcnRpbmcgYW4gSUJTUwogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgTWxtZVN0YXJ0UmVxQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbjsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOworCXU4IFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgU3NpZExlbjsKKwlCT09MRUFOIFRpbWVyQ2FuY2VsbGVkOwogCi0JLy8gTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzCi0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07IAkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JTEFSR0VfSU5URUdFUgkJCQlUaW1lU3RhbXA7CisJLyogTmV3IGZvciBXUEEgc2VjdXJpdHkgc3VpdGVzICovCisJdTggVmFySUVbTUFYX1ZJRV9MRU5dOwkvKiBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNSAqLworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUgPSBOVUxMOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOwogCUJPT0xFQU4gUHJpdmFjeTsKLQlVU0hPUlQgU3RhdHVzOworCXUxNiBTdGF0dXM7CiAKLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJLyogSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUgKi8KKwlwVklFID0gKHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKilWYXJJRTsKIAlwVklFLT5MZW5ndGggPSAwOwotCVRpbWVTdGFtcC51Lkxvd1BhcnQgID0gMDsKKwlUaW1lU3RhbXAudS5Mb3dQYXJ0ID0gMDsKIAlUaW1lU3RhbXAudS5IaWdoUGFydCA9IDA7CiAKLQlpZiAoTWxtZVN0YXJ0UmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIFNzaWQsICZTc2lkTGVuKSkKLQl7Ci0JCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCisJaWYgKE1sbWVTdGFydFJlcVNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgKGNoYXIgKilTc2lkLCAmU3NpZExlbikpIHsKKwkJLyogcmVzZXQgYWxsIHRoZSB0aW1lcnMgKi8KIAkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwogCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKIAotCQkvLwotCQkvLyBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4KLQkJLy8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uIFxuIikpOwotCQlwQWQtPk1sbWVBdXguQnNzVHlwZSAgICAgICAgICAgPSBCU1NfQURIT0M7CisJCS8qICovCisJCS8qIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiAqLworCQkvKiAqLworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIFN0YXJ0IGEgbmV3IElCU1MuIEFsbCBJQlNTIHBhcmFtZXRlcnMgYXJlIGRlY2lkZWQgbm93Li4uLiBcbiIpKTsKKwkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCU1NfQURIT0M7CiAJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gICAgICAgICAgID0gU3NpZExlbjsKKwkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwogCi0JCS8vIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lECisJCS8qIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lEICovCiAJCU1hY0FkZHJSYW5kb21Cc3NpZChwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lEIFxuIikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1sbWVTdGFydFJlcUFjdGlvbiAtIGdlbmVyYXRlIGEgcmFkb20gbnVtYmVyIGFzIEJTU0lEIFxuIikpOwogCi0JCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8Ci0JCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOwotCQlwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8gICAgPSBDQVBfR0VORVJBVEUoMCwxLFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDEsIDApOwotCQlwQWQtPk1sbWVBdXguQmVhY29uUGVyaW9kICAgICAgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7Ci0JCXBBZC0+TWxtZUF1eC5BdGltV2luICAgICAgICAgICA9IHBBZC0+U3RhQ2ZnLkF0aW1XaW47Ci0JCXBBZC0+TWxtZUF1eC5DaGFubmVsICAgICAgICAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCVByaXZhY3kgPQorCQkgICAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQorCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkgICAgfHwgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKKwkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0KKwkJICAgIENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LAorCQkJCSAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PQorCQkJCSAgUnQ4MDJfMTFQcmVhbWJsZVNob3J0KSwgMSwgMCk7CisJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2Q7CisJCXBBZC0+TWxtZUF1eC5BdGltV2luID0gcEFkLT5TdGFDZmcuQXRpbVdpbjsKKwkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwogCi0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOworCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7CisJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwogCi0JCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlLAorCQkJICAgICAgIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCSAgICAgICAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOwogCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7CisJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAorCQkJICAgICAgIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKKwkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguRXh0UmF0ZSwKKwkJCSAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwogCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCXsKLQkJCVJUTVBVcGRhdGVIVElFKCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZwQWQtPk1sbWVBdXguQWRkSHRJbmZvKTsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0JCQkvLyBOb3QgdHVybiBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFIGhlcmUuCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC1wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFXG4iKSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpIHsKKwkJCVJUTVBVcGRhdGVIVElFKCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksCisJCQkJICAgICAgICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFswXSwKKwkJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJICAgICAgICZwQWQtPk1sbWVBdXguQWRkSHRJbmZvKTsKKwkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpOworCQkJLyogTm90IHR1cm4gcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRSBoZXJlLiAqLworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiU1lOQyAtcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuYkh0RW5hYmxlID0gVFJVRVxuIikpOworCQl9IGVsc2UgewogCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CiAJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJICAgICAgIE1DU1NldFswXSwgMTYpOwogCQl9Ci0JCS8vIHRlbXBvcmFyaWx5IG5vdCBzdXBwb3J0IFFPUyBpbiBJQlNTCi0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKKwkJLyogdGVtcG9yYXJpbHkgbm90IHN1cHBvcnQgUU9TIGluIElCU1MgKi8KKwkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLCBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSkpOworCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0pKTsKIAogCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBGQUxTRSk7CiAJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVN0YXJ0UmVxQWN0aW9uKGNoPSAlZCxzdXAgcmF0ZXM9ICVkLCBleHQgcmF0ZXM9JWQpXG4iLAotCQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwsIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlNZTkMgLSBNbG1lU3RhcnRSZXFBY3Rpb24oY2g9ICVkLHN1cCByYXRlcz0gJWQsIGV4dCByYXRlcz0lZClcbiIsCisJCQkgIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKIAogCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKLQl9Ci0JZWxzZQotCXsKKwkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NUQVJUX0NPTkYsIDIsCisJCQkgICAgJlN0YXR1cyk7CisJfSBlbHNlIHsKIAkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOwogCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CisJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLAorCQkJICAgICZTdGF0dXMpOwogCX0KIH0KIApAQCAtNTcyLDEyNiArNTUwLDExNiBAQAogCQlwZWVyIHNlbmRzIGJlYWNvbiBiYWNrIHdoZW4gc2Nhbm5pbmcKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJCZWFjb25BdFNjYW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLAotCQkJCQlTc2lkTGVuLCBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTWVzc2FnZVRvTWU7Ci0JQ0ZfUEFSTSAgICAgICAgIENmUGFybTsKLQlVU0hPUlQgICAgICAgICAgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKLQlQRlJBTUVfODAyXzExICAgcEZyYW1lOwotCUxBUkdFX0lOVEVHRVIgICBUaW1lU3RhbXA7Ci0JVUNIQVIgICAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIAlTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIJCSAgCVN1cFJhdGVMZW4sIEV4dFJhdGVMZW47Ci0JVVNIT1JUIAkJCUxlblZJRTsKLQlVQ0hBUgkJCUNraXBGbGFnOwotCVVDSEFSCQkJQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVMT05HCQkJCQkJUmFsaW5rSWU7Ci0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCUFERF9IVF9JTkZPX0lFCQlBZGRIdEluZm87CS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuID0gMCwgUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwl1OCBCc3NpZFtNQUNfQUREUl9MRU5dLCBBZGRyMltNQUNfQUREUl9MRU5dOworCXU4IFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKKwkgICAgU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOworCXN0cnVjdCBydF9jZl9wYXJtIENmUGFybTsKKwl1MTYgQmVhY29uUGVyaW9kLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbzsKKwlzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICogcEZyYW1lOworCUxBUkdFX0lOVEVHRVIgVGltZVN0YW1wOworCXU4IEVycDsKKwl1OCBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwKKwkgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107CisJdTggU3VwUmF0ZUxlbiwgRXh0UmF0ZUxlbjsKKwl1MTYgTGVuVklFOworCXU4IENraXBGbGFnOworCXU4IEFpcm9uZXRDZWxsUG93ZXJMaW1pdDsKKwlzdHJ1Y3QgcnRfZWRjYV9wYXJtIEVkY2FQYXJtOworCXN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSBRYnNzTG9hZDsKKwlzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSBRb3NDYXBhYmlsaXR5OworCXVuc2lnbmVkIGxvbmcgUmFsaW5rSWU7CisJdTggVmFySUVbTUFYX1ZJRV9MRU5dOwkvKiBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNSAqLworCXN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKnBWSUUgPSBOVUxMOworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSHRJbmZvOwkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwl1OCBIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwl1OCBBZGRIdEluZm9MZW47CisJdTggTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CiAKLQlwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSkgRWxlbS0+TXNnOwotCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCi0JcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKKwkvKiBOZGlzRmlsbE1lbW9yeShTc2lkLCBNQVhfTEVOX09GX1NTSUQsIDB4MDApOyAqLworCXBGcmFtZSA9IChzdHJ1Y3QgcnRfZnJhbWVfODAyXzExICopIEVsZW0tPk1zZzsKKwkvKiBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZSAqLworCXBWSUUgPSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3ZhcmlhYmxlX2llcyAqKVZhcklFOwogCXBWSUUtPkxlbmd0aCA9IDA7CiAKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7CisJUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOworCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUpKTsKIAogCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQlTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmUGFybSwKLQkJCQkJCQkJJkF0aW1XaW4sCi0JCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkJJkVycCwKLQkJCQkJCQkJJkR0aW1Db3VudCwKLQkJCQkJCQkJJkR0aW1QZXJpb2QsCi0JCQkJCQkJCSZCY2FzdEZsYWcsCi0JCQkJCQkJCSZNZXNzYWdlVG9NZSwKLQkJCQkJCQkJU3VwUmF0ZSwKLQkJCQkJCQkJJlN1cFJhdGVMZW4sCi0JCQkJCQkJCUV4dFJhdGUsCi0JCQkJCQkJCSZFeHRSYXRlTGVuLAotCQkJCQkJCQkmQ2tpcEZsYWcsCi0JCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JCQkJCQkJCSZFZGNhUGFybSwKLQkJCQkJCQkJJlFic3NMb2FkLAotCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCQkJJlJhbGlua0llLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCi0JCQkJCQkJCSZMZW5WSUUsCi0JCQkJCQkJCXBWSUUpKQotCXsKLQkJVUxPTkcgSWR4OwotCQlDSEFSIFJzc2kgPSAwOworCQkJCQlFbGVtLT5Nc2csCisJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJQWRkcjIsCisJCQkJCUJzc2lkLAorCQkJCQkoY2hhciAqKVNzaWQsCisJCQkJCSZTc2lkTGVuLAorCQkJCQkmQnNzVHlwZSwKKwkJCQkJJkJlYWNvblBlcmlvZCwKKwkJCQkJJkNoYW5uZWwsCisJCQkJCSZOZXdDaGFubmVsLAorCQkJCQkmVGltZVN0YW1wLAorCQkJCQkmQ2ZQYXJtLAorCQkJCQkmQXRpbVdpbiwKKwkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkmRXJwLAorCQkJCQkmRHRpbUNvdW50LAorCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJJkJjYXN0RmxhZywKKwkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQlTdXBSYXRlLAorCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJRXh0UmF0ZSwKKwkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCSZDa2lwRmxhZywKKwkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJJkVkY2FQYXJtLAorCQkJCQkmUWJzc0xvYWQsCisJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkmUmFsaW5rSWUsCisJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkxlblZJRSwgcFZJRSkpIHsKKwkJdW5zaWduZWQgbG9uZyBJZHg7CisJCWNoYXIgUnNzaSA9IDA7CiAKIAkJSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsIENoYW5uZWwpOwogCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCiAJCQlSc3NpID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUnNzaTsKIAotCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTAsIFJTU0lfMCksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKKwkJUnNzaSA9CisJCSAgICBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwKKwkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCisJCQkJQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpKTsKIAogCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCiAJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKIAotCQlpZiAoKHBBZC0+U3RhQ2ZnLkNDWFJlcVR5cGUgIT0gTVNSTl9UWVBFX1VOVVNFRCkgJiYgKENoYW5uZWwgPT0gcEFkLT5TdGFDZmcuQ0NYU2NhbkNoYW5uZWwpKQotCQl7Ci0JCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKLQkJCQkJCSAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbixFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAotCQkJCQkJICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLAotCQkJCQkJICZFZGNhUGFybSwgJlFvc0NhcGFiaWxpdHksICZRYnNzTG9hZCwgTGVuVklFLCBwVklFKTsKLQkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5DQ1hCc3NUYWIuQnNzRW50cnlbSWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLkNDWEJzc1RhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuQ0NYQnNzVGFiLkJzc0VudHJ5W0lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJCWlmIChwQWQtPlN0YUNmZy5DQ1hSZXFUeXBlID09IE1TUk5fVFlQRV9CRUFDT05fUkVRKQotCQkJCQlBaXJvbmV0QWRkQmVhY29uUmVwb3J0KHBBZCwgSWR4LCBFbGVtKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCUlkeCA9IEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLAotCQkJCQkJICAmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgICZIdENhcGFiaWxpdHksCi0JCQkJCQkgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCi0JCQkJCQkgJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOworCQlJZHggPQorCQkgICAgQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCAoY2hhciAqKVNzaWQsCisJCQkJICAgICBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsICZDZlBhcm0sCisJCQkJICAgICBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwKKwkJCQkgICAgIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCisJCQkJICAgICAmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sCisJCQkJICAgICBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsCisJCQkJICAgICBSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sCisJCQkJICAgICAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwogCi0JCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCX0KKwkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKSB7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5QVFNGLAorCQkJCSAgICAgICAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uVFRTRlswXSwKKwkJCQkgICAgICAgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbNF0sCisJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKIAkJfQorCiAJfQotCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmVkCisJLyogc2FuaXR5IGNoZWNrIGZhaWwsIGlnbm9yZWQgKi8KIH0KIAogLyoKQEAgLTcwMCwxMzQgKzY2OCwyMDcgQEAKIAkJV2hlbiB3YWl0aW5nIGpvaW5pbmcgdGhlIChJKUJTUywgYmVhY29uIHJlY2VpdmVkIGZyb20gZXh0ZXJuYWwKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIFBlZXJCZWFjb25BdEpvaW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIEJzc1R5cGUsIENoYW5uZWwsIE1lc3NhZ2VUb01lLAotCQkJCSAgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE5ld0NoYW5uZWw7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwl1OCBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIEJzc1R5cGUsIENoYW5uZWwsIE1lc3NhZ2VUb01lLAorCSAgICBEdGltQ291bnQsIER0aW1QZXJpb2QsIEJjYXN0RmxhZywgTmV3Q2hhbm5lbDsKIAlMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcDsKLQlVU0hPUlQgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87Ci0JQ0ZfUEFSTSAgICAgICBDZjsKLQlCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCVVDSEFSICAgICAgICAgRXJwOwotCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgICBDa2lwRmxhZzsKLQlVU0hPUlQgCQkgIExlblZJRTsKLQlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7Ci0JRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOwotCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKLQlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7Ci0JVVNIT1JUICAgICAgICBTdGF0dXM7Ci0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICAgIFJhbGlua0llOwotCVVMT05HICAgICAgICAgSWR4OwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotCVVDSEFSCQkJQ2VudHJhbENoYW5uZWw7CisJdTE2IEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87CisJc3RydWN0IHJ0X2NmX3Bhcm0gQ2Y7CisJQk9PTEVBTiBUaW1lckNhbmNlbGxlZDsKKwl1OCBFcnA7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sCisJICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJdTggQ2tpcEZsYWc7CisJdTE2IExlblZJRTsKKwl1OCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJc3RydWN0IHJ0X2VkY2FfcGFybSBFZGNhUGFybTsKKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gUWJzc0xvYWQ7CisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gUW9zQ2FwYWJpbGl0eTsKKwl1MTYgU3RhdHVzOworCXU4IFZhcklFW01BWF9WSUVfTEVOXTsJLyogVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIFJhbGlua0llOworCXVuc2lnbmVkIGxvbmcgSWR4OworCXN0cnVjdCBydF9odF9jYXBhYmlsaXR5X2llIEh0Q2FwYWJpbGl0eTsKKwlzdHJ1Y3QgcnRfYWRkX2h0X2luZm9faWUgQWRkSHRJbmZvOwkvKiBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUgKi8KKwl1OCBIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKKwl1OCBBZGRIdEluZm9MZW47CisJdTggTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJdTggQ2VudHJhbENoYW5uZWw7CisJQk9PTEVBTiBiQWxsb3dOcmF0ZSA9IEZBTFNFOwogCi0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOworCS8qIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlICovCisJcFZJRSA9IChzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICopVmFySUU7CiAJcFZJRS0+TGVuZ3RoID0gMDsKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KKwlSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCiAJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCi0JCQkJCQkJCUVsZW0tPk1zZywKLQkJCQkJCQkJRWxlbS0+TXNnTGVuLAotCQkJCQkJCQlFbGVtLT5DaGFubmVsLAotCQkJCQkJCQlBZGRyMiwKLQkJCQkJCQkJQnNzaWQsCi0JCQkJCQkJCVNzaWQsCi0JCQkJCQkJCSZTc2lkTGVuLAotCQkJCQkJCQkmQnNzVHlwZSwKLQkJCQkJCQkJJkJlYWNvblBlcmlvZCwKLQkJCQkJCQkJJkNoYW5uZWwsCi0JCQkJCQkJCSZOZXdDaGFubmVsLAotCQkJCQkJCQkmVGltZVN0YW1wLAotCQkJCQkJCQkmQ2YsCi0JCQkJCQkJCSZBdGltV2luLAotCQkJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJCSZFcnAsCi0JCQkJCQkJCSZEdGltQ291bnQsCi0JCQkJCQkJCSZEdGltUGVyaW9kLAotCQkJCQkJCQkmQmNhc3RGbGFnLAotCQkJCQkJCQkmTWVzc2FnZVRvTWUsCi0JCQkJCQkJCVN1cFJhdGUsCi0JCQkJCQkJCSZTdXBSYXRlTGVuLAotCQkJCQkJCQlFeHRSYXRlLAotCQkJCQkJCQkmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkNraXBGbGFnLAotCQkJCQkJCQkmQWlyb25ldENlbGxQb3dlckxpbWl0LAotCQkJCQkJCQkmRWRjYVBhcm0sCi0JCQkJCQkJCSZRYnNzTG9hZCwKLQkJCQkJCQkJJlFvc0NhcGFiaWxpdHksCi0JCQkJCQkJCSZSYWxpbmtJZSwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJlByZU5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCSZBZGRIdEluZm9MZW4sCi0JCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCSZOZXdFeHRDaGFubmVsT2Zmc2V0LAotCQkJCQkJCQkmTGVuVklFLAotCQkJCQkJCQlwVklFKSkKLQl7Ci0JCS8vIERpc3F1YWxpZnkgMTFiIG9ubHkgYWRob2Mgd2hlbiB3ZSBhcmUgaW4gMTFnIG9ubHkgYWRob2MgbW9kZQotCQlpZiAoKEJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKSAmJiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbik8IDEyKSkKKwkJCQkJRWxlbS0+TXNnLAorCQkJCQlFbGVtLT5Nc2dMZW4sCisJCQkJCUVsZW0tPkNoYW5uZWwsCisJCQkJCUFkZHIyLAorCQkJCQlCc3NpZCwKKwkJCQkJKGNoYXIgKilTc2lkLAorCQkJCQkmU3NpZExlbiwKKwkJCQkJJkJzc1R5cGUsCisJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCSZDaGFubmVsLAorCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJJkNmLAorCQkJCQkmQXRpbVdpbiwKKwkJCQkJJkNhcGFiaWxpdHlJbmZvLAorCQkJCQkmRXJwLAorCQkJCQkmRHRpbUNvdW50LAorCQkJCQkmRHRpbVBlcmlvZCwKKwkJCQkJJkJjYXN0RmxhZywKKwkJCQkJJk1lc3NhZ2VUb01lLAorCQkJCQlTdXBSYXRlLAorCQkJCQkmU3VwUmF0ZUxlbiwKKwkJCQkJRXh0UmF0ZSwKKwkJCQkJJkV4dFJhdGVMZW4sCisJCQkJCSZDa2lwRmxhZywKKwkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKKwkJCQkJJkVkY2FQYXJtLAorCQkJCQkmUWJzc0xvYWQsCisJCQkJCSZRb3NDYXBhYmlsaXR5LAorCQkJCQkmUmFsaW5rSWUsCisJCQkJCSZIdENhcGFiaWxpdHlMZW4sCisJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkmQWRkSHRJbmZvTGVuLAorCQkJCQkmQWRkSHRJbmZvLAorCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkxlblZJRSwgcFZJRSkpIHsKKwkJLyogRGlzcXVhbGlmeSAxMWIgb25seSBhZGhvYyB3aGVuIHdlIGFyZSBpbiAxMWcgb25seSBhZGhvYyBtb2RlICovCisJCWlmICgoQnNzVHlwZSA9PSBCU1NfQURIT0MpCisJCSAgICAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFHKQorCQkgICAgJiYgKChTdXBSYXRlTGVuICsgRXh0UmF0ZUxlbikgPCAxMikpCiAJCQlyZXR1cm47CiAKLQkJLy8gQkVBQ09OIGZyb20gZGVzaXJlZCBCU1MvSUJTUyBmb3VuZC4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gZGVjaWRlIG1vc3QKLQkJLy8gQlNTIHBhcmFtZXRlcnMgaGVyZS4KLQkJLy8gUS4gQnV0IHdoYXQgaGFwcGVuIGlmIHRoaXMgSk9JTiBkb2Vzbid0IGNvbmNsdWRlIGEgc3VjY2Vzc2Z1bCBBU1NPQ0lBVEVJT04/Ci0JCS8vICAgIERvIHdlIG5lZWQgdG8gcmVjZW92ZXIgYmFjayBhbGwgcGFyYW1ldGVycyBiZWxvbmdpbmcgdG8gcHJldmlvdXMgQlNTPwotCQkvLyBBLiBTaG91bGQgYmUgbm90LiBUaGVyZSdzIG5vIGJhY2stZG9vciByZWNvdmVyIHRvIHByZXZpb3VzIEFQLiBJdCBzdGlsbCBuZWVkCi0JCS8vICAgIGEgbmV3IEpPSU4tQVVUSC1BU1NPQyBzZXF1ZW5jZS4KLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQnNzaWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gcmVjZWl2ZSBkZXNpcmVkIEJFQUNPTiBhdCBKb2luV2FpdEJlYWNvbi4uLiBDaGFubmVsID0gJWRcbiIsIENoYW5uZWwpKTsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOworCQkvKiBCRUFDT04gZnJvbSBkZXNpcmVkIEJTUy9JQlNTIGZvdW5kLiBXZSBzaG91bGQgYmUgYWJsZSB0byBkZWNpZGUgbW9zdCAqLworCQkvKiBCU1MgcGFyYW1ldGVycyBoZXJlLiAqLworCQkvKiBRLiBCdXQgd2hhdCBoYXBwZW4gaWYgdGhpcyBKT0lOIGRvZXNuJ3QgY29uY2x1ZGUgYSBzdWNjZXNzZnVsIEFTU09DSUFURUlPTj8gKi8KKwkJLyogICAgRG8gd2UgbmVlZCB0byByZWNlb3ZlciBiYWNrIGFsbCBwYXJhbWV0ZXJzIGJlbG9uZ2luZyB0byBwcmV2aW91cyBCU1M/ICovCisJCS8qIEEuIFNob3VsZCBiZSBub3QuIFRoZXJlJ3Mgbm8gYmFjay1kb29yIHJlY292ZXIgdG8gcHJldmlvdXMgQVAuIEl0IHN0aWxsIG5lZWQgKi8KKwkJLyogICAgYSBuZXcgSk9JTi1BVVRILUFTU09DIHNlcXVlbmNlLiAqLworCQlpZiAoTUFDX0FERFJfRVFVQUwocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCkpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlNZTkMgLSByZWNlaXZlIGRlc2lyZWQgQkVBQ09OIGF0IEpvaW5XYWl0QmVhY29uLi4uIENoYW5uZWwgPSAlZFxuIiwKKwkJCQkgIENoYW5uZWwpKTsKKwkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAorCQkJCQkmVGltZXJDYW5jZWxsZWQpOwogCi0JCQkvLyBVcGRhdGUgUlNTSSB0byBwcmV2ZW50IE5vIHNpZ25hbCBkaXNwbGF5IHdoZW4gY2FyZHMgZmlyc3QgaW5pdGlhbGl6ZWQKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSk7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMgk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTBYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPDwgMzsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPDwgMzsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOAk9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTIgPDwgMzsKKwkJCS8qIFVwZGF0ZSBSU1NJIHRvIHByZXZlbnQgTm8gc2lnbmFsIGRpc3BsYXkgd2hlbiBjYXJkcyBmaXJzdCBpbml0aWFsaXplZCAqLworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgPQorCQkJICAgIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKTsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxID0KKwkJCSAgICBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSk7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMiA9CisJCQkgICAgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kyLCBSU1NJXzIpOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCA9CisJCQkgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDggPQorCQkJICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgPDwgMzsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPQorCQkJICAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOworCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMVg4ID0KKwkJCSAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxIDw8IDM7CisJCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyID0KKwkJCSAgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMjsKKwkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTJYOCA9CisJCQkgICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA8PCAzOwogCi0JCQkvLwotCQkJLy8gV2UgbmVlZCB0byBjaGVjayBpZiBTU0lEIG9ubHkgc2V0IHRvIGFueSwgdGhlbiB3ZSBjYW4gcmVjb3JkIHRoZSBjdXJyZW50IFNTSUQuCi0JCQkvLyBPdGhlcndpc2Ugd2lsbCBjYXVzZSBoaWRkZW4gU1NJRCBhc3NvY2lhdGlvbiBmYWlsZWQuCi0JCQkvLwotCQkJaWYgKHBBZC0+TWxtZUF1eC5Tc2lkTGVuID09IDApCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsIFNzaWRMZW4pOworCQkJLyogKi8KKwkJCS8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgU1NJRCBvbmx5IHNldCB0byBhbnksIHRoZW4gd2UgY2FuIHJlY29yZCB0aGUgY3VycmVudCBTU0lELiAqLworCQkJLyogT3RoZXJ3aXNlIHdpbGwgY2F1c2UgaGlkZGVuIFNTSUQgYXNzb2NpYXRpb24gZmFpbGVkLiAqLworCQkJLyogKi8KKwkJCWlmIChwQWQtPk1sbWVBdXguU3NpZExlbiA9PSAwKSB7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIFNzaWQsCisJCQkJCSAgICAgICBTc2lkTGVuKTsKIAkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJSWR4ID0gQnNzU3NpZFRhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIENoYW5uZWwpOworCQkJfSBlbHNlIHsKKwkJCQlJZHggPQorCQkJCSAgICBCc3NTc2lkVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgQnNzaWQsCisJCQkJCQkgICAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCisJCQkJCQkgICAgICAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCisJCQkJCQkgICAgICAgQ2hhbm5lbCk7CiAKLQkJCQlpZiAoSWR4ICE9IEJTU19OT1RfRk9VTkQpCi0JCQkJewotCQkJCQkvLwotCQkJCQkvLyBNdWx0aXBsZSBTU0lEIGNhc2UsIHVzZWQgY29ycmVjdCBDYXBhYmlsaXR5SW5mbwotCQkJCQkvLwotCQkJCQlDYXBhYmlsaXR5SW5mbyA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLkNhcGFiaWxpdHlJbmZvOworCQkJCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkgeworCQkJCQljaGFyIFJzc2kgPSAwOworCQkJCQlSc3NpID0KKwkJCQkJICAgIFJUTVBNYXhSc3NpKHBBZCwKKwkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwKKwkJCQkJCQkJICAgICAgRWxlbS0+CisJCQkJCQkJCSAgICAgIFJzc2kwLAorCQkJCQkJCQkgICAgICBSU1NJXzApLAorCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLAorCQkJCQkJCQkgICAgICBFbGVtLT4KKwkJCQkJCQkJICAgICAgUnNzaTEsCisJCQkJCQkJCSAgICAgIFJTU0lfMSksCisJCQkJCQkJQ29udmVydFRvUnNzaShwQWQsCisJCQkJCQkJCSAgICAgIEVsZW0tPgorCQkJCQkJCQkgICAgICBSc3NpMiwKKwkJCQkJCQkJICAgICAgUlNTSV8yKSk7CisJCQkJCUlkeCA9CisJCQkJCSAgICBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwKKwkJCQkJCQkgICAgIEJzc2lkLAorCQkJCQkJCSAgICAgKGNoYXIgKikgU3NpZCwKKwkJCQkJCQkgICAgIFNzaWRMZW4sIEJzc1R5cGUsCisJCQkJCQkJICAgICBCZWFjb25QZXJpb2QsICZDZiwKKwkJCQkJCQkgICAgIEF0aW1XaW4sCisJCQkJCQkJICAgICBDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkgICAgIFN1cFJhdGUsCisJCQkJCQkJICAgICBTdXBSYXRlTGVuLAorCQkJCQkJCSAgICAgRXh0UmF0ZSwKKwkJCQkJCQkgICAgIEV4dFJhdGVMZW4sCisJCQkJCQkJICAgICAmSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgICAgJkFkZEh0SW5mbywKKwkJCQkJCQkgICAgIEh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJCQkgICAgIEFkZEh0SW5mb0xlbiwKKwkJCQkJCQkgICAgIE5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJICAgICBDaGFubmVsLCBSc3NpLAorCQkJCQkJCSAgICAgVGltZVN0YW1wLAorCQkJCQkJCSAgICAgQ2tpcEZsYWcsCisJCQkJCQkJICAgICAmRWRjYVBhcm0sCisJCQkJCQkJICAgICAmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJCQkgICAgICZRYnNzTG9hZCwgTGVuVklFLAorCQkJCQkJCSAgICAgcFZJRSk7CisJCQkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkgeworCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLgorCQkJCQkJCSAgICAgICBCc3NFbnRyeVtJZHhdLgorCQkJCQkJCSAgICAgICBQVFNGLAorCQkJCQkJCSAgICAgICAmRWxlbS0+TXNnWzI0XSwKKwkJCQkJCQkgICAgICAgNCk7CisJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLgorCQkJCQkJCSAgICAgICBCc3NFbnRyeVtJZHhdLgorCQkJCQkJCSAgICAgICBUVFNGWzBdLAorCQkJCQkJCSAgICAgICAmRWxlbS0+VGltZVN0YW1wLgorCQkJCQkJCSAgICAgICB1Lkxvd1BhcnQsIDQpOworCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi4KKwkJCQkJCQkgICAgICAgQnNzRW50cnlbSWR4XS4KKwkJCQkJCQkgICAgICAgVFRTRls0XSwKKwkJCQkJCQkgICAgICAgJkVsZW0tPlRpbWVTdGFtcC4KKwkJCQkJCQkgICAgICAgdS5Mb3dQYXJ0LCA0KTsKKwkJCQkJCUNhcGFiaWxpdHlJbmZvID0KKwkJCQkJCSAgICBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS4KKwkJCQkJCSAgICBDYXBhYmlsaXR5SW5mbzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qICovCisJCQkJCS8qIE11bHRpcGxlIFNTSUQgY2FzZSwgdXNlZCBjb3JyZWN0IENhcGFiaWxpdHlJbmZvICovCisJCQkJCS8qICovCisJCQkJCUNhcGFiaWxpdHlJbmZvID0KKwkJCQkJICAgIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLgorCQkJCQkgICAgQ2FwYWJpbGl0eUluZm87CiAJCQkJfQogCQkJfQogCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKKwkJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9CisJCQkgICAgQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOwogCQkJcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBCc3NUeXBlOwogCQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCA9IEJlYWNvblBlcmlvZDsKIAkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gQ2hhbm5lbDsKQEAgLTgzNiwxMDcgKzg3NywxNTkgQEAKIAkJCXBBZC0+TWxtZUF1eC5DZnBNYXhEdXJhdGlvbiA9IENmLkNmcE1heER1cmF0aW9uOwogCQkJcEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgPSBSYWxpbmtJZTsKIAotCQkJLy8gQ29weSBBUCdzIHN1cHBvcnRlZCByYXRlIHRvIE1sbWVBdXggZm9yIGNyZWF0aW5nIGFzc29pY2F0aW9uIHJlcXVlc3QKLQkJCS8vIEFsc28gZmlsdGVyIG91dCBub3Qgc3VwcG9ydGVkIHJhdGUKKwkJCS8qIENvcHkgQVAncyBzdXBwb3J0ZWQgcmF0ZSB0byBNbG1lQXV4IGZvciBjcmVhdGluZyBhc3NvaWNhdGlvbiByZXF1ZXN0ICovCisJCQkvKiBBbHNvIGZpbHRlciBvdXQgbm90IHN1cHBvcnRlZCByYXRlICovCiAJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7Ci0JCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsCisJCQkJICAgICAgIFN1cFJhdGVMZW4pOworCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwKKwkJCQkgICAgICAgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKIAkJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7CisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguRXh0UmF0ZSwgRXh0UmF0ZSwKKwkJCQkgICAgICAgRXh0UmF0ZUxlbik7CisJCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAorCQkJCSAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwogCi0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgMTYpOworCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsCisJCQkJICAgICAgIDE2KTsKKworCQkJaWYgKCgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBFbmFibGVkKQorCQkJICAgICAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkJIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQorCQkJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5IVF9EaXNhbGxvd1RLSVAgPT0gRkFMU0UpKSB7CisJCQkJYkFsbG93TnJhdGUgPSBUUlVFOworCQkJfQogCiAJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7CiAJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gSHRDYXBhYmlsaXR5TGVuOwogCi0JCQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCBodCByYXRlcwotCQkJaWYgKCgoSHRDYXBhYmlsaXR5TGVuID4gMCkgfHwgKFByZU5IdENhcGFiaWxpdHlMZW4gPiAwKSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JCQl7Ci0JCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLSAgIAkJCQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKKwkJCQkgICAgICAgU0laRV9IVF9DQVBfSUUpOworCQkJLyogZmlsdGVyIG91dCB1bi1zdXBwb3J0ZWQgaHQgcmF0ZXMgKi8KKwkJCWlmICgoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCisJCQkgICAgJiYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkJJiYgKGJBbGxvd05yYXRlKSkpIHsKKwkJCQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywKKwkJCQkJICAgICAgICZBZGRIdEluZm8sIFNJWkVfQUREX0hUX0lORk9fSUUpOwogCi0JCQkJLy8gU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBzdG9yZXMgUGVlciBBUCdzIDExbiBSeCBjYXBhYmlsaXR5Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKLQkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IE5ld0V4dENoYW5uZWxPZmZzZXQ7CisJCQkJLyogU3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1DU1NldCBzdG9yZXMgUGVlciBBUCdzIDExbiBSeCBjYXBhYmlsaXR5ICovCisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby4KKwkJCQkJICAgICAgIE1DU1NldCwgSHRDYXBhYmlsaXR5Lk1DU1NldCwgMTYpOworCQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0KKwkJCQkgICAgTmV3RXh0Q2hhbm5lbE9mZnNldDsKIAkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOworCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0KKwkJCQkgICAgVFJVRTsKIAkJCQlpZiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApCi0JCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9IFRSVUU7Ci0JCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvKTsKLQkJCQkvLyBDb3B5IEFQIFBhcmFtZXRlciB0byBTdGFBY3RpdmUuICBUaGlzIGlzIGFsc28gaW4gTGlua1VwLgotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24hIChNcGR1RGVuc2l0eT0lZCwgTWF4UkFtcGR1RmFjdG9yPSVkLCBCVz0lZClcbiIsCi0JCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1wZHVEZW5zaXR5LCBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IsIEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSk7CisJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uCisJCQkJCSAgICBiUHJlTkh0ID0gVFJVRTsKKwkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZIdENhcGFiaWxpdHksCisJCQkJCSAgICAmQWRkSHRJbmZvKTsKKwkJCQkvKiBDb3B5IEFQIFBhcmFtZXRlciB0byBTdGFBY3RpdmUuICBUaGlzIGlzIGFsc28gaW4gTGlua1VwLiAqLworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uISAoTXBkdURlbnNpdHk9JWQsIE1heFJBbXBkdUZhY3Rvcj0lZCwgQlc9JWQpXG4iLAorCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LgorCQkJCQkgIE1wZHVEZW5zaXR5LAorCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LgorCQkJCQkgIE1heFJBbXBkdUZhY3RvciwKKwkJCQkJICBIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCkpOwogCi0JCQkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCi0JCQkJeworCQkJCWlmIChBZGRIdEluZm9MZW4gPiAwKSB7CiAJCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuOwotCQkgCQkJLy8gQ2hlY2sgYWdhaW4gdGhlIEJhbmR3aWR0aCBjYXBhYmlsaXR5IG9mIHRoaXMgQVAuCi0JCSAJCQlpZiAoKEFkZEh0SW5mby5Db250cm9sQ2hhbiA+IDIpJiYgKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCSAJCQl7Ci0JCSAJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gLSAyOwotCQkgCQkJfQotCQkgCQkJZWxzZSBpZiAoKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQUJPVkUpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCSAJCQl7Ci0JCSAJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gKyAyOwotCQkgCQkJfQorCQkJCQkvKiBDaGVjayBhZ2FpbiB0aGUgQmFuZHdpZHRoIGNhcGFiaWxpdHkgb2YgdGhpcyBBUC4gKi8KKwkJCQkJaWYgKChBZGRIdEluZm8uQ29udHJvbENoYW4gPiAyKQorCQkJCQkgICAgJiYgKEFkZEh0SW5mby5BZGRIdEluZm8uCisJCQkJCQlFeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykKKwkJCQkJICAgICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLgorCQkJCQkJQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkJCQkJQ2VudHJhbENoYW5uZWwgPQorCQkJCQkJICAgIEFkZEh0SW5mby5Db250cm9sQ2hhbiAtIDI7CisJCQkJCX0gZWxzZQorCQkJCQkgICAgaWYgKChBZGRIdEluZm8uQWRkSHRJbmZvLgorCQkJCQkJIEV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0FCT1ZFKQorCQkJCQkJJiYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uCisJCQkJCQkgICAgQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkgeworCQkJCQkJQ2VudHJhbENoYW5uZWwgPQorCQkJCQkJICAgIEFkZEh0SW5mby5Db250cm9sQ2hhbiArIDI7CisJCQkJCX0KKwkJCQkJLyogQ2hlY2sgRXJyb3IgLiAqLworCQkJCQlpZiAocEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICE9CisJCQkJCSAgICBDZW50cmFsQ2hhbm5lbCkKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+QmVhY29uIENlbnRyYWwgQ2hhbm5lbCA9ICVkLCBDb250cm9sIENoYW5uZWwgPSAlZC4gTWxtZWF1eCBDZW50cmFsQ2hhbm5lbCA9ICVkXG4iLAorCQkJCQkJCSAgQ2VudHJhbENoYW5uZWwsCisJCQkJCQkJICBBZGRIdEluZm8uQ29udHJvbENoYW4sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJICBDZW50cmFsQ2hhbm5lbCkpOwogCi0JCQkJCS8vIENoZWNrIEVycm9yIC4KLQkJCQkJaWYgKHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAhPSBDZW50cmFsQ2hhbm5lbCkKLQkJIAkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJQZWVyQmVhY29uQXRKb2luQWN0aW9uIEhUPT09PkJlYWNvbiBDZW50cmFsIENoYW5uZWwgPSAlZCwgQ29udHJvbCBDaGFubmVsID0gJWQuIE1sbWVhdXggQ2VudHJhbENoYW5uZWwgPSAlZFxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbiwgcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsKSk7Ci0KLQkJIAkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+Q2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLCAgLlxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbikpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+Q2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLCAgLlxuIiwKKwkJCQkJCSAgQ2VudHJhbENoYW5uZWwsCisJCQkJCQkgIEFkZEh0SW5mby5Db250cm9sQ2hhbikpOwogCiAJCQkJfQogCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0gICAJCQkJLy8gVG8gcHJldmVudCBlcnJvciwgbGV0IGxlZ2FjeSBBUCBtdXN0IGhhdmUgc2FtZSBDZW50cmFsQ2hhbm5lbCBhbmQgQ2hhbm5lbC4KLQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKLQkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5NbG1lQXV4LkNoYW5uZWw7CisJCQl9IGVsc2UgeworCQkJCS8qIFRvIHByZXZlbnQgZXJyb3IsIGxldCBsZWdhY3kgQVAgbXVzdCBoYXZlIHNhbWUgQ2VudHJhbENoYW5uZWwgYW5kIENoYW5uZWwuICovCisJCQkJaWYgKChIdENhcGFiaWxpdHlMZW4gPT0gMCkKKwkJCQkgICAgJiYgKFByZU5IdENhcGFiaWxpdHlMZW4gPT0gMCkpCisJCQkJCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCA9CisJCQkJCSAgICBwQWQtPk1sbWVBdXguQ2hhbm5lbDsKIAotCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7Ci0JCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7CisJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPQorCQkJCSAgICBGQUxTRTsKKwkJCQlwQWQtPk1sbWVBdXguTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksCisJCQkJCSAgICAgICBTSVpFX0hUX0NBUF9JRSk7CisJCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IDA7CisJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sCisJCQkJCSAgICAgICBTSVpFX0FERF9IVF9JTkZPX0lFKTsKIAkJCX0KIAogCQkJUlRNUFVwZGF0ZU1sbWVSYXRlKHBBZCk7CiAKLQkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KKwkJCS8qIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KIAkJCWlmICgocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCi0JCQkJIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQkJKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgJkVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOworCQkJICAgIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCisJCQkgICAgKSB7CisJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLAorCQkJCQkgICAgICAgJkVkY2FQYXJtLCBzaXplb2Yoc3RydWN0IHJ0X2VkY2FfcGFybSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRYnNzTG9hZCwKKwkJCQkJICAgICAgICZRYnNzTG9hZCwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0pKTsKKwkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUW9zQ2FwYWJpbGl0eSwKKwkJCQkJICAgICAgICZRb3NDYXBhYmlsaXR5LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtKSk7CisJCQl9IGVsc2UgeworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfZWRjYV9wYXJtKSk7CisJCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSkpOworCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xb3NfY2FwYWJpbGl0eV9wYXJtKSk7CiAJCQl9CiAKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBhZnRlciBKT0lOLCBTdXBSYXRlTGVuPSVkLCBFeHRSYXRlTGVuPSVkXG4iLAotCQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiU1lOQyAtIGFmdGVyIEpPSU4sIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWRcbiIsCisJCQkJICBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKKwkJCQkgIHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuKSk7CiAKLQkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKLQkJCXsKLQkJCQkvL1dlIG5lZWQgdG8gY2hhbmdlIG91ciBUeFBvd2VyIGZvciBDQ1ggMi4wIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0JCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Ci0JCQl9Ci0JCQllbHNlICAvL1VzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZS4KLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OworCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKSB7CisJCQkJLypXZSBuZWVkIHRvIGNoYW5nZSBvdXIgVHhQb3dlciBmb3IgQ0NYIDIuMCBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlciAqLworCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLAorCQkJCQkJICAgICAgIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7CisJCQl9IGVsc2UJLypVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UuICovCisJCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPQorCQkJCSAgICBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKIAogCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKIAkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOworCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwKKwkJCQkgICAgMiwgJlN0YXR1cyk7CiAJCX0KLQkJLy8gbm90IHRvIG1lIEJFQUNPTiwgaWdub3JlZAorCQkvKiBub3QgdG8gbWUgQkVBQ09OLCBpZ25vcmVkICovCiAJfQotCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorCS8qIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZSAqLwogfQogCiAvKgpAQCAtOTQ4LDY2MiArMTA0MSw2NjAgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgUGVlckJlYWNvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIFBlZXJCZWFjb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlDRl9QQVJNICAgICAgIENmUGFybTsKLQlVQ0hBUiAgICAgICAgIFNzaWRMZW4sIE1lc3NhZ2VUb01lPTAsIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsIGluZGV4PTA7Ci0JVUNIQVIgICAgICAgICBEdGltQ291bnQ9MCwgRHRpbVBlcmlvZD0wLCBCY2FzdEZsYWc9MDsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7CisJdTggQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKKwljaGFyIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKKwlzdHJ1Y3QgcnRfY2ZfcGFybSBDZlBhcm07CisJdTggU3NpZExlbiwgTWVzc2FnZVRvTWUgPSAwLCBCc3NUeXBlLCBDaGFubmVsLCBOZXdDaGFubmVsLCBpbmRleCA9IDA7CisJdTggRHRpbUNvdW50ID0gMCwgRHRpbVBlcmlvZCA9IDAsIEJjYXN0RmxhZyA9IDA7CisJdTE2IENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7CiAJTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7Ci0JVVNIT1JUICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOwotCVVDSEFSICAgICAgICAgRXJwOwotCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47Ci0JVUNIQVIJCSAgQ2tpcEZsYWc7Ci0JVVNIT1JUICAgICAgICBMZW5WSUU7Ci0JVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKLQkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKLQlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01Ci0JTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sIFByZU5IdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKKwl1MTYgVGJ0dE51bVRvTmV4dFdha2VVcDsKKwl1OCBFcnA7CisJdTggU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sCisJICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOworCXU4IFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47CisJdTggQ2tpcEZsYWc7CisJdTE2IExlblZJRTsKKwl1OCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7CisJc3RydWN0IHJ0X2VkY2FfcGFybSBFZGNhUGFybTsKKwlzdHJ1Y3QgcnRfcWJzc19sb2FkX3Bhcm0gUWJzc0xvYWQ7CisJc3RydWN0IHJ0X3Fvc19jYXBhYmlsaXR5X3Bhcm0gUW9zQ2FwYWJpbGl0eTsKKwl1bnNpZ25lZCBsb25nIFJhbGlua0llOworCS8qIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcyAqLworCXU4IFZhcklFW01BWF9WSUVfTEVOXTsJLyogVG90YWwgVklFIGxlbmd0aCA9IE1BWF9WSUVfTEVOIC0gLTUgKi8KKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfdmFyaWFibGVfaWVzICpwVklFID0gTlVMTDsKKwlzdHJ1Y3QgcnRfaHRfY2FwYWJpbGl0eV9pZSBIdENhcGFiaWxpdHk7CisJc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llIEFkZEh0SW5mbzsJLyogQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFICovCisJdTggSHRDYXBhYmlsaXR5TGVuLCBQcmVOSHRDYXBhYmlsaXR5TGVuOworCXU4IEFkZEh0SW5mb0xlbjsKKwl1OCBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKIAogCWlmICghKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQotCQkpKQorCSAgICApKQogCQlyZXR1cm47CiAKLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7CisJLyogSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUgKi8KKwlwVklFID0gKHN0cnVjdCBydF9uZGlzXzgwMl8xMV92YXJpYWJsZV9pZXMgKilWYXJJRTsKIAlwVklFLT5MZW5ndGggPSAwOwotICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKLQlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKKwlSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7CisJUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKHN0cnVjdCBydF9hZGRfaHRfaW5mb19pZSkpOwogCiAJaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCi0JCQkJCQkJCUVsZW0tPk1zZywKLQkJCQkJCQkJRWxlbS0+TXNnTGVuLAotCQkJCQkJCQlFbGVtLT5DaGFubmVsLAotCQkJCQkJCQlBZGRyMiwKLQkJCQkJCQkJQnNzaWQsCi0JCQkJCQkJCVNzaWQsCi0JCQkJCQkJCSZTc2lkTGVuLAotCQkJCQkJCQkmQnNzVHlwZSwKLQkJCQkJCQkJJkJlYWNvblBlcmlvZCwKLQkJCQkJCQkJJkNoYW5uZWwsCi0JCQkJCQkJCSZOZXdDaGFubmVsLAotCQkJCQkJCQkmVGltZVN0YW1wLAotCQkJCQkJCQkmQ2ZQYXJtLAotCQkJCQkJCQkmQXRpbVdpbiwKLQkJCQkJCQkJJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCQkmRXJwLAotCQkJCQkJCQkmRHRpbUNvdW50LAotCQkJCQkJCQkmRHRpbVBlcmlvZCwKLQkJCQkJCQkJJkJjYXN0RmxhZywKLQkJCQkJCQkJJk1lc3NhZ2VUb01lLAotCQkJCQkJCQlTdXBSYXRlLAotCQkJCQkJCQkmU3VwUmF0ZUxlbiwKLQkJCQkJCQkJRXh0UmF0ZSwKLQkJCQkJCQkJJkV4dFJhdGVMZW4sCi0JCQkJCQkJCSZDa2lwRmxhZywKLQkJCQkJCQkJJkFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLQkJCQkJCQkJJkVkY2FQYXJtLAotCQkJCQkJCQkmUWJzc0xvYWQsCi0JCQkJCQkJCSZRb3NDYXBhYmlsaXR5LAotCQkJCQkJCQkmUmFsaW5rSWUsCi0JCQkJCQkJCSZIdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJCSZQcmVOSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkmQWRkSHRJbmZvTGVuLAotCQkJCQkJCQkmQWRkSHRJbmZvLAotCQkJCQkJCQkmTmV3RXh0Q2hhbm5lbE9mZnNldCwKLQkJCQkJCQkJJkxlblZJRSwKLQkJCQkJCQkJcFZJRSkpCi0JeworCQkJCQlFbGVtLT5Nc2csCisJCQkJCUVsZW0tPk1zZ0xlbiwKKwkJCQkJRWxlbS0+Q2hhbm5lbCwKKwkJCQkJQWRkcjIsCisJCQkJCUJzc2lkLAorCQkJCQlTc2lkLAorCQkJCQkmU3NpZExlbiwKKwkJCQkJJkJzc1R5cGUsCisJCQkJCSZCZWFjb25QZXJpb2QsCisJCQkJCSZDaGFubmVsLAorCQkJCQkmTmV3Q2hhbm5lbCwKKwkJCQkJJlRpbWVTdGFtcCwKKwkJCQkJJkNmUGFybSwKKwkJCQkJJkF0aW1XaW4sCisJCQkJCSZDYXBhYmlsaXR5SW5mbywKKwkJCQkJJkVycCwKKwkJCQkJJkR0aW1Db3VudCwKKwkJCQkJJkR0aW1QZXJpb2QsCisJCQkJCSZCY2FzdEZsYWcsCisJCQkJCSZNZXNzYWdlVG9NZSwKKwkJCQkJU3VwUmF0ZSwKKwkJCQkJJlN1cFJhdGVMZW4sCisJCQkJCUV4dFJhdGUsCisJCQkJCSZFeHRSYXRlTGVuLAorCQkJCQkmQ2tpcEZsYWcsCisJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCisJCQkJCSZFZGNhUGFybSwKKwkJCQkJJlFic3NMb2FkLAorCQkJCQkmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJJlJhbGlua0llLAorCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAorCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJJkh0Q2FwYWJpbGl0eSwKKwkJCQkJJkFkZEh0SW5mb0xlbiwKKwkJCQkJJkFkZEh0SW5mbywKKwkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsICZMZW5WSUUsIHBWSUUpKSB7CiAJCUJPT0xFQU4gaXNfbXlfYnNzaWQsIGlzX215X3NzaWQ7Ci0JCVVMT05HICAgQnNzaWR4LCBOb3c7Ci0JCUJTU19FTlRSWSAqcEJzczsKLQkJQ0hBUgkJUmVhbFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOworCQl1bnNpZ25lZCBsb25nIEJzc2lkeCwgTm93OworCQlzdHJ1Y3QgcnRfYnNzX2VudHJ5ICpwQnNzOworCQljaGFyIFJlYWxSc3NpID0KKwkJICAgIFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLAorCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMSwgUlNTSV8xKSwKKwkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwogCi0JCWlzX215X2Jzc2lkID0gTUFDX0FERFJfRVFVQUwoQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKT8gVFJVRSA6IEZBTFNFOwotCQlpc19teV9zc2lkID0gU1NJRF9FUVVBTChTc2lkLCBTc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKT8gVFJVRTpGQUxTRTsKKwkJaXNfbXlfYnNzaWQgPQorCQkgICAgTUFDX0FERFJfRVFVQUwoQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSA/IFRSVUUgOiBGQUxTRTsKKwkJaXNfbXlfc3NpZCA9CisJCSAgICBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCisJCQkgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZExlbikgPyBUUlVFIDogRkFMU0U7CiAKLQotCQkvLyBpZ25vcmUgQkVBQ09OIG5vdCBmb3IgbXkgU1NJRAotCQlpZiAoKCEgaXNfbXlfc3NpZCkgJiYgKCEgaXNfbXlfYnNzaWQpKQorCQkvKiBpZ25vcmUgQkVBQ09OIG5vdCBmb3IgbXkgU1NJRCAqLworCQlpZiAoKCFpc19teV9zc2lkKSAmJiAoIWlzX215X2Jzc2lkKSkKIAkJCXJldHVybjsKIAotCQkvLyBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uCisJCS8qIEl0IG1lYW5zIFNUQSB3YWl0cyBkaXNhc3NvYyBjb21wbGV0ZWx5IGZyb20gdGhpcyBBUCwgaWdub3JlcyB0aGlzIGJlYWNvbi4gKi8KIAkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9XQUlUX0RJU0FTU09DKQogCQkJcmV0dXJuOwogCi0JCS8vIENvcHkgQ29udHJvbCBjaGFubmVsIGZvciB0aGlzIEJTU0lELgorCQkvKiBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4gKi8KIAkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQogCQkJQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKIAogCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCiAJCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKIAotCQkvLwotCQkvLyBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLgotCQkvLworCQkvKiAqLworCQkvKiBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLiAqLworCQkvKiAqLwogCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJLy8gZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeQotCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCQkmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbixBZGRIdEluZm9MZW4sTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwKLQkJCQkJCVJlYWxSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LAotCQkJCQkJJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSAvLyByZXR1cm4gaWYgQlNTIHRhYmxlIGZ1bGwKKwkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSB7CisJCQkvKiBkaXNjb3ZlciBuZXcgQVAgb2YgdGhpcyBuZXR3b3JrLCBjcmVhdGUgQlNTIGVudHJ5ICovCisJCQlCc3NpZHggPQorCQkJICAgIEJzc1RhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5TY2FuVGFiLCBCc3NpZCwgU3NpZCwKKwkJCQkJICAgICBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCisJCQkJCSAgICAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sCisJCQkJCSAgICAgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwKKwkJCQkJICAgICBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAorCQkJCQkgICAgICZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwKKwkJCQkJICAgICBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCSAgICAgQ2hhbm5lbCwgUmVhbFJzc2ksIFRpbWVTdGFtcCwKKwkJCQkJICAgICBDa2lwRmxhZywgJkVkY2FQYXJtLAorCQkJCQkgICAgICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwKKwkJCQkJICAgICBwVklFKTsKKwkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkJLyogcmV0dXJuIGlmIEJTUyB0YWJsZSBmdWxsICovCiAJCQkJcmV0dXJuOwogCi0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5QVFNGLCAmRWxlbS0+TXNnWzI0XSwgNCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRlswXSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbNF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQotCisJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5QVFNGLAorCQkJCSAgICAgICAmRWxlbS0+TXNnWzI0XSwgNCk7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRlswXSwKKwkJCQkgICAgICAgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlRUU0ZbNF0sCisJCQkJICAgICAgICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKIAogCQl9CiAKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKLQkJewotCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgotCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgorCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApCisJCSAgICAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkgeworCQkJLyogU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLiAqLworCQkJLyogSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLiAqLwogCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7CiAJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKLQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7CiAJCQlNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOwogCQkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCQkgICAgUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJCS8vIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jCisJCQlSVE1QdXNlY0RlbGF5KDEwMDAwMDApOwkvKiB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYyAqLwogCi0JCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjawotCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKLQkJCQl7Ci0JCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOworCQkJLyogY2hhbm5lbCBzYW5pdHkgY2hlY2sgKi8KKwkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspIHsKKwkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PQorCQkJCSAgICBOZXdDaGFubmVsKSB7CisJCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPQorCQkJCQkgICAgTmV3Q2hhbm5lbDsKIAkJCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwgTmV3Q2hhbm5lbCkpOworCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsCisJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIENoYW5uZWwsIEZBTFNFKTsKKwkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwKKwkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJQZWVyQmVhY29uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLAorCQkJCQkJICBOZXdDaGFubmVsKSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KIAotCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCQl7CisJCQlpZiAoaW5kZXggPj0gcEFkLT5DaGFubmVsTGlzdE51bSkgewogCQkJCURCR1BSSU5UX0VSUigoIlBlZXJCZWFjb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwogCQkJfQogCQl9CisJCS8qIGlmIHRoZSBzc2lkIG1hdGNoZWQgJiBic3NpZCB1bm1hdGNoZWQsIHdlIHNob3VsZCBzZWxlY3QgdGhlIGJzc2lkIHdpdGggbGFyZ2UgdmFsdWUuICovCisJCS8qIFRoaXMgbWlnaHQgaGFwcGVuZWQgd2hlbiB0d28gU1RBIHN0YXJ0IGF0IHRoZSBzYW1lIHRpbWUgKi8KKwkJaWYgKCghaXNfbXlfYnNzaWQpICYmIEFESE9DX09OKHBBZCkpIHsKKwkJCWludCBpOwogCi0JCS8vIGlmIHRoZSBzc2lkIG1hdGNoZWQgJiBic3NpZCB1bm1hdGNoZWQsIHdlIHNob3VsZCBzZWxlY3QgdGhlIGJzc2lkIHdpdGggbGFyZ2UgdmFsdWUuCi0JCS8vIFRoaXMgbWlnaHQgaGFwcGVuZWQgd2hlbiB0d28gU1RBIHN0YXJ0IGF0IHRoZSBzYW1lIHRpbWUKLQkJaWYgKCghIGlzX215X2Jzc2lkKSAmJiBBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlJTlQJaTsKLQotCQkJLy8gQWRkIHRoZSBzYWZlZ3VhcmQgYWdhaW5zdCB0aGUgbWlzbWF0Y2ggb2YgYWRob2Mgd2VwIHN0YXR1cwotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5XZXBTdGF0dXMpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE5vdCBtYXRjaGVkIHdlcCBzdGF0dXMgJWQgJWRcbiIsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYnNzaWQ9JXNcbiIsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkJzc2lkKSk7CisJCQkvKiBBZGQgdGhlIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBtaXNtYXRjaCBvZiBhZGhvYyB3ZXAgc3RhdHVzICovCisJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9CisJCQkgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKSB7CiAJCQkJcmV0dXJuOwogCQkJfQotCi0JCQkvLyBjb2xsYXBzZSBpbnRvIHRoZSBBREhPQyBuZXR3b3JrIHdoaWNoIGhhcyBiaWdnZXIgQlNTSUQgdmFsdWUuCi0JCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQkJewotCQkJCWlmIChCc3NpZFtpXSA+IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIG1lcmdlIHRvIHRoZSBJQlNTIHdpdGggYmlnZ2VyIEJTU0lEPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQkJQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCQkJLyogY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLiAqLworCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJCWlmIChCc3NpZFtpXSA+IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiU1lOQyAtIG1lcmdlIHRvIHRoZSBJQlNTIHdpdGggYmlnZ2VyIEJTU0lEPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCQkJICBCc3NpZFswXSwgQnNzaWRbMV0sIEJzc2lkWzJdLAorCQkJCQkJICBCc3NpZFszXSwgQnNzaWRbNF0sCisJCQkJCQkgIEJzc2lkWzVdKSk7CiAJCQkJCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCQkJCQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBCc3NpZCk7CisJCQkJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkJCQkgICAgICBCc3NpZCk7CiAJCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSBCRUFDT04gZnJhbWUgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsJLyogcmUtYnVpbGQgQkVBQ09OIGZyYW1lICovCisJCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOwkvKiBjb3B5IEJFQUNPTiBmcmFtZSB0byBvbi1jaGlwIG1lbW9yeSAqLwogCQkJCQlpc19teV9ic3NpZCA9IFRSVUU7CiAJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChCc3NpZFtpXSA8IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQorCQkJCX0gZWxzZSBpZiAoQnNzaWRbaV0gPCBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAotCiAJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CiAJCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF07Ci0JCXBCc3MtPlJzc2kgPSBSZWFsUnNzaTsgICAgICAgLy8gbGFzdGVzdCBSU1NJCi0JCXBCc3MtPkxhc3RCZWFjb25SeFRpbWUgPSBOb3c7ICAgLy8gbGFzdCBSWCB0aW1lc3RhbXAKKwkJcEJzcy0+UnNzaSA9IFJlYWxSc3NpOwkvKiBsYXN0ZXN0IFJTU0kgKi8KKwkJcEJzcy0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsJLyogbGFzdCBSWCB0aW1lc3RhbXAgKi8KIAotCQkvLwotCQkvLyBCRUFDT04gZnJvbSBteSBCU1NJRCAtIGVpdGhlciBJQlNTIG9yIElORlJBIG5ldHdvcmsKLQkJLy8KLQkJaWYgKGlzX215X2Jzc2lkKQotCQl7Ci0JCQlSWFdJX1NUUlVDCVJ4V0k7CisJCS8qICovCisJCS8qIEJFQUNPTiBmcm9tIG15IEJTU0lEIC0gZWl0aGVyIElCU1Mgb3IgSU5GUkEgbmV0d29yayAqLworCQkvKiAqLworCQlpZiAoaXNfbXlfYnNzaWQpIHsKKwkJCXN0cnVjdCBydF9yeHdpIFJ4V0k7CiAKIAkJCXBBZC0+U3RhQ2ZnLkR0aW1Db3VudCA9IER0aW1Db3VudDsKIAkJCXBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2QgPSBEdGltUGVyaW9kOwogCQkJcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsKIAotCiAJCQlSeFdJLlJTU0kwID0gRWxlbS0+UnNzaTA7CiAJCQlSeFdJLlJTU0kxID0gRWxlbS0+UnNzaTE7CiAJCQlSeFdJLlJTU0kyID0gRWxlbS0+UnNzaTI7CiAKIAkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCAmUnhXSSk7Ci0JCQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ICE9IDB4RkYpCi0JCQl7Ci0JCQkJLy8KLQkJCQkvLyBXZSBnZXQgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiByZXF1aXJlZAotCQkJCS8vIENoYW5nZWQgdG8gYXBwcm9wcmlhdGUgVHhQb3dlciBMaW1pdCBmb3IgQ2lzbyBDb21wYXRpYmxlIEV4dGVuc2lvbnMKLQkJCQkvLwotCQkJCUNoYW5nZVRvQ2VsbFBvd2VyTGltaXQocEFkLCBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vCi0JCQkJLy8gQWlyb25ldENlbGxQb3dlckxpbWl0IGVxdWFsIHRvIDB4RkYgbWVhbnMgdGhlIENpc2NvIChjY3gpICJUeFBvd2VyIExpbWl0IiBub3QgZXhpc3QuCi0JCQkJLy8gVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLCB0aGF0IHNldCBmcm9tIFVJLgotCQkJCS8vCi0JCQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSBwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdDsKKwkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikgeworCQkJCS8qICovCisJCQkJLyogV2UgZ2V0IHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgcmVxdWlyZWQgKi8KKwkJCQkvKiBDaGFuZ2VkIHRvIGFwcHJvcHJpYXRlIFR4UG93ZXIgTGltaXQgZm9yIENpc28gQ29tcGF0aWJsZSBFeHRlbnNpb25zICovCisJCQkJLyogKi8KKwkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwKKwkJCQkJCSAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpOworCQkJfSBlbHNlIHsKKwkJCQkvKiAqLworCQkJCS8qIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCBlcXVhbCB0byAweEZGIG1lYW5zIHRoZSBDaXNjbyAoY2N4KSAiVHhQb3dlciBMaW1pdCIgbm90IGV4aXN0LiAqLworCQkJCS8qIFVzZWQgdGhlIGRlZmF1bHQgVFggUG93ZXIgUGVyY2VudGFnZSwgdGhhdCBzZXQgZnJvbSBVSS4gKi8KKwkJCQkvKiAqLworCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0KKwkJCQkgICAgcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7CiAJCQl9CiAKLSNpZmRlZiBSVDI4NjAKLQkJCS8vIGF0IGxlYXN0IG9uZSAxMWIgcGVlciBqb2luZWQuIGRvd25ncmFkZSB0aGUgTWF4VHhSYXRlIHRvIDExTWJwcwotCQkJLy8gYWZ0ZXIgbGFzdCAxMWIgcGVlciBsZWZ0IGZvciBzZXZlcmFsIHNlY29uZHMsIHdlJ2xsIGF1dG8gc3dpdGNoIGJhY2sgdG8gMTFHIHJhdGUKLQkJCS8vIGluIE1sbWVQZXJpb2RpY0V4ZWMoKQotI2VuZGlmCi0JCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoQ0FQX0lTX0lCU1NfT04oQ2FwYWJpbGl0eUluZm8pKSkKLQkJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCQlCT09MRUFOCWJSZXN0YXJ0OwotICAgICAgICAgICAgICAgIEJPT0xFQU4JYm5SZXN0YXJ0OworCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKENBUF9JU19JQlNTX09OKENhcGFiaWxpdHlJbmZvKSkpIHsKKwkJCQl1OCBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKKwkJCQl1OCBpZHg7CisJCQkJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OwogCi0JCQkJYlJlc3RhcnQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBiblJlc3RhcnQgPSBGQUxTRTsKLQotCQkJCWRvCi0JCQkJewotCQkJCQlpZiAoKFN1cFJhdGVMZW4rRXh0UmF0ZUxlbiA8PSA0KSAmJiAocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkpCi0JCQkJCXsKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkID09IEZBTFNFKQotCQkJCQkJewotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSAxMWIgcGVlciBqb2luZWQuIGRvd24tZ3JhZGUgdG8gMTFiIFRYIHJhdGVzIFxuIikpOwotCQkJCQkJCWJSZXN0YXJ0ID0gVFJVRTsKLQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBTdXBSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiA9IFN1cFJhdGVMZW47Ci0JCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQkJCQkJCXBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLkFkaG9jQk9ubHlKb2luZWQgPSBUUlVFOwotCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7Ci0JCQkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgTlVMTCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDExQiBwZWVycyBoYXZlIGxlZnQKLQkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3QxMWJCZWFjb25SeFRpbWUgPSBOb3c7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCS8vIFVwZGF0ZSBIdCBQaHkuCi0JCQkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJCQkJewotCQkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkgJiYKLQkJCQkJCQkhcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCAmJgotCQkJCQkJCSFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkKQotCQkJCQkJCUFkaG9jVHVybk9uUW9zKHBBZCk7Ci0KLQkJCQkJCS8vIEhhbmRsZSByYXRlIHN3aXRjaCBpc3N1ZSB3aGVuIEFkaG9jIG1vZGUKLQkJCQkJCWlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuID49IDgpICYmIChIdENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChIdENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQotCQkJCQkJewotCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5BZGhvY0JHSm9pbmVkID09IEZBTFNFKQotCQkJCQkJCXsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIDExZyBwZWVyIGpvaW5lZC4gZG93bi1ncmFkZSB0byAxMWcgVFggcmF0ZXMgXG4iKSk7Ci0JCQkJCQkJCWJSZXN0YXJ0ID0gVFJVRTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwgRXh0UmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQkJCQkJCQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQkJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2NCR0pvaW5lZCA9IFRSVUU7Ci0JCQkJCQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7Ci0JCQkJCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsIE5VTEwpOwotCQkJCQkJCX0KLQotCQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDExZyBwZWVycyBoYXZlIGxlZnQKLQkJCQkJCQlwQWQtPlN0YUNmZy5MYXN0MTFnQmVhY29uUnhUaW1lID0gTm93OwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIXBBZC0+U3RhQ2ZnLkFkaG9jQkdKb2luZWQgJiYKLQkJCQkJCQkJICFwQWQtPlN0YUNmZy5BZGhvY0JPbmx5Sm9pbmVkICYmCi0JCQkJCQkJCSAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKSAmJgotCQkJCQkJCQkgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzIwKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPT0gRkFMU0UpCi0JCQkJCQkJewotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLQkJCQkJCQkJcEFkLT5TdGFDZmcuQWRob2MyME5Kb2luZWQgPSBUUlVFOwotCQkJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgJkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOwotCQkJCQkJCQlpZiAoQWRkSHRJbmZvTGVuICE9IDApCi0JCQkJCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgQWRkSHRJbmZvTGVuKTsKLQkJCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIEh0Q2FwYWJpbGl0eS5NQ1NTZXQsIDE2KTsKLQotCQkJCQkJCQlSVE1QQ2hlY2tIdChwQWQsIEVsZW0tPldjaWQsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCAmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbyk7Ci0JCQkJCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKLQkJCQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOwotCQkJCQkJCQliUmVzdGFydCA9IFRSVUU7Ci0JCQkJCQkJCWJuUmVzdGFydCA9IFRSVUU7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHRoaXMgdGltZXN0YW1wIGlzIGZvciBNbG1lUGVyaW9kaWNFeGVjKCkgdG8gY2hlY2sgaWYgYWxsIDIwTUh6IE4gcGVlcnMgaGF2ZSBsZWZ0Ci0JCQkJCQkJcEFkLT5TdGFDZmcuTGFzdDIwTkJlYWNvblJ4VGltZSA9IE5vdzsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKLQkJCQkJfQotCQkJCX13aGlsZSAoRkFMU0UpOwotCi0JCQkJLy8gSWYgcGVlciBBZGhvYyBpcyBsZWdhY3kgbW9kZSwgSSBkb24ndCBuZWVkIHRvIGNhbGwgTWxtZVVwZGF0ZUh0VHhSYXRlcyBubyBtYXR0ZXIgSSBzdXBwb3J0IEhUIG9yIG5vdAotCQkJCWlmICgoYlJlc3RhcnQgPT0gVFJVRSkgJiYgKGJuUmVzdGFydCA9PSBGQUxTRSkpCi0JCQkJewotCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKLQkJCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJCQlBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAgLy8gY29weSB0byBvbi1jaGlwIG1lbW9yeQotCQkJCX0KLQkJCQllbHNlIGlmICgoYlJlc3RhcnQgPT0gVFJVRSkgJiYgKGJuUmVzdGFydCA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCU1sbWVVcGRhdGVUeFJhdGVzKHBBZCwgRkFMU0UsIEJTUzApOwotCQkJCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7Ci0JCQkJCU1ha2VJYnNzQmVhY29uKHBBZCk7ICAgICAgICAvLyByZS1idWlsZCBCRUFDT04gZnJhbWUKLQkJCQkJQXNpY0VuYWJsZUlic3NTeW5jKHBBZCk7ICAgIC8vIGNvcHkgdG8gb24tY2hpcCBtZW1vcnkKKwkJCQkvKiBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZSAqLworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgU3VwUmF0ZUxlbjsgaWR4KyspIHsKKwkJCQkJaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPAorCQkJCQkgICAgKFN1cFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9CisJCQkJCQkgICAgU3VwUmF0ZVtpZHhdICYgMHg3ZjsKIAkJCQl9CiAKLQkJCQkvLyBBdCBsZWFzdCBhbm90aGVyIHBlZXIgaW4gdGhpcyBJQlNTLCBkZWNsYXJlIE1lZGlhU3RhdGUgYXMgQ09OTkVDVEVECi0JCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQkJewotCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKLQotCQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCSAgICAgICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLQkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JCQkJCS8vIDIwMDMvMDMvMTIgLSBqb2huCi0JCQkJCS8vIE1ha2Ugc3VyZSB0aGlzIGVudHJ5IGluICJTY2FuVGFiIiB0YWJsZSwgdGh1cyBjb21wbGllcyB0byBNaWNyb3NvZnQncyBwb2xpY3kgdGhhdAotCQkJCQkvLyAic2l0ZSBzdXJ2ZXkiIHJlc3VsdCBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIGN1cnJlbnQgY29ubmVjdGVkIG5ldHdvcmsuCi0JCQkJCS8vCi0JCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKLQkJCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCQkJCQl7Ci0JCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKLQkJCQkJCQkJCSZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsIDAsCi0JCQkJCQkJCQkmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOworCQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgRXh0UmF0ZUxlbjsgaWR4KyspIHsKKwkJCQkJaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPAorCQkJCQkgICAgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQorCQkJCQkJTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9CisJCQkJCQkgICAgRXh0UmF0ZVtpZHhdICYgMHg3ZjsKIAkJCQl9CiAKLQkJCQkvLyBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uCi0JCQkJLy8gVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uCi0JCQkJaWYgKEFESE9DX09OKHBBZCkgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCi0JCQkJewotCQkJCQlVQ0hBUglpZHg7Ci0JCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0JCQkJCS8vIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlCi0JCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgQWRkcjIpOwotCQkJCQlpZiAocEVudHJ5ID09IE5VTEwpCi0JCQkJCXsKLQkJCQkJCS8vIEFub3RoZXIgYWRob2Mgam9pbmluZywgYWRkIHRvIG91ciBNQUMgdGFibGUuCi0JCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydEVudHJ5KHBBZCwgQWRkcjIsIEJTUzAsIEZBTFNFKTsKLQkJCQkJCWlmIChwRW50cnkpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5Tc3QgPSBTU1RfQVNTT0M7Ci0JCQkJCQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQkJCQkJCS8vIEFmdGVyIEluc2VydEVudHJ5LCBXcml0ZSB0byBBU0lDIG9uLWNoaXAgdGFibGUuCi0JCQkJCQkJUlQyOFhYX1NUQV9TRUNVUklUWV9JTkZPX0FERChwQWQsIEJTUzAsIGlkeCwgcEVudHJ5KTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAleDoleDoleDoleDoleDoleCAgam9pbiBpbi5FbnRyeT0lZFxuIiwgQWRkcjJbMF0sQWRkcjJbMV0sQWRkcjJbMl0sQWRkcjJbM10sQWRkcjJbNF0sQWRkcjJbNV0sIHBFbnRyeS0+QWlkKSk7Ci0KLQkJCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEh0Q2FwYWJpbGl0eUxlbiA8PSAwKQotCSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuIDw9IDQpICYmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KSkKLQkgICAgICAgIAkJCQkJewotCSAgICAgICAgCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCSAgICAgICAgCQkJCQl9Ci0JICAgICAgICAJCQkJCWVsc2UKLQkgICAgICAgIAkJCQkJewotCSAgICAgICAgCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkgICAgICAgIAkJCQkJfQotCQkJCQkJCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIEZBTFNFLCAwKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQkJCQkJCU1sbWVVcGRhdGVIdFR4UmF0ZXMocEFkLCBCU1MwKTsKLQkJCQkJCQl9Ci0KLQkgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKLQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIE1BQ19BRERSX0xFTik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBNQUNfQUREUl9MRU4pOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Ci0KLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0jZW5kaWYgLyogUlQyODYwICovCi0jaWZkZWYgUlQyODcwCi0JCQkJVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLQkJCQlVQ0hBUgkJCWlkeDsKLQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotCQkJCS8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCi0JCQkgICAgZm9yIChpZHg9MDsgaWR4PFN1cFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoU3VwUmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gU3VwUmF0ZVtpZHhdICYgMHg3ZjsKLQkJCSAgICB9Ci0KLQkJCQlmb3IgKGlkeD0wOyBpZHg8RXh0UmF0ZUxlbjsgaWR4KyspCi0JCQkgICAgewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChFeHRSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBFeHRSYXRlW2lkeF0gJiAweDdmOwotCQkJICAgIH0KLQotCQkJCS8vIGxvb2sgdXAgdGhlIGV4aXN0aW5nIHRhYmxlCisJCQkJLyogbG9vayB1cCB0aGUgZXhpc3RpbmcgdGFibGUgKi8KIAkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKIAotCQkJCS8vIEFkLWhvYyBtb2RlIGlzIHVzaW5nIE1BQyBhZGRyZXNzIGFzIEJBIHNlc3Npb24uIFNvIHdlIG5lZWQgdG8gY29udGludW91c2x5IGZpbmQgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24gYnkgcmVjZWl2aW5nIGJlYWNvbi4KLQkJCQkvLyBUbyBwcmV2ZW50IGFsd2F5cyBjaGVjayB0aGlzLCB3ZSB1c2Ugd2NpZCA9PSBSRVNFUlZFRF9XQ0lEIHRvIHJlY29nbml6ZSBpdCBhcyBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbi4KLQkJCQlpZiAoKEFESE9DX09OKHBBZCkgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpIHx8Ci0JCQkJCShwRW50cnkgJiYgKChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FKSA8IE5vdykpKQotCQkJCXsKKwkJCQkvKiBBZC1ob2MgbW9kZSBpcyB1c2luZyBNQUMgYWRkcmVzcyBhcyBCQSBzZXNzaW9uLiBTbyB3ZSBuZWVkIHRvIGNvbnRpbnVvdXNseSBmaW5kIG5ld2x5IGpvaW5lZCBhZGhvYyBzdGF0aW9uIGJ5IHJlY2VpdmluZyBiZWFjb24uICovCisJCQkJLyogVG8gcHJldmVudCBhbHdheXMgY2hlY2sgdGhpcywgd2UgdXNlIHdjaWQgPT0gUkVTRVJWRURfV0NJRCB0byByZWNvZ25pemUgaXQgYXMgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24uICovCisJCQkJaWYgKChBREhPQ19PTihwQWQpCisJCQkJICAgICAmJiAoRWxlbS0+V2NpZCA9PSBSRVNFUlZFRF9XQ0lEKSkKKwkJCQkgICAgfHwgKHBFbnRyeQorCQkJCQkmJgorCQkJCQkoKHBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSArCisJCQkJCSAgQURIT0NfRU5UUllfQkVBQ09OX0xPU1RfVElNRSkgPAorCQkJCQkgTm93KSkpIHsKIAkJCQkJaWYgKHBFbnRyeSA9PSBOVUxMKQotCQkJCQkJLy8gQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4KLQkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBBZGRyMiwgQlNTMCwgRkFMU0UpOworCQkJCQkJLyogQW5vdGhlciBhZGhvYyBqb2luaW5nLCBhZGQgdG8gb3VyIE1BQyB0YWJsZS4gKi8KKwkJCQkJCXBFbnRyeSA9CisJCQkJCQkgICAgTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsCisJCQkJCQkJCQlBZGRyMiwKKwkJCQkJCQkJCUJTUzAsCisJCQkJCQkJCQlGQUxTRSk7CiAKLQkJCQkJaWYgKFN0YUFkZE1hY1RhYmxlRW50cnkocEFkLCBwRW50cnksIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgQ2FwYWJpbGl0eUluZm8pID09IEZBTFNFKQotCQkJCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAtIEFkZCBFbnRyeSBmYWlsZWQuXG4iKSk7CisJCQkJCWlmIChTdGFBZGRNYWNUYWJsZUVudHJ5KHBBZCwKKwkJCQkJCQkJcEVudHJ5LAorCQkJCQkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAorCQkJCQkJCQkmSHRDYXBhYmlsaXR5LAorCQkJCQkJCQlIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSZBZGRIdEluZm8sCisJCQkJCQkJCUFkZEh0SW5mb0xlbiwKKwkJCQkJCQkJQ2FwYWJpbGl0eUluZm8pCisJCQkJCSAgICA9PSBGQUxTRSkgeworCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJICgiQURIT0MgLSBBZGQgRW50cnkgZmFpbGVkLlxuIikpOwogCQkJCQkJcmV0dXJuOwogCQkJCQl9CiAKIAkJCQkJaWYgKHBFbnRyeSAmJgotCQkJCQkJKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpCi0JCQkJCXsKKwkJCQkJICAgIChFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKSB7CiAJCQkJCQlpZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JCQkJCQlSVDI4WFhfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgQlNTMCwgaWR4LCBwRW50cnkpOworCQkJCQkJUlRNUF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLAorCQkJCQkJCQkJICAgQlNTMCwKKwkJCQkJCQkJCSAgIGlkeCwKKwkJCQkJCQkJCSAgIHBFbnRyeSk7CiAJCQkJCX0KIAkJCQl9CiAKIAkJCQlpZiAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWRBc0NMSSkKIAkJCQkJcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lID0gTm93OwogCi0JCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCXsKLQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CisJCQkJLyogQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRCAqLworCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgeworCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsCisJCQkJCQkJICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7CiAKLQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKwkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOworCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKIAkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwogCi0JCQkJCS8vIDIwMDMvMDMvMTIgLSBqb2huCi0JCQkJCS8vIE1ha2Ugc3VyZSB0aGlzIGVudHJ5IGluICJTY2FuVGFiIiB0YWJsZSwgdGh1cyBjb21wbGllcyB0byBNaWNyb3NvZnQncyBwb2xpY3kgdGhhdAotCQkJCQkvLyAic2l0ZSBzdXJ2ZXkiIHJlc3VsdCBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIGN1cnJlbnQgY29ubmVjdGVkIG5ldHdvcmsuCi0JCQkJCS8vCi0JCQkJCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKLQkJCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCQkJCQl7Ci0JCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKLQkJCQkJCQkJCSZDZlBhcm0sIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAmSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJlYWxSc3NpLCBUaW1lU3RhbXAsIDAsCi0JCQkJCQkJCQkmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7CisJCQkJCS8qIDIwMDMvMDMvMTIgLSBqb2huICovCisJCQkJCS8qIE1ha2Ugc3VyZSB0aGlzIGVudHJ5IGluICJTY2FuVGFiIiB0YWJsZSwgdGh1cyBjb21wbGllcyB0byBNaWNyb3NvZnQncyBwb2xpY3kgdGhhdCAqLworCQkJCQkvKiAic2l0ZSBzdXJ2ZXkiIHJlc3VsdCBzaG91bGQgYWx3YXlzIGluY2x1ZGUgdGhlIGN1cnJlbnQgY29ubmVjdGVkIG5ldHdvcmsuICovCisJCQkJCS8qICovCisJCQkJCUJzc2lkeCA9CisJCQkJCSAgICBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwKKwkJCQkJCQkgICBDaGFubmVsKTsKKwkJCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSB7CisJCQkJCQlCc3NpZHggPQorCQkJCQkJICAgIEJzc1RhYmxlU2V0RW50cnkocEFkLAorCQkJCQkJCQkgICAgICZwQWQtPgorCQkJCQkJCQkgICAgIFNjYW5UYWIsCisJCQkJCQkJCSAgICAgQnNzaWQsCisJCQkJCQkJCSAgICAgU3NpZCwKKwkJCQkJCQkJICAgICBTc2lkTGVuLAorCQkJCQkJCQkgICAgIEJzc1R5cGUsCisJCQkJCQkJCSAgICAgQmVhY29uUGVyaW9kLAorCQkJCQkJCQkgICAgICZDZlBhcm0sCisJCQkJCQkJCSAgICAgQXRpbVdpbiwKKwkJCQkJCQkJICAgICBDYXBhYmlsaXR5SW5mbywKKwkJCQkJCQkJICAgICBTdXBSYXRlLAorCQkJCQkJCQkgICAgIFN1cFJhdGVMZW4sCisJCQkJCQkJCSAgICAgRXh0UmF0ZSwKKwkJCQkJCQkJICAgICBFeHRSYXRlTGVuLAorCQkJCQkJCQkgICAgICZIdENhcGFiaWxpdHksCisJCQkJCQkJCSAgICAgJkFkZEh0SW5mbywKKwkJCQkJCQkJICAgICBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJCSAgICAgQWRkSHRJbmZvTGVuLAorCQkJCQkJCQkgICAgIE5ld0V4dENoYW5uZWxPZmZzZXQsCisJCQkJCQkJCSAgICAgQ2hhbm5lbCwKKwkJCQkJCQkJICAgICBSZWFsUnNzaSwKKwkJCQkJCQkJICAgICBUaW1lU3RhbXAsCisJCQkJCQkJCSAgICAgMCwKKwkJCQkJCQkJICAgICAmRWRjYVBhcm0sCisJCQkJCQkJCSAgICAgJlFvc0NhcGFiaWxpdHksCisJCQkJCQkJCSAgICAgJlFic3NMb2FkLAorCQkJCQkJCQkgICAgIExlblZJRSwKKwkJCQkJCQkJICAgICBwVklFKTsKIAkJCQkJfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBREhPQyAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQuXG4iKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQURIT0MgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVELlxuIikpOwogCQkJCX0KLSNlbmRpZiAvKiBSVDI4NzAgKi8KIAkJCX0KIAotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQl7CisJCQlpZiAoSU5GUkFfT04ocEFkKSkgewogCQkJCUJPT0xFQU4gYlVzZVNob3J0U2xvdCwgYlVzZUJHUHJvdGVjdGlvbjsKIAotCQkJCS8vIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0KLQkJCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKLQkJCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KLQkJCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCisJCQkJLyogZGVjaWRlIHRvIHVzZS9jaGFuZ2UgdG8gLSAqLworCQkJCS8qICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZSAqLworCQkJCS8qICAgICAgMi4gdHVybiBvbi9vZmYgUlRTL0NUUyBhbmQvb3IgQ1RTLXRvLXNlbGYgcHJvdGVjdGlvbiAqLworCQkJCS8qICAgICAgMy4gc2hvcnQgcHJlYW1ibGUgKi8KIAotCQkJCS8vYlVzZVNob3J0U2xvdCA9IHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lICYmIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKLQkJCQliVXNlU2hvcnRTbG90ID0gQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOwotCQkJCWlmIChiVXNlU2hvcnRTbG90ICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKQorCQkJCS8qYlVzZVNob3J0U2xvdCA9IHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lICYmIENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsgKi8KKwkJCQliVXNlU2hvcnRTbG90ID0KKwkJCQkgICAgQ0FQX0lTX1NIT1JUX1NMT1QoQ2FwYWJpbGl0eUluZm8pOworCQkJCWlmIChiVXNlU2hvcnRTbG90ICE9CisJCQkJICAgIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsCisJCQkJCQkgICAgICAgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCiAJCQkJCUFzaWNTZXRTbG90VGltZShwQWQsIGJVc2VTaG9ydFNsb3QpOwogCi0JCQkJYlVzZUJHUHJvdGVjdGlvbiA9IChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMSkgfHwgICAgLy8gYWx3YXlzIHVzZQotCQkJCQkJCQkgICAoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAwKSAmJiBFUlBfSVNfVVNFX1BST1RFQ1RJT04oRXJwKSk7CisJCQkJYlVzZUJHUHJvdGVjdGlvbiA9IChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPT0gMSkgfHwJLyogYWx3YXlzIHVzZSAqLworCQkJCSAgICAoKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAwKQorCQkJCSAgICAgJiYgRVJQX0lTX1VTRV9QUk9URUNUSU9OKEVycCkpOwogCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkgLy8gYWx3YXlzIG5vIEJHIHByb3RlY3Rpb24gaW4gQS1iYW5kLiBmYWxzZWx5IGhhcHBlbmVkIHdoZW4gc3dpdGNoaW5nIEEvRyBiYW5kIHRvIGEgZHVhbC1iYW5kIEFQCisJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkJLyogYWx3YXlzIG5vIEJHIHByb3RlY3Rpb24gaW4gQS1iYW5kLiBmYWxzZWx5IGhhcHBlbmVkIHdoZW4gc3dpdGNoaW5nIEEvRyBiYW5kIHRvIGEgZHVhbC1iYW5kIEFQICovCiAJCQkJCWJVc2VCR1Byb3RlY3Rpb24gPSBGQUxTRTsKIAotCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uICE9IE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQorCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uICE9CisJCQkJICAgIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsCisJCQkJCQkgICAgICAgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCkpCiAJCQkJewotCQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbikKLQkJCQkJewotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxGQUxTRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIChPRkRNU0VUUFJPVEVDVHxDQ0tTRVRQUk9URUNUfEFMTE5fU0VUUFJPVEVDVCksVFJVRSwocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9PSAxKSk7CisJCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uKSB7CisJCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsCisJCQkJCQkJCSAgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7CisJCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsCisJCQkJCQkJCSAgcEFkLT5NbG1lQXV4LgorCQkJCQkJCQkgIEFkZEh0SW5mby4KKwkJCQkJCQkJICBBZGRIdEluZm8yLgorCQkJCQkJCQkgIE9wZXJhaW9uTW9kZSwKKwkJCQkJCQkJICAoT0ZETVNFVFBST1RFQ1QKKwkJCQkJCQkJICAgfAorCQkJCQkJCQkgICBDQ0tTRVRQUk9URUNUCisJCQkJCQkJCSAgIHwKKwkJCQkJCQkJICAgQUxMTl9TRVRQUk9URUNUKSwKKwkJCQkJCQkJICBGQUxTRSwKKwkJCQkJCQkJICAocEFkLT5NbG1lQXV4LgorCQkJCQkJCQkgICBBZGRIdEluZm8uCisJCQkJCQkJCSAgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgIE5vbkdmUHJlc2VudAorCQkJCQkJCQkgICA9PSAxKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCQkJICAgIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOworCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkJCQkgIHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICBBZGRIdEluZm8uCisJCQkJCQkJCSAgQWRkSHRJbmZvMi4KKwkJCQkJCQkJICBPcGVyYWlvbk1vZGUsCisJCQkJCQkJCSAgKE9GRE1TRVRQUk9URUNUCisJCQkJCQkJCSAgIHwKKwkJCQkJCQkJICAgQ0NLU0VUUFJPVEVDVAorCQkJCQkJCQkgICB8CisJCQkJCQkJCSAgIEFMTE5fU0VUUFJPVEVDVCksCisJCQkJCQkJCSAgVFJVRSwKKwkJCQkJCQkJICAocEFkLT5NbG1lQXV4LgorCQkJCQkJCQkgICBBZGRIdEluZm8uCisJCQkJCQkJCSAgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgIE5vbkdmUHJlc2VudAorCQkJCQkJCQkgICA9PSAxKSk7CiAJCQkJCX0KIAotCQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlNZTkMgLSBBUCBjaGFuZ2VkIEIvRyBwcm90ZWN0aW9uIHRvICVkXG4iLCBiVXNlQkdQcm90ZWN0aW9uKSk7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sCisJCQkJCQkgKCJTWU5DIC0gQVAgY2hhbmdlZCBCL0cgcHJvdGVjdGlvbiB0byAlZFxuIiwKKwkJCQkJCSAgYlVzZUJHUHJvdGVjdGlvbikpOwogCQkJCX0KLQotCQkJCS8vIGNoZWNrIEh0IHByb3RlY3Rpb24gbW9kZS4gYW5kIGFkaGVyZSB0byB0aGUgTm9uLUdGIGRldmljZSBpbmRpY2F0aW9uIGJ5IEFQLgorCQkJCS8qIGNoZWNrIEh0IHByb3RlY3Rpb24gbW9kZS4gYW5kIGFkaGVyZSB0byB0aGUgTm9uLUdGIGRldmljZSBpbmRpY2F0aW9uIGJ5IEFQLiAqLwogCQkJCWlmICgoQWRkSHRJbmZvTGVuICE9IDApICYmCi0JCQkJCSgoQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpIHx8Ci0JCQkJCShBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgIT0gcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCkpKQotCQkJCXsKLQkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudDsKLQkJCQkJcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSA9IEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZTsKLQkJCQkJaWYgKHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPT0gMSkKLQkJCQl7Ci0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIFRSVUUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOworCQkJCSAgICAoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPQorCQkJCSAgICAgIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi4KKwkJCQkgICAgICBPcGVyYWlvbk1vZGUpCisJCQkJICAgICB8fCAoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9CisJCQkJCSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCSBOb25HZlByZXNlbnQpKSkgeworCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCSAgICBOb25HZlByZXNlbnQgPQorCQkJCQkgICAgQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50OworCQkJCQlwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuCisJCQkJCSAgICBPcGVyYWlvbk1vZGUgPQorCQkJCQkgICAgQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOworCQkJCQlpZiAocEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLgorCQkJCQkgICAgTm9uR2ZQcmVzZW50ID09IDEpIHsKKwkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwKKwkJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJCSAgQWRkSHRJbmZvLgorCQkJCQkJCQkgIEFkZEh0SW5mbzIuCisJCQkJCQkJCSAgT3BlcmFpb25Nb2RlLAorCQkJCQkJCQkgIEFMTE5fU0VUUFJPVEVDVCwKKwkJCQkJCQkJICBGQUxTRSwgVFJVRSk7CisJCQkJCX0gZWxzZQorCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLAorCQkJCQkJCQkgIHBBZC0+TWxtZUF1eC4KKwkJCQkJCQkJICBBZGRIdEluZm8uCisJCQkJCQkJCSAgQWRkSHRJbmZvMi4KKwkJCQkJCQkJICBPcGVyYWlvbk1vZGUsCisJCQkJCQkJCSAgQUxMTl9TRVRQUk9URUNULAorCQkJCQkJCQkgIEZBTFNFLCBGQUxTRSk7CiAKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGNoYW5nZWQgTiBPcGVyYWlvbk1vZGUgdG8gJWRcbiIsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpKTsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJTWU5DIC0gQVAgY2hhbmdlZCBOIE9wZXJhaW9uTW9kZSB0byAlZFxuIiwKKwkJCQkJCSAgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby4KKwkJCQkJCSAgQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUpKTsKIAkJCQl9CiAKLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpICYmCi0JCQkJCUVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKEVycCkpCi0JCQkJewotCQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEFQIGZvcmNlZCB0byB1c2UgTE9ORyBwcmVhbWJsZVxuIikpOworCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpCisJCQkJICAgICYmIEVSUF9JU19VU0VfQkFSS0VSX1BSRUFNQkxFKEVycCkpIHsKKwkJCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLAorCQkJCQkJCSAgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlNZTkMgLSBBUCBmb3JjZWQgdG8gdXNlIGxvbmcgcHJlYW1ibGVcbiIpKTsKIAkJCQl9CiAKLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAgICAmJgotCQkJCQkoRWRjYVBhcm0uYlZhbGlkID09IFRSVUUpICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotCQkJCQkoRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICE9IHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBBUCBjaGFuZ2UgRURDQSBwYXJhbWV0ZXJzKGZyb20gJWQgdG8gJWQpXG4iLAotCQkJCQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQsCi0JCQkJCQlFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKTsKKwkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkKKwkJCQkgICAgJiYgKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKQorCQkJCSAgICAmJiAoRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50ICE9CisJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uCisJCQkJCUVkY2FVcGRhdGVDb3VudCkpIHsKKwkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKKwkJCQkJCSAgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS4KKwkJCQkJCSAgRWRjYVVwZGF0ZUNvdW50LAorCQkJCQkJICBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQpKTsKIAkJCQkJQXNpY1NldEVkY2FQYXJtKHBBZCwgJkVkY2FQYXJtKTsKIAkJCQl9Ci0KLQkJCQkvLyBjb3B5IFFPUyByZWxhdGVkIGluZm9ybWF0aW9uCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUWJzc0xvYWQsICZRYnNzTG9hZCwgc2l6ZW9mKFFCU1NfTE9BRF9QQVJNKSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJlFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7CisJCQkJLyogY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLAorCQkJCQkgICAgICAgJlFic3NMb2FkLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9xYnNzX2xvYWRfcGFybSkpOworCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksCisJCQkJCSAgICAgICAmUW9zQ2FwYWJpbGl0eSwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcW9zX2NhcGFiaWxpdHlfcGFybSkpOwogCQkJfQotCi0JCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgc3VwcG9ydCBwb3dlci1zYXZpbmcgZmVhdHVyZQotCQkJaWYgKChJTkZSQV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpKSB8fCAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpCi0JCQl7Ci0JCQkJVUNIQVIgRnJlZU51bWJlcjsKLQkJCQkvLyAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwKLQkJCQkvLyAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UKLQkJCQkvLyAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRQotCQkJCS8vICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRQotCQkJCS8vICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuCi0JCQkJaWYgKE1lc3NhZ2VUb01lKQotCQkJCXsKLSNpZmRlZiBSVDI4NjAKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJLyogb25seSBJTkZSQVNUUlVDVFVSRSBtb2RlIHN1cHBvcnQgcG93ZXItc2F2aW5nIGZlYXR1cmUgKi8KKwkJCWlmICgoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSkKKwkJCSAgICB8fCAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpIHsKKwkJCQl1OCBGcmVlTnVtYmVyOworCQkJCS8qICAxLiBBUCBoYXMgYmFja2xvZ2dlZCB1bmljYXN0LXRvLW1lIGZyYW1lLCBzdGF5IEFXQUtFLCBzZW5kIFBTUE9MTCAqLworCQkJCS8qICAyLiBBUCBoYXMgYmFja2xvZ2dlZCBicm9hZGNhc3QvbXVsdGljYXN0IGZyYW1lIGFuZCB3ZSB3YW50IHRob3NlIGZyYW1lcywgc3RheSBBV0FLRSAqLworCQkJCS8qICAzLiB3ZSBoYXZlIG91dGdvaW5nIGZyYW1lcyBpbiBUeFJpbmcgb3IgTWdtdFJpbmcsIGJldHRlciBzdGF5IEFXQUtFICovCisJCQkJLyogIDQuIFBzbSBjaGFuZ2UgdG8gUFdSX1NBVkUsIGJ1dCBBUCBub3QgYmVlbiBpbmZvcm1lZCB5ZXQsIHdlIGJldHRlciBzdGF5IEFXQUtFICovCisJCQkJLyogIDUuIG90aGVyd2lzZSwgcHV0IFBIWSBiYWNrIHRvIHNsZWVwIHRvIHNhdmUgYmF0dGVyeS4gKi8KKwkJCQlpZiAoTWVzc2FnZVRvTWUpIHsKKyNpZmRlZiBSVE1QX01BQ19QQ0kKKwkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRworCQkJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpIHsKKwkJCQkJCS8qIFJlc3RvcmUgdG8gY29ycmVjdCBCQlAgUjMgdmFsdWUgKi8KKwkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4KKwkJCQkJCSAgICAxKQorCQkJCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQKKwkJCQkJCQkgICAgKHBBZCwgQkJQX1IzLAorCQkJCQkJCSAgICAgcEFkLT5TdGFDZmcuQkJQUjMpOworCQkJCQkJLyogVHVybiBjbGsgdG8gODBNaHouICovCiAJCQkJCX0KLSNlbmRpZgotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBUUlVFOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCVJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQmNhc3RGbGFnICYmIChEdGltQ291bnQgPT0gMCkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pKQorI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlCisJCQkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLgorCQkJCQkgICAgYkFQU0RDYXBhYmxlCisJCQkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFCisJCQkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLCisJCQkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJCisJCQkJCSAgICAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKSB7CisJCQkJCQlwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCSAgICBiTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPQorCQkJCQkJICAgIFRSVUU7CisJCQkJCX0gZWxzZQorCQkJCQkJUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKTsKKwkJCQl9IGVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApCisJCQkJCSAgICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsCisJCQkJCQkJCSBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSkpCiAJCQkJewotI2lmZGVmIFJUMjg2MAotCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BRFZBTkNFX1BPV0VSX1NBVkVfUENJRV9ERVZJQ0UpKQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7CisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+CisJCQkJCQkgICAgMSkKKwkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkJICAgIChwQWQsIEJCUF9SMywKKwkJCQkJCQkgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKIAkJCQkJfQotI2VuZGlmCi0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQotCQkJCXsKLQkJCQkJLy8gVE9ETzogY29uc2lkZXIgc2NoZWR1bGVkIEhDQ0EuIG1pZ2h0IG5vdCBiZSBwcm9wZXIgdG8gdXNlIHRyYWRpdGlvbmFsIERUSU0tYmFzZWQgcG93ZXItc2F2aW5nIHNjaGVtZQotCQkJCQkvLyBjYW4gd2UgY2hlYXQgaGVyZSAoaS5lLiBqdXN0IGNoZWNrIE1HTVQgJiBBQ19CRSkgZm9yIGJldHRlciBwZXJmb3JtYW5jZT8KLSNpZmRlZiBSVDI4NjAKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURWQU5DRV9QT1dFUl9TQVZFX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOworI2VuZGlmIC8qIFJUTVBfTUFDX1BDSSAvLyAqLworCQkJCX0gZWxzZQorCQkJCSAgICBpZiAoKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyICE9IDApCisJCQkJCXx8IChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlciAhPQorCQkJCQkgICAgMCkKKwkJCQkJfHwgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9CisJCQkJCSAgICAwKQorCQkJCQl8fCAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5OdW1iZXIgIT0KKwkJCQkJICAgIDApCisJCQkJCXx8CisJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QKKwkJCQkJIChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwKKwkJCQkJICAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJfHwKKwkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdAorCQkJCQkgKHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLAorCQkJCQkgICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQorCQkJCQl8fAorCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0CisJCQkJCSAocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsCisJCQkJCSAgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXx8CisJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QKKwkJCQkJIChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwKKwkJCQkJICAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKKwkJCQkJfHwKKwkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdAorCQkJCQkgKHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwKKwkJCQkJICAmRnJlZU51bWJlcikgIT0KKwkJCQkJIE5ESVNfU1RBVFVTX1NVQ0NFU1MpKSB7CisJCQkJCS8qIFRPRE86IGNvbnNpZGVyIHNjaGVkdWxlZCBIQ0NBLiBtaWdodCBub3QgYmUgcHJvcGVyIHRvIHVzZSB0cmFkaXRpb25hbCBEVElNLWJhc2VkIHBvd2VyLXNhdmluZyBzY2hlbWUgKi8KKwkJCQkJLyogY2FuIHdlIGNoZWF0IGhlcmUgKGkuZS4ganVzdCBjaGVjayBNR01UICYgQUNfQkUpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2U/ICovCisjaWZkZWYgUlRNUF9NQUNfUENJCisJCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcKKwkJCQkJICAgIChwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKSB7CisJCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+CisJCQkJCQkgICAgMSkKKwkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lECisJCQkJCQkJICAgIChwQWQsIEJCUF9SMywKKwkJCQkJCQkgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKIAkJCQkJfQotI2VuZGlmCi0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVVTSE9SVCBOZXh0RHRpbSA9IER0aW1Db3VudDsKKyNlbmRpZiAvKiBSVE1QX01BQ19QQ0kgLy8gKi8KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkgICAgIGJBQ01BUFNEVHJbUUlEX0FDX1ZPXSkKKwkJCQkJICAgIHx8IChwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCWJBQ01BUFNEVHJbUUlEX0FDX1ZJXSkKKwkJCQkJICAgIHx8IChwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCWJBQ01BUFNEVHJbUUlEX0FDX0JLXSkKKwkJCQkJICAgIHx8IChwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCWJBQ01BUFNEVHJbUUlEX0FDX0JFXSkpIHsKKwkJCQkJCS8qCisJCQkJCQkgICBXTU0gU3BlYyB2MS4wIDMuNi4yLjQsCisJCQkJCQkgICBUaGUgV01NIFNUQSBzaGFsbCByZW1haW4gYXdha2UgdW50aWwgaXQgcmVjZWl2ZXMgYQorCQkJCQkJICAgUW9TIERhdGEgb3IgTnVsbCBmcmFtZSBhZGRyZXNzZWQgdG8gaXQsIHdpdGggdGhlCisJCQkJCQkgICBFT1NQIHN1YmZpZWxkIGluIFFvUyBDb250cm9sIGZpZWxkIHNldCB0byAxLgogCi0JCQkJCWlmIChOZXh0RHRpbSA9PSAwKQotCQkJCQkJTmV4dER0aW0gPSBEdGltUGVyaW9kOworCQkJCQkJICAgU28gd2UgY2FuIG5vdCBzbGVlcCBoZXJlIG9yIHdlIHdpbGwgc3VmZmVyIGEgY2FzZToKIAotCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OwotCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQotCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOworCQkJCQkJICAgUFMgTWFuYWdlbWVudCBGcmFtZSAtLT4KKwkJCQkJCSAgIFRyaWdnZXIgZnJhbWUgLS0+CisJCQkJCQkgICBCZWFjb24gKFRJTT0wKSAoQmVhY29uIGlzIGNsb3NlciB0byBUcmlnIGZyYW1lKSAtLT4KKwkJCQkJCSAgIFN0YXRpb24gZ29lcyB0byBzbGVlcCAtLT4KKwkJCQkJCSAgIEFQIGRlbGl2ZXJ5IHF1ZXVlZCBVQVBTRCBwYWNrZXRzIC0tPgorCQkJCQkJICAgU3RhdGlvbiBjYW4gTk9UIHJlY2VpdmUgdGhlIHJlcGx5CiAKLQkJCQkJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQkJCQl7Ci0jaWZkZWYgUlQyODYwCi0JCQkJCQkvLyBTZXQgYSBmbGFnIHRvIGdvIHRvIHNsZWVwIC4gVGhlbiBhZnRlciBwYXJzZSB0aGlzIFJ4RG9uZUludGVycnVwdCwgd2lsbCBnbyB0byBzbGVlcCBtb2RlLgotCQkJCQkJUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQkJCQkJCXBBZC0+VGhpc1RidHROdW1Ub05leHRXYWtlVXAgPSBUYnR0TnVtVG9OZXh0V2FrZVVwOwotI2VuZGlmCi0jaWZkZWYgUlQyODcwCi0JCQkJCQlBc2ljU2xlZXBUaGVuQXV0b1dha2V1cChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOwotI2VuZGlmCisJCQkJCQkgICBNYXliZSB3ZSBuZWVkIGEgdGltZW91dCB0aW1lciB0byBhdm9pZCB0aGF0IHdlIGRvCisJCQkJCQkgICBOT1QgcmVjZWl2ZSB0aGUgRU9TUCBmcmFtZS4KKworCQkJCQkJICAgV2UgY2FuIG5vdCB1c2UgTW9yZSBEYXRhIHRvIGNoZWNrIGlmIFNQIGlzIGVuZGVkCisJCQkJCQkgICBkdWUgdG8gTWF4U1BMZW5ndGguCisJCQkJCQkgKi8KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXUxNiBOZXh0RHRpbSA9IER0aW1Db3VudDsKKworCQkJCQkJaWYgKE5leHREdGltID09IDApCisJCQkJCQkJTmV4dER0aW0gPSBEdGltUGVyaW9kOworCisJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0KKwkJCQkJCSAgICBwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICBEZWZhdWx0TGlzdGVuQ291bnQ7CisJCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCQkgICAgKHBBZCwKKwkJCQkJCSAgICAgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pCisJCQkJCQkgICAgJiYgKFRidHROdW1Ub05leHRXYWtlVXAgPgorCQkJCQkJCU5leHREdGltKSkKKwkJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0KKwkJCQkJCQkgICAgTmV4dER0aW07CisKKwkJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHCisJCQkJCQkgICAgKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkgeworCQkJCQkJCS8qIFNldCBhIGZsYWcgdG8gZ28gdG8gc2xlZXAgLiBUaGVuIGFmdGVyIHBhcnNlIHRoaXMgUnhEb25lSW50ZXJydXB0LCB3aWxsIGdvIHRvIHNsZWVwIG1vZGUuICovCisJCQkJCQkJcEFkLT4KKwkJCQkJCQkgICAgVGhpc1RidHROdW1Ub05leHRXYWtlVXAKKwkJCQkJCQkgICAgPQorCQkJCQkJCSAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOworCQkJCQkJCUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwCisJCQkJCQkJICAgIChwQWQsCisJCQkJCQkJICAgICBwQWQtPgorCQkJCQkJCSAgICAgVGhpc1RidHROdW1Ub05leHRXYWtlVXApOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9Ci0JCS8vIG5vdCBteSBCU1NJRCwgaWdub3JlIGl0CisJCS8qIG5vdCBteSBCU1NJRCwgaWdub3JlIGl0ICovCiAJfQotCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQorCS8qIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZSAqLwogfQogCiAvKgpAQCAtMTYxMiwxMTYgKzE3MDMsMTI2IEBACiAJCVJlY2VpdmUgUFJPQkUgUkVRIGZyb20gcmVtb3RlIHBlZXIgd2hlbiBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBQZWVyUHJvYmVSZXFBY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVQ0hBUiAgICAgICAgIFNzaWRMZW47Ci0JVUNIQVIJCSAgSHRMZW4sIEFkZEh0TGVuLCBOZXdFeHRMZW47Ci0JSEVBREVSXzgwMl8xMSBQcm9iZVJzcEhkcjsKLQlORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0JUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKKwl1OCBBZGRyMltNQUNfQUREUl9MRU5dOworCWNoYXIgU3NpZFtNQVhfTEVOX09GX1NTSURdOworCXU4IFNzaWRMZW47CisJdTggSHRMZW4sIEFkZEh0TGVuLCBOZXdFeHRMZW47CisJc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEgUHJvYmVSc3BIZHI7CisJaW50IE5TdGF0dXM7CisJdTggKnBPdXRCdWZmZXIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOwogCUxBUkdFX0lOVEVHRVIgRmFrZVRpbWVzdGFtcDsKLQlVQ0hBUiAgICAgICAgIERzTGVuID0gMSwgSWJzc0xlbiA9IDI7Ci0JVUNIQVIgICAgICAgICBMb2NhbEVycEllWzNdID0ge0lFX0VSUCwgMSwgMH07Ci0JQk9PTEVBTiAgICAgICBQcml2YWN5OwotCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87Ci0JVUNIQVIJCSAgUlNOSWUgPSBJRV9XUEE7CisJdTggRHNMZW4gPSAxLCBJYnNzTGVuID0gMjsKKwl1OCBMb2NhbEVycEllWzNdID0geyBJRV9FUlAsIDEsIDAgfTsKKwlCT09MRUFOIFByaXZhY3k7CisJdTE2IENhcGFiaWxpdHlJbmZvOworCXU4IFJTTkllID0gSUVfV1BBOwogCi0JaWYgKCEgQURIT0NfT04ocEFkKSkKKwlpZiAoIUFESE9DX09OKHBBZCkpCiAJCXJldHVybjsKIAotCWlmIChQZWVyUHJvYmVSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkKLQl7Ci0JCWlmICgoU3NpZExlbiA9PSAwKSB8fCBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQotCQl7Ci0JCQkvLyBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUKLQkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5CisJaWYgKFBlZXJQcm9iZVJlcVNhbml0eQorCSAgICAocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsIFNzaWQsICZTc2lkTGVuKSkgeworCQlpZiAoKFNzaWRMZW4gPT0gMCkKKwkJICAgIHx8IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKSB7CisJCQkvKiBhbGxvY2F0ZSBhbmQgc2VuZCBvdXQgUHJvYmVSc3AgZnJhbWUgKi8KKwkJCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CS8qR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkgKi8KIAkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCiAJCQkJcmV0dXJuOwogCi0JCQkvL3BBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOyAgLy8gPz8/Pz8/CisJCQkvKnBBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOyAgLy8gPz8/Pz8/ICovCiAKLQkJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8Ci0JCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7Ci0JCQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKKwkJCVByaXZhY3kgPQorCQkJICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0KKwkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkKKwkJCSAgICB8fCAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJCSAgICB8fCAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCQkJTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7CisJCQlDYXBhYmlsaXR5SW5mbyA9CisJCQkgICAgQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksCisJCQkJCSAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PQorCQkJCQkgIFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDAsIDApOwogCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAmUHJvYmVSc3BIZHIsCi0JCQkJCQkJICBUSU1FU1RBTVBfTEVOLCAgICAgICAgICAgICAgICAmRmFrZVRpbWVzdGFtcCwKLQkJCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QsCi0JCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sCi0JCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCAgICAgICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgICAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0llLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRzTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0llLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NMZW4sCi0JCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuQXRpbVdpbiwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICZGcmFtZUxlbiwKKwkJCQkJICBzaXplb2Yoc3RydWN0IHJ0X2hlYWRlcl84MDJfMTEpLCAmUHJvYmVSc3BIZHIsCisJCQkJCSAgVElNRVNUQU1QX0xFTiwgJkZha2VUaW1lc3RhbXAsCisJCQkJCSAgMiwgJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCwKKwkJCQkJICAyLCAmQ2FwYWJpbGl0eUluZm8sCisJCQkJCSAgMSwgJlNzaWRJZSwKKwkJCQkJICAxLCAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKKwkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIDEsICZTdXBSYXRlSWUsIDEsCisJCQkJCSAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJCSAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCAxLCAmRHNJZSwgMSwKKwkJCQkJICAmRHNMZW4sIDEsICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCAxLAorCQkJCQkgICZJYnNzSWUsIDEsICZJYnNzTGVuLCAyLAorCQkJCQkgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLCBFTkRfT0ZfQVJHUyk7CiAKLQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuKQotCQkJewotCQkJCVVMT05HIHRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAotCQkJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKLQkJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQlpZiAocEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbikgeworCQkJCXVuc2lnbmVkIGxvbmcgdG1wOworCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgJnRtcCwKKwkJCQkJCSAgMywgTG9jYWxFcnBJZSwKKwkJCQkJCSAgMSwgJkV4dFJhdGVJZSwKKwkJCQkJCSAgMSwgJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCisJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLkV4dFJhdGVMZW4sCisJCQkJCQkgICZwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CisJCQkJRnJhbWVMZW4gKz0gdG1wOworCQkJfQorCQkJLyogSWYgYWRob2Mgc2VjcnVpdHkgaXMgc2V0IGZvciBXUEEtTm9uZSwgYXBwZW5kIHRoZSBjaXBoZXIgc3VpdGUgSUUgKi8KKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB7CisJCQkJdW5zaWduZWQgbG9uZyB0bXA7CisJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAmdG1wLAorCQkJCQkJICAxLCAmUlNOSWUsCisJCQkJCQkgIDEsICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKKwkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOX0lFLAorCQkJCQkJICBFTkRfT0ZfQVJHUyk7CiAJCQkJRnJhbWVMZW4gKz0gdG1wOwogCQkJfQogCi0JCQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQotCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCQl7Ci0JCQkJVUxPTkcgdG1wOwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgIAkmdG1wLAotCQkJCQkJICAJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKLQkJCQkJCSAgCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCi0JCQkJCQkgIAkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgICAgICAJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQkJICAJCQlFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gdG1wOwotCQkJfQotCi0JCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUglCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgeworCQkJCXVuc2lnbmVkIGxvbmcgVG1wTGVuOworCQkJCXU4IEJST0FEQ09NWzRdID0geyAweDAsIDB4OTAsIDB4NGMsIDB4MzMgfTsKIAkJCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOwogCQkJCUFkZEh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7CiAJCQkJTmV3RXh0TGVuID0gMTsKLQkJCQkvL05ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgSUUgaXMgaW5jbHVkZWQgaW4gQmVhY29uLCBQcm9iZSBSc3Agb3IgY2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IEZyYW1lCi0JCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0SW5mb0llLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRMZW4sCi0JCQkJCQkJCSBzaXplb2YoQUREX0hUX0lORk9fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0Q2hhbkllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0TGVuLAotCQkJCQkJCQkgc2l6ZW9mKE5FV19FWFRfQ0hBTl9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJCQkvKk5ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgSUUgaXMgaW5jbHVkZWQgaW4gQmVhY29uLCBQcm9iZSBSc3Agb3IgY2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IEZyYW1lICovCisJCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkgeworCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCisJCQkJCQkJICAmVG1wTGVuLCAxLCAmV3BhSWUsIDQsCisJCQkJCQkJICAmQlJPQURDT01bMF0sCisJCQkJCQkJICBwQWQtPk1sbWVBdXguCisJCQkJCQkJICBIdENhcGFiaWxpdHlMZW4sCisJCQkJCQkJICAmcEFkLT5NbG1lQXV4LgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOworCQkJCX0gZWxzZSB7CisJCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwKKwkJCQkJCQkgICZUbXBMZW4sIDEsICZIdENhcEllLAorCQkJCQkJCSAgMSwgJkh0TGVuLAorCQkJCQkJCSAgc2l6ZW9mCisJCQkJCQkJICAoc3RydWN0IHJ0X2h0X2NhcGFiaWxpdHlfaWUpLAorCQkJCQkJCSAgJnBBZC0+Q29tbW9uQ2ZnLgorCQkJCQkJCSAgSHRDYXBhYmlsaXR5LCAxLAorCQkJCQkJCSAgJkFkZEh0SW5mb0llLCAxLAorCQkJCQkJCSAgJkFkZEh0TGVuLAorCQkJCQkJCSAgc2l6ZW9mCisJCQkJCQkJICAoc3RydWN0IHJ0X2FkZF9odF9pbmZvX2llKSwKKwkJCQkJCQkgICZwQWQtPkNvbW1vbkNmZy4KKwkJCQkJCQkgIEFkZEhUSW5mbywgMSwKKwkJCQkJCQkgICZOZXdFeHRDaGFuSWUsIDEsCisJCQkJCQkJICAmTmV3RXh0TGVuLAorCQkJCQkJCSAgc2l6ZW9mCisJCQkJCQkJICAoc3RydWN0IHJ0X25ld19leHRfY2hhbl9pZSksCisJCQkJCQkJICAmcEFkLT5Db21tb25DZmcuCisJCQkJCQkJICBOZXdFeHRDaGFuT2Zmc2V0LAorCQkJCQkJCSAgRU5EX09GX0FSR1MpOwogCQkJCX0KIAkJCQlGcmFtZUxlbiArPSBUbXBMZW47CiAJCQl9CkBAIC0xNzMyLDExICsxODMzLDkgQEAKIAl9CiB9CiAKLVZPSUQgQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCit2b2lkIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCBTdGF0dXM7CisJdTE2IFN0YXR1czsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvblxuIikpOwogCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKQEAgLTE3NDksMjAgKzE4NDgsMTggQEAKIAkJU2NhbiB0aW1lb3V0IHByb2NlZHVyZS4gYmFzaWNhbGx5IGFkZCBjaGFubmVsIGluZGV4IGJ5IDEgYW5kIHJlc2NhbgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBTY2FuVGltZW91dEFjdGlvbihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9tbG1lX3F1ZXVlX2VsZW0gKkVsZW0pCiB7CiAJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSBOZXh0Q2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKIAotCS8vIE9ubHkgb25lIGNoYW5uZWwgc2Nhbm5lZCBmb3IgQ0lTQ08gYmVhY29uIHJlcXVlc3QKKwkvKiBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0ICovCiAJaWYgKChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8Ci0JCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8Ci0JCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQorCSAgICAocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fUEFTU0lWRSkgfHwKKwkgICAgKHBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9PSBTQ0FOX0NJU0NPX05PSVNFKSB8fAorCSAgICAocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fQ0hBTk5FTF9MT0FEKSkKIAkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOwogCi0JLy8gdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwCisJLyogdGhpcyByb3V0aW5lIHdpbGwgc3RvcCBpZiBwQWQtPk1sbWVBdXguQ2hhbm5lbCA9PSAwICovCiAJU2Nhbk5leHRDaGFubmVsKHBBZCk7CiB9CiAKQEAgLTE3NzEsMTIgKzE4NjgsMTIgQEAKIAlEZXNjcmlwdGlvbjoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlblNjYW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVlOQyAtIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkFZTkMgLSBJbnZhbGlkU3RhdGVXaGVuU2NhbihzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsCisJCSAgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOwogCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKIAlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKQEAgLTE3ODcsMTIgKzE4ODQsMTIgQEAKIAlEZXNjcmlwdGlvbjoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7CisJdTE2IFN0YXR1czsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLAorCQkgIHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUpKTsKIAlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwogCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7CiAJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7CkBAIC0xODAzLDEyICsxOTAwLDEyIEBACiAJRGVzY3JpcHRpb246CiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQordm9pZCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtICpFbGVtKQogewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOworCXUxNiBTdGF0dXM7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIkludmFsaWRTdGF0ZVdoZW5TdGFydChzdGF0ZT0lbGQpLiBSZXNldCBTWU5DIG1hY2hpbmVcbiIsCisJCSAgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOwogCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7CiAJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKIAlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7CkBAIC0xODIyLDU0ICsxOTE5LDUxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICovCi1WT0lEIEVucXVldWVQc1BvbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIEVucXVldWVQc1BvbGwoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQotICAgIAlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIChQVUNIQVIpJnBBZC0+UHNQb2xsRnJhbWUsIHNpemVvZihQU1BPTExfRlJBTUUpKTsKLX0KIAorCWlmIChwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQorCQlwQWQtPlBzUG9sbEZyYW1lLkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKKwlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsICh1OCAqKSYgcEFkLT5Qc1BvbGxGcmFtZSwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBydF9wc3BvbGxfZnJhbWUpKTsKK30KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCURlc2NyaXB0aW9uOgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KLVZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgRW5xdWV1ZVByb2JlUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0ZTsKLQlQVUNIQVIgICAgICAgICAgcE91dEJ1ZmZlcjsKLQlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCUhFQURFUl84MDJfMTEgICBIZHI4MDIxMTsKKwlpbnQgTlN0YXRlOworCXU4ICpwT3V0QnVmZmVyOworCXVuc2lnbmVkIGxvbmcgRnJhbWVMZW4gPSAwOworCXN0cnVjdCBydF9oZWFkZXJfODAyXzExIEhkcjgwMjExOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZm9yY2Ugb3V0IGEgUHJvYmVSZXF1ZXN0IC4uLlxuIikpOwogCi0JTlN0YXRlID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdGUgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOworCU5TdGF0ZSA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsJLypHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeSAqLworCWlmIChOU3RhdGUgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgeworCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwKKwkJCQkgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKIAotCQkvLyB0aGlzIFByb2JlUmVxdWVzdCBleHBsaWNpdGx5IHNwZWNpZnkgU1NJRCB0byByZWR1Y2UgdW53YW50ZWQgUHJvYmVSZXNwb25zZQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAmSGRyODAyMTEsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuU3NpZExlbiwKLQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwJCSAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLAotCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuLCAgICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKKwkJLyogdGhpcyBQcm9iZVJlcXVlc3QgZXhwbGljaXRseSBzcGVjaWZ5IFNTSUQgdG8gcmVkdWNlIHVud2FudGVkIFByb2JlUmVzcG9uc2UgKi8KKwkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgJkZyYW1lTGVuLAorCQkJCSAgc2l6ZW9mKHN0cnVjdCBydF9oZWFkZXJfODAyXzExKSwgJkhkcjgwMjExLAorCQkJCSAgMSwgJlNzaWRJZSwKKwkJCQkgIDEsICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAorCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwKKwkJCQkgIDEsICZTdXBSYXRlSWUsCisJCQkJICAxLCAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKKwkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCisJCQkJICBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBFTkRfT0ZfQVJHUyk7CiAJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwogCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwogCX0KIAogfQogCi1CT09MRUFOIFNjYW5SdW5uaW5nKAotCQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKK0JPT0xFQU4gU2NhblJ1bm5pbmcoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCXJldHVybiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTQ0FOX0xJU1RFTikgPyBUUlVFIDogRkFMU0U7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhL3dwYS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKaW5kZXggOGMzNGUzOS4uNjliOGEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGEvd3BhLmMKQEAgLTM3LDE4MTMgKzM3LDcgQEAKICovCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLSNkZWZpbmUJCVdQQVJTTklFCTB4ZGQKLSNkZWZpbmUJCVdQQTJSU05JRQkweDMwCi0KLS8vZXh0ZXJuIFVDSEFSIEJJVDhbXTsKLVVDSEFSCUNpcGhlcldwYVBza1RraXBbXSA9IHsKLQkJMHhERCwgMHgxNiwJCQkJLy8gUlNOIElFCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsCS8vIG91aQotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsCS8vIE11bHRpY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdW5pY2FzdAotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyB1bmljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMgkvLyBhdXRoZW50aWNhdGlvbgotCQl9OwotVUNIQVIJQ2lwaGVyV3BhUHNrVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyV3BhUHNrVGtpcCkgLyBzaXplb2YoVUNIQVIpKTsKLQotVUNIQVIJQ2lwaGVyV3BhUHNrQWVzW10gPSB7Ci0JCTB4REQsIDB4MTYsIAkJCS8vIFJTTiBJRQotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlcldwYVBza0Flc0xlbiA9IChzaXplb2YoQ2lwaGVyV3BhUHNrQWVzKSAvIHNpemVvZihVQ0hBUikpOwotCi1VQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTVtdID0gewotCQkweERELCAweDE2LAkJCQkvLyBSU04gSUUKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMSwgLy8gb3VpCi0JCTB4MDEsIDB4MDAsCQkJCS8vIFZlcnNpb24KLQkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gTXVsdGljYXN0Ci0JCTB4MDEsIDB4MDAsCQkJCS8vIE51bWJlciBvZiB1aWNhc3QKLQkJMHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDAgIC8vIEF1dGhlbnRpY2F0aW9uCi0JCX07Ci1VQ0hBUglDaXBoZXJTdWl0ZUNpc2NvQ0NLTUxlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDaXNjb0NDS00pIC8gc2l6ZW9mKFVDSEFSKSk7Ci0KLVVDSEFSCUNpcGhlclN1aXRlQ2lzY29DQ0tNMjRbXSA9IHsKLQkJMHhERCwgMHgxOCwJCQkJLy8gUlNOIElFCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEsIC8vIG91aQotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIE11bHRpY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBOdW1iZXIgb2YgdWljYXN0Ci0JCTB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIC8vIHVuaWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gbnVtYmVyIG9mIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAotCQkweDAwLCAweDQwLCAweDk2LCAweDAwLAotCQkweDI4LCAweDAwLy8gQXV0aGVudGljYXRpb24KLQkJfTsKLQotVUNIQVIJQ2lwaGVyU3VpdGVDaXNjb0NDS00yNExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDaXNjb0NDS00yNCkgLyBzaXplb2YoVUNIQVIpKTsKLQotVUNIQVIJQ2lwaGVyU3VpdGVDQ1hUa2lwW10gPSB7Ci0JCTB4REQsIDB4MTYsCQkJCS8vIFJTTiBJRQotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlclN1aXRlQ0NYVGtpcExlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVDQ1hUa2lwKSAvIHNpemVvZihVQ0hBUikpOwotCi1VQ0hBUglDQ1hfTExDX0hEUltdID0gezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4NDAsIDB4OTYsIDB4MDAsIDB4MDJ9OwotVUNIQVIJTExDX05PUk1BTFtdID0gezB4QUEsIDB4QUEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi1VQ0hBUglFQVBPTF9GUkFNRVtdID0gezB4ODgsIDB4OEV9OwotCi1CT09MRUFOIENoZWNrUlNOSUUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLQlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCi0JT1VUCVVDSEFSCQkJKk9mZnNldCk7Ci0KLXZvaWQgaW5jX2J5dGVfYXJyYXkoVUNIQVIgKmNvdW50ZXIsIGludCBsZW4pOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2xhc3NpZnkgV1BBIEVBUCBtZXNzYWdlIHR5cGUKLQotCUFyZ3VtZW50czoKLQkJRUFQVHlwZQkJVmFsdWUgb2YgRUFQIG1lc3NhZ2UgdHlwZQotCQlNc2dUeXBlCQlJbnRlcm5hbCBNZXNzYWdlIGRlZmluaXRpb24gZm9yIE1MTUUgc3RhdGUgbWFjaGluZQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCQlGb3VuZCBhcHByb3ByaWF0ZSBtZXNzYWdlIHR5cGUKLQkJRkFMU0UJCU5vIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQlBbGwgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHdwYS5oCi0JCUZvciBzdXBwbGljYW50LCB0aGVyZSBpcyBvbmx5IEVBUE9MIEtleSBtZXNzYWdlIGF2YWxpYWJsZQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglXcGFNc2dUeXBlU3Vic3QoCi0JSU4JVUNIQVIJRUFQVHlwZSwKLQlPVVQJSU5UCQkqTXNnVHlwZSkKLXsKLQlzd2l0Y2ggKEVBUFR5cGUpCi0JewotCQljYXNlIEVBUFBhY2tldDoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUFBhY2tldDsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MU3RhcnQ6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBPTFN0YXJ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xMb2dvZmY6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBPTExvZ29mZjsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MS2V5OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xLZXk7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTEFTRkFsZXJ0OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQT0xBU0ZBbGVydDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlhc3NvY2lhdGlvbglzdGF0ZSBtYWNoaW5lIGluaXQsCWluY2x1ZGluZyBzdGF0ZQl0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0JUGFyYW1ldGVyczoKLQkJUyAtCXBvaW50ZXIJdG8gdGhlIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFdwYVBza1N0YXRlTWFjaGluZUluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JU1RBVEVfTUFDSElORSAqUywKLQlPVVQJU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCi17Ci0JU3RhdGVNYWNoaW5lSW5pdChTLAlUcmFucywgTUFYX1dQQV9QU0tfU1RBVEUsIE1BWF9XUEFfUFNLX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBXUEFfUFNLX0lETEUsIFdQQV9NQUNISU5FX0JBU0UpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFNLX0lETEUsIE1UMl9FQVBPTEtleSwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTEtleUFjdGlvbik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBpcwlzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uLgotCQlXaGVuIHJlY2VpdmluZyBFQVBPTCBwYWNrZXRzIHdoaWNoIGlzICBmb3IgODAyLjF4IGtleSBtYW5hZ2VtZW50LgotCQlVc2UJYm90aCBpbglXUEEsIGFuZCBXUEFQU0sJY2FzZS4KLQkJSW4gdGhpcwlmdW5jdGlvbiwgZnVydGhlciBkaXNwYXRjaCB0byBkaWZmZXJlbnQJZnVuY3Rpb25zIGFjY29yZGluZwl0byB0aGUgcmVjZWl2ZWQJcGFja2V0LgkgMyBjYXRlZ29yaWVzIGFyZSA6Ci0JCSAgMS4gIG5vcm1hbCA0LXdheSBwYWlyd2lzZWtleSBhbmQgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlCi0JCSAgMi4gIE1JQyBlcnJvcgkoQ291bnRlcm1lYXN1cmVzIGF0dGFjaykgIHJlcG9ydCBwYWNrZXQJZnJvbSBTVEEuCi0JCSAgMy4gIFJlcXVlc3QgZm9yIHBhaXJ3aXNlL2dyb3VwIGtleSB1cGRhdGUJZnJvbSBTVEEKLQlSZXR1cm46Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1MTUVfUVVFVUVfRUxFTQkqRWxlbSkKLQotewotCUlOVCAgICAgICAgICAgICBNc2dUeXBlID0gRUFQT0xfTVNHX0lOVkFMSUQ7Ci0JUEtFWV9ERVNDUklQVEVSIHBLZXlEZXNjOwotCVBIRUFERVJfODAyXzExICBwSGVhZGVyOyAvL3JlZAotCVVDSEFSICAgICAgICAgICBaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOwotCVVDSEFSIEVhcG9sVnI7Ci0JS0VZX0lORk8JCXBlZXJLZXlJbmZvOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0tLS0+IFdwYUVBUE9MS2V5QWN0aW9uXG4iKSk7Ci0KLQkvLyBHZXQgODAyLjExIGhlYWRlciBmaXJzdAotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKLQotCS8vIEdldCBFQVBvTC1LZXkgRGVzY3JpcHRvcgotCXBLZXlEZXNjID0gKFBLRVlfREVTQ1JJUFRFUikgJkVsZW0tPk1zZ1soTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpXTsKLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEtleURlc2MtPktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOwotCi0JKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykpOwotCi0KLQkvLyAxLiBDaGVjayBFQVBPTCBmcmFtZSB2ZXJzaW9uIGFuZCB0eXBlCi0JRWFwb2xWcgk9IChVQ0hBUikgRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErTEVOR1RIXzgwMl8xX0hdOwotCi0gICAgaWYgKCgoRWFwb2xWciAhPSBFQVBPTF9WRVIpICYmIChFYXBvbFZyICE9IEVBUE9MX1ZFUjIpKSB8fCAoKHBLZXlEZXNjLT5UeXBlICE9IFdQQTFfS0VZX0RFU0MpICYmIChwS2V5RGVzYy0+VHlwZSAhPSBXUEEyX0tFWV9ERVNDKSkpCi0JewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXkgZGVzY3JpcHRlciBkb2VzIG5vdCBtYXRjaCB3aXRoIFdQQSBydWxlXG4iKSk7Ci0JCQlyZXR1cm47Ci0JfQotCi0JLy8gRmlyc3QgdmFsaWRhdGUgcmVwbGF5IGNvdW50ZXIsIG9ubHkgYWNjZXB0IG1lc3NhZ2Ugd2l0aCBsYXJnZXIgcmVwbGF5IGNvdW50ZXIKLQkvLyBMZXQgZXF1YWwgcGFzcywgc29tZSBBUCBzdGFydCB3aXRoIGFsbCB6ZXJvIHJlcGxheSBjb3VudGVyCi0JTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQlpZigoUlRNUENvbXBhcmVNZW1vcnkocEtleURlc2MtPlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCi0JCShSVE1QQ29tcGFyZU1lbW9yeShwS2V5RGVzYy0+UmVwbGF5Q291bnRlciwgWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIgICBSZXBsYXlDb3VudGVyIG5vdCBtYXRjaCAgIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gUHJvY2VzcyBXUEEyUFNLIGZyYW1lCi0JaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQl7Ci0JCWlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgotCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCi0JCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKLQkJewotCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDFcbiIpKTsKLQkJfSBlbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKSAmJgotCQkJKHBlZXJLZXlJbmZvLkVLRF9ETCAgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18zOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAzXG4iKSk7Ci0JCX0gZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBHUk9VUEtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5FS0RfREwgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9HUk9VUF9NU0dfMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wgS2V5IEdyb3VwIE1lc3NhZ2UgMVxuIikpOwotCQl9Ci0KLQkJLy8gV2Ugd2lsbCBhc3N1bWUgbGluayBpcyB1cCAoYXNzb2Mgc3VjZWVzcyBhbmQgcG9ydCBub3Qgc2VjdXJlZCkuCi0JCS8vIEFsbCBzdGF0ZSBoYXMgdG8gYmUgYWJsZSB0byBwcm9jZXNzIG1lc3NhZ2UgZnJvbSBwcmV2aW91cyBzdGF0ZQotCQlzd2l0Y2gocEFkLT5TdGFDZmcuV3BhU3RhdGUpCi0JCXsKLQkJY2FzZSBTU19TVEFSVDoKLQkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKLQkJCXsKLQkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNTX1dBSVRfTVNHXzM6Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhMlBhaXJNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX01TR18zOwotCQkJfQotCQkJZWxzZSBpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0JCQl7Ci0JCQkJV3BhMlBhaXJNc2czQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19XQUlUX0dST1VQOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTU19XQUlUX0dST1VQOgkJLy8gV2hlbiBkb2luZyBncm91cCBrZXkgZXhjaGFuZ2UKLQkJY2FzZSBTU19GSU5JU0g6CQkJLy8gVGhpcyBoYXBwZW5lZCB3aGVuIHVwZGF0ZSBncm91cCBrZXkKLQkJCWlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSkKLQkJCXsKLQkJCSAgICAvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKLQkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCQlXcGEyUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7Ci0JCQl9Ci0JCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKLQkJCXsKLQkJCSAgICAvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKLQkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCQlXcGEyUGFpck1zZzNBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfR1JPVVA7Ci0JCQl9Ci0JCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhR3JvdXBNc2cxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19GSU5JU0g7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLy8gUHJvY2VzcyBXUEFQU0sgRnJhbWUKLQkvLyBDbGFzc2lmeSBtZXNzYWdlIFR5cGUsIGVpdGhlciBwYWlyd2lzZSBtZXNzYWdlIDEsIDMsIG9yIGdyb3VwIG1lc3NhZ2UgMSBmb3Igc3VwcGxpY2FudAotCWVsc2UgaWYocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotCXsKLQkJaWYoKHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpICYmCi0JCQkocGVlcktleUluZm8uS2V5SW5kZXggPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlBY2sgPT0gMSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlNaWMgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5TZWN1cmUgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkpCi0JCXsKLQkJCU1zZ1R5cGUgPSBFQVBPTF9QQUlSX01TR18xOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTCBLZXkgUGFpcndpc2UgTWVzc2FnZSAxXG4iKSk7Ci0JCX0KLQkJZWxzZSBpZigocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkgJiYKLQkJCShwZWVyS2V5SW5mby5LZXlJbmRleCA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleU1pYyA9PSAxKSAmJgotCQkJKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwKSAmJgotCQkJKHBlZXJLZXlJbmZvLkVycm9yID09IDApICYmCi0JCQkocGVlcktleUluZm8uUmVxdWVzdCA9PSAwKSkKLQkJewotCQkJTXNnVHlwZSA9IEVBUE9MX1BBSVJfTVNHXzM7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBQYWlyd2lzZSBNZXNzYWdlIDNcbiIpKTsKLQkJfQotCQllbHNlIGlmKChwZWVyS2V5SW5mby5LZXlUeXBlID09IEdST1VQS0VZKSAmJgotCQkJKHBlZXJLZXlJbmZvLktleUluZGV4ICE9IDApICYmCi0JCQkocGVlcktleUluZm8uS2V5QWNrID09IDEpICYmCi0JCQkocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCi0JCQkocGVlcktleUluZm8uU2VjdXJlID09IDEpICYmCi0JCQkocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCShwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApKQotCQl7Ci0JCQlNc2dUeXBlID0gRUFQT0xfR1JPVVBfTVNHXzE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUE9MIEtleSBHcm91cCBNZXNzYWdlIDFcbiIpKTsKLQkJfQotCi0JCS8vIFdlIHdpbGwgYXNzdW1lIGxpbmsgaXMgdXAgKGFzc29jIHN1Y2Vlc3MgYW5kIHBvcnQgbm90IHNlY3VyZWQpLgotCQkvLyBBbGwgc3RhdGUgaGFzIHRvIGJlIGFibGUgdG8gcHJvY2VzcyBtZXNzYWdlIGZyb20gcHJldmlvdXMgc3RhdGUKLQkJc3dpdGNoKHBBZC0+U3RhQ2ZnLldwYVN0YXRlKQotCQl7Ci0JCWNhc2UgU1NfU1RBUlQ6Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFNTX1dBSVRfTVNHXzM6Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7Ci0JCQl9Ci0JCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKLQkJCXsKLQkJCQlXcGFQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgU1NfV0FJVF9HUk9VUDoJCS8vIFdoZW4gZG9pbmcgZ3JvdXAga2V5IGV4Y2hhbmdlCi0JCWNhc2UgU1NfRklOSVNIOgkJCS8vIFRoaXMgaGFwcGVuZWQgd2hlbiB1cGRhdGUgZ3JvdXAga2V5Ci0JCQlpZihNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpCi0JCQl7Ci0JCQkJV3BhUGFpck1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX1dBSVRfTVNHXzM7Ci0JCQkJLy8gUmVzZXQgcG9ydCBzZWN1cmVkIHZhcmlhYmxlCi0JCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCQl9Ci0JCQllbHNlIGlmKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKLQkJCXsKLQkJCQlXcGFQYWlyTXNnM0FjdGlvbihwQWQsIEVsZW0pOwotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfV0FJVF9HUk9VUDsKLQkJCQkvLyBSZXNldCBwb3J0IHNlY3VyZWQgdmFyaWFibGUKLQkJCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCX0KLQkJCWVsc2UgaWYoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKLQkJCXsKLQkJCQlXcGFHcm91cE1zZzFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQlwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX0ZJTklTSDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0tLSBXcGFFQVBPTEtleUFjdGlvblxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBQYWlyd2lzZSBrZXkgNC13YXkgaGFuZHNoYWtpbmcKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJRWxlbQkJTWVzc2FnZSBib2R5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVdwYVBhaXJNc2cxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOwotCVVDSEFSCQkJCSptcG9vbCwgKlBUSywgKmRpZ2VzdDsKLQlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzE7Ci0JRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7Ci0JVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzFBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBhbGxvY2F0ZSBtZW1vcnkgcG9vbAotCW9zX2FsbG9jX21lbShwQWQsIChQVUNIQVIgKikmbXBvb2wsIDI1Nik7Ci0KLQlpZiAobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gUFRLIExlbiA9IDgwLgotCVBUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLy8gZGlnZXN0IExlbiA9IDgwLgotCWRpZ2VzdCA9IChVQ0hBUiAqKSBST1VORF9VUChQVEsgKyA4MCwgNCk7Ci0KLQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSBFbGVtLT5Nc2c7Ci0KLQkvLyBQcm9jZXNzIG1lc3NhZ2UgMSBmcm9tIGF1dGhlbnRpY2F0b3IKLQlwTXNnMSA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0KLQkvLyAxLiBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCi0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyAyLiBTYXZlIEFOb25jZQotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCi0JR2VuUmFuZG9tKHBBZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5TdGFDZmcuU05vbmNlKTsKLQotCS8vIENhbGMgUFRLKEFOb25jZSwgU05vbmNlKQotCVdwYUNvdW50UFRLKHBBZCwKLQkJcEFkLT5TdGFDZmcuUE1LLAotCQlwQWQtPlN0YUNmZy5BTm9uY2UsCi0JCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAotCQlwQWQtPlN0YUNmZy5TTm9uY2UsCi0JCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCVBUSywKLQkJTEVOX1BUSyk7Ci0KLQkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIFBUSywgTEVOX1BUSyk7Ci0KLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCS8vIFplcm8gTWVzc2FnZSAyIGJvZHkKLQlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OwotCS8vCi0JLy8gTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKLQkvLwotCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotCS8vIDEuIEtleSBkZXNjcmlwdG9yIHZlcnNpb24gYW5kIGFwcHJvcHJpYXRlIFJTTiBJRQotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDI7Ci0JfQotCWVsc2UJICAvLyBUS0lQCi0JewotCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOwotCX0KLQotCS8vIGZpbGwgaW4gRGF0YSBNYXRlcmlhbCBhbmQgaXRzIGxlbmd0aAotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMF0gPSBJRV9XUEE7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKLQlOZGlzTW92ZU1lbW9yeSgmUGFja2V0LktleURlc2MuS2V5RGF0YVsyXSwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCi0JLy8gVXBkYXRlIHBhY2tldCBsZW5ndGggYWZ0ZXIgZGVjaWRlIEtleSBkYXRhIHBheWxvYWQKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyBQYWNrZXQuS2V5RGVzYy5LZXlEYXRhTGVuWzFdOwotCi0JLy8gVXBkYXRlIEtleSBsZW5ndGgKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMF07Ci0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzEtPktleURlc2MuS2V5TGVuZ3RoWzFdOwotCS8vIDIuIEtleSBUeXBlIFBlZXJLZXkKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKLQotCS8vIDMuIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOwotCi0JLy9Db252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQotCS8vIDQuIEZpbGwgU05vbmNlCi0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5Tm9uY2UsIHBBZC0+U3RhQ2ZnLlNOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKTsKLQotCS8vIDUuIEtleSBSZXBsYXkgQ291bnQKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIFNlbmQgRUFQT0woMCwgMSwgMCwgMCwgMCwgUCwgMCwgU05vbmNlLCBNSUMsIFJTTl9JRSkKLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSAyCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gNi4gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewkvLyBBRVMKLQotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIFBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7CS8vIFRLSVAKLQkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKLQl9Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JLy9oZXhfZHVtcCgiTUlDIiwgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKLQkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkJJkhlYWRlcjgwMl8zLAotCQkJCQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCi0JLy8gNS4gQ29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1zZyAyIHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7Ci0Jb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYVBhaXJNc2cxQWN0aW9uIDwtLS0tLVxuIikpOwotfQotCi1WT0lEIFdwYTJQYWlyTXNnMUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlVQ0hBUgkJCQkqbXBvb2wsICpQVEssICpkaWdlc3Q7Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBNc2cxOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYTJQYWlyTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIGFsbG9jYXRlIG1lbW9yeSBwb29sCi0Jb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMjU2KTsKLQotCWlmIChtcG9vbCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvLyBQVEsgTGVuID0gODAuCi0JUFRLID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKLQkvLyBkaWdlc3QgTGVuID0gODAuCi0JZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKFBUSyArIDgwLCA0KTsKLQotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKLQotCS8vIFByb2Nlc3MgbWVzc2FnZSAxIGZyb20gYXV0aGVudGljYXRvcgotCQlwTXNnMSA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0KLQkvLyAxLiBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCi0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzEtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyAyLiBTYXZlIEFOb25jZQotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkFOb25jZSwgcE1zZzEtPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyBHZW5lcmF0ZSByYW5kb20gU05vbmNlCi0JR2VuUmFuZG9tKHBBZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5TdGFDZmcuU05vbmNlKTsKLQotCWlmKHBNc2cxLT5LZXlEZXNjLktleURhdGFMZW5bMV0gPiAwICkKLQl7Ci0JCS8vIGNhY2hlZCBQTUtJRAotCX0KLQotCS8vIENhbGMgUFRLKEFOb25jZSwgU05vbmNlKQotCVdwYUNvdW50UFRLKHBBZCwKLQkJcEFkLT5TdGFDZmcuUE1LLAotCQlwQWQtPlN0YUNmZy5BTm9uY2UsCi0JCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAotCQlwQWQtPlN0YUNmZy5TTm9uY2UsCi0JCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCVBUSywKLQkJTEVOX1BUSyk7Ci0KLQkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QVEssIFBUSywgTEVOX1BUSyk7Ci0KLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCS8vIFplcm8gbWVzc2FnZSAyIGJvZHkKLQlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OwotCS8vCi0JLy8gTWVzc2FnZSAyIGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCxTTm9uY2UsTUlDLFJTTiBJRSkKLQkvLwotCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotCi0JLy8gMS4gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCi0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAyOwotCX0KLQllbHNlCSAgLy8gVEtJUAotCXsKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMTsKLQl9Ci0KLQkvLyBmaWxsIGluIERhdGEgTWF0ZXJpYWwgYW5kIGl0cyBsZW5ndGgKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzBdID0gSUVfV1BBMjsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzFdID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV0gPSBwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyOwotCU5kaXNNb3ZlTWVtb3J5KCZQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdLCBwQWQtPlN0YUNmZy5SU05fSUUsIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0KLQkvLyBVcGRhdGUgcGFja2V0IGxlbmd0aCBhZnRlciBkZWNpZGUgS2V5IGRhdGEgcGF5bG9hZAotCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSArIFBhY2tldC5LZXlEZXNjLktleURhdGFMZW5bMV07Ci0KLQkvLyAyLiBLZXkgVHlwZSBQZWVyS2V5Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gUEFJUldJU0VLRVk7Ci0KLQkvLyAzLiBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQotCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gMDsKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMV0gPSBwTXNnMS0+S2V5RGVzYy5LZXlMZW5ndGhbMV07Ci0KLQkvLyA0LiBGaWxsIFNOb25jZQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU5vbmNlLCBwQWQtPlN0YUNmZy5TTm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyA1LiBLZXkgUmVwbGF5IENvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQkvLyBTZW5kIEVBUE9MLUtleSgwLDEsMCwwLDAsUCwwLFNOb25jZSxNSUMsUlNOIElFKQotCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDIKLQlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgJkZyYW1lTGVuLAotCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQlFTkRfT0ZfQVJHUyk7Ci0KLQkvLyA2LiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQotCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJaG1hY19tZDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKLQl9Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0KLQkvLyBNYWtlICBUcmFuc21pdHRpbmcgZnJhbWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKLQkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCi0JCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0KLQkvLyA1LiBDb3B5IGZyYW1lIHRvIFR4IHJpbmcKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCW9zX2ZyZWVfbWVtKHBBZCwgbXBvb2wpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2cxQWN0aW9uIDwtLS0tLVxuIikpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSA0LXdheSBoYW5kc2hha2luZwotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJV3BhUGFpck1zZzNBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQotCi17Ci0JUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOwotCVBVQ0hBUiAgICAgICAgICAJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JVUxPTkcgICAgICAgICAgIAlGcmFtZUxlbiA9IDA7Ci0JRUFQT0xfUEFDS0VUICAgICAgICBQYWNrZXQ7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMzsKLQlVQ0hBUiAgICAgICAgICAgCU1pY1sxNl0sIE9sZE1pY1sxNl07Ci0JTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5ID0gTlVMTDsKLQlVQ0hBUgkJCQlza2lwX29mZnNldDsKLQlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhUGFpck1zZzNBY3Rpb24gLS0tLS0+XG4iKSk7Ci0KLQkvLyBSZWNvcmQgODAyLjExIGhlYWRlciAmIHRoZSByZWNlaXZlZCBFQVBPTCBwYWNrZXQgTXNnMwotCXBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKLQlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKQkmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0KLQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgc2l6ZW9mKHBlZXJLZXlJbmZvKSk7Ci0JTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIChQVUNIQVIpJnBNc2czLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOwotCi0JKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKLQotCi0JLy8gMS4gVmVyaWZ5IGNpcGhlciB0eXBlIG1hdGNoCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAyKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBWZXJpZnkgUlNOIElFCi0JLy9pZiAoIVJUTVBFcXVhbE1lbW9yeShwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKQotCWlmICghQ2hlY2tSU05JRShwQWQsIHBNc2czLT5LZXlEZXNjLktleURhdGEsIHBNc2czLT5LZXlEZXNjLktleURhdGFMZW5bMV0sICZza2lwX29mZnNldCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSU05fSUUgRGlmZmVyZW50IGluIE1zZyAzIG9mIFdQQTEgNC13YXkgaGFuZHNoYWtlISEgXG4iKSk7Ci0JCWhleF9kdW1wKCJUaGUgb3JpZ2luYWwgUlNOX0lFIiwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05fSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuKTsKLQkJaGV4X2R1bXAoIlRoZSByZWNlaXZlZCBSU05fSUUiLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJTTl9JRSBWQUxJRCBpbiBNc2cgMyBvZiBXUEExIDQtd2F5IGhhbmRzaGFrZSEhIFxuIikpOwotCi0KLQkvLyAyLiBDaGVjayBNSUMgdmFsdWUKLQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCi0JTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCU5kaXNaZXJvTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCVVDSEFSIGRpZ2VzdFs4MF07Ci0KLQkJSE1BQ19TSEExKChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCS8vIFRLSVAKLQl7Ci0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgTWljKTsKLQl9Ci0KLQlpZighTmRpc0VxdWFsTWVtb3J5KE9sZE1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiBNSUMgRGlmZmVyZW50IGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgTUlDIFZBTElEIGluIG1zZyAzIG9mIDQtd2F5IGhhbmRzaGFrZSEhISEhISEhISEgXG4iKSk7Ci0KLQkvLyAzLiBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKLQlpZihSVE1QQ29tcGFyZU1lbW9yeShwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAxKQotCQlyZXR1cm47Ci0KLQkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCi0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyA0LiBEb3VibGUgY2hlY2sgQU5vbmNlCi0JaWYoIU5kaXNFcXVhbE1lbW9yeShwQWQtPlN0YUNmZy5BTm9uY2UsIHBNc2czLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpKQotCQlyZXR1cm47Ci0KLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCS8vIFplcm8gTWVzc2FnZSA0IGJvZHkKLQlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OwotCVBhY2tldC5Cb2R5X0xlblsxXSAgPSBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRTsJCS8vIE5vIGRhdGEgZmllbGQKLQotCS8vCi0JLy8gTWVzc2FnZSA0IGFzICBFQVBPTC1LZXkoMCwxLDAsMCwwLFAsMCwwLE1JQywwKQotCS8vCi0JUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7Ci0KLQkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOwotCi0JLy8gVXBkYXRlIEtleSBMZW5ndGgKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwTXNnMy0+S2V5RGVzYy5LZXlMZW5ndGhbMF07Ci0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzFdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzFdOwotCi0JLy8gS2V5IFR5cGUgUGVlcktleQotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IFBBSVJXSVNFS0VZOwotCi0JLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7Ci0KLQkvLyBJbiBNc2czLCAgS2V5SW5mby5zZWN1cmUgPTAgaWYgR3JvdXAgS2V5IEhTIHRvIGNvbWUuIDEgaWYgbm8gZ3JvdXAga2V5IEhTCi0JLy8gU3RhdGlvbiBzZW5kcyBNc2c0ICBLZXlJbmZvLnNlY3VyZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhhdCBpbiBNc2cuMwotCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlPSBwZWVyS2V5SW5mby5TZWN1cmU7Ci0KLQkvLyBDb252ZXJ0IHRvIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgotCSooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQkvLyBLZXkgUmVwbGF5IGNvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcE1zZzMtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBPdXQgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZSA0Ci0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICAmUGFja2V0LAotCQlFTkRfT0ZfQVJHUyk7Ci0KLQkvLyBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZQotCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlVQ0hBUiBkaWdlc3RbODBdOwotCi0JCUhNQUNfU0hBMShwT3V0QnVmZmVyLCBGcmFtZUxlbiwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMpOwotCX0KLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQkvLyBVcGRhdGUgUFRLCi0JLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkvLyBEZWNpZGUgaXRzIENoaXBlckFsZwotCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQllbHNlCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCi0JLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCi0JcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwQWQtPlN0YUNmZy5QVEtbMzJdLCBMRU5fVEtJUF9FSyk7Ci0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOwotCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOwotCi0JLy8gVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKLQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJICBCU1MwLAotCQkJCQkJICAwLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKLQotCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIDAsCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0JCQkJCQkJICBwRW50cnkpOwotCi0JLy8gTWFrZSB0cmFuc21pdHRpbmcgZnJhbWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKLQkJCSAgCQkJTEVOR1RIXzgwMl8zLCAgICAgCQkmSGVhZGVyODAyXzMsCi0JCQkJCQlQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAmUGFja2V0LAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0KLQkvLyBDb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIFNlbmQgTWVzc2FnZSA0IHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgVFJVRSk7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFQYWlyTXNnM0FjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotVk9JRCAgICBXcGEyUGFpck1zZzNBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQotewotCVBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzM7Ci0JVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdLCBPbGRNaWNbMTZdOwotCVVDSEFSICAgICAgICAgICAgICAgKm1wb29sLCAqS0VZREFUQSwgKmRpZ2VzdDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEtleVszMl07Ci0JTUFDX1RBQkxFX0VOVFJZIAkqcEVudHJ5ID0gTlVMTDsKLQlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOwotCi0JLy8gYWxsb2NhdGUgbWVtb3J5Ci0Jb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTAyNCk7Ci0KLQlpZihtcG9vbCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvLyBLRVlEQVRBIExlbiA9IDUxMi4KLQlLRVlEQVRBID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKLQkvLyBkaWdlc3QgTGVuID0gODAuCi0JZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKEtFWURBVEEgKyA1MTIsIDQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhMlBhaXJNc2czQWN0aW9uIC0tLS0tPlxuIikpOwotCi0JcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkgRWxlbS0+TXNnOwotCi0JLy8gUHJvY2VzcyBtZXNzYWdlIDMgZnJhbWUuCi0JcE1zZzMgPSAoUEVBUE9MX1BBQ0tFVCkJJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikmcGVlcktleUluZm8sIHNpemVvZihwZWVyS2V5SW5mbykpOwotCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCAoUFVDSEFSKSZwTXNnMy0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCSooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCopJnBlZXJLZXlJbmZvKSk7Ci0KLQkvLyAxLiBWZXJpZnkgY2lwaGVyIHR5cGUgbWF0Y2gKLQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIhPSAyKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAyLiBDaGVjayBNSUMgdmFsdWUKLQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCi0JTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwTXNnMy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCU5kaXNaZXJvTWVtb3J5KHBNc2czLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJLy8gQUVTCi0JCUhNQUNfU0hBMSgoUFVDSEFSKSBwTXNnMywgcE1zZzMtPkJvZHlfTGVuWzFdICsgNCwgcEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIGRpZ2VzdCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIChQVUNIQVIpIHBNc2czLCBwTXNnMy0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOwotCX0KLQotCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKLQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gbXNnIDMgb2YgNC13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKLQotCS8vIDMuIENoZWNrIFJlcGxheSBDb3VudGVyLCBpdCBoYXMgdG8gYmUgbGFyZ2VyIHRoYW4gbGFzdCBvbmUuIE5vIG5lZWQgdG8gYmUgZXhhY3Qgb25lIGxhcmdlcgotCWlmKFJUTVBDb21wYXJlTWVtb3J5KHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpCi0JewotCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gVXBkYXRlIG5ldyByZXBsYXkgY291bnRlcgotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gNC4gRG91YmxlIGNoZWNrIEFOb25jZQotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5TdGFDZmcuQU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBPYnRhaW4gR1RLCi0JLy8gNS4gRGVjcnlwdCBHVEsgZnJvbSBLZXkgRGF0YQotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJFS0QgPSAlZFxuIiwgcGVlcktleUluZm8uRUtEX0RMKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBEZWNyeXB0IEFFUyBHVEsKLQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwQWQtPlN0YUNmZy5QVEtbMTZdLCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLHBNc2czLT5LZXlEZXNjLktleURhdGEpOwotCX0KLQllbHNlCSAgLy8gVEtJUAotCXsKLQkJSU5UIGk7Ci0JCS8vIERlY3J5cHQgVEtJUCBHVEsKLQkJLy8gQ29uc3RydWN0IDMyIGJ5dGVzIFJDNCBLZXkKLQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwTXNnMy0+S2V5RGVzYy5LZXlJdiwgMTYpOwotCQlOZGlzTW92ZU1lbW9yeSgmS2V5WzE2XSwgJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIDE2KTsKLQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOwotCQkvL2Rpc2NhcmQgZmlyc3QgMjU2IGJ5dGVzCi0JCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOwotCQkvLyBEZWNyeXB0IEdUSy4gQmVjYXJlZnVsLCB0aGVyZSBpcyBubyBJQ1YgdG8gY2hlY2sgdGhlIHJlc3VsdCBpcyBjb3JyZWN0IG9yIG5vdAotCQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgS0VZREFUQSwgcE1zZzMtPktleURlc2MuS2V5RGF0YSwgcE1zZzMtPktleURlc2MuS2V5RGF0YUxlblsxXSk7Ci0JfQotCi0JaWYgKCFQYXJzZUtleURhdGEocEFkLCBLRVlEQVRBLCBwTXNnMy0+S2V5RGVzYy5LZXlEYXRhTGVuWzFdLCAxKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBVcGRhdGUgR1RLIHRvIEFTSUMKLQkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljKTsKLQotCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgTlVMTCk7Ci0KLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCS8vIFplcm8gbWVzc2FnZSA0IGJvZHkKLQlOZGlzWmVyb01lbW9yeSgmUGFja2V0LCBzaXplb2YoUGFja2V0KSk7Ci0JUGFja2V0LlByb1Zlcgk9IEVBUE9MX1ZFUjsKLQlQYWNrZXQuUHJvVHlwZQk9IEVBUE9MS2V5OwotCVBhY2tldC5Cb2R5X0xlblsxXSAgCT0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCi0KLQkvLwotCS8vIE1lc3NhZ2UgNCBhcyAgRUFQT0wtS2V5KDAsMSwwLDAsMCxQLDAsMCxNSUMsMCkKLQkvLwotCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbiBhbmQgYXBwcm9wcmlhdGUgUlNOIElFCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gcGVlcktleUluZm8uS2V5RGVzY1ZlcjsKLQotCS8vIFVwZGF0ZSBLZXkgTGVuZ3RoCi0JUGFja2V0LktleURlc2MuS2V5TGVuZ3RoWzBdID0gcE1zZzMtPktleURlc2MuS2V5TGVuZ3RoWzBdOwotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBNc2czLT5LZXlEZXNjLktleUxlbmd0aFsxXTsKLQotCS8vIEtleSBUeXBlIFBlZXJLZXkKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKLQotCS8vIEtleU1pYyBmaWVsZCBwcmVzZW50ZWQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYyAgPSAxOwotCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlID0gMTsKLQotCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKLQotCS8vIEtleSBSZXBsYXkgY291bnQKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwTXNnMy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBtZXNzYWdlIDQKLQlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5Ci0JaWYocE91dEJ1ZmZlciA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIEFFUwotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOwotCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7Ci0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKLQl9Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuS2V5TWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JLy8gVXBkYXRlIFBUSwotCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JZWxzZQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCU5kaXNNb3ZlTWVtb3J5KCZwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKLQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKLQotCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAgMCwKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgcEVudHJ5KTsKLQotCS8vIE1ha2UgIFRyYW5zbWl0dGluZyBmcmFtZQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAJJkZyYW1lTGVuLAotCQkJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKLQkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQotCS8vIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgU2VuZCBNZXNzYWdlIDQgdG8gYXV0aGVudGljYXRvcgotCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBUUlVFKTsKLQotCS8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCi0JU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCi0gICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOwotCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0KLQotCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQTIKLQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgQlNTMCwgMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcGEyUGFpck1zZzNBY3Rpb24gPC0tLS0tXG4iKSk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgR3JvdXAga2V5IDItd2F5IGhhbmRzaGFraW5nCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlXcGFHcm91cE1zZzFBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUxNRV9RVUVVRV9FTEVNCSpFbGVtKQotCi17Ci0JUFVDSEFSICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlVTE9ORyAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlFQVBPTF9QQUNLRVQgICAgICAgIFBhY2tldDsKLQlQRUFQT0xfUEFDS0VUICAgICAgIHBHcm91cDsKLQlVQ0hBUiAgICAgICAgICAgICAgICptcG9vbCwgKmRpZ2VzdCwgKktFWURBVEE7Ci0JVUNIQVIgICAgICAgICAgICAgICBNaWNbMTZdLCBPbGRNaWNbMTZdOwotCVVDSEFSICAgICAgICAgICAgICAgR1RLWzMyXSwgS2V5WzMyXTsKLQlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOwotCi0JLy8gYWxsb2NhdGUgbWVtb3J5Ci0Jb3NfYWxsb2NfbWVtKHBBZCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTAyNCk7Ci0KLQlpZihtcG9vbCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvLyBkaWdlc3QgTGVuID0gODAuCi0JZGlnZXN0ID0gKFVDSEFSICopIFJPVU5EX1VQKG1wb29sLCA0KTsKLQkvLyBLRVlEQVRBIExlbiA9IDUxMi4KLQlLRVlEQVRBID0gKFVDSEFSICopIFJPVU5EX1VQKGRpZ2VzdCArIDgwLCA0KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiAtLS0tLT5cbiIpKTsKLQotCS8vIFByb2Nlc3MgR3JvdXAgTWVzc2FnZSAxIGZyYW1lLiBza2lwIDgwMi4xMSBoZWFkZXIoMjQpICYgTExDX1NOQVAgaGVhZGVyKDgpCi0JcEdyb3VwID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEdyb3VwLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOwotCi0JKigoVVNIT1JUKikmcGVlcktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUKikmcGVlcktleUluZm8pKTsKLQotCS8vIDAuIENoZWNrIGNpcGhlciB0eXBlIG1hdGNoCi0JaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkICYmIChwZWVyS2V5SW5mby5LZXlEZXNjVmVyICE9IDIpKQotCXsKLQkJb3NfZnJlZV9tZW0ocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCAmJiAocGVlcktleUluZm8uS2V5RGVzY1ZlciAhPSAxKSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAxLiBWZXJpZnkgUmVwbGF5IGNvdW50ZXIKLQkvLyAgICBDaGVjayBSZXBsYXkgQ291bnRlciwgaXQgaGFzIHRvIGJlIGxhcmdlciB0aGFuIGxhc3Qgb25lLiBObyBuZWVkIHRvIGJlIGV4YWN0IG9uZSBsYXJnZXIKLQlpZihSVE1QQ29tcGFyZU1lbW9yeShwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkKLQl7Ci0JCW9zX2ZyZWVfbWVtKHBBZCwgKFBVQ0hBUiltcG9vbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBVcGRhdGUgbmV3IHJlcGxheSBjb3VudGVyCi0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgcEdyb3VwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gMi4gVmVyaWZ5IE1JQyBpcyB2YWxpZAotCS8vIFNhdmUgdGhlIE1JQyBhbmQgcmVwbGFjZSB3aXRoIHplcm8KLQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBHcm91cC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCU5kaXNaZXJvTWVtb3J5KHBHcm91cC0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsJLy8gQUVTCi0JCUhNQUNfU0hBMSgoUFVDSEFSKSBwR3JvdXAsIHBHcm91cC0+Qm9keV9MZW5bMV0gKyA0LCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewkvLyBUS0lQCi0JCWhtYWNfbWQ1KHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwR3JvdXAsIHBHcm91cC0+Qm9keV9MZW5bMV0gKyA0LCBNaWMpOwotCX0KLQotCWlmKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIE1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnIDEgb2YgMi13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNSUMgVkFMSUQgaW4gZ3JvdXAgbXNnIDEgb2YgMi13YXkgaGFuZHNoYWtlISEhISEhISEhISBcbiIpKTsKLQotCi0JLy8gMy4gRGVjcnlwdCBHVEsgZnJvbSBLZXkgRGF0YQotCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7Ci0JCS8vIERlY3J5cHQgQUVTIEdUSwotCQlBRVNfR1RLX0tFWV9VTldSQVAoJnBBZC0+U3RhQ2ZnLlBUS1sxNl0sIEtFWURBVEEsICBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGEpOwotCX0KLQllbHNlCS8vIFRLSVAKLQl7Ci0JCUlOVCBpOwotCi0JCS8vIERlY3J5cHQgVEtJUCBHVEsKLQkJLy8gQ29uc3RydWN0IDMyIGJ5dGVzIFJDNCBLZXkKLQkJTmRpc01vdmVNZW1vcnkoS2V5LCBwR3JvdXAtPktleURlc2MuS2V5SXYsIDE2KTsKLQkJTmRpc01vdmVNZW1vcnkoJktleVsxNl0sICZwQWQtPlN0YUNmZy5QVEtbMTZdLCAxNik7Ci0JCUFSQ0ZPVVJfSU5JVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBLZXksIDMyKTsKLQkJLy9kaXNjYXJkIGZpcnN0IDI1NiBieXRlcwotCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCUFSQ0ZPVVJfQllURSgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhUKTsKLQkJLy8gRGVjcnlwdCBHVEsuIEJlY2FyZWZ1bCwgdGhlcmUgaXMgbm8gSUNWIHRvIGNoZWNrIHRoZSByZXN1bHQgaXMgY29ycmVjdCBvciBub3QKLQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsIHBHcm91cC0+S2V5RGVzYy5LZXlEYXRhLCBwR3JvdXAtPktleURlc2MuS2V5RGF0YUxlblsxXSk7Ci0JfQotCi0JLy8gUHJvY2VzcyBkZWNyeXB0ZWQga2V5IGRhdGEgbWF0ZXJpYWwKLQkvLyBQYXJzZSBrZXlEYXRhIHRvIGhhbmRsZSBLREUgZm9ybWF0IGZvciBXUEEyUFNLCi0JaWYgKHBlZXJLZXlJbmZvLkVLRF9ETCkKLQl7Ci0JCWlmICghUGFyc2VLZXlEYXRhKHBBZCwgS0VZREFUQSwgcEdyb3VwLT5LZXlEZXNjLktleURhdGFMZW5bMV0sIDApKQotCQl7Ci0JCQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWVsc2UJLy8gV1BBUFNLCi0JewotCQkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMgZm9yIFdQQVBTSwotCQlOZGlzTW92ZU1lbW9yeShHVEssIEtFWURBVEEsIDMyKTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBHVEssIDMyKTsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gcGVlcktleUluZm8uS2V5SW5kZXg7Ci0KLQkJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIEdUSywgTEVOX1RLSVBfRUspOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCAmR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgJkdUS1syNF0sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0JCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLSAgICAJLy9oZXhfZHVtcCgiR3JvdXAgS2V5IDoiLCBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwgTEVOX1RLSVBfRUspOwotCX0KLQotCS8vIFVwZGF0ZSBncm91cCBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsCi0JCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOwotCi0JLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0JCQkJCQkJICBOVUxMKTsKLQotCS8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCi0JU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCi0gICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCi0JLy8gaW5pdCBoZWFkZXIgYW5kIEZpbGwgUGFja2V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIEdyb3VwIG1lc3NhZ2UgMSBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUU7CQkvLyBObyBkYXRhIGZpZWxkCi0KLQkvLwotCS8vIEdyb3VwIE1lc3NhZ2UgMiBhcyAgRUFQT0wtS2V5KDEsMCwwLDAsRywwLDAsTUlDLDApCi0JLy8KLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEEyX0tFWV9ERVNDOwotCX0KLQllbHNlCi0JewotCQlQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMV9LRVlfREVTQzsKLQl9Ci0KLQkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uIGFuZCBhcHByb3ByaWF0ZSBSU04gSUUKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBwZWVyS2V5SW5mby5LZXlEZXNjVmVyOwotCi0JLy8gVXBkYXRlIEtleSBMZW5ndGgKLQlQYWNrZXQuS2V5RGVzYy5LZXlMZW5ndGhbMF0gPSBwR3JvdXAtPktleURlc2MuS2V5TGVuZ3RoWzBdOwotCVBhY2tldC5LZXlEZXNjLktleUxlbmd0aFsxXSA9IHBHcm91cC0+S2V5RGVzYy5LZXlMZW5ndGhbMV07Ci0KLQkvLyBLZXkgSW5kZXggYXMgRy1Nc2cgMQotCWlmKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlJbmRleCA9IHBlZXJLZXlJbmZvLktleUluZGV4OwotCi0JLy8gS2V5IFR5cGUgR3JvdXAga2V5Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gR1JPVVBLRVk7Ci0KLQkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQotCS8vIFNlY3VyZSBiaXQKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlNlY3VyZSAgPSAxOwotCi0JLy8gQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KLQkqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmUGFja2V0LktleURlc2MuS2V5SW5mbykpOwotCi0JLy8gS2V5IFJlcGxheSBjb3VudAotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBHcm91cC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQotCS8vIE91dCBidWZmZXIgZm9yIHRyYW5zbWl0dGluZyBncm91cCBtZXNzYWdlIDIKLQlNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFVDSEFSICopJnBPdXRCdWZmZXIpOyAgLy8gYWxsb2NhdGUgbWVtb3J5Ci0JaWYocE91dEJ1ZmZlciA9PSBOVUxMKQotCXsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKW1wb29sKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIFByZXBhcmUgRUFQT0wgZnJhbWUgZm9yIE1JQyBjYWxjdWxhdGlvbgotCS8vIEJlIGNhcmVmdWwsIG9ubHkgRUFQT0wgZnJhbWUgaXMgY291bnRlZCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJRU5EX09GX0FSR1MpOwotCi0JLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKLQlOZGlzWmVyb01lbW9yeShNaWMsIHNpemVvZihNaWMpKTsKLQlpZihwQWQtPlN0YUNmZy5XZXBTdGF0dXMgID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJSE1BQ19TSEExKHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgZGlnZXN0KTsKLQkJTmRpc01vdmVNZW1vcnkoTWljLCBkaWdlc3QsIExFTl9LRVlfREVTQ19NSUMpOwotCX0KLQllbHNlCi0JewotCQlobWFjX21kNShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIE1pYyk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgCQkmRnJhbWVMZW4sCi0JCQkJCQlMRU5HVEhfODAyXzMsICAgICAJCSZIZWFkZXI4MDJfMywKLQkJCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICZQYWNrZXQsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQotCS8vIDUuIENvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgcHJlcGFyZSBmb3IgZW5jcnlwdGlvbgotCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywgKFBVQ0hBUikmUGFja2V0LCBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCBGQUxTRSk7Ci0KLQkvLyA2IEZyZWUgYWxsb2NhdGVkIG1lbW9yeQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgKFBVQ0hBUilwT3V0QnVmZmVyKTsKLQlvc19mcmVlX21lbShwQWQsIChQVUNIQVIpbXBvb2wpOwotCi0JLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBzZXQga2V5IGRvbmUgV1BBMgotCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldwYUdyb3VwTXNnMUFjdGlvbiA8LS0tLS1cbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUluaXQgV1BBIE1BQyBoZWFkZXIKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJV3BhTWFjSGVhZGVySW5pdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUCVBIRUFERVJfODAyXzExCXBIZHI4MDIxMSwKLQlJTgkJVUNIQVIJCQl3ZXAsCi0JSU4JCVBVQ0hBUgkJICAgIHBBZGRyMSkKLXsKLQlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JcEhkcjgwMjExLT5GQy5UeXBlCT0gQlRZUEVfREFUQTsKLQlwSGRyODAyMTEtPkZDLlRvRHMJPSAxOwotCWlmICh3ZXAJPT0gMSkKLQkJcEhkcjgwMjExLT5GQy5XZXAgPSAxOwotCi0JIC8vCUFkZHIxOiBCU1NJRCwgQWRkcjI6IFNBLCBBZGRyMzoJREEKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjEsIHBBZGRyMSk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQlDT1BZX01BQ19BRERSKHBIZHI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlwSGRyODAyMTEtPlNlcXVlbmNlID0JcEFkLT5TZXF1ZW5jZTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAotCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKLQlzZW50IG91dCB0byBhaXIuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBvdXRnb2luZyBOZGlzIGZyYW1lCi0JCU51bWJlck9mRnJhZwlOdW1iZXIgb2YgZnJhZ21lbnQgcmVxdWlyZWQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgICAgUlRNUFRvV2lyZWxlc3NTdGEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIERhdGFMZW4sCi0gICAgSU4JQk9PTEVBTgkJCWlzNHdheUZyYW1lKQotCi17Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1czsKLQlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKLQlVQ0hBUiAgIEluZGV4OwotCi0JZG8KLQl7Ci0JCS8vIDEuIGJ1aWxkIGEgTkRJUyBwYWNrZXQgYW5kIGNhbGwgUlRNUFNlbmRQYWNrZXQoKTsKLQkJLy8gICAgYmUgY2FyZWZ1bCBhYm91dCBob3cvd2hlbiB0byByZWxlYXNlIHRoaXMgaW50ZXJuYWwgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIGJ1ZmZlcgotCQlTdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBQYWNrZXQsIHBIZWFkZXI4MDJfMywgSGRyTGVuLCBwRGF0YSwgRGF0YUxlbik7Ci0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCWJyZWFrOwotCi0JCWlmIChpczR3YXlGcmFtZSkKLQkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMSk7Ci0JCWVsc2UKLQkJCVJUTVBfU0VUX1BBQ0tFVF9DTEVBUl9FQVBfRlJBTUUocFBhY2tldCwgMCk7Ci0KLQkJLy8gMi4gc2VuZCBvdXQgdGhlIHBhY2tldAotCQlTdGF0dXMgPSBTVEFTZW5kUGFja2V0KHBBZCwgcFBhY2tldCk7Ci0JCWlmKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQkvLyBEZXF1ZXVlIG9uZSBmcmFtZSBmcm9tIFR4U3dRdWV1ZTAuLjMgcXVldWUgYW5kIHByb2Nlc3MgaXQKLQkJCS8vIFRoZXJlIGFyZSB0aHJlZSBwbGFjZSBjYWxsaW5nIGRlcXVldWUgZm9yIFRYIHJpbmcuCi0JCQkvLyAxLiBIZXJlLCByaWdodCBhZnRlciBxdWV1ZWluZyB0aGUgZnJhbWUuCi0JCQkvLyAyLiBBdCB0aGUgZW5kIG9mIFR4UmluZ1R4RG9uZSBzZXJ2aWNlIHJvdXRpbmUuCi0JCQkvLyAzLiBVcG9uIE5ESVMgY2FsbCBSVE1QU2VuZFBhY2tldHMKLQkJCWlmKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgJiYKLQkJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKQotCQkJewotCQkJCWZvcihJbmRleCA9IDA7IEluZGV4IDwgNTsgSW5kZXggKyspCi0JCQkJCWlmKHBBZC0+VHhTd1F1ZXVlW0luZGV4XS5OdW1iZXIgPiAwKQotCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgSW5kZXgsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQkJfQotCX0gd2hpbGUoRkFMU0UpOwotCi19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIFNhbml0eSBSU04gSUUgZm9ybSBBUAotCi0gICAgQXJndW1lbnRzOgotCi0gICAgUmV0dXJuIFZhbHVlOgotCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIENoZWNrUlNOSUUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLQlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCi0JT1VUCVVDSEFSCQkJKk9mZnNldCkKLXsKLQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7Ci0JVUNIQVIgICAgICAgICAgICAgICBsZW47Ci0JUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOwotCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7Ci0KLQlwVklFID0gcERhdGE7Ci0JbGVuCSA9IERhdGFMZW47Ci0JKk9mZnNldCA9IDA7Ci0KLQl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCi0JewotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQkvLyBXUEEgUlNOIElFCi0JCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQotCQl7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fCBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJKE5kaXNFcXVhbE1lbW9yeShwVklFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4pKSAmJgotCQkJCShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9PSAocEVpZC0+TGVuICsgMikpKQotCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVja1JTTklFID09PiBXUEEvV1BBUFNLIFJTTiBJRSBtYXRjaGVkIGluIE1zZyAzLCBMZW5ndGgoJWQpIFxuIiwgKHBFaWQtPkxlbiArIDIpKSk7Ci0JCQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQl9Ci0KLQkJCSpPZmZzZXQgKz0gKHBFaWQtPkxlbiArIDIpOwotCQl9Ci0JCS8vIFdQQTIgUlNOIElFCi0JCWVsc2UgaWYgKChwRWlkLT5FaWQgPT0gSUVfUlNOKSAmJiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpKQotCQl7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkoTmRpc0VxdWFsTWVtb3J5KHBWSUUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbikpICYmCi0JCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOSUVfTGVuID09IChwRWlkLT5MZW4gKyAyKSkpCi0JCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIChwRWlkLT5MZW4gKyAyKSkpOwotCQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCi0JCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrUlNOSUUgPT0+IHNraXBfb2Zmc2V0KCVkKSBcbiIsICpPZmZzZXQpKTsKLQotCXJldHVybiByZXN1bHQ7Ci0KLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBQYXJzZSBLRVlEQVRBIGZpZWxkLiAgS0VZREFUQVtdIE1heSBjb250YWluIDIgUlNOIElFIGFuZCBvcHRpb25hbGx5IEdUSy4KLSAgICBHVEsgIGlzIGVuY2FwdHVsYXRlZCBpbiBLREUgZm9ybWF0IGF0ICBwLjgzIDgwMi4xMWkgRDEwCi0KLSAgICBBcmd1bWVudHM6Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0KLSAgICBOb3RlOgotICAgICAgICA4MDIuMTFpIEQxMAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBQYXJzZUtleURhdGEoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCi0JSU4JVUNIQVIJCQliUGFpcmV3aXNlKQotewotICAgIFBLREVfRU5DQVAgICAgICAgICAgcEtERSA9IE5VTEw7Ci0gICAgUFVDSEFSICAgICAgICAgICAgICBwTXlLZXlEYXRhID0gcEtleURhdGE7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBLZXlEYXRhTGVuZ3RoID0gS2V5RGF0YUxlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS0xFTjsKLQlVQ0hBUgkJCQlza2lwX29mZnNldDsKLQotCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBQYWlyZXdpc2UtTXNnIDMgYW5kIHNraXAgaXQKLQlpZiAoYlBhaXJld2lzZSkKLSAgICB7Ci0JCS8vIENoZWNrIFJTTiBJRSB3aGV0aGVyIGl0IGlzIFdQQTIvV1BBMlBTSwotCQlpZiAoIUNoZWNrUlNOSUUocEFkLCBwS2V5RGF0YSwgS2V5RGF0YUxlbiwgJnNraXBfb2Zmc2V0KSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGFyc2VLZXlEYXRhID09PiBXUEEyL1dQQTJQU0sgUlNOIElFIG1pc21hdGNoZWQgXG4iKSk7Ci0JCQloZXhfZHVtcCgiR2V0IEtFWURBVEEgOiIsIHBLZXlEYXRhLCBLZXlEYXRhTGVuKTsKLQkJCXJldHVybiBGQUxTRTsKLSAgICAJfQotICAgIAllbHNlCi0JCXsKLQkJCS8vIHNraXAgUlNOIElFCi0JCQlwTXlLZXlEYXRhICs9IHNraXBfb2Zmc2V0OwotCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKLQotCQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQYXJzZUtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlBhcnNlS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKLQotCS8vIFBhcnNlIEVLRCBmb3JtYXQKLQlpZiAoS2V5RGF0YUxlbmd0aCA+PSA4KQotICAgIHsKLSAgICAgICAgcEtERSA9IChQS0RFX0VOQ0FQKSBwTXlLZXlEYXRhOwotICAgIH0KLQllbHNlCi0gICAgewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJFUlJPUjogS2V5RGF0YUxlbmd0aCBpcyB0b28gc2hvcnQgXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotCS8vIFNhbml0eSBjaGVjayAtIHNoYXJlZCBrZXkgaW5kZXggc2hvdWxkIG5vdCBiZSAwCi0JaWYgKHBLREUtPkdUS0VuY2FwLktpZCA9PSAwKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEdUSyBLZXkgaW5kZXggemVybyBcbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCS8vIFNhbml0eSBjaGVjayAtIEtFRCBsZW5ndGgKLQlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBUaGUgbGVuIGZyb20gS0RFIGlzIHRvbyBzaG9ydCBcbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCS8vIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MgotCUdUS0xFTiA9IHBLREUtPkxlbiAtNjsKLQotCWlmIChHVEtMRU4gPCBMRU5fQUVTX0tFWSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsIEdUS0xFTikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIEtleSB3aXRoIEtERSBmb3JtZXQgZ290IGluZGV4PSVkLCBsZW49JWQgXG4iLCBwS0RFLT5HVEtFbmNhcC5LaWQsIEdUS0xFTikpOwotCi0JLy8gVXBkYXRlIEdUSwotCS8vIHNldCBrZXkgbWF0ZXJpYWwsIFR4TWljIGFuZCBSeE1pYyBmb3IgV1BBUFNLCi0JTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBwS0RFLT5HVEtFbmNhcC5HVEssIDMyKTsKLQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBwS0RFLT5HVEtFbmNhcC5LaWQ7Ci0KLQkvLyBVcGRhdGUgc2hhcmVkIGtleSB0YWJsZQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLREUtPkdUS0VuY2FwLkdUSywgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsICZwS0RFLT5HVEtFbmNhcC5HVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JLy8gVXBkYXRlIFNoYXJlZCBLZXkgQ2lwaGVyQWxnCi0JcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2lzY28gQ0NLTSBQUkYgZnVuY3Rpb24KLQotCUFyZ3VtZW50czoKLQkJa2V5CQkJCUNpc2NvIEJhc2UgVHJhbnNpZW50IEtleSAoQlRLKQotCQlrZXlfbGVuCQkJVGhlIGtleSBsZW5ndGggb2YgdGhlIEJUSwotCQlkYXRhCQkJUnVxdWVzdCBOdW1iZXIoUk4pICsgQlNTSUQKLQkJZGF0YV9sZW4JCVRoZSBsZW5ndGggb2YgdGhlIGRhdGEKLQkJb3V0cHV0CQkJU3RvcmUgZm9yIFBUSyhQYWlyd2lzZSB0cmFuc2llbnQga2V5cykKLQkJbGVuCQkJCVRoZSBsZW5ndGggb2YgdGhlIG91dHB1dAotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJODAyLjFpCUFubmV4IEYuOQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDQ0tNUFJGKAotCUlOCVVDSEFSCSprZXksCi0JSU4JSU5UCQlrZXlfbGVuLAotCUlOCVVDSEFSCSpkYXRhLAotCUlOCUlOVAkJZGF0YV9sZW4sCi0JT1VUCVVDSEFSCSpvdXRwdXQsCi0JSU4JSU5UCQlsZW4pCi17Ci0JSU5UCQlpOwotCVVDSEFSCWlucHV0WzEwMjRdOwotCUlOVAkJY3VycmVudGluZGV4ID0gMDsKLQlJTlQJCXRvdGFsX2xlbjsKLQotCU5kaXNNb3ZlTWVtb3J5KGlucHV0LCBkYXRhLCBkYXRhX2xlbik7Ci0JdG90YWxfbGVuID0gZGF0YV9sZW47Ci0JaW5wdXRbdG90YWxfbGVuXSA9IDA7Ci0JdG90YWxfbGVuKys7Ci0JZm9yCShpID0gMDsJaSA8CShsZW4gKyAxOSkgLyAyMDsgaSsrKQotCXsKLQkJSE1BQ19TSEExKGlucHV0LCB0b3RhbF9sZW4sCWtleSwga2V5X2xlbiwgJm91dHB1dFtjdXJyZW50aW5kZXhdKTsKLQkJY3VycmVudGluZGV4ICs9CTIwOwotCQlpbnB1dFt0b3RhbF9sZW4gLSAxXSsrOwotCX0KLX0KK3ZvaWQgaW5jX2J5dGVfYXJyYXkodTggKiBjb3VudGVyLCBpbnQgbGVuKTsKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE4NjQsMTg5ICs1OCwxNzggQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRNUFJlcG9ydE1pY0Vycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBDSVBIRVJfS0VZIAlwV3BhS2V5KQordm9pZCBSVE1QUmVwb3J0TWljRXJyb3Ioc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCBzdHJ1Y3QgcnRfY2lwaGVyX2tleSAqcFdwYUtleSkKIHsKLQlVTE9ORwlOb3c7Ci0gICAgVUNIQVIgICB1bmljYXN0S2V5ID0gKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VfS0VZID8gMTowKTsKKwl1bnNpZ25lZCBsb25nIE5vdzsKKwl1OCB1bmljYXN0S2V5ID0gKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VfS0VZID8gMSA6IDApOwogCi0JLy8gUmVjb3JkIExhc3QgTUlDIGVycm9yIHRpbWUgYW5kIGNvdW50Ci0JTm93ID0gamlmZmllczsKLQlpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDApCi0JeworCS8qIFJlY29yZCBMYXN0IE1JQyBlcnJvciB0aW1lIGFuZCBjb3VudCAqLworCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7CisJaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAwKSB7CiAJCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCsrOwogCQlwQWQtPlN0YUNmZy5MYXN0TWljRXJyb3JUaW1lID0gTm93OwotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDEpCi0JewotCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KQotCQl7Ci0JCQkvLyBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMKKwkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisJfSBlbHNlIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMSkgeworCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgKyAoNjAgKiBPU19IWikpIDwgTm93KSB7CisJCQkvKiBVcGRhdGUgTGFzdCBNSUMgZXJyb3IgdGltZSwgdGhpcyBkaWQgbm90IHZpb2xhdGUgdHdvIE1JQyBlcnJvcnMgd2l0aGluIDYwIHNlY29uZHMgKi8KIAkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAKIAkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19DT1VOVEVSX01FQVNVUkVTX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7CisJCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwKKwkJCQkJCSAgICAgIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRywKKwkJCQkJCSAgICAgIHBBZC0+TWFjVGFiLgorCQkJCQkJICAgICAgQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLAorCQkJCQkJICAgICAgQlNTMCwgMCk7CiAKIAkJCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0JCQkvLyBWaW9sYXRlIE1JQyBlcnJvciBjb3VudHMsIE1JQyBjb3VudGVybWVhc3VyZXMga2lja3MgaW4KKwkJCS8qIFZpb2xhdGUgTUlDIGVycm9yIGNvdW50cywgTUlDIGNvdW50ZXJtZWFzdXJlcyBraWNrcyBpbiAqLwogCQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7CisJCQkvKiBXZSBzaGFsbCBibG9jayBhbGwgcmVjZXB0aW9uICovCisJCQkvKiBXZSBzaGFsbCBjbGVhbiBhbGwgVHggcmluZyBhbmQgZGlzYXNzb2ljYXRlIGZyb20gQVAgYWZ0ZXIgbmV4dCBFQVBPTCBmcmFtZSAqLworCQkJLyogKi8KKwkJCS8qIE5vIG5lY2Vzc2FyeSB0byBjbGVhbiBhbGwgVHggcmluZywgb24gUlRNUEhhcmRUcmFuc21pdCB3aWxsIHN0b3Agc2VuZGluZyBub24tODAyLjFYIEVBUE9MIHBhY2tldHMgKi8KKwkJCS8qIGlmIHBBZC0+U3RhQ2ZnLk1pY0VyckNudCBncmVhdGVyIHRoYW4gMi4gKi8KKwkJCS8qICovCisJCQkvKiBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOyAqLworCQkJLyogUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsgKi8KKwkJCS8qIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7ICovCisJCQkvKiBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOyAqLworCQkJLyogUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOyAqLwogCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE1JQyBlcnJvciBjb3VudCA+PSAyCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKwl9IGVsc2UgeworCQkvKiBNSUMgZXJyb3IgY291bnQgPj0gMiAqLworCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCiAJCTsKIAl9Ci0gICAgTWxtZUVucXVldWUocEFkLAotCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCU9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FLAotCQkJCTEsCi0JCQkJJnVuaWNhc3RLZXkpOworCU1sbWVFbnF1ZXVlKHBBZCwKKwkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkgICAgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUsIDEsICZ1bmljYXN0S2V5KTsKIAotICAgIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMikKLSAgICB7Ci0gICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsIDEwMCk7Ci0gICAgfQorCWlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMikgeworCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAxMDApOworCX0KIH0KIAogI2RlZmluZQlMRU5HVEhfRUFQX0ggICAgNAotLy8gSWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1QYWNrZXQgLGZpbmQgb3V0IGl0cyBFQVAtQ29kZSAoUmVxdWVzdCgweDAxKSwgUmVzcG9uc2UoMHgwMiksIFN1Y2Nlc3MoMHgwMyksIEZhaWx1cmUoMHgwNCkpLgotSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICAJCXBBZCwKLQlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKLQlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAotCUlOICBVU0hPUlQJCQkJT2ZmU2V0KQorLyogSWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1QYWNrZXQgLGZpbmQgb3V0IGl0cyBFQVAtQ29kZSAoUmVxdWVzdCgweDAxKSwgUmVzcG9uc2UoMHgwMiksIFN1Y2Nlc3MoMHgwMyksIEZhaWx1cmUoMHgwNCkpLiAqLworaW50IFdwYUNoZWNrRWFwQ29kZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICB1OCAqcEZyYW1lLCB1MTYgRnJhbWVMZW4sIHUxNiBPZmZTZXQpCiB7CiAKLQlQVUNIQVIJcERhdGE7Ci0JSU5UCXJlc3VsdCA9IDA7CisJdTggKnBEYXRhOworCWludCByZXN1bHQgPSAwOwogCi0JaWYoIEZyYW1lTGVuIDwgT2ZmU2V0ICsgTEVOR1RIX0VBUE9MX0ggKyBMRU5HVEhfRUFQX0ggKQorCWlmIChGcmFtZUxlbiA8IE9mZlNldCArIExFTkdUSF9FQVBPTF9IICsgTEVOR1RIX0VBUF9IKQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcERhdGEgPSBwRnJhbWUgKyBPZmZTZXQ7IC8vIHNraXAgb2Zmc2V0IGJ5dGVzCisJcERhdGEgPSBwRnJhbWUgKyBPZmZTZXQ7CS8qIHNraXAgb2Zmc2V0IGJ5dGVzICovCiAKLQlpZigqKHBEYXRhKzEpID09IEVBUFBhY2tldCkgCS8vIDgwMi4xeCBoZWFkZXIgLSBQYWNrZXQgVHlwZQorCWlmICgqKHBEYXRhICsgMSkgPT0gRUFQUGFja2V0KQkvKiA4MDIuMXggaGVhZGVyIC0gUGFja2V0IFR5cGUgKi8KIAl7Ci0JCSByZXN1bHQgPSAqKHBEYXRhKzQpOwkJLy8gRUFQIGhlYWRlciAtIENvZGUKKwkJcmVzdWx0ID0gKihwRGF0YSArIDQpOwkvKiBFQVAgaGVhZGVyIC0gQ29kZSAqLwogCX0KIAogCXJldHVybiByZXN1bHQ7CiB9CiAKLVZPSUQgICAgV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOICBCT09MRUFOICAgICAgICAgIGJVbmljYXN0KQordm9pZCBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIElOIEJPT0xFQU4gYlVuaWNhc3QpCiB7Ci0gICAgdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotICAgIGNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OworCWNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0geyAwIH07CiAKLSAgICBzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOwotICAgIGlmIChiVW5pY2FzdCkKLSAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyB1bmljYXN0IiwgY3VzdG9tKTsKLSAgICB3cnF1LmRhdGEubGVuZ3RoID0gc3RybGVuKGN1c3RvbSk7Ci0gICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBjdXN0b20pOworCXNwcmludGYoY3VzdG9tLCAiTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uIik7CisJaWYgKGJVbmljYXN0KQorCQlzcHJpbnRmKGN1c3RvbSwgIiVzIHVuaWNhc3QiLCBjdXN0b20pOwogCi0gICAgcmV0dXJuOworCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgLTEsIE5VTEwsICh1OCAqKWN1c3RvbSwKKwkJCQlzdHJsZW4oY3VzdG9tKSk7CisKKwlyZXR1cm47CiB9CiAKLVZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKK3ZvaWQgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X21sbWVfcXVldWVfZWxlbSAqRWxlbSkKIHsKLQlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0OworCXU4ICpwT3V0QnVmZmVyID0gTlVMTDsKKwl1OCBIZWFkZXI4MDJfM1sxNF07CisJdW5zaWduZWQgbG9uZyBGcmFtZUxlbiA9IDA7CisJc3RydWN0IHJ0X2VhcG9sX3BhY2tldCBQYWNrZXQ7CisJdTggTWljWzE2XTsKKwlCT09MRUFOIGJVbmljYXN0OwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIC0tLS0tPlxuIikpOwogCi0gICAgYlVuaWNhc3QgPSAoRWxlbS0+TXNnWzBdID09IDEgPyBUUlVFOkZBTFNFKTsKKwliVW5pY2FzdCA9IChFbGVtLT5Nc2dbMF0gPT0gMSA/IFRSVUUgOiBGQUxTRSk7CiAJcEFkLT5TZXF1ZW5jZSA9ICgocEFkLT5TZXF1ZW5jZSkgKyAxKSAmIChNQVhfU0VRX05VTUJFUik7CiAKLQkvLyBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKKwkvKiBpbml0IDgwMi4zIGhlYWRlciBhbmQgRmlsbCBQYWNrZXQgKi8KKwlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsCisJCQkgIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKIAogCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyCT0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlCT0gRUFQT0xLZXk7CisJUGFja2V0LlByb1ZlciA9IEVBUE9MX1ZFUjsKKwlQYWNrZXQuUHJvVHlwZSA9IEVBUE9MS2V5OwogCiAJUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7CiAKLSAgICAvLyBSZXF1ZXN0IGZpZWxkIHByZXNlbnRlZAotICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uUmVxdWVzdCA9IDE7CisJLyogUmVxdWVzdCBmaWVsZCBwcmVzZW50ZWQgKi8KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QgPSAxOwogCi0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKKwlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpIHsKIAkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKLQl9Ci0JZWxzZQkgIC8vIFRLSVAKKwl9IGVsc2UJCQkvKiBUS0lQICovCiAJewogCQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSAxOwogCX0KIAotICAgIFBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IChiVW5pY2FzdCA/IFBBSVJXSVNFS0VZIDogR1JPVVBLRVkpOworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IChiVW5pY2FzdCA/IFBBSVJXSVNFS0VZIDogR1JPVVBLRVkpOwogCi0JLy8gS2V5TWljIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljICA9IDE7CisJLyogS2V5TWljIGZpZWxkIHByZXNlbnRlZCAqLworCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5TWljID0gMTsKIAotICAgIC8vIEVycm9yIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uRXJyb3IgID0gMTsKKwkvKiBFcnJvciBmaWVsZCBwcmVzZW50ZWQgKi8KKwlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLkVycm9yID0gMTsKIAotCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCi0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFOworCS8qIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkICovCisJU0VUX3UxNl9UT19BUlJBUlkoUGFja2V0LkJvZHlfTGVuLCBMRU5fRUFQT0xfS0VZX01TRykKKwkgICAgLyogS2V5IFJlcGxheSBDb3VudCAqLworCSAgICBOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLAorCQkJICAgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7CisJaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CiAKLQkvLyBLZXkgUmVwbGF5IENvdW50Ci0JTmRpc01vdmVNZW1vcnkoUGFja2V0LktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0gICAgaW5jX2J5dGVfYXJyYXkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7CisJLyogQ29udmVydCB0byBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gKi8KKwkqKCh1MTYgKikgJiBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvKSA9CisJICAgIGNwdTJsZTE2KCooKHUxNiAqKSAmIFBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKIAotCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKLQotCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7CisJTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKHU4ICoqKSAmIHBPdXRCdWZmZXIpOwkvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKwlpZiAocE91dEJ1ZmZlciA9PSBOVUxMKSB7CiAJCXJldHVybjsKIAl9CisJLyogUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uICovCisJLyogQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24gKi8KKwlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAmRnJhbWVMZW4sCisJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihQYWNrZXQuQm9keV9MZW4pICsgNCwgJlBhY2tldCwKKwkJCSAgRU5EX09GX0FSR1MpOwogCi0JLy8gUHJlcGFyZSBFQVBPTCBmcmFtZSBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JLy8gQmUgY2FyZWZ1bCwgb25seSBFQVBPTCBmcmFtZSBpcyBjb3VudGVkIGZvciBNSUMgY2FsY3VsYXRpb24KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LCAgICZQYWNrZXQsCi0JCSAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCi0JLy8gUHJlcGFyZSBhbmQgRmlsbCBNSUMgdmFsdWUKKwkvKiBQcmVwYXJlIGFuZCBGaWxsIE1JQyB2YWx1ZSAqLwogCU5kaXNaZXJvTWVtb3J5KE1pYywgc2l6ZW9mKE1pYykpOwotCWlmKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQl7CS8vIEFFUwotICAgICAgICBVQ0hBUiBkaWdlc3RbMjBdID0gezB9OwotCQlITUFDX1NIQTEocE91dEJ1ZmZlciwgRnJhbWVMZW4sIHBBZC0+U3RhQ2ZnLlBUSywgTEVOX0VBUF9NSUNLLCBkaWdlc3QpOworCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgewkvKiBBRVMgKi8KKwkJdTggZGlnZXN0WzIwXSA9IHsgMCB9OworCQlITUFDX1NIQTEocEFkLT5TdGFDZmcuUFRLLCBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLAorCQkJICBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwogCQlOZGlzTW92ZU1lbW9yeShNaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCWVsc2UKLQl7CS8vIFRLSVAKLQkJaG1hY19tZDUocEFkLT5TdGFDZmcuUFRLLCAgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljKTsKKwl9IGVsc2UgewkJLyogVEtJUCAqLworCQlITUFDX01ENShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sCisJCQkgTWljLCBNRDVfRElHRVNUX1NJWkUpOwogCX0KIAlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7CiAKLSAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgCSZGcmFtZUxlbiwKLSAgICAJICAJCQlMRU5HVEhfODAyXzMsICAgICAJCQkmSGVhZGVyODAyXzMsCi0gICAgCQkJCVBhY2tldC5Cb2R5X0xlblsxXSArIDQsICAgICAmUGFja2V0LAotICAgIAkJCQlFTkRfT0ZfQVJHUyk7CisJLyogY29weSBmcmFtZSB0byBUeCByaW5nIGFuZCBzZW5kIE1JQyBmYWlsdXJlIHJlcG9ydCBmcmFtZSB0byBhdXRoZW50aWNhdG9yICovCisJUlRNUFRvV2lyZWxlc3NTdGEocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwKKwkJCSAgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywKKwkJCSAgKHU4ICopJiBQYWNrZXQsCisJCQkgIENPTlZfQVJSQVJZX1RPX3UxNihQYWNrZXQuQm9keV9MZW4pICsgNCwgRkFMU0UpOwogCi0JLy8gb3B5IGZyYW1lIHRvIFR4IHJpbmcgYW5kIHNlbmQgTUlDIGZhaWx1cmUgcmVwb3J0IGZyYW1lIHRvIGF1dGhlbnRpY2F0b3IKLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsIChQVUNIQVIpJlBhY2tldCwgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgRkFMU0UpOwotCi0JTWxtZUZyZWVNZW1vcnkocEFkLCAoUFVDSEFSKXBPdXRCdWZmZXIpOworCU1sbWVGcmVlTWVtb3J5KHBBZCwgKHU4ICopcE91dEJ1ZmZlcik7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgPC0tLS0tXG4iKSk7CiB9CkBAIC0yMDYwLDcgKzI0Myw3IEBACiAgKiByb2xsaW5nIG92ZXIgdG8gbW9yZSBzaWduaWZpY2FudCBieXRlcyBpZiB0aGUgYnl0ZSB3YXMgaW5jcmVtZW50ZWQgZnJvbQogICogMHhmZiB0byAweDAwLgogICovCi12b2lkIGluY19ieXRlX2FycmF5KFVDSEFSICpjb3VudGVyLCBpbnQgbGVuKQordm9pZCBpbmNfYnl0ZV9hcnJheSh1OCAqIGNvdW50ZXIsIGludCBsZW4pCiB7CiAJaW50IHBvcyA9IGxlbiAtIDE7CiAJd2hpbGUgKHBvcyA+PSAwKSB7CkBAIC0yMDcxLDIxICsyNTQsMTIwIEBACiAJfQogfQogCi1WT0lEIFdwYURpc2Fzc29jQXBBbmRCbG9ja0Fzc29jKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKK3ZvaWQgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2Modm9pZCAqU3lzdGVtU3BlY2lmaWMxLAorCQkJCXZvaWQgKkZ1bmN0aW9uQ29udGV4dCwKKwkJCQl2b2lkICpTeXN0ZW1TcGVjaWZpYzIsCisJCQkJdm9pZCAqU3lzdGVtU3BlY2lmaWMzKQogewotICAgIFJUTVBfQURBUFRFUiAgICAgICAgICAgICAgICAqcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OwotICAgIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgcnRfbWxtZV9kaXNhc3NvY19yZXEgRGlzYXNzb2NSZXE7CiAKLQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUmVwb3J0TWljRXJyb3IgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIGFmdGVyIHNlbmRpbmcgc2Vjb25kIGNvbnRpbnVvdXMgRUFQT0wgZnJhbWVcbiIpKTsKLQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX01JQ19GQUlMVVJFKTsKLQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7CisJLyogZGlzYXNzb2MgZnJvbSBjdXJyZW50IEFQIGZpcnN0ICovCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIlJUTVBSZXBvcnRNaWNFcnJvciAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgYWZ0ZXIgc2VuZGluZyBzZWNvbmQgY29udGludW91cyBFQVBPTCBmcmFtZVxuIikpOworCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLAorCQkJIFJFQVNPTl9NSUNfRkFJTFVSRSk7CisJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCisJCSAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSwgJkRpc2Fzc29jUmVxKTsKIAogCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7CiAJcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOwogfQogCit2b2lkIFdwYVN0YVBhaXJ3aXNlS2V5U2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBTaGFyZWRLZXk7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OworCisJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07CisKKwkvKiBQYWlyd2lzZSBrZXkgc2hhbGwgdXNlIGtleSMwICovCisJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVswXTsKKworCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgcEVudHJ5LT5QVEssIExFTl9QVEspOworCisJLyogUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZSAqLworCU5kaXNaZXJvTWVtb3J5KHBTaGFyZWRLZXksIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOworCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgJnBBZC0+U3RhQ2ZnLlBUS1szMl0sIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sCisJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlR4TWljLAorCQkgICAgICAgJnBBZC0+U3RhQ2ZnLlBUS1s0OCArIExFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7CisKKwkvKiBEZWNpZGUgaXRzIENoaXBlckFsZyAqLworCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOworCisJLyogVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqLworCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwKKwkJICAgICAgIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwKKwkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywKKwkJICAgICAgICZwQWQtPlN0YUNmZy5QVEtbNDggKyBMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOworCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcFNoYXJlZEtleS0+Q2lwaGVyQWxnOworCisJLyogVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJICAgICAgQlNTMCwKKwkJCSAgICAgIDAsCisJCQkgICAgICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCisJCQkgICAgICBwU2hhcmVkS2V5LT5LZXksCisJCQkgICAgICBwU2hhcmVkS2V5LT5UeE1pYywgcFNoYXJlZEtleS0+UnhNaWMpOworCisJLyogVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlICovCisJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIDAsIHBTaGFyZWRLZXktPkNpcGhlckFsZywgcEVudHJ5KTsKKwlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7CisJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCIlcyA6IEFJRCglZCkgcG9ydCBzZWN1cmVkXG4iLCBfX2Z1bmNfXywgcEVudHJ5LT5BaWQpKTsKKworfQorCit2b2lkIFdwYVN0YUdyb3VwS2V5U2V0dGluZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X2NpcGhlcl9rZXkgKnBTaGFyZWRLZXk7CisKKwlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF07CisKKwkvKiBQcmVwYXJlIHBhaXItd2lzZSBrZXkgaW5mb3JtYXRpb24gaW50byBzaGFyZWQga2V5IHRhYmxlICovCisJTmRpc1plcm9NZW1vcnkocFNoYXJlZEtleSwgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7CisJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+S2V5LCBwQWQtPlN0YUNmZy5HVEssIExFTl9US0lQX0VLKTsKKwlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLkdUS1sxNl0sCisJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlR4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzI0XSwKKwkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisKKwkvKiBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcgKi8KKwlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKKwlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7CisJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpCisJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKKwllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkKQorCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OworCisJLyogVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAorCQkJICAgICAgQlNTMCwKKwkJCSAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCSAgICAgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKKwkJCSAgICAgIHBTaGFyZWRLZXktPktleSwKKwkJCSAgICAgIHBTaGFyZWRLZXktPlR4TWljLCBwU2hhcmVkS2V5LT5SeE1pYyk7CisKKwkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKKwkJCQkgIEJTUzAsCisJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCisJCQkJICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsIE5VTEwpOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC9zdGFfaW9jdGwuYwppbmRleCBjMGUwNDI1Li5kOGZiZTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3N0YV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvc3RhX2lvY3RsLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlCSJydF9jb25maWcuaCIKIAogI2lmZGVmIERCRwotZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIFJURGVidWdMZXZlbDsKICNlbmRpZgogCiAjZGVmaW5lIE5SX1dFUF9LRVlTIAkJCQk0CkBAIC00OSw0MjQgKzQ5LDMxMCBAQAogCiAjZGVmaW5lIEdST1VQX0tFWV9OTyAgICAgICAgICAgICAgICA0CiAKLWV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKLWV4dGVybiBVQ0hBUiAgICBDaXBoZXJXcGFQc2tUa2lwW107Ci1leHRlcm4gVUNIQVIgICAgQ2lwaGVyV3BhUHNrVGtpcExlbjsKK2V4dGVybiB1OCBDaXBoZXJXcGEyVGVtcGxhdGVbXTsKIAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF9WRVJTSU9OX0lORk97Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblc7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblg7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblk7Ci0gICAgVUNIQVIgICAgICAgRHJpdmVyVmVyc2lvblo7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRZZWFyOwotICAgIFVJTlQgICAgICAgIERyaXZlckJ1aWxkTW9udGg7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGREYXk7Ci19IFJUX1ZFUlNJT05fSU5GTywgKlBSVF9WRVJTSU9OX0lORk87Ci0KLXN0cnVjdCBpd19wcml2X2FyZ3MgcHJpdnRhYltdID0gewoteyBSVFBSSVZfSU9DVExfU0VULAotICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIDAsCi0gICJzZXQifSwKLQoteyBSVFBSSVZfSU9DVExfU0hPVywgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgIiJ9LAoteyBSVFBSSVZfSU9DVExfU0hPVywgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAotICAiIn0sCi0vKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KLSAgICB7IFNIT1dfQ09OTl9TVEFUVVMsCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiY29ublN0YXR1cyIgfSwKLQl7IFNIT1dfRFJWSUVSX1ZFUklPTiwKLQkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCi0gICAgeyBTSE9XX0JBX0lORk8sCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYmFpbmZvIiB9LAotCXsgU0hPV19ERVNDX0lORk8sCi0JICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGVzY2luZm8iIH0sCi0gICAgeyBSQUlPX09GRiwKLQkgIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCi0JeyBSQUlPX09OLAotCSAgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgInJhZGlvX29uIiB9LAotCXsgU0hPV19DRkdfVkFMVUUsCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJzaG93IiB9LAotLyogLS0tIHN1Yi1pb2N0bHMgcmVsYXRpb25zIC0tLSAqLwotCi17IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAotICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAotICAic3RhdCJ9LAoteyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCi0gIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKLSAgImdldF9zaXRlX3N1cnZleSJ9LAorc3RydWN0IFBBQ0tFRCBydF92ZXJzaW9uX2luZm8geworCXU4IERyaXZlclZlcnNpb25XOworCXU4IERyaXZlclZlcnNpb25YOworCXU4IERyaXZlclZlcnNpb25ZOworCXU4IERyaXZlclZlcnNpb25aOworCXUzMiBEcml2ZXJCdWlsZFllYXI7CisJdTMyIERyaXZlckJ1aWxkTW9udGg7CisJdTMyIERyaXZlckJ1aWxkRGF5OwogfTsKIAotSU5UIFNldF9TU0lEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLSNpZmRlZiBXTU1fU1VQUE9SVAotSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLSNlbmRpZgotCi1JTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfQXV0aE1vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5MV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTJfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9LZXkzX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5NF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X1dQQVBTS19Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpOwotCi0KLUlOVCBTZXRfUFNNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfV3BhX1N1cHBvcnQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotTkRJU19TVEFUVVMgUlRNUFdQQU5vbmVBZGRLZXlQcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOCVBWT0lECQkJcEJ1Zik7Ci0KLUlOVCBTZXRfRnJhZ1Rlc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFVDSEFSCQkJYXJnKTsKLQotSU5UIFNldF9TaG9ydFJldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgewotCUNIQVIgKm5hbWU7Ci0JSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBVQ0hBUiBhcmcpOwotfSAqUFJUTVBfUFJJVkFURV9TRVRfUFJPQywgUlRNUF9QUklWQVRFX1NVUFBPUlRfUFJPQ1tdID0gewotCXsiRHJpdmVyVmVyc2lvbiIsCQkJCVNldF9Ecml2ZXJWZXJzaW9uX1Byb2N9LAotCXsiQ291bnRyeVJlZ2lvbiIsCQkJCVNldF9Db3VudHJ5UmVnaW9uX1Byb2N9LAotCXsiQ291bnRyeVJlZ2lvbkFCYW5kIiwJCQlTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2N9LAotCXsiU1NJRCIsCQkJCQkJU2V0X1NTSURfUHJvY30sCi0JeyJXaXJlbGVzc01vZGUiLAkJCQlTZXRfV2lyZWxlc3NNb2RlX1Byb2N9LAotCXsiVHhCdXJzdCIsCQkJCQlTZXRfVHhCdXJzdF9Qcm9jfSwKLQl7IlR4UHJlYW1ibGUiLAkJCQlTZXRfVHhQcmVhbWJsZV9Qcm9jfSwKLQl7IlR4UG93ZXIiLAkJCQkJU2V0X1R4UG93ZXJfUHJvY30sCi0JeyJDaGFubmVsIiwJCQkJCVNldF9DaGFubmVsX1Byb2N9LAotCXsiQkdQcm90ZWN0aW9uIiwJCQkJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jfSwKLQl7IlJUU1RocmVzaG9sZCIsCQkJCVNldF9SVFNUaHJlc2hvbGRfUHJvY30sCi0JeyJGcmFnVGhyZXNob2xkIiwJCQkJU2V0X0ZyYWdUaHJlc2hvbGRfUHJvY30sCi0JeyJIdEJ3IiwJCSAgICAgICAgICAgICAgICBTZXRfSHRCd19Qcm9jfSwKLQl7Ikh0TWNzIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRNY3NfUHJvY30sCi0JeyJIdEdpIiwJCSAgICAgICAgICAgICAgICBTZXRfSHRHaV9Qcm9jfSwKLQl7Ikh0T3BNb2RlIiwJCSAgICAgICAgICAgIFNldF9IdE9wTW9kZV9Qcm9jfSwKLQl7Ikh0RXh0Y2hhIiwJCSAgICAgICAgICAgIFNldF9IdEV4dGNoYV9Qcm9jfSwKLQl7Ikh0TXBkdURlbnNpdHkiLAkJICAgICAgICBTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKLQl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKLQl7Ikh0UmRnIiwJCSAgICAgICAgCQlTZXRfSHRSZGdfUHJvY30sCi0JeyJIdEFtc2R1IiwJCSAgICAgICAgCQlTZXRfSHRBbXNkdV9Qcm9jfSwKLQl7Ikh0QXV0b0JhIiwJCSAgICAgICAgCVNldF9IdEF1dG9CYV9Qcm9jfSwKLQl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCi0JeyJIdFByb3RlY3QiLAkJICAgICAgICAJU2V0X0h0UHJvdGVjdF9Qcm9jfSwKLQl7Ikh0TWltb1BzIiwJCSAgICAgICAgCVNldF9IdE1pbW9Qc19Qcm9jfSwKLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JeyJQa3RBZ2dyZWdhdGUiLAkJCQlTZXRfUGt0QWdncmVnYXRlX1Byb2N9LAotI2VuZGlmCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotCXsiV21tQ2FwYWJsZSIsCQkJCQlTZXRfV21tQ2FwYWJsZV9Qcm9jfSwKLSNlbmRpZgotCXsiSUVFRTgwMjExSCIsCQkJCQlTZXRfSUVFRTgwMjExSF9Qcm9jfSwKLSAgICB7Ik5ldHdvcmtUeXBlIiwgICAgICAgICAgICAgICAgIFNldF9OZXR3b3JrVHlwZV9Qcm9jfSwKLQl7IkF1dGhNb2RlIiwJCQkJCVNldF9BdXRoTW9kZV9Qcm9jfSwKLQl7IkVuY3J5cFR5cGUiLAkJCQkJU2V0X0VuY3J5cFR5cGVfUHJvY30sCi0JeyJEZWZhdWx0S2V5SUQiLAkJCQlTZXRfRGVmYXVsdEtleUlEX1Byb2N9LAotCXsiS2V5MSIsCQkJCQkJU2V0X0tleTFfUHJvY30sCi0JeyJLZXkyIiwJCQkJCQlTZXRfS2V5Ml9Qcm9jfSwKLQl7IktleTMiLAkJCQkJCVNldF9LZXkzX1Byb2N9LAotCXsiS2V5NCIsCQkJCQkJU2V0X0tleTRfUHJvY30sCi0JeyJXUEFQU0siLAkJCQkJCVNldF9XUEFQU0tfUHJvY30sCi0JeyJSZXNldENvdW50ZXIiLAkJCQlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jfSwKLQl7IlBTTW9kZSIsICAgICAgICAgICAgICAgICAgICAgIFNldF9QU01vZGVfUHJvY30sCi0jaWZkZWYgREJHCi0JeyJEZWJ1ZyIsCQkJCQkJU2V0X0RlYnVnX1Byb2N9LAotI2VuZGlmCi0gICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAotCXsiRml4ZWRUeE1vZGUiLCAgICAgICAgICAgICAgICAgU2V0X0ZpeGVkVHhNb2RlX1Byb2N9LAotICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAotICAgIHsiRm9yY2VHRiIsCQkgICAgICAgIAkJU2V0X0ZvcmNlR0ZfUHJvY30sCi0JeyJMb25nUmV0cnkiLAkgICAgICAgIAkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAotCXsiU2hvcnRSZXRyeSIsCSAgICAgICAgCQlTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2N9LAotI2lmZGVmIFJUMjg3MAotCXsiZWZ1c2VGcmVlTnVtYmVyIiwJCQkJc2V0X2VGdXNlR2V0RnJlZUJsb2NrQ291bnRfUHJvY30sCi0JeyJlZnVzZUR1bXAiLAkJCQkJc2V0X2VGdXNlZHVtcF9Qcm9jfSwKLQl7ImVmdXNlTG9hZEZyb21CaW4iLAkJCQlzZXRfZUZ1c2VMb2FkRnJvbUJpbl9Qcm9jfSwKLSNlbmRpZgotCXtOVUxMLH0KK3N0YXRpYyBfX3MzMiByYWxpbmtyYXRlW10gPSB7IDIsIDQsIDExLCAyMiwJLyogQ0NLICovCisJMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCwJLyogT0ZETSAqLworCTEzLCAyNiwgMzksIDUyLCA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LCAyNjAsCS8qIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUgKi8KKwkzOSwgNzgsIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCS8qIDIwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzICovCisJMjcsIDU0LCA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsCS8qIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUgKi8KKwk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkvKiA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMyAqLworCTE0LCAyOSwgNDMsIDU3LCA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsCS8qIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUgKi8KKwk0MywgODcsIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCS8qIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzICovCisJMzAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsCS8qIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUgKi8KKwk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwCiB9OwogCitpbnQgU2V0X1NTSURfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwgY2hhciAqYXJnKTsKIAotVk9JRCBSVE1QQWRkS2V5KAotCUlOCVBSVE1QX0FEQVBURVIJICAgIHBBZCwKLQlJTglQTkRJU184MDJfMTFfS0VZICAgIHBLZXkpCitpbnQgU2V0X05ldHdvcmtUeXBlX1Byb2Moc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgKmFyZyk7CisKK3ZvaWQgUlRNUEFkZEtleShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHN0cnVjdCBydF9uZGlzXzgwMl8xMV9rZXkgKnBLZXkpCiB7Ci0JVUxPTkcJCQkJS2V5SWR4OwotCU1BQ19UQUJMRV9FTlRSWSAgCSpwRW50cnk7CisJdW5zaWduZWQgbG9uZyBLZXlJZHg7CisJc3RydWN0IHJ0X21hY190YWJsZV9lbnRyeSAqcEVudHJ5OwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7CiAKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JaWYgKFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkpCi0JewotCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQl7Ci0JCQlSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCQkJcmV0dXJuOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQUFkZEtleVByb2MxPT0+XG4iKSk7Ci0JCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX0hBTFQpOwotCQlSVE1QdXNlY0RlbGF5KDYwMDApOwotCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQl9Ci0jZW5kaWYKKwlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB7CisJCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApIHsKKwkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwsCisJCQkJCSAgICAgICBwS2V5LT5LZXlMZW5ndGgpOworCQkJCWdvdG8gZW5kOworCQkJfQorCQkJLyogVXBkYXRlIFBUSyAqLworCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOwogCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQl7Ci0JCWlmIChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCi0JCXsKLQkJICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgMzIpOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBNSywgcEtleS0+S2V5TWF0ZXJpYWwsIHBLZXktPktleUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0JCSAgICAvLyBVcGRhdGUgUFRLCi0JCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgcEtleS0+S2V5TWF0ZXJpYWwsIExFTl9US0lQX0VLKTsKKwkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSywKKwkJCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCQl9IGVsc2UgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsCisJCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSywKKwkJCQkJICAgICAgIExFTl9US0lQX1JYTUlDSyk7CisJCQl9CiAKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgICAgICB9CisJCQkvKiBEZWNpZGUgaXRzIENoaXBlckFsZyAqLworCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PQorCQkJCSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCQllbHNlCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CiAKLSAgICAgICAgICAgIC8vIERlY2lkZSBpdHMgQ2hpcGVyQWxnCi0gICAgICAgIAlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotICAgICAgICAJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotICAgICAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0gICAgICAgIAllbHNlCi0gICAgICAgIAkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQkvKiBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICovCisJCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LAorCQkJCSAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXksCisJCQkJICAgICAgIExFTl9US0lQX0VLKTsKKwkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsCisJCQkJICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLAorCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywKKwkJCQkgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsCisJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9CisJCQkgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOwogCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKLSAgICAgICAgCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOwotICAgICAgICAJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgIAlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlR4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOworCQkJLyogVXBkYXRlIHBhaXJ3aXNlIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCSAgICAgIEJTUzAsCisJCQkJCSAgICAgIDAsCisJCQkJCSAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOwogCi0gICAgICAgIAkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLSAgICAgICAgCQkJCQkJICBCU1MwLAotICAgICAgICAJCQkJCQkgIDAsCi0gICAgICAgIAkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYyk7CisJCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJICBCU1MwLAorCQkJCQkJICAwLAorCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS4KKwkJCQkJCSAgQ2lwaGVyQWxnLCBwRW50cnkpOwogCi0gICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotICAgICAgICAJCQkJCQkJICBCU1MwLAotICAgICAgICAJCQkJCQkJICAwLAotICAgICAgICAJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0gICAgICAgIAkJCQkJCQkgIHBFbnRyeSk7Ci0KLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgeworCQkJCS8qIHNldCA4MDIuMXggcG9ydCBjb250cm9sICovCisJCQkJLypwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLwogCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKIAotICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0gICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgIH0KLQkJfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOwotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7CisJCQkJLyogSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkgKi8KKwkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogVXBkYXRlIEdUSyAqLworCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKHBLZXktPktleUluZGV4ICYgMHhGRik7CisJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT4KKwkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfY2lwaGVyX2tleSkpOworCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPQorCQkJICAgIExFTl9US0lQX0VLOworCQkJTmRpc01vdmVNZW1vcnkocEFkLT4KKwkJCQkgICAgICAgU2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uS2V5LAorCQkJCSAgICAgICBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOwogCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLLCBMRU5fVEtJUF9UWE1JQ0spOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQorCQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgeworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgICBSeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0spOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+CisJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgICBUeE1pYywKKwkJCQkJICAgICAgIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKworCQkJCQkgICAgICAgTEVOX1RLSVBfVFhNSUNLLAorCQkJCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwkJCX0gZWxzZSB7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT4KKwkJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJICAgICAgIFR4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywKKwkJCQkJICAgICAgIExFTl9US0lQX1RYTUlDSyk7CisJCQkJTmRpc01vdmVNZW1vcnkocEFkLT4KKwkJCQkJICAgICAgIFNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJICAgICAgIFJ4TWljLAorCQkJCQkgICAgICAgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArCisJCQkJCSAgICAgICBMRU5fVEtJUF9UWE1JQ0ssCisJCQkJCSAgICAgICBMRU5fVEtJUF9SWE1JQ0spOworCQkJfQogCi0gICAgICAgICAgICAvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKLSAgICAJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0gICAgCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotICAgIAkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLSAgICAJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7CisJCQkvKiBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcgKi8KKwkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uCisJCQkgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CisJCQlpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uCisJCQkJICAgIENpcGhlckFsZyA9IENJUEhFUl9US0lQOworCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0KKwkJCQkgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKKwkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkJCSAgICBDaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwogCi0gICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotICAgICAgICAJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLSAgICAgICAgCQkJCQkJICBCU1MwLAotICAgICAgICAJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKLSAgICAgICAgCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAotICAgICAgICAJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uUnhNaWMpOworCQkJLyogVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUgKi8KKwkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCisJCQkJCSAgICAgIEJTUzAsCisJCQkJCSAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJCSAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgIENpcGhlckFsZywKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJCSAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgIEtleSwKKwkJCQkJICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuCisJCQkJCQkJCSAgIERlZmF1bHRLZXlJZF0uCisJCQkJCSAgICAgIFR4TWljLAorCQkJCQkgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy4KKwkJCQkJCQkJICAgRGVmYXVsdEtleUlkXS4KKwkJCQkJICAgICAgUnhNaWMpOwogCi0gICAgICAgIAkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSAgICAgICAgCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotICAgICAgICAJCQkJCQkJICBCU1MwLAotICAgICAgICAJCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0gICAgICAgIAkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotICAgICAgICAJCQkJCQkJICBOVUxMKTsKKwkJCS8qIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCisJCQkJCQkgIEJTUzAsCisJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKKwkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT4KKwkJCQkJCQkJICAgICAgIFN0YUNmZy4KKwkJCQkJCQkJICAgICAgIERlZmF1bHRLZXlJZF0uCisJCQkJCQkgIENpcGhlckFsZywgTlVMTCk7CiAKLSAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCisJCQkvKiBzZXQgODAyLjF4IHBvcnQgY29udHJvbCAqLworCQkJLypwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLwogCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOwogCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgfQotCX0KLQllbHNlCS8vIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQKKwkJCS8qIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJICovCisJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQl9CisJfSBlbHNlCQkJLyogZHluYW1pYyBXRVAgZnJvbSB3cGFfc3VwcGxpY2FudCAqLwogCXsKLQkJVUNIQVIJQ2lwaGVyQWxnOwotICAgIAlQVUNIQVIJS2V5OworCQl1OCBDaXBoZXJBbGc7CisJCXU4ICpLZXk7CiAKLQkJaWYocEtleS0+S2V5TGVuZ3RoID09IDMyKQorCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDMyKQogCQkJZ290byBlbmQ7CiAKIAkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOwogCi0JCWlmIChLZXlJZHggPCA0KQotCQl7Ci0JCQkvLyBpdCBpcyBhIGRlZmF1bHQgc2hhcmVkIGtleSwgZm9yIFBhaXJ3aXNlIGtleSBzZXR0aW5nCi0JCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotCQkJeworCQlpZiAoS2V5SWR4IDwgNCkgeworCQkJLyogaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZyAqLworCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkgewogCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEtleS0+QlNTSUQpOwogCi0JCQkJaWYgKHBFbnRyeSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CisJCQkJaWYgKHBFbnRyeSkgeworCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAoIlJUTVBBZGRLZXk6IFNldCBQYWlyLXdpc2UgS2V5XG4iKSk7CiAKLQkJCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAotIAkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOwotCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOworCQkJCQkvKiBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoICovCisJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuS2V5TGVuID0KKwkJCQkJICAgICh1OClwS2V5LT5LZXlMZW5ndGg7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LAorCQkJCQkJICAgICAgICZwS2V5LT5LZXlNYXRlcmlhbCwKKwkJCQkJCSAgICAgICBwS2V5LT5LZXlMZW5ndGgpOwogCi0JCQkJCS8vIHNldCBDaXBoZXIgdHlwZQorCQkJCQkvKiBzZXQgQ2lwaGVyIHR5cGUgKi8KIAkJCQkJaWYgKHBLZXktPktleUxlbmd0aCA9PSA1KQotCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7CisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9CisJCQkJCQkgICAgQ0lQSEVSX1dFUDY0OwogCQkJCQllbHNlCi0JCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9CisJCQkJCQkgICAgQ0lQSEVSX1dFUDEyODsKIAotCQkJCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCi0JCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KAotCQkJCQkJcEFkLAotCQkJCQkJcEVudHJ5LT5BZGRyLAotCQkJCQkJKFVDSEFSKXBFbnRyeS0+QWlkLAotICAgICAgICAgICAgICAgIAkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOworCQkJCQkvKiBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljICovCisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJcEVudHJ5LT5BZGRyLAorCQkJCQkJCQkodTgpcEVudHJ5LT4KKwkJCQkJCQkJQWlkLAorCQkJCQkJCQkmcEVudHJ5LT4KKwkJCQkJCQkJUGFpcndpc2VLZXkpOwogCi0JCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKLQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQkJCQkJCXBBZCwKLQkJCQkJCUJTUzAsCi0JCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KLQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCQkJcEVudHJ5KTsKKwkJCQkJLyogdXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBlbnRyeSAqLworCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LAkvKiBUaGUgdmFsdWUgbWF5IGJlIG5vdCB6ZXJvICovCisJCQkJCQkJCSAgcEVudHJ5LT4KKwkJCQkJCQkJICBQYWlyd2lzZUtleS4KKwkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCSAgcEVudHJ5KTsKIAogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLSAgICAgICAgICAgIHsKLQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7CisJCQl9IGVsc2UgeworCQkJCS8qIERlZmF1bHQga2V5IGZvciB0eCAoc2hhcmVkIGtleSkgKi8KKwkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAodTgpS2V5SWR4OwogCi0JCQkJLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5TGVuID0gKFVDSEFSKSBwS2V5LT5LZXlMZW5ndGg7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKKwkJCQkvKiBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoICovCisJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPQorCQkJCSAgICAodTgpcEtleS0+S2V5TGVuZ3RoOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5LAorCQkJCQkgICAgICAgJnBLZXktPktleU1hdGVyaWFsLAorCQkJCQkgICAgICAgcEtleS0+S2V5TGVuZ3RoKTsKIAotCQkJCS8vIFNldCBDaXBlciB0eXBlCisJCQkJLyogU2V0IENpcGVyIHR5cGUgKi8KIAkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCi0JCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9CisJCQkJCSAgICBDSVBIRVJfV0VQNjQ7CiAJCQkJZWxzZQotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7CisJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0KKwkJCQkJICAgIENJUEhFUl9XRVAxMjg7CiAKLSAgICAJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKLSAgICAJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKKwkJCQlDaXBoZXJBbGcgPQorCQkJCSAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKKwkJCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKIAotCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotICAgIAkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOworCQkJCS8qIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYyAqLworCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwKKwkJCQkJCSAgICAgIENpcGhlckFsZywgS2V5LCBOVUxMLAorCQkJCQkJICAgICAgTlVMTCk7CiAKLQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7CisJCQkJLyogVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUgKi8KKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LAorCQkJCQkJCSAgQ2lwaGVyQWxnLCBOVUxMKTsKIAogCQkJfQogCQl9CiAJfQogZW5kOgotI2lmZGVmIFJUMjg2MAotCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCI8LS0tLS0tIFJUTVBBZGRLZXlcbiIpKTsKLSNlbmRpZgogCXJldHVybjsKIH0KIAotY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKK2NoYXIgKnJ0c3RyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKQogewotICAgIGZvcig7ICpzICE9IChjaGFyKSBjOyArK3MpCi0gICAgICAgIGlmICgqcyA9PSAnXDAnKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIChjaGFyICopIHM7CisJZm9yICg7ICpzICE9IChjaGFyKWM7ICsrcykKKwkJaWYgKCpzID09ICdcMCcpCisJCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKGNoYXIgKilzOwogfQogCiAvKgpAQCAtNDc1LDE1OSArMzYxLDE2NCBAQAogCiBpbnQKIHJ0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCisJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKIHsKLS8vCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RybmNweShuYW1lLCBSVDI4eHhfQ0hJUF9OQU1FICIgV2lyZWxlc3MiLCBJRk5BTVNJWik7CisJc3RybmNweShuYW1lLCAiUmFsaW5rIFNUQSIsIElGTkFNU0laKTsKKwkvKiBSVDI4NzAgMi4xLjAuMCB1c2VzICJSVDI4NzAgV2lyZWxlc3MiICovCisJLyogUlQzMDkwIDIuMS4wLjAgdXNlcyAiUlQyODYwIFdpcmVsZXNzIiAqLwogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCWludCAJY2hhbiA9IC0xOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKKwlpbnQgY2hhbiA9IC0xOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOwogCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlpZiAoZnJlcS0+ZSA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYoKGZyZXEtPmUgPT0gMCkgJiYgKGZyZXEtPm0gPD0gMTAwMCkpCi0JCWNoYW4gPSBmcmVxLT5tOwkvLyBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyCisJaWYgKChmcmVxLT5lID09IDApICYmIChmcmVxLT5tIDw9IDEwMDApKQorCQljaGFuID0gZnJlcS0+bTsJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLwogCWVsc2UKLQkJTUFQX0tIWl9UT19DSEFOTkVMX0lEKCAoZnJlcS0+bSAvMTAwKSAsIGNoYW4pOyAvLyBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAtIHNlYXJjaCB0aGUgdGFibGUgLCBsaWtlIDIuNDEyRywgMi40MjJHLAorCQlNQVBfS0haX1RPX0NIQU5ORUxfSUQoKGZyZXEtPm0gLyAxMDApLCBjaGFuKTsJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywgKi8KIAotICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQotICAgIHsKLQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoQ2hhbm5lbFNhbml0eShwQWRhcHRlciwgY2hhbikgPT0gVFJVRSkgeworCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsCisJCQkgIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKIH0KKwogaW50IHJ0X2lvY3RsX2dpd2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7Ci0JVUNIQVIgY2ggPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JVUxPTkcJbTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisJdTggY2g7CisJdW5zaWduZWQgbG9uZyBtID0gMjQxMjAwMDsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CiAKLSAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOworCWNoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7CisKKwlNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOwogCWZyZXEtPm0gPSBtICogMTAwOwogCWZyZXEtPmUgPSAxOwogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3bW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBfX3UzMiAqbW9kZSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgX191MzIgKiBtb2RlLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAotCXN3aXRjaCAoKm1vZGUpCi0JewotCQljYXNlIElXX01PREVfQURIT0M6Ci0JCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7Ci0JCQlicmVhazsKLQkJY2FzZSBJV19NT0RFX0lORlJBOgotCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOwotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSVdfTU9ERV9NT05JVE9SOgotCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOwogCX0KIAotCS8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKKwlzd2l0Y2ggKCptb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWRhcHRlciwgIkFkaG9jIik7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJJbmZyYSIpOworCQlicmVhazsKKwljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJNb25pdG9yIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PnJ0X2lvY3RsX3Npd21vZGU6OlNJT0NTSVdNT0RFICh1bmtub3duICVkKVxuIiwKKwkJCSAgKm1vZGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleSAqLwogCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIF9fdTMyICogbW9kZSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAogCWlmIChBREhPQ19PTihwQWRhcHRlcikpCiAJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKLSAgICBlbHNlIGlmIChJTkZSQV9PTihwQWRhcHRlcikpCisJZWxzZSBpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKQogCQkqbW9kZSA9IElXX01PREVfSU5GUkE7Ci0gICAgZWxzZSBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgewotICAgICAgICAqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICAqbW9kZSA9IElXX01PREVfQVVUTzsKKwllbHNlIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkgeworCQkqbW9kZSA9IElXX01PREVfTU9OSVRPUjsKKwl9IGVsc2UKKwkJKm1vZGUgPSBJV19NT0RFX0FVVE87CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5ydF9pb2N0bF9naXdtb2RlKG1vZGU9JWQpXG4iLCAqbW9kZSkpOwogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICAJewotICAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCiB7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdyYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7Ci0Jc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7CiAJdTE2IHZhbDsKIAlpbnQgaTsKIAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT5ydF9pb2N0bF9naXdyYW5nZVxuIikpOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd3JhbmdlXG4iKSk7CiAJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CiAJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CiAKIAlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOwogCi0JaWYgKElORlJBX09OKHBBZGFwdGVyKXx8QURIT0NfT04ocEFkYXB0ZXIpKQotCXsKKwlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkgewogCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OwogCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKIAkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKQEAgLTYzNSw3ICs1MjYsNyBAQAogCQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOwogCQlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKIAkJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwKLQkJCUlXX1BPV0VSX1VOSUNBU1RfUiB8IElXX1BPV0VSX0FMTF9SOworCQkgICAgSVdfUE9XRVJfVU5JQ0FTVF9SIHwgSVdfUE9XRVJfQUxMX1I7CiAJfQogCiAJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CkBAIC02NDYsMTUgKzUzNywxNCBAQAogCXJhbmdlLT5taW5fcmV0cnkgPSAwOwogCXJhbmdlLT5tYXhfcmV0cnkgPSAyNTU7CiAKLQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gIHBBZGFwdGVyLT5DaGFubmVsTGlzdE51bTsKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOwogCiAJdmFsID0gMDsKLQlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKLQl7Ci0JCXUzMiBtOwotCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaS0xXS5DaGFubmVsOwotCQlNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbCwgbSk7Ci0JCXJhbmdlLT5mcmVxW3ZhbF0ubSA9IG0gKiAxMDA7IC8qIEhaICovCisJZm9yIChpID0gMTsgaSA8PSByYW5nZS0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJdTMyIG0gPSAyNDEyMDAwOworCQlyYW5nZS0+ZnJlcVt2YWxdLmkgPSBwQWRhcHRlci0+Q2hhbm5lbExpc3RbaSAtIDFdLkNoYW5uZWw7CisJCU1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWRhcHRlci0+Q2hhbm5lbExpc3RbaSAtIDFdLkNoYW5uZWwsIG0pOworCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOwkvKiBPU19IWiAqLwogCiAJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7CiAJCXZhbCsrOwpAQCAtNjYzLDExICs1NTMsMTEgQEAKIAl9CiAJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CiAKLQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsgLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90Ci0JCQkJCSogZG9jdW1lbnRlZCBleGFjdGx5LiBBdCBsZWFzdAotCQkJCQkqIDY5IGhhcyBiZWVuIG9ic2VydmVkLiAqLwotCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7IC8qIGRCICovCi0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsgLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsJLyogd2hhdCBpcyBjb3JyZWN0IG1heD8gVGhpcyB3YXMgbm90CisJCQkJCSAqIGRvY3VtZW50ZWQgZXhhY3RseS4gQXQgbGVhc3QKKwkJCQkJICogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsJLyogZEIgKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOwkvKiBkQiAqLwogCiAJLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCiAJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKQEAgLTY4Nyw3MCArNTc3LDY4IEBACiAKIAkvKiBJV19FTkNfQ0FQQV8qIGJpdCBmaWVsZCAqLwogCXJhbmdlLT5lbmNfY2FwYSA9IElXX0VOQ19DQVBBX1dQQSB8IElXX0VOQ19DQVBBX1dQQTIgfAotCQkJCQlJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworCSAgICBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUCB8IElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOwogCiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgTkRJU184MDJfMTFfTUFDX0FERFJFU1MgQnNzaWQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOworCU5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOwogCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotICAgICAgIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOwogCi0JaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0gICAgewotICAgICAgICBSVDI4WFhfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZGFwdGVyKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgIH0KKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAotICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotICAgIC8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0gICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKKwlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgeworCQlSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUhXG4iKSk7CisJfQorCS8qIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZyAqLworCS8qIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuICovCisJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKKwkvKiBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYyAqLworCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gMzI7CiAKLSAgICBtZW1zZXQoQnNzaWQsIDAsIE1BQ19BRERSX0xFTik7Ci0gICAgbWVtY3B5KEJzc2lkLCBhcF9hZGRyLT5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOwotICAgIE1sbWVFbnF1ZXVlKHBBZGFwdGVyLAotICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfQlNTSUQsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX01BQ19BRERSRVNTKSwKLSAgICAgICAgICAgICAgICAoVk9JRCAqKSZCc3NpZCk7CisJbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOworCW1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwlNbG1lRW5xdWV1ZShwQWRhcHRlciwKKwkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkgICAgT0lEXzgwMl8xMV9CU1NJRCwKKwkJICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksICh2b2lkICopICYgQnNzaWQpOwogCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJJT0NUTDo6U0lPQ1NJV0FQICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBCc3NpZFswXSwKKwkJICBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKIAogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKKwkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgc3RydWN0IHNvY2thZGRyICphcF9hZGRyLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQotCXsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKSB7CiAJCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7CiAJfQotICAgIC8vIEFkZCBmb3IgUlQyODcwCi0gICAgZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLSAgICB7Ci0gICAgICAgIGFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLSAgICAgICAgbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+TWxtZUF1eC5Cc3NpZCwgRVRIX0FMRU4pOwotICAgIH0KLQllbHNlCi0JeworCS8qIEFkZCBmb3IgUlQyODcwICovCisJZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkgeworCQlhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKKwl9IGVsc2UgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJV0FQKD1FTVBUWSlcbiIpKTsKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAl9CkBAIC03NzQsMzE2ICs2NjIsMzE3IEBACiAgKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KICAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5CiAgKi8KLXN0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQorc3RhdGljIHZvaWQgc2V0X3F1YWxpdHkoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIsCisJCQlzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsIHNpZ25lZCBjaGFyIHJzc2kpCiB7CiAJX191OCBDaGFubmVsUXVhbGl0eTsKIAotCS8vIE5vcm1hbGl6ZSBSc3NpCisJLyogTm9ybWFsaXplIFJzc2kgKi8KIAlpZiAocnNzaSA+PSAtNTApCiAJCUNoYW5uZWxRdWFsaXR5ID0gMTAwOwotCWVsc2UgaWYgKHJzc2kgPj0gLTgwKSAvLyBiZXR3ZWVuIC01MCB+IC04MGRibQotCQlDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgyNCArICgocnNzaSArIDgwKSAqIDI2KS8xMCk7Ci0JZWxzZSBpZiAocnNzaSA+PSAtOTApICAgLy8gYmV0d2VlbiAtODAgfiAtOTBkYm0KLSAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkoKHJzc2kgKyA5MCkgKiAyNikvMTA7CisJZWxzZSBpZiAocnNzaSA+PSAtODApCS8qIGJldHdlZW4gLTUwIH4gLTgwZGJtICovCisJCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpICgyNCArICgocnNzaSArIDgwKSAqIDI2KSAvIDEwKTsKKwllbHNlIGlmIChyc3NpID49IC05MCkJLyogYmV0d2VlbiAtODAgfiAtOTBkYm0gKi8KKwkJQ2hhbm5lbFF1YWxpdHkgPSAoX191OCkgKChyc3NpICsgOTApICogMjYpIC8gMTA7CiAJZWxzZQogCQlDaGFubmVsUXVhbGl0eSA9IDA7CiAKLSAgICBpcS0+cXVhbCA9IChfX3U4KUNoYW5uZWxRdWFsaXR5OworCWlxLT5xdWFsID0gKF9fdTgpIENoYW5uZWxRdWFsaXR5OwogCi0gICAgaXEtPmxldmVsID0gKF9fdTgpKHJzc2kpOwotICAgIGlxLT5ub2lzZSA9IChwQWRhcHRlci0+QmJwV3JpdGVMYXRjaFs2Nl0gPiBwQWRhcHRlci0+QmJwVHVuaW5nLkZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQpID8gKChfX3U4KXBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7IAkvLyBub2lzZSBsZXZlbCAoZEJtKQotICAgIGlxLT5ub2lzZSArPSAyNTYgLSAxNDM7Ci0gICAgaXEtPnVwZGF0ZWQgPSBwQWRhcHRlci0+aXdfc3RhdHMucXVhbC51cGRhdGVkOworCWlxLT5sZXZlbCA9IChfX3U4KSAocnNzaSk7CisJaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpIHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgOiAoKF9fdTgpIHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSk7CS8qIG5vaXNlIGxldmVsIChkQm0pICovCisJaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKKwlpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7CiB9CiAKIGludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCiB7Ci0gCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCiAJc3RydWN0IHNvY2thZGRyIGFkZHJbSVdfTUFYX0FQXTsKIAlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CiAJaW50IGk7CiAKLSAgIAkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CiAJCWRhdGEtPmxlbmd0aCA9IDA7CiAJCXJldHVybiAwOwotICAgICAgICAvL3JldHVybiAtRU5FVERPV047CisJCS8qcmV0dXJuIC1FTkVURE9XTjsgKi8KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDxJV19NQVhfQVAgOyBpKyspCi0JewotCQlpZiAoaSA+PSAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIpCisJZm9yIChpID0gMDsgaSA8IElXX01BWF9BUDsgaSsrKSB7CisJCWlmIChpID49IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQogCQkJYnJlYWs7CiAJCWFkZHJbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOwotCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOworCQltZW1jcHkoYWRkcltpXS5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsCisJCSAgICAgICBNQUNfQUREUl9MRU4pOworCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sCisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNzaSk7CiAJfQogCWRhdGEtPmxlbmd0aCA9IGk7Ci0JbWVtY3B5KGV4dHJhLCAmYWRkciwgaSpzaXplb2YoYWRkclswXSkpOwotCWRhdGEtPmZsYWdzID0gMTsJCS8qIHNpZ25hbCBxdWFsaXR5IHByZXNlbnQgKHNvcnQgb2YpICovCi0JbWVtY3B5KGV4dHJhICsgaSpzaXplb2YoYWRkclswXSksICZxdWFsLCBpKnNpemVvZihxdWFsW2ldKSk7CisJbWVtY3B5KGV4dHJhLCAmYWRkciwgaSAqIHNpemVvZihhZGRyWzBdKSk7CisJZGF0YS0+ZmxhZ3MgPSAxOwkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLworCW1lbWNweShleHRyYSArIGkgKiBzaXplb2YoYWRkclswXSksICZxdWFsLCBpICogc2l6ZW9mKHF1YWxbaV0pKTsKIAogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JVUxPTkcJCQkJCQkJCU5vdzsKKwl1bnNpZ25lZCBsb25nIE5vdzsKIAlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgewogCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CiAJCXJldHVybiAtRU5FVERPV047CiAJfQogCi0JaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93ICEhIVxuIikpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jaWZkZWYgUlQyODYwCi0JaWYgKChwQWRhcHRlci0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChJRExFX09OKHBBZGFwdGVyKSkKLQkJJiYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCSYmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCXsKLQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkYXB0ZXIsIEdVSV9JRExFX1BPV0VSX1NBVkUpOworCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIkRyaXZlciBpcyBpbiBNb25pdG9yIE1vZGUgbm93IVxuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JLy8gQ2hlY2sgaWYgc3RpbGwgcmFkaW8gb2ZmLgotCWVsc2UgaWYgKHBBZGFwdGVyLT5iUENJY2xrT2ZmID09IFRSVUUpCi0JCXJldHVybiAwOwotI2VuZGlmCi0JaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKLQl7CisKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSB7CiAJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOwogCX0KIAotICAgIHBBZGFwdGVyLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7CisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKIAlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQlyZXR1cm4gMDsKLQlkb3sKKwkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisJZG8gewogCQlOb3cgPSBqaWZmaWVzOwogCi0JCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSAmJgotCQkJKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDMpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgV3BhU3VwcGxpY2FudFNjYW5Db3VudCA+IDNcbiIpKTsKKwkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCisJCSAgICAmJiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50U2NhbkNvdW50ID4gMykpIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7CiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgotCQkJKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpICYmCi0JCQkocEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgUG9ydCBOb3QgU2VjdXJlZCEgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOworCQlpZiAoKE9QU1RBVFVTX1RFU1RfRkxBRworCQkgICAgIChwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQorCQkgICAgJiYgKChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKKwkJCXx8IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKKwkJICAgICYmIChwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09CisJCQlXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7CiAJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLQkJewotCQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7CisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSB7CisJCQlSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSFcbiIpKTsKIAkJfQotCi0JCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotCQkvLyB0aGlzIHJlcXVlc3QsIGJlY2F1c2UgdGhpcyByZXF1ZXN0IGlzIGluaXRpYXRlZCBieSBORElTLgorCQkvKiB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcgKi8KKwkJLyogdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4gKi8KIAkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLQkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKKwkJLyogUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMgKi8KIAkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7CiAKIAkJTWxtZUVucXVldWUocEFkYXB0ZXIsCi0JCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAotCQkJMCwKLQkJCU5VTEwpOworCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJICAgIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLCAwLCBOVUxMKTsKIAogCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQlSVDI4WFhfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKLQl9d2hpbGUoMCk7Ci0JcmV0dXJuIDA7CisJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKIHsKLQotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7Ci0JaW50IGk9MDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CisJaW50IGkgPSAwOwogCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYSwgKnByZXZpb3VzX2V2ID0gZXh0cmE7CiAJY2hhciAqZW5kX2J1ZjsKLQljaGFyICpjdXJyZW50X3ZhbCwgY3VzdG9tW01BWF9DVVNUT01fTEVOXSA9IHswfTsKKwljaGFyICpjdXJyZW50X3ZhbDsKKwljaGFyIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7IDAgfTsKIAlzdHJ1Y3QgaXdfZXZlbnQgaXdlOwogCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICB7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB7CiAJCS8qCiAJCSAqIFN0aWxsIHNjYW5uaW5nLCBpbmRpY2F0ZSB0aGUgY2FsbGVyIHNob3VsZCB0cnkgYWdhaW4uCiAJCSAqLwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKQotCXsKKwlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSB7CiAJCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCA9IDA7CiAJfQogCi0JaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yID09IDApCi0JeworCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA9PSAwKSB7CiAJCWRhdGEtPmxlbmd0aCA9IDA7CiAJCXJldHVybiAwOwogCX0KIAotICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQotICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7Ci0gICAgZWxzZQotICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworCWlmIChkYXRhLT5sZW5ndGggPiAwKQorCQllbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7CisJZWxzZQorCQllbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOwogCi0JZm9yIChpID0gMDsgaSA8IHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlpZiAoY3VycmVudF9ldiA+PSBlbmRfYnVmKQorCWZvciAoaSA9IDA7IGkgPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOcjsgaSsrKSB7CisJCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpIHsKIAkJCXJldHVybiAtRTJCSUc7Ci0KLQkJLy9NQUMgYWRkcmVzcwotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCX0KKwkJLypNQUMgYWRkcmVzcyAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CiAJCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwKKwkJICAgICAgICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NpZCwgRVRIX0FMRU4pOwogCi0gICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLQkJcmV0dXJuIC1FMkJJRzsKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9BRERSX0xFTik7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAogCQkvKgotCQlQcm90b2NvbDoKLQkJCWl0IHdpbGwgc2hvdyBzY2FubmVkIEFQJ3MgV2lyZWxlc3NNb2RlIC4KLQkJCWl0IG1pZ2h0IGJlCi0JCQkJCTgwMi4xMWEKLQkJCQkJODAyLjExYS9uCi0JCQkJCTgwMi4xMWcvbgotCQkJCQk4MDIuMTFiL2cvbgotCQkJCQk4MDIuMTFnCi0JCQkJCTgwMi4xMWIvZwotCQkqLworCQkgICBQcm90b2NvbDoKKwkJICAgaXQgd2lsbCBzaG93IHNjYW5uZWQgQVAncyBXaXJlbGVzc01vZGUgLgorCQkgICBpdCBtaWdodCBiZQorCQkgICA4MDIuMTFhCisJCSAgIDgwMi4xMWEvbgorCQkgICA4MDIuMTFnL24KKwkJICAgODAyLjExYi9nL24KKwkJICAgODAyLjExZworCQkgICA4MDIuMTFiL2cKKwkJICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXTkFNRTsKIAotCi0JewotCQlQQlNTX0VOVFJZIHBCc3NFbnRyeT0mcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0JCUJPT0xFQU4gaXNHb25seT1GQUxTRTsKLQkJaW50IHJhdGVDbnQ9MDsKLQotCQlpZiAocEJzc0VudHJ5LT5DaGFubmVsPjE0KQogCQl7Ci0JCQlpZiAocEJzc0VudHJ5LT5IdENhcGFiaWxpdHlMZW4hPTApCi0JCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWEvbiIpOwotCQkJZWxzZQotCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFhIik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKgotCQkJCWlmIG9uZSBvZiBub24gQiBtb2RlIHJhdGUgaXMgc2V0IHN1cHBvcnRlZCByYXRlIC4gaXQgbWVhbiBHIG9ubHkuCi0JCQkqLwotCQkJZm9yIChyYXRlQ250PTA7cmF0ZUNudDxwQnNzRW50cnktPlN1cFJhdGVMZW47cmF0ZUNudCsrKQotCQkJeworCQkJc3RydWN0IHJ0X2Jzc19lbnRyeSAqcEJzc0VudHJ5ID0gJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldOworCQkJQk9PTEVBTiBpc0dvbmx5ID0gRkFMU0U7CisJCQlpbnQgcmF0ZUNudCA9IDA7CisKKwkJCWlmIChwQnNzRW50cnktPkNoYW5uZWwgPiAxNCkgeworCQkJCWlmIChwQnNzRW50cnktPkh0Q2FwYWJpbGl0eUxlbiAhPSAwKQorCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwgIjgwMi4xMWEvbiIpOworCQkJCWVsc2UKKwkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsICI4MDIuMTFhIik7CisJCQl9IGVsc2UgewogCQkJCS8qCi0JCQkJCTZNYnBzKDE0MCkgOU1icHMoMTQ2KSBhbmQgPj0xMk1icHMoMTUyKSBhcmUgc3VwcG9ydGVkIHJhdGUgLCBpdCBtZWFuIEcgb25seS4KLQkJCQkqLwotCQkJCWlmIChwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF09PTE0MCB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF09PTE0NiB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0+PTE1MikKLQkJCQkJaXNHb25seT1UUlVFOwotCQkJfQorCQkJCSAgIGlmIG9uZSBvZiBub24gQiBtb2RlIHJhdGUgaXMgc2V0IHN1cHBvcnRlZCByYXRlIC4gaXQgbWVhbiBHIG9ubHkuCisJCQkJICovCisJCQkJZm9yIChyYXRlQ250ID0gMDsKKwkJCQkgICAgIHJhdGVDbnQgPCBwQnNzRW50cnktPlN1cFJhdGVMZW47CisJCQkJICAgICByYXRlQ250KyspIHsKKwkJCQkJLyoKKwkJCQkJICAgNk1icHMoMTQwKSA5TWJwcygxNDYpIGFuZCA+PTEyTWJwcygxNTIpIGFyZSBzdXBwb3J0ZWQgcmF0ZSAsIGl0IG1lYW4gRyBvbmx5LgorCQkJCQkgKi8KKwkJCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XSA9PSAxNDAKKwkJCQkJICAgIHx8IHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XSA9PQorCQkJCQkgICAgMTQ2CisJCQkJCSAgICB8fCBwQnNzRW50cnktPlN1cFJhdGVbcmF0ZUNudF0gPj0KKwkJCQkJICAgIDE1MikKKwkJCQkJCWlzR29ubHkgPSBUUlVFOworCQkJCX0KIAotCQkJZm9yIChyYXRlQ250PTA7cmF0ZUNudDxwQnNzRW50cnktPkV4dFJhdGVMZW47cmF0ZUNudCsrKQotCQkJewotCQkJCWlmIChwQnNzRW50cnktPkV4dFJhdGVbcmF0ZUNudF09PTE0MCB8fCBwQnNzRW50cnktPkV4dFJhdGVbcmF0ZUNudF09PTE0NiB8fCBwQnNzRW50cnktPkV4dFJhdGVbcmF0ZUNudF0+PTE1MikKLQkJCQkJaXNHb25seT1UUlVFOwotCQkJfQorCQkJCWZvciAocmF0ZUNudCA9IDA7CisJCQkJICAgICByYXRlQ250IDwgcEJzc0VudHJ5LT5FeHRSYXRlTGVuOworCQkJCSAgICAgcmF0ZUNudCsrKSB7CisJCQkJCWlmIChwQnNzRW50cnktPkV4dFJhdGVbcmF0ZUNudF0gPT0gMTQwCisJCQkJCSAgICB8fCBwQnNzRW50cnktPkV4dFJhdGVbcmF0ZUNudF0gPT0KKwkJCQkJICAgIDE0NgorCQkJCQkgICAgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdID49CisJCQkJCSAgICAxNTIpCisJCQkJCQlpc0dvbmx5ID0gVFJVRTsKKwkJCQl9CiAKLQotCQkJaWYgKHBCc3NFbnRyeS0+SHRDYXBhYmlsaXR5TGVuIT0wKQotCQkJewotCQkJCWlmIChpc0dvbmx5PT1UUlVFKQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExZy9uIik7Ci0JCQkJZWxzZQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYi9nL24iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoaXNHb25seT09VFJVRSkKLQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWciKTsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlTGVuPT00ICYmIHBCc3NFbnRyeS0+RXh0UmF0ZUxlbj09MCkKLQkJCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiIik7CisJCQkJaWYgKHBCc3NFbnRyeS0+SHRDYXBhYmlsaXR5TGVuICE9IDApIHsKKwkJCQkJaWYgKGlzR29ubHkgPT0gVFJVRSkKKwkJCQkJCXN0cmNweShpd2UudS5uYW1lLCAiODAyLjExZy9uIik7CiAJCQkJCWVsc2UKLQkJCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiL2ciKTsKKwkJCQkJCXN0cmNweShpd2UudS5uYW1lLAorCQkJCQkJICAgICAgICI4MDIuMTFiL2cvbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChpc0dvbmx5ID09IFRSVUUpCisJCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwgIjgwMi4xMWciKTsKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAocEJzc0VudHJ5LT5TdXBSYXRlTGVuID09IDQKKwkJCQkJCSAgICAmJiBwQnNzRW50cnktPkV4dFJhdGVMZW4gPT0KKwkJCQkJCSAgICAwKQorCQkJCQkJCXN0cmNweShpd2UudS5uYW1lLAorCQkJCQkJCSAgICAgICAiODAyLjExYiIpOworCQkJCQkJZWxzZQorCQkJCQkJCXN0cmNweShpd2UudS5uYW1lLAorCQkJCQkJCSAgICAgICAiODAyLjExYi9nIik7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KLQl9CiAKIAkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2CSA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX0FERFJfTEVOKTsKKwkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisJCQlyZXR1cm4gLUUyQklHOwogCi0JCS8vRVNTSUQKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvKkVTU0lEICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKIAkJaXdlLnUuZGF0YS5sZW5ndGggPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOwogCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKIAotICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWQpOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLQkJcmV0dXJuIC1FMkJJRzsKKwkJcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OworCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSAoY2hhciAqKXBBZGFwdGVyLT5TY2FuVGFiLgorCQkJCQkgQnNzRW50cnlbaV0uU3NpZCk7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAotCQkvL05ldHdvcmsgVHlwZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8qTmV0d29yayBUeXBlICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOwotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKLQkJeworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykgewogCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7Ci0JCX0KLQkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCi0JCXsKKwkJfSBlbHNlIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Cc3NUeXBlID09CisJCQkgICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpIHsKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOwotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKIAkJfQogCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47CiAKLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgSVdfRVZfVUlOVF9MRU4pOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvKkNoYW5uZWwgYW5kIEZyZXF1ZW5jeSAqLworCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKIAkJaWYgKElORlJBX09OKHBBZGFwdGVyKSB8fCBBREhPQ19PTihwQWRhcHRlcikpCkBAIC0xMDk0LDE3MiArOTgzLDIxNyBAQAogCQlpd2UudS5mcmVxLmkgPSAwOwogCiAJCXByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0JCXJldHVybiAtRTJCSUc7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIElXX0VWX0ZSRVFfTEVOKTsKKwkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCisJCQlyZXR1cm4gLUUyQklHOwogCi0gICAgICAgIC8vQWRkIHF1YWxpdHkgc3RhdGlzdGljcwotICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIG1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0gICAgCWl3ZS5jbWQgPSBJV0VWUVVBTDsKLSAgICAJaXdlLnUucXVhbC5sZXZlbCA9IDA7Ci0gICAgCWl3ZS51LnF1YWwubm9pc2UgPSAwOwotICAgICAgICBzZXRfcXVhbGl0eShwQWRhcHRlciwgJml3ZS51LnF1YWwsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOwotICAgIAljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwotICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLQkJcmV0dXJuIC1FMkJJRzsKKwkJLypBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZRVUFMOworCQlpd2UudS5xdWFsLmxldmVsID0gMDsKKwkJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisJCXNldF9xdWFsaXR5KHBBZGFwdGVyLCAmaXdlLnUucXVhbCwKKwkJCSAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKKwkJY3VycmVudF9ldiA9CisJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkgSVdfRVZfUVVBTF9MRU4pOworCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQkJLy9FbmN5cHRpb24ga2V5Ci0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLypFbmN5cHRpb24ga2V5ICovCisJCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7Ci0JCWlmIChDQVBfSVNfUFJJVkFDWV9PTiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2FwYWJpbGl0eUluZm8gKSkKLQkJCWl3ZS51LmRhdGEuZmxhZ3MgPUlXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04KKwkJICAgIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5DYXBhYmlsaXR5SW5mbykpCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CiAJCWVsc2UKIAkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CiAKLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotICAgICAgICBjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwmaXdlLCAoY2hhciAqKXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bKGl3ZS51LmRhdGEuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpLTFdLktleSk7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotCQlyZXR1cm4gLUUyQklHOworCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7CisJCWN1cnJlbnRfZXYgPQorCQkgICAgaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJIChjaGFyICopcEFkYXB0ZXItPgorCQkJCQkgU2hhcmVkS2V5W0JTUzBdWyhpd2UudS5kYXRhLgorCQkJCQkJCSAgZmxhZ3MgJgorCQkJCQkJCSAgSVdfRU5DT0RFX0lOREVYKSAtCisJCQkJCQkJIDFdLktleSk7CisJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQorCQkJcmV0dXJuIC1FMkJJRzsKIAotCQkvL0JpdCBSYXRlCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVDSEFSIHRtcFJhdGUgPSBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlW3BBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4tMV07CisJCS8qQml0IFJhdGUgKi8KKwkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZUxlbikgeworCQkJdTggdG1wUmF0ZSA9CisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+CisJCQkJCQkJCSAgU2NhblRhYi4KKwkJCQkJCQkJICBCc3NFbnRyeVtpXS4KKwkJCQkJCQkJICBTdXBSYXRlTGVuIC0KKwkJCQkJCQkJICAxXTsKIAkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7Ci0gICAgCQljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOwotICAgICAgICAgICAgaWYgKHRtcFJhdGUgPT0gMHg4MikKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDEgKiAxMDAwMDAwOwotICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDg0KQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMiAqIDEwMDAwMDA7Ci0gICAgICAgICAgICBlbHNlIGlmICh0bXBSYXRlID09IDB4OEIpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICA1LjUgKiAxMDAwMDAwOwotICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDk2KQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgMTEgKiAxMDAwMDAwOwotICAgICAgICAgICAgZWxzZQotICAgIAkJICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgKHRtcFJhdGUvMikgKiAxMDAwMDAwOworCQkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKKwkJCWlmICh0bXBSYXRlID09IDB4ODIpCisJCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IDEgKiAxMDAwMDAwOworCQkJZWxzZSBpZiAodG1wUmF0ZSA9PSAweDg0KQorCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAyICogMTAwMDAwMDsKKwkJCWVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4QikKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gNS41ICogMTAwMDAwMDsKKwkJCWVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKKwkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0gMTEgKiAxMDAwMDAwOworCQkJZWxzZQorCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAodG1wUmF0ZSAvIDIpICogMTAwMDAwMDsKKworCQkJaWYgKHRtcFJhdGUgPT0gMHg2YworCQkJICAgICYmIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eUxlbiA+CisJCQkgICAgMCkgeworCQkJCWludCByYXRlX2NvdW50ID0KKwkJCQkgICAgc2l6ZW9mKHJhbGlua3JhdGUpIC8gc2l6ZW9mKF9fczMyKTsKKwkJCQlzdHJ1Y3QgcnRfaHRfY2FwX2luZm8gY2FwSW5mbyA9CisJCQkJICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eS4KKwkJCQkgICAgSHRDYXBJbmZvOworCQkJCWludCBzaG9ydEdJID0KKwkJCQkgICAgY2FwSW5mby5DaGFubmVsV2lkdGggPyBjYXBJbmZvLgorCQkJCSAgICBTaG9ydEdJZm9yNDAgOiBjYXBJbmZvLlNob3J0R0lmb3IyMDsKKwkJCQlpbnQgbWF4TUNTID0KKwkJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSHRDYXBhYmlsaXR5LgorCQkJCSAgICBNQ1NTZXRbMV0gPyAxNSA6IDc7CisJCQkJaW50IHJhdGVfaW5kZXggPQorCQkJCSAgICAxMiArICgodTgpY2FwSW5mby5DaGFubmVsV2lkdGggKiAyNCkgKworCQkJCSAgICAoKHU4KXNob3J0R0kgKiA0OCkgKyAoKHU4KW1heE1DUyk7CisJCQkJaWYgKHJhdGVfaW5kZXggPCAwKQorCQkJCQlyYXRlX2luZGV4ID0gMDsKKwkJCQlpZiAocmF0ZV9pbmRleCA+IHJhdGVfY291bnQpCisJCQkJCXJhdGVfaW5kZXggPSByYXRlX2NvdW50OworCQkJCWl3ZS51LmJpdHJhdGUudmFsdWUgPQorCQkJCSAgICByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworCQkJfQogCiAJCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKIAkJCWN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoaW5mbywgY3VycmVudF9ldiwKLQkJCQljdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwKLSAgICAJCQlJV19FVl9QQVJBTV9MRU4pOworCQkJCQkJCSAgIGN1cnJlbnRfdmFsLCBlbmRfYnVmLAorCQkJCQkJCSAgICZpd2UsCisJCQkJCQkJICAgSVdfRVZfUEFSQU1fTEVOKTsKIAotICAgICAgICAJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCi0gICAgICAgICAgICAJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOwotICAgICAgICAJZWxzZQotCQkJcmV0dXJuIC1FMkJJRzsKLSAgICAgICAgfQotCi0JCS8vV1BBIElFCi0JCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbiA+IDApCi0JCXsKKwkJCWlmICgoY3VycmVudF92YWwgLSBjdXJyZW50X2V2KSA+IElXX0VWX0xDUF9MRU4pCisJCQkJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworCQkJZWxzZQorCQkJCXJldHVybiAtRTJCSUc7CisJCX0KKwkJLypXUEEgSUUgKi8KKwkJaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkgewogCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJCW1lbXNldCgmY3VzdG9tWzBdLCAwLCBNQVhfQ1VTVE9NX0xFTik7Ci0JCQltZW1jcHkoY3VzdG9tLCAmKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFWzBdKSwKLQkJCQkJCSAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuKTsKKwkJCW1lbWNweShjdXN0b20sCisJCQkgICAgICAgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRVswXSksCisJCQkgICAgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOwogCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKLQkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47Ci0JCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0KKwkJCSAgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsKKwkJCWN1cnJlbnRfZXYgPQorCQkJICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkgJml3ZSwgY3VzdG9tKTsKIAkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQogCQkJCXJldHVybiAtRTJCSUc7CiAJCX0KLQotCQkvL1dQQTIgSUUKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKLSAgICAgICAgewotICAgICAgICAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJLypXUEEyIElFICovCisJCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApIHsKKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOwotCQkJbWVtY3B5KGN1c3RvbSwgJihwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVswXSksCi0JCQkJCQkgICBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbik7CisJCQltZW1jcHkoY3VzdG9tLAorCQkJICAgICAgICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAorCQkJICAgICAgIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuKTsKIAkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIGN1c3RvbSk7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9CisJCQkgICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47CisJCQljdXJyZW50X2V2ID0KKwkJCSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJICZpd2UsIGN1c3RvbSk7CiAJCQlpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKIAkJCQlyZXR1cm4gLUUyQklHOwotICAgICAgICB9CisJCX0KIAl9CiAKIAlkYXRhLT5sZW5ndGggPSBjdXJyZW50X2V2IC0gZXh0cmE7Ci0gICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLCgiPT09PnJ0X2lvY3RsX2dpd3NjYW4uICVkKCVkKSBCU1MgcmV0dXJuZWQsIGRhdGEtPmxlbmd0aCA9ICVkXG4iLGkgLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CisJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCSAoIj09PT5ydF9pb2N0bF9naXdzY2FuLiAlZCglZCkgQlNTIHJldHVybmVkLCBkYXRhLT5sZW5ndGggPSAlZFxuIiwKKwkJICBpLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NOciwgZGF0YS0+bGVuZ3RoKSk7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9zaXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKIAotCWlmIChkYXRhLT5mbGFncykKLQl7Ci0JCVBDSEFSCXBTc2lkU3RyaW5nID0gTlVMTDsKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAotCQkvLyBJbmNsdWRlcyBudWxsIGNoYXJhY3Rlci4KKwlpZiAoZGF0YS0+ZmxhZ3MpIHsKKwkJY2hhciAqcFNzaWRTdHJpbmcgPSBOVUxMOworCisJCS8qIEluY2x1ZGVzIG51bGwgY2hhcmFjdGVyLiAqLwogCQlpZiAoZGF0YS0+bGVuZ3RoID4gKElXX0VTU0lEX01BWF9TSVpFICsgMSkpCiAJCQlyZXR1cm4gLUUyQklHOwogCi0JCXBTc2lkU3RyaW5nID0gKENIQVIgKikga21hbGxvYyhNQVhfTEVOX09GX1NTSUQrMSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZiAocFNzaWRTdHJpbmcpCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KHBTc2lkU3RyaW5nLCBNQVhfTEVOX09GX1NTSUQrMSk7CisJCXBTc2lkU3RyaW5nID0ga21hbGxvYyhNQVhfTEVOX09GX1NTSUQgKyAxLCBNRU1fQUxMT0NfRkxBRyk7CisJCWlmIChwU3NpZFN0cmluZykgeworCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCArIDEpOwogCQkJTmRpc01vdmVNZW1vcnkocFNzaWRTdHJpbmcsIGVzc2lkLCBkYXRhLT5sZW5ndGgpOwogCQkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsIHBTc2lkU3RyaW5nKSA9PSBGQUxTRSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQllbHNlCisJCX0gZWxzZQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEFOWSBzc2lkCisJfSBlbHNlIHsKKwkJLyogQU5ZIHNzaWQgKi8KIAkJaWYgKFNldF9TU0lEX1Byb2MocEFkYXB0ZXIsICIiKSA9PSBGQUxTRSkKIAkJCXJldHVybiAtRUlOVkFMOwotICAgIH0KKwl9CiAJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICplc3NpZCkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKKworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOwogCiAJZGF0YS0+ZmxhZ3MgPSAxOwotICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICB7Ci0gICAgICAgIGRhdGEtPmxlbmd0aCAgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKSB7CisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KIAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CisJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1lZGlhU3RhdGUgaXMgY29ubmVjdGVkXG4iKSk7CiAJCWRhdGEtPmxlbmd0aCA9IHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbjsKLQkJbWVtY3B5KGVzc2lkLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLlNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CisJCW1lbWNweShlc3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkLAorCQkgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKIAl9Ci0jaWZkZWYgUlQyODcwCi0gICAgLy8gQWRkIGZvciBSVDI4NzAKLSAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotICAgIHsKLSAgICAgICAgZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwkvKiBBZGQgZm9yIFJUMjg3MCAqLworCWVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpIHsKKwkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOworCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwKKwkJICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZExlbik7CiAJfQotI2VuZGlmIC8vIFJUMjg3MCAvLwotCWVsc2UKLQl7Ly90aGUgQU5ZIHNzaWQgd2FzIHNwZWNpZmllZAotCQlkYXRhLT5sZW5ndGggID0gMDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKKyNlbmRpZiAvKiBSVE1QX01BQ19VU0IgLy8gKi8KKwllbHNlIHsJCQkvKnRoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkICovCisJCWRhdGEtPmxlbmd0aCA9IDA7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiTWVkaWFTdGF0ZSBpcyBub3QgY29ubmVjdGVkLCBlc3NcbiIpKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEyNjcsMTcgKzEyMDEsMTggQEAKIH0KIAogaW50IHJ0X2lvY3RsX3Npd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwl9CiAKIAlpZiAoZGF0YS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTI4NSw0NSArMTIyMCw0NyBAQAogCW1lbXNldChwQWRhcHRlci0+bmlja25hbWUsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CiAJbWVtY3B5KHBBZGFwdGVyLT5uaWNrbmFtZSwgbmlja25hbWUsIGRhdGEtPmxlbmd0aCk7CiAKLQogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfZ2l3bmlja24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKHBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxKQotCQlkYXRhLT5sZW5ndGggPSBzdHJsZW4ocEFkYXB0ZXItPm5pY2tuYW1lKSArIDE7CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKChjaGFyICopcEFkYXB0ZXItPm5pY2tuYW1lKSArIDEpCisJCWRhdGEtPmxlbmd0aCA9IHN0cmxlbigoY2hhciAqKXBBZGFwdGVyLT5uaWNrbmFtZSkgKyAxOwogCWlmIChkYXRhLT5sZW5ndGggPiAwKSB7Ci0JCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGgtMSk7Ci0JCW5pY2tuYW1lW2RhdGEtPmxlbmd0aC0xXSA9ICdcMCc7CisJCW1lbWNweShuaWNrbmFtZSwgcEFkYXB0ZXItPm5pY2tuYW1lLCBkYXRhLT5sZW5ndGggLSAxKTsKKwkJbmlja25hbWVbZGF0YS0+bGVuZ3RoIC0gMV0gPSAnXDAnOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKKwkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAJdTE2IHZhbDsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJaWYgKHJ0cy0+ZGlzYWJsZWQpCiAJCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOwogCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQotCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKKwkJdmFsID0gTUFYX1JUU19USFJFU0hPTEQ7CiAJZWxzZQogCQl2YWwgPSBydHMtPnZhbHVlOwogCkBAIC0xMzM0LDE3ICsxMjcxLDE4IEBACiB9CiAKIGludCBydF9pb2N0bF9naXdydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCisJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICAJaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIAl7Ci0gICAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgCXJldHVybiAtRU5FVERPV047Ci0gICAgCX0KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWRhcHRlciwgZGV2KTsKKworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQogCiAJcnRzLT52YWx1ZSA9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOwogCXJ0cy0+ZGlzYWJsZWQgPSAocnRzLT52YWx1ZSA9PSBNQVhfUlRTX1RIUkVTSE9MRCk7CkBAIC0xMzU0LDI1ICsxMjkyLDI3IEBACiB9CiAKIGludCBydF9pb2N0bF9zaXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAJdTE2IHZhbDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICAJewotICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIAl9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCWlmIChmcmFnLT5kaXNhYmxlZCkKIAkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCAmJiBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCi0JCXZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KKwllbHNlIGlmIChmcmFnLT52YWx1ZSA+PSBNSU5fRlJBR19USFJFU0hPTEQKKwkJICYmIGZyYWctPnZhbHVlIDw9IE1BWF9GUkFHX1RIUkVTSE9MRCkKKwkJdmFsID0gX19jcHVfdG9fbGUxNihmcmFnLT52YWx1ZSAmIH4weDEpOwkvKiBldmVuIG51bWJlcnMgb25seSAqLwogCWVsc2UgaWYgKGZyYWctPnZhbHVlID09IDApCi0JICAgIHZhbCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKwkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEzODEsMTcgKzEzMjEsMTggQEAKIH0KIAogaW50IHJ0X2lvY3RsX2dpd2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWcsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICAJewotICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIAlyZXR1cm4gLUVORVRET1dOOwotICAgIAl9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCWZyYWctPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKIAlmcmFnLT5kaXNhYmxlZCA9IChmcmFnLT52YWx1ZSA9PSBNQVhfRlJBR19USFJFU0hPTEQpOwpAQCAtMTQwMywxNTYgKzEzNDQsMTYxIEBACiAjZGVmaW5lIE1BWF9XRVBfS0VZX1NJWkUgMTMKICNkZWZpbmUgTUlOX1dFUF9LRVlfU0laRSA1CiBpbnQgcnRfaW9jdGxfc2l3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICpleHRyYSkKKwkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIAlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgCXsKLSAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICAJfQorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOwogCi0JaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgotICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCi0JeworCS8qY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CisJfQorCisJaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpIHsKIAkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwogCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotICAgICAgICBnb3RvIGRvbmU7Ci0JfSBlbHNlIGlmICgKLQkJIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgfHwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKSkgeworCQlwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfUkVTVFJJQ1RFRAorCQkgICB8fCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pIHsKKwkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCiAJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwogCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKIAkJcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwogCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CiAJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCiAJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotICAgIAllbHNlCisJCWVsc2UKIAkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwogCX0KIAotICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCi0JeworCWlmIChlcnEtPmxlbmd0aCA+IDApIHsKIAkJaW50IGtleUlkeCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CiAJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KIAkJaWYgKGVycS0+bGVuZ3RoID4gTUFYX1dFUF9LRVlfU0laRSkgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJLyogQ2hlY2sga2V5IGluZGV4ICovCi0JCWlmICgoa2V5SWR4IDwgMCkgfHwgKGtleUlkeCA+PSBOUl9XRVBfS0VZUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V3Jvbmcga2V5SWR4PSVkISBVc2luZyBkZWZhdWx0IGtleSBpbnN0ZWFkICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6Oldyb25nIGtleUlkeD0lZCEgVXNpbmcgZGVmYXVsdCBrZXkgaW5zdGVhZCAoJWQpXG4iLAorCQkJCSAga2V5SWR4LCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwogCi0gICAgICAgICAgICAvL1VzaW5nIGRlZmF1bHQga2V5CisJCQkvKlVzaW5nIGRlZmF1bHQga2V5ICovCiAJCQlrZXlJZHggPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLSAgICAgICAgfQotCQllbHNlCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZD1rZXlJZHg7CisJCX0gZWxzZQorCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBrZXlJZHg7CiAKLSAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgIDE2KTsKKwkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgMTYpOwogCi0JCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKQotICAgICAgICB7Ci0JCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQl9Ci0JCWVsc2UgaWYgKGVycS0+bGVuZ3RoID09IE1JTl9XRVBfS0VZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJfQotCQllbHNlCisJCWlmIChlcnEtPmxlbmd0aCA9PSBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0KKwkJCSAgICBNQVhfV0VQX0tFWV9TSVpFOworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9CisJCQkgICAgQ0lQSEVSX1dFUDEyODsKKwkJfSBlbHNlIGlmIChlcnEtPmxlbmd0aCA9PSBNSU5fV0VQX0tFWV9TSVpFKSB7CisJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0KKwkJCSAgICBNSU5fV0VQX0tFWV9TSVpFOworCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9CisJCQkgICAgQ0lQSEVSX1dFUDY0OworCQl9IGVsc2UKIAkJCS8qIERpc2FibGUgdGhlIGtleSAqLwogCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CiAKIAkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQlpZiAoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgewogCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7Ci0gICAgICAgIH0KLQl9Ci0gICAgZWxzZQotCQkJeworCQkJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwKKwkJCQkgICAgICAgZXh0cmEsIGVycS0+bGVuZ3RoKTsKKwkJfQorCX0gZWxzZSB7CiAJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIHRyYW5zbWl0IGtleSBpbmRleCA/ICovCiAJCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgNCkpCi0gICAgICAgIHsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCA0KSkgewogCQkJcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZQorCQl9IGVsc2UKIAkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCi0JCQlpZiAoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpKSB7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwkJaWYgKCEoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogZG9uZToKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OmVycS0+ZmxhZ3M9JXhcbiIsZXJxLT5mbGFncykpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6QXV0aE1vZGU9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6RGVmYXVsdEtleUlkPSV4LCBLZXlMZW4gPSAlZFxuIixwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCAsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbikpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6V2VwU3RhdHVzPSV4XG4iLHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIiwgZXJxLT5mbGFncykpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OkF1dGhNb2RlPSV4XG4iLAorCQkgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLAorCQkgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkLAorCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkgIEtleUxlbikpOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCI9PT5ydF9pb2N0bF9zaXdlbmNvZGU6OldlcFN0YXR1cz0leFxuIiwKKwkJICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cykpOwogCXJldHVybiAwOwogfQogCiBpbnQKIHJ0X2lvY3RsX2dpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQorCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5KQogewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CiAJaW50IGtpZDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAKLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKIAl9CiAKIAlraWQgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9naXdlbmNvZGUgJWRcbiIsIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOwogCi0JaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQl7CisJaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkgewogCQllcnEtPmxlbmd0aCA9IDA7CiAJCWVycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JfQotCWVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9NCkpCi0JewotCQkvLyBjb3B5IHdlcCBrZXkKLQkJZXJxLT5mbGFncyA9IGtpZCA7CQkJLyogTkI6IGJhc2UgMSAqLwotCQlpZiAoZXJxLT5sZW5ndGggPiBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXlMZW4pCi0JCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbjsKLQkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5LCBlcnEtPmxlbmd0aCk7Ci0JCS8vaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkKLQkJLy9lcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KKwl9IGVsc2UgaWYgKChraWQgPiAwKSAmJiAoa2lkIDw9IDQpKSB7CisJCS8qIGNvcHkgd2VwIGtleSAqLworCQllcnEtPmZsYWdzID0ga2lkOwkvKiBOQjogYmFzZSAxICovCisJCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkIC0gMV0uS2V5TGVuKQorCQkJZXJxLT5sZW5ndGggPSBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZCAtIDFdLktleUxlbjsKKwkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQgLSAxXS5LZXksCisJCSAgICAgICBlcnEtPmxlbmd0aCk7CisJCS8qaWYgKChraWQgPT0gcEFkYXB0ZXItPlBvcnRDZmcuRGVmYXVsdEtleUlkKSkgKi8KKwkJLyplcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOyAqLwkvKiBYWFggKi8KIAkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLworCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJLyogWFhYICovCiAJCWVsc2UKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CS8qIFhYWCAqLwogCi0JfQotCWVsc2UgaWYgKGtpZCA9PSAwKQotCXsKKwl9IGVsc2UgaWYgKGtpZCA9PSAwKSB7CiAJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CS8qIFhYWCAqLwogCQllbHNlCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCi0JCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOwotCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW3BBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIGVycS0+bGVuZ3RoKTsKLQkJLy8gY29weSBkZWZhdWx0IGtleSBJRAorCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJLyogWFhYICovCisJCWVycS0+bGVuZ3RoID0KKwkJICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLgorCQkgICAgS2V5TGVuOworCQltZW1jcHkoa2V5LAorCQkgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uCisJCSAgICAgICBLZXksIGVycS0+bGVuZ3RoKTsKKwkJLyogY29weSBkZWZhdWx0IGtleSBJRCAqLwogCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCisJCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkvKiBYWFggKi8KIAkJZWxzZQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLwotCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkJCS8qIE5COiBiYXNlIDEgKi8KKwkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CS8qIFhYWCAqLworCQllcnEtPmZsYWdzID0gcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQgKyAxOwkvKiBOQjogYmFzZSAxICovCiAJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLwogCX0KIApAQCAtMTU2MCw3NzAgKzE1MDYsNTg1IEBACiAKIH0KIAotc3RhdGljIGludAotcnRfaW9jdGxfc2V0cGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSB2b2lkICp3LCBjaGFyICpleHRyYSkKK3ZvaWQgZ2V0QmFJbmZvKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgY2hhciAqcE91dEJ1ZikKIHsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OwotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZGFwdGVyLT5PU19Db29raWU7Ci0JY2hhciAqdGhpc19jaGFyID0gZXh0cmE7Ci0JY2hhciAqdmFsdWU7Ci0JaW50ICBTdGF0dXM9MDsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgcnRfYmFfb3JpX2VudHJ5ICpwT3JpQkFFbnRyeTsKKwlzdHJ1Y3QgcnRfYmFfcmVjX2VudHJ5ICpwUmVjQkFFbnRyeTsKIAotCXsKLQkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOwotICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOwotCX0KLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICAJewotICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCQlyZXR1cm4gLUVORVRET1dOOwotICAgIAl9Ci0KLQlpZiAoISp0aGlzX2NoYXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKLQkgICAgKnZhbHVlKysgPSAwOwotCi0JaWYgKCF2YWx1ZSkKLQkgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQkvLyByZWplY3Qgc2V0dGluZyBub3RoaW5nIGJlc2lkZXMgQU5ZIHNzaWQoc3NpZExlbj0wKQotICAgIGlmICghKnZhbHVlICYmIChzdHJjbXAodGhpc19jaGFyLCAiU1NJRCIpICE9IDApKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKLQl7Ci0JICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKLQkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAotCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0JICAgICAgICB9Ci0JCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgotCSAgICB9Ci0JfQotCi0JaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQotCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50Ci0JICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKLQl9Ci0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi0KLXN0YXRpYyBpbnQKLXJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQotewotCUlOVAkJCQlTdGF0dXMgPSAwOwotICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7Ci0KLSAgICBpZiAoZXh0cmEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHdycS0+bGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgfQotCi0gICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7Ci0gICAgc3ByaW50ZihleHRyYSwgIlxuXG4iKTsKLQotCXsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOwotCX0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKLQotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOwotCi0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOwotCXsKLSAgICAJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1BICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotICAgICAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUIgKGlmIGF2YWlsYWJsZSkgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0gICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotCX0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJXcGFTdXBwbGljYW50VVAgICAgICAgICAgICAgICAgID0gJWRcblxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKTsKLQotICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCB3cnEtPmxlbmd0aCA9ICVkXG4iLCB3cnEtPmxlbmd0aCkpOwotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotdm9pZAlnZXRCYUluZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcE91dEJ1ZikKLXsKLQlJTlQgaSwgajsKLQlCQV9PUklfRU5UUlkgKnBPcmlCQUVudHJ5OwotCUJBX1JFQ19FTlRSWSAqcFJlY0JBRW50cnk7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJCXx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkKLQkJewotCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLCAiXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAoQWlkID0gJWQpIChBUCkgLVxuIiwKLQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAotCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykgeworCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKKwkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKQorCQkgICAgICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQorCQkgICAgfHwgKHBFbnRyeS0+VmFsaWRBc1dEUykgfHwgKHBFbnRyeS0+VmFsaWRBc01lc2gpKSB7CisJCQlzcHJpbnRmKHBPdXRCdWYgKyBzdHJsZW4ocE91dEJ1ZiksCisJCQkJIlxuJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlggKEFpZCA9ICVkKSAoQVApIC1cbiIsCisJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sCisJCQkJcEVudHJ5LT5BZGRyWzJdLCBwRW50cnktPkFkZHJbM10sCisJCQkJcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0sIHBFbnRyeS0+QWlkKTsKIAogCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNbUmVjaXBpZW50XVxuIiwgcE91dEJ1Zik7Ci0JCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKLQkJCXsKLQkJCQlpZiAocEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXSAhPSAwKQotCQkJCXsKLQkJCQkJcFJlY0JBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtwRW50cnktPkJBUmVjV2NpZEFycmF5W2pdXTsKLQkJCQkJc3ByaW50ZihwT3V0QnVmICsgc3RybGVuKHBPdXRCdWYpLCAiVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLCBqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLCBwUmVjQkFFbnRyeS0+TGFzdEluZFNlcSwgcFJlY0JBRW50cnktPmxpc3QucWxlbik7CisJCQlmb3IgKGogPSAwOyBqIDwgTlVNX09GX1RJRDsgaisrKSB7CisJCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkgeworCQkJCQlwUmVjQkFFbnRyeSA9CisJCQkJCSAgICAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT4KKwkJCQkJCQkJICAgICBCQVJlY1djaWRBcnJheQorCQkJCQkJCQkgICAgIFtqXV07CisJCQkJCXNwcmludGYocE91dEJ1ZiArIHN0cmxlbihwT3V0QnVmKSwKKwkJCQkJCSJUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgTGFzdEluZFNlcT0lZCwgUmVvcmRlcmluZ1BrdHM9JWRcbiIsCisJCQkJCQlqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLAorCQkJCQkJcFJlY0JBRW50cnktPkxhc3RJbmRTZXEsCisJCQkJCQlwUmVjQkFFbnRyeS0+bGlzdC5xbGVuKTsKIAkJCQl9CiAJCQl9CiAJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuIiwgcE91dEJ1Zik7CiAKIAkJCXNwcmludGYocE91dEJ1ZiwgIiVzW09yaWdpbmF0b3JdXG4iLCBwT3V0QnVmKTsKLQkJCWZvciAoaj0wOyBqIDwgTlVNX09GX1RJRDsgaisrKQotCQkJewotCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApCi0JCQkJewotCQkJCQlwT3JpQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+QkFPcmlXY2lkQXJyYXlbal1dOwotCQkJCQlzcHJpbnRmKHBPdXRCdWYgKyBzdHJsZW4ocE91dEJ1ZiksICJUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgU3RhcnRTZXE9JWQsIEN1clR4U2VxPSVkXG4iLCBqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLCBwT3JpQkFFbnRyeS0+U2VxdWVuY2UsIHBFbnRyeS0+VHhTZXFbal0pOworCQkJZm9yIChqID0gMDsgaiA8IE5VTV9PRl9USUQ7IGorKykgeworCQkJCWlmIChwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdICE9IDApIHsKKwkJCQkJcE9yaUJBRW50cnkgPQorCQkJCQkgICAgJnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W3BFbnRyeS0+CisJCQkJCQkJCSAgICAgQkFPcmlXY2lkQXJyYXkKKwkJCQkJCQkJICAgICBbal1dOworCQkJCQlzcHJpbnRmKHBPdXRCdWYgKyBzdHJsZW4ocE91dEJ1ZiksCisJCQkJCQkiVElEPSVkLCBCQVdpblNpemU9JWQsIFN0YXJ0U2VxPSVkLCBDdXJUeFNlcT0lZFxuIiwKKwkJCQkJCWosIHBPcmlCQUVudHJ5LT5CQVdpblNpemUsCisJCQkJCQlwT3JpQkFFbnRyeS0+U2VxdWVuY2UsCisJCQkJCQlwRW50cnktPlR4U2VxW2pdKTsKIAkJCQl9CiAJCQl9CiAJCQlzcHJpbnRmKHBPdXRCdWYsICIlc1xuXG4iLCBwT3V0QnVmKTsKIAkJfQotICAgICAgICBpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQotICAgICAgICAgICAgICAgIGJyZWFrOworCQlpZiAoc3RybGVuKHBPdXRCdWYpID4gKElXX1BSSVZfU0laRV9NQVNLIC0gMzApKQorCQkJYnJlYWs7CiAJfQogCiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW50Ci1ydF9wcml2YXRlX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQotewotICAgIElOVAkJCQlTdGF0dXMgPSAwOwotICAgIFBSVE1QX0FEQVBURVIgcEFkID0gZGV2LT5tbF9wcml2OwotICAgIFBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLSAgICB1MzIgICAgICAgICAgICAgc3ViY21kID0gd3JxLT5mbGFnczsKLQotICAgIGlmIChleHRyYSA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgd3JxLT5sZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICB9Ci0gICAgbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7Ci0KLQl7Ci0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLSAgICAgICAgcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLSAgICBzd2l0Y2goc3ViY21kKQotICAgIHsKLQotICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQotICAgICAgICAgICAgCXsKLSAgICAgICAgICAgIAkgICAgaWYgKElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkNvbm5lY3RlZChBUDogJXNbJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhdKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNV0pOwotICAgICAgICAgICAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJDb25uZWN0ZWRcbiIpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIAllbHNlCi0gICAgICAgICAgICAJewotICAgICAgICAgICAgCSAgICBzcHJpbnRmKGV4dHJhLCAiRGlzY29ubmVjdGVkXG4iKTsKLSAgICAgICAgICAgIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSE9XX0RSVklFUl9WRVJJT046Ci0gICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiRHJpdmVyIHZlcnNpb24tJXMsICVzICVzXG4iLCBTVEFfRFJJVkVSX1ZFUlNJT04sIF9fREFURV9fLCBfX1RJTUVfXyApOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSE9XX0JBX0lORk86Ci0gICAgICAgICAgICBnZXRCYUluZm8ocEFkLCBleHRyYSk7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIFNIT1dfREVTQ19JTkZPOgotCQkJewotCQkJCVNob3dfRGVzY0luZm9fUHJvYyhwQWQsIE5VTEwpOwotCQkJCXdycS0+bGVuZ3RoID0gMDsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQl9Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSQUlPX09GRjoKLSAgICAgICAgICAgIGlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJTY2FubmluZ1xuIik7Ci0gICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyAhPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09mZihwQWQpOwotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBTV19SQURJT19PRkY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9mZlxuIik7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBSU9fT046Ci0jaWZkZWYgUlQyODcwCi0gICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiU2Nhbm5pbmdcbiIpOwotICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBwQWQtPlN0YUNmZy5iU3dSYWRpbyA9IFRSVUU7Ci0gICAgICAgICAgICAvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVSYWRpb09uKHBBZCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIlJhZGlvIE9uXG4iKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSBTSE9XX0NGR19WQUxVRToKLQkJCXsKLQkJCQlTdGF0dXMgPSBSVE1QU2hvd0NmZ1ZhbHVlKHBBZCwgd3JxLT5wb2ludGVyLCBleHRyYSk7Ci0JCQkJaWYgKFN0YXR1cyA9PSAwKQotCQkJCQl3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCX0KLQkJCWJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSB1bmtub3cgc3ViY21kID0gJWRcbiIsIF9fZnVuY19fLCBzdWJjbWQpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0KIGludCBydF9pb2N0bF9zaXdtbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKLQkJCSAgIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOwogCXN0cnVjdCBpd19tbG1lICpwTWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKXdycXUtPmRhdGEucG9pbnRlcjsKLQlNTE1FX1FVRVVFX0VMRU0JCQkJTXNnRWxlbTsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzQXNzb2NSZXE7Ci0JTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCAgICAgIERlQXV0aFJlcTsKKwlzdHJ1Y3QgcnRfbWxtZV9xdWV1ZV9lbGVtIE1zZ0VsZW07CisJc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxIERpc0Fzc29jUmVxOworCXN0cnVjdCBydF9tbG1lX2RlYXV0aF9yZXEgRGVBdXRoUmVxOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOwogCiAJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXNcbiIsIF9fZnVuY19fKSk7CiAKIAlpZiAocE1sbWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzd2l0Y2gocE1sbWUtPmNtZCkKLQl7CisJc3dpdGNoIChwTWxtZS0+Y21kKSB7CiAjaWZkZWYgSVdfTUxNRV9ERUFVVEgKLQkJY2FzZSBJV19NTE1FX0RFQVVUSDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fZnVuY19fKSk7Ci0JCQlDT1BZX01BQ19BRERSKERlQXV0aFJlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOwotCQkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRlQXV0aFJlcSwgc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKTsKLQkJCU1sbWVEZWF1dGhSZXFBY3Rpb24ocEFkLCAmTXNnRWxlbSk7Ci0JCQlpZiAoSU5GUkFfT04ocEFkKSkKLQkJCXsKLQkJCSAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLQkJCSAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBJV19NTE1FX0RFQVVUSCAvLworCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PT4gJXMgLSBJV19NTE1FX0RFQVVUSFxuIiwgX19mdW5jX18pKTsKKwkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOworCQlEZUF1dGhSZXEuUmVhc29uID0gcE1sbWUtPnJlYXNvbl9jb2RlOworCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihzdHJ1Y3QgcnRfbWxtZV9kZWF1dGhfcmVxKTsKKwkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9tbG1lX2RlYXV0aF9yZXEpKTsKKwkJTWxtZURlYXV0aFJlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKKwkJaWYgKElORlJBX09OKHBBZCkpIHsKKwkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOworCQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIElXX01MTUVfREVBVVRIIC8vICovCiAjaWZkZWYgSVdfTUxNRV9ESVNBU1NPQwotCQljYXNlIElXX01MTUVfRElTQVNTT0M6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlcyAtIElXX01MTUVfRElTQVNTT0NcbiIsIF9fZnVuY19fKSk7Ci0JCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7CisJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19mdW5jX18pKTsKKwkJQ09QWV9NQUNfQUREUihEaXNBc3NvY1JlcS5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CisJCURpc0Fzc29jUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKIAotCQkJTXNnRWxlbS5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCU1zZ0VsZW0uTXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKLQkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCk7Ci0JCQlOZGlzTW92ZU1lbW9yeShNc2dFbGVtLk1zZywgJkRpc0Fzc29jUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7CisJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7CisJCU1zZ0VsZW0uTXNnVHlwZSA9IE1UMl9NTE1FX0RJU0FTU09DX1JFUTsKKwkJTXNnRWxlbS5Nc2dMZW4gPSBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKTsKKwkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X21sbWVfZGlzYXNzb2NfcmVxKSk7CiAKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOwotCQkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOwotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gSVdfTUxNRV9ESVNBU1NPQyAvLwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gJXMgLSBVbmtub3cgQ29tbWFuZFxuIiwgX19mdW5jX18pKTsKLQkJCWJyZWFrOworCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKKwkJTWxtZURpc2Fzc29jUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOworCQlicmVhazsKKyNlbmRpZiAvKiBJV19NTE1FX0RJU0FTU09DIC8vICovCisJZGVmYXVsdDoKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI9PT09PiAlcyAtIFVua25vdyBDb21tYW5kXG4iLCBfX2Z1bmNfXykpOworCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX3Npd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkYXB0ZXIgPSBOVUxMOwogCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07CiAKLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKIAl9CiAJc3dpdGNoIChwYXJhbS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7Ci0gICAgCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLQkJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOworCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKKwkJaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQorCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPQorCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQTIpCisJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKIAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAotICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfVEtJUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9DQ01QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfTk9ORSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8Ci0gICAgICAgICAgICAgICAgICAgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFdFUCAxeAotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gMCkKLSAgICAgICAgICAgIHsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0tFWV9NR01UIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgIT0gMCkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQkJZWxzZQotCQkJewotCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkJfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKLSAgICAJCWJyZWFrOwotICAgIAljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKLSAgICAgICAgICAgIHsKLQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotCQkJfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pCi0gICAgICAgICAgICB7Ci0JCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF84MDIxMV9BVVRIX0FMRyAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOwotCQkJYnJlYWs7Ci0gICAgCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLSAgICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLCBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgCQlicmVhazsKLSAgICAJZGVmYXVsdDoKLSAgICAJCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9XUEFfVkVSU0lPTiAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwKKwkJCSAgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorCQlpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOworCQkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0KKwkJCSAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKKwkJCSAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPQorCQkJICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9CisJCQkgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOworCQkJcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0KKwkJCSAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9CisJCQkgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKKwkJfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwKKwkJCSAgX19mdW5jX18sIHBhcmFtLT52YWx1ZSkpOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCQlpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX05PTkUpIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDQwIHx8CisJCQkgICBwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQMTA0KSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7CisJCX0gZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApIHsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPQorCQkJICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7CisJCX0KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9DSVBIRVJfR1JPVVAgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorCQlpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfS0VZX01HTVRfODAyXzFYKSB7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgeworCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPQorCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEE7CisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBGQUxTRTsKKwkJCX0gZWxzZSBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PQorCQkJCSAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0KKwkJCQkgICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOworCQkJfSBlbHNlCisJCQkJLyogV0VQIDF4ICovCisJCQkJcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOworCQl9IGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKSB7CisJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorCQlicmVhazsKKwljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorCQkvKmlmIChwYXJhbS0+dmFsdWUgPT0gMCkKKwkJICAgeworCQkgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKKwkJICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCSAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOworCQkgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCSAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7CisJCSAgIH0gKi8KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCIlczo6SVdfQVVUSF9QUklWQUNZX0lOVk9LRUQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisJCWlmIChwYXJhbS0+dmFsdWUgIT0gMCkKKwkJCXBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPQorCQkJICAgIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKKwkJZWxzZSB7CisJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KKwkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQl9CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCQlpZiAocGFyYW0tPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZDsKKwkJfSBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkgeworCQkJcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OklXX0FVVEhfODAyMTFfQVVUSF9BTEcgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsCisJCQkgIF9fZnVuY19fLCBwYXJhbS0+dmFsdWUpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIiVzOjpJV19BVVRIX1dQQV9FTkFCTEVEIC0gRHJpdmVyIHN1cHBvcnRzIFdQQSEocGFyYW0tPnZhbHVlID0gJWQpXG4iLAorCQkJICBfX2Z1bmNfXywgcGFyYW0tPnZhbHVlKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IHJ0X2lvY3RsX2dpd2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyID0gTlVMTDsKIAlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gJndycXUtPnBhcmFtOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAJcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkYXB0ZXIsIGRldik7CisKKwkvKmNoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KIAogCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgewogCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgotICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSA/IDAgOiAxOworCQlwYXJhbS0+dmFsdWUgPQorCQkgICAgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09CisJCSAgICAgTmRpczgwMl8xMVdFUERpc2FibGVkKSA/IDAgOiAxOwogCQlicmVhazsKIAogCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLSAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSA/IElXX0FVVEhfQUxHX1NIQVJFRF9LRVkgOiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKwkJcGFyYW0tPnZhbHVlID0KKwkJICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09CisJCSAgICAgTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSA/IElXX0FVVEhfQUxHX1NIQVJFRF9LRVkgOgorCQkgICAgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CiAJCWJyZWFrOwogCiAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgotCQlwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpID8gMSA6IDA7CisJCXBhcmFtLT52YWx1ZSA9CisJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PQorCQkgICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgPyAxIDogMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX2dpd2F1dGg6OnBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgcGFyYW0tPnZhbHVlKSk7CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCSAoInJ0X2lvY3RsX2dpd2F1dGg6OnBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgcGFyYW0tPnZhbHVlKSk7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZm5TZXRDaXBoZXJLZXkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgSU5UICAgICAgICAgICAgIGtleUlkeCwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIENpcGhlckFsZywKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgIGJHVEssCi0gICAgSU4gIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQpCit2b2lkIGZuU2V0Q2lwaGVyS2V5KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZGFwdGVyLAorCQkgICAgaW50IGtleUlkeCwKKwkJICAgIHU4IENpcGhlckFsZywKKwkJICAgIElOIEJPT0xFQU4gYkdUSywgSU4gc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCkKIHsKLSNpZmRlZiBSVDI4NjAKLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWRhcHRlciwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQlpZiAoUlRNUF9URVNUX1BTRkxBRyhwQWRhcHRlciwgZlJUTVBfUFNfU0VUX1BDSV9DTEtfT0ZGX0NPTU1BTkQpKQotCXsKLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQl7Ci0JCQlSVE1QX1NFVF9QU0ZMQUcocEFkYXB0ZXIsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBQWRkS2V5UHJvYzE9PT5cbiIpKTsKLQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWRhcHRlciwgUkVTVE9SRV9IQUxUKTsKLQkJUlRNUHVzZWNEZWxheSg2MDAwKTsKLQkJcEFkYXB0ZXItPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQl9Ci0jZW5kaWYKLSAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBleHQtPmtleSwgTEVOX1RLSVBfRUspOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5UeE1pYywgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKKwlOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2Yoc3RydWN0IHJ0X2NpcGhlcl9rZXkpKTsKKwlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7CisJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksCisJCSAgICAgICBMRU5fVEtJUF9FSyk7CisJTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlR4TWljLAorCQkgICAgICAgZXh0LT5rZXkgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKKwlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMsCisJCSAgICAgICBleHQtPmtleSArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLAorCQkgICAgICAgTEVOX1RLSVBfUlhNSUNLKTsKKwlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwogCi0gICAgLy8gVXBkYXRlIGdyb3VwIGtleSBpbmZvcm1hdGlvbiB0byBBU0lDIFNoYXJlZCBLZXkgVGFibGUKKwkvKiBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZSAqLwogCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAga2V5SWR4LAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsCi0JCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYyk7CisJCQkgICAgICBCU1MwLAorCQkJICAgICAga2V5SWR4LAorCQkJICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywKKwkJCSAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksCisJCQkgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsCisJCQkgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uUnhNaWMpOwogCi0gICAgaWYgKGJHVEspCi0gICAgICAgIC8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotICAgIAlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAotICAgIAkJCQkJCQkgIEJTUzAsCi0gICAgCQkJCQkJCSAga2V5SWR4LAotICAgIAkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCi0gICAgCQkJCQkJCSAgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLSAgICAJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKLSAgICAJCQkJCQkJICBCU1MwLAotICAgIAkJCQkJCQkgIGtleUlkeCwKLSAgICAJCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotICAgIAkJCQkJCQkgICZwQWRhcHRlci0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0pOwotI2lmZGVmIFJUMjg2MAotCVJUTVBfU0VUX1BTRkxBRyhwQWRhcHRlciwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNlbmRpZgorCWlmIChiR1RLKQorCQkvKiBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgKi8KKwkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKKwkJCQkJICBCU1MwLAorCQkJCQkgIGtleUlkeCwKKwkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uCisJCQkJCSAgQ2lwaGVyQWxnLCBOVUxMKTsKKwllbHNlCisJCS8qIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSAqLworCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAorCQkJCQkgIEJTUzAsCisJCQkJCSAga2V5SWR4LAorCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS4KKwkJCQkJICBDaXBoZXJBbGcsCisJCQkJCSAgJnBBZGFwdGVyLT5NYWNUYWIuCisJCQkJCSAgQ29udGVudFtCU1NJRF9XQ0lEXSk7CiB9CiAKIGludCBydF9pb2N0bF9zaXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCi0JCQl7Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyID0gZGV2LT5tbF9wcml2OworCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciA9IE5VTEw7CiAJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKIAlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7Ci0gICAgaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CisJaW50IGtleUlkeCwgYWxnID0gZXh0LT5hbGc7CiAKLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0gIAkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgIAlyZXR1cm4gLUVORVRET1dOOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZGFwdGVyLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKIAl9CiAKLSAgICBpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQotCXsKLSAgICAgICAga2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotICAgICAgICAvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCi0JICAgIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKLSAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7CisJaWYgKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCS8qIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUgKi8KKwkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIEJTU0lEX1dDSUQpOworCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gMDsKIAkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIDAsIChVQ0hBUilrZXlJZHgpOwotICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6UmVtb3ZlIGFsbCBrZXlzIShlbmNvZGluZy0+ZmxhZ3MgPSAleClcbiIsIF9fZnVuY19fLCBlbmNvZGluZy0+ZmxhZ3MpKTsKLSAgICB9Ci0JCQkJCWVsc2UKLSAgICB7Ci0gICAgICAgIC8vIEdldCBLZXkgSW5kZXggYW5kIGNvbnZldCB0byBvdXIgb3duIGRlZmluZWQga2V5IGluZGV4Ci0gICAgCWtleUlkeCA9IChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLSAgICAJaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQotICAgIAkJcmV0dXJuIC1FSU5WQUw7CisJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgMCwgKHU4KWtleUlkeCk7CisJCU5kaXNaZXJvTWVtb3J5KCZwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0sCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9jaXBoZXJfa2V5KSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLAorCQkJICBfX2Z1bmNfXywgZW5jb2RpbmctPmZsYWdzKSk7CisJfSBlbHNlIHsKKwkJLyogR2V0IEtleSBJbmRleCBhbmQgY29udmV0IHRvIG91ciBvd24gZGVmaW5lZCBrZXkgaW5kZXggKi8KKwkJa2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCQlpZiAoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0gICAgICAgIH0KKwkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CisJCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGtleUlkeDsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzOjpEZWZhdWx0S2V5SWQgPSAlZFxuIiwgX19mdW5jX18sCisJCQkJICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOworCQl9CiAKLSAgICAgICAgc3dpdGNoIChhbGcpIHsKLSAgICAJCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fZnVuY19fKSk7Ci0gICAgCQkJYnJlYWs7Ci0gICAgCQljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1dFUCAtIGV4dC0+a2V5X2xlbiA9ICVkLCBrZXlJZHggPSAlZFxuIiwgX19mdW5jX18sIGV4dC0+a2V5X2xlbiwga2V5SWR4KSk7Ci0gICAgCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1BWF9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCQkJCX0KLSAgICAgICAgCQllbHNlIGlmIChleHQtPmtleV9sZW4gPT0gTUlOX1dFUF9LRVlfU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNSU5fV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OworCQlzd2l0Y2ggKGFsZykgeworCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzOjpJV19FTkNPREVfQUxHX05PTkVcbiIsIF9fZnVuY19fKSk7CisJCQlicmVhazsKKwkJY2FzZSBJV19FTkNPREVfQUxHX1dFUDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzOjpJV19FTkNPREVfQUxHX1dFUCAtIGV4dC0+a2V5X2xlbiA9ICVkLCBrZXlJZHggPSAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBleHQtPmtleV9sZW4sIGtleUlkeCkpOworCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKSB7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9CisJCQkJICAgIE1BWF9XRVBfS0VZX1NJWkU7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9CisJCQkJICAgIENJUEhFUl9XRVAxMjg7CisJCQl9IGVsc2UgaWYgKGV4dC0+a2V5X2xlbiA9PSBNSU5fV0VQX0tFWV9TSVpFKSB7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9CisJCQkJICAgIE1JTl9XRVBfS0VZX1NJWkU7CisJCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9CisJCQkJICAgIENJUEhFUl9XRVA2NDsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAorCQkJCSAgICAgICAxNik7CisJCQlOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAorCQkJCSAgICAgICBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKwkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09CisJCQkgICAgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkCisJCQkgICAgfHwgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9PQorCQkJICAgIE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpIHsKKwkJCQkvKiBTZXQgR3JvdXAga2V5IG1hdGVyaWFsIHRvIEFzaWMgKi8KKwkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwKKwkJCQkJCSAgICAgIHBBZGFwdGVyLT4KKwkJCQkJCSAgICAgIFNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLgorCQkJCQkJICAgICAgQ2lwaGVyQWxnLAorCQkJCQkJICAgICAgcEFkYXB0ZXItPgorCQkJCQkJICAgICAgU2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uCisJCQkJCQkgICAgICBLZXksIE5VTEwsIE5VTEwpOworCisJCQkJLyogVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUgKi8KKwkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLAorCQkJCQkJCSAga2V5SWR4LAorCQkJCQkJCSAgcEFkYXB0ZXItPgorCQkJCQkJCSAgU2hhcmVkS2V5W0JTUzBdCisJCQkJCQkJICBba2V5SWR4XS5DaXBoZXJBbGcsCisJCQkJCQkJICBOVUxMKTsKKworCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCisJCQkJLyogSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkgKi8KKwkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQl9Ci0gICAgICAgIAkJZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7Ci0JCQkgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7Ci0JCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkIHx8Ci0JCQkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKKwkJCWJyZWFrOworCQljYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIiVzOjpJV19FTkNPREVfQUxHX1RLSVAgLSBrZXlJZHggPSAlZCwgZXh0LT5rZXlfbGVuID0gJWRcbiIsCisJCQkJICBfX2Z1bmNfXywga2V5SWR4LCBleHQtPmtleV9sZW4pKTsKKwkJCWlmIChleHQtPmtleV9sZW4gPT0gMzIpIHsKKwkJCQlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpIHsKKwkJCQkJZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwKKwkJCQkJCSAgICAgICBDSVBIRVJfVEtJUCwgRkFMU0UsIGV4dCk7CisJCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49CisJCQkJCSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB7CisJCQkJCQkvKnBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgKi8KKwkJCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOworCQkJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGV4dC0+CisJCQkJCSAgIGV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQogCQkJCXsKLQkJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCi0JCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwgQlNTMCwga2V5SWR4LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCBOVUxMLCBOVUxMKTsKKwkJCQkJZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwKKwkJCQkJCSAgICAgICBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKIAotCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBrZXlJZHgsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsIE5VTEwpOwotCisJCQkJCS8qIHNldCA4MDIuMXggcG9ydCBjb250cm9sICovCisJCQkJCS8qcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLwogCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQotICAgIAkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgIAkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQkJCXBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPQorCQkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CiAJCQkJfQotICAgIAkJCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0VOQ09ERV9BTEdfVEtJUCAtIGtleUlkeCA9ICVkLCBleHQtPmtleV9sZW4gPSAlZFxuIiwgX19mdW5jX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCX0gZWxzZQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorCQkJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7CisJCQkJZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywKKwkJCQkJICAgICAgIEZBTFNFLCBleHQpOworCQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49CisJCQkJICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCisJCQkJCS8qcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOyAqLworCQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKKwkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0KKwkJCQkgICAgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7CisJCQl9IGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpIHsKKwkJCQlmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLAorCQkJCQkgICAgICAgVFJVRSwgZXh0KTsKKworCQkJCS8qIHNldCA4MDIuMXggcG9ydCBjb250cm9sICovCisJCQkJLypwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7ICovCisJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7CisJCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9CisJCQkJICAgIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfVEtJUCwgVFJVRSwgZXh0KTsKKwl9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCi0gICAgICAgICAgICAJICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6Ci0gICAgICAgICAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQotCQl7Ci0gICAgICAgICAgICAgICAgICAgIGZuU2V0Q2lwaGVyS2V5KHBBZGFwdGVyLCBrZXlJZHgsIENJUEhFUl9BRVMsIEZBTFNFLCBleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotICAgICAgICAgICAgICAgICAgICAJU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmblNldENpcGhlcktleShwQWRhcHRlciwga2V5SWR4LCBDSVBIRVJfQUVTLCBUUlVFLCBleHQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCi0gICAgICAgIAkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAJCWRlZmF1bHQ6Ci0gICAgCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogaW50CiBydF9pb2N0bF9naXdlbmNvZGVleHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgcEFkID0gZGV2LT5tbF9wcml2OwotCVBDSEFSIHBLZXkgPSBOVUxMOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IE5VTEw7CisJY2hhciAqcEtleSA9IE5VTEw7CiAJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKIAlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CiAJaW50IGlkeCwgbWF4X2tleV9sZW47CiAKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOworCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0XG4iKSk7CiAKIAltYXhfa2V5X2xlbiA9IGVuY29kaW5nLT5sZW5ndGggLSBzaXplb2YoKmV4dCk7CiAJaWYgKG1heF9rZXlfbGVuIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7Ci0JaWYgKGlkeCkKLQl7CisJaWYgKGlkeCkgewogCQlpZiAoaWR4IDwgMSB8fCBpZHggPiA0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlkeC0tOwogCiAJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKLQkJCXsKKwkJICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKKwkJCWlmIChpZHggIT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKSB7CiAJCQkJZXh0LT5rZXlfbGVuID0gMDsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQotCX0KLQllbHNlCisJfSBlbHNlCiAJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKIAogCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CiAJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKIAogCWV4dC0+a2V5X2xlbiA9IDA7Ci0Jc3dpdGNoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykgewotCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKLQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOwotCQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQkJCWJyZWFrOwotCQljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1dFUDsKLQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IG1heF9rZXlfbGVuKQotCQkJCXJldHVybiAtRTJCSUc7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47Ci0JCQkJcEtleSA9ICYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLQkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOwotCQkJZWxzZQotCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCXN3aXRjaCAocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSB7CisJY2FzZSBOZGlzODAyXzExV0VQRGlzYWJsZWQ6CisJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOworCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIE5kaXM4MDJfMTFXRVBFbmFibGVkOgorCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQlpZiAocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW4gPiBtYXhfa2V5X2xlbikKKwkJCXJldHVybiAtRTJCSUc7CisJCWVsc2UgeworCQkJZXh0LT5rZXlfbGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlMZW47CisJCQlwS2V5ID0gKGNoYXIgKikmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleVswXSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgorCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKKwkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7CisJCWVsc2UKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOwogCi0JCQlpZiAobWF4X2tleV9sZW4gPCAzMikKLQkJCQlyZXR1cm4gLUUyQklHOwotCQkJZWxzZQotCQkJewotCQkJCWV4dC0+a2V5X2xlbiA9IDMyOwotCQkJCXBLZXkgPSAmcEFkLT5TdGFDZmcuUE1LWzBdOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG1heF9rZXlfbGVuIDwgMzIpCisJCQlyZXR1cm4gLUUyQklHOworCQllbHNlIHsKKwkJCWV4dC0+a2V5X2xlbiA9IDMyOworCQkJcEtleSA9IChjaGFyICopJiBwQWQtPlN0YUNmZy5QTUtbMF07CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQotCXsKKwlpZiAoZXh0LT5rZXlfbGVuICYmIHBLZXkpIHsKIAkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwogCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7CiAJfQpAQCAtMjMzMiwyMiArMjA5MywyNSBAQAogfQogCiBpbnQgcnRfaW9jdGxfc2l3Z2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAorCUdFVF9QQURfRlJPTV9ORVRfREVWKHBBZCwgZGV2KTsKKworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnRfaW9jdGxfc2l3Z2VuaWVcbiIpKTsKKwlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gRkFMU0U7CiAJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gTUFYX0xFTl9PRl9SU05JRSB8fAogCSAgICAod3JxdS0+ZGF0YS5sZW5ndGggJiYgZXh0cmEgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHdycXUtPmRhdGEubGVuZ3RoKQotCXsKKwlpZiAod3JxdS0+ZGF0YS5sZW5ndGgpIHsKIAkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gd3JxdS0+ZGF0YS5sZW5ndGg7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIGV4dHJhLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCX0KLQllbHNlCi0JeworCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwKKwkJCSAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCQlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gVFJVRTsKKwl9IGVsc2UgewogCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOwogCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKIAl9CkBAIC0yMzU2LDE4MiArMjEyMCwyMTMgQEAKIH0KIAogaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOwogCiAJaWYgKChwQWQtPlN0YUNmZy5SU05JRV9MZW4gPT0gMCkgfHwKLQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQl7CisJICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpIHsKIAkJd3JxdS0+ZGF0YS5sZW5ndGggPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKLQl7Ci0JaWYgKHdycXUtPmRhdGEubGVuZ3RoIDwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKQotCQlyZXR1cm4gLUUyQklHOworCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFKSB7CisJCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKKwkJCXJldHVybiAtRTJCSUc7CiAKLQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQltZW1jcHkoZXh0cmEsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0JfQotCWVsc2UKLQl7Ci0JCVVDSEFSIFJTTkllID0gSUVfV1BBOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKKwkJbWVtY3B5KGV4dHJhLCAmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOworCX0gZWxzZSB7CisJCXU4IFJTTkllID0gSUVfV1BBOwogCi0JCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IChwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyKSkgLy8gSUQsIExlbgorCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpCS8qIElELCBMZW4gKi8KIAkJCXJldHVybiAtRTJCSUc7CiAJCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKIAogCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCisJCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCiAJCQlSU05JZSA9IElFX1JTTjsKIAogCQlleHRyYVswXSA9IChjaGFyKVJTTkllOwogCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7CisJCW1lbWNweShleHRyYSArIDIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sCisJCSAgICAgICBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwogCX0KIAogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3cG1rc2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAotCQkJICAgY2hhciAqZXh0cmEpCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCVBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKIAlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7Ci0JSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisJaW50IENhY2hlZElkeCA9IDAsIGlkeCA9IDA7CisKKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIGRldik7CiAKIAlpZiAocFBta3NhID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOwotCXN3aXRjaChwUG1rc2EtPmNtZCkKLQl7Ci0JCWNhc2UgSVdfUE1LU0FfRkxVU0g6Ci0JCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX1BNS1NBX1JFTU9WRToKLQkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQotCQkJewotCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECi0JCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCi0JCSAgICAgICAgewotCQkgICAgICAgIAlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBNQUNfQUREUl9MRU4pOwotCQkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lELCAxNik7Ci0JCQkJCWZvciAoaWR4ID0gQ2FjaGVkSWR4OyBpZHggPCAocEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0gLSAxKTsgaWR4KyspCi0JCQkJCXsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHhdLkJTU0lEWzBdLCAmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4KzFdLkJTU0lEWzBdLCBNQUNfQUREUl9MRU4pOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uUE1LSURbMF0sIDE2KTsKLQkJCQkJfQotCQkJCQlwQWQtPlN0YUNmZy5TYXZlZFBNS051bS0tOwotCQkJICAgICAgICBicmVhazsKLQkJICAgICAgICB9Ci0JICAgICAgICB9CisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOworCXN3aXRjaCAocFBta3NhLT5jbWQpIHsKKwljYXNlIElXX1BNS1NBX0ZMVVNIOgorCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X2Jzc2lkX2luZm8pICogUE1LSURfTk8pOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBJV19QTUtTQV9SRU1PVkU6CisJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07CisJCSAgICAgQ2FjaGVkSWR4KyspIHsKKwkJCS8qIGNvbXBhcmUgdGhlIEJTU0lEICovCisJCQlpZiAoTmRpc0VxdWFsTWVtb3J5CisJCQkgICAgKHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwKKwkJCSAgICAgcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRCwKKwkJCSAgICAgTUFDX0FERFJfTEVOKSkgeworCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJCSAgICAgICBCU1NJRCwgTUFDX0FERFJfTEVOKTsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLgorCQkJCQkgICAgICAgUE1LSUQsIDE2KTsKKwkJCQlmb3IgKGlkeCA9IENhY2hlZElkeDsKKwkJCQkgICAgIGlkeCA8IChwQWQtPlN0YUNmZy5TYXZlZFBNS051bSAtIDEpOworCQkJCSAgICAgaWR4KyspIHsKKwkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgIFNhdmVkUE1LW2lkeF0uQlNTSURbMF0sCisJCQkJCQkgICAgICAgJnBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICAgIFNhdmVkUE1LW2lkeCArCisJCQkJCQkJCTFdLkJTU0lEWzBdLAorCQkJCQkJICAgICAgIE1BQ19BRERSX0xFTik7CisJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHhdLlBNS0lEWzBdLAorCQkJCQkJICAgICAgICZwQWQtPlN0YUNmZy4KKwkJCQkJCSAgICAgICBTYXZlZFBNS1tpZHggKworCQkJCQkJCQkxXS5QTUtJRFswXSwKKwkJCQkJCSAgICAgICAxNik7CisJCQkJfQorCQkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtLS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9SRU1PVkVcbiIpKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX1BNS1NBX0FERDoKLQkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQotCQkJewotCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECi0JCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCi0JCQkgICAgICAgIGJyZWFrOwotCSAgICAgICAgfQorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfUkVNT1ZFXG4iKSk7CisJCWJyZWFrOworCWNhc2UgSVdfUE1LU0FfQUREOgorCQlmb3IgKENhY2hlZElkeCA9IDA7IENhY2hlZElkeCA8IHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtOworCQkgICAgIENhY2hlZElkeCsrKSB7CisJCQkvKiBjb21wYXJlIHRoZSBCU1NJRCAqLworCQkJaWYgKE5kaXNFcXVhbE1lbW9yeQorCQkJICAgIChwUG1rc2EtPmJzc2lkLnNhX2RhdGEsCisJCQkgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsCisJCQkgICAgIE1BQ19BRERSX0xFTikpCisJCQkJYnJlYWs7CisJCX0KIAotCSAgICAgICAgLy8gRm91bmQsIHJlcGxhY2UgaXQKLQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKLQkgICAgICAgIHsKLQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIFBNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSURbMF0sIHBQbWtzYS0+YnNzaWQuc2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5QTUtJRFswXSwgcFBta3NhLT5wbWtpZCwgMTYpOwotCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7Ci0JICAgICAgICB9Ci0JICAgICAgICAvLyBOb3QgZm91bmQsIHJlcGxhY2UgdGhlIGxhc3Qgb25lCi0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JCSAgICAgICAgLy8gUmFuZG9tbHkgcmVwbGFjZSBvbmUKLQkJICAgICAgICBDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOwotCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKLQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7Ci0JICAgICAgICB9CisJCS8qIEZvdW5kLCByZXBsYWNlIGl0ICovCisJCWlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykgeworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJICAgICAgIEJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsCisJCQkJICAgICAgIE1BQ19BRERSX0xFTik7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS4KKwkJCQkgICAgICAgUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7CisJCX0KKwkJLyogTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZSAqLworCQllbHNlIHsKKwkJCS8qIFJhbmRvbWx5IHJlcGxhY2Ugb25lICovCisJCQlDYWNoZWRJZHggPSAocFBta3NhLT5ic3NpZC5zYV9kYXRhWzVdICUgUE1LSURfTk8pOworCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLAorCQkJCSAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOworCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uCisJCQkJICAgICAgIEJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsCisJCQkJICAgICAgIE1BQ19BRERSX0xFTik7CisJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS4KKwkJCQkgICAgICAgUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKKwkJfQogCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIElXX1BNS1NBX0FERFxuIikpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJydF9pb2N0bF9zaXdwbWtzYSAtIFVua25vdyBDb21tYW5kISFcbiIpKTsKLQkJCWJyZWFrOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfQUREXG4iKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3duIENvbW1hbmQhXG4iKSk7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwogfQogCiBpbnQgcnRfaW9jdGxfc2l3cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQorCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0gICAgUFJUTVBfQURBUFRFUiAgIHBBZCA9IGRldi0+bWxfcHJpdjsKLSAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCXUzMiByYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZSwgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOwogCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLSAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgCXJldHVybiAtRU5FVERPV047CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBkZXYpOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKKwkJcmV0dXJuIC1FTkVURE9XTjsKIAl9CiAKLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKLSAgICAvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCi0gICAgICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQotICAgICovCi0gICAgaWYgKHJhdGUgPT0gLTEpCi0gICAgewotCQkvL0F1dG8gUmF0ZQorCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJydF9pb2N0bF9zaXdyYXRlOjoocmF0ZSA9ICVkLCBmaXhlZCA9ICVkKVxuIiwgcmF0ZSwgZml4ZWQpKTsKKwkvKiByYXRlID0gLTEgPT4gYXV0byByYXRlCisJICAgcmF0ZSA9IFgsIGZpeGVkID0gMSA9PiAoZml4ZWQgcmF0ZSBYKQorCSAqLworCWlmIChyYXRlID09IC0xKSB7CisJCS8qQXV0byBSYXRlICovCiAJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87CiAJCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKIAkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8Ci0JCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQorCQkgICAgKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPD0KKwkJICAgICBNT0RFX09GRE0pKQogCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKIAogCQlTZXRDb21tb25IVChwQWQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZml4ZWQpCi0gICAgICAgIHsKLSAgICAgICAgCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKLSAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQotICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotICAgICAgICB9Ci0gICAgfQorCX0gZWxzZSB7CisJCWlmIChmaXhlZCkgeworCQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKKwkJCWlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fAorCQkJICAgIChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC4KKwkJCSAgICAgTU9ERSA8PSBNT0RFX09GRE0pKQorCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKKwkJCWVsc2UgeworCQkJCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0KKwkJCQkgICAgTUNTX0FVVE87CisJCQkJU2V0Q29tbW9uSFQocEFkKTsKKwkJCX0KKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoInJ0X2lvY3RsX3Npd3JhdGU6OihIdE1jcz0lZClcbiIsCisJCQkJICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJCSAgTUNTKSk7CisJCX0gZWxzZSB7CisJCQkvKiBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKSAqLworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfQogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIGludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKKwkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBkZXYtPm1sX3ByaXY7Ci0gICAgaW50IHJhdGVfaW5kZXggPSAwLCByYXRlX2NvdW50ID0gMDsKLSAgICBIVFRSQU5TTUlUX1NFVFRJTkcgaHRfc2V0dGluZzsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSBOVUxMOworCWludCByYXRlX2luZGV4ID0gMCwgcmF0ZV9jb3VudCA9IDA7CisJSFRUUkFOU01JVF9TRVRUSU5HIGh0X3NldHRpbmc7CisvKiBSZW1vdmUgdG8gZ2xvYmFsIHZhcmlhYmxlCiAgICAgX19zMzIgcmFsaW5rcmF0ZVtdID0KIAl7MiwgIDQsICAgMTEsICAyMiwgLy8gQ0NLCiAJMTIsIDE4LCAgIDI0LCAgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgLy8gT0ZETQpAQCAtMjU0MywzMjkgKzIzMzgsMjk1IEBACiAJNDMsIDg3LCAgMTMwLCAxNzMsIDI2MCwgMzE3LCAzOTAsIDQzMywJCQkJCQkJCQkJICAvLyAyME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMwogCTMwLCA2MCwgICA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsIC8vIDQwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKIAk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwfTsJCQkJCQkJCQkJICAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMTYgfiAyMworKi8KKwlHRVRfUEFEX0ZST01fTkVUX0RFVihwQWQsIGRldik7CiAKLSAgICByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7Ci0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLSAgCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgCXJldHVybiAtRU5FVERPV047CisJcmF0ZV9jb3VudCA9IHNpemVvZihyYWxpbmtyYXRlKSAvIHNpemVvZihfX3MzMik7CisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCXJldHVybiAtRU5FVERPV047CiAJfQogCi0gICAgaWYgKChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgJiYKLSAgICAgICAgKElORlJBX09OKHBBZCkpICYmCi0gICAgICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKSkKLSAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0gICAgZWxzZQotICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOworCWlmICgocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gRkFMU0UpICYmCisJICAgIChJTkZSQV9PTihwQWQpKSAmJgorCSAgICAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykKKwkgICAgIHx8IChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFIDw9CisJCSBNT0RFX09GRE0pKSkKKwkJaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7CisJZWxzZQorCQlodF9zZXR0aW5nLndvcmQgPQorCQkgICAgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUud29yZDsKIAotICAgIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLSAgICB7Ci0gICAgCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOwotICAgIH0KLSAgICBlbHNlCi0gICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCi0gICAgCXJhdGVfaW5kZXggPSAoVUNIQVIpKGh0X3NldHRpbmcuZmllbGQuTUNTKSArIDQ7Ci0gICAgZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfQ0NLKQotICAgIAlyYXRlX2luZGV4ID0gKFVDSEFSKShodF9zZXR0aW5nLmZpZWxkLk1DUyk7CisJaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKSB7CisvKiAgICAgIHJhdGVfaW5kZXggPSAxMiArICgodTgpaHRfc2V0dGluZy5maWVsZC5CVyAqMTYpICsgKCh1OClodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjMyKSArICgodTgpaHRfc2V0dGluZy5maWVsZC5NQ1MpOyAqLworCQlyYXRlX2luZGV4ID0KKwkJICAgIDEyICsgKCh1OClodF9zZXR0aW5nLmZpZWxkLkJXICogMjQpICsKKwkJICAgICgodTgpaHRfc2V0dGluZy5maWVsZC5TaG9ydEdJICogNDgpICsKKwkJICAgICgodTgpaHRfc2V0dGluZy5maWVsZC5NQ1MpOworCX0gZWxzZSBpZiAoaHRfc2V0dGluZy5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKKwkJcmF0ZV9pbmRleCA9ICh1OCkoaHRfc2V0dGluZy5maWVsZC5NQ1MpICsgNDsKKwllbHNlIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCisJCXJhdGVfaW5kZXggPSAodTgpKGh0X3NldHRpbmcuZmllbGQuTUNTKTsKIAotICAgIGlmIChyYXRlX2luZGV4IDwgMCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDA7CisJaWYgKHJhdGVfaW5kZXggPCAwKQorCQlyYXRlX2luZGV4ID0gMDsKIAotICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7CisJaWYgKHJhdGVfaW5kZXggPiByYXRlX2NvdW50KQorCQlyYXRlX2luZGV4ID0gcmF0ZV9jb3VudDsKIAotICAgIHdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOwotICAgIHdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCXdycXUtPmJpdHJhdGUudmFsdWUgPSByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOworCXdycXUtPmJpdHJhdGUuZGlzYWJsZWQgPSAwOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBpd19oYW5kbGVyIHJ0X2hhbmRsZXJbXSA9Ci17Ci0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduYW1lLAkJCS8qIFNJT0NHSVdOQU1FICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmVxLAkJICAgIC8qIFNJT0NTSVdGUkVRICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJlcSwJCSAgICAvKiBTSU9DR0lXRlJFUSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCQkgICAgLyogU0lPQ1NJV01PREUgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdtb2RlLAkJICAgIC8qIFNJT0NHSVdNT0RFICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU0VOUyAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NFTlMgICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1JBTkdFICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYW5nZSwJCSAgICAvKiBTSU9DR0lXUkFOR0UgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXUFJJViAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdTVEFUUyAgKi8KLQkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJCSAgICAgICAgLyogU0lPQ1NJV1RIUlNQWSAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3YXAsICAgICAgICAgICAgLyogU0lPQ1NJV0FQICAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJCSAgICAvKiBTSU9DR0lXQVAgICAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9pd2FwbGlzdCwJCSAgICAvKiBTSU9DR0lXQVBMSVNUICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCQkgICAgLyogU0lPQ1NJV1NDQU4gICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdzY2FuLAkJICAgIC8qIFNJT0NHSVdTQ0FOICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCi0gICAgKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLCAgICAgICAgIC8qIFNJT0NTSVdHRU5JRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ0dJV0dFTklFICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhdXRoLAkJICAgIC8qIFNJT0NTSVdBVVRIICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJCSAgICAvKiBTSU9DR0lXQVVUSCAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2VuY29kZWV4dCwJICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkJLyogU0lPQ0dJV0VOQ09ERUVYVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdwbWtzYSwgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgICovCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPSB7CisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJLyogU0lPQ0dJV05BTUUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXTldJRCAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdOV0lEICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJLyogU0lPQ1NJV0ZSRVEgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmVxLAkvKiBTSU9DR0lXRlJFUSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21vZGUsCS8qIFNJT0NTSVdNT0RFICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJLyogU0lPQ0dJV01PREUgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXU0VOUyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdTRU5TICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLyAsCS8qIFNJT0NTSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCS8qIFNJT0NHSVdSQU5HRSAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLyAsCS8qIFNJT0NTSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLyAsCS8qIFNJT0NHSVdQUklWICAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLyAsCS8qIFNJT0NTSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cyAvKiBrZXJuZWwgY29kZSAqLyAsCS8qIFNJT0NHSVdTVEFUUyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1NQWSAgICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU1BZICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1RIUlNQWSAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdhcCwJLyogU0lPQ1NJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhcCwJLyogU0lPQ0dJV0FQICAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtbG1lLAkvKiBTSU9DU0lXTUxNRSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkvKiBTSU9DR0lXQVBMSVNUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3NjYW4sCS8qIFNJT0NTSVdTQ0FOICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJLyogU0lPQ0dJV1NDQU4gICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlc3NpZCwJLyogU0lPQ1NJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJLyogU0lPQ0dJV0VTU0lEICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXduaWNrbiwJLyogU0lPQ1NJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXduaWNrbiwJLyogU0lPQ0dJV05JQ0tOICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3cmF0ZSwJLyogU0lPQ1NJV1JBVEUgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdyYXRlLAkvKiBTSU9DR0lXUkFURSAgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3J0cywJLyogU0lPQ1NJV1JUUyAgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCS8qIFNJT0NHSVdSVFMgICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJhZywJLyogU0lPQ1NJV0ZSQUcgICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdmcmFnLAkvKiBTSU9DR0lXRlJBRyAgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdUWFBPVyAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1RYUE9XICAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUkVUUlkgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdSRVRSWSAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlLAkvKiBTSU9DU0lXRU5DT0RFICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DU0lXUE9XRVIgICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdQT1dFUiAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2dlbmllLAkvKiBTSU9DU0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2dlbmllLAkvKiBTSU9DR0lXR0VOSUUgICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCS8qIFNJT0NTSVdBVVRIICAgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXV0aCwJLyogU0lPQ0dJV0FVVEggICAqLworCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGVleHQsCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKwkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZW5jb2RlZXh0LAkvKiBTSU9DR0lXRU5DT0RFRVhUICovCisJKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLAkvKiBTSU9DU0lXUE1LU0EgICovCiB9OwogCi1zdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9wcml2X2hhbmRsZXJzW10gPSB7Ci0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwMCAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDEgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2V0cGFyYW0sIC8qICsgMHgwMiAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLwotCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCi0JKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCi0gICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE1ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNyAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTggKi8KLX07Ci0KLWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPQotewotI2RlZmluZQlOKGEpCShzaXplb2YgKGEpIC8gc2l6ZW9mIChhWzBdKSkKLQkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBydF9oYW5kbGVyLAotCS5udW1fc3RhbmRhcmQJPSBzaXplb2YocnRfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCi0JLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBydF9wcml2X2hhbmRsZXJzLAotCS5udW1fcHJpdmF0ZQkJPSBOKHJ0X3ByaXZfaGFuZGxlcnMpLAotCS5wcml2YXRlX2FyZ3MJPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcml2dGFiLAotCS5udW1fcHJpdmF0ZV9hcmdzCT0gTihwcml2dGFiKSwKK2NvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBydDI4eHhfaXdfaGFuZGxlcl9kZWYgPSB7CisJLnN0YW5kYXJkID0gKGl3X2hhbmRsZXIgKikgcnRfaGFuZGxlciwKKwkubnVtX3N0YW5kYXJkID0gc2l6ZW9mKHJ0X2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAogI2lmIElXX0hBTkRMRVJfVkVSU0lPTiA+PSA3Ci0gICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCiAjZW5kaWYKIH07CiAKLUlOVCBydDI4eHhfc3RhX2lvY3RsKAotCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAotCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAotCUlOCUlOVAkJCQkJY21kKQoraW50IHJ0Mjh4eF9zdGFfaW9jdGwoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCSAgICAgSU4gT1VUIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7Ci0JUlRNUF9BREFQVEVSICpwQWQgPSBuZXRfZGV2LT5tbF9wcml2OwotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCXN0cnVjdCBpd3JlcSAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7Ci0JQk9PTEVBTgkJCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0JSU5UCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gTlVMTDsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilycTsKKwlCT09MRUFOIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKKwlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgICAgIH0KLSAgICB9CisJR0VUX1BBRF9GUk9NX05FVF9ERVYocEFkLCBuZXRfZGV2KTsKIAotCXsJLy8gZGV0ZXJtaW5lIHRoaXMgaW9jdGwgY29tbWFuZCBpcyBjb21taW5nIGZyb20gd2hpY2ggaW50ZXJmYWNlLgorCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOworCisJLypjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkgeworCQl7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7CisJCQlyZXR1cm4gLUVORVRET1dOOworCQl9CisJfQorCisJewkJCS8qIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4gKi8KIAkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOwogCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOwogCX0KIAotCXN3aXRjaChjbWQpCi0JewotICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOwotCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCQlicmVhazsKLQkJY2FzZSBTSU9DR0lXTkFNRToKLSAgICAgICAgewotICAgICAgICAJY2hhciAqbmFtZT0md3JxLT51Lm5hbWVbMF07Ci0gICAgICAgIAlydF9pb2N0bF9naXduYW1lKG5ldF9kZXYsIE5VTEwsIG5hbWUsIE5VTEwpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lGSFdBRERSOgorCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOworCQltZW1jcHkod3JxLT51Lm5hbWUsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DR0lXTkFNRToKKwkJeworCQkJY2hhciAqbmFtZSA9ICZ3cnEtPnUubmFtZVswXTsKKwkJCXJ0X2lvY3RsX2dpd25hbWUobmV0X2RldiwgTlVMTCwgbmFtZSwgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NHSVdFU1NJRDogIC8vR2V0IEVTU0lECi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wb2ludCAqZXNzaWQ9JndycS0+dS5lc3NpZDsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7CisJY2FzZSBTSU9DR0lXRVNTSUQ6CS8qR2V0IEVTU0lEICovCisJCXsKKwkJCXN0cnVjdCBpd19wb2ludCAqZXNzaWQgPSAmd3JxLT51LmVzc2lkOworCQkJcnRfaW9jdGxfZ2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ1NJV0VTU0lEOiAgLy9TZXQgRVNTSUQKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOwotICAgICAgICAJcnRfaW9jdGxfc2l3ZXNzaWQobmV0X2RldiwgTlVMTCwgZXNzaWQsIGVzc2lkLT5wb2ludGVyKTsKKwljYXNlIFNJT0NTSVdFU1NJRDoJLypTZXQgRVNTSUQgKi8KKwkJeworCQkJc3RydWN0IGl3X3BvaW50ICplc3NpZCA9ICZ3cnEtPnUuZXNzaWQ7CisJCQlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCi0JCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7Ci0gICAgICAgIAlydF9pb2N0bF9zaXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOworCWNhc2UgU0lPQ1NJV05XSUQ6CS8qIHNldCBuZXR3b3JrIGlkICh0aGUgY2VsbCkgKi8KKwljYXNlIFNJT0NHSVdOV0lEOgkvKiBnZXQgbmV0d29yayBpZCAqLworCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU0lXRlJFUToJLypzZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcSA9ICZ3cnEtPnUuZnJlcTsKKwkJCXJ0X2lvY3RsX3Npd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NHSVdGUkVROiAgIC8vIGdldCBjaGFubmVsL2ZyZXF1ZW5jeSAoSHopCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7CisJY2FzZSBTSU9DR0lXRlJFUToJLyogZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikgKi8KKwkJeworCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEgPSAmd3JxLT51LmZyZXE7CisJCQlydF9pb2N0bF9naXdmcmVxKG5ldF9kZXYsIE5VTEwsIGZyZXEsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DU0lXTklDS046IC8vc2V0IG5vZGUgbmFtZS9uaWNrbmFtZQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOwotICAgICAgICAJcnRfaW9jdGxfc2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJY2FzZSBTSU9DU0lXTklDS046CS8qc2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLworCQl7CisJCQkvKnN0cnVjdCBpd19wb2ludCAqZGF0YT0md3JxLT51LmRhdGE7ICovCisJCQkvKnJ0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOyAqLwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXTklDS046IC8vZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOwotICAgICAgICAJcnRfaW9jdGxfZ2l3bmlja24obmV0X2RldiwgTlVMTCwgZGF0YSwgTlVMTCk7CisJY2FzZSBTSU9DR0lXTklDS046CS8qZ2V0IG5vZGUgbmFtZS9uaWNrbmFtZSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9IE5VTEw7CisJCQllcnEgPSAmd3JxLT51LmRhdGE7CisJCQllcnEtPmxlbmd0aCA9IHN0cmxlbigoY2hhciAqKXBBZC0+bmlja25hbWUpOworCQkJU3RhdHVzID0KKwkJCSAgICBjb3B5X3RvX3VzZXIoZXJxLT5wb2ludGVyLCBwQWQtPm5pY2tuYW1lLAorCQkJCQkgZXJxLT5sZW5ndGgpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DR0lXUkFURTogICAvL2dldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCi0JCSAgICBydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0lPQ1NJV1JBVEU6ICAvL3NldCBkZWZhdWx0IGJpdCByYXRlIChicHMpCi0JICAgICAgICBydF9pb2N0bF9zaXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0lPQ0dJV1JUUzogIC8vIGdldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBpd19wYXJhbSAqcnRzPSZ3cnEtPnUucnRzOwotICAgICAgICAJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CisJY2FzZSBTSU9DR0lXUkFURToJLypnZXQgZGVmYXVsdCBiaXQgcmF0ZSAoYnBzKSAqLworCQlydF9pb2N0bF9naXdyYXRlKG5ldF9kZXYsIE5VTEwsICZ3cnEtPnUsIE5VTEwpOworCQlicmVhazsKKwljYXNlIFNJT0NTSVdSQVRFOgkvKnNldCBkZWZhdWx0IGJpdCByYXRlIChicHMpICovCisJCXJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dJV1JUUzoJLyogZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykgKi8KKwkJeworCQkJc3RydWN0IGl3X3BhcmFtICpydHMgPSAmd3JxLT51LnJ0czsKKwkJCXJ0X2lvY3RsX2dpd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXUlRTOiAgLy9zZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKLSAgICAgICAgCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOworCWNhc2UgU0lPQ1NJV1JUUzoJLypzZXQgUlRTL0NUUyB0aHJlc2hvbGQgKGJ5dGVzKSAqLworCQl7CisJCQlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cyA9ICZ3cnEtPnUucnRzOworCQkJcnRfaW9jdGxfc2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotICAgICAgICBjYXNlIFNJT0NHSVdGUkFHOiAgLy9nZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOwotICAgICAgICAJcnRfaW9jdGxfZ2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwljYXNlIFNJT0NHSVdGUkFHOgkvKmdldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpICovCisJCXsKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZyA9ICZ3cnEtPnUuZnJhZzsKKwkJCXJ0X2lvY3RsX2dpd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotICAgICAgICBjYXNlIFNJT0NTSVdGUkFHOiAgLy9zZXQgZnJhZ21lbnRhdGlvbiB0aHIgKGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgIAlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOwotICAgICAgICAJcnRfaW9jdGxfc2l3ZnJhZyhuZXRfZGV2LCBOVUxMLCBmcmFnLCBOVUxMKTsKKwljYXNlIFNJT0NTSVdGUkFHOgkvKnNldCBmcmFnbWVudGF0aW9uIHRociAoYnl0ZXMpICovCisJCXsKKwkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZyA9ICZ3cnEtPnUuZnJhZzsKKwkJCXJ0X2lvY3RsX3Npd2ZyYWcobmV0X2RldiwgTlVMTCwgZnJhZywgTlVMTCk7CiAJCQlicmVhazsKIAkJfQotICAgICAgICBjYXNlIFNJT0NHSVdFTkNPREU6ICAvL2dldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKLSAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKLSAgICAgICAgCQlydF9pb2N0bF9naXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCWNhc2UgU0lPQ0dJV0VOQ09ERToJLypnZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCisJCXsKKwkJCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJndycS0+dS5lbmNvZGluZzsKKwkJCWlmIChlcnEpCisJCQkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwKKwkJCQkJCSAgIGVycS0+cG9pbnRlcik7CiAJCQlicmVhazsKIAkJfQotICAgICAgICBjYXNlIFNJT0NTSVdFTkNPREU6ICAvL3NldCBlbmNvZGluZyB0b2tlbiAmIG1vZGUKLSAgICAgICAgewotICAgICAgICAJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKLSAgICAgICAgCWlmKGVycS0+cG9pbnRlcikKLSAgICAgICAgCQlydF9pb2N0bF9zaXdlbmNvZGUobmV0X2RldiwgTlVMTCwgZXJxLCBlcnEtPnBvaW50ZXIpOworCWNhc2UgU0lPQ1NJV0VOQ09ERToJLypzZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlICovCisJCXsKKwkJCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJndycS0+dS5lbmNvZGluZzsKKwkJCWlmIChlcnEpCisJCQkJcnRfaW9jdGxfc2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwKKwkJCQkJCSAgIGVycS0+cG9pbnRlcik7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7Ci0gICAgICAgIAlydF9pb2N0bF9naXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwljYXNlIFNJT0NHSVdBUDoJLypnZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMgKi8KKwkJeworCQkJc3RydWN0IHNvY2thZGRyICphcF9hZGRyID0gJndycS0+dS5hcF9hZGRyOworCQkJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwKKwkJCQkgICAgICAgYXBfYWRkci0+c2FfZGF0YSk7CiAJCQlicmVhazsKIAkJfQotCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCi0gICAgICAgIHsKLSAgICAgICAgCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkcj0md3JxLT51LmFwX2FkZHI7Ci0gICAgICAgIAlydF9pb2N0bF9zaXdhcChuZXRfZGV2LCBOVUxMLCBhcF9hZGRyLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwljYXNlIFNJT0NTSVdBUDoJLypzZXQgYWNjZXNzIHBvaW50IE1BQyBhZGRyZXNzZXMgKi8KKwkJeworCQkJc3RydWN0IHNvY2thZGRyICphcF9hZGRyID0gJndycS0+dS5hcF9hZGRyOworCQkJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwKKwkJCQkgICAgICAgYXBfYWRkci0+c2FfZGF0YSk7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCi0gICAgICAgIHsKLSAgICAgICAgCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKLSAgICAgICAgCXJ0X2lvY3RsX2dpd21vZGUobmV0X2RldiwgTlVMTCwgbW9kZSwgTlVMTCk7CisJY2FzZSBTSU9DR0lXTU9ERToJLypnZXQgb3BlcmF0aW9uIG1vZGUgKi8KKwkJeworCQkJX191MzIgKm1vZGUgPSAmd3JxLT51Lm1vZGU7CisJCQlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOwogCQkJYnJlYWs7CiAJCX0KLQkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQotICAgICAgICB7Ci0gICAgICAgIAlfX3UzMiAqbW9kZT0md3JxLT51Lm1vZGU7Ci0gICAgICAgIAlydF9pb2N0bF9zaXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOworCWNhc2UgU0lPQ1NJV01PREU6CS8qc2V0IG9wZXJhdGlvbiBtb2RlICovCisJCXsKKwkJCV9fdTMyICptb2RlID0gJndycS0+dS5tb2RlOworCQkJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKLQkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKLQkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCi0JCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncwotCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCi0JCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKLQkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKLQkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKLQkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKLQkJY2FzZSBSVF9QUklWX0lPQ1RMOgotCQljYXNlIFJUX1BSSVZfSU9DVExfRVhUOgotCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0JCQlicmVhazsKLQkJY2FzZSBTSU9DR0lXUFJJVjoKLQkJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKQotCQkJewotCQkJCWlmICggYWNjZXNzX29rKFZFUklGWV9XUklURSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKHByaXZ0YWIpKSAhPSBUUlVFKQotCQkJCQlicmVhazsKLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocHJpdnRhYikgLyBzaXplb2YocHJpdnRhYlswXSk7Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKLQkJCWlmKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKSAhPSBUUlVFKQotCQkJCWJyZWFrOwotCQkJcnRfaW9jdGxfc2V0cGFyYW0obmV0X2RldiwgTlVMTCwgTlVMTCwgd3JxLT51LmRhdGEucG9pbnRlcik7Ci0JCQlicmVhazsKLQkJY2FzZSBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVk6Ci0JCQlSVE1QSW9jdGxHZXRTaXRlU3VydmV5KHBBZCwgd3JxKTsKLQkJICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNJT0NFVEhUT09MOgotICAgICAgICAgICAgICAgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiSU9DVEw6OnVua25vd24gSU9DVEwncyBjbWQgPSAweCUwOHhcbiIsIGNtZCkpOwotCQkJU3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0JCQlicmVhazsKKwljYXNlIFNJT0NHSVdTRU5TOgkvKmdldCBzZW5zaXRpdml0eSAoZEJtKSAqLworCWNhc2UgU0lPQ1NJV1NFTlM6CS8qc2V0IHNlbnNpdGl2aXR5IChkQm0pICovCisJY2FzZSBTSU9DR0lXUE9XRVI6CS8qZ2V0IFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZ3MgKi8KKwljYXNlIFNJT0NTSVdQT1dFUjoJLypzZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncyAqLworCWNhc2UgU0lPQ0dJV1RYUE9XOgkvKmdldCB0cmFuc21pdCBwb3dlciAoZEJtKSAqLworCWNhc2UgU0lPQ1NJV1RYUE9XOgkvKnNldCB0cmFuc21pdCBwb3dlciAoZEJtKSAqLworCWNhc2UgU0lPQ0dJV1JBTkdFOgkvKkdldCByYW5nZSBvZiBwYXJhbWV0ZXJzICovCisJY2FzZSBTSU9DR0lXUkVUUlk6CS8qZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUgKi8KKwljYXNlIFNJT0NTSVdSRVRSWToJLypzZXQgcmV0cnkgbGltaXRzIGFuZCBsaWZldGltZSAqLworCWNhc2UgUlRfUFJJVl9JT0NUTDoKKwljYXNlIFJUX1BSSVZfSU9DVExfRVhUOgorCWNhc2UgUlRQUklWX0lPQ1RMX1NFVDoKKwljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKKwljYXNlIFNJT0NHSVdQUklWOgorCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJY2FzZSBTSU9DRVRIVE9PTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7CisJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKIAl9CiAKLSAgICBpZihTdGF0ZU1hY2hpbmVUb3VjaGVkKSAvLyBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMKLSAgICAJUlQyOFhYX01MTUVfSEFORExFUihwQWQpOworCWlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKQkvKiBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMgKi8KKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC0yODc4LDk1ICsyNjM5LDc3IEBACiAgICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLUlOVCBTZXRfU1NJRF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCitpbnQgU2V0X1NTSURfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwgY2hhciAqYXJnKQogewotICAgIE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgICAgICAgICAgIFNzaWQsICpwU3NpZD1OVUxMOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gVFJVRTsKKwlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCBTc2lkLCAqcFNzaWQgPSBOVUxMOworCUJPT0xFQU4gU3RhdGVNYWNoaW5lVG91Y2hlZCA9IEZBTFNFOworCWludCBzdWNjZXNzID0gVFJVRTsKIAotICAgIGlmKCBzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpCi0gICAgewotICAgICAgICBOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKLSAgICAgICAgaWYgKHN0cmxlbihhcmcpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7Ci0gICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSBzdHJsZW4oYXJnKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgLy9BTlkgc3NpZAotICAgICAgICB7Ci0gICAgICAgICAgICBTc2lkLlNzaWRMZW5ndGggPSAwOwotCQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOworCWlmIChzdHJsZW4oYXJnKSA8PSBNQVhfTEVOX09GX1NTSUQpIHsKKwkJTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihzdHJ1Y3QgcnRfbmRpc184MDJfMTFfc3NpZCkpOworCQlpZiAoc3RybGVuKGFyZykgIT0gMCkgeworCQkJTmRpc01vdmVNZW1vcnkoU3NpZC5Tc2lkLCBhcmcsIHN0cmxlbihhcmcpKTsKKwkJCVNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOworCQl9IGVsc2UJCS8qQU5ZIHNzaWQgKi8KKwkJeworCQkJU3NpZC5Tc2lkTGVuZ3RoID0gMDsKKwkJCW1lbWNweShTc2lkLlNzaWQsICIiLCAwKTsKIAkJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKIAkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0KKwkJCSAgICBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwogCQl9Ci0gICAgICAgIHBTc2lkID0gJlNzaWQ7CisJCXBTc2lkID0gJlNzaWQ7CiAKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJUMjhYWF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgICAgICB9CisJCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKSB7CisJCQlSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJNTE1FIGJ1c3ksIHJlc2V0IE1MTUUgc3RhdGUgbWFjaGluZSFcbiIpKTsKKwkJfQogCi0gICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CisJCWlmICgocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID49IDgpICYmCisJCSAgICAocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuIDw9IDY0KSkgeworCQkJY2hhciBwYXNzcGhyYXNlX3N0cls2NV0gPSB7IDAgfTsKKwkJCXU4IGtleU1hdGVyaWFsWzQwXTsKKworCQkJUlRNUE1vdmVNZW1vcnkocGFzc3BocmFzZV9zdHIsCisJCQkJICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwKKwkJCQkgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuKTsKKwkJCVJUTVBaZXJvTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAzMik7CisJCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID09IDY0KSB7CisJCQkJQXRvSCgoY2hhciAqKXBBZGFwdGVyLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwKKwkJCQkgICAgIHBBZGFwdGVyLT5TdGFDZmcuUE1LLCAzMik7CisJCQl9IGVsc2UgeworCQkJCVBhc3N3b3JkSGFzaCgoY2hhciAqKXBBZGFwdGVyLT5TdGFDZmcuCisJCQkJCSAgICAgV3BhUGFzc1BocmFzZSwgU3NpZC5Tc2lkLAorCQkJCQkgICAgIFNzaWQuU3NpZExlbmd0aCwga2V5TWF0ZXJpYWwpOworCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLAorCQkJCQkgICAgICAga2V5TWF0ZXJpYWwsIDMyKTsKKwkJCX0KKwkJfQorCisJCXBBZGFwdGVyLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKKwkJcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gRkFMU0U7CiAJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7CiAKLSAgICAgICAgTWxtZUVucXVldWUocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX1NTSUQsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSwKLSAgICAgICAgICAgICAgICAgICAgKFZPSUQgKilwU3NpZCk7CisJCU1sbWVFbnF1ZXVlKHBBZGFwdGVyLAorCQkJICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAorCQkJICAgIE9JRF84MDJfMTFfU1NJRCwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHJ0X25kaXNfODAyXzExX3NzaWQpLCAodm9pZCAqKSBwU3NpZCk7CiAKLSAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TU0lEX1Byb2M6OihMZW49JWQsU3NpZD0lcylcbiIsIFNzaWQuU3NpZExlbmd0aCwgU3NpZC5Tc2lkKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgc3VjY2VzcyA9IEZBTFNFOworCQlTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJTZXRfU1NJRF9Qcm9jOjooTGVuPSVkLFNzaWQ9JXMpXG4iLCBTc2lkLlNzaWRMZW5ndGgsCisJCQkgIFNzaWQuU3NpZCkpOworCX0gZWxzZQorCQlzdWNjZXNzID0gRkFMU0U7CiAKLSAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCi0gICAgCVJUMjhYWF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOworCWlmIChTdGF0ZU1hY2hpbmVUb3VjaGVkKQkvKiBVcHBlciBsYXllciBzZW50IGEgTUxNRS1yZWxhdGVkIG9wZXJhdGlvbnMgKi8KKwkJUlRNUF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOwogCi0gICAgcmV0dXJuIHN1Y2Nlc3M7CisJcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLSNpZmRlZiBXTU1fU1VQUE9SVAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCUJPT0xFQU4JYldtbUNhcGFibGU7Ci0KLQliV21tQ2FwYWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoKGJXbW1DYXBhYmxlID09IDEpCi0jaWZkZWYgUlQyODcwCi0JCSYmIChwQWQtPk51bWJlck9mUGlwZXMgPj0gNSkKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQkJKQotCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IFRSVUU7Ci0JZWxzZSBpZiAoYldtbUNhcGFibGUgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dtbUNhcGFibGVfUHJvYzo6KGJXbW1DYXBhYmxlPSVkKVxuIiwKLQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCi0KIC8qCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICBEZXNjcmlwdGlvbjoKQEAgLTI5NzUsMTY2ICsyNzE4LDE4NCBAQAogICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1JTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKK2ludCBTZXRfTmV0d29ya1R5cGVfUHJvYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWRhcHRlciwgY2hhciAqYXJnKQogewotICAgIFVJTlQzMglWYWx1ZSA9IDA7CisJdTMyIFZhbHVlID0gMDsKIAotICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQotCXsKLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCi0JCXsKLQkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCWlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKSB7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0FESE9DKSB7CisJCQkvKiBDb25maWcgaGFzIGNoYW5nZWQgKi8KIAkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLAorCQkJCQkJU1RBTk9STUFMKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwogCQkJCVZhbHVlICY9ICh+MHg4MCk7CiAJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLSAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLQkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCi0JCQl7Ci0JCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKLQkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECi0JCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgotCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOworCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsCisJCQkJCQkgICAgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOworCQkJCXBBZGFwdGVyLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOworCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7CisJCQl9CisJCQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpKSB7CisJCQkJLypCT09MRUFOIENhbmNlbGxlZDsgKi8KKwkJCQkvKiBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lEICovCisJCQkJLyogU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLiAqLworCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gMzI7CisJCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguCisJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZCwKKwkJCQkJICAgICAgIHBBZGFwdGVyLT5NbG1lQXV4LgorCQkJCQkgICAgICAgQXV0b1JlY29ubmVjdFNzaWRMZW4pOwogCiAJCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKIAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CisJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCSAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7CiAJCQl9CiAJCX0KIAkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOwotICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOwotCX0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQotCXsKLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCi0JCXsKLQkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAorCQlwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihBRC1IT0MpXG4iKSk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKSB7CisJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgIT0gQlNTX0lORlJBKSB7CisJCQkvKiBDb25maWcgaGFzIGNoYW5nZWQgKi8KIAkJCXBBZGFwdGVyLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIFNUQU5PUk1BTCk7Ci0gICAgICAgICAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKKwkJCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkgeworCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgUlhfRklMVFJfQ0ZHLAorCQkJCQkJU1RBTk9STUFMKTsKKwkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwogCQkJCVZhbHVlICY9ICh+MHg4MCk7CiAJCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLSAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLQkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCi0JCQl7Ci0JCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKKwkJCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLAorCQkJCQkJICAgIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gVFJVRTsKKwkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOworCQkJfQorCQkJaWYgKEFESE9DX09OKHBBZGFwdGVyKSkgeworCQkJCS8qIFNldCB0aGUgQXV0b1JlY29ubmVjdFNzaWQgdG8gcHJldmVudCBpdCByZWNvbm5lY3QgdG8gb2xkIFNTSUQgKi8KKwkJCQkvKiBTaW5jZSBjYWxsaW5nIHRoaXMgaW5kaWNhdGUgdXNlciBkb24ndCB3YW50IHRvIGNvbm5lY3QgdG8gdGhhdCBTU0lEIGFueW1vcmUuICovCisJCQkJcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSAzMjsKKwkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC4KKwkJCQkJICAgICAgIEF1dG9SZWNvbm5lY3RTc2lkLAorCQkJCQkgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguCisJCQkJCSAgICAgICBBdXRvUmVjb25uZWN0U3NpZExlbik7CiAKIAkJCQlMaW5rRG93bihwQWRhcHRlciwgRkFMU0UpOwogCQkJfQogCQl9CiAJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLSAgICAgICAgcEFkYXB0ZXItPm5ldF9kZXYtPnR5cGUgPSBwQWRhcHRlci0+U3RhQ2ZnLk9yaURldlR5cGU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KElORlJBKVxuIikpOwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19JTkZSQTsKLQl9Ci0gICAgZWxzZSBpZiAoc3RyY21wKGFyZywgIk1vbml0b3IiKSA9PSAwKQotICAgIHsKLQkJVUNIQVIJYmJwVmFsdWUgPSAwOworCQlwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihJTkZSQSlcbiIpKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkgeworCQl1OCBiYnBWYWx1ZSA9IDA7CiAJCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7CiAJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKKwkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19BREhPQ19PTik7CiAJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0JCS8vIGRpc2FibGUgYWxsIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKwkJLyogZGlzYWJsZSBhbGwgcGVyaW9kaWMgc3RhdGUgbWFjaGluZSAqLwogCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7Ci0JCS8vIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUKLQkJUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOwotICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CisJCS8qIHJlc2V0IGFsbCBtbG1lIHN0YXRlIG1hY2hpbmUgKi8KKwkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoImZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEIFxuIikpOworCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9PSAwKSB7CisJCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFOX01JWEVEKQorCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSAzNjsKKwkJCWVsc2UKKwkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gNjsKKwkJfSBlbHNlCisJCQlOX0NoYW5uZWxDaGVjayhwQWRhcHRlcik7CiAKLQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLSAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCi0gICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQotCQl7Ci0JCQkvLyA0ME1IeiAsY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgJmJicFZhbHVlKTsKKwkJaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCisJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgorCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID09CisJCSAgICBFWFRDSEFfQUJPVkUpIHsKKwkJCS8qIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgbG93ZXIgKi8KKwkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICZiYnBWYWx1ZSk7CiAJCQliYnBWYWx1ZSAmPSAofjB4MTgpOwogCQkJYmJwVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwgYmJwVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LAorCQkJCQkJICAgICBiYnBWYWx1ZSk7CiAJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQkJLy8gIFJYIDogY29udHJvbCBjaGFubmVsIGF0IGxvd2VyCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgJmJicFZhbHVlKTsKKwkJCS8qICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsCisJCQkJCQkgICAgJmJicFZhbHVlKTsKIAkJCWJicFZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsIGJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywKKwkJCQkJCSAgICAgYmJwVmFsdWUpOwogCiAJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CiAJCQlWYWx1ZSAmPSAweGZmZmZmZmZlOwogCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0gICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCQl9Ci0JCWVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEICYmCi0gICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwICYmCi0gICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCi0JCXsKLQkJCS8vIDQwTUh6ICxjb250cm9sIGNoYW5uZWwgYXQgdXBwZXIKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9CisJCQkgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLAorCQkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsCisJCQkJCSAgRkFMU0UpOworCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLAorCQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAorCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAorCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOworCQl9IGVsc2UgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVECisJCQkgICAmJiBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PQorCQkJICAgQldfNDAKKwkJCSAgICYmIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLgorCQkJICAgRVhUQ0hBID09IEVYVENIQV9CRUxPVykgeworCQkJLyogNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlciAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsCisJCQkJCQkgICAgJmJicFZhbHVlKTsKIAkJCWJicFZhbHVlICY9ICh+MHgxOCk7CiAJCQliYnBWYWx1ZSB8PSAweDEwOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCBiYnBWYWx1ZSk7CisJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsCisJCQkJCQkgICAgIGJicFZhbHVlKTsKIAkJCXBBZGFwdGVyLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7CiAJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7CiAJCQlWYWx1ZSB8PSAweDE7CiAJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7CiAKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsCisJCQkJCQkgICAgJmJicFZhbHVlKTsKIAkJCWJicFZhbHVlIHw9ICgweDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOwotCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0gICAgICAgICAgICBBc2ljU3dpdGNoQ2hhbm5lbChwQWRhcHRlciwgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gMjBNSHoKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOworCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLAorCQkJCQkJICAgICBiYnBWYWx1ZSk7CisJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0KKwkJCSAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOworCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsCisJCQkJCSAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwKKwkJCQkJICBGQUxTRSk7CisJCQlBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsCisJCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQldfNDAgLGNvbnRyb2xfY2hhbm5lbCglZCksIENlbnRyYWxDaGFubmVsKCVkKSBcbiIsCisJCQkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7CisJCX0gZWxzZSB7CisJCQkvKiAyME1IeiAqLworCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsCisJCQkJCQkgICAgJmJicFZhbHVlKTsKIAkJCWJicFZhbHVlICY9ICh+MHgxOCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKKwkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SNCwKKwkJCQkJCSAgICAgYmJwVmFsdWUpOwogCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKKwkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCisJCQkJCSAgRkFMU0UpOwogCQkJQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwKKwkJCQkgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCkpOwogCQl9Ci0JCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgorCQkvKiBFbmFibGUgUnggd2l0aCBwcm9taXNjdW91cyByZWNlcHRpb24gKi8KIAkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7Ci0JCS8vIEFTSUMgc3VwcG9yc3RzIHNuaWZmZXIgZnVuY3Rpb24gd2l0aCByZXBsYWNpbmcgUlNTSSB3aXRoIHRpbWVzdGFtcC4KLQkJLy9SVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkvL1ZhbHVlIHw9ICgweDgwKTsKLQkJLy9SVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCQkvLyBkaXNhYmxlIHN5bmMKKwkJLyogQVNJQyBzdXBwb3JzdHMgc25pZmZlciBmdW5jdGlvbiB3aXRoIHJlcGxhY2luZyBSU1NJIHdpdGggdGltZXN0YW1wLiAqLworCQkvKlJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7ICovCisJCS8qVmFsdWUgfD0gKDB4ODApOyAqLworCQkvKlJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7ICovCisJCS8qIGRpc2FibGUgc3luYyAqLwogCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwogCQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7CiAJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7CkBAIC0zMTQyLDY1NSArMjkwMywxNiBAQAogCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgY3NyLndvcmQpOwogCiAJCXBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19NT05JVE9SOwotICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5TZXRfTmV0d29ya1R5cGVfUHJvYzo6KE1PTklUT1IpXG4iKSk7Ci0gICAgfQorCQlwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007CS8qQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExICovCisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTU9OSVRPUilcbiIpKTsKKwl9CisJLyogUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleSAqLworCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7CiAKLSAgICAvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0gICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooTmV0d29ya1R5cGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBdXRoZW50aWNhdGlvbiBtb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0F1dGhNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYSIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBMiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3BhMiIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQXV0aE1vZGVfUHJvYzo6KEF1dGhNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEVuY3J5cHRpb24gVHlwZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9FbmNyeXBUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHg7Ci0KLSAgICBLZXlJZHggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotICAgIGlmKChLZXlJZHggPj0gMSApICYmIChLZXlJZHggPD0gNCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSAoS2V5SWR4IC0gMSApOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRGVmYXVsdEtleUlEX1Byb2M6OihEZWZhdWx0S2V5SUQ9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVkxCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTFfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTFfUHJvYzo6KEtleTE9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTIKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5Ml9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVkzCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTNfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1IZXgpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjooS2V5Mz0lcyBhbmQgdHlwZT1Bc2NpaSlcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5M19Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZNAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXk0X1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXk0X1Byb2M6OihLZXk0PSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXUEEgUFNLIGtleQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9XUEFQU0tfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGtleU1hdGVyaWFsWzQwXTsKLQotICAgIGlmICgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0gICAgICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JICAgIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XUEFQU0tfUHJvYzo6KFdQQVBTSz0lcylcbiIsIGFyZykpOwotCi0gICAgTmRpc1plcm9NZW1vcnkoa2V5TWF0ZXJpYWwsIDQwKTsKLQotICAgIGlmICgoc3RybGVuKGFyZykgPCA4KSB8fCAoc3RybGVuKGFyZykgPiA2NCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgZmFpbGVkISEoV1BBUFNLPSVzKSwgV1BBUFNLIGtleS1zdHJpbmcgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMgXG4iLCBhcmcpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmIChzdHJsZW4oYXJnKSA9PSA2NCkKLSAgICB7Ci0gICAgICAgIEF0b0goYXJnLCBrZXlNYXRlcmlhbCwgMzIpOwotICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U3RhQ2ZnLlBNSywga2V5TWF0ZXJpYWwsIDMyKTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQYXNzd29yZEhhc2goKGNoYXIgKilhcmcsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LlNzaWRMZW4sIGtleU1hdGVyaWFsKTsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIGtleU1hdGVyaWFsLCAzMik7Ci0gICAgfQotCi0KLQotICAgIGlmKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKLSAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0gICAgewotICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFBvd2VyIFNhdmluZyBtb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1BTTW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0gICAgewotICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKLQkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8Ci0JCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja0ZvclBzbUNoYW5nZSgpCi0gICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0gICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8Ci0JCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLSAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQotICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQotICAgICAgICAgICAgTWxtZVNldFBzbUJpdChwQWRhcHRlciwgUFdSX0FDVElWRSk7Ci0gICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0gICAgICAgIH0KLQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgotICAgIFZhbHVlOgotICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgotICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KLSAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1dwYV9TdXBwb3J0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQotICAgIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOwotICAgIGVsc2UgaWYgKCBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDEpCi0gICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9IFdQQV9TVVBQTElDQU5UX0VOQUJMRTsKLSAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAyKQotICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUk7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dwYV9TdXBwb3J0OjooV3BhU3VwcGxpY2FudFVQPSVkKVxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgYXJnKQotewotICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCi0gICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9UR25XaWZpVGVzdF9Qcm9jOjooYlRHbldpZmlUZXN0PSVkKVxuIiwgcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0KSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLQlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7Ci0JVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKLQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OwotCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOwotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVRYX1JUWV9DRkdfU1RSVUMJdHhfcnR5X2NmZzsKLQlVQ0hBUgkJCQlTaG9ydFJldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsCisJCSAgcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlKSk7CiAKLQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OwotCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKIAlyZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvdXNiX21haW5fZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWEyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3VzYl9tYWluX2Rldi5jCkBAIC0wLDAgKzEsODg3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbGluayBUZWNoIEluYy4KKyAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKKyAqIEhzaW5jaHUgQ291bnR5IDMwMiwKKyAqIFRhaXdhbiwgUi5PLkMuCisgKgorICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJydF9jb25maWcuaCIKKworLyogRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nICovCisvKiAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4gKi8KKy8qIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKiogKi8KK01PRFVMRV9BVVRIT1IoIlBhdWwgTGluIDxwYXVsX2xpbkByYWxpbmt0ZWNoLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUlQyODcwL1JUMzA3MCBXaXJlbGVzcyBMYW4gTGludXggRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjaWZkZWYgTU9EVUxFX1ZFUlNJT04KK01PRFVMRV9WRVJTSU9OKFNUQV9EUklWRVJfVkVSU0lPTik7CisjZW5kaWYKKworLyogbW9kdWxlIHRhYmxlICovCitzdHJ1Y3QgdXNiX2RldmljZV9pZCBydHVzYl91c2JfaWRbXSA9IHsKKyNpZmRlZiBSVDI4NzAKKwl7VVNCX0RFVklDRSgweDE0OEYsIDB4Mjc3MCl9LAkvKiBSYWxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDE0OEYsIDB4Mjg3MCl9LAkvKiBSYWxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDA3QjgsIDB4Mjg3MCl9LAkvKiBBYm9Db20gKi8KKwl7VVNCX0RFVklDRSgweDA3QjgsIDB4Mjc3MCl9LAkvKiBBYm9Db20gKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAzOSl9LAkvKiBTaXRlY29tIDI3NzAgKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4NzUxMil9LAkvKiBBcmNhZHlhbiAyNzcwICovCisJe1VTQl9ERVZJQ0UoMHgwNzg5LCAweDAxNjIpfSwJLyogTG9naXRlYyAyODcwICovCisJe1VTQl9ERVZJQ0UoMHgwNzg5LCAweDAxNjMpfSwJLyogTG9naXRlYyAyODcwICovCisJe1VTQl9ERVZJQ0UoMHgwNzg5LCAweDAxNjQpfSwJLyogTG9naXRlYyAyODcwICovCisJe1VTQl9ERVZJQ0UoMHgxNzdmLCAweDAzMDIpfSwJLyogbHN1c2IgKi8KKwl7VVNCX0RFVklDRSgweDBCMDUsIDB4MTczMSl9LAkvKiBBc3VzICovCisJe1VTQl9ERVZJQ0UoMHgwQjA1LCAweDE3MzIpfSwJLyogQXN1cyAqLworCXtVU0JfREVWSUNFKDB4MEIwNSwgMHgxNzQyKX0sCS8qIEFzdXMgKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAxNyl9LAkvKiBTaXRlY29tICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwMkIpfSwJLyogU2l0ZWNvbSAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDJDKX0sCS8qIFNpdGVjb20gKi8KKwl7VVNCX0RFVklDRSgweDBERjYsIDB4MDAyRCl9LAkvKiBTaXRlY29tICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDYpfSwJLyogQ29uY2VwdHJvbmljICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjgpfSwJLyogQ29uY2VwdHJvbmljICovCisJe1VTQl9ERVZJQ0UoMHgyMDE5LCAweEVEMDYpfSwJLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCisJe1VTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMDkpfSwJLyogRC1MaW5rICovCisJe1VTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMTEpfSwJLyogRC1MaW5rICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDcpfSwJLyogQUwgKi8KKwl7VVNCX0RFVklDRSgweDA1MEQsIDB4ODA1Myl9LAkvKiBCZWxraW4gKi8KKwl7VVNCX0RFVklDRSgweDE0QjIsIDB4M0MyMyl9LAkvKiBBaXJsaW5rICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjcpfSwJLyogQWlybGluayAqLworCXtVU0JfREVWSUNFKDB4MDdBQSwgMHgwMDJGKX0sCS8qIENvcmVnYSAqLworCXtVU0JfREVWSUNFKDB4MDdBQSwgMHgwMDNDKX0sCS8qIENvcmVnYSAqLworCXtVU0JfREVWSUNFKDB4MDdBQSwgMHgwMDNGKX0sCS8qIENvcmVnYSAqLworCXtVU0JfREVWSUNFKDB4MTA0NCwgMHg4MDBCKX0sCS8qIEdpZ2FieXRlICovCisJe1VTQl9ERVZJQ0UoMHgxNUE5LCAweDAwMDYpfSwJLyogU3BhcmtsYW4gKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4QjUyMil9LAkvKiBTTUMgKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4QTYxOCl9LAkvKiBTTUMgKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4ODUyMil9LAkvKiBBcmNhZHlhbiAqLworCXtVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTIyKX0sCS8qIEFyY2FkeWFuICovCisJe1VTQl9ERVZJQ0UoMHgwQ0RFLCAweDAwMjIpfSwJLyogWkNPTSAqLworCXtVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDE2KX0sCS8qIFp5eGVsICovCisJe1VTQl9ERVZJQ0UoMHgwQ0RFLCAweDAwMjUpfSwJLyogWnl4ZWwgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMSl9LAkvKiBFbkdlbml1cyAqLworCXtVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzAyKX0sCS8qIEVuR2VuaXVzICovCisJe1VTQl9ERVZJQ0UoMHgwNDcxLCAweDIwMGYpfSwJLyogUGhpbGlwcyAqLworCXtVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI1KX0sCS8qIERyYXl0ZWsgKi8KKwl7VVNCX0RFVklDRSgweDEzRDMsIDB4MzI0Nyl9LAkvKiBBenVyZVdhdmUgKi8KKwl7VVNCX0RFVklDRSgweDA4M0EsIDB4NjYxOCl9LAkvKiBBY2N0b24gKi8KKwl7VVNCX0RFVklDRSgweDE1YzUsIDB4MDAwOCl9LAkvKiBBbWl0ICovCisJe1VTQl9ERVZJQ0UoMHgwRTY2LCAweDAwMDEpfSwJLyogSGF3a2luZyAqLworCXtVU0JfREVWSUNFKDB4MEU2NiwgMHgwMDAzKX0sCS8qIEhhd2tpbmcgKi8KKwl7VVNCX0RFVklDRSgweDEyOUIsIDB4MTgyOCl9LAkvKiBTaWVtZW5zICovCisJe1VTQl9ERVZJQ0UoMHgxNTdFLCAweDMwMEUpfSwJLyogVS1NZWRpYSAqLworCXtVU0JfREVWSUNFKDB4MDUwZCwgMHg4MDVjKX0sCisJe1VTQl9ERVZJQ0UoMHgwNTBkLCAweDgxNWMpfSwKKwl7VVNCX0RFVklDRSgweDE0ODIsIDB4M0MwOSl9LAkvKiBBYm9jb20gKi8KKwl7VVNCX0RFVklDRSgweDE0QjIsIDB4M0MwOSl9LAkvKiBBbHBoYSAqLworCXtVU0JfREVWSUNFKDB4MDRFOCwgMHgyMDE4KX0sCS8qIHNhbXN1bmcgKi8KKwl7VVNCX0RFVklDRSgweDVBNTcsIDB4MDI4MCl9LAkvKiBaaW53ZWxsICovCisJe1VTQl9ERVZJQ0UoMHg1QTU3LCAweDAyODIpfSwJLyogWmlud2VsbCAqLworCXtVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzE4KX0sCisJe1VTQl9ERVZJQ0UoMHg3MzkyLCAweDc3MTcpfSwKKwl7VVNCX0RFVklDRSgweDE3MzcsIDB4MDA3MCl9LAkvKiBMaW5rc3lzIFdVU0IxMDAgKi8KKwl7VVNCX0RFVklDRSgweDE3MzcsIDB4MDA3MSl9LAkvKiBMaW5rc3lzIFdVU0I2MDBOICovCisJe1VTQl9ERVZJQ0UoMHgwNDExLCAweDAwZTgpfSwJLyogQnVmZmFsbyBXTEktVUMtRzMwME4gKi8KKwl7VVNCX0RFVklDRSgweDA1MGQsIDB4ODE1Yyl9LAkvKiBCZWxraW4gRjVEODA1MyAqLworI2VuZGlmIC8qIFJUMjg3MCAvLyAqLworI2lmZGVmIFJUMzA3MAorCXtVU0JfREVWSUNFKDB4MTQ4RiwgMHgzMDcwKX0sCS8qIFJhbGluayAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxNDhGLCAweDMwNzEpfSwJLyogUmFsaW5rIDMwNzEgKi8KKwl7VVNCX0RFVklDRSgweDE0OEYsIDB4MzA3Mil9LAkvKiBSYWxpbmsgMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MERCMCwgMHgzODIwKX0sCS8qIFJhbGluayAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwM0UpfSwJLyogU2l0ZWNvbSAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwNDIpfSwJLyogU2l0ZWNvbSAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMTIpfSwJLyogQUwgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MThDNSwgMHgwMDEyKX0sCS8qIENvcmVnYSAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwODNBLCAweDc1MTEpfSwJLyogQXJjYWR5YW4gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzAzKX0sCS8qIEVuR2VuaXVzIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDE3NDAsIDB4OTcwNSl9LAkvKiBFbkdlbml1cyAzMDcxICovCisJe1VTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDYpfSwJLyogRW5HZW5pdXMgMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MTNEMywgMHgzMjczKX0sCS8qIEF6dXJlV2F2ZSAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxMDQ0LCAweDgwMEQpfSwJLyogR2lnYWJ5dGUgR04tV0IzMkwgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MjAxOSwgMHhBQjI1KX0sCS8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiBSVDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDA3QjgsIDB4MzA3MCl9LAkvKiBBYm9Db20gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcxKX0sCS8qIEFib0NvbSAzMDcxICovCisJe1VTQl9ERVZJQ0UoMHgwN0I4LCAweDMwNzIpfSwJLyogQWJvY29tIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDczOTIsIDB4NzcxMSl9LAkvKiBFZGltYXggMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MUEzMiwgMHgwMzA0KX0sCS8qIFF1YW50YSAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxRURBLCAweDIzMTApfSwJLyogQWlyVGllcyAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMEEpfSwJLyogRC1MaW5rIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDA3RDEsIDB4M0MwRCl9LAkvKiBELUxpbmsgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4MDdEMSwgMHgzQzBFKX0sCS8qIEQtTGluayAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMEYpfSwJLyogRC1MaW5rIDMwNzAgKi8KKwl7VVNCX0RFVklDRSgweDFENEQsIDB4MDAwQyl9LAkvKiBQZWdhdHJvbiBDb3Jwb3JhdGlvbiAzMDcwICovCisJe1VTQl9ERVZJQ0UoMHgxRDRELCAweDAwMEUpfSwJLyogUGVnYXRyb24gQ29ycG9yYXRpb24gMzA3MCAqLworCXtVU0JfREVWSUNFKDB4NUE1NywgMHg1MjU3KX0sCS8qIFppbndlbGwgMzA3MCAqLworCXtVU0JfREVWSUNFKDB4NUE1NywgMHgwMjgzKX0sCS8qIFppbndlbGwgMzA3MiAqLworCXtVU0JfREVWSUNFKDB4MDRCQiwgMHgwOTQ1KX0sCS8qIEktTyBEQVRBIDMwNzIgKi8KKwl7VVNCX0RFVklDRSgweDIwM0QsIDB4MTQ4MCl9LAkvKiBFbmNvcmUgMzA3MCAqLworI2VuZGlmIC8qIFJUMzA3MCAvLyAqLworCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDNGKX0sCS8qIFNpdGVjb20gV0wtNjA4ICovCisJe1VTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzcpfSwJLyogTGlua3N5cyBXVVNCNTRHQy1FVSB2MyAqLworCXtVU0JfREVWSUNFKDB4MjAwMSwgMHgzQzA5KX0sCS8qIEQtTGluayAqLworCXtVU0JfREVWSUNFKDB4MjAwMSwgMHgzQzBBKX0sCS8qIEQtTGluayAzMDcyICovCisJe1VTQl9ERVZJQ0UoMHgyMDE5LCAweEVEMTQpfSwJLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworaW50IGNvbnN0IHJ0dXNiX3VzYl9pZF9sZW4gPQorICAgIHNpemVvZihydHVzYl91c2JfaWQpIC8gc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHJ0dXNiX3VzYl9pZCk7CisKK3N0YXRpYyB2b2lkIHJ0Mjg3MF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg3MF9wcm9iZShJTiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkgIElOIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQkJCSAgSU4gY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldl9pZCwKKwkJCQkgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiogcHBBZCk7CisKKyNpZm5kZWYgUEZfTk9GUkVFWkUKKyNkZWZpbmUgUEZfTk9GUkVFWkUgIDAKKyNlbmRpZgorCitleHRlcm4gaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitleHRlcm4gaW50IHJ0Mjh4eF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKKworc3RhdGljIEJPT0xFQU4gVVNCRGV2Q29uZmlnSW5pdChJTiBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkJCUlOIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCk7CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgQ2hlY2sgdGhlIGNoaXBzZXQgdmVuZG9yL3Byb2R1Y3QgSUQuCisKK0FyZ3VtZW50czoKKyAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisKK1JldHVybiBWYWx1ZToKKyAgICBUUlVFCQkJCUNoZWNrIG9rCisJRkFMU0UJCQkJQ2hlY2sgZmFpbAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworQk9PTEVBTiBSVDI4WFhDaGlwc2V0Q2hlY2soSU4gdm9pZCAqX2Rldl9wKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZfcCA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnR1c2JfdXNiX2lkX2xlbjsgaSsrKSB7CisJCWlmIChkZXZfcC0+ZGVzY3JpcHRvci5pZFZlbmRvciA9PSBydHVzYl91c2JfaWRbaV0uaWRWZW5kb3IgJiYKKwkJICAgIGRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCA9PSBydHVzYl91c2JfaWRbaV0uaWRQcm9kdWN0KSB7CisJCQlwcmludGsoInJ0Mjg3MDogaWRWZW5kb3IgPSAweCV4LCBpZFByb2R1Y3QgPSAweCV4XG4iLAorCQkJICAgICAgIGRldl9wLT5kZXNjcmlwdG9yLmlkVmVuZG9yLAorCQkJICAgICAgIGRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IHJ0dXNiX3VzYl9pZF9sZW4pIHsKKwkJcHJpbnRrKCJydDI4NzA6IEVycm9yISBEZXZpY2UgRGVzY3JpcHRvciBub3QgbWF0Y2hpbmchXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKnRlc3RlZCBmb3Iga2VybmVsIDIuNnNlcmllcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0Mjg3MF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCBydDI4NzBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKyNlbmRpZiAvKiBDT05GSUdfUE0gLy8gKi8KKworc3RhdGljIGludCBydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKKworc3RhdGljIEJPT0xFQU4gVVNCRGV2Q29uZmlnSW5pdChJTiBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkJCUlOIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXVuc2lnbmVkIGxvbmcgQnVsa091dElkeDsKKwl1MzIgaTsKKworCS8qIGdldCB0aGUgYWN0aXZlIGludGVyZmFjZSBkZXNjcmlwdG9yICovCisJaWZhY2VfZGVzYyA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCisJLyogZ2V0ICMgb2YgZW5wb2ludHMgICovCisJcEFkLT5OdW1iZXJPZlBpcGVzID0gaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkgKCJOdW1FbmRwb2ludHM9JWRcbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cykpOworCisJLyogQ29uZmlndXJlIFBpcGVzICovCisJQnVsa091dElkeCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcEFkLT5OdW1iZXJPZlBpcGVzOyBpKyspIHsKKwkJaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQorCQkgICAgIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspICYmCisJCSAgICAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcyAmCisJCSAgICAgIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikpIHsKKwkJCXBBZC0+QnVsa0luRXBBZGRyID0KKwkJCSAgICBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJCQlwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPQorCQkJICAgIGxlMmNwdTE2KGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuCisJCQkJICAgICB3TWF4UGFja2V0U2l6ZSk7CisKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkgICAgICgiQlVMSyBJTiBNYXhQYWNrZXRTaXplID0gJWRcbiIsCisJCQkJICAgICAgcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplKSk7CisJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJICAgICAoIkVQIGFkZHJlc3MgPSAweCUyeFxuIiwKKwkJCQkgICAgICBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLgorCQkJCSAgICAgIGJFbmRwb2ludEFkZHJlc3MpKTsKKwkJfSBlbHNlCisJCSAgICBpZiAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzID09CisJCQkgVVNCX0VORFBPSU5UX1hGRVJfQlVMSykKKwkJCSYmCisJCQkoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuCisJCQkgIGJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09CisJCQkgVVNCX0RJUl9PVVQpKSB7CisJCQkvKiB0aGVyZSBhcmUgNiBidWxrIG91dCBFUC4gRVA2IGhpZ2hlc3QgcHJpb3JpdHkuICovCisJCQkvKiBFUDEtNCBpcyBFRENBLiAgRVA1IGlzIEhDQ0EuICovCisJCQlwQWQtPkJ1bGtPdXRFcEFkZHJbQnVsa091dElkeCsrXSA9CisJCQkgICAgaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCQkJcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA9CisJCQkgICAgbGUyY3B1MTYoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy4KKwkJCQkgICAgIHdNYXhQYWNrZXRTaXplKTsKKworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJCVUxLIE9VVCBNYXhQYWNrZXRTaXplID0gJWRcbiIsCisJCQkJICAgICAgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkpOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAgICAgKCJFUCBhZGRyZXNzID0gMHglMnggIFxuIiwKKwkJCQkgICAgICBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLgorCQkJCSAgICAgIGJFbmRwb2ludEFkZHJlc3MpKTsKKwkJfQorCX0KKworCWlmICghKHBBZC0+QnVsa0luRXBBZGRyICYmIHBBZC0+QnVsa091dEVwQWRkclswXSkpIHsKKwkJcHJpbnRrCisJCSAgICAoIiVzOiBDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIiwKKwkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcEFkLT5jb25maWcgPSAmZGV2LT5jb25maWctPmRlc2M7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwQWQpOworCisJcmV0dXJuIFRSVUU7CisKK30KKworc3RhdGljIGludCBydHVzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwlpbnQgcnY7CisKKwlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWRldiA9IHVzYl9nZXRfZGV2KGRldik7CisKKwlydiA9IHJ0Mjg3MF9wcm9iZShpbnRmLCBkZXYsIGlkLCAmcEFkKTsKKwlpZiAocnYgIT0gMCkKKwkJdXNiX3B1dF9kZXYoZGV2KTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQ7CisKKwlwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKKwlydDI4NzBfZGlzY29ubmVjdChkZXYsIHBBZCk7Cit9CisKK3N0cnVjdCB1c2JfZHJpdmVyIHJ0dXNiX2RyaXZlciA9IHsKKwkubmFtZSA9ICJydDI4NzAiLAorCS5wcm9iZSA9IHJ0dXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gcnR1c2JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPSBydHVzYl91c2JfaWQsCisKKyNpZmRlZiBDT05GSUdfUE0KK3N1c3BlbmQ6cnQyODcwX3N1c3BlbmQsCityZXN1bWU6cnQyODcwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworI2lmZGVmIENPTkZJR19QTQorCit2b2lkIFJUMjg3MFJlamVjdFBlbmRpbmdQYWNrZXRzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKK3sKKwkvKiBjbGVhciBQUyBwYWNrZXRzICovCisJLyogY2xlYXIgVHhTdyBwYWNrZXRzICovCit9CisKK3N0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwlzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfc3VzcGVuZCgpXG4iKSk7CisJbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOworCisJcEFkLT5QTV9GbGdTdXNwZW5kID0gMTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRfZGV2KSkgeworCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKKwkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa091dElSUChwQWQpOworCX0KKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg3MF9zdXNwZW5kKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDI4NzBfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IHJ0Mjg3MF9yZXN1bWUoKVxuIikpOworCisJcEFkLT5QTV9GbGdTdXNwZW5kID0gMDsKKwluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0X2Rldik7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7CisJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfcmVzdW1lKClcbiIpKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gLy8gKi8KKworLyogSW5pdCBkcml2ZXIgbW9kdWxlICovCitpbnQgX19pbml0IHJ0dXNiX2luaXQodm9pZCkKK3sKKwlwcmludGsoInJ0dXNiIGluaXQgLS0tPlxuIik7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKK30KKworLyogRGVpbml0IGRyaXZlciBtb2R1bGUgKi8KK3ZvaWQgX19leGl0IHJ0dXNiX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmcnR1c2JfZHJpdmVyKTsKKwlwcmludGsoIjwtLS0gcnR1c2IgZXhpdFxuIik7Cit9CisKK21vZHVsZV9pbml0KHJ0dXNiX2luaXQpOworbW9kdWxlX2V4aXQocnR1c2JfZXhpdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisvKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMJCQkJCQkJCQkJCQkqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUm91dGluZSBEZXNjcmlwdGlvbjoKKyAgICBNTE1FIGtlcm5lbCB0aHJlYWQuCisKK0FyZ3VtZW50czoKKwkqQ29udGV4dAkJCXRoZSBwQWQsIGRyaXZlciBjb250cm9sIGJsb2NrIHBvaW50ZXIKKworUmV0dXJuIFZhbHVlOgorICAgIDAJCQkJCWNsb3NlIHRoZSB0aHJlYWQKKworTm90ZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBNbG1lVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrOworCWludCBzdGF0dXM7CisJc3RhdHVzID0gMDsKKworCXBUYXNrID0gKHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKilDb250ZXh0OworCXBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopcFRhc2stPnByaXY7CisKKwlSdG1wT1NUYXNrQ3VzdG9taXplKHBUYXNrKTsKKworCXdoaWxlICghcFRhc2stPnRhc2tfa2lsbGVkKSB7CisjaWZkZWYgS1RIUkVBRF9TVVBQT1JUCisJCVJUTVBfV0FJVF9FVkVOVF9JTlRFUlJVUFRJQkxFKHBBZCwgcFRhc2spOworI2Vsc2UKKwkJUlRNUF9TRU1fRVZFTlRfV0FJVCgmKHBUYXNrLT50YXNrU2VtYSksIHN0YXR1cyk7CisKKwkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgLCBuZWVkIHRvIGNoZWNrIGlmIHJlcXVpcmVkICovCisJCS8qZG93bigmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOyAqLworCisJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQorCQkJTWxtZUhhbmRsZXIocEFkKTsKKwl9CisKKwkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93CisJICoKKwkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAorCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCisJICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAorCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgorCSAqIGNhc2UuCisJICoKKwkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCisJICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKKwkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93CisJICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgorCSAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS0lc1xuIiwgX19GVU5DVElPTl9fKSk7CisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCWNvbXBsZXRlX2FuZF9leGl0KCZwVGFzay0+dGFza0NvbXBsZXRlLCAwKTsKKyNlbmRpZgorCXJldHVybiAwOworCit9CisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JvdXRpbmUgRGVzY3JpcHRpb246CisgICAgVVNCIGNvbW1hbmQga2VybmVsIHRocmVhZC4KKworQXJndW1lbnRzOgorCSpDb250ZXh0CQkJdGhlIHBBZCwgZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgorCitSZXR1cm4gVmFsdWU6CisgICAgMAkJCQkJY2xvc2UgdGhlIHRocmVhZAorCitOb3RlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworaW50IFJUVVNCQ21kVGhyZWFkKElOIHZvaWQgKkNvbnRleHQpCit7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKnBUYXNrOworCWludCBzdGF0dXM7CisJc3RhdHVzID0gMDsKKworCXBUYXNrID0gKHN0cnVjdCBydF9ydG1wX29zX3Rhc2sgKilDb250ZXh0OworCXBBZCA9IChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICopcFRhc2stPnByaXY7CisKKwlSdG1wT1NUYXNrQ3VzdG9taXplKHBUYXNrKTsKKworCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCXBBZC0+Q21kUS5DbWRRU3RhdGUgPSBSVE1QX1RBU0tfU1RBVF9SVU5OSU5HOworCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCisJd2hpbGUgKHBBZCAmJiBwQWQtPkNtZFEuQ21kUVN0YXRlID09IFJUTVBfVEFTS19TVEFUX1JVTk5JTkcpIHsKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwkJUlRNUF9XQUlUX0VWRU5UX0lOVEVSUlVQVElCTEUocEFkLCBwVGFzayk7CisjZWxzZQorCQkvKiBsb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJUlRNUF9TRU1fRVZFTlRfV0FJVCgmKHBUYXNrLT50YXNrU2VtYSksIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKworCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSA9PSBSVE1QX1RBU0tfU1RBVF9TVE9QRUQpCisJCQlicmVhazsKKworCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKKwkJCUNNREhhbmRsZXIocEFkKTsKKwl9CisKKwlpZiAocEFkICYmICFwQWQtPlBNX0ZsZ1N1c3BlbmQpIHsJLyogQ2xlYXIgdGhlIENtZFFFbGVtZW50cy4gKi8KKwkJc3RydWN0IHJ0X2NtZHFlbG10ICpwQ21kUUVsbXQgPSBOVUxMOworCisJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlRNUF9UQVNLX1NUQVRfU1RPUEVEOworCQl3aGlsZSAocEFkLT5DbWRRLnNpemUpIHsKKwkJCVJUVVNCRGVxdWV1ZUNtZCgmcEFkLT5DbWRRLCAmcENtZFFFbG10KTsKKwkJCWlmIChwQ21kUUVsbXQpIHsKKwkJCQlpZiAocENtZFFFbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKSB7CisJCQkJCWlmIChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCQkJb3NfZnJlZV9tZW0ocEFkLAorCQkJCQkJCSAgICBwQ21kUUVsbXQtPmJ1ZmZlcik7CisJCQkJCW9zX2ZyZWVfbWVtKHBBZCwgKHU4ICopcENtZFFFbG10KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKHBDbWRRRWxtdC0+YnVmZmVyICE9IE5VTEwpCisJCQkJCSAgICAmJiAocENtZFFFbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCisJCQkJCQlvc19mcmVlX21lbShwQWQsCisJCQkJCQkJICAgIHBDbWRRRWxtdC0+YnVmZmVyKTsKKwkJCQkJb3NfZnJlZV9tZW0ocEFkLCAodTggKilwQ21kUUVsbXQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOworCX0KKwkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93CisJICoKKwkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAorCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCisJICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAorCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgorCSAqIGNhc2UuCisJICoKKwkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCisJICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKKwkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KKwkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93CisJICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgorCSAqLworCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SVFVTQkNtZFRocmVhZFxuIikpOworCisjaWZuZGVmIEtUSFJFQURfU1VQUE9SVAorCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOworCWNvbXBsZXRlX2FuZF9leGl0KCZwVGFzay0+dGFza0NvbXBsZXRlLCAwKTsKKyNlbmRpZgorCXJldHVybiAwOworCit9CisKK3ZvaWQgUlRVU0JXYXRjaERvZyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlpbnQgaWR4OworCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7CisJUFVSQiBwVXJiOworCUJPT0xFQU4gbmVlZER1bXBTZXEgPSBGQUxTRTsKKwl1MzIgTUFDVmFsdWU7CisJdTMyIFR4UnhRX1BjbnQ7CisKKwlpZHggPSAwOworCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKKwlpZiAoKE1BQ1ZhbHVlICYgMHhmZikgIT0gMCkgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlRYIFFVRVVFIDAgTm90IEVNUFRZKFZhbHVlPTB4JTB4KSFcbiIsCisJCQkgIE1BQ1ZhbHVlKSk7CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDEyKTsKKwkJd2hpbGUgKChNQUNWYWx1ZSAmIDB4ZmYpICE9IDAgJiYgKGlkeCsrIDwgMTApKSB7CisJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7CisJCQlSVE1QdXNlY0RlbGF5KDEpOworCQl9CisJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9DRkcsIDB4ZjQwMDA2KTsKKwl9CisKKwlpZiAocEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPj0gMikgeworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIk1heWJlIHRoZSBSeCBCdWxrLUluIGhhbmdlZCEgQ2FuY2VsIHRoZSBwZW5kaW5nIFJ4IGJ1bGtzIHJlcXVlc3QhXG4iKSk7CisJCWlmICgoIVJUTVBfVEVTVF9GTEFHCisJCSAgICAgKHBBZCwKKwkJICAgICAgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAorCQkgICAgICAgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAorCQkgICAgICAgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKKwkJICAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkgeworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiQ2FsbCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiB0byBjYW5jZWwgdGhlIHBlbmRpbmcgUnggQnVsayFcbiIpKTsKKwkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOLAorCQkJCQkJTlVMTCwgMCk7CisJCQluZWVkRHVtcFNlcSA9IFRSVUU7CisJCX0KKwkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOworCX0KKworCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgMHg0MzgsICZUeFJ4UV9QY250KTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgTlVNX09GX1RYX1JJTkc7IGlkeCsrKSB7CisJCXBVcmIgPSBOVUxMOworCisJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOworCQlpZiAoKHBBZC0+QnVsa091dFBlbmRpbmdbaWR4XSA9PSBUUlVFKQorCQkgICAgJiYgcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudCkgeworCQkJaW50IGFjdHVhbF9sZW5ndGggPSAwLCB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMDsKKwkJCUJPT0xFQU4gaXNEYXRhUGFja2V0ID0gRkFMU0U7CisJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0rKzsKKworCQkJaWYgKChwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W2lkeF0gPiAyKSAmJgorCQkJICAgICghUlRNUF9URVNUX0ZMQUcKKwkJCSAgICAgKHBBZCwKKwkJCSAgICAgIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKKwkJCSAgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAorCQkJICAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCB8CisJCQkgICAgICAgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCisJCQkgICAgKSB7CisJCQkJLyogRklYTUU6IEZvbGxvd2luZyBjb2RlIGp1c3Qgc3VwcG9ydCBzaW5nbGUgYnVsayBvdXQuIElmIHlvdSB3YW5uYSBzdXBwb3J0IG11bHRpcGxlIGJ1bGsgb3V0LiBNb2RpZnkgaXQhICovCisJCQkJcEhUVFhDb250ZXh0ID0KKwkJCQkgICAgKHN0cnVjdCBydF9odF90eF9jb250ZXh0ICopKCZwQWQtPlR4Q29udGV4dFtpZHhdKTsKKwkJCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nKSB7CS8qIENoZWNrIFR4Q29udGV4dC4gKi8KKwkJCQkJcFVyYiA9IHBIVFRYQ29udGV4dC0+cFVyYjsKKworCQkJCQlhY3R1YWxfbGVuZ3RoID0gcFVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJCQkJdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCQkJCSAgICBwVXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCQkJCQlpc0RhdGFQYWNrZXQgPSBUUlVFOworCQkJCX0gZWxzZSBpZiAoaWR4ID09IE1HTVRQSVBFSURYKSB7CisJCQkJCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQsICpwTlVMTENvbnRleHQsCisJCQkJCSAgICAqcFBzUG9sbENvbnRleHQ7CisKKwkJCQkJLypDaGVjayBNZ210Q29udGV4dC4gKi8KKwkJCQkJcE1MTUVDb250ZXh0ID0KKwkJCQkJICAgIChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKShwQWQtPk1nbXRSaW5nLgorCQkJCQkJCSAgIENlbGxbcEFkLT5NZ210UmluZy4KKwkJCQkJCQkJVHhEbWFJZHhdLgorCQkJCQkJCSAgIEFsbG9jVmEpOworCQkJCQlwUHNQb2xsQ29udGV4dCA9CisJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikoJnBBZC0+UHNQb2xsQ29udGV4dCk7CisJCQkJCXBOVUxMQ29udGV4dCA9CisJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikoJnBBZC0+TnVsbENvbnRleHQpOworCisJCQkJCWlmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpIHsKKwkJCQkJCUFTU0VSVChwTUxNRUNvbnRleHQtPgorCQkJCQkJICAgICAgIElSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKKwkJCQkJfSBlbHNlIGlmIChwTlVMTENvbnRleHQtPklSUFBlbmRpbmcpIHsKKwkJCQkJCUFTU0VSVChwTlVMTENvbnRleHQtPgorCQkJCQkJICAgICAgIElSUFBlbmRpbmcpOworCQkJCQkJcFVyYiA9IHBOVUxMQ29udGV4dC0+cFVyYjsKKwkJCQkJfSBlbHNlIGlmIChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZykgeworCQkJCQkJQVNTRVJUKHBQc1BvbGxDb250ZXh0LT4KKwkJCQkJCSAgICAgICBJUlBQZW5kaW5nKTsKKwkJCQkJCXBVcmIgPSBwUHNQb2xsQ29udGV4dC0+cFVyYjsKKwkJCQkJfQorCQkJCX0KKworCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLAorCQkJCQkJaXJxRmxhZ3MpOworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJWQ6JWx1IExUTD0lZCAsIFRMPSVkIEw6JWRcbiIsCisJCQkJICAgICAgIGlkeCwgcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdLAorCQkJCSAgICAgICBwQWQtPlRyYW5zZmVyZWRMZW5ndGhbaWR4XSwKKwkJCQkgICAgICAgYWN0dWFsX2xlbmd0aCwgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisKKwkJCQlpZiAocFVyYikgeworCQkJCQlpZiAoKGlzRGF0YVBhY2tldAorCQkJCQkgICAgICYmIHBBZC0+VHJhbnNmZXJlZExlbmd0aFtpZHhdID09CisJCQkJCSAgICAgYWN0dWFsX2xlbmd0aAorCQkJCQkgICAgICYmIHBBZC0+VHJhbnNmZXJlZExlbmd0aFtpZHhdIDwKKwkJCQkJICAgICB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoCisJCQkJCSAgICAgJiYgYWN0dWFsX2xlbmd0aCAhPSAwCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVHhSeFFfUGNudD09MCAqLworCQkJCQkgICAgICYmIHBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbaWR4XSA+CisJCQkJCSAgICAgMykKKwkJCQkJICAgIHx8IGlzRGF0YVBhY2tldCA9PSBGQUxTRQorCQkJCQkgICAgfHwgcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdID4KKwkJCQkJICAgIDYpIHsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAoIk1heWJlIHRoZSBUeCBCdWxrLU91dCBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBUeCBidWxrcyByZXF1ZXN0IG9mIGlkeCglZCkhXG4iLAorCQkJCQkJCSAgaWR4KSk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJVbmxpbmsgdGhlIHBlbmRpbmcgVVJCIVxuIikpOworCQkJCQkJLyogdW5saW5rIGl0IG5vdyAqLworCQkJCQkJUlRVU0JfVU5MSU5LX1VSQihwVXJiKTsKKwkJCQkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY29uZHMgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrICovCisJCQkJCQkvKlJUTVB1c2VjRGVsYXkoMjAwKTsgKi8KKwkJCQkJCW5lZWREdW1wU2VxID0gVFJVRTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJICgiVW5rbm93biBidWxrT3V0IFVSQiBtYXliZSBoYW5nZWQhXG4iKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwKKwkJCQkJCWlycUZsYWdzKTsKKwkJCX0KKworCQkJaWYgKGlzRGF0YVBhY2tldCA9PSBUUlVFKQorCQkJCXBBZC0+VHJhbnNmZXJlZExlbmd0aFtpZHhdID0gYWN0dWFsX2xlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tpZHhdLCBpcnFGbGFncyk7CisJCX0KKwl9CisKKwkvKiBGb3IgU2lnbWEgZGVidWcsIGR1bXAgdGhlIGJhX3Jlb3JkZXJpbmcgc2VxdWVuY2UuICovCisJaWYgKChuZWVkRHVtcFNlcSA9PSBUUlVFKSAmJiAocEFkLT5Db21tb25DZmcuYkRpc2FibGVSZW9yZGVyaW5nID09IDApKSB7CisJCXUxNiBJZHg7CisJCXN0cnVjdCBydF9iYV9yZWNfZW50cnkgKnBCQUVudHJ5ID0gTlVMTDsKKwkJdTggY291bnQgPSAwOworCQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKKworCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkJBUmVjV2NpZEFycmF5WzBdOworCisJCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07CisJCWlmICgocEJBRW50cnktPmxpc3QucWxlbiA+IDApICYmIChwQkFFbnRyeS0+bGlzdC5uZXh0ICE9IE5VTEwpKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJOSUNVcGRhdGVSYXdDb3VudGVycygpOlRoZSBRdWV1ZWluZyBwa3QgaW4gcmVvcmRlcmluZyBidWZmZXI6XG4iKSk7CisJCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQkFFbnRyeS0+UnhSZVJpbmdMb2NrKTsKKwkJCW1wZHVfYmxrID0gcEJBRW50cnktPmxpc3QubmV4dDsKKwkJCXdoaWxlIChtcGR1X2JsaykgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgKCJcdCVkOlNlcS0lZCwgYkFNU0RVLSVkIVxuIiwgY291bnQsCisJCQkJCSAgbXBkdV9ibGstPlNlcXVlbmNlLAorCQkJCQkgIG1wZHVfYmxrLT5iQU1TRFUpKTsKKwkJCQltcGR1X2JsayA9IG1wZHVfYmxrLT5uZXh0OworCQkJCWNvdW50Kys7CisJCQl9CisKKwkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCSAoIlxucEJBRW50cnktPkxhc3RJbmRTZXE9JWQhXG4iLAorCQkJCSAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKKwkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOworCQl9CisJfQorfQorCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitSb3V0aW5lIERlc2NyaXB0aW9uOgorICAgIFJlbGVhc2UgYWxsb2NhdGVkIHJlc291cmNlcy4KKworQXJndW1lbnRzOgorICAgICpkZXYJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCisJcEFkCQkJCQlkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCisKK1JldHVybiBWYWx1ZToKKyAgICBOb25lCisKK05vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitzdGF0aWMgdm9pZCBydDI4NzBfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCit7CisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCSAoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHVucmVnaXN0ZXIgdXNibmV0IHVzYi0lcy0lc1xuIiwKKwkJICBkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+ZGV2cGF0aCkpOworCWlmICghcEFkKSB7CisJCXVzYl9wdXRfZGV2KGRldik7CisJCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogcEFkID09IE5VTEwhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKTsKKworCS8qIGZvciBkZWJ1Zywgd2FpdCB0byBzaG93IHNvbWUgbWVzc2FnZXMgdG8gL3Byb2Mgc3lzdGVtICovCisJdWRlbGF5KDEpOworCisJUnRtcFBoeU5ldERldkV4aXQocEFkLCBwQWQtPm5ldF9kZXYpOworCisJLyogRklYTUU6IFNoYWxsIHdlIG5lZWQgZm9sbG93aW5nIGRlbGF5IGFuZCBmbHVzaCB0aGUgc2NoZWR1bGU/PyAqLworCXVkZWxheSgxKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXVkZWxheSgxKTsKKworCS8qIGZyZWUgdGhlIHJvb3QgbmV0X2RldmljZSAqLworCVJ0bXBPU05ldERldkZyZWUocEFkLT5uZXRfZGV2KTsKKworCVJ0bXBSYURldkN0cmxFeGl0KHBBZCk7CisKKwkvKiByZWxlYXNlIGEgdXNlIG9mIHRoZSB1c2IgZGV2aWNlIHN0cnVjdHVyZSAqLworCXVzYl9wdXRfZGV2KGRldik7CisJdWRlbGF5KDEpOworCisJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIFJUVVNCIGRpc2Nvbm5lY3Qgc3VjY2Vzc2Z1bGx5XG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0Mjg3MF9wcm9iZShJTiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkgIElOIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQkJCSAgSU4gY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmRldl9pZCwKKwkJCQkgIHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKiogcHBBZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IE5VTEw7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkID0gKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKilOVUxMOworCWludCBzdGF0dXMsIHJ2OworCXZvaWQgKmhhbmRsZTsKKwlzdHJ1Y3QgcnRfcnRtcF9vc19uZXRkZXZfb3BfaG9vayBuZXREZXZIb29rOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0Mjg3MF9wcm9iZSgpIVxuIikpOworCisJLyogQ2hlY2sgY2hpcHNldCB2ZW5kb3IvcHJvZHVjdCBJRCAqLworCS8qaWYgKFJUMjhYWENoaXBzZXRDaGVjayhfZGV2X3ApID09IEZBTFNFKSAqLworCS8qICAgICAgZ290byBlcnJfb3V0OyAqLworCisvKlJ0bXBEZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisJLyogQWxsb2NhdGUgc3RydWN0IHJ0X3J0bXBfYWRhcHRlciBhZGFwdGVyIHN0cnVjdHVyZSAqLworCWhhbmRsZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvc19jb29raWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGFuZGxlID09IE5VTEwpIHsKKwkJcHJpbnRrCisJCSAgICAoInJ0Mjg3MF9wcm9iZSgpOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG9zIGhhbmRsZSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCSgoc3RydWN0IG9zX2Nvb2tpZSAqKWhhbmRsZSktPnBVc2JfRGV2ID0gdXNiX2RldjsKKworCXJ2ID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7CisJaWYgKHJ2ICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJa2ZyZWUoaGFuZGxlKTsKKwkJZ290byBlcnJfb3V0OworCX0KKy8qVVNCRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwlpZiAoVVNCRGV2Q29uZmlnSW5pdCh1c2JfZGV2LCBpbnRmLCBwQWQpID09IEZBTFNFKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yYWRldjsKKworCVJ0bXBSYURldkN0cmxJbml0KHBBZCwgUlRNUF9ERVZfSU5GX1VTQik7CisKKy8qTmV0RGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwluZXRfZGV2ID0gUnRtcFBoeU5ldERldkluaXQocEFkLCAmbmV0RGV2SG9vayk7CisJaWYgKG5ldF9kZXYgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmFkZXY7CisKKwkvKiBIZXJlIGFyZSB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgd2l0aCB1c2Igc3BlY2lmaWMgcGFyYW1ldGVycy4gKi8KKwkvKiBmb3Igc3VwcG9ydGluZyBOZXR3b3JrIE1hbmFnZXIuCisJICogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZSBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwKKwkgKiBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorCSAqLworCVNFVF9ORVRERVZfREVWKG5ldF9kZXYsICYodXNiX2Rldi0+ZGV2KSk7CisKKwlwQWQtPlN0YUNmZy5PcmlEZXZUeXBlID0gbmV0X2Rldi0+dHlwZTsKKworLypBbGwgZG9uZSwgaXQncyB0aW1lIHRvIHJlZ2lzdGVyIHRoZSBuZXQgZGV2aWNlIHRvIGxpbnV4IGtlcm5lbC4gKi8KKwkvKiBSZWdpc3RlciB0aGlzIGRldmljZSAqLworCXN0YXR1cyA9IFJ0bXBPU05ldERldkF0dGFjaChuZXRfZGV2LCAmbmV0RGV2SG9vayk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisKKyNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwQWQtPm1sbWVUYXNrLmt0aHJlYWRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcEFkLT50aW1lclRhc2sua3RocmVhZF9xKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwQWQtPmNtZFFUYXNrLmt0aHJlYWRfcSk7CisjZW5kaWYKKworCSpwcEFkID0gcEFkOworCisJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PXJ0Mjg3MF9wcm9iZSgpIVxuIikpOworCisJcmV0dXJuIDA7CisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRVJST1IgSEFORExFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXJyX291dF9mcmVlX25ldGRldjoKKwlSdG1wT1NOZXREZXZGcmVlKG5ldF9kZXYpOworCitlcnJfb3V0X2ZyZWVfcmFkZXY6CisJUlRNUEZyZWVBZGFwdGVyKHBBZCk7CisKK2Vycl9vdXQ6CisJKnBwQWQgPSBOVUxMOworCisJcmV0dXJuIC0xOworCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg2MC93cGEuaAppbmRleCA3MDA2ZTM4Li42MTk5YWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODYwL3dwYS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NjAvd3BhLmgKQEAgLTM4LDcgKzM4LDcgQEAKICNpZm5kZWYJX19XUEFfSF9fCiAjZGVmaW5lCV9fV1BBX0hfXwogCi0vLyBFQVBPTCBLZXkgZGVzY3JpcHRlciBmcmFtZSBmb3JtYXQgcmVsYXRlZCBsZW5ndGgKKy8qIEVBUE9MIEtleSBkZXNjcmlwdGVyIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aCAqLwogI2RlZmluZSBMRU5fS0VZX0RFU0NfTk9OQ0UJCQkzMgogI2RlZmluZSBMRU5fS0VZX0RFU0NfSVYJCQkJMTYKICNkZWZpbmUgTEVOX0tFWV9ERVNDX1JTQwkJCTgKQEAgLTQ2LDM5ICs0NiwzOCBAQAogI2RlZmluZSBMRU5fS0VZX0RFU0NfUkVQTEFZCQkJOAogI2RlZmluZSBMRU5fS0VZX0RFU0NfTUlDCQkJMTYKIAotLy8gVGhlIGxlbmd0aCBpcyB0aGUgRUFQb0wtS2V5IGZyYW1lIGV4Y2VwdCBrZXkgZGF0YSBmaWVsZC4KLS8vIFBsZWFzZSByZWZlciB0byA4MDIuMTFpLTIwMDQgLEZpZ3VyZSA0M3UgaW4gcC43OAotI2RlZmluZSBMRU5fRUFQT0xfS0VZX01TRwkJCShzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSkKKy8qIFRoZSBsZW5ndGggaXMgdGhlIEVBUG9MLUtleSBmcmFtZSBleGNlcHQga2V5IGRhdGEgZmllbGQuICovCisvKiBQbGVhc2UgcmVmZXIgdG8gODAyLjExaS0yMDA0ICxGaWd1cmUgNDN1IGluIHAuNzggKi8KKyNkZWZpbmUgTEVOX0VBUE9MX0tFWV9NU0cJCQkoc2l6ZW9mKHN0cnVjdCBydF9rZXlfZGVzY3JpcHRlcikgLSBNQVhfTEVOX09GX1JTTklFKQogCi0vLyBFQVAgQ29kZSBUeXBlLgorLyogRUFQIENvZGUgVHlwZS4gKi8KICNkZWZpbmUgRUFQX0NPREVfUkVRVUVTVAkxCiAjZGVmaW5lIEVBUF9DT0RFX1JFU1BPTlNFCTIKICNkZWZpbmUgRUFQX0NPREVfU1VDQ0VTUyAgICAzCiAjZGVmaW5lIEVBUF9DT0RFX0ZBSUxVUkUgICAgNAogCi0vLyBFQVBPTCBmcmFtZSBQcm90b2NvbCBWZXJzaW9uCisvKiBFQVBPTCBmcmFtZSBQcm90b2NvbCBWZXJzaW9uICovCiAjZGVmaW5lCUVBUE9MX1ZFUgkJCQkJMQogI2RlZmluZQlFQVBPTF9WRVIyCQkJCQkyCiAKLS8vIEVBUE9MLUtFWSBEZXNjcmlwdG9yIFR5cGUKKy8qIEVBUE9MLUtFWSBEZXNjcmlwdG9yIFR5cGUgKi8KICNkZWZpbmUJV1BBMV9LRVlfREVTQwkJCQkweGZlCiAjZGVmaW5lIFdQQTJfS0VZX0RFU0MgICAgICAgICAgICAgICAweDAyCiAKLS8vIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gb2YgS2V5IEluZm9ybWF0aW9uCisvKiBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIG9mIEtleSBJbmZvcm1hdGlvbiAqLwogI2RlZmluZQlERVNDX1RZUEVfVEtJUAkJCQkxCiAjZGVmaW5lCURFU0NfVFlQRV9BRVMJCQkJMgotI2RlZmluZSBERVNDX1RZUEVfTUVTSAkJCQkzCiAKICNkZWZpbmUgTEVOX01TRzFfMldBWSAgICAgICAgICAgICAgIDB4N2YKICNkZWZpbmUgTUFYX0xFTl9PRl9FQVBfSFMgICAgICAgICAgIDI1NgogCiAjZGVmaW5lIExFTl9NQVNURVJfS0VZCQkJCTMyCiAKLS8vIEVBUE9MIEVLLCBNSworLyogRUFQT0wgRUssIE1LICovCiAjZGVmaW5lIExFTl9FQVBfRUsJCQkJCTE2CiAjZGVmaW5lIExFTl9FQVBfTUlDSwkJCQkxNgogI2RlZmluZSBMRU5fRUFQX0tFWQkJCQkJKChMRU5fRUFQX0VLKSsoTEVOX0VBUF9NSUNLKSkKLS8vIFRLSVAga2V5IHJlbGF0ZWQKKy8qIFRLSVAga2V5IHJlbGF0ZWQgKi8KICNkZWZpbmUgTEVOX1BNS0lECQkJCQkxNgogI2RlZmluZSBMRU5fVEtJUF9FSwkJCQkJMTYKICNkZWZpbmUgTEVOX1RLSVBfUlhNSUNLCQkJCTgKQEAgLTkwLDEyICs4OSwxOCBAQAogI2RlZmluZSBUS0lQX0FQX1JYTUlDS19PRkZTRVQJCShUS0lQX0FQX1RYTUlDS19PRkZTRVQrTEVOX1RLSVBfVFhNSUNLKQogI2RlZmluZSBUS0lQX0dUS19MRU5HVEgJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCiAjZGVmaW5lIExFTl9QVEsJCQkJCQkoKExFTl9FQVBfS0VZKSsoTEVOX1RLSVBfS0VZKSkKKyNkZWZpbmUgTUlOX0xFTl9PRl9HVEsJCQkJNQorI2RlZmluZSBMRU5fUE1LCQkJCQkJMzIKKyNkZWZpbmUgTEVOX1BNS19OQU1FCQkJCTE2CisjZGVmaW5lIExFTl9OT05DRQkJCQkJMzIKIAotLy8gUlNOIElFIExlbmd0aCBkZWZpbml0aW9uCi0jZGVmaW5lIE1BWF9MRU5fT0ZfUlNOSUUgICAgICAgICAJOTAKKy8qIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbiAqLworI2RlZmluZSBNQVhfTEVOX09GX1JTTklFCQkyNTUKICNkZWZpbmUgTUlOX0xFTl9PRl9SU05JRSAgICAgICAgIAk4CiAKLS8vRUFQIFBhY2tldCBUeXBlCisjZGVmaW5lIEtFWV9MSUZFVElNRQkJCQkzNjAwCisKKy8qRUFQIFBhY2tldCBUeXBlICovCiAjZGVmaW5lCUVBUFBhY2tldAkJMAogI2RlZmluZQlFQVBPTFN0YXJ0CQkxCiAjZGVmaW5lCUVBUE9MTG9nb2ZmCQkyCkBAIC0xMTQsMTEgKzExOSwzMyBAQAogI2RlZmluZSBQQUlSV0lTRUtFWQkJCQkJMQogI2RlZmluZSBHUk9VUEtFWQkJCQkJMAogCi0vLyBSZXRyeSB0aW1lciBjb3VudGVyIGluaXRpYWwgdmFsdWUKKy8qIFJldHJ5IHRpbWVyIGNvdW50ZXIgaW5pdGlhbCB2YWx1ZSAqLwogI2RlZmluZSBQRUVSX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAwCiAjZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDEwCiAjZGVmaW5lIEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgIDIwCiAKKy8qI2lmZGVmIENPTkZJR19BUF9TVVBQT1JUICovCisvKiBXUEEgbWVjaGFuaXNtIHJldHJ5IHRpbWVyIGludGVydmFsICovCisjZGVmaW5lIFBFRVJfTVNHMV9SRVRSWV9FWEVDX0lOVFYgICAgICAgICAgIDEwMDAJLyogMSBzZWMgKi8KKyNkZWZpbmUgUEVFUl9NU0czX1JFVFJZX0VYRUNfSU5UViAgICAgICAgICAgMzAwMAkvKiAzIHNlYyAqLworI2RlZmluZSBHUk9VUF9LRVlfVVBEQVRFX0VYRUNfSU5UViAgICAgICAgICAxMDAwCS8qIDEgc2VjICovCisjZGVmaW5lIFBFRVJfR1JPVVBfS0VZX1VQREFURV9JTklWCQkJMjAwMAkvKiAyIHNlYyAqLworCisjZGVmaW5lIEVOUVVFVUVfRUFQT0xfU1RBUlRfVElNRVIJCQkyMDAJLyogMjAwIG1zICovCisKKy8qIGdyb3VwIHJla2V5IGludGVydmFsICovCisjZGVmaW5lIFRJTUVfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEtUX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBESVNBQkxFX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBNQVhfUkVLRVlfSU5URVIgICAgICAgICAgICAgICAgICAgICAweDNmZmZmZmYKKy8qI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vICovCisKKyNkZWZpbmUgR1JPVVBfU1VJVEUJCQkJCTAKKyNkZWZpbmUgUEFJUldJU0VfU1VJVEUJCQkJMQorI2RlZmluZSBBS01fU1VJVEUJCQkJCTIKKyNkZWZpbmUgUE1LSURfTElTVAkJCQkJMwogCiAjZGVmaW5lIEVBUE9MX1NUQVJUX0RJU0FCTEUJCQkJCTAKICNkZWZpbmUgRUFQT0xfU1RBUlRfUFNLCQkJCQkJMQpAQCAtMTI5LDEyICsxNTYsMzMgQEAKICNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oeCkgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCiAjZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oeCkgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKQogCisjaWZuZGVmIFJPVU5EX1VQCiAjZGVmaW5lIFJPVU5EX1VQKF9feCwgX195KSBcCi0JKCgoVUxPTkcpKChfX3gpKygoX195KS0xKSkpICYgKChVTE9ORyl+KChfX3kpLTEpKSkKKwkoKCh1bnNpZ25lZCBsb25nKSgoX194KSsoKF9feSktMSkpKSAmICgodW5zaWduZWQgbG9uZyl+KChfX3kpLTEpKSkKKyNlbmRpZgorCisjZGVmaW5lCVNFVF91MTZfVE9fQVJSQVJZKF9WLCBfTEVOKQkJXAorewkJCQkJCQkJCQkJXAorCV9WWzBdID0gKF9MRU4gJiAweEZGMDApID4+IDg7CQkJXAorCV9WWzFdID0gKF9MRU4gJiAweEZGKTsJCQkJCVwKK30KKworI2RlZmluZQlJTkNfdTE2X1RPX0FSUkFSWShfViwgX0xFTikJCQlcCit7CQkJCQkJCQkJCQkJXAorCXUxNgl2YXJfbGVuOwkJCQkJCQlcCisJCQkJCQkJCQkJCQlcCisJdmFyX2xlbiA9IChfVlswXTw8OCkgfCAoX1ZbMV0pOwkJCQlcCisJdmFyX2xlbiArPSBfTEVOOwkJCQkJCQlcCisJCQkJCQkJCQkJCQlcCisJX1ZbMF0gPSAodmFyX2xlbiAmIDB4RkYwMCkgPj4gODsJCQlcCisJX1ZbMV0gPSAodmFyX2xlbiAmIDB4RkYpOwkJCQkJXAorfQorCisjZGVmaW5lCUNPTlZfQVJSQVJZX1RPX3UxNihfVikJKChfVlswXTw8OCkgfCAoX1ZbMV0pKQogCiAjZGVmaW5lCUFERF9PTkVfVG9fNjRCSVRfVkFSKF9WKQkJXAogewkJCQkJCQkJCQlcCi0JVUNIQVIJY250ID0gTEVOX0tFWV9ERVNDX1JFUExBWTsJXAorCXU4CWNudCA9IExFTl9LRVlfREVTQ19SRVBMQVk7CVwKIAlkbwkJCQkJCQkJCVwKIAl7CQkJCQkJCQkJXAogCQljbnQtLTsJCQkJCQkJXApAQCAtMTQ2LDE4MiArMTk0LDIwMCBAQAogCiAjZGVmaW5lIElTX1dQQV9DQVBBQklMSVRZKGEpICAgICAgICgoKGEpID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKChhKSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCiAKLS8vIEVBUE9MIEtleSBJbmZvcm1hdGlvbiBkZWZpbml0aW9uIHdpdGhpbiBLZXkgZGVzY3JpcHRvciBmb3JtYXQKLXR5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0lORk8KLXsKLQlVQ0hBUglLZXlNaWM6MTsKLQlVQ0hBUglTZWN1cmU6MTsKLQlVQ0hBUglFcnJvcjoxOwotCVVDSEFSCVJlcXVlc3Q6MTsKLQlVQ0hBUglFS0RfREw6MTsgICAgICAgLy8gRUtEIGZvciBBUDsgREwgZm9yIFNUQQotCVVDSEFSCVJzdmQ6MzsKLQlVQ0hBUglLZXlEZXNjVmVyOjM7Ci0JVUNIQVIJS2V5VHlwZToxOwotCVVDSEFSCUtleUluZGV4OjI7Ci0JVUNIQVIJSW5zdGFsbDoxOwotCVVDSEFSCUtleUFjazoxOwotfQlLRVlfSU5GTywgKlBLRVlfSU5GTzsKKy8qIEVBUE9MIEtleSBJbmZvcm1hdGlvbiBkZWZpbml0aW9uIHdpdGhpbiBLZXkgZGVzY3JpcHRvciBmb3JtYXQgKi8KK3N0cnVjdCBQQUNLRUQgcnRfa2V5X2luZm8geworCXU4IEtleU1pYzoxOworCXU4IFNlY3VyZToxOworCXU4IEVycm9yOjE7CisJdTggUmVxdWVzdDoxOworCXU4IEVLRF9ETDoxOwkJLyogRUtEIGZvciBBUDsgREwgZm9yIFNUQSAqLworCXU4IFJzdmQ6MzsKKwl1OCBLZXlEZXNjVmVyOjM7CisJdTggS2V5VHlwZToxOworCXU4IEtleUluZGV4OjI7CisJdTggSW5zdGFsbDoxOworCXU4IEtleUFjazoxOworfTsKIAotLy8gRUFQT0wgS2V5IGRlc2NyaXB0b3IgZm9ybWF0Ci10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0tFWV9ERVNDUklQVEVSCi17Ci0JVUNIQVIJCVR5cGU7Ci0JS0VZX0lORk8JS2V5SW5mbzsKLQlVQ0hBUgkJS2V5TGVuZ3RoWzJdOwotCVVDSEFSCQlSZXBsYXlDb3VudGVyW0xFTl9LRVlfREVTQ19SRVBMQVldOwotCVVDSEFSCQlLZXlOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOwotCVVDSEFSCQlLZXlJdltMRU5fS0VZX0RFU0NfSVZdOwotCVVDSEFSCQlLZXlSc2NbTEVOX0tFWV9ERVNDX1JTQ107Ci0JVUNIQVIJCUtleUlkW0xFTl9LRVlfREVTQ19JRF07Ci0JVUNIQVIJCUtleU1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKLQlVQ0hBUgkJS2V5RGF0YUxlblsyXTsKLQlVQ0hBUgkJS2V5RGF0YVtNQVhfTEVOX09GX1JTTklFXTsKLX0JS0VZX0RFU0NSSVBURVIsICpQS0VZX0RFU0NSSVBURVI7CisvKiBFQVBPTCBLZXkgZGVzY3JpcHRvciBmb3JtYXQgKi8KK3N0cnVjdCBQQUNLRUQgcnRfa2V5X2Rlc2NyaXB0ZXIgeworCXU4IFR5cGU7CisJc3RydWN0IHJ0X2tleV9pbmZvIEtleUluZm87CisJdTggS2V5TGVuZ3RoWzJdOworCXU4IFJlcGxheUNvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07CisJdTggS2V5Tm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKKwl1OCBLZXlJdltMRU5fS0VZX0RFU0NfSVZdOworCXU4IEtleVJzY1tMRU5fS0VZX0RFU0NfUlNDXTsKKwl1OCBLZXlJZFtMRU5fS0VZX0RFU0NfSURdOworCXU4IEtleU1pY1tMRU5fS0VZX0RFU0NfTUlDXTsKKwl1OCBLZXlEYXRhTGVuWzJdOworCXU4IEtleURhdGFbTUFYX0xFTl9PRl9SU05JRV07Cit9OwogCi10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0VBUE9MX1BBQ0tFVAotewotCVVDSEFSCSAJCQlQcm9WZXI7Ci0JVUNIQVIJIAkJCVByb1R5cGU7Ci0JVUNIQVIJIAkJCUJvZHlfTGVuWzJdOwotCUtFWV9ERVNDUklQVEVSCQlLZXlEZXNjOwotfQlFQVBPTF9QQUNLRVQsICpQRUFQT0xfUEFDS0VUOworc3RydWN0IFBBQ0tFRCBydF9lYXBvbF9wYWNrZXQgeworCXU4IFByb1ZlcjsKKwl1OCBQcm9UeXBlOworCXU4IEJvZHlfTGVuWzJdOworCXN0cnVjdCBydF9rZXlfZGVzY3JpcHRlciBLZXlEZXNjOworfTsKIAotLy84MDIuMTFpIEQxMCBwYWdlIDgzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0dUS19FTkNBUAotewotICAgIFVDSEFSICAgICAgICAgICAgICAgS2lkOjI7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICB0eDoxOwotICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2OjU7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICByc3YxOwotICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLW1RLSVBfR1RLX0xFTkdUSF07Ci19ICAgR1RLX0VOQ0FQLCAqUEdUS19FTkNBUDsKKy8qODAyLjExaSBEMTAgcGFnZSA4MyAqLworc3RydWN0IFBBQ0tFRCBydF9ndGtfZW5jYXAgeworCXU4IEtpZDoyOworCXU4IHR4OjE7CisJdTggcnN2OjU7CisJdTggcnN2MTsKKwl1OCBHVEtbVEtJUF9HVEtfTEVOR1RIXTsKK307CiAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfS0RFX0VOQ0FQCi17Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBUeXBlOwotICAgIFVDSEFSICAgICAgICAgICAgICAgTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgT1VJWzNdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgRGF0YVR5cGU7Ci0gICAgR1RLX0VOQ0FQICAgICAgR1RLRW5jYXA7Ci19ICAgS0RFX0VOQ0FQLCAqUEtERV9FTkNBUDsKK3N0cnVjdCBQQUNLRUQgcnRfa2RlX2VuY2FwIHsKKwl1OCBUeXBlOworCXU4IExlbjsKKwl1OCBPVUlbM107CisJdTggRGF0YVR5cGU7CisJc3RydWN0IHJ0X2d0a19lbmNhcCBHVEtFbmNhcDsKK307CiAKLS8vIEZvciBXUEExCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFIHsKLSAgICBVQ0hBUiAgIG91aVs0XTsKLSAgICBVU0hPUlQgIHZlcnNpb247Ci0gICAgVUNIQVIgICBtY2FzdFs0XTsKLSAgICBVU0hPUlQgIHVjb3VudDsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICAgICAgVUNIQVIgb3VpWzRdOwotICAgIH11Y2FzdFsxXTsKLX0gUlNOSUUsICpQUlNOSUU7CisvKiBGb3IgV1BBMSAqLworc3RydWN0IFBBQ0tFRCBydF9yc25pZSB7CisJdTggb3VpWzRdOworCXUxNiB2ZXJzaW9uOworCXU4IG1jYXN0WzRdOworCXUxNiB1Y291bnQ7CisJc3RydWN0IFBBQ0tFRCB7CisJCXU4IG91aVs0XTsKKwl9IHVjYXN0WzFdOworfTsKIAotLy8gRm9yIFdQQTIKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUyIHsKLSAgICBVU0hPUlQgIHZlcnNpb247Ci0gICAgVUNIQVIgICBtY2FzdFs0XTsKLSAgICBVU0hPUlQgIHVjb3VudDsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICAgICAgVUNIQVIgb3VpWzRdOwotICAgIH11Y2FzdFsxXTsKLX0gUlNOSUUyLCAqUFJTTklFMjsKKy8qIEZvciBXUEEyICovCitzdHJ1Y3QgUEFDS0VEIHJ0X3JzbmllMiB7CisJdTE2IHZlcnNpb247CisJdTggbWNhc3RbNF07CisJdTE2IHVjb3VudDsKKwlzdHJ1Y3QgUEFDS0VEIHsKKwkJdTggb3VpWzRdOworCX0gdWNhc3RbMV07Cit9OwogCi0vLyBBS00gU3VpdGUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUVfQVVUSCB7Ci0gICAgVVNIT1JUIGFjb3VudDsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICAgICAgVUNIQVIgb3VpWzRdOwotICAgIH1hdXRoWzFdOwotfSBSU05JRV9BVVRILCpQUlNOSUVfQVVUSDsKKy8qIEFLTSBTdWl0ZSAqLworc3RydWN0IFBBQ0tFRCBydF9yc25pZV9hdXRoIHsKKwl1MTYgYWNvdW50OworCXN0cnVjdCBQQUNLRUQgeworCQl1OCBvdWlbNF07CisJfSBhdXRoWzFdOworfTsKIAotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1JTTl9DQVBBQklMSVRJRVMJewotCXN0cnVjdAlQQUNLRUQgewotICAgICAgICBVU0hPUlQJCVByZUF1dGg6MTsKLQkJVVNIT1JUCQlOb19QYWlyd2lzZToxOwotCQlVU0hPUlQJCVBUS1NBX1JfQ291bnRlcjoyOwotCQlVU0hPUlQJCUdUS1NBX1JfQ291bnRlcjoyOwotCQlVU0hPUlQJCVJzdmQ6MTA7Ci0JfQlmaWVsZDsKLQlVU0hPUlQJCQl3b3JkOwotfQlSU05fQ0FQQUJJTElUSUVTLCAqUFJTTl9DQVBBQklMSVRJRVM7Cit0eXBlZGVmIHVuaW9uIFBBQ0tFRCBfUlNOX0NBUEFCSUxJVElFUyB7CisJc3RydWN0IFBBQ0tFRCB7CisJCXUxNiBQcmVBdXRoOjE7CisJCXUxNiBOb19QYWlyd2lzZToxOworCQl1MTYgUFRLU0FfUl9Db3VudGVyOjI7CisJCXUxNiBHVEtTQV9SX0NvdW50ZXI6MjsKKwkJdTE2IFJzdmQ6MTA7CisJfSBmaWVsZDsKKwl1MTYgd29yZDsKK30gUlNOX0NBUEFCSUxJVElFUywgKlBSU05fQ0FQQUJJTElUSUVTOwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VBUF9IRFIgewotICAgIFVDSEFSICAgUHJvVmVyOwotICAgIFVDSEFSICAgUHJvVHlwZTsKLSAgICBVQ0hBUiAgIEJvZHlfTGVuWzJdOwotICAgIFVDSEFSICAgY29kZTsKLSAgICBVQ0hBUiAgIGlkZW50aWZpZXI7Ci0gICAgVUNIQVIgICBsZW5ndGhbMl07IC8vIGluY2x1ZGluZyBjb2RlIGFuZCBpZGVudGlmaWVyLCBmb2xsb3dlZCBieSBsZW5ndGgtMiBvY3RldHMgb2YgZGF0YQotfSBFQVBfSERSLCAqUEVBUF9IRFI7CitzdHJ1Y3QgUEFDS0VEIHJ0X2VhcF9oZHIgeworCXU4IFByb1ZlcjsKKwl1OCBQcm9UeXBlOworCXU4IEJvZHlfTGVuWzJdOworCXU4IGNvZGU7CisJdTggaWRlbnRpZmllcjsKKwl1OCBsZW5ndGhbMl07CS8qIGluY2x1ZGluZyBjb2RlIGFuZCBpZGVudGlmaWVyLCBmb2xsb3dlZCBieSBsZW5ndGgtMiBvY3RldHMgb2YgZGF0YSAqLworfTsKIAotLy8gRm9yIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZSBzdGF0ZXMuIDgwMi4xMWkgRHJhZnQgNC4xLCBwLiA5NwotLy8gV2Ugc2ltcGxpZmllZCBpdAotdHlwZWRlZgllbnVtCV9XcGFTdGF0ZQotewotCVNTX05PVFVTRSwJCQkJLy8gMAotCVNTX1NUQVJULAkJCQkvLyAxCi0JU1NfV0FJVF9NU0dfMywJCQkvLyAyCi0JU1NfV0FJVF9HUk9VUCwJCQkvLyAzCi0JU1NfRklOSVNILCAgCQkJLy8gNAotCVNTX0tFWVVQREFURSwJCQkvLyA1Ci19CVdQQV9TVEFURTsKKy8qIEZvciBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUgc3RhdGVzLiA4MDIuMTFpIERyYWZ0IDQuMSwgcC4gOTcgKi8KKy8qIFdlIHNpbXBsaWZpZWQgaXQgKi8KK3R5cGVkZWYgZW51bSBfV3BhU3RhdGUgeworCVNTX05PVFVTRSwJCS8qIDAgKi8KKwlTU19TVEFSVCwJCS8qIDEgKi8KKwlTU19XQUlUX01TR18zLAkJLyogMiAqLworCVNTX1dBSVRfR1JPVVAsCQkvKiAzICovCisJU1NfRklOSVNILAkJLyogNCAqLworCVNTX0tFWVVQREFURSwJCS8qIDUgKi8KK30gV1BBX1NUQVRFOwogCi0vLwotLy8JVGhlIGRlZmluaXRpb24gb2YgdGhlIGNpcGhlciBjb21iaW5hdGlvbgotLy8KLS8vIAkgYml0MwliaXQyICBiaXQxICAgYml0MAotLy8JKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCi0vLyAJfAkgIFdQQQkgfAkgICBXUEEyICAgfAotLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCi0vLwl8IFRLSVAgfCBBRVMgfCBUS0lQIHwgQUVTIHwKLS8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDAgIHwgLT4gMHgwNgotLy8JfAkwICB8ICAxICB8ICAgMSAgfCAgMSAgfCAtPiAweDA3Ci0vLwl8CTEgIHwgIDAgIHwgICAwICB8ICAxICB8IC0+IDB4MDkKLS8vCXwJMSAgfCAgMCAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwQgotLy8JfAkxICB8ICAxICB8ICAgMCAgfCAgMSAgfCAtPiAweDBECi0vLwl8CTEgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MEUKLS8vCXwJMSAgfCAgMSAgfCAgIDEgIHwgIDEgIHwJLT4gMHgwRgotLy8JKy0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rCi0vLwotdHlwZWRlZgllbnVtCV9XcGFNaXhQYWlyQ2lwaGVyCi17Ci0JTUlYX0NJUEhFUl9OT1RVU0UgCQkJPSAweDAwLAotCVdQQV9OT05FX1dQQTJfVEtJUEFFUwkJPSAweDAzLAkJLy8gV1BBMi1US0lQQUVTCi0JV1BBX0FFU19XUEEyX1RLSVAgCQkJPSAweDA2LAotCVdQQV9BRVNfV1BBMl9US0lQQUVTCQk9IDB4MDcsCi0JV1BBX1RLSVBfV1BBMl9BRVMJCQk9IDB4MDksCi0JV1BBX1RLSVBfV1BBMl9US0lQQUVTCQk9IDB4MEIsCi0JV1BBX1RLSVBBRVNfV1BBMl9OT05FCQk9IDB4MEMsCQkvLyBXUEEtVEtJUEFFUwotCVdQQV9US0lQQUVTX1dQQTJfQUVTCQk9IDB4MEQsCi0JV1BBX1RLSVBBRVNfV1BBMl9US0lQCQk9IDB4MEUsCi0JV1BBX1RLSVBBRVNfV1BBMl9US0lQQUVTCT0gMHgwRiwKLX0JV1BBX01JWF9QQUlSX0NJUEhFUjsKKy8qICovCisvKiAgICAgIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBjaXBoZXIgY29tYmluYXRpb24gKi8KKy8qICovCisvKiAgICAgICBiaXQzICAgYml0MiAgYml0MSAgIGJpdDAgKi8KKy8qICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rICovCisvKiAgICAgIHwgICAgICAgICBXUEEgICAgfCAgICAgICAgIFdQQTIgICB8ICovCisvKiAgICAgICstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKyAqLworLyogICAgICB8IFRLSVAgfCBBRVMgfCBUS0lQIHwgQUVTIHwgKi8KKy8qICAgICAgfCAgICAgICAwICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDA2ICovCisvKiAgICAgIHwgICAgICAgMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNyAqLworLyogICAgICB8ICAgICAgIDEgIHwgIDAgIHwgICAwICB8ICAxICB8IC0+IDB4MDkgKi8KKy8qICAgICAgfCAgICAgICAxICB8ICAwICB8ICAgMSAgfCAgMSAgfCAtPiAweDBCICovCisvKiAgICAgIHwgICAgICAgMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRCAqLworLyogICAgICB8ICAgICAgIDEgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MEUgKi8KKy8qICAgICAgfCAgICAgICAxICB8ICAxICB8ICAgMSAgfCAgMSAgfCAtPiAweDBGICovCisvKiAgICAgICstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKyAqLworLyogKi8KK3R5cGVkZWYgZW51bSBfV3BhTWl4UGFpckNpcGhlciB7CisJTUlYX0NJUEhFUl9OT1RVU0UgPSAweDAwLAorCVdQQV9OT05FX1dQQTJfVEtJUEFFUyA9IDB4MDMsCS8qIFdQQTItVEtJUEFFUyAqLworCVdQQV9BRVNfV1BBMl9US0lQID0gMHgwNiwKKwlXUEFfQUVTX1dQQTJfVEtJUEFFUyA9IDB4MDcsCisJV1BBX1RLSVBfV1BBMl9BRVMgPSAweDA5LAorCVdQQV9US0lQX1dQQTJfVEtJUEFFUyA9IDB4MEIsCisJV1BBX1RLSVBBRVNfV1BBMl9OT05FID0gMHgwQywJLyogV1BBLVRLSVBBRVMgKi8KKwlXUEFfVEtJUEFFU19XUEEyX0FFUyA9IDB4MEQsCisJV1BBX1RLSVBBRVNfV1BBMl9US0lQID0gMHgwRSwKKwlXUEFfVEtJUEFFU19XUEEyX1RLSVBBRVMgPSAweDBGLAorfSBXUEFfTUlYX1BBSVJfQ0lQSEVSOwogCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTl9JRV9IRUFERVJfU1RSVUNUCXsKLQlVQ0hBUgkJRWlkOwotCVVDSEFSCQlMZW5ndGg7Ci0JVVNIT1JUCQlWZXJzaW9uOwkvLyBMaXR0bGUgZW5kaWFuIGZvcm1hdAotfQlSU05fSUVfSEVBREVSX1NUUlVDVCwgKlBSU05fSUVfSEVBREVSX1NUUlVDVDsKK3N0cnVjdCBQQUNLRUQgcnRfcnNuX2llX2hlYWRlciB7CisJdTggRWlkOworCXU4IExlbmd0aDsKKwl1MTYgVmVyc2lvbjsJCS8qIExpdHRsZSBlbmRpYW4gZm9ybWF0ICovCit9OwogCi0vLyBDaXBoZXIgc3VpdGUgc2VsZWN0b3IgdHlwZXMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0lQSEVSX1NVSVRFX1NUUlVDVAl7Ci0JVUNIQVIJCU91aVszXTsKLQlVQ0hBUgkJVHlwZTsKLX0JQ0lQSEVSX1NVSVRFX1NUUlVDVCwgKlBDSVBIRVJfU1VJVEVfU1RSVUNUOworLyogQ2lwaGVyIHN1aXRlIHNlbGVjdG9yIHR5cGVzICovCitzdHJ1Y3QgUEFDS0VEIHJ0X2NpcGhlcl9zdWl0ZV9zdHJ1Y3QgeworCXU4IE91aVszXTsKKwl1OCBUeXBlOworfTsKIAotLy8gQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IHN1aXRlIHNlbGVjdG9yCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0FLTV9TVUlURV9TVFJVQ1QJewotCVVDSEFSCQlPdWlbM107Ci0JVUNIQVIJCVR5cGU7Ci19CUFLTV9TVUlURV9TVFJVQ1QsICpQQUtNX1NVSVRFX1NUUlVDVDsKKy8qIEF1dGhlbnRpY2F0aW9uIGFuZCBLZXkgTWFuYWdlbWVudCBzdWl0ZSBzZWxlY3RvciAqLworc3RydWN0IFBBQ0tFRCBydF9ha21fc3VpdGUgeworCXU4IE91aVszXTsKKwl1OCBUeXBlOworfTsKIAotLy8gUlNOIGNhcGFiaWxpdHkKLXR5cGVkZWYgc3RydWN0CVBBQ0tFRCBfUlNOX0NBUEFCSUxJVFkJewotCVVTSE9SVAkJUnN2OjEwOwotCVVTSE9SVAkJR1RLU0FSZXBsYXlDbnQ6MjsKLQlVU0hPUlQJCVBUS1NBUmVwbGF5Q250OjI7Ci0JVVNIT1JUCQlOb1BhaXJ3aXNlOjE7Ci0JVVNIT1JUCQlQcmVBdXRoOjE7Ci19CVJTTl9DQVBBQklMSVRZLCAqUFJTTl9DQVBBQklMSVRZOworLyogUlNOIGNhcGFiaWxpdHkgKi8KK3N0cnVjdCBQQUNLRUQgcnRfcnNuX2NhcGFiaWxpdHkgeworCXUxNiBSc3Y6MTA7CisJdTE2IEdUS1NBUmVwbGF5Q250OjI7CisJdTE2IFBUS1NBUmVwbGF5Q250OjI7CisJdTE2IE5vUGFpcndpc2U6MTsKKwl1MTYgUHJlQXV0aDoxOworfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJVGhlIHByb3RvdHlwZSBpcyBkZWZpbmVkIGluIGNtbV93cGEuYworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0JPT0xFQU4gV3BhTXNnVHlwZVN1YnN0KHU4IEVBUFR5cGUsIGludCAqIE1zZ1R5cGUpOworCit2b2lkIFBSRih1OCAqIGtleSwKKwkgaW50IGtleV9sZW4sCisJIHU4ICogcHJlZml4LAorCSBpbnQgcHJlZml4X2xlbiwKKwkgdTggKiBkYXRhLCBpbnQgZGF0YV9sZW4sIHU4ICogb3V0cHV0LCBpbnQgbGVuKTsKKworaW50IFBhc3N3b3JkSGFzaChjaGFyICpwYXNzd29yZCwKKwkJIHVuc2lnbmVkIGNoYXIgKnNzaWQsIGludCBzc2lkbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpvdXRwdXQpOworCit1OCAqR2V0U3VpdGVGcm9tUlNOSUUodTggKnJzbmllLAorCQkJIHUzMiByc25pZV9sZW4sIHU4IHR5cGUsIHU4ICogY291bnQpOworCit2b2lkIFdwYVNob3dBbGxzdWl0ZSh1OCAqcnNuaWUsIHUzMiByc25pZV9sZW4pOworCit2b2lkIFJUTVBJbnNlcnRSU05JRSh1OCAqcEZyYW1lQnVmLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBGcmFtZUxlbiwKKwkJICAgICB1OCAqcnNuaWVfcHRyLAorCQkgICAgIHU4IHJzbmllX2xlbiwKKwkJICAgICB1OCAqcG1raWRfcHRyLCB1OCBwbWtpZF9sZW4pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvMjg3MF9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZWQ0OGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC8yODcwX21haW5fZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRtcF9tYWluLmMKLQotICAgIEFic3RyYWN0OgotICAgIG1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZXMKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIE5hbWUgICAgICAgIERhdGUgICAgICAgICAgICBNb2RpZmljYXRpb24gbG9ncwotICAgIEphbiBMZWUJCTAxLTEwLTIwMDUJICAgIG1vZGlmaWVkCi0JU2FtcGxlCQlKdW4vMDEvMDcJCU1lcmdlIFJUMjg3MCBhbmQgUlQyODYwIGRyaXZlcnMuCi0qLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLQotLy8gRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nCi0vLyAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4KLS8vIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKioKLU1PRFVMRV9BVVRIT1IoIlBhdWwgTGluIDxwYXVsX2xpbkByYWxpbmt0ZWNoLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTihSVDI4eHhfQ0hJUF9OQU1FICIgV2lyZWxlc3MgTEFOIExpbnV4IERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotI2lmZGVmIE1PRFVMRV9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOwotI2VuZGlmCi1NT0RVTEVfQUxJQVMoInJ0MzA3MHN0YSIpOwotCi0vKiBLZXJuZWwgdGhyZWFkIGFuZCB2YXJzLCB3aGljaCBoYW5kbGVzIHBhY2tldHMgdGhhdCBhcmUgY29tcGxldGVkLiBPbmx5Ci0gKiBwYWNrZXRzIHRoYXQgaGF2ZSBhICJjb21wbGV0ZSIgZnVuY3Rpb24gYXJlIHNlbnQgaGVyZS4gVGhpcyB3YXksIHRoZQotICogY29tcGxldGlvbiBpcyBydW4gb3V0IG9mIGtlcm5lbCBjb250ZXh0LCBhbmQgZG9lc24ndCBibG9jayB0aGUgcmVzdCBvZgotICogdGhlIHN0YWNrLiAqLwotCi1leHRlcm4gSU5UIF9fZGV2aW5pdCBydDI4eHhfcHJvYmUoSU4gdm9pZCAqX2Rldl9wLCBJTiB2b2lkICpfZGV2X2lkX3AsCi0JCQkJCQkJCQlJTiBVSU5UIGFyZ2MsIE9VVCBQUlRNUF9BREFQVEVSICpwcEFkKTsKLQotc3RydWN0IHVzYl9kZXZpY2VfaWQgcnR1c2JfdXNiX2lkW10gPSB7Ci0JeyBVU0JfREVWSUNFKDB4MTQ4RiwgMHgyNzcwKSB9LCAvKiBSYWxpbmsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzEpIH0sIC8qIExpbmtzeXMgV1VTQjYwME4gKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzApIH0sIC8qIExpbmtzeXMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNDhGLCAweDI4NzApIH0sIC8qIFJhbGluayAqLwotCXsgVVNCX0RFVklDRSgweDE0OEYsIDB4MzA3MCkgfSwgLyogUmFsaW5rIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNDhGLCAweDMwNzEpIH0sIC8qIFJhbGluayAzMDcxICovCi0JeyBVU0JfREVWSUNFKDB4MTQ4RiwgMHgzMDcyKSB9LCAvKiBSYWxpbmsgMzA3MiAqLwotCXsgVVNCX0RFVklDRSgweDBCMDUsIDB4MTczMSkgfSwgLyogQXN1cyAqLwotCXsgVVNCX0RFVklDRSgweDBCMDUsIDB4MTczMikgfSwgLyogQXN1cyAqLwotCXsgVVNCX0RFVklDRSgweDBCMDUsIDB4MTc0MikgfSwgLyogQXN1cyAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAxNykgfSwgLyogU2l0ZWNvbSAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAyQikgfSwgLyogU2l0ZWNvbSAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAyQykgfSwgLyogU2l0ZWNvbSAqLwotCXsgVVNCX0RFVklDRSgweDBERjYsIDB4MDAzRSkgfSwgLyogU2l0ZWNvbSAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MERGNiwgMHgwMDJEKSB9LCAvKiBTaXRlY29tICovCi0JeyBVU0JfREVWSUNFKDB4MERGNiwgMHgwMDM5KSB9LCAvKiBTaXRlY29tIDI3NzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwREY2LCAweDAwM0YpIH0sIC8qIFNpdGVjb20gV0wtNjA4ICovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzA2KSB9LCAvKiBDb25jZXB0cm9uaWMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMjgpIH0sIC8qIENvbmNlcHRyb25pYyAqLwotCXsgVVNCX0RFVklDRSgweDIwMTksIDB4RUQwNikgfSwgLyogUGxhbmV4IENvbW11bmljYXRpb25zLCBJbmMuICovCi0JeyBVU0JfREVWSUNFKDB4MjAxOSwgMHhFRDE0KSB9LCAvKiBQbGFuZXggQ29tbXVuaWNhdGlvbnMsIEluYy4gKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMDE5LCAweEFCMjUpIH0sIC8qIFBsYW5leCBDb21tdW5pY2F0aW9ucywgSW5jLiBSVDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0QxLCAweDNDMDkpIH0sIC8qIEQtTGluayAqLwotCXsgVVNCX0RFVklDRSgweDA3RDEsIDB4M0MxMSkgfSwgLyogRC1MaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MjAwMSwgMHgzQzA5KSB9LCAvKiBELUxpbmsgKi8KLQl7IFVTQl9ERVZJQ0UoMHgyMDAxLCAweDNDMEEpIH0sIC8qIEQtTGluayAzMDcyKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNEIyLCAweDNDMDcpIH0sIC8qIEFMICovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzEyKSB9LCAvKiBBTCAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MDUwRCwgMHg4MDUzKSB9LCAvKiBCZWxraW4gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTBELCAweDgxNUMpIH0sIC8qIEJlbGtpbiAqLwotCXsgVVNCX0RFVklDRSgweDA1MEQsIDB4ODI1YSkgfSwgLyogQmVsa2luICovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzIzKSB9LCAvKiBBaXJsaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MTRCMiwgMHgzQzI3KSB9LCAvKiBBaXJsaW5rICovCi0JeyBVU0JfREVWSUNFKDB4MDdBQSwgMHgwMDJGKSB9LCAvKiBDb3JlZ2EgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0FBLCAweDAwM0MpIH0sIC8qIENvcmVnYSAqLwotCXsgVVNCX0RFVklDRSgweDA3QUEsIDB4MDAzRikgfSwgLyogQ29yZWdhICovCi0JeyBVU0JfREVWSUNFKDB4MThDNSwgMHgwMDEyKSB9LCAvKiBDb3JlZ2EgMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDEwNDQsIDB4ODAwQikgfSwgLyogR2lnYWJ5dGUgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxMDQ0LCAweDgwMEQpIH0sIC8qIEdpZ2FieXRlIEdOLVdCMzJMIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNUE5LCAweDAwMDYpIH0sIC8qIFNwYXJrbGFuICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHhCNTIyKSB9LCAvKiBTTUMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwODNBLCAweEE2MTgpIH0sIC8qIFNNQyAqLwotCXsgVVNCX0RFVklDRSgweDA4M0EsIDB4ODUyMikgfSwgLyogQXJjYWR5YW4gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwODNBLCAweDc1MTIpIH0sIC8qIEFyY2FkeWFuIDI3NzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwODNBLCAweDc1MjIpIH0sIC8qIEFyY2FkeWFuICovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHg3NTExKSB9LCAvKiBBcmNhZHlhbiAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MENERSwgMHgwMDIyKSB9LCAvKiBaQ09NICovCi0JeyBVU0JfREVWSUNFKDB4MDU4NiwgMHgzNDE2KSB9LCAvKiBaeXhlbCAqLwotCXsgVVNCX0RFVklDRSgweDBDREUsIDB4MDAyNSkgfSwgLyogWnl4ZWwgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNzQwLCAweDk3MDEpIH0sIC8qIEVuR2VuaXVzICovCi0JeyBVU0JfREVWSUNFKDB4MTc0MCwgMHg5NzAyKSB9LCAvKiBFbkdlbml1cyAqLwotCXsgVVNCX0RFVklDRSgweDE3NDAsIDB4OTcwMykgfSwgLyogRW5HZW5pdXMgMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MjAwZikgfSwgLyogUGhpbGlwcyAqLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MyNSkgfSwgLyogRHJheXRlayAqLwotCXsgVVNCX0RFVklDRSgweDEzRDMsIDB4MzI0NykgfSwgLyogQXp1cmVXYXZlICovCi0JeyBVU0JfREVWSUNFKDB4MTNEMywgMHgzMjczKSB9LCAvKiBBenVyZVdhdmUgMzA3MCovCi0JeyBVU0JfREVWSUNFKDB4MDgzQSwgMHg2NjE4KSB9LCAvKiBBY2N0b24gKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNWM1LCAweDAwMDgpIH0sIC8qIEFtaXQgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwRTY2LCAweDAwMDEpIH0sIC8qIEhhd2tpbmcgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwRTY2LCAweDAwMDMpIH0sIC8qIEhhd2tpbmcgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxMjlCLCAweDE4MjgpIH0sIC8qIFNpZW1lbnMgKi8KLQl7IFVTQl9ERVZJQ0UoMHgxNTdFLCAweDMwMEUpIH0sIC8qIFUtTWVkaWEgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNTBkLCAweDgwNWMpIH0sCi0JeyBVU0JfREVWSUNFKDB4MTQ4MiwgMHgzQzA5KSB9LCAvKiBBYm9jb20qLwotCXsgVVNCX0RFVklDRSgweDE0QjIsIDB4M0MwOSkgfSwgLyogQWxwaGEgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNEU4LCAweDIwMTgpIH0sIC8qIHNhbXN1bmcgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0I4LCAweDMwNzApIH0sIC8qIEFib0NvbSAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MDdCOCwgMHgzMDcxKSB9LCAvKiBBYm9Db20gMzA3MSAqLwotCXsgVVNCX0RFVklDRSgweDA3QjgsIDB4Mjg3MCkgfSwgLyogQWJvQ29tICovCi0JeyBVU0JfREVWSUNFKDB4MDdCOCwgMHgyNzcwKSB9LCAvKiBBYm9Db20gKi8KLQl7IFVTQl9ERVZJQ0UoMHgwN0I4LCAweDMwNzIpIH0sIC8qIEFib2NvbSAzMDcyICovCi0JeyBVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzExKSB9LCAvKiBFZGltYXggMzA3MCAqLwotCXsgVVNCX0RFVklDRSgweDVBNTcsIDB4MDI4MCkgfSwgLyogWmlud2VsbCAqLwotCXsgVVNCX0RFVklDRSgweDVBNTcsIDB4MDI4MikgfSwgLyogWmlud2VsbCAqLwotCXsgVVNCX0RFVklDRSgweDFBMzIsIDB4MDMwNCkgfSwgLyogUXVhbnRhIDMwNzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwNzg5LCAweDAxNjIpIH0sIC8qIExvZ2l0ZWMgMjg3MCAqLwotCXsgVVNCX0RFVklDRSgweDA3ODksIDB4MDE2MykgfSwgLyogTG9naXRlYyAyODcwICovCi0JeyBVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTY0KSB9LCAvKiBMb2dpdGVjIDI4NzAgKi8KLQl7IFVTQl9ERVZJQ0UoMHg3MzkyLCAweDc3MTcpIH0sIC8qIEVkaW1heCAqLwotCXsgVVNCX0RFVklDRSgweDFFREEsIDB4MjMxMCkgfSwgLyogQWlyVGllcyAzMDcwICovCi0JeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDc3KSB9LCAvKiBMaW5rc3lzIFdVU0I1NEdDLUVVIHYzICovCi0JeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1JTlQgY29uc3QgICAgICAgICAgICAgICBydHVzYl91c2JfaWRfbGVuID0gc2l6ZW9mKHJ0dXNiX3VzYl9pZCkgLyBzaXplb2Yoc3RydWN0IHVzYl9kZXZpY2VfaWQpOwotTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHJ0dXNiX3VzYl9pZCk7Ci0KLSNpZm5kZWYgUEZfTk9GUkVFWkUKLSNkZWZpbmUgUEZfTk9GUkVFWkUgIDAKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1zdGF0aWMgaW50IHJ0Mjg3MF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotI2VuZGlmIC8vIENPTkZJR19QTSAvLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vL3Rlc3RlZCBmb3Iga2VybmVsIDIuNnNlcmllcwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBydHVzYl9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCQkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwotc3RhdGljIHZvaWQgcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci0KLXN0cnVjdCB1c2JfZHJpdmVyIHJ0dXNiX2RyaXZlciA9IHsKLQkubmFtZT0icnQyODcwIiwKLQkucHJvYmU9cnR1c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3Q9cnR1c2JfZGlzY29ubmVjdCwKLQkuaWRfdGFibGU9cnR1c2JfdXNiX2lkLAotCi0jaWZkZWYgQ09ORklHX1BNCi0Jc3VzcGVuZDoJcnQyODcwX3N1c3BlbmQsCi0JcmVzdW1lOgkJcnQyODcwX3Jlc3VtZSwKLSNlbmRpZgotCX07Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotVk9JRCBSVDI4NjBSZWplY3RQZW5kaW5nUGFja2V0cygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQkvLyBjbGVhciBQUyBwYWNrZXRzCi0JLy8gY2xlYXIgVHhTdyBwYWNrZXRzCi19Ci0KLXN0YXRpYyBpbnQgcnQyODcwX3N1c3BlbmQoCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2OwotCVBSVE1QX0FEQVBURVIgcEFkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NzBfc3VzcGVuZCgpXG4iKSk7Ci0JbmV0X2RldiA9IHBBZC0+bmV0X2RldjsKLQluZXRpZl9kZXZpY2VfZGV0YWNoIChuZXRfZGV2KTsKLQotCXBBZC0+UE1fRmxnU3VzcGVuZCA9IDE7Ci0JaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKLQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7Ci0JCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfc3VzcGVuZCgpXG4iKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnQyODcwX3Jlc3VtZSgKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODcwX3Jlc3VtZSgpXG4iKSk7Ci0KLQlwQWQtPlBNX0ZsZ1N1c3BlbmQgPSAwOwotCW5ldF9kZXYgPSBwQWQtPm5ldF9kZXY7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaCAobmV0X2Rldik7Ci0JbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7Ci0JbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBydDI4NzBfcmVzdW1lKClcbiIpKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotCi0vLyBJbml0IGRyaXZlciBtb2R1bGUKLUlOVCBfX2luaXQgcnR1c2JfaW5pdCh2b2lkKQotewotCXByaW50aygicnR1c2IgaW5pdCAtLS0+XG4iKTsKLQlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOwotfQotCi0vLyBEZWluaXQgZHJpdmVyIG1vZHVsZQotVk9JRCBfX2V4aXQgcnR1c2JfZXhpdCh2b2lkKQotewotCXVzYl9kZXJlZ2lzdGVyKCZydHVzYl9kcml2ZXIpOwotCXByaW50aygiPC0tLSBydHVzYiBleGl0XG4iKTsKLX0KLQotbW9kdWxlX2luaXQocnR1c2JfaW5pdCk7Ci1tb2R1bGVfZXhpdChydHVzYl9leGl0KTsKLQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KLS8qIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwkJCQkJCQkJCQkJCSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIE1MTUUga2VybmVsIHRocmVhZC4KLQotQXJndW1lbnRzOgotCSpDb250ZXh0CQkJdGhlIHBBZCwgZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJY2xvc2UgdGhlIHRocmVhZAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIE1sbWVUaHJlYWQoCi0JSU4gdm9pZCAqQ29udGV4dCkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7Ci0JUE9TX0NPT0tJRQlwT2JqOwotCWludCBzdGF0dXM7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBNbG1lVGhyZWFkIiwgKFBWT0lEKSYocEFkLT5tbG1lQ29tcGxldGUpKTsKLQotCXdoaWxlIChwQWQtPm1sbWVfa2lsbCA9PSAwKQotCXsKLQkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCi0JCS8vZG93bigmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsKLQkJc3RhdHVzID0gZG93bl9pbnRlcnJ1cHRpYmxlKCYocEFkLT5tbG1lX3NlbWFwaG9yZSkpOwotCi0JCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAsIG5lZWQgdG8gY2hlY2sgaWYgcmVxdWlyZWQqLwotCQkvL2Rvd24oJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKLQotCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKLQkJTWxtZUhhbmRsZXIocEFkKTsKLQotCQkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLwotCQkvL3VwKCYocEFkLT51c2JkZXZfc2VtYXBob3JlKSk7Ci0JCWlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qIG5vdGlmeSB0aGUgZXhpdCByb3V0aW5lIHRoYXQgd2UncmUgYWN0dWFsbHkgZXhpdGluZyBub3cKLQkgKgotCSAqIGNvbXBsZXRlKCkvd2FpdF9mb3JfY29tcGxldGlvbigpIGlzIHNpbWlsYXIgdG8gdXAoKS9kb3duKCksCi0JICogZXhjZXB0IHRoYXQgY29tcGxldGUoKSBpcyBzYWZlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJ1Y3R1cmUKLQkgKiBpcyBnZXR0aW5nIGRlbGV0ZWQgaW4gYSBwYXJhbGxlbCBtb2RlIG9mIGV4ZWN1dGlvbiAoaS5lLiBqdXN0Ci0JICogYWZ0ZXIgdGhlIGRvd24oKSAtLSB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgdGhyZWFkLXNodXRkb3duCi0JICogY2FzZS4KLQkgKgotCSAqIGNvbXBsZXRlX2FuZF9leGl0KCkgZ29lcyBldmVuIGZ1cnRoZXIgdGhhbiB0aGlzIC0tIGl0IGlzIHNhZmUgaW4KLQkgKiB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWQgb2YgdGhlIGNhbGxlciBpcyBnb2luZyBhd2F5IChub3QganVzdAotCSAqIHRoZSBzdHJ1Y3R1cmUpIC0tIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgbW9kdWxlLXJlbW92ZSBjYXNlLgotCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKLQkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCi0JICovCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLSVzXG4iLF9fZnVuY19fKSk7Ci0KLQlwT2JqLT5NTE1FVGhyX3BpZCA9IE5VTEw7Ci0KLQljb21wbGV0ZV9hbmRfZXhpdCAoJnBBZC0+bWxtZUNvbXBsZXRlLCAwKTsKLQlyZXR1cm4gMDsKLQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVVNCIGNvbW1hbmQga2VybmVsIHRocmVhZC4KLQotQXJndW1lbnRzOgotCSpDb250ZXh0CQkJdGhlIHBBZCwgZHJpdmVyIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJY2xvc2UgdGhlIHRocmVhZAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUVVNCQ21kVGhyZWFkKAotCUlOIHZvaWQgKiBDb250ZXh0KQotewotCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpQ29udGV4dDsKLQlQT1NfQ09PS0lFCQlwT2JqOwotCWludCBzdGF0dXM7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlydG1wX29zX3RocmVhZF9pbml0KCJydDI4NzBDbWRUaHJlYWQiLCAoUFZPSUQpJihwQWQtPkNtZFFDb21wbGV0ZSkpOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JcEFkLT5DbWRRLkNtZFFTdGF0ZSA9IFJUMjg3MF9USFJFQURfUlVOTklORzsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQotCXdoaWxlIChwQWQtPkNtZFEuQ21kUVN0YXRlID09IFJUMjg3MF9USFJFQURfUlVOTklORykKLQl7Ci0JCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLwotCQkvL2Rvd24oJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOwotCQlzdGF0dXMgPSBkb3duX2ludGVycnVwdGlibGUoJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOwotCi0JCWlmIChwQWQtPkNtZFEuQ21kUVN0YXRlID09IFJUMjg3MF9USFJFQURfU1RPUEVEKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAsIG5lZWQgdG8gY2hlY2sgaWYgcmVxdWlyZWQqLwotCQkvL2Rvd24oJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKLQotCQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKLQkJQ01ESGFuZGxlcihwQWQpOwotCi0JCS8qIHVubG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCi0JCS8vdXAoJihwQWQtPnVzYmRldl9zZW1hcGhvcmUpKTsKLQl9Ci0KLQlpZiAoIXBBZC0+UE1fRmxnU3VzcGVuZCkKLQl7CS8vIENsZWFyIHRoZSBDbWRRRWxlbWVudHMuCi0JCUNtZFFFbG10CSpwQ21kUUVsbXQgPSBOVUxMOwotCi0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9TVE9QRUQ7Ci0JCXdoaWxlKHBBZC0+Q21kUS5zaXplKQotCQl7Ci0JCQlSVFVTQkRlcXVldWVDbWQoJnBBZC0+Q21kUSwgJnBDbWRRRWxtdCk7Ci0JCQlpZiAocENtZFFFbG10KQotCQkJewotCQkJCWlmIChwQ21kUUVsbXQtPkNtZEZyb21OZGlzID09IFRSVUUpCi0JCQkJewotCQkJCQlpZiAocENtZFFFbG10LT5idWZmZXIgIT0gTlVMTCkKLQkJCQkJCU5kaXNGcmVlTWVtb3J5KHBDbWRRRWxtdC0+YnVmZmVyLCBwQ21kUUVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0KLQkJCQkJTmRpc0ZyZWVNZW1vcnkocENtZFFFbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKChwQ21kUUVsbXQtPmJ1ZmZlciAhPSBOVUxMKSAmJiAocENtZFFFbG10LT5idWZmZXJsZW5ndGggIT0gMCkpCi0JCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQtPmJ1ZmZlciwgcENtZFFFbG10LT5idWZmZXJsZW5ndGgsIDApOwotCQkgICAgICAgICAgICB7Ci0JCQkJCQlOZGlzRnJlZU1lbW9yeShwQ21kUUVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JfQotCS8qIG5vdGlmeSB0aGUgZXhpdCByb3V0aW5lIHRoYXQgd2UncmUgYWN0dWFsbHkgZXhpdGluZyBub3cKLQkgKgotCSAqIGNvbXBsZXRlKCkvd2FpdF9mb3JfY29tcGxldGlvbigpIGlzIHNpbWlsYXIgdG8gdXAoKS9kb3duKCksCi0JICogZXhjZXB0IHRoYXQgY29tcGxldGUoKSBpcyBzYWZlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdHJ1Y3R1cmUKLQkgKiBpcyBnZXR0aW5nIGRlbGV0ZWQgaW4gYSBwYXJhbGxlbCBtb2RlIG9mIGV4ZWN1dGlvbiAoaS5lLiBqdXN0Ci0JICogYWZ0ZXIgdGhlIGRvd24oKSAtLSB0aGF0J3MgbmVjZXNzYXJ5IGZvciB0aGUgdGhyZWFkLXNodXRkb3duCi0JICogY2FzZS4KLQkgKgotCSAqIGNvbXBsZXRlX2FuZF9leGl0KCkgZ29lcyBldmVuIGZ1cnRoZXIgdGhhbiB0aGlzIC0tIGl0IGlzIHNhZmUgaW4KLQkgKiB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWQgb2YgdGhlIGNhbGxlciBpcyBnb2luZyBhd2F5IChub3QganVzdAotCSAqIHRoZSBzdHJ1Y3R1cmUpIC0tIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgbW9kdWxlLXJlbW92ZSBjYXNlLgotCSAqIFRoaXMgaXMgaW1wb3J0YW50IGluIHByZWVtcHRpb24ga2VybmVscywgd2hpY2ggdHJhbnNmZXIgdGhlIGZsb3cKLQkgKiBvZiBleGVjdXRpb24gaW1tZWRpYXRlbHkgdXBvbiBhIGNvbXBsZXRlKCkuCi0JICovCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCAiPC0tLVJUVVNCQ21kVGhyZWFkXG4iKSk7Ci0KLQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBOVUxMOwotCi0JY29tcGxldGVfYW5kX2V4aXQgKCZwQWQtPkNtZFFDb21wbGV0ZSwgMCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBSVDI4NzBfVGltZXJRX0hhbmRsZShSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlpbnQgc3RhdHVzOwotCVJBTElOS19USU1FUl9TVFJVQ1QJKnBUaW1lcjsKLQlSVDI4NzBfVElNRVJfRU5UUlkJKnBFbnRyeTsKLQl1bnNpZ25lZCBsb25nCWlycUZsYWc7Ci0KLQl3aGlsZSghcEFkLT5UaW1lckZ1bmNfa2lsbCkKLQl7Ci0vLwkJcHJpbnRrKCJ3YWl0aW5nIGZvciBldmVudCFcbiIpOwotCQlwVGltZXIgPSBOVUxMOwotCi0JCXN0YXR1cyA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpKTsKLQotCQlpZiAocEFkLT5UaW1lclEuc3RhdHVzID09IFJUMjg3MF9USFJFQURfU1RPUEVEKQotCQkJYnJlYWs7Ci0KLQkJLy8gZXZlbnQgaGFwcGVuZWQuCi0JCXdoaWxlKHBBZC0+VGltZXJRLnBRSGVhZCkKLQkJewotCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFnKTsKLQkJCXBFbnRyeSA9IHBBZC0+VGltZXJRLnBRSGVhZDsKLQkJCWlmIChwRW50cnkpCi0JCQl7Ci0JCQkJcFRpbWVyID0gcEVudHJ5LT5wUmFUaW1lcjsKLQotCQkJCS8vIHVwZGF0ZSBwUUhlYWQKLQkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwRW50cnktPnBOZXh0OwotCQkJCWlmIChwRW50cnkgPT0gcEFkLT5UaW1lclEucFFUYWlsKQotCQkJCQlwQWQtPlRpbWVyUS5wUVRhaWwgPSBOVUxMOwotCi0JCQkJLy8gcmV0dXJuIHRoaXMgcXVldWUgZW50cnkgdG8gdGltZXJRRnJlZUxpc3QuCi0JCQkJcEVudHJ5LT5wTmV4dCA9IHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0OwotCQkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcEVudHJ5OwotCQkJfQotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWcpOwotCi0JCQlpZiAocFRpbWVyKQotCQkJewotCQkJCWlmIChwVGltZXItPmhhbmRsZSAhPSBOVUxMKQotCQkJCWlmICghcEFkLT5QTV9GbGdTdXNwZW5kKQotCQkJCQlwVGltZXItPmhhbmRsZShOVUxMLCAoUFZPSUQpIHBUaW1lci0+Y29va2llLCBOVUxMLCBwVGltZXIpOwotCQkJCWlmICgocFRpbWVyLT5SZXBlYXQpICYmIChwVGltZXItPlN0YXRlID09IEZBTFNFKSkKLQkJCQkJUlRNUF9PU19BZGRfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBUaW1lci0+VGltZXJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfU1RPUEVEOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotCi1JTlQgVGltZXJRVGhyZWFkKAotCUlOIE9VVCBQVk9JRCBDb250ZXh0KQotewotCVBSVE1QX0FEQVBURVIJcEFkOwotCVBPU19DT09LSUUJcE9iajsKLQotCXBBZCA9IChQUlRNUF9BREFQVEVSKUNvbnRleHQ7Ci0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXJ0bXBfb3NfdGhyZWFkX2luaXQoInJ0Mjg3MFRpbWVyUUhhbmRsZSIsIChQVk9JRCkmKHBBZC0+VGltZXJRQ29tcGxldGUpKTsKLQotCVJUMjg3MF9UaW1lclFfSGFuZGxlKHBBZCk7Ci0KLQkvKiBub3RpZnkgdGhlIGV4aXQgcm91dGluZSB0aGF0IHdlJ3JlIGFjdHVhbGx5IGV4aXRpbmcgbm93Ci0JICoKLQkgKiBjb21wbGV0ZSgpL3dhaXRfZm9yX2NvbXBsZXRpb24oKSBpcyBzaW1pbGFyIHRvIHVwKCkvZG93bigpLAotCSAqIGV4Y2VwdCB0aGF0IGNvbXBsZXRlKCkgaXMgc2FmZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3RydWN0dXJlCi0JICogaXMgZ2V0dGluZyBkZWxldGVkIGluIGEgcGFyYWxsZWwgbW9kZSBvZiBleGVjdXRpb24gKGkuZS4ganVzdAotCSAqIGFmdGVyIHRoZSBkb3duKCkgLS0gdGhhdCdzIG5lY2Vzc2FyeSBmb3IgdGhlIHRocmVhZC1zaHV0ZG93bgotCSAqIGNhc2UuCi0JICoKLQkgKiBjb21wbGV0ZV9hbmRfZXhpdCgpIGdvZXMgZXZlbiBmdXJ0aGVyIHRoYW4gdGhpcyAtLSBpdCBpcyBzYWZlIGluCi0JICogdGhlIGNhc2UgdGhhdCB0aGUgdGhyZWFkIG9mIHRoZSBjYWxsZXIgaXMgZ29pbmcgYXdheSAobm90IGp1c3QKLQkgKiB0aGUgc3RydWN0dXJlKSAtLSB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIG1vZHVsZS1yZW1vdmUgY2FzZS4KLQkgKiBUaGlzIGlzIGltcG9ydGFudCBpbiBwcmVlbXB0aW9uIGtlcm5lbHMsIHdoaWNoIHRyYW5zZmVyIHRoZSBmbG93Ci0JICogb2YgZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gYSBjb21wbGV0ZSgpLgotCSAqLwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCggIjwtLS0lc1xuIixfX2Z1bmNfXykpOwotCi0JcE9iai0+VGltZXJRVGhyX3BpZCA9IE5VTEw7Ci0KLQljb21wbGV0ZV9hbmRfZXhpdCgmcEFkLT5UaW1lclFDb21wbGV0ZSwgMCk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi1SVDI4NzBfVElNRVJfRU5UUlkgKlJUMjg3MF9UaW1lclFfSW5zZXJ0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKLXsKLQlSVDI4NzBfVElNRVJfRU5UUlkgKnBRTm9kZSA9IE5VTEwsICpwUVRhaWw7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JaWYgKHBBZC0+VGltZXJRLnN0YXR1cyAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKLQl7Ci0JCWlmKHBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0KQotCQl7Ci0JCQlwUU5vZGUgPSBwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdDsKLQkJCXBBZC0+VGltZXJRLnBRUG9sbEZyZWVMaXN0ID0gcFFOb2RlLT5wTmV4dDsKLQotCQkJcFFOb2RlLT5wUmFUaW1lciA9IHBUaW1lcjsKLQkJCXBRTm9kZS0+cE5leHQgPSBOVUxMOwotCi0JCQlwUVRhaWwgPSBwQWQtPlRpbWVyUS5wUVRhaWw7Ci0JCQlpZiAocEFkLT5UaW1lclEucFFUYWlsICE9IE5VTEwpCi0JCQkJcFFUYWlsLT5wTmV4dCA9IHBRTm9kZTsKLQkJCXBBZC0+VGltZXJRLnBRVGFpbCA9IHBRTm9kZTsKLQkJCWlmIChwQWQtPlRpbWVyUS5wUUhlYWQgPT0gTlVMTCkKLQkJCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwUU5vZGU7Ci0JCX0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQotCQlpZiAocFFOb2RlKQotCQkJdXAoJnBBZC0+UlRVU0JUaW1lcl9zZW1hcGhvcmUpOwotCQkJLy93YWtlX3VwKCZ0aW1lcldhaXRRKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQl9Ci0JcmV0dXJuIHBRTm9kZTsKLX0KLQotCi1CT09MRUFOIFJUMjg3MF9UaW1lclFfUmVtb3ZlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJBTElOS19USU1FUl9TVFJVQ1QgKnBUaW1lcikKLXsKLQlSVDI4NzBfVElNRVJfRU5UUlkgKnBOb2RlLCAqcFByZXYgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgaXJxRmxhZ3M7Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPlRpbWVyUUxvY2ssIGlycUZsYWdzKTsKLQlpZiAocEFkLT5UaW1lclEuc3RhdHVzID49IFJUMjg3MF9USFJFQURfSU5JVEVEKQotCXsKLQkJcE5vZGUgPSBwQWQtPlRpbWVyUS5wUUhlYWQ7Ci0JCXdoaWxlIChwTm9kZSkKLQkJewotCQkJaWYgKHBOb2RlLT5wUmFUaW1lciA9PSBwVGltZXIpCi0JCQkJYnJlYWs7Ci0JCQlwUHJldiA9IHBOb2RlOwotCQkJcE5vZGUgPSBwTm9kZS0+cE5leHQ7Ci0JCX0KLQotCQkvLyBOb3cgbW92ZSBpdCB0byBmcmVlTGlzdCBxdWV1ZS4KLQkJaWYgKHBOb2RlKQotCQl7Ci0JCQlpZiAocE5vZGUgPT0gcEFkLT5UaW1lclEucFFIZWFkKQotCQkJCXBBZC0+VGltZXJRLnBRSGVhZCA9IHBOb2RlLT5wTmV4dDsKLQkJCWlmIChwTm9kZSA9PSBwQWQtPlRpbWVyUS5wUVRhaWwpCi0JCQkJcEFkLT5UaW1lclEucFFUYWlsID0gcFByZXY7Ci0JCQlpZiAocFByZXYgIT0gTlVMTCkKLQkJCQlwUHJldi0+cE5leHQgPSBwTm9kZS0+cE5leHQ7Ci0KLQkJCS8vIHJldHVybiB0aGlzIHF1ZXVlIGVudHJ5IHRvIHRpbWVyUUZyZWVMaXN0LgotCQkJcE5vZGUtPnBOZXh0ID0gcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3Q7Ci0JCQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IHBOb2RlOwotCQl9Ci0JfQotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi12b2lkIFJUMjg3MF9UaW1lclFfRXhpdChSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlSVDI4NzBfVElNRVJfRU5UUlkgKnBUaW1lclE7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotCXdoaWxlIChwQWQtPlRpbWVyUS5wUUhlYWQpCi0JewotCQlwVGltZXJRID0gcEFkLT5UaW1lclEucFFIZWFkOwotCQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBwVGltZXJRLT5wTmV4dDsKLQkJLy8gcmVtb3ZlIHRoZSB0aW1lUQotCX0KLQlwQWQtPlRpbWVyUS5wUVBvbGxGcmVlTGlzdCA9IE5VTEw7Ci0Jb3NfZnJlZV9tZW0ocEFkLCBwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCk7Ci0JcEFkLT5UaW1lclEucFFUYWlsID0gTlVMTDsKLQlwQWQtPlRpbWVyUS5wUUhlYWQgPSBOVUxMOwotCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfU1RPUEVEOwotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0KLX0KLQotCi12b2lkIFJUMjg3MF9UaW1lclFfSW5pdChSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlpbnQgCWk7Ci0JUlQyODcwX1RJTUVSX0VOVFJZICpwUU5vZGUsICpwRW50cnk7Ci0JdW5zaWduZWQgbG9uZyBpcnFGbGFnczsKLQotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlRpbWVyUUxvY2spOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UaW1lclFMb2NrLCBpcnFGbGFncyk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+VGltZXJRLCBzaXplb2YocEFkLT5UaW1lclEpKTsKLQkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VGltZXJRLmNvdW50LCAwKTsKLQotCS8qIEluaXRpYWxpc2UgdGhlIHdhaXQgcSBoZWFkICovCi0JLy9pbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aW1lcldhaXRRKTsKLQotCW9zX2FsbG9jX21lbShwQWQsICZwQWQtPlRpbWVyUS5wVGltZXJRUG9sbCwgc2l6ZW9mKFJUMjg3MF9USU1FUl9FTlRSWSkgKiBUSU1FUl9RVUVVRV9TSVpFX01BWCk7Ci0JaWYgKHBBZC0+VGltZXJRLnBUaW1lclFQb2xsKQotCXsKLQkJcEVudHJ5ID0gTlVMTDsKLQkJcFFOb2RlID0gKFJUMjg3MF9USU1FUl9FTlRSWSAqKXBBZC0+VGltZXJRLnBUaW1lclFQb2xsOwotCQlmb3IgKGkgPSAwIDtpIDxUSU1FUl9RVUVVRV9TSVpFX01BWDsgaSsrKQotCQl7Ci0JCQlwUU5vZGUtPnBOZXh0ID0gcEVudHJ5OwotCQkJcEVudHJ5ID0gcFFOb2RlOwotCQkJcFFOb2RlKys7Ci0JCX0KLQkJcEFkLT5UaW1lclEucFFQb2xsRnJlZUxpc3QgPSBwRW50cnk7Ci0JCXBBZC0+VGltZXJRLnBRSGVhZCA9IE5VTEw7Ci0JCXBBZC0+VGltZXJRLnBRVGFpbCA9IE5VTEw7Ci0JCXBBZC0+VGltZXJRLnN0YXR1cyA9IFJUMjg3MF9USFJFQURfSU5JVEVEOwotCX0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VGltZXJRTG9jaywgaXJxRmxhZ3MpOwotfQotCi0KLVZPSUQgUlQyODcwX1dhdGNoRG9nKElOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JaW50IAkJCQkJaWR4OwotCVVMT05HCQkJCWlycUZsYWdzOwotCVBVUkIJCSAgIAkJcFVyYjsKLQlCT09MRUFOCQkJCW5lZWREdW1wU2VxID0gRkFMU0U7Ci0JVUlOVDMyICAgICAgICAgIAlNQUNWYWx1ZTsKLQotCi0JaWR4ID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYUlhRX1BDTlQsICZNQUNWYWx1ZSk7Ci0JaWYgKChNQUNWYWx1ZSAmIDB4ZmYpICE9MCApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUWCBRVUVVRSAwIE5vdCBFTVBUWShWYWx1ZT0weCUweCkuICEhISEhISEhISEhISEhIVxuIiwgTUFDVmFsdWUpKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMTIpOwotCQl3aGlsZSgoTUFDVmFsdWUgJjB4ZmYpICE9IDAgJiYgKGlkeCsrIDwgMTApKQotCQl7Ci0JCSAgICAgICAgUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOwotCQkgICAgICAgIE5kaXNNU2xlZXAoMSk7Ci0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX0NGRywgMHhmNDAwMDYpOwotCX0KLQotLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCWlkeCA9IDA7Ci0JaWYgKChNQUNWYWx1ZSAmIDB4ZmYwMCkgIT0wICkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRYIFFVRVVFIDEgTm90IEVNUFRZKFZhbHVlPTB4JTB4KS4gISEhISEhISEhISEhISEhXG4iLCBNQUNWYWx1ZSkpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwYSk7Ci0JCXdoaWxlKChNQUNWYWx1ZSAmMHhmZjAwKSAhPSAwICYmIChpZHgrKyA8IDEwKSkKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWFJYUV9QQ05ULCAmTUFDVmFsdWUpOwotCQkJTmRpc01TbGVlcCgxKTsKLQkJfQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfQ0ZHLCAweGY0MDAwNik7Ci0JfQotCi0JaWYgKHBBZC0+d2F0Y2hEb2dSeE92ZXJGbG93Q250ID49IDIpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYXliZSB0aGUgUnggQnVsay1JbiBoYW5nZWQhIENhbmNlbCB0aGUgcGVuZGluZyBSeCBidWxrcyByZXF1ZXN0IVxuIikpOwotCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhbGwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gdG8gY2FuY2VsIHRoZSBwZW5kaW5nIFJ4IEJ1bGshXG4iKSk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOwotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwgTlVMTCwgMCk7Ci0JCQluZWVkRHVtcFNlcSA9IFRSVUU7Ci0JCX0KLQkJcEFkLT53YXRjaERvZ1J4T3ZlckZsb3dDbnQgPSAwOwotCX0KLQotCi0JZm9yIChpZHggPSAwOyBpZHggPCBOVU1fT0ZfVFhfUklORzsgaWR4KyspCi0JewotCQlwVXJiID0gTlVMTDsKLQotCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKLQkJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW2lkeF0gPT0gVFJVRSkgJiYgcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudCkKLQkJewotCQkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdKys7Ci0KLQkJCWlmICgocEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtpZHhdID4gMikgJiYKLQkJCQkgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUIHwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCQkJKQotCQkJewotCQkJCS8vIEZJWE1FOiBGb2xsb3dpbmcgY29kZSBqdXN0IHN1cHBvcnQgc2luZ2xlIGJ1bGsgb3V0LiBJZiB5b3Ugd2FubmEgc3VwcG9ydCBtdWx0aXBsZSBidWxrIG91dC4gTW9kaWZ5IGl0IQotCQkJCXBIVFRYQ29udGV4dCA9IChQSFRfVFhfQ09OVEVYVCkoJnBBZC0+VHhDb250ZXh0W2lkeF0pOwotCQkJCWlmIChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcpCi0JCQkJewkvLyBDaGVjayBUeENvbnRleHQuCi0JCQkJCXBVcmIgPSBwSFRUWENvbnRleHQtPnBVcmI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlkeCA9PSBNR01UUElQRUlEWCkKLQkJCQl7Ci0JCQkJCVBUWF9DT05URVhUIHBNTE1FQ29udGV4dCwgcE5VTExDb250ZXh0LCBwUHNQb2xsQ29udGV4dDsKLQotCQkJCQkvL0NoZWNrIE1nbXRDb250ZXh0LgotCQkJCQlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpKHBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4RG1hSWR4XS5BbGxvY1ZhKTsKLQkJCQkJcFBzUG9sbENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPlBzUG9sbENvbnRleHQpOwotCQkJCQlwTlVMTENvbnRleHQgPSAoUFRYX0NPTlRFWFQpKCZwQWQtPk51bGxDb250ZXh0KTsKLQotCQkJCQlpZiAocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQl7Ci0JCQkJCQlBU1NFUlQocE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nKTsKLQkJCQkJCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQl7Ci0JCQkJCQlBU1NFUlQocE5VTExDb250ZXh0LT5JUlBQZW5kaW5nKTsKLQkJCQkJCXBVcmIgPSBwTlVMTENvbnRleHQtPnBVcmI7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpCi0JCQkJCXsKLQkJCQkJCUFTU0VSVChwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyk7Ci0JCQkJCQlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWF5YmUgdGhlIFR4IEJ1bGstT3V0IGhhbmdlZCEgQ2FuY2VsIHRoZSBwZW5kaW5nIFR4IGJ1bGtzIHJlcXVlc3Qgb2YgaWR4KCVkKSFcbiIsIGlkeCkpOwotCQkJCWlmIChwVXJiKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVW5saW5rIHRoZSBwZW5kaW5nIFVSQiFcbiIpKTsKLQkJCQkJLy8gdW5saW5rIGl0IG5vdwotCQkJCQlSVFVTQl9VTkxJTktfVVJCKHBVcmIpOwotCQkJCQkvLyBTbGVlcCAyMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yawotCQkJCQlSVE1QdXNlY0RlbGF5KDIwMCk7Ci0JCQkJCW5lZWREdW1wU2VxID0gVFJVRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiVW5rb253IGJ1bGtPdXQgVVJCIG1heWJlIGhhbmdlZCEhISEhISEhISEhIVxuIikpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbaWR4XSwgaXJxRmxhZ3MpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW2lkeF0sIGlycUZsYWdzKTsKLQkJfQotCX0KLQotCS8vIEZvciBTaWdtYSBkZWJ1ZywgZHVtcCB0aGUgYmFfcmVvcmRlcmluZyBzZXF1ZW5jZS4KLQlpZigobmVlZER1bXBTZXEgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKLQl7Ci0JCVVTSE9SVAkJCQlJZHg7Ci0JCVBCQV9SRUNfRU5UUlkJCXBCQUVudHJ5ID0gTlVMTDsKLQkJVUNIQVIJCQkJY291bnQgPSAwOwotCQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQotCQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkJBUmVjV2NpZEFycmF5WzBdOwotCi0JCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCWlmKChwQkFFbnRyeS0+bGlzdC5xbGVuID4gMCkgJiYgKHBCQUVudHJ5LT5saXN0Lm5leHQgIT0gTlVMTCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5JQ1VwZGF0ZVJhd0NvdW50ZXJzKCk6VGhlIFF1ZXVlaW5nIHBrdCBpbiByZW9yZGVyaW5nIGJ1ZmZlcjpcbiIpKTsKLQkJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwotCQkJbXBkdV9ibGsgPSBwQkFFbnRyeS0+bGlzdC5uZXh0OwotCQkJd2hpbGUgKG1wZHVfYmxrKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlx0JWQ6U2VxLSVkLCBiQU1TRFUtJWQhXG4iLCBjb3VudCwgbXBkdV9ibGstPlNlcXVlbmNlLCBtcGR1X2Jsay0+YkFNU0RVKSk7Ci0JCQkJbXBkdV9ibGsgPSBtcGR1X2Jsay0+bmV4dDsKLQkJCQljb3VudCsrOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcbnBCQUVudHJ5LT5MYXN0SW5kU2VxPSVkIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKLQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwotCQl9Ci0JfQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFJlbGVhc2UgYWxsb2NhdGVkIHJlc291cmNlcy4KLQotQXJndW1lbnRzOgotICAgICpkZXYJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0JcEFkCQkJCQlkcml2ZXIgY29udHJvbCBibG9jayBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCBfcnR1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiA9IE5VTEw7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHVucmVnaXN0ZXIgdXNibmV0IHVzYi0lcy0lc1xuIiwKLQkJCQlkZXYtPmJ1cy0+YnVzX25hbWUsIGRldi0+ZGV2cGF0aCkpOwotCWlmICghcEFkKQotCXsKLQkJdXNiX3B1dF9kZXYoZGV2KTsKLQotCQlwcmludGsoInJ0dXNiX2Rpc2Nvbm5lY3Q6IHBBZCA9PSBOVUxMIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7Ci0KLQotCi0JLy8gZm9yIGRlYnVnLCB3YWl0IHRvIHNob3cgc29tZSBtZXNzYWdlcyB0byAvcHJvYyBzeXN0ZW0KLQl1ZGVsYXkoMSk7Ci0KLQotCi0KLQluZXRfZGV2ID0gcEFkLT5uZXRfZGV2OwotCWlmIChwQWQtPm5ldF9kZXYgIT0gTlVMTCkKLQl7Ci0JCXByaW50aygicnR1c2JfZGlzY29ubmVjdDogdW5yZWdpc3Rlcl9uZXRkZXYoKSwgZGV2LT5uYW1lPSVzIVxuIiwgbmV0X2Rldi0+bmFtZSk7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2IChwQWQtPm5ldF9kZXYpOwotCX0KLQl1ZGVsYXkoMSk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQl1ZGVsYXkoMSk7Ci0KLQkvLyBmcmVlIG5ldF9kZXZpY2UgbWVtb3J5Ci0JZnJlZV9uZXRkZXYobmV0X2Rldik7Ci0KLQkvLyBmcmVlIGFkYXB0ZXIgbWVtb3J5Ci0JUlRNUEZyZWVBZGFwdGVyKHBBZCk7Ci0KLQkvLyByZWxlYXNlIGEgdXNlIG9mIHRoZSB1c2IgZGV2aWNlIHN0cnVjdHVyZQotCXVzYl9wdXRfZGV2KGRldik7Ci0JdWRlbGF5KDEpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiIFJUVVNCIGRpc2Nvbm5lY3Qgc3VjY2Vzc2Z1bGx5XG4iKSk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBQcm9iZSBSVDI4WFggY2hpcHNldC4KLQotQXJndW1lbnRzOgotICAgICpkZXYJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0JaW50ZXJmYWNlCi0JKmlkX3RhYmxlCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlIElECi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IHJ0dXNiX3Byb2JlIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJCQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZDsKLQlyZXR1cm4gKGludClydDI4eHhfcHJvYmUoKHZvaWQgKilpbnRmLCAodm9pZCAqKWlkLCAwLCAmcEFkKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBydHVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICAgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JUFJUTVBfQURBUFRFUiAgICAgICBwQWQ7Ci0KLQotCXBBZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLQotCV9ydHVzYl9kaXNjb25uZWN0KGRldiwgcEFkKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENsb3NlIGtlcm5lbCB0aHJlYWRzLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBOT05FCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjh4eFRocmVhZFRlcm1pbmF0ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlQT1NfQ09PS0lFCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0JSU5UCQkJcmV0OwotCi0KLQkvLyBTbGVlcCA1MCBtaWxsaXNlY29uZHMgc28gcGVuZGluZyBpbyBtaWdodCBmaW5pc2ggbm9ybWFsbHkKLQlSVE1QdXNlY0RlbGF5KDUwMDAwKTsKLQotCS8vIFdlIHdhbnQgdG8gd2FpdCB1bnRpbCBhbGwgcGVuZGluZyByZWNlaXZlcyBhbmQgc2VuZHMgdG8gdGhlCi0JLy8gZGV2aWNlIG9iamVjdC4gV2UgY2FuY2VsIGFueQotCS8vIGlycHMuIFdhaXQgdW50aWwgc2VuZHMgYW5kIHJlY2VpdmVzIGhhdmUgc3RvcHBlZC4KLQlSVFVTQkNhbmNlbFBlbmRpbmdJUlBzKHBBZCk7Ci0KLQkvLyBUZXJtaW5hdGUgVGhyZWFkcwotCi0JaWYgKHBpZF9ucihwT2JqLT5UaW1lclFUaHJfcGlkKSA+IDApCi0JewotCQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgVGltZXJRVGhyX3BpZD0lZCFcbiIsIHBpZF9ucihwT2JqLT5UaW1lclFUaHJfcGlkKSk7Ci0JCW1iKCk7Ci0JCXBBZC0+VGltZXJGdW5jX2tpbGwgPSAxOwotCQltYigpOwotCQlyZXQgPSBraWxsX3BpZChwT2JqLT5UaW1lclFUaHJfcGlkLCBTSUdURVJNLCAxKTsKLQkJaWYgKHJldCkKLQkJewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBzdG9wIFRpbWVyUVRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAotCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIHBpZF9ucihwT2JqLT5UaW1lclFUaHJfcGlkKSwgcmV0KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBBZC0+VGltZXJRQ29tcGxldGUpOwotCQkJcE9iai0+VGltZXJRVGhyX3BpZCA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlpZiAocGlkX25yKHBPYmotPk1MTUVUaHJfcGlkKSA+IDApCi0JewotCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgTUxNRVRocl9waWQ9JWQhXG4iLCBwaWRfbnIocE9iai0+TUxNRVRocl9waWQpKTsKLQkJbWIoKTsKLQkJcEFkLT5tbG1lX2tpbGwgPSAxOwotCQkvL1JUMjhYWF9NTE1FX0hBTkRMRVIocEFkKTsKLQkJbWIoKTsKLQkJcmV0ID0ga2lsbF9waWQocE9iai0+TUxNRVRocl9waWQsIFNJR1RFUk0sIDEpOwotCQlpZiAocmV0KQotCQl7Ci0JCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBNbG1lIHRocmVhZCwgcGlkPSVkLCByZXQ9JWQhXG4iLAotCQkJCQlwQWQtPm5ldF9kZXYtPm5hbWUsIHBpZF9ucihwT2JqLT5NTE1FVGhyX3BpZCksIHJldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3dhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPm5vdGlmeSk7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmcEFkLT5tbG1lQ29tcGxldGUpOwotCQkJcE9iai0+TUxNRVRocl9waWQgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKHBpZF9ucihwT2JqLT5SVFVTQkNtZFRocl9waWQpID4gMCkKLQl7Ci0JCXByaW50aygiVGVybWluYXRlIHRoZSBSVFVTQkNtZFRocl9waWQ9JWQhXG4iLCBwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSk7Ci0JCW1iKCk7Ci0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9TVE9QRUQ7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCQltYigpOwotCQkvL1JUVVNCQ01EVXAocEFkKTsKLQkJcmV0ID0ga2lsbF9waWQocE9iai0+UlRVU0JDbWRUaHJfcGlkLCBTSUdURVJNLCAxKTsKLQkJaWYgKHJldCkKLQkJewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBSVFVTQkNtZCB0aHJlYWQsIHBpZD0lZCwgcmV0PSVkIVxuIiwKLQkJCQkJcEFkLT5uZXRfZGV2LT5uYW1lLCBwaWRfbnIocE9iai0+UlRVU0JDbWRUaHJfcGlkKSwgcmV0KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vd2FpdF9mb3JfY29tcGxldGlvbiAoJnBBZC0+bm90aWZ5KTsKLQkJCXdhaXRfZm9yX2NvbXBsZXRpb24gKCZwQWQtPkNtZFFDb21wbGV0ZSk7Ci0JCQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBOVUxMOwotCQl9Ci0JfQotCi0JLy8gS2lsbCB0YXNrbGV0cwotCXBBZC0+bWxtZV9raWxsID0gMDsKLQlwQWQtPkNtZFEuQ21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9VTktOT1dOOwotCXBBZC0+VGltZXJGdW5jX2tpbGwgPSAwOwotfQotCi0KLXZvaWQga2lsbF90aHJlYWRfdGFzayhJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JdGFza2xldF9raWxsKCZwT2JqLT5yeF9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMV9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOwotCi19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDaGVjayB0aGUgY2hpcHNldCB2ZW5kb3IvcHJvZHVjdCBJRC4KLQotQXJndW1lbnRzOgotICAgIF9kZXZfcAkJCQlQb2ludCB0byB0aGUgUENJIG9yIFVTQiBkZXZpY2UKLQotUmV0dXJuIFZhbHVlOgotICAgIFRSVUUJCQkJQ2hlY2sgb2sKLQlGQUxTRQkJCQlDaGVjayBmYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUMjhYWENoaXBzZXRDaGVjaygKLQlJTiB2b2lkICpfZGV2X3ApCi17Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilfZGV2X3A7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQlVSU5UMzIgaTsKLQotCi0JZm9yKGk9MDsgaTxydHVzYl91c2JfaWRfbGVuOyBpKyspCi0JewotCQlpZiAoZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IgPT0gcnR1c2JfdXNiX2lkW2ldLmlkVmVuZG9yICYmCi0JCQlkZXZfcC0+ZGVzY3JpcHRvci5pZFByb2R1Y3QgPT0gcnR1c2JfdXNiX2lkW2ldLmlkUHJvZHVjdCkKLQkJewotCQkJcHJpbnRrKCJydDI4NzA6IGlkVmVuZG9yID0gMHgleCwgaWRQcm9kdWN0ID0gMHgleFxuIiwKLQkJCQkJZGV2X3AtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIGRldl9wLT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpID09IHJ0dXNiX3VzYl9pZF9sZW4pCi0JewotCQlwcmludGsoInJ0Mjg3MDogRXJyb3IhIERldmljZSBEZXNjcmlwdG9yIG5vdCBtYXRjaGluZyFcbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0IG5ldCBkZXZpY2Ugc3RydWN0dXJlLgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotICAgICpuZXRfZGV2CQkJUG9pbnQgdG8gdGhlIG5ldCBkZXZpY2UKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotICAgIFRSVUUJCQkJSW5pdCBvawotCUZBTFNFCQkJCUluaXQgZmFpbAotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVDI4WFhOZXREZXZJbml0KAotCUlOIHZvaWQgCQkJCSpfZGV2X3AsCi0JSU4gc3RydWN0ICBuZXRfZGV2aWNlCSpuZXRfZGV2LAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKilfZGV2X3A7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldl9wID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKLQotCi0JcEFkLT5jb25maWcgPSAmZGV2X3AtPmNvbmZpZy0+ZGVzYzsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXQgbmV0IGRldmljZSBzdHJ1Y3R1cmUuCi0KLUFyZ3VtZW50czoKLSAgICBfZGV2X3AJCQkJUG9pbnQgdG8gdGhlIFBDSSBvciBVU0IgZGV2aWNlCi0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBUUlVFCQkJCUNvbmZpZyBvawotCUZBTFNFCQkJCUNvbmZpZyBmYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUMjhYWFByb2JlUG9zdENvbmZpZygKLQlJTiB2b2lkIAkJCQkqX2Rldl9wLAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQsCi0JSU4gSU5UMzIJCQkJaW50ZXJmYWNlKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gKHN0cnVjdCB1c2JfaW50ZXJmYWNlICopX2Rldl9wOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7Ci0JVUxPTkcgQnVsa091dElkeDsKLQlVSU5UMzIgaTsKLQotCi0JLyogZ2V0IHRoZSBhY3RpdmUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KLQlpZmFjZV9kZXNjID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7Ci0KLQkvKiBnZXQgIyBvZiBlbnBvaW50cyAgKi8KLQlwQWQtPk51bWJlck9mUGlwZXMgPSBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkoIk51bUVuZHBvaW50cz0lZFxuIiwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzKSk7Ci0KLQkvKiBDb25maWd1cmUgUGlwZXMgKi8KLQlCdWxrT3V0SWR4ID0gMDsKLQotCWZvcihpPTA7IGk8cEFkLT5OdW1iZXJPZlBpcGVzOyBpKyspCi0JewotCQlpZiAoKGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYm1BdHRyaWJ1dGVzID09Ci0JCQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgJiYKLQkJCSgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKLQkJCQlVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfSU4pKQotCQl7Ci0JCQlwQWQtPkJ1bGtJbkVwQWRkciA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzczsKLQkJCXBBZC0+QnVsa0luTWF4UGFja2V0U2l6ZSA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemU7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKLQkJCQkoIkJVTEsgSU4gTWF4aW11bVBhY2tldFNpemUgPSAlZFxuIiwgcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplKSk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJFUCBhZGRyZXNzID0gMHglMnhcbiIsIGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2MuYkVuZHBvaW50QWRkcmVzcykpOwotCQl9Ci0JCWVsc2UgaWYgKChpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlcyA9PQotCQkJCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSAmJgotCQkJCSgoaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYKLQkJCQkJVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkpCi0JCXsKLQkJCS8vIHRoZXJlIGFyZSA2IGJ1bGsgb3V0IEVQLiBFUDYgaGlnaGVzdCBwcmlvcml0eS4KLQkJCS8vIEVQMS00IGlzIEVEQ0EuICBFUDUgaXMgSENDQS4KLQkJCXBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0SWR4KytdID0gaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwotCQkJcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA9IGlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemU7Ci0KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKLQkJCQkoIkJVTEsgT1VUIE1heGltdW1QYWNrZXRTaXplID0gJWRcbiIsIHBBZC0+QnVsa091dE1heFBhY2tldFNpemUpKTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKLQkJCQkoIkVQIGFkZHJlc3MgPSAweCUyeCAgXG4iLCBpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MpKTsKLQkJfQotCX0KLQotCWlmICghKHBBZC0+QnVsa0luRXBBZGRyICYmIHBBZC0+QnVsa091dEVwQWRkclswXSkpCi0JewotCQlwcmludGsoIiVzOiBDb3VsZCBub3QgZmluZCBib3RoIGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50c1xuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBEaXNhYmxlIERNQS4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4WFhETUFEaXNhYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0JLy8gbm8gdXNlCi19Ci0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEVuYWJsZSBETUEuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOFhYRE1BRW5hYmxlKAotCUlOIFJUTVBfQURBUFRFUiAJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQwlHbG9DZmc7Ci0JVVNCX0RNQV9DRkdfU1RSVUMJVXNiQ2ZnOwotCWludAkJCQkJaSA9IDA7Ci0KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpIDwyMDApOwotCi0KLQlSVE1QdXNlY0RlbGF5KDUwKTsKLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKLQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAxOwotCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDE7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFdSSVRFIERNQSBvZmZzZXQgMHgyMDggPSAweCV4XG4iLCBHbG9DZmcud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLQotCVVzYkNmZy53b3JkID0gMDsKLQlVc2JDZmcuZmllbGQucGh5Y2xlYXIgPSAwOwotCS8qIHVzYiB2ZXJzaW9uIGlzIDEuMSxkbyBub3QgdXNlIGJ1bGsgaW4gYWdncmVnYXRpb24gKi8KLQlpZiAocEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID09IDUxMikKLQkJCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dFbiA9IDE7Ci0JLyogZm9yIGxhc3QgcGFja2V0LCBQQkYgbWlnaHQgdXNlIG1vcmUgdGhhbiBsaW1pdGVkLCBzbyBtaW51cyAyIHRvIHByZXZlbnQgZnJvbSBlcnJvciAqLwotCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dMbXQgPSAoTUFYX1JYQlVMS19TSVpFIC8xMDI0KS0zOwotCVVzYkNmZy5maWVsZC5SeEJ1bGtBZ2dUT3V0ID0gMHg4MDsgLyogMjAwNi0xMC0xOCAqLwotCVVzYkNmZy5maWVsZC5SeEJ1bGtFbiA9IDE7Ci0JVXNiQ2ZnLmZpZWxkLlR4QnVsa0VuID0gMTsKLQotCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCBVc2JDZmcud29yZCk7Ci0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBXcml0ZSBCZWFjb24gYnVmZmVyIHRvIEFzaWMuCi0KLUFyZ3VtZW50czoKLQkqcEFkCQkJCXRoZSByYXh4IGludGVyZmFjZSBkYXRhIHBvaW50ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlQyOHh4X1VwZGF0ZUJlYWNvblRvQXNpYygKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gSU5UCQkJCWFwaWR4LAotCUlOIFVMT05HCQkJRnJhbWVMZW4sCi0JSU4gVUxPTkcJCQlVcGRhdGVQb3MpCi17Ci0JUFVDSEFSICAgICAgICAJcEJlYWNvbkZyYW1lID0gTlVMTDsKLQlVQ0hBUiAgCQkJKnB0cjsKLQlVSU5UICAJCQlpLCBwYWRkaW5nOwotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQlVSU5UMzIJCQlsb25nVmFsdWU7Ci0JQk9PTEVBTgkJCWJCY25SZXEgPSBGQUxTRTsKLQlVQ0hBUgkJCWJjbl9pZHggPSAwOwotCi0KLQlpZiAocEJlYWNvbkZyYW1lID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBCZWFjb25GcmFtZSBpcyBOVUxMIVxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBCZWFjb25TeW5jID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBCZWFjb25TeW5jIGlzIE5VTEwhXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvL2lmICgocEFkLT5XZHNUYWIuTW9kZSA9PSBXRFNfQlJJREdFX01PREUpIHx8Ci0JLy8JKChwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYgPT0gTlVMTCkgfHwgIShwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYtPmZsYWdzICYgSUZGX1VQKSkKLQkvLwkpCi0JaWYgKGJCY25SZXEgPT0gRkFMU0UpCi0JewotCQkvKiB3aGVuIHRoZSByYSBpbnRlcmZhY2UgaXMgZG93biwgZG8gbm90IHNlbmQgaXRzIGJlYWNvbiBmcmFtZSAqLwotCQkvKiBjbGVhciBhbGwgemVybyAqLwotCQlmb3IoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBpLCAweDAwKTsKLQkJfQotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9ICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7Ci0JCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25UeFdJW2Jjbl9pZHhdLCBUWFdJX1NJWkUpOwotCX0KLQllbHNlCi0JewotCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7Ci0KLQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKSA9PSBGQUxTRSkKLQkJewkvLyBJZiBCZWFjb25UeFdJIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmV3cml0ZSB0aGUgVHhXSSBmb3IgdGhlIEJlYWNvbiBmcmFtZXMuCi0JCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwICY9ICh+KEJFQUNPTl9CSVRNQVBfTUFTSyAmICgxIDw8IGJjbl9pZHgpKSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtiY25faWR4XSwgJnBBZC0+QmVhY29uVHhXSSwgVFhXSV9TSVpFKTsKLQkJfQotCi0JCWlmICgocEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCAmICgxIDw8IGJjbl9pZHgpKSAhPSAoMSA8PCBiY25faWR4KSkKLQkJewotCQkJZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCi0JCQl7Ci0JCQkJbG9uZ1ZhbHVlID0gICpwdHIgKyAoKihwdHIrMSk8PDgpICsgKCoocHRyKzIpPDwxNikgKyAoKihwdHIrMyk8PDI0KTsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdWYWx1ZSk7Ci0JCQkJcHRyICs9IDQ7Ci0JCQl9Ci0JCX0KLQotCQlwdHIgPSBwQmVhY29uU3luYy0+QmVhY29uQnVmW2Jjbl9pZHhdOwotCQlwYWRkaW5nID0gKEZyYW1lTGVuICYgMHgwMSk7Ci0JCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuKSwgcGFkZGluZyk7Ci0JCUZyYW1lTGVuICs9IHBhZGRpbmc7Ci0JCWZvciAoaSA9IDAgOyBpIDwgRnJhbWVMZW4gLypIV19CRUFDT05fT0ZGU0VUKi87IGkgKz0gMikKLQkJewotCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwdHIsIHBCZWFjb25GcmFtZSwgMikgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocHRyLCBwQmVhY29uRnJhbWUsIDIpOwotCQkJCS8vc2hvcnRWYWx1ZSA9ICpwdHIgKyAoKihwdHIrMSk8PDgpOwotCQkJCS8vUlRNUF9JT19XUklURTgocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIFRYV0lfU0laRSArIGksIHNob3J0VmFsdWUpOwotCQkJCVJUVVNCTXVsdGlXcml0ZShwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgcHRyLCAyKTsKLQkJCX0KLQkJCXB0ciArPTI7Ci0JCQlwQmVhY29uRnJhbWUgKz0gMjsKLQkJfQotCi0JCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgfD0gKDEgPDwgYmNuX2lkeCk7Ci0KLQkJLy8gRm9yIEFQIGludGVyZmFjZSwgc2V0IHRoZSBEdGltQml0T24gc28gdGhhdCB3ZSBjYW4gc2VuZCBCY2FzdC9NY2FzdCBmcmFtZSBvdXQgYWZ0ZXIgdGhpcyBiZWFjb24gZnJhbWUuCi0JfQotCi19Ci0KLQotVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RvcCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlCRUFDT05fU1lOQ19TVFJVQ1QJKnBCZWFjb25TeW5jOwotCWludCBpLCBvZmZzZXQ7Ci0JQk9PTEVBTglDYW5jZWxsZWQgPSBUUlVFOwotCi0JcEJlYWNvblN5bmMgPSBwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYzsKLQlpZiAocEJlYWNvblN5bmMgJiYgcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbikKLQl7Ci0JCUlOVCBOdW1PZkJjbjsKLQotCQlOdW1PZkJjbiA9IE1BWF9NRVNIX05VTTsKLQotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCQlmb3IoaT0wOyBpPE51bU9mQmNuOyBpKyspCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbaV0sIEhXX0JFQUNPTl9PRkZTRVQpOwotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7Ci0KLQkJCWZvciAob2Zmc2V0PTA7IG9mZnNldDxIV19CRUFDT05fT0ZGU0VUOyBvZmZzZXQrPTQpCi0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbaV0gKyBvZmZzZXQsIDB4MDApOwotCi0JCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOwotCQl9Ci0JCXBCZWFjb25TeW5jLT5CZWFjb25CaXRNYXAgPSAwOwotCQlwQmVhY29uU3luYy0+RHRpbUJpdE9uID0gMDsKLQl9Ci19Ci0KLQotVk9JRCBSVDI4NzBfQnNzQmVhY29uU3RhcnQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JaW50IGFwaWR4OwotCUJFQUNPTl9TWU5DX1NUUlVDVAkqcEJlYWNvblN5bmM7Ci0vLwlMQVJHRV9JTlRFR0VSIAl0c2ZUaW1lLCBkZWx0YVRpbWU7Ci0KLQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOwotCWlmIChwQmVhY29uU3luYyAmJiBwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uKQotCXsKLQkJSU5UIE51bU9mQmNuOwotCi0JCU51bU9mQmNuID0gTUFYX01FU0hfTlVNOwotCi0JCWZvcihhcGlkeD0wOyBhcGlkeDxOdW1PZkJjbjsgYXBpZHgrKykKLQkJewotCQkJVUNIQVIgQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uID0gMDsKLQkJCVVDSEFSIFRpbUlFTG9jYXRpb25JbkJlYWNvbiA9IDA7Ci0KLQkJCU5kaXNaZXJvTWVtb3J5KHBCZWFjb25TeW5jLT5CZWFjb25CdWZbYXBpZHhdLCBIV19CRUFDT05fT0ZGU0VUKTsKLQkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25bYXBpZHhdID0gQ2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uOwotCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvblthcGlkeF0gPSBUaW1JRUxvY2F0aW9uSW5CZWFjb247Ci0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVthcGlkeF0sIFRYV0lfU0laRSk7Ci0JCX0KLQkJcEJlYWNvblN5bmMtPkJlYWNvbkJpdE1hcCA9IDA7Ci0JCXBCZWFjb25TeW5jLT5EdGltQml0T24gPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5SZXBlYXQgPSBUUlVFOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkFkanVzdCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvbkZhY3RvciA9IDB4ZmZmZmZmZmYgLyAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKTsKLQkJcEFkLT5Db21tb25DZmcuQmVhY29uUmVtYWluID0gKDB4ZmZmZmZmZmYgJSAocEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDEwKSkgKyAxOwotCQlwcmludGsoUlQyOHh4X0NISVBfTkFNRSAiX0Jzc0JlYWNvblN0YXJ0OkJlYWNvbkZhY3Rvcj0lZCwgQmVhY29uUmVtYWluPSVkIVxuIiwgcEFkLT5Db21tb25DZmcuQmVhY29uRmFjdG9yLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4pOwotCQlSVE1QU2V0VGltZXIoJnBBZC0+Q29tbW9uQ2ZnLkJlYWNvblVwZGF0ZVRpbWVyLCBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpOwotCi0JfQotfQotCi0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvbkluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKLQlpbnQgaTsKLQotCU5kaXNBbGxvY01lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgc2l6ZW9mKEJFQUNPTl9TWU5DX1NUUlVDVCksIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpCi0JewotCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOwotCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYywgc2l6ZW9mKEJFQUNPTl9TWU5DX1NUUlVDVCkpOwotCQlmb3IoaT0wOyBpIDwgSFdfQkVBQ09OX01BWF9DT1VOVDsgaSsrKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uQnVmW2ldLCBIV19CRUFDT05fT0ZGU0VUKTsKLQkJCXBCZWFjb25TeW5jLT5DYXBhYmlsaXR5SW5mb0xvY2F0aW9uSW5CZWFjb25baV0gPSAwOwotCQkJcEJlYWNvblN5bmMtPlRpbUlFTG9jYXRpb25JbkJlYWNvbltpXSA9IDA7Ci0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uU3luYy0+QmVhY29uVHhXSVtpXSwgVFhXSV9TSVpFKTsKLQkJfQotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKLQotCQkvL1JUTVBJbml0VGltZXIocEFkLCAmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihCZWFjb25VcGRhdGVFeGVjKSwgcEFkLCBUUlVFKTsKLQkJcEJlYWNvblN5bmMtPkVuYWJsZUJlYWNvbiA9IFRSVUU7Ci0JfQotfQotCi0KLVZPSUQgUlQyODcwX0Jzc0JlYWNvbkV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0JQkVBQ09OX1NZTkNfU1RSVUNUCSpwQmVhY29uU3luYzsKLQlCT09MRUFOCUNhbmNlbGxlZCA9IFRSVUU7Ci0JaW50IGk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcucEJlYWNvblN5bmMpCi0JewotCQlwQmVhY29uU3luYyA9IHBBZC0+Q29tbW9uQ2ZnLnBCZWFjb25TeW5jOwotCQlwQmVhY29uU3luYy0+RW5hYmxlQmVhY29uID0gRkFMU0U7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5Db21tb25DZmcuQmVhY29uVXBkYXRlVGltZXIsICZDYW5jZWxsZWQpOwotCQlwQmVhY29uU3luYy0+QmVhY29uQml0TWFwID0gMDsKLQotCQlmb3IoaT0wOyBpPEhXX0JFQUNPTl9NQVhfQ09VTlQ7IGkrKykKLQkJewotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvbkJ1ZltpXSwgSFdfQkVBQ09OX09GRlNFVCk7Ci0JCQlwQmVhY29uU3luYy0+Q2FwYWJpbGl0eUluZm9Mb2NhdGlvbkluQmVhY29uW2ldID0gMDsKLQkJCXBCZWFjb25TeW5jLT5UaW1JRUxvY2F0aW9uSW5CZWFjb25baV0gPSAwOwotCQkJTmRpc1plcm9NZW1vcnkocEJlYWNvblN5bmMtPkJlYWNvblR4V0lbaV0sIFRYV0lfU0laRSk7Ci0JCX0KLQotCQlOZGlzRnJlZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYywgSFdfQkVBQ09OX09GRlNFVCAqIEhXX0JFQUNPTl9NQVhfQ09VTlQsIDApOwotCQlwQWQtPkNvbW1vbkNmZy5wQmVhY29uU3luYyA9IE5VTEw7Ci0JfQotfQotCi1WT0lEIEJlYWNvblVwZGF0ZUV4ZWMoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OwotCUxBUkdFX0lOVEVHRVIJdHNmVGltZV9hOy8vLCB0c2ZUaW1lX2IsIGRlbHRhVGltZV9leHAsIGRlbHRhVGltZV9hYjsKLQlVSU5UMzIJCQlkZWx0YSwgcmVtYWluLCByZW1haW5fbG93LCByZW1haW5faGlnaDsKLS8vCUJPT0xFQU4JCQlwb3NpdGl2ZTsKLQotCVJlU3luY0JlYWNvblRpbWUocEFkKTsKLQotCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzAsICZ0c2ZUaW1lX2EudS5Mb3dQYXJ0KTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRTRl9USU1FUl9EVzEsICZ0c2ZUaW1lX2EudS5IaWdoUGFydCk7Ci0KLQotCS8vcG9zaXRpdmU9Z2V0RGVsdGFUaW1lKHRzZlRpbWVfYSwgZXhwZWN0ZWRUaW1lLCAmZGVsdGFUaW1lX2V4cCk7Ci0JcmVtYWluX2hpZ2ggPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25SZW1haW4gKiB0c2ZUaW1lX2EudS5IaWdoUGFydDsKLQlyZW1haW5fbG93ID0gdHNmVGltZV9hLnUuTG93UGFydCAlIChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOwotCXJlbWFpbiA9IChyZW1haW5faGlnaCArIHJlbWFpbl9sb3cpJShwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgMTApOwotCWRlbHRhID0gKHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA8PCAxMCkgLSByZW1haW47Ci0KLQlwQWQtPkNvbW1vbkNmZy5CZWFjb25VcGRhdGVUaW1lci5UaW1lclZhbHVlID0gKGRlbHRhID4+IDEwKSArIDEwOwotCi19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvS2NvbmZpZwppbmRleCBhZWE1YzgyLi5mZDNiYTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9LY29uZmlnCkBAIC0xLDUgKzEsNyBAQAogY29uZmlnIFJUMjg3MAogCXRyaXN0YXRlICJSYWxpbmsgMjg3MC8zMDcwIHdpcmVsZXNzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IgJiYgWDg2ICYmIFdMQU4KKwlzZWxlY3QgV0lSRUxFU1NfRVhUCisJc2VsZWN0IFdFWFRfUFJJVgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGRyaXZlciBmb3IgdGhlIFJhbGluayB4eDcwIHdpcmVsZXNzIGNoaXBzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvTWFrZWZpbGUKaW5kZXggMzA2YzMzMS4uNTIzZTdlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL01ha2VmaWxlCkBAIC0xLDI3ICsxLDM1IEBACisjCiBvYmotJChDT05GSUdfUlQyODcwKQkrPSBydDI4NzBzdGEubwogCiAjIFRPRE86IGFsbCBvZiB0aGVzZSBzaG91bGQgYmUgcmVtb3ZlZAogRVhUUkFfQ0ZMQUdTICs9IC1ETElOVVggLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVAotRVhUUkFfQ0ZMQUdTICs9IC1EUlQyODcwIC1EUlQzMDcwCitFWFRSQV9DRkxBR1MgKz0gLURSVE1QX01BQ19VU0IgLURSVE1QX1VTQl9TVVBQT1JUIC1EUlQyODcwIC1EUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFJUTVBfUkZfUldfU1VQUE9SVCAtRFJUTVBfRUZVU0VfU1VQUE9SVCAtRFJUMzB4eCAtRFJUMzA3MAogRVhUUkFfQ0ZMQUdTICs9IC1EREJHCiAKIHJ0Mjg3MHN0YS1vYmpzIDo9CQlcCi0JY29tbW9uL21kNS5vCQlcCisJY29tbW9uL2NyeXB0X21kNS5vCVwKKwljb21tb24vY3J5cHRfc2hhMi5vCVwKKwljb21tb24vY3J5cHRfaG1hYy5vCVwKIAljb21tb24vbWxtZS5vCQlcCi0JY29tbW9uL3J0bXBfd2VwLm8JXAorCWNvbW1vbi9jbW1fd2VwLm8JXAogCWNvbW1vbi9hY3Rpb24ubwkJXAogCWNvbW1vbi9jbW1fZGF0YS5vCVwKIAljb21tb24vcnRtcF9pbml0Lm8JXAotCWNvbW1vbi9ydG1wX3RraXAubwlcCisJY29tbW9uL2NtbV90a2lwLm8JXAorCWNvbW1vbi9jbW1fYWVzLm8JXAogCWNvbW1vbi9jbW1fc3luYy5vCVwKIAljb21tb24vZWVwcm9tLm8JCVwKIAljb21tb24vY21tX3Nhbml0eS5vCVwKIAljb21tb24vY21tX2luZm8ubwlcCisJY29tbW9uL2NtbV9jZmcubwlcCiAJY29tbW9uL2NtbV93cGEubwlcCiAJY29tbW9uL2Rmcy5vCQlcCiAJY29tbW9uL3NwZWN0cnVtLm8JXAorCWNvbW1vbi9ydG1wX3RpbWVyLm8JXAorCWNvbW1vbi9ydF9jaGFubmVsLm8JXAorCWNvbW1vbi9jbW1fYXNpYy5vCVwKIAlzdGEvYXNzb2MubwkJXAotCXN0YS9haXJvbmV0Lm8JCVwKIAlzdGEvYXV0aC5vCQlcCiAJc3RhL2F1dGhfcnNwLm8JCVwKIAlzdGEvc3luYy5vCQlcCkBAIC0zMCwxNCArMzgsMTggQEAKIAlzdGEvY29ubmVjdC5vCQlcCiAJc3RhL3dwYS5vCQlcCiAJcnRfbGludXgubwkJXAotCXJ0X3Byb2ZpbGUubwkJXAogCXJ0X21haW5fZGV2Lm8JCVwKIAlzdGFfaW9jdGwubwkJXAogCWNvbW1vbi9iYV9hY3Rpb24ubwlcCi0JMjg3MF9tYWluX2Rldi5vCQlcCi0JY29tbW9uLzI4NzBfcnRtcF9pbml0Lm8JXAorCXVzYl9tYWluX2Rldi5vCQlcCisJcnRfdXNiLm8JCVwKKwljb21tb24vY21tX21hY191c2IubwlcCiAJY29tbW9uL3J0dXNiX2lvLm8JXAogCWNvbW1vbi9ydHVzYl9idWxrLm8JXAogCWNvbW1vbi9ydHVzYl9kYXRhLm8JXAotCWNvbW1vbi9jbW1fZGF0YV8yODcwLm8KLQorCWNvbW1vbi9jbW1fZGF0YV91c2IubwlcCisJY29tbW9uL3J0bXBfbWN1Lm8JXAorCWNvbW1vbi9lZV9lZnVzZS5vCVwKKwljaGlwcy9ydDMweHgubwkJXAorCWNvbW1vbi9ydF9yZi5vCQlcCisJY2hpcHMvcnQzMDcwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY2hpcHMvcnQzMDcwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NoaXBzL3J0MzA3MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmRiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NoaXBzL3J0MzA3MC5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY2hpcHMvcnQzMDcwLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NoaXBzL3J0MzB4eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMweHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU2Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jaGlwcy9ydDMweHguYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NoaXBzL3J0MzB4eC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uLzI4NzBfcnRtcF9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTdkOWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vMjg3MF9ydG1wX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MzAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQkyODcwX3J0bXBfaW5pdC5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUGF1bCBMaW4gICAgMjAwMi0wOC0wMSAgICBjcmVhdGVkCi0gICAgSm9obiBDaGFuZyAgMjAwNC0wOC0yMCAgICBSVDI1NjEvMjY2MSB1c2Ugc2NhdHRlci1nYXRoZXIgc2NoZW1lCi0gICAgSmFuIExlZSAgCTIwMDYtMDktMTUgICAgUlQyODYwLiBDaGFuZ2UgZm9yIDgwMi4xMW4gLCBFRVBST00sIExlZCwgQkEsIEhULgotCVNhbXBsZSBMaW4JMjAwNy0wNS0zMSAgICBNZXJnZSBSVDI4NjAgYW5kIFJUMjg3MCBkcml2ZXJzLgotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLXN0YXRpYyB2b2lkIHJ4X2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX2hjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX2FjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX2FjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdGlhbGl6ZSByZWNlaXZlIGRhdGEgc3RydWN0dXJlcy4KLQotQXJndW1lbnRzOgotICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi1Ob3RlOgotCUluaXRpYWxpemUgYWxsIHJlY2VpdmUgcmVsZWF0ZWQgcHJpdmF0ZSBidWZmZXIsIGluY2x1ZGUgdGhvc2UgZGVmaW5lCi0JaW4gUlRNUF9BREFQVEVSIHN0cnVjdHVyZSBhbmQgYWxsIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgbWFob3IKLQl3b3JrIGlzIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgZWFjaCBwYWNrZXQgYW5kIGNoYWluIGJ1ZmZlciB0bwotCU5ESVMgcGFja2V0IGRlc2NyaXB0b3IuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlOSUNJbml0UmVjdigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUgkJCQlpOwotCU5ESVNfU1RBVFVTCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlQT1NfQ09PS0lFCQkJcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRSZWN2XG4iKSk7Ci0JcE9iaiA9IHBPYmo7Ci0KLQkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+UGVuZGluZ1J4LCAwKTsKLQlwQWQtPlBlbmRpbmdSeCA9IDA7Ci0JcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggCT0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4Ci0JcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwIDsgLy9SWF9SSU5HX1NJWkUgLTE7IC8vIFJ4IEJ1bGsgcG9pbnRlcgotCXBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24gCT0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQotCXsKLQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKLQotCQkvL0FsbG9jYXRlIFVSQgotCQlwUnhDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOwotCQlpZiAocFJ4Q29udGV4dC0+cFVyYiA9PSBOVUxMKQotCQl7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlnb3RvIG91dDE7Ci0JCX0KLQotCQkvLyBBbGxvY2F0ZSB0cmFuc2ZlciBidWZmZXIKLQkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBSVFVTQl9VUkJfQUxMT0NfQlVGRkVSKHBPYmotPnBVc2JfRGV2LCBNQVhfUlhCVUxLX1NJWkUsICZwUnhDb250ZXh0LT5kYXRhX2RtYSk7Ci0JCWlmIChwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9PSBOVUxMKQotCQl7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlnb3RvIG91dDE7Ci0JCX0KLQotCQlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgTUFYX1JYQlVMS19TSVpFKTsKLQotCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7Ci0JCXBSeENvbnRleHQtPnBJcnAgPSBOVUxMOwotCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKLQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOwotCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOwotCQkvL3BSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOwotCQlwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9IEZBTFNFOwotCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0UmVjdlxuIikpOwotCXJldHVybiBTdGF0dXM7Ci0KLW91dDE6Ci0JZm9yIChpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCi0JewotCQlQUlhfQ09OVEVYVCAgcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbaV0pOwotCi0JCWlmIChOVUxMICE9IHBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyKQotCQl7Ci0JCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIE1BWF9SWEJVTEtfU0laRSwKLQkJCQkJCQkJcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXIsIHBSeENvbnRleHQtPmRhdGFfZG1hKTsKLQkJCXBSeENvbnRleHQtPlRyYW5zZmVyQnVmZmVyID0gTlVMTDsKLQkJfQotCi0JCWlmIChOVUxMICE9IHBSeENvbnRleHQtPnBVcmIpCi0JCXsKLQkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7Ci0JCQlSVFVTQl9GUkVFX1VSQihwUnhDb250ZXh0LT5wVXJiKTsKLQkJCXBSeENvbnRleHQtPnBVcmIgPSBOVUxMOwotCQl9Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXRpYWxpemUgdHJhbnNtaXQgZGF0YSBzdHJ1Y3R1cmVzLgotCi1Bcmd1bWVudHM6Ci0gICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCi0JTkRJU19TVEFUVVNfUkVTT1VSQ0VTCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlOSUNJbml0VHJhbnNtaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0jZGVmaW5lIExNX1VTQl9BTExPQyhwT2JqLCBDb250ZXh0LCBUQl9UeXBlLCBCdWZmZXJTaXplLCBTdGF0dXMsIG1zZzEsIGVycjEsIG1zZzIsIGVycjIpCVwKLQlDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOwkJXAotCWlmIChDb250ZXh0LT5wVXJiID09IE5VTEwpIHsJCQlcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cxKTsJCVwKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAotCQlnb3RvIGVycjE7IH0JCQkJCQlcCi0JCQkJCQkJCQkJCVwKLQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IAkJCQlcCi0JCShUQl9UeXBlKVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsICZDb250ZXh0LT5kYXRhX2RtYSk7CVwKLQlpZiAoQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPT0gTlVMTCkgewlcCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCBtc2cyKTsJCVwKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwkJXAotCQlnb3RvIGVycjI7IH0KLQotI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCi0JaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCi0JCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCi0JCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKLQkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKLQlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQlcCi0JCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwT2JqLT5wVXNiX0RldiwgQnVmZmVyU2l6ZSwJXAotCQkJCQkJCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwJXAotCQkJCQkJCQlDb250ZXh0LT5kYXRhX2RtYSk7CQkJXAotCQlDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7IH0KLQotCVVDSEFSCQkJaSwgYWNpZHg7Ci0JTkRJU19TVEFUVVMgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JUFRYX0NPTlRFWFQJCXBOdWxsQ29udGV4dCAgID0gJihwQWQtPk51bGxDb250ZXh0KTsKLQlQVFhfQ09OVEVYVAkJcFBzUG9sbENvbnRleHQgPSAmKHBBZC0+UHNQb2xsQ29udGV4dCk7Ci0JUFRYX0NPTlRFWFQJCXBSVFNDb250ZXh0ICAgID0gJihwQWQtPlJUU0NvbnRleHQpOwotCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQgPSBOVUxMOwotLy8JUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0ID0gTlVMTDsKLQlQT1NfQ09PS0lFCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCVBWT0lECQkJUmluZ0Jhc2VWYTsKLS8vCVJUTVBfVFhfUklORwkqcFR4UmluZzsKLQlSVE1QX01HTVRfUklORyAgKnBNZ210UmluZzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0VHJhbnNtaXRcbiIpKTsKLQlwT2JqID0gcE9iajsKLQotCS8vIEluaXQgNCBzZXQgb2YgVHggcGFyYW1ldGVycwotCWZvcihhY2lkeCA9IDA7IGFjaWR4IDwgTlVNX09GX1RYX1JJTkc7IGFjaWR4KyspCi0JewotCQkvLyBJbml0aWFsaXplIGFsbCBUcmFuc21pdCByZWxlYXRlZCBxdWV1ZXMKLQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVthY2lkeF0pOwotCi0JCS8vIE5leHQgTG9jYWwgdHggcmluZyBwb2ludGVyIHdhaXRpbmcgZm9yIGJ1Y2sgb3V0Ci0JCXBBZC0+TmV4dEJ1bGtPdXRJbmRleFthY2lkeF0gPSBhY2lkeDsKLQkJcEFkLT5CdWxrT3V0UGVuZGluZ1thY2lkeF0gPSBGQUxTRTsgLy8gQnVjayBPdXQgY29udHJvbCBmbGFnCi0JCS8vcEFkLT5EYXRhQnVsa0RvbmVJZHhbYWNpZHhdID0gMDsKLQl9Ci0KLQkvL3BBZC0+TmV4dE1MTUVJbmRleAk9IDA7Ci0JLy9wQWQtPlB1c2hNZ210SW5kZXgJPSAwOwotCS8vcEFkLT5Qb3BNZ210SW5kZXgJPSAwOwotCS8vSW50ZXJsb2NrZWRFeGNoYW5nZSgmcEFkLT5NZ210UXVldWVTaXplLCAwKTsKLQkvL0ludGVybG9ja2VkRXhjaGFuZ2UoJnBBZC0+VHhDb3VudCwgMCk7Ci0KLQkvL3BBZC0+UHJpb1JpbmdGaXJzdEluZGV4CT0gMDsKLQkvL3BBZC0+UHJpb1JpbmdUeENudAkJPSAwOwotCi0JZG8KLQl7Ci0JCS8vCi0JCS8vIFRYX1JJTkdfU0laRSwgNCBBQ3MKLQkJLy8KLQkJZm9yKGFjaWR4PTA7IGFjaWR4PDQ7IGFjaWR4KyspCi0JCXsKLQkJCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbYWNpZHhdKTsKLQotCQkJTmRpc1plcm9NZW1vcnkocEhUVFhDb250ZXh0LCBzaXplb2YoSFRfVFhfQ09OVEVYVCkpOwotCQkJLy9BbGxvY2F0ZSBVUkIKLQkJCUxNX1VTQl9BTExPQyhwT2JqLCBwSFRUWENvbnRleHQsIFBIVFRYX0JVRkZFUiwgc2l6ZW9mKEhUVFhfQlVGRkVSKSwgU3RhdHVzLAotCQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFR4Q29udGV4dFslZF0gdXJiISEgXG4iLCBhY2lkeCksCi0JCQkJCQkJZG9uZSwKLQkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBUeENvbnRleHRbJWRdIEhUVFhfQlVGRkVSICEhIFxuIiwgYWNpZHgpLAotCQkJCQkJCW91dDEpOwotCi0JCQlOZGlzWmVyb01lbW9yeShwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5BZ2dyZWdhdGlvbiwgNCk7Ci0JCQlwSFRUWENvbnRleHQtPnBBZCA9IHBBZDsKLQkJCXBIVFRYQ29udGV4dC0+cElycCA9IE5VTEw7Ci0JCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQkJCXBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gMDsKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKLQkJCXBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZCA9IGFjaWR4OwotCQkJcEhUVFhDb250ZXh0LT5iUmluZ0VtcHR5ID0gVFJVRTsKLQkJCXBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID0gRkFMU0U7Ci0KLQkJCXBBZC0+QnVsa091dFBlbmRpbmdbYWNpZHhdID0gRkFMU0U7Ci0JCX0KLQotCi0JCS8vCi0JCS8vIE1HTVRfUklOR19TSVpFCi0JCS8vCi0JCS8vIEFsbG9jYXRlIE1HTVQgcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5Ci0JCXBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSA9IE1HTVRfUklOR19TSVpFICogc2l6ZW9mKFRYX0NPTlRFWFQpOwotCQlSVE1QQWxsb2NhdGVNZW1vcnkoJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0JCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGJpZyBidWZmZXIgZm9yIE1nbXREZXNjUmluZyFcbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCWdvdG8gb3V0MTsKLQkJfQotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOwotCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmE7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBNR01UIFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQotCQlwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKLQkJZm9yIChpID0gMDsgaSA8IE1HTVRfUklOR19TSVpFOyBpKyspCi0JCXsKLQkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgTWdtdCBidWZmZXIgdG8gTWdtdFJpbmcuQ2VsbAotCQkJcE1nbXRSaW5nLT5DZWxsW2ldLkFsbG9jU2l6ZSA9IHNpemVvZihUWF9DT05URVhUKTsKLQkJCXBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCXBNZ210UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0JCQlwTWdtdFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJLy9BbGxvY2F0ZSBVUkIgZm9yIE1MTUVDb250ZXh0Ci0JCQlwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCQkJcE1MTUVDb250ZXh0LT5wVXJiID0gUlRVU0JfQUxMT0NfVVJCKDApOwotCQkJaWYgKHBNTE1FQ29udGV4dC0+cFVyYiA9PSBOVUxMKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBNTE1FQ29udGV4dFslZF0gdXJiISEgXG4iLCBpKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWdvdG8gb3V0MjsKLQkJCX0KLQkJCXBNTE1FQ29udGV4dC0+cEFkID0gcEFkOwotCQkJcE1MTUVDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJCXBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOwotCQkJcE1MTUVDb250ZXh0LT5JblVzZSA9IEZBTFNFOwotCQkJcE1MTUVDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCQlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOwotCQkJcE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IDA7Ci0JCQlwTUxNRUNvbnRleHQtPlNlbGZJZHggPSBpOwotCi0JCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJUmluZ0Jhc2VWYSA9IChQVUNIQVIpIFJpbmdCYXNlVmEgKyBzaXplb2YoVFhfQ09OVEVYVCk7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGkpKTsKLQotCQkvL3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAoTUdNVF9SSU5HX1NJWkUgLSAxKTsKLQkJcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA9IE1HTVRfUklOR19TSVpFOwotCQlwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4ID0gMDsKLQkJcEFkLT5NZ210UmluZy5UeERtYUlkeCA9IDA7Ci0KLQkJLy8KLQkJLy8gQkVBQ09OX1JJTkdfU0laRQotCQkvLwotCQlmb3IoaT0wOyBpPEJFQUNPTl9SSU5HX1NJWkU7IGkrKykgLy8gMgotCQl7Ci0JCQlQVFhfQ09OVEVYVAlwQmVhY29uQ29udGV4dCA9ICYocEFkLT5CZWFjb25Db250ZXh0W2ldKTsKLQotCi0JCQlOZGlzWmVyb01lbW9yeShwQmVhY29uQ29udGV4dCwgc2l6ZW9mKFRYX0NPTlRFWFQpKTsKLQotCQkJLy9BbGxvY2F0ZSBVUkIKLQkJCUxNX1VTQl9BTExPQyhwT2JqLCBwQmVhY29uQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKLQkJCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBCZWFjb25Db250ZXh0WyVkXSB1cmIhISBcbiIsIGkpLAotCQkJCQkJCW91dDIsCi0JCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggQmVhY29uQ29udGV4dFslZF0gVFhfQlVGRkVSICEhIFxuIiwgaSksCi0JCQkJCQkJb3V0Myk7Ci0KLQkJCXBCZWFjb25Db250ZXh0LT5wQWQgPSBwQWQ7Ci0JCQlwQmVhY29uQ29udGV4dC0+cElycCA9IE5VTEw7Ci0JCQlwQmVhY29uQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJCXBCZWFjb25Db250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JCX0KLQotCQkvLwotCQkvLyBOdWxsQ29udGV4dAotCQkvLwotCQlOZGlzWmVyb01lbW9yeShwTnVsbENvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7Ci0KLQkJLy9BbGxvY2F0ZSBVUkIKLQkJTE1fVVNCX0FMTE9DKHBPYmosIHBOdWxsQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKLQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIE51bGxDb250ZXh0IHVyYiEhIFxuIiksCi0JCQkJCQlvdXQzLAotCQkJCQkJKCI8LS0gRVJST1IgaW4gQWxsb2MgVFggTnVsbENvbnRleHQgVFhfQlVGRkVSICEhIFxuIiksCi0JCQkJCQlvdXQ0KTsKLQotCQlwTnVsbENvbnRleHQtPnBBZCA9IHBBZDsKLQkJcE51bGxDb250ZXh0LT5wSXJwID0gTlVMTDsKLQkJcE51bGxDb250ZXh0LT5JblVzZSA9IEZBTFNFOwotCQlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQotCQkvLwotCQkvLyBSVFNDb250ZXh0Ci0JCS8vCi0JCU5kaXNaZXJvTWVtb3J5KHBSVFNDb250ZXh0LCBzaXplb2YoVFhfQ09OVEVYVCkpOwotCi0JCS8vQWxsb2NhdGUgVVJCCi0JCUxNX1VTQl9BTExPQyhwT2JqLCBwUlRTQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKLQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFJUU0NvbnRleHQgdXJiISEgXG4iKSwKLQkJCQkJCW91dDQsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBSVFNDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAotCQkJCQkJb3V0NSk7Ci0KLQkJcFJUU0NvbnRleHQtPnBBZCA9IHBBZDsKLQkJcFJUU0NvbnRleHQtPnBJcnAgPSBOVUxMOwotCQlwUlRTQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJcFJUU0NvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQotCQkvLwotCQkvLyBQc1BvbGxDb250ZXh0Ci0JCS8vCi0JCS8vTmRpc1plcm9NZW1vcnkocFBzUG9sbENvbnRleHQsIHNpemVvZihUWF9DT05URVhUKSk7Ci0JCS8vQWxsb2NhdGUgVVJCCi0JCUxNX1VTQl9BTExPQyhwT2JqLCBwUHNQb2xsQ29udGV4dCwgUFRYX0JVRkZFUiwgc2l6ZW9mKFRYX0JVRkZFUiksIFN0YXR1cywKLQkJCQkJCSgiPC0tIEVSUk9SIGluIEFsbG9jIFRYIFBzUG9sbENvbnRleHQgdXJiISEgXG4iKSwKLQkJCQkJCW91dDUsCi0JCQkJCQkoIjwtLSBFUlJPUiBpbiBBbGxvYyBUWCBQc1BvbGxDb250ZXh0IFRYX0JVRkZFUiAhISBcbiIpLAotCQkJCQkJb3V0Nik7Ci0KLQkJcFBzUG9sbENvbnRleHQtPnBBZCA9IHBBZDsKLQkJcFBzUG9sbENvbnRleHQtPnBJcnAgPSBOVUxMOwotCQlwUHNQb2xsQ29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQkJcFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQkJcFBzUG9sbENvbnRleHQtPmJBZ2dyZWdhdGlibGUgPSBGQUxTRTsKLQkJcFBzUG9sbENvbnRleHQtPkxhc3RPbmUgPSBUUlVFOwotCi0JfSAgIHdoaWxlIChGQUxTRSk7Ci0KLQotZG9uZToKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFRyYW5zbWl0XG4iKSk7Ci0KLQlyZXR1cm4gU3RhdHVzOwotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLW91dDY6Ci0JTE1fVVJCX0ZSRUUocE9iaiwgcFBzUG9sbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotb3V0NToKLQlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCi1vdXQ0OgotCUxNX1VSQl9GUkVFKHBPYmosIHBOdWxsQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCi1vdXQzOgotCWZvcihpPTA7IGk8QkVBQ09OX1JJTkdfU0laRTsgaSsrKQotCXsKLQkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7Ci0JCWlmIChwQmVhY29uQ29udGV4dCkKLQkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7Ci0JfQotCi1vdXQyOgotCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhKQotCXsKLQkJcE1nbXRSaW5nID0gJnBBZC0+TWdtdFJpbmc7Ci0JZm9yKGk9MDsgaTxNR01UX1JJTkdfU0laRTsgaSsrKQotCXsKLQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJaWYgKHBNTE1FQ29udGV4dCkKLQkJCUxNX1VSQl9GUkVFKHBPYmosIHBNTE1FQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCX0KLQkJTmRpc0ZyZWVNZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLCAwKTsKLQkJcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSA9IE5VTEw7Ci0JfQotCi1vdXQxOgotCWZvciAoYWNpZHggPSAwOyBhY2lkeCA8IDQ7IGFjaWR4KyspCi0JewotCQlQSFRfVFhfQ09OVEVYVCBwVHhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFthY2lkeF0pOwotCQlpZiAocFR4Q29udGV4dCkKLQkJCUxNX1VSQl9GUkVFKHBPYmosIHBUeENvbnRleHQsIHNpemVvZihIVFRYX0JVRkZFUikpOwotCX0KLQotCS8vIEhlcmUgd2UgZGlkbid0IGhhdmUgYW55IHByZS1hbGxvY2F0ZWQgbWVtb3J5IG5lZWQgdG8gZnJlZS4KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZS4KLQotQXJndW1lbnRzOgotICAgIHBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTCVJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotLy8JQ09VTlRFUl84MDJfMTEJcENvdW50ZXIgPSAmcEFkLT5XbGFuQ291bnRlcnM7Ci0JTkRJU19TVEFUVVMJCVN0YXR1czsKLQlJTlQJCQkJbnVtOwotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnlcbiIpKTsKLQotCi0JZG8KLQl7Ci0JCS8vIEluaXQgdGhlIENtZFEgYW5kIENtZFFMb2NrCi0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7Ci0JCVJUVVNCSW5pdGlhbGl6ZUNtZFEoJnBBZC0+Q21kUSk7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCi0KLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrKTsKLQkJLy9OZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NTE1FV2FpdFF1ZXVlTG9jayk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzBdKTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbMV0pOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1syXSk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrWzNdKTsKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbNF0pOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1s1XSk7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJ1bGtJbkxvY2spOwotCi0JCWZvciAobnVtID0gMDsgbnVtIDwgTlVNX09GX1RYX1JJTkc7IG51bSsrKQotCQl7Ci0JCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbbnVtXSk7Ci0JCX0KLQotLy8JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1lbUxvY2spOwkvLyBOb3QgdXNlZCBpbiBSVDI4WFgKLQotLy8JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOyAvLyBpbml0IGl0IGluIFVzZXJDZmdJbml0KCkKLS8vCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOyAvLyBpbml0IGl0IGluIEJBVGFibGVJbml0KCkKLQotLy8JCWZvcihudW09MDsgbnVtPE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFOyBudW0rKykKLS8vCQl7Ci0vLwkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtudW1dLlJ4UmVSaW5nTG9jayk7Ci0vLwkJfQotCi0JCS8vCi0JCS8vIEluaXQgTWFjIFRhYmxlCi0JCS8vCi0vLwkJTWFjVGFibGVJbml0aWFsaXplKHBBZCk7Ci0KLQkJLy8KLQkJLy8gSW5pdCBzZW5kIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBwYXJhbWV0ZXJzCi0JCS8vCi0JCVN0YXR1cyA9IE5JQ0luaXRUcmFuc21pdChwQWQpOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQlicmVhazsKLQotCQkvLwotCQkvLyBJbml0IHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMKLQkJLy8KLQkJU3RhdHVzID0gTklDSW5pdFJlY3YocEFkKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJYnJlYWs7Ci0KLQkJcEFkLT5QZW5kaW5nSW9Db3VudCA9IDE7Ci0KLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5GcmFnRnJhbWUsIHNpemVvZihGUkFHTUVOVF9GUkFNRSkpOwotCXBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID0gIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKLQotCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9PSBOVUxMKQotCXsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCX0KLQotCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeSwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQ2FsbHMgVVNCX0ludGVyZmFjZVN0b3AgYW5kIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBVUkJzCi0gICAgY2FsbHMgTmRpc01EZXJlZ2lzdGVyRGV2aWNlIGFuZCBmcmVlcyB0aGUgbWVtb3J5Ci0gICAgYWxsb2NhdGVkIGluIFZOZXRJbml0aWFsaXplIGZvciB0aGUgQWRhcHRlciBPYmplY3QKLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotI2RlZmluZSBMTV9VUkJfRlJFRShwT2JqLCBDb250ZXh0LCBCdWZmZXJTaXplKQkJCQlcCi0JaWYgKE5VTEwgIT0gQ29udGV4dC0+cFVyYikgewkJCQkJCQlcCi0JCVJUVVNCX1VOTElOS19VUkIoQ29udGV4dC0+cFVyYik7CQkJCQlcCi0JCVJUVVNCX0ZSRUVfVVJCKENvbnRleHQtPnBVcmIpOwkJCQkJCVwKLQkJQ29udGV4dC0+cFVyYiA9IE5VTEw7IH0JCQkJCQkJCVwKLQlpZiAoTlVMTCAhPSBDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlcikgewkJCQkJXAotCQlSVFVTQl9VUkJfRlJFRV9CVUZGRVIocE9iai0+cFVzYl9EZXYsIEJ1ZmZlclNpemUsCVwKLQkJCQkJCQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIsCVwKLQkJCQkJCQkJQ29udGV4dC0+ZGF0YV9kbWEpOwkJCVwKLQkJQ29udGV4dC0+VHJhbnNmZXJCdWZmZXIgPSBOVUxMOyB9Ci0KLQotCVVJTlQgICAgICAgICAgICAgICAgaSwgYWNpZHg7Ci0JUFRYX0NPTlRFWFQJCQlwTnVsbENvbnRleHQgICA9ICZwQWQtPk51bGxDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQgPSAmcEFkLT5Qc1BvbGxDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcFJUU0NvbnRleHQgICAgPSAmcEFkLT5SVFNDb250ZXh0OwotLy8JUEhUX1RYX0NPTlRFWFQgCQlwSFRUWENvbnRleHQ7Ci0JLy9QUlRNUF9SRU9SREVSQlVGCXBSZW9yZGVyQnVmOwotCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotLy8JUlRNUF9UWF9SSU5HCQkqcFR4UmluZzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tLT4gUlRNUEZyZWVUeFJ4UmluZ01lbW9yeVxuIikpOwotCXBPYmogPSBwT2JqOwotCi0JLy8gRnJlZSBhbGwgcmVzb3VyY2VzIGZvciB0aGUgUkVDRUlWRSBidWZmZXIgcXVldWUuCi0JZm9yKGk9MDsgaTwoUlhfUklOR19TSVpFKTsgaSsrKQotCXsKLQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKLQkJaWYgKHBSeENvbnRleHQpCi0JCQlMTV9VUkJfRlJFRShwT2JqLCBwUnhDb250ZXh0LCBNQVhfUlhCVUxLX1NJWkUpOwotCX0KLQotCS8vIEZyZWUgUHNQb2xsIGZyYW1lIHJlc291cmNlCi0JTE1fVVJCX0ZSRUUocE9iaiwgcFBzUG9sbENvbnRleHQsIHNpemVvZihUWF9CVUZGRVIpKTsKLQotCS8vIEZyZWUgTlVMTCBmcmFtZSByZXNvdXJjZQotCUxNX1VSQl9GUkVFKHBPYmosIHBOdWxsQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCi0JLy8gRnJlZSBSVFMgZnJhbWUgcmVzb3VyY2UKLQlMTV9VUkJfRlJFRShwT2JqLCBwUlRTQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCi0KLQkvLyBGcmVlIGJlYWNvbiBmcmFtZSByZXNvdXJjZQotCWZvcihpPTA7IGk8QkVBQ09OX1JJTkdfU0laRTsgaSsrKQotCXsKLQkJUFRYX0NPTlRFWFQJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7Ci0JCWlmIChwQmVhY29uQ29udGV4dCkKLQkJCUxNX1VSQl9GUkVFKHBPYmosIHBCZWFjb25Db250ZXh0LCBzaXplb2YoVFhfQlVGRkVSKSk7Ci0JfQotCi0KLQkvLyBGcmVlIG1nbXQgZnJhbWUgcmVzb3VyY2UKLQlmb3IoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQotCXsKLQkJUFRYX0NPTlRFWFQgcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCQkvL0xNX1VSQl9GUkVFKHBPYmosIHBNTE1FQ29udGV4dCwgc2l6ZW9mKFRYX0JVRkZFUikpOwotCQlpZiAoTlVMTCAhPSBwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQpCi0JCXsKLQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCk7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IE5VTEw7Ci0JCX0KLQotCQlpZiAocE1MTUVDb250ZXh0KQotCQl7Ci0JCQlpZiAoTlVMTCAhPSBwTUxNRUNvbnRleHQtPnBVcmIpCi0JCQl7Ci0JCQkJUlRVU0JfVU5MSU5LX1VSQihwTUxNRUNvbnRleHQtPnBVcmIpOwotCQkJCVJUVVNCX0ZSRUVfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7Ci0JCQkJcE1MTUVDb250ZXh0LT5wVXJiID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKLQkJTmRpc0ZyZWVNZW1vcnkocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5NZ210RGVzY1JpbmcuQWxsb2NTaXplLCAwKTsKLQotCi0JLy8gRnJlZSBUeCBmcmFtZSByZXNvdXJjZQotCQlmb3IoYWNpZHg9MDsgYWNpZHg8NDsgYWNpZHgrKykKLQkJewotCQlQSFRfVFhfQ09OVEVYVCBwSFRUWENvbnRleHQgPSAmKHBBZC0+VHhDb250ZXh0W2FjaWR4XSk7Ci0JCQlpZiAocEhUVFhDb250ZXh0KQotCQkJCUxNX1VSQl9GUkVFKHBPYmosIHBIVFRYQ29udGV4dCwgc2l6ZW9mKEhUVFhfQlVGRkVSKSk7Ci0JCX0KLQotCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCWZvcihpPTA7IGk8NjsgaSsrKQotCXsKLQkJTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1tpXSk7Ci0JfQotCi0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5CdWxrSW5Mb2NrKTsKLQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1MTUVCdWxrT3V0TG9jayk7Ci0KLQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQotCS8vIENsZWFyIGFsbCBwZW5kaW5nIGJ1bGstb3V0IHJlcXVlc3QgZmxhZ3MuCi0JUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgMHhmZmZmZmZmZik7Ci0KLS8vCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLS8vCWZvcihpPTA7IGk8TUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKLS8vCXsKLS8vCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtpXS5SeFJlUmluZ0xvY2spOwotLy8JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPC0tLSBSZWxlYXNlQWRhcHRlclxuIikpOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyIGNvbnRyb2wgYmxvY2suCi0KLUFyZ3VtZW50czoKLSAgICBwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQlORElTX1NUQVRVU19GQUlMVVJFCi0JTkRJU19TVEFUVVNfUkVTT1VSQ0VTCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBBZGFwdGVyQmxvY2tBbGxvY2F0ZU1lbW9yeSgKLQlJTiBQVk9JRAloYW5kbGUsCi0JT1VUCVBWT0lECSpwcEFkKQotewotCVBVU0JfREVWCXVzYl9kZXY7Ci0JUE9TX0NPT0tJRQlwT2JqID0gKFBPU19DT09LSUUpIGhhbmRsZTsKLQotCi0JdXNiX2RldiA9IHBPYmotPnBVc2JfRGV2OwotCi0JcE9iai0+TUxNRVRocl9waWQJPSBOVUxMOwotCXBPYmotPlJUVVNCQ21kVGhyX3BpZAk9IE5VTEw7Ci0KLQkqcHBBZCA9IChQVk9JRCl2bWFsbG9jKHNpemVvZihSVE1QX0FEQVBURVIpKTsKLQotCWlmICgqcHBBZCkKLQl7Ci0JCU5kaXNaZXJvTWVtb3J5KCpwcEFkLCBzaXplb2YoUlRNUF9BREFQVEVSKSk7Ci0JCSgoUFJUTVBfQURBUFRFUikqcHBBZCktPk9TX0Nvb2tpZSA9IGhhbmRsZTsKLQkJcmV0dXJuIChORElTX1NUQVRVU19TVUNDRVNTKTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDcmVhdGUga2VybmVsIHRocmVhZHMgJiB0YXNrbGV0cy4KLQotQXJndW1lbnRzOgotICAgICpuZXRfZGV2CQkJUG9pbnRlciB0byB3aXJlbGVzcyBuZXQgZGV2aWNlIGludGVyZmFjZQotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVEFUVVNfU1VDQ0VTUwotCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTCSBDcmVhdGVUaHJlYWRzKAotCUlOCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotCVBSVE1QX0FEQVBURVIgcEFkID0gbmV0X2Rldi0+bWxfcHJpdjsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0JcGlkX3QgcGlkX251bWJlcjsKLQotCS8vaW5pdF9NVVRFWCgmKHBBZC0+dXNiZGV2X3NlbWFwaG9yZSkpOwotCi0JaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPm1sbWVfc2VtYXBob3JlKSk7Ci0JaW5pdF9jb21wbGV0aW9uICgmcEFkLT5tbG1lQ29tcGxldGUpOwotCi0JaW5pdF9NVVRFWF9MT0NLRUQoJihwQWQtPlJUVVNCQ21kX3NlbWFwaG9yZSkpOwotCWluaXRfY29tcGxldGlvbiAoJnBBZC0+Q21kUUNvbXBsZXRlKTsKLQotCWluaXRfTVVURVhfTE9DS0VEKCYocEFkLT5SVFVTQlRpbWVyX3NlbWFwaG9yZSkpOwotCWluaXRfY29tcGxldGlvbiAoJnBBZC0+VGltZXJRQ29tcGxldGUpOwotCi0JLy8gQ3JlYXQgTUxNRSBUaHJlYWQKLQlwT2JqLT5NTE1FVGhyX3BpZCA9IE5VTEw7Ci0JcGlkX251bWJlciA9IGtlcm5lbF90aHJlYWQoTWxtZVRocmVhZCwgcEFkLCBDTE9ORV9WTSk7Ci0JaWYgKHBpZF9udW1iZXIgPCAwKQotCXsKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgTWxtZSB0aHJlYWRcbiIscEFkLT5uZXRfZGV2LT5uYW1lKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JcE9iai0+TUxNRVRocl9waWQgPSBmaW5kX2dldF9waWQocGlkX251bWJlcik7Ci0KLQkvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+bWxtZUNvbXBsZXRlKSk7Ci0KLQkvLyBDcmVhdCBDb21tYW5kIFRocmVhZAotCXBPYmotPlJUVVNCQ21kVGhyX3BpZCA9IE5VTEw7Ci0JcGlkX251bWJlciA9IGtlcm5lbF90aHJlYWQoUlRVU0JDbWRUaHJlYWQsIHBBZCwgQ0xPTkVfVk0pOwotCWlmIChwaWRfbnVtYmVyIDwgMCkKLQl7Ci0JCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIHN0YXJ0IFJUVVNCQ21kIHRocmVhZFxuIixwQWQtPm5ldF9kZXYtPm5hbWUpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlwT2JqLT5SVFVTQkNtZFRocl9waWQgPSBmaW5kX2dldF9waWQocGlkX251bWJlcik7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCYocEFkLT5DbWRRQ29tcGxldGUpKTsKLQotCXBPYmotPlRpbWVyUVRocl9waWQgPSBOVUxMOwotCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKFRpbWVyUVRocmVhZCwgcEFkLCBDTE9ORV9WTSk7Ci0JaWYgKHBpZF9udW1iZXIgPCAwKQotCXsKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQgVGltZXJRVGhyZWFkXG4iLHBBZC0+bmV0X2Rldi0+bmFtZSk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXBPYmotPlRpbWVyUVRocl9waWQgPSBmaW5kX2dldF9waWQocGlkX251bWJlcik7Ci0KLQkvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmKHBBZC0+VGltZXJRQ29tcGxldGUpKTsKLQotCS8vIENyZWF0ZSByZWNlaXZlIHRhc2tsZXQKLQl0YXNrbGV0X2luaXQoJnBPYmotPnJ4X2RvbmVfdGFzaywgcnhfZG9uZV90YXNrbGV0LCAoVUxPTkcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgcnQyODcwX21nbXRfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMwX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzaywgcnQyODcwX2FjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9hYzJfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPmFjM19kbWFfZG9uZV90YXNrLCBydDI4NzBfYWMzX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2ssIHJ0Mjg3MF9oY2NhX2RtYV9kb25lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT50YnR0X3Rhc2ssIHRidHRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPm51bGxfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX251bGxfZnJhbWVfY29tcGxldGVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPnJ0c19mcmFtZV9jb21wbGV0ZV90YXNrLCBydDI4NzBfcnRzX2ZyYW1lX2NvbXBsZXRlX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFzaywgcnQyODcwX3BzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gCUFzIFNUQSdzIEJTU0lEIGlzIGEgV0MgdG9vLCBpdCB1c2VzIHNoYXJlZCBrZXkgdGFibGUuCi0gCVRoaXMgZnVuY3Rpb24gd3JpdGUgY29ycmVjdCB1bmljYXN0IFRYIGtleSB0byBBU0lDIFdDSUQuCi0gCUFuZCB3ZSBzdGlsbCBtYWtlIGEgY29weSBpbiBvdXIgTWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuCi0JQ2FsbGVyIGd1YXJhbnRlZSBUS0lQL0FFUyBhbHdheXMgaGFzIGtleWlkeCA9IDAuIChwYWlyd2lzZSBrZXkpCi0JQ2FsbGVyIGd1YXJhbnRlZSBXRVAgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNldCBUeGtleSwgIGRlZmF1bHQga2V5IGluZGV4PTB+My4KLQotQXJndW1lbnRzOgotCXBBZCAJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQlwS2V5CQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAotCi1SZXR1cm4gVmFsdWU6Ci0JTkRJU19TVUNDRVNTCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEFkZEJTU0lEQ2lwaGVyKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlBaWQsCi0JSU4JUE5ESVNfODAyXzExX0tFWQlwS2V5LAotCUlOICBVQ0hBUiAgIAkJCUNpcGhlckFsZykKLXsKLQlQVUNIQVIJCXBUeE1pYywgcFJ4TWljOwotCUJPT0xFQU4gCWJLZXlSU0MsIGJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSBTQyBzZXQgYnkgS2V5UlNDIHZhbHVlCi0vLwlVQ0hBUgkJQ2lwaGVyQWxnOwotCVVDSEFSCQlpOwotCVVMT05HCQlXQ0lEQXR0cmk7Ci0JVVNIT1JUCSAJb2Zmc2V0OwotCVVDSEFSCQlLZXlJZHgsIElWRUlWWzhdOwotCVVJTlQzMgkJVmFsdWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkQlNTSURDaXBoZXI9PT4gQWlkID0gJWRcbiIsQWlkKSk7Ci0KLQkvLyBCaXQgMjkgb2YgQWRkLWtleSBLZXlSU0MKLQliS2V5UlNDIAkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4MjAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCi0JLy8gQml0IDI4IG9mIEFkZC1rZXkgQXV0aGVudGljYXRvcgotCWJBdXRoZW50aWNhdG9yID0gKHBLZXktPktleUluZGV4ICYgMHgxMDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JS2V5SWR4ID0gKFVDSEFSKXBLZXktPktleUluZGV4JjB4ZmY7Ci0KLQlpZiAoS2V5SWR4ID4gNCkKLQkJcmV0dXJuOwotCi0KLQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQl7CWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQl7Ci0JCQkvLyBmb3IgV1BBLU5vbmUgVHgsIFJ4IE1JQyBpcyB0aGUgc2FtZQotCQkJcFR4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAxNjsKLQkJCXBSeE1pYyA9IHBUeE1pYzsKLQkJfQotCQllbHNlIGlmIChiQXV0aGVudGljYXRvciA9PSBUUlVFKQotCQl7Ci0JCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDE2OwotCQkJcFJ4TWljID0gKFBVQ0hBUikgKCZwS2V5LT5LZXlNYXRlcmlhbCkgKyAyNDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBSeE1pYyA9IChQVUNIQVIpICgmcEtleS0+S2V5TWF0ZXJpYWwpICsgMTY7Ci0JCQlwVHhNaWMgPSAoUFVDSEFSKSAoJnBLZXktPktleU1hdGVyaWFsKSArIDI0OwotCQl9Ci0KLQkJb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfS0VZX0VOVFJZX1NJWkUpICsgMHgxMDsKLQkJZm9yIChpPTA7IGk8ODsgKQotCQl7Ci0JCQlWYWx1ZSA9ICoocFR4TWljK2kpOwotCQkJVmFsdWUgKz0gKCoocFR4TWljK2krMSk8PDgpOwotCQkJVmFsdWUgKz0gKCoocFR4TWljK2krMik8PDE2KTsKLQkJCVZhbHVlICs9ICgqKHBUeE1pYytpKzMpPDwyNCk7Ci0JCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQraSwgVmFsdWUpOwotCQkJaSs9NDsKLQkJfQotCi0JCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKSArIDB4MTg7Ci0JCWZvciAoaT0wOyBpPDg7ICkKLQkJewotCQkJVmFsdWUgPSAqKHBSeE1pYytpKTsKLQkJCVZhbHVlICs9ICgqKHBSeE1pYytpKzEpPDw4KTsKLQkJCVZhbHVlICs9ICgqKHBSeE1pYytpKzIpPDwxNik7Ci0JCQlWYWx1ZSArPSAoKihwUnhNaWMraSszKTw8MjQpOwotCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0K2ksIFZhbHVlKTsKLQkJCWkrPTQ7Ci0JCX0KLQotCQkvLyBPbmx5IEtleSBsZW50aCBlcXVhbCB0byBUS0lQIGtleSBoYXZlIHRoZXNlCi0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeE1pYywgcFJ4TWljLCA4KTsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4TWljLCBwVHhNaWMsIDgpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJCSgiCVR4TUlDICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsCi0JCQkJcFR4TWljWzBdLHBUeE1pY1sxXSxwVHhNaWNbMl0scFR4TWljWzNdLAotCQkJCXBUeE1pY1s0XSxwVHhNaWNbNV0scFR4TWljWzZdLHBUeE1pY1s3XSkpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKLQkJCQkoIglSeE1JQyAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAotCQkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSwKLQkJCQlwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKLQl9Ci0KLQkvLyAyLiBSZWNvcmQgU2VjdXJpdHkgS2V5LgotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLQotCS8vIDMuIENoZWNrIFJ4VHNjLiBBbmQgdXNlZCB0byBpbml0IHRvIEFTSUMgSVYuCi0JaWYgKGJLZXlSU0MgPT0gVFJVRSkKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlJ4VHNjLCAmcEtleS0+S2V5UlNDLCA2KTsKLQllbHNlCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5SeFRzYywgNik7Ci0KLQkvLyA0LiBJbml0IFR4VHNjIHRvIG9uZSBiYXNlZCBvbiBXaUZpIFdQQSBzcGVjcwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1swXSA9IDE7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzFdID0gMDsKLQlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbMl0gPSAwOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5QYWlyd2lzZUtleS5UeFRzY1szXSA9IDA7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LlR4VHNjWzRdID0gMDsKLQlwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uUGFpcndpc2VLZXkuVHhUc2NbNV0gPSAwOwotCi0JQ2lwaGVyQWxnID0gcEFkLT5NYWNUYWIuQ29udGVudFtBaWRdLlBhaXJ3aXNlS2V5LkNpcGhlckFsZzsKLQotCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKEFpZCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIHBLZXktPktleU1hdGVyaWFsLAotCQkJCSgocEtleS0+S2V5TGVuZ3RoID09IExFTl9US0lQX0tFWSkgPyAxNiA6IChVU0hPUlQpcEtleS0+S2V5TGVuZ3RoKSk7Ci0KLQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoS2V5SWR4ICogSFdfS0VZX0VOVFJZX1NJWkUpOwotCVJUVVNCTXVsdGlXcml0ZShwQWQsIChVU0hPUlQpIG9mZnNldCwgcEtleS0+S2V5TWF0ZXJpYWwsIChVU0hPUlQpcEtleS0+S2V5TGVuZ3RoKTsKLQotCW9mZnNldCA9IFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UgKyAoQWlkICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0JTmRpc1plcm9NZW1vcnkoSVZFSVYsIDgpOwotCi0JLy8gSVYvRUlWCi0JaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8Ci0JCShDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fAotCQkoQ2lwaGVyQWxnID09IENJUEhFUl9BRVMpKQotCXsKLQkJSVZFSVZbM10gPSAweDIwOyAvLyBFaXYgYml0IG9uLiBrZXlpZCBhbHdheXMgMCBmb3IgcGFpcndpc2Uga2V5Ci0JfQotCS8vIGRlZmF1bHQga2V5IGlkeCBuZWVkcyB0byBzZXQuCi0JLy8gaW4gVEtJUC9BRVMgS2V5SWR4ID0gMCAsIFdFUCBLZXlJZHggaXMgZGVmYXVsdCB0eCBrZXkuCi0JZWxzZQotCXsKLQkJSVZFSVZbM10gfD0gKEtleUlkeDw8IDYpOwotCX0KLQlSVFVTQk11bHRpV3JpdGUocEFkLCAoVVNIT1JUKSBvZmZzZXQsIElWRUlWLCA4KTsKLQotCS8vIFdDSUQgQXR0cmlidXRlIFVERjozLCBCU1NJZHg6MywgQWxnOjMsIEtleXRhYmxlOjE9UEFJUldJU0UgS0VZLCBCU1NJZHggaXMgMAotCWlmICgoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQKSB8fAotCQkoQ2lwaGVyQWxnID09IENJUEhFUl9US0lQX05PX01JQykgfHwKLQkJKENpcGhlckFsZyA9PSBDSVBIRVJfQUVTKSkKLQl7Ci0JCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOwotCX0KLQllbHNlCi0JCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOwotCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoQWlkKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJlZhbHVlKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJTU0lEX1dDSUQgOiBvZmZzZXQgPSAleCwgV0NJREF0dHJpID0gJWx4XG4iLAotCQkJb2Zmc2V0LCBXQ0lEQXR0cmkpKTsKLQotCS8vIHBBZGRyCi0JLy8gQWRkIEJzc2lkIG1hYyBhZGRyZXNzIGF0IGxpbmt1cC4gbm90IGhlcmUuICBjaGVjayEKLQkvKm9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyAoQlNTSURfV0NJRCAqIEhXX1dDSURfRU5UUllfU0laRSk7Ci0JKmZvciAoaT0wOyBpPE1BQ19BRERSX0xFTjsgaSsrKQotCXsKLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcEtleS0+QlNTSURbaV0pOwotCX0KLQkqLwotCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQWRkQlNTSURhc1dDSURFbnRyeTogQWxnPSVzLCBLZXlMZW5ndGggPSAlZFxuIiwKLQkJCUNpcGhlck5hbWVbQ2lwaGVyQWxnXSwgcEtleS0+S2V5TGVuZ3RoKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiS2V5IFtpZHg9JXhdIFtLZXlMZW4gPSAlZF1cbiIsCi0JCQlwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7Ci0JZm9yKGk9MDsgaTxwS2V5LT5LZXlMZW5ndGg7IGkrKykKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiICV4OiIsIHBLZXktPktleU1hdGVyaWFsW2ldKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIJIFxuIikpOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEdldCBhIHJlY2VpdmVkIHBhY2tldC4KLQotQXJndW1lbnRzOgotCXBBZAkJCQkJZGV2aWNlIGNvbnRyb2wgYmxvY2sKLQlwU2F2ZVJ4RAkJCXJlY2VpdmUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbgotCSpwYlJlc2NoZWR1bGUJCW5lZWQgcmVzY2hlZHVsZSBmbGFnCi0JKnBSeFBlbmRpbmcJCQlwZW5kaW5nIHJlY2VpdmVkIHBhY2tldCBmbGFnCi0KLVJldHVybiBWYWx1ZToKLSAgICB0aGUgcmVjaWV2ZWQgcGFja2V0Ci0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0jZGVmaW5lIFJUMjg3MF9SWERNQUxFTl9GSUVMRF9TSVpFCQkJNAotUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCi0JSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAotCU9VVAkJQk9PTEVBTgkJCQkqcGJSZXNjaGVkdWxlLAotCUlOIE9VVAlVSU5UMzIJCQkJKnBSeFBlbmRpbmcpCi17Ci0JUFJYX0NPTlRFWFQJCXBSeENvbnRleHQ7Ci0JUE5ESVNfUEFDS0VUCXBTa2I7Ci0JUFVDSEFSCQkJcERhdGE7Ci0JVUxPTkcJCQlUaGlzRnJhbWVMZW47Ci0JVUxPTkcJCQlSeEJ1ZmZlckxlbmd0aDsKLQlQUlhXSV9TVFJVQwkJcFJ4V0k7Ci0KLQlwUnhDb250ZXh0ID0gJnBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4XTsKLQlpZiAoKHBSeENvbnRleHQtPlJlYWRhYmxlID09IEZBTFNFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCi0JCXJldHVybiBOVUxMOwotCi0JUnhCdWZmZXJMZW5ndGggPSBwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgLSBwQWQtPlJlYWRQb3NpdGlvbjsKLQlpZiAoUnhCdWZmZXJMZW5ndGggPCAoUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBzaXplb2YoUlhXSV9TVFJVQykgKyBzaXplb2YoUlhJTkZPX1NUUlVDKSkpCi0JewotCQlnb3RvIGxhYmVsX251bGw7Ci0JfQotCi0JcERhdGEgPSAmcFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXJbcEFkLT5SZWFkUG9zaXRpb25dOyAvKiA0S0IgKi8KLQkvLyBUaGUgUlhETUEgZmllbGQgaXMgNCBieXRlcywgbm93IGp1c3QgdXNlIHRoZSBmaXJzdCAyIGJ5dGVzLiBUaGUgTGVuZ3RoIGluY2x1ZGluZyB0aGUgKFJYV0kgKyBNU0RVICsgUGFkZGluZykKLQlUaGlzRnJhbWVMZW4gPSAqcERhdGEgKyAoKihwRGF0YSsxKTw8OCk7Ci0gICAgaWYgKFRoaXNGcmFtZUxlbiA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQklSSWR4KCVkKTogUlhETUFMZW4gaXMgemVyby5bJWxkXSwgQnVsa0luQnVmTGVuID0gJWxkKVxuIiwKLQkJCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KSk7Ci0JCWdvdG8gbGFiZWxfbnVsbDsKLQl9Ci0JaWYgKChUaGlzRnJhbWVMZW4mMHgzKSAhPSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQklSSWR4KCVkKTogUlhETUFMZW4gbm90IG11bHRpcGxlIG9mIDQuWyVsZF0sIEJ1bGtJbkJ1ZkxlbiA9ICVsZClcbiIsCi0JCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBUaGlzRnJhbWVMZW4sIHBSeENvbnRleHQtPkJ1bGtJbk9mZnNldCkpOwotCQlnb3RvIGxhYmVsX251bGw7Ci0JfQotCi0JaWYgKChUaGlzRnJhbWVMZW4gKyA4KT4gUnhCdWZmZXJMZW5ndGgpCS8vIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWElORk9fU1RSVUMpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCSVJJZHgoJWQpOkZyYW1lTGVuKDB4JWx4KSBvdXRyYW5nZXMuIEJ1bGtJbkxlbj0weCVseCwgcmVtYWluaW5nIFJ4QnVmTGVuPTB4JWx4LCBSZWFkUG9zPTB4JWx4XG4iLAotCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIFRoaXNGcmFtZUxlbiwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0LCBSeEJ1ZmZlckxlbmd0aCwgcEFkLT5SZWFkUG9zaXRpb24pKTsKLQotCQkvLyBlcnJvciBmcmFtZS4gZmluaXNoIHRoaXMgbG9vcAotCQlnb3RvIGxhYmVsX251bGw7Ci0JfQotCi0JLy8gc2tpcCBVU0IgZnJhbWUgbGVuZ3RoIGZpZWxkCi0JcERhdGEgKz0gUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkU7Ci0JcFJ4V0kgPSAoUFJYV0lfU1RSVUMpcERhdGE7Ci0KLQlpZiAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA+IFRoaXNGcmFtZUxlbikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzKCk6cFJ4V0lNUERVdG90YWxCeXRlQ291bnQoJWQpIGxhcmdlIHRoYW4gUnhETUFMZW4oJWxkKVxuIiwKLQkJCQkJCQkJCV9fZnVuY19fLCBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50LCBUaGlzRnJhbWVMZW4pKTsKLQkJZ290byBsYWJlbF9udWxsOwotCX0KLQotCS8vIGFsbG9jYXRlIGEgcnggcGFja2V0Ci0JcFNrYiA9IGRldl9hbGxvY19za2IoVGhpc0ZyYW1lTGVuKTsKLQlpZiAocFNrYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcygpOkNhbm5vdCBBbGxvY2F0ZSBzayBidWZmZXIgZm9yIHRoaXMgQnVsay1JbiBidWZmZXIhXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGxhYmVsX251bGw7Ci0JfQotCi0JLy8gY29weSB0aGUgcnggcGFja2V0Ci0JbWVtY3B5KHNrYl9wdXQocFNrYiwgVGhpc0ZyYW1lTGVuKSwgcERhdGEsIFRoaXNGcmFtZUxlbik7Ci0JUlRQS1RfVE9fT1NQS1QocFNrYiktPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEJTUzApOwotCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocFNrYiksIFBLVFNSQ19ORElTKTsKLQotCS8vIGNvcHkgUnhECi0JKnBTYXZlUnhEID0gKihQUlhJTkZPX1NUUlVDKShwRGF0YSArIFRoaXNGcmFtZUxlbik7Ci0KLQkvLyB1cGRhdGUgbmV4dCBwYWNrZXQgcmVhZCBwb3NpdGlvbi4KLQlwQWQtPlJlYWRQb3NpdGlvbiArPSAoVGhpc0ZyYW1lTGVuICsgUlQyODcwX1JYRE1BTEVOX0ZJRUxEX1NJWkUgKyBSWElORk9fU0laRSk7CS8vIDggZm9yIChSVDI4NzBfUlhETUFMRU5fRklFTERfU0laRSArIHNpemVvZihSWElORk9fU1RSVUMpKQotCi0JcmV0dXJuIHBTa2I7Ci0KLWxhYmVsX251bGw6Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEhhbmRsZSByZWNlaXZlZCBwYWNrZXRzLgotCi1Bcmd1bWVudHM6Ci0JZGF0YQkJCQktIFVSQiBpbmZvcm1hdGlvbiBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXB1cmJiX3QgCQkJcFVyYjsKLQlQUlhfQ09OVEVYVAkJCXBSeENvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCU5UU1RBVFVTCQkJU3RhdHVzOwotCXVuc2lnbmVkIGludAkJSXJxRmxhZ3M7Ci0KLQlwVXJiCQk9IChwdXJiYl90KWRhdGE7Ci0JcFJ4Q29udGV4dAk9IChQUlhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCT0gcFJ4Q29udGV4dC0+cEFkOwotCVN0YXR1cyA9IHBVcmItPnN0YXR1czsKLQotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKLQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7Ci0JcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0ICs9IHBVcmItPmFjdHVhbF9sZW5ndGg7Ci0JLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKLQlwQWQtPlBlbmRpbmdSeC0tOwotCi0JaWYgKFN0YXR1cyA9PSBVU0JfU1RfTk9FUlJPUikKLQl7Ci0JCXBBZC0+QnVsa0luQ29tcGxldGUrKzsKLQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9IDA7Ci0JCWlmIChwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQpCS8vIEFzIGphbidzIGNvbW1lbnQsIGl0IG1heSBidWxrLWluIHN1Y2Nlc3MgYnV0IHNpemUgaXMgemVyby4KLQkJewotCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBUUlVFOwotCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgUlhfUklOR19TSVpFKTsKLQkJfQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCX0KLQllbHNlCSAvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCXBBZC0+QnVsa0luQ29tcGxldGVGYWlsKys7Ci0JCS8vIFN0aWxsIHJlYWQgdGhpcyBwYWNrZXQgYWx0aG91Z2ggaXQgbWF5IGNvbXRhaW4gd3JvbmcgYnl0ZXMuCi0JCXBSeENvbnRleHQtPlJlYWRhYmxlID0gRkFMU0U7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0KLQkJLy8gUGFyc2luZyBhbGwgcGFja2V0cy4gYmVjYXVzZSBhZnRlciByZXNldCwgdGhlIGluZGV4IHdpbGwgcmVzZXQgdG8gYWxsIHplcm8uCi0JCWlmICgoIVJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQkJewotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsayBJbiBGYWlsZWQuIFN0YXR1cz0lZCwgQklJZHg9MHgleCwgQklSSWR4PTB4JXgsIGFjdHVhbF9sZW5ndGg9IDB4JXhcbiIsCi0JCQkJCQkJU3RhdHVzLCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCwgcFJ4Q29udGV4dC0+cFVyYi0+YWN0dWFsX2xlbmd0aCkpOwotCi0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOwotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19JTiwgTlVMTCwgMCk7Ci0JCX0KLQl9Ci0KLQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKLQotCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKLQotCXJldHVybjsKLQotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9tZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIgCXBBZDsKLQlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0OwotCWludAkJCQlpbmRleDsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlwdXJiYl90CQkJcFVyYjsKLQlOVFNUQVRVUwkJU3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0KLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcE1MTUVDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJCT0gcE1MTUVDb250ZXh0LT5wQWQ7Ci0JU3RhdHVzCQkJPSBwVXJiLT5zdGF0dXM7Ci0JaW5kZXggCQkJPSBwTUxNRUNvbnRleHQtPlNlbGZJZHg7Ci0KLQlBU1NFUlQoKHBBZC0+TWdtdFJpbmcuVHhEbWFJZHggPT0gaW5kZXgpKTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdLCBJcnFGbGFncyk7Ci0KLQotCWlmIChTdGF0dXMgIT0gVVNCX1NUX05PRVJST1IpCi0JewotCQkvL0J1bGstT3V0IGZhaWwgc3RhdHVzIGhhbmRsZQotCQlpZiAoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpKSkKLQkJewotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGsgT3V0IE1MTUUgRmFpbGVkLCBTdGF0dXM9JWQhXG4iLCBTdGF0dXMpKTsKLQkJCS8vIFRPRE86IEhvdyB0byBoYW5kbGUgYWJvdXQgdGhlIE1MTUVCdWxrT3V0IGZhaWxlZCBpc3N1ZS4gTmVlZCB0byByZXNlbmQgdGhlIG1nbXQgcGt0PwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0JCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKLQkJfQotCX0KLQotCXBBZC0+QnVsa091dFBlbmRpbmdbTUdNVFBJUEVJRFhdID0gRkFMU0U7Ci0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKLQkvLyBSZXNldCBNTE1FIGNvbnRleHQgZmxhZ3MKLQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQlwTUxNRUNvbnRleHQtPkluVXNlID0gRkFMU0U7Ci0JcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPSBGQUxTRTsKLQlwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplID0gMDsKLQotCXBQYWNrZXQgPSBwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0OwotCXBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JLy8gSW5jcmVhc2UgTWdtdFJpbmcgSW5kZXgKLQlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4RG1hSWR4LCBNR01UX1JJTkdfU0laRSk7Ci0JcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCsrOwotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKLQotCS8vIE5vLW1hdHRlciBzdWNjZXNzIG9yIGZhaWwsIHdlIGZyZWUgdGhlIG1nbXQgcGFja2V0LgotCWlmIChwUGFja2V0KQotCQlSVE1QRnJlZU5kaXNQYWNrZXQocEFkLCBwUGFja2V0KTsKLQotCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQl7Ci0JCS8vIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSAmJgotCQkJKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykpCi0JCXsJLy8gRm9yIE1nbXQgQnVsay1PdXQgZmFpbGVkLCBpZ25vcmUgaXQgbm93LgotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JCWVsc2UKLQkJewotCi0JCQkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KLQkJCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQotCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPCBNR01UX1JJTkdfU0laRSAvKiBwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBUUlVFICovKQotCQkJewotCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7Ci0JCQl9Ci0JCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQkJfQotCQl9Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfaGNjYV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSCQlwQWQ7Ci0JUEhUX1RYX0NPTlRFWFQJCXBIVFRYQ29udGV4dDsKLQlVQ0hBUgkJCQlCdWxrT3V0UGlwZUlkID0gNDsKLQlwdXJiYl90CQkJCXBVcmI7Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiLS0tPmhjY2FfZG1hX2RvbmVfdGFza2xldFxuIikpOwotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCi0JCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCi0JCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQotCQkJewotCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQotCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8NCk7Ci0JCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiPC0tLWhjY2FfZG1hX2RvbmVfdGFza2xldFxuIikpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzNfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JVUNIQVIJCQkJQnVsa091dFBpcGVJZCA9IDM7Ci0JcHVyYmJfdAkJCQlwVXJiOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZAkJCQk9IHBIVFRYQ29udGV4dC0+cEFkOwotCi0JcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCgodW5zaWduZWQgbG9uZylwVXJiKTsKLQotCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQl7Ci0JCS8vIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkKLQkJewotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JCWVsc2UKLQkJewlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07Ci0JCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCi0JCQkJLyooKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KLQkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKLQkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCi0JCQl7Ci0JCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOwotCQkJfQotCi0JCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMPDwzKTsKLQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJfQotCX0KLQotCi0JCXJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSVE1QX0FEQVBURVIJCXBBZDsKLQlQSFRfVFhfQ09OVEVYVAkJcEhUVFhDb250ZXh0OwotCVVDSEFSCQkJCUJ1bGtPdXRQaXBlSWQgPSAyOwotCXB1cmJiX3QJCQkJcFVyYjsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQotCXJ0Mjg3MF9kYXRhb3V0X2NvbXBsZXRlX3Rhc2tsZXQoKHVuc2lnbmVkIGxvbmcpcFVyYik7Ci0KLQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpCi0JewotCQkvLyBkbyBub3RoaW5nIGFuZCByZXR1cm4gZGlyZWN0bHkuCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCkpCi0JCXsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwotCQkJaWYgKChwQWQtPlR4U3dRdWV1ZVtCdWxrT3V0UGlwZUlkXS5OdW1iZXIgPiAwKSAmJgotCQkJCS8qKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uICsgMHg2MDAwKSkgfHwgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDB4NjAwMCkpICYmICovCi0JCQkJKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbQnVsa091dFBpcGVJZF0gPT0gRkFMU0UpICYmCi0JCQkJKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gRkFMU0UpKQotCQkJewotCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIEJ1bGtPdXRQaXBlSWQsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCX0KLQotCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTDw8Mik7Ci0JCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JCX0KLQl9Ci0KLQkJcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JVUNIQVIJCQkJQnVsa091dFBpcGVJZCA9IDE7Ci0JcHVyYmJfdAkJCQlwVXJiOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZAkJCQk9IHBIVFRYQ29udGV4dC0+cEFkOwotCi0JcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCgodW5zaWduZWQgbG9uZylwVXJiKTsKLQotCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQl7Ci0JCS8vIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkKLQkJewotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JCWVsc2UKLQkJewlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07Ci0JCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCi0JCQkJLyooKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gKyAweDYwMDApKSB8fCAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uID4gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgMHg2MDAwKSkgJiYgKi8KLQkJCQkocEFkLT5EZVF1ZXVlUnVubmluZ1tCdWxrT3V0UGlwZUlkXSA9PSBGQUxTRSkgJiYKLQkJCQkocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBGQUxTRSkpCi0JCQl7Ci0JCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgQnVsa091dFBpcGVJZCwgTUFYX1RYX1BST0NFU1MpOwotCQkJfQotCi0JCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMPDwxKTsKLQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQkJfQotCX0KLQotCi0JcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9hYzBfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JVUNIQVIJCQkJQnVsa091dFBpcGVJZCA9IDA7Ci0JcHVyYmJfdAkJCQlwVXJiOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBIVFRYQ29udGV4dAk9IChQSFRfVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZAkJCQk9IHBIVFRYQ29udGV4dC0+cEFkOwotCi0JcnQyODcwX2RhdGFvdXRfY29tcGxldGVfdGFza2xldCgodW5zaWduZWQgbG9uZylwVXJiKTsKLQotCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQl7Ci0JCS8vIGRvIG5vdGhpbmcgYW5kIHJldHVybiBkaXJlY3RseS4KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkKLQkJewotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JCWVsc2UKLQkJewlwSFRUWENvbnRleHQgPSAmcEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF07Ci0JCQlpZiAoKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA+IDApICYmCi0JCQkJLyogICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID4gKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiArIDB4NjAwMCkpIHx8IChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAweDYwMDApKSAmJiAqLwotCQkJCShwQWQtPkRlUXVldWVSdW5uaW5nW0J1bGtPdXRQaXBlSWRdID09IEZBTFNFKSAmJgotCQkJCShwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IEZBTFNFKSkKLQkJCXsKLQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBCdWxrT3V0UGlwZUlkLCBNQVhfVFhfUFJPQ0VTUyk7Ci0JCQl9Ci0KLQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwpOwotCQkJUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQl9Ci0JfQotCi0KLQlyZXR1cm47Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfbnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0OwotCXB1cmJiX3QJCQlwVXJiOwotCU5UU1RBVFVTCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwlpcnFGbGFnOwotCi0KLQlwVXJiCQkJPSAocHVyYmJfdClkYXRhOwotCXBOdWxsQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZCAJCQk9IHBOdWxsQ29udGV4dC0+cEFkOwotCVN0YXR1cyAJCQk9IHBVcmItPnN0YXR1czsKLQotCS8vIFJlc2V0IE51bGwgZnJhbWUgY29udGV4dCBmbGFncwotCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCXBOdWxsQ29udGV4dC0+SVJQUGVuZGluZyAJPSBGQUxTRTsKLQlwTnVsbENvbnRleHQtPkluVXNlIAkJPSBGQUxTRTsKLQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7Ci0JcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFswXSA9IDA7Ci0KLQlpZiAoU3RhdHVzID09IFVTQl9TVF9OT0VSUk9SKQotCXsKLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQotCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCX0KLQllbHNlCS8vIFNUQVRVU19PVEhFUgotCXsKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCXsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBOdWxsIEZyYW1lIEZhaWxlZCwgUmVhc29uQ29kZT0lZCFcbiIsIFN0YXR1cykpOwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7Ci0JCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCA9IChNR01UUElQRUlEWCB8IEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKTsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVCwgTlVMTCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCQl9Ci0JfQotCi0JLy8gQWx3YXlzIGNhbGwgQnVsayByb3V0aW5lLCBldmVuIHJlc2V0IGJ1bGsuCi0JLy8gVGhlIHByb3RlY3Rpb29uIG9mIHJlc3QgYnVsayBzaG91bGQgYmUgaW4gQnVsa091dCByb3V0aW5lCi0JUlRVU0JLaWNrQnVsa091dChwQWQpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgcnQyODcwX3J0c19mcmFtZV9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQVFhfQ09OVEVYVAkJcFJUU0NvbnRleHQ7Ci0JcHVyYmJfdAkJCXBVcmI7Ci0JTlRTVEFUVVMJCVN0YXR1czsKLQl1bnNpZ25lZCBsb25nCWlycUZsYWc7Ci0KLQotCXBVcmIJCT0gKHB1cmJiX3QpZGF0YTsKLQlwUlRTQ29udGV4dAk9IChQVFhfQ09OVEVYVClwVXJiLT5jb250ZXh0OwotCXBBZAkJCT0gcFJUU0NvbnRleHQtPnBBZDsKLQlTdGF0dXMJCT0gcFVyYi0+c3RhdHVzOwotCi0JLy8gUmVzZXQgUlRTIGZyYW1lIGNvbnRleHQgZmxhZ3MKLQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQlwUlRTQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCXBSVFNDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKLQotCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCi0JewotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIGlycUZsYWcpOwotCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCX0KLQllbHNlCS8vIFNUQVRVU19PVEhFUgotCXsKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCXsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBSVFMgRnJhbWUgRmFpbGVkXG4iKSk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOwotCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBpcnFGbGFnKTsKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VULCBOVUxMLCAwKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgaXJxRmxhZyk7Ci0JCX0KLQl9Ci0KLQlSVE1QX1NFTV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BSVFNDb250ZXh0LT5CdWxrT3V0UGlwZUlkXSk7Ci0JcEFkLT5CdWxrT3V0UGVuZGluZ1twUlRTQ29udGV4dC0+QnVsa091dFBpcGVJZF0gPSBGQUxTRTsKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcFJUU0NvbnRleHQtPkJ1bGtPdXRQaXBlSWRdKTsKLQotCS8vIEFsd2F5cyBjYWxsIEJ1bGsgcm91dGluZSwgZXZlbiByZXNldCBidWxrLgotCS8vIFRoZSBwcm90ZWN0aW9vbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQotCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQotfQotCi0KLXN0YXRpYyB2b2lkIHJ0Mjg3MF9wc3BvbGxfZnJhbWVfY29tcGxldGVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJUTVBfQURBUFRFUglwQWQ7Ci0JUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0OwotCXB1cmJiX3QJCQlwVXJiOwotCU5UU1RBVFVTCQlTdGF0dXM7Ci0KLQotCXBVcmIJCQk9IChwdXJiYl90KWRhdGE7Ci0JcFBzUG9sbENvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwUHNQb2xsQ29udGV4dC0+cEFkOwotCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOwotCi0JLy8gUmVzZXQgUHNQb2xsIGNvbnRleHQgZmxhZ3MKLQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOwotCXBQc1BvbGxDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKLQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKLQotCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCi0JewotCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCX0KLQllbHNlIC8vIFNUQVRVU19PVEhFUgotCXsKLQkJaWYgKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpICYmCi0JCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCXsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJCdWxrIE91dCBQU1BvbGwgRmFpbGVkXG4iKSk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQkJCXBBZC0+YnVsa1Jlc2V0UGlwZWlkID0gKE1HTVRQSVBFSURYIHwgQlVMS09VVF9NR01UX1JFU0VUX0ZMQUcpOwotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQsIE5VTEwsIDApOwotCQl9Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSk7Ci0JcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOwotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSk7Ci0KLQkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KLQkvLyBUaGUgcHJvdGVjdGlvb24gb2YgcmVzdCBidWxrIHNob3VsZCBiZSBpbiBCdWxrT3V0IHJvdXRpbmUKLQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBydDI4NzBfZGF0YW91dF9jb21wbGV0ZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQUlRNUF9BREFQVEVSCQlwQWQ7Ci0JcHVyYmJfdAkJCQlwVXJiOwotCVBPU19DT09LSUUJCQlwT2JqOwotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JVUNIQVIJCQkJQnVsa091dFBpcGVJZDsKLQlOVFNUQVRVUwkJCVN0YXR1czsKLQl1bnNpZ25lZCBsb25nCQlJcnFGbGFnczsKLQotCi0JcFVyYgkJCT0gKHB1cmJiX3QpZGF0YTsKLQlwSFRUWENvbnRleHQJPSAoUEhUX1RYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQJCQkJPSBwSFRUWENvbnRleHQtPnBBZDsKLQlwT2JqIAkJCT0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCVN0YXR1cwkJCT0gcFVyYi0+c3RhdHVzOwotCi0JLy8gU3RvcmUgQnVsa091dCBQaXBlSWQKLQlCdWxrT3V0UGlwZUlkID0gcEhUVFhDb250ZXh0LT5CdWxrT3V0UGlwZUlkOwotCXBBZC0+QnVsa091dERhdGFPbmVTZWNDb3VudCsrOwotCi0JLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCAoIkRvbmUtQiglZCk6ST0weCVseCwgQ1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgQnVsa091dFBpcGVJZCwgaW5faW50ZXJydXB0KCksIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKLQkvLwkJcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKLQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W0J1bGtPdXRQaXBlSWRdID0gMDsKLQotCWlmIChTdGF0dXMgPT0gVVNCX1NUX05PRVJST1IpCi0JewotCQlwQWQtPkJ1bGtPdXRDb21wbGV0ZSsrOwotCi0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCi0JCXBBZC0+Q291bnRlcnM4MDIzLkdvb2RUcmFuc21pdHMrKzsKLQkJLy9SVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCQlGUkVFX0hUVFhfUklORyhwQWQsIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dCk7Ci0JCS8vUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCi0KLQl9Ci0JZWxzZQkvLyBTVEFUVVNfT1RIRVIKLQl7Ci0JCVBVQ0hBUglwQnVmOwotCi0JCXBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIrKzsKLQotCQlwQnVmID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W3BIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbl07Ci0KLQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8Ci0JCQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfAotCQkJCQkJCQkJZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKSkpCi0JCXsKLQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOwotCQkJcEFkLT5idWxrUmVzZXRQaXBlaWQgPSBCdWxrT3V0UGlwZUlkOwotCQkJcEFkLT5idWxrUmVzZXRSZXFbQnVsa091dFBpcGVJZF0gPSBwQWQtPkJ1bGtPdXRSZXE7Ci0JCX0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7Ci0KLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtPdXREYXRhUGFja2V0IGZhaWxlZDogUmVhc29uQ29kZT0lZCFcbiIsIFN0YXR1cykpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiXHQ+PkJ1bGtPdXQgUmVxPTB4JWx4LCBDb21wbGV0ZT0weCVseCwgT3RoZXI9MHglbHhcbiIsIHBBZC0+QnVsa091dFJlcSwgcEFkLT5CdWxrT3V0Q29tcGxldGUsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlx0Pj5CdWxrT3V0IEhlYWRlcjoleCAleCAleCAleCAleCAleCAleCAleFxuIiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwgcEJ1Zls0XSwgcEJ1Zls1XSwgcEJ1Zls2XSwgcEJ1Zls3XSkpOwotCQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI+PkJ1bGtPdXRDb21wbGV0ZUNhbmNlbD0weCV4LCBCdWxrT3V0Q29tcGxldGVPdGhlcj0weCV4XG4iLCBwQWQtPkJ1bGtPdXRDb21wbGV0ZUNhbmNlbCwgcEFkLT5CdWxrT3V0Q29tcGxldGVPdGhlcikpOwotCi0JfQotCi0JLy8KLQkvLyBiSW5Vc2UgPSBUUlVFLCBtZWFucyBzb21lIHByb2Nlc3MgYXJlIGZpbGxpbmcgVFggZGF0YSwgYWZ0ZXIgdGhhdCBtdXN0IHR1cm4gb24gYldhaXRpbmdCdWxrT3V0Ci0JLy8gYldhaXRpbmdCdWxrT3V0ID0gVFJVRSwgbWVhbnMgdGhlIFRYIGRhdGEgYXJlIHdhaXRpbmcgZm9yIGJ1bGsgb3V0LgotCS8vCi0JLy9SVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiAhPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pICYmCi0JCShwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9IChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24rOCkpICYmCi0JCSFSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9GUkFHIDw8IEJ1bGtPdXRQaXBlSWQpKSkKLQl7Ci0JCS8vIEluZGljYXRlIFRoZXJlIGlzIGRhdGEgYXZhbGlhYmxlCi0JCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQl9Ci0JLy9SVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7Ci0KLQkvLyBBbHdheXMgY2FsbCBCdWxrIHJvdXRpbmUsIGV2ZW4gcmVzZXQgYnVsay4KLQkvLyBUaGUgcHJvdGVjdGlvbiBvZiByZXN0IGJ1bGsgc2hvdWxkIGJlIGluIEJ1bGtPdXQgcm91dGluZQotCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLX0KLQotLyogRW5kIG9mIDI4NzBfcnRtcF9pbml0LmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2FjY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDgwNmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vYWNjdGlvbi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2FjdGlvbi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2Flcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDZhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fYWVzLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX2Flcy5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2FzaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkZTgxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9hc2ljLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX2FzaWMuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9jZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9jZmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjJiZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2NmZy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV9jZmcuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhXzI4NzAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9kYXRhXzI4NzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2M2E0OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV8yODcwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoKLSAgIEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG11c3QgYmUgVVNCLWRlcGVuZGVkLCBvciB5b3Ugc2hvdWxkIG91dCB5b3VyIGZ1bmN0aW9uCi0JaW4gb3RoZXIgZmlsZXMuCi0KLSovCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLyoKLQlXZSBjYW4gZG8gY29weSB0aGUgZnJhbWUgaW50byBwVHhDb250ZXh0IHdoZW4gbWF0Y2ggZm9sbG93aW5nIGNvbmRpdGlvbnMuCi0JCT0+Ci0JCT0+Ci0JCT0+Ci0qLwotc3RhdGljIGlubGluZSBORElTX1NUQVRVUyBSdG1wVVNCQ2FuRG9Xcml0ZSgKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gVUNIQVIJCQlRdWVJZHgsCi0JSU4gSFRfVFhfQ09OVEVYVCAJKnBIVFRYQ29udGV4dCkKLXsKLQlORElTX1NUQVRVUwljYW5Xcml0ZSA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQotCWlmICgoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikgPCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBMT0NBTF9UWEJVRl9TSVpFKSA+IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUnRtcFVTQkNhbkRvV3JpdGUgYzEhXG4iKSk7Ci0JCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOwotCX0KLQllbHNlIGlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID09IDgpICYmIChwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPCBMT0NBTF9UWEJVRl9TSVpFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUnRtcFVTQkNhbkRvV3JpdGUgYzIhXG4iKSk7Ci0JCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOwotCX0KLQllbHNlIGlmIChwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlJ0bXBVU0JDYW5Eb1dyaXRlIGMzIVxuIikpOwotCX0KLQllbHNlCi0JewotCQljYW5Xcml0ZSA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotCi0KLQlyZXR1cm4gY2FuV3JpdGU7Ci19Ci0KLQotVVNIT1JUIFJ0bXBVU0JfV3JpdGVTdWJUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCi0JLy8gRHVtbXkgZnVuY3Rpb24uIFNob3VsZCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JcmV0dXJuIDA7Ci0KLX0KLQotVVNIT1JUCVJ0bXBVU0JfV3JpdGVGcmFnVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhZ051bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCi17Ci0JSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OwotCVVTSE9SVAkJCWh3SGRyTGVuOwkvLyBUaGUgaHdIZHJMZW4gY29uc2lzdCBvZiA4MDIuMTEgaGVhZGVyIGxlbmd0aCBwbHVzIHRoZSBoZWFkZXIgcGFkZGluZyBsZW5ndGguCi0JVUlOVDMyCQkJZmlsbE9mZnNldDsKLQlUWElORk9fU1RSVUMJKnBUeEluZm87Ci0JVFhXSV9TVFJVQwkJKnBUeFdJOwotCVBVQ0hBUgkJCXBXaXJlbGVzc1BhY2tldCA9IE5VTEw7Ci0JVUNIQVIJCQlRdWVJZHg7Ci0JTkRJU19TVEFUVVMJCVN0YXR1czsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCVVJTlQzMgkJCVVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsKLQlCT09MRUFOCQkJVHhRTGFzdFJvdW5kID0gRkFMU0U7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlICYgRG1hIEJ1ZmZlciBhZGRyZXNzCi0JLy8KLQlRdWVJZHggPSBwVHhCbGstPlF1ZUlkeDsKLQlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQlwSFRUWENvbnRleHQgID0gJnBBZC0+VHhDb250ZXh0W1F1ZUlkeF07Ci0JZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQotCWlmKGZyYWdOdW0gPT0gMCkKLQl7Ci0JCS8vIENoZWNrIGlmIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ1bGstb3V0IGJhdGNoLgotCQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gVFJVRTsKLQotCQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLgotCQkJaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JCQl7Ci0JCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArPSA4OwotCQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSA4OwotCQkJCWZpbGxPZmZzZXQgKz0gODsKLQkJCX0KLQkJCXBUeEJsay0+UHJpdiA9IDA7Ci0JCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybihTdGF0dXMpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEZvciBzdWItc2VxdWVudCBmcmFtZXMgb2YgdGhpcyBidWxrLW91dCBiYXRjaC4gSnVzdCBjb3B5IGl0IHRvIG91ciBidWxrLW91dCBidWZmZXIuCi0JCVN0YXR1cyA9ICgocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKSA/IE5ESVNfU1RBVFVTX1NVQ0NFU1MgOiBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlmaWxsT2Zmc2V0ICs9IHBUeEJsay0+UHJpdjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybihTdGF0dXMpOwotCQl9Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikoJnBUeEJsay0+SGVhZGVyQnVmWzBdKSwgVFhJTkZPX1NJWkUpOwotCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmWzBdKTsKLQlwVHhXST0gKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKTsKLQotCXBXaXJlbGVzc1BhY2tldCA9ICZwSFRUWENvbnRleHQtPlRyYW5zZmVyQnVmZmVyLT5maWVsZC5XaXJlbGVzc1BhY2tldFtmaWxsT2Zmc2V0XTsKLQotCS8vIGNvcHkgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKLQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLCA0KTsKLQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAotCURNQUhkckxlbiA9IFRYV0lfU0laRSArIGh3SGRyTGVuOwotCVVTQkRNQXBrdExlbiA9IERNQUhkckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0JVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7Ci0KLQlwVHhCbGstPlByaXYgKz0gKFRYSU5GT19TSVpFICsgVVNCRE1BcGt0TGVuKTsKLQotCS8vIEZvciBUeEluZm8sIHRoZSBsZW5ndGggb2YgVVNCRE1BcGt0TGVuID0gVFhXSV9TSVpFICsgODAyLjExIGhlYWRlciArIHBheWxvYWQKLQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShVU0JETUFwa3RMZW4pLCBGQUxTRSwgRklGT19FRENBLCBGQUxTRSAvKk5leHRWYWxpZCovLCAgRkFMU0UpOwotCi0JaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pCi0JewotCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMDsKLQkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYgKyAzOTA2KT4gTUFYX1RYQlVMS19MSU1JVCkKLQkJewotCQkJcFR4SW5mby0+U3dVc2VMYXN0Um91bmQgPSAxOwotCQkJVHhRTGFzdFJvdW5kID0gVFJVRTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gMTsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQlwV2lyZWxlc3NQYWNrZXQgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOwotCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQotCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7Ci0KLQkvLwlaZXJvIHRoZSBsYXN0IHBhZGRpbmcuCi0JcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCU5kaXNaZXJvTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcGFkZGluZyArIDgpOwotCi0JaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pCi0JewotCQlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQkJLy8gVXBkYXRlIHRoZSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24uIDM5MDYgdXNlZCB0byBwcmV2ZW50IHRoZSBOZXh0QnVsa091dCBpcyBhIEEtUkFMSU5LL0EtTVNEVSBGcmFtZS4KLQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IHBUeEJsay0+UHJpdjsKLQkJaWYgKFR4UUxhc3RSb3VuZCA9PSBUUlVFKQotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gODsKLQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0KLQotCQkvLyBGaW5hbGx5LCBzZXQgYkN1cldyaXRpbmcgYXMgRkFMU0UKLQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7Ci0KLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQkJLy8gc3VjY2VlZCBhbmQgcmVsZWFzZSB0aGUgc2tiIGJ1ZmZlcgotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQl9Ci0KLQotCXJldHVybihTdGF0dXMpOwotCi19Ci0KLQotVVNIT1JUIFJ0bXBVU0JfV3JpdGVTaW5nbGVUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JQk9PTEVBTgkJCWJJc0xhc3QsCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKLQlVU0hPUlQJCQlod0hkckxlbjsKLQlVSU5UMzIJCQlmaWxsT2Zmc2V0OwotCVRYSU5GT19TVFJVQwkqcFR4SW5mbzsKLQlUWFdJX1NUUlVDCQkqcFR4V0k7Ci0JUFVDSEFSCQkJcFdpcmVsZXNzUGFja2V0OwotCVVDSEFSCQkJUXVlSWR4OwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JTkRJU19TVEFUVVMJCVN0YXR1czsKLQlVSU5UMzIJCQlVU0JETUFwa3RMZW4gPSAwLCBETUFIZHJMZW4sIHBhZGRpbmc7Ci0JQk9PTEVBTgkJCWJUeFFMYXN0Um91bmQgPSBGQUxTRTsKLQotCS8vIEZvciBVU0IsIGRpZG4ndCBuZWVkIFBDSV9NQVBfU0lOR0xFKCkKLQkvL1NyY0J1ZlBBID0gUENJX01BUF9TSU5HTEUocEFkLCAoY2hhciAqKSBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1ZkxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UgJiBEbWEgQnVmZmVyIGFkZHJlc3MKLQkvLwotCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKLQlmaWxsT2Zmc2V0ID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0KLQotCS8vIENoZWNrIHJpbmcgZnVsbC4KLQlTdGF0dXMgPSBSdG1wVVNCQ2FuRG9Xcml0ZShwQWQsIFF1ZUlkeCwgcEhUVFhDb250ZXh0KTsKLQlpZihTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCXBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPSBUUlVFOwotCi0JCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmWzBdKTsKLQkJcFR4V0k9IChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSk7Ci0KLQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgOCBieXRlcyBwYWRkaW5nLgotCQlpZiAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJewotCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArPSA4OwotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IDg7Ci0JCQlmaWxsT2Zmc2V0ICs9IDg7Ci0JCX0KLQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0KLQkJcFdpcmVsZXNzUGFja2V0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOwotCi0JCS8vIGNvcHkgVFhXSSArIFdMQU4gSGVhZGVyICsgTExDIGludG8gRE1BIEhlYWRlciBCdWZmZXIKLQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQkJLy8gQnVpbGQgb3VyIFVSQiBmb3IgVVNCRAotCQlETUFIZHJMZW4gPSBUWFdJX1NJWkUgKyBod0hkckxlbjsKLQkJVVNCRE1BcGt0TGVuID0gRE1BSGRyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0JCXBhZGRpbmcgPSAoNCAtIChVU0JETUFwa3RMZW4gJSA0KSkgJiAweDAzOwkvLyByb3VuZCB1cCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0JCVVTQkRNQXBrdExlbiArPSBwYWRkaW5nOwotCi0JCXBUeEJsay0+UHJpdiA9IChUWElORk9fU0laRSArIFVTQkRNQXBrdExlbik7Ci0KLQkJLy8gRm9yIFR4SW5mbywgdGhlIGxlbmd0aCBvZiBVU0JETUFwa3RMZW4gPSBUWFdJX1NJWkUgKyA4MDIuMTEgaGVhZGVyICsgcGF5bG9hZAotCQkvL1BTIHBhY2tldHMgdXNlIEhDQ0EgcXVldWUgd2hlbiBkZXF1ZXVlIGZyb20gUFMgdW5pY2FzdCBxdWV1ZSAoV2lGaSBXUEEyIE1BOV9EVDEgZm9yIE1hcnZlbGwgQiBTVEEpCi0JCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKFVTQkRNQXBrdExlbiksIEZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkKi8sICBGQUxTRSk7Ci0KLQkJaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyAzOTA2ICsgcFR4QmxrLT5Qcml2KSA+IE1BWF9UWEJVTEtfTElNSVQpCi0JCXsKLQkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMTsKLQkJCWJUeFFMYXN0Um91bmQgPSBUUlVFOwotCQl9Ci0JCU5kaXNNb3ZlTWVtb3J5KHBXaXJlbGVzc1BhY2tldCwgcFR4QmxrLT5IZWFkZXJCdWYsIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOwotCQlwV2lyZWxlc3NQYWNrZXQgKz0gKFRYSU5GT19TSVpFICsgVFhXSV9TSVpFICsgaHdIZHJMZW4pOwotCi0JCS8vIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZWQgaXNzdWUuCi0JCS8vCTEuIEZpcnN0IHdlIGdvdCBDdXJXcml0ZVBvc2l0aW9uIGJ1dCB0aGUgZmlyc3QgOCBieXRlcyBzdGlsbCBub3Qgd3JpdGUgdG8gdGhlIHBUeGNvbnRleHQuCi0JCS8vCTIuIEFuIGludGVycnVwdCBicmVhayBvdXIgcm91dGluZSBhbmQgaGFuZGxlIGJ1bGstb3V0IGNvbXBsZXRlLgotCQkvLwkzLiBJbiB0aGUgYnVsay1vdXQgY29tcGxsZXRlLCBpdCBuZWVkIHRvIGRvIGFub3RoZXIgYnVsay1vdXQsCi0JCS8vCQkJaWYgdGhlIEVOZXh0QnVsa091dFBvc2l0aW9uIGlzIGp1c3QgdGhlIHNhbWUgYXMgQ3VyV3JpdGVQb3NpdGlvbiwgaXQgd2lsbCBzYXZlIHRoZSBmaXJzdCA4IGJ5dGVzIGZyb20gQ3VyV3JpdGVQb3NpdGlvbiwKLQkJLy8JCQlidXQgdGhlIHBheWxvYWQgc3RpbGwgbm90IGNvcHllZC4gdGhlIHBUeENvbnRleHQtPlNhdmVkUGFkW10gd2lsbCBzYXZlIGFzIGFsbHplcm8uIGFuZCBzZXQgdGhlIGJDb3B5UGFkID0gVFJVRS4KLQkJLy8JNC4gSW50ZXJydXB0IGNvbXBsZXRlLgotCQkvLyAgNS4gT3VyIGludGVycnVwdGVkIHJvdXRpbmUgZ28gYmFjayBhbmQgZmlsbCB0aGUgZmlyc3QgOCBieXRlcyB0byBwVHhDb250ZXh0LgotCQkvLwk2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4KLQkJLy8JCWFuZCB0aGUgcGFja2V0IHdpbGwgd3JvbmcuCi0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zICs9IChUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGRyTGVuKTsKLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPnBTcmNCdWZEYXRhLCBwVHhCbGstPlNyY0J1Zkxlbik7Ci0JCXBXaXJlbGVzc1BhY2tldCArPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQkJTmRpc1plcm9NZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwYWRkaW5nICsgOCk7Ci0KLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSBwVHhCbGstPlByaXY7Ci0JCWlmIChiVHhRTGFzdFJvdW5kKQotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uID0gODsKLQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0KLQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nID0gRkFMU0U7Ci0JfQotCi0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCi0JLy8gc3VjY2VlZCBhbmQgcmVsZWFzZSB0aGUgc2tiIGJ1ZmZlcgotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuKFN0YXR1cyk7Ci0KLX0KLQotCi1VU0hPUlQgUnRtcFVTQl9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhbWVOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKQotewotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKLQlVU0hPUlQJCQlod0hkckxlbjsJLy8gVGhlIGh3SGRyTGVuIGNvbnNpc3Qgb2YgODAyLjExIGhlYWRlciBsZW5ndGggcGx1cyB0aGUgaGVhZGVyIHBhZGRpbmcgbGVuZ3RoLgotCVVJTlQzMgkJCWZpbGxPZmZzZXQ7Ci0JVFhJTkZPX1NUUlVDCSpwVHhJbmZvOwotCVRYV0lfU1RSVUMJCSpwVHhXSTsKLQlQVUNIQVIJCQlwV2lyZWxlc3NQYWNrZXQgPSBOVUxMOwotCVVDSEFSCQkJUXVlSWR4OwotCU5ESVNfU1RBVFVTCQlTdGF0dXM7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKLQkvL1VJTlQzMgkJCVVTQkRNQXBrdExlbiA9IDAsIERNQUhkckxlbiwgcGFkZGluZzsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UgJiBEbWEgQnVmZmVyIGFkZHJlc3MKLQkvLwotCVF1ZUlkeCA9IHBUeEJsay0+UXVlSWR4OwotCXBIVFRYQ29udGV4dCAgPSAmcEFkLT5UeENvbnRleHRbUXVlSWR4XTsKLQotCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCWlmKGZyYW1lTnVtID09IDApCi0JewotCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhpcyBidWxrLW91dCBiYXRjaC4KLQkJU3RhdHVzID0gUnRtcFVTQkNhbkRvV3JpdGUocEFkLCBRdWVJZHgsIHBIVFRYQ29udGV4dCk7Ci0JCWlmIChTdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IFRSVUU7Ci0KLQkJCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmWzBdKTsKLQkJCXBUeFdJPSAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pOwotCi0KLQkJCS8vIFJlc2VydmUgc3BhY2UgZm9yIDggYnl0ZXMgcGFkZGluZy4KLQkJCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQotCQkJewotCi0JCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICs9IDg7Ci0JCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiArPSA4OwotCQkJfQotCQkJZmlsbE9mZnNldCA9IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbjsKLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zID0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uOwotCi0JCQlwV2lyZWxlc3NQYWNrZXQgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldF07Ci0KLQkJCS8vCi0JCQkvLyBDb3B5IFRYSU5GTyArIFRYV0kgKyBXTEFOIEhlYWRlciArIExMQyBpbnRvIERNQSBIZWFkZXIgQnVmZmVyCi0JCQkvLwotCQkJaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1TRFVfRlJBTUUpCi0JCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JCQllbHNlIGlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkKLQkJCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCwgNCkrTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQkJZWxzZQotCQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOwotCQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgcFR4QmxrLT5Qcml2LgotCQkJcFR4QmxrLT5Qcml2ID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbjsKLQotCQkJLy8JcFR4SW5mby0+VVNCRE1BcGt0TGVuIG5vdyBqdXN0IGEgdGVtcCB2YWx1ZSBhbmQgd2lsbCB0byBjb3JyZWN0IGxhdHRlci4KLQkJCVJUTVBXcml0ZVR4SW5mbyhwQWQsIHBUeEluZm8sIChVU0hPUlQpKHBUeEJsay0+UHJpdiksIEZBTFNFLCBGSUZPX0VEQ0EsIEZBTFNFIC8qTmV4dFZhbGlkKi8sICBGQUxTRSk7Ci0KLQkJCS8vIENvcHkgaXQuCi0JCQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+SGVhZGVyQnVmLCBwVHhCbGstPlByaXYpOwotCQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgKz0gcFR4QmxrLT5Qcml2OwotCQkJcFdpcmVsZXNzUGFja2V0ICs9IHBUeEJsay0+UHJpdjsKLQkJfQotCX0KLQllbHNlCi0JewkvLyBGb3Igc3ViLXNlcXVlbnQgZnJhbWVzIG9mIHRoaXMgYnVsay1vdXQgYmF0Y2guIEp1c3QgY29weSBpdCB0byBvdXIgYnVsay1vdXQgYnVmZmVyLgotCi0JCVN0YXR1cyA9ICgocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKSA/IE5ESVNfU1RBVFVTX1NVQ0NFU1MgOiBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlmaWxsT2Zmc2V0ID0gIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gKyBwVHhCbGstPlByaXYpOwotCQkJcFdpcmVsZXNzUGFja2V0ID0gJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdOwotCi0JCQkvL2h3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCQkJTmRpc01vdmVNZW1vcnkocFdpcmVsZXNzUGFja2V0LCBwVHhCbGstPkhlYWRlckJ1ZiwgcFR4QmxrLT5NcGR1SGVhZGVyTGVuKTsKLQkJCXBXaXJlbGVzc1BhY2tldCArPSAocFR4QmxrLT5NcGR1SGVhZGVyTGVuKTsKLQkJCXBUeEJsay0+UHJpdiArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47Ci0JCX0KLQkJZWxzZQotCQl7CS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQgbm93IHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gc2h1dGRvd24uCi0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJXcml0ZU11bHRpVHhSZXNvdXJjZSgpOmJDdXJXcml0aW5nIGlzIEZBTFNFIHdoZW4gaGFuZGxlIHN1Yi1zZXF1ZW50IGZyYW1lcy5cbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCX0KLQl9Ci0KLQotCS8vIFdlIHVubG9jayBpdCBoZXJlIHRvIHByZXZlbnQgdGhlIGZpcnN0IDggYnl0ZXMgbWF5YmUgb3Zlci13cml0ZSBpc3N1ZS4KLQkvLwkxLiBGaXJzdCB3ZSBnb3QgQ3VyV3JpdGVQb3NpdGlvbiBidXQgdGhlIGZpcnN0IDggYnl0ZXMgc3RpbGwgbm90IHdyaXRlIHRvIHRoZSBwVHhDb250ZXh0LgotCS8vCTIuIEFuIGludGVycnVwdCBicmVhayBvdXIgcm91dGluZSBhbmQgaGFuZGxlIGJ1bGstb3V0IGNvbXBsZXRlLgotCS8vCTMuIEluIHRoZSBidWxrLW91dCBjb21wbGxldGUsIGl0IG5lZWQgdG8gZG8gYW5vdGhlciBidWxrLW91dCwKLQkvLwkJCWlmIHRoZSBFTmV4dEJ1bGtPdXRQb3NpdGlvbiBpcyBqdXN0IHRoZSBzYW1lIGFzIEN1cldyaXRlUG9zaXRpb24sIGl0IHdpbGwgc2F2ZSB0aGUgZmlyc3QgOCBieXRlcyBmcm9tIEN1cldyaXRlUG9zaXRpb24sCi0JLy8JCQlidXQgdGhlIHBheWxvYWQgc3RpbGwgbm90IGNvcHllZC4gdGhlIHBUeENvbnRleHQtPlNhdmVkUGFkW10gd2lsbCBzYXZlIGFzIGFsbHplcm8uIGFuZCBzZXQgdGhlIGJDb3B5UGFkID0gVFJVRS4KLQkvLwk0LiBJbnRlcnJ1cHQgY29tcGxldGUuCi0JLy8gIDUuIE91ciBpbnRlcnJ1cHRlZCByb3V0aW5lIGdvIGJhY2sgYW5kIGZpbGwgdGhlIGZpcnN0IDggYnl0ZXMgdG8gcFR4Q29udGV4dC4KLQkvLwk2LiBOZXh0IHRpbWUgd2hlbiBkbyBidWxrLW91dCwgaXQgZm91bmQgdGhlIGJDb3B5UGFkPT1UUlVFIGFuZCB3aWxsIGNvcHkgdGhlIFNhdmVkUGFkW10gdG8gcFR4Q29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbi4KLQkvLwkJYW5kIHRoZSBwYWNrZXQgd2lsbCB3cm9uZy4KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW1F1ZUlkeF0sIElycUZsYWdzKTsKLQotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiV3JpdGVNdWx0aVR4UmVzb3VyY2U6IENXUG9zID0gJWxkLCBOQk91dFBvcyA9ICVsZC5cbiIsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvLyBDb3B5IHRoZSBmcmFtZSBjb250ZW50IGludG8gRE1BIGJ1ZmZlciBhbmQgdXBkYXRlIHRoZSBwVHhCbGstPlByaXYKLQlOZGlzTW92ZU1lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBUeEJsay0+cFNyY0J1ZkRhdGEsIHBUeEJsay0+U3JjQnVmTGVuKTsKLQlwV2lyZWxlc3NQYWNrZXQgKz0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4QmxrLT5Qcml2ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCi1kb25lOgotCS8vIFJlbGVhc2UgdGhlIHNrYiBidWZmZXIgaGVyZQotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwVHhCbGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuKFN0YXR1cyk7Ci0KLX0KLQotCi1WT0lEIFJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAotCUlOCVVTSE9SVAkJCVR4SWR4KQotewotCVVDSEFSCQkJUXVlSWR4OwotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKLQlVSU5UMzIJCQlmaWxsT2Zmc2V0OwotCVRYSU5GT19TVFJVQwkqcFR4SW5mbzsKLQlUWFdJX1NUUlVDCQkqcFR4V0k7Ci0JVUlOVDMyCQkJVVNCRE1BcGt0TGVuLCBwYWRkaW5nOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JUFVDSEFSCQkJcFdpcmVsZXNzUGFja2V0OwotCi0JUXVlSWR4ID0gcFR4QmxrLT5RdWVJZHg7Ci0JcEhUVFhDb250ZXh0ICA9ICZwQWQtPlR4Q29udGV4dFtRdWVJZHhdOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbUXVlSWR4XSwgSXJxRmxhZ3MpOwotCi0JaWYgKHBIVFRYQ29udGV4dC0+YkN1cldyaXRpbmcgPT0gVFJVRSkKLQl7Ci0JCWZpbGxPZmZzZXQgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0JCWlmICgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSB8fCAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24tOCkgPT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJCSYmIChwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9PSBUUlVFKSkKLQkJCXBXaXJlbGVzc1BhY2tldCA9IChQVUNIQVIpKCZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdKTsKLQkJZWxzZQotCQkJcFdpcmVsZXNzUGFja2V0ID0gKFBVQ0hBUikoJnBIVFRYQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W2ZpbGxPZmZzZXRdKTsKLQotCQkvLwotCQkvLyBVcGRhdGUgVHhJbmZvLT5VU0JETUFwa3RMZW4gLAotCQkvLwkJdGhlIGxlbmd0aCA9IFRYV0lfU0laRSArIDgwMi4xMV9oZHIgKyA4MDIuMTFfaGRyX3BhZCArIHBheWxvYWRfb2ZfYWxsX2JhdGNoX2ZyYW1lcyArIEJ1bGstT3V0LXBhZGRpbmcKLQkJLy8KLQkJcFR4SW5mbyA9IChQVFhJTkZPX1NUUlVDKShwV2lyZWxlc3NQYWNrZXQpOwotCi0JCS8vIENhbGN1bGF0ZSB0aGUgYnVsay1vdXQgcGFkZGluZwotCQlVU0JETUFwa3RMZW4gPSBwVHhCbGstPlByaXYgLSBUWElORk9fU0laRTsKLQkJcGFkZGluZyA9ICg0IC0gKFVTQkRNQXBrdExlbiAlIDQpKSAmIDB4MDM7CS8vIHJvdW5kIHVwIHRvIDQgYnl0ZSBhbGlnbm1lbnQKLQkJVVNCRE1BcGt0TGVuICs9IHBhZGRpbmc7Ci0KLQkJcFR4SW5mby0+VVNCRE1BVHhQa3RMZW4gPSBVU0JETUFwa3RMZW47Ci0KLQkJLy8KLQkJLy8gVXBkYXRlIFRYV0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAsCi0JCS8vCQl0aGUgbGVuZ3RoID0gODAyLjExIGhlYWRlciArIHBheWxvYWRfb2ZfYWxsX2JhdGNoX2ZyYW1lcwotCQlwVHhXST0gKFBUWFdJX1NUUlVDKShwV2lyZWxlc3NQYWNrZXQgKyBUWElORk9fU0laRSk7Ci0JCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSB0b3RhbE1QRFVTaXplOwotCi0JCS8vCi0JCS8vIFVwZGF0ZSB0aGUgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uCi0JCS8vCi0JCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArPSAoVFhJTkZPX1NJWkUgKyBVU0JETUFwa3RMZW4pOwotCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIDM5MDYpPiBNQVhfVFhCVUxLX0xJTUlUKQotCQl7CS8vIEFkZCAzOTA2IGZvciBwcmV2ZW50IHRoZSBOZXh0QnVsa091dCBwYWNrZXQgc2l6ZSBpcyBhIEEtUkFMSU5LL0EtTVNEVSBGcmFtZS4KLQkJCXBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9IDg7Ci0JCQlwVHhJbmZvLT5Td1VzZUxhc3RSb3VuZCA9IDE7Ci0JCX0KLQkJcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MgPSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb247Ci0KLQotCQkvLwotCQkvLwlaZXJvIHRoZSBsYXN0IHBhZGRpbmcuCi0JCS8vCi0JCXBXaXJlbGVzc1BhY2tldCA9ICgmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbZmlsbE9mZnNldCArIHBUeEJsay0+UHJpdl0pOwotCQlOZGlzWmVyb01lbW9yeShwV2lyZWxlc3NQYWNrZXQsIHBhZGRpbmcgKyA4KTsKLQotCQkvLyBGaW5hbGx5LCBzZXQgYkN1cldyaXRpbmcgYXMgRkFMU0UKLQkJcEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9IEZBTFNFOwotCi0JfQotCWVsc2UKLQl7CS8vIEl0IHNob3VsZCBub3QgaGFwcGVuZWQgbm93IHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gc2h1dGRvd24uCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZpbmFsV3JpdGVUeFJlc291cmNlKCk6YkN1cldyaXRpbmcgaXMgRkFMU0Ugd2hlbiBoYW5kbGUgbGFzdCBmcmFtZXMuXG4iKSk7Ci0JfQotCi0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tRdWVJZHhdLCBJcnFGbGFncyk7Ci0KLX0KLQotCi1WT0lEIFJ0bXBVU0JEYXRhTGFzdFR4SWR4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVTSE9SVAkJCVR4SWR4KQotewotCS8vIERPIG5vdGhpbmcgZm9yIFVTQi4KLX0KLQotCi0vKgotCVdoZW4gY2FuIGRvIGJ1bGstb3V0OgotCQkxLiBUeFN3RnJlZUlkeCA8IFRYX1JJTkdfU0laRTsKLQkJCUl0IG1lYW5zIGhhcyBhdCBsZWFzdCBvbmUgUmluZyBlbnRpdHkgaXMgcmVhZHkgZm9yIGJ1bGstb3V0LCBraWNrIGl0IG91dC4KLQkJMi4gSWYgVHhTd0ZyZWVJZHggPT0gVFhfUklOR19TSVpFCi0JCQlDaGVjayBpZiB0aGUgQ3VyV3JpdGluZyBmbGFnIGlzIEZBTFNFLCBpZiBpdCdzIEZBTFNFLCB3ZSBjYW4gZG8ga2ljayBvdXQuCi0KLSovCi1WT0lEIFJ0bXBVU0JEYXRhS2lja091dCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJUXVlSWR4KQotewotCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IFF1ZUlkeCkpOwotCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQotfQotCi0KLS8qCi0JTXVzdCBiZSBydW4gaW4gSW50ZXJydXB0IGNvbnRleHQKLQlUaGlzIGZ1bmN0aW9uIGhhbmRsZSBSVDI4NzAgc3BlY2lmaWMgVHhEZXNjIGFuZCBjcHUgaW5kZXggdXBkYXRlIGFuZCBraWNrIHRoZSBwYWNrZXQgb3V0LgotICovCi1pbnQgUnRtcFVTQk1nbXRLaWNrT3V0KAotCUlOIFJUTVBfQURBUFRFUiAJKnBBZCwKLQlJTiBVQ0hBUiAJCQlRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKLQlJTiBVSU5UIAkJCVNyY0J1ZkxlbikKLXsKLQlQVFhJTkZPX1NUUlVDCXBUeEluZm87Ci0JVUxPTkcJCQlCdWxrT3V0U2l6ZTsKLQlVQ0hBUgkJCXBhZExlbjsKLQlQVUNIQVIJCQlwRGVzdDsKLQlVTE9ORwkJCVN3SWR4ID0gcEFkLT5NZ210UmluZy5UeENwdUlkeDsKLQlQVFhfQ09OVEVYVAkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCi0KLQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpKHBTcmNCdWZWQSk7Ci0KLQkvLyBCdWlsZCBvdXIgVVJCIGZvciBVU0JECi0JQnVsa091dFNpemUgPSBTcmNCdWZMZW47Ci0JQnVsa091dFNpemUgPSAoQnVsa091dFNpemUgKyAzKSAmICh+Myk7Ci0JUlRNUFdyaXRlVHhJbmZvKHBBZCwgcFR4SW5mbywgKFVTSE9SVCkoQnVsa091dFNpemUgLSBUWElORk9fU0laRSksIFRSVUUsIEVwVG9RdWV1ZVtNR01UUElQRUlEWF0sIEZBTFNFLCAgRkFMU0UpOwotCi0JQnVsa091dFNpemUgKz0gNDsgLy8gQWx3YXlzIGFkZCA0IGV4dHJhIGJ5dGVzIGF0IGV2ZXJ5IHBhY2tldC4KLQotCS8vIElmIEJ1bGtPdXRTaXplIGlzIG11bHRpcGxlIG9mIEJ1bGtPdXRNYXhQYWNrZXRTaXplLCBhZGQgZXh0cmEgNCBieXRlcyBhZ2Fpbi4KLQlpZiAoKEJ1bGtPdXRTaXplICUgcEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSkgPT0gMCkKLQkJQnVsa091dFNpemUgKz0gNDsKLQotCXBhZExlbiA9IEJ1bGtPdXRTaXplIC0gU3JjQnVmTGVuOwotCUFTU0VSVCgocGFkTGVuIDw9IFJUTVBfUEtUX1RBSUxfUEFERElORykpOwotCi0JLy8gTm93IG1lbXplcm8gYWxsIGV4dHJhIHBhZGRpbmcgYnl0ZXMuCi0JcERlc3QgPSAoUFVDSEFSKShwU3JjQnVmVkEgKyBTcmNCdWZMZW4pOwotCXNrYl9wdXQoR0VUX09TX1BLVF9UWVBFKHBQYWNrZXQpLCBwYWRMZW4pOwotCU5kaXNaZXJvTWVtb3J5KHBEZXN0LCBwYWRMZW4pOwotCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5NTE1FQnVsa091dExvY2ssIElycUZsYWdzKTsKLQotCXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4XS5wTmRpc1BhY2tldCA9IHBQYWNrZXQ7Ci0JcE1MTUVDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciA9IChQVFhfQlVGRkVSKShHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCkpOwotCi0JLy8gTGVuZ3RoIGluIFR4SW5mbyBzaG91bGQgYmUgOCBsZXNzIHRoYW4gYnVsa291dCBzaXplLgotCXBNTE1FQ29udGV4dC0+QnVsa091dFNpemUgPSBCdWxrT3V0U2l6ZTsKLQlwTUxNRUNvbnRleHQtPkluVXNlID0gVFJVRTsKLQlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IFRSVUU7Ci0KLQotCS8vZm9yIGRlYnVnCi0JLy9oZXhfZHVtcCgiUnRtcFVTQk1nbXRLaWNrT3V0IiwgJnBNTE1FQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdLCAocE1MTUVDb250ZXh0LT5CdWxrT3V0U2l6ZSA+IDE2ID8gMTYgOiBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplKSk7Ci0KLQkvL3BBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQkvL3BBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCS8vaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPT0gTUdNVF9SSU5HX1NJWkUpCi0JLy8JbmVlZEtpY2tPdXQgPSBUUlVFOwotCi0JLy8gRGVjcmVhc2UgdGhlIFR4U3dGcmVlSWR4IGFuZCBJbmNyZWFzZSB0aGUgVFhfQ1RYX0lEWAotCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgtLTsKLQlJTkNfUklOR19JTkRFWChwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4LCBNR01UX1JJTkdfU0laRSk7Ci0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+TUxNRUJ1bGtPdXRMb2NrLCBJcnFGbGFncyk7Ci0KLQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpOwotCS8vaWYgKG5lZWRLaWNrT3V0KQotCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQotCXJldHVybiAwOwotfQotCi0KLVZPSUQgUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVUNIQVIJCVF1ZUlkeCwKLQlJTiBVQ0hBUgkJKnBOdWxsRnJhbWUsCi0JSU4gVUlOVDMyCQlmcmFtZUxlbikKLXsKLQlpZiAocEFkLT5OdWxsQ29udGV4dC5JblVzZSA9PSBGQUxTRSkKLQl7Ci0JCVBUWF9DT05URVhUCQlwTnVsbENvbnRleHQ7Ci0JCVBUWElORk9fU1RSVUMJcFR4SW5mbzsKLQkJUFRYV0lfU1RSVUMJCXBUeFdJOwotCQlQVUNIQVIJCQlwV2lyZWxlc3NQa3Q7Ci0KLQkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKLQotCQkvLyBTZXQgdGhlIGluIHVzZSBiaXQKLQkJcE51bGxDb250ZXh0LT5JblVzZSA9IFRSVUU7Ci0JCXBXaXJlbGVzc1BrdCA9IChQVUNIQVIpJnBOdWxsQ29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0WzBdOwotCi0JCVJUTVBaZXJvTWVtb3J5KCZwV2lyZWxlc3NQa3RbMF0sIDEwMCk7Ci0JCXBUeEluZm8gPSAoUFRYSU5GT19TVFJVQykmcFdpcmVsZXNzUGt0WzBdOwotCQlSVE1QV3JpdGVUeEluZm8ocEFkLCBwVHhJbmZvLCAoVVNIT1JUKShzaXplb2YoSEVBREVSXzgwMl8xMSkrVFhXSV9TSVpFKSwgVFJVRSwgRXBUb1F1ZXVlW01HTVRQSVBFSURYXSwgRkFMU0UsICBGQUxTRSk7Ci0JCXBUeEluZm8tPlFTRUwgPSBGSUZPX0VEQ0E7Ci0JCXBUeFdJID0gKFBUWFdJX1NUUlVDKSZwV2lyZWxlc3NQa3RbVFhJTkZPX1NJWkVdOwotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UsIDAsIEJTU0lEX1dDSUQsIChzaXplb2YoSEVBREVSXzgwMl8xMSkpLAotCQkJMCwgMCwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19IVFRYT1AsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLQkJUlRNUE1vdmVNZW1vcnkoJnBXaXJlbGVzc1BrdFtUWFdJX1NJWkUrVFhJTkZPX1NJWkVdLCAmcEFkLT5OdWxsRnJhbWUsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JCXBBZC0+TnVsbENvbnRleHQuQnVsa091dFNpemUgPSAgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBzaXplb2YocEFkLT5OdWxsRnJhbWUpICsgNDsKLQotCQkvLyBGaWxsIG91dCBmcmFtZSBsZW5ndGggaW5mb3JtYXRpb24gZm9yIGdsb2JhbCBCdWxrIG91dCBhcmJpdG9yCi0JCS8vcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRyYW5zZmVyQnVmZmVyTGVuZ3RoOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gc2VuZCBOVUxMIEZyYW1lIEAlZCBNYnBzLi4uXG4iLCBSYXRlSWRUb01icHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXSkpOwotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTlVMTCk7Ci0KLQkJLy8gS2ljayBidWxrIG91dAotCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDaGVjayBSeCBkZXNjcmlwdG9yLCByZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRSBpZiBhbnkgZXJyb3IgZG91bmQKLQotCUFyZ3VtZW50czoKLQkJcFJ4RAkJUG9pbnRlcgl0byB0aGUgUnggZGVzY3JpcHRvcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTCQlObyBlcnIKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQkJRXJyb3IKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlSVE1QQ2hlY2tSeEVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBIRUFERVJfODAyXzExCXBIZWFkZXIsCi0JSU4JUFJYV0lfU1RSVUMJcFJ4V0ksCi0JSU4JUFJUMjhYWF9SWERfU1RSVUMJcFJ4SU5GTykKLXsKLQlQQ0lQSEVSX0tFWSBwV3BhS2V5OwotCUlOVAlkQm07Ci0KLQlpZiAocEFkLT5iUHJvbWlzY3VvdXMgPT0gVFJVRSkKLQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCWlmKHBSeElORk8gPT0gTlVMTCkKLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JLy8gUGh5IGVycm9ycyAmIENSQyBlcnJvcnMKLQlpZiAocFJ4SU5GTy0+Q3JjKQotCXsKLQkJLy8gQ2hlY2sgUlNTSSBmb3IgTm9pc2UgSGlzdCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KLQkJZEJtID0gKElOVCkgKHBSeFdJLT5SU1NJMCkgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotCQlpZiAoZEJtIDw9IC04NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMF0gKz0gMTsKLQkJZWxzZSBpZiAoZEJtIDw9IC04MikKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMV0gKz0gMTsKLQkJZWxzZSBpZiAoZEJtIDw9IC03NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbMl0gKz0gMTsKLQkJZWxzZSBpZiAoZEJtIDw9IC03MikKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbM10gKz0gMTsKLQkJZWxzZSBpZiAoZEJtIDw9IC02NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNF0gKz0gMTsKLQkJZWxzZSBpZiAoZEJtIDw9IC02MikKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNV0gKz0gMTsKLQkJZWxzZSBpZiAoZEJtIDw9IC01NykKLQkJCXBBZC0+U3RhQ2ZnLlJQSURlbnNpdHlbNl0gKz0gMTsKLQkJZWxzZSBpZiAoZEJtID4gLTU3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs3XSArPSAxOwotCi0JCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLQkvLyBBZGQgUnggc2l6ZSB0byBjaGFubmVsIGxvYWQgY291bnRlciwgd2Ugc2hvdWxkIGlnbm9yZSBlcnJvciBjb3VudHMKLQlwQWQtPlN0YUNmZy5DTEJ1c3lCeXRlcyArPSAocFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCsgMTQpOwotCi0JLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKLQlpZiAocEhlYWRlci0+RkMuVG9EcykKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJFcnI7RkMuVG9Ec1xuIikpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQkvLyBQYXVsIDA0LTAzIGZvciBPRkRNIFJ4IGxlbmd0aCBpc3N1ZQotCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID4gTUFYX0FHR1JFR0FUSU9OX1NJWkUpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgicmVjZWl2ZWQgcGFja2V0IHRvbyBsb25nXG4iKSk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQotCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KLQkvLyBpZiAocFJ4RC0+VTJNID09IDApCi0JLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQotCWlmIChwUnhJTkZPLT5EZWNyeXB0ZWQgJiYgcFJ4SU5GTy0+Q2lwaGVyRXJyKQotCXsKLQotCQkvLwotCQkvLyBNSUMgRXJyb3IKLQkJLy8KLQkJaWYgKChwUnhJTkZPLT5DaXBoZXJFcnIgPT0gMikgJiYgcFJ4SU5GTy0+TXlCc3MpCi0JCXsKLQkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKLQkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yXG4iKSk7Ci0JCX0KLQotCQlpZiAocFJ4SU5GTy0+RGVjcnlwdGVkICYmCi0JCQkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XS5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykgJiYKLQkJCShwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpCi0JCXsKLQkJCS8vCi0JCQkvLyBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uCi0JCQkvLwotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0KLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCXJldHVybihORElTX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotVk9JRCBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KQotewotICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0KLQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7Ci0KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLX0KLQotVk9JRCBSVDI4eHhVc2JTdGFBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLQlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOwotCi0JLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgotCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0JCVRidHROdW1Ub05leHRXYWtlVXAgPSAxOwotCi0JQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7Ci0JQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKLQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLkF1dG9MZWFkVGltZSA9IDU7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsgICAvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIFRpbWVvdXQgNDB1cy4KLQotCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQotfQotCi1WT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlQyOHh4VXNiTWxtZVJhZGlvT24oKVxuIikpOwotCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJcmV0dXJuOwotCi0gICAgCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgMHhmZiwgMHgwMCwgMHgwMik7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMDApOwotCi0JTklDUmVzZXRGcm9tRXJyb3IocEFkKTsKLQotCS8vIEVuYWJsZSBUeC9SeAotCVJUTVBFbmFibGVSeFR4KHBBZCk7Ci0KLSNpZmRlZiBSVDMwNzAKLQlpZiAoSVNfUlQzMDcxKHBBZCkpCi0JewotCQlSVDMweHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cChwQWQpOwotCX0KLSNlbmRpZiAvLyBSVDMwNzAgLy8KLQotCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JUlRVU0JCdWxrUmVjZWl2ZShwQWQpOwotCi0JLy8gU2V0IExFRAotCVJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOwotfQotCi1WT0lEIFJUMjh4eFVzYk1sbWVSYWRpb09GRigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLQlVSU5UMzIJVmFsdWUsIGk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUMjh4eFVzYk1sbWVSYWRpb09GRigpXG4iKSk7Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCXJldHVybjsKLQotCS8vIFNldCBMRUQKLQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7Ci0JLy8gU2V0IFJhZGlvIG9mZiBmbGFnCi0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKTsKLQotCXsKLQkJLy8gTGluayBkb3duIGZpcnN0IGlmIGFueSBhc3NvY2lhdGlvbiBleGlzdHMKLQkJaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKLQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQlSVE1QdXNlY0RlbGF5KDEwMDAwKTsKLQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlCi0JCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQl9Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKLQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJQXNpY1R1cm5PZmZSRkNsayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCX0KLQotCS8vIERpc2FibGUgVHgvUnggRE1BCi0JUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkgICAvLyBkaXNhYmxlIERNQQotCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVJ4RE1BID0gMDsKLQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7CSAgIC8vIGFib3J0IGFsbCBUWCByaW5ncwotCi0JLy8gV2FpdGluZyBmb3IgRE1BIGlkbGUKLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgJiYgKEdsb0NmZy5maWVsZC5SeERNQUJ1c3kgPT0gMCkpCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCX13aGlsZSAoaSsrIDwgMTAwKTsKLQotCS8vIERpc2FibGUgTUFDIFR4L1J4Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCAweGZmLCAweGZmLCAweDAyKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fZGF0YV91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ2NzVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX2RhdGFfdXNiLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX2RhdGFfdXNiLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fbWFjX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX21hY191c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjZhZjRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX21hY191c2IuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jbW1fbWFjX3VzYi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY21tX3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNmU0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV9wcm9maWxlLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vY21tX3Byb2ZpbGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fdGtpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2M3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fdGtpcC5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NtbV90a2lwLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jbW1fd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2ODEwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NtbV93ZXAuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jbW1fd2VwLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9obWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9obWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkODRlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NyeXB0X2htYWMuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jcnlwdF9obWFjLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NyeXB0X21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1N2EyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9jcnlwdF9tZDUuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9jcnlwdF9tZDUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NyeXB0X3NoYTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2NyeXB0X3NoYTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2ZmYjMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vY3J5cHRfc2hhMi5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2NyeXB0X3NoYTIuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL2VlX2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9lZV9lZnVzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzRlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9lZV9lZnVzZS5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL2VlX2VmdXNlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydF9jaGFubmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydF9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjZWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0X2NoYW5uZWwuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9ydF9jaGFubmVsLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydF9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODFjZmYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRfcmYuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vcnQyODYwL2NvbW1vbi9ydF9yZi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF9tY3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfbWN1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiN2YxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfbWN1LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3J0Mjg2MC9jb21tb24vcnRtcF9tY3UuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGltZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0bXBfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRhZWRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnRtcF90aW1lci5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi9ydDI4NjAvY29tbW9uL3J0bXBfdGltZXIuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2J1bGsuYwppbmRleCBhNDI0NGI1Li4zNzk3ODBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9idWxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfYnVsay5jCkBAIC0xLDQgKzEsNCBAQAotIC8qCisvKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJhbGluayBUZWNoIEluYy4KICAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKQEAgLTM3LDEzMyArMzcsMTI0IEBACiAKICovCiAKKyNpZmRlZiBSVE1QX01BQ19VU0IKKwogI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotLy8gTWF0Y2ggdG90YWwgNiBidWxrb3V0IGVuZHBvaW50IHRvIGNvcnJlc3BvbmRpbmcgcXVldWUuCi1VQ0hBUglFcFRvUXVldWVbNl09e0ZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX01HTVR9OworLyogTWF0Y2ggdG90YWwgNiBidWxrb3V0IGVuZHBvaW50IHRvIGNvcnJlc3BvbmRpbmcgcXVldWUuICovCit1OCBFcFRvUXVldWVbNl0gPQorICAgIHsgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fRURDQSwgRklGT19FRENBLCBGSUZPX0VEQ0EsIEZJRk9fTUdNVCB9OwogCi0vL3N0YXRpYyBCT09MRUFOIFNpbmdsZUJ1bGtPdXQgPSBGQUxTRTsKKy8qc3RhdGljIEJPT0xFQU4gU2luZ2xlQnVsa091dCA9IEZBTFNFOyAqLwogCi12b2lkIFJUVVNCX0ZJTExfQlVMS19VUkIgKHN0cnVjdCB1cmIgKnBVcmIsCi0Jc3RydWN0IHVzYl9kZXZpY2UgKnBVc2JfRGV2LAotCXVuc2lnbmVkIGludCBidWxrcGlwZSwKLQl2b2lkICpwVHJhbnNmZXJCdWYsCi0JaW50IEJ1ZlNpemUsCi0JdXNiX2NvbXBsZXRlX3QgQ29tcGxldGUsCi0Jdm9pZCAqcENvbnRleHQpCit2b2lkIFJUVVNCX0ZJTExfQlVMS19VUkIoc3RydWN0IHVyYiAqcFVyYiwKKwkJCSBzdHJ1Y3QgdXNiX2RldmljZSAqcFVzYl9EZXYsCisJCQkgdW5zaWduZWQgaW50IGJ1bGtwaXBlLAorCQkJIHZvaWQgKnBUcmFuc2ZlckJ1ZiwKKwkJCSBpbnQgQnVmU2l6ZSwgdXNiX2NvbXBsZXRlX3QgQ29tcGxldGUsIHZvaWQgKnBDb250ZXh0KQogewogCi0JdXNiX2ZpbGxfYnVsa191cmIocFVyYiwgcFVzYl9EZXYsIGJ1bGtwaXBlLCBwVHJhbnNmZXJCdWYsIEJ1ZlNpemUsICh1c2JfY29tcGxldGVfdClDb21wbGV0ZSwgcENvbnRleHQpOworCXVzYl9maWxsX2J1bGtfdXJiKHBVcmIsIHBVc2JfRGV2LCBidWxrcGlwZSwgcFRyYW5zZmVyQnVmLCBCdWZTaXplLAorCQkJICAodXNiX2NvbXBsZXRlX3QpIENvbXBsZXRlLCBwQ29udGV4dCk7CiAKIH0KIAotVk9JRAlSVFVTQkluaXRUeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYX0NPTlRFWFQJCXBUeENvbnRleHQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCXVzYl9jb21wbGV0ZV90CUZ1bmMpCit2b2lkIFJUVVNCSW5pdFR4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBUeENvbnRleHQsCisJCSAgICAgdTggQnVsa091dFBpcGVJZCwgSU4gdXNiX2NvbXBsZXRlX3QgRnVuYykKIHsKLQlQVVJCCQkJCXBVcmI7Ci0JUFVDSEFSCQkJCXBTcmMgPSBOVUxMOwotCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCVBVUkIgcFVyYjsKKwl1OCAqcFNyYyA9IE5VTEw7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iaiA9IChzdHJ1Y3Qgb3NfY29va2llICopcEFkLT5PU19Db29raWU7CiAKIAlwVXJiID0gcFR4Q29udGV4dC0+cFVyYjsKIAlBU1NFUlQocFVyYik7CiAKLQkvLyBTdG9yZSBCdWxrT3V0IFBpcGVJZAorCS8qIFN0b3JlIEJ1bGtPdXQgUGlwZUlkICovCiAJcFR4Q29udGV4dC0+QnVsa091dFBpcGVJZCA9IEJ1bGtPdXRQaXBlSWQ7CiAKLQlpZiAocFR4Q29udGV4dC0+YkFnZ3JlZ2F0aWJsZSkKLQl7CisJaWYgKHBUeENvbnRleHQtPmJBZ2dyZWdhdGlibGUpIHsKIAkJcFNyYyA9ICZwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+QWdncmVnYXRpb25bMl07Ci0JfQotCWVsc2UKLQl7Ci0JCXBTcmMgPSAoUFVDSEFSKSBwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXQ7CisJfSBlbHNlIHsKKwkJcFNyYyA9CisJCSAgICAodTggKilwVHhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXQ7CiAJfQogCi0KLQkvL0luaXRpYWxpemUgYSB0eCBidWxrIHVyYgorCS8qSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiICovCiAJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAotCQkJCQkJcE9iai0+cFVzYl9EZXYsCi0JCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCi0JCQkJCQlwU3JjLAotCQkJCQkJcFR4Q29udGV4dC0+QnVsa091dFNpemUsCi0JCQkJCQlGdW5jLAotCQkJCQkJcFR4Q29udGV4dCk7CisJCQkgICAgcE9iai0+cFVzYl9EZXYsCisJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LAorCQkJCQkgICAgcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRQaXBlSWRdKSwKKwkJCSAgICBwU3JjLCBwVHhDb250ZXh0LT5CdWxrT3V0U2l6ZSwgRnVuYywgcFR4Q29udGV4dCk7CiAKIAlpZiAocFR4Q29udGV4dC0+YkFnZ3JlZ2F0aWJsZSkKLQkJcFVyYi0+dHJhbnNmZXJfZG1hCT0gKHBUeENvbnRleHQtPmRhdGFfZG1hICsgVFhfQlVGRkVSX05PUk1TSVpFICsgMik7CisJCXBVcmItPnRyYW5zZmVyX2RtYSA9CisJCSAgICAocFR4Q29udGV4dC0+ZGF0YV9kbWEgKyBUWF9CVUZGRVJfTk9STVNJWkUgKyAyKTsKIAllbHNlCi0JCXBVcmItPnRyYW5zZmVyX2RtYQk9IHBUeENvbnRleHQtPmRhdGFfZG1hOworCQlwVXJiLT50cmFuc2Zlcl9kbWEgPSBwVHhDb250ZXh0LT5kYXRhX2RtYTsKIAogCXBVcmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCiB9CiAKLVZPSUQJUlRVU0JJbml0SFRUeERlc2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dCwKLQlJTglVQ0hBUgkJCUJ1bGtPdXRQaXBlSWQsCi0JSU4JVUxPTkcJCQlCdWxrT3V0U2l6ZSwKLQlJTgl1c2JfY29tcGxldGVfdAlGdW5jKQordm9pZCBSVFVTQkluaXRIVFR4RGVzYyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgICBzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcFR4Q29udGV4dCwKKwkJICAgICAgIHU4IEJ1bGtPdXRQaXBlSWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIEJ1bGtPdXRTaXplLCBJTiB1c2JfY29tcGxldGVfdCBGdW5jKQogewotCVBVUkIJCQkJcFVyYjsKLQlQVUNIQVIJCQkJcFNyYyA9IE5VTEw7Ci0JUE9TX0NPT0tJRQkJCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJUFVSQiBwVXJiOworCXU4ICpwU3JjID0gTlVMTDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAogCXBVcmIgPSBwVHhDb250ZXh0LT5wVXJiOwogCUFTU0VSVChwVXJiKTsKIAotCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCisJLyogU3RvcmUgQnVsa091dCBQaXBlSWQgKi8KIAlwVHhDb250ZXh0LT5CdWxrT3V0UGlwZUlkID0gQnVsa091dFBpcGVJZDsKIAotCXBTcmMgPSAmcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W3BUeENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb25dOworCXBTcmMgPQorCSAgICAmcFR4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXItPmZpZWxkLldpcmVsZXNzUGFja2V0W3BUeENvbnRleHQtPgorCQkJCQkJCSAgICAgIE5leHRCdWxrT3V0UG9zaXRpb25dOwogCi0KLQkvL0luaXRpYWxpemUgYSB0eCBidWxrIHVyYgorCS8qSW5pdGlhbGl6ZSBhIHR4IGJ1bGsgdXJiICovCiAJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAotCQkJCQkJcE9iai0+cFVzYl9EZXYsCi0JCQkJCQl1c2Jfc25kYnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa091dEVwQWRkcltCdWxrT3V0UGlwZUlkXSksCi0JCQkJCQlwU3JjLAotCQkJCQkJQnVsa091dFNpemUsCi0JCQkJCQlGdW5jLAotCQkJCQkJcFR4Q29udGV4dCk7CisJCQkgICAgcE9iai0+cFVzYl9EZXYsCisJCQkgICAgdXNiX3NuZGJ1bGtwaXBlKHBPYmotPnBVc2JfRGV2LAorCQkJCQkgICAgcEFkLT5CdWxrT3V0RXBBZGRyW0J1bGtPdXRQaXBlSWRdKSwKKwkJCSAgICBwU3JjLCBCdWxrT3V0U2l6ZSwgRnVuYywgcFR4Q29udGV4dCk7CiAKLQlwVXJiLT50cmFuc2Zlcl9kbWEJPSAocFR4Q29udGV4dC0+ZGF0YV9kbWEgKyBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKTsKKwlwVXJiLT50cmFuc2Zlcl9kbWEgPQorCSAgICAocFR4Q29udGV4dC0+ZGF0YV9kbWEgKyBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKTsKIAlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAogfQogCi1WT0lECVJUVVNCSW5pdFJ4RGVzYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dCkKK3ZvaWQgUlRVU0JJbml0UnhEZXNjKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwgc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQpCiB7Ci0JUFVSQgkJCQlwVXJiOwotCVBPU19DT09LSUUJCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCVVMT05HCQkJCVJYX2J1bGtfc2l6ZTsKLQorCVBVUkIgcFVyYjsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKwl1bnNpZ25lZCBsb25nIFJYX2J1bGtfc2l6ZTsKIAogCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOwogCUFTU0VSVChwVXJiKTsKIAotCWlmICggcEFkLT5CdWxrSW5NYXhQYWNrZXRTaXplID09IDY0KQorCWlmIChwQWQtPkJ1bGtJbk1heFBhY2tldFNpemUgPT0gNjQpCiAJCVJYX2J1bGtfc2l6ZSA9IDQwOTY7CiAJZWxzZQogCQlSWF9idWxrX3NpemUgPSBNQVhfUlhCVUxLX1NJWkU7CiAKLQkvL0luaXRpYWxpemUgYSByeCBidWxrIHVyYgorCS8qSW5pdGlhbGl6ZSBhIHJ4IGJ1bGsgdXJiICovCiAJUlRVU0JfRklMTF9CVUxLX1VSQihwVXJiLAotCQkJCQkJcE9iai0+cFVzYl9EZXYsCi0JCQkJCQl1c2JfcmN2YnVsa3BpcGUocE9iai0+cFVzYl9EZXYsIHBBZC0+QnVsa0luRXBBZGRyKSwKLQkJCQkJCSYocFJ4Q29udGV4dC0+VHJhbnNmZXJCdWZmZXJbcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbl0pLAotCQkJCQkJUlhfYnVsa19zaXplIC0gKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24pLAotCQkJCQkJKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa1J4Q29tcGxldGUsCi0JCQkJCQkodm9pZCAqKXBSeENvbnRleHQpOworCQkJICAgIHBPYmotPnBVc2JfRGV2LAorCQkJICAgIHVzYl9yY3ZidWxrcGlwZShwT2JqLT5wVXNiX0RldiwgcEFkLT5CdWxrSW5FcEFkZHIpLAorCQkJICAgICYocFJ4Q29udGV4dC0+CisJCQkgICAgICBUcmFuc2ZlckJ1ZmZlcltwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uXSksCisJCQkgICAgUlhfYnVsa19zaXplIC0gKHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24pLAorCQkJICAgICh1c2JfY29tcGxldGVfdCkgUlRVU0JCdWxrUnhDb21wbGV0ZSwKKwkJCSAgICAodm9pZCAqKXBSeENvbnRleHQpOwogCi0JcFVyYi0+dHJhbnNmZXJfZG1hCT0gcFJ4Q29udGV4dC0+ZGF0YV9kbWEgKyBwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uOworCXBVcmItPnRyYW5zZmVyX2RtYSA9IHBSeENvbnRleHQtPmRhdGFfZG1hICsgcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbjsKIAlwVXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAotCiB9CiAKIC8qCkBAIC0xODgsMTc3ICsxNzksMjE1IEBACiAJCWlmKDEgLyohKGluX2ludGVycnVwdCgpICYgMHhmZmZmMDAwMCkqLykJXAogCQkJUlRNUF9JUlFfVU5MT0NLKChwTG9jayksIElycUZsYWdzKTsKIAotCi1WT0lECVJUVVNCQnVsa091dERhdGFQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlCdWxrT3V0UGlwZUlkLAotCUlOCVVDSEFSCQkJSW5kZXgpCit2b2lkIFJUVVNCQnVsa091dERhdGFQYWNrZXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICAgIHU4IEJ1bGtPdXRQaXBlSWQsIHU4IEluZGV4KQogewogCi0JUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0OwotCVBVUkIJCQlwVXJiOwotCWludAkJCQlyZXQgPSAwOwotCVBUWElORk9fU1RSVUMJcFR4SW5mbywgcExhc3RUeEluZm8gPSBOVUxMOwotCVBUWFdJX1NUUlVDICAgICAgICAgICAgIHBUeFdJOwotCVVMT05HCQkJVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwLCBJcnFGbGFnczIgPSAwOwotCVBVQ0hBUgkJCXBXaXJlbGVzc1BrdCwgcEFwcGVuZGFudDsKLQlCT09MRUFOCQkJYlR4UUxhc3RSb3VuZCA9IEZBTFNFOwotCVVDSEFSCQkJYWxsemVyb1s0XT0gezB4MCwweDAsMHgwLDB4MH07CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKwlQVVJCIHBVcmI7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbywgKnBMYXN0VHhJbmZvID0gTlVMTDsKKwlzdHJ1Y3QgcnRfdHh3aSAqIHBUeFdJOworCXVuc2lnbmVkIGxvbmcgVG1wQnVsa0VuZFBvcywgVGhpc0J1bGtTaXplOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3MgPSAwLCBJcnFGbGFnczIgPSAwOworCXU4ICpwV2lyZWxlc3NQa3QsICpwQXBwZW5kYW50OworCUJPT0xFQU4gYlR4UUxhc3RSb3VuZCA9IEZBTFNFOworCXU4IGFsbHplcm9bNF0gPSB7IDB4MCwgMHgwLCAweDAsIDB4MCB9OwogCiAJQlVMS19PVVRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwotCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKLQl7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nW0J1bGtPdXRQaXBlSWRdID09IFRSVUUpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKSB7CiAJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBUUlVFOwogCiAJaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKLQkJKQotCXsKKwkgICAgKSB7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKIAkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CiAJCXJldHVybjsKIAl9CiAJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CiAKLQogCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbQnVsa091dFBpcGVJZF0pOwogCiAJQlVMS19PVVRfTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzMik7Ci0JaWYgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKLQkJfHwgKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLTgpID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpCi0JewotCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOworCWlmICgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PQorCSAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQorCSAgICB8fCAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gLSA4KSA9PQorCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB7CisJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sCisJCQkJSXJxRmxhZ3MyKTsKIAogCQlCVUxLX09VVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbQnVsa091dFBpcGVJZF0gPSBGQUxTRTsKIAotCQkvLyBDbGVhciBEYXRhIGZsYWcKLQkJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOwotCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKKwkJLyogQ2xlYXIgRGF0YSBmbGFnICovCisJCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsCisJCQkJICAgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwKKwkJCQkgICAgICAgQnVsa091dFBpcGVJZCkpOworCQlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLAorCQkJCSAgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwKKwkJCQkgICAgICAgQnVsa091dFBpcGVJZCkpOwogCiAJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQorCS8qIENsZWFyIERhdGEgZmxhZyAqLworCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsCisJCQkgICAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRyA8PCBCdWxrT3V0UGlwZUlkKSk7CisJUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwKKwkJCSAgICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOwogCi0JLy8gQ2xlYXIgRGF0YSBmbGFnCi0JUlRVU0JfQ0xFQVJfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUcgPDwgQnVsa091dFBpcGVJZCkpOwotCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOwotCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJ1bGtPdXQtQjpJPTB4JWx4LCBDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQhXG4iLCBpbl9pbnRlcnJ1cHQoKSwKLQkvLwkJCQkJCQlwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCi0JLy8JCQkJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwkvKkRCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQnVsa091dC1COkk9MHglbHgsIENXUG9zPSVsZCwgQ1dSUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIGluX2ludGVycnVwdCgpLCAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLCAqLworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsgKi8KIAlwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24gPSBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uOwogCVRoaXNCdWxrU2l6ZSA9IDA7CiAJVG1wQnVsa0VuZFBvcyA9IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbjsKIAlwV2lyZWxlc3NQa3QgPSAmcEhUVFhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlci0+ZmllbGQuV2lyZWxlc3NQYWNrZXRbMF07CiAKLQlpZiAoKHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkID09IFRSVUUpKQotCXsKLQkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLDQpKQotCQl7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJlMSwgYWxsemVybyA6ICV4ICAleCAgJXggICV4ICAleCAgJXggICV4ICAleCBcbiIsCi0JCQkJcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsxXSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFsyXSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzNdCi0JCQkJLHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFs3XSkpOworCWlmICgocEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPT0gVFJVRSkpIHsKKwkJaWYgKFJUTVBFcXVhbE1lbW9yeShwSFRUWENvbnRleHQtPlNhdmVkUGFkLCBhbGx6ZXJvLCA0KSkgeworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJlMSwgYWxsemVybyA6ICV4ICAleCAgJXggICV4ICAleCAgJXggICV4ICAleCBcbiIsCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFswXSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzFdLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQorCQkJCSAgICAgICwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs0XSwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzVdLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbNl0sCisJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs3XSkpOwogCQl9Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc10sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIDgpOworCQlOZGlzTW92ZU1lbW9yeSgmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdLAorCQkJICAgICAgIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIDgpOwogCQlwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCA9IEZBTFNFOwogCQlpZiAocEFkLT5iRm9yY2VQcmludFRYID09IFRSVUUpCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUVVNCQnVsa091dERhdGFQYWNrZXQgLS0+IENPUFkgUEFELiBDdXJXcml0ZSA9ICVsZCwgTmV4dEJ1bGsgPSAlbGQuICAgRU5leHRCdWxrID0gJWxkLlxuIiwgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikpOworCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldCAtLT4gQ09QWSBQQUQuIEN1cldyaXRlID0gJWxkLCBOZXh0QnVsayA9ICVsZC4gICBFTmV4dEJ1bGsgPSAlbGQuXG4iLAorCQkJCSAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikpOwogCX0KIAotCWRvCi0JewotCQlwVHhJbmZvID0gKFBUWElORk9fU1RSVUMpJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXTsKLQkJcFR4V0kgPSAoUFRYV0lfU1RSVUMpJnBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zICsgVFhJTkZPX1NJWkVdOworCWRvIHsKKwkJcFR4SW5mbyA9IChzdHJ1Y3QgcnRfdHhpbmZvICopJiBwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc107CisJCXBUeFdJID0KKwkJICAgIChzdHJ1Y3QgcnRfdHh3aSAqKSAmIHBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zICsgVFhJTkZPX1NJWkVdOwogCiAJCWlmIChwQWQtPmJGb3JjZVByaW50VFggPT0gVFJVRSkKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUVVNCQnVsa091dERhdGFQYWNrZXQgQU1QRFUgPSAlZC5cbiIsICAgcFR4V0ktPkFNUERVKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0IEFNUERVID0gJWQuXG4iLAorCQkJCSAgcFR4V0ktPkFNUERVKSk7CiAKLQkJLy8gYWRkIGJ5IEl2ZXJzb24sIGxpbWl0IEJ1bGtPdXQgc2l6ZSB0byA0ayB0byBwYXNzIFdNTSBiIG1vZGUgMlQxUiB0ZXN0IGl0ZW1zCi0JCS8vaWYgKChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpCi0JCWlmICgoVGhpc0J1bGtTaXplICE9IDApICYmIChwVHhXSS0+UEhZTU9ERSA9PSBNT0RFX0NDSykpCi0JCXsKLQkJCWlmICgoKFRoaXNCdWxrU2l6ZSYweGZmZmY4MDAwKSAhPSAwKSB8fCAoKFRoaXNCdWxrU2l6ZSYweDEwMDApID09IDB4MTAwMCkpCi0JCQl7Ci0JCQkJLy8gTGltaXQgQnVsa091dCBzaXplIHRvIGFib3V0IDRrIGJ5dGVzLgotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkvKiBhZGQgYnkgSXZlcnNvbiwgbGltaXQgQnVsa091dCBzaXplIHRvIDRrIHRvIHBhc3MgV01NIGIgbW9kZSAyVDFSIHRlc3QgaXRlbXMgKi8KKwkJLyppZiAoKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkgKi8KKwkJaWYgKChUaGlzQnVsa1NpemUgIT0gMCkgJiYgKHBUeFdJLT5QSFlNT0RFID09IE1PREVfQ0NLKSkgeworCQkJaWYgKCgoVGhpc0J1bGtTaXplICYgMHhmZmZmODAwMCkgIT0gMCkKKwkJCSAgICB8fCAoKFRoaXNCdWxrU2l6ZSAmIDB4MTAwMCkgPT0gMHgxMDAwKSkgeworCQkJCS8qIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCA0ayBieXRlcy4gKi8KKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0KKwkJCQkgICAgVG1wQnVsa0VuZFBvczsKIAkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKCgocEFkLT5CdWxrT3V0TWF4UGFja2V0U2l6ZSA8IDUxMikgJiYgKChUaGlzQnVsa1NpemUmMHhmZmZmZjgwMCkgIT0gMCkgKSAvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkqLykKLQkJCXsKLQkJCQkvLyBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLgotCQkJCS8vIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuCi0JCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9IFRtcEJ1bGtFbmRQb3M7CisJCQl9IGVsc2UKKwkJCSAgICBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKQorCQkJCSAmJiAoKFRoaXNCdWxrU2l6ZSAmIDB4ZmZmZmY4MDApICE9CisJCQkJICAgICAwKSkKKwkJCQkvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkgKi8KKwkJCQkpIHsKKwkJCQkvKiBGb3IgVVNCIDEuMSBvciBwZWVyIHdoaWNoIGRpZG4ndCBzdXBwb3J0IEFNUERVLCBsaW1pdCB0aGUgQnVsa091dCBzaXplLiAqLworCQkJCS8qIEZvciBwZXJmb3JtZW5jZSBpbiBiL2cgbW9kZSwgbm93IGp1c3QgY2hlY2sgZm9yIFVTQiAxLjEgYW5kIGRpZG4ndCBjYXJlIGFib3V0IHRoZSBBUE1EVSBvciBub3QhIDIwMDgvMDYvMDQuICovCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9CisJCQkJICAgIFRtcEJ1bGtFbmRQb3M7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJLy8gZW5kIEl2ZXJzb24KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKChUaGlzQnVsa1NpemUmMHhmZmZmODAwMCkgIT0gMCkgfHwgKChUaGlzQnVsa1NpemUmMHg2MDAwKSA9PSAweDYwMDApKQotCQkJewkvLyBMaW1pdCBCdWxrT3V0IHNpemUgdG8gYWJvdXQgMjRrIGJ5dGVzLgotCQkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOworCQkvKiBlbmQgSXZlcnNvbiAqLworCQllbHNlIHsKKwkJCWlmICgoKFRoaXNCdWxrU2l6ZSAmIDB4ZmZmZjgwMDApICE9IDApIHx8ICgoVGhpc0J1bGtTaXplICYgMHg2MDAwKSA9PSAweDYwMDApKSB7CS8qIExpbWl0IEJ1bGtPdXQgc2l6ZSB0byBhYm91dCAyNGsgYnl0ZXMuICovCisJCQkJcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9CisJCQkJICAgIFRtcEJ1bGtFbmRQb3M7CiAJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICgoKHBBZC0+QnVsa091dE1heFBhY2tldFNpemUgPCA1MTIpICYmICgoVGhpc0J1bGtTaXplJjB4ZmZmZmY4MDApICE9IDApICkgLyp8fCAoIChUaGlzQnVsa1NpemUgIT0gMCkgICYmIChwVHhXSS0+QU1QRFUgPT0gMCkpKi8pCi0JCQl7CS8vIEZvciBVU0IgMS4xIG9yIHBlZXIgd2hpY2ggZGlkbid0IHN1cHBvcnQgQU1QRFUsIGxpbWl0IHRoZSBCdWxrT3V0IHNpemUuCi0JCQkJLy8gRm9yIHBlcmZvcm1lbmNlIGluIGIvZyBtb2RlLCBub3cganVzdCBjaGVjayBmb3IgVVNCIDEuMSBhbmQgZGlkbid0IGNhcmUgYWJvdXQgdGhlIEFQTURVIG9yIG5vdCEgMjAwOC8wNi8wNC4KLQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0gVG1wQnVsa0VuZFBvczsKKwkJCX0gZWxzZSBpZiAoKChwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplIDwgNTEyKSAmJiAoKFRoaXNCdWxrU2l6ZSAmIDB4ZmZmZmY4MDApICE9IDApKSAvKnx8ICggKFRoaXNCdWxrU2l6ZSAhPSAwKSAgJiYgKHBUeFdJLT5BTVBEVSA9PSAwKSkgKi8gKSB7CS8qIEZvciBVU0IgMS4xIG9yIHBlZXIgd2hpY2ggZGlkbid0IHN1cHBvcnQgQU1QRFUsIGxpbWl0IHRoZSBCdWxrT3V0IHNpemUuICovCisJCQkJLyogRm9yIHBlcmZvcm1lbmNlIGluIGIvZyBtb2RlLCBub3cganVzdCBjaGVjayBmb3IgVVNCIDEuMSBhbmQgZGlkbid0IGNhcmUgYWJvdXQgdGhlIEFQTURVIG9yIG5vdCEgMjAwOC8wNi8wNC4gKi8KKwkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uID0KKwkJCQkgICAgVG1wQnVsa0VuZFBvczsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCi0JCWlmIChUbXBCdWxrRW5kUG9zID09IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikKLQkJeworCQlpZiAoVG1wQnVsa0VuZFBvcyA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pIHsKIAkJCXBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPSBUbXBCdWxrRW5kUG9zOwogCQkJYnJlYWs7CiAJCX0KIAotCQkvL1BTIHBhY2tldHMgdXNlIEhDQ0EgcXVldWUgd2hlbiBkZXF1ZXVlIGZyb20gUFMgdW5pY2FzdCBxdWV1ZSAoV2lGaSBXUEEyIE1BOV9EVDEgZm9yIE1hcnZlbGwgQiBTVEEpCi0JCWlmIChwVHhJbmZvLT5RU0VMICE9IEZJRk9fRURDQSkKLQkJewotCQkJcHJpbnRrKCIlcygpOiA9PT09PiBwVHhJbmZvLT5RdWV1ZVNlbCglZCkhPSBGSUZPX0VEQ0EhISEhXG4iLCBfX2Z1bmNfXywgcFR4SW5mby0+UVNFTCk7Ci0JCQlwcmludGsoIlx0Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkIVxuIiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKTsKLQkJCWhleF9kdW1wKCJXcm9uZyBRU2VsIFBrdDoiLCAoUFVDSEFSKSZwV2lyZWxlc3NQa3RbVG1wQnVsa0VuZFBvc10sIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gLSBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKTsKKwkJaWYgKHBUeEluZm8tPlFTRUwgIT0gRklGT19FRENBKSB7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCIlcygpOiA9PT09PiBwVHhJbmZvLT5RdWV1ZVNlbCglZCkhPSBGSUZPX0VEQ0EhISEhXG4iLAorCQkJCSAgX19GVU5DVElPTl9fLCBwVHhJbmZvLT5RU0VMKSk7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCQkgKCJcdENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsCisJCQkJICBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sCisJCQkJICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkJICBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCSAgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQpKTsKKwkJCWhleF9kdW1wKCJXcm9uZyBRU2VsIFBrdDoiLAorCQkJCSAodTggKikmIHBXaXJlbGVzc1BrdFtUbXBCdWxrRW5kUG9zXSwKKwkJCQkgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiAtCisJCQkJICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKTsKIAkJfQogCi0JCWlmIChwVHhJbmZvLT5VU0JETUFUeFBrdExlbiA8PSA4KQotCQl7Ci0JCQlCVUxLX09VVF9VTkxPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFnczIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IgLypSVF9ERUJVR19UUkFDRSovLCgiZTIsIFVTQkRNQVR4UGt0TGVuPT0wLCBTaXplPSVsZCwgYkNTUGFkPSVkLCBDV1Bvcz0lbGQsIE5CUG9zPSVsZCwgQ1dSUG9zPSVsZCFcbiIsCi0JCQkJCXBIVFRYQ29udGV4dC0+QnVsa091dFNpemUsIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MpKTsKKwkJaWYgKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuIDw9IDgpIHsKKwkJCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sCisJCQkJCUlycUZsYWdzMik7CisJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAvKlJUX0RFQlVHX1RSQUNFICovICwKKwkJCQkgKCJlMiwgVVNCRE1BVHhQa3RMZW49PTAsIFNpemU9JWxkLCBiQ1NQYWQ9JWQsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBDV1JQb3M9JWxkIVxuIiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+QnVsa091dFNpemUsCisJCQkJICBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwKKwkJCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zKSk7CiAJCQl7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UqLywoIiV4ICAleCAgJXggICV4ICAleCAgJXggICV4ICAleCBcbiIsCi0JCQkJCXBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMV0sIHBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMl0scEhUVFhDb250ZXh0LT5TYXZlZFBhZFszXQotCQkJCQkscEhUVFhDb250ZXh0LT5TYXZlZFBhZFs0XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs2XSxwSFRUWENvbnRleHQtPlNhdmVkUGFkWzddKSk7CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SIC8qUlRfREVCVUdfVFJBQ0UgKi8KKwkJCQkJICAgICAsCisJCQkJCSAgICAgKCIleCAgJXggICV4ICAleCAgJXggICV4ICAleCAgJXggXG4iLAorCQkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdLAorCQkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzFdLAorCQkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzJdLAorCQkJCQkgICAgICBwSFRUWENvbnRleHQtPlNhdmVkUGFkWzNdCisJCQkJCSAgICAgICwgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs0XSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs1XSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs2XSwKKwkJCQkJICAgICAgcEhUVFhDb250ZXh0LT5TYXZlZFBhZFs3XSkpOwogCQkJfQogCQkJcEFkLT5iRm9yY2VQcmludFRYID0gVFJVRTsKLQkJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKKwkJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sCisJCQkJICAgICAgSXJxRmxhZ3MpOwogCQkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOwotCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7Ci0JCQkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJPdXQ6cFR4SW5mby0+VVNCRE1BVHhQa3RMZW49JWQhXG4iLCBwVHhJbmZvLT5VU0JETUFUeFBrdExlbikpOworCQkJQlVMS19PVVRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW0J1bGtPdXRQaXBlSWRdLAorCQkJCQlJcnFGbGFncyk7CisJCQkvKkRCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJPdXQ6cFR4SW5mby0+VVNCRE1BVHhQa3RMZW49JWQhXG4iLCBwVHhJbmZvLT5VU0JETUFUeFBrdExlbikpOyAqLwogCQkJcmV0dXJuOwogCQl9Ci0KLQkJCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICBwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OworCQkvKiBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIgKi8KKwkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCArPQorCQkgICAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKKwkJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPQorCQkgICAgcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKIAogCQlwTGFzdFR4SW5mbyA9IHBUeEluZm87CiAKLQkJLy8gTWFrZSBzdXJlIHdlIHVzZSBFRENBIFFVRVVFLgotCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOyAgLy9QUyBwYWNrZXRzIHVzZSBIQ0NBIHF1ZXVlIHdoZW4gZGVxdWV1ZSBmcm9tIFBTIHVuaWNhc3QgcXVldWUgKFdpRmkgV1BBMiBNQTlfRFQxIGZvciBNYXJ2ZWxsIEIgU1RBKQotCQlUaGlzQnVsa1NpemUgKz0gKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuKzQpOwotCQlUbXBCdWxrRW5kUG9zICs9IChwVHhJbmZvLT5VU0JETUFUeFBrdExlbis0KTsKKwkJLyogTWFrZSBzdXJlIHdlIHVzZSBFRENBIFFVRVVFLiAqLworCQlwVHhJbmZvLT5RU0VMID0gRklGT19FRENBOworCQlUaGlzQnVsa1NpemUgKz0gKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuICsgNCk7CisJCVRtcEJ1bGtFbmRQb3MgKz0gKHBUeEluZm8tPlVTQkRNQVR4UGt0TGVuICsgNCk7CiAKIAkJaWYgKFRtcEJ1bGtFbmRQb3MgIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQogCQkJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IDE7CiAKLQkJaWYgKHBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID09IDEpCi0JCXsKKwkJaWYgKHBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID09IDEpIHsKIAkJCWlmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkKIAkJCQlwVHhJbmZvLT5VU0JETUFOZXh0VkxEID0gMDsKIAkJCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMDsKQEAgLTM2OCw2OCArMzk3LDg4IEBACiAKIAkJCWJyZWFrOwogCQl9Ci0JfXdoaWxlIChUUlVFKTsKIAotCS8vIGFkanVzdCB0aGUgcFR4SW5mby0+VVNCRE1BTmV4dFZMRCB2YWx1ZSBvZiBsYXN0IHBUeEluZm8uCi0JaWYgKHBMYXN0VHhJbmZvKQotCXsKKwl9IHdoaWxlIChUUlVFKTsKKworCS8qIGFkanVzdCB0aGUgcFR4SW5mby0+VVNCRE1BTmV4dFZMRCB2YWx1ZSBvZiBsYXN0IHBUeEluZm8uICovCisJaWYgKHBMYXN0VHhJbmZvKSB7CiAJCXBMYXN0VHhJbmZvLT5VU0JETUFOZXh0VkxEID0gMDsKIAl9CiAKIAkvKgotCQlXZSBuZWVkIHRvIGNvcHkgU2F2ZWRQYWQgd2hlbiBmb2xsb3dpbmcgY29uZGl0aW9uIG1hdGNoZWQhCi0JCQkxLiBOb3QgdGhlIGxhc3Qgcm91bmQgb2YgdGhlIFR4UXVldWUgYW5kCi0JCQkyLiBhbnkgbWF0Y2ggb2YgZm9sbG93aW5nIGNhc2VzOgotCQkJCSgxKS4gVGhlIEVuZCBQb3NpdGlvbiBvZiB0aGlzIGJ1bGsgb3V0IGlzIHJlYWNoIHRvIHRoZSBDdXJyZW5jdCBXcml0ZSBwb3NpdGlvbiBhbmQKLQkJCQkJCXRoZSBUeEluZm8gYW5kIHJlbGF0ZWQgaGVhZGVyIGFscmVhZHkgd3JpdGUgdG8gdGhlIEN1cldyaXRlUG9zaXRpb24uCi0JCQkgICAJCT0+KEVOZXh0QnVsa091dFBvc2l0aW9uID09IEN1cldyaXRlUG9zaXRpb24pICYmIChDdXJXcml0ZVJlYWxQb3MgPiBDdXJXcml0ZVBvc2l0aW9uKQorCSAgIFdlIG5lZWQgdG8gY29weSBTYXZlZFBhZCB3aGVuIGZvbGxvd2luZyBjb25kaXRpb24gbWF0Y2hlZCEKKwkgICAxLiBOb3QgdGhlIGxhc3Qgcm91bmQgb2YgdGhlIFR4UXVldWUgYW5kCisJICAgMi4gYW55IG1hdGNoIG9mIGZvbGxvd2luZyBjYXNlczoKKwkgICAoMSkuIFRoZSBFbmQgUG9zaXRpb24gb2YgdGhpcyBidWxrIG91dCBpcyByZWFjaCB0byB0aGUgQ3VycmVuY3QgV3JpdGUgcG9zaXRpb24gYW5kCisJICAgdGhlIFR4SW5mbyBhbmQgcmVsYXRlZCBoZWFkZXIgYWxyZWFkeSB3cml0ZSB0byB0aGUgQ3VyV3JpdGVQb3NpdGlvbi4KKwkgICA9PihFTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBDdXJXcml0ZVBvc2l0aW9uKSAmJiAoQ3VyV3JpdGVSZWFsUG9zID4gQ3VyV3JpdGVQb3NpdGlvbikKIAotCQkJCSgyKS4gVGhlIEVuZFBvc2l0aW9uIG9mIHRoZSBidWxrIG91dCBpcyBub3QgcmVhY2ggdG8gdGhlIEN1cnJlbnQgV3JpdGUgUG9zaXRpb24uCi0JCQkJCT0+KEVOZXh0QnVsa091dFBvc2l0aW9uICE9IEN1cldyaXRlUG9zaXRpb24pCi0JKi8KKwkgICAoMikuIFRoZSBFbmRQb3NpdGlvbiBvZiB0aGUgYnVsayBvdXQgaXMgbm90IHJlYWNoIHRvIHRoZSBDdXJyZW50IFdyaXRlIFBvc2l0aW9uLgorCSAgID0+KEVOZXh0QnVsa091dFBvc2l0aW9uICE9IEN1cldyaXRlUG9zaXRpb24pCisJICovCiAJaWYgKChiVHhRTGFzdFJvdW5kID09IEZBTFNFKSAmJgotCQkgKCgocEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiA9PSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA+IHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbikpIHx8Ci0JCSAgKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gIT0gcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKLQkJKQotCXsKLQkJTmRpc01vdmVNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwgJnBXaXJlbGVzc1BrdFtwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uXSwgOCk7CisJICAgICgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0KKwkgICAgICAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKQorCSAgICAgICYmIChwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcyA+CisJCSAgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uKSkKKwkgICAgIHx8IChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICE9CisJCSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQorCSAgICApIHsKKwkJTmRpc01vdmVNZW1vcnkocEhUVFhDb250ZXh0LT5TYXZlZFBhZCwKKwkJCSAgICAgICAmcFdpcmVsZXNzUGt0W3BIVFRYQ29udGV4dC0+CisJCQkJCSAgICAgRU5leHRCdWxrT3V0UG9zaXRpb25dLCA4KTsKIAkJcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQgPSBUUlVFOwotCQlpZiAoUlRNUEVxdWFsTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIGFsbHplcm8sNCkpCi0JCXsKLQkJCVBVQ0hBUglwQnVmID0gJnBIVFRYQ29udGV4dC0+U2F2ZWRQYWRbMF07Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJXQVJOSU5HLVplcm8tMzolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCxDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIGJDVz0lZCwgTkJQb3M9JWxkLCBUQlBvcz0lbGQsIFRCU2l6ZT0lbGRcbiIsCi0JCQkJcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSxwQnVmWzNdLHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0scEJ1Zls3XSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywKLQkJCQlwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIFRtcEJ1bGtFbmRQb3MsIFRoaXNCdWxrU2l6ZSkpOworCQlpZiAoUlRNUEVxdWFsTWVtb3J5KHBIVFRYQ29udGV4dC0+U2F2ZWRQYWQsIGFsbHplcm8sIDQpKSB7CisJCQl1OCAqcEJ1ZiA9ICZwSFRUWENvbnRleHQtPlNhdmVkUGFkWzBdOworCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAgICAgKCJXQVJOSU5HLVplcm8tMzolMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCxDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIGJDVz0lZCwgTkJQb3M9JWxkLCBUQlBvcz0lbGQsIFRCU2l6ZT0lbGRcbiIsCisJCQkJICAgICAgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwKKwkJCQkgICAgICBwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLCBwQnVmWzddLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPkN1cldyaXRlUmVhbFBvcywKKwkJCQkgICAgICBwSFRUWENvbnRleHQtPmJDdXJXcml0aW5nLAorCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwKKwkJCQkgICAgICBUbXBCdWxrRW5kUG9zLCBUaGlzQnVsa1NpemUpKTsKIAogCQkJcEJ1ZiA9ICZwV2lyZWxlc3NQa3RbcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uXTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIlx0Q1dQb3M9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0scEJ1ZlszXSxwQnVmWzRdLCBwQnVmWzVdLCBwQnVmWzZdLHBCdWZbN10pKTsKKwkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCQkgICAgICgiXHRDV1Bvcz0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCQkgICAgICBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLAorCQkJCSAgICAgIHBCdWZbNF0sIHBCdWZbNV0sIHBCdWZbNl0sIHBCdWZbN10pKTsKIAkJfQotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJFTlBvcz09Q1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1NQYWQ9JWQhXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOworCQkvKkRCR1BSSU5UKFJUX0RFQlVHX0xPVUQsKCJFTlBvcz09Q1dQb3M9JWxkLCBDV1JQb3M9JWxkLCBiQ1NQYWQ9JWQhXG4iLCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24sIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVSZWFsUG9zLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCkpOyAqLwogCX0KIAogCWlmIChwQWQtPmJGb3JjZVByaW50VFggPT0gVFJVRSkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCdWxrT3V0LUE6U2l6ZT0lbGQsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsIFRoaXNCdWxrU2l6ZSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7Ci0JLy9EQkdQUklOVChSVF9ERUJVR19MT1VELCgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQsIGJMUm91bmQ9JWQhXG4iLCBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIGJUeFFMYXN0Um91bmQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJCdWxrT3V0LUE6U2l6ZT0lbGQsIENXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCFcbiIsCisJCQkgIFRoaXNCdWxrU2l6ZSwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLAorCQkJICBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkgIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24sCisJCQkgIHBIVFRYQ29udGV4dC0+YkNvcHlTYXZlUGFkKSk7CisJLypEQkdQUklOVChSVF9ERUJVR19MT1VELCgiQnVsa091dC1BOlNpemU9JWxkLCBDV1Bvcz0lbGQsIENXUlBvcz0lbGQsIE5CUG9zPSVsZCwgRU5CUG9zPSVsZCwgYkNvcHk9JWQsIGJMUm91bmQ9JWQhXG4iLCBUaGlzQnVsa1NpemUsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVJlYWxQb3MsIHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbiwgcEhUVFhDb250ZXh0LT5iQ29weVNhdmVQYWQsIGJUeFFMYXN0Um91bmQpKTsgKi8KIAotCQkvLyBVU0IgRE1BIGVuZ2luZSByZXF1aXJlcyB0byBwYWQgZXh0cmEgNCBieXRlcy4gVGhpcyBwYWQgZG9lc24ndCBjb3VudCBpbnRvIHJlYWwgYnVsa291dHNpemUuCisJLyogVVNCIERNQSBlbmdpbmUgcmVxdWlyZXMgdG8gcGFkIGV4dHJhIDQgYnl0ZXMuIFRoaXMgcGFkIGRvZXNuJ3QgY291bnQgaW50byByZWFsIGJ1bGtvdXRzaXplLiAqLwogCXBBcHBlbmRhbnQgPSAmcFdpcmVsZXNzUGt0W1RtcEJ1bGtFbmRQb3NdOwogCU5kaXNaZXJvTWVtb3J5KHBBcHBlbmRhbnQsIDgpOworCVRoaXNCdWxrU2l6ZSArPSA0OworCXBIVFRYQ29udGV4dC0+TGFzdE9uZSA9IFRSVUU7CisJaWYgKChUaGlzQnVsa1NpemUgJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQogCQlUaGlzQnVsa1NpemUgKz0gNDsKLQkJcEhUVFhDb250ZXh0LT5MYXN0T25lID0gVFJVRTsKLQkJaWYgKChUaGlzQnVsa1NpemUgJSBwQWQtPkJ1bGtPdXRNYXhQYWNrZXRTaXplKSA9PSAwKQotCQkJVGhpc0J1bGtTaXplICs9IDQ7CiAJcEhUVFhDb250ZXh0LT5CdWxrT3V0U2l6ZSA9IFRoaXNCdWxrU2l6ZTsKIAogCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbQnVsa091dFBpcGVJZF0gPSAxOwogCUJVTEtfT1VUX1VOTE9DSygmcEFkLT5UeENvbnRleHRRdWV1ZUxvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzMik7CiAKLQkvLyBJbml0IFR4IGNvbnRleHQgZGVzY3JpcHRvcgotCVJUVVNCSW5pdEhUVHhEZXNjKHBBZCwgcEhUVFhDb250ZXh0LCBCdWxrT3V0UGlwZUlkLCBUaGlzQnVsa1NpemUsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUpOworCS8qIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yICovCisJUlRVU0JJbml0SFRUeERlc2MocEFkLCBwSFRUWENvbnRleHQsIEJ1bGtPdXRQaXBlSWQsIFRoaXNCdWxrU2l6ZSwKKwkJCSAgKHVzYl9jb21wbGV0ZV90KSBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUpOwogCiAJcFVyYiA9IHBIVFRYQ29udGV4dC0+cFVyYjsKLQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXREYXRhUGFja2V0OiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJICgiUlRVU0JCdWxrT3V0RGF0YVBhY2tldDogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsCisJCQkgIHJldCkpOwogCiAJCUJVTEtfT1VUX0xPQ0soJnBBZC0+QnVsa091dExvY2tbQnVsa091dFBpcGVJZF0sIElycUZsYWdzKTsKIAkJcEFkLT5CdWxrT3V0UGVuZGluZ1tCdWxrT3V0UGlwZUlkXSA9IEZBTFNFOwpAQCAtNDQ2LDQ4ICs0OTUsNDEgQEAKIAogfQogCi0KLVZPSUQgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit2b2lkIFJUVVNCQnVsa091dERhdGFQYWNrZXRDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqIHB0X3JlZ3MpCiB7Ci0JUEhUX1RYX0NPTlRFWFQJcEhUVFhDb250ZXh0OwotCVBSVE1QX0FEQVBURVIJcEFkOwotCVBPU19DT09LSUUgCQlwT2JqOwotCVVDSEFSCQkJQnVsa091dFBpcGVJZDsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3Qgb3NfY29va2llICpwT2JqOworCXU4IEJ1bGtPdXRQaXBlSWQ7CiAKKwlwSFRUWENvbnRleHQgPSAoc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKilwVXJiLT5jb250ZXh0OworCXBBZCA9IHBIVFRYQ29udGV4dC0+cEFkOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOwogCi0JcEhUVFhDb250ZXh0CT0gKFBIVF9UWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJCT0gcEhUVFhDb250ZXh0LT5wQWQ7Ci0JcE9iaiAJCQk9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCS8vIFN0b3JlIEJ1bGtPdXQgUGlwZUlkCi0JQnVsa091dFBpcGVJZAk9IHBIVFRYQ29udGV4dC0+QnVsa091dFBpcGVJZDsKKwkvKiBTdG9yZSBCdWxrT3V0IFBpcGVJZCAqLworCUJ1bGtPdXRQaXBlSWQgPSBwSFRUWENvbnRleHQtPkJ1bGtPdXRQaXBlSWQ7CiAJcEFkLT5CdWxrT3V0RGF0YU9uZVNlY0NvdW50Kys7CiAKLQlzd2l0Y2ggKEJ1bGtPdXRQaXBlSWQpCi0JewotCQljYXNlIDA6Ci0JCQkJcE9iai0+YWMwX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7Ci0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOwotCQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQkJcE9iai0+YWMxX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7Ci0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQkJcE9iai0+YWMyX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7Ci0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQkJcE9iai0+YWMzX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7Ci0JCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQkJcE9iai0+aGNjYV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwotCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmhjY2FfZG1hX2RvbmVfdGFzayk7Ci0JCQkJYnJlYWs7CisJc3dpdGNoIChCdWxrT3V0UGlwZUlkKSB7CisJY2FzZSAwOgorCQlwT2JqLT5hYzBfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOworCQlicmVhazsKKwljYXNlIDE6CisJCXBPYmotPmFjMV9kbWFfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOworCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcE9iai0+YWMyX2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMl9kbWFfZG9uZV90YXNrKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwT2JqLT5hYzNfZG1hX2RvbmVfdGFzay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFVyYjsKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOworCQlicmVhazsKIAl9Ci19CiAKK30KIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTUwMiwxNyArNTQ0LDE2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQnVsa091dE51bGxGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQVFhfQ09OVEVYVAkJcE51bGxDb250ZXh0ID0gJihwQWQtPk51bGxDb250ZXh0KTsKLQlQVVJCCQkJcFVyYjsKLQlpbnQJCQkJcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQgPSAmKHBBZC0+TnVsbENvbnRleHQpOworCVBVUkIgcFVyYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOwogCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwotCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKLQl7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtNTIxLDQ1ICs1NjIsNDUgQEAKIAlwTnVsbENvbnRleHQtPklSUFBlbmRpbmcgPSBUUlVFOwogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCi0JLy8gSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyCi0JcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSAgcE51bGxDb250ZXh0LT5CdWxrT3V0U2l6ZTsKKwkvKiBJbmNyZWFzZSBUb3RhbCB0cmFuc21pdCBieXRlIGNvdW50ZXIgKi8KKwlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9IHBOdWxsQ29udGV4dC0+QnVsa091dFNpemU7CiAKLQotCS8vIENsZWFyIE51bGwgZnJhbWUgYnVsayBmbGFnCisJLyogQ2xlYXIgTnVsbCBmcmFtZSBidWxrIGZsYWcgKi8KIAlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKTsKIAotCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCi0JUlRVU0JJbml0VHhEZXNjKHBBZCwgcE51bGxDb250ZXh0LCAwLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUpOworCS8qIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yICovCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcE51bGxDb250ZXh0LCAwLAorCQkJKHVzYl9jb21wbGV0ZV90KSBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZSk7CiAKIAlwVXJiID0gcE51bGxDb250ZXh0LT5wVXJiOwotCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSE9MCkKLQl7CisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CiAJCVJUTVBfSVJRX0xPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAkJcEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9IEZBTFNFOwogCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250WzBdID0gMDsKIAkJcE51bGxDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa091dE51bGxGcmFtZTogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsIHJldCkpOworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJUVVNCQnVsa091dE51bGxGcmFtZTogU3VibWl0IFR4IFVSQiBmYWlsZWQgJWRcbiIsCisJCQkgIHJldCkpOwogCQlyZXR1cm47CiAJfQogCiB9CiAKLS8vIE5VTEwgZnJhbWUgdXNlIEJ1bGtPdXRQaXBlSWQgPSAwCi1WT0lEIFJUVVNCQnVsa091dE51bGxGcmFtZUNvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCisvKiBOVUxMIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMCAqLwordm9pZCBSVFVTQkJ1bGtPdXROdWxsRnJhbWVDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqIHB0X3JlZ3MpCiB7Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBUWF9DT05URVhUCQkJcE51bGxDb250ZXh0OwotCU5UU1RBVFVTCQkJU3RhdHVzOwotCVBPU19DT09LSUUJCQlwT2JqOworCXN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZDsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE51bGxDb250ZXh0OworCWludCBTdGF0dXM7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKIAorCXBOdWxsQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcE51bGxDb250ZXh0LT5wQWQ7CisJU3RhdHVzID0gcFVyYi0+c3RhdHVzOwogCi0JcE51bGxDb250ZXh0CT0gKFBUWF9DT05URVhUKXBVcmItPmNvbnRleHQ7Ci0JcEFkIAkJCT0gcE51bGxDb250ZXh0LT5wQWQ7Ci0JU3RhdHVzIAkJCT0gcFVyYi0+c3RhdHVzOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKIAlwT2JqLT5udWxsX2ZyYW1lX2NvbXBsZXRlX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CiAJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bnVsbF9mcmFtZV9jb21wbGV0ZV90YXNrKTsKIH0KQEAgLTU3NywzNCArNjE4LDMwIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQnVsa091dE1MTUVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJbmRleCkKK3ZvaWQgUlRVU0JCdWxrT3V0TUxNRVBhY2tldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHU4IEluZGV4KQogewotCVBUWF9DT05URVhUCQlwTUxNRUNvbnRleHQ7Ci0JUFVSQgkJCXBVcmI7Ci0JaW50CQkJCXJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlzdHJ1Y3QgcnRfdHhfY29udGV4dCAqcE1MTUVDb250ZXh0OworCVBVUkIgcFVyYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOwogCi0JcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4RG1hSWR4XS5BbGxvY1ZhOworCXBNTE1FQ29udGV4dCA9CisJICAgIChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4RG1hSWR4XS5BbGxvY1ZhOwogCXBVcmIgPSBwTUxNRUNvbnRleHQtPnBVcmI7CiAKIAlpZiAoKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPj0gTUdNVF9SSU5HX1NJWkUpIHx8Ci0JCShwTUxNRUNvbnRleHQtPkluVXNlID09IEZBTFNFKSB8fAotCQkocE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gRkFMU0UpKQotCXsKKwkgICAgKHBNTE1FQ29udGV4dC0+SW5Vc2UgPT0gRkFMU0UpIHx8CisJICAgIChwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9PSBGQUxTRSkpIHsKIAotCi0JCS8vIENsZWFyIE1MTUUgYnVsayBmbGFnCisJCS8qIENsZWFyIE1MTUUgYnVsayBmbGFnICovCiAJCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKIAogCQlyZXR1cm47CiAJfQogCi0KIAlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOwotCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPT0gVFJVRSkgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpCi0JeworCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPT0gVFJVRSkKKwkgICAgfHwgUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkpIHsKIAkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW01HTVRQSVBFSURYXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtNjE1LDIzICs2NTIsMjUgQEAKIAlwTUxNRUNvbnRleHQtPmJXYWl0aW5nQnVsa091dCA9IEZBTFNFOwogCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKIAotCS8vIEluY3JlYXNlIFRvdGFsIHRyYW5zbWl0IGJ5dGUgY291bnRlcgotCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIHBNTE1FQ29udGV4dC0+QnVsa091dFNpemU7CisJLyogSW5jcmVhc2UgVG90YWwgdHJhbnNtaXQgYnl0ZSBjb3VudGVyICovCisJcEFkLT5SYWxpbmtDb3VudGVycy5UcmFuc21pdHRlZEJ5dGVDb3VudCArPSBwTUxNRUNvbnRleHQtPkJ1bGtPdXRTaXplOwogCi0JLy8gQ2xlYXIgTUxNRSBidWxrIGZsYWcKKwkvKiBDbGVhciBNTE1FIGJ1bGsgZmxhZyAqLwogCVJUVVNCX0NMRUFSX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKIAotCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCi0JUlRVU0JJbml0VHhEZXNjKHBBZCwgcE1MTUVDb250ZXh0LCBNR01UUElQRUlEWCwgKHVzYl9jb21wbGV0ZV90KVJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZSk7CisJLyogSW5pdCBUeCBjb250ZXh0IGRlc2NyaXB0b3IgKi8KKwlSVFVTQkluaXRUeERlc2MocEFkLCBwTUxNRUNvbnRleHQsIE1HTVRQSVBFSURYLAorCQkJKHVzYl9jb21wbGV0ZV90KSBSVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGUpOwogCi0JLy9Gb3IgbWdtdCB1cmIgYnVmZmVyLCBiZWNhdXNlIHdlIHVzZSBza19idWZmLCBzbyB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgVVNCIGNvbnRyb2xsZXIgZG8gZG1hIG1hcHBpbmcuCi0JcFVyYi0+dHJhbnNmZXJfZG1hCT0gMDsKKwkvKkZvciBtZ210IHVyYiBidWZmZXIsIGJlY2F1c2Ugd2UgdXNlIHNrX2J1ZmYsIHNvIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSBVU0IgY29udHJvbGxlciBkbyBkbWEgbWFwcGluZy4gKi8KKwlwVXJiLT50cmFuc2Zlcl9kbWEgPSAwOwogCXBVcmItPnRyYW5zZmVyX2ZsYWdzICY9ICh+VVJCX05PX1RSQU5TRkVSX0RNQV9NQVApOwogCiAJcFVyYiA9IHBNTE1FQ29udGV4dC0+cFVyYjsKLQlpZigocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRNTE1FUGFja2V0OiBTdWJtaXQgTUxNRSBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpICE9IDApIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVFVTQkJ1bGtPdXRNTE1FUGFja2V0OiBTdWJtaXQgTUxNRSBVUkIgZmFpbGVkICVkXG4iLAorCQkJICByZXQpKTsKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF0sIElycUZsYWdzKTsKIAkJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKIAkJcEFkLT53YXRjaERvZ1R4UGVuZGluZ0NudFtNR01UUElQRUlEWF0gPSAwOwpAQCAtNjQxLDMyICs2ODAsMjkgQEAKIAogCQlyZXR1cm47CiAJfQotCi0JLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCI8LS0tUlRVU0JCdWxrT3V0TUxNRVBhY2tldCBcbiIpKTsKLS8vCXByaW50aygiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQsQ3B1PSVkISwgRG1hPSVkLCBTd0lkeD0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOworCS8qREJHUFJJTlRfUkFXKFJUX0RFQlVHX0lORk8sICgiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQgXG4iKSk7ICovCisvKiAgICAgIHByaW50aygiPC0tLVJUVVNCQnVsa091dE1MTUVQYWNrZXQsQ3B1PSVkISwgRG1hPSVkLCBTd0lkeD0lZCFcbiIsIHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIHBBZC0+TWdtdFJpbmcuVHhEbWFJZHgsIHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHgpOyAqLwogfQogCi0KLVZPSUQgUlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCit2b2lkIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqIHB0X3JlZ3MpCiB7Ci0JUFRYX0NPTlRFWFQJCQlwTUxNRUNvbnRleHQ7Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCU5UU1RBVFVTCQkJU3RhdHVzOwotCVBPU19DT09LSUUgCQkJcE9iajsKLQlpbnQJCQkJCWluZGV4OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCWludCBTdGF0dXM7CisJc3RydWN0IG9zX2Nvb2tpZSAqcE9iajsKKwlpbnQgaW5kZXg7CiAKLQkvL0RCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIi0tLT5SVFVTQkJ1bGtPdXRNTE1FUGFja2V0Q29tcGxldGVcbiIpKTsKLQlwTUxNRUNvbnRleHQJPSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQgCQkJPSBwTUxNRUNvbnRleHQtPnBBZDsKLQlwT2JqIAkJCT0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0JU3RhdHVzCQkJPSBwVXJiLT5zdGF0dXM7Ci0JaW5kZXggCQkJPSBwTUxNRUNvbnRleHQtPlNlbGZJZHg7CisJLypEQkdQUklOVF9SQVcoUlRfREVCVUdfSU5GTywgKCItLS0+UlRVU0JCdWxrT3V0TUxNRVBhY2tldENvbXBsZXRlXG4iKSk7ICovCisJcE1MTUVDb250ZXh0ID0gKHN0cnVjdCBydF90eF9jb250ZXh0ICopcFVyYi0+Y29udGV4dDsKKwlwQWQgPSBwTUxNRUNvbnRleHQtPnBBZDsKKwlwT2JqID0gKHN0cnVjdCBvc19jb29raWUgKilwQWQtPk9TX0Nvb2tpZTsKKwlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CisJaW5kZXggPSBwTUxNRUNvbnRleHQtPlNlbGZJZHg7CiAKIAlwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBVcmI7CiAJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+bWdtdF9kbWFfZG9uZV90YXNrKTsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC02ODAsMTcgKzcxNiwxNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkJ1bGtPdXRQc1BvbGwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQnVsa091dFBzUG9sbChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUFRYX0NPTlRFWFQJCXBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOwotCVBVUkIJCQlwVXJiOwotCWludAkJCQlyZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBQc1BvbGxDb250ZXh0ID0gJihwQWQtPlBzUG9sbENvbnRleHQpOworCVBVUkIgcFVyYjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIElycUZsYWdzOwogCiAJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwotCWlmICgocEFkLT5CdWxrT3V0UGVuZGluZ1swXSA9PSBUUlVFKSB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKSkKLQl7CisJaWYgKChwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID09IFRSVUUpCisJICAgIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9ORUVEX1NUT1BfVFgpKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCQlyZXR1cm47CiAJfQpAQCAtNjk5LDU3ICs3MzQsNTcgQEAKIAlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7CiAJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrWzBdLCBJcnFGbGFncyk7CiAKLQotCS8vIENsZWFyIFBTLVBvbGwgYnVsayBmbGFnCisJLyogQ2xlYXIgUFMtUG9sbCBidWxrIGZsYWcgKi8KIAlSVFVTQl9DTEVBUl9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKTsKIAotCS8vIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yCi0JUlRVU0JJbml0VHhEZXNjKHBBZCwgcFBzUG9sbENvbnRleHQsIE1HTVRQSVBFSURYLCAodXNiX2NvbXBsZXRlX3QpUlRVU0JCdWxrT3V0UHNQb2xsQ29tcGxldGUpOworCS8qIEluaXQgVHggY29udGV4dCBkZXNjcmlwdG9yICovCisJUlRVU0JJbml0VHhEZXNjKHBBZCwgcFBzUG9sbENvbnRleHQsIE1HTVRQSVBFSURYLAorCQkJKHVzYl9jb21wbGV0ZV90KSBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZSk7CiAKIAlwVXJiID0gcFBzUG9sbENvbnRleHQtPnBVcmI7Ci0JaWYoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCXsKKwlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpICE9IDApIHsKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1swXSwgSXJxRmxhZ3MpOwogCQlwQWQtPkJ1bGtPdXRQZW5kaW5nWzBdID0gRkFMU0U7CiAJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbMF0gPSAwOwogCQlwUHNQb2xsQ29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwogCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbMF0sIElycUZsYWdzKTsKIAotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQkJ1bGtPdXRQc1BvbGw6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJSVFVTQkJ1bGtPdXRQc1BvbGw6IFN1Ym1pdCBUeCBVUkIgZmFpbGVkICVkXG4iLAorCQkJICByZXQpKTsKIAkJcmV0dXJuOwogCX0KIAogfQogCi0vLyBQUy1Qb2xsIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMAotVk9JRCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShwdXJiYl90IHBVcmIsc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpCisvKiBQUy1Qb2xsIGZyYW1lIHVzZSBCdWxrT3V0UGlwZUlkID0gMCAqLwordm9pZCBSVFVTQkJ1bGtPdXRQc1BvbGxDb21wbGV0ZShzdHJ1Y3QgdXJiICpwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqIHB0X3JlZ3MpCiB7Ci0JUFJUTVBfQURBUFRFUgkJcEFkOwotCVBUWF9DT05URVhUCQkJcFBzUG9sbENvbnRleHQ7Ci0JTlRTVEFUVVMJCQlTdGF0dXM7Ci0JUE9TX0NPT0tJRQkJCXBPYmo7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUHNQb2xsQ29udGV4dDsKKwlpbnQgU3RhdHVzOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CiAKLQotCXBQc1BvbGxDb250ZXh0PSAoUFRYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKKwlwUHNQb2xsQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CiAJcEFkID0gcFBzUG9sbENvbnRleHQtPnBBZDsKIAlTdGF0dXMgPSBwVXJiLT5zdGF0dXM7CiAKLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOwogCXBPYmotPnBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnBzcG9sbF9mcmFtZV9jb21wbGV0ZV90YXNrKTsKIH0KIAotVk9JRCBEb0J1bGtJbihJTiBSVE1QX0FEQVBURVIgKnBBZCkKK3ZvaWQgRG9CdWxrSW4oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OwotCVBVUkIJCQlwVXJiOwotCWludAkJCQlyZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7CisJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJUFVSQiBwVXJiOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CiAKIAlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAlwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtwQWQtPk5leHRSeEJ1bGtJbkluZGV4XSk7Ci0JaWYgKChwQWQtPlBlbmRpbmdSeCA+IDApIHx8IChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSB8fCAocFJ4Q29udGV4dC0+SW5Vc2UgPT0gVFJVRSkpCi0JeworCWlmICgocEFkLT5QZW5kaW5nUnggPiAwKSB8fCAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkKKwkgICAgfHwgKHBSeENvbnRleHQtPkluVXNlID09IFRSVUUpKSB7CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJCXJldHVybjsKIAl9CkBAIC03NTksMTMgKzc5NCwxMiBAQAogCXBBZC0+QnVsa0luUmVxKys7CiAJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAotCS8vIEluaXQgUnggY29udGV4dCBkZXNjcmlwdG9yCisJLyogSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IgKi8KIAlOZGlzWmVyb01lbW9yeShwUnhDb250ZXh0LT5UcmFuc2ZlckJ1ZmZlciwgcFJ4Q29udGV4dC0+QnVsa0luT2Zmc2V0KTsKIAlSVFVTQkluaXRSeERlc2MocEFkLCBwUnhDb250ZXh0KTsKIAogCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOwotCWlmICgocmV0ID0gUlRVU0JfU1VCTUlUX1VSQihwVXJiKSkhPTApCi0JewkvLyBmYWlsCisJaWYgKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBVcmIpKSAhPSAwKSB7CS8qIGZhaWwgKi8KIAogCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKIAkJcFJ4Q29udGV4dC0+SW5Vc2UgPSBGQUxTRTsKQEAgLTc3MywxNiArODA3LDE0IEBACiAJCXBBZC0+UGVuZGluZ1J4LS07CiAJCXBBZC0+QnVsa0luUmVxLS07CiAJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa1JlY2VpdmU6IFN1Ym1pdCBSeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKLQl9Ci0JZWxzZQotCXsJLy8gc3VjY2VzcworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwKKwkJCSAoIlJUVVNCQnVsa1JlY2VpdmU6IFN1Ym1pdCBSeCBVUkIgZmFpbGVkICVkXG4iLCByZXQpKTsKKwl9IGVsc2UgewkJLyogc3VjY2VzcyAqLwogCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKLQkJLy9wcmludGsoIkJJRG9uZSwgUGVuZD0lZCxCSUlkeD0lZCxCSVJJZHg9JWQhXG4iLCBwQWQtPlBlbmRpbmdSeCwgcEFkLT5OZXh0UnhCdWxrSW5JbmRleCwgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgpOworCQkvKnByaW50aygiQklEb25lLCBQZW5kPSVkLEJJSWR4PSVkLEJJUklkeD0lZCFcbiIsIHBBZC0+UGVuZGluZ1J4LCBwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCk7ICovCiAJfQogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTgxMyw0NCArODQ1LDQwIEBACiAJCSBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8IGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MgfCBcCiAJCSBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUykKIAotVk9JRAlSVFVTQkJ1bGtSZWNlaXZlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkJ1bGtSZWNlaXZlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCisJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX0hBTkRMRV9SWCkpCiAJCXJldHVybjsKIAotCXdoaWxlKDEpCi0JeworCXdoaWxlICgxKSB7CiAKIAkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W3BBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4XSk7Ci0JCWlmICgoKHBSeENvbnRleHQtPkluVXNlID09IEZBTFNFKSAmJiAocFJ4Q29udGV4dC0+UmVhZGFibGUgPT0gVFJVRSkpICYmCi0JCQkocFJ4Q29udGV4dC0+YlJ4SGFuZGxpbmcgPT0gRkFMU0UpKQotCQl7CisJCWlmICgoKHBSeENvbnRleHQtPkluVXNlID09IEZBTFNFKQorCQkgICAgICYmIChwUnhDb250ZXh0LT5SZWFkYWJsZSA9PSBUUlVFKSkKKwkJICAgICYmIChwUnhDb250ZXh0LT5iUnhIYW5kbGluZyA9PSBGQUxTRSkpIHsKIAkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gVFJVRTsKIAkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAKLQkJCS8vIHJlYWQgUnhDb250ZXh0LCBTaW5jZSBub3QKKwkJCS8qIHJlYWQgUnhDb250ZXh0LCBTaW5jZSBub3QgKi8KIAkJCVNUQVJ4RG9uZUludGVycnVwdEhhbmRsZShwQWQsIFRSVUUpOwogCi0JCQkvLyBGaW5pc2ggdG8gaGFuZGxlIHRoaXMgYnVsa0luIGJ1ZmZlci4KKwkJCS8qIEZpbmlzaCB0byBoYW5kbGUgdGhpcyBidWxrSW4gYnVmZmVyLiAqLwogCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7CiAJCQlwUnhDb250ZXh0LT5CdWxrSW5PZmZzZXQgPSAwOwogCQkJcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKIAkJCXBSeENvbnRleHQtPmJSeEhhbmRsaW5nID0gRkFMU0U7CiAJCQlwQWQtPlJlYWRQb3NpdGlvbiA9IDA7CiAJCQlwQWQtPlRyYW5zZmVyQnVmZmVyTGVuZ3RoID0gMDsKLQkJCUlOQ19SSU5HX0lOREVYKHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4LCBSWF9SSU5HX1NJWkUpOworCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsCisJCQkJICAgICAgIFJYX1JJTkdfU0laRSk7CiAJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCi0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTg2MSw3ICs4ODksNiBAQAogCiB9CiAKLQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtODg1LDI3ICs5MTIsMjQgQEAKIAkJQWx3YXlzIHJldHVybnMgU1RBVFVTX01PUkVfUFJPQ0VTU0lOR19SRVFVSVJFRAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQgUlRVU0JCdWxrUnhDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQordm9pZCBSVFVTQkJ1bGtSeENvbXBsZXRlKHN0cnVjdCB1cmIgKnBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKQogewotCS8vIHVzZSBhIHJlY2VpdmUgdGFza2xldCB0byBoYW5kbGUgcmVjZWl2ZWQgcGFja2V0czsKLQkvLyBvciBzb21ldGltZXMgaGFyZHdhcmUgSVJRIHdpbGwgYmUgZGlzYWJsZWQgaGVyZSwgc28gd2UgY2FuIG5vdAotCS8vIHVzZSBzcGluX2xvY2tfYmgoKS9zcGluX3VubG9ja19iaCgpIGFmdGVyIElSUSBpcyBkaXNhYmxlZC4gOjwKLQlQUlhfQ09OVEVYVAkJcFJ4Q29udGV4dDsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlQT1NfQ09PS0lFIAkJcE9iajsKKwkvKiB1c2UgYSByZWNlaXZlIHRhc2tsZXQgdG8gaGFuZGxlIHJlY2VpdmVkIHBhY2tldHM7ICovCisJLyogb3Igc29tZXRpbWVzIGhhcmR3YXJlIElSUSB3aWxsIGJlIGRpc2FibGVkIGhlcmUsIHNvIHdlIGNhbiBub3QgKi8KKwkvKiB1c2Ugc3Bpbl9sb2NrX2JoKCkvc3Bpbl91bmxvY2tfYmgoKSBhZnRlciBJUlEgaXMgZGlzYWJsZWQuIDo8ICovCisJc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQ7CisJc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkOworCXN0cnVjdCBvc19jb29raWUgKnBPYmo7CiAKLQotCXBSeENvbnRleHQJPSAoUFJYX0NPTlRFWFQpcFVyYi0+Y29udGV4dDsKLQlwQWQgCQk9IHBSeENvbnRleHQtPnBBZDsKLQlwT2JqIAkJPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJcFJ4Q29udGV4dCA9IChzdHJ1Y3QgcnRfcnhfY29udGV4dCAqKXBVcmItPmNvbnRleHQ7CisJcEFkID0gcFJ4Q29udGV4dC0+cEFkOworCXBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOwogCiAJcE9iai0+cnhfZG9uZV90YXNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVXJiOwogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPnJ4X2RvbmVfdGFzayk7CiAKIH0KIAotCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTkxOSw4NiArOTQzLDc4IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCS2lja0J1bGtPdXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQpCit2b2lkIFJUVVNCS2lja0J1bGtPdXQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCS8vIEJ1bGtJbiBSZXNldCB3aWxsIHJlc2V0IHdob2xlIFVTQiBQSFkuIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUIG5vdCBmbGFnZWQuCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQgLGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYKQotCQkpCi0JewotCQkvLyAyLiBQUy1Qb2xsIGZyYW1lIGlzIG5leHQKLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX1BTUE9MTCkpCi0JCXsKKwkvKiBCdWxrSW4gUmVzZXQgd2lsbCByZXNldCB3aG9sZSBVU0IgUEhZLiBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCBub3QgZmxhZ2VkLiAqLworCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05FRURfU1RPUF9UWCkKKwkgICAgKSB7CisJCS8qIDIuIFBTLVBvbGwgZnJhbWUgaXMgbmV4dCAqLworCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKSkgewogCQkJUlRVU0JCdWxrT3V0UHNQb2xsKHBBZCk7CiAJCX0KLQotCQkvLyA1LiBNbG1lIGZyYW1lIGlzIG5leHQKLQkJZWxzZSBpZiAoKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpKSAmJgotCQkJCSAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA8IE1HTVRfUklOR19TSVpFKSkKLQkJeworCQkvKiA1LiBNbG1lIGZyYW1lIGlzIG5leHQgKi8KKwkJZWxzZSBpZiAoKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX01MTUUpKSB8fAorCQkJIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUpKSB7CiAJCQlSVFVTQkJ1bGtPdXRNTE1FUGFja2V0KHBBZCwgcEFkLT5NZ210UmluZy5UeERtYUlkeCk7CiAJCX0KLQotCQkvLyA2LiBEYXRhIGZyYW1lIG5vcm1hbCBpcyBuZXh0Ci0JCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCkpCi0JCXsKLQkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAotCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCSkpCi0JCQl7Ci0JCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDAsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFswXSk7CisJCS8qIDYuIERhdGEgZnJhbWUgbm9ybWFsIGlzIG5leHQgKi8KKwkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMKSkgeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCSAgICAgfHwKKwkJCSAgICAgKCFPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCSAgICApKSB7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDAsCisJCQkJCQkgICAgICAgcEFkLT4KKwkJCQkJCSAgICAgICBOZXh0QnVsa091dEluZGV4WzBdKTsKIAkJCX0KIAkJfQotCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMikpCi0JCXsKLQkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAotCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCSkpCi0JCQl7Ci0JCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDEsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFsxXSk7CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yKSkgeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCSAgICAgfHwKKwkJCSAgICAgKCFPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCSAgICApKSB7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDEsCisJCQkJCQkgICAgICAgcEFkLT4KKwkJCQkJCSAgICAgICBOZXh0QnVsa091dEluZGV4WzFdKTsKIAkJCX0KIAkJfQotCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMykpCi0JCXsKLQkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAotCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCSkpCi0JCQl7Ci0JCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDIsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFsyXSk7CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8zKSkgeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCSAgICAgfHwKKwkJCSAgICAgKCFPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCSAgICApKSB7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDIsCisJCQkJCQkgICAgICAgcEFkLT4KKwkJCQkJCSAgICAgICBOZXh0QnVsa091dEluZGV4WzJdKTsKIAkJCX0KIAkJfQotCQlpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfNCkpCi0JCXsKLQkJCWlmICgoKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB8fAotCQkJCSghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCSkpCi0JCQl7Ci0JCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDMsIHBBZC0+TmV4dEJ1bGtPdXRJbmRleFszXSk7CisJCWlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF80KSkgeworCQkJaWYgKCgoIVJUTVBfVEVTVF9GTEFHCisJCQkgICAgICAocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKKwkJCSAgICAgfHwKKwkJCSAgICAgKCFPUFNUQVRVU19URVNUX0ZMQUcKKwkJCSAgICAgIChwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKKwkJCSAgICApKSB7CisJCQkJUlRVU0JCdWxrT3V0RGF0YVBhY2tldChwQWQsIDMsCisJCQkJCQkgICAgICAgcEFkLT4KKwkJCQkJCSAgICAgICBOZXh0QnVsa091dEluZGV4WzNdKTsKIAkJCX0KIAkJfQotCi0JCS8vUFMgcGFja2V0cyB1c2UgSENDQSBxdWV1ZSB3aGVuIGRlcXVldWUgZnJvbSBQUyB1bmljYXN0IHF1ZXVlIChXaUZpIFdQQTIgTUE5X0RUMSBmb3IgTWFydmVsbCBCIFNUQSkKLQkJaWYgKFJUVVNCX1RFU1RfQlVMS19GTEFHKHBBZCwgZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzUpKQotCQl7Ci0JCQlpZiAoKCghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkgfHwKLQkJCQkoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCQkpKQotCQkJewotCQkJfQotCQl9Ci0KLQkJLy8gNy4gTnVsbCBmcmFtZSBpcyB0aGUgbGFzdAotCQllbHNlIGlmIChSVFVTQl9URVNUX0JVTEtfRkxBRyhwQWQsIGZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwpKQotCQl7Ci0JCQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JCQl7CisJCS8qIDcuIE51bGwgZnJhbWUgaXMgdGhlIGxhc3QgKi8KKwkJZWxzZSBpZiAoUlRVU0JfVEVTVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfREFUQV9OVUxMKSkgeworCQkJaWYgKCFSVE1QX1RFU1RfRkxBRworCQkJICAgIChwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSB7CiAJCQkJUlRVU0JCdWxrT3V0TnVsbEZyYW1lKHBBZCk7CiAJCQl9CiAJCX0KLQotCQkvLyA4LiBObyBkYXRhIGF2YWxpYWJsZQotCQllbHNlCi0JCXsKKwkJLyogOC4gTm8gZGF0YSBhdmFsaWFibGUgKi8KKwkJZWxzZSB7CiAKIAkJfQogCX0KQEAgLTEwMTcsMTYgKzEwMzMsMTQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JDbGVhblVwRGF0YUJ1bGtPdXRRdWV1ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JVUNIQVIJCQlJZHg7Ci0JUEhUX1RYX0NPTlRFWFQJcFR4Q29udGV4dDsKKwl1OCBJZHg7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBUeENvbnRleHQ7CiAKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+Q2xlYW5VcERhdGFCdWxrT3V0UXVldWVcbiIpKTsKIAotCWZvciAoSWR4ID0gMDsgSWR4IDwgNDsgSWR4KyspCi0JeworCWZvciAoSWR4ID0gMDsgSWR4IDwgNDsgSWR4KyspIHsKIAkJcFR4Q29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtJZHhdOwogCiAJCXBUeENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPSBwVHhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uOwpAQCAtMTA1MiwxNCArMTA2NiwxMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkNsZWFuVXBNTE1FQnVsa091dFF1ZXVlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+Q2xlYW5VcE1MTUVCdWxrT3V0UXVldWVcbiIpKTsKIAlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0tQ2xlYW5VcE1MTUVCdWxrT3V0UXVldWVcbiIpKTsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMDY5LDEzICsxMDgxLDExIEBACiAKIAlSZXR1cm4gVmFsdWU6CiAKLQogCU5vdGU6CiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQ2FuY2VsUGVuZGluZ0lSUHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewogCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOwogCVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsKQEAgLTEwOTQsMjkgKzExMDQsMjUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQordm9pZCBSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OwotCVVJTlQJCQlpOworCXN0cnVjdCBydF9yeF9jb250ZXh0ICpwUnhDb250ZXh0OworCXUzMiBpOwogCiAJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKLQlmb3IgKCBpID0gMDsgaSA8IChSWF9SSU5HX1NJWkUpOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKSB7CiAJCXBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKLQkJaWYocFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKQotCQl7CisJCWlmIChwUnhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpIHsKIAkJCVJUVVNCX1VOTElOS19VUkIocFJ4Q29udGV4dC0+cFVyYik7CiAJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0gRkFMU0U7CiAJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOwotCQkJLy9OZGlzSW50ZXJsb2NrZWREZWNyZW1lbnQoJnBBZC0+UGVuZGluZ1J4KTsKLQkJCS8vcEFkLT5QZW5kaW5nUngtLTsKKwkJCS8qTmRpc0ludGVybG9ja2VkRGVjcmVtZW50KCZwQWQtPlBlbmRpbmdSeCk7ICovCisJCQkvKnBBZC0+UGVuZGluZ1J4LS07ICovCiAJCX0KIAl9CiAJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlBcbiIpKTsKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xMTMwLDgzICsxMTM2LDc0IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVBIVF9UWF9DT05URVhUCQlwSFRUWENvbnRleHQ7Ci0JUFRYX0NPTlRFWFQJCQlwTUxNRUNvbnRleHQ7Ci0JUFRYX0NPTlRFWFQJCQlwQmVhY29uQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBOdWxsQ29udGV4dDsKLQlQVFhfQ09OVEVYVAkJCXBQc1BvbGxDb250ZXh0OwotCVBUWF9DT05URVhUCQkJcFJUU0NvbnRleHQ7Ci0JVUlOVAkJCQlpLCBJZHg7Ci0vLwl1bnNpZ25lZCBpbnQgCQlJcnFGbGFnczsKLS8vCU5ESVNfU1BJTl9MT0NLCQkqcExvY2s7Ci0vLwlCT09MRUFOCQkJCSpwUGVuZGluZzsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTUxNRUNvbnRleHQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBCZWFjb25Db250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwTnVsbENvbnRleHQ7CisJc3RydWN0IHJ0X3R4X2NvbnRleHQgKnBQc1BvbGxDb250ZXh0OworCXN0cnVjdCBydF90eF9jb250ZXh0ICpwUlRTQ29udGV4dDsKKwl1MzIgaSwgSWR4OworLyogICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBJcnFGbGFnczsgKi8KKy8qICAgICAgc3BpbmxvY2tfdCAgICAgICAgICAqcExvY2s7ICovCisvKiAgICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgKnBQZW5kaW5nOyAqLwogCisvKiAgICAgIHBMb2NrID0gJnBBZC0+QnVsa091dExvY2tbTUdNVFBJUEVJRFhdOyAqLworLyogICAgICBwUGVuZGluZyA9ICZwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXTsgKi8KIAotLy8JcExvY2sgPSAmcEFkLT5CdWxrT3V0TG9ja1tNR01UUElQRUlEWF07Ci0vLwlwUGVuZGluZyA9ICZwQWQtPkJ1bGtPdXRQZW5kaW5nW01HTVRQSVBFSURYXTsKLQotCWZvciAoSWR4ID0gMDsgSWR4IDwgNDsgSWR4KyspCi0JeworCWZvciAoSWR4ID0gMDsgSWR4IDwgNDsgSWR4KyspIHsKIAkJcEhUVFhDb250ZXh0ID0gJihwQWQtPlR4Q29udGV4dFtJZHhdKTsKIAotCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nID09IFRSVUUpCi0JCXsKKwkJaWYgKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSB7CiAKLQkJCS8vIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZgotCQkJLy8gcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QKLQkJCS8vCXdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuCWNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcAotCQkJLy8KKwkJCS8qIEdldCB0aGUgVVNCX0NPTlRFWFQgYW5kIGNhbmNlbCBpdCdzIElSUDsgdGhlIGNvbXBsZXRpb24gcm91dGluZSB3aWxsIGl0c2VsZiAqLworCQkJLyogcmVtb3ZlIGl0IGZyb20gdGhlIEhlYWRQZW5kaW5nU2VuZExpc3QgYW5kIE5VTEwgb3V0IEhlYWRQZW5kaW5nU2VuZExpc3QgKi8KKwkJCS8qICAgICAgd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4gIGNhbmNlbGxlZDsgdGhhdCdzIGhvdyB3ZSBleGl0IHRoaXMgbG9vcCAqLworCQkJLyogKi8KIAogCQkJUlRVU0JfVU5MSU5LX1VSQihwSFRUWENvbnRleHQtPnBVcmIpOwogCi0JCQkvLyBTbGVlcCAyMDAgbWljcm9zZWNvbmRzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yaworCQkJLyogU2xlZXAgMjAwIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsgKi8KIAkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKIAkJfQogCiAJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOwogCX0KIAotCS8vUlRNUF9JUlFfTE9DSyhwTG9jaywgSXJxRmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKQotCXsKLQkJcE1MTUVDb250ZXh0ID0gKFBUWF9DT05URVhUKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCQlpZihwTUxNRUNvbnRleHQgJiYgKHBNTE1FQ29udGV4dC0+SVJQUGVuZGluZyA9PSBUUlVFKSkKLQkJeworCS8qUlRNUF9JUlFfTE9DSyhwTG9jaywgSXJxRmxhZ3MpOyAqLworCWZvciAoaSA9IDA7IGkgPCBNR01UX1JJTkdfU0laRTsgaSsrKSB7CisJCXBNTE1FQ29udGV4dCA9IChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOworCQlpZiAocE1MTUVDb250ZXh0ICYmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkpIHsKIAotCQkJLy8gR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmCi0JCQkvLyByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdAotCQkJLy8Jd2hlbiB0aGUgbGFzdCBJUlAgb24gdGhlIGxpc3QgaGFzIGJlZW4JY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wCi0JCQkvLworCQkJLyogR2V0IHRoZSBVU0JfQ09OVEVYVCBhbmQgY2FuY2VsIGl0J3MgSVJQOyB0aGUgY29tcGxldGlvbiByb3V0aW5lIHdpbGwgaXRzZWxmICovCisJCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgSGVhZFBlbmRpbmdTZW5kTGlzdCBhbmQgTlVMTCBvdXQgSGVhZFBlbmRpbmdTZW5kTGlzdCAqLworCQkJLyogICAgICB3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbiAgY2FuY2VsbGVkOyB0aGF0J3MgaG93IHdlIGV4aXQgdGhpcyBsb29wICovCisJCQkvKiAqLwogCiAJCQlSVFVTQl9VTkxJTktfVVJCKHBNTE1FQ29udGV4dC0+cFVyYik7CiAJCQlwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKIAotCQkJLy8gU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsKKwkJCS8qIFNsZWVwIDIwMCBtaWNyb3NlY3MgdG8gZ2l2ZSBjYW5jZWxsYXRpb24gdGltZSB0byB3b3JrICovCiAJCQlSVE1QdXNlY0RlbGF5KDIwMCk7CiAJCX0KIAl9CiAJcEFkLT5CdWxrT3V0UGVuZGluZ1tNR01UUElQRUlEWF0gPSBGQUxTRTsKLQkvL1JUTVBfSVJRX1VOTE9DSyhwTG9jaywgSXJxRmxhZ3MpOworCS8qUlRNUF9JUlFfVU5MT0NLKHBMb2NrLCBJcnFGbGFncyk7ICovCiAKLQotCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBCRUFDT05fUklOR19TSVpFOyBpKyspIHsKIAkJcEJlYWNvbkNvbnRleHQgPSAmKHBBZC0+QmVhY29uQ29udGV4dFtpXSk7CiAKLQkJaWYocEJlYWNvbkNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKLQkJeworCQlpZiAocEJlYWNvbkNvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkgewogCi0JCQkvLyBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYKLQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0Ci0JCQkvLwl3aGVuIHRoZSBsYXN0IElSUCBvbiB0aGUgbGlzdCBoYXMgYmVlbgljYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AKLQkJCS8vCisJCQkvKiBHZXQgdGhlIFVTQl9DT05URVhUIGFuZCBjYW5jZWwgaXQncyBJUlA7IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgd2lsbCBpdHNlbGYgKi8KKwkJCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBIZWFkUGVuZGluZ1NlbmRMaXN0IGFuZCBOVUxMIG91dCBIZWFkUGVuZGluZ1NlbmRMaXN0ICovCisJCQkvKiAgICAgIHdoZW4gdGhlIGxhc3QgSVJQIG9uIHRoZSBsaXN0IGhhcyBiZWVuICBjYW5jZWxsZWQ7IHRoYXQncyBob3cgd2UgZXhpdCB0aGlzIGxvb3AgKi8KKwkJCS8qICovCiAKIAkJCVJUVVNCX1VOTElOS19VUkIocEJlYWNvbkNvbnRleHQtPnBVcmIpOwogCi0JCQkvLyBTbGVlcCAyMDAgbWljcm9zZWNzIHRvIGdpdmUgY2FuY2VsbGF0aW9uIHRpbWUgdG8gd29yaworCQkJLyogU2xlZXAgMjAwIG1pY3Jvc2VjcyB0byBnaXZlIGNhbmNlbGxhdGlvbiB0aW1lIHRvIHdvcmsgKi8KIAkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKIAkJfQogCX0KQEAgLTEyMjMsMTEgKzEyMjAsMTEgQEAKIAlpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkKIAkJUlRVU0JfVU5MSU5LX1VSQihwUHNQb2xsQ29udGV4dC0+cFVyYik7CiAKLQlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKQotCXsKKwlmb3IgKElkeCA9IDA7IElkeCA8IDQ7IElkeCsrKSB7CiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbSWR4XSk7CiAJCXBBZC0+QnVsa091dFBlbmRpbmdbSWR4XSA9IEZBTFNFOwogCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW0lkeF0pOwogCX0KIH0KIAorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfZGF0YS5jCmluZGV4IDZiMDAzZjYuLjQ1ODM3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2RhdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9kYXRhLmMKQEAgLTM2LDgyICszNiwxMDIgQEAKIAlKYW4gICAgICAgICAgICAwMy0yNS0yMDA2ICAgIGNyZWF0ZWQKIAogKi8KKworI2lmZGVmIFJUTVBfTUFDX1VTQgorCiAjaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCiAKLWV4dGVybiAgVUNIQVIgUGh5MTFCR05leHRSYXRlVXB3YXJkW107IC8vIGRlZmluZWQgaW4gbWxtZS5jCi1leHRlcm4gVUNIQVIJRXBUb1F1ZXVlW107CitleHRlcm4gdTggUGh5MTFCR05leHRSYXRlVXB3YXJkW107CS8qIGRlZmluZWQgaW4gbWxtZS5jICovCitleHRlcm4gdTggRXBUb1F1ZXVlW107CiAKLVZPSUQgUkVQT1JUX0FNU0RVX0ZSQU1FU19UT19MTEMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKK3ZvaWQgUkVQT1JUX0FNU0RVX0ZSQU1FU19UT19MTEMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCXU4ICpwRGF0YSwgdW5zaWduZWQgbG9uZyBEYXRhU2l6ZSkKIHsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlVSU5UCQkJbk1TRFU7Ci0Jc3RydWN0CQkJc2tfYnVmZiAqcFNrYjsKKwl2b2lkICpwUGFja2V0OworCXUzMiBuTVNEVTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcFNrYjsKIAogCW5NU0RVID0gMDsKIAkvKiBhbGxvY2F0ZSBhIHJ4IHBhY2tldCAqLwogCXBTa2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRkZFUl9BR0dSRVNJWkUpOwotCXBQYWNrZXQgPSAoUE5ESVNfUEFDS0VUKU9TUEtUX1RPX1JUUEtUKHBTa2IpOwotCWlmIChwU2tiKQotCXsKKwlwUGFja2V0ID0gKHZvaWQgKilPU1BLVF9UT19SVFBLVChwU2tiKTsKKwlpZiAocFNrYikgewogCiAJCS8qIGNvbnZlcnQgODAyLjExIHRvIDgwMi4zIHBhY2tldCAqLwogCQlwU2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKIAkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7CiAJCWRlYWdncmVnYXRlX0FNU0RVX2Fubm91bmNlKHBBZCwgcFBhY2tldCwgcERhdGEsIERhdGFTaXplKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJDYW4ndCBhbGxvY2F0ZSBza2JcbiIpKTsKKwl9IGVsc2UgeworCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYW4ndCBhbGxvY2F0ZSBza2JcbiIpKTsKIAl9CiB9CiAKLU5ESVNfU1RBVFVTCVJUVVNCRnJlZURlc2NyaXB0b3JSZXF1ZXN0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJQnVsa091dFBpcGVJZCwKLQlJTglVSU5UMzIJCQlOdW1iZXJSZXF1aXJlZCkKLXsKLS8vCVVDSEFSCQkJRnJlZU51bWJlciA9IDA7Ci0vLwlVSU5UCQkJSW5kZXg7Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JdW5zaWduZWQgbG9uZyAgIElycUZsYWdzOwotCUhUX1RYX0NPTlRFWFQJKnBIVFRYQ29udGV4dDsKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlUaGlzIHN1YnJvdXRpbmUgd2lsbCBzY2FuIHRocm91Z2ggcmVsZWF0aXZlIHJpbmcgZGVzY3JpcHRvciB0byBmaW5kCisJCW91dCBhdmFsaWFibGUgZnJlZSByaW5nIGRlc2NyaXB0b3IgYW5kIGNvbXBhcmUgd2l0aCByZXF1ZXN0IHNpemUuCisKKwlBcmd1bWVudHM6CisJCXBBZAlQb2ludGVyCXRvIG91ciBhZGFwdGVyCisJCVJpbmdUeXBlCVNlbGVjdGVkIFJpbmcKKworCVJldHVybiBWYWx1ZToKKwkJTkRJU19TVEFUVVNfRkFJTFVSRQkJTm90IGVub3VnaCBmcmVlIGRlc2NyaXB0b3IKKwkJTkRJU19TVEFUVVNfU1VDQ0VTUwkJRW5vdWdoIGZyZWUgZGVzY3JpcHRvcgorCisJTm90ZToKKworCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KK2ludCBSVFVTQkZyZWVEZXNjcmlwdG9yUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkJICAgICAgIHU4IEJ1bGtPdXRQaXBlSWQsCisJCQkJICAgICAgIHUzMiBOdW1iZXJSZXF1aXJlZCkKK3sKKy8qICAgICAgdTggICAgICAgICAgICAgICAgICAgRnJlZU51bWJlciA9IDA7ICovCisvKiAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgSW5kZXg7ICovCisJaW50IFN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OwogCiAJcEhUVFhDb250ZXh0ID0gJnBBZC0+VHhDb250ZXh0W0J1bGtPdXRQaXBlSWRdOwogCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7Ci0JaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pICYmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uICsgTnVtYmVyUmVxdWlyZWQgKyBMT0NBTF9UWEJVRl9TSVpFKSA+IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpCi0JeworCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKQorCSAgICAmJgorCSAgICAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiArIE51bWJlclJlcXVpcmVkICsKKwkgICAgICBMT0NBTF9UWEJVRl9TSVpFKSA+IHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbikpIHsKIAotCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PCBCdWxrT3V0UGlwZUlkKSk7Ci0JfQotCWVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPT0gOCkgJiYgKHBIVFRYQ29udGV4dC0+TmV4dEJ1bGtPdXRQb3NpdGlvbiA8IChOdW1iZXJSZXF1aXJlZCArIExPQ0FMX1RYQlVGX1NJWkUpKSkKLQl7Ci0JCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8IEJ1bGtPdXRQaXBlSWQpKTsKLQl9Ci0JZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVFVTQkZyZWVEIGMzIC0tPiBRdWVJZHg9JWQsIENXUG9zPSVsZCwgTkJPdXRQb3M9JWxkIVxuIiwgQnVsa091dFBpcGVJZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24pKTsKLQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgQnVsa091dFBpcGVJZCkpOwotCX0KLQllbHNlCi0JeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PAorCQkJCSAgICAgQnVsa091dFBpcGVJZCkpOworCX0gZWxzZSBpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA9PSA4KQorCQkgICAmJiAocEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uIDwKKwkJICAgICAgIChOdW1iZXJSZXF1aXJlZCArIExPQ0FMX1RYQlVGX1NJWkUpKSkgeworCQlSVFVTQl9TRVRfQlVMS19GTEFHKHBBZCwKKwkJCQkgICAgKGZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTCA8PAorCQkJCSAgICAgQnVsa091dFBpcGVJZCkpOworCX0gZWxzZSBpZiAocEhUVFhDb250ZXh0LT5iQ3VyV3JpdGluZyA9PSBUUlVFKSB7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JGcmVlRCBjMyAtLT4gUXVlSWR4PSVkLCBDV1Bvcz0lbGQsIE5CT3V0UG9zPSVsZCFcbiIsCisJCQkgIEJ1bGtPdXRQaXBlSWQsIHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiwKKwkJCSAgcEhUVFhDb250ZXh0LT5OZXh0QnVsa091dFBvc2l0aW9uKSk7CisJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCSAgICAoZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMIDw8CisJCQkJICAgICBCdWxrT3V0UGlwZUlkKSk7CisJfSBlbHNlIHsKIAkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKIAl9CiAJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwogCi0KIAlyZXR1cm4gKFN0YXR1cyk7CiB9CiAKLU5ESVNfU1RBVFVTIFJUVVNCRnJlZURlc2NyaXB0b3JSZWxlYXNlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKQoraW50IFJUVVNCRnJlZURlc2NyaXB0b3JSZWxlYXNlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgICAgdTggQnVsa091dFBpcGVJZCkKIHsKLQl1bnNpZ25lZCBsb25nICAgSXJxRmxhZ3M7Ci0JSFRfVFhfQ09OVEVYVAkqcEhUVFhDb250ZXh0OworCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKIAogCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKIAlSVE1QX0lSUV9MT0NLKCZwQWQtPlR4Q29udGV4dFF1ZXVlTG9ja1tCdWxrT3V0UGlwZUlkXSwgSXJxRmxhZ3MpOwpAQCAtMTIxLDI4ICsxNDEsMzIgQEAKIAlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwogfQogCi0KLUJPT0xFQU4JUlRVU0JOZWVkUXVldWVCYWNrRm9yQWdnKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVDSEFSCQlCdWxrT3V0UGlwZUlkKQorQk9PTEVBTiBSVFVTQk5lZWRRdWV1ZUJhY2tGb3JBZ2coc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLCB1OCBCdWxrT3V0UGlwZUlkKQogewotCXVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsKLQlIVF9UWF9DT05URVhUCSpwSFRUWENvbnRleHQ7Ci0JQk9PTEVBTgkJCW5lZWRRdWVCYWNrID0gRkFMU0U7CisJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKwlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqcEhUVFhDb250ZXh0OworCUJPT0xFQU4gbmVlZFF1ZUJhY2sgPSBGQUxTRTsKIAogCXBIVFRYQ29udGV4dCA9ICZwQWQtPlR4Q29udGV4dFtCdWxrT3V0UGlwZUlkXTsKIAogCVJUTVBfSVJRX0xPQ0soJnBBZC0+VHhDb250ZXh0UXVldWVMb2NrW0J1bGtPdXRQaXBlSWRdLCBJcnFGbGFncyk7Ci0JaWYgKChwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPT0gVFJVRSkgIC8qJiYgKHBBZC0+VHhTd1F1ZXVlW0J1bGtPdXRQaXBlSWRdLk51bWJlciA9PSAwKSAqLykKLQl7Ci0JCWlmICgocEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uIDwgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikgJiYKLQkJCSgoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24rTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwgTUFYX1RYQlVMS19MSU1JVCkgfHwgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+IE1BWF9BR0dSRUdBVElPTl9TSVpFKSkpCi0JCXsKKwlpZiAoKHBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9PQorCSAgICAgVFJVRSkgLyomJiAocEFkLT5UeFN3UXVldWVbQnVsa091dFBpcGVJZF0uTnVtYmVyID09IDApICovICkgeworCQlpZiAoKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA8CisJCSAgICAgcEhUVFhDb250ZXh0LT5FTmV4dEJ1bGtPdXRQb3NpdGlvbikKKwkJICAgICYmCisJCSAgICAoKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsKKwkJICAgICAgIE1BWF9BR0dSRUdBVElPTl9TSVpFKSA8IE1BWF9UWEJVTEtfTElNSVQpCisJCSAgICAgfHwgKHBIVFRYQ29udGV4dC0+Q3VyV3JpdGVQb3NpdGlvbiA+CisJCQkgTUFYX0FHR1JFR0FUSU9OX1NJWkUpKSkgewogCQkJbmVlZFF1ZUJhY2sgPSBUUlVFOwotCQl9Ci0JCWVsc2UgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPiBwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uKSAmJgotCQkJCSAoKHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24gKyBNQVhfQUdHUkVHQVRJT05fU0laRSkgPCBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKQotCQl7CisJCX0gZWxzZQorCQkgICAgaWYgKChwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24gPgorCQkJIHBIVFRYQ29udGV4dC0+RU5leHRCdWxrT3V0UG9zaXRpb24pCisJCQkmJgorCQkJKChwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uICsKKwkJCSAgTUFYX0FHR1JFR0FUSU9OX1NJWkUpIDwKKwkJCSBwSFRUWENvbnRleHQtPkN1cldyaXRlUG9zaXRpb24pKSB7CiAJCQluZWVkUXVlQmFjayA9IFRSVUU7CiAJCX0KIAl9CkBAIC0xNTIsNyArMTc2LDYgQEAKIAogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE2OCwyMSArMTkxLDE3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lECVJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCit2b2lkIFJUVVNCUmVqZWN0UGVuZGluZ1BhY2tldHMoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkKQogewotCVVDSEFSCQkJSW5kZXg7Ci0JUFFVRVVFX0VOVFJZCXBFbnRyeTsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLQlQUVVFVUVfSEVBREVSCXBRdWV1ZTsKKwl1OCBJbmRleDsKKwlzdHJ1Y3QgcnRfcXVldWVfZW50cnkgKnBFbnRyeTsKKwl2b2lkICpwUGFja2V0OworCXN0cnVjdCBydF9xdWV1ZV9oZWFkZXIgKnBRdWV1ZTsKIAotCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgNDsgSW5kZXgrKykKLQl7CisJZm9yIChJbmRleCA9IDA7IEluZGV4IDwgNDsgSW5kZXgrKykgewogCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbSW5kZXhdKTsKLQkJd2hpbGUgKHBBZC0+VHhTd1F1ZXVlW0luZGV4XS5IZWFkICE9IE5VTEwpCi0JCXsKLQkJCXBRdWV1ZSA9IChQUVVFVUVfSEVBREVSKSAmKHBBZC0+VHhTd1F1ZXVlW0luZGV4XSk7CisJCXdoaWxlIChwQWQtPlR4U3dRdWV1ZVtJbmRleF0uSGVhZCAhPSBOVUxMKSB7CisJCQlwUXVldWUgPSAoc3RydWN0IHJ0X3F1ZXVlX2hlYWRlciAqKSYgKHBBZC0+VHhTd1F1ZXVlW0luZGV4XSk7CiAJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKIAkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKIAkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKQEAgLTE5MywyMCArMjEyLDQ2IEBACiAKIH0KIAotVk9JRCBSVE1QV3JpdGVUeEluZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYSU5GT19TVFJVQyAJcFR4SW5mbywKLQlJTgkgIFVTSE9SVAkJVVNCRE1BcGt0TGVuLAotCUlOCSAgQk9PTEVBTgkJYldpdiwKLQlJTgkgIFVDSEFSCQkJUXVldWVTZWwsCi0JSU4JICBVQ0hBUgkJCU5leHRWYWxpZCwKLQlJTgkgIFVDSEFSCQkJVHhCdXJzdCkKKy8qCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlSb3V0aW5lCURlc2NyaXB0aW9uOgorCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCisJd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KKworCUFyZ3VtZW50czoKKwkJcFR4RAkJUG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yCisJCUFjawkJCVNldHRpbmcgZm9yIEFjayByZXF1aXJlbWVudCBiaXQKKwkJRnJhZ21lbnQJU2V0dGluZyBmb3IgRnJhZ21lbnQgYml0CisJCVJldHJ5TW9kZQlTZXR0aW5nIGZvciByZXRyeSBtb2RlCisJCUlmcwkJCVNldHRpbmcgZm9yIElGUyBnYXAKKwkJUmF0ZQkJU2V0dGluZyBmb3IgdHJhbnNtaXQgcmF0ZQorCQlTZXJ2aWNlCQlTZXR0aW5nIGZvciBzZXJ2aWNlCisJCUxlbmd0aAkJRnJhbWUgbGVuZ3RoCisJCVR4UHJlYW1ibGUgIFNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKKwkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMworCisJUmV0dXJuIFZhbHVlOgorCQlOb25lCisKKwlJUlFMID0gUEFTU0lWRV9MRVZFTAorCUlSUUwgPSBESVNQQVRDSF9MRVZFTAorCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCit2b2lkIFJUTVBXcml0ZVR4SW5mbyhzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCSAgICAgc3RydWN0IHJ0X3R4aW5mbyAqcFR4SW5mbywKKwkJICAgICB1MTYgVVNCRE1BcGt0TGVuLAorCQkgICAgIElOIEJPT0xFQU4gYldpdiwKKwkJICAgICB1OCBRdWV1ZVNlbCwgdTggTmV4dFZhbGlkLCB1OCBUeEJ1cnN0KQogewogCXBUeEluZm8tPlVTQkRNQVR4UGt0TGVuID0gVVNCRE1BcGt0TGVuOwogCXBUeEluZm8tPlFTRUwgPSBRdWV1ZVNlbDsKIAlpZiAoUXVldWVTZWwgIT0gRklGT19FRENBKQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBRdWV1ZVNlbCAhPSBGSUZPX0VEQ0E8PT09PT09PT09PT09XG4iKSk7Ci0JcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IEZBTFNFOyAvL05leHRWYWxpZDsgIC8vIE5lZWQgdG8gY2hlY2sgd2l0aCBKYW4gYWJvdXQgdGhpcy4KKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCI9PT09PiBRdWV1ZVNlbCAhPSBGSUZPX0VEQ0E8PT09PT09PT09PT09XG4iKSk7CisJcFR4SW5mby0+VVNCRE1BTmV4dFZMRCA9IEZBTFNFOwkvKk5leHRWYWxpZDsgIC8vIE5lZWQgdG8gY2hlY2sgd2l0aCBKYW4gYWJvdXQgdGhpcy4gKi8KIAlwVHhJbmZvLT5VU0JETUFUeGJ1cnN0ID0gVHhCdXJzdDsKIAlwVHhJbmZvLT5XSVYgPSBiV2l2OwogCXBUeEluZm8tPlN3VXNlTGFzdFJvdW5kID0gMDsKQEAgLTIxNCwzICsyNTksNCBAQAogCXBUeEluZm8tPnJzdjIgPSAwOwogfQogCisjZW5kaWYgLyogUlRNUF9NQUNfVVNCIC8vICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9jb21tb24vcnR1c2JfaW8uYwppbmRleCAxZDY5NTkwLi4zNDQ0M2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL2NvbW1vbi9ydHVzYl9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvY29tbW9uL3J0dXNiX2lvLmMKQEAgLTM2LDggKzM2LDkgQEAKIAlQYXVsIExpbiAgICAwNi0yNS0yMDA0ICBjcmVhdGVkCiAqLwogCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCisjaWZkZWYgUlRNUF9NQUNfVVNCCiAKKyNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKIAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTU1LDI2ICs1NiwxOCBAQAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KIAotTlRTVEFUVVMJUlRVU0JGaXJtd2FyZVJ1bigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3N0YXRpYyBpbnQgUlRVU0JGaXJtd2FyZVJ1bihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzOworCWludCBTdGF0dXM7CiAKLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKLQkJMHgwMSwKLQkJMHg4LAotCQkwLAotCQlOVUxMLAotCQkwKTsKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KHBBZCwKKwkJCQkgICAgIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCQkJICAgICAweDAxLCAweDgsIDAsIE5VTEwsIDApOwogCiAJcmV0dXJuIFN0YXR1czsKIH0KIAotCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTkwLDE5ICs4MywxNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMgUlRVU0JGaXJtd2FyZVdyaXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUgkJcEZ3SW1hZ2UsCi0JSU4gVUxPTkcJCUZ3TGVuKQoraW50IFJUVVNCRmlybXdhcmVXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgdTggKnBGd0ltYWdlLCB1bnNpZ25lZCBsb25nIEZ3TGVuKQogewotCVVJTlQzMgkJTWFjUmVnOwotCU5UU1RBVFVTIAlTdGF0dXM7Ci0vLwlVTE9ORyAJCWk7Ci0JVVNIT1JUCQl3cml0ZUxlbjsKKwl1MzIgTWFjUmVnOworCWludCBTdGF0dXM7CisvKiAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGk7ICovCisJdTE2IHdyaXRlTGVuOwogCiAJU3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBNQUNfQ1NSMCwgJk1hY1JlZyk7CiAKLQogCXdyaXRlTGVuID0gRndMZW47CiAJUlRVU0JNdWx0aVdyaXRlKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSwgcEZ3SW1hZ2UsIHdyaXRlTGVuKTsKIApAQCAtMTEwLDY2ICsxMDAsMjggQEAKIAlTdGF0dXMgPSBSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMWMsIDB4ZmZmZmZmZmYpOwogCVN0YXR1cyA9IFJUVVNCRmlybXdhcmVSdW4ocEFkKTsKIAorCS8qMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnPC0tICovCiAJUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0JUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCxIMk1fTUFJTEJPWF9DU1IsMCk7Ci0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDcyLCAweDAwLCAweDAwLCAweDAwKTsvL3Jlc2V0IHJmIGJ5IE1DVSBzdXBwb3J0ZWQgYnkgbmV3IGZpcm13YXJlCisJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgSDJNX01BSUxCT1hfQ1NSLCAwKTsKKwlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDApOwkvKnJlc2V0IHJmIGJ5IE1DVSBzdXBwb3J0ZWQgYnkgbmV3IGZpcm13YXJlICovCisJLyoyMDA4LzExLzI4OktIIGFkZCB0byBmaXggdGhlIGRlYWQgcmYgZnJlcXVlbmN5IG9mZnNldCBidWctLT4gKi8KIAogCXJldHVybiBTdGF0dXM7CiB9CiAKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246IEdldCBjdXJyZW50IGZpcm13YXJlIG9wZXJhdGlvbiBtb2RlIChSZXR1cm4gVmFsdWUpCi0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCTAgb3IgMSA9IERvd25sb2FkZWQgYnkgaG9zdCBkcml2ZXIKLQkJb3RoZXJzID0gRHJpdmVyIGRvZXNuJ3QgZG93bmxvYWQgZmlybXdhcmUKLQotCUlSUUwgPQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTCVJUVVNCRmlybXdhcmVPcG1vZGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBVSU5UMzIJCQlwVmFsdWUpCitpbnQgUlRVU0JWZW5kZXJSZXNldChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzOwotCi0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAotCQkweDEsCi0JCTB4MTEsCi0JCTAsCi0JCXBWYWx1ZSwKLQkJNCk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLU5UU1RBVFVTCVJUVVNCVmVuZGVyUmVzZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JTlRTVEFUVVMJU3RhdHVzOworCWludCBTdGF0dXM7CiAJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIi0tPlJUVVNCVmVuZGVyUmVzZXRcbiIpKTsKLQlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KAotCQlwQWQsCi0JCVVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCwKLQkJMHgwMSwKLQkJMHgxLAotCQkwLAotCQlOVUxMLAotCQkwKTsKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KHBBZCwKKwkJCQkgICAgIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCQkJICAgICAweDAxLCAweDEsIDAsIE5VTEwsIDApOwogCiAJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIjwtLVJUVVNCVmVuZGVyUmVzZXRcbiIpKTsKIAlyZXR1cm4gU3RhdHVzOwogfQorCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xODUsMjMgKzEzNywxNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JNdWx0aVJlYWQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpCitpbnQgUlRVU0JNdWx0aVJlYWQoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCi0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAotCQkweDcsCi0JCTAsCi0JCU9mZnNldCwKLQkJcERhdGEsCi0JCWxlbmd0aCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICAoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfAorCQkJCSAgICAgIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLCAweDcsIDAsIE9mZnNldCwKKwkJCQkgICAgIHBEYXRhLCBsZW5ndGgpOwogCiAJcmV0dXJuIFN0YXR1czsKIH0KQEAgLTIyMSw3NyArMTY2LDU2IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQk11bHRpV3JpdGVfT25lQnl0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEpCitpbnQgUlRVU0JNdWx0aVdyaXRlX09uZUJ5dGUoc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJCSB1MTYgT2Zmc2V0LCB1OCAqcERhdGEpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzOworCWludCBTdGF0dXM7CiAKLQkvLyBUT0RPOiBJbiAyODcwLCB1c2UgdGhpcyBmdW5jaXRvbiBjYXJlZnVsbHkgY2F1c2UgaXQncyBub3Qgc3RhYmxlLgotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAotCQkweDYsCi0JCTAsCi0JCU9mZnNldCwKLQkJcERhdGEsCi0JCTEpOworCS8qIFRPRE86IEluIDI4NzAsIHVzZSB0aGlzIGZ1bmNpdG9uIGNhcmVmdWxseSBjYXVzZSBpdCdzIG5vdCBzdGFibGUuICovCisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHg2LCAwLCBPZmZzZXQsIHBEYXRhLCAxKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKLU5UU1RBVFVTCVJUVVNCTXVsdGlXcml0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKQoraW50IFJUVVNCTXVsdGlXcml0ZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgdTE2IE9mZnNldCwgdTggKnBEYXRhLCB1MTYgbGVuZ3RoKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCisJdTE2IGluZGV4ID0gMCwgVmFsdWU7CisJdTggKnBTcmMgPSBwRGF0YTsKKwl1MTYgcmVzdWRlID0gMDsKIAotICAgICAgICBVU0hPUlQgICAgICAgICAgaW5kZXggPSAwLFZhbHVlOwotICAgICAgICBQVUNIQVIgICAgICAgICAgcFNyYyA9IHBEYXRhOwotICAgICAgICBVU0hPUlQgICAgICAgICAgcmVzdWRlID0gMDsKLQotICAgICAgICByZXN1ZGUgPSBsZW5ndGggJSAyOwotCQlsZW5ndGggICs9IHJlc3VkZTsKLQkJZG8KLQkJewotCQkJVmFsdWUgPShVU0hPUlQpKCAqcFNyYyAgfCAoKihwU3JjICsgMSkgPDwgOCkpOwotCQlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCxPZmZzZXQgKyBpbmRleCxWYWx1ZSk7Ci0gICAgICAgICAgICBpbmRleCArPTI7Ci0gICAgICAgICAgICBsZW5ndGggLT0gMjsKLSAgICAgICAgICAgIHBTcmMgPSBwU3JjICsgMjsKLSAgICAgICAgfXdoaWxlKGxlbmd0aCA+IDApOworCXJlc3VkZSA9IGxlbmd0aCAlIDI7CisJbGVuZ3RoICs9IHJlc3VkZTsKKwlkbyB7CisJCVZhbHVlID0gKHUxNikoKnBTcmMgfCAoKihwU3JjICsgMSkgPDwgOCkpOworCQlTdGF0dXMgPSBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0ICsgaW5kZXgsIFZhbHVlKTsKKwkJaW5kZXggKz0gMjsKKwkJbGVuZ3RoIC09IDI7CisJCXBTcmMgPSBwU3JjICsgMjsKKwl9IHdoaWxlIChsZW5ndGggPiAwKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKLQotTlRTVEFUVVMgUlRVU0JTaW5nbGVXcml0ZSgKLQlJTiAJUlRNUF9BREFQVEVSIAkqcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglVU0hPUlQJCQlWYWx1ZSkKK2ludCBSVFVTQlNpbmdsZVdyaXRlKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgdTE2IE9mZnNldCwgdTE2IFZhbHVlKQogewotCU5UU1RBVFVTCVN0YXR1czsKKwlpbnQgU3RhdHVzOwogCi0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCi0JCTB4MiwKLQkJVmFsdWUsCi0JCU9mZnNldCwKLQkJTlVMTCwKLQkJMCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHgyLCBWYWx1ZSwgT2Zmc2V0LCBOVUxMLCAwKTsKIAogCXJldHVybiBTdGF0dXM7CiAKIH0KIAotCiAvKgogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zMDcsMzQgKzIzMSwyNiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JSZWFkTUFDUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCU9VVAlQVUlOVDMyCQkJcFZhbHVlKQoraW50IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgIHUxNiBPZmZzZXQsIHUzMiAqcFZhbHVlKQogewotCU5UU1RBVFVTCVN0YXR1czsKLQlVSU5UMzIJCWxvY2FsVmFsOworCWludCBTdGF0dXMgPSAwOworCXUzMiBsb2NhbFZhbDsKIAotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSyksCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwKLQkJMHg3LAotCQkwLAotCQlPZmZzZXQsCi0JCSZsb2NhbFZhbCwKLQkJNCk7CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICAoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfAorCQkJCSAgICAgIFVTQkRfU0hPUlRfVFJBTlNGRVJfT0spLAorCQkJCSAgICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLCAweDcsIDAsIE9mZnNldCwKKwkJCQkgICAgICZsb2NhbFZhbCwgNCk7CiAKIAkqcFZhbHVlID0gbGUyY3B1MzIobG9jYWxWYWwpOwogCi0KIAlpZiAoU3RhdHVzIDwgMCkKIAkJKnBWYWx1ZSA9IDB4ZmZmZmZmZmY7CiAKIAlyZXR1cm4gU3RhdHVzOwogfQogCi0KIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTM1MCwyNSArMjY2LDIyIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQldyaXRlTUFDUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVVJTlQzMgkJCVZhbHVlKQoraW50IFJUVVNCV3JpdGVNQUNSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICAgdTE2IE9mZnNldCwgdTMyIFZhbHVlKQogewotCU5UU1RBVFVTCVN0YXR1czsKLQlVSU5UMzIJCWxvY2FsVmFsOworCWludCBTdGF0dXM7CisJdTMyIGxvY2FsVmFsOwogCiAJbG9jYWxWYWwgPSBWYWx1ZTsKIAotCVN0YXR1cyA9IFJUVVNCU2luZ2xlV3JpdGUocEFkLCBPZmZzZXQsIChVU0hPUlQpKGxvY2FsVmFsICYgMHhmZmZmKSk7Ci0JU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCArIDIsIChVU0hPUlQpKChsb2NhbFZhbCAmIDB4ZmZmZjAwMDApID4+IDE2KSk7CisJU3RhdHVzID0gUlRVU0JTaW5nbGVXcml0ZShwQWQsIE9mZnNldCwgKHUxNikobG9jYWxWYWwgJiAweGZmZmYpKTsKKwlTdGF0dXMgPQorCSAgICBSVFVTQlNpbmdsZVdyaXRlKHBBZCwgT2Zmc2V0ICsgMiwKKwkJCSAgICAgKHUxNikoKGxvY2FsVmFsICYgMHhmZmZmMDAwMCkgPj4gMTYpKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CiAKLQotCi0jaWYgMQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMzg0LDEzOSArMjk3LDc3IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQlJlYWRCQlBSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUlkLAotCUlOCVBVQ0hBUgkJCXBWYWx1ZSkKK2ludCBSVFVTQlJlYWRCQlBSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgICB1OCBJZCwgdTggKnBWYWx1ZSkKIHsKLQlCQlBfQ1NSX0NGR19TVFJVQwlCYnBDc3I7Ci0JVUlOVAkJCWkgPSAwOwotCU5UU1RBVFVTCQlzdGF0dXM7CisJQkJQX0NTUl9DRkdfU1RSVUMgQmJwQ3NyOworCXUzMiBpID0gMDsKKwlpbnQgc3RhdHVzOwogCi0JLy8gVmVyaWZ5IHRoZSBidXN5IGNvbmRpdGlvbgotCWRvCi0JeworCS8qIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24gKi8KKwlkbyB7CiAJCXN0YXR1cyA9IFJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7Ci0JCWlmKHN0YXR1cyA+PSAwKQotCQl7Ci0JCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQotCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCisJCQkJYnJlYWs7CiAJCX0KLQkJcHJpbnRrKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18xKTpyZXRyeSBjb3VudD0lZCFcbiIsIGkpOworCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCSAoIlJUVVNCUmVhZEJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHXzEpOnJldHJ5IGNvdW50PSVkIVxuIiwKKwkJCSAgaSkpOwogCQlpKys7Ci0JfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOworCX0gd2hpbGUgKChpIDwgUkVUUllfTElNSVQpCisJCSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwogCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCS8vCi0JCS8vIFJlYWQgZmFpbGVkIHRoZW4gUmV0dXJuIERlZmF1bHQgdmFsdWUuCi0JCS8vCisJaWYgKChpID09IFJFVFJZX0xJTUlUKQorCSAgICB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQkvKiAqLworCQkvKiBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLiAqLworCQkvKiAqLwogCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKIAotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQotCi0JLy8gUHJlcGFyZSBmb3Igd3JpdGUgbWF0ZXJpYWwKLQlCYnBDc3Iud29yZCAJCQkJPSAwOwotCUJicENzci5maWVsZC5mUmVhZAkJCT0gMTsKLQlCYnBDc3IuZmllbGQuQnVzeQkJCT0gMTsKLQlCYnBDc3IuZmllbGQuUmVnTnVtIAkJPSBJZDsKKwkvKiBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbCAqLworCUJicENzci53b3JkID0gMDsKKwlCYnBDc3IuZmllbGQuZlJlYWQgPSAxOworCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7CiAJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsKIAogCWkgPSAwOwotCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KLQlkbwotCXsKKwkvKiBWZXJpZnkgdGhlIGJ1c3kgY29uZGl0aW9uICovCisJZG8gewogCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIEJCUF9DU1JfQ0ZHLCAmQmJwQ3NyLndvcmQpOwotCQlpZiAoc3RhdHVzID49IDApCi0JCXsKLQkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCi0JCXsKLQkJCSpwVmFsdWUgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJfQotCQlwcmludGsoIlJUVVNCUmVhZEJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHXzIpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7Ci0JCWkrKzsKLQl9Ci0Jd2hpbGUgKChpIDwgUkVUUllfTElNSVQpICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSk7Ci0KLQlpZiAoKGkgPT0gUkVUUllfTElNSVQpIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJLy8KLQkJLy8gUmVhZCBmYWlsZWQgdGhlbiBSZXR1cm4gRGVmYXVsdCB2YWx1ZS4KLQkJLy8KLQkJKnBWYWx1ZSA9IHBBZC0+QmJwV3JpdGVMYXRjaFtJZF07Ci0KLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJldHJ5IGNvdW50IGV4aGF1c3RlZCBvciBkZXZpY2UgcmVtb3ZlZCEhIVxuIikpOwotCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKLQl9Ci0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0jZWxzZQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgOC1iaXQgQkJQIHJlZ2lzdGVyIHZpYSBmaXJtd2FyZQotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMJUlRVU0JSZWFkQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpCi17Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCWludAkJCQkJaSwgazsKLQlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQotCXsKLQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwotCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkKLQkJewotCQkJY29udGludWU7Ci0JCX0KLQkJQmJwQ3NyLndvcmQgPSAwOwotCQlCYnBDc3IuZmllbGQuZlJlYWQgPSAxOwotCQlCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOwotCQlCYnBDc3IuZmllbGQuQnVzeSA9IDE7Ci0JCUJicENzci5maWVsZC5SZWdOdW0gPSBJZDsKLQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsKLQkJZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykKLQkJewotCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwotCQkJaWYgKEJicENzci5maWVsZC5CdXN5ID09IElETEUpCisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpIHsKKwkJCQkqcFZhbHVlID0gKHU4KUJicENzci5maWVsZC5WYWx1ZTsKIAkJCQlicmVhazsKKwkJCX0KIAkJfQotCQlpZiAoKEJicENzci5maWVsZC5CdXN5ID09IElETEUpICYmCi0JCQkoQmJwQ3NyLmZpZWxkLlJlZ051bSA9PSBJZCkpCi0JCXsKLQkJCSpwVmFsdWUgPSAoVUNIQVIpQmJwQ3NyLmZpZWxkLlZhbHVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpCi0JewotCQlEQkdQUklOVF9FUlIoKCJCQlAgcmVhZCBSJWQ9MHgleCBmYWlsXG4iLCBJZCwgQmJwQ3NyLndvcmQpKTsKKwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkgKCJSVFVTQlJlYWRCQlBSZWdpc3RlcihCQlBfQ1NSX0NGR18yKTpyZXRyeSBjb3VudD0lZCFcbiIsCisJCQkgIGkpKTsKKwkJaSsrOworCX0gd2hpbGUgKChpIDwgUkVUUllfTElNSVQpCisJCSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOworCisJaWYgKChpID09IFJFVFJZX0xJTUlUKQorCSAgICB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQkvKiAqLworCQkvKiBSZWFkIGZhaWxlZCB0aGVuIFJldHVybiBEZWZhdWx0IHZhbHVlLiAqLworCQkvKiAqLwogCQkqcFZhbHVlID0gcEFkLT5CYnBXcml0ZUxhdGNoW0lkXTsKKworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CiAJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogCX0KKwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KLSNlbmRpZgogCi0jaWYgMQogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNTMyLDk1ICszODMsNDYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCV3JpdGVCQlBSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUlkLAotCUlOCVVDSEFSCQkJVmFsdWUpCitpbnQgUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgICAgICB1OCBJZCwgdTggVmFsdWUpCiB7Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCVVJTlQJCQlpID0gMDsKLQlOVFNUQVRVUwkJc3RhdHVzOwotCS8vIFZlcmlmeSB0aGUgYnVzeSBjb25kaXRpb24KLQlkbwotCXsKKwlCQlBfQ1NSX0NGR19TVFJVQyBCYnBDc3I7CisJdTMyIGkgPSAwOworCWludCBzdGF0dXM7CisJLyogVmVyaWZ5IHRoZSBidXN5IGNvbmRpdGlvbiAqLworCWRvIHsKIAkJc3RhdHVzID0gUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsKLQkJaWYgKHN0YXR1cyA+PSAwKQotCQl7Ci0JCWlmICghKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpKQotCQkJYnJlYWs7CisJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJaWYgKCEoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkpCisJCQkJYnJlYWs7CiAJCX0KLQkJcHJpbnRrKCJSVFVTQldyaXRlQkJQUmVnaXN0ZXIoQkJQX0NTUl9DRkcpOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JXcml0ZUJCUFJlZ2lzdGVyKEJCUF9DU1JfQ0ZHKTpyZXRyeSBjb3VudD0lZCFcbiIsCisJCQkgIGkpKTsKIAkJaSsrOwogCX0KLQl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKKwl3aGlsZSAoKGkgPCBSRVRSWV9MSU1JVCkKKwkgICAgICAgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKTsKIAotCWlmICgoaSA9PSBSRVRSWV9MSU1JVCkgfHwgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CisJaWYgKChpID09IFJFVFJZX0xJTUlUKQorCSAgICB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkgeworCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsCisJCQkgICAgICgiUmV0cnkgY291bnQgZXhoYXVzdGVkIG9yIGRldmljZSByZW1vdmVkISEhXG4iKSk7CiAJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogCX0KLQotCS8vIFByZXBhcmUgZm9yIHdyaXRlIG1hdGVyaWFsCi0JQmJwQ3NyLndvcmQgCQkJCT0gMDsKLQlCYnBDc3IuZmllbGQuZlJlYWQJCQk9IDA7Ci0JQmJwQ3NyLmZpZWxkLlZhbHVlCQkJPSBWYWx1ZTsKLQlCYnBDc3IuZmllbGQuQnVzeQkJCT0gMTsKLQlCYnBDc3IuZmllbGQuUmVnTnVtIAkJPSBJZDsKKwkvKiBQcmVwYXJlIGZvciB3cml0ZSBtYXRlcmlhbCAqLworCUJicENzci53b3JkID0gMDsKKwlCYnBDc3IuZmllbGQuZlJlYWQgPSAwOworCUJicENzci5maWVsZC5WYWx1ZSA9IFZhbHVlOworCUJicENzci5maWVsZC5CdXN5ID0gMTsKKwlCYnBDc3IuZmllbGQuUmVnTnVtID0gSWQ7CiAJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsKIAogCXBBZC0+QmJwV3JpdGVMYXRjaFtJZF0gPSBWYWx1ZTsKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KLSNlbHNlCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0JUm91dGluZSBEZXNjcmlwdGlvbjogV3JpdGUgOC1iaXQgQkJQIHJlZ2lzdGVyIHZpYSBmaXJtd2FyZQotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1OVFNUQVRVUwlSVFVTQldyaXRlQkJQUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlJZCwKLQlJTglVQ0hBUgkJCVZhbHVlKQotCi17Ci0JQkJQX0NTUl9DRkdfU1RSVUMJQmJwQ3NyOwotCWludAkJCQkJQnVzeUNudDsKLQlmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAmQmJwQ3NyLndvcmQpOwotCQlpZiAoQmJwQ3NyLmZpZWxkLkJ1c3kgPT0gQlVTWSkKLQkJCWNvbnRpbnVlOwotCQlCYnBDc3Iud29yZCA9IDA7Ci0JCUJicENzci5maWVsZC5mUmVhZCA9IDA7Ci0JCUJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7Ci0JCUJicENzci5maWVsZC5CdXN5ID0gMTsKLQkJQmJwQ3NyLmZpZWxkLlZhbHVlID0gVmFsdWU7Ci0JCUJicENzci5maWVsZC5SZWdOdW0gPSBJZDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX0JCUF9BR0VOVCwgQmJwQ3NyLndvcmQpOwotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODAsIDB4ZmYsIDB4MCwgMHgwKTsKLQkJcEFkLT5CYnBXcml0ZUxhdGNoW0lkXSA9IFZhbHVlOwotCQlicmVhazsKLQl9Ci0JaWYgKEJ1c3lDbnQgPT0gTUFYX0JVU1lfQ09VTlQpCi0JewotCQlEQkdQUklOVF9FUlIoKCJCQlAgd3JpdGUgUiVkPTB4JXggZmFpbFxuIiwgSWQsIEJicENzci53b3JkKSk7Ci0JCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwotCX0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0jZW5kaWYKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTYzNiwzMSArNDM4LDMxIEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQldyaXRlUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVSU5UMzIJCQlWYWx1ZSkKK2ludCBSVFVTQldyaXRlUkZSZWdpc3RlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsIHUzMiBWYWx1ZSkKIHsKLQlQSFlfQ1NSNF9TVFJVQwlQaHlDc3I0OwotCVVJTlQJCQlpID0gMDsKLQlOVFNUQVRVUwkJc3RhdHVzOworCVBIWV9DU1I0X1NUUlVDIFBoeUNzcjQ7CisJdTMyIGkgPSAwOworCWludCBzdGF0dXM7CiAKIAlOZGlzWmVyb01lbW9yeSgmUGh5Q3NyNCwgc2l6ZW9mKFBIWV9DU1I0X1NUUlVDKSk7Ci0JZG8KLQl7CisJZG8gewogCQlzdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFJGX0NTUl9DRkcwLCAmUGh5Q3NyNC53b3JkKTsKLQkJaWYgKHN0YXR1cyA+PSAwKQotCQl7Ci0JCWlmICghKFBoeUNzcjQuZmllbGQuQnVzeSkpCi0JCQlicmVhazsKKwkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQlpZiAoIShQaHlDc3I0LmZpZWxkLkJ1c3kpKQorCQkJCWJyZWFrOwogCQl9Ci0JCXByaW50aygiUlRVU0JXcml0ZVJGUmVnaXN0ZXIoUkZfQ1NSX0NGRzApOnJldHJ5IGNvdW50PSVkIVxuIiwgaSk7CisJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJICgiUlRVU0JXcml0ZVJGUmVnaXN0ZXIoUkZfQ1NSX0NGRzApOnJldHJ5IGNvdW50PSVkIVxuIiwKKwkJCSAgaSkpOwogCQlpKys7CiAJfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOworCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKQorCSAgICAgICAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwogCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKKwlpZiAoKGkgPT0gUkVUUllfTElNSVQpCisJICAgIHx8IChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSB7CisJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwKKwkJCSAgICAgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKIAkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7CiAJfQogCkBAIC02NzIsMTE1ICs0NzQsNiBAQAogLyoKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotCVJvdXRpbmUgRGVzY3JpcHRpb246IFdyaXRlIFJUMzB4eCBSRiByZWdpc3RlciB0aHJvdWdoIE1BQwotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JSVJRTCA9Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTlRTVEFUVVMgUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmVnSUQsCi0JSU4JVUNIQVIJCQlWYWx1ZSkKLXsKLQlSRl9DU1JfQ0ZHX1NUUlVDCXJmY3NyOwotCVVJTlQJCQkJaSA9IDA7Ci0KLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7Ci0KLQkJaWYgKCFyZmNzci5maWVsZC5SRl9DU1JfS0lDSykKLQkJCWJyZWFrOwotCQlpKys7Ci0JfQotCXdoaWxlICgoaSA8IFJFVFJZX0xJTUlUKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpOwotCi0JaWYgKChpID09IFJFVFJZX0xJTUlUKSB8fCAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJSZXRyeSBjb3VudCBleGhhdXN0ZWQgb3IgZGV2aWNlIHJlbW92ZWQhISFcbiIpKTsKLQkJcmV0dXJuIFNUQVRVU19VTlNVQ0NFU1NGVUw7Ci0JfQotCi0JcmZjc3IuZmllbGQuUkZfQ1NSX1dSID0gMTsKLQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7Ci0JcmZjc3IuZmllbGQuVEVTVENTUl9SRkFDQ19SRUdOVU0gPSBSZWdJRDsKLQlyZmNzci5maWVsZC5SRl9DU1JfREFUQSA9IFZhbHVlOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUkZfQ1NSX0NGRywgcmZjc3Iud29yZCk7Ci0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246IFJlYWQgUlQzMHh4IFJGIHJlZ2lzdGVyIHRocm91Z2ggTUFDCi0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlJUlFMID0KLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1OVFNUQVRVUyBSVDMweHhSZWFkUkZSZWdpc3RlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJlZ0lELAotCUlOCVBVQ0hBUgkJCXBWYWx1ZSkKLXsKLQlSRl9DU1JfQ0ZHX1NUUlVDCXJmY3NyOwotCVVJTlQJCQkJaT0wLCBrPTA7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfQlVTWV9DT1VOVDsgaSsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBSRl9DU1JfQ0ZHLCAmcmZjc3Iud29yZCk7Ci0KLQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IEJVU1kpCi0JCXsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXJmY3NyLndvcmQgPSAwOwotCQlyZmNzci5maWVsZC5SRl9DU1JfV1IgPSAwOwotCQlyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9IDE7Ci0JCXJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID0gUmVnSUQ7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJGX0NTUl9DRkcsIHJmY3NyLndvcmQpOwotCQlmb3IgKGs9MDsgazxNQVhfQlVTWV9DT1VOVDsgaysrKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFJGX0NTUl9DRkcsICZyZmNzci53b3JkKTsKLQotCQkJaWYgKHJmY3NyLmZpZWxkLlJGX0NTUl9LSUNLID09IElETEUpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBJRExFKSAmJgotCQkJKHJmY3NyLmZpZWxkLlRFU1RDU1JfUkZBQ0NfUkVHTlVNID09IFJlZ0lEKSkKLQkJewotCQkJKnBWYWx1ZSA9IChVQ0hBUilyZmNzci5maWVsZC5SRl9DU1JfREFUQTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChyZmNzci5maWVsZC5SRl9DU1JfS0lDSyA9PSBCVVNZKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUkYgcmVhZCBSJWQ9MHgleCBmYWlsLCBpWyVkXSwga1slZF1cbiIsIFJlZ0lELCByZmNzci53b3JkLGksaykpOwotCQlyZXR1cm4gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKLQl9Ci0KLQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KIAlSb3V0aW5lIERlc2NyaXB0aW9uOgogCiAJQXJndW1lbnRzOgpAQCAtNzkzLDI4ICs0ODYsMTYgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTCVJUVVNCUmVhZEVFUFJPTSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCkKK2ludCBSVFVTQlJlYWRFRVBST00oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJIHUxNiBPZmZzZXQsIHU4ICpwRGF0YSwgdTE2IGxlbmd0aCkKIHsKLQlOVFNUQVRVUwlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwlpbnQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAKLQlpZihwQWQtPmJVc2VFZnVzZSkKLQkJU3RhdHVzID1lRnVzZVJlYWQocEFkLCBPZmZzZXQsIHBEYXRhLCBsZW5ndGgpOwotCWVsc2UKLQl7Ci0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQkoVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4gfCBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKLQkJREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOLAotCQkweDksCi0JCTAsCi0JCU9mZnNldCwKLQkJcERhdGEsCi0JCWxlbmd0aCk7Ci0JfQorCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QocEFkLAorCQkJCSAgICAgKFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX0lOIHwKKwkJCQkgICAgICBVU0JEX1NIT1JUX1RSQU5TRkVSX09LKSwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTiwgMHg5LCAwLCBPZmZzZXQsCisJCQkJICAgICBwRGF0YSwgbGVuZ3RoKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC04MzQsMzIgKzUxNSwzMyBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMJUlRVU0JXcml0ZUVFUFJPTSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVVNIT1JUCQkJbGVuZ3RoKQoraW50IFJUVVNCV3JpdGVFRVBST00oc3RydWN0IHJ0X3J0bXBfYWRhcHRlciAqcEFkLAorCQkJICB1MTYgT2Zmc2V0LCB1OCAqcERhdGEsIHUxNiBsZW5ndGgpCiB7Ci0JTlRTVEFUVVMJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJaW50IFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCi0JaWYocEFkLT5iVXNlRWZ1c2UpCi0JCVN0YXR1cyA9IGVGdXNlV3JpdGUocEFkLCBPZmZzZXQsIHBEYXRhLCBsZW5ndGgpOwotCWVsc2UKLQl7Ci0JU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQkJcEFkLAotCQlVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCi0JCURFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCi0JCTB4OCwKLQkJMCwKLQkJT2Zmc2V0LAotCQlwRGF0YSwKLQkJbGVuZ3RoKTsKLQl9CisJU3RhdHVzID0gUlRVU0JfVmVuZG9yUmVxdWVzdChwQWQsCisJCQkJICAgICBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQsCisJCQkJICAgICBERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAorCQkJCSAgICAgMHg4LCAwLCBPZmZzZXQsIHBEYXRhLCBsZW5ndGgpOwogCiAJcmV0dXJuIFN0YXR1czsKIH0KIAoraW50IFJUVVNCUmVhZEVFUFJPTTE2KHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCSAgIHUxNiBvZmZzZXQsIHUxNiAqcERhdGEpCit7CisJaW50IHN0YXR1czsKKwl1MTYgbG9jYWxEYXRhOworCisJc3RhdHVzID0gUlRVU0JSZWFkRUVQUk9NKHBBZCwgb2Zmc2V0LCAodTggKikoJmxvY2FsRGF0YSksIDIpOworCWlmIChzdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCSpwRGF0YSA9IGxlMmNwdTE2KGxvY2FsRGF0YSk7CisKKwlyZXR1cm4gc3RhdHVzOworCit9CisKIC8qCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTg3NSwxNiArNTU3LDE1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1WT0lEIFJUVVNCUHV0VG9TbGVlcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK3ZvaWQgUlRVU0JQdXRUb1NsZWVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlVSU5UMzIJCXZhbHVlOworCXUzMiB2YWx1ZTsKIAotCS8vIFRpbWVvdXQgMHg0MCB4IDUwdXMKLQl2YWx1ZSA9IChTTEVFUENJRDw8MTYpKyhPV05FUk1DVTw8MjQpKyAoMHg0MDw8OCkrMTsKKwkvKiBUaW1lb3V0IDB4NDAgeCA1MHVzICovCisJdmFsdWUgPSAoU0xFRVBDSUQgPDwgMTYpICsgKE9XTkVSTUNVIDw8IDI0KSArICgweDQwIDw8IDgpICsgMTsKIAlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDcwMTAsIHZhbHVlKTsKIAlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCAweDQwNCwgMHgzMCk7Ci0JLy9SVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKTsKKwkvKlJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOyAqLwogCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJTbGVlcCBNYWlsYm94IHRlc3R2YWx1ZSAleFxuIiwgdmFsdWUpKTsKIAogfQpAQCAtOTA0LDIwICs1ODUsMTQgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5UU1RBVFVTIFJUVVNCV2FrZVVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQoraW50IFJUVVNCV2FrZVVwKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCkKIHsKLQlOVFNUQVRVUwlTdGF0dXM7CisJaW50IFN0YXR1czsKIAotCVN0YXR1cyA9IFJUVVNCX1ZlbmRvclJlcXVlc3QoCi0JCXBBZCwKLQkJVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fT1VULAotCQlERVZJQ0VfVkVORE9SX1JFUVVFU1RfT1VULAotCQkweDAxLAotCQkweDA5LAotCQkwLAotCQlOVUxMLAotCQkwKTsKKwlTdGF0dXMgPSBSVFVTQl9WZW5kb3JSZXF1ZXN0KHBBZCwKKwkJCQkgICAgIFVTQkRfVFJBTlNGRVJfRElSRUNUSU9OX09VVCwKKwkJCQkgICAgIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQsCisJCQkJICAgICAweDAxLCAweDA5LCAwLCBOVUxMLCAwKTsKIAogCXJldHVybiBTdGF0dXM7CiB9CkBAIC05MzcsMTMgKzYxMiwxMiBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotVk9JRAlSVFVTQkluaXRpYWxpemVDbWRRKAotCUlOCVBDbWRRCWNtZHEpCit2b2lkIFJUVVNCSW5pdGlhbGl6ZUNtZFEoc3RydWN0IHJ0X2NtZHEgKmNtZHEpCiB7CiAJY21kcS0+aGVhZCA9IE5VTEw7CiAJY21kcS0+dGFpbCA9IE5VTEw7CiAJY21kcS0+c2l6ZSA9IDA7Ci0JY21kcS0+Q21kUVN0YXRlID0gUlQyODcwX1RIUkVBRF9JTklURUQ7CisJY21kcS0+Q21kUVN0YXRlID0gUlRNUF9UQVNLX1NUQVRfSU5JVEVEOwogfQogCiAvKgpAQCAtOTYxLDQxICs2MzUsNDUgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTCVJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU5ESVNfT0lECQlPaWQsCi0JSU4JQk9PTEVBTgkJCVNldEluZm9ybWF0aW9uLAotCUlOCVBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAotCUlOCVVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKQoraW50IFJUVVNCRW5xdWV1ZUNtZEZyb21OZGlzKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgSU4gTkRJU19PSUQgT2lkLAorCQkJCSAgICBJTiBCT09MRUFOIFNldEluZm9ybWF0aW9uLAorCQkJCSAgICB2b2lkICpwSW5mb3JtYXRpb25CdWZmZXIsCisJCQkJICAgIHUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKIHsKLQlORElTX1NUQVRVUwlzdGF0dXM7Ci0JUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKmNtZHFlbG10ID0gTlVMTDsKKwlzdHJ1Y3QgcnRfcnRtcF9vc190YXNrICpwVGFzayA9ICZwQWQtPmNtZFFUYXNrOwogCi0JaWYgKHBpZF9ucihwT2JqLT5SVFVTQkNtZFRocl9waWQpID4gMCkKLQkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworI2lmZGVmIEtUSFJFQURfU1VQUE9SVAorCWlmIChwVGFzay0+a3RocmVhZF90YXNrID09IE5VTEwpCisjZWxzZQorCUNIRUNLX1BJRF9MRUdBTElUWShwVGFzay0+dGFza1BJRCkgeworCX0KKwllbHNlCisjZW5kaWYKKwlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CiAKLQlzdGF0dXMgPSBSVE1QQWxsb2NhdGVNZW1vcnkoKFBWT0lEICopJmNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpKTsKKwlzdGF0dXMgPSBvc19hbGxvY19tZW0ocEFkLCAodTggKiopICgmY21kcWVsbXQpLCBzaXplb2Yoc3RydWN0IHJ0X2NtZHFlbG10KSk7CiAJaWYgKChzdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykgfHwgKGNtZHFlbG10ID09IE5VTEwpKQogCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7CiAKLQkJY21kcWVsbXQtPmJ1ZmZlciA9IE5VTEw7Ci0JCWlmIChwSW5mb3JtYXRpb25CdWZmZXIgIT0gTlVMTCkKLQkJewotCQkJc3RhdHVzID0gUlRNUEFsbG9jYXRlTWVtb3J5KChQVk9JRCAqKSZjbWRxZWxtdC0+YnVmZmVyLCBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7Ci0JCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAoY21kcWVsbXQtPmJ1ZmZlciA9PSBOVUxMKSkKLQkJCXsKLQkJCQlrZnJlZShjbWRxZWxtdCk7Ci0JCQkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIHBJbmZvcm1hdGlvbkJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwotCQkJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aDsKLQkJCX0KKwljbWRxZWxtdC0+YnVmZmVyID0gTlVMTDsKKwlpZiAocEluZm9ybWF0aW9uQnVmZmVyICE9IE5VTEwpIHsKKwkJc3RhdHVzID0KKwkJICAgIG9zX2FsbG9jX21lbShwQWQsICh1OCAqKikgJiBjbWRxZWxtdC0+YnVmZmVyLAorCQkJCSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCSAgICB8fCAoY21kcWVsbXQtPmJ1ZmZlciA9PSBOVUxMKSkgeworCQkJa2ZyZWUoY21kcWVsbXQpOworCQkJcmV0dXJuIChORElTX1NUQVRVU19SRVNPVVJDRVMpOworCQl9IGVsc2UgeworCQkJTmRpc01vdmVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgcEluZm9ybWF0aW9uQnVmZmVyLAorCQkJCSAgICAgICBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCQljbWRxZWxtdC0+YnVmZmVybGVuZ3RoID0gSW5mb3JtYXRpb25CdWZmZXJMZW5ndGg7CiAJCX0KLQkJZWxzZQotCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IDA7CisJfSBlbHNlCisJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSAwOwogCiAJY21kcWVsbXQtPmNvbW1hbmQgPSBPaWQ7CiAJY21kcWVsbXQtPkNtZEZyb21OZGlzID0gVFJVRTsKQEAgLTEwMDUsMjggKzY4MywyMiBAQAogCQljbWRxZWxtdC0+U2V0T3BlcmF0aW9uID0gRkFMU0U7CiAKIAlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkNtZFFMb2NrKTsKLQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKLQl7CisJaWYgKHBBZC0+Q21kUS5DbWRRU3RhdGUgJiBSVE1QX1RBU0tfQ0FOX0RPX0lOU0VSVCkgewogCQlFbnF1ZXVlQ21kKCgmcEFkLT5DbWRRKSwgY21kcWVsbXQpOwogCQlzdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJfQogCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwogCi0JaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKQotCXsKKwlpZiAoc3RhdHVzID09IE5ESVNfU1RBVFVTX0ZBSUxVUkUpIHsKIAkJaWYgKGNtZHFlbG10LT5idWZmZXIpCi0JCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBjbWRxZWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKLQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOwotCX0KLQllbHNlCi0JUlRVU0JDTURVcChwQWQpOworCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdC0+YnVmZmVyKTsKKwkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdCk7CisJfSBlbHNlCisJCVJUVVNCQ01EVXAocEFkKTsKIAotCi0gICAgcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CiB9CiAKIC8qCkBAIC0xMDQ0LDM3ICs3MTYsMzMgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLU5ESVNfU1RBVFVTIFJUVVNCRW5xdWV1ZUludGVybmFsQ21kKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE5ESVNfT0lECQkJT2lkLAotCUlOIFBWT0lECQkJcEluZm9ybWF0aW9uQnVmZmVyLAotCUlOIFVJTlQzMgkJCUluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKQoraW50IFJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHN0cnVjdCBydF9ydG1wX2FkYXB0ZXIgKnBBZCwKKwkJCQkgICAgSU4gTkRJU19PSUQgT2lkLAorCQkJCSAgICB2b2lkICpwSW5mb3JtYXRpb25CdWZmZXIsCisJCQkJICAgIHUzMiBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCkKIHsKLQlORElTX1NUQVRVUwlzdGF0dXM7Ci0JUENtZFFFbG10CWNtZHFlbG10ID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBydF9jbWRxZWxtdCAqY21kcWVsbXQgPSBOVUxMOwogCi0KLQlzdGF0dXMgPSBSVE1QQWxsb2NhdGVNZW1vcnkoKFBWT0lEICopJmNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpKTsKKwlzdGF0dXMgPSBvc19hbGxvY19tZW0ocEFkLCAodTggKiopICYgY21kcWVsbXQsIHNpemVvZihzdHJ1Y3QgcnRfY21kcWVsbXQpKTsKIAlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAoY21kcWVsbXQgPT0gTlVMTCkpCiAJCXJldHVybiAoTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKLQlOZGlzWmVyb01lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSk7CisJTmRpc1plcm9NZW1vcnkoY21kcWVsbXQsIHNpemVvZihzdHJ1Y3QgcnRfY21kcWVsbXQpKTsKIAotCWlmKEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoID4gMCkKLQl7Ci0JCXN0YXR1cyA9IFJUTVBBbGxvY2F0ZU1lbW9yeSgoUFZPSUQgKikmY21kcWVsbXQtPmJ1ZmZlciwgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwotCQlpZiAoKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSB8fCAoY21kcWVsbXQtPmJ1ZmZlciA9PSBOVUxMKSkKLQkJewotCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQsIHNpemVvZihDbWRRRWxtdCksIDApOworCWlmIChJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCA+IDApIHsKKwkJc3RhdHVzID0KKwkJICAgIG9zX2FsbG9jX21lbShwQWQsICh1OCAqKikgJiBjbWRxZWxtdC0+YnVmZmVyLAorCQkJCSBJbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CisJCWlmICgoc3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCisJCSAgICB8fCAoY21kcWVsbXQtPmJ1ZmZlciA9PSBOVUxMKSkgeworCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdCk7CiAJCQlyZXR1cm4gKE5ESVNfU1RBVFVTX1JFU09VUkNFUyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBwSW5mb3JtYXRpb25CdWZmZXIsIEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCU5kaXNNb3ZlTWVtb3J5KGNtZHFlbG10LT5idWZmZXIsIHBJbmZvcm1hdGlvbkJ1ZmZlciwKKwkJCQkgICAgICAgSW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpOwogCQkJY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCA9IEluZm9ybWF0aW9uQnVmZmVyTGVuZ3RoOwogCQl9Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJY21kcWVsbXQtPmJ1ZmZlciA9IE5VTEw7CiAJCWNtZHFlbG10LT5idWZmZXJsZW5ndGggPSAwOwogCX0KQEAgLTEwODIsMzAgKzc1MCwyNCBAQAogCWNtZHFlbG10LT5jb21tYW5kID0gT2lkOwogCWNtZHFlbG10LT5DbWRGcm9tTmRpcyA9IEZBTFNFOwogCi0JaWYgKGNtZHFlbG10ICE9IE5VTEwpCi0JeworCWlmIChjbWRxZWxtdCAhPSBOVUxMKSB7CiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwotCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSAmIFJUMjg3MF9USFJFQURfQ0FOX0RPX0lOU0VSVCkKLQkJeworCQlpZiAocEFkLT5DbWRRLkNtZFFTdGF0ZSAmIFJUTVBfVEFTS19DQU5fRE9fSU5TRVJUKSB7CiAJCQlFbnF1ZXVlQ21kKCgmcEFkLT5DbWRRKSwgY21kcWVsbXQpOwogCQkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7CiAJCX0KIAkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5DbWRRTG9jayk7CiAKLQkJaWYgKHN0YXR1cyA9PSBORElTX1NUQVRVU19GQUlMVVJFKQotCQl7CisJCWlmIChzdGF0dXMgPT0gTkRJU19TVEFUVVNfRkFJTFVSRSkgewogCQkJaWYgKGNtZHFlbG10LT5idWZmZXIpCi0JCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0JCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7Ci0JCX0KLQkJZWxzZQotCQlSVFVTQkNNRFVwKHBBZCk7CisJCQkJb3NfZnJlZV9tZW0ocEFkLCBjbWRxZWxtdC0+YnVmZmVyKTsKKwkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQpOworCQl9IGVsc2UKKwkJCVJUVVNCQ01EVXAocEFkKTsKIAl9Ci0JcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOworCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7CiB9CiAKIC8qCkBAIC0xMTIzLDE0ICs3ODUsMTEgQEAKIAogCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KLVZPSUQJUlRVU0JEZXF1ZXVlQ21kKAotCUlOCVBDbWRRCQljbWRxLAotCU9VVAlQQ21kUUVsbXQJKnBjbWRxZWxtdCkKK3ZvaWQgUlRVU0JEZXF1ZXVlQ21kKHN0cnVjdCBydF9jbWRxICpjbWRxLCBzdHJ1Y3QgcnRfY21kcWVsbXQgKiAqIHBjbWRxZWxtdCkKIHsKIAkqcGNtZHFlbG10ID0gY21kcS0+aGVhZDsKIAotCWlmICgqcGNtZHFlbG10ICE9IE5VTEwpCi0JeworCWlmICgqcGNtZHFlbG10ICE9IE5VTEwpIHsKIAkJY21kcS0+aGVhZCA9IGNtZHEtPmhlYWQtPm5leHQ7CiAJCWNtZHEtPnNpemUtLTsKIAkJaWYgKGNtZHEtPnNpemUgPT0gMCkKQEAgLTExNjQsNyArODIzLDYgQEAKIAkgIG1ldGhvZCBjYW4gd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICBTaW5jZSB5b3UgZG9uJ3QgaGF2ZSBhIGhhbmRsZSBvbgogCSAgdGhlIFVSQiB1c2VkLCB5b3UgY2FuJ3QgY2FuY2VsIHRoZSByZXF1ZXN0LgogCi0KIAlSb3V0aW5lIERlc2NyaXB0aW9uOgogCiAJQXJndW1lbnRzOgpAQCAtMTE3NSw2OCArODMzLDEwOSBAQAogCiAJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotTlRTVEFUVVMgICAgUlRVU0JfVmVuZG9yUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVSU5UMzIJCQlUcmFuc2ZlckZsYWdzLAotCUlOCVVDSEFSCQkJUmVxdWVzdFR5cGUsCi0JSU4JVUNIQVIJCQlSZXF1ZXN0LAotCUlOCVVTSE9SVAkJCVZhbHVlLAotCUlOCVVTSE9SVAkJCUluZGV4LAotCUlOCVBWT0lECQkJVHJhbnNmZXJCdWZmZXIsCi0JSU4JVUlOVDMyCQkJVHJhbnNmZXJCdWZmZXJMZW5ndGgpCitpbnQgUlRVU0JfVmVuZG9yUmVxdWVzdChzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQsCisJCQkgICAgIHUzMiBUcmFuc2ZlckZsYWdzLAorCQkJICAgICB1OCBSZXF1ZXN0VHlwZSwKKwkJCSAgICAgdTggUmVxdWVzdCwKKwkJCSAgICAgdTE2IFZhbHVlLAorCQkJICAgICB1MTYgSW5kZXgsCisJCQkgICAgIHZvaWQgKlRyYW5zZmVyQnVmZmVyLAorCQkJICAgICB1MzIgVHJhbnNmZXJCdWZmZXJMZW5ndGgpCiB7Ci0JaW50CQkJCXJldDsKLQlQT1NfQ09PS0lFCQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOworCWludCByZXQgPSAwOworCXN0cnVjdCBvc19jb29raWUgKnBPYmogPSAoc3RydWN0IG9zX2Nvb2tpZSAqKXBBZC0+T1NfQ29va2llOwogCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7CisJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkgewogCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJkZXZpY2UgZGlzY29ubmVjdGVkXG4iKSk7CiAJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoaW5faW50ZXJydXB0KCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJpbl9pbnRlcnJ1cHQsIFJUVVNCX1ZlbmRvclJlcXVlc3QgUmVxdWVzdCUwMnggVmFsdWUlMDR4IE9mZnNldCUwNHhcbiIsUmVxdWVzdCxWYWx1ZSxJbmRleCkpOworCX0gZWxzZSBpZiAoaW5faW50ZXJydXB0KCkpIHsKKwkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkgKCJpbl9pbnRlcnJ1cHQsIFJUVVNCX1ZlbmRvclJlcXVlc3QgUmVxdWVzdCUwMnggVmFsdWUlMDR4IE9mZnNldCUwNHhcbiIsCisJCQkgIFJlcXVlc3QsIFZhbHVlLCBJbmRleCkpOwogCiAJCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogI2RlZmluZSBNQVhfUkVUUllfQ09VTlQgIDEwCiAKIAkJaW50IHJldHJ5Q291bnQgPSAwOwotCQl2b2lkCSp0bXBCdWYgPSBUcmFuc2ZlckJ1ZmZlcjsKKwkJdm9pZCAqdG1wQnVmID0gVHJhbnNmZXJCdWZmZXI7CiAKLQkJLy8gQWNxdWlyZSBDb250cm9sIHRva2VuCi0JCWRvIHsKLQkJaWYoIFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQpCi0JCQlyZXQ9dXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LCB1c2Jfc25kY3RybHBpcGUoIHBPYmotPnBVc2JfRGV2LCAwICksIFJlcXVlc3QsIFJlcXVlc3RUeXBlLCBWYWx1ZSxJbmRleCwgdG1wQnVmLCBUcmFuc2ZlckJ1ZmZlckxlbmd0aCwgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMpOwotCQllbHNlIGlmKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTikKLQkJCXJldD11c2JfY29udHJvbF9tc2cocE9iai0+cFVzYl9EZXYsIHVzYl9yY3ZjdHJscGlwZSggcE9iai0+cFVzYl9EZXYsIDAgKSwgUmVxdWVzdCwgUmVxdWVzdFR5cGUsIFZhbHVlLEluZGV4LCB0bXBCdWYsIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLCBDT05UUk9MX1RJTUVPVVRfSklGRklFUyk7Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgidmVuZG9yIHJlcXVlc3QgZGlyZWN0aW9uIGlzIGZhaWxlZFxuIikpOwotCQkJcmV0ID0gLTE7CisJCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmKHBBZC0+VXNiVmVuZG9yUmVxX3NlbWFwaG9yZSkpOworCQlpZiAocEFkLT5Vc2JWZW5kb3JSZXFCdWYpIHsKKwkJCUFTU0VSVChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA8IE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7CisKKwkJCXRtcEJ1ZiA9ICh2b2lkICopcEFkLT5Vc2JWZW5kb3JSZXFCdWY7CisJCQlOZGlzWmVyb01lbW9yeShwQWQtPlVzYlZlbmRvclJlcUJ1ZiwKKwkJCQkgICAgICAgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCisJCQlpZiAoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCkKKwkJCQlOZGlzTW92ZU1lbW9yeSh0bXBCdWYsIFRyYW5zZmVyQnVmZmVyLAorCQkJCQkgICAgICAgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOwogCQl9CiAKKwkJZG8geworCQkJaWYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQpCisJCQkJcmV0ID0KKwkJCQkgICAgdXNiX2NvbnRyb2xfbXNnKHBPYmotPnBVc2JfRGV2LAorCQkJCQkJICAgIHVzYl9zbmRjdHJscGlwZShwT2JqLT4KKwkJCQkJCQkJICAgIHBVc2JfRGV2LAorCQkJCQkJCQkgICAgMCksIFJlcXVlc3QsCisJCQkJCQkgICAgUmVxdWVzdFR5cGUsIFZhbHVlLCBJbmRleCwKKwkJCQkJCSAgICB0bXBCdWYsCisJCQkJCQkgICAgVHJhbnNmZXJCdWZmZXJMZW5ndGgsCisJCQkJCQkgICAgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMpOworCQkJZWxzZSBpZiAoUmVxdWVzdFR5cGUgPT0gREVWSUNFX1ZFTkRPUl9SRVFVRVNUX0lOKQorCQkJCXJldCA9CisJCQkJICAgIHVzYl9jb250cm9sX21zZyhwT2JqLT5wVXNiX0RldiwKKwkJCQkJCSAgICB1c2JfcmN2Y3RybHBpcGUocE9iai0+CisJCQkJCQkJCSAgICBwVXNiX0RldiwKKwkJCQkJCQkJICAgIDApLCBSZXF1ZXN0LAorCQkJCQkJICAgIFJlcXVlc3RUeXBlLCBWYWx1ZSwgSW5kZXgsCisJCQkJCQkgICAgdG1wQnVmLAorCQkJCQkJICAgIFRyYW5zZmVyQnVmZmVyTGVuZ3RoLAorCQkJCQkJICAgIENPTlRST0xfVElNRU9VVF9KSUZGSUVTKTsKKwkJCWVsc2UgeworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJ2ZW5kb3IgcmVxdWVzdCBkaXJlY3Rpb24gaXMgZmFpbGVkXG4iKSk7CisJCQkJcmV0ID0gLTE7CisJCQl9CisKIAkJCXJldHJ5Q291bnQrKzsKIAkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcHJpbnRrKCIjXG4iKTsKKwkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiI1xuIikpOwogCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7CiAJCQl9Ci0JCX0gd2hpbGUoKHJldCA8IDApICYmIChyZXRyeUNvdW50IDwgTUFYX1JFVFJZX0NPVU5UKSk7CisJCX0gd2hpbGUgKChyZXQgPCAwKSAmJiAocmV0cnlDb3VudCA8IE1BWF9SRVRSWV9DT1VOVCkpOwogCi0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0vLwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlVTQlZlbmRvclJlcXVlc3QgZmFpbGVkIHJldD0lZCBcbiIscmV0KSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVFVTQl9WZW5kb3JSZXF1ZXN0IGZhaWxlZCglZCksVHhGbGFncz0weCV4LCBSZXFUeXBlPSVzLCBSZXE9MHgleCwgSW5kZXg9MHgleFxuIiwKLQkJCQkJCXJldCwgVHJhbnNmZXJGbGFncywgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQgPyAiT1VUIiA6ICJJTiIpLCBSZXF1ZXN0LCBJbmRleCkpOworCQlpZiAoKHBBZC0+VXNiVmVuZG9yUmVxQnVmKQorCQkgICAgJiYgKFJlcXVlc3RUeXBlID09IERFVklDRV9WRU5ET1JfUkVRVUVTVF9JTikpCisJCQlOZGlzTW92ZU1lbW9yeShUcmFuc2ZlckJ1ZmZlciwgdG1wQnVmLAorCQkJCSAgICAgICBUcmFuc2ZlckJ1ZmZlckxlbmd0aCk7CisJCXVwKCYocEFkLT5Vc2JWZW5kb3JSZXFfc2VtYXBob3JlKSk7CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCSAoIlJUVVNCX1ZlbmRvclJlcXVlc3QgZmFpbGVkKCVkKSxUeEZsYWdzPTB4JXgsIFJlcVR5cGU9JXMsIFJlcT0weCV4LCBJbmRleD0weCV4XG4iLAorCQkJCSAgcmV0LCBUcmFuc2ZlckZsYWdzLAorCQkJCSAgKFJlcXVlc3RUeXBlID09CisJCQkJICAgREVWSUNFX1ZFTkRPUl9SRVFVRVNUX09VVCA/ICJPVVQiIDogIklOIiksCisJCQkJICBSZXF1ZXN0LCBJbmRleCkpOwogCQkJaWYgKFJlcXVlc3QgPT0gMHgyKQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlx0UmVxdWVzdCBWYWx1ZT0weCUwNHghXG4iLCBWYWx1ZSkpOworCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkgKCJcdFJlcXVlc3QgVmFsdWU9MHglMDR4IVxuIiwgVmFsdWUpKTsKIAotCQkJaWYgKChUcmFuc2ZlckJ1ZmZlciE9IE5VTEwpICYmIChUcmFuc2ZlckJ1ZmZlckxlbmd0aCA+IDApKQotCQkJCWhleF9kdW1wKCJGYWlsZWQgVHJhbnNmZXJCdWZmZXIgdmFsdWUiLCBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOwotICAgICAgICB9CisJCQlpZiAoKFRyYW5zZmVyQnVmZmVyICE9IE5VTEwpCisJCQkgICAgJiYgKFRyYW5zZmVyQnVmZmVyTGVuZ3RoID4gMCkpCisJCQkJaGV4X2R1bXAoIkZhaWxlZCBUcmFuc2ZlckJ1ZmZlciB2YWx1ZSIsCisJCQkJCSBUcmFuc2ZlckJ1ZmZlciwgVHJhbnNmZXJCdWZmZXJMZW5ndGgpOworCQl9CisKIAl9Ci0JcmV0dXJuIHJldDsKKworCWlmIChyZXQgIT0gLTEpCisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwllbHNlCisJCXJldHVybiBTVEFUVVNfVU5TVUNDRVNTRlVMOwogfQogCiAvKgpAQCAtMTI1NSwyOCArOTU0LDI1IEBACiAKIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCi1OVFNUQVRVUwlSVFVTQl9SZXNldERldmljZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKK2ludCBSVFVTQl9SZXNldERldmljZShzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JTlRTVEFUVVMJCVN0YXR1cyA9IFRSVUU7CisJaW50IFN0YXR1cyA9IFRSVUU7CiAKIAlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiLS0tPlVTQl9SZXNldERldmljZVxuIikpOwotCS8vUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpOworCS8qUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpOyAqLwogCXJldHVybiBTdGF0dXM7CiB9CiAKLVZPSUQgQ01ESGFuZGxlcigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCkKK3ZvaWQgQ01ESGFuZGxlcihzdHJ1Y3QgcnRfcnRtcF9hZGFwdGVyICpwQWQpCiB7Ci0JUENtZFFFbG10CQljbWRxZWxtdDsKLQlQVUNIQVIJCQlwRGF0YTsKLQlORElTX1NUQVRVUwkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0vLwlVTE9ORwkJCU5vdyA9IDA7Ci0JTlRTVEFUVVMJCW50U3RhdHVzOwotLy8JdW5zaWduZWQgbG9uZwlJcnFGbGFnczsKKwlzdHJ1Y3QgcnRfY21kcWVsbXQgKmNtZHFlbG10OworCXU4ICpwRGF0YTsKKwlpbnQgTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7CisvKiAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgTm93ID0gMDsgKi8KKwlpbnQgbnRTdGF0dXM7CisvKiAgICAgIHVuc2lnbmVkIGxvbmcgICBJcnFGbGFnczsgKi8KIAotCXdoaWxlIChwQWQtPkNtZFEuc2l6ZSA+IDApCi0JeworCXdoaWxlIChwQWQgJiYgcEFkLT5DbWRRLnNpemUgPiAwKSB7CiAJCU5kaXNTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwogCiAJCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+Q21kUUxvY2spOwpAQCAtMTI4OCw1OTEgKzk4NCwxMTI5IEBACiAKIAkJcERhdGEgPSBjbWRxZWxtdC0+YnVmZmVyOwogCi0JCWlmKCEoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpIHx8IFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCi0JCXsKLQkJCXN3aXRjaCAoY21kcWVsbXQtPmNvbW1hbmQpCi0JCQl7Ci0JCQkJY2FzZSBDTURUSFJFQURfQ0hFQ0tfR1BJTzoKKwkJaWYgKCEKKwkJICAgIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkKKwkJICAgICB8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKSB7CisJCQlzd2l0Y2ggKGNtZHFlbG10LT5jb21tYW5kKSB7CisJCQljYXNlIENNRFRIUkVBRF9DSEVDS19HUElPOgorCQkJCXsKKwkJCQkJdTMyIGRhdGE7CisKIAkJCQkJewotCQkJCQkJVUlOVDMyIGRhdGE7CisJCQkJCQkvKiBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlICovCiAKLQkJCQkJCXsKLQkJCQkJCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgR1BJT19DVFJMX0NGRywKKwkJCQkJCQkJICAgICAmZGF0YSk7CiAKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlciggcEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7CisJCQkJCQlpZiAoZGF0YSAmIDB4MDQpIHsKKwkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9CisJCQkJCQkJICAgIFRSVUU7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0KKwkJCQkJCQkgICAgRkFMU0U7CisJCQkJCQl9CiAKLQkJCQkJCQlpZiAoZGF0YSAmIDB4MDQpCi0JCQkJCQkJewotCQkJCQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IFRSVUU7CisJCQkJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9CisJCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLmJId1JhZGlvCisJCQkJCQkgICAgICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkgeworCQkJCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9CisJCQkJCQkJICAgIChwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgIGJId1JhZGlvCisJCQkJCQkJICAgICAmJiBwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgIGJTd1JhZGlvKTsKKwkJCQkJCQlpZiAocEFkLT5TdGFDZmcuCisJCQkJCQkJICAgIGJSYWRpbyA9PSBUUlVFKSB7CisJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgICAgICgiISEhIFJhZGlvIE9uICEhIVxuIikpOworCisJCQkJCQkJCU1sbWVSYWRpb09uCisJCQkJCQkJCSAgICAocEFkKTsKKwkJCQkJCQkJLyogVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uICovCisJCQkJCQkJCXBBZC0+RXh0cmFJbmZvID0KKwkJCQkJCQkJICAgIEVYVFJBX0lORk9fQ0xFQVI7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCSAgICAgKCIhISEgUmFkaW8gT2ZmICEhIVxuIikpOworCisJCQkJCQkJCU1sbWVSYWRpb09mZgorCQkJCQkJCQkgICAgKHBBZCk7CisJCQkJCQkJCS8qIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiAqLworCQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9CisJCQkJCQkJCSAgICBIV19SQURJT19PRkY7CiAJCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7Ci0JCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOwogCi0JCQkJCQkJaWYocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0JCQkJCQkJewotCQkJCQkJCQlwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotCQkJCQkJCQlpZihwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkKLQkJCQkJCQkJewotCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIiEhISBSYWRpbyBPbiAhISFcbiIpKTsKKwkJCWNhc2UgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQ6CisJCQkJeworCQkJCQlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKE5VTEwsIHBBZCwKKwkJCQkJCQkJICAgICBOVUxMLAorCQkJCQkJCQkgICAgIE5VTEwpOworCQkJCX0KKwkJCQlicmVhazsKIAotCQkJCQkJCQkJTWxtZVJhZGlvT24ocEFkKTsKLQkJCQkJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOworCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6CisJCQkJeworCQkJCQl1MzIgTUFDVmFsdWU7CisJCQkJCXU4IEluZGV4OworCQkJCQlpbnQgcmV0ID0gMDsKKwkJCQkJc3RydWN0IHJ0X2h0X3R4X2NvbnRleHQgKnBIVFRYQ29udGV4dDsKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBydF9ydG1wX3R4X3JpbmcgKnBUeFJpbmc7ICovCisJCQkJCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7CisKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVChSZXNldFBpcGVpZD0weCUweCk9PT0+XG4iLAorCQkJCQkJICAgICAgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKKwkJCQkJLyogQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLiAqLworCQkJCQkvKlJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtPdXRJUlAocEFkKTsgKi8KKwkJCQkJLyogV2FpdCAxMG1zIHRvIGxldCBwcmV2aW91cyBwYWNrZXQgdGhhdCBhcmUgYWxyZWFkeSBpbiBIVyBGSUZPIHRvIGNsZWFyLiBieSBNQVhMRUUgMTItMjUtMjAwNyAqLworCQkJCQlJbmRleCA9IDA7CisJCQkJCWRvIHsKKwkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwKKwkJCQkJCQkJICAgICBUWFJYUV9QQ05ULAorCQkJCQkJCQkgICAgICZNQUNWYWx1ZSk7CisJCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmMDAwMDAKKwkJCQkJCSAgICAgLyoweDgwMDAwMCAqLyApID09IDApCisJCQkJCQkJYnJlYWs7CisJCQkJCQlJbmRleCsrOworCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7CisJCQkJCX0gd2hpbGUgKEluZGV4IDwgMTAwKTsKKwkJCQkJTUFDVmFsdWUgPSAwOworCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLAorCQkJCQkJCSAgICAgJk1BQ1ZhbHVlKTsKKwkJCQkJLyogVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAybmQgY2hlY2sgdGhlIHZhbGlkaXR5LiAqLworCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhjMDAwMDApID09IDApCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgVVNCX0RNQV9DRkcsCisJCQkJCQkJCSAgICAgJk1BQ1ZhbHVlKTsKKwkJCQkJLyogVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAzcmQgY2hlY2sgdGhlIHZhbGlkaXR5LiAqLworCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhjMDAwMDApID09IDApCisJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgVVNCX0RNQV9DRkcsCisJCQkJCQkJCSAgICAgJk1BQ1ZhbHVlKTsKKwkJCQkJTUFDVmFsdWUgfD0gMHg4MDAwMDsKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsCisJCQkJCQkJICAgICAgTUFDVmFsdWUpOworCisJCQkJCS8qIFdhaXQgMW1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBiZWZvcmUgSFcgcmVzZXQuIGJ5IE1BWExFRSAxMi0yNS0yMDA3ICovCisJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7CisKKwkJCQkJTUFDVmFsdWUgJj0gKH4weDgwMDAwKTsKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsCisJCQkJCQkJICAgICAgTUFDVmFsdWUpOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgICAgICgiXHRTZXQgMHgyYTAgYml0MTkuIENsZWFyIFVTQiBETUEgVFggcGF0aFxuIikpOworCisJCQkJCS8qIFdhaXQgNW1zIHRvIHByZXZlbnQgbmV4dCBVUkIgdG8gYnVsa291dCBiZWZvcmUgSFcgcmVzZXQuIGJ5IE1BWExFRSAxMi0yNS0yMDA3ICovCisJCQkJCS8qUlRNUHVzZWNEZWxheSg1MDAwKTsgKi8KKworCQkJCQlpZiAoKHBBZC0+CisJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkICYKKwkJCQkJICAgICBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykgPT0KKwkJCQkJICAgIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSB7CisJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCQkJCQkJaWYgKHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPAorCQkJCQkJICAgIE1HTVRfUklOR19TSVpFCisJCQkJCQkgICAgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLworCQkJCQkJICAgICkgeworCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCQkJCQkJICAgIGZSVFVTQl9CVUxLX09VVF9NTE1FKTsKKwkJCQkJCX0KKwkJCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKKworCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAgICAgKCJcdFRYIE1HTVQgUkVDT1ZFUiBEb25lIVxuIikpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcEhUVFhDb250ZXh0ID0KKwkJCQkJCSAgICAmKHBBZC0+CisJCQkJCQkgICAgICBUeENvbnRleHRbcEFkLT4KKwkJCQkJCQkJYnVsa1Jlc2V0UGlwZWlkXSk7CisJCQkJCQkvKk5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsgKi8KKwkJCQkJCVJUTVBfSU5UX0xPQ0soJnBBZC0+CisJCQkJCQkJICAgICAgQnVsa091dExvY2tbcEFkLT4KKwkJCQkJCQkJCSAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkgICAgICBJcnFGbGFncyk7CisJCQkJCQlpZiAocEFkLT4KKwkJCQkJCSAgICBCdWxrT3V0UGVuZGluZ1twQWQtPgorCQkJCQkJCQkgICBidWxrUmVzZXRQaXBlaWRdCisJCQkJCQkgICAgPT0gRkFMU0UpIHsKKwkJCQkJCQlwQWQtPgorCQkJCQkJCSAgICBCdWxrT3V0UGVuZGluZ1twQWQtPgorCQkJCQkJCQkJICAgYnVsa1Jlc2V0UGlwZWlkXQorCQkJCQkJCSAgICA9IFRSVUU7CisJCQkJCQkJcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkgICAgSVJQUGVuZGluZyA9IFRSVUU7CisJCQkJCQkJcEFkLT4KKwkJCQkJCQkgICAgd2F0Y2hEb2dUeFBlbmRpbmdDbnQKKwkJCQkJCQkgICAgW3BBZC0+CisJCQkJCQkJICAgICBidWxrUmVzZXRQaXBlaWRdID0KKwkJCQkJCQkgICAgMTsKKworCQkJCQkJCS8qIG5vIG1hdHRlciB3aGF0LCBjbGVhbiB0aGUgZmxhZyAqLworCQkJCQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsCisJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOworCisJCQkJCQkJLypOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSk7ICovCisJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPgorCQkJCQkJCQkJQnVsa091dExvY2sKKwkJCQkJCQkJCVtwQWQtPgorCQkJCQkJCQkJIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQlJcnFGbGFncyk7CisJCQkJCQkJeworCQkJCQkJCQlSVFVTQkluaXRIVFR4RGVzYworCQkJCQkJCQkgICAgKHBBZCwKKwkJCQkJCQkJICAgICBwSFRUWENvbnRleHQsCisJCQkJCQkJCSAgICAgcEFkLT4KKwkJCQkJCQkJICAgICBidWxrUmVzZXRQaXBlaWQsCisJCQkJCQkJCSAgICAgcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJICAgICBCdWxrT3V0U2l6ZSwKKwkJCQkJCQkJICAgICAodXNiX2NvbXBsZXRlX3QpCisJCQkJCQkJCSAgICAgUlRVU0JCdWxrT3V0RGF0YVBhY2tldENvbXBsZXRlKTsKKworCQkJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkJCSAgICAgUlRVU0JfU1VCTUlUX1VSQgorCQkJCQkJCQkgICAgIChwSFRUWENvbnRleHQtPgorCQkJCQkJCQkgICAgICBwVXJiKSkgIT0KKwkJCQkJCQkJICAgIDApIHsKKwkJCQkJCQkJCVJUTVBfSU5UX0xPQ0sKKwkJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCQkgICAgIEJ1bGtPdXRMb2NrCisJCQkJCQkJCQkgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQkJcEFkLT4KKwkJCQkJCQkJCSAgICBCdWxrT3V0UGVuZGluZworCQkJCQkJCQkJICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICBidWxrUmVzZXRQaXBlaWRdCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIEZBTFNFOworCQkJCQkJCQkJcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJCSAgICBJUlBQZW5kaW5nCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIEZBTFNFOworCQkJCQkJCQkJcEFkLT4KKwkJCQkJCQkJCSAgICB3YXRjaERvZ1R4UGVuZGluZ0NudAorCQkJCQkJCQkJICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICBidWxrUmVzZXRQaXBlaWRdCisJCQkJCQkJCQkgICAgPSAwOworCQkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLCisJCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkJICAgICBCdWxrT3V0TG9jaworCQkJCQkJCQkJICAgICBbcEFkLT4KKwkJCQkJCQkJCSAgICAgIGJ1bGtSZXNldFBpcGVpZF0sCisJCQkJCQkJCQkgICAgIElycUZsYWdzKTsKKworCQkJCQkJCQkJREJHUFJJTlQKKwkJCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCQkgICAgICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwKKwkJCQkJCQkJCSAgICAgIHJldCkpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJUlRNUF9JUlFfTE9DSworCQkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJCSAgICAgQnVsa091dExvY2sKKwkJCQkJCQkJCSAgICAgW3BBZC0+CisJCQkJCQkJCQkgICAgICBidWxrUmVzZXRQaXBlaWRdLAorCQkJCQkJCQkJICAgICBJcnFGbGFncyk7CisJCQkJCQkJCQlEQkdQUklOVF9SQVcKKwkJCQkJCQkJCSAgICAoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJCQkgICAgICgiXHRDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6IFR4Q29udGV4dFslZF06Q1dQb3M9JWxkLCBOQlBvcz0lbGQsIEVOQlBvcz0lbGQsIGJDb3B5PSVkLCBwZW5kaW5nPSVkIVxuIiwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBidWxrUmVzZXRQaXBlaWQsCisJCQkJCQkJCQkgICAgICBwSFRUWENvbnRleHQtPgorCQkJCQkJCQkJICAgICAgQ3VyV3JpdGVQb3NpdGlvbiwKKwkJCQkJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgICBOZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCQkJCQkJICAgICAgcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJCSAgICAgIEVOZXh0QnVsa091dFBvc2l0aW9uLAorCQkJCQkJCQkJICAgICAgcEhUVFhDb250ZXh0LT4KKwkJCQkJCQkJCSAgICAgIGJDb3B5U2F2ZVBhZCwKKwkJCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJCQkgICAgICBCdWxrT3V0UGVuZGluZworCQkJCQkJCQkJICAgICAgW3BBZC0+CisJCQkJCQkJCQkgICAgICAgYnVsa1Jlc2V0UGlwZWlkXSkpOworCQkJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJCQkgICAgKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkJICAgICAoIlx0XHRCdWxrT3V0IFJlcT0weCVseCwgQ29tcGxldGU9MHglbHgsIE90aGVyPTB4JWx4XG4iLAorCQkJCQkJCQkJICAgICAgcEFkLT4KKwkJCQkJCQkJCSAgICAgIEJ1bGtPdXRSZXEsCisJCQkJCQkJCQkgICAgICBwQWQtPgorCQkJCQkJCQkJICAgICAgQnVsa091dENvbXBsZXRlLAorCQkJCQkJCQkJICAgICAgcEFkLT4KKwkJCQkJCQkJCSAgICAgIEJ1bGtPdXRDb21wbGV0ZU90aGVyKSk7CisJCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0sKKwkJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCQkgICAgIEJ1bGtPdXRMb2NrCisJCQkJCQkJCQkgICAgIFtwQWQtPgorCQkJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJCQkgICAgKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkJICAgICAoIlx0Q01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBTdWJtaXQgVHggREFUQSBVUkIgZm9yIGZhaWxlZCBCdWxrUmVxKDB4JWx4KSBEb25lLCBzdGF0dXM9JWQhXG4iLAorCQkJCQkJCQkJICAgICAgcEFkLT4KKwkJCQkJCQkJCSAgICAgIGJ1bGtSZXNldFJlcQorCQkJCQkJCQkJICAgICAgW3BBZC0+CisJCQkJCQkJCQkgICAgICAgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkJCSAgICAgIHBIVFRYQ29udGV4dC0+CisJCQkJCQkJCQkgICAgICBwVXJiLT4KKwkJCQkJCQkJCSAgICAgIHN0YXR1cykpOworCiAJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pOyAqLworCQkJCQkJCS8qUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOyAqLworCisJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgICAgICgiQ21kVGhyZWFkIDogVFggREFUQSBSRUNPVkVSIEZBSUwgZm9yIEJ1bGtSZXEoMHglbHgpIGJlY2F1c2UgQnVsa091dFBlbmRpbmdbJWRdIGlzIFRSVUUhXG4iLAorCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJICAgICAgYnVsa1Jlc2V0UmVxW3BBZC0+CisJCQkJCQkJCQkgICBidWxrUmVzZXRQaXBlaWRdLAorCQkJCQkJCSAgICAgIHBBZC0+CisJCQkJCQkJICAgICAgYnVsa1Jlc2V0UGlwZWlkKSk7CisJCQkJCQkJaWYgKHBBZC0+CisJCQkJCQkJICAgIGJ1bGtSZXNldFBpcGVpZCA9PQorCQkJCQkJCSAgICAwKSB7CisJCQkJCQkJCXU4CisJCQkJCQkJCSAgICBwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkgICAgPSAwOworCQkJCQkJCQlzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqCisJCQkJCQkJCSAgICBwSFRUWENvbnRleHQKKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIChzdHJ1Y3QgcnRfaHRfdHhfY29udGV4dCAqKQorCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkgICAgIFR4Q29udGV4dAorCQkJCQkJCQkgICAgIFtwQWQtPgorCQkJCQkJCQkgICAgICBidWxrUmVzZXRQaXBlaWRdKTsKKwkJCQkJCQkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKgorCQkJCQkJCQkgICAgcE1MTUVDb250ZXh0CisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikKKwkJCQkJCQkJICAgIChwQWQtPgorCQkJCQkJCQkgICAgIE1nbXRSaW5nLgorCQkJCQkJCQkgICAgIENlbGxbcEFkLT4KKwkJCQkJCQkJCSAgTWdtdFJpbmcuCisJCQkJCQkJCQkgIFR4RG1hSWR4XS4KKwkJCQkJCQkJICAgICBBbGxvY1ZhKTsKKwkJCQkJCQkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKgorCQkJCQkJCQkgICAgcE5VTExDb250ZXh0CisJCQkJCQkJCSAgICA9CisJCQkJCQkJCSAgICAoc3RydWN0IHJ0X3R4X2NvbnRleHQgKikKKwkJCQkJCQkJICAgICgmcEFkLT4KKwkJCQkJCQkJICAgICBQc1BvbGxDb250ZXh0KTsKKwkJCQkJCQkJc3RydWN0IHJ0X3R4X2NvbnRleHQgKgorCQkJCQkJCQkgICAgcFBzUG9sbENvbnRleHQKKwkJCQkJCQkJICAgID0KKwkJCQkJCQkJICAgIChzdHJ1Y3QgcnRfdHhfY29udGV4dCAqKQorCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkgICAgIE51bGxDb250ZXh0KTsKKworCQkJCQkJCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nKQorCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQKKwkJCQkJCQkJCSAgICB8PQorCQkJCQkJCQkJICAgIDE7CisJCQkJCQkJCWVsc2UgaWYKKwkJCQkJCQkJICAgIChwTUxNRUNvbnRleHQtPgorCQkJCQkJCQkgICAgIElSUFBlbmRpbmcpCisJCQkJCQkJCQlwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkJICAgIHw9CisJCQkJCQkJCQkgICAgMjsKKwkJCQkJCQkJZWxzZSBpZgorCQkJCQkJCQkgICAgKHBOVUxMQ29udGV4dC0+CisJCQkJCQkJCSAgICAgSVJQUGVuZGluZykKKwkJCQkJCQkJCXBlbmRpbmdDb250ZXh0CisJCQkJCQkJCQkgICAgfD0KKwkJCQkJCQkJCSAgICA0OworCQkJCQkJCQllbHNlIGlmCisJCQkJCQkJCSAgICAocFBzUG9sbENvbnRleHQtPgorCQkJCQkJCQkgICAgIElSUFBlbmRpbmcpCisJCQkJCQkJCQlwZW5kaW5nQ29udGV4dAorCQkJCQkJCQkJICAgIHw9CisJCQkJCQkJCQkgICAgODsKIAkJCQkJCQkJZWxzZQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiISEhIFJhZGlvIE9mZiAhISFcbiIpKTsKKwkJCQkJCQkJCXBlbmRpbmdDb250ZXh0CisJCQkJCQkJCQkgICAgPSAwOwogCi0JCQkJCQkJCQlNbG1lUmFkaW9PZmYocEFkKTsKLQkJCQkJCQkJCS8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbgotCQkJCQkJCQkJcEFkLT5FeHRyYUluZm8gPSBIV19SQURJT19PRkY7Ci0JCQkJCQkJCX0KKwkJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJCSAgICAoUlRfREVCVUdfRVJST1IsCisJCQkJCQkJCSAgICAgKCJcdFRYIE9jY3VwaWVkIGJ5ICVkIVxuIiwKKwkJCQkJCQkJICAgICAgcGVuZGluZ0NvbnRleHQpKTsKIAkJCQkJCQl9CisJCQkJCQkJLyogbm8gbWF0dGVyIHdoYXQsIGNsZWFuIHRoZSBmbGFnICovCisJCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwKKwkJCQkJCQkJCWZSVE1QX0FEQVBURVJfQlVMS09VVF9SRVNFVCk7CisKKwkJCQkJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+CisJCQkJCQkJCQlCdWxrT3V0TG9jaworCQkJCQkJCQkJW3BBZC0+CisJCQkJCQkJCQkgYnVsa1Jlc2V0UGlwZWlkXSwKKwkJCQkJCQkJCUlycUZsYWdzKTsKKworCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLAorCQkJCQkJCQkJICAgIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwKKwkJCQkJCQkJCSAgICAgPDwKKwkJCQkJCQkJCSAgICAgcEFkLT4KKwkJCQkJCQkJCSAgICAgYnVsa1Jlc2V0UGlwZWlkKSk7CiAJCQkJCQl9CisKKwkJCQkJCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsCisJCQkJCQkJCSAgTlVNX09GX1RYX1JJTkcsCisJCQkJCQkJCSAgTUFYX1RYX1BST0NFU1MpOworCQkJCQkJLypSVFVTQktpY2tCdWxrT3V0KHBBZCk7ICovCiAJCQkJCX0KLQkJCQkJYnJlYWs7CiAKLQkJCQljYXNlIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VUOgorCQkJCX0KKwkJCQkvKgorCQkJCSAgIC8vIERvbid0IGNhbmNlbCBCVUxLSU4uCisJCQkJICAgd2hpbGUgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkgJiYKKwkJCQkgICAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCisJCQkJICAgeworCQkJCSAgIGlmIChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID4gMCkKKwkJCQkgICB7CisJCQkJICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtJbiBJUlAgUGVuZGluZyEhY2FuY2VsIGl0IVxuIikpOworCQkJCSAgIFJUVVNCQ2FuY2VsUGVuZGluZ0J1bGtJbklSUChwQWQpOworCQkJCSAgIH0KKwkJCQkgICBSVE1QdXNlY0RlbGF5KDEwMDAwMCk7CisJCQkJICAgfQorCisJCQkJICAgaWYgKChhdG9taWNfcmVhZCgmcEFkLT5QZW5kaW5nUngpID09IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSkKKwkJCQkgICB7CisJCQkJICAgdTggICAgICAgIGk7CisJCQkJICAgUlRVU0JSeFBhY2tldChwQWQpOworCQkJCSAgIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsgICAgICAvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKKwkJCQkgICBwQWQtPk5leHRSeEJ1bGtJbkluZGV4ICAgICAgICAgICAgICAgPSAwOyAgICAvLyBSeCBCdWxrIHBvaW50ZXIKKwkJCQkgICBmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKKwkJCQkgICB7CisJCQkJICAgc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKKworCQkJCSAgIHBSeENvbnRleHQtPnBBZCAgICAgID0gcEFkOworCQkJCSAgIHBSeENvbnRleHQtPkluVXNlICAgICAgICAgICAgPSBGQUxTRTsKKwkJCQkgICBwUnhDb250ZXh0LT5JUlBQZW5kaW5nICAgICAgID0gRkFMU0U7CisJCQkJICAgcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJCQkgICBwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKKworCQkJCSAgIH0KKwkJCQkgICBSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7CisJCQkJICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa1JlY2VpdmVcbiIpKTsKKwkJCQkgICB9ICovCisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgICAgICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUPD09PVxuIikpOworCQkJCWJyZWFrOworCisJCQljYXNlIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOgorCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJICAgICAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOID09PSA+XG4iKSk7CisKKwkJCQkvKiBBbGwgdHJhbnNmZXJzIG11c3QgYmUgYWJvcnRlZCBvciBjYW5jZWxsZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzZXQgdGhlIHBpcGUuICovCisJCQkJeworCQkJCQl1MzIgTUFDVmFsdWU7CisKIAkJCQkJewotCQkJCQkJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYyhOVUxMLCBwQWQsIE5VTEwsIE5VTEwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQ6Ci0JCQkJCXsKLQkJCQkJCVVJTlQzMgkJTUFDVmFsdWU7Ci0JCQkJCQlVQ0hBUgkJSW5kZXg7Ci0JCQkJCQlpbnQJCQlyZXQ9MDsKLQkJCQkJCVBIVF9UWF9DT05URVhUCXBIVFRYQ29udGV4dDsKLS8vCQkJCQkJUlRNUF9UWF9SSU5HICpwVHhSaW5nOwotCQkJCQkJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKLQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZCA6IENNRFRIUkVBRF9SRVNFVF9CVUxLX09VVChSZXNldFBpcGVpZD0weCUweCk9PT0+XG4iLCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOwotCQkJCQkJLy8gQWxsIHRyYW5zZmVycyBtdXN0IGJlIGFib3J0ZWQgb3IgY2FuY2VsbGVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlc2V0IHRoZSBwaXBlLgotCQkJCQkJLy9SVFVTQkNhbmNlbFBlbmRpbmdCdWxrT3V0SVJQKHBBZCk7Ci0JCQkJCQkvLyBXYWl0IDEwbXMgdG8gbGV0IHByZXZpb3VzIHBhY2tldCB0aGF0IGFyZSBhbHJlYWR5IGluIEhXIEZJRk8gdG8gY2xlYXIuIGJ5IE1BWExFRSAxMi0yNS0yMDA3Ci0JCQkJCQlJbmRleCA9IDA7Ci0JCQkJCQlkbworCQkJCQkJLyp3aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSAmJiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpICovCisJCQkJCQlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJCQkJCSAgICAmJgorCQkJCQkJICAgICghUlRNUF9URVNUX0ZMQUcKKwkJCQkJCSAgICAgKHBBZCwKKwkJCQkJCSAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQogCQkJCQkJewotCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKLQkJCQkJCQlpZiAoKE1BQ1ZhbHVlICYgMHhmMDAwMDAvKjB4ODAwMDAwKi8pID09IDApCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCUluZGV4Kys7Ci0JCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMCk7Ci0JCQkJCQl9d2hpbGUoSW5kZXggPCAxMDApOwotCQkJCQkJTUFDVmFsdWUgPSAwOwotCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgJk1BQ1ZhbHVlKTsKLQkJCQkJCS8vIFRvIHByZXZlbnQgUmVhZCBSZWdpc3RlciBlcnJvciwgd2UgMm5kIGNoZWNrIHRoZSB2YWxpZGl0eS4KLQkJCQkJCWlmICgoTUFDVmFsdWUgJiAweGMwMDAwMCkgPT0gMCkKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIFVTQl9ETUFfQ0ZHLCAmTUFDVmFsdWUpOwotCQkJCQkJLy8gVG8gcHJldmVudCBSZWFkIFJlZ2lzdGVyIGVycm9yLCB3ZSAzcmQgY2hlY2sgdGhlIHZhbGlkaXR5LgotCQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4YzAwMDAwKSA9PSAwKQotCQkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsICZNQUNWYWx1ZSk7Ci0JCQkJCQlNQUNWYWx1ZSB8PSAweDgwMDAwOwotCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgVVNCX0RNQV9DRkcsIE1BQ1ZhbHVlKTsKLQotCQkJCQkJLy8gV2FpdCAxbXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKLQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0KLQkJCQkJCU1BQ1ZhbHVlICY9ICh+MHg4MDAwMCk7Ci0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBVU0JfRE1BX0NGRywgTUFDVmFsdWUpOwotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlx0U2V0IDB4MmEwIGJpdDE5LiBDbGVhciBVU0IgRE1BIFRYIHBhdGhcbiIpKTsKLQotCQkJCQkJLy8gV2FpdCA1bXMgdG8gcHJldmVudCBuZXh0IFVSQiB0byBidWxrb3V0IGJlZm9yZSBIVyByZXNldC4gYnkgTUFYTEVFIDEyLTI1LTIwMDcKLQkJCQkJCS8vUlRNUHVzZWNEZWxheSg1MDAwKTsKLQotCQkJCQkJaWYgKChwQWQtPmJ1bGtSZXNldFBpcGVpZCAmIEJVTEtPVVRfTUdNVF9SRVNFVF9GTEFHKSA9PSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRykKLQkJCQkJCXsKLQkJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQpOwotCQkJCQkJCWlmIChwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4IDwgTUdNVF9SSU5HX1NJWkUgLyogcE1MTUVDb250ZXh0LT5iV2FpdGluZ0J1bGtPdXQgPT0gVFJVRSAqLykKLQkJCQkJCQl7Ci0JCQkJCQkJCVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfTUxNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCVJUVVNCS2lja0J1bGtPdXQocEFkKTsKLQotCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcdFRYIE1HTVQgUkVDT1ZFUiBEb25lIVxuIikpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBIVFRYQ29udGV4dCA9ICYocEFkLT5UeENvbnRleHRbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKLQkJCQkJCQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKLQkJCQkJCQlSVE1QX0lOVF9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCQkJCQkJCWlmICggcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0gPT0gRkFMU0UpCi0JCQkJCQkJewotCQkJCQkJCQlwQWQtPkJ1bGtPdXRQZW5kaW5nW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IFRSVUU7Ci0JCQkJCQkJCXBIVFRYQ29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7Ci0JCQkJCQkJCXBBZC0+d2F0Y2hEb2dUeFBlbmRpbmdDbnRbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gMTsKLQotCQkJCQkJCQkvLyBubyBtYXR0ZXIgd2hhdCwgY2xlYW4gdGhlIGZsYWcKLQkJCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQotCQkJCQkJCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKLQkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQkJCQkJewotCQkJCQkJCQlSVFVTQkluaXRIVFR4RGVzYyhwQWQsIHBIVFRYQ29udGV4dCwgcEFkLT5idWxrUmVzZXRQaXBlaWQsIHBIVFRYQ29udGV4dC0+QnVsa091dFNpemUsICh1c2JfY29tcGxldGVfdClSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUpOwotCi0JCQkJCQkJCWlmKChyZXQgPSBSVFVTQl9TVUJNSVRfVVJCKHBIVFRYQ29udGV4dC0+cFVyYikpIT0wKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkJUlRNUF9JTlRfTE9DSygmcEFkLT5CdWxrT3V0TG9ja1twQWQtPmJ1bGtSZXNldFBpcGVpZF0sIElycUZsYWdzKTsKLQkJCQkJCQkJCXBBZC0+QnVsa091dFBlbmRpbmdbcEFkLT5idWxrUmVzZXRQaXBlaWRdID0gRkFMU0U7Ci0JCQkJCQkJCQlwSFRUWENvbnRleHQtPklSUFBlbmRpbmcgPSBGQUxTRTsKLQkJCQkJCQkJCQlwQWQtPndhdGNoRG9nVHhQZW5kaW5nQ250W3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSA9IDA7Ci0JCQkJCQkJCQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCi0JCQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBTdWJtaXQgVHggVVJCIGZhaWxlZCAlZFxuIiwgcmV0KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtPdXRMb2NrW3BBZC0+YnVsa1Jlc2V0UGlwZWlkXSwgSXJxRmxhZ3MpOwotCQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIlx0Q01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBUeENvbnRleHRbJWRdOkNXUG9zPSVsZCwgTkJQb3M9JWxkLCBFTkJQb3M9JWxkLCBiQ29weT0lZCwgcGVuZGluZz0lZCFcbiIsCi0JCQkJCQkJCQkJCQlwQWQtPmJ1bGtSZXNldFBpcGVpZCwgcEhUVFhDb250ZXh0LT5DdXJXcml0ZVBvc2l0aW9uLCBwSFRUWENvbnRleHQtPk5leHRCdWxrT3V0UG9zaXRpb24sCi0JCQkJCQkJCQkJCQkJCQlwSFRUWENvbnRleHQtPkVOZXh0QnVsa091dFBvc2l0aW9uLCBwSFRUWENvbnRleHQtPmJDb3B5U2F2ZVBhZCwgcEFkLT5CdWxrT3V0UGVuZGluZ1twQWQtPmJ1bGtSZXNldFBpcGVpZF0pKTsKLQkJCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJcdFx0QnVsa091dCBSZXE9MHglbHgsIENvbXBsZXRlPTB4JWx4LCBPdGhlcj0weCVseFxuIiwKLQkJCQkJCQkJCQkJCQkJCXBBZC0+QnVsa091dFJlcSwgcEFkLT5CdWxrT3V0Q29tcGxldGUsIHBBZC0+QnVsa091dENvbXBsZXRlT3RoZXIpKTsKLQkJCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7Ci0JCQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlx0Q01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUOiBTdWJtaXQgVHggREFUQSBVUkIgZm9yIGZhaWxlZCBCdWxrUmVxKDB4JWx4KSBEb25lLCBzdGF0dXM9JWQhXG4iLCBwQWQtPmJ1bGtSZXNldFJlcVtwQWQtPmJ1bGtSZXNldFBpcGVpZF0sIHBIVFRYQ29udGV4dC0+cFVyYi0+c3RhdHVzKSk7Ci0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdKTsKLQkJCQkJCQkJLy9SVE1QX0lOVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7Ci0KLQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkNtZFRocmVhZCA6IFRYIERBVEEgUkVDT1ZFUiBGQUlMIGZvciBCdWxrUmVxKDB4JWx4KSBiZWNhdXNlIEJ1bGtPdXRQZW5kaW5nWyVkXSBpcyBUUlVFIVxuIiwgcEFkLT5idWxrUmVzZXRSZXFbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBwQWQtPmJ1bGtSZXNldFBpcGVpZCkpOwotCQkJCQkJCQlpZiAocEFkLT5idWxrUmVzZXRQaXBlaWQgPT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJVUNIQVIJcGVuZGluZ0NvbnRleHQgPSAwOwotCQkJCQkJCQkJUEhUX1RYX0NPTlRFWFQgcEhUVFhDb250ZXh0ID0gKFBIVF9UWF9DT05URVhUKSgmcEFkLT5UeENvbnRleHRbcEFkLT5idWxrUmVzZXRQaXBlaWQgXSk7Ci0JCQkJCQkJCQlQVFhfQ09OVEVYVCBwTUxNRUNvbnRleHQgPSAoUFRYX0NPTlRFWFQpKHBBZC0+TWdtdFJpbmcuQ2VsbFtwQWQtPk1nbXRSaW5nLlR4RG1hSWR4XS5BbGxvY1ZhKTsKLQkJCQkJCQkJCVBUWF9DT05URVhUIHBOVUxMQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+UHNQb2xsQ29udGV4dCk7Ci0JCQkJCQkJCQlQVFhfQ09OVEVYVCBwUHNQb2xsQ29udGV4dCA9IChQVFhfQ09OVEVYVCkoJnBBZC0+TnVsbENvbnRleHQpOwotCi0JCQkJCQkJCQlpZiAocEhUVFhDb250ZXh0LT5JUlBQZW5kaW5nKQotCQkJCQkJCQkJCXBlbmRpbmdDb250ZXh0IHw9IDE7Ci0JCQkJCQkJCQllbHNlIGlmIChwTUxNRUNvbnRleHQtPklSUFBlbmRpbmcpCi0JCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gMjsKLQkJCQkJCQkJCWVsc2UgaWYgKHBOVUxMQ29udGV4dC0+SVJQUGVuZGluZykKLQkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCB8PSA0OwotCQkJCQkJCQkJZWxzZSBpZiAocFBzUG9sbENvbnRleHQtPklSUFBlbmRpbmcpCi0JCQkJCQkJCQkJcGVuZGluZ0NvbnRleHQgfD0gODsKLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQlwZW5kaW5nQ29udGV4dCA9IDA7Ci0KLQkJCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCJcdFRYIE9jY3VwaWVkIGJ5ICVkIVxuIiwgcGVuZGluZ0NvbnRleHQpKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJLy8gbm8gbWF0dGVyIHdoYXQsIGNsZWFuIHRoZSBmbGFnCi0JCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUKTsKLQotCQkJCQkJCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+QnVsa091dExvY2tbcEFkLT5idWxrUmVzZXRQaXBlaWRdLCBJcnFGbGFncyk7Ci0KLQkJCQkJCQkJUlRVU0JfU0VUX0JVTEtfRkxBRyhwQWQsIChmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUwgPDwgcEFkLT5idWxrUmVzZXRQaXBlaWQpKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotCQkJCQkJCS8vUlRVU0JLaWNrQnVsa091dChwQWQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJCS8vIERvbid0IGNhbmNlbCBCVUxLSU4uCi0JCQkJCQl3aGlsZSAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKSAmJgotCQkJCQkJCQkoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPiAwKQotCQkJCQkJCXsKLQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkJ1bGtJbiBJUlAgUGVuZGluZyEhY2FuY2VsIGl0IVxuIikpOwotCQkJCQkJCQlSVFVTQkNhbmNlbFBlbmRpbmdCdWxrSW5JUlAocEFkKTsKLQkJCQkJCQl9Ci0JCQkJCQkJUlRNUHVzZWNEZWxheSgxMDAwMDApOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoKGF0b21pY19yZWFkKCZwQWQtPlBlbmRpbmdSeCkgPT0gMCkgJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKQotCQkJCQkJewotCQkJCQkJCVVDSEFSCWk7Ci0JCQkJCQkJUlRVU0JSeFBhY2tldChwQWQpOwotCQkJCQkJCXBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4ID0gMDsJLy8gTmV4dCBSeCBSZWFkIGluZGV4Ci0JCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5JbmRleAkJPSAwOwkvLyBSeCBCdWxrIHBvaW50ZXIKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSk7IGkrKykKLQkJCQkJCQl7Ci0JCQkJCQkJCVBSWF9DT05URVhUICBwUnhDb250ZXh0ID0gJihwQWQtPlJ4Q29udGV4dFtpXSk7Ci0KLQkJCQkJCQkJcFJ4Q29udGV4dC0+cEFkCT0gcEFkOwotCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZQkJPSBGQUxTRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZwk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5SZWFkYWJsZQk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5SZW9yZGVySW5Vc2UgPSBGQUxTRTsKLQotCQkJCQkJCX0KLQkJCQkJCQlSVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0JCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUVVNCQnVsa1JlY2VpdmVcbiIpKTsKLQkJCQkJCX0qLwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfT1VUPD09PVxuIikpOwotICAgIAkgICAJCQlicmVhazsKLQotCQkJCWNhc2UgQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQgOiBDTURUSFJFQURfUkVTRVRfQlVMS19JTiA9PT0gPlxuIikpOwotCi0JCQkJCS8vIEFsbCB0cmFuc2ZlcnMgbXVzdCBiZSBhYm9ydGVkIG9yIGNhbmNlbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXNldCB0aGUgcGlwZS4KLQkJCQkJewotCQkJCQkJVUlOVDMyCQlNQUNWYWx1ZTsKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCQkJCQl7Ci0JCQkJCQkvL3doaWxlICgoYXRvbWljX3JlYWQoJnBBZC0+UGVuZGluZ1J4KSA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQkJCQkJCWlmKChwQWQtPlBlbmRpbmdSeCA+IDApICYmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKLQkJCQkJCXsKLQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiQnVsa0luIElSUCBQZW5kaW5nISEhXG4iKSk7Ci0JCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQKHBBZCk7CisJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgICAgICgiQnVsa0luIElSUCBQZW5kaW5nISEhXG4iKSk7CisJCQkJCQkJUlRVU0JDYW5jZWxQZW5kaW5nQnVsa0luSVJQCisJCQkJCQkJICAgIChwQWQpOwogCQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDAwKTsKIAkJCQkJCQlwQWQtPlBlbmRpbmdSeCA9IDA7CiAJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvKiBXYWl0IDEwbXMgYmVmb3JlIHJlYWRpbmcgcmVnaXN0ZXIuICovCisJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDApOworCQkJCQludFN0YXR1cyA9CisJCQkJCSAgICBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIE1BQ19DU1IwLAorCQkJCQkJCQkgJk1BQ1ZhbHVlKTsKKworCQkJCQlpZiAoKE5UX1NVQ0NFU1MobnRTdGF0dXMpID09IFRSVUUpICYmCisJCQkJCSAgICAoIShSVE1QX1RFU1RfRkxBRworCQkJCQkgICAgICAgKHBBZCwKKwkJCQkJCShmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCisJCQkJCQkgfCBmUlRNUF9BREFQVEVSX1JBRElPX09GRiB8CisJCQkJCQkgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTCisJCQkJCQkgfAorCQkJCQkJIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkpCisJCQkJCXsKKwkJCQkJCXU4IGk7CisKKwkJCQkJCWlmIChSVE1QX1RFU1RfRkxBRworCQkJCQkJICAgIChwQWQsCisJCQkJCQkgICAgIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCisJCQkJCQkgICAgICB8IGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCisJCQkJCQkgICAgICB8CisJCQkJCQkgICAgICBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MKKwkJCQkJCSAgICAgIHwKKwkJCQkJCSAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQorCQkJCQkJCWJyZWFrOworCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5Qb3NpdGlvbiA9CisJCQkJCQkgICAgcEFkLT5SeENvbnRleHRbcEFkLT4KKwkJCQkJCQkJICAgTmV4dFJ4QnVsa0luSW5kZXhdLgorCQkJCQkJICAgIEJ1bGtJbk9mZnNldDsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCSAoIkJVTEtfSU5fUkVTRVQ6IE5CSUlkeD0weCV4LE5CSVJJZHg9MHgleCwgQklSUG9zPTB4JWx4LiBCSVJlcT14JWx4LCBCSUNvbXBsZXRlPTB4JWx4LCBCSUNGYWlsMHglbHhcbiIsCisJCQkJCQkJICBwQWQtPgorCQkJCQkJCSAgTmV4dFJ4QnVsa0luSW5kZXgsCisJCQkJCQkJICBwQWQtPgorCQkJCQkJCSAgTmV4dFJ4QnVsa0luUmVhZEluZGV4LAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIE5leHRSeEJ1bGtJblBvc2l0aW9uLAorCQkJCQkJCSAgcEFkLT5CdWxrSW5SZXEsCisJCQkJCQkJICBwQWQtPkJ1bGtJbkNvbXBsZXRlLAorCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkgIEJ1bGtJbkNvbXBsZXRlRmFpbCkpOworCQkJCQkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsKKwkJCQkJCSAgICAgaSsrKSB7CisJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkJCSAoIlx0UnhDb250ZXh0WyVkXTogSVJQUGVuZGluZz0lZCwgSW5Vc2U9JWQsIFJlYWRhYmxlPSVkIVxuIiwKKwkJCQkJCQkJICBpLAorCQkJCQkJCQkgIHBBZC0+CisJCQkJCQkJCSAgUnhDb250ZXh0W2ldLgorCQkJCQkJCQkgIElSUFBlbmRpbmcsCisJCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkJICBSeENvbnRleHRbaV0uCisJCQkJCQkJCSAgSW5Vc2UsCisJCQkJCQkJCSAgcEFkLT4KKwkJCQkJCQkJICBSeENvbnRleHRbaV0uCisJCQkJCQkJCSAgUmVhZGFibGUpKTsKIAkJCQkJCX0KKwkJCQkJCS8qCiAKLQkJCQkJCS8vIFdhaXQgMTBtcyBiZWZvcmUgcmVhZGluZyByZWdpc3Rlci4KLQkJCQkJCVJUTVB1c2VjRGVsYXkoMTAwMDApOwotCQkJCQkJbnRTdGF0dXMgPSBSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIE1BQ19DU1IwLCAmTUFDVmFsdWUpOworCQkJCQkJICAgREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikpOwogCi0JCQkJCQlpZiAoKE5UX1NVQ0NFU1MobnRTdGF0dXMpID09IFRSVUUpICYmCi0JCQkJCQkJKCEoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkpKQotCQkJCQkJewotCQkJCQkJCVVDSEFSCWk7CisJCQkJCQkgICBwQWQtPk5leHRSeEJ1bGtJblJlYWRJbmRleCA9IDA7ICAgICAgLy8gTmV4dCBSeCBSZWFkIGluZGV4CisJCQkJCQkgICBwQWQtPk5leHRSeEJ1bGtJbkluZGV4ICAgICAgICAgICAgICAgPSAwOyAgICAvLyBSeCBCdWxrIHBvaW50ZXIKKwkJCQkJCSAgIGZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQorCQkJCQkJICAgeworCQkJCQkJICAgc3RydWN0IHJ0X3J4X2NvbnRleHQgKnBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKIAotCQkJCQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSkKKwkJCQkJCSAgIHBSeENvbnRleHQtPnBBZCAgICAgID0gcEFkOworCQkJCQkJICAgcFJ4Q29udGV4dC0+SW5Vc2UgICAgICAgICAgICA9IEZBTFNFOworCQkJCQkJICAgcFJ4Q29udGV4dC0+SVJQUGVuZGluZyAgICAgICA9IEZBTFNFOworCQkJCQkJICAgcFJ4Q29udGV4dC0+UmVhZGFibGUgPSBGQUxTRTsKKwkJCQkJCSAgIHBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOworCisJCQkJCQkgICB9ICovCisJCQkJCQlSVE1QX0NMRUFSX0ZMQUcocEFkLAorCQkJCQkJCQlmUlRNUF9BREFQVEVSX0JVTEtJTl9SRVNFVCk7CisJCQkJCQlmb3IgKGkgPSAwOworCQkJCQkJICAgICBpIDwKKwkJCQkJCSAgICAgcEFkLT5Db21tb25DZmcuCisJCQkJCQkgICAgIE51bU9mQnVsa0luSVJQOyBpKyspIHsKKwkJCQkJCQkvKlJUVVNCQnVsa1JlY2VpdmUocEFkKTsgKi8KKwkJCQkJCQlzdHJ1Y3QgcnRfcnhfY29udGV4dCAqcFJ4Q29udGV4dDsKKwkJCQkJCQlQVVJCIHBVcmI7CisJCQkJCQkJaW50IHJldCA9IDA7CisJCQkJCQkJdW5zaWduZWQgbG9uZyBJcnFGbGFnczsKKworCQkJCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+CisJCQkJCQkJCSAgICAgIEJ1bGtJbkxvY2ssCisJCQkJCQkJCSAgICAgIElycUZsYWdzKTsKKwkJCQkJCQlwUnhDb250ZXh0ID0KKwkJCQkJCQkgICAgJihwQWQtPgorCQkJCQkJCSAgICAgIFJ4Q29udGV4dFtwQWQtPgorCQkJCQkJCQkJTmV4dFJ4QnVsa0luSW5kZXhdKTsKKwkJCQkJCQlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkKKwkJCQkJCQkgICAgfHwgKHBSeENvbnRleHQtPgorCQkJCQkJCQlSZWFkYWJsZSA9PQorCQkJCQkJCQlUUlVFKQorCQkJCQkJCSAgICB8fCAocFJ4Q29udGV4dC0+CisJCQkJCQkJCUluVXNlID09CisJCQkJCQkJCVRSVUUpKSB7CisJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSworCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkgICAgIEJ1bGtJbkxvY2ssCisJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOwogCQkJCQkJCQlicmVhazsKLQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJblBvc2l0aW9uID0gcEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0uQnVsa0luT2Zmc2V0OwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJVTEtfSU5fUkVTRVQ6IE5CSUlkeD0weCV4LE5CSVJJZHg9MHgleCwgQklSUG9zPTB4JWx4LiBCSVJlcT14JWx4LCBCSUNvbXBsZXRlPTB4JWx4LCBCSUNGYWlsMHglbHhcbiIsCi0JCQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4LCAgcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUG9zaXRpb24sIHBBZC0+QnVsa0luUmVxLCBwQWQtPkJ1bGtJbkNvbXBsZXRlLCBwQWQtPkJ1bGtJbkNvbXBsZXRlRmFpbCkpOwotCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKLQkJCQkJCQl7Ci0gCQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJcdFJ4Q29udGV4dFslZF06IElSUFBlbmRpbmc9JWQsIEluVXNlPSVkLCBSZWFkYWJsZT0lZCFcbiIKLQkJCQkJCQkJCSwgaSwgcEFkLT5SeENvbnRleHRbaV0uSVJQUGVuZGluZywgcEFkLT5SeENvbnRleHRbaV0uSW5Vc2UsIHBBZC0+UnhDb250ZXh0W2ldLlJlYWRhYmxlKSk7CiAJCQkJCQkJfQotIAkJCQkJCQkvKgorCQkJCQkJCXBSeENvbnRleHQtPkluVXNlID0KKwkJCQkJCQkgICAgVFJVRTsKKwkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nID0KKwkJCQkJCQkgICAgVFJVRTsKKwkJCQkJCQlwQWQtPlBlbmRpbmdSeCsrOworCQkJCQkJCXBBZC0+QnVsa0luUmVxKys7CisJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPgorCQkJCQkJCQkJQnVsa0luTG9jaywKKwkJCQkJCQkJCUlycUZsYWdzKTsKIAotCQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKKwkJCQkJCQkvKiBJbml0IFJ4IGNvbnRleHQgZGVzY3JpcHRvciAqLworCQkJCQkJCVJUVVNCSW5pdFJ4RGVzYyhwQWQsCisJCQkJCQkJCQlwUnhDb250ZXh0KTsKKwkJCQkJCQlwVXJiID0gcFJ4Q29udGV4dC0+cFVyYjsKKwkJCQkJCQlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpICE9IDApIHsJLyogZmFpbCAqLwogCi0JCQkJCQkJcEFkLT5OZXh0UnhCdWxrSW5SZWFkSW5kZXggPSAwOwkvLyBOZXh0IFJ4IFJlYWQgaW5kZXgKLQkJCQkJCQlwQWQtPk5leHRSeEJ1bGtJbkluZGV4CQk9IDA7CS8vIFJ4IEJ1bGsgcG9pbnRlcgotCQkJCQkJCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFKTsgaSsrKQotCQkJCQkJCXsKLQkJCQkJCQkJUFJYX0NPTlRFWFQgIHBSeENvbnRleHQgPSAmKHBBZC0+UnhDb250ZXh0W2ldKTsKLQotCQkJCQkJCQlwUnhDb250ZXh0LT5wQWQJPSBwQWQ7Ci0JCQkJCQkJCXBSeENvbnRleHQtPkluVXNlCQk9IEZBTFNFOwotCQkJCQkJCQlwUnhDb250ZXh0LT5JUlBQZW5kaW5nCT0gRkFMU0U7Ci0JCQkJCQkJCXBSeENvbnRleHQtPlJlYWRhYmxlCT0gRkFMU0U7Ci0JCQkJCQkJCXBSeENvbnRleHQtPlJlb3JkZXJJblVzZSA9IEZBTFNFOwotCi0JCQkJCQkJfSovCi0JCQkJCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CVUxLSU5fUkVTRVQpOwotCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBwQWQtPkNvbW1vbkNmZy5OdW1PZkJ1bGtJbklSUDsgaSsrKQotCQkJCQkJCXsKLQkJCQkJCQkJLy9SVFVTQkJ1bGtSZWNlaXZlKHBBZCk7Ci0JCQkJCQkJCVBSWF9DT05URVhUCQlwUnhDb250ZXh0OwotCQkJCQkJCQlQVVJCCQkJcFVyYjsKLQkJCQkJCQkJaW50CQkJCXJldCA9IDA7Ci0JCQkJCQkJCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0KLQotCQkJCQkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQkJCQkJCQkJcFJ4Q29udGV4dCA9ICYocEFkLT5SeENvbnRleHRbcEFkLT5OZXh0UnhCdWxrSW5JbmRleF0pOwotCQkJCQkJCQlpZiAoKHBBZC0+UGVuZGluZ1J4ID4gMCkgfHwgKHBSeENvbnRleHQtPlJlYWRhYmxlID09IFRSVUUpIHx8IChwUnhDb250ZXh0LT5JblVzZSA9PSBUUlVFKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPkJ1bGtJbkxvY2ssIElycUZsYWdzKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXBSeENvbnRleHQtPkluVXNlID0gVFJVRTsKLQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IFRSVUU7Ci0JCQkJCQkJCXBBZC0+UGVuZGluZ1J4Kys7Ci0JCQkJCQkJCXBBZC0+QnVsa0luUmVxKys7Ci0JCQkJCQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0KLQkJCQkJCQkJLy8gSW5pdCBSeCBjb250ZXh0IGRlc2NyaXB0b3IKLQkJCQkJCQkJUlRVU0JJbml0UnhEZXNjKHBBZCwgcFJ4Q29udGV4dCk7Ci0JCQkJCQkJCXBVcmIgPSBwUnhDb250ZXh0LT5wVXJiOwotCQkJCQkJCQlpZiAoKHJldCA9IFJUVVNCX1NVQk1JVF9VUkIocFVyYikpIT0wKQotCQkJCQkJCQl7CS8vIGZhaWwKLQotCQkJCQkJCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5CdWxrSW5Mb2NrLCBJcnFGbGFncyk7Ci0JCQkJCQkJCQlwUnhDb250ZXh0LT5JblVzZSA9IEZBTFNFOwotCQkJCQkJCQkJcFJ4Q29udGV4dC0+SVJQUGVuZGluZyA9IEZBTFNFOwotCQkJCQkJCQkJcEFkLT5QZW5kaW5nUngtLTsKLQkJCQkJCQkJCXBBZC0+QnVsa0luUmVxLS07Ci0JCQkJCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+QnVsa0luTG9jaywgSXJxRmxhZ3MpOwotCQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgZmFpbGVkKCVkKSwgc3RhdHVzPSVkXG4iLCByZXQsIHBVcmItPnN0YXR1cykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJewkvLyBzdWNjZXNzCi0JCQkJCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgRG9uZSwgc3RhdHVzPSVkIVxuIiwgcFVyYi0+c3RhdHVzKSk7Ci0JCQkJCQkJCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKLQkJCQkJCQkJfQorCQkJCQkJCQlSVE1QX0lSUV9MT0NLCisJCQkJCQkJCSAgICAoJnBBZC0+CisJCQkJCQkJCSAgICAgQnVsa0luTG9jaywKKwkJCQkJCQkJICAgICBJcnFGbGFncyk7CisJCQkJCQkJCXBSeENvbnRleHQtPgorCQkJCQkJCQkgICAgSW5Vc2UgPQorCQkJCQkJCQkgICAgRkFMU0U7CisJCQkJCQkJCXBSeENvbnRleHQtPgorCQkJCQkJCQkgICAgSVJQUGVuZGluZyA9CisJCQkJCQkJCSAgICBGQUxTRTsKKwkJCQkJCQkJcEFkLT4KKwkJCQkJCQkJICAgIFBlbmRpbmdSeC0tOworCQkJCQkJCQlwQWQtPgorCQkJCQkJCQkgICAgQnVsa0luUmVxLS07CisJCQkJCQkJCVJUTVBfSVJRX1VOTE9DSworCQkJCQkJCQkgICAgKCZwQWQtPgorCQkJCQkJCQkgICAgIEJ1bGtJbkxvY2ssCisJCQkJCQkJCSAgICAgSXJxRmxhZ3MpOworCQkJCQkJCQlEQkdQUklOVAorCQkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCQkgICAgICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgZmFpbGVkKCVkKSwgc3RhdHVzPSVkXG4iLAorCQkJCQkJCQkgICAgICByZXQsCisJCQkJCQkJCSAgICAgIHBVcmItPgorCQkJCQkJCQkgICAgICBzdGF0dXMpKTsKKwkJCQkJCQl9IGVsc2UgewkvKiBzdWNjZXNzICovCisJCQkJCQkJCS8qREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQklEb25lLCBQZW5kPSVkLEJJSWR4PSVkLEJJUklkeD0lZCFcbiIsICovCisJCQkJCQkJCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5QZW5kaW5nUngsIHBBZC0+TmV4dFJ4QnVsa0luSW5kZXgsIHBBZC0+TmV4dFJ4QnVsa0luUmVhZEluZGV4KSk7ICovCisJCQkJCQkJCURCR1BSSU5UX1JBVworCQkJCQkJCQkgICAgKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkgICAgICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFN1Ym1pdCBSeCBVUkIgRG9uZSwgc3RhdHVzPSVkIVxuIiwKKwkJCQkJCQkJICAgICAgcFVyYi0+CisJCQkJCQkJCSAgICAgIHN0YXR1cykpOworCQkJCQkJCQlBU1NFUlQoKHBSeENvbnRleHQtPkluVXNlID09IHBSeENvbnRleHQtPklSUFBlbmRpbmcpKTsKIAkJCQkJCQl9Ci0KIAkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBDYXJkIG11c3QgYmUgcmVtb3ZlZAotCQkJCQkJCWlmIChOVF9TVUNDRVNTKG50U3RhdHVzKSAhPSBUUlVFKQotCQkJCQkJCXsKLQkJCQkJCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKTsKLQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBSZWFkIFJlZ2lzdGVyIEZhaWxlZCFDYXJkIG11c3QgYmUgcmVtb3ZlZCEhXG5cbiIpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIkNNRFRIUkVBRF9SRVNFVF9CVUxLX0lOOiBDYW5ub3QgZG8gYnVsayBpbiBiZWNhdXNlIGZsYWdzKDB4JWx4KSBvbiAhXG4iLCBwQWQtPkZsYWdzKSk7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIENhcmQgbXVzdCBiZSByZW1vdmVkICovCisJCQkJCQlpZiAoTlRfU1VDQ0VTUyhudFN0YXR1cykgIT0KKwkJCQkJCSAgICBUUlVFKSB7CisJCQkJCQkJUlRNUF9TRVRfRkxBRyhwQWQsCisJCQkJCQkJCSAgICAgIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCk7CisJCQkJCQkJREJHUFJJTlRfUkFXCisJCQkJCQkJICAgIChSVF9ERUJVR19FUlJPUiwKKwkJCQkJCQkgICAgICgiQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU46IFJlYWQgUmVnaXN0ZXIgRmFpbGVkIUNhcmQgbXVzdCBiZSByZW1vdmVkISFcblxuIikpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlEQkdQUklOVF9SQVcKKwkJCQkJCQkgICAgKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSAgICAgKCJDTURUSFJFQURfUkVTRVRfQlVMS19JTjogQ2Fubm90IGRvIGJ1bGsgaW4gYmVjYXVzZSBmbGFncygweCVseCkgb24gIVxuIiwKKwkJCQkJCQkgICAgICBwQWQtPkZsYWdzKSk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJfQotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gPD09PVxuIikpOwotCQkJCQlicmVhazsKKwkJCQl9CisJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkgICAgICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1JFU0VUX0JVTEtfSU4gPD09PVxuIikpOworCQkJCWJyZWFrOwogCi0JCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRDoKKwkJCWNhc2UgQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQ6CisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCBTZXRBc2ljV2NpZDsKKwkJCQkJdTE2IG9mZnNldDsKKwkJCQkJdTMyIE1BQ1ZhbHVlLCBNQUNSVmFsdWUgPSAwOworCQkJCQlTZXRBc2ljV2NpZCA9CisJCQkJCSAgICAqKChzdHJ1Y3QgcnRfc2V0X2FzaWNfd2NpZCAqKShwRGF0YSkpOworCisJCQkJCWlmIChTZXRBc2ljV2NpZC5XQ0lEID49CisJCQkJCSAgICBNQVhfTEVOX09GX01BQ19UQUJMRSkKKwkJCQkJCXJldHVybjsKKworCQkJCQlvZmZzZXQgPQorCQkJCQkgICAgTUFDX1dDSURfQkFTRSArCisJCQkJCSAgICAoKHU4KVNldEFzaWNXY2lkLldDSUQpICoKKwkJCQkJICAgIEhXX1dDSURfRU5UUllfU0laRTsKKworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgICAgICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgOiBXQ0lEID0gJWxkLCBTZXRUaWQgID0gJWx4LCBEZWxldGVUaWQgPSAlbHguXG4iLAorCQkJCQkJICAgICAgU2V0QXNpY1djaWQuV0NJRCwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkLlNldFRpZCwKKwkJCQkJCSAgICAgIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCkpOworCQkJCQlNQUNWYWx1ZSA9CisJCQkJCSAgICAocEFkLT5NYWNUYWIuCisJCQkJCSAgICAgQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS4KKwkJCQkJICAgICBBZGRyWzNdIDw8IDI0KSArCisJCQkJCSAgICAocEFkLT5NYWNUYWIuCisJCQkJCSAgICAgQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS4KKwkJCQkJICAgICBBZGRyWzJdIDw8IDE2KSArCisJCQkJCSAgICAocEFkLT5NYWNUYWIuCisJCQkJCSAgICAgQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS4KKwkJCQkJICAgICBBZGRyWzFdIDw8IDgpICsKKwkJCQkJICAgIChwQWQtPk1hY1RhYi4KKwkJCQkJICAgICBDb250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMF0pOworCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsCisJCQkJCQkgICAgICgiMS1NQUNWYWx1ZT0gJXgsXG4iLAorCQkJCQkJICAgICAgTUFDVmFsdWUpKTsKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LAorCQkJCQkJCSAgICAgIE1BQ1ZhbHVlKTsKKwkJCQkJLyogUmVhZCBiaXRtYXNrICovCisJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0ICsgNCwKKwkJCQkJCQkgICAgICZNQUNSVmFsdWUpOworCQkJCQlpZiAoU2V0QXNpY1djaWQuRGVsZXRlVGlkICE9IDB4ZmZmZmZmZmYpCisJCQkJCQlNQUNSVmFsdWUgJj0KKwkJCQkJCSAgICAoflNldEFzaWNXY2lkLkRlbGV0ZVRpZCk7CisJCQkJCWlmIChTZXRBc2ljV2NpZC5TZXRUaWQgIT0gMHhmZmZmZmZmZikKKwkJCQkJCU1BQ1JWYWx1ZSB8PQorCQkJCQkJICAgIChTZXRBc2ljV2NpZC5TZXRUaWQpOworCQkJCQlNQUNSVmFsdWUgJj0gMHhmZmZmMDAwMDsKKworCQkJCQlNQUNWYWx1ZSA9CisJCQkJCSAgICAocEFkLT5NYWNUYWIuCisJCQkJCSAgICAgQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS4KKwkJCQkJICAgICBBZGRyWzVdIDw8IDgpICsKKwkJCQkJICAgIHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuCisJCQkJCQkJCVdDSURdLkFkZHJbNF07CisJCQkJCU1BQ1ZhbHVlIHw9IE1BQ1JWYWx1ZTsKKwkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0ICsgNCwKKwkJCQkJCQkgICAgICBNQUNWYWx1ZSk7CisKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIjItTUFDVmFsdWU9ICV4LFxuIiwKKwkJCQkJCSAgICAgIE1BQ1ZhbHVlKSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUjoKKwkJCQl7CisJCQkJCXN0cnVjdCBydF9zZXRfYXNpY193Y2lkX2F0dHJpIFNldEFzaWNXY2lkQXR0cmk7CisJCQkJCXUxNiBvZmZzZXQ7CisJCQkJCXUzMiBNQUNSVmFsdWUgPSAwOworCQkJCQlTSEFSRURLRVlfTU9ERV9TVFJVQyBjc3IxOworCQkJCQlTZXRBc2ljV2NpZEF0dHJpID0KKwkJCQkJICAgICooKHN0cnVjdCBydF9zZXRfYXNpY193Y2lkX2F0dHJpICopCisJCQkJCSAgICAgIChwRGF0YSkpOworCisJCQkJCWlmIChTZXRBc2ljV2NpZEF0dHJpLldDSUQgPj0KKwkJCQkJICAgIE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQorCQkJCQkJcmV0dXJuOworCisJCQkJCW9mZnNldCA9CisJCQkJCSAgICBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArCisJCQkJCSAgICAoKHU4KVNldEFzaWNXY2lkQXR0cmkuV0NJRCkgKgorCQkJCQkgICAgSFdfV0NJRF9BVFRSSV9TSVpFOworCisJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwKKwkJCQkJCSAgICAgKCJDbWQgOiBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVIgOiBXQ0lEID0gJWxkLCBDaXBoZXIgPSAlbHguXG4iLAorCQkJCQkJICAgICAgU2V0QXNpY1djaWRBdHRyaS5XQ0lELAorCQkJCQkJICAgICAgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsKKwkJCQkJLyogUmVhZCBiaXRtYXNrICovCisJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LAorCQkJCQkJCSAgICAgJk1BQ1JWYWx1ZSk7CisJCQkJCU1BQ1JWYWx1ZSA9IDA7CisJCQkJCU1BQ1JWYWx1ZSB8PQorCQkJCQkgICAgKCgodTgpU2V0QXNpY1djaWRBdHRyaS4KKwkJCQkJICAgICAgQ2lwaGVyKSA8PCAxKTsKKworCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsCisJCQkJCQkJICAgICAgTUFDUlZhbHVlKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIjItb2Zmc2V0ID0gJXggLCBNQUNWYWx1ZT0gJXgsXG4iLAorCQkJCQkJICAgICAgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQlvZmZzZXQgPQorCQkJCQkgICAgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArCisJCQkJCSAgICAoKHU4KVNldEFzaWNXY2lkQXR0cmkuV0NJRCkgKgorCQkJCQkgICAgSFdfSVZFSVZfRU5UUllfU0laRTsKKwkJCQkJTUFDUlZhbHVlID0gMDsKKwkJCQkJaWYgKChTZXRBc2ljV2NpZEF0dHJpLkNpcGhlciA8PQorCQkJCQkgICAgIENJUEhFUl9XRVAxMjgpKQorCQkJCQkJTUFDUlZhbHVlIHw9CisJCQkJCQkgICAgKHBBZC0+U3RhQ2ZnLgorCQkJCQkJICAgICBEZWZhdWx0S2V5SWQgPDwgMzApOworCQkJCQllbHNlCisJCQkJCQlNQUNSVmFsdWUgfD0gKDB4MjAwMDAwMDApOworCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsCisJCQkJCQkJICAgICAgTUFDUlZhbHVlKTsKKwkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICAgICAoIjItb2Zmc2V0ID0gJXggLCBNQUNWYWx1ZT0gJXgsXG4iLAorCQkJCQkJICAgICAgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKKworCQkJCQkvKiAqLworCQkJCQkvKiBVcGRhdGUgY2lwaGVyIGFsZ29yaXRobS4gV1NUQSBhbHdheXMgdXNlIEJTUzAgKi8KKwkJCQkJLyogKi8KKwkJCQkJLyogZm9yIGFkaG9jIG1vZGUgb25seSAsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZyAqLworCQkJCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpIHsKKwkJCQkJCW9mZnNldCA9CisJCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0U7CisKKwkJCQkJCVJUVVNCUmVhZE1BQ1JlZ2lzdGVyKHBBZCwKKwkJCQkJCQkJICAgICBvZmZzZXQsCisJCQkJCQkJCSAgICAgJk1BQ1JWYWx1ZSk7CisJCQkJCQlNQUNSVmFsdWUgJj0gKH4weGUpOworCQkJCQkJTUFDUlZhbHVlIHw9CisJCQkJCQkgICAgKCgodTgpU2V0QXNpY1djaWRBdHRyaS4KKwkJCQkJCSAgICAgIENpcGhlcikgPDwgMSk7CisKKwkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsCisJCQkJCQkJCSAgICAgIG9mZnNldCwKKwkJCQkJCQkJICAgICAgTUFDUlZhbHVlKTsKKworCQkJCQkJLypVcGRhdGUgZ3JvdXAga2V5IGNpcGhlciwsYmVjYXVzZSB3ZXAgc3RhdHVzIHNsb3cgdGhhbiBhZGQga2V5LCB3aGVuIHVzZSB6ZXJvIGNvbmZpZyAqLworCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgIFNIQVJFRF9LRVlfTU9ERV9CQVNFCisJCQkJCQkJCSAgICAgKworCQkJCQkJCQkgICAgIDQgKiAoMCAvCisJCQkJCQkJCQkgIDIpLAorCQkJCQkJCQkgICAgICZjc3IxLgorCQkJCQkJCQkgICAgIHdvcmQpOworCisJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0KKwkJCQkJCSAgICBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcjsKKwkJCQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPQorCQkJCQkJICAgIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyOworCisJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLAorCQkJCQkJCQkgICAgICBTSEFSRURfS0VZX01PREVfQkFTRQorCQkJCQkJCQkgICAgICArCisJCQkJCQkJCSAgICAgIDQgKiAoMCAvCisJCQkJCQkJCQkgICAyKSwKKwkJCQkJCQkJICAgICAgY3NyMS4KKwkJCQkJCQkJICAgICAgd29yZCk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisKKy8qQmVuc29uIG1vZGlmaWVkIGZvciBVU0IgaW50ZXJmYWNlLCBhdm9pZCBpbiBpbnRlcnJ1cHQgd2hlbiB3cml0ZSBrZXksIDIwMDgwNzI0IC0tPiAqLworCQkJY2FzZSBSVF9DTURfU0VUX0tFWV9UQUJMRToJLypHZW5lcmFsIGNhbGwgZm9yIEFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KCkgKi8KKwkJCQl7CisJCQkJCXN0cnVjdCBydF9hZGRfcGFpcndpc2Vfa2V5X2VudHJ5IEtleUluZm87CisJCQkJCUtleUluZm8gPQorCQkJCQkgICAgKigoc3RydWN0IHJ0X2FkZF9wYWlyd2lzZV9rZXlfZW50cnkgKikKKwkJCQkJICAgICAgKHBEYXRhKSk7CisJCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKKwkJCQkJCQkJS2V5SW5mby5NYWNBZGRyLAorCQkJCQkJCQkodTgpS2V5SW5mby4KKwkJCQkJCQkJTWFjVGFiTWF0Y2hXQ0lELAorCQkJCQkJCQkmS2V5SW5mby4KKwkJCQkJCQkJQ2lwaGVyS2V5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUlRfQ01EX1NFVF9SWF9XQ0lEX1RBQkxFOgkvKkdlbmVyYWwgY2FsbCBmb3IgUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgpICovCisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJCQkJCXU4IEtleUlkeCA9IDA7CisJCQkJCXU4IENpcGhlckFsZyA9IENJUEhFUl9OT05FOworCQkJCQl1OCBBcElkeCA9IEJTUzA7CisKKwkJCQkJcEVudHJ5ID0gKHN0cnVjdCBydF9tYWNfdGFibGVfZW50cnkgKikocERhdGEpOworCisJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAorCQkJCQkJCQkgIEFwSWR4LAorCQkJCQkJCQkgIEtleUlkeCwKKwkJCQkJCQkJICBDaXBoZXJBbGcsCisJCQkJCQkJCSAgcEVudHJ5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisvKkJlbnNvbiBtb2RpZmllZCBmb3IgVVNCIGludGVyZmFjZSwgYXZvaWQgaW4gaW50ZXJydXB0IHdoZW4gd3JpdGUga2V5LCAyMDA4MDcyNCA8LS0gKi8KKworCQkJY2FzZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlk6CisJCQkJeworCQkJCQlzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICpwRW50cnk7CisJCQkJCXBFbnRyeSA9IChzdHJ1Y3QgcnRfbWFjX3RhYmxlX2VudHJ5ICopcERhdGE7CisKIAkJCQkJewotCQkJCQkJUlRfU0VUX0FTSUNfV0NJRAlTZXRBc2ljV2NpZDsKLQkJCQkJCVVTSE9SVAkJb2Zmc2V0OwotCQkJCQkJVUlOVDMyCQlNQUNWYWx1ZSwgTUFDUlZhbHVlID0gMDsKLQkJCQkJCVNldEFzaWNXY2lkID0gKigoUFJUX1NFVF9BU0lDX1dDSUQpKHBEYXRhKSk7Ci0KLQkJCQkJCWlmIChTZXRBc2ljV2NpZC5XQ0lEID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQkJCQkJCXJldHVybjsKLQotCQkJCQkJb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWQuV0NJRCkqSFdfV0NJRF9FTlRSWV9TSVpFOwotCi0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQ21kVGhyZWFkIDogQ01EVEhSRUFEX1NFVF9BU0lDX1dDSUQgOiBXQ0lEID0gJWxkLCBTZXRUaWQgID0gJWx4LCBEZWxldGVUaWQgPSAlbHguXG4iLCBTZXRBc2ljV2NpZC5XQ0lELCBTZXRBc2ljV2NpZC5TZXRUaWQsIFNldEFzaWNXY2lkLkRlbGV0ZVRpZCkpOwotCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzNdPDwyNCkrKHBBZC0+TWFjVGFiLkNvbnRlbnRbU2V0QXNpY1djaWQuV0NJRF0uQWRkclsyXTw8MTYpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMV08PDgpKyhwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbMF0pOwotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIjEtTUFDVmFsdWU9ICV4LFxuIiwgTUFDVmFsdWUpKTsKLQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDVmFsdWUpOwotCQkJCQkJLy8gUmVhZCBiaXRtYXNrCi0JCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCs0LCAmTUFDUlZhbHVlKTsKLQkJCQkJCWlmICggU2V0QXNpY1djaWQuRGVsZXRlVGlkICE9IDB4ZmZmZmZmZmYpCi0JCQkJCQkJTUFDUlZhbHVlICY9ICh+U2V0QXNpY1djaWQuRGVsZXRlVGlkKTsKLQkJCQkJCWlmIChTZXRBc2ljV2NpZC5TZXRUaWQgIT0gMHhmZmZmZmZmZikKLQkJCQkJCQlNQUNSVmFsdWUgfD0gKFNldEFzaWNXY2lkLlNldFRpZCk7Ci0JCQkJCQlNQUNSVmFsdWUgJj0gMHhmZmZmMDAwMDsKLQotCQkJCQkJTUFDVmFsdWUgPSAocEFkLT5NYWNUYWIuQ29udGVudFtTZXRBc2ljV2NpZC5XQ0lEXS5BZGRyWzVdPDw4KStwQWQtPk1hY1RhYi5Db250ZW50W1NldEFzaWNXY2lkLldDSURdLkFkZHJbNF07Ci0JCQkJCQlNQUNWYWx1ZSB8PSBNQUNSVmFsdWU7Ci0JCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQrNCwgTUFDVmFsdWUpOwotCi0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMi1NQUNWYWx1ZT0gJXgsXG4iLCBNQUNWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRF9DSVBIRVI6Ci0JCQkJCXsKLQkJCQkJCVJUX1NFVF9BU0lDX1dDSURfQVRUUkkJU2V0QXNpY1djaWRBdHRyaTsKLQkJCQkJCVVTSE9SVAkJb2Zmc2V0OwotCQkJCQkJVUlOVDMyCQlNQUNSVmFsdWUgPSAwOwotCQkJCQkJU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLQkJCQkJCVNldEFzaWNXY2lkQXR0cmkgPSAqKChQUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSkocERhdGEpKTsKLQotCQkJCQkJaWYgKFNldEFzaWNXY2lkQXR0cmkuV0NJRCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJCQkJCQlyZXR1cm47Ci0KLQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLldDSUQpKkhXX1dDSURfQVRUUklfU0laRTsKLQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkNtZCA6IENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiA6IFdDSUQgPSAlbGQsIENpcGhlciA9ICVseC5cbiIsIFNldEFzaWNXY2lkQXR0cmkuV0NJRCwgU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpKTsKLQkJCQkJCS8vIFJlYWQgYml0bWFzawotCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsICZNQUNSVmFsdWUpOwotCQkJCQkJTUFDUlZhbHVlID0gMDsKLQkJCQkJCU1BQ1JWYWx1ZSB8PSAoKChVQ0hBUilTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikgPDwgMSk7Ci0KLQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKLQotCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArICgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5XQ0lEKSpIV19JVkVJVl9FTlRSWV9TSVpFOwotCQkJCQkJTUFDUlZhbHVlID0gMDsKLQkJCQkJCWlmICggKFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyIDw9IENJUEhFUl9XRVAxMjgpKQotCQkJCQkJCU1BQ1JWYWx1ZSB8PSAoIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCAzMCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJTUFDUlZhbHVlIHw9ICgweDIwMDAwMDAwKTsKLQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgTUFDUlZhbHVlKTsKLQkJCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIyLW9mZnNldCA9ICV4ICwgTUFDVmFsdWU9ICV4LFxuIiwgb2Zmc2V0LCBNQUNSVmFsdWUpKTsKLQotCQkJCQkJLy8KLQkJCQkJCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAotCQkJCQkJLy8KLQkJCQkJCS8vIGZvciBhZGhvYyBtb2RlIG9ubHkgLGJlY2F1c2Ugd2VwIHN0YXR1cyBzbG93IHRoYW4gYWRkIGtleSwgd2hlbiB1c2UgemVybyBjb25maWcKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQyApCisJCQkJCQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsCisJCQkJCQkJCQkgICBwRW50cnktPgorCQkJCQkJCQkJICAgYXBpZHgsCisJCQkJCQkJCQkgICAodTgpCisJCQkJCQkJCQkgICBwRW50cnktPgorCQkJCQkJCQkJICAgQWlkKTsKKwkJCQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PQorCQkJCQkJICAgICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQorCQkJCQkJICAgICYmIChwRW50cnktPldlcFN0YXR1cyA9PQorCQkJCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpKQogCQkJCQkJewotCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFOworCQkJCQkJCXUzMiB1SVYgPSAxOworCQkJCQkJCXU4ICpwdHI7CiAKLQkJCQkJCQlSVFVTQlJlYWRNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgJk1BQ1JWYWx1ZSk7Ci0JCQkJCQkJTUFDUlZhbHVlICY9ICh+MHhlKTsKLQkJCQkJCQlNQUNSVmFsdWUgfD0gKCgoVUNIQVIpU2V0QXNpY1djaWRBdHRyaS5DaXBoZXIpIDw8IDEpOworCQkJCQkJCXB0ciA9ICh1OCAqKSYgdUlWOworCQkJCQkJCSoocHRyICsgMykgPQorCQkJCQkJCSAgICAocEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICBEZWZhdWx0S2V5SWQgPDwgNik7CisJCQkJCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsCisJCQkJCQkJCQkgICAgcEVudHJ5LT4KKwkJCQkJCQkJCSAgICBBaWQsCisJCQkJCQkJCQkgICAgdUlWLAorCQkJCQkJCQkJICAgIDApOworCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlCisJCQkJCQkJICAgIChwQWQsIHBFbnRyeS0+QWlkLAorCQkJCQkJCSAgICAgQlNTMCwKKwkJCQkJCQkgICAgIHBBZC0+CisJCQkJCQkJICAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgIFtwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkJCSAgICAgQ2lwaGVyQWxnLCBGQUxTRSk7CisJCQkJCQl9IGVsc2UgaWYgKHBFbnRyeS0+QXV0aE1vZGUgPT0KKwkJCQkJCQkgICBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQorCQkJCQkJeworCQkJCQkJCXUzMiB1SVYgPSAxOworCQkJCQkJCXU4ICpwdHI7CiAKLQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIE1BQ1JWYWx1ZSk7Ci0KLQkJCQkJCQkvL1VwZGF0ZSBncm91cCBrZXkgY2lwaGVyLCxiZWNhdXNlIHdlcCBzdGF0dXMgc2xvdyB0aGFuIGFkZCBrZXksIHdoZW4gdXNlIHplcm8gY29uZmlnCi0JCQkJCQkJUlRVU0JSZWFkTUFDUmVnaXN0ZXIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KigwLzIpLCAmY3NyMS53b3JkKTsKLQotCQkJCQkJCWNzcjEuZmllbGQuQnNzMEtleTBDaXBoZXJBbGcgPSBTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcjsKLQkJCQkJCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gU2V0QXNpY1djaWRBdHRyaS5DaXBoZXI7Ci0KLQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KigwLzIpLCBjc3IxLndvcmQpOworCQkJCQkJCXB0ciA9ICh1OCAqKSYgdUlWOworCQkJCQkJCSoocHRyICsgMykgPQorCQkJCQkJCSAgICAocEFkLT5TdGFDZmcuCisJCQkJCQkJICAgICBEZWZhdWx0S2V5SWQgPDwgNik7CisJCQkJCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsCisJCQkJCQkJCQkgICAgcEVudHJ5LT4KKwkJCQkJCQkJCSAgICBBaWQsCisJCQkJCQkJCQkgICAgdUlWLAorCQkJCQkJCQkJICAgIDApOworCQkJCQkJCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlCisJCQkJCQkJICAgIChwQWQsIHBFbnRyeS0+QWlkLAorCQkJCQkJCSAgICAgQlNTMCwKKwkJCQkJCQkgICAgIHBBZC0+CisJCQkJCQkJICAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgIFtwQWQtPlN0YUNmZy4KKwkJCQkJCQkgICAgICBEZWZhdWx0S2V5SWRdLgorCQkJCQkJCSAgICAgQ2lwaGVyQWxnLCBGQUxTRSk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8qICovCisJCQkJCQkJLyogT3RoZXIgY2FzZSwgZGlzYWJsZSBlbmdpbmUuICovCisJCQkJCQkJLyogRG9uJ3Qgd29ycnkgV1BBIGtleSwgd2Ugd2lsbCBhZGQgV1BBIEtleSBhZnRlciA0LVdheSBoYW5kc2hha2luZy4gKi8KKwkJCQkJCQkvKiAqLworCQkJCQkJCXUxNiBvZmZzZXQ7CisJCQkJCQkJb2Zmc2V0ID0KKwkJCQkJCQkgICAgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAocEVudHJ5LT5BaWQgKgorCQkJCQkJCSAgICAgSFdfV0NJRF9BVFRSSV9TSVpFKTsKKwkJCQkJCQkvKiBSWF9QS0VZX01PREU6MCBmb3Igbm8gc2VjdXJpdHk7IFJYX0tFWV9UQUI6MCBmb3Igc2hhcmVkIGtleSB0YWJsZTsgQlNTX0lEWDowICovCisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyCisJCQkJCQkJICAgIChwQWQsIG9mZnNldCwgMCk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlk6Ci0JCQkJCXsKLQkJCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCQkJCQkJcEVudHJ5ID0gKE1BQ19UQUJMRV9FTlRSWSAqKXBEYXRhOwogCi0JCQkJCQl7Ci0JCQkJCQkJQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkocEFkLCBwRW50cnktPmFwaWR4LCAoVUNIQVIpcEVudHJ5LT5BaWQpOwotCQkJCQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJiAocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkpCi0JCQkJCQkJewotCQkJCQkJCQlVSU5UMzIgdUlWID0gMDsKLQkJCQkJCQkJUFVDSEFSICBwdHI7CisJCQkJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIHBFbnRyeS0+QWlkLAorCQkJCQkJCSAgICAgIHBFbnRyeS0+QWRkcik7CisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiVXBkYXRlUnhXQ0lEVGFibGUoKTogQWlkPSVkLCBBZGRyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IVxuIiwKKwkJCQkJCSAgcEVudHJ5LT5BaWQsIHBFbnRyeS0+QWRkclswXSwKKwkJCQkJCSAgcEVudHJ5LT5BZGRyWzFdLAorCQkJCQkJICBwRW50cnktPkFkZHJbMl0sCisJCQkJCQkgIHBFbnRyeS0+QWRkclszXSwKKwkJCQkJCSAgcEVudHJ5LT5BZGRyWzRdLAorCQkJCQkJICBwRW50cnktPkFkZHJbNV0pKTsKKwkJCQl9CisJCQkJYnJlYWs7CiAKLQkJCQkJCQkJcHRyID0gKFBVQ0hBUikgJnVJVjsKLQkJCQkJCQkJKihwdHIgKyAzKSA9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgNik7Ci0JCQkJCQkJCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgdUlWLCAwKTsKLQkJCQkJCQkJQXNpY1VwZGF0ZVdDSURBdHRyaWJ1dGUocEFkLCBwRW50cnktPkFpZCwgQlNTMCwgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsIEZBTFNFKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkJCXsKLQkJCQkJCQkJVUlOVDMyIHVJViA9IDA7Ci0JCQkJCQkJCVBVQ0hBUiAgcHRyOworLyogYWRkIGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldCAqLworCQkJY2FzZSBDTURUSFJFQURfVVBEQVRFX1BST1RFQ1Q6CisJCQkJeworCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAsCisJCQkJCQkJICAoQUxMTl9TRVRQUk9URUNUKSwKKwkJCQkJCQkgIFRSVUUsIDApOworCQkJCX0KKwkJCQlicmVhazsKKy8qIGVuZCBqb2hubGkgKi8KIAotCQkJCQkJCQlwdHIgPSAoUFVDSEFSKSAmdUlWOwotCQkJCQkJCQkqKHB0ciArIDMpID0gKHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA8PCA2KTsKLQkJCQkJCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIHBFbnRyeS0+QWlkLCB1SVYsIDApOwotCQkJCQkJCQlBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZShwQWQsIHBFbnRyeS0+QWlkLCBCU1MwLCBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZywgRkFMU0UpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQkvLwotCQkJCQkJCQkvLyBPdGhlciBjYXNlLCBkaXNhYmxlIGVuZ2luZS4KLQkJCQkJCQkJLy8gRG9uJ3Qgd29ycnkgV1BBIGtleSwgd2Ugd2lsbCBhZGQgV1BBIEtleSBhZnRlciA0LVdheSBoYW5kc2hha2luZy4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJVVNIT1JUICAgb2Zmc2V0OwotCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChwRW50cnktPkFpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JCQkJCQkJCS8vIFJYX1BLRVlfTU9ERTowIGZvciBubyBzZWN1cml0eTsgUlhfS0VZX1RBQjowIGZvciBzaGFyZWQga2V5IHRhYmxlOyBCU1NfSURYOjAKLQkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyKHBBZCwgb2Zmc2V0LCAwKTsKLQkJCQkJCQl9CisJCQljYXNlIE9JRF84MDJfMTFfQUREX1dFUDoKKwkJCQl7CisJCQkJCXUzMiBpOworCQkJCQl1MzIgS2V5SWR4OworCQkJCQlzdHJ1Y3QgcnRfbmRpc184MDJfMTFfd2VwICpwV2VwS2V5OworCisJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJICgiQ21kVGhyZWFkOjpPSURfODAyXzExX0FERF9XRVAgIFxuIikpOworCisJCQkJCXBXZXBLZXkgPSAoc3RydWN0IHJ0X25kaXNfODAyXzExX3dlcCAqKXBEYXRhOworCQkJCQlLZXlJZHggPSBwV2VwS2V5LT5LZXlJbmRleCAmIDB4MGZmZmZmZmY7CisKKwkJCQkJLyogaXQgaXMgYSBzaGFyZWQga2V5ICovCisJCQkJCWlmICgoS2V5SWR4ID49IDQpCisJCQkJCSAgICB8fCAoKHBXZXBLZXktPktleUxlbmd0aCAhPSA1KQorCQkJCQkJJiYgKHBXZXBLZXktPktleUxlbmd0aCAhPQorCQkJCQkJICAgIDEzKSkpIHsKKwkJCQkJCU5kaXNTdGF0dXMgPQorCQkJCQkJICAgIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKKwkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAorCQkJCQkJCSAoIkNtZFRocmVhZDo6T0lEXzgwMl8xMV9BRERfV0VQLCBJTlZBTElEX0RBVEEhIVxuIikpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdTggQ2lwaGVyQWxnOworCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS4KKwkJCQkJCSAgICBLZXlMZW4gPQorCQkJCQkJICAgICh1OClwV2VwS2V5LT5LZXlMZW5ndGg7CisJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPgorCQkJCQkJCSAgICAgICBTaGFyZWRLZXlbQlNTMF0KKwkJCQkJCQkgICAgICAgW0tleUlkeF0uS2V5LAorCQkJCQkJCSAgICAgICAmcFdlcEtleS0+CisJCQkJCQkJICAgICAgIEtleU1hdGVyaWFsLAorCQkJCQkJCSAgICAgICBwV2VwS2V5LT4KKwkJCQkJCQkgICAgICAgS2V5TGVuZ3RoKTsKKwkJCQkJCUNpcGhlckFsZyA9CisJCQkJCQkgICAgKHBBZC0+CisJCQkJCQkgICAgIFNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLgorCQkJCQkJICAgICBLZXlMZW4gPT0KKwkJCQkJCSAgICAgNSkgPyBDSVBIRVJfV0VQNjQgOgorCQkJCQkJICAgIENJUEhFUl9XRVAxMjg7CisKKwkJCQkJCS8qICovCisJCQkJCQkvKiBDaGFuZ2UgdGhlIFdFUCBjaXBoZXIgdG8gQ0tJUCBjaXBoZXIgaWYgQ0tJUCBLUCBvbi4gKi8KKwkJCQkJCS8qIEZ1bmsgVUkgb3IgTWVldGluZ2hvdXNlIFVJIHdpbGwgYWRkIGNraXAga2V5IGZyb20gdGhpcyBwYXRoLiAqLworCQkJCQkJLyogKi8KKworCQkJCQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpIHsKKwkJCQkJCQlwQWQtPk1hY1RhYi4KKwkJCQkJCQkgICAgQ29udGVudFtCU1NJRF9XQ0lEXS4KKwkJCQkJCQkgICAgUGFpcndpc2VLZXkuCisJCQkJCQkJICAgIENpcGhlckFsZyA9CisJCQkJCQkJICAgIHBBZC0+CisJCQkJCQkJICAgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgICBbS2V5SWR4XS5DaXBoZXJBbGc7CisJCQkJCQkJcEFkLT5NYWNUYWIuCisJCQkJCQkJICAgIENvbnRlbnRbQlNTSURfV0NJRF0uCisJCQkJCQkJICAgIFBhaXJ3aXNlS2V5LktleUxlbiA9CisJCQkJCQkJICAgIHBBZC0+CisJCQkJCQkJICAgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgICBbS2V5SWR4XS5LZXlMZW47CiAJCQkJCQl9CisJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLgorCQkJCQkJICAgIENpcGhlckFsZyA9IENpcGhlckFsZzsKKwkJCQkJCWlmIChwV2VwS2V5LT4KKwkJCQkJCSAgICBLZXlJbmRleCAmIDB4ODAwMDAwMDApIHsKKwkJCQkJCQkvKiBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpICovCisJCQkJCQkJdTggSVZFSVZbOF07CisJCQkJCQkJdTMyIFdDSURBdHRyaSwgVmFsdWU7CisJCQkJCQkJdTE2IG9mZnNldCwgb2Zmc2V0MjsKKwkJCQkJCQlOZGlzWmVyb01lbW9yeShJVkVJViwKKwkJCQkJCQkJICAgICAgIDgpOworCQkJCQkJCXBBZC0+U3RhQ2ZnLgorCQkJCQkJCSAgICBEZWZhdWx0S2V5SWQgPQorCQkJCQkJCSAgICAodTgpS2V5SWR4OworCQkJCQkJCS8qIEFkZCBCU1NJRCB0byBXQ1RhYmxlLiBiZWNhdXNlIHRoaXMgaXMgVHggd2VwIGtleS4gKi8KKwkJCQkJCQkvKiBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZToxPVBBSVJXSVNFIEtFWSwgQlNTSWR4IGlzIDAgKi8KKwkJCQkJCQlXQ0lEQXR0cmkgPQorCQkJCQkJCSAgICAoQ2lwaGVyQWxnIDw8IDEpIHwKKwkJCQkJCQkgICAgU0hBUkVES0VZVEFCTEU7CiAKLQkJCQkJCUFzaWNVcGRhdGVSeFdDSURUYWJsZShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOwotCQkJCQkJcHJpbnRrKCJVcGRhdGVSeFdDSURUYWJsZSgpOiBBaWQ9JWQsIEFkZHI9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnghXG4iLCBwRW50cnktPkFpZCwKLQkJCQkJCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwgcEVudHJ5LT5BZGRyWzNdLCBwRW50cnktPkFkZHJbNF0sIHBFbnRyeS0+QWRkcls1XSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTURUSFJFQURfVVBEQVRFX1BST1RFQ1Q6Ci0JCQkJCXsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKEFMTE5fU0VUUFJPVEVDVCksIFRSVUUsIDApOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgT0lEXzgwMl8xMV9BRERfV0VQOgotCQkJCQl7Ci0JCQkJCQlVSU5UCWk7Ci0JCQkJCQlVSU5UMzIJS2V5SWR4OwotCQkJCQkJUE5ESVNfODAyXzExX1dFUAlwV2VwS2V5OwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAgXG4iKSk7Ci0KLQkJCQkJCXBXZXBLZXkgPSAoUE5ESVNfODAyXzExX1dFUClwRGF0YTsKLQkJCQkJCUtleUlkeCA9IHBXZXBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKLQotCQkJCQkJLy8gaXQgaXMgYSBzaGFyZWQga2V5Ci0JCQkJCQlpZiAoKEtleUlkeCA+PSA0KSB8fCAoKHBXZXBLZXktPktleUxlbmd0aCAhPSA1KSAmJiAocFdlcEtleS0+S2V5TGVuZ3RoICE9IDEzKSkpCi0JCQkJCQl7Ci0JCQkJCQkJTmRpc1N0YXR1cyA9IE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgSU5WQUxJRF9EQVRBISFcbiIpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlVQ0hBUiBDaXBoZXJBbGc7Ci0JCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKLQkJCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOwotCQkJCQkJCUNpcGhlckFsZyA9IChwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleUxlbiA9PSA1KT8gQ0lQSEVSX1dFUDY0IDogQ0lQSEVSX1dFUDEyODsKLQotCQkJCQkJCS8vCi0JCQkJCQkJLy8gQ2hhbmdlIHRoZSBXRVAgY2lwaGVyIHRvIENLSVAgY2lwaGVyIGlmIENLSVAgS1Agb24uCi0JCQkJCQkJLy8gRnVuayBVSSBvciBNZWV0aW5naG91c2UgVUkgd2lsbCBhZGQgY2tpcCBrZXkgZnJvbSB0aGlzIHBhdGguCi0JCQkJCQkJLy8KLQotCQkJCQkJCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCQkJCQkJIAl7Ci0JCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7Ci0JCQkJCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuS2V5TGVuID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW47Ci0JCQkJCQkgCX0KLQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCQkJCQlpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotCQkJCQkJCQlVQ0hBUglJVkVJVls4XTsKLQkJCQkJCQkJVUlOVDMyCVdDSURBdHRyaSwgVmFsdWU7Ci0JCQkJCQkJCVVTSE9SVAlvZmZzZXQsIG9mZnNldDI7Ci0JCQkJCQkJCU5kaXNaZXJvTWVtb3J5KElWRUlWLCA4KTsKLQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7Ci0JCQkJCQkJCS8vIEFkZCBCU1NJRCB0byBXQ1RhYmxlLiBiZWNhdXNlIHRoaXMgaXMgVHggd2VwIGtleS4KLQkJCQkJCQkJLy8gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6MT1QQUlSV0lTRSBLRVksIEJTU0lkeCBpcyAwCi0JCQkJCQkJCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOwotCi0JCQkJCQkJCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKEJTU0lEX1dDSUQqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0JCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCwgV0NJREF0dHJpKTsKLQkJCQkJCQkJLy8gMS4gSVYvRUlWCi0JCQkJCQkJCS8vIFNwZWNpZnkga2V5IGluZGV4IHRvIGZpbmQgc2hhcmVkIGtleS4KLQkJCQkJCQkJSVZFSVZbM10gPSAoVUNIQVIpKEtleUlkeDw8IDYpOwkvL1dFUCBFaXYgYml0IG9mZi4gZ3JvdXBrZXkgaW5kZXggaXMgbm90IDAKLQkJCQkJCQkJb2Zmc2V0ID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCQkJCQkJCQlvZmZzZXQyID0gUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSArIChCU1NJRF9XQ0lEKiBIV19JVkVJVl9FTlRSWV9TSVpFKTsKLQkJCQkJCQkJZm9yIChpPTA7IGk8ODspCi0JCQkJCQkJCXsKLQkJCQkJCQkJCVZhbHVlID0gSVZFSVZbaV07Ci0JCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsxXTw8OCk7Ci0JCQkJCQkJCQlWYWx1ZSArPSAoSVZFSVZbaSsyXTw8MTYpOwotCQkJCQkJCQkJVmFsdWUgKz0gKElWRUlWW2krM108PDI0KTsKLQkJCQkJCQkJCVJUVVNCV3JpdGVNQUNSZWdpc3RlcihwQWQsIG9mZnNldCtpLCBWYWx1ZSk7Ci0JCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQyK2ksIFZhbHVlKTsKLQkJCQkJCQkJCWkrPTQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQkvLyAyLiBXQ0lEIEF0dHJpYnV0ZSBVREY6MywgQlNTSWR4OjMsIEFsZzozLCBLZXl0YWJsZTp1c2Ugc2hhcmUga2V5LCBCU1NJZHggaXMgMAotCQkJCQkJCQlXQ0lEQXR0cmkgPSAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc8PDEpfFNIQVJFREtFWVRBQkxFOwotCQkJCQkJCQlvZmZzZXQgPSBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChCU1MwTWNhc3RfV0NJRCogSFdfV0NJRF9BVFRSSV9TSVpFKTsKLQkJCQkJCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJTUzBNY2FzdF9XQ0lEIDogb2Zmc2V0ID0gJXgsIFdDSURBdHRyaSA9ICV4XG4iLCBvZmZzZXQsIFdDSURBdHRyaSkpOwotCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci0KKwkJCQkJCQlvZmZzZXQgPQorCQkJCQkJCSAgICBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRQorCQkJCQkJCSAgICArCisJCQkJCQkJICAgIChCU1NJRF9XQ0lEICoKKwkJCQkJCQkgICAgIEhXX1dDSURfQVRUUklfU0laRSk7CisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyCisJCQkJCQkJICAgIChwQWQsIG9mZnNldCwKKwkJCQkJCQkgICAgIFdDSURBdHRyaSk7CisJCQkJCQkJLyogMS4gSVYvRUlWICovCisJCQkJCQkJLyogU3BlY2lmeSBrZXkgaW5kZXggdG8gZmluZCBzaGFyZWQga2V5LiAqLworCQkJCQkJCUlWRUlWWzNdID0gKHU4KShLZXlJZHggPDwgNik7CS8qV0VQIEVpdiBiaXQgb2ZmLiBncm91cGtleSBpbmRleCBpcyBub3QgMCAqLworCQkJCQkJCW9mZnNldCA9CisJCQkJCQkJICAgIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAoQlNTME1jYXN0X1dDSUQgKgorCQkJCQkJCSAgICAgSFdfSVZFSVZfRU5UUllfU0laRSk7CisJCQkJCQkJb2Zmc2V0MiA9CisJCQkJCQkJICAgIFBBSVJXSVNFX0lWRUlWX1RBQkxFX0JBU0UKKwkJCQkJCQkgICAgKworCQkJCQkJCSAgICAoQlNTSURfV0NJRCAqCisJCQkJCQkJICAgICBIV19JVkVJVl9FTlRSWV9TSVpFKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgODspIHsKKwkJCQkJCQkJVmFsdWUgPQorCQkJCQkJCQkgICAgSVZFSVZbaV07CisJCQkJCQkJCVZhbHVlICs9CisJCQkJCQkJCSAgICAoSVZFSVYKKwkJCQkJCQkJICAgICBbaSArCisJCQkJCQkJCSAgICAgIDFdIDw8IDgpOworCQkJCQkJCQlWYWx1ZSArPQorCQkJCQkJCQkgICAgKElWRUlWCisJCQkJCQkJCSAgICAgW2kgKworCQkJCQkJCQkgICAgICAyXSA8PCAxNik7CisJCQkJCQkJCVZhbHVlICs9CisJCQkJCQkJCSAgICAoSVZFSVYKKwkJCQkJCQkJICAgICBbaSArCisJCQkJCQkJCSAgICAgIDNdIDw8IDI0KTsKKwkJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyCisJCQkJCQkJCSAgICAocEFkLAorCQkJCQkJCQkgICAgIG9mZnNldCArIGksCisJCQkJCQkJCSAgICAgVmFsdWUpOworCQkJCQkJCQlSVFVTQldyaXRlTUFDUmVnaXN0ZXIKKwkJCQkJCQkJICAgIChwQWQsCisJCQkJCQkJCSAgICAgb2Zmc2V0MiArCisJCQkJCQkJCSAgICAgaSwgVmFsdWUpOworCQkJCQkJCQlpICs9IDQ7CiAJCQkJCQkJfQotCQkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIChVQ0hBUilLZXlJZHgsIENpcGhlckFsZywgcFdlcEtleS0+S2V5TWF0ZXJpYWwsIE5VTEwsIE5VTEwpOwotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNtZFRocmVhZDo6T0lEXzgwMl8xMV9BRERfV0VQIChLZXlJZHg9JWQsIExlbj0lZC1ieXRlKVxuIiwgS2V5SWR4LCBwV2VwS2V5LT5LZXlMZW5ndGgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKIAotCQkJCWNhc2UgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkU6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBDb250cm9sIFRocmVhZCAhISBFUlJPUiAhISBVbmtub3duKGNtZHFlbG10LT5jb21tYW5kPTB4JXgpICEhIFxuIiwgY21kcWVsbXQtPmNvbW1hbmQpKTsKLQkJCQkJYnJlYWs7CisJCQkJCQkJLyogMi4gV0NJRCBBdHRyaWJ1dGUgVURGOjMsIEJTU0lkeDozLCBBbGc6MywgS2V5dGFibGU6dXNlIHNoYXJlIGtleSwgQlNTSWR4IGlzIDAgKi8KKwkJCQkJCQlXQ0lEQXR0cmkgPQorCQkJCQkJCSAgICAocEFkLT4KKwkJCQkJCQkgICAgIFNoYXJlZEtleVtCU1MwXQorCQkJCQkJCSAgICAgW0tleUlkeF0uCisJCQkJCQkJICAgICBDaXBoZXJBbGcgPDwgMSkgfAorCQkJCQkJCSAgICBTSEFSRURLRVlUQUJMRTsKKwkJCQkJCQlvZmZzZXQgPQorCQkJCQkJCSAgICBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRQorCQkJCQkJCSAgICArCisJCQkJCQkJICAgIChCU1MwTWNhc3RfV0NJRCAqCisJCQkJCQkJICAgICBIV19XQ0lEX0FUVFJJX1NJWkUpOworCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAorCQkJCQkJCQkgKCJCU1MwTWNhc3RfV0NJRCA6IG9mZnNldCA9ICV4LCBXQ0lEQXR0cmkgPSAleFxuIiwKKwkJCQkJCQkJICBvZmZzZXQsCisJCQkJCQkJCSAgV0NJREF0dHJpKSk7CisJCQkJCQkJUlRVU0JXcml0ZU1BQ1JlZ2lzdGVyCisJCQkJCQkJICAgIChwQWQsIG9mZnNldCwKKwkJCQkJCQkgICAgIFdDSURBdHRyaSk7CisKKwkJCQkJCX0KKwkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsCisJCQkJCQkJCSAgICAgICh1OCkKKwkJCQkJCQkJICAgICAgS2V5SWR4LAorCQkJCQkJCQkgICAgICBDaXBoZXJBbGcsCisJCQkJCQkJCSAgICAgIHBXZXBLZXktPgorCQkJCQkJCQkgICAgICBLZXlNYXRlcmlhbCwKKwkJCQkJCQkJICAgICAgTlVMTCwKKwkJCQkJCQkJICAgICAgTlVMTCk7CisJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwKKwkJCQkJCQkgKCJDbWRUaHJlYWQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoS2V5SWR4PSVkLCBMZW49JWQtYnl0ZSlcbiIsCisJCQkJCQkJICBLZXlJZHgsCisJCQkJCQkJICBwV2VwS2V5LT5LZXlMZW5ndGgpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRToKKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfU0VUX0dST1VQX0tFWToKKwkJCQlXcGFTdGFHcm91cEtleVNldHRpbmcocEFkKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfU0VUX1BBSVJXSVNFX0tFWToKKwkJCQlXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcocEFkKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBDTURUSFJFQURfU0VUX1BTTV9CSVQ6CisJCQkJeworCQkJCQl1MTYgKnBQc20gPSAodTE2ICopIHBEYXRhOworCQkJCQlNbG1lU2V0UHNtQml0KHBBZCwgKnBQc20pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EVEhSRUFEX0ZPUkNFX1dBS0VfVVA6CisJCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCisJCQkJCSAoIi0tPiBDb250cm9sIFRocmVhZCAhISBFUlJPUiAhISBVbmtub3duKGNtZHFlbG10LT5jb21tYW5kPTB4JXgpICEhIFxuIiwKKwkJCQkJICBjbWRxZWxtdC0+Y29tbWFuZCkpOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKLQkJaWYgKGNtZHFlbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKQotCQl7Ci0JCQkJaWYgKGNtZHFlbG10LT5idWZmZXIgIT0gTlVMTCkKLQkJCQkJTmRpc0ZyZWVNZW1vcnkoY21kcWVsbXQtPmJ1ZmZlciwgY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCwgMCk7Ci0KLQkJCU5kaXNGcmVlTWVtb3J5KGNtZHFlbG10LCBzaXplb2YoQ21kUUVsbXQpLCAwKTsKKwkJaWYgKGNtZHFlbG10LT5DbWRGcm9tTmRpcyA9PSBUUlVFKSB7CisJCQlpZiAoY21kcWVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQtPmJ1ZmZlcik7CisJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10KTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoY21kcWVsbXQtPmJ1ZmZlciAhPSBOVUxMKQorCQkJICAgICYmIChjbWRxZWxtdC0+YnVmZmVybGVuZ3RoICE9IDApKQorCQkJCW9zX2ZyZWVfbWVtKHBBZCwgY21kcWVsbXQtPmJ1ZmZlcik7CisJCQlvc19mcmVlX21lbShwQWQsIGNtZHFlbG10KTsKIAkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgoY21kcWVsbXQtPmJ1ZmZlciAhPSBOVUxMKSAmJiAoY21kcWVsbXQtPmJ1ZmZlcmxlbmd0aCAhPSAwKSkKLQkJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdC0+YnVmZmVyLCBjbWRxZWxtdC0+YnVmZmVybGVuZ3RoLCAwKTsKLSAgICAgICAgICAgIHsKLQkJCQlOZGlzRnJlZU1lbW9yeShjbWRxZWxtdCwgc2l6ZW9mKENtZFFFbG10KSwgMCk7Ci0JCQl9Ci0JCX0KLQl9CS8qIGVuZCBvZiB3aGlsZSAqLworCX0JCQkvKiBlbmQgb2Ygd2hpbGUgKi8KIH0KIAorI2VuZGlmIC8qIFJUTVBfTUFDX1VTQiAvLyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvcnQyODcwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjdiYWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydDI4NzAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fUlQyODcwX0hfXwotI2RlZmluZSBfX1JUMjg3MF9IX18KLQotLy91c2IgaGVhZGVyIGZpbGVzCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLS8qIHJ0bXBfZGVmLmggKi8KLS8vCi0jZGVmaW5lIEJVTEtBR0dSRV9aSVNFICAgICAgICAgIDEwMAotI2RlZmluZSBSVDI4WFhfRFJWREFUQV9TRVQoX2EpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldF9pbnRmZGF0YShfYSwgcEFkKTsKLSNkZWZpbmUgUlQyOFhYX1BVVF9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9wdXRfZGV2Ci0jZGVmaW5lIFJUVVNCX0FMTE9DX1VSQihpc28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfYWxsb2NfdXJiKGlzbywgR0ZQX0FUT01JQykKLSNkZWZpbmUgUlRVU0JfU1VCTUlUX1VSQihwVXJiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9zdWJtaXRfdXJiKHBVcmIsIEdGUF9BVE9NSUMpCi0jZGVmaW5lCVJUVVNCX1VSQl9BTExPQ19CVUZGRVIocFVzYl9EZXYsIEJ1ZlNpemUsIHBEbWFfYWRkcikgICAgICAgICAgICAgICB1c2JfYnVmZmVyX2FsbG9jKHBVc2JfRGV2LCBCdWZTaXplLCBHRlBfQVRPTUlDLCBwRG1hX2FkZHIpCi0jZGVmaW5lCVJUVVNCX1VSQl9GUkVFX0JVRkZFUihwVXNiX0RldiwgQnVmU2l6ZSwgcFRyYW5zZmVyQnVmLCBEbWFfYWRkcikgICB1c2JfYnVmZmVyX2ZyZWUocFVzYl9EZXYsIEJ1ZlNpemUsIHBUcmFuc2ZlckJ1ZiwgRG1hX2FkZHIpCi0KLSNkZWZpbmUgUlhCVUxLQUdHUkVfWklTRSAgICAgICAgMTIKLSNkZWZpbmUgTUFYX1RYQlVMS19MSU1JVCAgICAgICAgKExPQ0FMX1RYQlVGX1NJWkUqKEJVTEtBR0dSRV9aSVNFLTEpKQotI2RlZmluZSBNQVhfVFhCVUxLX1NJWkUgICAgICAgICAoTE9DQUxfVFhCVUZfU0laRSpCVUxLQUdHUkVfWklTRSkKLSNkZWZpbmUgTUFYX1JYQlVMS19TSVpFICAgICAgICAgKExPQ0FMX1RYQlVGX1NJWkUqUlhCVUxLQUdHUkVfWklTRSkKLSNkZWZpbmUgTUFYX01MTUVfSEFORExFUl9NRU1PUlkgMjAKLSNkZWZpbmUJUkVUUllfTElNSVQgICAgICAgICAgICAgMTAKLSNkZWZpbmUgQlVGRkVSX1NJWkUJCQkJMjQwMAkvLzIwNDgKLSNkZWZpbmUJVFhfUklORwkJCQkJMHhhCi0jZGVmaW5lCVBSSU9fUklORwkJCQkweGMKLQotCi0vLyBGbGFncyBmb3IgQnVsa2ZsYWdzIGNvbnRyb2wgZm9yIGJ1bGsgb3V0IGRhdGEKLS8vCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05VTEwJCQkJMHgwMDAwMDAwMQotI2RlZmluZSBmUlRVU0JfQlVMS19PVVRfUlRTCQkJCQkJMHgwMDAwMDAwMgotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfTUxNRQkJCQkJMHgwMDAwMDAwNAotCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTAkJCQkweDAwMDEwMDAwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF8yCQkJMHgwMDAyMDAwMAotI2RlZmluZQlmUlRVU0JfQlVMS19PVVRfREFUQV9OT1JNQUxfMwkJCTB4MDAwNDAwMDAKLSNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfTk9STUFMXzQJCQkweDAwMDgwMDAwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX05PUk1BTF81CQkJMHgwMDEwMDAwMAotCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9QU1BPTEwJCQkJCTB4MDAwMDAwMjAKLSNkZWZpbmUJZlJUVVNCX0JVTEtfT1VUX0RBVEFfRlJBRwkJCQkweDAwMDAwMDQwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfMgkJCQkweDAwMDAwMDgwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfMwkJCQkweDAwMDAwMTAwCi0jZGVmaW5lCWZSVFVTQl9CVUxLX09VVF9EQVRBX0ZSQUdfNAkJCQkweDAwMDAwMjAwCi0KLSNkZWZpbmUJRlJFRV9IVFRYX1JJTkcoX3AsIF9iLCBfdCkJCQlcCi17CQkJCQkJCQkJCVwKLQlpZiAoKF90KS0+RU5leHRCdWxrT3V0UG9zaXRpb24gPT0gKF90KS0+Q3VyV3JpdGVQb3NpdGlvbikJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCVwKLQkJKF90KS0+YlJpbmdFbXB0eSA9IFRSVUU7CQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCVwKLQkvKk5kaXNJbnRlcmxvY2tlZERlY3JlbWVudCgmKF9wKS0+VHhDb3VudCk7ICovXAotfQotCi0vLwotLy8gUlhJTkZPIGFwcGVuZHMgYXQgdGhlIGVuZCBvZiBlYWNoIHJ4IHBhY2tldC4KLS8vCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYSU5GT19TVFJVQyB7Ci0JVUlOVDMyCQlCQToxOwotCVVJTlQzMgkJREFUQToxOwotCVVJTlQzMgkJTlVMTERBVEE6MTsKLQlVSU5UMzIJCUZSQUc6MTsKLQlVSU5UMzIJCVUyTToxOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCi0JVUlOVDMyCQlNY2FzdDoxOyAgICAgICAgICAgIC8vIDE6IHRoaXMgaXMgYSBtdWx0aWNhc3QgZnJhbWUKLQlVSU5UMzIJCUJjYXN0OjE7ICAgICAgICAgICAgLy8gMTogdGhpcyBpcyBhIGJyb2FkY2FzdCBmcmFtZQotCVVJTlQzMgkJTXlCc3M6MTsgIAkvLyAxOiB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8gdGhlIHNhbWUgQlNTSUQKLQlVSU5UMzIJCUNyYzoxOyAgICAgICAgICAgICAgLy8gMTogQ1JDIGVycm9yCi0JVUlOVDMyCQlDaXBoZXJFcnI6MjsgICAgICAgIC8vIDA6IGRlY3J5cHRpb24gb2theSwgMTpJQ1YgZXJyb3IsIDI6TUlDIGVycm9yLCAzOktFWSBub3QgdmFsaWQKLQlVSU5UMzIJCUFNU0RVOjE7CQkvLyByeCB3aXRoIDgwMi4zIGhlYWRlciwgbm90IDgwMi4xMSBoZWFkZXIuCi0JVUlOVDMyCQlIVEM6MTsKLQlVSU5UMzIJCVJTU0k6MTsKLQlVSU5UMzIJCUwyUEFEOjE7Ci0JVUlOVDMyCQlBTVBEVToxOwkJLy8gVG8gYmUgbW92ZWQKLQlVSU5UMzIJCURlY3J5cHRlZDoxOwotCVVJTlQzMgkJUGxjcFJzc2lsOjE7Ci0JVUlOVDMyCQlDaXBoZXJBbGc6MTsKLQlVSU5UMzIJCUxhc3RBTVNEVToxOwotCVVJTlQzMgkJUGxjcFNpZ25hbDoxMjsKLX0JUlhJTkZPX1NUUlVDLCAqUFJYSU5GT19TVFJVQywgUlQyOFhYX1JYRF9TVFJVQywgKlBSVDI4WFhfUlhEX1NUUlVDOwotCi0vLwotLy8gVFhJTkZPCi0vLwotdHlwZWRlZglzdHJ1Y3QJX1RYSU5GT19TVFJVQyB7Ci0JLy8gV29yZAkwCi0JVUlOVDMyCQlVU0JETUFUeFBrdExlbjoxNjsJLy91c2VkIE9OTFkgaW4gVVNCIGJ1bGsgQWdncmVnYXRpb24sICBUb3RhbCBieXRlIGNvdW50cyBvZiBhbGwgc3ViLWZyYW1lLgotCVVJTlQzMgkJcnN2Ojg7Ci0JVUlOVDMyCQlXSVY6MTsJLy8gV2lyZWxlc3MgSW5mbyBWYWxpZC4gMSBpZiBEcml2ZXIgYWxyZWFkeSBmaWxsIFdJLCAgbyBpZiBETUEgbmVlZHMgdG8gY29weSBXSSB0byBjb3JyZWN0cG9zaXRpb24KLQlVSU5UMzIJCVFTRUw6MjsJLy8gc2VsZWN0IG9uLWNoaXAgRklGTyBJRCBmb3IgMm5kLXN0YWdlIG91dHB1dCBzY2hlZHVsZXIuMDpNR01ULCAxOkhDQ0EgMjpFRENBCi0JVUlOVDMyCQlTd1VzZUxhc3RSb3VuZDoxOyAvLyBTb2Z0d2FyZSB1c2UuCi0JVUlOVDMyCQlyc3YyOjI7ICAvLyBTb2Z0d2FyZSB1c2UuCi0JVUlOVDMyCQlVU0JETUFOZXh0VkxEOjE7CS8vdXNlZCBPTkxZIGluIFVTQiBidWxrIEFnZ3JlZ2F0aW9uLCBOZXh0VmFsaWQKLQlVSU5UMzIJCVVTQkRNQVR4YnVyc3Q6MTsvL3VzZWQgT05MWSBpbiBVU0IgYnVsayBBZ2dyZS4gRm9yY2UgVVNCIERNQSB0cmFuc21pdCBmcmFtZSBmcm9tIGN1cnJlbnQgc2VsZWN0ZWQgZW5kcG9pbnQKLX0JVFhJTkZPX1NUUlVDLCAqUFRYSU5GT19TVFJVQzsKLQotI2RlZmluZSBUWElORk9fU0laRQkJCQk0Ci0jZGVmaW5lIFJYSU5GT19TSVpFCQkJCTQKLSNkZWZpbmUgVFhQQURESU5HX1NJWkUJCQkxMQotCi0vLwotLy8gTWFuYWdlbWVudCByaW5nIGJ1ZmZlciBmb3JtYXQKLS8vCi10eXBlZGVmCXN0cnVjdAlfTUdNVF9TVFJVQwl7Ci0JQk9PTEVBTgkJVmFsaWQ7Ci0JUFVDSEFSCQlwQnVmZmVyOwotCVVMT05HCQlMZW5ndGg7Ci19CU1HTVRfU1RSVUMsICpQTUdNVF9TVFJVQzsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBFRVBST00gUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIG9mZnNldCwgdmFyKQkJCQkJXAotCWRvIHsJCQkJCQkJCQkJCQkJCVwKLQkJUlRVU0JSZWFkRUVQUk9NKHBBZCwgb2Zmc2V0LCAoUFVDSEFSKSYodmFyKSwgMik7CQlcCi0JCWlmKCFwQWQtPmJVc2VFZnVzZSkJCQkJCQkJCQkJXAotCQl2YXIgPSBsZTJjcHUxNih2YXIpOwkJCQkJCQkJCVwKLQl9d2hpbGUoMCkKLQotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBvZmZzZXQsIHZhcikJCQkJCVwKLQlkb3sJCQkJCQkJCQkJCQkJCQlcCi0JCVVTSE9SVCBfdG1wVmFyPXZhcjsJCQkJCQkJCQkJXAotCQlpZighcEFkLT5iVXNlRWZ1c2UpCQkJCQkJCQkJXAotCQlfdG1wVmFyID0gY3B1MmxlMTYodmFyKTsJCQkJCQkJCVwKLQkJUlRVU0JXcml0ZUVFUFJPTShwQWQsIG9mZnNldCwgKFBVQ0hBUikmKF90bXBWYXIpLCAyKTsJXAotCX13aGlsZSgwKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBUQVNLL1RIUkVBRCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9UQVNLX1RIUkVBRF9JTklUKHBBZCwgU3RhdHVzKQkJXAotCVN0YXR1cyA9IENyZWF0ZVRocmVhZHMobmV0X2Rldik7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gRnJpbXdhcmUgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfV1JJVEVfRklSTVdBUkUoX3BBZCwgX3BGd0ltYWdlLCBfRndMZW4pCQlcCi0JUlRVU0JGaXJtd2FyZVdyaXRlKF9wQWQsIF9wRndJbWFnZSwgX0Z3TGVuKQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBUWCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9TVEFSVF9ERVFVRVVFKHBBZCwgUXVlSWR4LCBpcnFGbGFncykJCQkJXAotCQkJewkJCQkJCQkJCQkJCQlcCi0JCQkJUlRNUF9JUlFfTE9DSygmcEFkLT5EZVF1ZXVlTG9ja1tRdWVJZHhdLCBpcnFGbGFncyk7CQlcCi0JCQkJaWYgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbUXVlSWR4XSkJCQkJCQlcCi0JCQkJewkJCQkJCQkJCQkJCQkJXAotCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpO1wKLQkJCQkJcHJpbnRrKCJEZVF1ZXVlUnVubmluZ1slZF09IFRSVUUhXG4iLCBRdWVJZHgpOwkJXAotCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCVwKLQkJCQl9CQkJCQkJCQkJCQkJCQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQlcCi0JCQkJewkJCQkJCQkJCQkJCQkJXAotCQkJCQlwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0gPSBUUlVFOwkJCQkJXAotCQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpO1wKLQkJCQl9CQkJCQkJCQkJCQkJCQlcCi0JCQl9Ci0jZGVmaW5lIFJUMjhYWF9TVE9QX0RFUVVFVUUocEFkLCBRdWVJZHgsIGlycUZsYWdzKQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCVwKLQkJCQlSVE1QX0lSUV9MT0NLKCZwQWQtPkRlUXVldWVMb2NrW1F1ZUlkeF0sIGlycUZsYWdzKTsJCVwKLQkJCQlwQWQtPkRlUXVldWVSdW5uaW5nW1F1ZUlkeF0gPSBGQUxTRTsJCQkJCVwKLQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+RGVRdWV1ZUxvY2tbUXVlSWR4XSwgaXJxRmxhZ3MpOwlcCi0JCQl9d2hpbGUoMCkKLQotCi0jZGVmaW5lCVJUMjhYWF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgZnJlZU51bSwgcFBhY2tldCkgXAotCQkoUlRVU0JGcmVlRGVzY3JpcHRvclJlcXVlc3QocEFkLCBwVHhCbGstPlF1ZUlkeCwgKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKSkgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQotI2RlZmluZSBSVDI4WFhfUkVMRUFTRV9ERVNDX1JFU09VUkNFKHBBZCwgUXVlSWR4KQkJCVwKLQkJZG97fXdoaWxlKDApCi0KLSNkZWZpbmUgTkVFRF9RVUVVRV9CQUNLX0ZPUl9BR0coX3BBZCwgX1F1ZUlkeCwgX2ZyZWVOdW0sIF9UeEZyYW1lVHlwZSkgCQlcCi0JCSgoX1R4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYgKFJUVVNCTmVlZFF1ZXVlQmFja0ZvckFnZyhfcEFkLCBfUXVlSWR4KSkpCi0KLQotCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTkVFRF9TVE9QX1RYCQlcCi0JCShmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAlcCi0JCSBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9CVUxLT1VUX1JFU0VUIHwgXAotCQkgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfCBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUykKLQotCi0jZGVmaW5lIEhBTF9Xcml0ZVN1YlR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGJJc0xhc3QsIHBGcmVlTnVtYmVyKQlcCi0JCQlSdG1wVVNCX1dyaXRlU3ViVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgYklzTGFzdCwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsayxiSXNMYXN0LCBwRnJlZU51bWJlcikJXAotCQkJUnRtcFVTQl9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssYklzTGFzdCwgcEZyZWVOdW1iZXIpCi0KLSNkZWZpbmUgSEFMX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sIHBGcmVlTnVtYmVyKSBcCi0JCQlSdG1wVVNCX1dyaXRlRnJhZ1R4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYWdOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsayxmcmFtZU51bSwgcEZyZWVOdW1iZXIpCVwKLQkJCVJ0bXBVU0JfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssZnJhbWVOdW0sIHBGcmVlTnVtYmVyKQotCi0jZGVmaW5lIEhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgVHhJZHgpCVwKLQkJCVJ0bXBVU0JfRmluYWxXcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIHRvdGFsTVBEVVNpemUsIFR4SWR4KQotCi0jZGVmaW5lIEhBTF9MYXN0VHhJZHgocEFkLCBRdWVJZHgsVHhJZHgpIFwKLQkJCS8qUnRtcFVTQkRhdGFMYXN0VHhJZHgocEFkLCBRdWVJZHgsVHhJZHgpKi8KLQotI2RlZmluZSBIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBRdWVJZHgpCVwKLQkJCVJ0bXBVU0JEYXRhS2lja091dChwQWQsIHBUeEJsaywgUXVlSWR4KQotCi0KLSNkZWZpbmUgSEFMX0tpY2tPdXRNZ210VHgocEFkLCBRdWVJZHgsIHBQYWNrZXQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuKQlcCi0JCQlSdG1wVVNCTWdtdEtpY2tPdXQocEFkLCBRdWVJZHgsIHBQYWNrZXQsIHBTcmNCdWZWQSwgU3JjQnVmTGVuKQotCi0jZGVmaW5lIEhBTF9LaWNrT3V0TnVsbEZyYW1lVHgoX3BBZCwgX1F1ZUlkeCwgX3BOdWxsRnJhbWUsIF9mcmFtZUxlbikJXAotCQkJUnRtcFVTQk51bGxGcmFtZUtpY2tPdXQoX3BBZCwgX1F1ZUlkeCwgX3BOdWxsRnJhbWUsIF9mcmFtZUxlbikKLQotI2RlZmluZSBSVE1QX1BLVF9UQUlMX1BBRERJTkcgCTExIC8vIDMobWF4IDQgYnl0ZSBwYWRkaW5nKSArIDQgKGxhc3QgcGFja2V0IHBhZGRpbmcpICsgNCAoTWF4QnVsa091dHNpemUgYWxpZ24gcGFkZGluZykKLQotZXh0ZXJuIFVDSEFSIEVwVG9RdWV1ZVs2XTsKLQotCi0jaWZkZWYgUlQyODcwCi0jZGVmaW5lIEdFVF9UWFJJTkdfRlJFRU5PKF9wQWQsIF9RdWVJZHgpIAkoX1F1ZUlkeCkgLy8oX3BBZC0+VHhSaW5nW19RdWVJZHhdLlR4U3dGcmVlSWR4KQotI2RlZmluZSBHRVRfTUdNVFJJTkdfRlJFRU5PKF9wQWQpIAkJCShfcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCkKLSNlbmRpZiAvLyBSVDI4NzAgLy8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBSWCBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0vLyNkZWZpbmUgUlQyOFhYX1JYX0VSUk9SX0NIRUNLCQkJCVJUTVBDaGVja1J4V0kKLQotI2RlZmluZSBSVDI4WFhfUlZfQUxMX0JVRl9FTkQoYkJ1bGtSZWNlaXZlKQkJXAotCS8qIFdlIHJldHVybiBTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEIHNvIHRoYXQgdGhlIGNvbXBsZXRpb24gKi8JXAotCS8qIHJvdXRpbmUgKElvZkNvbXBsZXRlUmVxdWVzdCkgd2lsbCBzdG9wIHdvcmtpbmcgb24gdGhlIGlycC4gKi8JCVwKLQlpZiAoYkJ1bGtSZWNlaXZlID09IFRSVUUpCVJUVVNCQnVsa1JlY2VpdmUocEFkKTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBBU0lDIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLy8gcmVzZXQgTUFDIG9mIGEgc3RhdGlvbiBlbnRyeSB0byAweEZGRkZGRkZGRkZGRgotI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIFdjaWQpCQkJCQlcCi0JewlSVF9TRVRfQVNJQ19XQ0lECVNldEFzaWNXY2lkOwkJCQkJCVwKLQkJU2V0QXNpY1djaWQuV0NJRCA9IFdjaWQ7CQkJCQkJCQlcCi0JCVNldEFzaWNXY2lkLlNldFRpZCA9IDB4ZmZmZmZmZmY7CQkJCQkJXAotCQlTZXRBc2ljV2NpZC5EZWxldGVUaWQgPSAweGZmZmZmZmZmOwkJCQkJCVwKLQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgCVwKLQkJCQkmU2V0QXNpY1djaWQsIHNpemVvZihSVF9TRVRfQVNJQ19XQ0lEKSk7CX0KLQotLy8gYWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCi0jZGVmaW5lIFJUMjhYWF9TVEFfRU5UUllfQUREKHBBZCwgcEVudHJ5KQkJCQkJCQlcCi0JUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQocEFkLCBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlksIAlcCi0JCQkJCQkJcEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7Ci0KLS8vIHJlbW92ZSBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGZyb20gQVNJQwotLy8geWV0IGltcGxlbWVudAotI2RlZmluZSBSVDI4WFhfU1RBX0VOVFJZX0tFWV9ERUwocEFkLCBCc3NJZHgsIFdjaWQpCi0KLS8vIGFkZCBDbGllbnQgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW50byBBU0lDIFdDSUQgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0jZGVmaW5lIFJUMjhYWF9TVEFfU0VDVVJJVFlfSU5GT19BREQocEFkLCBhcGlkeCwgS2V5SUQsIHBFbnRyeSkJCQkJCQlcCi0JewlSVDI4WFhfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHBFbnRyeS0+QWlkKTsJCQkJCQkJCVwKLQkJaWYgKHBFbnRyeS0+QWlkID49IDEpIHsJCQkJCQkJCQkJCQkJCVwKLQkJCVJUX1NFVF9BU0lDX1dDSURfQVRUUkkJU2V0QXNpY1djaWRBdHRyaTsJCQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkQXR0cmkuV0NJRCA9IHBFbnRyeS0+QWlkOwkJCQkJCQkJCVwKLQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKSAmJgkJCQlcCi0JCQkJKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpKQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGc7CVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQllbHNlIGlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCVNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gcEFkLT5TaGFyZWRLZXlbYXBpZHhdW0tleUlEXS5DaXBoZXJBbGc7CVwKLQkJCX0JCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQllbHNlIFNldEFzaWNXY2lkQXR0cmkuQ2lwaGVyID0gMDsJCQkJCQkJCQkJXAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYWlkIGNpcGhlciA9ICVsZFxuIixTZXRBc2ljV2NpZEF0dHJpLkNpcGhlcikpOyAgICAgICBcCi0JCQlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiwgCQkJXAotCQkJCQkJCSZTZXRBc2ljV2NpZEF0dHJpLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSkpOyB9IH0KLQotLy8gSW5zZXJ0IHRoZSBCQSBiaXRtYXAgdG8gQVNJQyBmb3IgdGhlIFdjaWQgZW50cnkKLSNkZWZpbmUgUlQyOFhYX0FERF9CQV9TRVNTSU9OX1RPX0FTSUMoX3BBZCwgX0FpZCwgX1RJRCkJCQkJCVwKLQkJZG97CQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLldDSUQgPSAoX0FpZCk7CQkJCQkJCQkJXAotCQkJU2V0QXNpY1djaWQuU2V0VGlkID0gKDB4MTAwMDA8PChfVElEKSk7CQkJCQkJXAotCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gMHhmZmZmZmZmZjsJCQkJCQkJXAotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRCkpOwlcCi0JCX13aGlsZSgwKQotCi0vLyBSZW1vdmUgdGhlIEJBIGJpdG1hcCBmcm9tIEFTSUMgZm9yIHRoZSBXY2lkIGVudHJ5Ci0jZGVmaW5lIFJUMjhYWF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMoX3BBZCwgX1djaWQsIF9USUQpCQkJCVwKLQkJZG97CQkJCQkJCQkJCQkJCQkJCVwKLQkJCVJUX1NFVF9BU0lDX1dDSUQJU2V0QXNpY1djaWQ7CQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLldDSUQgPSAoX1djaWQpOwkJCQkJCQkJCVwKLQkJCVNldEFzaWNXY2lkLlNldFRpZCA9ICgweGZmZmZmZmZmKTsJCQkJCQkJXAotCQkJU2V0QXNpY1djaWQuRGVsZXRlVGlkID0gKDB4MTAwMDA8PChfVElEKSApOwkJCQkJXAotCQkJUlRVU0JFbnF1ZXVlSW50ZXJuYWxDbWQoKF9wQWQpLCBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCwgJlNldEFzaWNXY2lkLCBzaXplb2YoUlRfU0VUX0FTSUNfV0NJRCkpOwlcCi0JCX13aGlsZSgwKQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tIFBDSS9VU0IgUmVsYXRlZCBNQUNSTyAtLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBSVDI4WFhfSEFORExFX0RFVl9BU1NJR04oaGFuZGxlLCBkZXZfcCkJCQlcCi0JKChQT1NfQ09PS0lFKWhhbmRsZSktPnBVc2JfRGV2ID0gZGV2X3A7Ci0KLS8vIG5vIHVzZQotI2RlZmluZSBSVDI4WFhfVU5NQVAoKQotI2RlZmluZSBSVDI4WFhfSVJRX1JFUVVFU1QobmV0X2RldikKLSNkZWZpbmUgUlQyOFhYX0lSUV9SRUxFQVNFKG5ldF9kZXYpCi0jZGVmaW5lIFJUMjhYWF9JUlFfSU5JVChwQWQpCi0jZGVmaW5lIFJUMjhYWF9JUlFfRU5BQkxFKHBBZCkKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLSBNTE1FIFJlbGF0ZWQgTUFDUk8gLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNkZWZpbmUgUlQyOFhYX01MTUVfSEFORExFUihwQWQpCQkJUlRVU0JNbG1lVXAocEFkKQotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKQkJCQkJCQkJXAotCXsJaWYgKChwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbyA9PSBUUlVFKSAmJiAJCQkJCVwKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgkJXAotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpKSB7CVwKLQkJCVJUVVNCRW5xdWV1ZUludGVybmFsQ21kKHBBZCwgQ01EVEhSRUFEX0NIRUNLX0dQSU8sIE5VTEwsIDApOyB9IH0KLQotI2RlZmluZSBSVDI4WFhfTUxNRV9TVEFfUVVJQ0tfUlNQX1dBS0VfVVAocEFkKQlcCi0JewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChwQWQsIENNRFRIUkVBRF9RS0VSSU9ESUNfRVhFQ1VULCBOVUxMLCAwKTsJXAotCQlSVFVTQk1sbWVVcChwQWQpOyB9Ci0KLSNkZWZpbmUgUlQyOFhYX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpCVwKLQkJICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVTRVRfQ09ORiwgMCwgTlVMTCk7CVwKLQkJICAgICAgICBSVFVTQk1sbWVVcChwQWQpOwotCi0jZGVmaW5lIFJUMjhYWF9IQU5ETEVfQ09VTlRFUl9NRUFTVVJFKF9wQWQsIF9wRW50cnkpCQlcCi0JewlSVFVTQkVucXVldWVJbnRlcm5hbENtZChfcEFkLCBDTURUSFJFQURfODAyXzExX0NPVU5URVJfTUVBU1VSRSwgX3BFbnRyeSwgc2l6ZW9mKE1BQ19UQUJMRV9FTlRSWSkpOwlcCi0JCVJUVVNCTWxtZVVwKF9wQWQpOwkJCQkJCQkJCVwKLQl9Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0gUG93ZXIgU2F2ZSBSZWxhdGVkIE1BQ1JPIC0tLS0tLS0tLS0tLS0tLS0tICovCi0jZGVmaW5lIFJUMjhYWF9QU19QT0xMX0VOUVVFVUUocEFkKQkJCQkJCVwKLQl7CVJUVVNCX1NFVF9CVUxLX0ZMQUcocEFkLCBmUlRVU0JfQlVMS19PVVRfUFNQT0xMKTsJXAotCQlSVFVTQktpY2tCdWxrT3V0KHBBZCk7IH0KLQotI2RlZmluZSBSVDI4eHhfQ0hJUF9OQU1FICAgICAgICAgICAgIlJUeHg3MCIKLQotI2RlZmluZSBVU0JfQ1lDX0NGRyAgICAgICAgICAgICAgICAgMHgwMmE0Ci0jZGVmaW5lIFNUQVRVU19TVUNDRVNTCQkJCTB4MDAKLSNkZWZpbmUgU1RBVFVTX1VOU1VDQ0VTU0ZVTCAJCTB4MDEKLSNkZWZpbmUgTlRfU1VDQ0VTUyhzdGF0dXMpCQkJKCgoc3RhdHVzKSA+IDApID8gKDEpOigwKSkKLSNkZWZpbmUgSW50ZXJsb2NrZWRJbmNyZW1lbnQgCSAJYXRvbWljX2luYwotI2RlZmluZSBOZGlzSW50ZXJsb2NrZWRJbmNyZW1lbnQgCWF0b21pY19pbmMKLSNkZWZpbmUgSW50ZXJsb2NrZWREZWNyZW1lbnQJCWF0b21pY19kZWMKLSNkZWZpbmUgTmRpc0ludGVybG9ja2VkRGVjcmVtZW50IAlhdG9taWNfZGVjCi0jZGVmaW5lIEludGVybG9ja2VkRXhjaGFuZ2UJCQlhdG9taWNfc2V0Ci0vLyNkZWZpbmUgTmRpc01TZW5kQ29tcGxldGUJCQlSVE1QX1NlbmRDb21wbGV0ZQotI2RlZmluZSBOZGlzTUNhbmNlbFRpbWVyCQkJUlRNUENhbmNlbFRpbWVyCi0jZGVmaW5lIE5kaXNBbGxvY01lbW9yeShfcHRyLCBfc2l6ZSwgX2ZsYWcpCVwKLQkJCQkJCQkJCWRve19wdHIgPSBrbWFsbG9jKChfc2l6ZSksKF9mbGFnKSk7fXdoaWxlKDApCi0jZGVmaW5lIE5kaXNGcmVlTWVtb3J5KGEsIGIsIGMpIAlrZnJlZSgoYSkpCi0jZGVmaW5lIE5kaXNNU2xlZXAJCQkJCVJUTVB1c2VjRGVsYXkJCS8qIHVuaXQ6IG1pY3Jvc2Vjb25kICovCi0KLQotI2RlZmluZSBVU0JEX1RSQU5TRkVSX0RJUkVDVElPTl9PVVQJCTAKLSNkZWZpbmUgVVNCRF9UUkFOU0ZFUl9ESVJFQ1RJT05fSU4JCTAKLSNkZWZpbmUgVVNCRF9TSE9SVF9UUkFOU0ZFUl9PSwkJCTAKLSNkZWZpbmUgUFVSQgkJCXB1cmJiX3QKLQotI2RlZmluZSBSVFVTQl9GUkVFX1VSQihwVXJiKQl1c2JfZnJlZV91cmIocFVyYikKLQotLy8jdW5kZWYgTWxtZUFsbG9jYXRlTWVtb3J5Ci0vLyN1bmRlZiBNbG1lRnJlZU1lbW9yeQotCi10eXBlZGVmIHN0cnVjdCB1c2JfZGV2aWNlCSogUFVTQl9ERVY7Ci0KLS8qIE1BQ1JPIGZvciBsaW51eCB1c2IgKi8KLXR5cGVkZWYgc3RydWN0IHVyYiAqcHVyYmJfdDsKLXR5cGVkZWYgc3RydWN0IHVzYl9jdHJscmVxdWVzdCBkZXZjdHJscmVxdWVzdDsKLSNkZWZpbmUgUElSUAkJUFZPSUQKLSNkZWZpbmUgUE1ETAkJUFZPSUQKLSNkZWZpbmUgTkRJU19PSUQJVUlOVAotI2lmbmRlZiBVU0JfU1RfTk9FUlJPUgotI2RlZmluZSBVU0JfU1RfTk9FUlJPUiAgICAgMAotI2VuZGlmCi0KLS8vIHZlbmRvci1zcGVjaWZpYyBjb250cm9sIG9wZXJhdGlvbnMKLSNkZWZpbmUgQ09OVFJPTF9USU1FT1VUX0pJRkZJRVMgKCAoMTAwICogSFopIC8gMTAwMCkKLSNkZWZpbmUgVU5MSU5LX1RJTUVPVVRfTVMJCTMKLQotLyogdW5saW5rIHVyYgkqLwotI2RlZmluZSBSVFVTQl9VTkxJTktfVVJCKHBVcmIpCQl1c2Jfa2lsbF91cmIocFVyYikKLQotLy8gUHJvdG90eXBlcyBvZiBjb21wbGV0aW9uIGZ1bnVjLgotVk9JRCBSVFVTQkJ1bGtPdXREYXRhUGFja2V0Q29tcGxldGUocHVyYmJfdCBwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Ci1WT0lEIFJUVVNCQnVsa091dE1MTUVQYWNrZXRDb21wbGV0ZShwdXJiYl90IHBVcmIsIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzKTsKLVZPSUQgUlRVU0JCdWxrT3V0TnVsbEZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Ci1WT0lEIFJUVVNCQnVsa091dFJUU0ZyYW1lQ29tcGxldGUocHVyYmJfdCBwVXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncyk7Ci1WT0lEIFJUVVNCQnVsa091dFBzUG9sbENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotVk9JRCBSVFVTQkJ1bGtSeENvbXBsZXRlKHB1cmJiX3QgcFVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0X3JlZ3MpOwotCi0jZGVmaW5lIFJUVVNCTWxtZVVwKHBBZCkJICAgICAgICBcCi17CQkJCQkJCQkgICAgXAotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsJXAotCWlmIChwaWRfbnIocE9iai0+TUxNRVRocl9waWQpID4gMCkgXAotICAgICAgICB1cCgmKHBBZC0+bWxtZV9zZW1hcGhvcmUpKTsgXAotfQotCi0jZGVmaW5lIFJUVVNCQ01EVXAocEFkKQkgICAgICAgICAgICAgICAgXAotewkJCQkJCQkJCSAgICBcCi0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwlcCi0JaWYgKHBpZF9ucihwT2JqLT5SVFVTQkNtZFRocl9waWQpID4gMCkgXAotCSAgICB1cCgmKHBBZC0+UlRVU0JDbWRfc2VtYXBob3JlKSk7IFwKLX0KLQotc3RhdGljIGlubGluZSBORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVNZW1vcnkoCi0JT1VUIFBWT0lEICpwdHIsCi0JSU4gc2l6ZV90IHNpemUpCi17Ci0JKnB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYoKnB0cikKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JZWxzZQotCQlyZXR1cm4gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotfQotCi0vKiBydG1wLmggKi8KLSNkZWZpbmUJQkVBQ09OX1JJTkdfU0laRSAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIERFVklDRV9WRU5ET1JfUkVRVUVTVF9PVVQgICAgICAgMHg0MAotI2RlZmluZSBERVZJQ0VfVkVORE9SX1JFUVVFU1RfSU4gICAgICAgIDB4YzAKLSNkZWZpbmUgSU5URVJGQUNFX1ZFTkRPUl9SRVFVRVNUX09VVCAgICAweDQxCi0jZGVmaW5lIElOVEVSRkFDRV9WRU5ET1JfUkVRVUVTVF9JTiAgICAgMHhjMQotI2RlZmluZSBNR01UUElQRUlEWAkJCQkJCTAJLy8gRVA2IGlzIGhpZ2hlc3QgcHJpb3JpdHkKLQotI2RlZmluZSBCVUxLT1VUX01HTVRfUkVTRVRfRkxBRwkJCQkweDgwCi0KLSNkZWZpbmUgUlRVU0JfU0VUX0JVTEtfRkxBRyhfTSwgX0YpCQkJCSgoX00pLT5CdWxrRmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgUlRVU0JfQ0xFQVJfQlVMS19GTEFHKF9NLCBfRikJCQkoKF9NKS0+QnVsa0ZsYWdzICY9IH4oX0YpKQotI2RlZmluZSBSVFVTQl9URVNUX0JVTEtfRkxBRyhfTSwgX0YpCQkJKCgoX00pLT5CdWxrRmxhZ3MgJiAoX0YpKSAhPSAwKQotCi0jZGVmaW5lIEVucXVldWVDbWQoY21kcSwgY21kcWVsbXQpCQlcCi17CQkJCQkJCQkJCVwKLQlpZiAoY21kcS0+c2l6ZSA9PSAwKQkJCQlcCi0JCWNtZHEtPmhlYWQgPSBjbWRxZWxtdDsJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQljbWRxLT50YWlsLT5uZXh0ID0gY21kcWVsbXQ7CVwKLQljbWRxLT50YWlsID0gY21kcWVsbXQ7CQkJCVwKLQljbWRxZWxtdC0+bmV4dCA9IE5VTEw7CQkJCVwKLQljbWRxLT5zaXplKys7CQkJCQkJXAotfQotCi10eXBlZGVmIHN0cnVjdCAgIF9SVF9TRVRfQVNJQ19XQ0lEIHsKLQlVTE9ORyBXQ0lEOyAgICAgICAgICAvLyBtZWNoYW5pc20gZm9yIHJla2V5aW5nOiAwOmRpc2FibGUsIDE6IHRpbWUtYmFzZWQsIDI6IHBhY2tldC1iYXNlZAotCVVMT05HIFNldFRpZDsgICAgICAgIC8vIHRpbWUtYmFzZWQ6IHNlY29uZHMsIHBhY2tldC1iYXNlZDoga2lsby1wYWNrZXRzCi0JVUxPTkcgRGVsZXRlVGlkOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKLQlVQ0hBUiBBZGRyW01BQ19BRERSX0xFTl07CS8vIGF2b2lkIGluIGludGVycnVwdCB3aGVuIHdyaXRlIGtleQotfSBSVF9TRVRfQVNJQ19XQ0lELCpQUlRfU0VUX0FTSUNfV0NJRDsKLQotdHlwZWRlZiBzdHJ1Y3QgICBfUlRfU0VUX0FTSUNfV0NJRF9BVFRSSSB7Ci0JVUxPTkcJV0NJRDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKLQlVTE9ORwlDaXBoZXI7ICAgICAgICAvLyBBU0lDIENpcGhlciBkZWZpbml0aW9uCi0JVUNIQVIJQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotfSBSVF9TRVRfQVNJQ19XQ0lEX0FUVFJJLCpQUlRfU0VUX0FTSUNfV0NJRF9BVFRSSTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfTUVNT1JZX1NUUlVDVCB7Ci0JUFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAvL1BvaW50ZXIgdG8gdGhlIGJhc2UgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5Ci0Jc3RydWN0IF9NTE1FX01FTU9SWV9TVFJVQ1QgICAgICAqTmV4dDsgICAgICAvL1BvaW50ZXIgdG8gdGhlIG5leHQgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5Ci19ICAgTUxNRV9NRU1PUllfU1RSVUNULCAqUE1MTUVfTUVNT1JZX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgIF9NTE1FX01FTU9SWV9IQU5ETEVSIHsKLQlCT09MRUFOICAgICAgICAgICAgICAgICBNZW1SdW5uaW5nOyAgICAgICAgIC8vVGhlIGZsYWcgb2YgdGhlIE1sbWUgbWVtb3J5IGhhbmRsZXIncyBzdGF0dXMKLQlVSU5UICAgICAgICAgICAgICAgICAgICBNZW1vcnlDb3VudDsgICAgICAgIC8vVG90YWwgbm9ucGFnZWQgc3lzdGVtLXNwYWNlIG1lbW9yeSBub3Qgc2l6ZQotCVVJTlQgICAgICAgICAgICAgICAgICAgIEluVXNlQ291bnQ7ICAgICAgICAgLy9Ob25wYWdlZCBzeXN0ZW0tc3BhY2UgbWVtb3J5IGluIHVzZWQgY291bnRzCi0JVUlOVCAgICAgICAgICAgICAgICAgICAgVW5Vc2VDb3VudDsgICAgICAgICAvL05vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgYXZhaWxhYmxlIGNvdW50cwotCUlOVCAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0NvdW50OyAgICAgICAvL05vbnBhZ2VkIHN5c3RlbS1zcGFjZSBtZW1vcnkgZm9yIGZyZWUgY291bnRzCi0JUE1MTUVfTUVNT1JZX1NUUlVDVCAgICAgcEluVXNlSGVhZDsgICAgICAgICAvL1BvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbnBhZWQgbWVtb3J5IG5vdCB1c2VkCi0JUE1MTUVfTUVNT1JZX1NUUlVDVCAgICAgcEluVXNlVGFpbDsgICAgICAgICAvL1BvaW50ZXIgdG8gdGhlIGxhc3Qgbm9ucGFnZWQgbWVtb3J5IG5vdCB1c2VkCi0JUE1MTUVfTUVNT1JZX1NUUlVDVCAgICAgcFVuVXNlSGVhZDsgICAgICAgICAvL1BvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbnBhZ2VkIG1lbW9yeSBpbiB1c2VkCi0JUE1MTUVfTUVNT1JZX1NUUlVDVCAgICAgcFVuVXNlVGFpbDsgICAgICAgICAvL1BvaW50ZXIgdG8gdGhlIGxhc3Qgbm9ucGFnZWQgbWVtb3J5IGluIHVzZWQKLQlQVUxPTkcgICAgICAgICAgICAgICAgICBNZW1GcmVlUGVuZGluZ1tNQVhfTUxNRV9IQU5ETEVSX01FTU9SWV07ICAgLy9hbiBhcnJheSB0byBrZWVwIHBlbmRpbmcgZnJlZS1tZW1vcnkncyBwb2ludGVyICgzMmJpdHMpCi19ICAgTUxNRV9NRU1PUllfSEFORExFUiwgKlBNTE1FX01FTU9SWV9IQU5ETEVSOwotCi10eXBlZGVmCXN0cnVjdCBfQ21kUUVsbXQJewotCVVJTlQJCQkJY29tbWFuZDsKLQlQVk9JRAkJCQlidWZmZXI7Ci0JVUxPTkcJCQkJYnVmZmVybGVuZ3RoOwotCUJPT0xFQU4JCQkJQ21kRnJvbU5kaXM7Ci0JQk9PTEVBTgkJCQlTZXRPcGVyYXRpb247Ci0Jc3RydWN0IF9DbWRRRWxtdAkqbmV4dDsKLX0JQ21kUUVsbXQsICpQQ21kUUVsbXQ7Ci0KLXR5cGVkZWYJc3RydWN0CV9DbWRRCXsKLQlVSU5UCQlzaXplOwotCUNtZFFFbG10CSpoZWFkOwotCUNtZFFFbG10CSp0YWlsOwotCVVJTlQzMgkJQ21kUVN0YXRlOwotfUNtZFEsICpQQ21kUTsKLQotLyogb2lkLmggKi8KLS8vIENpcGhlciBzdWl0ZSB0eXBlIGZvciBtaXhlZCBtb2RlIGdyb3VwIGNpcGhlciwgUDgwMi4xMWktMjAwNAotdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEUgewotCUNpcGhlcl9UeXBlX05PTkUsCi0JQ2lwaGVyX1R5cGVfV0VQNDAsCi0JQ2lwaGVyX1R5cGVfVEtJUCwKLQlDaXBoZXJfVHlwZV9SU1ZELAotCUNpcGhlcl9UeXBlX0NDTVAsCi0JQ2lwaGVyX1R5cGVfV0VQMTA0Ci19IFJUXzgwMl8xMV9DSVBIRVJfU1VJVEVfVFlQRSwgKlBSVF84MDJfMTFfQ0lQSEVSX1NVSVRFX1RZUEU7Ci0KLS8vQ01EVEhSRUFEX01VTFRJX1JFQURfTUFDCi0vL0NNRFRIUkVBRF9NVUxUSV9XUklURV9NQUMKLS8vQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRAotLy9DTURUSFJFQURfVkVORE9SX0VFUFJPTV9XUklURQotdHlwZWRlZglzdHJ1Y3QJX0NNREhhbmRsZXJfVExWCXsKLQlVU0hPUlQJCU9mZnNldDsKLQlVU0hPUlQJCUxlbmd0aDsKLQlVQ0hBUgkJRGF0YUZpcnN0OwotfQlDTURIYW5kbGVyX1RMViwgKlBDTURIYW5kbGVyX1RMVjsKLQotLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMTAxCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1VOUExVRyAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDIJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfU1dJVENIX0ZVTkNUSU9OICAgICAgICAgICAgMHgwRDczMDEwMwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX01VTFRJX1dSSVRFX01BQyAgICAgICAgICAgICAgICAgICAweDBENzMwMTA3CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfTVVMVElfUkVBRF9NQUMgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMDgJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRUVQUk9NX1dSSVRFICAgICAgICAgICAgICAgMHgwRDczMDEwQQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9FRVBST01fUkVBRCAgICAgICAgICAgICAgICAweDBENzMwMTBCCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX0VOVEVSX1RFU1RNT0RFICAgICAgICAgICAgIDB4MEQ3MzAxMEMJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfRVhJVF9URVNUTU9ERSAgICAgICAgICAgICAgMHgwRDczMDEwRAkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9XUklURV9CQlAgICAgICAgICAgICAgICAgICAweDBENzMwMTE5CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVkVORE9SX1JFQURfQkJQICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAxMTgJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9WRU5ET1JfV1JJVEVfUkYgICAgICAgICAgICAgICAgICAgMHgwRDczMDExQQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1ZFTkRPUl9GTElQX0lRICAgICAgICAgICAgICAgICAgICAweDBENzMwMTFECS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfUkVTRVRfQlVMS19PVVQgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTAJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9SRVNFVF9CVUxLX0lOICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxMQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9QU01fQklUX1NBVkUgICAgICAgICAgICAgICAgICAweDBENzMwMjEyCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfU0VUX1JBRElPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTQJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9VUERBVEVfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxNgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9BRERfS0VZX1dFUCAgICAgICAgICAgICAgICAweDBENzMwMjE4CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfUkVTRVRfRlJPTV9FUlJPUiAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMUEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9MSU5LX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIxQgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1JFU0VUX0ZST01fTkRJUyAgICAgICAgICAgICAgICAgICAweDBENzMwMjFDCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfQ0hFQ0tfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMTUJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9GT1JDRV9XQUtFX1VQICAgICAgICAgICAgICAgICAgICAgMHgwRDczMDIyMgkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1NFVF9CVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBENzMwMjI1CS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfU0VUX0FTSUNfV0NJRCAgICAgICAgICAgICAgICAgICAgIDB4MEQ3MzAyMjYJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF9TRVRfQVNJQ19XQ0lEX0NJUEhFUiAgICAgICAgICAgICAgMHgwRDczMDIyNwkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEX1FLRVJJT0RJQ19FWEVDVVQgICAgICAgICAgICAgICAgICAweDBENzMwMjNECS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfU0VUX0NMSUVOVF9NQUNfRU5UUlkgICAgICAgICAgICAgIDB4MEQ3MzAyM0UJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfUVVFUllfSEFSRFdBUkVfUkVHSVNURVIgICAgMHgwRDcxMDEwNQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9TRVRfUEhZX01PREUgICAgICAgICAgICAgICAweDBENzkwMTBDCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfODAyXzExX1NFVF9TVEFfQ09ORklHICAgICAgICAgICAgIDB4MEQ3OTAxMTEJLy8gY21kCi0jZGVmaW5lIENNRFRIUkVBRF84MDJfMTFfU0VUX1BSRUFNQkxFICAgICAgICAgICAgICAgMHgwRDc5MDEwMQkvLyBjbWQKLSNkZWZpbmUgQ01EVEhSRUFEXzgwMl8xMV9DT1VOVEVSX01FQVNVUkUJCQkweDBENzkwMTAyCS8vIGNtZAotI2RlZmluZSBDTURUSFJFQURfVVBEQVRFX1BST1RFQ1QJCQkJCTB4MEQ3OTAxMDMJLy8gY21kCi0KLSNkZWZpbmUgV1BBMUFLTUJJVAkgICAgMHgwMQotI2RlZmluZSBXUEEyQUtNQklUCSAgICAweDAyCi0jZGVmaW5lIFdQQTFQU0tBS01CSVQgICAweDA0Ci0jZGVmaW5lIFdQQTJQU0tBS01CSVQgICAweDA4Ci0jZGVmaW5lIFRLSVBCSVQgICAgICAgICAweDAxCi0jZGVmaW5lIENDTVBCSVQgICAgICAgICAweDAyCi0KLQotI2RlZmluZSBSVDI4WFhfU1RBX0ZPUkNFX1dBS0VVUChwQWQsIGJGcm9tVHgpIFwKLSAgICBSVDI4eHhVc2JTdGFBc2ljRm9yY2VXYWtldXAocEFkLCBiRnJvbVR4KTsKLQotI2RlZmluZSBSVDI4WFhfU1RBX1NMRUVQX1RIRU5fQVVUT19XQUtFVVAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKSBcCi0gICAgUlQyOHh4VXNiU3RhQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLQotI2RlZmluZSBSVDI4WFhfTUxNRV9SQURJT19PTihwQWQpIFwKLSAgICBSVDI4eHhVc2JNbG1lUmFkaW9PbihwQWQpOwotCi0jZGVmaW5lIFJUMjhYWF9NTE1FX1JBRElPX09GRihwQWQpIFwKLSAgICBSVDI4eHhVc2JNbG1lUmFkaW9PRkYocEFkKTsKLQotI2VuZGlmIC8vX19SVDI4NzBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQyODcwL3J0X3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF91c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTAyZDRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC9ydF91c2IuYwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vcnQyODYwL3J0X3VzYi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0Mjg3MC91c2JfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdXNiX21haW5fZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2M2JjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDI4NzAvdXNiX21haW5fZGV2LmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uL3J0Mjg2MC91c2JfbWFpbl9kZXYuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvZmlybXdhcmUuaAppbmRleCBiMDc3ODNlLi41Y2Y5Y2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL2Zpcm13YXJlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9maXJtd2FyZS5oCkBAIC00Myw3ICs0Myw3IEBACiAvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLwogCiAKLVVDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7Cit1OCBGaXJtd2FyZUltYWdlXzI4NzAgW10gPSB7CiAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDEwLCAweDI4LCAweDAyLCAweDEwLCAweDMyLCAweDAyLCAweDEwLCAweDc4LCAweDAyLCAweDEyLCAweDY3LCAweDAyLAogMHgxMiwgMHg2OCwgMHgwMiwgMHgxMiwgMHg4NywgMHgwMiwgMHgxMiwgMHg4YywgMHgxMiwgMHgxMiwgMHg4OCwgMHgyMiwgMHgwMiwgMHgxNiwgMHg0OSwgMHgwMiwKIDB4MTcsIDB4MWYsIDB4MDIsIDB4MTMsIDB4NzcsIDB4MDIsIDB4MTIsIDB4OGQsIDB4MzAsIDB4MDUsIDB4MDYsIDB4MjAsIDB4MGQsIDB4MDMsIDB4MTIsIDB4MTcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL21kNC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA3MC9tZDQuaAppbmRleCBmMWU1YjUyLi5hOWNjN2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDcwL21kNC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwNzAvbWQ0LmgKQEAgLTMwLDEzICszMCwxMyBAQAogCiAvKiBNRDQgY29udGV4dC4gKi8KIHR5cGVkZWYJc3RydWN0CV9NRDRfQ1RYXwl7Ci0JVUxPTkcJc3RhdGVbNF07ICAgICAgICAvKiBzdGF0ZSAoQUJDRCkgKi8KLQlVTE9ORwljb3VudFsyXTsgICAgICAgIC8qIG51bWJlciBvZiBiaXRzLCBtb2R1bG8gMl42NCAobHNiIGZpcnN0KSAqLwotCVVDSEFSCWJ1ZmZlcls2NF07ICAgICAgLyogaW5wdXQgYnVmZmVyICovCisJdW5zaWduZWQgbG9uZwlzdGF0ZVs0XTsgICAgICAgIC8qIHN0YXRlIChBQkNEKSAqLworCXVuc2lnbmVkIGxvbmcJY291bnRbMl07ICAgICAgICAvKiBudW1iZXIgb2YgYml0cywgbW9kdWxvIDJeNjQgKGxzYiBmaXJzdCkgKi8KKwl1OAlidWZmZXJbNjRdOyAgICAgIC8qIGlucHV0IGJ1ZmZlciAqLwogfQlNRDRfQ1RYOwogCi1WT0lEIE1ENEluaXQgKE1ENF9DVFggKik7Ci1WT0lEIE1ENFVwZGF0ZSAoTUQ0X0NUWCAqLCBQVUNIQVIsIFVJTlQpOwotVk9JRCBNRDRGaW5hbCAoVUNIQVIgWzE2XSwgTUQ0X0NUWCAqKTsKK3ZvaWQgTUQ0SW5pdCAoTUQ0X0NUWCAqKTsKK3ZvaWQgTUQ0VXBkYXRlIChNRDRfQ1RYICosIHU4ICosIFVJTlQpOwordm9pZCBNRDRGaW5hbCAodTggWzE2XSwgTUQ0X0NUWCAqKTsKIAogI2VuZGlmIC8vX19NRDRfSF9fClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNmNzQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvS2NvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotY29uZmlnIFJUMzA5MAotCXRyaXN0YXRlICJSYWxpbmsgMzA5MCB3aXJlbGVzcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIFg4NiAmJiBXTEFOCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyIGZvciB0aGUgUmFsaW5rIDMwOTAgd2lyZWxlc3MgY2hpcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU0OTFjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1vYmotJChDT05GSUdfUlQzMDkwKQkrPSBydDMwOTBzdGEubwotCi1pbmNsdWRlIGRyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29uZmlnLm1rCi0KLXJ0MzA5MHN0YS1vYmpzIDo9IFwKLQljb21tb24vY3J5cHRfbWQ1Lm8gXAotCWNvbW1vbi9jcnlwdF9zaGEyLm8gXAotCWNvbW1vbi9jcnlwdF9obWFjLm8gXAotCWNvbW1vbi9tbG1lLm8gXAotCWNvbW1vbi9jbW1fd2VwLm8gXAotCWNvbW1vbi9hY3Rpb24ubyBcCi0JY29tbW9uL2NtbV9kYXRhLm8gXAotCWNvbW1vbi9ydG1wX2luaXQubyBcCi0JY29tbW9uL2NtbV90a2lwLm8gXAotCWNvbW1vbi9jbW1fYWVzLm8gXAotCWNvbW1vbi9jbW1fc3luYy5vIFwKLQljb21tb24vZWVwcm9tLm8gXAotCWNvbW1vbi9jbW1fc2FuaXR5Lm8gXAotCWNvbW1vbi9jbW1faW5mby5vIFwKLQljb21tb24vY21tX2NmZy5vIFwKLQljb21tb24vY21tX3dwYS5vIFwKLQljb21tb24vZGZzLm8gXAotCWNvbW1vbi9zcGVjdHJ1bS5vIFwKLQljb21tb24vcnRtcF90aW1lci5vIFwKLQljb21tb24vcnRfY2hhbm5lbC5vIFwKLQljb21tb24vY21tX3Byb2ZpbGUubyBcCi0JY29tbW9uL2NtbV9hc2ljLm8gXAotCXN0YS9hc3NvYy5vIFwKLQlzdGEvYXV0aC5vIFwKLQlzdGEvYXV0aF9yc3AubyBcCi0Jc3RhL3N5bmMubyBcCi0Jc3RhL3Nhbml0eS5vIFwKLQlzdGEvcnRtcF9kYXRhLm8gXAotCXN0YS9jb25uZWN0Lm8gXAotCXN0YS93cGEubyBcCi0JcnRfbGludXgubyBcCi0JcnRfcHJvZmlsZS5vIFwKLQlydF9tYWluX2Rldi5vIFwKLQlzdGFfaW9jdGwubwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1pZmVxICgkKEhBU19ET1QxMV9OX1NVUFBPUlQpLHkpCi1ydDMwOTBzdGEtb2JqcyArPSBcCi0JY29tbW9uL2JhX2FjdGlvbi5vCi1lbmRpZgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgRVRIX0NPTlZFUlQKLWlmZXEgKCQoSEFTX0VUSF9DT05WRVJUX1NVUFBPUlQpLCB5KQotcnQzMDkwc3RhLW9ianMgKz0gXAotCWNvbW1vbi9jbW1fbWF0Lm8gXAotCWNvbW1vbi9jbW1fbWF0X2lwYXJwLm8gXAotCWNvbW1vbi9jbW1fbWF0X3BwcG9lLm8gXAotCWNvbW1vbi9jbW1fbWF0X2lwdjYubwotZW5kaWYKLSNlbmRpZiAvLyBFVEhfQ09OVkVSVCAvLwotCi1pZmVxICgkKEhBU19CTE9DS19ORVRfSUYpLHkpCi1ydDMwOTBzdGEtb2JqcyArPSBjb21tb24vbmV0aWZfYmxvY2subwotZW5kaWYKLQotaWZlcSAoJChIQVNfUU9TX0RMU19TVVBQT1JUKSx5KQotcnQzMDkwc3RhLW9ianMgKz0gc3RhL2Rscy5vCi1lbmRpZgotCi1ydDMwOTBzdGEtb2JqcyArPSBcCi0JcGNpX21haW5fZGV2Lm8gXAotCXJ0X3BjaV9yYnVzLm8gXAotCWNvbW1vbi9jbW1fbWFjX3BjaS5vIFwKLQljb21tb24vY21tX2RhdGFfcGNpLm8gXAotCWNvbW1vbi9lZV9wcm9tLm8gXAotCWNvbW1vbi9lZV9lZnVzZS5vIFwKLQljb21tb24vcnRtcF9tY3UubyBcCi0JY2hpcHMvcnQzMHh4Lm8gXAotCWNvbW1vbi9ydF9yZi5vIFwKLQljaGlwcy9ydDMwOTAubwotCi1pZmVxICgkKEhBU19BVEUpLHkpCi1ydDMwOTBzdGEtb2JqcyArPSBydF9hdGUubwotZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYWN0aW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBhMGEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWFpcm9uZXQuaAotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncwotCVBhdWwgTGluCTA0LTA2LTE1CQlJbml0aWFsCi0qLwotCi0jaWZuZGVmCV9fQUNUSU9OX0hfXwotI2RlZmluZQlfX0FDVElPTl9IX18KLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9fSFRfSU5GT19PQ1RFVAotewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglSZXNlcnZlZDo1OwotCVVDSEFSCVNUQV9DaGFubmVsX1dpZHRoOjE7Ci0JVUNIQVIJRm9ydHlfTUh6X0ludG9sZXJhbnQ6MTsKLQlVQ0hBUglSZXF1ZXN0OjE7Ci0jZWxzZQotCVVDSEFSCVJlcXVlc3Q6MTsKLQlVQ0hBUglGb3J0eV9NSHpfSW50b2xlcmFudDoxOwotCVVDSEFSCVNUQV9DaGFubmVsX1dpZHRoOjE7Ci0JVUNIQVIJUmVzZXJ2ZWQ6NTsKLSNlbmRpZgotfSBIVF9JTkZPUk1BVElPTl9PQ1RFVDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX19GUkFNRV9IVF9JTkZPCi17Ci0JSEVBREVSXzgwMl8xMQkJCUhkcjsKLQlVQ0hBUgkJCQkJQ2F0ZWdvcnk7Ci0JVUNIQVIJCQkJCUFjdGlvbjsKLQlIVF9JTkZPUk1BVElPTl9PQ1RFVAlIVF9JbmZvOwotfSAgIEZSQU1FX0hUX0lORk8sICpQRlJBTUVfSFRfSU5GTzsKLQotI2VuZGlmIC8qIF9fQUNUSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk0MzAzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLSAgICBKYW1lcyBUYW4gICAwOS0wNi0yMDAyICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCi0gICAgSm9obiBDaGFuZyAgMTItMjItMjAwNCAgICBtb2RpZmllZCBmb3IgUlQyNTYxLzI2NjEuIG1lcmdlIHdpdGggU1RBIGRyaXZlcgotKi8KLSNpZm5kZWYgX19BUF9IX18KLSNkZWZpbmUgX19BUF9IX18KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gYXBfZGF0YS5jCi0KLUJPT0xFQU4gQVBCcmlkZ2VUb1dpcmVsZXNzU3RhKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAotICAgIElOICBVSU5UICAgICAgICAgICAgRGF0YUxlbiwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIGZyb213ZHNpZHgpOwotCi0KLVZPSUQJQVBTZW5kUGFja2V0cygKLQlJTglORElTX0hBTkRMRQkJTWluaXBvcnRBZGFwdGVyQ29udGV4dCwKLQlJTglQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXksCi0JSU4JVUlOVAkJCU51bWJlck9mUGFja2V0cyk7Ci0KLU5ESVNfU1RBVFVTIEFQU2VuZFBhY2tldCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi0KLU5ESVNfU1RBVFVTIEFQSGFyZFRyYW5zbWl0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpOwotCi1WT0lEIEFQUnhFQVBPTEZyYW1lSW5kaWNhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotTkRJU19TVEFUVVMgQVBDaGVja1J4RXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFJUMjhYWF9SWERfU1RSVUMJCXBSeEQsCi0JSU4JVUNIQVIJCQlXY2lkKTsKLQotQk9PTEVBTiBBUENoZWNrQ2xhc3MyQ2xhc3MzRXJyb3IoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLQlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOwotCi1WT0lEIEFQSGFuZGxlUnhQc1BvbGwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEFkZHIsCi0JSU4JVVNIT1JUCQkJQWlkLAotICAgIElOCUJPT0xFQU4JCQlpc0FjdGl2ZSk7Ci0KLVZPSUQgICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIERlc2NyaXB0b3JUeXBlKTsKLQotVk9JRCAgICBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgIERpciwKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgIEZyb21SeERvbmVJbnQpOwotCi0vLyBhcF9hc3NvYy5jCi0KLVZPSUQgQVBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCAgQVBQZWVyQXNzb2NSZXFBY3Rpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgIEFQUGVlclJlYXNzb2NSZXFBY3Rpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgIEFQUGVlckRpc2Fzc29jUmVxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1ic3NLaWNrT3V0U3RhcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBJTlQgYXBpZHgsCi0JSU4gVVNIT1JUIFJlYXNvbik7Ci0KLVZPSUQgQVBNbG1lS2lja091dFN0YSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcFN0YUFkZHIsCi0JSU4gVUNIQVIgV2NpZCwKLQlJTiBVU0hPUlQgUmVhc29uKTsKLQotVk9JRCBBUE1sbWVEaXNhc3NvY1JlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBBUENsczNlcnJBY3Rpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUxPTkcgV2NpZCwKLSAgICBJTglQSEVBREVSXzgwMl8xMQlwSGVhZGVyKTsKLQotCi1VU0hPUlQgQVBCdWlsZEFzc29jaWF0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAotICAgIElOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLSAgICBJTiBVQ0hBUiAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcywKLSAgICBJTiBVQ0hBUiAgKlJTTiwKLSAgICBJTiBVQ0hBUiAgKnBSU05MZW4sCi0gICAgSU4gQk9PTEVBTiBiV21tQ2FwYWJsZSwKLSAgICBJTiBVTE9ORyAgUmFsaW5rSWUsCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotICAgIElOIEVYVF9DQVBfSU5GT19FTEVNRU5UIEV4dENhcEluZm8sCi0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotCUlOIFVDSEFSCQkgSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBVU0hPUlQgKnBBaWQpOwotCi0vKgotVk9JRAlSVE1QQWRkQ2xpZW50U2VjKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCUJzc0lkeCwKLQlJTiBVQ0hBUgkJIEtleUlkeCwKLQlJTiBVQ0hBUgkJIENpcGhlckFsZywKLQlJTiBQVUNIQVIJCSBwS2V5LAotCUlOIFBVQ0hBUgkJIHBUeE1pYywKLQlJTiBQVUNIQVIJCSBwUnhNaWMsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpOwotKi8KLQotLy8gYXBfYXV0aC5jCi0KLXZvaWQgQVBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIEFQQ2xzMmVyckFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORyBXY2lkLAotICAgIElOCVBIRUFERVJfODAyXzExCXBIZWFkZXIpOwotCi0vLyBhcF9jb25uZWN0LmMKLQotCi1WT0lEIEFQTWFrZUJzc0JlYWNvbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglJTlQJCQkJYXBpZHgpOwotCi1WT0lEICBBUFVwZGF0ZUJlYWNvbkZyYW1lKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCUlOVAkJCQlhcGlkeCk7Ci0KLVZPSUQgQVBNYWtlQWxsQnNzQmVhY29uKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCAgQVBVcGRhdGVBbGxCZWFjb25GcmFtZSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLQotLy8gYXBfc3luYy5jCi0KLVZPSUQgQVBTeW5jU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIEFQU2NhblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBBUEludmFsaWRTdGF0ZVdoZW5TY2FuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBTY2FuVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFQUGVlclByb2JlUmVxQWN0aW9uKAotICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBUFBlZXJCZWFjb25BY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBBUE1sbWVTY2FuUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBQZWVyQmVhY29uQXRTY2FuQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQVBTY2FuQ25jbEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFwU2l0ZVN1cnZleSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JUE5ESVNfODAyXzExX1NTSUQJcFNzaWQsCi0JSU4JVUNIQVIJCQkJU2NhblR5cGUpOwotCi1WT0lEIFN1cHBvcnRSYXRlKAotCUlOIFBVQ0hBUiBTdXBSYXRlLAotCUlOIFVDSEFSIFN1cFJhdGVMZW4sCi0JSU4gUFVDSEFSIEV4dFJhdGUsCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlPVVQgUFVDSEFSICpSYXRlcywKLQlPVVQgUFVDSEFSIFJhdGVzTGVuLAotCU9VVCBQVUNIQVIgcE1heFN1cHBvcnRSYXRlKTsKLQotCi1CT09MRUFOIEFwU2NhblJ1bm5pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotVk9JRCBBUE92ZXJsYXBwaW5nQlNTU2NhbigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0vLyBhcF93cGEuYwotVk9JRCBXcGFTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi0vLyBhcF9tbG1lLmMKLVZPSUQgQVBNbG1lUGVyaW9kaWNFeGVjKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBBUE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKLQlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKLQlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOwotCi1WT0lEIEFQTWxtZVNldFR4UmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOwotCi1WT0lEIEFQTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFQUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1CT09MRUFOIEFQTXNnVHlwZVN1YnN0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotICAgIE9VVCBJTlQgKk1hY2hpbmUsCi0gICAgT1VUIElOVCAqTXNnVHlwZSk7Ci0KLVZPSUQgQVBRdWlja1Jlc3BvbmVGb3JSYXRlVXBFeGVjKAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLQotVk9JRCBSVE1QU2V0UGlnZ3lCYWNrKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIEJPT0xFQU4JCQliUGlnZ3lCYWNrKTsKLQotVk9JRCBBUEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBBUEFzaWNSeEFudEV2YWxUaW1lb3V0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotLy8gYXAuYwotCi1WT0lEIEFQU3dpdGNoQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBJTlQgQ2hhbm5lbCk7Ci0KLU5ESVNfU1RBVFVTIEFQSW5pdGlhbGl6ZSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQVBTaHV0ZG93bigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7Ci0KLVZPSUQgQVBTdGFydFVwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBBUFN0b3AoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFQQ2xlYW51cFBzUXVldWUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBRVUVVRV9IRUFERVIgICBwUXVldWUpOwotCi1WT0lEIE1hY1RhYmxlUmVzZXQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RW50cnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkciwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCUlOIEJPT0xFQU4JQ2xlYW5BbGwpOwotCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVMb29rdXAoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwQWRkcik7Ci0KLVZPSUQgTWFjVGFibGVNYWludGVuYW5jZSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVVJTlQzMiBNYWNUYWJsZUFzc29jU3RhTnVtR2V0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotTUFDX1RBQkxFX0VOVFJZICpBUFNzUHNJbnF1aXJ5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCi0gICAgT1VUIFNTVCAgICAgICAgICAgICAqU3N0LAotICAgIE9VVCBVU0hPUlQgICAgICAgICAgKkFpZCwKLSAgICBPVVQgVUNIQVIgICAgICAgICAgICpQc01vZGUsCi0gICAgT1VUIFVDSEFSICAgICAgICAgICAqUmF0ZSk7Ci0KLUJPT0xFQU4gQVBQc0luZGljYXRlKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCi0JSU4gVUxPTkcgV2NpZCwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIFBzbSk7Ci0KLVZPSUQgQXBMb2dFdmVudCgKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBQVUNIQVIgICAgICAgICAgIHBBZGRyLAotICAgIElOIFVTSE9SVCAgICAgICAgICAgRXZlbnQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIEFQVXBkYXRlT3BlcmF0aW9uTW9kZSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgQVBVcGRhdGVDYXBhYmlsaXR5QW5kRXJwSWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIEFwQ2hlY2tBY2Nlc3NDb250cm9sTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSICAgICAgICAgQXBpZHgpOwotCi1WT0lEIEFwVXBkYXRlQWNjZXNzQ29udHJvbExpc3QoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgICAgICAgICBBcGlkeCk7Ci0KLVZPSUQgQXBFbnF1ZXVlTnVsbEZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIsCi0JSU4gVUNIQVIgICAgICAgICBUeFJhdGUsCi0JSU4gVUNIQVIgICAgICAgICBQSUQsCi0JSU4gVUNIQVIgICAgICAgICBhcGlkeCwKLSAgICBJTiBCT09MRUFOICAgICAgIGJRb3NOdWxsLAotICAgIElOIEJPT0xFQU4gICAgICAgYkVPU1AsCi0gICAgSU4gVUNIQVIgICAgICAgICBPbGRVUCk7Ci0KLVZPSUQgQXBTZW5kRnJhbWUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBWT0lEICAgICAgICAgICBwQnVmZmVyLAotICAgIElOICBVTE9ORyAgICAgICAgICAgTGVuZ3RoLAotICAgIElOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAotICAgIElOICBVQ0hBUiAgICAgICAgICAgUElEKTsKLQotVk9JRCBBcEVucXVldWVBY2tGcmFtZSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotICAgIElOIFVDSEFSICAgICAgICAgVHhSYXRlLAotCUlOIFVDSEFSICAgICAgICAgYXBpZHgpOwotCi0vLyBhcF9zYW5pdHkuYwotCi0KLUJPT0xFQU4gUGVlckFzc29jUmVxQ21tU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gaXNSZXNzb2MsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcExpc3RlbkludGVydmFsLAotICAgIE9VVCBQVUNIQVIgcEFwQWRkciwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuLAotICAgIE9VVCBjaGFyICpTc2lkLAotICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAotICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAotICAgIE9VVCBVQ0hBUiAqUlNOLAotICAgIE9VVCBVQ0hBUiAqcFJTTkxlbiwKLSAgICBPVVQgQk9PTEVBTiAqcGJXbW1DYXBhYmxlLAotICAgIE9VVCBVTE9ORyAgKnBSYWxpbmtJZSwKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0gICAgT1VUIEVYVF9DQVBfSU5GT19FTEVNRU5UCSpwRXh0Q2FwSW5mbywKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0gICAgT1VUIFVDSEFSCQkgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpOwotCi0KLUJPT0xFQU4gUGVlckRpc2Fzc29jUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqUmVhc29uKTsKLQotQk9PTEVBTiBQZWVyRGVhdXRoUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqUmVhc29uKTsKLQotQk9PTEVBTiBBUFBlZXJBdXRoU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjEsCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFVTSE9SVCAqQWxnLAotICAgIE9VVCBVU0hPUlQgKlNlcSwKLSAgICBPVVQgVVNIT1JUICpTdGF0dXMsCi0gICAgT1VUIENIQVIgKkNobGdUZXh0Ci0JKTsKLQotQk9PTEVBTiBBUFBlZXJQcm9iZVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKlNzaWRMZW4pOwotCi1CT09MRUFOIEFQUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFBVQ0hBUiBwQnNzaWQsCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqU3NpZExlbiwKLSAgICBPVVQgVUNIQVIgKkJzc1R5cGUsCi0gICAgT1VUIFVTSE9SVCAqQmVhY29uUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqQ2hhbm5lbCwKLSAgICBPVVQgTEFSR0VfSU5URUdFUiAqVGltZXN0YW1wLAotICAgIE9VVCBVU0hPUlQgKkNhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVQ0hBUiBSYXRlW10sCi0gICAgT1VUIFVDSEFSICpSYXRlTGVuLAotICAgIE9VVCBCT09MRUFOICpFeHRlbmRlZFJhdGVJZUV4aXN0LAotICAgIE9VVCBVQ0hBUiAqRXJwKTsKLSNpZiBkZWZpbmVkKFJUMzB4eCkgfHwgZGVmaW5lZChSVDMwNXgpCi1WT0lEIEVuYWJsZUFQTUlNT1BTKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBEaXNhYmxlQVBNSU1PUFMoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmCi0jZW5kaWYgIC8vIF9fQVBfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2FwY2xpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2FwY2xpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjNjMzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hcGNsaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfYXBjbGkuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNoaWFuZywgRm9uY2hpICAgIDAyLTEzLTIwMDcgICAgICBjcmVhdGVkCi0qLwotCi0jaWZuZGVmIF9BUF9BUENMSV9IXwotI2RlZmluZSBfQVBfQVBDTElfSF8KLQotI2lmZGVmIEFQQ0xJX1NVUFBPUlQKLQotI2luY2x1ZGUgInJ0bXAuaCIKLQotI2RlZmluZSBBVVRIX1RJTUVPVVQJMzAwICAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBBU1NPQ19USU1FT1VUCTMwMCAgICAgICAgIC8vIHVuaXQ6IG1zZWMKLS8vI2RlZmluZSBKT0lOX1RJTUVPVVQJMjAwMCAgICAgICAgLy8gdW5pdDogbXNlYyAvLyBub3QgdXNlZCBpbiBBcC1jbGllbnQgbW9kZSwgcmVtb3ZlIGl0Ci0jZGVmaW5lIFBST0JFX1RJTUVPVVQJMTAwMCAgICAgICAgLy8gdW5pdDogbXNlYwotCi0jZGVmaW5lIEFQQ0xJX1JPT1RfQlNTSURfR0VUKHBBZCwgd2NpZCkgKChwQWQpLT5NYWNUYWIuQ29udGVudFsod2NpZCldLkFkZHIpCi0jZGVmaW5lIEFQQ0xJX0lGX1VQX0NIRUNLKHBBZCwgaWZpZHgpICgocEFkKS0+QXBDZmcuQXBDbGlUYWJbKGlmaWR4KV0uZGV2LT5mbGFncyAmIElGRl9VUCkKLQotLyogc2FuaXR5IGNoZWNrIGZvciBhcGlkeCAqLwotI2RlZmluZSBBUENMSV9NUl9BUElEWF9TQU5JVFlfQ0hFQ0soaWR4KSBcCi17IFwKLQlpZiAoKGlkeCkgPj0gTUFYX0FQQ0xJX05VTSkgXAotCXsgXAotCQkoaWR4KSA9IDA7IFwKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM+IEVycm9yISBhcGNsaS1pZHggPiBNQVhfQVBDTElfTlVNIVxuIiwgX19GVU5DVElPTl9fKSk7IFwKLQl9IFwKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgX0FQQ0xJX01MTUVfSk9JTl9SRVFfU1RSVUNUIHsKLQlVQ0hBUglCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVDSEFSCVNzaWRMZW47Ci0JVUNIQVIJU3NpZFtNQVhfTEVOX09GX1NTSURdOwotfSBBUENMSV9NTE1FX0pPSU5fUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9DVFJMX0pPSU5fUkVRX1NUUlVDVCB7Ci0JVVNIT1JUCVN0YXR1czsKLX0gQVBDTElfQ1RSTF9NU0dfU1RSVUNULCAqUFNUQV9DVFJMX01TR19TVFJVQ1Q7Ci0KLUJPT0xFQU4gaXNWYWxpZEFwQ2xpSWYoCi0JU0hPUlQgaWZJbmRleCk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIGFwY2xpX2N0cmwuYwotLy8KLVZPSUQgQXBDbGlDdHJsU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DX0VYIFRyYW5zW10pOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBhcGNsaV9zeW5jLmMKLS8vCi1WT0lEIEFwQ2xpU3luY1N0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORV9FWCAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBUcmFuc1tdKTsKLQotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gYXBjbGlfYXV0aC5jCi0vLwotVk9JRCBBcENsaUF1dGhTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkVfRVggKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIGFwY2xpX2Fzc29jLmMKLS8vCi1WT0lEIEFwQ2xpQXNzb2NTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkVfRVggKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqQXBDbGlUYWJsZUxvb2tVcEJ5V2NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiB3Y2lkLAotCUlOIFBVQ0hBUiBwQWRkcnMpOwotCi0KLUJPT0xFQU4gQXBDbGlBbGxvd1RvU2VuZFBhY2tldCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQgVUNIQVIJCSpwV2NpZCk7Ci0KLUJPT0xFQU4JCUFwQ2xpVmFsaWRhdGVSU05JRSgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVBFSURfU1RSVUNUCXBFaWRfcHRyLAotCUlOCQlVU0hPUlQJCQllaWRfbGVuLAotCUlOCQlVU0hPUlQJCQlpZHgpOwotCi1WT0lEIFJUMjh4eF9BcENsaV9Jbml0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBORVRfREVWCQkJcFBoeU5ldERldik7Ci0KLVZPSUQgUlQyOHh4X0FwQ2xpX0Nsb3NlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVDI4eHhfQXBDbGlfUmVtb3ZlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1WT0lEIFJUMjh4eF9BcENsaV9SZW1vdmUoCi0JSU4gUFJUTVBfQURBUFRFUiBhZF9wKTsKLQotSU5UIEFwQ2xpSWZMb29rVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotSU5UIEFwQ2xpX1ZpcnR1YWxJRl9PcGVuKAotCUlOCVBORVRfREVWCWRldl9wKTsKLQotSU5UIEFwQ2xpX1ZpcnR1YWxJRl9DbG9zZSgKLQlJTglQTkVUX0RFVglkZXZfcCk7Ci0KLUlOVCBBcENsaV9WaXJ0dWFsSUZfUGFja2V0U2VuZCgKLQlJTiBQTkRJU19QQUNLRVQJCXNrYl9wLAotCUlOIFBORVRfREVWCQkJZGV2X3ApOwotCi1JTlQgQXBDbGlfVmlydHVhbElGX0lvY3RsKAotCUlOIFBORVRfREVWCQkJCWRldl9wLAotCUlOIE9VVCBzdHJ1Y3QgaWZyZXEJKnJxX3AsCi0JSU4gSU5UIGNtZCk7Ci0KLQotVk9JRCBBcENsaU1ndE1hY0hlYWRlckluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLSAgICBJTiBVQ0hBUiBTdWJUeXBlLAotICAgIElOIFVDSEFSIFRvRHMsCi0gICAgSU4gUFVDSEFSIHBEQSwKLSAgICBJTiBQVUNIQVIgcEJzc2lkLAotICAgIElOIFVTSE9SVCBpZkluZGV4KTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotQk9PTEVBTiBBcENsaUNoZWNrSHQoCi0JSU4JCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTgkJVVNIT1JUCQkJCUlmSW5kZXgsCi0JSU4gT1VUCUhUX0NBUEFCSUxJVFlfSUUJKnBIdENhcGFiaWxpdHksCi0JSU4gT1VUCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLUJPT0xFQU4gQXBDbGlMaW5rVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgaWZJbmRleCk7Ci0KLVZPSUQgQXBDbGlMaW5rRG93bigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBpZkluZGV4KTsKLQotVk9JRCBBcENsaUlmVXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFwQ2xpSWZEb3duKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBcENsaUlmTW9uaXRvcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUJPT0xFQU4gQXBDbGlNc2dUeXBlU3Vic3QoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotCU9VVCBJTlQgKk1hY2hpbmUsCi0JT1VUIElOVCAqTXNnVHlwZSk7Ci0KLUJPT0xFQU4gcHJlQ2hlY2tNc2dUeXBlU3Vic2V0KAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBQRlJBTUVfODAyXzExIHBGcmFtZSwKLQlPVVQgSU5UICpNYWNoaW5lLAotCU9VVCBJTlQgKk1zZ1R5cGUpOwotCi1CT09MRUFOIEFwQ2xpUGVlckFzc29jUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVU0hPUlQgKnBBaWQsCi0gICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLSAgICBPVVQgQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgVUNIQVIgKnBBZGRIdEluZm9MZW4sCi0gICAgT1VUIFVDSEFSICpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKLSAgICBPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0gICAgT1VUIFVDSEFSICpwQ2tpcEZsYWcpOwotCi1WT0lECUFwQ2xpUGVlclBhaXJNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKLQotVk9JRAlBcENsaVBlZXJQYWlyTXNnM0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLVZPSUQJQXBDbGlQZWVyR3JvdXBNc2cxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKLQotQk9PTEVBTiBBcENsaUNoZWNrUlNOSUUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGF0YSwKLQlJTiAgVUNIQVIgICAgICAgICAgIERhdGFMZW4sCi0JSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LAotCU9VVAlVQ0hBUgkJCSpPZmZzZXQpOwotCi1CT09MRUFOIEFwQ2xpUGFyc2VLZXlEYXRhKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleURhdGEsCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlEYXRhTGVuLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLQlJTglVQ0hBUgkJCUlmSWR4LAotCUlOCVVDSEFSCQkJYlBhaXJld2lzZSk7Ci0KLUJPT0xFQU4gIEFwQ2xpSGFuZGxlUnhCcm9hZGNhc3RGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBBUENsaVVwZGF0ZVBhaXJ3aXNlS2V5VGFibGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQkqS2V5UnNjLAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLUJPT0xFQU4gQVBDbGlVcGRhdGVTaGFyZWRLZXlUYWJsZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXksCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlMZW4sCi0JSU4JVUNIQVIJCQlEZWZhdWx0S2V5SWR4LAotCUlOICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLSNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCi0KLSNlbmRpZiAvKiBfQVBfQVBDTElfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2F1dG9DaFNlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njg4MWZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2F1dG9DaFNlbC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiYXBfYXV0b0NoU2VsX2NtbS5oIgotCi0jaWZuZGVmIF9fQVVUT0NIU0VMRUNUX0hfXwotI2RlZmluZSBfX0FVVE9DSFNFTEVDVF9IX18KLQotI2lmZGVmIEFVVE9fQ0hfU0VMRUNUX0VOSEFOQ0UKLSNkZWZpbmUgQVBfQVVUT19DSF9TRUwoX19QLCBfX08pCU5ld19BUEF1dG9TZWxlY3RDaGFubmVsKChfX1ApLCAoX19PKSkKLSNlbHNlCi0jZGVmaW5lIEFQX0FVVE9fQ0hfU0VMKF9fUCwgX19PKQlBUEF1dG9TZWxlY3RDaGFubmVsKChfX1ApLCAoX19PKSkKLSNlbmRpZgotCi0KLVVMT05HIEF1dG9DaEJzc0luc2VydEVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBDaGFubmVsTm8sCi0JSU4gVUNIQVIgRXh0Q2hPZmZzZXQsCi0JSU4gQ0hBUiBSc3NpKTsKLQotdm9pZCBBdXRvQ2hCc3NUYWJsZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi12b2lkIENoYW5uZWxJbmZvSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXZvaWQgQXV0b0NoQnNzVGFibGVEZXN0cm95KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotdm9pZCBDaGFubmVsSW5mb0Rlc3Ryb3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VQ0hBUiBOZXdfQVBBdXRvU2VsZWN0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIE9wdGltYWwpOwotCi1VQ0hBUiBBUEF1dG9TZWxlY3RDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gT3B0aW1hbCk7Ci0KLSNlbmRpZiAvLyBfX0FVVE9DSFNFTEVDVF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfYXV0b0NoU2VsX2NtbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hdXRvQ2hTZWxfY21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNzdlYzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9hdXRvQ2hTZWxfY21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2F1dG9DaFNlbF9jbW0uaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0jaWZuZGVmIF9fQVVUT0NIU0VMRUNUX0NNTV9IX18KLSNkZWZpbmUgX19BVVRPQ0hTRUxFQ1RfQ01NX0hfXwotCi0jZGVmaW5lIFJTU0lfVE9fREJNX09GRlNFVCAxMjAgLy8gUlNTSS0xMTUgPSBkQm0KLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUxPTkcgZGlydHluZXNzW01BWF9OVU1fT0ZfQ0hBTk5FTFMrMV07Ci0JVUxPTkcgbWF4X3Jzc2lbTUFYX05VTV9PRl9DSEFOTkVMUysxXTsKLQlVTE9ORyB0b3RhbF9yc3NpW01BWF9OVU1fT0ZfQ0hBTk5FTFMrMV07Ci0JVUlOVDMyIEZhbHNlQ0NBW01BWF9OVU1fT0ZfQ0hBTk5FTFMrMV07Ci19IENIQU5ORUxJTkZPLCAqUENIQU5ORUxJTkZPOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgQnNzaWRbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiBTc2lkTGVuOwotCUNIQVIgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotCVVDSEFSIENoYW5uZWw7Ci0JVUNIQVIgRXh0Q2hPZmZzZXQ7Ci0JVUNIQVIgUnNzaTsKLX0gQlNTRU5UUlksICpQQlNTRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlVQ0hBUiBCc3NOcjsKLQlCU1NFTlRSWSBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IEJTU0lORk8sICpQQlNTSU5GTzsKLQotI2VuZGlmIC8vIF9fQVVUT0NIU0VMRUNUX0NNTV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX2NmZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzk5NDIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9jZmcuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLSNpZm5kZWYgX19BUF9DRkdfSF9fCi0jZGVmaW5lIF9fQVBfQ0ZHX0hfXwotCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotSU5UIFJUTVBBUFByaXZJb2N0bFNldCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEgKnBJb2N0bENtZFN0cik7Ci0KLUlOVCBSVE1QQVBQcml2SW9jdGxTaG93KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqcElvY3RsQ21kU3RyKTsKLQotSU5UIFJUTVBBUFNldEluZm9ybWF0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU9VVAlzdHJ1Y3QgaXdyZXEJKnJxLAotCUlOCUlOVAkJCQljbWQpOwotCi1JTlQgUlRNUEFQUXVlcnlJbmZvcm1hdGlvbigKLQlJTglQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTglPVVQJc3RydWN0IGl3cmVxICAgICpycSwKLQlJTglJTlQgICAgICAgICAgICAgICAgIGNtZCk7Ci0KLVZPSUQgUlRNUElvY3RsU3RhdGlzdGljcygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBzdHJ1Y3QgaXdyZXEgKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsR2V0TWFjVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gc3RydWN0IGl3cmVxICp3cnEpOwotCi0jaWZkZWYgREJHCi1WT0lEIFJUTVBBUElvY3RsQkJQKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKLQotVk9JRCBSVE1QQVBJb2N0bE1BQygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBzdHJ1Y3QgaXdyZXEgICAgKndycSk7Ci0KLVZPSUQgUlRNUEFQSW9jdGxFMlBST00oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgc3RydWN0IGl3cmVxICAgICp3cnEpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi1WT0lEIFJUTVBBUElvY3RsUkYoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLSNlbmRpZiAvLyBEQkcgLy8KLQotVk9JRCBSVDI4WFhfSU9DVExfTWF4UmF0ZUdldCgKLQlJTglSVE1QX0FEQVBURVIJCQkqcEFkLAotCUlOCVBIVFRSQU5TTUlUX1NFVFRJTkcJcEh0UGh5TW9kZSwKLQlPVVQJVUlOVDMyCQkJCQkqcFJhdGUpOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgUlRNUElvY3RsUXVlcnlCYVRhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBSVE1QSW9jdGxTdGF0aWNXZXBDb3B5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotVk9JRCBSVE1QSW9jdGxSYWRpdXNEYXRhKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIHN0cnVjdCBpd3JlcQkJKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsQWRkV1BBS2V5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotVk9JRCBSVE1QSW9jdGxBZGRQTUtJRENhY2hlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotI2VuZGlmIC8vIF9fQVBfQ0ZHX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9pZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfaWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODc5N2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF9pZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfaWRzLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLVZPSUQgUlRNUElkc1BlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1CT09MRUFOIFJUTVBTcG9vZmVkTWdtdERldGVjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQSEVBREVSXzgwMl8xMQlwSGVhZGVyLAotCUlOIENIQVIJCQkJUnNzaTAsCi0JSU4gQ0hBUgkJCQlSc3NpMSwKLQlJTiBDSEFSCQkJCVJzc2kyKTsKLQotVk9JRCBSVE1QQ29uZmxpY3RTc2lkRGV0ZWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBVQ0hBUgkJCXBTc2lkLAotCUlOIFVDSEFSCQkJU3NpZExlbiwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMik7Ci0KLUJPT0xFQU4gUlRNUFJlcGxheUF0dGFja0RldGVjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQVUNIQVIJCQlwQWRkcjIsCi0JSU4gQ0hBUgkJCQlSc3NpMCwKLQlJTiBDSEFSCQkJCVJzc2kxLAotCUlOIENIQVIJCQkJUnNzaTIpOwotCi1WT0lEIFJUTVBVcGRhdGVTdGFNZ210Q291bnRlcigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVU0hPUlQJCQl0eXBlKTsKLQotVk9JRCBSVE1QQ2xlYXJBbGxJZHNDb3VudGVyKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QSWRzU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBJZHNTdG9wKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBydG1wX3JlYWRfaWRzX2Zyb21fZmlsZSgKLQkJCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQkJCWNoYXIgKnRtcGJ1ZiwKLQkJCWNoYXIgKmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX21ic3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfbWJzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzg1NTZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfbWJzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBhcF9tYnNzLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgTU9EVUxFX01CU1MKLQotI2RlZmluZSBNQlNTX0VYVEVSTiAgICBleHRlcm4KLQotI2Vsc2UKLQotI2RlZmluZSBNQlNTX0VYVEVSTgotCi0jZW5kaWYgLy8gTU9EVUxFX01CU1MgLy8KLQotCi0vKiBQdWJsaWMgZnVuY3Rpb24gbGlzdCAqLwotTUJTU19FWFRFUk4gVk9JRCBSVDI4eHhfTUJTU19Jbml0KAotCUlOIFBSVE1QX0FEQVBURVIgYWRfcCwKLQlJTiBQTkVUX0RFViBtYWluX2Rldl9wKTsKLQotTUJTU19FWFRFUk4gVk9JRCBSVDI4eHhfTUJTU19DbG9zZSgKLQlJTiBQUlRNUF9BREFQVEVSIGFkX3ApOwotCi1NQlNTX0VYVEVSTiBWT0lEIFJUMjh4eF9NQlNTX1JlbW92ZSgKLQlJTiBQUlRNUF9BREFQVEVSIGFkX3ApOwotCi1JTlQgTUJTU19WaXJ0dWFsSUZfT3BlbigKLQlJTglQTkVUX0RFVgkJCWRldl9wKTsKLUlOVCBNQlNTX1ZpcnR1YWxJRl9DbG9zZSgKLQlJTglQTkVUX0RFVgkJCWRldl9wKTsKLUlOVCBNQlNTX1ZpcnR1YWxJRl9QYWNrZXRTZW5kKAotCUlOIFBORElTX1BBQ0tFVAkJCXNrYl9wLAotCUlOIFBORVRfREVWCQkJCWRldl9wKTsKLUlOVCBNQlNTX1ZpcnR1YWxJRl9Jb2N0bCgKLQlJTiBQTkVUX0RFVgkJCQlkZXZfcCwKLQlJTiBPVVQgc3RydWN0IGlmcmVxCSpycV9wLAotCUlOIElOVCBjbWQpOwotCi0vKiBFbmQgb2YgYXBfbWJzcy5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX3VhcHNkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2FwX3VhcHNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OWE5ZTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF91YXBzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgYXBfdWFwc2QuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotLyogb25seSBmb3IgVUFQU0RfVElNSU5HX1JFQ09SRCAqLwotCi0vLyNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9GVU5DCi0KLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9NQVgJCQkJMTAwMAotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX0RJU1BMQVlfVElNRVMJMTAKLQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX0lTUgkJCQkxCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfVEFTS0xFVAkJCTIKLSNkZWZpbmUgVUFQU0RfVElNSU5HX1JFQ09SRF9UUkdfUkNWCQkJMwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX01PVkUyVFgJCQk0Ci0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfVFgyQUlSCQkJNQotCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19DVFJMX1NUT1AJCQkJMAotI2RlZmluZSBVQVBTRF9USU1JTkdfQ1RSTF9TVEFSVAkJCQkxCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19DVFJMX1NVU1BFTkQJCQkyCi0KLSNkZWZpbmUgVUFQU0RfVElNRVNUQU1QX0dFVChfX3BBZCwgX19UaW1lU3RhbXApCQkJXAotCXsJCQkJCQkJCQkJCQkJXAotCQlVSU5UMzIgX19DU1I9MDsJVUlOVDY0IF9fVmFsdWU2NDsJCQkJXAotCQlSVE1QX0lPX1JFQUQzMigoX19wQWQpLCBUU0ZfVElNRVJfRFcwLCAmX19DU1IpOwlcCi0JCV9fVGltZVN0YW1wID0gKFVJTlQ2NClfX0NTUjsJCQkJCVwKLQkJUlRNUF9JT19SRUFEMzIoKF9fcEFkKSwgVFNGX1RJTUVSX0RXMSwgJl9fQ1NSKTsJXAotCQlfX1ZhbHVlNjQgPSAoVUlOVDY0KV9fQ1NSOwkJCQkJCVwKLQkJX19UaW1lU3RhbXAgfD0gKF9fVmFsdWU2NCA8PCAzMik7CQkJCVwKLQl9Ci0KLSNpZmRlZiBMSU5VWAotI2RlZmluZSBVQVBTRF9USU1FX0dFVChfX3BBZCwgX19UaW1lKQkJCQkJXAotCQlfX1RpbWUgPSBqaWZmaWVzCi0jZW5kaWYgLy8gTElOVVggLy8KLQotCi0jaWZkZWYgVUFQU0RfVElNSU5HX1JFQ09SRF9GVU5DCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfU1RBUlQoKQkJCQlcCi0JVUFQU0RfVGltaW5nUmVjb3JkQ3RybChVQVBTRF9USU1JTkdfQ1RSTF9TVEFSVCk7Ci0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfU1RPUCgpCQkJCVwKLQlVQVBTRF9UaW1pbmdSZWNvcmRDdHJsKFVBUFNEX1RJTUlOR19DVFJMX1NUT1ApOwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEKF9fcEFkLCBfX1R5cGUpCQlcCi0JVUFQU0RfVGltaW5nUmVjb3JkKF9fcEFkLCBfX1R5cGUpOwotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX0lOREVYKF9fTG9vcEluZGV4KQlcCi0JVUFQU0RfVGltZWluZ1JlY29yZExvb3BJbmRleChfX0xvb3BJbmRleCk7Ci0jZWxzZQotCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfU1RBUlQoKQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEX1NUT1AoKQotI2RlZmluZSBVQVBTRF9USU1JTkdfUkVDT1JEKF9fcEFkLCBfX3R5cGUpCi0jZGVmaW5lIFVBUFNEX1RJTUlOR19SRUNPUkRfSU5ERVgoX19Mb29wSW5kZXgpCi0jZW5kaWYgLy8gVUFQU0RfVElNSU5HX1JFQ09SRF9GVU5DIC8vCi0KLQotI2lmbmRlZiBNT0RVTEVfV01NX1VBUFNECi0KLSNkZWZpbmUgVUFQU0RfRVhURVJOCQkJZXh0ZXJuCi0KLS8qIFB1YmxpYyBNYXJjbyBsaXN0ICovCi0KLS8qCi0JSW5pdCBzb21lIHBhcmFtZXRlcnMgaW4gcGFja2V0IHN0cnVjdHVyZSBmb3IgUW9TIE51bGwgZnJhbWU7Ci0JcHVycG9zZTogaXMgZm9yIG1hbmFnZW1lbnQgZnJhbWUgdHggZG9uZSB1c2UKLSovCi0jZGVmaW5lIFVBUFNEX01SX1FPU19OVUxMX0hBTkRMRShfX3BBZCwgX19wRGF0YSwgX19wUGFja2V0KQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCVBIRUFERVJfODAyXzExIF9fcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSkoX19wRGF0YSk7CQkJCVwKLQkJTUFDX1RBQkxFX0VOVFJZICpfX3BFbnRyeTsJCQkJCQkJCQkJCVwKLQkJaWYgKF9fcEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJUlRNUF9TRVRfUEFDS0VUX1FPU19OVUxMKChfX3BQYWNrZXQpKTsJCQkJCQkJXAotCQkJX19wRW50cnkgPSBNYWNUYWJsZUxvb2t1cCgoX19wQWQpLCBfX3BIZWFkZXItPkFkZHIxKTsJCQlcCi0JCQlpZiAoX19wRW50cnkgIT0gTlVMTCkJCQkJCQkJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKChfX3BQYWNrZXQpLCBfX3BFbnRyeS0+QWlkKTsJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQkJXAotCQllbHNlCQkJCQkJCQkJCQkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQkJXAotCQkJUlRNUF9TRVRfUEFDS0VUX05PTl9RT1NfTlVMTCgoX19wUGFja2V0KSk7CQkJCQkJXAotCQl9CQkJCQkJCQkJCQkJCQkJCQlcCi0JfQotCi0vKgotCUluaXQgTUFDIGVudHJ5IFVBUFNEIHBhcmFtZXRlcnM7Ci0JcHVycG9zZTogaW5pdGlhbGl6ZSBVQVBTRCBQUyBxdWV1ZSBhbmQgY29udHJvbCBwYXJhbWV0ZXJzCi0qLwotI2RlZmluZSBVQVBTRF9NUl9FTlRSWV9JTklUKF9fcEVudHJ5KQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJVUlOVDE2CV9fSWRBYzsJCQkJCQkJCQkJCQkJCVwKLQkJZm9yKF9fSWRBYz0wOyBfX0lkQWM8V01NX05VTV9PRl9BQzsgX19JZEFjKyspCQkJCQkJXAotCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCYoX19wRW50cnkpLT5VQVBTRFF1ZXVlW19fSWRBY10pOwkJCVwKLQkJKF9fcEVudHJ5KS0+VUFQU0RUeE51bSA9IDA7CQkJCQkJCQkJCQlcCi0JCShfX3BFbnRyeSktPnBVQVBTREVPU1BGcmFtZSA9IE5VTEw7CQkJCQkJCQkJXAotCQkoX19wRW50cnkpLT5iQVBTREZsYWdTUFN0YXJ0ID0gMDsJCQkJCQkJCQlcCi0JCShfX3BFbnRyeSktPmJBUFNERmxhZ0VPU1BPSyA9IDA7CQkJCQkJCQkJXAotCQkoX19wRW50cnkpLT5NYXhTUExlbmd0aCA9IDA7CQkJCQkJCQkJCVwKLQl9Ci0KLS8qCi0JUmVzZXQgTUFDIGVudHJ5IFVBUFNEIHBhcmFtZXRlcnM7Ci0gICBwdXJwb3NlOiBjbGVhbiBhbGwgVUFQU0QgUFMgcXVldWU7IHJlbGVhc2UgdGhlIEVPU1AgZnJhbWUgaWYgZXhpc3RzOwotCQkJcmVzZXQgY29udHJvbCBwYXJhbWV0ZXJzCi0qLwotI2RlZmluZSBVQVBTRF9NUl9FTlRSWV9SRVNFVChfX3BBZCwgX19wRW50cnkpCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJTUFDX1RBQkxFX0VOVFJZICpfX3BTdGE7CQkJCQkJCQkJCQlcCi0JCVVJTlQzMiBfX0lkQWM7CQkJCQkJCQkJCQkJCQlcCi0JCV9fcFN0YSA9IChfX3BFbnRyeSk7CQkJCQkJCQkJCQkJXAotCQkvKiBjbGVhciBhbGwgVS1BUFNEIHF1ZXVlcyAqLwkJCQkJCQkJCQlcCi0JCWZvcihfX0lkQWM9MDsgX19JZEFjPFdNTV9OVU1fT0ZfQUM7IF9fSWRBYysrKQkJCQkJCVwKLQkJCUFQQ2xlYW51cFBzUXVldWUoKF9fcEFkKSwgJl9fcFN0YS0+VUFQU0RRdWV1ZVtfX0lkQWNdKTsJCVwKLQkJLyogY2xlYXIgRU9TUCBmcmFtZSAqLwkJCQkJCQkJCQkJCVwKLQkJX19wU3RhLT5VQVBTRFR4TnVtID0gMDsJCQkJCQkJCQkJCQlcCi0JCWlmIChfX3BTdGEtPnBVQVBTREVPU1BGcmFtZSAhPSBOVUxMKSB7CQkJCQkJCQlcCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKChfX3BBZCksCQkJCQkJCQkJXAotCQkJCQkJCVFVRVVFX0VOVFJZX1RPX1BBQ0tFVChfX3BTdGEtPnBVQVBTREVPU1BGcmFtZSksCVwKLQkJCQkJCQlORElTX1NUQVRVU19GQUlMVVJFKTsJCQkJCQkJXAotCQkJX19wU3RhLT5wVUFQU0RFT1NQRnJhbWUgPSBOVUxMOyB9CQkJCQkJCQlcCi0JCV9fcFN0YS0+YkFQU0RGbGFnU1BTdGFydCA9IDA7CQkJCQkJCQkJCVwKLQkJX19wU3RhLT5iQVBTREZsYWdFT1NQT0sgPSAwOyB9Ci0KLS8qCi0JRW5hYmxlIG9yIGRpc2FibGUgVUFQU0QgZmxhZyBpbiBXTU0gZWxlbWVudCBpbiBiZWFjb24gZnJhbWU7Ci0JcHVycG9zZTogc2V0IFVBUFNEIGVuYWJsZS9kaXNhYmxlIGJpdAotKi8KLSNkZWZpbmUgVUFQU0RfTVJfSUVfRklMTChfX1Fvc0N0cmxGaWVsZCwgX19wQWQpCQkJCQkJCQlcCi0JCShfX1Fvc0N0cmxGaWVsZCkgfD0gKChfX3BBZCktPkNvbW1vbkNmZy5iQVBTRENhcGFibGUpID8gMHg4MCA6IDB4MDA7Ci0KLS8qCi0JQ2hlY2sgaWYgd2UgZG8gTk9UIG5lZWQgdG8gY29udHJvbCBUSU0gYml0IGZvciB0aGUgc3RhdGlvbjsKLQlub3RlOiB3ZSBjb250cm9sIFRJTSBiaXQgb25seSB3aGVuIGFsbCBBQyBhcmUgVUFQU0QgQUMKLSovCi0jZGVmaW5lIFVBUFNEX01SX0lTX05PVF9USU1fQklUX05FRURFRF9IQU5ETEVEKF9fcE1hY0VudHJ5LCBfX1F1ZUlkeCkJCVwKLQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKChfX3BNYWNFbnRyeSksIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSkgJiYgXAotCQkJKCEoX19wTWFjRW50cnkpLT5iQVBTRERlbGl2ZXJFbmFibGVkUGVyQUNbUUlEX0FDX1ZPXSB8fAkJCVwKLQkJCSEoX19wTWFjRW50cnkpLT5iQVBTRERlbGl2ZXJFbmFibGVkUGVyQUNbUUlEX0FDX1ZJXSB8fAkJCVwKLQkJCSEoX19wTWFjRW50cnkpLT5iQVBTRERlbGl2ZXJFbmFibGVkUGVyQUNbUUlEX0FDX0JFXSB8fAkJCVwKLQkJCSEoX19wTWFjRW50cnkpLT5iQVBTRERlbGl2ZXJFbmFibGVkUGVyQUNbUUlEX0FDX0JLXSkgJiYJCQlcCi0JCShfX3BNYWNFbnRyeSktPmJBUFNERGVsaXZlckVuYWJsZWRQZXJBQ1tfX1F1ZUlkeF0pCi0KLS8qIGNoZWNrIGlmIHRoZSBBQyBpcyBVQVBTRCBkZWxpdmVyeS1lbmFibGVkIEFDICovCi0jZGVmaW5lIFVBUFNEX01SX0lTX1VBUFNEX0FDKF9fcE1hY0VudHJ5LCBfX0FjSWQpCQkJCQkJCVwKLQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKChfX3BNYWNFbnRyeSksIGZDTElFTlRfU1RBVFVTX0FQU0RfQ0FQQUJMRSkgJiYJXAotCQkJKCgwIDw9IChfX0FjSWQpKSAmJiAoKF9fQWNJZCkgPCBXTU1fTlVNX09GX0FDKSkgJiYgLyogMCB+IDMgKi8JXAotCQkJKF9fcE1hY0VudHJ5KS0+YkFQU0REZWxpdmVyRW5hYmxlZFBlckFDWyhfX0FjSWQpXSkKLQotLyogY2hlY2sgaWYgYWxsIEFDIGFyZSBVQVBTRCBkZWxpdmVyeS1lbmFibGVkIEFDICovCi0jZGVmaW5lIFVBUFNEX01SX0lTX0FMTF9BQ19VQVBTRChfX0ZsZ0lzQWN0aXZlLCBfX3BNYWNFbnRyeSkJCQkJXAotCQkoKChfX0ZsZ0lzQWN0aXZlKSA9PSBGQUxTRSkgJiYgKChfX3BNYWNFbnRyeSktPmJBUFNEQWxsQUMgPT0gMSkpCi0KLS8qIHN1c3BlbmQgU1AgKi8KLSNkZWZpbmUgVUFQU0RfTVJfU1BfU1VTUEVORChfX3BBZCkJCQkJCQkJCQkJCVwKLQkJKF9fcEFkKS0+YkFQU0RGbGFnU1BTdXNwZW5kID0gMTsKLQotLyogcmVzdW1lIFNQICovCi0jZGVmaW5lIFVBUFNEX01SX1NQX1JFU1VNRShfX3BBZCkJCQkJCQkJCQkJCVwKLQkJKF9fcEFkKS0+YkFQU0RGbGFnU1BTdXNwZW5kID0gMDsKLQotLyogbWFyayBQUyBwb2xsIGZyYW1lIHNlbnQgaW4gbWl4IG1vZGUgKi8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLS8qCi0JTm90ZToKLQkoMSkgV2hlbiBTUCBpcyBub3Qgc3RhcnRlZCwgdHJ5IHRvIG1hcmsgYSBmbGFnIHRvIHJlY29yZCBpZiB0aGUgbGVnYWN5IHBzCi0JCXBhY2tldCBpcyBoYW5kbGVkIGluIHN0YXRpc3RpY3MgaGFuZGxlcjsKLQkoMikgV2hlbiBTUCBpcyBzdGFydGVkLCBpbmNyZWFzZSB0aGUgVUFQU0QgY291bnQgbnVtYmVyIGZvciB0aGUgbGVnYWN5IFBTLgotKi8KLSNkZWZpbmUgVUFQU0RfTVJfTUlYX1BTX1BPTExfUkNWKF9fcEFkLCBfX3BNYWNFbnRyeSkJCQkJCQlcCi0JCWlmICgoX19wTWFjRW50cnkpLT5iQVBTREZsYWdTcFJvdWdoVXNlID09IDApCQkJCQkJXAotCQl7CQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlpZiAoKF9fcE1hY0VudHJ5KS0+YkFQU0RGbGFnU1BTdGFydCA9PSAwKQkJCQkJCVwKLQkJCXsJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmICgoX19wTWFjRW50cnkpLT5iQVBTREZsYWdMZWdhY3lTZW50ID09IDEpCQkJCVwKLQkJCQkJTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKChfX3BBZCkpOwkJCQkJCVwKLQkJCQkoX19wTWFjRW50cnkpLT5iQVBTREZsYWdMZWdhY3lTZW50ID0gMTsJCQkJCQlcCi0JCQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJCWVsc2UJCQkJCQkJCQkJCQkJCQlcCi0JCQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkoX19wTWFjRW50cnkpLT5VQVBTRFR4TnVtICsrOwkJCQkJCQkJXAotCQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0jZWxzZQotCi0jZGVmaW5lIFVBUFNEX0VYVEVSTgotI2RlZmluZSBVQVBTRF9RT1NfTlVMTF9RVUVfSUQJMHg3ZgotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0vKgotCUluIFJUMjg3MCwgRklGTyBjb3VudGVyIGlzIGZvciBhbGwgc3RhdGlvbnMsIG5vdCBmb3IgcGVyLWVudHJ5LAotCXNvIHdlIGNhbiBub3QgdXNlIGFjY3VyYXRlIG1ldGhvZCBpbiBSVDI4NzAKLSovCi0KLS8qCi0JTm90ZSBmb3IgU1AgQUNDVVJBVEUgTWVjaGFuaXNtOgotCTEuIFdoZW4gdHJhZmZpYyBpcyBidXN5IGZvciB0aGUgUFMgc3RhdGlvbgotCQlTdGF0aXN0aWNzIEZJRk8gY291bnRlciBtYXliZSBvdmVyZmxvdyBiZWZvcmUgd2UgcmVhZCBpdCwgc28gVUFQU0QKLQkJY291bnRpbmcgbWVjaGFuaXNtIHdpbGwgbm90IGFjY3VyYXRlbHkuCi0KLQkJU29sdXRpb246Ci0JCVdlIG5lZWQgdG8gYXZvaWQgdGhlIHdvcnNlIGNhc2Ugc28gd2Ugc3VnZ2VzdCBhIG1heGltdW0gaW50ZXJ2YWwgZm9yCi0JCWEgU1AgdGhhdCB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBsYXN0IGZyYW1lIGZyb20gUUFQIGFuZCBkYXRhIGZyYW1lIGZyb20KLQkJUVNUQSBpcyBsYXJnZXIgdGhhbiBVQVBTRF9FUFRfU1BfSU5ULgotCi0JMi4gV2hlbiB0cmFmZmljIHVzZSBDQ0svMU1icHMgZnJvbSBRQVAKLQkJU3RhdGlzdGljcyBGSUZPIHdpbGwgbm90IGNvdW50IHRoZSBwYWNrZXQuIFRoZXJlIGFyZSAyIGNhc2VzOgotCQkoMSkgV2UgZm9yY2UgdG8gZG93bmdyYWdlIEFSUCByZXNwb25zZSAmIERIQ1AgcGFja2V0IHRvIDFNYnBzOwotCQkoMikgQWZ0ZXIgcmF0ZSBzd2l0Y2ggbWVjaGFuaXNtLCB0eCByYXRlIGlzIGZpeGVkIHRvIDFNYnBzLgotCi0JCVNvbHV0aW9uOgotCQlVc2Ugb2xkIERNQSBVQVBTRCBtZWNoYW5pc20uCi0KLQkzLiBXaGVuIHBhcnQgb2YgQUMgdXNlcyBsZWdhY3kgUFMgbW9kZQotCQlTdGF0aXN0aWNzIGNvdW50IHdpbGwgaW5jbHVlIHBhY2tldCBzdGF0aXN0aWNzIGZvciBsZWdhY3kgUFMgcGFja2V0cwotCQlzbyB3ZSBjYW4gbm90IGtub3cgd2hpY2ggb25lIGlzIFVBUFNELCB3aGljaCBvbmUgaXMgbGVnYWN5LgotCi0JCVNvbHV0aW9uOgotCQlDb3VuZCB0aGUgbGVnYWN5IFBTIHBhY2tldC4KLQotCTQuIENoZWNrIEZJRk8gc3RhdGlzdGljcyBjb3VudCBpbiBSeCBEb25lIGZ1bmN0aW9uCi0JCVdlIGNhbiBub3QgdG8gY2hlY2sgVFggRklGTyBzdGF0aXN0aWNzIGNvdW50IGluIFJ4IERvbmUgZnVuY3Rpb24gb3IKLQkJdGhlIHJlYWwgcGFja2V0IHR4L3J4IHNlcXVlbmNlIHdpbGwgYmUgZGlzYXJyYW5nZWQuCi0KLQkJU29sdXRpb246Ci0JCVN1c3BlbmQgU1AgaGFuZGxlIGJlZm9yZSByeCBkb25lIGFuZCByZXN1bWUgU1AgaGFuZGxlIGFmdGVyIHJ4IGRvbmUuCi0qLwotI2RlZmluZSBVQVBTRF9TUF9BQ0NVUkFURQkJLyogdXNlIG1vcmUgYWNjdXJhdGUgbWV0aG9kIHRvIHNlbmQgRU9TUCAqLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jZGVmaW5lIFVBUFNEX0VQVF9TUF9JTlQJCSgxMDAwMDAvKDEwMDAwMDAvT1NfSFopKSAvKiAxMDBtcyAqLwotCi0jZW5kaWYgLy8gTU9EVUxFX1dNTV9VQVBTRCAvLwotCi0KLS8qIG1heCBVQVBTRCBidWZmZXIgcXVldWUgc2l6ZSAqLwotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9VQVBTRF9RVUVVRQkxNgkvKiBmb3IgZWFjaCBBQyA9IDE2KjQgPSA2NCAqLwotCi0KLS8qIFB1YmxpYyBmdW5jdGlvbiBsaXN0ICovCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCVVBUFNEIE1vZHVsZSBJbml0LgotCi1Bcmd1bWVudHM6Ci0JcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9Jbml0KAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlVQVBTRCBNb2R1bGUgUmVsZWFzZS4KLQotQXJndW1lbnRzOgotCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfUmVsZWFzZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JRnJlZSBhbGwgRU9TUCBmcmFtZXMgYW5kIGNsb3NlIGFsbCBTUC4KLQotQXJndW1lbnRzOgotCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfRnJlZUFsbCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQpOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQ2xvc2UgY3VycmVudCBTZXJ2aWNlIFBlcmlvZC4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JcEVudHJ5CQkJQ2xvc2UgdGhlIFNQIG9mIHRoZSBlbnRyeQotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfU1BfQ2xvc2UoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICAgICAgcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlEZWxpdmVyIGFsbCBxdWV1ZWQgcGFja2V0cy4KLQotQXJndW1lbnRzOgotCXBBZCAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkqcEVudHJ5ICAgICAgICBTVEFUSU9OCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci0JU01QIHByb3RlY3Rpb24gYnkgY2FsbGVyIGZvciBwYWNrZXQgZW5xdWV1ZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX0FsbFBhY2tldERlbGl2ZXIoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlQYXJzZSB0aGUgVUFQU0QgZmllbGQgaW4gV01NIGVsZW1lbnQgaW4gKHJlKWFzc29jaWF0aW9uIHJlcXVlc3QgZnJhbWUuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSpwRW50cnkJCQlTVEFUSU9OCi0JKnBFbG0JCQlRb1MgaW5mb3JtYXRpb24gZmllbGQKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLQlObyBwcm90ZWN0aW9uIGlzIG5lZWRlZC4KLQotCTEuIEFzc29jaWF0aW9uIC0+IFRTUEVDOgotCQl1c2Ugc3RhdGljIFVBUFNEIHNldHRpbmdzIGluIEFzc29jaWF0aW9uCi0JCXVwZGF0ZSBVQVBTRCBzZXR0aW5ncyBpbiBUU1BFQwotCi0JMi4gQXNzb2NpYXRpb24gLT4gVFNQRUMoMTFyKSAtPiBSZWFzc29jaWF0aW9uOgotCQl1cGRhdGUgVUFQU0Qgc2V0dGluZ3MgaW4gVFNQRUMKLQkJYmFja3VwIHN0YXRpYyBVQVBTRCBzZXR0aW5ncyBpbiBSZWFzc29jaWF0aW9uCi0KLQkzLiBBc3NvY2lhdGlvbiAtPiBSZWFzc29jaWF0aW9uOgotCQl1cGRhdGUgVUFQU0Qgc2V0dGluZ3MgaW4gVFNQRUMKLQkJYmFja3VwIHN0YXRpYyBVQVBTRCBzZXR0aW5ncyBpbiBSZWFzc29jaWF0aW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9Bc3NvY1BhcnNlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnksCi0JSU4JVUNIQVIJCQkJKnBFbG0pOwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JRW5xdWV1ZSBhIFVBUFNEIHBhY2tldC4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JKnBFbnRyeQkJCVNUQVRJT04KLQlwUGFja2V0CQkJVUFQU0QgZG5saW5rIHBhY2tldAotCUlkQWMJCQlVQVBTRCBBQyBJRCAoMCB+IDMpCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQVBTRF9FWFRFUk4gVk9JRCBVQVBTRF9QYWNrZXRFbnF1ZXVlKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnksCi0JSU4JUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOCVVJTlQzMgkJCQlJZEFjKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUhhbmRsZSBRb1MgTnVsbCBGcmFtZSBUeCBEb25lIG9yIE1hbmFnZW1lbnQgVHggRG9uZSBpbnRlcnJ1cHQuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBQYWNrZXQJCQlDb21wbGV0ZWQgVFggcGFja2V0Ci0JcERzdE1hYwkJCURlc3RpbmF0ZWQgTUFDIGFkZHJlc3MKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1FvU051bGxUeE1nbXRUeERvbmVIYW5kbGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTglVQ0hBUgkJCQkqcERzdE1hYyk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlNYWludGVuYW5jZSBvdXIgVUFQU0QgUFMgcXVldWUuICBSZWxlYXNlIGFsbCBxdWV1ZWQgcGFja2V0IGlmIHRpbWVvdXQuCi0KLUFyZ3VtZW50czoKLQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCSpwRW50cnkJCQlTVEFUSU9OCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci0JSWYgaW4gUlQyODcwLCBwRW50cnkgY2FuIG5vdCBiZSByZW1vdmVkIGR1cmluZyBVQVBTRF9RdWV1ZU1haW50ZW5hbmNlKCkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1F1ZXVlTWFpbnRlbmFuY2UoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkJKnBFbnRyeSk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlDbG9zZSBTUCBpbiBUeCBEb25lLCBub3QgVHggRE1BIERvbmUuCi0KLUFyZ3VtZW50czoKLQlwQWQgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JcEVudHJ5CQkJZGVzdGluYXRpb24gZW50cnkKLQlGbGdTdWNjZXNzCQkwOnR4IHN1Y2Nlc3MsIDE6dHggZmFpbAotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotCUZvciBSVDI4eHggc2VyaWVzLCBmb3IgcGFja2V0SUQ9MCBvciBtdWx0aWNhc3QgZnJhbWUsIG5vIHN0YXRpc3RpY3MKLQljb3VudCBjYW4gYmUgZ290LCBleDogQVJQIHJlc3BvbnNlIG9yIERIQ1AgcGFja2V0cywgd2Ugd2lsbCB1c2UKLQlsb3cgcmF0ZSB0byBzZXQgKENDSywgTUNTPTA9cGFja2V0SUQpLgotCVNvIFNQIHdpbGwgbm90IGJlIGNsb3NlIHVudGlsIFVBUFNEX0VQVF9TUF9JTlQgdGltZW91dC4KLQotCVNvIGlmIHRoZSB0eCByYXRlIGlzIDFNYnBzIGZvciBhIGVudHJ5LCB3ZSB3aWxsIHVzZSBETUEgZG9uZSwgbm90Ci0JdXNlIFVBUFNEX1NQX0FVRV9IYW5kbGUoKS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1NQX0FVRV9IYW5kbGUoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOIFVDSEFSCQkJRmxnU3VjY2Vzcyk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlDbG9zZSBjdXJyZW50IFNlcnZpY2UgUGVyaW9kLgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLQlXaGVuIHdlIHJlY2VpdmUgRU9TUCBmcmFtZSB0eCBkb25lIGludGVycnVwdCBhbmQgYSB1cGxpbmsgcGFja2V0Ci0JZnJvbSB0aGUgc3RhdGlvbiBzaW11bHRhbmVvdXNseSwgd2Ugd2lsbCByZWdhcmQgaXQgYXMgYSBuZXcgdHJpZ2dlcgotCWZyYW1lIGJlY2F1c2UgdGhlIHBhY2tldCBpcyByZWNlaXZlZCB3aGVuIEVPU1AgZnJhbWUgdHggZG9uZSBpbnRlcnJ1cHQuCi0KLQlXZSBjYW4gbm90IHN1cmUgdGhlIHVwbGluayBwYWNrZXQgaXMgc2VudCBhZnRlciBvbGQgU1Agb3IgaW4gdGhlIG9sZCBTUC4KLQlTbyB3ZSBtdXN0IGNsb3NlIHRoZSBvbGQgU1AgaW4gcmVjZWl2ZSBkb25lIElTUiB0byBhdm9pZCB0aGUgcHJvYmxlbS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1NQX0Nsb3NlSW5SVkRvbmUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkKTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUNoZWNrIGlmIHdlIG5lZWQgdG8gY2xvc2UgY3VycmVudCBTUC4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JcFBhY2tldAkJCUNvbXBsZXRlZCBUWCBwYWNrZXQKLQlwRHN0TWFjCQkJRGVzdGluYXRlZCBNQUMgYWRkcmVzcwotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotCTEuIFdlIG5lZWQgdG8gY2FsbCB0aGUgZnVuY3Rpb24gaW4gVHhEb25lIElTUi4KLQkyLiBTTVAgcHJvdGVjdGlvbiBieSBjYWxsZXIgZm9yIHBhY2tldCBlbnF1ZXVlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfU1BfUGFja2V0Q2hlY2soCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTglVQ0hBUgkJCQkqcERzdE1hYyk7Ci0KLQotI2lmZGVmIFVBUFNEX1RJTUlOR19SRUNPUkRfRlVOQwotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLQlFbmFibGUvRGlzYWJsZSBUaW1pbmcgUmVjb3JkIEZ1bmN0aW9uLgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQlGbGFnCQkJMSAoRW5hYmxlKSBvciAwIChEaXNhYmxlKQotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfVGltaW5nUmVjb3JkQ3RybCgKLQlJTglVSU5UMzIJCQkJRmxhZyk7Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JUmVjb3JkIHNvbWUgdGltaW5ncy4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JVHlwZQkJCVRoZSB0aW1pbmcgaXMgZm9yIHdoYXQgdHlwZQotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotCVVBUFNEX1RJTUlOR19SRUNPUkRfSVNSCi0JVUFQU0RfVElNSU5HX1JFQ09SRF9UQVNLTEVUCi0JVUFQU0RfVElNSU5HX1JFQ09SRF9UUkdfUkNWCi0JVUFQU0RfVElNSU5HX1JFQ09SRF9NT1ZFMlRYCi0JVUFQU0RfVElNSU5HX1JFQ09SRF9UWDJBSVIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1RpbWluZ1JlY29yZCgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUlOVDMyCQkJCVR5cGUpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCVJlY29yZCB0aGUgbG9vcCBpbmRleCBmb3IgcmVjZWl2ZWQgcGFja2V0IGhhbmRsZS4KLQotQXJndW1lbnRzOgotCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JTG9vcEluZGV4CQlUaGUgUnhQcm9jZXNzZWQgaW4gQVBSeERvbmVJbnRlcnJ1cHRIYW5kbGUoKQotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUFQU0RfRVhURVJOIFZPSUQgVUFQU0RfVGltZWluZ1JlY29yZExvb3BJbmRleCgKLQlJTglVSU5UMzIJCQkJTG9vcEluZGV4KTsKLSNlbmRpZiAvLyBVQVBTRF9USU1JTkdfUkVDT1JEX0ZVTkMgLy8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCUhhbmRsZSBVQVBTRCBUcmlnZ2VyIEZyYW1lLgotCi1Bcmd1bWVudHM6Ci0JcEFkCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkqcEVudHJ5CQkJdGhlIHNvdXJjZSBTVEFUSU9OCi0JVXBPZkZyYW1lCQl0aGUgVVAgb2YgdGhlIHRyaWdnZXIgZnJhbWUKLQotUmV0dXJuIFZhbHVlOgotCU5vbmUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVBUFNEX0VYVEVSTiBWT0lEIFVBUFNEX1RyaWdnZXJGcmFtZUhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5LAotCUlOCVVDSEFSCQkJCVVwT2ZGcmFtZSk7Ci0KLQotCi0vKiBFbmQgb2YgYXBfdWFwc2QuaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF93ZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvYXBfd2RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmY2IxMDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9hcF93ZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2NmZy5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgRm9uY2hpICAgIDAyLTEzLTIwMDcgICAgICBjcmVhdGVkCi0qLwotCi0jaWZuZGVmIF9BUF9XRFNfSF8KLSNkZWZpbmUgX0FQX1dEU19IXwotCi0jZGVmaW5lIFdEU19FTlRSWV9SRVRSWV9JTlRFUlZBTAkoMTAwICogT1NfSFogLyAxMDAwKQotCi0KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBXRFNfSUZfVVBfQ0hFQ0soCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVMT05HIGlmaWR4KQotewotCWlmICgocEFkLT5mbGdfd2RzX2luaXQgIT0gVFJVRSkgfHwKLQkJKGlmaWR4ID49IE1BWF9XRFNfRU5UUlkpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLS8vCWlmIChwQWQtPldkc1RhYi5XZHNFbnRyeVtpZmlkeF0uZGV2LT5mbGFncyAmIElGRl9VUCkKLS8vIFBhdGNoIGZvciB3ZHMgLHdoZW4gZGlydmVyIGNhbGwgYXBtbG1lcGVyaW9kID0+IEFQTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcgY2hlY2sgaWYgd2RzIGRldmljZSByZWFkeQotaWYgKChwQWQtPldkc1RhYi5XZHNFbnRyeVtpZmlkeF0uZGV2ICE9IE5VTEwpICYmIChwQWQtPldkc1RhYi5XZHNFbnRyeVtpZmlkeF0uZGV2LT5mbGFncyAmIElGRl9VUCkpCi0JCXJldHVybiBUUlVFOwotCi0JcmV0dXJuIEZBTFNFOwotfQotCi1MT05HIFdkc0VudHJ5QWxsb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBBZGRyKTsKLQotVk9JRCBXZHNFbnRyeURlbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEFkZHIpOwotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0V0RTRW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlVSU5UIFdkc1RhYklkeCk7Ci0KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVXRFNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpOwotCi0KLUJPT0xFQU4gQXBXZHNBbGxvd1RvU2VuZFBhY2tldCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlPVVQJVUNIQVIJCSpwV2NpZCk7Ci0KLU1BQ19UQUJMRV9FTlRSWSAqV2RzVGFibGVMb29rdXBCeVdjaWQoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gVUNIQVIgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIsCi0JSU4gQk9PTEVBTiBiUmVzZXRJZGVsQ291bnQpOwotCi1NQUNfVEFCTEVfRU5UUlkgKldkc1RhYmxlTG9va3VwKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQVUNIQVIgICAgICAgICAgcEFkZHIsCi0JSU4gQk9PTEVBTiBiUmVzZXRJZGVsQ291bnQpOwotCi1NQUNfVEFCTEVfRU5UUlkgKkZpbmRXZHNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCVdjaWQsCi0JSU4gUFVDSEFSCQkJcEFkZHIsCi0JSU4gVUlOVDMyCQkJUGh5TW9kZSk7Ci0KLVZPSUQgV2RzVGFibGVNYWludGVuYW5jZSgKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCk7Ci0KLVZPSUQgUlQyOHh4X1dEU19Jbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBORVRfREVWIG5ldF9kZXYpOwotCi1WT0lEIFJUMjh4eF9XRFNfQ2xvc2UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIFJUMjh4eF9XRFNfUmVtb3ZlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBXZHNEb3duKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljVXBkYXRlV2RzUnhXQ0lEVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFzaWNVcGRhdGVXZHNFbmNyeXB0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIHdjaWQpOwotCi1WT0lEIFdkc1BlZXJCZWFjb25Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCUlOIFVDSEFSIE1heFN1cHBvcnRlZFJhdGVMZW4sCi0JSU4gQk9PTEVBTiBiV21tQ2FwYWJsZSwKLQlJTiBVTE9ORyBDbGllbnRSYWxpbmtJZSwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbik7Ci0KLVZPSUQgQVBXZHNJbml0aWFsaXplKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotSU5UCVNob3dfV2RzVGFibGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotVk9JRCBydG1wX3JlYWRfd2RzX2Zyb21fZmlsZSgKLQkJCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQkJCVBTVFJJTkcgdG1wYnVmLAotCQkJUFNUUklORyBidWZmZXIpOwotCi1WT0lEIFdkc1ByZXBhcmVXZXBLZXlGcm9tTWFpbkJzcygKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQpOwotCi1JTlQgV2RzVmlydHVhbElGU2VuZFBhY2tldHMoCi0JSU4gUE5ESVNfUEFDS0VUIHBTa2IsCi0JSU4gUE5FVF9ERVYgZGV2KTsKLQotSU5UIFdkc1ZpcnR1YWxJRl9vcGVuKAotCUlOIFBORVRfREVWIGRldik7Ci0KLUlOVCBXZHNWaXJ0dWFsSUZfY2xvc2UoCi0JSU4gUE5FVF9ERVYgZGV2KTsKLQotSU5UIFdkc1ZpcnR1YWxJRl9pb2N0bCgKLQlJTiBQTkVUX0RFViBuZXRfZGV2LAotCUlOIE9VVCBzdHJ1Y3QgaWZyZXEgKnJxLAotCUlOIElOVCBjbWQpOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUNoZWNrIHRoZSBXRFMgRW50cnkgaXMgdmFsaWQgb3Igbm90LgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBWYWxpZFdkc0VudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIFdkc0luZGV4KQotewotCUJPT0xFQU4gcmVzdWx0OwotCVBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5OwotCi0JZG8KLQl7Ci0JCWlmIChXZHNJbmRleCA+PSBNQVhfV0RTX0VOVFJZKQotCQl7Ci0JCQlyZXN1bHQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBBZC0+V2RzVGFiLldkc0VudHJ5W1dkc0luZGV4XS5WYWxpZCAhPSBUUlVFKQotCQl7Ci0JCQlyZXN1bHQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKChwQWQtPldkc1RhYi5XZHNFbnRyeVtXZHNJbmRleF0uTWFjVGFiTWF0Y2hXQ0lEPT0wKQotCQkJfHwgKHBBZC0+V2RzVGFiLldkc0VudHJ5W1dkc0luZGV4XS5NYWNUYWJNYXRjaFdDSUQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQotCQl7Ci0JCQlyZXN1bHQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEFkLT5XZHNUYWIuV2RzRW50cnlbV2RzSW5kZXhdLk1hY1RhYk1hdGNoV0NJRF07Ci0JCWlmIChwTWFjRW50cnktPlZhbGlkQXNXRFMgIT0gVFJVRSkKLQkJewotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlc3VsdCA9IFRSVUU7Ci0JfSB3aGlsZShGQUxTRSk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmIC8vIF9BUF9XRFNfSF8gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzB4eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhhZTAwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMHh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydDMweHguYwotCi0JQWJzdHJhY3Q6Ci0JU3BlY2lmaWMgZnVuY2l0b25zIGFuZCB2YXJpYWJsZXMgZm9yIFJUMzB4eC4KLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLSNpZmRlZiBSVDMweHgKLQotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJZb3UgU2hvdWxkIEVuYWJsZSBjb21waWxlIGZsYWcgUlRNUF9SRl9SV19TVVBQT1JUIGZvciB0aGlzIGNoaXAiCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLwotLy8gUkYgcmVnaXN0ZXIgaW5pdGlhbGl6YXRpb24gc2V0Ci0vLwotUkVHX1BBSVIgICBSVDMweHhfUkZSZWdUYWJsZVtdID0gewotICAgICAgICB7UkZfUjA0LCAgICAgICAgICAweDQwfSwKLSAgICAgICAge1JGX1IwNSwgICAgICAgICAgMHgwM30sCi0gICAgICAgIHtSRl9SMDYsICAgICAgICAgIDB4MDJ9LAotICAgICAgICB7UkZfUjA3LCAgICAgICAgICAweDcwfSwKLSAgICAgICAge1JGX1IwOSwgICAgICAgICAgMHgwRn0sCi0gICAgICAgIHtSRl9SMTAsICAgICAgICAgIDB4NDF9LAotICAgICAgICB7UkZfUjExLCAgICAgICAgICAweDIxfSwKLSAgICAgICAge1JGX1IxMiwgICAgICAgICAgMHg3Qn0sCi0gICAgICAgIHtSRl9SMTQsICAgICAgICAgIDB4OTB9LAotICAgICAgICB7UkZfUjE1LCAgICAgICAgICAweDU4fSwKLSAgICAgICAge1JGX1IxNiwgICAgICAgICAgMHhCM30sCi0gICAgICAgIHtSRl9SMTcsICAgICAgICAgIDB4OTJ9LAotICAgICAgICB7UkZfUjE4LCAgICAgICAgICAweDJDfSwKLSAgICAgICAge1JGX1IxOSwgICAgICAgICAgMHgwMn0sCi0gICAgICAgIHtSRl9SMjAsICAgICAgICAgIDB4QkF9LAotICAgICAgICB7UkZfUjIxLCAgICAgICAgICAweERCfSwKLSAgICAgICAge1JGX1IyNCwgICAgICAgICAgMHgxNn0sCi0gICAgICAgIHtSRl9SMjUsICAgICAgICAgIDB4MDF9LAotICAgICAgICB7UkZfUjI5LCAgICAgICAgICAweDFGfSwKLX07Ci0KLVVDSEFSIE5VTV9SRl9SRUdfUEFSTVMgPSAoc2l6ZW9mKFJUMzB4eF9SRlJlZ1RhYmxlKSAvIHNpemVvZihSRUdfUEFJUikpOwotCi0KLQotLy8gQW50ZW5uYSBkaXZlc2l0eSB1c2UgR1BJTzMgYW5kIEVFU0sgcGluIGZvciBjb250cm9sCi0vLyBBbnRlbm5hIGFuZCBFRVBST00gYWNjZXNzIGFyZSBib3RoIHVzaW5nIEVFU0sgcGluLAotLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLS8vIFRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgQXNpY1NldFJ4QW50KCksIG5vdyBjaGFuZ2UgdG8KLS8vVk9JRCBBc2ljU2V0UnhBbnQoCi1WT0lEIFJUMzB4eFNldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KQotewotCVVJTlQzMglWYWx1ZTsKLQlVSU5UMzIJeDsKLQotCWlmICgocEFkLT5FZXByb21BY2Nlc3MpIHx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpIHx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIHRoZSBhbnRlbm5hIHNlbGVjdGlvbiBpcyB0aHJvdWdoIGZpcm13YXJlIGFuZCBNQUMgcmVnaXN0ZXIoR1BJTzMpCi0JaWYgKEFudCA9PSAwKQotCXsKLQkJLy8gTWFpbiBhbnRlbm5hCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4IHw9IChFRVNLKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0jZWxzZQotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzMsIDB4RkYsIDB4MSwgMHgwKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gbWFpbiBhbnRlbm5hXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIEF1eCBhbnRlbm5hCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4ICY9IH4oRUVTSyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotI2Vsc2UKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDczLCAweEZGLCAweDAsIDB4MCk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigweDA4MDgpOwotCQlWYWx1ZSB8PSAweDA4OwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCBWYWx1ZSk7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBc2ljU2V0UnhBbnQsIHN3aXRjaCB0byBhdXggYW50ZW5uYVxuIikpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRm9yIFJGIGZpbHRlciBjYWxpYnJhdGlvbiBwdXJwb3NlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIJUjU1eCA9IDAsIHZhbHVlLCBGaWx0ZXJUYXJnZXQgPSAweDFFLCBCQlBWYWx1ZT0wOwotCVVJTlQJbG9vcCA9IDAsIGNvdW50ID0gMCwgbG9vcGNudCA9IDAsIFJlVHJ5ID0gMDsKLQlVQ0hBUglSRl9SMjRfVmFsdWUgPSAwOwotCi0JLy8gR2l2ZSBiYnAgZmlsdGVyIGluaXRpYWwgdmFsdWUKLQlwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNCA9IDB4MUY7Ci0JcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAweDJGOyAvL0JpdFs1XSBtdXN0IGJlIDEgZm9yIEJXIDQwCi0KLQlkbwotCXsKLQkJaWYgKGxvb3AgPT0gMSkJLy9CYW5kV2lkdGggPSA0MCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgyNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4Mjc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fCBJU19SVDMzOTAocEFkKSkKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE1OwotCQkJZWxzZQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTk7Ci0KLQkJCS8vIHdoZW4gY2FsaWJyYXRlIEJXNDAsIEJCUCBtYXNrIG11c3Qgc2V0IHRvIEJXNDAuCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSY9ICh+MHgxOCk7Ci0JCQlCQlBWYWx1ZXw9ICgweDEwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCQkJLy8gc2V0IHRvIEJXNDAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgfD0gMHgyMDsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegotCQl7Ci0JCQkvLyBXcml0ZSAweDA3IHRvIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUkZfUjI0X1ZhbHVlID0gMHgwNzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQkJCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8IElTX1JUMzM5MChwQWQpKQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTM7Ci0JCQllbHNlCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNjsKLQotCQkJLy8gc2V0IHRvIEJXMjAKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAmdmFsdWUpOwotCQkJdmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgdmFsdWUpOwotCQl9Ci0KLQkJLy8gV3JpdGUgMHgwMSB0byBSRl9SMjIgdG8gZW5hYmxlIGJhc2ViYW5kIGxvb3BiYWNrIG1vZGUKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JCXZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMiwgdmFsdWUpOwotCi0JCS8vIFdyaXRlIDB4MDAgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2YgcGFzc2JhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAwKTsKLQotCQlkbwotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCQkvLyBSZWFkIEJCUF9SNTVbNjowXSBmb3IgcmVjZWl2ZWQgcG93ZXIsIHNldCBSNTV4ID0gQkJQX1I1NVs2OjBdCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjU1LCAmdmFsdWUpOwotCQkJUjU1eCA9IHZhbHVlICYgMHhGRjsKLQotCQl9IHdoaWxlICgoUmVUcnkrKyA8IDEwMCkgJiYgKFI1NXggPT0gMCkpOwotCi0JCS8vIFdyaXRlIDB4MDYgdG8gQkJQX1IyNCB0byBzZXQgcG93ZXIgJiBmcmVxdWVuY3kgb2Ygc3RvcGJhbmQgdGVzdCB0b25lCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAweDA2KTsKLQotCQl3aGlsZShUUlVFKQotCQl7Ci0JCQkvLyBXcml0ZSAweDkwIHRvIEJCUF9SMjUgdG8gdHJhbnNtaXQgdGVzdCB0b25lCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNSwgMHg5MCk7Ci0KLQkJCS8vV2UgbmVlZCB0byB3YWl0IGZvciBjYWxpYnJhdGlvbgotCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNTUsICZ2YWx1ZSk7Ci0JCQl2YWx1ZSAmPSAweEZGOwotCQkJaWYgKChSNTV4IC0gdmFsdWUpIDwgRmlsdGVyVGFyZ2V0KQotCQkJewotCQkJCVJGX1IyNF9WYWx1ZSArKzsKLQkJCX0KLQkJCWVsc2UgaWYgKChSNTV4IC0gdmFsdWUpID09IEZpbHRlclRhcmdldCkKLQkJCXsKLQkJCQlSRl9SMjRfVmFsdWUgKys7Ci0JCQkJY291bnQgKys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIHByZXZlbnQgaW5maW5pdGUgbG9vcCBjYXVzZSBkcml2ZXIgaGFuZy4KLQkJCWlmIChsb29wY250KysgPiAxMDApCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gY2FuJ3QgZmluZCBhIHZhbGlkIHZhbHVlLCBsb29wY250PSVkIHN0b3AgY2FsaWJyYXRpbmciLCBsb29wY250KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIFdyaXRlIFJGX1IyNCB0byBwcm9ncmFtIGZpbHRlcgotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQl9Ci0KLQkJaWYgKGNvdW50ID4gMCkKLQkJewotCQkJUkZfUjI0X1ZhbHVlID0gUkZfUjI0X1ZhbHVlIC0gKChjb3VudCkgPyAoMSkgOiAoMCkpOwotCQl9Ci0KLQkJLy8gU3RvcmUgZm9yIGZ1dHVyZSB1c2FnZQotCQlpZiAobG9vcGNudCA8IDEwMCkKLQkJewotCQkJaWYgKGxvb3ArKyA9PSAwKQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gMjAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vQmFuZFdpZHRoID0gNDAgTUh6Ci0JCQkJcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQgPSAoVUNIQVIpUkZfUjI0X1ZhbHVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQotCQkvLyByZXNldCBjb3VudAotCQljb3VudCA9IDA7Ci0JfSB3aGlsZShUUlVFKTsKLQotCS8vCi0JLy8gU2V0IGJhY2sgdG8gaW5pdGlhbCBzdGF0ZQotCS8vCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIDApOwotCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsICZ2YWx1ZSk7Ci0JdmFsdWUgJj0gfigweDAxKTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKLQotCS8vIHNldCBCQlAgYmFjayB0byBCVzIwCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCUJCUFZhbHVlJj0gKH4weDE4KTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QRmlsdGVyQ2FsaWJyYXRpb24gLSBDYWxpQlcyMFJmUjI0PTB4JXgsIENhbGlCVzQwUmZSMjQ9MHgleFxuIiwgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQsIHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0KSk7Ci19Ci0KLQotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCi0JLy8gUlgwX1BEICYgVFgwX1BELCBSRiBSMSByZWdpc3RlciBCaXQgMiAmIEJpdCAzIHRvIDAgYW5kIFJGX0JMT0NLX2VuLFJYMV9QRCAmIFRYMV9QRCwgQml0MCwgQml0IDQgJiBCaXQ1IHRvIDEKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHgwQykpIHwgMHgzMTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JLy8gVFhfTE8yX2VuLCBSRiBSMTUgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjE1LCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNSwgUkZWYWx1ZSk7Ci0KLQkvKiBtb3ZlIHRvIE5JQ0luaXRSVDMweHhSRlJlZ2lzdGVycwotCS8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQkvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQotCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKSAmJiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKSkKLQl7Ci0JCVJGVmFsdWUgfD0gMHgyMDsKLQl9Ci0JLy8gc2V0IFJGX1IxN19iaXRbMjowXSBlcXVhbCB0byBFRVBST00gc2V0dGluZyBhdCAweDQ4aAotCWlmIChwQWQtPlR4TWl4ZXJHYWluMjRHID49IDIpCi0JewotCQlSRlZhbHVlICY9ICh+MHg3KTsgIC8vIGNsZWFuIGJpdCBbMjowXQotCQlSRlZhbHVlIHw9IHBBZC0+VHhNaXhlckdhaW4yNEc7Ci0JfQotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7Ci0JKi8KLQotCS8vIFJYX0xPMV9lbiwgUkYgUjIwIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMCwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsIFJGVmFsdWUpOwotCi0JLy8gUlhfTE8yX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDMgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JUkZWYWx1ZSAmPSAofjB4MDgpOwotCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0KLQkvKiBhZGQgYnkgam9obmxpLCByZXNldCBSRl9SMjcgd2hlbiBpbnRlcmZhY2UgZG93biAmIHVwIHRvIGZpeCB0aHJvdWdocHV0IHByb2JsZW0qLwotCS8vIExET1JGX1ZDLCBSRiBSMjcgcmVnaXN0ZXIgQml0IDIgdG8gMAotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JLy8gVFggdG8gUlggSVEgZ2xpdGNoKFJGX1IyNykgaGFzIGJlZW4gZml4ZWQgaW4gUlQzMDcwKEYpLgotCS8vIFJhaXNpbmcgUkYgdm9sdGFnZSBpcyBubyBsb25nZXIgbmVlZGVkIGZvciBSVDMwNzAoRikKLQlpZiAoSVNfUlQzMDkwKHBBZCkpCS8vIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JewotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4NzcpKSB8IDB4MzsKLQkJZWxzZQotCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JfQotCS8qIGVuZCBqb2hubGkgKi8KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JTG9hZCBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzB4eExvYWRSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0KLQl7Ci0JCS8vIFJGX0JMT0NLX2VuLiBSRiBSMSByZWdpc3RlciBCaXQgMCB0byAwCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgJj0gKH4weDAxKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCQkvLyBWQ09fSUMsIFJGIFI3IHJlZ2lzdGVyIEJpdCA0ICYgQml0IDUgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgzMCk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwNywgUkZWYWx1ZSk7Ci0KLQkJLy8gSWRvaCwgUkYgUjkgcmVnaXN0ZXIgQml0IDEsIEJpdCAyICYgQml0IDMgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgwRSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOSwgUkZWYWx1ZSk7Ci0KLQkJLy8gUlhfQ1RCX2VuLCBSRiBSMjEgcmVnaXN0ZXIgQml0IDcgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHg4MCk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgUkZWYWx1ZSk7Ci0JfQotCi0JaWYgKElTX1JUMzA5MChwQWQpIHx8CS8vIElTX1JUMzA5MCBpbmNsdWRpbmcgUlQzMDl4IGFuZCBSVDMwNzEvNzIKLQkJSVNfUlQzNTcyKHBBZCkgfHwKLQkJKElTX1JUMzA3MChwQWQpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIwMSkpKQotCXsKLQkJewotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsICZSRlZhbHVlKTsKLQkJCVJGVmFsdWUgfD0gMHg3NzsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgUkZWYWx1ZSk7Ci0JCX0KLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIExET19DRkcwLCAmTUFDVmFsdWUpOwotCQlNQUNWYWx1ZSB8PSAweDFEMDAwMDAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JUmV2ZXJzZSBSRiBzbGVlcC1tb2RlIHNldHVwCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUMzB4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSIFJGVmFsdWU7Ci0JVUlOVDMyIE1BQ1ZhbHVlOwotCi0JewotCQkvLyBSRl9CTE9DS19lbiwgUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlIHw9IDB4MDE7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkJLy8gVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDMwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCS8vIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDBFOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOwotCi0JCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDgwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCX0KLQotCWlmIChJU19SVDMwOTAocEFkKSB8fAkvLyBJU19SVDMwOTAgaW5jbHVkaW5nIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JCUlTX1JUMzU3MihwQWQpIHx8Ci0JCUlTX1JUMzM5MChwQWQpIHx8Ci0JCShJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkKLQl7Ci0JCXsKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7Ci0JCQllbHNlCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSk7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCQl9Ci0KLQkJLy8gUlQzMDcxIHZlcnNpb24gRSBoYXMgZml4ZWQgdGhpcyBpc3N1ZQotCQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpICYmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkpCi0JCXsKLQkJCS8vIHBhdGNoIHR4IEVWTSBpc3N1ZSB0ZW1wb3JhcmlseQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwRDAwMDAwMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJCU1BQ1ZhbHVlID0gKChNQUNWYWx1ZSAmIDB4RTBGRkZGRkYpIHwgMHgwMTAwMDAwMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBMRE9fQ0ZHMCwgTUFDVmFsdWUpOwotCQl9Ci0JfQotCi0JaWYoSVNfUlQzNTcyKHBBZCkpCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwOCwgMHg4MCk7Ci19Ci0vLyBlbmQgam9obmxpCi0KLVZPSUQgUlQzMHh4SGFsdEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJCVR4UGluQ2ZnID0gMHgwMDA1MEYwRjsKLQotCS8vCi0JLy8gVHVybiBvZmYgTE5BX1BFIG9yIFRSU1dfUE9MCi0JLy8KLQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlpZiAoKElTX1JUMzA3MShwQWQpIHx8IElTX1JUMzU3MihwQWQpKQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCQkJJiYgKHBBZC0+YlVzZUVmdXNlKQotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkJGMEYwOyAvLyBiaXQxOCBvZmYKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYwRjA7Ci0JCX0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0JfQotfQotCi0jZW5kaWYgLy8gUlQzMHh4IC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM3MC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzNzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlY2IwNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NoaXBzL3J0MzM3MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnQzMzcwLmMKLQotCUFic3RyYWN0OgotCVNwZWNpZmljIGZ1bmNpdG9ucyBhbmQgdmFyaWFibGVzIGZvciBSVDMweHguCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2lmZGVmIFJUMzM3MAotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLSNlcnJvciAiWW91IFNob3VsZCBFbmFibGUgY29tcGlsZSBmbGFnIFJUTVBfUkZfUldfU1VQUE9SVCBmb3IgdGhpcyBjaGlwIgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0KLVZPSUQgTklDSW5pdFJUMzM3MFJGUmVnaXN0ZXJzKElOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCQlJTlQgaTsKLQkvLyBEcml2ZXIgbXVzdCByZWFkIEVFUFJPTSB0byBnZXQgUmZJY1R5cGUgYmVmb3JlIGluaXRpYWwgUkYgcmVnaXN0ZXJzCi0JLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JaWYgKElTX1JUMzA5MChwQWQpfHxJU19SVDMzOTAocEFkKXx8SVNfUlQzNTcyKHBBZCkpCi0JewotCQkvLyBJbml0IFJGIGNhbGlicmF0aW9uCi0JCS8vIERyaXZlciBzaG91bGQgdG9nZ2xlIFJGIFIzMCBiaXQ3IGJlZm9yZSBpbml0IFJGIHJlZ2lzdGVycwotCQlVSU5UMzIgUmZSZWcgPSAwLCBkYXRhOwotCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoUFVDSEFSKSZSZlJlZyk7Ci0JCVJmUmVnIHw9IDB4ODA7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJUmZSZWcgJj0gMHg3RjsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMwLCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vIGluaXQgUjI0LCBSMzEKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCAweDBGKTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjMxLCAweDBGKTsKLQotCQlpZiAoSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCS8vIHBhdGNoIExOQV9QRV9HMSBmYWlsZWQgaXNzdWUKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJCWRhdGEgJj0gfigweDIwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fU1dJVENILCBkYXRhKTsKLQotCQkJLy8gUkYgcmVnaXN0ZXJzIGluaXRpYWxpemF0aW9uCi0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNU19PVkVSX1JUMzM5MDsgaSsrKQotCQkJewotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGUmVnVGFibGVPdmVyUlQzMzkwW2ldLlJlZ2lzdGVyLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5WYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19TV0lUQ0gsICZkYXRhKTsKLQkJZGF0YSAmPSB+KDB4MjApOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUkZfUkVHX1BBUk1TX09WRVJfUlQzMzkwOyBpKyspCi0JCXsKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJUMzB4eF9SRlJlZ1RhYmxlW2ldLlJlZ2lzdGVyLCBSVDMweHhfUkZSZWdUYWJsZVtpXS5WYWx1ZSk7Ci0JCX0KLQotCQkvLyBEcml2ZXIgc2hvdWxkIHNldCBSRiBSNiBiaXQ2IG9uIGJlZm9yZSBjYWxpYnJhdGlvbgotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUmZSZWcpOwotCQlSZlJlZyB8PSAweDQwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChVQ0hBUilSZlJlZyk7Ci0KLQkJLy9Gb3IgUkYgZmlsdGVyIENhbGlicmF0aW9uCi0JCVJUTVBGaWx0ZXJDYWxpYnJhdGlvbihwQWQpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgUjI3IHJlZ2lzdGVyLCBzZXQgUkYgUjI3IG11c3QgYmUgYmVoaW5kIFJUTVBGaWx0ZXJDYWxpYnJhdGlvbigpCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgMHgzKTsKLQotCQkvLyBzZXQgbGVkIG9wZW4gZHJhaW4gZW5hYmxlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgT1BUXzE0LCAmZGF0YSk7Ci0JCWRhdGEgfD0gMHgwMTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgT1BUXzE0LCBkYXRhKTsKLQotCQkvLyBzZXQgZGVmYXVsdCBhbnRlbm5hIGFzIG1haW4KLQkJaWYgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKQotCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0KLQkJLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAsIGxvYWQgUkYgbm9ybWFsIG9wZXJhdGlvbi1tb2RlIHNldHVwCi0JCVJUMzB4eExvYWRSRk5vcm1hbE1vZGVTZXR1cChwQWQpOwotCX0KLQotfQotI2VuZGlmIC8vIFJUMzA3MCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzOTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzMzkwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWQ5ZTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzOTAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0MzM5MC5jCi0KLQlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMHh4LgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZmRlZiBSVDMzOTAKLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0jZXJyb3IgIllvdSBTaG91bGQgRW5hYmxlIGNvbXBpbGUgZmxhZyBSVE1QX1JGX1JXX1NVUFBPUlQgZm9yIHRoaXMgY2hpcCIKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotCi1WT0lEIE5JQ0luaXRSVDMzOTBSRlJlZ2lzdGVycyhJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkJSU5UIGk7Ci0JLy8gRHJpdmVyIG11c3QgcmVhZCBFRVBST00gdG8gZ2V0IFJmSWNUeXBlIGJlZm9yZSBpbml0aWFsIFJGIHJlZ2lzdGVycwotCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWlmIChJU19SVDMwOTAocEFkKXx8SVNfUlQzMzkwKHBBZCl8fElTX1JUMzU3MihwQWQpKQotCXsKLQkJLy8gSW5pdCBSRiBjYWxpYnJhdGlvbgotCQkvLyBEcml2ZXIgc2hvdWxkIHRvZ2dsZSBSRiBSMzAgYml0NyBiZWZvcmUgaW5pdCBSRiByZWdpc3RlcnMKLQkJVUlOVDMyIFJmUmVnID0gMCwgZGF0YTsKLQotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFBVQ0hBUikmUmZSZWcpOwotCQlSZlJlZyB8PSAweDgwOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzAsIChVQ0hBUilSZlJlZyk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCVJmUmVnICY9IDB4N0Y7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMCwgKFVDSEFSKVJmUmVnKTsKLQotCQkvLyBpbml0IFIyNCwgUjMxCi0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgMHgwRik7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgMHgwRik7Ci0KLQkJaWYgKElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQkvLyBwYXRjaCBMTkFfUEVfRzEgZmFpbGVkIGlzc3VlCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7Ci0JCQlkYXRhICY9IH4oMHgyMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBHUElPX1NXSVRDSCwgZGF0YSk7Ci0KLQkJCS8vIFJGIHJlZ2lzdGVycyBpbml0aWFsaXphdGlvbgotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA7IGkrKykKLQkJCXsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5SZWdpc3RlciwgUkZSZWdUYWJsZU92ZXJSVDMzOTBbaV0uVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJLy8gcGF0Y2ggTE5BX1BFX0cxIGZhaWxlZCBpc3N1ZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fU1dJVENILCAmZGF0YSk7Ci0JCWRhdGEgJj0gfigweDIwKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19TV0lUQ0gsIGRhdGEpOwotCi0JCS8vIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JGX1JFR19QQVJNU19PVkVSX1JUMzM5MDsgaSsrKQotCQl7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtpXS5SZWdpc3RlciwgUkZSZWdUYWJsZU92ZXJSVDMzOTBbaV0uVmFsdWUpOwotCQl9Ci0KLQkJLy8gRHJpdmVyIHNob3VsZCBzZXQgUkYgUjYgYml0NiBvbiBiZWZvcmUgY2FsaWJyYXRpb24KLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsIChQVUNIQVIpJlJmUmVnKTsKLQkJUmZSZWcgfD0gMHg0MDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCAoVUNIQVIpUmZSZWcpOwotCi0JCS8vRm9yIFJGIGZpbHRlciBDYWxpYnJhdGlvbgotCQlSVE1QRmlsdGVyQ2FsaWJyYXRpb24ocEFkKTsKLQotCQkvLyBJbml0aWFsaXplIFJGIFIyNyByZWdpc3Rlciwgc2V0IFJGIFIyNyBtdXN0IGJlIGJlaGluZCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oKQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpCi0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIDB4Myk7Ci0KLQkJLy8gc2V0IGxlZCBvcGVuIGRyYWluIGVuYWJsZQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE9QVF8xNCwgJmRhdGEpOwotCQlkYXRhIHw9IDB4MDE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9QVF8xNCwgZGF0YSk7Ci0KLQkJLy8gc2V0IGRlZmF1bHQgYW50ZW5uYSBhcyBtYWluCi0JCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkKLQkJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotCi0JCS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwLCBsb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCQlSVDMzeHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAocEFkKTsKLQl9Ci0KLX0KLQotI2VuZGlmIC8vIFJUMzM5MCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzeHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY2hpcHMvcnQzM3h4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZjM3NmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGlwcy9ydDMzeHguYworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0MzN4eC5jCi0KLQlBYnN0cmFjdDoKLQlTcGVjaWZpYyBmdW5jaXRvbnMgYW5kIHZhcmlhYmxlcyBmb3IgUlQzMHh4LgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotI2lmZGVmIFJUMzN4eAotCi0KLSNpZm5kZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0jZXJyb3IgIllvdSBTaG91bGQgRW5hYmxlIGNvbXBpbGUgZmxhZyBSVE1QX1JGX1JXX1NVUFBPUlQgZm9yIHRoaXMgY2hpcCIKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8vCi0vLyBSRiByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKLS8vCi1SRUdfUEFJUiBSRlJlZ1RhYmxlT3ZlclJUMzM5MFtdID0gewotCXtSRl9SMDAsCQkweEEwfSwKLQl7UkZfUjAxLAkJMHhFMX0sCi0Je1JGX1IwMiwJCTB4RjF9LAotCXtSRl9SMDMsCQkweDYyfSwKLQl7UkZfUjA0LAkJMHg0MH0sCi0Je1JGX1IwNSwJCTB4OEJ9LAotCXtSRl9SMDYsCQkweDQyfSwKLQl7UkZfUjA3LAkJMHgzNH0sCi0Je1JGX1IwOCwJCTB4MDB9LCAvLyBSZWFkIG9ubHkKLQl7UkZfUjA5LAkJMHhDMH0sCi0KLQl7UkZfUjEwLAkJMHg2MX0sCi0Je1JGX1IxMSwJCTB4MjF9LAotCXtSRl9SMTIsCQkweDNCfSwKLQl7UkZfUjEzLAkJMHhFMH0sCi0Je1JGX1IxNCwJCTB4OTB9LAotCXtSRl9SMTUsCQkweDUzfSwKLQl7UkZfUjE2LAkJMHgwRX0sCi0Je1JGX1IxNywJCTB4OTR9LAotCXtSRl9SMTgsCQkweDVDfSwKLQl7UkZfUjE5LAkJMHg0QX0sCi0KLQl7UkZfUjIwLAkJMHhCMn0sCi0Je1JGX1IyMSwJCTB4RjZ9LAotCXtSRl9SMjIsCQkweDAwfSwKLQl7UkZfUjIzLAkJMHgxNH0sCi0Je1JGX1IyNCwJCTB4MDh9LAotCXtSRl9SMjUsCQkweDNEfSwKLQl7UkZfUjI2LAkJMHg4NX0sCi0Je1JGX1IyNywJCTB4MDB9LAotCXtSRl9SMjgsCQkweDQxfSwKLQl7UkZfUjI5LAkJMHg4Rn0sCi0Je1JGX1IzMCwJCTB4MjB9LAotCXtSRl9SMzEsCQkweDBGfSwKLX07Ci0KLVVDSEFSIE5VTV9SRl9SRUdfUEFSTVNfT1ZFUl9SVDMzOTA9KHNpemVvZihSRlJlZ1RhYmxlT3ZlclJUMzM5MCkgLyBzaXplb2YoUkVHX1BBSVIpKTsKLQotCi0KLS8vIEFudGVubmEgZGl2ZXNpdHkgdXNlIEdQSU8zIGFuZCBFRVNLIHBpbiBmb3IgY29udHJvbAotLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLS8vIFRoZXJlZm9yIHdlIHNob3VsZCBhdm9pZCBhY2Nlc3NpbmcgRUVTSyBhdCB0aGUgc2FtZSB0aW1lCi0vLyBUaGVuIHJlc3RvcmUgYW50ZW5uYSBhZnRlciBFRVBST00gYWNjZXNzCi0vLyBUaGUgb3JpZ2luYWwgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIEFzaWNTZXRSeEFudCgpLCBub3cgY2hhbmdlIHRvCi0vL1ZPSUQgQXNpY1NldFJ4QW50KAotCi1WT0lEIFJUMzN4eFNldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KQotewotCVVJTlQzMglWYWx1ZTsKLQlVSU5UMzIJeDsKLQotCWlmICgocEFkLT5FZXByb21BY2Nlc3MpIHx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQl8fAotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpIHx8Ci0JCShSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vIHRoZSBhbnRlbm5hIHNlbGVjdGlvbiBpcyB0aHJvdWdoIGZpcm13YXJlIGFuZCBNQUMgcmVnaXN0ZXIoR1BJTzMpCi0JaWYgKEFudCA9PSAwKQotCXsKLQkJLy8gTWFpbiBhbnRlbm5hCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCQl4IHw9IChFRVNLKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDB4MDgwOCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEdQSU9fQ1RSTF9DRkcsIFZhbHVlKTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNTZXRSeEFudCwgc3dpdGNoIHRvIG1haW4gYW50ZW5uYVxuIikpOwotCX0KLQllbHNlCi0JewotCQkvLyBBdXggYW50ZW5uYQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQkJeCAmPSB+KEVFU0spOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMHgwODA4KTsKLQkJVmFsdWUgfD0gMHgwODsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgR1BJT19DVFJMX0NGRywgVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1NldFJ4QW50LCBzd2l0Y2ggdG8gYXV4IGFudGVubmFcbiIpKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUZvciBSRiBmaWx0ZXIgY2FsaWJyYXRpb24gcHVycG9zZQotCi0JQXJndW1lbnRzOgotCQlwQWQgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUEZpbHRlckNhbGlicmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSCVI1NXggPSAwLCB2YWx1ZSwgRmlsdGVyVGFyZ2V0ID0gMHgxRSwgQkJQVmFsdWU9MDsKLQlVSU5UCWxvb3AgPSAwLCBjb3VudCA9IDAsIGxvb3BjbnQgPSAwLCBSZVRyeSA9IDA7Ci0JVUNIQVIJUkZfUjI0X1ZhbHVlID0gMDsKLQotCS8vIEdpdmUgYmJwIGZpbHRlciBpbml0aWFsIHZhbHVlCi0JcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQgPSAweDFGOwotCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gMHgyRjsgLy9CaXRbNV0gbXVzdCBiZSAxIGZvciBCVyA0MAotCi0JZG8KLQl7Ci0JCWlmIChsb29wID09IDEpCS8vQmFuZFdpZHRoID0gNDAgTUh6Ci0JCXsKLQkJCS8vIFdyaXRlIDB4MjcgdG8gUkZfUjI0IHRvIHByb2dyYW0gZmlsdGVyCi0JCQlSRl9SMjRfVmFsdWUgPSAweDI3OwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRl9SMjRfVmFsdWUpOwotCQkJaWYgKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpfHwgSVNfUlQzMzkwKHBBZCkpCi0JCQkJRmlsdGVyVGFyZ2V0ID0gMHgxNTsKLQkJCWVsc2UKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDE5OwotCi0JCQkvLyB3aGVuIGNhbGlicmF0ZSBCVzQwLCBCQlAgbWFzayBtdXN0IHNldCB0byBCVzQwLgotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MTgpOwotCQkJQkJQVmFsdWV8PSAoMHgxMCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0KLQkJCS8vIHNldCB0byBCVzQwCi0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKLQkJCXZhbHVlIHw9IDB4MjA7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKLQkJfQotCQllbHNlCQkJLy9CYW5kV2lkdGggPSAyMCBNSHoKLQkJewotCQkJLy8gV3JpdGUgMHgwNyB0byBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJGX1IyNF9WYWx1ZSA9IDB4MDc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0JCQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fCBJU19SVDMzOTAocEFkKSkKLQkJCQlGaWx0ZXJUYXJnZXQgPSAweDEzOwotCQkJZWxzZQotCQkJCUZpbHRlclRhcmdldCA9IDB4MTY7Ci0KLQkJCS8vIHNldCB0byBCVzIwCi0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IzMSwgJnZhbHVlKTsKLQkJCXZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIHZhbHVlKTsKLQkJfQotCi0JCS8vIFdyaXRlIDB4MDEgdG8gUkZfUjIyIHRvIGVuYWJsZSBiYXNlYmFuZCBsb29wYmFjayBtb2RlCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCAmdmFsdWUpOwotCQl2YWx1ZSB8PSAweDAxOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjIsIHZhbHVlKTsKLQotCQkvLyBXcml0ZSAweDAwIHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHBhc3NiYW5kIHRlc3QgdG9uZQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMCk7Ci0KLQkJZG8KLQkJewotCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjUsIDB4OTApOwotCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQkJLy8gUmVhZCBCQlBfUjU1WzY6MF0gZm9yIHJlY2VpdmVkIHBvd2VyLCBzZXQgUjU1eCA9IEJCUF9SNTVbNjowXQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I1NSwgJnZhbHVlKTsKLQkJCVI1NXggPSB2YWx1ZSAmIDB4RkY7Ci0KLQkJfSB3aGlsZSAoKFJlVHJ5KysgPCAxMDApICYmIChSNTV4ID09IDApKTsKLQotCQkvLyBXcml0ZSAweDA2IHRvIEJCUF9SMjQgdG8gc2V0IHBvd2VyICYgZnJlcXVlbmN5IG9mIHN0b3BiYW5kIHRlc3QgdG9uZQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyNCwgMHgwNik7Ci0KLQkJd2hpbGUoVFJVRSkKLQkJewotCQkJLy8gV3JpdGUgMHg5MCB0byBCQlBfUjI1IHRvIHRyYW5zbWl0IHRlc3QgdG9uZQotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjUsIDB4OTApOwotCi0JCQkvL1dlIG5lZWQgdG8gd2FpdCBmb3IgY2FsaWJyYXRpb24KLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjU1LCAmdmFsdWUpOwotCQkJdmFsdWUgJj0gMHhGRjsKLQkJCWlmICgoUjU1eCAtIHZhbHVlKSA8IEZpbHRlclRhcmdldCkKLQkJCXsKLQkJCQlSRl9SMjRfVmFsdWUgKys7Ci0JCQl9Ci0JCQllbHNlIGlmICgoUjU1eCAtIHZhbHVlKSA9PSBGaWx0ZXJUYXJnZXQpCi0JCQl7Ci0JCQkJUkZfUjI0X1ZhbHVlICsrOwotCQkJCWNvdW50ICsrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBwcmV2ZW50IGluZmluaXRlIGxvb3AgY2F1c2UgZHJpdmVyIGhhbmcuCi0JCQlpZiAobG9vcGNudCsrID4gMTAwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBGaWx0ZXJDYWxpYnJhdGlvbiAtIGNhbid0IGZpbmQgYSB2YWxpZCB2YWx1ZSwgbG9vcGNudD0lZCBzdG9wIGNhbGlicmF0aW5nIiwgbG9vcGNudCkpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBXcml0ZSBSRl9SMjQgdG8gcHJvZ3JhbSBmaWx0ZXIKLQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyNCwgUkZfUjI0X1ZhbHVlKTsKLQkJfQotCi0JCWlmIChjb3VudCA+IDApCi0JCXsKLQkJCVJGX1IyNF9WYWx1ZSA9IFJGX1IyNF9WYWx1ZSAtICgoY291bnQpID8gKDEpIDogKDApKTsKLQkJfQotCi0JCS8vIFN0b3JlIGZvciBmdXR1cmUgdXNhZ2UKLQkJaWYgKGxvb3BjbnQgPCAxMDApCi0JCXsKLQkJCWlmIChsb29wKysgPT0gMCkKLQkJCXsKLQkJCQkvL0JhbmRXaWR0aCA9IDIwIE1IegotCQkJCXBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0ID0gKFVDSEFSKVJGX1IyNF9WYWx1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvL0JhbmRXaWR0aCA9IDQwIE1IegotCQkJCXBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0ID0gKFVDSEFSKVJGX1IyNF9WYWx1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlicmVhazsKLQotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjQsIFJGX1IyNF9WYWx1ZSk7Ci0KLQkJLy8gcmVzZXQgY291bnQKLQkJY291bnQgPSAwOwotCX0gd2hpbGUoVFJVRSk7Ci0KLQkvLwotCS8vIFNldCBiYWNrIHRvIGluaXRpYWwgc3RhdGUKLQkvLwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAwKTsKLQotCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCAmdmFsdWUpOwotCXZhbHVlICY9IH4oMHgwMSk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIyLCB2YWx1ZSk7Ci0KLQkvLyBzZXQgQkJQIGJhY2sgdG8gQlcyMAotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQlCQlBWYWx1ZSY9ICh+MHgxOCk7Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEZpbHRlckNhbGlicmF0aW9uIC0gQ2FsaUJXMjBSZlIyND0weCV4LCBDYWxpQlc0MFJmUjI0PTB4JXhcbiIsIHBBZC0+TWxtZS5DYWxpQlcyMFJmUjI0LCBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNCkpOwotfQotCi0KLS8vIGFkZCBieSBqb2hubGksIFJGIHBvd2VyIHNlcXVlbmNlIHNldHVwCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlMb2FkIFJGIG5vcm1hbCBvcGVyYXRpb24tbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMzeHhMb2FkUkZOb3JtYWxNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIgUkZWYWx1ZTsKLQotCS8vIFJYMF9QRCAmIFRYMF9QRCwgUkYgUjEgcmVnaXN0ZXIgQml0IDIgJiBCaXQgMyB0byAwIGFuZCBSRl9CTE9DS19lbixSWDFfUEQgJiBUWDFfUEQsIEJpdDAsIEJpdCA0ICYgQml0NSB0byAxCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQlSRlZhbHVlID0gKFJGVmFsdWUgJiAofjB4MEMpKSB8IDB4MzE7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjAxLCBSRlZhbHVlKTsKLQotCS8vIFRYX0xPMl9lbiwgUkYgUjE1IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxNSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTUsIFJGVmFsdWUpOwotCi0JLyogbW92ZSB0byBOSUNJbml0UlQzMHh4UkZSZWdpc3RlcnMKLQkvLyBUWF9MTzFfZW4sIFJGIFIxNyByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JLy8gdG8gZml4IHJ4IGxvbmcgcmFuZ2UgaXNzdWUKLQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID49IDB4MDIxMSkgJiYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcgPT0gMCkpCi0JewotCQlSRlZhbHVlIHw9IDB4MjA7Ci0JfQotCS8vIHNldCBSRl9SMTdfYml0WzI6MF0gZXF1YWwgdG8gRUVQUk9NIHNldHRpbmcgYXQgMHg0OGgKLQlpZiAocEFkLT5UeE1peGVyR2FpbjI0RyA+PSAyKQotCXsKLQkJUkZWYWx1ZSAmPSAofjB4Nyk7ICAvLyBjbGVhbiBiaXQgWzI6MF0KLQkJUkZWYWx1ZSB8PSBwQWQtPlR4TWl4ZXJHYWluMjRHOwotCX0KLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsIFJGVmFsdWUpOwotCSovCi0KLQkvLyBSWF9MTzFfZW4sIFJGIFIyMCByZWdpc3RlciBCaXQgMyB0byAwCi0JUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjAsICZSRlZhbHVlKTsKLQlSRlZhbHVlICY9ICh+MHgwOCk7Ci0JUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIwLCBSRlZhbHVlKTsKLQotCS8vIFJYX0xPMl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyMSwgJlJGVmFsdWUpOwotCVJGVmFsdWUgJj0gKH4weDA4KTsKLQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCi0JLyogYWRkIGJ5IGpvaG5saSwgcmVzZXQgUkZfUjI3IHdoZW4gaW50ZXJmYWNlIGRvd24gJiB1cCB0byBmaXggdGhyb3VnaHB1dCBwcm9ibGVtKi8KLQkvLyBMRE9SRl9WQywgUkYgUjI3IHJlZ2lzdGVyIEJpdCAyIHRvIDAKLQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCS8vIFRYIHRvIFJYIElRIGdsaXRjaChSRl9SMjcpIGhhcyBiZWVuIGZpeGVkIGluIFJUMzA3MChGKS4KLQkvLyBSYWlzaW5nIFJGIHZvbHRhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZCBmb3IgUlQzMDcwKEYpCi0JaWYgKElTX1JUMzA5MChwQWQpKQkvLyBSVDMwOXggYW5kIFJUMzA3MS83MgotCXsKLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgKH4weDc3KSkgfCAweDM7Ci0JCWVsc2UKLQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCX0KLQkvKiBlbmQgam9obmxpICovCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUxvYWQgUkYgc2xlZXAtbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMzeHhMb2FkUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCVVJTlQzMiBNQUNWYWx1ZTsKLQotCi0JewotCQkvLyBSRl9CTE9DS19lbi4gUkYgUjEgcmVnaXN0ZXIgQml0IDAgdG8gMAotCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgJlJGVmFsdWUpOwotCQlSRlZhbHVlICY9ICh+MHgwMSk7Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkJLy8gVkNPX0lDLCBSRiBSNyByZWdpc3RlciBCaXQgNCAmIEJpdCA1IHRvIDAKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSAmPSAofjB4MzApOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDcsIFJGVmFsdWUpOwotCi0JCS8vIElkb2gsIFJGIFI5IHJlZ2lzdGVyIEJpdCAxLCBCaXQgMiAmIEJpdCAzIHRvIDAKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDksICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSAmPSAofjB4MEUpOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDksIFJGVmFsdWUpOwotCi0JCS8vIFJYX0NUQl9lbiwgUkYgUjIxIHJlZ2lzdGVyIEJpdCA3IHRvIDAKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSAmPSAofjB4ODApOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjEsIFJGVmFsdWUpOwotCX0KLQotCWlmIChJU19SVDMwOTAocEFkKSB8fAkvLyBJU19SVDMwOTAgaW5jbHVkaW5nIFJUMzA5eCBhbmQgUlQzMDcxLzcyCi0JCUlTX1JUMzU3MihwQWQpIHx8Ci0JCUlTX1JUMzM5MChwQWQpIHx8Ci0JCShJU19SVDMwNzAocEFkKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKSkKLQl7Ci0JCXsKLQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCAmUkZWYWx1ZSk7Ci0JCQlSRlZhbHVlIHw9IDB4Nzc7Ci0JCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMjcsIFJGVmFsdWUpOwotCQl9Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBMRE9fQ0ZHMCwgJk1BQ1ZhbHVlKTsKLQkJTUFDVmFsdWUgfD0gMHgxRDAwMDAwMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCVJldmVyc2UgUkYgc2xlZXAtbW9kZSBzZXR1cAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSVDMzeHhSZXZlcnNlUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUiBSRlZhbHVlOwotCVVJTlQzMiBNQUNWYWx1ZTsKLQotCXsKLQkJLy8gUkZfQkxPQ0tfZW4sIFJGIFIxIHJlZ2lzdGVyIEJpdCAwIHRvIDEKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSB8PSAweDAxOwotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsIFJGVmFsdWUpOwotCi0JCS8vIFZDT19JQywgUkYgUjcgcmVnaXN0ZXIgQml0IDQgJiBCaXQgNSB0byAxCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgfD0gMHgzMDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKLQotCQkvLyBJZG9oLCBSRiBSOSByZWdpc3RlciBCaXQgMSwgQml0IDIgJiBCaXQgMyB0byAxCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgfD0gMHgwRTsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA5LCBSRlZhbHVlKTsKLQotCQkvLyBSWF9DVEJfZW4sIFJGIFIyMSByZWdpc3RlciBCaXQgNyB0byAxCi0JCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCAmUkZWYWx1ZSk7Ci0JCVJGVmFsdWUgfD0gMHg4MDsKLQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjIxLCBSRlZhbHVlKTsKLQl9Ci0KLQlpZiAoSVNfUlQzMDkwKHBBZCkgfHwJLy8gSVNfUlQzMDkwIGluY2x1ZGluZyBSVDMwOXggYW5kIFJUMzA3MS83MgotCQlJU19SVDM1NzIocEFkKSB8fAotCQlJU19SVDMzOTAocEFkKSB8fAotCQkoSVNfUlQzMDcwKHBBZCkgJiYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjAxKSkpCi0JewotCQl7Ci0JCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IyNywgJlJGVmFsdWUpOwotCQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpIDwgMHgwMjExKQotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpIHwgMHgzOwotCQkJZWxzZQotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmICh+MHg3NykpOwotCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI3LCBSRlZhbHVlKTsKLQkJfQotCi0JCS8vIFJUMzA3MSB2ZXJzaW9uIEUgaGFzIGZpeGVkIHRoaXMgaXNzdWUKLQkJaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuREFDVGVzdEJpdCA9PSAxKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMTEpKQotCQl7Ci0JCQkvLyBwYXRjaCB0eCBFVk0gaXNzdWUgdGVtcG9yYXJpbHkKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSA9ICgoTUFDVmFsdWUgJiAweEUwRkZGRkZGKSB8IDB4MEQwMDAwMDApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTERPX0NGRzAsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSA9ICgoTUFDVmFsdWUgJiAweEUwRkZGRkZGKSB8IDB4MDEwMDAwMDApOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTERPX0NGRzAsIE1BQ1ZhbHVlKTsKLQkJfQotCX0KLQotCWlmKElTX1JUMzU3MihwQWQpKQotCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDgsIDB4ODApOwotfQotLy8gZW5kIGpvaG5saQotCi1WT0lEIFJUMzN4eEhhbHRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDMyCQlUeFBpbkNmZyA9IDB4MDAwNTBGMEY7Ci0KLQkvLwotCS8vIFR1cm4gb2ZmIExOQV9QRSBvciBUUlNXX1BPTAotCS8vCi0JaWYgKElTX1JUMzA3MChwQWQpIHx8IElTX1JUMzA3MShwQWQpIHx8IElTX1JUMzM5MChwQWQpfHxJU19SVDM1NzIocEFkKSkKLQl7Ci0JLy9LSD8gQm90aCBzdXBwb3J0IDMzOTAgdXNiIGFuZCAgUENJCi0JCWlmICgoSVNfUlQzMDcxKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCl8fElTX1JUMzM5MChwQWQpKQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCQkJJiYgKHBBZC0+YlVzZUVmdXNlKQotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotCQkJKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkJGMEYwOyAvLyBiaXQxOCBvZmYKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYwRjA7Ci0JCX0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0JfQotfQotCi0jZW5kaWYgLy8gUlQzMHh4IC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NobGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jaGxpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzY2I0Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NobGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgY2hsaXN0LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkgV3UgICAyMDA3LTEyLTE5ICAgIGNyZWF0ZWQKLSovCi0KLSNpZm5kZWYgX19DSExJU1RfSF9fCi0jZGVmaW5lIF9fQ0hMSVNUX0hfXwotCi0jaW5jbHVkZSAicnRtcF90eXBlLmgiCi0jaW5jbHVkZSAicnRtcF9kZWYuaCIKLQotCi0jZGVmaW5lIE9ET1IJCQkwCi0jZGVmaW5lIElET1IJCQkxCi0jZGVmaW5lIEJPVEgJCQkyCi0KLSNkZWZpbmUgQkFORF81RyAgICAgICAgIDAKLSNkZWZpbmUgQkFORF8yNEcgICAgICAgIDEKLSNkZWZpbmUgQkFORF9CT1RIICAgICAgIDIKLQotdHlwZWRlZiBzdHJ1Y3QgX0NIX0RFU1AgewotCVVDSEFSIEZpcnN0Q2hhbm5lbDsKLQlVQ0hBUiBOdW1PZkNoOwotCUNIQVIgTWF4VHhQd3I7CQkJLy8gZEJtCi0JVUNIQVIgR2VvZ3JhcGh5OwkJCS8vIDA6b3V0IGRvb3IsIDE6aW4gZG9vciwgMjpib3RoCi0JQk9PTEVBTiBEZnNSZXE7CQkJLy8gRGZzIHJlcXVpcmUsIDA6IE5vLCAxOiB5ZXMuCi19IENIX0RFU1AsICpQQ0hfREVTUDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0NIX1JFR0lPTiB7Ci0JVUNIQVIgQ291bnRSZWdbM107Ci0JVUNIQVIgRGZzVHlwZTsJCQkvLyAwOiBDRSwgMTogRkNDLCAyOiBKQVAsIDM6SkFQX1c1MywgSkFQX1c1NgotCUNIX0RFU1AgQ2hEZXNwWzEwXTsKLX0gQ0hfUkVHSU9OLCAqUENIX1JFR0lPTjsKLQotZXh0ZXJuIENIX1JFR0lPTiBDaFJlZ2lvbltdOwotCi10eXBlZGVmIHN0cnVjdCBfQ0hfRlJFUV9NQVBfewotCVVJTlQxNgkJY2hhbm5lbDsKLQlVSU5UMTYJCWZyZXFLSHo7Ci19Q0hfRlJFUV9NQVA7Ci0KLWV4dGVybiBDSF9GUkVRX01BUCBDSF9IWl9JRF9NQVBbXTsKLWV4dGVybiBpbnQgQ0hfSFpfSURfTUFQX05VTTsKLQotCi0jZGVmaW5lICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFooX2NoLCBfa2h6KQkJCQkJXAotCQlkb3sJCQkJCQkJCQkJCQkJXAotCQkJaW50IF9jaElkeDsJCQkJCQkJCQkJCVwKLQkJCWZvciAoX2NoSWR4ID0gMDsgX2NoSWR4IDwgQ0hfSFpfSURfTUFQX05VTTsgX2NoSWR4KyspXAotCQkJewkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKChfY2gpID09IENIX0haX0lEX01BUFtfY2hJZHhdLmNoYW5uZWwpCQkJXAotCQkJCXsJCQkJCQkJCQkJCQlcCi0JCQkJCShfa2h6KSA9IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHogKiAxMDAwOwlcCi0JCQkJCWJyZWFrOwkJCQkJCQkJCQlcCi0JCQkJfQkJCQkJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJXAotCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCQkJXAotCQkJCShfa2h6KSA9IDI0MTIwMDA7CQkJCQkJCQkJXAotICAgICAgICAgICAgfXdoaWxlKDApCi0KLSNkZWZpbmUgICAgIE1BUF9LSFpfVE9fQ0hBTk5FTF9JRChfa2h6LCBfY2gpICAgICAgICAgICAgICAgICBcCi0JCWRvewkJCQkJCQkJCQkJCQlcCi0JCQlpbnQgX2NoSWR4OwkJCQkJCQkJCQkJXAotCQkJZm9yIChfY2hJZHggPSAwOyBfY2hJZHggPCBDSF9IWl9JRF9NQVBfTlVNOyBfY2hJZHgrKylcCi0JCQl7CQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoKF9raHopID09IENIX0haX0lEX01BUFtfY2hJZHhdLmZyZXFLSHopCQkJXAotCQkJCXsJCQkJCQkJCQkJCQlcCi0JCQkJCShfY2gpID0gQ0hfSFpfSURfTUFQW19jaElkeF0uY2hhbm5lbDsJCQlcCi0JCQkJCWJyZWFrOwkJCQkJCQkJCQlcCi0JCQkJfQkJCQkJCQkJCQkJCVwKLQkJCX0JCQkJCQkJCQkJCQkJXAotCQkJaWYgKF9jaElkeCA9PSBDSF9IWl9JRF9NQVBfTlVNKQkJCQkJXAotCQkJCShfY2gpID0gMTsJCQkJCQkJCQkJCVwKLQkJfXdoaWxlKDApCi0KLQotVk9JRCBCdWlsZENoYW5uZWxMaXN0RXgoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEJ1aWxkQmVhY29uQ2hMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEJ1ZiwKLQlPVVQJUFVMT05HIHBCdWZMZW4pOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIE5fQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBOX1NldENlbkNoKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggY2hhbm5lbCk7Ci0KLSNlbmRpZiAvLyBfX0NITElTVF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlM2IwYTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYWN0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JYWN0aW9uLmMKLQotICAgIEFic3RyYWN0OgotICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUphbiBMZWUJCTIwMDYJCWNyZWF0ZWQgZm9yIHJ0Mjg2MAotICovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLSNpbmNsdWRlICIuLi9hY3Rpb24uaCIKLQotCi1zdGF0aWMgVk9JRCBSZXNlcnZlZEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotICAgIFBhcmFtZXRlcnM6Ci0gICAgICAgIFMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCi0gICAgTm90ZToKLSAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTU09DX0lETEUKLSAgICAgICAgTVQyX01MTUVfRElTQVNTT0NfUkVRICAgIG1sbWVfZGlzYXNzb2NfcmVxX2FjdGlvbgotICAgICAgICBNVDJfUEVFUl9ESVNBU1NPQ19SRVEgICAgcGVlcl9kaXNhc3NvY19hY3Rpb24KLSAgICAgICAgTVQyX1BFRVJfQVNTT0NfUkVRICAgICAgIGRyb3AKLSAgICAgICAgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgIGRyb3AKLSAgICAgICAgTVQyX0NMUzNFUlIgICAgICAgICAgICAgIGNsczNlcnJfYWN0aW9uCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSkKLXsKLQlTdGF0ZU1hY2hpbmVJbml0KFMsIChTVEFURV9NQUNISU5FX0ZVTkMgKilUcmFucywgTUFYX0FDVF9TVEFURSwgTUFYX0FDVF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQUNUX0lETEUsIEFDVF9NQUNISU5FX0JBU0UpOwotCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9TUEVDVFJVTV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJTcGVjdHJ1bUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUU9TQWN0aW9uKTsKLQotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfRExTX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpUmVzZXJ2ZWRBY3Rpb24pOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJETFNBY3Rpb24pOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9CQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCQUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfUEVFUl9IVF9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJIVEFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9BRERfQkFfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQUREQkFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX01MTUVfT1JJX0RFTEJBX0NBVEUsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURFTEJBQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVERUxCQUFjdGlvbik7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9QRUVSX1BVQkxJQ19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJQdWJsaWNBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX1BFRVJfUk1fQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUk1BY3Rpb24pOwotCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFDVF9JRExFLCBNVDJfTUxNRV9RT1NfQ0FURSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUU9TQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQUNUX0lETEUsIE1UMl9NTE1FX0RMU19DQVRFLCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVETFNBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBQ1RfSURMRSwgTVQyX0FDVF9JTlZBTElELCAoU1RBVEVfTUFDSElORV9GVU5DKU1sbWVJbnZhbGlkQWN0aW9uKTsKLQotCi19Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgTWxtZUFEREJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQotewotCU1MTUVfQUREQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JVUNIQVIgICAgICAgICAgIEFkZHJbNl07Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JVUxPTkcJCUlkeDsKLQlGUkFNRV9BRERCQV9SRVEgIEZyYW1lOwotCVVMT05HCQlGcmFtZUxlbjsKLQlCQV9PUklfRU5UUlkJCQkqcEJBRW50cnkgPSBOVUxMOwotCi0JcEluZm8gPSAoTUxNRV9BRERCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOwotCU5kaXNaZXJvTWVtb3J5KCZGcmFtZSwgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpOwotCi0JaWYoTWxtZUFkZEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIpKQotCXsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyAxLiBmaW5kIGVudHJ5Ci0JCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkJBT3JpV2NpZEFycmF5W3BJbmZvLT5USURdOwotCQlpZiAoSWR4ID09IDApCi0JCXsKLQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZUFEREJBQWN0aW9uKCkgY2FuJ3QgZmluZCBCQU9yaUVudHJ5IFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtJZHhdOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJZWxzZQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlZhbGlkQXNEbHMpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBJbmZvLT5wQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwSW5mby0+cEFkZHIpOwotCi0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOwotCQlGcmFtZS5BY3Rpb24gPSBBRERCQV9SRVE7Ci0JCUZyYW1lLkJhUGFybS5BTVNEVVN1cHBvcnRlZCA9IDA7Ci0JCUZyYW1lLkJhUGFybS5CQVBvbGljeSA9IElNTUVEX0JBOwotCQlGcmFtZS5CYVBhcm0uVElEID0gcEluZm8tPlRJRDsKLQkJRnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBwSW5mby0+QmFCdWZTaXplOwotCQlGcmFtZS5Ub2tlbiA9IHBJbmZvLT5Ub2tlbjsKLQkJRnJhbWUuVGltZU91dFZhbHVlID0gcEluZm8tPlRpbWVPdXRWYWx1ZTsKLQkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5GcmFnTnVtID0gMDsKLQkJRnJhbWUuQmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLlR4U2VxW3BJbmZvLT5USURdOwotCi0JCSooVVNIT1JUICopKCZGcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkJhUGFybSkpOwotCQlGcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihGcmFtZS5UaW1lT3V0VmFsdWUpOwotCQlGcmFtZS5CYVN0YXJ0U2VxLndvcmQgPSBjcHUybGUxNihGcmFtZS5CYVN0YXJ0U2VxLndvcmQpOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSksICZGcmFtZSwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAoTUdNVF9VU0VfUVVFVUVfRkxBRyB8IE1hcFVzZXJQcmlvcml0eVRvQWNjZXNzQ2F0ZWdvcnlbcEluZm8tPlRJRF0pLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0KLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQSAtIFNlbmQgQUREQkEgcmVxdWVzdC4gU3RhcnRTZXEgPSAleCwgIEZyYW1lTGVuID0gJWxkLiBCdWZTaXplID0gJWRcbiIsIEZyYW1lLkJhU3RhcnRTZXEuZmllbGQuU3RhcnRTZXEsIEZyYW1lTGVuLCBGcmFtZS5CYVBhcm0uQnVmU2l6ZSkpOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBzZW5kIERFTEJBIGFuZCBkZWxldGUgQmFFbnRyeSBpZiBhbnkKLSAgICBQYXJhbWV0cnM6Ci0gICAgICAgIEVsZW0gLSBNTE1FIG1lc3NhZ2UgTUxNRV9ERUxCQV9SRVFfU1RSVUNUCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZURFTEJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgKnBJbmZvOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVBVQ0hBUgkJICAgcE91dEJ1ZmZlcjIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCVVMT05HCQlJZHg7Ci0JRlJBTUVfREVMQkFfUkVRICBGcmFtZTsKLQlVTE9ORwkJRnJhbWVMZW47Ci0JRlJBTUVfQkFSCUZyYW1lQmFyOwotCi0JcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopRWxlbS0+TXNnOwotCS8vIG11c3Qgc2VuZCBiYWNrIERFTEJBCi0JTmRpc1plcm9NZW1vcnkoJkZyYW1lLCBzaXplb2YoRlJBTUVfREVMQkFfUkVRKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVERUxCQUFjdGlvbigpLCBJbml0aWF0b3IoJWQpIFxuIiwgcEluZm8tPkluaXRpYXRvcikpOwotCi0JaWYoTWxtZURlbEJBUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKQotCXsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCAxLiBcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcjIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJCQSAtIE1sbWVERUxCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgMi4gXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBTRU5EIEJBUiAoU2VuZCBCQVIgdG8gcmVmcmVzaCBwZWVyIHJlb3JkZXJpbmcgYnVmZmVyLikKLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtwSW5mby0+V2NpZF0uQkFPcmlXY2lkQXJyYXlbcEluZm8tPlRJRF07Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCUJhckhlYWRlckluaXQocEFkLCAmRnJhbWVCYXIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCUZyYW1lQmFyLlN0YXJ0aW5nU2VxLmZpZWxkLkZyYWdOdW0gPSAwOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEgPSBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5UeFNlcVtwSW5mby0+VElEXTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEluZm8tPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuQUNLUG9saWN5ID0gSU1NRURfQkE7IC8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmNpdG9uLgotCQlGcmFtZUJhci5CYXJDb250cm9sLkNvbXByZXNzZWQgPSAxOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJRnJhbWVCYXIuQmFyQ29udHJvbC5NVElEID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcjIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwJICAmRnJhbWVCYXIsCi0JCQkJCSAgRU5EX09GX0FSR1MpOwotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBNbG1lREVMQkFBY3Rpb24oKSAuIFNlbmQgQkFSIHRvIHJlZnJlc2ggcGVlciByZW9yZGVyaW5nIGJ1ZmZlciBcbiIpKTsKLQotCQkvLyBTRU5EIERFTEJBIEZSQU1FCi0JCUZyYW1lTGVuID0gMDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQkJQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCWVsc2UKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5WYWxpZEFzRGxzKQotCQkJCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkZyYW1lLkhkciwgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPk1hY1RhYi5Db250ZW50W3BJbmZvLT5XY2lkXS5BZGRyKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlGcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOwotCQlGcmFtZS5BY3Rpb24gPSBERUxCQTsKLQkJRnJhbWUuRGVsYmFQYXJtLkluaXRpYXRvciA9IHBJbmZvLT5Jbml0aWF0b3I7Ci0JCUZyYW1lLkRlbGJhUGFybS5USUQgPSBwSW5mby0+VElEOwotCQlGcmFtZS5SZWFzb25Db2RlID0gMzk7IC8vIFRpbWUgT3V0Ci0JCSooVVNIT1JUICopKCZGcmFtZS5EZWxiYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkZyYW1lLkRlbGJhUGFybSkpOwotCQlGcmFtZS5SZWFzb25Db2RlID0gY3B1MmxlMTYoRnJhbWUuUmVhc29uQ29kZSk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgc2l6ZW9mKEZSQU1FX0RFTEJBX1JFUSksICAgICZGcmFtZSwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBIC0gTWxtZURFTEJBQWN0aW9uKCkgLiAzIERFTEJBIHNlbnQuIEluaXRpYXRvciglZClcbiIsIHBJbmZvLT5Jbml0aWF0b3IpKTsKLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgTWxtZVFPU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLVZPSUQgTWxtZURMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLVZPSUQgTWxtZUludmFsaWRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKLQkvL1JldHVybiB0aGUgcmVjZWl2aW5nIGZyYW1lIGV4Y2VwdCB0aGUgTVNCIG9mIGNhdGVnb3J5IGZpbGVkIHNldCB0byAxLiAgNy4zLjEuMTEKLX0KLQotVk9JRCBQZWVyUU9TQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotVk9JRCBQZWVyRExTQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUglBY3Rpb24gPSBFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsxXTsKLQotCXN3aXRjaChBY3Rpb24pCi0JewotCQljYXNlIEFDVElPTl9ETFNfUkVRVUVTVDoKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlQZWVyRGxzUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQlicmVhazsKLQotCQljYXNlIEFDVElPTl9ETFNfUkVTUE9OU0U6Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJUGVlckRsc1JzcEFjdGlvbihwQWQsIEVsZW0pOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBQ1RJT05fRExTX1RFQVJET1dOOgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCVBlZXJEbHNUZWFyRG93bkFjdGlvbihwQWQsIEVsZW0pOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJYnJlYWs7Ci0JfQotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBQZWVyQkFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOwotCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgQUREQkFfUkVROgotCQkJUGVlckFkZEJBUmVxQWN0aW9uKHBBZCxFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEFEREJBX1JFU1A6Ci0JCQlQZWVyQWRkQkFSc3BBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVMQkE6Ci0JCQlQZWVyRGVsQkFBY3Rpb24ocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0JfQotfQotCi0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgU3RhUHVibGljQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIEJzczIwNDBDb2V4aXN0KQotewotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJzc0NvZXhpc3Q7Ci0JTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJCQlTY2FuUmVxOwotCi0JQnNzQ29leGlzdC53b3JkID0gQnNzMjA0MENvZXhpc3Q7Ci0JLy8gQVAgYXNrcyBTdGF0aW9uIHRvIHJldHVybiBhIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBtZ210IGZyYW1lLiAgU28gd2UgZmlyc3Qgc3RhcnRzIGEgc2NhbiwgdGhlbiBzZW5kIGJhY2sgMjAvNDAgQlNTIENvZXhpc3RlbmNlIG1nbXQgZnJhbWUKLQlpZiAoKEJzc0NvZXhpc3QuZmllbGQuSW5mb1JlcSA9PSAxKSAmJiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TQ0FOXzIwNDApKSkKLQl7Ci0JCS8vIENsZWFyIHJlY29yZCBmaXJzdC4gIEFmdGVyIHNjYW4gLCB3aWxsIHVwZGF0ZSB0aG9zZSBiaXQgYW5kIHNlbmQgYmFjayB0byB0cmFuc21pdGVyLgotCQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5JbmZvUmVxID0gMTsKLQkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuSW50b2xlcmFudDQwID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAuZmllbGQuQlNTMjBXaWR0aFJlcSA9IDA7Ci0JCS8vIEZpbGwgb3V0IHN0dWZmIGZvciBzY2FuIHJlcXVlc3QKLQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIFplcm9Tc2lkLCAwLCBCU1NfQU5ZLCBTQ0FOXzIwNDBfQlNTX0NPRVhJU1QpOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU0NBTl9SRVEsIHNpemVvZihNTE1FX1NDQU5fUkVRX1NUUlVDVCksICZTY2FuUmVxKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotCX0KLX0KLQotCi0vKgotRGVzY3JpcHRpb24gOiBCdWlsZCBJbnRvbGVyYW50IENoYW5uZWwgUmVycG90IGZyb20gVHJpZ2dlciBldmVudCB0YWJsZS4KLXJldHVybiA6IGhvdyBtYW55IGJ5dGVzIGNvcGllZC4KLSovCi1VTE9ORyBCdWlsZEludG9sZXJhbnRDaGFubmVsUmVwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFBVQ0hBUiAgcERlc3QpCi17Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JVUxPTkcJCQlSZWFkT2Zmc2V0ID0gMDsKLQlVQ0hBUgkJCWk7Ci0JVUNIQVIJCQlMYXN0UmVnQ2xhc3MgPSAweGZmOwotCVBVQ0hBUgkJCXBMZW47Ci0KLQlmb3IgKCBpID0gMDtpIDwgTUFYX1RSSUdHRVJfRVZFTlQ7aSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID09IFRSVUUpCi0JCXsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLlJlZ0NsYXNzID09IExhc3RSZWdDbGFzcykKLQkJCXsKLQkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DaGFubmVsOwotCQkJCSpwTGVuKys7Ci0JCQkJUmVhZE9mZnNldCsrOwotCQkJCUZyYW1lTGVuKys7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKihwRGVzdCArIFJlYWRPZmZzZXQpID0gSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQ7ICAvLyBJRQotCQkJCSoocERlc3QgKyBSZWFkT2Zmc2V0ICsgMSkgPSAyOwkvLyBMZW4gPSBSZWdDbGFzcyBieXRlICsgY2hhbm5lbCBieXRlLgotCQkJCXBMZW4gPSBwRGVzdCArIFJlYWRPZmZzZXQgKyAxOwotCQkJCUxhc3RSZWdDbGFzcyA9IHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uUmVnQ2xhc3M7Ci0JCQkJKihwRGVzdCArIFJlYWRPZmZzZXQgKyAyKSA9IExhc3RSZWdDbGFzczsJLy8gTGVuID0gUmVnQ2xhc3MgYnl0ZSArIGNoYW5uZWwgYnl0ZS4KLQkJCQkqKHBEZXN0ICsgUmVhZE9mZnNldCArIDMpID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uQ2hhbm5lbDsKLQkJCQlGcmFtZUxlbiArPSA0OwotCQkJCVJlYWRPZmZzZXQgKz0gNDsKLQkJCX0KLQotCQl9Ci0JfQotCXJldHVybiBGcmFtZUxlbjsKLX0KLQotCi0vKgotRGVzY3JpcHRpb24gOiBTZW5kIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZSBBY3Rpb24gZnJhbWUgSWYgb25lIHRyaWdnZXIgZXZlbnQgaXMgdHJpZ2dlcmVkLgotKi8KLVZPSUQgU2VuZDIwNDBDb2V4aXN0QWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOCUJPT0xFQU4JYkFkZEludG9sZXJhbnRDaGEpCi17Ci0JUFVDSEFSCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMJTlN0YXR1czsKLQlGUkFNRV9BQ1RJT05fSERSCUZyYW1lOwotCVVMT05HCQkJRnJhbWVMZW47Ci0JVUxPTkcJCQlJbnRvbGVyYW50Q2hhUmVwTGVuOwotCi0JSW50b2xlcmFudENoYVJlcExlbiA9IDA7Ci0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfUFVCTElDOwotCUZyYW1lLkFjdGlvbiA9IEFDVElPTl9CU1NfMjA0MF9DT0VYSVNUOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKLQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLndvcmQ7Ci0JRnJhbWVMZW4rKzsKLQotCWlmIChiQWRkSW50b2xlcmFudENoYSA9PSBUUlVFKQotCQlJbnRvbGVyYW50Q2hhUmVwTGVuID0gQnVpbGRJbnRvbGVyYW50Q2hhbm5lbFJlcChwQWQsIHBPdXRCdWZmZXIgKyBGcmFtZUxlbik7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4gKyBJbnRvbGVyYW50Q2hhUmVwTGVuKTsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmQyMDQwQ29leGlzdEFjdGlvbiggQlNTQ29leGlzdDIwNDAgPSAweCV4ICkgIFxuIiwgcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCkpOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCUFmdGVyIHNjYW4sIFVwZGF0ZSAyMC80MCBCU1MgQ29leGlzdGVuY2UgSUUgYW5kIHNlbmQgb3V0LgotCUFjY29yZGluZyB0byA4MDIuMTFuIEQzLjAzIDExLjE0LjEwCi0KLQlQYXJhbWV0ZXJzOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKQotewotCUJTU18yMDQwX0NPRVhJU1RfSUUJT2xkVmFsdWU7Ci0KLQlPbGRWYWx1ZS53b3JkID0gcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZDsKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFObyA+IDApIHx8IChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRCQ291bnREb3duID4gMCkpCi0JCXBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkJTUzIwV2lkdGhSZXEgPSAxOwotCi0JLy8gTmVlZCB0byBjaGVjayAhISEhCi0JLy8gSG93IFNUQSB3aWxsIHNldCBJbnRvbGVyYW50NDAgaWYgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBOb3cgd2UgZG9uJ3Qgc2V0IHRoaXMgYml0IGZpcnN0LiEhISEhCi0JLy8gU28gT25seSBjaGVjayBCU1MyMFdpZHRoUmVxIGNoYW5nZS4KLQlpZiAoT2xkVmFsdWUuZmllbGQuQlNTMjBXaWR0aFJlcSAhPSBwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC5maWVsZC5CU1MyMFdpZHRoUmVxKQotCXsKLQkJU2VuZDIwNDBDb2V4aXN0QWN0aW9uKHBBZCwgV2NpZCwgYkFkZEludG9sZXJhbnRDaGEpOwotCX0KLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi1CT09MRUFOIENoYW5uZWxTd2l0Y2hTYW5pdHlDaGVjaygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTiAgICBVQ0hBUiAgTmV3Q2hhbm5lbCwKLQlJTiAgICBVQ0hBUiAgU2Vjb25kYXJ5KQotewotCVVDSEFSCQlpOwotCi0JaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmICgoTmV3Q2hhbm5lbCA+IDcpICYmIChTZWNvbmRhcnkgPT0gMSkpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmICgoTmV3Q2hhbm5lbCA8IDUpICYmIChTZWNvbmRhcnkgPT0gMykpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIDAuIENoZWNrIGlmIG5ldyBjaGFubmVsIGlzIGluIHRoZSBjaGFubmVsbGlzdC4KLQlmb3IgKGkgPSAwO2kgPCBwQWQtPkNoYW5uZWxMaXN0TnVtO2krKykKLQl7Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1WT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4gICAgVUNIQVIgIE5ld0NoYW5uZWwsCi0JSU4gICAgVUNIQVIgIFNlY29uZGFyeSkKLXsKLQlVQ0hBUgkJQkJQVmFsdWUgPSAwOwotCVVMT05HCQlNQUNWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1BFQ1RSVU0gLSBDaGFubmVsU3dpdGNoQWN0aW9uKE5ld0NoYW5uZWwgPSAlZCAsIFNlY29uZGFyeSA9ICVkKSAgXG4iLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpKTsKLQotCWlmIChDaGFubmVsU3dpdGNoU2FuaXR5Q2hlY2socEFkLCBXY2lkLCBOZXdDaGFubmVsLCBTZWNvbmRhcnkpID09IEZBTFNFKQotCQlyZXR1cm47Ci0KLQkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSAyMC4KLQlpZiAoU2Vjb25kYXJ5ID09IDApCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDE2KTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDA4KTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXJ0Mjg2MEMgISEhIFxuIiApKTsKLQkJfQotCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRQaHlNb2RlLmZpZWxkLkJXID0gMDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhMjBNSHogICAhISEgXG4iICkpOwotCX0KLQkvLyAxLiAgU3dpdGNoZXMgdG8gQlcgPSA0MCBBbmQgU3RhdGlvbiBzdXBwb3J0cyBCVyA9IDQwLgotCWVsc2UgaWYgKCgoU2Vjb25kYXJ5ID09IDEpIHx8IChTZWNvbmRhcnkgPT0gMykpICYmIChwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSAxKSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCi0JCWlmIChTZWNvbmRhcnkgPT0gMSkKLQkJewotCQkJLy8gU2Vjb25kYXJ5IGFib3ZlLgotCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZNQUNWYWx1ZSk7Ci0JCQlNQUNWYWx1ZSAmPSAweGZlOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIE1BQ1ZhbHVlKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlfD0gKDB4MTApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUmPSAofjB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogTG93ZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IEJlbG93LiBDZW50cmFsID0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCApKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIFNlY29uZGFyeSBiZWxvdy4KLQkJCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCAtIDI7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmTUFDVmFsdWUpOwotCQkJTUFDVmFsdWUgJj0gMHhmZTsKLQkJCU1BQ1ZhbHVlIHw9IDB4MTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBNQUNWYWx1ZSk7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSY9ICh+MHgxOCk7Ci0JCQlCQlBWYWx1ZXw9ICgweDEwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFZhbHVlKTsKLQkJCUJCUFZhbHVlJj0gKH4weDIwKTsKLQkJCUJCUFZhbHVlfD0gKDB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQVmFsdWUpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhNDBNSHogVXBwZXIgTElOSyBVUCAhISEgQ29udHJvbCBDaGFubmVsIGF0IFVwcGVyQ2VudHJhbCA9ICVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgKSk7Ci0JCX0KLQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JfQotfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBQZWVyUHVibGljQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgQUNUSU9OX0JTU18yMDQwX0NPRVhJU1Q6CS8vIEZvcm1hdCBkZWZpbmVkIGluIElFRUUgNy40LjdhLjEgaW4gMTFuIERyYWYzLjAzCi0JCQl7Ci0JCQkJLy9VQ0hBUglCc3NDb2V4aXN0OwotCQkJCUJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVAkJKnBDb2V4aXN0SW5mbzsKLQkJCQlCU1NfMjA0MF9DT0VYSVNUX0lFCQkJKnBCc3NDb2V4aXN0SWU7Ci0JCQkJQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQJKnBJbnRvbGVyYW50UmVwb3J0ID0gTlVMTDsKLQotCQkJCWlmIChFbGVtLT5Nc2dMZW4gPD0gKExFTkdUSF84MDJfMTEgKyBzaXplb2YoQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UKSkgKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUNUSU9OIC0gMjAvNDAgQlNTIENvZXhpc3RlbmNlIE1hbmFnZW1lbnQgRnJhbWUgbGVuZ3RoIHRvbyBzaG9ydCEgbGVuID0gJWxkIVxuIiwgRWxlbS0+TXNnTGVuKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBQ1RJT04gLSAyMC80MCBCU1MgQ29leGlzdGVuY2UgTWFuYWdlbWVudCBhY3Rpb24tLS0tPiBcbiIpKTsKLQkJCQloZXhfZHVtcCgiQ29leGlzdGVuY2VNZ210RnJhbWUiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7Ci0KLQotCQkJCXBDb2V4aXN0SW5mbyA9IChCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQgKikgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdOwotCQkJCS8vaGV4X2R1bXAoIkNvZXhpc3RJbmZvIiwgKFBVQ0hBUilwQ29leGlzdEluZm8sIHNpemVvZihCU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQpKTsKLQkJCQlpZiAoRWxlbS0+TXNnTGVuID49IChMRU5HVEhfODAyXzExICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkgKyBzaXplb2YoQlNTXzIwNDBfSU5UT0xFUkFOVF9DSF9SRVBPUlQpKSkKLQkJCQl7Ci0JCQkJCXBJbnRvbGVyYW50UmVwb3J0ID0gKEJTU18yMDQwX0lOVE9MRVJBTlRfQ0hfUkVQT1JUICopKChQVUNIQVIpcENvZXhpc3RJbmZvICsgc2l6ZW9mKEJTU18yMDQwX0NPRVhJU1RfRUxFTUVOVCkpOwotCQkJCX0KLQkJCQkvL2hleF9kdW1wKCJJbnRvbGVyYW50UmVwb3J0ICIsIChQVUNIQVIpcEludG9sZXJhbnRSZXBvcnQsIHNpemVvZihCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCkpOwotCi0JCQkJcEJzc0NvZXhpc3RJZSA9IChCU1NfMjA0MF9DT0VYSVNUX0lFICopKCZwQ29leGlzdEluZm8tPkJzc0NvZXhpc3RJZSk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQkJCXsKLQkJCQkJCVN0YVB1YmxpY0FjdGlvbihwQWQsIHBDb2V4aXN0SW5mbyk7Ci0JCQkJCX0KLQkJCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCX0KLQkJCWJyZWFrOwotCX0KLQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotfQotCi0KLXN0YXRpYyBWT0lEIFJlc2VydmVkQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiBDYXRlZ29yeTsKLQotCWlmIChFbGVtLT5Nc2dMZW4gPD0gTEVOR1RIXzgwMl8xMSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQlDYXRlZ29yeSA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExXTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJjdiByZXNlcnZlZCBjYXRlZ29yeSglZCkgQWN0aW9uIEZyYW1lXG4iLCBDYXRlZ29yeSkpOwotCWhleF9kdW1wKCJSZXNlcnZlZCBBY3Rpb24gRnJhbWUiLCAmRWxlbS0+TXNnWzBdLCBFbGVtLT5Nc2dMZW4pOwotfQotCi1WT0lEIFBlZXJSTUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi0KLXsKLQlyZXR1cm47Ci19Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLXN0YXRpYyBWT0lEIHJlc3BvbmRfaHRfaW5mb3JtYXRpb25fZXhjaGFuZ2VfYWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuOwotCUZSQU1FX0hUX0lORk8JSFRJTkZPZnJhbWUsICpwRnJhbWU7Ci0JVUNIQVIJCQkqcEFkZHI7Ci0KLQotCS8vIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCi0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gZ2V0IFJBCi0JcEZyYW1lID0gKEZSQU1FX0hUX0lORk8gKikgJkVsZW0tPk1zZ1swXTsKLQlwQWRkciA9IHBGcmFtZS0+SGRyLkFkZHIyOwotCi0JTmRpc1plcm9NZW1vcnkoJkhUSU5GT2ZyYW1lLCBzaXplb2YoRlJBTUVfSFRfSU5GTykpOwotCS8vIDItMS4gUHJlcGFyZSBBRERCQSBSZXNwb25zZSBmcmFtZS4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJZWxzZQotCQlBY3RIZWFkZXJJbml0KHBBZCwgJkhUSU5GT2ZyYW1lLkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZGRyKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlIVElORk9mcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0hUOwotCUhUSU5GT2ZyYW1lLkFjdGlvbiA9IEhUX0lORk9fRVhDSEFOR0U7Ci0JSFRJTkZPZnJhbWUuSFRfSW5mby5SZXF1ZXN0ID0gMDsKLQlIVElORk9mcmFtZS5IVF9JbmZvLkZvcnR5X01Iel9JbnRvbGVyYW50ID0gcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5Gb3J0eV9NaHpfSW50b2xlcmFudDsKLQlIVElORk9mcmFtZS5IVF9JbmZvLlNUQV9DaGFubmVsX1dpZHRoCSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCQkmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX0hUX0lORk8pLAkmSFRJTkZPZnJhbWUsCi0JCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotfQotCi0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEIFNlbmROb3RpZnlCV0FjdGlvbkZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICBXY2lkLAotCUlOIFVDSEFSIGFwaWR4KQotewotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCU5TdGF0dXM7Ci0JRlJBTUVfQUNUSU9OX0hEUglGcmFtZTsKLQlVTE9ORwkJCUZyYW1lTGVuOwotCVBVQ0hBUgkJCXBBZGRyMTsKLQotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFDVCAtIFNlbmROb3RpZnlCV0FjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoV2NpZCA9PSBNQ0FTVF9XQ0lEKQotCQlwQWRkcjEgPSAmQlJPQURDQVNUX0FERFJbMF07Ci0JZWxzZQotCQlwQWRkcjEgPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkFkZHI7Ci0JQWN0SGVhZGVySW5pdChwQWQsICZGcmFtZS5IZHIsIHBBZGRyMSwgcEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkLCBwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uQnNzaWQpOwotCi0JRnJhbWUuQ2F0ZWdvcnkgPSBDQVRFR09SWV9IVDsKLQlGcmFtZS5BY3Rpb24gPSBOT1RJRllfQldfQUNUSU9OOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCSAgc2l6ZW9mKEZSQU1FX0FDVElPTl9IRFIpLAkgICZGcmFtZSwKLQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCSoocE91dEJ1ZmZlciArIEZyYW1lTGVuKSA9IHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsKLQlGcmFtZUxlbisrOwotCi0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUIC0gU2VuZE5vdGlmeUJXQWN0aW9uKE5vdGlmeUJXPSAlZCkhXG4iLCBwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGgpKTsKLQotfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotCi1WT0lEIFBlZXJIVEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJQWN0aW9uID0gRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMV07Ci0KLQlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoKEFjdGlvbikKLQl7Ci0JCWNhc2UgTk9USUZZX0JXX0FDVElPTjoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgTm90aWZ5IENoYW5uZWwgYmFuZHdpZHRoIGFjdGlvbi0tLS0+IFxuIikpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJaWYocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJLy8gTm90ZSwgdGhpcyBpcyB0byBwYXRjaCBESVItMTM1MyBBUC4gV2hlbiB0aGUgQVAgc2V0IHRvIFdlcCwgaXQgd2lsbCB1c2UgbGVnYWN5IG1vZGUuIEJ1dCBBUCBzdGlsbCBrZWVwcwotCQkJCS8vIHNlbmRpbmcgQldfTm90aWZ5IEFjdGlvbiBmcmFtZSwgYW5kIGNhdXNlIHVzIHRvIGxpbmt1cCBhbmQgbGlua2Rvd24uCi0JCQkJLy8gSW4gbGVnYWN5IG1vZGUsIGRvbid0IG5lZWQgdG8gcGFyc2UgSFQgYWN0aW9uIGZyYW1lLgotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC1JZ25vcmUgSFQgTm90aWZ5IENoYW5uZWwgQlcgd2hlbiBsaW5rIGFzIGxlZ2FjeSBtb2RlLiBCVyA9ICVkLS0tPiBcbiIsCi0JCQkJCQkJCUVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdICkpOwotCQkJCWJyZWFrOwotCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCQlpZiAoRWxlbS0+TXNnW0xFTkdUSF84MDJfMTErMl0gPT0gMCkJLy8gNy40LjguMi4gaWYgdmFsdWUgaXMgMSwga2VlcCB0aGUgc2FtZSBhcyBzdXBwb3J0ZWQgY2hhbm5lbCBiYW5kd2lkdGguCi0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5IVFBoeU1vZGUuZmllbGQuQlcgPSAwOwotCi0JCQlicmVhazsKLQotCQljYXNlIFNNUFNfQUNUSU9OOgotCQkJLy8gNy4zLjEuMjUKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gU01QUyBhY3Rpb24tLS0tPiBcbiIpKTsKLQkJCWlmICgoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdJjB4MSkgPT0gMCkpCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXS5NbXBzTW9kZSA9IE1NUFNfRU5BQkxFOwotCQkJfQotCQkJZWxzZSBpZiAoKChFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXSYweDIpID09IDApKQotCQkJewotCQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uTW1wc01vZGUgPSBNTVBTX1NUQVRJQzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlID0gTU1QU19EWU5BTUlDOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFpZCglZCkgTUlNTyBQUyA9ICVkXG4iLCBFbGVtLT5XY2lkLCBwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLk1tcHNNb2RlKSk7Ci0JCQkvLyBydDI4NjBjIDogYWRkIHNvbWV0aGluZyBmb3Igc21wcyBjaGFuZ2UuCi0JCQlicmVhazsKLQotCQljYXNlIFNFVFBDT19BQ1RJT046Ci0JCQlicmVhazsKLQotCQljYXNlIE1JTU9fQ0hBX01FQVNVUkVfQUNUSU9OOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBIVF9JTkZPX0VYQ0hBTkdFOgotCQkJewotCQkJCUhUX0lORk9STUFUSU9OX09DVEVUCSpwSFRfaW5mbzsKLQotCQkJCXBIVF9pbmZvID0gKEhUX0lORk9STUFUSU9OX09DVEVUICopICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSsyXTsKLQkJCQkvLyA3LjQuOC4xMAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUNUSU9OIC0gSFQgSW5mb3JtYXRpb24gRXhjaGFuZ2UgYWN0aW9uLS0tLT4gXG4iKSk7Ci0JCQkJaWYgKHBIVF9pbmZvLT5SZXF1ZXN0KQotCQkJCXsKLQkJCQkJcmVzcG9uZF9odF9pbmZvcm1hdGlvbl9leGNoYW5nZV9hY3Rpb24ocEFkLCBFbGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlQYXJhbWV0cnM6Ci0JcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKLQotCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KLQkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE9SSUJBVGltZXJUaW1lb3V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5OwotCUlOVAkJCWksIHRvdGFsOwotLy8JRlJBTUVfQkFSCQkJRnJhbWVCYXI7Ci0vLwlVTE9ORwkJCUZyYW1lTGVuOwotLy8JTkRJU19TVEFUVVMJTlN0YXR1czsKLS8vCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotLy8JVVNIT1JUCQkJU2VxdWVuY2U7Ci0JVUNIQVIJCQlUSUQ7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JdG90YWwgPSBwQWQtPk1hY1RhYi5TaXplICogTlVNX09GX1RJRDsKLQotCWZvciAoaSA9IDE7ICgoaSA8TUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpICYmICh0b3RhbCA+IDApKSA7IGkrKykKLQl7Ci0JCWlmICAocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uT1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpCi0JCXsKLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldLldjaWRdOwotCQkJVElEID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uVElEOwotCi0JCQlBU1NFUlQocEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaV0uV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKTsKLQkJfQotCQl0b3RhbCAtLTsKLQl9Ci19Ci0KLQotVk9JRCBTZW5kUmVmcmVzaEJBUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSkKLXsKLQlGUkFNRV9CQVIJCUZyYW1lQmFyOwotCVVMT05HCQkJRnJhbWVMZW47Ci0JTkRJU19TVEFUVVMJTlN0YXR1czsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlVU0hPUlQJCQlTZXF1ZW5jZTsKLQlVQ0hBUgkJCWksIFRJRDsKLQlVU0hPUlQJCQlpZHg7Ci0JQkFfT1JJX0VOVFJZCSpwQkFFbnRyeTsKLQotCWZvciAoaSA9IDA7IGkgPE5VTV9PRl9USUQ7IGkrKykKLQl7Ci0JCWlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbaV07Ci0JCWlmIChpZHggPT0gMCkKLQkJewotCQkJY29udGludWU7Ci0JCX0KLQkJcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbaWR4XTsKLQotCQlpZiAgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJewotCQkJVElEID0gcEJBRW50cnktPlRJRDsKLQotCQkJQVNTRVJUKHBCQUVudHJ5LT5XY2lkIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEUpOwotCi0JCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQkJaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU2VxdWVuY2UgPSBwRW50cnktPlR4U2VxW1RJRF07Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlCYXJIZWFkZXJJbml0KHBBZCwgJkZyYW1lQmFyLCBwRW50cnktPkFkZHIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5GcmFnTnVtID0gMDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY3Rpb24uCi0JCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IFNlcXVlbmNlOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQkJCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gVElEOyAvLyBtYWtlIHN1cmUgc2VxdWVuY2Ugbm90IGNsZWFyIGluIERFTCBmdW5jaXRvbi4KLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEZSQU1FX0JBUiksCSAgJkZyYW1lQmFyLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJLy9pZiAoIShDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKSkpCi0JCQlpZiAoMSkJLy8gTm93IHdlIGFsd2F5cyBzZW5kIEJBUi4KLQkJCXsKLQkJCQkvL01pbmlwb3J0TU1SZXF1ZXN0VW5sb2NrKHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgKE1HTVRfVVNFX1FVRVVFX0ZMQUcgfCBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W1RJRF0pLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0KLQkJCX0KLQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgQWN0SGVhZGVySW5pdCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLSAgICBJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotICAgIElOIFBVQ0hBUiBBZGRyMSwKLSAgICBJTiBQVUNIQVIgQWRkcjIsCi0gICAgSU4gUFVDSEFSIEFkZHIzKQotewotICAgIE5kaXNaZXJvTWVtb3J5KHBIZHI4MDIxMSwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLSAgICBwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwotICAgIHBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQUNUSU9OOwotCi0gICAgQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBBZGRyMSk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIyLCBBZGRyMik7Ci0gICAgQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBBZGRyMyk7Ci19Ci0KLVZPSUQgQmFySGVhZGVySW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQgUEZSQU1FX0JBUiBwQ250bEJhciwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFBVQ0hBUiBwU0EpCi17Ci0vLwlVU0hPUlQJRHVyYXRpb247Ci0KLQlOZGlzWmVyb01lbW9yeShwQ250bEJhciwgc2l6ZW9mKEZSQU1FX0JBUikpOwotCXBDbnRsQmFyLT5GQy5UeXBlID0gQlRZUEVfQ05UTDsKLQlwQ250bEJhci0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfQkxPQ0tfQUNLX1JFUTsKLQlwQ250bEJhci0+QmFyQ29udHJvbC5NVElEID0gMDsKLQlwQ250bEJhci0+QmFyQ29udHJvbC5Db21wcmVzc2VkID0gMTsKLQlwQ250bEJhci0+QmFyQ29udHJvbC5BQ0tQb2xpY3kgPSAwOwotCi0KLQlwQ250bEJhci0+RHVyYXRpb24gPSAxNiArIFJUTVBDYWxjRHVyYXRpb24ocEFkLCBSQVRFXzEsIHNpemVvZihGUkFNRV9CQSkpOwotCi0JQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjEsIHBEQSk7Ci0JQ09QWV9NQUNfQUREUihwQ250bEJhci0+QWRkcjIsIHBTQSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlJbnNlcnQgQ2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlIGludG8gdGhlIGFjdGlvbiBmcmFtZS4KLQotCVBhcmFtZXRyczoKLQkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCi0JCTIuIGZyYW1lIGxlbmd0aC4KLQkJMy4gY2F0ZWdvcnkgY29kZSBvZiB0aGUgZnJhbWUuCi0JCTQuIGFjdGlvbiBjb2RlIG9mIHRoZSBmcmFtZS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBJbnNlcnRBY3RGaWVsZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDYXRlZ29yeSwKLQlJTiBVSU5UOCBBY3RDb2RlKQotewotCVVMT05HIFRlbXBMZW47Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZSgJcEZyYW1lQnVmLAkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkmQ2F0ZWdvcnksCi0JCQkJCQkxLAkJCQkmQWN0Q29kZSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2JhX2FjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYmFfYWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzI0ODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vYmFfYWN0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2RlZmluZSBCQV9PUklfSU5JVF9TRVEJCShwRW50cnktPlR4U2VxW1RJRF0pIC8vMQkJCS8vIGluaXRhbCBzZXF1ZW5jZSBudW1iZXIgb2YgQkEgc2Vzc2lvbgotCi0jZGVmaW5lIE9SSV9TRVNTSU9OX01BWF9SRVRSWQk4Ci0jZGVmaW5lIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQJKDIwMDApCS8vIG1zCi0jZGVmaW5lIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVAkoMTAwMCkJLy8gbXMKLQotI2RlZmluZSBSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCQkoKDEwMCAqIE9TX0haKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCi0jZGVmaW5lIE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUCSgoMzAwMCAqIE9TX0haKS8xMDAwKQkvLyBzeXN0ZW0gdGlja3MgLS0gMTAwIG1zCi0KLSNkZWZpbmUgUkVTRVRfUkNWX1NFUQkJKDB4RkZGRikKLQotc3RhdGljIHZvaWQgYmFfbXBkdV9ibGtfZnJlZShQUlRNUF9BREFQVEVSIHBBZCwgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbXBkdV9ibGspOwotCi0KLUJBX09SSV9FTlRSWSAqQkFUYWJsZUFsbG9jT3JpRW50cnkoCi0JCQkJCQkJCSAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkJCSAgT1VUIFVTSE9SVCAgICAgICAgICAqSWR4KTsKLQotQkFfUkVDX0VOVFJZICpCQVRhYmxlQWxsb2NSZWNFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpOwotCi1WT0lEIEJBT3JpU2Vzc2lvblNldHVwVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLQotQlVJTERfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KTsKLUJVSUxEX1RJTUVSX0ZVTkNUSU9OKEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KTsKLQotI2RlZmluZSBBTk5PVU5DRV9SRU9SREVSSU5HX1BBQ0tFVChfcEFkLCBfbXBkdV9ibGspCVwKLQkJCUFubm91bmNlX1Jlb3JkZXJpbmdfUGFja2V0KF9wQWQsIF9tcGR1X2Jsayk7Ci0KLVZPSUQgQkFfTWF4V2luU2l6ZVJlYXNpZ24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5UGVlciwKLQlPVVQgVUNIQVIJCQkqcFdpblNpemUpCi17Ci0JVUNIQVIgTWF4U2l6ZTsKLQotCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OKSAvLyAzKjMKLQl7Ci0JCWlmIChwQWQtPk1BQ1ZlcnNpb24gPj0gUkFMSU5LXzMwNzBfVkVSU0lPTikKLQkJewotCQkJaWYgKHBFbnRyeVBlZXItPldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQotCQkJCU1heFNpemUgPSA3OyAvLyBmb3Igbm9uLW9wZW4gbW9kZQotCQkJZWxzZQotCQkJCU1heFNpemUgPSAxMzsKLQkJfQotCQllbHNlCi0JCQlNYXhTaXplID0gMzE7Ci0JfQotCWVsc2UgaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTikgLy8gMjg4MCBlCi0JewotCQlpZiAocEVudHJ5UGVlci0+V2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCi0JCQlNYXhTaXplID0gNzsgLy8gZm9yIG5vbi1vcGVuIG1vZGUKLQkJZWxzZQotCQkJTWF4U2l6ZSA9IDEzOwotCX0KLQllbHNlCi0JCU1heFNpemUgPSA3OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiYmE+IFdpbiBTaXplID0gJWQsIE1heCBTaXplID0gJWRcbiIsCi0JCQkqcFdpblNpemUsIE1heFNpemUpKTsKLQotCWlmICgoKnBXaW5TaXplKSA+IE1heFNpemUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJiYT4gcmVhc3NpZ24gbWF4IHdpbiBzaXplIGZyb20gJWQgdG8gJWRcbiIsCi0JCQkJKnBXaW5TaXplLCBNYXhTaXplKSk7Ci0KLQkJKnBXaW5TaXplID0gTWF4U2l6ZTsKLQl9Ci19Ci0KLXZvaWQgQW5ub3VuY2VfUmVvcmRlcmluZ19QYWNrZXQoSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKLQkJCQkJCQkJSU4gc3RydWN0IHJlb3JkZXJpbmdfbXBkdQkqbXBkdSkKLXsKLQlQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKLQotCXBQYWNrZXQgPSBtcGR1LT5wUGFja2V0OwotCi0JaWYgKG1wZHUtPmJBTVNEVSkKLQl7Ci0JCUFTU0VSVCgwKTsKLQkJQkFfUmVvcmRlcl9BTVNEVV9Bbm5ub3VuY2UocEFkLCBwUGFja2V0KTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8KLQkJLy8gcGFzcyB0aGlzIDgwMi4zIHBhY2tldCB0byB1cHBlciBsYXllciBvciBmb3J3YXJkIHRoaXMgcGFja2V0IHRvIFdNIGRpcmVjdGx5Ci0JCS8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldCwgUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci19Ci0KLS8qCi0gKiBJbnNlcnQgYSByZW9yZGVyaW5nIG1wZHUgaW50byBzb3J0ZWQgbGlua2VkIGxpc3QgYnkgc2VxdWVuY2Ugbm8uCi0gKi8KLUJPT0xFQU4gYmFfcmVvcmRlcmluZ19tcGR1X2luc2VydHNvcnRlZChzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1KQotewotCi0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqKnBwU2NhbiA9ICZsaXN0LT5uZXh0OwotCi0Jd2hpbGUgKCpwcFNjYW4gIT0gTlVMTCkKLQl7Ci0JCWlmIChTRVFfU01BTExFUigoKnBwU2NhbiktPlNlcXVlbmNlLCBtcGR1LT5TZXF1ZW5jZSwgTUFYU0VRKSkKLQkJewotCQkJcHBTY2FuID0gJigqcHBTY2FuKS0+bmV4dDsKLQkJfQotCQllbHNlIGlmICgoKnBwU2NhbiktPlNlcXVlbmNlID09IG1wZHUtPlNlcXVlbmNlKQotCQl7Ci0JCQkvKiBnaXZlIHVwIHRoaXMgZHVwbGljYXRlZCBmcmFtZSAqLwotCQkJcmV0dXJuKEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qIGZpbmQgcG9zaXRpb24gKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JbXBkdS0+bmV4dCA9ICpwcFNjYW47Ci0JKnBwU2NhbiA9IG1wZHU7Ci0JbGlzdC0+cWxlbisrOwotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBjYWxsZXIgbG9jayBjcml0aWNhbCBzZWN0aW9uIGlmIG5lY2Vzc2FyeQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYmFfZW5xdWV1ZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0LCBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsaykKLXsKLQlsaXN0LT5xbGVuKys7Ci0JbXBkdV9ibGstPm5leHQgPSBsaXN0LT5uZXh0OwotCWxpc3QtPm5leHQgPSBtcGR1X2JsazsKLX0KLQotLyoKLSAqIGNhbGxlciBsb2NrIGNyaXRpY2FsIHNlY3Rpb24gaWYgbmVjZXNzYXJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqIGJhX2RlcXVldWUoc3RydWN0IHJlb3JkZXJpbmdfbGlzdCAqbGlzdCkKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsayA9IE5VTEw7Ci0KLQlBU1NFUlQobGlzdCk7Ci0KLQkJaWYgKGxpc3QtPnFsZW4pCi0JCXsKLQkJCWxpc3QtPnFsZW4tLTsKLQkJCW1wZHVfYmxrID0gbGlzdC0+bmV4dDsKLQkJCWlmIChtcGR1X2JsaykKLQkJCXsKLQkJCQlsaXN0LT5uZXh0ID0gbXBkdV9ibGstPm5leHQ7Ci0JCQkJbXBkdV9ibGstPm5leHQgPSBOVUxMOwotCQkJfQotCQl9Ci0JcmV0dXJuIG1wZHVfYmxrOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKHN0cnVjdCByZW9yZGVyaW5nX2xpc3QgKmxpc3QpCi17Ci0JcmV0dXJuKGJhX2RlcXVldWUobGlzdCkpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAgKmJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZShzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpsaXN0KQotCXsKLQlBU1NFUlQobGlzdCk7Ci0KLQkJcmV0dXJuKGxpc3QtPm5leHQpOwotCX0KLQotCi0vKgotICogZnJlZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCi0gKi8KLXZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJBX1RBQkxFICAgICAgICAqVGFiOwotCVBCQV9SRUNfRU5UUlkgICBwQkFFbnRyeTsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQlpbnQgaTsKLQotCVRhYiA9ICZwQWQtPkJBVGFibGU7Ci0KLQkvKiBJLiAgcmVsZWFzZSBhbGwgcGVuZGluZyByZW9yZGVyaW5nIHBhY2tldCAqLwotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKLQl7Ci0JCXBCQUVudHJ5ID0gJlRhYi0+QkFSZWNFbnRyeVtpXTsKLQkJaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQotCQl7Ci0JCQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCi0JCQl7Ci0JCQkJQVNTRVJUKG1wZHVfYmxrLT5wUGFja2V0KTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgbXBkdV9ibGstPnBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7Ci0JCQl9Ci0JCX0KLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCi0JQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7Ci0JLyogSUkuIGZyZWUgbWVtb3J5IG9mIHJlb3JkZXJpbmcgbXBkdSB0YWJsZSAqLwotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLQlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLX0KLQotCi0KLS8qCi0gKiBBbGxvY2F0ZSBhbGwgcmVzb3VyY2UgZm9yIHJlb3JkZXJpbmcgbWVjaGFuaXNtCi0gKi8KLUJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKQotewotCWludCAgICAgaTsKLQlQVUNIQVIgIG1lbTsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19saXN0ICpmcmVlbGlzdDsKLQotCS8qIGFsbG9jYXRlIHNwaW5sb2NrICovCi0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLQotCS8qIGluaXRpYWxpemUgZnJlZWxpc3QgKi8KLQlmcmVlbGlzdCA9ICZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3Q7Ci0JZnJlZWxpc3QtPm5leHQgPSBOVUxMOwotCWZyZWVsaXN0LT5xbGVuID0gMDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFsbG9jYXRlICVkIG1lbW9yeSBmb3IgQkEgcmVvcmRlcmluZ1xuIiwgKFVJTlQzMikobnVtKnNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSkpKTsKLQotCS8qIGFsbG9jYXRlIG51bWJlciBvZiBtcGR1X2JsayBtZW1vcnkgKi8KLQlvc19hbGxvY19tZW0ocEFkLCAoUFVDSEFSICopJm1lbSwgKG51bSpzaXplb2Yoc3RydWN0IHJlb3JkZXJpbmdfbXBkdSkpKTsKLQotCXBBZC0+bXBkdV9ibGtfcG9vbC5tZW0gPSBtZW07Ci0KLQlpZiAobWVtID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJDYW4ndCBBbGxvY2F0ZSBNZW1vcnkgZm9yIEJBIFJlb3JkZXJpbmdcbiIpKTsKLQkJcmV0dXJuKEZBTFNFKTsKLQl9Ci0KLQkvKiBidWlsZCBtcGR1X2JsayBmcmVlIGxpc3QgKi8KLQlmb3IgKGk9MDsgaTxudW07IGkrKykKLQl7Ci0JCS8qIGdldCBtcGR1X2JsayAqLwotCQltcGR1X2JsayA9IChzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICopIG1lbTsKLQkJLyogaW5pdGlhbCBtcGR1X2JsayAqLwotCQlOZGlzWmVyb01lbW9yeShtcGR1X2Jsaywgc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpKTsKLQkJLyogbmV4dCBtcGR1X2JsayAqLwotCQltZW0gKz0gc2l6ZW9mKHN0cnVjdCByZW9yZGVyaW5nX21wZHUpOwotCQkvKiBpbnNlcnQgbXBkdV9ibGsgaW50byBmcmVlbGlzdCAqLwotCQliYV9lbnF1ZXVlKGZyZWVsaXN0LCBtcGR1X2Jsayk7Ci0JfQotCi0JcmV0dXJuKFRSVUUpOwotfQotCi0vL3N0YXRpYyBpbnQgYmxrX2NvdW50PTA7IC8vIHNhbXBsZSB0YWtlIG9mZiwgbm8gdXNlCi0KLXN0YXRpYyBzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICpiYV9tcGR1X2Jsa19hbGxvYyhQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLQltcGR1X2JsayA9IGJhX2RlcXVldWUoJnBBZC0+bXBkdV9ibGtfcG9vbC5mcmVlbGlzdCk7Ci0JaWYgKG1wZHVfYmxrKQotCXsKLS8vCQlibGtfY291bnQrKzsKLQkJLyogcmVzZXQgbXBkdV9ibGsgKi8KLQkJTmRpc1plcm9NZW1vcnkobXBkdV9ibGssIHNpemVvZihzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1KSk7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+bXBkdV9ibGtfcG9vbC5sb2NrKTsKLQlyZXR1cm4gbXBkdV9ibGs7Ci19Ci0KLXN0YXRpYyB2b2lkIGJhX21wZHVfYmxrX2ZyZWUoUFJUTVBfQURBUFRFUiBwQWQsIHN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrKQotewotCUFTU0VSVChtcGR1X2Jsayk7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Ci0vLwlibGtfY291bnQtLTsKLQliYV9lbnF1ZXVlKCZwQWQtPm1wZHVfYmxrX3Bvb2wuZnJlZWxpc3QsIG1wZHVfYmxrKTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPm1wZHVfYmxrX3Bvb2wubG9jayk7Ci19Ci0KLQotc3RhdGljIFVTSE9SVCBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKAotCQkJCQkJCQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJCQkJICAgSU4gVVNIT1JUICAgICAgICAgICBTdGFydFNlcSkKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQlVU0hPUlQgIExhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0KLQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X3Byb2JlKCZwQkFFbnRyeS0+bGlzdCkpKQotCQl7Ci0JCQkvKiBmaW5kIGluLW9yZGVyIGZyYW1lICovCi0JCWlmICghU0VRX1NURVBPTkUobXBkdV9ibGstPlNlcXVlbmNlLCBTdGFydFNlcSwgTUFYU0VRKSkKLQkJCXsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIGRlcXVldWUgaW4tb3JkZXIgZnJhbWUgZnJvbSByZW9kZXJpbmcgbGlzdCAqLwotCQkJbXBkdV9ibGsgPSBiYV9yZW9yZGVyaW5nX21wZHVfZGVxdWV1ZSgmcEJBRW50cnktPmxpc3QpOwotCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCi0JCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwotCQkvKiBtb3ZlIHRvIG5leHQgc2VxdWVuY2UgKi8KLQkJCVN0YXJ0U2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOwotCQlMYXN0SW5kU2VxID0gU3RhcnRTZXE7Ci0JCS8qIGZyZWUgbXBkdV9ibGsgKi8KLQkJCWJhX21wZHVfYmxrX2ZyZWUocEFkLCBtcGR1X2Jsayk7Ci0JfQotCi0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0KLQkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KLQlyZXR1cm4gTGFzdEluZFNlcTsKLX0KLQotc3RhdGljIHZvaWQgYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19sZV9zZXEoCi0JCQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJCQkgICBJTiBQQkFfUkVDX0VOVFJZICAgIHBCQUVudHJ5LAotCQkJCQkJCQkJCQkgICBJTiBVU0hPUlQgICAgICAgICAgIFNlcXVlbmNlKQotewotCXN0cnVjdCByZW9yZGVyaW5nX21wZHUgKm1wZHVfYmxrOwotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0Jd2hpbGUgKChtcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9wcm9iZSgmcEJBRW50cnktPmxpc3QpKSkKLQkJewotCQkJLyogZmluZCBpbi1vcmRlciBmcmFtZSAqLwotCQlpZiAoKG1wZHVfYmxrLT5TZXF1ZW5jZSA9PSBTZXF1ZW5jZSkgfHwgU0VRX1NNQUxMRVIobXBkdV9ibGstPlNlcXVlbmNlLCBTZXF1ZW5jZSwgTUFYU0VRKSkKLQkJewotCQkJLyogZGVxdWV1ZSBpbi1vcmRlciBmcmFtZSBmcm9tIHJlb2RlcmluZyBsaXN0ICovCi0JCQltcGR1X2JsayA9IGJhX3Jlb3JkZXJpbmdfbXBkdV9kZXF1ZXVlKCZwQkFFbnRyeS0+bGlzdCk7Ci0JCQkvKiBwYXNzIHRoaXMgZnJhbWUgdXAgKi8KLQkJCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwotCQkJLyogZnJlZSBtcGR1X2JsayAqLwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQkJfQotCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwotfQotCi0KLXN0YXRpYyB2b2lkIGJhX3JlZnJlc2hfcmVvcmRlcmluZ19tcGR1cygKLQkJCQkJCQkJCSAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJICAgUEJBX1JFQ19FTlRSWSAgICAgICBwQkFFbnRyeSkKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwotCi0JCQkvKiBkZXF1ZXVlIGluLW9yZGVyIGZyYW1lIGZyb20gcmVvZGVyaW5nIGxpc3QgKi8KLQl3aGlsZSAoKG1wZHVfYmxrID0gYmFfcmVvcmRlcmluZ19tcGR1X2RlcXVldWUoJnBCQUVudHJ5LT5saXN0KSkpCi0JewotCQkJLyogcGFzcyB0aGlzIGZyYW1lIHVwICovCi0JCUFOTk9VTkNFX1JFT1JERVJJTkdfUEFDS0VUKHBBZCwgbXBkdV9ibGspOwotCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gbXBkdV9ibGstPlNlcXVlbmNlOwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQotCQkvKiB1cGRhdGUgbGFzdCBpbmRpY2F0ZWQgc2VxdWVuY2UgKi8KLQl9Ci0JQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7Ci0JcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwotfQotCi0KLS8vc3RhdGljCi12b2lkIGJhX2ZsdXNoX3Jlb3JkZXJpbmdfdGltZW91dF9tcGR1cygKLQkJCQkJCQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkJCQkJSU4gUEJBX1JFQ19FTlRSWSAgICBwQkFFbnRyeSwKLQkJCQkJCQkJCUlOIFVMT05HICAgICAgICAgICAgTm93MzIpCi0KLXsKLQlVU0hPUlQgU2VxdWVuY2U7Ci0KLS8vCWlmICgoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyK1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQpKSAmJgotLy8JCSAocEJBRW50cnktPmxpc3QucWxlbiA+ICgocEJBRW50cnktPkJBV2luU2l6ZSo3KS84KSkpIC8vfHwKLS8vCQkoUlRNUF9USU1FX0FGVEVSKCh1bnNpZ25lZCBsb25nKU5vdzMyLCAodW5zaWduZWQgbG9uZykocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKygxMCpSRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VUKSkpICYmCi0vLwkJIChwQkFFbnRyeS0+bGlzdC5xbGVuID4gKHBCQUVudHJ5LT5CQVdpblNpemUvOCkpKQotCWlmIChSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93MzIsICh1bnNpZ25lZCBsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIrKE1BWF9SRU9SREVSSU5HX1BBQ0tFVF9USU1FT1VULzYpKSkKLQkJICYmKHBCQUVudHJ5LT5saXN0LnFsZW4gPiAxKQotCQkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInRpbWVvdXRbJWRdICglMDhseC0lMDhseCA9ICVkID4gJWQpOiAleCwgZmx1c2ggYWxsIVxuICIsIHBCQUVudHJ5LT5saXN0LnFsZW4sIE5vdzMyLCAocEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyKSwKLQkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgTUFYX1JFT1JERVJJTkdfUEFDS0VUX1RJTUVPVVQsCi0JCQkgICBwQkFFbnRyeS0+TGFzdEluZFNlcSkpOwotCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwotCX0KLQllbHNlCi0JaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lcisoUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCkpKQotCQkmJiAocEJBRW50cnktPmxpc3QucWxlbiA+IDApCi0JICAgKQotCQl7Ci0vLwkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoInRpbWVvdXRbJWRdICglbHgtJWx4ID0gJWQgPiAlZCk6ICV4LCAiLCBwQkFFbnRyeS0+bGlzdC5xbGVuLCBOb3czMiwgKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciksCi0vLwkJCSAgIChpbnQpKChsb25nKSBOb3czMiAtIChsb25nKShwQkFFbnRyeS0+TGFzdEluZFNlcUF0VGltZXIpKSwgUkVPUkRFUklOR19QQUNLRVRfVElNRU9VVCwKLS8vCQkJICAgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKLQkJLy8KLQkJLy8gZm9yY2UgTGFzdEluZFNlcSB0byBzaGlmdCB0byBMYXN0SW5kU2VxKzEKLQkJLy8KLQkJU2VxdWVuY2UgPSAocEJBRW50cnktPkxhc3RJbmRTZXErMSkgJiBNQVhTRVE7Ci0JCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQkvLwotCQkvLyBpbmRpY2F0ZSBpbi1vcmRlciBtcGR1cwotCQkvLwotCQlTZXF1ZW5jZSA9IGJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfaW5fb3JkZXIocEFkLCBwQkFFbnRyeSwgU2VxdWVuY2UpOwotCQlpZiAoU2VxdWVuY2UgIT0gUkVTRVRfUkNWX1NFUSkKLQkJewotCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIleCwgZmx1c2ggb25lIVxuIiwgcEJBRW50cnktPkxhc3RJbmRTZXEpKTsKLQotCX0KLX0KLQotCi0vKgotICogZ2VuZXJhdGUgQUREQkEgcmVxdWVzdCB0bwotICogc2V0IHVwIEJBIGFncmVlbWVudAotICovCi1WT0lEIEJBT3JpU2Vzc2lvblNldFVwKAotCQkJCQkgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQkgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCQkJICBJTiBVQ0hBUiAgICAgICAgICAgIFRJRCwKLQkJCQkJICBJTiBVU0hPUlQgICAgICAgICAgIFRpbWVPdXQsCi0JCQkJCSAgSU4gVUxPTkcgICAgICAgICAgICBEZWxheVRpbWUsCi0JCQkJCSAgSU4gQk9PTEVBTiAgICAgICAgICBpc0ZvcmNlZCkKLQotewotCS8vTUxNRV9BRERCQV9SRVFfU1RSVUNUCUFkZGJhUmVxOwotCUJBX09SSV9FTlRSWSAgICAgICAgICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgSWR4OwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKLQotCWlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSAhPSBUUlVFKSAgJiYgIChpc0ZvcmNlZCA9PSBGQUxTRSkpCi0JCXJldHVybjsKLQotCS8vIGlmIHRoaXMgZW50cnkgaXMgbGltaXRlZCB0byB1c2UgbGVnYWN5IHR4IG1vZGUsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgQkEuCi0JaWYgKFJUTVBTdGFGaXhlZFR4TW9kZShwQWQsIHBFbnRyeSkgIT0gRklYRURfVFhNT0RFX0hUKQotCQlyZXR1cm47Ci0KLQlpZiAoKHBFbnRyeS0+QkFEZWNsaW5lQml0bWFwICYgKDE8PFRJRCkpICYmIChpc0ZvcmNlZCA9PSBGQUxTRSkpCi0JewotCQkvLyB0cnkgYWdhaW4gYWZ0ZXIgMyBzZWNzCi0JCURlbGF5VGltZSA9IDMwMDA7Ci0vLwkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGVDbGluZSBCQSBmcm9tIFBlZXJcbiIpKTsKLS8vCQlyZXR1cm47Ci0JfQotCi0KLQlJZHggPSBwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF07Ci0JaWYgKElkeCA9PSAwKQotCXsKLQkJLy8gYWxsb2NhdGUgYSBCQSBzZXNzaW9uCi0JCXBCQUVudHJ5ID0gQkFUYWJsZUFsbG9jT3JpRW50cnkocEFkLCAmSWR4KTsKLQkJaWYgKHBCQUVudHJ5ID09IE5VTEwpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQUREQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBCQSBzZXNzaW9uIGZhaWxlZCBcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQllbHNlCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0JfQotCi0JaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID49IE9yaWdpbmF0b3JfV2FpdFJlcykKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQlwRW50cnktPkJBT3JpV2NpZEFycmF5W1RJRF0gPSBJZHg7Ci0KLQkvLyBJbml0aWFsaXplIEJBIHNlc3Npb24KLQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfV2FpdFJlczsKLQlwQkFFbnRyeS0+V2NpZCA9IHBFbnRyeS0+QWlkOwotCXBCQUVudHJ5LT5CQVdpblNpemUgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0OwotCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKLQlwQkFFbnRyeS0+VG9rZW4gPSAxOwkvLyAoMjAwOC0wMS0yMSkgSmFuIExlZSByZWNvbW1lbmRzIGl0IC0gdGhpcyB0b2tlbiBjYW4ndCBiZSAwCi0JcEJBRW50cnktPlRJRCA9IFRJRDsKLQlwQkFFbnRyeS0+VGltZU91dFZhbHVlID0gVGltZU91dDsKLQlwQkFFbnRyeS0+cEFkYXB0ZXIgPSBwQWQ7Ci0KLQlpZiAoIShwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VElEKSkpCi0JewotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQkFPcmlTZXNzaW9uU2V0dXBUaW1lb3V0KSwgcEJBRW50cnksIEZBTFNFKTsKLQl9Ci0JZWxzZQotCQlSVE1QQ2FuY2VsVGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCS8vIHNldCB0aW1lciB0byBzZW5kIEFEREJBIHJlcXVlc3QKLQlSVE1QU2V0VGltZXIoJnBCQUVudHJ5LT5PUklCQVRpbWVyLCBEZWxheVRpbWUpOwotfQotCi1WT0lEIEJBT3JpU2Vzc2lvbkFkZCgKLQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJCQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JCQlJTiBQRlJBTUVfQUREQkFfUlNQIHBGcmFtZSkKLXsKLQlCQV9PUklfRU5UUlkgICpwQkFFbnRyeSA9IE5VTEw7Ci0JQk9PTEVBTiAgICAgICBDYW5jZWxsZWQ7Ci0JVUNIQVIgICAgICAgICBUSUQ7Ci0JVVNIT1JUICAgICAgICBJZHg7Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlVTE9ORyAgICAgICAgICAgRnJhbWVMZW47Ci0JRlJBTUVfQkFSICAgICAgIEZyYW1lQmFyOwotCi0JVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOwotCUlkeCA9IHBFbnRyeS0+QkFPcmlXY2lkQXJyYXlbVElEXTsKLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0KLQkvLyBTdGFydCBmaWxsIGluIHBhcmFtZXRlcnMuCi0JaWYgKChJZHggIT0wKSAmJiAocEJBRW50cnktPlRJRCA9PSBUSUQpICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpKQotCXsKLQkJcEJBRW50cnktPkJBV2luU2l6ZSA9IG1pbihwQkFFbnRyeS0+QkFXaW5TaXplLCAoKFVDSEFSKXBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUpKTsKLQkJQkFfTWF4V2luU2l6ZVJlYXNpZ24ocEFkLCBwRW50cnksICZwQkFFbnRyeS0+QkFXaW5TaXplKTsKLQotCQlwQkFFbnRyeS0+VGltZU91dFZhbHVlID0gcEZyYW1lLT5UaW1lT3V0VmFsdWU7Ci0JCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9Eb25lOwotCQlwQWQtPkJBVGFibGUubnVtRG9uZU9yaWdpbmF0b3IgKys7Ci0KLQkJLy8gcmVzZXQgc2VxdWVuY2UgbnVtYmVyCi0JCXBCQUVudHJ5LT5TZXF1ZW5jZSA9IEJBX09SSV9JTklUX1NFUTsKLQkJLy8gU2V0IEJpdG1hcCBmbGFnLgotCQlwRW50cnktPlRYQkFiaXRtYXAgfD0gKDE8PFRJRCk7Ci0JCQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkJcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSA9IDA7CS8vcEZyYW1lLT5UaW1lT3V0VmFsdWU7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA6IFRYQkFiaXRtYXAgPSAleCwgQkFXaW5TaXplID0gJWQsIFRpbWVPdXQgPSAlbGRcbiIsIF9fRlVOQ1RJT05fXywgcEVudHJ5LT5UWEJBYml0bWFwLAotCQkJCQkJCQkgcEJBRW50cnktPkJBV2luU2l6ZSwgcEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkpOwotCi0JCS8vIFNFTkQgQkFSIDsKLQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyMik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBCQU9yaVNlc3Npb25BZGQoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJQmFySGVhZGVySW5pdChwQWQsICZGcmFtZUJhciwgcEFkLT5NYWNUYWIuQ29udGVudFtwQkFFbnRyeS0+V2NpZF0uQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJRnJhbWVCYXIuU3RhcnRpbmdTZXEuZmllbGQuRnJhZ051bSA9IDA7CS8vIG1ha2Ugc3VyZSBzZXF1ZW5jZSBub3QgY2xlYXIgaW4gREVMIGZ1bmN0aW9uLgotCQlGcmFtZUJhci5TdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9IHBCQUVudHJ5LT5TZXF1ZW5jZTsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCUZyYW1lQmFyLkJhckNvbnRyb2wuVElEID0gcEJBRW50cnktPlRJRDsgLy8gbWFrZSBzdXJlIHNlcXVlbmNlIG5vdCBjbGVhciBpbiBERUwgZnVuY2l0b24uCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIyLCAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoRlJBTUVfQkFSKSwgICAgICAmRnJhbWVCYXIsCi0JCQkJCSAgRU5EX09GX0FSR1MpOwotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlcjIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyMik7Ci0KLQotCQlpZiAocEJBRW50cnktPk9SSUJBVGltZXIuVGltZXJWYWx1ZSkKLQkJCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIHBCQUVudHJ5LT5PUklCQVRpbWVyLlRpbWVyVmFsdWUpOyAvLyBpbiBtU2VjCi0JfQotfQotCi1CT09MRUFOIEJBUmVjU2Vzc2lvbkFkZCgKLQkJCQkJICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JCQkJCSAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQkJCQkJICAgSU4gUEZSQU1FX0FEREJBX1JFUSBwRnJhbWUpCi17Ci0JQkFfUkVDX0VOVFJZICAgICAgICAgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQlCT09MRUFOICAgICAgICAgICAgICAgICBTdGF0dXMgPSBUUlVFOwotCUJPT0xFQU4gICAgICAgICAgICAgICAgIENhbmNlbGxlZDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBJZHg7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgVElEOwotCVVDSEFSICAgICAgICAgICAgICAgICAgIEJBV2luU2l6ZTsKLQkvL1VJTlQzMiAgICAgICAgICAgICAgICAgIFZhbHVlOwotCS8vVUlOVCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OwotCi0KLQlBU1NFUlQocEVudHJ5KTsKLQotCS8vIGZpbmQgVElECi0JVElEID0gcEZyYW1lLT5CYVBhcm0uVElEOwotCi0JQkFXaW5TaXplID0gbWluKCgoVUNIQVIpcEZyYW1lLT5CYVBhcm0uQnVmU2l6ZSksIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0KTsKLQotCS8vIEludGVsIHBhdGNoCi0JaWYgKEJBV2luU2l6ZSA9PSAwKQotCXsKLQkJQkFXaW5TaXplID0gNjQ7Ci0JfQotCi0JSWR4ID0gcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdOwotCi0KLQlpZiAoSWR4ID09IDApCi0JewotCQlwQkFFbnRyeSA9IEJBVGFibGVBbGxvY1JlY0VudHJ5KHBBZCwgJklkeCk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JCS8vIGZsdXNoIGFsbCBwZW5kaW5nIHJlb3JkZXJpbmcgbXBkdXMKLQkJYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMoJWxkKTogSWR4ID0gJWQsIEJBV2luU2l6ZShyZXEgJWQpID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50LCBJZHgsCi0JCQkJCQkJIHBGcmFtZS0+QmFQYXJtLkJ1ZlNpemUsIEJBV2luU2l6ZSkpOwotCi0JLy8gU3RhcnQgZmlsbCBpbiBwYXJhbWV0ZXJzLgotCWlmIChwQkFFbnRyeSAhPSBOVUxMKQotCXsKLQkJQVNTRVJUKHBCQUVudHJ5LT5saXN0LnFsZW4gPT0gMCk7Ci0KLQkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfSGFuZGxlUmVzOwotCQlwQkFFbnRyeS0+QkFXaW5TaXplID0gQkFXaW5TaXplOwotCQlwQkFFbnRyeS0+V2NpZCA9IHBFbnRyeS0+QWlkOwotCQlwQkFFbnRyeS0+VElEID0gVElEOwotCQlwQkFFbnRyeS0+VGltZU91dFZhbHVlID0gcEZyYW1lLT5UaW1lT3V0VmFsdWU7Ci0JCXBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X0FjY2VwdDsKLQkJLy8gaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIKLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBSRVNFVF9SQ1ZfU0VROyAvL3BGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiU3RhcnQgU2VxID0gJTA4eFxuIiwgIHBGcmFtZS0+QmFTdGFydFNlcS5maWVsZC5TdGFydFNlcSkpOwotCi0JCWlmIChwRW50cnktPlJYQkFiaXRtYXAgJiAoMTw8VElEKSkKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBCQUVudHJ5LT5SRUNCQVRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQkFSZWNTZXNzaW9uSWRsZVRpbWVvdXQpLCBwQkFFbnRyeSwgVFJVRSk7Ci0JCX0KLQotCi0JCS8vIFNldCBCaXRtYXAgZmxhZy4KLQkJcEVudHJ5LT5SWEJBYml0bWFwIHw9ICgxPDxUSUQpOwotCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W1RJRF0gPSBJZHg7Ci0KLQkJcEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJj0gfigxPDxUSUQpOwotCi0JCS8vIFNldCBCQSBzZXNzaW9uIG1hc2sgaW4gV0NJRCB0YWJsZS4KLQkJUlRNUF9BRERfQkFfU0VTU0lPTl9UT19BU0lDKHBBZCwgcEVudHJ5LT5BaWQsIFRJRCk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNQUNFbnRyeVslZF1SWEJBYml0bWFwID0gMHgleC4gQkFSZWNXY2lkQXJyYXk9JWRcbiIsCi0JCQkJcEVudHJ5LT5BaWQsIHBFbnRyeS0+UlhCQWJpdG1hcCwgcEVudHJ5LT5CQVJlY1djaWRBcnJheVtUSURdKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVN0YXR1cyA9IEZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNhbid0IEFjY2VwdCBBRERCQSBmb3IgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggVElEID0gJWRcbiIsCi0JCQkJUFJJTlRfTUFDKHBFbnRyeS0+QWRkciksIFRJRCkpOwotCX0KLQlyZXR1cm4oU3RhdHVzKTsKLX0KLQotCi1CQV9SRUNfRU5UUlkgKkJBVGFibGVBbGxvY1JlY0VudHJ5KAotCQkJCQkJCQkgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJCQkgIE9VVCBVU0hPUlQgICAgICAgICAgKklkeCkKLXsKLQlpbnQgICAgICAgICAgICAgaTsKLQlCQV9SRUNfRU5UUlkgICAgKnBCQUVudHJ5ID0gTlVMTDsKLQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCi0JaWYgKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCA+PSBNQVhfQkFSRUNJX1NFU1NJT04pCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQkEgUmVjaXBlaW50IFNlc3Npb24gKCVsZCkgPiAlZFxuIiwKLQkJCQkJCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQsIE1BWF9CQVJFQ0lfU0VTU0lPTikpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLy8gcmVzZXJ2ZSBpZHggMCB0byBpZGVudGlmeSBCQVdjaWRBcnJheVtUSURdIGFzIGVtcHR5Ci0JZm9yIChpPTE7IGkgPCBNQVhfTEVOX09GX0JBX1JFQ19UQUJMRTsgaSsrKQotCXsKLQkJcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtpXTsKLQkJaWYgKChwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9PSBSZWNpcGllbnRfTk9ORSkpCi0JCXsKLQkJCS8vIGdldCBvbmUKLQkJCXBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCsrOwotCQkJcEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPSBSZWNpcGllbnRfVVNFRDsKLQkJCSpJZHggPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLWRvbmU6Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCXJldHVybiBwQkFFbnRyeTsKLX0KLQotQkFfT1JJX0VOVFJZICpCQVRhYmxlQWxsb2NPcmlFbnRyeSgKLQkJCQkJCQkJICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCQkJICBPVVQgVVNIT1JUICAgICAgICAgICpJZHgpCi17Ci0JaW50ICAgICAgICAgICAgIGk7Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQlpZiAocEFkLT5CQVRhYmxlLm51bUFzT3JpZ2luYXRvciA+PSAoTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQotCXsKLQkJZ290byBkb25lOwotCX0KLQotCS8vIHJlc2VydmUgaWR4IDAgdG8gaWRlbnRpZnkgQkFXY2lkQXJyYXlbVElEXSBhcyBlbXB0eQotCWZvciAoaT0xOyBpPE1BWF9MRU5fT0ZfQkFfT1JJX1RBQkxFOyBpKyspCi0JewotCQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W2ldOwotCQlpZiAoKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfTk9ORSkpCi0JCXsKLQkJCS8vIGdldCBvbmUKLQkJCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IrKzsKLQkJCXBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9VU0VEOwotCQkJcEJBRW50cnktPnBBZGFwdGVyID0gcEFkOwotCQkJKklkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotZG9uZToKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JcmV0dXJuIHBCQUVudHJ5OwotfQotCi0KLVZPSUQgQkFUYWJsZUZyZWVPcmlFbnRyeSgKLQkJCQkJCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJSU4gIFVMT05HICAgICAgICAgICBJZHgpCi17Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeSA9IE5VTEw7Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQotCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQotCQlyZXR1cm47Ci0KLQlwQkFFbnRyeSA9JnBBZC0+QkFUYWJsZS5CQU9yaUVudHJ5W0lkeF07Ci0KLQlpZiAocEJBRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQotCXsKLQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOwotCQlwRW50cnktPkJBT3JpV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKLQotCi0JCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQkJaWYgKHBCQUVudHJ5LT5PUklfQkFfU3RhdHVzID09IE9yaWdpbmF0b3JfRG9uZSkKLQkJewotCQkJcEFkLT5CQVRhYmxlLm51bURvbmVPcmlnaW5hdG9yIC09IDE7Ci0JCQlwRW50cnktPlRYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpICkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFUYWJsZUZyZWVPcmlFbnRyeSBudW1Bc09yaWdpbmF0b3I9ICVsZFxuIiwgcEFkLT5CQVRhYmxlLm51bUFzUmVjaXBpZW50KSk7Ci0JCQkvLyBFcmFzZSBCaXRtYXAgZmxhZy4KLQkJfQotCi0JCUFTU0VSVChwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yICE9IDApOwotCi0JCXBBZC0+QkFUYWJsZS5udW1Bc09yaWdpbmF0b3IgLT0gMTsKLQotCQlwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9IE9yaWdpbmF0b3JfTk9ORTsKLQkJcEJBRW50cnktPlRva2VuID0gMDsKLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCX0KLX0KLQotCi1WT0lEIEJBVGFibGVGcmVlUmVjRW50cnkoCi0JCQkJCQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQkJCQkJCUlOICBVTE9ORyAgICAgICAgICAgSWR4KQotewotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSBOVUxMOwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0KLQlpZiAoKElkeCA9PSAwKSB8fCAoSWR4ID49IE1BWF9MRU5fT0ZfQkFfUkVDX1RBQkxFKSkKLQkJcmV0dXJuOwotCi0JcEJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCi0JaWYgKHBCQUVudHJ5LT5SRUNfQkFfU3RhdHVzICE9IFJlY2lwaWVudF9OT05FKQotCXsKLQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOwotCQlwRW50cnktPkJBUmVjV2NpZEFycmF5W3BCQUVudHJ5LT5USURdID0gMDsKLQotCQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0KLQkJQVNTRVJUKHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCAhPSAwKTsKLQotCQlwQWQtPkJBVGFibGUubnVtQXNSZWNpcGllbnQgLT0gMTsKLQotCQlwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cyA9IFJlY2lwaWVudF9OT05FOwotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JfQotfQotCi0KLVZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCi0JCQkJCQkgSU4gT1VUICBQUlRNUF9BREFQVEVSICAgcEFkLAotCQkJCQkJIElOICAgICAgVUNIQVIgICAgICAgICAgIFdjaWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgVElELAotCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJQYXNzaXZlLAotCQkJCQkJIElOICAgICAgQk9PTEVBTiAgICAgICAgIGJGb3JjZVNlbmQpCi17Ci0JVUxPTkcgICAgICAgICAgIElkeCA9IDA7Ci0JQkFfT1JJX0VOVFJZICAgICpwQkFFbnRyeTsKLQlCT09MRUFOICAgICAgICAgQ2FuY2VsbGVkOwotCi0JaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8KLQkvLyBMb2NhdGUgY29ycmVzcG9uZGluZyBCQSBPcmlnaW5hdG9yIEVudHJ5IGluIEJBIFRhYmxlIHdpdGggdGhlIChwQWRkcixUSUQpLgotCS8vCi0JSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQU9yaVdjaWRBcnJheVtUSURdOwotCWlmICgoSWR4ID09IDApIHx8IChJZHggPj0gTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUpKQotCXsKLQkJaWYgKGJGb3JjZVNlbmQgPT0gVFJVRSkKLQkJewotCQkJLy8gZm9yY2Ugc2VuZCBzcGVjaWZpZWQgVElEIERlbEJBCi0JCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQkJaWYgKEVsZW0gIT0gTlVMTCkKLQkJCXsKLQkJCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJCU5kaXNaZXJvTWVtb3J5KEVsZW0sIHNpemVvZihNTE1FX1FVRVVFX0VMRU0pKTsKLQotCQkJCUNPUFlfTUFDX0FERFIoRGVsYmFSZXEuQWRkciwgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLQkJCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCQlEZWxiYVJlcS5USUQgPSBUSUQ7Ci0JCQkJRGVsYmFSZXEuSW5pdGlhdG9yID0gT1JJR0lOQVRPUjsKLQkJCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJa2ZyZWUoRWxlbSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoYkZvcmNlU2VuZCk6YWxsb2MgbWVtb3J5IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+V2NpZD0lZC5USUQ9JWQgXG4iLCBfX0ZVTkNUSU9OX18sIFdjaWQsIFRJRCkpOwotCi0JcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbSWR4XTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIE9SSV9CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cykpOwotCS8vCi0JLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCi0JLy8KLQlpZiAoKGJQYXNzaXZlID09IEZBTFNFKSAmJiAoVElEID09IHBCQUVudHJ5LT5USUQpICYmIChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX0RvbmUpKQotCXsKLQkJTUxNRV9ERUxCQV9SRVFfU1RSVUNUICAgRGVsYmFSZXE7Ci0JCU1MTUVfUVVFVUVfRUxFTSAqRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotCQlpZiAoRWxlbSAhPSBOVUxMKQotCQl7Ci0JCQlOZGlzWmVyb01lbW9yeSgmRGVsYmFSZXEsIHNpemVvZihEZWxiYVJlcSkpOwotCQkJTmRpc1plcm9NZW1vcnkoRWxlbSwgc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSkpOwotCi0JCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7Ci0JCQlEZWxiYVJlcS5XY2lkID0gV2NpZDsKLQkJCURlbGJhUmVxLlRJRCA9IHBCQUVudHJ5LT5USUQ7Ci0JCQlEZWxiYVJlcS5Jbml0aWF0b3IgPSBPUklHSU5BVE9SOwotCQkJRWxlbS0+TXNnTGVuICA9IHNpemVvZihEZWxiYVJlcSk7Ci0JCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQlNbG1lREVMQkFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWtmcmVlKEVsZW0pOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+T1JJQkFUaW1lciwgJkNhbmNlbGxlZCk7Ci0JQkFUYWJsZUZyZWVPcmlFbnRyeShwQWQsIElkeCk7Ci0KLQlpZiAoYlBhc3NpdmUpCi0JewotCQkvL0JBT3JpU2Vzc2lvblNldFVwKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIFRJRCwgMCwgMTAwMDAsIFRSVUUpOwotCX0KLX0KLQotVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKLQkJCQkJCSBJTiBPVVQgIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiAgICAgICAgICAgV2NpZCwKLQkJCQkJCSBJTiAgICAgIFVDSEFSICAgICAgICAgICBUSUQsCi0JCQkJCQkgSU4gICAgICBCT09MRUFOICAgICAgICAgYlBhc3NpdmUpCi17Ci0JVUxPTkcgICAgICAgICAgIElkeCA9IDA7Ci0JQkFfUkVDX0VOVFJZICAgICpwQkFFbnRyeTsKLQotCWlmIChXY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCS8vCi0JLy8gIExvY2F0ZSBjb3JyZXNwb25kaW5nIEJBIE9yaWdpbmF0b3IgRW50cnkgaW4gQkEgVGFibGUgd2l0aCB0aGUgKHBBZGRyLFRJRCkuCi0JLy8KLQlJZHggPSBwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLkJBUmVjV2NpZEFycmF5W1RJRF07Ci0JaWYgKElkeCA9PSAwKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiVzPT09PldjaWQ9JWQuVElEPSVkIFxuIiwgX19GVU5DVElPTl9fLCBXY2lkLCBUSUQpKTsKLQotCi0JcEJBRW50cnkgPSAmcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbSWR4XTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlx0PT09PklkeCA9ICVsZCwgV2NpZD0lZC5USUQ9JWQsIFJFQ19CQV9TdGF0dXMgPSAlZCBcbiIsIElkeCwgV2NpZCwgVElELCBwQkFFbnRyeS0+UkVDX0JBX1N0YXR1cykpOwotCS8vCi0JLy8gUHJlcGFyZSBEZWxCQSBhY3Rpb24gZnJhbWUgYW5kIHNlbmQgdG8gdGhlIHBlZXIuCi0JLy8KLQlpZiAoKFRJRCA9PSBwQkFFbnRyeS0+VElEKSAmJiAocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCi0JewotCQlNTE1FX0RFTEJBX1JFUV9TVFJVQ1QgICBEZWxiYVJlcTsKLQkJQk9PTEVBTgkJCQkJQ2FuY2VsbGVkOwotCQkvL1VMT05HICAgb2Zmc2V0OwotCQkvL1VJTlQzMiAgVkFMVUU7Ci0KLQkJUlRNUENhbmNlbFRpbWVyKCZwQkFFbnRyeS0+UkVDQkFUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkJLy8KLQkJLy8gMS4gU2VuZCBERUxCQSBBY3Rpb24gRnJhbWUKLQkJLy8KLQkJaWYgKGJQYXNzaXZlID09IEZBTFNFKQotCQl7Ci0JCQlNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJCWlmIChFbGVtICE9IE5VTEwpCi0JCQl7Ci0JCQkJTmRpc1plcm9NZW1vcnkoJkRlbGJhUmVxLCBzaXplb2YoRGVsYmFSZXEpKTsKLQkJCQlOZGlzWmVyb01lbW9yeShFbGVtLCBzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSk7Ci0KLQkJCQlDT1BZX01BQ19BRERSKERlbGJhUmVxLkFkZHIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQWRkcik7Ci0JCQkJRGVsYmFSZXEuV2NpZCA9IFdjaWQ7Ci0JCQkJRGVsYmFSZXEuVElEID0gVElEOwotCQkJCURlbGJhUmVxLkluaXRpYXRvciA9IFJFQ0lQSUVOVDsKLQkJCQlFbGVtLT5Nc2dMZW4gID0gc2l6ZW9mKERlbGJhUmVxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShFbGVtLT5Nc2csICZEZWxiYVJlcSwgc2l6ZW9mKERlbGJhUmVxKSk7Ci0JCQkJTWxtZURFTEJBQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQkJa2ZyZWUoRWxlbSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQotCQkvLwotCQkvLyAyLiBGcmVlIHJlc291cmNlIG9mIEJBIHNlc3Npb24KLQkJLy8KLQkJLy8gZmx1c2ggYWxsIHBlbmRpbmcgcmVvcmRlcmluZyBtcGR1cwotCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0KLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCi0JCS8vIEVyYXNlIEJpdG1hcCBmbGFnLgotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFJFU0VUX1JDVl9TRVE7Ci0JCXBCQUVudHJ5LT5CQVdpblNpemUgPSAwOwotCQkvLyBFcmFzZSBCaXRtYXAgZmxhZyBhdCBzb2Z0d2FyZSBtYWN0YWJsZQotCQlwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLlJYQkFiaXRtYXAgJj0gKH4oMTw8KHBCQUVudHJ5LT5USUQpKSk7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXSA9IDA7Ci0KLQkJUlRNUF9ERUxfQkFfU0VTU0lPTl9GUk9NX0FTSUMocEFkLCBXY2lkLCBUSUQpOwotCi0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQotCX0KLQotCUJBVGFibGVGcmVlUmVjRW50cnkocEFkLCBJZHgpOwotfQotCi1WT0lEIEJBU2Vzc2lvblRlYXJEb3duQUxMKAotCQkJCQkJIElOIE9VVCAgUFJUTVBfQURBUFRFUiBwQWQsCi0JCQkJCQkgSU4gICAgICBVQ0hBUiBXY2lkKQotewotCWludCBpOwotCi0JZm9yIChpPTA7IGk8TlVNX09GX1RJRDsgaSsrKQotCXsKLQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBXY2lkLCBpLCBGQUxTRSwgRkFMU0UpOwotCQlCQVJlY1Nlc3Npb25UZWFyRG93bihwQWQsIFdjaWQsIGksIEZBTFNFKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZXRyeSBzZW5kaW5nIEFEREJBIFJlcWVzdC4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JUGFyYW1ldHJzOgotCXA4MDIzSGVhZGVyOiBpZiB0aGlzIGlzIGFscmVhZHkgODAyLjMgZm9ybWF0LCBwODAyM0hlYWRlciBpcyBOVUxMCi0KLQlSZXR1cm4JOiBUUlVFIGlmIHB1dCBpbnRvIHJ4IHJlb3JkZXJpbmcgYnVmZmVyLCBzaG91bGRuJ3QgaW5kaWNhdGVyeGhlcmUuCi0JCQkJRkFMU0UgLCB0aGVuIGNvbnRpbnVlIGluZGljYXRlcnggYXQgdGhpcyBtb21lbnQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBCQU9yaVNlc3Npb25TZXR1cFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCUJBX09SSV9FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfT1JJX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCVBSVE1QX0FEQVBURVIgICBwQWQ7Ci0KLQlpZiAocEJBRW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JcEFkID0gcEJBRW50cnktPnBBZGFwdGVyOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCi0JCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBRW50cnktPldjaWRdOwotCi0JaWYgKChwQkFFbnRyeS0+T1JJX0JBX1N0YXR1cyA9PSBPcmlnaW5hdG9yX1dhaXRSZXMpICYmIChwQkFFbnRyeS0+VG9rZW4gPCBPUklfU0VTU0lPTl9NQVhfUkVUUlkpKQotCXsKLQkJTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgIEFkZGJhUmVxOwotCi0JCU5kaXNaZXJvTWVtb3J5KCZBZGRiYVJlcSwgc2l6ZW9mKEFkZGJhUmVxKSk7Ci0JCUNPUFlfTUFDX0FERFIoQWRkYmFSZXEucEFkZHIsIHBFbnRyeS0+QWRkcik7Ci0JCUFkZGJhUmVxLldjaWQgPSAoVUNIQVIpKHBFbnRyeS0+QWlkKTsKLQkJQWRkYmFSZXEuVElEID0gcEJBRW50cnktPlRJRDsKLQkJQWRkYmFSZXEuQmFCdWZTaXplID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdDsKLQkJQWRkYmFSZXEuVGltZU91dFZhbHVlID0gMDsKLQkJQWRkYmFSZXEuVG9rZW4gPSBwQkFFbnRyeS0+VG9rZW47Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQUNUSU9OX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0FERF9CQV9DQVRFLCBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSwgKFBWT0lEKSZBZGRiYVJlcSk7Ci0JCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgT3JpIFNlc3Npb24gVGltZW91dCglZCkgOiBTZW5kIEFERCBCQSBhZ2FpblxuIiwgcEJBRW50cnktPlRva2VuKSk7Ci0KLQkJcEJBRW50cnktPlRva2VuKys7Ci0JCVJUTVBTZXRUaW1lcigmcEJBRW50cnktPk9SSUJBVGltZXIsIE9SSV9CQV9TRVNTSU9OX1RJTUVPVVQpOwotCX0KLQllbHNlCi0JewotCQlCQVRhYmxlRnJlZU9yaUVudHJ5KHBBZCwgcEVudHJ5LT5CQU9yaVdjaWRBcnJheVtwQkFFbnRyeS0+VElEXSk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVJldHJ5IHNlbmRpbmcgQUREQkEgUmVxZXN0LgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlQYXJhbWV0cnM6Ci0JcDgwMjNIZWFkZXI6IGlmIHRoaXMgaXMgYWxyZWFkeSA4MDIuMyBmb3JtYXQsIHA4MDIzSGVhZGVyIGlzIE5VTEwKLQotCVJldHVybgk6IFRSVUUgaWYgcHV0IGludG8gcnggcmVvcmRlcmluZyBidWZmZXIsIHNob3VsZG4ndCBpbmRpY2F0ZXJ4aGVyZS4KLQkJCQlGQUxTRSAsIHRoZW4gY29udGludWUgaW5kaWNhdGVyeCBhdCB0aGlzIG1vbWVudC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEJBUmVjU2Vzc2lvbklkbGVUaW1lb3V0KAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLSAgICBJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQotCUJBX1JFQ19FTlRSWSAgICAqcEJBRW50cnkgPSAoQkFfUkVDX0VOVFJZICopRnVuY3Rpb25Db250ZXh0OwotCVBSVE1QX0FEQVBURVIgICBwQWQ7Ci0JVUxPTkcgICAgICAgICAgIE5vdzMyOwotCi0JaWYgKHBCQUVudHJ5ID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmICgocEJBRW50cnktPlJFQ19CQV9TdGF0dXMgPT0gUmVjaXBpZW50X0FjY2VwdCkpCi0JewotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3czMik7Ci0KLQkJaWYgKFJUTVBfVElNRV9BRlRFUigodW5zaWduZWQgbG9uZylOb3czMiwgKHVuc2lnbmVkIGxvbmcpKHBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciArIFJFQ19CQV9TRVNTSU9OX0lETEVfVElNRU9VVCkpKQotCQl7Ci0JCQlwQWQgPSBwQkFFbnRyeS0+cEFkYXB0ZXI7Ci0JCQkvLyBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCi0JCQliYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJWxkOiBSRUMgQkEgc2Vzc2lvbiBUaW1lb3V0XG4iLCBOb3czMikpOwotCQl9Ci0JfQotfQotCi0KLVZPSUQgUGVlckFkZEJBUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQotewotCS8vCTcuNC40LjEKLQkvL1VMT05HCUlkeDsKLQlVQ0hBUiAgIFN0YXR1cyA9IDE7Ci0JVUNIQVIgICBwQWRkcls2XTsKLQlGUkFNRV9BRERCQV9SU1AgQUREZnJhbWU7Ci0JUFVDSEFSICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JTkRJU19TVEFUVVMgICAgIE5TdGF0dXM7Ci0JUEZSQU1FX0FEREJBX1JFUSAgcEFkZHJlcUZyYW1lID0gTlVMTDsKLQkvL1VDSEFSCQlCdWZTaXplOwotCVVMT05HICAgICAgIEZyYW1lTGVuOwotCVBVTE9ORyAgICAgIHB0ZW1wOwotCVBNQUNfVEFCTEVfRU5UUlkJcE1hY0VudHJ5OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgPT0+IChXY2lkID0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIEVsZW0tPldjaWQpKTsKLQotCS8vaGV4X2R1bXAoIkFkZEJBUmVxIiwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pOwotCi0JLy9BRERCQSBSZXF1ZXN0IGZyb20gdW5rbm93biBwZWVyLCBpZ25vcmUgdGhpcy4KLQlpZiAoRWxlbS0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuOwotCi0JcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF07Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJBZGRCQVJlcUFjdGlvbi0tLS0+IFxuIikpOwotCXB0ZW1wID0gKFBVTE9ORylFbGVtLT5Nc2c7Ci0JLy9EQkdQUklOVF9SQVcoUlRfREVCVUdfRU1VLCAoIiUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eDo6ICUwOHg6OiAlMDh4OjogJTA4eFxuIiwgKihwdGVtcCksICoocHRlbXArMSksICoocHRlbXArMiksICoocHRlbXArMyksICoocHRlbXArNCksICoocHRlbXArNSksICoocHRlbXArNiksICoocHRlbXArNyksICoocHRlbXArOCkpKTsKLQotCWlmIChQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgcEFkZHIpKQotCXsKLQotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPT0gRkFMU0UpICYmIElTX0hUX1NUQShwTWFjRW50cnkpKQotCQl7Ci0JCQlwQWRkcmVxRnJhbWUgPSAoUEZSQU1FX0FEREJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiUmN2IFdjaWQoJWQpIEFkZEJBUmVxXG4iLCBFbGVtLT5XY2lkKSk7Ci0JCQlpZiAoQkFSZWNTZXNzaW9uQWRkKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0sIHBBZGRyZXFGcmFtZSkpCi0JCQkJU3RhdHVzID0gMDsKLQkJCWVsc2UKLQkJCQlTdGF0dXMgPSAzODsgLy8gbW9yZSBwYXJhbWV0ZXJzIGhhdmUgaW52YWxpZCB2YWx1ZXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCVN0YXR1cyA9IDM3OyAvLyB0aGUgcmVxdWVzdCBoYXMgYmVlbiBkZWNsaW5lZC4KLQkJfQotCX0KLQotCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlZhbGlkQXNDTEkpCi0JCUFTU0VSVChwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLlNzdCA9PSBTU1RfQVNTT0MpOwotCi0JcEFkZHJlcUZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKCZFbGVtLT5Nc2dbMF0pOwotCS8vIDIuIEFsd2F5cyBzZW5kIGJhY2sgQUREQkEgUmVzcG9uc2UKLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwkgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFDVElPTiAtIFBlZXJCQUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeSgmQUREZnJhbWUsIHNpemVvZihGUkFNRV9BRERCQV9SU1ApKTsKLQkvLyAyLTEuIFByZXBhcmUgQUREQkEgUmVzcG9uc2UgZnJhbWUuCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmIChBREhPQ19PTihwQWQpKQotCQkJQWN0SGVhZGVySW5pdChwQWQsICZBRERmcmFtZS5IZHIsIHBBZGRyLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCWVsc2UKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbRWxlbS0+V2NpZF0uVmFsaWRBc0RscykKLQkJCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWRkciwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCUFjdEhlYWRlckluaXQocEFkLCAmQUREZnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkZHIpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlBRERmcmFtZS5DYXRlZ29yeSA9IENBVEVHT1JZX0JBOwotCUFERGZyYW1lLkFjdGlvbiA9IEFEREJBX1JFU1A7Ci0JQUREZnJhbWUuVG9rZW4gPSBwQWRkcmVxRnJhbWUtPlRva2VuOwotCS8vIFdoYXQgaXMgdGhlIFN0YXR1cyBjb2RlPz8gIG5lZWQgdG8gY2hlY2suCi0JQUREZnJhbWUuU3RhdHVzQ29kZSA9IFN0YXR1czsKLQlBRERmcmFtZS5CYVBhcm0uQkFQb2xpY3kgPSBJTU1FRF9CQTsKLQlBRERmcmFtZS5CYVBhcm0uQU1TRFVTdXBwb3J0ZWQgPSAwOwotCUFERGZyYW1lLkJhUGFybS5USUQgPSBwQWRkcmVxRnJhbWUtPkJhUGFybS5USUQ7Ci0JQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSBtaW4oKChVQ0hBUilwQWRkcmVxRnJhbWUtPkJhUGFybS5CdWZTaXplKSwgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwotCWlmIChBRERmcmFtZS5CYVBhcm0uQnVmU2l6ZSA9PSAwKQotCXsKLQkJQUREZnJhbWUuQmFQYXJtLkJ1ZlNpemUgPSA2NDsKLQl9Ci0JQUREZnJhbWUuVGltZU91dFZhbHVlID0gMDsgLy9wQWRkcmVxRnJhbWUtPlRpbWVPdXRWYWx1ZTsKLQotCSooVVNIT1JUICopKCZBRERmcmFtZS5CYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFERGZyYW1lLkJhUGFybSkpOwotCUFERGZyYW1lLlN0YXR1c0NvZGUgPSBjcHUybGUxNihBRERmcmFtZS5TdGF0dXNDb2RlKTsKLQlBRERmcmFtZS5UaW1lT3V0VmFsdWUgPSBjcHUybGUxNihBRERmcmFtZS5UaW1lT3V0VmFsdWUpOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEZSQU1FX0FEREJBX1JTUCksICAmQUREZnJhbWUsCi0JCQkgIEVORF9PRl9BUkdTKTsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyglZCk6IFRJRCglZCksIEJ1ZlNpemUoJWQpIDw9PSBcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCwgQUREZnJhbWUuQmFQYXJtLlRJRCwKLQkJCQkJCQkgIEFERGZyYW1lLkJhUGFybS5CdWZTaXplKSk7Ci19Ci0KLQotVk9JRCBQZWVyQWRkQkFSc3BBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotCi17Ci0JLy9VQ0hBUgkJSWR4LCBpOwotCS8vUFVDSEFSCQkgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlQRlJBTUVfQUREQkFfUlNQICAgIHBGcmFtZSA9IE5VTEw7Ci0JLy9QQkFfT1JJX0VOVFJZCQlwQkFFbnRyeTsKLQotCS8vQUREQkEgUmVzcG9uc2UgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgotCWlmIChFbGVtLT5XY2lkID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA9PT4gV2NpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgRWxlbS0+V2NpZCkpOwotCi0JLy9oZXhfZHVtcCgiUGVlckFkZEJBUnNwQWN0aW9uKCkiLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbik7Ci0KLQlpZiAoUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4pKQotCXsKLQkJcEZyYW1lID0gKFBGUkFNRV9BRERCQV9SU1ApKCZFbGVtLT5Nc2dbMF0pOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlx0XHQgU3RhdHVzQ29kZSA9ICVkXG4iLCBwRnJhbWUtPlN0YXR1c0NvZGUpKTsKLQkJc3dpdGNoIChwRnJhbWUtPlN0YXR1c0NvZGUpCi0JCXsKLQkJCWNhc2UgMDoKLQkJCQkvLyBJIHdhbnQgYSBCQXNlc3Npb24gd2l0aCB0aGlzIHBlZXIgYXMgYW4gb3JpZ2luYXRvci4KLQkJCQlCQU9yaVNlc3Npb25BZGQocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtFbGVtLT5XY2lkXSwgcEZyYW1lKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJLy8gY2hlY2sgc3RhdHVzID09IFVTRUQgPz8/Ci0JCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBFbGVtLT5XY2lkLCBwRnJhbWUtPkJhUGFybS5USUQsIFRSVUUsIEZBTFNFKTsKLQkJCQlicmVhazsKLQkJfQotCQkvLyBSY3YgRGVjbGluZSBTdGF0dXNDb2RlCi0JCWlmICgocEZyYW1lLT5TdGF0dXNDb2RlID09IDM3KQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgICAgICAgICAgfHwgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiBTVEFfVEdOX1dJRklfT04ocEFkKSAmJiAocEZyYW1lLT5TdGF0dXNDb2RlICE9IDApKQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotICAgICAgICAgICAgKQotCQl7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0VsZW0tPldjaWRdLkJBRGVjbGluZUJpdG1hcCB8PSAxPDxwRnJhbWUtPkJhUGFybS5USUQ7Ci0JCX0KLQl9Ci19Ci0KLVZPSUQgUGVlckRlbEJBQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLQotewotCS8vVUNIQVIJCQkJSWR4OwotCS8vUFVDSEFSCQkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCVBGUkFNRV9ERUxCQV9SRVEgICAgcERlbEZyYW1lID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXMgPT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkvL0RFTEJBIFJlcXVlc3QgZnJvbSB1bmtub3duIHBlZXIsIGlnbm9yZSB0aGlzLgotCWlmIChQZWVyRGVsQkFBY3Rpb25TYW5pdHkocEFkLCBFbGVtLT5XY2lkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbikpCi0JewotCQlwRGVsRnJhbWUgPSAoUEZSQU1FX0RFTEJBX1JFUSkoJkVsZW0tPk1zZ1swXSk7Ci0JCWlmIChwRGVsRnJhbWUtPkRlbGJhUGFybS5Jbml0aWF0b3IgPT0gT1JJR0lOQVRPUikKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJCQSAtIFBlZXJEZWxCQUFjdGlvbi0tLS0+IE9SSUdJTkFUT1JcbiIpKTsKLQkJCUJBUmVjU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQkEgLSBQZWVyRGVsQkFBY3Rpb24tLS0tPiBSRUNJUElFTlQsIFJlYXNvbiA9ICVkXG4iLCAgcERlbEZyYW1lLT5SZWFzb25Db2RlKSk7Ci0JCQkvL2hleF9kdW1wKCJEZWxCQSBGcmFtZSIsIHBEZWxGcmFtZSwgRWxlbS0+TXNnTGVuKTsKLQkJCUJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgRWxlbS0+V2NpZCwgcERlbEZyYW1lLT5EZWxiYVBhcm0uVElELCBUUlVFLCBGQUxTRSk7Ci0JCX0KLQl9Ci19Ci0KLQotQk9PTEVBTiBDbnRsRW5xdWV1ZUZvclJlY3YoCi0JCQkJCQkgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQkJCQkJCSAgSU4gVUxPTkcJCQkJV2NpZCwKLQkJCQkJCSAgSU4gVUxPTkcJCQkJTXNnTGVuLAotCQkJCQkJICBJTiBQRlJBTUVfQkFfUkVRCQlwTXNnKQotewotCVBGUkFNRV9CQV9SRVEgICBwRnJhbWUgPSBwTXNnOwotCS8vUFJUTVBfUkVPUkRFUkJVRglwQnVmZmVyOwotCS8vUFJUTVBfUkVPUkRFUkJVRglwRG1hQnVmOwotCVBCQV9SRUNfRU5UUlkgcEJBRW50cnk7Ci0JLy9CT09MRUFOCVJlc3VsdDsKLQlVTE9ORyAgIElkeDsKLQkvL1VDSEFSCU51bVJ4UGt0OwotCVVDSEFSCVRJRDsvLywgaTsKLQotCVRJRCA9IChVQ0hBUilwRnJhbWUtPkJBUkNvbnRyb2wuVElEOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKTogQkFSLVdjaWQoJWxkKSwgVGlkICglZClcbiIsIF9fRlVOQ1RJT05fXywgV2NpZCwgVElEKSk7Ci0JLy9oZXhfZHVtcCgiQkFSIiwgKFBDSEFSKSBwRnJhbWUsIE1zZ0xlbik7Ci0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiQ250bEVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCi0JewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmIChNc2dMZW4gIT0gc2l6ZW9mKEZSQU1FX0JBX1JFUSkpCi0JewotCQlEQkdQUklOVF9FUlIoKCJDbnRsRW5xdWV1ZUZvclJlY3Y6IEJsb2NrQWNrIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmICgoV2NpZCA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKSAmJiAoVElEIDwgOCkpCi0JCXsKLQkJLy8gaWYgdGhpcyByZWNlaXZpbmcgcGFja2V0IGlzIGZyb20gU0EgdGhhdCBpcyBpbiBvdXIgT3JpRW50cnkuIFNpbmNlIFdDSUQgPDkgaGFzIGRpcmVjdCBtYXBwaW5nLiBubyBuZWVkIHNlYXJjaC4KLQkJSWR4ID0gcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5CQVJlY1djaWRBcnJheVtUSURdOwotCQlwQkFFbnRyeSA9ICZwQWQtPkJBVGFibGUuQkFSZWNFbnRyeVtJZHhdOwotCQl9Ci0JCWVsc2UKLQkJewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQkFSKCVsZCkgOiBUaWQgKCVkKSAtICUwNHg6JTA0eFxuIiwgV2NpZCwgVElELCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxICkpOwotCi0JaWYgKFNFUV9TTUFMTEVSKHBCQUVudHJ5LT5MYXN0SW5kU2VxLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIE1BWFNFUSkpCi0JewotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJBUiBTZXEgPSAleCwgTGFzdEluZFNlcSA9ICV4XG4iLCBwRnJhbWUtPkJBU3RhcnRpbmdTZXEuZmllbGQuU3RhcnRTZXEsIHBCQUVudHJ5LT5MYXN0SW5kU2VxKSk7Ci0JCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSk7Ci0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gKHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSA9PSAwKSA/IE1BWFNFUSA6KHBGcmFtZS0+QkFTdGFydGluZ1NlcS5maWVsZC5TdGFydFNlcSAtMSk7Ci0JfQotCS8vYmFfcmVmcmVzaF9yZW9yZGVyaW5nX21wZHVzKHBBZCwgcEJBRW50cnkpOwotCXJldHVybiBUUlVFOwotfQotCi0vKgotRGVzY3JpcHRpb24gOiBTZW5kIFBTTVAgQWN0aW9uIGZyYW1lIElmIFBTTVAgbW9kZSBzd2l0Y2hlcy4KLSovCi1WT0lEIFNlbmRQU01QQWN0aW9uKAotCQkJCSAgIElOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQkJCQkgICBJTiBVQ0hBUgkJCQlXY2lkLAotCQkJCSAgIElOIFVDSEFSCQkJCVBzbXApCi17Ci0JUFVDSEFSICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgICBOU3RhdHVzOwotCS8vVUxPTkcgICAgICAgICAgIElkeDsKLQlGUkFNRV9QU01QX0FDVElPTiAgIEZyYW1lOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbjsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7CSAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQkEgLSBNbG1lQUREQkFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQlyZXR1cm47Ci0JfQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCUFjdEhlYWRlckluaXQocEFkLCAmRnJhbWUuSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXS5BZGRyKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUZyYW1lLkNhdGVnb3J5ID0gQ0FURUdPUllfSFQ7Ci0JRnJhbWUuQWN0aW9uID0gU01QU19BQ1RJT047Ci0Jc3dpdGNoIChQc21wKQotCXsKLQkJY2FzZSBNTVBTX0VOQUJMRToKLSNpZmRlZiBSVDMweHgKLQkJCWlmIChJU19SVDMweHgocEFkKQotCQkJCSYmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGg+MXx8cEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aD4xKSkKLQkJCXsKLQkJCQlSVE1QX0FTSUNfTU1QU19ESVNBQkxFKHBBZCk7Ci0JCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCQlGcmFtZS5Qc21wID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE1NUFNfRFlOQU1JQzoKLQkJCUZyYW1lLlBzbXAgPSAzOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU1QU19TVEFUSUM6Ci0jaWZkZWYgUlQzMHh4Ci0JCQlpZiAoSVNfUlQzMHh4KHBBZCkKLQkJCQkmJihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoPjF8fHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGg+MSkpCi0JCQl7Ci0JCQkJUlRNUF9BU0lDX01NUFNfRU5BQkxFKHBBZCk7Ci0JCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCQlGcmFtZS5Qc21wID0gMTsKLQkJCWJyZWFrOwotCX0KLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoRlJBTUVfUFNNUF9BQ1RJT04pLCAgICAgICZGcmFtZSwKLQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiSFQgLSBTZW5kUFNNUEFjdGlvbiggJWQgKSAgXG4iLCBGcmFtZS5Qc21wKSk7Ci19Ci0KLQotI2RlZmluZSBSQURJT19NRUFTVVJFTUVOVF9SRVFVRVNUX0FDVElPTgkwCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRAotewotCVVDSEFSCVJlZ3VsYXRvcnlDbGFzczsKLQlVQ0hBUglDaGFubmVsTnVtYmVyOwotCVVTSE9SVAlSYW5kb21JbnRlcnZhbDsKLQlVU0hPUlQJTWVhc3VyZW1lbnREdXJhdGlvbjsKLQlVQ0hBUglNZWFzdXJlbWVudE1vZGU7Ci0JVUNIQVIgICBCU1NJRFtNQUNfQUREUl9MRU5dOwotCVVDSEFSCVJlcG9ydGluZ0NvbmRpdGlvbjsKLQlVQ0hBUglUaHJlc2hvbGQ7Ci0JVUNIQVIgICBTU0lESUVbMl07CQkJLy8gMiBieXRlCi19IEJFQUNPTl9SRVFVRVNUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQKLXsKLQlVQ0hBUglJRDsKLQlVQ0hBUglMZW5ndGg7Ci0JVUNIQVIJVG9rZW47Ci0JVUNIQVIJUmVxdWVzdE1vZGU7Ci0JVUNIQVIJVHlwZTsKLX0gTUVBU1VSRU1FTlRfUkVROwotCi0KLQotCi12b2lkIGNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0JUE5ESVNfUEFDS0VUCXBSeFBrdDsKLQlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107Ci0KLQkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCi0JLy8gMi4gcmVtb3ZlIExMQwotCS8vCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAotCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlBU1NFUlQocFJ4QmxrLT5wUnhQYWNrZXQpOwotCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKLQotCVNFVF9PU19QS1RfTkVUREVWKHBSeFBrdCwgZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpKTsKLQlTRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGt0LCBwUnhCbGstPnBEYXRhKTsKLQlTRVRfT1NfUEtUX0xFTihwUnhQa3QsIHBSeEJsay0+RGF0YVNpemUpOwotCVNFVF9PU19QS1RfREFUQVRBSUwocFJ4UGt0LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplKTsKLQotCS8vCi0JLy8gY29weSA4MDIuMyBoZWFkZXIsIGlmIG5lY2Vzc2FyeQotCS8vCi0JaWYgKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0FNU0RVKSkKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotI2lmZGVmIExJTlVYCi0JCQlOZGlzTW92ZU1lbW9yeShza2JfcHVzaChwUnhQa3QsIExFTkdUSF84MDJfMyksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOwotI2VuZGlmCi0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci19Ci0KLQotI2RlZmluZSBJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKQkJXAotCWRvCQkJCQkJCQkJCQkJCQkJCQlcCi0JewkJCQkJCQkJCQkJCQkJCQkJXAotCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9BTVNEVSkpCQkJCQkJXAotCXsJCQkJCQkJCQkJCQkJCQkJXAotCQlJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKLQl9CQkJCQkJCQkJCQkJCQkJCVwKLQkJZWxzZSBpZiAoUlhfQkxLX1RFU1RfRkxBRyhfcFJ4QmxrLCBmUlhfRUFQKSkJCQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJCQlcCi0JCQlJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoX3BBZCwgX3BSeEJsaywgX2Zyb21XaGljaEJTU0lEKTsJCVwKLQkJfQkJCQkJCQkJCQkJCQkJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCVwKLQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChfcEFkLCBfcFJ4QmxrLCBfZnJvbVdoaWNoQlNTSUQpOwkJXAotCX0JCQkJCQkJCQkJCQkJCQkJXAotCX0gd2hpbGUgKDApOwotCi0KLQotc3RhdGljIFZPSUQgYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQQkFfUkVDX0VOVFJZCXBCQUVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1ICptcGR1X2JsazsKLQlVSU5UMTYJU2VxdWVuY2UgPSAoVUlOVDE2KSBwUnhCbGstPnBIZWFkZXItPlNlcXVlbmNlOwotCi0JbXBkdV9ibGsgPSBiYV9tcGR1X2Jsa19hbGxvYyhwQWQpOwotCWlmICgobXBkdV9ibGsgIT0gTlVMTCkgJiYKLQkJKCFSWF9CTEtfVEVTVF9GTEFHKHBSeEJsaywgZlJYX0VBUCkpKQotCXsKLQkJLy8gV3JpdGUgUnhEIGJ1ZmZlciBhZGRyZXNzICYgYWxsb2NhdGVkIGJ1ZmZlciBsZW5ndGgKLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEJBRW50cnktPlJ4UmVSaW5nTG9jayk7Ci0KLQkJbXBkdV9ibGstPlNlcXVlbmNlID0gU2VxdWVuY2U7Ci0KLQkJbXBkdV9ibGstPmJBTVNEVSA9IFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpOwotCi0JCWNvbnZlcnRfcmVvcmRlcmluZ19wYWNrZXRfdG9fcHJlQU1TRFVfb3JfODAyXzNfcGFja2V0KHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQkJU1RBVFNfSU5DX1JYX1BBQ0tFVFMocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLSAgICAgICAgLy8KLQkJLy8gaXQgaXMgbmVjZXNzYXJ5IGZvciByZW9yZGVyaW5nIHBhY2tldCB0byByZWNvcmQKLQkJLy8gd2hpY2ggQlNTIGl0IGNvbWUgZnJvbQotCQkvLwotCQlSVE1QX1NFVF9QQUNLRVRfSUYocFJ4QmxrLT5wUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKLQotCQltcGR1X2Jsay0+cFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCi0JCWlmIChiYV9yZW9yZGVyaW5nX21wZHVfaW5zZXJ0c29ydGVkKCZwQkFFbnRyeS0+bGlzdCwgbXBkdV9ibGspID09IEZBTFNFKQotCQl7Ci0JCQkvLyBoYWQgYmVlbiBhbHJlYWR5IHdpdGhpbiByZW9yZGVyaW5nIGxpc3QKLQkJCS8vIGRvbid0IGluZGljYXRlCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJYmFfbXBkdV9ibGtfZnJlZShwQWQsIG1wZHVfYmxrKTsKLQkJfQotCi0JCUFTU0VSVCgoMDw9IHBCQUVudHJ5LT5saXN0LnFsZW4pICAmJiAocEJBRW50cnktPmxpc3QucWxlbiA8PSBwQkFFbnRyeS0+QkFXaW5TaXplKSk7Ci0JCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBCQUVudHJ5LT5SeFJlUmluZ0xvY2spOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgICgiISEhICglZCkgQ2FuJ3QgYWxsb2NhdGUgcmVvcmRlcmluZyBtcGR1IGJsa1xuIiwKLQkJCQkJCQkJICAgcEJBRW50cnktPmxpc3QucWxlbikpOwotCQkvKgotCQkgKiBmbHVzaCBhbGwgcGVuZGluZyByZW9yZGVyaW5nIG1wZHVzCi0JCSAqIGFuZCByZWNldmluZyBtcGR1IHRvIHVwcGVyIGxheWVyCi0JCSAqIG1ha2UgdGNwL2lwIHRvIHRha2UgY2FyZSByZW9yZGVyaW5nIG1lY2hhbmlzbQotCQkgKi8KLQkJLy9iYV9yZWZyZXNoX3Jlb3JkZXJpbmdfbXBkdXMocEFkLCBwQkFFbnRyeSk7Ci0JCWJhX2luZGljYXRlX3Jlb3JkZXJpbmdfbXBkdXNfbGVfc2VxKHBBZCwgcEJBRW50cnksIFNlcXVlbmNlKTsKLQotCQlwQkFFbnRyeS0+TGFzdEluZFNlcSA9IFNlcXVlbmNlOwotCQlJTkRJQ0FURV9MRUdBQ1lfT1JfQU1TRFUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlJbmRpY2F0ZSB0aGlzIHBhY2tldCB0byB1cHBlciBsYXllciBvciBwdXQgaXQgaW50byByZW9yZGVyaW5nIGJ1ZmZlcgotCi0JUGFyYW1ldHJzOgotCQlwUnhCbGsgICAgICAgICA6IGNhcnJ5IG5lY2Vzc2FyeSBwYWNrZXQgaW5mbyA4MDIuMTEgZm9ybWF0Ci0JCUZyb21XaGljaEJTU0lEIDogdGhlIHBhY2tldCByZWNlaXZlZCBmcm9tIHdoaWNoIEJTUwotCi0JUmV0dXJuCToKLQkJCSAgbm9uZQotCi0JTm90ZSAgICA6Ci0JICAgICAgICAgIHRoZSBwYWNrZXQgcXVldWVkIGludG8gcmVvcmRlcmluZyBidWZmZXIgbmVlZCB0byBjb3ZlciB0byA4MDIuMyBmb3JtYXQKLQkJCSAgb3IgcHJlX0FNU0RVIGZvcm1hdAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotVk9JRCBJbmRpY2F0ZV9BTVBEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVVTSE9SVAkJCQlJZHg7Ci0JUEJBX1JFQ19FTlRSWQkJcEJBRW50cnkgPSBOVUxMOwotCVVJTlQxNgkJCQlTZXF1ZW5jZSA9IHBSeEJsay0+cEhlYWRlci0+U2VxdWVuY2U7Ci0JVUxPTkcJCQkJTm93MzI7Ci0JVUNIQVIJCQkJV2NpZCA9IHBSeEJsay0+cFJ4V0ktPldpcmVsZXNzQ2xpSUQ7Ci0JVUNIQVIJCQkJVElEID0gcFJ4QmxrLT5wUnhXSS0+VElEOwotCi0KLQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1TRFUpICYmICAocFJ4QmxrLT5EYXRhU2l6ZSA+IE1BWF9SWF9QS1RfTEVOKSkKLQl7Ci0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCi0JaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7Ci0JCUlkeCA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uQkFSZWNXY2lkQXJyYXlbVElEXTsKLQkJaWYgKElkeCA9PSAwKQotCQl7Ci0JCQkvKiBSZWMgQkEgU2Vzc2lvbiBoYWQgYmVlbiB0b3JuIGRvd24gKi8KLQkJCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBCQUVudHJ5ID0gJnBBZC0+QkFUYWJsZS5CQVJlY0VudHJ5W0lkeF07Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIGltcG9zc2libGUgISEhCi0JCUFTU0VSVCgwKTsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCUFTU0VSVChwQkFFbnRyeSk7Ci0KLQkvLyB1cGRhdGUgbGFzdCByeCB0aW1lCi0JTmRpc0dldFN5c3RlbVVwVGltZSgmTm93MzIpOwotCi0JcEJBRW50cnktPnJjdlNlcSA9IFNlcXVlbmNlOwotCi0KLQliYV9mbHVzaF9yZW9yZGVyaW5nX3RpbWVvdXRfbXBkdXMocEFkLCBwQkFFbnRyeSwgTm93MzIpOwotCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwotCi0JLy8KLQkvLyBSZXNldCBMYXN0IEluZGljYXRlIFNlcXVlbmNlCi0JLy8KLQlpZiAocEJBRW50cnktPkxhc3RJbmRTZXEgPT0gUkVTRVRfUkNWX1NFUSkKLQl7Ci0JCUFTU0VSVCgocEJBRW50cnktPmxpc3QucWxlbiA9PSAwKSAmJiAocEJBRW50cnktPmxpc3QubmV4dCA9PSBOVUxMKSk7Ci0KLQkJLy8gcmVzZXQgcmN2IHNlcXVlbmNlIG9mIEJBIHNlc3Npb24KLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKLQkJcEJBRW50cnktPkxhc3RJbmRTZXFBdFRpbWVyID0gTm93MzI7Ci0JCUlORElDQVRFX0xFR0FDWV9PUl9BTVNEVShwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8KLQkvLyBJLiBDaGVjayBpZiBpbiBvcmRlci4KLQkvLwotCWlmIChTRVFfU1RFUE9ORShTZXF1ZW5jZSwgcEJBRW50cnktPkxhc3RJbmRTZXEsIE1BWFNFUSkpCi0JewotCQlVU0hPUlQgIExhc3RJbmRTZXE7Ci0KLQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBTZXF1ZW5jZTsKLQkJSU5ESUNBVEVfTEVHQUNZX09SX0FNU0RVKHBBZCwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCUxhc3RJbmRTZXEgPSBiYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2luX29yZGVyKHBBZCwgcEJBRW50cnksIHBCQUVudHJ5LT5MYXN0SW5kU2VxKTsKLQkJaWYgKExhc3RJbmRTZXEgIT0gUkVTRVRfUkNWX1NFUSkKLQkJewotCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBMYXN0SW5kU2VxOwotCQl9Ci0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwotCX0KLQkvLwotCS8vIElJLiBEcm9wIER1cGxpY2F0ZWQgUGFja2V0Ci0JLy8KLQllbHNlIGlmIChTZXF1ZW5jZSA9PSBwQkFFbnRyeS0+TGFzdEluZFNlcSkKLQl7Ci0KLQkJLy8gZHJvcCBhbmQgcmVsZWFzZSBwYWNrZXQKLQkJcEJBRW50cnktPm5Ecm9wUGFja2V0Kys7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCS8vCi0JLy8gSUlJLiBEcm9wIE9sZCBSZWNlaXZlZCBQYWNrZXQKLQkvLwotCWVsc2UgaWYgKFNFUV9TTUFMTEVSKFNlcXVlbmNlLCBwQkFFbnRyeS0+TGFzdEluZFNlcSwgTUFYU0VRKSkKLQl7Ci0KLQkJLy8gZHJvcCBhbmQgcmVsZWFzZSBwYWNrZXQKLQkJcEJBRW50cnktPm5Ecm9wUGFja2V0Kys7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCS8vCi0JLy8gSVYuIFJlY2VpdmUgU2VxdWVuY2Ugd2l0aGluIFdpbmRvdyBTaXplCi0JLy8KLQllbHNlIGlmIChTRVFfU01BTExFUihTZXF1ZW5jZSwgKCgocEJBRW50cnktPkxhc3RJbmRTZXErcEJBRW50cnktPkJBV2luU2l6ZSsxKSkgJiBNQVhTRVEpLCBNQVhTRVEpKQotCXsKLQkJYmFfZW5xdWV1ZV9yZW9yZGVyaW5nX3BhY2tldChwQWQsIHBCQUVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQl9Ci0JLy8KLQkvLyBWLiBSZWNlaXZlIHNlcSBzdXJwYXNzZXMgV2luKGxhc3RzZXEgKyBuTVNEVSkuIFNvIHJlZnJlc2ggYWxsIHJlb3JkZXIgYnVmZmVyCi0JLy8KLQllbHNlCi0JewotCQlMT05HIFdpblN0YXJ0U2VxLCBUbXBTZXE7Ci0KLQotCQlUbXBTZXEgPSBTZXF1ZW5jZSAtIChwQkFFbnRyeS0+QkFXaW5TaXplKSAtMTsKLQkJaWYgKFRtcFNlcSA8IDApCi0JCXsKLQkJCVRtcFNlcSA9IChNQVhTRVErMSkgKyBUbXBTZXE7Ci0JCX0KLQkJV2luU3RhcnRTZXEgPSAoVG1wU2VxKzEpICYgTUFYU0VROwotCQliYV9pbmRpY2F0ZV9yZW9yZGVyaW5nX21wZHVzX2xlX3NlcShwQWQsIHBCQUVudHJ5LCBXaW5TdGFydFNlcSk7Ci0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxID0gV2luU3RhcnRTZXE7IC8vVG1wU2VxOwotCi0JCXBCQUVudHJ5LT5MYXN0SW5kU2VxQXRUaW1lciA9IE5vdzMyOwotCi0JCWJhX2VucXVldWVfcmVvcmRlcmluZ19wYWNrZXQocEFkLCBwQkFFbnRyeSwgcFJ4QmxrLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQkJVG1wU2VxID0gYmFfaW5kaWNhdGVfcmVvcmRlcmluZ19tcGR1c19pbl9vcmRlcihwQWQsIHBCQUVudHJ5LCBwQkFFbnRyeS0+TGFzdEluZFNlcSk7Ci0JCWlmIChUbXBTZXEgIT0gUkVTRVRfUkNWX1NFUSkKLQkJewotCQkJcEJBRW50cnktPkxhc3RJbmRTZXEgPSBUbXBTZXE7Ci0JCX0KLQl9Ci19Ci0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9hZXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9hZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjYmJiZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fYWVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JY21tX2Flcy5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUGF1bCBXdQkJMDItMjUtMDIJCUluaXRpYWwKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi10eXBlZGVmCXN0cnVjdAotewotICAgIFVJTlQzMiBlcmtbNjRdOyAgICAgLyogZW5jcnlwdGlvbiByb3VuZCBrZXlzICovCi0gICAgVUlOVDMyIGRya1s2NF07ICAgICAvKiBkZWNyeXB0aW9uIHJvdW5kIGtleXMgKi8KLSAgICBpbnQgbnI7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiByb3VuZHMgKi8KLX0KLWFlc19jb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVDSEFSIFNib3hUYWJsZVsyNTZdID0KLXsKLQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAotCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCi0JMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKLQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAotCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCi0JMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKLQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAotCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCi0JMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKLQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAotCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCi0JMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKLQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAotCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCi0JMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKLQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAotCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCi0JMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKLQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAotCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCi0JMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKLQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAotCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCi0JMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKLQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAotCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCi0JMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKLQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAotCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCi0JMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKLQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAotCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKLX07Ci0KLVZPSUQgeG9yXzMyKAotCUlOICBQVUNIQVIgIGEsCi0JSU4gIFBVQ0hBUiAgYiwKLQlPVVQgUFVDSEFSICBvdXQpCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGk9MDtpPDQ7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotCX0KLX0KLQotVk9JRCB4b3JfMTI4KAotCUlOICBQVUNIQVIgIGEsCi0JSU4gIFBVQ0hBUiAgYiwKLQlPVVQgUFVDSEFSICBvdXQpCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGk9MDtpPDE2OyBpKyspCi0JewotCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLQl9Ci19Ci0KLVVDSEFSIFJUTVBDa2lwU2JveCgKLQlJTiAgVUNIQVIgICBhKQotewotCXJldHVybiBTYm94VGFibGVbKGludClhXTsKLX0KLQotVk9JRCBuZXh0X2tleSgKLQlJTiAgUFVDSEFSICBrZXksCi0JSU4gIElOVCAgICAgcm91bmQpCi17Ci0JVUNIQVIgICAgICAgcmNvbjsKLQlVQ0hBUiAgICAgICBzYm94X2tleVs0XTsKLQlVQ0hBUiAgICAgICByY29uX3RhYmxlWzEyXSA9Ci0JewotCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAotCQkweDFiLCAweDM2LCAweDM2LCAweDM2Ci0JfTsKLQotCXNib3hfa2V5WzBdID0gUlRNUENraXBTYm94KGtleVsxM10pOwotCXNib3hfa2V5WzFdID0gUlRNUENraXBTYm94KGtleVsxNF0pOwotCXNib3hfa2V5WzJdID0gUlRNUENraXBTYm94KGtleVsxNV0pOwotCXNib3hfa2V5WzNdID0gUlRNUENraXBTYm94KGtleVsxMl0pOwotCi0JcmNvbiA9IHJjb25fdGFibGVbcm91bmRdOwotCi0JeG9yXzMyKCZrZXlbMF0sIHNib3hfa2V5LCAma2V5WzBdKTsKLQlrZXlbMF0gPSBrZXlbMF0gXiByY29uOwotCi0JeG9yXzMyKCZrZXlbNF0sICZrZXlbMF0sICZrZXlbNF0pOwotCXhvcl8zMigma2V5WzhdLCAma2V5WzRdLCAma2V5WzhdKTsKLQl4b3JfMzIoJmtleVsxMl0sICZrZXlbOF0sICZrZXlbMTJdKTsKLX0KLQotVk9JRCBieXRlX3N1YigKLQlJTiAgUFVDSEFSICBpbiwKLQlPVVQgUFVDSEFSICBvdXQpCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGk9MDsgaTwgMTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IFJUTVBDa2lwU2JveChpbltpXSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGJpdHdpc2VfeG9yKHVuc2lnbmVkIGNoYXIgKmluYSwgdW5zaWduZWQgY2hhciAqaW5iLCB1bnNpZ25lZCBjaGFyICpvdXQpCi17Ci0JaW50IGk7Ci0JZm9yIChpPTA7IGk8MTY7IGkrKykKLQl7Ci0JCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKLQl9Ci19Ci0KLVZPSUQgc2hpZnRfcm93KAotCUlOICBQVUNIQVIgIGluLAotCU9VVCBQVUNIQVIgIG91dCkKLXsKLQlvdXRbMF0gPSAgaW5bMF07Ci0Jb3V0WzFdID0gIGluWzVdOwotCW91dFsyXSA9ICBpblsxMF07Ci0Jb3V0WzNdID0gIGluWzE1XTsKLQlvdXRbNF0gPSAgaW5bNF07Ci0Jb3V0WzVdID0gIGluWzldOwotCW91dFs2XSA9ICBpblsxNF07Ci0Jb3V0WzddID0gIGluWzNdOwotCW91dFs4XSA9ICBpbls4XTsKLQlvdXRbOV0gPSAgaW5bMTNdOwotCW91dFsxMF0gPSBpblsyXTsKLQlvdXRbMTFdID0gaW5bN107Ci0Jb3V0WzEyXSA9IGluWzEyXTsKLQlvdXRbMTNdID0gaW5bMV07Ci0Jb3V0WzE0XSA9IGluWzZdOwotCW91dFsxNV0gPSBpblsxMV07Ci19Ci0KLVZPSUQgbWl4X2NvbHVtbigKLQlJTiAgUFVDSEFSICBpbiwKLQlPVVQgUFVDSEFSICBvdXQpCi17Ci0JSU5UICAgICAgICAgaTsKLQlVQ0hBUiAgICAgICBhZGQxYls0XTsKLQlVQ0hBUiAgICAgICBhZGQxYmY3WzRdOwotCVVDSEFSICAgICAgIHJvdGxbNF07Ci0JVUNIQVIgICAgICAgc3dhcF9oYWxmc1s0XTsKLQlVQ0hBUiAgICAgICBhbmRmN1s0XTsKLQlVQ0hBUiAgICAgICByb3RyWzRdOwotCVVDSEFSICAgICAgIHRlbXBbNF07Ci0JVUNIQVIgICAgICAgdGVtcGJbNF07Ci0KLQlmb3IgKGk9MCA7IGk8NDsgaSsrKQotCXsKLQkJaWYgKChpbltpXSAmIDB4ODApPT0gMHg4MCkKLQkJCWFkZDFiW2ldID0gMHgxYjsKLQkJZWxzZQotCQkJYWRkMWJbaV0gPSAweDAwOwotCX0KLQotCXN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLwotCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKLQlzd2FwX2hhbGZzWzJdID0gaW5bMF07Ci0Jc3dhcF9oYWxmc1szXSA9IGluWzFdOwotCi0Jcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCi0Jcm90bFsxXSA9IGluWzBdOwotCXJvdGxbMl0gPSBpblsxXTsKLQlyb3RsWzNdID0gaW5bMl07Ci0KLQlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKLQlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKLQlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKLQlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKLQotCWZvciAoaSA9IDM7IGk+MDsgaS0tKSAgICAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KLQl7Ci0JCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKLQkJaWYgKChhbmRmN1tpLTFdICYgMHg4MCkgPT0gMHg4MCkKLQkJewotCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKLQkJfQotCX0KLQlhbmRmN1swXSA9IGFuZGY3WzBdIDw8IDE7Ci0JYW5kZjdbMF0gPSBhbmRmN1swXSAmIDB4ZmU7Ci0KLQl4b3JfMzIoYWRkMWIsIGFuZGY3LCBhZGQxYmY3KTsKLQotCXhvcl8zMihpbiwgYWRkMWJmNywgcm90cik7Ci0KLQl0ZW1wWzBdID0gcm90clswXTsgICAgICAgICAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCi0Jcm90clswXSA9IHJvdHJbMV07Ci0Jcm90clsxXSA9IHJvdHJbMl07Ci0Jcm90clsyXSA9IHJvdHJbM107Ci0Jcm90clszXSA9IHRlbXBbMF07Ci0KLQl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7Ci0JeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsdGVtcGIpOwotCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoCi0JdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjEsCi0JaW50IGhlYWRlcl9sZW5ndGgsCi0JdW5zaWduZWQgY2hhciAqbXBkdSkKLXsKLQltaWNfaGVhZGVyMVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKLQltaWNfaGVhZGVyMVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaGVhZGVyX2xlbmd0aCAtIDIpICUgMjU2KTsKLQltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAgICAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLwotCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7ICAgIC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCi0JbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAgICAgICAvKiBBMSAqLwotCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKLQltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07Ci0JbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOwotCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKLQltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07Ci0JbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLwotCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOwotCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOwotCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwotCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOwotCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoCi0JdW5zaWduZWQgY2hhciAqbWljX2hlYWRlcjIsCi0JdW5zaWduZWQgY2hhciAqbXBkdSwKLQlpbnQgYTRfZXhpc3RzLAotCWludCBxY19leGlzdHMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIG1pY19oZWFkZXIyW2ldPTB4MDA7Ci0KLQltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAgICAvKiBBMyAqLwotCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107Ci0JbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKLQltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOwotCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07Ci0JbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKLQotCS8vIEluIFNlcXVlbmNlIENvbnRyb2wgZmllbGQsIG11dGUgc2VxdWVuY2UgbnVtZXIgYml0cyAoMTItYml0KQotCW1pY19oZWFkZXIyWzZdID0gbXBkdVsyMl0gJiAweDBmOyAgIC8qIFNDICovCi0JbWljX2hlYWRlcjJbN10gPSAweDAwOyAvKiBtcGR1WzIzXTsgKi8KLQotCWlmICgoIXFjX2V4aXN0cykgJiBhNF9leGlzdHMpCi0JewotCQlmb3IgKGk9MDtpPDY7aSsrKSBtaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgICAvKiBBNCAqLwotCi0JfQotCi0JaWYgKHFjX2V4aXN0cyAmJiAoIWE0X2V4aXN0cykpCi0JewotCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLwotCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQl7Ci0JCWZvciAoaT0wO2k8NjtpKyspIG1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAgIC8qIEE0ICovCi0KLQkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOwotCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2l2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBNSUMgSVYgZnJvbSBoZWFkZXIgZmllbGRzIGFuZCBQTiAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgY29uc3RydWN0X21pY19pdigKLQl1bnNpZ25lZCBjaGFyICptaWNfaXYsCi0JaW50IHFjX2V4aXN0cywKLQlpbnQgYTRfZXhpc3RzLAotCXVuc2lnbmVkIGNoYXIgKm1wZHUsCi0JdW5zaWduZWQgaW50IHBheWxvYWRfbGVuZ3RoLAotCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvcikKLXsKLQlpbnQgaTsKLQotCW1pY19pdlswXSA9IDB4NTk7Ci0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCi0JCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAgLyogUW9TX1RDICAgICAgICAgICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAgIC8qIG11dGUgYml0cyA3LTQgICAgKi8KLQlpZiAoIXFjX2V4aXN0cykKLQkJbWljX2l2WzFdID0gMHgwMDsKLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQotCQltaWNfaXZbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgIC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0jaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgotCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCW1pY19pdltpXSA9IHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTlswOjVdICovCi0jZWxzZQotCQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCi0jZW5kaWYKLQlpID0gKHBheWxvYWRfbGVuZ3RoIC8gMjU2KTsKLQlpID0gKHBheWxvYWRfbGVuZ3RoICUgMjU2KTsKLQltaWNfaXZbMTRdID0gKHVuc2lnbmVkIGNoYXIpIChwYXlsb2FkX2xlbmd0aCAvIDI1Nik7Ci0JbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKSAocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KLS8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGFlczEyOGsxMjhkKHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqY2lwaGVydGV4dCkKLXsKLQlpbnQgcm91bmQ7Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciBpbnRlcm1lZGlhdGVhWzE2XTsKLQl1bnNpZ25lZCBjaGFyIGludGVybWVkaWF0ZWJbMTZdOwotCXVuc2lnbmVkIGNoYXIgcm91bmRfa2V5WzE2XTsKLQotCWZvcihpPTA7IGk8MTY7IGkrKykgcm91bmRfa2V5W2ldID0ga2V5W2ldOwotCi0JZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspCi0JewotCQlpZiAocm91bmQgPT0gMCkKLQkJewotCQkJeG9yXzEyOChyb3VuZF9rZXksIGRhdGEsIGNpcGhlcnRleHQpOwotCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0JCX0KLQkJZWxzZSBpZiAocm91bmQgPT0gMTApCi0JCXsKLQkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkJeG9yXzEyOChpbnRlcm1lZGlhdGViLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotCQl9Ci0JCWVsc2UgICAgLyogMSAtIDkgKi8KLQkJewotCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0JCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzBdLCAmaW50ZXJtZWRpYXRlYVswXSk7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzRdLCAmaW50ZXJtZWRpYXRlYVs0XSk7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzhdLCAmaW50ZXJtZWRpYXRlYVs4XSk7Ci0JCQltaXhfY29sdW1uKCZpbnRlcm1lZGlhdGViWzEyXSwgJmludGVybWVkaWF0ZWFbMTJdKTsKLQkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYSwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotCQl9Ci0JfQotCi19Ci0KLXZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKAotCXVuc2lnbmVkIGNoYXIgKmN0cl9wcmVsb2FkLAotCWludCBhNF9leGlzdHMsCi0JaW50IHFjX2V4aXN0cywKLQl1bnNpZ25lZCBjaGFyICptcGR1LAotCXVuc2lnbmVkIGNoYXIgKnBuX3ZlY3RvciwKLQlpbnQgYykKLXsKLQotCWludCBpID0gMDsKLQlmb3IgKGk9MDsgaTwxNjsgaSsrKSBjdHJfcHJlbG9hZFtpXSA9IDB4MDA7Ci0JaSA9IDA7Ci0KLQljdHJfcHJlbG9hZFswXSA9IDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcgKi8KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgLyogUW9DX0NvbnRyb2wgICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKSBjdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKLQotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0jaWZkZWYgQ09OU0lTVEVOVF9QTl9PUkRFUgotCSAgZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvcltpIC0gOF07ICAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzA6NV0gKi8KLSNlbHNlCi0JICBmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJCWN0cl9wcmVsb2FkW2ldID0gICAgcG5fdmVjdG9yWzEzIC0gaV07ICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLwotI2VuZGlmCi0JY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8vIEN0cgotCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOwotCi19Ci0KLUJPT0xFQU4gUlRNUFNvZnREZWNyeXB0QUVTKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwRGF0YSwKLQlJTiBVTE9ORwlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KQotewotCVVDSEFSCQkJS2V5SUQ7Ci0JVUlOVAkJCUhlYWRlckxlbjsKLQlVQ0hBUgkJCVBOWzZdOwotCVVJTlQJCQlwYXlsb2FkX2xlbjsKLQlVSU5UCQkJbnVtX2Jsb2NrczsKLQlVSU5UCQkJcGF5bG9hZF9yZW1haW5kZXI7Ci0JVVNIT1JUCQkJZmM7Ci0JVUNIQVIJCQlmYzA7Ci0JVUNIQVIJCQlmYzE7Ci0JVUlOVAkJCWZyYW1lX3R5cGU7Ci0JVUlOVAkJCWZyYW1lX3N1YnR5cGU7Ci0JVUlOVAkJCWZyb21fZHM7Ci0JVUlOVAkJCXRvX2RzOwotCUlOVAkJCQlhNF9leGlzdHM7Ci0JSU5UCQkJCXFjX2V4aXN0czsKLQlVQ0hBUgkJCWFlc19vdXRbMTZdOwotCWludAkJCXBheWxvYWRfaW5kZXg7Ci0JVUlOVAkJCWk7Ci0JVUNIQVIJCQljdHJfcHJlbG9hZFsxNl07Ci0JVUNIQVIJCQljaGFpbl9idWZmZXJbMTZdOwotCVVDSEFSCQkJcGFkZGVkX2J1ZmZlclsxNl07Ci0JVUNIQVIJCQltaWNfaXZbMTZdOwotCVVDSEFSCQkJbWljX2hlYWRlcjFbMTZdOwotCVVDSEFSCQkJbWljX2hlYWRlcjJbMTZdOwotCVVDSEFSCQkJTUlDWzhdOwotCVVDSEFSCQkJVHJhaWxNSUNbOF07Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKLSNlbmRpZgotCi0JZmMwID0gKnBEYXRhOwotCWZjMSA9ICoocERhdGEgKyAxKTsKLQotCWZjID0gKigoUFVTSE9SVClwRGF0YSk7Ci0KLQlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKLQlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKLQotCWZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOwotCXRvX2RzID0gKGZjMSAmIDB4MSk7Ci0KLQlhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKLQlxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KLQkJCQkgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8Ci0JCQkJICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQotCQkJCSApOwotCi0JSGVhZGVyTGVuID0gMjQ7Ci0JaWYgKGE0X2V4aXN0cykKLQkJSGVhZGVyTGVuICs9IDY7Ci0KLQlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKLQlLZXlJRCA9IEtleUlEID4+IDY7Ci0KLQlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRBRVMgZmFpbGVkIShLZXlJRFslZF0gTGVuZ3RoIGNhbiBub3QgYmUgMClcbiIsIEtleUlEKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlQTlswXSA9ICoocERhdGErIEhlYWRlckxlbik7Ci0JUE5bMV0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyAxKTsKLQlQTlsyXSA9ICoocERhdGErIEhlYWRlckxlbiArIDQpOwotCVBOWzNdID0gKihwRGF0YSsgSGVhZGVyTGVuICsgNSk7Ci0JUE5bNF0gPSAqKHBEYXRhKyBIZWFkZXJMZW4gKyA2KTsKLQlQTls1XSA9ICoocERhdGErIEhlYWRlckxlbiArIDcpOwotCi0JcGF5bG9hZF9sZW4gPSBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSA4OwkvLyA4IGJ5dGVzIGZvciBDQ01QIGhlYWRlciAsIDggYnl0ZXMgZm9yIE1JQwotCXBheWxvYWRfcmVtYWluZGVyID0gKHBheWxvYWRfbGVuKSAlIDE2OwotCW51bV9ibG9ja3MgPSAocGF5bG9hZF9sZW4pIC8gMTY7Ci0KLQotCi0JLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCi0JcGF5bG9hZF9pbmRleCA9IEhlYWRlckxlbiArIDg7IC8vSVYrRUlWCi0KLQlmb3IgKGk9MDsgaTwgbnVtX2Jsb2NrczsgaSsrKQotCXsKLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAotCQkJCQkJCQlhNF9leGlzdHMsCi0JCQkJCQkJCXFjX2V4aXN0cywKLQkJCQkJCQkJcERhdGEsCi0JCQkJCQkJCVBOLAotCQkJCQkJCQlpKzEgKTsKLQotCQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgMTYpOwotCQlwYXlsb2FkX2luZGV4ICs9IDE2OwotCX0KLQotCS8vCi0JLy8gSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQKLQkvLyBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKLQkvLwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCi0JewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsCi0JCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQkJcWNfZXhpc3RzLAotCQkJCQkJCQlwRGF0YSwKLQkJCQkJCQkJUE4sCi0JCQkJCQkJCW51bV9ibG9ja3MgKyAxKTsKLQotCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOwotCi0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBEYXRhICsgcGF5bG9hZF9pbmRleCAtIDgsIGNoYWluX2J1ZmZlciwgcGF5bG9hZF9yZW1haW5kZXIpOwotCQlwYXlsb2FkX2luZGV4ICs9IHBheWxvYWRfcmVtYWluZGVyOwotCX0KLQotCS8vCi0JLy8gRGVzY3J5cHQgdGhlIE1JQwotCS8vCi0JY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLAotCQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCQlxY19leGlzdHMsCi0JCQkJCQkJcERhdGEsCi0JCQkJCQkJUE4sCi0JCQkJCQkJMCk7Ci0JTmRpc1plcm9NZW1vcnkocGFkZGVkX2J1ZmZlciwgMTYpOwotCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgOCk7Ci0KLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQotCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0KLQlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgY2hhaW5fYnVmZmVyLCA4KTsKLQotCi0JLy8KLQkvLyBDYWxjdWxhdGUgTUlDCi0JLy8KLQotCS8vRm9yY2UgdGhlIHByb3RlY3RlZCBmcmFtZSBiaXQgb24KLQkqKHBEYXRhICsgMSkgPSAqKHBEYXRhICsgMSkgfCAweDQwOwotCi0JLy8gRmluZCBzdGFydCBvZiBwYXlsb2FkCi0JLy8gQmVjYXVzZSB0aGUgQ0NNUCBoZWFkZXIgaGFzIGJlZW4gcmVtb3ZlZAotCXBheWxvYWRfaW5kZXggPSBIZWFkZXJMZW47Ci0KLQljb25zdHJ1Y3RfbWljX2l2KAotCQkJCQltaWNfaXYsCi0JCQkJCXFjX2V4aXN0cywKLQkJCQkJYTRfZXhpc3RzLAotCQkJCQlwRGF0YSwKLQkJCQkJcGF5bG9hZF9sZW4sCi0JCQkJCVBOKTsKLQotCWNvbnN0cnVjdF9taWNfaGVhZGVyMSgKLQkJCQkJCW1pY19oZWFkZXIxLAotCQkJCQkJSGVhZGVyTGVuLAotCQkJCQkJcERhdGEpOwotCi0JY29uc3RydWN0X21pY19oZWFkZXIyKAotCQkJCQkJbWljX2hlYWRlcjIsCi0JCQkJCQlwRGF0YSwKLQkJCQkJCWE0X2V4aXN0cywKLQkJCQkJCXFjX2V4aXN0cyk7Ci0KLQlhZXMxMjhrMTI4ZChwV3BhS2V5W0tleUlEXS5LZXksIG1pY19pdiwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQocFdwYUtleVtLZXlJRF0uS2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQotCS8vIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIDE2IGJ5dGUgcGF5bG9hZCBibG9jawotCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspCi0JewotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwRGF0YSArIHBheWxvYWRfaW5kZXgsIGNoYWluX2J1ZmZlcik7Ci0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQkvLyBBZGQgb24gdGhlIGZpbmFsIHBheWxvYWQgYmxvY2sgaWYgaXQgbmVlZHMgcGFkZGluZwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApCi0JewotCQlOZGlzWmVyb01lbW9yeShwYWRkZWRfYnVmZmVyLCAxNik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBhZGRlZF9idWZmZXIsIHBEYXRhICsgcGF5bG9hZF9pbmRleCwgcGF5bG9hZF9yZW1haW5kZXIpOwotCi0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWFlczEyOGsxMjhkKHBXcGFLZXlbS2V5SURdLktleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQkvLyBhZXNfb3V0IGNvbnRhaW5zIHBhZGRlZCBtaWMsIGRpc2NhcmQgbW9zdCBzaWduaWZpY2FudAotCS8vIDggYnl0ZXMgdG8gZ2VuZXJhdGUgNjQgYml0IE1JQwotCWZvciAoaSA9IDAgOyBpIDwgODsgaSsrKSBNSUNbaV0gPSBhZXNfb3V0W2ldOwotCi0JaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRBRVMsIE1JQyBFcnJvciAhXG4iKSk7CSAvL01JQyBlcnJvci4KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKXBEYXRhLCBESVJfUkVBRCwgRkFMU0UpOwotI2VuZGlmCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PSAgQUVTIEVuL0RlY3J5cHRpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNpZm5kZWYJdWludDgKLSNkZWZpbmUJdWludDggIHVuc2lnbmVkCWNoYXIKLSNlbmRpZgotCi0jaWZuZGVmCXVpbnQzMgotI2RlZmluZQl1aW50MzIgdW5zaWduZWQJaW50Ci0jZW5kaWYKLQotLyogZm9yd2FyZCBTLWJveCAqLwotc3RhdGljIHVpbnQzMiBGU2JbMjU2XSA9Ci17Ci0JMHg2MywgMHg3QywJMHg3NywgMHg3QiwJMHhGMiwgMHg2QiwJMHg2RiwgMHhDNSwKLQkweDMwLCAweDAxLAkweDY3LCAweDJCLAkweEZFLCAweEQ3LAkweEFCLCAweDc2LAotCTB4Q0EsIDB4ODIsCTB4QzksIDB4N0QsCTB4RkEsIDB4NTksCTB4NDcsIDB4RjAsCi0JMHhBRCwgMHhENCwJMHhBMiwgMHhBRiwJMHg5QywgMHhBNCwJMHg3MiwgMHhDMCwKLQkweEI3LCAweEZELAkweDkzLCAweDI2LAkweDM2LCAweDNGLAkweEY3LCAweENDLAotCTB4MzQsIDB4QTUsCTB4RTUsIDB4RjEsCTB4NzEsIDB4RDgsCTB4MzEsIDB4MTUsCi0JMHgwNCwgMHhDNywJMHgyMywgMHhDMywJMHgxOCwgMHg5NiwJMHgwNSwgMHg5QSwKLQkweDA3LCAweDEyLAkweDgwLCAweEUyLAkweEVCLCAweDI3LAkweEIyLCAweDc1LAotCTB4MDksIDB4ODMsCTB4MkMsIDB4MUEsCTB4MUIsIDB4NkUsCTB4NUEsIDB4QTAsCi0JMHg1MiwgMHgzQiwJMHhENiwgMHhCMywJMHgyOSwgMHhFMywJMHgyRiwgMHg4NCwKLQkweDUzLCAweEQxLAkweDAwLCAweEVELAkweDIwLCAweEZDLAkweEIxLCAweDVCLAotCTB4NkEsIDB4Q0IsCTB4QkUsIDB4MzksCTB4NEEsIDB4NEMsCTB4NTgsIDB4Q0YsCi0JMHhEMCwgMHhFRiwJMHhBQSwgMHhGQiwJMHg0MywgMHg0RCwJMHgzMywgMHg4NSwKLQkweDQ1LCAweEY5LAkweDAyLCAweDdGLAkweDUwLCAweDNDLAkweDlGLCAweEE4LAotCTB4NTEsIDB4QTMsCTB4NDAsIDB4OEYsCTB4OTIsIDB4OUQsCTB4MzgsIDB4RjUsCi0JMHhCQywgMHhCNiwJMHhEQSwgMHgyMSwJMHgxMCwgMHhGRiwJMHhGMywgMHhEMiwKLQkweENELCAweDBDLAkweDEzLCAweEVDLAkweDVGLCAweDk3LAkweDQ0LCAweDE3LAotCTB4QzQsIDB4QTcsCTB4N0UsIDB4M0QsCTB4NjQsIDB4NUQsCTB4MTksIDB4NzMsCi0JMHg2MCwgMHg4MSwJMHg0RiwgMHhEQywJMHgyMiwgMHgyQSwJMHg5MCwgMHg4OCwKLQkweDQ2LCAweEVFLAkweEI4LCAweDE0LAkweERFLCAweDVFLAkweDBCLCAweERCLAotCTB4RTAsIDB4MzIsCTB4M0EsIDB4MEEsCTB4NDksIDB4MDYsCTB4MjQsIDB4NUMsCi0JMHhDMiwgMHhEMywJMHhBQywgMHg2MiwJMHg5MSwgMHg5NSwJMHhFNCwgMHg3OSwKLQkweEU3LCAweEM4LAkweDM3LCAweDZELAkweDhELCAweEQ1LAkweDRFLCAweEE5LAotCTB4NkMsIDB4NTYsCTB4RjQsIDB4RUEsCTB4NjUsIDB4N0EsCTB4QUUsIDB4MDgsCi0JMHhCQSwgMHg3OCwJMHgyNSwgMHgyRSwJMHgxQywgMHhBNiwJMHhCNCwgMHhDNiwKLQkweEU4LCAweERELAkweDc0LCAweDFGLAkweDRCLCAweEJELAkweDhCLCAweDhBLAotCTB4NzAsIDB4M0UsCTB4QjUsIDB4NjYsCTB4NDgsIDB4MDMsCTB4RjYsIDB4MEUsCi0JMHg2MSwgMHgzNSwJMHg1NywgMHhCOSwJMHg4NiwgMHhDMSwJMHgxRCwgMHg5RSwKLQkweEUxLCAweEY4LAkweDk4LCAweDExLAkweDY5LCAweEQ5LAkweDhFLCAweDk0LAotCTB4OUIsIDB4MUUsCTB4ODcsIDB4RTksCTB4Q0UsIDB4NTUsCTB4MjgsIDB4REYsCi0JMHg4QywgMHhBMSwJMHg4OSwgMHgwRCwJMHhCRiwgMHhFNiwJMHg0MiwgMHg2OCwKLQkweDQxLCAweDk5LAkweDJELCAweDBGLAkweEIwLCAweDU0LAkweEJCLCAweDE2Ci19OwotCi0vKiBmb3J3YXJkIHRhYmxlICovCi0jZGVmaW5lCUZUIFwKLVwKLQlWKEM2LDYzLDYzLEE1KSwJVihGOCw3Qyw3Qyw4NCksCVYoRUUsNzcsNzcsOTkpLAlWKEY2LDdCLDdCLDhEKSwJXAotCVYoRkYsRjIsRjIsMEQpLAlWKEQ2LDZCLDZCLEJEKSwJVihERSw2Riw2RixCMSksCVYoOTEsQzUsQzUsNTQpLAlcCi0JVig2MCwzMCwzMCw1MCksCVYoMDIsMDEsMDEsMDMpLAlWKENFLDY3LDY3LEE5KSwJVig1NiwyQiwyQiw3RCksCVwKLQlWKEU3LEZFLEZFLDE5KSwJVihCNSxENyxENyw2MiksCVYoNEQsQUIsQUIsRTYpLAlWKEVDLDc2LDc2LDlBKSwJXAotCVYoOEYsQ0EsQ0EsNDUpLAlWKDFGLDgyLDgyLDlEKSwJVig4OSxDOSxDOSw0MCksCVYoRkEsN0QsN0QsODcpLAlcCi0JVihFRixGQSxGQSwxNSksCVYoQjIsNTksNTksRUIpLAlWKDhFLDQ3LDQ3LEM5KSwJVihGQixGMCxGMCwwQiksCVwKLQlWKDQxLEFELEFELEVDKSwJVihCMyxENCxENCw2NyksCVYoNUYsQTIsQTIsRkQpLAlWKDQ1LEFGLEFGLEVBKSwJXAotCVYoMjMsOUMsOUMsQkYpLAlWKDUzLEE0LEE0LEY3KSwJVihFNCw3Miw3Miw5NiksCVYoOUIsQzAsQzAsNUIpLAlcCi0JVig3NSxCNyxCNyxDMiksCVYoRTEsRkQsRkQsMUMpLAlWKDNELDkzLDkzLEFFKSwJVig0QywyNiwyNiw2QSksCVwKLQlWKDZDLDM2LDM2LDVBKSwJVig3RSwzRiwzRiw0MSksCVYoRjUsRjcsRjcsMDIpLAlWKDgzLENDLENDLDRGKSwJXAotCVYoNjgsMzQsMzQsNUMpLAlWKDUxLEE1LEE1LEY0KSwJVihEMSxFNSxFNSwzNCksCVYoRjksRjEsRjEsMDgpLAlcCi0JVihFMiw3MSw3MSw5MyksCVYoQUIsRDgsRDgsNzMpLAlWKDYyLDMxLDMxLDUzKSwJVigyQSwxNSwxNSwzRiksCVwKLQlWKDA4LDA0LDA0LDBDKSwJVig5NSxDNyxDNyw1MiksCVYoNDYsMjMsMjMsNjUpLAlWKDlELEMzLEMzLDVFKSwJXAotCVYoMzAsMTgsMTgsMjgpLAlWKDM3LDk2LDk2LEExKSwJVigwQSwwNSwwNSwwRiksCVYoMkYsOUEsOUEsQjUpLAlcCi0JVigwRSwwNywwNywwOSksCVYoMjQsMTIsMTIsMzYpLAlWKDFCLDgwLDgwLDlCKSwJVihERixFMixFMiwzRCksCVwKLQlWKENELEVCLEVCLDI2KSwJVig0RSwyNywyNyw2OSksCVYoN0YsQjIsQjIsQ0QpLAlWKEVBLDc1LDc1LDlGKSwJXAotCVYoMTIsMDksMDksMUIpLAlWKDFELDgzLDgzLDlFKSwJVig1OCwyQywyQyw3NCksCVYoMzQsMUEsMUEsMkUpLAlcCi0JVigzNiwxQiwxQiwyRCksCVYoREMsNkUsNkUsQjIpLAlWKEI0LDVBLDVBLEVFKSwJVig1QixBMCxBMCxGQiksCVwKLQlWKEE0LDUyLDUyLEY2KSwJVig3NiwzQiwzQiw0RCksCVYoQjcsRDYsRDYsNjEpLAlWKDdELEIzLEIzLENFKSwJXAotCVYoNTIsMjksMjksN0IpLAlWKERELEUzLEUzLDNFKSwJVig1RSwyRiwyRiw3MSksCVYoMTMsODQsODQsOTcpLAlcCi0JVihBNiw1Myw1MyxGNSksCVYoQjksRDEsRDEsNjgpLAlWKDAwLDAwLDAwLDAwKSwJVihDMSxFRCxFRCwyQyksCVwKLQlWKDQwLDIwLDIwLDYwKSwJVihFMyxGQyxGQywxRiksCVYoNzksQjEsQjEsQzgpLAlWKEI2LDVCLDVCLEVEKSwJXAotCVYoRDQsNkEsNkEsQkUpLAlWKDhELENCLENCLDQ2KSwJVig2NyxCRSxCRSxEOSksCVYoNzIsMzksMzksNEIpLAlcCi0JVig5NCw0QSw0QSxERSksCVYoOTgsNEMsNEMsRDQpLAlWKEIwLDU4LDU4LEU4KSwJVig4NSxDRixDRiw0QSksCVwKLQlWKEJCLEQwLEQwLDZCKSwJVihDNSxFRixFRiwyQSksCVYoNEYsQUEsQUEsRTUpLAlWKEVELEZCLEZCLDE2KSwJXAotCVYoODYsNDMsNDMsQzUpLAlWKDlBLDRELDRELEQ3KSwJVig2NiwzMywzMyw1NSksCVYoMTEsODUsODUsOTQpLAlcCi0JVig4QSw0NSw0NSxDRiksCVYoRTksRjksRjksMTApLAlWKDA0LDAyLDAyLDA2KSwJVihGRSw3Riw3Riw4MSksCVwKLQlWKEEwLDUwLDUwLEYwKSwJVig3OCwzQywzQyw0NCksCVYoMjUsOUYsOUYsQkEpLAlWKDRCLEE4LEE4LEUzKSwJXAotCVYoQTIsNTEsNTEsRjMpLAlWKDVELEEzLEEzLEZFKSwJVig4MCw0MCw0MCxDMCksCVYoMDUsOEYsOEYsOEEpLAlcCi0JVigzRiw5Miw5MixBRCksCVYoMjEsOUQsOUQsQkMpLAlWKDcwLDM4LDM4LDQ4KSwJVihGMSxGNSxGNSwwNCksCVwKLQlWKDYzLEJDLEJDLERGKSwJVig3NyxCNixCNixDMSksCVYoQUYsREEsREEsNzUpLAlWKDQyLDIxLDIxLDYzKSwJXAotCVYoMjAsMTAsMTAsMzApLAlWKEU1LEZGLEZGLDFBKSwJVihGRCxGMyxGMywwRSksCVYoQkYsRDIsRDIsNkQpLAlcCi0JVig4MSxDRCxDRCw0QyksCVYoMTgsMEMsMEMsMTQpLAlWKDI2LDEzLDEzLDM1KSwJVihDMyxFQyxFQywyRiksCVwKLQlWKEJFLDVGLDVGLEUxKSwJVigzNSw5Nyw5NyxBMiksCVYoODgsNDQsNDQsQ0MpLAlWKDJFLDE3LDE3LDM5KSwJXAotCVYoOTMsQzQsQzQsNTcpLAlWKDU1LEE3LEE3LEYyKSwJVihGQyw3RSw3RSw4MiksCVYoN0EsM0QsM0QsNDcpLAlcCi0JVihDOCw2NCw2NCxBQyksCVYoQkEsNUQsNUQsRTcpLAlWKDMyLDE5LDE5LDJCKSwJVihFNiw3Myw3Myw5NSksCVwKLQlWKEMwLDYwLDYwLEEwKSwJVigxOSw4MSw4MSw5OCksCVYoOUUsNEYsNEYsRDEpLAlWKEEzLERDLERDLDdGKSwJXAotCVYoNDQsMjIsMjIsNjYpLAlWKDU0LDJBLDJBLDdFKSwJVigzQiw5MCw5MCxBQiksCVYoMEIsODgsODgsODMpLAlcCi0JVig4Qyw0Niw0NixDQSksCVYoQzcsRUUsRUUsMjkpLAlWKDZCLEI4LEI4LEQzKSwJVigyOCwxNCwxNCwzQyksCVwKLQlWKEE3LERFLERFLDc5KSwJVihCQyw1RSw1RSxFMiksCVYoMTYsMEIsMEIsMUQpLAlWKEFELERCLERCLDc2KSwJXAotCVYoREIsRTAsRTAsM0IpLAlWKDY0LDMyLDMyLDU2KSwJVig3NCwzQSwzQSw0RSksCVYoMTQsMEEsMEEsMUUpLAlcCi0JVig5Miw0OSw0OSxEQiksCVYoMEMsMDYsMDYsMEEpLAlWKDQ4LDI0LDI0LDZDKSwJVihCOCw1Qyw1QyxFNCksCVwKLQlWKDlGLEMyLEMyLDVEKSwJVihCRCxEMyxEMyw2RSksCVYoNDMsQUMsQUMsRUYpLAlWKEM0LDYyLDYyLEE2KSwJXAotCVYoMzksOTEsOTEsQTgpLAlWKDMxLDk1LDk1LEE0KSwJVihEMyxFNCxFNCwzNyksCVYoRjIsNzksNzksOEIpLAlcCi0JVihENSxFNyxFNywzMiksCVYoOEIsQzgsQzgsNDMpLAlWKDZFLDM3LDM3LDU5KSwJVihEQSw2RCw2RCxCNyksCVwKLQlWKDAxLDhELDhELDhDKSwJVihCMSxENSxENSw2NCksCVYoOUMsNEUsNEUsRDIpLAlWKDQ5LEE5LEE5LEUwKSwJXAotCVYoRDgsNkMsNkMsQjQpLAlWKEFDLDU2LDU2LEZBKSwJVihGMyxGNCxGNCwwNyksCVYoQ0YsRUEsRUEsMjUpLAlcCi0JVihDQSw2NSw2NSxBRiksCVYoRjQsN0EsN0EsOEUpLAlWKDQ3LEFFLEFFLEU5KSwJVigxMCwwOCwwOCwxOCksCVwKLQlWKDZGLEJBLEJBLEQ1KSwJVihGMCw3OCw3OCw4OCksCVYoNEEsMjUsMjUsNkYpLAlWKDVDLDJFLDJFLDcyKSwJXAotCVYoMzgsMUMsMUMsMjQpLAlWKDU3LEE2LEE2LEYxKSwJVig3MyxCNCxCNCxDNyksCVYoOTcsQzYsQzYsNTEpLAlcCi0JVihDQixFOCxFOCwyMyksCVYoQTEsREQsREQsN0MpLAlWKEU4LDc0LDc0LDlDKSwJVigzRSwxRiwxRiwyMSksCVwKLQlWKDk2LDRCLDRCLEREKSwJVig2MSxCRCxCRCxEQyksCVYoMEQsOEIsOEIsODYpLAlWKDBGLDhBLDhBLDg1KSwJXAotCVYoRTAsNzAsNzAsOTApLAlWKDdDLDNFLDNFLDQyKSwJVig3MSxCNSxCNSxDNCksCVYoQ0MsNjYsNjYsQUEpLAlcCi0JVig5MCw0OCw0OCxEOCksCVYoMDYsMDMsMDMsMDUpLAlWKEY3LEY2LEY2LDAxKSwJVigxQywwRSwwRSwxMiksCVwKLQlWKEMyLDYxLDYxLEEzKSwJVig2QSwzNSwzNSw1RiksCVYoQUUsNTcsNTcsRjkpLAlWKDY5LEI5LEI5LEQwKSwJXAotCVYoMTcsODYsODYsOTEpLAlWKDk5LEMxLEMxLDU4KSwJVigzQSwxRCwxRCwyNyksCVYoMjcsOUUsOUUsQjkpLAlcCi0JVihEOSxFMSxFMSwzOCksCVYoRUIsRjgsRjgsMTMpLAlWKDJCLDk4LDk4LEIzKSwJVigyMiwxMSwxMSwzMyksCVwKLQlWKEQyLDY5LDY5LEJCKSwJVihBOSxEOSxEOSw3MCksCVYoMDcsOEUsOEUsODkpLAlWKDMzLDk0LDk0LEE3KSwJXAotCVYoMkQsOUIsOUIsQjYpLAlWKDNDLDFFLDFFLDIyKSwJVigxNSw4Nyw4Nyw5MiksCVYoQzksRTksRTksMjApLAlcCi0JVig4NyxDRSxDRSw0OSksCVYoQUEsNTUsNTUsRkYpLAlWKDUwLDI4LDI4LDc4KSwJVihBNSxERixERiw3QSksCVwKLQlWKDAzLDhDLDhDLDhGKSwJVig1OSxBMSxBMSxGOCksCVYoMDksODksODksODApLAlWKDFBLDBELDBELDE3KSwJXAotCVYoNjUsQkYsQkYsREEpLAlWKEQ3LEU2LEU2LDMxKSwJVig4NCw0Miw0MixDNiksCVYoRDAsNjgsNjgsQjgpLAlcCi0JVig4Miw0MSw0MSxDMyksCVYoMjksOTksOTksQjApLAlWKDVBLDJELDJELDc3KSwJVigxRSwwRiwwRiwxMSksCVwKLQlWKDdCLEIwLEIwLENCKSwJVihBOCw1NCw1NCxGQyksCVYoNkQsQkIsQkIsRDYpLAlWKDJDLDE2LDE2LDNBKQotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2EjI2IjI2MjI2QKLXN0YXRpYyB1aW50MzIgRlQwWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2QjI2EjI2IjI2MKLXN0YXRpYyB1aW50MzIgRlQxWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2MjI2QjI2EjI2IKLXN0YXRpYyB1aW50MzIgRlQyWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jZGVmaW5lCVYoYSxiLGMsZCkgMHgjI2IjI2MjI2QjI2EKLXN0YXRpYyB1aW50MzIgRlQzWzI1Nl0gPSB7IEZUIH07Ci0jdW5kZWYgVgotCi0jdW5kZWYgRlQKLQotLyogcmV2ZXJzZSBTLWJveCAqLwotCi1zdGF0aWMgdWludDMyIFJTYlsyNTZdID0KLXsKLQkweDUyLCAweDA5LAkweDZBLCAweEQ1LAkweDMwLCAweDM2LAkweEE1LCAweDM4LAotCTB4QkYsIDB4NDAsCTB4QTMsIDB4OUUsCTB4ODEsIDB4RjMsCTB4RDcsIDB4RkIsCi0JMHg3QywgMHhFMywJMHgzOSwgMHg4MiwJMHg5QiwgMHgyRiwJMHhGRiwgMHg4NywKLQkweDM0LCAweDhFLAkweDQzLCAweDQ0LAkweEM0LCAweERFLAkweEU5LCAweENCLAotCTB4NTQsIDB4N0IsCTB4OTQsIDB4MzIsCTB4QTYsIDB4QzIsCTB4MjMsIDB4M0QsCi0JMHhFRSwgMHg0QywJMHg5NSwgMHgwQiwJMHg0MiwgMHhGQSwJMHhDMywgMHg0RSwKLQkweDA4LCAweDJFLAkweEExLCAweDY2LAkweDI4LCAweEQ5LAkweDI0LCAweEIyLAotCTB4NzYsIDB4NUIsCTB4QTIsIDB4NDksCTB4NkQsIDB4OEIsCTB4RDEsIDB4MjUsCi0JMHg3MiwgMHhGOCwJMHhGNiwgMHg2NCwJMHg4NiwgMHg2OCwJMHg5OCwgMHgxNiwKLQkweEQ0LCAweEE0LAkweDVDLCAweENDLAkweDVELCAweDY1LAkweEI2LCAweDkyLAotCTB4NkMsIDB4NzAsCTB4NDgsIDB4NTAsCTB4RkQsIDB4RUQsCTB4QjksIDB4REEsCi0JMHg1RSwgMHgxNSwJMHg0NiwgMHg1NywJMHhBNywgMHg4RCwJMHg5RCwgMHg4NCwKLQkweDkwLCAweEQ4LAkweEFCLCAweDAwLAkweDhDLCAweEJDLAkweEQzLCAweDBBLAotCTB4RjcsIDB4RTQsCTB4NTgsIDB4MDUsCTB4QjgsIDB4QjMsCTB4NDUsIDB4MDYsCi0JMHhEMCwgMHgyQywJMHgxRSwgMHg4RiwJMHhDQSwgMHgzRiwJMHgwRiwgMHgwMiwKLQkweEMxLCAweEFGLAkweEJELCAweDAzLAkweDAxLCAweDEzLAkweDhBLCAweDZCLAotCTB4M0EsIDB4OTEsCTB4MTEsIDB4NDEsCTB4NEYsIDB4NjcsCTB4REMsIDB4RUEsCi0JMHg5NywgMHhGMiwJMHhDRiwgMHhDRSwJMHhGMCwgMHhCNCwJMHhFNiwgMHg3MywKLQkweDk2LCAweEFDLAkweDc0LCAweDIyLAkweEU3LCAweEFELAkweDM1LCAweDg1LAotCTB4RTIsIDB4RjksCTB4MzcsIDB4RTgsCTB4MUMsIDB4NzUsCTB4REYsIDB4NkUsCi0JMHg0NywgMHhGMSwJMHgxQSwgMHg3MSwJMHgxRCwgMHgyOSwJMHhDNSwgMHg4OSwKLQkweDZGLCAweEI3LAkweDYyLCAweDBFLAkweEFBLCAweDE4LAkweEJFLCAweDFCLAotCTB4RkMsIDB4NTYsCTB4M0UsIDB4NEIsCTB4QzYsIDB4RDIsCTB4NzksIDB4MjAsCi0JMHg5QSwgMHhEQiwJMHhDMCwgMHhGRSwJMHg3OCwgMHhDRCwJMHg1QSwgMHhGNCwKLQkweDFGLCAweERELAkweEE4LCAweDMzLAkweDg4LCAweDA3LAkweEM3LCAweDMxLAotCTB4QjEsIDB4MTIsCTB4MTAsIDB4NTksCTB4MjcsIDB4ODAsCTB4RUMsIDB4NUYsCi0JMHg2MCwgMHg1MSwJMHg3RiwgMHhBOSwJMHgxOSwgMHhCNSwJMHg0QSwgMHgwRCwKLQkweDJELCAweEU1LAkweDdBLCAweDlGLAkweDkzLCAweEM5LAkweDlDLCAweEVGLAotCTB4QTAsIDB4RTAsCTB4M0IsIDB4NEQsCTB4QUUsIDB4MkEsCTB4RjUsIDB4QjAsCi0JMHhDOCwgMHhFQiwJMHhCQiwgMHgzQywJMHg4MywgMHg1MywJMHg5OSwgMHg2MSwKLQkweDE3LCAweDJCLAkweDA0LCAweDdFLAkweEJBLCAweDc3LAkweEQ2LCAweDI2LAotCTB4RTEsIDB4NjksCTB4MTQsIDB4NjMsCTB4NTUsIDB4MjEsCTB4MEMsIDB4N0QKLX07Ci0KLS8qIHJldmVyc2UgdGFibGUgKi8KLQotI2RlZmluZQlSVCBcCi1cCi0JVig1MSxGNCxBNyw1MCksCVYoN0UsNDEsNjUsNTMpLAlWKDFBLDE3LEE0LEMzKSwJVigzQSwyNyw1RSw5NiksCVwKLQlWKDNCLEFCLDZCLENCKSwJVigxRiw5RCw0NSxGMSksCVYoQUMsRkEsNTgsQUIpLAlWKDRCLEUzLDAzLDkzKSwJXAotCVYoMjAsMzAsRkEsNTUpLAlWKEFELDc2LDZELEY2KSwJVig4OCxDQyw3Niw5MSksCVYoRjUsMDIsNEMsMjUpLAlcCi0JVig0RixFNSxENyxGQyksCVYoQzUsMkEsQ0IsRDcpLAlWKDI2LDM1LDQ0LDgwKSwJVihCNSw2MixBMyw4RiksCVwKLQlWKERFLEIxLDVBLDQ5KSwJVigyNSxCQSwxQiw2NyksCVYoNDUsRUEsMEUsOTgpLAlWKDVELEZFLEMwLEUxKSwJXAotCVYoQzMsMkYsNzUsMDIpLAlWKDgxLDRDLEYwLDEyKSwJVig4RCw0Niw5NyxBMyksCVYoNkIsRDMsRjksQzYpLAlcCi0JVigwMyw4Riw1RixFNyksCVYoMTUsOTIsOUMsOTUpLAlWKEJGLDZELDdBLEVCKSwJVig5NSw1Miw1OSxEQSksCVwKLQlWKEQ0LEJFLDgzLDJEKSwJVig1OCw3NCwyMSxEMyksCVYoNDksRTAsNjksMjkpLAlWKDhFLEM5LEM4LDQ0KSwJXAotCVYoNzUsQzIsODksNkEpLAlWKEY0LDhFLDc5LDc4KSwJVig5OSw1OCwzRSw2QiksCVYoMjcsQjksNzEsREQpLAlcCi0JVihCRSxFMSw0RixCNiksCVYoRjAsODgsQUQsMTcpLAlWKEM5LDIwLEFDLDY2KSwJVig3RCxDRSwzQSxCNCksCVwKLQlWKDYzLERGLDRBLDE4KSwJVihFNSwxQSwzMSw4MiksCVYoOTcsNTEsMzMsNjApLAlWKDYyLDUzLDdGLDQ1KSwJXAotCVYoQjEsNjQsNzcsRTApLAlWKEJCLDZCLEFFLDg0KSwJVihGRSw4MSxBMCwxQyksCVYoRjksMDgsMkIsOTQpLAlcCi0JVig3MCw0OCw2OCw1OCksCVYoOEYsNDUsRkQsMTkpLAlWKDk0LERFLDZDLDg3KSwJVig1Miw3QixGOCxCNyksCVwKLQlWKEFCLDczLEQzLDIzKSwJVig3Miw0QiwwMixFMiksCVYoRTMsMUYsOEYsNTcpLAlWKDY2LDU1LEFCLDJBKSwJXAotCVYoQjIsRUIsMjgsMDcpLAlWKDJGLEI1LEMyLDAzKSwJVig4NixDNSw3Qiw5QSksCVYoRDMsMzcsMDgsQTUpLAlcCi0JVigzMCwyOCw4NyxGMiksCVYoMjMsQkYsQTUsQjIpLAlWKDAyLDAzLDZBLEJBKSwJVihFRCwxNiw4Miw1QyksCVwKLQlWKDhBLENGLDFDLDJCKSwJVihBNyw3OSxCNCw5MiksCVYoRjMsMDcsRjIsRjApLAlWKDRFLDY5LEUyLEExKSwJXAotCVYoNjUsREEsRjQsQ0QpLAlWKDA2LDA1LEJFLEQ1KSwJVihEMSwzNCw2MiwxRiksCVYoQzQsQTYsRkUsOEEpLAlcCi0JVigzNCwyRSw1Myw5RCksCVYoQTIsRjMsNTUsQTApLAlWKDA1LDhBLEUxLDMyKSwJVihBNCxGNixFQiw3NSksCVwKLQlWKDBCLDgzLEVDLDM5KSwJVig0MCw2MCxFRixBQSksCVYoNUUsNzEsOUYsMDYpLAlWKEJELDZFLDEwLDUxKSwJXAotCVYoM0UsMjEsOEEsRjkpLAlWKDk2LERELDA2LDNEKSwJVihERCwzRSwwNSxBRSksCVYoNEQsRTYsQkQsNDYpLAlcCi0JVig5MSw1NCw4RCxCNSksCVYoNzEsQzQsNUQsMDUpLAlWKDA0LDA2LEQ0LDZGKSwJVig2MCw1MCwxNSxGRiksCVwKLQlWKDE5LDk4LEZCLDI0KSwJVihENixCRCxFOSw5NyksCVYoODksNDAsNDMsQ0MpLAlWKDY3LEQ5LDlFLDc3KSwJXAotCVYoQjAsRTgsNDIsQkQpLAlWKDA3LDg5LDhCLDg4KSwJVihFNywxOSw1QiwzOCksCVYoNzksQzgsRUUsREIpLAlcCi0JVihBMSw3QywwQSw0NyksCVYoN0MsNDIsMEYsRTkpLAlWKEY4LDg0LDFFLEM5KSwJVigwMCwwMCwwMCwwMCksCVwKLQlWKDA5LDgwLDg2LDgzKSwJVigzMiwyQixFRCw0OCksCVYoMUUsMTEsNzAsQUMpLAlWKDZDLDVBLDcyLDRFKSwJXAotCVYoRkQsMEUsRkYsRkIpLAlWKDBGLDg1LDM4LDU2KSwJVigzRCxBRSxENSwxRSksCVYoMzYsMkQsMzksMjcpLAlcCi0JVigwQSwwRixEOSw2NCksCVYoNjgsNUMsQTYsMjEpLAlWKDlCLDVCLDU0LEQxKSwJVigyNCwzNiwyRSwzQSksCVwKLQlWKDBDLDBBLDY3LEIxKSwJVig5Myw1NyxFNywwRiksCVYoQjQsRUUsOTYsRDIpLAlWKDFCLDlCLDkxLDlFKSwJXAotCVYoODAsQzAsQzUsNEYpLAlWKDYxLERDLDIwLEEyKSwJVig1QSw3Nyw0Qiw2OSksCVYoMUMsMTIsMUEsMTYpLAlcCi0JVihFMiw5MyxCQSwwQSksCVYoQzAsQTAsMkEsRTUpLAlWKDNDLDIyLEUwLDQzKSwJVigxMiwxQiwxNywxRCksCVwKLQlWKDBFLDA5LDBELDBCKSwJVihGMiw4QixDNyxBRCksCVYoMkQsQjYsQTgsQjkpLAlWKDE0LDFFLEE5LEM4KSwJXAotCVYoNTcsRjEsMTksODUpLAlWKEFGLDc1LDA3LDRDKSwJVihFRSw5OSxERCxCQiksCVYoQTMsN0YsNjAsRkQpLAlcCi0JVihGNywwMSwyNiw5RiksCVYoNUMsNzIsRjUsQkMpLAlWKDQ0LDY2LDNCLEM1KSwJVig1QixGQiw3RSwzNCksCVwKLQlWKDhCLDQzLDI5LDc2KSwJVihDQiwyMyxDNixEQyksCVYoQjYsRUQsRkMsNjgpLAlWKEI4LEU0LEYxLDYzKSwJXAotCVYoRDcsMzEsREMsQ0EpLAlWKDQyLDYzLDg1LDEwKSwJVigxMyw5NywyMiw0MCksCVYoODQsQzYsMTEsMjApLAlcCi0JVig4NSw0QSwyNCw3RCksCVYoRDIsQkIsM0QsRjgpLAlWKEFFLEY5LDMyLDExKSwJVihDNywyOSxBMSw2RCksCVwKLQlWKDFELDlFLDJGLDRCKSwJVihEQyxCMiwzMCxGMyksCVYoMEQsODYsNTIsRUMpLAlWKDc3LEMxLEUzLEQwKSwJXAotCVYoMkIsQjMsMTYsNkMpLAlWKEE5LDcwLEI5LDk5KSwJVigxMSw5NCw0OCxGQSksCVYoNDcsRTksNjQsMjIpLAlcCi0JVihBOCxGQyw4QyxDNCksCVYoQTAsRjAsM0YsMUEpLAlWKDU2LDdELDJDLEQ4KSwJVigyMiwzMyw5MCxFRiksCVwKLQlWKDg3LDQ5LDRFLEM3KSwJVihEOSwzOCxEMSxDMSksCVYoOEMsQ0EsQTIsRkUpLAlWKDk4LEQ0LDBCLDM2KSwJXAotCVYoQTYsRjUsODEsQ0YpLAlWKEE1LDdBLERFLDI4KSwJVihEQSxCNyw4RSwyNiksCVYoM0YsQUQsQkYsQTQpLAlcCi0JVigyQywzQSw5RCxFNCksCVYoNTAsNzgsOTIsMEQpLAlWKDZBLDVGLENDLDlCKSwJVig1NCw3RSw0Niw2MiksCVwKLQlWKEY2LDhELDEzLEMyKSwJVig5MCxEOCxCOCxFOCksCVYoMkUsMzksRjcsNUUpLAlWKDgyLEMzLEFGLEY1KSwJXAotCVYoOUYsNUQsODAsQkUpLAlWKDY5LEQwLDkzLDdDKSwJVig2RixENSwyRCxBOSksCVYoQ0YsMjUsMTIsQjMpLAlcCi0JVihDOCxBQyw5OSwzQiksCVYoMTAsMTgsN0QsQTcpLAlWKEU4LDlDLDYzLDZFKSwJVihEQiwzQixCQiw3QiksCVwKLQlWKENELDI2LDc4LDA5KSwJVig2RSw1OSwxOCxGNCksCVYoRUMsOUEsQjcsMDEpLAlWKDgzLDRGLDlBLEE4KSwJXAotCVYoRTYsOTUsNkUsNjUpLAlWKEFBLEZGLEU2LDdFKSwJVigyMSxCQyxDRiwwOCksCVYoRUYsMTUsRTgsRTYpLAlcCi0JVihCQSxFNyw5QixEOSksCVYoNEEsNkYsMzYsQ0UpLAlWKEVBLDlGLDA5LEQ0KSwJVigyOSxCMCw3QyxENiksCVwKLQlWKDMxLEE0LEIyLEFGKSwJVigyQSwzRiwyMywzMSksCVYoQzYsQTUsOTQsMzApLAlWKDM1LEEyLDY2LEMwKSwJXAotCVYoNzQsNEUsQkMsMzcpLAlWKEZDLDgyLENBLEE2KSwJVihFMCw5MCxEMCxCMCksCVYoMzMsQTcsRDgsMTUpLAlcCi0JVihGMSwwNCw5OCw0QSksCVYoNDEsRUMsREEsRjcpLAlWKDdGLENELDUwLDBFKSwJVigxNyw5MSxGNiwyRiksCVwKLQlWKDc2LDRELEQ2LDhEKSwJVig0MyxFRixCMCw0RCksCVYoQ0MsQUEsNEQsNTQpLAlWKEU0LDk2LDA0LERGKSwJXAotCVYoOUUsRDEsQjUsRTMpLAlWKDRDLDZBLDg4LDFCKSwJVihDMSwyQywxRixCOCksCVYoNDYsNjUsNTEsN0YpLAlcCi0JVig5RCw1RSxFQSwwNCksCVYoMDEsOEMsMzUsNUQpLAlWKEZBLDg3LDc0LDczKSwJVihGQiwwQiw0MSwyRSksCVwKLQlWKEIzLDY3LDFELDVBKSwJVig5MixEQixEMiw1MiksCVYoRTksMTAsNTYsMzMpLAlWKDZELEQ2LDQ3LDEzKSwJXAotCVYoOUEsRDcsNjEsOEMpLAlWKDM3LEExLDBDLDdBKSwJVig1OSxGOCwxNCw4RSksCVYoRUIsMTMsM0MsODkpLAlcCi0JVihDRSxBOSwyNyxFRSksCVYoQjcsNjEsQzksMzUpLAlWKEUxLDFDLEU1LEVEKSwJVig3QSw0NyxCMSwzQyksCVwKLQlWKDlDLEQyLERGLDU5KSwJVig1NSxGMiw3MywzRiksCVYoMTgsMTQsQ0UsNzkpLAlWKDczLEM3LDM3LEJGKSwJXAotCVYoNTMsRjcsQ0QsRUEpLAlWKDVGLEZELEFBLDVCKSwJVihERiwzRCw2RiwxNCksCVYoNzgsNDQsREIsODYpLAlcCi0JVihDQSxBRixGMyw4MSksCVYoQjksNjgsQzQsM0UpLAlWKDM4LDI0LDM0LDJDKSwJVihDMixBMyw0MCw1RiksCVwKLQlWKDE2LDFELEMzLDcyKSwJVihCQyxFMiwyNSwwQyksCVYoMjgsM0MsNDksOEIpLAlWKEZGLDBELDk1LDQxKSwJXAotCVYoMzksQTgsMDEsNzEpLAlWKDA4LDBDLEIzLERFKSwJVihEOCxCNCxFNCw5QyksCVYoNjQsNTYsQzEsOTApLAlcCi0JVig3QixDQiw4NCw2MSksCVYoRDUsMzIsQjYsNzApLAlWKDQ4LDZDLDVDLDc0KSwJVihEMCxCOCw1Nyw0MikKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNhIyNiIyNjIyNkCi1zdGF0aWMgdWludDMyIFJUMFsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNkIyNhIyNiIyNjCi1zdGF0aWMgdWludDMyIFJUMVsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNjIyNkIyNhIyNiCi1zdGF0aWMgdWludDMyIFJUMlsyNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI2RlZmluZQlWKGEsYixjLGQpIDB4IyNiIyNjIyNkIyNhCi1zdGF0aWMgdWludDMyIFJUM1syNTZdID0geyBSVCB9OwotI3VuZGVmIFYKLQotI3VuZGVmIFJUCi0KLS8qIHJvdW5kIGNvbnN0YW50cyAqLwotCi1zdGF0aWMgdWludDMyIFJDT05bMTBdID0KLXsKLQkweDAxMDAwMDAwLAkweDAyMDAwMDAwLAkweDA0MDAwMDAwLAkweDA4MDAwMDAwLAotCTB4MTAwMDAwMDAsCTB4MjAwMDAwMDAsCTB4NDAwMDAwMDAsCTB4ODAwMDAwMDAsCi0JMHgxQjAwMDAwMCwJMHgzNjAwMDAwMAotfTsKLQotLyoga2V5IHNjaGVkdWxlCXRhYmxlcyAqLwotCi1zdGF0aWMgaW50IEtUX2luaXQgPSAxOwotCi1zdGF0aWMgdWludDMyIEtUMFsyNTZdOwotc3RhdGljIHVpbnQzMiBLVDFbMjU2XTsKLXN0YXRpYyB1aW50MzIgS1QyWzI1Nl07Ci1zdGF0aWMgdWludDMyIEtUM1syNTZdOwotCi0vKiBwbGF0Zm9ybS1pbmRlcGVuZGFudAkzMi1iaXQgaW50ZWdlciBtYW5pcHVsYXRpb24JbWFjcm9zICovCi0KLSNkZWZpbmUJR0VUX1VJTlQzMihuLGIsaSkJCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCShuKQk9ICgJKHVpbnQzMikgKGIpWyhpKQldIDw8IDI0CSkJCVwKLQkJfCAoCSh1aW50MzIpIChiKVsoaSkgKyAxXSA8PCAxNgkpCQlcCi0JCXwgKAkodWludDMyKSAoYilbKGkpICsgMl0gPDwgIDgJKQkJXAotCQl8ICgJKHVpbnQzMikgKGIpWyhpKSArIDNdCQkpOwkJXAotfQotCi0jZGVmaW5lCVBVVF9VSU5UMzIobixiLGkpCQkJCQkJXAotewkJCQkJCQkJCQkJCVwKLQkoYilbKGkpCSAgIF0gPSAodWludDgpICggKG4pID4+CTI0ICk7CQlcCi0JKGIpWyhpKQkrIDFdID0gKHVpbnQ4KSAoIChuKSA+PgkxNiApOwkJXAotCShiKVsoaSkJKyAyXSA9ICh1aW50OCkgKCAobikgPj4JIDggKTsJCVwKLQkoYilbKGkpCSsgM10gPSAodWludDgpICggKG4pCSAgICk7CQlcCi19Ci0KLQotaW50CXJ0X2Flc19zZXRfa2V5KCBhZXNfY29udGV4dCAqY3R4LCB1aW50OCAqa2V5LCBpbnQgbmJpdHMgKQotewotCWludAlpOwotCXVpbnQzMiAqUkssCSpTSzsKLQotCXN3aXRjaCgJbmJpdHMgKQotCXsKLQkJY2FzZSAxMjg6IGN0eC0+bnIgPQkxMDsJYnJlYWs7Ci0JCWNhc2UgMTkyOiBjdHgtPm5yID0JMTI7CWJyZWFrOwotCQljYXNlIDI1NjogY3R4LT5uciA9CTE0OwlicmVhazsKLQkJZGVmYXVsdAk6IHJldHVybiggMQkpOwotCX0KLQotCVJLID0gKHVpbnQzMiAqKSBjdHgtPmVyazsKLQotCWZvciggaSA9IDA7CWkgPAkobmJpdHMgPj4gNSk7IGkrKyApCi0JewotCQlHRVRfVUlOVDMyKAlSS1tpXSwga2V5LAlpICoJNCApOwotCX0KLQotCS8qIHNldHVwIGVuY3J5cHRpb24Jcm91bmQga2V5cyAqLwotCi0Jc3dpdGNoKAluYml0cyApCi0JewotCWNhc2UgMTI4OgotCi0JCWZvciggaSA9IDA7CWkgPAkxMDsJaSsrLCBSSwkrPSA0ICkKLQkJewotCQkJUktbNF0gID0gUktbMF0gXiBSQ09OW2ldIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbM10gPj4gMTYgKSBdIDw8CTI0ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAgOCApIF0gPDwJMTYgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzNdCQkgKSBdIDw8CSA4ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1szXSA+PiAyNCApIF0JICAgKTsKLQotCQkJUktbNV0gID0gUktbMV0gXiBSS1s0XTsKLQkJCVJLWzZdICA9IFJLWzJdIF4gUktbNV07Ci0JCQlSS1s3XSAgPSBSS1szXSBeIFJLWzZdOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAxOTI6Ci0KLQkJZm9yKCBpID0gMDsJaSA8CTg7IGkrKywJUksgKz0gNgkpCi0JCXsKLQkJCVJLWzZdICA9IFJLWzBdIF4gUkNPTltpXSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzVdID4+IDE2ICkgXSA8PAkyNCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gIDggKSBdIDw8CTE2ICkgXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s1XQkJICkgXSA8PAkgOCApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbNV0gPj4gMjQgKSBdCSAgICk7Ci0KLQkJCVJLWzddICA9IFJLWzFdIF4gUktbNl07Ci0JCQlSS1s4XSAgPSBSS1syXSBeIFJLWzddOwotCQkJUktbOV0gID0gUktbM10gXiBSS1s4XTsKLQkJCVJLWzEwXSA9IFJLWzRdIF4gUktbOV07Ci0JCQlSS1sxMV0gPSBSS1s1XSBeIFJLWzEwXTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgMjU2OgotCi0JCWZvciggaSA9IDA7CWkgPAk3OyBpKyssCVJLICs9IDgJKQotCQl7Ci0JCQlSS1s4XSAgPSBSS1swXSBeIFJDT05baV0gXgotCQkJCQkJKCBGU2JbICh1aW50OCkgKCBSS1s3XSA+PiAxNiApIF0gPDwJMjQgKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+ICA4ICkgXSA8PAkxNiApIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbN10JCSApIF0gPDwJIDggKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzddID4+IDI0ICkgXQkgICApOwotCi0JCQlSS1s5XSAgPSBSS1sxXSBeIFJLWzhdOwotCQkJUktbMTBdID0gUktbMl0gXiBSS1s5XTsKLQkJCVJLWzExXSA9IFJLWzNdIF4gUktbMTBdOwotCi0JCQlSS1sxMl0gPSBSS1s0XSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+PiAyNCApCV0gPDwgMjQJKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+PiAxNiApCV0gPDwgMTYJKSBeCi0JCQkJCQkoIEZTYlsgKHVpbnQ4KSAoIFJLWzExXQk+Pgk4ICkJXSA8PCAgOAkpIF4KLQkJCQkJCSggRlNiWyAodWludDgpICggUktbMTFdCQkgICkJXQkJKTsKLQotCQkJUktbMTNdID0gUktbNV0gXiBSS1sxMl07Ci0JCQlSS1sxNF0gPSBSS1s2XSBeIFJLWzEzXTsKLQkJCVJLWzE1XSA9IFJLWzddIF4gUktbMTRdOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCS8qIHNldHVwIGRlY3J5cHRpb24Jcm91bmQga2V5cyAqLwotCi0JaWYoCUtUX2luaXQJKQotCXsKLQkJZm9yKCBpID0gMDsJaSA8CTI1NjsgaSsrICkKLQkJewotCQkJS1QwW2ldID0gUlQwWyBGU2JbaV0gXTsKLQkJCUtUMVtpXSA9IFJUMVsgRlNiW2ldIF07Ci0JCQlLVDJbaV0gPSBSVDJbIEZTYltpXSBdOwotCQkJS1QzW2ldID0gUlQzWyBGU2JbaV0gXTsKLQkJfQotCi0JCUtUX2luaXQJPSAwOwotCX0KLQotCVNLID0gKHVpbnQzMiAqKSBjdHgtPmRyazsKLQotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0KLQlmb3IoIGkgPSAxOwlpIDwJY3R4LT5ucjsgaSsrICkKLQl7Ci0JCVJLIC09IDg7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0KLQkJKlNLKysgPQlLVDBbICh1aW50OCkgKCAqUksgPj4gMjQgKSBdIF4KLQkJCQlLVDFbICh1aW50OCkgKCAqUksgPj4gMTYgKSBdIF4KLQkJCQlLVDJbICh1aW50OCkgKCAqUksgPj4gIDggKSBdIF4KLQkJCQlLVDNbICh1aW50OCkgKCAqUksJCSApIF07IFJLKys7Ci0JfQotCi0JUksgLT0gODsKLQotCSpTSysrID0JKlJLKys7Ci0JKlNLKysgPQkqUksrKzsKLQkqU0srKyA9CSpSSysrOwotCSpTSysrID0JKlJLKys7Ci0KLQlyZXR1cm4oCTAgKTsKLX0KLQotLyogQUVTIDEyOC1iaXQgYmxvY2sgZW5jcnlwdGlvbglyb3V0aW5lCSovCi0KLXZvaWQgcnRfYWVzX2VuY3J5cHQoYWVzX2NvbnRleHQgKmN0eCwgdWludDggaW5wdXRbMTZdLAl1aW50OCBvdXRwdXRbMTZdICkKLXsKLQl1aW50MzIgKlJLLAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTM7Ci0KLQlSSyA9ICh1aW50MzIgKikgY3R4LT5lcms7Ci0JR0VUX1VJTlQzMigJWDAsCWlucHV0LAkwICk7IFgwCV49IFJLWzBdOwotCUdFVF9VSU5UMzIoCVgxLAlpbnB1dCwJNCApOyBYMQlePSBSS1sxXTsKLQlHRVRfVUlOVDMyKAlYMiwJaW5wdXQsCTggKTsgWDIJXj0gUktbMl07Ci0JR0VUX1VJTlQzMigJWDMsCWlucHV0LCAxMiApOyBYMwlePSBSS1szXTsKLQotI2RlZmluZQlBRVNfRlJPVU5EKFgwLFgxLFgyLFgzLFkwLFkxLFkyLFkzKQkJXAotewkJCQkJCQkJCQkJCVwKLQlSSyArPSA0OwkJCQkJCQkJCVwKLQkJCQkJCQkJCQkJCVwKLQlYMCA9IFJLWzBdIF4gRlQwWyAodWludDgpICgJWTAgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMSA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkyID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTMJCSApIF07CVwKLQkJCQkJCQkJCQkJCVwKLQlYMSA9IFJLWzFdIF4gRlQwWyAodWludDgpICgJWTEgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMiA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkzID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTAJCSApIF07CVwKLQkJCQkJCQkJCQkJCVwKLQlYMiA9IFJLWzJdIF4gRlQwWyAodWludDgpICgJWTIgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMyA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkwID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTEJCSApIF07CVwKLQkJCQkJCQkJCQkJCVwKLQlYMyA9IFJLWzNdIF4gRlQwWyAodWludDgpICgJWTMgPj4gMjQgKSBdIF4JXAotCQkJCSBGVDFbICh1aW50OCkgKAlZMCA+PiAxNiApIF0gXglcCi0JCQkJIEZUMlsgKHVpbnQ4KSAoCVkxID4+ICA4ICkgXSBeCVwKLQkJCQkgRlQzWyAodWludDgpICgJWTIJCSApIF07CVwKLX0KLQotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMSAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgMiAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgMyAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNCAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNSAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgNiAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgNyAqLwotCUFFU19GUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkJLyogcm91bmQgOCAqLwotCUFFU19GUk9VTkQoCVkwLAlZMSwJWTIsCVkzLAlYMCwJWDEsCVgyLAlYMyApOwkJLyogcm91bmQgOSAqLwotCi0JaWYoCWN0eC0+bnIJPiAxMCApCi0JewotCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTAJKi8KLQkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDExCSovCi0JfQotCi0JaWYoCWN0eC0+bnIJPiAxMiApCi0JewotCQlBRVNfRlJPVU5EKAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTMgKTsJLyogcm91bmQgMTIJKi8KLQkJQUVTX0ZST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CS8qIHJvdW5kIDEzCSovCi0JfQotCi0JLyogbGFzdAlyb3VuZCAqLwotCi0JUksgKz0gNDsKLQotCVgwID0gUktbMF0gXiAoIEZTYlsJKHVpbnQ4KQkoIFkwID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzCSAgICkgXQkJICk7Ci0KLQlYMSA9IFJLWzFdIF4gKCBGU2JbCSh1aW50OCkJKCBZMSA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTIgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMAkgICApIF0JCSApOwotCi0JWDIgPSBSS1syXSBeICggRlNiWwkodWludDgpCSggWTIgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKLQotCVgzID0gUktbM10gXiAoIEZTYlsJKHVpbnQ4KQkoIFkzID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBGU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggRlNiWwkodWludDgpCSggWTEgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIEZTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7Ci0KLQlQVVRfVUlOVDMyKAlYMCwJb3V0cHV0LAkgMCApOwotCVBVVF9VSU5UMzIoCVgxLAlvdXRwdXQsCSA0ICk7Ci0JUFVUX1VJTlQzMigJWDIsCW91dHB1dCwJIDggKTsKLQlQVVRfVUlOVDMyKAlYMywJb3V0cHV0LAkxMiApOwotfQotCi0vKiBBRVMgMTI4LWJpdCBibG9jayBkZWNyeXB0aW9uCXJvdXRpbmUJKi8KLQotdm9pZCBydF9hZXNfZGVjcnlwdCggYWVzX2NvbnRleHQgKmN0eCwJdWludDggaW5wdXRbMTZdLCB1aW50OCBvdXRwdXRbMTZdICkKLXsKLQl1aW50MzIgKlJLLAlYMCwJWDEsCVgyLAlYMywJWTAsCVkxLAlZMiwJWTM7Ci0KLQlSSyA9ICh1aW50MzIgKikgY3R4LT5kcms7Ci0KLQlHRVRfVUlOVDMyKAlYMCwJaW5wdXQsCTAgKTsgWDAJXj0gUktbMF07Ci0JR0VUX1VJTlQzMigJWDEsCWlucHV0LAk0ICk7IFgxCV49IFJLWzFdOwotCUdFVF9VSU5UMzIoCVgyLAlpbnB1dCwJOCApOyBYMglePSBSS1syXTsKLQlHRVRfVUlOVDMyKAlYMywJaW5wdXQsIDEyICk7IFgzCV49IFJLWzNdOwotCi0jZGVmaW5lCUFFU19SUk9VTkQoWDAsWDEsWDIsWDMsWTAsWTEsWTIsWTMpCQlcCi17CQkJCQkJCQkJCQkJXAotCVJLICs9IDQ7CQkJCQkJCQkJXAotCQkJCQkJCQkJCQkJXAotCVgwID0gUktbMF0gXiBSVDBbICh1aW50OCkgKAlZMCA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkzID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTIgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMQkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgxID0gUktbMV0gXiBSVDBbICh1aW50OCkgKAlZMSA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkwID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTMgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMgkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgyID0gUktbMl0gXiBSVDBbICh1aW50OCkgKAlZMiA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkxID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTAgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMwkJICkgXTsJXAotCQkJCQkJCQkJCQkJXAotCVgzID0gUktbM10gXiBSVDBbICh1aW50OCkgKAlZMyA+PiAyNCApIF0gXglcCi0JCQkJIFJUMVsgKHVpbnQ4KSAoCVkyID4+IDE2ICkgXSBeCVwKLQkJCQkgUlQyWyAodWludDgpICgJWTEgPj4gIDggKSBdIF4JXAotCQkJCSBSVDNbICh1aW50OCkgKAlZMAkJICkgXTsJXAotfQotCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAxICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCAyICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCAzICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA0ICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA1ICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA2ICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA3ICovCi0JQUVTX1JST1VORCgJWDAsCVgxLAlYMiwJWDMsCVkwLAlZMSwJWTIsCVkzICk7CQkvKiByb3VuZCA4ICovCi0JQUVTX1JST1VORCgJWTAsCVkxLAlZMiwJWTMsCVgwLAlYMSwJWDIsCVgzICk7CQkvKiByb3VuZCA5ICovCi0KLQlpZigJY3R4LT5ucgk+IDEwICkKLQl7Ci0JCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMAkqLwotCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTEJKi8KLQl9Ci0KLQlpZigJY3R4LT5ucgk+IDEyICkKLQl7Ci0JCUFFU19SUk9VTkQoCVgwLAlYMSwJWDIsCVgzLAlZMCwJWTEsCVkyLAlZMyApOwkvKiByb3VuZCAxMgkqLwotCQlBRVNfUlJPVU5EKAlZMCwJWTEsCVkyLAlZMywJWDAsCVgxLAlYMiwJWDMgKTsJLyogcm91bmQgMTMJKi8KLQl9Ci0KLQkvKiBsYXN0CXJvdW5kICovCi0KLQlSSyArPSA0OwotCi0JWDAgPSBSS1swXSBeICggUlNiWwkodWludDgpCSggWTAgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkzID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTEJICAgKSBdCQkgKTsKLQotCVgxID0gUktbMV0gXiAoIFJTYlsJKHVpbnQ4KQkoIFkxID4+CTI0ICkgXSA8PCAyNCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMCA+PgkxNiApIF0gPDwgMTYgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTMgPj4JIDggKSBdIDw8ICA4ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyCSAgICkgXQkJICk7Ci0KLQlYMiA9IFJLWzJdIF4gKCBSU2JbCSh1aW50OCkJKCBZMiA+PgkyNCApIF0gPDwgMjQgKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTEgPj4JMTYgKSBdIDw8IDE2ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkwID4+CSA4ICkgXSA8PCAgOCApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMwkgICApIF0JCSApOwotCi0JWDMgPSBSS1szXSBeICggUlNiWwkodWludDgpCSggWTMgPj4JMjQgKSBdIDw8IDI0ICkgXgotCQkJCSAoIFJTYlsJKHVpbnQ4KQkoIFkyID4+CTE2ICkgXSA8PCAxNiApIF4KLQkJCQkgKCBSU2JbCSh1aW50OCkJKCBZMSA+PgkgOCApIF0gPDwgIDggKSBeCi0JCQkJICggUlNiWwkodWludDgpCSggWTAJICAgKSBdCQkgKTsKLQotCVBVVF9VSU5UMzIoCVgwLAlvdXRwdXQsCSAwICk7Ci0JUFVUX1VJTlQzMigJWDEsCW91dHB1dCwJIDQgKTsKLQlQVVRfVUlOVDMyKAlYMiwJb3V0cHV0LAkgOCApOwotCVBVVF9VSU5UMzIoCVgzLAlvdXRwdXQsCTEyICk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgRU5DUllQVCBBRVMgR1RLIGJlZm9yZSBzZW5kaW5nIGluIEVBUE9MIGZyYW1lLgotICAgICAgICBBRVMgR1RLIGxlbmd0aCA9IDEyOCBiaXQsICBzbyBmaXggYmxvY2tzIGZvciBhZXMta2V5LXdyYXAgYXMgMiBpbiB0aGlzIGZ1bmN0aW9uLgotICAgICAgICBUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8gUkZDIDMzOTQgZm9yIGFlcyBrZXkgd3JhcCBhbGdvcml0aG0uCi0gICAgUmV0dXJuOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfR1RLX0tFWV9XUkFQKAotICAgIElOIFVDSEFSICAgICprZXksCi0gICAgSU4gVUNIQVIgICAgKnBsYWludGV4dCwKLSAgICBJTiBVSU5UMzIgICAgcF9sZW4sCi0gICAgT1VUIFVDSEFSICAgKmNpcGhlcnRleHQpCi17Ci0gICAgVUNIQVIgICAgICAgQVs4XSwgQklOWzE2XSwgQk9VVFsxNl07Ci0gICAgVUNIQVIgICAgICAgUls1MTJdOwotICAgIElOVCAgICAgICAgIG51bV9ibG9ja3MgPSBwX2xlbi84OyAgIC8vIHVuaXQ6NjRiaXRzCi0gICAgSU5UICAgICAgICAgaSwgajsKLSAgICBhZXNfY29udGV4dCBhZXNjdHg7Ci0gICAgVUNIQVIgICAgICAgeG9yOwotCi0gICAgcnRfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOwotCi0gICAgLy8gSW5pdCBJQQotICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIEFbaV0gPSAweGE2OwotCi0gICAgLy9JbnB1dCBwbGFpbnRleHQKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCi0gICAgICAgICAgICBSWzggKiAoaSArIDEpICsgal0gPSBwbGFpbnRleHRbOCAqIGkgKyBqXTsKLSAgICB9Ci0KLSAgICAvLyBLZXkgTWl4Ci0gICAgZm9yIChqID0gMDsgaiA8IDY7IGorKykKLSAgICB7Ci0gICAgICAgIGZvcihpID0gMTsgaSA8PSBudW1fYmxvY2tzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcGhhc2UgMQotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZCSU5bOF0sICZSWzggKiBpXSwgOCk7Ci0gICAgICAgICAgICBydF9hZXNfZW5jcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOwotCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBLCAmQk9VVFswXSwgOCk7Ci0gICAgICAgICAgICB4b3IgPSBudW1fYmxvY2tzICogaiArIGk7Ci0gICAgICAgICAgICBBWzddID0gQk9VVFs3XSBeIHhvcjsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSWzggKiBpXSwgJkJPVVRbOF0sIDgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3V0cHV0IGNpcGhlcnRleHQKLSAgICBOZGlzTW92ZU1lbW9yeShjaXBoZXJ0ZXh0LCBBLCA4KTsKLQotICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2Jsb2NrczsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMCA7IGogPCA4OyBqKyspCi0gICAgICAgICAgICBjaXBoZXJ0ZXh0WzggKiBpICsgal0gPSBSWzggKiBpICsgal07Ci0gICAgfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJTWlzYyBmdW5jdGlvbiB0byBkZWNyeXB0IEFFUyBib2R5Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCQlUaGlzIGZ1bmN0aW9uIHJlZmVyZW5jZXMgdG8JUkZDCTMzOTQgZm9yIGFlcyBrZXkgdW53cmFwIGFsZ29yaXRobS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQUVTX0dUS19LRVlfVU5XUkFQKAotCUlOCVVDSEFSCSprZXksCi0JT1VUCVVDSEFSCSpwbGFpbnRleHQsCi0JSU4JVUlOVDMyICAgY19sZW4sCi0JSU4JVUNIQVIJKmNpcGhlcnRleHQpCi0KLXsKLQlVQ0hBUiAgICAgICBBWzhdLCBCSU5bMTZdLCBCT1VUWzE2XTsKLQlVQ0hBUiAgICAgICB4b3I7Ci0JSU5UICAgICAgICAgaSwgajsKLQlhZXNfY29udGV4dCBhZXNjdHg7Ci0JVUNIQVIgICAgICAgKlI7Ci0JSU5UICAgICAgICAgbnVtX2Jsb2NrcyA9IGNfbGVuLzg7CS8vIHVuaXQ6NjRiaXRzCi0KLQotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJlIsIDUxMik7Ci0KLQlpZiAoUiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiISEhQUVTX0dUS19LRVlfVU5XUkFQOiBubyBtZW1vcnkhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLQkvLyBJbml0aWFsaXplCi0JTmRpc01vdmVNZW1vcnkoQSwgY2lwaGVydGV4dCwgOCk7Ci0JLy9JbnB1dCBwbGFpbnRleHQKLQlmb3IoaSA9IDA7IGkgPCAoY19sZW4tOCk7IGkrKykKLQl7Ci0JCVJbIGldID0gY2lwaGVydGV4dFtpICsgOF07Ci0JfQotCi0JcnRfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOwotCi0JZm9yKGogPSA1OyBqID49IDA7IGotLSkKLQl7Ci0JCWZvcihpID0gKG51bV9ibG9ja3MtMSk7IGkgPiAwOyBpLS0pCi0JCXsKLQkJCXhvciA9IChudW1fYmxvY2tzIC0xICkqIGogKyBpOwotCQkJTmRpc01vdmVNZW1vcnkoQklOLCBBLCA4KTsKLQkJCUJJTls3XSA9IEFbN10gXiB4b3I7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmQklOWzhdLCAmUlsoaS0xKSo4XSwgOCk7Ci0JCQlydF9hZXNfZGVjcnlwdCgmYWVzY3R4LCBCSU4sIEJPVVQpOwotCQkJTmRpc01vdmVNZW1vcnkoQSwgJkJPVVRbMF0sIDgpOwotCQkJTmRpc01vdmVNZW1vcnkoJlJbKGktMSkqOF0sICZCT1VUWzhdLCA4KTsKLQkJfQotCX0KLQotCS8vIE9VVFBVVAotCWZvcihpID0gMDsgaSA8IGNfbGVuOyBpKyspCi0JewotCQlwbGFpbnRleHRbaV0gPSBSW2ldOwotCX0KLQotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgUik7Ci19Ci0KLQotLyogPT09PT09PSAgVGhlIHJlbGF0ZWQgZnVuY3Rpb24gb2YgQUVTLTEyOC1DTUFDICA9PT09PT09ICovCi1WT0lEIGxlZnRzaGlmdF9vbmViaXQoCi0JSU4gIFBVQ0hBUglpbnB1dCwKLQlPVVQgUFVDSEFSCW91dHB1dCkKLXsKLQlJTlQgaTsKLQlVQ0hBUiBvdmVyZmxvdyA9IDA7Ci0KLQlmb3IgKGk9MTU7IGk+PTA7IGktLSkKLQl7Ci0JCW91dHB1dFtpXSA9IGlucHV0W2ldIDw8IDE7Ci0JCW91dHB1dFtpXSB8PSBvdmVyZmxvdzsKLQkJb3ZlcmZsb3cgPSAoaW5wdXRbaV0gJiAweDgwKSA/IDEgOiAwOwotCX0KLX0KLQotVk9JRCBkb19wYWRkaW5nKAotCUlOCVBVQ0hBUglsYXN0YiwKLQlPVVQJUFVDSEFSCXBhZCwKLQlJTiAgSU5UCQlsZW4pCi17Ci0JSU5UCWo7Ci0KLQlmb3IgKGo9MDsgajwxNjsgaisrKQotCXsKLQkJaWYgKGogPCBsZW4pCi0JCQlwYWRbal0gPSBsYXN0YltqXTsKLQkJZWxzZSBpZiAoaiA9PSBsZW4pCi0JCQlwYWRbal0gPSAweDgwOwotCQllbHNlCi0JCQlwYWRbal0gPSAweDAwOwotCX0KLQotCi19Ci0KLS8qCi0gKglUaGUgU3Via2V5IEdlbmVyYXRpb24gQWxnb3JpdGhtCi0gKi8KLVZPSUQgZ2VuZXJhdGVfc3Via2V5KAotCUlOCVBVQ0hBUiBrZXksCi0JT1VUCVBVQ0hBUiBLMSwKLQlPVVQgUFVDSEFSIEsyKQotewotCWFlc19jb250ZXh0IGFlc2N0eDsKLQlVQ0hBUiBhZXNfMTI4X2tleVsxNl07Ci0JVUNIQVIgY29uc3RfWmVyb1sxNl07Ci0JVUNIQVIgdG1wWzE2XTsKLQlVQ0hBUiBjb25zdF9SYlsxNl0gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkJCQkJICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4N307Ci0KLQkvLyBpbml0aWFsIHRoZSBrZXkgbWF0ZXJpYWwKLQltZW1zZXQoY29uc3RfWmVybywgMCwgMTYpOwotCW1lbXNldChhZXNfMTI4X2tleSwgMCwgMTYpOwotCi0JLy8gQUVTLTEyOCB3aXRoIGtleSBpcyBhcHBsaWVkIHRvIGFuIGFsbC16ZXJvIGlucHV0IGJsb2NrCi0JcnRfYWVzX3NldF9rZXkoJmFlc2N0eCwga2V5LCAxMjgpOwotCXJ0X2Flc19lbmNyeXB0KCZhZXNjdHgsIGNvbnN0X1plcm8sIGFlc18xMjhfa2V5KTsKLQotCS8vIGRlcml2ZSBLMSgxMjgtYml0IGZpcnN0IHN1YmtleSkgYW5kIEsyKDEyOC1iaXQgc2Vjb25kIHN1YmtleSksIHJlZmVyIHRvIHJmYy00NDkzIGNoIDIuMwotCWlmICgoYWVzXzEyOF9rZXlbMF0gJiAweDgwKSA9PSAwKQotCXsKLQkJbGVmdHNoaWZ0X29uZWJpdChhZXNfMTI4X2tleSwgSzEpOwotCX0KLQllbHNlCi0JewotCQlsZWZ0c2hpZnRfb25lYml0KGFlc18xMjhfa2V5LCB0bXApOwotCQl4b3JfMTI4KHRtcCwgY29uc3RfUmIsIEsxKTsKLQl9Ci0KLQlpZiAoKEsxWzBdICYgMHg4MCkgPT0gMCkKLQl7Ci0JCWxlZnRzaGlmdF9vbmViaXQoSzEsIEsyKTsKLQl9Ci0JZWxzZQotCXsKLQkJbGVmdHNoaWZ0X29uZWJpdChLMSwgdG1wKTsKLQkJeG9yXzEyOCh0bXAsIGNvbnN0X1JiLCBLMik7Ci0JfQotCi19Ci0KLS8qCi0gKglBRVMtQ01BQyBBbGdvcml0aG0uIChyZWZlciB0byByZmMtNDQ5MyBhbmQgU1A4MDAtMzhCKQotICoKLSAqCUlucHV0IDoga2V5CQkoMTI4LWJpdCBrZXkpCi0gKgkJCWlucHV0CQkobWVzc2FnZSB0byBiZSBhdXRoZW50aWNhdGVkKQotICoJCQlsZW4JCQkobGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGluIG9jdGV0cykKLSAqCi0gKglvdXRwdXQ6IG1hYwkJCShtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUpCi0gKi8KLVZPSUQgQUVTXzEyOF9DTUFDKAotCUlOCVBVQ0hBUglrZXksCi0JSU4JUFVDSEFSCWlucHV0LAotCUlOCUlOVAkJbGVuLAotCU9VVAlQVUNIQVIJbWFjKQotewotCVVDSEFSCVhbMTZdLCBZWzE2XSwgTV9sYXN0WzE2XSwgcGFkZGVkWzE2XTsKLQlVQ0hBUglLMVsxNl0sIEsyWzE2XTsKLQlhZXNfY29udGV4dCBhZXNjdHg7Ci0JSU5UCQluLCBpLCBmbGFnOwotCi0JZ2VuZXJhdGVfc3Via2V5KGtleSwgSzEsIEsyKTsKLQotCW4gPSAobGVuKzE1KSAvIDE2OwkJLy8gbiBpcyBudW1iZXIgb2Ygcm91bmRzCi0KLQlpZiAobiA9PSAwKQotCXsKLQkJbiA9IDE7Ci0JCWZsYWcgPSAwOwotCX0KLQllbHNlCi0JewotCQlpZiAoKGxlbiUxNikgPT0gMCkKLQkJCWZsYWcgPSAxOwkJCS8vIGluZGljYXRlIHRoYXQgbGFzdCBibG9jayBpcyBhIGNvbXBsZXRlIGJsb2NrCi0JCWVsc2UKLQkJCWZsYWcgPSAwOwkJCS8vIGluZGljYXRlIHRoYXQgbGFzdCBibG9jayBpcyBub3QgYSBjb21wbGV0ZSBibG9jawotCX0KLQotCWlmIChmbGFnKQotCXsKLQkJeG9yXzEyOCgmaW5wdXRbMTYqKG4tMSldLCBLMSwgTV9sYXN0KTsKLQl9Ci0JZWxzZQotCXsKLQkJZG9fcGFkZGluZygmaW5wdXRbMTYqKG4tMSldLCBwYWRkZWQsIGxlbiUxNik7Ci0JCXhvcl8xMjgocGFkZGVkLCBLMiwgTV9sYXN0KTsKLQl9Ci0KLQltZW1zZXQoWCwgMCwgMTYpOwotCWZvciAoaT0wOyBpPG4tMTsgaSsrKQotCXsKLQkJeG9yXzEyOChYLCAmaW5wdXRbMTYqaV0sIFkpOwotCQlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0JCXJ0X2Flc19lbmNyeXB0KCZhZXNjdHgsIFksIFgpOwotCX0KLQotCXhvcl8xMjgoWCwgTV9sYXN0LCBZKTsKLQlydF9hZXNfc2V0X2tleSgmYWVzY3R4LCBrZXksIDEyOCk7Ci0JcnRfYWVzX2VuY3J5cHQoJmFlc2N0eCwgWSwgWCk7Ci0KLQlmb3IgKGk9MDsgaTwxNjsgaSsrKQotCXsKLQkJbWFjW2ldID0gWFtpXTsKLQl9Ci0KLX0KLS8qID09PT09PT0gIFRoZSByZWxhdGVkIGZ1bmN0aW9uIG9mIEFFUy0xMjgtQ01BQyAgPT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2FzaWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9hc2ljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMWM4MDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2FzaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NTMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljbW1fYXNpYy5jCi0KLQlBYnN0cmFjdDoKLQlGdW5jdGlvbnMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIEFTSUMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8gUmVzZXQgdGhlIFJGSUMgc2V0dGluZyB0byBuZXcgc2VyaWVzCi1SVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXSA9IHsKLS8vCQljaAkgUjEJCSBSMgkJIFIzKFRYMH40PTApIFI0Ci0JCXsxLCAgMHg5ODQwMmVjYywgMHg5ODRjMDc4NiwgMHg5ODE2YjQ1NSwgMHg5ODAwNTEwYn0sCi0JCXsyLCAgMHg5ODQwMmVjYywgMHg5ODRjMDc4NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0sCi0JCXszLCAgMHg5ODQwMmVjYywgMHg5ODRjMDc4YSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0sCi0JCXs0LCAgMHg5ODQwMmVjYywgMHg5ODRjMDc4YSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0sCi0JCXs1LCAgMHg5ODQwMmVjYywgMHg5ODRjMDc4ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0sCi0JCXs2LCAgMHg5ODQwMmVjYywgMHg5ODRjMDc4ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0sCi0JCXs3LCAgMHg5ODQwMmVjYywgMHg5ODRjMDc5MiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0sCi0JCXs4LCAgMHg5ODQwMmVjYywgMHg5ODRjMDc5MiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0sCi0JCXs5LCAgMHg5ODQwMmVjYywgMHg5ODRjMDc5NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0sCi0JCXsxMCwgMHg5ODQwMmVjYywgMHg5ODRjMDc5NiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0sCi0JCXsxMSwgMHg5ODQwMmVjYywgMHg5ODRjMDc5YSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0sCi0JCXsxMiwgMHg5ODQwMmVjYywgMHg5ODRjMDc5YSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5Zn0sCi0JCXsxMywgMHg5ODQwMmVjYywgMHg5ODRjMDc5ZSwgMHg5ODE2OGE1NSwgMHg5ODAwNTE4Yn0sCi0JCXsxNCwgMHg5ODQwMmVjYywgMHg5ODRjMDdhMiwgMHg5ODE2OGE1NSwgMHg5ODAwNTE5M30sCi0KLQkJLy8gODAyLjExIFVOSSAvIEh5cGVyTGFuIDIKLQkJezM2LCAweDk4NDAyZWNjLCAweDk4NGMwOTlhLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfSwKLQkJezM4LCAweDk4NDAyZWNjLCAweDk4NGMwOTllLCAweDk4MTU4YTU1LCAweDk4MGVkMTkzfSwKLQkJezQwLCAweDk4NDAyZWM4LCAweDk4NGMwNjgyLCAweDk4MTU4YTU1LCAweDk4MGVkMTgzfSwKLQkJezQ0LCAweDk4NDAyZWM4LCAweDk4NGMwNjgyLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfSwKLQkJezQ2LCAweDk4NDAyZWM4LCAweDk4NGMwNjg2LCAweDk4MTU4YTU1LCAweDk4MGVkMThifSwKLQkJezQ4LCAweDk4NDAyZWM4LCAweDk4NGMwNjg2LCAweDk4MTU4YTU1LCAweDk4MGVkMTlifSwKLQkJezUyLCAweDk4NDAyZWM4LCAweDk4NGMwNjhhLCAweDk4MTU4YTU1LCAweDk4MGVkMTkzfSwKLQkJezU0LCAweDk4NDAyZWM4LCAweDk4NGMwNjhhLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfSwKLQkJezU2LCAweDk4NDAyZWM4LCAweDk4NGMwNjhlLCAweDk4MTU4YTU1LCAweDk4MGVkMThifSwKLQkJezYwLCAweDk4NDAyZWM4LCAweDk4NGMwNjkyLCAweDk4MTU4YTU1LCAweDk4MGVkMTgzfSwKLQkJezYyLCAweDk4NDAyZWM4LCAweDk4NGMwNjkyLCAweDk4MTU4YTU1LCAweDk4MGVkMTkzfSwKLQkJezY0LCAweDk4NDAyZWM4LCAweDk4NGMwNjkyLCAweDk4MTU4YTU1LCAweDk4MGVkMWEzfSwgLy8gUGx1Z2Zlc3QjNCwgRGF5NCwgY2hhbmdlIFJGUjMgbGVmdDR0aCA5LT41LgotCi0JCS8vIDgwMi4xMSBIeXBlckxhbiAyCi0JCXsxMDAsIDB4OTg0MDJlYzgsIDB4OTg0YzA2YjIsIDB4OTgxNzhhNTUsIDB4OTgwZWQ3ODN9LAotCi0JCS8vIDIwMDguMDQuMzAgbW9kaWZpZWQKLQkJLy8gVGhlIHN5c3RlbSB0ZWFtIGhhcyBBTiB0byBpbXByb3ZlIHRoZSBFVk0gdmFsdWUKLQkJLy8gZm9yIGNoYW5uZWwgMTAyIHRvIDEwOCBmb3IgdGhlIFJUMjg1MC9SVDI3NTAgZHVhbCBiYW5kIHNvbHV0aW9uLgotCQl7MTAyLCAweDk4NDAyZWM4LCAweDk4NWMwNmIyLCAweDk4NTc4YTU1LCAweDk4MGVkNzkzfSwKLQkJezEwNCwgMHg5ODQwMmVjOCwgMHg5ODVjMDZiMiwgMHg5ODU3OGE1NSwgMHg5ODBlZDFhM30sCi0JCXsxMDgsIDB4OTg0MDJlY2MsIDB4OTg1YzBhMzIsIDB4OTg1NzhhNTUsIDB4OTgwZWQxOTN9LAotCi0JCXsxMTAsIDB4OTg0MDJlY2MsIDB4OTg0YzBhMzYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAotCQl7MTEyLCAweDk4NDAyZWNjLCAweDk4NGMwYTM2LCAweDk4MTc4YTU1LCAweDk4MGVkMTlifSwKLQkJezExNiwgMHg5ODQwMmVjYywgMHg5ODRjMGEzYSwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhM30sCi0JCXsxMTgsIDB4OTg0MDJlY2MsIDB4OTg0YzBhM2UsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTN9LAotCQl7MTIwLCAweDk4NDAyZWM0LCAweDk4NGMwMzgyLCAweDk4MTc4YTU1LCAweDk4MGVkMTgzfSwKLQkJezEyNCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5M30sCi0JCXsxMjYsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxNWJ9LCAvLyAweDk4MGVkMWJiLT4weDk4MGVkMTViIHJlcXVpcmVkIGJ5IFJvcnkgMjAwNzA5MjcKLQkJezEyOCwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDFhM30sCi0JCXsxMzIsIDB4OTg0MDJlYzQsIDB4OTg0YzAzODYsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOGJ9LAotCQl7MTM0LCAweDk4NDAyZWM0LCAweDk4NGMwMzg2LCAweDk4MTc4YTU1LCAweDk4MGVkMTkzfSwKLQkJezEzNiwgMHg5ODQwMmVjNCwgMHg5ODRjMDM4NiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE5Yn0sCi0JCXsxNDAsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGEsIDB4OTgxNzhhNTUsIDB4OTgwZWQxODN9LAotCi0JCS8vIDgwMi4xMSBVTklJCi0JCXsxNDksIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGEsIDB4OTgxNzhhNTUsIDB4OTgwZWQxYTd9LAotCQl7MTUxLCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMTg3fSwKLQkJezE1MywgMHg5ODQwMmVjNCwgMHg5ODRjMDM4ZSwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4Zn0sCi0JCXsxNTcsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOGUsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOWZ9LAotCQl7MTU5LCAweDk4NDAyZWM0LCAweDk4NGMwMzhlLCAweDk4MTc4YTU1LCAweDk4MGVkMWE3fSwKLQkJezE2MSwgMHg5ODQwMmVjNCwgMHg5ODRjMDM5MiwgMHg5ODE3OGE1NSwgMHg5ODBlZDE4N30sCi0JCXsxNjUsIDB4OTg0MDJlYzQsIDB4OTg0YzAzOTIsIDB4OTgxNzhhNTUsIDB4OTgwZWQxOTd9LAotCQl7MTY3LCAweDk4NDAyZWM0LCAweDk4NGMwM2QyLCAweDk4MTc5ODU1LCAweDk4MTU1MzFmfSwKLQkJezE2OSwgMHg5ODQwMmVjNCwgMHg5ODRjMDNkMiwgMHg5ODE3OTg1NSwgMHg5ODE1NTMyN30sCi0JCXsxNzEsIDB4OTg0MDJlYzQsIDB4OTg0YzAzZDYsIDB4OTgxNzk4NTUsIDB4OTgxNTUzMDd9LAotCQl7MTczLCAweDk4NDAyZWM0LCAweDk4NGMwM2Q2LCAweDk4MTc5ODU1LCAweDk4MTU1MzBmfSwKLQotCQkvLyBKYXBhbgotCQl7MTg0LCAweDk1MDAyY2NjLCAweDk1MDA0OTFlLCAweDk1MDliZTU1LCAweDk1MGMwYTBifSwKLQkJezE4OCwgMHg5NTAwMmNjYywgMHg5NTAwNDkyMiwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCi0JCXsxOTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5MjYsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAotCQl7MTk2LCAweDk1MDAyY2NjLCAweDk1MDA0OTJhLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKLQkJezIwOCwgMHg5NTAwMmNjYywgMHg5NTAwNDkzYSwgMHg5NTA5YmU1NSwgMHg5NTBjMGExM30sCi0JCXsyMTIsIDB4OTUwMDJjY2MsIDB4OTUwMDQ5M2UsIDB4OTUwOWJlNTUsIDB4OTUwYzBhMWJ9LAotCQl7MjE2LCAweDk1MDAyY2NjLCAweDk1MDA0OTgyLCAweDk1MDliZTU1LCAweDk1MGMwYTIzfSwKLQotCQkvLyBzdGlsbCBsYWNrIG9mIE1NQUMoSmFwYW4pIGNoIDM0LDM4LDQyLDQ2Ci19OwotVUNIQVIJTlVNX09GXzI4NTBfQ0hOTCA9IChzaXplb2YoUkYyODUwUmVnVGFibGUpIC8gc2l6ZW9mKFJUTVBfUkZfUkVHUykpOwotCi1GUkVRVUVOQ1lfSVRFTSBGcmVxSXRlbXMzMDIwW10gPQotewotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLyBJU00gOiAyLjQgdG8gMi40ODMgR0h6ICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vIDExZwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvLy1DSC0tLU4tLS0tLS0tUi0tLUstLS0tLS0tLS0tLQotCXsxLCAgICAyNDEsICAyLCAgMn0sCi0JezIsICAgIDI0MSwJIDIsICA3fSwKLQl7MywgICAgMjQyLAkgMiwgIDJ9LAotCXs0LCAgICAyNDIsCSAyLCAgN30sCi0JezUsICAgIDI0MywJIDIsICAyfSwKLQl7NiwgICAgMjQzLAkgMiwgIDd9LAotCXs3LCAgICAyNDQsCSAyLCAgMn0sCi0JezgsICAgIDI0NCwJIDIsICA3fSwKLQl7OSwgICAgMjQ1LAkgMiwgIDJ9LAotCXsxMCwgICAyNDUsCSAyLCAgN30sCi0JezExLCAgIDI0NiwJIDIsICAyfSwKLQl7MTIsICAgMjQ2LAkgMiwgIDd9LAotCXsxMywgICAyNDcsCSAyLCAgMn0sCi0JezE0LCAgIDI0OCwJIDIsICA0fSwKLX07Ci1VQ0hBUglOVU1fT0ZfMzAyMF9DSE5MID0gKHNpemVvZihGcmVxSXRlbXMzMDIwKSAvIHNpemVvZihGUkVRVUVOQ1lfSVRFTSkpOwotCi0KLVZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBSYXRlVGFibGUpCi17Ci0JVUNIQVIJCQkJCWk7Ci0JSFRfRkJLX0NGRzBfU1RSVUMJCUh0Q2ZnMDsKLQlIVF9GQktfQ0ZHMV9TVFJVQwkJSHRDZmcxOwotCUxHX0ZCS19DRkcwX1NUUlVDCQlMZ0NmZzA7Ci0JTEdfRkJLX0NGRzFfU1RSVUMJCUxnQ2ZnMTsKLQlQUlRNUF9UWF9SQVRFX1NXSVRDSAlwQ3VyclR4UmF0ZSwgcE5leHRUeFJhdGU7Ci0KLQkvLyBzZXQgdG8gaW5pdGlhbCB2YWx1ZQotCUh0Q2ZnMC53b3JkID0gMHg2NTQzMjEwMDsKLQlIdENmZzEud29yZCA9IDB4ZWRjYmE5ODg7Ci0JTGdDZmcwLndvcmQgPSAweGVkY2JhOTg4OwotCUxnQ2ZnMS53b3JkID0gMHgwMDAwMjEwMDsKLQotCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKXBSYXRlVGFibGUrMTsKLQlmb3IgKGkgPSAxOyBpIDwgKigoUFVDSEFSKSBwUmF0ZVRhYmxlKTsgaSsrKQotCXsKLQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpcFJhdGVUYWJsZSsxK2k7Ci0JCXN3aXRjaCAocEN1cnJUeFJhdGUtPk1vZGUpCi0JCXsKLQkJCWNhc2UgMDoJCS8vQ0NLCi0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6CQkvL09GRE0KLQkJCQl7Ci0JCQkJCXN3aXRjaChwQ3VyclR4UmF0ZS0+Q3Vyck1DUykKLQkJCQkJewotCQkJCQkJY2FzZSAwOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTMEZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzFGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1MyRkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAzOgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTM0ZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzRGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDU6Ci0JCQkJCQkJTGdDZmcwLmZpZWxkLk9GRE1NQ1M1RkJLID0gKHBOZXh0VHhSYXRlLT5Nb2RlID09IE1PREVfT0ZETSkgPyAocE5leHRUeFJhdGUtPkN1cnJNQ1MrOCk6IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA2OgotCQkJCQkJCUxnQ2ZnMC5maWVsZC5PRkRNTUNTNkZCSyA9IChwTmV4dFR4UmF0ZS0+TW9kZSA9PSBNT0RFX09GRE0pID8gKHBOZXh0VHhSYXRlLT5DdXJyTUNTKzgpOiBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNzoKLQkJCQkJCQlMZ0NmZzAuZmllbGQuT0ZETU1DUzdGQksgPSAocE5leHRUeFJhdGUtPk1vZGUgPT0gTU9ERV9PRkRNKSA/IChwTmV4dFR4UmF0ZS0+Q3Vyck1DUys4KTogcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQljYXNlIDI6CQkvL0hULU1JWAotCQkJY2FzZSAzOgkJLy9IVC1HRgotCQkJCXsKLQkJCQkJaWYgKChwTmV4dFR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSAmJiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgIT0gcE5leHRUeFJhdGUtPkN1cnJNQ1MpKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2gocEN1cnJUeFJhdGUtPkN1cnJNQ1MpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSAwOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMToKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTMUZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzJGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAzOgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1MzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNDoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTNEZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDU6Ci0JCQkJCQkJCUh0Q2ZnMC5maWVsZC5IVE1DUzVGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA2OgotCQkJCQkJCQlIdENmZzAuZmllbGQuSFRNQ1M2RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgNzoKLQkJCQkJCQkJSHRDZmcwLmZpZWxkLkhUTUNTN0ZCSyA9IHBOZXh0VHhSYXRlLT5DdXJyTUNTOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDg6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzhGQksgPSBwTmV4dFR4UmF0ZS0+Q3Vyck1DUzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSA5OgotCQkJCQkJCQlIdENmZzEuZmllbGQuSFRNQ1M5RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTA6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEwRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTE6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzExRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTI6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEyRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTM6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzEzRkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTQ6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE0RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgMTU6Ci0JCQkJCQkJCUh0Q2ZnMS5maWVsZC5IVE1DUzE1RkJLID0gcE5leHRUeFJhdGUtPkN1cnJNQ1M7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNVcGRhdGVBdXRvRmFsbEJhY2tUYWJsZTogbm90IHN1cHBvcnQgQ3Vyck1DUz0lZFxuIiwgcEN1cnJUeFJhdGUtPkN1cnJNQ1MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJfQotCi0JCXBOZXh0VHhSYXRlID0gcEN1cnJUeFJhdGU7Ci0JfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSFRfRkJLX0NGRzAsIEh0Q2ZnMC53b3JkKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIVF9GQktfQ0ZHMSwgSHRDZmcxLndvcmQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIExHX0ZCS19DRkcwLCBMZ0NmZzAud29yZCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgTEdfRkJLX0NGRzEsIExnQ2ZnMS53b3JkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVNldCBNQUMgcmVnaXN0ZXIgdmFsdWUgYWNjb3JkaW5nIG9wZXJhdGlvbiBtb2RlLgotCQlPcGVyYXRpb25Nb2RlIEFORCBiTm9uR0ZFeGlzdCBhcmUgZm9yIE1NIGFuZCBHRiBQcm90ZWNpdG9uLgotCQlJZiBNTSBvciBHRiBtYXNrIGlzIG5vdCBzZXQsIHRob3NlIHBhc3NpbmcgYXJndW1lbnQgZG9lc24ndCBub3QgdGFrZSBlZmZlY3QuCi0KLQkJT3BlcmF0aW9uIG1vZGUgbWVhbmluZzoKLQkJPSAwIDogUHVyZSBIVCwgbm8gcHJlb3RlY3Rpb24uCi0JCT0gMHgwMTsgdGhlcmUgbWF5IGJlIG5vbi1IVCBkZXZpY2VzIGluIGJvdGggdGhlIGNvbnRyb2wgYW5kIGV4dGVuc2lvbiBjaGFubmVsLCBwcm90ZWN0aW9uIGlzIG9wdGlvbmFsIGluIEJTUy4KLQkJPSAweDEwOiBObyBUcmFuc21pc3Npb24gaW4gNDBNIGlzIHByb3RlY3RlZC4KLQkJPSAweDExOiBUcmFuc21pc3Npb24gaW4gYm90aCA0ME0gYW5kIDIwTSBzaGFsbCBiZSBwcm90ZWN0ZWQKLQkJaWYgKGJOb25HRkV4aXN0KQotCQkJd2Ugc2hvdWxkIGNob29zZSBub3QgdG8gdXNlIEdGLiBCdXQgc3RpbGwgc2V0IGNvcnJlY3QgQVNJQyByZWdpc3RlcnMuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlBc2ljVXBkYXRlUHJvdGVjdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVTSE9SVAkJCU9wZXJhdGlvbk1vZGUsCi0JSU4JCVVDSEFSCQkJU2V0TWFzaywKLQlJTgkJQk9PTEVBTgkJCWJEaXNhYmxlQkdQcm90ZWN0LAotCUlOCQlCT09MRUFOCQkJYk5vbkdGRXhpc3QpCi17Ci0JUFJPVF9DRkdfU1RSVUMJUHJvdENmZywgUHJvdENmZzQ7Ci0JVUlOVDMyIFByb3RlY3RbNl07Ci0JVVNIT1JUCQkJb2Zmc2V0OwotCVVDSEFSCQkJaTsKLQlVSU5UMzIgTWFjUmVnID0gMDsKLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoIShwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0KSAmJiAoT3BlcmF0aW9uTW9kZSAhPSA4KSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocEFkLT5CQVRhYmxlLm51bURvbmVPcmlnaW5hdG9yKQotCXsKLQkJLy8KLQkJLy8gZW5hYmxlIHRoZSBSVFMvQ1RTIHRvIGF2b2lkIGNoYW5uZWwgY29sbGlzaW9uCi0JCS8vCi0JCVNldE1hc2sgPSBBTExOX1NFVFBST1RFQ1Q7Ci0JCU9wZXJhdGlvbk1vZGUgPSA4OwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIENvbmZpZyBBU0lDIFJUUyB0aHJlc2hvbGQgcmVnaXN0ZXIKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUU19DRkcsICZNYWNSZWcpOwotCU1hY1JlZyAmPSAweEZGMDAwMEZGOwotCS8vIElmIHRoZSB1c2VyIHdhbnQgZGlzYWJsZSBSdHNUaHJlc2hvbGQgYW5kIGVuYmFsZSBBbXNkdS9SYWxpbmstQWdncmVnYXRpb24sIHNldCB0aGUgUnRzVGhyZXNob2xkIGFzIDQwOTYKLSAgICAgICAgaWYgKCgKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCShwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpIHx8Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA9PSBUUlVFKSkKLSAgICAgICAgICAgICYmIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9PSBNQVhfUlRTX1RIUkVTSE9MRCkKLSAgICAgICAgewotCQkJTWFjUmVnIHw9ICgweDEwMDAgPDwgOCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0JCQlNYWNSZWcgfD0gKHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA8PCA4KTsKLSAgICAgICAgfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRTX0NGRywgTWFjUmVnKTsKLQotCS8vIEluaXRpYWwgY29tbW9uIHByb3RlY3Rpb24gc2V0dGluZ3MKLQlSVE1QWmVyb01lbW9yeShQcm90ZWN0LCBzaXplb2YoUHJvdGVjdCkpOwotCVByb3RDZmc0LndvcmQgPSAwOwotCVByb3RDZmcud29yZCA9IDA7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU00MCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTIwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd09mZG0gPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93Q2NrID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlJUU1RoRW4gPSAxOwotCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0KLQkvLyB1cGRhdGUgUEhZIG1vZGUgYW5kIHJhdGUKLQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gMHg0MDAwOwotCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgfD0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQotCS8vIEhhbmRsZSBsZWdhY3koQi9HKSBwcm90ZWN0aW9uCi0JaWYgKGJEaXNhYmxlQkdQcm90ZWN0KQotCXsKLQkJLy9Qcm90Q2ZnLmZpZWxkLlByb3RlY3RSYXRlID0gcEFkLT5Db21tb25DZmcuUnRzUmF0ZTsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IDA7Ci0JCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7Ci0JCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7Ci0JCXBBZC0+RmxnQ3RzRW5hYmxlZCA9IDA7IC8qIENUUy1zZWxmIGlzIG5vdCB1c2VkICovCi0JfQotCWVsc2UKLQl7Ci0JCS8vUHJvdENmZy5maWVsZC5Qcm90ZWN0UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGU7Ci0JCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOwkJCS8vIENDSyBkbyBub3QgbmVlZCB0byBiZSBwcm90ZWN0ZWQKLQkJUHJvdGVjdFswXSA9IFByb3RDZmcud29yZDsKLQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0Q3RybCA9IEFTSUNfQ1RTOwkvLyBPRkRNIG5lZWRzIHVzaW5nIENDSyB0byBwcm90ZWN0Ci0JCVByb3RlY3RbMV0gPSBQcm90Q2ZnLndvcmQ7Ci0JCXBBZC0+RmxnQ3RzRW5hYmxlZCA9IDE7IC8qIENUUy1zZWxmIGlzIHVzZWQgKi8KLQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkvLyBEZWNpZGUgSFQgZnJhbWUgcHJvdGVjdGlvbi4KLQlpZiAoKFNldE1hc2sgJiBBTExOX1NFVFBST1RFQ1QpICE9IDApCi0JewotCQlzd2l0Y2goT3BlcmF0aW9uTW9kZSkKLQkJewotCQkJY2FzZSAweDA6Ci0JCQkJLy8gTk8gUFJPVEVDVAotCQkJCS8vIDEuQWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUCi0JCQkJLy8gMi4gaW4gYWkgMjAvNDBNSHogQlNTCi0JCQkJLy8gMy4gYWxsIFNUQXMgYXJlIDIwTUh6IGluIGEgMjBNSHogQlNTCi0JCQkJLy8gUHVyZSBIVC4gbm8gcHJvdGVjdGlvbi4KLQotCQkJCS8vIE1NMjBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFsyXSA9IDB4MDE3NDQwMDQ7Ci0KLQkJCQkvLyBNTTQwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCi0JCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JCQkJLy8JUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzNdID0gMHgwM2Y0NDA4NDsKLQotCQkJCS8vIENGMjBfUFJPVF9DRkcKLQkJCQkvLwlSZXNlcnZlZCAoMzE6MjcpCi0JCQkJLy8JUFJPVF9UWE9QKDI1OjIwKSAtLSAwMTAxMTEKLQkJCQkvLwlQUk9UX05BVigxOToxOCkgIC0tIDAxIChTaG9ydCBOQVYgcHJvdGVjdGlvbikKLQkJCQkvLyAgUFJPVF9DVFJMKDE3OjE2KSAtLSAwMCAoTm9uZSkKLQkJCQkvLwlQUk9UX1JBVEUoMTU6MCkgIC0tIDB4NDAwNCAoT0ZETSAyNE0pCi0JCQkJUHJvdGVjdFs0XSA9IDB4MDE3NDQwMDQ7Ci0KLQkJCQkvLyBDRjQwX1BST1RfQ0ZHCi0JCQkJLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCQkJCS8vCVBST1RfVFhPUCgyNToyMCkgLS0gMTExMTExCi0JCQkJLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JCQkJLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JCQkJLy8JUFJPVF9SQVRFKDE1OjApICAtLSAweDQwODQgKGR1cGxpY2F0ZSBPRkRNIDI0TSkKLQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y0NDA4NDsKLQotCQkJCWlmIChiTm9uR0ZFeGlzdCkKLQkJCQl7Ci0JCQkJCS8vIFBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aWlvbikKLQkJCQkJLy8gUFJPVF9DVFJMKDE3OjE2KSAtLSAwMSAoUlRTL0NUUykKLQkJCQkJUHJvdGVjdFs0XSA9IDB4MDE3NTQwMDQ7Ci0JCQkJCVByb3RlY3RbNV0gPSAweDAzZjU0MDg0OwotCQkJCX0KLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMToKLQkJCQkvLyBUaGlzIGlzICJIVCBub24tbWVtYmVyIHByb3RlY3Rpb24gbW9kZS4iCi0JCQkJLy8gSWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzIG15IEJTUwotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vIFBST1RfQ1RSTCgxNzoxNikgOiAwIChOb25lKQotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OyAvLyBkdXBsaWNhZXQgbGVnYWN5IDI0TS4gQlcgc2V0IDEuCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpKQotCQkJCXsKLQkJCQkJUHJvdENmZy53b3JkID0gMHgwMTc0MDAwMzsJLy9FUlAgdXNlIFByb3RlY3Rpb24gYml0IGlzIHNldCwgdXNlIHByb3RlY3Rpb24gcmF0ZSBhdCBDbGF1c2UgMTguLgotCQkJCQlQcm90Q2ZnNC53b3JkID0gMHgwM2Y0MDAwMzsgLy8gRG9uJ3QgZHVwbGljYXRlIFJUUy9DVFMgaW4gQ0NLIG1vZGUuIDB4MDNmNDAwODM7Ci0JCQkJfQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDI6Ci0JCQkJLy8gSWYgb25seSBIVCBTVEFzIGFyZSBpbiBCU1MuIGF0IGxlYXN0IG9uZSBpcyAyME1Iei4gT25seSBwcm90ZWN0IDQwTUh6IHBhY2tldHMKLQkJCQlQcm90Q2ZnLndvcmQgPSAweDAxNzQ0MDA0OyAgLy8gUFJPVF9DVFJMKDE3OjE2KSA6IDAgKE5vbmUpCi0JCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDQwODQ7IC8vIGR1cGxpY2FldCBsZWdhY3kgMjRNLiBCVyBzZXQgMS4KLQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciA0ME1IeiBwYWNrZXRzCi0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnNC5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQlQcm90ZWN0WzJdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbM10gPSBQcm90Q2ZnNC53b3JkOwotCQkJCWlmIChiTm9uR0ZFeGlzdCkKLQkJCQl7Ci0JCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQkJUHJvdENmZy5maWVsZC5Qcm90ZWN0TmF2ID0gQVNJQ19TSE9SVE5BVjsKLQkJCQl9Ci0JCQkJUHJvdGVjdFs0XSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzVdID0gUHJvdENmZzQud29yZDsKLQotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBGQUxTRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOgotCQkJCS8vIEhUIG1peGVkIG1vZGUuCSBQUk9URUNUIEFMTCEKLQkJCQkvLyBBc3NpZ24gUmF0ZQotCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDQwMDQ7CS8vZHVwbGljYWV0IGxlZ2FjeSAyNE0uIEJXIHNldCAxLgotCQkJCVByb3RDZmc0LndvcmQgPSAweDAzZjQ0MDg0OwotCQkJCS8vIGJvdGggMjBNSHogYW5kIDQwTUh6IGFyZSBwcm90ZWN0ZWQuIFdoZXRoZXIgdXNlIFJUUyBvciBDVFMtdG8tc2VsZiBkZXBlbmRzIG9uIHRoZQotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKLQkJCQl7Ci0JCQkJCVByb3RDZmcud29yZCA9IDB4MDE3NDAwMDM7CS8vRVJQIHVzZSBQcm90ZWN0aW9uIGJpdCBpcyBzZXQsIHVzZSBwcm90ZWN0aW9uIHJhdGUgYXQgQ2xhdXNlIDE4Li4KLQkJCQkJUHJvdENmZzQud29yZCA9IDB4MDNmNDAwMDM7IC8vIERvbid0IGR1cGxpY2F0ZSBSVFMvQ1RTIGluIENDSyBtb2RlLiAweDAzZjQwMDgzCi0JCQkJfQotCQkJCS8vQXNzaWduIFByb3RlY3Rpb24gbWV0aG9kIGZvciAyMCY0MCBNSHogcGFja2V0cwotCQkJCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSBBU0lDX1JUUzsKLQkJCQlQcm90Q2ZnLmZpZWxkLlByb3RlY3ROYXYgPSBBU0lDX1NIT1JUTkFWOwotCQkJCVByb3RDZmc0LmZpZWxkLlByb3RlY3RDdHJsID0gQVNJQ19SVFM7Ci0JCQkJUHJvdENmZzQuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0JCQkJUHJvdGVjdFsyXSA9IFByb3RDZmcud29yZDsKLQkJCQlQcm90ZWN0WzNdID0gUHJvdENmZzQud29yZDsKLQkJCQlQcm90ZWN0WzRdID0gUHJvdENmZy53b3JkOwotCQkJCVByb3RlY3RbNV0gPSBQcm90Q2ZnNC53b3JkOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYlJUU0xvbmdQcm90T24gPSBUUlVFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIDg6Ci0JCQkJLy8gU3BlY2lhbCBvbiBmb3IgQXRoZXJvcyBwcm9ibGVtIG4gY2hpcC4KLQkJCQlQcm90ZWN0WzJdID0gMHgwMTc1NDAwNDsKLQkJCQlQcm90ZWN0WzNdID0gMHgwM2Y1NDA4NDsKLQkJCQlQcm90ZWN0WzRdID0gMHgwMTc1NDAwNDsKLQkJCQlQcm90ZWN0WzVdID0gMHgwM2Y1NDA4NDsKLQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gVFJVRTsKLQkJCQlicmVhazsKLQkJfQotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCW9mZnNldCA9IENDS19QUk9UX0NGRzsKLQlmb3IgKGkgPSAwO2kgPCA2O2krKykKLQl7Ci0JCQlpZiAoKFNldE1hc2sgJiAoMTw8IGkpKSkKLQkJewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQgKyBpKjQsIFByb3RlY3RbaV0pOwotCX0KLX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU3dpdGNoQ2hhbm5lbCgKLQkJCQkJICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVQ0hBUgkJCUNoYW5uZWwsCi0JSU4JQk9PTEVBTgkJCWJTY2FuKQotewotCVVMT05HCQkJUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMDsKLQlDSEFSICAgIFR4UHdlciA9IDAsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOyAvL0JicDk0ID0gQkJQUjk0X0RFRkFVTFQsIFR4UHdlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCVVDSEFSCWluZGV4OwotCVVJTlQzMglWYWx1ZSA9IDA7IC8vQmJwUmVnLCBWYWx1ZTsKLQlSVE1QX1JGX1JFR1MgKlJGUmVnVGFibGU7Ci0JVUNIQVIJUkZWYWx1ZTsKLQotCVJGVmFsdWUgPSAwOwotCS8vIFNlYXJjaCBUeCBwb3dlciB2YWx1ZQotCS8vIFdlIGNhbid0IHVzZSBDaGFubmVsTGlzdCB0byBzZWFyY2ggY2hhbm5lbCwgc2luY2Ugc29tZSBjZW50cmFsIGNoYW5ubCdzIHR4cG93ciBkb2Vzbid0IGxpc3QKLQkvLyBpbiBDaGFubmVsTGlzdCwgc28gdXNlIFR4UG93ZXIgYXJyYXkgaW5zdGVhZC4KLQkvLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OVU1fT0ZfQ0hBTk5FTFM7IGluZGV4KyspCi0JewotCQlpZiAoQ2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbaW5kZXhdLkNoYW5uZWwpCi0JCXsKLQkJCVR4UHdlciA9IHBBZC0+VHhQb3dlcltpbmRleF0uUG93ZXI7Ci0JCQlUeFB3ZXIyID0gcEFkLT5UeFBvd2VyW2luZGV4XS5Qb3dlcjI7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpbmRleCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IENhbid0IGZpbmQgdGhlIENoYW5uZWwjJWQgXG4iLCBDaGFubmVsKSk7Ci0JfQotCi0jaWZkZWYgUlQzMHh4Ci0JLy8gVGhlIFJGIHByb2dyYW1taW5nIHNlcXVlbmNlIGlzIGRpZmZlcmVuY2UgYmV0d2VlbiAzeHh4IGFuZCAyeHh4Ci0JaWYgKChJU19SVDMwNzAocEFkKSB8fCBJU19SVDMwOTAocEFkKXx8SVNfUlQzMzkwKHBBZCkpICYmICgocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjApIHx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkgfHwKLQkJKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIxKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjIpKSkKLQl7Ci0JCS8qIG1vZGlmeSBieSBXWSBmb3IgUmVhZCBSRiBSZWcuIGVycm9yICovCi0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX09GXzMwMjBfQ0hOTDsgaW5kZXgrKykKLQkJewotCQkJaWYgKENoYW5uZWwgPT0gRnJlcUl0ZW1zMzAyMFtpbmRleF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQkvLyBQcm9ncmFtbWluZyBjaGFubmVsIHBhcmFtZXRlcnMKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMDIsIEZyZXFJdGVtczMwMjBbaW5kZXhdLk4pOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMywgRnJlcUl0ZW1zMzAyMFtpbmRleF0uSyk7Ci0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDYsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEZDKSB8IEZyZXFJdGVtczMwMjBbaW5kZXhdLlI7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA2LCBSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBUeDAgUG93ZXIKLQkJCQlSVDMweHhSZWFkUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgJlJGVmFsdWUpOwotCQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQd2VyOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxMiwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgVHgxIFBvd2VyCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTMsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweEUwKSB8IFR4UHdlcjI7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjEzLCBSRlZhbHVlKTsKLQotCQkJCS8vIFR4L1J4IFN0cmVhbSBzZXR0aW5nCi0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMDEsICZSRlZhbHVlKTsKLQkJCQkvL2lmIChJU19SVDMwOTAocEFkKSkKLQkJCQkvLwlSRlZhbHVlIHw9IDB4MDE7IC8vIEVuYWJsZSBSRiBibG9jay4KLQkJCQlSRlZhbHVlICY9IDB4MDM7CS8vY2xlYXIgYml0Wzd+Ml0KLQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQkJCQlSRlZhbHVlIHw9IDB4QTA7Ci0JCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCQkJCQlSRlZhbHVlIHw9IDB4ODA7Ci0JCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCQkJUkZWYWx1ZSB8PSAweDUwOwotCQkJCWVsc2UgaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCQkJUkZWYWx1ZSB8PSAweDQwOwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IwMSwgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgUkYgb2Zmc2V0Ci0JCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMjMsICZSRlZhbHVlKTsKLQkJCQlSRlZhbHVlID0gKFJGVmFsdWUgJiAweDgwKSB8IHBBZC0+UmZGcmVxT2Zmc2V0OwotCQkJCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IyMywgUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgQlcKLQkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQotCQkJCXsKLQkJCQkJUkZWYWx1ZSA9IHBBZC0+TWxtZS5DYWxpQlc0MFJmUjI0OwotCQkJCQkvL0RJU0FCTEVfMTFOX0NIRUNLKHBBZCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXMjBSZlIyNDsKLQkJCQl9Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjI0LCBSRlZhbHVlKTsKLQkJCQlSVDMweHhXcml0ZVJGUmVnaXN0ZXIocEFkLCBSRl9SMzEsIFJGVmFsdWUpOwotCi0JCQkJLy8gRW5hYmxlIFJGIHR1bmluZwotCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCAmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IFJGVmFsdWUgfCAweDE7Ci0JCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZCwgUkZfUjA3LCBSRlZhbHVlKTsKLQotCQkJCS8vIGxhdGNoIGNoYW5uZWwgZm9yIGZ1dHVyZSB1c2FnZS4KLQkJCQlwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPSBDaGFubmVsOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWQsIFB3cjE9JWQsICVkVCksIE49MHglMDJYLCBLPTB4JTAyWCwgUj0weCUwMlhcbiIsCi0JCQlDaGFubmVsLAotCQkJcEFkLT5SZkljVHlwZSwKLQkJCVR4UHdlciwKLQkJCVR4UHdlcjIsCi0JCQlwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uTiwKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLkssCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5SKSk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JewotCQlSRlJlZ1RhYmxlID0gUkYyODUwUmVnVGFibGU7Ci0JCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQkJewotCQkJY2FzZSBSRklDXzI4MjA6Ci0JCQljYXNlIFJGSUNfMjg1MDoKLQkJCWNhc2UgUkZJQ18yNzIwOgotCQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJCXsKLQkJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQkJewotCQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCQkJCQl7Ci0JCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQkJCQkJCXsKLQkJCQkJCQlSMiB8PSAweDQwOwkvLyB3cml0ZSAxIHRvIG9mZiBSeHBhdGguCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCQkJCQl7Ci0JCQkJCQkJUjIgfD0gMHgyMDA0MDsJLy8gd3JpdGUgMSB0byBvZmYgUnhQYXRoCi0JCQkJCQl9Ci0KLQkJCQkJCWlmIChDaGFubmVsID4gMTQpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gaW5pdGlhbGl6ZSBSMywgUjQKLQkJCQkJCQlSMyA9IChSRlJlZ1RhYmxlW2luZGV4XS5SMyAmIDB4ZmZmZmMxZmYpOwotCQkJCQkJCVI0ID0gKFJGUmVnVGFibGVbaW5kZXhdLlI0ICYgKH4weDAwMWY4N2MwKSkgfCAocEFkLT5SZkZyZXFPZmZzZXQgPDwgMTUpOwotCi0JCQkJCQkJLy8gNUcgYmFuZCBwb3dlciByYW5nZTogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiIG1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCCi0JCQkJCQkJLy8gUjMKLQkJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKLQkJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOwotCQkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKLQkJCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gUjQKLQkJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7Ci0JCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKLQkJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7Ci0JCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7Ci0JCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVIzID0gKFJGUmVnVGFibGVbaW5kZXhdLlIzICYgMHhmZmZmYzFmZikgfCAoVHhQd2VyIDw8IDkpOyAvLyBzZXQgVFggcG93ZXIwCi0JCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+UmZGcmVxT2Zmc2V0IDw8IDE1KSB8IChUeFB3ZXIyIDw8Nik7Ly8gU2V0IGZyZXEgT2Zmc2V0ICYgVHhQd3IxCi0JCQkJCQl9Ci0KLQkJCQkJCS8vIEJhc2VkIG9uIEJCUCBjdXJyZW50IG1vZGUgYmVmb3JlIGNoYW5naW5nIFJGIGNoYW5uZWwuCi0JCQkJCQlpZiAoIWJTY2FuICYmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfNDApKQotCQkJCQkJewotCQkJCQkJCVI0IHw9MHgyMDAwMDA7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIFVwZGF0ZSB2YXJpYWJsZXMKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gUkZSZWdUYWJsZVtpbmRleF0uUjE7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIyID0gUjI7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIzID0gUjM7Ci0JCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjQ7Ci0KLSNpZmRlZiBERlNfREVCVUcKLSNpZmRlZiBERlNfRkNDX0JXNDBfRklYCi0JCQkJCQlpZiAocEFkLT5pbmZUeXBlID09IFJUTVBfREVWX0lORl9QQ0kpIC8vIFJUMjg4MCBQQ0kKLQkJCQkJCXsKLQkJCQkJCQkvKiBvbmx5IGZvciBSVDI4ODAgKi8KLQkJCQkJCQkvLyBGQ0MgREZTIHRlc3QKLQkJCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlIxIHw9IDB4MTAwOwotCQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgfD0gMHgwMDQwMDAwMDsKLQkJCQkJCX0KLSNlbmRpZiAvLyBERlNfRkNDX0JXNDBfRklYIC8vCi0jZW5kaWYgLy8gREZTX0RFQlVHIC8vCi0KLQkJCQkJCS8vIFNldCBSRiB2YWx1ZSAxJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCi0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCQkJCQkJUlRNUHVzZWNEZWxheSgyMDApOwotCi0JCQkJCQkvLyBTZXQgUkYgdmFsdWUgMidzIHNldCBSM1tiaXQyXSA9IFsxXQotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzIHwgMHgwNCkpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQkJCQkJCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCQkJCQkJLy8gU2V0IFJGIHZhbHVlIDMncyBzZXQgUjNbYml0Ml0gPSBbMF0KLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQkJCQkJUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyAmICh+MHgwNCkpKTsKLQkJCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWx1LCBQd3IxPSVsdSwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCi0JCQkJCQkJICBDaGFubmVsLAotCQkJCQkJCSAgcEFkLT5SZkljVHlwZSwKLQkJCQkJCQkgIChSMyAmIDB4MDAwMDNlMDApID4+IDksCi0JCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAotCQkJCQkJCSAgcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCwKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjEsCi0JCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAotCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMywKLQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpKTsKLQl9Ci0KLQkvLyBDaGFuZ2UgQkJQIHNldHRpbmcgZHVyaW5nIHNpd3RjaCBmcm9tIGEtPmcsIGctPmEKLQlpZiAoQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JCVVMT05HCVR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvL0dhcnkgMjAwNy8wOC8wOSAweDA1MEEwQQotCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsJLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgotCQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKLQotCQkvLyBSeCBIaWdoIHBvd2VyIFZHQSBvZmZzZXQgZm9yIExOQSBzZWxlY3QKLQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5FeHRlcm5hbExOQUZvckcpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDYyKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDQ2KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjc1LCAweDUwKTsKLQkJfQotCi0JCS8vIDVHIGJhbmQgc2VsZWN0aW9uIFBJTiwgYml0MSBhbmQgYml0MiBhcmUgY29tcGxlbWVudAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBTkRfQ0ZHLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4Nik7Ci0JCVZhbHVlIHw9ICgweDA0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFORF9DRkcsIFZhbHVlKTsKLQotCQkvLyBUdXJuIG9mZiB1bnVzZWQgUEEgb3IgTE5BIHdoZW4gb25seSAxVCBvciAxUgotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGRkYzOwotCQl9Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkYzRkY7Ci0JCX0KLQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQotI2lmIGRlZmluZWQoUlQzMDkwKSB8fCBkZWZpbmVkKFJUMzM5MCkKLQkJLy8gUENJZSBQSFkgVHJhbnNtaXQgYXR0ZW51YXRpb24gYWRqdXN0bWVudAotCQlpZiAoSVNfUlQzMDkwQShwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlUWF9BVFRFTlVBVElPTl9DVFJMX1NUUlVDIFR4QXR0ZW51YXRpb25DdHJsID0gezB9OwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBDSUVfUEhZX1RYX0FUVEVOVUFUSU9OX0NUUkwsICZUeEF0dGVudWF0aW9uQ3RybC53b3JkKTsKLQotCQkJaWYgKENoYW5uZWwgPT0gMTQpIC8vIENoYW5uZWwgIzE0Ci0JCQl7Ci0JCQkJVHhBdHRlbnVhdGlvbkN0cmwuZmllbGQuUENJRV9QSFlfVFhfQVRURU5fRU4gPSAxOyAvLyBFbmFibGUgUENJZSBQSFkgVHggYXR0ZW51YXRpb24KLQkJCQlUeEF0dGVudWF0aW9uQ3RybC5maWVsZC5QQ0lFX1BIWV9UWF9BVFRFTl9WQUxVRSA9IDQ7IC8vIDkvMTYgZnVsbCBkcml2ZSBsZXZlbAotCQkJfQotCQkJZWxzZSAvLyBDaGFubmVsICMxfiMxMwotCQkJewotCQkJCVR4QXR0ZW51YXRpb25DdHJsLmZpZWxkLlBDSUVfUEhZX1RYX0FUVEVOX0VOID0gMDsgLy8gRGlzYWJsZSBQQ0llIFBIWSBUeCBhdHRlbnVhdGlvbgotCQkJCVR4QXR0ZW51YXRpb25DdHJsLmZpZWxkLlBDSUVfUEhZX1RYX0FUVEVOX1ZBTFVFID0gMDsgLy8gbi9hCi0JCQl9Ci0KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBDSUVfUEhZX1RYX0FUVEVOVUFUSU9OX0NUUkwsIFR4QXR0ZW51YXRpb25DdHJsLndvcmQpOwotCQl9Ci0jZW5kaWYKLQl9Ci0JZWxzZQotCXsKLQkJVUxPTkcJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vR2FyeSAyMDA3LzgvOSAweDA1MDUwNQotCi0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYyLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAwKTsvLygweDQ0IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsgICAvLyBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7Ci0KLQkJLy8gUnggSGlnaCBwb3dlciBWR0Egb2Zmc2V0IGZvciBMTkEgc2VsZWN0Ci0JCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JBKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg0Nik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3NSwgMHg1MCk7Ci0JCX0KLQotCQkvLyA1RyBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDYpOwotCQlWYWx1ZSB8PSAoMHgwMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0KLQkJLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRkZGMzsKLQkJfQotCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQl7Ci0JCQlUeFBpbkNmZyAmPSAweEZGRkZGM0ZGOwotCQl9Ci0KLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QSU5fQ0ZHLCBUeFBpbkNmZyk7Ci0KLQl9Ci0KLQkvLyBSNjYgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gQ2hhbm5lbCBhbmQgdXNlIDIwTUh6IHdoZW4gc2Nhbm5pbmcKLQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JaWYgKGJTY2FuKQotCQlSVE1QU2V0QUdDSW5pdFZhbHVlKHBBZCwgQldfMjApOwotCWVsc2UKLQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7Ci0KLQkvLwotCS8vIE9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKLQkvLyBhbmQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgc2hvdWxkIGJlIDEwMDAgbWljcm8gc2Vjb25kcwotCS8vIDIwMDUvMDYvMDUgLSBPbiAxMUcsIFdlIGFsc28gbmVlZCB0aGlzIGRlbGF5IHRpbWUuIE90aGVyd2lzZSBpdCdzIGRpZmZpY3VsdCB0byBwYXNzIHRoZSBXSFFMLgotCS8vCi0JUlRNUHVzZWNEZWxheSgxMDAwKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciAyNDIxIG9ubHksIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nCi0JCXNpdGUgc3VydmV5LiBJdCdzIG9ubHkgcmVxdWlyZWQgYWZ0ZXIgTklDIGRlY2lkZWQgdG8gc3RheSBhdCBhIGNoYW5uZWwKLQkJZm9yIGEgbG9uZ2VyIHBlcmlvZC4KLQkJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQncyBhbHdheXMgYWZ0ZXIgQXNpY1N3aXRjaENoYW5uZWwoKS4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNMb2NrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsKQotewotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotVk9JRAlBc2ljQW50ZW5uYVNlbGVjdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUNoYW5uZWwpCi17Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAyID09IDEpCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQkvLyBwYXRjaCBmb3IgQXNpY1NldFJ4QW50IGZhaWxlZAotCQlwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID0gMDsKLQotCQkvLyBjaGVjayBldmVyeSAyIHNlY29uZC4gSWYgcmN2LWJlYWNvbiBsZXNzIHRoYW4gNSBpbiB0aGUgcGFzdCAyIHNlY29uZCwgdGhlbiBBdmdSU1NJIGlzIG5vIGxvbmdlciBhCi0JCS8vIHZhbGlkIGluZGljYXRpb24gb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBBUCBhbmQgaXRzIGNsaWVudHMuCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCXsKLQkJCVNIT1JUCXJlYWxhdmdyc3NpMTsKLQotCQkJLy8gaWYgbm8gdHJhZmZpYyB0aGVuIHJlc2V0IGF2ZXJhZ2UgcnNzaSB0byB0cmlnZ2VyIGV2YWx1YXRpb24KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCWlmIChwQWQtPlN0YUNmZy5OdW1PZkF2Z1Jzc2lTYW1wbGUgPCA1KQotCQkJewotCQkJCXBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSA9ICgtOTkpOwotCQkJCXBBZC0+UnhBbnQuUGFpcjJMYXN0QXZnUnNzaSA9ICgtOTkpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1sbWVQZXJpb2RpY0V4ZWM6IG5vIHRyYWZmaWMvYmVhY29uLCByZXNldCBSU1NJXG4iKSk7Ci0JCQl9Ci0KLQkJCXBBZC0+U3RhQ2ZnLk51bU9mQXZnUnNzaVNhbXBsZSA9IDA7Ci0JCQlyZWFsYXZncnNzaTEgPSAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudF0gPj4gMyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQW50LXJlYWxyc3NpMCglZCksIExhc3Ryc3NpMCglZCksIEV2YWx1YXRlU3RhYmxlQ250PSVkXG4iLCByZWFsYXZncnNzaTEsIHBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSwgcEFkLT5SeEFudC5FdmFsdWF0ZVN0YWJsZUNudCkpOwotCi0JCQkvLyBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byByc3NpIGlzIGxhcmdlciBvciBsZXNzIHRoYW4gNSwgdGhlbiBldmFsdWF0ZSB0aGUgb3RoZXIgYW50ZW5uYQotCQkJaWYgKChwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250IDwgMikgfHwgKHJlYWxhdmdyc3NpMSA+IChwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2kgKyA1KSkgfHwgKHJlYWxhdmdyc3NpMSA8IChwQWQtPlJ4QW50LlBhaXIxTGFzdEF2Z1Jzc2kgLSA1KSkpCi0JCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKLQotCQkJCXBBZC0+UnhBbnQuUGFpcjFMYXN0QXZnUnNzaSA9IHJlYWxhdmdyc3NpMTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGlmIG5vdCBjb25uZWN0ZWQsIGFsd2F5cyBzd2l0Y2ggYW50ZW5uYSB0byB0cnkgdG8gY29ubmVjdAotCQkJVUNIQVIJdGVtcDsKLQotCQkJdGVtcCA9IHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQ7Ci0JCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50ID0gcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50OwotCQkJcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50ID0gdGVtcDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVBlcmlvZGljRXhlYzogbm8gY29ubmVjdCwgc3dpdGNoIHRvIGFub3RoZXIgb25lIHRvIHRyeSBjb25uZWN0aW9uXG4iKSk7Ci0KLQkJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotCQl9Ci0JfQotfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQW50ZW5uYSBtaXNjZWxsYW5lb3VzIHNldHRpbmcuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJQmFuZFN0YXRlCQkJCUluZGljYXRlIGN1cnJlbnQgQmFuZCBTdGF0ZS4KLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA8PSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJMS4pIEZyYW1lIEVuZCB0eXBlIGNvbnRyb2wKLQkJCW9ubHkgdmFsaWQgZm9yIEcgb25seSAoUkZfMjUyNyAmIFJGXzI1MjkpCi0JCQkwOiBtZWFucyBEUERULCBzZXQgQkJQIFI0IGJpdCA1IHRvIDEKLQkJCTE6IG1lYW5zIFNQRFQsIHNldCBCQlAgUjQgYml0IDUgdG8gMAotCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFzaWNBbnRlbm5hU2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglBQkdCQU5EX1NUQVRFCUJhbmRTdGF0ZSkKLXsKLX0KLQotVk9JRCBBc2ljUmZUdW5pbmdFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCi0JCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIExJTksgVVAgaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZS4KLQotCQljYWxjdWxhdGUgZGVzaXJlZCBUeCBwb3dlciBpbiBSRiBSMy5UeDB+NSwJc2hvdWxkIGNvbnNpZGVyIC0KLQkJMC4gaWYgY3VycmVudCByYWRpbyBpcyBhIG5vaXN5IGVudmlyb25tZW50IChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KQotCQkxLiBUeFBvd2VyUGVyY2VudGFnZQotCQkyLiBhdXRvIGNhbGlicmF0aW9uIGJhc2VkIG9uIFRTU0kgZmVlZGJhY2sKLQkJMy4gZXh0cmEgMiBkYiBmb3IgQ0NLCi0JCTQuIC0xMCBkYiB1cG9uIHZlcnktc2hvcnQgZGlzdGFuY2UgKEF2Z1JTU0kgPj0gLTQwZGIpIHRvIEFQCi0KLQlOT1RFOiBTaW5jZSB0aGlzIHJvdXRpbmUgcmVxdWlyZXMgdGhlIHZhbHVlIG9mIChwQWQtPkRyc0NvdW50ZXJzLmZOb2lzeUVudmlyb25tZW50KSwKLQkJaXQgc2hvdWxkIGJlIGNhbGxlZCBBRlRFUiBNbG1lRHluYW1pY1R4UmF0U3dpdGNoaW5nKCkKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVAkJCWksIGo7Ci0JQ0hBUgkJRGVsdGFQd3IgPSAwOwotCUJPT0xFQU4JCWJBdXRvVHhBZ2MgPSBGQUxTRTsKLQlVQ0hBUgkJVHNzaVJlZiwgKnBUc3NpTWludXNCb3VuZGFyeSwgKnBUc3NpUGx1c0JvdW5kYXJ5LCBUeEFnY1N0ZXA7Ci0JVUNIQVIJCUJicFIxID0gMCwgQmJwUjQ5ID0gMCwgaWR4OwotCVBDSEFSCQlwVHhBZ2NDb21wZW5zYXRlOwotCVVMT05HCQlUeFB3cls1XTsKLQlDSEFSCQlWYWx1ZTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlDSEFSCQlSc3NpID0gLTEyNzsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0JdW5zaWduZWQgbG9uZyBmbGFnczsgLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1ZwotI2VuZGlmIC8vIENBUlJJRVJfU0VOU0VfTkVXX0FMR08gLy8KLQotCi0jaWZkZWYgQ0FSUklFUl9TRU5TRV9ORVdfQUxHTwotCS8vS0ggQWRkIHRvIEZpeCBQQ0llIFBvd2VyLVNhdmluZyBidWc8LS0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLy9LSCBBZGQgdG8gRml4IFBDSWUgUG93ZXItU2F2aW5nIGJ1Zy0tPgotI2VuZGlmIC8vIENBUlJJRVJfU0VOU0VfTkVXX0FMR08gLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpIHx8Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCShwQWQtPmJQQ0ljbGtPZmYgPT0gVFJVRSkgfHwKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSB8fAotCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotewotCi0jaWZkZWYgQ0FSUklFUl9TRU5TRV9ORVdfQUxHTwotCS8vS0ggQWRkIHRvIEZpeCBQQ0llIFBvd2VyLVNhdmluZyBidWc8LS0KLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvL0tIIGFkZCB0byBmaXggUENJZS1Qb3dlciBTYXZpbmcgLS0+Ci0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCQlyZXR1cm47Ci19Ci0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCi0JLy8gVFggcG93ZXIgY29tcGVuc2F0aW9uIGZvciB0ZW1wZXJhdHVyZSB2YXJpYXRpb24gYmFzZWQgb24gVFNTSS4gdHJ5IGV2ZXJ5IDQgc2Vjb25kCi0JaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCS8qIGJnIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogYSBjaGFubmVsICovCi0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOwotCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKLQkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKLQkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOwotCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKLQkJfQotCi0JCWlmIChiQXV0b1R4QWdjKQotCQl7Ci0JCQkvKiBCYnBSMSBpcyB1bnNpZ25lZCBjaGFyICovCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQ5LCAmQmJwUjQ5KTsKLQotCQkJLyogKHApIFRzc2lQbHVzQm91bmRhcnlHWzBdID0gMCA9IChtKSBUc3NpTWludXNCb3VuZGFyeUdbMF0gKi8KLQkJCS8qIGNvbXBlbnNhdGU6ICs0ICAgICArMyAgICsyICAgKzEgICAgMCAgIC0xICAgLTIgICAtMyAgIC00ICogc3RlcHMgKi8KLQkJCS8qIHN0ZXAgdmFsdWUgaXMgZGVmaW5lZCBpbiBwQWQtPlR4QWdjU3RlcEcgZm9yIHR4IHBvd2VyIHZhbHVlICovCi0KLQkJCS8qIFs0XSsxK1s0XSAgIHA0ICAgICBwMyAgIHAyICAgcDEgICBvMSAgIG0xICAgbTIgICBtMyAgIG00ICovCi0JCQkvKiBleDogICAgICAgICAweDAwIDB4MTUgMHgyNSAweDQ1IDB4ODggMHhBMCAweEI1IDB4RDAgMHhGMAotCQkJICAgYWJvdmUgdmFsdWUgYXJlIGV4YW1pbmVkIGluIG1hc3MgZmFjdG9yeSBwcm9kdWN0aW9uICovCi0JCQkvKiAgICAgICAgICAgICBbNF0gICAgWzNdICBbMl0gIFsxXSAgWzBdICBbMV0gIFsyXSAgWzNdICBbNF0gKi8KLQotCQkJLyogcGx1cyAoKykgaXMgMHgwMCB+IDB4NDUsIG1pbnVzICgtKSBpcyAweGEwIH4gMHhmMCAqLwotCQkJLyogaWYgdmFsdWUgaXMgYmV0d2VlbiBwMSB+IG8xIG9yIG8xIH4gczEsIG5vIG5lZWQgdG8gYWRqdXN0IHR4IHBvd2VyICovCi0JCQkvKiBpZiB2YWx1ZSBpcyAweGE1LCB0eCBwb3dlciB3aWxsIGJlIC09IFR4QWdjU3RlcCooMi0xKSAqLwotCi0JCQlpZiAoQmJwUjQ5ID4gcFRzc2lNaW51c0JvdW5kYXJ5WzFdKQotCQkJewotCQkJCS8vIFJlYWRpbmcgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQotCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIKLQkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkgIC8vIEZvdW5kIHRoZSByYW5nZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCi0vLwkJCQlpZiAoUjMgPiAoVUxPTkcpIChUeEFnY1N0ZXAgKiAoaWR4LTEpKSkKLQkJCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSAtKFR4QWdjU3RlcCAqIChpZHgtMSkpOwotLy8JCQkJZWxzZQotLy8JCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLSgoVUNIQVIpUjMpOwotCi0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLSBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSAtJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZSBpZiAoQmJwUjQ5IDwgcFRzc2lQbHVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlZmVyZW5jZSB2YWx1ZQotCQkJCS8vIGNoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBpbmNyZWFzZSB0aGUgVHggcG93ZXIKLQkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQotCQkJCXsKLQkJCQkJaWYgKEJicFI0OSA+PSBwVHNzaVBsdXNCb3VuZGFyeVtpZHhdKSAgIC8vIEZvdW5kIHRoZSByYW5nZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgaW5jcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlCi0JCQkJKnBUeEFnY0NvbXBlbnNhdGUgPSBUeEFnY1N0ZXAgKiAoaWR4LTEpOwotCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiKysgVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gKyVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IDA7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiICAgVHggUG93ZXIsIEJCUCBSNDk9JXgsIFRzc2lSZWY9JXgsIFR4QWdjU3RlcD0leCwgc3RlcCA9ICslZFxuIiwKLQkJCQkJQmJwUjQ5LCBUc3NpUmVmLCBUeEFnY1N0ZXAsIDApKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjRzsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKLQkJfQotCi0JCWlmIChiQXV0b1R4QWdjKQotCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQl9Ci0KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBSMSk7Ci0JQmJwUjEgJj0gMHhGQzsKLQotI2lmZGVmIFNJTkdMRV9TS1UKLQkvLyBIYW5kbGUgcmVndWxhdG9yeSBtYXggdHggcG93ZXIgY29uc3RyYWluCi0JZG8KLQl7Ci0JCVVDSEFSICAgIFR4UHdySW5FRVBST00gPSAweEZGLCBDb3VudHJ5VHhQd3IgPSAweEZGLCBjcml0ZXJpb247Ci0JCVVDSEFSICAgIEFkanVzdE1heFR4UHdyWzQwXTsKLQotCQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAvLyA1RyBiYW5kCi0JCQlUeFB3ckluRUVQUk9NID0gKChwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3ciAmIDB4RkYwMCkgPj4gOCk7Ci0JCWVsc2UgLy8gMi40RyBiYW5kCi0JCQlUeFB3ckluRUVQUk9NID0gKHBBZC0+Q29tbW9uQ2ZnLkRlZmluZU1heFR4UHdyICYgMHgwMEZGKTsKLQkJQ291bnRyeVR4UHdyID0gR2V0Q3VudHJ5TWF4VHhQd3IocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQotCQkvLyBlcnJvciBoYW5kbGluZywgcmFuZ2UgY2hlY2sKLQkJaWYgKChUeFB3ckluRUVQUk9NID4gMHg1MCkgfHwgKENvdW50cnlUeFB3ciA+IDB4NTApKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkFzaWNBZGp1c3RUeFBvd2VyIC0gSW52YWxpZCBtYXggdHggcG93ZXIgKD0weCUwMngpLCBDb3VudHJ5VHhQd3I9JWRcbiIsIFR4UHdySW5FRVBST00sIENvdW50cnlUeFB3cikpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljcml0ZXJpb24gPSAqKChQVUNIQVIpVHhQd3IgKyAyKSAmIDB4RjsgICAgICAgIC8vIEZBRSB1c2UgT0ZETSA2TSBhcyBjcml0ZXJpb24KLQotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoY3JpdGVyaW9uPSVkLCBUeFB3ckluRUVQUk9NPSVkLCBDb3VudHJ5VHhQd3I9JWQpXG4iLCBjcml0ZXJpb24sIFR4UHdySW5FRVBST00sIENvdW50cnlUeFB3cikpOwotCi0JCS8vIEFkanVzdCBtYXggdHggcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSByZWxhdGlvbnNoaXAgb2YgdHggcG93ZXIgaW4gRTJQUk9NCi0JCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJewotCQkJLy8gQ0NLIHdpbGwgaGF2ZSA0ZEJtIGxhcmdlciB0aGFuIE9GRE0KLQkJCS8vIFRoZXJlZm9yZSwgd2Ugc2hvdWxkIHNlcGFyYXRlIHRvIHBhcnNlIHRoZSB0eCBwb3dlciBmaWVsZAotCQkJaWYgKGkgPT0gMCkKLQkJCXsKLQkJCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQkJewotCQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOwotCi0JCQkJCWlmIChqIDwgNCkKLQkJCQkJewotCQkJCQkJLy8gQ0NLIHdpbGwgaGF2ZSA0ZEJtIGxhcmdlciB0aGFuIE9GRE0KLQkJCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pICsgNDsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUFkanVzdE1heFR4UHdyW2kqOCtqXSA9IFR4UHdySW5FRVBST00gKyAoVmFsdWUgLSBjcml0ZXJpb24pOwotCQkJCQl9Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkFzaWNBZGp1c3RUeFBvd2VyIChpL2o9JWQvJWQsIFZhbHVlPSVkLCAlZClcbiIsIGksIGosIFZhbHVlLCBBZGp1c3RNYXhUeFB3cltpKjgral0pKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZm9yIChqPTA7IGo8ODsgaisrKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsKLQotCQkJCQlBZGp1c3RNYXhUeFB3cltpKjgral0gPSBUeFB3ckluRUVQUk9NICsgKFZhbHVlIC0gY3JpdGVyaW9uKTsKLQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkKVxuIiwgaSwgaiwgVmFsdWUsIEFkanVzdE1heFR4UHdyW2kqOCtqXSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEFkanVzdCB0eCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHJlbGF0aW9uc2hpcAotCQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JCXsKLQkJCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQotCQkJewotCQkJCWZvciAoaj0wOyBqPDg7IGorKykKLQkJCQl7Ci0JCQkJCVZhbHVlID0gKENIQVIpKChUeFB3cltpXSA+PiBqKjQpICYgMHgwRik7Ci0KLQkJCQkJLy8gVGhlIHN5c3RlbSB0eCBwb3dlciBpcyBsYXJnZXIgdGhhbiB0aGUgcmVndWxhdG9yeSwgdGhlIHBvd2VyIHNob3VsZCBiZSByZXN0cmFpbgotCQkJCQlpZiAoQWRqdXN0TWF4VHhQd3JbaSo4K2pdID4gQ291bnRyeVR4UHdyKQotCQkJCQl7Ci0JCQkJCQkvLyBkZWNyZWFzZSB0byB6ZXJvIGFuZCBkb24ndCBuZWVkIHRvIHRha2UgY2FyZSBCQlBSMQotCQkJCQkJaWYgKChWYWx1ZSAtIChBZGp1c3RNYXhUeFB3cltpKjgral0gLSBDb3VudHJ5VHhQd3IpKSA+IDApCi0JCQkJCQkJVmFsdWUgLT0gKEFkanVzdE1heFR4UHdyW2kqOCtqXSAtIENvdW50cnlUeFB3cik7Ci0JCQkJCQllbHNlCi0JCQkJCQkJVmFsdWUgPSAwOwotCi0JCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRqdXN0VHhQb3dlciAoaS9qPSVkLyVkLCBWYWx1ZT0lZCwgJWQpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkanVzdFR4UG93ZXIgKGkvaj0lZC8lZCwgVmFsdWU9JWQsICVkLCBubyBjaGFuZ2UpXG4iLCBpLCBqLCBWYWx1ZSwgQWRqdXN0TWF4VHhQd3JbaSo4K2pdKSk7Ci0KLQkJCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSB3aGlsZSAoRkFMU0UpOwotI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KLQotCS8qIGNhbGN1bGF0ZSBkZWx0YSBwb3dlciBiYXNlZCBvbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSSAqLwotCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKLQkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSQotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9PSAweGZmZmZmZmZmKSAgICAgICAvLyBBVVRPIFRYIFBPV0VSIGNvbnRyb2wKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vIHRvIHBhdGNoIGhpZ2ggcG93ZXIgaXNzdWUgd2l0aCBzb21lIEFQcywgbGlrZSBCZWxraW4gTjEuCi0JCQlpZiAoUnNzaSA+IC0zNSkKLQkJCXsKLQkJCQlCYnBSMSB8PSAweDAyOwkJLy8gRGVsdGFQd3IgLT0gMTI7Ci0JCQl9Ci0JCQllbHNlIGlmIChSc3NpID4gLTQwKQotCQkJewotCQkJCUJicFIxIHw9IDB4MDE7CQkvLyBEZWx0YVB3ciAtPSA2OwotCQkJfQotCQkJZWxzZQotCQk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5MCkgIC8vIDkxIH4gMTAwJSAmIEFVVE8sIHRyZWF0IGFzIDEwMCUgaW4gdGVybXMgb2YgbVcKLQkJOwotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gNjApICAvLyA2MSB+IDkwJSwgdHJlYXQgYXMgNzUlIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxOwotCXsKLQkJRGVsdGFQd3IgLT0gMTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8vIDMxIH4gNjAlLCB0cmVhdCBhcyA1MCUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDM7Ci0JewotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVwkJLy8gRGVsdGFQd3IgLT0gNjsKLQl7Ci0JCUJicFIxIHw9IDB4MDE7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gOSkgICAvLyAxMCB+IDE1JSwgdHJlYXQgYXMgMTIuNSUgaW4gdGVybXMgb2YgbVcJCS8vIERlbHRhUHdyIC09IDk7Ci0JewotCQlCYnBSMSB8PSAweDAxOwotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAgfiA5ICUsIHRyZWF0IGFzIE1JTih+MyUpIGluIHRlcm1zIG9mIG1XCQkvLyBEZWx0YVB3ciAtPSAxMjsKLQl7Ci0JCUJicFIxIHw9IDB4MDI7Ci0JfQotCi0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwUjEpOwotCi0JLyogcmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUgKi8KLQlmb3IoaT0wOyBpPDU7IGkrKykKLQl7Ci0JCWlmIChUeFB3cltpXSAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCQlmb3IgKGo9MDsgajw4OyBqKyspCi0JCQl7Ci0JCQkJVmFsdWUgPSAoQ0hBUikoKFR4UHdyW2ldID4+IGoqNCkgJiAweDBGKTsgLyogMCB+IDE1ICovCi0KLQkJCQlpZiAoKFZhbHVlICsgRGVsdGFQd3IpIDwgMCkKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMDsgLyogbWluICovCi0JCQkJfQotCQkJCWVsc2UgaWYgKChWYWx1ZSArIERlbHRhUHdyKSA+IDB4RikKLQkJCQl7Ci0JCQkJCVZhbHVlID0gMHhGOyAvKiBtYXggKi8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJVmFsdWUgKz0gRGVsdGFQd3I7IC8qIHRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbiAqLwotCQkJCX0KLQotCQkJCS8qIGZpbGwgbmV3IHZhbHVlIHRvIENTUiBvZmZzZXQgKi8KLQkJCQlUeFB3cltpXSA9IChUeFB3cltpXSAmIH4oMHgwMDAwMDAwRiA8PCBqKjQpKSB8IChWYWx1ZSA8PCBqKjQpOwotCQkJfQotCi0JCQkvKiB3cml0ZSB0eCBwb3dlciB2YWx1ZSB0byBDU1IgKi8KLQkJCS8qIFRYX1BXUl9DRkdfMCAoOCB0eCByYXRlKSBmb3IJVFggcG93ZXIgZm9yIE9GRE0gMTJNLzE4TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgT0ZETSA2TS85TQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLNS41TS8xMU0KLQkJCQkJCQkJCQkJVFggcG93ZXIgZm9yIENDSzFNLzJNICovCi0JCQkvKiBUWF9QV1JfQ0ZHXzEgfiBUWF9QV1JfQ0ZHXzQgKi8KLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgVHhQd3JbaV0pOwotCQl9Ci0JfQotCi0jaWZkZWYgQ0FSUklFUl9TRU5TRV9ORVdfQUxHTwotCS8vS0ggQWRkIHRvIEZpeCBQQ0llIFBvd2VyLVNhdmluZyBidWc8LS0KLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvL0tIIGFkZCB0byBmaXggUENJZS1Qb3dlciBTYXZpbmcgLS0+Ci0jZW5kaWYgLy8gQ0FSUklFUl9TRU5TRV9ORVdfQUxHTyAvLwotCi19Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBBc2ljUmVzZXRCQlBBZ2VudCgKLUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJCUF9DU1JfQ0ZHX1NUUlVDCUJicENzcjsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXNldCBCQlAgQWdlbnQgYnVzeSBiaXQuISEgXG4iKSk7Ci0JLy8gU3RpbGwgbmVlZCB0byBmaW5kIHdoeSBCQlAgYWdlbnQga2VlcHMgYnVzeSwgYnV0IGluIGZhY3QsIGhhcmR3YXJlIHN0aWxsIGZ1bmN0aW9uIG9rLiBOb3cgY2xlYXIgYnVzeSBmaXJzdC4KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9CQlBfQUdFTlQsICZCYnBDc3Iud29yZCk7Ci0JQmJwQ3NyLmZpZWxkLkJ1c3kgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIEJicENzci53b3JkKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJcHV0IFBIWSB0byBzbGVlcCBoZXJlLCBhbmQgc2V0IG5leHQgd2FrZXVwIHRpbWVyLiBQSFkgZG9lc24ndCBub3Qgd2FrZXVwCi0JCWF1dG9tYXRpY2FsbHkuIEluc3RlYWQsIE1DVSB3aWxsIGlzc3VlIGEgVHdha2VVcEludGVycnVwdCB0byBob3N0IGFmdGVyCi0JCXRoZSB3YWtldXAgdGltZXIgdGltZW91dC4gRHJpdmVyIGhhcyB0byBpc3N1ZSBhIHNlcGFyYXRlIGNvbW1hbmQgdG8gd2FrZQotCQlQSFkgdXAuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFRidHROdW1Ub05leHRXYWtlVXApCi17Ci0JUlRNUF9TVEFfU0xFRVBfVEhFTl9BVVRPX1dBS0VVUChwQWQsIFRidHROdW1Ub05leHRXYWtlVXApOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgbWFudWFsIHdha2V1cCBpcyByZXF1aXJlZAotCQlBc2ljRm9yY2VTbGVlcCgpIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBub3QgaW4gSU5GUkEgQlNTLiBXaGVuCi0JCWluIElORlJBIEJTUywgd2Ugc2hvdWxkIHVzZSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCgpIGluc3RlYWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRm9yY2VTbGVlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFzaWNGb3JjZVdha2V1cCgpIGlzIHVzZWQgd2hlbmV2ZXIgVHdha2V1cCB0aW1lciAoc2V0IHZpYSBBc2ljU2xlZXBUaGVuQXV0b1dha2V1cCkKLQkJZXhwaXJlZC4KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICBiRnJvbVR4KQotewotICAgIERCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiLS0+IEFzaWNGb3JjZVdha2V1cCBcbiIpKTsKLSAgICBSVE1QX1NUQV9GT1JDRV9XQUtFVVAocEFkLCBiRnJvbVR4KTsKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNldCBNeSBCU1NJRAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNTZXRCc3NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEJzc2lkKQotewotCVVMT05HCQkgIEFkZHI0OwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PiBBc2ljU2V0QnNzaWQgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCi0JCXBCc3NpZFswXSxwQnNzaWRbMV0scEJzc2lkWzJdLHBCc3NpZFszXSwgcEJzc2lkWzRdLHBCc3NpZFs1XSkpOwotCi0JQWRkcjQgPSAoVUxPTkcpKHBCc3NpZFswXSkJCSB8Ci0JCQkoVUxPTkcpKHBCc3NpZFsxXSA8PCA4KSAgfAotCQkJKFVMT05HKShwQnNzaWRbMl0gPDwgMTYpIHwKLQkJCShVTE9ORykocEJzc2lkWzNdIDw8IDI0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcwLCBBZGRyNCk7Ci0KLQlBZGRyNCA9IDA7Ci0JLy8gYWx3YXlzIG9uZSBCU1NJRCBpbiBTVEEgbW9kZQotCUFkZHI0ID0gKFVMT05HKShwQnNzaWRbNF0pIHwgKFVMT05HKShwQnNzaWRbNV0gPDwgOCk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQlNTSURfRFcxLCBBZGRyNCk7Ci19Ci0KLVZPSUQgQXNpY1NldE1jYXN0V0MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXTsKLQlVU0hPUlQJCW9mZnNldDsKLQotCXBFbnRyeS0+U3N0ICAgICAgICA9IFNTVF9BU1NPQzsKLQlwRW50cnktPkFpZCAgICAgICAgPSBNQ0FTVF9XQ0lEOwkvLyBTb2Z0YXAgc3VwcG9ydHMgMSBCU1NJRCBhbmQgdXNlIFdDSUQ9MCBhcyBtdWx0aWNhc3QgV2NpZCBpbmRleAotCXBFbnRyeS0+UHNNb2RlICAgICA9IFBXUl9BQ1RJVkU7Ci0JcEVudHJ5LT5DdXJyVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIEJTUzBNY2FzdF9XQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0RlbFdjaWRUYWIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJV2NpZCkKLXsKLQlVTE9ORwkJICBBZGRyMCA9IDB4MCwgQWRkcjEgPSAweDA7Ci0JVUxPTkcJCW9mZnNldDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzaWNEZWxXY2lkVGFiPT0+V2NpZCA9IDB4JXhcbiIsV2NpZCkpOwotCW9mZnNldCA9IE1BQ19XQ0lEX0JBU0UgKyBXY2lkICogSFdfV0NJRF9FTlRSWV9TSVpFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjApOwotCW9mZnNldCArPSA0OwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCwgQWRkcjEpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY0VuYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlUWF9MSU5LX0NGR19TVFJVQwlUeExpbmtDZmc7Ci0JVUlOVDMyCQkJCURhdGEgPSAwOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9MSU5LX0NGRywgJlR4TGlua0NmZy53b3JkKTsKLQlUeExpbmtDZmcuZmllbGQuVHhSREdFbiA9IDE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTElOS19DRkcsIFR4TGlua0NmZy53b3JkKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7Ci0JRGF0YSAgJj0gMHhGRkZGRkYwMDsKLQlEYXRhICB8PSAweDgwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Ci0KLQkvL09QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGlzYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlUWF9MSU5LX0NGR19TVFJVQwlUeExpbmtDZmc7Ci0JVUlOVDMyCQkJCURhdGEgPSAwOwotCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0xJTktfQ0ZHLCAmVHhMaW5rQ2ZnLndvcmQpOwotCVR4TGlua0NmZy5maWVsZC5UeFJER0VuID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRENBX0FDMF9DRkcsICZEYXRhKTsKLQotCURhdGEgICY9IDB4RkZGRkZGMDA7Ci0JLy9EYXRhICB8PSAweDIwOwotI2lmbmRlZiBXSUZJX1RFU1QKLQkvL2lmICggcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgKQotCS8vCURhdGEgfD0gMHg2MDsgLy8gZm9yIHBlcmZvcm1hbmNlIGlzc3VlIG5vdCBzZXQgdGhlIFRYT1AgdG8gMAotI2VuZGlmCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9EWU5BTUlDX0JFX1RYT1BfQUNUSVZFKQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkmJiAocEFkLT5NYWNUYWIuZkFueVN0YXRpb25NSU1PUFNEeW5hbWljID09IEZBTFNFKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCSkKLQl7Ci0JCS8vIEZvciBDV0MgdGVzdCwgY2hhbmdlIHR4b3AgZnJvbSAweDMwIHRvIDB4MjAgaW4gVHhCdXJzdCBtb2RlCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkKLQkJRGF0YSB8PSAweDIwOwotCX0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRGlzYWJsZVN5bmMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5EaXNhYmxlIFRTRiBzeW5jaHJvbml6YXRpb25cbiIpKTsKLQotCS8vIDIwMDMtMTItMjAgZGlzYWJsZSBUU0YgYW5kIFRCVFQgd2hpbGUgTklDIGluIHBvd2VyLXNhdmluZyBoYXZlIHNpZGUgZWZmZWN0Ci0JLy8JCQkgIHRoYXQgTklDIHdpbGwgbmV2ZXIgd2FrZXMgdXAgYmVjYXVzZSBUU0Ygc3RvcHMgYW5kIG5vIG1vcmUKLQkvLwkJCSAgVEJUVCBpbnRlcnJ1cHRzCi0JcEFkLT5UYnR0VGlja0NvdW50ID0gMDsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQljc3IuZmllbGQuYkJlYWNvbkdlbiA9IDA7Ci0JY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMDsKLQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOwotCWNzci5maWVsZC5iVHNmVGlja2luZyA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzaWNFbmFibGVCc3NTeW5jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJDTl9USU1FX0NGR19TVFJVQyBjc3I7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLS0+QXNpY0VuYWJsZUJzc1N5bmMoSU5GUkEgbW9kZSlcbiIpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAmY3NyLndvcmQpOwotLy8JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCAweDAwMDAwMDAwKTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJY3NyLmZpZWxkLkJlYWNvbkludGVydmFsID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQotCQljc3IuZmllbGQuYlRzZlRpY2tpbmcgPSAxOwotCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAxOyAvLyBzeW5jIFRTRiBpbiBJTkZSQVNUUlVDVFVSRSBtb2RlCi0JCWNzci5maWVsZC5iQmVhY29uR2VuICA9IDA7IC8vIGRvIE5PVCBnZW5lcmF0ZSBCRUFDT04KLQkJY3NyLmZpZWxkLmJUQlRURW5hYmxlID0gMTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQlOb3RlOgotCQlCRUFDT04gZnJhbWUgaW4gc2hhcmVkIG1lbW9yeSBzaG91bGQgYmUgYnVpbHQgb2sgYmVmb3JlIHRoaXMgcm91dGluZQotCQljYW4gYmUgY2FsbGVkLiBPdGhlcndpc2UsIGEgZ2FyYmFnZSBmcmFtZSBtYXliZSB0cmFuc21pdHRlZCBvdXQgZXZlcnkKLQkJQmVhY29uIHBlcmlvZC4KLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljRW5hYmxlSWJzc1N5bmMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjk7Ci0JUFVDSEFSCQkJcHRyOwotCVVJTlQgaTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tLT5Bc2ljRW5hYmxlSWJzc1N5bmMoQURIT0MgbW9kZS4gTVBEVXRvdGFsQnl0ZUNvdW50ID0gJWQpXG4iLCBwQWQtPkJlYWNvblR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50KSk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzcjkud29yZCk7Ci0JY3NyOS5maWVsZC5iQmVhY29uR2VuID0gMDsKLQljc3I5LmZpZWxkLmJUQlRURW5hYmxlID0gMDsKLQljc3I5LmZpZWxkLmJUc2ZUaWNraW5nID0gMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzcjkud29yZCk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyBtb3ZlIEJFQUNPTiBUWEQgYW5kIGZyYW1lIGNvbnRlbnQgdG8gb24tY2hpcCBtZW1vcnkKLQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7Ci0JZm9yIChpPTA7IGk8VFhXSV9TSVpFOyBpKz00KSAgLy8gMTYtYnl0ZSBUWFdJIGZpZWxkCi0JewotCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIGksIGxvbmdwdHIpOwotCQlwdHIgKz0gNDsKLQl9Ci0KLQkvLyBzdGFydCByaWdodCBhZnRlciB0aGUgMTYtYnl0ZSBUWFdJIGZpZWxkCi0JcHRyID0gcEFkLT5CZWFjb25CdWY7Ci0JZm9yIChpPTA7IGk8IHBBZC0+QmVhY29uVHhXSS5NUERVdG90YWxCeXRlQ291bnQ7IGkrPTQpCi0JewotCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhXX0JFQUNPTl9CQVNFMCArIFRYV0lfU0laRSArIGksIGxvbmdwdHIpOwotCQlwdHIgKz00OwotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0JLy8KLQkvLyBGb3IgV2ktRmkgZmFpbHkgZ2VuZXJhdGVkIGJlYWNvbnMgYmV0d2VlbiBwYXJ0aWNpcGF0aW5nIHN0YXRpb25zLgotCS8vIFNldCBUQlRUIHBoYXNlIGFkYXB0aXZlIGFkanVzdG1lbnQgc3RlcCB0byA4dXMgKGRlZmF1bHQgMTZ1cykKLQkvLyBkb24ndCBjaGFuZ2Ugc2V0dGluZ3MgMjAwNi01LSBieSBKZXJyeQotCS8vUlRNUF9JT19XUklURTMyKHBBZCwgVEJUVF9TWU5DX0NGRywgMHgwMDAwMTAxMCk7Ci0KLQkvLyBzdGFydCBzZW5kaW5nIEJFQUNPTgotCWNzcjkuZmllbGQuQmVhY29uSW50ZXJ2YWwgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNDsgLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVCi0JY3NyOS5maWVsZC5iVHNmVGlja2luZyA9IDE7Ci0JY3NyOS5maWVsZC5Uc2ZTeW5jTW9kZSA9IDI7IC8vIHN5bmMgVFNGIGluIElCU1MgbW9kZQotCWNzcjkuZmllbGQuYlRCVFRFbmFibGUgPSAxOwotCWNzcjkuZmllbGQuYkJlYWNvbkdlbiA9IDE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3I5LndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc2ljU2V0RWRjYVBhcm0oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUEVEQ0FfUEFSTQkgcEVkY2FQYXJtKQotewotCUVEQ0FfQUNfQ0ZHX1NUUlVDICAgQWMwQ2ZnLCBBYzFDZmcsIEFjMkNmZywgQWMzQ2ZnOwotCUFDX1RYT1BfQ1NSMF9TVFJVQyBjc3IwOwotCUFDX1RYT1BfQ1NSMV9TVFJVQyBjc3IxOwotCUFJRlNOX0NTUl9TVFJVQyAgICBBaWZzbkNzcjsKLQlDV01JTl9DU1JfU1RSVUMgICAgQ3dtaW5Dc3I7Ci0JQ1dNQVhfQ1NSX1NUUlVDICAgIEN3bWF4Q3NyOwotCWludCBpOwotCi0JQWMwQ2ZnLndvcmQgPSAwOwotCUFjMUNmZy53b3JkID0gMDsKLQlBYzJDZmcud29yZCA9IDA7Ci0JQWMzQ2ZnLndvcmQgPSAwOwotCWlmICgocEVkY2FQYXJtID09IE5VTEwpIHx8IChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNTZXRFZGNhUGFybVxuIikpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKTsKLQkJZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQkJewotCQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSB8fCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNBcENsaSkKLQkJCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQkJfQotCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gICAgICBNQUMgUmVnaXN0ZXIgaGFzIGEgY29weSAuCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vI2lmbmRlZiBXSUZJX1RFU1QKLQkJaWYoIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0ICkKLQkJewotCQkJLy8gRm9yIENXQyB0ZXN0LCBjaGFuZ2UgdHhvcCBmcm9tIDB4MzAgdG8gMHgyMCBpbiBUeEJ1cnN0IG1vZGUKLQkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAweDIwOyAvLyBTdWdnZXN0IGJ5IEpvaG4gZm9yIFR4QnVyc3QgaW4gSFQgTW9kZQotCQl9Ci0JCWVsc2UKLQkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQkUKLS8vI2Vsc2UKLS8vCQlBYzBDZmcuZmllbGQuQWNUeG9wID0gMDsJLy8gUUlEX0FDX0JFCi0vLyNlbmRpZgotCQlBYzBDZmcuZmllbGQuQ3dtaW4gPSBDV19NSU5fSU5fQklUUzsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWF4ID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUFjMENmZy5maWVsZC5BaWZzbiA9IDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgQWMwQ2ZnLndvcmQpOwotCi0JCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAwOwkvLyBRSURfQUNfQksKLQkJQWMxQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMUNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzFDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMV9DRkcsIEFjMUNmZy53b3JkKTsKLQotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQl7Ci0JCQlBYzJDZmcuZmllbGQuQWNUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gOTY7CS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFjMkNmZy5maWVsZC5BY1R4b3AgPSA5NjsJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCQlBYzNDZmcuZmllbGQuQWNUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JCX0KLQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjMkNmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzJDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUFjM0NmZy5maWVsZC5Dd21heCA9IENXX01BWF9JTl9CSVRTOwotCQlBYzNDZmcuZmllbGQuQWlmc24gPSAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDM19DRkcsIEFjM0NmZy53b3JkKTsKLQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDA7CQkvLyBRSURfQUNfQkUKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gMDsJCS8vIFFJRF9BQ19CSwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXTU1fVFhPUDBfQ0ZHLCBjc3IwLndvcmQpOwotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCQl7Ci0JCQljc3IxLmZpZWxkLkFjMlR4b3AgPSAxOTI7CQkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA5NjsJCS8vIEFDX1ZPOiA5NiozMnVzICB+PSAzbXMKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNzcjEuZmllbGQuQWMyVHhvcCA9IDk2OwkJLy8gQUNfVkk6IDk2KjMydXMgfj0gM21zCi0JCQljc3IxLmZpZWxkLkFjM1R4b3AgPSA0ODsJCS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKLQotCQlDd21pbkNzci53b3JkID0gMDsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMSA9IENXX01JTl9JTl9CSVRTOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjIgPSBDV19NSU5fSU5fQklUUzsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4zID0gQ1dfTUlOX0lOX0JJVFM7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9DV01JTl9DRkcsIEN3bWluQ3NyLndvcmQpOwotCi0JCUN3bWF4Q3NyLndvcmQgPSAwOwotCQlDd21heENzci5maWVsZC5Dd21heDAgPSBDV19NQVhfSU5fQklUUzsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gQ1dfTUFYX0lOX0JJVFM7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MiA9IENXX01BWF9JTl9CSVRTOwotCQlDd21heENzci5maWVsZC5Dd21heDMgPSBDV19NQVhfSU5fQklUUzsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0FJRlNOX0NGRywgMHgwMDAwMjIyMik7Ci0KLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQl9Ci0JZWxzZQotCXsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpOwotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgTUFDIFJlZ2lzdGVyIGhhcyBhIGNvcHkuCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8KLQkJLy8gTW9kaWZ5IEN3bWluL0N3bWF4L1R4b3Agb24gcXVldWVbUUlEX0FDX1ZJXSwgUmVjb21tZW5kIGJ5IEplcnJ5IDIwMDUvMDcvMjcKLQkJLy8gVG8gZGVncmFkZSBvdXIgVklETyBRdWV1ZSdzIHRocm91Z2hwdXQgZm9yIFdpRmkgV01NIFMzVDA3IElzc3VlLgotCQkvLwotCQkvL3BFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldID0gcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19WSV0gKiA3IC8gMTA7IC8vIHJ0Mjg2MGMgbmVlZCB0aGlzCi0KLQkJQWMwQ2ZnLmZpZWxkLkFjVHhvcCA9ICBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkN3bWluPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CRV07Ci0JCUFjMENmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKLQkJQWMwQ2ZnLmZpZWxkLkFpZnNuID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQkVdOyAvLysxOwotCi0JCUFjMUNmZy5maWVsZC5BY1R4b3AgPSAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CS107Ci0JCUFjMUNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JLXTsgLy8rMjsKLQkJQWMxQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOwotCQlBYzFDZmcuZmllbGQuQWlmc24gPSBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107IC8vKzE7Ci0KLQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IChwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZJXSAqIDYpIC8gMTA7Ci0JCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQkJQWMyQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldICsgMTsKLQkJCUFjMkNmZy5maWVsZC5Dd21heCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZJXSArIDE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCUFjMkNmZy5maWVsZC5Dd21pbiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKLQkJQWMyQ2ZnLmZpZWxkLkN3bWF4ID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldOwotCQl9Ci0JCUFjMkNmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSArIDE7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vIFR1bmluZyBmb3IgV2ktRmkgV01NIFMwNgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCQlBYzJDZmcuZmllbGQuQWlmc24gLT0gMTsKLQotCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCi0JCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29uZXhhbnQgbGVnYWN5IHN0YSA9PT4gYnJvYWRjb20gMTFuIHN0YQotCQkJaWYgKFNUQV9UR05fV0lGSV9PTihwQWQpICYmCi0JCQkJcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID09IDEwKQotCQkJewotCQkJCUFjMENmZy5maWVsZC5BaWZzbiA9IDM7Ci0JCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IDU7Ci0JCQl9Ci0KLSNpZmRlZiBSVDMweHgKLQkJCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCB8fCBwQWQtPlJmSWNUeXBlID09IFJGSUNfMjAyMCkKLQkJCXsKLQkJCQkvLyBUdW5pbmcgZm9yIFdpRmkgV01NIFMzLVQwNzogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEuCi0JCQkJQWMyQ2ZnLmZpZWxkLkFpZnNuID0gNTsKLQkJCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCUFjM0NmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX1ZPXTsKLQkJQWMzQ2ZnLmZpZWxkLkN3bWluID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVk9dOwotCQlBYzNDZmcuZmllbGQuQ3dtYXggPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WT107Ci0JCUFjM0NmZy5maWVsZC5BaWZzbiA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXTsKLQotLy8jaWZkZWYgV0lGSV9URVNUCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QpCi0JCXsKLQkJCWlmIChBYzNDZmcuZmllbGQuQWNUeG9wID09IDEwMikKLQkJCXsKLQkJCUFjMENmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JFXSA/IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQkVdIDogMTA7Ci0JCQkJQWMwQ2ZnLmZpZWxkLkFpZnNuICA9IHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXS0xOyAvKiBBSUZTTiBtdXN0ID49IDEgKi8KLQkJCUFjMUNmZy5maWVsZC5BY1R4b3AgPSBwRWRjYVBhcm0tPlR4b3BbUUlEX0FDX0JLXTsKLQkJCQlBYzFDZmcuZmllbGQuQWlmc24gID0gcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfQktdOwotCQkJQWMyQ2ZnLmZpZWxkLkFjVHhvcCA9IHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldOwotCQkJfSAvKiBFbmQgb2YgaWYgKi8KLQkJfQotLy8jZW5kaWYgLy8gV0lGSV9URVNUIC8vCi0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzBfQ0ZHLCBBYzBDZmcud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMxX0NGRywgQWMxQ2ZnLndvcmQpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMl9DRkcsIEFjMkNmZy53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRURDQV9BQzNfQ0ZHLCBBYzNDZmcud29yZCk7Ci0KLQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCS8vICAgICAgRE1BIFJlZ2lzdGVyIGhhcyBhIGNvcHkgdG9vLgotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IEFjMENmZy5maWVsZC5BY1R4b3A7Ci0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IEFjMUNmZy5maWVsZC5BY1R4b3A7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMF9DRkcsIGNzcjAud29yZCk7Ci0KLQkJY3NyMS5maWVsZC5BYzJUeG9wID0gQWMyQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJY3NyMS5maWVsZC5BYzNUeG9wID0gQWMzQ2ZnLmZpZWxkLkFjVHhvcDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AxX0NGRywgY3NyMS53b3JkKTsKLQotCQlDd21pbkNzci53b3JkID0gMDsKLQkJQ3dtaW5Dc3IuZmllbGQuQ3dtaW4wID0gcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfQkVdOwotCQlDd21pbkNzci5maWVsZC5Dd21pbjEgPSBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS107Ci0JCUN3bWluQ3NyLmZpZWxkLkN3bWluMiA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZJXTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCUN3bWluQ3NyLmZpZWxkLkN3bWluMyA9IHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSAtIDE7IC8vZm9yIFRHbiB3aWZpIHRlc3QKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUlOX0NGRywgQ3dtaW5Dc3Iud29yZCk7Ci0KLQkJQ3dtYXhDc3Iud29yZCA9IDA7Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MCA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX0JFXTsKLQkJQ3dtYXhDc3IuZmllbGQuQ3dtYXgxID0gcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdOwotCQlDd21heENzci5maWVsZC5Dd21heDIgPSBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19WSV07Ci0JCUN3bWF4Q3NyLmZpZWxkLkN3bWF4MyA9IHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV01NX0NXTUFYX0NGRywgQ3dtYXhDc3Iud29yZCk7Ci0KLQkJQWlmc25Dc3Iud29yZCA9IDA7Ci0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMCA9IEFjMENmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CRV07Ci0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMSA9IEFjMUNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS107Ci0JCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IEFjMkNmZy5maWVsZC5BaWZzbjsgLy9wRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV07Ci0jaWZkZWYgSU5GX0FNQVpPTl9TRQotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQkvLyBUdW5pbmcgZm9yIFdpLUZpIFdNTSBTMDYKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QgJiYKLQkJCQlwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19WSV0gPT0gMTApCi0JCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gQWMyQ2ZnLmZpZWxkLkFpZnNuIC0gNDsKLQotCQkJLy8gVHVuaW5nIGZvciBUR24gV2ktRmkgNS4yLjMyCi0JCQkvLyBTVEEgVGVzdEJlZCBjaGFuZ2VzIGluIHRoaXMgaXRlbTogY29ubmV4YW50IGxlZ2FjeSBzdGEgPT0+IGJyb2FkY29tIDExbiBzdGEKLQkJCWlmIChTVEFfVEdOX1dJRklfT04ocEFkKSAmJgotCQkJCXBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXSA9PSAxMCkKLQkJCXsKLQkJCQlBaWZzbkNzci5maWVsZC5BaWZzbjAgPSAzOwotCQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMiA9IDc7Ci0JCQl9Ci0KLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCUFpZnNuQ3NyLmZpZWxkLkFpZnNuMyA9IEFjM0NmZy5maWVsZC5BaWZzbiAtIDE7IC8vcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVk9dOyAvL2ZvciBUR24gd2lmaSB0ZXN0Ci0jaWZkZWYgUlQzMHh4Ci0JCQkvLyBUT0RPOiBTaGlhbmcsIHRoaXMgbW9kaWZpY2F0aW9uIGFsc28gc3VpdGFibGUgZm9yIFJUMzA1Mi9SVDMwNTAgPz8/Ci0JCQlpZiAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwMjAgfHwgcEFkLT5SZkljVHlwZSA9PSBSRklDXzIwMjApCi0JCQl7Ci0JCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQkJQWlmc25Dc3IuZmllbGQuQWlmc24yID0gMHgyOyAvL3BFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZJXTsgLy9mb3IgV2lGaSBXTU0gUzQtVDA0LgotCQkJfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9BSUZTTl9DRkcsIEFpZnNuQ3NyLndvcmQpOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCBwRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQkJaWYgKCFBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkVEQ0EgWyMlZF06IEFJRlNOIENXbWluIENXbWF4ICBUWE9QKHVzKSAgQUNNXG4iLCBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JFICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblswXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzBdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMF0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzBdPDw1LAotCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVswXSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX0JLICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsxXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzFdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMV0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzFdPDw1LAotCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsxXSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZJICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblsyXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzJdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbMl0sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzJdPDw1LAotCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVsyXSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIgICAgIEFDX1ZPICAgICAgJTJkICAgICAlMmQgICAgICUyZCAgICAgICU0ZCAgICAgJWRcbiIsCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5BaWZzblszXSwKLQkJCQkJCQkJCSBwRWRjYVBhcm0tPkN3bWluWzNdLAotCQkJCQkJCQkJIHBFZGNhUGFybS0+Q3dtYXhbM10sCi0JCQkJCQkJCQkgcEVkY2FQYXJtLT5UeG9wWzNdPDw1LAotCQkJCQkJCQkJIHBFZGNhUGFybS0+YkFDTVszXSkpOwotCQl9Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lECUFzaWNTZXRTbG90VGltZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOIGJVc2VTaG9ydFNsb3RUaW1lKQotewotCVVMT05HCVNsb3RUaW1lOwotCVVJTlQzMglSZWdWYWx1ZSA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotCQliVXNlU2hvcnRTbG90VGltZSA9IFRSVUU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAoYlVzZVNob3J0U2xvdFRpbWUgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCkpCi0JCXJldHVybjsKLQllbHNlIGlmICgoIWJVc2VTaG9ydFNsb3RUaW1lKSAmJiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpKSkKLQkJcmV0dXJuOwotCi0JaWYgKGJVc2VTaG9ydFNsb3RUaW1lKQotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOwotCWVsc2UKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfU0xPVF9JTlVTRUQpOwotCi0JU2xvdFRpbWUgPSAoYlVzZVNob3J0U2xvdFRpbWUpPyA5IDogMjA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gZm9yY2UgdXNpbmcgc2hvcnQgU0xPVCB0aW1lIGZvciBGQUUgdG8gZGVtbyBwZXJmb3JtYW5jZSB3aGVuIFR4QnVyc3QgaXMgT04KLQkJaWYgKCgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpICYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKSkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCXx8ICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPT0gQkFfTk9UVVNFKSkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCSkKLQkJewotCQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIHRoaW5rIGl0IGlzIGRvaW5nIFdpLUZpIHRlc3QKLQkJCS8vIEFuZCB3ZSB3aWxsIG5vdCBzZXQgdG8gc2hvcnQgc2xvdCB3aGVuIGJFbmFibGVUeEJ1cnN0IGlzIFRSVUUuCi0JCX0KLQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JCXsKLQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCk7Ci0JCQlTbG90VGltZSA9IDk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLwotCS8vIEZvciBzb21lIHJlYXNvbnMsIGFsd2F5cyBzZXQgaXQgdG8gc2hvcnQgc2xvdCB0aW1lLgotCS8vCi0JLy8gVG9EbzogU2hvdWxkIGNvbnNpZGVyIGNhcGFiaWxpdHkgd2l0aCAxMUIKLQkvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCXsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKTsKLQkJCVNsb3RUaW1lID0gMjA7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEJLT0ZGX1NMT1RfQ0ZHLCAmUmVnVmFsdWUpOwotCVJlZ1ZhbHVlID0gUmVnVmFsdWUgJiAweEZGRkZGRjAwOwotCi0JUmVnVmFsdWUgfD0gU2xvdFRpbWU7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCS09GRl9TTE9UX0NGRywgUmVnVmFsdWUpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlBZGQgU2hhcmVkIGtleSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMuCi0JCVVwZGF0ZSBzaGFyZWQga2V5LCBUeE1pYyBhbmQgUnhNaWMgdG8gQXNpYyBTaGFyZWQga2V5IHRhYmxlCi0JCVVwZGF0ZSBpdHMgY2lwaGVyQWxnIHRvIEFzaWMgU2hhcmVkIGtleSBNb2RlLgotCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY0FkZFNoYXJlZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQnNzSW5kZXgsCi0JSU4gVUNIQVIJCSBLZXlJZHgsCi0JSU4gVUNIQVIJCSBDaXBoZXJBbGcsCi0JSU4gUFVDSEFSCQkgcEtleSwKLQlJTiBQVUNIQVIJCSBwVHhNaWMsCi0JSU4gUFVDSEFSCQkgcFJ4TWljKQotewotCVVMT05HIG9mZnNldDsgLy8sIGNzcjA7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlJTlQgICBpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY0FkZFNoYXJlZEtleUVudHJ5IEJzc0luZGV4PSVkLCBLZXlJZHg9JWRcbiIsIEJzc0luZGV4LEtleUlkeCkpOwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBc2ljQWRkU2hhcmVkS2V5RW50cnk6ICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSwgQnNzSW5kZXgqNCArIEtleUlkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIJCUtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCXBLZXlbMF0scEtleVsxXSxwS2V5WzJdLHBLZXlbM10scEtleVs0XSxwS2V5WzVdLHBLZXlbNl0scEtleVs3XSxwS2V5WzhdLHBLZXlbOV0scEtleVsxMF0scEtleVsxMV0scEtleVsxMl0scEtleVsxM10scEtleVsxNF0scEtleVsxNV0pKTsKLQlpZiAocFJ4TWljKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIgkJUnggTUlDIEtleSA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCXBSeE1pY1swXSxwUnhNaWNbMV0scFJ4TWljWzJdLHBSeE1pY1szXSxwUnhNaWNbNF0scFJ4TWljWzVdLHBSeE1pY1s2XSxwUnhNaWNbN10pKTsKLQl9Ci0JaWYgKHBUeE1pYykKLQl7Ci0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIJCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7Ci0JfQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vCi0JLy8gZmlsbCBrZXkgbWF0ZXJpYWwgLSBrZXkgKyBUWCBNSUMgKyBSWCBNSUMKLQkvLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCW9mZnNldCA9IFNIQVJFRF9LRVlfVEFCTEVfQkFTRSArICg0KkJzc0luZGV4ICsgS2V5SWR4KSpIV19LRVlfRU5UUllfU0laRTsKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NIQVJFX0tFWTsgaSsrKQotCXsKLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKLQl9Ci0KLQlvZmZzZXQgKz0gTUFYX0xFTl9PRl9TSEFSRV9LRVk7Ci0JaWYgKHBUeE1pYykKLQl7Ci0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHhNaWNbaV0pOwotCQl9Ci0JfQotCi0Jb2Zmc2V0ICs9IDg7Ci0JaWYgKHBSeE1pYykKLQl7Ci0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwUnhNaWNbaV0pOwotCQl9Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQkvLwotCS8vIFVwZGF0ZSBjaXBoZXIgYWxnb3JpdGhtLiBXU1RBIGFsd2F5cyB1c2UgQlNTMAotCS8vCi0JUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgJmNzcjEud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSZWFkOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gS2V5SWR4WyVkXT0gMHgleCBcbiIsIEJzc0luZGV4LEtleUlkeCwgY3NyMS53b3JkKSk7Ci0JaWYgKChCc3NJbmRleCUyKSA9PSAwKQotCXsKLQkJaWYgKEtleUlkeCA9PSAwKQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMEtleTJDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UKLQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJY3NyMS5maWVsZC5Cc3MxS2V5MUNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIldyaXRlOiBTSEFSRURfS0VZX01PREVfQkFTRSBhdCB0aGlzIEJzc1slZF0gPSAweCV4IFxuIiwgQnNzSW5kZXgsIGNzcjEud29yZCkpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCBjc3IxLndvcmQpOwotCi19Ci0KLS8vCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJbmRleCwKLQlJTiBVQ0hBUgkJIEtleUlkeCkKLXsKLQkvL1VMT05HIFNlY0NzcjA7Ci0JU0hBUkVES0VZX01PREVfU1RSVUMgY3NyMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5OiAjJWQgXG4iLCBCc3NJbmRleCo0ICsgS2V5SWR4KSk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFKzQqKEJzc0luZGV4LzIpLCAmY3NyMS53b3JkKTsKLQlpZiAoKEJzc0luZGV4JTIpID09IDApCi0JewotCQlpZiAoS2V5SWR4ID09IDApCi0JCQljc3IxLmZpZWxkLkJzczBLZXkwQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDEpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkxQ2lwaGVyQWxnID0gMDsKLQkJZWxzZSBpZiAoS2V5SWR4ID09IDIpCi0JCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gMDsKLQkJZWxzZQotCQkJY3NyMS5maWVsZC5Cc3MwS2V5M0NpcGhlckFsZyA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChLZXlJZHggPT0gMCkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTBDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMSkKLQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSAwOwotCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCWNzcjEuZmllbGQuQnNzMUtleTJDaXBoZXJBbGcgPSAwOwotCQllbHNlCi0JCQljc3IxLmZpZWxkLkJzczFLZXkzQ2lwaGVyQWxnID0gMDsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJXcml0ZTogU0hBUkVEX0tFWV9NT0RFX0JBU0UgYXQgdGhpcyBCc3NbJWRdID0gMHgleCBcbiIsIEJzc0luZGV4LCBjc3IxLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSs0KihCc3NJbmRleC8yKSwgY3NyMS53b3JkKTsKLQlBU1NFUlQoQnNzSW5kZXggPCA0KTsKLQlBU1NFUlQoS2V5SWR4IDwgNCk7Ci0KLX0KLQotCi1WT0lEIEFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVQ0hBUgkJQnNzSW5kZXgsCi0JSU4gVUNIQVIgICAgICAgIENpcGhlckFsZywKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUpCi17Ci0JVUxPTkcgICBXQ0lEQXR0cmkgPSAwLCBvZmZzZXQ7Ci0KLQkvLwotCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KLQkvLyBPbmx5IFR4S2V5IGNvdWxkIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZS4KLQkvLwotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdDSUQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCVdDSURBdHRyaSA9IChCc3NJbmRleCA8PCA0KSB8IChDaXBoZXJBbGcgPDwgMSkgfCAoYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci19Ci0KLVZPSUQgQXNpY1VwZGF0ZVdDSURJVkVJVigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUxPTkcgICAgICAgIHVJViwKLQlJTiBVTE9ORyAgICAgICAgdUVJVikKLXsKLQlVTE9ORwlvZmZzZXQ7Ci0KLQlvZmZzZXQgPSBNQUNfSVZFSVZfVEFCTEVfQkFTRSArIChXQ0lEICogSFdfSVZFSVZfRU5UUllfU0laRSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIHVJVik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgdUVJVik7Ci19Ci0KLVZPSUQgQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyKQotewotCVVMT05HIG9mZnNldDsKLQlVTE9ORyBBZGRyOwotCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQkFTRSArIChXQ0lEICogSFdfV0NJRF9FTlRSWV9TSVpFKTsKLQlBZGRyID0gcEFkZHJbMF0gKyAocEFkZHJbMV0gPDwgOCkgKyhwQWRkclsyXSA8PCAxNikgKyhwQWRkclszXSA8PCAyNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBBZGRyKTsKLQlBZGRyID0gcEFkZHJbNF0gKyAocEFkZHJbNV0gPDwgOCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0ICsgNCwgQWRkcik7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtLCBJVi9FSVYgdG8gQXNpYwotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIFdDSUQgICAgICAgICAgICAgICAgICAgIFdDSUQgRW50cnkgbnVtYmVyLgotICAgICAgICBCc3NJbmRleCAgICAgICAgICAgICAgICBCU1NJRCBpbmRleCwgc3RhdGlvbiBvciBub25lIG11bHRpcGxlIEJTU0lEIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMC4KLSAgICAgICAgS2V5SWR4ICAgICAgICAgICAgICAgICAgVGhpcyBLZXlJZHggd2lsbCBzZXQgdG8gSVYncyBLZXlJRCBpZiBiVHhLZXkgZW5hYmxlZAotICAgICAgICBwQ2lwaGVyS2V5ICAgICAgICAgICAgICBQb2ludGVyIHRvIENpcGhlciBLZXkuCi0gICAgICAgIGJVc2VQYWlyZXdpc2VLZXlUYWJsZSAgIFRSVUUgbWVhbnMgc2F2ZWQgdGhlIGtleSBpbiBTaGFyZWRLZXkgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBQYWlyZXdpc2VLZXkgdGFibGUKLSAgICAgICAgYlR4S2V5ICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgdHJhbnNtaXQga2V5IGlmIGVuYWJsZWQuCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgcm91dGluZSB3aWxsIHNldCB0aGUgcmVsYXRpdmUga2V5IHN0dWZmIHRvIEFzaWMgaW5jbHVkaW5nIFdDSUQgYXR0cmlidXRlLAotICAgICAgICBDaXBoZXIgS2V5LCBDaXBoZXIgYWxnb3JpdGhtIGFuZCBJVi9FSVYuCi0KLSAgICAgICAgSVYvRUlWIHdpbGwgYmUgdXBkYXRlIGlmIHRoaXMgQ2lwaGVyS2V5IGlzIHRoZSB0cmFuc21pc3Npb24ga2V5IGJlY2F1c2UKLSAgICAgICAgQVNJQyB3aWxsIGJhc2Ugb24gSVYncyBLZXlJRCB2YWx1ZSB0byBzZWxlY3QgQ2lwaGVyIEtleS4KLQotICAgICAgICBJZiBiVHhLZXkgc2V0cyB0byBGQUxTRSwgdGhpcyBpcyBub3QgdGhlIFRYIGtleSwgYnV0IGl0IGNvdWxkIGJlCi0gICAgICAgIFJYIGtleQotCi0JRm9yIEFQIG1vZGUgYlR4S2V5IG11c3QgYmUgYWx3YXlzIHNldCB0byBUUlVFLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY0FkZEtleUVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVQ0hBUgkJQnNzSW5kZXgsCi0JSU4gVUNIQVIJCUtleUlkeCwKLQlJTiBQQ0lQSEVSX0tFWQlwQ2lwaGVyS2V5LAotCUlOIEJPT0xFQU4JCWJVc2VQYWlyZXdpc2VLZXlUYWJsZSwKLQlJTiBCT09MRUFOCQliVHhLZXkpCi17Ci0JVUxPTkcJb2Zmc2V0OwotLy8JVUxPTkcgICBXQ0lEQXR0cmkgPSAwOwotCVVDSEFSCUlWNCA9IDA7Ci0JUFVDSEFSCQlwS2V5ID0gcENpcGhlcktleS0+S2V5OwotLy8JVUxPTkcJCUtleUxlbiA9IHBDaXBoZXJLZXktPktleUxlbjsKLQlQVUNIQVIJCXBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOwotCVBVQ0hBUgkJcFJ4TWljID0gcENpcGhlcktleS0+UnhNaWM7Ci0JUFVDSEFSCQlwVHh0c2MgPSBwQ2lwaGVyS2V5LT5UeFRzYzsKLQlVQ0hBUgkJQ2lwaGVyQWxnID0gcENpcGhlcktleS0+Q2lwaGVyQWxnOwotCVNIQVJFREtFWV9NT0RFX1NUUlVDIGNzcjE7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JVUNIQVIJCWk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLS8vCUFTU0VSVChLZXlMZW4gPD0gTUFYX0xFTl9PRl9QRUVSX0tFWSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gQXNpY0FkZEtleUVudHJ5XG4iKSk7Ci0JLy8KLQkvLyAxLikgZGVjaWRlIGtleSB0YWJsZSBvZmZzZXQKLQkvLwotCWlmIChiVXNlUGFpcmV3aXNlS2V5VGFibGUpCi0JCW9mZnNldCA9IFBBSVJXSVNFX0tFWV9UQUJMRV9CQVNFICsgKFdDSUQgKiBIV19LRVlfRU5UUllfU0laRSk7Ci0JZWxzZQotCQlvZmZzZXQgPSBTSEFSRURfS0VZX1RBQkxFX0JBU0UgKyAoNCAqIEJzc0luZGV4ICsgS2V5SWR4KSAqIEhXX0tFWV9FTlRSWV9TSVpFOwotCi0JLy8KLQkvLyAyLikgU2V0IEtleSB0byBBc2ljCi0JLy8KLQkvL2ZvciAoaSA9IDA7IGkgPCBLZXlMZW47IGkrKykKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9QRUVSX0tFWTsgaSsrKQotCXsKLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwS2V5W2ldKTsKLQl9Ci0Jb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7Ci0KLQkvLwotCS8vIDMuKSBTZXQgTUlDIGtleSBpZiBhdmFpbGFibGUKLQkvLwotCWlmIChwVHhNaWMpCi0JewotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBUeE1pY1tpXSk7Ci0JCX0KLQl9Ci0Jb2Zmc2V0ICs9IExFTl9US0lQX1RYTUlDSzsKLQotCWlmIChwUnhNaWMpCi0JewotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBSeE1pY1tpXSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCS8vCi0JLy8gNC4pIE1vZGlmeSBJVi9FSVYgaWYgbmVlZHMKLQkvLyAgICAgVGhpcyB3aWxsIGZvcmNlIEFzaWMgdG8gdXNlIHRoaXMga2V5IElEIGJ5IHNldHRpbmcgSVYuCi0JLy8KLQlpZiAoYlR4S2V5KQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCQkvLwotCQkvLyBXcml0ZSBJVgotCQkvLwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCwgcFR4dHNjWzFdKTsKLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAxLCAoKHBUeHRzY1sxXSB8IDB4MjApICYgMHg3ZikpOwotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIDIsIHBUeHRzY1swXSk7Ci0KLQkJSVY0ID0gKEtleUlkeCA8PCA2KTsKLQkJaWYgKChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVBfTk9fTUlDKSB8fChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCi0JCQlJVjQgfD0gMHgyMDsgIC8vIHR1cm4gb24gZXh0ZW5zaW9uIGJpdCBtZWFucyBFSVYgZXhpc3RlbmNlCi0KLQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyAzLCBJVjQpOwotCi0JCS8vCi0JCS8vIFdyaXRlIEVJVgotCQkvLwotCQlvZmZzZXQgKz0gNDsKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQgKyBpLCBwVHh0c2NbaSArIDJdKTsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCUFzaWNVcGRhdGVXQ0lEQXR0cmlidXRlKHBBZCwgV0NJRCwgQnNzSW5kZXgsIENpcGhlckFsZywgYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKLQl9Ci0KLQlpZiAoIWJVc2VQYWlyZXdpc2VLZXlUYWJsZSkKLQl7Ci0JCS8vCi0JCS8vIE9ubHkgdXBkYXRlIHRoZSBzaGFyZWQga2V5IHNlY3VyaXR5IG1vZGUKLQkJLy8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBTSEFSRURfS0VZX01PREVfQkFTRSArIDQgKiAoQnNzSW5kZXggLyAyKSwgJmNzcjEud29yZCk7Ci0JCWlmICgoQnNzSW5kZXggJSAyKSA9PSAwKQotCQl7Ci0JCQlpZiAoS2V5SWR4ID09IDApCi0JCQkJY3NyMS5maWVsZC5Cc3MwS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCQljc3IxLmZpZWxkLkJzczBLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZQotCQkJCWNzcjEuZmllbGQuQnNzMEtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoS2V5SWR4ID09IDApCi0JCQkJY3NyMS5maWVsZC5Cc3MxS2V5MENpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCWVsc2UgaWYgKEtleUlkeCA9PSAxKQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTFDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCQllbHNlIGlmIChLZXlJZHggPT0gMikKLQkJCQljc3IxLmZpZWxkLkJzczFLZXkyQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCQkJZWxzZQotCQkJCWNzcjEuZmllbGQuQnNzMUtleTNDaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0JCX0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgU0hBUkVEX0tFWV9NT0RFX0JBU0UgKyA0ICogKEJzc0luZGV4IC8gMiksIGNzcjEud29yZCk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IEFzaWNBZGRLZXlFbnRyeVxuIikpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUFkZCBQYWlyLXdpc2Uga2V5IG1hdGVyaWFsIGludG8gQVNJQy4KLQkJVXBkYXRlIHBhaXJ3aXNlIGtleSwgVHhNaWMgYW5kIFJ4TWljIHRvIEFzaWMgUGFpci13aXNlIGtleSB0YWJsZQotCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkciwKLQlJTiBVQ0hBUgkJV0NJRCwKLQlJTiBDSVBIRVJfS0VZCQkgKnBDaXBoZXJLZXkpCi17Ci0JSU5UIGk7Ci0JVUxPTkcJCW9mZnNldDsKLQlQVUNIQVIJCSBwS2V5ID0gcENpcGhlcktleS0+S2V5OwotCVBVQ0hBUgkJIHBUeE1pYyA9IHBDaXBoZXJLZXktPlR4TWljOwotCVBVQ0hBUgkJIHBSeE1pYyA9IHBDaXBoZXJLZXktPlJ4TWljOwotI2lmZGVmIERCRwotCVVDSEFSCQlDaXBoZXJBbGcgPSBwQ2lwaGVyS2V5LT5DaXBoZXJBbGc7Ci0jZW5kaWYgLy8gREJHIC8vCi0KLQkvLyBFS0VZCi0Jb2Zmc2V0ID0gUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgKyAoV0NJRCAqIEhXX0tFWV9FTlRSWV9TSVpFKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1BFRVJfS0VZOyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCArIGksIHBLZXlbaV0pOwotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1BFRVJfS0VZOyBpKz00KQotCXsKLQkJVUlOVDMyIFZhbHVlOwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIG9mZnNldCArIGksICZWYWx1ZSk7Ci0JfQotCi0Jb2Zmc2V0ICs9IE1BWF9MRU5fT0ZfUEVFUl9LRVk7Ci0KLQkvLyAgTUlDIEtFWQotCWlmIChwVHhNaWMpCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgb2Zmc2V0K2ksIHBUeE1pY1tpXSk7Ci0JCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl9Ci0Jb2Zmc2V0ICs9IDg7Ci0JaWYgKHBSeE1pYykKLQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJewotCQkJUlRNUF9JT19XUklURTgocEFkLCBvZmZzZXQraSwgcFJ4TWljW2ldKTsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnk6IFdDSUQgIyVkIEFsZz0lc1xuIixXQ0lELCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIglLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwS2V5WzBdLHBLZXlbMV0scEtleVsyXSxwS2V5WzNdLHBLZXlbNF0scEtleVs1XSxwS2V5WzZdLHBLZXlbN10scEtleVs4XSxwS2V5WzldLHBLZXlbMTBdLHBLZXlbMTFdLHBLZXlbMTJdLHBLZXlbMTNdLHBLZXlbMTRdLHBLZXlbMTVdKSk7Ci0JaWYgKHBSeE1pYykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIglSeCBNSUMgS2V5ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJcFJ4TWljWzBdLHBSeE1pY1sxXSxwUnhNaWNbMl0scFJ4TWljWzNdLHBSeE1pY1s0XSxwUnhNaWNbNV0scFJ4TWljWzZdLHBSeE1pY1s3XSkpOwotCX0KLQlpZiAocFR4TWljKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCVR4IE1JQyBLZXkgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwVHhNaWNbMF0scFR4TWljWzFdLHBUeE1pY1syXSxwVHhNaWNbM10scFR4TWljWzRdLHBUeE1pY1s1XSxwVHhNaWNbNl0scFR4TWljWzddKSk7Ci0JfQotfQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUmVtb3ZlIFBhaXItd2lzZSBrZXkgbWF0ZXJpYWwgZnJvbSBBU0lDLgotCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBCc3NJZHgsCi0JSU4gVUNIQVIJCSBXY2lkKQotewotCVVMT05HCQlXQ0lEQXR0cmk7Ci0JVVNIT1JUCQlvZmZzZXQ7Ci0KLQkvLyByZS1zZXQgdGhlIGVudHJ5J3MgV0NJRCBhdHRyaWJ1dGUgYXMgT1BFTi1OT05FLgotCW9mZnNldCA9IE1BQ19XQ0lEX0FUVFJJQlVURV9CQVNFICsgKFdjaWQgKiBIV19XQ0lEX0FUVFJJX1NJWkUpOwotCVdDSURBdHRyaSA9IChCc3NJZHg8PDQpIHwgUEFJUldJU0VLRVlUQUJMRTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBvZmZzZXQsIFdDSURBdHRyaSk7Ci19Ci0KLUJPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kLAotCUlOIFVDSEFSCQkgVG9rZW4sCi0JSU4gVUNIQVIJCSBBcmcwLAotCUlOIFVDSEFSCQkgQXJnMSkKLXsKLQotCi0JaWYgKHBBZC0+Y2hpcE9wcy5zZW5kQ29tbWFuZFRvTWN1KQotCQlwQWQtPmNoaXBPcHMuc2VuZENvbW1hbmRUb01jdShwQWQsIENvbW1hbmQsIFRva2VuLCBBcmcwLCBBcmcxKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLVZPSUQgQXNpY1NldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KQotewotI2lmZGVmIFJUMzN4eAotCVJUMzN4eFNldFJ4QW50KHBBZCwgQW50KTsKLSNlbHNlCi0jaWZkZWYgUlQzMHh4Ci0JLyogUlQzNTcyIEFURSBuZWVkIG5vdCB0byBkbyB0aGlzLiAqLwotCVJUMzB4eFNldFJ4QW50KHBBZCwgQW50KTsKLSNlbmRpZiAvLyBSVDMweHggLy8KLSNlbmRpZiAvLyBSVDMzeHggLy8KLX0KLQotCi1WT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUNIQVIJCUNoYW5uZWwpCi17Ci0JaWYgKHBBZC0+Y2hpcE9wcy5Bc2ljUmZUdXJuT2ZmKQotCXsKLQkJcEFkLT5jaGlwT3BzLkFzaWNSZlR1cm5PZmYocEFkKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gUkYgUjIgYml0IDE4ID0gMAotCQlVSU5UMzIJCQlSMSA9IDAsIFIyID0gMCwgUjMgPSAwOwotCQlVQ0hBUgkJCWluZGV4OwotCQlSVE1QX1JGX1JFR1MJKlJGUmVnVGFibGU7Ci0KLQkJUkZSZWdUYWJsZSA9IFJGMjg1MFJlZ1RhYmxlOwotCi0JCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQkJewotCQkJY2FzZSBSRklDXzI4MjA6Ci0JCQljYXNlIFJGSUNfMjg1MDoKLQkJCWNhc2UgUkZJQ18yNzIwOgotCQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJCXsKLQkJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQkJewotCQkJCQkJUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMSAmIDB4ZmZmZmRmZmY7Ci0JCQkJCQlSMiA9IFJGUmVnVGFibGVbaW5kZXhdLlIyICYgMHhmZmZiZmZmZjsKLQkJCQkJCVIzID0gUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZjNmZmZmOwotCi0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7Ci0JCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMik7Ci0KLQkJCQkJCS8vIFByb2dyYW0gUjFiMTMgdG8gMSwgUjMvYjE4LDE5IHRvIDAsIFIyYjE4IHRvIDAuCi0JCQkJCQkvLyBTZXQgUkYgUjIgYml0MTg9MCwgUjMgYml0WzE4OjE5XT0wCi0JCQkJCQkvL2lmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0JCQkJCQlpZiAoMSkKLQkJCQkJCXsKLQkJCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7Ci0KLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4LCAgUjMgPSAweCUwOHggXG4iLAotCQkJCQkJCQlDaGFubmVsLCBwQWQtPlJmSWNUeXBlLCBSMiwgUjMpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljVHVybk9mZlJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4IFxuIiwKLQkJCQkJCQkJQ2hhbm5lbCwgcEFkLT5SZkljVHlwZSwgUjIpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0KLVZPSUQgQXNpY1R1cm5PblJGQ2xrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVDSEFSCQkJQ2hhbm5lbCkKLXsKLQkvLyBSRiBSMiBiaXQgMTggPSAwCi0JVUlOVDMyCQkJUjEgPSAwLCBSMiA9IDAsIFIzID0gMDsKLQlVQ0hBUgkJCWluZGV4OwotCVJUTVBfUkZfUkVHUwkqUkZSZWdUYWJsZTsKLQotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotCS8vIFRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eAotCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKQotCXsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQotCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCXN3aXRjaCAocEFkLT5SZkljVHlwZSkKLQl7Ci0JCWNhc2UgUkZJQ18yODIwOgotCQljYXNlIFJGSUNfMjg1MDoKLQkJY2FzZSBSRklDXzI3MjA6Ci0JCWNhc2UgUkZJQ18yNzUwOgotCi0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJewotCQkJCWlmIChDaGFubmVsID09IFJGUmVnVGFibGVbaW5kZXhdLkNoYW5uZWwpCi0JCQkJewotCQkJCQlSMyA9IHBBZC0+TGF0Y2hSZlJlZ3MuUjM7Ci0JCQkJCVIzICY9IDB4ZmZmM2ZmZmY7Ci0JCQkJCVIzIHw9IDB4MDAwODAwMDA7Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIzKTsKLQotCQkJCQlSMSA9IFJGUmVnVGFibGVbaW5kZXhdLlIxOwotCQkJCQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMSk7Ci0KLQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKLQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJewotCQkJCQkJUjIgfD0gMHg0MDAwOwkvLyBJZiBUWHBhdGggaXMgMSwgYml0IDE0ID0gMTsKLQkJCQkJfQotCi0JCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4NDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4cGF0aC4KLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCQkJCXsKLQkJCQkJCVIyIHw9IDB4MjAwNDA7CS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAotCQkJCQl9Ci0JCQkJCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1R1cm5PblJGQ2xrIyVkKFJGPSVkLCApICwgUjI9MHglMDh4XG4iLAotCQlDaGFubmVsLAotCQlwQWQtPlJmSWNUeXBlLAotCQlSMikpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2NmZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGJlOTc5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9jZmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCWNtbV9jZmcuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgUmFsaW5rIFdpRmkgRHJpdmVyIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBzdWJyb3V0aW5lcwotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLWNoYXIqIEdldFBoeU1vZGUoCi0JaW50IE1vZGUpCi17Ci0Jc3dpdGNoKE1vZGUpCi0JewotCQljYXNlIE1PREVfQ0NLOgotCQkJcmV0dXJuICJDQ0siOwotCi0JCWNhc2UgTU9ERV9PRkRNOgotCQkJcmV0dXJuICJPRkRNIjsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBNT0RFX0hUTUlYOgotCQkJcmV0dXJuICJIVE1JWCI7Ci0KLQkJY2FzZSBNT0RFX0hUR1JFRU5GSUVMRDoKLQkJCXJldHVybiAiR1JFRU4iOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJOL0EiOwotCX0KLX0KLQotCi1jaGFyKiBHZXRCVygKLQlpbnQgQlcpCi17Ci0Jc3dpdGNoKEJXKQotCXsKLQkJY2FzZSBCV18xMDoKLQkJCXJldHVybiAiMTBNIjsKLQotCQljYXNlIEJXXzIwOgotCQkJcmV0dXJuICIyME0iOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIEJXXzQwOgotCQkJcmV0dXJuICI0ME0iOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJOL0EiOwotCX0KLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbiB0byBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLgotICAgICAgICBUaGlzIGNvbW1hbmQgd2lsbCBub3Qgd29yaywgaWYgdGhlIGZpZWxkIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQuCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBTVFJJTkcJCQlhcmcsCi0JSU4gSU5UCQkJCWJhbmQpCi17Ci0JTE9ORyByZWdpb24sIHJlZ2lvbk1heDsKLQlVQ0hBUiAqcENvdW50cnlSZWdpb247Ci0KLQlyZWdpb24gPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGJhbmQgPT0gQkFORF8yNEcpCi0JewotCQlwQ291bnRyeVJlZ2lvbiA9ICZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uOwotCQlyZWdpb25NYXggPSBSRUdJT05fTUFYSU1VTV9CR19CQU5EOwotCX0KLQllbHNlCi0JewotCQlwQ291bnRyeVJlZ2lvbiA9ICZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQ7Ci0JCXJlZ2lvbk1heCA9IFJFR0lPTl9NQVhJTVVNX0FfQkFORDsKLQl9Ci0KLQkvLyBUT0RPOiBJcyBpdCBuZWNjZXNheSBmb3IgZm9sbG93aW5nIGNoZWNrPz8/Ci0JLy8gQ291bnRyeSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBFRVBST00gbm90IHByb2dyYW1tZWQKLQlpZiAoKnBDb3VudHJ5UmVnaW9uICYgMHg4MCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNmZ1NldENvdW50cnlSZWdpb24oKTpDb3VudHJ5UmVnaW9uIGluIGVlcHJvbSB3YXMgcHJvZ3JhbW1lZFxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYoKHJlZ2lvbiA+PSAwKSAmJiAocmVnaW9uIDw9IFJFR0lPTl9NQVhJTVVNX0JHX0JBTkQpKQotCXsKLQkJKnBDb3VudHJ5UmVnaW9uPSAoVUNIQVIpIHJlZ2lvbjsKLQl9Ci0JZWxzZSBpZiAoKHJlZ2lvbiA9PSBSRUdJT05fMzFfQkdfQkFORCkgJiYgKGJhbmQgPT0gQkFORF8yNEcpKQotCXsKLQkJKnBDb3VudHJ5UmVnaW9uID0gKFVDSEFSKSByZWdpb247Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNmZ1NldENvdW50cnlSZWdpb24oKTpyZWdpb24oJWxkKSBvdXQgb2YgcmFuZ2UhXG4iLCByZWdpb24pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotCi19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV2lyZWxlc3MgTW9kZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJUX0NmZ1NldFdpcmVsZXNzTW9kZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUlOVAkJTWF4UGh5TW9kZSA9IFBIWV8xMUc7Ci0JTE9ORwlXaXJlbGVzc01vZGU7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCVdpcmVsZXNzTW9kZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFdpcmVsZXNzTW9kZSA8PSBNYXhQaHlNb2RlKQotCXsKLQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFdpcmVsZXNzTW9kZTsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZFBoeU1vZGUgPSBXaXJlbGVzc01vZGU7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi0KLUlOVCBSVF9DZmdTZXRTaG9ydFNsb3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlMT05HIFNob3J0U2xvdDsKLQotCVNob3J0U2xvdCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoU2hvcnRTbG90ID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gVFJVRTsKLQllbHNlIGlmIChTaG9ydFNsb3QgPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYlVzZVNob3J0U2xvdFRpbWUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWSBiYXNlIG9uIEtleUlkeAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVJUX0NmZ1NldFdlcEtleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJa2V5U3RyaW5nLAotCUlOCUNJUEhFUl9LRVkJCSpwU2hhcmVkS2V5LAotCUlOCUlOVAkJCQlrZXlJZHgpCi17Ci0JSU5UCQkJCUtleUxlbjsKLQlJTlQJCQkJaTsKLQlVQ0hBUgkJCUNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCUJPT0xFQU4JCQliS2V5SXNIZXggPSBGQUxTRTsKLQotCS8vIFRPRE86IFNoYWxsIHdlIGRvIG1lbXNldCBmb3IgdGhlIG9yaWdpbmFsIGtleSBpbmZvPz8KLQltZW1zZXQocFNoYXJlZEtleSwgMCwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQlLZXlMZW4gPSBzdHJsZW4oa2V5U3RyaW5nKTsKLQlzd2l0Y2ggKEtleUxlbikKLQl7Ci0JCWNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotCQljYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotCQkJYktleUlzSGV4ID0gRkFMU0U7Ci0JCQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBLZXlMZW47Ci0JCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5LZXksIGtleVN0cmluZywgS2V5TGVuKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0JCWNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotCQkJZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotCQkJewotCQkJCWlmKCAhaXN4ZGlnaXQoKihrZXlTdHJpbmcraSkpICkKLQkJCQkJcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotCQkJfQotCQkJYktleUlzSGV4ID0gVFJVRTsKLQkJCXBTaGFyZWRLZXktPktleUxlbiA9IEtleUxlbi8yIDsKLQkJCUF0b0goa2V5U3RyaW5nLCBwU2hhcmVkS2V5LT5LZXksIHBTaGFyZWRLZXktPktleUxlbik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX0NmZ1NldFdlcEtleShrZXlJZHg9JWQpOkludmFsaWQgYXJndW1lbnQgKGFyZz0lcylcbiIsIGtleUlkeCwga2V5U3RyaW5nKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gKChLZXlMZW4gJSA1KSA/IENJUEhFUl9XRVAxMjggOiBDSVBIRVJfV0VQNjQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX0NmZ1NldFdlcEtleTooS2V5SWR4PSVkLHR5cGU9JXMsIEFsZz0lcylcbiIsCi0JCQkJCQlrZXlJZHgsIChiS2V5SXNIZXggPT0gRkFMU0UgPyAiQXNjaWkiIDogIkhleCIpLCBDaXBoZXJOYW1lW0NpcGhlckFsZ10pKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdQQSBQU0sga2V5Ci0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZGFwdGVyCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgICAga2V5U3RyaW5nCVdQQSBwcmUtc2hhcmVkIGtleSBzdHJpbmcKLSAgICAgICAgcEhhc2hTdHIJU3RyaW5nIHVzZWQgZm9yIHBhc3N3b3JkIGhhc2ggZnVuY3Rpb24KLSAgICAgICAgaGFzaFN0ckxlbglMZW5naHQgb2YgdGhlIGhhc2ggc3RyaW5nCi0gICAgICAgIHBQTUtCdWYJCU91dHB1dCBidWZmZXIgb2YgV1BBUFNLIGtleQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRfQ2ZnU2V0V1BBUFNLS2V5KAotCUlOIFJUTVBfQURBUFRFUgkqcEFkLAotCUlOIFBTVFJJTkcJCWtleVN0cmluZywKLQlJTiBVQ0hBUgkJKnBIYXNoU3RyLAotCUlOIElOVAkJCWhhc2hTdHJMZW4sCi0JT1VUIFBVQ0hBUgkJcFBNS0J1ZikKLXsKLQlpbnQga2V5TGVuOwotCVVDSEFSIGtleU1hdGVyaWFsWzQwXTsKLQotCWtleUxlbiA9IHN0cmxlbihrZXlTdHJpbmcpOwotCWlmICgoa2V5TGVuIDwgOCkgfHwgKGtleUxlbiA+IDY0KSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldQQVBTSyBLZXkgbGVuZ3RoKCVkKSBlcnJvciwgcmVxdWlyZWQgOCB+IDY0IGNoYXJhY3RlcnMhKGtleVN0cj0lcylcbiIsCi0JCQkJCQkJCQlrZXlMZW4sIGtleVN0cmluZykpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JbWVtc2V0KHBQTUtCdWYsIDAsIDMyKTsKLQlpZiAoa2V5TGVuID09IDY0KQotCXsKLQkgICAgQXRvSChrZXlTdHJpbmcsIHBQTUtCdWYsIDMyKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgUGFzc3dvcmRIYXNoKGtleVN0cmluZywgcEhhc2hTdHIsIGhhc2hTdHJMZW4sIGtleU1hdGVyaWFsKTsKLQkgICAgTmRpc01vdmVNZW1vcnkocFBNS0J1Ziwga2V5TWF0ZXJpYWwsIDMyKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQwMDcxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0JY21tX2RhdGEuYwotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVDSEFSCVNOQVBfODAyXzFIW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07Ci1VQ0hBUglTTkFQX0JSSURHRV9UVU5ORUxbXSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4fTsKLS8vIEFkZCBDaXNjbyBBaXJvbmV0IFNOQVAgaGVhZGUgZm9yIENDWDIgc3VwcG9ydAotVUNIQVIJU05BUF9BSVJPTkVUW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMH07Ci1VQ0hBUglDS0lQX0xMQ19TTkFQW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMCwgMHgwMn07Ci1VQ0hBUglFQVBPTF9MTENfU05BUFtdPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4ZX07Ci1VQ0hBUglFQVBPTFtdID0gezB4ODgsIDB4OGV9OwotVUNIQVIgICBUUElEW10gPSB7MHg4MSwgMHgwMH07IC8qIFZMQU4gcmVsYXRlZCAqLwotCi1VQ0hBUglJUFhbXSA9IHsweDgxLCAweDM3fTsKLVVDSEFSCUFQUExFX1RBTEtbXSA9IHsweDgwLCAweGYzfTsKLVVDSEFSCVJhdGVJZFRvUGxjcFNpZ25hbFsxMl0gPSB7Ci0JIDAsIC8qIFJBVEVfMSAqLwkxLCAvKiBSQVRFXzIgKi8JCTIsIC8qIFJBVEVfNV81ICovCTMsIC8qIFJBVEVfMTEgKi8JLy8gc2VlIEJCUCBzcGVjCi0JMTEsIC8qIFJBVEVfNiAqLyAgIDE1LCAvKiBSQVRFXzkgKi8gICAgMTAsIC8qIFJBVEVfMTIgKi8gICAxNCwgLyogUkFURV8xOCAqLwkvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0Ci0JIDksIC8qIFJBVEVfMjQgKi8gIDEzLCAvKiBSQVRFXzM2ICovCTgsIC8qIFJBVEVfNDggKi8gICAxMiAgLyogUkFURV81NCAqLyB9OyAvLyBzZWUgSUVFRTgwMi4xMWEtMTk5OSBwLjE0Ci0KLVVDSEFSCSBPZmRtU2lnbmFsVG9SYXRlSWRbMTZdID0gewotCVJBVEVfNTQsICBSQVRFXzU0LAlSQVRFXzU0LCAgUkFURV81NCwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDAsICAxLCAgMiwgIDMgcmVzcGVjdGl2ZWx5Ci0JUkFURV81NCwgIFJBVEVfNTQsCVJBVEVfNTQsICBSQVRFXzU0LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gNCwgIDUsICA2LCAgNyByZXNwZWN0aXZlbHkKLQlSQVRFXzQ4LCAgUkFURV8yNCwJUkFURV8xMiwgIFJBVEVfNiwJLy8gT0ZETSBQTENQIFNpZ25hbCA9IDgsICA5LCAgMTAsIDExIHJlc3BlY3RpdmVseQotCVJBVEVfNTQsICBSQVRFXzM2LAlSQVRFXzE4LCAgUkFURV85LAkvLyBPRkRNIFBMQ1AgU2lnbmFsID0gMTIsIDEzLCAxNCwgMTUgcmVzcGVjdGl2ZWx5Ci19OwotCi1VQ0hBUgkgT2ZkbVJhdGVUb1J4d2lNQ1NbMTJdID0gewotCTAsICAwLAkwLCAgMCwKLQkwLCAgMSwJMiwgIDMsCS8vIE9GRE0gcmF0ZSA2LDksMTIsMTggPSByeHdpIG1jcyAwLDEsMiwzCi0JNCwgIDUsCTYsICA3LAkvLyBPRkRNIHJhdGUgMjQsMzYsNDgsNTQgPSByeHdpIG1jcyA0LDUsNiw3Ci19OwotVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXSA9IHsKLQlSQVRFXzYsICBSQVRFXzksCVJBVEVfMTIsICBSQVRFXzE4LAotCVJBVEVfMjQsICBSQVRFXzM2LAlSQVRFXzQ4LCAgUkFURV81NCwJLy8gT0ZETSByYXRlIDYsOSwxMiwxOCA9IHJ4d2kgbWNzIDAsMSwyLDMKLQk0LCAgNSwJNiwgIDcsCS8vIE9GRE0gcmF0ZSAyNCwzNiw0OCw1NCA9IHJ4d2kgbWNzIDQsNSw2LDcKLX07Ci0KLWNoYXIqICAgTUNTVG9NYnBzW10gPSB7IjFNYnBzIiwiMk1icHMiLCI1LjVNYnBzIiwiMTFNYnBzIiwiMDZNYnBzIiwiMDlNYnBzIiwiMTJNYnBzIiwiMThNYnBzIiwiMjRNYnBzIiwiMzZNYnBzIiwiNDhNYnBzIiwiNTRNYnBzIiwiTU0tMCIsIk1NLTEiLCJNTS0yIiwiTU0tMyIsIk1NLTQiLCJNTS01IiwiTU0tNiIsIk1NLTciLCJNTS04IiwiTU0tOSIsIk1NLTEwIiwiTU0tMTEiLCJNTS0xMiIsIk1NLTEzIiwiTU0tMTQiLCJNTS0xNSIsIk1NLTMyIiwiZWUxIiwiZWUyIiwiZWUzIn07Ci0KLVVDSEFSIGRlZmF1bHRfY3dtaW5bXT17Q1dfTUlOX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUy0xLCBDV19NSU5fSU5fQklUUy0yfTsKLS8vVUNIQVIgZGVmYXVsdF9jd21heFtdPXtDV19NQVhfSU5fQklUUywgQ1dfTUFYX0lOX0JJVFMsIENXX01JTl9JTl9CSVRTLCBDV19NSU5fSU5fQklUUy0xfTsKLVVDSEFSIGRlZmF1bHRfc3RhX2FpZnNuW109ezMsNywyLDJ9OwotCi1VQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdID0ge1FJRF9BQ19CRSwgUUlEX0FDX0JLLCBRSURfQUNfQkssIFFJRF9BQ19CRSwgUUlEX0FDX1ZJLCBRSURfQUNfVkksIFFJRF9BQ19WTywgUUlEX0FDX1ZPfTsKLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQVBJIGZvciBNTE1FIHRvIHRyYW5zbWl0IG1hbmFnZW1lbnQgZnJhbWUgdG8gQVAgKEJTUyBNb2RlKQotCW9yIHN0YXRpb24gKElCU1MgTW9kZSkKLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcERhdGEJCVBvaW50ZXIgdG8gdGhlIG91dGdvaW5nIDgwMi4xMSBmcmFtZQotCQlMZW5ndGgJCVNpemUgb2Ygb3V0Z29pbmcgbWFuYWdlbWVudCBmcmFtZQotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19GQUlMVVJFCi0JCU5ESVNfU1RBVFVTX1BFTkRJTkcKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVSU5UCQkJTGVuZ3RoKQotewotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCU5ESVNfU1RBVFVTCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUxPTkcJCQlGcmVlTnVtOwotCVVDSEFSCQkJcnRtcEh3SGRyW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsgLy9SVE1QX0hXX0hEUl9MRU5dOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXVuc2lnbmVkIGxvbmcJSXJxRmxhZ3MgPSAwOwotCVVDSEFSCQkJSXJxU3RhdGU7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JQk9PTEVBTgkJCWJVc2VEYXRhUSA9IEZBTFNFOwotCWludAkJCXJldHJ5Q250ID0gMDsKLQotCUFTU0VSVChMZW5ndGggPD0gTUdNVF9ETUFfQlVGRkVSX1NJWkUpOwotCi0JaWYgKChRdWVJZHggJiBNR01UX1VTRV9RVUVVRV9GTEFHKSA9PSBNR01UX1VTRV9RVUVVRV9GTEFHKQotCXsKLQkJYlVzZURhdGFRID0gVFJVRTsKLQkJUXVlSWR4ICY9ICh+TUdNVF9VU0VfUVVFVUVfRkxBRyk7Ci0JfQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JLy8gMjg2MEMgdXNlIFR4IFJpbmcKLQlJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOwotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQl7Ci0JCVF1ZUlkeCA9IChiVXNlRGF0YVEgPT1UUlVFID8gUXVlSWR4IDogMyk7Ci0JCWJVc2VEYXRhUSA9IFRSVUU7Ci0JfQotCWlmIChiVXNlRGF0YVEgJiYgKCFJcnFTdGF0ZSkpCi0JCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCWRvCi0JewotCQkvLyBSZXNldCBpcyBpbiBwcm9ncmVzcywgc3RvcCBpbW1lZGlhdGVseQotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKXx8Ci0JCQkgIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JCXsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIENoZWNrIEZyZWUgcHJpb3JpdHkgcXVldWUKLQkJLy8gU2luY2Ugd2UgdXNlIFBCRiBRdWV1ZTIgZm9yIG1hbmFnZW1lbnQgZnJhbWUuICBJdHMgY29ycmVzcG9uZGluZyBETUEgcmluZyBzaG91bGQgYmUgdXNpbmcgVHhSaW5nLgotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlpZiAoYlVzZURhdGFRKQotCQl7Ci0JCQlyZXRyeUNudCA9IE1BWF9EQVRBTU1fUkVUUlk7Ci0JCQkvLyBmcmVlIFR4KFF1ZUlkeCkgcmVzb3VyY2VzCi0JCQlSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRdWVJZHgpOwotCQkJRnJlZU51bSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCXsKLQkJCUZyZWVOdW0gPSBHRVRfTUdNVFJJTkdfRlJFRU5PKHBBZCk7Ci0JCX0KLQotCQlpZiAoKEZyZWVOdW0gPiAwKSkKLQkJewotCQkJLy8gV2UgbmVlZCB0byByZXNlcnZlIHNwYWNlIGZvciBydG1wIGhhcmR3YXJlIGhlYWRlci4gaS5lLiwgVHhXSSBmb3IgUlQyODYwIGFuZCBUeEluZm8rVHhXSSBmb3IgUlQyODcwCi0JCQlOZGlzWmVyb01lbW9yeSgmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpKTsKLQkJCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgKFBVQ0hBUikmcnRtcEh3SGRyLCAoVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBwRGF0YSwgTGVuZ3RoKTsKLQkJCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIk1pbmlwb3J0TU1SZXF1ZXN0IChlcnJvcjo6IGNhbid0IGFsbG9jYXRlIE5ESVMgUEFDS0VUKVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV8yOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCWlmIChiVXNlRGF0YVEpCi0JCQl7Ci0JCQkJU3RhdHVzID0gTWxtZURhdGFIYXJkVHJhbnNtaXQocEFkLCBRdWVJZHgsIHBQYWNrZXQpOwotCQkJCXJldHJ5Q250LS07Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJU3RhdHVzID0gTWxtZUhhcmRUcmFuc21pdChwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0JCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJcmV0cnlDbnQgPSAwOwotCQkJZWxzZQotCQkJCVJUTVBGcmVlTmRpc1BhY2tldChwQWQsIHBQYWNrZXQpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCsrOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJaWYgKGJVc2VEYXRhUSkKLQkJCXsKLQkJCQlyZXRyeUNudC0tOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJldHJ5Q250ICVkXG4iLCByZXRyeUNudCkpOwotCQkJCWlmIChyZXRyeUNudCA9PSAwKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUWlkeCglZCksIG5vdCBlbm91Z2ggc3BhY2UgaW4gRGF0YVJpbmcsIE1nbXRSaW5nRnVsbENvdW50PSVsZCFcbiIsCi0JCQkJCQkJCQkJCVF1ZUlkeCwgcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCkpOwotCQkJCX0KLQkJCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlFpZHgoJWQpLCBub3QgZW5vdWdoIHNwYWNlIGluIE1nbXRSaW5nLCBNZ210UmluZ0Z1bGxDb3VudD0lbGQhXG4iLAotCQkJCQkJCQkJCVF1ZUlkeCwgcEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCkpOwotCi0KLQotCQl9Ci0JfSB3aGlsZSAocmV0cnlDbnQgPiAwKTsKLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JaWYgKGJVc2VEYXRhUSAmJiAoIUlycVN0YXRlKSkKLQkJUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0Ci0JYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBCdWZmZXIJCVBvaW50ZXIgdG8JbWVtb3J5IG9mIG91dGdvaW5nIGZyYW1lCi0JCUxlbmd0aAkJU2l6ZSBvZiBvdXRnb2luZyBtYW5hZ2VtZW50IGZyYW1lCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQkJTkRJU19TVEFUVVNfUEVORElORwotCQlORElTX1NUQVRVU19TVUNDRVNTCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlRdWVJZHgsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JUEFDS0VUX0lORk8JUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKLQotCWlmICgocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0JCSkKLQl7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQlpZiAocFNyY0J1ZlZBID09IE5VTEwpCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCi0JcEhlYWRlcl84MDJfMTEgPSAoUEhFQURFUl84MDJfMTEpIChwU3JjQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSk7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCWlmICggcEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDAgKQotCQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOwotCWVsc2UKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJcmV0dXJuIE1sbWVIYXJkVHJhbnNtaXRNZ210UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOwotCi19Ci0KLQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdE1nbXRSaW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCVF1ZUlkeCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOwotCUJPT0xFQU4JCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7Ci0JVUNIQVIJCQlNbG1lUmF0ZTsKLQlQVFhXSV9TVFJVQwlwRmlyc3RUeFdJOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKLQlVQ0hBUgkJCVBJRDsKLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQotCS8vIE1ha2Ugc3VyZSBNR01UIHJpbmcgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOwotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQl7Ci0JCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKLQkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NZ210UmluZ0xvY2spOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0Ci0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcEZpcnN0VHhXSSA9IChQVFhXSV9TVFJVQykocFNyY0J1ZlZBICsgIFRYSU5GT19TSVpFKTsKLQlwSGVhZGVyXzgwMl8xMSA9IChQSEVBREVSXzgwMl8xMSkgKHBTcmNCdWZWQSArIFRYSU5GT19TSVpFICsgVFhXSV9TSVpFKTsgLy9UWFdJX1NJWkUpOwotCi0JaWYgKHBIZWFkZXJfODAyXzExLT5BZGRyMVswXSAmIDB4MDEpCi0JewotCQlNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7Ci0JfQotCWVsc2UKLQl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0JfQotCi0JLy8gVmVyaWZ5IE1sbWUgcmF0ZSBmb3IgYSAvIGcgYmFuZHMuCi0JaWYgKChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPiAxNCkgJiYgKE1sbWVSYXRlIDwgUkFURV82KSkgLy8gMTFBIGJhbmQKLQkJTWxtZVJhdGUgPSBSQVRFXzY7Ci0KLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCi0JCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKLQl7Ci0JCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gRml4ZWQgVzUyIHdpdGggQWN0aXZpdHkgc2NhbiBpc3N1ZSBpbiBBQkdfTUlYRUQgYW5kIEFCR05fTUlYRUQgbW9kZS4KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHX01JWEVECi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQl8fCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR05fTUlYRUQKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJKQotCQl7Ci0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gMDsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vCi0JLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKLQkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAotCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgotCS8vCi0JcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfQUNUSVZFOyAvLyAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vCi0JLy8gSW4gV01NLVVBUFNELCBtbG1lIGZyYW1lIHNob3VsZCBiZSBzZXQgcHNtIGFzIHBvd2VyIHNhdmluZyBidXQgcHJvYmUgcmVxdWVzdCBmcmFtZQotCS8vIERhdGEtTnVsbCBwYWNrZXRzIGFsc2UgcGFzcyB0aHJvdWdoIE1NUmVxdWVzdCBpbiBSVDI4NjAsIGhvd2V2ZXIsIHdlIGhvcGUgY29udHJvbCB0aGUgcHNtIGJpdCB0byBwYXNzIEFQU0QKLS8vCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgIT0gQlRZUEVfREFUQSkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlICE9IEJUWVBFX0NOVEwpKQotCXsKLQkJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0FDVElPTikgfHwKLQkJCSgocEhlYWRlcl84MDJfMTEtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkgJiYKLQkJCSgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9RT1NfTlVMTCkgfHwKLQkJCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX05VTExfRlVOQykpKSkKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCQkJZWxzZQotCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLQotCi0JYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCS8vU2V0IFBNIGJpdCBpbiBwcy1wb2xsLCB0byBmaXggV0xLIDEuMiAgUG93ZXJTYXZlTW9kZV9leHQgZmFpbHVyZSBpc3N1ZS4KLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QU19QT0xMKSkKLQkJewotCQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQl9Ci0JZWxzZSAvLyBCVFlQRV9NR01UIG9yIEJUWVBFX0RBVEEobXVzdCBiZSBOVUxMIGZyYW1lKQotCXsKLQkJLy9wQWQtPlNlcXVlbmNlKys7Ci0JCS8vcEhlYWRlcl84MDJfMTEtPlNlcXVlbmNlID0gcEFkLT5TZXF1ZW5jZTsKLQotCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKLQkJewotCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOwotCQkJaWYgKChwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1BST0JFX1JTUCkgJiYgKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX01HTVQpKQotCQkJewotCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOwotCQkJCWJBY2tSZXF1aXJlZCA9IEZBTFNFOyAvLyBEaXNhYmxlIEFDSyB0byBwcmV2ZW50IHJldHJ5IDB4MWYgZm9yIFByb2JlIFJlc3BvbnNlCi0JCQl9Ci0JCQllbHNlIGlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPT0gU1VCVFlQRV9QUk9CRV9SRVEpICYmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKSkKLQkJCXsKLQkJCQliQWNrUmVxdWlyZWQgPSBGQUxTRTsgLy8gRGlzYWJsZSBBQ0sgdG8gcHJldmVudCByZXRyeSAweDFmIGZvciBQcm9iZSBSZXF1ZXN0Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlKys7Ci0JaWYgKHBBZC0+U2VxdWVuY2UgPjB4ZmZmKQotCQlwQWQtPlNlcXVlbmNlID0gMDsKLQotCS8vIEJlZm9yZSByYWRhciBkZXRlY3Rpb24gZG9uZSwgbWdtdCBmcmFtZSBjYW4gbm90IGJlIHNlbnQgYnV0IHByb2JlIHJlcQotCS8vIEJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgcHJvYmUgcmVxIHRvIHRyaWdnZXIgZHJpdmVyIHRvIHNlbmQgcHJvYmUgcmVxIGluIHBhc3NpdmUgc2NhbgotCWlmICgocEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgIT0gU1VCVFlQRV9QUk9CRV9SRVEpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkmJiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiTWxtZUhhcmRUcmFuc21pdCAtLT4gcmFkYXIgZGV0ZWN0IG5vdCBpbiBub3JtYWwgbW9kZSAhISFcbiIpKTsKLS8vCQlpZiAoIUlycVN0YXRlKQotCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyXzgwMl8xMSwgRElSX1dSSVRFLCBGQUxTRSk7Ci0jZW5kaWYKLQotCS8vCi0JLy8gZmlsbCBzY2F0dGVyLWFuZC1nYXRoZXIgYnVmZmVyIGxpc3QgaW50byBUWEQuIEludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAotCS8vIHNob3VsZCBhbHdheXMgaGFzIG9ubHkgb25lIHBoeXNpY2FsIGJ1ZmZlciwgYW5kIHRoZSB3aG9sZSBmcmFtZSBzaXplIGVxdWFscwotCS8vIHRvIHRoZSBmaXJzdCBzY2F0dGVyIGJ1ZmZlciBzaXplCi0JLy8KLQotCS8vIEluaXRpYWxpemUgVFggRGVzY3JpcHRvcgotCS8vIEZvciBpbnRlci1mcmFtZSBnYXAsIHRoZSBudW1iZXIgaXMgZm9yIHRoaXMgZnJhbWUgYW5kIG5leHQgZnJhbWUKLQkvLyBGb3IgTUxNRSByYXRlLCB3ZSB3aWxsIGZpeCBhcyAyTWIgdG8gbWF0Y2ggb3RoZXIgdmVuZG9yJ3MgaW1wbGVtZW50Ci0vLwlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IDE7Ci0KLS8vIG1hbmFnZW1lbnQgZnJhbWUgZG9lc24ndCBuZWVkIGVuY3J5cHRpb24uIHNvIHVzZSBSRVNFUlZFRF9XQ0lEIG5vIG1hdHRlciB1IGFyZSBzZW5kaW5nIHRvIHNwZWNpZmljIHdjaWQgb3Igbm90LgotCVBJRCA9IFBJRF9NR01UOwotCi0KLQlpZiAocE1hY0VudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLCBiSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJMCwgUkVTRVJWRURfV0NJRCwgKFNyY0J1ZkxlbiAtIFRYSU5GT19TSVpFIC0gVFhXSV9TSVpFKSwgUElELCAwLCAgKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MsIElGU19CQUNLT0ZGLCBGQUxTRSwgJnBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIGRvbnQgdXNlIGxvdyByYXRlIHRvIHNlbmQgUW9TIE51bGwgZGF0YSBmcmFtZSAqLwotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAotCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWElORk9fU0laRSAtIFRYV0lfU0laRSksCi0JCQkJCXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywgMCwKLQkJCQkJKFVDSEFSKXBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUywKLQkJCQkJSUZTX0JBQ0tPRkYsIEZBTFNFLCAmcE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUpOwotCX0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwRmlyc3RUeFdJLCBUWVBFX1RYV0kpOwotI2VuZGlmCi0KLQkvLyBOb3cgZG8gaGFyZHdhcmUtZGVwZW5lZCBraWNrIG91dC4KLQlIQUxfS2lja091dE1nbXRUeChwQWQsIFF1ZUlkeCwgcFBhY2tldCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwotCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlCi0vLwlpZiAoIUlycVN0YXRlKQotCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU5ldyBEZVF1ZXVlIFByb2NlZHVyZXMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBERVFVRVVFX0xPQ0sobG9jaywgYkludENvbnRleHQsIElycUZsYWdzKQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChiSW50Q29udGV4dCA9PSBGQUxTRSkJCQkJCQlcCi0JCQkJUlRNUF9JUlFfTE9DSygobG9jayksIElycUZsYWdzKTsJCVwKLQkJCX13aGlsZSgwKQotCi0jZGVmaW5lIERFUVVFVUVfVU5MT0NLKGxvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncykJCQkJXAotCQkJZG97CQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoYkludENvbnRleHQgPT0gRkFMU0UpCQkJCQkJXAotCQkJCQlSVE1QX0lSUV9VTkxPQ0soKGxvY2spLCBJcnFGbGFncyk7CVwKLQkJCX13aGlsZSgwKQotCi0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVR4IFBhdGggZGVzaWduIGFsZ29yaXRobToKLQkJQmFzaWNhbGx5LCB3ZSBkaXZpZGUgdGhlIHBhY2tldHMgaW50byBmb3VyIHR5cGVzLCBCcm9hZGNhc3QvTXVsdGljYXN0LCAxMU4gUmF0ZShBTVBEVSwgQU1TRFUsIE5vcm1hbCksIEIvRyBSYXRlKEFSQUxJTkssIE5vcm1hbCksCi0JCVNwZWNpZmljIFBhY2tldCBUeXBlLiBGb2xsb3dpbmcgc2hvdyB0aGUgY2xhc3NpZmljYXRpb24gcnVsZSBhbmQgcG9saWN5IGZvciBlYWNoIGtpbmRzIG9mIHBhY2tldHMuCi0JCQkJQ2xhc3NpZmljYXRpb24gUnVsZT0+Ci0JCQkJCU11bHRpY2FzdDogKCphZGRyMSAmIDB4MDEpID09IDB4MDEKLQkJCQkJU3BlY2lmaWMgOiBiREhDUEZyYW1lLCBiQVJQRnJhbWUsIGJFQVBPTEZyYW1lLCBldGMuCi0JCQkJCTExTiBSYXRlIDogSWYgcGVlciBzdXBwb3J0IEhUCi0JCQkJCQkJCSgxKS5BTVBEVSAgLS0gSWYgVFhCQSBpcyBuZWdvdGlhdGVkLgotCQkJCQkJCQkoMikuQU1TRFUgIC0tIElmIEFNU0RVIGlzIGNhcGFibGUgZm9yIGJvdGggcGVlciBhbmQgb3Vyc2VsZi4KLQkJCQkJCQkJCQkJKikuIEFNU0RVIGNhbiBlbWJlZGRlZCBpbiBhIEFNUERVLCBidXQgbm93IHdlIGRpZG4ndCBzdXBwb3J0IGl0LgotCQkJCQkJCQkoMykuTm9ybWFsIC0tIE90aGVyIHBhY2tldHMgd2hpY2ggc2VuZCBhcyAxMW4gcmF0ZS4KLQotCQkJCQlCL0cgUmF0ZSA6IElmIHBlZXIgaXMgYi9nIG9ubHkuCi0JCQkJCQkJCSgxKS5BUkFMSU5LLS0gSWYgYm90aCBvZiBwZWVyL3VzIHN1cHByb3QgUmFsaW5rIHByb3ByaWV0YXJ5IEFnZ3JlZ2F0aW9uIGFuZCB0aGUgVHhSYXRlIGlzIGxhcmdlIHRoYW4gUkFURV82Ci0JCQkJCQkJCSgyKS5Ob3JtYWwgLS0gT3RoZXIgcGFja2V0cyB3aGljaCBzZW5kIGFzIGIvZyByYXRlLgotCQkJCQlGcmFnbWVudDoKLQkJCQkJCQkJVGhlIHBhY2tldCBtdXN0IGJlIHVuaWNhc3QsIE5PVCBBLVJBTElOSywgTk9UIEEtTVNEVSwgTk9UIDExbiwgdGhlbiBjYW4gY29uc2lkZXIgYWJvdXQgZnJhZ21lbnQuCi0KLQkJCQlDbGFzc2lmaWVkIFBhY2tldCBIYW5kbGUgUnVsZT0+Ci0JCQkJCU11bHRpY2FzdDoKLQkJCQkJCQkJTm8gQUNLLAkJCS8vcFR4QmxrLT5iQWNrUmVxdWlyZWQgPSBGQUxTRTsKLQkJCQkJCQkJTm8gV01NLAkJCS8vcFR4QmxrLT5iV01NID0gRkFMU0U7Ci0JCQkJCQkJCU5vIHBpZ2d5YmFjaywgICAvL3BUeEJsay0+YlBpZ2d5QmFjayA9IEZBTFNFOwotCQkJCQkJCQlGb3JjZSBMb3dSYXRlLCAgLy9wVHhCbGstPmJGb3JjZUxvd1JhdGUgPSBUUlVFOwotCQkJCQlTcGVjaWZpYyA6CUJhc2ljYWxseSwgZm9yIHNwZWNpZmljIHBhY2tldCwgd2Ugc2hvdWxkIGhhbmRsZSBpdCBzcGVjaWZpY2FsbHksIGJ1dCBub3cgYWxsIHNwZWNpZmljIHBhY2tldHMgYXJlIHVzZQotCQkJCQkJCQkJdGhlIHNhbWUgcG9saWN5IHRvIGhhbmRsZSBpdC4KLQkJCQkJCQkJRm9yY2UgTG93UmF0ZSwgIC8vcFR4QmxrLT5iRm9yY2VMb3dSYXRlID0gVFJVRTsKLQotCQkJCQkxMU4gUmF0ZSA6Ci0JCQkJCQkJCU5vIHBpZ2d5YmFjaywJLy9wVHhCbGstPmJQaWdneUJhY2sgPSBGQUxTRTsKLQotCQkJCQkJCQkoMSkuQU1TRFUKLQkJCQkJCQkJCXBUeEJsay0+YldNTSA9IFRSVUU7Ci0JCQkJCQkJCSgyKS5BTVBEVQotCQkJCQkJCQkJcFR4QmxrLT5iV01NID0gVFJVRTsKLQkJCQkJCQkJKDMpLk5vcm1hbAotCi0JCQkJCUIvRyBSYXRlIDoKLQkJCQkJCQkJKDEpLkFSQUxJTksKLQotCQkJCQkJCQkoMikuTm9ybWFsCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFVDSEFSIFR4UGt0Q2xhc3NpZmljYXRpb24oCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUE5ESVNfUEFDS0VUICBwUGFja2V0KQotewotCVVDSEFSCQkJVHhGcmFtZVR5cGUgPSBUWF9VTktPV05fRlJBTUU7Ci0JVUNIQVIJCQlXY2lkOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5ID0gTlVMTDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlCT09MRUFOCQkJYkhUUmF0ZSA9IEZBTFNFOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOwotCWlmIChXY2lkID09IE1DQVNUX1dDSUQpCi0JewkvLyBIYW5kbGUgZm9yIFJBIGlzIEJyb2FkY2FzdC9NdWx0aWNhc3QgQWRkcmVzcy4KLQkJcmV0dXJuIFRYX01DQVNUX0ZSQU1FOwotCX0KLQotCS8vIEhhbmRsZSBmb3IgdW5pY2FzdCBwYWNrZXRzCi0JcE1hY0VudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF07Ci0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9MT1dSQVRFKHBQYWNrZXQpKQotCXsJLy8gSXQncyBhIHNwZWNpZmljIHBhY2tldCBuZWVkIHRvIGZvcmNlIGxvdyByYXRlLCBpLmUuLCBiREhDUEZyYW1lLCBiRUFQT0xGcmFtZSwgYldBSUZyYW1lCi0JCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQllbHNlIGlmIChJU19IVF9SQVRFKHBNYWNFbnRyeSkpCi0JewkvLyBpdCdzIGEgMTFuIGNhcGFibGUgcGFja2V0Ci0KLQkJLy8gRGVwZW5kcyBvbiBIVFBoeU1vZGUgdG8gY2hlY2sgaWYgdGhlIHBlZXIgc3VwcG9ydCB0aGUgSFRSYXRlIHRyYW5zbWlzc2lvbi4KLQkJLy8JQ3VycmVudGx5IGRpZG4ndCBzdXBwb3J0IEEtTVNEVSBlbWJlZGRlZCBpbiBBLU1QRFUKLQkJYkhUUmF0ZSA9IFRSVUU7Ci0JCWlmIChSVE1QX0dFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCkgfHwgKHBNYWNFbnRyeS0+UHNNb2RlID09IFBXUl9TQVZFKSkKLQkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotI2lmZGVmIFVBUFNEX0FQX1NVUFBPUlQKLQkJZWxzZSBpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCi0JCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLSNlbmRpZiAvLyBVQVBTRF9BUF9TVVBQT1JUIC8vCi0JCWVsc2UgaWYoKHBNYWNFbnRyeS0+VFhCQWJpdG1hcCAmICgxPDwoUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpKSkpICE9IDApCi0JCQlyZXR1cm4gVFhfQU1QRFVfRlJBTUU7Ci0JCWVsc2UgaWYoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQotCQkJcmV0dXJuIFRYX0FNU0RVX0ZSQU1FOwotCQllbHNlCi0JCQlUeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JZWxzZQotCXsJLy8gaXQncyBhIGxlZ2FjeSBiL2cgcGFja2V0LgotCQlpZiAoKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSkgJiYgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkgJiYKLQkJCShSVE1QX0dFVF9QQUNLRVRfVFhSQVRFKHBQYWNrZXQpID49IFJBVEVfNikgJiYKLQkJCSghKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19XTU1fQ0FQQUJMRSkpKSkKLQkJewkvLyBpZiBwZWVyIHN1cHBvcnQgUmFsaW5rIEFnZ3JlZ2F0aW9uLCB3ZSB1c2UgaXQuCi0JCQlUeEZyYW1lVHlwZSA9IFRYX1JBTElOS19GUkFNRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4RnJhbWVUeXBlID0gVFhfTEVHQUNZX0ZSQU1FOwotCQl9Ci0JfQotCi0JLy8gQ3VycmVudGx5LCBvdXIgZnJhZ21lbnQgb25seSBzdXBwb3J0IHdoZW4gYSB1bmljYXN0IHBhY2tldCBzZW5kIGFzIE5PVC1BUkFMSU5LLCBOT1QtQU1TRFUgYW5kIE5PVC1BTVBEVS4KLQlpZiAoKFJUTVBfR0VUX1BBQ0tFVF9GUkFHTUVOVFMocFBhY2tldCkgPiAxKSAmJiAoVHhGcmFtZVR5cGUgPT0gVFhfTEVHQUNZX0ZSQU1FKSkKLQkJVHhGcmFtZVR5cGUgPSBUWF9GUkFHX0ZSQU1FOwotCi0JcmV0dXJuIFR4RnJhbWVUeXBlOwotfQotCi0KLUJPT0xFQU4gUlRNUF9GaWxsVHhCbGtJbmZvKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSyAqcFR4QmxrKQotewotCVBBQ0tFVF9JTkZPCQkJUGFja2V0SW5mbzsKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnkgPSBOVUxMOwotCi0JcFBhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKLQotCXBUeEJsay0+V2NpZAkJCQk9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOwotCXBUeEJsay0+YXBpZHgJCQkJPSBSVE1QX0dFVF9QQUNLRVRfSUYocFBhY2tldCk7Ci0JcFR4QmxrLT5Vc2VyUHJpb3JpdHkJCT0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOwotCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwkJLy8gQVNJQyBkZXRlcm1pbmUgRnJhbWUgR2FwCi0KLQlpZiAoUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwVHhCbGstPnBQYWNrZXQpKQotCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOwotCWVsc2UKLQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpOwotCi0JLy8gRGVmYXVsdCB0byBjbGVhciB0aGlzIGZsYWcKLQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iRm9yY2VOb25Rb1MpOwotCi0KLQlpZiAocFR4QmxrLT5XY2lkID09IE1DQVNUX1dDSUQpCi0JewotCQlwVHhCbGstPnBNYWNFbnRyeSA9IE5VTEw7Ci0JCXsKLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0JCQlQVUNIQVIgcERBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCQkJaWYgKCgoKnBEQSAmIDB4MDEpID09IDB4MDEpICYmICgqcERBICE9IDB4ZmYpKQotCQkJCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBBZC0+Q29tbW9uQ2ZnLk1DYXN0UGh5TW9kZTsKLQkJCWVsc2UKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0JCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7Ci0JCX0KLQotCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwkvLyBBY2tSZXF1aXJlZCA9IEZBTFNFLCB3aGVuIGJyb2FkY2FzdCBwYWNrZXQgaW4gQWRob2MgbW9kZS4KLQkJLy9UWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYkZvcmNlTG93UmF0ZSk7Ci0JCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOwotCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKLQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKLQkJewotCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7Ci0JCX0KLQotCX0KLQllbHNlCi0JewotCQlwVHhCbGstPnBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BUeEJsay0+V2NpZF07Ci0JCXBUeEJsay0+cFRyYW5zbWl0ID0gJnBUeEJsay0+cE1hY0VudHJ5LT5IVFBoeU1vZGU7Ci0KLQkJcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7Ci0KLQotCQkvLyBGb3IgYWxsIHVuaWNhc3QgcGFja2V0cywgbmVlZCBBY2sgdW5sZXNzIHRoZSBBY2sgUG9saWN5IGlzIG5vdCBzZXQgYXMgTk9STUFMX0FDSy4KLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF0gIT0gTk9STUFMX0FDSykKLQkJCVRYX0JMS19DTEVBUl9GTEFHKHBUeEJsaywgZlRYX2JBY2tSZXF1aXJlZCk7Ci0JCWVsc2UKLQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLQkJCShBREhPQ19PTihwQWQpKSAmJgotCQkJKFJYX0ZJTFRFUl9URVNUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9QUk9NSVNDVU9VUykpKQotCQl7Ci0JCQlpZihwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKLQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iQWNrUmVxdWlyZWQpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkJewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJewotCi0JCQkJLy8gSWYgc3VwcG9ydCBXTU0sIGVuYWJsZSBpdC4KLQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJgotCQkJCQlDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkKLQkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU0pOwotCi0vLwkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpCi0vLwkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX0F1dG9SYXRlU3dpdGNoKTsKLQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCi0JCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0xFR0FDWV9GUkFNRSkKLQkJewotCQkJaWYgKCAoUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUocFBhY2tldCkpIHx8Ci0gICAgICAgICAgICAgICAgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApICYmIChwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfQ0NLKSAmJiAocE1hY0VudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID09IFJBVEVfMSkpKQotCQkJewkvLyBTcGVjaWZpYyBwYWNrZXQsIGkuZS4sIGJESENQRnJhbWUsIGJFQVBPTEZyYW1lLCBiV0FJRnJhbWUsIG5lZWQgZm9yY2UgbG93IHJhdGUuCi0JCQkJcFR4QmxrLT5wVHJhbnNtaXQgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGU7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJLy8gTW9kaWZ5IHRoZSBXTU0gYml0IGZvciBJQ1YgaXNzdWUuIElmIHdlIGhhdmUgYSBwYWNrZXQgd2l0aCBFT1NQIGZpZWxkIG5lZWQgdG8gc2V0IGFzIDEsIGhvdyB0byBoYW5kbGUgaXQ/Pz8KLQkJCQlpZiAoSVNfSFRfU1RBKHBUeEJsay0+cE1hY0VudHJ5KSAmJgotCQkJCQkoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCkpICYmCi0JCQkJCSgocEFkLT5Db21tb25DZmcuYlJkZyA9PSBUUlVFKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkpCi0JCQkJewotCQkJCQlUWF9CTEtfQ0xFQVJfRkxBRyhwVHhCbGssIGZUWF9iV01NKTsKLQkJCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUyk7Ci0JCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoIChJU19IVF9SQVRFKHBNYWNFbnRyeSkgPT0gRkFMU0UpICYmCi0JCQkJKENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpKSkKLQkJCXsJLy8gQ3VycmVudGx5IHBpZ2d5LWJhY2sgb25seSBzdXBwb3J0IHdoZW4gcGVlciBpcyBvcGVyYXRlIGluIGIvZyBtb2RlLgotCQkJCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUGlnZ3lCYWNrKTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShwUGFja2V0KSkKLQkJCXsKLQkJCQlUWF9CTEtfU0VUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKLQkJCX0KLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JCQlpZiAoUlRNUF9HRVRfUEFDS0VUX0VPU1AocFBhY2tldCkpCi0JCQl7Ci0JCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JXTU1fVUFQU0RfRU9TUCk7Ci0JCQl9Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCQl9Ci0JCWVsc2UgaWYgKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfRlJBR19GUkFNRSkKLQkJewotCQkJVFhfQkxLX1NFVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpOwotCQl9Ci0KLQkJcE1hY0VudHJ5LT5EZWJ1Z1R4Q291bnQrKzsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1CT09MRUFOIENhbkRvQWdncmVnYXRlVHJhbnNtaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gTkRJU19QQUNLRVQgKnBQYWNrZXQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQotewotCi0JLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDaGVjayBpZiBjYW4gZG8gYWdncmVnYXRpb24hIFR4RnJhbWVUeXBlPSVkIVxuIiwgcFR4QmxrLT5UeEZyYW1lVHlwZSkpOwotCi0JaWYgKFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpID09IE1DQVNUX1dDSUQpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmIChSVE1QX0dFVF9QQUNLRVRfREhDUChwUGFja2V0KSB8fAotCQlSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFBhY2tldCkgfHwKLQkJUlRNUF9HRVRfUEFDS0VUX1dBSShwUGFja2V0KSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKSAmJgotCQkoKHBUeEJsay0+VG90YWxGcmFtZUxlbiArIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpKT4gKFJYX0JVRkZFUl9BR0dSRVNJWkUgLSAxMDApKSkKLQl7CS8vIEZvciBBTVNEVSwgYWxsb3cgdGhlIHBhY2tldHMgd2l0aCB0b3RhbCBsZW5ndGggPCBtYXgtYW1zZHUgc2l6ZQotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYgKChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX1JBTElOS19GUkFNRSkgJiYKLQkJKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlciA9PSAyKSkKLQl7CS8vIEZvciBSQUxJTkstQWdncmVnYXRpb24sIGFsbG93IHR3byBmcmFtZXMgaW4gb25lIGJhdGNoLgotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKChJTkZSQV9PTihwQWQpKSAmJiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkpIC8vIG11c3QgYmUgdW5pY2FzdCB0byBBUAotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCXJldHVybiBGQUxTRTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlUbyBkbyB0aGUgZW5xdWV1ZSBvcGVyYXRpb24gYW5kIGV4dHJhY3QgdGhlIGZpcnN0IGl0ZW0gb2Ygd2FpdGluZwotCQlsaXN0LiBJZiBhIG51bWJlciBvZiBhdmFpbGFibGUgc2hhcmVkIG1lbW9yeSBzZWdtZW50cyBjb3VsZCBtZWV0Ci0JCXRoZSByZXF1ZXN0IG9mIGV4dHJhY3RlZCBpdGVtLCB0aGUgZXh0cmFjdGVkIGl0ZW0gd2lsbCBiZSBmcmFnbWVudGVkCi0JCWludG8gc2hhcmVkIG1lbW9yeSBzZWdtZW50cy4KLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcFF1ZXVlCQlQb2ludGVyIHRvIFdhaXRpbmcgUXVldWUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRGVRdWV1ZVBhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgQk9PTEVBTiAgICAgICAgIGJJbnRDb250ZXh0LAotCUlOICBVQ0hBUgkJCVFJZHgsIC8qIEJ1bGtPdXRQaXBlSWQgKi8KLQlJTiAgVUNIQVIgICAgICAgICAgIE1heF9UeF9QYWNrZXRzKQotewotCVBRVUVVRV9FTlRSWSAgICBwRW50cnkgPSBOVUxMOwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCU5ESVNfU1RBVFVTICAgICBTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVVDSEFSICAgICAgICAgICBDb3VudD0wOwotCVBRVUVVRV9IRUFERVIgICBwUXVldWU7Ci0JVUxPTkcgICAgICAgICAgIEZyZWVOdW1iZXJbTlVNX09GX1RYX1JJTkddOwotCVVDSEFSCQkJUXVlSWR4LCBzUUlkeCwgZVFJZHg7Ci0JdW5zaWduZWQgbG9uZwlJcnFGbGFncyA9IDA7Ci0JQk9PTEVBTgkJCWhhc1R4RGVzYyA9IEZBTFNFOwotCVRYX0JMSwkJCVR4QmxrOwotCVRYX0JMSwkJCSpwVHhCbGs7Ci0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQlCT09MRUFOCQkJZmlyc3RSb3VuZDsKLQlSdG1wRGlhZ1N0cnVjdAkqcERpYWdTdHJ1Y3QgPSAmcEFkLT5EaWFnU3RydWN0OwotI2VuZGlmCi0KLQotCWlmIChRSWR4ID09IE5VTV9PRl9UWF9SSU5HKQotCXsKLQkJc1FJZHggPSAwOwotCQllUUlkeCA9IDM7CS8vIDQgQUNzLCBzdGFydCBmcm9tIDAuCi0JfQotCWVsc2UKLQl7Ci0JCXNRSWR4ID0gZVFJZHggPSBRSWR4OwotCX0KLQotCWZvciAoUXVlSWR4PXNRSWR4OyBRdWVJZHggPD0gZVFJZHg7IFF1ZUlkeCsrKQotCXsKLQkJQ291bnQ9MDsKLQotCQlSVE1QX1NUQVJUX0RFUVVFVUUocEFkLCBRdWVJZHgsIElycUZsYWdzKTsKLQotI2lmZGVmIERCR19ESUFHTk9TRQotCQlmaXJzdFJvdW5kID0gKChRdWVJZHggPT0gMCkgPyBUUlVFIDogRkFMU0UpOwotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0JCXdoaWxlICgxKQotCQl7Ci0JCQlpZiAoKFJUTVBfVEVTVF9GTEFHKHBBZCwgKGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfAotCQkJCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKSkKLQkJCXsKLQkJCQlSVE1QX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKENvdW50ID49IE1heF9UeF9QYWNrZXRzKQotCQkJCWJyZWFrOwotCi0JCQlERVFVRVVFX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQlpZiAoJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0gPT0gTlVMTCkKLQkJCXsKLSNpZmRlZiBEQkdfRElBR05PU0UKLQkJCQlpZiAoZmlyc3RSb3VuZCA9PSBUUlVFKQotCQkJCQlwRGlhZ1N0cnVjdC0+VHhTV1F1ZUNudFtwRGlhZ1N0cnVjdC0+QXJyYXlDdXJJZHhdWzBdKys7Ci0jZW5kaWYgLy8gREJHX0RJQUdOT1NFIC8vCi0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQotI2lmZGVmIERCR19ESUFHTk9TRQotCQkJaWYgKGZpcnN0Um91bmQgPT0gVFJVRSkKLQkJCXsKLQkJCQlVQ0hBUgl0eERlc2NOdW1MZXZlbCwgdHhTd1FOdW1MZXZlbDsKLQotCQkJCXR4RGVzY051bUxldmVsID0gKFRYX1JJTkdfU0laRSAtIEZyZWVOdW1iZXJbUXVlSWR4XSk7IC8vIE51bWJlciBvZiBvY2N1cGllZCBodyBkZXNjLgotCQkJCXR4RGVzY051bUxldmVsID0gKCh0eERlc2NOdW1MZXZlbCA8PTE1KSA/IHR4RGVzY051bUxldmVsIDogMTUpOwotCQkJCXBEaWFnU3RydWN0LT5UeERlc2NDbnRbcERpYWdTdHJ1Y3QtPkFycmF5Q3VySWR4XVt0eERlc2NOdW1MZXZlbF0rKzsKLQotCQkJCXR4U3dRTnVtTGV2ZWwgPSAoKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyIDw9NykgPyBwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA6IDgpOwotCQkJCXBEaWFnU3RydWN0LT5UeFNXUXVlQ250W3BEaWFnU3RydWN0LT5BcnJheUN1cklkeF1bdHhTd1FOdW1MZXZlbF0rKzsKLQotCQkJCWZpcnN0Um91bmQgPSBGQUxTRTsKLQkJCX0KLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCQkJaWYgKEZyZWVOdW1iZXJbUXVlSWR4XSA8PSA1KQotCQkJewotCQkJCS8vIGZyZWUgVHgoUXVlSWR4KSByZXNvdXJjZXMKLQkJCQlSVE1QRnJlZVRYRFVwb25UeERtYURvbmUocEFkLCBRdWVJZHgpOwotCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCQkJLy8gcHJvYmUgdGhlIFF1ZXVlIEhlYWQKLQkJCXBRdWV1ZSA9ICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdOwotCQkJaWYgKChwRW50cnkgPSBwUXVldWUtPkhlYWQpID09IE5VTEwpCi0JCQl7Ci0JCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBUeEJsayA9ICZUeEJsazsKLQkJCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpcFR4QmxrLCBzaXplb2YoVFhfQkxLKSk7Ci0JCQkvL0luaXRpYWxpemVRdWV1ZUhlYWRlcigmcFR4QmxrLT5UeFBhY2tldExpc3QpOwkJLy8gRGlkbid0IG5lZWQgaXQgYmVjYXVzZSB3ZSBhbHJlYWR5IG1lbXplcm8gaXQuCi0JCQlwVHhCbGstPlF1ZUlkeCA9IFF1ZUlkeDsKLQotCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCi0KLQkJCS8vIEVhcmx5IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub2d1aCBUeCBSZXNvdXJjZS4KLQkJCWhhc1R4RGVzYyA9IFJUTVBfSEFTX0VOT1VHSF9GUkVFX0RFU0MocEFkLCBwVHhCbGssIEZyZWVOdW1iZXJbUXVlSWR4XSwgcFBhY2tldCk7Ci0JCQlpZiAoIWhhc1R4RGVzYykKLQkJCXsKLQkJCQlwQWQtPlByaXZhdGVJbmZvLlR4UmluZ0Z1bGxDbnQrKzsKLQotCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBUeEJsay0+VHhGcmFtZVR5cGUgPSBUeFBrdENsYXNzaWZpY2F0aW9uKHBBZCwgcFBhY2tldCk7Ci0JCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKLQkJCXBUeEJsay0+VG90YWxGcmFtZU51bSsrOwotCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKLQkJCXBUeEJsay0+VG90YWxGcmFtZUxlbiArPSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQkJCXBUeEJsay0+cFBhY2tldCA9IHBQYWNrZXQ7Ci0JCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwotCi0JCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUgfHwgcFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKLQkJCXsKLQkJCQkvLyBFbmhhbmNlIFNXIEFnZ3JlZ2F0aW9uIE1lY2hhbmlzbQotCQkJCWlmIChORUVEX1FVRVVFX0JBQ0tfRk9SX0FHRyhwQWQsIFF1ZUlkeCwgRnJlZU51bWJlcltRdWVJZHhdLCBwVHhCbGstPlR4RnJhbWVUeXBlKSkKLQkJCQl7Ci0JCQkJCUluc2VydEhlYWRRdWV1ZShwUXVldWUsIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwUGFja2V0KSk7Ci0JCQkJCURFUVVFVUVfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBiSW50Q29udGV4dCwgSXJxRmxhZ3MpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlkb3sKLQkJCQkJaWYoKHBFbnRyeSA9IHBRdWV1ZS0+SGVhZCkgPT0gTlVMTCkKLQkJCQkJCWJyZWFrOwotCi0JCQkJCS8vIEZvciBUWF9BTVNEVV9GUkFNRS9UWF9SQUxJTktfRlJBTUUsIE5lZWQgdG8gY2hlY2sgaWYgbmV4dCBwYWtjZXQgY2FuIGRvIGFnZ3JlZ2F0aW9uLgotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSk7Ci0JCQkJCUZyZWVOdW1iZXJbUXVlSWR4XSA9IEdFVF9UWFJJTkdfRlJFRU5PKHBBZCwgUXVlSWR4KTsKLQkJCQkJaGFzVHhEZXNjID0gUlRNUF9IQVNfRU5PVUdIX0ZSRUVfREVTQyhwQWQsIHBUeEJsaywgRnJlZU51bWJlcltRdWVJZHhdLCBwUGFja2V0KTsKLQkJCQkJaWYgKChoYXNUeERlc2MgPT0gRkFMU0UpIHx8IChDYW5Eb0FnZ3JlZ2F0ZVRyYW5zbWl0KHBBZCwgcFBhY2tldCwgcFR4QmxrKSA9PSBGQUxTRSkpCi0JCQkJCQlicmVhazsKLQotCQkJCQkvL1JlbW92ZSB0aGUgcGFja2V0IGZyb20gdGhlIFR4U3dRdWV1ZSBhbmQgaW5zZXJ0IGludG8gcFR4QmxrCi0JCQkJCXBFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZShwUXVldWUpOwotCQkJCQlBU1NFUlQocEVudHJ5KTsKLQkJCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCQkJCQlwVHhCbGstPlRvdGFsRnJhbWVOdW0rKzsKLQkJCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gKz0gUlRNUF9HRVRfUEFDS0VUX0ZSQUdNRU5UUyhwUGFja2V0KTsJLy8gVGhlIHJlYWwgZnJhZ21lbnQgbnVtYmVyIG1heWJlIHZhcnkKLQkJCQkJcFR4QmxrLT5Ub3RhbEZyYW1lTGVuICs9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCQkJCQlJbnNlcnRUYWlsUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0LCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwotCQkJCX13aGlsZSgxKTsKLQotCQkJCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIgPT0gMSkKLQkJCQkJcFR4QmxrLT5UeEZyYW1lVHlwZSA9IFRYX0xFR0FDWV9GUkFNRTsKLQkJCX0KLQotCi0JCQlDb3VudCArPSBwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXI7Ci0KLQotCQkJCS8vIERvIEhhcmRUcmFuc21pdCBub3cuCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCVN0YXR1cyA9IFNUQUhhcmRUcmFuc21pdChwQWQsIHBUeEJsaywgUXVlSWR4KTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJREVRVUVVRV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGJJbnRDb250ZXh0LCBJcnFGbGFncyk7Ci0JCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCi0JCQkvL2lmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpKQotCQkJCU5JQ1VwZGF0ZUZpZm9TdGFDb3VudGVycyhwQWQpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JCX0KLQotCQlSVE1QX1NUT1BfREVRVUVVRShwQWQsIFF1ZUlkeCwgSXJxRmxhZ3MpOwotCi0KLSNpZmRlZiBCTE9DS19ORVRfSUYKLQkJaWYgKChwQWQtPmJsb2NrUXVldWVUYWJbUXVlSWR4XS5Td1R4UXVldWVCbG9ja0ZsYWcgPT0gVFJVRSkKLQkJCSYmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA8IDEpKQotCQl7Ci0JCQlyZWxlYXNlTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdKTsKLQkJfQotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCi0JfQotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZXMgdGhlIGR1cmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHRyYW5zbWl0IG91dCBmcmFtZXMKLQl3aXRoIGdpdmVuIHNpemUgYW5kIHNwZWNpZmllZCByYXRlLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlSYXRlCQkJVHJhbnNtaXQgcmF0ZQotCQlTaXplCQkJRnJhbWUgc2l6ZSBpbiB1bml0cyBvZiBieXRlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCUR1cmF0aW9uIG51bWJlciBpbiB1bml0cyBvZiB1c2VjCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVTSE9SVAlSVE1QQ2FsY0R1cmF0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUmF0ZSwKLQlJTglVTE9ORwkJCVNpemUpCi17Ci0JVUxPTkcJRHVyYXRpb24gPSAwOwotCi0JaWYgKFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkgLy8gQ0NLCi0JewotCQlpZiAoKFJhdGUgPiBSQVRFXzEpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0hPUlRfUFJFQU1CTEVfSU5VU0VEKSkKLQkJCUR1cmF0aW9uID0gOTY7CS8vIDcyKzI0IHByZWFtYmxlK3BsY3AKLQkJZWxzZQotCQkJRHVyYXRpb24gPSAxOTI7IC8vIDE0NCs0OCBwcmVhbWJsZStwbGNwCi0KLQkJRHVyYXRpb24gKz0gKFVTSE9SVCkoKFNpemUgPDwgNCkgLyBSYXRlSWRUbzUwMEticHNbUmF0ZV0pOwotCQlpZiAoKFNpemUgPDwgNCkgJSBSYXRlSWRUbzUwMEticHNbUmF0ZV0pCi0JCQlEdXJhdGlvbiArKzsKLQl9Ci0JZWxzZSBpZiAoUmF0ZSA8PSBSQVRFX0xBU1RfT0ZETV9SQVRFKS8vIE9GRE0gcmF0ZXMKLQl7Ci0JCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgotCQlEdXJhdGlvbiArPSA0ICogKFVTSE9SVCkoKDExICsgU2l6ZSAqIDQpIC8gUmF0ZUlkVG81MDBLYnBzW1JhdGVdKTsKLQkJaWYgKCgxMSArIFNpemUgKiA0KSAlIFJhdGVJZFRvNTAwS2Jwc1tSYXRlXSkKLQkJCUR1cmF0aW9uICs9IDQ7Ci0JfQotCWVsc2UJLy9taW1vIHJhdGUKLQl7Ci0JCUR1cmF0aW9uID0gMjAgKyA2OwkJLy8gMTYrNCBwcmVhbWJsZStwbGNwICsgU2lnbmFsIEV4dGVuc2lvbgotCX0KLQotCXJldHVybiAoVVNIT1JUKUR1cmF0aW9uOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCi0Jd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KLQotCUFyZ3VtZW50czoKLQkJcFR4V0kJCVBvaW50ZXIgdG8gaGVhZCBvZiBlYWNoIE1QRFUgdG8gSFcuCi0JCUFjawkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAotCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKLQkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKLQkJSWZzCQlTZXR0aW5nIGZvciBJRlMgZ2FwCi0JCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKLQkJU2VydmljZQkJU2V0dGluZyBmb3Igc2VydmljZQotCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAotCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKLQkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMwotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgU2VlIGFsc28gOiBCQVNtYXJ0SGFyZFRyYW5zbWl0KCkgICAgISEhCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMJcE91dFR4V0ksCi0JSU4JQk9PTEVBTgkJCUZSQUcsCi0JSU4JQk9PTEVBTgkJCUNGQUNLLAotCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCi0JSU4JQk9PTEVBTgkJCUFNUERVLAotCUlOCUJPT0xFQU4JCQlBY2ssCi0JSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KLQlJTglVQ0hBUgkJCUJBU2l6ZSwKLQlJTglVQ0hBUgkJCVdDSUQsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4JVUNIQVIJCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCi17Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjID0gTlVMTDsKLQlUWFdJX1NUUlVDCQlUeFdJOwotCVBUWFdJX1NUUlVDCXBUeFdJOwotCi0JaWYgKFdDSUQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcE1hYyA9ICZwQWQtPk1hY1RhYi5Db250ZW50W1dDSURdOwotCi0JLy8KLQkvLyBBbHdheXMgdXNlIExvbmcgcHJlYW1ibGUgYmVmb3JlIHZlcmlmaWF0aW9uIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3Mgd2VsbC4KLQkvLyBUb2RvOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGlmIHNob3J0IHByZWFtYmxlIGZ1bmN0aW9uYWxpdHkgd29ya3MKLQkvLwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7Ci0JTmRpc1plcm9NZW1vcnkoJlR4V0ksIFRYV0lfU0laRSk7Ci0JcFR4V0kgPSAmVHhXSTsKLQotCXBUeFdJLT5GUkFHPSBGUkFHOwotCi0JcFR4V0ktPkNGQUNLID0gQ0ZBQ0s7Ci0JcFR4V0ktPlRTPSBJbnNUaW1lc3RhbXA7Ci0JcFR4V0ktPkFNUERVID0gQU1QRFU7Ci0JcFR4V0ktPkFDSyA9IEFjazsKLQlwVHhXSS0+dHhvcD0gVHhvcG1vZGU7Ci0KLQlwVHhXSS0+TlNFUSA9IE5TZXE7Ci0JLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJBU2l6ZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4QkFTaXplOwotCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODcyMDIwMCkKLQl7Ci0JCWlmKCBCQVNpemUgPjEzICkKLQkJCUJBU2l6ZSA9MTM7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKCBCQVNpemUgPjcgKQotCQkJQkFTaXplID03OwotCX0KLQlwVHhXSS0+QkFXaW5TaXplID0gQkFTaXplOwotCXBUeFdJLT5TaG9ydEdJID0gcFRyYW5zbWl0LT5maWVsZC5TaG9ydEdJOwotCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JcFR4V0ktPldpcmVsZXNzQ2xpSUQgPSBXQ0lEOwotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBMZW5ndGg7Ci0JcFR4V0ktPlBhY2tldElkID0gUElEOwotCi0JLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKLQlwVHhXSS0+QlcgPSAocFRyYW5zbWl0LT5maWVsZC5NT0RFIDw9IE1PREVfT0ZETSkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlpZiAocFR4V0ktPkJXKQotCQlwVHhXSS0+QlcgPSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID09IDApID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7Ci0JcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7Ci0JcFR4V0ktPkNGQUNLID0gQ2ZBY2s7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAocE1hYykKLQl7Ci0gICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKQotICAgICAgICB7Ci0JCWlmICgocE1hYy0+TW1wc01vZGUgPT0gTU1QU19EWU5BTUlDKSAmJiAocFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KSkKLQkJCXsKLQkJCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCQkJcFR4V0ktPk1JTU9wcyA9IDE7Ci0JCQl9Ci0JCQllbHNlIGlmIChwTWFjLT5NbXBzTW9kZSA9PSBNTVBTX1NUQVRJQykKLQkJCXsKLQkJCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCQlpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVggJiYgcFRyYW5zbWl0LT5maWVsZC5NQ1MgPiA3KQotCQkJCXsKLQkJCQkJcFR4V0ktPk1DUyA9IDc7Ci0JCQkJCXBUeFdJLT5NSU1PcHMgPSAwOwotCQkJCX0KLQkJCX0KLSAgICAgICAgfQotCQkvL3BUeFdJLT5NSU1PcHMgPSAocE1hYy0+UHNNb2RlID09IFBXUl9NTVBTKT8gMTowOwotCQlpZiAocE1hYy0+YklBbUJhZEF0aGVyb3MgJiYgKHBNYWMtPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQl7Ci0JCQlwVHhXSS0+TXBkdURlbnNpdHkgPSA3OwotCQl9Ci0JCWVsc2UKLQkJewotCQlwVHhXSS0+TXBkdURlbnNpdHkgPSBwTWFjLT5NcGR1RGVuc2l0eTsKLQl9Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKLQlOZGlzTW92ZU1lbW9yeShwT3V0VHhXSSwgJlR4V0ksIHNpemVvZihUWFdJX1NUUlVDKSk7Ci19Ci0KLQotVk9JRCBSVE1QV3JpdGVUeFdJX0RhdGEoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspCi17Ci0JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JVUNIQVIJCQkJQkFTaXplOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLQlBU1NFUlQocFR4V0kpOwotCi0JcFRyYW5zbWl0ID0gcFR4QmxrLT5wVHJhbnNtaXQ7Ci0JcE1hY0VudHJ5ID0gcFR4QmxrLT5wTWFjRW50cnk7Ci0KLQotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCU5kaXNaZXJvTWVtb3J5KHBUeFdJLCBUWFdJX1NJWkUpOwotCi0JcFR4V0ktPkZSQUcJCT0gVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iQWxsb3dGcmFnKTsKLQlwVHhXSS0+QUNLCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkFja1JlcXVpcmVkKTsKLQlwVHhXSS0+dHhvcAkJPSBwVHhCbGstPkZyYW1lR2FwOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JaWYgKHBNYWNFbnRyeSAmJgotCQkocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpICYmCi0JCShwTWFjRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkpCi0JCXBUeFdJLT5XaXJlbGVzc0NsaUlEID0gQlNTSURfV0NJRDsKLQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JcFR4V0ktPldpcmVsZXNzQ2xpSUQJCT0gcFR4QmxrLT5XY2lkOwotCi0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudAk9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeFdJLT5DRkFDSwkJCQk9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYlBpZ2d5QmFjayk7Ci0KLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmIChwVHhXSS0+QlcpCi0JCXBUeFdJLT5CVyA9IChwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvLlJlY29tV2lkdGggPT0gMCkgPyAoQldfMjApIDogKHBUcmFuc21pdC0+ZmllbGQuQlcpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQlwVHhXSS0+QU1QRFUJPSAoKHBUeEJsay0+VHhGcmFtZVR5cGUgPT0gVFhfQU1QRFVfRlJBTUUpID8gVFJVRSA6IEZBTFNFKTsKLQotCS8vIEpvaG4gdHVuZSB0aGUgcGVyZm9ybWFjZSB3aXRoIEludGVsIENsaWVudCBpbiAyMCBNSHogcGVyZm9ybWFuY2UKLQlCQVNpemUgPSBwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZTsKLQlpZigocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVBEVV9GUkFNRSkgJiYgKHBNYWNFbnRyeSkpCi0JewotCQlVQ0hBUgkJUkFCQU9yaUlkeCA9IDA7CS8vVGhlIFJBJ3MgQkEgT3JpZ2luYXRvciB0YWJsZSBpbmRleC4KLQotCQlSQUJBT3JpSWR4ID0gcFR4QmxrLT5wTWFjRW50cnktPkJBT3JpV2NpZEFycmF5W3BUeEJsay0+VXNlclByaW9yaXR5XTsKLQkJQkFTaXplID0gcEFkLT5CQVRhYmxlLkJBT3JpRW50cnlbUkFCQU9yaUlkeF0uQkFXaW5TaXplOwotCX0KLQotCi0JcFR4V0ktPlR4QkYgPSBwVHJhbnNtaXQtPmZpZWxkLlR4QkY7Ci0JcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKLQlwVHhXSS0+U2hvcnRHSSA9IHBUcmFuc21pdC0+ZmllbGQuU2hvcnRHSTsKLQlwVHhXSS0+U1RCQyA9IHBUcmFuc21pdC0+ZmllbGQuU1RCQzsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKLQlwVHhXSS0+UEhZTU9ERSA9IHBUcmFuc21pdC0+ZmllbGQuTU9ERTsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKHBNYWNFbnRyeSkKLQl7Ci0JCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQl7Ci0JCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJfQotCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQl7Ci0JCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCAmJiBwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpCi0JCQl7Ci0JCQkJcFR4V0ktPk1DUyA9IDc7Ci0JCQkJcFR4V0ktPk1JTU9wcyA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocE1hY0VudHJ5LT5iSUFtQmFkQXRoZXJvcyAmJiAocE1hY0VudHJ5LT5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkKLQkJewotCQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gNzsKLQkJfQotCQllbHNlCi0JCXsKLQkJcFR4V0ktPk1wZHVEZW5zaXR5ID0gcE1hY0VudHJ5LT5NcGR1RGVuc2l0eTsKLQl9Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JCWlmIChwVHhCbGstPlF1ZUlkeD09IDApCi0JCXsKLQkJCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOwotCQkJcEFkLT5EaWFnU3RydWN0LlR4TWNzQ250W3BBZC0+RGlhZ1N0cnVjdC5BcnJheUN1cklkeF1bcFR4V0ktPk1DU10rKzsKLQkJfQotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0JLy8gZm9yIHJhdGUgYWRhcGF0aW9uCi0JcFR4V0ktPlBhY2tldElkID0gcFR4V0ktPk1DUzsKLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0vKkl2ZXJzb24gcGF0Y2ggZm9yIFdNTSBBNS1UMDcgLFdpcmVsZXNzU3RhVG9XaXJlbGVzc1N0YSBkbyBub3QgYnVsayBvdXQgYWdncmVnYXRlICovCi0JaWYoIFJUTVBfR0VUX1BBQ0tFVF9OT0JVTEtPVVQocFR4QmxrLT5wUGFja2V0KSkKLQl7Ci0JCWlmKHBUeFdJLT5QSFlNT0RFID09IE1PREVfQ0NLKQotCQl7Ci0JCQlwVHhXSS0+UGFja2V0SWQgPSA2OwotCQl9Ci0JfQotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLX0KLQotCi1WT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspCi17Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkvKnBUeEhUUGh5TW9kZSwqLyBwVHJhbnNtaXQ7Ci0JUE1BQ19UQUJMRV9FTlRSWQlwTWFjRW50cnk7Ci0KLQkvLwotCS8vIHVwZGF0ZSBUWFdJCi0JLy8KLQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQlwVHJhbnNtaXQgPSBwVHhCbGstPnBUcmFuc21pdDsKLQotCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JLy9pZiAoUlRNUENoZWNrRW50cnlFbmFibGVBdXRvUmF0ZVN3aXRjaChwQWQsIHBNYWNFbnRyeSkpCi0JLy9pZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9BdXRvUmF0ZVN3aXRjaCkpCi0JaWYgKHBNYWNFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2gpCi0JewotCQlwVHhXSS0+dHhvcCA9IElGU19IVFRYT1A7Ci0KLQkJLy8gSWYgQ0NLIG9yIE9GRE0sIEJXIG11c3QgYmUgMjAKLQkJcFR4V0ktPkJXID0gKHBUcmFuc21pdC0+ZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKLQkJcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7Ci0JCXBUeFdJLT5TVEJDID0gcFRyYW5zbWl0LT5maWVsZC5TVEJDOwotCi0JCXBUeFdJLT5NQ1MgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUzsKLQkJcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7Ci0KLQkJLy8gc2V0IFBJRCBmb3IgVHhSYXRlU3dpdGNoaW5nCi0JCXBUeFdJLT5QYWNrZXRJZCA9IHBUcmFuc21pdC0+ZmllbGQuTUNTOwotCX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXBUeFdJLT5BTVBEVSA9ICgocE1hY0VudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA9PSAwKSA/IFRSVUU6IEZBTFNFKTsKLQlwVHhXSS0+TUlNT3BzID0gMDsKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlpZiAocFR4V0ktPkJXKQotCQlwVHhXSS0+QlcgPSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5SZWNvbVdpZHRoID09IDApID8gKEJXXzIwKSA6IChwVHJhbnNtaXQtPmZpZWxkLkJXKTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLSAgICBpZiAocEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSkKLSAgICB7Ci0JCS8vIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCWlmICgocE1hY0VudHJ5LT5NbXBzTW9kZSA9PSBNTVBTX0RZTkFNSUMpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQl7Ci0JCQkvLyBEeW5hbWljIE1JTU8gUG93ZXIgU2F2ZSBNb2RlCi0JCQlwVHhXSS0+TUlNT3BzID0gMTsKLQkJfQotCQllbHNlIGlmIChwTWFjRW50cnktPk1tcHNNb2RlID09IE1NUFNfU1RBVElDKQotCQl7Ci0JCQkvLyBTdGF0aWMgTUlNTyBQb3dlciBTYXZlIE1vZGUKLQkJCWlmICgocFRyYW5zbWl0LT5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpICYmIChwVHJhbnNtaXQtPmZpZWxkLk1DUyA+IDcpKQotCQkJewotCQkJCXBUeFdJLT5NQ1MgPSA3OwotCQkJCXBUeFdJLT5NSU1PcHMgPSAwOwotCQkJfQotCQl9Ci0gICAgfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgREJHX0RJQUdOT1NFCi0JaWYgKHBUeEJsay0+UXVlSWR4PT0gMCkKLQl7Ci0JCXBBZC0+RGlhZ1N0cnVjdC5UeERhdGFDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XSsrOwotCQlwQWQtPkRpYWdTdHJ1Y3QuVHhNY3NDbnRbcEFkLT5EaWFnU3RydWN0LkFycmF5Q3VySWR4XVtwVHhXSS0+TUNTXSsrOwotCX0KLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCXBUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKLQotfQotCi0KLS8vIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIC0KLS8vIDEuIE1FQURJQV9DT05ORUNURUQKLS8vIDIuIEFHR1JFR0FUSU9OX0lOX1VTRUQKLS8vIDMuIEZyYWdtZW50YXRpb24gbm90IGluIHVzZWQKLS8vIDQuIGVpdGhlciBubyBwcmV2aW91cyBmcmFtZSAocFByZXZBZGRyMT1OVUxMKSAuT1IuIHByZXZpb3VkIGZyYW1lIGlzIGFnZ3JlZ2F0aWJsZQotQk9PTEVBTiBUeEZyYW1lSXNBZ2dyZWdhdGlibGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcFByZXZBZGRyMSwKLQlJTglQVUNIQVIJCQlwODAyM2hkcikKLXsKLQotCS8vIGNhbid0IGFnZ3JlZ2F0ZSBFQVBPTCAoODAyLjF4KSBmcmFtZQotCWlmICgocDgwMjNoZHJbMTJdID09IDB4ODgpICYmIChwODAyM2hkclsxM10gPT0gMHg4ZSkpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIGNhbid0IGFnZ3JlZ2F0ZSBtdWx0aWNhc3QvYnJvYWRjYXN0IGZyYW1lCi0JaWYgKHA4MDIzaGRyWzBdICYgMHgwMSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKElORlJBX09OKHBBZCkpIC8vIG11c3QgYmUgdW5pY2FzdCB0byBBUAotCQlyZXR1cm4gVFJVRTsKLQllbHNlIGlmICgocFByZXZBZGRyMSA9PSBOVUxMKSB8fCBNQUNfQUREUl9FUVVBTChwUHJldkFkZHIxLCBwODAyM2hkcikpIC8vIHVuaWNhc3QgdG8gc2FtZSBTVEEKLQkJcmV0dXJuIFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JICAgQ2hlY2sgdGhlIE1TRFUgQWdncmVnYXRpb24gcG9saWN5Ci0JMS5IVCBhZ2dyZWdhdGlvbiBpcyBBLU1TRFUKLQkyLmxlZ2FhY3kgcmF0ZSBhZ2dyZWdhdGlvbiBpcyBzb2Z0d2FyZSBhZ2dyZWdhdGlvbiBieSBSYWxpbmsuCi0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBQZWVySXNBZ2dyZU9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVMT05HCQkgICBUeFJhdGUsCi0JSU4JUE1BQ19UQUJMRV9FTlRSWSBwTWFjRW50cnkpCi17Ci0JVUxPTkcJQUZsYWdzID0gKGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCB8IGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOwotCi0JaWYgKHBNYWNFbnRyeSAhPSBOVUxMICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBNYWNFbnRyeSwgQUZsYWdzKSkKLQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmIChwTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0JCXsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JCWlmIChUeFJhdGUgPj0gUkFURV82ICYmIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgJiYgKCEoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XTU1fSU5VU0VEKSAmJiBDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwTWFjRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKSkpKQotCQl7CS8vIGxlZ2FjeSAgUmFsaW5rIEFnZ3JlZ2F0aW9uIHN1cHBvcnQKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDaGVjayBhbmQgZmluZSB0aGUgcGFja2V0IHdhaXRpbmcgaW4gU1cgcXVldWUgd2l0aCBoaWdoZXN0IHByaW9yaXR5Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZCBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCXBRdWV1ZQkJUG9pbnRlciB0byBXYWl0aW5nIFF1ZXVlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QUVVFVUVfSEVBREVSCVJUTVBDaGVja1R4U3dRdWV1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgUFVDSEFSCQkJcFF1ZUlkeCkKLXsKLQotCVVMT05HCU51bWJlcjsKLQkvLyAyMDA0LTExLTE1IHRvIGJlIHJlbW92ZWQuIHRlc3QgYWdncmVnYXRpb24gb25seQotLy8JaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpICYmICgqcE51bWJlciA8IDIpKQotLy8JCSByZXR1cm4gTlVMTDsKLQotCU51bWJlciA9IHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CS10uTnVtYmVyCi0JCQkgKyBwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLk51bWJlcgotCQkJICsgcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZJXS5OdW1iZXIKLQkJCSArIHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyOwotCQkJIC8qKyBwQWQtPlR4U3dRdWV1ZVtRSURfSENDQV0uTnVtYmVyOyovCi0KLQlpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXS5IZWFkICE9IE5VTEwpCi0JewotCQkqcFF1ZUlkeCA9IFFJRF9BQ19WTzsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX1ZPXSk7Ci0JfQotCWVsc2UgaWYgKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uSGVhZCAhPSBOVUxMKQotCXsKLQkJKnBRdWVJZHggPSBRSURfQUNfVkk7Ci0JCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0pOwotCX0KLQllbHNlIGlmIChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0FDX0JFOwotCQlyZXR1cm4gKCZwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQkVdKTsKLQl9Ci0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXS5IZWFkICE9IE5VTEwpCi0JewotCQkqcFF1ZUlkeCA9IFFJRF9BQ19CSzsKLQkJcmV0dXJuICgmcEFkLT5UeFN3UXVldWVbUUlEX0FDX0JLXSk7Ci0JfQotCS8qCi0JZWxzZSBpZiAocEFkLT5UeFN3UXVldWVbUUlEX0hDQ0FdLkhlYWQgIT0gTlVMTCkKLQl7Ci0JCSpwUXVlSWR4ID0gUUlEX0hDQ0E7Ci0JCXJldHVybiAoJnBBZC0+VHhTd1F1ZXVlW1FJRF9IQ0NBXSk7Ci0JfQotCSovCi0KLQkvLyBObyBwYWNrZXQgcGVuZGluZyBpbiBUeCBTdyBxdWV1ZQotCSpwUXVlSWR4ID0gUUlEX0FDX0JLOwotCi0JcmV0dXJuIChOVUxMKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU3VzcGVuZE1zZHVUcmFuc21pc3Npb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTQ0FOTklORywgc3VzcGVuZCBNU0RVIHRyYW5zbWlzc2lvbiAuLi5cbiIpKTsKLQotCi0JLy8KLQkvLyBCZWZvcmUgQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8ga2VlcCBDdXJyZW50IFI2NiB2YWx1ZSBhbmQKLQkvLyB1c2UgTG93Ym91bmQgYXMgUjY2IHZhbHVlIG9uIFNjYW5OZXh0Q2hhbm5lbCguLi4pCi0JLy8KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmcEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlKTsKLQotCS8vIHNldCBCQlBfUjY2IHRvIDB4MzAvMHg0MCB3aGVuIHNjYW5uaW5nIChBc2ljU3dpdGNoQ2hhbm5lbCB3aWxsIHNldCBSNjYgYWNjb3JkaW5nIHRvIGNoYW5uZWwgd2hlbiBzY2FubmluZykKLQkvL1JUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAoMHgyNiArIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKLQotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NOVExfQ1NSLCAweDAwMGYwMDAwKTsJCS8vIGFib3J0IGFsbCBUWCByaW5ncwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZXN1bWUgTVNEVSB0cmFuc21pc3Npb24KLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLS8vICAgIFVDSEFSCQkJSXJxU3RhdGU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNDQU4gZG9uZSwgcmVzdW1lIE1TRFUgdHJhbnNtaXNzaW9uIC4uLlxuIikpOwotCi0KLQkvLyBBZnRlciBmaW5pc2ggQlNTX1NDQU5fSU5fUFJPR1JFU1MsIHdlIG5lZWQgdG8gcmVzdG9yZSBDdXJyZW50IFI2NiB2YWx1ZQotCS8vIFI2NiBzaG91bGQgbm90IGJlIDAKLQlpZiAocEFkLT5CYnBUdW5pbmcuUjY2Q3VycmVudFZhbHVlID09IDApCi0JewotCQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwotCQlEQkdQUklOVF9FUlIoKCJSVE1QUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiwgUjY2Q3VycmVudFZhbHVlPTAuLi5cbiIpKTsKLQl9Ci0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSk7Ci0KLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLS8vIHNhbXBsZSwgZm9yIElSUSBMT0NLIHRvIFNFTSBMT0NLCi0vLyAgICBJcnFTdGF0ZSA9IHBBZC0+aXJxX2Rpc2FibGVkOwotLy8JaWYgKElycVN0YXRlKQotLy8JCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgVFJVRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLS8vICAgIGVsc2UKLQlSVE1QRGVRdWV1ZVBhY2tldChwQWQsIEZBTFNFLCBOVU1fT0ZfVFhfUklORywgTUFYX1RYX1BST0NFU1MpOwotfQotCi0KLVVJTlQgZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpCi17Ci0JVVNIT1JUCQkJUGF5bG9hZFNpemU7Ci0JVVNIT1JUCQkJU3ViRnJhbWVTaXplOwotCVBIRUFERVJfODAyXzMJcEFNU0RVc3ViaGVhZGVyOwotCVVJTlQJCQluTVNEVTsKLSAgICBVQ0hBUgkJCUhlYWRlcjgwMl8zWzE0XTsKLQotCVBVQ0hBUgkJCXBQYXlsb2FkLCBwREEsIHBTQSwgcFJlbW92ZWRMTENTTkFQOwotCVBORElTX1BBQ0tFVAlwQ2xvbmVQYWNrZXQ7Ci0KLQotCi0Jbk1TRFUgPSAwOwotCi0Jd2hpbGUgKERhdGFTaXplID4gTEVOR1RIXzgwMl8zKQotCXsKLQotCQluTVNEVSsrOwotCi0JCS8vaGV4X2R1bXAoInN1YmhlYWRlciIsIHBEYXRhLCA2NCk7Ci0JCXBBTVNEVXN1YmhlYWRlciA9IChQSEVBREVSXzgwMl8zKXBEYXRhOwotCQkvL3BEYXRhICs9IExFTkdUSF84MDJfMzsKLQkJUGF5bG9hZFNpemUgPSBwQU1TRFVzdWJoZWFkZXItPk9jdGV0WzFdICsgKHBBTVNEVXN1YmhlYWRlci0+T2N0ZXRbMF08PDgpOwotCQlTdWJGcmFtZVNpemUgPSBQYXlsb2FkU2l6ZSArIExFTkdUSF84MDJfMzsKLQotCi0JCWlmICgoRGF0YVNpemUgPCBTdWJGcmFtZVNpemUpIHx8IChQYXlsb2FkU2l6ZSA+IDE1MTggKSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotCQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJWQgc3ViZnJhbWU6IFNpemUgPSAlZFxuIiwgIG5NU0RVLCBQYXlsb2FkU2l6ZSkpOwotCi0JCXBQYXlsb2FkID0gcERhdGEgKyBMRU5HVEhfODAyXzM7Ci0JCXBEQSA9IHBEYXRhOwotCQlwU0EgPSBwRGF0YSArIE1BQ19BRERSX0xFTjsKLQotCQkvLyBjb252ZXJ0IHRvIDgwMi4zIGhlYWRlcgotICAgICAgICBDT05WRVJUX1RPXzgwMl8zKEhlYWRlcjgwMl8zLCBwREEsIHBTQSwgcFBheWxvYWQsIFBheWxvYWRTaXplLCBwUmVtb3ZlZExMQ1NOQVApOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmICgoSGVhZGVyODAyXzNbMTJdID09IDB4ODgpICYmIChIZWFkZXI4MDJfM1sxM10gPT0gMHg4RSkgKQotCQl7Ci0JCQkvKiBhdm9pZCBsb2NhbCBoZWFwIG92ZXJmbG93LCB1c2UgZHlhbmFtaWMgYWxsb2NhdGlvbiAqLwotCQkgICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0gPSAoTUxNRV9RVUVVRV9FTEVNICopIGttYWxsb2Moc2l6ZW9mKE1MTUVfUVVFVUVfRUxFTSksIE1FTV9BTExPQ19GTEFHKTsKLQkJCWlmIChFbGVtICE9IE5VTEwpCi0JCQl7Ci0JCQkJbWVtbW92ZShFbGVtLT5Nc2crKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCksIHBQYXlsb2FkLCBQYXlsb2FkU2l6ZSk7Ci0JCQkJRWxlbS0+TXNnTGVuID0gTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgUGF5bG9hZFNpemU7Ci0JCQkJLy9XcGFFQVBPTEtleUFjdGlvbihwQWQsIEVsZW0pOwotCQkJCVJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUocEFkLCBCU1NJRF9XQ0lELCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgMCwgMCwgMCwgMCk7Ci0JCQkJa2ZyZWUoRWxlbSk7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAocFJlbW92ZWRMTENTTkFQKQotCQkJewotCQkJCXBQYXlsb2FkIC09IExFTkdUSF84MDJfMzsKLQkJCQlQYXlsb2FkU2l6ZSArPSBMRU5HVEhfODAyXzM7Ci0JCQkJTmRpc01vdmVNZW1vcnkocFBheWxvYWQsICZIZWFkZXI4MDJfM1swXSwgTEVOR1RIXzgwMl8zKTsKLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCXBDbG9uZVBhY2tldCA9IENsb25lUGFja2V0KHBBZCwgcFBhY2tldCwgcFBheWxvYWQsIFBheWxvYWRTaXplKTsKLQkJaWYgKHBDbG9uZVBhY2tldCkKLQkJewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChwQWQsIHBDbG9uZVBhY2tldCwgUlRNUF9HRVRfUEFDS0VUX0lGKHBQYWNrZXQpKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCi0KLQkJLy8gQS1NU0RVIGhhcyBwYWRkaW5nIHRvIG11bHRpcGxlIG9mIDQgaW5jbHVkaW5nIHN1YmZyYW1lIGhlYWRlci4KLQkJLy8gYWxpZ24gU3ViRnJhbWVTaXplIHVwIHRvIG11bHRpcGxlIG9mIDQKLQkJU3ViRnJhbWVTaXplID0gKFN1YkZyYW1lU2l6ZSszKSYofjB4Myk7Ci0KLQotCQlpZiAoU3ViRnJhbWVTaXplID4gMTUyOCB8fCBTdWJGcmFtZVNpemUgPCAzMikKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoRGF0YVNpemUgPiBTdWJGcmFtZVNpemUpCi0JCXsKLQkJCXBEYXRhICs9IFN1YkZyYW1lU2l6ZTsKLQkJCURhdGFTaXplIC09IFN1YkZyYW1lU2l6ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIGVuZCBvZiBBLU1TRFUKLQkJCURhdGFTaXplID0gMDsKLQkJfQotCX0KLQotCS8vIGZpbmFsbHkgcmVsZWFzZSBvcmlnaW5hbCByeCBwYWNrZXQKLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gbk1TRFU7Ci19Ci0KLQotVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQVUNIQVIJCQlwRGF0YTsKLQlVU0hPUlQJCQlEYXRhU2l6ZTsKLQlVSU5UCQkJbk1TRFUgPSAwOwotCi0JcERhdGEgPSAoUFVDSEFSKSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JRGF0YVNpemUgPSAoVVNIT1JUKSBHRVRfT1NfUEtUX0xFTihwUGFja2V0KTsKLQotCW5NU0RVID0gZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUGFja2V0LCBwRGF0YSwgRGF0YVNpemUpOwotCi0JcmV0dXJuIG5NU0RVOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTG9vayB1cCB0aGUgTUFDIGFkZHJlc3MgaW4gdGhlIE1BQyB0YWJsZS4gUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgotCVJldHVybjoKLQkJcEVudHJ5IC0gcG9pbnRlciB0byB0aGUgTUFDIGVudHJ5OyBOVUxMIGlzIG5vdCBmb3VuZAotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUxvb2t1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlQVUNIQVIgcEFkZHIpCi17Ci0JVUxPTkcgSGFzaElkeDsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7Ci0KLQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7Ci0JcEVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKLQotCXdoaWxlIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNXRFMgfHwgcEVudHJ5LT5WYWxpZEFzQXBDbGkgfHwgcEVudHJ5LT5WYWxpZEFzTWVzaCkpCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7Ci0JfQotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotTUFDX1RBQkxFX0VOVFJZICpNYWNUYWJsZUluc2VydEVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIJCQlwQWRkciwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCUlOIEJPT0xFQU4JQ2xlYW5BbGwpCi17Ci0JVUNIQVIgSGFzaElkeDsKLQlpbnQgaSwgRmlyc3RXY2lkOwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnk7Ci0vLwlVU0hPUlQJb2Zmc2V0OwotLy8JVUxPTkcJYWRkcjsKLQotCS8vIGlmIEZVTEwsIHJldHVybgotCWlmIChwQWQtPk1hY1RhYi5TaXplID49IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCQlyZXR1cm4gTlVMTDsKLQotCUZpcnN0V2NpZCA9IDE7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0JCUZpcnN0V2NpZCA9IDI7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5Ci0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQlmb3IgKGkgPSBGaXJzdFdjaWQ7IGk8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspICAgLy8gc2tpcCBlbnRyeSMwIHNvIHRoYXQgImVudHJ5IGluZGV4ID09IEFJRCIgZm9yIGZhc3QgbG9va3VwCi0JewotCQkvLyBwaWNrIHVwIHRoZSBmaXJzdCBhdmFpbGFibGUgdmFjYW5jeQotCQlpZiAoKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBGQUxTRSkgJiYKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNXRFMgPT0gRkFMU0UpICYmCi0JCQkocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQXBDbGk9PSBGQUxTRSkgJiYKLQkJCShwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNNZXNoID09IEZBTFNFKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJJiYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0RscyA9PSBGQUxTRSkKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCSkKLQkJewotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0JCQlpZiAoQ2xlYW5BbGwgPT0gVFJVRSkKLQkJCXsKLQkJCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IFJBVEVfMTE7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7Ci0JCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOwotCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCQl9Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQlpZiAoYXBpZHggPj0gTUlOX05FVF9ERVZJQ0VfRk9SX0RMUykKLQkJCXsKLQkJCQlwRW50cnktPlZhbGlkQXNDTEkgPSBGQUxTRTsKLQkJCQlwRW50cnktPlZhbGlkQXNXRFMgPSBGQUxTRTsKLQkJCQlwRW50cnktPlZhbGlkQXNBcENsaSA9IEZBTFNFOwotCQkJCXBFbnRyeS0+VmFsaWRBc01lc2ggPSBGQUxTRTsKLQkJCQlwRW50cnktPlZhbGlkQXNEbHMgPSBUUlVFOwotCQkJCXBFbnRyeS0+aXNDYWNoZWQgPSBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJewotCQkJCQlwRW50cnktPlZhbGlkQXNDTEkgPSBUUlVFOwotCQkJCQlwRW50cnktPlZhbGlkQXNXRFMgPSBGQUxTRTsKLQkJCQkJcEVudHJ5LT5WYWxpZEFzQXBDbGkgPSBGQUxTRTsKLQkJCQkJcEVudHJ5LT5WYWxpZEFzTWVzaCA9IEZBTFNFOwotCQkJCQlwRW50cnktPlZhbGlkQXNEbHMgPSBGQUxTRTsKLQkJCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQl9Ci0KLQkJCXBFbnRyeS0+YklBbUJhZEF0aGVyb3MgPSBGQUxTRTsKLQkJCXBFbnRyeS0+cEFkID0gcEFkOwotCQkJcEVudHJ5LT5DTVRpbWVyUnVubmluZyA9IEZBTFNFOwotCQkJcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7Ci0JCQlwRW50cnktPlJTTklFX0xlbiA9IDA7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7Ci0JCQlwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFI7Ci0KLQkJCWlmIChwRW50cnktPlZhbGlkQXNNZXNoKQotCQkJCXBFbnRyeS0+YXBpZHggPSAoYXBpZHggLSBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCk7Ci0JCQllbHNlIGlmIChwRW50cnktPlZhbGlkQXNBcENsaSkKLQkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKTsKLQkJCWVsc2UgaWYgKHBFbnRyeS0+VmFsaWRBc1dEUykKLQkJCQlwRW50cnktPmFwaWR4ID0gKGFwaWR4IC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUyk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQllbHNlIGlmIChwRW50cnktPlZhbGlkQXNEbHMpCi0JCQkJcEVudHJ5LT5hcGlkeCA9IChhcGlkeCAtIE1JTl9ORVRfREVWSUNFX0ZPUl9ETFMpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJZWxzZQotCQkJCXBFbnRyeS0+YXBpZHggPSBhcGlkeDsKLQotCi0JCQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotCQkJCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCQkJcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCUFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgcEVudHJ5LT5hcGlkeCwgKFVDSEFSKWkpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQotCQkJcEVudHJ5LT5HVEtTdGF0ZSA9IFJFS0VZX05FR09USUFUSU5HOwotCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAwOwotCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCWlmIChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKLQkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQllbHNlCi0jZW5kaWYgLy9RT1NfRExTX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCi0JCQlwRW50cnktPlBNS0lEX0NhY2hlSWR4ID0gRU5UUllfTk9UX0ZPVU5EOwotCQkJQ09QWV9NQUNfQUREUihwRW50cnktPkFkZHIsIHBBZGRyKTsKLQkJCXBFbnRyeS0+U3N0ID0gU1NUX05PVF9BVVRIOwotCQkJcEVudHJ5LT5BdXRoU3RhdGUgPSBBU19OT1RfQVVUSDsKLQkJCXBFbnRyeS0+QWlkID0gKFVTSE9SVClpOyAgLy8wOwotCQkJcEVudHJ5LT5DYXBhYmlsaXR5SW5mbyA9IDA7Ci0JCQlwRW50cnktPlBzTW9kZSA9IFBXUl9BQ1RJVkU7Ci0JCQlwRW50cnktPlBzUUlkbGVDb3VudCA9IDA7Ci0JCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7Ci0JCQlwRW50cnktPkFzc29jRGVhZExpbmUgPSBNQUNfVEFCTEVfQVNTT0NfVElNRU9VVDsKLQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQgPSAwOwotI2lmZGVmIFdEU19TVVBQT1JUCi0JCQlwRW50cnktPkxvY2tFbnRyeVR4ID0gRkFMU0U7Ci0JCQlwRW50cnktPlRpbWVTdGFtcF90b1R4UmluZyA9IDA7Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLQkJCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEVudHJ5LT5Qc1F1ZXVlKTsKLQotCi0JCQlwQWQtPk1hY1RhYi5TaXplICsrOwotCQkJLy8gQWRkIHRoaXMgZW50cnkgaW50byBBU0lDIFJYIFdDSUQgc2VhcmNoIHRhYmxlCi0JCQlSVE1QX1NUQV9FTlRSWV9BREQocEFkLCBwRW50cnkpOwotCi0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnRFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLGksIHBBZC0+TWFjVGFiLlNpemUpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy8gYWRkIHRoaXMgTUFDIGVudHJ5IGludG8gSEFTSCB0YWJsZQotCWlmIChwRW50cnkpCi0JewotCQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7Ci0JCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCXsKLQkJCXBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF0gPSBwRW50cnk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKLQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQotCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKLQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQl9Ci0JfQotCi0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQlyZXR1cm4gcEVudHJ5OwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCURlbGV0ZSBhIHNwZWNpZmllZCBjbGllbnQgZnJvbSBNQUMgdGFibGUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1hY1RhYmxlRGVsZXRlRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIHdjaWQsCi0JSU4gUFVDSEFSIHBBZGRyKQotewotCVVTSE9SVCBIYXNoSWR4OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5LCAqcFByZXZFbnRyeSwgKnBQcm9iZUVudHJ5OwotCUJPT0xFQU4gQ2FuY2VsbGVkOwotCS8vVVNIT1JUCW9mZnNldDsJLy8gdW51c2VkIHZhcmlhYmxlCi0JLy9VQ0hBUglqOwkJCS8vIHVudXNlZCB2YXJpYWJsZQotCi0JaWYgKHdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBGQUxTRTsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQlIYXNoSWR4ID0gTUFDX0FERFJfSEFTSF9JTkRFWChwQWRkcik7Ci0JLy9wRW50cnkgPSBwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdOwotCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOwotCi0JaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpIHx8IHBFbnRyeS0+VmFsaWRBc1dEUyB8fCBwRW50cnktPlZhbGlkQXNNZXNoCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCXx8IHBFbnRyeS0+VmFsaWRBc0RscwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkpKQotCXsKLQkJaWYgKE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7Ci0KLQkJCS8vIERlbGV0ZSB0aGlzIGVudHJ5IGZyb20gQVNJQyBvbi1jaGlwIFdDSUQgVGFibGUKLQkJCVJUTVBfU1RBX0VOVFJZX01BQ19SRVNFVChwQWQsIHdjaWQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyBmcmVlIHJlc291cmNlcyBvZiBCQQotCQkJQkFTZXNzaW9uVGVhckRvd25BTEwocEFkLCBwRW50cnktPkFpZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotCQkJcFByZXZFbnRyeSA9IE5VTEw7Ci0JCQlwUHJvYmVFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0JCQlBU1NFUlQocFByb2JlRW50cnkpOwotCi0JCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCQlkbwotCQkJewotCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQkJewotCQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCQl7Ci0JCQkJCQlwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7Ci0JCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7Ci0JCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJCS8vIG5vdCBmb3VuZCAhISEKLQkJCUFTU0VSVChwUHJvYmVFbnRyeSAhPSBOVUxMKTsKLQotCQkJUlRNUF9TVEFfRU5UUllfS0VZX0RFTChwQWQsIEJTUzAsIHdjaWQpOwotCi0KLQkJaWYgKHBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgIT0gRUFQT0xfU1RBUlRfRElTQUJMRSkKLQkJewotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPkVucXVldWVTdGFydEZvclBTS1RpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJCXBFbnRyeS0+RW5xdWV1ZUVhcG9sU3RhcnRUaW1lclJ1bm5pbmcgPSBFQVBPTF9TVEFSVF9ESVNBQkxFOwotICAgICAgICB9Ci0KLQotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoTUFDX1RBQkxFX0VOVFJZKSk7Ci0JCQlwQWQtPk1hY1RhYi5TaXplIC0tOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVEZWxldGVFbnRyeTEgLSBUb3RhbD0gJWRcbiIsIHBBZC0+TWFjVGFiLlNpemUpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiVzOiBJbXBvc3NpYmxlIFdjaWQgPSAlZCAhISEhIVxuIiwgX19GVU5DVElPTl9fLCB3Y2lkKSk7Ci0JCX0KLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0JLy9SZXNldCBvcGVyYXRpbmcgbW9kZSB3aGVuIG5vIFN0YS4KLQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA9PSAwKQotCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gMDsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJLy9Bc2ljVXBkYXRlUHJvdGVjdChwQWQsIDAgLypwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUqLywgKEFMTE5fU0VUUFJPVEVDVCksIFRSVUUsIDAgLypwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGKi8pOwotCQlSVE1QX1VQREFURV9QUk9URUNUKHBBZCk7ICAvLyBlZGl0IGJ5IGpvaG5saSwgZml4ICJpbl9pbnRlcnJ1cHQiIGVycm9yIHdoZW4gY2FsbCAiTWFjVGFibGVEZWxldGVFbnRyeSIgaW4gUnggdGFza2xldAotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyByb3V0aW5lIHJlc2V0IHRoZSBlbnRpcmUgTUFDIHRhYmxlLiBBbGwgcGFja2V0cyBwZW5kaW5nIGluCi0JCXRoZSBwb3dlci1zYXZpbmcgcXVldWVzIGFyZSBmcmVlZCBoZXJlLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWFjVGFibGVSZXNldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgcEFkKQotewotCWludCAgICAgICAgIGk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWNUYWJsZVJlc2V0XG4iKSk7Ci0JLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCi0KLQlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJUlRNUF9TVEFfRU5UUllfTUFDX1JFU0VUKHBBZCwgaSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCWlmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlZhbGlkQXNDTEkgPT0gVFJVRSkKLQkgICB7Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJLy8gZnJlZSByZXNvdXJjZXMgb2YgQkEKLQkJCUJBU2Vzc2lvblRlYXJEb3duQUxMKHBBZCwgaSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9IEZBTFNFOwotCi0KLQotCi0JCQkvL0FzaWNEZWxXY2lkVGFiKHBBZCwgaSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFzc29jUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqQXNzb2NSZXEsCi0JSU4gUFVDSEFSICAgICAgICAgICAgICAgICAgICAgcEFkZHIsCi0JSU4gVVNIT1JUICAgICAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8sCi0JSU4gVUxPTkcgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCwKLQlJTiBVU0hPUlQgICAgICAgICAgICAgICAgICAgICBMaXN0ZW5JbnR2KQotewotCUNPUFlfTUFDX0FERFIoQXNzb2NSZXEtPkFkZHIsIHBBZGRyKTsKLQkvLyBBZGQgbWFzayB0byBzdXBwb3J0IDgwMi4xMWIgbW9kZSBvbmx5Ci0JQXNzb2NSZXEtPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOyAvLyBub3QgY2YtcG9sbGFibGUsIG5vdCBjZi1wb2xsLXJlcXVlc3QKLQlBc3NvY1JlcS0+VGltZW91dCA9IFRpbWVvdXQ7Ci0JQXNzb2NSZXEtPkxpc3RlbkludHYgPSBMaXN0ZW5JbnR2OwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIERpc2Fzc29jUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAqRGlzYXNzb2NSZXEsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFVTSE9SVCBSZWFzb24pCi17Ci0JQ09QWV9NQUNfQUREUihEaXNhc3NvY1JlcS0+QWRkciwgcEFkZHIpOwotCURpc2Fzc29jUmVxLT5SZWFzb24gPSBSZWFzb247Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNoZWNrIHRoZSBvdXQgZ29pbmcgZnJhbWUsIGlmIHRoaXMgaXMgYW4gREhDUCBvciBBUlAgZGF0YWdyYW0KLQl3aWxsIGJlIGR1cGxpY2F0ZSBhbm90aGVyIGZyYW1lIGF0IGxvdyBkYXRhIHJhdGUgdHJhbnNtaXQuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwUGFja2V0CQlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQkJVG8gYmUgZHVwbGljYXRlIGF0IExvdyBkYXRhIHJhdGUgdHJhbnNtaXQuICgxbWIpCi0JCUZBTFNFCQlEbyBub3RoaW5nLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JCU1BQyBoZWFkZXIgKyBJUCBIZWFkZXIgKyBVRFAgSGVhZGVyCi0JCSAgMTQgQnl0ZXMJICAyMCBCeXRlcwotCi0JCVVEUCBIZWFkZXIKLQkJMDB8MDF8MDJ8MDN8MDR8MDV8MDZ8MDd8MDh8MDl8MTB8MTF8MTJ8MTN8MTR8MTV8Ci0JCQkJCQlTb3VyY2UgUG9ydAotCQkxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKLQkJCQkJRGVzdGluYXRpb24gUG9ydAotCi0JCXBvcnQgMHg0MyBtZWFucyBCb290c3RyYXAgUHJvdG9jb2wsIHNlcnZlci4KLQkJUG9ydCAweDQ0IG1lYW5zIEJvb3RzdHJhcCBQcm90b2NvbCwgY2xpZW50LgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1CT09MRUFOIFJUTVBDaGVja0RIQ1BGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVVMT05HCQkJTnVtYmVyT2ZCeXRlc1JlYWQgPSAwOwotCVVMT05HCQkJQ3VycmVudE9mZnNldCA9IDA7Ci0JUFZPSUQJCQlwVmlydHVhbEFkZHJlc3MgPSBOVUxMOwotCVVJTlQJCQlOZGlzQnVmZmVyTGVuZ3RoOwotCVBVQ0hBUgkJCXBTcmM7Ci0JVVNIT1JUCQkJUHJvdG9jb2w7Ci0JVUNIQVIJCQlCeXRlT2Zmc2V0MzYgPSAwOwotCVVDSEFSCQkJQnl0ZU9mZnNldDM4ID0gMDsKLQlCT09MRUFOCQkJUmVhZEZpcnN0UGFybSA9IFRSVUU7Ci0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgKFBVQ0hBUiAqKSZwVmlydHVhbEFkZHJlc3MsICZOZGlzQnVmZmVyTGVuZ3RoKTsKLQotCU51bWJlck9mQnl0ZXNSZWFkICs9IE5kaXNCdWZmZXJMZW5ndGg7Ci0JcFNyYyA9IChQVUNIQVIpIHBWaXJ0dWFsQWRkcmVzczsKLQlQcm90b2NvbCA9ICoocFNyYyArIDEyKSAqIDI1NiArICoocFNyYyArIDEzKTsKLQotCS8vCi0JLy8gQ2hlY2sgREhDUCAmIEJPT1RQIHByb3RvY29sCi0JLy8KLQl3aGlsZSAoTnVtYmVyT2ZCeXRlc1JlYWQgPD0gUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCkKLQl7Ci0JCWlmICgoTnVtYmVyT2ZCeXRlc1JlYWQgPj0gMzUpICYmIChSZWFkRmlyc3RQYXJtID09IFRSVUUpKQotCQl7Ci0JCQlDdXJyZW50T2Zmc2V0ID0gMzUgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKLQkJCUJ5dGVPZmZzZXQzNiA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOwotCQkJUmVhZEZpcnN0UGFybSA9IEZBTFNFOwotCQl9Ci0KLQkJaWYgKE51bWJlck9mQnl0ZXNSZWFkID49IDM3KQotCQl7Ci0JCQlDdXJyZW50T2Zmc2V0ID0gMzcgLSAoTnVtYmVyT2ZCeXRlc1JlYWQgLSBOZGlzQnVmZmVyTGVuZ3RoKTsKLQkJCUJ5dGVPZmZzZXQzOCA9ICoocFNyYyArIEN1cnJlbnRPZmZzZXQpOwotCQkJLy9FbmQgb2YgUmVhZAotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIENoZWNrIGZvciBESENQICYgQk9PVFAgcHJvdG9jb2wKLQlpZiAoKEJ5dGVPZmZzZXQzNiAhPSAweDQ0KSB8fCAoQnl0ZU9mZnNldDM4ICE9IDB4NDMpKQotCQl7Ci0JCS8vCi0JCS8vIDIwNTQgKGhleCAwODA2KSBmb3IgQVJQIGRhdGFncmFtcwotCQkvLyBpZiB0aGlzIHBhY2tldCBpcyBub3QgQVJQIGRhdGFncmFtcywgdGhlbiBkbyBub3RoaW5nCi0JCS8vIEFSUCBkYXRhZ3JhbXMgd2lsbCBhbHNvIGJlIGR1cGxpY2F0ZSBhdCAxbWIgYnJvYWRjYXN0IGZyYW1lcwotCQkvLwotCQlpZiAoUHJvdG9jb2wgIT0gMHgwODA2ICkKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotQk9PTEVBTiBSVE1QQ2hlY2tFdGhlclR5cGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JVVNIT1JUCVR5cGVMZW47Ci0JVUNIQVIJQnl0ZTAsIEJ5dGUxOwotCVBVQ0hBUglwU3JjQnVmOwotCVVJTlQzMglwa3RMZW47Ci0JVUlOVDE2CXNyY1BvcnQsIGRzdFBvcnQ7Ci0JQk9PTEVBTglzdGF0dXMgPSBUUlVFOwotCi0KLQlwU3JjQnVmID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCXBrdExlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCi0JQVNTRVJUKHBTcmNCdWYpOwotCi0JUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKHBQYWNrZXQsIDApOwotCi0JLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkCi0JVHlwZUxlbiA9IChwU3JjQnVmWzEyXSA8PCA4KSArIHBTcmNCdWZbMTNdOwotCi0JcFNyY0J1ZiArPSBMRU5HVEhfODAyXzM7CS8vIFNraXAgdGhlIEV0aGVybmV0IEhlYWRlci4KLQotCWlmIChUeXBlTGVuIDw9IDE1MDApCi0JewkvLyA4MDIuMywgODAyLjMgTExDCi0JCS8qCi0JCQlEZXN0TUFDKDYpICsgU3JjTUFDKDYpICsgTGVuZ2h0KDIpICsKLQkJCURTQVAoMSkgKyBTU0FQKDEpICsgQ29udHJvbCgxKSArCi0JCQlpZiB0aGUgRFNBUCA9IDB4QUEsIFNTQVA9MHhBQSwgQ29udG9ybCA9IDB4MDMsIGl0IGhhcyBhIDUtYnl0ZXMgU05BUCBoZWFkZXIuCi0JCQkJPT4gKyBTTkFQICg1LCBPcmlnaW5hdGlvbklEKDMpICsgZXRoZXJUeXBlKDIpKQotCQkqLwotCQlpZiAocFNyY0J1ZlswXSA9PSAweEFBICYmIHBTcmNCdWZbMV0gPT0gMHhBQSAmJiBwU3JjQnVmWzJdID09IDB4MDMpCi0JCXsKLQkJCVNuaWZmMkJ5dGVzRnJvbU5kaXNCdWZmZXIoKFBORElTX0JVRkZFUilwU3JjQnVmLCA2LCAmQnl0ZTAsICZCeXRlMSk7Ci0JCQlSVE1QX1NFVF9QQUNLRVRfTExDU05BUChwUGFja2V0LCAxKTsKLQkJCVR5cGVMZW4gPSAoVVNIT1JUKSgoQnl0ZTAgPDwgOCkgKyBCeXRlMSk7Ci0JCQlwU3JjQnVmICs9IDg7IC8vIFNraXAgdGhpcyBMTEMvU05BUCBoZWFkZXIKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vSXQganVzdCBoYXMgMy1ieXRlIExMQyBoZWFkZXIsIG1heWJlIGEgbGVnYWN5IGV0aGVyIHR5cGUgZnJhbWUuIHdlIGRpZG4ndCBoYW5kbGUgaXQuCi0JCX0KLQl9Ci0KLQkvLyBJZiBpdCdzIGEgVkxBTiBwYWNrZXQsIGdldCB0aGUgcmVhbCBUeXBlL0xlbmd0aCBmaWVsZC4KLQlpZiAoVHlwZUxlbiA9PSAweDgxMDApCi0JewotCQkvKiAweDgxMDAgbWVhbnMgVkxBTiBwYWNrZXRzICovCi0KLQkJLyogRGVzdC4gTUFDIEFkZHJlc3MgKDYtYnl0ZXMpICsKLQkJICAgU291cmNlIE1BQyBBZGRyZXNzICg2LWJ5dGVzKSArCi0JCSAgIExlbmd0aC9UeXBlID0gODAyLjFRIFRhZyBUeXBlICgyLWJ5dGUpICsKLQkJICAgVGFnIENvbnRyb2wgSW5mb3JtYXRpb24gKDItYnl0ZXMpICsKLQkJICAgTGVuZ3RoIC8gVHlwZSAoMi1ieXRlcykgKwotCQkgICBkYXRhIHBheWxvYWQgKDAtbiBieXRlcykgKwotCQkgICBQYWQgKDAtcCBieXRlcykgKwotCQkgICBGcmFtZSBDaGVjayBTZXF1ZW5jZSAoNC1ieXRlcykgKi8KLQotCQlSVE1QX1NFVF9QQUNLRVRfVkxBTihwUGFja2V0LCAxKTsKLQkJU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigoUE5ESVNfQlVGRkVSKXBTcmNCdWYsIDIsICZCeXRlMCwgJkJ5dGUxKTsKLQkJVHlwZUxlbiA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKLQotCQlwU3JjQnVmICs9IDQ7IC8vIFNraXAgdGhlIFZMQU4gSGVhZGVyLgotCX0KLQotCXN3aXRjaCAoVHlwZUxlbikKLQl7Ci0JCWNhc2UgMHgwODAwOgotCQkJewotCQkJCUFTU0VSVCgocGt0TGVuID4gMzQpKTsKLQkJCQlpZiAoKihwU3JjQnVmICsgOSkgPT0gMHgxMSkKLQkJCQl7CS8vIHVkcCBwYWNrZXQKLQkJCQkJQVNTRVJUKChwa3RMZW4gPiAzNCkpOwkvLyAxNCBmb3IgZXRoZXJuZXQgaGVhZGVyLCAyMCBmb3IgSVAgaGVhZGVyCi0KLQkJCQkJcFNyY0J1ZiArPSAyMDsJLy8gU2tpcCB0aGUgSVAgaGVhZGVyCi0JCQkJCXNyY1BvcnQgPSBPU19OVE9IUyhnZXRfdW5hbGlnbmVkKChQVUlOVDE2KShwU3JjQnVmKSkpOwotCQkJCQlkc3RQb3J0ID0gT1NfTlRPSFMoZ2V0X3VuYWxpZ25lZCgoUFVJTlQxNikocFNyY0J1ZisyKSkpOwotCi0JCQkJCWlmICgoc3JjUG9ydD09MHg0NCAmJiBkc3RQb3J0PT0weDQzKSB8fCAoc3JjUG9ydD09MHg0MyAmJiBkc3RQb3J0PT0weDQ0KSkKLQkJCQkJewkvL0l0J3MgYSBCT09UUC9ESENQIHBhY2tldAotCQkJCQkJUlRNUF9TRVRfUEFDS0VUX0RIQ1AocFBhY2tldCwgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAweDA4MDY6Ci0JCQl7Ci0JCQkJLy9BUlAgUGFja2V0LgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9ESENQKHBQYWNrZXQsIDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMHg4ODhlOgotCQkJewotCQkJCS8vIEVBUE9MIFBhY2tldC4KLQkJCQlSVE1QX1NFVF9QQUNLRVRfRUFQT0wocFBhY2tldCwgMSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0YXR1cyA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLQotfQotCi0KLQotVk9JRCBVcGRhdGVfUnNzaV9TYW1wbGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUlNTSV9TQU1QTEUJCSpwUnNzaSwKLQlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpCi0JCXsKLQlDSEFSCXJzc2kwID0gcFJ4V0ktPlJTU0kwOwotCUNIQVIJcnNzaTEgPSBwUnhXSS0+UlNTSTE7Ci0JQ0hBUglyc3NpMiA9IHBSeFdJLT5SU1NJMjsKLQotCWlmIChyc3NpMCAhPSAwKQotCXsKLQkJcFJzc2ktPkxhc3RSc3NpMAk9IENvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUilyc3NpMCwgUlNTSV8wKTsKLQkJcFJzc2ktPkF2Z1Jzc2kwWDgJPSAocFJzc2ktPkF2Z1Jzc2kwWDggLSBwUnNzaS0+QXZnUnNzaTApICsgcFJzc2ktPkxhc3RSc3NpMDsKLQkJcFJzc2ktPkF2Z1Jzc2kwCT0gcFJzc2ktPkF2Z1Jzc2kwWDggPj4gMzsKLQl9Ci0KLQlpZiAocnNzaTEgIT0gMCkKLQl7Ci0JCXBSc3NpLT5MYXN0UnNzaTEJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpcnNzaTEsIFJTU0lfMSk7Ci0JCXBSc3NpLT5BdmdSc3NpMVg4CT0gKHBSc3NpLT5BdmdSc3NpMVg4IC0gcFJzc2ktPkF2Z1Jzc2kxKSArIHBSc3NpLT5MYXN0UnNzaTE7Ci0JCXBSc3NpLT5BdmdSc3NpMQk9IHBSc3NpLT5BdmdSc3NpMVg4ID4+IDM7Ci0JfQotCi0JaWYgKHJzc2kyICE9IDApCi0JewotCQlwUnNzaS0+TGFzdFJzc2kyCT0gQ29udmVydFRvUnNzaShwQWQsIChDSEFSKXJzc2kyLCBSU1NJXzIpOwotCQlwUnNzaS0+QXZnUnNzaTJYOCAgPSAocFJzc2ktPkF2Z1Jzc2kyWDggLSBwUnNzaS0+QXZnUnNzaTIpICsgcFJzc2ktPkxhc3RSc3NpMjsKLQkJcFJzc2ktPkF2Z1Jzc2kyID0gcFJzc2ktPkF2Z1Jzc2kyWDggPj4gMzsKLQl9Ci19Ci0KLQotCi0vLyBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107Ci0KLQkvLyAxLiBnZXQgODAyLjMgSGVhZGVyCi0JLy8gMi4gcmVtb3ZlIExMQwotCS8vCQlhLiBwb2ludGVyIHBSeEJsay0+cERhdGEgdG8gcGF5bG9hZAotCS8vICAgICAgYi4gbW9kaWZ5IHBSeEJsay0+RGF0YVNpemUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlSVE1QXzgwMl8xMV9SRU1PVkVfTExDX0FORF9DT05WRVJUX1RPXzgwMl8zKHBSeEJsaywgSGVhZGVyODAyXzMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKHBSeEJsay0+RGF0YVNpemUgPiBNQVhfUlhfUEtUX0xFTikKLQl7Ci0KLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCVNUQVRTX0lOQ19SWF9QQUNLRVRTKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCi0KLQl3bGFuXzgwMl8xMV90b184MDJfM19wYWNrZXQocEFkLCBwUnhCbGssIEhlYWRlcjgwMl8zLCBGcm9tV2hpY2hCU1NJRCk7Ci0KLQkvLwotCS8vIHBhc3MgdGhpcyA4MDIuMyBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIgb3IgZm9yd2FyZCB0aGlzIHBhY2tldCB0byBXTSBkaXJlY3RseQotCS8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIEZyb21XaGljaEJTU0lEKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotfQotCi0KLS8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKLVZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVBEVSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9PSAwKSkKLQl7Ci0JCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSkpCi0JCXsKLQkJCS8vIGhhbmRsZSBBLU1TRFUKLQkJCUluZGljYXRlX0FNU0RVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJewotCQkJSW5kaWNhdGVfTGVnYWN5X1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JfQotfQotCi0KLVZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlVQ0hBUgkJCUhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107Ci0JVUlOVDE2CQkJTXNkdTJTaXplOwotCVVJTlQxNgkJCVBheWxvYWQxU2l6ZSwgUGF5bG9hZDJTaXplOwotCVBVQ0hBUgkJCXBEYXRhMjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDIgPSBOVUxMOwotCi0KLQotCU1zZHUyU2l6ZSA9ICoocFJ4QmxrLT5wRGF0YSkgKyAoKihwUnhCbGstPnBEYXRhKzEpIDw8IDgpOwotCi0JaWYgKChNc2R1MlNpemUgPD0gMTUzNikgJiYgKE1zZHUyU2l6ZSA8IHBSeEJsay0+RGF0YVNpemUpKQotCXsKLQkJLyogc2tpcCB0d28gYnl0ZSBNU0RVMiBsZW4gKi8KLQkJcFJ4QmxrLT5wRGF0YSArPSAyOwotCQlwUnhCbGstPkRhdGFTaXplIC09IDI7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIHJlbGVhc2UgcGFja2V0Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBnZXQgODAyLjMgSGVhZGVyIGFuZCAgcmVtb3ZlIExMQwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCVJUTVBfODAyXzExX1JFTU9WRV9MTENfQU5EX0NPTlZFUlRfVE9fODAyXzMocFJ4QmxrLCBIZWFkZXI4MDJfMyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCUFTU0VSVChwUnhCbGstPnBSeFBhY2tldCk7Ci0KLQkvLyBSYWxpbmsgQWdncmVnYXRpb24gZnJhbWUKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4QWdncmVnYXRpb25Db3VudCArKzsKLQlQYXlsb2FkMVNpemUgPSBwUnhCbGstPkRhdGFTaXplIC0gTXNkdTJTaXplOwotCVBheWxvYWQyU2l6ZSA9IE1zZHUyU2l6ZSAtIExFTkdUSF84MDJfMzsKLQotCXBEYXRhMiA9IHBSeEJsay0+cERhdGEgKyBQYXlsb2FkMVNpemUgKyBMRU5HVEhfODAyXzM7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJcFBhY2tldDIgPSBkdXBsaWNhdGVfcGt0KHBBZCwgKHBEYXRhMi1MRU5HVEhfODAyXzMpLCBMRU5HVEhfODAyXzMsIHBEYXRhMiwgUGF5bG9hZDJTaXplLCBGcm9tV2hpY2hCU1NJRCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAoIXBQYWNrZXQyKQotCXsKLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIHVwZGF0ZSBwYXlsb2FkIHNpemUgb2YgMXN0IHBhY2tldAotCXBSeEJsay0+RGF0YVNpemUgPSBQYXlsb2FkMVNpemU7Ci0Jd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KHBBZCwgcFJ4QmxrLCBIZWFkZXI4MDJfMywgRnJvbVdoaWNoQlNTSUQpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQU5OT1VOQ0VfT1JfRk9SV0FSRF84MDJfM19QQUNLRVQocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKHBQYWNrZXQyKQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCUFOTk9VTkNFX09SX0ZPUldBUkRfODAyXzNfUEFDS0VUKHBBZCwgcFBhY2tldDIsIEZyb21XaGljaEJTU0lEKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci19Ci0KLQotI2RlZmluZSBSRVNFVF9GUkFHRlJBTUUoX2ZyYWdGcmFtZSkgXAotCXsJCQkJCQkJCVwKLQkJX2ZyYWdGcmFtZS5SeFNpemUgPSAwOwkJXAotCQlfZnJhZ0ZyYW1lLlNlcXVlbmNlID0gMDsJXAotCQlfZnJhZ0ZyYW1lLkxhc3RGcmFnID0gMDsJXAotCQlfZnJhZ0ZyYW1lLkZsYWdzID0gMDsJCVwKLQl9Ci0KLQotUE5ESVNfUEFDS0VUIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCi17Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0JVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7Ci0JVUNIQVIJCQkqcEZyYWdCdWZmZXIgPSBOVUxMOwotCUJPT0xFQU4JCQliUmVhc3NEb25lID0gRkFMU0U7Ci0JVUNIQVIJCQlIZWFkZXJSb29tID0gMDsKLQotCi0JQVNTRVJUKHBIZWFkZXIpOwotCi0JSGVhZGVyUm9vbSA9IHBEYXRhIC0gKFVDSEFSICopcEhlYWRlcjsKLQotCS8vIFJlLWFzc2VtYmxlIHRoZSBmcmFnbWVudGVkIHBhY2tldHMKLQlpZiAocEhlYWRlci0+RnJhZyA9PSAwKQkJLy8gRnJhZy4gTnVtYmVyIGlzIDAgOiBGaXJzdCBmcmFnIG9yIG9ubHkgb25lIHBrdAotCXsKLQkJLy8gdGhlIGZpcnN0IHBrdCBvZiBmcmFnbWVudCwgcmVjb3JkIGl0LgotCQlpZiAocEhlYWRlci0+RkMuTW9yZUZyYWcpCi0JCXsKLQkJCUFTU0VSVChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0JCQlwRnJhZ0J1ZmZlciA9IEdFVF9PU19QS1RfREFUQVBUUihwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCk7Ci0JCQlwQWQtPkZyYWdGcmFtZS5SeFNpemUgICA9IERhdGFTaXplICsgSGVhZGVyUm9vbTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBGcmFnQnVmZmVyLAkgcEhlYWRlciwgcEFkLT5GcmFnRnJhbWUuUnhTaXplKTsKLQkJCXBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlID0gcEhlYWRlci0+U2VxdWVuY2U7Ci0JCQlwQWQtPkZyYWdGcmFtZS5MYXN0RnJhZyA9IHBIZWFkZXItPkZyYWc7CSAgIC8vIFNob3VsZCBiZSAwCi0JCQlBU1NFUlQocEFkLT5GcmFnRnJhbWUuTGFzdEZyYWcgPT0gMCk7Ci0JCQlnb3RvIGRvbmU7CS8vIGVuZCBvZiBwcm9jZXNzaW5nIHRoaXMgZnJhbWUKLQkJfQotCX0KLQllbHNlCS8vTWlkZGxlICYgRW5kIG9mIGZyYWdtZW50Ci0JewotCQlpZiAoKHBIZWFkZXItPlNlcXVlbmNlICE9IHBBZC0+RnJhZ0ZyYW1lLlNlcXVlbmNlKSB8fAotCQkJKHBIZWFkZXItPkZyYWcgIT0gKHBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnICsgMSkpKQotCQl7Ci0JCQkvLyBGcmFnbWVudCBpcyBub3QgdGhlIHNhbWUgc2VxdWVuY2Ugb3Igb3V0IG9mIGZyYWdtZW50IG51bWJlciBvcmRlcgotCQkJLy8gUmVzZXQgRnJhZ21lbnQgY29udHJvbCBibGsKLQkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGcmFnbWVudCBpcyBub3QgdGhlIHNhbWUgc2VxdWVuY2Ugb3Igb3V0IG9mIGZyYWdtZW50IG51bWJlciBvcmRlci5cbiIpKTsKLQkJCWdvdG8gZG9uZTsgLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSArIERhdGFTaXplKSA+IE1BWF9GUkFNRV9TSVpFKQotCQl7Ci0JCQkvLyBGcmFnbWVudCBmcmFtZSBpcyB0b28gbGFyZ2UsIGl0IGV4ZWVkcyB0aGUgbWF4aW11bSBmcmFtZSBzaXplLgotCQkJLy8gUmVzZXQgRnJhZ21lbnQgY29udHJvbCBibGsKLQkJCVJFU0VUX0ZSQUdGUkFNRShwQWQtPkZyYWdGcmFtZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJGcmFnbWVudCBmcmFtZSBpcyB0b28gbGFyZ2UsIGl0IGV4ZWVkcyB0aGUgbWF4aW11bSBmcmFtZSBzaXplLlxuIikpOwotCQkJZ290byBkb25lOyAvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJfQotCi0gICAgICAgIC8vCi0JCS8vIEJyb2FkY29tIEFQKEJDTTk0NzA0QUdSKSB3aWxsIHNlbmQgb3V0IExMQyBpbiBmcmFnbWVudCdzIHBhY2tldCwgTExDIG9ubHkgY2FuIGFjY3BldCBhdCBmaXJzdCBmcmFnbWVudC4KLQkJLy8gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGRyb3B0IGl0LgotCQkvLwotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBEYXRhLCBTTkFQXzgwMl8xSCwgc2l6ZW9mKFNOQVBfODAyXzFIKSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkZpbmQgYW5vdGhlciBMTEMgYXQgTWlkZGxlIG9yIEVuZCBmcmFnbWVudChTTj0lZCwgRnJhZz0lZClcbiIsIHBIZWFkZXItPlNlcXVlbmNlLCBwSGVhZGVyLT5GcmFnKSk7Ci0JCQlnb3RvIGRvbmU7IC8vIGdpdmUgdXAgdGhpcyBmcmFtZQotCQl9Ci0KLQkJcEZyYWdCdWZmZXIgPSBHRVRfT1NfUEtUX0RBVEFQVFIocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQpOwotCi0JCS8vIGNvbmNhdGVuYXRlIHRoaXMgZnJhZ21lbnQgaW50byB0aGUgcmUtYXNzZW1ibHkgYnVmZmVyCi0JCU5kaXNNb3ZlTWVtb3J5KChwRnJhZ0J1ZmZlciArIHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSksIHBEYXRhLCBEYXRhU2l6ZSk7Ci0JCXBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAgKz0gRGF0YVNpemU7Ci0JCXBBZC0+RnJhZ0ZyYW1lLkxhc3RGcmFnID0gcEhlYWRlci0+RnJhZzsJICAgLy8gVXBkYXRlIGZyYWdtZW50IG51bWJlcgotCi0JCS8vIExhc3QgZnJhZ21lbnQKLQkJaWYgKHBIZWFkZXItPkZDLk1vcmVGcmFnID09IEZBTFNFKQotCQl7Ci0JCQliUmVhc3NEb25lID0gVFJVRTsKLQkJfQotCX0KLQotZG9uZToKLQkvLyBhbHdheXMgcmVsZWFzZSByeCBmcmFnbWVudGVkIHBhY2tldAotCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JLy8gcmV0dXJuIGRlZnJhZ21lbnRlZCBwYWNrZXQgaWYgcGFja2V0IGlzIHJlYXNzZW1ibGVkIGNvbXBsZXRlbHkKLQkvLyBvdGhlcndpc2UgcmV0dXJuIE5VTEwKLQlpZiAoYlJlYXNzRG9uZSkKLQl7Ci0JCVBORElTX1BBQ0tFVCBwTmV3RnJhZ1BhY2tldDsKLQotCQkvLyBhbGxvY2F0ZSBhIG5ldyBwYWNrZXQgYnVmZmVyIGZvciBmcmFnbWVudAotCQlwTmV3RnJhZ1BhY2tldCA9IFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX05PUk1TSVpFKTsKLQkJaWYgKHBOZXdGcmFnUGFja2V0KQotCQl7Ci0JCQkvLyB1cGRhdGUgUnhCbGsKLQkJCXBSZXRQYWNrZXQgPSBwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldDsKLQkJCXBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0ID0gcE5ld0ZyYWdQYWNrZXQ7Ci0JCQlwUnhCbGstPnBIZWFkZXIgPSAoUEhFQURFUl84MDJfMTEpIEdFVF9PU19QS1RfREFUQVBUUihwUmV0UGFja2V0KTsKLQkJCXBSeEJsay0+cERhdGEgPSAoVUNIQVIgKilwUnhCbGstPnBIZWFkZXIgKyBIZWFkZXJSb29tOwotCQkJcFJ4QmxrLT5EYXRhU2l6ZSA9IHBBZC0+RnJhZ0ZyYW1lLlJ4U2l6ZSAtIEhlYWRlclJvb207Ci0JCQlwUnhCbGstPnBSeFBhY2tldCA9IHBSZXRQYWNrZXQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSRVNFVF9GUkFHRlJBTUUocEFkLT5GcmFnRnJhbWUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHBSZXRQYWNrZXQ7Ci19Ci0KLQotVk9JRCBJbmRpY2F0ZV9BTVNEVV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVVJTlQJCQluTVNEVTsKLQotCXVwZGF0ZV9vc19wYWNrZXRfaW5mbyhwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCVJUTVBfU0VUX1BBQ0tFVF9JRihwUnhCbGstPnBSeFBhY2tldCwgRnJvbVdoaWNoQlNTSUQpOwotCW5NU0RVID0gZGVhZ2dyZWdhdGVfQU1TRFVfYW5ub3VuY2UocEFkLCBwUnhCbGstPnBSeFBhY2tldCwgcFJ4QmxrLT5wRGF0YSwgcFJ4QmxrLT5EYXRhU2l6ZSk7Ci19Ci0KLVZPSUQgSW5kaWNhdGVfRUFQT0xfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKHBFbnRyeSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJJbmRpY2F0ZV9FQVBPTF9QYWNrZXQ6IGRyb3AgYW5kIHJlbGVhc2UgdGhlIGludmFsaWQgcGFja2V0LlxuIikpOwotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm47Ci0JfQotfQotCi0jZGVmaW5lIEJDTl9UQlRUX09GRlNFVAkJNjQJLy9kZWZlciA2NCB1cwotVk9JRCBSZVN5bmNCZWFjb25UaW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKQotewotCi0JVUlOVDMyICBPZmZzZXQ7Ci0KLQotCU9mZnNldCA9IChwQWQtPlRidHRUaWNrQ291bnQpICUgKEJDTl9UQlRUX09GRlNFVCk7Ci0KLQlwQWQtPlRidHRUaWNrQ291bnQrKzsKLQotCS8vCi0JLy8gVGhlIHVwZGF0ZWQgQmVhY29uSW50ZXJ2YWwgVmFsdWUgd2lsbCBhZmZlY3QgQmVhY29uIEludGVydmFsIGFmdGVyIHR3byBUQlRUCi0JLy8gYmVhY2FzdWUgdGhlIG9yaWdpbmFsIEJlYWNvbkludGVydmFsIGhhZCBiZWVuIGxvYWRlZCBpbnRvIG5leHQgVEJUVF9USU1FUgotCS8vCi0JaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VULTIpKQotCXsKLQkJQkNOX1RJTUVfQ0ZHX1NUUlVDIGNzcjsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBCQ05fVElNRV9DRkcsICZjc3Iud29yZCk7Ci0JCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPDwgNCkgLSAxIDsJLy8gQVNJQyByZWdpc3RlciBpbiB1bml0cyBvZiAxLzE2IFRVID0gNjR1cwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKE9mZnNldCA9PSAoQkNOX1RCVFRfT0ZGU0VULTEpKQotCQl7Ci0JCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQkJCWNzci5maWVsZC5CZWFjb25JbnRlcnZhbCA9IChwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QpIDw8IDQ7IC8vIEFTSUMgcmVnaXN0ZXIgaW4gdW5pdHMgb2YgMS8xNiBUVQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQkNOX1RJTUVfQ0ZHLCBjc3Iud29yZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fZGF0YV9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRmODE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9kYXRhX3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qCi0gICBBbGwgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBtdXN0IGJlIFBDSS1kZXBlbmRlZCwgb3IgeW91IHNob3VsZCBvdXQgeW91ciBmdW5jdGlvbgotCWluIG90aGVyIGZpbGVzLgotCi0qLwotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVTSE9SVCBSdG1wUENJX1dyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX0FNU0RVX0ZSQU1FKQotCXsKLQkJLy9od0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbi1MRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFELCA0KStMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEOwotCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiAtIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vaHdIZWFkZXJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOwotCQlod0hlYWRlckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCX0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKLQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotCi0JcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JcFR4RC0+U0RMZW4xID0gcFR4QmxrLT5TcmNCdWZMZW47Ci0JcFR4RC0+TGFzdFNlYzAgPSAwOwotCXBUeEQtPkxhc3RTZWMxID0gKGJJc0xhc3QpID8gMSA6IDA7Ci0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotfQotCi0KLVVTSE9SVCBSdG1wUENJX1dyaXRlU2luZ2xlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCUJPT0xFQU4JCQliSXNMYXN0LAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGVhZGVyTGVuOwotCi0JLy8KLQkvLyBnZXQgVHggUmluZyBSZXNvdXJjZQotCS8vCi0JcFR4UmluZyA9ICZwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF07Ci0JVHhJZHggPSBwQWQtPlR4UmluZ1twVHhCbGstPlF1ZUlkeF0uVHhDcHVJZHg7Ci0JcERNQUhlYWRlckJ1ZlZBID0gKFBVQ0hBUikgcFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jVmE7Ci0JQnVmQmFzZVBhTG93ID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCi0JLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCS8vaHdIZWFkZXJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4sIDQpOwotCWh3SGVhZGVyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5IZHJQYWRMZW47Ci0KLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuKTsKLQotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gcFR4QmxrLT5wUGFja2V0OwotCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCVR4RCA9ICpwRGVzdFR4RDsKLQlwVHhEID0gJlR4RDsKLSNlbmRpZgotCU5kaXNaZXJvTWVtb3J5KHBUeEQsIFRYRF9TSVpFKTsKLQotCXBUeEQtPlNEUHRyMCA9IEJ1ZkJhc2VQYUxvdzsKLQlwVHhELT5TRExlbjAgPSBUWElORk9fU0laRSArIFRYV0lfU0laRSArIGh3SGVhZGVyTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSksIFRZUEVfVFhXSSk7Ci0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKLQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCVJldFR4SWR4ID0gVHhJZHg7Ci0JLy8KLQkvLyBVcGRhdGUgVHggaW5kZXgKLQkvLwotCUlOQ19SSU5HX0lOREVYKFR4SWR4LCBUWF9SSU5HX1NJWkUpOwotCXBUeFJpbmctPlR4Q3B1SWR4ID0gVHhJZHg7Ci0KLQkqRnJlZU51bWJlciAtPSAxOwotCi0JcmV0dXJuIFJldFR4SWR4OwotfQotCi0KLVVTSE9SVCBSdG1wUENJX1dyaXRlTXVsdGlUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlmcmFtZU51bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpCi17Ci0JQk9PTEVBTiBiSXNMYXN0OwotCVVDSEFSCQkJKnBETUFIZWFkZXJCdWZWQTsKLQlVU0hPUlQJCQlUeElkeCwgUmV0VHhJZHg7Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlVSU5UMzIJCQlCdWZCYXNlUGFMb3c7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nOwotCVVTSE9SVAkJCWh3SGRyTGVuOwotCVVJTlQzMgkJCWZpcnN0RE1BTGVuOwotCi0JYklzTGFzdCA9ICgoZnJhbWVOdW0gPT0gKHBUeEJsay0+VG90YWxGcmFtZU51bSAtIDEpKSA/IDEgOiAwKTsKLQotCS8vCi0JLy8gZ2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OwotCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKLQotCWlmIChmcmFtZU51bSA9PSAwKQotCXsKLQkJLy8gY29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCQlpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9BTVNEVV9GUkFNRSkKLQkJCS8vaHdIZHJMZW4gPSBST1VORF9VUChwVHhCbGstPk1wZHVIZWFkZXJMZW4tTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCwgNCkrTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQkJCWh3SGRyTGVuID0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuIC0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRCArIHBUeEJsay0+SGRyUGFkTGVuICsgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQkJZWxzZSBpZiAocFR4QmxrLT5UeEZyYW1lVHlwZSA9PSBUWF9SQUxJTktfRlJBTUUpCi0JCQkvL2h3SGRyTGVuID0gUk9VTkRfVVAocFR4QmxrLT5NcGR1SGVhZGVyTGVuLUxFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRCwgNCkrTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxEOwotCQkJaHdIZHJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gLSBMRU5HVEhfQVJBTElOS19IRUFERVJfRklFTEQgKyBwVHhCbGstPkhkclBhZExlbiArIExFTkdUSF9BUkFMSU5LX0hFQURFUl9GSUVMRDsKLQkJZWxzZQotCQkJLy9od0hkckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JCQlod0hkckxlbiA9IHBUeEJsay0+TXBkdUhlYWRlckxlbiArIHBUeEJsay0+SGRyUGFkTGVuOwotCi0JCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hkckxlbjsKLQl9Ci0JZWxzZQotCXsKLQkJZmlyc3RETUFMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47Ci0JfQotCi0JTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBLCBwVHhCbGstPkhlYWRlckJ1ZiwgZmlyc3RETUFMZW4pOwotCi0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQgPSBwVHhCbGstPnBQYWNrZXQ7Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQotCS8vCi0JLy8gYnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JVHhEID0gKnBEZXN0VHhEOwotCXBUeEQgPSAmVHhEOwotI2VuZGlmCi0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JcFR4RC0+U0RQdHIwID0gQnVmQmFzZVBhTG93OwotCXBUeEQtPlNETGVuMCA9IGZpcnN0RE1BTGVuOyAvLyBpbmNsdWRlIHBhZGRpbmcKLQlwVHhELT5TRFB0cjEgPSBQQ0lfTUFQX1NJTkdMRShwQWQsIHBUeEJsaywgMCwgMSwgUENJX0RNQV9UT0RFVklDRSk7OwotCXBUeEQtPlNETGVuMSA9IHBUeEJsay0+U3JjQnVmTGVuOwotCXBUeEQtPkxhc3RTZWMwID0gMDsKLQlwVHhELT5MYXN0U2VjMSA9IChiSXNMYXN0KSA/IDEgOiAwOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JaWYgKGZyYW1lTnVtID09IDApCi0JCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSsgVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUpLCBESVJfV1JJVEUsIEZBTFNFKTsKLQotCWlmIChmcmFtZU51bSAhPSAwKQotCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUikocERNQUhlYWRlckJ1ZlZBICsgVFhJTkZPX1NJWkUpLCBUWVBFX1RYV0kpOwotCi0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQlSZXRUeElkeCA9IFR4SWR4OwotCS8vCi0JLy8gVXBkYXRlIFR4IGluZGV4Ci0JLy8KLQlJTkNfUklOR19JTkRFWChUeElkeCwgVFhfUklOR19TSVpFKTsKLQlwVHhSaW5nLT5UeENwdUlkeCA9IFR4SWR4OwotCi0JKkZyZWVOdW1iZXIgLT0gMTsKLQotCXJldHVybiBSZXRUeElkeDsKLQotfQotCi0KLVZPSUQgUnRtcFBDSV9GaW5hbFdyaXRlVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVTSE9SVAkJCXRvdGFsTVBEVVNpemUsCi0JSU4JVVNIT1JUCQkJRmlyc3RUeElkeCkKLXsKLQotCVBUWFdJX1NUUlVDCQlwVHhXSTsKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XTsKLQlwVHhXSSA9IChQVFhXSV9TVFJVQykgcFR4UmluZy0+Q2VsbFtGaXJzdFR4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQlwVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50ID0gdG90YWxNUERVU2l6ZTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi19Ci0KLQotVk9JRCBSdG1wUENJRGF0YUxhc3RUeElkeCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVU0hPUlQJCQlMYXN0VHhJZHgpCi17Ci0JUFRYRF9TVFJVQwkJcFR4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUFRYRF9TVFJVQyAgICAgIHBEZXN0VHhEOwotICAgIFRYRF9TVFJVQyAgICAgICBUeEQ7Ci0jZW5kaWYKLQlQUlRNUF9UWF9SSU5HCXBUeFJpbmc7Ci0KLQkvLwotCS8vIGdldCBUeCBSaW5nIFJlc291cmNlCi0JLy8KLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0KLQkvLwotCS8vIGJ1aWxkIFR4IERlc2NyaXB0b3IKLQkvLwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW0xhc3RUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0JcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtMYXN0VHhJZHhdLkFsbG9jVmE7Ci0JVHhEID0gKnBEZXN0VHhEOwotCXBUeEQgPSAmVHhEOwotI2VuZGlmCi0KLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLX0KLQotCi1VU0hPUlQJUnRtcFBDSV9Xcml0ZUZyYWdUeFJlc291cmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlmcmFnTnVtLAotCU9VVAlVU0hPUlQJCQkqRnJlZU51bWJlcikKLXsKLQlVQ0hBUgkJCSpwRE1BSGVhZGVyQnVmVkE7Ci0JVVNIT1JUCQkJVHhJZHgsIFJldFR4SWR4OwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JVUlOVDMyCQkJQnVmQmFzZVBhTG93OwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlVU0hPUlQJCQlod0hlYWRlckxlbjsKLQlVSU5UMzIJCQlmaXJzdERNQUxlbjsKLQotCS8vCi0JLy8gR2V0IFR4IFJpbmcgUmVzb3VyY2UKLQkvLwotCXBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdOwotCVR4SWR4ID0gcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4OwotCXBETUFIZWFkZXJCdWZWQSA9IChQVUNIQVIpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCUJ1ZkJhc2VQYUxvdyA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1BhKTsKLQotCS8vCi0JLy8gQ29weSBUWElORk8gKyBUWFdJICsgV0xBTiBIZWFkZXIgKyBMTEMgaW50byBETUEgSGVhZGVyIEJ1ZmZlcgotCS8vCi0JLy9od0hlYWRlckxlbiA9IFJPVU5EX1VQKHBUeEJsay0+TXBkdUhlYWRlckxlbiwgNCk7Ci0JaHdIZWFkZXJMZW4gPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPkhkclBhZExlbjsKLQotCWZpcnN0RE1BTGVuID0gVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkUgKyBod0hlYWRlckxlbjsKLQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkEsIHBUeEJsay0+SGVhZGVyQnVmLCBmaXJzdERNQUxlbik7Ci0KLQotCS8vCi0JLy8gQnVpbGQgVHggRGVzY3JpcHRvcgotCS8vCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JVHhEID0gKnBEZXN0VHhEOwotCXBUeEQgPSAmVHhEOwotI2VuZGlmCi0JTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCi0JaWYgKGZyYWdOdW0gPT0gcFR4QmxrLT5Ub3RhbEZyYWdOdW0pCi0JewotCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IHBUeEJsay0+cFBhY2tldDsKLQkJcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQl9Ci0KLQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JcFR4RC0+U0RMZW4wID0gZmlyc3RETUFMZW47IC8vIGluY2x1ZGUgcGFkZGluZwotCXBUeEQtPlNEUHRyMSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFR4QmxrLCAwLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlwVHhELT5TRExlbjEgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JcFR4RC0+TGFzdFNlYzEgPSAxOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgRkFMU0UsIEZJRk9fRURDQSk7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpKHBETUFIZWFkZXJCdWZWQSArIFRYSU5GT19TSVpFKSwgVFlQRV9UWFdJKTsKLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCAoUFVDSEFSKShwRE1BSGVhZGVyQnVmVkEgKyBUWElORk9fU0laRSArIFRYV0lfU0laRSksIERJUl9XUklURSwgRkFMU0UpOwotCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JUmV0VHhJZHggPSBUeElkeDsKLQlwVHhCbGstPlByaXYgKz0gcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQkvLwotCS8vIFVwZGF0ZSBUeCBpbmRleAotCS8vCi0JSU5DX1JJTkdfSU5ERVgoVHhJZHgsIFRYX1JJTkdfU0laRSk7Ci0JcFR4UmluZy0+VHhDcHVJZHggPSBUeElkeDsKLQotCSpGcmVlTnVtYmVyIC09IDE7Ci0KLQlyZXR1cm4gUmV0VHhJZHg7Ci0KLX0KLQotCi0vKgotCU11c3QgYmUgcnVuIGluIEludGVycnVwdCBjb250ZXh0Ci0JVGhpcyBmdW5jdGlvbiBoYW5kbGUgUENJIHNwZWNpZmljIFR4RGVzYyBhbmQgY3B1IGluZGV4IHVwZGF0ZSBhbmQga2ljayB0aGUgcGFja2V0IG91dC4KLSAqLwotaW50IFJ0bXBQQ0lNZ210S2lja091dCgKLQlJTiBSVE1QX0FEQVBURVIJCSpwQWQsCi0JSU4gVUNIQVIJCQlRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUCQlwUGFja2V0LAotCUlOIFBVQ0hBUgkJCXBTcmNCdWZWQSwKLQlJTiBVSU5UCQkJCVNyY0J1ZkxlbikKLXsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVVMT05HCQkJU3dJZHggPSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4OwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLSAgICBUeEQgPSAqcERlc3RUeEQ7Ci0gICAgcFR4RCA9ICZUeEQ7Ci0gICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZWxzZQotCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLSNlbmRpZgotCi0JcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5wTmRpc1BhY2tldCA9IHBQYWNrZXQ7Ci0JcEFkLT5NZ210UmluZy5DZWxsW1N3SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JUlRNUFdyaXRlVHhEZXNjcmlwdG9yKHBBZCwgcFR4RCwgVFJVRSwgRklGT19NR01UKTsKLQlwVHhELT5MYXN0U2VjMCA9IDE7Ci0JcFR4RC0+TGFzdFNlYzEgPSAxOwotCXBUeEQtPkRNQURPTkUgPSAwOwotCXBUeEQtPlNETGVuMSA9IDA7Ci0JcFR4RC0+U0RQdHIwID0gUENJX01BUF9TSU5HTEUocEFkLCBwU3JjQnVmVkEsIFNyY0J1ZkxlbiwgMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotICAgIFdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8qCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJNTE1FSGFyZFRyYW5zbWl0XG4iKSk7Ci0JZm9yIChpID0gMDsgaSA8IChUWFdJX1NJWkUrMjQpOyBpKyspCi0JewotCi0JCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIleDoiLCAqKHBTcmNCdWZWQStpKSkpOwotCQlpZiAoIGklNCA9PSAzKQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiA6OiAiKSk7Ci0JCWlmICggaSUxNiA9PSAxNSkKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJcbiAgICAgICIpKTsKLQl9Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlxuICAgICAgIikpOyovCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0JLy8gSW5jcmVhc2UgVFhfQ1RYX0lEWCwgYnV0IHdyaXRlIHRvIHJlZ2lzdGVyIGxhdGVyLgotCUlOQ19SSU5HX0lOREVYKHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgsIE1HTVRfUklOR19TSVpFKTsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCAgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2hlY2sgUnggZGVzY3JpcHRvciwgcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgaWYgYW55IGVycm9yIGRvdW5kCi0KLQlBcmd1bWVudHM6Ci0JCXBSeEQJCVBvaW50ZXIgdG8gdGhlIFJ4IGRlc2NyaXB0b3IKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwlObyBlcnIKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQlFcnJvcgotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVBIRUFERVJfODAyXzExCQlwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDCQlwUnhXSSwKLQlJTiAgUFJUMjhYWF9SWERfU1RSVUMJcFJ4RCkKLXsKLQlQQ0lQSEVSX0tFWSBwV3BhS2V5OwotCUlOVCBkQm07Ci0KLQkvLyBQaHkgZXJyb3JzICYgQ1JDIGVycm9ycwotCWlmICgvKihwUnhELT5QaHlFcnIpIHx8Ki8gKHBSeEQtPkNyYykpCi0JewotCQkvLyBDaGVjayBSU1NJIGZvciBOb2lzZSBIaXN0IHN0YXRpc3RpYyBjb2xsZWN0aW9uLgotCQlkQm0gPSAoSU5UKSAocFJ4V0ktPlJTU0kwKSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGE7Ci0JCWlmIChkQm0gPD0gLTg3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVswXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTgyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsxXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTc3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVsyXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTcyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVszXSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTY3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs0XSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTYyKQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs1XSArPSAxOwotCQllbHNlIGlmIChkQm0gPD0gLTU3KQotCQkJcEFkLT5TdGFDZmcuUlBJRGVuc2l0eVs2XSArPSAxOwotCQllbHNlIGlmIChkQm0gPiAtNTcpCi0JCQlwQWQtPlN0YUNmZy5SUElEZW5zaXR5WzddICs9IDE7Ci0KLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCX0KLQotCS8vIEFkZCBSeCBzaXplIHRvIGNoYW5uZWwgbG9hZCBjb3VudGVyLCB3ZSBzaG91bGQgaWdub3JlIGVycm9yIGNvdW50cwotCXBBZC0+U3RhQ2ZnLkNMQnVzeUJ5dGVzICs9IChwUnhELT5TREwwICsgMTQpOwotCi0JLy8gRHJvcCBUb0RzIHByb21pc2NvdXMgZnJhbWUsIGl0IGlzIG9wZW5lZCBkdWUgdG8gQ0NYIDIgY2hhbm5lbCBsb2FkIHN0YXRpc3RpY3MKLQlpZiAocEhlYWRlciAhPSBOVUxMKQotCXsKLQkJaWYgKHBIZWFkZXItPkZDLlRvRHMpCi0JCXsKLQkJCXJldHVybihORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCX0KLQotCS8vIERyb3Agbm90IFUyTSBmcmFtZXMsIGNhbnQncyBkcm9wIGhlcmUgYmVjYXVzZSB3ZSB3aWxsIGRyb3AgYmVhY29uIGluIHRoaXMgY2FzZQotCS8vIEkgYW0ga2luZCBvZiBkb3VidGluZyB0aGUgVTJNIGJpdCBvcGVyYXRpb24KLQkvLyBpZiAocFJ4RC0+VTJNID09IDApCi0JLy8JcmV0dXJuKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JLy8gZHJvcCBkZWN5cHRpb24gZmFpbCBmcmFtZQotCWlmIChwUnhELT5DaXBoZXJFcnIpCi0JewotCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCi0JCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIG9rIGJ1dCBNSUNFcnIgIikpO30KLQkJZWxzZSBpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDEpCi0JCQl7REJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgicFJ4RCBFUlJPUjogSUNWIEVyciAiKSk7fQotCQllbHNlIGlmIChwUnhELT5DaXBoZXJFcnIgPT0gMykKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoInBSeEQgRVJST1I6IEtleSBub3QgdmFsaWQgIikpOwotCi0gICAgICAgIGlmICgoKHBSeEQtPkNpcGhlckVyciAmIDEpID09IDEpICYmIHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ICYmIElORlJBX09OKHBBZCkpCi0gICAgICAgICAgICBSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIgJWQgKGxlbj0lZCwgTWNhc3Q9JWQsIE15QnNzPSVkLCBXY2lkPSVkLCBLZXlJZD0lZClcbiIsCi0JCQlwUnhELT5DaXBoZXJFcnIsCi0JCQlwUnhELT5TREwwLAotCQkJcFJ4RC0+TWNhc3QgfCBwUnhELT5CY2FzdCwKLQkJCXBSeEQtPk15QnNzLAotCQkJcFJ4V0ktPldpcmVsZXNzQ2xpSUQsCi0vLwkJCUNpcGhlck5hbWVbcFJ4RC0+Q2lwaGVyQWxnXSwKLQkJCXBSeFdJLT5LZXlJbmRleCkpOwotCi0JCS8vCi0JCS8vIE1JQyBFcnJvcgotCQkvLwotCQlpZiAocFJ4RC0+Q2lwaGVyRXJyID09IDIpCi0JCXsKLQkJCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4V0ktPktleUluZGV4XTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKQotICAgICAgICAgICAgICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KHBBZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VLRVkpID8gVFJVRTpGQUxTRSk7Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQkJICAgIFJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOwotCi0gICAgICAgICAgICBpZiAoKChwUnhELT5DaXBoZXJFcnIgJiAyKSA9PSAyKSAmJiBwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCAmJiBJTkZSQV9PTihwQWQpKQotICAgICAgICAgICAgICAgIFJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJSeCBNSUMgVmFsdWUgZXJyb3JcbiIpKTsKLQkJfQotCi0JCWlmIChwSGVhZGVyID09IE5VTEwpCi0JCQlyZXR1cm4oTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCS8qaWYgKChwUnhELT5DaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykgJiYKLQkJCShwSGVhZGVyLT5TZXF1ZW5jZSA9PSBwQWQtPkZyYWdGcmFtZS5TZXF1ZW5jZSkpCi0JCXsKLQkJCS8vCi0JCQkvLyBBY2NlcHRhYmxlIHNpbmNlIHRoZSBGaXJzdCBGcmFnRnJhbWUgbm8gQ2lwaGVyRXJyIHByb2JsZW0uCi0JCQkvLwotCQkJcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ki8KLQotCQlyZXR1cm4oTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JcmV0dXJuKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLUJPT0xFQU4gIFJUTVBGcmVlVFhEVXBvblR4RG1hRG9uZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCVF1ZUlkeCkKLXsKLQlQUlRNUF9UWF9SSU5HIHBUeFJpbmc7Ci0JUFRYRF9TVFJVQwkgIHBUeEQ7Ci0jaWZkZWYJUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSNlbmRpZgotCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKLQlVQ0hBUglGUkVFID0gMDsKLQlUWERfU1RSVUMJVHhELCAqcE9yaVR4RDsKLQkvL1VMT05HCQlJcnFGbGFnczsKLQlCT09MRUFOCQkJYlJlc2NoZWR1bGUgPSBGQUxTRTsKLQotCi0JQVNTRVJUKFF1ZUlkeCA8IE5VTV9PRl9UWF9SSU5HKTsKLQlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGLCAmcFR4UmluZy0+VHhEbWFJZHgpOwotCXdoaWxlIChwVHhSaW5nLT5UeFN3RnJlZUlkeCAhPSBwVHhSaW5nLT5UeERtYUlkeCkKLQl7Ci0vLwkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotI2lmZGVmIFJBTElOS19BVEUKLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7Ci0KLQkJaWYgKChBVEVfT04ocEFkKSkgJiYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkpCi0JCXsKLQkJCWlmIChwQWQtPmF0ZS5RSUQgPT0gUXVlSWR4KQotCQkJewotCQkJCXBBZC0+YXRlLlR4RG9uZUNvdW50Kys7Ci0JCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCi0JCQkJLyogYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQSAqLwotCQkJCUFTU0VSVChwQWQtPmF0ZS5RSUQgPT0gMCk7Ci0JCQkJcEFkLT5hdGUuVHhBYzArKzsKLQotCQkJCUZSRUUrKzsKLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotCQkJCXBPcmlUeEQgPSBwVHhEOwotCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLQkJCQlwVHhEID0gJlR4RDsKLSNlbHNlCi0JCSAgICAgICAgcERlc3RUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotCQkgICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7Ci0JCSAgICAgICAgVHhEID0gKnBEZXN0VHhEOwotCQkgICAgICAgIHBUeEQgPSAmVHhEOwotCQkgICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0KLQkJCQlwSGVhZGVyODAyMTEgPSBwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5EbWFCdWYuQWxsb2NWYSArIHNpemVvZihUWFdJX1NUUlVDKTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyODAyMTEsIERJUl9SRUFELCBGQUxTRSk7Ci0jZW5kaWYKLQkJCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlcjgwMjExLCBESVJfV1JJVEUsIEZBTFNFKTsKLSNlbmRpZgotCi0JCQkJaWYgICgocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKSAmJiAocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuVHhEb25lQ291bnQgPCBwQWQtPmF0ZS5UeENvdW50KSkKLQkJCQl7Ci0JCQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRCeXRlQ291bnQgKz0gIChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOwotCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50ICs9IChwVHhELT5TRExlbjEgKyBwVHhELT5TRExlbjApOwotCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0RtYURvbmVDb3VudFtRdWVJZHhdICsrOwotCQkJCQlJTkNfUklOR19JTkRFWChwVHhSaW5nLT5UeFN3RnJlZUlkeCwgVFhfUklOR19TSVpFKTsKLQotCQkJCQkvKiBnZXQgVFhfRFRYX0lEWCBhZ2FpbiAqLwotCQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwICsgUXVlSWR4ICogUklOR1JFR19ESUZGICwgICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0JCQkJCWdvdG8ga2lja19vdXQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPmF0ZS5UeFN0YXR1cyA9PSAxKS8qIG9yIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpID8/PyAqLyAmJiAocEFkLT5hdGUuVHhEb25lQ291bnQgPT0gcEFkLT5hdGUuVHhDb3VudCkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoImFsbCBUeCBpcyBkb25lXG4iKSk7Ci0KLQkJCQkJLy8gVHggc3RhdHVzIGVudGVycyBpZGxlIG1vZGUuCi0JCQkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIShwQWQtPmF0ZS5Nb2RlICYgQVRFX1RYRlJBTUUpKQotCQkJCXsKLQkJCQkJLyogbm90IGNvbXBsZXRlIHNlbmRpbmcgeWV0LCBidXQgc29tZW9uZSBwcmVzcyB0aGUgU3RvcCBUWCBib3R0b24gKi8KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJub3QgY29tcGxldGUgc2VuZGluZyB5ZXQsIGJ1dCBzb21lb25lIHByZXNzZWQgdGhlIFN0b3AgVFggYm90dG9tXG4iKSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgicEFkLT5hdGUuTW9kZSA9IDB4JTAyeFxuIiwgcEFkLT5hdGUuTW9kZSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsKCJwVHhSaW5nLT5UeFN3RnJlZUlkeCA9ICVkXG4iLCBwVHhSaW5nLT5UeFN3RnJlZUlkeCkpOwotCQkJCX0KLQotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0jZWxzZQotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQkqcERlc3RUeEQgPSBUeEQ7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JCQkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCQkvLyBzdGF0aWMgcmF0ZSBhbHNvIG5lZWQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKCkgZnVuY3Rpb24uCi0JCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkpCi0JCQlOSUNVcGRhdGVGaWZvU3RhQ291bnRlcnMocEFkKTsKLQotCQkvKiBOb3RlIDogSWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSksIHdlIHdpbGwgbmV2ZXIgcmVhY2ggaGVyZS4gKi8KLQkJRlJFRSsrOwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgICAgICAgICAgICAgcFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0JCXBPcmlUeEQgPSBwVHhEOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZUeEQsIHBUeEQsIHNpemVvZihUWERfU1RSVUMpKTsKLQkJcFR4RCA9ICZUeEQ7Ci0jZWxzZQotICAgICAgICBwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwVHhSaW5nLT5UeFN3RnJlZUlkeF0uQWxsb2NWYSk7Ci0gICAgICAgIHBPcmlUeEQgPSBwRGVzdFR4RCA7Ci0gICAgICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICAgICAgcFR4RCA9ICZUeEQ7Ci0gICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0KLQotI2lmZGVmIFJBTElOS19BVEUKLQkJLyogRXhlY3V0aW9uIG9mIHRoaXMgYmxvY2sgaXMgbm90IGFsbG93ZWQgd2hlbiBBVEUgaXMgcnVubmluZy4gKi8KLQkJaWYgKCEoQVRFX09OKHBBZCkpKQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQkJewotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0OwotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0JCQkJaWYgKFJUTVBfR0VUX1BBQ0tFVF81VlQocFBhY2tldCkpCi0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQllbHNlCi0jZW5kaWYgLy8gQ09ORklHXzVWVF9FTkhBTkNFIC8vCi0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJQVNTRVJUKHBQYWNrZXQgPT0gTlVMTCk7Ci0JCQlpZiAocFBhY2tldCkKLQkJCXsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLQkJCQlpZiAoUlRNUF9HRVRfUEFDS0VUXzVWVChwUGFja2V0KSkKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgMTYsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfNVZUX0VOSEFOQ0UgLy8KLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0JCQkvL0Fsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbcFR4UmluZy0+VHhTd0ZyZWVJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCX0KLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50ICs9ICAocFR4RC0+U0RMZW4xICsgcFR4RC0+U0RMZW4wKTsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNEbWFEb25lQ291bnRbUXVlSWR4XSArKzsKLQkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhTd0ZyZWVJZHgsIFRYX1JJTkdfU0laRSk7Ci0JCS8qIGdldCB0eF90ZHhfaWR4IGFnYWluICovCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRdWVJZHggKiBSSU5HUkVHX0RJRkYgLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotICAgICAgICAqcERlc3RUeEQgPSBUeEQ7Ci0jZWxzZQotICAgICAgICBOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFJBTElOS19BVEUKLSNpZmRlZiBSQUxJTktfMjh4eF9RQQota2lja19vdXQ6Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCQkvKgotCQkJQVRFX1RYQ09OVCBtb2RlIGFsc28gbmVlZCB0byBzZW5kIHNvbWUgbm9ybWFsIGZyYW1lcywgc28gbGV0IGl0IGluLgotCQkJQVRFX1NUT1AgbXVzdCBiZSBjaGFuZ2VkIG5vdCB0byBiZSAweGZmCi0JCQl0byBwcmV2ZW50IGl0IGZyb20gcnVubmluZyBpbnRvIHRoaXMgYmxvY2suCi0JCSovCi0JCWlmICgocEFkLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSAmJiAocEFkLT5hdGUuUUlEID09IFF1ZUlkeCkpCi0JCXsKLQkJCS8vIFR4RG9uZUNvdW50KysgaGFzIGJlZW4gZG9uZSBpZiBRQSBpcyB1c2VkLgotCQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJcEFkLT5hdGUuVHhEb25lQ291bnQrKzsKLQkJCX0KLQkJCWlmICgoKHBBZC0+YXRlLlR4Q291bnQgLSBwQWQtPmF0ZS5UeERvbmVDb3VudCArIDEpID49IFRYX1JJTkdfU0laRSkpCi0JCQl7Ci0JCQkJLyogTm90ZSA6IFdlIGluY3JlYXNlIFR4Q3B1SWR4IGhlcmUsIG5vdCBUeFN3RnJlZUlkeCAhICovCi0JCQkJSU5DX1JJTkdfSU5ERVgocEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCwgVFhfUklOR19TSVpFKTsKLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBUeFJpbmctPkNlbGxbcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeF0uQWxsb2NWYSk7Ci0JCQkJcE9yaVR4RCA9IHBUeEQ7Ci0JCSAgICAgICAgTmRpc01vdmVNZW1vcnkoJlR4RCwgcFR4RCwgc2l6ZW9mKFRYRF9TVFJVQykpOwotCQkJCXBUeEQgPSAmVHhEOwotI2Vsc2UKLQkJICAgICAgICBwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSAocFR4UmluZy0+Q2VsbFtwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4XS5BbGxvY1ZhKTsKLQkJICAgICAgICBwT3JpVHhEID0gcERlc3RUeEQgOwotCQkgICAgICAgIFR4RCA9ICpwRGVzdFR4RDsKLQkJICAgICAgICBwVHhEID0gJlR4RDsKLQkJICAgICAgICBSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJCXBUeEQtPkRNQURPTkUgPSAwOwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlOZGlzTW92ZU1lbW9yeShwT3JpVHhELCBwVHhELCBzaXplb2YoVFhEX1NUUlVDKSk7Ci0jZWxzZQotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQkqcERlc3RUeEQgPSBUeEQ7Ci0jZW5kaWYKLQkJCQkvLyBraWNrIFR4LVJpbmcKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFF1ZUlkeCAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCk7Ci0JCQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCQkJfQotCQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotLy8gICAgICAgICBSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQl9Ci0KLQotCXJldHVybiAgYlJlc2NoZWR1bGU7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUHJvY2VzcyBUWCBSaW5ncyBETUEgRG9uZSBpbnRlcnJ1cHQsIHJ1bm5pbmcgaW4gRFBDIGxldmVsCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUlOVF9TT1VSQ0VfQ1NSX1NUUlVDIFR4UmluZ0JpdG1hcCkKLXsKLS8vCVVDSEFSCQkJQ291bnQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcJSXJxRmxhZ3M7Ci0JQk9PTEVBTgkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0KLQkvLyBNYWtlIHN1cmUgVHggcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKLQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0KLQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLQlpZiAoVHhSaW5nQml0bWFwLmZpZWxkLkFjMERtYURvbmUpCi0JCWJSZXNjaGVkdWxlID0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX0JFKTsKLS8qCi0JaWYgKFR4UmluZ0JpdG1hcC5maWVsZC5IY2NhRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0hDQ0EpOwotKi8KLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMzRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX1ZPKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMyRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX1ZJKTsKLQotCWlmIChUeFJpbmdCaXRtYXAuZmllbGQuQWMxRG1hRG9uZSkKLQkJYlJlc2NoZWR1bGUgfD0gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKHBBZCwgUUlEX0FDX0JLKTsKLQotCS8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIFR4IHJpbmcgcmVzb3VyY2UKLQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0JUlRNUF9JUlFfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0KLQkvLyBEZXF1ZXVlIG91dGdvaW5nIGZyYW1lcyBmcm9tIFR4U3dRdWV1ZVtdIGFuZCBwcm9jZXNzIGl0Ci0JUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQotCXJldHVybiAgYlJlc2NoZWR1bGU7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgTUdNVCByaW5nIERNQSBkb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVBUWERfU1RSVUMJIHBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0vLwlpbnQJCSBpOwotCVVDSEFSCUZSRUUgPSAwOwotCVBSVE1QX01HTVRfUklORyBwTWdtdFJpbmcgPSAmcEFkLT5NZ210UmluZzsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwTWdtdFJpbmctPlR4RG1hSWR4KTsKLQl3aGlsZSAocE1nbXRSaW5nLT5UeFN3RnJlZUlkeCE9IHBNZ210UmluZy0+VHhEbWFJZHgpCi0JewotCQlGUkVFKys7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgICAgICBwRGVzdFR4RCA9IChQVFhEX1NUUlVDKSAocE1nbXRSaW5nLT5DZWxsW3BBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHhdLkFsbG9jVmEpOwotICAgICAgICBUeEQgPSAqcERlc3RUeEQ7Ci0gICAgICAgIHBUeEQgPSAmVHhEOwotCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbHNlCi0JCXBUeEQgPSAoUFRYRF9TVFJVQykgKHBNZ210UmluZy0+Q2VsbFtwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4XS5BbGxvY1ZhKTsKLSNlbmRpZgotCQlwVHhELT5ETUFET05FID0gMDsKLQkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldDsKLQotCi0JCWlmIChwUGFja2V0KQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJcFBhY2tldCA9IHBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0JCWlmIChwUGFja2V0KQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JCXBNZ210UmluZy0+Q2VsbFtwTWdtdFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQlJTkNfUklOR19JTkRFWChwTWdtdFJpbmctPlR4U3dGcmVlSWR4LCBNR01UX1JJTkdfU0laRSk7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgICAgIFJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotICAgICAgICBXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBUUlVFLCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQl9Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyLiBEZXF1ZXVlIGFsbCBwb3dlciBzYWZlIGRlbGF5ZWQgYnJhb2RjYXN0IGZyYW1lcyBhZnRlciBiZWFjb24uCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JewotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJewotCQl9Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyLiBSZXdyaXRlIGJlYWNvbiBjb250ZW50IGJlZm9yZSBuZXh0IHNlbmQtb3V0LgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCXsKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBIYW5kbGVQcmVUQlRUSW50ZXJydXB0Li4uXG4iKSk7Ci0JCX0KLQl9Ci0KLQotfQotCi1WT0lECVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCi0JaWYgKHBBZCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gcEFkIGlzIE5VTEwsIHJldHVybi5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRyAsICZHbG9DZmcud29yZCk7Ci0KLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMDsKLQlHbG9DZmcuZmllbGQuRW5hYmxlUnhETUEgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwotCi0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkvKlJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsqLwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JUlRNUEVuYWJsZVJ4VHgocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdCBcbiIpKTsKLX0KLQotCi0KLQotVk9JRCBEQkdQUklOVF9UWF9SSU5HKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICBRdWVJZHgpCi17Ci0JVUlOVDMyCQlBYzBCYXNlOwotCVVJTlQzMgkJQWMwSHdJZHggPSAwLCBBYzBTd0lkeCA9IDAsIEFDMGZyZWVJZHg7Ci0JaW50CQkJaTsKLS8vCVBVTE9ORwkJcFR4RDsKLQlQVUxPTkcJcHRlbXA7Ci0KLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAiICApKTsKLQlzd2l0Y2ggKFF1ZUlkeCkKLQl7Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQVNFX1BUUjAsICZBYzBCYXNlKTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQ1RYX0lEWDAsICZBYzBTd0lkeCk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0RUWF9JRFgwLCAmQWMwSHdJZHgpOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBRSURfQUNfQkUgREVTQ1JJUFRPUiAgXG4gIiAgKSk7Ci0JCQlmb3IgKGk9MDtpPFRYX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCQljYXNlIFFJRF9BQ19CSzoKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFIxLCAmQWMwQmFzZSk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFgxLCAmQWMwU3dJZHgpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMSwgJkFjMEh3SWR4KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJBbGwgUUlEX0FDX0JLIERFU0NSSVBUT1IgIFxuICIgICkpOwotCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQotCQkJewotCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19CS10uQ2VsbFtpXS5BbGxvY1ZhOwotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOwotCQkJfQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBRSURfQUNfVkk6Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMiwgJkFjMEJhc2UpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMiwgJkFjMFN3SWR4KTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDIsICZBYzBId0lkeCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WSSBERVNDUklQVE9SIFxuICIgICkpOwotCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQotCQkJewotCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFtpXS5BbGxvY1ZhOwotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOwotCQkJfQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBRSURfQUNfVk86Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0JBU0VfUFRSMywgJkFjMEJhc2UpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9DVFhfSURYMywgJkFjMFN3SWR4KTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDMsICZBYzBId0lkeCk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiQWxsIFFJRF9BQ19WTyBERVNDUklQVE9SIFxuICIgICkpOwotCQkJZm9yIChpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQotCQkJewotCQkJCXB0ZW1wPSAoUFVMT05HKXBBZC0+VHhSaW5nW1FJRF9BQ19WT10uQ2VsbFtpXS5BbGxvY1ZhOwotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJbJTAyZF0gICUwOGx4OiAlMDhseDogJTA4bHg6ICUwOGx4XG4gIiAsIGksICpwdGVtcCwqKHB0ZW1wKzEpLCoocHRlbXArMiksKihwdGVtcCszKSkpOwotCQkJfQotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIiAgXG4gIiAgKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBRSURfTUdNVDoKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFTRV9QVFI1LCAmQWMwQmFzZSk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0NUWF9JRFg1LCAmQWMwU3dJZHgpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYNSwgJkFjMEh3SWR4KTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIgQWxsIFFJRF9NR01UICBERVNDUklQVE9SIFxuICIgICkpOwotCQkJZm9yIChpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCi0JCQl7Ci0JCQkJcHRlbXA9IChQVUxPTkcpcEFkLT5NZ210UmluZy5DZWxsW2ldLkFsbG9jVmE7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4bHg6ICUwOGx4OiAlMDhseDogJTA4bHhcbiAiICwgaSwgKnB0ZW1wLCoocHRlbXArMSksKihwdGVtcCsyKSwqKHB0ZW1wKzMpKSk7Ci0JCQl9Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiICBcbiAiICApKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVF9FUlIoKCJEQkdQUklOVF9UWF9SSU5HKFJpbmcgJWQpIG5vdCBzdXBwb3J0ZWRcbiIsIFF1ZUlkeCkpOwotCQkJYnJlYWs7Ci0JfQotCUFDMGZyZWVJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJUeFJpbmclZCwgVFhfRFRYX0lEWD0lZCwgVFhfQ1RYX0lEWD0lZFxuIiwgUXVlSWR4LCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJVHhTd0ZyZWVJZHhbJWRdIiwgQUMwZnJlZUlkeCkpOwotCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIglwZW5kaW5nLU5ESVM9JWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBlbmRpbmdOZGlzUGFja2V0Q291bnQpKTsKLQotCi19Ci0KLQotVk9JRCBEQkdQUklOVF9SWF9SSU5HKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCkKLXsKLQlVSU5UMzIJCUFjMEJhc2U7Ci0JVUlOVDMyCQlBYzBId0lkeCA9IDAsIEFjMFN3SWR4ID0gMCwgQUMwZnJlZUlkeDsKLS8vCVBVTE9ORwkgcFR4RDsKLQlpbnQJCQlpOwotCVVJTlQzMgkqcHRlbXA7Ci0vLwlQUlhEX1NUUlVDCQlwUnhEOwotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIiAgKSk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9CQVNFX1BUUiwgJkFjMEJhc2UpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfQ1JYX0lEWCwgJkFjMFN3SWR4KTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX0RSWF9JRFgsICZBYzBId0lkeCk7Ci0JQUMwZnJlZUlkeCA9IHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OwotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIkFsbCBSWCBEU1AgIFxuICIgICkpOwotCWZvciAoaT0wO2k8UlhfUklOR19TSVpFO2krKykKLQl7Ci0JCXB0ZW1wID0gKFVJTlQzMiAqKXBBZC0+UnhSaW5nLkNlbGxbaV0uQWxsb2NWYTsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIlslMDJkXSAgJTA4eDogJTA4eDogJTA4eDogJTA4eFxuICIgLCBpLCAqcHRlbXAsKihwdGVtcCsxKSwqKHB0ZW1wKzIpLCoocHRlbXArMykpKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSeFJpbmcsIFJYX0RSWF9JRFg9JWQsIFJYX0NSWF9JRFg9JWQgXG4iLCBBYzBId0lkeCwgQWMwU3dJZHgpKTsKLQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCIJUnhTd1JlYWRJZHggWyVkXT0iLCBBQzBmcmVlSWR4KSk7Ci0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiCXBlbmRpbmctTkRJUz0lbGRcbiIsIHBBZC0+UmFsaW5rQ291bnRlcnMuUGVuZGluZ05kaXNQYWNrZXRDb3VudCkpOwotfQotCi0KLVBORElTX1BBQ0tFVCBHZXRQYWNrZXRGcm9tUnhSaW5nKAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJCVBSVDI4WFhfUlhEX1NUUlVDCXBTYXZlUnhELAotCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCi0JSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKQotewotCVBSWERfU1RSVUMJCQkJcFJ4RDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUFJYRF9TVFJVQwkJCQlwRGVzdFJ4RDsKLQlSWERfU1RSVUMJCQkJUnhEOwotI2VuZGlmCi0JUE5ESVNfUEFDS0VUCQkJcFJ4UGFja2V0ID0gTlVMTDsKLQlQTkRJU19QQUNLRVQJCQlwTmV3UGFja2V0OwotCVBWT0lECQkJCQlBbGxvY1ZhOwotCU5ESVNfUEhZU0lDQUxfQUREUkVTUwlBbGxvY1BhOwotCUJPT0xFQU4JCQkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0KLQlSVE1QX1NFTV9MT0NLKCZwQWQtPlJ4UmluZ0xvY2spOwotCi0JaWYgKCpwUnhQZW5kaW5nID09IDApCi0JewotCQkvLyBHZXQgaG93IG1heSBwYWNrZXRzIGhhZCBiZWVuIHJlY2VpdmVkCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCAsICZwQWQtPlJ4UmluZy5SeERtYUlkeCk7Ci0KLQkJaWYgKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID09IHBBZC0+UnhSaW5nLlJ4RG1hSWR4KQotCQl7Ci0JCQkvLyBubyBtb3JlIHJ4IHBhY2tldHMKLQkJCWJSZXNjaGVkdWxlID0gRkFMU0U7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQkvLyBnZXQgcnggcGVuZGluZyBjb3VudAotCQlpZiAocEFkLT5SeFJpbmcuUnhEbWFJZHggPiBwQWQtPlJ4UmluZy5SeFN3UmVhZElkeCkKLQkJCSpwUnhQZW5kaW5nID0gcEFkLT5SeFJpbmcuUnhEbWFJZHggLSBwQWQtPlJ4UmluZy5SeFN3UmVhZElkeDsKLQkJZWxzZQotCQkJKnBSeFBlbmRpbmcJPSBwQWQtPlJ4UmluZy5SeERtYUlkeCArIFJYX1JJTkdfU0laRSAtIHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4OwotCi0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCXBEZXN0UnhEID0gKFBSWERfU1RSVUMpIHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkFsbG9jVmE7Ci0JUnhEID0gKnBEZXN0UnhEOwotCXBSeEQgPSAmUnhEOwotCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFJ4RCwgVFlQRV9SWEQpOwotI2Vsc2UKLQkvLyBQb2ludCB0byBSeCBpbmRleGVkIHJ4IHJpbmcgZGVzY3JpcHRvcgotCXBSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uQWxsb2NWYTsKLSNlbmRpZgotCi0JaWYgKHBSeEQtPkRET05FID09IDApCi0JewotCQkqcFJ4UGVuZGluZyA9IDA7Ci0JCS8vIERNQUluZHggaGFkIGRvbmUgYnV0IERET05FIGJpdCBub3QgcmVhZHkKLQkJYlJlc2NoZWR1bGUgPSBUUlVFOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQkvLyByZXR1cm4gcnggZGVzY3JpcHRvcgotCU5kaXNNb3ZlTWVtb3J5KHBTYXZlUnhELCBwUnhELCBSWERfU0laRSk7Ci0KLQlwTmV3UGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKHBBZCwgUlhfQlVGRkVSX0FHR1JFU0laRSwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7Ci0KLQlpZiAocE5ld1BhY2tldCkKLQl7Ci0JCS8vIHVubWFwIHRoZSByeCBidWZmZXIKLQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1BhLAotCQkJCQkgcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jU2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJcFJ4UGFja2V0ID0gcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0ucE5kaXNQYWNrZXQ7Ci0KLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jU2l6ZQk9IFJYX0JVRkZFUl9BR0dSRVNJWkU7Ci0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLnBOZGlzUGFja2V0CQk9IChQTkRJU19QQUNLRVQpIHBOZXdQYWNrZXQ7Ci0JCXBBZC0+UnhSaW5nLkNlbGxbcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHhdLkRtYUJ1Zi5BbGxvY1ZhCT0gQWxsb2NWYTsKLQkJcEFkLT5SeFJpbmcuQ2VsbFtwQWQtPlJ4UmluZy5SeFN3UmVhZElkeF0uRG1hQnVmLkFsbG9jUGEJPSBBbGxvY1BhOwotCQkvKiB1cGRhdGUgU0RQMCB0byBuZXcgYnVmZmVyIG9mIHJ4IHBhY2tldCAqLwotCQlwUnhELT5TRFAwID0gQWxsb2NQYTsKLQl9Ci0JZWxzZQotCXsKLQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk5vIFJ4IEJ1ZmZlclxuIikpOwotCQlwUnhQYWNrZXQgPSBOVUxMOwotCQliUmVzY2hlZHVsZSA9IFRSVUU7Ci0JfQotCi0JcFJ4RC0+RERPTkUgPSAwOwotCi0JLy8gaGFkIGhhbmRsZWQgb25lIHJ4IHBhY2tldAotCSpwUnhQZW5kaW5nID0gKnBSeFBlbmRpbmcgLSAxOwotCi0JLy8gdXBkYXRlIHJ4IGRlc2NyaXB0b3IgYW5kIGtpY2sgcngKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7Ci0JV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RSeEQsIChQVUNIQVIpcFJ4RCwgRkFMU0UsIFRZUEVfUlhEKTsKLSNlbmRpZgotCUlOQ19SSU5HX0lOREVYKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4LCBSWF9SSU5HX1NJWkUpOwotCi0JcEFkLT5SeFJpbmcuUnhDcHVJZHggPSAocEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4LTEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQotZG9uZToKLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+UnhSaW5nTG9jayk7Ci0JKnBiUmVzY2hlZHVsZSA9IGJSZXNjaGVkdWxlOwotCXJldHVybiBwUnhQYWNrZXQ7Ci19Ci0KLQotTkRJU19TVEFUVVMgTWxtZUhhcmRUcmFuc21pdFR4UmluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUglRdWVJZHgsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpCi17Ci0JUEFDS0VUX0lORk8JUGFja2V0SW5mbzsKLQlQVUNIQVIJCQlwU3JjQnVmVkE7Ci0JVUlOVAkJCVNyY0J1ZkxlbjsKLQlQVFhEX1NUUlVDCQlwVHhEOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBQVFhEX1NUUlVDICAgICAgcERlc3RUeEQ7Ci0gICAgVFhEX1NUUlVDICAgICAgIFR4RDsKLSNlbmRpZgotCVBIRUFERVJfODAyXzExCXBIZWFkZXJfODAyXzExOwotCUJPT0xFQU4JCQliQWNrUmVxdWlyZWQsIGJJbnNlcnRUaW1lc3RhbXA7Ci0JVUxPTkcJCQlTcmNCdWZQQTsKLQkvL1VDSEFSCQkJVHhCdWZJZHg7Ci0JVUNIQVIJCQlNbG1lUmF0ZTsKLQlVTE9ORwkJCVN3SWR4ID0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeDsKLQlQVFhXSV9TVFJVQwlwRmlyc3RUeFdJOwotCS8vVUxPTkcJaTsKLQkvL0hUVFJBTlNNSVRfU0VUVElORwlNbG1lVHJhbnNtaXQ7ICAgLy9SYXRlIGZvciB0aGlzIE1HTVQgZnJhbWUuCi0JVUxPTkcJIEZyZWVOdW07Ci0JTUFDX1RBQkxFX0VOVFJZCSpwTWFjRW50cnkgPSBOVUxMOwotCi0KLQlSVE1QX1F1ZXJ5UGFja2V0SW5mbyhwUGFja2V0LCAmUGFja2V0SW5mbywgJnBTcmNCdWZWQSwgJlNyY0J1Zkxlbik7Ci0KLQotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQl7Ci0JCS8vIFRoZSBidWZmZXIgc2hvdWxkbid0IGJlIE5VTEwKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gTWFrZSBzdXJlIE1HTVQgcmluZyByZXNvdXJjZSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIHRocmVhZHMKLQkvL05kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+VHhSaW5nTG9jayk7Ci0KLQlGcmVlTnVtID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCi0JaWYgKEZyZWVOdW0gPT0gMCkKLQl7Ci0JCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JU3dJZHggPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4OwotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQlwVHhEICA9IChQVFhEX1NUUlVDKSBwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLkFsbG9jVmE7Ci0jZWxzZQotICAgIHBEZXN0VHhEICA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1F1ZUlkeF0uQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLSAgICBUeEQgPSAqcERlc3RUeEQ7Ci0gICAgcFR4RCA9ICZUeEQ7Ci0gICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQotCWlmIChwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIk1sbWVIYXJkVHJhbnNtaXQgRXJyb3JcbiIpKTsKLQkJLy9OZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBvdXRnb2luZyBmcmFtZSBhbHdheXMgd2FrZXVwIFBIWSB0byBwcmV2ZW50IGZyYW1lIGxvc3QKLQkJLy8gaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCQlBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JcEZpcnN0VHhXSQk9KFBUWFdJX1NUUlVDKXBTcmNCdWZWQTsKLQotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSAocFNyY0J1ZlZBICsgVFhXSV9TSVpFKTsKLQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkKLQl7Ci0JCU1sbWVSYXRlID0gcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJTWxtZVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQl9Ci0KLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpICYmCi0JCShwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX1FPU19OVUxMKSkKLQl7Ci0JCXBNYWNFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlcl84MDJfMTEtPkFkZHIxKTsKLQl9Ci0KLQkvLyBWZXJpZnkgTWxtZSByYXRlIGZvciBhIC8gZyBiYW5kcy4KLQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoTWxtZVJhdGUgPCBSQVRFXzYpKSAvLyAxMUEgYmFuZAotCQlNbG1lUmF0ZSA9IFJBVEVfNjsKLQotCS8vCi0JLy8gU2hvdWxkIG5vdCBiZSBoYXJkIGNvZGUgdG8gc2V0IFB3ck1nbXQgdG8gMCAoUFdSX0FDVElWRSkKLQkvLyBTbmljZSBpdCdzIGJlZW4gc2V0IHRvIDAgd2hpbGUgb24gTWd0TWFjSGVhZGVySW5pdAotCS8vIEJ5IHRoZSB3YXkgdGhpcyB3aWxsIGNhdXNlIGZyYW1lIHRvIGJlIHNlbmQgb24gUFdSX1NBVkUgZmFpbGVkLgotCS8vCi0JLy8KLQkvLyBJbiBXTU0tVUFQU0QsIG1sbWUgZnJhbWUgc2hvdWxkIGJlIHNldCBwc20gYXMgcG93ZXIgc2F2aW5nIGJ1dCBwcm9iZSByZXF1ZXN0IGZyYW1lCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgLy8gRGF0YS1OdWxsIHBhY2tldHMgYWxzZSBwYXNzIHRocm91Z2ggTU1SZXF1ZXN0IGluIFJUMjg2MCwgaG93ZXZlciwgd2UgaG9wZSBjb250cm9sIHRoZSBwc20gYml0IHRvIHBhc3MgQVBTRAotCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSAhPSBCVFlQRV9EQVRBKQotICAgIHsKLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUkVRKSB8fCAhKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkpCi0JewotCQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9BQ1RJVkU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBIZWFkZXJfODAyXzExLT5GQy5Qd3JNZ210ID0gcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZTsKLQl9Ci0gICAgfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JYkluc2VydFRpbWVzdGFtcCA9IEZBTFNFOwotCWlmIChwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKSAvLyBtdXN0IGJlIFBTLVBPTEwKLQl7Ci0JCWJBY2tSZXF1aXJlZCA9IEZBTFNFOwotCX0KLQllbHNlIC8vIEJUWVBFX01HTVQgb3IgQlRZUEVfREFUQShtdXN0IGJlIE5VTEwgZnJhbWUpCi0JewotCQlpZiAocEhlYWRlcl84MDJfMTEtPkFkZHIxWzBdICYgMHgwMSkgLy8gTVVMVElDQVNULCBCUk9BRENBU1QKLQkJewotCQkJYkFja1JlcXVpcmVkID0gRkFMU0U7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAwOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYkFja1JlcXVpcmVkID0gVFJVRTsKLQkJCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IFJUTVBDYWxjRHVyYXRpb24ocEFkLCBNbG1lUmF0ZSwgMTQpOwotCQkJaWYgKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfUFJPQkVfUlNQKQotCQkJewotCQkJCWJJbnNlcnRUaW1lc3RhbXAgPSBUUlVFOwotCQkJfQotCQl9Ci0JfQotCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2UrKzsKLQlpZiAocEFkLT5TZXF1ZW5jZSA+IDB4ZmZmKQotCQlwQWQtPlNlcXVlbmNlID0gMDsKLQkvLyBCZWZvcmUgcmFkYXIgZGV0ZWN0aW9uIGRvbmUsIG1nbXQgZnJhbWUgY2FuIG5vdCBiZSBzZW50IGJ1dCBwcm9iZSByZXEKLQkvLyBCZWNhdXNlIHdlIG5lZWQgdG8gdXNlIHByb2JlIHJlcSB0byB0cmlnZ2VyIGRyaXZlciB0byBzZW5kIHByb2JlIHJlcSBpbiBwYXNzaXZlIHNjYW4KLQlpZiAoKHBIZWFkZXJfODAyXzExLT5GQy5TdWJUeXBlICE9IFNVQlRZUEVfUFJPQkVfUkVRKQotCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJJiYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9OT1JNQUxfTU9ERSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIk1sbWVIYXJkVHJhbnNtaXQgLS0+IHJhZGFyIGRldGVjdCBub3QgaW4gbm9ybWFsIG1vZGUgISEhXG4iKSk7Ci0JCS8vTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5UeFJpbmdMb2NrKTsKLQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwSGVhZGVyXzgwMl8xMSwgRElSX1dSSVRFLCBGQUxTRSk7Ci0jZW5kaWYKLQkvLwotCS8vIGZpbGwgc2NhdHRlci1hbmQtZ2F0aGVyIGJ1ZmZlciBsaXN0IGludG8gVFhELiBJbnRlcm5hbGx5IGNyZWF0ZWQgTkRJUyBQQUNLRVQKLQkvLyBzaG91bGQgYWx3YXlzIGhhcyBvbmx5IG9uZSBvaHlzaWNhbCBidWZmZXIsIGFuZCB0aGUgd2hvbGUgZnJhbWUgc2l6ZSBlcXVhbHMKLQkvLyB0byB0aGUgZmlyc3Qgc2NhdHRlciBidWZmZXIgc2l6ZQotCS8vCi0KLQkvLyBJbml0aWFsaXplIFRYIERlc2NyaXB0b3IKLQkvLyBGb3IgaW50ZXItZnJhbWUgZ2FwLCB0aGUgbnVtYmVyIGlzIGZvciB0aGlzIGZyYW1lIGFuZCBuZXh0IGZyYW1lCi0JLy8gRm9yIE1MTUUgcmF0ZSwgd2Ugd2lsbCBmaXggYXMgMk1iIHRvIG1hdGNoIG90aGVyIHZlbmRvcidzIGltcGxlbWVudAotLy8JcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSAxOwotCi0vLyBtYW5hZ2VtZW50IGZyYW1lIGRvZXNuJ3QgbmVlZCBlbmNyeXB0aW9uLiBzbyB1c2UgUkVTRVJWRURfV0NJRCBubyBtYXR0ZXIgdSBhcmUgc2VuZGluZyB0byBzcGVjaWZpYyB3Y2lkIG9yIG5vdC4KLQkvLyBPbmx5IGJlYWNvbiB1c2UgTnNlcT1UUlVFLiBTbyBoZXJlIHdlIHVzZSBOc2VxPUZBTFNFLgotCWlmIChwTWFjRW50cnkgPT0gTlVMTCkKLQl7Ci0JUlRNUFdyaXRlVHhXSShwQWQsIHBGaXJzdFR4V0ksIEZBTFNFLCBGQUxTRSwgYkluc2VydFRpbWVzdGFtcCwgRkFMU0UsIGJBY2tSZXF1aXJlZCwgRkFMU0UsCi0JCTAsIFJFU0VSVkVEX1dDSUQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLCBQSURfTUdNVCwgMCwgIChVQ0hBUilwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTLCBJRlNfQkFDS09GRiwgRkFMU0UsICZwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQpOwotCX0KLQllbHNlCi0JewotCQlSVE1QV3JpdGVUeFdJKHBBZCwgcEZpcnN0VHhXSSwgRkFMU0UsIEZBTFNFLAotCQkJCQliSW5zZXJ0VGltZXN0YW1wLCBGQUxTRSwgYkFja1JlcXVpcmVkLCBGQUxTRSwKLQkJCQkJMCwgcE1hY0VudHJ5LT5BaWQsIChTcmNCdWZMZW4gLSBUWFdJX1NJWkUpLAotCQkJCQlwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsIDAsCi0JCQkJCShVQ0hBUilwTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MsCi0JCQkJCUlGU19CQUNLT0ZGLCBGQUxTRSwgJnBNYWNFbnRyeS0+TWF4SFRQaHlNb2RlKTsKLQl9Ci0KLQlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQlwQWQtPlR4UmluZ1tRdWVJZHhdLkNlbGxbU3dJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0vLwlwRmlyc3RUeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPSBTcmNCdWZMZW4gLSBUWFdJX1NJWkU7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBGaXJzdFR4V0ksIFRZUEVfVFhXSSk7Ci0jZW5kaWYKLQlTcmNCdWZQQSA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4sIDAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0KLQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBUUlVFLCBGSUZPX0VEQ0EpOwotCXBUeEQtPkxhc3RTZWMwID0gMTsKLQlwVHhELT5MYXN0U2VjMSA9IDE7Ci0JcFR4RC0+U0RMZW4wID0gU3JjQnVmTGVuOwotCXBUeEQtPlNETGVuMSA9IDA7Ci0JcFR4RC0+U0RQdHIwID0gU3JjQnVmUEE7Ci0JcFR4RC0+RE1BRE9ORSA9IDA7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCi0JcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCS8vIEluY3JlYXNlIFRYX0NUWF9JRFgsIGJ1dCB3cml0ZSB0byByZWdpc3RlciBsYXRlci4KLQlJTkNfUklOR19JTkRFWChwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRdWVJZHgqMHgxMCwgIHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhDcHVJZHgpOwotCi0JLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgTUdNVCByaW5nIHJlc291cmNlCi0vLwlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPlR4UmluZ0xvY2spOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotTkRJU19TVEFUVVMgTWxtZURhdGFIYXJkVHJhbnNtaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCWlmICgocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQotCQkpCi0JewotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlyZXR1cm4gTWxtZUhhcmRUcmFuc21pdFR4UmluZyhwQWQsUXVlSWR4LHBQYWNrZXQpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxjdWxhdGVzIHRoZSBkdXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byB0cmFuc21pdCBvdXQgZnJhbWVzCi0Jd2l0aCBnaXZlbiBzaXplIGFuZCBzcGVjaWZpZWQgcmF0ZS4KLQotCUFyZ3VtZW50czoKLQkJcFR4RAkJUG9pbnRlciB0byB0cmFuc21pdCBkZXNjcmlwdG9yCi0JCUFjawkJU2V0dGluZyBmb3IgQWNrIHJlcXVpcmVtZW50IGJpdAotCQlGcmFnbWVudAlTZXR0aW5nIGZvciBGcmFnbWVudCBiaXQKLQkJUmV0cnlNb2RlCVNldHRpbmcgZm9yIHJldHJ5IG1vZGUKLQkJSWZzCQlTZXR0aW5nIGZvciBJRlMgZ2FwCi0JCVJhdGUJCVNldHRpbmcgZm9yIHRyYW5zbWl0IHJhdGUKLQkJU2VydmljZQkJU2V0dGluZyBmb3Igc2VydmljZQotCQlMZW5ndGgJCUZyYW1lIGxlbmd0aAotCQlUeFByZWFtYmxlCVNob3J0IG9yIExvbmcgcHJlYW1ibGUgd2hlbiB1c2luZyBDQ0sgcmF0ZXMKLQkJUXVlSWR4IC0gMC0zLCBhY2NvcmRpbmcgdG8gODAyLjExZS9kNC40IEp1bmUvMjAwMwotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYRF9TVFJVQwkJcFR4RCwKLQlJTglCT09MRUFOCQkJYldJViwKLQlJTglVQ0hBUgkJCVF1ZXVlU0VMKQotewotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCi0JcFR4RC0+V0lWCT0gKGJXSVYpID8gMTogMDsKLQlwVHhELT5RU0VMPSAoUXVldWVTRUwpOwotCS8vUlQyODYwYz8/ICBmaXhlZCB1c2luZyBFRENBIHF1ZXVlIGZvciB0ZXN0Li4uICBXZSBkb3VidCBRdWV1ZTEgaGFzIHByb2JsZW0uICAyMDA2LTA5LTI2IEphbgotCS8vcFR4RC0+UVNFTD0gRklGT19FRENBOwotCS8qCi0JaWYgKHBBZC0+Ykdlbk9uZUhDQ0EgPT0gVFJVRSkKLQkJcFR4RC0+UVNFTD0gRklGT19IQ0NBOwotCSovCi0JcFR4RC0+RE1BRE9ORSA9IDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1faW5mby5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX2luZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1MWU5OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1faW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcxOCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCWNtbV9pbmZvLmMKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLUlOVAlTaG93X1NTSURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19XaXJlbGVzc01vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfRnJhZ1RocmVzaG9sZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUlOVAlTaG93X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0RXh0Y2hhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0h0QmFXaW5TaXplX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRSZGdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19IdEFtc2R1X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfSHRBdXRvQmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19Db3VudHJ5UmVnaW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNob3dfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0jZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfSUVFRTgwMjExSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLUlOVAlTaG93X05ldHdvcmtUeXBlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1JTlQJU2hvd19BdXRoTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0VuY3J5cFR5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19EZWZhdWx0S2V5SURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXkxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfS2V5Ml9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1Zik7Ci0KLUlOVAlTaG93X0tleTNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpOwotCi1JTlQJU2hvd19LZXk0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotSU5UCVNob3dfV1BBUFNLX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKTsKLQotc3RhdGljIHN0cnVjdCB7Ci0JUFNUUklORyBuYW1lOwotCUlOVCAoKnNob3dfcHJvYykoUFJUTVBfQURBUFRFUiBwQWRhcHRlciwgUFNUUklORyBhcmcpOwotfSAqUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQywgUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DW10gPSB7Ci0JeyJTU0lEIiwJCQkJCVNob3dfU1NJRF9Qcm9jfSwKLQl7IldpcmVsZXNzTW9kZSIsCQkJU2hvd19XaXJlbGVzc01vZGVfUHJvY30sCi0JeyJUeEJ1cnN0IiwJCQkJCVNob3dfVHhCdXJzdF9Qcm9jfSwKLQl7IlR4UHJlYW1ibGUiLAkJCQlTaG93X1R4UHJlYW1ibGVfUHJvY30sCi0JeyJUeFBvd2VyIiwJCQkJCVNob3dfVHhQb3dlcl9Qcm9jfSwKLQl7IkNoYW5uZWwiLAkJCQkJU2hvd19DaGFubmVsX1Byb2N9LAotCXsiQkdQcm90ZWN0aW9uIiwJCQlTaG93X0JHUHJvdGVjdGlvbl9Qcm9jfSwKLQl7IlJUU1RocmVzaG9sZCIsCQkJU2hvd19SVFNUaHJlc2hvbGRfUHJvY30sCi0JeyJGcmFnVGhyZXNob2xkIiwJCQlTaG93X0ZyYWdUaHJlc2hvbGRfUHJvY30sCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JeyJIdEJ3IiwJCQkJCVNob3dfSHRCd19Qcm9jfSwKLQl7Ikh0TWNzIiwJCQkJCVNob3dfSHRNY3NfUHJvY30sCi0JeyJIdEdpIiwJCQkJCVNob3dfSHRHaV9Qcm9jfSwKLQl7Ikh0T3BNb2RlIiwJCQkJU2hvd19IdE9wTW9kZV9Qcm9jfSwKLQl7Ikh0RXh0Y2hhIiwJCQkJU2hvd19IdEV4dGNoYV9Qcm9jfSwKLQl7Ikh0TXBkdURlbnNpdHkiLAkJCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jfSwKLQl7Ikh0QmFXaW5TaXplIiwJCSAgICAgICAgU2hvd19IdEJhV2luU2l6ZV9Qcm9jfSwKLQl7Ikh0UmRnIiwJCQkJU2hvd19IdFJkZ19Qcm9jfSwKLQl7Ikh0QW1zZHUiLAkJCQlTaG93X0h0QW1zZHVfUHJvY30sCi0JeyJIdEF1dG9CYSIsCQkgICAgICAgIFNob3dfSHRBdXRvQmFfUHJvY30sCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JeyJDb3VudHJ5UmVnaW9uIiwJCQlTaG93X0NvdW50cnlSZWdpb25fUHJvY30sCi0JeyJDb3VudHJ5UmVnaW9uQUJhbmQiLAkJU2hvd19Db3VudHJ5UmVnaW9uQUJhbmRfUHJvY30sCi0JeyJDb3VudHJ5Q29kZSIsCQkJCVNob3dfQ291bnRyeUNvZGVfUHJvY30sCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCXsiUGt0QWdncmVnYXRlIiwJCQlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jfSwKLSNlbmRpZgotCi0jaWZkZWYgV01NX1NVUFBPUlQKLQl7IldtbUNhcGFibGUiLAkJCQlTaG93X1dtbUNhcGFibGVfUHJvY30sCi0jZW5kaWYKLQl7IklFRUU4MDIxMUgiLAkJCQlTaG93X0lFRUU4MDIxMUhfUHJvY30sCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0gICAgeyJOZXR3b3JrVHlwZSIsCQkJCVNob3dfTmV0d29ya1R5cGVfUHJvY30sCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JeyJBdXRoTW9kZSIsCQkJCVNob3dfQXV0aE1vZGVfUHJvY30sCi0JeyJFbmNyeXBUeXBlIiwJCQkJU2hvd19FbmNyeXBUeXBlX1Byb2N9LAotCXsiRGVmYXVsdEtleUlEIiwJCQlTaG93X0RlZmF1bHRLZXlJRF9Qcm9jfSwKLQl7IktleTEiLAkJCQkJU2hvd19LZXkxX1Byb2N9LAotCXsiS2V5MiIsCQkJCQlTaG93X0tleTJfUHJvY30sCi0JeyJLZXkzIiwJCQkJCVNob3dfS2V5M19Qcm9jfSwKLQl7IktleTQiLAkJCQkJU2hvd19LZXk0X1Byb2N9LAotCXsiV1BBUFNLIiwJCQkJCVNob3dfV1BBUFNLX1Byb2N9LAotCXtOVUxMLCBOVUxMfQotfTsKLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQgRHJpdmVyIHZlcnNpb24uCi0KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0RyaXZlclZlcnNpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIHZlcnNpb24tJXNcbiIsIFNUQV9EUklWRVJfVkVSU0lPTikpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQ291bnRyeSBSZWdpb24uCi0gICAgICAgIFRoaXMgY29tbWFuZCB3aWxsIG5vdCB3b3JrLCBpZiB0aGUgZmllbGQgb2YgQ291bnRyeVJlZ2lvbiBpbiBlZXByb20gaXMgcHJvZ3JhbW1lZC4KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JaW50IHJldHZhbDsKLQotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0JcmV0dmFsID0gUlRfQ2ZnU2V0Q291bnRyeVJlZ2lvbihwQWQsIGFyZywgQkFORF8yNEcpOwotCWlmIChyZXR2YWwgPT0gRkFMU0UpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIGlmIHNldCBjb3VudHJ5IHJlZ2lvbiwgZHJpdmVyIG5lZWRzIHRvIGJlIHJlc2V0Ci0JQnVpbGRDaGFubmVsTGlzdChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NvdW50cnlSZWdpb25fUHJvYzo6KENvdW50cnlSZWdpb249JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBDb3VudHJ5IFJlZ2lvbiBmb3IgQSBiYW5kLgotICAgICAgICBUaGlzIGNvbW1hbmQgd2lsbCBub3Qgd29yaywgaWYgdGhlIGZpZWxkIG9mIENvdW50cnlSZWdpb24gaW4gZWVwcm9tIGlzIHByb2dyYW1tZWQuCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JaW50IHJldHZhbDsKLQotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0JcmV0dmFsID0gUlRfQ2ZnU2V0Q291bnRyeVJlZ2lvbihwQWQsIGFyZywgQkFORF81Ryk7Ci0JaWYgKHJldHZhbCA9PSBGQUxTRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gaWYgc2V0IGNvdW50cnkgcmVnaW9uLCBkcml2ZXIgbmVlZHMgdG8gYmUgcmVzZXQKLQlCdWlsZENoYW5uZWxMaXN0KHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQ291bnRyeVJlZ2lvbkFCYW5kX1Byb2M6OihDb3VudHJ5UmVnaW9uPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXaXJlbGVzcyBNb2RlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JSU5UCXN1Y2Nlc3MgPSBUUlVFOwotCi0Jc3VjY2VzcyA9IFJUX0NmZ1NldFdpcmVsZXNzTW9kZShwQWQsIGFyZyk7Ci0JaWYgKHN1Y2Nlc3MpCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCUxPTkcJV2lyZWxlc3NNb2RlID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKLQotCQkJUlRNUFNldFBoeU1vZGUocEFkLCBXaXJlbGVzc01vZGUpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKFdpcmVsZXNzTW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gRkFMU0U7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkvLyBTZXQgQWRob2NNb2RlIHJhdGVzCi0JCQlpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQl7Ci0JCQkJTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0JCQkJTWFrZUlic3NCZWFjb24ocEFkKTsgICAgICAgICAgIC8vIHJlLWJ1aWxkIEJFQUNPTiBmcmFtZQotCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkvLyBpdCBpcyBuZWVkZWQgdG8gc2V0IFNTSUQgdG8gdGFrZSBlZmZlY3QKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJU2V0Q29tbW9uSFQocEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dpcmVsZXNzTW9kZV9Qcm9jOjooPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUGh5TW9kZSkpOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfV2lyZWxlc3NNb2RlX1Byb2M6OnBhcmFtZXRlcnMgb3V0IG9mIHJhbmdlXG4iKSk7Ci0JfQotCi0JcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IENoYW5uZWwKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQ2hhbm5lbF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JSU5UCQlzdWNjZXNzID0gVFJVRTsKLQlVQ0hBUglDaGFubmVsOwotCi0JQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCS8vIGNoZWNrIGlmIHRoaXMgY2hhbm5lbCBpcyB2YWxpZAotCWlmIChDaGFubmVsU2FuaXR5KHBBZCwgQ2hhbm5lbCkgPT0gVFJVRSkKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBDaGFubmVsOwotCi0JCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7Ci0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDApCi0JCQkJewotCQkJCQlOX1NldENlbkNoKHBBZCk7Ci0JCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwLCBjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAotCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCQkJCX0KLQkJCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJewotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzIwLCBDaGFubmVsKCVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlzdWNjZXNzID0gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJc3VjY2VzcyA9IEZBTFNFOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCi0JaWYgKHN1Y2Nlc3MgPT0gVFJVRSkKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0NoYW5uZWxfUHJvYzo6KENoYW5uZWw9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBTaG9ydCBTbG90IFRpbWUgRW5hYmxlIG9yIERpc2FibGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfU2hvcnRTbG90X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gUlRfQ2ZnU2V0U2hvcnRTbG90KHBBZCwgYXJnKTsKLQlpZiAocmV0dmFsID09IFRSVUUpCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TaG9ydFNsb3RfUHJvYzo6KFNob3J0U2xvdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lKSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFR4IHBvd2VyCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X1R4UG93ZXJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUxPTkcgVHhQb3dlcjsKLQlJTlQgICBzdWNjZXNzID0gRkFMU0U7Ci0KLQlUeFBvd2VyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVHhQb3dlciA8PSAxMDApCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0ID0gVHhQb3dlcjsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJc3VjY2VzcyA9IFRSVUU7Ci0JfQotCWVsc2UKLQkJc3VjY2VzcyA9IEZBTFNFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1R4UG93ZXJfUHJvYzo6KFR4UG93ZXJQZXJjZW50YWdlPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgMTFCLzExRyBQcm90ZWN0aW9uCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0Jc3dpdGNoIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApKQotCXsKLQkJY2FzZSAwOiAvL0FVVE8KLQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxOiAvL0Fsd2F5cyBPbgotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQkdQcm90ZWN0aW9uX1Byb2M6OihCR1Byb3RlY3Rpb249JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhQcmVhbWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeFByZWFtYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlSVF84MDJfMTFfUFJFQU1CTEUJUHJlYW1ibGU7Ci0KLQlQcmVhbWJsZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQotCXN3aXRjaCAoUHJlYW1ibGUpCi0JewotCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJYnJlYWs7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUF1dG86Ci0JCQkvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncwotCQkJLy8gY2FwYWJpbGl0eSB1cG9uIGFzc29jaWF0aW9uLgotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFByZWFtYmxlOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlNbG1lU2V0VHhQcmVhbWJsZShwQWQsIFJ0ODAyXzExUHJlYW1ibGVMb25nKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhQcmVhbWJsZV9Qcm9jOjooVHhQcmVhbWJsZT0lbGQpXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgUlRTIFRocmVzaG9sZAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9SVFNUaHJlc2hvbGRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCSBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7Ci0KLQlSdHNUaHJlc2ggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYoKFJ0c1RocmVzaCA+IDApICYmIChSdHNUaHJlc2ggPD0gTUFYX1JUU19USFJFU0hPTEQpKQotCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgID0gKFVTSE9SVClSdHNUaHJlc2g7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JZWxzZSBpZiAoUnRzVGhyZXNoID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IE1BWF9SVFNfVEhSRVNIT0xEOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9SVFNUaHJlc2hvbGRfUHJvYzo6KFJUU1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEZyYWdtZW50IFRocmVzaG9sZAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQkgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgICAgIEZyYWdUaHJlc2g7Ci0KLQlGcmFnVGhyZXNoID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0JewotCQkvL0lsbGVnYWwgRnJhZ1RocmVzaCBzbyB3ZSBzZXQgaXQgdG8gZGVmYXVsdAotCQlwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQl9Ci0JZWxzZSBpZiAoRnJhZ1RocmVzaCAlIDIgPT0gMSkKLQl7Ci0JCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50Ci0JCS8vIG9mIGFuIE1TRFUgb3IgTU1QRFUsIHdoaWNoIG1heSBiZSBlaXRoZXIgYW4gZXZlbiBvciBhbiBvZGQgbnVtYmVyIG9mIG9jdGV0cy4KLQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKShGcmFnVGhyZXNoIC0gMSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlpZiAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPT0gTUFYX0ZSQUdfVEhSRVNIT0xEKQotCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7Ci0JCWVsc2UKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRnJhZ1RocmVzaG9sZF9Qcm9jOjooRnJhZ1RocmVzaG9sZD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgVHhCdXJzdAotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlMT05HIFR4QnVyc3Q7Ci0KLQlUeEJ1cnN0ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVHhCdXJzdCA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IFRSVUU7Ci0JZWxzZSBpZiAoVHhCdXJzdCA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfVHhCdXJzdF9Qcm9jOjooVHhCdXJzdD0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFR4QnVyc3QKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfUGt0QWdncmVnYXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlMT05HIGFnZ3JlOwotCi0JYWdncmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGFnZ3JlID09IDEpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOwotCWVsc2UgaWYgKGFnZ3JlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUGt0QWdncmVnYXRlX1Byb2M6OihBR0dSRT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLQotI2lmZGVmIElORl9BTUFaT05fUFBBCi1JTlQJU2V0X0lORl9BTUFaT05fU0VfUFBBX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJYXJnKQotewotCVVMT05HIGFnZ3JlOwotCVVJTlQgc3RhdHVzOwotCi0JYWdncmUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGFnZ3JlID09IDEpCi0JewotCQlpZihwQWQtPlBQQUVuYWJsZT09VFJVRSkKLQkJewotCQkJcHJpbnRrKCJJTkZfQU1BWk9OX1NFX1BQQSBhbHJlYWR5IGVuYWJsZWQgXG4iKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChwcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbikKLQkJCXsKLQkJCQlVSU5UMzIgZ19pZl9pZDsKLQotCQkJCWlmIChwQWQtPnBEaXJlY3RwYXRoQ2IgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCSBwQWQtPnBEaXJlY3RwYXRoQ2IgPSAoUFBBX0RJUkVDVFBBVEhfQ0IgKikga21hbGxvYyAoc2l6ZW9mKFBQQV9ESVJFQ1RQQVRIX0NCKSwgR0ZQX0FUT01JQyk7Ci0JCQkJICAgICAgICBwcmludGsoIlJlYWxsb2MgbWVtb3J5IGZvciAgcERpcmVjdHBhdGhDYiA/P1xuIik7Ci0JCQkJfQotCi0JCQkJLyogcmVnaXN0ZXIgY2FsbGJhY2sgKi8KLQkJCQlwQWQtPnBEaXJlY3RwYXRoQ2ItPnJ4X2ZuID0gTlVMTDsKLQkJCQlwQWQtPnBEaXJlY3RwYXRoQ2ItPnN0b3BfdHhfZm4gPSBOVUxMOwotCQkJCXBBZC0+cERpcmVjdHBhdGhDYi0+c3RhcnRfdHhfZm4gPSBOVUxMOwotCi0JCQkJc3RhdHVzID0gcHBhX2hvb2tfZGlyZWN0cGF0aF9yZWdpc3Rlcl9kZXZfZm4oJmdfaWZfaWQsIHBBZC0+bmV0X2RldiwgcEFkLT5wRGlyZWN0cGF0aENiLCBQUEFfRl9ESVJFQ1RQQVRIX0VUSF9JRik7Ci0KLQkJCQlpZihzdGF0dXM9PTEpCi0JCQkJewotCQkJCQlwQWQtPmdfaWZfaWQ9Z19pZl9pZDsKLQkJCQkJcHJpbnRrKCJyZWdpc3RlciBJTkZfQU1BWk9OX1NFX1BQQSBzdWNjZXNzIDpyZXQ6JWQgaWQ6JWQ6JWRcbiIsc3RhdHVzLHBBZC0+Z19pZl9pZCxnX2lmX2lkKTsKLQkJCQkJcEFkLT5QUEFFbmFibGU9VFJVRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKCJyZWdpc3RlciBJTkZfQU1BWk9OX1NFX1BQQSBmYWlsIDpyZXQ6JWRcbiIsc3RhdHVzKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcmludGsoIklORl9BTUFaT05fU0VfUFBBIGVuYWJsZSBmYWlsIDogdGhlcmUgaXMgbm8gSU5GX0FNQVpPTl9TRV9QUEEgbW9kdWxlIC4gXG4iKTsKLQkJCX0KLQkJfQotCi0KLQl9Ci0JZWxzZSBpZiAoYWdncmUgPT0gMCkKLQl7Ci0JCWlmKHBBZC0+UFBBRW5hYmxlPT1GQUxTRSkKLQkJewotCi1wcmludGsoIklORl9BTUFaT05fU0VfUFBBIGFscmVhZHkgZGlzYWJsZSBcbiIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKHBwYV9ob29rX2RpcmVjdHBhdGhfcmVnaXN0ZXJfZGV2X2ZuKQotCQkJewotCQkJCVVJTlQzMiBnX2lmX2lkOwotCQkJCWdfaWZfaWQ9cEFkLT5nX2lmX2lkOwotCQkJCXByaW50aygiZ19pZl9pZD0lZCBcbiIscEFkLT5nX2lmX2lkKTsKLQkJCQlzdGF0dXM9cHBhX2hvb2tfZGlyZWN0cGF0aF9yZWdpc3Rlcl9kZXZfZm4oJmdfaWZfaWQsIHBBZC0+bmV0X2RldiwgTlVMTCwgUFBBX0ZfRElSRUNUUEFUSF9ERVJFR0lTVEVSKTsKLQotCQkJCWlmKHN0YXR1cz09MSkKLQkJCQl7Ci0JCQkJCXBBZC0+Z19pZl9pZD0wOwotCQkJCQlwcmludGsoInVucmVnaXN0ZXIgSU5GX0FNQVpPTl9TRV9QUEEgc3VjY2VzcyA6cmV0OiVkXG4iLHN0YXR1cyk7Ci0JCQkJCXBBZC0+UFBBRW5hYmxlPUZBTFNFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcmludGsoInVucmVnaXN0ZXIgSU5GX0FNQVpPTl9TRV9QUEEgZmFpbCA6cmV0OiVkXG4iLHN0YXR1cyk7Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRrKCJJTkZfQU1BWk9OX1NFX1BQQSBlbmFibGUgZmFpbCA6IHRoZXJlIGlzIG5vIElORl9BTUFaT05fU0VfUFBBIG1vZHVsZSAuIFxuIik7Ci0JCQl9Ci0JCX0KLQotCX0KLQllbHNlCi0JewotCQlwcmludGsoIkludmFsaWQgYXJndW1lbnQgJWQgXG4iLGFnZ3JlKTsKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1BQQSAvLwotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IElFRUU4MDIxMUguCi0gICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIDEgd2hlbiBuZWVkcyByYWRhciBkZXRlY3Rpb24sIG90aGVyd2lzZSAwCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIExPTkcgaWVlZTgwMjExaDsKLQotCWllZWU4MDIxMWggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKGllZWU4MDIxMWggPT0gMSkKLQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBUUlVFOwotCWVsc2UgaWYgKGllZWU4MDIxMWggPT0gMCkKLQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0lFRUU4MDIxMUhfUHJvYzo6KElFRUU4MDIxMUg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotI2lmZGVmIERCRwotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBGb3IgRGVidWcgaW5mb3JtYXRpb24KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfRGVidWdfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfRGVidWdfUHJvYyAqKioqKioqKioqKioqKioqKioqXG4iKSk7Ci0KLSAgICBpZihzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApIDw9IFJUX0RFQlVHX0xPVUQpCi0gICAgICAgIFJURGVidWdMZXZlbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gU2V0X0RlYnVnX1Byb2MoUlREZWJ1Z0xldmVsID0gJWxkKVxuIiwgUlREZWJ1Z0xldmVsKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZgotCi1JTlQJU2hvd19EZXNjSW5mb19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JSU5UIGksIFF1ZUlkeD0wOwotLy8gIFVMT05HCVJlZ1ZhbHVlOwotICAgICAgICBQUlQyOFhYX1JYRF9TVFJVQyBwUnhEOwotICAgICAgICBQVFhEX1NUUlVDIHBUeEQ7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1F1ZUlkeF07Ci0JUFJUTVBfTUdNVF9SSU5HCXBNZ210UmluZyA9ICZwQWQtPk1nbXRSaW5nOwotCVBSVE1QX1JYX1JJTkcJcFJ4UmluZyA9ICZwQWQtPlJ4UmluZzsKLQotCWZvcihpPTA7aTxUWF9SSU5HX1NJWkU7aSsrKQotCXsKLQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW2ldLkFsbG9jVmE7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJEZXNjICMlZFxuIixpKSk7Ci0JICAgIGhleF9kdW1wKCJUeCBEZXNjcmlwdG9yIiwgKFBVQ0hBUilwVHhELCAxNik7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJwVHhELT5ETUFET05FID0gJXhcbiIsIHBUeEQtPkRNQURPTkUpKTsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikpOwotCWZvcihpPTA7aTxNR01UX1JJTkdfU0laRTtpKyspCi0JewotCSAgICBwVHhEID0gKFBUWERfU1RSVUMpIHBNZ210UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCSAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiRGVzYyAjJWRcbiIsaSkpOwotCSAgICBoZXhfZHVtcCgiTWdtdCBEZXNjcmlwdG9yIiwgKFBVQ0hBUilwVHhELCAxNik7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJwTWdtdC0+RE1BRE9ORSA9ICV4XG4iLCBwVHhELT5ETUFET05FKSk7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpKTsKLQlmb3IoaT0wO2k8UlhfUklOR19TSVpFO2krKykKLQl7Ci0JICAgIHBSeEQgPSAoUFJUMjhYWF9SWERfU1RSVUMpIHBSeFJpbmctPkNlbGxbaV0uQWxsb2NWYTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkRlc2MgIyVkXG4iLGkpKTsKLQkgICAgaGV4X2R1bXAoIlJ4IERlc2NyaXB0b3IiLCAoUFVDSEFSKXBSeEQsIDE2KTsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoInBSeEQtPkRET05FID0gJXhcbiIsIHBSeEQtPkRET05FKSk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgUmVzZXQgc3RhdGlzdGljcyBjb3VudGVyCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgICBhcmcKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9SZXNldFN0YXRDb3VudGVyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQkvL1VDSEFSICAgICAgICAgICBpOwotCS8vTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT5TZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jXG4iKSk7Ci0KLQkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgY291bnRlcnMKLQlOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5Db3VudGVyczgwMjMsIHNpemVvZihDT1VOVEVSXzgwMl8zKSk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+UmFsaW5rQ291bnRlcnMsIHNpemVvZihDT1VOVEVSX1JBTElOSykpOwotCi0JLy8gUmVzZXQgSG90U3BvdCBjb3VudGVyCi0KLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQWRkIFdQQSBrZXkgcHJvY2Vzcy4KLQkJSW4gQWRob2MgV1BBTk9ORSwgYlBhaXJ3aXNlID0gMDsgIEtleUlkeCA9IDA7Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwQnVmCQkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1VDQ0VTUwkJCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCi0gICAgSU4gIENIQVIgKnBJblB1dFN0ciwKLSAgICBJTiAgVUNIQVIgc3RyTGVuKQotewotICAgIFVDSEFSIGk9MDsKLQotICAgIGZvciAoaT0wOyBpPHN0ckxlbjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChwSW5QdXRTdHJbaV0gPCAweDIxKSB8fAotICAgICAgICAgICAgKHBJblB1dFN0cltpXSA+IDB4N0UpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVtb3ZlIFdQQSBLZXkgcHJvY2VzcwotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcEJ1ZgkJCQkJCQlQb2ludGVyIHRvIHRoZSB3aGVyZSB0aGUga2V5IHN0b3JlZAotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NVQ0NFU1MJCQkJCUFkZCBrZXkgc3VjY2Vzc2Z1bGx5Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgTE9ORyAgICAgICAgICAgIFJhdGVzKQotewotICAgIE5ESVNfODAyXzExX1JBVEVTIGFyeVJhdGVzOwotCi0gICAgbWVtc2V0KCZhcnlSYXRlcywgMHgwMCwgc2l6ZW9mKE5ESVNfODAyXzExX1JBVEVTKSk7Ci0gICAgc3dpdGNoIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUpCi0gICAgewotICAgICAgICBjYXNlIFBIWV8xMUE6IC8vIEEgb25seQotICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDYwOyAvLyA0OE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMl0gPSAweDQ4OyAvLyAzNk1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNF0gPSAweDI0OyAvLyAxOE0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNV0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbNl0gPSAweDEyOyAvLyA5TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s3XSA9IDB4MGM7IC8vIDZNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQSFlfMTFCR19NSVhFRDogLy8gQi9HIE1peGVkCi0gICAgICAgIGNhc2UgUEhZXzExQjogLy8gQiBvbmx5Ci0gICAgICAgIGNhc2UgUEhZXzExQUJHX01JWEVEOiAvLyBBL0IvRyBNaXhlZAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgc3dpdGNoIChSYXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwMDAwMDA6IC8vMU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDAyOwotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjAwMDAwMDogLy8yTQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MDQ7Ci0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1MDAwMDAwOiAvLzUuNU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBiOyAvLyA1LjVNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTAwMDAwMDogLy8xMU0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE2OyAvLyAxMU0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDYwMDAwMDA6IC8vNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDBjOyAvLyA2TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgOTAwMDAwMDogLy85TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTI7IC8vIDlNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjAwMDAwMDogLy8xMk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDE4OyAvLyAxMk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU18yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE4MDAwMDAwOiAvLzE4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MjQ7IC8vIDE4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDAwMDA6IC8vMjRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHgzMDsgLy8gMjRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNjAwMDAwMDogLy8zNk0KLSAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDQ4OyAvLyAzNk0KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU181OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwMDAwOiAvLzQ4TQotICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4NjA7IC8vIDQ4TQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzY7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNTQwMDAwMDA6IC8vNTRNCi0gICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzBdID0gMHg2YzsgLy8gNTRNCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfNzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAtMTogLy9BdXRvCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotICAgICAgICAgICAgICAgICAgICB7IC8vQiBPbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1swXSA9IDB4MTY7IC8vIDExTWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMV0gPSAweDBiOyAvLyA1LjVNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4MDQ7IC8vIDJNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1szXSA9IDB4MDI7IC8vIDFNYnBzCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7IC8vKEIvRykgTWl4ZWQgb3IgKEEvQi9HKSBNaXhlZAotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbMF0gPSAweDZjOyAvLyA1NE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzFdID0gMHg2MDsgLy8gNDhNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1syXSA9IDB4NDg7IC8vIDM2TWJwcwotICAgICAgICAgICAgICAgICAgICAgICAgYXJ5UmF0ZXNbM10gPSAweDMwOyAvLyAyNE1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzRdID0gMHgxNjsgLy8gMTFNYnBzCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnlSYXRlc1s1XSA9IDB4MGI7IC8vIDUuNU1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzZdID0gMHgwNDsgLy8gMk1icHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyeVJhdGVzWzddID0gMHgwMjsgLy8gMU1icHMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBSVE1QU2V0RGVzaXJlZFJhdGVzICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNF0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAotICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNl0scEFkYXB0ZXItPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzddICkpOwotICAgIC8vIENoYW5naW5nIERlc2lyZWRSYXRlIG1heSBhZmZlY3QgdGhlIE1BWCBUWCByYXRlIHdlIHVzZWQgdG8gVFggZnJhbWVzIG91dAotICAgIE1sbWVVcGRhdGVUeFJhdGVzKHBBZGFwdGVyLCBGQUxTRSwgMCk7Ci19Ci0KLU5ESVNfU1RBVFVTIFJUTVBXUEFSZW1vdmVLZXlQcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBWT0lECQkJcEJ1ZikKLXsKLQlQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSBwS2V5OwotCVVMT05HCQkJCQlLZXlJZHg7Ci0JTkRJU19TVEFUVVMJCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCUJPT0xFQU4JCWJUeEtleTsJCQkvLyBTZXQgdGhlIGtleSBhcyB0cmFuc21pdCBrZXkKLQlCT09MRUFOCQliUGFpcndpc2U7CQkvLyBJbmRpY2F0ZSB0aGUga2V5IGlzIHBhaXJ3aXNlIGtleQotCUJPT0xFQU4JCWJLZXlSU0M7CQkvLyBpbmRpY2F0ZSB0aGUgcmVjZWl2ZSAgU0Mgc2V0IGJ5IEtleVJTQyB2YWx1ZS4KLQkJCQkJCQkJLy8gT3RoZXJ3aXNlLCBpdCB3aWxsIHNldCBieSB0aGUgTklDLgotCUJPT0xFQU4JCWJBdXRoZW50aWNhdG9yOyAvLyBpbmRpY2F0ZSBrZXkgaXMgc2V0IGJ5IGF1dGhlbnRpY2F0b3IuCi0JSU5UCQlpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLS0+IFJUTVBXUEFSZW1vdmVLZXlQcm9jXG4iKSk7Ci0KLQlwS2V5ID0gKFBORElTXzgwMl8xMV9SRU1PVkVfS0VZKSBwQnVmOwotCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHhmZjsKLQkvLyBCaXQgMzEgb2YgQWRkLWtleSwgVHggS2V5Ci0JYlR4S2V5CQkgICA9IChwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApID8gVFJVRSA6IEZBTFNFOwotCS8vIEJpdCAzMCBvZiBBZGQta2V5IFBhaXJ3aXNlS2V5Ci0JYlBhaXJ3aXNlCSAgID0gKHBLZXktPktleUluZGV4ICYgMHg0MDAwMDAwMCkgPyBUUlVFIDogRkFMU0U7Ci0JLy8gQml0IDI5IG9mIEFkZC1rZXkgS2V5UlNDCi0JYktleVJTQwkJICAgPSAocEtleS0+S2V5SW5kZXggJiAweDIwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQkvLyBCaXQgMjggb2YgQWRkLWtleSBBdXRoZW50aWNhdG9yCi0JYkF1dGhlbnRpY2F0b3IgPSAocEtleS0+S2V5SW5kZXggJiAweDEwMDAwMDAwKSA/IFRSVUUgOiBGQUxTRTsKLQotCS8vIDEuIElmIGJUeCBpcyBUUlVFLCByZXR1cm4gZmFpbHVyZSBpbmZvcm1hdGlvbgotCWlmIChiVHhLZXkgPT0gVFJVRSkKLQkJcmV0dXJuKE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQSk7Ci0KLQkvLyAyLiBDaGVjayBQYWlyd2lzZSBLZXkKLQlpZiAoYlBhaXJ3aXNlKQotCXsKLQkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIHBhaXJ3aXNlIGtleXMuCi0JCS8vIGIuIElmIG5vdCBicm9hZGNhc3QsIHJlbW92ZSB0aGUgcGFpcndpc2Ugc3BlY2lmaWVkIGJ5IEJTU0lECi0JCWZvciAoaSA9IDA7IGkgPCBTSEFSRV9LRVlfTlVNOyBpKyspCi0JCXsKLQkJCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPlNoYXJlZEtleVtCU1MwXVtpXS5Cc3NJZCwgcEtleS0+QlNTSUQpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFdQQVJlbW92ZUtleVByb2MoS2V5SWR4PSVkKVxuIiwgaSkpOwotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2ldLktleUxlbiA9IDA7Ci0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0JCQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgKFVDSEFSKWkpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gMy4gR3JvdXAgS2V5Ci0JZWxzZQotCXsKLQkJLy8gYS4gSWYgQlNTSUQgaXMgYnJvYWRjYXN0LCByZW1vdmUgYWxsIGdyb3VwIGtleXMgaW5kZXhlZAotCQkvLyBiLiBJZiBCU1NJRCBtYXRjaGVkLCBkZWxldGUgdGhlIGdyb3VwIGtleSBpbmRleGVkLgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBXUEFSZW1vdmVLZXlQcm9jKEtleUlkeD0lbGQpXG4iLCBLZXlJZHgpKTsKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOwotCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQlBc2ljUmVtb3ZlU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCAoVUNIQVIpS2V5SWR4KTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQl9Ci0KLQlyZXR1cm4gKFN0YXR1cyk7Ci19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlbW92ZSBBbGwgV1BBIEtleXMKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFdQQVJlbW92ZUFsbEtleXMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0KLQlVQ0hBUglpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSVE1QV1BBUmVtb3ZlQWxsS2V5cyhBdXRoTW9kZT0lZCwgV2VwU3RhdHVzPSVkKVxuIiwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cykpOwotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQkvLyBGb3IgV0VQL0NLSVAsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKLQkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQlyZXR1cm47Ci0KLQkvLyBGb3IgV1BBLU5vbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVtb3ZlIGl0LCBzaW5jZSBXaW5YUCB3b24ndCBzZXQgaXQgYWdhaW4gYWZ0ZXIKLQkvLyBMaW5rIHVwLiBBbmQgaXQgd2lsbCBiZSByZXBsYWNlZCBpZiB1c2VyIGNoYW5nZWQgaXQuCi0JaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCXJldHVybjsKLQotCS8vIHNldCBCU1NJRCB3Y2lkIGVudHJ5IG9mIHRoZSBQYWlyLXdpc2UgS2V5IHRhYmxlIGFzIG5vLXNlY3VyaXR5IG1vZGUKLQlBc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIEJTU0lEX1dDSUQpOwotCi0JLy8gc2V0IGFsbCBzaGFyZWQga2V5IG1vZGUgYXMgbm8tc2VjdXJpdHkuCi0JZm9yIChpID0gMDsgaSA8IFNIQVJFX0tFWV9OVU07IGkrKykKLSAgICB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicmVtb3ZlICVzIGtleSAjJWRcbiIsIENpcGhlck5hbWVbcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0uQ2lwaGVyQWxnXSwgaSkpOwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1baV0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0KLQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaSk7Ci0JfQotCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0KLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQXMgU1RBJ3MgQlNTSUQgaXMgYSBXQyB0b28sIGl0IHVzZXMgc2hhcmVkIGtleSB0YWJsZS4KLQkJVGhpcyBmdW5jdGlvbiB3cml0ZSBjb3JyZWN0IHVuaWNhc3QgVFgga2V5IHRvIEFTSUMgV0NJRC4KLQkJQW5kIHdlIHN0aWxsIG1ha2UgYSBjb3B5IGluIG91ciBNYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5QYWlyd2lzZUtleS4KLQkJQ2FsbGVyIGd1YXJhbnRlZSBUS0lQL0FFUyBhbHdheXMgaGFzIGtleWlkeCA9IDAuIChwYWlyd2lzZSBrZXkpCi0JCUNhbGxlciBndWFyYW50ZWUgV0VQIGNhbGxzIHRoaXMgZnVuY3Rpb24gd2hlbiBzZXQgVHhrZXksICBkZWZhdWx0IGtleSBpbmRleD0wfjMuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwS2V5CQkJCQkJCVBvaW50ZXIgdG8gdGhlIHdoZXJlIHRoZSBrZXkgc3RvcmVkCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1VDQ0VTUwkJCQkJQWRkIGtleSBzdWNjZXNzZnVsbHkKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2hhbmdlIE5JQyBQSFkgbW9kZS4gUmUtYXNzb2NpYXRpb24gbWF5IGJlIG5lY2Vzc2FyeS4gcG9zc2libGUgc2V0dGluZ3MKLQkJaW5jbHVkZSAtIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfMTFBLCBhbmQgUEhZXzExQUJHX01JWEVECi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAtIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcGh5bW9kZSAgLQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFNldFBoeU1vZGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUxPTkcgcGh5bW9kZSkKLXsKLQlJTlQgaTsKLQkvLyB0aGUgc2VsZWN0ZWQgcGh5bW9kZSBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgUkYgSUMgZW5jb2RlZCBpbiBFMlBST00KLQotCS8vIGlmIG5vIGNoYW5nZSwgZG8gbm90aGluZwotCS8qIGJ1ZyBmaXgKLQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBwaHltb2RlKQotCQlyZXR1cm47Ci0gICAgKi8KLQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gKFVDSEFSKXBoeW1vZGU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBTZXRQaHlNb2RlIDogUGh5TW9kZT0lZCwgY2hhbm5lbD0lZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JQnVpbGRDaGFubmVsTGlzdEV4KHBBZCk7Ci0jZWxzZQotCUJ1aWxkQ2hhbm5lbExpc3QocEFkKTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQkvLyBzYW5pdHkgY2hlY2sgdXNlciBzZXR0aW5nCi0JZm9yIChpID0gMDsgaSA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID09IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU2V0UGh5TW9kZTogY2hhbm5lbCBpcyBvdXQgb2YgcmFuZ2UsIHVzZSBmaXJzdCBjaGFubmVsPSVkIFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JTmRpc1plcm9NZW1vcnkocEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCXN3aXRjaCAocGh5bW9kZSkgewotCQljYXNlIFBIWV8xMUI6Ci0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4ODI7CSAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDg0OwkgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg4QjsJICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbM10gID0gMHg5NjsJICAvLyAxMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA0OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiAgPSAwOwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVswXSAgPSAyOwkgICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzFdICA9IDQ7CSAgIC8vIDIgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMTE7ICAgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSAgPSAyMjsgICAgLy8gMTEgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsgLy8gVGhpcyBNT0RFIGlzIG9ubHkgRllJLiBub3QgdXNlCi0JCQlicmVhazsKLQotCQljYXNlIFBIWV8xMUc6Ci0JCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMU5fMl80RzoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMF0gID0gMHg4MjsJICAvLyAxIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzFdICA9IDB4ODQ7CSAgLy8gMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsyXSAgPSAweDhCOwkgIC8vIDUuNSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDk2OwkgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLCBiYXNpYyByYXRlCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4MTI7CSAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs1XSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzZdICA9IDB4NDg7CSAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbN10gID0gMHg2YzsJICAvLyA1NCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZUxlbiAgPSA4OwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVswXSAgPSAweDBDOwkgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVbMV0gID0gMHgxODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRXh0UmF0ZVsyXSAgPSAweDMwOwkgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5FeHRSYXRlWzNdICA9IDB4NjA7CSAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gNDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMjsJICAgLy8gMSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxXSAgPSA0OwkgICAvLyAyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzJdICA9IDExOyAgICAvLyA1LjUgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbM10gID0gMjI7ICAgIC8vIDExIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzRdICA9IDEyOyAgICAvLyA2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdICA9IDE4OyAgICAvLyA5IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDI0OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAzNjsgICAgLy8gMTggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbOF0gID0gNDg7ICAgIC8vIDI0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzldICA9IDcyOyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVsxMF0gPSA5NjsgICAgLy8gNDggbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMTFdID0gMTA4OyAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlicmVhazsKLQotCQljYXNlIFBIWV8xMUE6Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQUdOX01JWEVEOgotCQljYXNlIFBIWV8xMU5fNUc6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzBdICA9IDB4OEM7CSAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVsxXSAgPSAweDEyOwkgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbMl0gID0gMHg5ODsJICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVszXSAgPSAweDI0OwkgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzRdICA9IDB4YjA7CSAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVbNV0gID0gMHg0ODsJICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuU3VwUmF0ZVs2XSAgPSAweDYwOwkgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5TdXBSYXRlWzddICA9IDB4NmM7CSAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4gID0gODsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4gID0gMDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMF0gID0gMTI7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0gID0gMTg7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0gID0gMjQ7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzNdICA9IDM2OyAgICAvLyAxOCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSAgPSA0ODsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbNV0gID0gNzI7ICAgIC8vIDM2IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdICA9IDk2OyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs3XSAgPSAxMDg7ICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07IC8vIFRoaXMgTU9ERSBpcyBvbmx5IEZZSS4gbm90IHVzZQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCi0JcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOwotfQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ2FsbGVyIGVuc3VyZXMgd2UgaGFzIDgwMi4xMW4gc3VwcG9ydC4KLQkJQ2FsbHMgYXQgc2V0dGluZyBIVCBmcm9tIEFQL1NUQVNldGluZm9ybWF0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCXBBZCAtIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcGh5bW9kZSAgLQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0SFQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKQotewotCS8vVUxPTkcJKnBtY3M7Ci0JVUlOVDMyCVZhbHVlID0gMDsKLQlVQ0hBUglCQlBWYWx1ZSA9IDA7Ci0JVUNIQVIJQkJQM1ZhbHVlID0gMDsKLQlVQ0hBUglSeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogSFRfbW9kZSglZCksIEV4dE9mZnNldCglZCksIE1DUyglZCksIEJXKCVkKSwgU1RCQyglZCksIFNIT1JUR0koJWQpXG4iLAotCQkJCQkJCQkJCXBIVFBoeU1vZGUtPkh0TW9kZSwgcEhUUGh5TW9kZS0+RXh0T2Zmc2V0LAotCQkJCQkJCQkJCXBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsCi0JCQkJCQkJCQkJcEhUUGh5TW9kZS0+U1RCQywgcEhUUGh5TW9kZS0+U0hPUlRHSSkpOwotCi0JLy8gRG9uJ3QgemVybyBzdXBwb3J0ZWRIeVBoeSBzdHJ1Y3R1cmUuCi0JUlRNUFplcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuTmV3RXh0Q2hhbk9mZnNldCwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLk5ld0V4dENoYW5PZmZzZXQpKTsKLQlSVE1QWmVyb01lbW9yeSgmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LCBzaXplb2YocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5KSk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuYlJkZykKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDE7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCA9IDA7Ci0JfQotCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSAzOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IgPSAzOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogUnhCQVdpbkxpbWl0ID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKLQotCS8vIE1pbW8gcG93ZXIgc2F2ZSwgQS1NU0RVIHNpemUsCi0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGU7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NcGR1RGVuc2l0eSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHk7Ci0KLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZSA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1U2l6ZTsKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNldEhUIDogQU1zZHVTaXplID0gJWQsIE1pbW9QcyA9ICVkLCBNcGR1RGVuc2l0eSA9ICVkLCBNYXhSQW1wZHVGYWN0b3IgPSAlZFxuIiwKLQkJCQkJCQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMsCi0JCQkJCQkJCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5LAotCQkJCQkJCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NYXhSQW1wZHVGYWN0b3IpKTsKLQotCWlmKHBIVFBoeU1vZGUtPkh0TW9kZSA9PSBIVE1PREVfR0YpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGID0gMTsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGID0gMTsKLQl9Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuR0YgPSAwOwotCi0JLy8gRGVjaWRlIFJ4IE1DU1NldAotCXN3aXRjaCAoUnhTdHJlYW0pCi0JewotCQljYXNlIDE6Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4MDA7Ci0JCQlicmVhazsKLQotCQljYXNlIDI6Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gIDB4ZmY7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gIDB4ZmY7Ci0JCQlicmVhazsKLQotCQljYXNlIDM6IC8vIDMqMwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9ICAweGZmOwotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9ICAweGZmOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCAmJiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA8PSAxNCkgJiYgKHBIVFBoeU1vZGUtPkJXID09IEJXXzQwKSApCi0JewotCQlwSFRQaHlNb2RlLT5CVyA9IEJXXzIwOwotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkZvcnR5X01oel9JbnRvbGVyYW50ID0gMTsKLQl9Ci0KLQlpZihwSFRQaHlNb2RlLT5CVyA9PSBCV180MCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5NQ1NTZXRbNF0gPSAweDE7IC8vIE1DUyAzMgotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IDE7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DQ0ttb2RlaW40MCA9IDE7Ci0KLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKT8gKEVYVENIQV9CRUxPVyk6IEVYVENIQV9BQk9WRTsKLQkJLy8gU2V0IFJlZ3NpdGVyIGZvciBleHRlbnNpb24gY2hhbm5lbCBwb3NpdGlvbi4KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQM1ZhbHVlKTsKLQkJaWYgKChwSFRQaHlNb2RlLT5FeHRPZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSkKLQkJewotCQkJVmFsdWUgfD0gMHgxOwotCQkJQkJQM1ZhbHVlIHw9ICgweDIwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHBIVFBoeU1vZGUtPkV4dE9mZnNldCA9PSBFWFRDSEFfQUJPVkUpKQotCQl7Ci0JCQlWYWx1ZSAmPSAweGZlOwotCQkJQkJQM1ZhbHVlICY9ICh+MHgyMCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCQl9Ci0KLQkJLy8gVHVybiBvbiBCQlAgNDBNSHogbW9kZSBub3cgb25seSBhcyBBUCAuCi0JCS8vIFN0YSBjYW4gdHVybiBvbiBCQlAgNDBNSHogYWZ0ZXIgY29ubmVjdGlvbiB3aXRoIDQwTUh6IEFQLiBTdGEgb25seSBicm9hZGNhc3QgNDBNSHogY2FwYWJpbGl0eSBiZWZvcmUgY29ubmVjdGlvbi4KLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApIHx8IElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKQotCQkJKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQkJQkJQVmFsdWUgfD0gMHgxMDsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQkJQM1ZhbHVlKTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID0gMDsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uUmVjb21XaWR0aCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9IEVYVENIQV9OT05FOwotCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCS8vIFR1cm4gb24gQkJQIDIwTUh6IG1vZGUgYnkgcmVxdWVzdCBoZXJlLgotCQl7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0JCX0KLQl9Ci0KLQlpZihwSFRQaHlNb2RlLT5TVEJDID09IFNUQkNfVVNFKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDID0gMTsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5SeFNUQkMgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlR4U1RCQyA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5SeFNUQkMgPSAwOwotCX0KLQotCWlmKHBIVFBoeU1vZGUtPlNIT1JUR0kgPT0gR0lfNDAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwID0gMTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwID0gMDsKLQl9Ci0KLQkvLyBXZSBzdXBwb3J0IGxpbmsgYWRhcHRhdGlvbiBmb3IgdW5zb2xpY2l0IE1DUyBmZWVkYmFjaywgc2V0IHRvIDIuCi0JcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9IE1DU0ZCS19OT05FOyAvL01DU0ZCS19VTlNPTElDSVQ7Ci0JcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkNvbnRyb2xDaGFuID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkvLyAxLCB0aGUgZXh0ZW5zaW9uIGNoYW5uZWwgYWJvdmUgdGhlIGNvbnRyb2wgY2hhbm5lbC4KLQotCS8vIEVEQ0EgcGFyYW1ldGVycyB1c2VkIGZvciBBUCdzIG93biB0cmFuc21pc3Npb24KLQlpZiAocEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPT0gRkFMU0UpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJWYWxpZCA9IFRSVUU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMF0gPSAzOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzFdID0gNzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsyXSA9IDE7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bM10gPSAxOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMF0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzFdID0gNDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsyXSA9IDM7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bM10gPSAyOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMF0gPSA2OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzFdID0gMTA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMl0gPSA0OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzNdID0gMzsKLQotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMF0gID0gMDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzFdICA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsyXSAgPSA5NDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzNdICA9IDQ3OwotCX0KLQlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJUlRNUFNldEluZGl2aWR1YWxIVChwQWQsIDApOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxsZXIgZW5zdXJlcyB3ZSBoYXMgODAyLjExbiBzdXBwb3J0LgotCQlDYWxscyBhdCBzZXR0aW5nIEhUIGZyb20gQVAvU1RBU2V0aW5mb3JtYXRpb24KLQotCUFyZ3VtZW50czoKLQkJcEFkIC0gUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwaHltb2RlICAtCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBTZXRJbmRpdmlkdWFsSFQoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCVVDSEFSCQkJCWFwaWR4KQotewotCVBSVF9IVF9QSFlfSU5GTwkJcERlc2lyZWRfaHRfcGh5ID0gTlVMTDsKLQlVQ0hBUglUeFN0cmVhbSA9IHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtOwotCVVDSEFSCURlc2lyZWRNY3MJPSBNQ1NfQVVUTzsKLQotCWRvCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCXBEZXNpcmVkX2h0X3BoeSA9ICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvOwotCQkJRGVzaXJlZE1jcyA9IHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOwotCQkJLy9wQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IChEZXNpcmVkTWNzID09IE1DU19BVVRPKSA/IFRSVUUgOiBGQUxTRTsKLQkJCQlicmVhazsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0gd2hpbGUgKEZBTFNFKTsKLQotCWlmIChwRGVzaXJlZF9odF9waHkgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IGludmFsaWQgYXBpZHgoJWQpXG4iLCBhcGlkeCkpOwotCQlyZXR1cm47Ci0JfQotCVJUTVBaZXJvTWVtb3J5KHBEZXNpcmVkX2h0X3BoeSwgc2l6ZW9mKFJUX0hUX1BIWV9JTkZPKSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0SW5kaXZpZHVhbEhUIDogRGVzaXJlZCBNQ1MgPSAlZFxuIiwgRGVzaXJlZE1jcykpOwotCS8vIENoZWNrIHRoZSB2YWxpZGl0eSBvZiBNQ1MKLQlpZiAoKFR4U3RyZWFtID09IDEpICYmICgoRGVzaXJlZE1jcyA+PSBNQ1NfOCkgJiYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlJUTVBTZXRJbmRpdmlkdWFsSFQ6IE1DUyglZCkgaXMgaW52YWxpZCBpbiAxUywgcmVzZXQgaXQgYXMgTUNTXzdcbiIsIERlc2lyZWRNY3MpKTsKLQkJRGVzaXJlZE1jcyA9IE1DU183OwotCX0KLQotCWlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCV18yMCkgJiYgKERlc2lyZWRNY3MgPT0gTUNTXzMyKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiUlRNUFNldEluZGl2aWR1YWxIVDogTUNTXzMyIGlzIG9ubHkgc3VwcG9ydGVkIGluIDQwLU1IeiwgcmVzZXQgaXQgYXMgTUNTXzBcbiIpKTsKLQkJRGVzaXJlZE1jcyA9IE1DU18wOwotCX0KLQotCXBEZXNpcmVkX2h0X3BoeS0+Ykh0RW5hYmxlID0gVFJVRTsKLQotCS8vIERlY2lkZSBkZXNpcmVkIFR4IE1DUwotCXN3aXRjaCAoVHhTdHJlYW0pCi0JewotCQljYXNlIDE6Ci0JCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHgwMDsKLQkJCX0KLQkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzcpCi0JCQl7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMF09IDE8PERlc2lyZWRNY3M7Ci0JCQkJcERlc2lyZWRfaHRfcGh5LT5NQ1NTZXRbMV09IDB4MDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIDI6Ci0JCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKLQkJCXsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKLQkJCX0KLQkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzE1KQotCQkJewotCQkJCVVMT05HIG1vZGU7Ci0KLQkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7Ci0JCQkJaWYgKG1vZGUgPCAyKQotCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgMzogLy8gMyozCi0JCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTykKLQkJCXsKLQkJCQkvKiBNQ1MwIH4gTUNTMjMsIDMgYnl0ZXMgKi8KLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFswXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsxXT0gMHhmZjsKLQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFsyXT0gMHhmZjsKLQkJCX0KLQkJCWVsc2UgaWYgKERlc2lyZWRNY3MgPD0gTUNTXzIzKQotCQkJewotCQkJCVVMT05HIG1vZGU7Ci0KLQkJCQltb2RlID0gRGVzaXJlZE1jcyAvIDg7Ci0JCQkJaWYgKG1vZGUgPCAzKQotCQkJCQlwRGVzaXJlZF9odF9waHktPk1DU1NldFttb2RlXSA9ICgxIDw8IChEZXNpcmVkTWNzIC0gbW9kZSAqIDgpKTsKLQkJCX0KLQkJCWJyZWFrOwotCX0KLQotCWlmKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGggPT0gQldfNDApCi0JewotCQlpZiAoRGVzaXJlZE1jcyA9PSBNQ1NfQVVUTyB8fCBEZXNpcmVkTWNzID09IE1DU18zMikKLQkJCXBEZXNpcmVkX2h0X3BoeS0+TUNTU2V0WzRdID0gMHgxOwotCX0KLQotCS8vIHVwZGF0ZSBIVCBSYXRlIHNldHRpbmcKLSAgICBpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLSAgICAgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIEJTUzApOwotICAgIGVsc2UKLQkgICAgTWxtZVVwZGF0ZUh0VHhSYXRlcyhwQWQsIGFwaWR4KTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVVwZGF0ZSBIVCBJRSBmcm9tIG91ciBjYXBhYmlsaXR5LgotCi0JQXJndW1lbnRzOgotCQlTZW5kIGFsbCBIVCBJRSBpbiBiZWFjb24vcHJvYmUgcnNwL2Fzc29jIHJzcC9hY3Rpb24gZnJhbWUuCi0KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFVwZGF0ZUhUSUUoCi0JSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCi0JSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAotCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbykKLXsKLQlSVE1QWmVyb01lbW9yeShwSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCVJUTVBaZXJvTWVtb3J5KHBBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCi0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPSBwUnRIdC0+Q2hhbm5lbFdpZHRoOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uTWltb1BzID0gcFJ0SHQtPk1pbW9QczsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkdGID0gcFJ0SHQtPkdGOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwID0gcFJ0SHQtPlNob3J0R0lmb3IyMDsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9IHBSdEh0LT5TaG9ydEdJZm9yNDA7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMgPSBwUnRIdC0+VHhTVEJDOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDID0gcFJ0SHQtPlJ4U1RCQzsKLQkJcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkFNc2R1U2l6ZSA9IHBSdEh0LT5BbXNkdVNpemU7Ci0JCXBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3IgPSBwUnRIdC0+TWF4UkFtcGR1RmFjdG9yOwotCQlwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSBwUnRIdC0+TXBkdURlbnNpdHk7Ci0KLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPSBwUnRIdC0+RXh0Q2hhbk9mZnNldCA7Ci0JCXBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoID0gcFJ0SHQtPlJlY29tV2lkdGg7Ci0JCXBBZGRIdEluZm8tPkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlID0gcFJ0SHQtPk9wZXJhaW9uTW9kZTsKLQkJcEFkZEh0SW5mby0+QWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBwUnRIdC0+Tm9uR2ZQcmVzZW50OwotCQlSVE1QTW92ZU1lbW9yeShwQWRkSHRJbmZvLT5NQ1NTZXQsIC8qcFJ0SHQtPk1DU1NldCovcE1jc1NldCwgNCk7IC8vIHJ0Mjg2MCBvbmx5IHN1cHBvcnQgTUNTIG1heD0zMiwgbm8gbmVlZCB0byBjb3B5IGFsbCAxNiB1Y2hhci4KLQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBVcGRhdGVIVElFIDw9PSBcbiIpKTsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQWRkIENsaWVudCBzZWN1cml0eSBpbmZvcm1hdGlvbiBpbnRvIEFTSUMgV0NJRCB0YWJsZSBhbmQgSVZFSVYgdGFibGUuCi0gICAgUmV0dXJuOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJzc0lkeCwKLQlJTglVQ0hBUgkJCUtleUlkeCwKLQlJTglVQ0hBUgkJCUNpcGhlckFsZywKLQlJTglNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSkKLXsKLQlVSU5UMzIJCVdDSURBdHRyaSA9IDA7Ci0JVVNIT1JUCQlvZmZzZXQ7Ci0JVUNIQVIJCUlWRUlWID0gMDsKLQlVU0hPUlQJCVdjaWQgPSAwOwotCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAoQnNzSWR4ID4gQlNTMCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5OiBUaGUgQlNTLWluZGV4KCVkKSBpcyBvdXQgb2YgcmFuZ2UgZm9yIEluZnJhIGxpbmsuIFxuIiwgQnNzSWR4KSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyAxLglJbiBBREhPQyBtb2RlLCB0aGUgQUlEIGlzIHdjaWQgbnVtYmVyLiBBbmQgTk8gbWVzaCBsaW5rIGV4aXN0cy4KLQkJCS8vIDIuCUluIEluZnJhIG1vZGUsIHRoZSBBSUQ6MSBNVVNUIGJlIHdjaWQgb2YgaW5mcmEgU1RBLgotCQkJLy8JCQkJCSAgIHRoZSBBSUQ6Mn4gYXNzaWduIHRvIG1lc2ggbGluayBlbnRyeS4KLQkJCWlmIChwRW50cnkpCi0JCQkJV2NpZCA9IHBFbnRyeS0+QWlkOwotCQkJZWxzZQotCQkJCVdjaWQgPSBNQ0FTVF9XQ0lEOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0JLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlCi0Jb2Zmc2V0ID0gTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgKyAoV2NpZCAqIEhXX1dDSURfQVRUUklfU0laRSk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKHBFbnRyeSAmJiBwRW50cnktPlZhbGlkQXNNZXNoKQotCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQllbHNlIGlmICgocEVudHJ5KSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSAmJgotCQkJCQkoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwKLQkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8Ci0JCQkJCShDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykgfHwKLQkJCQkJKENpcGhlckFsZyA9PSBDSVBIRVJfTk9ORSkpKQotCQkJV0NJREF0dHJpID0gKENpcGhlckFsZzw8MSkgfCBQQUlSV0lTRUtFWVRBQkxFOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQllbHNlCi0JCVdDSURBdHRyaSA9IChDaXBoZXJBbGc8PDEpIHwgU0hBUkVES0VZVEFCTEU7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgb2Zmc2V0LCBXQ0lEQXR0cmkpOwotCi0KLQkvLyBVcGRhdGUgSVYvRUlWIHRhYmxlCi0Jb2Zmc2V0ID0gTUFDX0lWRUlWX1RBQkxFX0JBU0UgKyAoV2NpZCAqIEhXX0lWRUlWX0VOVFJZX1NJWkUpOwotCi0JLy8gV1BBIG1vZGUKLQlpZiAoKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkgfHwgKENpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpIHx8IChDaXBoZXJBbGcgPT0gQ0lQSEVSX0FFUykpCi0JewotCQkvLyBFaXYgYml0IG9uLiBrZXlpZCBhbHdheXMgaXMgMCBmb3IgcGFpcndpc2Uga2V5Ci0JCUlWRUlWID0gKEtleUlkeCA8PDYpIHwgMHgyMDsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gV0VQIEtleUlkeCBpcyBkZWZhdWx0IHR4IGtleS4KLQkJSVZFSVYgPSAoS2V5SWR4IDw8IDYpOwotCX0KLQotCS8vIEZvciBrZXkgaW5kZXggYW5kIGV4dCBJViBiaXQsIHNvIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIHBvc2l0aW9uKG9mZnNldCszKS4KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlSVE1QX0lPX1dSSVRFOChwQWQsIG9mZnNldCszLCBJVkVJVik7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnk6IFdDSUQgIyVkLCBLZXlJbmRleCAjJWQsIEFsZz0lc1xuIixXY2lkLCBLZXlJZHgsIENpcGhlck5hbWVbQ2lwaGVyQWxnXSkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiCVdDSURBdHRyaSA9IDB4JXggXG4iLCAgV0NJREF0dHJpKSk7Ci0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBQYXJzZSBlbmNyeXB0aW9uIHR5cGUKLUFyZ3VtZW50czoKLSAgICBwQWRhcHRlciAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotUFNUUklORyBHZXRFbmNyeXB0VHlwZShDSEFSIGVuYykKLXsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotICAgICAgICByZXR1cm4gIk5PTkUiOwotICAgIGlmKGVuYyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkKLQlyZXR1cm4gIldFUCI7Ci0gICAgaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JcmV0dXJuICJUS0lQIjsKLSAgICBpZihlbmMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQlyZXR1cm4gIkFFUyI7Ci0JaWYoZW5jID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQpCi0JcmV0dXJuICJUS0lQQUVTIjsKLSAgICBlbHNlCi0JcmV0dXJuICJVTktOT1ciOwotfQotCi1QU1RSSU5HIEdldEF1dGhNb2RlKENIQVIgYXV0aCkKLXsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JcmV0dXJuICJPUEVOIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQlyZXR1cm4gIlNIQVJFRCI7Ci0JaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoKQotCXJldHVybiAiQVVUT1dFUCI7Ci0gICAgaWYoYXV0aCA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JcmV0dXJuICJXUEEiOwotICAgIGlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotCXJldHVybiAiV1BBUFNLIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JcmV0dXJuICJXUEFOT05FIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JcmV0dXJuICJXUEEyIjsKLSAgICBpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JcmV0dXJuICJXUEEyUFNLIjsKLQlpZihhdXRoID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyKQotCXJldHVybiAiV1BBMVdQQTIiOwotCWlmKGF1dGggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0spCi0JcmV0dXJuICJXUEExUFNLV1BBMlBTSyI7Ci0KLQlyZXR1cm4gIlVOS05PVyI7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBHZXQgc2l0ZSBzdXJ2ZXkgcmVzdWx0cwotCUFyZ3VtZW50czoKLQkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotCQkJMS4pIFVJIG5lZWRzIHRvIHdhaXQgNCBzZWNvbmRzIGFmdGVyIGlzc3VlIGEgc2l0ZSBzdXJ2ZXkgY29tbWFuZAotCQkJMi4pIGl3cHJpdiByYTAgZ2V0X3NpdGVfc3VydmV5Ci0JCQkzLikgVUkgbmVlZHMgdG8gcHJlcGFyZSBhdCBsZWFzdCA0MDk2Ynl0ZXMgdG8gZ2V0IHRoZSByZXN1bHRzCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0jZGVmaW5lCUxJTkVfTEVOCSg0KzMzKzIwKzIzKzkrNyszKQkvLyBDaGFubmVsK1NTSUQrQnNzaWQrU2VjdXJpdHkrU2lnbmFsK1dpcmVzc01vZGUrTmV0d29ya1R5cGUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLVZPSUQJUlRNUENvbW1TaXRlU3VydmV5RGF0YSgKLQlJTiAgUFNUUklORwkJbXNnLAotCUlOICBQQlNTX0VOVFJZCXBCc3MpCi17Ci0JSU5UICAgICAgICAgUnNzaSA9IDA7Ci0JVUlOVCAgICAgICAgUnNzaV9RdWFsaXR5ID0gMDsKLQlORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgd2lyZWxlc3NfbW9kZTsKLQlDSEFSCQlTc2lkW01BWF9MRU5fT0ZfU1NJRCArMV07Ci0JU1RSSU5HCQlTZWN1cml0eVN0clszMl0gPSB7MH07Ci0JTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCWFwX2F1dGhfbW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLQltZW1zZXQoU3NpZCwgMCAsKE1BWF9MRU5fT0ZfU1NJRCArMSkpOwotCi0JCS8vQ2hhbm5lbAotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIHBCc3MtPkNoYW5uZWwpOwotCQkvL1NTSUQKLQkJbWVtY3B5KFNzaWQsIHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4pOwotCQlTc2lkW3BCc3MtPlNzaWRMZW5dID0gJ1wwJzsKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMzNzIiwgU3NpZCk7Ci0JCS8vQlNTSUQKLQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4ICAgIiwKLQkJCXBCc3MtPkJzc2lkWzBdLAotCQkJcEJzcy0+QnNzaWRbMV0sCi0JCQlwQnNzLT5Cc3NpZFsyXSwKLQkJCXBCc3MtPkJzc2lkWzNdLAotCQkJcEJzcy0+QnNzaWRbNF0sCi0JCQlwQnNzLT5Cc3NpZFs1XSk7Ci0KLQkvL1NlY3VyaXR5Ci0JaWYgKChOZGlzODAyXzExQXV0aE1vZGVXUEEgPD0gcEJzcy0+QXV0aE1vZGUpICYmCi0JCShwQnNzLT5BdXRoTW9kZSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCi0JewotCQlpZiAocEJzcy0+QXV0aE1vZGVBdXggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJewotCQkJYXBfYXV0aF9tb2RlID0gcEJzcy0+QXV0aE1vZGU7Ci0JCQlpZiAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCWFwX2NpcGhlciA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOwotCQkJZWxzZQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCX0KLQkJZWxzZSBpZiAocEJzcy0+QXV0aE1vZGVBdXggPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJewotCQkJYXBfYXV0aF9tb2RlID0gcEJzcy0+QXV0aE1vZGU7Ci0JCQlpZiAoKGFwX2F1dGhfbW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkJKGFwX2F1dGhfbW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotCQkJewotCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCWFwX2NpcGhlciA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOwotCQkJCWVsc2UKLQkJCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCX0KLQkJCWVsc2UgaWYgKChhcF9hdXRoX21vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJCQkJIChhcF9hdXRoX21vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQl7Ci0JCQkJaWYgKHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCWFwX2NpcGhlciA9IHBCc3MtPldQQTIuUGFpckNpcGhlcjsKLQkJCQllbHNlCi0JCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQl7Ci0JCQlpZiAoKHBCc3MtPkF1dGhNb2RlQXV4ID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkocEJzcy0+QXV0aE1vZGVBdXggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJYXBfYXV0aF9tb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVBTS1dQQTJQU0s7Ci0JCQllbHNlCi0JCQkJYXBfYXV0aF9tb2RlID0gcEJzcy0+QXV0aE1vZGU7Ci0KLQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlciAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpCi0JCQkJYXBfY2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb240RW5hYmxlZDsKLQkJCWVsc2UgaWYgKChwQnNzLT5XUEEuUGFpckNpcGhlciA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggIT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSkKLQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJZWxzZSBpZiAoKHBCc3MtPldQQS5QYWlyQ2lwaGVyID09IHBCc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkKLQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJZWxzZSBpZiAoKHBCc3MtPldQQS5QYWlyQ2lwaGVyID09IHBCc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpICYmCi0JCQkJCSAocEJzcy0+V1BBLlBhaXJDaXBoZXJBdXggPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSkKLQkJCQlhcF9jaXBoZXIgPSBwQnNzLT5XUEEuUGFpckNpcGhlcjsKLQkJfQotCQllbHNlIGlmICgocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJCSAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCi0JCXsKLQkJCWlmICgocEJzcy0+QXV0aE1vZGVBdXggPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJCShwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSkKLQkJCQlhcF9hdXRoX21vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjsKLQkJCWVsc2UKLQkJCQlhcF9hdXRoX21vZGUgPSBwQnNzLT5BdXRoTW9kZTsKLQotCQkJaWYgKHBCc3MtPldQQS5QYWlyQ2lwaGVyICE9IHBCc3MtPldQQTIuUGFpckNpcGhlcikKLQkJCQlhcF9jaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOwotCQkJZWxzZSBpZiAoKHBCc3MtPldQQS5QYWlyQ2lwaGVyID09IHBCc3MtPldQQTIuUGFpckNpcGhlcikgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCAhPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXgpKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQkJCWFwX2NpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ7Ci0JCQllbHNlIGlmICgocEJzcy0+V1BBLlBhaXJDaXBoZXIgPT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKSAmJgotCQkJCQkgKHBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID09IHBCc3MtPldQQTIuUGFpckNpcGhlckF1eCkgJiYKLQkJCQkJIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpKQotCQkJCWFwX2NpcGhlciA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOwotCQl9Ci0KLQkJc3ByaW50ZihTZWN1cml0eVN0ciwgIiVzLyVzIiwgR2V0QXV0aE1vZGUoKENIQVIpYXBfYXV0aF9tb2RlKSwgR2V0RW5jcnlwdFR5cGUoKENIQVIpYXBfY2lwaGVyKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCWFwX2F1dGhfbW9kZSA9IHBCc3MtPkF1dGhNb2RlOwotCQlhcF9jaXBoZXIgPSBwQnNzLT5XZXBTdGF0dXM7Ci0JCWlmIChhcF9jaXBoZXIgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJc3ByaW50ZihTZWN1cml0eVN0ciwgIk5PTkUiKTsKLQkJZWxzZSBpZiAoYXBfY2lwaGVyID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotCQkJc3ByaW50ZihTZWN1cml0eVN0ciwgIldFUCIpOwotCQllbHNlCi0JCQlzcHJpbnRmKFNlY3VyaXR5U3RyLCAiJXMvJXMiLCBHZXRBdXRoTW9kZSgoQ0hBUilhcF9hdXRoX21vZGUpLCBHZXRFbmNyeXB0VHlwZSgoQ0hBUilhcF9jaXBoZXIpKTsKLQl9Ci0KLQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIiUtMjNzIiwgU2VjdXJpdHlTdHIpOwotCi0JCS8vIFJzc2kKLQkJUnNzaSA9IChJTlQpcEJzcy0+UnNzaTsKLQkJaWYgKFJzc2kgPj0gLTUwKQotCQkJUnNzaV9RdWFsaXR5ID0gMTAwOwotCQllbHNlIGlmIChSc3NpID49IC04MCkgICAgLy8gYmV0d2VlbiAtNTAgfiAtODBkYm0KLQkJCVJzc2lfUXVhbGl0eSA9IChVSU5UKSgyNCArICgoUnNzaSArIDgwKSAqIDI2KS8xMCk7Ci0JCWVsc2UgaWYgKFJzc2kgPj0gLTkwKSAgIC8vIGJldHdlZW4gLTgwIH4gLTkwZGJtCi0JCQlSc3NpX1F1YWxpdHkgPSAoVUlOVCkoKChSc3NpICsgOTApICogMjYpLzEwKTsKLQkJZWxzZSAgICAvLyA8IC04NCBkYm0KLQkJCVJzc2lfUXVhbGl0eSA9IDA7Ci0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTlkIiwgUnNzaV9RdWFsaXR5KTsKLQkJLy8gV2lyZWxlc3MgTW9kZQotCQl3aXJlbGVzc19tb2RlID0gTmV0d29ya1R5cGVJblVzZVNhbml0eShwQnNzKTsKLQkJaWYgKHdpcmVsZXNzX21vZGUgPT0gTmRpczgwMl8xMUZIIHx8Ci0JCQl3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFEUykKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYiIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNNSkKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgIjExYSIpOwotCQllbHNlIGlmICh3aXJlbGVzc19tb2RlID09IE5kaXM4MDJfMTFPRkRNNV9OKQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFhL24iKTsKLQkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTI0KQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtN3MiLCAiMTFiL2ciKTsKLQkJZWxzZSBpZiAod2lyZWxlc3NfbW9kZSA9PSBOZGlzODAyXzExT0ZETTI0X04pCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS03cyIsICIxMWIvZy9uIik7Ci0JCWVsc2UKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTdzIiwgInVua25vdyIpOwotCQkvL05ldHdvcmsgVHlwZQotCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS0zcyIsICIgQWQiKTsKLQkJZWxzZQotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtM3MiLCAiIEluIik7Ci0KLSAgICAgICAgc3ByaW50Zihtc2crc3RybGVuKG1zZyksIlxuIik7Ci0KLQlyZXR1cm47Ci19Ci0KLVZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQotewotCVBTVFJJTkcJCW1zZzsKLQlJTlQJCWk9MDsKLQlJTlQJCQlXYWl0Q250OwotCUlOVAkJU3RhdHVzPTA7Ci0gICAgSU5UICAgICAgICAgbWF4X2xlbiA9IExJTkVfTEVOOwotCVBCU1NfRU5UUlkJcEJzczsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0Jb3NfYWxsb2NfbWVtKE5VTEwsIChQVUNIQVIgKikmbXNnLCBzaXplb2YoQ0hBUikqKChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbikpOwotCi0JaWYgKG1zZyA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIG1zZyBtZW1vcnkgYWxsb2MgZmFpbC5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbXNldChtc2csIDAgLChNQVhfTEVOX09GX0JTU19UQUJMRSkqbWF4X2xlbiApOwotCXNwcmludGYobXNnLCIlcyIsIlxuIik7Ci0Jc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNHMlLTMzcyUtMjBzJS0yM3MlLTlzJS03cyUtM3NcbiIsCi0JICAgICJDaCIsICJTU0lEIiwgIkJTU0lEIiwgIlNlY3VyaXR5IiwgIlNpZ2FubCglKSIsICJXLU1vZGUiLCAiIE5UIik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JV2FpdENudCA9IDA7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkYXB0ZXItPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKLQl3aGlsZSAoKFNjYW5SdW5uaW5nKHBBZGFwdGVyKSA9PSBUUlVFKSAmJiAoV2FpdENudCsrIDwgMjAwKSkKLQkJT1NfV0FJVCg1MDApOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JZm9yKGk9MDsgaTxwQWRhcHRlci0+U2NhblRhYi5Cc3NOciA7aSsrKQotCXsKLQkJcEJzcyA9ICZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQotCQlpZiggcEJzcy0+Q2hhbm5lbD09MCkKLQkJCWJyZWFrOwotCi0JCWlmKChzdHJsZW4obXNnKSttYXhfbGVuICkgPj0gSVdfU0NBTl9NQVhfREFUQSkKLQkJCWJyZWFrOwotCi0KLQkJUlRNUENvbW1TaXRlU3VydmV5RGF0YShtc2csIHBCc3MpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4obXNnKTsKLQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUElvY3RsR2V0U2l0ZVN1cnZleSAtIHdycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpKTsKLQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKW1zZyk7Ci19Ci0KLSNkZWZpbmUJTUFDX0xJTkVfTEVOCSgxNCs0KzQrMTArMTArMTArNis2KQkvLyBBZGRyK2FpZCtwc20rZGF0YXRpbWUrcnhieXRlK3R4Ynl0ZStjdXJyZW50IHR4IHJhdGUrbGFzdCB0eCByYXRlCi1WT0lEIFJUTVBJb2N0bEdldE1hY1RhYmxlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCUlOVCBpOwotCVJUXzgwMl8xMV9NQUNfVEFCTEUgTWFjVGFiOwotCWNoYXIgKm1zZzsKLQotCU1hY1RhYi5OdW0gPSAwOwotCWZvciAoaT0wOyBpPE1BWF9MRU5fT0ZfTUFDX1RBQkxFOyBpKyspCi0JewotCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtpXS5WYWxpZEFzQ0xJICYmIChwQWQtPk1hY1RhYi5Db250ZW50W2ldLlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKE1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BZGRyLCAmcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BZGRyKTsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5BaWQgPSAoVUNIQVIpcEFkLT5NYWNUYWIuQ29udGVudFtpXS5BaWQ7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uUHNtID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Qc01vZGU7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uTWltb1BzID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5NbXBzTW9kZTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJLy8gRmlsbCBpbiBSU1NJIHBlciBlbnRyeQotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kwID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kxID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kxOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLkF2Z1Jzc2kyID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5Sc3NpU2FtcGxlLkF2Z1Jzc2kyOwotCi0JCQkvLyB0aGUgY29ubmVjdGVkIHRpbWUgcGVyIGVudHJ5Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uQ29ubmVjdGVkVGltZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uU3RhQ29ubmVjdFRpbWU7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLk1DUyA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuQlcgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5CVzsKLQkJCU1hY1RhYi5FbnRyeVtNYWNUYWIuTnVtXS5UeFJhdGUuZmllbGQuU2hvcnRHSSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLlNUQkMgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5TVEJDOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS5maWVsZC5yc3YgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5yc3Y7Ci0JCQlNYWNUYWIuRW50cnlbTWFjVGFiLk51bV0uVHhSYXRlLmZpZWxkLk1PREUgPSBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJTWFjVGFiLkVudHJ5W01hY1RhYi5OdW1dLlR4UmF0ZS53b3JkID0gcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IVFBoeU1vZGUud29yZDsKLQotCQkJTWFjVGFiLk51bSArPSAxOwotCQl9Ci0JfQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfTUFDX1RBQkxFKTsKLQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZNYWNUYWIsIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogY29weV90b191c2VyKCkgZmFpbFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JfQotCi0JbXNnID0ga21hbGxvYyhzaXplb2YoQ0hBUikqKE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiksIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAobXNnID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOkFsbG9jIG1lbW9yeSBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCW1lbXNldChtc2csIDAgLE1BWF9MRU5fT0ZfTUFDX1RBQkxFKk1BQ19MSU5FX0xFTiApOwotCXNwcmludGYobXNnLCIlcyIsIlxuIik7Ci0Jc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTRzJS00cyUtNHMlLTEwcyUtMTBzJS0xMHMlLTZzJS02c1xuIiwKLQkJIk1BQyIsICJBSUQiLCAiUFNNIiwgIkxEVCIsICJSeEIiLCAiVHhCIiwiQ1R4UiIsICJMVHhSIik7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJewotCQkJaWYoKHN0cmxlbihtc2cpK01BQ19MSU5FX0xFTiApID49IChNQVhfTEVOX09GX01BQ19UQUJMRSpNQUNfTElORV9MRU4pICkKLQkJCQlicmVhazsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdKTsKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTRkIiwgKGludClwRW50cnktPkFpZCk7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS00ZCIsIChpbnQpcEVudHJ5LT5Qc01vZGUpOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5MYXN0RGF0YVBhY2tldFRpbWUqLyk7IC8vIFRvRG8KLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCIlLTEwZCIsMC8qcEFkLT5NYWNUYWIuQ29udGVudFtpXS5IU0NvdW50ZXIuVG90YWxSeEJ5dGVDb3VudCovKTsgLy8gVG9EbwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtMTBkIiwwLypwQWQtPk1hY1RhYi5Db250ZW50W2ldLkhTQ291bnRlci5Ub3RhbFR4Qnl0ZUNvdW50Ki8pOyAvLyBUb0RvCi0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwiJS02ZCIsUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQ3VyclR4UmF0ZV0pOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksIiUtNmRcbiIsMC8qUmF0ZUlkVG9NYnBzW3BBZC0+TWFjVGFiLkNvbnRlbnRbaV0uTGFzdFR4UmF0ZV0qLyk7IC8vIFRvRG8KLQkJfQotCX0KLQkvLyBmb3IgY29tcGF0aWJsZSB3aXRoIG9sZCBBUEkganVzdCBkbyB0aGUgcHJpbnRrIHRvIGNvbnNvbGUKLQkvL3dycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCS8vaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyIsIG1zZykpOwotCX0KLQotCWtmcmVlKG1zZyk7Ci19Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UCVNldF9CQVNldHVwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSAgICBVQ0hBUiBtYWNbNl0sIHRpZDsKLQlQU1RSSU5HIHRva2VuOwotCVNUUklORyBzZXBWYWx1ZVtdID0gIjoiLCBEQVNIID0gJy0nOwotCUlOVCBpOwotICAgIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0vKgotCVRoZSBCQVNldHVwIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCi0JCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAotCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCi0qLwotCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzXG4iLCBhcmcpKTsKLQotCWlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJdGlkID0gKFVDSEFSKSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gMTUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeFxuIiwKLQkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKSk7Ci0KLQkgICAgcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCAoUFVDSEFSKSBtYWMpOwotCi0JaWYgKHBFbnRyeSkgewotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG5TZXR1cCBCQSBTZXNzaW9uOiBUaWQgPSAlZFxuIiwgdGlkKSk7Ci0JICAgICAgICBCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgdGlkLCAwLCAxMDAsIFRSVUUpOwotCX0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci0KLX0KLQotSU5UCVNldF9CQURlY2xpbmVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIGJCQURlY2xpbmU7Ci0KLQliQkFEZWNsaW5lID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChiQkFEZWNsaW5lID09IDApCi0JewotCQlwQWQtPkNvbW1vbkNmZy5iQkFEZWNsaW5lID0gRkFMU0U7Ci0JfQotCWVsc2UgaWYgKGJCQURlY2xpbmUgPT0gMSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9CQURlY2xpbmVfUHJvYzo6KEJBRGVjbGluZT0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0JBT3JpVGVhckRvd25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotICAgIFVDSEFSIG1hY1s2XSwgdGlkOwotCVBTVFJJTkcgdG9rZW47Ci0JU1RSSU5HIHNlcFZhbHVlW10gPSAiOiIsIERBU0ggPSAnLSc7Ci0JSU5UIGk7Ci0gICAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLSAgICAvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiXG4lc1xuIiwgYXJnKSk7Ci0vKgotCVRoZSBCQU9yaVRlYXJEb3duIGludXB0IHN0cmluZyBmb3JtYXQgc2hvdWxkIGJlIHh4Onh4Onh4Onh4Onh4Onh4LWQsCi0JCT0+VGhlIHNpeCAyIGRpZ2l0IGhleC1kZWNpbWFsIG51bWJlciBwcmV2aW91cyBhcmUgdGhlIE1hYyBhZGRyZXNzLAotCQk9PlRoZSBzZXZlbnRoIGRlY2ltYWwgbnVtYmVyIGlzIHRoZSB0aWQgdmFsdWUuCi0qLwotICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpZCB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KLQkJcmV0dXJuIEZBTFNFOwotCi0JdG9rZW4gPSBzdHJjaHIoYXJnLCBEQVNIKTsKLQlpZiAoKHRva2VuICE9IE5VTEwpICYmIChzdHJsZW4odG9rZW4pPjEpKQotCXsKLQkJdGlkID0gc2ltcGxlX3N0cnRvbCgodG9rZW4rMSksIDAsIDEwKTsKLQkJaWYgKHRpZCA+IE5VTV9PRl9USUQpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJKnRva2VuID0gJ1wwJzsKLQkJZm9yIChpID0gMCwgdG9rZW4gPSByc3RydG9rKGFyZywgJnNlcFZhbHVlWzBdKTsgdG9rZW47IHRva2VuID0gcnN0cnRvayhOVUxMLCAmc2VwVmFsdWVbMF0pLCBpKyspCi0JCXsKLQkJCWlmKChzdHJsZW4odG9rZW4pICE9IDIpIHx8ICghaXN4ZGlnaXQoKnRva2VuKSkgfHwgKCFpc3hkaWdpdCgqKHRva2VuKzEpKSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJQXRvSCh0b2tlbiwgKCZtYWNbaV0pLCAxKTsKLQkJfQotCQlpZihpICE9IDYpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngtJTAyeCIsCi0JCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIHRpZCkpOwotCi0JICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgKFBVQ0hBUikgbWFjKTsKLQotCSAgICBpZiAocEVudHJ5KSB7Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG5UZWFyIGRvd24gT3JpIEJBIFNlc3Npb246IFRpZCA9ICVkXG4iLCB0aWQpKTsKLQkgICAgICAgIEJBT3JpU2Vzc2lvblRlYXJEb3duKHBBZCwgcEVudHJ5LT5BaWQsIHRpZCwgRkFMU0UsIFRSVUUpOwotCSAgICB9Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLUlOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0gICAgVUNIQVIgbWFjWzZdLCB0aWQ7Ci0JUFNUUklORyB0b2tlbjsKLQlTVFJJTkcgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzXG4iLCBhcmcpKTsKLS8qCi0JVGhlIEJBUmVjVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIHRpZCB2YWx1ZS4KLSovCi0gICAgaWYoc3RybGVuKGFyZykgPCAxOSkgIC8vTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3IHBsdXMgdGhlICItIiBhbmQgdGlkIHZhbHVlIGluIGRlY2ltYWwgZm9ybWF0LgotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0b2tlbiA9IHN0cmNocihhcmcsIERBU0gpOwotCWlmICgodG9rZW4gIT0gTlVMTCkgJiYgKHN0cmxlbih0b2tlbik+MSkpCi0JewotCQl0aWQgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAodGlkID4gTlVNX09GX1RJRCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQkqdG9rZW4gPSAnXDAnOwotCQlmb3IgKGkgPSAwLCB0b2tlbiA9IHJzdHJ0b2soYXJnLCAmc2VwVmFsdWVbMF0pOyB0b2tlbjsgdG9rZW4gPSByc3RydG9rKE5VTEwsICZzZXBWYWx1ZVswXSksIGkrKykKLQkJewotCQkJaWYoKHN0cmxlbih0b2tlbikgIT0gMikgfHwgKCFpc3hkaWdpdCgqdG9rZW4pKSB8fCAoIWlzeGRpZ2l0KCoodG9rZW4rMSkpKSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlBdG9IKHRva2VuLCAoJm1hY1tpXSksIDEpOwotCQl9Ci0JCWlmKGkgIT0gNikKLQkJCXJldHVybiBGQUxTRTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC0lMDJ4IiwKLQkJCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwgdGlkKSk7Ci0KLQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCAoUFVDSEFSKSBtYWMpOwotCi0JCWlmIChwRW50cnkpIHsKLQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblRlYXIgZG93biBSZWMgQkEgU2Vzc2lvbjogVGlkID0gJWRcbiIsIHRpZCkpOwotCQkgICAgQkFSZWNTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgdGlkLCBGQUxTRSk7Ci0JCX0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci0KLX0KLQotSU5UCVNldF9IdEJ3X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBIdEJ3OwotCi0JSHRCdyA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKEh0QncgPT0gQldfNDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV180MDsKLQllbHNlIGlmIChIdEJ3ID09IEJXXzIwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRCd19Qcm9jOjooSHRCdz0lZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVykpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRNY3NfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIEh0TWNzLCBNY3NfdG1wOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgIEJPT0xFQU4gYkF1dG9SYXRlID0gRkFMU0U7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlNY3NfdG1wID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChNY3NfdG1wIDw9IDE1IHx8IE1jc190bXAgPT0gMzIpCi0JCUh0TWNzID0gTWNzX3RtcDsKLQllbHNlCi0JCUh0TWNzID0gTUNTX0FVVE87Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBIdE1jczsKLQkJcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPSAoSHRNY3MgPT0gTUNTX0FVVE8pID8gVFJVRTpGQUxTRTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihIdE1jcz0lZCwgYkF1dG9UeFJhdGVTd2l0Y2ggPSAlZClcbiIsCi0JCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUywgcEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2gpKTsKLQotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPCBQSFlfMTFBQkdOX01JWEVEKSB8fAotCQkJKHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1PREUgPCBNT0RFX0hUTUlYKSkKLQkJewotCSAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykgJiYKLQkJCQkoSHRNY3MgPj0gMCAmJiBIdE1jcyA8PSAzKSAmJgotCSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID09IEZJWEVEX1RYTU9ERV9DQ0spKQotCQkJewotCQkJCVJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCAoTE9ORykgKFJhdGVJZFRvTWJwc1tIdE1jc10gKiAxMDAwMDAwKSk7Ci0JCQl9Ci0JICAgICAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pICYmCi0JCQkJCShIdE1jcyA+PSAwICYmIEh0TWNzIDw9IDcpICYmCi0JCQkocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSA9PSBGSVhFRF9UWE1PREVfT0ZETSkpCi0JCQl7Ci0JCQkJUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIChMT05HKSAoUmF0ZUlkVG9NYnBzW0h0TWNzKzRdICogMTAwMDAwMCkpOwotCQkJfQotCQkJZWxzZQotCQkJCWJBdXRvUmF0ZSA9IFRSVUU7Ci0KLQkJCWlmIChiQXV0b1JhdGUpCi0JCQl7Ci0JICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQkJCQlSVE1QU2V0RGVzaXJlZFJhdGVzKHBBZCwgLTEpOwotCQkJfQotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0TWNzX1Byb2M6OihGaXhlZFR4TW9kZT0lZClcbiIscEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSkpOwotCQl9Ci0gICAgICAgIGlmIChBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIEh0R2k7Ci0KLQlIdEdpID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICggSHRHaSA9PSBHSV80MDApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfNDAwOwotCWVsc2UgaWYgKCBIdEdpID09IEdJXzgwMCApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJID0gR0lfODAwOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRHaV9Qcm9jOjooU2hvcnRHST0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIgU2l6ZTsKLQotCVNpemUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFNpemUgPD0wIHx8IFNpemUgPj02NCkKLQl7Ci0JCVNpemUgPSA4OwotCX0KLQlwQWQtPkNvbW1vbkNmZy5UeEJBU2l6ZSA9IFNpemUtMTsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfSHRUeEJBU2l6ZSA6OihUeEJBU2l6ZT0gJWQpXG4iLCBTaXplKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdERpc2FsbG93VEtJUF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPT0gMSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9IFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9IEZBTFNFOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdERpc2FsbG93VEtJUF9Qcm9jIDo6JXNcbiIsCi0JCQkJKHBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9PSBUUlVFKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0T3BNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKFZhbHVlID09IEhUTU9ERV9HRikKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSAgPSBIVE1PREVfR0Y7Ci0JZWxzZSBpZiAoIFZhbHVlID09IEhUTU9ERV9NTSApCi0JCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRPcE1vZGVfUHJvYzo6KEh0T3BNb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1JTlQJU2V0X0h0U3RiY19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0KLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSBTVEJDX1VTRSkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQllbHNlIGlmICggVmFsdWUgPT0gU1RCQ19OT05FICkKLQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9TdGJjX1Byb2M6OihIdFN0YmM9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEh0Y19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0KLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5IVENFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLSAgICAgICAgcEFkLT5IVENFbmFibGUgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEh0Y19Qcm9jOjooSHRIdGM9JWQpXG4iLHBBZC0+SFRDRW5hYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEV4dGNoYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0KLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBICA9IEVYVENIQV9CRUxPVzsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLSAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0RXh0Y2hhX1Byb2M6OihIdEV4dGNoYT0lZClcbiIscEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNcGR1RGVuc2l0eV9Qcm9jOjooSHRNcGR1RGVuc2l0eT0lZClcbiIscEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdEJhV2luU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQotCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gVmFsdWU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQl9Ci0JZWxzZQotCXsKLSAgICAgICAgcEFkLT5Db21tb25DZmcuUkVHQkFDYXBhYmlsaXR5LmZpZWxkLlJ4QkFXaW5MaW1pdCA9IDY0OwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JfQotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEJhV2luU2l6ZV9Qcm9jOjooSHRCYVdpblNpemU9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0UmRnX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iUmRnID0gRkFMU0U7Ci0JZWxzZSBpZiAoIFZhbHVlID09MSApCi0JewotCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBUUlVFOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0h0UmRnX1Byb2M6OihIdFJkZz0lZClcbiIscEFkLT5Db21tb25DZmcuYlJkZykpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVAlTZXRfSHRMaW5rQWRhcHRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0xICkKLQl7Ci0JCQlwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JCQlwQWQtPmJMaW5rQWRhcHQgPSBUUlVFOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRMaW5rQWRhcHRfUHJvYzo6KEh0TGlua0FkYXB0PSVkKVxuIixwQWQtPmJMaW5rQWRhcHQpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QW1zZHVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCWlmIChWYWx1ZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmICggVmFsdWUgPT0gMSApCi0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7IC8vSW52YWxpZCBhcmd1bWVudAotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdEFtc2R1X1Byb2M6OihIdEFtc2R1PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKLQl9Ci0gICAgZWxzZSBpZiAoVmFsdWUgPT0gMSkKLSAgICB7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBUUlVFOwotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID0gSU1NRURfQkE7Ci0gICAgfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotICAgIHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBOwotCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5OwotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRBdXRvQmFfUHJvYzo6KEh0QXV0b0JhPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotCi1JTlQJU2V0X0h0UHJvdGVjdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSBGQUxTRTsKLSAgICBlbHNlIGlmIChWYWx1ZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iSFRQcm90ZWN0ID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRQcm90ZWN0X1Byb2M6OihIdFByb3RlY3Q9JWQpXG4iLHBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQJU2V0X1NlbmRQU01QQWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLSAgICBVQ0hBUiBtYWNbNl0sIG1vZGU7Ci0JUFNUUklORyB0b2tlbjsKLQlTVFJJTkcgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQotICAgIC8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzXG4iLCBhcmcpKTsKLS8qCi0JVGhlIEJBUmVjVGVhckRvd24gaW51cHQgc3RyaW5nIGZvcm1hdCBzaG91bGQgYmUgeHg6eHg6eHg6eHg6eHg6eHgtZCwKLQkJPT5UaGUgc2l4IDIgZGlnaXQgaGV4LWRlY2ltYWwgbnVtYmVyIHByZXZpb3VzIGFyZSB0aGUgTWFjIGFkZHJlc3MsCi0JCT0+VGhlIHNldmVudGggZGVjaW1hbCBudW1iZXIgaXMgdGhlIG1vZGUgdmFsdWUuCi0qLwotICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIG1vZGUgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCW1vZGUgPSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCQlpZiAobW9kZSA+IE1NUFNfRU5BQkxFKQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sICgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSUwMngiLAotCQkJCQkJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdLCBtb2RlKSk7Ci0KLQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBtYWMpOwotCi0JCWlmIChwRW50cnkpIHsKLQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcblNlbmRQU01QQWN0aW9uIE1JUFMgbW9kZSA9ICVkXG4iLCBtb2RlKSk7Ci0JCSAgICBTZW5kUFNNUEFjdGlvbihwQWQsIHBFbnRyeS0+QWlkLCBtb2RlKTsKLQkJfQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLQotCi19Ci0KLUlOVAlTZXRfSHRNSU1PUFNtb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChWYWx1ZSA8PTMgJiYgVmFsdWUgPj0gMCkKLQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gVmFsdWU7Ci0JZWxzZQotCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSAzOwotCi0JU2V0Q29tbW9uSFQocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9IdE1JTU9QU21vZGVfUHJvYzo6KE1JTU9QUyBtb2RlPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVAlTZXRfRm9yY2VTaG9ydEdJX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVTE9ORyBWYWx1ZTsKLQotCVZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5XSUZJdGVzdGJlZC5iU2hvcnRHSSA9IEZBTFNFOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+V0lGSXRlc3RiZWQuYlNob3J0R0kgPSBUUlVFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCVNldENvbW1vbkhUKHBBZCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRm9yY2VTaG9ydEdJX1Byb2M6OihGb3JjZVNob3J0R0k9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJTaG9ydEdJKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0KLUlOVAlTZXRfRm9yY2VHRl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+V0lGSXRlc3RiZWQuYkdyZWVuRmllbGQgPSBGQUxTRTsKLQllbHNlIGlmIChWYWx1ZSA9PSAxKQotCQlwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlTZXRDb21tb25IVChwQWQpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0ZvcmNlR0ZfUHJvYzo6KEZvcmNlR0Y9JWQpXG4iLCBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9IdE1pbW9Qc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUxPTkcgVmFsdWU7Ci0KLQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0JaWYgKFZhbHVlID09IDApCi0JCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBGQUxTRTsKLQllbHNlIGlmIChWYWx1ZSA9PSAxKQotCQlwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlID0gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfSHRNaW1vUHNfUHJvYzo6KEh0TWltb1BzPSVkKVxuIixwQWQtPkNvbW1vbkNmZy5iTUlNT1BTRW5hYmxlKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1JTlQJU2V0Q29tbW9uSFQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JT0lEX1NFVF9IVF9QSFlNT0RFCQlTZXRIVDsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDwgUEhZXzExQUJHTl9NSVhFRCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JU2V0SFQuUGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JU2V0SFQuVHJhbnNtaXRObyA9ICgoVUNIQVIpcEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCk7Ci0JU2V0SFQuSHRNb2RlID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREU7Ci0JU2V0SFQuRXh0T2Zmc2V0ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEE7Ci0JU2V0SFQuTUNTID0gTUNTX0FVVE87Ci0JU2V0SFQuQlcgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOwotCVNldEhULlNUQkMgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNUQkM7Ci0JU2V0SFQuU0hPUlRHSSA9IChVQ0hBUilwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSTsKLQotCVJUTVBTZXRIVChwQWQsICZTZXRIVCk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotSU5UCVNldF9GaXhlZFR4TW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7Ci0KLQlpZiAoc3RyY21wKGFyZywgIk9GRE0iKSA9PSAwIHx8IHN0cmNtcChhcmcsICJvZmRtIikgPT0gMCkKLQl7Ci0JCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmcsICJDQ0siKSA9PSAwIHx8IHN0cmNtcChhcmcsICJjY2siKSA9PSAwKQotCXsKLSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfQ0NLOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUgPSBmaXhfdHhfbW9kZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9GaXhlZFR4TW9kZV9Qcm9jOjooRml4ZWRUeE1vZGU9JWQpXG4iLCBmaXhfdHhfbW9kZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotSU5UCVNldF9PcE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVMT05HIFZhbHVlOwotCi0JVmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNhbiBub3Qgc3dpdGNoIG9wZXJhdGUgbW9kZSBvbiBpbnRlcmZhY2UgdXAgISEgXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAoVmFsdWUgPT0gMCkKLQkJcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOwotCWVsc2UgaWYgKFZhbHVlID09IDEpCi0JCXBBZC0+T3BNb2RlID0gT1BNT0RFX0FQOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAvL0ludmFsaWQgYXJndW1lbnQKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9PcE1vZGVfUHJvYzo6KE9wTW9kZT0lcylcbiIsIHBBZC0+T3BNb2RlID09IDEgPyAiQVAgTW9kZSIgOiAiU1RBIE1vZGUiKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotCi0KLQotSU5UIFNldF9Mb25nUmV0cnlMaW1pdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7Ci0JVUNIQVIJCQkJTG9uZ1JldHJ5TGltaXQgPSAoVUNIQVIpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9SVFlfQ0ZHLCAmdHhfcnR5X2NmZy53b3JkKTsKLQl0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IExvbmdSZXRyeUxpbWl0OwotCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYzo6KHR4X3J0eV9jZmc9MHgleClcbiIsIHR4X3J0eV9jZmcud29yZCkpOwotCXJldHVybiBUUlVFOwotfQotCi1JTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlUWF9SVFlfQ0ZHX1NUUlVDCXR4X3J0eV9jZmc7Ci0JVUNIQVIJCQkJU2hvcnRSZXRyeUxpbWl0ID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OwotCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgVFhfUlRZX0NGRywgdHhfcnR5X2NmZy53b3JkKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfU2hvcnRSZXRyeUxpbWl0X1Byb2M6Oih0eF9ydHlfY2ZnPTB4JXgpXG4iLCB0eF9ydHlfY2ZnLndvcmQpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1QU1RSSU5HIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cigKLSAgICBJTiAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRoTW9kZSkKLXsKLQlzd2l0Y2goYXV0aE1vZGUpCi0JewotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW46Ci0JCQlyZXR1cm4gIk9QRU4iOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzoKLQkJCXJldHVybiAiV1BBUFNLIjsKLQkJY2FzZSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ6Ci0JCQlyZXR1cm4gIlNIQVJFRCI7Ci0JCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBOgotCQkJcmV0dXJuICJXUEEiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI6Ci0JCQlyZXR1cm4gIldQQTIiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s6Ci0JCQlyZXR1cm4gIldQQTJQU0siOwotICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLOgotCQkJcmV0dXJuICJXUEFQU0tXUEEyUFNLIjsKLSAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLQkJCXJldHVybiAiV1BBMVdQQTIiOwotCQljYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU6Ci0JCQlyZXR1cm4gIldQQU5PTkUiOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuICJVTktOT1ciOwotCX0KLX0KLQotUFNUUklORyBSVE1QR2V0UmFsaW5rRW5jcnlNb2RlU3RyKAotICAgIElOICBVU0hPUlQgZW5jcnlNb2RlKQotewotCXN3aXRjaChlbmNyeU1vZGUpCi0JewotCQljYXNlIE5kaXM4MDJfMTFXRVBEaXNhYmxlZDoKLQkJCXJldHVybiAiTk9ORSI7Ci0JCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6Ci0JCQlyZXR1cm4gIldFUCI7Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLQkJCXJldHVybiAiVEtJUCI7Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCXJldHVybiAiQUVTIjsKLSAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjRFbmFibGVkOgotCQkJcmV0dXJuICJUS0lQQUVTIjsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAiVU5LTk9XIjsKLQl9Ci19Ci0KLUlOVCBSVE1QU2hvd0NmZ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlwTmFtZSwKLQlJTglQU1RSSU5HCQkJcEJ1ZikKLXsKLQlJTlQJU3RhdHVzID0gMDsKLQotCWZvciAoUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQyA9IFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQzsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQy0+bmFtZTsgUFJUTVBfUFJJVkFURV9TVEFfU0hPV19DRkdfVkFMVUVfUFJPQysrKQotCXsKLQkJaWYgKCFzdHJjbXAocE5hbWUsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpKQotCQl7Ci0JCQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5zaG93X3Byb2MocEFkLCBwQnVmKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJYnJlYWs7ICAvL0V4aXQgZm9yIGxvb3AuCi0JCX0KLQl9Ci0KLQlpZihQUlRNUF9QUklWQVRFX1NUQV9TSE9XX0NGR19WQUxVRV9QUk9DLT5uYW1lID09IE5VTEwpCi0JewotCQlzcHJpbnRmKHBCdWYsICJcbiIpOwotCQlmb3IgKFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MgPSBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0M7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MrKykKLQkJCXNwcmludGYocEJ1ZiwgIiVzJXNcbiIsIHBCdWYsIFBSVE1QX1BSSVZBVEVfU1RBX1NIT1dfQ0ZHX1ZBTFVFX1BST0MtPm5hbWUpOwotCX0KLQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLUlOVAlTaG93X1NTSURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuU3NpZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X1dpcmVsZXNzTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUGh5TW9kZSkKLQl7Ci0JCWNhc2UgUEhZXzExQkdfTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUIiKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUE6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUEvQi9HIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFHOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUciKTsKLQkJCWJyZWFrOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMUFCR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9CL0cvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExTl8yXzRHOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMU4gb25seSB3aXRoIDIuNEciKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUdOX01JWEVEOgotCQkJc3ByaW50ZihwQnVmLCAiXHQxMUcvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQS9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdDExQi9HL04iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFBL0cvTiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExTl81RzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0MTFOIG9ubHkgd2l0aCA1RyIpOwotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1JTlQJU2hvd19UeEJ1cnN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfVHhQcmVhbWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSkKLQl7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZVNob3J0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRTaG9ydCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUnQ4MDJfMTFQcmVhbWJsZUxvbmc6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdExvbmciKTsKLQkJCWJyZWFrOwotCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVBdXRvOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBdXRvIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVsdSkiLCBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlKTsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19UeFBvd2VyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWx1IiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JWQiLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQkdQcm90ZWN0aW9uX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pCi0JewotCQljYXNlIDE6IC8vQWx3YXlzIE9uCi0JCQlzcHJpbnRmKHBCdWYsICJcdE9OIik7Ci0JCQlicmVhazsKLQkJY2FzZSAyOiAvL0Fsd2F5cyBPRkYKLQkJCXNwcmludGYocEJ1ZiwgIlx0T0ZGIik7Ci0JCQlicmVhazsKLQkJY2FzZSAwOiAvL0FVVE8KLQkJCXNwcmludGYocEJ1ZiwgIlx0QXV0byIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglbHUpIiwgcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfUlRTVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUlOVAlTaG93X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkKLQl7Ci0JCXNwcmludGYocEJ1ZiwgIlx0NDAgTUh6Iik7Ci0JfQotCWVsc2UKLQl7Ci0gICAgICAgIHNwcmludGYocEJ1ZiwgIlx0MjAgTUh6Iik7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXUiLCBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJKQotCXsKLQkJY2FzZSBHSV80MDA6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdEdJXzQwMCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0lfODAwOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHSV84MDAiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kpOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERSkKLQl7Ci0JCWNhc2UgSFRNT0RFX0dGOgotCQkJc3ByaW50ZihwQnVmLCAiXHRHRiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFRNT0RFX01NOgotCQkJc3ByaW50ZihwQnVmLCAiXHRNTSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSgldSkiLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3dpdGNoKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEpCi0JewotCQljYXNlIEVYVENIQV9CRUxPVzoKLQkJCXNwcmludGYocEJ1ZiwgIlx0QmVsb3ciKTsKLQkJCWJyZWFrOwotCQljYXNlIEVYVENIQV9BQk9WRToKLQkJCXNwcmludGYocEJ1ZiwgIlx0QWJvdmUiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJXUpIiwgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSk7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotSU5UCVNob3dfSHRNcGR1RGVuc2l0eV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCV1IiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5KTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQldSIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYlJkZyA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfSHRBbXNkdV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkFtc2R1RW5hYmxlID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19IdEF1dG9CYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotSU5UCVNob3dfQ291bnRyeVJlZ2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVkIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfQ291bnRyeUNvZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLUlOVAlTaG93X1BrdEFnZ3JlZ2F0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBXTU1fU1VQUE9SVAotSU5UCVNob3dfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXNwcmludGYocEJ1ZiwgIlx0JXMiLCBwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA/ICJUUlVFIjoiRkFMU0UiKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIFdNTV9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0lFRUU4MDIxMUhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0Jc3ByaW50ZihwQnVmLCAiXHQlcyIsIHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID8gIlRSVUUiOiJGQUxTRSIpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1JTlQJU2hvd19OZXR3b3JrVHlwZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlzd2l0Y2gocEFkLT5TdGFDZmcuQnNzVHlwZSkKLQl7Ci0JCWNhc2UgQlNTX0FESE9DOgotCQkJc3ByaW50ZihwQnVmLCAiXHRBZGhvYyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlNTX0lORlJBOgotCQkJc3ByaW50ZihwQnVmLCAiXHRJbmZyYSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlNTX0FOWToKLQkJCXNwcmludGYocEJ1ZiwgIlx0QW55Iik7Ci0JCQlicmVhazsKLQkJY2FzZSBCU1NfTU9OSVRPUjoKLQkJCXNwcmludGYocEJ1ZiwgIlx0TW9uaXRvciIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzcHJpbnRmKHBCdWYsICJcdFVua25vdyBWYWx1ZSglZCkiLCBwQWQtPlN0YUNmZy5Cc3NUeXBlKTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLUlOVAlTaG93X0F1dGhNb2RlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCU5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJQXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmICgoQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikgJiYKLQkJKEF1dGhNb2RlIDw9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLKSkKLQkJc3ByaW50ZihwQnVmLCAiXHQlcyIsIFJUTVBHZXRSYWxpbmtBdXRoTW9kZVN0cihBdXRoTW9kZSkpOwotCWVsc2UKLQkJc3ByaW50ZihwQnVmLCAiXHRVbmtub3cgVmFsdWUoJWQpIiwgQXV0aE1vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0VuY3J5cFR5cGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwlXZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlXZXBTdGF0dXMgPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAoKFdlcFN0YXR1cyA+PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKLQkJKFdlcFN0YXR1cyA8PSBOZGlzODAyXzExRW5jcnlwdGlvbjRLZXlBYnNlbnQpKQotCQlzcHJpbnRmKHBCdWYsICJcdCVzIiwgUlRNUEdldFJhbGlua0VuY3J5TW9kZVN0cihXZXBTdGF0dXMpKTsKLQllbHNlCi0JCXNwcmludGYocEJ1ZiwgIlx0VW5rbm93IFZhbHVlKCVkKSIsIFdlcFN0YXR1cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfRGVmYXVsdEtleUlEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCVVDSEFSIERlZmF1bHRLZXlJZCA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQlEZWZhdWx0S2V5SWQgPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlzcHJpbnRmKHBCdWYsICJcdCVkIiwgRGVmYXVsdEtleUlkKTsKLQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19XZXBLZXlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgSU5UCQkJCUtleUlkeCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JVUNIQVIgICBLZXlbMTZdID0gezB9LCBLZXlMZW5ndGggPSAwOwotCUlOVAkJaW5kZXggPSBCU1MwOwotCi0JS2V5TGVuZ3RoID0gcEFkLT5TaGFyZWRLZXlbaW5kZXhdW0tleUlkeF0uS2V5TGVuOwotCU5kaXNNb3ZlTWVtb3J5KEtleSwgcEFkLT5TaGFyZWRLZXlbaW5kZXhdW0tleUlkeF0uS2V5LCBLZXlMZW5ndGgpOwotCi0JLy9jaGVjayBrZXkgc3RyaW5nIGlzIEFTQ0lJIG9yIG5vdAotICAgIGlmIChSVE1QQ2hlY2tTdHJQcmludEFibGUoKFBDSEFSKUtleSwgS2V5TGVuZ3RoKSkKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQlcyIsIEtleSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaW50IGlkeDsKLSAgICAgICAgc3ByaW50ZihwQnVmLCAiXHQiKTsKLSAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBLZXlMZW5ndGg7IGlkeCsrKQotICAgICAgICAgICAgc3ByaW50ZihwQnVmK3N0cmxlbihwQnVmKSwgIiUwMlgiLCBLZXlbaWR4XSk7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXkxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCVNob3dfV2VwS2V5X1Byb2MocEFkLCAwLCBwQnVmKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfS2V5Ml9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAlQU1RSSU5HCQkJcEJ1ZikKLXsKLQlTaG93X1dlcEtleV9Qcm9jKHBBZCwgMSwgcEJ1Zik7Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAlTaG93X0tleTNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQJUFNUUklORwkJCXBCdWYpCi17Ci0JU2hvd19XZXBLZXlfUHJvYyhwQWQsIDIsIHBCdWYpOwotCXJldHVybiAwOwotfQotCi1JTlQJU2hvd19LZXk0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCVNob3dfV2VwS2V5X1Byb2MocEFkLCAzLCBwQnVmKTsKLQlyZXR1cm4gMDsKLX0KLQotSU5UCVNob3dfV1BBUFNLX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUCVBTVFJJTkcJCQlwQnVmKQotewotCUlOVAlpZHg7Ci0JVUNIQVIJUE1LWzMyXSA9IHswfTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJTmRpc01vdmVNZW1vcnkoUE1LLCBwQWQtPlN0YUNmZy5QTUssIDMyKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotICAgIHNwcmludGYocEJ1ZiwgIlx0UE1LID0gIik7Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCAzMjsgaWR4KyspCi0gICAgICAgIHNwcmludGYocEJ1ZitzdHJsZW4ocEJ1ZiksICIlMDJYIiwgUE1LW2lkeF0pOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fbWFjX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX21hY19wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxNjM2My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fbWFjX3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlBbGxvY2F0ZSBETUEgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQotCQlORElTX1NUQVRVU19SRVNPVVJDRVMKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVUxPTkcJCQlSaW5nQmFzZVBhSGlnaDsKLQlVTE9ORwkJCVJpbmdCYXNlUGFMb3c7Ci0JUFZPSUQJCQlSaW5nQmFzZVZhOwotCUlOVAkJCQlpbmRleCwgbnVtOwotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJYRF9TVFJVQwkJcFJ4RDsKLQlVTE9ORwkJCUVycm9yVmFsdWUgPSAwOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQlQUlRNUF9ETUFCVUYJcERtYUJ1ZjsKLQlQTkRJU19QQUNLRVQJcFBhY2tldDsKLS8vCVBSVE1QX1JFT1JERVJCVUYJcFJlb3JkZXJCdWY7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnlcbiIpKTsKLQlkbwotCXsKLQkJLy8KLQkJLy8gQWxsb2NhdGUgYWxsIHJpbmcgZGVzY3JpcHRvcnMsIGluY2x1ZGUgVHhELCBSeEQsIE1nbXRELgotCQkvLyBBbHRob3VnaCBlYWNoIHNpemUgaXMgZGlmZmVyZW50LCB0byBwcmV2ZW50IGNhY2hlbGluZSBhbmQgYWxpZ25tZW50Ci0JCS8vIGlzc3VlLCBJIGludGVudGlvbmFsIHNldCB0aGVtIGFsbCB0byA2NCBieXRlcy4KLQkJLy8KLQkJZm9yIChudW09MDsgbnVtPE5VTV9PRl9UWF9SSU5HOyBudW0rKykKLQkJewotCQkJVUxPTkcgIEJ1ZkJhc2VQYUhpZ2g7Ci0JCQlVTE9ORyAgQnVmQmFzZVBhTG93OwotCQkJUFZPSUQgIEJ1ZkJhc2VWYTsKLQotCQkJLy8KLQkJCS8vIEFsbG9jYXRlIFR4IHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSAoNSBUWCByaW5ncyA9IDQgQUNzICsgMSBIQ0NBKQotCQkJLy8KLQkJCXBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSA9IFRYX1JJTkdfU0laRSAqIFRYRF9TSVpFOwotCQkJUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKLQkJCQlwQWQsCi0JCQkJbnVtLAotCQkJCXBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSwKLQkJCQlGQUxTRSwKLQkJCQkmcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NWYSwKLQkJCQkmcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0KLQkJCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhID09IE5VTEwpCi0JCQl7Ci0JCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmEsIHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jU2l6ZSk7Ci0KLQkJCS8vIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24KLQkJCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jUGEpOwotCQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NQYSk7Ci0JCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+VHhEZXNjUmluZ1tudW1dLkFsbG9jVmE7Ci0KLQkJCS8vCi0JCQkvLyBBbGxvY2F0ZSBhbGwgMXN0IFRYQnVmJ3MgbWVtb3J5IGZvciB0aGlzIFR4UmluZwotCQkJLy8KLQkJCXBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jU2l6ZSA9IFRYX1JJTkdfU0laRSAqIFRYX0RNQV8xU1RfQlVGRkVSX1NJWkU7Ci0JCQlSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKLQkJCQlwQWQsCi0JCQkJbnVtLAotCQkJCXBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jU2l6ZSwKLQkJCQlGQUxTRSwKLQkJCQkmcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwKLQkJCQkmcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0KLQkJCWlmIChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhID09IE5VTEwpCi0JCQl7Ci0JCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfUkVTT1VSQ0VTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvLyBaZXJvIGluaXQgdGhpcyBtZW1vcnkgYmxvY2sKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmEsIHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jU2l6ZSk7Ci0KLQkJCS8vIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24KLQkJCUJ1ZkJhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0JCQlCdWZCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jUGEpOwotCQkJQnVmQmFzZVZhICAgICA9IHBBZC0+VHhCdWZTcGFjZVtudW1dLkFsbG9jVmE7Ci0KLQkJCS8vCi0JCQkvLyBJbml0aWFsaXplIFR4IFJpbmcgRGVzY3JpcHRvciBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCQkvLwotCQkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tudW1dOwotCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgVFhfUklOR19TSVpFOyBpbmRleCsrKQotCQkJewotCQkJCXBUeFJpbmctPkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQkJCQlwVHhSaW5nLT5DZWxsW2luZGV4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCQkJCS8vIEluaXQgVHggUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzCi0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NTaXplID0gVFhEX1NJWkU7Ci0JCQkJcFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBUeFJpbmctPkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKLQkJCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyAocFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUxvdyk7Ci0KLQkJCQkvLyBTZXR1cCBUeCBCdWZmZXIgc2l6ZSAmIGFkZHJlc3MuIG9ubHkgODAyLjExIGhlYWRlciB3aWxsIHN0b3JlIGluIHRoaXMgc3BhY2UKLQkJCQlwRG1hQnVmID0gJnBUeFJpbmctPkNlbGxbaW5kZXhdLkRtYUJ1ZjsKLQkJCQlwRG1hQnVmLT5BbGxvY1NpemUgPSBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJCXBEbWFCdWYtPkFsbG9jVmEgPSBCdWZCYXNlVmE7Ci0JCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBEbWFCdWYtPkFsbG9jUGEsIEJ1ZkJhc2VQYUhpZ2gpOwotCQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEsIEJ1ZkJhc2VQYUxvdyk7Ci0KLQkJCQkvLyBsaW5rIHRoZSBwcmUtYWxsb2NhdGVkIFR4QnVmIHRvIFRYRAotCQkJCXBUeEQgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtpbmRleF0uQWxsb2NWYTsKLQkJCQlwVHhELT5TRFB0cjAgPSBCdWZCYXNlUGFMb3c7Ci0JCQkJLy8gYWR2YW5jZSB0byBuZXh0IHJpbmcgZGVzY3JpcHRvciBhZGRyZXNzCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDE7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJUmluZ0Jhc2VQYUxvdyArPSBUWERfU0laRTsKLQkJCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFRYRF9TSVpFOwotCi0JCQkJLy8gYWR2YW5jZSB0byBuZXh0IFR4QnVmIGFkZHJlc3MKLQkJCQlCdWZCYXNlUGFMb3cgKz0gVFhfRE1BXzFTVF9CVUZGRVJfU0laRTsKLQkJCQlCdWZCYXNlVmEgPSAoUFVDSEFSKSBCdWZCYXNlVmEgKyBUWF9ETUFfMVNUX0JVRkZFUl9TSVpFOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhSaW5nWyVkXTogdG90YWwgJWQgZW50cnkgYWxsb2NhdGVkXG4iLCBudW0sIGluZGV4KSk7Ci0JCX0KLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19SRVNPVVJDRVMpCi0JCQlicmVhazsKLQotCQkvLwotCQkvLyBBbGxvY2F0ZSBNR01UIHJpbmcgZGVzY3JpcHRvcidzIG1lbW9yeSBleGNlcHQgVHggcmluZyB3aGljaCBhbGxvY2F0ZWQgZWFyaWxlcgotCQkvLwotCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUgPSBNR01UX1JJTkdfU0laRSAqIFRYRF9TSVpFOwotCQlSVE1QX0FsbG9jYXRlTWdtdERlc2NNZW1vcnkoCi0JCQlwQWQsCi0JCQlwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsCi0JCQlGQUxTRSwKLQkJCSZwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLAotCQkJJnBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOwotCi0JCWlmIChwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpCi0JCXsKLQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQlOZGlzWmVyb01lbW9yeShwQWQtPk1nbXREZXNjUmluZy5BbGxvY1ZhLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUpOwotCi0JCS8vIFNhdmUgUEEgJiBWQSBmb3IgZnVydGhlciBvcGVyYXRpb24KLQkJUmluZ0Jhc2VQYUhpZ2ggPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NQYSk7Ci0JCVJpbmdCYXNlUGFMb3cgID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmE7Ci0KLQkJLy8KLQkJLy8gSW5pdGlhbGl6ZSBNR01UIFJpbmcgYW5kIGFzc29jaWF0ZWQgYnVmZmVyIG1lbW9yeQotCQkvLwotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNR01UX1JJTkdfU0laRTsgaW5kZXgrKykKLQkJewotCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkvLyBJbml0IE1HTVQgUmluZyBTaXplLCBWYSwgUGEgdmFyaWFibGVzCi0JCQlwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFRYRF9TSVpFOwotCQkJcEFkLT5NZ210UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhID0gUmluZ0Jhc2VWYTsKLQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaChwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFIaWdoKTsKLQkJCVJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93IChwQWQtPk1nbXRSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOwotCi0JCQkvLyBPZmZzZXQgdG8gbmV4dCByaW5nIGRlc2NyaXB0b3IgYWRkcmVzcwotCQkJUmluZ0Jhc2VQYUxvdyArPSBUWERfU0laRTsKLQkJCVJpbmdCYXNlVmEgPSAoUFVDSEFSKSBSaW5nQmFzZVZhICsgVFhEX1NJWkU7Ci0KLQkJCS8vIGxpbmsgdGhlIHByZS1hbGxvY2F0ZWQgVHhCdWYgdG8gVFhECi0JCQlwVHhEID0gKFBUWERfU1RSVUMpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYTsKLQkJCXBUeEQtPkRNQURPTkUgPSAxOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCS8vIG5vIHByZS1hbGxvY2F0ZWQgYnVmZmVyIHJlcXVpcmVkIGluIE1nbXRSaW5nIGZvciBzY2F0dGVyLWdhdGhlciBjYXNlCi0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUdNVCBSaW5nOiB0b3RhbCAlZCBlbnRyeSBhbGxvY2F0ZWRcbiIsIGluZGV4KSk7Ci0KLQkJLy8KLQkJLy8gQWxsb2NhdGUgUlggcmluZyBkZXNjcmlwdG9yJ3MgbWVtb3J5IGV4Y2VwdCBUeCByaW5nIHdoaWNoIGFsbG9jYXRlZCBlYXJpbGVyCi0JCS8vCi0JCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUgPSBSWF9SSU5HX1NJWkUgKiBSWERfU0laRTsKLQkJUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKLQkJCXBBZCwKLQkJCXBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUsCi0JCQlGQUxTRSwKLQkJCSZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwKLQkJCSZwQWQtPlJ4RGVzY1JpbmcuQWxsb2NQYSk7Ci0KLQkJaWYgKHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhID09IE5VTEwpCi0JCXsKLQkJCUVycm9yVmFsdWUgPSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlk7Ci0JCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgYSBiaWcgYnVmZmVyXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19SRVNPVVJDRVM7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIFplcm8gaW5pdCB0aGlzIG1lbW9yeSBibG9jawotCQlOZGlzWmVyb01lbW9yeShwQWQtPlJ4RGVzY1JpbmcuQWxsb2NWYSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSk7Ci0KLQotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsCi0JCQkJCSgiUlggREVTQyAlcCAgc2l6ZSA9ICVsZFxuIiwgcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1NpemUpKTsKLQotCQkvLyBTYXZlIFBBICYgVkEgZm9yIGZ1cnRoZXIgb3BlcmF0aW9uCi0JCVJpbmdCYXNlUGFIaWdoID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NIaWdoKHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLQkJUmluZ0Jhc2VQYUxvdyAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocEFkLT5SeERlc2NSaW5nLkFsbG9jUGEpOwotCQlSaW5nQmFzZVZhICAgICA9IHBBZC0+UnhEZXNjUmluZy5BbGxvY1ZhOwotCi0JCS8vCi0JCS8vIEluaXRpYWxpemUgUnggUmluZyBhbmQgYXNzb2NpYXRlZCBidWZmZXIgbWVtb3J5Ci0JCS8vCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IFJYX1JJTkdfU0laRTsgaW5kZXgrKykKLQkJewotCQkJLy8gSW5pdCBSWCBSaW5nIFNpemUsIFZhLCBQYSB2YXJpYWJsZXMKLQkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jU2l6ZSA9IFJYRF9TSVpFOwotCQkJcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYSA9IFJpbmdCYXNlVmE7Ci0JCQlSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0hpZ2gocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NQYSwgUmluZ0Jhc2VQYUhpZ2gpOwotCQkJUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NMb3cgKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkFsbG9jUGEsIFJpbmdCYXNlUGFMb3cpOwotCi0JCQkvL05kaXNaZXJvTWVtb3J5KFJpbmdCYXNlVmEsIFJYRF9TSVpFKTsKLQotCQkJLy8gT2Zmc2V0IHRvIG5leHQgcmluZyBkZXNjcmlwdG9yIGFkZHJlc3MKLQkJCVJpbmdCYXNlUGFMb3cgKz0gUlhEX1NJWkU7Ci0JCQlSaW5nQmFzZVZhID0gKFBVQ0hBUikgUmluZ0Jhc2VWYSArIFJYRF9TSVpFOwotCi0JCQkvLyBTZXR1cCBSeCBhc3NvY2lhdGVkIEJ1ZmZlciBzaXplICYgYWxsb2NhdGUgc2hhcmUgbWVtb3J5Ci0JCQlwRG1hQnVmID0gJnBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1ZjsKLQkJCXBEbWFCdWYtPkFsbG9jU2l6ZSA9IFJYX0JVRkZFUl9BR0dSRVNJWkU7Ci0JCQlwUGFja2V0ID0gUlRNUF9BbGxvY2F0ZVJ4UGFja2V0QnVmZmVyKAotCQkJCXBBZCwKLQkJCQlwRG1hQnVmLT5BbGxvY1NpemUsCi0JCQkJRkFMU0UsCi0JCQkJJnBEbWFCdWYtPkFsbG9jVmEsCi0JCQkJJnBEbWFCdWYtPkFsbG9jUGEpOwotCi0JCQkvKiBrZWVwIGFsbG9jYXRlZCByeCBwYWNrZXQgKi8KLQkJCXBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLnBOZGlzUGFja2V0ID0gcFBhY2tldDsKLQotCQkJLy8gRXJyb3IgaGFuZGxpbmcKLQkJCWlmIChwRG1hQnVmLT5BbGxvY1ZhID09IE5VTEwpCi0JCQl7Ci0JCQkJRXJyb3JWYWx1ZSA9IEVSUkxPR19PVVRfT0ZfU0hBUkVEX01FTU9SWTsKLQkJCQlEQkdQUklOVF9FUlIoKCJGYWlsZWQgdG8gYWxsb2NhdGUgUnhSaW5nJ3MgMXN0IGJ1ZmZlclxuIikpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLy8gWmVybyBpbml0IHRoaXMgbWVtb3J5IGJsb2NrCi0JCQlOZGlzWmVyb01lbW9yeShwRG1hQnVmLT5BbGxvY1ZhLCBwRG1hQnVmLT5BbGxvY1NpemUpOwotCi0JCQkvLyBXcml0ZSBSeEQgYnVmZmVyIGFkZHJlc3MgJiBhbGxvY2F0ZWQgYnVmZmVyIGxlbmd0aAotCQkJcFJ4RCA9IChQUlhEX1NUUlVDKSBwQWQtPlJ4UmluZy5DZWxsW2luZGV4XS5BbGxvY1ZhOwotCQkJcFJ4RC0+U0RQMCA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBEbWFCdWYtPkFsbG9jUGEpOwotCQkJcFJ4RC0+RERPTkUgPSAwOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhELCBUWVBFX1JYRCk7Ci0jZW5kaWYKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJ4IFJpbmc6IHRvdGFsICVkIGVudHJ5IGFsbG9jYXRlZFxuIiwgaW5kZXgpKTsKLQotCX0Jd2hpbGUgKEZBTFNFKTsKLQotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+RnJhZ0ZyYW1lLCBzaXplb2YoRlJBR01FTlRfRlJBTUUpKTsKLQlwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCA9ICBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcihwQWQsIFJYX0JVRkZFUl9OT1JNU0laRSk7Ci0KLQlpZiAocEFkLT5GcmFnRnJhbWUucEZyYWdQYWNrZXQgPT0gTlVMTCkKLQl7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1JFU09VUkNFUzsKLQl9Ci0KLQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQkvLyBMb2cgZXJyb3IgaW5mb3JhbXRpb24KLQkJTmRpc1dyaXRlRXJyb3JMb2dFbnRyeSgKLQkJCXBBZC0+QWRhcHRlckhhbmRsZSwKLQkJCU5ESVNfRVJST1JfQ09ERV9PVVRfT0ZfUkVTT1VSQ0VTLAotCQkJMSwKLQkJCUVycm9yVmFsdWUpOwotCX0KLQotCS8vIEZvbGxvd2luZyBjb2RlIHNlZ21lbnQgZ2V0IGZyb20gb3JpZ2luYWwgZnVuYzpOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWUoKSwgbm93IHNob3VsZCBpbnRlZ3JhdGUgaXQgdG8gaGVyZS4KLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0VHhSeFJpbmdBbmRCYWNrbG9nUXVldWVcbiIpKTsKLQotLyoKLQkJLy8gRGlzYWJsZSBETUEuCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJR2xvQ2ZnLndvcmQgJj0gMHhmZjA7Ci0JCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsKLSovCi0KLQkJLy8gSW5pdGlhbGl6ZSBhbGwgdHJhbnNtaXQgcmVsYXRlZCBzb2Z0d2FyZSBxdWV1ZXMKLQkJZm9yKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKLQkJewotCQkJSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKCZwQWQtPlR4U3dRdWV1ZVtpbmRleF0pOwotCQkJLy8gSW5pdCBUWCByaW5ncyBpbmRleCBwb2ludGVyCi0JCQlwQWQtPlR4UmluZ1tpbmRleF0uVHhTd0ZyZWVJZHggPSAwOwotCQkJcEFkLT5UeFJpbmdbaW5kZXhdLlR4Q3B1SWR4ID0gMDsKLQkJCS8vUlRNUF9JT19XUklURTMyKHBBZCwgKFRYX0NUWF9JRFgwICsgaSAqIDB4MTApICwgIHBBZC0+VHhSaW5nW2ldLlRYX0NUWF9JRFgpOwotCQl9Ci0KLQkJLy8gSW5pdCBSWCBSaW5nIGluZGV4IHBvaW50ZXIKLQkJcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOwotCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9IFJYX1JJTkdfU0laRSAtIDE7Ci0JCS8vUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUlhfQ1JYX0lEWDApOwotCi0KLQkJLy8gaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlcgotCQlwQWQtPk1nbXRSaW5nLlR4U3dGcmVlSWR4ID0gMDsKLQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IDA7Ci0KLQkJcEFkLT5Qcml2YXRlSW5mby5UeFJpbmdGdWxsQ250ID0gMDsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDSW5pdFR4UnhSaW5nQW5kQmFja2xvZ1F1ZXVlXG4iKSk7Ci0JfQotCi0JREJHUFJJTlRfUyhTdGF0dXMsICgiPC0tIFJUTVBBbGxvY1R4UnhSaW5nTWVtb3J5LCBTdGF0dXM9JXhcbiIsIFN0YXR1cykpOwotCXJldHVybiBTdGF0dXM7Ci19Ci0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZXNldCBOSUMgQXNpY3MuIENhbGwgYWZ0ZXIgcmVzdCBETUEuIFNvIHJlc2V0IFRYX0NUWF9JRFggdG8gemVyby4KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0JCVJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBSaW5nQ2xlYW5VcCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCVJpbmdUeXBlKQotewotCVBUWERfU1RSVUMJCXBUeEQ7Ci0JUFJYRF9TVFJVQwkJcFJ4RDsKLQlQUVVFVUVfRU5UUlkJcEVudHJ5OwotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCWludAkJCQlpOwotCVBSVE1QX1RYX1JJTkcJcFR4UmluZzsKLQl1bnNpZ25lZCBsb25nCUlycUZsYWdzOwotCS8vVUlOVDMyCQkJUnhTd1JlYWRJZHg7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUlRNUFJpbmdDbGVhblVwKFJpbmdJZHg9JWQsIFBlbmRpbmctTkRJUz0lbGQpXG4iLCBSaW5nVHlwZSwgcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50KSk7Ci0Jc3dpdGNoIChSaW5nVHlwZSkKLQl7Ci0JCWNhc2UgUUlEX0FDX0JLOgotCQljYXNlIFFJRF9BQ19CRToKLQkJY2FzZSBRSURfQUNfVkk6Ci0JCWNhc2UgUUlEX0FDX1ZPOgotCQkvKmNhc2UgUUlEX0hDQ0E6Ki8KLQotCQkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tSaW5nVHlwZV07Ci0KLQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCS8vIFdlIGhhdmUgdG8gY2xlYW4gYWxsIGRlc2NyaXB0b3JzIGluIGNhc2Ugc29tZSBlcnJvciBoYXBwZW5lZCB3aXRoIHJlc2V0Ci0JCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykgLy8gV2UgaGF2ZSB0byBzY2FuIGFsbCBUWCByaW5nCi0JCQl7Ci0JCQkJcFR4RCAgPSAoUFRYRF9TVFJVQykgcFR4UmluZy0+Q2VsbFtpXS5BbGxvY1ZhOwotCi0JCQkJcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7Ci0JCQkJLy8gcmVsZWFzZSBzY2F0dGVyLWFuZC1nYXRoZXIgTkRJU19QQUNLRVQKLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0JCQkJfQotCi0JCQkJcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0OwotCQkJCS8vIHJlbGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBSaW5nVHlwZSAqIDB4MTAsICZwVHhSaW5nLT5UeERtYUlkeCk7Ci0JCQlwVHhSaW5nLT5UeFN3RnJlZUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJcFR4UmluZy0+VHhDcHVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUmluZ1R5cGUgKiAweDEwLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0KLQkJCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCi0JCQlSVE1QX0lSUV9MT0NLKCZwQWQtPmlycV9sb2NrLCBJcnFGbGFncyk7Ci0JCQl3aGlsZSAocEFkLT5UeFN3UXVldWVbUmluZ1R5cGVdLkhlYWQgIT0gTlVMTCkKLQkJCXsKLQkJCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBBZC0+VHhTd1F1ZXVlW1JpbmdUeXBlXSk7Ci0JCQkJcFBhY2tldCA9IFFVRVVFX0VOVFJZX1RPX1BBQ0tFVChwRW50cnkpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJlbGVhc2UgMSBORElTIHBhY2tldCBmcm9tIHMvdyBiYWNrbG9nIHF1ZXVlXG4iKSk7Ci0JCQl9Ci0JCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX01HTVQ6Ci0JCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAotCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0JCQlmb3IgKGk9MDsgaTxNR01UX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCXBUeEQgID0gKFBUWERfU1RSVUMpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotCi0JCQkJcFBhY2tldCA9IChQTkRJU19QQUNLRVQpIHBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldDsKLQkJCQkvLyBybGVhc2Ugc2NhdHRlci1hbmQtZ2F0aGVyIE5ESVNfUEFDS0VUCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJfQotCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgcEFkLT5NZ210UmluZy5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQkJCQkvLyByZWxlYXNlIHNjYXR0ZXItYW5kLWdhdGhlciBORElTX1BBQ0tFVAotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJfQotCQkJCXBBZC0+TWdtdFJpbmcuQ2VsbFtpXS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQl9Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTUdNVERUWF9JRFgsICZwQWQtPk1nbXRSaW5nLlR4RG1hSWR4KTsKLQkJCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSBwQWQtPk1nbXRSaW5nLlR4RG1hSWR4OwotCQkJcEFkLT5NZ210UmluZy5UeENwdUlkeCA9IHBBZC0+TWdtdFJpbmcuVHhEbWFJZHg7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NR01UQ1RYX0lEWCwgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7Ci0KLQkJCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuTWdtdFJpbmdGdWxsQ291bnQgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBRSURfUlg6Ci0JCQkvLyBXZSBoYXZlIHRvIGNsZWFuIGFsbCBkZXNjcmlwdG9ycyBpbiBjYXNlIHNvbWUgZXJyb3IgaGFwcGVuZWQgd2l0aCByZXNldAotCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLQotCQkJZm9yIChpPTA7IGk8UlhfUklOR19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJcFJ4RCAgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpXS5BbGxvY1ZhOwotICAgICAgICAgICAgICAgIHBSeEQtPkRET05FID0gMCA7Ci0JCQl9Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCwgJnBBZC0+UnhSaW5nLlJ4RG1hSWR4KTsKLQkJCXBBZC0+UnhSaW5nLlJ4U3dSZWFkSWR4ID0gcEFkLT5SeFJpbmcuUnhEbWFJZHg7Ci0JCQlwQWQtPlJ4UmluZy5SeENwdUlkeCA9ICgocEFkLT5SeFJpbmcuUnhEbWFJZHggPT0gMCkgPyAoUlhfUklOR19TSVpFLTEpIDogKHBBZC0+UnhSaW5nLlJ4RG1hSWR4LTEpKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0NSWF9JRFgsIHBBZC0+UnhSaW5nLlJ4Q3B1SWR4KTsKLQotCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKQotewotCWludCBpbmRleCwgbnVtICwgajsKLQlQUlRNUF9UWF9SSU5HIHBUeFJpbmc7Ci0JUFRYRF9TVFJVQwkgIHBUeEQ7Ci0JUE5ESVNfUEFDS0VUICBwUGFja2V0OwotCXVuc2lnbmVkIGludCAgSXJxRmxhZ3M7Ci0KLQkvL1BPU19DT09LSUUgcE9iaiA9KFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBGcmVlVHhSeFJpbmdNZW1vcnlcbiIpKTsKLQotCS8vIEZyZWUgVHhTd1F1ZXVlIFBhY2tldAotCWZvciAoaW5kZXg9MDsgaW5kZXggPE5VTV9PRl9UWF9SSU5HOyBpbmRleCsrKQotCXsKLQkJUFFVRVVFX0VOVFJZIHBFbnRyeTsKLQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0JCVBRVUVVRV9IRUFERVIgICBwUXVldWU7Ci0KLQkJUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCQlwUXVldWUgPSAmcEFkLT5UeFN3UXVldWVbaW5kZXhdOwotCQl3aGlsZSAocFF1ZXVlLT5IZWFkKQotCQl7Ci0JCQlwRW50cnkgPSBSZW1vdmVIZWFkUXVldWUocFF1ZXVlKTsKLQkJCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocEVudHJ5KTsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJfQotCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQl9Ci0KLQkvLyBGcmVlIFR4IFJpbmcgUGFja2V0Ci0JZm9yIChpbmRleD0wO2luZGV4PCBOVU1fT0ZfVFhfUklORztpbmRleCsrKQotCXsKLQkJcFR4UmluZyA9ICZwQWQtPlR4UmluZ1tpbmRleF07Ci0KLQkJZm9yIChqPTA7IGo8IFRYX1JJTkdfU0laRTsgaisrKQotCQl7Ci0JCQlwVHhEID0gKFBUWERfU1RSVUMpIChwVHhSaW5nLT5DZWxsW2pdLkFsbG9jVmEpOwotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbal0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtqXS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCQkJLy9BbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW3BUeFJpbmctPlR4U3dGcmVlSWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCX0KLQl9Ci0KLQlmb3IgKGluZGV4ID0gUlhfUklOR19TSVpFIC0gMSA7IGluZGV4ID49IDA7IGluZGV4LS0pCi0JewotCQlpZiAoKHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1ZhKSAmJiAocEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQpKQotCQl7Ci0JCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uRG1hQnVmLkFsbG9jUGEsIHBBZC0+UnhSaW5nLkNlbGxbaW5kZXhdLkRtYUJ1Zi5BbGxvY1NpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0ucE5kaXNQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQl9Ci0JfQotCU5kaXNaZXJvTWVtb3J5KHBBZC0+UnhSaW5nLkNlbGwsIFJYX1JJTkdfU0laRSAqIHNpemVvZihSVE1QX0RNQUNCKSk7Ci0KLQlpZiAocEFkLT5SeERlc2NSaW5nLkFsbG9jVmEpCi0gICAgewotCQlSVE1QX0ZyZWVEZXNjTWVtb3J5KHBBZCwgcEFkLT5SeERlc2NSaW5nLkFsbG9jU2l6ZSwgcEFkLT5SeERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+UnhEZXNjUmluZy5BbGxvY1BhKTsKLSAgICB9Ci0gICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+UnhEZXNjUmluZywgc2l6ZW9mKFJUTVBfRE1BQlVGKSk7Ci0KLQlpZiAocEFkLT5NZ210RGVzY1JpbmcuQWxsb2NWYSkKLQl7Ci0JCVJUTVBfRnJlZURlc2NNZW1vcnkocEFkLCBwQWQtPk1nbXREZXNjUmluZy5BbGxvY1NpemUsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jVmEsIHBBZC0+TWdtdERlc2NSaW5nLkFsbG9jUGEpOwotCX0KLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NZ210RGVzY1JpbmcsIHNpemVvZihSVE1QX0RNQUJVRikpOwotCi0JZm9yIChudW0gPSAwOyBudW0gPCBOVU1fT0ZfVFhfUklORzsgbnVtKyspCi0JewotCWlmIChwQWQtPlR4QnVmU3BhY2VbbnVtXS5BbGxvY1ZhKQotCQl7Ci0JCQlSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKHBBZCwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NTaXplLCBGQUxTRSwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NWYSwgcEFkLT5UeEJ1ZlNwYWNlW251bV0uQWxsb2NQYSk7Ci0JICAgIH0KLQkgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+VHhCdWZTcGFjZVtudW1dLCBzaXplb2YoUlRNUF9ETUFCVUYpKTsKLQotCWlmIChwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhKQotCQl7Ci0JCQlSVE1QX0ZyZWVEZXNjTWVtb3J5KHBBZCwgcEFkLT5UeERlc2NSaW5nW251bV0uQWxsb2NTaXplLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1ZhLCBwQWQtPlR4RGVzY1JpbmdbbnVtXS5BbGxvY1BhKTsKLQkgICAgfQotCSAgICBOZGlzWmVyb01lbW9yeSgmcEFkLT5UeERlc2NSaW5nW251bV0sIHNpemVvZihSVE1QX0RNQUJVRikpOwotCX0KLQotCWlmIChwQWQtPkZyYWdGcmFtZS5wRnJhZ1BhY2tldCkKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBBZC0+RnJhZ0ZyYW1lLnBGcmFnUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5XG4iKSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICoJcmVnaXN0ZXIgcmVsYXRlZCBwcm9jZWR1cmVzLgotICAqCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBEaXNhYmxlIERNQS4KLQotQXJndW1lbnRzOgotCSpwQWQJCQkJdGhlIHJheHggaW50ZXJmYWNlIGRhdGEgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0JTm9uZQotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVDI4WFhETUFEaXNhYmxlKAotCUlOIFJUTVBfQURBUFRFUgkJCSpwQWQpCi17Ci0JV1BETUFfR0xPX0NGR19TVFJVQyAgICAgR2xvQ2ZnOwotCi0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JR2xvQ2ZnLndvcmQgJj0gMHhmZjA7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBFbmFibGUgRE1BLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIJCQkqcEFkKQotewotCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotCWludCBpID0gMDsKLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHg0KTsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+ICBETUFCdXN5XG4iKSk7Ci0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpIDwyMDApOwotCi0JUlRNUHVzZWNEZWxheSg1MCk7Ci0KLQlHbG9DZmcuZmllbGQuRW5UWFdyaXRlQmFja0RET05FID0gMTsKLQlHbG9DZmcuZmllbGQuV1BETUFCdXJzdFNJWkUgPSAyOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDE7Ci0JR2xvQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBXUklURSBETUEgb2Zmc2V0IDB4MjA4ID0gMHgleFxuIiwgR2xvQ2ZnLndvcmQpKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLX0KLQotCi1CT09MRUFOIEFzaWNDaGVja0NvbW1hbk9rKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCQkgQ29tbWFuZCkKLXsKLQlVSU5UMzIJQ21kU3RhdHVzID0gMCwgQ0lEID0gMCwgaTsKLQlVSU5UMzIJVGhpc0NJRE1hc2sgPSAwOwotCi0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAmQ0lEKTsKLQkJLy8gRmluZCB3aGVyZSB0aGUgY29tbWFuZCBpcy4gQmVjYXVzZSB0aGlzIGlzIHJhbmRvbWx5IHNwZWNpZmllZCBieSBmaXJtd2FyZS4KLQkJaWYgKChDSUQgJiBDSUQwTUFTSykgPT0gQ29tbWFuZCkKLQkJewotCQkJVGhpc0NJRE1hc2sgPSBDSUQwTUFTSzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKCgoKENJRCAmIENJRDFNQVNLKT4+OCkgJiAweGZmKSA9PSBDb21tYW5kKQotCQl7Ci0JCQlUaGlzQ0lETWFzayA9IENJRDFNQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEMk1BU0spPj4xNikgJiAweGZmKSA9PSBDb21tYW5kKQotCQl7Ci0JCQlUaGlzQ0lETWFzayA9IENJRDJNQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoKCgoQ0lEICYgQ0lEM01BU0spPj4yNCkgJiAweGZmKSA9PSBDb21tYW5kKQotCQl7Ci0JCQlUaGlzQ0lETWFzayA9IENJRDNNQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlSVE1QdXNlY0RlbGF5KDEwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKGkgPCAyMDApOwotCi0JLy8gR2V0IENvbW1hbmRTdGF0dXMgVmFsdWUKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgJkNtZFN0YXR1cyk7Ci0KLQkvLyBUaGlzIGNvbW1hbmQncyBzdGF0dXMgaXMgYXQgdGhlIHNhbWUgcG9zaXRpb24gYXMgY29tbWFuZC4gU28gQU5EIGNvbW1hbmQgcG9zaXRpb24ncyBiaXRtYXNrIHRvIHJlYWQgc3RhdHVzLgotCWlmIChpIDwgMjAwKQotCXsKLQkJLy8gSWYgU3RhdHVzIGlzIDEsIHRoZSBjb21hbW5kIGlzIHN1Y2Nlc3MuCi0JCWlmICgoKENtZFN0YXR1cyAmIFRoaXNDSURNYXNrKSA9PSAweDEpIHx8ICgoQ21kU3RhdHVzICYgVGhpc0NJRE1hc2spID09IDB4MTAwKQotCQkJfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDAwMCkgfHwgKChDbWRTdGF0dXMgJiBUaGlzQ0lETWFzaykgPT0gMHgxMDAwMDAwKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEFzaWNDaGVja0NvbW1hbk9rIENJRCA9IDB4JXgsIENtZFN0YXR1cz0gMHgleCBcbiIsIENJRCwgQ21kU3RhdHVzKSk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9TVEFUVVMsIDB4ZmZmZmZmZmYpOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBBc2ljQ2hlY2tDb21tYW5GYWlsMSBDSUQgPSAweCV4LCBDbWRTdGF0dXM9IDB4JXggXG4iLCBDSUQsIENtZFN0YXR1cykpOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gQXNpY0NoZWNrQ29tbWFuRmFpbDIgVGltZW91dCBDb21tYW5kID0gJWQsIENtZFN0YXR1cz0gMHgleCBcbiIsIENvbW1hbmQsIENtZFN0YXR1cykpOwotCX0KLQkvLyBDbGVhciBDb21tYW5kIGFuZCBTdGF0dXMuCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfU1RBVFVTLCAweGZmZmZmZmZmKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DSUQsIDB4ZmZmZmZmZmYpOwotCi0JcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgV3JpdGUgQmVhY29uIGJ1ZmZlciB0byBBc2ljLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLQlOb25lCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUMjh4eF9VcGRhdGVCZWFjb25Ub0FzaWMoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIElOVAkJCQlhcGlkeCwKLQlJTiBVTE9ORwkJCUZyYW1lTGVuLAotCUlOIFVMT05HCQkJVXBkYXRlUG9zKQotewotCVVMT05HCQkJCUNhcEluZm9Qb3MgPSAwOwotCVVDSEFSCQkJKnB0ciwgKnB0cl91cGRhdGUsICpwdHJfY2FwaW5mbzsKLQlVSU5UCQkJaTsKLQlCT09MRUFOCQkJYkJjblJlcSA9IEZBTFNFOwotCVVDSEFSCQkJYmNuX2lkeCA9IDA7Ci0KLQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKSA6IE5vIHZhbGlkIEludGVyZmFjZSBiZSBmb3VuZC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JLy9pZiAoKHBBZC0+V2RzVGFiLk1vZGUgPT0gV0RTX0JSSURHRV9NT0RFKQotCS8vCXx8ICgocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2ID09IE5VTEwpCi0JLy8JCXx8ICEocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLk1TU0lERGV2LT5mbGFncyAmIElGRl9VUCkpCi0JLy8JKQotCWlmIChiQmNuUmVxID09IEZBTFNFKQotCXsKLQkJLyogd2hlbiB0aGUgcmEgaW50ZXJmYWNlIGlzIGRvd24sIGRvIG5vdCBzZW5kIGl0cyBiZWFjb24gZnJhbWUgKi8KLQkJLyogY2xlYXIgYWxsIHplcm8gKi8KLQkJZm9yKGk9MDsgaTxUWFdJX1NJWkU7IGkrPTQpCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIDB4MDApOwotCX0KLQllbHNlCi0JewotCQlwdHIgPSAoUFVDSEFSKSZwQWQtPkJlYWNvblR4V0k7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQlSVE1QV0lFbmRpYW5DaGFuZ2UocHRyLCBUWVBFX1RYV0kpOwotI2VuZGlmCi0JCWZvciAoaT0wOyBpPFRYV0lfU0laRTsgaSs9NCkgIC8vIDE2LWJ5dGUgVFhXSSBmaWVsZAotCQl7Ci0JCQlVSU5UMzIgbG9uZ3B0ciA9ICAqcHRyICsgKCoocHRyKzEpPDw4KSArICgqKHB0cisyKTw8MTYpICsgKCoocHRyKzMpPDwyNCk7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFtiY25faWR4XSArIGksIGxvbmdwdHIpOwotCQkJcHRyICs9IDQ7Ci0JCX0KLQotCQkvLyBVcGRhdGUgQ2FwYWJpbGl0eUluZm8gaW4gQmVhY29uCi0JCWZvciAoaSA9IENhcEluZm9Qb3M7IGkgPCAoQ2FwSW5mb1BvcysyKTsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFOChwQWQsIHBBZC0+QmVhY29uT2Zmc2V0W2Jjbl9pZHhdICsgVFhXSV9TSVpFICsgaSwgKnB0cl9jYXBpbmZvKTsKLQkJCXB0cl9jYXBpbmZvICsrOwotCQl9Ci0KLQkJaWYgKEZyYW1lTGVuID4gVXBkYXRlUG9zKQotCQl7Ci0JCQlmb3IgKGk9IFVwZGF0ZVBvczsgaTwgKEZyYW1lTGVuKTsgaSsrKQotCQkJewotCQkJCVJUTVBfSU9fV1JJVEU4KHBBZCwgcEFkLT5CZWFjb25PZmZzZXRbYmNuX2lkeF0gKyBUWFdJX1NJWkUgKyBpLCAqcHRyX3VwZGF0ZSk7Ci0JCQkJcHRyX3VwZGF0ZSArKzsKLQkJCX0KLQkJfQotCi0JfQotCi19Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBSVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiAgICAgICBiRnJvbVR4KQotewotICAgIEFVVE9fV0FLRVVQX1NUUlVDCUF1dG9XYWtldXBDZmc7Ci0KLSAgICBpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgid2FraW5nIHVwIG5vdyFcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19XQUtFVVBfTk9XKTsKLQotICAgIFJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotCQkmJnBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotICAgIHsKLSAgICAgICAgLy8gU3VwcG9ydCBQQ0llIEFkdmFuY2UgUG93ZXIgU2F2ZQotCWlmIChiRnJvbVR4ID09IFRSVUUKLQkJCSYmKHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID09IFRSVUUpKQotCXsKLSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCBSRVNUT1JFX1dBS0VVUCk7Ci0JCVJUTVB1c2VjRGVsYXkoMzAwMCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PT09QXNpY0ZvcmNlV2FrZXVwPT09YkZyb21UeFxuIikpOwotCX0KLQotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0KLSAgICAgICAgaWYgKFJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgRE9UMTFQT1dFUlNBVkUpKQotICAgICAgICB7Ci0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0JCQkvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQkJCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKQotCQkJewotCQkJCVJUTVBfQ0hJUF9PUCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotCi0JCQkJaWYgKHBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkKLQkJCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JCQl7Ci0JCQkvLyBlbmQgam9obmxpCi0JCQkJLy8gSW4gUmFkaW8gT2ZmLCB3ZSB0dXJuIG9mZiBSRiBjbGssIFNvIG5vdyBuZWVkIHRvIGNhbGwgQVNJQ1N3aXRjaENoYW5uZWwgYWdhaW4uCi0JCQkJaWYgKElORlJBX09OKHBBZCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICE9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkJCSYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCXsKLQkJCQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KLSNpZmRlZiBQQ0lFX1BTX1NVUFBPUlQKLQkJLy8gMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4KLQkJLy8gQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLgotCQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQkJCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cDo6UmVsZWFzZSB0aGUgTUNVIExvY2soMzA5MClcbiIpKTsKLQkJCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKLQkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCX0KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gUENJLCAyODYwLVBDSWUKLSAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cDo6T3JpZ2luYWwgUENJIFBvd2VyIFNhdmluZ1xuIikpOwotICAgICAgICBBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIDB4ZmYsIDB4MDAsIDB4MDIpOwotICAgICAgICBBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCSAgICBSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0gICAgfQotCi0gICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0gICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVyk7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PT09PT1SVDI4eHhQY2lTdGFBc2ljRm9yY2VXYWtldXBcbiIpKTsKLX0KLQotCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKQotewotCUJPT0xFQU4gYnJjOwotCi0JaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQl7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCQlyZXR1cm47Ci0JfQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotCQkmJnBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCXsKLQkJVUxPTkcJTm93ID0gMDsKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV0FLRVVQX05PVykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndha2luZyB1cCBub3chXG4iKSk7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCS8vIElmIGxhc3Qgc2VuZCBOVUxMIGZyYW0gdGltZSBpcyB0b28gY2xvc2UgdG8gdGhpcyByZWNlaXZpbmcgYmVhY29uICh3aXRoaW4gOG1zKSwgZG9uJ3QgZ28gdG8gc2xlZXAgZm9yIHRoaXMgRFRNLgotCQkvLyBCZWNhdXNlIFNvbWUgQVAgY2FuJ3QgcXVldWluZyBvdXRnb2luZyBmcmFtZXMgaW1tZWRpYXRlbHkuCi0JCWlmICgoKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lICsgOCkgPj0gTm93KSAmJiAocEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUgPD0gTm93KSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm93ID0gJWx1LCBMYXN0U2VuZE5VTExwc21UaW1lPSVsdSA6ICBSeENvdW50U2luY2VMYXN0TlVMTCA9ICVsdS4gXG4iLCBOb3csIHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lLCBwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+UmFsaW5rQ291bnRlcnMuUnhDb3VudFNpbmNlTGFzdE5VTEwgPiAwKSAmJiAoKHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lICsgcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kKSA+PSBOb3cpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3cgPSAlbHUsIExhc3RTZW5kTlVMTHBzbVRpbWU9JWx1OiBSeENvdW50U2luY2VMYXN0TlVMTCA9ICVsdSA+IDAgXG4iLCBOb3csIHBBZC0+TWxtZS5MYXN0U2VuZE5VTExwc21UaW1lLCAgcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50U2luY2VMYXN0TlVMTCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYnJjID0gUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgRE9UMTFQT1dFUlNBVkUsIFRidHROdW1Ub05leHRXYWtlVXApOwotCQlpZiAoYnJjPT1UUlVFKQotCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCX0KLQllbHNlCi0JewotCQlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOwotCQkvLyB3ZSBoYXZlIGRlY2lkZWQgdG8gU0xFRVAsIHNvIGF0IGxlYXN0IGRvIGl0IGZvciBhIEJFQUNPTiBwZXJpb2QuCi0JCWlmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApCi0JCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gMTsKLQotCQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgQXV0b1dha2V1cEludCk7Ci0KLQkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCQlBdXRvV2FrZXVwQ2ZnLmZpZWxkLk51bW9mU2xlZXBpbmdUYnR0ID0gVGJ0dE51bVRvTmV4dFdha2VVcCAtIDE7Ci0JCUF1dG9XYWtldXBDZmcuZmllbGQuRW5hYmxlQXV0b1dha2V1cCA9IDE7Ci0JCUF1dG9XYWtldXBDZmcuZmllbGQuQXV0b0xlYWRUaW1lID0gNTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIDB4ZmYsIDB4ZmYsIDB4MDApOyAgIC8vIHNlbmQgUE9XRVItU0FWRSBjb21tYW5kIHRvIE1DVS4gVGltZW91dCA0MHVzLgotCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSAlcywgVGJ0dE51bVRvTmV4dFdha2VVcD0lZCBcbiIsIF9fRlVOQ1RJT05fXywgVGJ0dE51bVRvTmV4dFdha2VVcCkpOwotCX0KLQotfQotCi0KLVZPSUQgUHNQb2xsV2FrZUV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCItLT5Qc1BvbGxXYWtlRXhlYyBcbiIpKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLSAgICBpZiAocEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcpCi0gICAgewotCSAgICBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotICAgIH0KLSAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotCS8vIEZvciBydDMweHggcG93ZXIgc29sdXRpb24gMywgVXNlIHNvZnR3YXJlIHRpbWVyIHRvIHdha2UgdXAgaW4gcHNtLiBTbyBjYWxsCi0JLy8gQXNpY0ZvcmNlV2FrZXVwIGhlcmUgaW5zdGVhZCBvZiBoYW5kbGluZyB0d2FrZXVwIGludGVycnVwdC4KLQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI8LS1Qc1BvbGxXYWtlRXhlYzo6MzA5MCBjYWxscyBBc2ljRm9yY2VXYWtldXAocEFkLCBET1QxMVBPV0VSU0FWRSkgaW4gYWR2YW5jZSBcbiIpKTsKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRE9UMTFQT1dFUlNBVkUpOwotCX0KLQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotfQotCi1WT0lEICBSYWRpb09uRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCVJUTVBfQ0hJUF9PUCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotCVdQRE1BX0dMT19DRkdfU1RSVUMJRG1hQ2ZnOwotCUJPT0xFQU4JCQkJQ2FuY2VsbGVkOwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIi0tPlJhZGlvT25FeGVjKCkgcmV0dXJuIG9uIGZPUF9TVEFUVVNfRE9aRSA9PSBUUlVFOyBcbiIpKTsKLS8vS0ggRGVidWc6IEFkZCB0aGUgY29tcGlsZSBmbGFnICJSVDI4NjAgYW5kIGNvbmRpdGlvbgotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCQkmJnBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsIDEwKTsKLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+UmFkaW9PbkV4ZWMoKSByZXR1cm4gb24gU0NBTl9JTl9QUk9HUkVTUzsgXG4iKSk7Ci0KLQotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQkJcmV0dXJuOwotCX0KLS8vS0ggRGVidWc6IG5lZWQgdG8gY2hlY2suIEkgYWRkIHRoZSBjb21waWxlIGZsYWcgIkNPTkZJR19TVEFfU1VQUE9SVCIgdG8gZW5jbG9zZSB0aGUgZm9sbG93aW5nIGNvZGVzLgotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JewotCXBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCX0KLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0JaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotCXsKLQkJcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CSyk7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19CRSk7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WTyk7Ci0JCS8qUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOyovCi0JCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQkJUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX1JYKTsKLQotCQkvLyAyLiBTZW5kIHdha2UgdXAgY29tbWFuZC4KLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOwotCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KLQkJQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlcldha2VDSUQpOwotCi0JCS8vIFdoZW4gUENJIGNsb2NrIGlzIG9mZiwgZG9uJ3Qgd2FudCB0byBzZXJ2aWNlIGludGVycnVwdC4gU28gd2hlbiBiYWNrIHRvIGNsb2NrIG9uLCBlbmFibGUgaW50ZXJydXB0LgotCQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgKERFTEFZSU5UTUFTS3xSeElOVCkpOwotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOwotCi0JCS8vIDMuIEVuYWJsZSBUeCBETUEuCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKLQkJRG1hQ2ZnLmZpZWxkLkVuYWJsZVR4RE1BID0gMTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgRG1hQ2ZnLndvcmQpOwotCi0JCS8vIEluIFJhZGlvIE9mZiwgd2UgdHVybiBvZmYgUkYgY2xrLCBTbyBub3cgbmVlZCB0byBjYWxsIEFTSUNTd2l0Y2hDaGFubmVsIGFnYWluLgotCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCSYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQl7Ci0JCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gTXVzdCB1c2luZyAyME1Iei4KLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCX0KLS8vS0ggRGVidWc6VGhlIGZvbGxvd2luZyBjb2RlcyBzaG91bGQgYmUgZW5jbG9zZWQgYnkgUlQzMDkwIGNvbXBpbGUgZmxhZwotCQlpZiAocENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKQotCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7Ci0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotLy8gQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLgotaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0JewotCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQkJLy8gQ2xlYXIgUmFkaW8gb2ZmIGZsYWcKLQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCS8vIFNldCBMRUQKLQkJUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PTik7Ci0KLSAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfQUNUSVZFKQotICAgICAgICB7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIHBBZC0+U3RhQ2ZnLkJCUFIzKTsKLSAgICAgICAgfQotCX0KLQllbHNlCi0JewotCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlSQURJT19PRkYsIDApOwotCX0KLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBzZW5kcyBjb21tYW5kIHRvIGZpcm13YXJlIGFuZCB0dXJuIG91ciBjaGlwIHRvIHdha2UgdXAgbW9kZSBmcm9tIHBvd2VyIHNhdmUgbW9kZS4KLQkJQm90aCBSYWRpb09uIGFuZCAuMTEgcG93ZXIgc2F2ZSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsIHRoaXMgcm91dGluZS4KLQlJbnB1dDoKLQkJTGV2ZWwgPSBHVUlSQURJT19PRkYgOiBjYWxsIHRoaXMgZnVuY3Rpb24gaXMgZnJvbSBSYWRpbyBPZmYgdG8gUmFkaW8gT24uICBOZWVkIHRvIHJlc3RvcmUgUENJIGhvc3QgdmFsdWUuCi0JCUxldmVsID0gb3RoZXIgdmFsdWUgOiBub3JtYWwgd2FrZSB1cCBmdW5jdGlvbi4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgIExldmVsKQotewotICAgIC8vV1BETUFfR0xPX0NGR19TVFJVQwlEbWFDZmc7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JQk9PTEVBTgkJCQlDYW5jZWxsZWQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgLy9VSU5UMzIJCQkgICAgTUFDVmFsdWU7Ci0KLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQICYmIExldmVsPT1ET1QxMVBPV0VSU0FWRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQl7Ci0JICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkmQ2FuY2VsbGVkKTsKLQkJfQotCQlpZiAoKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSYmCi0JCSgoTGV2ZWwgPT0gR1VJUkFESU9fT0ZGKSB8fCAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkpCi0JCXx8KFJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCkpKQotCQl7Ci0JCQkvLyBTb21lIGNoaXBzIGRvbid0IG5lZWQgdG8gZGVsYXkgNm1zLCBzbyBjb3B5IFJUTVBQQ0llUG93ZXJMaW5rQ3RybFJlc3RvcmUKLQkJCS8vIHJldHVybiBjb25kaXRpb24gaGVyZS4KLQkJCS8qCi0JCQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24mMHhmZmZmMDAwMCkgIT0gMHgyODYwMDAwMCkKLQkJCQkmJiAoKHBBZC0+RGV2aWNlSUQgPT0gTklDMjg2MF9QQ0llX0RFVklDRV9JRCkKLQkJCQl8fChwQWQtPkRldmljZUlEID09IE5JQzI3OTBfUENJZV9ERVZJQ0VfSUQpKSkKLQkJCSovCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUMjh4eFBjaUFzaWNSYWRpb09uICgpXG4iKSk7Ci0JCQkvLyAxLiBTZXQgUENJIExpbmsgQ29udHJvbCBpbiBDb25maWd1cmF0aW9uIFNwYWNlLgotCQkJUlRNUFBDSWVMaW5rQ3RybFZhbHVlUmVzdG9yZShwQWQsIFJFU1RPUkVfV0FLRVVQKTsKLQkJCVJUTVB1c2VjRGVsYXkoNjAwMCk7Ci0JCX0KLQl9Ci0JfQotCi0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi1pZiAoISgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkpKQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCXsKLSAgICBwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNIDozMDl4YlBDSWNsa09mZiA9PSAlZFxuIiwgcEFkLT5iUENJY2xrT2ZmKSk7Ci0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JLy8gMi4gU2VuZCB3YWtlIHVwIGNvbW1hbmQuCi0JQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMxLCBQb3dlcldha2VDSUQsIDB4MDAsIDB4MDIpOwotCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCS8vIDItMS4gd2FpdCBjb21tYW5kIG9rLgotCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKLQlSVE1QX0FTSUNfSU5URVJSVVBUX0VOQUJMRShwQWQpOwotCi0KLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKTsKLQlpZiAoTGV2ZWwgPT0gR1VJX0lETEVfUE9XRVJfU0FWRSkKLQl7Ci0jaWZkZWYgIFBDSUVfUFNfU1VQUE9SVAotCi0JCQkvLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cCwgbG9hZCBSRiBub3JtYWwgb3BlcmF0aW9uLW1vZGUgc2V0dXAKLQkJCWlmICgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKQotCQkJewotCQkJCVJUTVBfQ0hJUF9PUCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotCi0JCQkJaWYgKHBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkKLQkJCQkJcENoaXBPcHMtPkFzaWNSZXZlcnNlUmZGcm9tU2xlZXBNb2RlKHBBZCk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJLy8gMzA5MCBNQ1UgV2FrZXVwIGNvbW1hbmQgbmVlZHMgbW9yZSB0aW1lIHRvIGJlIHN0YWJsZS4KLQkJCQkvLyBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuCi0JCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQkJCQkJewotCQkJCQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCQkJCXBBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotCQkJCQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQkJCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQl9Ci0JCQllbHNlCi0JCQkvLyBlbmQgam9obmxpCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JCQl7Ci0JCQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQkJewotCQkJCWlmIChJTkZSQV9PTihwQWQpICYmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCAhPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCQkmJiAocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJCQl7Ci0JCQkJCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJfQotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQl9Ci0gICAgICAgIHJldHVybiBUUlVFOwotCi19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgc2VuZHMgY29tbWFuZCB0byBmaXJtd2FyZSBhbmQgdHVybiBvdXIgY2hpcCB0byBwb3dlciBzYXZlIG1vZGUuCi0JCUJvdGggUmFkaW9PZmYgYW5kIC4xMSBwb3dlciBzYXZlIGZ1bmN0aW9uIG5lZWRzIHRvIGNhbGwgdGhpcyByb3V0aW5lLgotCUlucHV0OgotCQlMZXZlbCA9IEdVSVJBRElPX09GRiAgOiBHVUkgUmFkaW8gT2ZmIG1vZGUKLQkJTGV2ZWwgPSBET1QxMVBPV0VSU0FWRSAgOiA4MDIuMTEgcG93ZXIgc2F2ZSBtb2RlCi0JCUxldmVsID0gUlRNUF9IQUxUICA6IFdoZW4gRGlzYWJsZSBkZXZpY2UuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAotCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCkKLXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCURtYUNmZzsKLQlVQ0hBUgkJaSwgdGVtcEJCUF9SMyA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JQk9PTEVBTgkJYnJjID0gRkFMU0UsIENhbmNlbGxlZDsKLSAgICBVSU5UMzIJCVRiVFRUaW1lID0gMDsKLQlVSU5UMzIJCVBzUG9sbFRpbWUgPSAwLyosIE1BQ1ZhbHVlKi87Ci0gICAgVUxPTkcJCUJlYWNvblBlcmlvZFRpbWU7Ci0gICAgVUlOVDMyCQlSeERtYUlkeCwgUnhDcHVJZHg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gTHY9ICVkLCBUeENwdUlkeCA9ICVkLCBUeERtYUlkeCA9ICVkLiBSeENwdUlkeCA9ICVkLCBSeERtYUlkeCA9ICVkLlxuIiwgTGV2ZWwscEFkLT5UeFJpbmdbMF0uVHhDcHVJZHgsIHBBZC0+VHhSaW5nWzBdLlR4RG1hSWR4LCBwQWQtPlJ4UmluZy5SeENwdUlkeCwgcEFkLT5SeFJpbmcuUnhEbWFJZHgpKTsKLQotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVAgJiYgTGV2ZWw9PURPVDExUE9XRVJTQVZFKQotCQlyZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBDaGVjayBSeCBETUEgYnVzeSBzdGF0dXMsIGlmIG1vcmUgdGhhbiBoYWxmIGlzIG9jY3VwaWVkLCBnaXZlIHVwIHRoaXMgcmFkaW8gb2ZmLgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfRFJYX0lEWCAsICZSeERtYUlkeCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9DUlhfSURYICwgJlJ4Q3B1SWR4KTsKLQlpZiAoKFJ4RG1hSWR4ID4gUnhDcHVJZHgpICYmICgoUnhEbWFJZHggLSBSeENwdUlkeCkgPiBSWF9SSU5HX1NJWkUvMykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc2ljUmFkaW9PZmYgPT09PiByZXR1cm4xLiBSeERtYUlkeCA9ICVkICwgIFJ4Q3B1SWR4ID0gJWQuIFxuIiwgUnhEbWFJZHgsIFJ4Q3B1SWR4KSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZSBpZiAoKFJ4Q3B1SWR4ID49IFJ4RG1hSWR4KSAmJiAoKFJ4Q3B1SWR4IC0gUnhEbWFJZHgpIDwgUlhfUklOR19TSVpFLzMpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNpY1JhZGlvT2ZmID09PT4gcmV0dXJuMi4gIFJ4Q3B1SWR4ID0gJWQuIFJ4RG1hSWR4ID0gJWQgLCAgXG4iLCBSeENwdUlkeCwgUnhEbWFJZHgpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotICAgIC8vIE9uY2UgZ28gaW50byB0aGlzIGZ1bmN0aW9uLCBkaXNhYmxlIHR4IGJlY2F1c2UgZG9uJ3Qgd2FudCB0b28gbWFueSBwYWNrZXRzIGluIHF1ZXVlIHRvIHByZXZlbnQgSFcgc3RvcHMuCi0JLy9wQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBUUlVFOwotCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKQotCQkmJiBwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCSYmcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJKQotCXsKLQotCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOwotCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0KLQkgICAgaWYgKExldmVsID09IERPVDExUE9XRVJTQVZFKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRCVFRfVElNRVIsICZUYlRUVGltZSk7Ci0JCQlUYlRUVGltZSAmPSAweDFmZmZmOwotCQkJLy8gMDAuIGNoZWNrIGlmIG5lZWQgdG8gZG8gc2xlZXAgaW4gdGhpcyBEVElNIHBlcmlvZC4gICBJZiBuZXh0IGJlYWNvbiB3aWxsIGFycml2ZSB3aXRoaW4gMzBtcyAsIC4uLmRvZXNuJ3QgbmVjZXNzYXJpbHkgc2xlZXAuCi0JCQkvLyBUYlRUVGltZSB1aW50ID0gNjR1cywgTEVBRF9USU1FIHVuaXQgPSAxMDI0dXMsIFBzUG9sbFRpbWUgdW5pdCA9IDFtcwotCSAgICAgICAgaWYgICgoKDY0KlRiVFRUaW1lKSA8KChMRUFEX1RJTUUqMTAyNCkgKyA0MDAwMCkpICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID09IDApKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRiVFRUaW1lID0gMHgleCAsIGdpdmUgdXAgdGhpcyBzbGVlcC4gXG4iLCBUYlRUVGltZSkpOwotCSAgICAgICAgICAgIE9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCSAgICAgICAgICAgIC8vcEFkLT5iUENJY2xrT2ZmRGlzYWJsZVR4ID0gRkFMU0U7Ci0JICAgICAgICAgICAgUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19ESVNBQkxFX1RYKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUHNQb2xsVGltZSA9ICg2NCpUYlRUVGltZS0gTEVBRF9USU1FKjEwMjQpLzEwMDA7Ci0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJaWYgKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0JCQkJewotCQkJCQkJCVBzUG9sbFRpbWUgLT0gNTsKLQkJCQl9Ci0JCQkJZWxzZQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCQkJCVBzUG9sbFRpbWUgLT0gMzsKLQotCSAgICAgICAgICAgIEJlYWNvblBlcmlvZFRpbWUgPSBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QqMTAyLzEwMDsKLQkJCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IDApCi0JCQkJCVBzUG9sbFRpbWUgKz0gKChUYnR0TnVtVG9OZXh0V2FrZVVwIC0xKSAqIEJlYWNvblBlcmlvZFRpbWUpOwotCi0JICAgICAgICAgICAgcEFkLT5NbG1lLmJQc1BvbGxUaW1lclJ1bm5pbmcgPSBUUlVFOwotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCBQc1BvbGxUaW1lKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVDI4eHhQY2lBc2ljUmFkaW9PZmY6OkxldmVsIT1ET1QxMVBPV0VSU0FWRSBcbiIpKTsKLQl9Ci0KLQlwQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsKLSAgICBSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICAvLyBTZXQgdG8gMVIuCi0JaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotICAgIHRlbXBCQlBfUjMgPSAocEFkLT5TdGFDZmcuQkJQUjMgJiAweEU3KTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCB0ZW1wQkJQX1IzKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBJbiBSYWRpbyBPZmYsIHdlIHR1cm4gb2ZmIFJGIGNsaywgU28gbm93IG5lZWQgdG8gY2FsbCBBU0lDU3dpdGNoQ2hhbm5lbCBhZ2Fpbi4KLQlpZiAoKElORlJBX09OKHBBZCkgfHwgcEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSAmJiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgIT0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JewotCQkvLyBNdXN0IHVzaW5nIDQwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCX0KLQllbHNlCi0JewotCQkvLyBNdXN0IHVzaW5nIDIwTUh6LgotCQlBc2ljVHVybk9mZlJGQ2xrKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JfQotCi0JaWYgKExldmVsICE9IFJUTVBfSEFMVCkKLQl7Ci0JCS8vIENoYW5nZSBJbnRlcnJ1cHQgYml0bWFzay4KLSAgICAvLyBXaGVuIFBDSSBjbG9jayBpcyBvZmYsIGRvbid0IHdhbnQgdG8gc2VydmljZSBpbnRlcnJ1cHQuCi0JUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCBBdXRvV2FrZXVwSW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7Ci0JfQotCi0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9DUlhfSURYLCBwQWQtPlJ4UmluZy5SeENwdUlkeCk7Ci0JLy8gIDIuIFNlbmQgU2xlZXAgY29tbWFuZAotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX1NUQVRVUywgMHhmZmZmZmZmZik7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSDJNX01BSUxCT1hfQ0lELCAweGZmZmZmZmZmKTsKLQkvLyBzZW5kIFBPV0VSLVNBVkUgY29tbWFuZCB0byBNQ1UuIGhpZ2gtYnl0ZSA9IDEgc2F2ZSBwb3dlciBhcyBtdWNoIGFzIHBvc3NpYmxlLiBoaWdoIGJ5dGUgPSAwIHNhdmUgbGVzcyBwb3dlcgotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJTYWZlQ0lELCAweGZmLCAweDEpOwotCS8vICAyLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JLy8gU3RhdHVzID0gMSA6IHN1Y2Nlc3MsIFN0YXR1cyA9IDIsIGFscmVhZHkgc2xlZXAsIFN0YXR1cyA9IDMsIE1heWJlIE1BQyBpcyBidXN5IHNvIGNhbid0IGZpbmlzaCB0aGlzIHRhc2suCi0JYnJjID0gQXNpY0NoZWNrQ29tbWFuT2socEFkLCBQb3dlclNhZmVDSUQpOwotCi0JLy8gIDMuIEFmdGVyIDB4MzAgY29tbWFuZCBpcyBvaywgc2VuZCByYWRpbyBvZmYgY29tbWFuZC4gbG93Ynl0ZSA9IDAgZm9yIHBvd2VyIHNhZmUuCi0JLy8gSWYgMHgzMCBjb21tYW5kIGlzIG5vdCBvayB0aGlzIHRpbWUsIHdlIGNhbiBpZ25vcmUgMHgzNSBjb21tYW5kLiBJdCB3aWxsIG1ha2Ugc3VyZSBub3QgY2F1c2UgZmlybXdhcmUnciBwcm9ibGVtLgotCWlmICgoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpICYmIChicmMgPT0gVFJVRSkpCi0JewotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzUsIFBvd2VyUmFkaW9PZmZDSUQsIDAsIDB4MDApOwkvLyBsb3dieXRlID0gMCBtZWFucyB0byBkbyBwb3dlciBzYWZlLCBOT1QgdHVybiBvZmYgcmFkaW8uCi0JCS8vICAzLTEuIFdhaXQgY29tbWFuZCBzdWNjZXNzCi0JCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJSYWRpb09mZkNJRCk7Ci0JfQotCWVsc2UgaWYgKGJyYyA9PSBUUlVFKQotCXsKLQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM1LCBQb3dlclJhZGlvT2ZmQ0lELCAxLCAweDAwKTsJLy8gbG93Ynl0ZSA9IDAgbWVhbnMgdG8gZG8gcG93ZXIgc2FmZSwgTk9UIHR1cm4gb2ZmIHJhZGlvLgotCQkvLyAgMy0xLiBXYWl0IGNvbW1hbmQgc3VjY2VzcwotCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyUmFkaW9PZmZDSUQpOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIDEuIFdhaXQgRE1BIG5vdCBidXN5Ci0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkRtYUNmZy53b3JkKTsKLQkJaWYgKChEbWFDZmcuZmllbGQuUnhETUFCdXN5ID09IDApICYmIChEbWFDZmcuZmllbGQuVHhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0JCVJUTVB1c2VjRGVsYXkoMjApOwotCQlpKys7Ci0JfXdoaWxlKGkgPCA1MCk7Ci0KLQkvKgotCWlmIChpID49IDUwKQotCXsKLQkJcEFkLT5DaGVja0RtYUJ1c3lDb3VudCsrOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETUEgUngga2VlcHMgYnVzeS4gIHJldHVybiBvbiBBc2ljUmFkaW9PZmYgKCkgQ2hlY2tEbWFCdXN5Q291bnQgPSAlZCBcbiIsIHBBZC0+Q2hlY2tEbWFCdXN5Q291bnQpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5DaGVja0RtYUJ1c3lDb3VudCA9IDA7Ci0JfQotCSovCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0vL0tIIERlYnVnOk15IG9yaWdpbmFsIGNvZGVzIGhhdmUgdGhlIGZvbGx3b2luZyBjb2RlcywgYnV0IGN1cnJlY250IGNvZGVzIGRvIG5vdCBoYXZlIGl0LgotLy8gRGlzYWJsZSBmb3Igc3RhYmlsaXR5LiBJZiBQQ0lFIExpbmsgQ29udHJvbCBpcyBtb2RpZmllZCBmb3IgYWR2YW5jZSBwb3dlciBzYXZlLCByZS1jb3ZlcnkgdGhpcyBjb2RlIHNlZ21lbnQuCi1SVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MTI4MCk7Ci0vL09QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19DTEtTRUxFQ1RfNDBNSFopOwotCi0jaWZkZWYgUENJRV9QU19TVVBQT1JUCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1pZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKSkKLQl7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlQyOHh4UGNpQXNpY1JhZGlvT2ZmOjozMDkwIHJldHVybiB0byBza2lwIHRoZSBmb2xsb3dpbmcgVGJ0dE51bVRvTmV4dFdha2VVcCBzZXR0aW5nIGZvciAyNzl4XG4iKSk7Ci0JcEFkLT5iUENJY2xrT2ZmID0gVFJVRTsKLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCS8vIEZvciB0aGlzIGNhc2UsIGRvZXNuJ3QgbmVlZCB0byBiZWxvdyBhY3Rpb25zLCBzbyByZXR1cm4gaGVyZS4KLQlyZXR1cm4gYnJjOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBQQ0lFX1BTX1NVUFBPUlQgLy8KLQlpZiAoTGV2ZWwgPT0gRE9UMTFQT1dFUlNBVkUpCi0JewotCQlBVVRPX1dBS0VVUF9TVFJVQwlBdXRvV2FrZXVwQ2ZnOwotCQkvL1JUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLCA5MCk7Ci0KLQkJLy8gd2UgaGF2ZSBkZWNpZGVkIHRvIFNMRUVQLCBzbyBhdCBsZWFzdCBkbyBpdCBmb3IgYSBCRUFDT04gcGVyaW9kLgotCQlpZiAoVGJ0dE51bVRvTmV4dFdha2VVcCA9PSAwKQotCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IDE7Ci0KLQkJQXV0b1dha2V1cENmZy53b3JkID0gMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19XQUtFVVBfQ0ZHLCBBdXRvV2FrZXVwQ2ZnLndvcmQpOwotCi0JCS8vIDEuIFNldCBhdXRvIHdha2UgdXAgdGltZXIuCi0JCUF1dG9XYWtldXBDZmcuZmllbGQuTnVtb2ZTbGVlcGluZ1RidHQgPSBUYnR0TnVtVG9OZXh0V2FrZVVwIC0gMTsKLQkJQXV0b1dha2V1cENmZy5maWVsZC5FbmFibGVBdXRvV2FrZXVwID0gMTsKLQkJQXV0b1dha2V1cENmZy5maWVsZC5BdXRvTGVhZFRpbWUgPSBMRUFEX1RJTUU7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyAgNC0xLiBJZiBpdCdzIHRvIGRpc2FibGUgb3VyIGRldmljZS4gTmVlZCB0byByZXN0b3JlIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KLQlpZiAoTGV2ZWwgPT0gUlRNUF9IQUxUICYmIHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKLQkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMSk7Ci0JfQotCS8vICA0LiBTZXQgUENJIGNvbmZpZ3VyYXRpb24gU3BhY2UgTGluayBDb210cm9sIGZpZWxkcy4gIE9ubHkgUmFkaW8gT2ZmIG5lZWRzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgotCWVsc2UgaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlpZiAoKGJyYyA9PSBUUlVFKSAmJiAoaSA8IDUwKSkKLQkJCVJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKHBBZCwgMyk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy9wQWQtPmJQQ0ljbGtPZmZEaXNhYmxlVHggPSBGQUxTRTsKLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpOwotCXJldHVybiBUUlVFOwotfQotCi0KLQotCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotICAgIGlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCXJldHVybjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotICAgIGlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSB8fAotICAgICAgICAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0gICAgICAgICYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICAgICAgfHxwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAgICAgKSkpCi0gICAgewotCVJUMjh4eFBjaUFzaWNSYWRpb09uKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSk7Ci0JLy9OSUNSZXNldEZyb21FcnJvcihwQWQpOwotCi0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JLKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkUpOwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0JUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX1ZPKTsKLQkvKlJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9IQ0NBKTsqLwotCVJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9NR01UKTsKLQlSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfUlgpOwotCi0JLy8gRW5hYmxlIFR4L1J4Ci0JUlRNUEVuYWJsZVJ4VHgocEFkKTsKLQotCS8vIENsZWFyIFJhZGlvIG9mZiBmbGFnCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotCSAgICAvLyBTZXQgTEVECi0JICAgIFJUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT04pOwotICAgIH0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotICAgIGlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYKLSAgICAgICAgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotICAgICAgICAmJihwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0gICAgewotICAgICAgICBCT09MRUFOCQlDYW5jZWxsZWQ7Ci0KLQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9XQUtFVVApOwotCi0gICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCSZDYW5jZWxsZWQpOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwJJkNhbmNlbGxlZCk7Ci0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUmFkaW9Pbk9mZlRpbWVyLCA0MCk7Ci0gICAgfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotfQotCi0KLVZPSUQgUlQyOHh4UGNpTWxtZVJhZGlvT0ZGKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJPT0xFQU4gYnJjPVRSVUU7Ci0KLSAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JcmV0dXJuOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8gTGluayBkb3duIGZpcnN0IGlmIGFueSBhc3NvY2lhdGlvbiBleGlzdHMKLQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7Ci0JCWlmIChJTkZSQV9PTihwQWQpIHx8IEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCU1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCBEaXNSZXE7Ci0JCQlNTE1FX1FVRVVFX0VMRU0gKnBNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0KLQkJCWlmIChwTXNnRWxlbSkKLQkJCXsKLQkJCQlDT1BZX01BQ19BRERSKCZEaXNSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJCURpc1JlcS5SZWFzb24gPSAgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HOwotCi0JCQkJcE1zZ0VsZW0tPk1hY2hpbmUgPSBBU1NPQ19TVEFURV9NQUNISU5FOwotCQkJCXBNc2dFbGVtLT5Nc2dUeXBlID0gTVQyX01MTUVfRElTQVNTT0NfUkVROwotCQkJCXBNc2dFbGVtLT5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKLQkJCQlOZGlzTW92ZU1lbW9yeShwTXNnRWxlbS0+TXNnLCAmRGlzUmVxLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSk7Ci0KLQkJCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBwTXNnRWxlbSk7Ci0JCQkJa2ZyZWUocE1zZ0VsZW0pOwotCi0JCQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM9PT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCS8vIFNldCBMRUQKLQkvL1JUTVBTZXRMRUQocEFkLCBMRURfUkFESU9fT0ZGKTsKLQkvLyBTZXQgUmFkaW8gb2ZmIGZsYWcKLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLSAgICB7Ci0JQk9PTEVBTgkJQ2FuY2VsbGVkOwotCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJewotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJkNhbmNlbGxlZCk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLQl9Ci0JCQkvLyBJZiBkdXJpbmcgcG93ZXIgc2FmZSBtb2RlLgotCQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiLS0+TWxtZVJhZGlvT2ZmKCkgcmV0dXJuIG9uIGJSYWRpbyA9PSBUUlVFOyBcbiIpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBBbHdheXMgcmFkaW8gb24gc2luY2UgdGhlIE5JQyBuZWVkcyB0byBzZXQgdGhlIE1DVSBjb21tYW5kIChMRURfUkFESU9fT0ZGKS4KLQkJCWlmIChJRExFX09OKHBBZCkgJiYKLQkJCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCi0JCQl7Ci0JCQkJUlQyOHh4UGNpQXNpY1JhZGlvT24ocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFKTsKLQkJCX0KLQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCT09MRUFOIENhbmNlbGxlZDsKLSAgICAgICAgICAgIHBBZC0+TWxtZS5iUHNQb2xsVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0gICAgICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0JICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCSZDYW5jZWxsZWQpOwotICAgICAgICB9Ci0JCX0KLQotICAgICAgICAvLyBMaW5rIGRvd24gZmlyc3QgaWYgYW55IGFzc29jaWF0aW9uIGV4aXN0cwotICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpKQotICAgICAgICAgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0gICAgICAgIFJUTVB1c2VjRGVsYXkoMTAwMDApOwotICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAvLyBDbGVhbiB1cCBvbGQgYnNzIHRhYmxlCi0gICAgICAgIEJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQotICAgICAgICAvKgotICAgICAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCS8vIFNldCBMRUQuTW92ZSB0byBoZXJlIGZvciBmaXhpbmcgTEVEIGJ1Zy4gVGhpcyBmbGFnIG11c3QgYmUgY2FsbGVkIGFmdGVyIExpbmtEb3duCi0JUlRNUFNldExFRChwQWQsIExFRF9SQURJT19PRkYpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vL0tIIERlYnVnOkFsbCBQQ0llIGRldmljZXMgbmVlZCB0byB1c2UgdGltZXIgdG8gZXhlY3V0ZSByYWRpbyBvZmYgZnVuY3Rpb24sIG9yIHRoZSBQQ0llJiZFbmFibGVOZXdQUyBuZWVkcy4KLS8vS0ggQW5zOkl0IGlzIHJpZ2h0LCBiZWNhdXNlIG9ubHkgd2hlbiB0aGUgUENJZSBhbmQgRW5hYmxlTmV3UHMgaXMgdHJ1ZSwgd2UgbmVlZCB0byBkZWxheSB0aGUgUmFkaW9PZmZUaW1lcgotLy90byBhdm9pZCB0aGUgZGVhZGxvY2sgd2l0aCBQQ0llIFBvd2VyIHNhdmluZyBmdW5jdGlvbi4KLWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBJiYKLQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSYmCi0JcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JewotCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgMTApOwotCX0KLWVsc2UKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLXsKLQotCi0JYnJjPVJUMjh4eFBjaUFzaWNSYWRpb09mZihwQWQsIEdVSVJBRElPX09GRiwgMCk7Ci0KLQlpZiAoYnJjPT1GQUxTRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiJXMgY2FsbCBSVDI4eHhQY2lBc2ljUmFkaW9PZmYgZmFpbCAhIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JfQotfQotLyoKLQkvLyBEaXNhYmxlIFR4L1J4IERNQQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsJICAgLy8gZGlzYWJsZSBETUEKLQlHbG9DZmcuZmllbGQuRW5hYmxlVHhETUEgPSAwOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwkgICAvLyBhYm9ydCBhbGwgVFggcmluZ3MKLQotCi0JLy8gTUFDX1NZU19DVFJMID0+IHZhbHVlID0gMHgwID0+IDQwbUEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDApOwotCi0JLy8gUFdSX1BJTl9DRkcgPT4gdmFsdWUgPSAweDAgPT4gNDBtQQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBXUl9QSU5fQ0ZHLCAwKTsKLQotCS8vIFRYX1BJTl9DRkcgPT4gdmFsdWUgPSAweDAgPT4gMjBtQQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIDApOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCS8vIE11c3QgdXNpbmcgNDBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE11c3QgdXNpbmcgMjBNSHouCi0JCUFzaWNUdXJuT2ZmUkZDbGsocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQl9Ci0KLQkvLyBXYWl0aW5nIGZvciBETUEgaWRsZQotCWkgPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7Ci0JCWlmICgoR2xvQ2ZnLmZpZWxkLlR4RE1BQnVzeSA9PSAwKSAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JfXdoaWxlIChpKysgPCAxMDApOwotKi8KLX0KLQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9wcm9maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDNmNDIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Byb2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMjEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQljbW1fcHJvZmlsZS5jCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotI2RlZmluZSBFVEhfTUFDX0FERFJfU1RSX0xFTiAxNyAgLy8gaW4gZm9ybWF0IG9mIHh4Onh4Onh4Onh4Onh4Onh4Ci0KLS8vIFdlIGFzc3VtZSB0aGUgczEgaXMgYSBzdGluZywgczIgaXMgYSBtZW1vcnkgc3BhY2Ugd2l0aCA2IGJ5dGVzLiBhbmQgY29udGVudCBvZiBzMSB3aWxsIGJlIGNoYW5nZWQuCi1CT09MRUFOIHJ0c3RybWFjdG9oZXgoUFNUUklORyBzMSwgUFNUUklORyBzMikKLXsKLQlpbnQgaSA9IDA7Ci0JUFNUUklORyBwdG9rUyA9IHMxLCBwdG9rRSA9IHMxOwotCi0JaWYgKHN0cmxlbihzMSkgIT0gRVRIX01BQ19BRERSX1NUUl9MRU4pCi0JCXJldHVybiBGQUxTRTsKLQotCXdoaWxlKCgqcHRva1MpICE9ICdcMCcpCi0JewotCQlpZigocHRva0UgPSBzdHJjaHIocHRva1MsICc6JykpICE9IE5VTEwpCi0JCQkqcHRva0UrKyA9ICdcMCc7Ci0JCWlmICgoc3RybGVuKHB0b2tTKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCpwdG9rUykpIHx8ICghaXN4ZGlnaXQoKihwdG9rUysxKSkpKQotCQkJYnJlYWs7IC8vIGZhaWwKLQkJQXRvSChwdG9rUywgKFBVQ0hBUikmczJbaSsrXSwgMSk7Ci0JCXB0b2tTID0gcHRva0U7Ci0JCWlmIChpID09IDYpCi0JCQlicmVhazsgLy8gcGFyc2luZyBmaW5pc2hlZAotCX0KLQotCXJldHVybiAoIGkgPT0gNiA/IFRSVUUgOiBGQUxTRSk7Ci0KLX0KLQotCi0vLyB3ZSBhc3N1bWUgdGhlIHMxIGFuZCBzMiBib3RoIGFyZSBzdHJpbmdzLgotQk9PTEVBTiBydHN0cmNhc2VjbXAoUFNUUklORyBzMSwgUFNUUklORyBzMikKLXsKLQlQU1RSSU5HIHAxID0gczEsIHAyID0gczI7Ci0KLQlpZiAoc3RybGVuKHMxKSAhPSBzdHJsZW4oczIpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQl3aGlsZSgqcDEgIT0gJ1wwJykKLQl7Ci0JCWlmKCgqcDEgIT0gKnAyKSAmJiAoKCpwMSBeICpwMikgIT0gMHgyMCkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCXAxKys7Ci0JCXAyKys7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIHdlIGFzc3VtZSB0aGUgczEgKGJ1ZmZlcikgYW5kIHMyIChrZXkpIGJvdGggYXJlIHN0cmluZ3MuCi1QU1RSSU5HIHJ0c3Ryc3RydW5jYXNlY21wKFBTVFJJTkcgczEsIFBTVFJJTkcgczIpCi17Ci0JSU5UIGwxLCBsMiwgaTsKLQljaGFyIHRlbXAxLCB0ZW1wMjsKLQotCWwyID0gc3RybGVuKHMyKTsKLQlpZiAoIWwyKQotCQlyZXR1cm4gKGNoYXIgKikgczE7Ci0KLQlsMSA9IHN0cmxlbihzMSk7Ci0KLQl3aGlsZSAobDEgPj0gbDIpCi0JewotCQlsMS0tOwotCi0JCWZvcihpPTA7IGk8bDI7IGkrKykKLQkJewotCQkJdGVtcDEgPSAqKHMxK2kpOwotCQkJdGVtcDIgPSAqKHMyK2kpOwotCi0JCQlpZiAoKCdhJyA8PSB0ZW1wMSkgJiYgKHRlbXAxIDw9ICd6JykpCi0JCQkJdGVtcDEgPSAnQScrKHRlbXAxLSdhJyk7Ci0JCQlpZiAoKCdhJyA8PSB0ZW1wMikgJiYgKHRlbXAyIDw9ICd6JykpCi0JCQkJdGVtcDIgPSAnQScrKHRlbXAyLSdhJyk7Ci0KLQkJCWlmICh0ZW1wMSAhPSB0ZW1wMikKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChpID09IGwyKQotCQkJcmV0dXJuIChjaGFyICopIHMxOwotCi0JCXMxKys7Ci0JfQotCi0JcmV0dXJuIE5VTEw7IC8vIG5vdCBmb3VuZAotfQotCi0vL2FkZCBieSBrYXRoeQotCi0gLyoqCi0gICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZwotICAqIEBzMTogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAotICAqIEBzMjogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCi0gICovCi1QU1RSSU5HIHJ0c3Ryc3RyKFBTVFJJTkcgczEsY29uc3QgUFNUUklORyBzMikKLXsKLQlJTlQgbDEsIGwyOwotCi0JbDIgPSBzdHJsZW4oczIpOwotCWlmICghbDIpCi0JCXJldHVybiBzMTsKLQotCWwxID0gc3RybGVuKHMxKTsKLQotCXdoaWxlIChsMSA+PSBsMikKLQl7Ci0JCWwxLS07Ci0JCWlmICghbWVtY21wKHMxLHMyLGwyKSkKLQkJCXJldHVybiBzMTsKLQkJczErKzsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyoqCi0gKiByc3RydG9rIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKLSAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCi0gKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKLSAqICogV0FSTklORzogc3RydG9rIGlzIGRlcHJlY2F0ZWQsIHVzZSBzdHJzZXAgaW5zdGVhZC4gSG93ZXZlciBzdHJzZXAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvbGQgYXJjaGl0ZWN0dXJlLgotICovCi1QU1RSSU5HIF9fcnN0cnRvazsKLVBTVFJJTkcgcnN0cnRvayhQU1RSSU5HIHMsY29uc3QgUFNUUklORyBjdCkKLXsKLQlQU1RSSU5HIHNiZWdpbiwgc2VuZDsKLQotCXNiZWdpbiAgPSBzID8gcyA6IF9fcnN0cnRvazsKLQlpZiAoIXNiZWdpbikKLQl7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXNiZWdpbiArPSBzdHJzcG4oc2JlZ2luLGN0KTsKLQlpZiAoKnNiZWdpbiA9PSAnXDAnKQotCXsKLQkJX19yc3RydG9rID0gTlVMTDsKLQkJcmV0dXJuKCBOVUxMICk7Ci0JfQotCi0Jc2VuZCA9IHN0cnBicmsoIHNiZWdpbiwgY3QpOwotCWlmIChzZW5kICYmICpzZW5kICE9ICdcMCcpCi0JCSpzZW5kKysgPSAnXDAnOwotCi0JX19yc3RydG9rID0gc2VuZDsKLQotCXJldHVybiAoc2JlZ2luKTsKLX0KLQotLyoqCi0gKiBkZWxpbWl0Y250IC0gcmV0dXJuIHRoZSBjb3VudCBvZiBhIGdpdmVuIGRlbGltaXRlciBpbiBhIGdpdmVuIHN0cmluZy4KLSAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkLgotICogQGN0OiBUaGUgZGVsaW1pdGVyIHRvIHNlYXJjaCBmb3IuCi0gKiBOb3RpY2UgOiBXZSBzdXBwb3NlIHRoZSBkZWxpbWl0ZXIgaXMgYSBzaW5nbGUtY2hhciBzdHJpbmcoZm9yIGV4YW1wbGUgOiAiOyIpLgotICovCi1JTlQgZGVsaW1pdGNudChQU1RSSU5HIHMsUFNUUklORyBjdCkKLXsKLQlJTlQgY291bnQgPSAwOwotCS8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KLQlQU1RSSU5HIHRva2VuID0gczsKLQotCWZvciAoIDs7ICkKLQl7Ci0JCXRva2VuID0gc3RycGJyayh0b2tlbiwgY3QpOyAvKiBzZWFyY2ggZm9yIGRlbGltaXRlcnMgKi8KLQotICAgICAgICBpZiAoIHRva2VuID09IE5VTEwgKQotCQl7Ci0JCQkvKiBhZHZhbmNlZCB0byB0aGUgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCS8qIHNraXAgdGhlIGRlbGltaXRlciAqLwotCSAgICArK3Rva2VuOwotCi0JCS8qCi0JCSAqIFByaW50IHRoZSBmb3VuZCB0ZXh0OiB1c2UgbGVuIHdpdGggJS4qcyB0byBzcGVjaWZ5IGZpZWxkIHdpZHRoLgotCQkgKi8KLQotCQkvKiBhY2N1bXVsYXRlIGRlbGltaXRlciBjb3VudCAqLwotCSAgICArK2NvdW50OwotCX0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qCi0gICogY29udmVydHMgdGhlIEludGVybmV0IGhvc3QgYWRkcmVzcyBmcm9tIHRoZSBzdGFuZGFyZCBudW1iZXJzLWFuZC1kb3RzIG5vdGF0aW9uCi0gICogaW50byBiaW5hcnkgZGF0YS4KLSAgKiByZXR1cm5zIG5vbnplcm8gaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQsIHplcm8gaWYgbm90LgotICAqLwotaW50IHJ0aW5ldF9hdG9uKFBTVFJJTkcgY3AsIHVuc2lnbmVkIGludCAqYWRkcikKLXsKLQl1bnNpZ25lZCBpbnQJdmFsOwotCWludAkJYmFzZSwgbjsKLQlTVFJJTkcJCWM7Ci0JdW5zaWduZWQgaW50ICAgIHBhcnRzWzRdOwotCXVuc2lnbmVkIGludCAgICAqcHAgPSBwYXJ0czsKLQotCWZvciAoOzspCi0gICAgewotICAgICAgICAgLyoKLSAgICAgICAgICAqIENvbGxlY3QgbnVtYmVyIHVwIHRvIGBgLicnLgotICAgICAgICAgICogVmFsdWVzIGFyZSBzcGVjaWZpZWQgYXMgZm9yIEM6Ci0gICAgICAgICAgKgkweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCi0gICAgICAgICAgKi8KLSAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgICBiYXNlID0gMTA7Ci0gICAgICAgICBpZiAoKmNwID09ICcwJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICBpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCi0gICAgICAgICAgICAgICAgIGJhc2UgPSAxNiwgY3ArKzsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIGJhc2UgPSA4OwotICAgICAgICAgfQotICAgICAgICAgd2hpbGUgKChjID0gKmNwKSAhPSAnXDAnKQotICAgICAgICAgewotICAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgKiBiYXNlKSArIChjIC0gJzAnKTsKLSAgICAgICAgICAgICAgICAgY3ArKzsKLSAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGlmIChiYXNlID09IDE2ICYmIGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBjKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgKwotICAgICAgICAgICAgICAgICAgICAgKGMgKyAxMCAtIChpc2xvd2VyKCh1bnNpZ25lZCBjaGFyKSBjKSA/ICdhJyA6ICdBJykpOwotICAgICAgICAgICAgICAgICBjcCsrOwotICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKmNwID09ICcuJykKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAqIEludGVybmV0IGZvcm1hdDogYS5iLmMuZCBhLmIuYyAgICh3aXRoIGMgdHJlYXRlZCBhcyAxNi1iaXRzKQotICAgICAgICAgICAgICAqIGEuYiAgICAgKHdpdGggYiB0cmVhdGVkIGFzIDI0IGJpdHMpCi0gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgaWYgKHBwID49IHBhcnRzICsgMyB8fCB2YWwgPiAweGZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAqcHArKyA9IHZhbCwgY3ArKzsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgIC8qCi0gICAgICAqIENoZWNrIGZvciB0cmFpbGluZyBqdW5rLgotICAgICAgKi8KLSAgICAgd2hpbGUgKCpjcCkKLSAgICAgICAgIGlmICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmNwKyspKQotICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgIC8qCi0gICAgICAqIENvbmNvY3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2YgcGFydHMgc3BlY2lmaWVkLgotICAgICAgKi8KLSAgICAgbiA9IHBwIC0gcGFydHMgKyAxOwotICAgICBzd2l0Y2ggKG4pCi0gICAgIHsKLQotICAgICAgICAgY2FzZSAxOiAgICAgICAgIC8qIGEgLS0gMzIgYml0cyAqLwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDI6ICAgICAgICAgLyogYS5iIC0tIDguMjQgYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmZmZikKLSAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgdmFsIHw9IHBhcnRzWzBdIDw8IDI0OwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICBjYXNlIDM6ICAgICAgICAgLyogYS5iLmMgLS0gOC44LjE2IGJpdHMgKi8KLSAgICAgICAgICAgICBpZiAodmFsID4gMHhmZmZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNik7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgIGNhc2UgNDogICAgICAgICAvKiBhLmIuYy5kIC0tIDguOC44LjggYml0cyAqLwotICAgICAgICAgICAgIGlmICh2YWwgPiAweGZmKQotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB2YWwgfD0gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgIH0KLQotICAgICAqYWRkciA9IGh0b25sKHZhbCk7Ci0gICAgIHJldHVybiAxOwotCi19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBGaW5kIGtleSBzZWN0aW9uIGZvciBHZXQga2V5IHBhcmFtZXRlci4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBzdGFydCBmaW5kIHRoZSBrZXkgc2VjdGlvbgotICAgICAgICBzZWN0aW9uICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgc2VjaW9uIHRvIGJlIGZpbmQKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLSAgICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1QU1RSSU5HIFJUTVBGaW5kU2VjdGlvbigKLSAgICBJTiAgUFNUUklORyAgIGJ1ZmZlcikKLXsKLSAgICBTVFJJTkcgdGVtcF9idWZbMzJdOwotICAgIFBTVFJJTkcgIHB0cjsKLQotICAgIHN0cmNweSh0ZW1wX2J1ZiwgIkRlZmF1bHQiKTsKLQotICAgIGlmKChwdHIgPSBydHN0cnN0cihidWZmZXIsIHRlbXBfYnVmKSkgIT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAocHRyK3N0cmxlbigiXG4iKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgR2V0IGtleSBwYXJhbWV0ZXIuCi0KLSAgICBBcmd1bWVudHM6Ci0Ja2V5CQkJUG9pbnRlciB0byBrZXkgc3RyaW5nCi0JZGVzdAkJCVBvaW50ZXIgdG8gZGVzdGluYXRpb24KLQlkZXN0c2l6ZQkJVGhlIGRhdGFzaXplIG9mIHRoZSBkZXN0aW5hdGlvbgotCWJ1ZmZlcgkJUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHN0YXJ0IGZpbmQgdGhlIGtleQotCWJUcmltU3BhY2UJU2V0IHRydWUgaWYgeW91IHdhbnQgdG8gc3RyaXAgdGhlIHNwYWNlIGNoYXJhY3RlciBvZiB0aGUgcmVzdWx0IHBhdHRlcm4KLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MKLSAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgIEZhaWwKLQotICAgIE5vdGU6Ci0JVGhpcyByb3V0aW5lIGdldCB0aGUgdmFsdWUgd2l0aCB0aGUgbWF0Y2hlZCBrZXkgKGNhc2UgY2FzZS1zZW5zaXRpdmUpCi0JRm9yIFNTSUQgYW5kIHNlY3VyaXR5IGtleSByZWxhdGVkIHBhcmFtZXRlcnMsIHdlIFNIQUxMIE5PVCB0cmltIHRoZSBzcGFjZSgnICcpIGNoYXJhY3Rlci4KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRNUEdldEtleVBhcmFtZXRlcigKLSAgICBJTiBQU1RSSU5HIGtleSwKLSAgICBPVVQgUFNUUklORyBkZXN0LAotICAgIElOIElOVCBkZXN0c2l6ZSwKLSAgICBJTiBQU1RSSU5HIGJ1ZmZlciwKLSAgICBJTiBCT09MRUFOIGJUcmltU3BhY2UpCi17Ci0JUFNUUklORyBwTWVtQnVmLCB0ZW1wX2J1ZjEgPSBOVUxMLCB0ZW1wX2J1ZjIgPSBOVUxMOwotCVBTVFJJTkcgc3RhcnRfcHRyLCBlbmRfcHRyOwotCVBTVFJJTkcgcHRyOwotCVBTVFJJTkcgb2Zmc2V0ID0gTlVMTDsKLQlJTlQgIGxlbiwga2V5TGVuOwotCi0KLQlrZXlMZW4gPSBzdHJsZW4oa2V5KTsKLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZwTWVtQnVmLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUgICogMik7Ci0JaWYgKHBNZW1CdWYgPT0gTlVMTCkKLQkJcmV0dXJuIChGQUxTRSk7Ci0KLQltZW1zZXQocE1lbUJ1ZiwgMCwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFICogMik7Ci0JdGVtcF9idWYxID0gcE1lbUJ1ZjsKLQl0ZW1wX2J1ZjIgPSAoUFNUUklORykocE1lbUJ1ZiArIE1BWF9QQVJBTV9CVUZGRVJfU0laRSk7Ci0KLQotCS8vZmluZCBzZWN0aW9uCi0JaWYoKG9mZnNldCA9IFJUTVBGaW5kU2VjdGlvbihidWZmZXIpKSA9PSBOVUxMKQotCXsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUilwTWVtQnVmKTsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0Jc3RyY3B5KHRlbXBfYnVmMSwgIlxuIik7Ci0Jc3RyY2F0KHRlbXBfYnVmMSwga2V5KTsKLQlzdHJjYXQodGVtcF9idWYxLCAiPSIpOwotCi0JLy9zZWFyY2gga2V5Ci0JaWYoKHN0YXJ0X3B0cj1ydHN0cnN0cihvZmZzZXQsIHRlbXBfYnVmMSkpID09IE5VTEwpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXBNZW1CdWYpOwotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlzdGFydF9wdHIgKz0gc3RybGVuKCJcbiIpOwotCWlmKChlbmRfcHRyID0gcnRzdHJzdHIoc3RhcnRfcHRyLCAiXG4iKSk9PU5VTEwpCi0JCWVuZF9wdHIgPSBzdGFydF9wdHIrc3RybGVuKHN0YXJ0X3B0cik7Ci0KLQlpZiAoZW5kX3B0cjxzdGFydF9wdHIpCi0JewotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXBNZW1CdWYpOwotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0ciwgZW5kX3B0ci1zdGFydF9wdHIpOwotCXRlbXBfYnVmMltlbmRfcHRyLXN0YXJ0X3B0cl09J1wwJzsKLQlpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMiwgIj0iKSkgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpcE1lbUJ1Zik7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlwdHIgPSAoc3RhcnRfcHRyICsxKTsKLQkvL3RyaW0gc3BlY2lhbCBjaGFyYWN0ZXJzLCBpLmUuLCAgVEFCIG9yIHNwYWNlCi0Jd2hpbGUoKnN0YXJ0X3B0ciAhPSAweDAwKQotCXsKLQkJaWYoICgoKnB0ciA9PSAnICcpICYmIGJUcmltU3BhY2UpIHx8ICgqcHRyID09ICdcdCcpICkKLQkJCXB0cisrOwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0JbGVuID0gc3RybGVuKHN0YXJ0X3B0cik7Ci0KLQltZW1zZXQoZGVzdCwgMHgwMCwgZGVzdHNpemUpOwotCXN0cm5jcHkoZGVzdCwgcHRyLCAoKGxlbiA+PSBkZXN0c2l6ZSkgPyBkZXN0c2l6ZTogbGVuKSk7Ci0KLQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXBNZW1CdWYpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIEdldCBtdWx0aXBsZSBrZXkgcGFyYW1ldGVyLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBrZXkgc3RyaW5nCi0gICAgICAgIGRlc3QgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGRlc3RpbmF0aW9uCi0gICAgICAgIGRlc3RzaXplICAgICAgICAgICAgICAgICAgICBUaGUgZGF0YXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gc3RhcnQgZmluZCB0aGUga2V5Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzCi0gICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICBGYWlsCi0KLSAgICBOb3RlOgotICAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSB2YWx1ZSB3aXRoIHRoZSBtYXRjaGVkIGtleSAoY2FzZSBjYXNlLXNlbnNpdGl2ZSkKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgUlRNUEdldEtleVBhcmFtZXRlcldpdGhPZmZzZXQoCi0gICAgSU4gIFBTVFJJTkcgICBrZXksCi0gICAgT1VUIFBTVFJJTkcgICBkZXN0LAotICAgIE9VVAlVU0hPUlQJKmVuZF9vZmZzZXQsCi0gICAgSU4gIElOVCAgICAgZGVzdHNpemUsCi0gICAgSU4gIFBTVFJJTkcgICBidWZmZXIsCi0gICAgSU4JQk9PTEVBTgliVHJpbVNwYWNlKQotewotICAgIFBTVFJJTkcgdGVtcF9idWYxID0gTlVMTDsKLSAgICBQU1RSSU5HIHRlbXBfYnVmMiA9IE5VTEw7Ci0gICAgUFNUUklORyBzdGFydF9wdHI7Ci0gICAgUFNUUklORyBlbmRfcHRyOwotICAgIFBTVFJJTkcgcHRyOwotICAgIFBTVFJJTkcgb2Zmc2V0ID0gMDsKLSAgICBJTlQgIGxlbjsKLQotCWlmICgqZW5kX29mZnNldCA+PSBNQVhfSU5JX0JVRkZFUl9TSVpFKQotCQlyZXR1cm4gKEZBTFNFKTsKLQotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJnRlbXBfYnVmMSwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQotCWlmKHRlbXBfYnVmMSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gKEZBTFNFKTsKLQotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJnRlbXBfYnVmMiwgTUFYX1BBUkFNX0JVRkZFUl9TSVpFKTsKLQlpZih0ZW1wX2J1ZjIgPT0gTlVMTCkKLQl7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYxKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0gICAgLy9maW5kIHNlY3Rpb24KLQlpZigqZW5kX29mZnNldCA9PSAwKQotICAgIHsKLQkJaWYgKChvZmZzZXQgPSBSVE1QRmluZFNlY3Rpb24oYnVmZmVyKSkgPT0gTlVMTCkKLQkJewotCQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotCQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMik7Ci0JICAgIHJldHVybiAoRkFMU0UpOwotCQl9Ci0gICAgfQotCWVsc2UKLQkJb2Zmc2V0ID0gYnVmZmVyICsgKCplbmRfb2Zmc2V0KTsKLQotICAgIHN0cmNweSh0ZW1wX2J1ZjEsICJcbiIpOwotICAgIHN0cmNhdCh0ZW1wX2J1ZjEsIGtleSk7Ci0gICAgc3RyY2F0KHRlbXBfYnVmMSwgIj0iKTsKLQotICAgIC8vc2VhcmNoIGtleQotICAgIGlmKChzdGFydF9wdHI9cnRzdHJzdHIob2Zmc2V0LCB0ZW1wX2J1ZjEpKT09TlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYxKTsKLQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0YXJ0X3B0cis9c3RybGVuKCJcbiIpOwotICAgIGlmKChlbmRfcHRyPXJ0c3Ryc3RyKHN0YXJ0X3B0ciwgIlxuIikpPT1OVUxMKQotICAgICAgIGVuZF9wdHI9c3RhcnRfcHRyK3N0cmxlbihzdGFydF9wdHIpOwotCi0gICAgaWYgKGVuZF9wdHI8c3RhcnRfcHRyKQotICAgIHsKLQkJb3NfZnJlZV9tZW0oTlVMTCwgKFBVQ0hBUil0ZW1wX2J1ZjEpOwotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYyKTsKLSAgICAgICAgcmV0dXJuIChGQUxTRSk7Ci0gICAgfQotCi0JKmVuZF9vZmZzZXQgPSBlbmRfcHRyIC0gYnVmZmVyOwotCi0gICAgTmRpc01vdmVNZW1vcnkodGVtcF9idWYyLCBzdGFydF9wdHIsIGVuZF9wdHItc3RhcnRfcHRyKTsKLSAgICB0ZW1wX2J1ZjJbZW5kX3B0ci1zdGFydF9wdHJdPSdcMCc7Ci0gICAgbGVuID0gc3RybGVuKHRlbXBfYnVmMik7Ci0gICAgc3RyY3B5KHRlbXBfYnVmMSwgdGVtcF9idWYyKTsKLSAgICBpZigoc3RhcnRfcHRyPXJ0c3Ryc3RyKHRlbXBfYnVmMSwgIj0iKSkgPT0gTlVMTCkKLSAgICB7Ci0JCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYxKTsKLQlvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMik7Ci0gICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHN0cmNweSh0ZW1wX2J1ZjIsIHN0YXJ0X3B0cisxKTsKLSAgICBwdHIgPSB0ZW1wX2J1ZjI7Ci0gICAgLy90cmltIHNwYWNlIG9yIHRhYgotICAgIHdoaWxlKCpwdHIgIT0gMHgwMCkKLSAgICB7Ci0gICAgICAgIGlmKChiVHJpbVNwYWNlICYmICgqcHRyID09ICcgJykpIHx8ICgqcHRyID09ICdcdCcpICkKLSAgICAgICAgICAgIHB0cisrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGxlbiA9IHN0cmxlbihwdHIpOwotICAgIG1lbXNldChkZXN0LCAweDAwLCBkZXN0c2l6ZSk7Ci0gICAgc3RybmNweShkZXN0LCBwdHIsIGxlbiA+PSBkZXN0c2l6ZSA/ICBkZXN0c2l6ZTogbGVuKTsKLQotCW9zX2ZyZWVfbWVtKE5VTEwsIChQVUNIQVIpdGVtcF9idWYxKTsKLSAgICBvc19mcmVlX21lbShOVUxMLCAoUFVDSEFSKXRlbXBfYnVmMik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotc3RhdGljIGludCBydG1wX3BhcnNlX2tleV9idWZmZXJfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCxJTiAgUFNUUklORyBidWZmZXIsSU4gIFVMT05HIEtleVR5cGUsSU4gIElOVCBCU1NJZHgsSU4gIElOVCBLZXlJZHgpCi17Ci0JUFNUUklORwkJa2V5YnVmZjsKLQkvL0lOVAkJCWkgPSBCU1NJZHgsIGlkeCA9IEtleUlkeCwgcmV0VmFsOwotCVVMT05HCQlLZXlMZW47Ci0JLy9VQ0hBUgkJQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCUNJUEhFUl9LRVkJKnBTaGFyZWRLZXk7Ci0KLQlrZXlidWZmID0gYnVmZmVyOwotCUtleUxlbiA9IHN0cmxlbihrZXlidWZmKTsKLQlwU2hhcmVkS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTU0lkeF1bS2V5SWR4XTsKLQotCWlmKCgoS2V5VHlwZSAhPSAwKSAmJiAoS2V5VHlwZSAhPSAxKSkgfHwKLQkgICAgKChLZXlUeXBlID09IDApICYmIChLZXlMZW4gIT0gMTApICYmIChLZXlMZW4gIT0gMjYpKSB8fAotCSAgICAoKEtleVR5cGU9PSAxKSAmJiAoS2V5TGVuICE9IDUpICYmIChLZXlMZW4gIT0gMTMpKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIktleSVkU3RyIGlzIEludmFsaWQga2V5IGxlbmd0aCglbGQpIG9yIFR5cGUoJWxkKVxuIiwKLQkJCQkJCQkJS2V5SWR4KzEsIEtleUxlbiwgS2V5VHlwZSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBSVF9DZmdTZXRXZXBLZXkocEFkLCBidWZmZXIsIHBTaGFyZWRLZXksIEtleUlkeCk7Ci0JfQotCi19Ci0KLQotc3RhdGljIHZvaWQgcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUoSU4gIFBSVE1QX0FEQVBURVIgcEFkLCBQU1RSSU5HIHRtcGJ1ZiwgUFNUUklORyBidWZmZXIpCi17Ci0JU1RSSU5HCQl0b2tfc3RyWzE2XTsKLQlQU1RSSU5HCQltYWNwdHI7Ci0JSU5UCQkJaSA9IDAsIGlkeDsKLQlVTE9ORwkJS2V5VHlwZVtNQVhfTUJTU0lEX05VTV07Ci0JVUxPTkcJCUtleUlkeDsKLQotCU5kaXNaZXJvTWVtb3J5KEtleVR5cGUsIHNpemVvZihLZXlUeXBlKSk7Ci0KLQkvL0RlZmF1bHRLZXlJRAotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkRlZmF1bHRLZXlJRCIsIHRtcGJ1ZiwgMjUsIGJ1ZmZlciwgVFJVRSkpCi0JewotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCUtleUlkeCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEpOwotCQkJZWxzZQotCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IDA7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJRCgwfjMpPSVkXG4iLCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCi0JZm9yIChpZHggPSAwOyBpZHggPCA0OyBpZHgrKykKLQl7Ci0JCXNwcmludGYodG9rX3N0ciwgIktleSVkVHlwZSIsIGlkeCArIDEpOwotCQkvL0tleTFUeXBlCi0JCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIsIFRSVUUpKQotCQl7Ci0JCSAgICBmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCSAgICB7Ci0JCQkJLyoKLQkJCQkJZG8gc2FuaXR5IGNoZWNrIGZvciBLZXlUeXBlIGxlbmd0aDsKLQkJCQkJb3IgaW4gc3RhdGlvbiBtb2RlLCB0aGUgS2V5VHlwZSBsZW5ndGggPiAxLAotCQkJCQl0aGUgY29kZSB3aWxsIG92ZXJ3cml0ZSB0aGUgc3RhY2sgb2YgY2FsbGVyCi0JCQkJCShSVE1QU2V0UHJvZmlsZVBhcmFtZXRlcnMpIGFuZCBjYXVzZSBzcmNidWYgPSBOVUxMCi0JCQkJKi8KLQkJCQlpZiAoaSA8IE1BWF9NQlNTSURfTlVNKQotCQkJCQlLZXlUeXBlW2ldID0gc2ltcGxlX3N0cnRvbChtYWNwdHIsIDAsIDEwKTsKLQkJICAgIH0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXsKLQkJCQlzcHJpbnRmKHRva19zdHIsICJLZXklZFN0ciIsIGlkeCArIDEpOwotCQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKHRva19zdHIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIsIEZBTFNFKSkKLQkJCQl7Ci0JCQkJCXJ0bXBfcGFyc2Vfa2V5X2J1ZmZlcl9mcm9tX2ZpbGUocEFkLCB0bXBidWYsIEtleVR5cGVbQlNTMF0sIEJTUzAsIGlkeCk7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQl9Ci0JfQotfQotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotc3RhdGljIHZvaWQgcnRtcF9yZWFkX3N0YV93bW1fcGFybXNfZnJvbV9maWxlKElOICBQUlRNUF9BREFQVEVSIHBBZCwgY2hhciAqdG1wYnVmLCBjaGFyICpidWZmZXIpCi17Ci0JUFNUUklORwkJCQkJbWFjcHRyOwotCUlOVAkJCQkJCWk9MDsKLQlCT09MRUFOCQkJCQliV21tRW5hYmxlID0gRkFMU0U7Ci0KLQkvL1dtbUNhcGFibGUKLQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXbW1DYXBhYmxlIiwgdG1wYnVmLCAzMiwgYnVmZmVyLCBUUlVFKSkKLQl7Ci0JCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgLy9FbmFibGUKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBUUlVFOwotCQkJYldtbUVuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJZWxzZSAvL0Rpc2FibGUKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPSBGQUxTRTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldtbUNhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7Ci0JfQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JLy9ETFNDYXBhYmxlCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRExTQ2FwYWJsZSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlciwgVFJVRSkpCi0JewotCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSA9IFRSVUU7Ci0JCX0KLQkJZWxzZSAvL0Rpc2FibGUKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUgPSBGQUxTRTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImJETFNDYXBhYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOwotCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCS8vQWNrUG9saWN5IGZvciBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTwotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkFja1BvbGljeSIsIHRtcGJ1ZiwgMzIsIGJ1ZmZlciwgVFJVRSkpCi0JewotCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtpXSA9IChVQ0hBUilzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBY2tQb2xpY3lbJWRdPSVkXG4iLCBpLCBwQWQtPkNvbW1vbkNmZy5BY2tQb2xpY3lbaV0pKTsKLQkJfQotCX0KLQotCWlmIChiV21tRW5hYmxlKQotCXsKLQkJLy9BUFNEQ2FwYWJsZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBUFNEQ2FwYWJsZSIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gVFJVRTsKLQkJCWVsc2UKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSBGQUxTRTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVBTRENhcGFibGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSkpOwotCQl9Ci0KLQkJLy9NYXhTUExlbmd0aAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJNYXhTUExlbmd0aCIsIHRtcGJ1ZiwgMTAsIGJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWF4U1BMZW5ndGg9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoKSk7Ci0JCX0KLQotCQkvL0FQU0RBQyBmb3IgQUNfQkUsIEFDX0JLLCBBQ19WSSwgQUNfVk8KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQVBTREFDIiwgdG1wYnVmLCAzMiwgYnVmZmVyLCBUUlVFKSkKLQkJewotCQkJQk9PTEVBTiBhcHNkX2FjWzRdOwotCi0JCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCQl7Ci0JCQkJYXBzZF9hY1tpXSA9IChCT09MRUFOKXNpbXBsZV9zdHJ0b2wobWFjcHRyLCAwLCAxMCk7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBUFNEQUMlZCAgJWRcbiIsIGksICBhcHNkX2FjW2ldKSk7Ci0JCQl9Ci0KLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSBhcHNkX2FjWzBdOwotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19CSyA9IGFwc2RfYWNbMV07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJID0gYXBzZF9hY1syXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSBhcHNkX2FjWzNdOwotCi0JCQlwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyWzBdID0gYXBzZF9hY1swXTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbMV0gPSBhcHNkX2FjWzFdOwotCQkJcEFkLT5Db21tb25DZmcuYkFDTUFQU0RUclsyXSA9IGFwc2RfYWNbMl07Ci0JCQlwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyWzNdID0gYXBzZF9hY1szXTsKLQkJfQotCX0KLQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLXN0YXRpYyB2b2lkIEhUUGFyYW1ldGVyc0hvb2soCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFNUUklORwkJICBwVmFsdWVTdHIsCi0JSU4JUFNUUklORwkJICBwSW5wdXQpCi17Ci0KLQlsb25nIFZhbHVlOwotCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1BST1RFQ1QiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkhUUHJvdGVjdCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFByb3RlY3Rpb24gID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9NSU1PUFNFbmFibGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotICAgIHsKLSAgICAgICAgVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotICAgICAgICBpZiAoVmFsdWUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYk1JTU9QU0VuYWJsZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1JTU9QU0VuYWJsZSAgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0gICAgfQotCi0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUlNT1BTTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA+IE1NUFNfRU5BQkxFKQotICAgICAgICB7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVE9ETzogYWRkIG1pbW8gcG93ZXIgc2F2aW5nIG1lY2hhbmlzbQotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlID0gTU1QU19FTkFCTEU7Ci0JCQkvL3BBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNSU1PUFMgTW9kZSAgPSAlZFxuIiwgKElOVCkgVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQkFEZWNsaW5lIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJCQURlY2xpbmUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBEZWNsaW5lICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9EaXNhYmxlUmVvcmRlcmluZyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0gICAgewotICAgICAgICBWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0gICAgICAgIGlmIChWYWx1ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IERpc2FibGVSZW9yZGVyaW5nICA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfQXV0b0JBIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLSAgICB7Ci0gICAgICAgIFZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLSAgICAgICAgaWYgKFZhbHVlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBCQV9OT1RVU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gVFJVRTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLSAgICAgICAgfQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuQXV0b0JBID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEF1dG8gQkEgID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlIikpOwotICAgIH0KLQotCS8vIFR4XytIVEMgZnJhbWUKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfSFRDIiwgcFZhbHVlU3RyLCAyNSwgcElucHV0LCBUUlVFKSkKLQl7Ci0JCVZhbHVlID0gc2ltcGxlX3N0cnRvbChwVmFsdWVTdHIsIDAsIDEwKTsKLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkhUQ0VuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4ICtIVEMgZnJhbWUgPSAlc1xuIiwgKFZhbHVlPT0wKSA/ICJEaXNhYmxlIiA6ICJFbmFibGUiKSk7Ci0JfQotCi0JLy8gRW5hYmxlIEhUIExpbmsgQWRhcHRhdGlvbiBDb250cm9sCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0xpbmtBZGFwdCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPmJMaW5rQWRhcHQgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+SFRDRW5hYmxlID0gVFJVRTsKLQkJCXBBZC0+YkxpbmtBZGFwdCA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IExpbmsgQWRhcHRhdGlvbiBDb250cm9sID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiRGlzYWJsZSIgOiAiRW5hYmxlKCtIVEMpIikpOwotCX0KLQotCS8vIFJldmVyc2UgRGlyZWN0aW9uIE1lY2hhbmlzbQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9SREciLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYlJkZyA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5IVENFbmFibGUgPSBUUlVFOwotICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlJkZyA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFJERyA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSgrSFRDKSIpKTsKLQl9Ci0KLQotCi0KLQkvLyBUeCBBLU1TVUQgPwotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9BTVNEVSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVFbmFibGUgPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLSAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZSA9IFRSVUU7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IEEtTVNEVSA9ICVzXG4iLCAoVmFsdWU9PTApID8gIkRpc2FibGUiIDogIkVuYWJsZSIpKTsKLQl9Ci0KLQkvLyBNUERVIERlbnNpdHkKLSAgICBpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTXBkdURlbnNpdHkiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPD03ICYmIFZhbHVlID49IDApCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IFZhbHVlOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1QRFUgRGVuc2l0eSA9ICVkXG4iLCAoSU5UKSBWYWx1ZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5ID0gNDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNUERVIERlbnNpdHkgPSAlZCAoRGVmYXVsdClcbiIsIDQpKTsKLQkJfQotCX0KLQotCS8vIE1heCBSeCBCQSBXaW5kb3cgU2l6ZQotICAgIGlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CQVdpblNpemUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0JCWlmIChWYWx1ZSA+PTEgJiYgVmFsdWUgPD0gNjQpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSBWYWx1ZTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBCQSBXaW5kdyBTaXplID0gJWRcbiIsIChJTlQpIFZhbHVlKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQkEgV2luZHcgU2l6ZSA9IDY0IChEZWZ1YWx0KVxuIikpOwotCQl9Ci0KLQl9Ci0KLQkvLyBHdWFyZCBJbnRlcnZhbAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9HSSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IEdJXzQwMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlNob3J0R0kgPSBHSV80MDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBHdWFyZCBJbnRlcnZhbCA9ICVzXG4iLCAoVmFsdWU9PUdJXzQwMCkgPyAiNDAwIiA6ICI4MDAiICkpOwotCX0KLQotCS8vIEhUIE9wZXJhdGlvbiBNb2RlIDogTWl4ZWQgTW9kZSAsIEdyZWVuIEZpZWxkCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX09wTW9kZSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IEhUTU9ERV9HRikKLQkJewotCi0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuSFRNT0RFICA9IEhUTU9ERV9HRjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1PREUgID0gSFRNT0RFX01NOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE9wZXJhdGUgTW9kZSA9ICVzXG4iLCAoVmFsdWU9PUhUTU9ERV9HRikgPyAiR3JlZW4gRmllbGQiIDogIk1peGVkIE1vZGUiICkpOwotCX0KLQotCS8vIEZpeGVkIFR4IG1vZGUgOiBDQ0ssIE9GRE0KLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiRml4ZWRUeE1vZGUiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVUNIQVIJZml4X3R4X21vZGU7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7Ci0KLQkJCWlmIChzdHJjbXAocFZhbHVlU3RyLCAiT0ZETSIpID09IDAgfHwgc3RyY21wKHBWYWx1ZVN0ciwgIm9mZG0iKSA9PSAwKQotCQkJewotCQkJCWZpeF90eF9tb2RlID0gRklYRURfVFhNT0RFX09GRE07Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiQ0NLIikgPT0gMCB8fCBzdHJjbXAocFZhbHVlU3RyLCAiY2NrIikgPT0gMCkKLQkJCXsKLQkJICAgICAgICBmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9DQ0s7Ci0JCQl9Ci0JCQllbHNlIGlmIChzdHJjbXAocFZhbHVlU3RyLCAiSFQiKSA9PSAwIHx8IHN0cmNtcChwVmFsdWVTdHIsICJodCIpID09IDApCi0JCQl7Ci0JCSAgICAgICAgZml4X3R4X21vZGUgPSBGSVhFRF9UWE1PREVfSFQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQkJCS8vIDEgOiBDQ0sKLQkJCQkvLyAyIDogT0ZETQotCQkJCS8vIG90aGVyd2lzZSA6IEhUCi0JCQkJaWYgKFZhbHVlID09IEZJWEVEX1RYTU9ERV9DQ0sgfHwgVmFsdWUgPT0gRklYRURfVFhNT0RFX09GRE0pCi0JCQkJCWZpeF90eF9tb2RlID0gVmFsdWU7Ci0JCQkJZWxzZQotCQkJCQlmaXhfdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQkJfQotCi0JCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlID0gZml4X3R4X21vZGU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaXhlZCBUeCBNb2RlID0gJWRcbiIsIGZpeF90eF9tb2RlKSk7Ci0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCi0JLy8gQ2hhbm5lbCBXaWR0aAotCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJIVF9CVyIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IEJXXzQwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfNDA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgID0gQldfMjA7Ci0JCX0KLQotI2lmZGVmIE1DQVNUX1JBVEVfU1BFQ0lGSUMKLQkJcEFkLT5Db21tb25DZmcuTUNhc3RQaHlNb2RlLmZpZWxkLkJXID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXOwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAoVmFsdWU9PUJXXzQwKSA/ICI0MCBNSHoiIDogIjIwIE1IeiIgKSk7Ci0JfQotCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0VYVENIQSIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IDApCi0JCXsKLQotCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSAgPSBFWFRDSEFfQkVMT1c7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRVhUQ0hBX0FCT1ZFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IEV4dCBDaGFubmVsID0gJXNcbiIsIChWYWx1ZT09MCkgPyAiQkVMT1ciIDogIkFCT1ZFIiApKTsKLQl9Ci0KLQkvLyBNU0MKLQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfTUNTIiwgcFZhbHVlU3RyLCA1MCwgcElucHV0LCBUUlVFKSkKLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCi0vLwkJCWlmICgoVmFsdWUgPj0gMCAmJiBWYWx1ZSA8PSAxNSkgfHwgKFZhbHVlID09IDMyKSkKLQkJCWlmICgoVmFsdWUgPj0gMCAmJiBWYWx1ZSA8PSAyMykgfHwgKFZhbHVlID09IDMyKSkgLy8gMyozCi0JCXsKLQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBWYWx1ZTsKLQkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBNQ1MgPSAlZFxuIiwgcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAgPSBNQ1NfQVVUTzsKLQkJCQlwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IE1DUyA9IEFVVE9cbiIpKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvLyBTVEJDCi0gICAgaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX1NUQkMiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gU1RCQ19VU0UpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDID0gU1RCQ19VU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogU1RCQyA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuU1RCQykpOwotCX0KLQotCS8vIDQwX01oel9JbnRvbGVyYW50Ci0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUXzQwTUhaX0lOVE9MRVJBTlQiLCBwVmFsdWVTdHIsIDI1LCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJVmFsdWUgPSBzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApOwotCQlpZiAoVmFsdWUgPT0gMCkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYkZvcnR5X01oel9JbnRvbGVyYW50ID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iRm9ydHlfTWh6X0ludG9sZXJhbnQgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiA0ME1IWiBJTlRPTEVSQU5UID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJGb3J0eV9NaHpfSW50b2xlcmFudCkpOwotCX0KLQkvL0hUX1R4U3RyZWFtCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfVHhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQotCQl7Ci0JCQljYXNlIDE6Ci0JCQkJcEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzogLy8gMyozCi0JCQlkZWZhdWx0OgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gMzsKLQotCQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKQotCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDI7IC8vIG9ubHkgMiB0eCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCi0JCQkJYnJlYWs7Ci0JCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSFQ6IFR4IFN0cmVhbSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSkpOwotCX0KLQkvL0hUX1J4U3RyZWFtCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiSFRfUnhTdHJlYW0iLCBwVmFsdWVTdHIsIDEwLCBwSW5wdXQsIFRSVUUpKQotCXsKLQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHBWYWx1ZVN0ciwgMCwgMTApKQotCQl7Ci0JCQljYXNlIDE6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCWRlZmF1bHQ6Ci0JCQkJcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAzOwotCi0JCQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18yODgzX1ZFUlNJT04pCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gMjsgLy8gb25seSAyIHJ4IHN0cmVhbXMgZm9yIFJUMjg2MCBzZXJpZXMKLQkJCQlicmVhazsKLQkJfQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJIVDogUnggU3RyZWFtID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtKSk7Ci0JfQotCS8vMjAwOC8xMS8wNTogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVA8LS0KLQkvL0dyZWVuIEFQCi0JaWYoUlRNUEdldEtleVBhcmFtZXRlcigiR3JlZW5BUCIsIHBWYWx1ZVN0ciwgMTAsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0JCWlmIChWYWx1ZSA9PSAwKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iR3JlZW5BUEVuYWJsZSA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuYkdyZWVuQVBFbmFibGUgPSBUUlVFOwotCQl9Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBHcmVlbiBBUD0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJHcmVlbkFQRW5hYmxlKSk7Ci0JfQotCi0JLy8gSFRfRGlzYWxsb3dUS0lQCi0JaWYgKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkhUX0Rpc2FsbG93VEtJUCIsIHBWYWx1ZVN0ciwgMjUsIHBJbnB1dCwgVFJVRSkpCi0JewotCQlWYWx1ZSA9IHNpbXBsZV9zdHJ0b2wocFZhbHVlU3RyLCAwLCAxMCk7Ci0KLQkJaWYgKFZhbHVlID09IDEpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9IFRSVUU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5IVF9EaXNhbGxvd1RLSVAgPSBGQUxTRTsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkhUOiBEaXNhbGxvdyBUS0lQIG1vZGUgPSAlc1xuIiwgKHBBZC0+Q29tbW9uQ2ZnLkhUX0Rpc2FsbG93VEtJUCA9PSBUUlVFKSA/ICJPTiIgOiAiT0ZGIiApKTsKLQl9Ci0KLQotCS8vMjAwOC8xMS8wNTpLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUC0tPgotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLU5ESVNfU1RBVFVTCVJUTVBTZXRQcm9maWxlUGFyYW1ldGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQU1RSSU5HCXBCdWZmZXIpCi17Ci0JUFNUUklORwkJCQkJdG1wYnVmOwotCVVMT05HCQkJCQlSdHNUaHJlc2g7Ci0JVUxPTkcJCQkJCUZyYWdUaHJlc2g7Ci0JUFNUUklORwkJCQkJbWFjcHRyOwotCUlOVAkJCQkJCWkgPSAwLCByZXR2YWw7Ci0JdG1wYnVmID0ga21hbGxvYyhNQVhfUEFSQU1fQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZih0bXBidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQlkbwotCXsKLQkJLy8gc2V0IGZpbGUgcGFyYW1ldGVyIHRvIHBvcnRjZmcKLQkJLy9Db3VudHJ5UmVnaW9uCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb24iLCB0bXBidWYsIDI1LCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcmV0dmFsID0gUlRfQ2ZnU2V0Q291bnRyeVJlZ2lvbihwQWQsIHRtcGJ1ZiwgQkFORF8yNEcpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ291bnRyeVJlZ2lvbj0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbikpOwotCQl9Ci0JCS8vQ291bnRyeVJlZ2lvbkFCYW5kCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNvdW50cnlSZWdpb25BQmFuZCIsIHRtcGJ1ZiwgMjUsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlyZXR2YWwgPSBSVF9DZmdTZXRDb3VudHJ5UmVnaW9uKHBBZCwgdG1wYnVmLCBCQU5EXzVHKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlSZWdpb25BQmFuZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kKSk7Ci0JCX0KLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLSNpZmRlZiBSVDMweHgKLQkJLy9FZnVzZUJ1ZmZlck1vZGUKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRWZ1c2VCdWZmZXJNb2RlIiwgdG1wYnVmLCAyNSwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXBBZC0+YkVFUFJPTUZpbGUgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJFZnVzZUJ1ZmZlck1vZGU9JWRcbiIsIHBBZC0+YlVzZUVmdXNlKSk7Ci0JCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLQkJLy9Db3VudHJ5Q29kZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDb3VudHJ5Q29kZSIsIHRtcGJ1ZiwgMjUsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgdG1wYnVmICwgMik7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5TdGFPcmlDb3VudHJ5Q29kZSwgdG1wYnVmICwgMik7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJaWYgKHN0cmxlbigoUFNUUklORykgcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGUpICE9IDApCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuYkNvdW50cnlGbGFnID0gVFJVRTsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNvdW50cnlDb2RlPSVzXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSkpOwotCQl9Ci0JCS8vQ2hhbm5lbEdlb2dyYXBoeQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDaGFubmVsR2VvZ3JhcGh5IiwgdG1wYnVmLCAyNSwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCVVDSEFSIEdlb2dyYXBoeSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmIChHZW9ncmFwaHkgPD0gQk9USCkKLQkJCXsKLQkJCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBHZW9ncmFwaHk7Ci0JCQkJcEFkLT5Db21tb25DZmcuQ291bnRyeUNvZGVbMl0gPQotCQkJCQkocEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID09IEJPVEgpID8gJyAnIDogKChwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPT0gSURPUikgPyAnSScgOiAnTycpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJCQlwQWQtPlN0YUNmZy5TdGFPcmlHZW9ncmFwaHkgPSBwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHk7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWxHZW9ncmFwaHk9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuR2VvZ3JhcGh5ID0gQk9USDsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlWzJdID0gJyAnOwotCQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQkvL1NTSUQKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJTU0lEIiwgdG1wYnVmLCAyNTYsIHBCdWZmZXIsIEZBTFNFKSkKLQkJCXsKLQkJCQlpZiAoc3RybGVuKHRtcGJ1ZikgPD0gMzIpCi0JCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuU3NpZExlbiA9IChVQ0hBUikgc3RybGVuKHRtcGJ1Zik7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIE5ESVNfODAyXzExX0xFTkdUSF9TU0lEKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgdG1wYnVmLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuKTsKLQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuID0gcEFkLT5Db21tb25DZmcuU3NpZExlbjsKLQkJCQkJTmRpc1plcm9NZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgdG1wYnVmLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOwotCQkJCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBORElTXzgwMl8xMV9MRU5HVEhfU1NJRCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCB0bXBidWYsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihTU0lEPSVzKVxuIiwgX19GVU5DVElPTl9fLCB0bXBidWYpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQkvL05ldHdvcmtUeXBlCi0JCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiTmV0d29ya1R5cGUiLCB0bXBidWYsIDI1LCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlwQWQtPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKLQkJCQlpZiAoc3RyY21wKHRtcGJ1ZiwgIkFkaG9jIikgPT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuQnNzVHlwZSA9IEJTU19BREhPQzsKLQkJCQllbHNlIC8vRGVmYXVsdCBJbmZyYXN0cnVjdHVyZSBtb2RlCi0JCQkJCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0JCQkJLy8gUmVzZXQgUmFsaW5rIHN1cHBsaWNhbnQgdG8gbm90IHVzZSwgaXQgd2lsbCBiZSBzZXQgdG8gc3RhcnQgd2hlbiBVSSBzZXQgUE1LIGtleQotCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooTmV0d29ya1R5cGU9JWQpXG4iLCBfX0ZVTkNUSU9OX18sIHBBZC0+U3RhQ2ZnLkJzc1R5cGUpKTsKLQkJCX0KLQkJfQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkvL05ld1BDSWVQUwotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJOZXdQQ0llUFMiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJVUNIQVIgdGVtcF9idWZmZXIgPSAoVUNIQVIpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlpZih0ZW1wX2J1ZmZlcj4wKQotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUz1UUlVFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTPUZBTFNFOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTmV3UENJZVBTPSVkXG4iLCBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMpKTsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2lmZGVmIFJUMzA5MAotCQkvL1BDSWVQb3dlckxldmVsCi0KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiUENJZVBvd2VyTGV2ZWwiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBDSWVQb3dlckxldmVsPSVkXG4iLCBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlKSk7Ci0JCX0KLQkJLy9Gb2xsb3dIb3N0QVNQTQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJGb2xsb3dIb3N0QVNQTSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlVQ0hBUiB0ZW1wX2J1ZmZlciA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJaWYodGVtcF9idWZmZXI+MCkKLQkJCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9sbG93SG9zdEFTUE09VFJVRTsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb2xsb3dIb3N0QVNQTT1GQUxTRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0MzB4eEZvbGxvd0hvc3RBU1BNPSVkXG4iLCBwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9sbG93SG9zdEFTUE0pKTsKLQkJfQotCQkvL0ZvcmNlVGVzdEFTUE0KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRm9yY2VUZXN0QVNQTSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlVQ0hBUiB0ZW1wX2J1ZmZlciA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJaWYodGVtcF9idWZmZXI+MCkKLQkJCQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdD1UUlVFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3Q9RkFMU0U7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydDMweHhGb3JjZUFTUE09JWRcbiIsIHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0KSk7Ci0JCX0KLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJLy9DaGFubmVsCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkNoYW5uZWwiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQ2hhbm5lbCA9IChVQ0hBUikgc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoYW5uZWw9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJfQotCQkvL1dpcmVsZXNzTW9kZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaXJlbGVzc01vZGUiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJUlRfQ2ZnU2V0V2lyZWxlc3NNb2RlKHBBZCwgdG1wYnVmKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBoeU1vZGU9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKLQkJfQotCSAgICAvL0Jhc2ljUmF0ZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJCYXNpY1JhdGUiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQmFzaWNSYXRlPSVsZFxuIiwgcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwKSk7Ci0JCX0KLQkJLy9CZWFjb25QZXJpb2QKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQmVhY29uUGVyaW9kIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IChVU0hPUlQpIHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25QZXJpb2Q9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCkpOwotCQl9Ci0JICAgIC8vVHhQb3dlcgotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeFBvd2VyIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gKFVMT05HKSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQb3dlcj0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0JCX0KLQkJLy9CR1Byb3RlY3Rpb24KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQkdQcm90ZWN0aW9uIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkvLyNpZiAwCS8vI2lmbmRlZiBXSUZJX1RFU1QKLQkvLwkJcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID0gMjsvLyBkaXNhYmxlIGIvZyBwcm90ZWN0aW9uIGZvciB0aHJvdWdocHV0IHRlc3QKLQkvLyNlbHNlCi0JCQlzd2l0Y2ggKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkpCi0JCQl7Ci0JCQkJY2FzZSAxOiAvL0Fsd2F5cyBPbgotCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6IC8vQWx3YXlzIE9GRgotCQkJCQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAyOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDA6IC8vQVVUTwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCS8vI2VuZGlmCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCR1Byb3RlY3Rpb249JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24pKTsKLQkJfQotCQkvL09MQkNEZXRlY3Rpb24KLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGlzYWJsZU9MQkMiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJewotCQkJCWNhc2UgMTogLy9kaXNhYmxlIE9MQkMgRGV0ZWN0aW9uCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0ID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAwOiAvL2VuYWJsZSBPTEJDIERldGVjdGlvbgotCQkJCQlwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkRpc2FibGVPTEJDRGV0ZWN0PSAwOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk9MQkNEZXRlY3Rpb249JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5EaXNhYmxlT0xCQ0RldGVjdCkpOwotCQl9Ci0JCS8vVHhQcmVhbWJsZQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJUeFByZWFtYmxlIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCXN3aXRjaCAoc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKSkKLQkJCXsKLQkJCQljYXNlIFJ0ODAyXzExUHJlYW1ibGVTaG9ydDoKLQkJCQkJcEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9IFJ0ODAyXzExUHJlYW1ibGVTaG9ydDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBSdDgwMl8xMVByZWFtYmxlTG9uZzoKLQkJCQlkZWZhdWx0OgotCQkJCQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQcmVhbWJsZT0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUpKTsKLQkJfQotCQkvL1JUU1RocmVzaG9sZAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJSVFNUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJUnRzVGhyZXNoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQkJCWlmKCAoUnRzVGhyZXNoID49IDEpICYmIChSdHNUaHJlc2ggPD0gTUFYX1JUU19USFJFU0hPTEQpICkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgID0gKFVTSE9SVClSdHNUaHJlc2g7Ci0JCQllbHNlCi0JCQkJcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkID0gTUFYX1JUU19USFJFU0hPTEQ7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUU1RocmVzaG9sZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSk7Ci0JCX0KLQkJLy9GcmFnVGhyZXNob2xkCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkZyYWdUaHJlc2hvbGQiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJRnJhZ1RocmVzaCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0JCQlwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0KLQkJCWlmIChGcmFnVGhyZXNoID4gTUFYX0ZSQUdfVEhSRVNIT0xEIHx8IEZyYWdUaHJlc2ggPCBNSU5fRlJBR19USFJFU0hPTEQpCi0JCQl7IC8vaWxsZWdhbCBGcmFnVGhyZXNoIHNvIHdlIHNldCBpdCB0byBkZWZhdWx0Ci0JCQkJcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSBNQVhfRlJBR19USFJFU0hPTEQ7Ci0JCQkJcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChGcmFnVGhyZXNoICUgMiA9PSAxKQotCQkJewotCQkJCS8vIFRoZSBsZW5ndGggb2YgZWFjaCBmcmFnbWVudCBzaGFsbCBhbHdheXMgYmUgYW4gZXZlbiBudW1iZXIgb2Ygb2N0ZXRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IGZyYWdtZW50Ci0JCQkJLy8gb2YgYW4gTVNEVSBvciBNTVBEVSwgd2hpY2ggbWF5IGJlIGVpdGhlciBhbiBldmVuIG9yIGFuIG9kZCBudW1iZXIgb2Ygb2N0ZXRzLgotCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVCkoRnJhZ1RocmVzaCAtIDEpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gKFVTSE9SVClGcmFnVGhyZXNoOwotCQkJfQotCQkJLy9wQWQtPkNvbW1vbkNmZy5BbGxvd0ZyYWdTaXplID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkKSAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfQ1JDOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRnJhZ1RocmVzaG9sZD0lZFxuIiwgcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKLQkJfQotCQkvL1R4QnVyc3QKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVHhCdXJzdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JLy8jaWZkZWYgV0lGSV9URVNUCi0JLy8JCQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOwotCS8vI2Vsc2UKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkgIC8vRW5hYmxlCi0JCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOwotCQkJZWxzZSAvL0Rpc2FibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCA9IEZBTFNFOwotCS8vI2VuZGlmCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeEJ1cnN0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlVHhCdXJzdCkpOwotCQl9Ci0KLSNpZmRlZiBBR0dSRUdBVElPTl9TVVBQT1JUCi0JCS8vUGt0QWdncmVnYXRlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlBrdEFnZ3JlZ2F0ZSIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBUUlVFOwotCQkJZWxzZSAvL0Rpc2FibGUKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlID0gRkFMU0U7Ci0jaWZkZWYgUElHR1lCQUNLX1NVUFBPUlQKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlID0gcEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZTsKLSNlbmRpZiAvLyBQSUdHWUJBQ0tfU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGt0QWdncmVnYXRlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKSk7Ci0JCX0KLSNlbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLmJBZ2dyZWdhdGlvbkNhcGFibGUgPSBGQUxTRTsKLQkJcEFkLT5Db21tb25DZmcuYlBpZ2d5QmFja0NhcGFibGUgPSBGQUxTRTsKLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLQkJLy8gV21tQ2FwYWJsZQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlydG1wX3JlYWRfc3RhX3dtbV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIHBCdWZmZXIpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vU2hvcnRTbG90Ci0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlNob3J0U2xvdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlSVF9DZmdTZXRTaG9ydFNsb3QocEFkLCB0bXBidWYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2hvcnRTbG90PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOwotCQl9Ci0JCS8vSUVFRTgwMjExSAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJJRUVFODAyMTFIIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGZvciAoaSA9IDAsIG1hY3B0ciA9IHJzdHJ0b2sodG1wYnVmLCI7Iik7IG1hY3B0cjsgbWFjcHRyID0gcnN0cnRvayhOVUxMLCI7IiksIGkrKykKLQkJICAgIHsKLQkJCQlpZihzaW1wbGVfc3RydG9sKG1hY3B0ciwgMCwgMTApICE9IDApICAvL0VuYWJsZQotCQkJCQlwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9IFRSVUU7Ci0JCQkJZWxzZSAvL0Rpc2FibGUKLQkJCQkJcEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPSBGQUxTRTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklFRUU4MDIxMUg9JWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIKSk7Ci0JCSAgICB9Ci0JCX0KLQkJLy9DU1BlcmlvZAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJDU1BlcmlvZCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NQZXJpb2QgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMDsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNTUGVyaW9kPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DU1BlcmlvZCkpOwotCQl9Ci0KLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQkJLy8gRGZzTG93ZXJMaW1pdAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJEZnNMb3dlckxpbWl0IiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNMb3dlckxpbWl0ID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGZzTG93ZXJMaW1pdD0lbGRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc0xvd2VyTGltaXQpKTsKLQkJfQotCi0JCS8vIERmc1VwcGVyTGltaXQKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiRGZzVXBwZXJMaW1pdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzVXBwZXJMaW1pdCA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRmc1VwcGVyTGltaXQ9JWxkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5EZnNVcHBlckxpbWl0KSk7Ci0JCX0KLQotCQkvLyBGaXhEZnNMaW1pdAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJGaXhEZnNMaW1pdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRml4RGZzTGltaXQgPSBUUlVFOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkZpeERmc0xpbWl0ID0gRkFMU0U7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkZpeERmc0xpbWl0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5GaXhEZnNMaW1pdCkpOwotCQl9Ci0KLQkJLy8gTG9uZ1B1bHNlUmFkYXJUaAotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJMb25nUHVsc2VSYWRhclRoIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJICAgIGlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTG9uZ1B1bHNlUmFkYXJUaD0lZFxuIiwgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCkpOwotCQl9Ci0KLQkJLy8gQXZnUnNzaVJlcQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdmdSc3NpUmVxIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmKHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCkgIT0gMCkKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5BdmdSc3NpUmVxID0gc2ltcGxlX3N0cnRvbCh0bXBidWYsIDAsIDEwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXZnUnNzaVJlcT0lZFxuIiwgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQXZnUnNzaVJlcSkpOwotCQl9Ci0KLSNlbmRpZiAvLyBNRVJHRV9BUkNIX1RFQU0gLy8KLQotCQkvL1JEUmVnaW9uCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIlJEUmVnaW9uIiwgdG1wYnVmLCAxMjgsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCQkJCQlSQURBUl9ERVRFQ1RfU1RSVUNUCSpwUmFkYXJEZXRlY3QgPSAmcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3Q7Ci0JCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiSkFQX1c1MyIsIDcpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcF93NTMiLCA3KSA9PSAwKSkKLQkJCXsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uID0gSkFQX1c1MzsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25UaW1lID0gMTU7Ci0JCQl9Ci0JCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJKQVBfVzU2IiwgNykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiamFwX3c1NiIsIDcpID09IDApKQotCQkJewotCQkJCQkJCXBSYWRhckRldGVjdC0+UkREdXJSZWdpb24gPSBKQVBfVzU2OwotCQkJCQkJCXBSYWRhckRldGVjdC0+RGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJCX0KLQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIkpBUCIsIDMpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImphcCIsIDMpID09IDApKQotCQkJewotCQkJCQkJCXBSYWRhckRldGVjdC0+UkREdXJSZWdpb24gPSBKQVA7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uVGltZSA9IDU7Ci0JCQl9Ci0JCQllbHNlICBpZiAoKHN0cm5jbXAodG1wYnVmLCAiRkNDIiwgMykgPT0gMCkgfHwgKHN0cm5jbXAodG1wYnVmLCAiZmNjIiwgMykgPT0gMCkpCi0JCQl7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbiA9IEZDQzsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPkRmc1Nlc3Npb25UaW1lID0gNTsKLSNpZmRlZiBERlNfRkNDX0JXNDBfRklYCi0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uRmNjT2ZmID0gMDsKLSNlbmRpZiAvLyBERlNfRkNDX0JXNDBfRklYIC8vCi0JCQl9Ci0JCQllbHNlIGlmICgoc3RybmNtcCh0bXBidWYsICJDRSIsIDIpID09IDApIHx8IChzdHJuY21wKHRtcGJ1ZiwgImNlIiwgMikgPT0gMCkpCi0JCQl7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbiA9IENFOwotCQkJCQkJCXBSYWRhckRldGVjdC0+RGZzU2Vzc2lvblRpbWUgPSAxMzsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkJCQlwUmFkYXJEZXRlY3QtPlJERHVyUmVnaW9uID0gQ0U7Ci0JCQkJCQkJcFJhZGFyRGV0ZWN0LT5EZnNTZXNzaW9uVGltZSA9IDEzOwotCQkJfQotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSRFJlZ2lvbj0lZFxuIiwgcFJhZGFyRGV0ZWN0LT5SRER1clJlZ2lvbikpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBDRTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCX0KLQotCQkvL1dpcmVsZXNzRXZlbnQKLQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiV2lyZWxlc3NFdmVudCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0jaWYgV0lSRUxFU1NfRVhUID49IDE1Ci0JCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gMDsJLy8gZGlzYWJsZQotI2Vsc2UKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50ID0gMDsJLy8gZGlzYWJsZQotI2VuZGlmCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2lyZWxlc3NFdmVudD0lZFxuIiwgcEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKTsKLQkJfQotCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJXaUZpVGVzdCIsIHRtcGJ1ZiwgMTAsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0JCSAgICBpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApICE9IDApCi0JCQkJcEFkLT5Db21tb25DZmcuYldpRmlUZXN0PSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IDA7CS8vIGRpc2FibGUKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldpRmlUZXN0PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iV2lGaVRlc3QpKTsKLQkJfQotCQkvL0F1dGhNb2RlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkF1dGhNb2RlIiwgdG1wYnVmLCAxMjgsIHBCdWZmZXIsIFRSVUUpKQotCQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJewotCQkJCWlmICgoc3RyY21wKHRtcGJ1ZiwgIldFUEFVVE8iKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcGF1dG8iKSA9PSAwKSkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiU0hBUkVEIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJzaGFyZWQiKSA9PSAwKSkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYXBzayIpID09IDApKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLQkgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIldQQU5PTkUiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndwYW5vbmUiKSA9PSAwKSkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBMlBTSyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAid3BhMnBzayIpID09IDApKQotCQkJCQkJCSAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkJCQkJCWVsc2UgaWYgKChzdHJjbXAodG1wYnVmLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEiKSA9PSAwKSkKLQkJCSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEE7Ci0JCQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJXUEEyIikgPT0gMCkgfHwgKHN0cmNtcCh0bXBidWYsICJ3cGEyIikgPT0gMCkpCi0JCQkJCQkJICAgIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLQkgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCX0KLQkJLy9FbmNyeXBUeXBlCi0JCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIkVuY3J5cFR5cGUiLCB0bXBidWYsIDEyOCwgcEJ1ZmZlciwgVFJVRSkpCi0JCXsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXsKLQkJCQlpZiAoKHN0cmNtcCh0bXBidWYsICJXRVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgIndlcCIpID09IDApKQotCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIlRLSVAiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgInRraXAiKSA9PSAwKSkKLQkJCQkJcEFkLT5TdGFDZmcuV2VwU3RhdHVzCT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkFFUyIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiYWVzIikgPT0gMCkpCi0JCQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cwk9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQkJCQkvLyBVcGRhdGUgYWxsIHdlcHN0YXR1cyByZWxhdGVkCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlcgkJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIJCT0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotCQkJCXBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMJPSBwQWQtPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCQkJcEFkLT5TdGFDZmcuYk1peENpcGhlcgkJPSBGQUxTRTsKLQotCQkJCS8vUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjooRW5jcnlwVHlwZT0lZClcbiIsIF9fRlVOQ1RJT05fXywgcEFkLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0JCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIldQQVBTSyIsIHRtcGJ1ZiwgNTEyLCBwQnVmZmVyLCBGQUxTRSkpCi0JCQl7Ci0JCQkJaW50ICAgICByZXQgPSBUUlVFOwotCi0JCQkJdG1wYnVmW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7IC8vIG1ha2UgU1RBIGNhbiBwcm9jZXNzIC4kXiYgZm9yIFdQQVBTSyBpbnB1dAotCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJKQotCQkJCXsKLQkJCQkJcmV0ID0gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJldCA9IFJUX0NmZ1NldFdQQVBTS0tleShwQWQsIHRtcGJ1ZiwgKFBVQ0hBUilwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPlN0YUNmZy5QTUspOwotCQkJCX0KLQotCQkJCWlmIChyZXQgPT0gVFJVRSkKLQkJCQl7Ci0JCQlSVE1QWmVyb01lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCA2NCk7Ci0JCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCB0bXBidWYsIHN0cmxlbih0bXBidWYpKTsKLQkJCQkJcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbj0gc3RybGVuKHRtcGJ1Zik7Ci0KLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJCXsKLQkJCQkJCS8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLQkJCQkJCXBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJCQkJewotCQkJCQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OihXUEFQU0s9JXMpXG4iLCBfX0ZVTkNUSU9OX18sIHRtcGJ1ZikpOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vRGVmYXVsdEtleUlELCBLZXlUeXBlLCBLZXlTdHIKLQkJcnRtcF9yZWFkX2tleV9wYXJtc19mcm9tX2ZpbGUocEFkLCB0bXBidWYsIHBCdWZmZXIpOwotCi0KLQkJLy9IU0NvdW50ZXIKLQkJLyppZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJIU0NvdW50ZXIiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJewotCQkJc3dpdGNoIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApKQotCQkJewotCQkJCWNhc2UgMTogLy9FbmFibGUKLQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZUhTQ291bnRlciA9IFRSVUU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMDogLy9EaXNhYmxlCi0JCQkJZGVmYXVsdDoKLQkJCQkJcEFkLT5Db21tb25DZmcuYkVuYWJsZUhTQ291bnRlciA9IEZBTFNFOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAiSFNDb3VudGVyPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iRW5hYmxlSFNDb3VudGVyKTsKLQkJfSovCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJSFRQYXJhbWV0ZXJzSG9vayhwQWQsIHRtcGJ1ZiwgcEJ1ZmZlcik7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLQkJCS8vQ2FycmllckRldGVjdAotCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiQ2FycmllckRldGVjdCIsIHRtcGJ1ZiwgMTI4LCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlpZiAoKHN0cm5jbXAodG1wYnVmLCAiMCIsIDEpID09IDApKQotCQkJCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IEZBTFNFOwotCQkJCWVsc2UgaWYgKChzdHJuY21wKHRtcGJ1ZiwgIjEiLCAxKSA9PSAwKSkKLQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBUUlVFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSBGQUxTRTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNhcnJpZXJEZXRlY3QuRW5hYmxlPSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOwotCQkJfQotCQkJZWxzZQotCQkJCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCS8vUFNNb2RlCi0JCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiUFNNb2RlIiwgdG1wYnVmLCAxMCwgcEJ1ZmZlciwgVFJVRSkpCi0JCQl7Ci0JCQkJaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotCQkJCXsKLQkJCQkJaWYgKChzdHJjbXAodG1wYnVmLCAiTUFYX1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAibWF4X3BzcCIpID09IDApKQotCQkJCQl7Ci0JCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotCQkJCQkJLy8JICAgTWxtZVNldFBzbShwQWQsIFBXUl9TQVZFKTsKLQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVNQVhfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUDsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKHN0cmNtcCh0bXBidWYsICJGYXN0X1BTUCIpID09IDApIHx8IChzdHJjbXAodG1wYnVmLCAiZmFzdF9wc3AiKSA9PSAwKQotCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJGQVNUX1BTUCIpID09IDApKQotCQkJCQl7Ci0JCQkJCQkvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrRm9yUHNtQ2hhbmdlKCkKLQkJCQkJCS8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotCQkJCQkJLy8JICAgTWxtZVNldFBzbUJpdChwQWQsIFBXUl9TQVZFKTsKLQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUDsKLQkJCQkJCXBBZC0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoc3RyY21wKHRtcGJ1ZiwgIkxlZ2FjeV9QU1AiKSA9PSAwKSB8fCAoc3RyY21wKHRtcGJ1ZiwgImxlZ2FjeV9wc3AiKSA9PSAwKQotCQkJCQkJfHwgKHN0cmNtcCh0bXBidWYsICJMRUdBQ1lfUFNQIikgPT0gMCkpCi0JCQkJCXsKLQkJCQkJCS8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tGb3JQc21DaGFuZ2UoKQotCQkJCQkJLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0JCQkJCQkvLwkgICBNbG1lU2V0UHNtQml0KHBBZCwgUFdSX1NBVkUpOwotCQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLQkJCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0JCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQOwotCQkJCQkJcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50ID0gMzsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsgLy9EZWZhdWx0IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0KLQkJCQkJCS8vIGNsZWFyIFBTTSBiaXQgaW1tZWRpYXRlbHkKLQkJCQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfQUNUSVZFKTsKLQkJCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0JCQkJCQkJcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0JCQkJCQlwQWQtPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0JCQkJCX0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNb2RlPSVsZFxuIiwgcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIEF1dG9Sb2FtaW5nIGJ5IFJTU0kKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJBdXRvUm9hbWluZyIsIHRtcGJ1ZiwgMzIsIHBCdWZmZXIsIFRSVUUpKQotCQkJewotCQkJCWlmIChzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCi0JCQkJCXBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZyA9IEZBTFNFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuYkF1dG9Sb2FtaW5nID0gVFJVRTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkF1dG9Sb2FtaW5nPSVkXG4iLCBwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcpKTsKLQkJCX0KLQkJCS8vIFJvYW1UaHJlc2hvbGQKLQkJCWlmIChSVE1QR2V0S2V5UGFyYW1ldGVyKCJSb2FtVGhyZXNob2xkIiwgdG1wYnVmLCAzMiwgcEJ1ZmZlciwgVFJVRSkpCi0JCQl7Ci0JCQkJbG9uZyBsSW5mbyA9IHNpbXBsZV9zdHJ0b2wodG1wYnVmLCAwLCAxMCk7Ci0KLQkJCQlpZiAobEluZm8gPiA5MCB8fCBsSW5mbyA8IDYwKQotCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAtNzA7Ci0JCQkJZWxzZQotCQkJCQlwQWQtPlN0YUNmZy5kQm1Ub1JvYW0gPSAoQ0hBUikoLTEpKmxJbmZvOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUm9hbVRocmVzaG9sZD0lZCAgZEJtXG4iLCBwQWQtPlN0YUNmZy5kQm1Ub1JvYW0pKTsKLQkJCX0KLQotCQkJaWYoUlRNUEdldEtleVBhcmFtZXRlcigiVEduV2lmaVRlc3QiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlpZihzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApID09IDApCi0JCQkJCXBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IEZBTFNFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuYlRHbldpZmlUZXN0ID0gVFJVRTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVEduV2lmaVRlc3Q9JWRcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOwotCQkJfQotCi0JCQkvLyBCZWFjb24gTG9zdCBUaW1lCi0JCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiQmVhY29uTG9zdFRpbWUiLCB0bXBidWYsIDMyLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlVTE9ORyBsSW5mbyA9IChVTE9ORylzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCi0JCQkJaWYgKChsSW5mbyAhPSAwKSAmJiAobEluZm8gPD0gNjApKQotCQkJCQlwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSA9IChsSW5mbyAqIE9TX0haKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCZWFjb25Mb3N0VGltZT0lbGQgXG4iLCBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSkpOwotCQkJfQotCi0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZihSVE1QR2V0S2V5UGFyYW1ldGVyKCJBbnREaXZlcnNpdHkiLCB0bXBidWYsIDEwLCBwQnVmZmVyLCBUUlVFKSkKLQkJCXsKLQkJCQlmb3IgKGkgPSAwLCBtYWNwdHIgPSByc3RydG9rKHRtcGJ1ZiwiOyIpOyBtYWNwdHI7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCQkJewotCQkJCQlVQ0hBUiBBbnQgPSBzaW1wbGVfc3RydG9sKHRtcGJ1ZiwgMCwgMTApOwotCQkJCQlpZihBbnQgPCAzKQotCQkJCQkJcEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID0gQW50OwotCQkJCQllbHNlCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPSBBTlRfRElWRVJTSVRZX0RJU0FCTEU7Ci0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQW50RGl2ZXJzaXR5PSVkXG4iLCBwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCX13aGlsZSgwKTsKLQotCi0Ja2ZyZWUodG1wYnVmKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCi19Ci0KLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotLy8gcmVjb3JkIHdoZXRoZXIgdGhlIGNhcmQgaW4gdGhlIGNhcmQgbGlzdCBpcyB1c2VkIGluIHRoZSBjYXJkIGZpbGUKLVVJTlQ4ICBNQ19DYXJkVXNlZFtNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdOwotLy8gcmVjb3JkIHVzZWQgY2FyZCBtYWMgYWRkcmVzcyBpbiB0aGUgY2FyZCBsaXN0Ci1zdGF0aWMgVUlOVDggIE1DX0NhcmRNYWNbTUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEXVs2XTsKLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBHZXQgY2FyZCBwcm9maWxlIHBhdGguCi0KLUFyZ3VtZW50czoKLSAgICBwQWQKLQotUmV0dXJuIFZhbHVlOgotICAgIFRSVUUJCS0gRmluZCBhIGNhcmQgcHJvZmlsZQotCUZBTFNFCQktIHVzZSBkZWZhdWx0IHByb2ZpbGUKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0jZGVmaW5lIE1DX1NFTEVDVF9DQVJESUQJCTAJLyogdXNlIENBUkQgSUQgKDAgfiAzMSkgdG8gaWRlbnRpZnkgZGlmZmVyZW50IGNhcmRzICovCi0jZGVmaW5lIE1DX1NFTEVDVF9NQUMJCQkxCS8qIHVzZSBDQVJEIE1BQyB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KLSNkZWZpbmUgTUNfU0VMRUNUX0NBUkRUWVBFCQkyCS8qIHVzZSBDQVJEIHR5cGUgKGFiZ24gb3IgYmduKSB0byBpZGVudGlmeSBkaWZmZXJlbnQgY2FyZHMgKi8KLQotI2RlZmluZSBMRVRURVJfQ0FTRV9UUkFOU0xBVEUodHh0X3AsIGNhcmRfaWQpCQkJXAotCXsJVUlOVDMyIF9sZW47IGNoYXIgX2NoYXI7CQkJCQkJXAotCQlmb3IoX2xlbj0wOyBfbGVuPHN0cmxlbihjYXJkX2lkKTsgX2xlbisrKSB7CQlcCi0JCQlfY2hhciA9ICoodHh0X3AgKyBfbGVuKTsJCQkJCVwKLQkJCWlmICgoJ0EnIDw9IF9jaGFyKSAmJiAoX2NoYXIgPD0gJ1onKSkJCVwKLQkJCQkqKHR4dF9wK19sZW4pID0gJ2EnKyhfY2hhci0nQScpOwkJXAotCQl9IH0KLQotCVJUTVBfT1NfRkQgc3JjZjsKLQlJTlQgcmV0dmFsOwotCVBTVFJJTkcgYnVmZmVyLCB0bXBidWY7Ci0JU1RSSU5HIGNhcmRfaWRfYnVmWzMwXSwgUkZJQ193b3JkWzMwXTsKLQlCT09MRUFOIGZsZ19tYXRjaF9vayA9IEZBTFNFOwotCUlOVDMyIGNhcmRfc2VsZWN0X21ldGhvZDsKLQlJTlQzMiBjYXJkX2ZyZWVfaWQsIGNhcmRfbm91c2VfaWQsIGNhcmRfc2FtZV9tYWNfaWQsIGNhcmRfbWF0Y2hfaWQ7Ci0JRUVQUk9NX0FOVEVOTkFfU1RSVUMgYW50ZW5uYTsKLQlVU0hPUlQgYWRkcjAxLCBhZGRyMjMsIGFkZHI0NTsKLQlVSU5UOCBtYWNbNl07Ci0JVUlOVDMyIGRhdGEsIGNhcmRfaW5kZXg7Ci0JVUNIQVIgKnN0YXJ0X3B0cjsKLQlSVE1QX09TX0ZTX0lORk8gb3NGU0luZm87Ci0KLQkvLyBpbml0Ci0JYnVmZmVyID0ga21hbGxvYyhNQVhfSU5JX0JVRkZFUl9TSVpFLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQl0bXBidWYgPSBrbWFsbG9jKE1BWF9QQVJBTV9CVUZGRVJfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmKHRtcGJ1ZiA9PSBOVUxMKQotCXsKLQkJa2ZyZWUoYnVmZmVyKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0JLy8gZ2V0IFJGIElDIHR5cGUKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKLQotCWlmICgoZGF0YSAmIDB4MzApID09IDApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDY7CS8vIDkzQzQ2Ci0JZWxzZSBpZiAoKGRhdGEgJiAweDMwKSA9PSAweDEwKQotCQlwQWQtPkVFUFJPTUFkZHJlc3NOdW0gPSA4OwkvLyA5M0M2NgotCWVsc2UKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsJLy8gOTNDODYKLQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX05JQzFfT0ZGU0VULCBhbnRlbm5hLndvcmQpOwotCi0JaWYgKChhbnRlbm5hLmZpZWxkLlJmSWNUeXBlID09IFJGSUNfMjg1MCkgfHwKLQkJKGFudGVubmEuZmllbGQuUmZJY1R5cGUgPT0gUkZJQ18yNzUwKSkKLQl7Ci0JCS8qIEFCR04gY2FyZCAqLwotCQlzdHJjcHkoUkZJQ193b3JkLCAiYWJnbiIpOwotCX0KLQllbHNlCi0JewotCQkvKiBCR04gY2FyZCAqLwotCQlzdHJjcHkoUkZJQ193b3JkLCAiYmduIik7Ci0JfQotCi0JLy8gZ2V0IE1BQyBhZGRyZXNzCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA0LCBhZGRyMDEpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNiwgYWRkcjIzKTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIGFkZHI0NSk7Ci0KLQltYWNbMF0gPSAoVUNIQVIpKGFkZHIwMSAmIDB4ZmYpOwotCW1hY1sxXSA9IChVQ0hBUikoYWRkcjAxID4+IDgpOwotCW1hY1syXSA9IChVQ0hBUikoYWRkcjIzICYgMHhmZik7Ci0JbWFjWzNdID0gKFVDSEFSKShhZGRyMjMgPj4gOCk7Ci0JbWFjWzRdID0gKFVDSEFSKShhZGRyNDUgJiAweGZmKTsKLQltYWNbNV0gPSAoVUNIQVIpKGFkZHI0NSA+PiA4KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1hYyBhZGRyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IVxuIiwgUFJJTlRfTUFDKG1hYykpKTsKLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCS8vIG9wZW4gY2FyZCBpbmZvcm1hdGlvbiBmaWxlCi0Jc3JjZiA9IFJ0bXBPU0ZpbGVPcGVuKENBUkRfSU5GT19QQVRILCBPX1JET05MWSwgMCk7Ci0JaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JewotCQkvKiBjYXJkIGluZm9ybWF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QgKi8KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJCSgiLS0+IEVycm9yIG9wZW5pbmcgJXNcbiIsIENBUkRfSU5GT19QQVRIKSk7Ci0JCWdvdG8gIGZyZWVfcmVzb3VyY2U7Ci0JfQotCi0JLyogY2FyZCBpbmZvcm1hdGlvbiBmaWxlIGV4aXN0cyBzbyByZWFkaW5nIHRoZSBjYXJkIGluZm9ybWF0aW9uICovCi0JbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7Ci0JcmV0dmFsID0gUnRtcE9TRmlsZVJlYWQoc3JjZiwgYnVmZmVyLCBNQVhfSU5JX0JVRkZFUl9TSVpFKTsKLQlpZiAocmV0dmFsIDwgMCkKLQl7Ci0JCS8qIHJlYWQgZmFpbCAqLwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCItLT4gUmVhZCAlcyBlcnJvciAlZFxuIiwgQ0FSRF9JTkZPX1BBVEgsIC1yZXR2YWwpKTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogZ2V0IGNhcmQgc2VsZWN0aW9uIG1ldGhvZCAqLwotCQltZW1zZXQodG1wYnVmLCAweDAwLCBNQVhfUEFSQU1fQlVGRkVSX1NJWkUpOwotCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRFRZUEU7IC8vIGRlZmF1bHQKLQotCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcigiU0VMRUNUIiwgdG1wYnVmLCAyNTYsIGJ1ZmZlciwgVFJVRSkpCi0JCXsKLQkJCWlmIChzdHJjbXAodG1wYnVmLCAiQ0FSRElEIikgPT0gMCkKLQkJCQljYXJkX3NlbGVjdF9tZXRob2QgPSBNQ19TRUxFQ1RfQ0FSRElEOwotCQkJZWxzZSBpZiAoc3RyY21wKHRtcGJ1ZiwgIk1BQyIpID09IDApCi0JCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX01BQzsKLQkJCWVsc2UgaWYgKHN0cmNtcCh0bXBidWYsICJDQVJEVFlQRSIpID09IDApCi0JCQkJY2FyZF9zZWxlY3RfbWV0aG9kID0gTUNfU0VMRUNUX0NBUkRUWVBFOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJKCJNQz4gQ2FyZCBTZWxlY3Rpb24gPSAlZFxuIiwgY2FyZF9zZWxlY3RfbWV0aG9kKSk7Ci0KLQkJLy8gaW5pdAotCQljYXJkX2ZyZWVfaWQgPSAtMTsKLQkJY2FyZF9ub3VzZV9pZCA9IC0xOwotCQljYXJkX3NhbWVfbWFjX2lkID0gLTE7Ci0JCWNhcmRfbWF0Y2hfaWQgPSAtMTsKLQotCQkvLyBzZWFyY2ggY3VycmVudCBjYXJkIGluZm9ybWF0aW9uIHJlY29yZHMKLQkJZm9yKGNhcmRfaW5kZXg9MDsKLQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOwotCQkJY2FyZF9pbmRleCsrKQotCQl7Ci0JCQlpZiAoKCooVUlOVDMyICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bMF0gPT0gMCkgJiYKLQkJCQkoKihVSU5UMTYgKikmTUNfQ2FyZE1hY1tjYXJkX2luZGV4XVs0XSA9PSAwKSkKLQkJCXsKLQkJCQkvLyBNQUMgaXMgYWxsLTAgc28gdGhlIGVudHJ5IGlzIGF2YWlsYWJsZQotCQkJCU1DX0NhcmRVc2VkW2NhcmRfaW5kZXhdID0gMDsKLQotCQkJCWlmIChjYXJkX2ZyZWVfaWQgPCAwKQotCQkJCQljYXJkX2ZyZWVfaWQgPSBjYXJkX2luZGV4OyAvLyAxc3QgZnJlZSBlbnRyeQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChtZW1jbXAoTUNfQ2FyZE1hY1tjYXJkX2luZGV4XSwgbWFjLCA2KSA9PSAwKQotCQkJCXsKLQkJCQkJLy8gd2UgZmluZCB0aGUgZW50cnkgd2l0aCBzYW1lIE1BQwotCQkJCQlpZiAoY2FyZF9zYW1lX21hY19pZCA8IDApCi0JCQkJCQljYXJkX3NhbWVfbWFjX2lkID0gY2FyZF9pbmRleDsgLy8gMXN0IHNhbWUgZW50cnkKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gTUFDIGlzIG5vdCBhbGwtMCBidXQgdXNlZCBmbGFnID09IDAKLQkJCQkJaWYgKChNQ19DYXJkVXNlZFtjYXJkX2luZGV4XSA9PSAwKSAmJgotCQkJCQkJKGNhcmRfbm91c2VfaWQgPCAwKSkKLQkJCQkJewotCQkJCQkJY2FyZF9ub3VzZV9pZCA9IGNhcmRfaW5kZXg7IC8vIDFzdCBhdmFpbGFibGUgZW50cnkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLAotCQkJCSgiTUM+IEZyZWUgPSAlZCwgU2FtZSA9ICVkLCBOT1VTRSA9ICVkXG4iLAotCQkJCWNhcmRfZnJlZV9pZCwgY2FyZF9zYW1lX21hY19pZCwgY2FyZF9ub3VzZV9pZCkpOwotCi0JCWlmICgoY2FyZF9zYW1lX21hY19pZCA+PSAwKSAmJgotCQkJKChjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRJRCkgfHwKLQkJCShjYXJkX3NlbGVjdF9tZXRob2QgPT0gTUNfU0VMRUNUX0NBUkRUWVBFKSkpCi0JCXsKLQkJCS8vIHNhbWUgTUFDIGVudHJ5IGlzIGZvdW5kCi0JCQljYXJkX21hdGNoX2lkID0gY2FyZF9zYW1lX21hY19pZDsKLQotCQkJaWYgKGNhcmRfc2VsZWN0X21ldGhvZCA9PSBNQ19TRUxFQ1RfQ0FSRFRZUEUpCi0JCQl7Ci0JCQkJLy8gZm9yIENBUkRUWVBFCi0JCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJEVFlQRSVzIiwKLQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7Ci0KLQkJCQlpZiAoKHN0YXJ0X3B0ciA9IChQVUNIQVIpcnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLCBjYXJkX2lkX2J1ZikpICE9IE5VTEwpCi0JCQkJewotCQkJCQkvLyB3ZSBmb3VuZCB0aGUgY2FyZCBJRAotCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gdGhlIGNhcmQgaXMgMXN0IHBsdWctaW4sIHRyeSB0byBmaW5kIHRoZSBtYXRjaCBjYXJkIHByb2ZpbGUKLQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCi0JCQl7Ci0JCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRElEOiAvLyBDQVJESUQKLQkJCQlkZWZhdWx0OgotCQkJCQlpZiAoY2FyZF9mcmVlX2lkID49IDApCi0JCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9mcmVlX2lkOwotCQkJCQllbHNlCi0JCQkJCQljYXJkX21hdGNoX2lkID0gY2FyZF9ub3VzZV9pZDsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQwotCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiTUFDJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAotCQkJCQkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sCi0JCQkJCQkJbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7Ci0KLQkJCQkJLyogdHJ5IHRvIGZpbmQgdGhlIGtleSB3b3JkIGluIHRoZSBjYXJkIGZpbGUgKi8KLQkJCQkJaWYgKChzdGFydF9wdHIgPSAoUFVDSEFSKXJ0c3Ryc3RydW5jYXNlY21wKGJ1ZmZlciwgY2FyZF9pZF9idWYpKSAhPSBOVUxMKQotCQkJCQl7Ci0JCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7Ci0KLQkJCQkJCS8qIGdldCB0aGUgcm93IElEICgyIEFTQ0lJIGNoYXJhY3RlcnMpICovCi0JCQkJCQlzdGFydF9wdHIgLT0gMjsKLQkJCQkJCWNhcmRfaWRfYnVmWzBdID0gKihzdGFydF9wdHIpOwotCQkJCQkJY2FyZF9pZF9idWZbMV0gPSAqKHN0YXJ0X3B0cisxKTsKLQkJCQkJCWNhcmRfaWRfYnVmWzJdID0gMHgwMDsKLQotCQkJCQkJY2FyZF9tYXRjaF9pZCA9IHNpbXBsZV9zdHJ0b2woY2FyZF9pZF9idWYsIDAsIDEwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgTUNfU0VMRUNUX0NBUkRUWVBFOiAvLyBDQVJEVFlQRQotCQkJCQljYXJkX25vdXNlX2lkID0gLTE7Ci0KLQkJCQkJZm9yKGNhcmRfaW5kZXg9MDsKLQkJCQkJCWNhcmRfaW5kZXg8TUFYX05VTV9PRl9NVUxUSVBMRV9DQVJEOwotCQkJCQkJY2FyZF9pbmRleCsrKQotCQkJCQl7Ci0JCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZENBUkRUWVBFJXMiLAotCQkJCQkJCQljYXJkX2luZGV4LCBSRklDX3dvcmQpOwotCi0JCQkJCQlpZiAoKHN0YXJ0X3B0ciA9IChQVUNIQVIpcnRzdHJzdHJ1bmNhc2VjbXAoYnVmZmVyLAotCQkJCQkJCQkJCQkJCWNhcmRfaWRfYnVmKSkgIT0gTlVMTCkKLQkJCQkJCXsKLQkJCQkJCQlMRVRURVJfQ0FTRV9UUkFOU0xBVEUoc3RhcnRfcHRyLCBjYXJkX2lkX2J1Zik7Ci0KLQkJCQkJCQlpZiAoTUNfQ2FyZFVzZWRbY2FyZF9pbmRleF0gPT0gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCS8qIGN1cnJlbnQgdGhlIGNhcmQgcHJvZmlsZSBpcyBub3QgdXNlZCAqLwotCQkJCQkJCQlpZiAoKCooVUlOVDMyICopJk1DX0NhcmRNYWNbY2FyZF9pbmRleF1bMF0gPT0gMCkgJiYKLQkJCQkJCQkJCSgqKFVJTlQxNiAqKSZNQ19DYXJkTWFjW2NhcmRfaW5kZXhdWzRdID09IDApKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkvLyBmaW5kIGl0IGFuZCBubyBwcmV2aW91cyBjYXJkIHVzZSBpdAotCQkJCQkJCQkJY2FyZF9tYXRjaF9pZCA9IGNhcmRfaW5kZXg7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsKLQkJCQkJCQkJCS8vIGV2ZXIgYSBjYXJkIHVzZSBpdAotCQkJCQkJCQkJaWYgKGNhcmRfbm91c2VfaWQgPCAwKQotCQkJCQkJCQkJCWNhcmRfbm91c2VfaWQgPSBjYXJkX2luZGV4OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gaWYgbm90IGZpbmQgYSBmcmVlIG9uZSwgdXNlIHRoZSBhdmFpbGFibGUgb25lCi0JCQkJCWlmIChjYXJkX21hdGNoX2lkIDwgMCkKLQkJCQkJCWNhcmRfbWF0Y2hfaWQgPSBjYXJkX25vdXNlX2lkOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChjYXJkX21hdGNoX2lkID49IDApCi0JCXsKLQkJCS8vIG1ha2UgdXAgc2VhcmNoIGtleXdvcmQKLQkJCXN3aXRjaChjYXJkX3NlbGVjdF9tZXRob2QpCi0JCQl7Ci0JCQkJY2FzZSBNQ19TRUxFQ1RfQ0FSRElEOiAvLyBDQVJESUQKLQkJCQkJc3ByaW50ZihjYXJkX2lkX2J1ZiwgIiUwMmRDQVJESUQiLCBjYXJkX21hdGNoX2lkKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIE1DX1NFTEVDVF9NQUM6IC8vIE1BQwotCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLAotCQkJCQkJCSIlMDJkbWFjJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAotCQkJCQkJCWNhcmRfbWF0Y2hfaWQsCi0JCQkJCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwKLQkJCQkJCQltYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIE1DX1NFTEVDVF9DQVJEVFlQRTogLy8gQ0FSRFRZUEUKLQkJCQlkZWZhdWx0OgotCQkJCQlzcHJpbnRmKGNhcmRfaWRfYnVmLCAiJTAyZGNhcmR0eXBlJXMiLAotCQkJCQkJCWNhcmRfbWF0Y2hfaWQsIFJGSUNfd29yZCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZWFyY2ggS2V5d29yZCA9ICVzXG4iLCBjYXJkX2lkX2J1ZikpOwotCi0JCQkvLyByZWFkIGNhcmQgZmlsZSBwYXRoCi0JCQlpZiAoUlRNUEdldEtleVBhcmFtZXRlcihjYXJkX2lkX2J1ZiwgdG1wYnVmLCAyNTYsIGJ1ZmZlciwgVFJVRSkpCi0JCQl7Ci0JCQkJaWYgKHN0cmxlbih0bXBidWYpIDwgc2l6ZW9mKHBBZC0+TUNfRmlsZU5hbWUpKQotCQkJCXsKLQkJCQkJLy8gYmFja3VwIGNhcmQgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5NQ19Sb3dJRCA9IGNhcmRfbWF0Y2hfaWQ7IC8qIGJhc2UgMCAqLwotCQkJCQlNQ19DYXJkVXNlZFtjYXJkX21hdGNoX2lkXSA9IDE7Ci0JCQkJCW1lbWNweShNQ19DYXJkTWFjW2NhcmRfbWF0Y2hfaWRdLCBtYWMsIHNpemVvZihtYWMpKTsKLQotCQkJCQkvLyBiYWNrdXAgY2FyZCBmaWxlIHBhdGgKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NQ19GaWxlTmFtZSwgdG1wYnVmICwgc3RybGVuKHRtcGJ1ZikpOwotCQkJCQlwQWQtPk1DX0ZpbGVOYW1lW3N0cmxlbih0bXBidWYpXSA9ICdcMCc7Ci0JCQkJCWZsZ19tYXRjaF9vayA9IFRSVUU7Ci0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJCQkJKCJDYXJkIFByb2ZpbGUgTmFtZSA9ICVzXG4iLCBwQWQtPk1DX0ZpbGVOYW1lKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAotCQkJCQkJCSgiQ2FyZCBQcm9maWxlIE5hbWUgbGVuZ3RoIHRvbyBsYXJnZSFcbiIpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsCi0JCQkJCQkoIkNhbiBub3QgZmluZCBzZWFyY2gga2V5IHdvcmQgaW4gY2FyZC5kYXQhXG4iKSk7Ci0JCQl9Ci0KLQkJCWlmICgoZmxnX21hdGNoX29rICE9IFRSVUUpICYmCi0JCQkJKGNhcmRfbWF0Y2hfaWQgPCBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQpKQotCQkJewotCQkJCU1DX0NhcmRVc2VkW2NhcmRfbWF0Y2hfaWRdID0gMDsKLQkJCQltZW1zZXQoTUNfQ2FyZE1hY1tjYXJkX21hdGNoX2lkXSwgMCwgc2l6ZW9mKG1hYykpOwotCQkJfQotCQl9IC8vIGlmIChjYXJkX21hdGNoX2lkID49IDApCi0JfQotCi0KLQkvLyBjbG9zZSBmaWxlCi0JcmV0dmFsID0gUnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCi1mcmVlX3Jlc291cmNlOgotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIEZBTFNFKTsKLQlrZnJlZShidWZmZXIpOwotCWtmcmVlKHRtcGJ1Zik7Ci0KLQlyZXR1cm4gZmxnX21hdGNoX29rOwotfQotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Nhbml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3Nhbml0eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTYzMWMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9zYW5pdHkuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MTggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlzYW5pdHkuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4gQ2hhbmcgIDIwMDQtMDktMDEgICAgICBhZGQgV01NIHN1cHBvcnQKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1leHRlcm4gVUNIQVIJQ0lTQ09fT1VJW107Ci0KLWV4dGVybiBVQ0hBUglXUEFfT1VJW107Ci1leHRlcm4gVUNIQVIJUlNOX09VSVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9JTkZPX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglXTUVfUEFSTV9FTEVNW107Ci1leHRlcm4gVUNIQVIJQ2N4MlFvc0luZm9bXTsKLWV4dGVybiBVQ0hBUglSQUxJTktfT1VJW107Ci1leHRlcm4gVUNIQVIJQlJPQURDT01fT1VJW107Ci1leHRlcm4gVUNIQVIgICAgV1BTX09VSVtdOwotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lQWRkQkFSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMikKLXsKLSAgICBQTUxNRV9BRERCQV9SRVFfU1RSVUNUICAgcEluZm87Ci0KLSAgICBwSW5mbyA9IChNTE1FX0FEREJBX1JFUV9TVFJVQ1QgKilNc2c7Ci0KLSAgICBpZiAoKE1zZ0xlbiAhPSBzaXplb2YoTUxNRV9BRERCQV9SRVFfU1RSVUNUKSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIG1lc3NhZ2UgbGVuZ2h0IG5vdCBjb3JyZWN0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+V2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQWRkQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIE1hYyBpcyBub3QgYXNzb2NpYXRlZCB5ZXQuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQkvKgotICAgIGlmICgocEluZm8tPkJhQnVmU2l6ZSA+IE1BWF9SWF9SRU9SREVSQlVGKSB8fCAocEluZm8tPkJhQnVmU2l6ZSA8IDIpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBSeCBSZW9yZGVyaW5nIGJ1ZmZlciB0b28gYmlnIG9yIHRvbyBzbWFsbFxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCSovCi0KLSAgICBpZiAoKHBJbmZvLT5wQWRkclswXSYweDAxKSA9PSAweDAxKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZUFkZEJBUmVxU2FuaXR5IGZhaWwgLSBicm9hZGNhc3QgYWRkcmVzcyBub3Qgc3VwcG9ydCBCQVxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVEZWxCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKQotewotCU1MTUVfREVMQkFfUkVRX1NUUlVDVCAqcEluZm87Ci0JcEluZm8gPSAoTUxNRV9ERUxCQV9SRVFfU1RSVUNUICopTXNnOwotCi0gICAgaWYgKChNc2dMZW4gIT0gc2l6ZW9mKE1MTUVfREVMQkFfUkVRX1NUUlVDVCkpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBtZXNzYWdlIGxlbmdodCBub3QgY29ycmVjdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICgocEluZm8tPldjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTWxtZURlbEJBUmVxU2FuaXR5IGZhaWwgLSBUaGUgcGVlciBNYWMgaXMgbm90IGFzc29jaWF0ZWQgeWV0LlxuIikpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKChwSW5mby0+VElEICYgMHhmMCkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIFRoZSBwZWVyIFRJRCBpcyBpbmNvcnJlY3QuXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQlpZiAoTmRpc0VxdWFsTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbcEluZm8tPldjaWRdLkFkZHIsIHBJbmZvLT5BZGRyLCBNQUNfQUREUl9MRU4pID09IDApCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJNbG1lRGVsQkFSZXFTYW5pdHkgZmFpbCAtIHRoZSBwZWVyIGFkZHIgZG9zZW4ndCBleGlzdC5cbiIpKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMikKLXsKLQlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUEZSQU1FX0FEREJBX1JFUSBwQWRkRnJhbWU7Ci0JcEFkZEZyYW1lID0gKFBGUkFNRV9BRERCQV9SRVEpKHBNc2cpOwotCWlmIChNc2dMZW4gPCAoc2l6ZW9mKEZSQU1FX0FEREJBX1JFUSkpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgZnJhbWUgbGVuZ3RoIHNpemUgPSAlbGQgaW5jb3JyZWN0XG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQkvLyB3ZSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JewotCQlCQV9QQVJNCQl0bXBCYVBhcm07Ci0KLQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnRtcEJhUGFybSksIChQVUNIQVIpKCZwQWRkRnJhbWUtPkJhUGFybSksIHNpemVvZihCQV9QQVJNKSk7Ci0JCSooVVNIT1JUICopKCZ0bXBCYVBhcm0pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnRtcEJhUGFybSkpOwotCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcEFkZEZyYW1lLT5CYVBhcm0pLCAoUFVDSEFSKSgmdG1wQmFQYXJtKSwgc2l6ZW9mKEJBX1BBUk0pKTsKLQl9Ci0jZWxzZQotCSooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEFkZEZyYW1lLT5CYVBhcm0pKTsKLSNlbmRpZgotCXBBZGRGcmFtZS0+VGltZU91dFZhbHVlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5UaW1lT3V0VmFsdWUpOwotCXBBZGRGcmFtZS0+QmFTdGFydFNlcS53b3JkID0gY3B1MmxlMTYocEFkZEZyYW1lLT5CYVN0YXJ0U2VxLndvcmQpOwotCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLkJBUG9saWN5ICE9IElNTUVEX0JBKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgQmEgUG9saWN5WyVkXSBub3Qgc3VwcG9ydFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uQkFQb2xpY3kpKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJBRERCQSBSZXF1ZXN0LiB0aWQ9JXgsIEJ1ZnNpemU9JXgsIEFNU0RVU3VwcG9ydGVkPSV4IFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElELCBwQWRkRnJhbWUtPkJhUGFybS5CdWZTaXplLCBwQWRkRnJhbWUtPkJhUGFybS5BTVNEVVN1cHBvcnRlZCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSZXFBY3Rpb25TYW5pdHk6IEFEREJBIFJlcXVlc3QgaW5jb3JyZWN0IFRJRCA9ICVkXG4iLCBwQWRkRnJhbWUtPkJhUGFybS5USUQpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotCXJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJBZGRCQVJzcEFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbikKLXsKLQkvL1BGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQRlJBTUVfQUREQkFfUlNQIHBBZGRGcmFtZTsKLQotCXBBZGRGcmFtZSA9IChQRlJBTUVfQUREQkFfUlNQKShwTXNnKTsKLQlpZiAoTXNnTGVuIDwgKHNpemVvZihGUkFNRV9BRERCQV9SU1ApKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBmcmFtZSBsZW5ndGggc2l6ZSA9ICVsZCBpbmNvcnJlY3RcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCS8vIHdlIHN1cHBvcnQgaW1tZWRpYXRlIEJBLgotI2lmZGVmIFVOQUxJR05NRU5UX1NVUFBPUlQKLQl7Ci0JCUJBX1BBUk0JCXRtcEJhUGFybTsKLQotCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmdG1wQmFQYXJtKSwgKFBVQ0hBUikoJnBBZGRGcmFtZS0+QmFQYXJtKSwgc2l6ZW9mKEJBX1BBUk0pKTsKLQkJKihVU0hPUlQgKikoJnRtcEJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmdG1wQmFQYXJtKSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwQWRkRnJhbWUtPkJhUGFybSksIChQVUNIQVIpKCZ0bXBCYVBhcm0pLCBzaXplb2YoQkFfUEFSTSkpOwotCX0KLSNlbHNlCi0JKihVU0hPUlQgKikoJnBBZGRGcmFtZS0+QmFQYXJtKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkRnJhbWUtPkJhUGFybSkpOwotI2VuZGlmCi0JcEFkZEZyYW1lLT5TdGF0dXNDb2RlID0gY3B1MmxlMTYocEFkZEZyYW1lLT5TdGF0dXNDb2RlKTsKLQlwQWRkRnJhbWUtPlRpbWVPdXRWYWx1ZSA9IGNwdTJsZTE2KHBBZGRGcmFtZS0+VGltZU91dFZhbHVlKTsKLQotCWlmIChwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSAhPSBJTU1FRF9CQSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiUGVlckFkZEJBUmVxQWN0aW9uU2FuaXR5OiBBRERCQSBSZXNwb25zZSBCYSBQb2xpY3lbJWRdIG5vdCBzdXBwb3J0XG4iLCBwQWRkRnJhbWUtPkJhUGFybS5CQVBvbGljeSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gd2Ugc3VwcG9ydCBpbW1lZGlhdGUgQkEuCi0JaWYgKHBBZGRGcmFtZS0+QmFQYXJtLlRJRCAmMHhmZmYwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJQZWVyQWRkQkFSc3BBY3Rpb25TYW5pdHk6IEFEREJBIFJlc3BvbnNlIGluY29ycmVjdCBUSUQgPSAlZFxuIiwgcEFkZEZyYW1lLT5CYVBhcm0uVElEKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgV2NpZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiApCi17Ci0JLy9QRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUEZSQU1FX0RFTEJBX1JFUSAgcERlbEZyYW1lOwotCWlmIChNc2dMZW4gIT0gKHNpemVvZihGUkFNRV9ERUxCQV9SRVEpKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYgKFdjaWQgPj0gTUFYX0xFTl9PRl9NQUNfVEFCTEUpCi0JCXJldHVybiBGQUxTRTsKLQotCXBEZWxGcmFtZSA9IChQRlJBTUVfREVMQkFfUkVRKShwTXNnKTsKLQotCSooVVNIT1JUICopKCZwRGVsRnJhbWUtPkRlbGJhUGFybSkgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcERlbEZyYW1lLT5EZWxiYVBhcm0pKTsKLQlwRGVsRnJhbWUtPlJlYXNvbkNvZGUgPSBjcHUybGUxNihwRGVsRnJhbWUtPlJlYXNvbkNvZGUpOwotCi0JaWYgKHBEZWxGcmFtZS0+RGVsYmFQYXJtLlRJRCAmMHhmZmYwKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgSU4gVUNIQVIgIE1zZ0NoYW5uZWwsCi0gICAgT1VUIFBVQ0hBUiBwQWRkcjIsCi0gICAgT1VUIFBVQ0hBUiBwQnNzaWQsCi0gICAgT1VUIENIQVIgU3NpZFtdLAotICAgIE9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0gICAgT1VUIFVDSEFSICpwQnNzVHlwZSwKLSAgICBPVVQgVVNIT1JUICpwQmVhY29uUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqcENoYW5uZWwsCi0gICAgT1VUIFVDSEFSICpwTmV3Q2hhbm5lbCwKLSAgICBPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKLSAgICBPVVQgQ0ZfUEFSTSAqcENmUGFybSwKLSAgICBPVVQgVVNIT1JUICpwQXRpbVdpbiwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVDSEFSICpwRXJwLAotICAgIE9VVCBVQ0hBUiAqcER0aW1Db3VudCwKLSAgICBPVVQgVUNIQVIgKnBEdGltUGVyaW9kLAotICAgIE9VVCBVQ0hBUiAqcEJjYXN0RmxhZywKLSAgICBPVVQgVUNIQVIgKnBNZXNzYWdlVG9NZSwKLSAgICBPVVQgVUNIQVIgU3VwUmF0ZVtdLAotICAgIE9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0gICAgT1VUIFVDSEFSIEV4dFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotICAgIE9VVAlVQ0hBUiAqcENraXBGbGFnLAotICAgIE9VVAlVQ0hBUiAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLSAgICBPVVQgUEVEQ0FfUEFSTSAgICAgICBwRWRjYVBhcm0sCi0gICAgT1VUIFBRQlNTX0xPQURfUEFSTSAgcFFic3NMb2FkLAotICAgIE9VVCBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLSAgICBPVVQgVUxPTkcgKnBSYWxpbmtJZSwKLSAgICBPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICBPVVQgVUNIQVIJCSAqcFByZU5IdENhcGFiaWxpdHlMZW4sCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUIFVDSEFSCQkgKkFkZEh0SW5mb0xlbiwKLQlPVVQgQUREX0hUX0lORk9fSUUgKkFkZEh0SW5mbywKLQlPVVQgVUNIQVIgKk5ld0V4dENoYW5uZWxPZmZzZXQsCQkvLyBIdCBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQoYWJvdmUgb3IgYmVsb3cpCi0gICAgT1VUIFVTSE9SVCAqTGVuZ3RoVklFLAotICAgIE9VVAlQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCi17Ci0gICAgVUNIQVIJCQkJKlB0cjsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVQ0hBUgkJCQlUaW1MZW47Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgUEZSQU1FXzgwMl8xMQkJcEZyYW1lOwotICAgIFBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKLSAgICBVQ0hBUgkJCQlTdWJUeXBlOwotICAgIFVDSEFSCQkJCVNhbml0eTsKLSAgICAvL1VDSEFSCQkJCUVDV01pbiwgRUNXTWF4OwotICAgIC8vTUFDX0NTUjlfU1RSVUMJCUNzcjk7Ci0gICAgVUxPTkcJCQkJTGVuZ3RoID0gMDsKLQotCS8vIEZvciBzb21lIDExYSBBUCB3aGljaCBkaWRuJ3QgaGF2ZSBEU19JRSwgd2UgdXNlIHR3byBjb25kaXRpb25zIHRvIGRlY2lkZSB0aGUgY2hhbm5lbAotCS8vCTEuIElmIHRoZSBBUCBpcyAxMW4gZW5hYmxlZCwgdGhlbiBjaGVjayB0aGUgY29udHJvbCBjaGFubmVsLgotCS8vCTIuIElmIHRoZSBBUCBkaWRuJ3QgaGF2ZSBhbnkgaW5mbyBhYm91dCBjaGFubmVsLCB1c2UgdGhlIGNoYW5uZWwgd2UgcmVjZWl2ZWQgdGhpcyBmcmFtZSBhcyB0aGUgY2hhbm5lbC4gKE1heSBpbmFjY3VyYWN5ISEpCi0JVUNIQVIJCQlDdHJsQ2hhbm5lbCA9IDA7Ci0KLSAgICAvLyBBZGQgZm9yIDMgbmVjZXNzYXJ5IEVJRCBmaWVsZCBjaGVjawotICAgIFNhbml0eSA9IDA7Ci0KLSAgICAqcEF0aW1XaW4gPSAwOwotICAgICpwRXJwID0gMDsKLSAgICAqcER0aW1Db3VudCA9IDA7Ci0gICAgKnBEdGltUGVyaW9kID0gMDsKLSAgICAqcEJjYXN0RmxhZyA9IDA7Ci0gICAgKnBNZXNzYWdlVG9NZSA9IDA7Ci0gICAgKnBFeHRSYXRlTGVuID0gMDsKLSAgICAqcENraXBGbGFnID0gMDsJCQkgICAgICAgIC8vIERlZmF1bHQgb2YgQ2tpcEZsYWcgaXMgMAotICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gMHhGRjsgIC8vIERlZmF1bHQgb2YgQWlyb25ldENlbGxQb3dlckxpbWl0IGlzIDB4RkYKLSAgICAqTGVuZ3RoVklFID0gMDsJCQkJCS8vIFNldCB0aGUgbGVuZ3RoIG9mIFZJRSB0byBpbml0IHZhbHVlIDAKLSAgICAqcEh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgKkFkZEh0SW5mb0xlbiA9IDA7CQkJCQkvLyBTZXQgdGhlIGxlbmd0aCBvZiBWSUUgdG8gaW5pdCB2YWx1ZSAwCi0gICAgKnBSYWxpbmtJZSA9IDA7Ci0gICAgKnBOZXdDaGFubmVsID0gMDsKLSAgICAqTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7CS8vRGVmYXVsdCAweGZmIG1lYW5zIG5vIHN1Y2ggSUUKLSAgICBwQ2ZQYXJtLT5iVmFsaWQgPSBGQUxTRTsgICAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0NGIGZvdW5kCi0gICAgcFFic3NMb2FkLT5iVmFsaWQgPSBGQUxTRTsgICAgICAvLyBkZWZhdWx0OiBubyBJRV9RQlNTX0xPQUQgZm91bmQKLSAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOyAgICAgIC8vIGRlZmF1bHQ6IG5vIElFX0VEQ0FfUEFSQU1FVEVSIGZvdW5kCi0gICAgcFFvc0NhcGFiaWxpdHktPmJWYWxpZCA9IEZBTFNFOyAvLyBkZWZhdWx0OiBubyBJRV9RT1NfQ0FQQUJJTElUWSBmb3VuZAotCi0gICAgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0gICAgLy8gZ2V0IHN1YnR5cGUgZnJvbSBoZWFkZXIKLSAgICBTdWJUeXBlID0gKFVDSEFSKXBGcmFtZS0+SGRyLkZDLlN1YlR5cGU7Ci0KLSAgICAvLyBnZXQgQWRkcjIgYW5kIEJTU0lEIGZyb20gaGVhZGVyCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBDT1BZX01BQ19BRERSKHBCc3NpZCwgcEZyYW1lLT5IZHIuQWRkcjMpOwotCi0vLwloZXhfZHVtcCgiQmVhY29uIiwgTXNnLCBNc2dMZW4pOwotCi0gICAgUHRyID0gcEZyYW1lLT5PY3RldDsKLSAgICBMZW5ndGggKz0gTEVOR1RIXzgwMl8xMTsKLQotICAgIC8vIGdldCB0aW1lc3RhbXAgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFRpbWVzdGFtcCwgUHRyLCBUSU1FU1RBTVBfTEVOKTsKLQotCXBUaW1lc3RhbXAtPnUuTG93UGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuTG93UGFydCk7Ci0JcFRpbWVzdGFtcC0+dS5IaWdoUGFydCA9IGNwdTJsZTMyKHBUaW1lc3RhbXAtPnUuSGlnaFBhcnQpOwotCi0gICAgUHRyICs9IFRJTUVTVEFNUF9MRU47Ci0gICAgTGVuZ3RoICs9IFRJTUVTVEFNUF9MRU47Ci0KLSAgICAvLyBnZXQgYmVhY29uIGludGVydmFsIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBCZWFjb25QZXJpb2QsIFB0ciwgMik7Ci0gICAgUHRyICs9IDI7Ci0gICAgTGVuZ3RoICs9IDI7Ci0KLSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLSAgICBMZW5ndGggKz0gMjsKLQotICAgIGlmIChDQVBfSVNfRVNTX09OKCpwQ2FwYWJpbGl0eUluZm8pKQotICAgICAgICAqcEJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0gICAgZWxzZQotICAgICAgICAqcEJzc1R5cGUgPSBCU1NfQURIT0M7Ci0KLSAgICBwRWlkID0gKFBFSURfU1RSVUNUKSBQdHI7Ci0KLSAgICAvLyBnZXQgdmFyaWFibGUgZmllbGRzIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIHdoaWxlICgoTGVuZ3RoICsgMiArIHBFaWQtPkxlbikgPD0gTXNnTGVuKQotICAgIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gU2VjdXJlIGNvcHkgVklFIHRvIFZhcklFW01BWF9WSUVfTEVOXSBkaWRuJ3Qgb3ZlcmZsb3cuCi0gICAgICAgIC8vCi0gICAgICAgIGlmICgoKkxlbmd0aFZJRSArIHBFaWQtPkxlbiArIDIpID49IE1BWF9WSUVfTEVOKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIFZhcmlhYmxlIElFcyBvdXQgb2YgcmVzb3VyY2UgW2xlbig9JWQpID4gTUFYX1ZJRV9MRU4oPSVkKV1cbiIsCi0gICAgICAgICAgICAgICAgICAgICgqTGVuZ3RoVklFICsgcEVpZC0+TGVuICsgMiksIE1BWF9WSUVfTEVOKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChwRWlkLT5FaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgSUVfU1NJRDoKLSAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IGhhcyBvbmUgU1NJRCBFSUQgaW4gdGhpcyBiZWFjb24sIGlnbm9yZSB0aGUgc2Vjb25kIG9uZQotICAgICAgICAgICAgICAgIGlmIChTYW5pdHkgJiAweDEpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA8PSBNQVhfTEVOX09GX1NTSUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBTc2lkTGVuID0gcEVpZC0+TGVuOwotICAgICAgICAgICAgICAgICAgICBTYW5pdHkgfD0gMHgxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TU0lEIChsZW49JWQpXG4iLHBFaWQtPkxlbikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4MjsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwU3VwUmF0ZUxlbiA9IHBFaWQtPkxlbjsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBTdXBSYXRlLCBwU3VwUmF0ZUxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX1NVUFBfUkFURVMgKGxlbj0lZClcbiIscEVpZC0+TGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgotCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsJLy8gTm5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCi0KLQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJewotCQkJCQlFWFRfSFRfQ0FQX0lORk8gZXh0SHRDYXBJbmZvOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pLCAoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCX0KLSNlbHNlCi0JCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7Ci0jZW5kaWYgLy8gVU5BTElHTk1FTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkJCSpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IDA7CS8vIE5vdyB3ZSBvbmx5IHN1cHBvcnQgMjYgYnl0ZXMuCi0KLQkJCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7Ci0JCQkJCSpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gcEVpZC0+TGVuID0gJWRcbiIsIHBFaWQtPkxlbikpOwotCQkJfQotCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9BRERfSFQ6Ci0JCQlpZiAocEVpZC0+TGVuID49IHNpemVvZihBRERfSFRfSU5GT19JRSkpCi0JCQl7Ci0JCQkJLy8gVGhpcyBJRSBhbGxvd3MgZXh0ZW5zaW9uLCBidXQgd2UgY2FuIGlnbm9yZSBleHRyYSBieXRlcyBiZXlvbmQgb3VyIGtub3dsZWRnZSAsIHNvIG9ubHkKLQkJCQkvLyBjb3B5IGZpcnN0IHNpemVvZihBRERfSFRfSU5GT19JRSkKLQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQkJCQkqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKLQotCQkJCUN0cmxDaGFubmVsID0gQWRkSHRJbmZvLT5Db250cm9sQ2hhbjsKLQotCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzIpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMikpOwotCQkJCSooVVNIT1JUICopKCZBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkFkZEh0SW5mby0+QWRkSHRJbmZvMykpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKLQkJCSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLQkJCSAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9BRERfSFQuIFxuIikpOwotCQkJfQotCi0JCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUOgotCQkJaWYgKHBFaWQtPkxlbiA9PSAxKQotCQkJewotCQkJCSpOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKLQkJCX0KLQotCQlicmVhazsKLSAgICAgICAgICAgIGNhc2UgSUVfRkhfUEFSTToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkoSUVfRkhfUEFSTSkgXG4iKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfRFNfUEFSTToKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwQ2hhbm5lbCA9ICpwRWlkLT5PY3RldDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQkJewotCQkJCQkJaWYgKENoYW5uZWxTYW5pdHkocEFkLCAqcENoYW5uZWwpID09IDApCi0JCQkJCQl7Ci0KLQkJCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICAgICAgU2FuaXR5IHw9IDB4NDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfRFNfUEFSTSAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9DRl9QQVJNOgotICAgICAgICAgICAgICAgIGlmKHBFaWQtPkxlbiA9PSA2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+YlZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwQ291bnQgPSBwRWlkLT5PY3RldFswXTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwUGVyaW9kID0gcEVpZC0+T2N0ZXRbMV07Ci0gICAgICAgICAgICAgICAgICAgIHBDZlBhcm0tPkNmcE1heER1cmF0aW9uID0gcEVpZC0+T2N0ZXRbMl0gKyAyNTYgKiBwRWlkLT5PY3RldFszXTsKLSAgICAgICAgICAgICAgICAgICAgcENmUGFybS0+Q2ZwRHVyUmVtYWluaW5nID0gcEVpZC0+T2N0ZXRbNF0gKyAyNTYgKiBwRWlkLT5PY3RldFs1XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfQ0ZfUEFSTVxuIikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0lCU1NfUEFSTToKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBdGltV2luLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfSUJTU19QQVJNXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICAgICAgICAgIGNhc2UgSUVfVElNOgotICAgICAgICAgICAgICAgIGlmKElORlJBX09OKHBBZCkgJiYgU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdldFRpbUJpdCgoUENIQVIpcEVpZCwgcEFkLT5TdGFBY3RpdmUuQWlkLCAmVGltTGVuLCBwQmNhc3RGbGFnLCBwRHRpbUNvdW50LCBwRHRpbVBlcmlvZCwgcE1lc3NhZ2VUb01lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgICAgICAgICBjYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKLSAgICAgICAgICAgICAgICBpZihwRWlkLT5MZW4gPT0gMykKLSAgICAgICAgICAgICAgICB7Ci0JCQkqcE5ld0NoYW5uZWwgPSBwRWlkLT5PY3RldFsxXTsJLy9leHRyYWN0IG5ldyBjaGFubmVsIG51bWJlcgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gTmV3IGZvciBXUEEKLSAgICAgICAgICAgIC8vIENDWCB2MiBoYXMgdGhlIHNhbWUgSUUsIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCB0b28KLSAgICAgICAgICAgIC8vIFdpZmkgV01NIHVzZSB0aGUgc2FtZSBJRSB2YWxlLCBuZWVkIHRvIHBhcnNlIHRoYXQgdG9vCi0gICAgICAgICAgICAvLyBjYXNlIElFX1dQQToKLSAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgotICAgICAgICAgICAgICAgIC8vIENoZWNrIEJyb2FkY29tL0F0aGVyb3MgODAyLjExbiBPVUkgdmVyc2lvbiwgZm9yIEhUIENhcGFiaWxpdHkgSUUuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBIVCBJRSBpcyBiZWZvcmUgSUVFRSBkcmFmdCBzZXQgSFQgSUUgdmFsdWUuMjAwNi0wOS0yOCBieSBKYW4uCi0gICAgICAgICAgICAgICAgLyppZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBCUk9BRENPTV9PVUksIDMpICYmIChwRWlkLT5MZW4gPj0gNCkpCi0gICAgICAgICAgICAgICAgewotCQkJaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfQlJPQURDT01fSFQpICYmIChwRWlkLT5MZW4gPj0gMzApKQotCQkJewotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgJnBFaWQtPk9jdGV0WzRdLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKHBFaWQtPk9jdGV0WzNdID09IE9VSV9CUk9BRENPTV9IVCkgJiYgKHBFaWQtPkxlbiA+PSAyNikpCi0JCQl7Ci0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0JCQkJCSpBZGRIdEluZm9MZW4gPSBTSVpFX0FERF9IVF9JTkZPX0lFOwkvLyBObm93IHdlIG9ubHkgc3VwcG9ydCAyNiBieXRlcy4KLQkJCQl9Ci0JCQl9Ci0gICAgICAgICAgICAgICAgfQotCQkJCSovCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIE9VSSB2ZXJzaW9uLCBmaWx0ZXIgb3V0IG5vbi1zdGFuZGFyZCB1c2FnZQotICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFJBTElOS19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLypwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBFaWQtPk9jdGV0WzNdICE9IDApCi0JCQkJCSpwUmFsaW5rSWUgPSBwRWlkLT5PY3RldFszXTsKLQkJCQllbHNlCi0JCQkJCSpwUmFsaW5rSWUgPSAweGYwMDAwMDAwOyAvLyBTZXQgdG8gbm9uLXplcm8gdmFsdWUgKGNhbid0IHNldCBiaXQwLTIpIHRvIHJlcHJlc2VudCB0aGlzIGlzIFJhbGluayBDaGlwLiBTbyBhdCBsaW5rdXAsIHdlIHdpbGwgc2V0IHJhbGlua2NoaXAgZmxhZy4KLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vIFRoaXMgSFQgSUUgaXMgYmVmb3JlIElFRUUgZHJhZnQgc2V0IEhUIElFIHZhbHVlLjIwMDYtMDktMjggYnkgSmFuLgotCi0gICAgICAgICAgICAgICAgLy8gT3RoZXIgdmVuZG9ycyBoYWQgcHJvZHVjdGlvbiBiZWZvcmUgSUVfSFRfQ0FQIHZhbHVlIGlzIGFzc2lnbmVkLiBUbyBiYWNrd2FyZCBzdXBwb3J0IHRob3NlIG9sZC1maXJtd2FyZSBBUCwKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBicm9hZGNvbS1kZWZpZW5kIHByZS04MDIuMTFuRDEuMCBPVUkgZm9yIEhUIHJlbGF0ZWQgSUUsIGluY2x1ZGluZyBIVCBDYXBhdGlsaXRpZXMgSUUgYW5kIEhUIEluZm9ybWF0aW9uIElFCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKCpwSHRDYXBhYmlsaXR5TGVuID09IDApICYmIE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgUFJFX05fSFRfT1VJLCAzKSAmJiAocEVpZC0+TGVuID49IDQpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocEVpZC0+T2N0ZXRbM10gPT0gT1VJX1BSRU5fSFRfQ0FQKSAmJiAocEVpZC0+TGVuID49IDMwKSAmJiAoKnBIdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBIdENhcGFiaWxpdHksICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwUHJlTkh0Q2FwYWJpbGl0eUxlbiA9IFNJWkVfSFRfQ0FQX0lFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRWlkLT5PY3RldFszXSA9PSBPVUlfUFJFTl9BRERfSFQpICYmIChwRWlkLT5MZW4gPj0gMjYpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShBZGRIdEluZm8sICZwRWlkLT5PY3RldFs0XSwgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0byBwVklFIHdoaWNoIHdpbGwgcmVwb3J0IHRvIG1pY3Jvc29mdCBic3NpZCBsaXN0LgotICAgICAgICAgICAgICAgICAgICBQdHIgPSAoUFVDSEFSKSBwVklFOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgKkxlbmd0aFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV01FX1BBUk1fRUxFTSwgNikgJiYgKHBFaWQtPkxlbiA9PSAyNCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBQVUNIQVIgcHRyOwotICAgICAgICAgICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwYXJzaW5nIEVEQ0EgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJWYWxpZCAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlFBY2sgICAgICAgICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgxMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iUXVldWVSZXF1ZXN0ICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDIwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJUeG9wUmVxdWVzdCAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4NDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+RWRjYVVwZGF0ZUNvdW50ID0gcEVpZC0+T2N0ZXRbNl0gJiAweDBmOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBUFNEQ2FwYWJsZSAgICA9IChwRWlkLT5PY3RldFs2XSAmIDB4ODApID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIHB0ciA9ICZwRWlkLT5PY3RldFs4XTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBhY2kgPSAoKnB0ciAmIDB4NjApID4+IDU7IC8vIGI1fjYgaXMgQUMgSU5ERVgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVthY2ldICA9ICgoKCpwdHIpICYgMHgxMCkgPT0gMHgxMCk7ICAgLy8gYjUgaXMgQUNNCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW2FjaV0gPSAoKnB0cikgJiAweDBmOyAgICAgICAgICAgICAgIC8vIGIwfjMgaXMgQUlGU04KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bYWNpXSA9ICoocHRyKzEpICYgMHgwZjsgICAgICAgICAgICAgLy8gYjB+NCBpcyBDd21pbgotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFthY2ldID0gKihwdHIrMSkgPj4gNDsgICAgICAgICAgICAgICAvLyBiNX44IGlzIEN3bWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPlR4b3BbYWNpXSAgPSAqKHB0cisyKSArIDI1NiAqICgqKHB0ciszKSk7IC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA0OyAvLyBwb2ludCB0byBuZXh0IEFDCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBXTUVfSU5GT19FTEVNLCA2KSAmJiAocEVpZC0+TGVuID09IDcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkVkY2FVcGRhdGVDb3VudCA9IHBFaWQtPk9jdGV0WzZdICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQVBTRENhcGFibGUgICAgPSAocEVpZC0+T2N0ZXRbNl0gJiAweDgwKSA/IDEgOiAwOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkZWZhdWx0IEVEQ0EgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfQkVdICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX0JFXSA9IDM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX0JFXSA9IENXX01JTl9JTl9CSVRTOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWF4W1FJRF9BQ19CRV0gPSBDV19NQVhfSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW1FJRF9BQ19CRV0gID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bUUlEX0FDX0JLXSAgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkFpZnNuW1FJRF9BQ19CS10gPSA3OwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW1FJRF9BQ19CS10gPSBDV19NSU5fSU5fQklUUzsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfQktdID0gQ1dfTUFYX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfQktdICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iQUNNW1FJRF9BQ19WSV0gID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzbltRSURfQUNfVkldID0gMjsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21pbltRSURfQUNfVkldID0gQ1dfTUlOX0lOX0JJVFMtMTsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5Dd21heFtRSURfQUNfVkldID0gQ1dfTUFYX0lOX0JJVFM7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVkldICA9IDk2OyAgIC8vIEFDX1ZJOiA5NiozMnVzIH49IDNtcwotCi0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFDTVtRSURfQUNfVk9dICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+QWlmc25bUUlEX0FDX1ZPXSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtaW5bUUlEX0FDX1ZPXSA9IENXX01JTl9JTl9CSVRTLTI7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbUUlEX0FDX1ZPXSA9IENXX01BWF9JTl9CSVRTLTE7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+VHhvcFtRSURfQUNfVk9dICA9IDQ4OyAgIC8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0gICAgICAgICAgICAgICAgfQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoRXh0UmF0ZSwgcEVpZC0+T2N0ZXQsIHBFaWQtPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwRXh0UmF0ZUxlbiA9IHBFaWQtPkxlbjsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiAyMDA0LTA5LTE0IG5vdCBhIGdvb2QgZGVzaWduIGhlcmUsIGNhdXNlIGl0IGV4Y2x1ZGUgZXh0cmEgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBTY2FuVGFiLiBXZSBzaG91bGQgcmVwb3J0IGFzIGlzLiBBbmQgZmlsdGVyIG91dCB1bnN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICAvLyByYXRlcyBpbiBNbG1lQXV4LgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gUlRNUENoZWNrUmF0ZXMocEFkLCBFeHRSYXRlLCBwRXh0UmF0ZUxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIElFX0VSUDoKLSAgICAgICAgICAgICAgICBpZiAocEVpZC0+TGVuID09IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcEVycCA9IChVQ0hBUilwRWlkLT5PY3RldFswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfQUlST05FVF9DS0lQOgotICAgICAgICAgICAgICAgIC8vIDAuIENoZWNrIEFpcm9uZXQgSUUgbGVuZ3RoLCBpdCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byAyOAotICAgICAgICAgICAgICAgIC8vIENpc2NvIEFQMzUwIHVzZWQgbGVuZ3RoIGFzIDI4Ci0gICAgICAgICAgICAgICAgLy8gQ2lzY28gQVAxMlhYIHVzZWQgbGVuZ3RoIGFzIDMwCi0gICAgICAgICAgICAgICAgaWYgKHBFaWQtPkxlbiA8IChDS0lQX05FR09USUFUSU9OX0xFTkdUSCAtIDIpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8vIDEuIENvcHkgQ0tJUCBmbGFnIGJ5dGUgdG8gYnVmZmVyIGZvciBwcm9jZXNzCi0gICAgICAgICAgICAgICAgKnBDa2lwRmxhZyA9ICoocEVpZC0+T2N0ZXQgKyA4KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJRV9BUF9UWF9QT1dFUjoKLSAgICAgICAgICAgICAgICAvLyBBUCBDb250cm9sIG9mIENsaWVudCBUcmFuc21pdCBQb3dlcgotICAgICAgICAgICAgICAgIC8vMC4gQ2hlY2sgQWlyb25ldCBJRSBsZW5ndGgsIGl0IG11c3QgYmUgNgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gIT0gMHgwNikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgY2VsbCBwb3dlciBsaW1pdCBpbiBkQm0KLSAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0LCBDSVNDT19PVUksIDMpID09IDEpCi0gICAgICAgICAgICAgICAgICAgICpwQWlyb25ldENlbGxQb3dlckxpbWl0ID0gKihwRWlkLT5PY3RldCArIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBXUEEyICYgODAyLjExaSBSU04KLSAgICAgICAgICAgIGNhc2UgSUVfUlNOOgotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIE9VSSBmb3IgdmVyc2lvbiBhbnltb3JlLCBjaGVjayB0aGUgZ3JvdXAgY2lwaGVyIE9VSSBiZWZvcmUgY29weWluZwotICAgICAgICAgICAgICAgIGlmIChSVE1QRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdG8gcFZJRSB3aGljaCB3aWxsIHJlcG9ydCB0byBtaWNyb3NvZnQgYnNzaWQgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgUHRyID0gKFBVQ0hBUikgcFZJRTsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUHRyICsgKkxlbmd0aFZJRSwgJnBFaWQtPkVpZCwgcEVpZC0+TGVuICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICpMZW5ndGhWSUUgKz0gKHBFaWQtPkxlbiArIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCQljYXNlIElFX0NPVU5UUlk6Ci0JCQkJUHRyID0gKFBVQ0hBUikgcFZJRTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShQdHIgKyAqTGVuZ3RoVklFLCAmcEVpZC0+RWlkLCBwRWlkLT5MZW4gKyAyKTsKLSAgICAgICAgICAgICAgICAqTGVuZ3RoVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQlicmVhazsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQotICAgICAgICBwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLSAgICB9Ci0KLSAgICAvLyBGb3Igc29tZSAxMWEgQVAuIGl0IGRpZCBub3QgaGF2ZSB0aGUgY2hhbm5lbCBFSUQsIHBhdGNoIGhlcmUKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJVUNIQVIgTGF0Y2hSZkNoYW5uZWwgPSBNc2dDaGFubmVsOwotCQlpZiAoKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KSAmJiAoKFNhbml0eSAmIDB4NCkgPT0gMCkpCi0JCXsKLQkJCWlmIChDdHJsQ2hhbm5lbCAhPSAwKQotCQkJCSpwQ2hhbm5lbCA9IEN0cmxDaGFubmVsOwotCQkJZWxzZQotCQkJCSpwQ2hhbm5lbCA9IExhdGNoUmZDaGFubmVsOwotCQkJU2FuaXR5IHw9IDB4NDsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCWlmIChTYW5pdHkgIT0gMHg3KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfTE9VRCwgKCJQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkgLSBtaXNzaW5nIGZpZWxkLCBTYW5pdHk9MHglMDJ4XG4iLCBTYW5pdHkpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLX0KLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjayBmb3Igc29tZSBJRSBhZGRyZXNzZWQgIGluIDgwMi4xMW4gZDMuMDMuCi0JUmV0dXJuOgotCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5MigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBVQ0hBUgkqUmVnQ2xhc3MpCi17Ci0JQ0hBUgkJCQkqUHRyOwotCVBGUkFNRV84MDJfMTEJCXBGcmFtZTsKLQlQRUlEX1NUUlVDVAkJCXBFaWQ7Ci0JVUxPTkcJCQkJTGVuZ3RoID0gMDsKLQotCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKLQotCSpSZWdDbGFzcyA9IDA7Ci0JUHRyID0gKFBDSEFSKSBwRnJhbWUtPk9jdGV0OwotCUxlbmd0aCArPSBMRU5HVEhfODAyXzExOwotCi0JLy8gZ2V0IHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLQlQdHIgKz0gVElNRVNUQU1QX0xFTjsKLQlMZW5ndGggKz0gVElNRVNUQU1QX0xFTjsKLQotCS8vIGdldCBiZWFjb24gaW50ZXJ2YWwgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0JUHRyICs9IDI7Ci0JTGVuZ3RoICs9IDI7Ci0KLQkvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotCVB0ciArPSAyOwotCUxlbmd0aCArPSAyOwotCi0JcEVpZCA9IChQRUlEX1NUUlVDVCkgUHRyOwotCi0JLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLQl3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKLQl7Ci0JCXN3aXRjaChwRWlkLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfU1VQUF9SRUdfQ0xBU1M6Ci0JCQkJaWYocEVpZC0+TGVuID4gMCkKLQkJCQl7Ci0JCQkJCSpSZWdDbGFzcyA9ICpwRWlkLT5PY3RldDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkFuZFByb2JlUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1NJRCAobGVuPSVkKVxuIixwRWlkLT5MZW4pKTsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCi0JCUxlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47ICAvLyBFaWRbMV0gKyBMZW5bMV0rIGNvbnRlbnRbTGVuXQotCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLQotfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lU2NhblJlcVNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpNc2csCi0JSU4gVUxPTkcgTXNnTGVuLAotCU9VVCBVQ0hBUiAqcEJzc1R5cGUsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0JT1VUIFVDSEFSICpwU2NhblR5cGUpCi17Ci0JTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKkluZm87Ci0KLQlJbmZvID0gKE1MTUVfU0NBTl9SRVFfU1RSVUNUICopKE1zZyk7Ci0JKnBCc3NUeXBlID0gSW5mby0+QnNzVHlwZTsKLQkqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOwotCU5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7Ci0JKnBTY2FuVHlwZSA9IEluZm8tPlNjYW5UeXBlOwotCi0JaWYgKCgqcEJzc1R5cGUgPT0gQlNTX0lORlJBIHx8ICpwQnNzVHlwZSA9PSBCU1NfQURIT0MgfHwgKnBCc3NUeXBlID09IEJTU19BTlkpCi0JCSYmICgqcFNjYW5UeXBlID09IFNDQU5fQUNUSVZFIHx8ICpwU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCSkpCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFTYW5pdHkgZmFpbCAtIHdyb25nIEJzc1R5cGUgb3IgU2NhblR5cGVcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1VQ0hBUiBDaGFubmVsU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFVDSEFSIGNoYW5uZWwpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSArKykKLSAgICB7Ci0gICAgICAgIGlmIChjaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUGVlckRlYXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBSZWFzb24pCi17Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBSZWFzb24sICZwRnJhbWUtPk9jdGV0WzBdLCAyKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyQXV0aFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIsCi0gICAgT1VUIFVTSE9SVCAqcEFsZywKLSAgICBPVVQgVVNIT1JUICpwU2VxLAotICAgIE9VVCBVU0hPUlQgKnBTdGF0dXMsCi0gICAgQ0hBUiAqcENobGdUZXh0KQotewotICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0gICAgQ09QWV9NQUNfQUREUihwQWRkciwgICBwRnJhbWUtPkhkci5BZGRyMik7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFsZywgICAgJnBGcmFtZS0+T2N0ZXRbMF0sIDIpOwotICAgIE5kaXNNb3ZlTWVtb3J5KHBTZXEsICAgICZwRnJhbWUtPk9jdGV0WzJdLCAyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwU3RhdHVzLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7Ci0KLSAgICBpZiAoKnBBbGcgPT0gQVVUSF9NT0RFX09QRU4pCi0gICAgewotICAgICAgICBpZiAoKnBTZXEgPT0gMSB8fCAqcFNlcSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBdXRoU2FuaXR5IGZhaWwgLSB3cm9uZyBTZWcjXG4iKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoKnBBbGcgPT0gQVVUSF9NT0RFX0tFWSkKLSAgICB7Ci0gICAgICAgIGlmICgqcFNlcSA9PSAxIHx8ICpwU2VxID09IDQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCpwU2VxID09IDIgfHwgKnBTZXEgPT0gMykKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocENobGdUZXh0LCAmcEZyYW1lLT5PY3RldFs4XSwgQ0lQSEVSX1RFWFRfTEVOKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckF1dGhTYW5pdHkgZmFpbCAtIHdyb25nIFNlZyNcbiIpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXV0aFNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTWxtZUF1dGhSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyLAotICAgIE9VVCBVTE9ORyAqcFRpbWVvdXQsCi0gICAgT1VUIFVTSE9SVCAqcEFsZykKLXsKLSAgICBNTE1FX0FVVEhfUkVRX1NUUlVDVCAqcEluZm87Ci0KLSAgICBwSW5mbyAgPSAoTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKilNc2c7Ci0gICAgQ09QWV9NQUNfQUREUihwQWRkciwgcEluZm8tPkFkZHIpOwotICAgICpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OwotICAgICpwQWxnID0gcEluZm8tPkFsZzsKLQotICAgIGlmICgoKCpwQWxnID09IEFVVEhfTU9ERV9LRVkpIHx8KCpwQWxnID09IEFVVEhfTU9ERV9PUEVOKQotCSkgJiYKLSAgICAgICAgKCgqcEFkZHIgJiAweDAxKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lQXV0aFJlcVNhbml0eSBmYWlsIC0gd3JvbmcgYWxnb3JpdGhtXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE1sbWVBc3NvY1JlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFwQWRkciwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVMT05HICpwVGltZW91dCwKLSAgICBPVVQgVVNIT1JUICpwTGlzdGVuSW50dikKLXsKLSAgICBNTE1FX0FTU09DX1JFUV9TVFJVQ1QgKnBJbmZvOwotCi0gICAgcEluZm8gPSAoTUxNRV9BU1NPQ19SRVFfU1RSVUNUICopTXNnOwotICAgICpwVGltZW91dCA9IHBJbmZvLT5UaW1lb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dAotICAgIENPUFlfTUFDX0FERFIocEFwQWRkciwgcEluZm8tPkFkZHIpOyAgICAgICAgICAgICAgICAgICAvLyBBUCBhZGRyZXNzCi0gICAgKnBDYXBhYmlsaXR5SW5mbyA9IHBJbmZvLT5DYXBhYmlsaXR5SW5mbzsgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IGluZm8KLSAgICAqcExpc3RlbkludHYgPSBwSW5mby0+TGlzdGVuSW50djsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIE1MTUUgbWVzc2FnZSBzYW5pdHkgY2hlY2sKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyRGlzYXNzb2NTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBBZGRyMiwKLSAgICBPVVQgVVNIT1JUICpwUmVhc29uKQotewotICAgIFBGUkFNRV84MDJfMTEgcEZyYW1lID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCi0gICAgQ09QWV9NQUNfQUREUihwQWRkcjIsIHBGcmFtZS0+SGRyLkFkZHIyKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwUmVhc29uLCAmcEZyYW1lLT5PY3RldFswXSwgMik7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTYW5pdHkgY2hlY2sgTmV0d29ya1R5cGUgKDExYiwgMTFnIG9yIDExYSkKLQotCUFyZ3VtZW50czoKLQkJcEJzcyAtIFBvaW50ZXIgdG8gQlNTIHRhYmxlLgotCi0JUmV0dXJuIFZhbHVlOgotICAgICAgICBOZGlzODAyXzExRFMgLi4uLi4uLigxMWIpCi0gICAgICAgIE5kaXM4MDJfMTFPRkRNMjQuLi4uKDExZykKLSAgICAgICAgTmRpczgwMl8xMU9GRE01Li4uLi4oMTFhKQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eSgKLSAgICBJTiBQQlNTX0VOVFJZIHBCc3MpCi17Ci0JTkRJU184MDJfMTFfTkVUV09SS19UWVBFCU5ldFdvcmtUeXBlOwotCVVDSEFSCQkJCQkJcmF0ZSwgaTsKLQotCU5ldFdvcmtUeXBlID0gTmRpczgwMl8xMURTOwotCi0JaWYgKHBCc3MtPkNoYW5uZWwgPD0gMTQpCi0JewotCQkvLwotCQkvLyBGaXJzdCBjaGVjayBzdXBwb3J0IFJhdGUuCi0JCS8vCi0JCWZvciAoaSA9IDA7IGkgPCBwQnNzLT5TdXBSYXRlTGVuOyBpKyspCi0JCXsKLQkJCXJhdGUgPSBwQnNzLT5TdXBSYXRlW2ldICYgMHg3ZjsgLy8gTWFzayBvdXQgYmFzaWMgcmF0ZSBzZXQgYml0Ci0JCQlpZiAoKHJhdGUgPT0gMikgfHwgKHJhdGUgPT0gNCkgfHwgKHJhdGUgPT0gMTEpIHx8IChyYXRlID09IDIyKSkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLwotCQkJCS8vIE90aGVyd2lzZSAoZXZlbiByYXRlID4gMTA4KSBtZWFucyBOZGlzODAyXzExT0ZETTI0Ci0JCQkJLy8KLQkJCQlOZXRXb3JrVHlwZSA9IE5kaXM4MDJfMTFPRkRNMjQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLwotCQkvLyBTZWNvbmQgY2hlY2sgRXh0ZW5kIFJhdGUuCi0JCS8vCi0JCWlmIChOZXRXb3JrVHlwZSAhPSBOZGlzODAyXzExT0ZETTI0KQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcEJzcy0+RXh0UmF0ZUxlbjsgaSsrKQotCQkJewotCQkJCXJhdGUgPSBwQnNzLT5TdXBSYXRlW2ldICYgMHg3ZjsgLy8gTWFzayBvdXQgYmFzaWMgcmF0ZSBzZXQgYml0Ci0JCQkJaWYgKChyYXRlID09IDIpIHx8IChyYXRlID09IDQpIHx8IChyYXRlID09IDExKSB8fCAocmF0ZSA9PSAyMikpCi0JCQkJewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8KLQkJCQkJLy8gT3RoZXJ3aXNlIChldmVuIHJhdGUgPiAxMDgpIG1lYW5zIE5kaXM4MDJfMTFPRkRNMjQKLQkJCQkJLy8KLQkJCQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTI0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJTmV0V29ya1R5cGUgPSBOZGlzODAyXzExT0ZETTU7Ci0JfQotCi0gICAgaWYgKHBCc3MtPkh0Q2FwYWJpbGl0eUxlbiAhPSAwKQotICAgIHsKLSAgICAgICAgaWYgKE5ldFdvcmtUeXBlID09IE5kaXM4MDJfMTFPRkRNNSkKLSAgICAgICAgICAgIE5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE01X047Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIE5ldFdvcmtUeXBlID0gTmRpczgwMl8xMU9GRE0yNF9OOwotICAgIH0KLQotCXJldHVybiBOZXRXb3JrVHlwZTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHJlY2VpdmVkIEVBUG9MIGZyYW1lCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywKLSAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKLSAgICBJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0gICAgSU4JUEVBUE9MX1BBQ0tFVAkJcE1zZywKLSAgICBJTglVTE9ORwkJCQlNc2dMZW4sCi0gICAgSU4JVUNIQVIJCQkJTXNnVHlwZSwKLSAgICBJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpCi17Ci0JVUNIQVIJCQltaWNbTEVOX0tFWV9ERVNDX01JQ10sIGRpZ2VzdFs4MF0sIEtFWURBVEFbTUFYX0xFTl9PRl9SU05JRV07Ci0JQk9PTEVBTgkJCWJSZXBsYXlEaWZmID0gRkFMU0U7Ci0JQk9PTEVBTgkJCWJXUEEyID0gRkFMU0U7Ci0JS0VZX0lORk8JCUVhcG9sS2V5SW5mbzsKLQlVQ0hBUgkJCUdyb3VwS2V5SW5kZXggPSAwOwotCi0KLQlOZGlzWmVyb01lbW9yeShtaWMsIHNpemVvZihtaWMpKTsKLQlOZGlzWmVyb01lbW9yeShkaWdlc3QsIHNpemVvZihkaWdlc3QpKTsKLQlOZGlzWmVyb01lbW9yeShLRVlEQVRBLCBzaXplb2YoS0VZREFUQSkpOwotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJkVhcG9sS2V5SW5mbywgc2l6ZW9mKEVhcG9sS2V5SW5mbykpOwotCi0JTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmRWFwb2xLZXlJbmZvLCAoUFVDSEFSKSZwTXNnLT5LZXlEZXNjLktleUluZm8sIHNpemVvZihLRVlfSU5GTykpOwotCi0JKigoVVNIT1JUICopJkVhcG9sS2V5SW5mbykgPSBjcHUybGUxNigqKChVU0hPUlQgKikmRWFwb2xLZXlJbmZvKSk7Ci0KLQkvLyBDaG9vc2UgV1BBMiBvciBub3QKLQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCWJXUEEyID0gVFJVRTsKLQotCS8vIDAuIENoZWNrIE1zZ1R5cGUKLQlpZiAoKE1zZ1R5cGUgPiBFQVBPTF9HUk9VUF9NU0dfMikgfHwgKE1zZ1R5cGUgPCBFQVBPTF9QQUlSX01TR18xKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZCglZCkhIFxuIiwgTXNnVHlwZSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gMS4gUmVwbGF5IGNvdW50ZXIgY2hlY2sKLQlpZiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18xIHx8IE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyB8fCBNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKQkvLyBGb3Igc3VwcGxpY2FudAotICAgIHsKLQkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlci4KLQkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgotCQlVQ0hBUglaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOwotCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KFplcm9SZXBsYXksIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpICE9IDEpICYmCi0JCQkoUlRNUENvbXBhcmVNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKLQl7Ci0JCQliUmVwbGF5RGlmZiA9IFRSVUU7Ci0JfQotCX0KLQllbHNlIGlmIChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzIgfHwgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR180IHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzIpCS8vIEZvciBhdXRoZW50aWNhdG9yCi0JewotCQkvLyBjaGVjayBSZXBsYXkgQ291bnRlciBjb3Jlc3BvbmRzIHRvIE1TRyBmcm9tIGF1dGhlbnRpY2F0b3IsIG90aGVyd2lzZSBkaXNjYXJkCi0JaWYgKCFOZGlzRXF1YWxNZW1vcnkocE1zZy0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwRW50cnktPlJfQ291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkpCi0JewotCQkJYlJlcGxheURpZmYgPSBUUlVFOwotCX0KLQl9Ci0KLQkvLyBSZXBsYXkgQ291bnRlciBkaWZmZXJlbnQgY29uZGl0aW9uCi0JaWYgKGJSZXBsYXlEaWZmKQotCXsKLQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciByZXBsYXkgY291bnRlciBkaWZmZXJlbnQKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfUkVQTEFZX0NPVU5URVJfRElGRl9FVkVOVF9GTEFHLCBwRW50cnktPkFkZHIsIHBFbnRyeS0+YXBpZHgsIDApOwotCi0JCWlmIChNc2dUeXBlIDwgRUFQT0xfR1JPVVBfTVNHXzEpCi0JCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVwbGF5IENvdW50ZXIgRGlmZmVyZW50IGluIHBhaXJ3aXNlIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXBsYXkgQ291bnRlciBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKLQkJfQotCi0JCWhleF9kdW1wKCJSZWNlaXZlIHJlcGxheSBjb3VudGVyICIsIHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCWhleF9kdW1wKCJDdXJyZW50IHJlcGxheSBjb3VudGVyICIsIHBFbnRyeS0+Ul9Db3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vIDIuIFZlcmlmeSBNSUMgZXhjZXB0IFBhaXJ3aXNlIE1zZzEKLQlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQotCXsKLQkJVUNIQVIJCQlyY3ZkX21pY1tMRU5fS0VZX0RFU0NfTUlDXTsKLQotCQkvLyBSZWNvcmQgdGhlIHJlY2VpdmVkIE1JQyBmb3IgY2hlY2sgbGF0ZXIKLQkJTmRpc01vdmVNZW1vcnkocmN2ZF9taWMsIHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQkJTmRpc1plcm9NZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0gICAgICAgIGlmIChFYXBvbEtleUluZm8uS2V5RGVzY1ZlciA9PSBERVNDX1RZUEVfVEtJUCkJLy8gVEtJUAotICAgICAgICB7Ci0gICAgICAgICAgICBITUFDX01ENShwRW50cnktPlBUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKXBNc2csIE1zZ0xlbiwgbWljLCBNRDVfRElHRVNUX1NJWkUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKEVhcG9sS2V5SW5mby5LZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpCS8vIEFFUwotICAgICAgICB7Ci0gICAgICAgICAgICBITUFDX1NIQTEocEVudHJ5LT5QVEssIExFTl9FQVBfTUlDSywgKFBVQ0hBUilwTXNnLCBNc2dMZW4sIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShtaWMsIGRpZ2VzdCwgTEVOX0tFWV9ERVNDX01JQyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIU5kaXNFcXVhbE1lbW9yeShyY3ZkX21pYywgbWljLCBMRU5fS0VZX0RFU0NfTUlDKSkKLSAgICAgICAgewotCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBNSUMgZGlmZmVyZW50Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfTUlDX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKLQotCQkJaWYgKE1zZ1R5cGUgPCBFQVBPTF9HUk9VUF9NU0dfMSkKLQkJCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTUlDIERpZmZlcmVudCBpbiBwYWlyd2lzZSBtc2cgJWQgb2YgNC13YXkgaGFuZHNoYWtlIVxuIiwgTXNnVHlwZSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gZ3JvdXAgbXNnICVkIG9mIDItd2F5IGhhbmRzaGFrZSFcbiIsIChNc2dUeXBlIC0gRUFQT0xfUEFJUl9NU0dfNCkpKTsKLQkJCX0KLQotCQkJaGV4X2R1bXAoIlJlY2VpdmVkIE1JQyIsIHJjdmRfbWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQkJCWhleF9kdW1wKCJEZXNpcmVkICBNSUMiLCBtaWMsIExFTl9LRVlfREVTQ19NSUMpOwotCi0JCQlyZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQl9Ci0KLQkvLyAxLiBEZWNyeXB0IHRoZSBLZXkgRGF0YSBmaWVsZCBpZiBHVEsgaXMgaW5jbHVkZWQuCi0JLy8gMi4gRXh0cmFjdCB0aGUgY29udGV4dCBvZiB0aGUgS2V5IERhdGEgZmllbGQgaWYgaXQgZXhpc3QuCi0JLy8gVGhlIGZpZWxkIGluIHBhaXJ3aXNlX21zZ18yX1dQQTEoV1BBMikgJiBwYWlyd2lzZV9tc2dfM19XUEExIGlzIGNsZWFyLgotCS8vIFRoZSBmaWVsZCBpbiBncm91cF9tc2dfMV9XUEExKFdQQTIpICYgcGFpcndpc2VfbXNnXzNfV1BBMiBpcyBlbmNyeXB0ZWQuCi0JaWYgKENPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5LZXlEZXNjLktleURhdGFMZW4pID4gMCkKLQl7Ci0JCS8vIERlY3J5cHQgdGhpcyBmaWVsZAotCQlpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiBiV1BBMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCQl7Ci0JCQlpZigKLQkJCQkoRWFwb2xLZXlJbmZvLktleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykpCi0JCQl7Ci0JCQkJLy8gQUVTCi0JCQkJQUVTX0dUS19LRVlfVU5XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtFWURBVEEsCi0JCQkJCQkJCQlDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuKSwKLQkJCQkJCQkJCXBNc2ctPktleURlc2MuS2V5RGF0YSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJSU5UCWk7Ci0JCQkJVUNIQVIgICBLZXlbMzJdOwotCQkJCS8vIERlY3J5cHQgVEtJUCBHVEsKLQkJCQkvLyBDb25zdHJ1Y3QgMzIgYnl0ZXMgUkM0IEtleQotCQkJCU5kaXNNb3ZlTWVtb3J5KEtleSwgcE1zZy0+S2V5RGVzYy5LZXlJdiwgMTYpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlbMTZdLCAmcEVudHJ5LT5QVEtbMTZdLCAxNik7Ci0JCQkJQVJDRk9VUl9JTklUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtleSwgMzIpOwotCQkJCS8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKLQkJCQlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJCQkJQVJDRk9VUl9CWVRFKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQpOwotCQkJCS8vIERlY3J5cHQgR1RLLiBCZWNhcmVmdWwsIHRoZXJlIGlzIG5vIElDViB0byBjaGVjayB0aGUgcmVzdWx0IGlzIGNvcnJlY3Qgb3Igbm90Ci0JCQkJQVJDRk9VUl9ERUNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIEtFWURBVEEsCi0JCQkJCQkJCXBNc2ctPktleURlc2MuS2V5RGF0YSwKLQkJCQkJCQkJQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPktleURlc2MuS2V5RGF0YUxlbikpOwotCQkJfQotCi0JCQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKLQkJCQlHcm91cEtleUluZGV4ID0gRWFwb2xLZXlJbmZvLktleUluZGV4OwotCi0JCX0KLQkJZWxzZSBpZiAoKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMikgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMyAmJiAhYldQQTIpKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeShLRVlEQVRBLCBwTXNnLT5LZXlEZXNjLktleURhdGEsIENPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5LZXlEZXNjLktleURhdGFMZW4pKTsKLQkJfQotCQllbHNlCi0JCXsKLQotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQotCQkvLyBQYXJzZSBLZXkgRGF0YSBmaWVsZCB0bwotCQkvLyAxLiB2ZXJpZnkgUlNOIElFIGZvciBwYWlyd2lzZV9tc2dfMl9XUEExKFdQQTIpICxwYWlyd2lzZV9tc2dfM19XUEExKFdQQTIpCi0JCS8vIDIuIHZlcmlmeSBLREUgZm9ybWF0IGZvciBwYWlyd2lzZV9tc2dfM19XUEEyLCBncm91cF9tc2dfMV9XUEEyCi0JCS8vIDMuIHVwZGF0ZSBzaGFyZWQga2V5IGZvciBwYWlyd2lzZV9tc2dfM19XUEEyLCBncm91cF9tc2dfMV9XUEExKFdQQTIpCi0JCWlmICghUlRNUFBhcnNlRWFwb2xLZXlEYXRhKHBBZCwgS0VZREFUQSwKLQkJCQkJCQkJICBDT05WX0FSUkFSWV9UT19VSU5UMTYocE1zZy0+S2V5RGVzYy5LZXlEYXRhTGVuKSwKLQkJCQkJCQkJICBHcm91cEtleUluZGV4LCBNc2dUeXBlLCBiV1BBMiwgcEVudHJ5KSkKLQkJewotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotQk9PTEVBTiBNbG1lRGxzUmVxU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBSVF84MDJfMTFfRExTICpwRExTLAotICAgIE9VVCBQVVNIT1JUIHBSZWFzb24pCi17Ci0JTUxNRV9ETFNfUkVRX1NUUlVDVCAqcEluZm87Ci0KLSAgICBwSW5mbyA9IChNTE1FX0RMU19SRVFfU1RSVUNUICopTXNnOwotCi0JKnBETFMgPSBwSW5mby0+cERMUzsKLQkqcFJlYXNvbiA9IHBJbmZvLT5SZWFzb247Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotQk9PTEVBTiBQZWVyRGxzUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwREEsCi0gICAgT1VUIFBVQ0hBUiBwU0EsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVU0hPUlQgKnBEbHNUaW1lb3V0LAotICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAotICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAotCU9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSkKLXsKLQlDSEFSICAgICAgICAgICAgKlB0cjsKLSAgICBQRlJBTUVfODAyXzExCUZyID0gKFBGUkFNRV84MDJfMTEpTXNnOwotCVBFSURfU1RSVUNUICBlaWRfcHRyOwotCi0gICAgLy8gdG8gcHJldmVudCBjYWxsZXIgZnJvbSB1c2luZyBnYXJiYWdlIG91dHB1dCB2YWx1ZQotICAgICpwQ2FwYWJpbGl0eUluZm8JPSAwOwotICAgICpwRGxzVGltZW91dAk9IDA7Ci0JKnBIdENhcGFiaWxpdHlMZW4gPSAwOwotCi0gICAgUHRyID0gKFBDSEFSKUZyLT5PY3RldDsKLQotCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKLSAgICBQdHIgKz0gMjsKLQotICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKLSAgICBQdHIgKz0gTUFDX0FERFJfTEVOOwotCi0gICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLSAgICAvLyBnZXQgY2FwYWJpbGl0eSBpbmZvIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBDYXBhYmlsaXR5SW5mbywgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLQotICAgIC8vIGdldCBjYXBhYmlsaXR5IGluZm8gZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocERsc1RpbWVvdXQsIFB0ciwgMik7Ci0gICAgUHRyICs9IDI7Ci0KLQkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgREEgKyBTQSArIGNhcGFiaWxpdHkgKyBUaW1lb3V0Ci0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkgJkZyLT5PY3RldFsxOF07Ci0KLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChVQ0hBUiopRnIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmICgoZWlkX3B0ci0+TGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAmJiAoZWlkX3B0ci0+TGVuID4gMCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShSYXRlcywgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkLiBSYXRlc1swXT0leFxuIixlaWRfcHRyLT5MZW4sIFJhdGVzWzBdKSk7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhdGVzWzFdPSV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBSYXRlc1sxXSwgUmF0ZXNbMl0sIFJhdGVzWzNdLCBSYXRlc1s0XSwgUmF0ZXNbNV0sIFJhdGVzWzZdLCBSYXRlc1s3XSkpOwotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gZWlkX3B0ci0+TGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gODsKLQkJCQkJUmF0ZXNbMF0gPSAweDgyOwotCQkJCQlSYXRlc1sxXSA9IDB4ODQ7Ci0JCQkJCVJhdGVzWzJdID0gMHg4YjsKLQkJCQkJUmF0ZXNbM10gPSAweDk2OwotCQkJCQlSYXRlc1s0XSA9IDB4MTI7Ci0JCQkJCVJhdGVzWzVdID0gMHgyNDsKLQkJCQkJUmF0ZXNbNl0gPSAweDQ4OwotCQkJCQlSYXRlc1s3XSA9IDB4NmM7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9TVVBQX1JBVEVTLiwgTGVuPSVkXG4iLGVpZF9wdHItPkxlbikpOwotICAgICAgICAgICAgICAgIH0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9FWFRfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAoZWlkX3B0ci0+TGVuICsgKnBSYXRlc0xlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIGVpZF9wdHItPkxlbik7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSAoKnBSYXRlc0xlbikgKyBlaWRfcHRyLT5MZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZSYXRlc1sqcFJhdGVzTGVuXSwgZWlkX3B0ci0+T2N0ZXQsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTIC0gKCpwUmF0ZXNMZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOwotICAgICAgICAgICAgICAgIH0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9IVF9DQVA6Ci0JCQkJaWYgKGVpZF9wdHItPkxlbiA+PSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwSHRDYXBhYmlsaXR5LCBlaWRfcHRyLT5PY3RldCwgc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKTsKLQotCQkJCQkqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJCXsKLQkJCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQkJKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSk7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJfQotI2Vsc2UKLQkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvKSk7Ci0jZW5kaWYgLy8gVU5BTElHTk1FTlRfU1VQUE9SVCAvLwotCQkJCQkqcEh0Q2FwYWJpbGl0eUxlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUmVxU2FuaXR5IC0gSUVfSFRfQ0FQXG4iKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJEbHNSZXFTYW5pdHkgLSB3cm9uZyBJRV9IVF9DQVAuZWlkX3B0ci0+TGVuID0gJWRcbiIsIGVpZF9wdHItPkxlbikpOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCi0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MRUFOIFBlZXJEbHNSc3BTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBEQSwKLSAgICBPVVQgUFVDSEFSIHBTQSwKLSAgICBPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0gICAgT1VUIFVTSE9SVCAqcFN0YXR1cywKLSAgICBPVVQgVUNIQVIgKnBSYXRlc0xlbiwKLSAgICBPVVQgVUNIQVIgUmF0ZXNbXSwKLSAgICBPVVQgVUNIQVIgKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHkpCi17Ci0gICAgQ0hBUiAgICAgICAgICAgICpQdHI7Ci0gICAgUEZSQU1FXzgwMl8xMQlGciA9IChQRlJBTUVfODAyXzExKU1zZzsKLQlQRUlEX1NUUlVDVCAgZWlkX3B0cjsKLQotICAgIC8vIHRvIHByZXZlbnQgY2FsbGVyIGZyb20gdXNpbmcgZ2FyYmFnZSBvdXRwdXQgdmFsdWUKLSAgICAqcFN0YXR1cwkJPSAwOwotICAgICpwQ2FwYWJpbGl0eUluZm8JPSAwOwotCSpwSHRDYXBhYmlsaXR5TGVuID0gMDsKLQotICAgIFB0ciA9IChQQ0hBUilGci0+T2N0ZXQ7Ci0KLQkvLyBvZmZzZXQgdG8gZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKENhdGVnb3J5IGFuZCBBY3Rpb24gZmllbGQpCi0gICAgUHRyICs9IDI7Ci0KLQkvLyBnZXQgc3RhdHVzIGNvZGUgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLQotICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKLSAgICBQdHIgKz0gTUFDX0FERFJfTEVOOwotCi0gICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLQlpZiAocFN0YXR1cyA9PSAwKQotCXsKLQkgICAgLy8gZ2V0IGNhcGFiaWxpdHkgaW5mbyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLQkgICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCBQdHIsIDIpOwotCSAgICBQdHIgKz0gMjsKLQl9Ci0KLQkvLyBDYXRlZ29yeSBhbmQgQWN0aW9uIGZpZWxkICsgc3RhdHVzIGNvZGUgKyBEQSArIFNBICsgY2FwYWJpbGl0eQotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpICZGci0+T2N0ZXRbMThdOwotCi0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoVUNIQVIqKUZyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfU1VQUF9SQVRFUzoKLSAgICAgICAgICAgICAgICBpZiAoKGVpZF9wdHItPkxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykgJiYgKGVpZF9wdHItPkxlbiA+IDApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoUmF0ZXMsIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gSUVfU1VQUF9SQVRFUy4sIExlbj0lZC4gUmF0ZXNbMF09JXhcbiIsZWlkX3B0ci0+TGVuLCBSYXRlc1swXSkpOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYXRlc1sxXT0leCAleCAleCAleCAleCAleCAleFxuIiwgUmF0ZXNbMV0sIFJhdGVzWzJdLCBSYXRlc1szXSwgUmF0ZXNbNF0sIFJhdGVzWzVdLCBSYXRlc1s2XSwgUmF0ZXNbN10pKTsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IGVpZF9wdHItPkxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKnBSYXRlc0xlbiA9IDg7Ci0JCQkJCVJhdGVzWzBdID0gMHg4MjsKLQkJCQkJUmF0ZXNbMV0gPSAweDg0OwotCQkJCQlSYXRlc1syXSA9IDB4OGI7Ci0JCQkJCVJhdGVzWzNdID0gMHg5NjsKLQkJCQkJUmF0ZXNbNF0gPSAweDEyOwotCQkJCQlSYXRlc1s1XSA9IDB4MjQ7Ci0JCQkJCVJhdGVzWzZdID0gMHg0ODsKLQkJCQkJUmF0ZXNbN10gPSAweDZjOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfU1VQUF9SQVRFUy4sIExlbj0lZFxuIixlaWRfcHRyLT5MZW4pKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUVfRVhUX1NVUFBfUkFURVM6Ci0gICAgICAgICAgICAgICAgaWYgKGVpZF9wdHItPkxlbiArICpwUmF0ZXNMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBlaWRfcHRyLT5MZW4pOwotICAgICAgICAgICAgICAgICAgICAqcFJhdGVzTGVuID0gKCpwUmF0ZXNMZW4pICsgZWlkX3B0ci0+TGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeSgmUmF0ZXNbKnBSYXRlc0xlbl0sIGVpZF9wdHItPk9jdGV0LCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAtICgqcFJhdGVzTGVuKSk7Ci0gICAgICAgICAgICAgICAgICAgICpwUmF0ZXNMZW4gPSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSUVfSFRfQ0FQOgotCQkJCWlmIChlaWRfcHRyLT5MZW4gPj0gc2l6ZW9mKEhUX0NBUEFCSUxJVFlfSUUpKQotCQkJCXsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgZWlkX3B0ci0+T2N0ZXQsIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0KLQkJCQkJKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvKSk7Ci0jaWZkZWYgVU5BTElHTk1FTlRfU1VQUE9SVAotCQkJCQl7Ci0JCQkJCQlFWFRfSFRfQ0FQX0lORk8gZXh0SHRDYXBJbmZvOwotCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJCSooVVNIT1JUICopKCZleHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykpOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbyksIChQVUNIQVIpKCZleHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJCX0KLSNlbHNlCi0JCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOwotI2VuZGlmIC8vIFVOQUxJR05NRU5UX1NVUFBPUlQgLy8KLQkJCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckRsc1JzcFNhbml0eSAtIElFX0hUX0NBUFxuIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyRGxzUnNwU2FuaXR5IC0gd3JvbmcgSUVfSFRfQ0FQLmVpZF9wdHItPkxlbiA9ICVkXG4iLCBlaWRfcHRyLT5MZW4pKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKLQl9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotQk9PTEVBTiBQZWVyRGxzVGVhckRvd25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgUFVDSEFSIHBEQSwKLSAgICBPVVQgUFVDSEFSIHBTQSwKLSAgICBPVVQgVVNIT1JUICpwUmVhc29uKQotewotICAgIENIQVIgICAgICAgICAgICAqUHRyOwotICAgIFBGUkFNRV84MDJfMTEJRnIgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICAvLyB0byBwcmV2ZW50IGNhbGxlciBmcm9tIHVzaW5nIGdhcmJhZ2Ugb3V0cHV0IHZhbHVlCi0gICAgKnBSZWFzb24JPSAwOwotCi0gICAgUHRyID0gKFBDSEFSKUZyLT5PY3RldDsKLQotCS8vIG9mZnNldCB0byBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAoQ2F0ZWdvcnkgYW5kIEFjdGlvbiBmaWVsZCkKLSAgICBQdHIgKz0gMjsKLQotICAgIC8vIGdldCBEQSBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICBOZGlzTW92ZU1lbW9yeShwREEsIFB0ciwgTUFDX0FERFJfTEVOKTsKLSAgICBQdHIgKz0gTUFDX0FERFJfTEVOOwotCi0gICAgLy8gZ2V0IFNBIGZyb20gcGF5bG9hZCBhbmQgYWR2YW5jZSB0aGUgcG9pbnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBTQSwgUHRyLCBNQUNfQUREUl9MRU4pOwotICAgIFB0ciArPSBNQUNfQUREUl9MRU47Ci0KLQkvLyBnZXQgcmVhc29uIGNvZGUgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgTmRpc01vdmVNZW1vcnkocFJlYXNvbiwgUHRyLCAyKTsKLSAgICBQdHIgKz0gMjsKLQotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV9zeW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkN2I5NzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3N5bmMuYworKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNtbV9zeW5jLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDQtMDktMDEgICAgICBtb2RpZmllZCBmb3IgcnQyNTYxLzI2NjEKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vLyAyLjQgR2h6IGNoYW5uZWwgcGxhbiBpbmRleCBpbiB0aGUgVHhQb3dlciBhcnJheXMuCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzBfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzBfU0laRQkxMQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NUQVJUCTAJCQkvLyAxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMwotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8xX1NJWkUJMTMKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMl9TVEFSVAk5CQkJLy8gMTAsMTEKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMl9TSVpFCTIKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fM19TVEFSVAk5CQkJLy8gMTAsMTEsMTIsMTMKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fM19TSVpFCTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fNF9TVEFSVAkxMwkJCS8vIDE0Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzRfU0laRQkxCi0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzVfU1RBUlQJMAkJCS8vIDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzVfU0laRQkxNAotI2RlZmluZQlCR19CQU5EX1JFR0lPTl82X1NUQVJUCTIJCQkvLyAzLDQsNSw2LDcsOCw5Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzZfU0laRQk3Ci0jZGVmaW5lCUJHX0JBTkRfUkVHSU9OXzdfU1RBUlQJNAkJCS8vIDUsNiw3LDgsOSwxMCwxMSwxMiwxMwotI2RlZmluZQlCR19CQU5EX1JFR0lPTl83X1NJWkUJOQotI2RlZmluZQlCR19CQU5EX1JFR0lPTl8zMV9TVEFSVAkwCQkJLy8gMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKLSNkZWZpbmUJQkdfQkFORF9SRUdJT05fMzFfU0laRQkxNAotCi0vLyA1IEdoeiBjaGFubmVsIHBsYW4gaW5kZXggaW4gdGhlIFR4UG93ZXIgYXJyYXlzLgotVUNIQVIgQV9CQU5EX1JFR0lPTl8wX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzJfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUW109ezUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjF9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVFtdPXsxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzVfQ0hBTk5FTF9MSVNUW109ezE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUW109ezM2LCA0MCwgNDQsIDQ4fTsKLVVDSEFSIEFfQkFORF9SRUdJT05fN19DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUsIDE2OSwgMTczfTsKLVVDSEFSIEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1RbXT17NTIsIDU2LCA2MCwgNjR9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl85X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzEwX0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xMV9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjF9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1RbXT17MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzEzX0NIQU5ORUxfTElTVFtdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MX07Ci1VQ0hBUiBBX0JBTkRfUkVHSU9OXzE0X0NIQU5ORUxfTElTVFtdPXszNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9OwotVUNIQVIgQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1RbXT17MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUsIDE2OSwgMTczfTsKLQotCi0vL0JhU2l6ZUFycmF5IGZvbGxvd3MgdGhlIDgwMi4xMW4gZGVmaW5pdGlvbiBhcyBNYXhSeEZhY3Rvci4gIDJeKDEzK2ZhY3RvcikgYnl0ZXMuIFdoZW4gZmFjdG9yID0wLCBpdCdzIGFib3V0IEJhIGJ1ZmZlciBzaXplID04LgotVUNIQVIgQmFTaXplQXJyYXlbNF0gPSB7OCwxNiwzMiw2NH07Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVXBkYXRlIFN0YUNmZy0+Q2hhbm5lbExpc3RbXSBhY2NvcmRpbmcgdG8gMSkgQ291bnRyeSBSZWdpb24gMikgUkYgSUMgdHlwZSwKLQkJYW5kIDMpIFBIWS1tb2RlIHVzZXIgc2VsZWN0ZWQuCi0JCVRoZSBvdXRjb21lIGlzIHVzZWQgYnkgZHJpdmVyIHdoZW4gZG9pbmcgc2l0ZSBzdXJ2ZXkuCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBCdWlsZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSIGksIGosIGluZGV4PTAsIG51bT0wOwotCVBVQ0hBUglwQ2hhbm5lbExpc3QgPSBOVUxMOwotCi0JTmRpc1plcm9NZW1vcnkocEFkLT5DaGFubmVsTGlzdCwgTUFYX05VTV9PRl9DSEFOTkVMUyAqIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7Ci0KLQkvLyBpZiBub3QgMTFhLW9ubHkgbW9kZSwgY2hhbm5lbCBsaXN0IHN0YXJ0cyBmcm9tIDIuNEdoeiBiYW5kCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUEpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFBIWV8xMUFOX01JWEVEKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSAhPSBQSFlfMTFOXzVHKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCSkKLQl7Ci0JCXN3aXRjaCAocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAgJiAweDdmKQotCQl7Ci0JCQljYXNlIFJFR0lPTl8wX0JHX0JBTkQ6CS8vIDEgLTExCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzBfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8wX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzBfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzFfQkdfQkFORDoJLy8gMSAtIDEzCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8xX1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzFfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzJfQkdfQkFORDoJLy8gMTAgLSAxMQotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl8yX1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fMl9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8yX1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8zX0JHX0JBTkQ6CS8vIDEwIC0gMTMKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fM19TVEFSVF0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSAqIEJHX0JBTkRfUkVHSU9OXzNfU0laRSk7Ci0JCQkJaW5kZXggKz0gQkdfQkFORF9SRUdJT05fM19TSVpFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNF9CR19CQU5EOgkvLyAxNAotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl80X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNF9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl80X1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl81X0JHX0JBTkQ6CS8vIDEgLSAxNAotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl81X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fNV9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl81X1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl82X0JHX0JBTkQ6CS8vIDMgLSA5Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLCAmcEFkLT5UeFBvd2VyW0JHX0JBTkRfUkVHSU9OXzZfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl82X1NJWkUpOwotCQkJCWluZGV4ICs9IEJHX0JBTkRfUkVHSU9OXzZfU0laRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzdfQkdfQkFORDogIC8vIDUgLSAxMwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNoYW5uZWxMaXN0W2luZGV4XSwgJnBBZC0+VHhQb3dlcltCR19CQU5EX1JFR0lPTl83X1NUQVJUXSwgc2l6ZW9mKENIQU5ORUxfVFhfUE9XRVIpICogQkdfQkFORF9SRUdJT05fN19TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl83X1NJWkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8zMV9CR19CQU5EOgkvLyAxIC0gMTQKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5DaGFubmVsTGlzdFtpbmRleF0sICZwQWQtPlR4UG93ZXJbQkdfQkFORF9SRUdJT05fMzFfU1RBUlRdLCBzaXplb2YoQ0hBTk5FTF9UWF9QT1dFUikgKiBCR19CQU5EX1JFR0lPTl8zMV9TSVpFKTsKLQkJCQlpbmRleCArPSBCR19CQU5EX1JFR0lPTl8zMV9TSVpFOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDogICAgICAgICAgICAvLyBFcnJvci4gc2hvdWxkIG5ldmVyIGhhcHBlbgotCQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoaT0wOyBpPGluZGV4OyBpKyspCi0JCQlwQWQtPkNoYW5uZWxMaXN0W2ldLk1heFR4UHdyID0gMjA7Ci0JfQotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUJHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQU5fTUlYRUQpCi0JCXx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFHTl9NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkpCi0JewotCQlzd2l0Y2ggKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZCAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgUkVHSU9OXzBfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMF9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzFfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMl9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8yX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzNfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fM19DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl80X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl80X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzRfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fNV9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl81X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzZfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzZfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fNl9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl83X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl83X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzdfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fOF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fOF9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl84X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzlfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzlfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fOV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xMF9BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTBfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMTFfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzExX0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzEyX0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xMl9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl8xM19BX0JBTkQ6Ci0JCQkJbnVtID0gc2l6ZW9mKEFfQkFORF9SRUdJT05fMTNfQ0hBTk5FTF9MSVNUKS9zaXplb2YoVUNIQVIpOwotCQkJCXBDaGFubmVsTGlzdCA9IEFfQkFORF9SRUdJT05fMTNfQ0hBTk5FTF9MSVNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRUdJT05fMTRfQV9CQU5EOgotCQkJCW51bSA9IHNpemVvZihBX0JBTkRfUkVHSU9OXzE0X0NIQU5ORUxfTElTVCkvc2l6ZW9mKFVDSEFSKTsKLQkJCQlwQ2hhbm5lbExpc3QgPSBBX0JBTkRfUkVHSU9OXzE0X0NIQU5ORUxfTElTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OXzE1X0FfQkFORDoKLQkJCQludW0gPSBzaXplb2YoQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1QpL3NpemVvZihVQ0hBUik7Ci0JCQkJcENoYW5uZWxMaXN0ID0gQV9CQU5EX1JFR0lPTl8xNV9DSEFOTkVMX0xJU1Q7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAgICAgICAgICAgIC8vIEVycm9yLiBzaG91bGQgbmV2ZXIgaGFwcGVuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoImNvdW50cnlyZWdpb249JWQgbm90IHN1cHBvcnQiLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQpKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChudW0gIT0gMCkKLQkJewotCQkJVUNIQVIgUmFkYXJDaFsxNV09ezUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH07Ci0JCQlmb3IgKGk9MDsgaTxudW07IGkrKykKLQkJCXsKLQkJCQlmb3IgKGo9MDsgajxNQVhfTlVNX09GX0NIQU5ORUxTOyBqKyspCi0JCQkJewotCQkJCQlpZiAocENoYW5uZWxMaXN0W2ldID09IHBBZC0+VHhQb3dlcltqXS5DaGFubmVsKQotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+Q2hhbm5lbExpc3RbaW5kZXgraV0sICZwQWQtPlR4UG93ZXJbal0sIHNpemVvZihDSEFOTkVMX1RYX1BPV0VSKSk7Ci0JCQkJCX0KLQkJCQlmb3IgKGo9MDsgajwxNTsgaisrKQotCQkJCXsKLQkJCQkJaWYgKHBDaGFubmVsTGlzdFtpXSA9PSBSYWRhckNoW2pdKQotCQkJCQkJcEFkLT5DaGFubmVsTGlzdFtpbmRleCtpXS5EZnNSZXEgPSBUUlVFOwotCQkJCX0KLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2luZGV4K2ldLk1heFR4UHdyID0gMjA7Ci0JCQl9Ci0JCQlpbmRleCArPSBudW07Ci0JCX0KLQl9Ci0KLQlwQWQtPkNoYW5uZWxMaXN0TnVtID0gaW5kZXg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJjb3VudHJ5IGNvZGU9JWQvJWQsIFJGSUM9JWQsIFBIWSBtb2RlPSVkLCBzdXBwb3J0ICVkIGNoYW5uZWxzXG4iLAotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsIHBBZC0+UmZJY1R5cGUsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUsIHBBZC0+Q2hhbm5lbExpc3ROdW0pKTsKLSNpZmRlZiBEQkcKLQlmb3IgKGk9MDtpPHBBZC0+Q2hhbm5lbExpc3ROdW07aSsrKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiQnVpbGRDaGFubmVsICMgJWQgOjogUHdyMCA9ICVkLCBQd3IxID0lZCwgXG4gIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlBvd2VyMikpOwotCX0KLSNlbmRpZgotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSByZXR1cm4gdGhlIGZpcnN0IGNoYW5uZWwgbnVtYmVyIGFjY29yZGluZyB0byB0aGUgY291bnRyeQotCQljb2RlIHNlbGVjdGlvbiBhbmQgUkYgSUMgc2VsZWN0aW9uIChzaWduYWwgYmFuZCBvciBkdWFsIGJhbmQpLiBJdCBpcyBjYWxsZWQKLQkJd2hlbmV2ZXIgZHJpdmVyIG5lZWQgdG8gc3RhcnQgYSBzaXRlIHN1cnZleSBvZiBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzLgotCVJldHVybjoKLQkJY2ggLSB0aGUgZmlyc3QgY2hhbm5lbCBudW1iZXIgb2YgY3VycmVudCBjb3VudHJ5IGNvZGUgc2V0dGluZwotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVVDSEFSIEZpcnN0Q2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFswXS5DaGFubmVsOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBuZXh0IGNoYW5uZWwgbnVtYmVyLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkCi0JCWR1cmluZyBkcml2ZXIgbmVlZCB0byBzdGFydCBhIHNpdGUgc3VydmV5IG9mIGFsbCBzdXBwb3J0ZWQgY2hhbm5lbHMuCi0JUmV0dXJuOgotCQluZXh0X2NoYW5uZWwgLSB0aGUgbmV4dCBjaGFubmVsIG51bWJlciB2YWxpZCBpbiBjdXJyZW50IGNvdW50cnkgY29kZSBzZXR0aW5nLgotCU5vdGU6Ci0JCXJldHVybiAwIGlmIG5vIG1vcmUgbmV4dCBjaGFubmVsCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVUNIQVIgTmV4dENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgY2hhbm5lbCkKLXsKLQlpbnQgaTsKLQlVQ0hBUiBuZXh0X2NoYW5uZWwgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IChwQWQtPkNoYW5uZWxMaXN0TnVtIC0gMSk7IGkrKykKLQkJaWYgKGNoYW5uZWwgPT0gcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsKQotCQl7Ci0JCQluZXh0X2NoYW5uZWwgPSBwQWQtPkNoYW5uZWxMaXN0W2krMV0uQ2hhbm5lbDsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gbmV4dF9jaGFubmVsOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBpcyBmb3IgQ2lzY28gQ29tcGF0aWJsZSBFeHRlbnNpb25zIDIuWAotCQlTcGVjMzEuIEFQIENvbnRyb2wgb2YgQ2xpZW50IFRyYW5zbWl0IFBvd2VyCi0JUmV0dXJuOgotCQlOb25lCi0JTm90ZToKLQkgICBSZXF1aXJlZCBieSBBaXJvbmV0IGRCbShtVykKLQkJICAgMGRCbSgxbVcpLCAgIDFkQm0oNW1XKSwgMTNkQm0oMjBtVyksIDE1ZEJtKDMwbVcpLAotCQkgIDE3ZEJtKDUwbXcpLCAyMGRCbSgxMDBtVykKLQotCSAgIFdlIHN1cHBvcnRlZAotCQkgICAzZEJtKExvd2VzdCksIDZkQm0oMTAlKSwgOWRCbSgyNSUpLCAxMmRCbSg1MCUpLAotCQkgIDE0ZEJtKDc1JSksICAgMTVkQm0oMTAwJSkKLQotCQlUaGUgY2xpZW50IHN0YXRpb24ncyBhY3R1YWwgdHJhbnNtaXQgcG93ZXIgc2hhbGwgYmUgd2l0aGluICsvLSA1ZEIgb2YKLQkJdGhlIG1pbmltdW0gdmFsdWUgb3IgbmV4dCBsb3dlciB2YWx1ZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIENoYW5nZVRvQ2VsbFBvd2VyTGltaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQpCi17Ci0JLy92YWx1ZCAweEZGIG1lYW5zIHRoYXQgaGFzbid0IGZvdW5kIHBvd2VyIGxpbWl0IGluZm9ybWF0aW9uCi0JLy9mcm9tIHRoZSBBUCdzIEJlYWNvbi9Qcm9iZSByZXNwb25zZS4KLQlpZiAoQWlyb25ldENlbGxQb3dlckxpbWl0ID09IDB4RkYpCi0JCXJldHVybjsKLQotCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA2KSAvL1VzZWQgTG93ZXN0IFBvd2VyIFBlcmNlbnRhZ2UuCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gNjsKLQllbHNlIGlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgPCA5KQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDEwOwotCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDEyKQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDI1OwotCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE0KQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDUwOwotCWVsc2UgaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCA8IDE1KQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDc1OwotCWVsc2UKLQkJcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPSAxMDA7IC8vZWxzZSB1c2VkIG1heGltdW0KLQotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0KQotCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotCi19Ci0KLUNIQVIJQ29udmVydFRvUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBDSEFSCQkJCVJzc2ksCi0JSU4gVUNIQVIJCQlSc3NpTnVtYmVyKQotewotCVVDSEFSCVJzc2lPZmZzZXQsIExOQUdhaW47Ci0KLQkvLyBSc3NpIGVxdWFscyB0byB6ZXJvIHNob3VsZCBiZSBhbiBpbnZhbGlkIHZhbHVlCi0JaWYgKFJzc2kgPT0gMCkKLQkJcmV0dXJuIC05OTsKLQotCUxOQUdhaW4gPSBHRVRfTE5BX0dBSU4ocEFkKTsKLSAgICBpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID4gMTQpCi0gICAgewotICAgICAgICBpZiAoUnNzaU51bWJlciA9PSAwKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQwOwotCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDE7Ci0JCWVsc2UKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKFJzc2lOdW1iZXIgPT0gMCkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDA7Ci0JCWVsc2UgaWYgKFJzc2lOdW1iZXIgPT0gMSkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDE7Ci0JCWVsc2UKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkJHUnNzaU9mZnNldDI7Ci0gICAgfQotCi0gICAgcmV0dXJuICgtMTIgLSBSc3NpT2Zmc2V0IC0gTE5BR2FpbiAtIFJzc2kpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVNjYW4gbmV4dCBjaGFubmVsCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBTY2FuTmV4dENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOwotCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyAgICAgTlN0YXR1czsKLQlVTE9ORyAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVVDSEFSICAgICAgICAgICBTc2lkTGVuID0gMCwgU2NhblR5cGUgPSBwQWQtPk1sbWVBdXguU2NhblR5cGUsIEJCUFZhbHVlID0gMDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVU0hPUlQgICAgICAgICAgU3RhdHVzOwotCVBIRUFERVJfODAyXzExICBwSGRyODAyMTE7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JVUlOVAkJCVNjYW5UaW1lSW41Z0NoYW5uZWwgPSBTSE9SVF9DSEFOTkVMX1RJTUU7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0JLy8gTm90aGluZyB0byBkbyBpbiBBVEUgbW9kZS4KLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPT0gMCkKLQl7Ci0JCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJJiYgKElORlJBX09OKHBBZCkKLQkJCQl8fCAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCSkKLQkJewotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKLQkJCUJCUFZhbHVlIHw9IDB4MTA7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gNDBNSHogY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gRW5kIG9mIFNDQU4sIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJLy8KLQkJCS8vIFRvIHByZXZlbnQgZGF0YSBsb3N0LgotCQkJLy8gU2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvbiB0byBjdXJyZW50IGFzc29jaWF0ZWQgQVAgYmVmb3JlIFNDQU4gcHJvZ3Jlc3MuCi0JCQkvLyBOb3csIHdlIG5lZWQgdG8gc2VuZCBhbiBOVUxMIGRhdGEgd2l0aCB0dXJuZWQgUFNNIGJpdCBvZmYgdG8gQVAsIHdoZW4gc2NhbiBwcm9ncmVzcyBkb25lCi0JCQkvLwotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJiAoSU5GUkFfT04ocEFkKSkpCi0JCQl7Ci0JCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7Ci0JCQkJaWYgKE5TdGF0dXMJPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQl7Ci0JCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJCQkJTWd0TWFjSGVhZGVySW5pdChwQWQsIHBIZHI4MDIxMSwgU1VCVFlQRV9OVUxMX0ZVTkMsIDEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQkJCXBIZHI4MDIxMS0+RHVyYXRpb24gPSAwOwotCQkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOwotCQkJCQlwSGRyODAyMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKTsKLQotCQkJCQkvLyBTZW5kIHVzaW5nIHByaW9yaXR5IHF1ZXVlCi0JCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNjYW5SZXFBY3Rpb24gLS0gU2VuZCBQU00gRGF0YSBmcmFtZVxuIikpOwotCQkJCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQkJCX0KLQkJCX0KLQotCQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQkJCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TQ0FOX0NPTkYsIDIsICZTdGF0dXMpOwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLQl9Ci0JZWxzZQotCXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkvLyBCQlAgYW5kIFJGIGFyZSBub3QgYWNjZXNzaWJsZSBpbiBQUyBtb2RlLCB3ZSBoYXMgdG8gd2FrZSB0aGVtIHVwIGZpcnN0Ci0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0KLQkJCS8vIGxlYXZlIFBTTSBkdXJpbmcgc2Nhbm5pbmcuIG90aGVyd2lzZSB3ZSBtYXkgbG9zdCBQcm9iZVJzcCAmIEJFQUNPTgotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJCQlSVE1QX1NFVF9QU01fQklUKHBBZCwgUFdSX0FDVElWRSk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsLCBUUlVFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQkJCWlmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KQotCQkJewotCQkJCWlmICgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCkpCi0JCQkJewotCQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQkJCQkJU2NhblRpbWVJbjVnQ2hhbm5lbCA9IE1JTl9DSEFOTkVMX1RJTUU7Ci0JCQkJfQotCQkJfQotCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKLQkJCS8vIGNhcnJpZXIgZGV0ZWN0aW9uCi0JCQlpZiAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKLQkJCXsKLQkJCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQkJCQlTY2FuVGltZUluNWdDaGFubmVsID0gTUlOX0NIQU5ORUxfVElNRTsKLQkJCX0KLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0JCX0KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8vR2xvYmFsIGNvdW50cnkgZG9tYWluKGNoMS0xMTphY3RpdmUgc2NhbiwgY2gxMi0xNCBwYXNzaXZlIHNjYW4pCi0JCWlmICgocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpICYmIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+PSAxMikgJiYgKChwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uICYgMHg3ZikgPT0gUkVHSU9OXzMxX0JHX0JBTkQpKQotCQl7Ci0JCQlTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQkJfQotCi0JCS8vIFdlIG5lZWQgdG8gc2hvcnRlbiBhY3RpdmUgc2NhbiB0aW1lIGluIG9yZGVyIGZvciBXWkMgY29ubmVjdCBpc3N1ZQotCQkvLyBDaG5hZ2UgdGhlIGNoYW5uZWwgc2NhbiB0aW1lIGZvciBDSVNDTyBzdHVmZiBiYXNlZCBvbiBpdHMgSUFQUCBhbm5vdW5jZW1lbnQKLQkJaWYgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCi0JCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEZBU1RfQUNUSVZFX1NDQU5fVElNRSk7Ci0JCWVsc2UgLy8gbXVzdCBiZSBTQ0FOX1BBU1NJVkUgb3IgU0NBTl9BQ1RJVkUKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQl8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKSB8fCAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBR05fTUlYRUQpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkpCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsID4gMTQpCi0JCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgU2NhblRpbWVJbjVnQ2hhbm5lbCk7Ci0JCQkJZWxzZQotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgTUlOX0NIQU5ORUxfVElNRSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCBNQVhfQ0hBTk5FTF9USU1FKTsKLQkJfQotCi0JCWlmICgoU2NhblR5cGUgPT0gU0NBTl9BQ1RJVkUpCi0JCQl8fCAoU2NhblR5cGUgPT0gRkFTVF9TQ0FOX0FDVElWRSkKLQkJCSkKLQkJewotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIFNjYW5OZXh0Q2hhbm5lbCgpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7Ci0JCQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJCQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQgYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgaWYgYWN0aXZlIHNjYW4gaXMgaW4gZWZmZWN0LgotCQkJaWYgKChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkgfHwgKFNjYW5UeXBlID09IEZBU1RfU0NBTl9BQ1RJVkUpCi0JCQkJKQotCQkJCVNzaWRMZW4gPSBwQWQtPk1sbWVBdXguU3NpZExlbjsKLQkJCWVsc2UKLQkJCQlTc2lkTGVuID0gMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkhkcjgwMjExLCBTVUJUWVBFX1BST0JFX1JFUSwgMCwgQlJPQURDQVNUX0FERFIsIEJST0FEQ0FTVF9BRERSKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkhkcjgwMjExLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZExlbiwKLQkJCQkJCQkgIFNzaWRMZW4sCQkJICAgICAgICBwQWQtPk1sbWVBdXguU3NpZCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuLCAgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW4pCi0JCQl7Ci0JCQkJVUxPTkcgVG1wOwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZUxlbiwKLQkJCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuLCAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXA7Ci0JCQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQl7Ci0JCQkJVUxPTkcJVG1wOwotCQkJCVVDSEFSCUh0TGVuOwotCQkJCVVDSEFSCUJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotI2VuZGlmCi0JCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCUh0TGVuID0gcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiArIDQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCQlOZGlzTW92ZU1lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOwotCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLSNpZmRlZiBVTkFMSUdOTUVOVF9TVVBQT1JUCi0JCQkJCXsKLQkJCQkJCUVYVF9IVF9DQVBfSU5GTyBleHRIdENhcEluZm87Ci0KLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZleHRIdENhcEluZm8pLCAoUFVDSEFSKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJCSooVVNIT1JUICopKCZleHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJmV4dEh0Q2FwSW5mbykpOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pLCAoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgc2l6ZW9mKEVYVF9IVF9DQVBfSU5GTykpOwotCQkJCQl9Ci0jZWxzZQotCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotI2VuZGlmIC8vIFVOQUxJR05NRU5UX1NVUFBPUlQgLy8KLQotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICZUbXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJCTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgJkh0Q2FwYWJpbGl0eVRtcCwKLQkJCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbHNlCi0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0TGVuLAotCQkJCQkJCQkJNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUh0TGVuID0gcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbjsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7Ci0jaWZkZWYgVU5BTElHTk1FTlRfU1VQUE9SVAotCQkJCQl7Ci0JCQkJCQlFWFRfSFRfQ0FQX0lORk8gZXh0SHRDYXBJbmZvOwotCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSgmZXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pLCBzaXplb2YoRVhUX0hUX0NBUF9JTkZPKSk7Ci0JCQkJCQkqKFVTSE9SVCAqKSgmZXh0SHRDYXBJbmZvKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZleHRIdENhcEluZm8pKTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSwgKFBVQ0hBUikoJmV4dEh0Q2FwSW5mbyksIHNpemVvZihFWFRfSFRfQ0FQX0lORk8pKTsKLQkJCQkJfQotI2Vsc2UKLQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pKTsKLSNlbmRpZiAvLyBVTkFMSUdOTUVOVF9TVVBQT1JUIC8vCi0KLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRDYXBhYmlsaXR5VG1wLAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2Vsc2UKLQkJCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAmVG1wLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkJMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJCUh0TGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQkJCQl9Ci0JCQkJRnJhbWVMZW4gKz0gVG1wOwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCA9PSAxKQotCQkJCXsKLQkJCQkJVUxPTkcJCVRtcDsKLQkJCQkJSHRMZW4gPSAxOwotCQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcCwKLQkJCQkJCQkJCSAgMSwJCQkJCSZFeHRIdENhcEllLAotCQkJCQkJCQkJICAxLAkJCQkJJkh0TGVuLAotCQkJCQkJCQkJICAxLAkJCQkmcEFkLT5Db21tb25DZmcuQlNTQ29leGlzdDIwNDAud29yZCwKLQkJCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCQkJCUZyYW1lTGVuICs9IFRtcDsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQkJfQotCi0JCS8vIEZvciBTQ0FOX0NJU0NPX1BBU1NJVkUsIGRvIG5vdGhpbmcgYW5kIHNpbGVudGx5IHdhaXQgZm9yIGJlYWNvbiBvciBvdGhlciBwcm9iZSByZXBvbnNlCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTQ0FOX0xJU1RFTjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCX0KLX0KLQotVk9JRCBNZ3RQcm9iUmVxTWFjSGVhZGVySW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQgUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotCUlOIFVDSEFSIFN1YlR5cGUsCi0JSU4gVUNIQVIgVG9EcywKLQlJTiBQVUNIQVIgcERBLAotCUlOIFBVQ0hBUiBwQnNzaWQpCi17Ci0JTmRpc1plcm9NZW1vcnkocEhkcjgwMjExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCi0JcEhkcjgwMjExLT5GQy5UeXBlID0gQlRZUEVfTUdNVDsKLQlwSGRyODAyMTEtPkZDLlN1YlR5cGUgPSBTdWJUeXBlOwotCWlmIChTdWJUeXBlID09IFNVQlRZUEVfQUNLKQotCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOwotCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOwotCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3RraXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV90a2lwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDc0ZjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3RraXAuYworKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNtbV90a2lwLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlQYXVsIFd1CQkwMi0yNS0wMgkJSW5pdGlhbAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8vIFJvdGF0aW9uIGZ1bmN0aW9ucyBvbiAzMiBiaXQgdmFsdWVzCi0jZGVmaW5lIFJPTDMyKCBBLCBuICkgXAotCSggKChBKSA8PCAobikpIHwgKCAoKEEpPj4oMzItKG4pKSkgJiAoICgxVUwgPDwgKG4pKSAtIDEgKSApICkKLSNkZWZpbmUgUk9SMzIoIEEsIG4gKSBST0wzMiggKEEpLCAzMi0obikgKQotCi1VSU5UIFRraXBfU2JveF9Mb3dlclsyNTZdID0KLXsKLQkweEE1LDB4ODQsMHg5OSwweDhELDB4MEQsMHhCRCwweEIxLDB4NTQsCi0JMHg1MCwweDAzLDB4QTksMHg3RCwweDE5LDB4NjIsMHhFNiwweDlBLAotCTB4NDUsMHg5RCwweDQwLDB4ODcsMHgxNSwweEVCLDB4QzksMHgwQiwKLQkweEVDLDB4NjcsMHhGRCwweEVBLDB4QkYsMHhGNywweDk2LDB4NUIsCi0JMHhDMiwweDFDLDB4QUUsMHg2QSwweDVBLDB4NDEsMHgwMiwweDRGLAotCTB4NUMsMHhGNCwweDM0LDB4MDgsMHg5MywweDczLDB4NTMsMHgzRiwKLQkweDBDLDB4NTIsMHg2NSwweDVFLDB4MjgsMHhBMSwweDBGLDB4QjUsCi0JMHgwOSwweDM2LDB4OUIsMHgzRCwweDI2LDB4NjksMHhDRCwweDlGLAotCTB4MUIsMHg5RSwweDc0LDB4MkUsMHgyRCwweEIyLDB4RUUsMHhGQiwKLQkweEY2LDB4NEQsMHg2MSwweENFLDB4N0IsMHgzRSwweDcxLDB4OTcsCi0JMHhGNSwweDY4LDB4MDAsMHgyQywweDYwLDB4MUYsMHhDOCwweEVELAotCTB4QkUsMHg0NiwweEQ5LDB4NEIsMHhERSwweEQ0LDB4RTgsMHg0QSwKLQkweDZCLDB4MkEsMHhFNSwweDE2LDB4QzUsMHhENywweDU1LDB4OTQsCi0JMHhDRiwweDEwLDB4MDYsMHg4MSwweEYwLDB4NDQsMHhCQSwweEUzLAotCTB4RjMsMHhGRSwweEMwLDB4OEEsMHhBRCwweEJDLDB4NDgsMHgwNCwKLQkweERGLDB4QzEsMHg3NSwweDYzLDB4MzAsMHgxQSwweDBFLDB4NkQsCi0JMHg0QywweDE0LDB4MzUsMHgyRiwweEUxLDB4QTIsMHhDQywweDM5LAotCTB4NTcsMHhGMiwweDgyLDB4NDcsMHhBQywweEU3LDB4MkIsMHg5NSwKLQkweEEwLDB4OTgsMHhEMSwweDdGLDB4NjYsMHg3RSwweEFCLDB4ODMsCi0JMHhDQSwweDI5LDB4RDMsMHgzQywweDc5LDB4RTIsMHgxRCwweDc2LAotCTB4M0IsMHg1NiwweDRFLDB4MUUsMHhEQiwweDBBLDB4NkMsMHhFNCwKLQkweDVELDB4NkUsMHhFRiwweEE2LDB4QTgsMHhBNCwweDM3LDB4OEIsCi0JMHgzMiwweDQzLDB4NTksMHhCNywweDhDLDB4NjQsMHhEMiwweEUwLAotCTB4QjQsMHhGQSwweDA3LDB4MjUsMHhBRiwweDhFLDB4RTksMHgxOCwKLQkweEQ1LDB4ODgsMHg2RiwweDcyLDB4MjQsMHhGMSwweEM3LDB4NTEsCi0JMHgyMywweDdDLDB4OUMsMHgyMSwweERELDB4REMsMHg4NiwweDg1LAotCTB4OTAsMHg0MiwweEM0LDB4QUEsMHhEOCwweDA1LDB4MDEsMHgxMiwKLQkweEEzLDB4NUYsMHhGOSwweEQwLDB4OTEsMHg1OCwweDI3LDB4QjksCi0JMHgzOCwweDEzLDB4QjMsMHgzMywweEJCLDB4NzAsMHg4OSwweEE3LAotCTB4QjYsMHgyMiwweDkyLDB4MjAsMHg0OSwweEZGLDB4NzgsMHg3QSwKLQkweDhGLDB4RjgsMHg4MCwweDE3LDB4REEsMHgzMSwweEM2LDB4QjgsCi0JMHhDMywweEIwLDB4NzcsMHgxMSwweENCLDB4RkMsMHhENiwweDNBCi19OwotCi1VSU5UIFRraXBfU2JveF9VcHBlclsyNTZdID0KLXsKLQkweEM2LDB4RjgsMHhFRSwweEY2LDB4RkYsMHhENiwweERFLDB4OTEsCi0JMHg2MCwweDAyLDB4Q0UsMHg1NiwweEU3LDB4QjUsMHg0RCwweEVDLAotCTB4OEYsMHgxRiwweDg5LDB4RkEsMHhFRiwweEIyLDB4OEUsMHhGQiwKLQkweDQxLDB4QjMsMHg1RiwweDQ1LDB4MjMsMHg1MywweEU0LDB4OUIsCi0JMHg3NSwweEUxLDB4M0QsMHg0QywweDZDLDB4N0UsMHhGNSwweDgzLAotCTB4NjgsMHg1MSwweEQxLDB4RjksMHhFMiwweEFCLDB4NjIsMHgyQSwKLQkweDA4LDB4OTUsMHg0NiwweDlELDB4MzAsMHgzNywweDBBLDB4MkYsCi0JMHgwRSwweDI0LDB4MUIsMHhERiwweENELDB4NEUsMHg3RiwweEVBLAotCTB4MTIsMHgxRCwweDU4LDB4MzQsMHgzNiwweERDLDB4QjQsMHg1QiwKLQkweEE0LDB4NzYsMHhCNywweDdELDB4NTIsMHhERCwweDVFLDB4MTMsCi0JMHhBNiwweEI5LDB4MDAsMHhDMSwweDQwLDB4RTMsMHg3OSwweEI2LAotCTB4RDQsMHg4RCwweDY3LDB4NzIsMHg5NCwweDk4LDB4QjAsMHg4NSwKLQkweEJCLDB4QzUsMHg0RiwweEVELDB4ODYsMHg5QSwweDY2LDB4MTEsCi0JMHg4QSwweEU5LDB4MDQsMHhGRSwweEEwLDB4NzgsMHgyNSwweDRCLAotCTB4QTIsMHg1RCwweDgwLDB4MDUsMHgzRiwweDIxLDB4NzAsMHhGMSwKLQkweDYzLDB4NzcsMHhBRiwweDQyLDB4MjAsMHhFNSwweEZELDB4QkYsCi0JMHg4MSwweDE4LDB4MjYsMHhDMywweEJFLDB4MzUsMHg4OCwweDJFLAotCTB4OTMsMHg1NSwweEZDLDB4N0EsMHhDOCwweEJBLDB4MzIsMHhFNiwKLQkweEMwLDB4MTksMHg5RSwweEEzLDB4NDQsMHg1NCwweDNCLDB4MEIsCi0JMHg4QywweEM3LDB4NkIsMHgyOCwweEE3LDB4QkMsMHgxNiwweEFELAotCTB4REIsMHg2NCwweDc0LDB4MTQsMHg5MiwweDBDLDB4NDgsMHhCOCwKLQkweDlGLDB4QkQsMHg0MywweEM0LDB4MzksMHgzMSwweEQzLDB4RjIsCi0JMHhENSwweDhCLDB4NkUsMHhEQSwweDAxLDB4QjEsMHg5QywweDQ5LAotCTB4RDgsMHhBQywweEYzLDB4Q0YsMHhDQSwweEY0LDB4NDcsMHgxMCwKLQkweDZGLDB4RjAsMHg0QSwweDVDLDB4MzgsMHg1NywweDczLDB4OTcsCi0JMHhDQiwweEExLDB4RTgsMHgzRSwweDk2LDB4NjEsMHgwRCwweDBGLAotCTB4RTAsMHg3QywweDcxLDB4Q0MsMHg5MCwweDA2LDB4RjcsMHgxQywKLQkweEMyLDB4NkEsMHhBRSwweDY5LDB4MTcsMHg5OSwweDNBLDB4MjcsCi0JMHhEOSwweEVCLDB4MkIsMHgyMiwweEQyLDB4QTksMHgwNywweDMzLAotCTB4MkQsMHgzQywweDE1LDB4QzksMHg4NywweEFBLDB4NTAsMHhBNSwKLQkweDAzLDB4NTksMHgwOSwweDFBLDB4NjUsMHhENywweDg0LDB4RDAsCi0JMHg4MiwweDI5LDB4NUEsMHgxRSwweDdCLDB4QTgsMHg2RCwweDJDCi19OwotCi0vLwotLy8gRXhwYW5kZWQgSVYgZm9yIFRLSVAgZnVuY3Rpb24uCi0vLwotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9JVl9DT05UUk9MXwotewotCXVuaW9uIFBBQ0tFRAotCXsKLQkJc3RydWN0IFBBQ0tFRAotCQl7Ci0JCQlVQ0hBUgkJcmMwOwotCQkJVUNIQVIJCXJjMTsKLQkJCVVDSEFSCQlyYzI7Ci0KLQkJCXVuaW9uIFBBQ0tFRAotCQkJewotCQkJCXN0cnVjdCBQQUNLRUQKLQkJCQl7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCQlVQ0hBUglLZXlJRDoyOwotCQkJCQlVQ0hBUglFeHRJVjoxOwotCQkJCQlVQ0hBUglSc3ZkOjU7Ci0jZWxzZQotCQkJCQlVQ0hBUglSc3ZkOjU7Ci0JCQkJCVVDSEFSCUV4dElWOjE7Ci0JCQkJCVVDSEFSCUtleUlEOjI7Ci0jZW5kaWYKLQkJCQl9CWZpZWxkOwotCQkJCVVDSEFSCQlCeXRlOwotCQkJfQlDT05UUk9MOwotCQl9CWZpZWxkOwotCi0JCVVMT05HCXdvcmQ7Ci0JfQlJVjE2OwotCi0JVUxPTkcJSVYzMjsKLX0JVEtJUF9JViwgKlBUS0lQX0lWOwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb252ZXJ0IGZyb20gVUNIQVJbXSB0byBVTE9ORyBpbiBhIHBvcnRhYmxlIHdheQotCi0JQXJndW1lbnRzOgotICAgICAgcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VTE9ORwlSVE1QVGtpcEdldFVJbnQzMigKLQlJTglQVUNIQVIJcE1JQ0tleSkKLXsKLQlVTE9ORwlyZXMgPSAwOwotCUlOVAkJaTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlyZXMgfD0gKCpwTUlDS2V5KyspIDw8ICg4ICogaSk7Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNvbnZlcnQgZnJvbSBVTE9ORyB0byBVQ0hBUltdIGluIGEgcG9ydGFibGUgd2F5Ci0KLQlBcmd1bWVudHM6Ci0gICAgICBwRHN0CQkJcG9pbnRlciB0byBkZXN0aW5hdGlvbiBmb3IgY29udmVydCBVTE9ORyB0byBVQ0hBUltdCi0gICAgICB2YWwJCQl0aGUgdmFsdWUgZm9yIGNvbnZlcnQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QVGtpcFB1dFVJbnQzMigKLQlJTiBPVVQJUFVDSEFSCQlwRHN0LAotCUlOCQlVTE9ORwkJdmFsKQotewotCUlOVCBpOwotCi0JZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkJKnBEc3QrKyA9IChVQ0hBUikgKHZhbCAmIDB4ZmYpOwotCQl2YWwgPj49IDg7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJU2V0IHRoZSBNSUMgS2V5LgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICBwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QVGtpcFNldE1JQ0tleSgKLQlJTglQVEtJUF9LRVlfSU5GTwlwVGtpcCwKLQlJTglQVUNIQVIJCQlwTUlDS2V5KQotewotCS8vIFNldCB0aGUga2V5Ci0JcFRraXAtPkswID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSk7Ci0JcFRraXAtPksxID0gUlRNUFRraXBHZXRVSW50MzIocE1JQ0tleSArIDQpOwotCS8vIGFuZCByZXNldCB0aGUgbWVzc2FnZQotCXBUa2lwLT5MID0gcFRraXAtPkswOwotCXBUa2lwLT5SID0gcFRraXAtPksxOwotCXBUa2lwLT5uQnl0ZXNJbk0gPSAwOwotCXBUa2lwLT5NID0gMDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICB1Q2hhcgkJCUFwcGVuZCB0aGlzIHVDaGFyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFRraXBBcHBlbmRCeXRlKAotCUlOCVBUS0lQX0tFWV9JTkZPCXBUa2lwLAotCUlOCVVDSEFSCQkJdUNoYXIpCi17Ci0JLy8gQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlcgotCXBUa2lwLT5NIHw9ICh1Q2hhciA8PCAoOCogcFRraXAtPm5CeXRlc0luTSkpOwotCXBUa2lwLT5uQnl0ZXNJbk0rKzsKLQkvLyBQcm9jZXNzIHRoZSB3b3JkIGlmIGl0IGlzIGZ1bGwuCi0JaWYoIHBUa2lwLT5uQnl0ZXNJbk0gPj0gNCApCi0JewotCQlwVGtpcC0+TCBePSBwVGtpcC0+TTsKLQkJcFRraXAtPlIgXj0gUk9MMzIoIHBUa2lwLT5MLCAxNyApOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJcFRraXAtPlIgXj0gKChwVGtpcC0+TCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChwVGtpcC0+TCAmIDB4MDBmZjAwZmYpIDw8IDgpOwotCQlwVGtpcC0+TCArPSBwVGtpcC0+UjsKLQkJcFRraXAtPlIgXj0gUk9MMzIoIHBUa2lwLT5MLCAzICk7Ci0JCXBUa2lwLT5MICs9IHBUa2lwLT5SOwotCQlwVGtpcC0+UiBePSBST1IzMiggcFRraXAtPkwsIDIgKTsKLQkJcFRraXAtPkwgKz0gcFRraXAtPlI7Ci0JCS8vIENsZWFyIHRoZSBidWZmZXIKLQkJcFRraXAtPk0gPSAwOwotCQlwVGtpcC0+bkJ5dGVzSW5NID0gMDsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDYWxjdWxhdGUgdGhlIE1JQyBWYWx1ZS4KLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgcFNyYwkJCVBvaW50ZXIgdG8gc291cmNlIGRhdGEgZm9yIENhbGN1bGF0ZSBNSUMgVmFsdWUKLSAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFRraXBBcHBlbmQoCi0JSU4JUFRLSVBfS0VZX0lORk8JcFRraXAsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJbkJ5dGVzKQotewotCS8vIFRoaXMgaXMgc2ltcGxlCi0Jd2hpbGUobkJ5dGVzID4gMCkKLQl7Ci0JCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgKnBTcmMrKyk7Ci0JCW5CeXRlcy0tOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUdldCB0aGUgTUlDIFZhbHVlLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQkJdGhlIE1JQyBWYWx1ZSBpcyBzdG9yZSBpbiBwQWQtPlByaXZhdGVJbmZvLk1JQwotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFRraXBHZXRNSUMoCi0JSU4JUFRLSVBfS0VZX0lORk8JcFRraXApCi17Ci0JLy8gQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcKLQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDB4NWEgKTsKLQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKLQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKLQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKLQlSVE1QVGtpcEFwcGVuZEJ5dGUocFRraXAsIDAgKTsKLQkvLyBhbmQgdGhlbiB6ZXJvZXMgdW50aWwgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQKLQl3aGlsZSggcFRraXAtPm5CeXRlc0luTSAhPSAwICkKLQl7Ci0JCVJUTVBUa2lwQXBwZW5kQnl0ZShwVGtpcCwgMCApOwotCX0KLQkvLyBUaGUgYXBwZW5kQnl0ZSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVzdWx0LgotCVJUTVBUa2lwUHV0VUludDMyKHBUa2lwLT5NSUMsIHBUa2lwLT5MKTsKLQlSVE1QVGtpcFB1dFVJbnQzMihwVGtpcC0+TUlDICsgNCwgcFRraXAtPlIpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJSW5pdCBUa2lwIGZ1bmN0aW9uLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBUS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIFRlbXBvcmFsIEtleSAoVEspLCBUSyBzaGFsbCBiZSAxMjhiaXRzLgotCQlLZXlJZAkJVEsgS2V5IElECi0JCXBUQQkJCVBvaW50ZXIgdG8gdHJhbnNtaXR0ZXIgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSW5pdFRraXBFbmdpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEtleSwKLQlJTglVQ0hBUgkJCUtleUlkLAotCUlOCVBVQ0hBUgkJCXBUQSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5LAotCUlOCVBVQ0hBUgkJCXBUU0MsCi0JT1VUCVBVTE9ORwkJCXBJVjE2LAotCU9VVAlQVUxPTkcJCQlwSVYzMikKLXsKLQlUS0lQX0lWCXRraXBJdjsKLQotCS8vIFByZXBhcmUgOCBieXRlcyBUS0lQIGVuY2Fwc3VsYXRpb24gZm9yIE1QRFUKLQlOZGlzWmVyb01lbW9yeSgmdGtpcEl2LCBzaXplb2YoVEtJUF9JVikpOwotCXRraXBJdi5JVjE2LmZpZWxkLnJjMCA9ICoocFRTQyArIDEpOwotCXRraXBJdi5JVjE2LmZpZWxkLnJjMSA9ICh0a2lwSXYuSVYxNi5maWVsZC5yYzAgfCAweDIwKSAmIDB4N2Y7Ci0JdGtpcEl2LklWMTYuZmllbGQucmMyID0gKnBUU0M7Ci0JdGtpcEl2LklWMTYuZmllbGQuQ09OVFJPTC5maWVsZC5FeHRJViA9IDE7ICAvLyAwOiBub24tZXh0ZW5kZWQgSVYsIDE6IGFuIGV4dGVuZGVkIElWCi0JdGtpcEl2LklWMTYuZmllbGQuQ09OVFJPTC5maWVsZC5LZXlJRCA9IEtleUlkOwotLy8JdGtpcEl2LklWMzIgPSAqKFBVTE9ORykocFRTQyArIDIpOwotCU5kaXNNb3ZlTWVtb3J5KCZ0a2lwSXYuSVYzMiwgKHBUU0MgKyAyKSwgNCk7ICAgLy8gQ29weSBJVgotCi0JKnBJVjE2ID0gdGtpcEl2LklWMTYud29yZDsKLQkqcElWMzIgPSB0a2lwSXYuSVYzMjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUluaXQgTUlDIFZhbHVlIGNhbGN1bGF0aW9uIGZ1bmN0aW9uIHdoaWNoIGluY2x1ZGUgc2V0IE1JQyBrZXkgJgotCQljYWxjdWxhdGUgZmlyc3QgMTYgYnl0ZXMgKERBICsgU0EgKyBwcmlvcml0eSArICAwKQotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBUS2V5ICAgICAgIFBvaW50ZXIgdG8gdGhlIFRlbXBvcmFsIEtleSAoVEspLCBUSyBzaGFsbCBiZSAxMjhiaXRzLgotCQlwREEJCQlQb2ludGVyIHRvIERBIGFkZHJlc3MKLQkJcFNBCQkJUG9pbnRlciB0byBTQSBhZGRyZXNzCi0JCXBNSUNLZXkJCXBvaW50ZXIgdG8gTUlDIEtleQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QSW5pdE1JQ0VuZ2luZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwS2V5LAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTglQVUNIQVIJCQlwU0EsCi0JSU4gIFVDSEFSICAgICAgICAgICBVc2VyUHJpb3JpdHksCi0JSU4JUFVDSEFSCQkJcE1JQ0tleSkKLXsKLQlVTE9ORyBQcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKLQotCS8vIEluaXQgTUlDIHZhbHVlIGNhbGN1bGF0aW9uCi0JUlRNUFRraXBTZXRNSUNLZXkoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBNSUNLZXkpOwotCS8vIERBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBTQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlR4LCBwU0EsIE1BQ19BRERSX0xFTik7Ci0JLy8gUHJpb3JpdHkgKyAzIGJ5dGVzIG9mIDAKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgKFBVQ0hBUikmUHJpb3JpdHksIDQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29tcGFyZSBNSUMgdmFsdWUgb2YgcmVjZWl2ZWQgTVNEVQotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBQbGFpbiB0ZXh0IGRhdGEKLQkJcERBCQkJUG9pbnRlciB0byBEQSBhZGRyZXNzCi0JCXBTQQkJCVBvaW50ZXIgdG8gU0EgYWRkcmVzcwotCQlwTUlDS2V5CQlwb2ludGVyIHRvIE1JQyBLZXkKLQkJTGVuICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGxhaW4gdGV4dCBkYXRhIGV4Y2x1ZGUgTUlDIHZhbHVlCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUgICAgICAgIE1JQyB2YWx1ZSBtYXRjaGVkCi0JCUZBTFNFICAgICAgIE1JQyB2YWx1ZSBtaXNtYXRjaGVkCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JUFVDSEFSCQkJcERBLAotCUlOCVBVQ0hBUgkJCXBTQSwKLQlJTglQVUNIQVIJCQlwTUlDS2V5LAotCUlOCVVDSEFSCQkJVXNlclByaW9yaXR5LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JVUNIQVIJT2xkTWljWzhdOwotCVVMT05HCVByaW9yaXR5ID0gVXNlclByaW9yaXR5OwotCi0JLy8gSW5pdCBNSUMgdmFsdWUgY2FsY3VsYXRpb24KLQlSVE1QVGtpcFNldE1JQ0tleSgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcE1JQ0tleSk7Ci0JLy8gREEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcERBLCBNQUNfQUREUl9MRU4pOwotCS8vIFNBCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTQSwgTUFDX0FERFJfTEVOKTsKLQkvLyBQcmlvcml0eSArIDMgYnl0ZXMgb2YgMAotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCAoUFVDSEFSKSZQcmlvcml0eSwgNCk7Ci0KLQkvLyBDYWxjdWxhdGUgTUlDIHZhbHVlIGZyb20gcGxhaW4gdGV4dCBkYXRhCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIHBTcmMsIExlbik7Ci0KLQkvLyBHZXQgTUlDIHZhbHVkZSBmcm9tIHJlY2VpdmVkIGZyYW1lCi0JTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwU3JjICsgTGVuLCA4KTsKLQotCS8vIEdldCBNSUMgdmFsdWUgZnJvbSBkZWNyeXB0ZWQgcGxhaW4gZGF0YQotCVJUTVBUa2lwR2V0TUlDKCZwQWQtPlByaXZhdGVJbmZvLlJ4KTsKLQotCS8vIE1vdmUgTUlDIHZhbHVlIGZyb20gTVNEVSwgdGhpcyBzdGVwcyBzaG91bGQgbW92ZSB0byBkYXRhIHBhdGguCi0JLy8gU2luY2UgdGhlIE1JQyB2YWx1ZSBtaWdodCBjcm9zcyBNUERVcy4KLQlpZighTmRpc0VxdWFsTWVtb3J5KHBBZC0+UHJpdmF0ZUluZm8uUnguTUlDLCBPbGRNaWMsIDgpKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCAoIlJUTVBUa2lwQ29tcGFyZU1JQ1ZhbHVlKCk6IFRLSVAgTUlDIEVycm9yICFcbiIpKTsgIC8vTUlDIGVycm9yLgotCi0KLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXJldHVybiAoVFJVRSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDb21wYXJlIE1JQyB2YWx1ZSBvZiByZWNlaXZlZCBNU0RVCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBMTEMJCUxMQyBoZWFkZXIKLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgcmVjZWl2ZWQgUGxhaW4gdGV4dCBkYXRhCi0JCXBEQQkJCVBvaW50ZXIgdG8gREEgYWRkcmVzcwotCQlwU0EJCQlQb2ludGVyIHRvIFNBIGFkZHJlc3MKLQkJcE1JQ0tleQkJcG9pbnRlciB0byBNSUMgS2V5Ci0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBsYWluIHRleHQgZGF0YSBleGNsdWRlIE1JQyB2YWx1ZQotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFICAgICAgICBNSUMgdmFsdWUgbWF0Y2hlZAotCQlGQUxTRSAgICAgICBNSUMgdmFsdWUgbWlzbWF0Y2hlZAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZVdpdGhMTEMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcExMQywKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTglQVUNIQVIJCQlwU0EsCi0JSU4JUFVDSEFSCQkJcE1JQ0tleSwKLQlJTglVSU5UCQkJTGVuKQotewotCVVDSEFSCU9sZE1pY1s4XTsKLQlVTE9ORwlQcmlvcml0eSA9IDA7Ci0KLQkvLyBJbml0IE1JQyB2YWx1ZSBjYWxjdWxhdGlvbgotCVJUTVBUa2lwU2V0TUlDS2V5KCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTUlDS2V5KTsKLQkvLyBEQQotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwREEsIE1BQ19BRERSX0xFTik7Ci0JLy8gU0EKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNBLCBNQUNfQUREUl9MRU4pOwotCS8vIFByaW9yaXR5ICsgMyBieXRlcyBvZiAwCi0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uUngsIChQVUNIQVIpJlByaW9yaXR5LCA0KTsKLQotCS8vIFN0YXJ0IHdpdGggTExDIGhlYWRlcgotCVJUTVBUa2lwQXBwZW5kKCZwQWQtPlByaXZhdGVJbmZvLlJ4LCBwTExDLCA4KTsKLQotCS8vIENhbGN1bGF0ZSBNSUMgdmFsdWUgZnJvbSBwbGFpbiB0ZXh0IGRhdGEKLQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5SeCwgcFNyYywgTGVuKTsKLQotCS8vIEdldCBNSUMgdmFsdWRlIGZyb20gcmVjZWl2ZWQgZnJhbWUKLQlOZGlzTW92ZU1lbW9yeShPbGRNaWMsIHBTcmMgKyBMZW4sIDgpOwotCi0JLy8gR2V0IE1JQyB2YWx1ZSBmcm9tIGRlY3J5cHRlZCBwbGFpbiBkYXRhCi0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uUngpOwotCi0JLy8gTW92ZSBNSUMgdmFsdWUgZnJvbSBNU0RVLCB0aGlzIHN0ZXBzIHNob3VsZCBtb3ZlIHRvIGRhdGEgcGF0aC4KLQkvLyBTaW5jZSB0aGUgTUlDIHZhbHVlIG1pZ2h0IGNyb3NzIE1QRFVzLgotCWlmKCFOZGlzRXF1YWxNZW1vcnkocEFkLT5Qcml2YXRlSW5mby5SeC5NSUMsIE9sZE1pYywgOCkpCi0JewotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsICgiUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKCk6IFRLSVAgTUlDIEVycm9yICFcbiIpKTsgIC8vTUlDIGVycm9yLgotCi0KLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXJldHVybiAoVFJVRSk7Ci19Ci0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0Ci0JYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIHRyYW5zbWl0IGZ1bmN0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlQTkRJU19QQUNLRVQJUG9pbnRlciB0byBOZGlzIFBhY2tldCBmb3IgTUlDIGNhbGN1bGF0aW9uCi0JCXBFbmNhcAkJCVBvaW50ZXIgdG8gTExDIGVuY2FwIGRhdGEKLQkJTGVuRW5jYXAJCVRvdGFsIGVuY2FwIGxlbmd0aCwgbWlnaHQgYmUgMCB3aGljaCBpbmRpY2F0ZXMgbm8gZW5jYXAKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QQ2FsY3VsYXRlTUlDVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcEVuY2FwLAotCUlOCVBDSVBIRVJfS0VZCQlwS2V5LAotCUlOCVVDSEFSCQkJYXBpZHgpCi17Ci0JUEFDS0VUX0lORk8JCVBhY2tldEluZm87Ci0JUFVDSEFSCQkJcFNyY0J1ZlZBOwotCVVJTlQJCQlTcmNCdWZMZW47Ci0JUFVDSEFSCQkJcFNyYzsKLSAgICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5OwotCVVDSEFSCQkJdmxhbl9vZmZzZXQgPSAwOwotCi0JUlRNUF9RdWVyeVBhY2tldEluZm8ocFBhY2tldCwgJlBhY2tldEluZm8sICZwU3JjQnVmVkEsICZTcmNCdWZMZW4pOwotCi0JVXNlclByaW9yaXR5ID0gUlRNUF9HRVRfUEFDS0VUX1VQKHBQYWNrZXQpOwotCXBTcmMgPSBwU3JjQnVmVkE7Ci0KLQkvLyBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHZsYW4gcGFja2V0Ci0JaWYgKCgoKihwU3JjICsgMTIpIDw8IDgpICsgKihwU3JjICsgMTMpKSA9PSAweDgxMDApCi0JCXZsYW5fb2Zmc2V0ID0gNDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCXsKLQkJUlRNUEluaXRNSUNFbmdpbmUoCi0JCQlwQWQsCi0JCQlwS2V5LT5LZXksCi0JCQlwU3JjLAotCQkJcFNyYyArIDYsCi0JCQlVc2VyUHJpb3JpdHksCi0JCQlwS2V5LT5UeE1pYyk7Ci0JfQotCi0KLQlpZiAocEVuY2FwICE9IE5VTEwpCi0JewotCQkvLyBMTEMgZW5jYXBzdWxhdGlvbgotCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcEVuY2FwLCA2KTsKLQkJLy8gUHJvdG9jb2wgVHlwZQotCQlSVE1QVGtpcEFwcGVuZCgmcEFkLT5Qcml2YXRlSW5mby5UeCwgcFNyYyArIDEyICsgdmxhbl9vZmZzZXQsIDIpOwotCX0KLQlTcmNCdWZMZW4gLT0gKDE0ICsgdmxhbl9vZmZzZXQpOwotCXBTcmMgKz0gKDE0ICsgdmxhbl9vZmZzZXQpOwotCWRvCi0JewotCQlpZiAoU3JjQnVmTGVuID4gMCkKLQkJewotCQkJUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBTcmMsIFNyY0J1Zkxlbik7Ci0JCX0KLQotCQlicmVhazsJLy8gTm8gbmVlZCBoYW5kbGUgbmV4dCBwYWNrZXQKLQotCX0Jd2hpbGUgKFRSVUUpOwkJLy8gRW5kIG9mIGNvcHlpbmcgcGF5bG9hZAotCi0JLy8gQ29tcHV0ZSB0aGUgZmluYWwgTUlDIFZhbHVlCi0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uVHgpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0a2lwX3Nib3goKQkJCQkJCQkJCQkJCQkJCQkqLwotLyogUmV0dXJucyBhIDE2IGJpdCB2YWx1ZSBmcm9tIGEgNjRLIGVudHJ5IHRhYmxlLiBUaGUgVGFibGUgKi8KLS8qIGlzIHN5bnRoZXNpemVkIGZyb20gdHdvIDI1NiBlbnRyeSBieXRlIHdpZGUgdGFibGVzLgkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVJTlQgdGtpcF9zYm94KFVJTlQgaW5kZXgpCi17Ci0JVUlOVCBpbmRleF9sb3c7Ci0JVUlOVCBpbmRleF9oaWdoOwotCVVJTlQgbGVmdCwgcmlnaHQ7Ci0KLQlpbmRleF9sb3cgPSAoaW5kZXggJSAyNTYpOwotCWluZGV4X2hpZ2ggPSAoKGluZGV4ID4+IDgpICUgMjU2KTsKLQotCWxlZnQgPSBUa2lwX1Nib3hfTG93ZXJbaW5kZXhfbG93XSArIChUa2lwX1Nib3hfVXBwZXJbaW5kZXhfbG93XSAqIDI1Nik7Ci0JcmlnaHQgPSBUa2lwX1Nib3hfVXBwZXJbaW5kZXhfaGlnaF0gKyAoVGtpcF9TYm94X0xvd2VyW2luZGV4X2hpZ2hdICogMjU2KTsKLQotCXJldHVybiAobGVmdCBeIHJpZ2h0KTsKLX0KLQotVUlOVCByb3RyMShVSU5UIGEpCi17Ci0JdW5zaWduZWQgaW50IGI7Ci0KLQlpZiAoKGEgJiAweDAxKSA9PSAweDAxKQotCXsKLQkJYiA9IChhID4+IDEpIHwgMHg4MDAwOwotCX0KLQllbHNlCi0JewotCQliID0gKGEgPj4gMSkgJiAweDdmZmY7Ci0JfQotCWIgPSBiICUgNjU1MzY7Ci0JcmV0dXJuIGI7Ci19Ci0KLVZPSUQgUlRNUFRraXBNaXhLZXkoCi0JVUNIQVIgKmtleSwKLQlVQ0hBUiAqdGEsCi0JVUxPTkcgcG5sLCAvKiBMZWFzdCBzaWduaWZpY2FudCAxNiBiaXRzIG9mIFBOICovCi0JVUxPTkcgcG5oLCAvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KLQlVQ0hBUiAqcmM0a2V5LAotCVVJTlQgKnAxaykKLXsKLQotCVVJTlQgdHNjMDsKLQlVSU5UIHRzYzE7Ci0JVUlOVCB0c2MyOwotCi0JVUlOVCBwcGswOwotCVVJTlQgcHBrMTsKLQlVSU5UIHBwazI7Ci0JVUlOVCBwcGszOwotCVVJTlQgcHBrNDsKLQlVSU5UIHBwazU7Ci0KLQlJTlQgaTsKLQlJTlQgajsKLQotCXRzYzAgPSAodW5zaWduZWQgaW50KSgocG5oID4+IDE2KSAlIDY1NTM2KTsgLyogbXNiICovCi0JdHNjMSA9ICh1bnNpZ25lZCBpbnQpKHBuaCAlIDY1NTM2KTsKLQl0c2MyID0gKHVuc2lnbmVkIGludCkocG5sICUgNjU1MzYpOyAvKiBsc2IgKi8KLQotCS8qIFBoYXNlIDEsIHN0ZXAgMSAqLwotCXAxa1swXSA9IHRzYzE7Ci0JcDFrWzFdID0gdHNjMDsKLQlwMWtbMl0gPSAoVUlOVCkodGFbMF0gKyAodGFbMV0qMjU2KSk7Ci0JcDFrWzNdID0gKFVJTlQpKHRhWzJdICsgKHRhWzNdKjI1NikpOwotCXAxa1s0XSA9IChVSU5UKSh0YVs0XSArICh0YVs1XSoyNTYpKTsKLQotCS8qIFBoYXNlIDEsIHN0ZXAgMiAqLwotCWZvciAoaT0wOyBpPDg7IGkrKykKLQl7Ci0JCWogPSAyKihpICYgMSk7Ci0JCXAxa1swXSA9IChwMWtbMF0gKyB0a2lwX3Nib3goIChwMWtbNF0gXiAoKDI1NiprZXlbMStqXSkgKyBrZXlbal0pKSAlIDY1NTM2ICkpICUgNjU1MzY7Ci0JCXAxa1sxXSA9IChwMWtbMV0gKyB0a2lwX3Nib3goIChwMWtbMF0gXiAoKDI1NiprZXlbNStqXSkgKyBrZXlbNCtqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzJdID0gKHAxa1syXSArIHRraXBfc2JveCggKHAxa1sxXSBeICgoMjU2KmtleVs5K2pdKSArIGtleVs4K2pdKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbM10gPSAocDFrWzNdICsgdGtpcF9zYm94KCAocDFrWzJdIF4gKCgyNTYqa2V5WzEzK2pdKSArIGtleVsxMitqXSkpICUgNjU1MzYgKSkgJSA2NTUzNjsKLQkJcDFrWzRdID0gKHAxa1s0XSArIHRraXBfc2JveCggKHAxa1szXSBeICgoKDI1NiprZXlbMStqXSkgKyBrZXlbal0pKSkgJSA2NTUzNiApKSAlIDY1NTM2OwotCQlwMWtbNF0gPSAocDFrWzRdICsgaSkgJSA2NTUzNjsKLQl9Ci0KLQkvKiBQaGFzZSAyLCBTdGVwIDEgKi8KLQlwcGswID0gcDFrWzBdOwotCXBwazEgPSBwMWtbMV07Ci0JcHBrMiA9IHAxa1syXTsKLQlwcGszID0gcDFrWzNdOwotCXBwazQgPSBwMWtbNF07Ci0JcHBrNSA9IChwMWtbNF0gKyB0c2MyKSAlIDY1NTM2OwotCi0JLyogUGhhc2UyLCBTdGVwIDIgKi8KLQlwcGswID0gcHBrMCArIHRraXBfc2JveCggKHBwazUgXiAoKDI1NiprZXlbMV0pICsga2V5WzBdKSkgJSA2NTUzNik7Ci0JcHBrMSA9IHBwazEgKyB0a2lwX3Nib3goIChwcGswIF4gKCgyNTYqa2V5WzNdKSArIGtleVsyXSkpICUgNjU1MzYpOwotCXBwazIgPSBwcGsyICsgdGtpcF9zYm94KCAocHBrMSBeICgoMjU2KmtleVs1XSkgKyBrZXlbNF0pKSAlIDY1NTM2KTsKLQlwcGszID0gcHBrMyArIHRraXBfc2JveCggKHBwazIgXiAoKDI1NiprZXlbN10pICsga2V5WzZdKSkgJSA2NTUzNik7Ci0JcHBrNCA9IHBwazQgKyB0a2lwX3Nib3goIChwcGszIF4gKCgyNTYqa2V5WzldKSArIGtleVs4XSkpICUgNjU1MzYpOwotCXBwazUgPSBwcGs1ICsgdGtpcF9zYm94KCAocHBrNCBeICgoMjU2KmtleVsxMV0pICsga2V5WzEwXSkpICUgNjU1MzYpOwotCi0JcHBrMCA9IHBwazAgKyByb3RyMShwcGs1IF4gKCgyNTYqa2V5WzEzXSkgKyBrZXlbMTJdKSk7Ci0JcHBrMSA9IHBwazEgKyByb3RyMShwcGswIF4gKCgyNTYqa2V5WzE1XSkgKyBrZXlbMTRdKSk7Ci0JcHBrMiA9IHBwazIgKyByb3RyMShwcGsxKTsKLQlwcGszID0gcHBrMyArIHJvdHIxKHBwazIpOwotCXBwazQgPSBwcGs0ICsgcm90cjEocHBrMyk7Ci0JcHBrNSA9IHBwazUgKyByb3RyMShwcGs0KTsKLQotCS8qIFBoYXNlIDIsIFN0ZXAgMyAqLwotICAgIC8qIFBoYXNlIDIsIFN0ZXAgMyAqLwotCi0JdHNjMCA9ICh1bnNpZ25lZCBpbnQpKChwbmggPj4gMTYpICUgNjU1MzYpOyAvKiBtc2IgKi8KLQl0c2MxID0gKHVuc2lnbmVkIGludCkocG5oICUgNjU1MzYpOwotCXRzYzIgPSAodW5zaWduZWQgaW50KShwbmwgJSA2NTUzNik7IC8qIGxzYiAqLwotCi0JcmM0a2V5WzBdID0gKHRzYzIgPj4gOCkgJSAyNTY7Ci0JcmM0a2V5WzFdID0gKCgodHNjMiA+PiA4KSAlIDI1NikgfCAweDIwKSAmIDB4N2Y7Ci0JcmM0a2V5WzJdID0gdHNjMiAlIDI1NjsKLQlyYzRrZXlbM10gPSAoKHBwazUgXiAoKDI1NiprZXlbMV0pICsga2V5WzBdKSkgPj4gMSkgJSAyNTY7Ci0KLQlyYzRrZXlbNF0gPSBwcGswICUgMjU2OwotCXJjNGtleVs1XSA9IChwcGswID4+IDgpICUgMjU2OwotCi0JcmM0a2V5WzZdID0gcHBrMSAlIDI1NjsKLQlyYzRrZXlbN10gPSAocHBrMSA+PiA4KSAlIDI1NjsKLQotCXJjNGtleVs4XSA9IHBwazIgJSAyNTY7Ci0JcmM0a2V5WzldID0gKHBwazIgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbMTBdID0gcHBrMyAlIDI1NjsKLQlyYzRrZXlbMTFdID0gKHBwazMgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbMTJdID0gcHBrNCAlIDI1NjsKLQlyYzRrZXlbMTNdID0gKHBwazQgPj4gOCkgJSAyNTY7Ci0KLQlyYzRrZXlbMTRdID0gcHBrNSAlIDI1NjsKLQlyYzRrZXlbMTVdID0gKHBwazUgPj4gOCkgJSAyNTY7Ci19Ci0KLQotLy8KLS8vIFRSVUU6IFN1Y2Nlc3MhCi0vLyBGQUxTRTogRGVjcnlwdCBFcnJvciEKLS8vCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdFRLSVAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBEYXRhLAotCUlOIFVMT05HCURhdGFCeXRlQ250LAotCUlOIFVDSEFSICAgIFVzZXJQcmlvcml0eSwKLQlJTiBQQ0lQSEVSX0tFWQlwV3BhS2V5KQotewotCVVDSEFSCQkJS2V5SUQ7Ci0JVUlOVAkJCUhlYWRlckxlbjsKLSAgICBVQ0hBUgkJCWZjMDsKLQlVQ0hBUgkJCWZjMTsKLQlVU0hPUlQJCQlmYzsKLQlVSU5UCQkJZnJhbWVfdHlwZTsKLQlVSU5UCQkJZnJhbWVfc3VidHlwZTsKLSAgICBVSU5UCQkJZnJvbV9kczsKLSAgICBVSU5UCQkJdG9fZHM7Ci0JSU5UCQkJCWE0X2V4aXN0czsKLQlJTlQJCQkJcWNfZXhpc3RzOwotCVVTSE9SVAkJCWR1cmF0aW9uOwotCVVTSE9SVAkJCXNlcV9jb250cm9sOwotCVVTSE9SVAkJCXFvc19jb250cm9sOwotCVVDSEFSCQkJVEFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlTQVtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJUkM0S2V5WzE2XTsKLQlVSU5UCQkJcDFrWzVdOyAvL2ZvciBtaXhfa2V5OwotCVVMT05HCQkJcG5sOy8qIExlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgb2YgUE4gKi8KLQlVTE9ORwkJCXBuaDsvKiBNb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgUE4gKi8KLQlVSU5UCQkJbnVtX2Jsb2NrczsKLQlVSU5UCQkJcGF5bG9hZF9yZW1haW5kZXI7Ci0JQVJDRk9VUkNPTlRFWFQJQXJjRm91ckNvbnRleHQ7Ci0JVUlOVAkJCWNyYzMyID0gMDsKLQlVSU5UCQkJdHJhaWxmY3MgPSAwOwotCVVDSEFSCQkJTUlDWzhdOwotCVVDSEFSCQkJVHJhaWxNSUNbOF07Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKLSNlbmRpZgotCi0JZmMwID0gKnBEYXRhOwotCWZjMSA9ICoocERhdGEgKyAxKTsKLQotCWZjID0gKigoUFVTSE9SVClwRGF0YSk7Ci0KLQlmcmFtZV90eXBlID0gKChmYzAgPj4gMikgJiAweDAzKTsKLQlmcmFtZV9zdWJ0eXBlID0gKChmYzAgPj4gNCkgJiAweDBmKTsKLQotICAgIGZyb21fZHMgPSAoZmMxICYgMHgyKSA+PiAxOwotICAgIHRvX2RzID0gKGZjMSAmIDB4MSk7Ci0KLSAgICBhNF9leGlzdHMgPSAoZnJvbV9kcyAmIHRvX2RzKTsKLSAgICBxY19leGlzdHMgPSAoKGZyYW1lX3N1YnR5cGUgPT0gMHgwOCkgfHwgICAgLyogQXNzdW1lZCBRb1Mgc3VidHlwZXMgKi8KLSAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MDkpIHx8ICAgLyogTGlrZWx5IHRvIGNoYW5nZS4gICAgKi8KLSAgICAgICAgICAgICAgICAgIChmcmFtZV9zdWJ0eXBlID09IDB4MGEpIHx8Ci0gICAgICAgICAgICAgICAgICAoZnJhbWVfc3VidHlwZSA9PSAweDBiKQotICAgICAgICAgICAgICAgICApOwotCi0JSGVhZGVyTGVuID0gMjQ7Ci0JaWYgKGE0X2V4aXN0cykKLQkJSGVhZGVyTGVuICs9IDY7Ci0KLQlLZXlJRCA9ICooKFBVQ0hBUikocERhdGErIEhlYWRlckxlbiArIDMpKTsKLQlLZXlJRCA9IEtleUlEID4+IDY7Ci0KLQlpZiAocFdwYUtleVtLZXlJRF0uS2V5TGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU29mdERlY3J5cHRUS0lQIGZhaWxlZCEoS2V5SURbJWRdIExlbmd0aCBjYW4gbm90IGJlIDApXG4iLCBLZXlJRCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JZHVyYXRpb24gPSAqKChQVVNIT1JUKShwRGF0YSsyKSk7Ci0KLQlzZXFfY29udHJvbCA9ICooKFBVU0hPUlQpKHBEYXRhKzIyKSk7Ci0KLQlpZiAocWNfZXhpc3RzKQotCXsKLQkJaWYgKGE0X2V4aXN0cykKLQkJewotCQkJcW9zX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSszMCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcW9zX2NvbnRyb2wgPSAqKChQVVNIT1JUKShwRGF0YSsyNCkpOwotCQl9Ci0JfQotCi0JaWYgKHRvX2RzID09IDAgJiYgZnJvbV9kcyA9PSAxKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoREEsIHBEYXRhKzQsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KFNBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoVEEsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOyAgLy9CU1NJRAotCX0KLQllbHNlIGlmICh0b19kcyA9PSAwICYmIGZyb21fZHMgPT0gMCApCi0JewotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSs0LCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShTQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JfQotCWVsc2UgaWYgKHRvX2RzID09IDEgJiYgZnJvbV9kcyA9PSAwKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzEwLCBNQUNfQUREUl9MRU4pOwotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKLQl9Ci0JZWxzZSBpZiAodG9fZHMgPT0gMSAmJiBmcm9tX2RzID09IDEpCi0JewotCQlOZGlzTW92ZU1lbW9yeShUQSwgcERhdGErMTAsIE1BQ19BRERSX0xFTik7Ci0JCU5kaXNNb3ZlTWVtb3J5KERBLCBwRGF0YSsxNiwgTUFDX0FERFJfTEVOKTsKLQkJTmRpc01vdmVNZW1vcnkoU0EsIHBEYXRhKzIyLCBNQUNfQUREUl9MRU4pOwotCX0KLQotCW51bV9ibG9ja3MgPSAoRGF0YUJ5dGVDbnQgLSAxNikgLyAxNjsKLQlwYXlsb2FkX3JlbWFpbmRlciA9IChEYXRhQnl0ZUNudCAtIDE2KSAlIDE2OwotCi0JcG5sID0gKCoocERhdGEgKyBIZWFkZXJMZW4pKSAqIDI1NiArICoocERhdGEgKyBIZWFkZXJMZW4gKyAyKTsKLQlwbmggPSAqKChQVUxPTkcpKHBEYXRhICsgSGVhZGVyTGVuICsgNCkpOwotCXBuaCA9IGNwdTJsZTMyKHBuaCk7Ci0JUlRNUFRraXBNaXhLZXkocFdwYUtleVtLZXlJRF0uS2V5LCBUQSwgcG5sLCBwbmgsIFJDNEtleSwgcDFrKTsKLQotCUFSQ0ZPVVJfSU5JVCgmQXJjRm91ckNvbnRleHQsIFJDNEtleSwgMTYpOwotCi0JQVJDRk9VUl9ERUNSWVBUKCZBcmNGb3VyQ29udGV4dCwgcERhdGEgKyBIZWFkZXJMZW4sIHBEYXRhICsgSGVhZGVyTGVuICsgOCwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4KTsKLQlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBEYXRhICsgRGF0YUJ5dGVDbnQgLSA4IC0gNCwgNCk7Ci0JY3JjMzIgPSBSVE1QX0NBTENfRkNTMzIoUFBQSU5JVEZDUzMyLCBwRGF0YSArIEhlYWRlckxlbiwgRGF0YUJ5dGVDbnQgLSBIZWFkZXJMZW4gLSA4IC0gNCk7ICAvL1NraXAgSVYrRUlWIDggYnl0ZXMgJiBTa2lwIGxhc3QgNCBieXRlcyhGQ1MpLgotCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQotICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBTb2Z0RGVjcnlwdFRLSVAsIFdFUCBEYXRhIElDViBFcnJvciAhXG4iKSk7CSAvL0lDViBlcnJvci4KLQotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShUcmFpbE1JQywgcERhdGEgKyBEYXRhQnl0ZUNudCAtIDggLSA4IC0gNCwgOCk7Ci0JUlRNUEluaXRNSUNFbmdpbmUocEFkLCBwV3BhS2V5W0tleUlEXS5LZXksIERBLCBTQSwgVXNlclByaW9yaXR5LCBwV3BhS2V5W0tleUlEXS5SeE1pYyk7Ci0JUlRNUFRraXBBcHBlbmQoJnBBZC0+UHJpdmF0ZUluZm8uVHgsIHBEYXRhICsgSGVhZGVyTGVuLCBEYXRhQnl0ZUNudCAtIEhlYWRlckxlbiAtIDggLSAxMik7Ci0JUlRNUFRraXBHZXRNSUMoJnBBZC0+UHJpdmF0ZUluZm8uVHgpOwotCU5kaXNNb3ZlTWVtb3J5KE1JQywgcEFkLT5Qcml2YXRlSW5mby5UeC5NSUMsIDgpOwotCi0JaWYgKCFOZGlzRXF1YWxNZW1vcnkoTUlDLCBUcmFpbE1JQywgOCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSVE1QU29mdERlY3J5cHRUS0lQLCBXRVAgRGF0YSBNSUMgRXJyb3IgIVxuIikpOwkgLy9NSUMgZXJyb3IuCi0JCS8vUlRNUFJlcG9ydE1pY0Vycm9yKHBBZCwgJnBXcGFLZXlbS2V5SURdKTsJLy8gbWFya2VkIGJ5IEFsYmVydFkgQCAyMDA2MDYzMAotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKFBVQ0hBUilwRGF0YSwgRElSX1JFQUQsIEZBTFNFKTsKLSNlbmRpZgotCS8vREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICJSVE1QU29mdERlY3J5cHRUS0lQIERlY3JpcHQgZG9uZSEhXG4iKTsKLQlyZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NtbV93ZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkZGZiMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fd2VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX3dlcC5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUGF1bCBXdQkJMTAtMjgtMDIJCUluaXRpYWwKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1VSU5UIEZDU1RBQl8zMlsyNTZdID0KLXsKLQkweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLAotCTB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsCi0JMHgwZWRiODgzMiwgMHg3OWRjYjhhNCwgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwKLQkweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LCAweDkwYmYxZDkxLAotCTB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsCi0JMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywKLQkweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLAotCTB4MTQwMTVjNGYsIDB4NjMwNjZjZDksIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsCi0JMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCwgMHhhMjY3NzE3MiwKLQkweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLAotCTB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsCi0JMHgzMmQ4NmNlMywgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwKLQkweDI2ZDkzMGFjLCAweDUxZGUwMDNhLCAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LAotCTB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsCi0JMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKLQkweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLAotCTB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsCi0JMHg3MWIxODU4OSwgMHgwNmI2YjUxZiwgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywKLQkweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LAotCTB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsCi0JMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwKLQkweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LAotCTB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsCi0JMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywgMHhmYmQ0NGM2NSwKLQkweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLAotCTB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsCi0JMHg0MzY5ZTk2YSwgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwKLQkweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LAotCTB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsCi0JMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZiwKLQkweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LAotCTB4NTliMzNkMTcsIDB4MmViNDBkODEsIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsCi0JMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwKLQkweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLAotCTB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsCi0JMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwKLQkweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLAotCTB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsCi0JMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSwgMHg2N2RkNGFjYywKLQkweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LAotCTB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsCi0JMHhkMWJiNjdmMSwgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwKLQkweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLAotCTB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksCi0JMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNiwKLQkweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLAotCTB4YzViYTNiYmUsIDB4YjJiZDBiMjgsIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsCi0JMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSwgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwKLQkweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLAotCTB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsCi0JMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwKLQkweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLAotCTB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsCi0JMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSwgMHgxOGI3NDc3NywKLQkweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLAotCTB4OGY2NTllZmYsIDB4Zjg2MmFlNjksIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsCi0JMHhhMDBhZTI3OCwgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwKLQkweGE3NjcyNjYxLCAweGQwNjAxNmY3LCAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLAotCTB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsCi0JMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKLQkweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LAotCTB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsCi0JMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCwgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwKLQkweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkCi19OwotCi0vKgotVUNIQVIgICBXRVBLRVlbXSA9IHsKLQkJLy9JVgotCQkweDAwLCAweDExLCAweDIyLAotCQkvL1dFUCBLRVkKLQkJMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQwotCX07Ci0gKi8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUluaXQgV0VQIGZ1bmN0aW9uLgotCi0JQXJndW1lbnRzOgotICAgICAgcEFkCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKLQkJS2V5SWQJCSAgIFdFUCBLZXkgSUQKLQkJS2V5TGVuICAgICAgdGhlIGxlbmd0aCBvZiBXRVAgS0VZCi0JCXBEZXN0ICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHdoaWNoIEVuY3J5cHRpb24gZGF0YSB3aWxsIHN0b3JlIGluLgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBJbml0V2VwRW5naW5lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBLZXksCi0JSU4JVUNIQVIJCQlLZXlJZCwKLQlJTglVQ0hBUgkJCUtleUxlbiwKLQlJTiBPVVQJUFVDSEFSCQlwRGVzdCkKLXsKLQlVSU5UIGk7Ci0JVUNIQVIgICBXRVBLRVlbXSA9IHsKLQkJLy9JVgotCQkweDAwLCAweDExLCAweDIyLAotCQkvL1dFUCBLRVkKLQkJMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQwotCX07Ci0KLQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOyAgIC8vSW5pdCBjcmMzMi4KLQotICAgIHsKLQkJTmRpc01vdmVNZW1vcnkoV0VQS0VZICsgMywgcEtleSwgS2V5TGVuKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCAzOyBpKyspCi0JCQlXRVBLRVlbaV0gPSBSYW5kb21CeXRlKHBBZCk7ICAgLy9DYWxsIG1sbWUgUmFuZG9tQnl0ZSgpIGZ1bmN0aW9uLgotCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBLZXlMZW4gKyAzKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLQotCQlOZGlzTW92ZU1lbW9yeShwRGVzdCwgV0VQS0VZLCAzKTsgIC8vQXBwZW5kIEluaXQgVmVjdG9yCi0gICAgfQotCSoocERlc3QrMykgPSAoS2V5SWQgPDwgNik7ICAgICAgIC8vQXBwZW5kIEtFWUlECi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUVuY3J5cHQgdHJhbnNpbWl0dGVkIGRhdGEKLQotCUFyZ3VtZW50czoKLSAgICAgIHBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotICAgICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgdHJhbnNpbWl0dGVkIHNvdXJjZSBkYXRhIHRoYXQgd2lsbCBiZSBlbmNyeXB0Ci0gICAgICBwRGVzdCAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBlbnRyeXB0aW9uIGRhdGEgd2lsbCBiZSBzdG9yZSBpbi4KLSAgICAgIExlbgkJCUluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBkYXRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0gICAgICBOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBFbmNyeXB0RGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwU3JjLAotCUlOCVBVQ0hBUgkJCXBEZXN0LAotCUlOCVVJTlQJCQlMZW4pCi17Ci0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyLCBwU3JjLCBMZW4pOwotCUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBwRGVzdCwgcFNyYywgTGVuKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJRGVjcnlwdCByZWNlaXZlZCBXRVAgZGF0YQotCi0JQXJndW1lbnRzOgotCQlwQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwU3JjICAgICAgICBQb2ludGVyIHRvIHRoZSByZWNlaXZlZCBkYXRhCi0JCUxlbiAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIGRhdGEKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRSAgICAgICAgRGVjcnlwdCBXRVAgZGF0YSBzdWNjZXNzCi0JCUZBTFNFICAgICAgIERlY3J5cHQgV0VQIGRhdGEgZmFpbGVkCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglSVE1QU29mdERlY3J5cHRXRVAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUFVDSEFSCQkJcERhdGEsCi0JSU4gVUxPTkcJCQlEYXRhQnl0ZUNudCwKLQlJTiBQQ0lQSEVSX0tFWQkJcEdyb3VwS2V5KQotewotCVVJTlQJdHJhaWxmY3M7Ci0JVUlOVCAgICBjcmMzMjsKLQlVQ0hBUglLZXlJZHg7Ci0JVUNIQVIgICBXRVBLRVlbXSA9IHsKLQkJLy9JVgotCQkweDAwLCAweDExLCAweDIyLAotCQkvL1dFUCBLRVkKLQkJMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQwotCX07Ci0JVUNIQVIJKnBQYXlsb2FkID0gKFVDSEFSICopcERhdGEgKyBMRU5HVEhfODAyXzExOwotCVVMT05HCXBheWxvYWRfbGVuID0gRGF0YUJ5dGVDbnQgLSBMRU5HVEhfODAyXzExOwotCi0JTmRpc01vdmVNZW1vcnkoV0VQS0VZLCBwUGF5bG9hZCwgMyk7ICAgIC8vR2V0IFdFUCBJVgotCi0JS2V5SWR4ID0gKCoocFBheWxvYWQgKyAzKSAmIDB4YzApID4+IDY7Ci0JaWYgKHBHcm91cEtleVtLZXlJZHhdLktleUxlbiA9PSAwKQotCQlyZXR1cm4gKEZBTFNFKTsKLQotCU5kaXNNb3ZlTWVtb3J5KFdFUEtFWSArIDMsIHBHcm91cEtleVtLZXlJZHhdLktleSwgcEdyb3VwS2V5W0tleUlkeF0uS2V5TGVuKTsKLQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgV0VQS0VZLCBwR3JvdXBLZXlbS2V5SWR4XS5LZXlMZW4gKyAzKTsKLQlBUkNGT1VSX0RFQ1JZUFQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgcFBheWxvYWQsIHBQYXlsb2FkICsgNCwgcGF5bG9hZF9sZW4gLSA0KTsKLQlOZGlzTW92ZU1lbW9yeSgmdHJhaWxmY3MsIHBQYXlsb2FkICsgcGF5bG9hZF9sZW4gLSA4LCA0KTsKLQljcmMzMiA9IFJUTVBfQ0FMQ19GQ1MzMihQUFBJTklURkNTMzIsIHBQYXlsb2FkLCBwYXlsb2FkX2xlbiAtIDgpOyAgLy9Ta2lwIGxhc3QgNCBieXRlcyhGQ1MpLgotCWNyYzMyIF49IDB4ZmZmZmZmZmY7ICAgICAgICAgICAgIC8qIGNvbXBsZW1lbnQgKi8KLQotICAgIGlmKGNyYzMyICE9IGNwdTJsZTMyKHRyYWlsZmNzKSkKLSAgICB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEgV0VQIERhdGEgQ1JDIEVycm9yICFcbiIpKTsJIC8vQ1JDIGVycm9yLgotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JcmV0dXJuIChUUlVFKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCVRoZSBTdHJlYW0gQ2lwaGVyIEVuY3J5cHRpb24gQWxnb3JpdGhtICJBUkNGT1VSIiBpbml0aWFsaXplCi0KLQlBcmd1bWVudHM6Ci0JICAgQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBLZXkgICAgICAgIFBvaW50ZXIgdG8gdGhlIFdFUCBLRVkKLQkJS2V5TGVuICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBmbyB0aGUgV0VQIEtFWQotCi0JUmV0dXJuIFZhbHVlOgotCSAgIE5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJQVJDRk9VUl9JTklUKAotCUlOCVBBUkNGT1VSQ09OVEVYVAlDdHgsCi0JSU4JUFVDSEFSCQkJcEtleSwKLQlJTglVSU5UCQkJS2V5TGVuKQotewotCVVDSEFSCXQsIHU7Ci0JVUlOVAlrZXlpbmRleDsKLQlVSU5UCXN0YXRlaW5kZXg7Ci0JUFVDSEFSCXN0YXRlOwotCVVJTlQJY291bnRlcjsKLQotCXN0YXRlID0gQ3R4LT5TVEFURTsKLQlDdHgtPlggPSAwOwotCUN0eC0+WSA9IDA7Ci0JZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQotCQlzdGF0ZVtjb3VudGVyXSA9IChVQ0hBUiljb3VudGVyOwotCWtleWluZGV4ID0gMDsKLQlzdGF0ZWluZGV4ID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspCi0JewotCQl0ID0gc3RhdGVbY291bnRlcl07Ci0JCXN0YXRlaW5kZXggPSAoc3RhdGVpbmRleCArIHBLZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOwotCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07Ci0JCXN0YXRlW3N0YXRlaW5kZXhdID0gdDsKLQkJc3RhdGVbY291bnRlcl0gPSB1OwotCQlpZiAoKytrZXlpbmRleCA+PSBLZXlMZW4pCi0JCQlrZXlpbmRleCA9IDA7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJR2V0IGJ5dGVzIGZyb20gQVJDRk9VUiBDT05URVhUIChTLUJPWCkKLQotCUFyZ3VtZW50czoKLQkgICBDdHggICAgICAgICBQb2ludGVyIHRvIEFSQ0ZPVVIgQ09OVEVYVCAoU0JPWCkKLQotCVJldHVybiBWYWx1ZToKLQkgICBVQ0hBUiAgLSB0aGUgdmFsdWUgb2YgdGhlIEFSQ0ZPVVIgQ09OVEVYVCAoUy1CT1gpCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUNIQVIJQVJDRk9VUl9CWVRFKAotCUlOCVBBUkNGT1VSQ09OVEVYVAkJQ3R4KQotewotICBVSU5UIHg7Ci0gIFVJTlQgeTsKLSAgVUNIQVIgc3gsIHN5OwotICBQVUNIQVIgc3RhdGU7Ci0KLSAgc3RhdGUgPSBDdHgtPlNUQVRFOwotICB4ID0gKEN0eC0+WCArIDEpICYgMHhmZjsKLSAgc3ggPSBzdGF0ZVt4XTsKLSAgeSA9IChzeCArIEN0eC0+WSkgJiAweGZmOwotICBzeSA9IHN0YXRlW3ldOwotICBDdHgtPlggPSB4OwotICBDdHgtPlkgPSB5OwotICBzdGF0ZVt5XSA9IHN4OwotICBzdGF0ZVt4XSA9IHN5OwotCi0gIHJldHVybihzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXSk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCVRoZSBTdHJlYW0gQ2lwaGVyIERlY3J5cHRpb24gQWxnb3JpdGhtCi0KLQlBcmd1bWVudHM6Ci0JCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQotCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCi0JCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkYXRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFSQ0ZPVVJfREVDUllQVCgKLQlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAotCUlOCVBVQ0hBUgkJCXBEZXN0LAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCi0JCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0KLQotCUFyZ3VtZW50czoKLQkJQ3R4ICAgICAgICAgUG9pbnRlciB0byBBUkNGT1VSIENPTlRFWFQgKFNCT1gpCi0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQkJcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgU291cmNlIGRhdGEKLQkJTGVuICAgICAgICAgSW5kaWNhdGUgdGhlIGxlbmd0aCBvZiB0aGUgU291cmNlIGR0YQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUFSQ0ZPVVJfRU5DUllQVCgKLQlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAotCUlOCVBVQ0hBUgkJCXBEZXN0LAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyspCi0JCXBEZXN0W2ldID0gcFNyY1tpXSBeIEFSQ0ZPVVJfQllURShDdHgpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJVGhlIFN0cmVhbSBDaXBoZXIgRW5jcnlwdGlvbiBBbGdvcml0aG0gd2hpY2ggY29uZm9ybSB0byB0aGUgc3BlY2lhbCByZXF1aXJlbWVudCB0byBlbmNyeXB0ICBHVEsuCi0KLQlBcmd1bWVudHM6Ci0JCUN0eCAgICAgICAgIFBvaW50ZXIgdG8gQVJDRk9VUiBDT05URVhUIChTQk9YKQotCQlwRGVzdAkJCVBvaW50ZXIgdG8gdGhlIERlc3RpbmF0aW9uCi0JCXBTcmMgICAgICAgIFBvaW50ZXIgdG8gdGhlIFNvdXJjZSBkYXRhCi0JCUxlbiAgICAgICAgIEluZGljYXRlIHRoZSBsZW5ndGggb2YgdGhlIFNvdXJjZSBkdGEKLQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1WT0lECVdQQUFSQ0ZPVVJfRU5DUllQVCgKLQlJTglQQVJDRk9VUkNPTlRFWFQJQ3R4LAotCUlOCVBVQ0hBUgkJCXBEZXN0LAotCUlOCVBVQ0hBUgkJCXBTcmMsCi0JSU4JVUlOVAkJCUxlbikKLXsKLQlVSU5UIGk7Ci0gICAgICAgIC8vZGlzY2FyZCBmaXJzdCAyNTYgYnl0ZXMKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgICAgICBBUkNGT1VSX0JZVEUoQ3R4KTsKLQotCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKykKLQkJcERlc3RbaV0gPSBwU3JjW2ldIF4gQVJDRk9VUl9CWVRFKEN0eCk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCUNhbGN1bGF0ZSBhIG5ldyBGQ1MgZ2l2ZW4gdGhlIGN1cnJlbnQgRkNTIGFuZCB0aGUgbmV3IGRhdGEuCi0KLQlBcmd1bWVudHM6Ci0JCUZjcwkgICAgICB0aGUgb3JpZ2luYWwgRkNTIHZhbHVlCi0JCUNwICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBjYWxjdWxhdGUgdGhlIEZDUwotCQlMZW4gICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVVJTlQgLSBGQ1MgMzIgYml0cwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUlOVAlSVE1QX0NBTENfRkNTMzIoCi0JSU4JVUlOVAlGY3MsCi0JSU4JUFVDSEFSCUNwLAotCUlOCUlOVAkJTGVuKQotewotCXdoaWxlIChMZW4tLSkKLQkgICBGY3MgPSAoKChGY3MpID4+IDgpIF4gRkNTVEFCXzMyWygoRmNzKSBeICgqQ3ArKykpICYgMHhmZl0pOwotCi0JcmV0dXJuIChGY3MpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlHZXQgbGFzdCBGQ1MgYW5kIGVuY3J5cHQgaXQgdG8gdGhlIGRlc3RpbmF0aW9uCi0KLQlBcmd1bWVudHM6Ci0JCXBEZXN0CQkJUG9pbnRlciB0byB0aGUgRGVzdGluYXRpb24KLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFNldElDVigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJcERlc3QpCi17Ci0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiBePSAweGZmZmZmZmZmOyAgICAgICAgICAgICAvKiBjb21wbGVtZW50ICovCi0JcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiA9IGNwdTJsZTMyKHBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIpOwotCi0JQVJDRk9VUl9FTkNSWVBUKCZwQWQtPlByaXZhdGVJbmZvLldFUENPTlRFWFQsIHBEZXN0LCAoUFVDSEFSKSAmcEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgNCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jbW1fd3BhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjhhZDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY21tX3dwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE0OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXdwYS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKLQlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50Ci0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8gV1BBIE9VSQotVUNIQVIJCU9VSV9XUEFfTk9ORV9BS01bNF0JCT0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDB9OwotVUNIQVIgICAgICAgT1VJX1dQQV9WRVJTSU9OWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1dFUDQwWzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBX1RLSVBbNF0gICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OwotVUNIQVIgICAgICAgT1VJX1dQQV9DQ01QWzRdICAgICA9IHsweDAwLCAweDUwLCAweEYyLCAweDA0fTsKLVVDSEFSICAgICAgIE9VSV9XUEFfV0VQMTA0WzRdICAgICAgPSB7MHgwMCwgMHg1MCwgMHhGMiwgMHgwNX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBXzgwMjFYX0FLTVs0XQk9IHsweDAwLCAweDUwLCAweEYyLCAweDAxfTsKLVVDSEFSICAgICAgIE9VSV9XUEFfUFNLX0FLTVs0XSAgICAgID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDJ9OwotLy8gV1BBMiBPVUkKLVVDSEFSICAgICAgIE9VSV9XUEEyX1dFUDQwWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl9US0lQWzRdICAgICAgICA9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX0NDTVBbNF0gICAgICAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDR9OwotVUNIQVIgICAgICAgT1VJX1dQQTJfODAyMVhfQUtNWzRdICAgPSB7MHgwMCwgMHgwRiwgMHhBQywgMHgwMX07Ci1VQ0hBUiAgICAgICBPVUlfV1BBMl9QU0tfQUtNWzRdCQk9IHsweDAwLCAweDBGLCAweEFDLCAweDAyfTsKLVVDSEFSICAgICAgIE9VSV9XUEEyX1dFUDEwNFs0XSAgID0gezB4MDAsIDB4MEYsIDB4QUMsIDB4MDV9OwotCi0KLQotc3RhdGljIFZPSUQJQ29uc3RydWN0RWFwb2xLZXlEYXRhKAotCUlOCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOCVVDSEFSCQkJR3JvdXBLZXlXZXBTdGF0dXMsCi0JSU4JVUNIQVIJCQlrZXlEZXNjVmVyLAotCUlOCVVDSEFSCQkJTXNnVHlwZSwKLQlJTglVQ0hBUgkJCURlZmF1bHRLZXlJZHgsCi0JSU4JVUNIQVIJCQkqR1RLLAotCUlOCVVDSEFSCQkJKlJTTklFLAotCUlOCVVDSEFSCQkJUlNOSUVfTEVOLAotCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7Ci0KLXN0YXRpYyBWT0lECUNhbGN1bGF0ZU1JQygKLQlJTglVQ0hBUgkJCUtleURlc2NWZXIsCi0JSU4JVUNIQVIJCQkqUFRLLAotCU9VVCBQRUFQT0xfUEFDS0VUICAgcE1zZyk7Ci0KLXN0YXRpYyBWT0lEIFdwYUVBUFBhY2tldEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1zdGF0aWMgVk9JRCBXcGFFQVBPTEFTRkFsZXJ0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLXN0YXRpYyBWT0lEIFdwYUVBUE9MTG9nb2ZmQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLXN0YXRpYyBWT0lEIFdwYUVBUE9MU3RhcnRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLXN0YXRpYyBWT0lEIFdwYUVBUE9MS2V5QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAgKkVsZW0pOwotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIGFzc29jaWF0aW9uIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKLSAgICBQYXJhbWV0ZXJzOgotICAgICAgICBTIC0gcG9pbnRlciB0byB0aGUgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgV3BhU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgU1RBVEVfTUFDSElORSAqUywKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCi17Ci0gICAgU3RhdGVNYWNoaW5lSW5pdChTLCAoU1RBVEVfTUFDSElORV9GVU5DICopVHJhbnMsIE1BWF9XUEFfUFRLX1NUQVRFLCBNQVhfV1BBX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBXUEFfUFRLLCBXUEFfTUFDSElORV9CQVNFKTsKLQotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQUGFja2V0LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUFBhY2tldEFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFdQQV9QVEssIE1UMl9FQVBPTFN0YXJ0LCAoU1RBVEVfTUFDSElORV9GVU5DKVdwYUVBUE9MU3RhcnRBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQT0xMb2dvZmYsIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xMb2dvZmZBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQT0xLZXksIChTVEFURV9NQUNISU5FX0ZVTkMpV3BhRUFQT0xLZXlBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBXUEFfUFRLLCBNVDJfRUFQT0xBU0ZBbGVydCwgKFNUQVRFX01BQ0hJTkVfRlVOQylXcGFFQVBPTEFTRkFsZXJ0QWN0aW9uKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICB0aGlzIGlzIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCi0gICAgICAgIFdoZW4gcmVjZWl2aW5nIEVBUCBwYWNrZXRzIHdoaWNoIGlzICBmb3IgODAyLjF4IGF1dGhlbnRpY2F0aW9uIHVzZS4KLSAgICAgICAgTm90IHVzZSBpbiBQU0sgY2FzZQotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV3BhRUFQUGFja2V0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBXcGFFQVBPTEFTRkFsZXJ0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLX0KLQotVk9JRCBXcGFFQVBPTExvZ29mZkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICBTdGFydCA0LXdheSBIUyB3aGVuIHJjdiBFQVBPTF9TVEFSVCB3aGljaCBtYXkgY3JlYXRlIGJ5IG91ciBkcml2ZXIgaW4gYXNzb2MuYwotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV3BhRUFQT0xTdGFydEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotICAgIE1BQ19UQUJMRV9FTlRSWSAgICAgKnBFbnRyeTsKLSAgICBQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFFQVBPTFN0YXJ0QWN0aW9uID09PT4gXG4iKSk7Ci0KLSAgICBwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKUVsZW0tPk1zZzsKLQotICAgIC8vRm9yIG5vcm1hb2wgUFNLLCB3ZSBlbnF1ZXVlIGFuIEVBUE9MLVN0YXJ0IGNvbW1hbmQgdG8gdHJpZ2dlciB0aGUgcHJvY2Vzcy4KLSAgICBpZiAoRWxlbS0+TXNnTGVuID09IDYpCi0gICAgICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgRWxlbS0+TXNnKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKLSAgICB9Ci0KLSAgICBpZiAocEVudHJ5KQotICAgIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFBvcnRTZWN1cmVkKCVkKSwgV3BhU3RhdGUoJWQpLCBBdXRoTW9kZSglZCksIFBNS0lEX0NhY2hlSWR4KCVkKSBcbiIsIHBFbnRyeS0+UG9ydFNlY3VyZWQsIHBFbnRyeS0+V3BhU3RhdGUsIHBFbnRyeS0+QXV0aE1vZGUsIHBFbnRyeS0+UE1LSURfQ2FjaGVJZHgpKTsKLQotICAgICAgICBpZiAoKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKQotCQkJJiYgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19QVEtTVEFSVCkKLSAgICAgICAgICAgICYmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8ICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSAmJiAocEVudHJ5LT5QTUtJRF9DYWNoZUlkeCAhPSBFTlRSWV9OT1RfRk9VTkQpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7Ci0gICAgICAgICAgICBwRW50cnktPldwYVN0YXRlID0gQVNfSU5JVFBTSzsKLSAgICAgICAgICAgIHBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwRW50cnktPlJfQ291bnRlciwgc2l6ZW9mKHBFbnRyeS0+Ul9Db3VudGVyKSk7Ci0gICAgICAgICAgICBwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHMV9SRVRSWV9USU1FUl9DVFI7Ci0KLSAgICAgICAgICAgIFdQQVN0YXJ0NFdheUhTKHBBZCwgcEVudHJ5LCBQRUVSX01TRzFfUkVUUllfRVhFQ19JTlRWKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBUaGlzIGlzIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24uCi0gICAgICAgIFdoZW4gcmVjZWl2aW5nIEVBUE9MIHBhY2tldHMgd2hpY2ggaXMgIGZvciA4MDIuMXgga2V5IG1hbmFnZW1lbnQuCi0gICAgICAgIFVzZSBib3RoIGluIFdQQSwgYW5kIFdQQVBTSyBjYXNlLgotICAgICAgICBJbiB0aGlzIGZ1bmN0aW9uLCBmdXJ0aGVyIGRpc3BhdGNoIHRvIGRpZmZlcmVudCBmdW5jdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSByZWNlaXZlZCBwYWNrZXQuICAzIGNhdGVnb3JpZXMgYXJlIDoKLSAgICAgICAgICAxLiAgbm9ybWFsIDQtd2F5IHBhaXJ3aXNla2V5IGFuZCAyLXdheSBncm91cGtleSBoYW5kc2hha2UKLSAgICAgICAgICAyLiAgTUlDIGVycm9yIChDb3VudGVybWVhc3VyZXMgYXR0YWNrKSAgcmVwb3J0IHBhY2tldCBmcm9tIFNUQS4KLSAgICAgICAgICAzLiAgUmVxdWVzdCBmb3IgcGFpcndpc2UvZ3JvdXAga2V5IHVwZGF0ZSBmcm9tIFNUQQotICAgIFJldHVybjoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV3BhRUFQT0xLZXlBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSkKLXsKLSAgICBNQUNfVEFCTEVfRU5UUlkgICAgICpwRW50cnk7Ci0gICAgUEhFQURFUl84MDJfMTEgICAgICBwSGVhZGVyOwotICAgIFBFQVBPTF9QQUNLRVQgICAgICAgcEVhcG9sX3BhY2tldDsKLQlLRVlfSU5GTwkJCXBlZXJLZXlJbmZvOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhRUFQT0xLZXlBY3Rpb24gPT09PlxuIikpOwotCi0gICAgcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSlFbGVtLT5Nc2c7Ci0gICAgcEVhcG9sX3BhY2tldCA9IChQRUFQT0xfUEFDS0VUKSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQotCU5kaXNaZXJvTWVtb3J5KChQVUNIQVIpJnBlZXJLZXlJbmZvLCBzaXplb2YocGVlcktleUluZm8pKTsKLQlOZGlzTW92ZU1lbW9yeSgoUFVDSEFSKSZwZWVyS2V5SW5mbywgKFBVQ0hBUikmcEVhcG9sX3BhY2tldC0+S2V5RGVzYy5LZXlJbmZvLCBzaXplb2YoS0VZX0lORk8pKTsKLQotCWhleF9kdW1wKCJSZWNlaXZlZCBFYXBvbCBmcmFtZSIsICh1bnNpZ25lZCBjaGFyICopcEVhcG9sX3BhY2tldCwgKEVsZW0tPk1zZ0xlbiAtIExFTkdUSF84MDJfMTEgLSBMRU5HVEhfODAyXzFfSCkpOwotCi0JKigoVVNIT1JUICopJnBlZXJLZXlJbmZvKSA9IGNwdTJsZTE2KCooKFVTSE9SVCAqKSZwZWVyS2V5SW5mbykpOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIHBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEhlYWRlci0+QWRkcjIpOwotCi0JCWlmICghcEVudHJ5IHx8ICgoIXBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKCFwRW50cnktPlZhbGlkQXNBcENsaSkpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLQkJaWYgKHBFbnRyeS0+QXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJYnJlYWs7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBvTC1LZXkgZnJhbWUgZnJvbSBTVEEgJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIsIFBSSU5UX01BQyhwRW50cnktPkFkZHIpKSk7Ci0KLSAgICAgICAgaWYgKCgocEVhcG9sX3BhY2tldC0+UHJvVmVyICE9IEVBUE9MX1ZFUikgJiYgKHBFYXBvbF9wYWNrZXQtPlByb1ZlciAhPSBFQVBPTF9WRVIyKSkgfHwKLQkJCSgocEVhcG9sX3BhY2tldC0+S2V5RGVzYy5UeXBlICE9IFdQQTFfS0VZX0RFU0MpICYmIChwRWFwb2xfcGFja2V0LT5LZXlEZXNjLlR5cGUgIT0gV1BBMl9LRVlfREVTQykpKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXkgZGVzY3JpcHRlciBkb2VzIG5vdCBtYXRjaCB3aXRoIFdQQSBydWxlXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0JCS8vIFRoZSB2YWx1ZSAxIHNoYWxsIGJlIHVzZWQgZm9yIGFsbCBFQVBPTC1LZXkgZnJhbWVzIHRvIGFuZCBmcm9tIGEgU1RBIHdoZW4KLQkJLy8gbmVpdGhlciB0aGUgZ3JvdXAgbm9yIHBhaXJ3aXNlIGNpcGhlcnMgYXJlIENDTVAgZm9yIEtleSBEZXNjcmlwdG9yIDEuCi0JCWlmICgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gREVTQ19UWVBFX1RLSVApKQotICAgICAgICB7Ci0JICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXkgZGVzY3JpcHRlciB2ZXJzaW9uIG5vdCBtYXRjaChUS0lQKSBcbiIpKTsKLQkgICAgYnJlYWs7Ci0JfQotCQkvLyBUaGUgdmFsdWUgMiBzaGFsbCBiZSB1c2VkIGZvciBhbGwgRUFQT0wtS2V5IGZyYW1lcyB0byBhbmQgZnJvbSBhIFNUQSB3aGVuCi0JCS8vIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMtQ0NNUCBmb3IgS2V5IERlc2NyaXB0b3IgMi4KLQllbHNlIGlmICgocEVudHJ5LT5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgJiYgKHBlZXJLZXlJbmZvLktleURlc2NWZXIgIT0gREVTQ19UWVBFX0FFUykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLZXkgZGVzY3JpcHRlciB2ZXJzaW9uIG5vdCBtYXRjaChBRVMpIFxuIikpOwotCQlicmVhazsKLQl9Ci0KLQkJLy8gQ2hlY2sgaWYgdGhpcyBTVEEgaXMgaW4gY2xhc3MgMyBzdGF0ZSBhbmQgdGhlIFdQQSBzdGF0ZSBpcyBzdGFydGVkCi0gICAgICAgIGlmICgocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSAmJiAocEVudHJ5LT5XcGFTdGF0ZSA+PSBBU19JTklUUFNLKSkKLSAgICAgICAgewotCQkJLy8gQ2hlY2sgdGhlIEtleSBBY2sgKGJpdCA3KSBvZiB0aGUgS2V5IEluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgQXV0aGVudGljYXRvcgotCQkJLy8gb3Igbm90LgotCQkJLy8gQW4gRUFQT0wtS2V5IGZyYW1lIHRoYXQgaXMgc2VudCBieSB0aGUgU3VwcGxpY2FudCBpbiByZXNwb25zZSB0byBhbiBFQVBPTC0KLQkJCS8vIEtleSBmcmFtZSBmcm9tIHRoZSBBdXRoZW50aWNhdG9yIG11c3Qgbm90IGhhdmUgdGhlIEFjayBiaXQgc2V0LgotCQkJaWYgKHBlZXJLZXlJbmZvLktleUFjayA9PSAxKQotCQkJewotCQkJCS8vIFRoZSBmcmFtZSBpcyBzbmV0IGJ5IEF1dGhlbnRpY2F0b3IuCi0JCQkJLy8gU28gdGhlIFN1cHBsaWNhbnQgc2lkZSBzaGFsbCBoYW5kbGUgdGhpcy4KLQotCQkJCWlmICgocGVlcktleUluZm8uU2VjdXJlID09IDApICYmIChwZWVyS2V5SW5mby5SZXF1ZXN0ID09IDApICYmCi0JCQkJCShwZWVyS2V5SW5mby5FcnJvciA9PSAwKSAmJiAocGVlcktleUluZm8uS2V5VHlwZSA9PSBQQUlSV0lTRUtFWSkpCi0JCQkJewotCQkJCQkvLyBQcm9jZXNzIDEuIHRoZSBtZXNzYWdlIDEgb2YgNC13YXkgSFMgaW4gV1BBIG9yIFdQQTIKLQkJCQkJLy8JCQkgIEVBUE9MLUtleSgwLDAsMSwwLFAsMCwwLEFOb25jZSwwLERhdGFLRF9NMSkKLQkJCQkJLy8JCSAgIDIuIHRoZSBtZXNzYWdlIDMgb2YgNC13YXkgSFMgaW4gV1BBCi0JCQkJCS8vCQkJICBFQVBPTC1LZXkoMCwxLDEsMSxQLDAsS2V5UlNDLEFOb25jZSxNSUMsRGF0YUtEX00zKQotCQkJCQlpZiAocGVlcktleUluZm8uS2V5TWljID09IDApCi0JCQlQZWVyUGFpck1zZzFBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCSAgICAgICAgICAgICAgICBlbHNlCi0JICAgICAgICAgICAgICAgIFBlZXJQYWlyTXNnM0FjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChwZWVyS2V5SW5mby5TZWN1cmUgPT0gMSkgJiYKLQkJCQkJCSAocGVlcktleUluZm8uS2V5TWljID09IDEpICYmCi0JCQkJCQkgKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkgJiYKLQkJCQkJCSAocGVlcktleUluZm8uRXJyb3IgPT0gMCkpCi0JCQkJewotCQkJCQkvLyBQcm9jZXNzIDEuIHRoZSBtZXNzYWdlIDMgb2YgNC13YXkgSFMgaW4gV1BBMgotCQkJCQkvLwkJCSAgRUFQT0wtS2V5KDEsMSwxLDEsUCwwLEtleVJTQyxBTm9uY2UsTUlDLERhdGFLRF9NMykKLQkJCQkJLy8JCSAgIDIuIHRoZSBtZXNzYWdlIDEgb2YgZ3JvdXAgS1MgaW4gV1BBIG9yIFdQQTIKLQkJCQkJLy8JCQkgIEVBUE9MLUtleSgxLDEsMSwwLEcsMCxLZXkgUlNDLDAsIE1JQyxHVEtbTl0pCi0JCQkJCWlmIChwZWVyS2V5SW5mby5LZXlUeXBlID09IFBBSVJXSVNFS0VZKQotCQkJCQkJUGVlclBhaXJNc2czQWN0aW9uKHBBZCwgcEVudHJ5LCBFbGVtKTsKLQkJCQkJZWxzZQotCQkJCQkJUGVlckdyb3VwTXNnMUFjdGlvbihwQWQsIHBFbnRyeSwgRWxlbSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIFRoZSBmcmFtZSBpcyBzbmV0IGJ5IFN1cHBsaWNhbnQuCi0JCQkJLy8gU28gdGhlIEF1dGhlbnRpY2F0b3Igc2lkZSBzaGFsbCBoYW5kbGUgdGhpcy4KLQkJCQlpZiAoKHBlZXJLZXlJbmZvLlJlcXVlc3QgPT0gMCkgJiYKLQkJCQkJCSAocGVlcktleUluZm8uRXJyb3IgPT0gMCkgJiYKLQkJCQkJCSAocGVlcktleUluZm8uS2V5TWljID09IDEpKQotCQkJCXsKLQkJCQkJaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAwICYmIHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpCi0JCQkJCXsKLQkJCQkJCS8vIEVBUE9MLUtleSgwLDEsMCwwLFAsMCwwLFNOb25jZSxNSUMsRGF0YSkKLQkJCQkJCS8vIFByb2Nlc3MgMS4gbWVzc2FnZSAyIG9mIDQtd2F5IEhTIGluIFdQQSBvciBXUEEyCi0JCQkJCQkvLwkJICAgMi4gbWVzc2FnZSA0IG9mIDQtd2F5IEhTIGluIFdQQQotCQkJCQkJaWYgKENPTlZfQVJSQVJZX1RPX1VJTlQxNihwRWFwb2xfcGFja2V0LT5LZXlEZXNjLktleURhdGFMZW4pID09IDApCi0JCQkJCQl7Ci0JCQkJCQkJUGVlclBhaXJNc2c0QWN0aW9uKHBBZCwgcEVudHJ5LCBFbGVtKTsKLQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlQZWVyUGFpck1zZzJBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxICYmIHBlZXJLZXlJbmZvLktleVR5cGUgPT0gUEFJUldJU0VLRVkpCi0JCQkJCXsKLQkJCQkJCS8vIEVBUE9MLUtleSgxLDEsMCwwLFAsMCwwLDAsTUlDLDApCi0JCQkJCQkvLyBQcm9jZXNzIG1lc3NhZ2UgNCBvZiA0LXdheSBIUyBpbiBXUEEyCi0JCQkJCQlQZWVyUGFpck1zZzRBY3Rpb24ocEFkLCBwRW50cnksIEVsZW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHBlZXJLZXlJbmZvLlNlY3VyZSA9PSAxICYmIHBlZXJLZXlJbmZvLktleVR5cGUgPT0gR1JPVVBLRVkpCi0JCQkJCXsKLQkJCQkJCS8vIEVBUE9MLUtleSgxLDEsMCwwLEcsMCwwLDAsTUlDLDApCi0JCQkJCQkvLyBQcm9jZXNzIG1lc3NhZ2UgMiBvZiBHcm91cCBrZXkgSFMgaW4gV1BBIG9yIFdQQTIKLQkJCQkJCVBlZXJHcm91cE1zZzJBY3Rpb24ocEFkLCBwRW50cnksICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMV0sIChFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KLSAgICB9d2hpbGUoRkFMU0UpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZQlEZXNjcmlwdGlvbjoKLQkJQ29weSBmcmFtZSBmcm9tIHdhaXRpbmcgcXVldWUgaW50byByZWxhdGl2ZSByaW5nIGJ1ZmZlciBhbmQgc2V0Ci0JYXBwcm9wcmlhdGUgQVNJQyByZWdpc3RlciB0byBraWNrIGhhcmR3YXJlIGVuY3J5cHRpb24gYmVmb3JlIHJlYWxseQotCXNlbnQgb3V0IHRvIGFpci4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKLQkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCAgICBSVE1QVG9XaXJlbGVzc1N0YSgKLSAgICBJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotICAgIElOICBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTiAgUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UCQkJSGRyTGVuLAotICAgIElOICBQVUNIQVIJCQlwRGF0YSwKLSAgICBJTiAgVUlOVAkJCURhdGFMZW4sCi0gICAgSU4JQk9PTEVBTgkJCQliQ2xlYXJGcmFtZSkKLXsKLSAgICBQTkRJU19QQUNLRVQgICAgcFBhY2tldDsKLSAgICBORElTX1NUQVRVUyAgICAgU3RhdHVzOwotCi0JaWYgKCghcEVudHJ5KSB8fCAoKCFwRW50cnktPlZhbGlkQXNDTEkpICYmICghcEVudHJ5LT5WYWxpZEFzQXBDbGkpKSkKLQkJcmV0dXJuOwotCi0gICAgZG8gewotCQkvLyBidWlsZCBhIE5ESVMgcGFja2V0Ci0JCVN0YXR1cyA9IFJUTVBBbGxvY2F0ZU5kaXNQYWNrZXQocEFkLCAmcFBhY2tldCwgcEhlYWRlcjgwMl8zLCBIZHJMZW4sIHBEYXRhLCBEYXRhTGVuKTsKLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlicmVhazsKLQotCi0JCQlpZiAoYkNsZWFyRnJhbWUpCi0JCQkJUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShwUGFja2V0LCAxKTsKLQkJCWVsc2UKLQkJCQlSVE1QX1NFVF9QQUNLRVRfQ0xFQVJfRUFQX0ZSQU1FKHBQYWNrZXQsIDApOwotCQl7Ci0JCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKHBQYWNrZXQsIFBLVFNSQ19ORElTKTsKLQotCQkJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHBQYWNrZXQsIE1BSU5fTUJTU0lEKTsJLy8gc2V0IGEgZGVmYXVsdCB2YWx1ZQotCQkJaWYocEVudHJ5LT5hcGlkeCAhPSAwKQotCQkJUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKHBQYWNrZXQsIHBFbnRyeS0+YXBpZHgpOwotCi0JCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIChVQ0hBUilwRW50cnktPkFpZCk7Ci0JCQlSVE1QX1NFVF9QQUNLRVRfTU9SRURBVEEocFBhY2tldCwgRkFMU0UpOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkgICAgLy8gc2VuZCBvdXQgdGhlIHBhY2tldAotCSAgICAgICAgU3RhdHVzID0gU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOwotCSAgICBpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJVUNIQVIgICBJbmRleDsKLQotCQkJCS8vIERlcXVldWUgb25lIGZyYW1lIGZyb20gVHhTd1F1ZXVlMC4uMyBxdWV1ZSBhbmQgcHJvY2VzcyBpdAotCQkJCS8vIFRoZXJlIGFyZSB0aHJlZSBwbGFjZSBjYWxsaW5nIGRlcXVldWUgZm9yIFRYIHJpbmcuCi0JCQkJLy8gMS4gSGVyZSwgcmlnaHQgYWZ0ZXIgcXVldWVpbmcgdGhlIGZyYW1lLgotCQkJCS8vIDIuIEF0IHRoZSBlbmQgb2YgVHhSaW5nVHhEb25lIHNlcnZpY2Ugcm91dGluZS4KLQkJCQkvLyAzLiBVcG9uIE5ESVMgY2FsbCBSVE1QU2VuZFBhY2tldHMKLQkJCQlpZigoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpICYmCi0JCQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTKSkpCi0JCQkJewotCQkJCQlmb3IoSW5kZXggPSAwOyBJbmRleCA8IDU7IEluZGV4ICsrKQotCQkJCQkJaWYocEFkLT5UeFN3UXVldWVbSW5kZXhdLk51bWJlciA+IDApCi0JCQkJCQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgSW5kZXgsIE1BWF9UWF9QUk9DRVNTKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotICAgIH0gd2hpbGUgKEZBTFNFKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gaW5pdGlsaXplIDQtd2F5IGhhbmRzaGFrZQotCi0gICAgUmV0dXJuOgotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFdQQVN0YXJ0NFdheUhTKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBVTE9ORwkJCVRpbWVJbnRlcnZhbCkKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotICAgIEVBUE9MX1BBQ0tFVAlFQVBPTFBLVDsKLQlQVUlOVDgJCQlwQnNzaWQgPSBOVUxMOwotCVVDSEFSCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBXUEFTdGFydDRXYXlIU1xuIikpOwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJbRVJST1JdV1BBU3RhcnQ0V2F5SFMgOiBUaGUgaW50ZXJmYWNlIGlzIGNsb3NlZC4uLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0KLQlpZiAocEJzc2lkID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJbRVJST1JdV1BBU3RhcnQ0V2F5SFMgOiBObyBjb3JyZXNwb25kaW5nIEF1dGhlbnRpY2F0b3IuXG4iKSk7Ci0JCXJldHVybjsKLSAgICB9Ci0KLQkvLyBDaGVjayB0aGUgc3RhdHVzCi0gICAgaWYgKChwRW50cnktPldwYVN0YXRlID4gQVNfUFRLU1RBUlQpIHx8IChwRW50cnktPldwYVN0YXRlIDwgQVNfSU5JVFBNSykpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJbRVJST1JdV1BBU3RhcnQ0V2F5SFMgOiBOb3QgZXhwZWN0IGNhbGxpbmdcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotCi0JLy8gSW5jcmVtZW50IHJlcGxheSBjb3VudGVyIGJ5IDEKLQlBRERfT05FX1RvXzY0QklUX1ZBUihwRW50cnktPlJfQ291bnRlcik7Ci0KLQkvLyBSYW5kb21seSBnZW5lcmF0ZSBBTm9uY2UKLQlHZW5SYW5kb20ocEFkLCAoVUNIQVIgKilwQnNzaWQsIHBFbnRyeS0+QU5vbmNlKTsKLQotCS8vIENvbnN0cnVjdCBFQVBvTCBtZXNzYWdlIC0gUGFpcndpc2UgTXNnIDEKLQkvLyBFQVBPTC1LZXkoMCwwLDEsMCxQLDAsMCxBTm9uY2UsMCxEYXRhS0RfTTEpCi0JTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LAotCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJICBFQVBPTF9QQUlSX01TR18xLAotCQkJCQkgIDAsCQkJCQkvLyBEZWZhdWx0IGtleSBpbmRleAotCQkJCQkgIHBFbnRyeS0+QU5vbmNlLAotCQkJCQkgIE5VTEwsCQkJCQkvLyBUeFJTQwotCQkJCQkgIE5VTEwsCQkJCQkvLyBHVEsKLQkJCQkJICBOVUxMLAkJCQkJLy8gUlNOSUUKLQkJCQkJICAwLAkJCQkJLy8gUlNOSUUgbGVuZ3RoCi0JCQkJCSAgJkVBUE9MUEtUKTsKLQotCi0JLy8gTWFrZSBvdXRnb2luZyBmcmFtZQotICAgIE1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOwotICAgIFJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LCBIZWFkZXI4MDJfMywKLQkJCQkJICBMRU5HVEhfODAyXzMsIChQVUNIQVIpJkVBUE9MUEtULAotCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LAotCQkJCQkgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/IEZBTFNFIDogVFJVRSk7Ci0KLQkvLyBUcmlnZ2VyIFJldHJ5IFRpbWVyCi0gICAgUlRNUE1vZFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsIFRpbWVJbnRlcnZhbCk7Ci0KLQkvLyBVcGRhdGUgU3RhdGUKLSAgICBwRW50cnktPldwYVN0YXRlID0gQVNfUFRLU1RBUlQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFdQQVN0YXJ0NFdheUhTOiBzZW5kIE1zZzEgb2YgNC13YXkgXG4iKSk7Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgUGFpcndpc2Uga2V5IE1zZy0xIG9mIDQtd2F5IGhhbmRzaGFraW5nIGFuZCBzZW5kIE1zZy0yCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCVBvaW50ZXIJdG8gb3VyIGFkYXB0ZXIKLQkJRWxlbQkJTWVzc2FnZSBib2R5Ci0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFBlZXJQYWlyTXNnMUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSkKLXsKLQlVQ0hBUgkJCQlQVEtbODBdOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVBFQVBPTF9QQUNLRVQJCXBNc2cxOwotCVVJTlQJCQlNc2dMZW47Ci0JRUFQT0xfUEFDS0VUCQlFQVBPTFBLVDsKLQlQVUlOVDgJCQkJcEN1cnJlbnRBZGRyID0gTlVMTDsKLQlQVUlOVDgJCQkJcG1rX3B0ciA9IE5VTEw7Ci0JVUNIQVIJCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCVBVSU5UOAkJCQlyc25pZV9wdHIgPSBOVUxMOwotCVVDSEFSCQkJCXJzbmllX2xlbiA9IDA7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnMUFjdGlvbiBcbiIpKTsKLQotCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCi0JCXJldHVybjsKLQotICAgIGlmIChFbGVtLT5Nc2dMZW4gPCAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQotICAgICAgICByZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKLQkJcG1rX3B0ciA9IHBBZC0+U3RhQ2ZnLlBNSzsKLQkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0JCXJzbmllX3B0ciA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKLQkJcnNuaWVfbGVuID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIFN0b3JlIHRoZSByZWNlaXZlZCBmcmFtZQotCXBNc2cxID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkvLyBTYW5pdHkgQ2hlY2sgcGVlciBQYWlyd2lzZSBtZXNzYWdlIDEgLSBSZXBsYXkgQ291bnRlcgotCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBNc2cxLCBNc2dMZW4sIEVBUE9MX1BBSVJfTVNHXzEsIHBFbnRyeSkgPT0gRkFMU0UpCi0JCXJldHVybjsKLQotCS8vIFN0b3JlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSB0byB2ZXJpZnkgbWVzc2FnZSAzIGFuZCBjb25zdHJ1Y3QgbWVzc2FnZSAyCi0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHBNc2cxLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gU3RvcmUgQU5vbmNlCi0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5BTm9uY2UsIHBNc2cxLT5LZXlEZXNjLktleU5vbmNlLCBMRU5fS0VZX0RFU0NfTk9OQ0UpOwotCi0JLy8gR2VuZXJhdGUgcmFuZG9tIFNOb25jZQotCUdlblJhbmRvbShwQWQsIChVQ0hBUiAqKXBDdXJyZW50QWRkciwgcEVudHJ5LT5TTm9uY2UpOwotCi0JewotCSAgICAvLyBDYWxjdWxhdGUgUFRLKEFOb25jZSwgU05vbmNlKQotCSAgICBXcGFEZXJpdmVQVEsocEFkLAotCQkJCXBta19wdHIsCi0JCQkJcEVudHJ5LT5BTm9uY2UsCi0JCQkJCXBFbnRyeS0+QWRkciwKLQkJCQkJcEVudHJ5LT5TTm9uY2UsCi0JCQkJCXBDdXJyZW50QWRkciwKLQkJCQkgICAgUFRLLAotCQkJCSAgICBMRU5fUFRLKTsKLQotCQkvLyBTYXZlIGtleSB0byBQVEsgZW50cnkKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QVEssIFBUSywgTEVOX1BUSyk7Ci0JfQotCi0JLy8gVXBkYXRlIFdwYVN0YXRlCi0JcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7Ci0KLQkvLyBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIFBhaXJ3aXNlIE1zZyAyCi0JLy8gIEVBUE9MLUtleSgwLDEsMCwwLFAsMCwwLFNOb25jZSxNSUMsRGF0YUtEX00yKQotCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkpOwotCUNvbnN0cnVjdEVhcG9sTXNnKHBFbnRyeSwKLQkJCQkJICBncm91cF9jaXBoZXIsCi0JCQkJCSAgRUFQT0xfUEFJUl9NU0dfMiwKLQkJCQkJICAwLAkJCQkvLyBEZWZhdWx0S2V5SWR4Ci0JCQkJCSAgcEVudHJ5LT5TTm9uY2UsCi0JCQkJCSAgTlVMTCwJCQkJLy8gVHhSc2MKLQkJCQkJICBOVUxMLAkJCQkvLyBHVEsKLQkJCQkJICAoVUNIQVIgKilyc25pZV9wdHIsCi0JCQkJCSAgcnNuaWVfbGVuLAotCQkJCQkgICZFQVBPTFBLVCk7Ci0KLQkvLyBNYWtlIG91dGdvaW5nIGZyYW1lCi0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7Ci0KLQlSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwKLQkJCQkJICBIZWFkZXI4MDJfMywgc2l6ZW9mKEhlYWRlcjgwMl8zKSwgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIFRSVUUpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBQZWVyUGFpck1zZzFBY3Rpb246IHNlbmQgTXNnMiBvZiA0LXdheSBcbiIpKTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFdoZW4gcmVjZWl2aW5nIHRoZSBzZWNvbmQgcGFja2V0IG9mIDQtd2F5IHBhaXJ3aXNla2V5IGhhbmRzaGFrZS4KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFBlZXJQYWlyTXNnMkFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSkKLXsKLQlVQ0hBUgkJCQlQVEtbODBdOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgQ2FuY2VsbGVkOwotICAgIFBIRUFERVJfODAyXzExICAgICAgcEhlYWRlcjsKLQlFQVBPTF9QQUNLRVQgICAgICAgIEVBUE9MUEtUOwotCVBFQVBPTF9QQUNLRVQgICAgICAgcE1zZzI7Ci0JVUlOVAkJCU1zZ0xlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zW0xFTkdUSF84MDJfM107Ci0JVUNIQVIJCQkJVHhUc2NbNl07Ci0JUFVJTlQ4CQkJCXBCc3NpZCA9IE5VTEw7Ci0JUFVJTlQ4CQkJCXBta19wdHIgPSBOVUxMOwotCVBVSU5UOAkJCQlndGtfcHRyID0gTlVMTDsKLQlVQ0hBUgkJCQlkZWZhdWx0X2tleSA9IDA7Ci0JVUNIQVIJCQkJZ3JvdXBfY2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCVBVSU5UOAkJCQlyc25pZV9wdHIgPSBOVUxMOwotCVVDSEFSCQkJCXJzbmllX2xlbiA9IDA7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnMkFjdGlvbiBcbiIpKTsKLQotICAgIGlmICgoIXBFbnRyeSkgfHwgKCFwRW50cnktPlZhbGlkQXNDTEkpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoRWxlbS0+TXNnTGVuIDwgKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsgc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgLSAyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gY2hlY2sgRW50cnkgaW4gdmFsaWQgU3RhdGUKLSAgICBpZiAocEVudHJ5LT5XcGFTdGF0ZSA8IEFTX1BUS1NUQVJUKQotICAgICAgICByZXR1cm47Ci0KLQotCi0gICAgLy8gcG9pbnRlciB0byA4MDIuMTEgaGVhZGVyCi0JcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSlFbGVtLT5Nc2c7Ci0KLQkvLyBza2lwIDgwMi4xMV9oZWFkZXIoMjQtYnl0ZSkgYW5kIExMQ19oZWFkZXIoOCkKLQlwTXNnMiA9IChQRUFQT0xfUEFDS0VUKSZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkvLyBTdG9yZSBTTm9uY2UKLQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlNOb25jZSwgcE1zZzItPktleURlc2MuS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQl7Ci0JCS8vIERlcml2ZSBQVEsKLQkJV3BhRGVyaXZlUFRLKHBBZCwKLQkJCQkJKFVDSEFSICopcG1rX3B0ciwKLQkJCQkJcEVudHJ5LT5BTm9uY2UsCQkJLy8gQU5PTkNFCi0JCQkJCShVQ0hBUiAqKXBCc3NpZCwKLQkJCQkJcEVudHJ5LT5TTm9uY2UsCQkJLy8gU05PTkNFCi0JCQkJCXBFbnRyeS0+QWRkciwKLQkJCQkJUFRLLAotCQkJCQlMRU5fUFRLKTsKLQotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UFRLLCBQVEssIExFTl9QVEspOwotCX0KLQotCS8vIFNhbml0eSBDaGVjayBwZWVyIFBhaXJ3aXNlIG1lc3NhZ2UgMiAtIFJlcGxheSBDb3VudGVyLCBNSUMsIFJTTklFCi0JaWYgKFBlZXJXcGFNZXNzYWdlU2FuaXR5KHBBZCwgcE1zZzIsIE1zZ0xlbiwgRUFQT0xfUEFJUl9NU0dfMiwgcEVudHJ5KSA9PSBGQUxTRSkKLQkJcmV0dXJuOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8vIGRlbGV0ZSByZXRyeSB0aW1lcgotCQlSVE1QQ2FuY2VsVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgJkNhbmNlbGxlZCk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlCi0gICAgICAgIHBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtJTklUX05FR09USUFUSU5HOwotCi0JCS8vIEluY3JlbWVudCByZXBsYXkgY291bnRlciBieSAxCi0JCUFERF9PTkVfVG9fNjRCSVRfVkFSKHBFbnRyeS0+Ul9Db3VudGVyKTsKLQotCQkvLyBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIFBhaXJ3aXNlIE1zZyAzCi0JCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkpOwotCQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJCSAgRUFQT0xfUEFJUl9NU0dfMywKLQkJCQkJCSAgZGVmYXVsdF9rZXksCi0JCQkJCQkgIHBFbnRyeS0+QU5vbmNlLAotCQkJCQkJICBUeFRzYywKLQkJCQkJCSAgKFVDSEFSICopZ3RrX3B0ciwKLQkJCQkJCSAgKFVDSEFSICopcnNuaWVfcHRyLAotCQkJCQkJICByc25pZV9sZW4sCi0JCQkJCQkgICZFQVBPTFBLVCk7Ci0KLSAgICAgICAgLy8gTWFrZSBvdXRnb2luZyBmcmFtZQotICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEVudHJ5LT5BZGRyLCBwQnNzaWQsIEVBUE9MKTsKLSAgICAgICAgUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksIEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMsCi0JCQkJCQkgIChQVUNIQVIpJkVBUE9MUEtULAotCQkJCQkJICBDT05WX0FSUkFSWV9UT19VSU5UMTYoRUFQT0xQS1QuQm9keV9MZW4pICsgNCwKLQkJCQkJCSAgKHBFbnRyeS0+UG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpID8gRkFMU0UgOiBUUlVFKTsKLQotICAgICAgICBwRW50cnktPlJlVHJ5Q291bnRlciA9IFBFRVJfTVNHM19SRVRSWV9USU1FUl9DVFI7Ci0JCVJUTVBTZXRUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCBQRUVSX01TRzNfUkVUUllfRVhFQ19JTlRWKTsKLQotCQkvLyBVcGRhdGUgU3RhdGUKLSAgICAgICAgcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRfTkVHT1RJQVRJTkc7Ci0gICAgfXdoaWxlKEZBTFNFKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gUGVlclBhaXJNc2cyQWN0aW9uOiBzZW5kIE1zZzMgb2YgNC13YXkgXG4iKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIFBhaXJ3aXNlIGtleSBNc2cgMyBvZiA0LXdheSBoYW5kc2hha2luZyBhbmQgc2VuZCBNc2cgNAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlclBhaXJNc2czQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotICAgIElOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKQotewotCVBIRUFERVJfODAyXzExCQlwSGVhZGVyOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCUVBUE9MX1BBQ0tFVAkJRUFQT0xQS1Q7Ci0JUEVBUE9MX1BBQ0tFVAkJcE1zZzM7Ci0JVUlOVAkJCU1zZ0xlbjsKLQlQVUlOVDgJCQkJcEN1cnJlbnRBZGRyID0gTlVMTDsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJQYWlyTXNnM0FjdGlvbiBcbiIpKTsKLQotCWlmICgoIXBFbnRyeSkgfHwgKCghcEVudHJ5LT5WYWxpZEFzQ0xJKSAmJiAoIXBFbnRyeS0+VmFsaWRBc0FwQ2xpKSkpCi0JCXJldHVybjsKLQotICAgIGlmIChFbGVtLT5Nc2dMZW4gPCAoTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKLQkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBSZWNvcmQgODAyLjExIGhlYWRlciAmIHRoZSByZWNlaXZlZCBFQVBPTCBwYWNrZXQgTXNnMwotCXBIZWFkZXIJPSAoUEhFQURFUl84MDJfMTEpIEVsZW0tPk1zZzsKLQlwTXNnMyA9IChQRUFQT0xfUEFDS0VUKSAmRWxlbS0+TXNnW0xFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSF07Ci0JTXNnTGVuID0gRWxlbS0+TXNnTGVuIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF84MDJfMV9IOwotCi0JLy8gU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSAzIC0gUmVwbGF5IENvdW50ZXIsIE1JQywgUlNOSUUKLQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnMywgTXNnTGVuLCBFQVBPTF9QQUlSX01TR18zLCBwRW50cnkpID09IEZBTFNFKQotCQlyZXR1cm47Ci0KLQkvLyBTYXZlIFJlcGxheSBjb3VudGVyLCBpdCB3aWxsIHVzZSBjb25zdHJ1Y3QgbWVzc2FnZSA0Ci0JTmRpc01vdmVNZW1vcnkocEVudHJ5LT5SX0NvdW50ZXIsIHBNc2czLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gRG91YmxlIGNoZWNrIEFOb25jZQotCWlmICghTmRpc0VxdWFsTWVtb3J5KHBFbnRyeS0+QU5vbmNlLCBwTXNnMy0+S2V5RGVzYy5LZXlOb25jZSwgTEVOX0tFWV9ERVNDX05PTkNFKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIFBhaXJ3aXNlIE1zZyA0Ci0JTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LAotCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJICBFQVBPTF9QQUlSX01TR180LAotCQkJCQkgIDAsCQkJCQkvLyBncm91cCBrZXkgaW5kZXggbm90IHVzZWQgaW4gbWVzc2FnZSA0Ci0JCQkJCSAgTlVMTCwJCQkJCS8vIE5vbmNlIG5vdCB1c2VkIGluIG1lc3NhZ2UgNAotCQkJCQkgIE5VTEwsCQkJCQkvLyBUeFJTQyBub3QgdXNlZCBpbiBtZXNzYWdlIDQKLQkJCQkJICBOVUxMLAkJCQkJLy8gR1RLIG5vdCB1c2VkIGluIG1lc3NhZ2UgNAotCQkJCQkgIE5VTEwsCQkJCQkvLyBSU04gSUUgbm90IHVzZWQgaW4gbWVzc2FnZSA0Ci0JCQkJCSAgMCwKLQkJCQkJICAmRUFQT0xQS1QpOwotCi0JLy8gVXBkYXRlIFdwYVN0YXRlCi0JcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRET05FOwotCi0JLy8gVXBkYXRlIHBhaXJ3aXNlIGtleQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlQQ0lQSEVSX0tFWSBwU2hhcmVkS2V5OwotCi0JCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF07Ci0KLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUFRLLCBwRW50cnktPlBUSywgTEVOX1BUSyk7Ci0KLQkJLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQotCQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCQlwU2hhcmVkS2V5LT5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLQkgICAgTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+S2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5SeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OF0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlR4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4K0xFTl9US0lQX1JYTUlDS10sIExFTl9US0lQX1RYTUlDSyk7Ci0KLQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCQllbHNlCi0JCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotCQkvLyBVcGRhdGUgdGhlc2UgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBNQUNfVEFCTEVfRU5UUlkKLQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0JCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOwotCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBTaGFyZWRLZXktPkNpcGhlckFsZzsKLQotCQkvLyBVcGRhdGUgcGFpcndpc2Uga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIDAsCi0JCQkJCQkJICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCi0JCQkJCQkJICBwU2hhcmVkS2V5LT5LZXksCi0JCQkJCQkJICBwU2hhcmVkS2V5LT5UeE1pYywKLQkJCQkJCQkgIHBTaGFyZWRLZXktPlJ4TWljKTsKLQotCQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkJICAwLAotCQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkJICBwRW50cnkpOwotCi0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gb3BlbiA4MDIuMXggcG9ydCBjb250cm9sIGFuZCBwcml2YWN5IGZpbHRlcgotCWlmIChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0sgfHwKLQkJcEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotCXsKLQkJcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7Ci0JICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0JICAgIHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQYWlyTXNnM0FjdGlvbjogQXV0aE1vZGUoJXMpIFBhaXJ3aXNlQ2lwaGVyKCVzKSBHcm91cENpcGhlciglcykgXG4iLAotCQkJCQkJCQkJR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCi0JCQkJCQkJCQlHZXRFbmNyeXB0VHlwZShwRW50cnktPldlcFN0YXR1cyksCi0JCQkJCQkJCQlHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7Ci0JfQotCWVsc2UKLQl7Ci0JfQotCi0JLy8gSW5pdCA4MDIuMyBoZWFkZXIgYW5kIHNlbmQgb3V0Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBFbnRyeS0+QWRkciwgcEN1cnJlbnRBZGRyLCBFQVBPTCk7Ci0JUlRNUFRvV2lyZWxlc3NTdGEocEFkLCBwRW50cnksCi0JCQkJCSAgSGVhZGVyODAyXzMsIHNpemVvZihIZWFkZXI4MDJfMyksCi0JCQkJCSAgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KEVBUE9MUEtULkJvZHlfTGVuKSArIDQsIFRSVUUpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09PSBQZWVyUGFpck1zZzNBY3Rpb246IHNlbmQgTXNnNCBvZiA0LXdheSBcbiIpKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBXaGVuIHJlY2VpdmluZyB0aGUgbGFzdCBwYWNrZXQgb2YgNC13YXkgcGFpcndpc2VrZXkgaGFuZHNoYWtlLgotICAgICAgICBJbml0aWxpemUgMi13YXkgZ3JvdXBrZXkgaGFuZHNoYWtlIGZvbGxvd2luZy4KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFBlZXJQYWlyTXNnNEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSkKLXsKLQlQRUFQT0xfUEFDS0VUCQlwTXNnNDsKLSAgICBQSEVBREVSXzgwMl8xMSAgICAgIHBIZWFkZXI7Ci0gICAgVUlOVAkJTXNnTGVuOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgQ2FuY2VsbGVkOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gUGVlclBhaXJNc2c0QWN0aW9uXG4iKSk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoRWxlbS0+TXNnTGVuIDwgKExFTkdUSF84MDJfMTEgKyBMRU5HVEhfODAyXzFfSCArIExFTkdUSF9FQVBPTF9IICsgc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgLSAyICkgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKHBFbnRyeS0+V3BhU3RhdGUgPCBBU19QVEtJTklUX05FR09USUFUSU5HKQotICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAvLyBwb2ludGVyIHRvIDgwMi4xMSBoZWFkZXIKLSAgICAgICAgcEhlYWRlciA9IChQSEVBREVSXzgwMl8xMSlFbGVtLT5Nc2c7Ci0KLQkJLy8gc2tpcCA4MDIuMTFfaGVhZGVyKDI0LWJ5dGUpIGFuZCBMTENfaGVhZGVyKDgpCi0JCXBNc2c0ID0gKFBFQVBPTF9QQUNLRVQpJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0hdOwotCQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLSAgICAgICAgLy8gU2FuaXR5IENoZWNrIHBlZXIgUGFpcndpc2UgbWVzc2FnZSA0IC0gUmVwbGF5IENvdW50ZXIsIE1JQwotCQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnNCwgTXNnTGVuLCBFQVBPTF9QQUlSX01TR180LCBwRW50cnkpID09IEZBTFNFKQotCQkJYnJlYWs7Ci0KLSAgICAgICAgLy8gMy4gdXNlcyB0aGUgTUxNRS5TRVRLRVlTLnJlcXVlc3QgdG8gY29uZmlndXJlIFBUSyBpbnRvIE1BQwotICAgICAgICBOZGlzWmVyb01lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQotCQkvLyByZXNldCBJVkVJViBpbiBBc2ljCi0JCUFzaWNVcGRhdGVXQ0lESVZFSVYocEFkLCBwRW50cnktPkFpZCwgMSwgMCk7Ci0KLSAgICAgICAgcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSBMRU5fVEtJUF9FSzsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksICZwRW50cnktPlBUS1szMl0sIExFTl9US0lQX0VLKTsKLSAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5SeE1pYywgJnBFbnRyeS0+UFRLW1RLSVBfQVBfUlhNSUNLX09GRlNFVF0sIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwRW50cnktPlBUS1tUS0lQX0FQX1RYTUlDS19PRkZTRVRdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JCS8vIFNldCBwYWlyd2lzZSBrZXkgdG8gQXNpYwotICAgICAgICB7Ci0gICAgICAgICAgICBwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotICAgICAgICAgICAgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICAgICAgcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0gICAgICAgICAgICAgICAgcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCi0JCQkvLyBBZGQgUGFpci13aXNlIGtleSB0byBBc2ljCi0gICAgICAgICAgICBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLSAgICAgICAgICAgICAgICBwQWQsCi0gICAgICAgICAgICAgICAgcEVudHJ5LT5BZGRyLAotICAgICAgICAgICAgICAgIChVQ0hBUilwRW50cnktPkFpZCwKLSAgICAgICAgICAgICAgICAmcEVudHJ5LT5QYWlyd2lzZUtleSk7Ci0KLQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKLQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkoCi0JCQkJcEFkLAotCQkJCXBFbnRyeS0+YXBpZHgsCi0JCQkJMCwKLQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZywKLQkJCQlwRW50cnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gNC4gdXBncmFkZSBzdGF0ZQotICAgICAgICBwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLSAgICAgICAgcEVudHJ5LT5XcGFTdGF0ZSA9IEFTX1BUS0lOSVRET05FOwotCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0KLQotCQlpZiAocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8Ci0JCQlwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCXsKLQkJCXBFbnRyeS0+R1RLU3RhdGUgPSBSRUtFWV9FU1RBQkxJU0hFRDsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5SZXRyeVRpbWVyLCAmQ2FuY2VsbGVkKTsKLQotCi0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKLQotCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkFQIFNFVEtFWVMgRE9ORSAtIFdQQTIsIEF1dGhNb2RlKCVkKT0lcywgV2VwU3RhdHVzKCVkKT0lcywgR3JvdXBXZXBTdGF0dXMoJWQpPSVzXG5cbiIsCi0JCQkJCQkJCQlwRW50cnktPkF1dGhNb2RlLCBHZXRBdXRoTW9kZShwRW50cnktPkF1dGhNb2RlKSwKLQkJCQkJCQkJCXBFbnRyeS0+V2VwU3RhdHVzLCBHZXRFbmNyeXB0VHlwZShwRW50cnktPldlcFN0YXR1cyksCi0JCQkJCQkJCQlncm91cF9jaXBoZXIsCi0JCQkJCQkJCQlHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCS8vIDUuIGluaXQgR3JvdXAgMi13YXkgaGFuZHNoYWtlIGlmIG5lY2Vzc2FyeS4KLQkgICAgICAgIFdQQVN0YXJ0MldheUdyb3VwSFMocEFkLCBwRW50cnkpOwotCi0JCXBFbnRyeS0+UmVUcnlDb3VudGVyID0gR1JPVVBfTVNHMV9SRVRSWV9USU1FUl9DVFI7Ci0JCQlSVE1QTW9kVGltZXIoJnBFbnRyeS0+UmV0cnlUaW1lciwgUEVFUl9NU0czX1JFVFJZX0VYRUNfSU5UVik7Ci0JCX0KLSAgICB9d2hpbGUoRkFMU0UpOwotCi19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgVGhpcyBpcyBhIGZ1bmN0aW9uIHRvIHNlbmQgdGhlIGZpcnN0IHBhY2tldCBvZiAyLXdheSBncm91cGtleSBoYW5kc2hha2UKLSAgICBSZXR1cm46Ci0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgV1BBU3RhcnQyV2F5R3JvdXBIUygKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnkpCi17Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBIZWFkZXI4MDJfM1sxNF07Ci0JVUNIQVIJCQkJVHhUc2NbNl07Ci0gICAgRUFQT0xfUEFDS0VUCUVBUE9MUEtUOwotCVVDSEFSCQkJCWdyb3VwX2NpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlVQ0hBUgkJCQlkZWZhdWx0X2tleSA9IDA7Ci0JUFVJTlQ4CQkJCWdub25jZV9wdHIgPSBOVUxMOwotCVBVSU5UOAkJCQlndGtfcHRyID0gTlVMTDsKLQlQVUlOVDgJCQkJcEJzc2lkID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gV1BBU3RhcnQyV2F5R3JvdXBIU1xuIikpOwotCi0gICAgaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCi0gICAgICAgIHJldHVybjsKLQotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIC8vIEluY3JlbWVudCByZXBsYXkgY291bnRlciBieSAxCi0JCUFERF9PTkVfVG9fNjRCSVRfVkFSKHBFbnRyeS0+Ul9Db3VudGVyKTsKLQotCQkvLyBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIEdyb3VwIE1zZyAxCi0JCU5kaXNaZXJvTWVtb3J5KCZFQVBPTFBLVCwgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkpOwotCQlDb25zdHJ1Y3RFYXBvbE1zZyhwRW50cnksCi0JCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJCSAgRUFQT0xfR1JPVVBfTVNHXzEsCi0JCQkJCQkgIGRlZmF1bHRfa2V5LAotCQkJCQkJICAoVUNIQVIgKilnbm9uY2VfcHRyLAotCQkJCQkJICBUeFRzYywKLQkJCQkJCSAgKFVDSEFSICopZ3RrX3B0ciwKLQkJCQkJCSAgTlVMTCwKLQkJCQkJCSAgMCwKLQkJCQkJCSAgJkVBUE9MUEtUKTsKLQotCQkvLyBNYWtlIG91dGdvaW5nIGZyYW1lCi0gICAgICAgIE1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBCc3NpZCwgRUFQT0wpOwotICAgICAgICBSVE1QVG9XaXJlbGVzc1N0YShwQWQsIHBFbnRyeSwKLQkJCQkJCSAgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywKLQkJCQkJCSAgKFBVQ0hBUikmRUFQT0xQS1QsCi0JCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LCBGQUxTRSk7Ci0KLQotCi0gICAgfXdoaWxlIChGQUxTRSk7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFdQQVN0YXJ0MldheUdyb3VwSFMgOiBzZW5kIG91dCBHcm91cCBNZXNzYWdlIDEgXG4iKSk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIEdyb3VwIGtleSAyLXdheSBoYW5kc2hha2luZwotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCQlFbGVtCQlNZXNzYWdlIGJvZHkKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUGVlckdyb3VwTXNnMUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSkKLXsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEhlYWRlcjgwMl8zWzE0XTsKLQlFQVBPTF9QQUNLRVQJCUVBUE9MUEtUOwotCVBFQVBPTF9QQUNLRVQJCXBHcm91cDsKLQlVSU5UCQkJTXNnTGVuOwotCUJPT0xFQU4gICAgICAgICAgICAgQ2FuY2VsbGVkOwotCVVDSEFSCQkJCWRlZmF1bHRfa2V5ID0gMDsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JUFVJTlQ4CQkJCXBDdXJyZW50QWRkciA9IE5VTEw7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJHcm91cE1zZzFBY3Rpb24gXG4iKSk7Ci0KLQlpZiAoKCFwRW50cnkpIHx8ICgoIXBFbnRyeS0+VmFsaWRBc0NMSSkgJiYgKCFwRW50cnktPlZhbGlkQXNBcENsaSkpKQotICAgICAgICByZXR1cm47Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJcEN1cnJlbnRBZGRyID0gcEFkLT5DdXJyZW50QWRkcmVzczsKLQkJZ3JvdXBfY2lwaGVyID0gcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXI7Ci0JCWRlZmF1bHRfa2V5ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIFByb2Nlc3MgR3JvdXAgTWVzc2FnZSAxIGZyYW1lLiBza2lwIDgwMi4xMSBoZWFkZXIoMjQpICYgTExDX1NOQVAgaGVhZGVyKDgpCi0JcEdyb3VwID0gKFBFQVBPTF9QQUNLRVQpICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSArIExFTkdUSF84MDJfMV9IXTsKLQlNc2dMZW4gPSBFbGVtLT5Nc2dMZW4gLSBMRU5HVEhfODAyXzExIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkvLyBTYW5pdHkgQ2hlY2sgcGVlciBncm91cCBtZXNzYWdlIDEgLSBSZXBsYXkgQ291bnRlciwgTUlDLCBSU05JRQotCWlmIChQZWVyV3BhTWVzc2FnZVNhbml0eShwQWQsIHBHcm91cCwgTXNnTGVuLCBFQVBPTF9HUk9VUF9NU0dfMSwgcEVudHJ5KSA9PSBGQUxTRSkKLQkJcmV0dXJuOwotCi0JLy8gZGVsZXRlIHJldHJ5IHRpbWVyCi0JUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsICZDYW5jZWxsZWQpOwotCi0JLy8gU2F2ZSBSZXBsYXkgY291bnRlciwgaXQgd2lsbCB1c2UgdG8gY29uc3RydWN0IG1lc3NhZ2UgMgotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+Ul9Db3VudGVyLCBwR3JvdXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0KLQkvLyBDb25zdHJ1Y3QgRUFQb0wgbWVzc2FnZSAtIEdyb3VwIE1zZyAyCi0JTmRpc1plcm9NZW1vcnkoJkVBUE9MUEtULCBzaXplb2YoRUFQT0xfUEFDS0VUKSk7Ci0JQ29uc3RydWN0RWFwb2xNc2cocEVudHJ5LAotCQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkJICBFQVBPTF9HUk9VUF9NU0dfMiwKLQkJCQkJICBkZWZhdWx0X2tleSwKLQkJCQkJICBOVUxMLAkJCQkJLy8gTm9uY2Ugbm90IHVzZWQKLQkJCQkJICBOVUxMLAkJCQkJLy8gVHhSU0Mgbm90IHVzZWQKLQkJCQkJICBOVUxMLAkJCQkJLy8gR1RLIG5vdCB1c2VkCi0JCQkJCSAgTlVMTCwJCQkJCS8vIFJTTiBJRSBub3QgdXNlZAotCQkJCQkgIDAsCi0JCQkJCSAgJkVBUE9MUEtUKTsKLQotICAgIC8vIG9wZW4gODAyLjF4IHBvcnQgY29udHJvbCBhbmQgcHJpdmFjeSBmaWx0ZXIKLQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JcEVudHJ5LT5Qcml2YWN5RmlsdGVyID0gTmRpczgwMl8xMVByaXZGaWx0ZXJBY2NlcHRBbGw7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7Ci0gICAgLy8gSW5kaWNhdGUgQ29ubmVjdGVkIGZvciBHVUkKLSAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckdyb3VwTXNnMUFjdGlvbjogQXV0aE1vZGUoJXMpIFBhaXJ3aXNlQ2lwaGVyKCVzKSBHcm91cENpcGhlciglcykgXG4iLAotCQkJCQkJCQkJR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCi0JCQkJCQkJCQlHZXRFbmNyeXB0VHlwZShwRW50cnktPldlcFN0YXR1cyksCi0JCQkJCQkJCQlHZXRFbmNyeXB0VHlwZShncm91cF9jaXBoZXIpKSk7Ci0KLQkvLyBpbml0IGhlYWRlciBhbmQgRmlsbCBQYWNrZXQgYW5kIHNlbmQgTXNnIDIgdG8gYXV0aGVudGljYXRvcgotCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwRW50cnktPkFkZHIsIHBDdXJyZW50QWRkciwgRUFQT0wpOwotCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgcEVudHJ5LAotCQkJCQkgIEhlYWRlcjgwMl8zLCBzaXplb2YoSGVhZGVyODAyXzMpLAotCQkJCQkgIChQVUNIQVIpJkVBUE9MUEtULAotCQkJCQkgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihFQVBPTFBLVC5Cb2R5X0xlbikgKyA0LCBGQUxTRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IFBlZXJHcm91cE1zZzFBY3Rpb246IHNuZWQgZ3JvdXAgbWVzc2FnZSAyXG4iKSk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgV2hlbiByZWNlaXZpbmcgdGhlIGxhc3QgcGFja2V0IG9mIDItd2F5IGdyb3Vwa2V5IGhhbmRzaGFrZS4KLSAgICBSZXR1cm46Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFBlZXJHcm91cE1zZzJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotICAgIElOIFZPSUQgICAgICAgICAgICAgKk1zZywKLSAgICBJTiBVSU5UICAgICAgICAgICAgIE1zZ0xlbikKLXsKLSAgICBVSU5UCQlMZW47Ci0gICAgUFVDSEFSCQlwRGF0YTsKLSAgICBCT09MRUFOCQlDYW5jZWxsZWQ7Ci0JUEVBUE9MX1BBQ0tFVCAgICAgICBwTXNnMjsKLQlVQ0hBUgkJCQlncm91cF9jaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IFBlZXJHcm91cE1zZzJBY3Rpb24gXG4iKSk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgaWYgKCghcEVudHJ5KSB8fCAoIXBFbnRyeS0+VmFsaWRBc0NMSSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoTXNnTGVuIDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0ggKyBzaXplb2YoS0VZX0RFU0NSSVBURVIpIC0gTUFYX0xFTl9PRl9SU05JRSAtIDIpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKHBFbnRyeS0+V3BhU3RhdGUgIT0gQVNfUFRLSU5JVERPTkUpCi0gICAgICAgICAgICBicmVhazsKLQotCi0gICAgICAgIHBEYXRhID0gKFBVQ0hBUilNc2c7Ci0JCXBNc2cyID0gKFBFQVBPTF9QQUNLRVQpIChwRGF0YSArIExFTkdUSF84MDJfMV9IKTsKLSAgICAgICAgTGVuID0gTXNnTGVuIC0gTEVOR1RIXzgwMl8xX0g7Ci0KLQkJLy8gU2FuaXR5IENoZWNrIHBlZXIgZ3JvdXAgbWVzc2FnZSAyIC0gUmVwbGF5IENvdW50ZXIsIE1JQwotCQlpZiAoUGVlcldwYU1lc3NhZ2VTYW5pdHkocEFkLCBwTXNnMiwgTGVuLCBFQVBPTF9HUk9VUF9NU0dfMiwgcEVudHJ5KSA9PSBGQUxTRSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIDMuICB1cGdyYWRlIHN0YXRlCi0KLQkJUlRNUENhbmNlbFRpbWVyKCZwRW50cnktPlJldHJ5VGltZXIsICZDYW5jZWxsZWQpOwotICAgICAgICBwRW50cnktPkdUS1N0YXRlID0gUkVLRVlfRVNUQUJMSVNIRUQ7Ci0KLQkJaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQl7Ci0JCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIHNldCBrZXkgZG9uZSBXUEEyCi0JCQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCQkJUlRNUFNlbmRXaXJlbGVzc0V2ZW50KHBBZCwgSVdfU0VUX0tFWV9ET05FX1dQQTJfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkFQIFNFVEtFWVMgRE9ORSAtIFdQQTIsIEF1dGhNb2RlKCVkKT0lcywgV2VwU3RhdHVzKCVkKT0lcywgR3JvdXBXZXBTdGF0dXMoJWQpPSVzXG5cbiIsCi0JCQkJCQkJCQkJcEVudHJ5LT5BdXRoTW9kZSwgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCi0JCQkJCQkJCQkJcEVudHJ5LT5XZXBTdGF0dXMsIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCQlncm91cF9jaXBoZXIsIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3Igc2V0IGtleSBkb25lIFdQQQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcsIHBFbnRyeS0+QWRkciwgcEVudHJ5LT5hcGlkeCwgMCk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkFQIFNFVEtFWVMgRE9ORSAtIFdQQTEsIEF1dGhNb2RlKCVkKT0lcywgV2VwU3RhdHVzKCVkKT0lcywgR3JvdXBXZXBTdGF0dXMoJWQpPSVzXG5cbiIsCi0JCQkJCQkJCQkJcEVudHJ5LT5BdXRoTW9kZSwgR2V0QXV0aE1vZGUocEVudHJ5LT5BdXRoTW9kZSksCi0JCQkJCQkJCQkJcEVudHJ5LT5XZXBTdGF0dXMsIEdldEVuY3J5cHRUeXBlKHBFbnRyeS0+V2VwU3RhdHVzKSwKLQkJCQkJCQkJCQlncm91cF9jaXBoZXIsIEdldEVuY3J5cHRUeXBlKGdyb3VwX2NpcGhlcikpKTsKLQkJfQotICAgIH13aGlsZShGQUxTRSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDbGFzc2lmeSBXUEEgRUFQIG1lc3NhZ2UgdHlwZQotCi0JQXJndW1lbnRzOgotCQlFQVBUeXBlCQlWYWx1ZSBvZiBFQVAgbWVzc2FnZSB0eXBlCi0JCU1zZ1R5cGUJCUludGVybmFsIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgTUxNRSBzdGF0ZSBtYWNoaW5lCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCVRSVUUJCUZvdW5kIGFwcHJvcHJpYXRlIG1lc3NhZ2UgdHlwZQotCQlGQUxTRQkJTm8gYXBwcm9wcmlhdGUgbWVzc2FnZSB0eXBlCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0JCUFsbCB0aGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gd3BhLmgKLQkJRm9yIHN1cHBsaWNhbnQsIHRoZXJlIGlzIG9ubHkgRUFQT0wgS2V5IG1lc3NhZ2UgYXZhbGlhYmxlCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOCVdwYU1zZ1R5cGVTdWJzdCgKLQlJTglVQ0hBUglFQVBUeXBlLAotCU9VVAlJTlQJCSpNc2dUeXBlKQotewotCXN3aXRjaCAoRUFQVHlwZSkKLQl7Ci0JCWNhc2UgRUFQUGFja2V0OgotCQkJKk1zZ1R5cGUgPSBNVDJfRUFQUGFja2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xTdGFydDoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MU3RhcnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBFQVBPTExvZ29mZjoKLQkJCSpNc2dUeXBlID0gTVQyX0VBUE9MTG9nb2ZmOwotCQkJYnJlYWs7Ci0JCWNhc2UgRUFQT0xLZXk6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEtleTsKLQkJCWJyZWFrOwotCQljYXNlIEVBUE9MQVNGQWxlcnQ6Ci0JCQkqTXNnVHlwZSA9IE1UMl9FQVBPTEFTRkFsZXJ0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVGhlIHBzZXVkby1yYW5kb20gZnVuY3Rpb24oUFJGKSB0aGF0IGhhc2hlcyB2YXJpb3VzIGlucHV0cyB0bwotCQlkZXJpdmUgYSBwc2V1ZG8tcmFuZG9tIHZhbHVlLiBUbyBhZGQgbGl2ZW5lc3MgdG8gdGhlIHBzZXVkby1yYW5kb20KLQkJdmFsdWUsIGEgbm9uY2Ugc2hvdWxkIGJlIG9uZSBvZiB0aGUgaW5wdXRzLgotCi0JCUl0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgUFRLLCBHVEsgb3Igc29tZSBzcGVjaWZpYyByYW5kb20gdmFsdWUuCi0KLQlBcmd1bWVudHM6Ci0JCVVDSEFSCSprZXksCQktCXRoZSBrZXkgbWF0ZXJpYWwgZm9yIEhNQUNfU0hBMSB1c2UKLQkJSU5UCQlrZXlfbGVuCQktCXRoZSBsZW5ndGggb2Yga2V5Ci0JCVVDSEFSCSpwcmVmaXgJCS0JYSBwcmVmaXggbGFiZWwKLQkJSU5UCQlwcmVmaXhfbGVuCS0JdGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwKLQkJVUNIQVIJKmRhdGEJCS0JYSBzcGVjaWZpYyBkYXRhIHdpdGggdmFyaWFibGUgbGVuZ3RoCi0JCUlOVAkJZGF0YV9sZW4JLQl0aGUgbGVuZ3RoIG9mIGEgc3BlY2lmaWMgZGF0YQotCQlJTlQJCWxlbgkJCS0JdGhlIG91dHB1dCBsZW5naHQKLQotCVJldHVybiBWYWx1ZToKLQkJVUNIQVIJKm91dHB1dAkJLQl0aGUgY2FsY3VsYXRlZCByZXN1bHQKLQotCU5vdGU6Ci0JCTgwMi4xMWktMjAwNAlBbm5leCBILjMKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUFJGKAotCUlOCVVDSEFSCSprZXksCi0JSU4JSU5UCQlrZXlfbGVuLAotCUlOCVVDSEFSCSpwcmVmaXgsCi0JSU4JSU5UCQlwcmVmaXhfbGVuLAotCUlOCVVDSEFSCSpkYXRhLAotCUlOCUlOVAkJZGF0YV9sZW4sCi0JT1VUCVVDSEFSCSpvdXRwdXQsCi0JSU4JSU5UCQlsZW4pCi17Ci0JSU5UCQlpOwotICAgIFVDSEFSICAgKmlucHV0OwotCUlOVAkJY3VycmVudGluZGV4ID0gMDsKLQlJTlQJCXRvdGFsX2xlbjsKLQotCS8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgaW5wdXQKLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZpbnB1dCwgMTAyNCk7Ci0KLSAgICBpZiAoaW5wdXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIVBSRjogbm8gbWVtb3J5ISEhXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQkvLyBHZW5lcmF0ZSBjb25jYXRlbmF0aW9uIGlucHV0Ci0JTmRpc01vdmVNZW1vcnkoaW5wdXQsIHByZWZpeCwgcHJlZml4X2xlbik7Ci0KLQkvLyBDb25jYXRlbmF0ZSBhIHNpbmdsZSBvY3RldCBjb250YWluaW5nIDAKLQlpbnB1dFtwcmVmaXhfbGVuXSA9CTA7Ci0KLQkvLyBDb25jYXRlbmF0ZSBzcGVjaWZpYyBkYXRhCi0JTmRpc01vdmVNZW1vcnkoJmlucHV0W3ByZWZpeF9sZW4gKyAxXSwgZGF0YSwgZGF0YV9sZW4pOwotCXRvdGFsX2xlbiA9CXByZWZpeF9sZW4gKyAxICsgZGF0YV9sZW47Ci0KLQkvLyBDb25jYXRlbmF0ZSBhIHNpbmdsZSBvY3RldCBjb250YWluaW5nIDAKLQkvLyBUaGlzIG9jdGV0IHNoYWxsIGJlIHVwZGF0ZSBsYXRlcgotCWlucHV0W3RvdGFsX2xlbl0gPSAwOwotCXRvdGFsX2xlbisrOwotCi0JLy8gSXRlcmF0ZSB0byBjYWxjdWxhdGUgdGhlIHJlc3VsdCBieSBobWFjLXNoYS0xCi0JLy8gVGhlbiBjb25jYXRlbmF0ZSB0byBsYXN0IHJlc3VsdAotCWZvcgkoaSA9IDA7CWkgPAkobGVuICsgMTkpIC8gMjA7IGkrKykKLQl7Ci0JCUhNQUNfU0hBMShrZXksIGtleV9sZW4sIGlucHV0LCB0b3RhbF9sZW4sICZvdXRwdXRbY3VycmVudGluZGV4XSwgU0hBMV9ESUdFU1RfU0laRSk7Ci0JCWN1cnJlbnRpbmRleCArPQkyMDsKLQotCQkvLyB1cGRhdGUgdGhlIGxhc3Qgb2N0ZXQKLQkJaW5wdXRbdG90YWxfbGVuIC0gMV0rKzsKLQl9Ci0gICAgb3NfZnJlZV9tZW0oTlVMTCwgaW5wdXQpOwotfQotCi0vKgotKiBGKFAsIFMsIGMsIGkpID0gVTEgeG9yIFUyIHhvciAuLi4gVWMKLSogVTEgPSBQUkYoUCwgUyB8fCBJbnQoaSkpCi0qIFUyID0gUFJGKFAsIFUxKQotKiBVYyA9IFBSRihQLCBVYy0xKQotKi8KLQotc3RhdGljIHZvaWQgRihjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgY2hhciAqc3NpZCwgaW50IHNzaWRsZW5ndGgsIGludCBpdGVyYXRpb25zLCBpbnQgY291bnQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFszNl0sIGRpZ2VzdDFbU0hBMV9ESUdFU1RfU0laRV07Ci0gICAgaW50IGksIGo7Ci0KLSAgICAvKiBVMSA9IFBSRihQLCBTIHx8IGludChpKSkgKi8KLSAgICBtZW1jcHkoZGlnZXN0LCBzc2lkLCBzc2lkbGVuZ3RoKTsKLSAgICBkaWdlc3Rbc3NpZGxlbmd0aF0gPSAodW5zaWduZWQgY2hhcikoKGNvdW50Pj4yNCkgJiAweGZmKTsKLSAgICBkaWdlc3Rbc3NpZGxlbmd0aCsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoY291bnQ+PjE2KSAmIDB4ZmYpOwotICAgIGRpZ2VzdFtzc2lkbGVuZ3RoKzJdID0gKHVuc2lnbmVkIGNoYXIpKChjb3VudD4+OCkgJiAweGZmKTsKLSAgICBkaWdlc3Rbc3NpZGxlbmd0aCszXSA9ICh1bnNpZ25lZCBjaGFyKShjb3VudCAmIDB4ZmYpOwotICAgIEhNQUNfU0hBMSgodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QsIHNzaWRsZW5ndGgrNCwgZGlnZXN0MSwgU0hBMV9ESUdFU1RfU0laRSk7IC8vIGZvciBXUEEgdXBkYXRlCi0KLSAgICAvKiBvdXRwdXQgPSBVMSAqLwotICAgIG1lbWNweShvdXRwdXQsIGRpZ2VzdDEsIFNIQTFfRElHRVNUX1NJWkUpOwotCi0gICAgZm9yIChpID0gMTsgaSA8IGl0ZXJhdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIFVuID0gUFJGKFAsIFVuLTEpICovCi0gICAgICAgIEhNQUNfU0hBMSgodW5zaWduZWQgY2hhciopIHBhc3N3b3JkLCAoaW50KSBzdHJsZW4ocGFzc3dvcmQpLCBkaWdlc3QxLCBTSEExX0RJR0VTVF9TSVpFLCBkaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOyAvLyBmb3IgV1BBIHVwZGF0ZQotICAgICAgICBtZW1jcHkoZGlnZXN0MSwgZGlnZXN0LCBTSEExX0RJR0VTVF9TSVpFKTsKLQotICAgICAgICAvKiBvdXRwdXQgPSBvdXRwdXQgeG9yIFVuICovCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBTSEExX0RJR0VTVF9TSVpFOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dFtqXSBePSBkaWdlc3Rbal07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0qIHBhc3N3b3JkIC0gYXNjaWkgc3RyaW5nIHVwIHRvIDYzIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCi0qIHNzaWQgLSBvY3RldCBzdHJpbmcgdXAgdG8gMzIgb2N0ZXRzCi0qIHNzaWRsZW5ndGggLSBsZW5ndGggb2Ygc3NpZCBpbiBvY3RldHMKLSogb3V0cHV0IG11c3QgYmUgNDAgb2N0ZXRzIGluIGxlbmd0aCBhbmQgb3V0cHV0cyAyNTYgYml0cyBvZiBrZXkKLSovCi1pbnQgUGFzc3dvcmRIYXNoKFBTVFJJTkcgcGFzc3dvcmQsIFBVQ0hBUiBzc2lkLCBJTlQgc3NpZGxlbmd0aCwgUFVDSEFSIG91dHB1dCkKLXsKLSAgICBpZiAoKHN0cmxlbihwYXNzd29yZCkgPiA2MykgfHwgKHNzaWRsZW5ndGggPiAzMikpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRihwYXNzd29yZCwgc3NpZCwgc3NpZGxlbmd0aCwgNDA5NiwgMSwgb3V0cHV0KTsKLSAgICBGKHBhc3N3b3JkLCBzc2lkLCBzc2lkbGVuZ3RoLCA0MDk2LCAyLCAmb3V0cHV0W1NIQTFfRElHRVNUX1NJWkVdKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJdCB1dGlsaXplcyBQUkYtMzg0IG9yIFBSRi01MTIgdG8gZGVyaXZlIHNlc3Npb24tc3BlY2lmaWMga2V5cyBmcm9tIGEgUE1LLgotCQlJdCBzaGFsbCBiZSBjYWxsZWQgYnkgNC13YXkgaGFuZHNoYWtlIHByb2Nlc3NpbmcuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQkJUE1LCQktCXBvaW50ZXIgdG8gUE1LCi0JCUFOb25jZQktCXBvaW50ZXIgdG8gQU5vbmNlCi0JCUFBCQktCXBvaW50ZXIgdG8gQXV0aGVudGljYXRvciBBZGRyZXNzCi0JCVNOb25jZQktCXBvaW50ZXIgdG8gU05vbmNlCi0JCVNBCQktCXBvaW50ZXIgdG8gU3VwcGxpY2FudCBBZGRyZXNzCi0JCWxlbgkJLQlpbmRpY2F0ZSB0aGUgbGVuZ3RoIG9mIFBUSyAob2N0ZXQpCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU91dHB1dAkJcG9pbnRlciB0byB0aGUgUFRLCi0KLQlOb3RlOgotCQlSZWZlciB0byBJRUVFIDgwMi4xMWktMjAwNCA4LjUuMS4yCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFdwYURlcml2ZVBUSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkqUE1LLAotCUlOCVVDSEFSCSpBTm9uY2UsCi0JSU4JVUNIQVIJKkFBLAotCUlOCVVDSEFSCSpTTm9uY2UsCi0JSU4JVUNIQVIJKlNBLAotCU9VVAlVQ0hBUgkqb3V0cHV0LAotCUlOCVVJTlQJbGVuKQotewotCVVDSEFSCWNvbmNhdGVuYXRpb25bNzZdOwotCVVJTlQJQ3VyclBvcyA9IDA7Ci0JVUNIQVIJdGVtcFszMl07Ci0JVUNIQVIJUHJlZml4W10gPSB7J1AnLCAnYScsICdpJywgJ3InLCAndycsICdpJywgJ3MnLCAnZScsICcgJywgJ2snLCAnZScsICd5JywgJyAnLAotCQkJCQkJJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdzJywgJ2knLCAnbycsICduJ307Ci0KLQkvLyBpbml0aWF0ZSB0aGUgY29uY2F0ZW5hdGlvbiBpbnB1dAotCU5kaXNaZXJvTWVtb3J5KHRlbXAsIHNpemVvZih0ZW1wKSk7Ci0JTmRpc1plcm9NZW1vcnkoY29uY2F0ZW5hdGlvbiwgNzYpOwotCi0JLy8gR2V0IHNtYWxsZXIgYWRkcmVzcwotCWlmIChSVE1QQ29tcGFyZU1lbW9yeShTQSwgQUEsIDYpID09IDEpCi0JCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIEFBLCA2KTsKLQllbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KGNvbmNhdGVuYXRpb24sIFNBLCA2KTsKLQlDdXJyUG9zICs9IDY7Ci0KLQkvLyBHZXQgbGFyZ2VyIGFkZHJlc3MKLQlpZiAoUlRNUENvbXBhcmVNZW1vcnkoU0EsIEFBLCA2KSA9PSAxKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU0EsIDYpOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIEFBLCA2KTsKLQotCS8vIHN0b3JlIHRoZSBsYXJnZXIgbWFjIGFkZHJlc3MgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgb2YKLQkvLyByYWxpbmsgcHJvcHJpZXRhcnkgU1RBLWtleSBpc3N1ZQotCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBNQUNfQUREUl9MRU4pOwotCUN1cnJQb3MgKz0gNjsKLQotCS8vIEdldCBzbWFsbGVyIE5vbmNlCi0JaWYgKFJUTVBDb21wYXJlTWVtb3J5KEFOb25jZSwgU05vbmNlLCAzMikgPT0gMCkKLQkJTmRpc01vdmVNZW1vcnkoJmNvbmNhdGVuYXRpb25bQ3VyclBvc10sIHRlbXAsIDMyKTsJLy8gcGF0Y2ggZm9yIHJhbGluayBwcm9wcmlldGFyeSBTVEEta2V5IGlzc3VlCi0JZWxzZSBpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAxKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgU05vbmNlLCAzMik7Ci0JZWxzZQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgQU5vbmNlLCAzMik7Ci0JQ3VyclBvcyArPSAzMjsKLQotCS8vIEdldCBsYXJnZXIgTm9uY2UKLQlpZiAoUlRNUENvbXBhcmVNZW1vcnkoQU5vbmNlLCBTTm9uY2UsIDMyKSA9PSAwKQotCQlOZGlzTW92ZU1lbW9yeSgmY29uY2F0ZW5hdGlvbltDdXJyUG9zXSwgdGVtcCwgMzIpOwkvLyBwYXRjaCBmb3IgcmFsaW5rIHByb3ByaWV0YXJ5IFNUQS1rZXkgaXNzdWUKLQllbHNlIGlmIChSVE1QQ29tcGFyZU1lbW9yeShBTm9uY2UsIFNOb25jZSwgMzIpID09IDEpCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBBTm9uY2UsIDMyKTsKLQllbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KCZjb25jYXRlbmF0aW9uW0N1cnJQb3NdLCBTTm9uY2UsIDMyKTsKLQlDdXJyUG9zICs9IDMyOwotCi0JaGV4X2R1bXAoImNvbmNhdGVuYXRpb249IiwgY29uY2F0ZW5hdGlvbiwgNzYpOwotCi0JLy8gVXNlIFBSRiB0byBnZW5lcmF0ZSBQVEsKLQlQUkYoUE1LLCBMRU5fTUFTVEVSX0tFWSwgUHJlZml4LCAyMiwgY29uY2F0ZW5hdGlvbiwgNzYsIG91dHB1dCwgbGVuKTsKLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJR2VuZXJhdGUgcmFuZG9tIG51bWJlciBieSBzb2Z0d2FyZS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQkJbWFjQWRkcgktCXBvaW50ZXIgdG8gbG9jYWwgTUFDIGFkZHJlc3MKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0JCTgwMi4xaWktMjAwNCAgQW5uZXggSC41Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECUdlblJhbmRvbSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCSptYWNBZGRyLAotCU9VVAlVQ0hBUgkJCSpyYW5kb20pCi17Ci0JSU5UCQlpLCBjdXJyOwotCVVDSEFSCWxvY2FsWzgwXSwgS2V5Q291bnRlclszMl07Ci0JVUNIQVIJcmVzdWx0WzgwXTsKLQlVTE9ORwlDdXJyZW50VGltZTsKLQlVQ0hBUglwcmVmaXhbXSA9IHsnSScsICduJywgJ2knLCAndCcsICcgJywgJ0MnLCAnbycsICd1JywgJ24nLCAndCcsICdlJywgJ3InfTsKLQotCS8vIFplcm8gdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24KLQlOZGlzWmVyb01lbW9yeShyZXN1bHQsIDgwKTsKLQlOZGlzWmVyb01lbW9yeShsb2NhbCwgODApOwotCU5kaXNaZXJvTWVtb3J5KEtleUNvdW50ZXIsIDMyKTsKLQotCWZvcgkoaSA9IDA7CWkgPAkzMjsJaSsrKQotCXsKLQkJLy8gY29weSB0aGUgbG9jYWwgTUFDIGFkZHJlc3MKLQkJQ09QWV9NQUNfQUREUihsb2NhbCwgbWFjQWRkcik7Ci0JCWN1cnIgPQlNQUNfQUREUl9MRU47Ci0KLQkJLy8gY29uY2F0ZW5hdGUgdGhlIGN1cnJlbnQgdGltZQotCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZDdXJyZW50VGltZSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZsb2NhbFtjdXJyXSwgICZDdXJyZW50VGltZSwJc2l6ZW9mKEN1cnJlbnRUaW1lKSk7Ci0JCWN1cnIgKz0Jc2l6ZW9mKEN1cnJlbnRUaW1lKTsKLQotCQkvLyBjb25jYXRlbmF0ZSB0aGUgbGFzdCByZXN1bHQKLQkJTmRpc01vdmVNZW1vcnkoJmxvY2FsW2N1cnJdLCAgcmVzdWx0LCAzMik7Ci0JCWN1cnIgKz0JMzI7Ci0KLQkJLy8gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmbG9jYWxbY3Vycl0sICAmaSwgIDIpOwotCQljdXJyICs9CTI7Ci0KLQkJLy8gY2FsY3VsYXRlIHRoZSByZXN1bHQKLQkJUFJGKEtleUNvdW50ZXIsIDMyLCBwcmVmaXgsMTIsIGxvY2FsLCBjdXJyLCByZXN1bHQsIDMyKTsKLQl9Ci0KLQlOZGlzTW92ZU1lbW9yeShyYW5kb20sIHJlc3VsdCwJMzIpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQnVpbGQgY2lwaGVyIHN1aXRlIGluIFJTTi1JRS4KLQkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0JRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgotCVdlcFN0YXR1cwktCWluZGljYXRlIHRoZSBlbmNyeXB0aW9uIHR5cGUKLQkJYk1peENpcGhlcgktCWEgYm9vbGVhbiB0byBpbmRpY2F0ZSB0aGUgcGFpcndpc2UgY2lwaGVyIGFuZCBncm91cAotCQkJCQkJY2lwaGVyIGFyZSB0aGUgc2FtZSBvciBub3QKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBSVE1QTWFrZVJzbkllQ2lwaGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJRWxlbWVudElELAotCUlOCVVJTlQJCQlXZXBTdGF0dXMsCi0JSU4JQk9PTEVBTgkJCWJNaXhDaXBoZXIsCi0JSU4JVUNIQVIJCQlGbGV4aWJsZUNpcGhlciwKLQlPVVQJUFVDSEFSCQkJcFJzbkllLAotCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQotewotCVVDSEFSCVBhaXJ3aXNlQ250OwotCi0JKnJzbl9sZW4gPSAwOwotCi0JLy8gZGVjaWRlIFdQQTIgb3IgV1BBMQotCWlmIChFbGVtZW50SUQgPT0gV3BhMkllKQotCXsKLQkJUlNOSUUyCSpwUnNuaWVfY2lwaGVyID0gKFJTTklFMiopcFJzbkllOwotCi0JCS8vIEFzc2lnbiB0aGUgdmVyc29uIGFzIDEKLQkJcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7Ci0KLSAgICAgICAgc3dpdGNoIChXZXBTdGF0dXMpCi0gICAgICAgIHsKLQkJLy8gVEtJUCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRTIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQkvLyBBRVMgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJCWlmIChiTWl4Q2lwaGVyKQotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfVEtJUCwgNCk7Ci0JCQkJZWxzZQotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEEyX0NDTVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1RLSVAsIDQpOwotCi0JCQkJUGFpcndpc2VDbnQgPSAxOwotCQkJCS8vIEluc2VydCBXUEEyIFRLSVAgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCi0JCQkJewotCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBMl9US0lQLCA0KTsKLQkJCQkJLy8gSW5zZXJ0IFdQQTIgQUVTIGFzIHRoZSBzZWNvbmRhcnkgcGFpcndpc2UgY2lwaGVyCi0JCQkJCWlmIChNSVhfQ0lQSEVSX1dQQTJfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEEyX0NDTVAsIDQpOwotCQkJCQkJUGFpcndpc2VDbnQgPSAyOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIEluc2VydCBXUEEyIEFFUyBhcyB0aGUgZmlyc3QgcGFpcndpc2UgY2lwaGVyCi0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQTJfQ0NNUCwgNCk7Ci0JCQkJfQotCi0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUyKSArICg0ICogKFBhaXJ3aXNlQ250IC0gMSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpCi0JCXsKLQkJCVVJTlQJR3JvdXBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsKLQkJCXN3aXRjaChHcm91cENpcGhlcikKLQkJCXsKLQkJCQljYXNlIE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEEyX1dFUDQwLCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOZGlzODAyXzExR3JvdXBXRVAxMDRFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQTJfV0VQMTA0LCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCi0JCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKLQkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKLQl9Ci0JZWxzZQotCXsKLQkJUlNOSUUJKnBSc25pZV9jaXBoZXIgPSAoUlNOSUUqKXBSc25JZTsKLQotCQkvLyBBc3NpZ24gT1VJIGFuZCB2ZXJzaW9uCi0JCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm91aSwgT1VJX1dQQV9WRVJTSU9OLCA0KTsKLSAgICAgICAgcFJzbmllX2NpcGhlci0+dmVyc2lvbiA9IDE7Ci0KLQkJc3dpdGNoIChXZXBTdGF0dXMpCi0JCXsKLQkJCS8vIFRLSVAgbW9kZQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOgotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPm1jYXN0LCBPVUlfV1BBX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgIHBSc25pZV9jaXBoZXItPnVjb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOwotICAgICAgICAgICAgICAgICpyc25fbGVuID0gc2l6ZW9mKFJTTklFKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJLy8gQUVTIG1vZGUKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDoKLQkJCQlpZiAoYk1peENpcGhlcikKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7Ci0JCQkJZWxzZQotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICBwUnNuaWVfY2lwaGVyLT51Y291bnQgPSAxOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSwgT1VJX1dQQV9DQ01QLCA0KTsKLSAgICAgICAgICAgICAgICAqcnNuX2xlbiA9IHNpemVvZihSU05JRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCS8vIFRLSVAtQUVTIG1peCBtb2RlCi0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQ6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfVEtJUCwgNCk7Ci0KLQkJCQlQYWlyd2lzZUNudCA9IDE7Ci0JCQkJLy8gSW5zZXJ0IFdQQSBUS0lQIGFzIHRoZSBmaXJzdCBwYWlyd2lzZSBjaXBoZXIKLQkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfVEtJUF9PTihGbGV4aWJsZUNpcGhlcikpCi0JCQkJewotCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+dWNhc3RbMF0ub3VpLCBPVUlfV1BBX1RLSVAsIDQpOwotCQkJCQkvLyBJbnNlcnQgV1BBIEFFUyBhcyB0aGUgc2Vjb25kYXJ5IHBhaXJ3aXNlIGNpcGhlcgotCQkJCQlpZiAoTUlYX0NJUEhFUl9XUEFfQUVTX09OKEZsZXhpYmxlQ2lwaGVyKSkKLQkJCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9jaXBoZXItPnVjYXN0WzBdLm91aSArIDQsIE9VSV9XUEFfQ0NNUCwgNCk7Ci0JCQkJCQlQYWlyd2lzZUNudCA9IDI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gSW5zZXJ0IFdQQSBBRVMgYXMgdGhlIGZpcnN0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT51Y2FzdFswXS5vdWksIE9VSV9XUEFfQ0NNUCwgNCk7Ci0JCQkJfQotCi0gICAgICAgICAgICAgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gUGFpcndpc2VDbnQ7Ci0gICAgICAgICAgICAgICAgKnJzbl9sZW4gPSBzaXplb2YoUlNOSUUpICsgKDQgKiAoUGFpcndpc2VDbnQgLSAxKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCi0JCQkocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCShwQWQtPlN0YUNmZy5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJVUlOVAlHcm91cENpcGhlciA9IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyOwotCQkJc3dpdGNoKEdyb3VwQ2lwaGVyKQotCQkJewotCQkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkOgotCQkJCQlOZGlzTW92ZU1lbW9yeShwUnNuaWVfY2lwaGVyLT5tY2FzdCwgT1VJX1dQQV9XRVA0MCwgNCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDoKLQkJCQkJTmRpc01vdmVNZW1vcnkocFJzbmllX2NpcGhlci0+bWNhc3QsIE9VSV9XUEFfV0VQMTA0LCA0KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkvLyBzd2FwIGZvciBiaWctZW5kaWFuIHBsYXRmb3JtCi0JCXBSc25pZV9jaXBoZXItPnZlcnNpb24gPSBjcHUybGUxNihwUnNuaWVfY2lwaGVyLT52ZXJzaW9uKTsKLQkgICAgcFJzbmllX2NpcGhlci0+dWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2NpcGhlci0+dWNvdW50KTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCdWlsZCBBS00gc3VpdGUgaW4gUlNOLUlFLgotCQlJdCBvbmx5IHNoYWxsIGJlIGNhbGxlZCBieSBSVE1QTWFrZVJTTklFLgotCi0JQXJndW1lbnRzOgotCQlwQWQJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQlFbGVtZW50SUQJLQlpbmRpY2F0ZSB0aGUgV1BBMSBvciBXUEEyCi0JQXV0aE1vZGUJLQlpbmRpY2F0ZSB0aGUgYXV0aGVudGljYXRpb24gbW9kZQotCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFZPSUQgUlRNUE1ha2VSc25JZUFLTSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKLQlJTglVSU5UCQkJQXV0aE1vZGUsCi0JSU4JVUNIQVIJCQlhcGlkeCwKLQlPVVQJUFVDSEFSCQkJcFJzbkllLAotCU9VVAlVQ0hBUgkJCSpyc25fbGVuKQotewotCVJTTklFX0FVVEgJCSpwUnNuaWVfYXV0aDsKLQlVQ0hBUgkJCUFrbUNudCA9IDE7CQkvLyBkZWZhdWx0IGFzIDEKLQotCXBSc25pZV9hdXRoID0gKFJTTklFX0FVVEgqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKLQotCS8vIGRlY2lkZSBXUEEyIG9yIFdQQTEKLQlpZiAoRWxlbWVudElEID09IFdwYTJJZSkKLQl7Ci0KLQkJc3dpdGNoIChBdXRoTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExV1BBMjoKLQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfODAyMVhfQUtNLCA0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKLQkJCU5kaXNNb3ZlTWVtb3J5KHBSc25pZV9hdXRoLT5hdXRoWzBdLm91aSwgT1VJX1dQQTJfUFNLX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUFrbUNudCA9IDA7Ci0JCQkJYnJlYWs7Ci0KLSAgICAgICAgfQotCX0KLQllbHNlCi0JewotCQlzd2l0Y2ggKEF1dGhNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE5kaXM4MDJfMTFBdXRoTW9kZVdQQToKLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTI6Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFJzbmllX2F1dGgtPmF1dGhbMF0ub3VpLCBPVUlfV1BBXzgwMjFYX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOgotICAgICAgICAgICAgY2FzZSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSzoKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfUFNLX0FLTSwgNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWNhc2UgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZToKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwUnNuaWVfYXV0aC0+YXV0aFswXS5vdWksIE9VSV9XUEFfTk9ORV9BS00sIDQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlBa21DbnQgPSAwOwotCQkJCWJyZWFrOwotICAgICAgICB9Ci0JfQotCi0JcFJzbmllX2F1dGgtPmFjb3VudCA9IEFrbUNudDsKLQlwUnNuaWVfYXV0aC0+YWNvdW50ID0gY3B1MmxlMTYocFJzbmllX2F1dGgtPmFjb3VudCk7Ci0KLQkvLyB1cGRhdGUgY3VycmVudCBSU05JRSBsZW5ndGgKLQkoKnJzbl9sZW4pICs9IChzaXplb2YoUlNOSUVfQVVUSCkgKyAoNCAqIChBa21DbnQgLSAxKSkpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlCdWlsZCBjYXBhYmlsaXR5IGluIFJTTi1JRS4KLQkJSXQgb25seSBzaGFsbCBiZSBjYWxsZWQgYnkgUlRNUE1ha2VSU05JRS4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJLQlwb2ludGVyIHRvIG91ciBwQWRhcHRlciBjb250ZXh0Ci0JRWxlbWVudElECS0JaW5kaWNhdGUgdGhlIFdQQTEgb3IgV1BBMgotCQlhcGlkeAkJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFZPSUQgUlRNUE1ha2VSc25JZUNhcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCUVsZW1lbnRJRCwKLQlJTglVQ0hBUgkJCWFwaWR4LAotCU9VVAlQVUNIQVIJCQlwUnNuSWUsCi0JT1VUCVVDSEFSCQkJKnJzbl9sZW4pCi17Ci0JUlNOX0NBUEFCSUxJVElFUyAgICAqcFJTTl9DYXA7Ci0KLQkvLyBpdCBjb3VsZCBiZSBpZ25vcmVkIGluIFdQQTEgbW9kZQotCWlmIChFbGVtZW50SUQgPT0gV3BhSWUpCi0JCXJldHVybjsKLQotCXBSU05fQ2FwID0gKFJTTl9DQVBBQklMSVRJRVMqKShwUnNuSWUgKyAoKnJzbl9sZW4pKTsKLQotCi0JcFJTTl9DYXAtPndvcmQgPSBjcHUybGUxNihwUlNOX0NhcC0+d29yZCk7Ci0KLQkoKnJzbl9sZW4pICs9IHNpemVvZihSU05fQ0FQQUJJTElUSUVTKTsJLy8gdXBkYXRlIGN1cnJlbnQgUlNOSUUgbGVuZ3RoCi0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQnVpbGQgUlNOIElFIGNvbnRleHQuIEl0IGlzIG5vdCBpbmNsdWRlZCBlbGVtZW50LUlEIGFuZCBsZW5ndGguCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCUF1dGhNb2RlCS0JaW5kaWNhdGUgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUKLQlXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCi0JCWFwaWR4CQktCWluZGljYXRlIHRoZSBpbnRlcmZhY2UgaW5kZXgKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBNYWtlUlNOSUUoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBBdXRoTW9kZSwKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIFdlcFN0YXR1cywKLQlJTglVQ0hBUgkJCWFwaWR4KQotewotCVBVQ0hBUgkJcFJzbkllID0gTlVMTDsJCQkvLyBwcmltYXJ5IFJTTklFCi0JVUNIQVIJCSpyc25pZWxlbl9jdXJfcCA9IDA7CS8vIHRoZSBsZW5ndGggb2YgdGhlIHByaW1hcnkgUlNOSUUKLQlVQ0hBUgkJKnJzbmllbGVuX2V4X2N1cl9wID0gMDsJLy8gdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kYXJ5IFJTTklFCi0JVUNIQVIJCVByaW1hcnlSc25pZTsKLQlCT09MRUFOCQliTWl4Q2lwaGVyID0gRkFMU0U7CS8vIGluZGljYXRlIHRoZSBwYWlyd2lzZSBhbmQgZ3JvdXAgY2lwaGVyIGFyZSBkaWZmZXJlbnQKLQlVQ0hBUgkJcF9vZmZzZXQ7Ci0JV1BBX01JWF9QQUlSX0NJUEhFUgkJRmxleGlibGVDaXBoZXIgPSBXUEFfVEtJUEFFU19XUEEyX1RLSVBBRVM7CS8vIGl0IHByb3ZpZGUgdGhlIG1vcmUgZmxleGlibGUgY2lwaGVyIGNvbWJpbmF0aW9uIGluIFdQQS1XUEEyIGFuZCBUS0lQQUVTIG1vZGUKLQotCXJzbmllbGVuX2N1cl9wID0gTlVMTDsKLQlyc25pZWxlbl9leF9jdXJfcCA9IE5VTEw7Ci0KLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0JCQl7Ci0JCQkJaWYgKEF1dGhNb2RlIDwgTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQkJewotCQkJCS8vIFN1cHBvcnQgV1BBUFNLIG9yIFdQQTJQU0sgaW4gU1RBLUluZnJhIG1vZGUKLQkJCQkvLyBTdXBwb3J0IFdQQU5vbmUgaW4gU1RBLUFkaG9jIG1vZGUKLQkJCQlpZiAoKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgJiYKLQkJCQkJKEF1dGhNb2RlICE9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spICYmCi0JCQkJCShBdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCQkJCQkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCI9PT4gUlRNUE1ha2VSU05JRShTVEEpXG4iKSk7Ci0KLQkJCS8vIFplcm8gUlNOSUUgY29udGV4dAotCQkJcEFkLT5TdGFDZmcuUlNOSUVfTGVuID0gMDsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJTTl9JRSwgTUFYX0xFTl9PRl9SU05JRSk7Ci0KLQkJCS8vIFBvaW50ZXIgdG8gUlNOSUUKLQkJCXJzbmllbGVuX2N1cl9wID0gJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQkJCXBSc25JZSA9IHBBZC0+U3RhQ2ZnLlJTTl9JRTsKLQotCQkJYk1peENpcGhlciA9IHBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXI7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvLyBpbmRpY2F0ZSBwcmltYXJ5IFJTTklFIGFzIFdQQSBvciBXUEEyCi0JaWYgKChBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKSB8fAotCQkoQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMVdQQTIpIHx8Ci0JCShBdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCi0JCVByaW1hcnlSc25pZSA9IFdwYUllOwotCWVsc2UKLQkJUHJpbWFyeVJzbmllID0gV3BhMkllOwotCi0JewotCQkvLyBCdWlsZCB0aGUgcHJpbWFyeSBSU05JRQotCQkvLyAxLiBpbnNlcnQgY2lwaGVyIHN1aXRlCi0JCVJUTVBNYWtlUnNuSWVDaXBoZXIocEFkLCBQcmltYXJ5UnNuaWUsIFdlcFN0YXR1cywgYk1peENpcGhlciwgRmxleGlibGVDaXBoZXIsIHBSc25JZSwgJnBfb2Zmc2V0KTsKLQotCQkvLyAyLiBpbnNlcnQgQUtNCi0JCVJUTVBNYWtlUnNuSWVBS00ocEFkLCBQcmltYXJ5UnNuaWUsIEF1dGhNb2RlLCBhcGlkeCwgcFJzbkllLCAmcF9vZmZzZXQpOwotCi0JCS8vIDMuIGluc2VydCBjYXBhYmlsaXR5Ci0JCVJUTVBNYWtlUnNuSWVDYXAocEFkLCBQcmltYXJ5UnNuaWUsIGFwaWR4LCBwUnNuSWUsICZwX29mZnNldCk7Ci0JfQotCi0JLy8gNC4gdXBkYXRlIHRoZSBSU05JRSBsZW5ndGgKLQkqcnNuaWVsZW5fY3VyX3AgPSBwX29mZnNldDsKLQotCWhleF9kdW1wKCJUaGUgcHJpbWFyeSBSU05JRSIsIHBSc25JZSwgKCpyc25pZWxlbl9jdXJfcCkpOwotCi0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCQlDaGVjayB3aGV0aGVyIHRoZSByZWNlaXZlZCBmcmFtZSBpcyBFQVAgZnJhbWUuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQkJcEVudHJ5CQkJLQlwb2ludGVyIHRvIGFjdGl2ZSBlbnRyeQotCQlwRGF0YQkJCS0JdGhlIHJlY2VpdmVkIGZyYW1lCi0JCURhdGFCeXRlQ291bnQJLQl0aGUgcmVjZWl2ZWQgZnJhbWUncyBsZW5ndGgKLQkJRnJvbVdoaWNoQlNTSUQJLQlpbmRpY2F0ZSB0aGUgaW50ZXJmYWNlIGluZGV4Ci0KLSAgICBSZXR1cm46Ci0gICAgICAgICBUUlVFCQkJLQlUaGlzIGZyYW1lIGlzIEVBUCBmcmFtZQotICAgICAgICAgRkFMU0UJCQktCW90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVE1QQ2hlY2tXUEFmcmFtZSgKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTiBQVUNIQVIgICAgICAgICAgIHBEYXRhLAotICAgIElOIFVMT05HICAgICAgICAgICAgRGF0YUJ5dGVDb3VudCwKLQlJTiBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVVMT05HCUJvZHlfbGVuOwotCUJPT0xFQU4gQ2FuY2VsbGVkOwotCi0KLSAgICBpZihEYXRhQnl0ZUNvdW50IDwgKExFTkdUSF84MDJfMV9IICsgTEVOR1RIX0VBUE9MX0gpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLQotCS8vIFNraXAgTExDIGhlYWRlcgotICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoU05BUF84MDJfMUgsIHBEYXRhLCA2KSB8fAotICAgICAgICAvLyBDaXNjbyAxMjAwIEFQIG1heSBzZW5kIHBhY2tldCB3aXRoIFNOQVBfQlJJREdFX1RVTk5FTAotICAgICAgICBOZGlzRXF1YWxNZW1vcnkoU05BUF9CUklER0VfVFVOTkVMLCBwRGF0YSwgNikpCi0gICAgewotICAgICAgICBwRGF0YSArPSA2OwotICAgIH0KLQkvLyBTa2lwIDItYnl0ZXMgRUFQb0wgdHlwZQotICAgIGlmIChOZGlzRXF1YWxNZW1vcnkoRUFQT0wsIHBEYXRhLCAyKSkKLS8vCWlmICgqKFVJTlQxNiAqKUVBUE9MID09ICooVUlOVDE2ICopcERhdGEpCi0gICAgewotICAgICAgICBwRGF0YSArPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIHN3aXRjaCAoKihwRGF0YSsxKSkKLSAgICB7Ci0gICAgICAgIGNhc2UgRUFQUGFja2V0OgotCQkJQm9keV9sZW4gPSAoKihwRGF0YSsyKTw8OCkgfCAoKihwRGF0YSszKSk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1QYWNrZXQgZnJhbWUsIFRZUEUgPSAwLCBMZW5ndGggPSAlbGRcbiIsIEJvZHlfbGVuKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTFN0YXJ0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVjZWl2ZSBFQVBPTC1TdGFydCBmcmFtZSwgVFlQRSA9IDEgXG4iKSk7Ci0JCQlpZiAocEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyAhPSBFQVBPTF9TVEFSVF9ESVNBQkxFKQotICAgICAgICAgICAgewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDYW5jZWwgdGhlIEVucXVldWVFYXBvbFN0YXJ0VGltZXJSdW5uaW5nIFxuIikpOwotICAgICAgICAgICAgICAgIFJUTVBDYW5jZWxUaW1lcigmcEVudHJ5LT5FbnF1ZXVlU3RhcnRGb3JQU0tUaW1lciwgJkNhbmNlbGxlZCk7Ci0gICAgICAgICAgICAgICAgcEVudHJ5LT5FbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZyA9IEVBUE9MX1NUQVJUX0RJU0FCTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQVBPTExvZ29mZjoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0xMb2dvZmYgZnJhbWUsIFRZUEUgPSAyIFxuIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUFQT0xLZXk6Ci0JCQlCb2R5X2xlbiA9ICgqKHBEYXRhKzIpPDw4KSB8ICgqKHBEYXRhKzMpKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0wtS2V5IGZyYW1lLCBUWVBFID0gMywgTGVuZ3RoID0gJWxkXG4iLCBCb2R5X2xlbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUFQT0xBU0ZBbGVydDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJlY2VpdmUgRUFQT0xBU0ZBbGVydCBmcmFtZSwgVFlQRSA9IDQgXG4iKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCQlSZXBvcnQgdGhlIEVBUCBtZXNzYWdlIHR5cGUKLQotCUFyZ3VtZW50czoKLQkJbXNnCQktCUVBUE9MX1BBSVJfTVNHXzEKLQkJCQkJRUFQT0xfUEFJUl9NU0dfMgotCQkJCQlFQVBPTF9QQUlSX01TR18zCi0JCQkJCUVBUE9MX1BBSVJfTVNHXzQKLQkJCQkJRUFQT0xfR1JPVVBfTVNHXzEKLQkJCQkJRUFQT0xfR1JPVVBfTVNHXzIKLQotICAgIFJldHVybjoKLSAgICAgICAgIG1lc3NhZ2UgdHlwZSBzdHJpbmcKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotUFNUUklORyBHZXRFYXBvbE1zZ1R5cGUoQ0hBUiBtc2cpCi17Ci0gICAgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzEpCi0gICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSAxIjsKLSAgICBlbHNlIGlmKG1zZyA9PSBFQVBPTF9QQUlSX01TR18yKQotICAgICAgICByZXR1cm4gIlBhaXJ3aXNlIE1lc3NhZ2UgMiI7Ci0JZWxzZSBpZihtc2cgPT0gRUFQT0xfUEFJUl9NU0dfMykKLSAgICAgICAgcmV0dXJuICJQYWlyd2lzZSBNZXNzYWdlIDMiOwotCWVsc2UgaWYobXNnID09IEVBUE9MX1BBSVJfTVNHXzQpCi0gICAgICAgIHJldHVybiAiUGFpcndpc2UgTWVzc2FnZSA0IjsKLQllbHNlIGlmKG1zZyA9PSBFQVBPTF9HUk9VUF9NU0dfMSkKLSAgICAgICAgcmV0dXJuICJHcm91cCBNZXNzYWdlIDEiOwotCWVsc2UgaWYobXNnID09IEVBUE9MX0dST1VQX01TR18yKQotICAgICAgICByZXR1cm4gIkdyb3VwIE1lc3NhZ2UgMiI7Ci0gICAgZWxzZQotCXJldHVybiAiSW52YWxpZCBNZXNzYWdlIjsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBDaGVjayBTYW5pdHkgUlNOIElFIG9mIEVBUG9MIG1lc3NhZ2UKLQotICAgIEFyZ3VtZW50czoKLQotICAgIFJldHVybiBWYWx1ZToKLQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVE1QQ2hlY2tSU05JRSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAotCUlOICBVQ0hBUiAgICAgICAgICAgRGF0YUxlbiwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCi0JT1VUCVVDSEFSCQkJKk9mZnNldCkKLXsKLQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7Ci0JVUNIQVIgICAgICAgICAgICAgICBsZW47Ci0JUEVJRF9TVFJVQ1QgICAgICAgICBwRWlkOwotCUJPT0xFQU4JCQkJcmVzdWx0ID0gRkFMU0U7Ci0KLQlwVklFID0gcERhdGE7Ci0JbGVuCSA9IERhdGFMZW47Ci0JKk9mZnNldCA9IDA7Ci0KLQl3aGlsZSAobGVuID4gc2l6ZW9mKFJTTklFMikpCi0JewotCQlwRWlkID0gKFBFSURfU1RSVUNUKSBwVklFOwotCQkvLyBXUEEgUlNOIElFCi0JCWlmICgocEVpZC0+RWlkID09IElFX1dQQSkgJiYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpKQotCQl7Ci0JCQlpZiAoKHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSAmJgotCQkJCShOZGlzRXF1YWxNZW1vcnkocFZJRSwgcEVudHJ5LT5SU05fSUUsIHBFbnRyeS0+UlNOSUVfTGVuKSkgJiYKLQkJCQkocEVudHJ5LT5SU05JRV9MZW4gPT0gKHBFaWQtPkxlbiArIDIpKSkKLQkJCXsKLQkJCQkJcmVzdWx0ID0gVFJVRTsKLQkJCX0KLQotCQkJKk9mZnNldCArPSAocEVpZC0+TGVuICsgMik7Ci0JCX0KLQkJLy8gV1BBMiBSU04gSUUKLQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkpCi0JCXsKLQkJCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8IHBFbnRyeS0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgJiYKLQkJCQkocEVpZC0+RWlkID09IHBFbnRyeS0+UlNOX0lFWzBdKSAmJgotCQkJCSgocEVpZC0+TGVuICsgMikgPj0gcEVudHJ5LT5SU05JRV9MZW4pICYmCi0JCQkJKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgJnBFbnRyeS0+UlNOX0lFWzJdLCBwRW50cnktPlJTTklFX0xlbiAtIDIpKSkKLQkJCXsKLQotCQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCi0JCQkqT2Zmc2V0ICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcFZJRSArPSAocEVpZC0+TGVuICsgMik7Ci0JCWxlbiAgLT0gKHBFaWQtPkxlbiArIDIpOwotCX0KLQotCi0JcmV0dXJuIHJlc3VsdDsKLQotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFBhcnNlIEtFWURBVEEgZmllbGQuICBLRVlEQVRBW10gTWF5IGNvbnRhaW4gMiBSU04gSUUgYW5kIG9wdGlvbmFsbHkgR1RLLgotICAgIEdUSyAgaXMgZW5jYXB0dWxhdGVkIGluIEtERSBmb3JtYXQgYXQgIHAuODMgODAyLjExaSBEMTAKLQotICAgIEFyZ3VtZW50czoKLQotICAgIFJldHVybiBWYWx1ZToKLQotICAgIE5vdGU6Ci0gICAgICAgIDgwMi4xMWkgRDEwCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFJUTVBQYXJzZUVhcG9sS2V5RGF0YSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBLZXlEYXRhLAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5RGF0YUxlbiwKLQlJTglVQ0hBUgkJCUdyb3VwS2V5SW5kZXgsCi0JSU4JVUNIQVIJCQlNc2dUeXBlLAotCUlOCUJPT0xFQU4JCQliV1BBMiwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnkpCi17Ci0gICAgUEtERV9FTkNBUCAgICAgICAgICBwS0RFID0gTlVMTDsKLSAgICBQVUNIQVIgICAgICAgICAgICAgIHBNeUtleURhdGEgPSBwS2V5RGF0YTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEtleURhdGFMZW5ndGggPSBLZXlEYXRhTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgR1RLTEVOID0gMDsKLQlVQ0hBUgkJCQlEZWZhdWx0SWR4ID0gMDsKLQlVQ0hBUgkJCQlza2lwX29mZnNldDsKLQotCS8vIFZlcmlmeSBUaGUgUlNOIElFIGNvbnRhaW5lZCBpbiBwYWlyZXdpc2VfbXNnXzIgJiYgcGFpcmV3aXNlX21zZ18zIGFuZCBza2lwIGl0Ci0JaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMiB8fCBNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpCi0gICAgewotCQkvLyBDaGVjayBSU04gSUUgd2hldGhlciBpdCBpcyBXUEEyL1dQQTJQU0sKLQkJaWYgKCFSVE1QQ2hlY2tSU05JRShwQWQsIHBLZXlEYXRhLCBLZXlEYXRhTGVuLCBwRW50cnksICZza2lwX29mZnNldCkpCi0JCXsKLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgUlNOIElFIGRpZmZlcmVudAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1JTTklFX0RJRkZfRVZFTlRfRkxBRywgcEVudHJ5LT5BZGRyLCBwRW50cnktPmFwaWR4LCAwKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSU05fSUUgRGlmZmVyZW50IGluIG1zZyAlZCBvZiA0LXdheSBoYW5kc2hha2UhXG4iLCBNc2dUeXBlKSk7Ci0JCQloZXhfZHVtcCgiUmVjZWl2ZSBSU05fSUUgIiwgcEtleURhdGEsIEtleURhdGFMZW4pOwotCQkJaGV4X2R1bXAoIkRlc2lyZWQgUlNOX0lFICIsIHBFbnRyeS0+UlNOX0lFLCBwRW50cnktPlJTTklFX0xlbik7Ci0KLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZQotCQl7Ci0JCQlpZiAoYldQQTIgJiYgTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKQotCQkJewotCQkJCVdwYVNob3dBbGxzdWl0ZShwTXlLZXlEYXRhLCBza2lwX29mZnNldCk7Ci0KLQkJCQkvLyBza2lwIFJTTiBJRQotCQkJCXBNeUtleURhdGEgKz0gc2tpcF9vZmZzZXQ7Ci0JCQkJS2V5RGF0YUxlbmd0aCAtPSBza2lwX29mZnNldDsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QUGFyc2VFYXBvbEtleURhdGEgPT0+IFdQQTIvV1BBMlBTSyBSU04gSUUgbWF0Y2hlZCBpbiBNc2cgMywgTGVuZ3RoKCVkKSBcbiIsIHNraXBfb2Zmc2V0KSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQYXJzZUVhcG9sS2V5RGF0YSA9PT4gS2V5RGF0YUxlbmd0aCAlZCB3aXRob3V0IFJTTl9JRSBcbiIsIEtleURhdGFMZW5ndGgpKTsKLQkvL2hleF9kdW1wKCJyZW1haW4gZGF0YSIsIHBNeUtleURhdGEsIEtleURhdGFMZW5ndGgpOwotCi0KLQkvLyBQYXJzZSBFS0QgZm9ybWF0IGluIHBhaXJ3aXNlX21zZ18zX1dQQTIgJiYgZ3JvdXBfbXNnXzFfV1BBMgotCWlmIChiV1BBMiAmJiAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zIHx8IE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCXsKLQkJaWYgKEtleURhdGFMZW5ndGggPj0gOCkJLy8gS0RFIGZvcm1hdCBleGNsdWRlIEdUSyBsZW5ndGgKLQl7Ci0JCXBLREUgPSAoUEtERV9FTkNBUCkgcE15S2V5RGF0YTsKLQotCi0JCQlEZWZhdWx0SWR4ID0gcEtERS0+R1RLRW5jYXAuS2lkOwotCi0JCQkvLyBTYW5pdHkgY2hlY2sgLSBLRUQgbGVuZ3RoCi0JCQlpZiAoS2V5RGF0YUxlbmd0aCA8IChwS0RFLT5MZW4gKyAyKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IFRoZSBsZW4gZnJvbSBLREUgaXMgdG9vIHNob3J0IFxuIikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJCS8vIEdldCBHVEsgbGVuZ3RoIC0gcmVmZXIgdG8gSUVFRSA4MDIuMTFpLTIwMDQgcC44MgotCQkJR1RLTEVOID0gcEtERS0+TGVuIC02OwotCQkJaWYgKEdUS0xFTiA8IExFTl9BRVNfS0VZKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGxlbmd0aCBpcyB0b28gc2hvcnQgKCVkKSBcbiIsIEdUS0xFTikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JfQotCQllbHNlCi0JewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1I6IEtERSBmb3JtYXQgbGVuZ3RoIGlzIHRvbyBzaG9ydCBcbiIpKTsKLQkgICAgICAgIHJldHVybiBGQUxTRTsKLQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIGluIEtERSBmb3JtYXQgLERlZmF1bHRLZXlJRD0lZCwgS2V5TGVuPSVkIFxuIiwgRGVmYXVsdElkeCwgR1RLTEVOKSk7Ci0JCS8vIHNraXAgaXQKLQkJcE15S2V5RGF0YSArPSA4OwotCQlLZXlEYXRhTGVuZ3RoIC09IDg7Ci0KLQl9Ci0JZWxzZSBpZiAoIWJXUEEyICYmIE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpCi0JewotCQlEZWZhdWx0SWR4ID0gR3JvdXBLZXlJbmRleDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR1RLIERlZmF1bHRLZXlJRD0lZCBcbiIsIERlZmF1bHRJZHgpKTsKLQl9Ci0KLQkvLyBTYW5pdHkgY2hlY2sgLSBzaGFyZWQga2V5IGluZGV4IG11c3QgYmUgMSB+IDMKLQlpZiAoRGVmYXVsdElkeCA8IDEgfHwgRGVmYXVsdElkeCA+IDMpCi0gICAgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVSUk9SOiBHVEsgS2V5IGluZGV4KCVkKSBpcyBpbnZhbGlkIGluICVzICVzIFxuIiwgRGVmYXVsdElkeCwgKChiV1BBMikgPyAiV1BBMiIgOiAiV1BBIiksIEdldEVhcG9sTXNnVHlwZShNc2dUeXBlKSkpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJUENJUEhFUl9LRVkgcFNoYXJlZEtleTsKLQotCQkvLyBzZXQga2V5IG1hdGVyaWFsLCBUeE1pYyBhbmQgUnhNaWMKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuR1RLLCBwTXlLZXlEYXRhLCAzMik7Ci0JCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IERlZmF1bHRJZHg7Ci0KLQkJcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdOwotCi0JCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQkJTmRpc1plcm9NZW1vcnkocFNoYXJlZEtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgcEFkLT5TdGFDZmcuR1RLLCBMRU5fVEtJUF9FSyk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQkJTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+VHhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMjRdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZwotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKLQkJCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLQotCQkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPkNpcGhlckFsZywKLQkJCQkJCQkgIHBTaGFyZWRLZXktPktleSwKLQkJCQkJCQkgIHBTaGFyZWRLZXktPlR4TWljLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+UnhNaWMpOwotCi0JCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkJICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCi0JCQkJCQkJCSAgTlVMTCk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQ29uc3RydWN0IEVBUG9MIG1lc3NhZ2UgZm9yIFdQQSBoYW5kc2hha2luZwotCQlJdHMgZm9ybWF0IGlzIGJlbG93LAotCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBQcm90b2NvbCBWZXJzaW9uCSB8ICAxIG9jdGV0Ci0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBQcm90b2NvbCBUeXBlCQkgfAkxIG9jdGV0Ci0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBCb2R5IExlbmd0aAkJIHwgIDIgb2N0ZXRzCi0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBEZXNjcmlwdG9yIFR5cGUJIHwJMSBvY3RldAotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IEluZm9ybWF0aW9uICAgIHwJMiBvY3RldHMKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEtleSBMZW5ndGgJICAgICB8ICAxIG9jdGV0Ci0JCSstLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQkJfCBLZXkgUmVwYWx5IENvdW50ZXIgfAk4IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IE5vbmNlCQkgICAgIHwgIDMyIG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IElWCQkJIHwgIDE2IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IFJTQwkJCSB8ICA4IG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IElEIG9yIFJlc2VydmVkIHwJOCBvY3RldHMKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEtleSBNSUMJCQkgfAkxNiBvY3RldHMKLQkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCQl8IEtleSBEYXRhIExlbmd0aAkgfAkyIG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0JCXwgS2V5IERhdGEJCQkgfAluIG9jdGV0cwotCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJUG9pbnRlcgl0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKLQlJTglQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTglVQ0hBUgkJCQlHcm91cEtleVdlcFN0YXR1cywKLSAgICBJTglVQ0hBUgkJCQlNc2dUeXBlLAotICAgIElOCVVDSEFSCQkJCURlZmF1bHRLZXlJZHgsCi0JSU4JVUNIQVIJCQkJKktleU5vbmNlLAotCUlOCVVDSEFSCQkJCSpUeFJTQywKLQlJTglVQ0hBUgkJCQkqR1RLLAotCUlOCVVDSEFSCQkJCSpSU05JRSwKLQlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCi0gICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZykKLXsKLQlCT09MRUFOCWJXUEEyID0gRkFMU0U7Ci0JVUNIQVIJS2V5RGVzY1ZlcjsKLQotCS8vIENob29zZSBXUEEyIG9yIG5vdAotCWlmICgocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotCQkocEVudHJ5LT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJYldQQTIgPSBUUlVFOwotCi0gICAgLy8gSW5pdCBQYWNrZXQgYW5kIEZpbGwgaGVhZGVyCi0gICAgcE1zZy0+UHJvVmVyID0gRUFQT0xfVkVSOwotICAgIHBNc2ctPlByb1R5cGUgPSBFQVBPTEtleTsKLQotCS8vIERlZmF1bHQgOTUgYnl0ZXMsIHRoZSBFQVBvTC1LZXkgZGVzY3JpcHRvciBleGNsdWRlIEtleS1kYXRhIGZpZWxkCi0JU0VUX1VJTlQxNl9UT19BUlJBUlkocE1zZy0+Qm9keV9MZW4sIExFTl9FQVBPTF9LRVlfTVNHKTsKLQotCS8vIEZpbGwgaW4gRUFQb0wgZGVzY3JpcHRvcgotCWlmIChiV1BBMikKLQkJcE1zZy0+S2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLQllbHNlCi0JCXBNc2ctPktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7Ci0KLQkvLyBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIChiaXRzIDAtMikgc3BlY2lmaWVzIHRoZSBrZXkgZGVzY3JpcHRvciB2ZXJzaW9uIHR5cGUKLQl7Ci0JCS8vIEZpbGwgaW4gS2V5IGluZm9ybWF0aW9uLCByZWZlciB0byBJRUVFIFN0ZCA4MDIuMTFpLTIwMDQgcGFnZSA3OAotCQkvLyBXaGVuIGVpdGhlciB0aGUgcGFpcndpc2Ugb3IgdGhlIGdyb3VwIGNpcGhlciBpcyBBRVMsIHRoZSBERVNDX1RZUEVfQUVTKDIpIHNoYWxsIGJlIHVzZWQuCi0JCUtleURlc2NWZXIgPSAoKChwRW50cnktPldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fAotCQkJCQkoR3JvdXBLZXlXZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7Ci0JfQotCi0JcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleURlc2NWZXIgPSBLZXlEZXNjVmVyOwotCi0JLy8gU3BlY2lmeSBLZXkgVHlwZSBhcyBHcm91cCgwKSBvciBQYWlyd2lzZSgxKQotCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5VHlwZSA9IEdST1VQS0VZOwotCWVsc2UKLQkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleVR5cGUgPSBQQUlSV0lTRUtFWTsKLQotCS8vIFNwZWNpZnkgS2V5IEluZGV4LCBvbmx5IGdyb3VwX21zZzFfV1BBMQotCWlmICghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5SW5kZXggPSBEZWZhdWx0S2V5SWR4OwotCi0JaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMykKLQkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgPSAxOwotCi0JaWYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzEpIHx8IChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKLQkJcE1zZy0+S2V5RGVzYy5LZXlJbmZvLktleUFjayA9IDE7Ci0KLQlpZiAoTXNnVHlwZSAhPSBFQVBPTF9QQUlSX01TR18xKQotCQlwTXNnLT5LZXlEZXNjLktleUluZm8uS2V5TWljID0gMTsKLQotCWlmICgoYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfUEFJUl9NU0dfMykpIHx8Ci0JCSghYldQQTIgJiYgKE1zZ1R5cGUgPj0gRUFQT0xfR1JPVVBfTVNHXzEpKSkKLSAgICB7Ci0JcE1zZy0+S2V5RGVzYy5LZXlJbmZvLlNlY3VyZSA9IDE7Ci0gICAgfQotCi0JaWYgKGJXUEEyICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSB8fAotCQkoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpKQotICAgIHsKLSAgICAgICAgcE1zZy0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCA9IDE7Ci0gICAgfQotCi0JLy8ga2V5IEluZm9ybWF0aW9uIGVsZW1lbnQgaGFzIGRvbmUuCi0JKihVU0hPUlQgKikoJnBNc2ctPktleURlc2MuS2V5SW5mbykgPSBjcHUybGUxNigqKFVTSE9SVCAqKSgmcE1zZy0+S2V5RGVzYy5LZXlJbmZvKSk7Ci0KLQkvLyBGaWxsIGluIEtleSBMZW5ndGgKLQl7Ci0JCWlmIChNc2dUeXBlID49IEVBUE9MX0dST1VQX01TR18xKQotCQl7Ci0JCQkvLyB0aGUgbGVuZ3RoIG9mIGdyb3VwIGtleSBjaXBoZXIKLQkJCXBNc2ctPktleURlc2MuS2V5TGVuZ3RoWzFdID0gKChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSA/IFRLSVBfR1RLX0xFTkdUSCA6IExFTl9BRVNfS0VZKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIHRoZSBsZW5ndGggb2YgcGFpcndpc2Uga2V5IGNpcGhlcgotCQkJcE1zZy0+S2V5RGVzYy5LZXlMZW5ndGhbMV0gPSAoKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpID8gTEVOX1RLSVBfS0VZIDogTEVOX0FFU19LRVkpOwotCQl9Ci0JfQotCi0JLy8gRmlsbCBpbiByZXBsYXkgY291bnRlcgotICAgIE5kaXNNb3ZlTWVtb3J5KHBNc2ctPktleURlc2MuUmVwbGF5Q291bnRlciwgcEVudHJ5LT5SX0NvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gRmlsbCBLZXkgTm9uY2UgZmllbGQKLQkvLyBBTm9uY2UgOiBwYWlyd2lzZV9tc2cxICYgcGFpcndpc2VfbXNnMwotCS8vIFNOb25jZSA6IHBhaXJ3aXNlX21zZzIKLQkvLyBHTm9uY2UgOiBncm91cF9tc2cxX3dwYTEKLQlpZiAoKE1zZ1R5cGUgPD0gRUFQT0xfUEFJUl9NU0dfMykgfHwgKCghYldQQTIgJiYgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKSkpCi0JTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlOb25jZSwgS2V5Tm9uY2UsIExFTl9LRVlfREVTQ19OT05DRSk7Ci0KLQkvLyBGaWxsIGtleSBJViAtIFdQQTIgYXMgMCwgV1BBMSBhcyByYW5kb20KLQlpZiAoIWJXUEEyICYmIChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkKLQl7Ci0JCS8vIFN1Z2dlc3QgSVYgYmUgcmFuZG9tIG51bWJlciBwbHVzIHNvbWUgbnVtYmVyLAotCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleUl2LCAmS2V5Tm9uY2VbMTZdLCBMRU5fS0VZX0RFU0NfSVYpOwotICAgICAgICBwTXNnLT5LZXlEZXNjLktleUl2WzE1XSArPSAyOwotCX0KLQotICAgIC8vIEZpbGwgS2V5IFJTQyBmaWVsZAotICAgIC8vIEl0IGNvbnRhaW5zIHRoZSBSU0MgZm9yIHRoZSBHVEsgYmVpbmcgaW5zdGFsbGVkLgotCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMSkpCi0JewotICAgICAgICBOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleVJzYywgVHhSU0MsIDYpOwotCX0KLQotCS8vIENsZWFyIEtleSBNSUMgZmllbGQgZm9yIE1JQyBjYWxjdWxhdGlvbiBsYXRlcgotICAgIE5kaXNaZXJvTWVtb3J5KHBNc2ctPktleURlc2MuS2V5TWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCUNvbnN0cnVjdEVhcG9sS2V5RGF0YShwRW50cnksCi0JCQkJCQkgIEdyb3VwS2V5V2VwU3RhdHVzLAotCQkJCQkJICBLZXlEZXNjVmVyLAotCQkJCQkJICBNc2dUeXBlLAotCQkJCQkJICBEZWZhdWx0S2V5SWR4LAotCQkJCQkJICBHVEssCi0JCQkJCQkgIFJTTklFLAotCQkJCQkJICBSU05JRV9MZW4sCi0JCQkJCQkgIHBNc2cpOwotCi0JLy8gQ2FsY3VsYXRlIE1JQyBhbmQgZmlsbCBpbiBLZXlNaWMgRmllbGQgZXhjZXB0IFBhaXJ3aXNlIE1zZyAxLgotCWlmIChNc2dUeXBlICE9IEVBUE9MX1BBSVJfTVNHXzEpCi0JewotCQlDYWxjdWxhdGVNSUMoS2V5RGVzY1ZlciwgcEVudHJ5LT5QVEssIHBNc2cpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gQ29uc3RydWN0RWFwb2xNc2cgZm9yICVzICVzXG4iLCAoKGJXUEEyKSA/ICJXUEEyIiA6ICJXUEEiKSwgR2V0RWFwb2xNc2dUeXBlKE1zZ1R5cGUpKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiCSAgICAgQm9keSBsZW5ndGggPSAlZCBcbiIsIENPTlZfQVJSQVJZX1RPX1VJTlQxNihwTXNnLT5Cb2R5X0xlbikpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIJICAgICBLZXkgbGVuZ3RoICA9ICVkIFxuIiwgQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPktleURlc2MuS2V5TGVuZ3RoKSkpOwotCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNvbnN0cnVjdCB0aGUgS2V5IERhdGEgZmllbGQgb2YgRUFQb0wgbWVzc2FnZQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQlQb2ludGVyCXRvIG91ciBhZGFwdGVyCi0JCUVsZW0JCU1lc3NhZ2UgYm9keQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlDb25zdHJ1Y3RFYXBvbEtleURhdGEoCi0JSU4JUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4JVUNIQVIJCQlHcm91cEtleVdlcFN0YXR1cywKLQlJTglVQ0hBUgkJCWtleURlc2NWZXIsCi0JSU4JVUNIQVIJCQlNc2dUeXBlLAotCUlOCVVDSEFSCQkJRGVmYXVsdEtleUlkeCwKLQlJTglVQ0hBUgkJCSpHVEssCi0JSU4JVUNIQVIJCQkqUlNOSUUsCi0JSU4JVUNIQVIJCQlSU05JRV9MRU4sCi0JT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQotewotCVVDSEFSCQkqbXBvb2wsICpLZXlfRGF0YSwgKlJjNEdUSzsKLQlVQ0hBUiAgICAgICBla2V5WyhMRU5fS0VZX0RFU0NfSVYrTEVOX0VBUF9FSyldOwotCVVMT05HCQlkYXRhX29mZnNldDsKLQlCT09MRUFOCQliV1BBMkNhcGFibGUgPSBGQUxTRTsKLQlQUlRNUF9BREFQVEVSCXBBZCA9IHBFbnRyeS0+cEFkOwotCUJPT0xFQU4JCUdUS19JbmNsdWRlZCA9IEZBTFNFOwotCi0JLy8gQ2hvb3NlIFdQQTIgb3Igbm90Ci0JaWYgKChwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCShwRW50cnktPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQliV1BBMkNhcGFibGUgPSBUUlVFOwotCi0JaWYgKE1zZ1R5cGUgPT0gRUFQT0xfUEFJUl9NU0dfMSB8fAotCQlNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzQgfHwKLQkJTXNnVHlwZSA9PSBFQVBPTF9HUk9VUF9NU0dfMikKLQkJcmV0dXJuOwotCi0JLy8gYWxsb2NhdGUgbWVtb3J5IHBvb2wKLQlvc19hbGxvY19tZW0oTlVMTCwgKFBVQ0hBUiAqKSZtcG9vbCwgMTUwMCk7Ci0KLSAgICBpZiAobXBvb2wgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogUmM0R1RLIExlbiA9IDUxMiAqLwotCVJjNEdUSyA9IChVQ0hBUiAqKSBST1VORF9VUChtcG9vbCwgNCk7Ci0JLyogS2V5X0RhdGEgTGVuID0gNTEyICovCi0JS2V5X0RhdGEgPSAoVUNIQVIgKikgUk9VTkRfVVAoUmM0R1RLICsgNTEyLCA0KTsKLQotCU5kaXNaZXJvTWVtb3J5KEtleV9EYXRhLCA1MTIpOwotCVNFVF9VSU5UMTZfVE9fQVJSQVJZKHBNc2ctPktleURlc2MuS2V5RGF0YUxlbiwgMCk7Ci0JZGF0YV9vZmZzZXQgPSAwOwotCi0JLy8gRW5jYXBzdWxhdGUgUlNOSUUgaW4gcGFpcndpc2VfbXNnMiAmIHBhaXJ3aXNlX21zZzMKLQlpZiAoUlNOSUVfTEVOICYmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18yKSB8fCAoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zKSkpCi0JewotCQlQVUlOVDgJcG1raWRfcHRyID0gTlVMTDsKLQkJVUlOVDgJcG1raWRfbGVuID0gMDsKLQotCi0JCVJUTVBJbnNlcnRSU05JRSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLAotCQkJCQkJKFBVTE9ORykmZGF0YV9vZmZzZXQsCi0JCQkJCQlSU05JRSwKLQkJCQkJCVJTTklFX0xFTiwKLQkJCQkJCXBta2lkX3B0ciwKLQkJCQkJCXBta2lkX2xlbik7Ci0JfQotCi0KLQkvLyBFbmNhcHN1bGF0ZSBLREUgZm9ybWF0IGluIHBhaXJ3aXNlX21zZzNfV1BBMiAmIGdyb3VwX21zZzFfV1BBMgotCWlmIChiV1BBMkNhcGFibGUgJiYgKChNc2dUeXBlID09IEVBUE9MX1BBSVJfTVNHXzMpIHx8IChNc2dUeXBlID09IEVBUE9MX0dST1VQX01TR18xKSkpCi0JewotCQkvLyBLZXkgRGF0YSBFbmNhcHN1bGF0aW9uIChLREUpIGZvcm1hdCAtIDgwMi4xMWktMjAwNCAgRmlndXJlLTQzdyBhbmQgVGFibGUtMjBoCi0gICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMF0gPSAweEREOwotCi0JCWlmIChHcm91cEtleVdlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQl7Ci0JCQlLZXlfRGF0YVtkYXRhX29mZnNldCArIDFdID0gMHgxNjsvLyA0KzIrMTYoT1VJK0RhdGFUeXBlK0RhdGFGaWVsZCkKLQkJfQotCQllbHNlCi0JCXsKLQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgMV0gPSAweDI2Oy8vIDQrMiszMihPVUkrRGF0YVR5cGUrRGF0YUZpZWxkKQotCQl9Ci0KLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyAyXSA9IDB4MDA7Ci0gICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgM10gPSAweDBGOwotICAgICAgICBLZXlfRGF0YVtkYXRhX29mZnNldCArIDRdID0gMHhBQzsKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA1XSA9IDB4MDE7Ci0KLQkJLy8gR1RLIEtERSBmb3JtYXQgLSA4MDIuMTFpLTIwMDQgIEZpZ3VyZS00M3gKLSAgICAgICAgS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyA2XSA9IChEZWZhdWx0S2V5SWR4ICYgMHgwMyk7Ci0gICAgICAgIEtleV9EYXRhW2RhdGFfb2Zmc2V0ICsgN10gPSAweDAwOwkvLyBSZXNlcnZlZCBCeXRlCi0KLQkJZGF0YV9vZmZzZXQgKz0gODsKLQl9Ci0KLQotCS8vIEVuY2Fwc3VsYXRlIEdUSwotCS8vIE9ubHkgZm9yIHBhaXJ3aXNlX21zZzNfV1BBMiBhbmQgZ3JvdXBfbXNnMQotCWlmICgoTXNnVHlwZSA9PSBFQVBPTF9QQUlSX01TR18zICYmIGJXUEEyQ2FwYWJsZSkgfHwgKE1zZ1R5cGUgPT0gRUFQT0xfR1JPVVBfTVNHXzEpKQotCXsKLQkJLy8gRmlsbCBpbiBHVEsKLQkJaWYgKEdyb3VwS2V5V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZLZXlfRGF0YVtkYXRhX29mZnNldF0sIEdUSywgTEVOX0FFU19LRVkpOwotCQkJZGF0YV9vZmZzZXQgKz0gTEVOX0FFU19LRVk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmS2V5X0RhdGFbZGF0YV9vZmZzZXRdLCBHVEssIFRLSVBfR1RLX0xFTkdUSCk7Ci0JCQlkYXRhX29mZnNldCArPSBUS0lQX0dUS19MRU5HVEg7Ci0JCX0KLQotCQlHVEtfSW5jbHVkZWQgPSBUUlVFOwotCX0KLQotCi0JLy8gVGhpcyB3aG9sZSBrZXktZGF0YSBmaWVsZCBzaGFsbCBiZSBlbmNyeXB0ZWQgaWYgYSBHVEsgaXMgaW5jbHVkZWQuCi0JLy8gRW5jcnlwdCB0aGUgZGF0YSBtYXRlcmlhbCBpbiBrZXkgZGF0YSBmaWVsZCB3aXRoIEtFSwotCWlmIChHVEtfSW5jbHVkZWQpCi0JewotCQkvL2hleF9kdW1wKCJHVEtfSW5jbHVkZWQiLCBLZXlfRGF0YSwgZGF0YV9vZmZzZXQpOwotCi0JCWlmICgKLQkJCShrZXlEZXNjVmVyID09IERFU0NfVFlQRV9BRVMpKQotCQl7Ci0JCQlVQ0hBUglyZW1haW5kZXIgPSAwOwotCQkJVUNIQVIJcGFkX2xlbiA9IDA7Ci0KLQkJCS8vIEtleSBEZXNjcmlwdG9yIFZlcnNpb24gMiBvciAzOiBBRVMga2V5IHdyYXAsIGRlZmluZWQgaW4gSUVURiBSRkMgMzM5NCwKLQkJCS8vIHNoYWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgS2V5IERhdGEgZmllbGQgdXNpbmcgdGhlIEtFSyBmaWVsZCBmcm9tCi0JCQkvLyB0aGUgZGVyaXZlZCBQVEsuCi0KLQkJCS8vIElmIHRoZSBLZXkgRGF0YSBmaWVsZCB1c2VzIHRoZSBOSVNUIEFFUyBrZXkgd3JhcCwgdGhlbiB0aGUgS2V5IERhdGEgZmllbGQKLQkJCS8vIHNoYWxsIGJlIHBhZGRlZCBiZWZvcmUgZW5jcnlwdGluZyBpZiB0aGUga2V5IGRhdGEgbGVuZ3RoIGlzIGxlc3MgdGhhbiAxNgotCQkJLy8gb2N0ZXRzIG9yIGlmIGl0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIFRoZSBwYWRkaW5nIGNvbnNpc3RzIG9mIGFwcGVuZGluZwotCQkJLy8gYSBzaW5nbGUgb2N0ZXQgMHhkZCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgMHgwMCBvY3RldHMuCi0JCQlpZiAoKHJlbWFpbmRlciA9IGRhdGFfb2Zmc2V0ICYgMHgwNykgIT0gMCkKLQkJCXsKLQkJCQlJTlQJCWk7Ci0KLQkJCQlwYWRfbGVuID0gKDggLSByZW1haW5kZXIpOwotCQkJCUtleV9EYXRhW2RhdGFfb2Zmc2V0XSA9IDB4REQ7Ci0JCQkJZm9yIChpID0gMTsgaSA8IHBhZF9sZW47IGkrKykKLQkJCQkJS2V5X0RhdGFbZGF0YV9vZmZzZXQgKyBpXSA9IDA7Ci0KLQkJCQlkYXRhX29mZnNldCArPSBwYWRfbGVuOwotCQkJfQotCi0JCQlBRVNfR1RLX0tFWV9XUkFQKCZwRW50cnktPlBUS1sxNl0sIEtleV9EYXRhLCBkYXRhX29mZnNldCwgUmM0R1RLKTsKLSAgICAgICAgICAgIC8vIEFFUyB3cmFwIGZ1bmN0aW9uIHdpbGwgZ3JvdyA4IGJ5dGVzIGluIGxlbmd0aAotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qCUtleSBEZXNjcmlwdG9yIFZlcnNpb24gMTogQVJDNCBpcyB1c2VkIHRvIGVuY3J5cHQgdGhlIEtleSBEYXRhIGZpZWxkCi0JCQkJdXNpbmcgdGhlIEtFSyBmaWVsZCBmcm9tIHRoZSBkZXJpdmVkIFBUSy4gKi8KLQotCQkJLy8gUFJFUEFSRSBFbmNyeXB0ZWQgICJLZXkgREFUQSIgZmllbGQuICAoRW5jcnlwdCBHVEsgd2l0aCBSQzQsIHVzaW5mIFBUS1sxNl0tPlszMV0gYXMgS2V5LCBJVi1maWVsZCBhcyBJVikKLQkJCS8vIHB1dCBUeFRzYyBpbiBLZXkgUlNDIGZpZWxkCi0JCQlwQWQtPlByaXZhdGVJbmZvLkZDU0NSQzMyID0gUFBQSU5JVEZDUzMyOyAgIC8vSW5pdCBjcmMzMi4KLQotCQkJLy8gZWtleSBpcyB0aGUgY29udGFuZXRpb24gb2YgSVYtZmllbGQsIGFuZCBQVEtbMTZdLT5QVEtbMzFdCi0JCQlOZGlzTW92ZU1lbW9yeShla2V5LCBwTXNnLT5LZXlEZXNjLktleUl2LCBMRU5fS0VZX0RFU0NfSVYpOwotCQkJTmRpc01vdmVNZW1vcnkoJmVrZXlbTEVOX0tFWV9ERVNDX0lWXSwgJnBFbnRyeS0+UFRLWzE2XSwgTEVOX0VBUF9FSyk7Ci0JCQlBUkNGT1VSX0lOSVQoJnBBZC0+UHJpdmF0ZUluZm8uV0VQQ09OVEVYVCwgZWtleSwgc2l6ZW9mKGVrZXkpKTsgIC8vSU5JVCBTQk9YLCBLRVlMRU4rMyhJVikKLQkJCXBBZC0+UHJpdmF0ZUluZm8uRkNTQ1JDMzIgPSBSVE1QX0NBTENfRkNTMzIocEFkLT5Qcml2YXRlSW5mby5GQ1NDUkMzMiwgS2V5X0RhdGEsIGRhdGFfb2Zmc2V0KTsKLQkJCVdQQUFSQ0ZPVVJfRU5DUllQVCgmcEFkLT5Qcml2YXRlSW5mby5XRVBDT05URVhULCBSYzRHVEssIEtleV9EYXRhLCBkYXRhX29mZnNldCk7Ci0JCX0KLQotCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIFJjNEdUSywgZGF0YV9vZmZzZXQpOwotCX0KLQllbHNlCi0JewotCQlOZGlzTW92ZU1lbW9yeShwTXNnLT5LZXlEZXNjLktleURhdGEsIEtleV9EYXRhLCBkYXRhX29mZnNldCk7Ci0JfQotCi0JLy8gVXBkYXRlIGtleSBkYXRhIGxlbmd0aCBmaWVsZCBhbmQgdG90YWwgYm9keSBsZW5ndGgKLQlTRVRfVUlOVDE2X1RPX0FSUkFSWShwTXNnLT5LZXlEZXNjLktleURhdGFMZW4sIGRhdGFfb2Zmc2V0KTsKLQlJTkNfVUlOVDE2X1RPX0FSUkFSWShwTXNnLT5Cb2R5X0xlbiwgZGF0YV9vZmZzZXQpOwotCi0Jb3NfZnJlZV9tZW0oTlVMTCwgbXBvb2wpOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDYWxjYXVsYXRlIE1JQy4gSXQgaXMgdXNlZCBkdXJpbmcgNC13YXlzIGhhbmRzaGFya2luZy4KLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCS0JcG9pbnRlciB0byBvdXIgcEFkYXB0ZXIgY29udGV4dAotCVBlZXJXZXBTdGF0dXMJLQlpbmRpY2F0ZSB0aGUgZW5jcnlwdGlvbiB0eXBlCi0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFZPSUQJQ2FsY3VsYXRlTUlDKAotCUlOCVVDSEFSCQkJS2V5RGVzY1ZlciwKLQlJTglVQ0hBUgkJCSpQVEssCi0JT1VUIFBFQVBPTF9QQUNLRVQgICBwTXNnKQotewotICAgIFVDSEFSICAgKk91dEJ1ZmZlcjsKLQlVTE9ORwlGcmFtZUxlbiA9IDA7Ci0JVUNIQVIJbWljW0xFTl9LRVlfREVTQ19NSUNdOwotCVVDSEFSCWRpZ2VzdFs4MF07Ci0KLQkvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1JQyBjYWxjdWxhdGlvbgotCW9zX2FsbG9jX21lbShOVUxMLCAoUFVDSEFSICopJk91dEJ1ZmZlciwgNTEyKTsKLQotICAgIGlmIChPdXRCdWZmZXIgPT0gTlVMTCkKLSAgICB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiEhIUNhbGN1bGF0ZU1JQzogbm8gbWVtb3J5ISEhXG4iKSk7Ci0JCXJldHVybjsKLSAgICB9Ci0KLQkvLyBtYWtlIGEgZnJhbWUgZm9yIGNhbGN1bGF0aW5nIE1JQy4KLSAgICBNYWtlT3V0Z29pbmdGcmFtZShPdXRCdWZmZXIsCQkmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KHBNc2ctPkJvZHlfTGVuKSArIDQsCXBNc2csCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotCi0JTmRpc1plcm9NZW1vcnkobWljLCBzaXplb2YobWljKSk7Ci0KLQkvLyBDYWxjdWxhdGUgTUlDCi0gICAgaWYgKEtleURlc2NWZXIgPT0gREVTQ19UWVBFX0FFUykKLQl7Ci0JCUhNQUNfU0hBMShQVEssIExFTl9FQVBfTUlDSywgT3V0QnVmZmVyLCAgRnJhbWVMZW4sIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KG1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJSE1BQ19NRDUoUFRLLCAgTEVOX0VBUF9NSUNLLCBPdXRCdWZmZXIsIEZyYW1lTGVuLCBtaWMsIE1ENV9ESUdFU1RfU0laRSk7Ci0JfQotCi0JLy8gc3RvcmUgdGhlIGNhbGN1bGF0ZWQgTUlDCi0JTmRpc01vdmVNZW1vcnkocE1zZy0+S2V5RGVzYy5LZXlNaWMsIG1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0KLQlvc19mcmVlX21lbShOVUxMLCBPdXRCdWZmZXIpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU29tZSByZWNlaXZlZCBmcmFtZXMgY2FuJ3QgZGVjcnlwdCBieSBBc2ljLCBzbyBkZWNyeXB0IHRoZW0gYnkgc29mdHdhcmUuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQktCXBvaW50ZXIgdG8gb3VyIHBBZGFwdGVyIGNvbnRleHQKLQlQZWVyV2VwU3RhdHVzCS0JaW5kaWNhdGUgdGhlIGVuY3J5cHRpb24gdHlwZQotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTCQktCWRlY3J5cHRpb24gc3VjY2Vzc2Z1bAotCQlORElTX1NUQVRVU19GQUlMVVJFCQktCWRlY3J5cHRpb24gZmFpbHVyZQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUFNvZnREZWNyeXB0QnJvYWRDYXN0RGF0YSgKLQlJTglQUlRNUF9BREFQVEVSCQkJCQlwQWQsCi0JSU4JUlhfQkxLCQkJCQkJCSpwUnhCbGssCi0JSU4gIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyLAotCUlOICBQQ0lQSEVSX0tFWQkJCQkJCXBTaGFyZF9rZXkpCi17Ci0JUFJYV0lfU1RSVUMJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0KLQotCi0JLy8gaGFuZGxlIFdFUCBkZWNyeXB0aW9uCi0JaWYgKEdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCi0gICAgewotCQlpZiAoUlRNUFNvZnREZWNyeXB0V0VQKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgcFNoYXJkX2tleSkpCi0JCXsKLQotCQkJLy9NaW51cyBJVls0XSAmIElDVls0XQotCQkJcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCAtPSA4OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBTb2Z0d2FyZSBkZWNyeXB0IFdFUCBkYXRhIGZhaWxzLlxuIikpOwotCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJfQotCX0KLQkvLyBoYW5kbGUgVEtJUCBkZWNyeXB0aW9uCi0JZWxzZSBpZiAoR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQl7Ci0JCWlmIChSVE1QU29mdERlY3J5cHRUS0lQKHBBZCwgcFJ4QmxrLT5wRGF0YSwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCwgMCwgcFNoYXJkX2tleSkpCi0JCXsKLQotCQkJLy9NaW51cyA4IGJ5dGVzIE1JQywgOCBieXRlcyBJVi9FSVYsIDQgYnl0ZXMgSUNWCi0JCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDIwOwotCQl9Ci0gICAgICAgIGVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRUS0lQIEZhaWxlZFxuIikpOwotCQkJLy8gZ2l2ZSB1cCB0aGlzIGZyYW1lCi0JCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLSAgICAgICAgfQotCX0KLQkvLyBoYW5kbGUgQUVTIGRlY3J5cHRpb24KLQllbHNlIGlmIChHcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJaWYgKFJUTVBTb2Z0RGVjcnlwdEFFUyhwQWQsIHBSeEJsay0+cERhdGEsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgLCBwU2hhcmRfa2V5KSkKLQkJewotCi0JCQkvLzggYnl0ZXMgTUlDLCA4IGJ5dGVzIElWL0VJViAoQ0NNUCBIZWFkZXIpCi0JCQlwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IC09IDE2OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiRVJST1IgOiBSVE1QU29mdERlY3J5cHRBRVMgRmFpbGVkXG4iKSk7Ci0JCQkvLyBnaXZlIHVwIHRoaXMgZnJhbWUKLQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIGdpdmUgdXAgdGhpcyBmcmFtZQotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQotfQotCi0KLVBVSU5UOAlHZXRTdWl0ZUZyb21SU05JRSgKLQkJSU4JUFVJTlQ4CXJzbmllLAotCQlJTglVSU5UCXJzbmllX2xlbiwKLQkJSU4JVUlOVDgJdHlwZSwKLQkJT1VUCVVJTlQ4CSpjb3VudCkKLXsKLQlQRUlEX1NUUlVDVCBwRWlkOwotCUlOVAkJCWxlbjsKLQlQVUlOVDgJCXBCdWY7Ci0JSU5UCQkJb2Zmc2V0ID0gMDsKLQlQUlNOSUVfQVVUSAlwQWttOwotCVVJTlQxNgkJYWNvdW50OwotCUJPT0xFQU4JCWlzV1BBMiA9IEZBTFNFOwotCi0JcEVpZCA9IChQRUlEX1NUUlVDVClyc25pZTsKLQlsZW4gPSByc25pZV9sZW4gLSAyOwkvLyBleGNsdWRlIElFIGFuZCBsZW5ndGgKLQlwQnVmID0gKFBVSU5UOCkmcEVpZC0+T2N0ZXRbMF07Ci0KLQotCi0JLy8gc2V0IGRlZmF1bHQgdmFsdWUKLQkqY291bnQgPSAwOwotCi0JLy8gQ2hlY2sgbGVuZ3RoCi0JaWYgKChsZW4gPD0gMCkgfHwgKHBFaWQtPkxlbiAhPSBsZW4pKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIGludmFsaWRcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvLyBDaGVjayBXUEEgb3IgV1BBMgotCWlmIChwRWlkLT5FaWQgPT0gSUVfV1BBKQotCXsKLQkJUFJTTklFCXBSc25pZSA9IChQUlNOSUUpcEJ1ZjsKLQkJVUlOVDE2IHVjb3VudDsKLQotCQlpZiAobGVuIDwgc2l6ZW9mKFJTTklFKSkKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgbGVuZ3RoIGlzIHRvbyBzaG9ydCBmb3IgV1BBXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIKLQkJdWNvdW50ID0gY3B1MmxlMTYocFJzbmllLT51Y291bnQpOwotCQlpZiAodWNvdW50ID4gMikKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLAotCQkJCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHVjb3VudCkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGdyb3VwIGNpcGhlcgotCQlpZiAodHlwZSA9PSBHUk9VUF9TVUlURSkKLQkJewotCQkJKmNvdW50ID0gMTsKLQkJCXJldHVybiBwUnNuaWUtPm1jYXN0OwotCQl9Ci0JCS8vIEdldCB0aGUgcGFpcndpc2UgY2lwaGVyIHN1aXRlCi0JCWVsc2UgaWYgKHR5cGUgPT0gUEFJUldJU0VfU1VJVEUpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogVGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciBpcyAlZFxuIiwKLQkJCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHVjb3VudCkpOwotCQkJKmNvdW50ID0gdWNvdW50OwotCQkJcmV0dXJuIHBSc25pZS0+dWNhc3RbMF0ub3VpOwotCQl9Ci0KLQkJb2Zmc2V0ID0gc2l6ZW9mKFJTTklFKSArICg0ICogKHVjb3VudCAtIDEpKTsKLQotCX0KLQllbHNlIGlmIChwRWlkLT5FaWQgPT0gSUVfUlNOKQotCXsKLQkJUFJTTklFMglwUnNuaWUgPSAoUFJTTklFMilwQnVmOwotCQlVSU5UMTYgdWNvdW50OwotCi0JCWlzV1BBMiA9IFRSVUU7Ci0KLQkJaWYgKGxlbiA8IHNpemVvZihSU05JRTIpKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCIlcyA6IFRoZSBsZW5ndGggaXMgdG9vIHNob3J0IGZvciBXUEEyXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSBjb3VudCBvZiBwYWlyd2lzZSBjaXBoZXIKLQkJdWNvdW50ID0gY3B1MmxlMTYocFJzbmllLT51Y291bnQpOwotCQlpZiAodWNvdW50ID4gMikKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiJXMgOiBUaGUgY291bnQoJWQpIG9mIHBhaXJ3aXNlIGNpcGhlciBpcyBpbnZsYWlkXG4iLAotCQkJCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHVjb3VudCkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQotCQkvLyBHZXQgdGhlIGdyb3VwIGNpcGhlcgotCQlpZiAodHlwZSA9PSBHUk9VUF9TVUlURSkKLQkJewotCQkJKmNvdW50ID0gMTsKLQkJCXJldHVybiBwUnNuaWUtPm1jYXN0OwotCQl9Ci0JCS8vIEdldCB0aGUgcGFpcndpc2UgY2lwaGVyIHN1aXRlCi0JCWVsc2UgaWYgKHR5cGUgPT0gUEFJUldJU0VfU1VJVEUpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogVGhlIGNvdW50IG9mIHBhaXJ3aXNlIGNpcGhlciBpcyAlZFxuIiwKLQkJCQkJCQkJCQlfX0ZVTkNUSU9OX18sIHVjb3VudCkpOwotCQkJKmNvdW50ID0gdWNvdW50OwotCQkJcmV0dXJuIHBSc25pZS0+dWNhc3RbMF0ub3VpOwotCQl9Ci0KLQkJb2Zmc2V0ID0gc2l6ZW9mKFJTTklFMikgKyAoNCAqICh1Y291bnQgLSAxKSk7Ci0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiJXMgOiBVbmtub3duIElFICglZClcbiIsIF9fRlVOQ1RJT05fXywgcEVpZC0+RWlkKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8vIHNraXAgZ3JvdXAgY2lwaGVyIGFuZCBwYWlyd2lzZSBjaXBoZXIgc3VpdGUKLQlwQnVmICs9IG9mZnNldDsKLQlsZW4gLT0gb2Zmc2V0OwotCi0JaWYgKGxlbiA8IHNpemVvZihSU05JRV9BVVRIKSkKLQl7Ci0JCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGxlbmd0aCBvZiBSU05JRSBpcyB0b28gc2hvcnRcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvLyBwb2ludGVyIHRvIEFLTSBjb3VudAotCXBBa20gPSAoUFJTTklFX0FVVEgpcEJ1ZjsKLQotCS8vIEdldCB0aGUgY291bnQgb2YgcGFpcndpc2UgY2lwaGVyCi0JYWNvdW50ID0gY3B1MmxlMTYocEFrbS0+YWNvdW50KTsKLQlpZiAoYWNvdW50ID4gMikKLQl7Ci0JCURCR1BSSU5UX0VSUigoIiVzIDogVGhlIGNvdW50KCVkKSBvZiBBS00gaXMgaW52bGFpZFxuIiwKLQkJCQkJCQkJCQlfX0ZVTkNUSU9OX18sIGFjb3VudCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvLyBHZXQgdGhlIEFLTSBzdWl0ZQotCWlmICh0eXBlID09IEFLTV9TVUlURSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogVGhlIGNvdW50IG9mIEFLTSBpcyAlZFxuIiwKLQkJCQkJCQkJCV9fRlVOQ1RJT05fXywgYWNvdW50KSk7Ci0JCSpjb3VudCA9IGFjb3VudDsKLQkJcmV0dXJuIHBBa20tPmF1dGhbMF0ub3VpOwotCX0KLQlvZmZzZXQgPSBzaXplb2YoUlNOSUVfQVVUSCkgKyAoNCAqIChhY291bnQgLSAxKSk7Ci0KLQlwQnVmICs9IG9mZnNldDsKLQlsZW4gLT0gb2Zmc2V0OwotCi0JLy8gVGhlIHJlbWFpbmluZyBsZW5ndGggbXVzdCBsYXJnZXIgdGhhbiAoUlNOLUNhcGFiaWxpdHkoMikgKyBQTUtJRC1Db3VudCgyKSArIFBNS0lEKDE2fikpCi0JaWYgKGxlbiA+PSAoc2l6ZW9mKFJTTl9DQVBBQklMSVRJRVMpICsgMiArIExFTl9QTUtJRCkpCi0JewotCQkvLyBTa2lwIFJTTiBjYXBhYmlsaXR5IGFuZCBQTUtJRC1Db3VudAotCQlwQnVmICs9IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyKTsKLQkJbGVuIC09IChzaXplb2YoUlNOX0NBUEFCSUxJVElFUykgKyAyKTsKLQotCQkvLyBHZXQgUE1LSUQKLQkJaWYgKHR5cGUgPT0gUE1LSURfTElTVCkKLQkJewotCQkJKmNvdW50ID0gMTsKLQkJCXJldHVybiBwQnVmOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UX0VSUigoIiVzIDogaXQgY2FuJ3QgZ2V0IGFueSBtb3JlIGluZm9ybWF0aW9uIGJleW9uZCBBS00gXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JKmNvdW50ID0gMDsKLQkvL0RCR1BSSU5UX0VSUigoIiVzIDogVGhlIHR5cGUoJWQpIGRvZXNuJ3Qgc3VwcG9ydCBcbiIsIF9fRlVOQ1RJT05fXywgdHlwZSkpOwotCXJldHVybiBOVUxMOwotCi19Ci0KLVZPSUQgV3BhU2hvd0FsbHN1aXRlKAotCUlOCVBVSU5UOAlyc25pZSwKLQlJTglVSU5UCXJzbmllX2xlbikKLXsKLQlQVUlOVDggcFN1aXRlID0gTlVMTDsKLQlVSU5UOCBjb3VudDsKLQotCWhleF9kdW1wKCJSU05JRSIsIHJzbmllLCByc25pZV9sZW4pOwotCi0JLy8gZ3JvdXAgY2lwaGVyCi0JaWYgKChwU3VpdGUgPSBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBHUk9VUF9TVUlURSwgJmNvdW50KSkgIT0gTlVMTCkKLQl7Ci0JCWhleF9kdW1wKCJncm91cCBjaXBoZXIiLCBwU3VpdGUsIDQqY291bnQpOwotCX0KLQotCS8vIHBhaXJ3aXNlIGNpcGhlcgotCWlmICgocFN1aXRlID0gR2V0U3VpdGVGcm9tUlNOSUUocnNuaWUsIHJzbmllX2xlbiwgUEFJUldJU0VfU1VJVEUsICZjb3VudCkpICE9IE5VTEwpCi0JewotCQloZXhfZHVtcCgicGFpcndpc2UgY2lwaGVyIiwgcFN1aXRlLCA0KmNvdW50KTsKLQl9Ci0KLQkvLyBBS00KLQlpZiAoKHBTdWl0ZSA9IEdldFN1aXRlRnJvbVJTTklFKHJzbmllLCByc25pZV9sZW4sIEFLTV9TVUlURSwgJmNvdW50KSkgIT0gTlVMTCkKLQl7Ci0JCWhleF9kdW1wKCJBS00gc3VpdGUiLCBwU3VpdGUsIDQqY291bnQpOwotCX0KLQotCS8vIFBNS0lECi0JaWYgKChwU3VpdGUgPSBHZXRTdWl0ZUZyb21SU05JRShyc25pZSwgcnNuaWVfbGVuLCBQTUtJRF9MSVNULCAmY291bnQpKSAhPSBOVUxMKQotCXsKLQkJaGV4X2R1bXAoIlBNS0lEIiwgcFN1aXRlLCBMRU5fUE1LSUQpOwotCX0KLQotfQotCi1WT0lEIFJUTVBJbnNlcnRSU05JRSgKLQlJTiBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBVSU5UOCByc25pZV9wdHIsCi0JSU4gVUlOVDggIHJzbmllX2xlbiwKLQlJTiBQVUlOVDggcG1raWRfcHRyLAotCUlOIFVJTlQ4ICBwbWtpZF9sZW4pCi17Ci0JUFVDSEFSCXBUbXBCdWY7Ci0JVUxPTkcJVGVtcExlbiA9IDA7Ci0JVUlOVDgJZXh0cmFfbGVuID0gMDsKLQlVSU5UMTYJcG1rX2NvdW50ID0gMDsKLQlVQ0hBUglpZV9udW07Ci0JVUlOVDgJdG90YWxfbGVuID0gMDsKLSAgICBVQ0hBUglXUEEyX09VSVszXT17MHgwMCwweDBGLDB4QUN9OwotCi0JcFRtcEJ1ZiA9IHBGcmFtZUJ1ZjsKLQotCS8qIFBNS0lELUxpc3QgTXVzdCBsYXJnZXIgdGhhbiAwIGFuZCB0aGUgbXVsdGlwbGUgb2YgMTYuICovCi0JaWYgKHBta2lkX2xlbiA+IDAgJiYgKChwbWtpZF9sZW4gJiAweDBmKSA9PSAwKSkKLQl7Ci0JCWV4dHJhX2xlbiA9IHNpemVvZihVSU5UMTYpICsgcG1raWRfbGVuOwotCi0JCXBta19jb3VudCA9IChwbWtpZF9sZW4gPj4gNCk7Ci0JCXBta19jb3VudCA9IGNwdTJsZTE2KHBta19jb3VudCk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiJXMgOiBUaGUgbGVuZ3RoIGlzIFBNS0lELUxpc3QgaXMgaW52YWxpZCAoJWQpLCBzbyBkb24ndCBpbnNlcnQgaXQuXG4iLAotCQkJCQkJCQkJX19GVU5DVElPTl9fLCBwbWtpZF9sZW4pKTsKLQl9Ci0KLQlpZiAocnNuaWVfbGVuICE9IDApCi0JewotCQlpZV9udW0gPSBJRV9XUEE7Ci0JCXRvdGFsX2xlbiA9IHJzbmllX2xlbjsKLQotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KHJzbmllX3B0ciArIDIsIFdQQTJfT1VJLCBzaXplb2YoV1BBMl9PVUkpKSkKLQkJewotCQkJaWVfbnVtID0gSUVfUlNOOwotCQkJdG90YWxfbGVuICs9IGV4dHJhX2xlbjsKLQkJfQotCi0JCS8qIGNvbnN0cnVjdCBSU05JRSBib2R5ICovCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBUbXBCdWYsCQkJJlRlbXBMZW4sCi0JCQkJCQkgIDEsCQkJCSZpZV9udW0sCi0JCQkJCQkgIDEsCQkJCSZ0b3RhbF9sZW4sCi0JCQkJCQkgIHJzbmllX2xlbiwJCXJzbmllX3B0ciwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCi0JCXBUbXBCdWYgKz0gVGVtcExlbjsKLQkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JCWlmIChpZV9udW0gPT0gSUVfUlNOKQotCQl7Ci0JCQkvKiBJbnNlcnQgUE1LSUQtTGlzdCBmaWVsZCAqLwotCQkJaWYgKGV4dHJhX2xlbiA+IDApCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocFRtcEJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJCQkgIDIsCQkJCQkJJnBta19jb3VudCwKLQkJCQkJCQkJICBwbWtpZF9sZW4sCQkJCXBta2lkX3B0ciwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJCQlwVG1wQnVmICs9IFRlbXBMZW47Ci0JCQkJKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfYWVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9hZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMGYxZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9hZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQljcnlwdF9hZXMuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBFZGR5ICAgICAgICAyMDA5LzAxLzE5ICAgICAgQ3JlYXRlIEFFUy0xMjgsIEFFUy0xOTIsIEFFUy0yNTYsIEFFUy1DQkMKLSovCi0KLSNpbmNsdWRlICJjcnlwdF9hZXMuaCIKLQotLyogVGhlIHZhbHVlIGdpdmVuIGJ5IFt4XihpLTEpLHswMH0sezAwfSx7MDB9XSwgd2l0aCB4XihpLTEpIGJlaW5nIHBvd2VycyBvZiB4IGluIHRoZSBmaWVsZCBHRigyXjgpLiAqLwotc3RhdGljIGNvbnN0IFVJTlQzMiBhZXNfcmNvbltdID0gewotCTB4MDAwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsCi0gICAgMHgwODAwMDAwMCwgMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwKLSAgICAweDgwMDAwMDAwLCAweDFCMDAwMDAwLCAweDM2MDAwMDAwfTsKLQotc3RhdGljIGNvbnN0IFVJTlQ4IGFlc19zYm94X2VuY1tdID0gewotICAvKiAgMCAgICAgMSAgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgNiAgICAgNyAgICAgOCAgICAgOSAgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAqLwotICAgIDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcgLDB4YWIsIDB4NzYsIC8qIDAgKi8KLSAgICAweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLCAweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0ICwweDcyLCAweGMwLCAvKiAxICovCi0gICAgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCAsMHgzMSwgMHgxNSwgLyogMiAqLwotICAgIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcgLDB4YjIsIDB4NzUsIC8qIDMgKi8KLSAgICAweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLCAweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzICwweDJmLCAweDg0LCAvKiA0ICovCi0gICAgMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YyAsMHg1OCwgMHhjZiwgLyogNSAqLwotICAgIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MgLDB4OWYsIDB4YTgsIC8qIDYgKi8KLSAgICAweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LCAweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmICwweGYzLCAweGQyLCAvKiA3ICovCi0gICAgMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCAsMHgxOSwgMHg3MywgLyogOCAqLwotICAgIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUgLDB4MGIsIDB4ZGIsIC8qIDkgKi8KLSAgICAweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLCAweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1ICwweGU0LCAweDc5LCAvKiBhICovCi0gICAgMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSAsMHhhZSwgMHgwOCwgLyogYiAqLwotICAgIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQgLDB4OGIsIDB4OGEsIC8qIGMgKi8KLSAgICAweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLCAweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxICwweDFkLCAweDllLCAvKiBkICovCi0gICAgMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSAsMHgyOCwgMHhkZiwgLyogZSAqLwotICAgIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQgLDB4YmIsIDB4MTYsIC8qIGYgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfc2JveF9kZWNbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiLCAvKiAwICovCi0gICAgMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4NywgMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYiwgLyogMSAqLwotICAgIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QsIDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUsIC8qIDIgKi8KLSAgICAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyLCAweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1LCAvKiAzICovCi0gICAgMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNiwgMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MiwgLyogNCAqLwotICAgIDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsIC8qIDUgKi8KLSAgICAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhLCAweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAvKiA2ICovCi0gICAgMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMiwgMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2YiwgLyogNyAqLwotICAgIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMsIC8qIDggKi8KLSAgICAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlLCAvKiA5ICovCi0gICAgMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSwgMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYiwgLyogYSAqLwotICAgIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAsIDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQsIC8qIGIgKi8KLSAgICAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxLCAweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmLCAvKiBjICovCi0gICAgMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCwgMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZiwgLyogZCAqLwotICAgIDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsIC8qIGUgKi8KLSAgICAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2LCAweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkLCAvKiBmICovCi19OwotCi0vKiBBcnJheUluZGV4KnswMn0gKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfbXVsXzJbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBhLCAweDBjLCAweDBlLCAweDEwLCAweDEyLCAweDE0LCAweDE2LCAweDE4LCAweDFhLCAweDFjLCAweDFlLCAvKiAwICovCi0gICAgMHgyMCwgMHgyMiwgMHgyNCwgMHgyNiwgMHgyOCwgMHgyYSwgMHgyYywgMHgyZSwgMHgzMCwgMHgzMiwgMHgzNCwgMHgzNiwgMHgzOCwgMHgzYSwgMHgzYywgMHgzZSwgLyogMSAqLwotICAgIDB4NDAsIDB4NDIsIDB4NDQsIDB4NDYsIDB4NDgsIDB4NGEsIDB4NGMsIDB4NGUsIDB4NTAsIDB4NTIsIDB4NTQsIDB4NTYsIDB4NTgsIDB4NWEsIDB4NWMsIDB4NWUsIC8qIDIgKi8KLSAgICAweDYwLCAweDYyLCAweDY0LCAweDY2LCAweDY4LCAweDZhLCAweDZjLCAweDZlLCAweDcwLCAweDcyLCAweDc0LCAweDc2LCAweDc4LCAweDdhLCAweDdjLCAweDdlLCAvKiAzICovCi0gICAgMHg4MCwgMHg4MiwgMHg4NCwgMHg4NiwgMHg4OCwgMHg4YSwgMHg4YywgMHg4ZSwgMHg5MCwgMHg5MiwgMHg5NCwgMHg5NiwgMHg5OCwgMHg5YSwgMHg5YywgMHg5ZSwgLyogNCAqLwotICAgIDB4YTAsIDB4YTIsIDB4YTQsIDB4YTYsIDB4YTgsIDB4YWEsIDB4YWMsIDB4YWUsIDB4YjAsIDB4YjIsIDB4YjQsIDB4YjYsIDB4YjgsIDB4YmEsIDB4YmMsIDB4YmUsIC8qIDUgKi8KLSAgICAweGMwLCAweGMyLCAweGM0LCAweGM2LCAweGM4LCAweGNhLCAweGNjLCAweGNlLCAweGQwLCAweGQyLCAweGQ0LCAweGQ2LCAweGQ4LCAweGRhLCAweGRjLCAweGRlLCAvKiA2ICovCi0gICAgMHhlMCwgMHhlMiwgMHhlNCwgMHhlNiwgMHhlOCwgMHhlYSwgMHhlYywgMHhlZSwgMHhmMCwgMHhmMiwgMHhmNCwgMHhmNiwgMHhmOCwgMHhmYSwgMHhmYywgMHhmZSwgLyogNyAqLwotICAgIDB4MWIsIDB4MTksIDB4MWYsIDB4MWQsIDB4MTMsIDB4MTEsIDB4MTcsIDB4MTUsIDB4MGIsIDB4MDksIDB4MGYsIDB4MGQsIDB4MDMsIDB4MDEsIDB4MDcsIDB4MDUsIC8qIDggKi8KLSAgICAweDNiLCAweDM5LCAweDNmLCAweDNkLCAweDMzLCAweDMxLCAweDM3LCAweDM1LCAweDJiLCAweDI5LCAweDJmLCAweDJkLCAweDIzLCAweDIxLCAweDI3LCAweDI1LCAvKiA5ICovCi0gICAgMHg1YiwgMHg1OSwgMHg1ZiwgMHg1ZCwgMHg1MywgMHg1MSwgMHg1NywgMHg1NSwgMHg0YiwgMHg0OSwgMHg0ZiwgMHg0ZCwgMHg0MywgMHg0MSwgMHg0NywgMHg0NSwgLyogYSAqLwotICAgIDB4N2IsIDB4NzksIDB4N2YsIDB4N2QsIDB4NzMsIDB4NzEsIDB4NzcsIDB4NzUsIDB4NmIsIDB4NjksIDB4NmYsIDB4NmQsIDB4NjMsIDB4NjEsIDB4NjcsIDB4NjUsIC8qIGIgKi8KLSAgICAweDliLCAweDk5LCAweDlmLCAweDlkLCAweDkzLCAweDkxLCAweDk3LCAweDk1LCAweDhiLCAweDg5LCAweDhmLCAweDhkLCAweDgzLCAweDgxLCAweDg3LCAweDg1LCAvKiBjICovCi0gICAgMHhiYiwgMHhiOSwgMHhiZiwgMHhiZCwgMHhiMywgMHhiMSwgMHhiNywgMHhiNSwgMHhhYiwgMHhhOSwgMHhhZiwgMHhhZCwgMHhhMywgMHhhMSwgMHhhNywgMHhhNSwgLyogZCAqLwotICAgIDB4ZGIsIDB4ZDksIDB4ZGYsIDB4ZGQsIDB4ZDMsIDB4ZDEsIDB4ZDcsIDB4ZDUsIDB4Y2IsIDB4YzksIDB4Y2YsIDB4Y2QsIDB4YzMsIDB4YzEsIDB4YzcsIDB4YzUsIC8qIGUgKi8KLSAgICAweGZiLCAweGY5LCAweGZmLCAweGZkLCAweGYzLCAweGYxLCAweGY3LCAweGY1LCAweGViLCAweGU5LCAweGVmLCAweGVkLCAweGUzLCAweGUxLCAweGU3LCAweGU1LCAvKiBmICovCi19OwotCi0vKiBBcnJheUluZGV4KnswM30gKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfbXVsXzNbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDAwLCAweDAzLCAweDA2LCAweDA1LCAweDBjLCAweDBmLCAweDBhLCAweDA5LCAweDE4LCAweDFiLCAweDFlLCAweDFkLCAweDE0LCAweDE3LCAweDEyLCAweDExLCAvKiAwICovCi0gICAgMHgzMCwgMHgzMywgMHgzNiwgMHgzNSwgMHgzYywgMHgzZiwgMHgzYSwgMHgzOSwgMHgyOCwgMHgyYiwgMHgyZSwgMHgyZCwgMHgyNCwgMHgyNywgMHgyMiwgMHgyMSwgLyogMSAqLwotICAgIDB4NjAsIDB4NjMsIDB4NjYsIDB4NjUsIDB4NmMsIDB4NmYsIDB4NmEsIDB4NjksIDB4NzgsIDB4N2IsIDB4N2UsIDB4N2QsIDB4NzQsIDB4NzcsIDB4NzIsIDB4NzEsIC8qIDIgKi8KLSAgICAweDUwLCAweDUzLCAweDU2LCAweDU1LCAweDVjLCAweDVmLCAweDVhLCAweDU5LCAweDQ4LCAweDRiLCAweDRlLCAweDRkLCAweDQ0LCAweDQ3LCAweDQyLCAweDQxLCAvKiAzICovCi0gICAgMHhjMCwgMHhjMywgMHhjNiwgMHhjNSwgMHhjYywgMHhjZiwgMHhjYSwgMHhjOSwgMHhkOCwgMHhkYiwgMHhkZSwgMHhkZCwgMHhkNCwgMHhkNywgMHhkMiwgMHhkMSwgLyogNCAqLwotICAgIDB4ZjAsIDB4ZjMsIDB4ZjYsIDB4ZjUsIDB4ZmMsIDB4ZmYsIDB4ZmEsIDB4ZjksIDB4ZTgsIDB4ZWIsIDB4ZWUsIDB4ZWQsIDB4ZTQsIDB4ZTcsIDB4ZTIsIDB4ZTEsIC8qIDUgKi8KLSAgICAweGEwLCAweGEzLCAweGE2LCAweGE1LCAweGFjLCAweGFmLCAweGFhLCAweGE5LCAweGI4LCAweGJiLCAweGJlLCAweGJkLCAweGI0LCAweGI3LCAweGIyLCAweGIxLCAvKiA2ICovCi0gICAgMHg5MCwgMHg5MywgMHg5NiwgMHg5NSwgMHg5YywgMHg5ZiwgMHg5YSwgMHg5OSwgMHg4OCwgMHg4YiwgMHg4ZSwgMHg4ZCwgMHg4NCwgMHg4NywgMHg4MiwgMHg4MSwgLyogNyAqLwotICAgIDB4OWIsIDB4OTgsIDB4OWQsIDB4OWUsIDB4OTcsIDB4OTQsIDB4OTEsIDB4OTIsIDB4ODMsIDB4ODAsIDB4ODUsIDB4ODYsIDB4OGYsIDB4OGMsIDB4ODksIDB4OGEsIC8qIDggKi8KLSAgICAweGFiLCAweGE4LCAweGFkLCAweGFlLCAweGE3LCAweGE0LCAweGExLCAweGEyLCAweGIzLCAweGIwLCAweGI1LCAweGI2LCAweGJmLCAweGJjLCAweGI5LCAweGJhLCAvKiA5ICovCi0gICAgMHhmYiwgMHhmOCwgMHhmZCwgMHhmZSwgMHhmNywgMHhmNCwgMHhmMSwgMHhmMiwgMHhlMywgMHhlMCwgMHhlNSwgMHhlNiwgMHhlZiwgMHhlYywgMHhlOSwgMHhlYSwgLyogYSAqLwotICAgIDB4Y2IsIDB4YzgsIDB4Y2QsIDB4Y2UsIDB4YzcsIDB4YzQsIDB4YzEsIDB4YzIsIDB4ZDMsIDB4ZDAsIDB4ZDUsIDB4ZDYsIDB4ZGYsIDB4ZGMsIDB4ZDksIDB4ZGEsIC8qIGIgKi8KLSAgICAweDViLCAweDU4LCAweDVkLCAweDVlLCAweDU3LCAweDU0LCAweDUxLCAweDUyLCAweDQzLCAweDQwLCAweDQ1LCAweDQ2LCAweDRmLCAweDRjLCAweDQ5LCAweDRhLCAvKiBjICovCi0gICAgMHg2YiwgMHg2OCwgMHg2ZCwgMHg2ZSwgMHg2NywgMHg2NCwgMHg2MSwgMHg2MiwgMHg3MywgMHg3MCwgMHg3NSwgMHg3NiwgMHg3ZiwgMHg3YywgMHg3OSwgMHg3YSwgLyogZCAqLwotICAgIDB4M2IsIDB4MzgsIDB4M2QsIDB4M2UsIDB4MzcsIDB4MzQsIDB4MzEsIDB4MzIsIDB4MjMsIDB4MjAsIDB4MjUsIDB4MjYsIDB4MmYsIDB4MmMsIDB4MjksIDB4MmEsIC8qIGUgKi8KLSAgICAweDBiLCAweDA4LCAweDBkLCAweDBlLCAweDA3LCAweDA0LCAweDAxLCAweDAyLCAweDEzLCAweDEwLCAweDE1LCAweDE2LCAweDFmLCAweDFjLCAweDE5LCAweDFhLCAvKiBmICovCi19OwotCi0vKiBBcnJheUluZGV4KnswOX0gKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfbXVsXzlbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDAwLCAweDA5LCAweDEyLCAweDFiLCAweDI0LCAweDJkLCAweDM2LCAweDNmLCAweDQ4LCAweDQxLCAweDVhLCAweDUzLCAweDZjLCAweDY1LCAweDdlLCAweDc3LCAvKiAwICovCi0gICAgMHg5MCwgMHg5OSwgMHg4MiwgMHg4YiwgMHhiNCwgMHhiZCwgMHhhNiwgMHhhZiwgMHhkOCwgMHhkMSwgMHhjYSwgMHhjMywgMHhmYywgMHhmNSwgMHhlZSwgMHhlNywgLyogMSAqLwotICAgIDB4M2IsIDB4MzIsIDB4MjksIDB4MjAsIDB4MWYsIDB4MTYsIDB4MGQsIDB4MDQsIDB4NzMsIDB4N2EsIDB4NjEsIDB4NjgsIDB4NTcsIDB4NWUsIDB4NDUsIDB4NGMsIC8qIDIgKi8KLSAgICAweGFiLCAweGEyLCAweGI5LCAweGIwLCAweDhmLCAweDg2LCAweDlkLCAweDk0LCAweGUzLCAweGVhLCAweGYxLCAweGY4LCAweGM3LCAweGNlLCAweGQ1LCAweGRjLCAvKiAzICovCi0gICAgMHg3NiwgMHg3ZiwgMHg2NCwgMHg2ZCwgMHg1MiwgMHg1YiwgMHg0MCwgMHg0OSwgMHgzZSwgMHgzNywgMHgyYywgMHgyNSwgMHgxYSwgMHgxMywgMHgwOCwgMHgwMSwgLyogNCAqLwotICAgIDB4ZTYsIDB4ZWYsIDB4ZjQsIDB4ZmQsIDB4YzIsIDB4Y2IsIDB4ZDAsIDB4ZDksIDB4YWUsIDB4YTcsIDB4YmMsIDB4YjUsIDB4OGEsIDB4ODMsIDB4OTgsIDB4OTEsIC8qIDUgKi8KLSAgICAweDRkLCAweDQ0LCAweDVmLCAweDU2LCAweDY5LCAweDYwLCAweDdiLCAweDcyLCAweDA1LCAweDBjLCAweDE3LCAweDFlLCAweDIxLCAweDI4LCAweDMzLCAweDNhLCAvKiA2ICovCi0gICAgMHhkZCwgMHhkNCwgMHhjZiwgMHhjNiwgMHhmOSwgMHhmMCwgMHhlYiwgMHhlMiwgMHg5NSwgMHg5YywgMHg4NywgMHg4ZSwgMHhiMSwgMHhiOCwgMHhhMywgMHhhYSwgLyogNyAqLwotICAgIDB4ZWMsIDB4ZTUsIDB4ZmUsIDB4ZjcsIDB4YzgsIDB4YzEsIDB4ZGEsIDB4ZDMsIDB4YTQsIDB4YWQsIDB4YjYsIDB4YmYsIDB4ODAsIDB4ODksIDB4OTIsIDB4OWIsIC8qIDggKi8KLSAgICAweDdjLCAweDc1LCAweDZlLCAweDY3LCAweDU4LCAweDUxLCAweDRhLCAweDQzLCAweDM0LCAweDNkLCAweDI2LCAweDJmLCAweDEwLCAweDE5LCAweDAyLCAweDBiLCAvKiA5ICovCi0gICAgMHhkNywgMHhkZSwgMHhjNSwgMHhjYywgMHhmMywgMHhmYSwgMHhlMSwgMHhlOCwgMHg5ZiwgMHg5NiwgMHg4ZCwgMHg4NCwgMHhiYiwgMHhiMiwgMHhhOSwgMHhhMCwgLyogYSAqLwotICAgIDB4NDcsIDB4NGUsIDB4NTUsIDB4NWMsIDB4NjMsIDB4NmEsIDB4NzEsIDB4NzgsIDB4MGYsIDB4MDYsIDB4MWQsIDB4MTQsIDB4MmIsIDB4MjIsIDB4MzksIDB4MzAsIC8qIGIgKi8KLSAgICAweDlhLCAweDkzLCAweDg4LCAweDgxLCAweGJlLCAweGI3LCAweGFjLCAweGE1LCAweGQyLCAweGRiLCAweGMwLCAweGM5LCAweGY2LCAweGZmLCAweGU0LCAweGVkLCAvKiBjICovCi0gICAgMHgwYSwgMHgwMywgMHgxOCwgMHgxMSwgMHgyZSwgMHgyNywgMHgzYywgMHgzNSwgMHg0MiwgMHg0YiwgMHg1MCwgMHg1OSwgMHg2NiwgMHg2ZiwgMHg3NCwgMHg3ZCwgLyogZCAqLwotICAgIDB4YTEsIDB4YTgsIDB4YjMsIDB4YmEsIDB4ODUsIDB4OGMsIDB4OTcsIDB4OWUsIDB4ZTksIDB4ZTAsIDB4ZmIsIDB4ZjIsIDB4Y2QsIDB4YzQsIDB4ZGYsIDB4ZDYsIC8qIGUgKi8KLSAgICAweDMxLCAweDM4LCAweDIzLCAweDJhLCAweDE1LCAweDFjLCAweDA3LCAweDBlLCAweDc5LCAweDcwLCAweDZiLCAweDYyLCAweDVkLCAweDU0LCAweDRmLCAweDQ2LCAvKiBmICovCi19OwotCi0vKiBBcnJheUluZGV4KnswYn0gKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfbXVsX2JbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDAwLCAweDBiLCAweDE2LCAweDFkLCAweDJjLCAweDI3LCAweDNhLCAweDMxLCAweDU4LCAweDUzLCAweDRlLCAweDQ1LCAweDc0LCAweDdmLCAweDYyLCAweDY5LCAvKiAwICovCi0gICAgMHhiMCwgMHhiYiwgMHhhNiwgMHhhZCwgMHg5YywgMHg5NywgMHg4YSwgMHg4MSwgMHhlOCwgMHhlMywgMHhmZSwgMHhmNSwgMHhjNCwgMHhjZiwgMHhkMiwgMHhkOSwgLyogMSAqLwotICAgIDB4N2IsIDB4NzAsIDB4NmQsIDB4NjYsIDB4NTcsIDB4NWMsIDB4NDEsIDB4NGEsIDB4MjMsIDB4MjgsIDB4MzUsIDB4M2UsIDB4MGYsIDB4MDQsIDB4MTksIDB4MTIsIC8qIDIgKi8KLSAgICAweGNiLCAweGMwLCAweGRkLCAweGQ2LCAweGU3LCAweGVjLCAweGYxLCAweGZhLCAweDkzLCAweDk4LCAweDg1LCAweDhlLCAweGJmLCAweGI0LCAweGE5LCAweGEyLCAvKiAzICovCi0gICAgMHhmNiwgMHhmZCwgMHhlMCwgMHhlYiwgMHhkYSwgMHhkMSwgMHhjYywgMHhjNywgMHhhZSwgMHhhNSwgMHhiOCwgMHhiMywgMHg4MiwgMHg4OSwgMHg5NCwgMHg5ZiwgLyogNCAqLwotICAgIDB4NDYsIDB4NGQsIDB4NTAsIDB4NWIsIDB4NmEsIDB4NjEsIDB4N2MsIDB4NzcsIDB4MWUsIDB4MTUsIDB4MDgsIDB4MDMsIDB4MzIsIDB4MzksIDB4MjQsIDB4MmYsIC8qIDUgKi8KLSAgICAweDhkLCAweDg2LCAweDliLCAweDkwLCAweGExLCAweGFhLCAweGI3LCAweGJjLCAweGQ1LCAweGRlLCAweGMzLCAweGM4LCAweGY5LCAweGYyLCAweGVmLCAweGU0LCAvKiA2ICovCi0gICAgMHgzZCwgMHgzNiwgMHgyYiwgMHgyMCwgMHgxMSwgMHgxYSwgMHgwNywgMHgwYywgMHg2NSwgMHg2ZSwgMHg3MywgMHg3OCwgMHg0OSwgMHg0MiwgMHg1ZiwgMHg1NCwgLyogNyAqLwotICAgIDB4ZjcsIDB4ZmMsIDB4ZTEsIDB4ZWEsIDB4ZGIsIDB4ZDAsIDB4Y2QsIDB4YzYsIDB4YWYsIDB4YTQsIDB4YjksIDB4YjIsIDB4ODMsIDB4ODgsIDB4OTUsIDB4OWUsIC8qIDggKi8KLSAgICAweDQ3LCAweDRjLCAweDUxLCAweDVhLCAweDZiLCAweDYwLCAweDdkLCAweDc2LCAweDFmLCAweDE0LCAweDA5LCAweDAyLCAweDMzLCAweDM4LCAweDI1LCAweDJlLCAvKiA5ICovCi0gICAgMHg4YywgMHg4NywgMHg5YSwgMHg5MSwgMHhhMCwgMHhhYiwgMHhiNiwgMHhiZCwgMHhkNCwgMHhkZiwgMHhjMiwgMHhjOSwgMHhmOCwgMHhmMywgMHhlZSwgMHhlNSwgLyogYSAqLwotICAgIDB4M2MsIDB4MzcsIDB4MmEsIDB4MjEsIDB4MTAsIDB4MWIsIDB4MDYsIDB4MGQsIDB4NjQsIDB4NmYsIDB4NzIsIDB4NzksIDB4NDgsIDB4NDMsIDB4NWUsIDB4NTUsIC8qIGIgKi8KLSAgICAweDAxLCAweDBhLCAweDE3LCAweDFjLCAweDJkLCAweDI2LCAweDNiLCAweDMwLCAweDU5LCAweDUyLCAweDRmLCAweDQ0LCAweDc1LCAweDdlLCAweDYzLCAweDY4LCAvKiBjICovCi0gICAgMHhiMSwgMHhiYSwgMHhhNywgMHhhYywgMHg5ZCwgMHg5NiwgMHg4YiwgMHg4MCwgMHhlOSwgMHhlMiwgMHhmZiwgMHhmNCwgMHhjNSwgMHhjZSwgMHhkMywgMHhkOCwgLyogZCAqLwotICAgIDB4N2EsIDB4NzEsIDB4NmMsIDB4NjcsIDB4NTYsIDB4NWQsIDB4NDAsIDB4NGIsIDB4MjIsIDB4MjksIDB4MzQsIDB4M2YsIDB4MGUsIDB4MDUsIDB4MTgsIDB4MTMsIC8qIGUgKi8KLSAgICAweGNhLCAweGMxLCAweGRjLCAweGQ3LCAweGU2LCAweGVkLCAweGYwLCAweGZiLCAweDkyLCAweDk5LCAweDg0LCAweDhmLCAweGJlLCAweGI1LCAweGE4LCAweGEzLCAvKiBmICovCi19OwotCi0vKiBBcnJheUluZGV4KnswZH0gKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfbXVsX2RbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDAwLCAweDBkLCAweDFhLCAweDE3LCAweDM0LCAweDM5LCAweDJlLCAweDIzLCAweDY4LCAweDY1LCAweDcyLCAweDdmLCAweDVjLCAweDUxLCAweDQ2LCAweDRiLCAvKiAwICovCi0gICAgMHhkMCwgMHhkZCwgMHhjYSwgMHhjNywgMHhlNCwgMHhlOSwgMHhmZSwgMHhmMywgMHhiOCwgMHhiNSwgMHhhMiwgMHhhZiwgMHg4YywgMHg4MSwgMHg5NiwgMHg5YiwgLyogMSAqLwotICAgIDB4YmIsIDB4YjYsIDB4YTEsIDB4YWMsIDB4OGYsIDB4ODIsIDB4OTUsIDB4OTgsIDB4ZDMsIDB4ZGUsIDB4YzksIDB4YzQsIDB4ZTcsIDB4ZWEsIDB4ZmQsIDB4ZjAsIC8qIDIgKi8KLSAgICAweDZiLCAweDY2LCAweDcxLCAweDdjLCAweDVmLCAweDUyLCAweDQ1LCAweDQ4LCAweDAzLCAweDBlLCAweDE5LCAweDE0LCAweDM3LCAweDNhLCAweDJkLCAweDIwLCAvKiAzICovCi0gICAgMHg2ZCwgMHg2MCwgMHg3NywgMHg3YSwgMHg1OSwgMHg1NCwgMHg0MywgMHg0ZSwgMHgwNSwgMHgwOCwgMHgxZiwgMHgxMiwgMHgzMSwgMHgzYywgMHgyYiwgMHgyNiwgLyogNCAqLwotICAgIDB4YmQsIDB4YjAsIDB4YTcsIDB4YWEsIDB4ODksIDB4ODQsIDB4OTMsIDB4OWUsIDB4ZDUsIDB4ZDgsIDB4Y2YsIDB4YzIsIDB4ZTEsIDB4ZWMsIDB4ZmIsIDB4ZjYsIC8qIDUgKi8KLSAgICAweGQ2LCAweGRiLCAweGNjLCAweGMxLCAweGUyLCAweGVmLCAweGY4LCAweGY1LCAweGJlLCAweGIzLCAweGE0LCAweGE5LCAweDhhLCAweDg3LCAweDkwLCAweDlkLCAvKiA2ICovCi0gICAgMHgwNiwgMHgwYiwgMHgxYywgMHgxMSwgMHgzMiwgMHgzZiwgMHgyOCwgMHgyNSwgMHg2ZSwgMHg2MywgMHg3NCwgMHg3OSwgMHg1YSwgMHg1NywgMHg0MCwgMHg0ZCwgLyogNyAqLwotICAgIDB4ZGEsIDB4ZDcsIDB4YzAsIDB4Y2QsIDB4ZWUsIDB4ZTMsIDB4ZjQsIDB4ZjksIDB4YjIsIDB4YmYsIDB4YTgsIDB4YTUsIDB4ODYsIDB4OGIsIDB4OWMsIDB4OTEsIC8qIDggKi8KLSAgICAweDBhLCAweDA3LCAweDEwLCAweDFkLCAweDNlLCAweDMzLCAweDI0LCAweDI5LCAweDYyLCAweDZmLCAweDc4LCAweDc1LCAweDU2LCAweDViLCAweDRjLCAweDQxLCAvKiA5ICovCi0gICAgMHg2MSwgMHg2YywgMHg3YiwgMHg3NiwgMHg1NSwgMHg1OCwgMHg0ZiwgMHg0MiwgMHgwOSwgMHgwNCwgMHgxMywgMHgxZSwgMHgzZCwgMHgzMCwgMHgyNywgMHgyYSwgLyogYSAqLwotICAgIDB4YjEsIDB4YmMsIDB4YWIsIDB4YTYsIDB4ODUsIDB4ODgsIDB4OWYsIDB4OTIsIDB4ZDksIDB4ZDQsIDB4YzMsIDB4Y2UsIDB4ZWQsIDB4ZTAsIDB4ZjcsIDB4ZmEsIC8qIGIgKi8KLSAgICAweGI3LCAweGJhLCAweGFkLCAweGEwLCAweDgzLCAweDhlLCAweDk5LCAweDk0LCAweGRmLCAweGQyLCAweGM1LCAweGM4LCAweGViLCAweGU2LCAweGYxLCAweGZjLCAvKiBjICovCi0gICAgMHg2NywgMHg2YSwgMHg3ZCwgMHg3MCwgMHg1MywgMHg1ZSwgMHg0OSwgMHg0NCwgMHgwZiwgMHgwMiwgMHgxNSwgMHgxOCwgMHgzYiwgMHgzNiwgMHgyMSwgMHgyYywgLyogZCAqLwotICAgIDB4MGMsIDB4MDEsIDB4MTYsIDB4MWIsIDB4MzgsIDB4MzUsIDB4MjIsIDB4MmYsIDB4NjQsIDB4NjksIDB4N2UsIDB4NzMsIDB4NTAsIDB4NWQsIDB4NGEsIDB4NDcsIC8qIGUgKi8KLSAgICAweGRjLCAweGQxLCAweGM2LCAweGNiLCAweGU4LCAweGU1LCAweGYyLCAweGZmLCAweGI0LCAweGI5LCAweGFlLCAweGEzLCAweDgwLCAweDhkLCAweDlhLCAweDk3LCAvKiBmICovCi19OwotCi0vKiBBcnJheUluZGV4KnswZX0gKi8KLXN0YXRpYyBjb25zdCBVSU5UOCBhZXNfbXVsX2VbXSA9IHsKLSAgLyogIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgKi8KLSAgICAweDAwLCAweDBlLCAweDFjLCAweDEyLCAweDM4LCAweDM2LCAweDI0LCAweDJhLCAweDcwLCAweDdlLCAweDZjLCAweDYyLCAweDQ4LCAweDQ2LCAweDU0LCAweDVhLCAvKiAwICovCi0gICAgMHhlMCwgMHhlZSwgMHhmYywgMHhmMiwgMHhkOCwgMHhkNiwgMHhjNCwgMHhjYSwgMHg5MCwgMHg5ZSwgMHg4YywgMHg4MiwgMHhhOCwgMHhhNiwgMHhiNCwgMHhiYSwgLyogMSAqLwotICAgIDB4ZGIsIDB4ZDUsIDB4YzcsIDB4YzksIDB4ZTMsIDB4ZWQsIDB4ZmYsIDB4ZjEsIDB4YWIsIDB4YTUsIDB4YjcsIDB4YjksIDB4OTMsIDB4OWQsIDB4OGYsIDB4ODEsIC8qIDIgKi8KLSAgICAweDNiLCAweDM1LCAweDI3LCAweDI5LCAweDAzLCAweDBkLCAweDFmLCAweDExLCAweDRiLCAweDQ1LCAweDU3LCAweDU5LCAweDczLCAweDdkLCAweDZmLCAweDYxLCAvKiAzICovCi0gICAgMHhhZCwgMHhhMywgMHhiMSwgMHhiZiwgMHg5NSwgMHg5YiwgMHg4OSwgMHg4NywgMHhkZCwgMHhkMywgMHhjMSwgMHhjZiwgMHhlNSwgMHhlYiwgMHhmOSwgMHhmNywgLyogNCAqLwotICAgIDB4NGQsIDB4NDMsIDB4NTEsIDB4NWYsIDB4NzUsIDB4N2IsIDB4NjksIDB4NjcsIDB4M2QsIDB4MzMsIDB4MjEsIDB4MmYsIDB4MDUsIDB4MGIsIDB4MTksIDB4MTcsIC8qIDUgKi8KLSAgICAweDc2LCAweDc4LCAweDZhLCAweDY0LCAweDRlLCAweDQwLCAweDUyLCAweDVjLCAweDA2LCAweDA4LCAweDFhLCAweDE0LCAweDNlLCAweDMwLCAweDIyLCAweDJjLCAvKiA2ICovCi0gICAgMHg5NiwgMHg5OCwgMHg4YSwgMHg4NCwgMHhhZSwgMHhhMCwgMHhiMiwgMHhiYywgMHhlNiwgMHhlOCwgMHhmYSwgMHhmNCwgMHhkZSwgMHhkMCwgMHhjMiwgMHhjYywgLyogNyAqLwotICAgIDB4NDEsIDB4NGYsIDB4NWQsIDB4NTMsIDB4NzksIDB4NzcsIDB4NjUsIDB4NmIsIDB4MzEsIDB4M2YsIDB4MmQsIDB4MjMsIDB4MDksIDB4MDcsIDB4MTUsIDB4MWIsIC8qIDggKi8KLSAgICAweGExLCAweGFmLCAweGJkLCAweGIzLCAweDk5LCAweDk3LCAweDg1LCAweDhiLCAweGQxLCAweGRmLCAweGNkLCAweGMzLCAweGU5LCAweGU3LCAweGY1LCAweGZiLCAvKiA5ICovCi0gICAgMHg5YSwgMHg5NCwgMHg4NiwgMHg4OCwgMHhhMiwgMHhhYywgMHhiZSwgMHhiMCwgMHhlYSwgMHhlNCwgMHhmNiwgMHhmOCwgMHhkMiwgMHhkYywgMHhjZSwgMHhjMCwgLyogYSAqLwotICAgIDB4N2EsIDB4NzQsIDB4NjYsIDB4NjgsIDB4NDIsIDB4NGMsIDB4NWUsIDB4NTAsIDB4MGEsIDB4MDQsIDB4MTYsIDB4MTgsIDB4MzIsIDB4M2MsIDB4MmUsIDB4MjAsIC8qIGIgKi8KLSAgICAweGVjLCAweGUyLCAweGYwLCAweGZlLCAweGQ0LCAweGRhLCAweGM4LCAweGM2LCAweDljLCAweDkyLCAweDgwLCAweDhlLCAweGE0LCAweGFhLCAweGI4LCAweGI2LCAvKiBjICovCi0gICAgMHgwYywgMHgwMiwgMHgxMCwgMHgxZSwgMHgzNCwgMHgzYSwgMHgyOCwgMHgyNiwgMHg3YywgMHg3MiwgMHg2MCwgMHg2ZSwgMHg0NCwgMHg0YSwgMHg1OCwgMHg1NiwgLyogZCAqLwotICAgIDB4MzcsIDB4MzksIDB4MmIsIDB4MjUsIDB4MGYsIDB4MDEsIDB4MTMsIDB4MWQsIDB4NDcsIDB4NDksIDB4NWIsIDB4NTUsIDB4N2YsIDB4NzEsIDB4NjMsIDB4NmQsIC8qIGUgKi8KLSAgICAweGQ3LCAweGQ5LCAweGNiLCAweGM1LCAweGVmLCAweGUxLCAweGYzLCAweGZkLCAweGE3LCAweGE5LCAweGJiLCAweGI1LCAweDlmLCAweDkxLCAweDgzLCAweDhkLCAvKiBmICovCi19OwotCi0KLS8qIEZvciBBRVNfQ01BQyAqLwotI2RlZmluZSBBRVNfTUFDX0xFTkdUSCAxNiAvKiAxMjgtYml0IHN0cmluZyAqLwotc3RhdGljIFVJTlQ4IENvbnN0X1plcm9bMTZdID0gewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Owotc3RhdGljIFVJTlQ4IENvbnN0X1JiWzE2XSA9IHsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg3fTsKLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUyBrZXkgZXhwYW5zaW9uIChrZXkgc2NoZWR1bGUpCi0KLUFyZ3VtZW50czoKLSAgICBLZXkgICAgICAgICAgICAgIENpcGhlciBrZXksIGl0IG1heSBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzICgxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgS2V5TGVuZ3RoICAgICAgICBUaGUgbGVuZ3RoIG9mIGNpcGhlciBrZXkgaW4gYnl0ZXMKLSAgICBwYWVzX2N0eCAgICAgICAgIFBvaW50ZXIgdG8gQUVTX0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgcGFlc19jdHggICAgICAgICBSZXRydW4gdGhlIEtleVdvcmRFeHBhbnNpb24gb2YgQUVTX0NUWF9TVFJVQwotCi1Ob3RlOgotICAgIFBzZXVkbyBjb2RlIGZvciBrZXkgZXhwYW5zaW9uCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgTmsgPSAoa2V5IGxlbmd0aC80KTsKLQotICAgICAgIHdoaWxlIChpIDwgTmspCi0gICAgICAgICAgIEtleVdvcmRFeHBhbnNpb25baV0gPSB3b3JkKGtleVs0KmldLCBrZXlbNCppICsgMV0sIGtleVs0KmkgKyAyXSwga2V5WzQqaSArIDNdKTsKLSAgICAgICAgICAgaSsrOwotICAgICAgIGVuZCB3aGlsZQotCi0gICAgICAgd2hpbGUgKGkgPCAoKGtleSBsZW5ndGgvNCArIDYgKyAxKSo0KSApCi0gICAgICAgICAgIHRlbXAgPSBLZXlXb3JkRXhwYW5zaW9uW2kgLSAxXTsKLSAgICAgICAgICAgaWYgKGkgJSBOayA9PTApCi0gICAgICAgICAgICAgICB0ZW1wID0gU3ViV29yZChSb3RXb3JkKHRlbXApKSBeIFJjb25baS9Oa107Ci0gICAgICAgICAgIGVsc2UgaWYgKChOayA+IDYpICYmIChpICUgNCA9PSA0KSkKLSAgICAgICAgICAgICAgIHRlbXAgPSBTdWJXb3JkKHRlbXApOwotICAgICAgICAgICBlbmQgaWYKLQotICAgICAgICAgICBLZXlXb3JkRXhwYW5zaW9uW2ldID0gS2V5V29yZEV4cGFuc2lvbltpIC0gTmtdXiB0ZW1wOwotICAgICAgICAgICBpKys7Ci0gICAgICAgZW5kIHdoaWxlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFFU19LZXlFeHBhbnNpb24gKAotICAgIElOIFVJTlQ4IEtleVtdLAotICAgIElOIFVJTlQgS2V5TGVuZ3RoLAotICAgIElOT1VUIEFFU19DVFhfU1RSVUMgKnBhZXNfY3R4KQotewotICAgIFVJTlQgS2V5SW5kZXggPSAwOwotICAgIFVJTlQgTnVtYmVyT2ZXb3JkT2ZLZXksIE51bWJlck9mV29yZE9mS2V5RXhwYW5zaW9uOwotICAgIFVJTlQ4ICBUZW1wV29yZFtBRVNfS0VZX1JPV1NdLCBUZW1wOwotICAgIFVJTlQzMiBUZW1wcmNvbjsKLQotICAgIE51bWJlck9mV29yZE9mS2V5ID0gS2V5TGVuZ3RoID4+IDI7Ci0gICAgd2hpbGUgKEtleUluZGV4IDwgTnVtYmVyT2ZXb3JkT2ZLZXkpCi0gICAgewotICAgICAgICBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblswXVtLZXlJbmRleF0gPSBLZXlbNCpLZXlJbmRleF07Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzFdW0tleUluZGV4XSA9IEtleVs0KktleUluZGV4ICsgMV07Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzJdW0tleUluZGV4XSA9IEtleVs0KktleUluZGV4ICsgMl07Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzNdW0tleUluZGV4XSA9IEtleVs0KktleUluZGV4ICsgM107Ci0gICAgICAgIEtleUluZGV4Kys7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLQotICAgIE51bWJlck9mV29yZE9mS2V5RXhwYW5zaW9uID0gKChVSU5UKSBBRVNfS0VZX1JPV1MpICogKChLZXlMZW5ndGggPj4gMikgKyA2ICsgMSk7Ci0gICAgd2hpbGUgKEtleUluZGV4IDwgTnVtYmVyT2ZXb3JkT2ZLZXlFeHBhbnNpb24pCi0gICAgewotICAgICAgICBUZW1wV29yZFswXSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzBdW0tleUluZGV4IC0gMV07Ci0gICAgICAgIFRlbXBXb3JkWzFdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMV1bS2V5SW5kZXggLSAxXTsKLSAgICAgICAgVGVtcFdvcmRbMl0gPSBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsyXVtLZXlJbmRleCAtIDFdOwotICAgICAgICBUZW1wV29yZFszXSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzNdW0tleUluZGV4IC0gMV07Ci0gICAgICAgIGlmICgoS2V5SW5kZXggJSBOdW1iZXJPZldvcmRPZktleSkgPT0gMCkgewotICAgICAgICAgICAgVGVtcHJjb24gPSBhZXNfcmNvbltLZXlJbmRleC9OdW1iZXJPZldvcmRPZktleV07Ci0gICAgICAgICAgICBUZW1wID0gYWVzX3Nib3hfZW5jW1RlbXBXb3JkWzFdXV4oKFRlbXByY29uID4+IDI0KSAmIDB4ZmYpOwotICAgICAgICAgICAgVGVtcFdvcmRbMV0gPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMl1dXigoVGVtcHJjb24gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICBUZW1wV29yZFsyXSA9IGFlc19zYm94X2VuY1tUZW1wV29yZFszXV1eKChUZW1wcmNvbiA+PiAgOCkgJiAweGZmKTsKLSAgICAgICAgICAgIFRlbXBXb3JkWzNdID0gYWVzX3Nib3hfZW5jW1RlbXBXb3JkWzBdXV4oKFRlbXByY29uICAgICAgKSAmIDB4ZmYpOwotICAgICAgICAgICAgVGVtcFdvcmRbMF0gPSBUZW1wOwotICAgICAgICB9IGVsc2UgaWYgKChOdW1iZXJPZldvcmRPZktleSA+IDYpICYmICgoS2V5SW5kZXggJSBOdW1iZXJPZldvcmRPZktleSkgPT0gNCkpIHsKLSAgICAgICAgICAgIFRlbXAgPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMF1dOwotICAgICAgICAgICAgVGVtcFdvcmRbMV0gPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMV1dOwotICAgICAgICAgICAgVGVtcFdvcmRbMl0gPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbMl1dOwotICAgICAgICAgICAgVGVtcFdvcmRbM10gPSBhZXNfc2JveF9lbmNbVGVtcFdvcmRbM11dOwotICAgICAgICAgICAgVGVtcFdvcmRbMF0gPSBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzBdW0tleUluZGV4XSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzBdW0tleUluZGV4IC0gTnVtYmVyT2ZXb3JkT2ZLZXldXlRlbXBXb3JkWzBdOwotICAgICAgICBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsxXVtLZXlJbmRleF0gPSBwYWVzX2N0eC0+S2V5V29yZEV4cGFuc2lvblsxXVtLZXlJbmRleCAtIE51bWJlck9mV29yZE9mS2V5XV5UZW1wV29yZFsxXTsKLSAgICAgICAgcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMl1bS2V5SW5kZXhdID0gcGFlc19jdHgtPktleVdvcmRFeHBhbnNpb25bMl1bS2V5SW5kZXggLSBOdW1iZXJPZldvcmRPZktleV1eVGVtcFdvcmRbMl07Ci0gICAgICAgIHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzNdW0tleUluZGV4XSA9IHBhZXNfY3R4LT5LZXlXb3JkRXhwYW5zaW9uWzNdW0tleUluZGV4IC0gTnVtYmVyT2ZXb3JkT2ZLZXldXlRlbXBXb3JkWzNdOwotICAgICAgICBLZXlJbmRleCsrOwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi19IC8qIEVuZCBvZiBBRVNfS2V5RXhwYW5zaW9uICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBRVMgZW5jcnlwdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAgUGxhaW5CbG9jayAgICAgICBUaGUgYmxvY2sgb2YgcGxhaW4gdGV4dCwgMTYgYnl0ZXMoMTI4IGJpdHMpIGVhY2ggYmxvY2sKLSAgICBQbGFpbkJsb2NrU2l6ZSAgIFRoZSBsZW5ndGggb2YgYmxvY2sgb2YgcGxhaW4gdGV4dCBpbiBieXRlcwotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIENpcGhlckJsb2NrU2l6ZSAgVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgY2lwaGVyIGJsb2NrIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBDaXBoZXJCbG9jayAgICAgIFJldHVybiBjaXBoZXIgdGV4dAotICAgIENpcGhlckJsb2NrU2l6ZSAgUmV0dXJuIHRoZSBsZW5ndGggb2YgcmVhbCB1c2VkIGNpcGhlciBibG9jayBpbiBieXRlcwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBGSVBTLVBVQiAxOTcKLSAgICAxLiBDaGVjayBpZiBibG9jayBzaXplIGlzIDE2IGJ5dGVzKDEyOCBiaXRzKSBhbmQgaWYga2V5IGxlbmd0aCBpcyAxNiwgMjQsIG9yIDMyIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICAyLiBUcmFuc2ZlciB0aGUgcGxhaW4gYmxvY2sgdG8gc3RhdGUgYmxvY2sKLSAgICAzLiBNYWluIGVuY3J5cHRpb24gcm91bmRzCi0gICAgNC4gVHJhbnNmZXIgdGhlIHN0YXRlIGJsb2NrIHRvIGNpcGhlciBibG9jawotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgIE51bWJlck9mUm91bmQgPSAoa2V5IGxlbmd0aCAvIDQpICsgNjsKLSAgICAgICBzdGF0ZSBibG9jayA9IHBsYWluIGJsb2NrOwotCi0gICAgICAgQWRkUm91bmRLZXkoc3RhdGUgYmxvY2ssIGtleSk7Ci0gICAgICAgZm9yIHJvdW5kID0gMSB0byBOdW1iZXJPZlJvdW5kCi0gICAgICAgICAgIFN1YkJ5dGVzKHN0YXRlIGJsb2NrKQotICAgICAgICAgICBTaGlmdFJvd3Moc3RhdGUgYmxvY2spCi0gICAgICAgICAgIE1peENvbHVtbnMoc3RhdGUgYmxvY2spCi0gICAgICAgICAgIEFkZFJvdW5kS2V5KHN0YXRlIGJsb2NrLCBrZXkpOwotICAgICAgIGVuZCBmb3IKLQotICAgICAgIFN1YkJ5dGVzKHN0YXRlIGJsb2NrKQotICAgICAgIFNoaWZ0Um93cyhzdGF0ZSBibG9jaykKLSAgICAgICBBZGRSb3VuZEtleShzdGF0ZSBibG9jaywga2V5KTsKLQotICAgICAgIGNpcGhlciBibG9jayA9IHN0YXRlIGJsb2NrOwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfRW5jcnlwdCAoCi0gICAgSU4gVUlOVDggUGxhaW5CbG9ja1tdLAotICAgIElOIFVJTlQgUGxhaW5CbG9ja1NpemUsCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgT1VUIFVJTlQ4IENpcGhlckJsb2NrW10sCi0gICAgSU5PVVQgVUlOVCAqQ2lwaGVyQmxvY2tTaXplKQotewotICAgIEFFU19DVFhfU1RSVUMgYWVzX2N0eDsKLSAgICBVSU5UIFJvd0luZGV4LCBDb2x1bW5JbmRleDsKLSAgICBVSU5UIFJvdW5kSW5kZXgsIE51bWJlck9mUm91bmQgPSAwOwotICAgIFVJTlQ4IFRlbXAsIFJvdzAsIFJvdzEsIFJvdzIsIFJvdzM7Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIGlmIGJsb2NrIHNpemUgaXMgMTYgYnl0ZXMoMTI4IGJpdHMpIGFuZCBpZiBrZXkgbGVuZ3RoIGlzIDE2LCAyNCwgb3IgMzIgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgICAqLwotICAgIGlmIChQbGFpbkJsb2NrU2l6ZSAhPSBBRVNfQkxPQ0tfU0laRVMpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRW5jcnlwdDogcGxhaW4gYmxvY2sgc2l6ZSBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjggYml0cykuXG4iLAotICAgICAgICAgICAgUGxhaW5CbG9ja1NpemUsIEFFU19CTE9DS19TSVpFUykpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTkyX0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMjU2X0xFTkdUSCkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRW5jcnlwdDoga2V5IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCwgJWQsIG9yICVkIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykuXG4iLAotICAgICAgICAgICAgS2V5TGVuZ3RoLCBBRVNfS0VZMTI4X0xFTkdUSCwgQUVTX0tFWTE5Ml9MRU5HVEgsIEFFU19LRVkyNTZfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICgqQ2lwaGVyQmxvY2tTaXplIDwgQUVTX0JMT0NLX1NJWkVTKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0VuY3J5cHQ6IGNpcGhlciBibG9jayBzaXplIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICAqQ2lwaGVyQmxvY2tTaXplLCBBRVNfQkxPQ0tfU0laRVMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqIDIuIFRyYW5zZmVyIHRoZSBwbGFpbiBibG9jayB0byBzdGF0ZSBibG9jawotICAgICAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBQbGFpbkJsb2NrW1Jvd0luZGV4ICsgNCpDb2x1bW5JbmRleF07Ci0KLSAgICAvKgotICAgICAqICAzLiBNYWluIGVuY3J5cHRpb24gcm91bmRzCi0gICAgICovCi0gICAgQUVTX0tleUV4cGFuc2lvbihLZXksIEtleUxlbmd0aCwgJmFlc19jdHgpOwotICAgIE51bWJlck9mUm91bmQgPSAoS2V5TGVuZ3RoID4+IDIpICsgNjsKLQotICAgIC8qIEFFU19BZGRSb3VuZEtleSAqLwotICAgIFJvdW5kSW5kZXggPSAwOwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gXj0gYWVzX2N0eC5LZXlXb3JkRXhwYW5zaW9uW1Jvd0luZGV4XVsoUm91bmRJbmRleCooKFVJTlQpIEFFU19TVEFURV9DT0xVTU5TKSkgKyBDb2x1bW5JbmRleF07Ci0KLSAgICBmb3IgKFJvdW5kSW5kZXggPSAxOyBSb3VuZEluZGV4IDwgTnVtYmVyT2ZSb3VuZDtSb3VuZEluZGV4KyspCi0gICAgewotICAgICAgICAvKiBBRVNfU3ViQnl0ZXMgKi8KLSAgICAgICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdID0gYWVzX3Nib3hfZW5jW2Flc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XV07Ci0KLSAgICAgICAgLyogQUVTX1NoaWZ0Um93cyAqLwotICAgICAgICBUZW1wID0gYWVzX2N0eC5TdGF0ZVsxXVswXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVswXSA9IGFlc19jdHguU3RhdGVbMV1bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bMV0gPSBhZXNfY3R4LlN0YXRlWzFdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzJdID0gYWVzX2N0eC5TdGF0ZVsxXVszXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVszXSA9IFRlbXA7Ci0gICAgICAgIFRlbXAgPSBhZXNfY3R4LlN0YXRlWzJdWzBdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzBdID0gYWVzX2N0eC5TdGF0ZVsyXVsyXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVsyXSA9IFRlbXA7Ci0gICAgICAgIFRlbXAgPSBhZXNfY3R4LlN0YXRlWzJdWzFdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzFdID0gYWVzX2N0eC5TdGF0ZVsyXVszXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsyXVszXSA9IFRlbXA7Ci0gICAgICAgIFRlbXAgPSBhZXNfY3R4LlN0YXRlWzNdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzNdID0gYWVzX2N0eC5TdGF0ZVszXVsyXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVsyXSA9IGFlc19jdHguU3RhdGVbM11bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bMV0gPSBhZXNfY3R4LlN0YXRlWzNdWzBdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzBdID0gVGVtcDsKLQotICAgICAgICAvKiBBRVNfTWl4Q29sdW1ucyAqLwotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBSb3cwID0gYWVzX2N0eC5TdGF0ZVswXVtDb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBSb3cxID0gYWVzX2N0eC5TdGF0ZVsxXVtDb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBSb3cyID0gYWVzX2N0eC5TdGF0ZVsyXVtDb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBSb3czID0gYWVzX2N0eC5TdGF0ZVszXVtDb2x1bW5JbmRleF07Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzBdW0NvbHVtbkluZGV4XSA9IGFlc19tdWxfMltSb3cwXV5hZXNfbXVsXzNbUm93MV1eUm93Ml5Sb3czOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVtDb2x1bW5JbmRleF0gPSBSb3cwXmFlc19tdWxfMltSb3cxXV5hZXNfbXVsXzNbUm93Ml1eUm93MzsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbMl1bQ29sdW1uSW5kZXhdID0gUm93MF5Sb3cxXmFlc19tdWxfMltSb3cyXV5hZXNfbXVsXzNbUm93M107Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzNdW0NvbHVtbkluZGV4XSA9IGFlc19tdWxfM1tSb3cwXV5Sb3cxXlJvdzJeYWVzX211bF8yW1JvdzNdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIEFFU19TdWJCeXRlcyAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBhZXNfc2JveF9lbmNbYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdXTsKLSAgICAvKiBBRVNfU2hpZnRSb3dzICovCi0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMV1bMF07Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVswXSA9IGFlc19jdHguU3RhdGVbMV1bMV07Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVsxXSA9IGFlc19jdHguU3RhdGVbMV1bMl07Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVsyXSA9IGFlc19jdHguU3RhdGVbMV1bM107Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVszXSA9IFRlbXA7Ci0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMF07Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVswXSA9IGFlc19jdHguU3RhdGVbMl1bMl07Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVsyXSA9IFRlbXA7Ci0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMV07Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVsxXSA9IGFlc19jdHguU3RhdGVbMl1bM107Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVszXSA9IFRlbXA7Ci0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbM11bM107Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVszXSA9IGFlc19jdHguU3RhdGVbM11bMl07Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVsyXSA9IGFlc19jdHguU3RhdGVbM11bMV07Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVsxXSA9IGFlc19jdHguU3RhdGVbM11bMF07Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVswXSA9IFRlbXA7Ci0gICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLQotICAgIC8qCi0gICAgICogNC4gVHJhbnNmZXIgdGhlIHN0YXRlIGJsb2NrIHRvIGNpcGhlciBibG9jawotICAgICAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBDaXBoZXJCbG9ja1tSb3dJbmRleCArIDQqQ29sdW1uSW5kZXhdID0gYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdOwotCi0gICAgKkNpcGhlckJsb2NrU2l6ZSA9ICgoVUlOVCkgQUVTX1NUQVRFX1JPV1MpKigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpOwotfSAvKiBFbmQgb2YgQUVTX0VuY3J5cHQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUyBkZWNyeXB0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBDaXBoZXJCbG9jayAgICAgIFRoZSBibG9jayBvZiBjaXBoZXIgdGV4dCwgMTYgYnl0ZXMoMTI4IGJpdHMpIGVhY2ggYmxvY2sKLSAgICBDaXBoZXJCbG9ja1NpemUgIFRoZSBsZW5ndGggb2YgYmxvY2sgb2YgY2lwaGVyIHRleHQgaW4gYnl0ZXMKLSAgICBLZXkgICAgICAgICAgICAgIENpcGhlciBrZXksIGl0IG1heSBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzICgxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgS2V5TGVuZ3RoICAgICAgICBUaGUgbGVuZ3RoIG9mIGNpcGhlciBrZXkgaW4gYnl0ZXMKLSAgICBQbGFpbkJsb2NrU2l6ZSAgIFRoZSBsZW5ndGggb2YgYWxsb2NhdGVkIHBsYWluIGJsb2NrIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBQbGFpbkJsb2NrICAgICAgIFJldHVybiBwbGFpbiB0ZXh0Ci0gICAgUGxhaW5CbG9ja1NpemUgIFJldHVybiB0aGUgbGVuZ3RoIG9mIHJlYWwgdXNlZCBwbGFpbiBibG9jayBpbiBieXRlcwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBGSVBTLVBVQiAxOTcKLSAgICAxLiBDaGVjayBpZiBibG9jayBzaXplIGlzIDE2IGJ5dGVzKDEyOCBiaXRzKSBhbmQgaWYga2V5IGxlbmd0aCBpcyAxNiwgMjQsIG9yIDMyIGJ5dGVzKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICAyLiBUcmFuc2ZlciB0aGUgY2lwaGVyIGJsb2NrIHRvIHN0YXRlIGJsb2NrCi0gICAgMy4gTWFpbiBkZWNyeXB0aW9uIHJvdW5kcwotICAgIDQuIFRyYW5zZmVyIHRoZSBzdGF0ZSBibG9jayB0byBwbGFpbiBibG9jawotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgIE51bWJlck9mUm91bmQgPSAoa2V5IGxlbmd0aCAvIDQpICsgNjsKLSAgICAgICBzdGF0ZSBibG9jayA9IGNpcGhlciBibG9jazsKLQotICAgICAgIEFkZFJvdW5kS2V5KHN0YXRlIGJsb2NrLCBrZXkpOwotICAgICAgIGZvciByb3VuZCA9IE51bWJlck9mUm91bmQgdG8gMQotICAgICAgICAgICBJbnZTdWJCeXRlcyhzdGF0ZSBibG9jaykKLSAgICAgICAgICAgSW52U2hpZnRSb3dzKHN0YXRlIGJsb2NrKQotICAgICAgICAgICBJbnZNaXhDb2x1bW5zKHN0YXRlIGJsb2NrKQotICAgICAgICAgICBBZGRSb3VuZEtleShzdGF0ZSBibG9jaywga2V5KTsKLSAgICAgICBlbmQgZm9yCi0KLSAgICAgICBJbnZTdWJCeXRlcyhzdGF0ZSBibG9jaykKLSAgICAgICBJbnZTaGlmdFJvd3Moc3RhdGUgYmxvY2spCi0gICAgICAgQWRkUm91bmRLZXkoc3RhdGUgYmxvY2ssIGtleSk7Ci0KLSAgICAgICBwbGFpbiBibG9jayA9IHN0YXRlIGJsb2NrOwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfRGVjcnlwdCAoCi0gICAgSU4gVUlOVDggQ2lwaGVyQmxvY2tbXSwKLSAgICBJTiBVSU5UIENpcGhlckJsb2NrU2l6ZSwKLSAgICBJTiBVSU5UOCBLZXlbXSwKLSAgICBJTiBVSU5UIEtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggUGxhaW5CbG9ja1tdLAotICAgIElOT1VUIFVJTlQgKlBsYWluQmxvY2tTaXplKQotewotICAgIEFFU19DVFhfU1RSVUMgYWVzX2N0eDsKLSAgICBVSU5UIFJvd0luZGV4LCBDb2x1bW5JbmRleDsKLSAgICBVSU5UIFJvdW5kSW5kZXgsIE51bWJlck9mUm91bmQgPSAwOwotICAgIFVJTlQ4IFRlbXAsIFJvdzAsIFJvdzEsIFJvdzIsIFJvdzM7Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIGlmIGJsb2NrIHNpemUgaXMgMTYgYnl0ZXMoMTI4IGJpdHMpIGFuZCBpZiBrZXkgbGVuZ3RoIGlzIDE2LCAyNCwgb3IgMzIgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgICAqLwotICAgIGlmICgqUGxhaW5CbG9ja1NpemUgPCBBRVNfQkxPQ0tfU0laRVMpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfRGVjcnlwdDogcGxhaW4gYmxvY2sgc2l6ZSBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjggYml0cykuXG4iLAotICAgICAgICAgICAgKlBsYWluQmxvY2tTaXplLCBBRVNfQkxPQ0tfU0laRVMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKChLZXlMZW5ndGggIT0gQUVTX0tFWTEyOF9MRU5HVEgpICYmIChLZXlMZW5ndGggIT0gQUVTX0tFWTE5Ml9MRU5HVEgpICYmIChLZXlMZW5ndGggIT0gQUVTX0tFWTI1Nl9MRU5HVEgpKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0RlY3J5cHQ6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQsICVkLCBvciAlZCBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgsIEFFU19LRVkxOTJfTEVOR1RILCBBRVNfS0VZMjU2X0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoQ2lwaGVyQmxvY2tTaXplICE9IEFFU19CTE9DS19TSVpFUykgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19EZWNyeXB0OiBjaXBoZXIgYmxvY2sgc2l6ZSBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjggYml0cykuXG4iLAotICAgICAgICAgICAgQ2lwaGVyQmxvY2tTaXplLCBBRVNfQkxPQ0tfU0laRVMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqIDIuIFRyYW5zZmVyIHRoZSBjaXBoZXIgYmxvY2sgdG8gc3RhdGUgYmxvY2sKLSAgICAgKi8KLSAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICBmb3IgKENvbHVtbkluZGV4ID0gMDsgQ29sdW1uSW5kZXggPCBBRVNfU1RBVEVfQ09MVU1OUztDb2x1bW5JbmRleCsrKQotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdID0gQ2lwaGVyQmxvY2tbUm93SW5kZXggKyA0KkNvbHVtbkluZGV4XTsKLQotICAgIC8qCi0gICAgICogIDMuIE1haW4gZGVjcnlwdGlvbiByb3VuZHMKLSAgICAgKi8KLSAgICBBRVNfS2V5RXhwYW5zaW9uKEtleSwgS2V5TGVuZ3RoLCAmYWVzX2N0eCk7Ci0gICAgTnVtYmVyT2ZSb3VuZCA9IChLZXlMZW5ndGggPj4gMikgKyA2OwotCi0gICAgLyogQUVTX0FkZFJvdW5kS2V5ICovCi0gICAgUm91bmRJbmRleCA9IE51bWJlck9mUm91bmQ7Ci0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSBePSBhZXNfY3R4LktleVdvcmRFeHBhbnNpb25bUm93SW5kZXhdWyhSb3VuZEluZGV4KigoVUlOVCkgQUVTX1NUQVRFX0NPTFVNTlMpKSArIENvbHVtbkluZGV4XTsKLQotICAgIGZvciAoUm91bmRJbmRleCA9IChOdW1iZXJPZlJvdW5kIC0gMSk7IFJvdW5kSW5kZXggPiAwIDtSb3VuZEluZGV4LS0pCi0gICAgewotICAgICAgICAvKiBBRVNfSW52U2hpZnRSb3dzICovCi0gICAgICAgIFRlbXAgPSBhZXNfY3R4LlN0YXRlWzFdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzNdID0gYWVzX2N0eC5TdGF0ZVsxXVsyXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVsyXSA9IGFlc19jdHguU3RhdGVbMV1bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMV1bMV0gPSBhZXNfY3R4LlN0YXRlWzFdWzBdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzFdWzBdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMF0gPSBhZXNfY3R4LlN0YXRlWzJdWzJdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzJdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMV07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbMl1bMV0gPSBhZXNfY3R4LlN0YXRlWzJdWzNdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzJdWzNdID0gVGVtcDsKLSAgICAgICAgVGVtcCA9IGFlc19jdHguU3RhdGVbM11bMF07Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bMF0gPSBhZXNfY3R4LlN0YXRlWzNdWzFdOwotICAgICAgICBhZXNfY3R4LlN0YXRlWzNdWzFdID0gYWVzX2N0eC5TdGF0ZVszXVsyXTsKLSAgICAgICAgYWVzX2N0eC5TdGF0ZVszXVsyXSA9IGFlc19jdHguU3RhdGVbM11bM107Ci0gICAgICAgIGFlc19jdHguU3RhdGVbM11bM10gPSBUZW1wOwotCi0gICAgICAgIC8qIEFFU19JbnZTdWJCeXRlcyAqLwotICAgICAgICBmb3IgKFJvd0luZGV4ID0gMDsgUm93SW5kZXggPCBBRVNfU1RBVEVfUk9XUztSb3dJbmRleCsrKQotICAgICAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gPSBhZXNfc2JveF9kZWNbYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdXTsKLQotICAgICAgICAvKiBBRVNfQWRkUm91bmRLZXkgKi8KLSAgICAgICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVtSb3dJbmRleF1bQ29sdW1uSW5kZXhdIF49IGFlc19jdHguS2V5V29yZEV4cGFuc2lvbltSb3dJbmRleF1bKFJvdW5kSW5kZXgqKChVSU5UKSBBRVNfU1RBVEVfQ09MVU1OUykpICsgQ29sdW1uSW5kZXhdOwotCi0gICAgICAgIC8qIEFFU19JbnZNaXhDb2x1bW5zICovCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvdzAgPSBhZXNfY3R4LlN0YXRlWzBdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzEgPSBhZXNfY3R4LlN0YXRlWzFdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzIgPSBhZXNfY3R4LlN0YXRlWzJdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIFJvdzMgPSBhZXNfY3R4LlN0YXRlWzNdW0NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbMF1bQ29sdW1uSW5kZXhdID0gYWVzX211bF9lW1JvdzBdXmFlc19tdWxfYltSb3cxXV5hZXNfbXVsX2RbUm93Ml1eYWVzX211bF85W1JvdzNdOwotICAgICAgICAgICAgYWVzX2N0eC5TdGF0ZVsxXVtDb2x1bW5JbmRleF0gPSBhZXNfbXVsXzlbUm93MF1eYWVzX211bF9lW1JvdzFdXmFlc19tdWxfYltSb3cyXV5hZXNfbXVsX2RbUm93M107Ci0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlWzJdW0NvbHVtbkluZGV4XSA9IGFlc19tdWxfZFtSb3cwXV5hZXNfbXVsXzlbUm93MV1eYWVzX211bF9lW1JvdzJdXmFlc19tdWxfYltSb3czXTsKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbM11bQ29sdW1uSW5kZXhdID0gYWVzX211bF9iW1JvdzBdXmFlc19tdWxfZFtSb3cxXV5hZXNfbXVsXzlbUm93Ml1eYWVzX211bF9lW1JvdzNdOwotICAgICAgICB9Ci0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAvKiBBRVNfSW52U2hpZnRSb3dzICovCi0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMV1bM107Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVszXSA9IGFlc19jdHguU3RhdGVbMV1bMl07Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVsyXSA9IGFlc19jdHguU3RhdGVbMV1bMV07Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVsxXSA9IGFlc19jdHguU3RhdGVbMV1bMF07Ci0gICAgYWVzX2N0eC5TdGF0ZVsxXVswXSA9IFRlbXA7Ci0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMF07Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVswXSA9IGFlc19jdHguU3RhdGVbMl1bMl07Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVsyXSA9IFRlbXA7Ci0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbMl1bMV07Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVsxXSA9IGFlc19jdHguU3RhdGVbMl1bM107Ci0gICAgYWVzX2N0eC5TdGF0ZVsyXVszXSA9IFRlbXA7Ci0gICAgVGVtcCA9IGFlc19jdHguU3RhdGVbM11bMF07Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVswXSA9IGFlc19jdHguU3RhdGVbM11bMV07Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVsxXSA9IGFlc19jdHguU3RhdGVbM11bMl07Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVsyXSA9IGFlc19jdHguU3RhdGVbM11bM107Ci0gICAgYWVzX2N0eC5TdGF0ZVszXVszXSA9IFRlbXA7Ci0gICAgLyogQUVTX0ludlN1YkJ5dGVzICovCi0gICAgZm9yIChSb3dJbmRleCA9IDA7IFJvd0luZGV4IDwgQUVTX1NUQVRFX1JPV1M7Um93SW5kZXgrKykKLSAgICAgICAgZm9yIChDb2x1bW5JbmRleCA9IDA7IENvbHVtbkluZGV4IDwgQUVTX1NUQVRFX0NPTFVNTlM7Q29sdW1uSW5kZXgrKykKLSAgICAgICAgICAgIGFlc19jdHguU3RhdGVbUm93SW5kZXhdW0NvbHVtbkluZGV4XSA9IGFlc19zYm94X2RlY1thZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF1dOwotICAgIC8qIEFFU19BZGRSb3VuZEtleSAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF0gXj0gYWVzX2N0eC5LZXlXb3JkRXhwYW5zaW9uW1Jvd0luZGV4XVsoUm91bmRJbmRleCooKFVJTlQpIEFFU19TVEFURV9DT0xVTU5TKSkgKyBDb2x1bW5JbmRleF07Ci0KLSAgICAvKgotICAgICAqIDQuIFRyYW5zZmVyIHRoZSBzdGF0ZSBibG9jayB0byBwbGFpbiBibG9jawotICAgICAqLwotICAgIGZvciAoUm93SW5kZXggPSAwOyBSb3dJbmRleCA8IEFFU19TVEFURV9ST1dTO1Jvd0luZGV4KyspCi0gICAgICAgIGZvciAoQ29sdW1uSW5kZXggPSAwOyBDb2x1bW5JbmRleCA8IEFFU19TVEFURV9DT0xVTU5TO0NvbHVtbkluZGV4KyspCi0gICAgICAgICAgICBQbGFpbkJsb2NrW1Jvd0luZGV4ICsgNCpDb2x1bW5JbmRleF0gPSBhZXNfY3R4LlN0YXRlW1Jvd0luZGV4XVtDb2x1bW5JbmRleF07Ci0KLSAgICAqUGxhaW5CbG9ja1NpemUgPSAoKFVJTlQpIEFFU19TVEFURV9ST1dTKSooKFVJTlQpIEFFU19TVEFURV9DT0xVTU5TKTsKLX0gLyogRW5kIG9mIEFFU19EZWNyeXB0ICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBRVMtQ0JDIGVuY3J5cHRpb24KLQotQXJndW1lbnRzOgotICAgIFBsYWluVGV4dCAgICAgICAgUGxhaW4gdGV4dAotICAgIFBsYWluVGV4dExlbmd0aCAgVGhlIGxlbmd0aCBvZiBwbGFpbiB0ZXh0IGluIGJ5dGVzCi0gICAgS2V5ICAgICAgICAgICAgICBDaXBoZXIga2V5LCBpdCBtYXkgYmUgMTYsIDI0LCBvciAzMiBieXRlcyAoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKQotICAgIEtleUxlbmd0aCAgICAgICAgVGhlIGxlbmd0aCBvZiBjaXBoZXIga2V5IGluIGJ5dGVzCi0gICAgSVYgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbiB2ZWN0b3IsIGl0IG1heSBiZSAxNiBieXRlcyAoMTI4IGJpdHMpCi0gICAgSVZMZW5ndGggICAgICAgICBUaGUgbGVuZ3RoIG9mIGluaXRpYWxpemF0aW9uIHZlY3RvciBpbiBieXRlcwotICAgIENpcGhlclRleHRMZW5ndGggVGhlIGxlbmd0aCBvZiBhbGxvY2F0ZWQgY2lwaGVyIHRleHQgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIENpcGhlclRleHQgICAgICAgUmV0dXJuIGNpcGhlciB0ZXh0Ci0gICAgQ2lwaGVyVGV4dExlbmd0aCBSZXR1cm4gdGhlIGxlbmd0aCBvZiByZWFsIHVzZWQgY2lwaGVyIHRleHQgaW4gYnl0ZXMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDIDM2MDIgYW5kIE5JU1QgODAwLTM4QQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfQ0JDX0VuY3J5cHQgKAotICAgIElOIFVJTlQ4IFBsYWluVGV4dFtdLAotICAgIElOIFVJTlQgUGxhaW5UZXh0TGVuZ3RoLAotICAgIElOIFVJTlQ4IEtleVtdLAotICAgIElOIFVJTlQgS2V5TGVuZ3RoLAotICAgIElOIFVJTlQ4IElWW10sCi0gICAgSU4gVUlOVCBJVkxlbmd0aCwKLSAgICBPVVQgVUlOVDggQ2lwaGVyVGV4dFtdLAotICAgIElOT1VUIFVJTlQgKkNpcGhlclRleHRMZW5ndGgpCi17Ci0gICAgVUlOVCBQYWRkaW5nU2l6ZSwgUGxhaW5CbG9ja1N0YXJ0LCBDaXBoZXJCbG9ja1N0YXJ0LCBDaXBoZXJCbG9ja1NpemU7Ci0gICAgVUlOVCBJbmRleDsKLSAgICBVSU5UOCBCbG9ja1tBRVNfQkxPQ0tfU0laRVNdOwotCi0gICAgLyoKLSAgICAgKiAxLiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgICAqICAgIC0gQ2lwaGVyVGV4dExlbmd0aCA+IChQbGFpblRleHRMZW5ndGggKyBQYWRkaW5nIHNpemUpLCBQYWRkaW5nIHNpemUgPSBibG9jayBzaXplIC0gKFBsYWluVGV4dExlbmd0aCAlIGJsb2NrIHNpemUpCi0gICAgICogICAgLSBLZXkgbGVuZ3RoIG11c3QgYmUgMTYsIDI0LCBvciAzMiBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgICogICAgLSBJViBsZW5ndGggbXVzdCBiZSAxNiBieXRlcygxMjggYml0cykKLSAgICAgKi8KLSAgICBQYWRkaW5nU2l6ZSA9ICgoVUlOVCkgQUVTX0JMT0NLX1NJWkVTKSAtIChQbGFpblRleHRMZW5ndGggJSAoKFVJTlQpQUVTX0JMT0NLX1NJWkVTKSk7Ci0gICAgaWYgKCpDaXBoZXJUZXh0TGVuZ3RoIDwgKFBsYWluVGV4dExlbmd0aCArIFBhZGRpbmdTaXplKSkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DQkNfRW5jcnlwdDogY2lwaGVyIHRleHQgbGVuZ3RoIGlzICVkIGJ5dGVzIDwgKHBsYWluIHRleHQgbGVuZ3RoICVkIGJ5dGVzICsgcGFkZGluZyBzaXplICVkIGJ5dGVzKS5cbiIsCi0gICAgICAgICAgICAqQ2lwaGVyVGV4dExlbmd0aCwgUGxhaW5UZXh0TGVuZ3RoLCBQYWRkaW5nU2l6ZSkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTkyX0xFTkdUSCkgJiYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMjU2X0xFTkdUSCkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0VuY3J5cHQ6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQsICVkLCBvciAlZCBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgsIEFFU19LRVkxOTJfTEVOR1RILCBBRVNfS0VZMjU2X0xFTkdUSCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoSVZMZW5ndGggIT0gQUVTX0NCQ19JVl9MRU5HVEgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0VuY3J5cHQ6IElWIGxlbmd0aCBpcyAlZCBieXRlcywgaXQgbXVzdCBiZSAlZCBieXRlcygxMjhiaXRzKS5cbiIsCi0gICAgICAgICAgICBJVkxlbmd0aCwgQUVTX0NCQ19JVl9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLQotICAgIC8qCi0gICAgICogMi4gTWFpbiBhbGdvcml0aG0KLSAgICAgKiAgICAtIFBsYWluIHRleHQgZGl2aWRlIGludG8gc2VydmVyYWwgYmxvY2tzICgxNiBieXRlcy9ibG9jaykKLSAgICAgKiAgICAtIElmIHBsYWluIHRleHQgaXMgZGl2aWRlZCB3aXRoIG5vIHJlbWFpbmRlciBieSBibG9jaywgYWRkIGEgbmV3IGJsb2NrIGFuZCBwYWRkaW5nIHNpemUgPSBibG9jaygxNiBieXRlcykKLSAgICAgKiAgICAtIElmIHBsYWluIHRleHQgaXMgbm90IGRpdmlkZWQgd2l0aCBubyByZW1haW5kZXIgYnkgYmxvY2ssIHBhZGRpbmcgc2l6ZSA9IChibG9jayAtIHJlbWFpbmRlciBwbGFpbiB0ZXh0KQotICAgICAqICAgIC0gRXhlY3V0ZSBBRVNfRW5jcnlwdCBwcm9jZWR1cmUuCi0gICAgICoKLSAgICAgKiAgICAtIFBhZGRpbmcgbWV0aG9kOiBUaGUgcmVtYWluZGVyIGJ5dGVzIHdpbGwgYmUgZmlsbGVkIHdpdGggcGFkZGluZyBzaXplICgxIGJ5dGUpCi0gICAgICovCi0gICAgUGxhaW5CbG9ja1N0YXJ0ID0gMDsKLSAgICBDaXBoZXJCbG9ja1N0YXJ0ID0gMDsKLSAgICB3aGlsZSAoKFBsYWluVGV4dExlbmd0aCAtIFBsYWluQmxvY2tTdGFydCkgPj0gQUVTX0JMT0NLX1NJWkVTKQotICAgIHsKLSAgICAgICAgaWYgKENpcGhlckJsb2NrU3RhcnQgPT0gMCkgewotICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIEJsb2NrW0luZGV4XSA9IFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF1eSVZbSW5kZXhdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIEJsb2NrW0luZGV4XSA9IFBsYWluVGV4dFtQbGFpbkJsb2NrU3RhcnQgKyBJbmRleF1eQ2lwaGVyVGV4dFtDaXBoZXJCbG9ja1N0YXJ0IC0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpICsgSW5kZXhdOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIENpcGhlckJsb2NrU2l6ZSA9ICpDaXBoZXJUZXh0TGVuZ3RoIC0gQ2lwaGVyQmxvY2tTdGFydDsKLSAgICAgICAgQUVTX0VuY3J5cHQoQmxvY2ssIEFFU19CTE9DS19TSVpFUyAsIEtleSwgS2V5TGVuZ3RoLCBDaXBoZXJUZXh0ICsgQ2lwaGVyQmxvY2tTdGFydCwgJkNpcGhlckJsb2NrU2l6ZSk7Ci0KLSAgICAgICAgUGxhaW5CbG9ja1N0YXJ0ICs9ICgoVUlOVCkgQUVTX0JMT0NLX1NJWkVTKTsKLSAgICAgICAgQ2lwaGVyQmxvY2tTdGFydCArPSBDaXBoZXJCbG9ja1NpemU7Ci0gICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLQotICAgIE5kaXNNb3ZlTWVtb3J5KEJsb2NrLCAoJlBsYWluVGV4dFswXSArIFBsYWluQmxvY2tTdGFydCksIChQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQpKTsKLSAgICBOZGlzRmlsbE1lbW9yeSgoQmxvY2sgKyAoKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpIC1QYWRkaW5nU2l6ZSkpLCBQYWRkaW5nU2l6ZSwgKFVJTlQ4KSBQYWRkaW5nU2l6ZSk7Ci0gICAgaWYgKENpcGhlckJsb2NrU3RhcnQgPT0gMCkgewotICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgQmxvY2tbSW5kZXhdIF49IElWW0luZGV4XTsKLSAgICB9IGVsc2UgewotICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgQmxvY2tbSW5kZXhdIF49IENpcGhlclRleHRbQ2lwaGVyQmxvY2tTdGFydCAtICgoVUlOVCkgQUVTX0JMT0NLX1NJWkVTKSArIEluZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIENpcGhlckJsb2NrU2l6ZSA9ICpDaXBoZXJUZXh0TGVuZ3RoIC0gQ2lwaGVyQmxvY2tTdGFydDsKLSAgICBBRVNfRW5jcnlwdChCbG9jaywgQUVTX0JMT0NLX1NJWkVTICwgS2V5LCBLZXlMZW5ndGgsIENpcGhlclRleHQgKyBDaXBoZXJCbG9ja1N0YXJ0LCAmQ2lwaGVyQmxvY2tTaXplKTsKLSAgICBDaXBoZXJCbG9ja1N0YXJ0ICs9IENpcGhlckJsb2NrU2l6ZTsKLSAgICAqQ2lwaGVyVGV4dExlbmd0aCA9IENpcGhlckJsb2NrU3RhcnQ7Ci19IC8qIEVuZCBvZiBBRVNfQ0JDX0VuY3J5cHQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFFUy1DQkMgZGVjcnlwdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAgQ2lwaGVyVGV4dCAgICAgICBDaXBoZXIgdGV4dAotICAgIENpcGhlclRleHRMZW5ndGggVGhlIGxlbmd0aCBvZiBjaXBoZXIgdGV4dCBpbiBieXRlcwotICAgIEtleSAgICAgICAgICAgICAgQ2lwaGVyIGtleSwgaXQgbWF5IGJlIDE2LCAyNCwgb3IgMzIgYnl0ZXMgKDEyOCwgMTkyLCBvciAyNTYgYml0cykKLSAgICBLZXlMZW5ndGggICAgICAgIFRoZSBsZW5ndGggb2YgY2lwaGVyIGtleSBpbiBieXRlcwotICAgIElWICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gdmVjdG9yLCBpdCBtYXkgYmUgMTYgYnl0ZXMgKDEyOCBiaXRzKQotICAgIElWTGVuZ3RoICAgICAgICAgVGhlIGxlbmd0aCBvZiBpbml0aWFsaXphdGlvbiB2ZWN0b3IgaW4gYnl0ZXMKLSAgICBQbGFpblRleHRMZW5ndGggIFRoZSBsZW5ndGggb2YgYWxsb2NhdGVkIHBsYWluIHRleHQgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIFBsYWluVGV4dCAgICAgICAgUmV0dXJuIHBsYWluIHRleHQKLSAgICBQbGFpblRleHRMZW5ndGggIFJldHVybiB0aGUgbGVuZ3RoIG9mIHJlYWwgdXNlZCBwbGFpbiB0ZXh0IGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIFJGQyAzNjAyIGFuZCBOSVNUIDgwMC0zOEEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQUVTX0NCQ19EZWNyeXB0ICgKLSAgICBJTiBVSU5UOCBDaXBoZXJUZXh0W10sCi0gICAgSU4gVUlOVCBDaXBoZXJUZXh0TGVuZ3RoLAotICAgIElOIFVJTlQ4IEtleVtdLAotICAgIElOIFVJTlQgS2V5TGVuZ3RoLAotICAgIElOIFVJTlQ4IElWW10sCi0gICAgSU4gVUlOVCBJVkxlbmd0aCwKLSAgICBPVVQgVUlOVDggUGxhaW5UZXh0W10sCi0gICAgSU5PVVQgVUlOVCAqUGxhaW5UZXh0TGVuZ3RoKQotewotICAgIFVJTlQgUGFkZGluZ1NpemUsIFBsYWluQmxvY2tTdGFydCwgQ2lwaGVyQmxvY2tTdGFydCwgUGxhaW5CbG9ja1NpemU7Ci0gICAgVUlOVCBJbmRleDsKLQotICAgIC8qCi0gICAgICogMS4gQ2hlY2sgdGhlIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgKiAgICAtIENpcGhlclRleHRMZW5ndGggbXVzdCBiZSBkaXZpZGVkIHdpdGggbm8gcmVtYWluZGVyIGJ5IGJsb2NrCi0gICAgICogICAgLSBLZXkgbGVuZ3RoIG11c3QgYmUgMTYsIDI0LCBvciAzMiBieXRlcygxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgICogICAgLSBJViBsZW5ndGggbXVzdCBiZSAxNiBieXRlcygxMjggYml0cykKLSAgICAgKi8KLSAgICBpZiAoKENpcGhlclRleHRMZW5ndGggJSBBRVNfQkxPQ0tfU0laRVMpICE9IDApIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ0JDX0RlY3J5cHQ6IGNpcGhlciB0ZXh0IGxlbmd0aCBpcyAlZCBieXRlcywgaXQgY2FuJ3QgYmUgZGl2aWRlZCB3aXRoIG5vIHJlbWFpbmRlciBieSBibG9jayBzaXplKCVkKS5cbiIsCi0gICAgICAgICAgICBDaXBoZXJUZXh0TGVuZ3RoLCBBRVNfQkxPQ0tfU0laRVMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKChLZXlMZW5ndGggIT0gQUVTX0tFWTEyOF9MRU5HVEgpICYmIChLZXlMZW5ndGggIT0gQUVTX0tFWTE5Ml9MRU5HVEgpICYmIChLZXlMZW5ndGggIT0gQUVTX0tFWTI1Nl9MRU5HVEgpKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NCQ19EZWNyeXB0OiBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkLCAlZCwgb3IgJWQgYnl0ZXMoMTI4LCAxOTIsIG9yIDI1NiBiaXRzKS5cbiIsCi0gICAgICAgICAgICBLZXlMZW5ndGgsIEFFU19LRVkxMjhfTEVOR1RILCBBRVNfS0VZMTkyX0xFTkdUSCwgQUVTX0tFWTI1Nl9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKElWTGVuZ3RoICE9IEFFU19DQkNfSVZfTEVOR1RIKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NCQ19EZWNyeXB0OiBJViBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQgYnl0ZXMoMTI4Yml0cykuXG4iLAotICAgICAgICAgICAgSVZMZW5ndGgsIEFFU19DQkNfSVZfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0KLSAgICAvKgotICAgICAqIDIuIE1haW4gYWxnb3JpdGhtCi0gICAgICogICAgLSBDeXBoZXIgdGV4dCBkaXZpZGUgaW50byBzZXJ2ZXJhbCBibG9ja3MgKDE2IGJ5dGVzL2Jsb2NrKQotICAgICAqICAgIC0gRXhlY3V0ZSBBRVNfRGVjcnlwdCBwcm9jZWR1cmUuCi0gICAgICogICAgLSBSZW1vdmUgcGFkZGluZyBieXRlcywgcGFkZGluZyBzaXplIGlzIHRoZSBsYXN0IGJ5dGUgb2YgcGxhaW4gdGV4dAotICAgICAqLwotICAgIENpcGhlckJsb2NrU3RhcnQgPSAwOwotICAgIFBsYWluQmxvY2tTdGFydCA9IDA7Ci0gICAgd2hpbGUgKChDaXBoZXJUZXh0TGVuZ3RoIC0gQ2lwaGVyQmxvY2tTdGFydCkgPj0gQUVTX0JMT0NLX1NJWkVTKQotICAgIHsKLSAgICAgICAgUGxhaW5CbG9ja1NpemUgPSAqUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0OwotICAgICAgICBBRVNfRGVjcnlwdChDaXBoZXJUZXh0ICsgQ2lwaGVyQmxvY2tTdGFydCwgQUVTX0JMT0NLX1NJWkVTICwgS2V5LCBLZXlMZW5ndGgsIFBsYWluVGV4dCArIFBsYWluQmxvY2tTdGFydCwgJlBsYWluQmxvY2tTaXplKTsKLQotICAgICAgICBpZiAoUGxhaW5CbG9ja1N0YXJ0ID09IDApIHsKLSAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgICAgICBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0ICsgSW5kZXhdIF49IElWW0luZGV4XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IEFFU19CTE9DS19TSVpFUzsgSW5kZXgrKykKLSAgICAgICAgICAgICAgICBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0ICsgSW5kZXhdIF49IENpcGhlclRleHRbQ2lwaGVyQmxvY2tTdGFydCArIEluZGV4IC0gKChVSU5UKSBBRVNfQkxPQ0tfU0laRVMpXTsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgICAgICBDaXBoZXJCbG9ja1N0YXJ0ICs9IEFFU19CTE9DS19TSVpFUzsKLSAgICAgICAgUGxhaW5CbG9ja1N0YXJ0ICs9IFBsYWluQmxvY2tTaXplOwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0KLSAgICBQYWRkaW5nU2l6ZSA9IChVSU5UOCkgUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydCAtMV07Ci0gICAgKlBsYWluVGV4dExlbmd0aCA9IFBsYWluQmxvY2tTdGFydCAtIFBhZGRpbmdTaXplOwotCi19IC8qIEVuZCBvZiBBRVNfQ0JDX0VuY3J5cHQgKi8KLQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQUVTLUNNQUMgZ2VuZXJhdGUgc3Via2V5Ci0KLUFyZ3VtZW50czoKLSAgICBLZXkgICAgICAgIENpcGhlciBrZXkgMTI4IGJpdHMKLSAgICBLZXlMZW5ndGggIFRoZSBsZW5ndGggb2YgQ2lwaGVyIGtleSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgU3ViS2V5MSAgICBTdWJLZXkgMSAxMjggYml0cwotICAgIFN1YktleTIgICAgU3ViS2V5IDIgMTI4IGJpdHMKLQotTm90ZToKLSAgICBSZWZlcmVuY2UgdG8gUkZDIDQ0OTMKLQotICAgIFN0ZXAgMS4gIEwgOj0gQUVTLTEyOChLLCBjb25zdF9aZXJvKTsKLSAgICBTdGVwIDIuICBpZiBNU0IoTCkgaXMgZXF1YWwgdG8gMAotICAgICAgICAgICAgICAgIHRoZW4gICAgSzEgOj0gTCA8PCAxOwotICAgICAgICAgICAgICAgIGVsc2UgICAgSzEgOj0gKEwgPDwgMSkgWE9SIGNvbnN0X1JiOwotICAgIFN0ZXAgMy4gIGlmIE1TQihLMSkgaXMgZXF1YWwgdG8gMAotICAgICAgICAgICAgICAgIHRoZW4gICAgSzIgOj0gSzEgPDwgMTsKLSAgICAgICAgICAgICAgICBlbHNlICAgIEsyIDo9IChLMSA8PCAxKSBYT1IgY29uc3RfUmI7Ci0gICAgU3RlcCA0LiAgcmV0dXJuIEsxLCBLMjsKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQUVTX0NNQUNfR2VuZXJhdGVTdWJLZXkgKAotICAgIElOIFVJTlQ4IEtleVtdLAotICAgIElOIFVJTlQgS2V5TGVuZ3RoLAotICAgIE9VVCBVSU5UOCBTdWJLZXkxW10sCi0gICAgT1VUIFVJTlQ4IFN1YktleTJbXSkKLXsKLSAgICBVSU5UOCBNU0JfTCA9IDAsIE1TQl9LMSA9IDAsIFRvcF9CaXQgPSAwOwotICAgIFVJTlQgIFN1YktleTFfTGVuZ3RoID0gMDsKLSAgICBJTlQgICBJbmRleCA9IDA7Ci0KLSAgICBpZiAoS2V5TGVuZ3RoICE9IEFFU19LRVkxMjhfTEVOR1RIKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQUVTX0NNQUNfR2VuZXJhdGVTdWJLZXk6IGtleSBsZW5ndGggaXMgJWQgYnl0ZXMsIGl0IG11c3QgYmUgJWQgYnl0ZXMoMTI4IGJpdHMpLlxuIiwKLSAgICAgICAgICAgIEtleUxlbmd0aCwgQUVTX0tFWTEyOF9MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBTdGVwIDE6IEwgOj0gQUVTLTEyOChLLCBjb25zdF9aZXJvKTsgKi8KLSAgICBTdWJLZXkxX0xlbmd0aCA9IDE2OwotICAgIEFFU19FbmNyeXB0KENvbnN0X1plcm8sIHNpemVvZihDb25zdF9aZXJvKSwgS2V5LCBLZXlMZW5ndGgsIFN1YktleTEsICZTdWJLZXkxX0xlbmd0aCk7Ci0KLSAgICAvKgotICAgICAqIFN0ZXAgMi4gIGlmIE1TQihMKSBpcyBlcXVhbCB0byAwCi0gICAgICogICAgICAgICAgIHRoZW4gICAgSzEgOj0gTCA8PCAxOwotICAgICAqICAgICAgICAgICBlbHNlICAgIEsxIDo9IChMIDw8IDEpIFhPUiBjb25zdF9SYjsKLSAgICAgKi8KLSAgICBNU0JfTCA9IFN1YktleTFbMF0gJiAweDgwOwotICAgIGZvcihJbmRleCA9IDA7IEluZGV4IDwgMTU7IEluZGV4KyspIHsKLSAgICAgICAgVG9wX0JpdCA9IChTdWJLZXkxW0luZGV4ICsgMV0gJiAweDgwKT8xOjA7Ci0gICAgICAgIFN1YktleTFbSW5kZXhdIDw8PSAxOwotICAgICAgICBTdWJLZXkxW0luZGV4XSB8PSBUb3BfQml0OwotICAgIH0KLSAgICBTdWJLZXkxWzE1XSA8PD0gMTsKLSAgICBpZiAoTVNCX0wgPiAwKSB7Ci0gICAgICAgIGZvcihJbmRleCA9IDA7IEluZGV4IDwgMTY7IEluZGV4KyspCi0gICAgICAgICAgICBTdWJLZXkxW0luZGV4XSBePSBDb25zdF9SYltJbmRleF07Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qCi0gICAgICogU3RlcCAzLiAgaWYgTVNCKEsxKSBpcyBlcXVhbCB0byAwCi0gICAgICogICAgICAgICAgIHRoZW4gICAgSzIgOj0gSzEgPDwgMTsKLSAgICAgKiAgICAgICAgICAgZWxzZSAgICBLMiA6PSAoSzEgPDwgMSkgWE9SIGNvbnN0X1JiOwotICAgICAqLwotICAgIE1TQl9LMSA9IFN1YktleTFbMF0gJiAweDgwOwotICAgIGZvcihJbmRleCA9IDA7IEluZGV4IDwgMTU7IEluZGV4KyspIHsKLSAgICAgICAgVG9wX0JpdCA9IChTdWJLZXkxW0luZGV4ICsgMV0gJiAweDgwKT8xOjA7Ci0gICAgICAgIFN1YktleTJbSW5kZXhdID0gU3ViS2V5MVtJbmRleF0gPDwgMTsKLSAgICAgICAgU3ViS2V5MltJbmRleF0gfD0gVG9wX0JpdDsKLSAgICB9Ci0gICAgU3ViS2V5MlsxNV0gPSBTdWJLZXkxWzE1XSA8PCAxOwotICAgIGlmIChNU0JfSzEgPiAwKSB7Ci0gICAgICAgIGZvcihJbmRleCA9IDA7IEluZGV4IDwgMTY7IEluZGV4KyspCi0gICAgICAgICAgICBTdWJLZXkyW0luZGV4XSBePSBDb25zdF9SYltJbmRleF07Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLX0gLyogRW5kIG9mIEFFU19DTUFDX0dlbmVyYXRlU3ViS2V5ICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBBRVMtQ01BQwotCi1Bcmd1bWVudHM6Ci0gICAgUGxhaW5UZXh0ICAgICAgICBQbGFpbiB0ZXh0Ci0gICAgUGxhaW5UZXh0TGVuZ3RoICBUaGUgbGVuZ3RoIG9mIHBsYWluIHRleHQgaW4gYnl0ZXMKLSAgICBLZXkgICAgICAgICAgICAgIENpcGhlciBrZXksIGl0IG1heSBiZSAxNiwgMjQsIG9yIDMyIGJ5dGVzICgxMjgsIDE5Miwgb3IgMjU2IGJpdHMpCi0gICAgS2V5TGVuZ3RoICAgICAgICBUaGUgbGVuZ3RoIG9mIGNpcGhlciBrZXkgaW4gYnl0ZXMKLSAgICBNQUNUZXh0TGVuZ3RoICAgIFRoZSBsZW5ndGggb2YgYWxsb2NhdGVkIG1lbW9yeSBzcGFjZXMgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIE1BQ1RleHQgICAgICAgTWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlICgxMjgtYml0IHN0cmluZykKLSAgICBNQUNUZXh0TGVuZ3RoIFJldHVybiB0aGUgbGVuZ3RoIG9mIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSBpbiBieXRlcwotCi1Ob3RlOgotICAgIFJlZmVyZW5jZSB0byBSRkMgNDQ5MwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBRVNfQ01BQyAoCi0gICAgSU4gVUlOVDggUGxhaW5UZXh0W10sCi0gICAgSU4gVUlOVCBQbGFpblRleHRMZW5ndGgsCi0gICAgSU4gVUlOVDggS2V5W10sCi0gICAgSU4gVUlOVCBLZXlMZW5ndGgsCi0gICAgT1VUIFVJTlQ4IE1BQ1RleHRbXSwKLSAgICBJTk9VVCBVSU5UICpNQUNUZXh0TGVuZ3RoKQotewotICAgIFVJTlQgIFBsYWluQmxvY2tTdGFydDsKLSAgICBVSU5UOCBYW0FFU19CTE9DS19TSVpFU10sIFlbQUVTX0JMT0NLX1NJWkVTXTsKLSAgICBVSU5UOCBTdWJLZXkxWzE2XTsKLSAgICBVSU5UOCBTdWJLZXkyWzE2XTsKLSAgICBJTlQgWF9MZW5ndGgsIEluZGV4OwotCi0gICAgaWYgKCpNQUNUZXh0TGVuZ3RoIDwgQUVTX01BQ19MRU5HVEgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJBRVNfQ01BQzogTUFDIHRleHQgbGVuZ3RoIGlzIGxlc3MgdGhhbiAlZCBieXRlcykuXG4iLAotICAgICAgICAgICAgQUVTX01BQ19MRU5HVEgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKEtleUxlbmd0aCAhPSBBRVNfS0VZMTI4X0xFTkdUSCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFFU19DTUFDOiBrZXkgbGVuZ3RoIGlzICVkIGJ5dGVzLCBpdCBtdXN0IGJlICVkIGJ5dGVzKDEyOCBiaXRzKS5cbiIsCi0gICAgICAgICAgICBLZXlMZW5ndGgsIEFFU19LRVkxMjhfTEVOR1RIKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyogU3RlcCAxLiAgKEsxLEsyKSA6PSBHZW5lcmF0ZV9TdWJrZXkoSyk7ICovCi0gICAgTmRpc1plcm9NZW1vcnkoU3ViS2V5MSwgMTYpOwotICAgIE5kaXNaZXJvTWVtb3J5KFN1YktleTIsIDE2KTsKLSAgICBBRVNfQ01BQ19HZW5lcmF0ZVN1YktleShLZXksIEtleUxlbmd0aCwgU3ViS2V5MSwgU3ViS2V5Mik7Ci0KLSAgICAvKgotICAgICAqIDIuIE1haW4gYWxnb3JpdGhtCi0gICAgICogICAgLSBQbGFpbiB0ZXh0IGRpdmlkZSBpbnRvIHNlcnZlcmFsIGJsb2NrcyAoMTYgYnl0ZXMvYmxvY2spCi0gICAgICogICAgLSBJZiBwbGFpbiB0ZXh0IGlzIG5vdCBkaXZpZGVkIHdpdGggbm8gcmVtYWluZGVyIGJ5IGJsb2NrLCBwYWRkaW5nIHNpemUgPSAoYmxvY2sgLSByZW1haW5kZXIgcGxhaW4gdGV4dCkKLSAgICAgKiAgICAtIEV4ZWN1dGUgQUVTX0VuY3J5cHQgcHJvY2VkdXJlLgotICAgICAqLwotICAgIFBsYWluQmxvY2tTdGFydCA9IDA7Ci0gICAgTmRpc01vdmVNZW1vcnkoWCwgQ29uc3RfWmVybywgQUVTX0JMT0NLX1NJWkVTKTsKLSAgICB3aGlsZSAoKFBsYWluVGV4dExlbmd0aCAtIFBsYWluQmxvY2tTdGFydCkgPiBBRVNfQkxPQ0tfU0laRVMpCi0gICAgewotICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgWVtJbmRleF0gPSBQbGFpblRleHRbUGxhaW5CbG9ja1N0YXJ0ICsgSW5kZXhdXlhbSW5kZXhdOwotCi0gICAgICAgIFhfTGVuZ3RoID0gc2l6ZW9mKFgpOwotICAgICAgICBBRVNfRW5jcnlwdChZLCBzaXplb2YoWSkgLCBLZXksIEtleUxlbmd0aCwgWCwgJlhfTGVuZ3RoKTsKLSAgICAgICAgUGxhaW5CbG9ja1N0YXJ0ICs9ICgoVUlOVCkgQUVTX0JMT0NLX1NJWkVTKTsKLSAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotICAgIGlmICgoUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0KSA9PSBBRVNfQkxPQ0tfU0laRVMpIHsKLSAgICAgICAgZm9yIChJbmRleCA9IDA7IEluZGV4IDwgQUVTX0JMT0NLX1NJWkVTOyBJbmRleCsrKQotICAgICAgICAgICAgICAgIFlbSW5kZXhdID0gUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydCArIEluZGV4XV5YW0luZGV4XV5TdWJLZXkxW0luZGV4XTsKLSAgICB9IGVsc2UgewotICAgICAgICBOZGlzWmVyb01lbW9yeShZLCBBRVNfQkxPQ0tfU0laRVMpOwotICAgICAgICBOZGlzTW92ZU1lbW9yeShZLCAmUGxhaW5UZXh0W1BsYWluQmxvY2tTdGFydF0sIChQbGFpblRleHRMZW5ndGggLSBQbGFpbkJsb2NrU3RhcnQpKTsKLSAgICAgICAgWVsoUGxhaW5UZXh0TGVuZ3RoIC0gUGxhaW5CbG9ja1N0YXJ0KV0gPSAweDgwOwotICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBBRVNfQkxPQ0tfU0laRVM7IEluZGV4KyspCi0gICAgICAgICAgICAgICAgWVtJbmRleF0gPSBZW0luZGV4XV5YW0luZGV4XV5TdWJLZXkyW0luZGV4XTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIEFFU19FbmNyeXB0KFksIHNpemVvZihZKSAsIEtleSwgS2V5TGVuZ3RoLCBNQUNUZXh0LCBNQUNUZXh0TGVuZ3RoKTsKLX0gLyogRW5kIG9mIEFFU19DTUFDICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9iaWdpbnRlZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9iaWdpbnRlZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNDZjNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfYmlnaW50ZWdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTExOSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCWNtbV9wcm9maWxlLmMKLQotICAgIEFic3RyYWN0OgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNpbmNsdWRlICJjcnlwdF9iaWdpbnRlZ2VyLmgiCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIERFQlVHUFJJTlQoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgZm10LCAjIyBhcmdzKQotI2Vsc2UKLSNkZWZpbmUgREVCVUdQUklOVChmbXQsIGFyZ3MuLi4pIHByaW50ZihmbXQsICMjIGFyZ3MpCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0jZGVmaW5lIFVJTlQzMl9IQklUUyh2YWx1ZSkJKCgodmFsdWUpID4+IDB4MTApICYgMHhmZmZmKQotI2RlZmluZSBVSU5UMzJfTEJJVFModmFsdWUpCSgodmFsdWUpICYgMHhmZmZmKQotI2RlZmluZSBVSU5UMzJfR0VUQllURSh2YWx1ZSwgaW5kZXgpCSgoKHZhbHVlKSA+PiAoKGluZGV4KSo4KSkgJiAweGZmKQotI2RlZmluZSBVSU5UNjRfSEJJVFModmFsdWUpCSgoKHZhbHVlKSA+PiAweDIwKSAmIDB4ZmZmZmZmZmYpCi0jZGVmaW5lIFVJTlQ2NF9MQklUUyh2YWx1ZSkJKCh2YWx1ZSkgJiAweGZmZmZmZmZmKQotCi1zdGF0aWMgVUlOVDggV1BTX0RIX1BfVkFMVUVbMTkyXSA9Ci17Ci0gICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLSAgICAweEM5LCAweDBGLCAweERBLCAweEEyLCAweDIxLCAweDY4LCAweEMyLCAweDM0LAotICAgIDB4QzQsIDB4QzYsIDB4NjIsIDB4OEIsIDB4ODAsIDB4REMsIDB4MUMsIDB4RDEsCi0gICAgMHgyOSwgMHgwMiwgMHg0RSwgMHgwOCwgMHg4QSwgMHg2NywgMHhDQywgMHg3NCwKLSAgICAweDAyLCAweDBCLCAweEJFLCAweEE2LCAweDNCLCAweDEzLCAweDlCLCAweDIyLAotICAgIDB4NTEsIDB4NEEsIDB4MDgsIDB4NzksIDB4OEUsIDB4MzQsIDB4MDQsIDB4REQsCi0gICAgMHhFRiwgMHg5NSwgMHgxOSwgMHhCMywgMHhDRCwgMHgzQSwgMHg0MywgMHgxQiwKLSAgICAweDMwLCAweDJCLCAweDBBLCAweDZELCAweEYyLCAweDVGLCAweDE0LCAweDM3LAotICAgIDB4NEYsIDB4RTEsIDB4MzUsIDB4NkQsIDB4NkQsIDB4NTEsIDB4QzIsIDB4NDUsCi0gICAgMHhFNCwgMHg4NSwgMHhCNSwgMHg3NiwgMHg2MiwgMHg1RSwgMHg3RSwgMHhDNiwKLSAgICAweEY0LCAweDRDLCAweDQyLCAweEU5LCAweEE2LCAweDM3LCAweEVELCAweDZCLAotICAgIDB4MEIsIDB4RkYsIDB4NUMsIDB4QjYsIDB4RjQsIDB4MDYsIDB4QjcsIDB4RUQsCi0gICAgMHhFRSwgMHgzOCwgMHg2QiwgMHhGQiwgMHg1QSwgMHg4OSwgMHg5RiwgMHhBNSwKLSAgICAweEFFLCAweDlGLCAweDI0LCAweDExLCAweDdDLCAweDRCLCAweDFGLCAweEU2LAotICAgIDB4NDksIDB4MjgsIDB4NjYsIDB4NTEsIDB4RUMsIDB4RTQsIDB4NUIsIDB4M0QsCi0gICAgMHhDMiwgMHgwMCwgMHg3QywgMHhCOCwgMHhBMSwgMHg2MywgMHhCRiwgMHgwNSwKLSAgICAweDk4LCAweERBLCAweDQ4LCAweDM2LCAweDFDLCAweDU1LCAweEQzLCAweDlBLAotICAgIDB4NjksIDB4MTYsIDB4M0YsIDB4QTgsIDB4RkQsIDB4MjQsIDB4Q0YsIDB4NUYsCi0gICAgMHg4MywgMHg2NSwgMHg1RCwgMHgyMywgMHhEQywgMHhBMywgMHhBRCwgMHg5NiwKLSAgICAweDFDLCAweDYyLCAweEYzLCAweDU2LCAweDIwLCAweDg1LCAweDUyLCAweEJCLAotICAgIDB4OUUsIDB4RDUsIDB4MjksIDB4MDcsIDB4NzAsIDB4OTYsIDB4OTYsIDB4NkQsCi0gICAgMHg2NywgMHgwQywgMHgzNSwgMHg0RSwgMHg0QSwgMHhCQywgMHg5OCwgMHgwNCwKLSAgICAweEYxLCAweDc0LCAweDZDLCAweDA4LCAweENBLCAweDIzLCAweDczLCAweDI3LAotICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi19OwotCi1zdGF0aWMgVUlOVDggV1BTX0RIX1JfVkFMVUVbMTkzXSA9Ci17Ci0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwKLX07Ci0KLXN0YXRpYyBVSU5UOCBXUFNfREhfWF9WQUxVRVsxODRdID0KLXsKLSAgICAweDM2LCAweGYwLCAweDI1LCAweDVkLCAweGRlLCAweDk3LCAweDNkLCAweGNiLAotICAgIDB4M2IsIDB4MzksIDB4OWQsIDB4NzQsIDB4N2YsIDB4MjMsIDB4ZTMsIDB4MmUsCi0gICAgMHhkNiwgMHhmZCwgMHhiMSwgMHhmNywgMHg3NSwgMHg5OCwgMHgzMywgMHg4YiwKLSAgICAweGZkLCAweGY0LCAweDQxLCAweDU5LCAweGM0LCAweGVjLCAweDY0LCAweGRkLAotICAgIDB4YWUsIDB4YjUsIDB4ZjcsIDB4ODYsIDB4NzEsIDB4Y2IsIDB4ZmIsIDB4MjIsCi0gICAgMHgxMCwgMHg2YSwgMHhlNiwgMHg0YywgMHgzMiwgMHhjNSwgMHhiYywgMHhlNCwKLSAgICAweGNmLCAweGQ0LCAweGY1LCAweDkyLCAweDBkLCAweGEwLCAweGViLCAweGM4LAotICAgIDB4YjAsIDB4MWUsIDB4Y2EsIDB4OTIsIDB4OTIsIDB4YWUsIDB4M2QsIDB4YmEsCi0gICAgMHgxYiwgMHg3YSwgMHg0YSwgMHg4OSwgMHg5ZCwgMHhhMSwgMHg4MSwgMHgzOSwKLSAgICAweDBiLCAweGIzLCAweGJkLCAweDE2LCAweDU5LCAweGM4LCAweDEyLCAweDk0LAotICAgIDB4ZjQsIDB4MDAsIDB4YTMsIDB4NDksIDB4MGIsIDB4ZjksIDB4NDgsIDB4MTIsCi0gICAgMHgxMSwgMHhjNywgMHg5NCwgMHgwNCwgMHhhNSwgMHg3NiwgMHg2MCwgMHg1YSwKLSAgICAweDUxLCAweDYwLCAweGRiLCAweGVlLCAweDgzLCAweGI0LCAweGUwLCAweDE5LAotICAgIDB4YjYsIDB4ZDcsIDB4OTksIDB4YWUsIDB4MTMsIDB4MWIsIDB4YTQsIDB4YzIsCi0gICAgMHgzZCwgMHhmZiwgMHg4MywgMHg0NywgMHg1ZSwgMHg5YywgMHg0MCwgMHhmYSwKLSAgICAweDY3LCAweDI1LCAweGI3LCAweGM5LCAweGUzLCAweGFhLCAweDJjLCAweDY1LAotICAgIDB4OTYsIDB4ZTksIDB4YzAsIDB4NTcsIDB4MDIsIDB4ZGIsIDB4MzAsIDB4YTAsCi0gICAgMHg3YywgMHg5YSwgMHhhMiwgMHhkYywgMHgyMywgMHg1YywgMHg1MiwgMHg2OSwKLSAgICAweGUzLCAweDlkLCAweDBjLCAweGE5LCAweGRmLCAweDdhLCAweGFkLCAweDQ0LAotICAgIDB4NjEsIDB4MmEsIDB4ZDYsIDB4ZjgsIDB4OGYsIDB4NjksIDB4NjksIDB4OTIsCi0gICAgMHg5OCwgMHhmMywgMHhjYSwgMHhiMSwgMHhiNSwgMHg0MywgMHg2NywgMHhmYiwKLSAgICAweDBlLCAweDhiLCAweDkzLCAweGY3LCAweDM1LCAweGRjLCAweDhjLCAweGQ4LAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsCi19OwotCi1zdGF0aWMgVUlOVDggV1BTX0RIX1JSTW9kUF9WQUxVRVsxOTJdID0KLXsKLQkweGUzLCAweGIzLCAweDNjLCAweDcyLCAweDU5LCAweDU0LCAweDFjLCAweDAxLAotCTB4ZWUsIDB4OWMsIDB4OWEsIDB4MjEsIDB4NmMsIDB4YzEsIDB4ZWIsIDB4ZDIsCi0JMHhhZSwgMHg1OSwgMHg0MSwgMHgwNCwgMHg3OSwgMHgyOSwgMHhhMSwgMHhjNywKLQkweGU5LCAweGMzLCAweGZhLCAweDAyLCAweGNjLCAweDI0LCAweDU2LCAweGVmLAotCTB4MTAsIDB4MjYsIDB4MzAsIDB4ZmEsIDB4OWEsIDB4MzYsIDB4YTUsIDB4MWYsCi0JMHg1NywgMHhiNSwgMHg5MywgMHg0OCwgMHg2NywgMHg5OCwgMHg0NCwgMHg2MCwKLQkweDBiLCAweGU0LCAweDk2LCAweDQ3LCAweGE4LCAweDdjLCAweDdiLCAweDM3LAotCTB4ZjgsIDB4MDUsIDB4NjUsIDB4NjQsIDB4OTYsIDB4OWIsIDB4N2YsIDB4MDIsCi0JMHhkYywgMHg1NCwgMHgxYSwgMHg0ZSwgMHhkNCwgMHgwNSwgMHgzZiwgMHg1NCwKLQkweGQ2LCAweDJhLCAweDBlLCAweGVhLCAweGIyLCAweDcwLCAweDUyLCAweDFiLAotCTB4MjIsIDB4YzIsIDB4OTYsIDB4ZTksIDB4ZDQsIDB4NmYsIDB4ZWMsIDB4MjMsCi0JMHg4ZSwgMHgxYSwgMHhiZCwgMHg3OCwgMHgwMiwgMHgyMywgMHhiNywgMHg2YiwKLQkweGI4LCAweGZlLCAweDYxLCAweDIxLCAweDE5LCAweDZiLCAweDdlLCAweDg4LAotCTB4MWMsIDB4NzIsIDB4OWMsIDB4N2UsIDB4MDQsIDB4YjksIDB4ZjcsIDB4OTYsCi0JMHgwNywgMHhjZCwgMHgwYSwgMHg2MiwgMHg4ZSwgMHg0MywgMHg0MSwgMHgzMCwKLQkweDA0LCAweGE1LCAweDQxLCAweGZmLCAweDkzLCAweGFlLCAweDFjLCAweGViLAotCTB4YjAsIDB4MDQsIDB4YTcsIDB4NTAsIDB4ZGIsIDB4MTAsIDB4MmQsIDB4MzksCi0JMHhiOSwgMHgwNSwgMHgyYiwgMHhiNCwgMHg3YSwgMHg1OCwgMHhmMSwgMHg3MCwKLQkweDdlLCAweDhjLCAweGQyLCAweGFjLCAweDk4LCAweGI1LCAweGZiLCAweDYyLAotCTB4OGYsIDB4MjMsIDB4MzEsIDB4YjEsIDB4M2IsIDB4MDEsIDB4ZTAsIDB4MTgsCi0JMHhmNCwgMHg2NiwgMHhlZSwgMHg1ZiwgMHhiYywgMHhkNCwgMHg5ZCwgMHg2OCwKLQkweGQwLCAweGFiLCAweDkyLCAweGUxLCAweDgzLCAweDk3LCAweGYyLCAweDQ1LAotCTB4OGUsIDB4MGUsIDB4M2UsIDB4MjEsIDB4NjcsIDB4NDcsIDB4OGMsIDB4NzMsCi0JMHhmMSwgMHgxNSwgMHhkMiwgMHg3ZCwgMHgzMiwgMHhjNiwgMHg5NSwgMHhlMCwKLX07Ci0KLXN0YXRpYyBVSU5UOCBWYWx1ZV8wWzFdID0gezB4MDB9Owotc3RhdGljIFVJTlQ4IFZhbHVlXzFbMV0gPSB7MHgwMX07Ci1zdGF0aWMgUEJJR19JTlRFR0VSIHBCSV9VID0gTlVMTCwgcEJJX1MgPSBOVUxMLCBwQklfTyA9IE5VTEw7Ci1zdGF0aWMgVUlOVCBCaXRzX09mX1IgPSAwOwotCi0KLVZPSUQgQmlnSW50ZWdlcl9QcmludCAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSkKLXsKLSAgICBpbnQgaSA9IDAsIGogPSAwOwotCi0gICAgaWYgKChwQkkgPT0gTlVMTCkgfHwgKHBCSS0+cEludGVnZXJBcnJheSA9PSBOVUxMKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHN0cmxlbihwQkktPk5hbWUpICE9IDApCi0gICAgICAgIERFQlVHUFJJTlQoIk5hbWU9JXNcbiIsIHBCSS0+TmFtZSk7Ci0gICAgREVCVUdQUklOVCgiQWxsb2NTaXplPSVkLCBBcnJheUxlbmd0aD0lZCwgSW50ZWdlckxlbmd0aD0lZCwgU2lnbmVkPSVkXG4iLCBwQkktPkFsbG9jU2l6ZSwgcEJJLT5BcnJheUxlbmd0aCwgcEJJLT5JbnRlZ2VyTGVuZ3RoLCBwQkktPlNpZ25lZCk7Ci0gICAgZm9yIChpID0gKHBCSS0+QXJyYXlMZW5ndGggLSAxKSwgaiA9IDA7aSA+PTA7aS0tLGorKykgewotICAgICAgICBERUJVR1BSSU5UKCIlMDh4LCAiLCBwQkktPnBJbnRlZ2VyQXJyYXlbaV0pOwotICAgICAgICBpZiAoKGolOCkgPT0gNykKLSAgICAgICAgICAgIERFQlVHUFJJTlQoIlxuIik7Ci0gICAgfSAvKiBFbmQgb2QgZm9yICovCi0gICAgREVCVUdQUklOVCgiXG5cbiIpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9QcmludCAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9Jbml0ICgKLSAgICBJTk9VVCBQQklHX0lOVEVHRVIgKnBCSSkKLXsKLSAgICBpZiAoKnBCSSAhPSBOVUxMKQotICAgICAgICBCaWdJbnRlZ2VyX0ZyZWUocEJJKTsKLQotICAgIGlmICgoKnBCSSA9IChQQklHX0lOVEVHRVIpIGttYWxsb2Moc2l6ZW9mKEJJR19JTlRFR0VSKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9Jbml0OiBhbGxvY2F0ZSAlZCBieXRlcyBtZW1vcnkgZmFpbHVyZS5cbiIsIChzaXplb2YoQklHX0lOVEVHRVIpKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgTmRpc1plcm9NZW1vcnkoKnBCSSwgc2l6ZW9mKEJJR19JTlRFR0VSKSk7Ci0gICAgKCpwQkkpLT5wSW50ZWdlckFycmF5ID0gTlVMTDsKLSAgICAoKnBCSSktPlNpZ25lZCA9IDE7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0luaXQgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfRnJlZV9BbGxvY1NpemUgKAotICAgIElOIFBCSUdfSU5URUdFUiAqcEJJKQotewotICAgIGlmICgoKnBCSSAhPSBOVUxMKSAmJiAoKCpwQkkpLT5wSW50ZWdlckFycmF5ICE9IE5VTEwpKSB7Ci0gICAgICAgIGtmcmVlKCgqcEJJKS0+cEludGVnZXJBcnJheSk7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KCpwQkksIHNpemVvZihCSUdfSU5URUdFUikpOwotICAgICAgICAoKnBCSSktPnBJbnRlZ2VyQXJyYXkgPSBOVUxMOwotICAgICAgICAoKnBCSSktPlNpZ25lZCA9IDE7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfRnJlZV9BbGxvY1NpemUgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfRnJlZSAoCi0gICAgSU4gUEJJR19JTlRFR0VSICpwQkkpCi17Ci0gICAgaWYgKCpwQkkgIT0gTlVMTCkgewotICAgICAgICBCaWdJbnRlZ2VyX0ZyZWVfQWxsb2NTaXplKHBCSSk7Ci0gICAgICAgIGtmcmVlKCpwQkkpOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAqcEJJID0gTlVMTDsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfRnJlZSAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9BbGxvY1NpemUgKAotICAgIElOIFBCSUdfSU5URUdFUiAqcEJJLAotICAgIElOIFVJTlQgTGVuZ3RoKQotewotICAgIFVJTlQgQXJyYXlMZW5ndGggPSAwOwotCi0gICAgaWYgKExlbmd0aCA9PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoKnBCSSA9PSBOVUxMKQotICAgICAgICBCaWdJbnRlZ2VyX0luaXQocEJJKTsKLQotICAgIC8qIENhY3VsYXRlIGFycmF5IHNpemUgKi8KLSAgICBBcnJheUxlbmd0aCA9IExlbmd0aCA+PiAweDI7Ci0gICAgaWYgKChMZW5ndGggJiAweDMpICE9IDApCi0gICAgICAgIEFycmF5TGVuZ3RoKys7Ci0KLSAgICBpZiAoKCgqcEJJKS0+cEludGVnZXJBcnJheSAhPSBOVUxMKSAmJiAoKCpwQkkpLT5BbGxvY1NpemUgPCAoc2l6ZW9mKFVJTlQzMikqQXJyYXlMZW5ndGgpKSkKLSAgICAgICAgQmlnSW50ZWdlcl9GcmVlX0FsbG9jU2l6ZShwQkkpOwotCi0gICAgaWYgKCgqcEJJKS0+cEludGVnZXJBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICgoKCpwQkkpLT5wSW50ZWdlckFycmF5ID0gKFVJTlQzMiAqKSBrbWFsbG9jKHNpemVvZihVSU5UMzIpKkFycmF5TGVuZ3RoLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9BbGxvY1NpemU6IGFsbG9jYXRlICVkIGJ5dGVzIG1lbW9yeSBmYWlsdXJlLlxuIiwgKHNpemVvZihVSU5UMzIpKkFycmF5TGVuZ3RoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgICAgICgqcEJJKS0+QWxsb2NTaXplID0gc2l6ZW9mKFVJTlQzMikqQXJyYXlMZW5ndGg7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIE5kaXNaZXJvTWVtb3J5KCgqcEJJKS0+cEludGVnZXJBcnJheSwgKCpwQkkpLT5BbGxvY1NpemUpOwotICAgICgqcEJJKS0+QXJyYXlMZW5ndGggPSBBcnJheUxlbmd0aDsKLSAgICAoKnBCSSktPkludGVnZXJMZW5ndGggPSBMZW5ndGg7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJKQotewotICAgIElOVCBCSUFycmF5SW5kZXgsIFNoaWZ0SW5kZXggPSAwOwotICAgIFVJTlQ4IHZhbHVlOwotCi0gICAgaWYgKChwQkkgPT0gTlVMTCkgfHwgKHBCSS0+cEludGVnZXJBcnJheSA9PSBOVUxMKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQklBcnJheUluZGV4ID0gcEJJLT5BcnJheUxlbmd0aCAtIDE7Ci0gICAgd2hpbGUgKChCSUFycmF5SW5kZXggPj0gMCkgJiYgKHBCSS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID09IDApKQotCUJJQXJyYXlJbmRleC0tOwotCi0gICAgaWYgKEJJQXJyYXlJbmRleCA+PSAwKSB7Ci0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgU2hpZnRJbmRleCA9IDQ7Ci0gICAgICAgIHdoaWxlICh2YWx1ZSA9PSAwKSB7Ci0gICAgICAgICAgICBTaGlmdEluZGV4LS07Ci0gICAgICAgICAgICB2YWx1ZSA9IFVJTlQzMl9HRVRCWVRFKHBCSS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdLCBTaGlmdEluZGV4KTsKLQl9IC8qIEVuZCBvZiB3aGlsZSAqLwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBpZiAoKEJJQXJyYXlJbmRleCA9PSAtMSkgJiYgKFNoaWZ0SW5kZXggPT0gLTEpKSB7Ci0gICAgICAgIHBCSS0+SW50ZWdlckxlbmd0aCA9IDE7Ci0gICAgICAgIHBCSS0+QXJyYXlMZW5ndGggPSAxOwotICAgICAgICBwQkktPlNpZ25lZCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEJJLT5JbnRlZ2VyTGVuZ3RoID0gKEJJQXJyYXlJbmRleCo0KSArIFNoaWZ0SW5kZXggKyAxOwotICAgICAgICBwQkktPkFycmF5TGVuZ3RoID0gQklBcnJheUluZGV4ICsgMTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0JJMkJpbiAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSwKLSAgICBPVVQgVUlOVDggKnBWYWx1ZSwKLSAgICBPVVQgVUlOVCAqTGVuZ3RoKQotewotICAgIElOVCAgVmFsdWVJbmRleCwgQklBcnJheUluZGV4LCBTaGlmdEluZGV4OwotICAgIFVJTlQzMiAgTnVtYmVyOwotCi0gICAgaWYgKHBCSSA9PSBOVUxMKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfQkkyQmluOiBwQkkgaXMgTlVsbFxuIik7Ci0gICAgICAgICpMZW5ndGggPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmICgqTGVuZ3RoIDwgKHNpemVvZihVSU5UOCkgKiBwQkktPkludGVnZXJMZW5ndGgpKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfQkkyQmluOiBsZW5ndGgoJWQpIGlzIG5vdCBlbm91Z2guXG4iLCAqTGVuZ3RoKTsKLSAgICAgICAgKkxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKHBCSS0+cEludGVnZXJBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICpMZW5ndGggPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cyhwQkkpOwotICAgIGlmICgoU2hpZnRJbmRleCA9IHBCSS0+SW50ZWdlckxlbmd0aCAmIDB4MykgPT0gMCkKLSAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICBCSUFycmF5SW5kZXggPSBwQkktPkFycmF5TGVuZ3RoIC0gMTsKLSAgICBWYWx1ZUluZGV4ID0gMDsKLQotICAgIE51bWJlciA9IHBCSS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdOwotICAgIHdoaWxlIChWYWx1ZUluZGV4IDwgcEJJLT5JbnRlZ2VyTGVuZ3RoKQotICAgIHsKLSAgICAgICAgcFZhbHVlW1ZhbHVlSW5kZXgrK10gPSAoVUlOVDgpIFVJTlQzMl9HRVRCWVRFKE51bWJlciwgU2hpZnRJbmRleCAtIDEpOwotICAgICAgICBpZiAoKC0tU2hpZnRJbmRleCkgPT0gMCkgewotICAgICAgICAgICAgU2hpZnRJbmRleCA9IDQ7Ci0gICAgICAgICAgICBCSUFycmF5SW5kZXgtLTsKLSAgICAgICAgICAgIE51bWJlciA9IHBCSS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgKkxlbmd0aCA9IHBCSS0+SW50ZWdlckxlbmd0aDsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfQkkyQmluICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0JpbjJCSSAoCi0gICAgSU4gVUlOVDggKnBWYWx1ZSwKLSAgICBJTiBVSU5UIExlbmd0aCwKLSAgICBPVVQgUEJJR19JTlRFR0VSICpwQkkpCi17Ci0gICAgSU5UICBWYWx1ZUluZGV4LCBCSUFycmF5SW5kZXgsIFNoaWZ0SW5kZXg7Ci0gICAgVUlOVDMyICBOdW1iZXI7Ci0KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQkksIExlbmd0aCk7Ci0KLSAgICBpZiAoKCpwQkkpLT5wSW50ZWdlckFycmF5ICE9IE5VTEwpIHsKLSAgICAgICAgTnVtYmVyID0gMDsKLSAgICAgICAgaWYgKChTaGlmdEluZGV4ID0gTGVuZ3RoICYgMHgzKSA9PSAwKQotICAgICAgICAgICAgU2hpZnRJbmRleCA9IDQ7Ci0gICAgICAgIEJJQXJyYXlJbmRleCA9ICgqcEJJKS0+QXJyYXlMZW5ndGggLSAxOwotICAgICAgICBWYWx1ZUluZGV4ID0gMDsKLSAgICAgICAgd2hpbGUgKFZhbHVlSW5kZXggPCBMZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE51bWJlciA9IChOdW1iZXIgPDwgOCkgfCAoVUlOVDgpIHBWYWx1ZVtWYWx1ZUluZGV4KytdOwotICAgICAgICAgICAgaWYgKCgtLVNoaWZ0SW5kZXgpID09IDApIHsKLSAgICAgICAgICAgICAgICAoKnBCSSktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA9IE51bWJlcjsKLSAgICAgICAgICAgICAgICBTaGlmdEluZGV4ID0gNDsKLSAgICAgICAgICAgICAgICBCSUFycmF5SW5kZXgtLTsKLSAgICAgICAgICAgICAgICBOdW1iZXIgPSAwOwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgfSAvKiBFbmQgb2Ygd2hpbGUgKi8KLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9CaW4yQkkgKi8KLQotCi0vKiBDYWxjdWxhdGUgdGhlIGJpdHMgb2YgQmlnSW50ZWdlciwgdGhlIGhpZ2hlc3QgYml0IGlzIDEgKi8KLVZPSUQgQmlnSW50ZWdlcl9CaXRzT2ZCSSAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSSwKLSAgICBPVVQgVUlOVCAqQml0c19PZl9QKQotewotICAgIFVJTlQzMiBOdW1iZXIsIEluZGV4OwotCi0gICAgTnVtYmVyID0gcEJJLT5wSW50ZWdlckFycmF5W3BCSS0+QXJyYXlMZW5ndGggLSAxXTsKLSAgICBJbmRleCA9IDA7Ci0gICAgd2hpbGUgKCghKE51bWJlciAmIDB4ODAwMDAwMDApKSAmJiAoSW5kZXggPCAzMikpIHsKLSAgICAgICAgTnVtYmVyIDw8PSAxOwotICAgICAgICBJbmRleCsrOwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgKkJpdHNfT2ZfUCA9IChwQkktPkFycmF5TGVuZ3RoKnNpemVvZihVSU5UMzIpKSAtIEluZGV4OwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9CaXRzT2ZCTiAqLwotCi0KLUlOVCBCaWdJbnRlZ2VyX0dldEJpdFZhbHVlICgKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJLAotICAgIElOIFVJTlQgSW5kZXgpCi17Ci0gICAgVUlOVCBBcnJheSA9IDA7Ci0gICAgVUlOVCBTaGlmdCA9IDA7Ci0KLSAgICBpZiAoSW5kZXggPiAwKSB7Ci0gICAgICAgIEFycmF5ID0gKEluZGV4IC0gMSkgPj4gMHg1OwotICAgICAgICBTaGlmdCA9IChJbmRleCAtIDEpICYgMHgxRjsKLSAgICB9Ci0gICAgaWYgKEFycmF5ID4gcEJJLT5BcnJheUxlbmd0aCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gKChwQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXldID4+IFNoaWZ0KSAmIDB4MSk7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0dldEJpdFZhbHVlICovCi0KLQotVUlOVDggQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQkksCi0gICAgSU4gVUlOVCBJbmRleCkKLXsKLSAgICBVSU5UIEFycmF5ID0gMDsKLSAgICBVSU5UIFNoaWZ0ID0gMDsKLQotICAgIGlmIChJbmRleCA+IDApIHsKLSAgICAgICAgQXJyYXkgPSAoSW5kZXggLSAxKSA+PiAweDI7Ci0gICAgICAgIFNoaWZ0ID0gKEluZGV4IC0gMSkgJiAweDM7Ci0gICAgfQotICAgIGlmICgoQXJyYXkgPiBwQkktPkFycmF5TGVuZ3RoKSB8fCAoSW5kZXggPiBwQkktPkludGVnZXJMZW5ndGgpKQotICAgICAgICByZXR1cm4gMDsKLQotCi0gICAgcmV0dXJuIChVSU5UOCkgVUlOVDMyX0dFVEJZVEUocEJJLT5wSW50ZWdlckFycmF5W0FycmF5XSwgU2hpZnQgLSAxKTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfR2V0Qnl0ZVZhbHVlICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0NvcHkgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfQ29waWVkLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgcEJJX0NvcGllZC0+SW50ZWdlckxlbmd0aCk7Ci0gICAgTmRpc0NvcHlNZW1vcnkoKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheSwgcEJJX0NvcGllZC0+cEludGVnZXJBcnJheSwgKHNpemVvZihVSU5UMzIpKigqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoKSk7Ci0gICAgKCpwQklfUmVzdWx0KS0+QXJyYXlMZW5ndGggPSBwQklfQ29waWVkLT5BcnJheUxlbmd0aDsKLSAgICAoKnBCSV9SZXN1bHQpLT5JbnRlZ2VyTGVuZ3RoID0gcEJJX0NvcGllZC0+SW50ZWdlckxlbmd0aDsKLSAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSBwQklfQ29waWVkLT5TaWduZWQ7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0NvcHkgKi8KLQotCi1JTlQgQmlnSW50ZWdlcl9VbnNpZ25lZENvbXBhcmUgKAotICAgIElOIFBCSUdfSU5URUdFUiBwRmlyc3RPcGVyYW5kLAotICAgIElOIFBCSUdfSU5URUdFUiBwU2Vjb25kT3BlcmFuZCkKLXsKLSAgICBJTlQgQklBcnJheUluZGV4OwotCi0gICAgaWYgKHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggPiBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICBpZiAocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCA8IHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCA9PSBwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCkgewotICAgICAgICBmb3IoQklBcnJheUluZGV4ID0gKHBGaXJzdE9wZXJhbmQtPkFycmF5TGVuZ3RoIC0gMSk7QklBcnJheUluZGV4ID49IDAgOyBCSUFycmF5SW5kZXgtLSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA+IHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICBlbHNlIGlmIChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gPCBwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIHJldHVybiAwOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9Db21wYXJlICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX0FkZCAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgSU5UIENvbXBhcmVSZXN1bHQ7Ci0gICAgVUlOVDMyIEJJQXJyYXlJbmRleDsKLSAgICBVSU5UNjQgU3VtLCBDYXJyeTsKLSAgICBQQklHX0lOVEVHRVIgcFRlbXBCSSA9IE5VTEw7Ci0KLSAgICBpZiAgKChwRmlyc3RPcGVyYW5kID09IE5VTEwpIHx8IChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpCi0gICAgICB8fCAocFNlY29uZE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfQWRkOiBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyBOVUxMLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgaWYgKCpwQklfUmVzdWx0ID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQklfUmVzdWx0KTsKLQotICAgIENvbXBhcmVSZXN1bHQgPSBCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZShwRmlyc3RPcGVyYW5kLCBwU2Vjb25kT3BlcmFuZCk7Ci0gICAgaWYgKChDb21wYXJlUmVzdWx0ID09IDApICYgKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkKSA8IDApKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKHBCSV9SZXN1bHQsIDEpOwotICAgICAgICByZXR1cm4gOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqICBTaW5nZWQgdGFibGUKLSAgICAgKiAgQSArIEIgfHwgQSA+IEIgfHwgQSA8IEIKLSAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogICsgICArIHx8ICAgKyAgIHx8ICAgKwotICAgICAqICArICAgLSB8fCAgICsgICB8fCAgIC0KLSAgICAgKiAgLSAgICsgfHwgICAtICAgfHwgICArCi0gICAgICogIC0gICAtIHx8ICAgLSAgIHx8ICAgLQotICAgICAqLwotICAgIGlmICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkICogcFNlY29uZE9wZXJhbmQtPlNpZ25lZCkgPiAwKSB7Ci0gICAgICAgIGlmIChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoID4gcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCBwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyAxKTsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgICAgICBDYXJyeSA9IDA7Ci0gICAgICAgIGZvciAoQklBcnJheUluZGV4PTA7IEJJQXJyYXlJbmRleCA8ICgqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoOyBCSUFycmF5SW5kZXgrKykKLSAgICAgICAgewotCi0gICAgICAgICAgICBTdW0gPSAwOwotICAgICAgICAgICAgaWYgKEJJQXJyYXlJbmRleCA8IHBGaXJzdE9wZXJhbmQtPkFycmF5TGVuZ3RoKQotICAgICAgICAgICAgICAgIFN1bSArPSAoVUlOVDY0KSBwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF07Ci0KLSAgICAgICAgICAgIGlmIChCSUFycmF5SW5kZXggPCBwU2Vjb25kT3BlcmFuZC0+QXJyYXlMZW5ndGgpCi0gICAgICAgICAgICAgICAgU3VtICs9IChVSU5UNjQpIHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF07Ci0KLSAgICAgICAgICAgIFN1bSArPSBDYXJyeTsKLSAgICAgICAgICAgIENhcnJ5ID0gU3VtICA+PiAzMjsKLSAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA9IChVSU5UMzIpIChTdW0gJiAweGZmZmZmZmZmVUwpOwotICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgKCpwQklfUmVzdWx0KS0+U2lnbmVkID0gcEZpcnN0T3BlcmFuZC0+U2lnbmVkOwotICAgICAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAxKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IC0xKSkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBTZWNvbmRPcGVyYW5kLCAmcFRlbXBCSSk7Ci0gICAgICAgICAgICBwVGVtcEJJLT5TaWduZWQgPSAxOwotICAgICAgICAgICAgQmlnSW50ZWdlcl9TdWIocEZpcnN0T3BlcmFuZCwgcFRlbXBCSSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAtMSkgJiAocFNlY29uZE9wZXJhbmQtPlNpZ25lZCA9PSAxKSkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBGaXJzdE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIHBUZW1wQkktPlNpZ25lZCA9IDE7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX1N1YihwU2Vjb25kT3BlcmFuZCwgcFRlbXBCSSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIEJpZ0ludGVnZXJfRnJlZSgmcFRlbXBCSSk7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX0FkZCAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9TdWIgKAotICAgIElOIFBCSUdfSU5URUdFUiBwRmlyc3RPcGVyYW5kLAotICAgIElOIFBCSUdfSU5URUdFUiBwU2Vjb25kT3BlcmFuZCwKLSAgICBPVVQgUEJJR19JTlRFR0VSICpwQklfUmVzdWx0KQotewotICAgIElOVCBDb21wYXJlUmVzdWx0OwotICAgIFVJTlQzMiBCSUFycmF5SW5kZXgsIENhcnJ5OwotICAgIFBCSUdfSU5URUdFUiBwVGVtcEJJID0gTlVMTCwgcFRlbXBCSTIgPSBOVUxMOwotCi0gICAgaWYgICgocEZpcnN0T3BlcmFuZCA9PSBOVUxMKSB8fCAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheSA9PSBOVUxMKQotICAgICAgfHwgKHBTZWNvbmRPcGVyYW5kID09IE5VTEwpIHx8IChwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheSA9PSBOVUxMKSkgewotICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX1N1YjogZmlyc3Qgb3Igc2Vjb25kIG9wZXJhbmQgaXMgTlVMTC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmICgqcEJJX1Jlc3VsdCA9PSBOVUxMKQotICAgICAgICBCaWdJbnRlZ2VyX0luaXQocEJJX1Jlc3VsdCk7Ci0KLSAgICBDb21wYXJlUmVzdWx0ID0gQmlnSW50ZWdlcl9VbnNpZ25lZENvbXBhcmUocEZpcnN0T3BlcmFuZCwgcFNlY29uZE9wZXJhbmQpOwotICAgIGlmICgoQ29tcGFyZVJlc3VsdCA9PSAwKSAmICgocEZpcnN0T3BlcmFuZC0+U2lnbmVkICogcFNlY29uZE9wZXJhbmQtPlNpZ25lZCkgPiAwKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCAxKTsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9Jbml0KCZwVGVtcEJJKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBUZW1wQkkyKTsKLQotICAgIC8qCi0gICAgICogIFNpbmdlZCB0YWJsZQotICAgICAqICBBIC0gQiB8fCBBID4gQiB8fCBBIDwgQgotICAgICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgKiAgKyAgICsgfHwgICArICAgfHwgICAtCi0gICAgICogICsgICAtIHx8ICAgKyAgIHx8ICAgKwotICAgICAqICAtICAgKyB8fCAgIC0gICB8fCAgIC0KLSAgICAgKiAgLSAgIC0gfHwgICAtICAgfHwgICArCi0gICAgICovCi0gICAgaWYgKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkKSA+IDApIHsKLSAgICAgICAgaWYgKENvbXBhcmVSZXN1bHQgPT0gMSkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBGaXJzdE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQ29weShwU2Vjb25kT3BlcmFuZCwgJnBUZW1wQkkyKTsKLSAgICAgICAgfSBlbHNlIGlmIChDb21wYXJlUmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocFNlY29uZE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfQ29weShwRmlyc3RPcGVyYW5kLCAmcFRlbXBCSTIpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwVGVtcEJJLCBwQklfUmVzdWx0KTsKLSAgICAgICAgQ2FycnkgPSAwOwotICAgICAgICBmb3IgKEJJQXJyYXlJbmRleD0wOyBCSUFycmF5SW5kZXggPCAoKnBCSV9SZXN1bHQpLT5BcnJheUxlbmd0aDsgQklBcnJheUluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChCSUFycmF5SW5kZXggPCBwVGVtcEJJMi0+QXJyYXlMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID49IChwVGVtcEJJMi0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdIC0gQ2FycnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA9ICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSAtIHBUZW1wQkkyLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gLSBDYXJyeTsKLSAgICAgICAgICAgICAgICAgICAgQ2FycnkgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA9IDB4ZmZmZmZmZmZVTCAtIHBUZW1wQkkyLT5wSW50ZWdlckFycmF5W0JJQXJyYXlJbmRleF0gLSBDYXJyeSArICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIENhcnJ5ID0gMTsKLSAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUFycmF5SW5kZXhdID49IENhcnJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSAtPSBDYXJyeTsKLSAgICAgICAgICAgICAgICAgICAgQ2FycnkgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklBcnJheUluZGV4XSA9IDB4ZmZmZmZmZmZVTCAtIENhcnJ5OwotICAgICAgICAgICAgICAgICAgICBDYXJyeSA9IDE7Ci0gICAgICAgICAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgICAgIGlmICAoKChwRmlyc3RPcGVyYW5kLT5TaWduZWQgPT0gMSkgJiAocFNlY29uZE9wZXJhbmQtPlNpZ25lZCA9PSAxKSAmIChDb21wYXJlUmVzdWx0ID09IC0xKSkKLSAgICAgICAgICB8fCAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAtMSkgJiAocFNlY29uZE9wZXJhbmQtPlNpZ25lZCA9PSAtMSkgJiAoQ29tcGFyZVJlc3VsdCA9PSAxKSkpCi0gICAgICAgICAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSAtMTsKLQotICAgICAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAxKSAmIChwU2Vjb25kT3BlcmFuZC0+U2lnbmVkID09IC0xKSkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBTZWNvbmRPcGVyYW5kLCAmcFRlbXBCSSk7Ci0gICAgICAgICAgICBwVGVtcEJJLT5TaWduZWQgPSAxOwotICAgICAgICAgICAgQmlnSW50ZWdlcl9BZGQocEZpcnN0T3BlcmFuZCwgcFRlbXBCSSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHBGaXJzdE9wZXJhbmQtPlNpZ25lZCA9PSAtMSkgJiAocFNlY29uZE9wZXJhbmQtPlNpZ25lZCA9PSAxKSkgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBGaXJzdE9wZXJhbmQsICZwVGVtcEJJKTsKLSAgICAgICAgICAgIHBUZW1wQkktPlNpZ25lZCA9IDE7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0FkZChwVGVtcEJJLCBwU2Vjb25kT3BlcmFuZCwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgICAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSAtMTsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwVGVtcEJJKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBUZW1wQkkyKTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfU3ViICovCi0KLQotVk9JRCBCaWdJbnRlZ2VyX011bCAoCi0gICAgSU4gUEJJR19JTlRFR0VSIHBGaXJzdE9wZXJhbmQsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBTZWNvbmRPcGVyYW5kLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0KLSAgICBVSU5UMzIgQklGaXJzdEluZGV4LCBCSVNlY29uZEluZGV4OwotICAgIFVJTlQ2NCBGaXJzdFZhbHVlLCBTZWNvbmRWYWx1ZSwgU3VtLCBDYXJyeTsKLQotICAgIGlmICAoKHBGaXJzdE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkKLSAgICAgIHx8IChwU2Vjb25kT3BlcmFuZCA9PSBOVUxMKSB8fCAocFNlY29uZE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXkgPT0gTlVMTCkpIHsKLSAgICAgICAgREVCVUdQUklOVCgiQmlnSW50ZWdlcl9NdWw6IGZpcnN0IG9yIHNlY29uZCBvcGVyYW5kIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBUaGUgZmlyc3Qgb3Igc2Vjb25kIG9wZXJhbmQgaXMgemVybyAqLwotICAgIGlmICAoKChwRmlyc3RPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICA9PSAxKSAmJiAocEZpcnN0T3BlcmFuZC0+cEludGVnZXJBcnJheVswXSAgPT0gMCkpCi0gICAgICAgfHwoKHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoID09IDEpICYmIChwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheVswXSA9PSAwKSkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgMSk7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBUaGUgZmlyc3Qgb3Igc2Vjb25kIG9wZXJhbmQgaXMgb25lICovCi0gICAgaWYgICgocEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCAgPT0gMSkgJiYgKHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbMF0gID09IDEpKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQ29weShwU2Vjb25kT3BlcmFuZCwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgICgocFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggID09IDEpICYmIChwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheVswXSAgPT0gMSkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBGaXJzdE9wZXJhbmQsIHBCSV9SZXN1bHQpOwotICAgICAgICBnb3RvIG91dHB1dDsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgcEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoKTsKLQotICAgIGZvciAoQklGaXJzdEluZGV4PTA7IEJJRmlyc3RJbmRleCA8IHBGaXJzdE9wZXJhbmQtPkFycmF5TGVuZ3RoOyBCSUZpcnN0SW5kZXgrKykKLSAgICB7Ci0gICAgICAgIENhcnJ5ID0gMDsKLSAgICAgICAgRmlyc3RWYWx1ZSA9IChVSU5UNjQpIHBGaXJzdE9wZXJhbmQtPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XTsKLSAgICAgICAgaWYgKEZpcnN0VmFsdWUgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKEJJU2Vjb25kSW5kZXg9MDsgQklTZWNvbmRJbmRleCA8IHBTZWNvbmRPcGVyYW5kLT5BcnJheUxlbmd0aDsgQklTZWNvbmRJbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNlY29uZFZhbHVlID0gKChVSU5UNjQpIHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5W0JJU2Vjb25kSW5kZXhdKSpGaXJzdFZhbHVlOwotICAgICAgICAgICAgICAgIFN1bSA9IChVSU5UNjQpICgoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleCArIEJJU2Vjb25kSW5kZXhdICsgU2Vjb25kVmFsdWUgKyBDYXJyeSk7Ci0gICAgICAgICAgICAgICAgQ2FycnkgPSBTdW0gPj4gMzI7Ci0gICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXggKyBCSVNlY29uZEluZGV4XSA9IChVSU5UMzIpIChTdW0gJiAweGZmZmZmZmZmVUwpOwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgICAgICAgICB3aGlsZSAoQ2FycnkgIT0gMCkgewotICAgICAgICAgICAgICAgIFN1bSA9IChVSU5UNjQpICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4ICsgQklTZWNvbmRJbmRleF07Ci0gICAgICAgICAgICAgICAgU3VtICs9IENhcnJ5OwotCi0gICAgICAgICAgICAgICAgQ2FycnkgPSBTdW0gPj4gMzI7Ci0gICAgICAgICAgICAgICAgKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXggKyBCSVNlY29uZEluZGV4XSA9IChVSU5UMzIpIChTdW0gJiAweGZmZmZmZmZmVUwpOwotICAgICAgICAgICAgICAgIEJJU2Vjb25kSW5kZXgrKzsKLSAgICAgICAgICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLW91dHB1dDoKLSAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSBwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkOwotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX011bCAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9TcXVhcmUgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQkksCi0gICAgT1VUIFBCSUdfSU5URUdFUiAqcEJJX1Jlc3VsdCkKLXsKLSAgICBJTlQgQklGaXJzdEluZGV4LCBCSVNlY29uZEluZGV4OwotCVVJTlQzMiBIQklUU19WYWx1ZSwgTEJJVFNfVmFsdWUsIFRlbXAxX1ZhbHVlLCBUZW1wMl9WYWx1ZSwgQ2FycnkzMjsKLQlVSU5UMzIgKlBvaW50X09mX1MsICpQb2ludF9PZl9SZXN1bHQsICpQb2ludF9PZl9CSTsKLSAgICBVSU5UNjQgUmVzdWx0NjRfMSwgUmVzdWx0NjRfMiwgQ2Fycnk2NCwgVGVtcFZhbHVlNjQ7Ci0KLSAgICBpZiAoKHBCSSA9PSBOVUxMKSB8fCAocEJJLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIlx0QmlnSW50ZWdlcl9TcXVhcmU6IHRoZSBvcGVyYW5kIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBUaGUgb3BlcmFuZCBpcyB6ZXJvICovCi0gICAgaWYgICgocEJJLT5JbnRlZ2VyTGVuZ3RoICA9PSAxKSAmJiAocEJJLT5wSW50ZWdlckFycmF5WzBdICA9PSAgMCkpIHsKLSAgICAgICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgMSk7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZShwQklfUmVzdWx0LCAocEJJLT5JbnRlZ2VyTGVuZ3RoKjIpICsgMjApOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfUywgKHBCSS0+SW50ZWdlckxlbmd0aCoyKSArIDIwKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX08sIChwQkktPkludGVnZXJMZW5ndGgqMikgKyAyMCk7Ci0KLSAgICAvKgotICAgICAqIElucHV0OiBwQkkgPSB7YV8wLCBhXzEsIGFfMiwgYV8zLCAuLi4sIGFfbn0KLSAgICAgKiBTdGVwMS4gY2FsY3VsYXRlIGFfMF4yLCBhXzFeMiwgYV8yXjIsIGFfM14yIC4uLiBhX25eMgotICAgICAqLwotCVBvaW50X09mX1MgPSBwQklfUy0+cEludGVnZXJBcnJheTsKLSAgICBmb3IgKEJJRmlyc3RJbmRleD0wOyBCSUZpcnN0SW5kZXggPCBwQkktPkFycmF5TGVuZ3RoOyBCSUZpcnN0SW5kZXgrKykKLSAgICB7Ci0JSEJJVFNfVmFsdWUgPSBVSU5UMzJfSEJJVFMocEJJLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleF0pOwotCQlMQklUU19WYWx1ZSA9IFVJTlQzMl9MQklUUyhwQkktPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSk7Ci0JCVRlbXAxX1ZhbHVlID0gSEJJVFNfVmFsdWUqTEJJVFNfVmFsdWU7Ci0JCVRlbXAyX1ZhbHVlID0gKFRlbXAxX1ZhbHVlICYgMHg3ZmZmKSA8PCAweDExOwotCQlQb2ludF9PZl9TWzBdID0gKExCSVRTX1ZhbHVlKkxCSVRTX1ZhbHVlKSArIFRlbXAyX1ZhbHVlOwotCQlQb2ludF9PZl9TWzFdID0gKEhCSVRTX1ZhbHVlKkhCSVRTX1ZhbHVlKSArICgoVGVtcDFfVmFsdWUgPj4gMHhmKSAmIDB4MWZmZmYpOwotCQlpZiAoUG9pbnRfT2ZfU1swXSA8IFRlbXAyX1ZhbHVlKQotCQkJUG9pbnRfT2ZfU1sxXSArPSAxOwotCi0JCVBvaW50X09mX1MgKz0gMjsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qCi0gICAgICogU3RlcDIuIGNhbGN1bGF0ZSBhXzAqe2FfMSwgYV8yLCBhXzMsIGFfNCwgLi4uLCBhX259Ci0gICAgICovCi0gICAgUG9pbnRfT2ZfQkkgPSBwQkktPnBJbnRlZ2VyQXJyYXk7Ci0gICAgUG9pbnRfT2ZfUmVzdWx0ID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheTsKLSAgICBQb2ludF9PZl9SZXN1bHRbMF0gPSAwOwotICAgIFRlbXBWYWx1ZTY0ID0gKFVJTlQ2NCkgUG9pbnRfT2ZfQklbMF07Ci0gICAgUG9pbnRfT2ZfUmVzdWx0Kys7Ci0gICAgQ2Fycnk2NCA9IDA7Ci0gICAgZm9yIChCSUZpcnN0SW5kZXg9MTsgQklGaXJzdEluZGV4IDwgcEJJLT5BcnJheUxlbmd0aDsgQklGaXJzdEluZGV4KyspCi0gICAgewotICAgICAgICBSZXN1bHQ2NF8xID0gIChVSU5UNjQpIFBvaW50X09mX0JJW0JJRmlyc3RJbmRleF0qVGVtcFZhbHVlNjQ7Ci0gICAgICAgIFJlc3VsdDY0XzEgKz0gQ2Fycnk2NDsKLSAgICAgICAgQ2Fycnk2NCA9IChSZXN1bHQ2NF8xID4+IDMyKTsKLSAgICAgICAgUG9pbnRfT2ZfUmVzdWx0WzBdID0gKFVJTlQzMikgKFJlc3VsdDY0XzEgJiAweGZmZmZmZmZmVUwpOwotICAgICAgICBQb2ludF9PZl9SZXN1bHQrKzsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBpZiAoQ2Fycnk2NCA+IDApCi0gICAgICAgIFBvaW50X09mX1Jlc3VsdFswXSA9IChVSU5UMzIpIChDYXJyeTY0ICYgMHhmZmZmZmZmZlVMKTsKLQotICAgIC8qCi0gICAgICogU3RlcDMuIGNhbGN1bGF0ZQotICAgICAqICAgICAgICAgICBhXzEqe2FfMiwgYV8zLCBhXzQsIC4uLiwgYV9ufQotICAgICAqICAgICAgICAgICBhXzIqe2FfMywgYV80LCBhXzUsIC4uLiwgYV9ufQotICAgICAqICAgICAgICAgICBhXzMqe2FfNCwgYV81LCBhXzYsIC4uLiwgYV9ufQotICAgICAqICAgICAgICAgICBhXzQqe2FfNSwgYV82LCBhXzcsIC4uLiwgYV9ufQotICAgICAqICAgICAgICAgICAuLi4KLSAgICAgKiAgICAgICAgICAgYV9uLTEqe2Ffbn0KLSAgICAgKi8KLSAgICBQb2ludF9PZl9CSSA9IHBCSS0+cEludGVnZXJBcnJheTsKLSAgICBmb3IgKEJJRmlyc3RJbmRleD0xOyBCSUZpcnN0SW5kZXggPCAocEJJLT5BcnJheUxlbmd0aCAtIDEpOyBCSUZpcnN0SW5kZXgrKykKLSAgICB7Ci0gICAgICAgIFBvaW50X09mX1Jlc3VsdCA9ICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXk7Ci0gICAgICAgIFBvaW50X09mX1Jlc3VsdCArPSAoQklGaXJzdEluZGV4KjIpICsgMTsKLSAgICAgICAgVGVtcFZhbHVlNjQgPSAoVUlOVDY0KSBQb2ludF9PZl9CSVtCSUZpcnN0SW5kZXhdOwotICAgICAgICBDYXJyeTY0ID0gMDsKLSAgICAgICAgZm9yIChCSVNlY29uZEluZGV4PShCSUZpcnN0SW5kZXggKyAxKTsgQklTZWNvbmRJbmRleCA8IHBCSS0+QXJyYXlMZW5ndGg7IEJJU2Vjb25kSW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgUmVzdWx0NjRfMSA9ICgoVUlOVDY0KSBQb2ludF9PZl9SZXN1bHRbMF0pICsgQ2Fycnk2NDsKLSAgICAgICAgICAgIFJlc3VsdDY0XzIgPSAoVUlOVDY0KSBQb2ludF9PZl9CSVtCSVNlY29uZEluZGV4XSpUZW1wVmFsdWU2NDsKLSAgICAgICAgICAgIENhcnJ5NjQgPSAoUmVzdWx0NjRfMSA+PiAzMik7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gKFJlc3VsdDY0XzEgJiAweGZmZmZmZmZmVUwpOwotICAgICAgICAgICAgUmVzdWx0NjRfMSA9IFJlc3VsdDY0XzEgKyBSZXN1bHQ2NF8yOwotICAgICAgICAgICAgQ2Fycnk2NCArPSAoUmVzdWx0NjRfMSA+PiAzMik7Ci0gICAgICAgICAgICBQb2ludF9PZl9SZXN1bHRbMF0gPSAoVUlOVDMyKSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgICBQb2ludF9PZl9SZXN1bHQrKzsKLSAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgICAgIGlmIChDYXJyeTY0ID4gMCkKLSAgICAgICAgICAgIFBvaW50X09mX1Jlc3VsdFswXSArPSAoVUlOVDMyKSAoQ2Fycnk2NCAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZXN1bHQpOwotICAgIEJpZ0ludGVnZXJfQ29weSgqcEJJX1Jlc3VsdCwgJnBCSV9PKTsKLQotICAgIENhcnJ5MzIgPSAwOwotCWZvciAoQklGaXJzdEluZGV4PTA7IEJJRmlyc3RJbmRleCA8IHBCSV9PLT5BcnJheUxlbmd0aDsgQklGaXJzdEluZGV4KyspIHsKLSAgICAgICAgcEJJX08tPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSA9IChwQklfTy0+cEludGVnZXJBcnJheVtCSUZpcnN0SW5kZXhdIDw8IDEpIHwgQ2FycnkzMjsKLSAgICAgICAgaWYgKHBCSV9PLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleF0gPCAoKnBCSV9SZXN1bHQpLT5wSW50ZWdlckFycmF5W0JJRmlyc3RJbmRleF0pCi0gICAgICAgICAgICBDYXJyeTMyID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQ2FycnkzMiA9IDA7Ci0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgcEJJX08tPnBJbnRlZ2VyQXJyYXlbQklGaXJzdEluZGV4XSA9IENhcnJ5MzI7Ci0gICAgcEJJX08tPkludGVnZXJMZW5ndGgrKzsKLSAgICBwQklfTy0+QXJyYXlMZW5ndGgrKzsKLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMocEJJX08pOwotCi0gICAgQmlnSW50ZWdlcl9BZGQocEJJX08sIHBCSV9TLCBwQklfUmVzdWx0KTsKLW91dHB1dDoKLSAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSAxOwotICAgIEJpZ0ludGVnZXJfQ2xlYXJIaWdoQml0cygqcEJJX1Jlc3VsdCk7Ci19IC8qIEVuZCBvZiBCaWdJbnRlZ2VyX1NxdWFyZSAqLwotCi0KLVZPSUQgQmlnSW50ZWdlcl9EaXYgKAotICAgIElOIFBCSUdfSU5URUdFUiBwRmlyc3RPcGVyYW5kLAotICAgIElOIFBCSUdfSU5URUdFUiBwU2Vjb25kT3BlcmFuZCwKLSAgICBPVVQgUEJJR19JTlRFR0VSICpwQklfUmVzdWx0LAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZW1haW5kZXIpCi17Ci0gICAgSU5UIENvbXBhcmVSZXN1bHQ7Ci0gICAgSU5UIEluZGV4LCBNdWxJbmRleCwgQ29tcHV0ZVNpemU7Ci0gICAgVUlOVDMyIE11bFN0YXJ0OwotICAgIFVJTlQgQWxsb2NMZW5ndGgsIEFycmF5SW5kZXgsIFNoaWZ0SW5kZXg7Ci0gICAgUEJJR19JTlRFR0VSIHBUZW1wQkkgPSBOVUxMLCBwVGVtcEJJMiA9IE5VTEwsIHBNdWxCSSA9IE5VTEw7Ci0gICAgVUlOVDggU2Vjb25kSGlnaEJ5dGU7Ci0KLSAgICBpZiAgKChwRmlyc3RPcGVyYW5kID09IE5VTEwpIHx8IChwRmlyc3RPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpCi0gICAgICB8fCAocFNlY29uZE9wZXJhbmQgPT0gTlVMTCkgfHwgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5ID09IE5VTEwpKSB7Ci0gICAgICAgIERFQlVHUFJJTlQoIkJpZ0ludGVnZXJfRGl2OiBmaXJzdCBvciBzZWNvbmQgb3BlcmFuZCBpcyBOVUxMLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyogVGhlIHNlY29uZCBvcGVyYW5kIGlzIHplcm8gKi8KLSAgICBpZiAoKHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoID09IDEpICYmIChwU2Vjb25kT3BlcmFuZC0+cEludGVnZXJBcnJheVswXSA9PSAwKSkgewotICAgICAgICBERUJVR1BSSU5UKCJCaWdJbnRlZ2VyX0Rpdjogc2Vjb25kIG9wZXJhbmQgaXMgemVyby5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmICgqcEJJX1Jlc3VsdCA9PSBOVUxMKQotICAgICAgICBCaWdJbnRlZ2VyX0luaXQocEJJX1Jlc3VsdCk7Ci0gICAgaWYgKCpwQklfUmVtYWluZGVyID09IE5VTEwpCi0gICAgICAgIEJpZ0ludGVnZXJfSW5pdChwQklfUmVtYWluZGVyKTsKLQotICAgIC8qIFRoZSBzZWNvbmQgb3BlcmFuZCBpcyBvbmUgKi8KLSAgICBpZiAgKChwU2Vjb25kT3BlcmFuZC0+SW50ZWdlckxlbmd0aCAgPT0gMSkgJiYgKHBTZWNvbmRPcGVyYW5kLT5wSW50ZWdlckFycmF5WzBdICA9PSAxKSkgewotICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIEJpZ0ludGVnZXJfQmluMkJJKFZhbHVlXzAsIDEsIHBCSV9SZW1haW5kZXIpOwotICAgICAgICBnb3RvIG91dHB1dDsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgQ29tcGFyZVJlc3VsdCA9IEJpZ0ludGVnZXJfVW5zaWduZWRDb21wYXJlKHBGaXJzdE9wZXJhbmQsIHBTZWNvbmRPcGVyYW5kKTsKLSAgICBpZiAoQ29tcGFyZVJlc3VsdCA9PSAwKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQmluMkJJKFZhbHVlXzEsIDEsIHBCSV9SZXN1bHQpOwotICAgICAgICBCaWdJbnRlZ2VyX0JpbjJCSShWYWx1ZV8wLCAxLCBwQklfUmVtYWluZGVyKTsKLSAgICAgICAgZ290byBvdXRwdXQ7Ci0gICAgfSBlbHNlIGlmIChDb21wYXJlUmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfQmluMkJJKFZhbHVlXzAsIDEsIHBCSV9SZXN1bHQpOwotICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgcEJJX1JlbWFpbmRlcik7Ci0gICAgICAgIGdvdG8gb3V0cHV0OwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgcEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCAtIHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgMSk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1JlbWFpbmRlciwgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpOwotCi0gICAgQWxsb2NMZW5ndGggPSAoVUlOVCkgKHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggPDwgMSk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBUZW1wQkksIEFsbG9jTGVuZ3RoKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcFRlbXBCSTIsIEFsbG9jTGVuZ3RoKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcE11bEJJLCBBbGxvY0xlbmd0aCk7Ci0KLSAgICBCaWdJbnRlZ2VyX0NvcHkocEZpcnN0T3BlcmFuZCwgcEJJX1JlbWFpbmRlcik7Ci0gICAgU2Vjb25kSGlnaEJ5dGUgPSBCaWdJbnRlZ2VyX0dldEJ5dGVWYWx1ZShwU2Vjb25kT3BlcmFuZCwgcFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGgpOwotICAgIENvbXB1dGVTaXplID0gKElOVCkgcEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCAtIHBTZWNvbmRPcGVyYW5kLT5JbnRlZ2VyTGVuZ3RoICsgMTsKLSAgICBmb3IgKEluZGV4ID0gKElOVCkgQ29tcHV0ZVNpemU7SW5kZXggPj0gMDtJbmRleC0tKSB7Ci0gICAgICAgIGlmIChCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZSgqcEJJX1JlbWFpbmRlciwgcFNlY29uZE9wZXJhbmQpID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCgocFNlY29uZE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyBJbmRleCkgLSAoKnBCSV9SZW1haW5kZXIpLT5JbnRlZ2VyTGVuZ3RoKSA8PSAxKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcE11bEJJLCBJbmRleCArIDEpOwotICAgICAgICAgICAgQXJyYXlJbmRleCA9IDA7Ci0gICAgICAgICAgICBpZiAoSW5kZXggPiAwKQotICAgICAgICAgICAgICAgIEFycmF5SW5kZXggPSAoVUlOVCkgKEluZGV4IC0gMSkgPj4gMiA7Ci0gICAgICAgICAgICBTaGlmdEluZGV4ID0gKEluZGV4ICYgMHgwMyk7Ci0gICAgICAgICAgICBpZiAoU2hpZnRJbmRleCA9PSAwKQotICAgICAgICAgICAgICAgIFNoaWZ0SW5kZXggPSA0OwotICAgICAgICAgICAgU2hpZnRJbmRleC0tOwotICAgICAgICAgICAgTXVsU3RhcnQgPSAwOwotICAgICAgICAgICAgTXVsU3RhcnQgPSAoQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUoKCpwQklfUmVtYWluZGVyKSwgcEZpcnN0T3BlcmFuZC0+SW50ZWdlckxlbmd0aCArIEluZGV4IC0gQ29tcHV0ZVNpemUgKyAxKSAmIDB4RkYpIDw8IDg7Ci0gICAgICAgICAgICBNdWxTdGFydCA9IE11bFN0YXJ0IHwgKEJpZ0ludGVnZXJfR2V0Qnl0ZVZhbHVlKCgqcEJJX1JlbWFpbmRlciksIHBGaXJzdE9wZXJhbmQtPkludGVnZXJMZW5ndGggKyBJbmRleCAtIENvbXB1dGVTaXplKSAmIDB4RkYpOwotICAgICAgICAgICAgaWYgKE11bFN0YXJ0IDwgKFVJTlQzMikgU2Vjb25kSGlnaEJ5dGUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIE11bFN0YXJ0ID0gTXVsU3RhcnQgLyAoVUlOVDMyKSBTZWNvbmRIaWdoQnl0ZTsKLQotICAgICAgICAgICAgaWYgKE11bFN0YXJ0ID4gMHhGRikKLSAgICAgICAgICAgICAgICBNdWxTdGFydCA9IDB4MTAwOwotCi0gICAgICAgICAgICBmb3IgKE11bEluZGV4ID0gKElOVCkgTXVsU3RhcnQ7TXVsSW5kZXggPD0gMHgxMDE7TXVsSW5kZXgrKykgeyAvKiAweEZGRkYgLyAweEZGID0gMHgxMDEgKi8KLSAgICAgICAgICAgICAgICBpZiAoKE11bEluZGV4ID4gMHhGRikgJiYgKFNoaWZ0SW5kZXggPT0gMykpCi0gICAgICAgICAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleCArIDFdID0gMHgwMTsKLSAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleF0gPSAoKFVJTlQpIE11bEluZGV4IDw8ICg4KlNoaWZ0SW5kZXgpKTsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX011bChwU2Vjb25kT3BlcmFuZCwgcE11bEJJICwgJnBUZW1wQkkpOwotICAgICAgICAgICAgICAgIENvbXBhcmVSZXN1bHQgPSBCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZSgqcEJJX1JlbWFpbmRlciwgcFRlbXBCSSk7Ci0gICAgICAgICAgICAgICAgaWYgKENvbXBhcmVSZXN1bHQgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNdWxJbmRleCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21wYXJlUmVzdWx0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE11bEluZGV4ID09IDB4MTAwKSAmJiAoU2hpZnRJbmRleCA9PSAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE11bEJJLT5wSW50ZWdlckFycmF5W0FycmF5SW5kZXggKyAxXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE11bEJJLT5wSW50ZWdlckFycmF5W0FycmF5SW5kZXhdID0gKChVSU5UKSAoTXVsSW5kZXggLSAxKSA8PCAoOCpTaGlmdEluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX011bChwU2Vjb25kT3BlcmFuZCwgcE11bEJJLCAmcFRlbXBCSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX1N1YigqcEJJX1JlbWFpbmRlciwgcFRlbXBCSSwgJnBUZW1wQkkyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXJfQ29weShwVGVtcEJJMiwgcEJJX1JlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyX0FkZCgqcEJJX1Jlc3VsdCwgcE11bEJJLCAmcFRlbXBCSTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlcl9Db3B5KHBUZW1wQkkyLCBwQklfUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgICAgICAgICAgICAgIGlmICgoTXVsSW5kZXggPj0gMHgxMDApICYmIChTaGlmdEluZGV4ID09IDMpKQotICAgICAgICAgICAgICAgICAgIHBNdWxCSS0+cEludGVnZXJBcnJheVtBcnJheUluZGV4KytdID0gMDsKLSAgICAgICAgICAgICAgICBwTXVsQkktPnBJbnRlZ2VyQXJyYXlbQXJyYXlJbmRleF0gPSAwOwotICAgICAgICAgICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBUZW1wQkkpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcFRlbXBCSTIpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcE11bEJJKTsKLW91dHB1dDoKLSAgICAoKnBCSV9SZXN1bHQpLT5TaWduZWQgPSBwRmlyc3RPcGVyYW5kLT5TaWduZWQgKiBwU2Vjb25kT3BlcmFuZC0+U2lnbmVkOwotICAgICgqcEJJX1JlbWFpbmRlciktPlNpZ25lZCA9IHBGaXJzdE9wZXJhbmQtPlNpZ25lZCAqIHBTZWNvbmRPcGVyYW5kLT5TaWduZWQ7Ci0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLSAgICBCaWdJbnRlZ2VyX0NsZWFySGlnaEJpdHMoKnBCSV9SZW1haW5kZXIpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9EaXYgKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24gKAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfQSwKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJX1AsCi0gICAgIElOIFBCSUdfSU5URUdFUiBwQklfUiwKLSAgICBPVVQgUEJJR19JTlRFR0VSICpwQklfUmVzdWx0KQotewotICAgIFVJTlQzMiAqUG9pbnRfUCwgKlBvaW50X1Jlc3VsdDsKLSAgICBVSU5UMzIgTG9vcENvdW50OwotICAgIFVJTlQ2NCBSZXN1bHQ2NF8xLCBSZXN1bHQ2NF8yLCBDYXJyeTY0LCBUZW1wVmFsdWU2NDsKLSAgICBJTlQgRmlyc3RMb29wLCBTZWNvbmRMb29wOwotCi0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUocEJJX1Jlc3VsdCwgcEJJX0EtPkludGVnZXJMZW5ndGgrIHBCSV9QLT5JbnRlZ2VyTGVuZ3RoICsgMjApOwotICAgIEJpZ0ludGVnZXJfQ29weShwQklfQSwgcEJJX1Jlc3VsdCk7Ci0KLSAgICBQb2ludF9QID0gcEJJX1AtPnBJbnRlZ2VyQXJyYXk7Ci0gICAgUG9pbnRfUmVzdWx0ID0gKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheTsKLQotICAgIExvb3BDb3VudCA9IEJpdHNfT2ZfUiA+PiAweDU7Ci0gICAgZm9yIChGaXJzdExvb3AgPSAwO0ZpcnN0TG9vcCA8IExvb3BDb3VudDtGaXJzdExvb3ArKykgewotICAgICAgICBDYXJyeTY0ID0gMDsKLSAgICAgICAgVGVtcFZhbHVlNjQgPSAoVUlOVDY0KSBQb2ludF9SZXN1bHRbMF07Ci0gICAgICAgIGZvciAoU2Vjb25kTG9vcCA9IDA7U2Vjb25kTG9vcCA8IHBCSV9QLT5BcnJheUxlbmd0aDtTZWNvbmRMb29wKyspIHsKLSAgICAgICAgICAgIFJlc3VsdDY0XzEgPSAoKFVJTlQ2NCkgUG9pbnRfUmVzdWx0W1NlY29uZExvb3BdKSArIENhcnJ5NjQ7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8yID0gKFVJTlQ2NCkgUG9pbnRfUFtTZWNvbmRMb29wXSpUZW1wVmFsdWU2NDsKLSAgICAgICAgICAgIENhcnJ5NjQgPSAoUmVzdWx0NjRfMSA+PiAzMik7Ci0gICAgICAgICAgICBSZXN1bHQ2NF8xID0gKFJlc3VsdDY0XzEgJiAweGZmZmZmZmZmVUwpOwotICAgICAgICAgICAgUmVzdWx0NjRfMSA9IFJlc3VsdDY0XzEgKyBSZXN1bHQ2NF8yOwotICAgICAgICAgICAgQ2Fycnk2NCArPSAoUmVzdWx0NjRfMSA+PiAzMik7Ci0gICAgICAgICAgICBQb2ludF9SZXN1bHRbU2Vjb25kTG9vcF0gPSAoVUlOVDMyKSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotICAgICAgICB3aGlsZSAoQ2Fycnk2NCAhPSAwKSB7Ci0gICAgICAgICAgUmVzdWx0NjRfMSA9ICgoVUlOVDY0KSBQb2ludF9SZXN1bHRbU2Vjb25kTG9vcF0pICsgQ2Fycnk2NDsKLSAgICAgICAgICBDYXJyeTY0ID0gUmVzdWx0NjRfMSA+PiAzMjsKLSAgICAgICAgICBQb2ludF9SZXN1bHRbU2Vjb25kTG9vcF0gPSAoVUlOVDMyKSAoUmVzdWx0NjRfMSAmIDB4ZmZmZmZmZmZVTCk7Ci0gICAgICAgICAgU2Vjb25kTG9vcCsrOwotICAgICAgICB9IC8qIEVuZCBvZiB3aGlsZSAqLwotICAgICAgICBQb2ludF9SZXN1bHQrKzsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIGZvciAoRmlyc3RMb29wID0gMDtGaXJzdExvb3AgPD0gTG9vcENvdW50O0ZpcnN0TG9vcCsrKSB7Ci0gICAgICAgICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbRmlyc3RMb29wXSA9ICgqcEJJX1Jlc3VsdCktPnBJbnRlZ2VyQXJyYXlbRmlyc3RMb29wICsgTG9vcENvdW50XTsKLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBpZiAoKCpwQklfUmVzdWx0KS0+cEludGVnZXJBcnJheVtMb29wQ291bnRdICE9IDApCi0gICAgICAgICgqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoID0gTG9vcENvdW50ICsgMTsKLSAgICBlbHNlCi0gICAgICAgICgqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoID0gTG9vcENvdW50OwotCi0gICAgKCpwQklfUmVzdWx0KS0+SW50ZWdlckxlbmd0aCA9ICgqcEJJX1Jlc3VsdCktPkFycmF5TGVuZ3RoKjQ7Ci0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLQotICAgIGlmIChCaWdJbnRlZ2VyX1Vuc2lnbmVkQ29tcGFyZSgqcEJJX1Jlc3VsdCwgcEJJX1ApID49IDApIHsKLSAgICAgICAgQmlnSW50ZWdlcl9TdWIoKnBCSV9SZXN1bHQsIHBCSV9QLCAmcEJJX1UpOwotICAgICAgICBCaWdJbnRlZ2VyX0NvcHkocEJJX1UsIHBCSV9SZXN1bHQpOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgQmlnSW50ZWdlcl9DbGVhckhpZ2hCaXRzKCpwQklfUmVzdWx0KTsKLX0gLyogRW5kIG9mIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24gKi8KLQotCi1WT0lEIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9FeHBNb2QgKAotICAgIElOIFBCSUdfSU5URUdFUiBwQklfRywKLSAgICBJTiBQQklHX0lOVEVHRVIgcEJJX0UsCi0gICAgSU4gUEJJR19JTlRFR0VSIHBCSV9QLAotICAgIE9VVCBQQklHX0lOVEVHRVIgKnBCSV9SZXN1bHQpCi17Ci0gICAgVUlOVCBCaXRzX09mX1A7Ci0gICAgVUlOVDMyIEluZGV4LCBJbmRleDIsIEFsbG9jTGVuZ3RoOwotCVVJTlQzMiBTbGlkaW5nX1ZhbHVlICwgU2xpZGluZ19IaWdoVmFsdWUsIFNsaWRpbmdfTG93VmFsdWU7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9UZW1wMSA9IE5VTEwsIHBCSV9UZW1wMiA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9YID0gTlVMTCwgcEJJX1IgPSBOVUxMLCBwQklfUlIgPSBOVUxMLCBwQklfMSA9IE5VTEw7Ci0gICAgQklHX0lOVEVHRVIgKnBCSV9BW1NMSURJTkdfV0lORE9XXTsKLSAgICBVSU5UOCAqcFJWYWx1ZSA9IE5VTEw7Ci0KLSAgICBBbGxvY0xlbmd0aCA9IChwQklfRy0+SW50ZWdlckxlbmd0aCArIHBCSV9FLT5JbnRlZ2VyTGVuZ3RoICsgcEJJX1AtPkludGVnZXJMZW5ndGggKyAzMDApOwotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfVGVtcDEsIEFsbG9jTGVuZ3RoKTsKLSAgICBCaWdJbnRlZ2VyX0FsbG9jU2l6ZSgmcEJJX1RlbXAyLCBBbGxvY0xlbmd0aCk7Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIGJpdHMgb2YgUCBhbmQgRSwgdGhlIGhpZ2hlc3QgYml0IGlzIDEgKi8KLSAgICBCaWdJbnRlZ2VyX0JpdHNPZkJJKHBCSV9QLCAmQml0c19PZl9QKTsKLQotICAgIGlmICgocEJJX0UtPkludGVnZXJMZW5ndGggPT0gMSkgJiYgKHBCSV9FLT5wSW50ZWdlckFycmF5WzBdID09IDEpKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfRGl2KHBCSV9HLCBwQklfUCwgJnBCSV9UZW1wMSwgcEJJX1Jlc3VsdCk7Ci0gICAgICAgIGdvdG8gbWVtb3J5X2ZyZWU7Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmICgocEJJX0UtPkludGVnZXJMZW5ndGggPT0gMSkgJiYgKHBCSV9FLT5wSW50ZWdlckFycmF5WzBdID09IDIpKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9HLCBwQklfRywgJnBCSV9UZW1wMSk7Ci0gICAgICAgIEJpZ0ludGVnZXJfRGl2KHBCSV9UZW1wMSwgcEJJX1AsICZwQklfVGVtcDIsIHBCSV9SZXN1bHQpOwotICAgICAgICBnb3RvIG1lbW9yeV9mcmVlOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqIE1haW4gYWxnb3JpdGhtCi0gICAgICovCi0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfUik7Ci0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfUlIpOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFZhbHVlXzEsIDEsICZwQklfMSk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9YLCBBbGxvY0xlbmd0aCk7Ci0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9VLCBBbGxvY0xlbmd0aCk7IC8vIGZvciBCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uCi0gICAgQmlnSW50ZWdlcl9BbGxvY1NpemUoJnBCSV9TLCBBbGxvY0xlbmd0aCk7IC8vIGZvciBCaWdJbnRlZ2VyX1NxdWFyZQotICAgIEJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfTywgQWxsb2NMZW5ndGgpOyAvLyBmb3IgQmlnSW50ZWdlcl9TcXVhcmUKLQotICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IFNMSURJTkdfV0lORE9XOyBJbmRleCsrKSB7Ci0gICAgICAgIHBCSV9BW0luZGV4XSA9IE5VTEw7Ci0JCUJpZ0ludGVnZXJfQWxsb2NTaXplKCZwQklfQVtJbmRleF0sIDE5Myk7Ci0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0gICAgQmlnSW50ZWdlcl9CaW4yQkkoV1BTX0RIX1BfVkFMVUUsIDE5MiwgJnBCSV9UZW1wMSk7Ci0gICAgaWYgKE5kaXNDbXBNZW1vcnkocEJJX1AtPnBJbnRlZ2VyQXJyYXksIHBCSV9UZW1wMS0+cEludGVnZXJBcnJheSwgcEJJX1AtPkludGVnZXJMZW5ndGgpID09IDApIHsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoV1BTX0RIX1hfVkFMVUUsIDE4NCwgJnBCSV9YKTsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoV1BTX0RIX1JfVkFMVUUsIDE5MywgJnBCSV9SKTsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkoV1BTX0RIX1JSTW9kUF9WQUxVRSwgMTkyLCAmcEJJX1JSKTsKLSAgICAgICAgQml0c19PZl9SID0gMTUzNzsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKEJpdHNfT2ZfUCAlIDgpID09IDApIHsKLSAgICAgICAgICAgIEFsbG9jTGVuZ3RoID0gcEJJX1AtPkludGVnZXJMZW5ndGggKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQWxsb2NMZW5ndGggPSBwQklfUC0+SW50ZWdlckxlbmd0aDsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgcFJWYWx1ZSA9IChVSU5UOCAqKSBrbWFsbG9jKHNpemVvZihVSU5UOCkqQWxsb2NMZW5ndGgsIEdGUF9BVE9NSUMpOwotCWlmIChwUlZhbHVlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOkFsbG9jIG1lbW9yeSBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlnb3RvIG1lbW9yeV9mcmVlOwotCX0KLSAgICAgICAgTmRpc1plcm9NZW1vcnkocFJWYWx1ZSwgc2l6ZW9mKFVJTlQ4KSpBbGxvY0xlbmd0aCk7Ci0gICAgICAgIHBSVmFsdWVbMF0gPSAoVUlOVDgpICgxIDw8IChCaXRzX09mX1AgJiAweDcpKTsKLSAgICAgICAgQmlnSW50ZWdlcl9CaW4yQkkocFJWYWx1ZSwgQWxsb2NMZW5ndGggLCAmcEJJX1IpOwotCi0gICAgICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9SLCBwQklfUiwgJnBCSV9UZW1wMSk7Ci0gICAgICAgIEJpZ0ludGVnZXJfRGl2KHBCSV9UZW1wMSwgcEJJX1AsICZwQklfQVsxXSwgJnBCSV9SUik7Ci0KLSAgICAgICAgLyogWCA9IDEqUiAobW9kIFApICovCi0gICAgICAgIEJpZ0ludGVnZXJfRGl2KHBCSV9SLCBwQklfUCwgJnBCSV9UZW1wMiwgJnBCSV9YKTsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyogQSA9IEcqUiAobW9kIFApID0+IEEgPSBNb25Nb2QoRywgUl4yIG1vZCBQKSAqLwotICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9HLCBwQklfUlIsICZwQklfVGVtcDEpOwotICAgIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9SZWR1Y3Rpb24ocEJJX1RlbXAxLCBwQklfUCAsIHBCSV9SLCAmcEJJX0FbMV0pOwotICAgIGZvciAoSW5kZXggPSAyOyBJbmRleCA8IFNMSURJTkdfV0lORE9XOyBJbmRleCsrKSB7Ci0gICAgICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9BW0luZGV4IC0gMV0sIHBCSV9BWzFdLCAmcEJJX1RlbXAxKTsKLQkgICAgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbihwQklfVGVtcDEsIHBCSV9QLCBwQklfUiwgJnBCSV9BW0luZGV4XSk7Ci0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBmb3IgKEluZGV4ID0gcEJJX0UtPkludGVnZXJMZW5ndGggOyBJbmRleCA+IDAgOyBJbmRleC0tKSB7Ci0gICAgICAgIGZvciAoSW5kZXgyID0gMDsgSW5kZXgyIDwgNCA7IEluZGV4MisrKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX1NxdWFyZShwQklfWCwgJnBCSV9UZW1wMSk7Ci0JCQlCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9UZW1wMSwgcEJJX1AsIHBCSV9SLCAmcEJJX1gpOwotCSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotCQlTbGlkaW5nX1ZhbHVlID0gQmlnSW50ZWdlcl9HZXRCeXRlVmFsdWUocEJJX0UsIEluZGV4KTsKLQkJU2xpZGluZ19IaWdoVmFsdWUgPSAoU2xpZGluZ19WYWx1ZSA+PiA0KTsKLQkJaWYgKFNsaWRpbmdfSGlnaFZhbHVlICE9IDApIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXJfTXVsKHBCSV9BW1NsaWRpbmdfSGlnaFZhbHVlXSwgcEJJX1gsICZwQklfVGVtcDEpOwotCQkJQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbihwQklfVGVtcDEsIHBCSV9QLCBwQklfUiwgJnBCSV9YKTsKLQkJfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgICAgICBmb3IgKEluZGV4MiA9IDA7IEluZGV4MiA8IDQgOyBJbmRleDIrKykgewotICAgICAgICAgICAgQmlnSW50ZWdlcl9TcXVhcmUocEJJX1gsICZwQklfVGVtcDEpOwotCQkJQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbihwQklfVGVtcDEsIHBCSV9QLCBwQklfUiwgJnBCSV9YKTsKLQkgICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLQkJU2xpZGluZ19Mb3dWYWx1ZSA9IFNsaWRpbmdfVmFsdWUgJiAweDBmOwotCQlpZiAoU2xpZGluZ19Mb3dWYWx1ZSAhPSAwKSB7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyX011bChwQklfQVtTbGlkaW5nX0xvd1ZhbHVlXSwgcEJJX1gsICZwQklfVGVtcDEpOwotCQkJQmlnSW50ZWdlcl9Nb250Z29tZXJ5X1JlZHVjdGlvbihwQklfVGVtcDEsIHBCSV9QLCBwQklfUiwgJnBCSV9YKTsKLQkJfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICBCaWdJbnRlZ2VyX01vbnRnb21lcnlfUmVkdWN0aW9uKHBCSV9YLCBwQklfUCAsIHBCSV9SLCBwQklfUmVzdWx0KTsKLQotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1gpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1IpOwotICAgIEJpZ0ludGVnZXJfRnJlZSgmcEJJX1JSKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV8xKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9VKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9TKTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9PKTsKLSAgICBmb3IoSW5kZXggPSAwOyBJbmRleCA8IFNMSURJTkdfV0lORE9XOyBJbmRleCsrKQotCQkJQmlnSW50ZWdlcl9GcmVlKCZwQklfQVtJbmRleF0pOwotICAgIGlmIChwUlZhbHVlICE9IE5VTEwpCi0gICAgICAgIGtmcmVlKHBSVmFsdWUpOwotCi1tZW1vcnlfZnJlZToKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9UZW1wMSk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfVGVtcDIpOwotfSAvKiBFbmQgb2YgQmlnSW50ZWdlcl9Nb250Z29tZXJ5X0V4cE1vZCAqLwotCi0vKiBFbmQgb2YgY3J5cHRfYmlnaW50ZWdlci5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9kaC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfZGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2OWYyYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9kaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JY3J5cHRfZGguYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUVkZHkgICAgICAgIDIwMDkvMDEvMTkgICAgICBDcmVhdGUgQUVTLTEyOCwgQUVTLTE5MiwgQUVTLTI1NiwgQUVTLUNCQwotKi8KLQotI2luY2x1ZGUgImNyeXB0X2RoLmgiCi0jaW5jbHVkZSAiY3J5cHRfYmlnaW50ZWdlci5oIgotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIERpZmZpZS1IZWxsbWFuIHB1YmxpYyBrZXkgZ2VuZXJhdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAgR1ZhbHVlICAgICAgICAgICBBcnJheSBpbiBVSU5UOAotICAgIEdWYWx1ZUxlbmd0aCAgICAgVGhlIGxlbmd0aCBvZiBHIGluIGJ5dGVzCi0gICAgUFZhbHVlICAgICAgICAgICBBcnJheSBpbiBVSU5UOAotICAgIFBWYWx1ZUxlbmd0aCAgICAgVGhlIGxlbmd0aCBvZiBQIGluIGJ5dGVzCi0gICAgUHJpdmF0ZUtleSAgICAgICBQcml2YXRlIGtleQotICAgIFByaXZhdGVLZXlMZW5ndGggVGhlIGxlbmd0aCBvZiBQcml2YXRlIGtleSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgUHVibGljS2V5ICAgICAgIFB1YmxpYyBrZXkKLSAgICBQdWJsaWNLZXlMZW5ndGggVGhlIGxlbmd0aCBvZiBwdWJsaWMga2V5IGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIFJGQzI2MzEKLSAgICBQdWJsaWNLZXkgPSBHXlByaXZhdGVLZXkgKG1vZCBQKQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotdm9pZCBESF9QdWJsaWNLZXlfR2VuZXJhdGUgKAotICAgIElOIFVJTlQ4IEdWYWx1ZVtdLAotICAgIElOIFVJTlQgR1ZhbHVlTGVuZ3RoLAotICAgIElOIFVJTlQ4IFBWYWx1ZVtdLAotICAgIElOIFVJTlQgUFZhbHVlTGVuZ3RoLAotICAgIElOIFVJTlQ4IFByaXZhdGVLZXlbXSwKLSAgICBJTiBVSU5UIFByaXZhdGVLZXlMZW5ndGgsCi0gICAgT1VUIFVJTlQ4IFB1YmxpY0tleVtdLAotICAgIElOT1VUIFVJTlQgKlB1YmxpY0tleUxlbmd0aCkKLXsKLSAgICBQQklHX0lOVEVHRVIgcEJJX0cgPSBOVUxMOwotICAgIFBCSUdfSU5URUdFUiBwQklfUCA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9Qcml2YXRlS2V5ID0gTlVMTDsKLSAgICBQQklHX0lOVEVHRVIgcEJJX1B1YmxpY0tleSA9IE5VTEw7Ci0KLSAgICAvKgotICAgICAqIDEuIENoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogICAgLSBHVmFsdWVMZW5ndGgsIFBWYWx1ZUxlbmd0aCBhbmQgUHJpdmF0ZUxlbmd0aCBtdXN0IGJlIGxhcmdlIHRoYW4gemVybwotICAgICAqICAgIC0gUHVibGljS2V5TGVuZ3RoIG11c3QgYmUgbGFyZ2Ugb3IgZXF1YWwgdGhhbiBQVmFsdWVMZW5ndGgKLSAgICAgKiAgICAtIFBWYWx1ZSBtdXN0IGJlIG9kZAotICAgICAqCi0gICAgICogICAgLSBQVmFsdWUgbXVzdCBiZSBwcmltZSBudW1iZXIgKG5vIGltcGxlbWVudCkKLSAgICAgKiAgICAtIEdWYWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIGJ1dCBsZXNzIHRoYW4gdGhlIFBWYWx1ZSAobm8gaW1wbGVtZW50KQotICAgICAqLwotICAgIGlmIChHVmFsdWVMZW5ndGggPT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1B1YmxpY0tleV9HZW5lcmF0ZTogRyBsZW5ndGggaXMgKCVkKVxuIiwgR1ZhbHVlTGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmIChQVmFsdWVMZW5ndGggPT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1B1YmxpY0tleV9HZW5lcmF0ZTogUCBsZW5ndGggaXMgKCVkKVxuIiwgUFZhbHVlTGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmIChQcml2YXRlS2V5TGVuZ3RoID09IDApIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9QdWJsaWNLZXlfR2VuZXJhdGU6IHByaXZhdGUga2V5IGxlbmd0aCBpcyAoJWQpXG4iLCBQcml2YXRlS2V5TGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICgqUHVibGljS2V5TGVuZ3RoIDwgUFZhbHVlTGVuZ3RoKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfUHVibGljS2V5X0dlbmVyYXRlOiBwdWJsaWMga2V5IGxlbmd0aCglZCkgbXVzdCBiZSBsYXJnZSBvciBlcXVhbCB0aGFuIFAgbGVuZ3RoKCVkKVxuIiwKLSAgICAgICAgICAgICpQdWJsaWNLZXlMZW5ndGgsIFBWYWx1ZUxlbmd0aCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICBpZiAoIShQVmFsdWVbUFZhbHVlTGVuZ3RoIC0gMV0gJiAweDEpKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfUHVibGljS2V5X0dlbmVyYXRlOiBQIHZhbHVlIG11c3QgYmUgb2RkXG4iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyoKLSAgICAgKiAyLiBUcmFuc2ZlciBwYXJhbWV0ZXJzIHRvIEJpZ0ludGVnZXIgc3RydWN0dXJlCi0gICAgICovCi0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfRyk7Ci0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfUCk7Ci0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfUHJpdmF0ZUtleSk7Ci0gICAgQmlnSW50ZWdlcl9Jbml0KCZwQklfUHVibGljS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0JpbjJCSShHVmFsdWUsIEdWYWx1ZUxlbmd0aCwgJnBCSV9HKTsKLSAgICBCaWdJbnRlZ2VyX0JpbjJCSShQVmFsdWUsIFBWYWx1ZUxlbmd0aCwgJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0JpbjJCSShQcml2YXRlS2V5LCBQcml2YXRlS2V5TGVuZ3RoLCAmcEJJX1ByaXZhdGVLZXkpOwotCi0gICAgLyoKLSAgICAgKiAzLiBDYWxjdWxhdGUgUHVibGljS2V5ID0gR15Qcml2YXRlS2V5IChtb2QgUCkKLSAgICAgKiAgICAtIEJpZ0ludGVnZXIgT3BlcmF0aW9uCi0gICAgICogICAgLSBNb250Z29tZXJ5IHJlZHVjdGlvbgotICAgICAqLwotICAgIEJpZ0ludGVnZXJfTW9udGdvbWVyeV9FeHBNb2QocEJJX0csIHBCSV9Qcml2YXRlS2V5LCBwQklfUCwgJnBCSV9QdWJsaWNLZXkpOwotCi0gICAgLyoKLSAgICAgKiA0LiBUcmFuc2ZlciBCaWdJbnRlZ2VyIHN0cnVjdHVyZSB0byBjaGFyIGFycmF5Ci0gICAgICovCi0gICAgQmlnSW50ZWdlcl9CSTJCaW4ocEJJX1B1YmxpY0tleSwgUHVibGljS2V5LCBQdWJsaWNLZXlMZW5ndGgpOwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfRyk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUCk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUHJpdmF0ZUtleSk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUHVibGljS2V5KTsKLX0gLyogRW5kIG9mIERIX1B1YmxpY0tleV9HZW5lcmF0ZSAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgRGlmZmllLUhlbGxtYW4gc2VjcmV0IGtleSBnZW5lcmF0aW9uCi0KLUFyZ3VtZW50czoKLSAgICBQdWJsaWNLZXkgICAgICAgIFB1YmxpYyBrZXkKLSAgICBQdWJsaWNLZXlMZW5ndGggIFRoZSBsZW5ndGggb2YgUHVibGljIGtleSBpbiBieXRlcwotICAgIFBWYWx1ZSAgICAgICAgICAgQXJyYXkgaW4gVUlOVDgKLSAgICBQVmFsdWVMZW5ndGggICAgIFRoZSBsZW5ndGggb2YgUCBpbiBieXRlcwotICAgIFByaXZhdGVLZXkgICAgICAgUHJpdmF0ZSBrZXkKLSAgICBQcml2YXRlS2V5TGVuZ3RoIFRoZSBsZW5ndGggb2YgUHJpdmF0ZSBrZXkgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIFNlY3JldEtleSAgICAgICAgU2VjcmV0IGtleQotICAgIFNlY3JldEtleUxlbmd0aCAgVGhlIGxlbmd0aCBvZiBzZWNyZXQga2V5IGluIGJ5dGVzCi0KLU5vdGU6Ci0gICAgUmVmZXJlbmNlIHRvIFJGQzI2MzEKLSAgICBTZWNyZXRLZXkgPSBQdWJsaWNLZXleUHJpdmF0ZUtleSAobW9kIFApCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi12b2lkIERIX1NlY3JldEtleV9HZW5lcmF0ZSAoCi0gICAgSU4gVUlOVDggUHVibGljS2V5W10sCi0gICAgSU4gVUlOVCBQdWJsaWNLZXlMZW5ndGgsCi0gICAgSU4gVUlOVDggUFZhbHVlW10sCi0gICAgSU4gVUlOVCBQVmFsdWVMZW5ndGgsCi0gICAgSU4gVUlOVDggUHJpdmF0ZUtleVtdLAotICAgIElOIFVJTlQgUHJpdmF0ZUtleUxlbmd0aCwKLSAgICBPVVQgVUlOVDggU2VjcmV0S2V5W10sCi0gICAgSU5PVVQgVUlOVCAqU2VjcmV0S2V5TGVuZ3RoKQotewotICAgIFBCSUdfSU5URUdFUiBwQklfUCA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9TZWNyZXRLZXkgPSBOVUxMOwotICAgIFBCSUdfSU5URUdFUiBwQklfUHJpdmF0ZUtleSA9IE5VTEw7Ci0gICAgUEJJR19JTlRFR0VSIHBCSV9QdWJsaWNLZXkgPSBOVUxMOwotCi0gICAgLyoKLSAgICAgKiAxLiBDaGVjayB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgICAqICAgIC0gUHVibGljS2V5TGVuZ3RoLCBQVmFsdWVMZW5ndGggYW5kIFByaXZhdGVMZW5ndGggbXVzdCBiZSBsYXJnZSB0aGFuIHplcm8KLSAgICAgKiAgICAtIFNlY3JldEtleUxlbmd0aCBtdXN0IGJlIGxhcmdlIG9yIGVxdWFsIHRoYW4gUFZhbHVlTGVuZ3RoCi0gICAgICogICAgLSBQVmFsdWUgbXVzdCBiZSBvZGQKLSAgICAgKgotICAgICAqICAgIC0gUFZhbHVlIG11c3QgYmUgcHJpbWUgbnVtYmVyIChubyBpbXBsZW1lbnQpCi0gICAgICovCi0gICAgaWYgKFB1YmxpY0tleUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfU2VjcmV0S2V5X0dlbmVyYXRlOiBwdWJsaWMga2V5IGxlbmd0aCBpcyAoJWQpXG4iLCBQdWJsaWNLZXlMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKFBWYWx1ZUxlbmd0aCA9PSAwKSB7Ci0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiREhfU2VjcmV0S2V5X0dlbmVyYXRlOiBQIGxlbmd0aCBpcyAoJWQpXG4iLCBQVmFsdWVMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKFByaXZhdGVLZXlMZW5ndGggPT0gMCkgewotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkRIX1NlY3JldEtleV9HZW5lcmF0ZTogcHJpdmF0ZSBrZXkgbGVuZ3RoIGlzICglZClcbiIsIFByaXZhdGVLZXlMZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0gICAgaWYgKCpTZWNyZXRLZXlMZW5ndGggPCBQVmFsdWVMZW5ndGgpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9TZWNyZXRLZXlfR2VuZXJhdGU6IHNlY3JldCBrZXkgbGVuZ3RoKCVkKSBtdXN0IGJlIGxhcmdlIG9yIGVxdWFsIHRoYW4gUCBsZW5ndGgoJWQpXG4iLAotICAgICAgICAgICAgKlNlY3JldEtleUxlbmd0aCwgUFZhbHVlTGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIGlmICghKFBWYWx1ZVtQVmFsdWVMZW5ndGggLSAxXSAmIDB4MSkpIHsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJESF9TZWNyZXRLZXlfR2VuZXJhdGU6IFAgdmFsdWUgbXVzdCBiZSBvZGRcbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gLyogRW5kIG9mIGlmICovCi0KLSAgICAvKgotICAgICAqIDIuIFRyYW5zZmVyIHBhcmFtZXRlcnMgdG8gQmlnSW50ZWdlciBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9QKTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9Qcml2YXRlS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0luaXQoJnBCSV9QdWJsaWNLZXkpOwotICAgIEJpZ0ludGVnZXJfSW5pdCgmcEJJX1NlY3JldEtleSk7Ci0KLSAgICBCaWdJbnRlZ2VyX0JpbjJCSShQdWJsaWNLZXksIFB1YmxpY0tleUxlbmd0aCwgJnBCSV9QdWJsaWNLZXkpOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFBWYWx1ZSwgUFZhbHVlTGVuZ3RoLCAmcEJJX1ApOwotICAgIEJpZ0ludGVnZXJfQmluMkJJKFByaXZhdGVLZXksIFByaXZhdGVLZXlMZW5ndGgsICZwQklfUHJpdmF0ZUtleSk7Ci0KLSAgICAvKgotICAgICAqIDMuIENhbGN1bGF0ZSBTZWNyZXRLZXkgPSBQdWJsaWNLZXleUHJpdmF0ZUtleSAobW9kIFApCi0gICAgICogICAgLSBCaWdJbnRlZ2VyIE9wZXJhdGlvbgotICAgICAqICAgIC0gTW9udGdvbWVyeSByZWR1Y3Rpb24KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyX01vbnRnb21lcnlfRXhwTW9kKHBCSV9QdWJsaWNLZXksIHBCSV9Qcml2YXRlS2V5LCBwQklfUCwgJnBCSV9TZWNyZXRLZXkpOwotCi0gICAgLyoKLSAgICAgKiA0LiBUcmFuc2ZlciBCaWdJbnRlZ2VyIHN0cnVjdHVyZSB0byBjaGFyIGFycmF5Ci0gICAgICovCi0gICAgQmlnSW50ZWdlcl9CSTJCaW4ocEJJX1NlY3JldEtleSwgU2VjcmV0S2V5LCBTZWNyZXRLZXlMZW5ndGgpOwotCi0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUCk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUHJpdmF0ZUtleSk7Ci0gICAgQmlnSW50ZWdlcl9GcmVlKCZwQklfUHVibGljS2V5KTsKLSAgICBCaWdJbnRlZ2VyX0ZyZWUoJnBCSV9TZWNyZXRLZXkpOwotfSAvKiBFbmQgb2YgREhfU2VjcmV0S2V5X0dlbmVyYXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9obWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9obWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODU0MDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfaG1hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIi4uL2NyeXB0X2htYWMuaCIKLQotCi0jaWZkZWYgSE1BQ19TSEExX1NVUFBPUlQKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSE1BQyB1c2luZyBTSEExIGhhc2ggZnVuY3Rpb24KLQotQXJndW1lbnRzOgotICAgIGtleSAgICAgICAgICAgICBTZWNyZXQga2V5Ci0gICAga2V5X2xlbiAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGtleSBpbiBieXRlcwotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlX2xlbiAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0gICAgbWFjTGVuICAgICAgICAgIFJlcXVlc3QgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKLQotUmV0dXJuIFZhbHVlOgotICAgIG1hYyAgICAgICAgICAgICBNZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEhNQUNfU0hBMSAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbikKLXsKLSAgICBTSEExX0NUWF9TVFJVQyBzaGFfY3R4MTsKLSAgICBTSEExX0NUWF9TVFJVQyBzaGFfY3R4MjsKLSAgICBVSU5UOCBLMFtTSEExX0JMT0NLX1NJWkVdOwotICAgIFVJTlQ4IERpZ2VzdFtTSEExX0RJR0VTVF9TSVpFXTsKLSAgICBVSU5UIGluZGV4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgxLCBzaXplb2YoU0hBMV9DVFhfU1RSVUMpKTsKLSAgICBOZGlzWmVyb01lbW9yeSgmc2hhX2N0eDIsIHNpemVvZihTSEExX0NUWF9TVFJVQykpOwotICAgIC8qCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID0gQihCbG9jayBzaXplKTogSzAgPSBLLgotICAgICAqIElmIHRoZSBsZW5ndGggb2YgSyA+IEI6IGhhc2ggSyB0byBvYnRhaW4gYW4gTCBieXRlIHN0cmluZywKLSAgICAgKiB0aGVuIGFwcGVuZCAoQi1MKSB6ZXJvcyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswIChpLmUuLCBLMCA9IEgoSykgfHwgMDAuLi4wMCkuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLIDwgQjogYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswCi0gICAgICovCi0gICAgTmRpc1plcm9NZW1vcnkoSzAsIFNIQTFfQkxPQ0tfU0laRSk7Ci0gICAgaWYgKEtleUxlbiA8PSBTSEExX0JMT0NLX1NJWkUpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KEswLCBLZXksIEtleUxlbik7Ci0gICAgZWxzZQotICAgICAgICBSVF9TSEExKEtleSwgS2V5TGVuLCBLMCk7Ci0gICAgLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBpcGFkICovCi0gICAgLyogaXBhZDogSW5uZXIgcGFkOyB0aGUgYnl0ZSB477+977+9Mzbvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBTSEExX0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2OwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBTSEExX0luaXQoJnNoYV9jdHgxKTsKLSAgICAvKiBIKEswXmlwYWQpICovCi0gICAgU0hBMV9BcHBlbmQoJnNoYV9jdHgxLCBLMCwgc2l6ZW9mKEswKSk7Ci0gICAgLyogSCgoSzBeaXBhZCl8fHRleHQpICovCi0gICAgU0hBMV9BcHBlbmQoJnNoYV9jdHgxLCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKLSAgICBTSEExX0VuZCgmc2hhX2N0eDEsIERpZ2VzdCk7Ci0KLSAgICAvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBvcGFkIGFuZCByZW1vdmUgaXBhZCAqLwotICAgIC8qIG9wYWQ6IE91dGVyIHBhZDsgdGhlIGJ5dGUgeO+/ve+/vTVj77+977+9IHJlcGVhdGVkIEIgdGltZXMuICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0hBMV9CTE9DS19TSVpFOyBpbmRleCsrKQotICAgICAgICBLMFtpbmRleF0gXj0gMHgzNl4weDVjOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBTSEExX0luaXQoJnNoYV9jdHgyKTsKLSAgICAvKiBIKEswXm9wYWQpICovCi0gICAgU0hBMV9BcHBlbmQoJnNoYV9jdHgyLCBLMCwgc2l6ZW9mKEswKSk7Ci0gICAgLyogSCggKEswXm9wYWQpIHx8IEgoKEswXmlwYWQpfHx0ZXh0KSApICovCi0gICAgU0hBMV9BcHBlbmQoJnNoYV9jdHgyLCBEaWdlc3QsIFNIQTFfRElHRVNUX1NJWkUpOwotICAgIFNIQTFfRW5kKCZzaGFfY3R4MiwgRGlnZXN0KTsKLQotICAgIGlmIChNQUNMZW4gPiBTSEExX0RJR0VTVF9TSVpFKQotICAgICAgICBOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0gICAgZWxzZQotICAgICAgICBOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUFDTGVuKTsKLX0gLyogRW5kIG9mIEhNQUNfU0hBMSAqLwotI2VuZGlmIC8qIEhNQUNfU0hBMV9TVVBQT1JUICovCi0KLQotI2lmZGVmIEhNQUNfU0hBMjU2X1NVUFBPUlQKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSE1BQyB1c2luZyBTSEEyNTYgaGFzaCBmdW5jdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKLSAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCi0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLSAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgSE1BQ19TSEEyNTYgKAotICAgIElOICBjb25zdCBVSU5UOCBLZXlbXSwKLSAgICBJTiAgVUlOVCBLZXlMZW4sCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBNQUNbXSwKLSAgICBJTiAgVUlOVCBNQUNMZW4pCi17Ci0gICAgU0hBMjU2X0NUWF9TVFJVQyBzaGFfY3R4MTsKLSAgICBTSEEyNTZfQ1RYX1NUUlVDIHNoYV9jdHgyOwotICAgIFVJTlQ4IEswW1NIQTI1Nl9CTE9DS19TSVpFXTsKLSAgICBVSU5UOCBEaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTsKLSAgICBVSU5UIGluZGV4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgxLCBzaXplb2YoU0hBMjU2X0NUWF9TVFJVQykpOwotICAgIE5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4Miwgc2l6ZW9mKFNIQTI1Nl9DVFhfU1RSVUMpKTsKLSAgICAvKgotICAgICAqIElmIHRoZSBsZW5ndGggb2YgSyA9IEIoQmxvY2sgc2l6ZSk6IEswID0gSy4KLSAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIEsgPiBCOiBoYXNoIEsgdG8gb2J0YWluIGFuIEwgYnl0ZSBzdHJpbmcsCi0gICAgICogdGhlbiBhcHBlbmQgKEItTCkgemVyb3MgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMCAoaS5lLiwgSzAgPSBIKEspIHx8IDAwLi4uMDApLgotICAgICAqIElmIHRoZSBsZW5ndGggb2YgSyA8IEI6IGFwcGVuZCB6ZXJvcyB0byB0aGUgZW5kIG9mIEsgdG8gY3JlYXRlIGEgQi1ieXRlIHN0cmluZyBLMAotICAgICAqLwotICAgIE5kaXNaZXJvTWVtb3J5KEswLCBTSEEyNTZfQkxPQ0tfU0laRSk7Ci0gICAgaWYgKEtleUxlbiA8PSBTSEEyNTZfQkxPQ0tfU0laRSkgewotICAgICAgICBOZGlzTW92ZU1lbW9yeShLMCwgS2V5LCBLZXlMZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJUX1NIQTI1NihLZXksIEtleUxlbiwgSzApOwotICAgIH0KLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIGlwYWQgKi8KLSAgICAvKiBpcGFkOiBJbm5lciBwYWQ7IHRoZSBieXRlIHjvv73vv70zNu+/ve+/vSByZXBlYXRlZCBCIHRpbWVzLiAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFNIQTI1Nl9CTE9DS19TSVpFOyBpbmRleCsrKQotICAgICAgICBLMFtpbmRleF0gXj0gMHgzNjsKLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotCi0gICAgU0hBMjU2X0luaXQoJnNoYV9jdHgxKTsKLSAgICAvKiBIKEswXmlwYWQpICovCi0gICAgU0hBMjU2X0FwcGVuZCgmc2hhX2N0eDEsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKChLMF5pcGFkKXx8dGV4dCkgKi8KLSAgICBTSEEyNTZfQXBwZW5kKCZzaGFfY3R4MSwgTWVzc2FnZSwgTWVzc2FnZUxlbik7Ci0gICAgU0hBMjU2X0VuZCgmc2hhX2N0eDEsIERpZ2VzdCk7Ci0KLSAgICAvKiBFeGNsdXNpdmUtT3IgSzAgd2l0aCBvcGFkIGFuZCByZW1vdmUgaXBhZCAqLwotICAgIC8qIG9wYWQ6IE91dGVyIHBhZDsgdGhlIGJ5dGUgeO+/ve+/vTVj77+977+9IHJlcGVhdGVkIEIgdGltZXMuICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU0hBMjU2X0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2XjB4NWM7Ci0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIFNIQTI1Nl9Jbml0KCZzaGFfY3R4Mik7Ci0gICAgLyogSChLMF5vcGFkKSAqLwotICAgIFNIQTI1Nl9BcHBlbmQoJnNoYV9jdHgyLCBLMCwgc2l6ZW9mKEswKSk7Ci0gICAgLyogSCggKEswXm9wYWQpIHx8IEgoKEswXmlwYWQpfHx0ZXh0KSApICovCi0gICAgU0hBMjU2X0FwcGVuZCgmc2hhX2N0eDIsIERpZ2VzdCwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKLSAgICBTSEEyNTZfRW5kKCZzaGFfY3R4MiwgRGlnZXN0KTsKLQotICAgIGlmIChNQUNMZW4gPiBTSEEyNTZfRElHRVNUX1NJWkUpCi0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KE1BQywgRGlnZXN0LFNIQTI1Nl9ESUdFU1RfU0laRSk7Ci0gICAgZWxzZQotICAgICAgICBOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUFDTGVuKTsKLQotfSAvKiBFbmQgb2YgSE1BQ19TSEEyNTYgKi8KLSNlbmRpZiAvKiBITUFDX1NIQTI1Nl9TVVBQT1JUICovCi0KLQotI2lmZGVmIEhNQUNfTUQ1X1NVUFBPUlQKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSE1BQyB1c2luZyBNRDUgaGFzaCBmdW5jdGlvbgotCi1Bcmd1bWVudHM6Ci0gICAga2V5ICAgICAgICAgICAgIFNlY3JldCBrZXkKLSAgICBrZXlfbGVuICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IGluIGJ5dGVzCi0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VfbGVuICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLSAgICBtYWNMZW4gICAgICAgICAgUmVxdWVzdCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgbWFjICAgICAgICAgICAgIE1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgSE1BQ19NRDUoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IEtleVtdLAotICAgIElOICBVSU5UIEtleUxlbiwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IE1BQ1tdLAotICAgIElOICBVSU5UIE1BQ0xlbikKLXsKLSAgICBNRDVfQ1RYX1NUUlVDIG1kNV9jdHgxOwotICAgIE1ENV9DVFhfU1RSVUMgbWQ1X2N0eDI7Ci0gICAgVUlOVDggSzBbTUQ1X0JMT0NLX1NJWkVdOwotICAgIFVJTlQ4IERpZ2VzdFtNRDVfRElHRVNUX1NJWkVdOwotICAgIFVJTlQgaW5kZXg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeSgmbWQ1X2N0eDEsIHNpemVvZihNRDVfQ1RYX1NUUlVDKSk7Ci0gICAgTmRpc1plcm9NZW1vcnkoJm1kNV9jdHgyLCBzaXplb2YoTUQ1X0NUWF9TVFJVQykpOwotICAgIC8qCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLID0gQihCbG9jayBzaXplKTogSzAgPSBLLgotICAgICAqIElmIHRoZSBsZW5ndGggb2YgSyA+IEI6IGhhc2ggSyB0byBvYnRhaW4gYW4gTCBieXRlIHN0cmluZywKLSAgICAgKiB0aGVuIGFwcGVuZCAoQi1MKSB6ZXJvcyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswIChpLmUuLCBLMCA9IEgoSykgfHwgMDAuLi4wMCkuCi0gICAgICogSWYgdGhlIGxlbmd0aCBvZiBLIDwgQjogYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCLWJ5dGUgc3RyaW5nIEswCi0gICAgICovCi0gICAgTmRpc1plcm9NZW1vcnkoSzAsIE1ENV9CTE9DS19TSVpFKTsKLSAgICBpZiAoS2V5TGVuIDw9IE1ENV9CTE9DS19TSVpFKSB7Ci0gICAgICAgIE5kaXNNb3ZlTWVtb3J5KEswLCBLZXksIEtleUxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUlRfTUQ1KEtleSwgS2V5TGVuLCBLMCk7Ci0gICAgfQotCi0gICAgLyogRXhjbHVzaXZlLU9yIEswIHdpdGggaXBhZCAqLwotICAgIC8qIGlwYWQ6IElubmVyIHBhZDsgdGhlIGJ5dGUgeO+/ve+/vTM277+977+9IHJlcGVhdGVkIEIgdGltZXMuICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUQ1X0JMT0NLX1NJWkU7IGluZGV4KyspCi0gICAgICAgIEswW2luZGV4XSBePSAweDM2OwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBNRDVfSW5pdCgmbWQ1X2N0eDEpOwotICAgIC8qIEgoSzBeaXBhZCkgKi8KLSAgICBNRDVfQXBwZW5kKCZtZDVfY3R4MSwgSzAsIHNpemVvZihLMCkpOwotICAgIC8qIEgoKEswXmlwYWQpfHx0ZXh0KSAqLwotICAgIE1ENV9BcHBlbmQoJm1kNV9jdHgxLCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKLSAgICBNRDVfRW5kKCZtZDVfY3R4MSwgRGlnZXN0KTsKLQotICAgIC8qIEV4Y2x1c2l2ZS1PciBLMCB3aXRoIG9wYWQgYW5kIHJlbW92ZSBpcGFkICovCi0gICAgLyogb3BhZDogT3V0ZXIgcGFkOyB0aGUgYnl0ZSB477+977+9NWPvv73vv70gcmVwZWF0ZWQgQiB0aW1lcy4gKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNRDVfQkxPQ0tfU0laRTsgaW5kZXgrKykKLSAgICAgICAgSzBbaW5kZXhdIF49IDB4MzZeMHg1YzsKLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotCi0gICAgTUQ1X0luaXQoJm1kNV9jdHgyKTsKLSAgICAvKiBIKEswXm9wYWQpICovCi0gICAgTUQ1X0FwcGVuZCgmbWQ1X2N0eDIsIEswLCBzaXplb2YoSzApKTsKLSAgICAvKiBIKCAoSzBeb3BhZCkgfHwgSCgoSzBeaXBhZCl8fHRleHQpICkgKi8KLSAgICBNRDVfQXBwZW5kKCZtZDVfY3R4MiwgRGlnZXN0LCBNRDVfRElHRVNUX1NJWkUpOwotICAgIE1ENV9FbmQoJm1kNV9jdHgyLCBEaWdlc3QpOwotCi0gICAgaWYgKE1BQ0xlbiA+IE1ENV9ESUdFU1RfU0laRSkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoTUFDLCBEaWdlc3QsIE1ENV9ESUdFU1RfU0laRSk7Ci0gICAgZWxzZQotICAgICAgICBOZGlzTW92ZU1lbW9yeShNQUMsIERpZ2VzdCwgTUFDTGVuKTsKLX0gLyogRW5kIG9mIEhNQUNfU0hBMjU2ICovCi0jZW5kaWYgLyogSE1BQ19NRDVfU1VQUE9SVCAqLwotCi0vKiBFbmQgb2YgY3J5cHRfaG1hYy5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9tZDUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDkzMjY1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2NyeXB0X21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIi4uL2NyeXB0X21kNS5oIgotCi0KLSNpZmRlZiBNRDVfU1VQUE9SVAotLyoKLSAqIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMuCi0gKi8KLSNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAoKH54KSAmICh6KSkpCi0jZGVmaW5lIEcoeCwgeSwgeikgKCgoeCkgJiAoeikpIHwgKCh5KSAmICh+eikpKQotI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCi0jZGVmaW5lIEkoeCwgeSwgeikgKCh5KSBeICgoeCkgfCAofnopKSkKLQotI2RlZmluZSBST1RMKHgsbix3KSAoKHggPDwgbikgfCAoeCA+PiAodyAtIG4pKSkKLSNkZWZpbmUgUk9UTDMyKHgsbikgUk9UTCh4LG4sMzIpIC8qIDMyIGJpdHMgd29yZCAqLwotCi0jZGVmaW5lIFJPVU5EMShhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCi0gICAgKGEpICs9IEYoKGIpLChjKSwoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcCi0gICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZGVmaW5lIFJPVU5EMihhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCi0gICAgKGEpICs9IEcoKGIpLChjKSwoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcCi0gICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZGVmaW5lIFJPVU5EMyhhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCi0gICAgKGEpICs9IEgoKGIpLChjKSwoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcCi0gICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZGVmaW5lIFJPVU5ENChhLCBiLCBjLCBkLCB4LCBzLCBhYykgeyAgICAgICAgICBcCi0gICAgKGEpICs9IEkoKGIpLChjKSwoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcCi0gICAgKGEpICA9IFJPVEwzMigoYSksKHMpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGEpICs9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci1zdGF0aWMgY29uc3QgVUlOVDMyIE1ENV9EZWZhdWx0SGFzaFZhbHVlWzRdID0gewotICAgIDB4Njc0NTIzMDFVTCwgMHhlZmNkYWI4OVVMLCAweDk4YmFkY2ZlVUwsIDB4MTAzMjU0NzZVTAotfTsKLSNlbmRpZiAvKiBNRDVfU1VQUE9SVCAqLwotCi0KLSNpZmRlZiBNRDVfU1VQUE9SVAotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBJbml0aWFsIE1kNV9DVFhfU1RSVUMKLQotQXJndW1lbnRzOgotICAgIHBNRDVfQ1RYICAgICAgICBQb2ludGVyIHRvIE1kNV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE1ENV9Jbml0ICgKLSAgICBJTiAgTUQ1X0NUWF9TVFJVQyAqcE1ENV9DVFgpCi17Ci0gICAgTmRpc01vdmVNZW1vcnkocE1ENV9DVFgtPkhhc2hWYWx1ZSwgTUQ1X0RlZmF1bHRIYXNoVmFsdWUsCi0gICAgICAgIHNpemVvZihNRDVfRGVmYXVsdEhhc2hWYWx1ZSkpOwotICAgIE5kaXNaZXJvTWVtb3J5KHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOwotICAgIHBNRDVfQ1RYLT5CbG9ja0xlbiAgID0gMDsKLSAgICBwTUQ1X0NUWC0+TWVzc2FnZUxlbiA9IDA7Ci19IC8qIEVuZCBvZiBNRDVfSW5pdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgTUQ1IGNvbXB1dGF0aW9uIGZvciBvbmUgYmxvY2sgKDUxMiBiaXRzKQotCi1Bcmd1bWVudHM6Ci0gICAgcE1ENV9DVFggICAgICAgIFBvaW50ZXIgdG8gTWQ1X0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIFRbaV0gOj0gZmxvb3IoYWJzKHNpbihpICsgMSkpICogKDIgcG93IDMyKSksIGkgaXMgbnVtYmVyIG9mIHJvdW5kCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE1ENV9IYXNoICgKLSAgICBJTiAgTUQ1X0NUWF9TVFJVQyAqcE1ENV9DVFgpCi17Ci0gICAgVUlOVDMyIFhfaTsKLSAgICBVSU5UMzIgWFsxNl07Ci0gICAgVUlOVDMyIGEsYixjLGQ7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7WF9pfSAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KFgsIHBNRDVfQ1RYLT5CbG9jaywgTUQ1X0JMT0NLX1NJWkUpOwotICAgIGZvciAoWF9pID0gMDsgWF9pIDwgMTY7IFhfaSsrKQotICAgICAgICBYW1hfaV0gPSBjcHUybGUzMihYW1hfaV0pOyAvKiBFbmRpYW4gU3dhcCAqLwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAvKiBNRDUgaGFzaCBjb21wdXRhdGlvbiAqLwotICAgIC8qIEluaXRpYWxpemUgdGhlIHdvcmtpbmcgdmFyaWFibGVzICovCi0gICAgYSA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMF07Ci0gICAgYiA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMV07Ci0gICAgYyA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbMl07Ci0gICAgZCA9IHBNRDVfQ1RYLT5IYXNoVmFsdWVbM107Ci0KLSAgICAvKgotICAgICAqICBSb3VuZCAxCi0gICAgICogIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgKiAgYSA9IGIgKyAoKGEgKyBGKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKLSAgICAgKi8KLSAgICBST1VORDEoYSwgYiwgYywgZCwgWFsgMF0sICA3LCAweGQ3NmFhNDc4KTsgLyogMSAqLwotICAgIFJPVU5EMShkLCBhLCBiLCBjLCBYWyAxXSwgMTIsIDB4ZThjN2I3NTYpOyAvKiAyICovCi0gICAgUk9VTkQxKGMsIGQsIGEsIGIsIFhbIDJdLCAxNywgMHgyNDIwNzBkYik7IC8qIDMgKi8KLSAgICBST1VORDEoYiwgYywgZCwgYSwgWFsgM10sIDIyLCAweGMxYmRjZWVlKTsgLyogNCAqLwotICAgIFJPVU5EMShhLCBiLCBjLCBkLCBYWyA0XSwgIDcsIDB4ZjU3YzBmYWYpOyAvKiA1ICovCi0gICAgUk9VTkQxKGQsIGEsIGIsIGMsIFhbIDVdLCAxMiwgMHg0Nzg3YzYyYSk7IC8qIDYgKi8KLSAgICBST1VORDEoYywgZCwgYSwgYiwgWFsgNl0sIDE3LCAweGE4MzA0NjEzKTsgLyogNyAqLwotICAgIFJPVU5EMShiLCBjLCBkLCBhLCBYWyA3XSwgMjIsIDB4ZmQ0Njk1MDEpOyAvKiA4ICovCi0gICAgUk9VTkQxKGEsIGIsIGMsIGQsIFhbIDhdLCAgNywgMHg2OTgwOThkOCk7IC8qIDkgKi8KLSAgICBST1VORDEoZCwgYSwgYiwgYywgWFsgOV0sIDEyLCAweDhiNDRmN2FmKTsgLyogMTAgKi8KLSAgICBST1VORDEoYywgZCwgYSwgYiwgWFsxMF0sIDE3LCAweGZmZmY1YmIxKTsgLyogMTEgKi8KLSAgICBST1VORDEoYiwgYywgZCwgYSwgWFsxMV0sIDIyLCAweDg5NWNkN2JlKTsgLyogMTIgKi8KLSAgICBST1VORDEoYSwgYiwgYywgZCwgWFsxMl0sICA3LCAweDZiOTAxMTIyKTsgLyogMTMgKi8KLSAgICBST1VORDEoZCwgYSwgYiwgYywgWFsxM10sIDEyLCAweGZkOTg3MTkzKTsgLyogMTQgKi8KLSAgICBST1VORDEoYywgZCwgYSwgYiwgWFsxNF0sIDE3LCAweGE2Nzk0MzhlKTsgLyogMTUgKi8KLSAgICBST1VORDEoYiwgYywgZCwgYSwgWFsxNV0sIDIyLCAweDQ5YjQwODIxKTsgLyogMTYgKi8KLQotICAgIC8qCi0gICAgICogIFJvdW5kIDIKLSAgICAgKiAgTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAqICBhID0gYiArICgoYSArIEcoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKQotICAgICAqLwotICAgIFJPVU5EMihhLCBiLCBjLCBkLCBYWyAxXSwgIDUsIDB4ZjYxZTI1NjIpOyAvKiAxNyAqLwotICAgIFJPVU5EMihkLCBhLCBiLCBjLCBYWyA2XSwgIDksIDB4YzA0MGIzNDApOyAvKiAxOCAqLwotICAgIFJPVU5EMihjLCBkLCBhLCBiLCBYWzExXSwgMTQsIDB4MjY1ZTVhNTEpOyAvKiAxOSAqLwotICAgIFJPVU5EMihiLCBjLCBkLCBhLCBYWyAwXSwgMjAsIDB4ZTliNmM3YWEpOyAvKiAyMCAqLwotICAgIFJPVU5EMihhLCBiLCBjLCBkLCBYWyA1XSwgIDUsIDB4ZDYyZjEwNWQpOyAvKiAyMSAqLwotICAgIFJPVU5EMihkLCBhLCBiLCBjLCBYWzEwXSwgIDksICAweDI0NDE0NTMpOyAvKiAyMiAqLwotICAgIFJPVU5EMihjLCBkLCBhLCBiLCBYWzE1XSwgMTQsIDB4ZDhhMWU2ODEpOyAvKiAyMyAqLwotICAgIFJPVU5EMihiLCBjLCBkLCBhLCBYWyA0XSwgMjAsIDB4ZTdkM2ZiYzgpOyAvKiAyNCAqLwotICAgIFJPVU5EMihhLCBiLCBjLCBkLCBYWyA5XSwgIDUsIDB4MjFlMWNkZTYpOyAvKiAyNSAqLwotICAgIFJPVU5EMihkLCBhLCBiLCBjLCBYWzE0XSwgIDksIDB4YzMzNzA3ZDYpOyAvKiAyNiAqLwotICAgIFJPVU5EMihjLCBkLCBhLCBiLCBYWyAzXSwgMTQsIDB4ZjRkNTBkODcpOyAvKiAyNyAqLwotICAgIFJPVU5EMihiLCBjLCBkLCBhLCBYWyA4XSwgMjAsIDB4NDU1YTE0ZWQpOyAvKiAyOCAqLwotICAgIFJPVU5EMihhLCBiLCBjLCBkLCBYWzEzXSwgIDUsIDB4YTllM2U5MDUpOyAvKiAyOSAqLwotICAgIFJPVU5EMihkLCBhLCBiLCBjLCBYWyAyXSwgIDksIDB4ZmNlZmEzZjgpOyAvKiAzMCAqLwotICAgIFJPVU5EMihjLCBkLCBhLCBiLCBYWyA3XSwgMTQsIDB4Njc2ZjAyZDkpOyAvKiAzMSAqLwotICAgIFJPVU5EMihiLCBjLCBkLCBhLCBYWzEyXSwgMjAsIDB4OGQyYTRjOGEpOyAvKiAzMiAqLwotCi0gICAgLyoKLSAgICAgKiAgUm91bmQgMwotICAgICAqICBMZXQgW2FiY2QgayBzIHRdIGRlbm90ZSB0aGUgb3BlcmF0aW9uCi0gICAgICogIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpCi0gICAgICovCi0gICAgUk9VTkQzKGEsIGIsIGMsIGQsIFhbIDVdLCAgNCwgMHhmZmZhMzk0Mik7IC8qIDMzICovCi0gICAgUk9VTkQzKGQsIGEsIGIsIGMsIFhbIDhdLCAxMSwgMHg4NzcxZjY4MSk7IC8qIDM0ICovCi0gICAgUk9VTkQzKGMsIGQsIGEsIGIsIFhbMTFdLCAxNiwgMHg2ZDlkNjEyMik7IC8qIDM1ICovCi0gICAgUk9VTkQzKGIsIGMsIGQsIGEsIFhbMTRdLCAyMywgMHhmZGU1MzgwYyk7IC8qIDM2ICovCi0gICAgUk9VTkQzKGEsIGIsIGMsIGQsIFhbIDFdLCAgNCwgMHhhNGJlZWE0NCk7IC8qIDM3ICovCi0gICAgUk9VTkQzKGQsIGEsIGIsIGMsIFhbIDRdLCAxMSwgMHg0YmRlY2ZhOSk7IC8qIDM4ICovCi0gICAgUk9VTkQzKGMsIGQsIGEsIGIsIFhbIDddLCAxNiwgMHhmNmJiNGI2MCk7IC8qIDM5ICovCi0gICAgUk9VTkQzKGIsIGMsIGQsIGEsIFhbMTBdLCAyMywgMHhiZWJmYmM3MCk7IC8qIDQwICovCi0gICAgUk9VTkQzKGEsIGIsIGMsIGQsIFhbMTNdLCAgNCwgMHgyODliN2VjNik7IC8qIDQxICovCi0gICAgUk9VTkQzKGQsIGEsIGIsIGMsIFhbIDBdLCAxMSwgMHhlYWExMjdmYSk7IC8qIDQyICovCi0gICAgUk9VTkQzKGMsIGQsIGEsIGIsIFhbIDNdLCAxNiwgMHhkNGVmMzA4NSk7IC8qIDQzICovCi0gICAgUk9VTkQzKGIsIGMsIGQsIGEsIFhbIDZdLCAyMywgIDB4NDg4MWQwNSk7IC8qIDQ0ICovCi0gICAgUk9VTkQzKGEsIGIsIGMsIGQsIFhbIDldLCAgNCwgMHhkOWQ0ZDAzOSk7IC8qIDQ1ICovCi0gICAgUk9VTkQzKGQsIGEsIGIsIGMsIFhbMTJdLCAxMSwgMHhlNmRiOTllNSk7IC8qIDQ2ICovCi0gICAgUk9VTkQzKGMsIGQsIGEsIGIsIFhbMTVdLCAxNiwgMHgxZmEyN2NmOCk7IC8qIDQ3ICovCi0gICAgUk9VTkQzKGIsIGMsIGQsIGEsIFhbIDJdLCAyMywgMHhjNGFjNTY2NSk7IC8qIDQ4ICovCi0KLSAgICAvKgotICAgICAqICBSb3VuZCA0Ci0gICAgICogIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgKiAgYSA9IGIgKyAoKGEgKyBJKGIsYyxkKSArIFhba10gKyBUW2ldKSA8PDwgcykKLSAgICAgKi8KLSAgICBST1VORDQoYSwgYiwgYywgZCwgWFsgMF0sICA2LCAweGY0MjkyMjQ0KTsgLyogNDkgKi8KLSAgICBST1VORDQoZCwgYSwgYiwgYywgWFsgN10sIDEwLCAweDQzMmFmZjk3KTsgLyogNTAgKi8KLSAgICBST1VORDQoYywgZCwgYSwgYiwgWFsxNF0sIDE1LCAweGFiOTQyM2E3KTsgLyogNTEgKi8KLSAgICBST1VORDQoYiwgYywgZCwgYSwgWFsgNV0sIDIxLCAweGZjOTNhMDM5KTsgLyogNTIgKi8KLSAgICBST1VORDQoYSwgYiwgYywgZCwgWFsxMl0sICA2LCAweDY1NWI1OWMzKTsgLyogNTMgKi8KLSAgICBST1VORDQoZCwgYSwgYiwgYywgWFsgM10sIDEwLCAweDhmMGNjYzkyKTsgLyogNTQgKi8KLSAgICBST1VORDQoYywgZCwgYSwgYiwgWFsxMF0sIDE1LCAweGZmZWZmNDdkKTsgLyogNTUgKi8KLSAgICBST1VORDQoYiwgYywgZCwgYSwgWFsgMV0sIDIxLCAweDg1ODQ1ZGQxKTsgLyogNTYgKi8KLSAgICBST1VORDQoYSwgYiwgYywgZCwgWFsgOF0sICA2LCAweDZmYTg3ZTRmKTsgLyogNTcgKi8KLSAgICBST1VORDQoZCwgYSwgYiwgYywgWFsxNV0sIDEwLCAweGZlMmNlNmUwKTsgLyogNTggKi8KLSAgICBST1VORDQoYywgZCwgYSwgYiwgWFsgNl0sIDE1LCAweGEzMDE0MzE0KTsgLyogNTkgKi8KLSAgICBST1VORDQoYiwgYywgZCwgYSwgWFsxM10sIDIxLCAweDRlMDgxMWExKTsgLyogNjAgKi8KLSAgICBST1VORDQoYSwgYiwgYywgZCwgWFsgNF0sICA2LCAweGY3NTM3ZTgyKTsgLyogNjEgKi8KLSAgICBST1VORDQoZCwgYSwgYiwgYywgWFsxMV0sIDEwLCAweGJkM2FmMjM1KTsgLyogNjIgKi8KLSAgICBST1VORDQoYywgZCwgYSwgYiwgWFsgMl0sIDE1LCAweDJhZDdkMmJiKTsgLyogNjMgKi8KLSAgICBST1VORDQoYiwgYywgZCwgYSwgWFsgOV0sIDIxLCAweGViODZkMzkxKTsgLyogNjQgKi8KLQotICAgIC8qIENvbXB1dGUgdGhlIGledGggaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgSF4oaSkgKi8KLSAgICBwTUQ1X0NUWC0+SGFzaFZhbHVlWzBdICs9IGE7Ci0gICAgcE1ENV9DVFgtPkhhc2hWYWx1ZVsxXSArPSBiOwotICAgIHBNRDVfQ1RYLT5IYXNoVmFsdWVbMl0gKz0gYzsKLSAgICBwTUQ1X0NUWC0+SGFzaFZhbHVlWzNdICs9IGQ7Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwTUQ1X0NUWC0+QmxvY2ssIE1ENV9CTE9DS19TSVpFKTsKLSAgICBwTUQ1X0NUWC0+QmxvY2tMZW4gPSAwOwotfSAvKiBFbmQgb2YgTUQ1X0hhc2ggKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFRoZSBtZXNzYWdlIGlzIGFwcGVuZGVkIHRvIGJsb2NrLiBJZiBibG9jayBzaXplID4gNjQgYnl0ZXMsIHRoZSBNRDVfSGFzaAotd2lsbCBiZSBjYWxsZWQuCi0KLUFyZ3VtZW50czoKLSAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNRDVfQ1RYX1NUUlVDCi0gICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UgY29udGV4dAotICAgIG1lc3NhZ2VMZW4gICAgICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE1ENV9BcHBlbmQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pCi17Ci0gICAgVUlOVCBhcHBlbmRMZW4gPSAwOwotICAgIFVJTlQgZGlmZkxlbiA9IDA7Ci0KLSAgICB3aGlsZSAoYXBwZW5kTGVuICE9IE1lc3NhZ2VMZW4pIHsKLSAgICAgICAgZGlmZkxlbiA9IE1lc3NhZ2VMZW4gLSBhcHBlbmRMZW47Ci0gICAgICAgIGlmICgocE1ENV9DVFgtPkJsb2NrTGVuICsgZGlmZkxlbikgPCBNRDVfQkxPQ0tfU0laRSkgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocE1ENV9DVFgtPkJsb2NrICsgcE1ENV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIGRpZmZMZW4pOwotICAgICAgICAgICAgcE1ENV9DVFgtPkJsb2NrTGVuICs9IGRpZmZMZW47Ci0gICAgICAgICAgICBhcHBlbmRMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBNRDVfQ1RYLT5CbG9jayArIHBNRDVfQ1RYLT5CbG9ja0xlbiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLCBNRDVfQkxPQ0tfU0laRSAtIHBNRDVfQ1RYLT5CbG9ja0xlbik7Ci0gICAgICAgICAgICBhcHBlbmRMZW4gKz0gKE1ENV9CTE9DS19TSVpFIC0gcE1ENV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIHBNRDVfQ1RYLT5CbG9ja0xlbiA9IE1ENV9CTE9DS19TSVpFOwotICAgICAgICAgICAgTUQ1X0hhc2gocE1ENV9DVFgpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgcE1ENV9DVFgtPk1lc3NhZ2VMZW4gKz0gTWVzc2FnZUxlbjsKLX0gLyogRW5kIG9mIE1ENV9BcHBlbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKLSAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCi0gICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCi0KLUFyZ3VtZW50czoKLSAgICBwTUQ1X0NUWCAgICAgICAgUG9pbnRlciB0byBNRDVfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIE1ENV9FbmQgKAotICAgIElOICBNRDVfQ1RYX1NUUlVDICpwTUQ1X0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKQotewotICAgIFVJTlQgaW5kZXg7Ci0gICAgVUlOVDY0IG1lc3NhZ2VfbGVuZ3RoX2JpdHM7Ci0KLSAgICAvKiBhcHBlbmQgMSBiaXRzIHRvIGVuZCBvZiB0aGUgbWVzc2FnZSAqLwotICAgIE5kaXNGaWxsTWVtb3J5KHBNRDVfQ1RYLT5CbG9jayArIHBNRDVfQ1RYLT5CbG9ja0xlbiwgMSwgMHg4MCk7Ci0KLSAgICAvKiA1NSA9IDY0IC0gOCAtIDE6IGFwcGVuZCAxIGJpdCgxIGJ5dGUpIGFuZCBtZXNzYWdlIGxlbmd0aCAoOCBieXRlcykgKi8KLSAgICBpZiAocE1ENV9DVFgtPkJsb2NrTGVuID4gNTUpCi0gICAgICAgIE1ENV9IYXNoKHBNRDVfQ1RYKTsKLSAgICAgICAgLyogRW5kIG9mIGlmICovCi0KLSAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzICovCi0gICAgbWVzc2FnZV9sZW5ndGhfYml0cyA9IHBNRDVfQ1RYLT5NZXNzYWdlTGVuKjg7Ci0gICAgbWVzc2FnZV9sZW5ndGhfYml0cyA9IGNwdTJsZTY0KG1lc3NhZ2VfbGVuZ3RoX2JpdHMpOwotICAgIE5kaXNNb3ZlTWVtb3J5KCZwTUQ1X0NUWC0+QmxvY2tbNTZdLCAmbWVzc2FnZV9sZW5ndGhfYml0cywgOCk7Ci0gICAgTUQ1X0hhc2gocE1ENV9DVFgpOwotCi0gICAgLyogUmV0dXJuIG1lc3NhZ2UgZGlnZXN0LCB0cmFuc2Zvcm0gdGhlIFVJTlQzMiBoYXNoIHZhbHVlIHRvIGJ5dGVzICovCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDtpbmRleCsrKQotICAgICAgICBwTUQ1X0NUWC0+SGFzaFZhbHVlW2luZGV4XSA9IGNwdTJsZTMyKHBNRDVfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdKTsKLSAgICAgICAgLyogRW5kIG9mIGZvciAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KERpZ2VzdE1lc3NhZ2UsIHBNRDVfQ1RYLT5IYXNoVmFsdWUsIE1ENV9ESUdFU1RfU0laRSk7Ci19IC8qIEVuZCBvZiBNRDVfRW5kICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBNRDUgYWxnb3JpdGhtCi0KLUFyZ3VtZW50czoKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgZGlnZXN0TWVzc2FnZSAgIERpZ2VzdCBtZXNzYWdlCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVF9NRDUgKAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKQotewotICAgIE1ENV9DVFhfU1RSVUMgbWQ1X2N0eDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KCZtZDVfY3R4LCBzaXplb2YoTUQ1X0NUWF9TVFJVQykpOwotICAgIE1ENV9Jbml0KCZtZDVfY3R4KTsKLSAgICBNRDVfQXBwZW5kKCZtZDVfY3R4LCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKLSAgICBNRDVfRW5kKCZtZDVfY3R4LCBEaWdlc3RNZXNzYWdlKTsKLX0gLyogRW5kIG9mIFJUX01ENSAqLwotCi0jZW5kaWYgLyogTUQ1X1NVUFBPUlQgKi8KLQotLyogRW5kIG9mIGNyeXB0X21kNS5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9zaGEyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9jcnlwdF9zaGEyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDkwZDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vY3J5cHRfc2hhMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIi4uL2NyeXB0X3NoYTIuaCIKLQotCi0vKiBCYXNpYyBvcGVyYXRpb25zICovCi0jZGVmaW5lIFNIUih4LG4pICh4ID4+IG4pIC8qIFNIUih4KV5uLCByaWdodCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCi0jZGVmaW5lIFJPVFIoeCxuLHcpICgoeCA+PiBuKSB8ICh4IDw8ICh3IC0gbikpKSAvKiBST1RSKHgpXm4sIGNpcmN1bGFyIHJpZ2h0IHNoaWZ0IG4gYml0cyAsIHggaXMgdy1iaXQgd29yZCwgMCA8PSBuIDw9IHcgKi8KLSNkZWZpbmUgUk9UTCh4LG4sdykgKCh4IDw8IG4pIHwgKHggPj4gKHcgLSBuKSkpIC8qIFJPVEwoeClebiwgY2lyY3VsYXIgbGVmdCBzaGlmdCBuIGJpdHMgLCB4IGlzIHctYml0IHdvcmQsIDAgPD0gbiA8PSB3ICovCi0jZGVmaW5lIFJPVFIzMih4LG4pIFJPVFIoeCxuLDMyKSAvKiAzMiBiaXRzIHdvcmQgKi8KLSNkZWZpbmUgUk9UTDMyKHgsbikgUk9UTCh4LG4sMzIpIC8qIDMyIGJpdHMgd29yZCAqLwotCi0vKiBCYXNpYyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQ2goeCx5LHopICgoeCAmIHkpIF4gKCh+eCkgJiB6KSkKLSNkZWZpbmUgTWFqKHgseSx6KSAoKHggJiB5KSBeICh4ICYgeikgXiAoeSAmIHopKQotI2RlZmluZSBQYXJpdHkoeCx5LHopICh4IF4geSBeIHopCi0KLSNpZmRlZiBTSEExX1NVUFBPUlQKLS8qIFNIQTEgY29uc3RhbnRzICovCi0jZGVmaW5lIFNIQTFfTUFTSyAweDAwMDAwMDBmCi1zdGF0aWMgY29uc3QgVUlOVDMyIFNIQTFfS1s0XSA9IHsKLSAgICAweDVhODI3OTk5VUwsIDB4NmVkOWViYTFVTCwgMHg4ZjFiYmNkY1VMLCAweGNhNjJjMWQ2VUwKLX07Ci1zdGF0aWMgY29uc3QgVUlOVDMyIFNIQTFfRGVmYXVsdEhhc2hWYWx1ZVs1XSA9IHsKLSAgICAweDY3NDUyMzAxVUwsIDB4ZWZjZGFiODlVTCwgMHg5OGJhZGNmZVVMLCAweDEwMzI1NDc2VUwsIDB4YzNkMmUxZjBVTAotfTsKLSNlbmRpZiAvKiBTSEExX1NVUFBPUlQgKi8KLQotCi0jaWZkZWYgU0hBMjU2X1NVUFBPUlQKLS8qIFNIQTI1NiBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgWnNpZ21hXzI1Nl8wKHgpIChST1RSMzIoeCwyKSBeIFJPVFIzMih4LDEzKSBeIFJPVFIzMih4LDIyKSkKLSNkZWZpbmUgWnNpZ21hXzI1Nl8xKHgpIChST1RSMzIoeCw2KSBeIFJPVFIzMih4LDExKSBeIFJPVFIzMih4LDI1KSkKLSNkZWZpbmUgU2lnbWFfMjU2XzAoeCkgIChST1RSMzIoeCw3KSBeIFJPVFIzMih4LDE4KSBeIFNIUih4LDMpKQotI2RlZmluZSBTaWdtYV8yNTZfMSh4KSAgKFJPVFIzMih4LDE3KSBeIFJPVFIzMih4LDE5KSBeIFNIUih4LDEwKSkKLS8qIFNIQTI1NiBjb25zdGFudHMgKi8KLXN0YXRpYyBjb25zdCBVSU5UMzIgU0hBMjU2X0tbNjRdID0gewotICAgIDB4NDI4YTJmOThVTCwgMHg3MTM3NDQ5MVVMLCAweGI1YzBmYmNmVUwsIDB4ZTliNWRiYTVVTCwKLSAgICAweDM5NTZjMjViVUwsIDB4NTlmMTExZjFVTCwgMHg5MjNmODJhNFVMLCAweGFiMWM1ZWQ1VUwsCi0gICAgMHhkODA3YWE5OFVMLCAweDEyODM1YjAxVUwsIDB4MjQzMTg1YmVVTCwgMHg1NTBjN2RjM1VMLAotICAgIDB4NzJiZTVkNzRVTCwgMHg4MGRlYjFmZVVMLCAweDliZGMwNmE3VUwsIDB4YzE5YmYxNzRVTCwKLSAgICAweGU0OWI2OWMxVUwsIDB4ZWZiZTQ3ODZVTCwgMHgwZmMxOWRjNlVMLCAweDI0MGNhMWNjVUwsCi0gICAgMHgyZGU5MmM2ZlVMLCAweDRhNzQ4NGFhVUwsIDB4NWNiMGE5ZGNVTCwgMHg3NmY5ODhkYVVMLAotICAgIDB4OTgzZTUxNTJVTCwgMHhhODMxYzY2ZFVMLCAweGIwMDMyN2M4VUwsIDB4YmY1OTdmYzdVTCwKLSAgICAweGM2ZTAwYmYzVUwsIDB4ZDVhNzkxNDdVTCwgMHgwNmNhNjM1MVVMLCAweDE0MjkyOTY3VUwsCi0gICAgMHgyN2I3MGE4NVVMLCAweDJlMWIyMTM4VUwsIDB4NGQyYzZkZmNVTCwgMHg1MzM4MGQxM1VMLAotICAgIDB4NjUwYTczNTRVTCwgMHg3NjZhMGFiYlVMLCAweDgxYzJjOTJlVUwsIDB4OTI3MjJjODVVTCwKLSAgICAweGEyYmZlOGExVUwsIDB4YTgxYTY2NGJVTCwgMHhjMjRiOGI3MFVMLCAweGM3NmM1MWEzVUwsCi0gICAgMHhkMTkyZTgxOVVMLCAweGQ2OTkwNjI0VUwsIDB4ZjQwZTM1ODVVTCwgMHgxMDZhYTA3MFVMLAotICAgIDB4MTlhNGMxMTZVTCwgMHgxZTM3NmMwOFVMLCAweDI3NDg3NzRjVUwsIDB4MzRiMGJjYjVVTCwKLSAgICAweDM5MWMwY2IzVUwsIDB4NGVkOGFhNGFVTCwgMHg1YjljY2E0ZlVMLCAweDY4MmU2ZmYzVUwsCi0gICAgMHg3NDhmODJlZVVMLCAweDc4YTU2MzZmVUwsIDB4ODRjODc4MTRVTCwgMHg4Y2M3MDIwOFVMLAotICAgIDB4OTBiZWZmZmFVTCwgMHhhNDUwNmNlYlVMLCAweGJlZjlhM2Y3VUwsIDB4YzY3MTc4ZjJVTAotfTsKLXN0YXRpYyBjb25zdCBVSU5UMzIgU0hBMjU2X0RlZmF1bHRIYXNoVmFsdWVbOF0gPSB7Ci0gICAgMHg2YTA5ZTY2N1VMLCAweGJiNjdhZTg1VUwsIDB4M2M2ZWYzNzJVTCwgMHhhNTRmZjUzYVVMLAotICAgIDB4NTEwZTUyN2ZVTCwgMHg5YjA1Njg4Y1VMLCAweDFmODNkOWFiVUwsIDB4NWJlMGNkMTlVTAotfTsKLSNlbmRpZiAvKiBTSEEyNTZfU1VQUE9SVCAqLwotCi0KLSNpZmRlZiBTSEExX1NVUFBPUlQKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgSW5pdGlhbCBTSEExX0NUWF9TVFJVQwotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gU0hBMV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTFfSW5pdCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCkKLXsKLSAgICBOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+SGFzaFZhbHVlLCBTSEExX0RlZmF1bHRIYXNoVmFsdWUsCi0gICAgICAgIHNpemVvZihTSEExX0RlZmF1bHRIYXNoVmFsdWUpKTsKLSAgICBOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTFfQkxPQ0tfU0laRSk7Ci0gICAgcFNIQV9DVFgtPk1lc3NhZ2VMZW4gPSAwOwotICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiAgID0gMDsKLX0gLyogRW5kIG9mIFNIQTFfSW5pdCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgU0hBMSBjb21wdXRhdGlvbiBmb3Igb25lIGJsb2NrICg1MTIgYml0cykKLQotQXJndW1lbnRzOgotICAgIHBTSEFfQ1RYICAgICAgICBQb2ludGVyIHRvIFNIQTFfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEExX0hhc2ggKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgpCi17Ci0gICAgVUlOVDMyIFdfaSx0LHM7Ci0gICAgVUlOVDMyIFdbMTZdOwotICAgIFVJTlQzMiBhLGIsYyxkLGUsVCxmX3QgPSAwOwotCi0gICAgLyogUHJlcGFyZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSwge1dfaX0sIDAgPCB0IDwgMTUgKi8KLSAgICBOZGlzTW92ZU1lbW9yeShXLCBwU0hBX0NUWC0+QmxvY2ssIFNIQTFfQkxPQ0tfU0laRSk7Ci0gICAgZm9yIChXX2kgPSAwOyBXX2kgPCAxNjsgV19pKyspCi0gICAgICAgIFdbV19pXSA9IGNwdTJiZTMyKFdbV19pXSk7IC8qIEVuZGlhbiBTd2FwICovCi0gICAgICAgIC8qIEVuZCBvZiBmb3IgKi8KLQotICAgIC8qIFNIQTI1NiBoYXNoIGNvbXB1dGF0aW9uICovCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgd29ya2luZyB2YXJpYWJsZXMgKi8KLSAgICBhID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVswXTsKLSAgICBiID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXTsKLSAgICBjID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVsyXTsKLSAgICBkID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVszXTsKLSAgICBlID0gcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XTsKLQotICAgIC8qIDgwIHJvdW5kcyAqLwotICAgIGZvciAodCA9IDA7dCA8IDgwO3QrKykgewotICAgICAgICBzID0gdCAmIFNIQTFfTUFTSzsKLSAgICAgICAgaWYgKHQgPiAxNSkgeyAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMTYgPCB0IDwgNzkgKi8KLSAgICAgICAgICAgIFdbc10gPSAoV1socysxMykgJiBTSEExX01BU0tdKSBeIChXWyhzKzgpICYgU0hBMV9NQVNLXSkgXiAoV1socysyKSAmIFNIQTFfTUFTS10pIF4gV1tzXTsKLSAgICAgICAgICAgIFdbc10gPSBST1RMMzIoV1tzXSwxKTsKLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgc3dpdGNoICh0IC8gMjApIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgZl90ID0gQ2goYixjLGQpOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgZl90ID0gUGFyaXR5KGIsYyxkKTsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgIGZfdCA9IE1haihiLGMsZCk7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICBmX3QgPSBQYXJpdHkoYixjLGQpOwotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAvKiBFbmQgb2Ygc3dpdGNoICovCi0gICAgICAgIFQgPSBST1RMMzIoYSw1KSArIGZfdCArIGUgKyBTSEExX0tbdCAvIDIwXSArIFdbc107Ci0gICAgICAgIGUgPSBkOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IFJPVEwzMihiLDMwKTsKLSAgICAgICAgYiA9IGE7Ci0gICAgICAgIGEgPSBUOwotICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLQotICAgICAvKiBDb21wdXRlIHRoZSBpXnRoIGludGVybWVkaWF0ZSBoYXNoIHZhbHVlIEheKGkpICovCi0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbMF0gKz0gYTsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVsxXSArPSBiOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzJdICs9IGM7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbM10gKz0gZDsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVs0XSArPSBlOwotCi0gICAgTmRpc1plcm9NZW1vcnkocFNIQV9DVFgtPkJsb2NrLCBTSEExX0JMT0NLX1NJWkUpOwotICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiA9IDA7Ci19IC8qIEVuZCBvZiBTSEExX0hhc2ggKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFRoZSBtZXNzYWdlIGlzIGFwcGVuZGVkIHRvIGJsb2NrLiBJZiBibG9jayBzaXplID4gNjQgYnl0ZXMsIHRoZSBTSEExX0hhc2gKLXdpbGwgYmUgY2FsbGVkLgotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gU0hBMV9DVFhfU1RSVUMKLSAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSBjb250ZXh0Ci0gICAgbWVzc2FnZUxlbiAgICAgIFRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiBieXRlcwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMV9BcHBlbmQgKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgsCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuKQotewotICAgIFVJTlQgYXBwZW5kTGVuID0gMDsKLSAgICBVSU5UIGRpZmZMZW4gICA9IDA7Ci0KLSAgICB3aGlsZSAoYXBwZW5kTGVuICE9IE1lc3NhZ2VMZW4pIHsKLSAgICAgICAgZGlmZkxlbiA9IE1lc3NhZ2VMZW4gLSBhcHBlbmRMZW47Ci0gICAgICAgIGlmICgocFNIQV9DVFgtPkJsb2NrTGVuICsgZGlmZkxlbikgPCAgU0hBMV9CTE9DS19TSVpFKSB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwU0hBX0NUWC0+QmxvY2sgKyBwU0hBX0NUWC0+QmxvY2tMZW4sCi0gICAgICAgICAgICAgICAgTWVzc2FnZSArIGFwcGVuZExlbiwgZGlmZkxlbik7Ci0gICAgICAgICAgICBwU0hBX0NUWC0+QmxvY2tMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgICAgIGFwcGVuZExlbiArPSBkaWZmTGVuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIFNIQTFfQkxPQ0tfU0laRSAtIHBTSEFfQ1RYLT5CbG9ja0xlbik7Ci0gICAgICAgICAgICBhcHBlbmRMZW4gKz0gKFNIQTFfQkxPQ0tfU0laRSAtIHBTSEFfQ1RYLT5CbG9ja0xlbik7Ci0gICAgICAgICAgICBwU0hBX0NUWC0+QmxvY2tMZW4gPSBTSEExX0JMT0NLX1NJWkU7Ci0gICAgICAgICAgICBTSEExX0hhc2gocFNIQV9DVFgpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgcFNIQV9DVFgtPk1lc3NhZ2VMZW4gKz0gTWVzc2FnZUxlbjsKLX0gLyogRW5kIG9mIFNIQTFfQXBwZW5kICovCi0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAxLiBBcHBlbmQgYml0IDEgdG8gZW5kIG9mIHRoZSBtZXNzYWdlCi0gICAgMi4gQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cwotICAgIDMuIFRyYW5zZm9ybSB0aGUgSGFzaCBWYWx1ZSB0byBkaWdlc3QgbWVzc2FnZQotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgICAgIFBvaW50ZXIgdG8gU0hBMV9DVFhfU1RSVUMKLQotUmV0dXJuIFZhbHVlOgotICAgIGRpZ2VzdE1lc3NhZ2UgICBEaWdlc3QgbWVzc2FnZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMV9FbmQgKAotICAgIElOICBTSEExX0NUWF9TVFJVQyAqcFNIQV9DVFgsCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSkKLXsKLSAgICBVSU5UIGluZGV4OwotICAgIFVJTlQ2NCBtZXNzYWdlX2xlbmd0aF9iaXRzOwotCi0gICAgLyogQXBwZW5kIGJpdCAxIHRvIGVuZCBvZiB0aGUgbWVzc2FnZSAqLwotICAgIE5kaXNGaWxsTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwgMSwgMHg4MCk7Ci0KLSAgICAvKiA1NSA9IDY0IC0gOCAtIDE6IGFwcGVuZCAxIGJpdCgxIGJ5dGUpIGFuZCBtZXNzYWdlIGxlbmd0aCAoOCBieXRlcykgKi8KLSAgICBpZiAocFNIQV9DVFgtPkJsb2NrTGVuID4gNTUpCi0gICAgICAgIFNIQTFfSGFzaChwU0hBX0NUWCk7Ci0gICAgICAgIC8qIEVuZCBvZiBpZiAqLwotCi0gICAgLyogQXBwZW5kIHRoZSBsZW5ndGggb2YgbWVzc2FnZSBpbiByaWdodG1vc3QgNjQgYml0cyAqLwotICAgIG1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBwU0hBX0NUWC0+TWVzc2FnZUxlbio4OwotICAgIG1lc3NhZ2VfbGVuZ3RoX2JpdHMgPSBjcHUyYmU2NChtZXNzYWdlX2xlbmd0aF9iaXRzKTsKLSAgICBOZGlzTW92ZU1lbW9yeSgmcFNIQV9DVFgtPkJsb2NrWzU2XSwgJm1lc3NhZ2VfbGVuZ3RoX2JpdHMsIDgpOwotICAgIFNIQTFfSGFzaChwU0hBX0NUWCk7Ci0KLSAgICAvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgVUlOVDMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA1O2luZGV4KyspCi0gICAgICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdID0gY3B1MmJlMzIocFNIQV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0pOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0gICAgTmRpc01vdmVNZW1vcnkoRGlnZXN0TWVzc2FnZSwgcFNIQV9DVFgtPkhhc2hWYWx1ZSwgU0hBMV9ESUdFU1RfU0laRSk7Ci19IC8qIEVuZCBvZiBTSEExX0VuZCAqLwotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgU0hBMSBhbGdvcml0aG0KLQotQXJndW1lbnRzOgotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUX1NIQTEgKAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbiwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKQotewotCi0gICAgU0hBMV9DVFhfU1RSVUMgc2hhX2N0eDsKLQotICAgIE5kaXNaZXJvTWVtb3J5KCZzaGFfY3R4LCBzaXplb2YoU0hBMV9DVFhfU1RSVUMpKTsKLSAgICBTSEExX0luaXQoJnNoYV9jdHgpOwotICAgIFNIQTFfQXBwZW5kKCZzaGFfY3R4LCBNZXNzYWdlLCBNZXNzYWdlTGVuKTsKLSAgICBTSEExX0VuZCgmc2hhX2N0eCwgRGlnZXN0TWVzc2FnZSk7Ci19IC8qIEVuZCBvZiBSVF9TSEExICovCi0jZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCi0KLQotI2lmZGVmIFNIQTI1Nl9TVVBQT1JUCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEluaXRpYWwgU0hBMjU2X0NUWF9TVFJVQwotCi1Bcmd1bWVudHM6Ci0gICAgcFNIQV9DVFggICAgUG9pbnRlciB0byBTSEEyNTZfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBOb25lCi0KLU5vdGU6Ci0gICAgTm9uZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBTSEEyNTZfSW5pdCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYKQotewotICAgIE5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5IYXNoVmFsdWUsIFNIQTI1Nl9EZWZhdWx0SGFzaFZhbHVlLAotICAgICAgICBzaXplb2YoU0hBMjU2X0RlZmF1bHRIYXNoVmFsdWUpKTsKLSAgICBOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTI1Nl9CTE9DS19TSVpFKTsKLSAgICBwU0hBX0NUWC0+TWVzc2FnZUxlbiA9IDA7Ci0gICAgcFNIQV9DVFgtPkJsb2NrTGVuICAgPSAwOwotfSAvKiBFbmQgb2YgU0hBMjU2X0luaXQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFNIQTI1NiBjb21wdXRhdGlvbiBmb3Igb25lIGJsb2NrICg1MTIgYml0cykKLQotQXJndW1lbnRzOgotICAgIHBTSEFfQ1RYICAgIFBvaW50ZXIgdG8gU0hBMjU2X0NUWF9TVFJVQwotCi1SZXR1cm4gVmFsdWU6Ci0gICAgTm9uZQotCi1Ob3RlOgotICAgIE5vbmUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU0hBMjU2X0hhc2ggKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCkKLXsKLSAgICBVSU5UMzIgV19pLHQ7Ci0gICAgVUlOVDMyIFdbNjRdOwotICAgIFVJTlQzMiBhLGIsYyxkLGUsZixnLGgsVDEsVDI7Ci0KLSAgICAvKiBQcmVwYXJlIHRoZSBtZXNzYWdlIHNjaGVkdWxlLCB7V19pfSwgMCA8IHQgPCAxNSAqLwotICAgIE5kaXNNb3ZlTWVtb3J5KFcsIHBTSEFfQ1RYLT5CbG9jaywgU0hBMjU2X0JMT0NLX1NJWkUpOwotICAgIGZvciAoV19pID0gMDsgV19pIDwgMTY7IFdfaSsrKQotICAgICAgICBXW1dfaV0gPSBjcHUyYmUzMihXW1dfaV0pOyAvKiBFbmRpYW4gU3dhcCAqLwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0KLSAgICAvKiBTSEEyNTYgaGFzaCBjb21wdXRhdGlvbiAqLwotICAgIC8qIEluaXRpYWxpemUgdGhlIHdvcmtpbmcgdmFyaWFibGVzICovCi0gICAgYSA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbMF07Ci0gICAgYiA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbMV07Ci0gICAgYyA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbMl07Ci0gICAgZCA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbM107Ci0gICAgZSA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbNF07Ci0gICAgZiA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbNV07Ci0gICAgZyA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbNl07Ci0gICAgaCA9IHBTSEFfQ1RYLT5IYXNoVmFsdWVbN107Ci0KLSAgICAvKiA2NCByb3VuZHMgKi8KLSAgICBmb3IgKHQgPSAwO3QgPCA2NDt0KyspIHsKLSAgICAgICAgaWYgKHQgPiAxNSkgLyogUHJlcGFyZSB0aGUgbWVzc2FnZSBzY2hlZHVsZSwge1dfaX0sIDE2IDwgdCA8IDYzICovCi0gICAgICAgICAgICBXW3RdID0gU2lnbWFfMjU2XzEoV1t0LTJdKSArIFdbdC03XSArIFNpZ21hXzI1Nl8wKFdbdC0xNV0pICsgV1t0LTE2XTsKLSAgICAgICAgICAgIC8qIEVuZCBvZiBpZiAqLwotICAgICAgICBUMSA9IGggKyBac2lnbWFfMjU2XzEoZSkgKyBDaChlLGYsZykgKyBTSEEyNTZfS1t0XSArIFdbdF07Ci0gICAgICAgIFQyID0gWnNpZ21hXzI1Nl8wKGEpICsgTWFqKGEsYixjKTsKLSAgICAgICAgaCA9IGc7Ci0gICAgICAgIGcgPSBmOwotICAgICAgICBmID0gZTsKLSAgICAgICAgZSA9IGQgKyBUMTsKLSAgICAgICAgZCA9IGM7Ci0gICAgICAgIGMgPSBiOwotICAgICAgICBiID0gYTsKLSAgICAgICAgYSA9IFQxICsgVDI7Ci0gICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgIC8qIENvbXB1dGUgdGhlIGledGggaW50ZXJtZWRpYXRlIGhhc2ggdmFsdWUgSF4oaSkgKi8KLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVswXSArPSBhOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzFdICs9IGI7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbMl0gKz0gYzsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVszXSArPSBkOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzRdICs9IGU7Ci0gICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbNV0gKz0gZjsKLSAgICAgcFNIQV9DVFgtPkhhc2hWYWx1ZVs2XSArPSBnOwotICAgICBwU0hBX0NUWC0+SGFzaFZhbHVlWzddICs9IGg7Ci0KLSAgICBOZGlzWmVyb01lbW9yeShwU0hBX0NUWC0+QmxvY2ssIFNIQTI1Nl9CTE9DS19TSVpFKTsKLSAgICBwU0hBX0NUWC0+QmxvY2tMZW4gPSAwOwotfSAvKiBFbmQgb2YgU0hBMjU2X0hhc2ggKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFRoZSBtZXNzYWdlIGlzIGFwcGVuZGVkIHRvIGJsb2NrLiBJZiBibG9jayBzaXplID4gNjQgYnl0ZXMsIHRoZSBTSEEyNTZfSGFzaAotd2lsbCBiZSBjYWxsZWQuCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICBQb2ludGVyIHRvIFNIQTI1Nl9DVFhfU1RSVUMKLSAgICBtZXNzYWdlICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICBUaGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gYnl0ZXMKLQotUmV0dXJuIFZhbHVlOgotICAgIE5vbmUKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTI1Nl9BcHBlbmQgKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4pCi17Ci0gICAgVUlOVCBhcHBlbmRMZW4gPSAwOwotICAgIFVJTlQgZGlmZkxlbiAgID0gMDsKLQotICAgIHdoaWxlIChhcHBlbmRMZW4gIT0gTWVzc2FnZUxlbikgewotICAgICAgICBkaWZmTGVuID0gTWVzc2FnZUxlbiAtIGFwcGVuZExlbjsKLSAgICAgICAgaWYgKChwU0hBX0NUWC0+QmxvY2tMZW4gKyBkaWZmTGVuKSA8ICBTSEEyNTZfQkxPQ0tfU0laRSkgewotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLAotICAgICAgICAgICAgICAgIE1lc3NhZ2UgKyBhcHBlbmRMZW4sIGRpZmZMZW4pOwotICAgICAgICAgICAgcFNIQV9DVFgtPkJsb2NrTGVuICs9IGRpZmZMZW47Ci0gICAgICAgICAgICBhcHBlbmRMZW4gKz0gZGlmZkxlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBTSEFfQ1RYLT5CbG9jayArIHBTSEFfQ1RYLT5CbG9ja0xlbiwKLSAgICAgICAgICAgICAgICBNZXNzYWdlICsgYXBwZW5kTGVuLCBTSEEyNTZfQkxPQ0tfU0laRSAtIHBTSEFfQ1RYLT5CbG9ja0xlbik7Ci0gICAgICAgICAgICBhcHBlbmRMZW4gKz0gKFNIQTI1Nl9CTE9DS19TSVpFIC0gcFNIQV9DVFgtPkJsb2NrTGVuKTsKLSAgICAgICAgICAgIHBTSEFfQ1RYLT5CbG9ja0xlbiA9IFNIQTI1Nl9CTE9DS19TSVpFOwotICAgICAgICAgICAgU0hBMjU2X0hhc2gocFNIQV9DVFgpOwotICAgICAgICB9IC8qIEVuZCBvZiBpZiAqLwotICAgIH0gLyogRW5kIG9mIHdoaWxlICovCi0gICAgcFNIQV9DVFgtPk1lc3NhZ2VMZW4gKz0gTWVzc2FnZUxlbjsKLX0gLyogRW5kIG9mIFNIQTI1Nl9BcHBlbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIDEuIEFwcGVuZCBiaXQgMSB0byBlbmQgb2YgdGhlIG1lc3NhZ2UKLSAgICAyLiBBcHBlbmQgdGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIHJpZ2h0bW9zdCA2NCBiaXRzCi0gICAgMy4gVHJhbnNmb3JtIHRoZSBIYXNoIFZhbHVlIHRvIGRpZ2VzdCBtZXNzYWdlCi0KLUFyZ3VtZW50czoKLSAgICBwU0hBX0NUWCAgICAgICAgUG9pbnRlciB0byBTSEEyNTZfQ1RYX1NUUlVDCi0KLVJldHVybiBWYWx1ZToKLSAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFNIQTI1Nl9FbmQgKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKQotewotICAgIFVJTlQgaW5kZXg7Ci0gICAgVUlOVDY0IG1lc3NhZ2VfbGVuZ3RoX2JpdHM7Ci0KLSAgICAvKiBBcHBlbmQgYml0IDEgdG8gZW5kIG9mIHRoZSBtZXNzYWdlICovCi0gICAgTmRpc0ZpbGxNZW1vcnkocFNIQV9DVFgtPkJsb2NrICsgcFNIQV9DVFgtPkJsb2NrTGVuLCAxLCAweDgwKTsKLQotICAgIC8qIDU1ID0gNjQgLSA4IC0gMTogYXBwZW5kIDEgYml0KDEgYnl0ZSkgYW5kIG1lc3NhZ2UgbGVuZ3RoICg4IGJ5dGVzKSAqLwotICAgIGlmIChwU0hBX0NUWC0+QmxvY2tMZW4gPiA1NSkKLSAgICAgICAgU0hBMjU2X0hhc2gocFNIQV9DVFgpOwotICAgICAgICAvKiBFbmQgb2YgaWYgKi8KLQotICAgIC8qIEFwcGVuZCB0aGUgbGVuZ3RoIG9mIG1lc3NhZ2UgaW4gcmlnaHRtb3N0IDY0IGJpdHMgKi8KLSAgICBtZXNzYWdlX2xlbmd0aF9iaXRzID0gcFNIQV9DVFgtPk1lc3NhZ2VMZW4qODsKLSAgICBtZXNzYWdlX2xlbmd0aF9iaXRzID0gY3B1MmJlNjQobWVzc2FnZV9sZW5ndGhfYml0cyk7Ci0gICAgTmRpc01vdmVNZW1vcnkoJnBTSEFfQ1RYLT5CbG9ja1s1Nl0sICZtZXNzYWdlX2xlbmd0aF9iaXRzLCA4KTsKLSAgICBTSEEyNTZfSGFzaChwU0hBX0NUWCk7Ci0KLSAgICAvKiBSZXR1cm4gbWVzc2FnZSBkaWdlc3QsIHRyYW5zZm9ybSB0aGUgVUlOVDMyIGhhc2ggdmFsdWUgdG8gYnl0ZXMgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4O2luZGV4KyspCi0gICAgICAgIHBTSEFfQ1RYLT5IYXNoVmFsdWVbaW5kZXhdID0gY3B1MmJlMzIocFNIQV9DVFgtPkhhc2hWYWx1ZVtpbmRleF0pOwotICAgICAgICAvKiBFbmQgb2YgZm9yICovCi0gICAgTmRpc01vdmVNZW1vcnkoRGlnZXN0TWVzc2FnZSwgcFNIQV9DVFgtPkhhc2hWYWx1ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKLX0gLyogRW5kIG9mIFNIQTI1Nl9FbmQgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFNIQTI1NiBhbGdvcml0aG0KLQotQXJndW1lbnRzOgotICAgIG1lc3NhZ2UgICAgICAgICBNZXNzYWdlIGNvbnRleHQKLSAgICBtZXNzYWdlTGVuICAgICAgVGhlIGxlbmd0aCBvZiBtZXNzYWdlIGluIGJ5dGVzCi0KLVJldHVybiBWYWx1ZToKLSAgICBkaWdlc3RNZXNzYWdlICAgRGlnZXN0IG1lc3NhZ2UKLQotTm90ZToKLSAgICBOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUX1NIQTI1NiAoCi0gICAgSU4gIGNvbnN0IFVJTlQ4IE1lc3NhZ2VbXSwKLSAgICBJTiAgVUlOVCBNZXNzYWdlTGVuLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pCi17Ci0gICAgU0hBMjU2X0NUWF9TVFJVQyBzaGFfY3R4OwotCi0gICAgTmRpc1plcm9NZW1vcnkoJnNoYV9jdHgsIHNpemVvZihTSEEyNTZfQ1RYX1NUUlVDKSk7Ci0gICAgU0hBMjU2X0luaXQoJnNoYV9jdHgpOwotICAgIFNIQTI1Nl9BcHBlbmQoJnNoYV9jdHgsIE1lc3NhZ2UsIE1lc3NhZ2VMZW4pOwotICAgIFNIQTI1Nl9FbmQoJnNoYV9jdHgsIERpZ2VzdE1lc3NhZ2UpOwotfSAvKiBFbmQgb2YgUlRfU0hBMjU2ICovCi0jZW5kaWYgLyogU0hBMjU2X1NVUFBPUlQgKi8KLQotLyogRW5kIG9mIGNyeXB0X3NoYTIuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9kZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1NzA0YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9kZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGFwX2Rmcy5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBTdXBwb3J0IERGUyBmdW5jdGlvbi4KLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX1JBREFSX0RVUkFUSU9OX1RBQkxFCi17Ci0JVUxPTkcgUkREdXJSZWdpb247Ci0JVUxPTkcgUmFkYXJTaWduYWxEdXJhdGlvbjsKLQlVTE9ORyBUb2xlcmFuY2U7Ci19IFJBREFSX0RVUkFUSU9OX1RBQkxFLCAqUFJBREFSX0RVUkFUSU9OX1RBQkxFOwotCi0KLQotVUNIQVIgUmRJZGxlVGltZVRhYmxlW01BWF9SRF9SRUdJT05dWzRdID0KLXsKLQl7OSwgMjUwLCAyNTAsIDI1MH0sCQkvLyBDRQotI2lmZGVmIERGU19GQ0NfQlc0MF9GSVgKLQl7MSwgMjUwLCAyNTAsIDI1MH0sCQkvLyBGQ0MKLSNlbHNlCi0JezQsIDI1MCwgMjUwLCAyNTB9LAkJLy8gRkNDCi0jZW5kaWYKLQl7NCwgMjUwLCAyNTAsIDI1MH0sCQkvLyBKQVAKLQl7MTUsIDI1MCwgMjUwLCAyNTB9LAkvLyBKQVBfVzUzCi0JezQsIDI1MCwgMjUwLCAyNTB9CQkvLyBKQVBfVzU2Ci19OwotCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotc3RhdGljIHZvaWQgVG9uZVJhZGFyUHJvZ3JhbShQUlRNUF9BREFQVEVSIHBBZCk7Ci1zdGF0aWMgdm9pZCBUb25lUmFkYXJFbmFibGUoUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotI2lmZGVmIERGU19TVVBQT1JUCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQmJwIFJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEJicFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVDggUmFkYXJQZXJpb2Q7Ci0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTE0LCAweDAyKTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIxLCAweDIwKTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIyLCAweDAwKTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgMTIzLCAweDA4LyoweDgwKi8pOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjQsIDB4MjgpOwotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCAxMjUsIDB4ZmYpOwotCi0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9PSBKQVApIHx8IChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9PSBKQVBfVzUzKSB8fCAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPT0gSkFQX1c1NikpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbiA9IEpBUDsKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPSBKYXBSYWRhclR5cGUocEFkKTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uID09IEpBUF9XNTYpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lID0gMTM7Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb24gPT0gSkFQX1c1MykKLQkJewotCQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUgPSAxNTsKLQkJfQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLQkJcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPSAxOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQl9Ci0jZW5kaWYgLy8gTUVSR0VfQVJDSF9URUFNIC8vCi0KLQlSYWRhclBlcmlvZCA9ICgoVUlOVClSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgKFVJTlQpcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDwgMjUwID8KLQkJCShSZElkbGVUaW1lVGFibGVbcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkREdXJSZWdpb25dWzBdICsgcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuRGZzU2Vzc2lvblRpbWUpIDogMjUwOwotCi0jaWZkZWYgTUVSR0VfQVJDSF9URUFNCi0KLQotI2Vsc2UgLy8gT3JpZ2luYWwgUlQyOHh4IHNvdXJjZSBjb2RlLgotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIwLCAweDFkKTsKLQlSVE1QX0lPX1dSSVRFOChwQWQsIDB4NzAyMSwgMHg0MCk7Ci0jZW5kaWYgLy8gTUVSR0VfQVJDSF9URUFNIC8vCi0KLQlSYWRhckRldGVjdGlvblN0YXJ0KHBBZCwgMCwgUmFkYXJQZXJpb2QpOwotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUJicCBSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBCYnBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUlRNUF9JT19XUklURTgocEFkLCAweDcwMjAsIDB4MWQpOwotCVJUTVBfSU9fV1JJVEU4KHBBZCwgMHg3MDIxLCAweDYwKTsKLQotCVJhZGFyRGV0ZWN0aW9uU3RvcChwQWQpOwotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJhZGFyIGRldGVjdGlvbiByb3V0aW5lCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBDVFNQcm90ZWN0LAotCUlOIFVJTlQ4IENUU1BlcmlvZCkKLXsKLQlVSU5UOCBEZnNBY3RpdmVUaW1lID0gKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkRmc1Nlc3Npb25UaW1lICYgMHgxZik7Ci0JVUlOVDggQ3RzUHJvdGVjdCA9IChDVFNQcm90ZWN0ID09IDEpID8gMHgwMiA6IDB4MDE7IC8vIENUUyBwcm90ZWN0LgotCi0JaWYgKENUU1Byb3RlY3QgIT0gMCkKLQl7Ci0JCXN3aXRjaChwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbikKLQkJewotCQljYXNlIEZDQzoKLQkJY2FzZSBKQVBfVzU2OgotCQkJQ3RzUHJvdGVjdCA9IDB4MDM7Ci0JCQlicmVhazsKLQotCQljYXNlIEpBUDoKLQkJCXsKLQkJCQlVQ0hBUiBSRER1clJlZ2lvbjsKLQkJCQlSRER1clJlZ2lvbiA9IEphcFJhZGFyVHlwZShwQWQpOwotCQkJCWlmIChSRER1clJlZ2lvbiA9PSBKQVBfVzU2KQotCQkJCQlDdHNQcm90ZWN0ID0gMHgwMzsKLQkJCQllbHNlCi0JCQkJCUN0c1Byb3RlY3QgPSAweDAyOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCWNhc2UgQ0U6Ci0JCWNhc2UgSkFQX1c1MzoKLQkJZGVmYXVsdDoKLQkJCUN0c1Byb3RlY3QgPSAweDAyOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCQlDdHNQcm90ZWN0ID0gMHgwMTsKLQotCi0JLy8gc2VuZCBzdGFydC1SRCB3aXRoIENUUyBwcm90ZWN0aW9uIGNvbW1hbmQgdG8gTUNVCi0JLy8gaGlnaGJ5dGUgWzddCQlyZXNlcnZlCi0JLy8gaGlnaGJ5dGUgWzY6NV0JMHg6IHN0b3AgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24KLQkvLyBoaWdoYnl0ZSBbMTBdOglTdGFydCBDYXJyaWVyL1JhZGFyIGRldGVjdGlvbiB3aXRob3V0IENUUyBwcm90ZWN0aW9uLCAxMTogU3RhcnQgQ2Fycmllci9SYWRhciBkZXRlY3Rpb24gd2l0aCBDVFMgcHJvdGVjdGlvbgotCS8vIGhpZ2hieXRlIFs0OjBdCVJhZGFyL2NhcnJpZXIgZGV0ZWN0aW9uIGR1cmF0aW9uLiBJbiAxbXMuCi0KLQkvLyBsb3dieXRlIFs3OjBdCVJhZGFyL2NhcnJpZXIgZGV0ZWN0aW9uIHBlcmlvZCwgaW4gMW1zLgotCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg2MCwgMHhmZiwgQ1RTUGVyaW9kLCBEZnNBY3RpdmVUaW1lIHwgKEN0c1Byb3RlY3QgPDwgNSkpOwotCS8vQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDYzLCAweGZmLCAxMCwgMCk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSYWRhciBkZXRlY3Rpb24gcm91dGluZQotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlUUlVFCUZvdW5kIHJhZGFyIHNpZ25hbAotCQlGQUxTRQlOb3QgZm91bmQgcmFkYXIgc2lnbmFsCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJhZGFyRGV0ZWN0aW9uU3RvcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJhZGFyRGV0ZWN0aW9uU3RvcC5cbiIpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NjAsIDB4ZmYsIDB4MDAsIDB4MDApOwkvLyBzZW5kIHN0YXJ0LVJEIHdpdGggQ1RTIHByb3RlY3Rpb24gY29tbWFuZCB0byBNQ1UKLQotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSYWRhciBjaGFubmVsIGNoZWNrIHJvdXRpbmUKLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJVFJVRQluZWVkIHRvIGRvIHJhZGFyIGRldGVjdAotCQlGQUxTRQluZWVkIG5vdCB0byBkbyByYWRhciBkZXRlY3QKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlDaCkKLXsKLQlJTlQJCWk7Ci0JQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQotCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQl7Ci0JCWlmIChDaCA9PSBwQWQtPkNoYW5uZWxMaXN0W2ldLkNoYW5uZWwpCi0JCXsKLQkJCXJlc3VsdCA9IHBBZC0+Q2hhbm5lbExpc3RbaV0uRGZzUmVxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0jaWZkZWYgREZTX1NVUFBPUlQKLQotVUxPTkcgSmFwUmFkYXJUeXBlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVMT05HCQlpOwotCWNvbnN0IFVDSEFSCUNoYW5uZWxbMTVdPXs1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9OwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJERHVyUmVnaW9uICE9IEpBUCkKLQl7Ci0JCXJldHVybiBwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRER1clJlZ2lvbjsKLQl9Ci0KLQlmb3IgKGk9MDsgaTwxNTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gQ2hhbm5lbFtpXSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA8IDQpCi0JCXJldHVybiBKQVBfVzUzOwotCWVsc2UgaWYgKGkgPCAxNSkKLQkJcmV0dXJuIEpBUF9XNTY7Ci0JZWxzZQotCQlyZXR1cm4gSkFQOyAvLyBXNTIKLQotfQotCi1VTE9ORyBSVE1QQmJwUmVhZFJhZGFyRHVyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDggYnl0ZVZhbHVlID0gMDsKLQlVTE9ORyByZXN1bHQ7Ci0KLQlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTUsICZieXRlVmFsdWUpOwotCi0JcmVzdWx0ID0gMDsKLQlzd2l0Y2ggKGJ5dGVWYWx1ZSkKLQl7Ci0JY2FzZSAxOiAvLyByYWRhciBzaWduYWwgZGV0ZWN0ZWQgYnkgcHVsc2UgbW9kZS4KLQljYXNlIDI6IC8vIHJhZGFyIHNpZ25hbCBkZXRlY3RlZCBieSB3aWR0aCBtb2RlLgotCQlyZXN1bHQgPSBSVE1QUmVhZFJhZGFyRHVyYXRpb24ocEFkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDA6IC8vIE5vIHJhZGFyIHNpZ25hbC4KLQlkZWZhdWx0OgotCi0JCXJlc3VsdCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLVVMT05HIFJUTVBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVTE9ORyByZXN1bHQgPSAwOwotCi0jaWZkZWYgREZTX1NVUFBPUlQKLQlVSU5UOCBkdXJhdGlvbjEgPSAwLCBkdXJhdGlvbjIgPSAwLCBkdXJhdGlvbjMgPSAwOwotCi0KLQlCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMTYsICZkdXJhdGlvbjEpOwotCUJCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjExNywgJmR1cmF0aW9uMik7Ci0JQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTE4LCAmZHVyYXRpb24zKTsKLQlyZXN1bHQgPSAoZHVyYXRpb24xIDw8IDE2KSArIChkdXJhdGlvbjIgPDwgOCkgKyBkdXJhdGlvbjM7Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KLQotCXJldHVybiByZXN1bHQ7Ci0KLX0KLQotVk9JRCBSVE1QQ2xlYW5SYWRhckR1cmF0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKQotewotCXJldHVybjsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBSYWRhciB3YXZlIGRldGVjdGlvbi4gVGhlIEFQSSBzaG91bGQgYmUgaW52b2tlIGVhY2ggc2Vjb25kLgotCi0gICAgQXJndW1lbnRzOgotICAgICAgICBwQWQgICAgICAgICAtIEFkYXB0ZXIgcG9pbnRlcgotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEFwUmFkYXJEZXRlY3RQZXJpb2RpYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlJTlQJaTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkluU2VydmljZU1vbml0b3JDb3VudCsrOwotCi0JZm9yIChpPTA7IGk8cEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID4gMCkKLQkJewotCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlIC0tOwotCQkJaWYgKChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCU1KSA9PSAwKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhZGFyRGV0ZWN0UGVyaW9kaWMgLSBjaD0lZCwgUmVtYWluaW5nVGltZUZvclVzZT0lZFxuIiwgcEFkLT5DaGFubmVsTGlzdFtpXS5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vcmFkYXIgZGV0ZWN0Ci0JaWYgKChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCXsKLQkJUmFkYXJEZXRlY3RQZXJpb2RpYyhwQWQpOwotCX0KLQotCXJldHVybjsKLX0KLQotLy8gUGVyaW9kaWMgUmFkYXIgZGV0ZWN0aW9uLCBzd2l0Y2ggY2hhbm5lbCB3aWxsIG9jY3VyIGluIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KCkKLS8vIEJlZm9yZSBzd2l0Y2ggY2hhbm5lbCwgZHJpdmVyIG5lZWRzIGRvaW5nIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudC4KLVZPSUQgUmFkYXJEZXRlY3RQZXJpb2RpYygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQotCS8vIG5lZWQgdG8gY2hlY2sgY2hhbm5lbCBhdmFpbGFiaWxpdHksIGFmdGVyIHN3aXRjaCBjaGFubmVsCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSAhPSBSRF9TSUxFTkNFX01PREUpCi0JCQlyZXR1cm47Ci0KLQotCi0JLy8gY2hhbm5lbCBhdmFpbGFiaWxpdHkgY2hlY2sgdGltZSBpcyA2MHNlYywgdXNlIDY1IGZvciBhc3N1cmFuY2UKLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRDb3VudCsrID4gcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTm90IGZvdW5kIHJhZGFyIHNpZ25hbCwgc3RhcnQgc2VuZCBiZWFjb24gYW5kIHJhZGFyIGRldGVjdGlvbiBpbiBzZXJ2aWNlIG1vbml0b3JcblxuIikpOwotCQlCYnBSYWRhckRldGVjdGlvblN0b3AocEFkKTsKLQotCi0JCUFzaWNFbmFibGVCc3NTeW5jKHBBZCk7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX05PUk1BTF9NT0RFOwotCi0KLQotCQlyZXR1cm47Ci0JfQotCi0JcmV0dXJuOwotfQotI2VuZGlmIC8vIERGU19TVVBQT1JUIC8vCi0KLSNpZmRlZiBERlNfU1VQUE9SVAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCQljaGFuZ2UgY2hhbm5lbCBtb3ZpbmcgdGltZSBmb3IgREZTIHRlc3RpbmcuCi0KLQlBcmd1bWVudHM6Ci0JICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIHNldCBDaE1vdlRpbWU9W3ZhbHVlXQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9DaE1vdmluZ1RpbWVfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZykKLXsKLQlVSU5UOCBWYWx1ZTsKLQotCVZhbHVlID0gKFVJTlQ4KSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ2hNb3ZpbmdUaW1lID0gVmFsdWU7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6ICVkXG4iLCBfX0ZVTkNUSU9OX18sCi0JCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNoTW92aW5nVGltZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfTG9uZ1B1bHNlUmFkYXJUaF9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKQotewotCVVJTlQ4IFZhbHVlOwotCi0JVmFsdWUgPSAoVUlOVDgpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPiAxMCA/IDEwIDogc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkxvbmdQdWxzZVJhZGFyVGggPSBWYWx1ZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjogJWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9lZV9lZnVzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFlMzA1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlX2VmdXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JZWVfZWZ1c2UuYwotCi0JQWJzdHJhY3Q6Ci0JTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLSNkZWZpbmUgRUZVU0VfVVNBR0VfTUFQX1NUQVJUCTB4MmQwCi0jZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9FTkQJCTB4MmZjCi0jZGVmaW5lIEVGVVNFX1VTQUdFX01BUF9TSVpFCTQ1Ci0KLQotCi0jZGVmaW5lIEVGVVNFX0VFUFJPTV9ERUZVTFRfRklMRQkiUlQzMHh4RUVQUk9NLmJpbiIKLSNkZWZpbmUgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFCTEwMjQKLQotCi0KLSNkZWZpbmUgRUZVU0VfVEFHCQkJCTB4MmZlCi0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0VGVVNFX0NUUkxfU1RSVUMgewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICAgICAgIFNFTF9FRlVTRToxOwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fS0lDSzoxOwotCQlVSU5UMzIgICAgICAgICAgICBSRVNFUlZFRDo0OwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fQUlOOjEwOwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTERPX09OX1RJTUU6MjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PRkZfVElNRTo2OwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fTU9ERToyOwotCQlVSU5UMzIgICAgICAgICAgICBFRlNST01fQU9VVDo2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JRUZVU0VfQ1RSTF9TVFJVQywgKlBFRlVTRV9DVFJMX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VGVVNFX0NUUkxfU1RSVUMgewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BT1VUOjY7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9NT0RFOjI7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9MRE9fT0ZGX1RJTUU6NjsKLQkJVUlOVDMyICAgICAgICAgICAgRUZTUk9NX0xET19PTl9USU1FOjI7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9BSU46MTA7Ci0JCVVJTlQzMiAgICAgICAgICAgIFJFU0VSVkVEOjQ7Ci0JCVVJTlQzMiAgICAgICAgICAgIEVGU1JPTV9LSUNLOjE7Ci0JCVVJTlQzMiAgICAgICAgICAgIFNFTF9FRlVTRToxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JRUZVU0VfQ1RSTF9TVFJVQywgKlBFRlVTRV9DVFJMX1NUUlVDOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotc3RhdGljIFVDSEFSIGVGdXNlUmVhZFJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpOwotCi1zdGF0aWMgVk9JRCBlRnVzZVJlYWRQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVVNIT1JUIGxwSW5CdWZmZXIsCi0JSU4JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLQlPVVQJUFVTSE9SVCBscE91dEJ1ZmZlciwKLQlJTglVTE9ORyBuT3V0QnVmZmVyU2l6ZSk7Ci0KLXN0YXRpYyBWT0lEIGVGdXNlUGh5c2ljYWxXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpOwotCi1zdGF0aWMgTlRTVEFUVVMgZUZ1c2VXcml0ZVJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSk7Ci0KLXN0YXRpYyBWT0lEIGVGdXNlV3JpdGVQaHlzaWNhbCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQVVNIT1JUIGxwSW5CdWZmZXIsCi0JVUxPTkcgbkluQnVmZmVyU2l6ZSwKLQlQVUNIQVIgbHBPdXRCdWZmZXIsCi0JVUxPTkcgbk91dEJ1ZmZlclNpemUpOwotCi0KLXN0YXRpYyBOVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVDSEFSIGVGdXNlUmVhZFJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpCi17Ci0JRUZVU0VfQ1RSTF9TVFJVQwkJZUZ1c2VDdHJsU3RydWM7Ci0JaW50CWk7Ci0JVVNIT1JUCWVmdXNlRGF0YU9mZnNldDsKLQlVSU5UMzIJZGF0YTsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCi0JLy9TdGVwMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQkvL1VzZSB0aGUgZWVwcm9tIGxvZ2ljYWwgYWRkcmVzcyBhbmQgY292ZXJ0IHRvIGFkZHJlc3MgdG8gYmxvY2sgbnVtYmVyCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAwLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMDsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDUwMCkKLQl7Ci0JCS8vcnRtcC5Id01lbW9yeVJlYWREd29yZChFRlVTRV9DVFJMLCAoRFdPUkQgKikgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0JCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCVJUTVB1c2VjRGVsYXkoMik7Ci0JCWkrKzsKLQl9Ci0KLQkvL2lmIEVGU1JPTV9BT1VUIGlzIG5vdCBmb3VuZCBpbiBwaHlzaWNhbCBhZGRyZXNzLCB3cml0ZSAweGZmZmYKLQlpZiAoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FPVVQgPT0gMHgzZikKLQl7Ci0JCWZvcihpPTA7IGk8TGVuZ3RoLzI7IGkrKykKLQkJCSoocERhdGErMippKSA9IDB4ZmZmZjsKLQl9Ci0JZWxzZQotCXsKLQkJLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5MC0weDU5QykKLQkJZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzIC0gKE9mZnNldCAmIDB4Qyk7Ci0JCS8vZGF0YSBob2xkIDQgYnl0ZXMgZGF0YS4KLQkJLy9JbiBSVE1QX0lPX1JFQUQzMiB3aWxsIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZSAzMi1ieXRlcyBzd2FwcGluZwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgJmRhdGEpOwotCQkvL0RlY2lkZSB0aGUgdXBwZXIgMiBieXRlcyBvciB0aGUgYm90dG9tIDIgYnl0ZXMuCi0JCS8vIExpdHRsZS1lbmRpYW4JCVMJfAlTCUJpZy1lbmRpYW4KLQkJLy8gYWRkcgkzCTIJMQkwCXwJMAkxCTIJMwotCQkvLyBPcmktVglECUMJQglBCXwJQQlCCUMJRAotCQkvL0FmdGVyIHN3YXBwaW5nCi0JCS8vCQlECUMJQglBCXwJRAlDCUIJQQotCQkvL1JldHVybiAyLWJ5dGVzCi0JCS8vVGhlIHJldHVybiBieXRlIHN0YXRycyBmcm9tIFMuIFRoZXJlZm9yZSwgdGhlIGxpdHRsZS1lbmRpYW4gd2lsbCByZXR1cm4gQkEsIHRoZSBCaWctZW5kaWFuIHdpbGwgcmV0dXJuIERDLgotCQkvL0ZvciByZXR1cm5pbmcgdGhlIGJvdHRvbSAyIGJ5dGVzLCB0aGUgQmlnLWVuZGlhbiBzaG91bGQgc2hpZnQgcmlnaHQgMi1ieXRlcy4KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCWRhdGEgPSBkYXRhIDw8ICg4KigoT2Zmc2V0ICYgMHgzKV4weDIpKTsKLSNlbHNlCi0JCWRhdGEgPSBkYXRhID4+ICg4KihPZmZzZXQgJiAweDMpKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQkJTmRpc01vdmVNZW1vcnkocERhdGEsICZkYXRhLCBMZW5ndGgpOwotCX0KLQotCXJldHVybiAoVUNIQVIpIGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BT1VUOwotCi19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIGVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlPVVQJVVNIT1JUKiBwRGF0YSkKLXsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlpbnQJaTsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkvL1N0ZXAwLiBXcml0ZSAxMC1iaXQgb2YgYWRkcmVzcyB0byBFRlNST01fQUlOICgweDU4MCwgYml0MjU6Yml0MTYpLiBUaGUgYWRkcmVzcyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25tZW50LgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkvL1N0ZXAxLiBXcml0ZSBFRlNST01fTU9ERSAoMHg1ODAsIGJpdDc6Yml0NikgdG8gMS4KLQkvL1JlYWQgaW4gcGh5c2ljYWwgdmlldwotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMTsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPSAxOwotCi0JTmRpc01vdmVNZW1vcnkoJmRhdGEsICZlRnVzZUN0cmxTdHJ1YywgNCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkvL1N0ZXAzLiBQb2xsaW5nIEVGU1JPTV9LSUNLKDB4NTgwLCBiaXQzMCkgdW50aWwgaXQgYmVjb21lIDAgYWdhaW4uCi0JaSA9IDA7Ci0Jd2hpbGUoaSA8IDUwMCkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJYnJlYWs7Ci0JCVJUTVB1c2VjRGVsYXkoMik7Ci0JCWkrKzsKLQl9Ci0KLQkvL1N0ZXA0LiBSZWFkIDE2LWJ5dGUgb2YgZGF0YSBmcm9tIEVGVVNFX0RBVEEwLTMgKDB4NTlDLTB4NTkwKQotCS8vQmVjYXVzZSB0aGUgc2l6ZSBvZiBlYWNoIEVGVVNFX0RBVEEgaXMgNCBCeXRlcywgdGhlIHNpemUgb2YgYWRkcmVzcyBvZiBlYWNoIGlzIDIgYml0cy4KLQkvL1RoZSBwcmV2aW91cyAyIGJpdHMgaXMgdGhlIEVGVVNFX0RBVEEgbnVtYmVyLCB0aGUgbGFzdCAyIGJpdHMgaXMgdXNlZCB0byBkZWNpZGUgd2hpY2ggYnl0ZXMKLQkvL0RlY2lkZSB3aGljaCBFRlVTRV9EQVRBIHRvIHJlYWQKLQkvLzU5MDpGIEUgRCBDCi0JLy81OTQ6QiBBIDkgOAotCS8vNTk4OjcgNiA1IDQKLQkvLzU5QzozIDIgMSAwCi0JZWZ1c2VEYXRhT2Zmc2V0ID0gIEVGVVNFX0RBVEEzIC0gKE9mZnNldCAmIDB4QykgIDsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgZWZ1c2VEYXRhT2Zmc2V0LCAmZGF0YSk7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCWRhdGEgPSBkYXRhIDw8ICg4KigoT2Zmc2V0ICYgMHgzKV4weDIpKTsKLSNlbHNlCi0JZGF0YSA9IGRhdGEgPj4gKDgqKE9mZnNldCAmIDB4MykpOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCU5kaXNNb3ZlTWVtb3J5KHBEYXRhLCAmZGF0YSwgTGVuZ3RoKTsKLQotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFZPSUQgZUZ1c2VSZWFkUGh5c2ljYWwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVTSE9SVCBscEluQnVmZmVyLAotCUlOCVVMT05HIG5JbkJ1ZmZlclNpemUsCi0JT1VUCVBVU0hPUlQgbHBPdXRCdWZmZXIsCi0JSU4JVUxPTkcgbk91dEJ1ZmZlclNpemUKLSkKLXsKLQlVU0hPUlQqIHBJbkJ1ZiA9IChVU0hPUlQqKWxwSW5CdWZmZXI7Ci0JVVNIT1JUKiBwT3V0QnVmID0gKFVTSE9SVCopbHBPdXRCdWZmZXI7Ci0KLQlVU0hPUlQgT2Zmc2V0ID0gcEluQnVmWzBdOwkJCQkJLy9hZGRyCi0JVVNIT1JUIExlbmd0aCA9IHBJbkJ1ZlsxXTsJCQkJCS8vbGVuZ3RoCi0JaW50CQlpOwotCi0JZm9yKGk9MDsgaTxMZW5ndGg7IGkrPTIpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsT2Zmc2V0K2ksIDIsICZwT3V0QnVmW2kvMl0pOwotCX0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5UU1RBVFVTIGVGdXNlUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCUxlbmd0aCkKLXsKLQlVU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilwRGF0YTsKLQlOVFNUQVRVUyBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQlVQ0hBUglFRlNST01fQU9VVDsKLQlpbnQJaTsKLQotCWZvcihpPTA7IGk8TGVuZ3RoOyBpKz0yKQotCXsKLQkJRUZTUk9NX0FPVVQgPSBlRnVzZVJlYWRSZWdpc3RlcnMocEFkLCBPZmZzZXQraSwgMiwgJnBPdXRCdWZbaS8yXSk7Ci0JfQotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgVk9JRCBlRnVzZVBoeXNpY2FsV3JpdGVSZWdpc3RlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUIE9mZnNldCwKLQlJTglVU0hPUlQgTGVuZ3RoLAotCU9VVAlVU0hPUlQqIHBEYXRhKQotewotCUVGVVNFX0NUUkxfU1RSVUMJCWVGdXNlQ3RybFN0cnVjOwotCWludAlpOwotCVVTSE9SVAllZnVzZURhdGFPZmZzZXQ7Ci0JVUlOVDMyCWRhdGEsIGVGdXNlRGF0YUJ1ZmZlcls0XTsKLQotCS8vU3RlcDAuIFdyaXRlIDE2LWJ5dGUgb2YgZGF0YSB0byBFRlVTRV9EQVRBMC0zICgweDU5MC0weDU5QyksIHdoZXJlIEVGVVNFX0RBVEEwIGlzIHRoZSBMU0IgRFcsIEVGVVNFX0RBVEEzIGlzIHRoZSBNU0IgRFcuCi0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vcmVhZCBjdXJyZW50IHZhbHVlcyBvZiAxNi1ieXRlIGJsb2NrCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCi0JLy9TdGVwMC4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gT2Zmc2V0ICYgMHhmZmYwOwotCi0JLy9TdGVwMS4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDEuCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX01PREUgPSAxOwotCi0JLy9TdGVwMi4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCByZWFkIHByb2NlZHVyZS4KLQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9IDE7Ci0KLQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCS8vU3RlcDMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQlpID0gMDsKLQl3aGlsZShpIDwgNTAwKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkJaWYoZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0tJQ0sgPT0gMCkKLQkJCWJyZWFrOwotCQlSVE1QdXNlY0RlbGF5KDIpOwotCQlpKys7Ci0JfQotCi0JLy9TdGVwNC4gUmVhZCAxNi1ieXRlIG9mIGRhdGEgZnJvbSBFRlVTRV9EQVRBMC0zICgweDU5Qy0weDU5MCkKLQllZnVzZURhdGFPZmZzZXQgPSAgRUZVU0VfREFUQTM7Ci0JZm9yKGk9MDsgaTwgNDsgaSsrKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIChQVUlOVDMyKSAmZUZ1c2VEYXRhQnVmZmVyW2ldKTsKLQkJZWZ1c2VEYXRhT2Zmc2V0IC09ICA0OwotCX0KLQotCS8vVXBkYXRlIHRoZSB2YWx1ZSwgdGhlIG9mZnNldCBpcyBtdWx0aXBsZSBvZiAyLCBsZW5ndGggaXMgMgotCWVmdXNlRGF0YU9mZnNldCA9IChPZmZzZXQgJiAweGMpID4+IDI7Ci0JZGF0YSA9IHBEYXRhWzBdICYgMHhmZmZmOwotCS8vVGhlIG9mZnNldCBzaG91bGQgYmUgMHgqKioxMCBvciAweCoqKjAwCi0JaWYoKE9mZnNldCAlIDQpICE9IDApCi0JewotCQllRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSA9IChlRnVzZURhdGFCdWZmZXJbZWZ1c2VEYXRhT2Zmc2V0XSAmIDB4ZmZmZikgfCAoZGF0YSA8PCAxNik7Ci0JfQotCWVsc2UKLQl7Ci0JCWVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdID0gKGVGdXNlRGF0YUJ1ZmZlcltlZnVzZURhdGFPZmZzZXRdICYgMHhmZmZmMDAwMCkgfCBkYXRhOwotCX0KLQotCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQlmb3IoaT0wOyBpPCA0OyBpKyspCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsIGVGdXNlRGF0YUJ1ZmZlcltpXSk7Ci0JCWVmdXNlRGF0YU9mZnNldCAtPSA0OwotCX0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0JLy9TdGVwMS4gV3JpdGUgMTAtYml0IG9mIGFkZHJlc3MgdG8gRUZTUk9NX0FJTiAoMHg1ODAsIGJpdDI1OmJpdDE2KS4gVGhlIGFkZHJlc3MgbXVzdCBiZSAxNi1ieXRlIGFsaWdubWVudC4KLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCi0JZUZ1c2VDdHJsU3RydWMuZmllbGQuRUZTUk9NX0FJTiA9IE9mZnNldCAmIDB4ZmZmMDsKLQotCS8vU3RlcDIuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAzLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMzsKLQotCS8vU3RlcDMuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgd3JpdGUgcHJvY2VkdXJlLgotCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCU5kaXNNb3ZlTWVtb3J5KCZkYXRhLCAmZUZ1c2VDdHJsU3RydWMsIDQpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVGVVNFX0NUUkwsIGRhdGEpOwotCi0JLy9TdGVwNC4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLiBJdO+/ve+/vXMgZG9uZS4KLQlpID0gMDsKLQotCXdoaWxlKGkgPCA1MDApCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVGVVNFX0NUUkwsICZlRnVzZUN0cmxTdHJ1Yy53b3JkKTsKLQotCQlpZihlRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fS0lDSyA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJaSsrOwotCX0KLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQotCUFyZ3VtZW50czoKLQotCVJldHVybiBWYWx1ZToKLQotCU5vdGU6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBOVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVCBPZmZzZXQsCi0JSU4JVVNIT1JUIExlbmd0aCwKLQlJTglVU0hPUlQqIHBEYXRhKQotewotCVVTSE9SVAlpLExvb3A9MDsKLQlVU0hPUlQJZUZ1c2VEYXRhOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzcywgQmxrTnVtID0gMHhmZmZmOwotCVVDSEFSCUVGU1JPTV9BT1VUOwotCi0JVVNIT1JUIGFkZHIsdG1wYWRkciwgSW5CdWZbM10sIHRtcE9mZnNldDsKLQlVU0hPUlQgYnVmZmVyWzhdOwotCUJPT0xFQU4JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVycyBPZmZzZXQ9JXgsIHBEYXRhPSV4XG4iLCBPZmZzZXQsICpwRGF0YSkpOwotCi0JLy9TdGVwIDAuIGZpbmQgdGhlIGVudHJ5IGluIHRoZSBtYXBwaW5nIHRhYmxlCi0JLy9UaGUgYWRkcmVzcyBvZiBFRVBST00gaXMgMi1ieXRlcyBhbGlnbm1lbnQuCi0JLy9UaGUgbGFzdCBiaXQgaXMgdXNlZCBmb3IgYWxpZ25tZW50LCBzbyBpdCBtdXN0IGJlIDAuCi0JdG1wT2Zmc2V0ID0gT2Zmc2V0ICYgMHhmZmZlOwotCUVGU1JPTV9BT1VUID0gZUZ1c2VSZWFkUmVnaXN0ZXJzKHBBZCwgdG1wT2Zmc2V0LCAyLCAmZUZ1c2VEYXRhKTsKLQotCWlmKCBFRlNST01fQU9VVCA9PSAweDNmKQotCXsJLy9maW5kIGF2YWlsYWJsZSBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlcgotCQkvL3RoZSBsb2dpY2FsIGFkZHJlc3MgZG9lcyBub3QgZXhpc3QsIGZpbmQgYW4gZW1wdHkgb25lCi0JCS8vZnJvbSB0aGUgZmlyc3QgYWRkcmVzcyBvZiBibG9jayA0NT0xNio0NT0weDJkMCB0byB0aGUgbGFzdCBhZGRyZXNzIG9mIGJsb2NrIDQ3Ci0JCS8vPT0+NDgqMTYtMyhyZXNlcnZlZCk9MkZDCi0JCWZvciAoaT1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7IGk8PUVGVVNFX1VTQUdFX01BUF9FTkQ7IGkrPTIpCi0JCXsKLQkJCS8vUmV0cml2ZSB0aGUgbG9naWNhbCBibG9jayBudWJtZXIgZm9ybSBlYWNoIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkvL0l0IHdpbGwgYWNjZXNzIHR3byBsb2dpY2FsIGFkZHJlc3MgcG9pbnRlciBlYWNoIHRpbWUuCi0JCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCXsvL05vdCB1c2VkIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJCXsvL05vdCB1c2VkIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JCQkJaWYgKGkgIT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUKzE7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUJsa051bSA9IEVGU1JPTV9BT1VUOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnMgQmxrTnVtID0gJWQgXG4iLCBCbGtOdW0pKTsKLQotCWlmKEJsa051bSA9PSAweGZmZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCS8vU3RlcCAxLiBTYXZlIGRhdGEgb2YgdGhpcyBibG9jawl3aGljaCBpcyBwb2ludGVkIGJ5IHRoZSBhdmFpYmxlIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyCi0JLy8gcmVhZCBhbmQgc2F2ZSB0aGUgb3JpZ2luYWwgYmxvY2sgZGF0YQotCWZvcihpID0wOyBpPDg7IGkrKykKLQl7Ci0JCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQlJbkJ1ZlsxXSA9IDI7Ci0JCUluQnVmWzJdID0gMHgwOwotCi0JCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCWJ1ZmZlcltpXSA9IEluQnVmWzJdOwotCX0KLQotCS8vU3RlcCAyLiBVcGRhdGUgdGhlIGRhdGEgaW4gYnVmZmVyLCBhbmQgd3JpdGUgdGhlIGRhdGEgdG8gRWZ1c2UKLQlidWZmZXJbIChPZmZzZXQgPj4gMSkgJSA4XSA9IHBEYXRhWzBdOwotCi0JZG8KLQl7CUxvb3ArKzsKLQkJLy9TdGVwIDMuIFdyaXRlIHRoZSBkYXRhIHRvIEVmdXNlCi0JCWlmKCFiV3JpdGVTdWNjZXNzKQotCQl7Ci0JCQlmb3IoaSA9MDsgaTw4OyBpKyspCi0JCQl7Ci0JCQkJYWRkciA9IEJsa051bSAqIDB4MTAgOwotCi0JCQkJSW5CdWZbMF0gPSBhZGRyKzIqaTsKLQkJCQlJbkJ1ZlsxXSA9IDI7Ci0JCQkJSW5CdWZbMl0gPSBidWZmZXJbaV07Ci0KLQkJCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDYsIE5VTEwsIDIpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJCUluQnVmWzBdID0gYWRkcisoT2Zmc2V0ICUgMTYpOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IHBEYXRhWzBdOwotCi0JCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAyKTsKLQkJfQotCi0JCS8vU3RlcCA0LiBXcml0ZSBtYXBwaW5nIHRhYmxlCi0JCWFkZHIgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQrQmxrTnVtOwotCi0JCXRtcGFkZHIgPSBhZGRyOwotCi0JCWlmKGFkZHIgJSAyICE9IDApCi0JCQlhZGRyID0gYWRkciAtMTsKLQkJSW5CdWZbMF0gPSBhZGRyOwotCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJLy9jb252ZXJ0IHRoZSBhZGRyZXNzIGZyb20gMTAgdG8gOCBiaXQgKCBiaXQ3LCA2ID0gcGFyaXR5IGFuZCBiaXQ1IH4gMCA9IGJpdDl+NCksIGFuZCB3cml0ZSB0byBsb2dpY2FsIG1hcCBlbnRyeQotCQl0bXBPZmZzZXQgPSBPZmZzZXQ7Ci0JCXRtcE9mZnNldCA+Pj0gNDsKLQkJdG1wT2Zmc2V0IHw9ICgofigodG1wT2Zmc2V0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiAxICYgMHgwMSkgXiAgKHRtcE9mZnNldCA+PiAyICYgMHgwMSkgXiAgKHRtcE9mZnNldCA+PiAzICYgMHgwMSkpKSA8PCA2KSAmIDB4NDA7Ci0JCXRtcE9mZnNldCB8PSAoKH4oICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiAzICYgMHgwMSkgXiAodG1wT2Zmc2V0ID4+IDQgJiAweDAxKSBeICggdG1wT2Zmc2V0ID4+IDUgJiAweDAxKSkpIDw8IDcpICYgMHg4MDsKLQotCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCWlmKHRtcGFkZHIlMiAhPSAwKQotCQkJSW5CdWZbMl0gPSB0bXBPZmZzZXQ8PDg7Ci0JCWVsc2UKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0OwotCi0JCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsJkluQnVmWzBdLCA2LCBOVUxMLCAwKTsKLQotCQkvL1N0ZXAgNS4gQ29tcGFyZSBkYXRhIGlmIG5vdCB0aGUgc2FtZSwgaW52YWxpZGF0ZSB0aGUgbWFwcGluZyBlbnRyeSwgdGhlbiByZS13cml0ZSB0aGUgZGF0YSB1bnRpbCBFLWZ1c2UgaXMgZXhoYXVzdGVkCi0JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCQlmb3IoaSA9MDsgaTw4OyBpKyspCi0JCXsKLQkJCWFkZHIgPSBCbGtOdW0gKiAweDEwIDsKLQotCQkJSW5CdWZbMF0gPSBhZGRyKzIqaTsKLQkJCUluQnVmWzFdID0gMjsKLQkJCUluQnVmWzJdID0gMHgwOwotCi0JCQllRnVzZVJlYWRQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNCwgJkluQnVmWzJdLCAyKTsKLQotCQkJaWYoYnVmZmVyW2ldICE9IEluQnVmWzJdKQotCQkJewotCQkJCWJXcml0ZVN1Y2Nlc3MgPSBGQUxTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vU3RlcCA2LiBpbnZsaWRhdGUgbWFwcGluZyBlbnRyeSBhbmQgZmluZCBhIGZyZWUgbWFwcGluZyBlbnRyeSBpZiBub3Qgc3VjY2VlZAotCQlpZiAoIWJXcml0ZVN1Y2Nlc3MpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5vdCBiV3JpdGVTdWNjZXNzIEJsa051bSA9ICVkXG4iLCBCbGtOdW0pKTsKLQotCQkJLy8gdGhlIG9mZnNldCBvZiBjdXJyZW50IG1hcHBpbmcgZW50cnkKLQkJCWFkZHIgPSBFRlVTRV9VU0FHRV9NQVBfU1RBUlQrQmxrTnVtOwotCi0JCQkvL2ZpbmQgYSBuZXcgbWFwcGluZyBlbnRyeQotCQkJQmxrTnVtID0gMHhmZmZmOwotCQkJZm9yIChpPUVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaTw9RUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQkJCXsKLQkJCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIGksIDIsICZMb2dpY2FsQWRkcmVzcyk7Ci0JCQkJaWYoIChMb2dpY2FsQWRkcmVzcyAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQkJCXsKLQkJCQkJaWYgKGkgIT0gRUZVU0VfVVNBR0VfTUFQX0VORCkKLQkJCQkJewotCQkJCQkJQmxrTnVtID0gaSsxLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOb3QgYldyaXRlU3VjY2VzcyBuZXcgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCQkJaWYoQmxrTnVtID09IDB4ZmZmZikKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzOiBvdXQgb2YgZnJlZSBFLWZ1c2Ugc3BhY2UhISFcbiIpKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0KLQkJCS8vaW52YWxpZGF0ZSB0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRyeSBpZiBuZXcgZW50cnkgaXMgbm90IGZvdW5kCi0JCQl0bXBhZGRyID0gYWRkcjsKLQotCQkJaWYoYWRkciAlIDIgIT0gMCkKLQkJCQlhZGRyID0gYWRkciAtMTsKLQkJCUluQnVmWzBdID0gYWRkcjsKLQkJCUluQnVmWzFdID0gMjsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0KLQkJCS8vIHdyaXRlIHRoZSBsb2dpY2FsIGFkZHJlc3MKLQkJCWlmKHRtcGFkZHIlMiAhPSAwKQotCQkJewotCQkJCS8vIEludmFsaWRhdGUgdGhlIGhpZ2ggYnl0ZQotCQkJCWZvciAoaT04OyBpPDE1OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBpbnZhbGlkYXRlIHRoZSBsb3cgYnl0ZQotCQkJCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJCQl7Ci0JCQkJCWlmKCAoIChJbkJ1ZlsyXSA+PiBpKSAmIDB4MDEpID09IDApCi0JCQkJCXsKLQkJCQkJCUluQnVmWzJdIHw9ICgweDEgPDxpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAwKTsKLQkJfQotCX0KLQl3aGlsZSAoIWJXcml0ZVN1Y2Nlc3MmJkxvb3A8Mik7Ci0JaWYoIWJXcml0ZVN1Y2Nlc3MpCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRWZzdWUgV3JpdGUgRmFpbGVkISFcbiIpKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFZPSUQgZUZ1c2VXcml0ZVBoeXNpY2FsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCVBVU0hPUlQgbHBJbkJ1ZmZlciwKLQlVTE9ORyBuSW5CdWZmZXJTaXplLAotCVBVQ0hBUiBscE91dEJ1ZmZlciwKLQlVTE9ORyBuT3V0QnVmZmVyU2l6ZQotKQotewotCVVTSE9SVCogcEluQnVmID0gKFVTSE9SVCopbHBJbkJ1ZmZlcjsKLQlpbnQJCWk7Ci0JLy9VU0hPUlQqIHBPdXRCdWYgPSAoVVNIT1JUKilpb0J1ZmZlcjsKLQlVU0hPUlQgT2Zmc2V0ID0gcEluQnVmWzBdOwkJCQkJLy8gYWRkcgotCVVTSE9SVCBMZW5ndGggPSBwSW5CdWZbMV07CQkJCQkvLyBsZW5ndGgKLQlVU0hPUlQqIHBWYWx1ZVggPSAmcEluQnVmWzJdOwkJCQkvLyB2YWx1ZSAuLi4KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVQaHlzaWNhbCBPZmZzZXQ9MHgleCwgbGVuZ3RoPSVkXG4iLCBPZmZzZXQsIExlbmd0aCkpOwotCi0JewotCQkvLyBMaXR0bGUtZW5kaWFuCQlTCXwJUwlCaWctZW5kaWFuCi0JCS8vIGFkZHIJMwkyCTEJMAl8CTAJMQkyCTMKLQkJLy8gT3JpLVYJRAlDCUIJQQl8CUEJQglDCUQKLQkJLy8gQWZ0ZXIgc3dhcHBpbmcKLQkJLy8JCUQJQwlCCUEJfAlECUMJQglBCi0JCS8vIEJvdGggdGhlIGxpdHRsZSBhbmQgYmlnLWVuZGlhbiB1c2UgdGhlIHNhbWUgc2VxdWVuY2UgdG8gd3JpdGUgIGRhdGEuCi0JCS8vIFRoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHN3YXAgZGF0YSB3aGVuIHJlYWQgdGhlIGRhdGEuCi0JCWZvciAoaT0wOyBpPExlbmd0aDsgaSs9MikKLQkJewotCQkJZUZ1c2VQaHlzaWNhbFdyaXRlUmVnaXN0ZXJzKHBBZCwgT2Zmc2V0K2ksIDIsICZwVmFsdWVYW2kvMl0pOwotCQl9Ci0JfQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0KLQlSZXR1cm4gVmFsdWU6Ci0KLQlOb3RlOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1OVFNUQVRVUyBlRnVzZVdyaXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCU9mZnNldCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVU0hPUlQJCQlsZW5ndGgpCi17Ci0JaW50IGk7Ci0JVVNIT1JUKiBwVmFsdWVYID0gKFBVU0hPUlQpIHBEYXRhOwkJCQkvL3ZhbHVlIC4uLgotCi0JLy8gVGhlIGlucHV0IHZhbHVlPTMwNzAgd2lsbCBiZSBzdG9yZWQgYXMgZm9sbG93aW5nCi0JLy8gTGl0dGxlLWVuZGlhbgkJUwl8CVMJQmlnLWVuZGlhbgotCS8vIGFkZHIJCQkxCTAJfAkwCTEKLQkvLyBPcmktVgkJCTMwCTcwCXwJMzAJNzAKLQkvLyBBZnRlciBzd2FwcGluZwotCS8vCQkJCTMwCTcwCXwJNzAJMzAKLQkvLyBDYXN0aW5nCi0JLy8JCQkJMzA3MAl8CTcwMzAgKHgpCi0JLy8gVGhlIHN3YXBwaW5nIHNob3VsZCBiZSByZW1vdmVkIGZvciBiaWctZW5kaWFuCi0JZm9yKGk9MDsgaTxsZW5ndGg7IGkrPTIpCi0JewotCQllRnVzZVdyaXRlUmVnaXN0ZXJzKHBBZCwgT2Zmc2V0K2ksIDIsICZwVmFsdWVYW2kvMl0pOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCi0JUmV0dXJuIFZhbHVlOgotCi0JTm90ZToKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIHNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVU0hPUlQgaTsKLQlVU0hPUlQJTG9naWNhbEFkZHJlc3M7Ci0JVVNIT1JUIGVmdXNlZnJlZW51bT0wOwotCWlmKCFwQWQtPmJVc2VFZnVzZSkKLQkJcmV0dXJuIEZBTFNFOwotCWZvciAoaSA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaSA8PSBFRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCXsKLQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJewotCQkJZWZ1c2VmcmVlbnVtPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkrMSk7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJewotCQkJZWZ1c2VmcmVlbnVtID0gKFVDSEFSKSAoRUZVU0VfVVNBR0VfTUFQX0VORC1pKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJZWZ1c2VmcmVlbnVtID0gMDsKLQl9Ci0JcHJpbnRrKCJlZnVzZUZyZWVOdW1iZXIgaXMgJWRcbiIsZWZ1c2VmcmVlbnVtKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgc2V0X2VGdXNlZHVtcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci1VU0hPUlQgSW5CdWZbM107Ci0JSU5UIGk9MDsKLQlpZighcEFkLT5iVXNlRWZ1c2UpCi0JCXJldHVybiBGQUxTRTsKLQlmb3IoaSA9MDsgaTxFRlVTRV9VU0FHRV9NQVBfRU5ELzI7IGkrKykKLQl7Ci0JCUluQnVmWzBdID0gMippOwotCQlJbkJ1ZlsxXSA9IDI7Ci0JCUluQnVmWzJdID0gMHgwOwotCi0JCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCQlpZihpJTQ9PTApCi0JCXByaW50aygiXG5CbG9jayAleDoiLGkvOCk7Ci0JCXByaW50aygiJTA0eCAiLEluQnVmWzJdKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCXNldF9lRnVzZUxvYWRGcm9tQmluX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HCQkJCQlzcmM7Ci0JUlRNUF9PU19GRAkJCQlzcmNmOwotCVJUTVBfT1NfRlNfSU5GTwkJCW9zZnNJbmZvOwotCUlOVAkJCQkJCXJldHZhbCwgbWVtU2l6ZTsKLQlQU1RSSU5HCQkJCQlidWZmZXIsIG1lbVB0cjsKLQlJTlQJCQkJCQlpID0gMCxqPTAsaz0xOwotCVVTSE9SVAkJCQkJKlBEQVRBOwotCVVTSE9SVAkJCQkJREFUQTsKLQotCW1lbVNpemUgPSAxMjggKyBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUgKyBzaXplb2YoVVNIT1JUKSAqIDg7Ci0JbWVtUHRyID0ga21hbGxvYyhtZW1TaXplLCBNRU1fQUxMT0NfRkxBRyk7Ci0JaWYgKG1lbVB0ciA9PSBOVUxMKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlOZGlzWmVyb01lbW9yeShtZW1QdHIsIG1lbVNpemUpOwotCXNyYyA9IG1lbVB0cjsgLy8ga21hbGxvYygxMjgsIE1FTV9BTExPQ19GTEFHKTsKLQlidWZmZXIgPSBzcmMgKyAxMjg7CQkvLyBrbWFsbG9jKE1BWF9FRVBST01fQklOX0ZJTEVfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCVBEQVRBID0gKFVTSE9SVCopKGJ1ZmZlciArIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRSk7CS8vIGttYWxsb2Moc2l6ZW9mKFVTSE9SVCkqOCxNRU1fQUxMT0NfRkxBRyk7Ci0KLQlpZihzdHJsZW4oYXJnKT4wKQotCQlOZGlzTW92ZU1lbW9yeShzcmMsIGFyZywgc3RybGVuKGFyZykpOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkoc3JjLCBFRlVTRV9FRVBST01fREVGVUxUX0ZJTEUsIHN0cmxlbihFRlVTRV9FRVBST01fREVGVUxUX0ZJTEUpKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJGaWxlTmFtZT0lc1xuIixzcmMpKTsKLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3Nmc0luZm8sIFRSVUUpOwotCi0Jc3JjZiA9IFJ0bXBPU0ZpbGVPcGVuKHNyYywgT19SRE9OTFksIDApOwotCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yIG9wZW5pbmcgZmlsZSAlc1xuIiwgc3JjKSk7Ci0JCXJldHZhbCA9IEZBTFNFOwotCQlnb3RvIHJlY292ZXJGUzsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAotCQl3aGlsZShSdG1wT1NGaWxlUmVhZChzcmNmLCAmYnVmZmVyW2ldLCAxKT09MSkKLQkJewotCQlpKys7Ci0JCQlpZihpPk1BWF9FRVBST01fQklOX0ZJTEVfU0laRSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IgcmVhZGluZyBmaWxlICVzLCBmaWxlIHNpemUgdG9vIGxhcmdlWz4lZF1cbiIsIHNyYywgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKSk7Ci0JCQkJcmV0dmFsID0gRkFMU0U7Ci0JCQkJZ290byBjbG9zZUZpbGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR2YWwgPSBSdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0JCWlmIChyZXR2YWwpCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgY2xvc2luZyBmaWxlICVzXG4iLCBzcmMpKTsKLQl9Ci0KLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3Nmc0luZm8sIEZBTFNFKTsKLQotCWZvcihqPTA7ajxpO2orKykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiUwMlggIixidWZmZXJbal0mMHhmZikpOwotCQlpZigoaisxKSUyPT0wKQotCQkJUERBVEFbai8yJThdPSgoYnVmZmVyW2pdPDw4KSYweGZmMDApfChidWZmZXJbai0xXSYweGZmKTsKLQkJaWYoaiUxNj09MCkKLQkJewotCQkJaz1idWZmZXJbal07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlrJj1idWZmZXJbal07Ci0JCQlpZigoaisxKSUxNj09MCkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgcmVzdWx0PSUwMlgsYmxrPSUwMnhcbiIsayxqLzE2KSk7Ci0JCQkJaWYoayE9MHhmZikKLQkJCQkJZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4ocEFkLChVU0hPUlQpai0xNSwgMTYsIFBEQVRBKTsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZihlRnVzZVJlYWRSZWdpc3RlcnMocEFkLGosIDIsKFBVU0hPUlQpJkRBVEEpIT0weDNmKQotCQkJCQkJZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4ocEFkLChVU0hPUlQpai0xNSwgMTYsIFBEQVRBKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQlmb3IobD0wO2w8ODtsKyspCi0JCQkJCXByaW50aygiJTA0eCAiLFBEQVRBW2xdKTsKLQkJCQlwcmludGsoIlxuIik7Ci0JCQkJKi8KLQkJCQlOZGlzWmVyb01lbW9yeShQREFUQSwxNik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLQotY2xvc2VGaWxlOgotCWlmIChzcmNmKQotCQlSdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0KLXJlY292ZXJGUzoKLQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zZnNJbmZvLCBGQUxTRSk7Ci0KLQotCWlmIChtZW1QdHIpCi0JCWtmcmVlKG1lbVB0cik7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0KLXN0YXRpYyBOVFNUQVRVUyBlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JSU4JVVNIT1JUKiBwRGF0YSkKLXsKLQlVU0hPUlQJaTsKLQlVU0hPUlQJZUZ1c2VEYXRhOwotCVVTSE9SVAlMb2dpY2FsQWRkcmVzcywgQmxrTnVtID0gMHhmZmZmOwotCVVDSEFSCUVGU1JPTV9BT1VULExvb3A9MDsKLQlFRlVTRV9DVFJMX1NUUlVDCQllRnVzZUN0cmxTdHJ1YzsKLQlVU0hPUlQJZWZ1c2VEYXRhT2Zmc2V0OwotCVVJTlQzMglkYXRhLHRlbXBidWZmZXI7Ci0JVVNIT1JUIGFkZHIsdG1wYWRkciwgSW5CdWZbM10sIHRtcE9mZnNldDsKLQlVSU5UMzIgYnVmZmVyWzRdOwotCUJPT0xFQU4JCWJXcml0ZVN1Y2Nlc3MgPSBUUlVFOwotCUJPT0xFQU4JCWJOb3RXcml0ZT1UUlVFOwotCUJPT0xFQU4JCWJBbGxvY2F0ZU5ld0Jsaz1UUlVFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyc0Zyb21CaW4gT2Zmc2V0PSV4LCBwRGF0YT0lMDR4OiUwNHg6JTA0eDolMDR4XG4iLCBPZmZzZXQsICpwRGF0YSwqKHBEYXRhKzEpLCoocERhdGErMiksKihwRGF0YSszKSkpOwotCi0JZG8KLQl7Ci0JLy9TdGVwIDAuIGZpbmQgdGhlIGVudHJ5IGluIHRoZSBtYXBwaW5nIHRhYmxlCi0JLy9UaGUgYWRkcmVzcyBvZiBFRVBST00gaXMgMi1ieXRlcyBhbGlnbm1lbnQuCi0JLy9UaGUgbGFzdCBiaXQgaXMgdXNlZCBmb3IgYWxpZ25tZW50LCBzbyBpdCBtdXN0IGJlIDAuCi0JTG9vcCsrOwotCXRtcE9mZnNldCA9IE9mZnNldCAmIDB4ZmZmZTsKLQlFRlNST01fQU9VVCA9IGVGdXNlUmVhZFJlZ2lzdGVycyhwQWQsIHRtcE9mZnNldCwgMiwgJmVGdXNlRGF0YSk7Ci0KLQlpZiggRUZTUk9NX0FPVVQgPT0gMHgzZikKLQl7CS8vZmluZCBhdmFpbGFibGUgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJLy90aGUgbG9naWNhbCBhZGRyZXNzIGRvZXMgbm90IGV4aXN0LCBmaW5kIGFuIGVtcHR5IG9uZQotCQkvL2Zyb20gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgYmxvY2sgNDU9MTYqNDU9MHgyZDAgdG8gdGhlIGxhc3QgYWRkcmVzcyBvZiBibG9jayA0NwotCQkvLz09PjQ4KjE2LTMocmVzZXJ2ZWQpPTJGQwotCQliQWxsb2NhdGVOZXdCbGs9VFJVRTsKLQkJZm9yIChpPUVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaTw9RUZVU0VfVVNBR0VfTUFQX0VORDsgaSs9MikKLQkJewotCQkJLy9SZXRyaXZlIHRoZSBsb2dpY2FsIGJsb2NrIG51Ym1lciBmb3JtIGVhY2ggbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCS8vSXQgd2lsbCBhY2Nlc3MgdHdvIGxvZ2ljYWwgYWRkcmVzcyBwb2ludGVyIGVhY2ggdGltZS4KLQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCWlmKCAoTG9naWNhbEFkZHJlc3MgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlCbGtOdW0gPSBpLUVGVVNFX1VTQUdFX01BUF9TVEFSVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYoKCAoTG9naWNhbEFkZHJlc3MgPj4gOCkgJiAweGZmKSA9PSAwKQotCQkJey8vTm90IHVzZWQgbG9naWNhbCBhZGRyZXNzIHBvaW50ZXIKLQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCXsKLQkJCQkJQmxrTnVtID0gaS1FRlVTRV9VU0FHRV9NQVBfU1RBUlQrMTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJYkFsbG9jYXRlTmV3QmxrPUZBTFNFOwotCQlCbGtOdW0gPSBFRlNST01fQU9VVDsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzIEJsa051bSA9ICVkIFxuIiwgQmxrTnVtKSk7Ci0KLQlpZihCbGtOdW0gPT0gMHhmZmZmKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZUZ1c2VXcml0ZVJlZ2lzdGVyczogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JLy9TdGVwIDEuMS4wCi0JLy9JZiB0aGUgYmxvY2sgaXMgbm90IGV4aXN0aW5nIGluIG1hcHBpbmcgdGFibGUsIGNyZWF0ZSBvbmUKLQkvL2FuZCB3cml0ZSBkb3duIHRoZSAxNi1ieXRlcyBkYXRhIHRvIHRoZSBuZXcgYmxvY2sKLQlpZihiQWxsb2NhdGVOZXdCbGspCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSBOZXcgQmxrXG4iKSk7Ci0JCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQkJZm9yKGk9MDsgaTwgNDsgaSsrKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSBOZXcgQmxrLCBEYXRhJWQ9JTA0eCUwNHhcbiIsMy1pLHBEYXRhWzIqaSsxXSxwRGF0YVsyKmldKSk7Ci0JCQl0ZW1wYnVmZmVyPSgocERhdGFbMippKzFdPDwxNikmMHhmZmZmMDAwMCl8cERhdGFbMippXTsKLQotCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBlZnVzZURhdGFPZmZzZXQsdGVtcGJ1ZmZlcik7Ci0JCQllZnVzZURhdGFPZmZzZXQgLT0gNDsKLQotCQl9Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkJLy9TdGVwMS4xLjEuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgJmVGdXNlQ3RybFN0cnVjLndvcmQpOwotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fQUlOID0gQmxrTnVtKiAweDEwIDsKLQotCQkvL1N0ZXAxLjEuMi4gV3JpdGUgRUZTUk9NX01PREUgKDB4NTgwLCBiaXQ3OmJpdDYpIHRvIDMuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9NT0RFID0gMzsKLQotCQkvL1N0ZXAxLjEuMy4gV3JpdGUgRUZTUk9NX0tJQ0sgKDB4NTgwLCBiaXQzMCkgdG8gMSB0byBraWNrLW9mZiBwaHlzaWNhbCB3cml0ZSBwcm9jZWR1cmUuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRlVTRV9DVFJMLCBkYXRhKTsKLQotCQkvL1N0ZXAxLjEuNC4gUG9sbGluZyBFRlNST01fS0lDSygweDU4MCwgYml0MzApIHVudGlsIGl0IGJlY29tZSAwIGFnYWluLiBJdO+/ve+/vXMgZG9uZS4KLQkJaSA9IDA7Ci0JCXdoaWxlKGkgPCAxMDApCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCVJUTVB1c2VjRGVsYXkoMik7Ci0JCQlpKys7Ci0JCX0KLQotCX0KLQllbHNlCi0JewkvL1N0ZXAxLjIuCi0JCS8vSWYgdGhlIHNhbWUgbG9naWNhbCBudW1iZXIgaXMgZXhpc3RpbmcsIGNoZWNrIGlmIHRoZSB3cml0dGluZyBkYXRhIGFuZCB0aGUgZGF0YQotCQkvL3NhdmluZyBpbiB0aGlzIGJsb2NrIGFyZSB0aGUgc2FtZS4KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy9yZWFkIGN1cnJlbnQgdmFsdWVzIG9mIDE2LWJ5dGUgYmxvY2sKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsU3RydWMud29yZCk7Ci0KLQkJLy9TdGVwMS4yLjAuIFdyaXRlIDEwLWJpdCBvZiBhZGRyZXNzIHRvIEVGU1JPTV9BSU4gKDB4NTgwLCBiaXQyNTpiaXQxNikuIFRoZSBhZGRyZXNzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbm1lbnQuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9BSU4gPSBPZmZzZXQgJiAweGZmZjA7Ci0KLQkJLy9TdGVwMS4yLjEuIFdyaXRlIEVGU1JPTV9NT0RFICgweDU4MCwgYml0NzpiaXQ2KSB0byAxLgotCQllRnVzZUN0cmxTdHJ1Yy5maWVsZC5FRlNST01fTU9ERSA9IDA7Ci0KLQkJLy9TdGVwMS4yLjIuIFdyaXRlIEVGU1JPTV9LSUNLICgweDU4MCwgYml0MzApIHRvIDEgdG8ga2ljay1vZmYgcGh5c2ljYWwgcmVhZCBwcm9jZWR1cmUuCi0JCWVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID0gMTsKLQotCQlOZGlzTW92ZU1lbW9yeSgmZGF0YSwgJmVGdXNlQ3RybFN0cnVjLCA0KTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRUZVU0VfQ1RSTCwgZGF0YSk7Ci0KLQkJLy9TdGVwMS4yLjMuIFBvbGxpbmcgRUZTUk9NX0tJQ0soMHg1ODAsIGJpdDMwKSB1bnRpbCBpdCBiZWNvbWUgMCBhZ2Fpbi4KLQkJaSA9IDA7Ci0JCXdoaWxlKGkgPCA1MDApCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRUZVU0VfQ1RSTCwgKFBVSU5UMzIpICZlRnVzZUN0cmxTdHJ1Yyk7Ci0KLQkJCWlmKGVGdXNlQ3RybFN0cnVjLmZpZWxkLkVGU1JPTV9LSUNLID09IDApCi0JCQkJYnJlYWs7Ci0JCQlSVE1QdXNlY0RlbGF5KDIpOwotCQkJaSsrOwotCQl9Ci0KLQkJLy9TdGVwMS4yLjQuIFJlYWQgMTYtYnl0ZSBvZiBkYXRhIGZyb20gRUZVU0VfREFUQTAtMyAoMHg1OUMtMHg1OTApCi0JCWVmdXNlRGF0YU9mZnNldCA9ICBFRlVTRV9EQVRBMzsKLQkJZm9yKGk9MDsgaTwgNDsgaSsrKQotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIGVmdXNlRGF0YU9mZnNldCwgKFBVSU5UMzIpICZidWZmZXJbaV0pOwotCQkJZWZ1c2VEYXRhT2Zmc2V0IC09ICA0OwotCQl9Ci0JCS8vU3RlcDEuMi41LiBDaGVjayBpZiB0aGUgZGF0YSBvZiBlZnVzZSBhbmQgdGhlIHdyaXRpbmcgZGF0YSBhcmUgdGhlIHNhbWUuCi0JCWZvcihpID0wOyBpPDQ7IGkrKykKLQkJewotCQkJdGVtcGJ1ZmZlcj0oKHBEYXRhWzIqaSsxXTw8MTYpJjB4ZmZmZjAwMDApfHBEYXRhWzIqaV07Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJidWZmZXJbJWRdPSV4LHBEYXRhWyVkXT0leCxwRGF0YVslZF09JXgsdGVtcGJ1ZmZlcj0leFxuIixpLGJ1ZmZlcltpXSwyKmkscERhdGFbMippXSwyKmkrMSxwRGF0YVsyKmkrMV0sdGVtcGJ1ZmZlcikpOwotCi0JCQlpZigoKGJ1ZmZlcltpXSYweGZmZmYwMDAwKT09KHBEYXRhWzIqaSsxXTw8MTYpKSYmKChidWZmZXJbaV0mMHhmZmZmKT09cERhdGFbMippXSkpCi0JCQkJYk5vdFdyaXRlJj1UUlVFOwotCQkJZWxzZQotCQkJewotCQkJCWJOb3RXcml0ZSY9RkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYoIWJOb3RXcml0ZSkKLQkJewotCQlwcmludGsoIlRoZSBkYXRhIGlzIG5vdCB0aGUgc2FtZVxuIik7Ci0KLQkJCWZvcihpID0wOyBpPDg7IGkrKykKLQkJCXsKLQkJCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCQlJbkJ1ZlswXSA9IGFkZHIrMippOwotCQkJCUluQnVmWzFdID0gMjsKLQkJCQlJbkJ1ZlsyXSA9IHBEYXRhW2ldOwotCi0JCQkJZUZ1c2VXcml0ZVBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA2LCBOVUxMLCAyKTsKLQkJCX0KLQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBUUlVFOwotCSAgICAgfQotCi0KLQotCQkvL1N0ZXAgMi4gV3JpdGUgbWFwcGluZyB0YWJsZQotCQlhZGRyID0gRUZVU0VfVVNBR0VfTUFQX1NUQVJUK0Jsa051bTsKLQotCQl0bXBhZGRyID0gYWRkcjsKLQotCQlpZihhZGRyICUgMiAhPSAwKQotCQkJYWRkciA9IGFkZHIgLTE7Ci0JCUluQnVmWzBdID0gYWRkcjsKLQkJSW5CdWZbMV0gPSAyOwotCi0JCS8vY29udmVydCB0aGUgYWRkcmVzcyBmcm9tIDEwIHRvIDggYml0ICggYml0NywgNiA9IHBhcml0eSBhbmQgYml0NSB+IDAgPSBiaXQ5fjQpLCBhbmQgd3JpdGUgdG8gbG9naWNhbCBtYXAgZW50cnkKLQkJdG1wT2Zmc2V0ID0gT2Zmc2V0OwotCQl0bXBPZmZzZXQgPj49IDQ7Ci0JCXRtcE9mZnNldCB8PSAoKH4oKHRtcE9mZnNldCAmIDB4MDEpIF4gKCB0bXBPZmZzZXQgPj4gMSAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMiAmIDB4MDEpIF4gICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpKSkgPDwgNikgJiAweDQwOwotCQl0bXBPZmZzZXQgfD0gKCh+KCAodG1wT2Zmc2V0ID4+IDIgJiAweDAxKSBeICh0bXBPZmZzZXQgPj4gMyAmIDB4MDEpIF4gKHRtcE9mZnNldCA+PiA0ICYgMHgwMSkgXiAoIHRtcE9mZnNldCA+PiA1ICYgMHgwMSkpKSA8PCA3KSAmIDB4ODA7Ci0KLQkJLy8gd3JpdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcwotCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCUluQnVmWzJdID0gdG1wT2Zmc2V0PDw4OwotCQllbHNlCi0JCQlJbkJ1ZlsyXSA9IHRtcE9mZnNldDsKLQotCQllRnVzZVdyaXRlUGh5c2ljYWwocEFkLCZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0KLQkJLy9TdGVwIDMuIENvbXBhcmUgZGF0YSBpZiBub3QgdGhlIHNhbWUsIGludmFsaWRhdGUgdGhlIG1hcHBpbmcgZW50cnksIHRoZW4gcmUtd3JpdGUgdGhlIGRhdGEgdW50aWwgRS1mdXNlIGlzIGV4aGF1c3RlZAotCQliV3JpdGVTdWNjZXNzID0gVFJVRTsKLQkJZm9yKGkgPTA7IGk8ODsgaSsrKQotCQl7Ci0JCQlhZGRyID0gQmxrTnVtICogMHgxMCA7Ci0KLQkJCUluQnVmWzBdID0gYWRkcisyKmk7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0JCQlJbkJ1ZlsyXSA9IDB4MDsKLQotCQkJZUZ1c2VSZWFkUGh5c2ljYWwocEFkLCAmSW5CdWZbMF0sIDQsICZJbkJ1ZlsyXSwgMik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJhZGRyPSV4LCBidWZmZXJbaV09JXgsSW5CdWZbMl09JXhcbiIsSW5CdWZbMF0scERhdGFbaV0sSW5CdWZbMl0pKTsKLQkJCWlmKHBEYXRhW2ldICE9IEluQnVmWzJdKQotCQkJewotCQkJCWJXcml0ZVN1Y2Nlc3MgPSBGQUxTRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vU3RlcCA0LiBpbnZsaWRhdGUgbWFwcGluZyBlbnRyeSBhbmQgZmluZCBhIGZyZWUgbWFwcGluZyBlbnRyeSBpZiBub3Qgc3VjY2VlZAotCi0JCWlmICghYldyaXRlU3VjY2VzcyYmTG9vcDwyKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjo6Tm90IGJXcml0ZVN1Y2Nlc3MgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCi0JCQkvLyB0aGUgb2Zmc2V0IG9mIGN1cnJlbnQgbWFwcGluZyBlbnRyeQotCQkJYWRkciA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVCtCbGtOdW07Ci0KLQkJCS8vZmluZCBhIG5ldyBtYXBwaW5nIGVudHJ5Ci0JCQlCbGtOdW0gPSAweGZmZmY7Ci0JCQlmb3IgKGk9RUZVU0VfVVNBR0VfTUFQX1NUQVJUOyBpPD1FRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCQkJewotCQkJCWVGdXNlUGh5c2ljYWxSZWFkUmVnaXN0ZXJzKHBBZCwgaSwgMiwgJkxvZ2ljYWxBZGRyZXNzKTsKLQkJCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJCQl7Ci0JCQkJCUJsa051bSA9IGktRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZigoIChMb2dpY2FsQWRkcmVzcyA+PiA4KSAmIDB4ZmYpID09IDApCi0JCQkJewotCQkJCQlpZiAoaSAhPSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJCQl7Ci0JCQkJCQlCbGtOdW0gPSBpKzEtRUZVU0VfVVNBR0VfTUFQX1NUQVJUOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImVGdXNlV3JpdGVSZWdpc3RlcnNGcm9tQmluOjpOb3QgYldyaXRlU3VjY2VzcyBuZXcgQmxrTnVtID0gJWRcbiIsIEJsa051bSkpOwotCQkJaWYoQmxrTnVtID09IDB4ZmZmZikKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJlRnVzZVdyaXRlUmVnaXN0ZXJzRnJvbUJpbjogb3V0IG9mIGZyZWUgRS1mdXNlIHNwYWNlISEhXG4iKSk7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JCQkvL2ludmFsaWRhdGUgdGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50cnkgaWYgbmV3IGVudHJ5IGlzIG5vdCBmb3VuZAotCQkJdG1wYWRkciA9IGFkZHI7Ci0KLQkJCWlmKGFkZHIgJSAyICE9IDApCi0JCQkJYWRkciA9IGFkZHIgLTE7Ci0JCQlJbkJ1ZlswXSA9IGFkZHI7Ci0JCQlJbkJ1ZlsxXSA9IDI7Ci0KLQkJCWVGdXNlUmVhZFBoeXNpY2FsKHBBZCwgJkluQnVmWzBdLCA0LCAmSW5CdWZbMl0sIDIpOwotCi0JCQkvLyB3cml0ZSB0aGUgbG9naWNhbCBhZGRyZXNzCi0JCQlpZih0bXBhZGRyJTIgIT0gMCkKLQkJCXsKLQkJCQkvLyBJbnZhbGlkYXRlIHRoZSBoaWdoIGJ5dGUKLQkJCQlmb3IgKGk9ODsgaTwxNTsgaSsrKQotCQkJCXsKLQkJCQkJaWYoICggKEluQnVmWzJdID4+IGkpICYgMHgwMSkgPT0gMCkKLQkJCQkJewotCQkJCQkJSW5CdWZbMl0gfD0gKDB4MSA8PGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgbG93IGJ5dGUKLQkJCQlmb3IgKGk9MDsgaTw4OyBpKyspCi0JCQkJewotCQkJCQlpZiggKCAoSW5CdWZbMl0gPj4gaSkgJiAweDAxKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlJbkJ1ZlsyXSB8PSAoMHgxIDw8aSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVGdXNlV3JpdGVQaHlzaWNhbChwQWQsICZJbkJ1ZlswXSwgNiwgTlVMTCwgMCk7Ci0JCX0KLQotCX0KLQl3aGlsZSghYldyaXRlU3VjY2VzcyYmTG9vcDwyKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLWludCBydG1wX2VlX2VmdXNlX3JlYWQxNigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVU0hPUlQgT2Zmc2V0LAotCU9VVCBVU0hPUlQgKnBWYWx1ZSkKLXsKLQlpZihwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciB8fCBwQWQtPmJFRVBST01GaWxlKQotCXsKLQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICAoIlJlYWQgZnJvbSBFRVBST00gQnVmZmVyXG4iKSk7Ci0JICAgIE5kaXNNb3ZlTWVtb3J5KHBWYWx1ZSwgJihwQWQtPkVFUFJPTUltYWdlW09mZnNldF0pLCAyKTsKLQl9Ci0JZWxzZQotCSAgICBlRnVzZVJlYWRSZWdpc3RlcnMocEFkLCBPZmZzZXQsIDIsIHBWYWx1ZSk7Ci0JcmV0dXJuICgqcFZhbHVlKTsKLX0KLQotCi1pbnQgcnRtcF9lZV9lZnVzZV93cml0ZTE2KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFVTSE9SVCBPZmZzZXQsCi0JSU4gVVNIT1JUIGRhdGEpCi17Ci0gICAgaWYocEFkLT5iRnJvY2VFRVBST01CdWZmZXJ8fHBBZC0+YkVFUFJPTUZpbGUpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgICgiV3JpdGUgdG8gRUVQUk9NIEJ1ZmZlclxuIikpOwotICAgICAgICBOZGlzTW92ZU1lbW9yeSgmKHBBZC0+RUVQUk9NSW1hZ2VbT2Zmc2V0XSksICZkYXRhLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBlRnVzZVdyaXRlUmVnaXN0ZXJzKHBBZCwgT2Zmc2V0LCAyLCAmZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IFJ0bXBFZnVzZVN1cHBvcnRDaGVjaygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlVU0hPUlQgdmFsdWU7Ci0KLQlpZiAoSVNfUlQzMHh4KHBBZCkpCi0JewotCQllRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycyhwQWQsIEVGVVNFX1RBRywgMiwgJnZhbHVlKTsKLQkJcEFkLT5FRnVzZVRhZyA9ICh2YWx1ZSAmIDB4ZmYpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UIHNldF9lRnVzZUJ1ZmZlck1vZGVXcml0ZUJhY2tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQgRW5hYmxlOwotCi0KLQlpZihzdHJsZW4oYXJnKT4wKQotCXsKLQkJRW5hYmxlPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLQlpZihFbmFibGU9PTEpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJzZXRfZUZ1c2VCdWZmZXJNb2RlX1Byb2M6OiBDYWxsIFdSSVRFRUVQUk9NQlVGIikpOwotCQllRnVzZVdyaXRlRWVlcHByb21CdWYocEFkKTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUxvYWQgRUVQUk9NIGZyb20gYmluIGZpbGUgZm9yIGVGdXNlIG1vZGUKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKLQkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBlRnVzZUxvYWRFRVBST00oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUFNUUklORwkJCQkJc3JjID0gTlVMTDsKLQlJTlQJCQkJCQlyZXR2YWw7Ci0JUlRNUF9PU19GRAkJCQlzcmNmOwotCVJUTVBfT1NfRlNfSU5GTwkJCW9zRlNJbmZvOwotCi0KLQlzcmM9RUZVU0VfQlVGRkVSX1BBVEg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmlsZU5hbWU9JXNcbiIsc3JjKSk7Ci0KLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCi0JaWYgKHNyYyAmJiAqc3JjKQotCXsKLQkJc3JjZiA9IFJ0bXBPU0ZpbGVPcGVuKHNyYywgT19SRE9OTFksIDApOwotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQotCQkJCW1lbXNldChwQWQtPkVFUFJPTUltYWdlLCAweDAwLCBNQVhfRUVQUk9NX0JJTl9GSUxFX1NJWkUpOwotCi0KLQkJCXJldHZhbCA9UnRtcE9TRmlsZVJlYWQoc3JjZiwgKFBTVFJJTkcpcEFkLT5FRVBST01JbWFnZSwgTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKTsKLQkJCWlmIChyZXR2YWwgPiAwKQotCQkJCQkJCXsKLQkJCQlSVE1QU2V0UHJvZmlsZVBhcmFtZXRlcnMocEFkLCAoUFNUUklORylwQWQtPkVFUFJPTUltYWdlKTsKLQkJCQlyZXR2YWwgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJfQotCQkJZWxzZQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlYWQgZmlsZSBcIiVzXCIgZmFpbGVkKGVyckNvZGU9JWQpIVxuIiwgc3JjLCByZXR2YWwpKTsKLQotCQl9Ci0KLQotCX0KLQllbHNlCi0JCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yIHNyYyAgb3Igc3JjZiBpcyBudWxsXG4iKSk7Ci0JCQkJCXJldHVybiBGQUxTRTsKLQotCQl9Ci0KLQlyZXR2YWw9UnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCi0JaWYgKHJldHZhbCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQl9Ci0KLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIEZBTFNFKTsKLQotCXJldHVybiBUUlVFOwotfQotCi1JTlQgZUZ1c2VXcml0ZUVlZXBwcm9tQnVmKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCi0JUFNUUklORwkJCQkJc3JjID0gTlVMTDsKLQlJTlQJCQkJCQlyZXR2YWw7Ci0JUlRNUF9PU19GRAkJCQlzcmNmOwotCVJUTVBfT1NfRlNfSU5GTwkJCW9zRlNJbmZvOwotCi0KLQlzcmM9RUZVU0VfQlVGRkVSX1BBVEg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRmlsZU5hbWU9JXNcbiIsc3JjKSk7Ci0KLQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBUUlVFKTsKLQotCi0KLQlpZiAoc3JjICYmICpzcmMpCi0JewotCQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1dST05MWXxPX0NSRUFULCAwKTsKLQotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiLS0+IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCAtUFRSX0VSUihzcmNmKSxzcmMpKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLS8qCi0JCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCi0JCQlpZiAoc3JjZi0+Zl9vcCAmJiBzcmNmLT5mX29wLT53cml0ZSkKLQkJCXsKLQkJCQkvLyBUaGUgb2JqZWN0IG11c3QgaGF2ZSBhIHJlYWQgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNmLT5mX29wLT53cml0ZShzcmNmLCBwQWQtPkVFUFJPTUltYWdlLCAxMDI0LCAmc3JjZi0+Zl9wb3MpOwotCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3IhISBTeXN0ZW0gZG9lc3Qgbm90IHN1cHBvcnQgcmVhZCBmdW5jdGlvblxuIikpOwotCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotKi8KLQotCQkJUnRtcE9TRmlsZVdyaXRlKHNyY2YsIChQU1RSSU5HKXBBZC0+RUVQUk9NSW1hZ2UsTUFYX0VFUFJPTV9CSU5fRklMRV9TSVpFKTsKLQotCQl9Ci0KLQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCItLT4gRXJyb3Igc3JjICBvciBzcmNmIGlzIG51bGxcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCi0JfQotCi0JcmV0dmFsPVJ0bXBPU0ZpbGVDbG9zZShzcmNmKTsKLQotCWlmIChyZXR2YWwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRXJyb3IgJWQgY2xvc2luZyAlc1xuIiwgLXJldHZhbCwgc3JjKSk7Ci0JfQotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotCXJldHVybiBUUlVFOwotfQotCi0KLVZPSUQgZUZ1c2VHZXRGcmVlQmxvY2tDb3VudChJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlQVUlOVCBFZnVzZUZyZWVCbG9jaykKLXsKLQlVU0hPUlQgaTsKLQlVU0hPUlQJTG9naWNhbEFkZHJlc3M7Ci0JaWYoIXBBZC0+YlVzZUVmdXNlKQotCQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiZUZ1c2VHZXRGcmVlQmxvY2tDb3VudCBPbmx5IHN1cHBvcnRzIGVmdXNlIE1vZGVcbiIpKTsKLQkJcmV0dXJuIDsKLQkJfQotCWZvciAoaSA9IEVGVVNFX1VTQUdFX01BUF9TVEFSVDsgaSA8PSBFRlVTRV9VU0FHRV9NQVBfRU5EOyBpKz0yKQotCXsKLQkJZUZ1c2VQaHlzaWNhbFJlYWRSZWdpc3RlcnMocEFkLCBpLCAyLCAmTG9naWNhbEFkZHJlc3MpOwotCQlpZiggKExvZ2ljYWxBZGRyZXNzICYgMHhmZikgPT0gMCkKLQkJewotCQkJKkVmdXNlRnJlZUJsb2NrPSAoVUNIQVIpIChFRlVTRV9VU0FHRV9NQVBfRU5ELWkrMSk7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlIGlmKCggKExvZ2ljYWxBZGRyZXNzID4+IDgpICYgMHhmZikgPT0gMCkKLQkJewotCQkJKkVmdXNlRnJlZUJsb2NrID0gKFVDSEFSKSAoRUZVU0VfVVNBR0VfTUFQX0VORC1pKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYoaSA9PSBFRlVTRV9VU0FHRV9NQVBfRU5EKQotCQkJKkVmdXNlRnJlZUJsb2NrID0gMDsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJlRnVzZUdldEZyZWVCbG9ja0NvdW50IGlzIDB4JXhcbiIsKkVmdXNlRnJlZUJsb2NrKSk7Ci19Ci0KLUlOVCBlRnVzZV9pbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVJTlQJRWZ1c2VGcmVlQmxvY2s9MDsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOVk0gaXMgRWZ1c2UgYW5kIGl0cyBzaXplID0leFsleC0leF0gXG4iLEVGVVNFX1VTQUdFX01BUF9TSVpFLEVGVVNFX1VTQUdFX01BUF9TVEFSVCxFRlVTRV9VU0FHRV9NQVBfRU5EKSk7Ci0JZUZ1c2VHZXRGcmVlQmxvY2tDb3VudChwQWQsICZFZnVzZUZyZWVCbG9jayk7Ci0JLy9JZiB0aGUgdXNlZCBibG9jayBvZiBlZnVzZSBpcyBsZXNzIHRoYW4gNS4gV2UgYXNzdW1lIHRoZSBkZWZhdWx0IHZhbHVlCi0JLy8gb2YgdGhpcyBlZnVzZSBpcyBlbXB0eSBhbmQgY2hhbmdlIHRvIHRoZSBidWZmZXIgbW9kZSBpbiBvZHJkZXIgdG8KLQkvL2JyaW5nIHVwIGludGVyZmFjZXMgc3VjY2Vzc2Z1bGx5LgotCWlmKEVmdXNlRnJlZUJsb2NrID4gKEVGVVNFX1VTQUdFX01BUF9FTkQtNSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOVk0gaXMgRWZ1c2UgYW5kIHRoZSBpbmZvcm1hdGlvbiBpcyB0b28gbGVzcyB0byBicmluZyB1cCBpbnRlcmZhY2UuIEZvcmNlIHRvIHVzZSBFRVBST00gQnVmZmVyIE1vZGVcbiIpKTsKLQkJcEFkLT5iRnJvY2VFRVBST01CdWZmZXIgPSBUUlVFOwotCQllRnVzZUxvYWRFRVBST00ocEFkKTsKLQl9Ci0JZWxzZQotCQlwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciA9IEZBTFNFOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5WTSBpcyBFZnVzZSBhbmQgZm9yY2UgdG8gdXNlIEVFUFJPTSBCdWZmZXIgTW9kZT0leFxuIixwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlcikpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9lZV9wcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9lZV9wcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MWNmZGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vZWVfcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JZWVfcHJvbS5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLXN0YXRpYyBpbmxpbmUgVk9JRCBSYWlzZUNsb2NrKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBVSU5UMzIgKngpCi17Ci0JKnggPSAqeCB8IEVFU0s7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgKngpOwotCVJUTVB1c2VjRGVsYXkoMSk7CQkJCS8vIE1heCBmcmVxdWVuY3kgPSAxTUh6IGluIFNwZWMuIGRlZmluaXRpb24KLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLXN0YXRpYyBpbmxpbmUgVk9JRCBMb3dlckNsb2NrKAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBVSU5UMzIgKngpCi17Ci0JKnggPSAqeCAmIH5FRVNLOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsICp4KTsKLQlSVE1QdXNlY0RlbGF5KDEpOwotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBVU0hPUlQgU2hpZnRJbkJpdHMoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDMyCQl4LGk7Ci0JVVNIT1JUICAgICAgZGF0YT0wOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLQl4ICY9IH4oIEVFRE8gfCBFRURJKTsKLQotCWZvcihpPTA7IGk8MTY7IGkrKykKLQl7Ci0JCWRhdGEgPSBkYXRhIDw8IDE7Ci0JCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JCUxvd2VyQ2xvY2socEFkLCAmeCk7IC8vcHJldmVudCByZWFkIGZhaWxlZAotCi0JCXggJj0gfihFRURJKTsKLQkJaWYoeCAmIEVFRE8pCi0JCSAgICBkYXRhIHw9IDE7Ci0JfQotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLXN0YXRpYyBpbmxpbmUgVk9JRCBTaGlmdE91dEJpdHMoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUCQkJZGF0YSwKLQlJTiBVU0hPUlQJCQljb3VudCkKLXsKLQlVSU5UMzIgICAgICAgeCxtYXNrOwotCi0JbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0KLQl4ICY9IH4oRUVETyB8IEVFREkpOwotCi0JZG8KLQl7Ci0JICAgIHggJj0gfkVFREk7Ci0JICAgIGlmKGRhdGEgJiBtYXNrKQkJeCB8PSBFRURJOwotCi0JICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JICAgIFJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JICAgIExvd2VyQ2xvY2socEFkLCAmeCk7Ci0KLQkgICAgbWFzayA9IG1hc2sgPj4gMTsKLQl9IHdoaWxlKG1hc2spOwotCi0JeCAmPSB+RUVESTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLX0KLQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotc3RhdGljIGlubGluZSBWT0lEIEVFcHJvbUNsZWFudXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDMyIHg7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQotCXggJj0gfihFRUNTIHwgRUVESSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQlSYWlzZUNsb2NrKHBBZCwgJngpOwotCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBWT0lEIEVXRU4oCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDMyCXg7Ci0KLQkvLyByZXNldCBiaXRzIGFuZCBzZXQgRUVDUwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCXggJj0gfihFRURJIHwgRUVETyB8IEVFU0spOwotCXggfD0gRUVDUzsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFMlBST01fQ1NSLCB4KTsKLQotCS8vIGtpY2sgYSBwdWxzZQotCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JTG93ZXJDbG9jayhwQWQsICZ4KTsKLQotCS8vIG91dHB1dCB0aGUgcmVhZF9vcGNvZGUgYW5kIHNpeCBwdWxzZSBpbiB0aGF0IG9yZGVyCi0JU2hpZnRPdXRCaXRzKHBBZCwgRUVQUk9NX0VXRU5fT1BDT0RFLCA1KTsKLQlTaGlmdE91dEJpdHMocEFkLCAwLCA2KTsKLQotCUVFcHJvbUNsZWFudXAocEFkKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIFZPSUQgRVdEUygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVSU5UMzIJeDsKLQotCS8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0JeCB8PSBFRUNTOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8ga2ljayBhIHB1bHNlCi0JUmFpc2VDbG9jayhwQWQsICZ4KTsKLQlMb3dlckNsb2NrKHBBZCwgJngpOwotCi0JLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgc2l4IHB1bHNlIGluIHRoYXQgb3JkZXIKLQlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fRVdEU19PUENPREUsIDUpOwotCVNoaWZ0T3V0Qml0cyhwQWQsIDAsIDYpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotfQotCi0KLS8vIElSUUwgPSBQQVNTSVZFX0xFVkVMCi1pbnQgcnRtcF9lZV9wcm9tX3JlYWQxNigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVU0hPUlQJCQlPZmZzZXQsCi0JT1VUIFVTSE9SVAkJCSpwVmFsdWUpCi17Ci0JVUlOVDMyCQl4OwotCVVTSE9SVAkJZGF0YTsKLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQotCXsKLQkJcEFkLT5FZXByb21BY2Nlc3MgPSBUUlVFOwotCX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCU9mZnNldCAvPSAyOwotCS8vIHJlc2V0IGJpdHMgYW5kIHNldCBFRUNTCi0JUlRNUF9JT19SRUFEMzIocEFkLCBFMlBST01fQ1NSLCAmeCk7Ci0JeCAmPSB+KEVFREkgfCBFRURPIHwgRUVTSyk7Ci0JeCB8PSBFRUNTOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEUyUFJPTV9DU1IsIHgpOwotCi0JLy8gcGF0Y2ggY2FuIG5vdCBhY2Nlc3MgZS1GdXNlIGlzc3VlCi0JaWYgKCEoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKQotCXsKLQkJLy8ga2ljayBhIHB1bHNlCi0JCVJhaXNlQ2xvY2socEFkLCAmeCk7Ci0JCUxvd2VyQ2xvY2socEFkLCAmeCk7Ci0JfQotCi0JLy8gb3V0cHV0IHRoZSByZWFkX29wY29kZSBhbmQgcmVnaXN0ZXIgbnVtYmVyIGluIHRoYXQgb3JkZXIKLQlTaGlmdE91dEJpdHMocEFkLCBFRVBST01fUkVBRF9PUENPREUsIDMpOwotCVNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKLQotCS8vIE5vdyByZWFkIHRoZSBkYXRhICgxNiBiaXRzKSBpbiBmcm9tIHRoZSBzZWxlY3RlZCBFRVBST00gd29yZAotCWRhdGEgPSBTaGlmdEluQml0cyhwQWQpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JLy8gQW50ZW5uYSBhbmQgRUVQUk9NIGFjY2VzcyBhcmUgYm90aCB1c2luZyBFRVNLIHBpbiwKLQkvLyBUaGVyZWZvciB3ZSBzaG91bGQgYXZvaWQgYWNjZXNzaW5nIEVFU0sgYXQgdGhlIHNhbWUgdGltZQotCS8vIFRoZW4gcmVzdG9yZSBhbnRlbm5hIGFmdGVyIEVFUFJPTSBhY2Nlc3MKLQlpZiAoKHBBZC0+TmljQ29uZmlnMi5maWVsZC5BbnREaXZlcnNpdHkpLyogfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIwKSovKQotCXsKLQkJcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JKnBWYWx1ZSA9IGRhdGE7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1pbnQgcnRtcF9lZV9wcm9tX3dyaXRlMTYoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBVU0hPUlQgT2Zmc2V0LAotICAgIElOICBVU0hPUlQgRGF0YSkKLXsKLQlVSU5UMzIgeDsKLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KQotCXsKLQkJcEFkLT5FZXByb21BY2Nlc3MgPSBUUlVFOwotCX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCU9mZnNldCAvPSAyOwotCi0JRVdFTihwQWQpOwotCi0JLy8gcmVzZXQgYml0cyBhbmQgc2V0IEVFQ1MKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZ4KTsKLQl4ICY9IH4oRUVESSB8IEVFRE8gfCBFRVNLKTsKLQl4IHw9IEVFQ1M7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgRTJQUk9NX0NTUiwgeCk7Ci0KLQkvLyBwYXRjaCBjYW4gbm90IGFjY2VzcyBlLUZ1c2UgaXNzdWUKLQlpZiAoIShJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkpCi0JewotCQkvLyBraWNrIGEgcHVsc2UKLQkJUmFpc2VDbG9jayhwQWQsICZ4KTsKLQkJTG93ZXJDbG9jayhwQWQsICZ4KTsKLQl9Ci0KLQkvLyBvdXRwdXQgdGhlIHJlYWRfb3Bjb2RlICxyZWdpc3RlciBudW1iZXIgYW5kIGRhdGEgaW4gdGhhdCBvcmRlcgotCVNoaWZ0T3V0Qml0cyhwQWQsIEVFUFJPTV9XUklURV9PUENPREUsIDMpOwotCVNoaWZ0T3V0Qml0cyhwQWQsIE9mZnNldCwgcEFkLT5FRVBST01BZGRyZXNzTnVtKTsKLQlTaGlmdE91dEJpdHMocEFkLCBEYXRhLCAxNik7CQkvLyAxNi1iaXQgYWNjZXNzCi0KLQkvLyByZWFkIERPIHN0YXR1cwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgRTJQUk9NX0NTUiwgJngpOwotCi0JRUVwcm9tQ2xlYW51cChwQWQpOwotCi0JUlRNUHVzZWNEZWxheSgxMDAwMCk7CS8vZGVsYXkgZm9yIHR3cChNQVgpPTEwbXMKLQotCUVXRFMocEFkKTsKLQotCUVFcHJvbUNsZWFudXAocEFkKTsKLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCS8vIEFudGVubmEgYW5kIEVFUFJPTSBhY2Nlc3MgYXJlIGJvdGggdXNpbmcgRUVTSyBwaW4sCi0JLy8gVGhlcmVmb3Igd2Ugc2hvdWxkIGF2b2lkIGFjY2Vzc2luZyBFRVNLIGF0IHRoZSBzYW1lIHRpbWUKLQkvLyBUaGVuIHJlc3RvcmUgYW50ZW5uYSBhZnRlciBFRVBST00gYWNjZXNzCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSAvKnx8IChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkqLykKLQl7Ci0JCXBBZC0+RWVwcm9tQWNjZXNzID0gRkFMU0U7Ci0JCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQpOwotCX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCi19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlcHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTgzNzQ5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL2VlcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQllZXByb20uYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncwotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLUlOVCBSdG1wQ2hpcE9wc0VlcHJvbUhvb2soCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gSU5UCQkJaW5mVHlwZSkKLXsKLQlSVE1QX0NISVBfT1AJKnBDaGlwT3BzID0gJnBBZC0+Y2hpcE9wczsKLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLQlVSU5UMzIJCQllRnVzZUN0cmwsIE1hY0NzcjA7Ci0JaW50IGluZGV4OwotCi0JaW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0JCXBBZC0+TUFDVmVyc2lvbiA9IE1hY0NzcjA7Ci0KLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gIT0gMHgwMCkgJiYgKHBBZC0+TUFDVmVyc2lvbiAhPSAweEZGRkZGRkZGKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTApOwotCX0gd2hpbGUgKGluZGV4KysgPCAxMDApOwotCi0JcEFkLT5iVXNlRWZ1c2U9RkFMU0U7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBFRlVTRV9DVFJMLCAmZUZ1c2VDdHJsKTsKLQlwQWQtPmJVc2VFZnVzZSA9ICggKGVGdXNlQ3RybCAmIDB4ODAwMDAwMDApID09IDB4ODAwMDAwMDApID8gMSA6IDA7Ci0JaWYocEFkLT5iVXNlRWZ1c2UpCi0JewotCQlwQ2hpcE9wcy0+ZWVpbml0ID0gZUZ1c2VfaW5pdDsKLQkJcENoaXBPcHMtPmVlcmVhZCA9IHJ0bXBfZWVfZWZ1c2VfcmVhZDE2OwotCQlwQ2hpcE9wcy0+ZWV3cml0ZSA9IHJ0bXBfZWVfZWZ1c2Vfd3JpdGUxNjsKLQkJcmV0dXJuIDAgOwotCX0KLQllbHNlCi0JewotCQlwQWQtPmJGcm9jZUVFUFJPTUJ1ZmZlciA9IEZBTFNFOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJOVk0gaXMgRUVQUk9NXG4iKSk7Ci0JfQotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0Jc3dpdGNoKGluZlR5cGUpCi0JewotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLQkJY2FzZSBSVE1QX0RFVl9JTkZfUENJOgotCQkJcENoaXBPcHMtPmVlaW5pdCA9IE5VTEw7Ci0JCQlwQ2hpcE9wcy0+ZWVyZWFkID0gcnRtcF9lZV9wcm9tX3JlYWQxNjsKLQkJCXBDaGlwT3BzLT5lZXdyaXRlID0gcnRtcF9lZV9wcm9tX3dyaXRlMTY7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBSVE1QX1BDSV9TVVBQT1JUIC8vCi0KLQotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUnRtcENoaXBPcHNFZXByb21Ib29rKCkgZmFpbGVkIVxuIikpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9pZ21wX3Nub29wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9pZ21wX3Nub29wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDY1OGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vaWdtcF9zbm9vcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZmRlZiBJR01QX1NOT09QX1NVUFBPUlQKLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL2lwdjYuaCIKLSNpbmNsdWRlICIuLi9pZ21wX3Nub29wLmgiCi0KLQotc3RhdGljIGlubGluZSB2b2lkIGluaXRGcmVlRW50cnlMaXN0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRlJFRV9NRU1CRVJfUE9PTF9TSVpFOyBpKyspCi0JCWluc2VydFRhaWxMaXN0KHBMaXN0LCAoUExJU1RfRU5UUlkpJihwTXVsdGljYXN0RmlsdGVyVGFibGUtPmZyZWVNZW1iZXJQb29sW2ldKSk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgUE1FTUJFUl9FTlRSWSBBbGxvY2FHcnBNZW1iZXJFbnRyeSgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUpCi17Ci0JUE1FTUJFUl9FTlRSWSBwTWVtYmVyRW50cnk7Ci0KLQlSVE1QX1NFTV9MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkZyZWVNZW1iZXJQb29sVGFiTG9jayk7Ci0KLQlwTWVtYmVyRW50cnkgPSAoUE1FTUJFUl9FTlRSWSlyZW1vdmVIZWFkTGlzdCgmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5mcmVlRW50cnlMaXN0KTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spOwotCi0JcmV0dXJuIChQTUVNQkVSX0VOVFJZKXBNZW1iZXJFbnRyeTsKLX0KLQotc3RhdGljIGlubGluZSBWT0lEIEZyZWVHcnBNZW1iZXJFbnRyeSgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUE1FTUJFUl9FTlRSWSBwRW50cnkpCi17Ci0JUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spOwotCi0JaW5zZXJ0VGFpbExpc3QoJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+ZnJlZUVudHJ5TGlzdCwgKFBMSVNUX0VOVFJZKXBFbnRyeSk7Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+RnJlZU1lbWJlclBvb2xUYWJMb2NrKTsKLX0KLQotc3RhdGljIFZPSUQgSUdNUFRhYmxlRGlzcGxheSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXN0YXRpYyBCT09MRUFOIGlzSWdtcE1hY0FkZHIoCi0JSU4gUFVDSEFSIHBNYWNBZGRyKTsKLQotc3RhdGljIFZPSUQgSW5zZXJ0SWdtcE1lbWJlcigKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkcik7Ci0KLXN0YXRpYyBWT0lEIERlbGV0ZUlnbXBNZW1iZXIoCi0JSU4gUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlLAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKLQlJTiBQVUNIQVIgcE1lbWJlckFkZHIpOwotCi1zdGF0aWMgVk9JRCBEZWxldGVJZ21wTWVtYmVyTGlzdCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0KTsKLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoaXMgcm91dGluZSBpbml0IHRoZSBlbnRpcmUgSUdNUCB0YWJsZS4KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE11bHRpY2FzdEZpbHRlclRhYmxlSW5pdCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSAqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSkKLXsKLQkvLyBJbml0aWFsaXplIE1BQyB0YWJsZSBhbmQgYWxsb2NhdGUgc3BpbiBsb2NrCi0JKnBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBrbWFsbG9jKHNpemVvZihNVUxUSUNBU1RfRklMVEVSX1RBQkxFKSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmICgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgdW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgTXVsdGljYXNlIGZpbHRlciB0YWJsZSwgc2l6ZT0lZFxuIiwKLQkJCV9fRlVOQ1RJT05fXywgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUpKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeSgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUpKTsKLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmKCgqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSktPk11bHRpY2FzdEZpbHRlclRhYkxvY2spKTsKLQotCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlKS0+RnJlZU1lbWJlclBvb2xUYWJMb2NrKSk7Ci0JaW5pdExpc3QoJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5mcmVlRW50cnlMaXN0KSk7Ci0JaW5pdEZyZWVFbnRyeUxpc3QoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUsICYoKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlKS0+ZnJlZUVudHJ5TGlzdCkpOwotCXJldHVybjsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBUaGlzIHJvdXRpbmUgcmVzZXQgdGhlIGVudGlyZSBJR01QIHRhYmxlLgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTXVsdGlDYXN0RmlsdGVyVGFibGVSZXNldCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSAqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSkKLXsKLQlpZigqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgTXVsdGljYXNlIGZpbHRlciB0YWJsZSBpcyBub3QgcmVhZHkuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNGcmVlU3BpbkxvY2soJigoKnBwTXVsdGljYXN0RmlsdGVyVGFibGUpLT5GcmVlTWVtYmVyUG9vbFRhYkxvY2spKTsKLQlOZGlzRnJlZVNwaW5Mb2NrKCYoKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlKS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jaykpOwotCWtmcmVlKCpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQkqcHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9IE5VTEw7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgRGlzcGxheSBhbGwgZW50cnlzIGluIElHTVAgdGFibGUKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBJR01QVGFibGVEaXNwbGF5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWludCBpOwotCU1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7Ci0JUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlID0gcEFkLT5wTXVsdGljYXN0RmlsdGVyVGFibGU7Ci0KLQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJXMgTXVsdGljYXNlIGZpbHRlciB0YWJsZSBpcyBub3QgcmVhZHkuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIGlmIEZVTEwsIHJldHVybgotCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUgPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlRhYmxlIGVtcHR5LlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpPCBNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfVEFCTEU7IGkrKykKLQl7Ci0JCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5Ci0JCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUtPkNvbnRlbnRbaV0uVmFsaWQgPT0gVFJVRSkKLQkJewotCQkJUE1FTUJFUl9FTlRSWSBwTWVtYmVyRW50cnkgPSBOVUxMOwotCQkJcEVudHJ5ID0gJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+Q29udGVudFtpXTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIklGKCVzKSBlbnRyeSAjJWQsIHR5cGU9JXMsIEdycElkPSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgbWVtYmVyQ250PSVkXG4iLAotCQkJCVJUTVBfT1NfTkVUREVWX0dFVF9ERVZOQU1FKHBFbnRyeS0+bmV0X2RldiksIGksIChwRW50cnktPnR5cGU9PTAgPyAic3RhdGljIjoiZHluYW1pYyIpLAotCQkJCVBSSU5UX01BQyhwRW50cnktPkFkZHIpLCBJZ21wTWVtYmVyQ250KCZwRW50cnktPk1lbWJlckxpc3QpKSk7Ci0KLQkJCXBNZW1iZXJFbnRyeSA9IChQTUVNQkVSX0VOVFJZKXBFbnRyeS0+TWVtYmVyTGlzdC5wSGVhZDsKLQkJCXdoaWxlIChwTWVtYmVyRW50cnkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIm1lbWJlciBtYWM9KCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKLQkJCQkJCQkJCQlQUklOVF9NQUMocE1lbWJlckVudHJ5LT5BZGRyKSkpOwotCi0JCQkJcE1lbWJlckVudHJ5ID0gcE1lbWJlckVudHJ5LT5wTmV4dDsKLQkJCX0KLQkJfQotCX0KLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCXJldHVybjsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBBZGQgYW5kIG5ldyBlbnRyeSBpbnRvIE1BQyB0YWJsZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEdycElkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBkZXYsCi0JSU4gTXVsdGljYXN0RmlsdGVyRW50cnlUeXBlIHR5cGUpCi17Ci0JVUNIQVIgSGFzaElkeDsKLQlpbnQgaTsKLQlNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZICpwRW50cnkgPSBOVUxMLCAqcEN1cnJFbnRyeSwgKnBQcmV2RW50cnk7Ci0JUE1FTUJFUl9FTlRSWSBwTWVtYmVyRW50cnk7Ci0JUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlID0gcEFkLT5wTXVsdGljYXN0RmlsdGVyVGFibGU7Ci0KLQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGlzIG5vdCByZWFkeS5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gaWYgRlVMTCwgcmV0dXJuCi0JaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSA+PSBNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfVEFCTEUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBNdWx0aWNhc2UgZmlsdGVyIHRhYmxlIGZ1bGwuIG1heC1lbnRyaWVzID0gJWRcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIE1BWF9MRU5fT0ZfTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gY2hlY2sgdGhlIHJ1bGUgaXMgaW4gdGFibGUgYWxyZWFkeSBvciBub3QuCi0JaWYgKChwRW50cnkgPSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cChwTXVsdGljYXN0RmlsdGVyVGFibGUsIHBHcnBJZCwgZGV2KSkpCi0JewotCQkvLyBkb2Vzbid0IGluZGljYXRlIG1lbWJlciBtYWMgYWRkcmVzcy4KLQkJaWYocE1lbWJlckFkZHIgPT0gTlVMTCkKLQkJewotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLQkJcE1lbWJlckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcEVudHJ5LT5NZW1iZXJMaXN0LnBIZWFkOwotCi0JCXdoaWxlIChwTWVtYmVyRW50cnkpCi0JCXsKLQkJCWlmIChNQUNfQUREUl9FUVVBTChwTWVtYmVyQWRkciwgcE1lbWJlckVudHJ5LT5BZGRyKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogYWxyZWFkeSBpbiBNZW1iZXJzIGxpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0KLQkJCXBNZW1iZXJFbnRyeSA9IHBNZW1iZXJFbnRyeS0+cE5leHQ7Ci0JCX0KLQl9Ci0KLQlSVE1QX1NFTV9MT0NLKCZwTXVsdGljYXN0RmlsdGVyVGFibGUtPk11bHRpY2FzdEZpbHRlclRhYkxvY2spOwotCWRvCi0JewotCQlVTE9ORyBOb3c7Ci0JCS8vIHRoZSBtdWx0aWNhc3QgZW50cnkgYWxyZWFkeSBleGlzdCBidXQgZG9lc24ndCBpbmNsdWRlIHRoZSBtZW1iZXIgeWV0LgotCQlpZiAocEVudHJ5ICE9IE5VTEwgJiYgcE1lbWJlckFkZHIgIT0gTlVMTCkKLQkJewotCQkJSW5zZXJ0SWdtcE1lbWJlcihwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QsIHBNZW1iZXJBZGRyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gYWxsb2NhdGUgb25lIE1BQyBlbnRyeQotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9NVUxUSUNBU1RfRklMVEVSX1RBQkxFOyBpKyspCi0JCXsKLQkJCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5Ci0JCQlwRW50cnkgPSAmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5Db250ZW50W2ldOwotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCWlmICgocEVudHJ5LT5WYWxpZCA9PSBUUlVFKSAmJiAocEVudHJ5LT50eXBlID09IE1DQVRfRklMVEVSX0RZTkFNSUMpCi0JCQkJJiYgKChOb3cgLSBwRW50cnktPmxhc3RUaW1lKSA+IElHTVBNQUNfVEJfRU5UUllfQUdFT1VUX1RJTUUpKQotCQkJewotCQkJCVBNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZIHBIYXNoRW50cnk7Ci0KLQkJCQlIYXNoSWR4ID0gTVVMVElDQVNUX0FERFJfSEFTSF9JTkRFWChwRW50cnktPkFkZHIpOwotCQkJCXBIYXNoRW50cnkgPSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF07Ci0KLQkJCQlpZiAoKHBFbnRyeS0+bmV0X2RldiA9PSBwSGFzaEVudHJ5LT5uZXRfZGV2KQotCQkJCQkmJiBNQUNfQUREUl9FUVVBTChwRW50cnktPkFkZHIsIHBIYXNoRW50cnktPkFkZHIpKQotCQkJCXsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdID0gcEhhc2hFbnRyeS0+cE5leHQ7Ci0JCQkJCXBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSAtLTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5IDEgLSBUb3RhbD0gJWRcbiIsIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSkpOwotCQkJCX0gZWxzZQotCQkJCXsKLQkJCQkJd2hpbGUgKHBIYXNoRW50cnktPnBOZXh0KQotCQkJCQl7Ci0JCQkJCQlwUHJldkVudHJ5ID0gcEhhc2hFbnRyeTsKLQkJCQkJCXBIYXNoRW50cnkgPSBwSGFzaEVudHJ5LT5wTmV4dDsKLQkJCQkJCWlmICgocEVudHJ5LT5uZXRfZGV2ID09IHBIYXNoRW50cnktPm5ldF9kZXYpCi0JCQkJCQkJJiYgTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwSGFzaEVudHJ5LT5BZGRyKSkKLQkJCQkJCXsKLQkJCQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBIYXNoRW50cnktPnBOZXh0OwotCQkJCQkJCXBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSAtLTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQ2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkgMiAtIFRvdGFsPSAlZFxuIiwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcEVudHJ5LT5WYWxpZCA9IEZBTFNFOwotCQkJCURlbGV0ZUlnbXBNZW1iZXJMaXN0KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCk7Ci0JCQl9Ci0KLQkJCWlmIChwRW50cnktPlZhbGlkID09IEZBTFNFKQotCQkJewotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQlwRW50cnktPlZhbGlkID0gVFJVRTsKLQotCQkJCUNPUFlfTUFDX0FERFIocEVudHJ5LT5BZGRyLCBwR3JwSWQpOwotCQkJCXBFbnRyeS0+bmV0X2RldiA9IGRldjsKLQkJCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJCXBFbnRyeS0+bGFzdFRpbWUgPSBOb3c7Ci0JCQkJcEVudHJ5LT50eXBlID0gdHlwZTsKLQkJCQlpbml0TGlzdCgmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCQlpZiAocE1lbWJlckFkZHIgIT0gTlVMTCkKLQkJCQkJSW5zZXJ0SWdtcE1lbWJlcihwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QsIHBNZW1iZXJBZGRyKTsKLQotCQkJCXBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSArKzsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkgLUlGKCVzKSBhbGxvY2F0ZSBlbnRyeSAjJWQsIFRvdGFsPSAlZFxuIiwgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUoZGV2KSwgaSwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCUhhc2hJZHggPSBNVUxUSUNBU1RfQUREUl9IQVNIX0lOREVYKHBHcnBJZCk7Ci0JCQlpZiAocE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQkJfSBlbHNlCi0JCQl7Ci0JCQkJcEN1cnJFbnRyeSA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKLQkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwotCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQkJfQotCQl9Ci0JfXdoaWxlKEZBTFNFKTsKLQotCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIERlbGV0ZSBhIHNwZWNpZmllZCBjbGllbnQgZnJvbSBNQUMgdGFibGUKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIE11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBHcnBJZCwKLQlJTiBQVUNIQVIgcE1lbWJlckFkZHIsCi0JSU4gUE5FVF9ERVYgZGV2KQotewotCVVTSE9SVCBIYXNoSWR4OwotCU1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgKnBFbnRyeSwgKnBQcmV2RW50cnk7Ci0JUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlID0gcEFkLT5wTXVsdGljYXN0RmlsdGVyVGFibGU7Ci0JVVNIT1JUIEFpZCA9IE1DQVNUX1dDSUQ7Ci0JU1NUCVNzdCA9IFNTVF9BU1NPQzsKLQlVQ0hBUiBQc01vZGUgPSBQV1JfQUNUSVZFLCBSYXRlOwotCi0JaWYgKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgTXVsdGljYXNlIGZpbHRlciB0YWJsZSBpcyBub3QgcmVhZHkuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0KLQlkbwotCXsKLQkJSGFzaElkeCA9IE1VTFRJQ0FTVF9BRERSX0hBU0hfSU5ERVgocEdycElkKTsKLQkJcFByZXZFbnRyeSA9IHBFbnRyeSA9IHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XTsKLQotCQl3aGlsZSAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWQpCi0JCXsKLQkJCWlmICgocEVudHJ5LT5uZXRfZGV2ID09ICBkZXYpCi0JCQkJJiYgTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwR3JwSWQpKQotCQkJCWJyZWFrOwotCQkJZWxzZQotCQkJewotCQkJCXBQcmV2RW50cnkgPSBwRW50cnk7Ci0JCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBydWxlIGlzIGluIHRhYmxlIGFscmVhZHkgb3Igbm90LgotCQlpZiAocEVudHJ5ICYmIChwTWVtYmVyQWRkciAhPSBOVUxMKSkKLQkJewotCQkJaWYoQVBTc1BzSW5xdWlyeShwQWQsIHBNZW1iZXJBZGRyLCAmU3N0LCAmQWlkLCAmUHNNb2RlLCAmUmF0ZSkpCi0JCQkJRGVsZXRlSWdtcE1lbWJlcihwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QsIHBNZW1iZXJBZGRyKTsKLQkJCWlmIChJZ21wTWVtYmVyQ250KCZwRW50cnktPk1lbWJlckxpc3QpID4gMCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCWlmIChwRW50cnkgPT0gcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdKQotCQkJewotCQkJCXBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJRGVsZXRlSWdtcE1lbWJlckxpc3QocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZKSk7Ci0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSAxIC0gVG90YWw9ICVkXG4iLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwUHJldkVudHJ5LT5wTmV4dCA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJRGVsZXRlSWdtcE1lbWJlckxpc3QocE11bHRpY2FzdEZpbHRlclRhYmxlLCAmcEVudHJ5LT5NZW1iZXJMaXN0KTsKLQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZKSk7Ci0JCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSAyIC0gVG90YWw9ICVkXG4iLCBwTXVsdGljYXN0RmlsdGVyVGFibGUtPlNpemUpKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB0aGUgR3JvdXAgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQl9Ci0JfSB3aGlsZShGQUxTRSk7Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBMb29rIHVwIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgSUdNUCB0YWJsZS4gUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgotICAgIFJldHVybjoKLSAgICAgICAgcEVudHJ5IC0gcG9pbnRlciB0byB0aGUgTUFDIGVudHJ5OyBOVUxMIGlzIG5vdCBmb3VuZAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgTXVsdGljYXN0RmlsdGVyVGFibGVMb29rdXAoCi0JSU4gUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlLAotCUlOIFBVQ0hBUiBwQWRkciwKLQlJTiBQTkVUX0RFViBkZXYpCi17Ci0JVUxPTkcgSGFzaElkeCwgTm93OwotCVBNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBQcmV2ID0gTlVMTDsKLQotCWlmIChwTXVsdGljYXN0RmlsdGVyVGFibGUgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIE11bHRpY2FzZSBmaWx0ZXIgdGFibGUgaXMgbm90IHJlYWR5LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCVJUTVBfU0VNX0xPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0KLQlIYXNoSWR4ID0gTVVMVElDQVNUX0FERFJfSEFTSF9JTkRFWChwQWRkcik7Ci0JcEVudHJ5ID0gcFByZXYgPSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF07Ci0KLQl3aGlsZSAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWQpCi0JewotCQlpZiAoKHBFbnRyeS0+bmV0X2RldiA9PSAgZGV2KQotCQkJJiYgTUFDX0FERFJfRVFVQUwocEVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlwRW50cnktPmxhc3RUaW1lID0gTm93OwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJaWYgKChwRW50cnktPlZhbGlkID09IFRSVUUpICYmIChwRW50cnktPnR5cGUgPT0gTUNBVF9GSUxURVJfRFlOQU1JQykKLQkJCQkmJiBSVE1QX1RJTUVfQUZURVIoTm93LCBwRW50cnktPmxhc3RUaW1lK0lHTVBNQUNfVEJfRU5UUllfQUdFT1VUX1RJTUUpKQotCQkJewotCQkJCS8vIFJlbW92ZSB0aGUgYWdlZCBlbnRyeQotCQkJCWlmIChwRW50cnkgPT0gcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdKQotCQkJCXsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQkJcFByZXYgPSBwTXVsdGljYXN0RmlsdGVyVGFibGUtPkhhc2hbSGFzaElkeF07Ci0JCQkJCURlbGV0ZUlnbXBNZW1iZXJMaXN0KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCk7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkpKTsKLQkJCQkJcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplIC0tOwotCQkJCQlwRW50cnkgPSBwUHJldjsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5IDIgLSBUb3RhbD0gJWRcbiIsIHBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwUHJldi0+cE5leHQgPSBwRW50cnktPnBOZXh0OwotCQkJCQlEZWxldGVJZ21wTWVtYmVyTGlzdChwTXVsdGljYXN0RmlsdGVyVGFibGUsICZwRW50cnktPk1lbWJlckxpc3QpOwotCQkJCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNVUxUSUNBU1RfRklMVEVSX1RBQkxFX0VOVFJZKSk7Ci0JCQkJCXBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+U2l6ZSAtLTsKLQkJCQkJcEVudHJ5ID0gKHBQcmV2ID09IE5VTEwgPyBOVUxMOiBwUHJldi0+cE5leHQpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNQ2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkgMiAtIFRvdGFsPSAlZFxuIiwgcE11bHRpY2FzdEZpbHRlclRhYmxlLT5TaXplKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBQcmV2ID0gcEVudHJ5OwotCQkJCXBFbnRyeSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJnBNdWx0aWNhc3RGaWx0ZXJUYWJsZS0+TXVsdGljYXN0RmlsdGVyVGFiTG9jayk7Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1WT0lEIElHTVBTbm9vcGluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBTcmNNYWNBZGRyLAotCUlOIFBVQ0hBUiBwSXBIZWFkZXIsCi0JSU4gUE5FVF9ERVYgcERldikKLXsKLQlJTlQgaTsKLQlJTlQgSXBIZWFkZXJMZW47Ci0JVUNIQVIgR3JvdXBUeXBlOwotCVVJTlQxNiBudW1PZkdyb3VwOwotCVVDSEFSIElnbXBWZXJUeXBlOwotCVBVQ0hBUiBwSWdtcEhlYWRlcjsKLQlQVUNIQVIgcEdyb3VwOwotCVVDSEFSIEF1eERhdGFMZW47Ci0JVUlOVDE2IG51bU9mU291cmNlczsKLQlQVUNIQVIgcEdyb3VwSXBBZGRyOwotCVVDSEFSIEdyb3VwTWFjQWRkcls2XTsKLQlQVUNIQVIgcEdyb3VwTWFjQWRkciA9IChQVUNIQVIpJkdyb3VwTWFjQWRkcjsKLQotCWlmKGlzSWdtcFBrdChwRHN0TWFjQWRkciwgcElwSGVhZGVyKSkKLQl7Ci0JCUlwSGVhZGVyTGVuID0gKCoocElwSGVhZGVyICsgMikgJiAweDBmKSAqIDQ7Ci0JCXBJZ21wSGVhZGVyID0gcElwSGVhZGVyICsgMiArIElwSGVhZGVyTGVuOwotCQlJZ21wVmVyVHlwZSA9IChVQ0hBUikoKihwSWdtcEhlYWRlcikpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklHTVAgdHlwZT0lMHhcbiIsIElnbXBWZXJUeXBlKSk7Ci0KLQkJc3dpdGNoKElnbXBWZXJUeXBlKQotCQl7Ci0JCWNhc2UgSUdNUF9WMV9NRU1CRVJTSElQX1JFUE9SVDogLy8gSUdNUCB2ZXJzaW9uIDEgbWVtYmVyc2hpcCByZXBvcnQuCi0JCWNhc2UgSUdNUF9WMl9NRU1CRVJTSElQX1JFUE9SVDogLy8gSUdNUCB2ZXJzaW9uIDIgbWVtYmVyc2hpcCByZXBvcnQuCi0JCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwSWdtcEhlYWRlciArIDQpOwotCQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocEdyb3VwSXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklHTVAgR3JvdXA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJR3JvdXBNYWNBZGRyWzBdLCBHcm91cE1hY0FkZHJbMV0sIEdyb3VwTWFjQWRkclsyXSwgR3JvdXBNYWNBZGRyWzNdLCBHcm91cE1hY0FkZHJbNF0sIEdyb3VwTWFjQWRkcls1XSkpOwotCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYsIE1DQVRfRklMVEVSX0RZTkFNSUMpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJR01QX0xFQVZFX0dST1VQOiAvLyBJR01QIHZlcnNpb24gMSBhbmQgdmVyc2lvbiAyIGxlYXZlIGdyb3VwLgotCQkJcEdyb3VwSXBBZGRyID0gKFBVQ0hBUikocElnbXBIZWFkZXIgKyA0KTsKLQkJCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHBHcm91cElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJR01QIEdyb3VwPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCUdyb3VwTWFjQWRkclswXSwgR3JvdXBNYWNBZGRyWzFdLCBHcm91cE1hY0FkZHJbMl0sIEdyb3VwTWFjQWRkclszXSwgR3JvdXBNYWNBZGRyWzRdLCBHcm91cE1hY0FkZHJbNV0pKTsKLQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUdNUF9WM19NRU1CRVJTSElQX1JFUE9SVDogLy8gSUdNUCB2ZXJzaW9uIDMgbWVtYmVyc2hpcCByZXBvcnQuCi0JCQludW1PZkdyb3VwID0gbnRvaHMoKigoVUlOVDE2ICopKHBJZ21wSGVhZGVyICsgNikpKTsKLQkJCXBHcm91cCA9IChQVUNIQVIpKHBJZ21wSGVhZGVyICsgOCk7Ci0JCQlmb3IgKGk9MDsgaSA8IG51bU9mR3JvdXA7IGkrKykKLQkJCXsKLQkJCQlHcm91cFR5cGUgPSAoVUNIQVIpKCpwR3JvdXApOwotCQkJCUF1eERhdGFMZW4gPSAoVUNIQVIpKCoocEdyb3VwICsgMSkpOwotCQkJCW51bU9mU291cmNlcyA9IG50b2hzKCooKFVJTlQxNiAqKShwR3JvdXAgKyAyKSkpOwotCQkJCXBHcm91cElwQWRkciA9IChQVUNIQVIpKHBHcm91cCArIDQpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklHTVB2MyBUeXBlPSVkLCBBREw9JWQsIG51bU9mU291cmNlPSVkXG4iLCBHcm91cFR5cGUsIEF1eERhdGFMZW4sIG51bU9mU291cmNlcykpOwotCQkJCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKHBHcm91cElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSUdNUCBHcm91cD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJR3JvdXBNYWNBZGRyWzBdLCBHcm91cE1hY0FkZHJbMV0sIEdyb3VwTWFjQWRkclsyXSwgR3JvdXBNYWNBZGRyWzNdLCBHcm91cE1hY0FkZHJbNF0sIEdyb3VwTWFjQWRkcls1XSkpOwotCi0JCQkJZG8KLQkJCQl7Ci0JCQkJCWlmKChHcm91cFR5cGUgPT0gTU9ERV9JU19FWENMVURFKSB8fCAoR3JvdXBUeXBlID09IENIQU5HRV9UT19FWENMVURFX01PREUpIHx8IChHcm91cFR5cGUgPT0gQUxMT1dfTkVXX1NPVVJDRVMpKQotCQkJCQl7Ci0JCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldiwgTUNBVF9GSUxURVJfRFlOQU1JQyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCWlmKChHcm91cFR5cGUgPT0gTU9ERV9JU19JTkNMVURFKSB8fCAoR3JvdXBUeXBlID09IEJMT0NLX09MRF9TT1VSQ0VTKSkKLQkJCQkJewotCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlpZigoR3JvdXBUeXBlID09IENIQU5HRV9UT19JTkNMVURFX01PREUpKQotCQkJCQl7Ci0JCQkJCQlpZihudW1PZlNvdXJjZXMgPT0gMCkKLQkJCQkJCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgR3JvdXBNYWNBZGRyLCBwU3JjTWFjQWRkciwgcERldik7Ci0JCQkJCQllbHNlCi0JCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYsIE1DQVRfRklMVEVSX0RZTkFNSUMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IHdoaWxlKEZBTFNFKTsKLQkJCQlwR3JvdXAgKz0gKDggKyAobnVtT2ZTb3VyY2VzICogNCkgKyBBdXhEYXRhTGVuKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ1bmtub3cgSUdNUCBUeXBlPSVkXG4iLCBJZ21wVmVyVHlwZSkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIEJPT0xFQU4gaXNJZ21wTWFjQWRkcigKLQlJTiBQVUNIQVIgcE1hY0FkZHIpCi17Ci0JaWYoKHBNYWNBZGRyWzBdID09IDB4MDEpCi0JCSYmIChwTWFjQWRkclsxXSA9PSAweDAwKQotCQkmJiAocE1hY0FkZHJbMl0gPT0gMHg1ZSkpCi0JCXJldHVybiBUUlVFOwotCXJldHVybiBGQUxTRTsKLX0KLQotQk9PTEVBTiBpc0lnbXBQa3QoCi0JSU4gUFVDSEFSIHBEc3RNYWNBZGRyLAotCUlOIFBVQ0hBUiBwSXBIZWFkZXIpCi17Ci0JVUlOVDE2IElwUHJvdG9jb2wgPSBudG9ocygqKChVSU5UMTYgKikocElwSGVhZGVyKSkpOwotCVVDSEFSIElnbXBQcm90b2NvbDsKLQotCWlmKCFpc0lnbXBNYWNBZGRyKHBEc3RNYWNBZGRyKSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JaWYoSXBQcm90b2NvbCA9PSBFVEhfUF9JUCkKLQl7Ci0JCUlnbXBQcm90b2NvbCA9IChVQ0hBUikqKHBJcEhlYWRlciArIDExKTsKLQkJaWYoSWdtcFByb3RvY29sID09IElHTVBfUFJPVE9DT0xfREVTQ1JJUFRPUikKLQkJCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyBWT0lEIEluc2VydElnbXBNZW1iZXIoCi0JSU4gUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlLAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCwKLQlJTiBQVUNIQVIgcE1lbWJlckFkZHIpCi17Ci0JUE1FTUJFUl9FTlRSWSBwTWVtYmVyRW50cnk7Ci0KLQlpZihwTGlzdCA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IG1lbWJlcnQgbGlzdCBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocE1lbWJlckFkZHIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBpbnZhbGlkIG1lbWJlci5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYoKHBNZW1iZXJFbnRyeSA9IChQTUVNQkVSX0VOVFJZKUFsbG9jYUdycE1lbWJlckVudHJ5KHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSkpICE9IE5VTEwpCi0JewotCQlOZGlzWmVyb01lbW9yeShwTWVtYmVyRW50cnksIHNpemVvZihNRU1CRVJfRU5UUlkpKTsKLQkJQ09QWV9NQUNfQUREUihwTWVtYmVyRW50cnktPkFkZHIsIHBNZW1iZXJBZGRyKTsKLQkJaW5zZXJ0VGFpbExpc3QocExpc3QsIChQTElTVF9FTlRSWSlwTWVtYmVyRW50cnkpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIE1lbWJlciBNYWM9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIF9fRlVOQ1RJT05fXywKLQkJCXBNZW1iZXJFbnRyeS0+QWRkclswXSwgcE1lbWJlckVudHJ5LT5BZGRyWzFdLCBwTWVtYmVyRW50cnktPkFkZHJbMl0sCi0JCQlwTWVtYmVyRW50cnktPkFkZHJbM10sIHBNZW1iZXJFbnRyeS0+QWRkcls0XSwgcE1lbWJlckVudHJ5LT5BZGRyWzVdKSk7Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIFZPSUQgRGVsZXRlSWdtcE1lbWJlcigKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkcikKLXsKLQlQTUVNQkVSX0VOVFJZIHBDdXJFbnRyeTsKLQotCWlmKChwTGlzdCA9PSBOVUxMKSB8fCAocExpc3QtPnBIZWFkID09IE5VTEwpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IG1lbWJlcnQgbGlzdCBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocE1lbWJlckFkZHIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBpbnZhbGlkIG1lbWJlci5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCi0JcEN1ckVudHJ5ID0gKFBNRU1CRVJfRU5UUlkpcExpc3QtPnBIZWFkOwotCXdoaWxlIChwQ3VyRW50cnkpCi0JewotCQlpZihNQUNfQUREUl9FUVVBTChwTWVtYmVyQWRkciwgcEN1ckVudHJ5LT5BZGRyKSkKLQkJewotCQkJZGVsRW50cnlMaXN0KHBMaXN0LCAoUExJU1RfRU5UUlkpcEN1ckVudHJ5KTsKLQkJCUZyZWVHcnBNZW1iZXJFbnRyeShwTXVsdGljYXN0RmlsdGVyVGFibGUsIHBDdXJFbnRyeSk7Ci0JCQlicmVhazsKLQkJfQotCQlwQ3VyRW50cnkgPSBwQ3VyRW50cnktPnBOZXh0OwotCX0KLQotCXJldHVybjsKLX0KLQotc3RhdGljIFZPSUQgRGVsZXRlSWdtcE1lbWJlckxpc3QoCi0JSU4gUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEUgcE11bHRpY2FzdEZpbHRlclRhYmxlLAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlQTUVNQkVSX0VOVFJZIHBDdXJFbnRyeSwgcFBydkVudHJ5OwotCi0JaWYoKHBMaXN0ID09IE5VTEwpIHx8IChwTGlzdC0+cEhlYWQgPT0gTlVMTCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogbWVtYmVydCBsaXN0IGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCXBQcnZFbnRyeSA9IHBDdXJFbnRyeSA9IChQTUVNQkVSX0VOVFJZKXBMaXN0LT5wSGVhZDsKLQl3aGlsZSAocEN1ckVudHJ5KQotCXsKLQkJZGVsRW50cnlMaXN0KHBMaXN0LCAoUExJU1RfRU5UUlkpcEN1ckVudHJ5KTsKLQkJcFBydkVudHJ5ID0gcEN1ckVudHJ5OwotCQlwQ3VyRW50cnkgPSBwQ3VyRW50cnktPnBOZXh0OwotCQlGcmVlR3JwTWVtYmVyRW50cnkocE11bHRpY2FzdEZpbHRlclRhYmxlLCBwUHJ2RW50cnkpOwotCX0KLQotCWluaXRMaXN0KHBMaXN0KTsKLQlyZXR1cm47Ci19Ci0KLQotVUNIQVIgSWdtcE1lbWJlckNudCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JaWYocExpc3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBtZW1iZXJ0IGxpc3QgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gZ2V0TGlzdFNpemUocExpc3QpOwotfQotCi1WT0lEIElnbXBHcm91cERlbE1lbWJlcnMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyLAotCUlOIFBORVRfREVWIHBEZXYpCi17Ci0JSU5UIGk7Ci0JTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQlQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUgPSBwQWQtPnBNdWx0aWNhc3RGaWx0ZXJUYWJsZTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfVEFCTEU7IGkrKykKLQl7Ci0JCS8vIHBpY2sgdXAgdGhlIGZpcnN0IGF2YWlsYWJsZSB2YWNhbmN5Ci0JCXBFbnRyeSA9ICZwTXVsdGljYXN0RmlsdGVyVGFibGUtPkNvbnRlbnRbaV07Ci0JCWlmIChwRW50cnktPlZhbGlkID09IFRSVUUpCi0JCXsKLQkJCWlmKHBNZW1iZXJBZGRyICE9IE5VTEwpCi0JCQl7Ci0JCQkJUlRNUF9TRU1fTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQkJCQlEZWxldGVJZ21wTWVtYmVyKHBNdWx0aWNhc3RGaWx0ZXJUYWJsZSwgJnBFbnRyeS0+TWVtYmVyTGlzdCwgcE1lbWJlckFkZHIpOwotCQkJCVJUTVBfU0VNX1VOTE9DSygmcE11bHRpY2FzdEZpbHRlclRhYmxlLT5NdWx0aWNhc3RGaWx0ZXJUYWJMb2NrKTsKLQkJCX0KLQotCQkJaWYoKHBFbnRyeS0+dHlwZSA9PSBNQ0FUX0ZJTFRFUl9EWU5BTUlDKQotCQkJCSYmIChJZ21wTWVtYmVyQ250KCZwRW50cnktPk1lbWJlckxpc3QpID09IDApKQotCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFkZHIsIHBNZW1iZXJBZGRyLCBwRGV2KTsKLQkJfQotCX0KLX0KLQotSU5UIFNldF9JZ21wU25fRW5hYmxlX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpCi17Ci0JVUlOVCBFbmFibGU7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCVVDSEFSIGlmSW5kZXg7Ci0JUE5FVF9ERVYgcERldjsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0JaWZJbmRleCA9IHBPYmotPmlvY3RsX2lmOwotCi0JcERldiA9IChpZkluZGV4ID09IE1BSU5fTUJTU0lEKSA/IChwQWQtPm5ldF9kZXYpIDogKHBBZC0+QXBDZmcuTUJTU0lEW2lmSW5kZXhdLk1TU0lERGV2KTsKLQlFbmFibGUgPSAoVUlOVCkgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCXBBZC0+QXBDZmcuTUJTU0lEW2lmSW5kZXhdLklnbXBTbm9vcEVuYWJsZSA9IChCT09MRUFOKShFbmFibGUgPT0gMCA/IDAgOiAxKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6KCVzKSAlc1xuIiwgX19GVU5DVElPTl9fLCBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwRGV2KSwgRW5hYmxlID09IFRSVUUgPyAiRW5hYmxlIElHTVAgU25vb3BpbmciOiJEaXNhYmxlIElHTVAgU25vb3BpbmciKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9JZ21wU25fQWRkRW50cnlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZykKLXsKLQlJTlQgaTsKLQlCT09MRUFOIGJHcm91cElkID0gMTsKLQlQU1RSSU5HIHZhbHVlOwotCVBTVFJJTkcgdGhpc0NoYXI7Ci0JVUNIQVIgSXBBZGRyWzRdOwotCVVDSEFSIEFkZHJbRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQlVQ0hBUiBHcm91cElkW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JUFVDSEFSICpwQWRkciA9IChQVUNIQVIgKikmQWRkcjsKLQlQTkVUX0RFViBwRGV2OwotCVBPU19DT09LSUUgcE9iajsKLQlVQ0hBUiBpZkluZGV4OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlpZkluZGV4ID0gcE9iai0+aW9jdGxfaWY7Ci0KLQlwRGV2ID0gKGlmSW5kZXggPT0gTUFJTl9NQlNTSUQpID8gKHBBZC0+bmV0X2RldikgOiAocEFkLT5BcENmZy5NQlNTSURbaWZJbmRleF0uTVNTSUREZXYpOwotCi0Jd2hpbGUgKCh0aGlzQ2hhciA9IHN0cnNlcCgoY2hhciAqKikmYXJnLCAiLSIpKSAhPSBOVUxMKQotCXsKLQkJLy8gcmVmdXNlIHRoZSBNZW1iZXIgaWYgaXQncyBub3QgYSBNQUMgYWRkcmVzcy4KLQkJaWYoKGJHcm91cElkID09IDApICYmIChzdHJsZW4odGhpc0NoYXIpICE9IDE3KSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmKHN0cmxlbih0aGlzQ2hhcikgPT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCQl7Ci0JCQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKHRoaXNDaGFyLCI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiOiIpKQotCQkJewotCQkJCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQotCQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQotCQkJCUF0b0godmFsdWUsICZBZGRyW2krK10sIDEpOwotCQkJfQotCi0JCQlpZihpICE9IDYpCi0JCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKHRoaXNDaGFyLCIuIik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwiLiIpKQotCQkJewotCQkJCWlmKChzdHJsZW4odmFsdWUpID4gMCkgJiYgKHN0cmxlbih2YWx1ZSkgPD0gMykpCi0JCQkJewotCQkJCQlpbnQgaWk7Ci0JCQkJCWZvcihpaT0wOyBpaTxzdHJsZW4odmFsdWUpOyBpaSsrKQotCQkJCQkJaWYgKCFpc3hkaWdpdCgqKHZhbHVlICsgaWkpKSkKLQkJCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJCQlJcEFkZHJbaV0gPSAoVUNIQVIpc2ltcGxlX3N0cnRvbCh2YWx1ZSwgTlVMTCwgMTApOwotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYoaSAhPSA0KQotCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCQlDb252ZXJ0TXVsdGljYXN0SVAyTUFDKElwQWRkciwgKFBVQ0hBUiAqKSZwQWRkciwgRVRIX1BfSVApOwotCQl9Ci0KLQkJaWYoYkdyb3VwSWQgPT0gMSkKLQkJCUNPUFlfTUFDX0FERFIoR3JvdXBJZCwgQWRkcik7Ci0KLQkJLy8gR3JvdXAtSWQgbXVzdCBiZSBhIE1DQVNUIGFkZHJlc3MuCi0JCWlmKChiR3JvdXBJZCA9PSAxKSAmJiBJU19NVUxUSUNBU1RfTUFDX0FERFIoQWRkcikpCi0JCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KHBBZCwgR3JvdXBJZCwgTlVMTCwgcERldiwgTUNBVF9GSUxURVJfU1RBVElDKTsKLQkJLy8gR3JvdXAtTWVtYmVyIG11c3QgYmUgYSBVQ0FTVCBhZGRyZXNzLgotCQllbHNlIGlmICgoYkdyb3VwSWQgPT0gMCkgJiYgIUlTX01VTFRJQ0FTVF9NQUNfQUREUihBZGRyKSkKLQkJCU11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkocEFkLCBHcm91cElkLCBBZGRyLCBwRGV2LCBNQ0FUX0ZJTFRFUl9TVEFUSUMpOwotCQllbHNlCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzICglMlg6JTJYOiUyWDolMlg6JTJYOiUyWCkgaXMgbm90IGEgYWNjZXB0YWJsZSBhZGRyZXNzLlxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIEFkZHJbMF0sIEFkZHJbMV0sIEFkZHJbMl0sIEFkZHJbM10sIEFkZHJbNF0sIEFkZHJbNV0pKTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCi0JCWJHcm91cElkID0gMDsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKCUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwKLQkJCV9fRlVOQ1RJT05fXywgQWRkclswXSwgQWRkclsxXSwgQWRkclsyXSwgQWRkclszXSwgQWRkcls0XSwgQWRkcls1XSkpOwotCi0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfSWdtcFNuX0RlbEVudHJ5X1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpCi17Ci0JSU5UIGksIG1lbWJlckNudCA9IDA7Ci0JQk9PTEVBTiBiR3JvdXBJZCA9IDE7Ci0JUFNUUklORyB2YWx1ZTsKLQlQU1RSSU5HIHRoaXNDaGFyOwotCVVDSEFSIElwQWRkcls0XTsKLQlVQ0hBUiBBZGRyW0VUSF9MRU5HVEhfT0ZfQUREUkVTU107Ci0JVUNIQVIgR3JvdXBJZFtFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVBVQ0hBUiAqcEFkZHIgPSAoUFVDSEFSICopJkFkZHI7Ci0JUE5FVF9ERVYgcERldjsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0JVUNIQVIgaWZJbmRleDsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0JaWZJbmRleCA9IHBPYmotPmlvY3RsX2lmOwotCi0JcERldiA9IChpZkluZGV4ID09IE1BSU5fTUJTU0lEKSA/IChwQWQtPm5ldF9kZXYpIDogKHBBZC0+QXBDZmcuTUJTU0lEW2lmSW5kZXhdLk1TU0lERGV2KTsKLQotCXdoaWxlICgodGhpc0NoYXIgPSBzdHJzZXAoKGNoYXIgKiopJmFyZywgIi0iKSkgIT0gTlVMTCkKLQl7Ci0JCS8vIHJlZnVzZSB0aGUgTWVtYmVyIGlmIGl0J3Mgbm90IGEgTUFDIGFkZHJlc3MuCi0JCWlmKChiR3JvdXBJZCA9PSAwKSAmJiAoc3RybGVuKHRoaXNDaGFyKSAhPSAxNykpCi0JCQljb250aW51ZTsKLQotCQlpZihzdHJsZW4odGhpc0NoYXIpID09IDE3KSAgLy9NYWMgYWRkcmVzcyBhY2NlcHRhYmxlIGZvcm1hdCAwMTowMjowMzowNDowNTowNiBsZW5ndGggMTcKLQkJewotCQkJZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayh0aGlzQ2hhciwiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIjoiKSkKLQkJCXsKLQkJCQlpZigoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpICkKLQkJCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJCQlBdG9IKHZhbHVlLCAmQWRkcltpKytdLCAxKTsKLQkJCX0KLQotCQkJaWYoaSAhPSA2KQotCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCQl9Ci0JCWVsc2UKLQkJewotCQkJZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayh0aGlzQ2hhciwiLiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIi4iKSkKLQkJCXsKLQkJCQlpZigoc3RybGVuKHZhbHVlKSA+IDApICYmIChzdHJsZW4odmFsdWUpIDw9IDMpKQotCQkJCXsKLQkJCQkJaW50IGlpOwotCQkJCQlmb3IoaWk9MDsgaWk8c3RybGVuKHZhbHVlKTsgaWkrKykKLQkJCQkJCWlmICghaXN4ZGlnaXQoKih2YWx1ZSArIGlpKSkpCi0JCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXJldHVybiBGQUxTRTsgIC8vSW52YWxpZAotCi0JCQkJSXBBZGRyW2ldID0gKFVDSEFSKXNpbXBsZV9zdHJ0b2wodmFsdWUsIE5VTEwsIDEwKTsKLQkJCQlpKys7Ci0JCQl9Ci0KLQkJCWlmKGkgIT0gNCkKLQkJCQlyZXR1cm4gRkFMU0U7ICAvL0ludmFsaWQKLQotCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhJcEFkZHIsIChQVUNIQVIgKikmcEFkZHIsIEVUSF9QX0lQKTsKLQkJfQotCi0JCWlmKGJHcm91cElkID09IDEpCi0JCQlDT1BZX01BQ19BRERSKEdyb3VwSWQsIEFkZHIpOwotCQllbHNlCi0JCQltZW1iZXJDbnQrKzsKLQotCQlpZiAobWVtYmVyQ250ID4gMCApCi0JCQlNdWx0aWNhc3RGaWx0ZXJUYWJsZURlbGV0ZUVudHJ5KHBBZCwgKFBVQ0hBUilHcm91cElkLCBBZGRyLCBwRGV2KTsKLQotCQliR3JvdXBJZCA9IDA7Ci0JfQotCi0JaWYobWVtYmVyQ250ID09IDApCi0JCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCAoUFVDSEFSKUdyb3VwSWQsIE5VTEwsIHBEZXYpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgKCUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwKLQkJX19GVU5DVElPTl9fLCBBZGRyWzBdLCBBZGRyWzFdLCBBZGRyWzJdLCBBZGRyWzNdLCBBZGRyWzRdLCBBZGRyWzVdKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9JZ21wU25fVGFiRGlzcGxheV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKQotewotCUlHTVBUYWJsZURpc3BsYXkocEFkKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotdm9pZCBydG1wX3JlYWRfaWdtcF9zbm9vcF9mcm9tX2ZpbGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCVBTVFJJTkcgdG1wYnVmLAotCVBTVFJJTkcgYnVmZmVyKQotewotCVBTVFJJTkcJCW1hY3B0cjsKLQlJTlQJCQlpPTA7Ci0KLQkvL0lnbXBTbkVuYWJsZQotCWlmKFJUTVBHZXRLZXlQYXJhbWV0ZXIoIklnbXBTbkVuYWJsZSIsIHRtcGJ1ZiwgMTI4LCBidWZmZXIsIFRSVUUpKQotCXsKLQkJZm9yIChpID0gMCwgbWFjcHRyID0gcnN0cnRvayh0bXBidWYsIjsiKTsgKG1hY3B0ciAmJiBpIDwgcEFkLT5BcENmZy5Cc3NpZE51bSk7IG1hY3B0ciA9IHJzdHJ0b2soTlVMTCwiOyIpLCBpKyspCi0JCXsKLQkJCWlmICgoc3RybmNtcChtYWNwdHIsICIwIiwgMSkgPT0gMCkpCi0JCQkJcEFkLT5BcENmZy5NQlNTSURbaV0uSWdtcFNub29wRW5hYmxlID0gRkFMU0U7Ci0JCQllbHNlIGlmICgoc3RybmNtcChtYWNwdHIsICIxIiwgMSkgPT0gMCkpCi0JCQkJcEFkLT5BcENmZy5NQlNTSURbaV0uSWdtcFNub29wRW5hYmxlID0gVFJVRTsKLQkgICAgICAgIGVsc2UKLQkJCQlwQWQtPkFwQ2ZnLk1CU1NJRFtpXS5JZ21wU25vb3BFbmFibGUgPSBGQUxTRTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUJTU0lEWyVkXS5FbmFibGU9JWRcbiIsIGksIHBBZC0+QXBDZmcuTUJTU0lEW2ldLklnbXBTbm9vcEVuYWJsZSkpOwotCSAgICB9Ci0JfQotfQotCi1ORElTX1NUQVRVUyBJZ21wUGt0SW5mb1F1ZXJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwU3JjQnVmVkEsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQsCi0JSU4gVUNIQVIgYXBpZHgsCi0JT1VUIEJPT0xFQU4gKnBJbklnbXBHcm91cCwKLQlPVVQgUE1VTFRJQ0FTVF9GSUxURVJfVEFCTEVfRU5UUlkgKnBwR3JvdXBFbnRyeSkKLXsKLQlpZihJU19NVUxUSUNBU1RfTUFDX0FERFIocFNyY0J1ZlZBKSkKLQl7Ci0JCUJPT0xFQU4gSWdtcE1sZFBrdCA9IEZBTFNFOwotCQlQVUNIQVIgcElwSGVhZGVyID0gcFNyY0J1ZlZBICsgMTI7Ci0KLQkJaWYobnRvaHMoKigoVUlOVDE2ICopKHBJcEhlYWRlcikpKSA9PSBFVEhfUF9JUFY2KQotCQkJSWdtcE1sZFBrdCA9IGlzTWxkUGt0KHBTcmNCdWZWQSwgcElwSGVhZGVyLCBOVUxMLCBOVUxMKTsKLQkJZWxzZQotCQkJSWdtcE1sZFBrdCA9IGlzSWdtcFBrdChwU3JjQnVmVkEsIHBJcEhlYWRlcik7Ci0KLQkJaWYgKElnbXBNbGRQa3QpCi0JCXsKLQkJCSpwcEdyb3VwRW50cnkgPSBOVUxMOwotCQl9Ci0JCWVsc2UgaWYgKCgqcHBHcm91cEVudHJ5ID0gTXVsdGljYXN0RmlsdGVyVGFibGVMb29rdXAocEFkLT5wTXVsdGljYXN0RmlsdGVyVGFibGUsIHBTcmNCdWZWQSwKLQkJCQkJCQkJCXBBZC0+QXBDZmcuTUJTU0lEW2FwaWR4XS5NU1NJRERldikpID09IE5VTEwpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCQl9Ci0JCSpwSW5JZ21wR3JvdXAgPSBUUlVFOwotCX0KLQllbHNlIGlmIChJU19CUk9BRENBU1RfTUFDX0FERFIocFNyY0J1ZlZBKSkKLQl7Ci0JCVBVQ0hBUiBwRHN0SXBBZGRyID0gcFNyY0J1ZlZBICsgMzA7IC8vIHBvaW50IHRvIERlc3RpbmF0aW9uIG9mIElwIGFkZHJlc3Mgb2YgSVAgaGVhZGVyLgotCQlVQ0hBUiBHcm91cE1hY0FkZHJbNl07Ci0JCVBVQ0hBUiBwR3JvdXBNYWNBZGRyID0gKFBVQ0hBUikmR3JvdXBNYWNBZGRyOwotCi0JCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocERzdElwQWRkciwgKFBVQ0hBUiAqKSZwR3JvdXBNYWNBZGRyLCBFVEhfUF9JUCk7Ci0JCWlmICgoKnBwR3JvdXBFbnRyeSA9IE11bHRpY2FzdEZpbHRlclRhYmxlTG9va3VwKHBBZC0+cE11bHRpY2FzdEZpbHRlclRhYmxlLCBwR3JvdXBNYWNBZGRyLAotCQkJCQkJCQlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uTVNTSUREZXYpKSAhPSBOVUxMKQotCQl7Ci0JCQkqcEluSWdtcEdyb3VwID0gVFJVRTsKLQkJfQotCX0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotTkRJU19TVEFUVVMgSWdtcFBrdENsb25lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCUlOIFVDSEFSIFF1ZUlkeCwKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBwR3JvdXBFbnRyeSkKLXsKLQlQTkRJU19QQUNLRVQgcFNrYkNsb25lID0gTlVMTDsKLQlQTUVNQkVSX0VOVFJZIHBNZW1iZXJFbnRyeSA9IChQTUVNQkVSX0VOVFJZKXBHcm91cEVudHJ5LT5NZW1iZXJMaXN0LnBIZWFkOwotCU1BQ19UQUJMRV9FTlRSWSAqcE1hY0VudHJ5ID0gTlVMTDsKLQlVU0hPUlQgQWlkOwotCVNTVAlTc3QgPSBTU1RfQVNTT0M7Ci0JVUNIQVIgUHNNb2RlID0gUFdSX0FDVElWRTsKLQlVQ0hBUiBSYXRlOwotCXVuc2lnbmVkIGxvbmcgSXJxRmxhZ3M7Ci0KLQkvLyBjaGVjayBhbGwgbWVtYmVycyBvZiB0aGUgSUdNUCBncm91cC4KLQl3aGlsZShwTWVtYmVyRW50cnkgIT0gTlVMTCkKLQl7Ci0JCXBNYWNFbnRyeSA9IEFQU3NQc0lucXVpcnkocEFkLCBwTWVtYmVyRW50cnktPkFkZHIsICZTc3QsICZBaWQsICZQc01vZGUsICZSYXRlKTsKLQotCQlpZiAocE1hY0VudHJ5ICYmIChTc3QgPT0gU1NUX0FTU09DKSAmJiAoUHNNb2RlICE9IFBXUl9TQVZFKSkKLQkJewotCQlwU2tiQ2xvbmUgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYocFNrYkNsb25lKQotCQl7Ci0JCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFNrYkNsb25lLCAoVUNIQVIpQWlkKTsKLQkJCQkvLyBQa3QgdHlwZSBtdXN0IHNldCB0byBQS1RTUkNfTkRJUy4KLQkJCQkvLyBJdCBjYXVzZSBvZiB0aGUgZGVhc29uIHRoYXQgQVBIYXJkVHJhbnNtaXQoKQotCQkJCS8vIGRvZXNuJ3QgaGFuZGxlIFBLVFNSQ19EUklWRVIgcGt0IHR5cGUgaW4gdmVyc2lvbiAxLjMuMC4wLgotCQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFNrYkNsb25lLCBQS1RTUkNfTkRJUyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcE1lbWJlckVudHJ5ID0gcE1lbWJlckVudHJ5LT5wTmV4dDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gaW5zZXJ0IHRoZSBwa3QgdG8gVHhTd1F1ZXVlLgotCQkJaWYgKHBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0uTnVtYmVyID49IE1BWF9QQUNLRVRTX0lOX1FVRVVFKQotCQkJewotI2lmZGVmIEJMT0NLX05FVF9JRgotCQkJCVN0b3BOZXRJZlF1ZXVlKHBBZCwgUXVlSWR4LCBwU2tiQ2xvbmUpOwotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwU2tiQ2xvbmUsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCVJUTVBfSVJRX0xPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCQlJbnNlcnRUYWlsUXVldWVBYyhwQWQsIHBNYWNFbnRyeSwgJnBBZC0+VHhTd1F1ZXVlW1F1ZUlkeF0sIFBBQ0tFVF9UT19RVUVVRV9FTlRSWShwU2tiQ2xvbmUpKTsKLQkJCQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQkJCX0KLQkJfQotCQlwTWVtYmVyRW50cnkgPSBwTWVtYmVyRW50cnktPnBOZXh0OwotCX0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGlubGluZSBCT09MRUFOIGlzTWxkTWFjQWRkcigKLQlJTiBQVUNIQVIgcE1hY0FkZHIpCi17Ci0JcmV0dXJuICgocE1hY0FkZHJbMF0gPT0gMHgzMykgJiYgKHBNYWNBZGRyWzFdID09IDB4MzMpKSA/IFRSVUUgOiBGQUxTRTsKLX0KLQotc3RhdGljIGlubGluZSBCT09MRUFOIElzU3VwcG9ydGVkTWxkTXNnKAotCUlOIFVJTlQ4IE1zZ1R5cGUpCi17Ci0JQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlzd2l0Y2goTXNnVHlwZSkKLQl7Ci0JCWNhc2UgTUxEX1YxX0xJU1RFTkVSX1JFUE9SVDoKLQkJY2FzZSBNTERfVjFfTElTVEVORVJfRE9ORToKLQkJY2FzZSBNTERfVjJfTElTVEVSTkVSX1JFUE9SVDoKLQkJCXJlc3VsdCA9IFRSVUU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJlc3VsdCA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotQk9PTEVBTiBpc01sZFBrdCgKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBJcEhlYWRlciwKLQlPVVQgVUlOVDggKnBQcm90b1R5cGUsCi0JT1VUIFBVQ0hBUiAqcE1sZEhlYWRlcikKLXsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVVJTlQxNiBJcFByb3RvY29sID0gbnRvaHMoKigoVUlOVDE2ICopKHBJcEhlYWRlcikpKTsKLQotCWlmKCFpc01sZE1hY0FkZHIocERzdE1hY0FkZHIpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZihJcFByb3RvY29sICE9IEVUSF9QX0lQVjYpCi0JCXJldHVybiBGQUxTRTsKLQotCS8vIHNraXAgcHJvdG9jb2wgKDIgQnl0ZXMpLgotCXBJcEhlYWRlciArPSAyOwotCWRvCi0JewotCQlQUlRfSVBWNl9IRFIgcElwdjZIZHIgPSAoUFJUX0lQVjZfSERSKShwSXBIZWFkZXIpOwotCQlVSU5UOCBuZXh0UHJvdG9jb2wgPSBwSXB2Nkhkci0+bmV4dEhkcjsKLQkJVUlOVDMyIG9mZnNldCA9IElQVjZfSERSX0xFTjsKLQotCQl3aGlsZShuZXh0UHJvdG9jb2wgIT0gSVBWNl9ORVhUX0hFQURFUl9JQ01QVjYpCi0JCXsKLQkJCWlmKElQdjZFeHRIZHJIYW5kbGUoKFJUX0lQVjZfRVhUX0hEUiAqKShwSXBIZWFkZXIgKyBvZmZzZXQpLCAmbmV4dFByb3RvY29sLCAmb2Zmc2V0KSA9PSBGQUxTRSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmKG5leHRQcm90b2NvbCA9PSBJUFY2X05FWFRfSEVBREVSX0lDTVBWNikKLQkJewotCQkJUFJUX0lDTVBWNl9IRFIgcElDTVB2NkhkciA9IChQUlRfSUNNUFY2X0hEUikocElwSGVhZGVyICsgb2Zmc2V0KTsKLQkJCWlmIChJc1N1cHBvcnRlZE1sZE1zZyhwSUNNUHY2SGRyLT50eXBlKSA9PSBUUlVFKQotCQkJewotCQkJCWlmIChwUHJvdG9UeXBlICE9IE5VTEwpCi0JCQkJCSpwUHJvdG9UeXBlID0gcElDTVB2Nkhkci0+dHlwZTsKLQkJCQlpZiAocE1sZEhlYWRlciAhPSBOVUxMKQotCQkJCQkqcE1sZEhlYWRlciA9IChQVUNIQVIpcElDTVB2NkhkcjsKLQkJCQlyZXN1bHQgPSBUUlVFOwotCQkJfQotCQl9Ci0JfXdoaWxlKEZBTFNFKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qICBNTEQgdjEgbWVzc2FnZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLQkwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0JMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICAgICBUeXBlICAgICAgfCAgICAgQ29kZSAgICAgIHwgICAgICAgICAgQ2hlY2tzdW0gICAgICAgICAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgICAgTWF4aW11bSBSZXNwb25zZSBEZWxheSAgICB8ICAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSsgICAgICAgICAgICAgICAgICAgICAgIE11bHRpY2FzdCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICArCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi0KLS8qCVZlcnNpb24gMyBNZW1iZXJzaGlwIFJlcG9ydCBNZXNzYWdlCi0JMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotCTAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0JfCAgVHlwZSA9IDE0MyAgIHwgICAgUmVzZXJ2ZWQgICB8ICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgfCAgTnVtYmVyIG9mIEdyb3VwIFJlY29yZHMgKE0pICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JLiAgICAgICAgICAgICAgIE11bHRpY2FzdCBBZGRyZXNzIFJlY29yZCBbMV0gICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JLiAgICAgICAgICAgICAgIE11bHRpY2FzdCBBZGRyZXNzIFJlY29yZCBbMl0gICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLQkuICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgUmVjb3JkIFtNXSAgICAgICAgICAgICAgICAgICAgLgotCS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0JfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotCi0KLQl3aGVyZSBlYWNoIEdyb3VwIFJlY29yZCBoYXMgdGhlIGZvbGxvd2luZyBpbnRlcm5hbCBmb3JtYXQ6Ci0JKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLQl8ICBSZWNvcmQgVHlwZSAgfCAgQXV4IERhdGEgTGVuIHwgICAgIE51bWJlciBvZiBTb3VyY2VzIChOKSAgICAgfAotCSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgTXVsdGljYXN0IEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLQkrLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzIFsxXSAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQWRkcmVzcyBbMl0gICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICstICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0rCi0gICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAgKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSsKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2UgQWRkcmVzcyBbTl0gICAgICAgICAgICAgICAgICAgICAgKgotICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgQXV4aWxpYXJ5IERhdGEgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0qLwotCi1WT0lEIE1MRFNub29waW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcFNyY01hY0FkZHIsCi0JSU4gUFVDSEFSIHBJcEhlYWRlciwKLQlJTiBQTkVUX0RFViBwRGV2KQotewotCUlOVCBpOwotCVVDSEFSIEdyb3VwVHlwZTsKLQlVSU5UMTYgbnVtT2ZHcm91cDsKLQlQVUNIQVIgcEdyb3VwOwotCVVDSEFSIEF1eERhdGFMZW47Ci0JVUlOVDE2IG51bU9mU291cmNlczsKLQlQVUNIQVIgcEdyb3VwSXBBZGRyOwotCVVDSEFSIEdyb3VwTWFjQWRkcls2XTsKLQlQVUNIQVIgcEdyb3VwTWFjQWRkciA9IChQVUNIQVIpJkdyb3VwTWFjQWRkcjsKLQotCVVJTlQ4IE1sZFR5cGU7Ci0JUFVDSEFSIHBNbGRIZWFkZXI7Ci0KLQlpZihpc01sZFBrdChwRHN0TWFjQWRkciwgcElwSGVhZGVyLCAmTWxkVHlwZSwgJnBNbGRIZWFkZXIpID09IFRSVUUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTEQgdHlwZT0lMHhcbiIsIE1sZFR5cGUpKTsKLQotCQlzd2l0Y2goTWxkVHlwZSkKLQkJewotCQkJY2FzZSBNTERfVjFfTElTVEVORVJfUkVQT1JUOgotCQkJCS8vIHNraXAgVHlwZSgxIEJ5dGUpLCBjb2RlKDEgQnl0ZSksIGNoZWNrc3VtKDIgQnl0ZXMpLCBNYXhpbXVtIFJzcCBEZWxheSgyIEJ5dGVzKSwgUmVzZXJ2ZSgyIEJ5dGVzKS4KLQkJCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwTWxkSGVhZGVyICsgOCk7Ci0JCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwR3JvdXBJcEFkZHIsIChQVUNIQVIgKikmcEdyb3VwTWFjQWRkciwgRVRIX1BfSVBWNik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR3JvdXAgSWQ9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0JCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYsIE1DQVRfRklMVEVSX0RZTkFNSUMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIE1MRF9WMV9MSVNURU5FUl9ET05FOgotCQkJCS8vIHNraXAgVHlwZSgxIEJ5dGUpLCBjb2RlKDEgQnl0ZSksIGNoZWNrc3VtKDIgQnl0ZXMpLCBNYXhpbXVtIFJzcCBEZWxheSgyIEJ5dGVzKSwgUmVzZXJ2ZSgyIEJ5dGVzKS4KLQkJCQlwR3JvdXBJcEFkZHIgPSAoUFVDSEFSKShwTWxkSGVhZGVyICsgOCk7Ci0JCQkJQ29udmVydE11bHRpY2FzdElQMk1BQyhwR3JvdXBJcEFkZHIsIChQVUNIQVIgKikmcEdyb3VwTWFjQWRkciwgRVRIX1BfSVBWNik7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiR3JvdXAgSWQ9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQlHcm91cE1hY0FkZHJbMF0sIEdyb3VwTWFjQWRkclsxXSwgR3JvdXBNYWNBZGRyWzJdLCBHcm91cE1hY0FkZHJbM10sIEdyb3VwTWFjQWRkcls0XSwgR3JvdXBNYWNBZGRyWzVdKSk7Ci0JCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIE1MRF9WMl9MSVNURVJORVJfUkVQT1JUOiAvLyBJR01QIHZlcnNpb24gMyBtZW1iZXJzaGlwIHJlcG9ydC4KLQkJCQludW1PZkdyb3VwID0gbnRvaHMoKigoVUlOVDE2ICopKHBNbGRIZWFkZXIgKyA2KSkpOwotCQkJCXBHcm91cCA9IChQVUNIQVIpKHBNbGRIZWFkZXIgKyA4KTsKLQkJCQlmb3IgKGk9MDsgaSA8IG51bU9mR3JvdXA7IGkrKykKLQkJCQl7Ci0JCQkJCUdyb3VwVHlwZSA9IChVQ0hBUikoKnBHcm91cCk7Ci0JCQkJCUF1eERhdGFMZW4gPSAoVUNIQVIpKCoocEdyb3VwICsgMSkpOwotCQkJCQludW1PZlNvdXJjZXMgPSBudG9ocygqKChVSU5UMTYgKikocEdyb3VwICsgMikpKTsKLQkJCQkJcEdyb3VwSXBBZGRyID0gKFBVQ0hBUikocEdyb3VwICsgNCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1MRHYyIFR5cGU9JWQsIEFETD0lZCwgbnVtT2ZTb3VyY2U9JWRcbiIsIEdyb3VwVHlwZSwgQXV4RGF0YUxlbiwgbnVtT2ZTb3VyY2VzKSk7Ci0JCQkJCUNvbnZlcnRNdWx0aWNhc3RJUDJNQUMocEdyb3VwSXBBZGRyLCAoUFVDSEFSICopJnBHcm91cE1hY0FkZHIsIEVUSF9QX0lQVjYpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTEQgR3JvdXA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQkJR3JvdXBNYWNBZGRyWzBdLCBHcm91cE1hY0FkZHJbMV0sIEdyb3VwTWFjQWRkclsyXSwgR3JvdXBNYWNBZGRyWzNdLCBHcm91cE1hY0FkZHJbNF0sIEdyb3VwTWFjQWRkcls1XSkpOwotCi0JCQkJCWRvCi0JCQkJCXsKLQkJCQkJCWlmKChHcm91cFR5cGUgPT0gTU9ERV9JU19FWENMVURFKSB8fCAoR3JvdXBUeXBlID09IENIQU5HRV9UT19FWENMVURFX01PREUpIHx8IChHcm91cFR5cGUgPT0gQUxMT1dfTkVXX1NPVVJDRVMpKQotCQkJCQkJewotCQkJCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlSW5zZXJ0RW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2LCBNQ0FUX0ZJTFRFUl9EWU5BTUlDKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQotCQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBNT0RFX0lTX0lOQ0xVREUpIHx8IChHcm91cFR5cGUgPT0gQkxPQ0tfT0xEX1NPVVJDRVMpKQotCQkJCQkJewotCQkJCQkJCU11bHRpY2FzdEZpbHRlclRhYmxlRGVsZXRlRW50cnkocEFkLCBHcm91cE1hY0FkZHIsIHBTcmNNYWNBZGRyLCBwRGV2KTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQotCQkJCQkJaWYoKEdyb3VwVHlwZSA9PSBDSEFOR0VfVE9fSU5DTFVERV9NT0RFKSkKLQkJCQkJCXsKLQkJCQkJCQlpZihudW1PZlNvdXJjZXMgPT0gMCkKLQkJCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJTXVsdGljYXN0RmlsdGVyVGFibGVJbnNlcnRFbnRyeShwQWQsIEdyb3VwTWFjQWRkciwgcFNyY01hY0FkZHIsIHBEZXYsIE1DQVRfRklMVEVSX0RZTkFNSUMpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IHdoaWxlKEZBTFNFKTsKLQkJCQkJLy8gc2tpcCA0IEJ5dGVzIChSZWNvcmQgVHlwZSwgQXV4IERhdGEgTGVuLCBOdW1iZXIgb2YgU291cmNlcykgKyBhIElQdjYgYWRkcmVzcy4KLQkJCQkJcEdyb3VwICs9ICg0ICsgSVBWNl9BRERSX0xFTiArIChudW1PZlNvdXJjZXMgKiAxNikgKyBBdXhEYXRhTGVuKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgidW5rbm93IE1MRCBUeXBlPSVkXG4iLCBNbGRUeXBlKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLQotI2VuZGlmIC8vIElHTVBfU05PT1BfU1VQUE9SVCAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vbWxtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjEzYzA0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL21sbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDY1NTAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQltbG1lLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDQtMDgtMjUJCU1vZGlmeSBmcm9tIFJUMjUwMCBjb2RlIGJhc2UKLQlKb2huIENoYW5nCTIwMDQtMDktMDYJCW1vZGlmaWVkIGZvciBSVDI2MDAKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotVUNIQVIJQ0lTQ09fT1VJW10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07Ci0KLVVDSEFSCVdQQV9PVUlbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAxfTsKLVVDSEFSCVJTTl9PVUlbXSA9IHsweDAwLCAweDBmLCAweGFjfTsKLVVDSEFSCVdBUElfT1VJW10gPSB7MHgwMCwgMHgxNCwgMHg3Mn07Ci1VQ0hBUiAgIFdNRV9JTkZPX0VMRU1bXSAgPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMX07Ci1VQ0hBUiAgIFdNRV9QQVJNX0VMRU1bXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKLVVDSEFSCUNjeDJRb3NJbmZvW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwNH07Ci1VQ0hBUiAgIFJBTElOS19PVUlbXSAgPSB7MHgwMCwgMHgwYywgMHg0M307Ci1VQ0hBUiAgIEJST0FEQ09NX09VSVtdICA9IHsweDAwLCAweDkwLCAweDRjfTsKLVVDSEFSICAgV1BTX09VSVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVUNIQVIJUFJFX05fSFRfT1VJW10JPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZVtdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MTEsIDB4MDAsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLSAgICAweDA0LCAweDIxLCAgMCwgMzAsIDUwLAotICAgIDB4MDUsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwNiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDA3LCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDgsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwOSwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDBhLCAweDIxLCAgNiwgIDgsIDI1LAotICAgIDB4MGIsIDB4MjEsICA3LCAgOCwgMjUsCi0gICAgMHgwYywgMHgyMCwgMTIsICAxNSwgMzAsCi0gICAgMHgwZCwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDBlLCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MGYsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgxMCwgMHgyMiwgMTUsICA4LCAyNSwKLSAgICAweDExLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTIsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxMywgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE0LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTUsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxNiwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDE3LCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MTgsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxOSwgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFhLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWIsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxYywgMHgwMCwgIDAsICAwLCAgMCwKLSAgICAweDFkLCAweDAwLCAgMCwgIDAsICAwLAotICAgIDB4MWUsIDB4MDAsICAwLCAgMCwgIDAsCi0gICAgMHgxZiwgMHgwMCwgIDAsICAwLCAgMCwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQltdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MDQsIDB4MDMsICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDAwLCAgMCwgNDAsIDEwMSwKLSAgICAweDAxLCAweDAwLCAgMSwgNDAsIDUwLAotICAgIDB4MDIsIDB4MDAsICAyLCAzNSwgNDUsCi0gICAgMHgwMywgMHgwMCwgIDMsIDIwLCA0NSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBhLCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMzUsIDQ1LAotICAgIDB4MDMsIDB4MDAsICAzLCAyMCwgNDUsCi0gICAgMHgwNCwgMHgxMCwgIDIsIDIwLCAzNSwKLSAgICAweDA1LCAweDEwLCAgMywgMTYsIDM1LAotICAgIDB4MDYsIDB4MTAsICA0LCAxMCwgMjUsCi0gICAgMHgwNywgMHgxMCwgIDUsIDE2LCAyNSwKLSAgICAweDA4LCAweDEwLCAgNiwgMTAsIDI1LAotICAgIDB4MDksIDB4MTAsICA3LCAxMCwgMTMsCi19OwotCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUdbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDA4LCAweDAwLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgxMCwgIDAsIDIwLCAxMDEsCi0gICAgMHgwMSwgMHgxMCwgIDEsIDIwLCAzNSwKLSAgICAweDAyLCAweDEwLCAgMiwgMjAsIDM1LAotICAgIDB4MDMsIDB4MTAsICAzLCAxNiwgMzUsCi0gICAgMHgwNCwgMHgxMCwgIDQsIDEwLCAyNSwKLSAgICAweDA1LCAweDEwLCAgNSwgMTYsIDI1LAotICAgIDB4MDYsIDB4MTAsICA2LCAxMCwgMjUsCi0gICAgMHgwNywgMHgxMCwgIDcsIDEwLCAxMywKLX07Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjFTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYywgMHgwYSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDI1LCA0NSwKLSAgICAweDAzLCAweDIxLCAgMCwgMjAsIDM1LAotICAgIDB4MDQsIDB4MjEsICAxLCAyMCwgMzUsCi0gICAgMHgwNSwgMHgyMSwgIDIsIDIwLCAzNSwKLSAgICAweDA2LCAweDIxLCAgMywgMTUsIDM1LAotICAgIDB4MDcsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwOCwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDA5LCAweDIxLCAgNiwgIDgsIDE0LAotICAgIDB4MGEsIDB4MjEsICA3LCAgOCwgMTQsCi0gICAgMHgwYiwgMHgyMywgIDcsICA4LCAxNCwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExTjJTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwZSwgMHgwYywgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDI1LCA0NSwKLSAgICAweDAzLCAweDIxLCAgMCwgMjAsIDM1LAotICAgIDB4MDQsIDB4MjEsICAxLCAyMCwgMzUsCi0gICAgMHgwNSwgMHgyMSwgIDIsIDIwLCAzNSwKLSAgICAweDA2LCAweDIxLCAgMywgMTUsIDM1LAotICAgIDB4MDcsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwOCwgMHgyMCwgMTEsIDE1LCAzMCwKLSAgICAweDA5LCAweDIwLCAxMiwgMTUsIDMwLAotICAgIDB4MGEsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwYiwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDBjLCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGQsIDB4MjIsIDE1LCAgOCwgMTUsCi19OwotCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4zU1tdID0gewotLy8gSXRlbSBOby4JTW9kZQlDdXJyLU1DUwlUcmFpblVwCVRyYWluRG93bgkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGIsIDB4MDAsICAwLCAgMCwgIDAsCS8vIDB4MGEsIDB4MDAsICAwLCAgMCwgIDAsICAgICAgLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsIDEwMSwKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDE1LCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDMwLAotICAgIDB4MDUsIDB4MjAsIDExLCAxNSwgMzAsCS8vIFJlcXVpcmVkIGJ5IFN5c3RlbS1BbGFuIEAgMjAwODA4MTIKLSAgICAweDA2LCAweDIwLCAxMiwgMTUsIDMwLAkvLyAweDA1LCAweDIwLCAxMiwgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCS8vIDB4MDYsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwJLy8gMHgwNywgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAkvLyAweDA4LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCS8vIDB4MDksIDB4MjIsIDE1LCAgOCwgMjUsCi19OwotCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYiwgMHgwOSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwgMTAxLAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIwLCAxMiwgIDE1LCAzMCwKLSAgICAweDA3LCAweDIwLCAxMywgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDE0LCAgOCwgMjAsCi0gICAgMHgwOSwgMHgyMCwgMTUsICA4LCAyNSwKLSAgICAweDBhLCAweDIyLCAxNSwgIDgsIDI1LAotfTsKLQotVUNIQVIgUmF0ZVN3aXRjaFRhYmxlMTFOM1NGb3JBQmFuZFtdID0geyAvLyAzKjMKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBiLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLCAxMDEsCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEyLCAgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDEzLCAgOCwgMjAsCi0gICAgMHgwOCwgMHgyMCwgMTQsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAxNSwgIDgsIDI1LAotICAgIDB4MGEsIDB4MjIsIDE1LCAgOCwgMjUsCi19OwotCi1VQ0hBUiBSYXRlU3dpdGNoVGFibGUxMUJHTjFTW10gPSB7Ci0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYywgMHgwYSwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MDAsICAwLCA0MCwgMTAxLAotICAgIDB4MDEsIDB4MDAsICAxLCA0MCwgNTAsCi0gICAgMHgwMiwgMHgwMCwgIDIsIDI1LCA0NSwKLSAgICAweDAzLCAweDIxLCAgMCwgMjAsIDM1LAotICAgIDB4MDQsIDB4MjEsICAxLCAyMCwgMzUsCi0gICAgMHgwNSwgMHgyMSwgIDIsIDIwLCAzNSwKLSAgICAweDA2LCAweDIxLCAgMywgMTUsIDM1LAotICAgIDB4MDcsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwOCwgMHgyMSwgIDUsIDEwLCAyNSwKLSAgICAweDA5LCAweDIxLCAgNiwgIDgsIDE0LAotICAgIDB4MGEsIDB4MjEsICA3LCAgOCwgMTQsCi0gICAgMHgwYiwgMHgyMywgIDcsICA4LCAxNCwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbXSA9IHsKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBlLCAweDBjLCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgwMCwgIDAsIDQwLCAxMDEsCi0gICAgMHgwMSwgMHgwMCwgIDEsIDQwLCA1MCwKLSAgICAweDAyLCAweDAwLCAgMiwgMjUsIDQ1LAotICAgIDB4MDMsIDB4MjEsICAwLCAyMCwgMzUsCi0gICAgMHgwNCwgMHgyMSwgIDEsIDIwLCAzNSwKLSAgICAweDA1LCAweDIxLCAgMiwgMjAsIDM1LAotICAgIDB4MDYsIDB4MjEsICAzLCAxNSwgMzUsCi0gICAgMHgwNywgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA4LCAweDIwLCAxMSwgMTUsIDMwLAotICAgIDB4MDksIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwYSwgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDBiLCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MGMsIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwZCwgMHgyMiwgMTUsICA4LCAxNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NbXSA9IHsgLy8gMyozCi0vLyBJdGVtIE5vLiAgIE1vZGUgICBDdXJyLU1DUyAgIFRyYWluVXAgICBUcmFpbkRvd24JCS8vIE1vZGUtIEJpdDA6IFNUQkMsIEJpdDE6IFNob3J0IEdJLCBCaXQ0LDU6IE1vZGUoMDpDQ0ssIDE6T0ZETSwgMjpIVCBNaXgsIDM6SFQgR0YpCi0gICAgMHgwYSwgMHgwMCwgIDAsICAwLCAgMCwJCQkJCQkvLyBJbml0aWFsIHVzZWQgaXRlbSBhZnRlciBhc3NvY2lhdGlvbgotICAgIDB4MDAsIDB4MjEsICAwLCAzMCwxMDEsCS8vNTAKLSAgICAweDAxLCAweDIxLCAgMSwgMjAsIDUwLAotICAgIDB4MDIsIDB4MjEsICAyLCAyMCwgNTAsCi0gICAgMHgwMywgMHgyMSwgIDMsIDIwLCA1MCwKLSAgICAweDA0LCAweDIxLCAgNCwgMTUsIDUwLAotICAgIDB4MDUsIDB4MjAsIDIwLCAxNSwgMzAsCi0gICAgMHgwNiwgMHgyMCwgMjEsICA4LCAyMCwKLSAgICAweDA3LCAweDIwLCAyMiwgIDgsIDIwLAotICAgIDB4MDgsIDB4MjAsIDIzLCAgOCwgMjUsCi0gICAgMHgwOSwgMHgyMiwgMjMsICA4LCAyNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFtdID0gewotLy8gSXRlbSBOby4gICBNb2RlICAgQ3Vyci1NQ1MgICBUcmFpblVwICAgVHJhaW5Eb3duCQkvLyBNb2RlLSBCaXQwOiBTVEJDLCBCaXQxOiBTaG9ydCBHSSwgQml0NCw1OiBNb2RlKDA6Q0NLLCAxOk9GRE0sIDI6SFQgTWl4LCAzOkhUIEdGKQotICAgIDB4MGIsIDB4MDksICAwLCAgMCwgIDAsCQkJCQkJLy8gSW5pdGlhbCB1c2VkIGl0ZW0gYWZ0ZXIgYXNzb2NpYXRpb24KLSAgICAweDAwLCAweDIxLCAgMCwgMzAsMTAxLAkvLzUwCi0gICAgMHgwMSwgMHgyMSwgIDEsIDIwLCA1MCwKLSAgICAweDAyLCAweDIxLCAgMiwgMjAsIDUwLAotICAgIDB4MDMsIDB4MjEsICAzLCAxNSwgNTAsCi0gICAgMHgwNCwgMHgyMSwgIDQsIDE1LCAzMCwKLSAgICAweDA1LCAweDIxLCAgNSwgMTUsIDMwLAotICAgIDB4MDYsIDB4MjAsIDEyLCAxNSwgMzAsCi0gICAgMHgwNywgMHgyMCwgMTMsICA4LCAyMCwKLSAgICAweDA4LCAweDIwLCAxNCwgIDgsIDIwLAotICAgIDB4MDksIDB4MjAsIDE1LCAgOCwgMjUsCi0gICAgMHgwYSwgMHgyMiwgMTUsICA4LCAyNSwKLX07Ci0KLVVDSEFSIFJhdGVTd2l0Y2hUYWJsZTExQkdOM1NGb3JBQmFuZFtdID0geyAvLyAzKjMKLS8vIEl0ZW0gTm8uICAgTW9kZSAgIEN1cnItTUNTICAgVHJhaW5VcCAgIFRyYWluRG93bgkJLy8gTW9kZS0gQml0MDogU1RCQywgQml0MTogU2hvcnQgR0ksIEJpdDQsNTogTW9kZSgwOkNDSywgMTpPRkRNLCAyOkhUIE1peCwgMzpIVCBHRikKLSAgICAweDBjLCAweDA5LCAgMCwgIDAsICAwLAkJCQkJCS8vIEluaXRpYWwgdXNlZCBpdGVtIGFmdGVyIGFzc29jaWF0aW9uCi0gICAgMHgwMCwgMHgyMSwgIDAsIDMwLDEwMSwJLy81MAotICAgIDB4MDEsIDB4MjEsICAxLCAyMCwgNTAsCi0gICAgMHgwMiwgMHgyMSwgIDIsIDIwLCA1MCwKLSAgICAweDAzLCAweDIxLCAgMywgMTUsIDUwLAotICAgIDB4MDQsIDB4MjEsICA0LCAxNSwgMzAsCi0gICAgMHgwNSwgMHgyMSwgIDUsIDE1LCAzMCwKLSAgICAweDA2LCAweDIxLCAxMiwgMTUsIDMwLAotICAgIDB4MDcsIDB4MjAsIDIwLCAxNSwgMzAsCi0gICAgMHgwOCwgMHgyMCwgMjEsICA4LCAyMCwKLSAgICAweDA5LCAweDIwLCAyMiwgIDgsIDIwLAotICAgIDB4MGEsIDB4MjAsIDIzLCAgOCwgMjUsCi0gICAgMHgwYiwgMHgyMiwgMjMsICA4LCAyNSwKLX07Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOwotLy8gc2luY2UgUlQ2MSBoYXMgYmV0dGVyIFJYIHNlbnNpYmlsaXR5LCB3ZSBoYXZlIHRvIGxpbWl0IFRYIEFDSyByYXRlIG5vdCB0byBleGNlZWQgb3VyIG5vcm1hbCBkYXRhIFRYIHJhdGUuCi0vLyBvdGhlcndpc2UgdGhlIFdMQU4gcGVlciBtYXkgbm90IGJlIGFibGUgdG8gcmVjZWl2ZSB0aGUgQUNLIHRodXMgZG93bmdyYWRlIGl0cyBkYXRhIFRYIHJhdGUKLVVMT05HIEJhc2ljUmF0ZU1hc2tbMTJdCQkJCT0gezB4ZmZmZmYwMDEgLyogMS1NYnBzICovLCAweGZmZmZmMDAzIC8qIDIgTWJwcyAqLywgMHhmZmZmZjAwNyAvKiA1LjUgKi8sIDB4ZmZmZmYwMGYgLyogMTEgKi8sCi0JCQkJCQkJCQkgIDB4ZmZmZmYwMWYgLyogNiAqLwkgLCAweGZmZmZmMDNmIC8qIDkgKi8JICAsIDB4ZmZmZmYwN2YgLyogMTIgKi8gLCAweGZmZmZmMGZmIC8qIDE4ICovLAotCQkJCQkJCQkJICAweGZmZmZmMWZmIC8qIDI0ICovCSAsIDB4ZmZmZmYzZmYgLyogMzYgKi8JICAsIDB4ZmZmZmY3ZmYgLyogNDggKi8gLCAweGZmZmZmZmZmIC8qIDU0ICovfTsKLQotVUNIQVIgQlJPQURDQVNUX0FERFJbTUFDX0FERFJfTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLVVDSEFSIFpFUk9fTUFDX0FERFJbTUFDX0FERFJfTEVOXSAgPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLS8vIGUuZy4gUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtSQVRFXzM2XSIgbWVhbnMgaWYgdGhlIGN1cnJlbnQgUlNTSSBpcyBncmVhdGVyIHRoYW4KLS8vCQl0aGlzIHZhbHVlLCB0aGVuIGl0J3MgcXVhcmFudGVlZCBjYXBhYmxlIG9mIG9wZXJhdGluZyBpbiAzNiBtYnBzIFRYIHJhdGUgaW4KLS8vCQljbGVhbiBlbnZpcm9ubWVudC4KLS8vCQkJCQkJCQkgIFR4UmF0ZTogMSAgIDIgICA1LjUJMTEJIDYJICA5ICAgIDEyCTE4CSAyNCAgIDM2ICAgNDgJNTQJIDcyICAxMDAKLUNIQVIgUnNzaVNhZmVMZXZlbEZvclR4UmF0ZVtdID17ICAtOTIsIC05MSwgLTkwLCAtODcsIC04OCwgLTg2LCAtODUsIC04MywgLTgxLCAtNzgsIC03MiwgLTcxLCAtNDAsIC00MCB9OwotCi1VQ0hBUiAgUmF0ZUlkVG9NYnBzW10JID0geyAxLCAyLCA1LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCwgNzIsIDEwMH07Ci1VU0hPUlQgUmF0ZUlkVG81MDBLYnBzW10gPSB7IDIsIDQsIDExLCAyMiwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA3MiwgOTYsIDEwOCwgMTQ0LCAyMDB9OwotCi1VQ0hBUiAgU3NpZEllCSA9IElFX1NTSUQ7Ci1VQ0hBUiAgU3VwUmF0ZUllID0gSUVfU1VQUF9SQVRFUzsKLVVDSEFSICBFeHRSYXRlSWUgPSBJRV9FWFRfU1VQUF9SQVRFUzsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVVDSEFSICBIdENhcEllID0gSUVfSFRfQ0FQOwotVUNIQVIgIEFkZEh0SW5mb0llID0gSUVfQUREX0hUOwotVUNIQVIgIE5ld0V4dENoYW5JZSA9IElFX1NFQ09OREFSWV9DSF9PRkZTRVQ7Ci0jaWZkZWYgRE9UMTFOX0RSQUZUMwotVUNIQVIgIEV4dEh0Q2FwSWUgPSBJRV9FWFRfQ0FQQUJJTElUWTsKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi1VQ0hBUiAgRXJwSWUJID0gSUVfRVJQOwotVUNIQVIgIERzSWUJID0gSUVfRFNfUEFSTTsKLVVDSEFSICBUaW1JZQkgPSBJRV9USU07Ci1VQ0hBUiAgV3BhSWUJID0gSUVfV1BBOwotVUNIQVIgIFdwYTJJZQkgPSBJRV9XUEEyOwotVUNIQVIgIElic3NJZQkgPSBJRV9JQlNTX1BBUk07Ci1VQ0hBUiAgQ2N4MkllCSA9IElFX0NDWF9WMjsKLVVDSEFSICBXYXBpSWUJID0gSUVfV0FQSTsKLQotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKLQotVUNIQVIJU0VTX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OwotCi1VQ0hBUglaZXJvU3NpZFszMl0gPSB7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLQkweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfTsKLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCWluaXRpYWxpemUgdGhlIE1MTUUgdGFzayBhbmQgaXRzIGRhdGEgc3RydWN0dXJlIChxdWV1ZSwgc3BpbmxvY2ssCi0JCXRpbWVyLCBzdGF0ZSBtYWNoaW5lcykuCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JUmV0dXJuOgotCQlhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgTWxtZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTkRJU19TVEFUVVMgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBNTE1FIEluaXRpYWxpemVcbiIpKTsKLQotCWRvCi0JewotCQlTdGF0dXMgPSBNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOwotCQlpZihTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCWJyZWFrOwotCi0JCXBBZC0+TWxtZS5iUnVubmluZyA9IEZBTFNFOwotCQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlCc3NUYWJsZUluaXQoJnBBZC0+U2NhblRhYik7Ci0KLQkJCS8vIGluaXQgU1RBIHN0YXRlIG1hY2hpbmVzCi0JCQlBc3NvY1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgcEFkLT5NbG1lLkFzc29jRnVuYyk7Ci0JCQlBdXRoU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoRnVuYyk7Ci0JCQlBdXRoUnNwU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIHBBZC0+TWxtZS5BdXRoUnNwRnVuYyk7Ci0JCQlTeW5jU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIHBBZC0+TWxtZS5TeW5jRnVuYyk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCURsc1N0YXRlTWFjaGluZUluaXQocEFkLCAmcEFkLT5NbG1lLkRsc01hY2hpbmUsIHBBZC0+TWxtZS5EbHNGdW5jKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCi0KLQkJCS8vIFNpbmNlIHdlIGFyZSB1c2luZyBzd2l0Y2gvY2FzZSB0byBpbXBsZW1lbnQgaXQsIHRoZSBpbml0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhYm92ZQotCQkJLy8gc3RhdGUgbWFjaGluZSBpbml0Ci0JCQlNbG1lQ250bEluaXQocEFkLCAmcEFkLT5NbG1lLkNudGxNYWNoaW5lLCBOVUxMKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQkJV3BhU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuV3BhTWFjaGluZSwgcEFkLT5NbG1lLldwYUZ1bmMpOwotCi0KLQkJQWN0aW9uU3RhdGVNYWNoaW5lSW5pdChwQWQsICZwQWQtPk1sbWUuQWN0TWFjaGluZSwgcEFkLT5NbG1lLkFjdEZ1bmMpOwotCi0JCS8vIEluaXQgbWxtZSBwZXJpb2RpYyB0aW1lcgotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTWxtZVBlcmlvZGljRXhlYyksIHBBZCwgVFJVRSk7Ci0KLQkJLy8gU2V0IG1sbWUgcGVyaW9kaWMgdGltZXIKLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUGVyaW9kaWNUaW1lciwgTUxNRV9UQVNLX0VYRUNfSU5UVik7Ci0KLQkJLy8gc29mdHdhcmUtYmFzZWQgUlggQW50ZW5uYSBkaXZlcnNpdHkKLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihBc2ljUnhBbnRFdmFsVGltZW91dCksIHBBZCwgRkFMU0UpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJCXsKLQkJCSAgICAvLyBvbmx5IFBDSWUgY2FyZHMgbmVlZCB0aGVzZSB0d28gdGltZXJzCi0JCQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWUuUHNQb2xsVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihQc1BvbGxXYWtlRXhlYyksIHBBZCwgRkFMU0UpOwotCQkJCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lLlJhZGlvT25PZmZUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFJhZGlvT25FeGVjKSwgcEFkLCBGQUxTRSk7Ci0JCQl9Ci0jZW5kaWYgLy8gUlRNUF9QQ0lfU1VQUE9SVCAvLwotCi0JCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZS5MaW5rRG93blRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oTGlua0Rvd25FeGVjKSwgcEFkLCBGQUxTRSk7Ci0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JfSB3aGlsZSAoRkFMU0UpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE1MTUUgSW5pdGlhbGl6ZVxuIikpOwotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQltYWluIGxvb3Agb2YgdGhlIE1MTUUKLQlQcmU6Ci0JCU1sbWUgaGFzIHRvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlcmUgYXJlIHNvbWV0aGluZyBpbnNpZGUgdGhlIHF1ZXVlCi0JTm90ZToKLQkJVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gTVBTZXRJbmZvcm1hdGlvbiBhbmQgTVBSZWNlaXZlOwotCQlUaGlzIHRhc2sgZ3VhcmFudGVlIG9ubHkgb25lIE1sbWVIYW5kbGVyIHdpbGwgcnVuLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVIYW5kbGVyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU1MTUVfUVVFVUVfRUxFTQkJICAgKkVsZW0gPSBOVUxMOwotI2lmZGVmIEFQQ0xJX1NVUFBPUlQKLQlTSE9SVCBhcGNsaUlmSW5kZXg7Ci0jZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLwotCi0JLy8gT25seSBhY2NlcHQgTUxNRSBhbmQgRnJhbWUgZnJvbSBwZWVyIHNpZGUsIG5vIG90aGVyIChjb250cm9sL2RhdGEpIGZyYW1lIHNob3VsZAotCS8vIGdldCBpbnRvIHRoaXMgc3RhdGUgbWFjaGluZQotCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQlpZihwQWQtPk1sbWUuYlJ1bm5pbmcpCi0JewotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+TWxtZS5iUnVubmluZyA9IFRSVUU7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0KLQl3aGlsZSAoIU1sbWVRdWV1ZUVtcHR5KCZwQWQtPk1sbWUuUXVldWUpKQotCXsKLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NTE1FX1JFU0VUX0lOX1BST0dSRVNTKSB8fAotCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8Ci0JCQlSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRldmljZSBIYWx0ZWQgb3IgUmVtb3ZlZCBvciBNbG1lUmVzdCwgZXhpdCBNbG1lSGFuZGxlciEgKHF1ZXVlIG51bSA9ICVsZClcbiIsIHBBZC0+TWxtZS5RdWV1ZS5OdW0pKTsKLQkJCWJyZWFrOwotCQl9Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JCWlmKEFURV9PTihwQWQpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUaGUgZHJpdmVyIGlzIGluIEFURSBtb2RlIG5vdyBpbiBNbG1lSGFuZGxlclxuIikpOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQkJLy9Gcm9tIG1lc3NhZ2UgdHlwZSwgZGV0ZXJtaW5lIHdoaWNoIHN0YXRlIG1hY2hpbmUgSSBzaG91bGQgZHJpdmUKLQkJaWYgKE1sbWVEZXF1ZXVlKCZwQWQtPk1sbWUuUXVldWUsICZFbGVtKSkKLQkJewotCi0JCQkvLyBpZiBkZXF1ZXVlIHN1Y2Nlc3MKLQkJCXN3aXRjaCAoRWxlbS0+TWFjaGluZSkKLQkJCXsKLQkJCQkvLyBTVEEgc3RhdGUgbWFjaGluZXMKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJCQljYXNlIEFTU09DX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFzc29jTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVVUSF9TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5BdXRoTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQVVUSF9SU1BfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNZTkNfU1RBVEVfTUFDSElORToKLQkJCQkJU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbihwQWQsICZwQWQtPk1sbWUuU3luY01hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FOgotCQkJCQlNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5DbnRsTWFjaGluZSwgRWxlbSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV1BBX1BTS19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5XcGFQc2tNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCQljYXNlIERMU19TVEFURV9NQUNISU5FOgotCQkJCQlTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKHBBZCwgJnBBZC0+TWxtZS5EbHNNYWNoaW5lLCBFbGVtKTsKLQkJCQkJYnJlYWs7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkJCWNhc2UgQUNUSU9OX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLkFjdE1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgV1BBX1NUQVRFX01BQ0hJTkU6Ci0JCQkJCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24ocEFkLCAmcEFkLT5NbG1lLldwYU1hY2hpbmUsIEVsZW0pOwotCQkJCQlicmVhazsKLQotCi0JCQkJZGVmYXVsdDoKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRVJST1I6IElsbGVnYWwgbWFjaGluZSAlbGQgaW4gTWxtZUhhbmRsZXIoKVxuIiwgRWxlbS0+TWFjaGluZSkpOwotCQkJCQlicmVhazsKLQkJCX0gLy8gZW5kIG9mIHN3aXRjaAotCi0JCQkvLyBmcmVlIE1MTUUgZWxlbWVudAotCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKLQkJCUVsZW0tPk1zZ0xlbiA9IDA7Ci0KLQkJfQotCQllbHNlIHsKLQkJCURCR1BSSU5UX0VSUigoIk1sbWVIYW5kbGVyOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKLQkJfQotCX0KLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JcEFkLT5NbG1lLmJSdW5uaW5nID0gRkFMU0U7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlEZXN0cnVjdG9yIG9mIE1MTUUgKERlc3Ryb3kgcXVldWUsIHN0YXRlIG1hY2hpbmUsIHNwaW4gbG9jayBhbmQgdGltZXIpCi0JUGFyYW1ldGVyczoKLQkJQWRhcHRlciAtIE5JQyBBZGFwdGVyIHBvaW50ZXIKLQlQb3N0OgotCQlUaGUgTUxNRSB0YXNrIHdpbGwgbm8gbG9uZ2VyIHdvcmsgcHJvcGVybHkKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVIYWx0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUJPT0xFQU4JCSAgQ2FuY2VsbGVkOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IE1sbWVIYWx0XG4iKSk7Ci0KLQlpZiAoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQl7Ci0JCS8vIGRpc2FibGUgQkVBQ09OIGdlbmVyYXRpb24gYW5kIG90aGVyIEJFQUNPTiByZWxhdGVkIGhhcmR3YXJlIHRpbWVycwotCQlBc2ljRGlzYWJsZVN5bmMocEFkKTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJVUNIQVIJCWk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCS8vIENhbmNlbCBwZW5kaW5nIHRpbWVycwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlJlYXNzb2NUaW1lciwJCSZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLAkmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwJCSZDYW5jZWxsZWQpOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkgICAgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpCi0JCQkmJihwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0JICAgIHsKLQkJICAgIFJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBzUG9sbFRpbWVyLAkJJkNhbmNlbGxlZCk7Ci0JCSAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SYWRpb09uT2ZmVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZDYW5jZWxsZWQpOwotCQl9Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLkxpbmtEb3duVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5SeEFudEV2YWxUaW1lciwJCSZDYW5jZWxsZWQpOwotCi0KLQotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCXsKLQkJUlRNUF9DSElQX09QICpwQ2hpcE9wcyA9ICZwQWQtPmNoaXBPcHM7Ci0KLQkJLy8gU2V0IExFRAotCQlSVE1QU2V0TEVEKHBBZCwgTEVEX0hBTFQpOwotCQlSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgZmlybXdhcmUgaXMgbm90IGRvbmUgaXQuCi0KLQkJaWYgKHBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbikKLQkJCXBDaGlwT3BzLT5Bc2ljSGFsdEFjdGlvbihwQWQpOwotCX0KLQotCVJUTVB1c2VjRGVsYXkoNTAwMCk7ICAgIC8vICA1IG1zZWMgdG8gZ3VyYW50ZWUgQW50IERpdmVyc2l0eSB0aW1lciBjYW5jZWxlZAotCi0JTWxtZVF1ZXVlRGVzdHJveSgmcEFkLT5NbG1lLlF1ZXVlKTsKLQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVIYWx0XG4iKSk7Ci19Ci0KLVZPSUQgTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpCi17Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjUnhPa0RhdGFDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tEYXRhQ250OwotCS8vIGNsZWFyIGFsbCBPbmVTZWN4eHggY291bnRlcnMuCi0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNCZWFjb25TZW50Q250ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY0ZhbHNlQ0NBQ250ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250ID0gMDsKLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4T2tDbnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSZWNlaXZlZEJ5dGVDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCA9IDA7Ci0KLQkvLyBUT0RPOiBmb3IgZGVidWcgb25seS4gdG8gYmUgcmVtb3ZlZAotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19CRV0gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19CS10gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19WSV0gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1FJRF9BQ19WT10gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19CRV0gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19CS10gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19WSV0gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRG1hRG9uZUNvdW50W1FJRF9BQ19WT10gPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhDb3VudCA9IDA7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEFnZ3JlZ2F0aW9uQ291bnQgPSAwOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhBZ2dyZWdhdGlvbkNvdW50ID0gMDsKLQotCXJldHVybjsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgdG8gLQotCQkxLiBEZWNpZGUgaWYgaXQncyBhIHJpZ2h0IHRpbWUgdG8gdHVybiBvbiBQd3JNZ210IGJpdCBvZiBhbGwKLQkJICAgb3V0Z29paW5nIGZyYW1lcwotCQkyLiBDYWxjdWxhdGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb24gc3RhdGlzdGljcyBvZiB0aGUgbGFzdAotCQkgICBwZXJpb2QsIHNvIHRoYXQgVFggcmF0ZSB3b24ndCB0b2dnbGluZyB2ZXJ5IGZyZXF1ZW50bHkgYmV0d2VlbiBhCi0JCSAgIHN1Y2Nlc3NmdWwgVFggYW5kIGEgZmFpbGVkIFRYLgotCQkzLiBJZiB0aGUgY2FsY3VsYXRlZCBDaGFubmVsUXVhbGl0eSBpbmRpY2F0ZWQgY3VycmVudCBjb25uZWN0aW9uIG5vdAotCQkgICBoZWFsdGh5LCB0aGVuIGEgUk9BTWluZyBhdHRlbXB0IGlzIHRyaWVkIGhlcmUuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSNkZWZpbmUgQURIT0NfQkVBQ09OX0xPU1RfVElNRQkJKDgqT1NfSFopICAvLyA4IHNlYwotVk9JRCBNbG1lUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlVTE9ORwkJCVR4VG90YWxDbnQ7Ci0JUFJUTVBfQURBUFRFUglwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCVNIT1JUCXJlYWxhdmdyc3NpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JICAgIC8vIElmIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gZW5hYmxlZCwgd2UgaGF2ZSB0byBjaGVjayBHUElPIHBpbjIgZXZlcnkgMiBzZWNvbmQuCi0JCS8vIE1vdmUgY29kZSB0byBoZXJlLCBiZWNhdXNlIGZvbGxvd2luZyBjb2RlIHdpbGwgcmV0dXJuIHdoZW4gcmFkaW8gaXMgb2ZmCi0JCWlmICgocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJSAoTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiAyKSA9PSAwKSAmJiAocEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPT0gVFJVRSkgJiYKLQkJCSghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JCQkvKiYmKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkqLykKLQkJewotCQkJVUlOVDMyCQkJCWRhdGEgPSAwOwotCi0JCQkvLyBSZWFkIEdQSU8gcGluMiBhcyBIYXJkd2FyZSBjb250cm9sbGVkIHJhZGlvIHN0YXRlCi0jaWZuZGVmIFJUMzA5MAotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBHUElPX0NUUkxfQ0ZHLCAmZGF0YSk7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0vL0tIKFBDSUUgUFMpOkFkZGVkIGJhc2VkIG9uIEphbmU8LS0KLSNpZmRlZiBSVDMwOTAKLS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKLS8vIFdlIG5lZWQgdG8gUmVhZCBHUElPIGlmIEhXIHNhaWQgc28gbm8gbWF0ZXIgd2hhdCBhZHZhbmNlIHBvd2VyIHNhdmluZwotaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoSURMRV9PTihwQWQpKQotCSYmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKQotCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlUFNpbklkbGUgPT0gVFJVRSkpCi0JewotCS8vIFdhbnQgdG8gbWFrZSBzdXJlIGRldmljZSBnb2VzIHRvIEwwIHN0YXRlIGJlZm9yZSByZWFkaW5nIHJlZ2lzdGVyLgotCVJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUocEFkLCAwKTsKLQlSVE1QX0lPX0ZPUkNFX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKLQlSVE1QUENJZUxpbmtDdHJsU2V0dGluZyhwQWQsIDMpOwotCX0KLWVsc2UKLQlSVE1QX0lPX0ZPUkNFX1JFQUQzMihwQWQsIEdQSU9fQ1RSTF9DRkcsICZkYXRhKTsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLS8vS0goUENJRSBQUyk6QWRkZWQgYmFzZWQgb24gSmFuZS0tPgotCi0JCQlpZiAoZGF0YSAmIDB4MDQpCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYkh3UmFkaW8gPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLmJId1JhZGlvID0gRkFMU0U7Ci0JCQl9Ci0JCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLQkJCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0JCQkJewotCQkJCQlNbG1lUmFkaW9PbihwQWQpOwotCQkJCQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlNbG1lUmFkaW9PZmYocEFkKTsKLQkJCQkJLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCXBBZC0+RXh0cmFJbmZvID0gSFdfUkFESU9fT0ZGOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmICgoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX01FQVNVUkVNRU5UIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykpKSkKLQkJcmV0dXJuOwotCi0JUlRNUF9NTE1FX1BSRV9TQU5JVFlfQ0hFQ0socEFkKTsKLQotI2lmZGVmIFJBTElOS19BVEUKLQkvKiBEbyBub3Qgc2hvdyBSU1NJIHVudGlsICJOb3JtYWwgMSBzZWNvbmQgTWxtZSBQZXJpb2RpY0V4ZWMiLiAqLwotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAlIE1MTUVfVEFTS19FWEVDX01VTFRJUExFICE9IChNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAtIDEpKQotCXsKLQkJCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICsrOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBEbyBub3RoaW5nIGlmIG1vbml0b3IgbW9kZSBpcyBvbgotCQlpZiAoTU9OSVRPUl9PTihwQWQpKQotCQkJcmV0dXJuOwotCi0JCWlmIChwQWQtPk1sbWUuUGVyaW9kaWNSb3VuZCAmIDB4MSkKLQkJewotCQkJLy8gVGhpcyBpcyB0aGUgZml4IGZvciB3aWZpIDExbiBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyB0ZXN0IGNhc2UuICBmb3IgMjg2MEQKLQkJCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPT0gMHgwMTAxKSAmJgotCQkJCShTVEFfVEdOX1dJRklfT04ocEFkKSkgJiYKLQkJCQkocEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID09IEZBTFNFKSkKLQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHgyNEJmKTsKLQkJCQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iVG9nZ2xlID0gVFJVRTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFNUQV9UR05fV0lGSV9PTihwQWQpKSAmJgotCQkJCQkJKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpID09IDB4MDEwMSkpCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWE9QX0NUUkxfQ0ZHLCAweDI0M2YpOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJUb2dnbGUgPSBGQUxTRTsKLQkJCQl9Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlwQWQtPmJVcGRhdGVCY25DbnREb25lID0gRkFMU0U7Ci0KLS8vCVJFQ0JBVGltZXJUaW1lb3V0KFN5c3RlbVNwZWNpZmljMSxGdW5jdGlvbkNvbnRleHQsU3lzdGVtU3BlY2lmaWMyLFN5c3RlbVNwZWNpZmljMyk7Ci0JcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgKys7Ci0KLQotCS8vIGV4ZWN1dGUgZXZlcnkgNTAwbXMKLQlpZiAoKHBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kICUgNSA9PSAwKSAmJiBSVE1QQXV0b1JhdGVTd2l0Y2hDaGVjayhwQWQpLyooT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSkqLykKLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCS8vIHBlcmZvcm0gZHluYW1pYyB0eCByYXRlIHN3aXRjaGluZyBiYXNlZCBvbiBwYXN0IFRYIGhpc3RvcnkKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKLQkJCQkJKQotCQkJCSYmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkpCi0JCQkJTWxtZUR5bmFtaWNUeFJhdGVTd2l0Y2hpbmcocEFkKTsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8vIE5vcm1hbCAxIHNlY29uZCBNbG1lIFBlcmlvZGljRXhlYy4KLQlpZiAocEFkLT5NbG1lLlBlcmlvZGljUm91bmQgJU1MTUVfVEFTS19FWEVDX01VTFRJUExFID09IDApCi0JewotICAgICAgICAgICAgICAgIHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICsrOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCQkvKiByZXF1ZXN0IGZyb20gQmFyb24gOiBtb3ZlIHRoaXMgcm91dGluZSBmcm9tIGxhdGVyIHRvIGhlcmUgKi8KLQkJCS8qIGZvciBzaG93aW5nIFJ4IGVycm9yIGNvdW50IGluIEFURSBSWEZSQU1FICovCi0gICAgICAgICAgICBOSUNVcGRhdGVSYXdDb3VudGVycyhwQWQpOwotCQkJaWYgKHBBZC0+YXRlLmJSeEZFUiA9PSAxKQotCQkJewotCQkJCXBBZC0+YXRlLlJ4VG90YWxDbnQgKz0gcEFkLT5hdGUuUnhDbnRQZXJTZWM7Ci0JCQkgICAgYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IHBhY2tldCBjbnQgPSAlZC8lZFxuIiwgcEFkLT5hdGUuUnhDbnRQZXJTZWMsIHBBZC0+YXRlLlJ4VG90YWxDbnQpOwotCQkJCXBBZC0+YXRlLlJ4Q250UGVyU2VjID0gMDsKLQotCQkJCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKLQkJCQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IEF2Z1Jzc2kwPSVkLCBBdmdSc3NpMT0lZCwgQXZnUnNzaTI9JWRcblxuIiwKLQkJCQkJCXBBZC0+YXRlLkF2Z1Jzc2kwLCBwQWQtPmF0ZS5BdmdSc3NpMSwgcEFkLT5hdGUuQXZnUnNzaTIpOwotCQkJCWVsc2UKLQkJCQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk1sbWVQZXJpb2RpY0V4ZWM6IFJ4IEF2Z1Jzc2k9JWRcblxuIiwgcEFkLT5hdGUuQXZnUnNzaTApOwotCQkJfQotCQkJTWxtZVJlc2V0UmFsaW5rQ291bnRlcnMocEFkKTsKLQotCi0KLQkJCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0KLQotCQkvL09SSUJBVGltZXJUaW1lb3V0KHBBZCk7Ci0KLQkJLy8gTWVkaWEgc3RhdHVzIGNoYW5nZWQsIHJlcG9ydCB0byBORElTCi0JCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFKSkKLQkJewotCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9DSEFOR0UpOwotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJCXsKLQkJCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotCQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotCQkJfQotCQl9Ci0KLQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLk5vdzMyKTsKLQotCQkvLyBhZGQgdGhlIG1vc3QgdXAtdG8tZGF0ZSBoL3cgcmF3IGNvdW50ZXJzIGludG8gc29mdHdhcmUgdmFyaWFibGUsIHNvIHRoYXQKLQkJLy8gdGhlIGR5bmFtaWMgdHVuaW5nIG1lY2hhbmlzbSBiZWxvdyBhcmUgYmFzZWQgb24gbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uCi0JCU5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvLyBOZWVkIHN0YXRpc3RpY3MgYWZ0ZXIgcmVhZCBjb3VudGVyLiBTbyBwdXQgYWZ0ZXIgTklDVXBkYXRlUmF3Q291bnRlcnMKLQkJT1JJQkFUaW1lclRpbWVvdXQocEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkvLyBpZiBNR01UIFJJTkcgaXMgZnVsbCBtb3JlIHRoYW4gdHdpY2Ugd2l0aGluIDEgc2Vjb25kLCB3ZSBjb25zaWRlciB0aGVyZSdzCi0JCS8vIGEgaGFyZHdhcmUgcHJvYmxlbSBzdHVja2luZyB0aGUgVFggcGF0aC4gSW4gdGhpcyBjYXNlLCB0cnkgYSBoYXJkd2FyZSByZXNldAotCQkvLyB0byByZWNvdmVyIHRoZSBzeXN0ZW0KLQkvLwlpZiAocEFkLT5SYWxpbmtDb3VudGVycy5NZ210UmluZ0Z1bGxDb3VudCA+PSAyKQotCS8vCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUik7Ci0JLy8JZWxzZQotCS8vCQlwQWQtPlJhbGlua0NvdW50ZXJzLk1nbXRSaW5nRnVsbENvdW50ID0gMDsKLQotCQkvLyBUaGUgdGltZSBwZXJpb2QgZm9yIGNoZWNraW5nIGFudGVubmEgaXMgYWNjb3JkaW5nIHRvIHRyYWZmaWMKLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQkJaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9PSBBTlRfRElWRVJTSVRZX0VOQUJMRSkgJiYKLQkJCSghcEFkLT5FZXByb21BY2Nlc3MpKQotCQkJQXNpY0FudGVubmFTZWxlY3QocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0JCWVsc2UgaWYocEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID09IEFOVF9GSVhfQU5UMSB8fCBwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPT0gQU5UX0ZJWF9BTlQyKQotCQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlyZWFsYXZncnNzaSA9IChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50XSA+PiAzKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQW50LXJlYWxyc3NpMCglZCksIExhc3Ryc3NpMCglZCksIEV2YWx1YXRlU3RhYmxlQ250PSVkXG4iLCByZWFsYXZncnNzaSwgcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpLCBwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250KSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCQl7Ci0JCQlpZiAocEFkLT5NbG1lLmJFbmFibGVBdXRvQW50ZW5uYUNoZWNrKQotCQkJewotCQkJCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkJCSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JCQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJCQlpZiAoVHhUb3RhbENudCA+IDUwKQotCQkJCXsKLQkJCQkJaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTAgPT0gMCkKLQkJCQkJewotCQkJCQkJQXNpY0V2YWx1YXRlUnhBbnQocEFkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSAzID09IDApCi0JCQkJCXsKLQkJCQkJCUFzaWNFdmFsdWF0ZVJ4QW50KHBBZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQkJU1RBTWxtZVBlcmlvZGljRXhlYyhwQWQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCU1sbWVSZXNldFJhbGlua0NvdW50ZXJzKHBBZCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgJiYgKHBBZC0+YlBDSWNsa09mZiA9PSBGQUxTRSkpCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQl7Ci0JCQkvLyBXaGVuIEFkaG9jIGJlYWNvbiBpcyBlbmFibGVkIGFuZCBSVFMvQ1RTIGlzIGVuYWJsZWQsIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgaGFyZHdhcmUgTUFDIEZTTSB3aWxsIHJ1biBpbnRvIGEgZGVhZGxvY2sKLQkJCS8vIGFuZCBzZW5kaW5nIENUUy10by1zZWxmIG92ZXIgYW5kIG92ZXIuCi0JCQkvLyBTb2Z0d2FyZSBQYXRjaCBTb2x1dGlvbjoKLQkJCS8vIDEuIFBvbGxpbmcgZGVidWcgc3RhdGUgcmVnaXN0ZXIgMHgxMEY0IGV2ZXJ5IG9uZSBzZWNvbmQuCi0JCQkvLyAyLiBJZiBpbiAweDEwRjQgdGhlICgoYml0Mjk9PTEpICYmIChiaXQ3PT0xKSkgT1IgKChiaXQyOT09MSkgJiYgKGJpdDU9PTEpKSwgaXQgbWVhbnMgdGhlIGRlYWRsb2NrIGhhcyBvY2N1cnJlZC4KLQkJCS8vIDMuIElmIHRoZSBkZWFkbG9jayBvY2N1cnJlZCwgcmVzZXQgTUFDL0JCUCBieSBzZXR0aW5nIDB4MTAwNCB0byAweDAwMDEgZm9yIGEgd2hpbGUgdGhlbiBzZXR0aW5nIGl0IGJhY2sgdG8gMHgwMDBDIGFnYWluLgotCi0JCQlVSU5UMzIJTWFjUmVnID0gMDsKLQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCAweDEwRjQsICZNYWNSZWcpOwotCQkJaWYgKCgoTWFjUmVnICYgMHgyMDAwMDAwMCkgJiYgKE1hY1JlZyAmIDB4ODApKSB8fCAoKE1hY1JlZyAmIDB4MjAwMDAwMDApICYmIChNYWNSZWcgJiAweDIwKSkpCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOwotCQkJCVJUTVB1c2VjRGVsYXkoMSk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweEMpOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwoIldhcm5pbmcsIE1BQyBzcGVjaWZpYyBjb25kaXRpb24gb2NjdXJzIFxuIikpOwotCQkJfQotCQl9Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotCX0KLQotCi0JcEFkLT5iVXBkYXRlQmNuQ250RG9uZSA9IEZBTFNFOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlWYWxpZGF0ZSBTU0lEIGZvciBjb25uZWN0aW9uIHRyeSBhbmQgcmVzY2FuIHB1cnBvc2UKLQlWYWxpZCBTU0lEIHdpbGwgaGF2ZSB2aXNpYmxlIGNoYXJzIG9ubHkuCi0JVGhlIHZhbGlkIGxlbmd0aCBpcyBmcm9tIDAgdG8gMzIuCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lVmFsaWRhdGVTU0lEKAotCUlOIFBVQ0hBUglwU3NpZCwKLQlJTiBVQ0hBUglTc2lkTGVuKQotewotCWludAlpbmRleDsKLQotCWlmIChTc2lkTGVuID4gTUFYX0xFTl9PRl9TU0lEKQotCQlyZXR1cm4gKEZBTFNFKTsKLQotCS8vIENoZWNrIGVhY2ggY2hhcmFjdGVyIHZhbHVlCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU3NpZExlbjsgaW5kZXgrKykKLQl7Ci0JCWlmIChwU3NpZFtpbmRleF0gPCAweDIwKQotCQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCi0JLy8gQWxsIGNoZWNrZWQKLQlyZXR1cm4gKFRSVUUpOwotfQotCi1WT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKLQlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKLQlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpCi17Ci0JZG8KLQl7Ci0JCS8vIGRlY2lkZSB0aGUgcmF0ZSB0YWJsZSBmb3IgdHVuaW5nCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVUYWJsZVNpemUgPiAwKQotCQl7Ci0JCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlWzFdOwotCi0JCQlicmVhazsKLQkJfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCWlmICgocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkgJiYgQURIT0NfT04ocEFkKSkKLQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCi0JCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJCSgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpKSkKLQkJCXsvLyAxMU4gMVMgQWRob2MKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTOwotCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0KLQkJCX0KLQkJCWVsc2UgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpICYmCi0JCQkJCShwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJgotCQkJCQkocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKLQkJCXsvLyAxMU4gMlMgQWRob2MKLQkJCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZDsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJCSYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPT0gMCkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAwKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCQkpCi0JCQl7Ci0JCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUI7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwotCi0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCQl7Ci0JCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOwotCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCR1swXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOwotCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUdbMF07Ci0JCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzFdOwotCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9PSAxMikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDB4ZmYpICYmCi0JCS8vCSgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkpKQotCQlpZiAoKChwRW50cnktPlJhdGVMZW4gPT0gMTIpIHx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJKChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMHgwMCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpKSkKLQkJey8vIDExQkdOIDFTIEFQCi0JCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVM7Ci0JCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjFTWzFdOwotCi0JCQlicmVhazsKLQkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDEyKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYKLQkJLy8JKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQlpZiAoKChwRW50cnktPlJhdGVMZW4gPT0gMTIpIHx8IChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkgJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJgotCQkJKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9PSAweGZmKSAmJiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMikpCi0JCXsvLyAxMUJHTiAyUyBBUAotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlM7Ci0JCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTWzBdOwotCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNbMV07Ci0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZDsKLQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlNGb3JBQmFuZFswXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbMV07Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAweDAwKSB8fCAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAxKSkpCi0JCWlmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDB4ZmYpICYmICgocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4MDApIHx8IChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkpCi0JCXsvLyAxMU4gMVMgQVAKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7Ci0JCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMV07Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy9lbHNlIGlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0gPT0gMHhmZikgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpKQotCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAweGZmKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDB4ZmYpICYmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKSkKLQkJey8vIDExTiAyUyBBUAotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlM7Ci0JCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFswXTsKLQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kWzFdOwotCQkJfQotCi0JCQlicmVhazsKLQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID09IDQpICYmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCi0JCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDQgfHwgcEFkLT5Db21tb25DZmcuUGh5TW9kZT09UEhZXzExQikKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLy9JdmVyc29uIG1hcmsgZm9yIEFkaG9jIGIgbW9kZSxzdGEgd2lsbCB1c2UgcmF0ZSA1NCAgTWJwcyB3aGVuIGNvbm5lY3Qgd2l0aCBzdGEgYi9nL24gbW9kZQotCQkvKiAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkqLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKQotCQl7Ly8gQiBvbmx5IEFQCi0JCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQjsKLQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzBdOwotCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwotCi0JCQlicmVhazsKLQkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID4gOCkgJiYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdID09IDApICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFsxXSA9PSAwKSkKLQkJaWYgKChwRW50cnktPlJhdGVMZW4gPiA4KQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJJiYgKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkpCi0JCXsvLyBCL0cgIG1peGVkIEFQCi0JCQkqcHBUYWJsZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkc7Ci0JCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07Ci0JCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUJHWzFdOwotCi0JCQlicmVhazsKLQkJfQotCi0JCS8vZWxzZSBpZiAoKHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4gKyBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID09IDgpICYmIChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCi0JCWlmICgocEVudHJ5LT5SYXRlTGVuID09IDgpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzBdID09IDApICYmIChwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPT0gMCkKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCSkKLQkJey8vIEcgb25seSBBUAotCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7Ci0JCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExR1swXTsKLQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExR1sxXTsKLQotCQkJYnJlYWs7Ci0JCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvL2Vsc2UgaWYgKChwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldFswXSA9PSAwKSAmJiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMV0gPT0gMCkpCi0JCQlpZiAoKHBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9PSAwKSAmJiAocEVudHJ5LT5IVENhcGFiaWxpdHkuTUNTU2V0WzFdID09IDApKQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJewkvLyBMZWdhY3kgbW9kZQotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPD0gUkFURV8xMSkKLQkJCQl7Ci0JCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFCOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQlswXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFCWzFdOwotCQkJCX0KLQkJCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID4gUkFURV8xMSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA+IFJBVEVfMTEpKQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUc7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFHWzBdOwotCQkJCQkqcEluaXRUeFJhdGVJZHggPSBSYXRlU3dpdGNoVGFibGUxMUdbMV07Ci0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMUJHOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExQkdbMV07Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA8PSAxNCkKLQkJCXsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKLQkJCQl7Ci0JCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yUzsKLQkJCQkJKnBUYWJsZVNpemUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU1swXTsKLQkJCQkJKnBJbml0VHhSYXRlSWR4ID0gUmF0ZVN3aXRjaFRhYmxlMTFOMlNbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPT0gMSkKLQkJCQl7Ci0JCQkJCSpwcFRhYmxlID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVM7Ci0JCQkJCSpwVGFibGVTaXplID0gUmF0ZVN3aXRjaFRhYmxlMTFOMVNbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjFTWzFdOwotCQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCJEUlM6IHVua293biBtb2RlLGRlZmF1bHQgdXNlIDExTiAxUyBBUCBcbiIpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJKnBwVGFibGUgPSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kOwotCQkJCQkqcFRhYmxlU2l6ZSA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMF07Ci0JCQkJCSpwSW5pdFR4UmF0ZUlkeCA9IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmRbMV07Ci0JCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUsZGVmYXVsdCB1c2UgMTFOIDJTIEFQIFxuIikpOwotCQkJCX0KLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19FUlJPUiwoIkRSUzogdW5rb3duIG1vZGUgKFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIE1DU1NldFswXT0weCV4LCBNQ1NTZXRbMV09MHgleClcbiIsCi0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzFdKSk7Ci0JCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9IHdoaWxlKEZBTFNFKTsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCi0JUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUxPTkcJCQkgICAgVHhUb3RhbENudDsKLQlpbnQJaTsKLQotCi0KLQotCS8qCi0JCVdlIHJldHVybiBoZXJlIGluIEFURSBtb2RlLCBiZWNhdXNlIHRoZSBzdGF0aXN0aWNzCi0JCXRoYXQgQVRFIG5lZWQgYXJlIG5vdCBjb2xsZWN0ZWQgdmlhIHRoaXMgcm91dGluZS4KLQkqLwotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQkvLyBJdCBpcyBzdXBwb3NlZCB0aGF0IHdlIHdpbGwgbmV2ZXIgcmVhY2ggaGVyZSBpbiBBVEUgbW9kZS4KLQlBU1NFUlQoIShBVEVfT04ocEFkKSkpOwotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotLy8gZG9uJ3QgcGVyZm9ybSBpZGxlLXBvd2VyLXNhdmUgbWVjaGFuaXNtIHdpdGhpbiAzIG1pbiBhZnRlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCi0vLyBUaGlzIGNhbiBtYWtlIHJlYm9vdGVyIHRlc3QgbW9yZSByb2J1c3QKLWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQl7Ci0JaWYgKChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSAmJiAoSURMRV9PTihwQWQpKQotCQkmJiAocEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9PSBTWU5DX0lETEUpCi0JCSYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkKLQkJJiYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKSkKLQkJewotCQlpZiAoSVNfUlQzMDkwKHBBZCl8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKLQkJCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OiVkXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXykpOwotCi0JCQkJUlQyOHh4UGNpQXNpY1JhZGlvT2ZmKHBBZCwgR1VJX0lETEVfUE9XRVJfU0FWRSwgMCk7Ci0JCQkJfQotCQkJZWxzZQotCQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6JWRcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKSk7Ci0JCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDMwLCBQb3dlclNhZmVDSUQsIDB4ZmYsIDB4Mik7Ci0JCQkJLy8gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKLQkJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7Ci0JCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSAtIHJ0MzB4eCBJc3N1ZSBTbGVlcCBjb21tYW5kKVxuIikpOwotCQkJCX0KLQkJCX0KLQkJZWxzZSBpZiAocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgPiAxODApCi0JCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpCi0JCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pKTsKLQkJCQlSVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBHVUlfSURMRV9QT1dFUl9TQVZFLCAwKTsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pKTsKLQkJCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzAsIFBvd2VyU2FmZUNJRCwgMHhmZiwgMHgwMik7Ci0JCQkJLy8gV2FpdCBjb21tYW5kIHN1Y2Nlc3MKLQkJCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyU2FmZUNJRCk7Ci0JCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSAtICBydDI4eHggSXNzdWUgU2xlZXAgY29tbWFuZClcbiIpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQllbHNlCi0JCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFNbG1lUGVyaW9kaWNFeGVjIE1NQ0hLIC0gQ29tbW9uQ2ZnLlNzaWRbJWRdPSVjJWMlYyVjLi4uIE1sbWVBdXguU3NpZFslZF09JWMlYyVjJWMuLi5cbiIsCi0JCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5Tc2lkWzBdLCBwQWQtPkNvbW1vbkNmZy5Tc2lkWzFdLCBwQWQtPkNvbW1vbkNmZy5Tc2lkWzJdLCBwQWQtPkNvbW1vbkNmZy5Tc2lkWzNdLAotCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkWzBdLCBwQWQtPk1sbWVBdXguU3NpZFsxXSwgcEFkLT5NbG1lQXV4LlNzaWRbMl0sIHBBZC0+TWxtZUF1eC5Tc2lkWzNdKSk7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgIHsKLQkvLyBXUEEgTUlDIGVycm9yIHNob3VsZCBibG9jayBhc3NvY2lhdGlvbiBhdHRlbXB0IGZvciA2MCBzZWNvbmRzCi0JCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAmJgotCQkJUlRNUF9USU1FX0FGVEVSKHBBZC0+TWxtZS5Ob3czMiwgcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCpPU19IWikpKQotCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOwotICAgIH0KLQotICAgIGlmICgocEFkLT5QcmVNZWRpYVN0YXRlICE9IHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlKSAmJiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpKQotCXsKLQkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCX0KLQkJcEFkLT5QcmVNZWRpYVN0YXRlID0gcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGU7Ci0JfQotCi0KLQotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rICYmIEFESE9DX09OKHBBZCkpCi0JewotCX0KLQllbHNlCi0JewotCUFzaWNTdGFCYnBUdW5pbmcocEFkKTsKLQl9Ci0KLQlUeFRvdGFsQ250ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsKLQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCQkgcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JewotCQkvLyB1cGRhdGUgY2hhbm5lbCBxdWFsaXR5IGZvciBSb2FtaW5nIGFuZCBVSSBMaW5rUXVhbGl0eSBkaXNwbGF5Ci0JCU1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eShwQWQsIE5VTEwsIHBBZC0+TWxtZS5Ob3czMik7Ci0JfQotCi0JLy8gbXVzdCBiZSBBRlRFUiBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygpIGJlY2F1c2UgaXQgbmVlZHMgdG8ga25vdyBpZgotCS8vIFJhZGlvIGlzIGN1cnJlbnRseSBpbiBub2lzeSBlbnZpcm9ubWVudAotCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLQlBc2ljQWRqdXN0VHhQb3dlcihwQWQpOwotCi0JaWYgKElORlJBX09OKHBBZCkpCi0JewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkvLyBDaGVjayBETFMgdGltZSBvdXQsIHRoZW4gdGVhciBkb3duIHRob3NlIHNlc3Npb24KLQkJUlRNUENoZWNrRExTVGltZU91dChwQWQpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JCS8vIElzIFBTTSBiaXQgY29uc2lzdGVudCB3aXRoIHVzZXIgcG93ZXIgbWFuYWdlbWVudCBwb2xpY3k/Ci0JCS8vIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgdGhhdCB3aWxsIHNldCBQU00gYml0IE9OLgotCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkpCi0JCU1sbWVDaGVja1BzbUNoYW5nZShwQWQsIHBBZC0+TWxtZS5Ob3czMik7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5MYXN0T25lU2VjVG90YWxUeENvdW50ID0gVHhUb3RhbENudDsKLQotCQlpZiAoKFJUTVBfVElNRV9BRlRFUihwQWQtPk1sbWUuTm93MzIsIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUgKyAoMSpPU19IWikpKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKSAmJgotCQkJKCgoVHhUb3RhbENudCArIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudCkgPCA2MDApKSkKLQkJewotCQkJUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIEJXXzIwKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gTm8gQkVBQ09OLiByZXN0b3JlIFI2NiB0byB0aGUgbG93IGJvdW5kKCVkKSBcbiIsICgweDJFICsgR0VUX0xOQV9HQUlOKHBBZCkpKSk7Ci0JCX0KLQotICAgICAgICAvL2lmICgocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID09IDApICYmCi0gICAgICAgIC8vICAgIChwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ID09IDApKQotICAgICAgICB7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUpCi0JCXsKLQkJICAgIC8vIFdoZW4gQVBTRCBpcyBlbmFibGVkLCB0aGUgcGVyaW9kIGNoYW5nZXMgYXMgMjAgc2VjCi0JCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMjApID09IDgpCi0JCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkgICAgLy8gU2VuZCBvdXQgYSBOVUxMIGZyYW1lIGV2ZXJ5IDEwIHNlYyB0byBpbmZvcm0gQVAgdGhhdCBTVEEgaXMgc3RpbGwgYWxpdmUgKEF2b2lkIGJlaW5nIGFnZSBvdXQpCi0JCQlpZiAoKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgMTApID09IDgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCi0JCQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotCQkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgfQotCi0JCWlmIChDUUlfSVNfREVBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQotCQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBObyBCRUFDT04uIERlYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOwotCi0JCQkvLyBMb3N0IEFQLCBzZW5kIGRpc2Nvbm5lY3QgJiBsaW5rIGRvd24gZXZlbnQKLQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50Ci0JCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApIHsKLQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfRElTQVNTT0NfRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JCX0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCQkJLy8gUlRNUFBhdGNoTWFjQmJwQnVnKHBBZCk7Ci0JCQlNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKHBBZCk7Ci0JCX0KLQkJZWxzZSBpZiAoQ1FJX0lTX0JBRChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkpKQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLkJhZENRSUF1dG9SZWNvdmVyeUNvdW50ICsrOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBCYWQgQ1FJLiBBdXRvIFJlY292ZXJ5IGF0dGVtcHQgIyVsZFxuIiwgcEFkLT5SYWxpbmtDb3VudGVycy5CYWRDUUlBdXRvUmVjb3ZlcnlDb3VudCkpOwotCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQl9Ci0KLQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZykKLQkJewotCQkJQk9PTEVBTglydiA9IEZBTFNFOwotCQkJQ0hBUglkQm1Ub1JvYW0gPSBwQWQtPlN0YUNmZy5kQm1Ub1JvYW07Ci0JCQlDSEFSCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsCi0JCQkJCQkJCQkJICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwKLQkJCQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLAotCQkJCQkJCQkJCSAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIpOwotCi0JCQkvLyBTY2FubmluZywgaWdub3JlIFJvYW1pbmcKLQkJCWlmICghUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSAmJgotCQkJCShwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID09IFNZTkNfSURMRSkgJiYKLQkJCQkoTWF4UnNzaSA8PSBkQm1Ub1JvYW0pKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJzc2k9JWQsIGRCbVRvUm9hbT0lZFxuIiwgTWF4UnNzaSwgKENIQVIpZEJtVG9Sb2FtKSk7Ci0KLQotCQkJCS8vIEFkZCBhdXRvIHNlYW1sZXNzIHJvYW1pbmcKLQkJCQlpZiAocnYgPT0gRkFMU0UpCi0JCQkJCXJ2ID0gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmcocEFkKTsKLQotCQkJCWlmIChydiA9PSBGQUxTRSkKLQkJCQl7Ci0JCQkJCWlmICgocEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgMTAgKiBPU19IWikgPCBwQWQtPk1sbWUuTm93MzIpCi0JCQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1NQ0hLIC0gUm9hbWluZywgTm8gZWxpZ2FibGUgZW50cnksIHRyeSBuZXcgc2NhbiFcbiIpKTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAyOwotCQkJCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gcEFkLT5NbG1lLk5vdzMyOwotCQkJCQkJTWxtZUF1dG9TY2FuKHBBZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKLQl7Ci0KLQkJLy8gSWYgYWxsIHBlZXJzIGxlYXZlLCBhbmQgdGhpcyBTVEEgYmVjb21lcyB0aGUgbGFzdCBvbmUgaW4gdGhpcyBJQlNTLCB0aGVuIGNoYW5nZSBNZWRpYVN0YXRlCi0JCS8vIHRvIERJU0NPTk5FQ1RFRC4gQnV0IHN0aWxsIGhvbGRpbmcgdGhpcyBJQlNTIChpLmUuIHNlbmRpbmcgQkVBQ09OKSBzbyB0aGF0IG90aGVyIFNUQXMgY2FuCi0JCS8vIGpvaW4gbGF0ZXIuCi0JCWlmIChSVE1QX1RJTUVfQUZURVIocEFkLT5NbG1lLk5vdzMyLCBwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lICsgQURIT0NfQkVBQ09OX0xPU1RfVElNRSkgJiYKLQkJCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJewotCQkJTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgICBTdGFydFJlcTsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTU1DSEsgLSBleGNlc3NpdmUgQkVBQ09OIGxvc3QsIGxhc3QgU1RBIGluIHRoaXMgSUJTUywgTWVkaWFTdGF0ZT1EaXNjb25uZWN0ZWRcbiIpKTsKLQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCi0JCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoQ0hBUiAqKXBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfU1RBUlRfUkVRLCBzaXplb2YoTUxNRV9TVEFSVF9SRVFfU1RSVUNUKSwgJlN0YXJ0UmVxKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7Ci0JCX0KLQotCQlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQkJewotCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQotCQkJaWYgKHBFbnRyeS0+VmFsaWRBc0NMSSA9PSBGQUxTRSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKFJUTVBfVElNRV9BRlRFUihwQWQtPk1sbWUuTm93MzIsIHBFbnRyeS0+TGFzdEJlYWNvblJ4VGltZSArIEFESE9DX0JFQUNPTl9MT1NUX1RJTUUpKQotCQkJCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCBwRW50cnktPkFpZCwgcEVudHJ5LT5BZGRyKTsKLQkJfQotCX0KLQllbHNlIC8vIG5vIElORlJBIG5vciBBREhPQyBjb25uZWN0aW9uCi0JewotCi0JCWlmIChwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJICYmCi0JCQlSVE1QX1RJTUVfQkVGT1JFKHBBZC0+TWxtZS5Ob3czMiwgcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lICsgKDMwICogT1NfSFopKSkKLQkJCWdvdG8gU0tJUF9BVVRPX1NDQU5fQ09OTjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IEZBTFNFOwotCi0JCWlmICgocEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPT0gVFJVRSkKLQkJCSYmIFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkKLQkJCSYmIChNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKLQkJewotCQkJaWYgKChwQWQtPlNjYW5UYWIuQnNzTnI9PTApICYmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfSURMRSkpCi0JCQl7Ci0JCQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QJICAgU2NhblJlcTsKLQotCQkJCWlmIChSVE1QX1RJTUVfQUZURVIocEFkLT5NbG1lLk5vdzMyLCBwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgKyAoMTAgKiBPU19IWikpKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1RBTWxtZVBlcmlvZGljRXhlYygpOkNOVEwgLSBTY2FuVGFiLkJzc05yPT0wLCBzdGFydCBhIG5ldyBBQ1RJVkUgc2NhbiBTU0lEWyVzXVxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKSk7Ci0JCQkJCVNjYW5QYXJtRmlsbChwQWQsICZTY2FuUmVxLCAoUFNUUklORykgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKLQkJCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQkJCQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCi0JCQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IHBBZC0+TWxtZS5Ob3czMjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCS8vIFF1aXQgdGhlIGZvcmV2ZXIgc2NhbiB3aGVuIGluIGEgdmVyeSBjbGVhbiByb29tCi0JCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQotCQkJewotCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA3KSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlNbG1lQXV0b1NjYW4ocEFkKTsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IHBBZC0+TWxtZS5Ob3czMjsKLQkJCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCi0JCQkJCXsKLQkJCQkJCWlmICgocEFkLT5NbG1lLk9uZVNlY1BlcmlvZGljUm91bmQgJSA1KSA9PSAxKQotCQkJCQkJCU1sbWVBdXRvUmVjb25uZWN0TGFzdFNTSUQocEFkKTsKLQkJCQkJfQotCQkJCQllbHNlCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCQkJCQkJTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRChwQWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotU0tJUF9BVVRPX1NDQU5fQ09OTjoKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIGlmICgocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5UWEJBYml0bWFwICE9MCkgJiYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPT0gRkFMU0UpKQotCXsKLQkJcEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9IFRSVUU7Ci0JCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfRk9SQ0VSVFNDVFMsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBGQUxTRSk7Ci0JfQotCWVsc2UgaWYgKChwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlRYQkFiaXRtYXAgPT0wKSAmJiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbiA9PSBUUlVFKSkKLQl7Ci0JCXBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24gPSBGQUxTRTsKLQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCkpCi0JCVRyaUV2ZW50Q291bnRlck1haW50ZW5hbmNlKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JcmV0dXJuOwotfQotCi0vLyBMaW5rIGRvd24gcmVwb3J0Ci1WT0lEIExpbmtEb3duRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JaWYgKHBBZCAhPSBOVUxMKQotCXsKLQkJTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgRGlzYXNzb2NSZXE7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpICYmCi0JCQkoSU5GUkFfT04ocEFkKSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxpbmtEb3duRXhlYygpOiBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQLi4uXG4iKSk7Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAotCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCi0JCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLQkJICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCX0KLQl9Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lQXV0b1NjYW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQlpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIERyaXZlciBhdXRvIHNjYW5cbiIpKTsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCi0JCQkJCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiwKLQkJCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkKTsKLQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lQXV0b1JlY29ubmVjdExhc3RTU0lEKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCWlmIChwQWQtPlN0YUNmZy5iQXV0b0Nvbm5lY3RCeUJzc2lkKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRHJpdmVyIGF1dG8gcmVjb25uZWN0IHRvIGxhc3QgT0lEXzgwMl8xMV9CU1NJRCBzZXR0aW5nIC0gJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguQnNzaWRbMF0sCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguQnNzaWRbMV0sCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguQnNzaWRbMl0sCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguQnNzaWRbM10sCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguQnNzaWRbNF0sCi0JCQkJCQkJCQlwQWQtPk1sbWVBdXguQnNzaWRbNV0pKTsKLQotCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwKLQkJCSBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCSBPSURfODAyXzExX0JTU0lELAotCQkJIE1BQ19BRERSX0xFTiwKLQkJCSBwQWQtPk1sbWVBdXguQnNzaWQpOwotCi0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0KLQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci0JLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQllbHNlIGlmICgocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpICYmCi0JCShNbG1lVmFsaWRhdGVTU0lEKHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKSA9PSBUUlVFKSkKLQl7Ci0JCU5ESVNfODAyXzExX1NTSUQgT2lkU3NpZDsKLQkJT2lkU3NpZC5Tc2lkTGVuZ3RoID0gcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuOwotCQlOZGlzTW92ZU1lbW9yeShPaWRTc2lkLlNzaWQsIHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEcml2ZXIgYXV0byByZWNvbm5lY3QgdG8gbGFzdCBPSURfODAyXzExX1NTSUQgc2V0dGluZyAtICVzLCBsZW4gLSAlZFxuIiwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pKTsKLQkJTWxtZUVucXVldWUocEFkLAotCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJT0lEXzgwMl8xMV9TU0lELAotCQkJCQlzaXplb2YoTkRJU184MDJfMTFfU1NJRCksCi0JCQkJCSZPaWRTc2lkKTsKLQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZXJlJ3JlIG90aGVyIEFQcyBvdXQgdGhlcmUgY2FwYWJsZSBmb3IKLQkJcm9hbWluZy4gQ2FsbGVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBvbmx5IHdoZW4gTGluayB1cCBpbiBJTkZSQSBtb2RlCi0JCWFuZCBjaGFubmVsIHF1YWxpdHkgaXMgYmVsb3cgQ1FJX0dPT0RfVEhSRVNIT0xELgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlPdXRwdXQ6Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQ2hlY2tGb3JSb2FtaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HCU5vdzMyKQotewotCVVTSE9SVAkgICBpOwotCUJTU19UQUJMRSAgKnBSb2FtVGFiID0gJnBBZC0+TWxtZUF1eC5Sb2FtVGFiOwotCUJTU19FTlRSWSAgKnBCc3M7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUNoZWNrRm9yUm9hbWluZ1xuIikpOwotCS8vIHB1dCBhbGwgcm9hbWluZyBjYW5kaWRhdGVzIGludG8gUm9hbVRhYiwgYW5kIHNvcnQgaW4gUlNTSSBvcmRlcgotCUJzc1RhYmxlSW5pdChwUm9hbVRhYik7Ci0JZm9yIChpID0gMDsgaSA8IHBBZC0+U2NhblRhYi5Cc3NOcjsgaSsrKQotCXsKLQkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0KLQkJaWYgKChwQnNzLT5MYXN0QmVhY29uUnhUaW1lICsgcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWUpIDwgTm93MzIpCi0JCQljb250aW51ZTsJIC8vIEFQIGRpc2FwcGVhcgotCQlpZiAocEJzcy0+UnNzaSA8PSBSU1NJX1RIUkVTSE9MRF9GT1JfUk9BTUlORykKLQkJCWNvbnRpbnVlOwkgLy8gUlNTSSB0b28gd2Vhay4gZm9yZ2V0IGl0LgotCQlpZiAoTUFDX0FERFJfRVFVQUwocEJzcy0+QnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKSkKLQkJCWNvbnRpbnVlOwkgLy8gc2tpcCBjdXJyZW50IEFQCi0JCWlmIChwQnNzLT5Sc3NpIDwgKHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwICsgUlNTSV9ERUxUQSkpCi0JCQljb250aW51ZTsJIC8vIG9ubHkgQVAgd2l0aCBzdHJvbmdlciBSU1NJIGlzIGVsaWdpYmxlIGZvciByb2FtaW5nCi0KLQkJLy8gQVAgcGFzc2luZyBhbGwgYWJvdmUgcnVsZXMgaXMgcHV0IGludG8gcm9hbWluZyBjYW5kaWRhdGUgdGFibGUKLQkJTmRpc01vdmVNZW1vcnkoJnBSb2FtVGFiLT5Cc3NFbnRyeVtwUm9hbVRhYi0+QnNzTnJdLCBwQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCXBSb2FtVGFiLT5Cc3NOciArPSAxOwotCX0KLQotCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQotCXsKLQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKLQkJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCX0KLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvclJvYW1pbmcoIyBvZiBjYW5kaWRhdGU9ICVkKVxuIixwUm9hbVRhYi0+QnNzTnIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgY2hlY2tzIGlmIHRoZXJlJ3JlIG90aGVyIEFQcyBvdXQgdGhlcmUgY2FwYWJsZSBmb3IKLQkJcm9hbWluZy4gQ2FsbGVyIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBvbmx5IHdoZW4gbGluayB1cCBpbiBJTkZSQSBtb2RlCi0JCWFuZCBjaGFubmVsIHF1YWxpdHkgaXMgYmVsb3cgQ1FJX0dPT0RfVEhSRVNIT0xELgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlPdXRwdXQ6Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lQ2hlY2tGb3JGYXN0Um9hbWluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVU0hPUlQJCWk7Ci0JQlNTX1RBQkxFCSpwUm9hbVRhYiA9ICZwQWQtPk1sbWVBdXguUm9hbVRhYjsKLQlCU1NfRU5UUlkJKnBCc3M7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gTWxtZUNoZWNrRm9yRmFzdFJvYW1pbmdcbiIpKTsKLQkvLyBwdXQgYWxsIHJvYW1pbmcgY2FuZGlkYXRlcyBpbnRvIFJvYW1UYWIsIGFuZCBzb3J0IGluIFJTU0kgb3JkZXIKLQlCc3NUYWJsZUluaXQocFJvYW1UYWIpOwotCWZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7Ci0JCXBCc3MgPSAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldOwotCi0gICAgICAgIGlmICgocEJzcy0+UnNzaSA8PSAtNTApICYmIChwQnNzLT5DaGFubmVsID09IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCQkJY29udGludWU7CSAvLyBSU1NJIHRvbyB3ZWFrLiBmb3JnZXQgaXQuCi0JCWlmIChNQUNfQUREUl9FUVVBTChwQnNzLT5Cc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpKQotCQkJY29udGludWU7CSAvLyBza2lwIGN1cnJlbnQgQVAKLQkJaWYgKCFTU0lEX0VRVUFMKHBCc3MtPlNzaWQsIHBCc3MtPlNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pKQotCQkJY29udGludWU7CSAvLyBza2lwIGRpZmZlcmVudCBTU0lECi0gICAgICAgIGlmIChwQnNzLT5Sc3NpIDwgKFJUTVBNYXhSc3NpKHBBZCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMikgKyBSU1NJX0RFTFRBKSkKLQkJCWNvbnRpbnVlOwkgLy8gc2tpcCBBUCB3aXRob3V0IGJldHRlciBSU1NJCi0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTGFzdFJzc2kwID0gJWQsIHBCc3MtPlJzc2kgPSAlZFxuIiwgUlRNUE1heFJzc2kocEFkLCBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMCwgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTEsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKSwgcEJzcy0+UnNzaSkpOwotCQkvLyBBUCBwYXNzaW5nIGFsbCBhYm92ZSBydWxlcyBpcyBwdXQgaW50byByb2FtaW5nIGNhbmRpZGF0ZSB0YWJsZQotCQlOZGlzTW92ZU1lbW9yeSgmcFJvYW1UYWItPkJzc0VudHJ5W3BSb2FtVGFiLT5Cc3NOcl0sIHBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJcFJvYW1UYWItPkJzc05yICs9IDE7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nIChCc3NOcj0lZClcbiIsIHBSb2FtVGFiLT5Cc3NOcikpOwotCWlmIChwUm9hbVRhYi0+QnNzTnIgPiAwKQotCXsKLQkJLy8gY2hlY2sgQ250bE1hY2hpbmUuQ3VyclN0YXRlIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIE5ESVMgU2V0T0lEIHJlcXVlc3QKLQkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPT0gQ05UTF9JRExFKQotCQl7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQgKys7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNTUNISyAtIFJvYW1pbmcgYXR0ZW1wdCAjJWxkXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLlBvb3JDUUlSb2FtaW5nQ291bnQpKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1JPQU1JTkdfUkVRLCAwLCBOVUxMKTsKLQkJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotVk9JRCBNbG1lU2V0VHhSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZCQlwRW50cnksCi0JSU4gUFJUTVBfVFhfUkFURV9TV0lUQ0gJcFR4UmF0ZSkKLXsKLQlVQ0hBUglNYXhNb2RlID0gTU9ERV9PRkRNOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTWF4TW9kZSA9IE1PREVfSFRHUkVFTkZJRUxEOwotCi0JaWYgKHBUeFJhdGUtPlNUQkMgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TVEJDKSAmJiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKSkKLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCi0JaWYgKHBUeFJhdGUtPkN1cnJNQ1MgPCBNQ1NfQVVUTykKLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBUeFJhdGUtPkN1cnJNQ1M7Ci0KLQlpZiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA+IDcpCi0JCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCi0JaWYgKEFESE9DX09OKHBBZCkpCi0JewotCQkvLyBJZiBwZWVyIGFkaG9jIGlzIGItb25seSBtb2RlLCB3ZSBjYW4ndCBzZW5kIDExZyByYXRlLgotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IFNUQkNfTk9ORTsKLQotCQkvLwotCQkvLyBGb3IgQWRob2MgTU9ERV9DQ0ssIGRyaXZlciB3aWxsIHVzZSBBZGhvY0JPbmx5Sm9pbmVkIGZsYWcgdG8gcm9sbCBiYWNrIHRvIEIgb25seSBpZiBuZWNlc3NhcnkKLQkJLy8KLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBUeFJhdGUtPk1vZGU7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSTsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0KLQkJLy8gUGF0Y2ggc3BlZWQgZXJyb3IgaW4gc3RhdHVzIHBhZ2UKLQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCX0KLQllbHNlCi0gICAgewotCQlpZiAocFR4UmF0ZS0+TW9kZSA8PSBNYXhNb2RlKQotCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBUeFJhdGUtPk1vZGU7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSAgICAgICAgaWYgKHBUeFJhdGUtPlNob3J0R0kgJiYgKHBBZC0+U3RhQ2ZnLk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKSkKLQkJCXBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gR0lfNDAwOwotCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvLyBSZWV4YW0gZWFjaCBiYW5kd2lkdGgncyBTR0kgc3VwcG9ydC4KLQkJaWYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID09IEdJXzQwMCkKLQkJewotCQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVyA9PSBCV18yMCkgJiYgKCFDTElFTlRfU1RBVFVTX1RFU1RfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpKSkKLQkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQkJCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuQlcgPT0gQldfNDApICYmICghQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKSkpCi0JCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JCX0KLQotICAgICAgICAvLyBUdXJuIFJUUy9DVFMgcmF0ZSB0byA2TWJwcy4KLQkJaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gMCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gMCkpCi0JCXsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJaWYgKHBBZC0+TWFjVGFiLmZBbnlCQVNlc3Npb24pCi0JCQl7Ci0JCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBIVF9GT1JDRVJUU0NUUywgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgVFJVRSwgKEJPT0xFQU4pcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9PSA4KSAmJiAocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyAhPSA4KSkKLQkJewotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQlpZiAocEFkLT5NYWNUYWIuZkFueUJBU2Vzc2lvbikKLQkJCXsKLQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX0ZPUkNFUlRTQ1RTLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IDApICYmIChwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTID09IDApKQotCQl7Ci0JCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIEhUX1JUU0NUU182TSwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCAoQk9PTEVBTilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50KTsKLQotCQl9Ci0JCWVsc2UgaWYgKChwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgIT0gOCkgJiYgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MgPT0gOCkpCi0JCXsKLQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgSFRfUlRTQ1RTXzZNLCBBTExOX1NFVFBST1RFQ1QsIFRSVUUsIChCT09MRUFOKXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5TVEJDOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwkJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgICAgIGlmICgocEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpICYmCi0gICAgICAgICAgICBwQWQtPldJRkl0ZXN0YmVkLmJHcmVlbkZpZWxkKQotICAgICAgICAgICAgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotICAgIH0KLQotICAgIHBBZC0+TGFzdFR4UmF0ZSA9IChVU0hPUlQpKHBFbnRyeS0+SFRQaHlNb2RlLndvcmQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZSBhY3VtdWxhdGVkIFR4UEVSIG9mIGVheGggVHhSYXRlLiBBbmQKLQkJYWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQsIGNoYW5nZSBDb21tb25DZmcuVHhSYXRlIHdoaWNoCi0JCWlzIHRoZSBzdGFibGUgVFggUmF0ZSB3ZSBleHBlY3QgdGhlIFJhZGlvIHNpdHVhdGlvbiBjb3VsZCBzdXN0YWluZWQuCi0KLQkJQ29tbW9uQ2ZnLlR4UmF0ZSB3aWxsIGNoYW5nZSBkeW5hbWljYWxseSB3aXRoaW4ge1JBVEVfMS9SQVRFXzYsIE1heFR4UmF0ZX0KLQlPdXRwdXQ6Ci0JCUNvbW1vbkNmZy5UeFJhdGUgLQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOT1RFOgotCQljYWxsIHRoaXMgcm91dGluZSBldmVyeSBzZWNvbmQKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSCQkJCQlVcFJhdGVJZHggPSAwLCBEb3duUmF0ZUlkeCA9IDAsIEN1cnJSYXRlSWR4OwotCVVMT05HCQkJCQlpLCBBY2N1VHhUb3RhbENudCA9IDAsIFR4VG90YWxDbnQ7Ci0JVUxPTkcJCQkJCVR4RXJyb3JSYXRpbyA9IDA7Ci0JQk9PTEVBTgkJCQkJYlR4UmF0ZUNoYW5nZWQgPSBGQUxTRSwgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7Ci0JUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKLQlQVUNIQVIJCQkJCXBUYWJsZTsKLQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKLQlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKLQlDSEFSCQkJCQlSc3NpLCBSc3NpT2Zmc2V0ID0gMDsKLQlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOwotCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7Ci0JVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKLQlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OwotCVJTU0lfU0FNUExFCQkJCSpwUnNzaSA9ICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JLy8KLQkvLyB3YWxrIHRocm91Z2ggTUFDIHRhYmxlLCBzZWUgaWYgbmVlZCB0byBjaGFuZ2UgQVAncyBUWCByYXRlIHRvd2FyZCBlYWNoIGVudHJ5Ci0JLy8KLQlmb3IgKGkgPSAxOyBpIDwgTUFYX0xFTl9PRl9NQUNfVEFCTEU7IGkrKykKLQl7Ci0JCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W2ldOwotCi0JLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKLQkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQotCQkJY29udGludWU7Ci0KLQkJaWYgKChwQWQtPk1hY1RhYi5TaXplID09IDEpIHx8IChwRW50cnktPlZhbGlkQXNEbHMpKQotCQl7Ci0JCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMCwKLQkJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTEsCi0JCQkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kyKTsKLQotCQkJLy8gVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVyCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKLQkJCXBBZC0+YlVwZGF0ZUJjbkNudERvbmUgPSBUUlVFOwotCQkJVHhSZXRyYW5zbWl0ID0gU3RhVHgxLmZpZWxkLlR4UmV0cmFuc21pdDsKLQkJCVR4U3VjY2VzcyA9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCVR4VG90YWxDbnQgPSBUeFJldHJhbnNtaXQgKyBUeFN1Y2Nlc3MgKyBUeEZhaWxDb3VudDsKLQotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQkJCXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5GYWlsZWRDb3VudC51Lkxvd1BhcnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCi0JCQkvLyBpZiBubyB0cmFmZmljIGluIHRoZSBwYXN0IDEtc2VjIHBlcmlvZCwgZG9uJ3QgY2hhbmdlIFRYIHJhdGUsCi0JCQkvLyBidXQgY2xlYXIgYWxsIGJhZCBoaXN0b3J5LiBiZWNhdXNlIHRoZSBiYWQgaGlzdG9yeSBtYXkgYWZmZWN0IHRoZSBuZXh0Ci0JCQkvLyBDaGFyaW90IHRocm91Z2hwdXQgdGVzdAotCQkJQWNjdVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCQkJIHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhGYWlsQ291bnQ7Ci0KLQkJCWlmIChUeFRvdGFsQ250KQotCQkJCVR4RXJyb3JSYXRpbyA9ICgoVHhSZXRyYW5zbWl0ICsgVHhGYWlsQ291bnQpICogMTAwKSAvIFR4VG90YWxDbnQ7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoSU5GUkFfT04ocEFkKSAmJiAoaSA9PSAxKSkKLQkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCQkgICBwUnNzaS0+QXZnUnNzaTAsCi0JCQkJCQkJCSAgIHBSc3NpLT5BdmdSc3NpMSwKLQkJCQkJCQkJICAgcFJzc2ktPkF2Z1Jzc2kyKTsKLQkJCWVsc2UKLQkJCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLQotCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OwotCi0JCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0KLQkJaWYgKFR4VG90YWxDbnQpCi0JCXsKLQkJCS8qCi0JCQkJVGhyZWUgQWRIb2MgY29ubmVjdGlvbnMgY2FuIG5vdCB3b3JrIG5vcm1hbGx5IGlmIG9uZSBBZEhvYyBjb25uZWN0aW9uIGlzIGRpc2FwcGVhcmVkIGZyb20gYSBoZWF2eSB0cmFmZmljIGVudmlyb25tZW50IGdlbmVyYXRlZCBieSBwaW5nIHRvb2wKLQkJCQlXZSBmb3JjZSB0byBzZXQgTG9uZ1J0eUxpbWl0IGFuZCBTaG9ydFJ0eUxpbWl0IHRvIDAgdG8gc3RvcCByZXRyYW5zbWl0dGluZyBwYWNrZXQsIGFmdGVyIGEgd2hpbGUsIHJlc29yaW5nIG9yaWdpbmFsIHNldHRpbmdzCi0JCQkqLwotCQkJaWYgKFR4RXJyb3JSYXRpbyA9PSAxMDApCi0JCQl7Ci0JCQkJVFhfUlRZX0NGR19TVFJVQwlUeFJ0eUNmZyxUeFJ0eUNmZ3RtcDsKLQkJCQlVTE9ORwlJbmRleDsKLQkJCQlVTE9ORwlNQUNWYWx1ZTsKLQotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJlR4UnR5Q2ZnLndvcmQpOwotCQkJCVR4UnR5Q2ZndG1wLndvcmQgPSBUeFJ0eUNmZy53b3JkOwotCQkJCVR4UnR5Q2ZnLmZpZWxkLkxvbmdSdHlMaW1pdCA9IDB4MDsKLQkJCQlUeFJ0eUNmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gMHgwOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUWV9DRkcsIFR4UnR5Q2ZnLndvcmQpOwotCi0JCQkJUlRNUHVzZWNEZWxheSgxKTsKLQotCQkJCUluZGV4ID0gMDsKLQkJCQlNQUNWYWx1ZSA9IDA7Ci0JCQkJZG8KLQkJCQl7Ci0JCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhSWFFfUENOVCwgJk1BQ1ZhbHVlKTsKLQkJCQkJaWYgKChNQUNWYWx1ZSAmIDB4ZmZmZmZmKSA9PSAwKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUluZGV4Kys7Ci0JCQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCQkJfXdoaWxlKChJbmRleCA8IDMzMCkmJighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKSk7Ci0KLQkJCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZUeFJ0eUNmZy53b3JkKTsKLQkJCQlUeFJ0eUNmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBUeFJ0eUNmZ3RtcC5maWVsZC5Mb25nUnR5TGltaXQ7Ci0JCQkJVHhSdHlDZmcuZmllbGQuU2hvcnRSdHlMaW1pdCA9IFR4UnR5Q2ZndG1wLmZpZWxkLlNob3J0UnR5TGltaXQ7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRZX0NGRywgVHhSdHlDZmcud29yZCk7Ci0JCQl9Ci0JCX0KLQotCQlDdXJyUmF0ZUlkeCA9IHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4OwotCi0JCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJkluaXRUeFJhdGVJZHgpOwotCi0JCWlmIChDdXJyUmF0ZUlkeCA+PSBUYWJsZVNpemUpCi0JCXsKLQkJCUN1cnJSYXRlSWR4ID0gVGFibGVTaXplIC0gMTsKLQkJfQotCi0JCS8vIFdoZW4gc3dpdGNoIGZyb20gRml4ZWQgcmF0ZSAtPiBhdXRvIHJhdGUsIHRoZSBSRUFMIFRYIHJhdGUgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXguCi0JCS8vIFNvIG5lZWQgdG8gc3luYyBoZXJlLgotCQlwQ3VyclR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsoQ3VyclJhdGVJZHgrMSkqNV07Ci0JCWlmICgocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTICE9IHBDdXJyVHhSYXRlLT5DdXJyTUNTKQotCQkJLy8mJiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCSkKLQkJewotCi0JCQkvLyBOZWVkIHRvIHN5bmMgUmVhbCBUeCByYXRlIGFuZCBvdXIgcmVjb3JkLgotCQkJLy8gVGhlbiByZXR1cm4gZm9yIG5leHQgRFJTLgotCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKEluaXRUeFJhdGVJZHgrMSkqNV07Ci0JCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IEluaXRUeFJhdGVJZHg7Ci0JCQlNbG1lU2V0VHhSYXRlKHBBZCwgcEVudHJ5LCBwQ3VyclR4UmF0ZSk7Ci0KLQkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLy8gZGVjaWRlIHRoZSBuZXh0IHVwZ3JhZGUgcmF0ZSBhbmQgZG93bmdyYWRlIHJhdGUsIGlmIGFueQotCQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKLQkJewotCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHggKyAxOwotCQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKLQkJfQotCQllbHNlIGlmIChDdXJyUmF0ZUlkeCA9PSAwKQotCQl7Ci0JCQlVcFJhdGVJZHggPSBDdXJyUmF0ZUlkeCArIDE7Ci0JCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4OwotCQl9Ci0JCWVsc2UgaWYgKEN1cnJSYXRlSWR4ID09IChUYWJsZVNpemUgLSAxKSkKLQkJewotCQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7Ci0JCQlEb3duUmF0ZUlkeCA9IEN1cnJSYXRlSWR4IC0gMTsKLQkJfQotCi0JCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAoKFJzc2kgPiAtNjUpICYmIChwQ3VyclR4UmF0ZS0+TW9kZSA+PSBNT0RFX0hUTUlYKSkKLQkJewotCQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOwotCQkJVHJhaW5Eb3duCT0gKHBDdXJyVHhSYXRlLT5UcmFpbkRvd24gKyAocEN1cnJUeFJhdGUtPlRyYWluRG93biA+PiAxKSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl7Ci0JCQlUcmFpblVwCQk9IHBDdXJyVHhSYXRlLT5UcmFpblVwOwotCQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKLQkJfQotCi0JCS8vcEFkLT5EcnNDb3VudGVycy5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9IHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsKLQotCQkvLwotCQkvLyBLZWVwIHRoZSBsYXN0IHRpbWUgVHhSYXRlQ2hhbmdlQWN0aW9uIHN0YXR1cy4KLQkJLy8KLQkJcEVudHJ5LT5MYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbiA9IHBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsKLQotCi0KLQkJLy8KLQkJLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKLQkJLy8gICAgICAgICAoY3JpdGVyaWEgY29waWVkIGZyb20gUlQyNTAwIGZvciBOZXRvcGlhIGNhc2UpCi0JCS8vCi0JCWlmIChUeFRvdGFsQ250IDw9IDE1KQotCQl7Ci0JCQlDSEFSCWlkeCA9IDA7Ci0JCQlVQ0hBUglUeFJhdGVJZHg7Ci0JCQlVQ0hBUglNQ1MwID0gMCwgTUNTMSA9IDAsIE1DUzIgPSAwLCBNQ1MzID0gMCwgTUNTNCA9IDAsICBNQ1M1ID0wLCBNQ1M2ID0gMCwgTUNTNyA9IDA7Ci0JICAgICAgICBVQ0hBUglNQ1MxMiA9IDAsIE1DUzEzID0gMCwgTUNTMTQgPSAwLCBNQ1MxNSA9IDA7Ci0JCQlVQ0hBUglNQ1MyMCA9IDAsIE1DUzIxID0gMCwgTUNTMjIgPSAwLCBNQ1MyMyA9IDA7IC8vIDMqMwotCi0JCQkvLyBjaGVjayB0aGUgZXhpc3RlbmNlIGFuZCBpbmRleCBvZiBlYWNoIG5lZWRlZCBNQ1MKLQkJCXdoaWxlIChpZHggPCBwVGFibGVbMF0pCi0JCQl7Ci0JCQkJcEN1cnJUeFJhdGUgPSAoUFJUTVBfVFhfUkFURV9TV0lUQ0gpICZwVGFibGVbKGlkeCsxKSo1XTsKLQotCQkJCWlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMCkKLQkJCQl7Ci0JCQkJCU1DUzAgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xKQotCQkJCXsKLQkJCQkJTUNTMSA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIpCi0JCQkJewotCQkJCQlNQ1MyID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMykKLQkJCQl7Ci0JCQkJCU1DUzMgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU180KQotCQkJCXsKLQkJCQkJTUNTNCA9IGlkeDsKLQkJCQl9Ci0JICAgICAgICAgICAgZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzUpCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICBNQ1M1ID0gaWR4OwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfNikKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIE1DUzYgPSBpZHg7Ci0JICAgICAgICAgICAgfQotCQkJCS8vZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzcpCi0JCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU183KSAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSkJLy8gcHJldmVudCB0aGUgaGlnaGVzdCBNQ1MgdXNpbmcgc2hvcnQgR0kgd2hlbiAxVCBhbmQgbG93IHRocm91Z2hwdXQKLQkJCQl7Ci0JCQkJCU1DUzcgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xMikKLQkJCQl7Ci0JCQkJCU1DUzEyID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMTMpCi0JCQkJewotCQkJCQlNQ1MxMyA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzE0KQotCQkJCXsKLQkJCQkJTUNTMTQgPSBpZHg7Ci0JCQkJfQotCQkJCS8vZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkvKiAmJiAocEN1cnJUeFJhdGUtPlNob3J0R0kgPT0gR0lfODAwKSovKQkvL3dlIGhvcGUgdG8gdXNlIFNob3J0R0kgYXMgaW5pdGlhbCByYXRlCi0JCQkJZWxzZSBpZiAoKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18xNSkgJiYgKHBDdXJyVHhSYXRlLT5TaG9ydEdJID09IEdJXzgwMCkpCS8vd2UgaG9wZSB0byB1c2UgU2hvcnRHSSBhcyBpbml0aWFsIHJhdGUsIGhvd2V2ZXIgQXRoZXJvcydzIGNoaXAgaGFzIGJ1Z3Mgd2hlbiBzaG9ydCBHSQotCQkJCXsKLQkJCQkJTUNTMTUgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMCkgLy8gMyozCi0JCQkJewotCQkJCQlNQ1MyMCA9IGlkeDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEN1cnJUeFJhdGUtPkN1cnJNQ1MgPT0gTUNTXzIxKQotCQkJCXsKLQkJCQkJTUNTMjEgPSBpZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHBDdXJyVHhSYXRlLT5DdXJyTUNTID09IE1DU18yMikKLQkJCQl7Ci0JCQkJCU1DUzIyID0gaWR4OwotCQkJCX0KLQkJCQllbHNlIGlmIChwQ3VyclR4UmF0ZS0+Q3Vyck1DUyA9PSBNQ1NfMjMpCi0JCQkJewotCQkJCQlNQ1MyMyA9IGlkeDsKLQkJCQl9Ci0JCQkJaWR4ICsrOwotCQkJfQotCi0JCQlpZiAocEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KQotCQkJewotCQkJCWlmIChwQWQtPk5pY0NvbmZpZzIuZmllbGQuRXh0ZXJuYWxMTkFGb3JHKQotCQkJCXsKLQkJCQkJUnNzaU9mZnNldCA9IDI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJzc2lPZmZzZXQgPSA1OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yQSkKLQkJCQl7Ci0JCQkJCVJzc2lPZmZzZXQgPSA1OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSc3NpT2Zmc2V0ID0gODsKLQkJCQl9Ci0JCQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvKmlmIChNQ1MxNSkqLwotCQkJaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04zUykgfHwKLQkJCQkocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjNTKSB8fAotCQkJCShwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlKSkKLQkJCXsvLyBOIG1vZGUgd2l0aCAzIHN0cmVhbSAvLyAzKjMKLQkJCQlpZiAoTUNTMjMgJiYgKFJzc2kgPj0gLTcwKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMjM7Ci0JCQkJZWxzZSBpZiAoTUNTMjIgJiYgKFJzc2kgPj0gLTcyKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMjI7Ci0JCSAgICBlbHNlIGlmIChNQ1MyMSAmJiAoUnNzaSA+PSAtNzYpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyMTsKLQkJCQllbHNlIGlmIChNQ1MyMCAmJiAoUnNzaSA+PSAtNzgpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyMDsKLQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPj0gLTgyKSkKLQkJCQlUeFJhdGVJZHggPSBNQ1M0OwotCQkJZWxzZSBpZiAoTUNTMyAmJiAoUnNzaSA+PSAtODQpKQotCQkJCVR4UmF0ZUlkeCA9IE1DUzM7Ci0JCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID49IC04NikpCi0JCQkJVHhSYXRlSWR4ID0gTUNTMjsKLQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPj0gLTg4KSkKLQkJCQlUeFJhdGVJZHggPSBNQ1MxOwotCQkJZWxzZQotCQkJCVR4UmF0ZUlkeCA9IE1DUzA7Ci0JCX0KLS8vCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMlMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yU0ZvckFCYW5kKSB8fChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMlMpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yU0ZvckFCYW5kKSB8fCAocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZSkpCi0JCWVsc2UgaWYgKChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFCR04yUykgfHwgKHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmQpIHx8KHBUYWJsZSA9PSBSYXRlU3dpdGNoVGFibGUxMU4yUykgfHwocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExTjJTRm9yQUJhbmQpKSAvLyAzKjMKLQkJCXsvLyBOIG1vZGUgd2l0aCAyIHN0cmVhbQotCQkJCWlmIChNQ1MxNSAmJiAoUnNzaSA+PSAoLTcwK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTU7Ci0JCQkJZWxzZSBpZiAoTUNTMTQgJiYgKFJzc2kgPj0gKC03MitSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzE0OwotCQkJCWVsc2UgaWYgKE1DUzEzICYmIChSc3NpID49ICgtNzYrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MxMzsKLQkJCQllbHNlIGlmIChNQ1MxMiAmJiAoUnNzaSA+PSAoLTc4K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTI7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+PSAoLTgyK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKLQkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID49ICgtODQrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MzOwotCQkJCWVsc2UgaWYgKE1DUzIgJiYgKFJzc2kgPj0gKC04NitSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzI7Ci0JCQkJZWxzZSBpZiAoTUNTMSAmJiAoUnNzaSA+PSAoLTg4K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKLQkJCQllbHNlCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzA7Ci0JCQl9Ci0JCQllbHNlIGlmICgocFRhYmxlID09IFJhdGVTd2l0Y2hUYWJsZTExQkdOMVMpIHx8IChwVGFibGUgPT0gUmF0ZVN3aXRjaFRhYmxlMTFOMVMpKQotCQkJey8vIE4gbW9kZSB3aXRoIDEgc3RyZWFtCi0JCQkJaWYgKE1DUzcgJiYgKFJzc2kgPiAoLTcyK1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNzsKLQkJCQllbHNlIGlmIChNQ1M2ICYmIChSc3NpID4gKC03NCtSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzY7Ci0JCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+ICgtNzcrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1M1OwotCQkJCWVsc2UgaWYgKE1DUzQgJiYgKFJzc2kgPiAoLTc5K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTNDsKLQkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gKC04MStSc3NpT2Zmc2V0KSkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzM7Ci0JCQkJZWxzZSBpZiAoTUNTMiAmJiAoUnNzaSA+ICgtODMrUnNzaU9mZnNldCkpKQotCQkJCQlUeFJhdGVJZHggPSBNQ1MyOwotCQkJCWVsc2UgaWYgKE1DUzEgJiYgKFJzc2kgPiAoLTg2K1Jzc2lPZmZzZXQpKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKLQkJCQllbHNlCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzA7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl7Ly8gTGVnYWN5IG1vZGUKLQkJCQlpZiAoTUNTNyAmJiAoUnNzaSA+IC03MCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzc7Ci0JCQkJZWxzZSBpZiAoTUNTNiAmJiAoUnNzaSA+IC03NCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzY7Ci0JCQkJZWxzZSBpZiAoTUNTNSAmJiAoUnNzaSA+IC03OCkpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzU7Ci0JCQkJZWxzZSBpZiAoTUNTNCAmJiAoUnNzaSA+IC04MikpCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzQ7Ci0JCQkJZWxzZSBpZiAoTUNTNCA9PSAwKQkvLyBmb3IgQi1vbmx5IG1vZGUKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCQllbHNlIGlmIChNQ1MzICYmIChSc3NpID4gLTg1KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMzsKLQkJCQllbHNlIGlmIChNQ1MyICYmIChSc3NpID4gLTg3KSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMjsKLQkJCQllbHNlIGlmIChNQ1MxICYmIChSc3NpID4gLTkwKSkKLQkJCQkJVHhSYXRlSWR4ID0gTUNTMTsKLQkJCQllbHNlCi0JCQkJCVR4UmF0ZUlkeCA9IE1DUzA7Ci0JCQl9Ci0KLQkvLwkJaWYgKFR4UmF0ZUlkeCAhPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCkKLQkJCXsKLQkJCQlwRW50cnktPkN1cnJUeFJhdGVJbmRleCA9IFR4UmF0ZUlkeDsKLQkJCQlwTmV4dFR4UmF0ZSA9IChQUlRNUF9UWF9SQVRFX1NXSVRDSCkgJnBUYWJsZVsocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgrMSkqNV07Ci0JCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwotCQkJfQotCi0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCQlOZGlzWmVyb01lbW9yeShwRW50cnktPlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQkJCXBFbnRyeS0+Zkxhc3RTZWNBY2NvcmRpbmdSU1NJID0gVFJVRTsKLQkJCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotCQkJUkVTRVRfT05FX1NFQ19UWF9DTlQocEVudHJ5KTsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAocEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPT0gVFJVRSkKLQkJewotCQkJcEVudHJ5LT5mTGFzdFNlY0FjY29yZGluZ1JTU0kgPSBGQUxTRTsKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7Ci0JCQkvLyByZXNldCBhbGwgT25lU2VjVHggY291bnRlcnMKLQkJCVJFU0VUX09ORV9TRUNfVFhfQ05UKHBFbnRyeSk7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZG8KLQkJewotCQkJQk9PTEVBTgliVHJhaW5VcERvd24gPSBGQUxTRTsKLQotCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSArKzsKLQotCQkJLy8gZG93bmdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSID49IFJhdGUtRG93biB0aHJlc2hvbGQKLQkJCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQotCQkJewotCQkJCWJUcmFpblVwRG93biA9IFRSVUU7Ci0JCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7Ci0JCQl9Ci0JCQkvLyB1cGdyYWRlIFRYIHF1YWxpdHkgaWYgUEVSIDw9IFJhdGUtVXAgdGhyZXNob2xkCi0JCQllbHNlIGlmIChUeEVycm9yUmF0aW8gPD0gVHJhaW5VcCkKLQkJCXsKLQkJCQliVHJhaW5VcERvd24gPSBUUlVFOwotCQkJCWJVcGdyYWRlUXVhbGl0eSA9IFRSVUU7Ci0JCQkJaWYgKHBFbnRyeS0+VHhRdWFsaXR5W0N1cnJSYXRlSWR4XSkKLQkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdIC0tOyAgLy8gcXVhbGl0eSB2ZXJ5IGdvb2QgaW4gQ3VyclJhdGUKLQotCQkJCWlmIChwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSkKLQkJCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgLS07Ci0JCQkJZWxzZSBpZiAocEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSkKLQkJCQkJcEVudHJ5LT5UeFF1YWxpdHlbVXBSYXRlSWR4XSAtLTsgICAgLy8gbWF5IGltcHJvdmUgbmV4dCBVUCByYXRlJ3MgcXVhbGl0eQotCQkJfQotCi0JCQlwRW50cnktPlBFUltDdXJyUmF0ZUlkeF0gPSAoVUNIQVIpVHhFcnJvclJhdGlvOwotCi0JCQlpZiAoYlRyYWluVXBEb3duKQotCQkJewotCQkJCS8vIHBlcmZvcm0gRFJTIC0gY29uc2lkZXIgVHhSYXRlIERvd24gZmlyc3QsIHRoZW4gcmF0ZSB1cC4KLQkJCQlpZiAoKEN1cnJSYXRlSWR4ICE9IERvd25SYXRlSWR4KSAmJiAocEVudHJ5LT5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID49IERSU19UWF9RVUFMSVRZX1dPUlNUX0JPVU5EKSkKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChDdXJyUmF0ZUlkeCAhPSBVcFJhdGVJZHgpICYmIChwRW50cnktPlR4UXVhbGl0eVtVcFJhdGVJZHhdIDw9IDApKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlIChGQUxTRSk7Ci0KLQkJLy8gaWYgcmF0ZS11cCBoYXBwZW4sIGNsZWFyIGFsbCBiYWQgaGlzdG9yeSBvZiBhbGwgVFggcmF0ZXMKLQkJaWYgKHBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4ID4gQ3VyclJhdGVJZHgpCi0JCXsKLQkJCXBFbnRyeS0+Q3VyclR4UmF0ZVN0YWJsZVRpbWUgPSAwOwotCQkJcEVudHJ5LT5UeFJhdGVVcFBlbmFsdHkgPSAwOwotCQkJcEVudHJ5LT5MYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uID0gMTsgLy8gcmF0ZSBVUAotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LT5QRVIsIHNpemVvZihVQ0hBUikgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0KLQkJCS8vCi0JCQkvLyBGb3IgVHhSYXRlIGZhc3QgdHJhaW4gdXAKLQkJCS8vCi0JCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKLQkJCXsKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOwotCi0JCQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gVFJVRTsKLQkJCX0KLQkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKLQkJfQotCQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKLQkJZWxzZSBpZiAocEVudHJ5LT5DdXJyVHhSYXRlSW5kZXggPCBDdXJyUmF0ZUlkeCkKLQkJewotCQkJcEVudHJ5LT5DdXJyVHhSYXRlU3RhYmxlVGltZSA9IDA7Ci0JCQlwRW50cnktPlR4UmF0ZVVwUGVuYWx0eSA9IDA7ICAgICAgICAgICAvLyBubyBwZW5hbHR5Ci0JCQlwRW50cnktPkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPSAyOyAvLyByYXRlIERPV04KLQkJCXBFbnRyeS0+VHhRdWFsaXR5W3BFbnRyeS0+Q3VyclR4UmF0ZUluZGV4XSA9IDA7Ci0JCQlwRW50cnktPlBFUltwRW50cnktPkN1cnJUeFJhdGVJbmRleF0gPSAwOwotCi0JCQkvLwotCQkJLy8gRm9yIFR4UmF0ZSBmYXN0IHRyYWluIGRvd24KLQkJCS8vCi0JCQlpZiAoIXBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyUnVubmluZykKLQkJCXsKLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLlN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcFRpbWVyLCAxMDApOwotCi0JCQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gVFJVRTsKLQkJCX0KLQkJCWJUeFJhdGVDaGFuZ2VkID0gVFJVRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeS0+TGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9IDA7IC8vIHJhdGUgbm8gY2hhbmdlCi0JCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOwotCQl9Ci0KLQkJcEVudHJ5LT5MYXN0VHhPa0NvdW50ID0gVHhTdWNjZXNzOwotCi0JCXsKLQkJCVVDSEFSIHRtcFR4UmF0ZTsKLQotCQkJLy8gdG8gZml4IHRjcCBhY2sgaXNzdWUKLQkJCWlmICghYlR4UmF0ZUNoYW5nZWQgJiYgKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUmVjZWl2ZWRCeXRlQ291bnQgPiAocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUcmFuc21pdHRlZEJ5dGVDb3VudCAqIDUpKSkKLQkJCXsKLQkJCQl0bXBUeFJhdGUgPSBEb3duUmF0ZUlkeDsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJEUlM6IFJ4KCVkKSBpcyA1IHRpbWVzIGxhcmdlciB0aGFuIFR4KCVkKSwgdXNlIGxvdyByYXRlIChjdXJyPSVkLCB0bXA9JWQpXG4iLAotCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50LCBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1RyYW5zbWl0dGVkQnl0ZUNvdW50LCBwRW50cnktPkN1cnJUeFJhdGVJbmRleCwgdG1wVHhSYXRlKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdG1wVHhSYXRlID0gcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXg7Ci0JCQl9Ci0KLQkJCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyh0bXBUeFJhdGUrMSkqNV07Ci0JCQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCi0JCQl7Ci0JCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwotCQkJfQotCQl9Ci0JCS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotCQlSRVNFVF9PTkVfU0VDX1RYX0NOVChwRW50cnkpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTdGF0aW9uIHNpZGUsIEF1dG8gVHhSYXRlIGZhc3RlciB0cmFpbiB1cCB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCi0KLQlBcmd1bWVudHM6Ci0JCVN5c3RlbVNwZWNpZmljMQkJCS0gTm90IHVzZWQuCi0JCUZ1bmN0aW9uQ29udGV4dAkJCS0gUG9pbnRlciB0byBvdXIgQWRhcHRlciBjb250ZXh0LgotCQlTeXN0ZW1TcGVjaWZpYzIJCQktIE5vdCB1c2VkLgotCQlTeXN0ZW1TcGVjaWZpYzMJCQktIE5vdCB1c2VkLgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVBSVE1QX0FEQVBURVIJCQlwQWQgPSAoUFJUTVBfQURBUFRFUilGdW5jdGlvbkNvbnRleHQ7Ci0JVUNIQVIJCQkJCVVwUmF0ZUlkeCA9IDAsIERvd25SYXRlSWR4ID0gMCwgQ3VyclJhdGVJZHggPSAwOwotCVVMT05HCQkJCQlUeFRvdGFsQ250OwotCVVMT05HCQkJCQlUeEVycm9yUmF0aW8gPSAwOwotCUJPT0xFQU4JCQkJCWJUeFJhdGVDaGFuZ2VkOyAvLywgYlVwZ3JhZGVRdWFsaXR5ID0gRkFMU0U7Ci0JUFJUTVBfVFhfUkFURV9TV0lUQ0gJcEN1cnJUeFJhdGUsIHBOZXh0VHhSYXRlID0gTlVMTDsKLQlQVUNIQVIJCQkJCXBUYWJsZTsKLQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKLQlVQ0hBUgkJCQkJSW5pdFR4UmF0ZUlkeCA9IDAsIFRyYWluVXAsIFRyYWluRG93bjsKLQlUWF9TVEFfQ05UMV9TVFJVQwkJU3RhVHgxOwotCVRYX1NUQV9DTlQwX1NUUlVDCQlUeFN0YUNudDA7Ci0JQ0hBUgkJCQkJUnNzaSwgcmF0aW87Ci0JVUxPTkcJCQkJCVR4UmV0cmFuc21pdCA9IDAsIFR4U3VjY2VzcyA9IDAsIFR4RmFpbENvdW50ID0gMDsKLQlNQUNfVEFCTEVfRU5UUlkJCQkqcEVudHJ5OwotCVVMT05HCQkJCQlpOwotCi0JcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0KLSAgICAvLwotICAgIC8vIHdhbGsgdGhyb3VnaCBNQUMgdGFibGUsIHNlZSBpZiBuZWVkIHRvIGNoYW5nZSBBUCdzIFRYIHJhdGUgdG93YXJkIGVhY2ggZW50cnkKLSAgICAvLwotCWZvciAoaSA9IDE7IGkgPCBNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbaV07Ci0KLQkJLy8gY2hlY2sgaWYgdGhpcyBlbnRyeSBuZWVkIHRvIHN3aXRjaCByYXRlIGF1dG9tYXRpY2FsbHkKLQkJaWYgKFJUTVBDaGVja0VudHJ5RW5hYmxlQXV0b1JhdGVTd2l0Y2gocEFkLCBwRW50cnkpID09IEZBTFNFKQotCQkJY29udGludWU7Ci0KLQkJaWYgKElORlJBX09OKHBBZCkgJiYgKGkgPT0gMSkpCi0JCQlSc3NpID0gUlRNUE1heFJzc2kocEFkLAotCQkJCQkJCSAgIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJICAgcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMSwKLQkJCQkJCQkgICBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLQkJZWxzZQotCQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwKLQkJCQkJCQkgICBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTAsCi0JCQkJCQkJICAgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxLAotCQkJCQkJCSAgIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMik7Ci0KLQlDdXJyUmF0ZUlkeCA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4OwotCi0JCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZJbml0VHhSYXRlSWR4KTsKLQotCS8vIGRlY2lkZSB0aGUgbmV4dCB1cGdyYWRlIHJhdGUgYW5kIGRvd25ncmFkZSByYXRlLCBpZiBhbnkKLQlpZiAoKEN1cnJSYXRlSWR4ID4gMCkgJiYgKEN1cnJSYXRlSWR4IDwgKFRhYmxlU2l6ZSAtIDEpKSkKLQl7Ci0JCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKLQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeCAtMTsKLQl9Ci0JZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gMCkKLQl7Ci0JCVVwUmF0ZUlkeCA9IEN1cnJSYXRlSWR4ICsgMTsKLQkJRG93blJhdGVJZHggPSBDdXJyUmF0ZUlkeDsKLQl9Ci0JZWxzZSBpZiAoQ3VyclJhdGVJZHggPT0gKFRhYmxlU2l6ZSAtIDEpKQotCXsKLQkJVXBSYXRlSWR4ID0gQ3VyclJhdGVJZHg7Ci0JCURvd25SYXRlSWR4ID0gQ3VyclJhdGVJZHggLSAxOwotCX0KLQotCXBDdXJyVHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhDdXJyUmF0ZUlkeCsxKSo1XTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmICgoUnNzaSA+IC02NSkgJiYgKHBDdXJyVHhSYXRlLT5Nb2RlID49IE1PREVfSFRNSVgpKQotCXsKLQkJVHJhaW5VcAkJPSAocEN1cnJUeFJhdGUtPlRyYWluVXAgKyAocEN1cnJUeFJhdGUtPlRyYWluVXAgPj4gMSkpOwotCQlUcmFpbkRvd24JPSAocEN1cnJUeFJhdGUtPlRyYWluRG93biArIChwQ3VyclR4UmF0ZS0+VHJhaW5Eb3duID4+IDEpKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCXsKLQkJVHJhaW5VcAkJPSBwQ3VyclR4UmF0ZS0+VHJhaW5VcDsKLQkJVHJhaW5Eb3duCT0gcEN1cnJUeFJhdGUtPlRyYWluRG93bjsKLQl9Ci0KLQkJaWYgKHBBZC0+TWFjVGFiLlNpemUgPT0gMSkKLQkJewotCS8vIFVwZGF0ZSBzdGF0aXN0aWMgY291bnRlcgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDAsICZUeFN0YUNudDAud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMSwgJlN0YVR4MS53b3JkKTsKLQotCVR4UmV0cmFuc21pdCA9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JVHhTdWNjZXNzID0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlUeEZhaWxDb3VudCA9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQlUeFRvdGFsQ250ID0gVHhSZXRyYW5zbWl0ICsgVHhTdWNjZXNzICsgVHhGYWlsQ291bnQ7Ci0KLQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4UmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFJldHJhbnNtaXQ7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQudS5Mb3dQYXJ0ICs9IFN0YVR4MS5maWVsZC5UeFN1Y2Nlc3M7Ci0JCQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCQkJcEFkLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0ICs9IFR4U3RhQ250MC5maWVsZC5UeEZhaWxDb3VudDsKLQotCWlmIChUeFRvdGFsQ250KQotCQlUeEVycm9yUmF0aW8gPSAoKFR4UmV0cmFuc21pdCArIFR4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0JCWVsc2UKLQkJewotCQkJVHhUb3RhbENudCA9IHBFbnRyeS0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArCi0JCQkJIHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKwotCQkJCSBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50OwotCi0JCQlpZiAoVHhUb3RhbENudCkKLQkJCQlUeEVycm9yUmF0aW8gPSAoKHBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKyBwRW50cnktPk9uZVNlY1R4RmFpbENvdW50KSAqIDEwMCkgLyBUeFRvdGFsQ250OwotCQl9Ci0KLQotCS8vCi0JLy8gQ0FTRSAxLiB3aGVuIFRYIHNhbXBsZXMgYXJlIGZld2VyIHRoYW4gMTUsIHRoZW4gZGVjaWRlIFRYIHJhdGUgc29sZWx5IG9uIFJTU0kKLQkvLyAgICAgICAgIChjcml0ZXJpYSBjb3BpZWQgZnJvbSBSVDI1MDAgZm9yIE5ldG9waWEgY2FzZSkKLQkvLwotCWlmIChUeFRvdGFsQ250IDw9IDEyKQotCXsKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHksIHNpemVvZihVU0hPUlQpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlBFUiwgc2l6ZW9mKFVDSEFSKSAqIE1BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIKTsKLQotCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA9IERvd25SYXRlSWR4OwotCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAyKSAmJiAoQ3VyclJhdGVJZHggIT0gVXBSYXRlSWR4KSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlSW5kZXggPSBVcFJhdGVJZHg7Ci0JCX0KLQotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJRdWlja0RSUzogVHhUb3RhbENudCA8PSAxNSwgdHJhaW4gYmFjayB0byBvcmlnaW5hbCByYXRlIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JZG8KLQl7Ci0JCVVMT05HIE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQ7Ci0KLQkJaWYgKHBBZC0+RHJzQ291bnRlcnMuTGFzdFRpbWVUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMCkKLQkJCXJhdGlvID0gNTsKLQkJZWxzZQotCQkJcmF0aW8gPSA0OwotCi0JCS8vIGRvd25ncmFkZSBUWCBxdWFsaXR5IGlmIFBFUiA+PSBSYXRlLURvd24gdGhyZXNob2xkCi0JCWlmIChUeEVycm9yUmF0aW8gPj0gVHJhaW5Eb3duKQotCQl7Ci0JCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtDdXJyUmF0ZUlkeF0gPSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORDsKLQkJfQotCi0JCXBBZC0+RHJzQ291bnRlcnMuUEVSW0N1cnJSYXRlSWR4XSA9IChVQ0hBUilUeEVycm9yUmF0aW87Ci0KLQkJT25lU2VjVHhOb1JldHJ5T0tSYXRpb25Db3VudCA9IChUeFN1Y2Nlc3MgKiByYXRpbyk7Ci0KLQkJLy8gcGVyZm9ybSBEUlMgLSBjb25zaWRlciBUeFJhdGUgRG93biBmaXJzdCwgdGhlbiByYXRlIHVwLgotCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbiA9PSAxKSAmJiAoQ3VyclJhdGVJZHggIT0gRG93blJhdGVJZHgpKQotCQl7Ci0JCQlpZiAoKHBBZC0+RHJzQ291bnRlcnMuTGFzdFR4T2tDb3VudCArIDIpID49IE9uZVNlY1R4Tm9SZXRyeU9LUmF0aW9uQ291bnQpCi0JCXsKLQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gRG93blJhdGVJZHg7Ci0JCQkJcEFkLT5EcnNDb3VudGVycy5UeFF1YWxpdHlbQ3VyclJhdGVJZHhdID0gRFJTX1RYX1FVQUxJVFlfV09SU1RfQk9VTkQ7Ci0KLQkJCX0KLQotCQl9Ci0JCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb24gPT0gMikgJiYgKEN1cnJSYXRlSWR4ICE9IFVwUmF0ZUlkeCkpCi0JCXsKLQkJCWlmICgoVHhFcnJvclJhdGlvID49IDUwKSB8fCAoVHhFcnJvclJhdGlvID49IFRyYWluRG93bikpCi0JCQl7Ci0KLQkJCX0KLQkJCWVsc2UgaWYgKChwQWQtPkRyc0NvdW50ZXJzLkxhc3RUeE9rQ291bnQgKyAyKSA+PSBPbmVTZWNUeE5vUmV0cnlPS1JhdGlvbkNvdW50KQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gVXBSYXRlSWR4OwotCQkJfQotCQl9Ci0JfXdoaWxlIChGQUxTRSk7Ci0KLQkvLyBpZiByYXRlLXVwIGhhcHBlbiwgY2xlYXIgYWxsIGJhZCBoaXN0b3J5IG9mIGFsbCBUWCByYXRlcwotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA+IEN1cnJSYXRlSWR4KQotCXsKLQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOwotCQlOZGlzWmVyb01lbW9yeShwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eSwgc2l6ZW9mKFVTSE9SVCkgKiBNQVhfU1RFUF9PRl9UWF9SQVRFX1NXSVRDSCk7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+RHJzQ291bnRlcnMuUEVSLCBzaXplb2YoVUNIQVIpICogTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gpOwotCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCX0KLQkvLyBpZiByYXRlLWRvd24gaGFwcGVuLCBvbmx5IGNsZWFyIERvd25SYXRlJ3MgYmFkIGhpc3RvcnkKLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCA8IEN1cnJSYXRlSWR4KQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCgiUXVpY2tEUlM6IC0tVFggcmF0ZSBmcm9tICVkIHRvICVkIFxuIiwgQ3VyclJhdGVJZHgsIHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KSk7Ci0KLQkJcEFkLT5EcnNDb3VudGVycy5UeFJhdGVVcFBlbmFsdHkgPSAwOyAgICAgICAgICAgLy8gbm8gcGVuYWx0eQotCQlwQWQtPkRyc0NvdW50ZXJzLlR4UXVhbGl0eVtwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOwotCQlwQWQtPkRyc0NvdW50ZXJzLlBFUltwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleF0gPSAwOwotCQkJYlR4UmF0ZUNoYW5nZWQgPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQliVHhSYXRlQ2hhbmdlZCA9IEZBTFNFOwotCX0KLQotCXBOZXh0VHhSYXRlID0gKFBSVE1QX1RYX1JBVEVfU1dJVENIKSAmcFRhYmxlWyhwQWQtPkNvbW1vbkNmZy5UeFJhdGVJbmRleCsxKSo1XTsKLQlpZiAoYlR4UmF0ZUNoYW5nZWQgJiYgcE5leHRUeFJhdGUpCi0JewotCQkJTWxtZVNldFR4UmF0ZShwQWQsIHBFbnRyeSwgcE5leHRUeFJhdGUpOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRoaXMgcm91dGluZSBpcyBleGVjdXRlZCBwZXJpb2RpY2FsbHkgaW5zaWRlIE1sbWVQZXJpb2RpY0V4ZWMoKSBhZnRlcgotCQlhc3NvY2lhdGlvbiB3aXRoIGFuIEFQLgotCQlJdCBjaGVja3MgaWYgU3RhQ2ZnLlBzbSBpcyBjb25zaXN0ZW50IHdpdGggdXNlciBwb2xpY3kgKHJlY29yZGVkIGluCi0JCVN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKS4gSWYgbm90LCBlbmZvcmNlIHVzZXIgcG9saWN5LiBIb3dldmVyLAotCQl0aGVyZSdyZSBzb21lIGNvbmRpdGlvbnMgdG8gY29uc2lkZXI6Ci0JCTEuIHdlIGRvbid0IHN1cHBvcnQgcG93ZXItc2F2aW5nIGluIEFESE9DIG1vZGUsIHNvIFBzbT1QV1JfQUNUSVZFIGFsbAotCQkgICB0aGUgdGltZSB3aGVuIE1pYnNzPT1UUlVFCi0JCTIuIFdoZW4gbGluayB1cCBpbiBJTkZSQSBtb2RlLCBQc20gc2hvdWxkIG5vdCBiZSBzd2l0Y2ggdG8gUFdSX1NBVkUKLQkJICAgaWYgb3V0Z29pbmcgdHJhZmZpYyBhdmFpbGFibGUgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLgotCU91dHB1dDoKLQkJMS4gY2hhbmdlIHBBZC0+U3RhQ2ZnLlBzbSB0byBQV1JfU0FWRSBvciBsZWF2ZSBpdCB1bnRvdWNoZWQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQ2hlY2tQc21DaGFuZ2UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcJTm93MzIpCi17Ci0JVUxPTkcJUG93ZXJNb2RlOwotCi0JLy8gY29uZGl0aW9uIC0KLQkvLyAxLiBQc20gbWF5YmUgT04gb25seSBoYXBwZW4gaW4gSU5GUkFTVFJVQ1RVUkUgbW9kZQotCS8vIDIuIHVzZXIgd2FudHMgZWl0aGVyIE1BWF9QU1Agb3IgRkFTVF9QU1AKLQkvLyAzLiBidXQgY3VycmVudCBwc20gaXMgbm90IGluIFBXUl9TQVZFCi0JLy8gNC4gQ05UTCBzdGF0ZSBtYWNoaW5lIGlzIG5vdCBkb2luZyBTQ0FObmluZwotCS8vIDUuIG5vIFRYIFNVQ0NFU1MgZXZlbnQgZm9yIHRoZSBwYXN0IDEtc2VjIHBlcmlvZAotCVBvd2VyTW9kZSA9IHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGU7Ci0KLQlpZiAoSU5GUkFfT04ocEFkKSAmJgotCQkoUG93ZXJNb2RlICE9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU0pICYmCi0JCShwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX0FDVElWRSkgJiYKLS8vCQkoISBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotCQkocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9PSBDTlRMX0lETEUpJiYKLQkJUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCkKLQkJIC8qJiYKLQkJKHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhOb1JldHJ5T2tDb3VudCA9PSAwKSAmJgotCQkocEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCA9PSAwKSovKQotCXsKLQkJTmRpc0dldFN5c3RlbVVwVGltZSgmcEFkLT5NbG1lLkxhc3RTZW5kTlVMTHBzbVRpbWUpOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMID0gMDsKLQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9TQVZFKTsKLQkJaWYgKCEocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlKSkKLQkJewotCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUsIEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLQkJfQotCX0KLX0KLQotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lU2V0UHNtQml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBwc20pCi17Ci0JQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7Ci0KLQlwQWQtPlN0YUNmZy5Qc20gPSBwc207Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBBVVRPX1JTUF9DRkcsICZjc3I0LndvcmQpOwotCWNzcjQuZmllbGQuQWNrQ3RzUHNtQml0ID0gKHBzbSA9PSBQV1JfU0FWRSk/IDE6MDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1JTUF9DRkcsIGNzcjQud29yZCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFBzbUJpdCA9ICVkXG4iLCBwc20pKTsKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUaGlzIHJvdXRpbmUgY2FsY3VsYXRlcyBUeFBFUiwgUnhQRVIgb2YgdGhlIHBhc3QgTi1zZWMgcGVyaW9kLiBBbmQKLQkJYWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQsIENoYW5uZWxRdWFsaXR5IGlzIGNhbGN1bGF0ZWQgaGVyZQotCQl0byBkZWNpZGUgaWYgY3VycmVudCBBUCBpcyBzdGlsbCBkb2luZyB0aGUgam9iLgotCi0JCUlmIENoYW5uZWxRdWFsaXR5IGlzIG5vdCBnb29kLCBhIFJPQU1pbmcgYXR0ZW1wdCBtYXkgYmUgdHJpZWQgbGF0ZXIuCi0JT3V0cHV0OgotCQlTdGFDZmcuQ2hhbm5lbFF1YWxpdHkgLSAwLi4xMDAKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTk9URTogVGhpcyByb3V0aW5lIGRlY2lkZSBjaGFubmxlIHF1YWxpdHkgYmFzZWQgb24gUlggQ1JDIGVycm9yIHJhdGlvLgotCQlDYWxsZXIgc2hvdWxkIG1ha2Ugc3VyZSBhIGZ1bmN0aW9uIGNhbGwgdG8gTklDVXBkYXRlUmF3Q291bnRlcnMocEFkKQotCQlpcyBwZXJmb3JtZWQgcmlnaHQgYmVmb3JlIHRoaXMgcm91dGluZSwgc28gdGhhdCB0aGlzIHJvdXRpbmUgY2FuIGRlY2lkZQotCQljaGFubmVsIHF1YWxpdHkgYmFzZWQgb24gdGhlIG1vc3QgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUNhbGN1bGF0ZUNoYW5uZWxRdWFsaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkgcE1hY0VudHJ5LAotCUlOIFVMT05HIE5vdzMyKQotewotCVVMT05HIFR4T2tDbnQsIFR4Q250LCBUeFBFUiwgVHhQUlI7Ci0JVUxPTkcgUnhDbnQsIFJ4UEVSOwotCVVDSEFSIE5vclJzc2k7Ci0JQ0hBUiAgTWF4UnNzaTsKLQlSU1NJX1NBTVBMRSAqcFJzc2lTYW1wbGUgPSBOVUxMOwotCVVJTlQzMiBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsKLQlVSU5UMzIgT25lU2VjVHhSZXRyeU9rQ291bnQgPSAwOwotCVVJTlQzMiBPbmVTZWNUeEZhaWxDb3VudCA9IDA7Ci0JVUlOVDMyIE9uZVNlY1J4T2tDbnQgPSAwOwotCVVJTlQzMiBPbmVTZWNSeEZjc0VyckNudCA9IDA7Ci0JVUxPTkcgQ2hhbm5lbFF1YWxpdHkgPSAwOyAgLy8gMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVMT05HIEJlYWNvbkxvc3RUaW1lID0gcEFkLT5TdGFDZmcuQmVhY29uTG9zdFRpbWU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vIFJvZ2VyIHN5bmMgQ2FycmllcgotCS8vIGxvbmdlciBiZWFjb24gbG9zdCB0aW1lIHdoZW4gY2FycmllciBkZXRlY3Rpb24gZW5hYmxlZAotCWlmIChwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9PSBUUlVFKQotCXsKLQkJQmVhY29uTG9zdFRpbWUgPSBwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSArIChwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZS8yKTsKLQl9Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JewotCQlwUnNzaVNhbXBsZSA9ICZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlOwotCQlPbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeE5vUmV0cnlPa0NvdW50OwotCQlPbmVTZWNUeFJldHJ5T2tDb3VudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JCU9uZVNlY1R4RmFpbENvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeEZhaWxDb3VudDsKLQkJT25lU2VjUnhPa0NudCA9IHBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjUnhPa0NudDsKLQkJT25lU2VjUnhGY3NFcnJDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1J4RmNzRXJyQ250OwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCU1heFJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIHBSc3NpU2FtcGxlLT5MYXN0UnNzaTAsCi0JCQkJCQkJCXBSc3NpU2FtcGxlLT5MYXN0UnNzaTEsCi0JCQkJCQkJCXBSc3NpU2FtcGxlLT5MYXN0UnNzaTIpOwotCi0JLy8KLQkvLyBjYWxjdWxhdGUgVFggcGFja2V0IGVycm9yIHJhdGlvIGFuZCBUWCByZXRyeSByYXRpbyAtIGlmIHRvbyBmZXcgVFggc2FtcGxlcywgc2tpcCBUWCByZWxhdGVkIHN0YXRpc3RpY3MKLQkvLwotCVR4T2tDbnQgPSBPbmVTZWNUeE5vUmV0cnlPa0NvdW50ICsgT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVHhDbnQgPSBUeE9rQ250ICsgT25lU2VjVHhGYWlsQ291bnQ7Ci0JaWYgKFR4Q250IDwgNSkKLQl7Ci0JCVR4UEVSID0gMDsKLQkJVHhQUlIgPSAwOwotCX0KLQllbHNlCi0JewotCQlUeFBFUiA9IChPbmVTZWNUeEZhaWxDb3VudCAqIDEwMCkgLyBUeENudDsKLQkJVHhQUlIgPSAoKFR4Q250IC0gT25lU2VjVHhOb1JldHJ5T2tDb3VudCkgKiAxMDApIC8gVHhDbnQ7Ci0JfQotCi0JLy8KLQkvLyBjYWxjdWxhdGUgUlggUEVSIC0gZG9uJ3QgdGFrZSBSeFBFUiBpbnRvIGNvbnNpZGVyYXRpb24gaWYgdG9vIGZldyBzYW1wbGUKLQkvLwotCVJ4Q250ID0gT25lU2VjUnhPa0NudCArIE9uZVNlY1J4RmNzRXJyQ250OwotCWlmIChSeENudCA8IDUpCi0JCVJ4UEVSID0gMDsKLQllbHNlCi0JCVJ4UEVSID0gKE9uZVNlY1J4RmNzRXJyQ250ICogMTAwKSAvIFJ4Q250OwotCi0JLy8KLQkvLyBkZWNpZGUgQ2hhbm5lbFF1YWxpdHkgYmFzZWQgb246IDEpbGFzdCBCRUFDT04gcmVjZWl2ZWQgdGltZSwgMilsYXN0IFJTU0ksIDMpVHhQRVIsIGFuZCA0KVJ4UEVSCi0JLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmCi0JCUlORlJBX09OKHBBZCkgJiYKLQkJKE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgPCAyKSAmJiAvLyBubyBoZWF2eSB0cmFmZmljCi0JCSgocEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSArIEJlYWNvbkxvc3RUaW1lKSA8IE5vdzMyKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJFQUNPTiBsb3N0ID4gJWxkIG1zZWMgd2l0aCBUeE9rQ250PSVsZCAtPiBDUUk9MFxuIiwgQmVhY29uTG9zdFRpbWUsIFR4T2tDbnQpKTsKLQkJQ2hhbm5lbFF1YWxpdHkgPSAwOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQkvLyBOb3JtYWxpemUgUnNzaQotCQlpZiAoTWF4UnNzaSA+IC00MCkKLQkJCU5vclJzc2kgPSAxMDA7Ci0JCWVsc2UgaWYgKE1heFJzc2kgPCAtOTApCi0JCQlOb3JSc3NpID0gMDsKLQkJZWxzZQotCQkJTm9yUnNzaSA9IChNYXhSc3NpICsgOTApICogMjsKLQotCQkvLyBDaGFubmVsUXVhbGl0eSA9IFcxKlJTU0kgKyBXMipUeFBSUiArIFczKlJ4UEVSCSAoUlNTSSAwLi4xMDApLCAoVHhQRVIgMTAwLi4wKSwgKFJ4UEVSIDEwMC4uMCkKLQkJQ2hhbm5lbFF1YWxpdHkgPSAoUlNTSV9XRUlHSFRJTkcgKiBOb3JSc3NpICsKLQkJCQkJCQkJICAgVFhfV0VJR0hUSU5HICogKDEwMCAtIFR4UFJSKSArCi0JCQkJCQkJCSAgIFJYX1dFSUdIVElORyogKDEwMCAtIFJ4UEVSKSkgLyAxMDA7Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQkJcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gKENoYW5uZWxRdWFsaXR5ID4gMTAwKSA/IDEwMCA6IENoYW5uZWxRdWFsaXR5OwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLX0KLQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgTWxtZVNldFR4UHJlYW1ibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUIFR4UHJlYW1ibGUpCi17Ci0JQVVUT19SU1BfQ0ZHX1NUUlVDIGNzcjQ7Ci0KLQkvLwotCS8vIEFsd2F5cyB1c2UgTG9uZyBwcmVhbWJsZSBiZWZvcmUgdmVyaWZpYXRpb24gc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcyB3ZWxsLgotCS8vIFRvZG86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgaWYgc2hvcnQgcHJlYW1ibGUgZnVuY3Rpb25hbGl0eSB3b3JrcwotCS8vCi0JLy9UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUxvbmc7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVVE9fUlNQX0NGRywgJmNzcjQud29yZCk7Ci0JaWYgKFR4UHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2V0VHhQcmVhbWJsZSAoPSBMT05HIFBSRUFNQkxFKVxuIikpOwotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE5PVEU6IDFNYnBzIHNob3VsZCBhbHdheXMgdXNlIGxvbmcgcHJlYW1ibGUKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVNldFR4UHJlYW1ibGUgKD0gU0hPUlQgUFJFQU1CTEUpXG4iKSk7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCQljc3I0LmZpZWxkLkF1dG9SZXNwb25kZXJQcmVhbWJsZSA9IDE7Ci0JfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgQVVUT19SU1BfQ0ZHLCBjc3I0LndvcmQpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFVwZGF0ZSBiYXNpYyByYXRlIGJpdG1hcAotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotVk9JRCBVcGRhdGVCYXNpY1JhdGVCaXRtYXAoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlcikKLXsKLSAgICBJTlQgIGksIGo7Ci0gICAgICAgICAgICAgICAgICAvKiAxICAyICA1LjUsIDExLCAgNiwgIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgIDU0ICovCi0gICAgVUNIQVIgcmF0ZVtdID0geyAyLCA0LCAgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4IH07Ci0gICAgVUNIQVIgKnN1cF9wID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5TdXBSYXRlOwotICAgIFVDSEFSICpleHRfcCA9IHBBZGFwdGVyLT5Db21tb25DZmcuRXh0UmF0ZTsKLSAgICBVTE9ORyBiaXRtYXAgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcDsKLQotCi0gICAgLyogaWYgQSBtb2RlLCBhbHdheXMgdXNlIGZpeCBCYXNpY1JhdGVCaXRNYXAgKi8KLSAgICAvL2lmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gUEhZXzExQSkKLQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0gICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNE0gKi8KLSAgICAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkJhc2ljUmF0ZUJpdG1hcCA+IDQwOTUpCi0gICAgewotICAgICAgICAvKiAoMiBeIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKSAtMSAqLwotICAgICAgICByZXR1cm47Ci0gICAgfSAvKiBFbmQgb2YgaWYgKi8KLQotICAgIGZvcihpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLSAgICB7Ci0gICAgICAgIHN1cF9wW2ldICY9IDB4N2Y7Ci0gICAgICAgIGV4dF9wW2ldICY9IDB4N2Y7Ci0gICAgfSAvKiBFbmQgb2YgZm9yICovCi0KLSAgICBmb3IoaT0wOyBpPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBpKyspCi0gICAgewotICAgICAgICBpZiAoYml0bWFwICYgKDEgPDwgaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihqPTA7IGo8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VwX3Bbal0gPT0gcmF0ZVtpXSkKLSAgICAgICAgICAgICAgICAgICAgc3VwX3Bbal0gfD0gMHg4MDsKLSAgICAgICAgICAgICAgICAvKiBFbmQgb2YgaWYgKi8KLSAgICAgICAgICAgIH0gLyogRW5kIG9mIGZvciAqLwotCi0gICAgICAgICAgICBmb3Ioaj0wOyBqPE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dF9wW2pdID09IHJhdGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIGV4dF9wW2pdIHw9IDB4ODA7Ci0gICAgICAgICAgICAgICAgLyogRW5kIG9mIGlmICovCi0gICAgICAgICAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLSAgICAgICAgfSAvKiBFbmQgb2YgaWYgKi8KLSAgICB9IC8qIEVuZCBvZiBmb3IgKi8KLX0gLyogRW5kIG9mIFVwZGF0ZUJhc2ljUmF0ZUJpdG1hcCAqLwotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0vLyBiTGlua1VwIGlzIHRvIGlkZW50aWZ5IHRoZSBpbml0YWwgbGluayBzcGVlZC4KLS8vIFRSVUUgaW5kaWNhdGVzIHRoZSByYXRlIHVwZGF0ZSBhdCBsaW5rdXAsIHdlIHNob3VsZCBub3QgdHJ5IHRvIHNldCB0aGUgcmF0ZSBhdCA1NE1icHMuCi1WT0lEIE1sbWVVcGRhdGVUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglCT09MRUFOCQkJCWJMaW5rVXAsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCi17Ci0JaW50IGksIG51bTsKLQlVQ0hBUiBSYXRlID0gUkFURV82LCBNYXhEZXNpcmUgPSBSQVRFXzEsIE1heFN1cHBvcnQgPSBSQVRFXzE7Ci0JVUNIQVIgTWluU3VwcG9ydCA9IFJBVEVfNTQ7Ci0JVUxPTkcgQmFzaWNSYXRlQml0bWFwID0gMDsKLQlVQ0hBUiBDdXJyQmFzaWNSYXRlID0gUkFURV8xOwotCVVDSEFSICpwU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgKnBFeHRSYXRlLCBFeHRSYXRlTGVuOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOwotCUJPT0xFQU4JCQkJCSphdXRvX3JhdGVfY3VyX3A7Ci0JVUNIQVIJCQkJCUh0TWNzID0gTUNTX0FVVE87Ci0KLQkvLyBmaW5kIG1heCBkZXNpcmVkIHJhdGUKLQlVcGRhdGVCYXNpY1JhdGVCaXRtYXAocEFkKTsKLQotCW51bSA9IDA7Ci0JYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUzsgaSsrKQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlW2ldICYgMHg3ZikKLQkJewotCQkJY2FzZSAyOiAgUmF0ZSA9IFJBVEVfMTsgICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgNDogIFJhdGUgPSBSQVRFXzI7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDExOiBSYXRlID0gUkFURV81XzU7IG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAyMjogUmF0ZSA9IFJBVEVfMTE7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMTI6IFJhdGUgPSBSQVRFXzY7ICAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDE4OiBSYXRlID0gUkFURV85OyAgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSAyNDogUmF0ZSA9IFJBVEVfMTI7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgMzY6IFJhdGUgPSBSQVRFXzE4OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDQ4OiBSYXRlID0gUkFURV8yNDsgIG51bSsrOyAgIGJyZWFrOwotCQkJY2FzZSA3MjogUmF0ZSA9IFJBVEVfMzY7ICBudW0rKzsgICBicmVhazsKLQkJCWNhc2UgOTY6IFJhdGUgPSBSQVRFXzQ4OyAgbnVtKys7ICAgYnJlYWs7Ci0JCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7IG51bSsrOyAgIGJyZWFrOwotCQkJLy9kZWZhdWx0OiBSYXRlID0gUkFURV8xOyAgIGJyZWFrOwotCQl9Ci0JCWlmIChNYXhEZXNpcmUgPCBSYXRlKSAgTWF4RGVzaXJlID0gUmF0ZTsKLQl9Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCXBIdFBoeQkJPSAmcEFkLT5TdGFDZmcuSFRQaHlNb2RlOwotCQlwTWF4SHRQaHkJPSAmcEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlOwotCQlwTWluSHRQaHkJPSAmcEFkLT5TdGFDZmcuTWluSFRQaHlNb2RlOwotCi0JCWF1dG9fcmF0ZV9jdXJfcCA9ICZwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKLQkJSHRNY3MJCT0gcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1M7Ci0KLQkJaWYgKChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykgJiYKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpICYmCi0JCShNYXhEZXNpcmUgPiBSQVRFXzExKSkKLQkJewotCQkJTWF4RGVzaXJlID0gUkFURV8xMTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXBBZC0+Q29tbW9uQ2ZnLk1heERlc2lyZWRSYXRlID0gTWF4RGVzaXJlOwotCXBNaW5IdFBoeS0+d29yZCA9IDA7Ci0JcE1heEh0UGh5LT53b3JkID0gMDsKLQlwSHRQaHktPndvcmQgPSAwOwotCi0JLy8gQXV0byByYXRlIHN3aXRjaGluZyBpcyBlbmFibGVkIG9ubHkgaWYgbW9yZSB0aGFuIG9uZSBERVNJUkVEIFJBVEVTIGFyZQotCS8vIHNwZWNpZmllZDsgb3RoZXJ3aXNlIGRpc2FibGVkCi0JaWYgKG51bSA8PSAxKQotCXsKLQkJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKLQkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IEZBTFNFOwotCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOwotCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gVFJVRTsKLQkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7Ci0JfQotCi0JaWYgKEh0TWNzICE9IE1DU19BVVRPKQotCXsKLQkJLy9PUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKTsKLQkJLy9wQWQtPkNvbW1vbkNmZy5iQXV0b1R4UmF0ZVN3aXRjaAk9IEZBTFNFOwotCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQpOwotCQkvL3BBZC0+Q29tbW9uQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoCT0gVFJVRTsKLQkJKmF1dG9fcmF0ZV9jdXJfcCA9IFRSVUU7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JaWYgKChBREhPQ19PTihwQWQpIHx8IElORlJBX09OKHBBZCkpICYmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKSkKLQl7Ci0JCXBTdXBSYXRlID0gJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVbMF07Ci0JCXBFeHRSYXRlID0gJnBBZC0+U3RhQWN0aXZlLkV4dFJhdGVbMF07Ci0JCVN1cFJhdGVMZW4gPSBwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuOwotCQlFeHRSYXRlTGVuID0gcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCXsKLQkJcFN1cFJhdGUgPSAmcEFkLT5Db21tb25DZmcuU3VwUmF0ZVswXTsKLQkJcEV4dFJhdGUgPSAmcEFkLT5Db21tb25DZmcuRXh0UmF0ZVswXTsKLQkJU3VwUmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLlN1cFJhdGVMZW47Ci0JCUV4dFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlTGVuOwotCX0KLQotCS8vIGZpbmQgbWF4IHN1cHBvcnRlZCByYXRlCi0JZm9yIChpPTA7IGk8U3VwUmF0ZUxlbjsgaSsrKQotCXsKLQkJc3dpdGNoIChwU3VwUmF0ZVtpXSAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgMjogICBSYXRlID0gUkFURV8xOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAxOwkgYnJlYWs7Ci0JCQljYXNlIDQ6ICAgUmF0ZSA9IFJBVEVfMjsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsJIGJyZWFrOwotCQkJY2FzZSAxMTogIFJhdGUgPSBSQVRFXzVfNTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwNDsJIGJyZWFrOwotCQkJY2FzZSAyMjogIFJhdGUgPSBSQVRFXzExOwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OwkgYnJlYWs7Ci0JCQljYXNlIDEyOiAgUmF0ZSA9IFJBVEVfNjsJLyppZiAocFN1cFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOyAgYnJlYWs7Ci0JCQljYXNlIDE4OiAgUmF0ZSA9IFJBVEVfOTsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsJIGJyZWFrOwotCQkJY2FzZSAyNDogIFJhdGUgPSBSQVRFXzEyOwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7ICBicmVhazsKLQkJCWNhc2UgMzY6ICBSYXRlID0gUkFURV8xODsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA4MDsJIGJyZWFrOwotCQkJY2FzZSA0ODogIFJhdGUgPSBSQVRFXzI0OwkvKmlmIChwU3VwUmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAxMDA7ICBicmVhazsKLQkJCWNhc2UgNzI6ICBSYXRlID0gUkFURV8zNjsJaWYgKHBTdXBSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsJIGJyZWFrOwotCQkJY2FzZSA5NjogIFJhdGUgPSBSQVRFXzQ4OwlpZiAocFN1cFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOwkgYnJlYWs7Ci0JCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7CWlmIChwU3VwUmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CSBicmVhazsKLQkJCWRlZmF1bHQ6ICBSYXRlID0gUkFURV8xOwlicmVhazsKLQkJfQotCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOwotCi0JCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkgTWluU3VwcG9ydCA9IFJhdGU7Ci0JfQotCi0JZm9yIChpPTA7IGk8RXh0UmF0ZUxlbjsgaSsrKQotCXsKLQkJc3dpdGNoIChwRXh0UmF0ZVtpXSAmIDB4N2YpCi0JCXsKLQkJCWNhc2UgMjogICBSYXRlID0gUkFURV8xOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDAxOwkgYnJlYWs7Ci0JCQljYXNlIDQ6ICAgUmF0ZSA9IFJBVEVfMjsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwMjsJIGJyZWFrOwotCQkJY2FzZSAxMTogIFJhdGUgPSBSQVRFXzVfNTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAwNDsJIGJyZWFrOwotCQkJY2FzZSAyMjogIFJhdGUgPSBSQVRFXzExOwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDA4OwkgYnJlYWs7Ci0JCQljYXNlIDEyOiAgUmF0ZSA9IFJBVEVfNjsJLyppZiAocEV4dFJhdGVbaV0gJiAweDgwKSovICBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwMDEwOyAgYnJlYWs7Ci0JCQljYXNlIDE4OiAgUmF0ZSA9IFJBVEVfOTsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDAyMDsJIGJyZWFrOwotCQkJY2FzZSAyNDogIFJhdGUgPSBSQVRFXzEyOwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAwNDA7ICBicmVhazsKLQkJCWNhc2UgMzY6ICBSYXRlID0gUkFURV8xODsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDA4MDsJIGJyZWFrOwotCQkJY2FzZSA0ODogIFJhdGUgPSBSQVRFXzI0OwkvKmlmIChwRXh0UmF0ZVtpXSAmIDB4ODApKi8gIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDAxMDA7ICBicmVhazsKLQkJCWNhc2UgNzI6ICBSYXRlID0gUkFURV8zNjsJaWYgKHBFeHRSYXRlW2ldICYgMHg4MCkgQmFzaWNSYXRlQml0bWFwIHw9IDB4MDIwMDsJIGJyZWFrOwotCQkJY2FzZSA5NjogIFJhdGUgPSBSQVRFXzQ4OwlpZiAocEV4dFJhdGVbaV0gJiAweDgwKSBCYXNpY1JhdGVCaXRtYXAgfD0gMHgwNDAwOwkgYnJlYWs7Ci0JCQljYXNlIDEwODogUmF0ZSA9IFJBVEVfNTQ7CWlmIChwRXh0UmF0ZVtpXSAmIDB4ODApIEJhc2ljUmF0ZUJpdG1hcCB8PSAweDA4MDA7CSBicmVhazsKLQkJCWRlZmF1bHQ6ICBSYXRlID0gUkFURV8xOwlicmVhazsKLQkJfQotCQlpZiAoTWF4U3VwcG9ydCA8IFJhdGUpCU1heFN1cHBvcnQgPSBSYXRlOwotCi0JCWlmIChNaW5TdXBwb3J0ID4gUmF0ZSkgTWluU3VwcG9ydCA9IFJhdGU7Ci0JfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTEVHQUNZX0JBU0lDX1JBVEUsIEJhc2ljUmF0ZUJpdG1hcCk7Ci0KLQkvLyBidWcgZml4Ci0JLy8gcEFkLT5Db21tb25DZmcuQmFzaWNSYXRlQml0bWFwID0gQmFzaWNSYXRlQml0bWFwOwotCi0JLy8gY2FsY3VsYXRlIHRoZSBleHB0ZWN0ZWQgQUNLIHJhdGUgZm9yIGVhY2ggVFggcmF0ZS4gVGhpcyBpbmZvIGlzIHVzZWQgdG8gY2FjdWxhdGUKLQkvLyB0aGUgRFVSQVRJT04gZmllbGQgb2Ygb3V0Z29pbmcgdW5paWNhc3QgREFUQS9NR01UIGZyYW1lCi0JZm9yIChpPTA7IGk8TUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVM7IGkrKykKLQl7Ci0JCWlmIChCYXNpY1JhdGVCaXRtYXAgJiAoMHgwMSA8PCBpKSkKLQkJCUN1cnJCYXNpY1JhdGUgPSAoVUNIQVIpaTsKLQkJcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW2ldID0gQ3VyckJhc2ljUmF0ZTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVUeFJhdGVzW01heFN1cHBvcnQgPSAlZF0gPSBNYXhEZXNpcmUgJWQgTWJwc1xuIiwgUmF0ZUlkVG9NYnBzW01heFN1cHBvcnRdLCBSYXRlSWRUb01icHNbTWF4RGVzaXJlXSkpOwotCS8vIG1heCB0eCByYXRlID0gbWluIHttYXggZGVzaXJlIHJhdGUsIG1heCBzdXBwb3J0ZWQgcmF0ZX0KLQlpZiAoTWF4U3VwcG9ydCA8IE1heERlc2lyZSkKLQkJcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlID0gTWF4U3VwcG9ydDsKLQllbHNlCi0JCXBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA9IE1heERlc2lyZTsKLQotCXBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZSA9IE1pblN1cHBvcnQ7Ci0JLy8gMjAwMy0wNy0zMSBqb2huIC0gMjUwMCBkb2Vzbid0IGhhdmUgZ29vZCBzZW5zaXRpdml0eSBhdCBoaWdoIE9GRE0gcmF0ZXMuIHRvIGluY3JlYXNlIHRoZSBzdWNjZXNzCi0JLy8gcmF0aW8gb2YgaW5pdGlhbCBESENQIHBhY2tldCBleGNoYW5nZSwgVFggcmF0ZSBzdGFydHMgZnJvbSBhIGxvd2VyIHJhdGUgZGVwZW5kaW5nCi0JLy8gb24gYXZlcmFnZSBSU1NJCi0JLy8JIDEuIFJTU0kgPj0gLTcwZGIsIHN0YXJ0IGF0IDU0IE1icHMgKHNob3J0IGRpc3RhbmNlKQotCS8vCSAyLiAtNzAgPiBSU1NJID49IC03NSwgc3RhcnQgYXQgMjQgTWJwcyAobWlkIGRpc3RhbmNlKQotCS8vCSAzLiAtNzUgPiBSU1NJLCBzdGFydCBhdCAxMSBNYnBzIChsb25nIGRpc3RhbmNlKQotCS8vaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkvKiAmJgotCS8vCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSovKQotCWlmICgqYXV0b19yYXRlX2N1cl9wKQotCXsKLQkJc2hvcnQgZGJtID0gMDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJCWRibSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCQlpZiAoYkxpbmtVcCA9PSBUUlVFKQotCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gUkFURV8yNDsKLQkJZWxzZQotCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCi0JCWlmIChkYm0gPCAtNzUpCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzExOwotCQllbHNlIGlmIChkYm0gPCAtNzApCi0JCQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzI0OwotCi0JCS8vIHNob3VsZCBuZXZlciBleGNlZWQgTWF4VHhSYXRlIChjb25zaWRlciAxMUItb25seSBtb2RlKQotCQlpZiAocEFkLT5Db21tb25DZmcuVHhSYXRlID4gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlKQotCQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4ID0gMDsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuVHhSYXRlID0gcEFkLT5Db21tb25DZmcuTWF4VHhSYXRlOwotCQlwSHRQaHktPmZpZWxkLk1DUwk9IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgPiAzKSA/IChwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUgLSA0KSA6IHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZTsKLQkJcEh0UGh5LT5maWVsZC5NT0RFCT0gKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSA+IDMpID8gTU9ERV9PRkRNIDogTU9ERV9DQ0s7Ci0KLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQwk9IHBIdFBoeS0+ZmllbGQuU1RCQzsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSQk9IHBIdFBoeS0+ZmllbGQuU2hvcnRHSTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTCQk9IHBIdFBoeS0+ZmllbGQuTUNTOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEh0UGh5LT5maWVsZC5NT0RFOwotCX0KLQotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPD0gUkFURV8xMSkKLQl7Ci0JCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZTsKLQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGU7Ci0JfQotCWVsc2UKLQl7Ci0JCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5UeFJhdGVdOwotCQlpZiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlID49IFJBVEVfNiAmJiAocEFkLT5Db21tb25DZmcuTWluVHhSYXRlIDw9IFJBVEVfNTQpKQotCQkJe3BNaW5IdFBoeS0+ZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWluVHhSYXRlXTt9Ci0JCWVsc2UKLQkJCXtwTWluSHRQaHktPmZpZWxkLk1DUyA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTt9Ci0JfQotCi0JcEh0UGh5LT53b3JkID0gKHBNYXhIdFBoeS0+d29yZCk7Ci0JaWYgKGJMaW5rVXAgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCXsKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgPSBwSHRQaHktPndvcmQ7Ci0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1heEhUUGh5TW9kZS53b3JkID0gcE1heEh0UGh5LT53b3JkOwotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NaW5IVFBoeU1vZGUud29yZCA9IHBNaW5IdFBoeS0+d29yZDsKLQl9Ci0JZWxzZQotCXsKLQkJc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCQl7Ci0JCQljYXNlIFBIWV8xMUJHX01JWEVEOgotCQkJY2FzZSBQSFlfMTFCOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJY2FzZSBQSFlfMTFCR05fTUlYRUQ6Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gUkFURV8xOwotCi0vLyNpZmRlZglXSUZJX1RFU1QKLQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV8xMTsKLS8vI2Vsc2UKLS8vCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7Ci0vLyNlbmRpZgotCQkJCWJyZWFrOwotCQkJY2FzZSBQSFlfMTFHOgotCQkJY2FzZSBQSFlfMTFBOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCQljYXNlIFBIWV8xMUdOX01JWEVEOgotCQkJY2FzZSBQSFlfMTFOXzJfNEc6Ci0JCQljYXNlIFBIWV8xMUFOX01JWEVEOgotCQkJY2FzZSBQSFlfMTFOXzVHOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUEhZXzExQUJHX01JWEVEOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsIDw9IDE0KQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzE7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzE7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBSQVRFXzE7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQkJCQlwQWQtPkNvbW1vbkNmZy5SdHNSYXRlID0gUkFURV82OwotCQkJCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAvLyBlcnJvcgotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlID0gUkFURV82OwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCQkJcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IFJBVEVfMTsKLQkJCQlicmVhazsKLQkJfQotCQkvLwotCQkvLyBLZWVwIEJhc2ljIE1sbWUgUmF0ZS4KLQkJLy8KLQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUud29yZCA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC53b3JkOwotCQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPT0gTU9ERV9PRkRNKQotCQkJcEFkLT5NYWNUYWIuQ29udGVudFtNQ0FTVF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbUkFURV8yNF07Ci0JCWVsc2UKLQkJCXBBZC0+TWFjVGFiLkNvbnRlbnRbTUNBU1RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IFJBVEVfMTsKLQkJcEFkLT5Db21tb25DZmcuQmFzaWNNbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoTWF4RGVzaXJlPSVkLCBNYXhTdXBwb3J0PSVkLCBNYXhUeFJhdGU9JWQsIE1pblJhdGU9JWQsIFJhdGUgU3dpdGNoaW5nID0lZClcbiIsCi0JCQkgUmF0ZUlkVG9NYnBzW01heERlc2lyZV0sIFJhdGVJZFRvTWJwc1tNYXhTdXBwb3J0XSwgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5NaW5UeFJhdGVdLAotCQkJIC8qT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSovKmF1dG9fcmF0ZV9jdXJfcCkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlVHhSYXRlcyAoVHhSYXRlPSVkLCBSdHNSYXRlPSVkLCBCYXNpY1JhdGVCaXRtYXA9MHglMDRseClcbiIsCi0JCQkgUmF0ZUlkVG9NYnBzW3BBZC0+Q29tbW9uQ2ZnLlR4UmF0ZV0sIFJhdGVJZFRvTWJwc1twQWQtPkNvbW1vbkNmZy5SdHNSYXRlXSwgQmFzaWNSYXRlQml0bWFwKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVVwZGF0ZVR4UmF0ZXMgKE1sbWVUcmFuc21pdD0weCV4LCBNaW5IVFBoeU1vZGU9JXgsIE1heEhUUGh5TW9kZT0weCV4LCBIVFBoeU1vZGU9MHgleClcbiIsCi0JCQkgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWluSFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4SFRQaHlNb2RlLndvcmQgLHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQgKSk7Ci19Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhpcyBmdW5jdGlvbiB1cGRhdGUgSFQgUmF0ZSBzZXR0aW5nLgotCQlJbnB1dCBXY2lkIHZhbHVlIGlzIHZhbGlkIGZvciAyIGNhc2UgOgotCQkxLiBpdCdzIHVzZWQgZm9yIFN0YXRpb24gaW4gaW5mcmEgbW9kZSB0aGF0IGNvcHkgQVAgcmF0ZSB0byBNYWN0YWJsZS4KLQkJMi4gT1IgU3RhdGlvbglpbiBhZGhvYyBtb2RlIHRvIGNvcHkgcGVlcidzIEhUIHJhdGUgdG8gTWFjdGFibGUuCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZVVwZGF0ZUh0VHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JVUNIQVIJCQkJYXBpZHgpCi17Ci0JVUNIQVIJU3RiY01jczsgLy9qLCBTdGJjTWNzLCBiaXRtYXNrOwotCUNIQVIJaTsgLy8gMyozCi0JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHRDYXAgPSBOVUxMOwotCVJUX0hUX1BIWV9JTkZPCQkqcEFjdGl2ZUh0UGh5ID0gTlVMTDsKLQlVTE9ORwkJQmFzaWNNQ1M7Ci0JVUNIQVIgaiwgYml0bWFzazsKLQlQUlRfSFRfUEhZX0lORk8JCQlwRGVzaXJlSHRQaHkgPSBOVUxMOwotCVBIVFRSQU5TTUlUX1NFVFRJTkcJCXBIdFBoeSA9IE5VTEw7Ci0JUEhUVFJBTlNNSVRfU0VUVElORwkJcE1heEh0UGh5ID0gTlVMTDsKLQlQSFRUUkFOU01JVF9TRVRUSU5HCQlwTWluSHRQaHkgPSBOVUxMOwotCUJPT0xFQU4JCQkJCSphdXRvX3JhdGVfY3VyX3A7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIk1sbWVVcGRhdGVIdFR4UmF0ZXM9PT0+IFxuIikpOwotCi0JYXV0b19yYXRlX2N1cl9wID0gTlVMTDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlwRGVzaXJlSHRQaHkJPSAmcEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mbzsKLQkJcEFjdGl2ZUh0UGh5CT0gJnBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm87Ci0JCXBIdFBoeQkJPSAmcEFkLT5TdGFDZmcuSFRQaHlNb2RlOwotCQlwTWF4SHRQaHkJPSAmcEFkLT5TdGFDZmcuTWF4SFRQaHlNb2RlOwotCQlwTWluSHRQaHkJPSAmcEFkLT5TdGFDZmcuTWluSFRQaHlNb2RlOwotCi0JCWF1dG9fcmF0ZV9jdXJfcCA9ICZwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaDsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAoKEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKSkgJiYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpKQotCXsKLQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKQotCQkJcmV0dXJuOwotCi0JCXBSdEh0Q2FwID0gJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5OwotCQlwQWN0aXZlSHRQaHkgPSAmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mbzsKLQkJU3RiY01jcyA9IChVQ0hBUilwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzMuU3RiY01jczsKLQkJQmFzaWNNQ1MgPXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uTUNTU2V0WzBdKyhwQWQtPk1sbWVBdXguQWRkSHRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQkJZWxzZQotCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JewotCQlpZiAocERlc2lyZUh0UGh5LT5iSHRFbmFibGUgPT0gRkFMU0UpCi0JCQlyZXR1cm47Ci0KLQkJcFJ0SHRDYXAgPSAmcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5OwotCQlTdGJjTWNzID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8zLlN0YmNNY3M7Ci0JCUJhc2ljTUNTID0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFswXSsocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLk1DU1NldFsxXTw8OCkrKFN0YmNNY3M8PDE2KTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSAmJiAocFJ0SHRDYXAtPlJ4U1RCQykgJiYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikpCi0JCQlwTWF4SHRQaHktPmZpZWxkLlNUQkMgPSBTVEJDX1VTRTsKLQkJZWxzZQotCQkJcE1heEh0UGh5LT5maWVsZC5TVEJDID0gU1RCQ19OT05FOwotCX0KLQotCS8vIERlY2lkZSBNQVggaHQgcmF0ZS4KLQlpZiAoKHBSdEh0Q2FwLT5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCXBNYXhIdFBoeS0+ZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOwotCWVsc2UKLQkJcE1heEh0UGh5LT5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQotICAgIGlmICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkgJiYgKHBSdEh0Q2FwLT5DaGFubmVsV2lkdGgpKQotCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfNDA7Ci0JZWxzZQotCQlwTWF4SHRQaHktPmZpZWxkLkJXID0gQldfMjA7Ci0KLSAgICBpZiAocE1heEh0UGh5LT5maWVsZC5CVyA9PSBCV18yMCkKLQkJcE1heEh0UGh5LT5maWVsZC5TaG9ydEdJID0gKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjAgJiBwUnRIdENhcC0+U2hvcnRHSWZvcjIwKTsKLQllbHNlCi0JCXBNYXhIdFBoeS0+ZmllbGQuU2hvcnRHSSA9IChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwICYgcFJ0SHRDYXAtPlNob3J0R0lmb3I0MCk7Ci0KLQlpZiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbNF0gIT0gMCkKLQl7Ci0JCXBNYXhIdFBoeS0+ZmllbGQuTUNTID0gMzI7Ci0JfQotCi0JZm9yIChpPTIzOyBpPj0wOyBpLS0pIC8vIDMqMwotCXsKLQkJaiA9IGkvODsKLQkJYml0bWFzayA9ICgxPDwoaS0oaio4KSkpOwotCi0JCWlmICgocEFjdGl2ZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSAmJiAocERlc2lyZUh0UGh5LT5NQ1NTZXRbal0gJiBiaXRtYXNrKSkKLQkJewotCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaT09MCkKLQkJCWJyZWFrOwotCX0KLQotCS8vIENvcHkgTUlOIGh0IHJhdGUuICBydDI4NjA/Pz8KLQlwTWluSHRQaHktPmZpZWxkLkJXID0gQldfMjA7Ci0JcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAwOwotCXBNaW5IdFBoeS0+ZmllbGQuU1RCQyA9IDA7Ci0JcE1pbkh0UGh5LT5maWVsZC5TaG9ydEdJID0gMDsKLQkvL0lmIFNUQSBhc3NpZ25zIGZpeGVkIHJhdGUuIHVwZGF0ZSB0byBmaXhlZCBoZXJlLgotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmICggKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpICYmIChwRGVzaXJlSHRQaHktPk1DU1NldFswXSAhPSAweGZmKSkKLQl7Ci0JCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFs0XSAhPSAwKQotCQl7Ci0JCQlwTWF4SHRQaHktPmZpZWxkLk1DUyA9IDMyOwotCQkJcE1pbkh0UGh5LT5maWVsZC5NQ1MgPSAzMjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiTWxtZVVwZGF0ZUh0VHhSYXRlczw9PT0gVXNlIEZpeGVkIE1DUyA9ICVkXG4iLHBNaW5IdFBoeS0+ZmllbGQuTUNTKSk7Ci0JCX0KLQotCQlmb3IgKGk9MjM7IChDSEFSKWkgPj0gMDsgaS0tKSAvLyAzKjMKLQkJewotCQkJaiA9IGkvODsKLQkJCWJpdG1hc2sgPSAoMTw8KGktKGoqOCkpKTsKLQkJCWlmICggKHBEZXNpcmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBBY3RpdmVIdFBoeS0+TUNTU2V0W2pdICYgYml0bWFzaykpCi0JCQl7Ci0JCQkJcE1heEh0UGh5LT5maWVsZC5NQ1MgPSBpOwotCQkJCXBNaW5IdFBoeS0+ZmllbGQuTUNTID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpPT0wKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQkvLyBEZWNpZGUgaHQgcmF0ZQotCXBIdFBoeS0+ZmllbGQuU1RCQyA9IHBNYXhIdFBoeS0+ZmllbGQuU1RCQzsKLQlwSHRQaHktPmZpZWxkLkJXID0gcE1heEh0UGh5LT5maWVsZC5CVzsKLQlwSHRQaHktPmZpZWxkLk1PREUgPSBwTWF4SHRQaHktPmZpZWxkLk1PREU7Ci0JcEh0UGh5LT5maWVsZC5NQ1MgPSBwTWF4SHRQaHktPmZpZWxkLk1DUzsKLQlwSHRQaHktPmZpZWxkLlNob3J0R0kgPSBwTWF4SHRQaHktPmZpZWxkLlNob3J0R0k7Ci0KLQkvLyB1c2UgZGVmYXVsdCBub3cuIHJ0Mjg2MAotCWlmIChwRGVzaXJlSHRQaHktPk1DU1NldFswXSAhPSAweGZmKQotCQkqYXV0b19yYXRlX2N1cl9wID0gRkFMU0U7Ci0JZWxzZQotCQkqYXV0b19yYXRlX2N1cl9wID0gVFJVRTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBNbG1lVXBkYXRlSHRUeFJhdGVzPC0tLS5BTXNkdVNpemUgPSAlZCAgXG4iLCBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplICkpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiVFg6IE1DU1swXSA9ICV4IChjaG9vc2UgJWQpLCBCVyA9ICVkLCBTaG9ydEdJID0gJWQsIE1PREUgPSAlZCwgIFxuIiwgcEFjdGl2ZUh0UGh5LT5NQ1NTZXRbMF0scEh0UGh5LT5maWVsZC5NQ1MsCi0JCXBIdFBoeS0+ZmllbGQuQlcsIHBIdFBoeS0+ZmllbGQuU2hvcnRHSSwgcEh0UGh5LT5maWVsZC5NT0RFKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJNbG1lVXBkYXRlSHRUeFJhdGVzPD09PSBcbiIpKTsKLX0KLQotCi1WT0lEIEJBVGFibGVJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIEJBX1RBQkxFICpUYWIpCi17Ci0JaW50IGk7Ci0KLQlUYWItPm51bUFzT3JpZ2luYXRvciA9IDA7Ci0JVGFiLT5udW1Bc1JlY2lwaWVudCA9IDA7Ci0JVGFiLT5udW1Eb25lT3JpZ2luYXRvciA9IDA7Ci0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+QkFUYWJMb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEU7IGkrKykKLQl7Ci0JCVRhYi0+QkFSZWNFbnRyeVtpXS5SRUNfQkFfU3RhdHVzID0gUmVjaXBpZW50X05PTkU7Ci0JCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCYoVGFiLT5CQVJlY0VudHJ5W2ldLlJ4UmVSaW5nTG9jaykpOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEU7IGkrKykKLQl7Ci0JCVRhYi0+QkFPcmlFbnRyeVtpXS5PUklfQkFfU3RhdHVzID0gT3JpZ2luYXRvcl9OT05FOwotCX0KLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIE1sbWVSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlSVE1QX01MTUVfUkFESU9fT0ZGKHBBZCk7Ci19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBNbG1lUmFkaW9PbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlSVE1QX01MTUVfUkFESU9fT04ocEFkKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gYnNzX3RhYmxlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0vKiEgXGJyaWVmIGluaXRpYWxpemUgQlNTIHRhYmxlCi0gKglccGFyYW0gcF90YWIgcG9pbnRlciB0byB0aGUgdGFibGUKLSAqCVxyZXR1cm4gbm9uZQotICoJXHByZQotICoJXHBvc3QKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotVk9JRCBCc3NUYWJsZUluaXQoCi0JSU4gQlNTX1RBQkxFICpUYWIpCi17Ci0JaW50IGk7Ci0KLQlUYWItPkJzc05yID0gMDsKLSAgICBUYWItPkJzc092ZXJsYXBOciA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MRU5fT0ZfQlNTX1RBQkxFOyBpKyspCi0JewotCQlOZGlzWmVyb01lbW9yeSgmVGFiLT5Cc3NFbnRyeVtpXSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQlUYWItPkJzc0VudHJ5W2ldLlJzc2kgPSAtMTI3OwkvLyBpbml0aWFsIHRoZSByc3NpIGFzIGEgbWluaW11bSB2YWx1ZQotCX0KLX0KLQotCi0vKiEgXGJyaWVmIHNlYXJjaCB0aGUgQlNTIHRhYmxlIGJ5IFNTSUQKLSAqCVxwYXJhbSBwX3RhYiBwb2ludGVyIHRvIHRoZSBic3MgdGFibGUKLSAqCVxwYXJhbSBzc2lkIFNTSUQgc3RyaW5nCi0gKglccmV0dXJuIGluZGV4IG9mIHRoZSB0YWJsZSwgQlNTX05PVF9GT1VORCBpZiBub3QgaW4gdGhlIHRhYmxlCi0gKglccHJlCi0gKglccG9zdAotICoJXG5vdGUgc2VhcmNoIGJ5IHNlcXVlbnRpYWwgc2VhcmNoCi0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1VTE9ORyBCc3NUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIHBCc3NpZCwKLQlJTiBVQ0hBUgkgQ2hhbm5lbCkKLXsKLQlVQ0hBUiBpOwotCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCS8vCi0JCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgotCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgotCQkvLwotCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgotCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSkKLQkJewotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOwotfQotCi1VTE9ORyBCc3NTc2lkVGFibGVTZWFyY2goCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBwQnNzaWQsCi0JSU4gUFVDSEFSCSBwU3NpZCwKLQlJTiBVQ0hBUgkgU3NpZExlbiwKLQlJTiBVQ0hBUgkgQ2hhbm5lbCkKLXsKLQlVQ0hBUiBpOwotCi0JZm9yIChpID0gMDsgaSA8IFRhYi0+QnNzTnI7IGkrKykKLQl7Ci0JCS8vCi0JCS8vIFNvbWUgQVAgdGhhdCBzdXBwb3J0IEEvQi9HIG1vZGUgdGhhdCBtYXkgdXNlZCB0aGUgc2FtZSBCU1NJRCBvbiAxMUEgYW5kIDExQi9HLgotCQkvLyBXZSBzaG91bGQgZGlzdGluZ3Vpc2ggdGhpcyBjYXNlLgotCQkvLwotCQlpZiAoKCgoVGFiLT5Cc3NFbnRyeVtpXS5DaGFubmVsIDw9IDE0KSAmJiAoQ2hhbm5lbCA8PSAxNCkpIHx8Ci0JCQkgKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgotCQkJTUFDX0FERFJfRVFVQUwoVGFiLT5Cc3NFbnRyeVtpXS5Cc3NpZCwgcEJzc2lkKSAmJgotCQkJU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pKQotCQl7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gKFVMT05HKUJTU19OT1RfRk9VTkQ7Ci19Ci0KLVVMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSCSBCc3NpZCwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuLAotCUlOIFVDSEFSCSBDaGFubmVsKQotewotCVVDSEFSIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJaWYgKCgoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA8PSAxNCkgJiYgKENoYW5uZWwgPD0gMTQpKSB8fAotCQkJKChUYWItPkJzc0VudHJ5W2ldLkNoYW5uZWwgPiAxNCkgJiYgKENoYW5uZWwgPiAxNCkpKSAmJgotCQkJTUFDX0FERFJfRVFVQUwoJihUYWItPkJzc0VudHJ5W2ldLkJzc2lkKSwgQnNzaWQpICYmCi0JCQkoU1NJRF9FUVVBTChwU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkLCBUYWItPkJzc0VudHJ5W2ldLlNzaWRMZW4pIHx8Ci0JCQkoTmRpc0VxdWFsTWVtb3J5KHBTc2lkLCBaZXJvU3NpZCwgU3NpZExlbikpIHx8Ci0JCQkoTmRpc0VxdWFsTWVtb3J5KFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgWmVyb1NzaWQsIFRhYi0+QnNzRW50cnlbaV0uU3NpZExlbikpKSkKLQkJewotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOwotfQotCi0KLVVMT05HIEJzc1NzaWRUYWJsZVNlYXJjaEJ5U1NJRCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuKQotewotCVVDSEFSIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVGFiLT5Cc3NOcjsgaSsrKQotCXsKLQkJaWYgKFNTSURfRVFVQUwocFNzaWQsIFNzaWRMZW4sIFRhYi0+QnNzRW50cnlbaV0uU3NpZCwgVGFiLT5Cc3NFbnRyeVtpXS5Tc2lkTGVuKSkKLQkJewotCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChVTE9ORylCU1NfTk9UX0ZPVU5EOwotfQotCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAotCUlOIE9VVAlCU1NfVEFCTEUgKlRhYiwKLQlJTgkJUFVDSEFSCSAgcEJzc2lkLAotCUlOCQlVQ0hBUgkgIENoYW5uZWwpCi17Ci0JVUNIQVIgaSwgajsKLQotCWZvciAoaSA9IDA7IGkgPCBUYWItPkJzc05yOyBpKyspCi0JewotCQlpZiAoKFRhYi0+QnNzRW50cnlbaV0uQ2hhbm5lbCA9PSBDaGFubmVsKSAmJgotCQkJKE1BQ19BRERSX0VRVUFMKFRhYi0+QnNzRW50cnlbaV0uQnNzaWQsIHBCc3NpZCkpKQotCQl7Ci0JCQlmb3IgKGogPSBpOyBqIDwgVGFiLT5Cc3NOciAtIDE7IGorKykKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmKFRhYi0+QnNzRW50cnlbal0pLCAmKFRhYi0+QnNzRW50cnlbaiArIDFdKSwgc2l6ZW9mKEJTU19FTlRSWSkpOwotCQkJfQotCQkJTmRpc1plcm9NZW1vcnkoJihUYWItPkJzc0VudHJ5W1RhYi0+QnNzTnIgLSAxXSksIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCVRhYi0+QnNzTnIgLT0gMTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlEZWxldGUgdGhlIE9yaWdpbmF0b3IgRW50cnkgaW4gQkF0YWJsZS4gT3IgZGVjcmVhc2UgbnVtQXMgT3JpZ2luYXRvciBieSAxIGlmIG5lZWRlZC4KLQotCUFyZ3VtZW50czoKLQkvLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpCi17Ci0KLQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgIT0gT3JpZ2luYXRvcl9OT05FKQotCXsKLQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5CQVRhYkxvY2spOwotCQlpZiAocEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPT0gT3JpZ2luYXRvcl9Eb25lKQotCQl7Ci0JCQlwQWQtPkJBVGFibGUubnVtQXNPcmlnaW5hdG9yIC09IDE7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQVRhYmxlRGVsZXRlT1JJRW50cnkgbnVtQXNPcmlnaW5hdG9yPSAlbGRcbiIsIHBBZC0+QkFUYWJsZS5udW1Bc1JlY2lwaWVudCkpOwotCQkJLy8gRXJhc2UgQml0bWFwIGZsYWcuCi0JCX0KLQkJcEFkLT5NYWNUYWIuQ29udGVudFtwQkFPUklFbnRyeS0+V2NpZF0uVFhCQWJpdG1hcCAmPSAofigxPDwocEJBT1JJRW50cnktPlRJRCkgKSk7CS8vIElmIFNUQSBtb2RlLCAgZXJhc2UgZmxhZyBoZXJlCi0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbcEJBT1JJRW50cnktPldjaWRdLkJBT3JpV2NpZEFycmF5W3BCQU9SSUVudHJ5LT5USURdID0gMDsJLy8gSWYgU1RBIG1vZGUsICBlcmFzZSBmbGFnIGhlcmUKLQkJcEJBT1JJRW50cnktPk9SSV9CQV9TdGF0dXMgPSBPcmlnaW5hdG9yX05PTkU7Ci0JCXBCQU9SSUVudHJ5LT5Ub2tlbiA9IDE7Ci0JCS8vIE5vdCBjbGVhciBTZXF1ZW5jZSBoZXJlLgotCQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPkJBVGFiTG9jayk7Ci0JfQotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vKiEgXGJyaWVmCi0gKglccGFyYW0KLSAqCVxyZXR1cm4KLSAqCVxwcmUKLSAqCVxwb3N0Ci0KLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1WT0lEIEJzc0VudHJ5U2V0KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBCU1NfRU5UUlkgKnBCc3MsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBQQ0ZfUEFSTSBwQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSkKLXsKLQlDT1BZX01BQ19BRERSKHBCc3MtPkJzc2lkLCBwQnNzaWQpOwotCS8vIERlZmF1bHQgSGlkZGVuIFNTSUQgdG8gYmUgVFJVRSwgaXQgd2lsbCBiZSB0dXJuZWQgdG8gRkFMU0UgYWZ0ZXIgY29waW5nIFNTSUQKLQlwQnNzLT5IaWRkZW4gPSAxOwotCWlmIChTc2lkTGVuID4gMCkKLQl7Ci0JCS8vIEZvciBoaWRkZW4gU1NJRCBBUCwgaXQgbWlnaHQgc2VuZCBiZWFjb24gd2l0aCBTU0lEIGxlbiBlcXVhbCB0byAwCi0JCS8vIE9yIHNlbmQgYmVhY29uIC9wcm9iZSByZXNwb25zZSB3aXRoIFNTSUQgbGVuIG1hdGNoaW5nIHJlYWwgU1NJRCBsZW5ndGgsCi0JCS8vIGJ1dCBTU0lEIGlzIGFsbCB6ZXJvLiBzdWNoIGFzICIwMC0wMC0wMC0wMCIgd2l0aCBsZW5ndGggNC4KLQkJLy8gV2UgaGF2ZSB0byBwcmV2ZW50IHRoaXMgY2FzZSBvdmVyd3JpdGUgY29ycmVjdCB0YWJsZQotCQlpZiAoTmRpc0VxdWFsTWVtb3J5KFNzaWQsIFplcm9Tc2lkLCBTc2lkTGVuKSA9PSAwKQotCQl7Ci0JCSAgICBOZGlzWmVyb01lbW9yeShwQnNzLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JCQlwQnNzLT5Tc2lkTGVuID0gU3NpZExlbjsKLQkJCXBCc3MtPkhpZGRlbiA9IDA7Ci0JCX0KLQl9Ci0JZWxzZQotCQlwQnNzLT5Tc2lkTGVuID0gMDsKLQlwQnNzLT5Cc3NUeXBlID0gQnNzVHlwZTsKLQlwQnNzLT5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7Ci0JaWYgKEJzc1R5cGUgPT0gQlNTX0lORlJBKQotCXsKLQkJaWYgKHBDZlBhcm0tPmJWYWxpZCkKLQkJewotCQkJcEJzcy0+Q2ZwQ291bnQgPSBwQ2ZQYXJtLT5DZnBDb3VudDsKLQkJCXBCc3MtPkNmcFBlcmlvZCA9IHBDZlBhcm0tPkNmcFBlcmlvZDsKLQkJCXBCc3MtPkNmcE1heER1cmF0aW9uID0gcENmUGFybS0+Q2ZwTWF4RHVyYXRpb247Ci0JCQlwQnNzLT5DZnBEdXJSZW1haW5pbmcgPSBwQ2ZQYXJtLT5DZnBEdXJSZW1haW5pbmc7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEJzcy0+QXRpbVdpbiA9IEF0aW1XaW47Ci0JfQotCi0JcEJzcy0+Q2FwYWJpbGl0eUluZm8gPSBDYXBhYmlsaXR5SW5mbzsKLQkvLyBUaGUgcHJpdmFjeSBiaXQgaW5kaWNhdGUgc2VjdXJpdHkgaXMgT04sIGl0IG1haWdodCBiZSBXRVAsIFRLSVAgb3IgQUVTCi0JLy8gQ29tYmluZSB3aXRoIEF1dGhNb2RlLCB0aGV5IHdpbGwgZGVjaWRlIHRoZSBjb25uZWN0aW9uIG1ldGhvZHMuCi0JcEJzcy0+UHJpdmFjeSA9IENBUF9JU19QUklWQUNZX09OKHBCc3MtPkNhcGFiaWxpdHlJbmZvKTsKLQlBU1NFUlQoU3VwUmF0ZUxlbiA8PSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JaWYgKFN1cFJhdGVMZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0JCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwotCWVsc2UKLQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3VwUmF0ZSwgU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCXBCc3MtPlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwotCUFTU0VSVChFeHRSYXRlTGVuIDw9IE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLQlOZGlzTW92ZU1lbW9yeShwQnNzLT5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQlwQnNzLT5OZXdFeHRDaGFuT2Zmc2V0ID0gTmV3RXh0Q2hhbk9mZnNldDsKLQlwQnNzLT5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQlwQnNzLT5DaGFubmVsID0gQ2hhbm5lbDsKLQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IENoYW5uZWw7Ci0JcEJzcy0+UnNzaSA9IFJzc2k7Ci0JLy8gVXBkYXRlIENraXBGbGFnLiBpZiBub3QgZXhpc3RzLCB0aGUgdmFsdWUgaXMgMHgwCi0JcEJzcy0+Q2tpcEZsYWcgPSBDa2lwRmxhZzsKLQotCS8vIE5ldyBmb3IgbWljcm9zb2Z0IEZpeGVkIElFcwotCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPkZpeElFcy5UaW1lc3RhbXAsICZUaW1lU3RhbXAsIDgpOwotCXBCc3MtPkZpeElFcy5CZWFjb25JbnRlcnZhbCA9IEJlYWNvblBlcmlvZDsKLQlwQnNzLT5GaXhJRXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0eUluZm87Ci0KLQkvLyBOZXcgZm9yIG1pY3Jvc29mdCBWYXJpYWJsZSBJRXMKLQlpZiAoTGVuZ3RoVklFICE9IDApCi0JewotCQlwQnNzLT5WYXJJRUxlbiA9IExlbmd0aFZJRTsKLQkJTmRpc01vdmVNZW1vcnkocEJzcy0+VmFySUVzLCBwVklFLCBwQnNzLT5WYXJJRUxlbik7Ci0JfQotCWVsc2UKLQl7Ci0JCXBCc3MtPlZhcklFTGVuID0gMDsKLQl9Ci0KLQlwQnNzLT5BZGRIdEluZm9MZW4gPSAwOwotCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IDA7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKEh0Q2FwYWJpbGl0eUxlbj4gMCkKLQl7Ci0JCXBCc3MtPkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKLQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkh0Q2FwYWJpbGl0eSwgcEh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuKTsKLQkJaWYgKEFkZEh0SW5mb0xlbiA+IDApCi0JCXsKLQkJCXBCc3MtPkFkZEh0SW5mb0xlbiA9IEFkZEh0SW5mb0xlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5BZGRIdEluZm8sIHBBZGRIdEluZm8sIEFkZEh0SW5mb0xlbik7Ci0KLQkJCQlpZiAoKHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuID4gMikmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gRVhUQ0hBX0JFTE9XKSAmJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJewotCQkJCQlwQnNzLT5DZW50cmFsQ2hhbm5lbCA9IHBBZGRIdEluZm8tPkNvbnRyb2xDaGFuIC0gMjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZGRIdEluZm8tPkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCQkJCXsKLQkJCQkJCXBCc3MtPkNlbnRyYWxDaGFubmVsID0gcEFkZEh0SW5mby0+Q29udHJvbENoYW4gKyAyOwotCQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCUJzc0NpcGhlclBhcnNlKHBCc3MpOwotCi0JLy8gbmV3IGZvciBRT1MKLQlpZiAocEVkY2FQYXJtKQotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+RWRjYVBhcm0sIHBFZGNhUGFybSwgc2l6ZW9mKEVEQ0FfUEFSTSkpOwotCWVsc2UKLQkJcEJzcy0+RWRjYVBhcm0uYlZhbGlkID0gRkFMU0U7Ci0JaWYgKHBRb3NDYXBhYmlsaXR5KQotCQlOZGlzTW92ZU1lbW9yeSgmcEJzcy0+UW9zQ2FwYWJpbGl0eSwgcFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7Ci0JZWxzZQotCQlwQnNzLT5Rb3NDYXBhYmlsaXR5LmJWYWxpZCA9IEZBTFNFOwotCWlmIChwUWJzc0xvYWQpCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5RYnNzTG9hZCwgcFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQllbHNlCi0JCXBCc3MtPlFic3NMb2FkLmJWYWxpZCA9IEZBTFNFOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCVBFSURfU1RSVUNUICAgICBwRWlkOwotCQlVU0hPUlQgICAgICAgICAgTGVuZ3RoID0gMDsKLQotCi0JCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5XcGFJRS5JRVswXSwgTUFYX0NVU1RPTV9MRU4pOwotCQlOZGlzWmVyb01lbW9yeSgmcEJzcy0+UnNuSUUuSUVbMF0sIE1BWF9DVVNUT01fTEVOKTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCU5kaXNaZXJvTWVtb3J5KCZwQnNzLT5Db3VudHJ5U3RyaW5nWzBdLCAzKTsKLQkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IEZBTFNFOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFZJRTsKLQkJd2hpbGUgKChMZW5ndGggKyAyICsgKFVTSE9SVClwRWlkLT5MZW4pIDw9IExlbmd0aFZJRSkKLQkJewotCQkJc3dpdGNoKHBFaWQtPkVpZCkKLQkJCXsKLQkJCQljYXNlIElFX1dQQToKLQkJCQkJaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkpCi0JCQkJCXsKLQkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKLQkJCQkJCXsKLQkJCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IDA7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlwQnNzLT5XcGFJRS5JRUxlbiA9IHBFaWQtPkxlbiArIDI7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeShwQnNzLT5XcGFJRS5JRSwgcEVpZCwgcEJzcy0+V3BhSUUuSUVMZW4pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSUVfUlNOOgotICAgICAgICAgICAgICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBFaWQtPk9jdGV0ICsgMiwgUlNOX09VSSwgMykpCi0JCQkJCXsKLQkJCQkJCWlmICgocEVpZC0+TGVuICsgMikgPiBNQVhfQ1VTVE9NX0xFTikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJCQkJCQlwQnNzLT5Sc25JRS5JRUxlbiA9IDA7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJCXBCc3MtPlJzbklFLklFTGVuID0gcEVpZC0+TGVuICsgMjsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBCc3MtPlJzbklFLklFLCBwRWlkLCBwQnNzLT5Sc25JRS5JRUxlbik7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCQkJCWNhc2UgSUVfQ09VTlRSWToKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIHBFaWQtPk9jdGV0LCAzKTsKLQkJCQkJcEJzcy0+Ykhhc0NvdW50cnlJRSA9IFRSVUU7Ci0JCQkJCWJyZWFrOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLSAgICAgICAgICAgIH0KLQkJCUxlbmd0aCA9IExlbmd0aCArIDIgKyAoVVNIT1JUKXBFaWQtPkxlbjsgIC8vIEVpZFsxXSArIExlblsxXSsgY29udGVudFtMZW5dCi0JCQlwRWlkID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKXBFaWQgKyAyICsgcEVpZC0+TGVuKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0KLQotLyohCi0gKglcYnJpZWYgaW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGJzcyB0YWJsZQotICoJXHBhcmFtIHBfdGFiIFRoZSBCU1MgdGFibGUKLSAqCVxwYXJhbSBCc3NpZCBCU1NJRAotICoJXHBhcmFtIHNzaWQgU1NJRAotICoJXHBhcmFtIHNzaWRfbGVuIExlbmd0aCBvZiBTU0lECi0gKglccGFyYW0gYnNzX3R5cGUKLSAqCVxwYXJhbSBiZWFjb25fcGVyaW9kCi0gKglccGFyYW0gdGltZXN0YW1wCi0gKglccGFyYW0gcF9jZgotICoJXHBhcmFtIGF0aW1fd2luCi0gKglccGFyYW0gY2FwCi0gKglccGFyYW0gcmF0ZXMKLSAqCVxwYXJhbSByYXRlc19sZW4KLSAqCVxwYXJhbSBjaGFubmVsX2lkeAotICoJXHJldHVybiBub25lCi0gKglccHJlCi0gKglccG9zdAotICoJXG5vdGUgSWYgU1NJRCBpcyBpZGVudGljYWwsIHRoZSBvbGQgZW50cnkgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmV3IG9uZQotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotVUxPTkcgQnNzVGFibGVTZXRFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlPVVQgQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBDRl9QQVJNICpDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsTm8sCi0JSU4gQ0hBUiBSc3NpLAotCUlOIExBUkdFX0lOVEVHRVIgVGltZVN0YW1wLAotCUlOIFVDSEFSIENraXBGbGFnLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIFBRT1NfQ0FQQUJJTElUWV9QQVJNIHBRb3NDYXBhYmlsaXR5LAotCUlOIFBRQlNTX0xPQURfUEFSTSBwUWJzc0xvYWQsCi0JSU4gVVNIT1JUIExlbmd0aFZJRSwKLQlJTiBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpCi17Ci0JVUxPTkcJSWR4OwotCi0JSWR4ID0gQnNzVGFibGVTZWFyY2hXaXRoU1NJRChUYWIsIHBCc3NpZCwgIChVQ0hBUiAqKVNzaWQsIFNzaWRMZW4sIENoYW5uZWxObyk7Ci0JaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCXsKLQkJaWYgKFRhYi0+QnNzTnIgPj0gTUFYX0xFTl9PRl9CU1NfVEFCTEUpCi0JICAgIHsKLQkJCS8vCi0JCQkvLyBJdCBtYXkgaGFwcGVuIHdoZW4gQlNTIFRhYmxlIHdhcyBmdWxsLgotCQkJLy8gVGhlIGRlc2lyZWQgQVAgd2lsbCBub3QgYmUgYWRkZWQgaW50byBCU1MgVGFibGUKLQkJCS8vIEluIHRoaXMgY2FzZSwgaWYgd2UgZm91bmQgdGhlIGRlc2lyZWQgQVAgdGhlbiBvdmVyd3JpdGUgQlNTIFRhYmxlLgotCQkJLy8KLQkJCWlmKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCQl7Ci0JCQkJaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzc2lkKSB8fAotCQkJCQlTU0lEX0VRVUFMKHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgU3NpZCwgU3NpZExlbikpCi0JCQkJewotCQkJCQlJZHggPSBUYWItPkJzc092ZXJsYXBOcjsKLQkJCQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAotCQkJCQkJQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4scEh0Q2FwYWJpbGl0eSwgcEFkZEh0SW5mbyxIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwKLQkJCQkJCU5ld0V4dENoYW5PZmZzZXQsIENoYW5uZWxObywgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywgcEVkY2FQYXJtLCBwUW9zQ2FwYWJpbGl0eSwgcFFic3NMb2FkLCBMZW5ndGhWSUUsIHBWSUUpOwotICAgICAgICAgICAgICAgICAgICBUYWItPkJzc092ZXJsYXBOciA9IChUYWItPkJzc092ZXJsYXBOcisrKSAlIE1BWF9MRU5fT0ZfQlNTX1RBQkxFOwotCQkJCX0KLQkJCQlyZXR1cm4gSWR4OwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJcmV0dXJuIEJTU19OT1RfRk9VTkQ7Ci0JCQl9Ci0JCX0KLQkJSWR4ID0gVGFiLT5Cc3NOcjsKLQkJQnNzRW50cnlTZXQocEFkLCAmVGFiLT5Cc3NFbnRyeVtJZHhdLCBwQnNzaWQsIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwgQ2ZQYXJtLCBBdGltV2luLAotCQkJCQlDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbixwSHRDYXBhYmlsaXR5LCBwQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLAotCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKLQkJVGFiLT5Cc3NOcisrOwotCX0KLQllbHNlCi0JewotCQkvKiBhdm9pZCAgSGlkZGVuIFNTSUQgZm9ybSBiZWFjb24gdG8gb3Zlcndpcml0ZSBjb3JyZWN0IFNTSUQgZnJvbSBwcm9iZSByZXNwb25zZSAqLwotCQlpZiAoKFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWQsIFRhYi0+QnNzRW50cnlbSWR4XS5Tc2lkTGVuKSkgfHwKLQkJCShOZGlzRXF1YWxNZW1vcnkoVGFiLT5Cc3NFbnRyeVtJZHhdLlNzaWQsIFplcm9Tc2lkLCBUYWItPkJzc0VudHJ5W0lkeF0uU3NpZExlbikpKQotCQl7Ci0JCQlCc3NFbnRyeVNldChwQWQsICZUYWItPkJzc0VudHJ5W0lkeF0sIHBCc3NpZCwgU3NpZCwgU3NpZExlbiwgQnNzVHlwZSwgQmVhY29uUGVyaW9kLENmUGFybSwgQXRpbVdpbiwKLQkJCQkJCUNhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8sSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sCi0JCQkJCQlOZXdFeHRDaGFuT2Zmc2V0LCBDaGFubmVsTm8sIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsIHBFZGNhUGFybSwgcFFvc0NhcGFiaWxpdHksIHBRYnNzTG9hZCwgTGVuZ3RoVklFLCBwVklFKTsKLQkJfQotCX0KLQotCXJldHVybiBJZHg7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEICBUcmlFdmVudEluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIJCWk7Ci0KLQlmb3IgKGkgPSAwO2kgPCBNQVhfVFJJR0dFUl9FVkVOVDtpKyspCi0JCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7Ci0KLQlwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBTm8gPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPSAwOwotfQotCi1VTE9ORyBUcmlFdmVudFRhYmxlU2V0RW50cnkoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIFRSSUdHRVJfRVZFTlRfVEFCICpUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJUmVnQ2xhc3MsCi0JSU4gVUNIQVIgQ2hhbm5lbE5vKQotewotCS8vIEV2ZW50IEEKLQlpZiAoSHRDYXBhYmlsaXR5TGVuID09IDApCi0JewotCQlpZiAoVGFiLT5FdmVudEFObyA8IE1BWF9UUklHR0VSX0VWRU5UKQotCQl7Ci0JCQlSVE1QTW92ZU1lbW9yeShUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5CU1NJRCwgcEJzc2lkLCA2KTsKLQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLmJWYWxpZCA9IFRSVUU7Ci0JCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5DaGFubmVsID0gQ2hhbm5lbE5vOwotCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uQ0RDb3VudGVyID0gcEFkLT5Db21tb25DZmcuRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7Ci0JCQlpZiAoUmVnQ2xhc3MgIT0gMCkKLQkJCXsKLQkJCQkvLyBCZWFjb24gaGFzIFJlZ3VsYXRvcnkgY2xhc3MgSUUuIFNvIHVzZSBiZWFjb24ncwotCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gUmVnQ2xhc3M7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gVXNlIFN0YXRpb24ncyBSZWd1bGF0b3J5IGNsYXNzIGluc3RlYWQuCi0JCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LmJIdEVuYWJsZSA9PSBUUlVFKQotCQkJCXsKLQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQkJCQkJewotCQkJCQkJVGFiLT5FdmVudEFbVGFiLT5FdmVudEFOb10uUmVnQ2xhc3MgPSAzMjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkJCQlUYWItPkV2ZW50QVtUYWItPkV2ZW50QU5vXS5SZWdDbGFzcyA9IDMzOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCVRhYi0+RXZlbnRBW1RhYi0+RXZlbnRBTm9dLlJlZ0NsYXNzID0gPz87Ci0KLQkJCX0KLQotCQkJVGFiLT5FdmVudEFObyArKzsKLQkJfQotCX0KLQllbHNlIGlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uSW50b2xlcmFudDQwKQotCXsKLQkJVGFiLT5FdmVudEJDb3VudERvd24gPSBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheTsKLQl9Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlUcmlnZ2VyIEV2ZW50IHRhYmxlIE1haW50YWluZW5jZSBjYWxsZWQgb25jZSBldmVyeSBzZWNvbmQuCi0KLQlBcmd1bWVudHM6Ci0JLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBUcmlFdmVudENvdW50ZXJNYWludGVuYW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUgkJaTsKLQlCT09MRUFOCQkJYk5vdGlmeSA9IEZBTFNFOwotCWZvciAoaSA9IDA7aSA8IE1BWF9UUklHR0VSX0VWRU5UO2krKykKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLmJWYWxpZCAmJiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXIgPiAwKSkKLQkJewotCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QVtpXS5DRENvdW50ZXItLTsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5UcmlnZ2VyRXZlbnRUYWIuRXZlbnRBW2ldLkNEQ291bnRlciA9PSAwKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEFbaV0uYlZhbGlkID0gRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QU5vIC0tOwotCQkJCS8vIE5lZWQgdG8gc2VuZCAyMC80MCBDb2V4aXN0ZW5jZSBOb3RpZnkgZnJhbWUgaWYgaGFzIHN0YXR1cyBjaGFuZ2UuCi0JCQkJYk5vdGlmeSA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJFdmVudFRhYi5FdmVudEJDb3VudERvd24gPiAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93bi0tOwotCQlpZiAocEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLkV2ZW50QkNvdW50RG93biA9PSAwKQotCQkJYk5vdGlmeSA9IFRSVUU7Ci0JfQotCi0JaWYgKGJOb3RpZnkgPT0gVFJVRSkKLQkJVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeShwQWQsIEJTU0lEX1dDSUQsIFRSVUUpOwotfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIEJzc1RhYmxlU3NpZFNvcnQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JT1VUIEJTU19UQUJMRSAqT3V0VGFiLAotCUlOCUNIQVIgU3NpZFtdLAotCUlOCVVDSEFSIFNzaWRMZW4pCi17Ci0JSU5UIGk7Ci0JQnNzVGFibGVJbml0KE91dFRhYik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0JewotCQlCU1NfRU5UUlkgKnBJbkJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV07Ci0JCUJPT0xFQU4JYklzSGlkZGVuQXBJbmNsdWRlZCA9IEZBTFNFOwotCi0JCWlmICgoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPiAxNCkgJiYKLSAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBJbkJzcy0+Q2hhbm5lbCkpCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKLSAgICAgICAgICAgICB8fCAocEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5FbmFibGUgPT0gVFJVRSkKLSNlbmRpZiAvLyBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICApCi17Ci0JCQlpZiAocEluQnNzLT5IaWRkZW4pCi0JCQkJYklzSGlkZGVuQXBJbmNsdWRlZCA9IFRSVUU7Ci19Ci0KLQkJaWYgKChwSW5Cc3MtPkJzc1R5cGUgPT0gcEFkLT5TdGFDZmcuQnNzVHlwZSkgJiYKLQkJCShTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBJbkJzcy0+U3NpZCwgcEluQnNzLT5Tc2lkTGVuKSB8fCBiSXNIaWRkZW5BcEluY2x1ZGVkKSkKLQkJewotCQkJQlNTX0VOVFJZICpwT3V0QnNzID0gJk91dFRhYi0+QnNzRW50cnlbT3V0VGFiLT5Cc3NOcl07Ci0KLQotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJCS8vIElmIG5vIENvdW50cnkgSUUgZXhpc3RzIG5vIENvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZCB3aGVuIElFRUU4MDIxMWRDbGllbnRNb2RlIGlzIHN0cmljdC4KLQkJCWlmICgocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPT0gUnQ4MDJfMTFfRF9TdHJpY3QpICYmCi0JCQkJKHBJbkJzcy0+Ykhhc0NvdW50cnlJRSA9PSBGQUxTRSkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPT0gUnQ4MDJfMTFfRF9TdHJpY3QsIGJ1dCB0aGlzIEFQIGRvZXNuJ3QgaGF2ZSBjb3VudHJ5IElFLlxuIikpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJLy8gMi40Ry81RyBOIG9ubHkgbW9kZQotCQkJaWYgKChwSW5Cc3MtPkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJgotCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQSBpcyBpbiBOLW9ubHkgTW9kZSwgdGhpcyBBUCBkb24ndCBoYXZlIEh0IGNhcGFiaWxpdHkgaW4gQmVhY29uLlxuIikpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkvLyBOZXcgZm9yIFdQQTIKLQkJCS8vIENoZWNrIHRoZSBBdXRobW9kZSBmaXJzdAotCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQkJCXsKLQkJCQkvLyBDaGVjayBBdXRoTW9kZSBhbmQgQXV0aE1vZGVBdXggZm9yIG1hdGNoaW5nLCBpbiBjYXNlIEFQIHN1cHBvcnQgZHVhbC1tb2RlCi0JCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gcEluQnNzLT5BdXRoTW9kZUF1eCkpCi0JCQkJCS8vIE5vbmUgbWF0Y2hlZAotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIENoZWNrIGNpcGhlciBzdWl0ZSwgQVAgbXVzdCBoYXZlIG1vcmUgc2VjdXJlZCBjaXBoZXIgdGhhbiBzdGF0aW9uIHNldHRpbmcKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCQkJewotCQkJCQkvLyBJZiBpdCdzIG5vdCBtaXhlZCBtb2RlLCB3ZSBzaG91bGQgb25seSBsZXQgQlNTIHBhc3Mgd2l0aCB0aGUgc2FtZSBlbmNyeXB0aW9uCi0JCQkJCWlmIChwSW5Cc3MtPldQQS5iTWl4TW9kZSA9PSBGQUxTRSkKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpCi0JCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgZ3JvdXAgY2lwaGVyCi0JCQkJCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEuR3JvdXBDaXBoZXIpICYmCi0JCQkJCQkocEluQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkKSAmJgotCQkJCQkJKHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuUGFpckNpcGhlckF1eCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KLQkJCQkJaWYgKHBJbkJzcy0+V1BBMi5iTWl4TW9kZSA9PSBGQUxTRSkKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKSAmJgotCQkJCQkJKHBJbkJzcy0+V1BBMi5Hcm91cENpcGhlciAhPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQpICYmCi0JCQkJCQkocEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyICE9IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIEJzcyBUeXBlIG1hdGNoZWQsIFNTSUQgbWF0Y2hlZC4KLQkJCS8vIFdlIHdpbGwgY2hlY2sgd2Vwc3RhdHVzIGZvciBxdWFsaWZpY2F0aW9uIEJzcwotCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V2VwU3RhdHVzKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU3RhQ2ZnLldlcFN0YXR1cz0lZCwgd2hpbGUgcEluQnNzLT5XZXBTdGF0dXM9JWRcbiIsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgcEluQnNzLT5XZXBTdGF0dXMpKTsKLQkJCQkvLwotCQkJCS8vIEZvciB0aGUgU0VTdjIgY2FzZSwgd2Ugd2lsbCBub3QgcXVhbGlmeSBXZXBTdGF0dXMuCi0JCQkJLy8KLQkJCQlpZiAoIXBJbkJzcy0+YlNFUykKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIFNpbmNlIHRoZSBBUCBpcyB1c2luZyBoaWRkZW4gU1NJRCwgYW5kIHdlIGFyZSB0cnlpbmcgdG8gY29ubmVjdCB0byBBTlkKLQkJCS8vIEl0IGRlZmluaXRlbHkgd2lsbCBmYWlsLiBTbywgc2tpcCBpdC4KLQkJCS8vIENDWCBhbHNvIHJlcXVpcmUgbm90IGV2ZW4gdHJ5IHRvIGNvbm5lY3QgaXQhIQotCQkJaWYgKFNzaWRMZW4gPT0gMCkKLQkJCQljb250aW51ZTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJLy8gSWYgYm90aCBzdGF0aW9uIGFuZCBBUCB1c2UgNDBNSHosIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlIDQwTUhaIGJhbmQncyBsZWdhbGl0eSBpbiBteSBjb3VudHJ5IHJlZ2lvbgotCQkJLy8gSWYgdGhpcyA0ME1IeiB3aWRlYmFuZCBpcyBub3QgYWxsb3dlZCBpbiBteSBjb3VudHJ5IGxpc3QsIHVzZSBiYW5kd2lkdGggMjBNSFogaW5zdGVhZCwKLQkJCWlmICgocEluQnNzLT5DZW50cmFsQ2hhbm5lbCAhPSBwSW5Cc3MtPkNoYW5uZWwpICYmCi0JCQkJKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkpCi0JCQl7Ci0JCQkJaWYgKFJUTVBDaGVja0NoYW5uZWwocEFkLCBwSW5Cc3MtPkNlbnRyYWxDaGFubmVsLCBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzQwOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCA9PSBCQU5EX1dJRFRIXzIwKQotCQkJCQl7Ci0JCQkJCQlTZXRDb21tb25IVChwQWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkvLyBjb3B5IG1hdGNoaW5nIEJTUyBmcm9tIEluVGFiIHRvIE91dFRhYgotCQkJTmRpc01vdmVNZW1vcnkocE91dEJzcywgcEluQnNzLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0KLQkJCU91dFRhYi0+QnNzTnIrKzsKLQkJfQotCQllbHNlIGlmICgocEluQnNzLT5Cc3NUeXBlID09IHBBZC0+U3RhQ2ZnLkJzc1R5cGUpICYmIChTc2lkTGVuID09IDApKQotCQl7Ci0JCQlCU1NfRU5UUlkgKnBPdXRCc3MgPSAmT3V0VGFiLT5Cc3NFbnRyeVtPdXRUYWItPkJzc05yXTsKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkvLyAyLjRHLzVHIE4gb25seSBtb2RlCi0JCQlpZiAoKHBJbkJzcy0+SHRDYXBhYmlsaXR5TGVuID09IDApICYmCi0JCQkJKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fMl80RykgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExTl81RykpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBIGlzIGluIE4tb25seSBNb2RlLCB0aGlzIEFQIGRvbid0IGhhdmUgSHQgY2FwYWJpbGl0eSBpbiBCZWFjb24uXG4iKSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCS8vIE5ldyBmb3IgV1BBMgotCQkJLy8gQ2hlY2sgdGhlIEF1dGhtb2RlIGZpcnN0Ci0JCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJewotCQkJCS8vIENoZWNrIEF1dGhNb2RlIGFuZCBBdXRoTW9kZUF1eCBmb3IgbWF0Y2hpbmcsIGluIGNhc2UgQVAgc3VwcG9ydCBkdWFsLW1vZGUKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlICE9IHBJbkJzcy0+QXV0aE1vZGUpICYmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBwSW5Cc3MtPkF1dGhNb2RlQXV4KSkKLQkJCQkJLy8gTm9uZSBtYXRjaGVkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KLQkJCQkJaWYgKHBJbkJzcy0+V1BBLmJNaXhNb2RlID09IEZBTFNFKQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBwSW5Cc3MtPldQQS5Hcm91cENpcGhlcikKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyBjaGVjayBncm91cCBjaXBoZXIKLQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA8IHBJbkJzcy0+V1BBLkdyb3VwQ2lwaGVyKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuUGFpckNpcGhlcikgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEuUGFpckNpcGhlckF1eCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSkKLQkJCQl7Ci0JCQkJCS8vIElmIGl0J3Mgbm90IG1peGVkIG1vZGUsIHdlIHNob3VsZCBvbmx5IGxldCBCU1MgcGFzcyB3aXRoIHRoZSBzYW1lIGVuY3J5cHRpb24KLQkJCQkJaWYgKHBJbkJzcy0+V1BBMi5iTWl4TW9kZSA9PSBGQUxTRSkKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQotCQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8vIGNoZWNrIGdyb3VwIGNpcGhlcgotCQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDwgcEluQnNzLT5XUEEyLkdyb3VwQ2lwaGVyKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gY2hlY2sgcGFpcndpc2UgY2lwaGVyLCBza2lwIGlmIG5vbmUgbWF0Y2hlZAotCQkJCQkvLyBJZiBwcm9maWxlIHNldCB0byBBRVMsIGxldCBpdCBwYXNzIHdpdGhvdXQgcXVlc3Rpb24uCi0JCQkJCS8vIElmIHByb2ZpbGUgc2V0IHRvIFRLSVAsIHdlIG11c3QgZmluZCBvbmUgbWF0ZWNoZWQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEluQnNzLT5XUEEyLlBhaXJDaXBoZXIpICYmCi0JCQkJCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4KSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIEJzcyBUeXBlIG1hdGNoZWQsIFNTSUQgbWF0Y2hlZC4KLQkJCS8vIFdlIHdpbGwgY2hlY2sgd2Vwc3RhdHVzIGZvciBxdWFsaWZpY2F0aW9uIEJzcwotCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IHBJbkJzcy0+V2VwU3RhdHVzKQotCQkJCQljb250aW51ZTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJLy8gSWYgYm90aCBzdGF0aW9uIGFuZCBBUCB1c2UgNDBNSHosIHN0aWxsIG5lZWQgdG8gY2hlY2sgaWYgdGhlIDQwTUhaIGJhbmQncyBsZWdhbGl0eSBpbiBteSBjb3VudHJ5IHJlZ2lvbgotCQkJLy8gSWYgdGhpcyA0ME1IeiB3aWRlYmFuZCBpcyBub3QgYWxsb3dlZCBpbiBteSBjb3VudHJ5IGxpc3QsIHVzZSBiYW5kd2lkdGggMjBNSFogaW5zdGVhZCwKLQkJCWlmICgocEluQnNzLT5DZW50cmFsQ2hhbm5lbCAhPSBwSW5Cc3MtPkNoYW5uZWwpICYmCi0JCQkJKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCkpCi0JCQl7Ci0JCQkJaWYgKFJUTVBDaGVja0NoYW5uZWwocEFkLCBwSW5Cc3MtPkNlbnRyYWxDaGFubmVsLCBwSW5Cc3MtPkNoYW5uZWwpID09IEZBTFNFKQotCQkJCXsKLQkJCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID0gQldfMjA7Ci0JCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9IEJXXzQwOwotCQkJCX0KLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJLy8gY29weSBtYXRjaGluZyBCU1MgZnJvbSBJblRhYiB0byBPdXRUYWIKLQkJCU5kaXNNb3ZlTWVtb3J5KHBPdXRCc3MsIHBJbkJzcywgc2l6ZW9mKEJTU19FTlRSWSkpOwotCi0JCQlPdXRUYWItPkJzc05yKys7Ci0JCX0KLQotCQlpZiAoT3V0VGFiLT5Cc3NOciA+PSBNQVhfTEVOX09GX0JTU19UQUJMRSkKLQkJCWJyZWFrOwotCX0KLQotCUJzc1RhYmxlU29ydEJ5UnNzaShPdXRUYWIpOwotfQotCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBCc3NUYWJsZVNvcnRCeVJzc2koCi0JSU4gT1VUIEJTU19UQUJMRSAqT3V0VGFiKQotewotCUlOVAkgIGksIGo7Ci0JQlNTX0VOVFJZIFRtcEJzczsKLQotCWZvciAoaSA9IDA7IGkgPCBPdXRUYWItPkJzc05yIC0gMTsgaSsrKQotCXsKLQkJZm9yIChqID0gaSsxOyBqIDwgT3V0VGFiLT5Cc3NOcjsgaisrKQotCQl7Ci0JCQlpZiAoT3V0VGFiLT5Cc3NFbnRyeVtqXS5Sc3NpID4gT3V0VGFiLT5Cc3NFbnRyeVtpXS5Sc3NpKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KCZUbXBCc3MsICZPdXRUYWItPkJzc0VudHJ5W2pdLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbal0sICZPdXRUYWItPkJzc0VudHJ5W2ldLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk91dFRhYi0+QnNzRW50cnlbaV0sICZUbXBCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJCX0KLQkJfQotCX0KLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi1WT0lEIEJzc0NpcGhlclBhcnNlKAotCUlOIE9VVAlQQlNTX0VOVFJZCXBCc3MpCi17Ci0JUEVJRF9TVFJVQ1QJCSBwRWlkOwotCVBVQ0hBUgkJCQlwVG1wOwotCVBSU05fSUVfSEVBREVSX1NUUlVDVAkJCXBSc25IZWFkZXI7Ci0JUENJUEhFUl9TVUlURV9TVFJVQ1QJCQlwQ2lwaGVyOwotCVBBS01fU1VJVEVfU1RSVUNUCQkJCXBBS007Ci0JVVNIT1JUCQkJCQkJCUNvdW50OwotCUlOVAkJCQkJCQkJTGVuZ3RoOwotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCVRtcENpcGhlcjsKLQotCS8vCi0JLy8gV2VwU3RhdHVzIHdpbGwgYmUgcmVzZXQgbGF0ZXIsIGlmIEFQIGFubm91bmNlIFRLSVAgb3IgQUVTIG9uIHRoZSBiZWFjb24gZnJhbWUuCi0JLy8KLQlpZiAocEJzcy0+UHJpdmFjeSkKLQl7Ci0JCXBCc3MtPldlcFN0YXR1cwkJPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQl9Ci0JZWxzZQotCXsKLQkJcEJzcy0+V2VwU3RhdHVzCQk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQl9Ci0JLy8gU2V0IGRlZmF1bHQgdG8gZGlzYWJsZSAmIG9wZW4gYXV0aGVudGljYXRpb24gYmVmb3JlIHBhcnNpbmcgdmFyaWFibGUgSUUKLQlwQnNzLT5BdXRoTW9kZQkJPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBCc3MtPkF1dGhNb2RlQXV4CT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQotCS8vIEluaXQgV1BBIHNldHRpbmcKLQlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIJPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JcEJzcy0+V1BBLlJzbkNhcGFiaWxpdHkgPSAwOwotCXBCc3MtPldQQS5iTWl4TW9kZQkJPSBGQUxTRTsKLQotCS8vIEluaXQgV1BBMiBzZXR0aW5nCi0JcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQlwQnNzLT5XUEEyLlBhaXJDaXBoZXJBdXggPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JcEJzcy0+V1BBMi5Hcm91cENpcGhlcgkgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JcEJzcy0+V1BBMi5Sc25DYXBhYmlsaXR5ID0gMDsKLQlwQnNzLT5XUEEyLmJNaXhNb2RlCSA9IEZBTFNFOwotCi0KLQlMZW5ndGggPSAoSU5UKSBwQnNzLT5WYXJJRUxlbjsKLQotCXdoaWxlIChMZW5ndGggPiAwKQotCXsKLQkJLy8gUGFyc2UgY2lwaGVyIHN1aXRlIGJhc2Ugb24gV1BBMSAmIFdQQTIsIHRoZXkgc2hvdWxkIGJlIHBhcnNlZCBkaWZmZXJlbnRseQotCQlwVG1wID0gKChQVUNIQVIpIHBCc3MtPlZhcklFcykgKyBwQnNzLT5WYXJJRUxlbiAtIExlbmd0aDsKLQkJcEVpZCA9IChQRUlEX1NUUlVDVCkgcFRtcDsKLQkJc3dpdGNoIChwRWlkLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfV1BBOgotCQkJCWlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFNFU19PVUksIDMpICYmIChwRWlkLT5MZW4gPT0gNykpCi0JCQkJewotCQkJCQlwQnNzLT5iU0VTID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKE5kaXNFcXVhbE1lbW9yeShwRWlkLT5PY3RldCwgV1BBX09VSSwgNCkgIT0gMSkKLQkJCQl7Ci0JCQkJCS8vIGlmIHVuc3VwcG9ydGVkIHZlbmRvciBzcGVjaWZpYyBJRQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gU2tpcCBPVUksIHZlcnNpb24sIGFuZCBtdWx0aWNhc3Qgc3VpdGUKLQkJCQkvLyBUaGlzIHBhcnQgc2hvdWxkIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUgd2hlbiBBUCBzdXBwb3J0ZWQgbXVsdGlwbGUgY2lwaGVyIHN1aXRlLgotCQkJCS8vIEZvciBub3csIGl0J3MgT0sgc2luY2UgYWxtb3N0IGFsbCBBUHMgaGF2ZSBmaXhlZCBjaXBoZXIgc3VpdGUgc3VwcG9ydGVkLgotCQkJCS8vIHBUbXAgPSAoUFVDSEFSKSBwRWlkLT5PY3RldDsKLQkJCQlwVG1wICAgKz0gMTE7Ci0KLQkJCQkvLyBDaXBoZXIgU3VpdGUgU2VsZWN0b3JzIGZyb20gU3BlYyBQODAyLjExaS9EMy4yIFAyNi4KLQkJCQkvLwlWYWx1ZQkgICBNZWFuaW5nCi0JCQkJLy8JMAkJCU5vbmUKLQkJCQkvLwkxCQkJV0VQLTQwCi0JCQkJLy8JMgkJCVRraXAKLQkJCQkvLwkzCQkJV1JBUAotCQkJCS8vCTQJCQlBRVMKLQkJCQkvLwk1CQkJV0VQLTEwNAotCQkJCS8vIFBhcnNlIGdyb3VwIGNpcGhlcgotCQkJCXN3aXRjaCAoKnBUbXApCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA1OgotCQkJCQkJcEJzcy0+V1BBLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNDoKLQkJCQkJCXBCc3MtPldQQS5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBudW1iZXIgb2YgdW5pY2FzdCBzdWl0ZQotCQkJCXBUbXAgICArPSAxOwotCi0JCQkJLy8gc2tpcCBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGVzCi0JCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gUGFyc2luZyBhbGwgdW5pY2FzdCBjaXBoZXIgc3VpdGUKLQkJCQl3aGlsZSAoQ291bnQgPiAwKQotCQkJCXsKLQkJCQkJLy8gU2tpcCBPVUkKLQkJCQkJcFRtcCArPSAzOwotCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JCQkJCXN3aXRjaCAoKnBUbXApCi0JCQkJCXsKLQkJCQkJCWNhc2UgMToKLQkJCQkJCWNhc2UgNTogLy8gQWx0aG91Z2ggV0VQIGlzIG5vdCBhbGxvd2VkIGluIFdQQSByZWxhdGVkIGF1dGggbW9kZSwgd2UgcGFyc2UgaXQgYW55d2F5Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0OgotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChUbXBDaXBoZXIgPiBwQnNzLT5XUEEuUGFpckNpcGhlcikKLQkJCQkJewotCQkJCQkJLy8gTW92ZSB0aGUgbG93ZXIgY2lwaGVyIHN1aXRlIHRvIFBhaXJDaXBoZXJBdXgKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBLlBhaXJDaXBoZXI7Ci0JCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlcgk9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gVG1wQ2lwaGVyOwotCQkJCQl9Ci0JCQkJCXBUbXArKzsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cwotCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKLQkJCQlwVG1wICAgKz0gMzsKLQotCQkJCXN3aXRjaCAoKnBUbXApCi0JCQkJewotCQkJCQljYXNlIDE6Ci0JCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEtZW50ZXJwcmlzZSBtb2RlCi0JCQkJCQlpZiAocEJzcy0+QXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbikKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQkvLyBTZXQgQVAgc3VwcG9ydCBXUEEtUFNLIG1vZGUKLQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCQkJZWxzZQotCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcFRtcCAgICs9IDE7Ci0KLQkJCQkvLyBGaXhlZCBmb3IgV1BBLU5vbmUKLQkJCQlpZiAocEJzcy0+QnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJewotCQkJCQlwQnNzLT5BdXRoTW9kZQkgID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQkJLy8gUGF0Y2hlZCBidWdzIGZvciBvbGQgZHJpdmVyCi0JCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlwQnNzLT5XZXBTdGF0dXMgICA9IHBCc3MtPldQQS5QYWlyQ2lwaGVyOwotCi0JCQkJLy8gQ2hlY2sgdGhlIFBhaXIgJiBHcm91cCwgaWYgZGlmZmVyZW50LCB0dXJuIG9uIG1peGVkIG1vZGUgZmxhZwotCQkJCWlmIChwQnNzLT5XUEEuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBLlBhaXJDaXBoZXIpCi0JCQkJCXBCc3MtPldQQS5iTWl4TW9kZSA9IFRSVUU7Ci0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBJRV9SU046Ci0JCQkJcFJzbkhlYWRlciA9IChQUlNOX0lFX0hFQURFUl9TVFJVQ1QpIHBUbXA7Ci0KLQkJCQkvLyAwLiBWZXJzaW9uIG11c3QgYmUgMQotCQkJCWlmIChsZTJjcHUxNihwUnNuSGVhZGVyLT5WZXJzaW9uKSAhPSAxKQotCQkJCQlicmVhazsKLQkJCQlwVG1wICAgKz0gc2l6ZW9mKFJTTl9JRV9IRUFERVJfU1RSVUNUKTsKLQotCQkJCS8vIDEuIENoZWNrIGdyb3VwIGNpcGhlcgotCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJaWYgKCFSVE1QRXF1YWxNZW1vcnkocFRtcCwgUlNOX09VSSwgMykpCi0JCQkJCWJyZWFrOwotCi0JCQkJLy8gUGFyc2UgZ3JvdXAgY2lwaGVyCi0JCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQotCQkJCXsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcEJzcy0+V1BBMi5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDQ6Ci0JCQkJCQlwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCS8vIHNldCB0byBjb3JyZWN0IG9mZnNldCBmb3IgbmV4dCBwYXJzaW5nCi0JCQkJcFRtcCAgICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKLQotCQkJCS8vIDIuIEdldCBwYWlyd2lzZSBjaXBoZXIgY291bnRzCi0JCQkJLy9Db3VudCA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlDb3VudCA9IChwVG1wWzFdPDw4KSArIHBUbXBbMF07Ci0JCQkJcFRtcCAgICs9IHNpemVvZihVU0hPUlQpOwotCi0JCQkJLy8gMy4gR2V0IHBhaXJ3aXNlIGNpcGhlcgotCQkJCS8vIFBhcnNpbmcgYWxsIHVuaWNhc3QgY2lwaGVyIHN1aXRlCi0JCQkJd2hpbGUgKENvdW50ID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNraXAgT1VJCi0JCQkJCXBDaXBoZXIgPSAoUENJUEhFUl9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQkJCQkJc3dpdGNoIChwQ2lwaGVyLT5UeXBlKQotCQkJCQl7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQljYXNlIDU6IC8vIEFsdGhvdWdoIFdFUCBpcyBub3QgYWxsb3dlZCBpbiBXUEEgcmVsYXRlZCBhdXRoIG1vZGUsIHdlIHBhcnNlIGl0IGFueXdheQotCQkJCQkJCVRtcENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJVG1wQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgNDoKLQkJCQkJCQlUbXBDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoVG1wQ2lwaGVyID4gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCQl7Ci0JCQkJCQkvLyBNb3ZlIHRoZSBsb3dlciBjaXBoZXIgc3VpdGUgdG8gUGFpckNpcGhlckF1eAotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyOwotCQkJCQkJcEJzcy0+V1BBMi5QYWlyQ2lwaGVyCSA9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBCc3MtPldQQTIuUGFpckNpcGhlckF1eCA9IFRtcENpcGhlcjsKLQkJCQkJfQotCQkJCQlwVG1wICs9IHNpemVvZihDSVBIRVJfU1VJVEVfU1RSVUNUKTsKLQkJCQkJQ291bnQtLTsKLQkJCQl9Ci0KLQkJCQkvLyA0LiBnZXQgQUtNIHN1aXRlIGNvdW50cwotCQkJCS8vQ291bnQJPSAqKFBVU0hPUlQpIHBUbXA7Ci0JCQkJQ291bnQgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgICArPSBzaXplb2YoVVNIT1JUKTsKLQotCQkJCS8vIDUuIEdldCBBS00gY2lwaGVycwotCQkJCS8vIFBhcnNpbmcgYWxsIEFLTSBjaXBoZXJzCi0JCQkJd2hpbGUgKENvdW50ID4gMCkKLQkJCQl7Ci0JCQkJCXBBS00gPSAoUEFLTV9TVUlURV9TVFJVQ1QpIHBUbXA7Ci0JCQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KHBUbXAsIFJTTl9PVUksIDMpKQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJc3dpdGNoIChwQUtNLT5UeXBlKQotCQkJCQl7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBLWVudGVycHJpc2UgbW9kZQotCQkJCQkJCWlmIChwQnNzLT5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotCQkJCQkJCQlwQnNzLT5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDI6Ci0JCQkJCQkJLy8gU2V0IEFQIHN1cHBvcnQgV1BBLVBTSyBtb2RlCi0JCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlQXV4ID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJaWYgKHBCc3MtPkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4pCi0JCQkJCQkJCXBCc3MtPkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlTWF4OwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcEJzcy0+QXV0aE1vZGVBdXggPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJcFRtcCAgICs9IChDb3VudCAqIHNpemVvZihBS01fU1VJVEVfU1RSVUNUKSk7Ci0JCQkJCUNvdW50LS07Ci0JCQkJfQotCi0JCQkJLy8gRml4ZWQgZm9yIFdQQS1Ob25lCi0JCQkJaWYgKHBCc3MtPkJzc1R5cGUgPT0gQlNTX0FESE9DKQotCQkJCXsKLQkJCQkJcEJzcy0+QXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotCQkJCQlwQnNzLT5BdXRoTW9kZUF1eCA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmU7Ci0JCQkJCXBCc3MtPldQQS5QYWlyQ2lwaGVyQXV4ID0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyQXV4OwotCQkJCQlwQnNzLT5XUEEuR3JvdXBDaXBoZXIJPSBwQnNzLT5XUEEyLkdyb3VwQ2lwaGVyOwotCQkJCQlwQnNzLT5XZXBTdGF0dXMJCQk9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQkJLy8gUGF0Y2hlZCBidWdzIGZvciBvbGQgZHJpdmVyCi0JCQkJCWlmIChwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9PSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCQlwQnNzLT5XUEEuUGFpckNpcGhlckF1eCA9IHBCc3MtPldQQS5Hcm91cENpcGhlcjsKLQkJCQl9Ci0JCQkJcEJzcy0+V2VwU3RhdHVzICAgPSBwQnNzLT5XUEEyLlBhaXJDaXBoZXI7Ci0KLQkJCQkvLyA2LiBHZXQgUlNOIGNhcGFiaWxpdHkKLQkJCQkvL3BCc3MtPldQQTIuUnNuQ2FwYWJpbGl0eSA9ICooUFVTSE9SVCkgcFRtcDsKLQkJCQlwQnNzLT5XUEEyLlJzbkNhcGFiaWxpdHkgPSAocFRtcFsxXTw8OCkgKyBwVG1wWzBdOwotCQkJCXBUbXAgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0KLQkJCQkvLyBDaGVjayB0aGUgUGFpciAmIEdyb3VwLCBpZiBkaWZmZXJlbnQsIHR1cm4gb24gbWl4ZWQgbW9kZSBmbGFnCi0JCQkJaWYgKHBCc3MtPldQQTIuR3JvdXBDaXBoZXIgIT0gcEJzcy0+V1BBMi5QYWlyQ2lwaGVyKQotCQkJCQlwQnNzLT5XUEEyLmJNaXhNb2RlID0gVFJVRTsKLQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQlMZW5ndGggLT0gKHBFaWQtPkxlbiArIDIpOwotCX0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbWFjX3RhYmxlLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohIFxicmllZiBnZW5lcmF0ZXMgYSByYW5kb20gbWFjIGFkZHJlc3MgdmFsdWUgZm9yIElCU1MgQlNTSUQKLSAqCVxwYXJhbSBBZGRyIHRoZSBic3NpZCBsb2NhdGlvbgotICoJXHJldHVybiBub25lCi0gKglccHJlCi0gKglccG9zdAotICovCi1WT0lEIE1hY0FkZHJSYW5kb21Cc3NpZCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBBZGRyKQotewotCUlOVCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQotCXsKLQkJcEFkZHJbaV0gPSBSYW5kb21CeXRlKHBBZCk7Ci0JfQotCi0JcEFkZHJbMF0gPSAocEFkZHJbMF0gJiAweGZlKSB8IDB4MDI7ICAvLyB0aGUgZmlyc3QgMiBiaXRzIG11c3QgYmUgMDF4eHh4eHh4eAotfQotCi0vKiEgXGJyaWVmIGluaXQgdGhlIG1hbmFnZW1lbnQgbWFjIGZyYW1lIGhlYWRlcgotICoJXHBhcmFtIHBfaGRyIG1hYyBoZWFkZXIKLSAqCVxwYXJhbSBzdWJ0eXBlIHN1YnR5cGUgb2YgdGhlIGZyYW1lCi0gKglccGFyYW0gcF9kcyBkZXN0aW5hdGlvbiBhZGRyZXNzLCBkb24ndCBjYXJlIGlmIGl0IGlzIGEgYnJvYWRjYXN0IGFkZHJlc3MKLSAqCVxyZXR1cm4gbm9uZQotICoJXHByZSB0aGUgc3RhdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgcEFkLT5TdGFDZmcKLSAqCSAtIGJzc2lkCi0gKgkgLSBzdGF0aW9uIGFkZHJlc3MKLSAqCVxwb3N0Ci0gKglcbm90ZSB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBmb2xsb3dpbmcgZmllbGQKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotVk9JRCBNZ3RNYWNIZWFkZXJJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIE9VVCBQSEVBREVSXzgwMl8xMSBwSGRyODAyMTEsCi0JSU4gVUNIQVIgU3ViVHlwZSwKLQlJTiBVQ0hBUiBUb0RzLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gUFVDSEFSIHBCc3NpZCkKLXsKLQlOZGlzWmVyb01lbW9yeShwSGRyODAyMTEsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0KLQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9NR01UOwotCXBIZHI4MDIxMS0+RkMuU3ViVHlwZSA9IFN1YlR5cGU7Ci0vLwlpZiAoU3ViVHlwZSA9PSBTVUJUWVBFX0FDSykJLy8gc2FtcGxlLCBubyB1c2UsIGl0IHdpbGwgY29uZmxpY3Qgd2l0aCBBQ1RJT04gZnJhbWUgc3ViIHR5cGUKLS8vCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9DTlRMOwotCXBIZHI4MDIxMS0+RkMuVG9EcyA9IFRvRHM7Ci0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIxLCBwREEpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCUNPUFlfTUFDX0FERFIocEhkcjgwMjExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JQ09QWV9NQUNfQUREUihwSGRyODAyMTEtPkFkZHIzLCBwQnNzaWQpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBtZW1fbWdtdC5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhpcyByb3V0aW5lIGJ1aWxkIGFuIG91dGdvaW5nIGZyYW1lLCBhbmQgZmlsbCBhbGwgaW5mb3JtYXRpb24gc3BlY2lmaWVkCi0gKiBpbiBhcmd1bWVudCBsaXN0IHRvIHRoZSBmcmFtZSBib2R5LiBUaGUgYWN0dWFsIGZyYW1lIHNpemUgaXMgdGhlIHN1bW1hdGlvbgotICogb2YgYWxsIGFyZ3VtZW50cy4KLSAqIGlucHV0IHBhcmFtczoKLSAqCQlCdWZmZXIgLSBwb2ludGVyIHRvIGEgcHJlLWFsbG9jYXRlZCBtZW1vcnkgc2VnbWVudAotICoJCWFyZ3MgLSBhIGxpc3Qgb2YgPGludCBhcmdfc2l6ZSwgYXJnPiBwYWlycy4KLSAqCQlOT1RFIE5PVEUgTk9URSEhISEgdGhlIGxhc3QgYXJndW1lbnQgbXVzdCBiZSBOVUxMLCBvdGhlcndpc2UgdGhpcwotICoJCQkJCQkgICBmdW5jdGlvbiB3aWxsIEZBSUwhISEKLSAqIHJldHVybjoKLSAqCQlTaXplIG9mIHRoZSBidWZmZXIKLSAqIHVzYWdlOgotICoJCU1ha2VPdXRnb2luZ0ZyYW1lKEJ1ZmZlciwgb3V0cHV0X2xlbmd0aCwgMiwgJmZjLCAyLCAmZHVyLCA2LCBwX2FkZHIxLCA2LHBfYWRkcjIsIEVORF9PRl9BUkdTKTsKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCi0JT1VUIFVDSEFSICpCdWZmZXIsCi0JT1VUIFVMT05HICpGcmFtZUxlbiwgLi4uKQotewotCVVDSEFSICAgKnA7Ci0JaW50CWxlbmc7Ci0JVUxPTkcJVG90TGVuZzsKLQl2YV9saXN0IEFyZ3M7Ci0KLQkvLyBjYWxjdWxhdGVzIHRoZSB0b3RhbCBsZW5ndGgKLQlUb3RMZW5nID0gMDsKLQl2YV9zdGFydChBcmdzLCBGcmFtZUxlbik7Ci0JZG8KLQl7Ci0JCWxlbmcgPSB2YV9hcmcoQXJncywgaW50KTsKLQkJaWYgKGxlbmcgPT0gRU5EX09GX0FSR1MpCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JCXAgPSB2YV9hcmcoQXJncywgUFZPSUQpOwotCQlOZGlzTW92ZU1lbW9yeSgmQnVmZmVyW1RvdExlbmddLCBwLCBsZW5nKTsKLQkJVG90TGVuZyA9IFRvdExlbmcgKyBsZW5nOwotCX0gd2hpbGUoVFJVRSk7Ci0KLQl2YV9lbmQoQXJncyk7IC8qIGNsZWFuIHVwICovCi0JKkZyYW1lTGVuID0gVG90TGVuZzsKLQlyZXR1cm4gVG90TGVuZzsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gbWxtZV9xdWV1ZS5jCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qISBcYnJpZWYJSW5pdGlhbGl6ZSBUaGUgTUxNRSBRdWV1ZSwgdXNlZCBieSBNTE1FIEZ1bmN0aW9ucwotICoJXHBhcmFtCSpRdWV1ZQkgICBUaGUgTUxNRSBRdWV1ZQotICoJXHJldHVybiBBbHdheXMJICAgUmV0dXJuIE5ESVNfU1RBVEVfU1VDQ0VTUyBpbiB0aGlzIGltcGxlbWVudGF0aW9uCi0gKglccHJlCi0gKglccG9zdAotICoJXG5vdGUJQmVjYXVzZSB0aGlzIGlzIGRvbmUgb25seSBvbmNlIChhdCB0aGUgaW5pdCBzdGFnZSksIG5vIG5lZWQgdG8gYmUgbG9ja2VkCi0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0gKi8KLU5ESVNfU1RBVFVTIE1sbWVRdWV1ZUluaXQoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpCi17Ci0JSU5UIGk7Ci0KLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmUXVldWUtPkxvY2spOwotCi0JUXVldWUtPk51bQk9IDA7Ci0JUXVldWUtPkhlYWQgPSAwOwotCVF1ZXVlLT5UYWlsID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTEVOX09GX01MTUVfUVVFVUU7IGkrKykKLQl7Ci0JCVF1ZXVlLT5FbnRyeVtpXS5PY2N1cGllZCA9IEZBTFNFOwotCQlRdWV1ZS0+RW50cnlbaV0uTXNnTGVuID0gMDsKLQkJTmRpc1plcm9NZW1vcnkoUXVldWUtPkVudHJ5W2ldLk1zZywgTUdNVF9ETUFfQlVGRkVSX1NJWkUpOwotCX0KLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0vKiEgXGJyaWVmCSBFbnF1ZXVlIGEgbWVzc2FnZSBmb3Igb3RoZXIgdGhyZWFkcywgaWYgdGhleSB3YW50IHRvIHNlbmQgbWVzc2FnZXMgdG8gTUxNRSB0aHJlYWQKLSAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQotICoJXHBhcmFtCSBNYWNoaW5lICBUaGUgU3RhdGUgTWFjaGluZSBJZAotICoJXHBhcmFtCSBNc2dUeXBlICBUaGUgTWVzc2FnZSBUeXBlCi0gKglccGFyYW0JIE1zZ0xlbiAgIFRoZSBNZXNzYWdlIGxlbmd0aAotICoJXHBhcmFtCSpNc2cJICBUaGUgbWVzc2FnZSBwb2ludGVyCi0gKglccmV0dXJuICBUUlVFIGlmIGVucXVldWUgaXMgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwKLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZQkgVGhlIG1lc3NhZ2UgaGFzIHRvIGJlIGluaXRpYWxpemVkCi0KLSBJUlFMID0gUEFTU0lWRV9MRVZFTAotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLUJPT0xFQU4gTWxtZUVucXVldWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgTWFjaGluZSwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBWT0lEICpNc2cpCi17Ci0JSU5UIFRhaWw7Ci0JTUxNRV9RVUVVRQkqUXVldWUgPSAoTUxNRV9RVUVVRSAqKSZwQWQtPk1sbWUuUXVldWU7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQlpZiAoTXNnTGVuID4gTUdNVF9ETUFfQlVGRkVSX1NJWkUpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZTogbXNnIHRvbyBsYXJnZSwgc2l6ZSA9ICVsZCBcbiIsIE1zZ0xlbikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYgKE1sbWVRdWV1ZUZ1bGwoUXVldWUpKQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCVRhaWwgPSBRdWV1ZS0+VGFpbDsKLQlRdWV1ZS0+VGFpbCsrOwotCVF1ZXVlLT5OdW0rKzsKLQlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQotCXsKLQkJUXVldWUtPlRhaWwgPSAwOwotCX0KLQotCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gUkVTRVJWRURfV0NJRDsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47Ci0KLQlpZiAoTXNnICE9IE5VTEwpCi0JewotCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7Ci0JfQotCi0JTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qISBcYnJpZWYJIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIFJlY3YgZ2V0cyBhIE1MTUUgbWVzc2FnZQotICoJXHBhcmFtCSpRdWV1ZQkJCSBUaGUgTUxNRSBRdWV1ZQotICoJXHBhcmFtCSBUaW1lU3RhbXBIaWdoCSBUaGUgdXBwZXIgMzIgYml0IG9mIHRpbWVzdGFtcAotICoJXHBhcmFtCSBUaW1lU3RhbXBMb3cJIFRoZSBsb3dlciAzMiBiaXQgb2YgdGltZXN0YW1wCi0gKglccGFyYW0JIFJzc2kJCQkgVGhlIHJlY2VpdmluZyBSU1NJIHN0cmVuZ3RoCi0gKglccGFyYW0JIE1zZ0xlbgkJCSBUaGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCi0gKglccGFyYW0JKk1zZwkJCSBUaGUgbWVzc2FnZSBwb2ludGVyCi0gKglccmV0dXJuICBUUlVFIGlmIGV2ZXJ5dGhpbmcgb2ssIEZBTFNFIG90aGVyd2lzZSAobGlrZSBRdWV1ZSBGdWxsKQotICoJXHByZQotICoJXHBvc3QKLQotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLUJPT0xFQU4gTWxtZUVucXVldWVGb3JSZWN2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVMT05HIFdjaWQsCi0JSU4gVUxPTkcgVGltZVN0YW1wSGlnaCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBMb3csCi0JSU4gVUNIQVIgUnNzaTAsCi0JSU4gVUNIQVIgUnNzaTEsCi0JSU4gVUNIQVIgUnNzaTIsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVQ0hBUiBTaWduYWwpCi17Ci0JSU5UCQkgVGFpbCwgTWFjaGluZTsKLQlQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKU1zZzsKLQlJTlQJCSBNc2dUeXBlOwotCU1MTUVfUVVFVUUJKlF1ZXVlID0gKE1MTUVfUVVFVUUgKikmcEFkLT5NbG1lLlF1ZXVlOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8qIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUgKi8KLQlpZihBVEVfT04ocEFkKSkKLQkJcmV0dXJuIEZBTFNFOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUZvclJlY3Y6IGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTU1xuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JaWYgKE1zZ0xlbiA+IE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTWxtZUVucXVldWVGb3JSZWN2OiBmcmFtZSB0b28gbGFyZ2UsIHNpemUgPSAlbGQgXG4iLCBNc2dMZW4pKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmIChNbG1lUXVldWVGdWxsKFF1ZXVlKSkKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKCFNc2dUeXBlU3Vic3QocEFkLCBwRnJhbWUsICZNYWNoaW5lLCAmTXNnVHlwZSkpCi0JCXsKLQkJCURCR1BSSU5UX0VSUigoIk1sbWVFbnF1ZXVlRm9yUmVjdjogdW4tcmVjb25nbml6ZWQgbWdtdC0+c3VidHlwZT0lZFxuIixwRnJhbWUtPkhkci5GQy5TdWJUeXBlKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBPSywgd2UgZ290IGFsbCB0aGUgaW5mb3JtYXRpb25zLCBpdCBpcyB0aW1lIHRvIHB1dCB0aGluZ3MgaW50byBxdWV1ZQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCVRhaWwgPSBRdWV1ZS0+VGFpbDsKLQlRdWV1ZS0+VGFpbCsrOwotCVF1ZXVlLT5OdW0rKzsKLQlpZiAoUXVldWUtPlRhaWwgPT0gTUFYX0xFTl9PRl9NTE1FX1FVRVVFKQotCXsKLQkJUXVldWUtPlRhaWwgPSAwOwotCX0KLQlRdWV1ZS0+RW50cnlbVGFpbF0uT2NjdXBpZWQgPSBUUlVFOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5NYWNoaW5lID0gTWFjaGluZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnVHlwZSA9IE1zZ1R5cGU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1zZ0xlbiAgPSBNc2dMZW47Ci0JUXVldWUtPkVudHJ5W1RhaWxdLlRpbWVTdGFtcC51Lkxvd1BhcnQgPSBUaW1lU3RhbXBMb3c7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLlRpbWVTdGFtcC51LkhpZ2hQYXJ0ID0gVGltZVN0YW1wSGlnaDsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTAgPSBSc3NpMDsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTEgPSBSc3NpMTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uUnNzaTIgPSBSc3NpMjsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uU2lnbmFsID0gU2lnbmFsOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5XY2lkID0gKFVDSEFSKVdjaWQ7Ci0KLQlRdWV1ZS0+RW50cnlbVGFpbF0uQ2hhbm5lbCA9IHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbDsKLQotCWlmIChNc2cgIT0gTlVMTCkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KFF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2csIE1zZywgTXNnTGVuKTsKLQl9Ci0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKiEgXGJyaWVmCSBEZXF1ZXVlIGEgbWVzc2FnZSBmcm9tIHRoZSBNTE1FIFF1ZXVlCi0gKglccGFyYW0JKlF1ZXVlCSAgVGhlIE1MTUUgUXVldWUKLSAqCVxwYXJhbQkqRWxlbQkgIFRoZSBtZXNzYWdlIGRlcXVldWVkIGZyb20gTUxNRSBRdWV1ZQotICoJXHJldHVybiAgVFJVRSBpZiB0aGUgRWxlbSBjb250YWlucyBzb21ldGhpbmcsIEZBTFNFIG90aGVyd2lzZQotICoJXHByZQotICoJXHBvc3QKLQotIElSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gKi8KLUJPT0xFQU4gTWxtZURlcXVldWUoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUsCi0JT1VUIE1MTUVfUVVFVUVfRUxFTSAqKkVsZW0pCi17Ci0JTmRpc0FjcXVpcmVTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0JKkVsZW0gPSAmKFF1ZXVlLT5FbnRyeVtRdWV1ZS0+SGVhZF0pOwotCVF1ZXVlLT5OdW0tLTsKLQlRdWV1ZS0+SGVhZCsrOwotCWlmIChRdWV1ZS0+SGVhZCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JewotCQlRdWV1ZS0+SGVhZCA9IDA7Ci0JfQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCXJldHVybiBUUlVFOwotfQotCi0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQJTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JTUxNRV9RVUVVRV9FTEVNCQkqRWxlbSA9IE5VTEw7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JQk9PTEVBTgkJCQlDYW5jZWxsZWQ7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lUmVzdGFydFN0YXRlTWFjaGluZSBcbiIpKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWxtZS5UYXNrTG9jayk7Ci0JaWYocEFkLT5NbG1lLmJSdW5uaW5nKQotCXsKLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlCi0JewotCQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBUUlVFOwotCX0KLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotCi0JLy8gUmVtb3ZlIGFsbCBNbG1lIHF1ZXVlcyBlbGVtZW50cwotCXdoaWxlICghTWxtZVF1ZXVlRW1wdHkoJnBBZC0+TWxtZS5RdWV1ZSkpCi0JewotCQkvL0Zyb20gbWVzc2FnZSB0eXBlLCBkZXRlcm1pbmUgd2hpY2ggc3RhdGUgbWFjaGluZSBJIHNob3VsZCBkcml2ZQotCQlpZiAoTWxtZURlcXVldWUoJnBBZC0+TWxtZS5RdWV1ZSwgJkVsZW0pKQotCQl7Ci0JCQkvLyBmcmVlIE1MTUUgZWxlbWVudAotCQkJRWxlbS0+T2NjdXBpZWQgPSBGQUxTRTsKLQkJCUVsZW0tPk1zZ0xlbiA9IDA7Ci0KLQkJfQotCQllbHNlIHsKLQkJCURCR1BSSU5UX0VSUigoIk1sbWVSZXN0YXJ0U3RhdGVNYWNoaW5lOiBNbG1lUXVldWUgZW1wdHlcbiIpKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlVQ0hBUiBpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQkvLyBDYW5jZWwgYWxsIHRpbWVyIGV2ZW50cwotCQkvLyBCZSBjYXJlZnVsIHRvIGNhbmNlbCBuZXcgYWRkZWQgdGltZXIKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXNzb2NUaW1lciwJICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAgICZDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwJICAgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLAkgICAmQ2FuY2VsbGVkKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmQ2FuY2VsbGVkKTsKLQkJfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIENoYW5nZSBiYWNrIHRvIG9yaWdpbmFsIGNoYW5uZWwgaW4gY2FzZSBvZiBkb2luZyBzY2FuCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkvLyBSZXN1bWUgTVNEVSB3aGljaCBpcyB0dXJuZWQgb2ZmIGR1cm5pbmcgc2NhbgotCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gU2V0IGFsbCBzdGF0ZSBtYWNoaW5lcyBiYWNrIElETEUKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IENOVExfSURMRTsKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgICA9IEFTU09DX0lETEU7Ci0JCXBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgICAgPSBBVVRIX1JFUV9JRExFOwotCQlwQWQtPk1sbWUuQXV0aFJzcE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SU1BfSURMRTsKLQkJcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IFNZTkNfSURMRTsKLQkJcEFkLT5NbG1lLkFjdE1hY2hpbmUuQ3VyclN0YXRlICAgID0gQUNUX0lETEU7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCXBBZC0+TWxtZS5EbHNNYWNoaW5lLkN1cnJTdGF0ZSAgICA9IERMU19JRExFOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCS8vIFJlbW92ZSBydW5uaW5nIHN0YXRlCi0JTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NbG1lLlRhc2tMb2NrKTsKLQlwQWQtPk1sbWUuYlJ1bm5pbmcgPSBGQUxTRTsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCZwQWQtPk1sbWUuVGFza0xvY2spOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotfQotCi0vKiEgXGJyaWVmCXRlc3QgaWYgdGhlIE1MTUUgUXVldWUgaXMgZW1wdHkKLSAqCVxwYXJhbQkqUXVldWUJICBUaGUgTUxNRSBRdWV1ZQotICoJXHJldHVybiBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotQk9PTEVBTiBNbG1lUXVldWVFbXB0eSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSkKLXsKLQlCT09MRUFOIEFuczsKLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCUFucyA9IChRdWV1ZS0+TnVtID09IDApOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJihRdWV1ZS0+TG9jaykpOwotCi0JcmV0dXJuIEFuczsKLX0KLQotLyohIFxicmllZgkgdGVzdCBpZiB0aGUgTUxNRSBRdWV1ZSBpcyBmdWxsCi0gKglccGFyYW0JICpRdWV1ZQkJIFRoZSBNTE1FIFF1ZXVlCi0gKglccmV0dXJuICBUUlVFIGlmIHRoZSBRdWV1ZSBpcyBlbXB0eSwgRkFMU0Ugb3RoZXJ3aXNlCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLSBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICovCi1CT09MRUFOIE1sbWVRdWV1ZUZ1bGwoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpCi17Ci0JQk9PTEVBTiBBbnM7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCYoUXVldWUtPkxvY2spKTsKLQlBbnMgPSAoUXVldWUtPk51bSA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUgfHwgUXVldWUtPkVudHJ5W1F1ZXVlLT5UYWlsXS5PY2N1cGllZCk7Ci0JTmRpc1JlbGVhc2VTcGluTG9jaygmKFF1ZXVlLT5Mb2NrKSk7Ci0KLQlyZXR1cm4gQW5zOwotfQotCi0vKiEgXGJyaWVmCSBUaGUgZGVzdHJ1Y3RvciBvZiBNTE1FIFF1ZXVlCi0gKglccGFyYW0KLSAqCVxyZXR1cm4KLSAqCVxwcmUKLSAqCVxwb3N0Ci0gKglcbm90ZQlDbGVhciBNbG1lIFF1ZXVlLCBTZXQgUXVldWUtPk51bSB0byBaZXJvLgotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotICovCi1WT0lEIE1sbWVRdWV1ZURlc3Ryb3koCi0JSU4gTUxNRV9RVUVVRSAqcFF1ZXVlKQotewotCU5kaXNBY3F1aXJlU3BpbkxvY2soJihwUXVldWUtPkxvY2spKTsKLQlwUXVldWUtPk51bSAgPSAwOwotCXBRdWV1ZS0+SGVhZCA9IDA7Ci0JcFF1ZXVlLT5UYWlsID0gMDsKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYocFF1ZXVlLT5Mb2NrKSk7Ci0JTmRpc0ZyZWVTcGluTG9jaygmKHBRdWV1ZS0+TG9jaykpOwotfQotCi0KLS8qISBcYnJpZWYJIFRvIHN1YnN0aXR1dGUgdGhlIG1lc3NhZ2UgdHlwZSBpZiB0aGUgbWVzc2FnZSBpcyBjb21pbmcgZnJvbSBleHRlcm5hbAotICoJXHBhcmFtCXBGcmFtZQkJICAgVGhlIGZyYW1lIHJlY2VpdmVkCi0gKglccGFyYW0JKk1hY2hpbmUJICAgVGhlIHN0YXRlIG1hY2hpbmUKLSAqCVxwYXJhbQkqTXNnVHlwZQkgICB0aGUgbWVzc2FnZSB0eXBlIGZvciB0aGUgc3RhdGUgbWFjaGluZQotICoJXHJldHVybiBUUlVFIGlmIHRoZSBzdWJzdGl0dXRpb24gaXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlCi0gKglccHJlCi0gKglccG9zdAotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotQk9PTEVBTiBNc2dUeXBlU3Vic3QoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFBGUkFNRV84MDJfMTEgcEZyYW1lLAotCU9VVCBJTlQgKk1hY2hpbmUsCi0JT1VUIElOVCAqTXNnVHlwZSkKLXsKLQlVU0hPUlQJU2VxLCBBbGc7Ci0JVUNIQVIJRUFQVHlwZTsKLQlQVUNIQVIJcERhdGE7Ci0KLQkvLyBQb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEgZnJhbWVzIGluY2x1ZGluZyBTTkFQIGhlYWRlcgotCXBEYXRhID0gKFBVQ0hBUikgcEZyYW1lICsgTEVOR1RIXzgwMl8xMTsKLQotCS8vIFRoZSBvbmx5IGRhdGEgdHlwZSB3aWxsIHBhc3MgdG8gdGhpcyBmdW5jdGlvbiBpcyBFQVBPTCBmcmFtZQotCWlmIChwRnJhbWUtPkhkci5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0JewotCQl7Ci0JICAgICAgICAqTWFjaGluZSA9IFdQQV9TVEFURV9NQUNISU5FOwotCQkJRUFQVHlwZSA9ICooKFVDSEFSKilwRnJhbWUgKyBMRU5HVEhfODAyXzExICsgTEVOR1RIXzgwMl8xX0ggKyAxKTsKLQkgICAgICAgIHJldHVybiAoV3BhTXNnVHlwZVN1YnN0KEVBUFR5cGUsIChJTlQgKikgTXNnVHlwZSkpOwotCQl9Ci0JfQotCi0Jc3dpdGNoIChwRnJhbWUtPkhkci5GQy5TdWJUeXBlKQotCXsKLQkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9BU1NPQ19SU1A6Ci0JCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FTU09DX1JTUDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfUkVBU1NPQ19SRVE6Ci0JCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX1JFQVNTT0NfUkVROwotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JTUDoKLQkJCSpNYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfUkVBU1NPQ19SU1A7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1BST0JFX1JFUToKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SRVE7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX1BST0JFX1JTUDoKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9QUk9CRV9SU1A7Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0JFQUNPTjoKLQkJCSpNYWNoaW5lID0gU1lOQ19TVEFURV9NQUNISU5FOwotCQkJKk1zZ1R5cGUgPSBNVDJfUEVFUl9CRUFDT047Ci0JCQlicmVhazsKLQkJY2FzZSBTVUJUWVBFX0FUSU06Ci0JCQkqTWFjaGluZSA9IFNZTkNfU1RBVEVfTUFDSElORTsKLQkJCSpNc2dUeXBlID0gTVQyX1BFRVJfQVRJTTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6Ci0JCQkqTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RJU0FTU09DX1JFUTsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQVVUSDoKLQkJCS8vIGdldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gcGF5bG9hZCAyNCBNYWMgSGVhZGVyICsgMiBieXRlcyBhbGdvcml0aG0KLQkJCU5kaXNNb3ZlTWVtb3J5KCZTZXEsICZwRnJhbWUtPk9jdGV0WzJdLCBzaXplb2YoVVNIT1JUKSk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmQWxnLCAmcEZyYW1lLT5PY3RldFswXSwgc2l6ZW9mKFVTSE9SVCkpOwotCQkJaWYgKFNlcSA9PSAxIHx8IFNlcSA9PSAzKQotCQkJewotCQkJCSpNYWNoaW5lID0gQVVUSF9SU1BfU1RBVEVfTUFDSElORTsKLQkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfT0REOwotCQkJfQotCQkJZWxzZSBpZiAoU2VxID09IDIgfHwgU2VxID09IDQpCi0JCQl7Ci0JCQkJaWYgKEFsZyA9PSBBVVRIX01PREVfT1BFTiB8fCBBbGcgPT0gQVVUSF9NT0RFX0tFWSkKLQkJCQl7Ci0JCQkJCSpNYWNoaW5lID0gQVVUSF9TVEFURV9NQUNISU5FOwotCQkJCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0FVVEhfRVZFTjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU1VCVFlQRV9ERUFVVEg6Ci0JCQkqTWFjaGluZSA9IEFVVEhfUlNQX1NUQVRFX01BQ0hJTkU7Ci0JCQkqTXNnVHlwZSA9IE1UMl9QRUVSX0RFQVVUSDsKLQkJCWJyZWFrOwotCQljYXNlIFNVQlRZUEVfQUNUSU9OOgotCQkJKk1hY2hpbmUgPSBBQ1RJT05fU1RBVEVfTUFDSElORTsKLQkJCS8vICBTb21ldGltZXMgU3RhIHdpbGwgcmV0dXJuIHdpdGggY2F0ZWdvcnkgYnl0ZXMgd2l0aCBNU0IgPSAxLCBpZiB0aGV5IHJlY2VpdmUgY2F0b2dvcnkgb3V0IG9mIHRoZWlyIHN1cHBvcnQKLQkJCWlmICgocEZyYW1lLT5PY3RldFswXSYweDdGKSA+IE1BWF9QRUVSX0NBVEVfTVNHKQotCQkJewotCQkJCSpNc2dUeXBlID0gTVQyX0FDVF9JTlZBTElEOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpNc2dUeXBlID0gKHBGcmFtZS0+T2N0ZXRbMF0mMHg3Rik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBGQUxTRTsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBzdGF0ZV9tYWNoaW5lLmMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLyohIFxicmllZiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLgotICoJXHBhcmFtICpTCQkJcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtCVRyYW5zCQlTdGF0ZSBtYWNoaW5lIHRyYW5zaXRpb24gZnVuY3Rpb24KLSAqCVxwYXJhbQlTdE5yCQludW1iZXIgb2Ygc3RhdGVzCi0gKglccGFyYW0JTXNnTnIJCW51bWJlciBvZiBtZXNzYWdlcwotICoJXHBhcmFtCURlZkZ1bmMJCWRlZmF1bHQgZnVuY3Rpb24sIHdoZW4gdGhlcmUgaXMgaW52YWxpZCBzdGF0ZS9tZXNzYWdlIGNvbWJpbmF0aW9uCi0gKglccGFyYW0JSW5pdFN0YXRlCWluaXRpYWwgc3RhdGUgb2YgdGhlIHN0YXRlIG1hY2hpbmUKLSAqCVxwYXJhbQlCYXNlCQlTdGF0ZU1hY2hpbmUgYmFzZSwgaW50ZXJuYWwgdXNlIG9ubHkKLSAqCVxwcmUgcF9zbSBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyCi0gKglccG9zdAotCi0gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotICovCi1WT0lEIFN0YXRlTWFjaGluZUluaXQoCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKQotewotCVVMT05HIGksIGo7Ci0KLQkvLyBzZXQgbnVtYmVyIG9mIHN0YXRlcyBhbmQgbWVzc2FnZXMKLQlTLT5OclN0YXRlID0gU3ROcjsKLQlTLT5Ock1zZyAgID0gTXNnTnI7Ci0JUy0+QmFzZSAgICA9IEJhc2U7Ci0KLQlTLT5UcmFuc0Z1bmMgID0gVHJhbnM7Ci0KLQkvLyBpbml0IGFsbCBzdGF0ZSB0cmFuc2l0aW9uIHRvIGRlZmF1bHQgZnVuY3Rpb24KLQlmb3IgKGkgPSAwOyBpIDwgU3ROcjsgaSsrKQotCXsKLQkJZm9yIChqID0gMDsgaiA8IE1zZ05yOyBqKyspCi0JCXsKLQkJCVMtPlRyYW5zRnVuY1tpICogTXNnTnIgKyBqXSA9IERlZkZ1bmM7Ci0JCX0KLQl9Ci0KLQkvLyBzZXQgdGhlIHN0YXJ0aW5nIHN0YXRlCi0JUy0+Q3VyclN0YXRlID0gSW5pdFN0YXRlOwotfQotCi0vKiEgXGJyaWVmIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW50byB0aGUgY2VsbCBpbiB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtICpTCXBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKLSAqCVxwYXJhbSBTdAlzdGF0ZQotICoJXHBhcmFtIE1zZwlpbmNvbWluZyBtZXNzYWdlCi0gKglccGFyYW0gZgl0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2hlbiAoc3RhdGUsIG1lc3NhZ2UpIGNvbWJpbmF0aW9uIG9jY3VycyBhdCB0aGUgc3RhdGUgbWFjaGluZQotICoJXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQotICoJXHBvc3QKLQotIElSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAqLwotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oCi0JSU4gU1RBVEVfTUFDSElORSAqUywKLQlJTiBVTE9ORyBTdCwKLQlJTiBVTE9ORyBNc2csCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIEZ1bmMpCi17Ci0JVUxPTkcgTXNnSWR4OwotCi0JTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKLQotCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCi0JewotCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCi0JCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7Ci0JfQotfQotCi0vKiEgXGJyaWVmCSBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHN0YXRlIHRyYW5zaXRpb24KLSAqCVxwYXJhbQkgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKLSAqCVxwYXJhbQkgKlMJICB0aGUgc3RhdGUgbWFjaGluZQotICoJXHBhcmFtCSAqRWxlbQkgIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkCi0gKglccmV0dXJuICAgTm9uZQotCi0gSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAqLwotVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCSgqKFMtPlRyYW5zRnVuY1tTLT5DdXJyU3RhdGUgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkpKHBBZCwgRWxlbSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhlIGRyb3AgZnVuY3Rpb24sIHdoZW4gbWFjaGluZSBleGVjdXRlcyB0aGlzLCB0aGUgbWVzc2FnZSBpcyBzaW1wbHkKLQkJaWdub3JlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIHRoZSBtZXNzYWdlIGlzIGZyZWVkIGluCi0JCVN0YXRlTWFjaGluZVBlcmZvcm1BY3Rpb24oKQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRHJvcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGxmc3IuYwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBMZnNySW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBTZWVkKQotewotCWlmIChTZWVkID09IDApCi0JCXBBZC0+TWxtZS5TaGlmdFJlZyA9IDE7Ci0JZWxzZQotCQlwQWQtPk1sbWUuU2hpZnRSZWcgPSBTZWVkOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVUNIQVIgUmFuZG9tQnl0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVTE9ORyBpOwotCVVDSEFSIFIsIFJlc3VsdDsKLQotCVIgPSAwOwotCi0JaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyA9PSAwKQotCU5kaXNHZXRTeXN0ZW1VcFRpbWUoKFVMT05HICopJnBBZC0+TWxtZS5TaGlmdFJlZyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCXsKLQkJaWYgKHBBZC0+TWxtZS5TaGlmdFJlZyAmIDB4MDAwMDAwMDEpCi0JCXsKLQkJCXBBZC0+TWxtZS5TaGlmdFJlZyA9ICgocEFkLT5NbG1lLlNoaWZ0UmVnIF4gTEZTUl9NQVNLKSA+PiAxKSB8IDB4ODAwMDAwMDA7Ci0JCQlSZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEFkLT5NbG1lLlNoaWZ0UmVnID0gcEFkLT5NbG1lLlNoaWZ0UmVnID4+IDE7Ci0JCQlSZXN1bHQgPSAwOwotCQl9Ci0JCVIgPSAoUiA8PCAxKSB8IFJlc3VsdDsKLQl9Ci0KLQlyZXR1cm4gUjsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVmVyaWZ5IHRoZSBzdXBwb3J0IHJhdGUgZm9yIGRpZmZlcmVudCBQSFkgdHlwZQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QQ2hlY2tSYXRlcygKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gT1VUCVVDSEFSCQkJU3VwUmF0ZVtdLAotCUlOIE9VVAlVQ0hBUgkJCSpTdXBSYXRlTGVuKQotewotCVVDSEFSCVJhdGVJZHgsIGksIGo7Ci0JVUNIQVIJTmV3UmF0ZVsxMl0sIE5ld1JhdGVMZW47Ci0KLQlOZXdSYXRlTGVuID0gMDsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUIpCi0JCVJhdGVJZHggPSA0OwotCWVsc2UKLQkJUmF0ZUlkeCA9IDEyOwotCi0JLy8gQ2hlY2sgZm9yIHN1cHBvcnQgcmF0ZXMgZXhjbHVkZSBiYXNpYyByYXRlIGJpdAotCWZvciAoaSA9IDA7IGkgPCAqU3VwUmF0ZUxlbjsgaSsrKQotCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQotCQkJaWYgKChTdXBSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQotCQkJCU5ld1JhdGVbTmV3UmF0ZUxlbisrXSA9IFN1cFJhdGVbaV07Ci0KLQkqU3VwUmF0ZUxlbiA9IE5ld1JhdGVMZW47Ci0JTmRpc01vdmVNZW1vcnkoU3VwUmF0ZSwgTmV3UmF0ZSwgTmV3UmF0ZUxlbik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLUJPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCi0JSU4gVUNIQVIJCUNoYW5uZWwpCi17Ci0JVUNIQVIJCWs7Ci0JVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7Ci0JVUNIQVIJCU5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9IDA7Ci0KLQkvLyBGaW5kIHVwcGVyIGFuZCBsb3dlciBjaGFubmVsIGFjY29yZGluZyB0byA0ME1IeiBjdXJyZW50IG9wZXJhdGlvbi4KLQlpZiAoQ2VudHJhbENoYW5uZWwgPCBDaGFubmVsKQotCXsKLQkJVXBwZXJDaGFubmVsID0gQ2hhbm5lbDsKLQkJaWYgKENlbnRyYWxDaGFubmVsID4gMikKLQkJCUxvd2VyQ2hhbm5lbCA9IENlbnRyYWxDaGFubmVsIC0gMjsKLQkJZWxzZQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlIGlmIChDZW50cmFsQ2hhbm5lbCA+IENoYW5uZWwpCi0JewotCQlVcHBlckNoYW5uZWwgPSBDZW50cmFsQ2hhbm5lbCArIDI7Ci0JCUxvd2VyQ2hhbm5lbCA9IENoYW5uZWw7Ci0JfQotCi0JZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCi0JewotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtrXS5DaGFubmVsID09IFVwcGVyQ2hhbm5lbCkKLQkJewotCQkJTm9FZmZlY3RDaGFubmVsaW5MaXN0ICsrOwotCQl9Ci0JCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gTG93ZXJDaGFubmVsKQotCQl7Ci0JCQlOb0VmZmVjdENoYW5uZWxpbkxpc3QgKys7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlRvdGFsIENoYW5uZWwgaW4gQ2hhbm5lbCBMaXN0ID0gWyVkXVxuIiwgTm9FZmZlY3RDaGFubmVsaW5MaXN0KSk7Ci0JaWYgKE5vRWZmZWN0Q2hhbm5lbGluTGlzdCA9PSAyKQotCQlyZXR1cm4gVFJVRTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVZlcmlmeSB0aGUgc3VwcG9ydCByYXRlIGZvciBIVCBwaHkgdHlwZQotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlGQUxTRSBpZiBwQWQtPkNvbW1vbkNmZy5TdXBwb3J0ZWRIdFBoeSBkb2Vzbid0IGFjY2VwdCB0aGUgcEh0Q2FwYWJpbGl0eS4gIChBUCBNb2RlKQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4JCVJUTVBDaGVja0h0KAotCUlOCVBSVE1QX0FEQVBURVIJCQlwQWQsCi0JSU4JVUNIQVIJCQkJCVdjaWQsCi0JSU4JSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0JSU4JQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbykKLXsKLQlpZiAoV2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JLy8gSWYgdXNlIEFNU0RVLCBzZXQgZmxhZy4KLQlpZiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpOwotCS8vIFNhdmUgUGVlciBDYXBhYmlsaXR5Ci0JaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCi0JCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0sIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwotCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKLQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQykKLQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRygmcEFkLT5NYWNUYWIuQ29udGVudFtXY2lkXSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOwotCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDKQotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCi0JewotCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKCZwQWQtPk1hY1RhYi5Db250ZW50W1djaWRdLCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JfQotCi0JaWYgKFdjaWQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQl7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uTXBkdURlbnNpdHkgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JfQotCi0JLy8gV2lsbCBjaGVjayBDaGFubmVsV2lkdGggZm9yIE1DU1NldFs0XSBiZWxvdwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgxOwotICAgIHN3aXRjaCAocEFkLT5Db21tb25DZmcuUnhTdHJlYW0pCi0JewotCQljYXNlIDE6Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDB4ZmY7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lk1DU1NldFszXSA9IDB4MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAweGZmOwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAweGZmOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbMl0gPSAweDAwOwotICAgICAgICAgICAgcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5NQ1NTZXRbM10gPSAweDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzBdID0gMHhmZjsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzFdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzJdID0gMHhmZjsKLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzNdID0gMHgwMDsKLQkJCWJyZWFrOwotCX0KLQotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9IHBBZGRIdEluZm8tPkFkZEh0SW5mby5SZWNvbVdpZHRoICYgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aDsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBDaGVja0h0OjogSHRDYXBJbmZvLkNoYW5uZWxXaWR0aD0lZCwgUmVjb21XaWR0aD0lZCwgRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aD0lZCwgQlc0ME1BdmFpbEZvckEvRz0lZC8lZCwgUGh5TW9kZT0lZCBcbiIsCi0JCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCwgcEFkZEh0SW5mby0+QWRkSHRJbmZvLlJlY29tV2lkdGgsIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgsCi0JCXBBZC0+TmljQ29uZmlnMi5maWVsZC5CVzQwTUF2YWlsRm9yQSwgcEFkLT5OaWNDb25maWcyLmZpZWxkLkJXNDBNQXZhaWxGb3JHLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0KLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRiA9ICBwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uR0YgJnBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRjsKLQotCS8vIFNlbmQgQXNzb2MgUmVxIHdpdGggbXkgSFQgY2FwYWJpbGl0eS4KLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemUgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1U2l6ZTsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHMgPSAgcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QczsKLQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjAgPSAgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApICYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCA9ICAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkgJiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQyk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDID0gIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuUnhTVEJDKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlR4U1RCQyk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yID0gcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1heFJBbXBkdUZhY3RvcjsKLSAgICBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eSA9IHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQyA9IHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5QbHVzSFRDOwotCXBBZC0+TWFjVGFiLkNvbnRlbnRbV2NpZF0uSFRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlBsdXNIVEM7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcpCi0JewotCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0ID0gcEh0Q2FwYWJpbGl0eS0+RXh0SHRDYXBJbmZvLlJER1N1cHBvcnQ7Ci0gICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlBsdXNIVEMgPSAxOwotCX0KLQotICAgIGlmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfMjApCi0gICAgICAgIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuTUNTU2V0WzRdID0gMHgwOyAgLy8gQlcyMCBjYW4ndCB0cmFuc21pdCBNQ1MzMgotCi0JQ09QWV9BUF9IVFNFVFRJTkdTX0ZST01fQkVBQ09OKHBBZCwgcEh0Q2FwYWJpbGl0eSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlWZXJpZnkgdGhlIHN1cHBvcnQgcmF0ZSBmb3IgZGlmZmVyZW50IFBIWSB0eXBlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBVcGRhdGVNbG1lUmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVQ0hBUglNaW5pbXVtUmF0ZTsKLQlVQ0hBUglQcm9wZXJNbG1lUmF0ZTsgLy89IFJBVEVfNTQ7Ci0JVUNIQVIJaSwgaiwgUmF0ZUlkeCA9IDEyOyAvLzEsIDIsIDUuNSwgMTEsIDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKLQlCT09MRUFOCWJNYXRjaCA9IEZBTFNFOwotCi0Jc3dpdGNoIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFCOgotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOwotCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFCR19NSVhFRDoKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotCQljYXNlIFBIWV8xMUJHTl9NSVhFRDoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPT0gNCkgJiYKLQkJCQkocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPT0gMCkpCi0JCQkJLy8gQiBvbmx5IEFQCi0JCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzExOwotCQkJZWxzZQotCQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKLQotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQllbHNlCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJY2FzZSBQSFlfMTFBOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMU5fMl80RzoJLy8gcnQyODYwIG5lZWQgdG8gY2hlY2sgbWxtZXJhdGUgZm9yIDgwMi4xMW4KLQkJY2FzZSBQSFlfMTFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBR05fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExQU5fTUlYRUQ6Ci0JCWNhc2UgUEhZXzExTl81RzoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8yNDsKLQkJCU1pbmltdW1SYXRlID0gUkFURV82OwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotCQkJUHJvcGVyTWxtZVJhdGUgPSBSQVRFXzI0OwotCQkJaWYgKHBBZC0+TWxtZUF1eC5DaGFubmVsIDw9IDE0KQotCQkJICAgTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQllbHNlCi0JCQkJTWluaW11bVJhdGUgPSBSQVRFXzY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDogLy8gZXJyb3IKLQkJCVByb3Blck1sbWVSYXRlID0gUkFURV8xOwotCQkJTWluaW11bVJhdGUgPSBSQVRFXzE7Ci0JCQlicmVhazsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW47IGkrKykKLQl7Ci0JCWZvciAoaiA9IDA7IGogPCBSYXRlSWR4OyBqKyspCi0JCXsKLQkJCWlmICgocEFkLT5NbG1lQXV4LlN1cFJhdGVbaV0gJiAweDdmKSA9PSBSYXRlSWRUbzUwMEticHNbal0pCi0JCQl7Ci0JCQkJaWYgKGogPT0gUHJvcGVyTWxtZVJhdGUpCi0JCQkJewotCQkJCQliTWF0Y2ggPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYk1hdGNoKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGJNYXRjaCA9PSBGQUxTRSkKLQl7Ci0JZm9yIChpID0gMDsgaSA8IHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuOyBpKyspCi0JewotCQlmb3IgKGogPSAwOyBqIDwgUmF0ZUlkeDsgaisrKQotCQl7Ci0JCQlpZiAoKHBBZC0+TWxtZUF1eC5FeHRSYXRlW2ldICYgMHg3ZikgPT0gUmF0ZUlkVG81MDBLYnBzW2pdKQotCQkJewotCQkJCQlpZiAoaiA9PSBQcm9wZXJNbG1lUmF0ZSkKLQkJCQkJewotCQkJCQkJYk1hdGNoID0gVFJVRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkJaWYgKGJNYXRjaCkKLQkJCWJyZWFrOwotCX0KLQl9Ci0KLQlpZiAoYk1hdGNoID09IEZBTFNFKQotCXsKLQkJUHJvcGVyTWxtZVJhdGUgPSBNaW5pbXVtUmF0ZTsKLQl9Ci0KLQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IE1pbmltdW1SYXRlOwotCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBQcm9wZXJNbG1lUmF0ZTsKLQlpZiAocEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPj0gUkFURV82KQotCXsKLQkJcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZV07Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCX0KLQllbHNlCi0JewotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gcEFkLT5Db21tb25DZmcuTWxtZVJhdGU7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTME1jYXN0X1dDSURdLkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QVXBkYXRlTWxtZVJhdGUgPT0+ICAgTWxtZVRyYW5zbWl0ID0gMHgleCAgXG4iICwgcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0LndvcmQpKTsKLX0KLQotQ0hBUiBSVE1QTWF4UnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMikKLXsKLQlDSEFSCWxhcmdlciA9IC0xMjc7Ci0KLQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkgJiYgKFJzc2kwICE9IDApKQotCXsKLQkJbGFyZ2VyID0gUnNzaTA7Ci0JfQotCi0JaWYgKChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID49IDIpICYmIChSc3NpMSAhPSAwKSkKLQl7Ci0JCWxhcmdlciA9IG1heChSc3NpMCwgUnNzaTEpOwotCX0KLQotCWlmICgocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKSAmJiAoUnNzaTIgIT0gMCkpCi0JewotCQlsYXJnZXIgPSBtYXgobGFyZ2VyLCBSc3NpMik7Ci0JfQotCi0JaWYgKGxhcmdlciA9PSAtMTI3KQotCQlsYXJnZXIgPSAwOwotCi0JcmV0dXJuIGxhcmdlcjsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIFBlcmlvZGljIGV2YWx1YXRlIGFudGVubmEgbGluayBzdGF0dXMKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkICAgICAgICAgLSBBZGFwdGVyIHBvaW50ZXIKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgTm9uZQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBc2ljRXZhbHVhdGVSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVQ0hBUglCQlBSMyA9IDA7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUwl8Ci0JCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX1JBRElPX09GRgkJCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QJCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSB8fAotCQkJCQkJCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSkKLSNpZmRlZiBSVDMwOTAKLQkJCQkJCQl8fCAocEFkLT5iUENJY2xrT2ZmID09IFRSVUUpCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JCQkJCQkJfHwgKHBBZC0+RWVwcm9tQWNjZXNzKQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCQkJCQkJCSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSAmJiAocEFkLT5Db21tb25DZmcuYlJ4QW50RGl2ZXJzaXR5ID09IEFOVF9ESVZFUlNJVFlfRU5BQkxFKSkKLQl7Ci0JCS8vIHR3byBhbnRlbm5hIHNlbGVjdGlvbiBtZWNoYW5pc20tIG9uZSBpcyBhbnRlbm5hIGRpdmVyc2l0eSwgdGhlIG90aGVyIGlzIGZhaWxlZCBhbnRlbm5hIHJlbW92ZQotCQkvLyBvbmUgaXMgYW50ZW5uYSBkaXZlcnNpdHk6dGhlcmUgaXMgb25seSBvbmUgYW50ZW5uYSBjYW4gcnggYW5kIHR4Ci0JCS8vIHRoZSBvdGhlciBpcyBmYWlsZWQgYW50ZW5uYSByZW1vdmU6dHdvIHBoeXNpY2FsIGFudGVubmEgY2FuIHJ4IGFuZCB0eAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBbnREaXYgLSBiZWZvcmUgZXZhbHVhdGUgUGFpcjEtQW50ICglZCwlZClcbiIsCi0JCQkJcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCwgcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50KSk7Ci0KLQkJCUFzaWNTZXRSeEFudChwQWQsIHBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCk7Ci0KLQkJCXBBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPSAxOyAvLyAxOk1lYW5zIHN3aXRjaCB0byBTZWNvbmRhcnlSeEFudCwgMDpNZWFucyBzd2l0Y2ggdG8gUGFpcjFQcmltYXJ5UnhBbnQKLQkJCXBBZC0+UnhBbnQuRmlyc3RQa3RBcnJpdmVkV2hlbkV2YWx1YXRlID0gRkFMU0U7Ci0JCQlwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSA9IDA7Ci0KLQkJCS8vIGEgb25lLXNob3QgdGltZXIgdG8gZW5kIHRoZSBldmFsdXRpb24KLQkJCS8vIGR5bmFtaWMgYWRqdXN0IGFudGVubmEgZXZhbHVhdGlvbiBwZXJpb2QgYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljCi0JCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAxMDApOwotCQkJZWxzZQotCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAzMDApOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQl7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCXsKLQotCQkJaWYgKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkKLQkJCQlyZXR1cm47Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJCUFIzKTsKLQkJCUJCUFIzICY9ICh+MHgxOCk7Ci0JCQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JCQl7Ci0JCQkJQkJQUjMgfD0gKDB4MTApOwotCQkJfQotCQkJZWxzZSBpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQl7Ci0JCQkJQkJQUjMgfD0gKDB4OCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHgwKTsKLQkJCX0KLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJCUFIzKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKQotCQkJKQotCQkJewotCQkJCVVMT05HCVR4VG90YWxDbnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQgKwotCQkJCQkJCQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeFJldHJ5T2tDb3VudCArCi0JCQkJCQkJCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RmFpbENvdW50OwotCi0JCQkJLy8gZHluYW1pYyBhZGp1c3QgYW50ZW5uYSBldmFsdWF0aW9uIHBlcmlvZCBhY2NvcmRpbmcgdG8gdGhlIHRyYWZmaWMKLQkJCQlpZiAoVHhUb3RhbENudCA+IDUwKQotCQkJCXsKLQkJCQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWUuUnhBbnRFdmFsVGltZXIsIDIwKTsKLQkJCQkJcEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID0gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlJ4QW50RXZhbFRpbWVyLCAzMDApOwotCQkJCQlwQWQtPk1sbWUuYkxvd1Rocm91Z2hwdXQgPSBUUlVFOwotCQkJCX0KLQkJCX0KLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBBZnRlciBldmFsdWF0aW9uLCBjaGVjayBhbnRlbm5hIGxpbmsgc3RhdHVzCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQXNpY1J4QW50RXZhbFRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUgkqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQlCT09MRUFOCQkJYlN3YXBBbnQgPSBGQUxTRTsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVQ0hBUgkJCUJCUFIzID0gMDsKLQlDSEFSCQkJbGFyZ2VyID0gLTEyNywgcnNzaTAsIHJzc2kxLCByc3NpMjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCXwKLQkJCQkJCQlmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfUkFESU9fT0ZGCQkJfAotCQkJCQkJCWZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkgfHwKLQkJCQkJCQlPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpCi0jaWZkZWYgUlQzMDkwCi0JCQkJCQkJfHwgKHBBZC0+YlBDSWNsa09mZiA9PSBUUlVFKQotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQkJCQkJCXx8IChwQWQtPkVlcHJvbUFjY2VzcykKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQkJCQkJCQkpCi0JCXJldHVybjsKLQotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCWlmICgocEFkLT5OaWNDb25maWcyLmZpZWxkLkFudERpdmVyc2l0eSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9PSBBTlRfRElWRVJTSVRZX0VOQUJMRSkpCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCQlpZiAoKHBBZC0+UnhBbnQuUmN2UGt0TnVtV2hlbkV2YWx1YXRlICE9IDApICYmIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVtwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnRdID49IHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnRdKSkKLQkJCQliU3dhcEFudCA9IFRSVUU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JCWlmIChiU3dhcEFudCA9PSBUUlVFKQotCQkJewotCQkJCVVDSEFSCQkJdGVtcDsKLQotCQkJCS8vCi0JCQkJLy8gc2VsZWN0IFByaW1hcnlSeEFudFBhaXIKLQkJCQkvLyAgICBSb2xlIGNoYW5nZSwgVXNlZCBQYWlyMVNlY29uZGFyeVJ4QW50IGFzIFByaW1hcnlSeEFudFBhaXIuCi0JCQkJLy8gICAgU2luY2UgUGFpcjFTZWNvbmRhcnlSeEFudCBRdWFsaXR5IGdvb2QgdGhhbiBQYWlyMVByaW1hcnlSeEFudAotCQkJCS8vCi0JCQkJdGVtcCA9IHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQ7Ci0JCQkJcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCA9IHBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudDsKLQkJCQlwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQgPSB0ZW1wOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQkJcEFkLT5SeEFudC5QYWlyMUxhc3RBdmdSc3NpID0gKHBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpW3BBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudF0gPj4gMyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0vLwkJCQlwQWQtPlJ4QW50LkV2YWx1YXRlU3RhYmxlQ250ID0gMDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBpZiB0aGUgZXZhbHVhdGVkIGFudGVubmEgaXMgbm90IGJldHRlciB0aGFuIG9yaWdpbmFsLCBzd2l0Y2ggYmFjayB0byBvcmlnaW5hbCBhbnRlbm5hCi0JCQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0JCQkJcEFkLT5SeEFudC5FdmFsdWF0ZVN0YWJsZUNudCArKzsKLQkJCX0KLQotCQkJcEFkLT5SeEFudC5FdmFsdWF0ZVBlcmlvZCA9IDA7IC8vIDE6TWVhbnMgc3dpdGNoIHRvIFNlY29uZGFyeVJ4QW50LCAwOk1lYW5zIHN3aXRjaCB0byBQYWlyMVByaW1hcnlSeEFudAotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFzaWNSeEFudEV2YWxBY3Rpb246OkFmdGVyIEV2YWwoZml4IGluICMlZCksIDwlZCwgJWQ+LCBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU9JWxkXG4iLAotCQkJCQlwQWQtPlJ4QW50LlBhaXIxUHJpbWFyeVJ4QW50LCAocEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbMF0gPj4gMyksIChwQWQtPlJ4QW50LlBhaXIxQXZnUnNzaVsxXSA+PiAzKSwgcEFkLT5SeEFudC5SY3ZQa3ROdW1XaGVuRXZhbHVhdGUpKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0JewotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKQotCQkJCXJldHVybjsKLQotCi0JCQkvLyBpZiB0aGUgdHJhZmZpYyBpcyBsb3csIHVzZSBhdmVyYWdlIHJzc2kgYXMgdGhlIGNyaXRlcmlhCi0JCQlpZiAocEFkLT5NbG1lLmJMb3dUaHJvdWdocHV0ID09IFRSVUUpCi0JCQl7Ci0JCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMDsKLQkJCQlyc3NpMSA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxOwotCQkJCXJzc2kyID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcnNzaTAgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwotCQkJCXJzc2kxID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMTsKLQkJCQlyc3NpMiA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTI7Ci0JCQl9Ci0KLQkJCWlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMykKLQkJCXsKLQkJCQlsYXJnZXIgPSBtYXgocnNzaTAsIHJzc2kxKTsKLQotCQkJCWlmIChsYXJnZXIgPiAocnNzaTIgKyAyMCkpCi0JCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMjsKLQkJCQllbHNlCi0JCQkJCXBBZC0+TWxtZS5SZWFsUnhQYXRoID0gMzsKLQkJCX0KLQkJCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCQkJewotCQkJCWlmIChyc3NpMCA+IChyc3NpMSArIDIwKSkKLQkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAxOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAyOwotCQkJfQotCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCQlBSMyk7Ci0JCQlCQlBSMyAmPSAofjB4MTgpOwotCQkJaWYocEFkLT5NbG1lLlJlYWxSeFBhdGggPT0gMykKLQkJCXsKLQkJCQlCQlBSMyB8PSAoMHgxMCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDIpCi0JCQl7Ci0JCQkJQkJQUjMgfD0gKDB4OCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHBBZC0+TWxtZS5SZWFsUnhQYXRoID09IDEpCi0JCQl7Ci0JCQkJQkJQUjMgfD0gKDB4MCk7Ci0JCQl9Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQlwQWQtPlN0YUNmZy5CQlBSMyA9IEJCUFIzOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotfQotCi0KLVZPSUQgQVBTRFBlcmlvZGljRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkpCi0JCXJldHVybjsKLQotCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50Kys7Ci0KLS8vIERyaXZlciBzaG91bGQgbm90IHNlbmQgdHJpZ2dlciBmcmFtZSwgaXQgc2hvdWxkIGJlIHNlbmQgYnkgYXBwbGljYXRpb24gbGF5ZXIKLS8qCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZQotCQkmJiAocEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lIHx8Ci0JCSgoKHBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50JTIwKSA9PSAxOSkgJiYgKCFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFIHx8ICFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLIHx8ICFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJIHx8ICFwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKSkpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTZW5kaW5nIHRyaWdnZXIgZnJhbWUgYW5kIGVudGVyIHNlcnZpY2UgcGVyaW9kIHdoZW4gc3VwcG9ydCBBUFNEXG4iKSk7Ci0JCVJUTVBTZW5kTnVsbEZyYW1lKHBBZCwgcEFkLT5Db21tb25DZmcuVHhSYXRlLCBUUlVFKTsKLQkJcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlRyaWdnZXJUaW1lckNvdW50ID0gMDsKLQkJcEFkLT5Db21tb25DZmcuYkluU2VydmljZVBlcmlvZCA9IFRSVUU7Ci0JfSovCi19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0L3Jlc2V0IE1BQyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIGJQaWdneUJhY2sgcGFyYW1ldGVyCi0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZCAgICAgICAgIC0gQWRhcHRlciBwb2ludGVyCi0gICAgICAgIGJQaWdneUJhY2sgIC0gRW5hYmxlIC8gRGlzYWJsZSBQaWdneS1CYWNrCi0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFNldFBpZ2d5QmFjaygKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLSAgICBJTiBCT09MRUFOICAgICAgICAgIGJQaWdneUJhY2spCi17Ci0JVFhfTElOS19DRkdfU1RSVUMgIFR4TGlua0NmZzsKLQotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfTElOS19DRkcsICZUeExpbmtDZmcud29yZCk7Ci0KLQlUeExpbmtDZmcuZmllbGQuVHhDRkFja0VuID0gYlBpZ2d5QmFjazsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9MSU5LX0NGRywgVHhMaW5rQ2ZnLndvcmQpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBzd2l0Y2ggcmF0ZSBhdXRvbWF0aWNhbGx5Ci0KLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZAotICAgICAgICBwRW50cnkKLQotICAgIFJldHVybiBWYWx1ZToKLSAgICAgICAgVFVSRQotICAgICAgICBGQUxTRQotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQotewotCUJPT0xFQU4JCXJlc3VsdCA9IFRSVUU7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBvbmx5IGFzc29jaWF0ZWQgU1RBIGNvdW50cwotCQlpZiAocEVudHJ5ICYmIChwRW50cnktPlZhbGlkQXNDTEkpICYmIChwRW50cnktPlNzdCA9PSBTU1RfQVNTT0MpKQotCQl7Ci0JCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gRkFMU0U7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJaWYgKHBFbnRyeSAmJiAocEVudHJ5LT5WYWxpZEFzRGxzKSkKLQkJCXJlc3VsdCA9IHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLUJPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpCi17Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoKQotCQkJcmV0dXJuIFRSVUU7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCXJldHVybiBGQUxTRTsKLX0KLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIGNoZWNrIGlmIHRoaXMgZW50cnkgbmVlZCB0byBmaXggdHggbGVnYWN5IHJhdGUKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkCi0gICAgICAgIHBFbnRyeQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUVVJFCi0gICAgICAgIEZBTFNFCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1VQ0hBUiBSVE1QU3RhRml4ZWRUeE1vZGUoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnkpCi17Ci0JVUNIQVIJdHhfbW9kZSA9IEZJWEVEX1RYTU9ERV9IVDsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCXR4X21vZGUgPSAoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlyZXR1cm4gdHhfbW9kZTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBSb3V0aW5lIERlc2NyaXB0aW9uOgotICAgICAgICBPdmVyd3JpdGUgSFQgVHggTW9kZSBieSBGaXhlZCBMZWdlbmN5IFR4IE1vZGUsIGlmIHNwZWNpZmllZC4KLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkCi0gICAgICAgIHBFbnRyeQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBUVVJFCi0gICAgICAgIEZBTFNFCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoCi0JCVVDSEFSCQkJCWZpeGVkX3R4X21vZGUsCi0JCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KQotewotCUhUVFJBTlNNSVRfU0VUVElORyBUcmFuc21pdFNldHRpbmc7Ci0KLQlpZiAoZml4ZWRfdHhfbW9kZSA9PSBGSVhFRF9UWE1PREVfSFQpCi0JCXJldHVybjsKLQotCVRyYW5zbWl0U2V0dGluZy53b3JkID0gMDsKLQotCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTOwotCi0JaWYgKGZpeGVkX3R4X21vZGUgPT0gRklYRURfVFhNT0RFX0NDSykKLQl7Ci0JCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCS8vIENDSyBtb2RlIGFsbG93IE1DUyAwfjMKLQkJaWYgKFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPiBNQ1NfMykKLQkJCVRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfMzsKLQl9Ci0JZWxzZQotCXsKLQkJVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCS8vIE9GRE0gbW9kZSBhbGxvdyBNQ1MgMH43Ci0JCWlmIChUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID4gTUNTXzcpCi0JCQlUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTXzc7Ci0JfQotCi0JaWYgKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1PREUpCi0JewotCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gVHJhbnNtaXRTZXR0aW5nLndvcmQ7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcgOiB3Y2lkLSVkLCBNT0RFPSVzLCBNQ1M9JWQgXG4iLAotCQkJCXBFbnRyeS0+QWlkLCBHZXRQaHlNb2RlKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUpLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJZHluYW1pYyB0dW5lIEJCUCBSNjYgdG8gZmluZCBhIGJhbGFuY2UgYmV0d2VlbiBzZW5zaWJpbGl0eSBhbmQKLQkJbm9pc2UgaXNvbGF0aW9uCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNpY1N0YUJicFR1bmluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVQ0hBUglPcmlnUjY2VmFsdWUgPSAwLCBSNjY7Ly8sIFI2NlVwcGVyQm91bmQgPSAweDMwLCBSNjZMb3dlckJvdW5kID0gMHgzMDsKLQlDSEFSCVJzc2k7Ci0KLQkvLyAyODYwQyBkaWQgbm90IHN1cHBvcnQgRmFzZSBDQ0EsIHRoZXJlZm9yZSBjYW4ndCB0dW5lCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCQlyZXR1cm47Ci0KLQkvLwotCS8vIHdvcmsgYXMgYSBTVEEKLQkvLwotCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkgIC8vIG5vIFI2NiB0dW5pbmcgd2hlbiBTQ0FOTklORwotCQlyZXR1cm47Ci0KLQlpZiAoKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCSYmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCkKLQkJCSkKLQkJJiYgIShPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkmJiAocEFkLT5iUENJY2xrT2ZmID09IEZBTFNFKQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkpCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JpZ1I2NlZhbHVlKTsKLQkJUjY2ID0gT3JpZ1I2NlZhbHVlOwotCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID4gMSkKLQkJCVJzc2kgPSAocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMCArIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEpID4+IDE7Ci0JCWVsc2UKLQkJCVJzc2kgPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwOwotCi0JCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JCXsJLy9CRyBiYW5kCi0jaWZkZWYgUlQzMHh4Ci0JCQkvLyBSVDMwNzAgaXMgYSBubyBMTkEgc29sdXRpb24sIGl0IHNob3VsZCBoYXZlIGRpZmZlcmVudCBjb250cm9sIHJlZ2FyZGluZyB0byBBR0MgZ2FpbiBjb250cm9sCi0JCQkvLyBPdGhlcndpc2UsIGl0IHdpbGwgaGF2ZSBzb21lIHRocm91Z2hwdXQgc2lkZSBlZmZlY3Qgd2hlbiBsb3cgUlNTSQotCi0JCQlpZiAoSVNfUlQzMDcwKHBBZCl8fElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQkJewotCQkJCWlmIChSc3NpID4gUlNTSV9GT1JfTUlEX0xPV19TRU5TSUJJTElUWSkKLQkJCQl7Ci0JCQkJCVI2NiA9IDB4MUMgKyAyKkdFVF9MTkFfR0FJTihwQWQpICsgMHgyMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKTsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJCXsKLQkJCQlpZiAoUnNzaSA+IFJTU0lfRk9SX01JRF9MT1dfU0VOU0lCSUxJVFkpCi0JCQkJewotCQkJCQlSNjYgPSAoMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpKSArIDB4MTA7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsJLy9BIGJhbmQKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPT0gQldfMjApCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzMiArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSNjYgPSAweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKFJzc2kgPiBSU1NJX0ZPUl9NSURfTE9XX1NFTlNJQklMSVRZKQotCQkJCXsKLQkJCQkJUjY2ID0gMHgzQSArIChHRVRfTE5BX0dBSU4ocEFkKSo1KS8zICsgMHgxMDsKLQkJCQkJaWYgKE9yaWdSNjZWYWx1ZSAhPSBSNjYpCi0JCQkJCXsKLQkJCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSNjYgPSAweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzM7Ci0JCQkJCWlmIChPcmlnUjY2VmFsdWUgIT0gUjY2KQotCQkJCQl7Ci0JCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JfQotfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1WT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlCYW5kV2lkdGgpCi17Ci0JVUNIQVIJUjY2ID0gMHgzMDsKLQotCWlmIChwQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTQpCi0JewkvLyBCRyBiYW5kCi0jaWZkZWYgUlQzMHh4Ci0JCS8qIEdhcnkgd2FzIHZlcmlmaWVkIEFtYXpvbiBBUCBhbmQgZmluZCB0aGF0IFJUMzA3eCBoYXMgQkJQX1I2NiBpbnZhbGlkIGRlZmF1bHQgdmFsdWUgKi8KLQotCQlpZiAoSVNfUlQzMDcwKHBBZCl8fElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKQotCQl7Ci0JCQlSNjYgPSAweDFDICsgMipHRVRfTE5BX0dBSU4ocEFkKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJewotCQkJUjY2ID0gMHgyRSArIEdFVF9MTkFfR0FJTihwQWQpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCX0KLQl9Ci0JZWxzZQotCXsJLy9BIGJhbmQKLQkJewotCQkJaWYgKEJhbmRXaWR0aCA9PSBCV18yMCkKLQkJCXsKLQkJCQlSNjYgPSAoVUNIQVIpKDB4MzIgKyAoR0VUX0xOQV9HQUlOKHBBZCkqNSkvMyk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JCQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQllbHNlCi0JCQl7Ci0JCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lX2V4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9tbG1lX2V4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZmI3ZjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vbWxtZV9leC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JbWxtZV9leC5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRm9uY2hpCQkyMDA3LTA2LTI1CQlFeHRlbmQgb3JpZ2luYWwgbWxtZSBBUElzIHRvIHN1cHBvcnQgbXVsdGktZW50cmllcwotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL21sbWVfZXhfZGVmLmgiCi0vLyNpbmNsdWRlIDxzdGRhcmcuaD4KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBzdGF0ZV9tYWNoaW5lCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8qISBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFjaGluZS4KLSAqICBccGFyYW0gKlMgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKLSAqICBccGFyYW0gIFRyYW5zICAgICAgIFN0YXRlIG1hY2hpbmUgdHJhbnNpdGlvbiBmdW5jdGlvbgotICogIFxwYXJhbSAgU3ROciAgICAgICAgbnVtYmVyIG9mIHN0YXRlcwotICogIFxwYXJhbSAgTXNnTnIgICAgICAgbnVtYmVyIG9mIG1lc3NhZ2VzCi0gKiAgXHBhcmFtICBEZWZGdW5jICAgICBkZWZhdWx0IGZ1bmN0aW9uLCB3aGVuIHRoZXJlIGlzIGludmFsaWQgc3RhdGUvbWVzc2FnZSBjb21iaW5hdGlvbgotICogIFxwYXJhbSAgSW5pdFN0YXRlICAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgc3RhdGUgbWFjaGluZQotICogIFxwYXJhbSAgQmFzZSAgICAgICAgU3RhdGVNYWNoaW5lIGJhc2UsIGludGVybmFsIHVzZSBvbmx5Ci0gKiAgXHByZSBwX3NtIHNob3VsZCBiZSBhIGxlZ2FsIHBvaW50ZXIKLSAqICBccG9zdAotICovCi1WT0lEIFN0YXRlTWFjaGluZUluaXRFeCgKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DX0VYIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpCi17Ci0JVUxPTkcgaSwgajsKLQotCS8vIHNldCBudW1iZXIgb2Ygc3RhdGVzIGFuZCBtZXNzYWdlcwotCVMtPk5yU3RhdGUgPSBTdE5yOwotCVMtPk5yTXNnICAgPSBNc2dOcjsKLQlTLT5CYXNlICAgID0gQmFzZTsKLQotCVMtPlRyYW5zRnVuYyAgPSBUcmFuczsKLQotCS8vIGluaXQgYWxsIHN0YXRlIHRyYW5zaXRpb24gdG8gZGVmYXVsdCBmdW5jdGlvbgotCWZvciAoaSA9IDA7IGkgPCBTdE5yOyBpKyspCi0JewotCQlmb3IgKGogPSAwOyBqIDwgTXNnTnI7IGorKykKLQkJewotCQkJUy0+VHJhbnNGdW5jW2kgKiBNc2dOciArIGpdID0gRGVmRnVuYzsKLQkJfQotCX0KLQotCS8vIHNldCB0aGUgc3RhcnRpbmcgc3RhdGUKLQlTLT5DdXJyU3RhdGUgPSBJbml0U3RhdGU7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qISBcYnJpZWYgVGhpcyBmdW5jdGlvbiBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnRvIHRoZSBjZWxsIGluIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHBhcmFtICpTICAgcG9pbnRlciB0byB0aGUgc3RhdGUgbWFjaGluZQotICogIFxwYXJhbSBTdCAgIHN0YXRlCi0gKiAgXHBhcmFtIE1zZyAgaW5jb21pbmcgbWVzc2FnZQotICogIFxwYXJhbSBmICAgIHRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIChzdGF0ZSwgbWVzc2FnZSkgY29tYmluYXRpb24gb2NjdXJzIGF0IHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiAgXHByZSAqUyBzaG91bGQgYmUgYSBsZWdhbCBwb2ludGVyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLCBzdCwgbXNnLCBzaG91bGQgYmUgYWxsIHdpdGhpbiB0aGUgcmFuZ2UsIEJhc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgaW5pdGlhbCBzdGF0ZQotICogIFxwb3N0Ci0gKi8KLVZPSUQgU3RhdGVNYWNoaW5lU2V0QWN0aW9uRXgoCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBVTE9ORyBTdCwKLQlJTiBVTE9ORyBNc2csCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DX0VYIEZ1bmMpCi17Ci0JVUxPTkcgTXNnSWR4OwotCi0JTXNnSWR4ID0gTXNnIC0gUy0+QmFzZTsKLQotCWlmIChTdCA8IFMtPk5yU3RhdGUgJiYgTXNnSWR4IDwgUy0+TnJNc2cpCi0JewotCQkvLyBib3VuZGFyeSBjaGVja2luZyBiZWZvcmUgc2V0dGluZyB0aGUgYWN0aW9uCi0JCVMtPlRyYW5zRnVuY1tTdCAqIFMtPk5yTXNnICsgTXNnSWR4XSA9IEZ1bmM7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKiEgXGJyaWVmICAgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzdGF0ZSB0cmFuc2l0aW9uCi0gKiAgXHBhcmFtICAgKkFkYXB0ZXIgdGhlIE5JQyBhZGFwdGVyIHBvaW50ZXIKLSAqICBccGFyYW0gICAqUyAgICAgICB0aGUgc3RhdGUgbWFjaGluZQotICogIFxwYXJhbSAgICpFbGVtICAgIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkCi0gKiAgXHJldHVybiAgIE5vbmUKLSAqLwotVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uRXgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sCi0JVVNIT1JUIElkeCwKLQlQVUxPTkcgcEN1cnJTdGF0ZSkKLXsKLQlpZiAoUy0+VHJhbnNGdW5jWygqcEN1cnJTdGF0ZSkgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkKLQkJKCooUy0+VHJhbnNGdW5jWygqcEN1cnJTdGF0ZSkgKiBTLT5Ock1zZyArIEVsZW0tPk1zZ1R5cGUgLSBTLT5CYXNlXSkpKHBBZCwgRWxlbSwgcEN1cnJTdGF0ZSwgSWR4KTsKLQotCXJldHVybjsKLX0KLQotLyohIFxicmllZiAgIEVucXVldWUgYSBtZXNzYWdlIGZvciBvdGhlciB0aHJlYWRzLCBpZiB0aGV5IHdhbnQgdG8gc2VuZCBtZXNzYWdlcyB0byBNTE1FIHRocmVhZAotICogIFxwYXJhbSAgKlF1ZXVlICAgIFRoZSBNTE1FIFF1ZXVlCi0gKiAgXHBhcmFtICAgTWFjaGluZSAgVGhlIFN0YXRlIE1hY2hpbmUgSWQKLSAqICBccGFyYW0gICBNc2dUeXBlICBUaGUgTWVzc2FnZSBUeXBlCi0gKiAgXHBhcmFtICAgTXNnTGVuICAgVGhlIE1lc3NhZ2UgbGVuZ3RoCi0gKiAgXHBhcmFtICAqTXNnICAgICAgVGhlIG1lc3NhZ2UgcG9pbnRlcgotICogIFxyZXR1cm4gIFRSVUUgaWYgZW5xdWV1ZSBpcyBzdWNjZXNzZnVsLCBGQUxTRSBpZiB0aGUgcXVldWUgaXMgZnVsbAotICogIFxwcmUKLSAqICBccG9zdAotICogIFxub3RlICAgIFRoZSBtZXNzYWdlIGhhcyB0byBiZSBpbml0aWFsaXplZAotICovCi1CT09MRUFOIE1sbWVFbnF1ZXVlRXgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUxPTkcgTWFjaGluZSwKLQlJTiBVTE9ORyBNc2dUeXBlLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlJTiBWT0lEICpNc2csCi0JSU4gVVNIT1JUIElkeCkKLXsKLQlJTlQgVGFpbDsKLQlNTE1FX1FVRVVFICpRdWV1ZSA9IChNTE1FX1FVRVVFICopJnBBZC0+TWxtZS5RdWV1ZTsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JCXJldHVybiBGQUxTRTsKLQotCi0JLy8gRmlyc3QgY2hlY2sgdGhlIHNpemUsIGl0IE1VU1Qgbm90IGV4Y2VlZCB0aGUgbWxtZSBxdWV1ZSBzaXplCi0JaWYgKE1zZ0xlbiA+IE1BWF9MRU5fT0ZfTUxNRV9CVUZGRVIpCi0JewotCQlEQkdQUklOVF9FUlIoKCJNbG1lRW5xdWV1ZUV4OiBtc2cgdG9vIGxhcmdlLCBzaXplID0gJWxkIFxuIiwgTXNnTGVuKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAoTWxtZVF1ZXVlRnVsbChRdWV1ZSkpCi0JewotCi0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlSVE1QX1NFTV9MT0NLKCZRdWV1ZS0+TG9jayk7Ci0JVGFpbCA9IFF1ZXVlLT5UYWlsOwotCVF1ZXVlLT5UYWlsKys7Ci0JUXVldWUtPk51bSsrOwotCWlmIChRdWV1ZS0+VGFpbCA9PSBNQVhfTEVOX09GX01MTUVfUVVFVUUpCi0JewotCQlRdWV1ZS0+VGFpbCA9IDA7Ci0JfQotCVF1ZXVlLT5FbnRyeVtUYWlsXS5PY2N1cGllZCA9IFRSVUU7Ci0JUXVldWUtPkVudHJ5W1RhaWxdLk1hY2hpbmUgPSBNYWNoaW5lOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5Nc2dUeXBlID0gTXNnVHlwZTsKLQlRdWV1ZS0+RW50cnlbVGFpbF0uTXNnTGVuID0gTXNnTGVuOwotCVF1ZXVlLT5FbnRyeVtUYWlsXS5JZHggPSBJZHg7Ci0JaWYgKE1zZyAhPSBOVUxMKQotCQlOZGlzTW92ZU1lbW9yeShRdWV1ZS0+RW50cnlbVGFpbF0uTXNnLCBNc2csIE1zZ0xlbik7Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJlF1ZXVlLT5Mb2NrKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFRoZSBkcm9wIGZ1bmN0aW9uLCB3aGVuIG1hY2hpbmUgZXhlY3V0ZXMgdGhpcywgdGhlIG1lc3NhZ2UgaXMgc2ltcGx5Ci0gICAgICAgIGlnbm9yZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLCB0aGUgbWVzc2FnZSBpcyBmcmVlZCBpbgotICAgICAgICBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uKCkKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIERyb3BFeCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sCi0JUFVMT05HIHBDdXJyU3RhdGUsCi0JVVNIT1JUIElkeCkKLXsKLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9uZXRpZl9ibG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vbmV0aWZfYmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3Mjk1Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9uZXRpZl9ibG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaWZkZWYgQkxPQ0tfTkVUX0lGCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLSNpbmNsdWRlICIuLi9uZXRpZl9ibG9jay5oIgotCi0KLXN0YXRpYyBORVRJRl9FTlRSWSBmcmVlTmV0SWZFbnRyeVBvb2xbRlJFRV9ORVRJRl9QT09MX1NJWkVdOwotc3RhdGljIExJU1RfSEVBREVSIGZyZWVOZXRJZkVudHJ5TGlzdDsKLQotdm9pZCBpbml0YmxvY2tRdWV1ZVRhYigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlpbnQgaTsKLQotCWluaXRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpOwotCWZvciAoaSA9IDA7IGkgPCBGUkVFX05FVElGX1BPT0xfU0laRTsgaSsrKQotCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpJmZyZWVOZXRJZkVudHJ5UG9vbFtpXSk7Ci0KLQlmb3IgKGk9MDsgaSA8IE5VTV9PRl9UWF9SSU5HOyBpKyspCi0JCWluaXRMaXN0KCZwQWQtPmJsb2NrUXVldWVUYWJbaV0uTmV0SWZMaXN0KTsKLQotCXJldHVybjsKLX0KLQotQk9PTEVBTiBibG9ja05ldElmKAotCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAotCUlOIFBORVRfREVWIHBOZXREZXYpCi17Ci0JUE5FVElGX0VOVFJZIHBOZXRJZkVudHJ5ID0gTlVMTDsKLQotCWlmICgocE5ldElmRW50cnkgPSAoUE5FVElGX0VOVFJZKXJlbW92ZUhlYWRMaXN0KCZmcmVlTmV0SWZFbnRyeUxpc3QpKSAhPSBOVUxMKQotCXsKLQkJUlRNUF9PU19ORVRERVZfU1RPUF9RVUVVRShwTmV0RGV2KTsKLQkJcE5ldElmRW50cnktPnBOZXREZXYgPSBwTmV0RGV2OwotCQlpbnNlcnRUYWlsTGlzdCgmcEJsb2NrUXVldWVFbnRyeS0+TmV0SWZMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOwotCi0JCXBCbG9ja1F1ZXVlRW50cnktPlN3VHhRdWV1ZUJsb2NrRmxhZyA9IFRSVUU7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBfT1NfTkVUREVWX1NUT1BfUVVFVUUoJXMpXG4iLCBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwTmV0RGV2KSkpOwotCX0KLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCi1WT0lEIHJlbGVhc2VOZXRJZigKLQlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSkKLXsKLQlQTkVUSUZfRU5UUlkgcE5ldElmRW50cnkgPSBOVUxMOwotCVBMSVNUX0hFQURFUiBwTmV0SWZMaXN0ID0gJnBCbG9ja1F1ZXVlRW50cnktPk5ldElmTGlzdDsKLQotCXdoaWxlKChwTmV0SWZFbnRyeSA9IChQTkVUSUZfRU5UUlkpcmVtb3ZlSGVhZExpc3QocE5ldElmTGlzdCkpICE9ICBOVUxMKQotCXsKLQkJUE5FVF9ERVYgcE5ldERldiA9IHBOZXRJZkVudHJ5LT5wTmV0RGV2OwotCQlSVE1QX09TX05FVERFVl9XQUtFX1FVRVVFKHBOZXREZXYpOwotCQlpbnNlcnRUYWlsTGlzdCgmZnJlZU5ldElmRW50cnlMaXN0LCAoUExJU1RfRU5UUlkpcE5ldElmRW50cnkpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBfT1NfTkVUREVWX1dBS0VfUVVFVUUoJXMpXG4iLCBSVE1QX09TX05FVERFVl9HRVRfREVWTkFNRShwTmV0RGV2KSkpOwotCX0KLQlwQmxvY2tRdWV1ZUVudHJ5LT5Td1R4UXVldWVCbG9ja0ZsYWcgPSBGQUxTRTsKLQlyZXR1cm47Ci19Ci0KLQotVk9JRCBTdG9wTmV0SWZRdWV1ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBRdWVJZHgsCi0JSU4gUE5ESVNfUEFDS0VUIHBQYWNrZXQpCi17Ci0JUE5FVF9ERVYgTmV0RGV2ID0gTlVMTDsKLQlVQ0hBUiBJZklkeCA9IDA7Ci0JQk9PTEVBTiB2YWxpZCA9IEZBTFNFOwotCi0jaWZkZWYgQVBDTElfU1VQUE9SVAotCWlmIChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSA+PSBNSU5fTkVUX0RFVklDRV9GT1JfQVBDTEkpCi0JewotCQlJZklkeCA9IChSVE1QX0dFVF9QQUNLRVRfTkVUX0RFVklDRShwUGFja2V0KSAtIE1JTl9ORVRfREVWSUNFX0ZPUl9BUENMSSkgJSBNQVhfQVBDTElfTlVNOwotCQlOZXREZXYgPSBwQWQtPkFwQ2ZnLkFwQ2xpVGFiW0lmSWR4XS5kZXY7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCi0jaWZkZWYgV0RTX1NVUFBPUlQKLQlpZiAoUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UocFBhY2tldCkgPj0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykKLQl7Ci0JCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX1dEUykgJSBNQVhfV0RTX0VOVFJZOwotCQlOZXREZXYgPSBwQWQtPldkc1RhYi5XZHNFbnRyeVtJZklkeF0uZGV2OwotCX0KLQllbHNlCi0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLQl7Ci0jaWZkZWYgTUJTU19TVVBQT1JUCi0JCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCi0JCXsKLQkJCUlmSWR4ID0gKFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFKHBQYWNrZXQpIC0gTUlOX05FVF9ERVZJQ0VfRk9SX01CU1NJRCkgJSBNQVhfTUJTU0lEX05VTTsKLQkJCU5ldERldiA9IHBBZC0+QXBDZmcuTUJTU0lEW0lmSWR4XS5NU1NJRERldjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUlmSWR4ID0gTUFJTl9NQlNTSUQ7Ci0JCQlOZXREZXYgPSBwQWQtPm5ldF9kZXY7Ci0JCX0KLSNlbHNlCi0JCUlmSWR4ID0gTUFJTl9NQlNTSUQ7Ci0JCU5ldERldiA9IHBBZC0+bmV0X2RldjsKLSNlbmRpZgotCX0KLQotCS8vIFdNTSBzdXBwb3J0IDQgc29mdHdhcmUgcXVldWVzLgotCS8vIE9uZSBzb2Z0d2FyZSBxdWV1ZSBmdWxsIGRvZXNuJ3QgbWVhbiBkZXZpY2UgaGF2ZSBubyBjYXBiaWxpdHkgdG8gdHJhbnNtaXQgcGFja2V0LgotCS8vIFNvIGRpc2FibGUgYmxvY2sgTmV0LUlmIHF1ZXVlIGZ1bmN0aW9uIHdoaWxlIFdNTSBlbmFibGUuCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJdmFsaWQgPSAocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUgPT0gVFJVRSkgPyBGQUxTRSA6IFRSVUU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZiAodmFsaWQpCi0JCWJsb2NrTmV0SWYoJnBBZC0+YmxvY2tRdWV1ZVRhYltRdWVJZHhdLCBOZXREZXYpOwotCXJldHVybjsKLX0KLQotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRfY2hhbm5lbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTIzOTFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0X2NoYW5uZWwuYworKysgL2Rldi9udWxsCkBAIC0xLDEyODcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotQ0hfRlJFUV9NQVAgQ0hfSFpfSURfTUFQW109Ci0JCXsKLQkJCXsxLCAyNDEyfSwKLQkJCXsyLCAyNDE3fSwKLQkJCXszLCAyNDIyfSwKLQkJCXs0LCAyNDI3fSwKLQkJCXs1LCAyNDMyfSwKLQkJCXs2LCAyNDM3fSwKLQkJCXs3LCAyNDQyfSwKLQkJCXs4LCAyNDQ3fSwKLQkJCXs5LCAyNDUyfSwKLQkJCXsxMCwgMjQ1N30sCi0JCQl7MTEsIDI0NjJ9LAotCQkJezEyLCAyNDY3fSwKLQkJCXsxMywgMjQ3Mn0sCi0JCQl7MTQsIDI0ODR9LAotCi0JCQkvKiAgVU5JSSAqLwotCQkJezM2LCA1MTgwfSwKLQkJCXs0MCwgNTIwMH0sCi0JCQl7NDQsIDUyMjB9LAotCQkJezQ4LCA1MjQwfSwKLQkJCXs1MiwgNTI2MH0sCi0JCQl7NTYsIDUyODB9LAotCQkJezYwLCA1MzAwfSwKLQkJCXs2NCwgNTMyMH0sCi0JCQl7MTQ5LCA1NzQ1fSwKLQkJCXsxNTMsIDU3NjV9LAotCQkJezE1NywgNTc4NX0sCi0JCQl7MTYxLCA1ODA1fSwKLQkJCXsxNjUsIDU4MjV9LAotCQkJezE2NywgNTgzNX0sCi0JCQl7MTY5LCA1ODQ1fSwKLQkJCXsxNzEsIDU4NTV9LAotCQkJezE3MywgNTg2NX0sCi0KLQkJCS8qIEhpcGVyTEFOMiAqLwotCQkJezEwMCwgNTUwMH0sCi0JCQl7MTA0LCA1NTIwfSwKLQkJCXsxMDgsIDU1NDB9LAotCQkJezExMiwgNTU2MH0sCi0JCQl7MTE2LCA1NTgwfSwKLQkJCXsxMjAsIDU2MDB9LAotCQkJezEyNCwgNTYyMH0sCi0JCQl7MTI4LCA1NjQwfSwKLQkJCXsxMzIsIDU2NjB9LAotCQkJezEzNiwgNTY4MH0sCi0JCQl7MTQwLCA1NzAwfSwKLQotCQkJLyogSmFwYW4gTU1BQyAqLwotCQkJezM0LCA1MTcwfSwKLQkJCXszOCwgNTE5MH0sCi0JCQl7NDIsIDUyMTB9LAotCQkJezQ2LCA1MjMwfSwKLQotCQkJLyogIEphcGFuICovCi0JCQl7MTg0LCA0OTIwfSwKLQkJCXsxODgsIDQ5NDB9LAotCQkJezE5MiwgNDk2MH0sCi0JCQl7MTk2LCA0OTgwfSwKLQotCQkJezIwOCwgNTA0MH0sCS8qIEphcGFuLCBtZWFucyBKMDggKi8KLQkJCXsyMTIsIDUwNjB9LAkvKiBKYXBhbiwgbWVhbnMgSjEyICovCi0JCQl7MjE2LCA1MDgwfSwJLyogSmFwYW4sIG1lYW5zIEoxNiAqLwotfTsKLQotSU5UCUNIX0haX0lEX01BUF9OVU0gPSAoc2l6ZW9mKENIX0haX0lEX01BUCkvc2l6ZW9mKENIX0ZSRVFfTUFQKSk7Ci0KLUNIX1JFR0lPTiBDaFJlZ2lvbltdID0KLXsKLQkJewkvLyBBbnRpZ3VhIGFuZCBCZXJidWRhCi0JCQkiQUciLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBcmdlbnRpbmEKLQkJCSJBUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBcnViYQotCQkJIkFXIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQXVzdHJhbGlhCi0JCQkiQVUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBBdXN0cmlhCi0JCQkiQVQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMywgSURPUiwgVFJVRX0sCQkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBCT1RILCBUUlVFfSwJCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCYWhhbWFzCi0JCQkiQlMiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCYXJiYWRvcwotCQkJIkJCIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQmVybXVkYQotCQkJIkJNIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQnJhemlsCi0JCQkiQlIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQmVsZ2l1bQotCQkJIkJFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE4LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMTgsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBCdWxnYXJpYQotCQkJIkJHIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENhbmFkYQotCQkJIkNBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksIDUsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ2F5bWFuIElzTGFuZHMKLQkJCSJLWSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENoaWxlCi0JCQkiQ0wiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDaGluYQotCQkJIkNOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBDb2xvbWJpYQotCQkJIkNPIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIENvc3RhIFJpY2EKLQkJCSJDUiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEN5cHJ1cwotCQkJIkNZIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjQsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gQ3plY2hfUmVwdWJsaWMKLQkJCSJDWiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRGVubWFyawotCQkJIkRLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgMjMsIElET1IsIFRSVUV9LAkJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAzMCwgQk9USCwgVFJVRX0sCQkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gRG9taW5pY2FuIFJlcHVibGljCi0JCQkiRE8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDAsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMAotCQkJCXsgMTQ5LCA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEVxdWFkb3IKLQkJCSJFQyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTAwLCAxMSwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBFbCBTYWx2YWRvcgotCQkJIlNWIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgNCwgICAzNiwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBGaW5sYW5kCi0JCQkiRkkiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEZyYW5jZQotCQkJIkZSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEdlcm1hbnkKLQkJCSJERSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICA0LCAgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gR3JlZWNlCi0JCQkiR1IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEd1YW0KLQkJCSJHVSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMzYsICA0LCAgIDE3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICA0LCAgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEd1YXRlbWFsYQotCQkJIkdUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgIDQsICAgMTcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgIDQsICAgMjQsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEhhaXRpCi0JCQkiSFQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgNCwgICAxNywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgNCwgICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSG9uZHVyYXMKLQkJCSJITiIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMTQ5LCAgNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIb25nIEtvbmcKLQkJCSJISyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBIdW5nYXJ5Ci0JCQkiSFUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSWNlbGFuZAotCQkJIklTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJbmRpYQotCQkJIklOIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSW5kb25lc2lhCi0JCQkiSUQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDE0OSwJNCwgIDI3LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJcmVsYW5kCi0JCQkiSUUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIE9ET1IsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSXNyYWVsCi0JCQkiSUwiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgICAzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MwotCQkJCXsgNCwJNiwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCA0fjkKLQkJCQl7IDEwLAk0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDEwfjEzCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBJdGFseQotCQkJIklUIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBPRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIEphcGFuCi0JCQkiSlAiLAotCQkJSkFQLAotCQkJewotCQkJCXsgMSwgICAxNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjE0Ci0JCQkJeyAzNiwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gSm9yZGFuCi0JCQkiSk8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIElET1IsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyAxNDksCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTGF0dmlhCi0JCQkiTFYiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTGllY2h0ZW5zdGVpbgotCQkJIkxJIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTGl0aHVhbmlhCi0JCQkiTFQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTHV4ZW1idXJnCi0JCQkiTFUiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTWFsYXlzaWEKLQkJCSJNWSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDM2LAk0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBNYWx0YQotCQkJIk1UIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsCTQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1hcm9jY28KLQkJCSJNQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyNCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIE1leGljbwotCQkJIk1YIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDUsICAzMCwgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2NQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTmV0aGVybGFuZHMKLQkJCSJOTCIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsCTQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLAk0LCAgMjQsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBOZXcgWmVhbGFuZAotCQkJIk5aIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwJNCwgIDI0LCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsCTQsICAyNCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDE0OSwgIDQsICAzMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gTm9yd2F5Ci0JCQkiTk8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LAk0LCAgMjQsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwJNCwgIDI0LCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gUGVydQotCQkJIlBFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBvcnR1Z2FsCi0JCQkiUFQiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFBvbGFuZAotCQkJIlBMIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBSb21hbmlhCi0JCQkiUk8iLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFJ1c3NpYQotCQkJIlJVIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAxNDksICA0LCAgMjAsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNhdWRpIEFyYWJpYQotCQkJIlNBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxNDksICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNlcmJpYV9hbmRfTW9udGVuZWdybwotCQkJIkNTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTaW5nYXBvcmUKLQkJCSJTRyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTQ5LCAgNCwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTbG92YWtpYQotCQkJIlNLIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTbG92ZW5pYQotCQkJIlNJIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFNvdXRoIEFmcmljYQotCQkJIlpBIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjMsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjMsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNCwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTYxCi0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBTb3V0aCBLb3JlYQotCQkJIktSIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjEzCi0JCQkJeyAzNiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDM2fjQ4Ci0JCQkJeyA1MiwgICA0LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsICA4LCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDEwMH4xMjgKLQkJCQl7IDE0OSwgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTQ5fjE2MQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3BhaW4KLQkJCSJFUyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMwotCQkJCXsgMzYsICAgNCwgIDE3LCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAxMDAsIDExLCAgMzAsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gU3dlZGVuCi0JCQkiU0UiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFN3aXR6ZXJsYW5kCi0JCQkiQ0giLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTMKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCAzNn40OAotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBUUlVFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi0KLQkJewkvLyBUYWl3YW4KLQkJCSJUVyIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTEsICAzMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgNTIsICAgNCwgIDIzLCBJRE9SLCBGQUxTRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVHVya2V5Ci0JCQkiVFIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMzZ+NDgKLQkJCQl7IDUyLCAgIDQsICAyMywgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVLCi0JCQkiR0IiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDEzLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMywgSURPUiwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyMywgSURPUiwgVFJVRX0sCS8vIDVHLCBjaCA1Mn42NAotCQkJCXsgMTAwLCAxMSwgIDMwLCBCT1RILCBUUlVFfSwJLy8gNUcsIGNoIDEwMH4xNDAKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFVrcmFpbmUKLQkJCSJVQSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVW5pdGVkX0FyYWJfRW1pcmF0ZXMKLQkJCSJBRSIsCi0JCQlDRSwKLQkJCXsKLQkJCQl7IDEsICAgMTMsICAyMCwgQk9USCwgRkFMU0V9LAkvLyAyLjQgRywgY2ggMX4xMQotCQkJCXsgMH0sCQkJCQkJCS8vIGVuZAotCQkJfQotCQl9LAotCi0JCXsJLy8gVW5pdGVkX1N0YXRlcwotCQkJIlVTIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMSwgIDMwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAzNiwgICA0LCAgMTcsIElET1IsIEZBTFNFfSwJLy8gNUcsIGNoIDUyfjY0Ci0JCQkJeyA1MiwgICA0LCAgMjQsIEJPVEgsIFRSVUV9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAzMCwgQk9USCwgVFJVRX0sCS8vIDVHLCBjaCAxMDB+MTQwCi0JCQkJeyAxNDksICA1LCAgMzAsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjUKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIFZlbmV6dWVsYQotCQkJIlZFIiwKLQkJCUNFLAotCQkJewotCQkJCXsgMSwgICAxMywgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDIuNCBHLCBjaCAxfjExCi0JCQkJeyAxNDksICA0LCAgMjcsIEJPVEgsIEZBTFNFfSwJLy8gNUcsIGNoIDE0OX4xNjEKLQkJCQl7IDB9LAkJCQkJCQkvLyBlbmQKLQkJCX0KLQkJfSwKLQotCQl7CS8vIERlZmF1bHQKLQkJCSIiLAotCQkJQ0UsCi0JCQl7Ci0JCQkJeyAxLCAgIDExLCAgMjAsIEJPVEgsIEZBTFNFfSwJLy8gMi40IEcsIGNoIDF+MTEKLQkJCQl7IDM2LCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDUyLCAgIDQsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggNTJ+NjQKLQkJCQl7IDEwMCwgMTEsICAyMCwgQk9USCwgRkFMU0V9LAkvLyA1RywgY2ggMTAwfjE0MAotCQkJCXsgMTQ5LCAgNSwgIDIwLCBCT1RILCBGQUxTRX0sCS8vIDVHLCBjaCAxNDl+MTY1Ci0JCQkJeyAwfSwJCQkJCQkJLy8gZW5kCi0JCQl9Ci0JCX0sCi19OwotCi0KLXN0YXRpYyBQQ0hfUkVHSU9OIEdldENoUmVnaW9uKAotCUlOIFBVQ0hBUiBDbnRyeUNvZGUpCi17Ci0JSU5UIGxvb3AgPSAwOwotCVBDSF9SRUdJT04gcENoUmVnaW9uID0gTlVMTDsKLQotCXdoaWxlIChzdHJjbXAoKFBTVFJJTkcpIENoUmVnaW9uW2xvb3BdLkNvdW50UmVnLCAiIikgIT0gMCkKLQl7Ci0JCWlmIChzdHJuY21wKChQU1RSSU5HKSBDaFJlZ2lvbltsb29wXS5Db3VudFJlZywgKFBTVFJJTkcpIENudHJ5Q29kZSwgMikgPT0gMCkKLQkJewotCQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOwotCQkJYnJlYWs7Ci0JCX0KLQkJbG9vcCsrOwotCX0KLQotCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKLQkJcENoUmVnaW9uID0gJkNoUmVnaW9uW2xvb3BdOwotCXJldHVybiBwQ2hSZWdpb247Ci19Ci0KLXN0YXRpYyBWT0lEIENoQmFuZENoZWNrKAotCUlOIFVDSEFSIFBoeU1vZGUsCi0JT1VUIFBVQ0hBUiBwQ2hUeXBlKQotewotCXN3aXRjaChQaHlNb2RlKQotCXsKLQkJY2FzZSBQSFlfMTFBOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMUFOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKnBDaFR5cGUgPSBCQU5EXzVHOwotCQkJYnJlYWs7Ci0JCWNhc2UgUEhZXzExQUJHX01JWEVEOgotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQljYXNlIFBIWV8xMUFHTl9NSVhFRDoKLQkJY2FzZSBQSFlfMTFBQkdOX01JWEVEOgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJKnBDaFR5cGUgPSBCQU5EX0JPVEg7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJKnBDaFR5cGUgPSBCQU5EXzI0RzsKLQkJCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIFVDSEFSIEZpbGxDaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUENIX0RFU1AgcENoRGVzcCwKLQlJTiBVQ0hBUiBPZmZzZXQsCi0JSU4gVUNIQVIgaW5jcmVtZW50KQotewotCUlOVCBpLCBqLCBsOwotCVVDSEFSIGNoYW5uZWw7Ci0KLQlqID0gT2Zmc2V0OwotCWZvciAoaSA9IDA7IGkgPCBwQ2hEZXNwLT5OdW1PZkNoOyBpKyspCi0JewotCQljaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKLQkJZm9yIChsPTA7IGw8TUFYX05VTV9PRl9DSEFOTkVMUzsgbCsrKQotCQl7Ci0JCQlpZiAoY2hhbm5lbCA9PSBwQWQtPlR4UG93ZXJbbF0uQ2hhbm5lbCkKLQkJCXsKLQkJCQlwQWQtPkNoYW5uZWxMaXN0W2pdLlBvd2VyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyOwotCQkJCXBBZC0+Q2hhbm5lbExpc3Rbal0uUG93ZXIyID0gcEFkLT5UeFBvd2VyW2xdLlBvd2VyMjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobCA9PSBNQVhfTlVNX09GX0NIQU5ORUxTKQotCQkJY29udGludWU7Ci0KLQkJcEFkLT5DaGFubmVsTGlzdFtqXS5DaGFubmVsID0gcENoRGVzcC0+Rmlyc3RDaGFubmVsICsgaSAqIGluY3JlbWVudDsKLQkJcEFkLT5DaGFubmVsTGlzdFtqXS5NYXhUeFB3ciA9IHBDaERlc3AtPk1heFR4UHdyOwotCQlwQWQtPkNoYW5uZWxMaXN0W2pdLkRmc1JlcSA9IHBDaERlc3AtPkRmc1JlcTsKLQkJaisrOwotCX0KLQlwQWQtPkNoYW5uZWxMaXN0TnVtID0gajsKLQotCXJldHVybiBqOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgVk9JRCBDcmVhdGVDaExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUENIX1JFR0lPTiBwQ2hSZWdpb24sCi0JSU4gVUNIQVIgR2VvZ3JhcGh5KQotewotCUlOVCBpOwotCVVDSEFSIG9mZnNldCA9IDA7Ci0JUENIX0RFU1AgcENoRGVzcDsKLQlVQ0hBUiBDaFR5cGU7Ci0JVUNIQVIgaW5jcmVtZW50OwotCi0JaWYgKHBDaFJlZ2lvbiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlDaEJhbmRDaGVjayhwQWQtPkNvbW1vbkNmZy5QaHlNb2RlLCAmQ2hUeXBlKTsKLQotCWZvciAoaT0wOyBpPDEwOyBpKyspCi0JewotCQlwQ2hEZXNwID0gJnBDaFJlZ2lvbi0+Q2hEZXNwW2ldOwotCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID09IDApCi0JCQlicmVhazsKLQotCQlpZiAoQ2hUeXBlID09IEJBTkRfNUcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPD0gMTQpCi0JCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoQ2hUeXBlID09IEJBTkRfMjRHKQotCQl7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBCT1RIKQotCQkJfHwgKHBDaERlc3AtPkdlb2dyYXBoeSA9PSBHZW9ncmFwaHkpKQotICAgICAgICB7Ci0JCQlpZiAocENoRGVzcC0+Rmlyc3RDaGFubmVsID4gMTQpCi0gICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gNDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAxOwotCQkJb2Zmc2V0ID0gRmlsbENoTGlzdChwQWQsIHBDaERlc3AsIG9mZnNldCwgaW5jcmVtZW50KTsKLSAgICAgICAgfQotCX0KLX0KLQotCi1WT0lEIEJ1aWxkQ2hhbm5lbExpc3RFeCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlQQ0hfUkVHSU9OIHBDaFJlZzsKLQotCXBDaFJlZyA9IEdldENoUmVnaW9uKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKLQlDcmVhdGVDaExpc3QocEFkLCBwQ2hSZWcsIHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSk7Ci19Ci0KLQotVk9JRCBCdWlsZEJlYWNvbkNoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBCdWYsCi0JT1VUCVBVTE9ORyBwQnVmTGVuKQotewotCUlOVCBpOwotCVVMT05HIFRtcExlbjsKLQlQQ0hfUkVHSU9OIHBDaFJlZ2lvbjsKLQlQQ0hfREVTUCBwQ2hEZXNwOwotCVVDSEFSIENoVHlwZTsKLQotCXBDaFJlZ2lvbiA9IEdldENoUmVnaW9uKHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlDb2RlKTsKLQotCWlmIChwQ2hSZWdpb24gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JQ2hCYW5kQ2hlY2socEFkLT5Db21tb25DZmcuUGh5TW9kZSwgJkNoVHlwZSk7Ci0JKnBCdWZMZW4gPSAwOwotCi0JZm9yIChpPTA7IGk8MTA7IGkrKykKLQl7Ci0JCXBDaERlc3AgPSAmcENoUmVnaW9uLT5DaERlc3BbaV07Ci0JCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChDaFR5cGUgPT0gQkFORF81RykKLQkJewotCQkJaWYgKHBDaERlc3AtPkZpcnN0Q2hhbm5lbCA8PSAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChDaFR5cGUgPT0gQkFORF8yNEcpCi0JCXsKLQkJCWlmIChwQ2hEZXNwLT5GaXJzdENoYW5uZWwgPiAxNCkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICgocENoRGVzcC0+R2VvZ3JhcGh5ID09IEJPVEgpCi0JCQl8fCAocENoRGVzcC0+R2VvZ3JhcGh5ID09IHBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSkpCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBCdWYgKyAqcEJ1ZkxlbiwJCSZUbXBMZW4sCi0JCQkJCQkJCTEsCQkJJnBDaERlc3AtPkZpcnN0Q2hhbm5lbCwKLQkJCQkJCQkJMSwJCQkmcENoRGVzcC0+TnVtT2ZDaCwKLQkJCQkJCQkJMSwJCQkmcENoRGVzcC0+TWF4VHhQd3IsCi0JCQkJCQkJCUVORF9PRl9BUkdTKTsKLQkJCSpwQnVmTGVuICs9IFRtcExlbjsKLQkJfQotCX0KLX0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1zdGF0aWMgQk9PTEVBTiBJc1ZhbGlkQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBjaGFubmVsKQotCi17Ci0JSU5UIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJcmV0dXJuIEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIFRSVUU7Ci19Ci0KLQotc3RhdGljIFVDSEFSIEdldEV4dENoKAotCUlOIFVDSEFSIENoYW5uZWwsCi0JSU4gVUNIQVIgRGlyZWN0aW9uKQotewotCUNIQVIgRXh0Q2g7Ci0KLQlpZiAoRGlyZWN0aW9uID09IEVYVENIQV9BQk9WRSkKLQkJRXh0Q2ggPSBDaGFubmVsICsgNDsKLQllbHNlCi0JCUV4dENoID0gKENoYW5uZWwgLSA0KSA+IDAgPyAoQ2hhbm5lbCAtIDQpIDogMDsKLQotCXJldHVybiBFeHRDaDsKLX0KLQotCi1WT0lEIE5fQ2hhbm5lbENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCS8vVUNIQVIgQ2hhbm5lbE51bSA9IHBBZC0+Q2hhbm5lbExpc3ROdW07Ci0JVUNIQVIgQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPT0gQldfNDApKQotCXsKLQkJaWYgKENoYW5uZWwgPiAxNCkKLQkJewotCQkJaWYgKChDaGFubmVsID09IDM2KSB8fCAoQ2hhbm5lbCA9PSA0NCkgfHwgKENoYW5uZWwgPT0gNTIpIHx8IChDaGFubmVsID09IDYwKSB8fCAoQ2hhbm5lbCA9PSAxMDApIHx8IChDaGFubmVsID09IDEwOCkgfHwKLQkJCSAgICAoQ2hhbm5lbCA9PSAxMTYpIHx8IChDaGFubmVsID09IDEyNCkgfHwgKENoYW5uZWwgPT0gMTMyKSB8fCAoQ2hhbm5lbCA9PSAxNDkpIHx8IChDaGFubmVsID09IDE1NykpCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9IEVYVENIQV9BQk9WRTsKLQkJCX0KLQkJCWVsc2UgaWYgKChDaGFubmVsID09IDQwKSB8fCAoQ2hhbm5lbCA9PSA0OCkgfHwgKENoYW5uZWwgPT0gNTYpIHx8IChDaGFubmVsID09IDY0KSB8fCAoQ2hhbm5lbCA9PSAxMDQpIHx8IChDaGFubmVsID09IDExMikgfHwKLQkJCQkJKENoYW5uZWwgPT0gMTIwKSB8fCAoQ2hhbm5lbCA9PSAxMjgpIHx8IChDaGFubmVsID09IDEzNikgfHwgKENoYW5uZWwgPT0gMTUzKSB8fCAoQ2hhbm5lbCA9PSAxNjEpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfQkVMT1c7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJZG8KLQkJCXsKLQkJCQlVQ0hBUiBFeHRDaDsKLQkJCQlVQ0hBUiBEaXIgPSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBOwotCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKLQkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCi0JCQkJCWJyZWFrOwotCi0JCQkJRGlyID0gKERpciA9PSBFWFRDSEFfQUJPVkUpID8gRVhUQ0hBX0JFTE9XIDogRVhUQ0hBX0FCT1ZFOwotCQkJCUV4dENoID0gR2V0RXh0Q2goQ2hhbm5lbCwgRGlyKTsKLQkJCQlpZiAoSXNWYWxpZENoYW5uZWwocEFkLCBFeHRDaCkpCi0JCQkJewotCQkJCQlwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuRVhUQ0hBID0gRGlyOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXICA9IEJXXzIwOwotCQkJfSB3aGlsZShGQUxTRSk7Ci0KLQkJCWlmIChDaGFubmVsID09IDE0KQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyAgPSBCV18yMDsKLQkJCQkvL3BBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPSBFWFRDSEFfTk9ORTsJLy8gV2UgZGlkbid0IHNldCB0aGUgRXh0Q2ggYXMgTk9ORSBkdWUgdG8gaXQnbGwgc2V0IGluIFJUTVBTZXRIVCgpCi0JCQl9Ci0JCX0KLQl9Ci0KLQotfQotCi0KLVZPSUQgTl9TZXRDZW5DaCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlpZiAocEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5FWFRDSEEgPT0gRVhUQ0hBX0FCT1ZFKQotCQl7Ci0JCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgKyAyOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPT0gMTQpCi0JCQkJcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMTsKLQkJCWVsc2UKLQkJCQlwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotVUlOVDggR2V0Q3VudHJ5TWF4VHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggY2hhbm5lbCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCA9PSBjaGFubmVsKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gcEFkLT5DaGFubmVsTGlzdE51bSkKLQkJcmV0dXJuIDB4ZmY7Ci0JZWxzZQotCQlyZXR1cm4gcEFkLT5DaGFubmVsTGlzdFtpXS5NYXhUeFB3cjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Yjk1YjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODgyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JcnRtcF9pbml0LmMKLQotCUFic3RyYWN0OgotCU1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLQktLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1VQ0hBUiAgICBCSVQ4W10gPSB7MHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MH07Ci1jaGFyKiAgIENpcGhlck5hbWVbXSA9IHsibm9uZSIsIndlcDY0Iiwid2VwMTI4IiwiVEtJUCIsIkFFUyIsIkNLSVA2NCIsIkNLSVAxMjgifTsKLQotLy8KLS8vIEJCUCByZWdpc3RlciBpbml0aWFsaXphdGlvbiBzZXQKLS8vCi1SRUdfUEFJUiAgIEJCUFJlZ1RhYmxlW10gPSB7Ci0Je0JCUF9SNjUsCQkweDJDfSwJCS8vIGZpeCByc3NpIGlzc3VlCi0Je0JCUF9SNjYsCQkweDM4fSwJLy8gQWxzbyBzZXQgdGhpcyBkZWZhdWx0IHZhbHVlIHRvIHBBZC0+QmJwVHVuaW5nLlI2NkN1cnJlbnRWYWx1ZSBhdCBpbml0aWFsCi0Je0JCUF9SNjksCQkweDEyfSwKLQl7QkJQX1I3MCwJCTB4YX0sCS8vIEJCUF9SNzAgd2lsbCBjaGFuZ2UgdG8gMHg4IGluIEFwU3RhcnRVcCBhbmQgTGlua1VwIGZvciBydDI4NjBDLCBvdGhlcndpc2UgdmFsdWUgaXMgMHhhCi0Je0JCUF9SNzMsCQkweDEwfSwKLQl7QkJQX1I4MSwJCTB4Mzd9LAotCXtCQlBfUjgyLAkJMHg2Mn0sCi0Je0JCUF9SODMsCQkweDZBfSwKLQl7QkJQX1I4NCwJCTB4OTl9LAkvLyAweDE5IGlzIGZvciBydDI4NjBFIGFuZCBhZnRlci4gVGhpcyBpcyBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwgb3ZlcmxhcHBpbmcgSU9ULiAweDk5IGlzIGZvciBydDI4NjBEIGFuZCBiZWZvcmUKLQl7QkJQX1I4NiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1I5MSwJCTB4MDR9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1I5MiwJCTB4MDB9LAkvLyBtaWRkbGUgcmFuZ2UgaXNzdWUsIFJvcnkgQDIwMDgtMDEtMjgKLQl7QkJQX1IxMDMsCQkweDAwfSwJLy8gbmVhciByYW5nZSBoaWdoLXBvd2VyIGlzc3VlLCByZXF1ZXN0ZWQgZnJvbSBHYXJ5IEAyMDA4LTA1MjgKLQl7QkJQX1IxMDUsCQkweDA1fSwJLy8gMHgwNSBpcyBmb3IgcnQyODYwRSB0byB0dXJuIG9uIEZFUSBjb250cm9sLiBJdCBpcyBzYWZlIGZvciBydDI4NjBEIGFuZCBiZWZvcmUsIGJlY2F1c2UgQml0IDc6MiBhcmUgcmVzZXJ2ZWQgaW4gcnQyODYwRCBhbmQgYmVmb3JlLgotCXtCQlBfUjEwNiwJCTB4MzV9LCAgLy8gZm9yIFNob3J0R0kgdGhyb3VnaHB1dAotfTsKLSNkZWZpbmUJTlVNX0JCUF9SRUdfUEFSTVMJKHNpemVvZihCQlBSZWdUYWJsZSkgLyBzaXplb2YoUkVHX1BBSVIpKQotCi0KLS8vCi0vLyBBU0lDIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIHNldHMKLS8vCi0KLVJUTVBfUkVHX1BBSVIJTUFDUmVnVGFibGVbXSA9CXsKLSNpZiBkZWZpbmVkKEhXX0JFQUNPTl9PRkZTRVQpICYmIChIV19CRUFDT05fT0ZGU0VUID09IDB4MjAwKQotCXtCQ05fT0ZGU0VUMCwJCQkweGY4ZjBlOGUwfSwgLyogMHgzODAwKGUwKSwgMHgzQTAwKGU4KSwgMHgzQzAwKGYwKSwgMHgzRTAwKGY4KSwgNTEyQiBmb3IgZWFjaCBiZWFjb24gKi8KLQl7QkNOX09GRlNFVDEsCQkJMHg2Zjc3ZDBjOH0sIC8qIDB4MzIwMChjOCksIDB4MzQwMChkMCksIDB4MURDMCg3NyksIDB4MUJDMCg2ZiksIDUxMkIgZm9yIGVhY2ggYmVhY29uICovCi0jZWxpZiBkZWZpbmVkKEhXX0JFQUNPTl9PRkZTRVQpICYmIChIV19CRUFDT05fT0ZGU0VUID09IDB4MTAwKQotCXtCQ05fT0ZGU0VUMCwJCQkweGVjZThlNGUwfSwgLyogMHgzODAwLCAweDNBMDAsIDB4M0MwMCwgMHgzRTAwLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwotCXtCQ05fT0ZGU0VUMSwJCQkweGZjZjhmNGYwfSwgLyogMHgzODAwLCAweDNBMDAsIDB4M0MwMCwgMHgzRTAwLCA1MTJCIGZvciBlYWNoIGJlYWNvbiAqLwotI2Vsc2UKLSAgICAjZXJyb3IgWW91IG11c3QgcmUtY2FsY3VsYXRlIG5ldyB2YWx1ZSBmb3IgQkNOX09GRlNFVDAgJiBCQ05fT0ZGU0VUMSBpbiBNQUNSZWdUYWJsZVtdISEhCi0jZW5kaWYgLy8gSFdfQkVBQ09OX09GRlNFVCAvLwotCi0Je0xFR0FDWV9CQVNJQ19SQVRFLAkJMHgwMDAwMDEzZn0sIC8vICBCYXNpYyByYXRlIHNldCBiaXRtYXAKLQl7SFRfQkFTSUNfUkFURSwJCTB4MDAwMDgwMDN9LCAvLyBCYXNpYyBIVCByYXRlIHNldCAsIDIwTSwgTUNTPTMsIE1NLiBGb3JtYXQgaXMgdGhlIHNhbWUgYXMgaW4gVFhXSS4KLQl7TUFDX1NZU19DVFJMLAkJMHgwMH0sIC8vIDB4MTAwNCwgLCBkZWZhdWx0IERpc2FibGUgUlgKLQl7UlhfRklMVFJfQ0ZHLAkJMHgxN2Y5N30sIC8vMHgxNDAwICAsIFJYIGZpbHRlciBjb250cm9sLAotCXtCS09GRl9TTE9UX0NGRywJMHgyMDl9LCAvLyBkZWZhdWx0IHNldCBzaG9ydCBzbG90IHRpbWUsIENDX0RFTEFZX1RJTUUgc2hvdWxkIGJlIDIKLQkvL3tUWF9TV19DRkcwLAkJMHg0MGEwNn0sIC8vIEdhcnksMjAwNi0wOC0yMwotCXtUWF9TV19DRkcwLAkJMHgwfSwJCS8vIEdhcnksMjAwOC0wNS0yMSBmb3IgQ1dDIHRlc3QKLQl7VFhfU1dfQ0ZHMSwJCTB4ODA2MDZ9LCAvLyBHYXJ5LDIwMDYtMDgtMjMKLQl7VFhfTElOS19DRkcsCQkweDEwMjB9LAkJLy8gR2FyeSwyMDA2LTA4LTIzCi0JLy97VFhfVElNRU9VVF9DRkcsCTB4MDAxODIwOTB9LAkvLyBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQKLQl7VFhfVElNRU9VVF9DRkcsCTB4MDAwYTIwOTB9LAkvLyBDQ0sgaGFzIHNvbWUgcHJvYmxlbS4gU28gaW5jcmVhc2UgdGltaWVvdXQgdmFsdWUuIDIwMDYtMTAtMDkvLyBNQXJ2ZWsgUlQgLCBNb2RpZnkgZm9yIDI4NjBFICwyMDA3LTA4LTAxCi0Je01BWF9MRU5fQ0ZHLAkJTUFYX0FHR1JFR0FUSU9OX1NJWkUgfCAweDAwMDAxMDAwfSwJLy8gMHgzMDE4LCBNQVggZnJhbWUgbGVuZ3RoLiBNYXggUFNEVSA9IDE2a2J5dGVzLgotCXtMRURfQ0ZHLAkJMHg3ZjAzMWU0Nn0sIC8vIEdhcnksIDIwMDYtMDgtMjMKLQotLy8jaWZkZWYgQ09ORklHX0FQX1NVUFBPUlQKLS8vCXtXTU1fQUlGU05fQ0ZHLAkJMHgwMDAwMTE3M30sCi0vLwl7V01NX0NXTUlOX0NGRywJCTB4MDAwMDIzNDR9LAotLy8Je1dNTV9DV01BWF9DRkcsCQkweDAwMDAzNGE2fSwKLS8vCXtXTU1fVFhPUDBfQ0ZHLAkJMHgwMDEwMDAyMH0sCi0vLwl7V01NX1RYT1AxX0NGRywJCTB4MDAyRjAwMzh9LAotLy8jZW5kaWYgLy8gQ09ORklHX0FQX1NVUFBPUlQgLy8KLQotLy8jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vLwl7V01NX0FJRlNOX0NGRywJCTB4MDAwMDIyNzN9LAotLy8Je1dNTV9DV01JTl9DRkcsCQkweDAwMDAyMzQ0fSwKLS8vCXtXTU1fQ1dNQVhfQ0ZHLAkJMHgwMDAwMzRhYX0sCi0vLyNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNpZmRlZiBJTkZfQU1BWk9OX1NFCi0Je1BCRl9NQVhfUENOVCwJCQkweDFGM0Y2RjZGfSwJLy9pdmVyc29uIG1vZGlmeSBmb3IgdXNiIGlzc3VlLCAyMDA4LzA5LzE5Ci0JCQkJCQkJCQkJCS8vIDZGICsgNkYgPCB0b3RhbCBwYWdlIGNvdW50IEZFCi0JCQkJCQkJCQkJCS8vIHNvIHRoYXQgUlggZG9lc24ndCBvY2N1cHkgVFgncyBidWZmZXIgc3BhY2Ugd2hlbiBXTU0gY29uZ2VzdGlvbi4KLSNlbHNlCi0Je1BCRl9NQVhfUENOVCwJCQkweDFGM0ZCRjlGfSwJLy8weDFGM2Y3ZjlmfSwJCS8vSmFuLCAyMDA2LzA0LzIwCi0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotCS8ve1RYX1JUWV9DRkcsCQkJMHg2YmI4MDQwOH0sCS8vIEphbiwgMjAwNi8xMS8xNgotLy8gV01NX0FDTV9TVVBQT1JUCi0vLwl7VFhfUlRZX0NGRywJCQkweDZiYjgwMTAxfSwJLy8gc2FtcGxlCi0Je1RYX1JUWV9DRkcsCQkJMHg0N2QwMWYwZn0sCS8vIEphbiwgMjAwNi8xMS8xNiwgU2V0IFR4V0ktPkFDSyA9MCBpbiBQcm9iZSBSc3AgTW9kaWZ5IGZvciAyODYwRSAsMjAwNy0wOC0wMwotCi0Je0FVVE9fUlNQX0NGRywJCQkweDAwMDAwMDEzfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyCi0Je0NDS19QUk9UX0NGRywJCQkweDA1NzQwMDAzIC8qMHgwMTc0MDAwMyovfSwJLy8gSW5pdGlhbCBBdXRvX1Jlc3BvbmRlciwgYmVjYXVzZSBRQSB3aWxsIHR1cm4gb2ZmIEF1dG8tUmVzcG9uZGVyLiBBbmQgUlRTIHRocmVzaG9sZCBpcyBlbmFibGVkLgotCXtPRkRNX1BST1RfQ0ZHLAkJCTB4MDU3NDAwMDMgLyoweDAxNzQwMDAzKi99LAkvLyBJbml0aWFsIEF1dG9fUmVzcG9uZGVyLCBiZWNhdXNlIFFBIHdpbGwgdHVybiBvZmYgQXV0by1SZXNwb25kZXIuIEFuZCBSVFMgdGhyZXNob2xkIGlzIGVuYWJsZWQuCi0Je0dGMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sICAgIC8vIHNldCAxOToxOCAtLT4gU2hvcnQgTkFWIGZvciBNSU1PIFBTCi0Je0dGNDBfUFJPVF9DRkcsCQkJMHgwM0Y0NDA4NH0sCi0Je01NMjBfUFJPVF9DRkcsCQkJMHgwMTc0NDAwNH0sCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0Je01NNDBfUFJPVF9DRkcsCQkJMHgwM0Y1NDA4NH0sCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0Je1RYT1BfQ1RSTF9DRkcsCQkJMHgwMDAwNTgzZiwgLyoweDAwMDAyNDNmKi8gLyoweDAwMDAyNGJmKi99LAkvL0V4dGVuc2lvbiBjaGFubmVsIGJhY2tvZmYuCi0Je1RYX1JUU19DRkcsCQkJMHgwMDA5MmIyMH0sCi0vLyNpZmRlZiBXSUZJX1RFU1QKLQl7RVhQX0FDS19USU1FLAkJCTB4MDAyNDAwY2F9LAkvLyBkZWZhdWx0IHZhbHVlCi0vLyNlbHNlCi0vLwl7RVhQX0FDS19USU1FLAkJCTB4MDA1NDAwY2F9LAkvLyBzdWdnZXN0ZWQgYnkgR3JheSBAIDIwMDcwMzIzIGZvciAxMW4gaW50ZWwtc3RhIHRocm91Z2hwdXQKLS8vI2VuZGlmIC8vIGVuZCAtIFdJRklfVEVTVCAvLwotLy8jaWZkZWYgQ09ORklHX0FQX1NVUFBPUlQKLS8vCXtUQlRUX1NZTkNfQ0ZHLAkJCTB4MDA0MjIwMDB9LAkvLyBUQlRUX0FESlVTVCg3OjApID09IDAKLS8vCXtUQlRUX1NZTkNfQ0ZHLAkJCTB4MDAwMTIwMDB9LAkvLyBUQlRUX0FESlVTVCg3OjApID09IDAKLS8vI2VuZGlmIC8vIENPTkZJR19BUF9TVVBQT1JUIC8vCi0Je1RYT1BfSExEUl9FVCwJCQkweDAwMDAwMDAyfSwKLQotCS8qIEplcnJ5IGNvbW1lbnRzIDIwMDgvMDEvMTY6IHdlIHVzZSBTSUZTID0gMTB1cyBpbiBDQ0sgZGVmYXVsdGx5LCBidXQgaXQgc2VlbXMgdGhhdCAxMHVzCi0JCWlzIHRvbyBzbWFsbCBmb3IgSU5URUwgMjIwMGJnIGNhcmQsIHNvIGluIE1CU1MgbW9kZSwgdGhlIGRlbHRhIHRpbWUgYmV0d2VlbiBiZWFjb24wCi0JCWFuZCBiZWFjb24xIGlzIFNJRlMgKDEwdXMpLCBzbyBpZiBJTlRFTCAyMjAwYmcgY2FyZCBjb25uZWN0cyB0byBCU1MwLCB0aGUgcGluZwotCQl3aWxsIGFsd2F5cyBsb3N0LiBTbyB3ZSBjaGFuZ2UgdGhlIFNJRlMgb2YgQ0NLIGZyb20gMTB1cyB0byAxNnVzLiAqLwotCXtYSUZTX1RJTUVfQ0ZHLAkJCTB4MzNhNDEwMTB9LAotCXtQV1JfUElOX0NGRywJCQkweDAwMDAwMDAzfSwJLy8gcGF0Y2ggZm9yIDI4ODAtRQotfTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1SVE1QX1JFR19QQUlSCVNUQU1BQ1JlZ1RhYmxlW10gPQl7Ci0Je1dNTV9BSUZTTl9DRkcsCQkweDAwMDAyMjczfSwKLQl7V01NX0NXTUlOX0NGRywJMHgwMDAwMjM0NH0sCi0Je1dNTV9DV01BWF9DRkcsCTB4MDAwMDM0YWF9LAotfTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2RlZmluZQlOVU1fTUFDX1JFR19QQVJNUwkJKHNpemVvZihNQUNSZWdUYWJsZSkgLyBzaXplb2YoUlRNUF9SRUdfUEFJUikpCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lCU5VTV9TVEFfTUFDX1JFR19QQVJNUwkoc2l6ZW9mKFNUQU1BQ1JlZ1RhYmxlKSAvIHNpemVvZihSVE1QX1JFR19QQUlSKSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJQWxsb2NhdGUgUlRNUF9BREFQVEVSIGRhdGEgYmxvY2sgYW5kIGRvIHNvbWUgaW5pdGlhbGl6YXRpb24KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlORElTX1NUQVRVU19TVUNDRVNTCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMJUlRNUEFsbG9jQWRhcHRlckJsb2NrKAotCUlOICBQVk9JRAloYW5kbGUsCi0JT1VUCVBSVE1QX0FEQVBURVIJKnBwQWRhcHRlcikKLXsKLQlQUlRNUF9BREFQVEVSCXBBZDsKLQlORElTX1NUQVRVUwkJU3RhdHVzOwotCUlOVAkJCWluZGV4OwotCVVDSEFSCQkJKnBCZWFjb25CdWYgPSBOVUxMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJUTVBBbGxvY0FkYXB0ZXJCbG9ja1xuIikpOwotCi0JKnBwQWRhcHRlciA9IE5VTEw7Ci0KLQlkbwotCXsKLQkJLy8gQWxsb2NhdGUgUlRNUF9BREFQVEVSIG1lbW9yeSBibG9jawotCQlwQmVhY29uQnVmID0ga21hbGxvYyhNQVhfQkVBQ09OX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQkJaWYgKHBCZWFjb25CdWYgPT0gTlVMTCkKLQkJewotCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQkJCURCR1BSSU5UX0VSUigoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgLSBCZWFjb25CdWYhXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCQlOZGlzWmVyb01lbW9yeShwQmVhY29uQnVmLCBNQVhfQkVBQ09OX1NJWkUpOwotCi0JCVN0YXR1cyA9IEFkYXB0ZXJCbG9ja0FsbG9jYXRlTWVtb3J5KGhhbmRsZSwgKFBWT0lEICopJnBBZCk7Ci0JCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAtIEFEQVBURVJcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBBZC0+QmVhY29uQnVmID0gcEJlYWNvbkJ1ZjsKLQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuXG49PT0gcEFkID0gJXAsIHNpemUgPSAlZCA9PT1cblxuIiwgcEFkLCAoVUlOVDMyKXNpemVvZihSVE1QX0FEQVBURVIpKSk7Ci0KLQotCQkvLyBJbml0IHNwaW4gbG9ja3MKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWdtdFJpbmdMb2NrKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+UnhSaW5nTG9jayk7Ci0jaWZkZWYgUlQzMDkwCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJZm9yIChpbmRleCA9MCA7IGluZGV4IDwgTlVNX09GX1RYX1JJTkc7IGluZGV4KyspCi0JCXsKLQkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPlR4U3dRdWV1ZUxvY2tbaW5kZXhdKTsKLQkJCU5kaXNBbGxvY2F0ZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7Ci0JCQlwQWQtPkRlUXVldWVSdW5uaW5nW2luZGV4XSA9IEZBTFNFOwotCQl9Ci0KLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+aXJxX2xvY2spOwotCi0KLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlpZiAoKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKSAmJiAocEJlYWNvbkJ1ZikpCi0JCWtmcmVlKHBCZWFjb25CdWYpOwotCi0JKnBwQWRhcHRlciA9IHBBZDsKLQotCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBSVE1QQWxsb2NBZGFwdGVyQmxvY2ssIFN0YXR1cz0leFxuIiwgU3RhdHVzKSk7Ci0JcmV0dXJuIFN0YXR1czsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVhZCBpbml0aWFsIFR4IHBvd2VyIHBlciBNQ1MgYW5kIEJXIGZyb20gRUVQUk9NCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QUmVhZFR4UHdyUGVyUmF0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlVTE9ORwkJZGF0YSwgQWRhdGEsIEdkYXRhOwotCVVTSE9SVAkJaSwgdmFsdWUsIHZhbHVlMjsKLQlJTlQJCQlBcHdyZGVsdGEsIEdwd3JkZWx0YTsKLQlVQ0hBUgkJdDEsdDIsdDMsdDQ7Ci0JQk9PTEVBTgkJYkFwd3JkZWx0YU1pbnVzID0gVFJVRSwgYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKLQotCS8vCi0JLy8gR2V0IHBvd2VyIGRlbHRhIGZvciAyME1IeiBhbmQgNDBNSHouCi0JLy8KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUeHBvd2VyIHBlciBSYXRlXG4iKSk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9ERUxUQSwgdmFsdWUyKTsKLQlBcHdyZGVsdGEgPSAwOwotCUdwd3JkZWx0YSA9IDA7Ci0KLQlpZiAoKHZhbHVlMiAmIDB4ZmYpICE9IDB4ZmYpCi0JewotCQlpZiAoKHZhbHVlMiAmIDB4ODApKQotCQkJR3B3cmRlbHRhID0gKHZhbHVlMiYweGYpOwotCi0JCWlmICgodmFsdWUyICYgMHg0MCkpCi0JCQliR3B3cmRlbHRhTWludXMgPSBGQUxTRTsKLQkJZWxzZQotCQkJYkdwd3JkZWx0YU1pbnVzID0gVFJVRTsKLQl9Ci0JaWYgKCh2YWx1ZTIgJiAweGZmMDApICE9IDB4ZmYwMCkKLQl7Ci0JCWlmICgodmFsdWUyICYgMHg4MDAwKSkKLQkJCUFwd3JkZWx0YSA9ICgodmFsdWUyJjB4ZjAwKT4+OCk7Ci0KLQkJaWYgKCh2YWx1ZTIgJiAweDQwMDApKQotCQkJYkFwd3JkZWx0YU1pbnVzID0gRkFMU0U7Ci0JCWVsc2UKLQkJCWJBcHdyZGVsdGFNaW51cyA9IFRSVUU7Ci0JfQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkdwd3JkZWx0YSA9ICV4LCBBcHdyZGVsdGEgPSAleCAuXG4iLCBHcHdyZGVsdGEsIEFwd3JkZWx0YSkpOwotCi0JLy8KLQkvLyBHZXQgVHhwb3dlciBwZXIgTUNTIGZvciAyME1IeiBpbiAyLjRHLgotCS8vCi0JZm9yIChpPTA7IGk8NTsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCwgdmFsdWUpOwotCQlkYXRhID0gdmFsdWU7Ci0JCWlmIChiQXB3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDEgPiAweGYpCi0JCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQyID4gMHhmKQotCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDMgPiAweGYpCi0JCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhBcHdyZGVsdGEpOwotCQkJaWYgKHQ0ID4gMHhmKQotCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gQXB3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gQXB3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEFwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEFwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBBcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0NCA9IDA7Ci0JCX0KLQkJQWRhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7Ci0JCWlmIChiR3B3cmRlbHRhTWludXMgPT0gRkFMU0UpCi0JCXsKLQkJCXQxID0gKHZhbHVlJjB4ZikrKEdwd3JkZWx0YSk7Ci0JCQlpZiAodDEgPiAweGYpCi0JCQkJdDEgPSAweGY7Ci0JCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQyID4gMHhmKQotCQkJCXQyID0gMHhmOwotCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCkrKEdwd3JkZWx0YSk7Ci0JCQlpZiAodDMgPiAweGYpCi0JCQkJdDMgPSAweGY7Ci0JCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQ0ID4gMHhmKQotCQkJCXQ0ID0gMHhmOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCh2YWx1ZSYweGYpID4gR3B3cmRlbHRhKQotCQkJCXQxID0gKHZhbHVlJjB4ZiktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDEgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMCk+PjQpID4gR3B3cmRlbHRhKQotCQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDIgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDApPj44KSA+IEdwd3JkZWx0YSkKLQkJCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KS0oR3B3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MyA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMDApPj4xMikgPiBHcHdyZGVsdGEpCi0JCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKS0oR3B3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0NCA9IDA7Ci0JCX0KLQkJR2RhdGEgPSB0MSArICh0Mjw8NCkgKyAodDM8PDgpICsgKHQ0PDwxMik7Ci0KLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVFhQT1dFUl9CWVJBVEVfMjBNSFpfMl80RyArIGkqNCArIDIsIHZhbHVlKTsKLQkJaWYgKGJBcHdyZGVsdGFNaW51cyA9PSBGQUxTRSkKLQkJewotCQkJdDEgPSAodmFsdWUmMHhmKSsoQXB3cmRlbHRhKTsKLQkJCWlmICh0MSA+IDB4ZikKLQkJCQl0MSA9IDB4ZjsKLQkJCXQyID0gKCh2YWx1ZSYweGYwKT4+NCkrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDIgPiAweGYpCi0JCQkJdDIgPSAweGY7Ci0JCQl0MyA9ICgodmFsdWUmMHhmMDApPj44KSsoQXB3cmRlbHRhKTsKLQkJCWlmICh0MyA+IDB4ZikKLQkJCQl0MyA9IDB4ZjsKLQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMikrKEFwd3JkZWx0YSk7Ci0JCQlpZiAodDQgPiAweGYpCi0JCQkJdDQgPSAweGY7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKHZhbHVlJjB4ZikgPiBBcHdyZGVsdGEpCi0JCQkJdDEgPSAodmFsdWUmMHhmKS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MSA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwKT4+NCkgPiBBcHdyZGVsdGEpCi0JCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KS0oQXB3cmRlbHRhKTsKLQkJCWVsc2UKLQkJCQl0MiA9IDA7Ci0JCQlpZiAoKCh2YWx1ZSYweGYwMCk+PjgpID4gQXB3cmRlbHRhKQotCQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpLShBcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQzID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwMCk+PjEyKSA+IEFwd3JkZWx0YSkKLQkJCQl0NCA9ICgodmFsdWUmMHhmMDAwKT4+MTIpLShBcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQ0ID0gMDsKLQkJfQotCQlBZGF0YSB8PSAoKHQxPDwxNikgKyAodDI8PDIwKSArICh0Mzw8MjQpICsgKHQ0PDwyOCkpOwotCQlpZiAoYkdwd3JkZWx0YU1pbnVzID09IEZBTFNFKQotCQl7Ci0JCQl0MSA9ICh2YWx1ZSYweGYpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQxID4gMHhmKQotCQkJCXQxID0gMHhmOwotCQkJdDIgPSAoKHZhbHVlJjB4ZjApPj40KSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0MiA+IDB4ZikKLQkJCQl0MiA9IDB4ZjsKLQkJCXQzID0gKCh2YWx1ZSYweGYwMCk+PjgpKyhHcHdyZGVsdGEpOwotCQkJaWYgKHQzID4gMHhmKQotCQkJCXQzID0gMHhmOwotCQkJdDQgPSAoKHZhbHVlJjB4ZjAwMCk+PjEyKSsoR3B3cmRlbHRhKTsKLQkJCWlmICh0NCA+IDB4ZikKLQkJCQl0NCA9IDB4ZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgodmFsdWUmMHhmKSA+IEdwd3JkZWx0YSkKLQkJCQl0MSA9ICh2YWx1ZSYweGYpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQxID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjApPj40KSA+IEdwd3JkZWx0YSkKLQkJCQl0MiA9ICgodmFsdWUmMHhmMCk+PjQpLShHcHdyZGVsdGEpOwotCQkJZWxzZQotCQkJCXQyID0gMDsKLQkJCWlmICgoKHZhbHVlJjB4ZjAwKT4+OCkgPiBHcHdyZGVsdGEpCi0JCQkJdDMgPSAoKHZhbHVlJjB4ZjAwKT4+OCktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDMgPSAwOwotCQkJaWYgKCgodmFsdWUmMHhmMDAwKT4+MTIpID4gR3B3cmRlbHRhKQotCQkJCXQ0ID0gKCh2YWx1ZSYweGYwMDApPj4xMiktKEdwd3JkZWx0YSk7Ci0JCQllbHNlCi0JCQkJdDQgPSAwOwotCQl9Ci0JCUdkYXRhIHw9ICgodDE8PDE2KSArICh0Mjw8MjApICsgKHQzPDwyNCkgKyAodDQ8PDI4KSk7Ci0JCWRhdGEgfD0gKHZhbHVlPDwxNik7Ci0KLQkJLyogRm9yIDIwTS80ME0gUG93ZXIgRGVsdGEgaXNzdWUgKi8KLQkJcEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldID0gZGF0YTsKLQkJcEFkLT5UeDIwTVB3ckNmZ0dCYW5kW2ldID0gZGF0YTsKLQkJcEFkLT5UeDQwTVB3ckNmZ0FCYW5kW2ldID0gQWRhdGE7Ci0JCXBBZC0+VHg0ME1Qd3JDZmdHQmFuZFtpXSA9IEdkYXRhOwotCi0JCWlmIChkYXRhICE9IDB4ZmZmZmZmZmYpCi0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIGRhdGEpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsICgiMjBNSHogQlcsIDIuNEcgYmFuZC0lbHgsICBBZGF0YSA9ICVseCwgIEdkYXRhID0gJWx4IFxuIiwgZGF0YSwgQWRhdGEsIEdkYXRhKSk7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZWFkIGluaXRpYWwgY2hhbm5lbCBwb3dlciBwYXJhbWV0ZXJzIGZyb20gRUVQUk9NCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QUmVhZENoYW5uZWxQd3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUNIQVIJCQkJaSwgY2hvZmZzZXQ7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXI7Ci0JRUVQUk9NX1RYX1BXUl9TVFJVQwkgICAgUG93ZXIyOwotCi0JLy8gUmVhZCBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzCi0JLy8gVmFsdWUgZnJvbSAxIC0gMHg3Zi4gRGVmYXVsdCB2YWx1ZSBpcyAyNC4KLQkvLyBQb3dlciB2YWx1ZSA6IDIuNEcgMHgwMCAoMCkgfiAweDFGICgzMSkKLQkvLyAgICAgICAgICAgICA6IDUuNUcgMHhGOSAoLTcpIH4gMHgwRiAoMTUpCi0KLQkvLyAwLiAxMWIvZywgY2gxIC0gY2ggMTQKLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fR19UWF9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyLndvcmQpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9HX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKLQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5DaGFubmVsID0gaSAqIDIgKyAxOwotCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5DaGFubmVsID0gaSAqIDIgKyAyOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMCkpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyID0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJZWxzZQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPiAzMSkgfHwgKFBvd2VyLmZpZWxkLkJ5dGUxIDwgMCkpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCWVsc2UKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIDFdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTAgPiAzMSkgfHwgKFBvd2VyMi5maWVsZC5CeXRlMCA8IDApKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQllbHNlCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDJdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMDsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMSA+IDMxKSB8fCAoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMCkpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQllbHNlCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7Ci0JfQotCi0JLy8gMS4gVS1OSUkgbG93ZXIvbWlkZGxlIGJhbmQ6IDM2LCAzOCwgNDA7IDQ0LCA0NiwgNDg7IDUyLCA1NCwgNTY7IDYwLCA2MiwgNjQgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKLQkvLyAxLjEgRmlsbCB1cCBjaGFubmVsCi0JY2hvZmZzZXQgPSAxNDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMzYgKyBpICogOCArIDQ7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JfQotCi0JLy8gMS4yIEZpbGwgdXAgcG93ZXIKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWF9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyLndvcmQpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9BX1RYMl9QV1JfT0ZGU0VUICsgaSAqIDIsIFBvd2VyMi53b3JkKTsKLQotCQlpZiAoKFBvd2VyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlci5maWVsZC5CeXRlMCA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDBdLlBvd2VyID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0KLQkJaWYgKChQb3dlci5maWVsZC5CeXRlMSA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUwIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTA7Ci0KLQkJaWYgKChQb3dlcjIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyMi5maWVsZC5CeXRlMSA+PSAtNykpCi0JCQlwQWQtPlR4UG93ZXJbaSAqIDIgKyBjaG9mZnNldCArIDFdLlBvd2VyMiA9IFBvd2VyMi5maWVsZC5CeXRlMTsKLQl9Ci0KLQkvLyAyLiBIaXBwZXJMQU4gMiAxMDAsIDEwMiAsMTA0OyAxMDgsIDExMCwgMTEyOyAxMTYsIDExOCwgMTIwOyAxMjQsIDEyNiwgMTI4OyAxMzIsIDEzNCwgMTM2OyAxNDAgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKLQkvLyAyLjEgRmlsbCB1cCBjaGFubmVsCi0JY2hvZmZzZXQgPSAxNCArIDEyOwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JewotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJPSAxMDAgKyBpICogOCArIDA7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDBdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCT0gMTAwICsgaSAqIDggKyAyOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uQ2hhbm5lbAk9IDEwMCArIGkgKiA4ICsgNDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMl0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQl9Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5DaGFubmVsCQk9IDE0MDsKLQlwQWQtPlR4UG93ZXJbMyAqIDUgKyBjaG9mZnNldCArIDBdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiA1ICsgY2hvZmZzZXQgKyAwXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCS8vIDIuMiBGaWxsIHVwIHBvd2VyCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7Ci0KLQkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7Ci0JfQotCi0JLy8gMy4gVS1OSUkgdXBwZXIgYmFuZDogMTQ5LCAxNTEsIDE1MzsgMTU3LCAxNTksIDE2MTsgMTY1LCAxNjcsIDE2OTsgMTcxLCAxNzMgKGluY2x1ZGluZyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBCVyA0ME1IeikKLQkvLyAzLjEgRmlsbCB1cCBjaGFubmVsCi0JY2hvZmZzZXQgPSAxNCArIDEyICsgMTY7Ci0JLypmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSovCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQl7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uQ2hhbm5lbAk9IDE0OSArIGkgKiA4ICsgMDsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAwXS5Qb3dlcgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMF0uUG93ZXIyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLkNoYW5uZWwJPSAxNDkgKyBpICogOCArIDI7Ci0JCXBBZC0+VHhQb3dlclszICogaSArIGNob2Zmc2V0ICsgMV0uUG93ZXIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDFdLlBvd2VyMgk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5DaGFubmVsCT0gMTQ5ICsgaSAqIDggKyA0OwotCQlwQWQtPlR4UG93ZXJbMyAqIGkgKyBjaG9mZnNldCArIDJdLlBvd2VyCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQkJcEFkLT5UeFBvd2VyWzMgKiBpICsgY2hvZmZzZXQgKyAyXS5Qb3dlcjIJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCX0KLQlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLkNoYW5uZWwJCT0gMTcxOwotCXBBZC0+VHhQb3dlclszICogMyArIGNob2Zmc2V0ICsgMF0uUG93ZXIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDBdLlBvd2VyMgkJPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAxXS5DaGFubmVsCQk9IDE3MzsKLQlwQWQtPlR4UG93ZXJbMyAqIDMgKyBjaG9mZnNldCArIDFdLlBvd2VyCQk9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0JcEFkLT5UeFBvd2VyWzMgKiAzICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIJCT0gREVGQVVMVF9SRl9UWF9QT1dFUjsKLQotCS8vIDMuMiBGaWxsIHVwIHBvd2VyCi0JLypmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSovCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlci53b3JkKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fQV9UWDJfUFdSX09GRlNFVCArIChjaG9mZnNldCAtIDE0KSArIGkgKiAyLCBQb3dlcjIud29yZCk7Ci0KLQkJaWYgKChQb3dlci5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIuZmllbGQuQnl0ZTAgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAwXS5Qb3dlciA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIuZmllbGQuQnl0ZTEgPCAxNikgJiYgKFBvd2VyLmZpZWxkLkJ5dGUxID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMV0uUG93ZXIgPSBQb3dlci5maWVsZC5CeXRlMTsKLQotCQlpZiAoKFBvd2VyMi5maWVsZC5CeXRlMCA8IDE2KSAmJiAoUG93ZXIyLmZpZWxkLkJ5dGUwID49IC03KSkKLQkJCXBBZC0+VHhQb3dlcltpICogMiArIGNob2Zmc2V0ICsgMF0uUG93ZXIyID0gUG93ZXIyLmZpZWxkLkJ5dGUwOwotCi0JCWlmICgoUG93ZXIyLmZpZWxkLkJ5dGUxIDwgMTYpICYmIChQb3dlcjIuZmllbGQuQnl0ZTEgPj0gLTcpKQotCQkJcEFkLT5UeFBvd2VyW2kgKiAyICsgY2hvZmZzZXQgKyAxXS5Qb3dlcjIgPSBQb3dlcjIuZmllbGQuQnl0ZTE7Ci0JfQotCi0JLy8gNC4gUHJpbnQgYW5kIERlYnVnCi0JLypjaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDc7Ki8KLQljaG9mZnNldCA9IDE0ICsgMTIgKyAxNiArIDExOwotCi0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVJlYWQgdGhlIGZvbGxvd2luZyBmcm9tIHRoZSByZWdpc3RyeQotCQkxLiBBbGwgdGhlIHBhcmFtZXRlcnMKLQkJMi4gTmV0d29ya0FkZHJlcwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQJRm9yIHVzZSBieSBOZGlzT3BlbkNvbmZpZ3VyYXRpb24KLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0JCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlOSUNSZWFkUmVnUGFyYW1ldGVycygKLQlJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4JTkRJU19IQU5ETEUJCQlXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQKLQkpCi17Ci0JTkRJU19TVEFUVVMJCQkJCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCURCR1BSSU5UX1MoU3RhdHVzLCAoIjwtLSBOSUNSZWFkUmVnUGFyYW1ldGVycywgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZWFkIGluaXRpYWwgcGFyYW1ldGVycyBmcm9tIEVFUFJPTQotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJTklDUmVhZEVFUFJPTVBhcmFtZXRlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJbWFjX2FkZHIpCi17Ci0JVUlOVDMyCQkJZGF0YSA9IDA7Ci0JVVNIT1JUCQkJaSwgdmFsdWUsIHZhbHVlMjsKLQlVQ0hBUgkJCVRtcFBoeTsKLQlFRVBST01fVFhfUFdSX1NUUlVDCSAgICBQb3dlcjsKLQlFRVBST01fVkVSU0lPTl9TVFJVQyAgICBWZXJzaW9uOwotCUVFUFJPTV9BTlRFTk5BX1NUUlVDCUFudGVubmE7Ci0JRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDICAgIE5pY0NvbmZpZzI7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnNcbiIpKTsKLQotCWlmIChwQWQtPmNoaXBPcHMuZWVpbml0KQotCQlwQWQtPmNoaXBPcHMuZWVpbml0KHBBZCk7Ci0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0jaWZkZWYgUlQzMHh4Ci0JaWYoIXBBZC0+YkZyb2NlRUVQUk9NQnVmZmVyICYmIHBBZC0+YkVFUFJPTUZpbGUpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnM6OihFZnVzZSlMb2FkICB0byBFRVBST00gQnVmZmVyIE1vZGVcbiIpKTsKLQkJZUZ1c2VMb2FkRUVQUk9NKHBBZCk7Ci0JfQotI2VuZGlmIC8vIFJUMzB4eCAvLwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotCi0JLy8gSW5pdCBFRVBST00gQWRkcmVzcyBOdW1iZXIsIGJlZm9yZSBhY2Nlc3MgRUVQUk9NOyBpZiA5M2M0NiwgRUVQUk9NQWRkcmVzc051bT02LCBlbHNlIGlmIDkzYzY2LCBFRVBST01BZGRyZXNzTnVtPTgKLQlSVE1QX0lPX1JFQUQzMihwQWQsIEUyUFJPTV9DU1IsICZkYXRhKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gRTJQUk9NX0NTUiA9IDB4JXhcbiIsIGRhdGEpKTsKLQotCWlmKChkYXRhICYgMHgzMCkgPT0gMCkKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gNjsJCS8vIDkzQzQ2Ci0JZWxzZSBpZigoZGF0YSAmIDB4MzApID09IDB4MTApCi0JCXBBZC0+RUVQUk9NQWRkcmVzc051bSA9IDg7ICAgICAvLyA5M0M2NgotCWVsc2UKLQkJcEFkLT5FRVBST01BZGRyZXNzTnVtID0gODsgICAgIC8vIDkzQzg2Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IEVFUFJPTUFkZHJlc3NOdW0gPSAlZFxuIiwgcEFkLT5FRVBST01BZGRyZXNzTnVtICkpOwotCi0JLy8gUlQyODYwIE1BQyBubyBsb25nZXIgYXV0byBsb2FkIE1BQyBhZGRyZXNzIGZyb20gRTJQUk9NLiBEcml2ZXIgaGFzIHRvIGludGlhbGl6ZQotCS8vIE1BQyBhZGRyZXNzIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gRTJQUk9NIHNldHRpbmcKLQlpZiAobWFjX2FkZHIgPT0gTlVMTCB8fAotCQlzdHJsZW4oKFBTVFJJTkcpIG1hY19hZGRyKSAhPSAxNyB8fAotCQltYWNfYWRkclsyXSAhPSAnOicgIHx8IG1hY19hZGRyWzVdICE9ICc6JyAgfHwgbWFjX2FkZHJbOF0gIT0gJzonIHx8Ci0JCW1hY19hZGRyWzExXSAhPSAnOicgfHwgbWFjX2FkZHJbMTRdICE9ICc6JykKLQl7Ci0JCVVTSE9SVCAgQWRkcjAxLEFkZHIyMyxBZGRyNDUgOwotCi0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHgwNCwgQWRkcjAxKTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDA2LCBBZGRyMjMpOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MDgsIEFkZHI0NSk7Ci0KLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzBdID0gKFVDSEFSKShBZGRyMDEgJiAweGZmKTsKLQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzFdID0gKFVDSEFSKShBZGRyMDEgPj4gOCk7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSA9IChVQ0hBUikoQWRkcjIzICYgMHhmZik7Ci0JCXBBZC0+UGVybWFuZW50QWRkcmVzc1szXSA9IChVQ0hBUikoQWRkcjIzID4+IDgpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNF0gPSAoVUNIQVIpKEFkZHI0NSAmIDB4ZmYpOwotCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSAoVUNIQVIpKEFkZHI0NSA+PiA4KTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJbml0aWFsaXplIE1BQyBBZGRyZXNzIGZyb20gRTJQUk9NIFxuIikpOwotCX0KLQllbHNlCi0JewotCQlJTlQJCWo7Ci0JCVBTVFJJTkcJbWFjcHRyOwotCi0JCW1hY3B0ciA9IChQU1RSSU5HKSBtYWNfYWRkcjsKLQotCQlmb3IgKGo9MDsgajxNQUNfQUREUl9MRU47IGorKykKLQkJewotCQkJQXRvSChtYWNwdHIsICZwQWQtPlBlcm1hbmVudEFkZHJlc3Nbal0sIDEpOwotCQkJbWFjcHRyPW1hY3B0ciszOwotCQl9Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW5pdGlhbGl6ZSBNQUMgQWRkcmVzcyBmcm9tIG1vZHVsZSBwYXJhbWV0ZXIgXG4iKSk7Ci0JfQotCi0KLQl7Ci0JCS8vbW9yZSBjb252ZW5pbmV0IHRvIHRlc3QgbWJzc2lkLCBzbyBhcCdzIGJzc2lkICYweGYxCi0JCWlmIChwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0gPT0gMHhmZikKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1swXSA9IFJhbmRvbUJ5dGUocEFkKSYweGY4OwotCi0JCS8vaWYgKHBBZC0+UGVybWFuZW50QWRkcmVzc1s1XSA9PSAweGZmKQotCQkvLwlwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0gPSBSYW5kb21CeXRlKHBBZCkmMHhmODsKLQotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfVFJBQ0UsKCJFMlBST00gTUFDOiA9JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQlwQWQtPlBlcm1hbmVudEFkZHJlc3NbMF0sIHBBZC0+UGVybWFuZW50QWRkcmVzc1sxXSwKLQkJCXBBZC0+UGVybWFuZW50QWRkcmVzc1syXSwgcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzNdLAotCQkJcEFkLT5QZXJtYW5lbnRBZGRyZXNzWzRdLCBwQWQtPlBlcm1hbmVudEFkZHJlc3NbNV0pKTsKLQkJaWYgKHBBZC0+YkxvY2FsQWRtaW5NQUMgPT0gRkFMU0UpCi0JCXsKLQkJCU1BQ19EVzBfU1RSVUMgY3NyMjsKLQkJCU1BQ19EVzFfU1RSVUMgY3NyMzsKLQkJCUNPUFlfTUFDX0FERFIocEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5QZXJtYW5lbnRBZGRyZXNzKTsKLQkJCWNzcjIuZmllbGQuQnl0ZTAgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzBdOwotCQkJY3NyMi5maWVsZC5CeXRlMSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbMV07Ci0JCQljc3IyLmZpZWxkLkJ5dGUyID0gcEFkLT5DdXJyZW50QWRkcmVzc1syXTsKLQkJCWNzcjIuZmllbGQuQnl0ZTMgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzNdOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0FERFJfRFcwLCBjc3IyLndvcmQpOwotCQkJY3NyMy53b3JkID0gMDsKLQkJCWNzcjMuZmllbGQuQnl0ZTQgPSBwQWQtPkN1cnJlbnRBZGRyZXNzWzRdOwotCQkJY3NyMy5maWVsZC5CeXRlNSA9IHBBZC0+Q3VycmVudEFkZHJlc3NbNV07Ci0JCQljc3IzLmZpZWxkLlUyTWVNYXNrID0gMHhmZjsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19BRERSX0RXMSwgY3NyMy53b3JkKTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwoIkUyUFJPTSBNQUM6ID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCQlQUklOVF9NQUMocEFkLT5QZXJtYW5lbnRBZGRyZXNzKSkpOwotCQl9Ci0JfQotCi0JLy8gaWYgbm90IHJldHVybiBlYXJseS4gY2F1c2UgZmFpbCBhdCBlbXVsYXRpb24uCi0JLy8gSW5pdCB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIFRYIGNoYW5uZWwgcG93ZXIKLQlSVE1QUmVhZENoYW5uZWxQd3IocEFkKTsKLQotCS8vIGlmIEUyUFJPTSB2ZXJzaW9uIG1pc21hdGNoIHdpdGggZHJpdmVyJ3MgZXhwZWN0YXRpb24sIHRoZW4gc2tpcAotCS8vIGFsbCBzdWJzZXF1ZW50IEUyUlBPTSByZXRpZXZhbCBhbmQgc2V0IGEgc3lzdGVtIGVycm9yIGJpdCB0byBub3RpZnkgR1VJCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fVkVSU0lPTl9PRkZTRVQsIFZlcnNpb24ud29yZCk7Ci0JcEFkLT5FZXByb21WZXJzaW9uID0gVmVyc2lvbi5maWVsZC5WZXJzaW9uICsgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyICogMjU2OwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogVmVyc2lvbiA9ICVkLCBGQUUgcmVsZWFzZSAjJWRcbiIsIFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVmVyc2lvbi5maWVsZC5GYWVSZWxlYXNlTnVtYmVyKSk7Ci0KLQlpZiAoVmVyc2lvbi5maWVsZC5WZXJzaW9uID4gVkFMSURfRUVQUk9NX1ZFUlNJT04pCi0JewotCQlEQkdQUklOVF9FUlIoKCJFMlBST006IFdST05HIFZFUlNJT04gMHgleCwgc2hvdWxkIGJlICVkXG4iLFZlcnNpb24uZmllbGQuVmVyc2lvbiwgVkFMSURfRUVQUk9NX1ZFUlNJT04pKTsKLQkJLypwQWQtPlN5c3RlbUVycm9yQml0bWFwIHw9IDB4MDAwMDAwMDE7Ci0KLQkJLy8gaGFyZC1jb2RlIGRlZmF1bHQgdmFsdWUgd2hlbiBubyBwcm9wZXIgRTJQUk9NIGluc3RhbGxlZAotCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7Ci0JCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsKLQotCQkvLyBEZWZhdWx0IHRoZSBjaGFubmVsIHBvd2VyCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0NIQU5ORUxTOyBpKyspCi0JCQlwQWQtPlR4UG93ZXJbaV0uUG93ZXIgPSBERUZBVUxUX1JGX1RYX1BPV0VSOwotCi0JCS8vIERlZmF1bHQgdGhlIGNoYW5uZWwgcG93ZXIKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fT0ZfMTFKQ0hBTk5FTFM7IGkrKykKLQkJCXBBZC0+VHhQb3dlcjExSltpXS5Qb3dlciA9IERFRkFVTFRfUkZfVFhfUE9XRVI7Ci0KLQkJZm9yKGkgPSAwOyBpIDwgTlVNX0VFUFJPTV9CQlBfUEFSTVM7IGkrKykKLQkJCXBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID0gMHhmZmZmOwotCQlyZXR1cm47ICAqLwotCX0KLQotCS8vIFJlYWQgQkJQIGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00gYW5kIHN0b3JlIHRvIGFycmF5KEVFUFJPTURlZmF1bHRWYWx1ZSkgaW4gcEFkCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMV9PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXSA9IHZhbHVlOwotCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTklDMl9PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXSA9IHZhbHVlOwotCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDM4LCB2YWx1ZSk7CS8vIENvdW50cnkgUmVnaW9uCi0JcEFkLT5FRVBST01EZWZhdWx0VmFsdWVbMl0gPSB2YWx1ZTsKLQotCWZvcihpID0gMDsgaSA8IDg7IGkrKykKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0JCUF9CQVNFX09GRlNFVCArIGkqMiwgdmFsdWUpOwotCQlwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpKzNdID0gdmFsdWU7Ci0JfQotCi0JLy8gV2UgaGF2ZSB0byBwYXJzZSBOSUMgY29uZmlndXJhdGlvbiAwIGF0IGhlcmUuCi0JLy8gSWYgVFNTSSBkaWQgbm90IGhhdmUgcHJlbG9hZGVkIHZhbHVlLCBpdCBzaG91bGQgcmVzZXQgdGhlIFR4QXV0b0FnYyB0byBmYWxzZQotCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZWFkIFR4QXV0b0FnYyBjb250cm9sIGJlZm9yZWhhbmQuCi0JLy8gUmVhZCBUeCBBR0MgY29udHJvbCBiaXQKLQlBbnRlbm5hLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVswXTsKLQlpZiAoQW50ZW5uYS53b3JkID09IDB4RkZGRikKLQl7Ci0jaWZkZWYgUlQzMHh4Ci0JCWlmKElTX1JUMzA5MChwQWQpfHwgSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCUFudGVubmEud29yZCA9IDA7Ci0JCQlBbnRlbm5hLmZpZWxkLlJmSWNUeXBlID0gUkZJQ18zMDIwOwotCQkJQW50ZW5uYS5maWVsZC5UeFBhdGggPSAxOwotCQkJQW50ZW5uYS5maWVsZC5SeFBhdGggPSAxOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJewotCi0JCQlBbnRlbm5hLndvcmQgPSAwOwotCQkJQW50ZW5uYS5maWVsZC5SZkljVHlwZSA9IFJGSUNfMjgyMDsKLQkJCUFudGVubmEuZmllbGQuVHhQYXRoID0gMTsKLQkJCUFudGVubmEuZmllbGQuUnhQYXRoID0gMjsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiRTJQUk9NIGVycm9yLCBoYXJkIGNvZGUgYXMgMHglMDR4XG4iLCBBbnRlbm5hLndvcmQpKTsKLQkJfQotCX0KLQotCS8vIENob29zZSB0aGUgZGVzaXJlZCBUeCZSeCBzdHJlYW0uCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAwKSB8fCAocEFkLT5Db21tb25DZmcuVHhTdHJlYW0gPiBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpCi0JCXBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID0gQW50ZW5uYS5maWVsZC5UeFBhdGg7Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID09IDApIHx8IChwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA+IEFudGVubmEuZmllbGQuUnhQYXRoKSkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID0gQW50ZW5uYS5maWVsZC5SeFBhdGg7Ci0KLQkJaWYgKChwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMjg4M19WRVJTSU9OKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLlJ4U3RyZWFtID4gMikpCi0JCXsKLQkJCS8vIG9ubHkgMiBSeCBzdHJlYW1zIGZvciBSVDI4NjAgc2VyaWVzCi0JCQlwQWQtPkNvbW1vbkNmZy5SeFN0cmVhbSA9IDI7Ci0JCX0KLQl9Ci0KLQkvLyAzKjMKLQkvLyByZWFkIHZhbHVlIGZyb20gRUVQUk9NIGFuZCBzZXQgdGhlbSB0byBDU1IxNzQgfiAxNzcgaW4gY2hhaW4wIH4gY2hhaW4yCi0JLy8geWV0IGltcGxlbWVudAotCWZvcihpPTA7IGk8MzsgaSsrKQotCXsKLQl9Ci0KLQlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKChOaWNDb25maWcyLndvcmQgJiAweDAwZmYpID09IDB4ZmYpCi0JCXsKLQkJCU5pY0NvbmZpZzIud29yZCAmPSAweGZmMDA7Ci0JCX0KLQotCQlpZiAoKE5pY0NvbmZpZzIud29yZCA+PiA4KSA9PSAweGZmKQotCQl7Ci0JCQlOaWNDb25maWcyLndvcmQgJj0gMHgwMGZmOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JaWYgKE5pY0NvbmZpZzIuZmllbGQuRHluYW1pY1R4QWdjQ29udHJvbCA9PSAxKQotCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IFRSVUU7Ci0JZWxzZQotCQlwQWQtPmJBdXRvVHhBZ2NBID0gcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwotCi0JREJHUFJJTlRfUkFXKFJUX0RFQlVHX1RSQUNFLCAoIk5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzOiBSeFBhdGggPSAlZCwgVHhQYXRoID0gJWRcbiIsIEFudGVubmEuZmllbGQuUnhQYXRoLCBBbnRlbm5hLmZpZWxkLlR4UGF0aCkpOwotCi0JLy8gU2F2ZSB0aGUgYW50ZW5uYSBmb3IgZnV0dXJlIHVzZQotCXBBZC0+QW50ZW5uYS53b3JkID0gQW50ZW5uYS53b3JkOwotCi0JLy8gU2V0IHRoZSBSZklDVHlwZSBoZXJlLCB0aGVuIHdlIGNhbiBpbml0aWFsaXplIFJGSUMgcmVsYXRlZCBvcGVyYXRpb24gY2FsbGJhY2tzCi0JcEFkLT5NbG1lLlJlYWxSeFBhdGggPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUnhQYXRoOwotCXBBZC0+UmZJY1R5cGUgPSAoVUNIQVIpIEFudGVubmEuZmllbGQuUmZJY1R5cGU7Ci0KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlSdG1wQ2hpcE9wc1JGSG9vayhwQWQpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0JLy8KLQkvLyBSZXNldCBQaHlNb2RlIGlmIHdlIGRvbid0IHN1cHBvcnQgODAyLjExYQotCS8vIE9ubHkgUkZJQ18yODUwICYgUkZJQ18yNzUwIHN1cHBvcnQgODAyLjExYQotCS8vCi0JaWYgKChBbnRlbm5hLmZpZWxkLlJmSWNUeXBlICE9IFJGSUNfMjg1MCkKLQkJJiYgKEFudGVubmEuZmllbGQuUmZJY1R5cGUgIT0gUkZJQ18yNzUwKQotCQkmJiAoQW50ZW5uYS5maWVsZC5SZkljVHlwZSAhPSBSRklDXzMwNTIpKQotCXsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUFCR19NSVhFRCkgfHwKLQkJCShwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUEpKQotCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBQkdOX01JWEVEKQl8fAotCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkJfHwKLQkJCQkgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQUdOX01JWEVEKQl8fAotCQkJCSAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzVHKSkKLQkJCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSBQSFlfMTFCR05fTUlYRUQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JfQotCi0JLy8gUmVhZCBUU1NJIHJlZmVyZW5jZSBhbmQgVFNTSSBib3VuZGFyeSBmb3IgdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uLiBUaGlzIGlzIHVnbHkKLQkvLyAwLiAxMWIvZwotCXsKLQkJLyogdGhlc2UgYXJlIHRlbXBhdHVyZSByZWZlcmVuY2UgdmFsdWUgKDB4MDAgfiAweEZFKQotCQkgICBleDogMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKLQkJICAgVHNzaVBsdXNCb3VuZGFyeUcgWzRdIFszXSBbMl0gWzFdIFswXSAoc21hbGxlcikgKwotCQkgICBUc3NpTWludXNCb3VuZGFyeUdbMF0gWzFdIFsyXSBbM10gWzRdIChsYXJnZXIpICovCi0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg2RSwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzRdID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3MCwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzFdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3MiwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVJlZkcgICA9IFBvd2VyLmZpZWxkLkJ5dGUwOyAvKiByZWZlcmVuY2UgdmFsdWUgWzBdICovCi0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMV0gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDc0LCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1syXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlHWzNdID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgMHg3NiwgUG93ZXIud29yZCk7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbNF0gPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5UeEFnY1N0ZXBHID0gUG93ZXIuZmllbGQuQnl0ZTE7Ci0JCXBBZC0+VHhBZ2NDb21wZW5zYXRlRyA9IDA7Ci0JCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdID0gcEFkLT5Uc3NpUmVmRzsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5R1swXSAgPSBwQWQtPlRzc2lSZWZHOwotCi0JCS8vIERpc2FibGUgVHhBZ2MgaWYgdGhlIGJhc2VkIHZhbHVlIGlzIG5vdCByaWdodAotCQlpZiAocEFkLT5Uc3NpUmVmRyA9PSAweGZmKQotCQkJcEFkLT5iQXV0b1R4QWdjRyA9IEZBTFNFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRTJQUk9NOiBHIFRzc2lbLTQgLi4gKzRdID0gJWQgJWQgJWQgJWQgLSAlZCAtJWQgJWQgJWQgJWQsIHN0ZXA9JWQsIHR1bmluZz0lZFxuIiwKLQkJCXBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzRdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5R1szXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUdbMl0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzFdLAotCQkJcEFkLT5Uc3NpUmVmRywKLQkJCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMV0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMl0sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbM10sIHBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbNF0sCi0JCQlwQWQtPlR4QWdjU3RlcEcsIHBBZC0+YkF1dG9UeEFnY0cpKTsKLQl9Ci0JLy8gMS4gMTFhCi0JewotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4RDQsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVs0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVszXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4RDYsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsyXSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4RDgsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lSZWZBICAgPSBQb3dlci5maWVsZC5CeXRlMDsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsxXSA9IFBvd2VyLmZpZWxkLkJ5dGUxOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4REEsIFBvd2VyLndvcmQpOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzJdID0gUG93ZXIuZmllbGQuQnl0ZTA7Ci0JCXBBZC0+VHNzaVBsdXNCb3VuZGFyeUFbM10gPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweERDLCBQb3dlci53b3JkKTsKLQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVs0XSA9IFBvd2VyLmZpZWxkLkJ5dGUwOwotCQlwQWQtPlR4QWdjU3RlcEEgPSBQb3dlci5maWVsZC5CeXRlMTsKLQkJcEFkLT5UeEFnY0NvbXBlbnNhdGVBID0gMDsKLQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMF0gPSBwQWQtPlRzc2lSZWZBOwotCQlwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdICA9IHBBZC0+VHNzaVJlZkE7Ci0KLQkJLy8gRGlzYWJsZSBUeEFnYyBpZiB0aGUgYmFzZWQgdmFsdWUgaXMgbm90IHJpZ2h0Ci0JCWlmIChwQWQtPlRzc2lSZWZBID09IDB4ZmYpCi0JCQlwQWQtPmJBdXRvVHhBZ2NBID0gRkFMU0U7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJFMlBST006IEEgVHNzaVstNCAuLiArNF0gPSAlZCAlZCAlZCAlZCAtICVkIC0lZCAlZCAlZCAlZCwgc3RlcD0lZCwgdHVuaW5nPSVkXG4iLAotCQkJcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbNF0sIHBBZC0+VHNzaU1pbnVzQm91bmRhcnlBWzNdLCBwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVsyXSwgcEFkLT5Uc3NpTWludXNCb3VuZGFyeUFbMV0sCi0JCQlwQWQtPlRzc2lSZWZBLAotCQkJcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsxXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVsyXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVszXSwgcEFkLT5Uc3NpUGx1c0JvdW5kYXJ5QVs0XSwKLQkJCXBBZC0+VHhBZ2NTdGVwQSwgcEFkLT5iQXV0b1R4QWdjQSkpOwotCX0KLQlwQWQtPkJicFJzc2lUb0RibURlbHRhID0gMHgwOwotCi0JLy8gUmVhZCBmcmVxdWVuY3kgb2Zmc2V0IHNldHRpbmcgZm9yIFJGCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fRlJFUV9PRkZTRVQsIHZhbHVlKTsKLQlpZiAoKHZhbHVlICYgMHgwMEZGKSAhPSAweDAwRkYpCi0JCXBBZC0+UmZGcmVxT2Zmc2V0ID0gKFVMT05HKSAodmFsdWUgJiAweDAwRkYpOwotCWVsc2UKLQkJcEFkLT5SZkZyZXFPZmZzZXQgPSAwOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkUyUFJPTTogUkYgRnJlcU9mZnNldD0weCVseCBcbiIsIHBBZC0+UmZGcmVxT2Zmc2V0KSk7Ci0KLQkvL0NvdW50cnlSZWdpb24gYnl0ZSBvZmZzZXQgKDM4aCkKLQl2YWx1ZSA9IHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlWzJdID4+IDg7CQkvLyAyLjRHIGJhbmQKLQl2YWx1ZTIgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsyXSAmIDB4MDBGRjsJLy8gNUcgYmFuZAotCi0JaWYgKCh2YWx1ZSA8PSBSRUdJT05fTUFYSU1VTV9CR19CQU5EKSAmJiAodmFsdWUyIDw9IFJFR0lPTl9NQVhJTVVNX0FfQkFORCkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uID0gKChVQ0hBUikgdmFsdWUpIHwgMHg4MDsKLQkJcEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kID0gKChVQ0hBUikgdmFsdWUyKSB8IDB4ODA7Ci0JCVRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPSAweGZmOwotCQlSVE1QU2V0UGh5TW9kZShwQWQsIFRtcFBoeSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCVNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JfQotCi0JLy8KLQkvLyBHZXQgUlNTSSBPZmZzZXQgb24gRUVQUk9NIDB4OUFoICYgMHg5Q2guCi0JLy8gVGhlIHZhbGlkIHZhbHVlIGFyZSAoLTEwIH4gMTApCi0JLy8KLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCwgdmFsdWUpOwotCXBBZC0+QkdSc3NpT2Zmc2V0MCA9IHZhbHVlICYgMHgwMGZmOwotCXBBZC0+QkdSc3NpT2Zmc2V0MSA9ICh2YWx1ZSA+PiA4KTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCsyLCB2YWx1ZSk7Ci0JcEFkLT5CR1Jzc2lPZmZzZXQyID0gdmFsdWUgJiAweDAwZmY7Ci0JcEFkLT5BTE5BR2FpbjEgPSAodmFsdWUgPj4gOCk7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTE5BX09GRlNFVCwgdmFsdWUpOwotCXBBZC0+QkxOQUdhaW4gPSB2YWx1ZSAmIDB4MDBmZjsKLQlwQWQtPkFMTkFHYWluMCA9ICh2YWx1ZSA+PiA4KTsKLQotCS8vIFZhbGlkYXRlIDExYi9nIFJTU0lfMCBvZmZzZXQuCi0JaWYgKChwQWQtPkJHUnNzaU9mZnNldDAgPCAtMTApIHx8IChwQWQtPkJHUnNzaU9mZnNldDAgPiAxMCkpCi0JCXBBZC0+QkdSc3NpT2Zmc2V0MCA9IDA7Ci0KLQkvLyBWYWxpZGF0ZSAxMWIvZyBSU1NJXzEgb2Zmc2V0LgotCWlmICgocEFkLT5CR1Jzc2lPZmZzZXQxIDwgLTEwKSB8fCAocEFkLT5CR1Jzc2lPZmZzZXQxID4gMTApKQotCQlwQWQtPkJHUnNzaU9mZnNldDEgPSAwOwotCi0JLy8gVmFsaWRhdGUgMTFiL2cgUlNTSV8yIG9mZnNldC4KLQlpZiAoKHBBZC0+QkdSc3NpT2Zmc2V0MiA8IC0xMCkgfHwgKHBBZC0+QkdSc3NpT2Zmc2V0MiA+IDEwKSkKLQkJcEFkLT5CR1Jzc2lPZmZzZXQyID0gMDsKLQotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1JTU0lfQV9PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkFSc3NpT2Zmc2V0MCA9IHZhbHVlICYgMHgwMGZmOwotCXBBZC0+QVJzc2lPZmZzZXQxID0gKHZhbHVlID4+IDgpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgKEVFUFJPTV9SU1NJX0FfT0ZGU0VUKzIpLCB2YWx1ZSk7Ci0JcEFkLT5BUnNzaU9mZnNldDIgPSB2YWx1ZSAmIDB4MDBmZjsKLQlwQWQtPkFMTkFHYWluMiA9ICh2YWx1ZSA+PiA4KTsKLQotCWlmICgoKFVDSEFSKXBBZC0+QUxOQUdhaW4xID09IDB4RkYpIHx8IChwQWQtPkFMTkFHYWluMSA9PSAweDAwKSkKLQkJcEFkLT5BTE5BR2FpbjEgPSBwQWQtPkFMTkFHYWluMDsKLQlpZiAoKChVQ0hBUilwQWQtPkFMTkFHYWluMiA9PSAweEZGKSB8fCAocEFkLT5BTE5BR2FpbjIgPT0gMHgwMCkpCi0JCXBBZC0+QUxOQUdhaW4yID0gcEFkLT5BTE5BR2FpbjA7Ci0KLQkvLyBWYWxpZGF0ZSAxMWEgUlNTSV8wIG9mZnNldC4KLQlpZiAoKHBBZC0+QVJzc2lPZmZzZXQwIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDAgPiAxMCkpCi0JCXBBZC0+QVJzc2lPZmZzZXQwID0gMDsKLQotCS8vIFZhbGlkYXRlIDExYSBSU1NJXzEgb2Zmc2V0LgotCWlmICgocEFkLT5BUnNzaU9mZnNldDEgPCAtMTApIHx8IChwQWQtPkFSc3NpT2Zmc2V0MSA+IDEwKSkKLQkJcEFkLT5BUnNzaU9mZnNldDEgPSAwOwotCi0JLy9WYWxpZGF0ZSAxMWEgUlNTSV8yIG9mZnNldC4KLQlpZiAoKHBBZC0+QVJzc2lPZmZzZXQyIDwgLTEwKSB8fCAocEFkLT5BUnNzaU9mZnNldDIgPiAxMCkpCi0JCXBBZC0+QVJzc2lPZmZzZXQyID0gMDsKLQotI2lmZGVmIFJUMzB4eAotCS8vCi0JLy8gR2V0IFRYIG1peGVyIGdhaW4gc2V0dGluZwotCS8vIDB4ZmYgYXJlIGludmFsaWQgdmFsdWUKLQkvLyBOb3RlOiBSVDMweFggZGVmYXVsdCB2YWx1ZSBpcyAweDAwIGFuZCB3aWxsIHByb2dyYW0gdG8gUkZfUjE3IG9ubHkgd2hlbiB0aGlzIHZhbHVlIGlzIG5vdCB6ZXJvLgotCS8vICAgICAgIFJUMzU5WCBkZWZhdWx0IHZhbHVlIGlzIDB4MDIKLQkvLwotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX1RYTUlYRVJfR0FJTl8yXzRHLCB2YWx1ZSk7Ci0JCXBBZC0+VHhNaXhlckdhaW4yNEcgPSAwOwotCQl2YWx1ZSAmPSAweDAwZmY7Ci0JCWlmICh2YWx1ZSAhPSAweGZmKQotCQl7Ci0JCQl2YWx1ZSAmPSAweDA3OwotCQkJcEFkLT5UeE1peGVyR2FpbjI0RyA9IChVQ0hBUil2YWx1ZTsKLQkJfQotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCS8vCi0JLy8gR2V0IExFRCBTZXR0aW5nLgotCS8vCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDNhLCB2YWx1ZSk7Ci0JcEFkLT5MZWRDbnRsLndvcmQgPSAodmFsdWU+PjgpOwotCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZCwgRUVQUk9NX0xFRDFfT0ZGU0VULCB2YWx1ZSk7Ci0JcEFkLT5MZWQxID0gdmFsdWU7Ci0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCBFRVBST01fTEVEMl9PRkZTRVQsIHZhbHVlKTsKLQlwQWQtPkxlZDIgPSB2YWx1ZTsKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MRUQzX09GRlNFVCwgdmFsdWUpOwotCXBBZC0+TGVkMyA9IHZhbHVlOwotCi0JUlRNUFJlYWRUeFB3clBlclJhdGUocEFkKTsKLQotI2lmZGVmIFNJTkdMRV9TS1UKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9ERUZJTkVfTUFYX1RYUFdSLCBwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3cik7Ci0jZW5kaWYgLy8gU0lOR0xFX1NLVSAvLwotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0JUnRtcEVmdXNlU3VwcG9ydENoZWNrKHBBZCk7Ci0jZW5kaWYgLy8gUlRNUF9FRlVTRV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8LS0gTklDUmVhZEVFUFJPTVBhcmFtZXRlcnNcbiIpKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBFRVBST00KLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVSU5UMzIJCQkJCWRhdGEgPSAwOwotCVVDSEFSCUJCUFIxID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQlVU0hPUlQJCQkJCWk7Ci0vLwlFRVBST01fQU5URU5OQV9TVFJVQwlBbnRlbm5hOwotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOwotCVVDSEFSCUJCUFIzID0gMDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBOSUNJbml0QXNpY0Zyb21FRVBST01cbiIpKTsKLQlmb3IoaSA9IDM7IGkgPCBOVU1fRUVQUk9NX0JCUF9QQVJNUzsgaSsrKQotCXsKLQkJVUNIQVIgQmJwUmVnSWR4LCBCYnBWYWx1ZTsKLQotCQlpZiAoKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDB4RkZGRikgJiYgKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldICE9IDApKQotCQl7Ci0JCQlCYnBSZWdJZHggPSAoVUNIQVIpKHBBZC0+RUVQUk9NRGVmYXVsdFZhbHVlW2ldID4+IDgpOwotCQkJQmJwVmFsdWUgID0gKFVDSEFSKShwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVtpXSAmIDB4ZmYpOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJicFJlZ0lkeCwgQmJwVmFsdWUpOwotCQl9Ci0JfQotCi0KLQlOaWNDb25maWcyLndvcmQgPSBwQWQtPkVFUFJPTURlZmF1bHRWYWx1ZVsxXTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCWlmICgoTmljQ29uZmlnMi53b3JkICYgMHgwMGZmKSA9PSAweGZmKQotCQl7Ci0JCQlOaWNDb25maWcyLndvcmQgJj0gMHhmZjAwOwotCQl9Ci0KLQkJaWYgKChOaWNDb25maWcyLndvcmQgPj4gOCkgPT0gMHhmZikKLQkJewotCQkJTmljQ29uZmlnMi53b3JkICY9IDB4MDBmZjsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIFNhdmUgdGhlIGFudGVubmEgZm9yIGZ1dHVyZSB1c2UKLQlwQWQtPk5pY0NvbmZpZzIud29yZCA9IE5pY0NvbmZpZzIud29yZDsKLQotI2lmZGVmIFJUMzB4eAotCS8vIHNldCBkZWZhdWx0IGFudGVubmEgYXMgbWFpbgotCWlmIChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkKLQkJQXNpY1NldFJ4QW50KHBBZCwgcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCk7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQkvLwotCS8vIFNlbmQgTEVEIFNldHRpbmcgdG8gTUNVLgotCS8vCi0JaWYgKHBBZC0+TGVkQ250bC53b3JkID09IDB4RkYpCi0JewotCQlwQWQtPkxlZENudGwud29yZCA9IDB4MDE7Ci0JCXBBZC0+TGVkMSA9IDB4NTU1NTsKLQkJcEFkLT5MZWQyID0gMHgyMjIxOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCXBBZC0+TGVkMyA9IDB4QTlGODsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl9Ci0KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTIsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDEsIChVQ0hBUikocEFkLT5MZWQxID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTMsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDIsIChVQ0hBUikocEFkLT5MZWQyID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTQsIDB4ZmYsIChVQ0hBUilwQWQtPkxlZDMsIChVQ0hBUikocEFkLT5MZWQzID4+IDgpKTsKLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTEsIDB4ZmYsIDAsIHBBZC0+TGVkQ250bC5maWVsZC5Qb2xhcml0eSk7Ci0KLQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMHhGRjsKLQlSVE1QU2V0U2lnbmFsTEVEKHBBZCwgLTEwMCk7CS8vIEZvcmNlIHNpZ25hbCBzdHJlbmd0aCBMZWQgdG8gYmUgdHVybmVkIG9mZiwgYmVmb3JlIGxpbmsgdXAKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBSZWFkIEhhcmR3YXJlIGNvbnRyb2xsZWQgUmFkaW8gc3RhdGUgZW5hYmxlIGJpdAotCQlpZiAoTmljQ29uZmlnMi5maWVsZC5IYXJkd2FyZVJhZGlvQ29udHJvbCA9PSAxKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IFRSVUU7Ci0KLQkJCS8vIFJlYWQgR1BJTyBwaW4yIGFzIEhhcmR3YXJlIGNvbnRyb2xsZWQgcmFkaW8gc3RhdGUKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgR1BJT19DVFJMX0NGRywgJmRhdGEpOwotCQkJaWYgKChkYXRhICYgMHgwNCkgPT0gMCkKLQkJCXsKLQkJCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyA9IEZBTFNFOwotCQkJCXBBZC0+U3RhQ2ZnLmJSYWRpbyA9IEZBTFNFOwotLy8JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4MDAwMDE4MTgpOwotCQkJCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJcEFkLT5TdGFDZmcuYkhhcmR3YXJlUmFkaW8gPSBGQUxTRTsKLQotCQlpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IEZBTFNFKQotCQl7Ci0JCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09GRik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QU2V0TEVEKHBBZCwgTEVEX1JBRElPX09OKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNpZmRlZiBSVDMwOTAKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgUG93ZXJSYWRpb09mZkNJRCwgMHhmZiwgMHgwMik7Ci0JCQlBc2ljQ2hlY2tDb21tYW5PayhwQWQsIFBvd2VyUmFkaW9PZmZDSUQpOwotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmbmRlZiBSVDMwOTAKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMCwgMHhmZiwgMHhmZiwgMHgwMik7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4MzEsIFBvd2VyV2FrZUNJRCwgMHgwMCwgMHgwMCk7Ci0JCQkvLyAyLTEuIHdhaXQgY29tbWFuZCBvay4KLQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJfQotCX0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNpZmRlZiBSVDMweHgKLQkJaWYgKElTX1JUMzA5MChwQWQpfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCVJUTVBfQ0hJUF9PUCAqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotCQkJaWYgKHBDaGlwT3BzLT5Bc2ljUmV2ZXJzZVJmRnJvbVNsZWVwTW9kZSkKLQkJCQlwQ2hpcE9wcy0+QXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUocEFkKTsKLQkJfQotCQkvLyAzMDkwIE1DVSBXYWtldXAgY29tbWFuZCBuZWVkcyBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlLgotCQkvLyBCZWZvcmUgc3RhYmxlLCBkb24ndCBpc3N1ZSBvdGhlciBNQ1UgY29tbWFuZCB0byBwcmV2ZW50IGZyb20gZmlybXdhcmUgZXJyb3IuCi0KLQkJaWYgKChJU19SVDMwOTAocEFkKXx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkJCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiJXM6OiVkLHJlbGVhc2UgTWN1IExvY2tcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKSk7Ci0JCQlSVE1QX1NFTV9MT0NLKCZwQWQtPk1jdUNtZExvY2spOwotCQkJcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci0JCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWN1Q21kTG9jayk7Ci0JCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIFR1cm4gb2ZmIHBhdGNoaW5nIGZvciBjYXJkYnVzIGNvbnRyb2xsZXIKLQlpZiAoTmljQ29uZmlnMi5maWVsZC5DYXJkYnVzQWNjZWxlcmF0aW9uID09IDEpCi0JewotLy8JCXBBZC0+YlRlc3QxID0gVFJVRTsKLQl9Ci0KLQlpZiAoTmljQ29uZmlnMi5maWVsZC5EeW5hbWljVHhBZ2NDb250cm9sID09IDEpCi0JCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gVFJVRTsKLQllbHNlCi0JCXBBZC0+YkF1dG9UeEFnY0EgPSBwQWQtPmJBdXRvVHhBZ2NHID0gRkFMU0U7Ci0JLy8KLQkvLyBTaW5jZSBCQlAgaGFzIGJlZW4gcHJvZ2FtZWQsIHRvIG1ha2Ugc3VyZSBCQlAgc2V0dGluZyB3aWxsIGJlCi0JLy8gdXBhdGUgaW5zaWRlIG9mIEFzaWNBbnRlbm5hU2VsZWN0LCBzbyByZXNldCB0byBVTktOT1dOX0JBTkQhIQotCS8vCi0JcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOwotCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQkJQUjMpOwotCUJCUFIzICY9ICh+MHgxOCk7Ci0JaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAzKQotCXsKLQkJQkJQUjMgfD0gKDB4MTApOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMikKLQl7Ci0JCUJCUFIzIHw9ICgweDgpOwotCX0KLQllbHNlIGlmKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQl7Ci0JCUJCUFIzIHw9ICgweDApOwotCX0KLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCQlBSMyk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJLy8gSGFuZGxlIHRoZSBkaWZmZXJlbmNlIHdoZW4gMVQKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQkJQUjEpOwotCQlpZihwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJQkJQUjEgJj0gKH4weDE4KTsKLQkJfQotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCBCQlBSMSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVXNlIEh3IFJhZGlvIENvbnRyb2wgUGluPSVkOyBpZiB1c2VkIFBpbj0lZDtcbiIsCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLmJIYXJkd2FyZVJhZGlvLCBwQWQtPkNvbW1vbkNmZy5iSGFyZHdhcmVSYWRpbykpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhQYXRoID0gJWQsIFJ4UGF0aCA9ICVkLCBSRklDPSVkLCBQb2xhcitMRUQgbW9kZT0leFxuIiwKLQkJCQlwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLCBwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoLAotCQkJCXBBZC0+UmZJY1R5cGUsIHBBZC0+TGVkQ250bC53b3JkKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRBc2ljRnJvbUVFUFJPTVxuIikpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJSW5pdGlhbGl6ZSBOSUMgaGFyZHdhcmUKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQWRhcHRlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgIEJPT0xFQU4gICAgYkhhcmRSZXNldCkKLXsKLQlORElTX1NUQVRVUyAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDCUdsb0NmZzsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlVSU5UMzIJCQlWYWx1ZTsKLQlERUxBWV9JTlRfQ0ZHX1NUUlVDCUludENmZzsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLS8vCUlOVF9NQVNLX0NTUl9TVFJVQwkJSW50TWFzazsKLQlVTE9ORwlpID0wLCBqPTA7Ci0JQUNfVFhPUF9DU1IwX1NUUlVDCWNzcjA7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSW5pdGlhbGl6ZUFkYXB0ZXJcbiIpKTsKLQotCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6Ci1yZXRyeToKLQlpID0gMDsKLQlkbwotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwotCQlpZiAoKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kgPT0gMCkgICYmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5ID09IDApKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQkJaSsrOwotCX13aGlsZSAoIGk8MTAwKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT0gRE1BIG9mZnNldCAweDIwOCA9IDB4JXhcbiIsIEdsb0NmZy53b3JkKSk7Ci0JR2xvQ2ZnLndvcmQgJj0gMHhmZjA7Ci0JR2xvQ2ZnLmZpZWxkLkVuVFhXcml0ZUJhY2tERE9ORSA9MTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCBHbG9DZmcud29yZCk7Ci0KLQkvLyBSZWNvcmQgSFcgQmVhY29uIG9mZnNldAotCXBBZC0+QmVhY29uT2Zmc2V0WzBdID0gSFdfQkVBQ09OX0JBU0UwOwotCXBBZC0+QmVhY29uT2Zmc2V0WzFdID0gSFdfQkVBQ09OX0JBU0UxOwotCXBBZC0+QmVhY29uT2Zmc2V0WzJdID0gSFdfQkVBQ09OX0JBU0UyOwotCXBBZC0+QmVhY29uT2Zmc2V0WzNdID0gSFdfQkVBQ09OX0JBU0UzOwotCXBBZC0+QmVhY29uT2Zmc2V0WzRdID0gSFdfQkVBQ09OX0JBU0U0OwotCXBBZC0+QmVhY29uT2Zmc2V0WzVdID0gSFdfQkVBQ09OX0JBU0U1OwotCXBBZC0+QmVhY29uT2Zmc2V0WzZdID0gSFdfQkVBQ09OX0JBU0U2OwotCXBBZC0+QmVhY29uT2Zmc2V0WzddID0gSFdfQkVBQ09OX0JBU0U3OwotCi0JLy8KLQkvLyB3cml0ZSBhbGwgc2hhcmVkIFJpbmcncyBiYXNlIGFkZHJlc3MgaW50byBBU0lDCi0JLy8KLQotCS8vIGFzaWMgc2ltdWxhdGlvbiBzZXF1ZW5jZSBwdXQgdGhpcyBhaGVhZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZS4KLQkvLyBwYmYgaGFyZHdhcmUgcmVzZXQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBXUERNQV9SU1RfSURYLCAweDEwMDNmKTsJLy8gMHgxMDAwMCBmb3IgcmVzZXQgcngsIDB4M2YgcmVzZXRzIGFsbCA2IHR4IHJpbmdzLgotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMWYpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFBCRl9TWVNfQ1RSTCwgMHhlMDApOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gSW5pdGlhbHplIEFTSUMgZm9yIFRYICYgUnggb3BlcmF0aW9uCi0JaWYgKE5JQ0luaXRpYWxpemVBc2ljKHBBZCAsIGJIYXJkUmVzZXQpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlpZiAoaisrID09IDApCi0JCXsKLQkJCU5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCQkJZ290byByZXRyeTsKLQkJfQotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCS8vIFdyaXRlIEFDX0JLIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX0JLXS5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMSwgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjEgOiAweCV4XG4iLCBWYWx1ZSkpOwotCi0JLy8gV3JpdGUgQUNfQkUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbMF0uQWxsb2NQYSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFIwLCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSMCA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0KLQkvLyBXcml0ZSBBQ19WSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+VHhSaW5nW1FJRF9BQ19WSV0uQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjIsIFZhbHVlKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFIyIDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIFdyaXRlIEFDX1ZPIGJhc2UgYWRkcmVzcyByZWdpc3RlcgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0FDX1ZPXS5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBU0VfUFRSMywgVmFsdWUpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBUWF9CQVNFX1BUUjMgOiAweCV4XG4iLCBWYWx1ZSkpOwotCi0JLy8gV3JpdGUgSENDQSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIKLQkvKgotCVZhbHVlID0gUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3cocEFkLT5UeFJpbmdbUUlEX0hDQ0FdLkNlbGxbMF0uQWxsb2NQYSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQkFTRV9QVFI0LCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFRYX0JBU0VfUFRSNCA6IDB4JXhcbiIsIFZhbHVlKSk7Ci0JKi8KLQotCS8vIFdyaXRlIE1HTVRfQkFTRV9DU1IgcmVnaXN0ZXIKLQlWYWx1ZSA9IFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzTG93KHBBZC0+TWdtdFJpbmcuQ2VsbFswXS5BbGxvY1BhKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9CQVNFX1BUUjUsIFZhbHVlKTsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gVFhfQkFTRV9QVFI1IDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIFdyaXRlIFJYX0JBU0VfQ1NSIHJlZ2lzdGVyCi0JVmFsdWUgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwQWQtPlJ4UmluZy5DZWxsWzBdLkFsbG9jUGEpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0JBU0VfUFRSLCBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFJYX0JBU0VfUFRSIDogMHgleFxuIiwgVmFsdWUpKTsKLQotCS8vIEluaXQgUlggUmluZyBpbmRleCBwb2ludGVyCi0JcEFkLT5SeFJpbmcuUnhTd1JlYWRJZHggPSAwOwotCXBBZC0+UnhSaW5nLlJ4Q3B1SWR4ID0gUlhfUklOR19TSVpFLTE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgUlhfQ1JYX0lEWCwgcEFkLT5SeFJpbmcuUnhDcHVJZHgpOwotCi0JLy8gSW5pdCBUWCByaW5ncyBpbmRleCBwb2ludGVyCi0JewotCQlmb3IgKGk9MDsgaTxOVU1fT0ZfVFhfUklORzsgaSsrKQotCQl7Ci0JCQlwQWQtPlR4UmluZ1tpXS5UeFN3RnJlZUlkeCA9IDA7Ci0JCQlwQWQtPlR4UmluZ1tpXS5UeENwdUlkeCA9IDA7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCAoVFhfQ1RYX0lEWDAgKyBpICogMHgxMCkgLCAgcEFkLT5UeFJpbmdbaV0uVHhDcHVJZHgpOwotCQl9Ci0JfQotCi0JLy8gaW5pdCBNR01UIHJpbmcgaW5kZXggcG9pbnRlcgotCXBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggPSAwOwotCXBBZC0+TWdtdFJpbmcuVHhDcHVJZHggPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRDVFhfSURYLCAgcEFkLT5NZ210UmluZy5UeENwdUlkeCk7Ci0KLQkvLwotCS8vIHNldCBlYWNoIFJpbmcncyBTSVpFICBpbnRvIEFTSUMuIERlc2NyaXB0b3IgU2l6ZSBpcyBmaXhlZCBieSBkZXNpZ24uCi0JLy8KLQotCS8vIFdyaXRlIFRYX1JJTkdfQ1NSMCByZWdpc3RlcgotCVZhbHVlID0gVFhfUklOR19TSVpFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQwLCBWYWx1ZSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDEsIFZhbHVlKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9NQVhfQ05UMiwgVmFsdWUpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01BWF9DTlQzLCBWYWx1ZSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfTUFYX0NOVDQsIFZhbHVlKTsKLQlWYWx1ZSA9IE1HTVRfUklOR19TSVpFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX01HTVRNQVhfQ05ULCBWYWx1ZSk7Ci0KLQkvLyBXcml0ZSBSWF9SSU5HX0NTUiByZWdpc3RlcgotCVZhbHVlID0gUlhfUklOR19TSVpFOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX01BWF9DTlQsIFZhbHVlKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0JLy8gV01NIHBhcmFtZXRlcgotCWNzcjAud29yZCA9IDA7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV01NX1RYT1AwX0NGRywgY3NyMC53b3JkKTsKLQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCKQotCXsKLQkJY3NyMC5maWVsZC5BYzBUeG9wID0gMTkyOwkvLyBBQ19WSTogMTkyKjMydXMgfj0gNm1zCi0JCWNzcjAuZmllbGQuQWMxVHhvcCA9IDk2OwkvLyBBQ19WTzogOTYqMzJ1cyAgfj0gM21zCi0JfQotCWVsc2UKLQl7Ci0JCWNzcjAuZmllbGQuQWMwVHhvcCA9IDk2OwkvLyBBQ19WSTogOTYqMzJ1cyB+PSAzbXMKLQkJY3NyMC5maWVsZC5BYzFUeG9wID0gNDg7CS8vIEFDX1ZPOiA0OCozMnVzIH49IDEuNW1zCi0JfQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdNTV9UWE9QMV9DRkcsIGNzcjAud29yZCk7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCS8vIDMuIFNldCBETUEgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZXhjZXB0IFRYX0RNQV9FTiBhbmQgUlhfRE1BX0VOIGJpdHM6Ci0JaSA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgV1BETUFfR0xPX0NGRywgJkdsb0NmZy53b3JkKTsKLQkJaWYgKChHbG9DZmcuZmllbGQuVHhETUFCdXN5ID09IDApICAmJiAoR2xvQ2ZnLmZpZWxkLlJ4RE1BQnVzeSA9PSAwKSkKLQkJCWJyZWFrOwotCi0JCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9d2hpbGUgKCBpIDwgMTAwKTsKLQotCUdsb0NmZy53b3JkICY9IDB4ZmYwOwotCUdsb0NmZy5maWVsZC5FblRYV3JpdGVCYWNrRERPTkUgPTE7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgV1BETUFfR0xPX0NGRywgR2xvQ2ZnLndvcmQpOwotCi0JSW50Q2ZnLndvcmQgPSAwOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIERFTEFZX0lOVF9DRkcsIEludENmZy53b3JkKTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0JLy8gcmVzZXQgYWN0aW9uCi0JLy8gTG9hZCBmaXJtd2FyZQotCS8vICBTdGF0dXMgPSBOSUNMb2FkRmlybXdhcmUocEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBOSUNJbml0aWFsaXplQWRhcHRlclxuIikpOwotCXJldHVybiBTdGF0dXM7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0aWFsaXplIEFTSUMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUwlOSUNJbml0aWFsaXplQXNpYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgQk9PTEVBTgkJYkhhcmRSZXNldCkKLXsKLQlVTE9ORwkJCUluZGV4ID0gMDsKLQlVQ0hBUgkJCVIwID0gMHhmZjsKLQlVSU5UMzIJCQlNYWNDc3IxMiA9IDAsIENvdW50ZXIgPSAwOwotI2lmZGVmIFJUMzB4eAotCVVDSEFSCQkJYmJwcmVnPTA7Ci0JVUNIQVIJCQlSRlZhbHVlPTA7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JVVNIT1JUCQkJS2V5SWR4OwotCUlOVAkJCQlpLGFwaWR4OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IE5JQ0luaXRpYWxpemVBc2ljXG4iKSk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgzKTsJLy8gVG8gZml4IGRyaXZlciBkaXNhYmxlL2VuYWJsZSBoYW5nIGlzc3VlIHdoZW4gcmFkaW8gb2ZmCi0JaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgMHgzKTsKLQl9Ci0JZWxzZQotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MSk7Ci0KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7Ci0JLy8gSW5pdGlhbGl6ZSBNQUMgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE5VTV9NQUNfUkVHX1BBUk1TOyBJbmRleCsrKQotCXsKLSNpZmRlZiBSVDMweHgKLQkJaWYgKChNQUNSZWdUYWJsZVtJbmRleF0uUmVnaXN0ZXIgPT0gVFhfU1dfQ0ZHMCkgJiYgKCBJU19SVDMwOTAocEFkKSB8fCAgSVNfUlQzMzkwKHBBZCkpKQotCQl7Ci0JCQlNQUNSZWdUYWJsZVtJbmRleF0uVmFsdWUgPSAweDAwMDAwNDAwOwotCQl9Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBOVU1fU1RBX01BQ19SRUdfUEFSTVM7IEluZGV4KyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNUQU1BQ1JlZ1RhYmxlW0luZGV4XS5SZWdpc3RlciwgU1RBTUFDUmVnVGFibGVbSW5kZXhdLlZhbHVlKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0jaWZkZWYgUlQzMHh4Ci0JLy8gSW5pdGlhbGl6ZSBSVDMwNzAgc2VyaWFsIE1BQyByZWdpc3RlcnMgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gUlQyODcwIHNlcmlhbAotCWlmIChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKXx8SVNfUlQzMzkwKHBBZCkpCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcxLCAwKTsKLQotCQkvLyBSVDMwNzEgdmVyc2lvbiBFIGhhcyBmaXhlZCB0aGlzIGlzc3VlCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA8IDB4MDIxMSkKLQkJewotCQkJaWYgKHBBZC0+TmljQ29uZmlnMi5maWVsZC5EQUNUZXN0Qml0ID09IDEpCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgyQyk7CS8vIFRvIGZpeCB0aHJvdWdocHV0IGRyb3AgZHJhc3RpY2FsbHkKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAweDBGKTsJLy8gVG8gZml4IHRocm91Z2hwdXQgZHJvcCBkcmFzdGljYWxseQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfU1dfQ0ZHMiwgMHgwKTsKLQkJfQotCX0KLQllbHNlIGlmIChJU19SVDMwNzAocEFkKSkKLQl7Ci0JCWlmICgoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPCAweDAyMDEpKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcxLCAwKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1NXX0NGRzIsIDB4MkMpOwkvLyBUbyBmaXggdGhyb3VnaHB1dCBkcm9wIGRyYXN0aWNhbGx5Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9TV19DRkcyLCAwKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCS8vCi0JLy8gQmVmb3JlIHByb2dyYW0gQkJQLCB3ZSBuZWVkIHRvIHdhaXQgQkJQL1JGIGdldCB3YWtlIHVwLgotCS8vCi0JSW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TVEFUVVNfQ0ZHLCAmTWFjQ3NyMTIpOwotCi0JCWlmICgoTWFjQ3NyMTIgJiAweDAzKSA9PSAwKQkvLyBpZiBCQi5SRiBpcyBzdGFibGUKLQkJCWJyZWFrOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNoZWNrIE1BQ19TVEFUVVNfQ0ZHICA9IEJ1c3kgPSAleFxuIiwgTWFjQ3NyMTIpKTsKLQkJUlRNUHVzZWNEZWxheSgxMDAwKTsKLQl9IHdoaWxlIChJbmRleCsrIDwgMTAwKTsKLQotCS8vIFRoZSBjb21tYW5kcyB0byBmaXJtd2FyZSBzaG91bGQgYmUgYWZ0ZXIgdGhlc2UgY29tbWFuZHMsIHRoZXNlIGNvbW1hbmRzIHdpbGwgaW5pdCBmaXJtd2FyZQotCS8vIFBDSSBhbmQgVVNCIGFyZSBub3QgdGhlIHNhbWUgYmVjYXVzZSBQQ0kgZHJpdmVyIG5lZWRzIHRvIHdhaXQgZm9yIFBDSSBidXMgcmVhZHkKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fQkJQX0FHRU5ULCAwKTsJLy8gaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudAotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7Ci0jaWZkZWYgUlQzMDkwCi0JLy8yMDA4LzExLzI4OktIIGFkZCB0byBmaXggdGhlIGRlYWQgcmYgZnJlcXVlbmN5IG9mZnNldCBidWc8LS0KLQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDAsIDAsIDApOwotCS8vMjAwOC8xMS8yODpLSCBhZGQgdG8gZml4IHRoZSBkZWFkIHJmIGZyZXF1ZW5jeSBvZmZzZXQgYnVnLS0+Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JUlRNUHVzZWNEZWxheSgxMDAwKTsKLQotCS8vIFJlYWQgQkJQIHJlZ2lzdGVyLCBtYWtlIHN1cmUgQkJQIGlzIHVwIGFuZCBydW5uaW5nIGJlZm9yZSB3cml0ZSBuZXcgZGF0YQotCUluZGV4ID0gMDsKLQlkbwotCXsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IwLCAmUjApOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCQlAgdmVyc2lvbiA9ICV4XG4iLCBSMCkpOwotCX0gd2hpbGUgKCgrK0luZGV4IDwgMjApICYmICgoUjAgPT0gMHhmZikgfHwgKFIwID09IDB4MDApKSk7Ci0JLy9BU1NFUlQoSW5kZXggPCAyMCk7IC8vdGhpcyB3aWxsIGNhdXNlIEJTT0Qgb24gQ2hlY2stYnVpbGQgZHJpdmVyCi0KLQlpZiAoKFIwID09IDB4ZmYpIHx8IChSMCA9PSAweDAwKSkKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0KLQkvLyBJbml0aWFsaXplIEJCUCByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JZm9yIChJbmRleCA9IDA7IEluZGV4IDwgTlVNX0JCUF9SRUdfUEFSTVM7IEluZGV4KyspCi0JewotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQUmVnVGFibGVbSW5kZXhdLlJlZ2lzdGVyLCBCQlBSZWdUYWJsZVtJbmRleF0uVmFsdWUpOwotCX0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCS8vIFRPRE86IHNoaWFuZywgY2hlY2sgTUFDVmVyc2lvbiwgY3VycmVudGx5LCByYnVzLWJhc2VkIGNoaXAgdXNlIHRoaXMuCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKQotCXsKLQkJLy9VQ0hBUiB2YWx1ZTsKLQkJVUxPTkcgdmFsdWUyOwotCi0JCS8vZGlzYWJsZSBNTEQgYnkgQnJ1Y2UgMjAwODA3MDQKLQkJLy9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxMDUsICZ2YWx1ZSk7Ci0JCS8vQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwNSwgdmFsdWUgfCA0KTsKLQotCQkvL01heGltdW0gUFNEVSBsZW5ndGggZnJvbSAxNksgdG8gMzJLIGJ5dGVzCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFYX0xFTl9DRkcsICZ2YWx1ZTIpOwotCQl2YWx1ZTIgJj0gfigweDM8PDEyKTsKLQkJdmFsdWUyIHw9ICgweDI8PDEyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIHZhbHVlMik7Ci0JfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gZm9yIHJ0Mjg2MEUgYW5kIGFmdGVyLCBpbml0IEJCUF9SODQgd2l0aCAweDE5LiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCi0JLy8gUlQzMDkwIHNob3VsZCBub3QgcHJvZ3JhbSBCQlAgUjg0IHRvIDB4MTksIG90aGVyd2lzZSBUWCB3aWxsIGJsb2NrLgotCS8vMzA3MC83MS83MiwzMDkwLDMwOTBBKCBhcmUgaW5jbHVkZWQgaW4gUlQzMHh4KSwzNTcyLDMzOTAKLQlpZiAoKChwQWQtPk1BQ1ZlcnNpb24gJiAweGZmZmYpICE9IDB4MDEwMSkgJiYgIShJU19SVDMweHgocEFkKXx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSkKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODQsIDB4MTkpOwotCi0jaWZkZWYgUlQzMHh4Ci0vLyBhZGQgYnkgam9obmxpLCBSRiBwb3dlciBzZXF1ZW5jZSBzZXR1cAotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkKLQl7CS8vdXBkYXRlIGZvciBSVDMwNzAvNzEvNzIvOTAvOTEvOTIsMzU3MiwzMzkwLgotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3OSwgMHgxMyk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgwLCAweDA1KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SODEsIDB4MzMpOwotCX0KLQotCWlmIChJU19SVDMwOTAocEFkKXx8SVNfUlQzMzkwKHBBZCkpCS8vIFJUMzA5eCwgUlQzMDcxLzcyCi0JewotCQkvLyBlbmFibGUgREMgZmlsdGVyCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMTEpCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwMywgMHhjMCk7Ci0JCX0KLQotCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMTM4LCAmYmJwcmVnKTsKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJewotCQkJLy8gdHVybiBvZmYgdHggREFDXzEKLQkJCWJicHJlZyA9IChiYnByZWcgfCAweDIwKTsKLQkJfQotCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDEpCi0JCXsKLQkJCS8vIHR1cm4gb2ZmIHR4IEFEQ18xCi0JCQliYnByZWcgJj0gKH4weDIpOwotCQl9Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEzOCwgYmJwcmVnKTsKLQotCQkvLyBpbXByb3ZlIHBvd2VyIGNvbnN1bXB0aW9uIGluIFJUMzA3MSBWZXIuRQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAmIDB4ZmZmZikgPj0gMHgwMjExKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMxLCAmYmJwcmVnKTsKLQkJCWJicHJlZyAmPSAofjB4Myk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgYmJwcmVnKTsKLQkJfQotCX0KLQllbHNlIGlmIChJU19SVDMwNzAocEFkKSkKLQl7Ci0JCWlmICgocEFkLT5NQUNWZXJzaW9uICYgMHhmZmZmKSA+PSAweDAyMDEpCi0JCXsKLQkJCS8vIGVuYWJsZSBEQyBmaWx0ZXIKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEwMywgMHhjMCk7Ci0KLQkJCS8vIGltcHJvdmUgcG93ZXIgY29uc3VtcHRpb24gaW4gUlQzMDcwIFZlci5GCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMxLCAmYmJwcmVnKTsKLQkJCWJicHJlZyAmPSAofjB4Myk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzMSwgYmJwcmVnKTsKLQkJfQotCi0JCS8vIFRYX0xPMV9lbiwgUkYgUjE3IHJlZ2lzdGVyIEJpdCAzIHRvIDAKLQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkLCBSRl9SMTcsICZSRlZhbHVlKTsKLQkJUkZWYWx1ZSAmPSAofjB4MDgpOwotCQkvLyB0byBmaXggcnggbG9uZyByYW5nZSBpc3N1ZQotCQlpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRyA9PSAwKQotCQl7Ci0JCQlSRlZhbHVlIHw9IDB4MjA7Ci0JCX0KLQkJLy8gc2V0IFJGX1IxN19iaXRbMjowXSBlcXVhbCB0byBFRVBST00gc2V0dGluZyBhdCAweDQ4aAotCQlpZiAocEFkLT5UeE1peGVyR2FpbjI0RyA+PSAxKQotCQl7Ci0JCQlSRlZhbHVlICY9ICh+MHg3KTsgIC8vIGNsZWFuIGJpdCBbMjowXQotCQkJUkZWYWx1ZSB8PSBwQWQtPlR4TWl4ZXJHYWluMjRHOwotCQl9Ci0JCVJUMzB4eFdyaXRlUkZSZWdpc3RlcihwQWQsIFJGX1IxNywgUkZWYWx1ZSk7Ci0JfQotLy8gZW5kIGpvaG5saQotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NjAwMTAwKQotCXsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIDB4MTYpOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgMHgxMik7Ci0JfQotCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4MEVfVkVSU0lPTiAmJiBwQWQtPk1BQ1ZlcnNpb24gPCBSQUxJTktfMzA3MF9WRVJTSU9OKSAvLyAzKjMKLQl7Ci0JCS8vIGVubGFyZ2UgTUFYX0xFTl9DRkcKLQkJVUlOVDMyIGNzcjsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQVhfTEVOX0NGRywgJmNzcik7Ci0JCWNzciAmPSAweEZGRjsKLQkJY3NyIHw9IDB4MjAwMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIGNzcik7Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkvLyBBZGQgcmFkaW8gb2ZmIGNvbnRyb2wKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBGQUxTRSkKLQkJewotLy8JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQV1JfUElOX0NGRywgMHgwMDAwMTgxOCk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IFJhZGlvIE9mZlxuIikpOwotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gQ2xlYXIgcmF3IGNvdW50ZXJzCi0JUlRNUF9JT19SRUFEMzIocEFkLCBSWF9TVEFfQ05UMCwgJkNvdW50ZXIpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZDb3VudGVyKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQyLCAmQ291bnRlcik7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMCwgJkNvdW50ZXIpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZDb3VudGVyKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQyLCAmQ291bnRlcik7Ci0KLQkvLyBBU0lDIHdpbGwga2VlcCBnYXJiYWdlIHZhbHVlIGFmdGVyIGJvb3QKLQkvLyBDbGVhciBhbGwgc2hhcmVkIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKLQkvLyBUaGlzIHJvdXRpbmUgY2FuIGJlIGlnbm9yZWQgaW4gcmFkaW8tT04vT0ZGIG9wZXJhdGlvbi4KLQlpZiAoYkhhcmRSZXNldCkKLQl7Ci0JCWZvciAoS2V5SWR4ID0gMDsgS2V5SWR4IDwgNDsgS2V5SWR4KyspCi0JCXsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFNIQVJFRF9LRVlfTU9ERV9CQVNFICsgNCpLZXlJZHgsIDApOwotCQl9Ci0KLQkJLy8gQ2xlYXIgYWxsIHBhaXJ3aXNlIGtleSB0YWJsZSB3aGVuIGluaXRpYWwKLQkJZm9yIChLZXlJZHggPSAwOyBLZXlJZHggPCAyNTY7IEtleUlkeCsrKQotCQl7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfV0NJRF9BVFRSSUJVVEVfQkFTRSArIChLZXlJZHggKiBIV19XQ0lEX0FUVFJJX1NJWkUpLCAxKTsKLQkJfQotCX0KLQotCS8vIGFzc2VydCBIT1NUIHJlYWR5IGJpdAotLy8gIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDApOyAvLyAyMDA0LTA5LTE0IGFza2VkIGJ5IE1hcmsKLS8vICBSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfQ1NSMSwgMHg0KTsKLQotCS8vIEl0IGlzbid0IG5lY2Vzc2FyeSB0byBjbGVhciB0aGlzIHNwYWNlIHdoZW4gbm90IGhhcmQgcmVzZXQuCi0JaWYgKGJIYXJkUmVzZXQgPT0gVFJVRSkKLQl7Ci0JCS8vIGNsZWFyIGFsbCBvbi1jaGlwIEJFQUNPTiBmcmFtZSBzcGFjZQotCQlmb3IgKGFwaWR4ID0gMDsgYXBpZHggPCBIV19CRUFDT05fTUFYX0NPVU5UOyBhcGlkeCsrKQotCQl7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSFdfQkVBQ09OX09GRlNFVD4+MjsgaSs9NCkKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBwQWQtPkJlYWNvbk9mZnNldFthcGlkeF0gKyBpLCAweDAwKTsKLQkJfQotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0JCS8vIGZvciBydDI4NjBFIGFuZCBhZnRlciwgaW5pdCBUWE9QX0NUUkxfQ0ZHIHdpdGggMHg1ODNmLiBUaGlzIGlzIGZvciBleHRlbnNpb24gY2hhbm5lbCBvdmVybGFwcGluZyBJT1QuCi0JCWlmICgocEFkLT5NQUNWZXJzaW9uJjB4ZmZmZikgIT0gMHgwMTAxKQotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhPUF9DVFJMX0NGRywgMHg1ODNmKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBORVdfRlcKLQlpZiAoSVNfUlQzMDcwKHBBZCkgfHwgIElTX1JUMzU3MihwQWQpfHxJU19SVDMzOTAocEFkKXx8SVNfUlQzMDkwKHBBZCkpCi0JewotCQkvLyBzZW5kIDB4MzYgbWN1IGNvbW1hbmQgYWZ0ZXIgMHg3MiBmb3IgUlQzeHh4IHRvIGZpeCBSYWRpby1PZmYgY3VycmVudCBsZWFrYWdlIGlzc3VlCi0JCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQkJaWYgKHBBZC0+YnVzZUVmdXNlKQotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM2LCAweGZmLCAweGZmLCAwKTsKLQkJZWxzZQotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDM2LCAweGZmLCAweGZmLCAweDA0KTsKLQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JfQotI2VuZGlmIC8vIE5FV19GVyAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0luaXRpYWxpemVBc2ljXG4iKSk7Ci0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZXNldCBOSUMgQXNpY3MKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0JCVJlc2V0IE5JQyB0byBpbml0aWFsIHN0YXRlIEFTIElTIHN5c3RlbSBib290IHVwIHRpbWUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ0lzc3VlUmVzZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUlOVDMyCVZhbHVlID0gMDsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCItLT4gTklDSXNzdWVSZXNldFxuIikpOwotCi0JLy8gQWJvcnQgVHgsIHByZXZlbnQgQVNJQyBmcm9tIHdyaXRpbmcgdG8gSG9zdCBtZW1vcnkKLQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NOVExfQ1NSLCAweDAwMWYwMDAwKTsKLQotCS8vIERpc2FibGUgUngsIHJlZ2lzdGVyIHZhbHVlIHN1cHBvc2VkIHdpbGwgcmVtYWluIGFmdGVyIHJlc2V0Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JVmFsdWUgJj0gKDB4ZmZmZmZmZjMpOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JLy8gSXNzdWUgcmVzZXQgYW5kIGNsZWFyIGZyb20gcmVzZXQgc3RhdGUKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDMpOyAvLyAyMDA0LTA5LTE3IGNoYW5nZSBmcm9tIDB4MDEKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MDApOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tIE5JQ0lzc3VlUmVzZXRcbiIpKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNoZWNrIEFTSUMgcmVnaXN0ZXJzIGFuZCBmaW5kIGFueSByZWFzb24gdGhlIHN5c3RlbSBtaWdodCBoYW5nCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotQk9PTEVBTglOSUNDaGVja0ZvckhhbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JcmV0dXJuIChGQUxTRSk7Ci19Ci0KLVZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVRYX1NUQV9GSUZPX1NUUlVDCVN0YUZpZm87Ci0JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5OwotCVVDSEFSCQkJCWkgPSAwOwotCVVDSEFSCQkJcGlkID0gMCwgd2NpZCA9IDA7Ci0JQ0hBUgkJCQlyZVRyeTsKLQlVQ0hBUgkJCQlzdWNjTUNTOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8qIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUgKi8KLQlpZiAoQVRFX09OKHBBZCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQkJZG8KLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfRklGTywgJlN0YUZpZm8ud29yZCk7Ci0KLQkJCWlmIChTdGFGaWZvLmZpZWxkLmJWYWxpZCA9PSAwKQotCQkJCWJyZWFrOwotCi0JCQl3Y2lkID0gKFVDSEFSKVN0YUZpZm8uZmllbGQud2NpZDsKLQotCi0JCS8qIGlnbm9yZSBOb0FDSyBhbmQgTUdNVCBmcmFtZSB1c2UgMHhGRiBhcyBXQ0lEICovCi0JCQlpZiAoKFN0YUZpZm8uZmllbGQuVHhBY2tSZXF1aXJlZCA9PSAwKSB8fCAod2NpZCA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkpCi0JCQl7Ci0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBQSUQgc3RvcmUgVHggTUNTIFJhdGUgKi8KLQkJCXBpZCA9IChVQ0hBUilTdGFGaWZvLmZpZWxkLlBpZFR5cGU7Ci0KLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3djaWRdOwotCi0JCQlwRW50cnktPkRlYnVnRklGT0NvdW50Kys7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmIChTdGFGaWZvLmZpZWxkLlR4QkYpIC8vIDMqMwotCQkJCXBFbnRyeS0+VHhCRkNvdW50Kys7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JCQlVQVBTRF9TUF9BVUVfSGFuZGxlKHBBZCwgcEVudHJ5LCBTdGFGaWZvLmZpZWxkLlR4U3VjY2Vzcyk7Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCi0JCQlpZiAoIVN0YUZpZm8uZmllbGQuVHhTdWNjZXNzKQotCQkJewotCQkJCXBFbnRyeS0+RklGT0NvdW50Kys7Ci0JCQkJcEVudHJ5LT5PbmVTZWNUeEZhaWxDb3VudCsrOwotCi0JCQkJaWYgKHBFbnRyeS0+RklGT0NvdW50ID49IDEpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIjIikpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCQlwRW50cnktPk5vQkFEYXRhQ291bnREb3duID0gNjQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCQkJaWYocEVudHJ5LT5Qc01vZGUgPT0gUFdSX0FDVElWRSkKLQkJCQkJewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCQkJaW50IHRpZDsKLQkJCQkJCWZvciAodGlkPTA7IHRpZDxOVU1fT0ZfVElEOyB0aWQrKykKLQkJCQkJCXsKLQkJCQkJCQlCQU9yaVNlc3Npb25UZWFyRG93bihwQWQsIHBFbnRyeS0+QWlkLCAgdGlkLCBGQUxTRSwgRkFMU0UpOwotCQkJCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCQkJCQkvLyBVcGRhdGUgdGhlIGNvbnRpbnVvdXMgdHJhbnNtaXNzaW9uIGNvdW50ZXIgZXhjZXB0IFBTIG1vZGUKLQkJCQkJCXBFbnRyeS0+Q29udGludWVUeEZhaWxDbnQrKzsKLQotI2lmZGVmIFdEU19TVVBQT1JUCi0JCQkJCQkvLyBmaXggV0RTIEphbSBpc3N1ZQotCQkJCQkJaWYoKHBFbnRyeS0+VmFsaWRBc1dEUyA9PSBUUlVFKQotCQkJCQkJCSYmIChwRW50cnktPkxvY2tFbnRyeVR4ID09IEZBTFNFKQotCQkJCQkJCSYmIChwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID49IHBBZC0+QXBDZmcuRW50cnlMaWZlQ2hlY2spKQotCQkJCQkJewotCQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVudHJ5ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IEJsb2NrZWQhISAoRmFpbCBDbnQgPSAlZClcbiIsCi0JCQkJCQkJCXBFbnRyeS0+QWRkclswXSxwRW50cnktPkFkZHJbMV0scEVudHJ5LT5BZGRyWzJdLHBFbnRyeS0+QWRkclszXSwKLQkJCQkJCQkJcEVudHJ5LT5BZGRyWzRdLHBFbnRyeS0+QWRkcls1XSxwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ICkpOwotCi0JCQkJCQkJcEVudHJ5LT5Mb2NrRW50cnlUeCA9IFRSVUU7Ci0JCQkJCQl9Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIENsZWFyIHRoZSBGSUZPQ291bnQgd2hlbiBzdGEgaW4gUG93ZXIgU2F2ZSBtb2RlLiBCYXNpY2FsbHkgd2UgYXNzdW1lCi0JCQkJCQkvLyAgICAgdGhpcyB0eCBlcnJvciBoYXBwZW5lZCBkdWUgdG8gc3RhIGp1c3QgZ28gdG8gc2xlZXAuCi0JCQkJCQlwRW50cnktPkZJRk9Db3VudCA9IDA7Ci0JCQkJCQlwRW50cnktPkNvbnRpbnVlVHhGYWlsQ250ID0gMDsKLQkJCQkJfQotCQkJCQkvL3BFbnRyeS0+RklGT0NvdW50ID0gMDsKLQkJCQl9Ci0JCQkJLy9wRW50cnktPmJTZW5kQkFSID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQlpZiAoKHBFbnRyeS0+UHNNb2RlICE9IFBXUl9TQVZFKSAmJiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93biA+IDApKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bi0tOwotCQkJCQlpZiAocEVudHJ5LT5Ob0JBRGF0YUNvdW50RG93bj09MCkKLQkJCQkJewotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQFxuIikpOwotCQkJCQl9Ci0JCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJCXBFbnRyeS0+RklGT0NvdW50ID0gMDsKLQkJCQlwRW50cnktPk9uZVNlY1R4Tm9SZXRyeU9rQ291bnQrKzsKLQkJCQkvLyB1cGRhdGUgTm9EYXRhSWRsZUNvdW50IHdoZW4gc3VjZXNzZnVsIHNlbmQgcGFja2V0IHRvIFNUQS4KLQkJCQlwRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7Ci0JCQkJcEVudHJ5LT5Db250aW51ZVR4RmFpbENudCA9IDA7Ci0jaWZkZWYgV0RTX1NVUFBPUlQKLQkJCQlwRW50cnktPkxvY2tFbnRyeVR4ID0gRkFMU0U7Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLQkJCX0KLQotCQkJc3VjY01DUyA9IFN0YUZpZm8uZmllbGQuU3VjY2Vzc1JhdGUgJiAweDdGOwotCi0JCQlyZVRyeSA9IHBpZCAtIHN1Y2NNQ1M7Ci0KLQkJCWlmIChTdGFGaWZvLmZpZWxkLlR4U3VjY2VzcykKLQkJCXsKLQkJCQlwRW50cnktPlRYTUNTRXhwZWN0ZWRbcGlkXSsrOwotCQkJCWlmIChwaWQgPT0gc3VjY01DUykKLQkJCQl7Ci0JCQkJCXBFbnRyeS0+VFhNQ1NTdWNjZXNzZnVsW3BpZF0rKzsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEVudHJ5LT5UWE1DU0F1dG9GYWxsQmFja1twaWRdW3N1Y2NNQ1NdKys7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBFbnRyeS0+VFhNQ1NGYWlsZWRbcGlkXSsrOwotCQkJfQotCi0JCQlpZiAocmVUcnkgPiAwKQotCQkJewotCQkJCWlmICgocGlkID49IDEyKSAmJiBzdWNjTUNTIDw9NykKLQkJCQl7Ci0JCQkJCXJlVHJ5IC09IDQ7Ci0JCQkJfQotCQkJCXBFbnRyeS0+T25lU2VjVHhSZXRyeU9rQ291bnQgKz0gcmVUcnk7Ci0JCQl9Ci0KLQkJCWkrKzsKLQkJCS8vIEFTSUMgc3RvcmUgMTYgc3RhY2sKLQkJfSB3aGlsZSAoIGkgPCAoVFhfUklOR19TSVpFPDwxKSApOwotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlSZWFkIHN0YXRpc3RpY2FsIGNvdW50ZXJzIGZyb20gaGFyZHdhcmUgcmVnaXN0ZXJzIGFuZCByZWNvcmQgdGhlbQotCQlpbiBzb2Z0d2FyZSB2YXJpYWJsZXMgZm9yIGxhdGVyIG9uIHF1ZXJ5Ci0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTklDVXBkYXRlUmF3Q291bnRlcnMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUlOVDMyCU9sZFZhbHVlOy8vLCBWYWx1ZTI7Ci0JLy9VTE9ORwlQYWdlU3VtLCBPbmVTZWNUcmFuc21pdENvdW50OwotCS8vVUxPTkcJVHhFcnJvclJhdGlvLCBSZXRyeSwgRmFpbDsKLQlSWF9TVEFfQ05UMF9TVFJVQwkgUnhTdGFDbnQwOwotCVJYX1NUQV9DTlQxX1NUUlVDICAgUnhTdGFDbnQxOwotCVJYX1NUQV9DTlQyX1NUUlVDICAgUnhTdGFDbnQyOwotCVRYX1NUQV9DTlQwX1NUUlVDCSBUeFN0YUNudDA7Ci0JVFhfU1RBX0NOVDFfU1RSVUMJIFN0YVR4MTsKLQlUWF9TVEFfQ05UMl9TVFJVQwkgU3RhVHgyOwotCVRYX0FHR19DTlRfU1RSVUMJVHhBZ2dDbnQ7Ci0JVFhfQUdHX0NOVDBfU1RSVUMJVHhBZ2dDbnQwOwotCVRYX0FHR19DTlQxX1NUUlVDCVR4QWdnQ250MTsKLQlUWF9BR0dfQ05UMl9TVFJVQwlUeEFnZ0NudDI7Ci0JVFhfQUdHX0NOVDNfU1RSVUMJVHhBZ2dDbnQzOwotCVRYX0FHR19DTlQ0X1NUUlVDCVR4QWdnQ250NDsKLQlUWF9BR0dfQ05UNV9TVFJVQwlUeEFnZ0NudDU7Ci0JVFhfQUdHX0NOVDZfU1RSVUMJVHhBZ2dDbnQ2OwotCVRYX0FHR19DTlQ3X1NUUlVDCVR4QWdnQ250NzsKLQlDT1VOVEVSX1JBTElOSwkJKnBSYWxpbmtDb3VudGVyczsKLQotCi0JcFJhbGlua0NvdW50ZXJzID0gJnBBZC0+UmFsaW5rQ291bnRlcnM7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFJYX1NUQV9DTlQwLCAmUnhTdGFDbnQwLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDIsICZSeFN0YUNudDIud29yZCk7Ci0KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgUlhfU1RBX0NOVDEsICZSeFN0YUNudDEud29yZCk7Ci0JICAgIC8vIFVwZGF0ZSBSWCBQTENQIGVycm9yIGNvdW50ZXIKLQkgICAgcEFkLT5Qcml2YXRlSW5mby5QaHlSeEVyckNudCArPSBSeFN0YUNudDEuZmllbGQuUGxjcEVycjsKLQkJLy8gVXBkYXRlIEZhbHNlIENDQSBjb3VudGVyCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQgKz0gUnhTdGFDbnQxLmZpZWxkLkZhbHNlQ2NhOwotCX0KLQotCS8vIFVwZGF0ZSBGQ1MgY291bnRlcnMKLQlPbGRWYWx1ZT0gcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQ7Ci0JcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQgKz0gKFJ4U3RhQ250MC5maWVsZC5DcmNFcnIpOyAvLyA+PiA3KTsKLQlpZiAocEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51Lkxvd1BhcnQgPCBPbGRWYWx1ZSkKLQkJcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudC51LkhpZ2hQYXJ0Kys7Ci0KLQkvLyBBZGQgRkNTIGVycm9yIGNvdW50IHRvIHByaXZhdGUgY291bnRlcnMKLQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY1J4RmNzRXJyQ250ICs9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7Ci0JT2xkVmFsdWUgPSBwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51Lkxvd1BhcnQ7Ci0JcFJhbGlua0NvdW50ZXJzLT5SZWFsRmNzRXJyQ291bnQudS5Mb3dQYXJ0ICs9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7Ci0JaWYgKHBSYWxpbmtDb3VudGVycy0+UmVhbEZjc0VyckNvdW50LnUuTG93UGFydCA8IE9sZFZhbHVlKQotCQlwUmFsaW5rQ291bnRlcnMtPlJlYWxGY3NFcnJDb3VudC51LkhpZ2hQYXJ0Kys7Ci0KLQkvLyBVcGRhdGUgRHVwbGljYXRlIFJjdiBjaGVjawotCXBSYWxpbmtDb3VudGVycy0+RHVwbGljYXRlUmN2ICs9IFJ4U3RhQ250Mi5maWVsZC5SeER1cGxpQ291bnQ7Ci0JcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC51Lkxvd1BhcnQgKz0gUnhTdGFDbnQyLmZpZWxkLlJ4RHVwbGlDb3VudDsKLQkvLyBVcGRhdGUgUlggT3ZlcmZsb3cgY291bnRlcgotCXBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgKz0gKFJ4U3RhQ250Mi5maWVsZC5SeEZpZm9PdmVyZmxvd0NvdW50KTsKLQotCS8vcEFkLT5SYWxpbmtDb3VudGVycy5SeENvdW50ID0gMDsKLQotCi0JLy9pZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfVFhfUkFURV9TV0lUQ0hfRU5BQkxFRCkgfHwKLQkvLwkoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19UWF9SQVRFX1NXSVRDSF9FTkFCTEVEKSAmJiAocEFkLT5NYWNUYWIuU2l6ZSAhPSAxKSkpCi0JaWYgKCFwQWQtPmJVcGRhdGVCY25DbnREb25lKQotCXsKLQkvLyBVcGRhdGUgQkVBQ09OIHNlbnQgY291bnQKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1NUQV9DTlQwLCAmVHhTdGFDbnQwLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfU1RBX0NOVDEsICZTdGFUeDEud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9TVEFfQ05UMiwgJlN0YVR4Mi53b3JkKTsKLQlwUmFsaW5rQ291bnRlcnMtPk9uZVNlY0JlYWNvblNlbnRDbnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4QmVhY29uQ291bnQ7Ci0JcFJhbGlua0NvdW50ZXJzLT5PbmVTZWNUeFJldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhOb1JldHJ5T2tDb3VudCArPSBTdGFUeDEuZmllbGQuVHhTdWNjZXNzOwotCXBSYWxpbmtDb3VudGVycy0+T25lU2VjVHhGYWlsQ291bnQgKz0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCXBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC51Lkxvd1BhcnQgKz0gU3RhVHgxLmZpZWxkLlR4U3VjY2VzczsKLQlwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCArPSBTdGFUeDEuZmllbGQuVHhSZXRyYW5zbWl0OwotCXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LnUuTG93UGFydCArPSBUeFN0YUNudDAuZmllbGQuVHhGYWlsQ291bnQ7Ci0JfQotCi0KLQkvL2lmIChwQWQtPmJTdGFGaWZvVGVzdCA9PSBUUlVFKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05ULCAmVHhBZ2dDbnQud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMCwgJlR4QWdnQ250MC53b3JkKTsKLQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX0FHR19DTlQxLCAmVHhBZ2dDbnQxLndvcmQpOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQUdHX0NOVDIsICZUeEFnZ0NudDIud29yZCk7Ci0JUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UMywgJlR4QWdnQ250My53b3JkKTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNCwgJlR4QWdnQ250NC53b3JkKTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNSwgJlR4QWdnQ250NS53b3JkKTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNiwgJlR4QWdnQ250Ni53b3JkKTsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9BR0dfQ05UNywgJlR4QWdnQ250Ny53b3JkKTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZ0NvdW50ICs9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhOb25BZ2dDb3VudCArPSBUeEFnZ0NudC5maWVsZC5Ob25BZ2dUeENvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMU1QRFVDb3VudCArPSBUeEFnZ0NudDAuZmllbGQuQWdnU2l6ZTFDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzJNUERVQ291bnQgKz0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzNNUERVQ291bnQgKz0gVHhBZ2dDbnQxLmZpZWxkLkFnZ1NpemUzQ291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c0TVBEVUNvdW50ICs9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnNU1QRFVDb3VudCArPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzZNUERVQ291bnQgKz0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU2Q291bnQ7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzdNUERVQ291bnQgKz0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU3Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2c4TVBEVUNvdW50ICs9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnOU1QRFVDb3VudCArPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKLQkJcFJhbGlua0NvdW50ZXJzLT5UeEFnZzEwTVBEVUNvdW50ICs9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKLQotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTFNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMUNvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTJNUERVQ291bnQgKz0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTNNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxM0NvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlR4QWdnMTRNUERVQ291bnQgKz0gVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50OwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxNU1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE1Q291bnQ7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHhBZ2cxNk1QRFVDb3VudCArPSBUeEFnZ0NudDcuZmllbGQuQWdnU2l6ZTE2Q291bnQ7Ci0KLQkJLy8gQ2FsY3VsYXRlIHRoZSB0cmFuc21pdHRlZCBBLU1QRFUgY291bnQKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMkNvdW50IC8gMik7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudCAvIDMpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50IC8gNCk7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTVDb3VudCAvIDUpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Mi5maWVsZC5BZ2dTaXplNkNvdW50IC8gNik7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDMuZmllbGQuQWdnU2l6ZTdDb3VudCAvIDcpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250My5maWVsZC5BZ2dTaXplOENvdW50IC8gOCk7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudCAvIDkpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudCAvIDEwKTsKLQotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250NS5maWVsZC5BZ2dTaXplMTFDb3VudCAvIDExKTsKLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTEyQ291bnQgLyAxMik7Ci0KLQkJcFJhbGlua0NvdW50ZXJzLT5UcmFuc21pdHRlZEFNUERVQ291bnQudS5Mb3dQYXJ0ICs9IChUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTEzQ291bnQgLyAxMyk7Ci0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ2LmZpZWxkLkFnZ1NpemUxNENvdW50IC8gMTQpOwotCi0JCXBSYWxpbmtDb3VudGVycy0+VHJhbnNtaXR0ZWRBTVBEVUNvdW50LnUuTG93UGFydCArPSAoVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50IC8gMTUpOwotCQlwUmFsaW5rQ291bnRlcnMtPlRyYW5zbWl0dGVkQU1QRFVDb3VudC51Lkxvd1BhcnQgKz0gKFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudCAvIDE2KTsKLQl9Ci0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQl7Ci0JCVJ0bXBEaWFnU3RydWN0CSpwRGlhZzsKLQkJVUNIQVIJCQlBcnJheUN1cklkeCwgaTsKLQotCQlwRGlhZyA9ICZwQWQtPkRpYWdTdHJ1Y3Q7Ci0JCUFycmF5Q3VySWR4ID0gcERpYWctPkFycmF5Q3VySWR4OwotCi0JCWlmIChwRGlhZy0+aW5pdGVkID09IDApCi0JCXsKLQkJCU5kaXNaZXJvTWVtb3J5KHBEaWFnLCBzaXplb2Yoc3RydWN0IF9SdG1wRGlhZ1N0cmN1dF8pKTsKLQkJCXBEaWFnLT5BcnJheVN0YXJ0SWR4ID0gcERpYWctPkFycmF5Q3VySWR4ID0gMDsKLQkJCXBEaWFnLT5pbml0ZWQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gVHgKLQkJCXBEaWFnLT5UeEZhaWxDbnRbQXJyYXlDdXJJZHhdID0gVHhTdGFDbnQwLmZpZWxkLlR4RmFpbENvdW50OwotCQkJcERpYWctPlR4QWdnQ250W0FycmF5Q3VySWR4XSA9IFR4QWdnQ250LmZpZWxkLkFnZ1R4Q291bnQ7Ci0JCQlwRGlhZy0+VHhOb25BZ2dDbnRbQXJyYXlDdXJJZHhdID0gVHhBZ2dDbnQuZmllbGQuTm9uQWdnVHhDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVswXSA9IFR4QWdnQ250MC5maWVsZC5BZ2dTaXplMUNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzFdID0gVHhBZ2dDbnQwLmZpZWxkLkFnZ1NpemUyQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMl0gPSBUeEFnZ0NudDEuZmllbGQuQWdnU2l6ZTNDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVszXSA9IFR4QWdnQ250MS5maWVsZC5BZ2dTaXplNENvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzRdID0gVHhBZ2dDbnQyLmZpZWxkLkFnZ1NpemU1Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bNV0gPSBUeEFnZ0NudDIuZmllbGQuQWdnU2l6ZTZDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs2XSA9IFR4QWdnQ250My5maWVsZC5BZ2dTaXplN0NvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzddID0gVHhBZ2dDbnQzLmZpZWxkLkFnZ1NpemU4Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bOF0gPSBUeEFnZ0NudDQuZmllbGQuQWdnU2l6ZTlDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVs5XSA9IFR4QWdnQ250NC5maWVsZC5BZ2dTaXplMTBDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxMF0gPSBUeEFnZ0NudDUuZmllbGQuQWdnU2l6ZTExQ291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTFdID0gVHhBZ2dDbnQ1LmZpZWxkLkFnZ1NpemUxMkNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzEyXSA9IFR4QWdnQ250Ni5maWVsZC5BZ2dTaXplMTNDb3VudDsKLQkJCXBEaWFnLT5UeEFNUERVQ250W0FycmF5Q3VySWR4XVsxM10gPSBUeEFnZ0NudDYuZmllbGQuQWdnU2l6ZTE0Q291bnQ7Ci0JCQlwRGlhZy0+VHhBTVBEVUNudFtBcnJheUN1cklkeF1bMTRdID0gVHhBZ2dDbnQ3LmZpZWxkLkFnZ1NpemUxNUNvdW50OwotCQkJcERpYWctPlR4QU1QRFVDbnRbQXJyYXlDdXJJZHhdWzE1XSA9IFR4QWdnQ250Ny5maWVsZC5BZ2dTaXplMTZDb3VudDsKLQotCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSA9IFJ4U3RhQ250MC5maWVsZC5DcmNFcnI7Ci0KLQkJCUlOQ19SSU5HX0lOREVYKHBEaWFnLT5BcnJheUN1cklkeCwgIERJQUdOT1NFX1RJTUUpOwotCQkJQXJyYXlDdXJJZHggPSBwRGlhZy0+QXJyYXlDdXJJZHg7Ci0JCQlmb3IgKGkgPTA7IGkgPCA5OyBpKyspCi0JCQl7Ci0JCQkJcERpYWctPlR4RGVzY0NudFtBcnJheUN1cklkeF1baV09IDA7Ci0JCQkJcERpYWctPlR4U1dRdWVDbnRbQXJyYXlDdXJJZHhdW2ldID0wOwotCQkJCXBEaWFnLT5UeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotCQkJCXBEaWFnLT5SeE1jc0NudFtBcnJheUN1cklkeF1baV0gPSAwOwotCQkJfQotCQkJcERpYWctPlR4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOwotCQkJcERpYWctPlR4RmFpbENudFtBcnJheUN1cklkeF0gPSAwOwotCQkJcERpYWctPlJ4RGF0YUNudFtBcnJheUN1cklkeF0gPSAwOwotCQkJcERpYWctPlJ4Q3JjRXJyQ250W0FycmF5Q3VySWR4XSAgPSAwOwotLy8JCQlmb3IgKGkgPSA5OyBpIDwgMTY7IGkrKykKLQkJCWZvciAoaSA9IDk7IGkgPCAyNDsgaSsrKSAvLyAzKjMKLQkJCXsKLQkJCQlwRGlhZy0+VHhEZXNjQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7Ci0JCQkJcERpYWctPlR4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7Ci0JCQkJcERpYWctPlJ4TWNzQ250W0FycmF5Q3VySWR4XVtpXSA9IDA7Ci19Ci0KLQkJCWlmIChwRGlhZy0+QXJyYXlDdXJJZHggPT0gcERpYWctPkFycmF5U3RhcnRJZHgpCi0JCQkJSU5DX1JJTkdfSU5ERVgocERpYWctPkFycmF5U3RhcnRJZHgsICBESUFHTk9TRV9USU1FKTsKLQkJfQotCi0JfQotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJUmVzZXQgTklDIGZyb20gZXJyb3IKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0JCVJlc2V0IE5JQyBmcm9tIGVycm9yIHN0YXRlCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECU5JQ1Jlc2V0RnJvbUVycm9yKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIFJlc2V0IEJCUCAoYWNjb3JkaW5nIHRvIGFsZXgsIHJlc2V0IEFTSUMgd2lsbCBmb3JjZSByZXNldCBCQlAKLQkvLyBUaGVyZWZvcmUsIHNraXAgdGhlIHJlc2V0IEJCUAotCS8vIFJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19DU1IxLCAweDIpOwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweDEpOwotCS8vIFJlbW92ZSBBU0lDIGZyb20gcmVzZXQgc3RhdGUKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIDB4MCk7Ci0KLQlOSUNJbml0aWFsaXplQWRhcHRlcihwQWQsIEZBTFNFKTsKLQlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKLQotCS8vIFN3aXRjaCB0byBjdXJyZW50IGNoYW5uZWwsIHNpbmNlIGR1cmluZyByZXNldCBwcm9jZXNzLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgcmVtYWlucyBvbi4KLQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotfQotCi0KLU5ESVNfU1RBVFVTIE5JQ0xvYWRGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlORElTX1NUQVRVUwkgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlpZiAocEFkLT5jaGlwT3BzLmxvYWRGaXJtd2FyZSkKLQkJc3RhdHVzID0gcEFkLT5jaGlwT3BzLmxvYWRGaXJtd2FyZShwQWQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJZXJhc2UgODA1MSBmaXJtd2FyZSBpbWFnZSBpbiBNQUMgQVNJQwotCi0JQXJndW1lbnRzOgotCQlBZGFwdGVyCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTklDRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlpZiAocEFkLT5jaGlwT3BzLmVyYXNlRmlybXdhcmUpCi0JCXBBZC0+Y2hpcE9wcy5lcmFzZUZpcm13YXJlKHBBZCk7Ci0KLX0vKiBFbmQgb2YgTklDRXJhc2VGaXJtd2FyZSAqLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlMb2FkIFR4IHJhdGUgc3dpdGNoaW5nIHBhcmFtZXRlcnMKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUyAgICAgICAgIGZpcm13YXJlIGltYWdlIGxvYWQgb2sKLQkJTkRJU19TVEFUVVNfRkFJTFVSRSAgICAgICAgIGltYWdlIG5vdCBmb3VuZAotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCVJhdGUgVGFibGUgRm9ybWF0OgotCQkxLiAoQjA6IFZhbGlkIEl0ZW0gbnVtYmVyKSAoQjE6SW5pdGlhbCBpdGVtIGZyb20gemVybykKLQkJMi4gSXRlbSBOdW1iZXIoRGVjKSAgICAgIE1vZGUoSGV4KSAgICAgQ3VycmVudCBNQ1MoRGVjKSAgICBUcmFpblVwKERlYykgICAgVHJhaW5Eb3duKERlYykKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU5ESVNfU1RBVFVTIE5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb21wYXJlIHR3byBtZW1vcnkgYmxvY2sKLQotCUFyZ3VtZW50czoKLQkJcFNyYzEJCVBvaW50ZXIgdG8gZmlyc3QgbWVtb3J5IGFkZHJlc3MKLQkJcFNyYzIJCVBvaW50ZXIgdG8gc2Vjb25kIG1lbW9yeSBhZGRyZXNzCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCTA6CQkJbWVtb3J5IGlzIGVxdWFsCi0JCTE6CQkJcFNyYzEgbWVtb3J5IGlzIGxhcmdlcgotCQkyOgkJCXBTcmMyIG1lbW9yeSBpcyBsYXJnZXIKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVVMT05HCVJUTVBDb21wYXJlTWVtb3J5KAotCUlOCVBWT0lECXBTcmMxLAotCUlOCVBWT0lECXBTcmMyLAotCUlOCVVMT05HCUxlbmd0aCkKLXsKLQlQVUNIQVIJcE1lbTE7Ci0JUFVDSEFSCXBNZW0yOwotCVVMT05HCUluZGV4ID0gMDsKLQotCXBNZW0xID0gKFBVQ0hBUikgcFNyYzE7Ci0JcE1lbTIgPSAoUFVDSEFSKSBwU3JjMjsKLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IExlbmd0aDsgSW5kZXgrKykKLQl7Ci0JCWlmIChwTWVtMVtJbmRleF0gPiBwTWVtMltJbmRleF0pCi0JCQlyZXR1cm4gKDEpOwotCQllbHNlIGlmIChwTWVtMVtJbmRleF0gPCBwTWVtMltJbmRleF0pCi0JCQlyZXR1cm4gKDIpOwotCX0KLQotCS8vIEVxdWFsCi0JcmV0dXJuICgwKTsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJWmVybyBvdXQgbWVtb3J5IGJsb2NrCi0KLQlBcmd1bWVudHM6Ci0JCXBTcmMxCQlQb2ludGVyIHRvIG1lbW9yeSBhZGRyZXNzCi0JCUxlbmd0aAkJU2l6ZQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUFplcm9NZW1vcnkoCi0JSU4JUFZPSUQJcFNyYywKLQlJTglVTE9ORwlMZW5ndGgpCi17Ci0JUFVDSEFSCXBNZW07Ci0JVUxPTkcJSW5kZXggPSAwOwotCi0JcE1lbSA9IChQVUNIQVIpIHBTcmM7Ci0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JewotCQlwTWVtW0luZGV4XSA9IDB4MDA7Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlDb3B5IGRhdGEgZnJvbSBtZW1vcnkgYmxvY2sgMSB0byBtZW1vcnkgYmxvY2sgMgotCi0JQXJndW1lbnRzOgotCQlwRGVzdAkJUG9pbnRlciB0byBkZXN0aW5hdGlvbiBtZW1vcnkgYWRkcmVzcwotCQlwU3JjCQlQb2ludGVyIHRvIHNvdXJjZSBtZW1vcnkgYWRkcmVzcwotCQlMZW5ndGgJCUNvcHkgc2l6ZQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUE1vdmVNZW1vcnkoCi0JT1VUCVBWT0lECXBEZXN0LAotCUlOCVBWT0lECXBTcmMsCi0JSU4JVUxPTkcJTGVuZ3RoKQotewotCVBVQ0hBUglwTWVtMTsKLQlQVUNIQVIJcE1lbTI7Ci0JVUlOVAlJbmRleDsKLQotCUFTU0VSVCgoTGVuZ3RoPT0wKSB8fCAocERlc3QgJiYgcFNyYykpOwotCi0JcE1lbTEgPSAoUFVDSEFSKSBwRGVzdDsKLQlwTWVtMiA9IChQVUNIQVIpIHBTcmM7Ci0KLQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBMZW5ndGg7IEluZGV4KyspCi0JewotCQlwTWVtMVtJbmRleF0gPSBwTWVtMltJbmRleF07Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0aWFsaXplIHBvcnQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKLQotCUFyZ3VtZW50czoKLQkJQWRhcHRlcgkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVVzZXJDZmdJbml0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKQotewotLy8JRURDQV9QQVJNIERlZmF1bHRFZGNhUGFybTsKLSAgICBVSU5UIGtleV9pbmRleCwgYnNzX2luZGV4OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+IFVzZXJDZmdJbml0XG4iKSk7Ci0KLQkvLwotCS8vICBwYXJ0IEkuIGludGlhbGl6ZSBjb21tb24gY29uZmlndXJhdGlvbgotCS8vCi0KLQlmb3Ioa2V5X2luZGV4PTA7IGtleV9pbmRleDxTSEFSRV9LRVlfTlVNOyBrZXlfaW5kZXgrKykKLQl7Ci0JCWZvcihic3NfaW5kZXggPSAwOyBic3NfaW5kZXggPCBNQVhfTUJTU0lEX05VTTsgYnNzX2luZGV4KyspCi0JCXsKLQkJCXBBZC0+U2hhcmVkS2V5W2Jzc19pbmRleF1ba2V5X2luZGV4XS5LZXlMZW4gPSAwOwotCQkJcEFkLT5TaGFyZWRLZXlbYnNzX2luZGV4XVtrZXlfaW5kZXhdLkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCQl9Ci0JfQotCi0JcEFkLT5FZXByb21BY2Nlc3MgPSBGQUxTRTsKLQotCXBBZC0+QW50ZW5uYS53b3JkID0gMDsKLQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV18yMDsKLQotCXBBZC0+TGVkQ250bC53b3JkID0gMDsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMDsKLQlwQWQtPlJMbmtDdHJsT2Zmc2V0ID0gMDsKLQlwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFM9VFJVRTsKLQlwQWQtPkNoZWNrRG1hQnVzeUNvdW50ID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCXBBZC0+YkF1dG9UeEFnY0EgPSBGQUxTRTsJCQkvLyBEZWZhdWx0IGlzIE9GRgotCXBBZC0+YkF1dG9UeEFnY0cgPSBGQUxTRTsJCQkvLyBEZWZhdWx0IGlzIE9GRgotCXBBZC0+UmZJY1R5cGUgPSBSRklDXzI4MjA7Ci0KLQkvLyBJbml0IHRpbWVyIGZvciByZXNldCBjb21wbGV0ZSBldmVudAotCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gMTsKLQlwQWQtPmJGb3JjZVByaW50VFggPSBGQUxTRTsKLQlwQWQtPmJGb3JjZVByaW50UlggPSBGQUxTRTsKLQlwQWQtPmJTdGFGaWZvVGVzdCA9IEZBTFNFOwotCXBBZC0+YlByb3RlY3Rpb25UZXN0ID0gRkFMU0U7Ci0JLyoKLQlwQWQtPmJIQ0NBVGVzdCA9IEZBTFNFOwotCXBBZC0+Ykdlbk9uZUhDQ0EgPSBGQUxTRTsKLQkqLwotCXBBZC0+Q29tbW9uQ2ZnLkRzaWZzID0gMTA7ICAgICAgLy8gaW4gdW5pdHMgb2YgdXNlYwotCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIgPSAxMDA7IC8vbVcKLQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KLQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IDB4ZmZmZmZmZmY7IC8vIEFVVE8KLQlwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID0gUnQ4MDJfMTFQcmVhbWJsZUF1dG87IC8vIHVzZSBMb25nIHByZWFtYmxlIG9uIFRYIGJ5IGRlZmF1dAotCXBBZC0+Q29tbW9uQ2ZnLmJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPSAyMzQ3OwotCXBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gMjM0NjsKLQlwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSAwOyAgICAvLyAwOiBBVVRPCi0JcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBUUlVFOyAvLzA7Ci0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7ICAgICAvLyB1bmtub3duCi0JcEFkLT5Db21tb25DZmcuQmFuZFN0YXRlID0gVU5LTk9XTl9CQU5EOwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTUGVyaW9kID0gMTA7Ci0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuQ1NDb3VudCA9IDA7Ci0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7Ci0KLQotCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LmRlbHRhID0gQ0FSUklFUl9ERVRFQ1RfREVMVEE7Ci0JcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC5kaXZfZmxhZyA9IENBUlJJRVJfREVURUNUX0RJVl9GTEFHOwotCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuY3JpdGVyaWEgPSBDQVJSSUVSX0RFVEVDVF9DUklUSVJJQTsKLSNpZmRlZiBSVDMwOTAKLQlpZihJU19SVDMwOTBBKHBBZCkpCi0JcEFkLT5Db21tb25DZmcuQ2FycmllckRldGVjdC50aHJlc2hvbGQgPSBDQVJSSUVSX0RFVEVDVF9USFJFU0hPTERfMzA5MEE7Ci0JZWxzZQotI2VuZGlmIC8vIFJUMzA5MCAvLwotCXBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QudGhyZXNob2xkID0gQ0FSUklFUl9ERVRFQ1RfVEhSRVNIT0xEOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5DaE1vdmluZ1RpbWUgPSA2NTsKLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5Mb25nUHVsc2VSYWRhclRoID0gMjsKLQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5BdmdSc3NpUmVxID0gLTc1OwotI2Vsc2UgLy8gb3JpZ2luYWwgcnQyOHh4IHNvdXJjZSBjb2RlCi0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuTG9uZ1B1bHNlUmFkYXJUaCA9IDM7Ci0jZW5kaWYgLy8gTUVSR0VfQVJDSF9URUFNIC8vCi0JcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuYk5lZWRTZW5kVHJpZ2dlckZyYW1lID0gRkFMU0U7Ci0JcEFkLT5Db21tb25DZmcuVHJpZ2dlclRpbWVyQ291bnQgPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5iQ291bnRyeUZsYWcgPSBGQUxTRTsKLQlwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9IDA7Ci0JcEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPSAwOwotCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+QmVhY29uVHhXSSwgc2l6ZW9mKHBBZC0+QmVhY29uVHhXSSkpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSkpOwotCXBBZC0+SFRDRW5hYmxlID0gRkFMU0U7Ci0JcEFkLT5iQnJvYWRDb21IVCA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLmJSZGcgPSBGQUxTRTsKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuUGFzc2l2ZUR3ZWxsID0gZG90MTFPQlNTU2NhblBhc3NpdmVEd2VsbDsJLy8gVW5pdCA6IFRVLiA1fjEwMDAKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlRHdlbGwgPSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGw7CS8vIFVuaXQgOiBUVS4gMTB+MTAwMAotCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCA9IGRvdDExQlNTV2lkdGhUcmlnZ2VyU2NhbkludGVydmFsOwkvLyBVbml0IDogU2Vjb25kCi0JcEFkLT5Db21tb25DZmcuRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWwgPSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMDB+MTAwMDAKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsID0gZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbDsJLy8gVW5pdCA6IFRVLiAyMH4xMDAwMAotCXBBZC0+Q29tbW9uQ2ZnLkRvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yID0gZG90MTFCU1NXaWR0aENoYW5uZWxUcmFuc2FjdGlvbkRlbGF5RmFjdG9yOwotCXBBZC0+Q29tbW9uQ2ZnLkRvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmUgPSBkb3QxMUJTU1NjYW5BY3Rpdml0eVRocmVzaG9sZDsJLy8gVW5pdCA6IHBlcmNlbnRhZ2UKLQlwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheSA9IChwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQgKiBwQWQtPkNvbW1vbkNmZy5Eb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3Rvcik7Ci0jZW5kaWYgIC8vIERPVDExTl9EUkFGVDMgLy8KLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIHNpemVvZihwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8pKTsKLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBNTVBTX0VOQUJMRTsKLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTXBkdURlbnNpdHkgPSAwOwotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsKLQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gNjQ7IC8vMzI7Ci0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlR4QkFXaW5MaW1pdCA9IDY0OyAvLzMyOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPiBVc2VyQ2ZnSW5pdC4gQkFDYXBhYmlsaXR5ID0gMHgleFxuIiwgcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQpKTsKLQotCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBGQUxTRTsKLQlCQVRhYmxlSW5pdChwQWQsICZwQWQtPkJBVGFibGUpOwotCi0JcEFkLT5Db21tb25DZmcuYkV4dENoYW5uZWxTd2l0Y2hBbm5vdW5jZW1lbnQgPSAxOwotCXBBZC0+Q29tbW9uQ2ZnLmJIVFByb3RlY3QgPSAxOwotCXBBZC0+Q29tbW9uQ2ZnLmJNSU1PUFNFbmFibGUgPSBUUlVFOwotCS8vMjAwOC8xMS8wNTpLSCBhZGQgdG8gc3VwcG9ydCBBbnRlbm5hIHBvd2VyLXNhdmluZyBvZiBBUDwtLQotCXBBZC0+Q29tbW9uQ2ZnLmJHcmVlbkFQRW5hYmxlPUZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLmJCbG9ja0FudERpdmZvckdyZWVuQVA9RkFMU0U7Ci0JLy8yMDA4LzExLzA1OktIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQLS0+Ci0JcEFkLT5Db21tb25DZmcuYkJBRGVjbGluZSA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLmJEaXNhYmxlUmVvcmRlcmluZyA9IEZBTFNFOwotCi0JaWYgKHBBZC0+TUFDVmVyc2lvbiA9PSAweDI4NzIwMjAwKQotCXsKLQkJcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSAxMzsgLy9ieSBKZXJyeSByZWNvbW1lbmQKLQl9ZWxzZXsKLQkJcEFkLT5Db21tb25DZmcuVHhCQVNpemUgPSA3OwotCX0KLQotCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvL3BBZC0+Q29tbW9uQ2ZnLkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotCS8vcEFkLT5Db21tb25DZmcuSFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBHSV84MDA7Ci0JLy9wQWQtPkNvbW1vbkNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQyA9IFNUQkNfTk9ORTsKLQlwQWQtPkNvbW1vbkNmZy5UeFJhdGUgPSBSQVRFXzY7Ci0KLQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gTUNTX1JBVEVfNjsKLQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuQlcgPSBCV18yMDsKLQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQotCXBBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZCA9IDEwMDsgICAgIC8vIGluIG1TZWMKLQotCi0JLy8KLQkvLyBwYXJ0IElJLiBpbnRpYWxpemUgU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KLQkvLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QpOwotCQlSWF9GSUxURVJfQ0xFQVJfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCk7Ci0JCVJYX0ZJTFRFUl9TRVRfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX0JST0FEQ0FTVCk7Ci0JCVJYX0ZJTFRFUl9TRVRfRkxBRyhwQWQsIGZSWF9GSUxURVJfQUNDRVBUX0FMTF9NVUxUSUNBU1QpOwotCi0JCXBBZC0+U3RhQ2ZnLlBzbSA9IFBXUl9BQ1RJVkU7Ci0KLQkJcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0JCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0JCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSBGQUxTRTsKLQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsKLQotCQkvLyA4MDIuMXggcG9ydCBjb250cm9sCi0JCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwotCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLk1pY0VyckNudCAgICAgICAgPSAwOwotCQlwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyAgICAgID0gRkFMU0U7Ci0JCXBBZC0+U3RhQ2ZnLldwYVN0YXRlICAgICAgICAgPSBTU19OT1RVU0U7Ci0KLQkJcEFkLT5Db21tb25DZmcuTmRpc1JhZGlvU3RhdGVPZmYgPSBGQUxTRTsJCS8vIE5ldyB0byBzdXBwb3J0IG1pY3Jvc29mdCBkaXNhYmxlIHJhZGlvIHdpdGggT0lEIGNvbW1hbmQKLQotCQlwQWQtPlN0YUNmZy5Sc3NpVHJpZ2dlciA9IDA7Ci0JCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLCBzaXplb2YoUlNTSV9TQU1QTEUpKTsKLQkJcEFkLT5TdGFDZmcuUnNzaVRyaWdnZXJNb2RlID0gUlNTSV9UUklHR0VSRURfVVBPTl9CRUxPV19USFJFU0hPTEQ7Ci0JCXBBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOwotCQlwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOy8vZGVmYXVsdCBsaXN0ZW4gY291bnQ7Ci0JCXBBZC0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7ICAvLyBCU1NfSU5GUkEgb3IgQlNTX0FESE9DIG9yIEJTU19NT05JVE9SCi0JCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dBS0VVUF9OT1cpOwotCi0JCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSBNQ1NfQVVUTzsKLQl9Ci0KLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JcEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotcEFkLT5icnQzMHh4QmFuTWN1Q21kID0gRkFMU0U7Ci1wQWQtPmIzMDkwRVNwZWNpYWxDaGlwID0gRkFMU0U7Ci0vL0tIIERlYnVnOnRoZSBmb2xsb3dpbmcgbXVzdCBiZSByZW1vdmVkCi1wQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlPTM7Ci1wQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4Rm9yY2VBU1BNVGVzdD0wOwotcEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNPTE7Ci0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQkvLyBnbG9iYWwgdmFyaWFibGVzIG1YWFhYIHVzZWQgaW4gTUFDIHByb3RvY29sIHN0YXRlIG1hY2hpbmVzCi0JT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1JFQ0VJVkVfRFRJTSk7Ci0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQURIT0NfT04pOwotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0lORlJBX09OKTsKLQotCS8vIFBIWSBzcGVjaWZpY2F0aW9uCi0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFBIWV8xMUJHX01JWEVEOwkJLy8gZGVmYXVsdCBQSFkgbW9kZQotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCk7ICAvLyBDQ0sgdXNlIExPTkcgcHJlYW1ibGUKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyB1c2VyIGRlc2lyZWQgcG93ZXIgbW9kZQotCQlwQWQtPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUNBTTsKLQkJcEFkLT5TdGFDZmcuV2luZG93c0JhdHRlcnlQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotCQlwQWQtPlN0YUNmZy5iV2luZG93c0FDQ0FNRW5hYmxlID0gRkFMU0U7Ci0KLQkJUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKFN0YVF1aWNrUmVzcG9uZUZvclJhdGVVcEV4ZWMpLCBwQWQsIEZBTFNFKTsKLQkJcEFkLT5TdGFDZmcuU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXJSdW5uaW5nID0gRkFMU0U7Ci0KLQkJLy8gUGF0Y2ggZm9yIE5kdGVzdAotCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKLQotCQlwQWQtPlN0YUNmZy5iSHdSYWRpbyAgPSBUUlVFOyAvLyBEZWZhdWx0IEhhcmR3YXJlIFJhZGlvIHN0YXR1cyBpcyBPbgotCQlwQWQtPlN0YUNmZy5iU3dSYWRpbyAgPSBUUlVFOyAvLyBEZWZhdWx0IFNvZnR3YXJlIFJhZGlvIHN0YXR1cyBpcyBPbgotCQlwQWQtPlN0YUNmZy5iUmFkaW8gICAgPSBUUlVFOyAvLyBiSHdSYWRpbyAmJiBiU3dSYWRpbwotCQlwQWQtPlN0YUNmZy5iSGFyZHdhcmVSYWRpbyA9IEZBTFNFOwkJLy8gRGVmYXVsdCBpcyBPRkYKLQkJcEFkLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID0gRkFMU0U7CQkvLyBEZWZhdWx0IG5vIHNob3cKLQotCQkvLyBOaXRybyBtb2RlIGNvbnRyb2wKLQkJcEFkLT5TdGFDZmcuYkF1dG9SZWNvbm5lY3QgPSBUUlVFOwotCi0JCS8vIFNhdmUgdGhlIGluaXQgdGltZSBhcyBsYXN0IHNjYW4gdGltZSwgdGhlIHN5c3RlbSBzaG91bGQgZG8gc2NhbiBhZnRlciAyIHNlY29uZHMuCi0JCS8vIFRoaXMgcGF0Y2ggaXMgZm9yIGRyaXZlciB3YWtlIHVwIGZyb20gc3RhbmRieSBtb2RlLCBzeXN0ZW0gd2lsbCBkbyBzY2FuIHJpZ2h0IGF3YXkuCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSk7Ci0JCWlmIChwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUgPiAxMCAqIE9TX0haKQotCQkJcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lIC09ICgxMCAqIE9TX0haKTsKLQotCQlOZGlzWmVyb01lbW9yeShwQWQtPm5pY2tuYW1lLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJc3ByaW50ZigoUFNUUklORykgcEFkLT5uaWNrbmFtZSwgIlJUMjg2MFNUQSIpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MpLCBwQWQsIEZBTFNFKTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCXBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFOwotCQlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gRkFMU0U7Ci0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOwotCi0KLQkJcEFkLT5TdGFDZmcuYkF1dG9Db25uZWN0QnlCc3NpZCA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5CZWFjb25Mb3N0VGltZSA9IEJFQUNPTl9MT1NUX1RJTUU7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLQkJcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZUxlbiA9IDA7Ci0JCXBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZyA9IEZBTFNFOwotCQlwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0ID0gRkFMU0U7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JLy8gRGVmYXVsdCBmb3IgZXh0cmEgaW5mb3JtYXRpb24gaXMgbm90IHZhbGlkCi0JcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotCi0JLy8gRGVmYXVsdCBDb25maWcgY2hhbmdlIGZsYWcKLQlwQWQtPmJDb25maWdDaGFuZ2VkID0gRkFMU0U7Ci0KLQkvLwotCS8vIHBhcnQgSUlJLiBBUCBjb25maWd1cmF0aW9ucwotCS8vCi0KLQotCS8vCi0JLy8gcGFydCBJVi4gb3RoZXJzCi0JLy8KLQkvLyBkeW5hbWljIEJCUCBSNjY6c2Vuc2liaXR5IHR1bmluZyB0byBvdmVyY29tZSBiYWNrZ3JvdW5kIG5vaXNlCi0JcEFkLT5CYnBUdW5pbmcuYkVuYWJsZSAgICAgICAgICAgICAgICA9IFRSVUU7Ci0JcEFkLT5CYnBUdW5pbmcuRmFsc2VDY2FMb3dlclRocmVzaG9sZCA9IDEwMDsKLQlwQWQtPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkID0gNTEyOwotCXBBZC0+QmJwVHVuaW5nLlI2NkRlbHRhICAgICAgICAgICAgICAgPSA0OwotCXBBZC0+TWxtZS5iRW5hYmxlQXV0b0FudGVubmFDaGVjayA9IFRSVUU7Ci0KLQkvLwotCS8vIEFsc28gaW5pdGlhbCBSNjZDdXJyZW50VmFsdWUsIFJUVVNCUmVzdW1lTXNkdVRyYW5zbWlzc2lvbiBtaWdodCB1c2UgdGhpcyB2YWx1ZS4KLQkvLyBpZiBub3QgaW5pdGlhbCB0aGlzIHZhbHVlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDAuCi0JLy8KLQlwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUgPSAweDM4OwotCi0JcEFkLT5CYnA5NCA9IEJCUFI5NF9ERUZBVUxUOwotCXBBZC0+QmJwRm9yQ0NLID0gRkFMU0U7Ci0KLQkvLyBEZWZhdWx0IGlzIEZBTFNFIGZvciB0ZXN0IGJpdCAxCi0JLy9wQWQtPmJUZXN0MSA9IEZBTFNFOwotCi0JLy8gaW5pdGlhbGl6ZSBNQUMgdGFibGUgYW5kIGFsbG9jYXRlIHNwaW4gbG9jawotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1hY1RhYiwgc2l6ZW9mKE1BQ19UQUJMRSkpOwotCUluaXRpYWxpemVRdWV1ZUhlYWRlcigmcEFkLT5NYWNUYWIuTWNhc3RQc1F1ZXVlKTsKLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCS8vUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPlJFQ0JBVGltZXIsIFJFQ0JBVGltZXJUaW1lb3V0LCBwQWQsIFRSVUUpOwotCS8vUlRNUFNldFRpbWVyKCZwQWQtPlJFQ0JBVGltZXIsIFJFT1JERVJfRVhFQ19JTlRWKTsKLQotI2lmZGVmIFJBTElOS19BVEUKLQlOZGlzWmVyb01lbW9yeSgmcEFkLT5hdGUsIHNpemVvZihBVEVfSU5GTykpOwotCXBBZC0+YXRlLk1vZGUgPSBBVEVfU1RPUDsKLQlwQWQtPmF0ZS5UeENvdW50ID0gMjAwOy8qIHRvIGV4Y2VlZCBUWF9SSU5HX1NJWkUgLi4uICovCi0JcEFkLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCXBBZC0+YXRlLlJGRnJlcU9mZnNldCA9IDA7Ci0JcEFkLT5hdGUuVHhMZW5ndGggPSAxMDI0OwotCXBBZC0+YXRlLlR4V0kuU2hvcnRHSSA9IDA7Ly8gTE9ORyBHSSA6IDgwMCBucwotCXBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9IE1PREVfQ0NLOwotCXBBZC0+YXRlLlR4V0kuTUNTID0gMzsKLQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfMjA7Ci0JcEFkLT5hdGUuQ2hhbm5lbCA9IDE7Ci0JcEFkLT5hdGUuUUlEID0gUUlEX0FDX0JFOwotCXBBZC0+YXRlLkFkZHIxWzBdID0gMHgwMDsKLQlwQWQtPmF0ZS5BZGRyMVsxXSA9IDB4MTE7Ci0JcEFkLT5hdGUuQWRkcjFbMl0gPSAweDIyOwotCXBBZC0+YXRlLkFkZHIxWzNdID0gMHhBQTsKLQlwQWQtPmF0ZS5BZGRyMVs0XSA9IDB4QkI7Ci0JcEFkLT5hdGUuQWRkcjFbNV0gPSAweENDOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+YXRlLkFkZHIyLCBwQWQtPmF0ZS5BZGRyMSwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPmF0ZS5BZGRyMywgcEFkLT5hdGUuQWRkcjEsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JcEFkLT5hdGUuYlJ4RkVSID0gMDsKLQlwQWQtPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7Ci0JcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JcEFkLT5hdGUuYkZXTG9hZGluZyA9IEZBTFNFOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCXBBZC0+YXRlLlR4U3RhdHVzID0gMDsKLQlwQWQtPmF0ZS5BdGVQaWQgPSBUSFJFQURfUElEX0lOSVRfVkFMVUU7Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQotCXBBZC0+Q29tbW9uQ2ZnLmJXaUZpVGVzdCA9IEZBTFNFOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgIHBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1SVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCQlpZiAoIHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSA9PSBBTlRfRklYX0FOVDIpCi0JCXsKLQkJCXBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQgPSAxOwotCQkJcEFkLT5SeEFudC5QYWlyMVNlY29uZGFyeVJ4QW50ID0gMDsKLQkJfQotCQllbHNlIC8vIERlZmF1bHQKLQkJewotCQkJcEFkLT5SeEFudC5QYWlyMVByaW1hcnlSeEFudCA9IDA7Ci0JCQlwQWQtPlJ4QW50LlBhaXIxU2Vjb25kYXJ5UnhBbnQgPSAxOwotCQl9Ci0JCXBBZC0+UnhBbnQuRXZhbHVhdGVQZXJpb2QgPSAwOwotCQlwQWQtPlJ4QW50LlJjdlBrdE51bVdoZW5FdmFsdWF0ZSA9IDA7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCXBBZC0+UnhBbnQuUGFpcjFBdmdSc3NpWzBdID0gcEFkLT5SeEFudC5QYWlyMUF2Z1Jzc2lbMV0gPSAwOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIEFQX0FOVEVOTkFfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLSBVc2VyQ2ZnSW5pdFxuIikpOwotfQotCi0vLyBJUlFMID0gUEFTU0lWRV9MRVZFTAotVUNIQVIgQnRvSChTVFJJTkcgY2gpCi17Ci0JaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHJldHVybiAoY2ggLSAnMCcpOyAgICAgICAgLy8gSGFuZGxlIG51bWVyYWxzCi0JaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHJldHVybiAoY2ggLSAnQScgKyAweEEpOyAgLy8gSGFuZGxlIGNhcGl0b2wgaGV4IGRpZ2l0cwotCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSByZXR1cm4gKGNoIC0gJ2EnICsgMHhBKTsgIC8vIEhhbmRsZSBzbWFsbCBoZXggZGlnaXRzCi0JcmV0dXJuKDI1NSk7Ci19Ci0KLS8vCi0vLyAgRlVOQ1RJT046IEF0b0goY2hhciAqLCBVQ0hBUiAqLCBpbnQpCi0vLwotLy8gIFBVUlBPU0U6ICBDb252ZXJ0cyBhc2NpaSBzdHJpbmcgdG8gbmV0d29yayBvcmRlciBoZXgKLS8vCi0vLyAgUEFSQU1FVEVSUzoKLS8vICAgIHNyYyAgICAtIHBvaW50ZXIgdG8gaW5wdXQgYXNjaWkgc3RyaW5nCi0vLyAgICBkZXN0ICAgLSBwb2ludGVyIHRvIG91dHB1dCBoZXgKLS8vICAgIGRlc3RsZW4gLSBzaXplIG9mIGRlc3QKLS8vCi0vLyAgQ09NTUVOVFM6Ci0vLwotLy8gICAgMiBhc2NpaSBieXRlcyBtYWtlIGEgaGV4IGJ5dGUgc28gbXVzdCBwdXQgMXN0IGFzY2lpIGJ5dGUgb2YgcGFpcgotLy8gICAgaW50byB1cHBlciBuaWJibGUgYW5kIDJuZCBhc2NpaSBieXRlIG9mIHBhaXIgaW50byBsb3dlciBuaWJibGUuCi0vLwotLy8gSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotdm9pZCBBdG9IKFBTVFJJTkcgc3JjLCBQVUNIQVIgZGVzdCwgaW50IGRlc3RsZW4pCi17Ci0JUFNUUklORyBzcmNwdHI7Ci0JUFVDSEFSIGRlc3RUZW1wOwotCi0Jc3JjcHRyID0gc3JjOwotCWRlc3RUZW1wID0gKFBVQ0hBUikgZGVzdDsKLQotCXdoaWxlKGRlc3RsZW4tLSkKLQl7Ci0JCSpkZXN0VGVtcCA9IEJ0b0goKnNyY3B0cisrKSA8PCA0OyAgICAvLyBQdXQgMXN0IGFzY2lpIGJ5dGUgaW4gdXBwZXIgbmliYmxlLgotCQkqZGVzdFRlbXAgKz0gQnRvSCgqc3JjcHRyKyspOyAgICAgIC8vIEFkZCAybmQgYXNjaWkgYnl0ZSB0byBhYm92ZS4KLQkJZGVzdFRlbXArKzsKLQl9Ci19Ci0KLQotLy8rKytNYXJrIGJ5IHNoaWFuZywgbm90IHVzZSBub3csIG5lZWQgdG8gcmVtb3ZlIGFmdGVyIGNvbmZpcm0KLS8vLS0tTWFyayBieSBzaGlhbmcsIG5vdCB1c2Ugbm93LCBuZWVkIHRvIHJlbW92ZSBhZnRlciBjb25maXJtCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUluaXQgdGltZXIgb2JqZWN0cwotCi0JQXJndW1lbnRzOgotCQlwQWQJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBUaW1lcgkJCQlUaW1lciBzdHJ1Y3R1cmUKLQkJcFRpbWVyRnVuYwkJCUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aW1lciBleHBpcmVkCi0JCVJlcGVhdAkJCQlUdXJlIGZvciBwZXJpb2QgdGltZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEluaXRUaW1lcigKLQlJTglQUlRNUF9BREFQVEVSCQkJcEFkLAotCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKLQlJTglQVk9JRAkJCQkJcFRpbWVyRnVuYywKLQlJTglQVk9JRAkJCQkJcERhdGEsCi0JSU4JQk9PTEVBTgkJCQkJUmVwZWF0KQotewotCS8vCi0JLy8gU2V0IFZhbGlkIHRvIFRSVUUgZm9yIGxhdGVyIHVzZWQuCi0JLy8gSXQgd2lsbCBjcmFzaCBpZiB3ZSBjYW5jZWwgYSB0aW1lciBvciBzZXQgYSB0aW1lcgotCS8vIHRoYXQgd2UgaGF2ZW4ndCBpbml0aWFsaXplIGJlZm9yZS4KLQkvLwotCXBUaW1lci0+VmFsaWQgICAgICA9IFRSVUU7Ci0KLQlwVGltZXItPlBlcmlvZGljVHlwZSA9IFJlcGVhdDsKLQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKLQlwVGltZXItPmNvb2tpZSA9IChVTE9ORykgcERhdGE7Ci0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotCXBUaW1lci0+cEFkID0gcEFkOwotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi0KLQlSVE1QX09TX0luaXRfVGltZXIocEFkLCAmcFRpbWVyLT5UaW1lck9iaiwJcFRpbWVyRnVuYywgKFBWT0lEKSBwVGltZXIpOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlJbml0IHRpbWVyIG9iamVjdHMKLQotCUFyZ3VtZW50czoKLQkJcFRpbWVyCQkJCVRpbWVyIHN0cnVjdHVyZQotCQlWYWx1ZQkJCQlUaW1lciB2YWx1ZSBpbiBtaWxsaXNlY29uZHMKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QU2V0VGltZXIoCi0JSU4JUFJBTElOS19USU1FUl9TVFJVQ1QJcFRpbWVyLAotCUlOCVVMT05HCQkJCQlWYWx1ZSkKLXsKLQlpZiAocFRpbWVyLT5WYWxpZCkKLQl7Ci0JCXBUaW1lci0+VGltZXJWYWx1ZSA9IFZhbHVlOwotCQlwVGltZXItPlN0YXRlICAgICAgPSBGQUxTRTsKLQkJaWYgKHBUaW1lci0+UGVyaW9kaWNUeXBlID09IFRSVUUpCi0JCXsKLQkJCXBUaW1lci0+UmVwZWF0ID0gVFJVRTsKLQkJCVJUTVBfU2V0UGVyaW9kaWNUaW1lcigmcFRpbWVyLT5UaW1lck9iaiwgVmFsdWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcFRpbWVyLT5SZXBlYXQgPSBGQUxTRTsKLQkJCVJUTVBfT1NfQWRkX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUFNldFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUluaXQgdGltZXIgb2JqZWN0cwotCi0JQXJndW1lbnRzOgotCQlwVGltZXIJCQkJVGltZXIgc3RydWN0dXJlCi0JCVZhbHVlCQkJCVRpbWVyIHZhbHVlIGluIG1pbGxpc2Vjb25kcwotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCQlUbyB1c2UgdGhpcyByb3V0aW5lLCBtdXN0IGNhbGwgUlRNUEluaXRUaW1lciBiZWZvcmUuCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lECVJUTVBNb2RUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKQotewotCUJPT0xFQU4JQ2FuY2VsOwotCi0JaWYgKHBUaW1lci0+VmFsaWQpCi0JewotCQlwVGltZXItPlRpbWVyVmFsdWUgPSBWYWx1ZTsKLQkJcFRpbWVyLT5TdGF0ZSAgICAgID0gRkFMU0U7Ci0JCWlmIChwVGltZXItPlBlcmlvZGljVHlwZSA9PSBUUlVFKQotCQl7Ci0JCQlSVE1QQ2FuY2VsVGltZXIocFRpbWVyLCAmQ2FuY2VsKTsKLQkJCVJUTVBTZXRUaW1lcihwVGltZXIsIFZhbHVlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfT1NfTW9kX1RpbWVyKCZwVGltZXItPlRpbWVyT2JqLCBWYWx1ZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUE1vZFRpbWVyIGZhaWxlZCwgVGltZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZSFcbiIpKTsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNhbmNlbCB0aW1lciBvYmplY3RzCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5vbmUKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQkxLikgVG8gdXNlIHRoaXMgcm91dGluZSwgbXVzdCBjYWxsIFJUTVBJbml0VGltZXIgYmVmb3JlLgotCQkyLikgUmVzZXQgTklDIHRvIGluaXRpYWwgc3RhdGUgQVMgSVMgc3lzdGVtIGJvb3QgdXAgdGltZS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUENhbmNlbFRpbWVyKAotCUlOCVBSQUxJTktfVElNRVJfU1RSVUNUCXBUaW1lciwKLQlPVVQJQk9PTEVBTgkJCQkJKnBDYW5jZWxsZWQpCi17Ci0JaWYgKHBUaW1lci0+VmFsaWQpCi0JewotCQlpZiAocFRpbWVyLT5TdGF0ZSA9PSBGQUxTRSkKLQkJCXBUaW1lci0+UmVwZWF0ID0gRkFMU0U7Ci0KLQkJUlRNUF9PU19EZWxfVGltZXIoJnBUaW1lci0+VGltZXJPYmosIHBDYW5jZWxsZWQpOwotCi0JCWlmICgqcENhbmNlbGxlZCA9PSBUUlVFKQotCQkJcFRpbWVyLT5TdGF0ZSA9IFRSVUU7Ci0KLSNpZmRlZiBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVAotCQkvLyBXZSBuZWVkIHRvIGdvLXRocm91Z2ggdGhlIFRpbWVyUSB0byBmaW5kb3V0IHRoaXMgdGltZXIgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGlmCi0JCS8vCQlpdCdzIHN0aWxsIHdhaXRpbmcgZm9yIGV4ZWN1dGlvbi4KLQkJUnRtcFRpbWVyUVJlbW92ZShwVGltZXItPnBBZCwgcFRpbWVyKTsKLSNlbmRpZiAvLyBSVE1QX1RJTUVSX1RBU0tfU1VQUE9SVCAvLwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVF9FUlIoKCJSVE1QQ2FuY2VsVGltZXIgZmFpbGVkLCBUaW1lciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplIVxuIikpOwotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJU2V0IExFRCBTdGF0dXMKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlTdGF0dXMJCQkJCUxFRCBTdGF0dXMKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBTZXRMRUQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlTdGF0dXMpCi17Ci0JLy9VTE9ORwkJCWRhdGE7Ci0JVUNIQVIJCQlIaWdoQnl0ZSA9IDA7Ci0JVUNIQVIJCQlMb3dCeXRlOwotCUJPT0xFQU4JCQliSWdub3JlZCA9IEZBTFNFOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8qCi0JCUluIEFURSBtb2RlIG9mIFJUMjg2MCBBUC9TVEEsIHdlIGhhdmUgZXJhc2VkIDgwNTEgZmlybXdhcmUuCi0JCVNvIExFRCBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBBVEUgaXMgcnVubmluZy4KLQkqLwotCWlmICghSVNfUlQzNTcyKHBBZCkpCi0JewotCQlpZiAoQVRFX09OKHBBZCkpCi0JCQlyZXR1cm47Ci0JfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCUxvd0J5dGUgPSBwQWQtPkxlZENudGwuZmllbGQuTGVkTW9kZSYweDdmOwotCXN3aXRjaCAoU3RhdHVzKQotCXsKLQkJY2FzZSBMRURfTElOS19ET1dOOgotCQkJSGlnaEJ5dGUgPSAweDIwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9MSU5LX1VQOgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJCQlIaWdoQnl0ZSA9IDB4YTA7Ci0JCQllbHNlCi0JCQkJSGlnaEJ5dGUgPSAweDYwOwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBMRURfUkFESU9fT046Ci0JCQlIaWdoQnl0ZSA9IDB4MjA7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9IQUxUOgotCQkJTG93Qnl0ZSA9IDA7IC8vIERyaXZlciBzZXRzIE1BQyByZWdpc3RlciBhbmQgTUFDIGNvbnRyb2xzIExFRAotCQljYXNlIExFRF9SQURJT19PRkY6Ci0JCQlIaWdoQnl0ZSA9IDA7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9XUFM6Ci0JCQlIaWdoQnl0ZSA9IDB4MTA7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTAsIDB4ZmYsIExvd0J5dGUsIEhpZ2hCeXRlKTsKLQkJCWJyZWFrOwotCQljYXNlIExFRF9PTl9TSVRFX1NVUlZFWToKLQkJCUhpZ2hCeXRlID0gMHgwODsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg1MCwgMHhmZiwgTG93Qnl0ZSwgSGlnaEJ5dGUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVEX1BPV0VSX1VQOgotCQkJSGlnaEJ5dGUgPSAweDA0OwotCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDUwLCAweGZmLCBMb3dCeXRlLCBIaWdoQnl0ZSk7Ci0JCQlicmVhazsKLSNpZmRlZiBSQUxJTktfQVRFCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJSVE1QU2V0TEVEOjpVbmtub3duIFN0YXR1cyAlZFxuIiwgU3RhdHVzKSk7Ci0JCQlicmVhazsKLQl9Ci0KLSAgICAvLwotCS8vIEtlZXAgTEVEIHN0YXR1cyBmb3IgTEVEIFNpdGVTdXJ2ZXkgbW9kZS4KLQkvLyBBZnRlciBTaXRlU3VydmV5LCB3ZSB3aWxsIHNldCB0aGUgTEVEIG1vZGUgdG8gcHJldmlvdXMgc3RhdHVzLgotCS8vCi0JaWYgKChTdGF0dXMgIT0gTEVEX09OX1NJVEVfU1VSVkVZKSAmJiAoU3RhdHVzICE9IExFRF9QT1dFUl9VUCkgJiYgKGJJZ25vcmVkID09IEZBTFNFKSkKLQkJcEFkLT5MZWRTdGF0dXMgPSBTdGF0dXM7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QU2V0TEVEOjpNb2RlPSVkLEhpZ2hCeXRlPTB4JTAyeCxMb3dCeXRlPTB4JTAyeFxuIiwgcEFkLT5MZWRDbnRsLmZpZWxkLkxlZE1vZGUsIEhpZ2hCeXRlLCBMb3dCeXRlKSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTZXQgTEVEIFNpZ25hbCBTdHJlZ3RoCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJCQkJCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJRGJtCQkJCQkJU2lnbmFsIFN0cmVndGgKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotCU5vdGU6Ci0JCUNhbiBiZSBydW4gb24gYW55IElSUUwgbGV2ZWwuCi0KLQkJQWNjb3JkaW5nIHRvIE1pY3Jvc29mdCBaZXJvIENvbmZpZyBXaXJlbGVzcyBTaWduYWwgU3RyZWd0aCBkZWZpbml0aW9uIGFzIGJlbG93cy4KLQkJPD0gLTkwICBObyBTaWduYWwKLQkJPD0gLTgxICBWZXJ5IExvdwotCQk8PSAtNzEgIExvdwotCQk8PSAtNjcgIEdvb2QKLQkJPD0gLTU3ICBWZXJ5IEdvb2QKLQkJID4gLTU3ICBFeGNlbGxlbnQKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBTZXRTaWduYWxMRUQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pCi17Ci0JVUNIQVIJCW5MZWQgPSAwOwotCi0JaWYgKHBBZC0+TGVkQ250bC5maWVsZC5MZWRNb2RlID09IExFRF9NT0RFX1NJR05BTF9TVFJFR1RIKQotCXsKLQkJaWYgKERibSA8PSAtOTApCi0JCQluTGVkID0gMDsKLQkJZWxzZSBpZiAoRGJtIDw9IC04MSkKLQkJCW5MZWQgPSAxOwotCQllbHNlIGlmIChEYm0gPD0gLTcxKQotCQkJbkxlZCA9IDM7Ci0JCWVsc2UgaWYgKERibSA8PSAtNjcpCi0JCQluTGVkID0gNzsKLQkJZWxzZSBpZiAoRGJtIDw9IC01NykKLQkJCW5MZWQgPSAxNTsKLQkJZWxzZQotCQkJbkxlZCA9IDMxOwotCi0JCS8vCi0JCS8vIFVwZGF0ZSBTaWduYWwgU3RyZWd0aCB0byBmaXJtd2FyZSBpZiBjaGFuZ2VkLgotCQkvLwotCQlpZiAocEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCAhPSBuTGVkKQotCQl7Ci0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NTEsIDB4ZmYsIG5MZWQsIHBBZC0+TGVkQ250bC5maWVsZC5Qb2xhcml0eSk7Ci0JCQlwQWQtPkxlZEluZGljYXRvclN0cmVuZ3RoID0gbkxlZDsKLQkJfQotCX0KLX0KLQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlFbmFibGUgUlgKLQotCUFyZ3VtZW50czoKLQkJcEFkCQkJCQkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMIDw9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQlCZWZvcmUgRW5hYmxlIFJYLCBtYWtlIHN1cmUgeW91IGhhdmUgZW5hYmxlZCBJbnRlcnJ1cHQuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QRW5hYmxlUnhUeCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCkKLXsKLS8vCVdQRE1BX0dMT19DRkdfU1RSVUMJR2xvQ2ZnOwotLy8JVUxPTkcJaSA9IDA7Ci0JVUlOVDMyIHJ4X2ZpbHRlcl9mbGFnOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBFbmFibGVSeFR4XG4iKSk7Ci0KLQkvLyBFbmFibGUgUnggRE1BLgotCVJUMjhYWERNQUVuYWJsZShwQWQpOwotCi0JLy8gZW5hYmxlIFJYIG9mIE1BQyBibG9jawotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfQVApCi0JewotCQlyeF9maWx0ZXJfZmxhZyA9IEFQTk9STUFMOwotCi0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7ICAgICAvLyBlbmFibGUgUlggb2YgRE1BIGJsb2NrCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykKLQkJCXJ4X2ZpbHRlcl9mbGFnID0gUFNQWExJTks7Ci0JCWVsc2UKLQkJCXJ4X2ZpbHRlcl9mbGFnID0gU1RBTk9STUFMOyAgICAgLy8gU3RhaW9uIG5vdCBkcm9wIGNvbnRyb2wgZnJhbWUgd2lsbCBmYWlsIFdpRmkgQ2VydGlmaWNhdGlvbi4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCByeF9maWx0ZXJfZmxhZyk7Ci0JfQotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCAweGMpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBSVE1QRW5hYmxlUnhUeFxuIikpOwotfQotCi0KLS8vKysrQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIG9zL2xpbnV4L3J0X21haW5fZGV2LmMKLXZvaWQgQ2ZnSW5pdEhvb2soUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JcEFkLT5iQnJvYWRDb21IVCA9IFRSVUU7Ci19Ci0KLQotaW50IHJ0Mjh4eF9pbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgcERlZmF1bHRNYWMsCi0JSU4gUFNUUklORyBwSG9zdE5hbWUpCi17Ci0JVUlOVAkJCQkJaW5kZXg7Ci0JVUNIQVIJCQkJCVRtcFBoeTsKLQlORElTX1NUQVRVUwkJCQlTdGF0dXM7Ci0JVUlOVDMyCQkJCQlNYWNDc3IwID0gMDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFJUTVBfTUFDX1BDSQotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCS8vIElmIGRpcnZlciBkb2Vzbid0IHdha2UgdXAgZmlybXdhcmUgaGVyZSwKLQkvLyBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uCi0JLy8gUlQyODYwIFBDSQotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpICYmCi0JCU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCXsKLQkJQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKLQkJCUFzaWNGb3JjZVdha2V1cChwQWQsIFRSVUUpOwotCQlBdXRvV2FrZXVwQ2ZnLndvcmQgPSAwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVRPX1dBS0VVUF9DRkcsIEF1dG9XYWtldXBDZmcud29yZCk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpOwotCX0KLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCS8vIHJlc2V0IEFkYXB0ZXIgZmxhZ3MKLQlSVE1QX0NMRUFSX0ZMQUdTKHBBZCk7Ci0KLQkvLyBJbml0IEJzc1RhYiAmIENoYW5uZWxJbmZvIHRhYmJsZXMgZm9yIGF1dG8gY2hhbm5lbCBzZWxlY3QuCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkvLyBBbGxvY2F0ZSBCQSBSZW9yZGVyaW5nIG1lbW9yeQotCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfaW5pdChwQWQsIE1BWF9SRU9SREVSSU5HX01QRFVfTlVNKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIE1ha2Ugc3VyZSBNQUMgZ2V0cyByZWFkeS4KLQlpbmRleCA9IDA7Ci0JZG8KLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX0NTUjAsICZNYWNDc3IwKTsKLQkJcEFkLT5NQUNWZXJzaW9uID0gTWFjQ3NyMDsKLQotCQlpZiAoKHBBZC0+TUFDVmVyc2lvbiAhPSAweDAwKSAmJiAocEFkLT5NQUNWZXJzaW9uICE9IDB4RkZGRkZGRkYpKQotCQkJYnJlYWs7Ci0KLQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JfSB3aGlsZSAoaW5kZXgrKyA8IDEwMCk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTUFDX0NTUjAgIFsgVmVyOlJldj0weCUwOHhdXG4iLCBwQWQtPk1BQ1ZlcnNpb24pKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotCS8qSXZlcnNvbiBwYXRjaCBQQ0lFIEwxIGlzc3VlIHRvIG1ha2Ugc3VyZSB0aGF0IGRyaXZlciBjYW4gYmUgcmVhZCx3cml0ZSAsQkJQIGFuZCBSRiByZWdpc3RlciAgYXQgcGNpZSBMLjEgbGV2ZWwgKi8KLQlpZiAoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSYmT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEFVWF9DVFJMLCAmTWFjQ3NyMCk7Ci0JCU1hY0NzcjAgfD0gMHg0MDI7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEFVWF9DVFJMLCBNYWNDc3IwKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNDc3IwKSk7Ci0JfQotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCi0JLy8gVG8gZml4IGRyaXZlciBkaXNhYmxlL2VuYWJsZSBoYW5nIGlzc3VlIHdoZW4gcmFkaW8gb2ZmCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUFdSX1BJTl9DRkcsIDB4Mik7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkvLyBEaXNhYmxlIERNQQotCVJUMjhYWERNQURpc2FibGUocEFkKTsKLQotCi0JLy8gTG9hZCA4MDUxIGZpcm13YXJlCi0JU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDTG9hZEZpcm13YXJlIGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJZ290byBlcnIxOwotCX0KLQotCU5JQ0xvYWRSYXRlU3dpdGNoaW5nUGFyYW1zKHBBZCk7Ci0KLQkvLyBEaXNhYmxlIGludGVycnVwdHMgaGVyZSB3aGljaCBpcyBhcyBzb29uIGFzIHBvc3NpYmxlCi0JLy8gVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIG5ldmVyIGJlIHRydWUuIFdlIG1pZ2h0IGNvbnNpZGVyIHRvIHJlbW92ZSBpdCBsYXRlcgotI2lmZGVmIFJUTVBfTUFDX1BDSQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCi0JewotCQlSVE1QX0FTSUNfSU5URVJSVVBUX0RJU0FCTEUocEFkKTsKLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlTdGF0dXMgPSBSVE1QQWxsb2NUeFJ4UmluZ01lbW9yeShwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIlJUTVBBbGxvY0RNQU1lbW9yeSBmYWlsZWQsIFN0YXR1c1s9MHglMDh4XVxuIiwgU3RhdHVzKSk7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KLQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKLQotCS8vIGluaXRpYWxpemUgTUxNRQotCS8vCi0KLQlTdGF0dXMgPSBSdG1wTWdtdFRhc2tJbml0KHBBZCk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycjI7Ci0KLQlTdGF0dXMgPSBNbG1lSW5pdChwQWQpOwotCWlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UX0VSUigoIk1sbWVJbml0IGZhaWxlZCwgU3RhdHVzWz0weCUwOHhdXG4iLCBTdGF0dXMpKTsKLQkJZ290byBlcnIyOwotCX0KLQotCS8vIEluaXRpYWxpemUgcEFkLT5TdGFDZmcsIHBBZC0+QXBDZmcsIHBBZC0+Q29tbW9uQ2ZnIHRvIG1hbnVmYWN0dXJlIGRlZmF1bHQKLQkvLwotCVVzZXJDZmdJbml0KHBBZCk7Ci0JU3RhdHVzID0gUnRtcE5ldFRhc2tJbml0KHBBZCk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIGVycjM7Ci0KLS8vCUNPUFlfTUFDX0FERFIocEFkLT5BcENmZy5NQlNTSURbYXBpZHhdLkJzc2lkLCBuZXRpZi0+aHdhZGRyKTsKLS8vCXBBZC0+YkZvcmNlUHJpbnRUWCA9IFRSVUU7Ci0KLQlDZmdJbml0SG9vayhwQWQpOwotCi0KLSNpZmRlZiBCTE9DS19ORVRfSUYKLQlpbml0YmxvY2tRdWV1ZVRhYihwQWQpOwotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlNZWFzdXJlUmVxVGFiSW5pdChwQWQpOwotCVRwY1JlcVRhYkluaXQocEFkKTsKLQotCS8vCi0JLy8gSW5pdCB0aGUgaGFyZHdhcmUsIHdlIG5lZWQgdG8gaW5pdCBhc2ljIGJlZm9yZSByZWFkIHJlZ2lzdHJ5LCBvdGhlcndpc2UgbWFjIHJlZ2lzdGVyIHdpbGwgYmUgcmVzZXQKLQkvLwotCVN0YXR1cyA9IE5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDSW5pdGlhbGl6ZUFkYXB0ZXIgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQlpZiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyMzsKLQl9Ci0KLQkvLyBSZWFkIHBhcmFtZXRlcnMgZnJvbSBDb25maWcgRmlsZQotCVN0YXR1cyA9IFJUTVBSZWFkUGFyYW1ldGVyc0hvb2socEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIxLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0JaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiTklDUmVhZFJlZ1BhcmFtZXRlcnMgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsU3RhdHVzKSk7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy9Jbml0IEJhIENhcGFiaWxpdHkgcGFyYW1ldGVycy4KLS8vCVJUMjhYWF9CQV9JTklUKHBBZCk7Ci0JcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1wZHVEZW5zaXR5ID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BbXNkdUVuYWJsZTsKLQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5NaW1vUHMgPSAoVVNIT1JUKXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZTsKLQkvLyBVUGRhdGEgdG8gSFQgSUUKLQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QcyA9IChVU0hPUlQpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1NUFNtb2RlOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gKFVTSE9SVClwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuQW1zZHVTaXplOwotCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHkgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLk1wZHVEZW5zaXR5OwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gYWZ0ZXIgcmVhZGluZyBSZWdpc3RyeSwgd2Ugbm93IGtub3cgaWYgaW4gQVAgbW9kZSBvciBTVEEgbW9kZQotCi0JLy8gTG9hZCA4MDUxIGZpcm13YXJlOyBjcmFzaCB3aGVuIEZXIGltYWdlIG5vdCBleGlzdGVudAotCS8vIFN0YXR1cyA9IE5JQ0xvYWRGaXJtd2FyZShwQWQpOwotCS8vIGlmIChTdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkvLyAgICBicmVhazsKLQotCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIyLiBQaHkgTW9kZSA9ICVkXG4iLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0KLQkvLyBXZSBzaG91bGQgcmVhZCBFRVBST00gZm9yIGFsbCBjYXNlcy4gIHJ0Mjg2MGIKLQlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIChQVUNIQVIpcERlZmF1bHRNYWMpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIjMuIFBoeSBNb2RlID0gJWRcbiIsIHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUpKTsKLQotCU5JQ0luaXRBc2ljRnJvbUVFUFJPTShwQWQpOyAvL3J0Mjg2MGIKLQotCS8vIFNldCBQSFkgdG8gYXBwcm9wcmlhdGUgbW9kZQotCVRtcFBoeSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IDB4ZmY7Ci0JUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCVNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBObyB2YWxpZCBjaGFubmVscy4KLQlpZiAocEFkLT5DaGFubmVsTGlzdE51bSA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiV3JvbmcgY29uZmlndXJhdGlvbi4gTm8gdmFsaWQgY2hhbm5lbCBmb3VuZC4gQ2hlY2sgXCJDb250cnlDb2RlXCIgYW5kIFwiQ2hhbm5lbEdlb2dyYXBoeVwiIHNldHRpbmcuXG4iKSk7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiTUNTIFNldCA9ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwKLSAgICAgICAgICAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFsyXSwKLSAgICAgICAgICAgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFszXSwgcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFs0XSkpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JLy9Jbml0IFJUMzB4eCBSRlJlZ2lzdGVycyBhZnRlciByZWFkIFJGSUMgdHlwZSBmcm9tIEVFUFJPTQotCU5JQ0luaXRSRlJlZ2lzdGVycyhwQWQpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi0KLQotLy8JCUFQSW5pdGlhbGl6ZShwQWQpOwotCi0jaWZkZWYgSUtBTk9TX1ZYXzFYMAotCVZSX0lLQU5PU19GUF9Jbml0KHBBZC0+QXBDZmcuQnNzaWROdW0sIHBBZC0+UGVybWFuZW50QWRkcmVzcyk7Ci0jZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLwotCi0JCS8vCi0JLy8gSW5pdGlhbGl6ZSBSRiByZWdpc3RlciB0byBkZWZhdWx0IHZhbHVlCi0JLy8KLQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQotCS8vIDgwNTEgZmlybXdhcmUgcmVxdWlyZSB0aGUgc2lnbmFsIGR1cmluZyBib290aW5nIHRpbWUuCi0JLy8yMDA4LzExLzI4OktIIG1hcmtlZCB0aGUgZm9sbG93aW5nIGNvZGVzIHRvIHBhdGNoIEZyZXF1ZW5jeSBvZmZzZXQgYnVnCi0JLy9Bc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4NzIsIDB4RkYsIDB4MDAsIDB4MDApOwotCi0JaWYgKHBBZCAmJiAoU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQotCXsKLQkJLy8KLQkJLy8gVW5kbyBldmVyeXRoaW5nIGlmIGl0IGZhaWxlZAotCQkvLwotCQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCQl7Ci0vLwkJCU5kaXNNRGVyZWdpc3RlckludGVycnVwdCgmcEFkLT5JbnRlcnJ1cHQpOwotCQkJUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKTsKLQkJfQotLy8JCVJUTVBGcmVlQWRhcHRlcihwQWQpOyAvLyB3ZSB3aWxsIGZyZWUgaXQgaW4gZGlzY29ubmVjdCgpCi0JfQotCWVsc2UgaWYgKHBBZCkKLQl7Ci0JCS8vIE1pY3Jvc29mdCBIQ1QgcmVxdWlyZSBkcml2ZXIgc2VuZCBhIGRpc2Nvbm5lY3QgZXZlbnQgYWZ0ZXIgZHJpdmVyIGluaXRpYWxpemF0aW9uLgotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotLy8JCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVEaXNjb25uZWN0ZWQ7Ci0JCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX01FRElBX1NUQVRFX0NIQU5HRSk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBCIVxuIikpOwotCi0KLQl9Ly8gZW5kIG9mIGVsc2UKLQotCi0JLy8gU2V0IHVwIHRoZSBNYWMgYWRkcmVzcwotCVJ0bXBPU05ldERldkFkZHJTZXQocEFkLT5uZXRfZGV2LCAmcEFkLT5DdXJyZW50QWRkcmVzc1swXSk7Ci0KLQkvLyBWYXJpb3VzIEFQIGZ1bmN0aW9uIGluaXQKLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQgZm9yIGluZnJvbWluZyBpbnRlcmZhY2UgdXAuCi0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfSU5URVJGQUNFX1VQLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLQlEQkdQUklOVF9TKFN0YXR1cywgKCI8PT09PSBydDI4eHhfaW5pdCwgU3RhdHVzPSV4XG4iLCBTdGF0dXMpKTsKLQotCXJldHVybiBUUlVFOwotCi0KLWVycjQ6Ci1lcnIzOgotCU1sbWVIYWx0KHBBZCk7Ci1lcnIyOgotCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKLWVycjE6Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlvc19mcmVlX21lbShwQWQsIHBBZC0+bXBkdV9ibGtfcG9vbC5tZW0pOyAvLyBmcmVlIEJBIHBvb2wKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIHNoYWxsIG5vdCBzZXQgcHJpdiB0byBOVUxMIGhlcmUgYmVjYXVzZSB0aGUgcHJpdiBkaWRuJ3QgYmVlbiBmcmVlIHlldC4KLQkvL25ldF9kZXYtPnByaXYgPSAwOwotI2lmZGVmIElORl9BTUFaT05fU0UKLWVycjA6Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9TRSAvLwotI2lmZGVmIFNUCi1lcnIwOgotI2VuZGlmIC8vIFNUIC8vCi0KLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIhISEgcnQyOHh4IEluaXRpYWxpemVkIGZhaWwgISEhXG4iKSk7Ci0JcmV0dXJuIEZBTFNFOwotfQotLy8tLS1BZGQgYnkgc2hpYW5nLCBtb3ZlIGZyb20gb3MvbGludXgvcnRfbWFpbl9kZXYuYwotCi0KLXN0YXRpYyBJTlQgUnRtcENoaXBPcHNSZWdpc3RlcigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlpbmZUeXBlKQotewotCVJUTVBfQ0hJUF9PUAkqcENoaXBPcHMgPSAmcEFkLT5jaGlwT3BzOwotCWludCBzdGF0dXM7Ci0KLQltZW1zZXQocENoaXBPcHMsIDAsIHNpemVvZihSVE1QX0NISVBfT1ApKTsKLQotCS8qIHNldCBlZXByb20gcmVsYXRlZCBob29rIGZ1bmN0aW9ucyAqLwotCXN0YXR1cyA9IFJ0bXBDaGlwT3BzRWVwcm9tSG9vayhwQWQsIGluZlR5cGUpOwotCi0JLyogc2V0IG1jdSByZWxhdGVkIGhvb2sgZnVuY3Rpb25zICovCi0Jc3dpdGNoKGluZlR5cGUpCi0JewotI2lmZGVmIFJUTVBfUENJX1NVUFBPUlQKLQkJY2FzZSBSVE1QX0RFVl9JTkZfUENJOgotCQkJcENoaXBPcHMtPmxvYWRGaXJtd2FyZSA9IFJ0bXBBc2ljTG9hZEZpcm13YXJlOwotCQkJcENoaXBPcHMtPmVyYXNlRmlybXdhcmUgPSBSdG1wQXNpY0VyYXNlRmlybXdhcmU7Ci0JCQlwQ2hpcE9wcy0+c2VuZENvbW1hbmRUb01jdSA9IFJ0bXBBc2ljU2VuZENvbW1hbmRUb01jdTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIFJUTVBfUENJX1NVUFBPUlQgLy8KLQotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0KLUlOVCBSdG1wUmFEZXZDdHJsSW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSVE1QX0lORl9UWVBFIGluZlR5cGUpCi17Ci0JLy9WT0lECSpoYW5kbGU7Ci0KLQkvLyBBc3NpZ24gdGhlIGludGVyZmFjZSB0eXBlLiBXZSBuZWVkIHVzZSBpdCB3aGVuIGRvIHJlZ2lzdGVyL0VFUFJPTSBhY2Nlc3MuCi0JcEFkLT5pbmZUeXBlID0gaW5mVHlwZTsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkLT5PcE1vZGUgPSBPUE1PREVfU1RBOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNUQSBEcml2ZXIgdmVyc2lvbi0lc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OKSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0JUnRtcENoaXBPcHNSZWdpc3RlcihwQWQsIGluZlR5cGUpOwotCi0jaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCi17Ci0JZXh0ZXJuIEJPT0xFQU4gUlRNUF9DYXJkSW5mb1JlYWQoUFJUTVBfQURBUFRFUiBwQWQpOwotCi0JLy8gZmluZCBpdHMgcHJvZmlsZSBwYXRoCi0JcEFkLT5NQ19Sb3dJRCA9IC0xOyAvLyB1c2UgZGVmYXVsdCBwcm9maWxlIHBhdGgKLQlSVE1QX0NhcmRJbmZvUmVhZChwQWQpOwotCi0JaWYgKHBBZC0+TUNfUm93SUQgPT0gLTEpCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCXN0cmNweShwQWQtPk1DX0ZpbGVOYW1lLCBTVEFfUFJPRklMRV9QQVRIKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1DPiBST1cgPSAlZCwgUEFUSCA9ICVzXG4iLCBwQWQtPk1DX1Jvd0lELCBwQWQtPk1DX0ZpbGVOYW1lKSk7Ci19Ci0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0KLQlyZXR1cm4gMDsKLX0KLQotCi1CT09MRUFOIFJ0bXBSYURldkN0cmxFeGl0KElOIFJUTVBfQURBUFRFUiAqcEFkKQotewotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotZXh0ZXJuIFVJTlQ4ICBNQ19DYXJkVXNlZFtNQVhfTlVNX09GX01VTFRJUExFX0NBUkRdOwotCi0JaWYgKChwQWQtPk1DX1Jvd0lEID49IDApICYmIChwQWQtPk1DX1Jvd0lEIDw9IE1BWF9OVU1fT0ZfTVVMVElQTEVfQ0FSRCkpCi0JCU1DX0NhcmRVc2VkW3BBZC0+TUNfUm93SURdID0gMDsgLy8gbm90IGNsZWFyIE1BQyBhZGRyZXNzCi0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0KLQotCVJUTVBGcmVlQWRhcHRlcihwQWQpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gbm90IHlldCBzdXBwb3J0IE1CU1MKLVBORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCVBORVRfREVWIGRldl9wID0gTlVMTDsKLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJZGV2X3AgPSBwQWQtPm5ldF9kZXY7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JQVNTRVJUKGRldl9wKTsKLQlyZXR1cm4gZGV2X3A7IC8qIHJldHVybiBvbmUgb2YgTUJTUyAqLwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vcnRtcF9tY3UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfbWN1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjc4NWE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29tbW9uL3J0bXBfbWN1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX21jdS5jCi0KLQlBYnN0cmFjdDoKLQlNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0JLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vZmlybXdhcmUuaCIKLQotLy8jZGVmaW5lIEJJTl9JTl9GSUxFIC8qIHVzZSAqLmJpbiBmaXJtd2FyZSAqLwotCi0KLS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKLSNkZWZpbmUgRklSTVdBUkVJTUFHRV9NQVhfTEVOR1RICTB4MjAwMAotI2RlZmluZSBGSVJNV0FSRUlNQUdFX0xFTkdUSAkJCShzaXplb2YgKEZpcm13YXJlSW1hZ2UpIC8gc2l6ZW9mKFVDSEFSKSkKLSNkZWZpbmUgRklSTVdBUkVfTUFKT1JfVkVSU0lPTgkJMAotCi0jZGVmaW5lIEZJUk1XQVJFSU1BR0VWMV9MRU5HVEgJCTB4MTAwMAotI2RlZmluZSBGSVJNV0FSRUlNQUdFVjJfTEVOR1RICQkweDEwMDAKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBGSVJNV0FSRV9NSU5PUl9WRVJTSU9OCQkyCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLWNvbnN0IHVuc2lnbmVkIHNob3J0IGNjaXR0XzE2VGFibGVbXSA9IHsKLQkweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MEE1LCAweDYwQzYsIDB4NzBFNywKLQkweDgxMDgsIDB4OTEyOSwgMHhBMTRBLCAweEIxNkIsIDB4QzE4QywgMHhEMUFELCAweEUxQ0UsIDB4RjFFRiwKLQkweDEyMzEsIDB4MDIxMCwgMHgzMjczLCAweDIyNTIsIDB4NTJCNSwgMHg0Mjk0LCAweDcyRjcsIDB4NjJENiwKLQkweDkzMzksIDB4ODMxOCwgMHhCMzdCLCAweEEzNUEsIDB4RDNCRCwgMHhDMzlDLCAweEYzRkYsIDB4RTNERSwKLQkweDI0NjIsIDB4MzQ0MywgMHgwNDIwLCAweDE0MDEsIDB4NjRFNiwgMHg3NEM3LCAweDQ0QTQsIDB4NTQ4NSwKLQkweEE1NkEsIDB4QjU0QiwgMHg4NTI4LCAweDk1MDksIDB4RTVFRSwgMHhGNUNGLCAweEM1QUMsIDB4RDU4RCwKLQkweDM2NTMsIDB4MjY3MiwgMHgxNjExLCAweDA2MzAsIDB4NzZENywgMHg2NkY2LCAweDU2OTUsIDB4NDZCNCwKLQkweEI3NUIsIDB4QTc3QSwgMHg5NzE5LCAweDg3MzgsIDB4RjdERiwgMHhFN0ZFLCAweEQ3OUQsIDB4QzdCQywKLQkweDQ4QzQsIDB4NThFNSwgMHg2ODg2LCAweDc4QTcsIDB4MDg0MCwgMHgxODYxLCAweDI4MDIsIDB4MzgyMywKLQkweEM5Q0MsIDB4RDlFRCwgMHhFOThFLCAweEY5QUYsIDB4ODk0OCwgMHg5OTY5LCAweEE5MEEsIDB4QjkyQiwKLQkweDVBRjUsIDB4NEFENCwgMHg3QUI3LCAweDZBOTYsIDB4MUE3MSwgMHgwQTUwLCAweDNBMzMsIDB4MkExMiwKLQkweERCRkQsIDB4Q0JEQywgMHhGQkJGLCAweEVCOUUsIDB4OUI3OSwgMHg4QjU4LCAweEJCM0IsIDB4QUIxQSwKLQkweDZDQTYsIDB4N0M4NywgMHg0Q0U0LCAweDVDQzUsIDB4MkMyMiwgMHgzQzAzLCAweDBDNjAsIDB4MUM0MSwKLQkweEVEQUUsIDB4RkQ4RiwgMHhDREVDLCAweEREQ0QsIDB4QUQyQSwgMHhCRDBCLCAweDhENjgsIDB4OUQ0OSwKLQkweDdFOTcsIDB4NkVCNiwgMHg1RUQ1LCAweDRFRjQsIDB4M0UxMywgMHgyRTMyLCAweDFFNTEsIDB4MEU3MCwKLQkweEZGOUYsIDB4RUZCRSwgMHhERkRELCAweENGRkMsIDB4QkYxQiwgMHhBRjNBLCAweDlGNTksIDB4OEY3OCwKLQkweDkxODgsIDB4ODFBOSwgMHhCMUNBLCAweEExRUIsIDB4RDEwQywgMHhDMTJELCAweEYxNEUsIDB4RTE2RiwKLQkweDEwODAsIDB4MDBBMSwgMHgzMEMyLCAweDIwRTMsIDB4NTAwNCwgMHg0MDI1LCAweDcwNDYsIDB4NjA2NywKLQkweDgzQjksIDB4OTM5OCwgMHhBM0ZCLCAweEIzREEsIDB4QzMzRCwgMHhEMzFDLCAweEUzN0YsIDB4RjM1RSwKLQkweDAyQjEsIDB4MTI5MCwgMHgyMkYzLCAweDMyRDIsIDB4NDIzNSwgMHg1MjE0LCAweDYyNzcsIDB4NzI1NiwKLQkweEI1RUEsIDB4QTVDQiwgMHg5NUE4LCAweDg1ODksIDB4RjU2RSwgMHhFNTRGLCAweEQ1MkMsIDB4QzUwRCwKLQkweDM0RTIsIDB4MjRDMywgMHgxNEEwLCAweDA0ODEsIDB4NzQ2NiwgMHg2NDQ3LCAweDU0MjQsIDB4NDQwNSwKLQkweEE3REIsIDB4QjdGQSwgMHg4Nzk5LCAweDk3QjgsIDB4RTc1RiwgMHhGNzdFLCAweEM3MUQsIDB4RDczQywKLQkweDI2RDMsIDB4MzZGMiwgMHgwNjkxLCAweDE2QjAsIDB4NjY1NywgMHg3Njc2LCAweDQ2MTUsIDB4NTYzNCwKLQkweEQ5NEMsIDB4Qzk2RCwgMHhGOTBFLCAweEU5MkYsIDB4OTlDOCwgMHg4OUU5LCAweEI5OEEsIDB4QTlBQiwKLQkweDU4NDQsIDB4NDg2NSwgMHg3ODA2LCAweDY4MjcsIDB4MThDMCwgMHgwOEUxLCAweDM4ODIsIDB4MjhBMywKLQkweENCN0QsIDB4REI1QywgMHhFQjNGLCAweEZCMUUsIDB4OEJGOSwgMHg5QkQ4LCAweEFCQkIsIDB4QkI5QSwKLQkweDRBNzUsIDB4NUE1NCwgMHg2QTM3LCAweDdBMTYsIDB4MEFGMSwgMHgxQUQwLCAweDJBQjMsIDB4M0E5MiwKLQkweEZEMkUsIDB4RUQwRiwgMHhERDZDLCAweENENEQsIDB4QkRBQSwgMHhBRDhCLCAweDlERTgsIDB4OERDOSwKLQkweDdDMjYsIDB4NkMwNywgMHg1QzY0LCAweDRDNDUsIDB4M0NBMiwgMHgyQzgzLCAweDFDRTAsIDB4MENDMSwKLQkweEVGMUYsIDB4RkYzRSwgMHhDRjVELCAweERGN0MsIDB4QUY5QiwgMHhCRkJBLCAweDhGRDksIDB4OUZGOCwKLQkweDZFMTcsIDB4N0UzNiwgMHg0RTU1LCAweDVFNzQsIDB4MkU5MywgMHgzRUIyLCAweDBFRDEsIDB4MUVGMAotfTsKLSNkZWZpbmUgQnl0ZUNSQzE2KHYsIGNyYykgXAotCSh1bnNpZ25lZCBzaG9ydCkoKGNyYyA8PCA4KSBeICBjY2l0dF8xNlRhYmxlWygoY3JjID4+IDgpIF4gKHYpKSAmIDI1NV0pCi0KLXVuc2lnbmVkIGNoYXIgQml0UmV2ZXJzZSh1bnNpZ25lZCBjaGFyIHgpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciBUZW1wPTA7Ci0JZm9yKGk9MDsgOyBpKyspCi0JewotCQlpZih4ICYgMHg4MCkJVGVtcCB8PSAweDgwOwotCQlpZihpPT03KQkJYnJlYWs7Ci0JCXgJPDw9IDE7Ci0JCVRlbXAgPj49IDE7Ci0JfQotCXJldHVybiBUZW1wOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQllcmFzZSA4MDUxIGZpcm13YXJlIGltYWdlIGluIE1BQyBBU0lDCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFJ0bXBBc2ljRXJhc2VGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVTE9ORyBpOwotCi0JZm9yKGk9MDsgaTxNQVhfRklSTVdBUkVfSU1BR0VfU0laRTsgaSs9NCkKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlMb2FkIDgwNTEgZmlybXdhcmUgZmlsZSBpbnRvIE1BQyBBU0lDCi0KLQlBcmd1bWVudHM6Ci0JCUFkYXB0ZXIJCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCU5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICBmaXJtd2FyZSBpbWFnZSBsb2FkIG9rCi0JCU5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICBpbWFnZSBub3QgZm91bmQKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBSdG1wQXNpY0xvYWRGaXJtd2FyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLSNpZmRlZiBCSU5fSU5fRklMRQotI2RlZmluZSBOSUNMRl9ERUZBVUxUX1VTRSgpCVwKLQlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IFRSVUU7IFwKLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJXMgLSBVc2UgZGVmYXVsdCBmaXJtd2FyZSFcbiIsIF9fRlVOQ1RJT05fXykpOwotCi0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JUFVDSEFSCQkJc3JjOwotCVJUTVBfT1NfRkQJCXNyY2Y7Ci0JSU5UCQkJCXJldHZhbCwgaTsKLQlQVUNIQVIJCQlwRmlybXdhcmVJbWFnZTsKLQlJTlQJCQkJRmlsZUxlbmd0aCA9IDA7Ci0JVUlOVDMyCQkJTWFjUmVnOwotCVVMT05HCQkJSW5kZXg7Ci0JVUxPTkcJCQlmaXJtOwotCUJPT0xFQU4JCQlmbGdfZGVmYXVsdF9maXJtX3VzZSA9IEZBTFNFOwotCVJUTVBfT1NfRlNfSU5GTwlvc0ZTSW5mbzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOwotCi0JLyogaW5pdCAqLwotCXBGaXJtd2FyZUltYWdlID0gTlVMTDsKLQlzcmMgPSBSVE1QX0ZJUk1XQVJFX0ZJTEVfTkFNRTsKLQotCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCi0JcEFkLT5GaXJtd2FyZVZlcnNpb24gPSAoRklSTVdBUkVfTUFKT1JfVkVSU0lPTiA8PCA4KSArIFwKLQkJCQkJCSAgIEZJUk1XQVJFX01JTk9SX1ZFUlNJT047Ci0KLQotCS8qIGFsbG9jYXRlIGZpcm13YXJlIGJ1ZmZlciAqLwotCXBGaXJtd2FyZUltYWdlID0ga21hbGxvYyhNQVhfRklSTVdBUkVfSU1BR0VfU0laRSwgTUVNX0FMTE9DX0ZMQUcpOwotCWlmIChwRmlybXdhcmVJbWFnZSA9PSBOVUxMKQotCXsKLQkJLyogYWxsb2NhdGUgZmFpbCwgdXNlIGRlZmF1bHQgZmlybXdhcmUgYXJyYXkgaW4gZmlybXdhcmUuaCAqLwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtIEFsbG9jYXRlIG1lbW9yeSBmYWlsIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCU5JQ0xGX0RFRkFVTFRfVVNFKCk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIGFsbG9jYXRlIG9rISB6ZXJvIHRoZSBmaXJtd2FyZSBidWZmZXIgKi8KLQkJbWVtc2V0KHBGaXJtd2FyZUltYWdlLCAweDAwLCBNQVhfRklSTVdBUkVfSU1BR0VfU0laRSk7Ci0JfSAvKiBFbmQgb2YgaWYgKi8KLQotCi0JLyogaWYgb2ssIHJlYWQgZmlybXdhcmUgZmlsZSBmcm9tICouYmluIGZpbGUgKi8KLQlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gRkFMU0UpCi0JewotCQlkbwotCQl7Ci0JCQkvKiBvcGVuIHRoZSBiaW4gZmlsZSAqLwotCQkJc3JjZiA9IFJ0bXBPU0ZpbGVPcGVuKHNyYywgT19SRE9OTFksIDApOwotCi0JCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyAtIEVycm9yIG9wZW5pbmcgZmlsZSAlc1xuIiwgX19GVU5DVElPTl9fLCBzcmMpKTsKLQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwotCQkJCWJyZWFrOwotCQkJfQotCi0KLQkJCS8qIHJlYWQgdGhlIGZpcm13YXJlIGZyb20gdGhlIGZpbGUgKi5iaW4gKi8KLQkJCUZpbGVMZW5ndGggPSBSdG1wT1NGaWxlUmVhZChzcmNmLCBwRmlybXdhcmVJbWFnZSwgTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpOwotCQkJaWYgKEZpbGVMZW5ndGggIT0gTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGVycm9yIGZpbGUgbGVuZ3RoICg9JWQpIGluIFJUMjg2MEFQLkJJTlxuIiwKLQkJCQkJICAgX19GVU5DVElPTl9fLCBGaWxlTGVuZ3RoKSk7Ci0JCQkJTklDTEZfREVGQVVMVF9VU0UoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlQVUNIQVIgcHRyID0gcEZpcm13YXJlSW1hZ2U7Ci0JCQkJVVNIT1JUIGNyYyA9IDB4ZmZmZjsKLQotCi0JCQkJLyogY2FsY3VsYXRlIGZpcm13YXJlIENSQyAqLwotCQkJCWZvcihpPTA7IGk8KE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTIpOyBpKyssIHB0cisrKQotCQkJCQljcmMgPSBCeXRlQ1JDMTYoQml0UmV2ZXJzZSgqcHRyKSwgY3JjKTsKLQkJCQkvKiBFbmQgb2YgZm9yICovCi0KLQkJCQlpZiAoKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdICE9IFwKLQkJCQkJCQkJKFVDSEFSKUJpdFJldmVyc2UoKFVDSEFSKShjcmM+PjgpKSkgfHwKLQkJCQkJKHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTFdICE9IFwKLQkJCQkJCQkJKFVDSEFSKUJpdFJldmVyc2UoKFVDSEFSKWNyYykpKQotCQkJCXsKLQkJCQkJLyogQ1JDIGZhaWwgKi8KLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IENSQyA9IDB4JTAyeCAweCUwMnggIgotCQkJCQkJICAgImVycm9yLCBzaG91bGQgYmUgMHglMDJ4IDB4JTAyeFxuIiwKLQkJCQkJCSAgIF9fRlVOQ1RJT05fXywKLQkJCQkJCSAgIHBGaXJtd2FyZUltYWdlW01BWF9GSVJNV0FSRV9JTUFHRV9TSVpFLTJdLAotCQkJCQkJICAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtMV0sCi0JCQkJCQkgICAoVUNIQVIpKGNyYz4+OCksIChVQ0hBUikoY3JjKSkpOwotCQkJCQlOSUNMRl9ERUZBVUxUX1VTRSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLyogZmlybXdhcmUgaXMgb2sgKi8KLQkJCQkJcEFkLT5GaXJtd2FyZVZlcnNpb24gPSBcCi0JCQkJCQkocEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtNF0gPDwgOCkgKwotCQkJCQkJcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM107Ci0KLQkJCQkJLyogY2hlY2sgaWYgZmlybXdhcmUgdmVyc2lvbiBvZiB0aGUgZmlsZSBpcyB0b28gb2xkICovCi0JCQkJCWlmICgocEFkLT5GaXJtd2FyZVZlcnNpb24pIDwgXAotCQkJCQkJCQkJCQkoKEZJUk1XQVJFX01BSk9SX1ZFUlNJT04gPDwgOCkgKwotCQkJCQkJCQkJCQkgRklSTVdBUkVfTUlOT1JfVkVSU0lPTikpCi0JCQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBmaXJtd2FyZSB2ZXJzaW9uIHRvbyBvbGQhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCQkJCU5JQ0xGX0RFRkFVTFRfVVNFKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSAvKiBFbmQgb2YgaWYgKi8KLQkJCQl9IC8qIEVuZCBvZiBpZiAqLwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsCi0JCQkJCQkgKCJOSUNMb2FkRmlybXdhcmU6IENSQyBvaywgdmVyPSVkLiVkXG4iLAotCQkJCQkJICBwRmlybXdhcmVJbWFnZVtNQVhfRklSTVdBUkVfSU1BR0VfU0laRS00XSwKLQkJCQkJCSAgcEZpcm13YXJlSW1hZ2VbTUFYX0ZJUk1XQVJFX0lNQUdFX1NJWkUtM10pKTsKLQkJCX0gLyogRW5kIG9mIGlmIChGaWxlTGVuZ3RoID09IE1BWF9GSVJNV0FSRV9JTUFHRV9TSVpFKSAqLwotCQkJYnJlYWs7Ci0JCX0gd2hpbGUoVFJVRSk7Ci0KLQkJLyogY2xvc2UgZmlybXdhcmUgZmlsZSAqLwotCQlpZiAoSVNfRklMRV9PUEVOX0VSUihzcmNmKSkKLQkJCTsKLQkJZWxzZQotCQl7Ci0JCQlyZXR2YWwgPSBSdG1wT1NGaWxlQ2xvc2Uoc3JjZik7Ci0JCQlpZiAocmV0dmFsKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyogd3JpdGUgZmlybXdhcmUgdG8gQVNJQyAqLwotCWlmIChmbGdfZGVmYXVsdF9maXJtX3VzZSA9PSBUUlVFKQotCXsKLQkJLyogdXNlIGRlZmF1bHQgZmltZXdhcmUsIGZyZWUgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCQlpZiAocEZpcm13YXJlSW1hZ2UgIT0gTlVMTCkKLQkJCWtmcmVlKHBGaXJtd2FyZUltYWdlKTsKLQkJLyogRW5kIG9mIGlmICovCi0KLQkJLyogdXNlIGRlZmF1bHQgKi5iaW4gYXJyYXkgKi8KLQkJcEZpcm13YXJlSW1hZ2UgPSBGaXJtd2FyZUltYWdlOwotCQlGaWxlTGVuZ3RoID0gc2l6ZW9mKEZpcm13YXJlSW1hZ2UpOwotCX0gLyogRW5kIG9mIGlmICovCi0KLQkvKiBlbmFibGUgSG9zdCBwcm9ncmFtIHJhbSB3cml0ZSBzZWxlY3Rpb24gKi8KLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MTAwMDApOwotCi0JZm9yKGk9MDsgaTxGaWxlTGVuZ3RoOyBpKz00KQotCXsKLQkJZmlybSA9IHBGaXJtd2FyZUltYWdlW2ldICsKLQkJCSAgIChwRmlybXdhcmVJbWFnZVtpKzNdIDw8IDI0KSArCi0JCQkgICAocEZpcm13YXJlSW1hZ2VbaSsyXSA8PCAxNikgKwotCQkJICAgKHBGaXJtd2FyZUltYWdlW2krMV0gPDwgOCk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgRklSTVdBUkVfSU1BR0VfQkFTRSArIGksIGZpcm0pOwotCX0gLyogRW5kIG9mIGZvciAqLwotCi0JUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX1NZU19DVFJMLCAweDAwMDAwKTsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBQQkZfU1lTX0NUUkwsIDB4MDAwMDEpOwotCi0JLyogaW5pdGlhbGl6ZSBCQlAgUi9XIGFjY2VzcyBhZ2VudCAqLwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9CQlBfQUdFTlQsIDApOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgMCk7Ci0KLQlpZiAoZmxnX2RlZmF1bHRfZmlybV91c2UgPT0gRkFMU0UpCi0JewotCQkvKiB1c2UgZmlsZSBmaXJtd2FyZSwgZnJlZSBhbGxvY2F0ZWQgYnVmZmVyICovCi0JCWlmIChwRmlybXdhcmVJbWFnZSAhPSBOVUxMKQotCQkJa2ZyZWUocEZpcm13YXJlSW1hZ2UpOwotCQkvKiBFbmQgb2YgaWYgKi8KLQl9IC8qIEVuZCBvZiBpZiAqLwotCi0JUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgRkFMU0UpOwotI2Vsc2UKLQotCU5ESVNfU1RBVFVTCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCVBVQ0hBUgkJCXBGaXJtd2FyZUltYWdlOwotCVVMT05HCQkJRmlsZUxlbmd0aCwgSW5kZXg7Ci0JLy9VTE9ORwkJCWZpcm07Ci0JVUlOVDMyCQkJTWFjUmVnID0gMDsKLQlVSU5UMzIJCQlWZXJzaW9uID0gKHBBZC0+TUFDVmVyc2lvbiA+PiAxNik7Ci0KLQlwRmlybXdhcmVJbWFnZSA9IEZpcm13YXJlSW1hZ2U7Ci0JRmlsZUxlbmd0aCA9IHNpemVvZihGaXJtd2FyZUltYWdlKTsKLQotCS8vIE5ldyA4ayBieXRlIGZpcm13YXJlIHNpemUgZm9yIFJUMzA3MS9SVDMwNzIKLQkvL0RCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlVzYiBDaGlwXG4iKSk7Ci0JaWYgKEZJUk1XQVJFSU1BR0VfTEVOR1RIID09IEZJUk1XQVJFSU1BR0VfTUFYX0xFTkdUSCkKLQkvL1RoZSBmaXJtd2FyZSBpbWFnZSBjb25zaXN0cyBvZiB0d28gcGFydHMuIE9uZSBpcyB0aGUgb3JpZ2lhbmwgYW5kIHRoZSBvdGhlciBpcyB0aGUgbmV3LgotCS8vVXNlIFNlY29uZCBQYXJ0Ci0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlpZiAoKFZlcnNpb24gPT0gMHgyODYwKSB8fCBJU19SVDMwOTAocEFkKXx8SVNfUlQzMzkwKHBBZCkpCi0JCXsKLQkJCXBGaXJtd2FyZUltYWdlID0gRmlybXdhcmVJbWFnZTsKLQkJCUZpbGVMZW5ndGggPSBGSVJNV0FSRUlNQUdFX0xFTkdUSDsKLQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJLSDogYmluIGZpbGUgc2hvdWxkIGJlIDhLQi5cbiIpKTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQotCVJUTVBfV1JJVEVfRklSTVdBUkUocEFkLCBwRmlybXdhcmVJbWFnZSwgRmlsZUxlbmd0aCk7Ci0KLSNlbmRpZgotCi0JLyogY2hlY2sgaWYgTUNVIGlzIHJlYWR5ICovCi0JSW5kZXggPSAwOwotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIFBCRl9TWVNfQ1RSTCwgJk1hY1JlZyk7Ci0KLQkJaWYgKE1hY1JlZyAmIDB4ODApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCX0gd2hpbGUgKEluZGV4KysgPCAxMDAwKTsKLQotICAgIGlmIChJbmRleCA+PSAxMDAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiTklDTG9hZEZpcm13YXJlOiBNQ1UgaXMgbm90IHJlYWR5XG5cblxuIikpOwotCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gJXMgKHN0YXR1cz0lZClcbiIsIF9fRlVOQ1RJT05fXywgU3RhdHVzKSk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi0KLUlOVCBSdG1wQXNpY1NlbmRDb21tYW5kVG9NY3UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJCSBDb21tYW5kLAotCUlOIFVDSEFSCQkgVG9rZW4sCi0JSU4gVUNIQVIJCSBBcmcwLAotCUlOIFVDSEFSCQkgQXJnMSkKLXsKLQlIT1NUX0NNRF9DU1JfU1RSVUMJSDJNQ21kOwotCUgyTV9NQUlMQk9YX1NUUlVDCUgyTU1haWxib3g7Ci0JVUxPTkcJCQkJaSA9IDA7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUkFMSU5LX0FURQotCXN0YXRpYyBVSU5UMzIgaiA9IDA7Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIDMwOTBGIHBvd2VyIHNvbHV0aW9uIDMgaGFzIGh3IGxpbWl0YXRpb24gdGhhdCBuZWVkcyB0byBiYW4gYWxsIG1jdSBjb21tYW5kCi0JLy8gd2hlbiBmaXJtd2FyZSBpcyBpbiByYWRpbyBzdGF0ZS4gIEZvciBvdGhlciBjaGlwIGRvZXNuJ3QgaGF2ZSB0aGlzIGxpbWl0YXRpb24uCi0JaWYgKCgoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKQotCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA9PSAzKQotCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IFRSVUUpKQotCXsKLQkJUlRNUF9TRU1fTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJaWYgKChwQWQtPmJydDMweHhCYW5NY3VDbWQgPT0gVFJVRSkKLQkJCSYmIChDb21tYW5kICE9IFdBS0VfTUNVX0NNRCkgJiYgKENvbW1hbmQgIT0gUkZPRkZfTUNVX0NNRCkpCi0JCXsKLQkJCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBCYW4gTWN1IENtZCAleCBpbiBzbGVlcCBtb2RlXG4iLCAgQ29tbWFuZCkpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UgaWYgKChDb21tYW5kID09IFNMRUVQX01DVV9DTUQpCi0JCQl8fChDb21tYW5kID09IFJGT0ZGX01DVV9DTUQpKQotCQl7Ci0JCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBUUlVFOwotCQl9Ci0JCWVsc2UgaWYgKENvbW1hbmQgIT0gV0FLRV9NQ1VfQ01EKQotCQl7Ci0JCQlwQWQtPmJydDMweHhCYW5NY3VDbWQgPSBGQUxTRTsKLQkJfQotCi0JCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5NY3VDbWRMb2NrKTsKLQotCX0KLQlpZiAoKChJU19SVDMwOTAocEFkKSB8fCBJU19SVDM1NzIocEFkKSB8fCBJU19SVDMzOTAocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpICYmIElTX1ZFUlNJT05fQUZURVJfRihwQWQpCi0JCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlID09IDMpCi0JCSYmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gVFJVRSkKLQkJJiYgKENvbW1hbmQgPT0gV0FLRV9NQ1VfQ01EKSkKLQl7Ci0KLQkJZG8KLQkJewotCQkJUlRNUF9JT19GT1JDRV9SRUFEMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsICZIMk1NYWlsYm94LndvcmQpOwotCQkJaWYgKEgyTU1haWxib3guZmllbGQuT3duZXIgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgyKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiQXNpY1NlbmRDb21tYW5Ub01jdTo6TWFpbCBib3ggaXMgYnVzeVxuIikpOwotCQl9IHdoaWxlKGkrKyA8IDEwMCk7Ci0KLQkJaWYgKGkgPj0gMTAwKQotCQl7Ci0JCQlEQkdQUklOVF9FUlIoKCJIMk1fTUFJTEJPWCBzdGlsbCBob2xkIGJ5IE1DVS4gY29tbWFuZCBmYWlsXG4iKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQlIMk1NYWlsYm94LmZpZWxkLk93bmVyCSAgPSAxOwkgICAvLyBwYXNzIG93bmVyc2hpcCB0byBNQ1UKLQkJSDJNTWFpbGJveC5maWVsZC5DbWRUb2tlbiA9IFRva2VuOwotCQlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKLQkJSDJNTWFpbGJveC5maWVsZC5Mb3dCeXRlICA9IEFyZzA7Ci0JCVJUTVBfSU9fRk9SQ0VfV1JJVEUzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgSDJNTWFpbGJveC53b3JkKTsKLQotCQlIMk1DbWQud29yZAkJCSAgPSAwOwotCQlIMk1DbWQuZmllbGQuSG9zdENvbW1hbmQgID0gQ29tbWFuZDsKLQkJUlRNUF9JT19GT1JDRV9XUklURTMyKHBBZCwgSE9TVF9DTURfQ1NSLCBIMk1DbWQud29yZCk7Ci0KLQotCX0KLQllbHNlCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gUENJRV9QU19TVVBQT1JUIC8vCi0JewotCWRvCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEgyTV9NQUlMQk9YX0NTUiwgJkgyTU1haWxib3gud29yZCk7Ci0JCWlmIChIMk1NYWlsYm94LmZpZWxkLk93bmVyID09IDApCi0JCQlicmVhazsKLQotCQlSVE1QdXNlY0RlbGF5KDIpOwotCX0gd2hpbGUoaSsrIDwgMTAwKTsKLQotCWlmIChpID49IDEwMCkKLQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUkFMSU5LX0FURQotCQlpZiAocEFkLT5hdGUuYkZXTG9hZGluZyA9PSBUUlVFKQotCQl7Ci0JCQkvKiByZWxvYWRpbmcgZmlybXdhcmUgd2hlbiByZWNlaXZlZCBpd3ByaXYgY21kICJBVEU9QVRFU1RPUCIgKi8KLQkJCWlmIChqID4gMCkKLQkJCXsKLQkJCQlpZiAoaiAlIDY0ICE9IDApCi0JCQkJewotCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIjIikpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcbiIpKTsKLQkJCQl9Ci0JCQkJKytqOwotCQkJfQotCQkJZWxzZSBpZiAoaiA9PSAwKQotCQkJewotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkxvYWRpbmcgZmlybXdhcmUuIFBsZWFzZSB3YWl0IGZvciBhIG1vbWVudC4uLlxuIikpOwotCQkJCSsrajsKLQkJCX0KLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQl7Ci0JCURCR1BSSU5UX0VSUigoIkgyTV9NQUlMQk9YIHN0aWxsIGhvbGQgYnkgTUNVLiBjb21tYW5kIGZhaWxcbiIpKTsKLQkJfQotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgUkFMSU5LX0FURQotCWVsc2UgaWYgKHBBZC0+YXRlLmJGV0xvYWRpbmcgPT0gVFJVRSkKLQl7Ci0JCS8qIHJlbG9hZGluZyBvZiBmaXJtd2FyZSBpcyBjb21wbGV0ZWQgKi8KLQkJcEFkLT5hdGUuYkZXTG9hZGluZyA9IEZBTFNFOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJcbiIpKTsKLQkJaiA9IDA7Ci0JfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCUgyTU1haWxib3guZmllbGQuT3duZXIJICA9IDE7CSAgIC8vIHBhc3Mgb3duZXJzaGlwIHRvIE1DVQotCUgyTU1haWxib3guZmllbGQuQ21kVG9rZW4gPSBUb2tlbjsKLQlIMk1NYWlsYm94LmZpZWxkLkhpZ2hCeXRlID0gQXJnMTsKLQlIMk1NYWlsYm94LmZpZWxkLkxvd0J5dGUgID0gQXJnMDsKLQlSVE1QX0lPX1dSSVRFMzIocEFkLCBIMk1fTUFJTEJPWF9DU1IsIEgyTU1haWxib3gud29yZCk7Ci0KLQlIMk1DbWQud29yZAkJCSAgPSAwOwotCUgyTUNtZC5maWVsZC5Ib3N0Q29tbWFuZCAgPSBDb21tYW5kOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIEhPU1RfQ01EX0NTUiwgSDJNQ21kLndvcmQpOwotCi0JaWYgKENvbW1hbmQgIT0gMHg4MCkKLQl7Ci0JfQotfQotI2lmZGVmIFBDSUVfUFNfU1VQUE9SVAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIDMwOTAgTUNVIFdha2V1cCBjb21tYW5kIG5lZWRzIG1vcmUgdGltZSB0byBiZSBzdGFibGUuCi0JLy8gQmVmb3JlIHN0YWJsZSwgZG9uJ3QgaXNzdWUgb3RoZXIgTUNVIGNvbW1hbmQgdG8gcHJldmVudCBmcm9tIGZpcm13YXJlIGVycm9yLgotCWlmICgoKElTX1JUMzA5MChwQWQpIHx8IElTX1JUMzU3MihwQWQpIHx8IElTX1JUMzM5MChwQWQpKSAmJiBJU19WRVJTSU9OX0FGVEVSX0YocEFkKSkgJiYgSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkKLQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPT0gMykKLQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5FbmFibGVOZXdQUyA9PSBUUlVFKQotCQkmJiAoQ29tbWFuZCA9PSBXQUtFX01DVV9DTUQpKQotCXsKLQkJUlRNUHVzZWNEZWxheSgyMDAwKTsKLQkJLy9QdXQgdGhpcyBpcyBhZnRlciBSRiBwcm9ncmFtbWluZy4KLQkJLy9OZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1jdUNtZExvY2spOwotCQkvL3BBZC0+YnJ0MzB4eEJhbk1jdUNtZCA9IEZBTFNFOwotCQkvL05kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFBDSUVfUFNfU1VQUE9SVCAvLwotCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9zcGVjdHJ1bS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jb21tb24vc3BlY3RydW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkMjEyNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbW1vbi9zcGVjdHJ1bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIyMSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCWFjdGlvbi5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaSBXdSAgICAyMDA4CQkgICBjcmVhdGVkIGZvciA4MDIuMTFoCi0gKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotI2luY2x1ZGUgIi4uL2FjdGlvbi5oIgotCi0KLS8qIFRoZSByZWd1bGF0b3J5IGluZm9ybWF0aW9uIGluIHRoZSBVU0EgKFVTKSAqLwotRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTiBVU0FSZWd1bGF0b3J5SW5mb1tdID0KLXsKLS8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCi0gICAgezAsCSAgICAgICAgICAgICAgICB7MCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIHswfX19LCAvLyBJbnZsaWQgZW50cnkKLSAgICB7MSwgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgIHszNiwgNDAsIDQ0LCA0OH19fSwKLSAgICB7MiwgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyMywgICAgICAgICAgIHs1MiwgNTYsIDYwLCA2NH19fSwKLSAgICB7MywgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyOSwgICAgICAgICAgIHsxNDksIDE1MywgMTU3LCAxNjF9fX0sCi0gICAgezQsICAgICAgICAgICAgICAgICB7MTEsICAgICAgICAgICAgICAgICAgMjMsICAgICAgICAgICB7MTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9fX0sCi0gICAgezUsICAgICAgICAgICAgICAgICB7NSwgICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICB7MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9fX0sCi0gICAgezYsICAgICAgICAgICAgICAgICB7MTAsICAgICAgICAgICAgICAgICAgMTQsICAgICAgICAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9fX0sCi0gICAgezcsICAgICAgICAgICAgICAgICB7MTAsICAgICAgICAgICAgICAgICAgMjcsICAgICAgICAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9fX0sCi0gICAgezgsICAgICAgICAgICAgICAgICB7NSwgICAgICAgICAgICAgICAgICAgMTcsICAgICAgICAgICB7MTEsIDEzLCAxNSwgMTcsIDE5fX19LAotICAgIHs5LCAgICAgICAgICAgICAgICAgezUsICAgICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgezExLCAxMywgMTUsIDE3LCAxOX19fSwKLSAgICB7MTAsICAgICAgICAgICAgICAgIHsyLCAgICAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgIHsyMSwgMjV9fX0sCi0gICAgezExLCAgICAgICAgICAgICAgICB7MiwgICAgICAgICAgICAgICAgICAgMzMsICAgICAgICAgICAgezIxLCAyNX19fSwKLSAgICB7MTIsICAgICAgICAgICAgICAgIHsxMSwgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExfX19Ci19OwotI2RlZmluZSBVU0FfUkVHVUxBVE9SWV9JTkZPX1NJWkUgKHNpemVvZihVU0FSZWd1bGF0b3J5SW5mbykgLyBzaXplb2YoRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTikpCi0KLQotLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gRXVyb3BlICovCi1ET1QxMV9SRUdVTEFUT1JZX0lORk9STUFUSU9OIEV1cm9wZVJlZ3VsYXRvcnlJbmZvW10gPQotewotLyogICJyZWd1bGF0b3J5IGNsYXNzIiAgIm51bWJlciBvZiBjaGFubmVscyIgICJNYXggVHggUHdyIiAgImNoYW5uZWwgbGlzdCIgKi8KLSAgICB7MCwgICAgICAgICAgICAgICAgIHswLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgezB9fX0sIC8vIEludmFsaWQgZW50cnkKLSAgICB7MSwgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgIHszNiwgNDAsIDQ0LCA0OH19fSwKLSAgICB7MiwgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgIHs1MiwgNTYsIDYwLCA2NH19fSwKLSAgICB7MywgICAgICAgICAgICAgICAgIHsxMSwgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgIHsxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH19fSwKLSAgICB7NCwgICAgICAgICAgICAgICAgIHsxMywgICAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgIHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxM319fQotfTsKLSNkZWZpbmUgRVVfUkVHVUxBVE9SWV9JTkZPX1NJWkUgKHNpemVvZihFdXJvcGVSZWd1bGF0b3J5SW5mbykgLyBzaXplb2YoRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTikpCi0KLQotLyogVGhlIHJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gaW4gSmFwYW4gKi8KLURPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT04gSmFwYW5SZWd1bGF0b3J5SW5mb1tdID0KLXsKLS8qICAicmVndWxhdG9yeSBjbGFzcyIgICJudW1iZXIgb2YgY2hhbm5lbHMiICAiTWF4IFR4IFB3ciIgICJjaGFubmVsIGxpc3QiICovCi0gICAgezAsICAgICAgICAgICAgICAgICB7MCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgIHswfX19LCAvLyBJbnZhbGlkIGVudHJ5Ci0gICAgezEsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjIsICAgICAgICAgICB7MzQsIDM4LCA0MiwgNDZ9fX0sCi0gICAgezIsICAgICAgICAgICAgICAgICB7MywgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7OCwgMTIsIDE2fX19LAotICAgIHszLCAgICAgICAgICAgICAgICAgezMsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezgsIDEyLCAxNn19fSwKLSAgICB7NCwgICAgICAgICAgICAgICAgIHszLCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs4LCAxMiwgMTZ9fX0sCi0gICAgezUsICAgICAgICAgICAgICAgICB7MywgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7OCwgMTIsIDE2fX19LAotICAgIHs2LCAgICAgICAgICAgICAgICAgezMsICAgICAgICAgICAgICAgICAgIDIyLCAgICAgICAgICAgezgsIDEyLCAxNn19fSwKLSAgICB7NywgICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODQsIDE4OCwgMTkyLCAxOTZ9fX0sCi0gICAgezgsICAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTg0LCAxODgsIDE5MiwgMTk2fX19LAotICAgIHs5LCAgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4NCwgMTg4LCAxOTIsIDE5Nn19fSwKLSAgICB7MTAsICAgICAgICAgICAgICAgIHs0LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODQsIDE4OCwgMTkyLCAxOTZ9fX0sCi0gICAgezExLCAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjIsICAgICAgICAgICB7MTg0LCAxODgsIDE5MiwgMTk2fX19LAotICAgIHsxMiwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezcsIDgsIDksIDExfX19LAotICAgIHsxMywgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezcsIDgsIDksIDExfX19LAotICAgIHsxNCwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezcsIDgsIDksIDExfX19LAotICAgIHsxNSwgICAgICAgICAgICAgICAgezQsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezcsIDgsIDksIDExfX19LAotICAgIHsxNiwgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezE3LCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX19fSwKLSAgICB7MTgsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHsxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5fX19LAotICAgIHsxOSwgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezIwLCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMTcsICAgICAgICAgICB7MTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OX19fSwKLSAgICB7MjEsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs2LCA3LCA4LCA5LCAxMCwgMTF9fX0sCi0gICAgezIyLCAgICAgICAgICAgICAgICB7NiwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7NiwgNywgOCwgOSwgMTAsIDExfX19LAotICAgIHsyMywgICAgICAgICAgICAgICAgezYsICAgICAgICAgICAgICAgICAgIDI0LCAgICAgICAgICAgezYsIDcsIDgsIDksIDEwLCAxMX19fSwKLSAgICB7MjQsICAgICAgICAgICAgICAgIHs2LCAgICAgICAgICAgICAgICAgICAyNCwgICAgICAgICAgIHs2LCA3LCA4LCA5LCAxMCwgMTF9fX0sCi0gICAgezI1LCAgICAgICAgICAgICAgICB7OCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezI2LCAgICAgICAgICAgICAgICB7OCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezI3LCAgICAgICAgICAgICAgICB7OCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezI4LCAgICAgICAgICAgICAgICB7OCwgICAgICAgICAgICAgICAgICAgMjQsICAgICAgICAgICB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezI5LCAgICAgICAgICAgICAgICB7OCwgICAgICAgICAgICAgICAgICAgMTcsICAgICAgICAgICB7MTgyLCAxODMsIDE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODl9fX0sCi0gICAgezMwLCAgICAgICAgICAgICAgICB7MTMsICAgICAgICAgICAgICAgICAgMjMsICAgICAgICAgICB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9fX0sCi0gICAgezMxLCAgICAgICAgICAgICAgICB7MSwgICAgICAgICAgICAgICAgICAgMjMsICAgICAgICAgICB7MTR9fX0sCi0gICAgezMyLCAgICAgICAgICAgICAgICB7NCwgICAgICAgICAgICAgICAgICAgMjIsICAgICAgICAgICB7NTIsIDU2LCA2MCwgNjR9fX0KLX07Ci0jZGVmaW5lIEpQX1JFR1VMQVRPUllfSU5GT19TSVpFIChzaXplb2YoSmFwYW5SZWd1bGF0b3J5SW5mbykgLyBzaXplb2YoRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTikpCi0KLQotQ0hBUiBSVE1QX0dldFR4UHdyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEhUVFJBTlNNSVRfU0VUVElORyBIVFR4TW9kZSkKLXsKLXR5cGVkZWYgc3RydWN0IF9fVFhfUFdSX0NGRwotewotCVVJTlQ4IE1vZGU7Ci0JVUlOVDggTUNTOwotCVVJTlQxNiByZXE7Ci0JVUlOVDggc2hpZnQ7Ci0JVUlOVDMyIEJpdE1hc2s7Ci19IFRYX1BXUl9DRkc7Ci0KLQlVSU5UMzIgVmFsdWU7Ci0JSU5UIElkeDsKLQlVSU5UOCBQaHlNb2RlOwotCUNIQVIgQ3VyVHhQd3I7Ci0JVUlOVDggVHhQd3JSZWYgPSAwOwotCUNIQVIgRGFsdGFQd3I7Ci0JVUxPTkcgVHhQd3JbNV07Ci0KLQotCVRYX1BXUl9DRkcgVHhQd3JDZmdbXSA9IHsKLQkJe01PREVfQ0NLLCAwLCAwLCA0LCAweDAwMDAwMGYwfSwKLQkJe01PREVfQ0NLLCAxLCAwLCAwLCAweDAwMDAwMDBmfSwKLQkJe01PREVfQ0NLLCAyLCAwLCAxMiwgMHgwMDAwZjAwMH0sCi0JCXtNT0RFX0NDSywgMywgMCwgOCwgMHgwMDAwMGYwMH0sCi0KLQkJe01PREVfT0ZETSwgMCwgMCwgMjAsIDB4MDBmMDAwMDB9LAotCQl7TU9ERV9PRkRNLCAxLCAwLCAxNiwgMHgwMDBmMDAwMH0sCi0JCXtNT0RFX09GRE0sIDIsIDAsIDI4LCAweGYwMDAwMDAwfSwKLQkJe01PREVfT0ZETSwgMywgMCwgMjQsIDB4MGYwMDAwMDB9LAotCQl7TU9ERV9PRkRNLCA0LCAxLCA0LCAweDAwMDAwMGYwfSwKLQkJe01PREVfT0ZETSwgNSwgMSwgMCwgMHgwMDAwMDAwZn0sCi0JCXtNT0RFX09GRE0sIDYsIDEsIDEyLCAweDAwMDBmMDAwfSwKLQkJe01PREVfT0ZETSwgNywgMSwgOCwgMHgwMDAwMGYwMH0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJLHtNT0RFX0hUTUlYLCAwLCAxLCAyMCwgMHgwMGYwMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCAxLCAxLCAxNiwgMHgwMDBmMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCAyLCAxLCAyOCwgMHhmMDAwMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCAzLCAxLCAyNCwgMHgwZjAwMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCA0LCAyLCA0LCAweDAwMDAwMGYwfSwKLQkJe01PREVfSFRNSVgsIDUsIDIsIDAsIDB4MDAwMDAwMGZ9LAotCQl7TU9ERV9IVE1JWCwgNiwgMiwgMTIsIDB4MDAwMGYwMDB9LAotCQl7TU9ERV9IVE1JWCwgNywgMiwgOCwgMHgwMDAwMGYwMH0sCi0JCXtNT0RFX0hUTUlYLCA4LCAyLCAyMCwgMHgwMGYwMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCA5LCAyLCAxNiwgMHgwMDBmMDAwMH0sCi0JCXtNT0RFX0hUTUlYLCAxMCwgMiwgMjgsIDB4ZjAwMDAwMDB9LAotCQl7TU9ERV9IVE1JWCwgMTEsIDIsIDI0LCAweDBmMDAwMDAwfSwKLQkJe01PREVfSFRNSVgsIDEyLCAzLCA0LCAweDAwMDAwMGYwfSwKLQkJe01PREVfSFRNSVgsIDEzLCAzLCAwLCAweDAwMDAwMDBmfSwKLQkJe01PREVfSFRNSVgsIDE0LCAzLCAxMiwgMHgwMDAwZjAwMH0sCi0JCXtNT0RFX0hUTUlYLCAxNSwgMywgOCwgMHgwMDAwMGYwMH0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQl9OwotI2RlZmluZSBNQVhfVFhQV1JfVEFCX1NJWkUgKHNpemVvZihUeFB3ckNmZykgLyBzaXplb2YoVFhfUFdSX0NGRykpCi0KLSNpZmRlZiBTSU5HTEVfU0tVCi0JQ3VyVHhQd3IgPSBwQWQtPkNvbW1vbkNmZy5EZWZpbmVNYXhUeFB3cjsKLSNlbHNlCi0JQ3VyVHhQd3IgPSAxOTsKLSNlbmRpZgotCi0JLyogY2hlY2sgVHggUG93ZXIgc2V0dGluZyBmcm9tIFVJLiAqLwotCWlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKQotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8qIHJlZHVjZSBQd3IgZm9yIDEgZEIuICovCi0JCUN1clR4UHdyIC09IDE7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAzMCkgIC8qIHJlZHVjZSBQd3IgZm9yIDMgZEIuICovCi0JCUN1clR4UHdyIC09IDM7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiAxNSkgIC8qIHJlZHVjZSBQd3IgZm9yIDYgZEIuICovCi0JCUN1clR4UHdyIC09IDY7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8qIHJlZHVjZSBQd3IgZm9yIDkgZEIuICovCi0JCUN1clR4UHdyIC09IDk7Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWR1Y2UgUHdyIGZvciAxMiBkQi4gKi8KLQkJQ3VyVHhQd3IgLT0gMTI7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbNF07Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlUeFB3clswXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFswXTsKLQkJCVR4UHdyWzFdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzFdOwotCQkJVHhQd3JbMl0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMl07Ci0JCQlUeFB3clszXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFszXTsKLQkJCVR4UHdyWzRdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzRdOwotCQl9Ci0JfQotCi0KLQlzd2l0Y2goSFRUeE1vZGUuZmllbGQuTU9ERSkKLQl7Ci0JCWNhc2UgTU9ERV9DQ0s6Ci0JCWNhc2UgTU9ERV9PRkRNOgotCQkJVmFsdWUgPSBUeFB3clsxXTsKLQkJCVR4UHdyUmVmID0gKFZhbHVlICYgMHgwMDAwMGYwMCkgPj4gODsKLQotCQkJYnJlYWs7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBNT0RFX0hUTUlYOgotCQljYXNlIE1PREVfSFRHUkVFTkZJRUxEOgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4U3RyZWFtID09IDEpCi0JCQl7Ci0JCQkJVmFsdWUgPSBUeFB3clsyXTsKLQkJCQlUeFB3clJlZiA9IChWYWx1ZSAmIDB4MDAwMDBmMDApID4+IDg7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAyKQotCQkJewotCQkJCVZhbHVlID0gVHhQd3JbM107Ci0JCQkJVHhQd3JSZWYgPSAoVmFsdWUgJiAweDAwMDAwZjAwKSA+PiA4OwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JfQotCi0JUGh5TW9kZSA9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJKEhUVHhNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVEdSRUVORklFTEQpCi0JCQkJPyBNT0RFX0hUTUlYIDoKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQlIVFR4TW9kZS5maWVsZC5NT0RFOwotCi0JZm9yIChJZHggPSAwOyBJZHggPCBNQVhfVFhQV1JfVEFCX1NJWkU7IElkeCsrKQotCXsKLQkJaWYgKChUeFB3ckNmZ1tJZHhdLk1vZGUgPT0gUGh5TW9kZSkKLQkJCSYmIChUeFB3ckNmZ1tJZHhdLk1DUyA9PSBIVFR4TW9kZS5maWVsZC5NQ1MpKQotCQl7Ci0JCQlWYWx1ZSA9IFR4UHdyW1R4UHdyQ2ZnW0lkeF0ucmVxXTsKLQkJCURhbHRhUHdyID0gVHhQd3JSZWYgLSAoQ0hBUikoKFZhbHVlICYgVHhQd3JDZmdbSWR4XS5CaXRNYXNrKQotCQkJCQkJCQkJCQk+PiBUeFB3ckNmZ1tJZHhdLnNoaWZ0KTsKLQkJCUN1clR4UHdyIC09IERhbHRhUHdyOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gQ3VyVHhQd3I7Ci19Ci0KLQotVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlOZGlzQWxsb2NhdGVTcGluTG9jaygmcEFkLT5Db21tb25DZmcuTWVhc3VyZVJlcVRhYkxvY2spOwotCi0JcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIgPSBrbWFsbG9jKHNpemVvZihNRUFTVVJFX1JFUV9UQUIpLCBHRlBfQVRPTUlDKTsKLQlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiLCBzaXplb2YoTUVBU1VSRV9SRVFfVEFCKSk7Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyBGYWlsIHRvIGFsbG9jIG1lbW9yeSBmb3IgcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCXJldHVybjsKLX0KLQotVk9JRCBNZWFzdXJlUmVxVGFiRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWIpCi0JCWtmcmVlKHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiKTsKLQlwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYiA9IE5VTEw7Ci0KLQlyZXR1cm47Ci19Ci0KLVBNRUFTVVJFX1JFUV9FTlRSWSBNZWFzdXJlUmVxTG9va1VwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JVUlOVCBIYXNoSWR4OwotCVBNRUFTVVJFX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBNZWFzdXJlUmVxVGFiOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQotCWlmIChwVGFiID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogcE1lYXN1cmVSZXFUYWIgZG9lc24ndCBleGlzdC5cbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0KLQlIYXNoSWR4ID0gTVFfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChEaWFsb2dUb2tlbik7Ci0JcEVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKLQotCXdoaWxlIChwRW50cnkpCi0JewotCQlpZiAocEVudHJ5LT5EaWFsb2dUb2tlbiA9PSBEaWFsb2dUb2tlbikKLQkJCWJyZWFrOwotCQllbHNlCi0JCXsKLQkJCXBQcmV2RW50cnkgPSBwRW50cnk7Ci0JCQlwRW50cnkgPSBwRW50cnktPnBOZXh0OwotCQl9Ci0JfQotCi0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1QTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUluc2VydCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKQotewotCUlOVCBpOwotCVVMT05HIEhhc2hJZHg7Ci0JUE1FQVNVUkVfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucE1lYXN1cmVSZXFUYWI7Ci0JUE1FQVNVUkVfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEwsIHBDdXJyRW50cnk7Ci0JVUxPTkcgTm93OwotCi0JaWYocFRhYiA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ID09IE5VTEwpCi0JewotCQlSVE1QX1NFTV9MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkU7IGkrKykKLQkJewotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCXBFbnRyeSA9ICZwVGFiLT5Db250ZW50W2ldOwotCi0JCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKLQkJCQkmJiBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93LCAodW5zaWduZWQgbG9uZykocEVudHJ5LT5sYXN0VGltZSArIE1RX1JFUV9BR0VfT1VUKSkpCi0JCQl7Ci0JCQkJUE1FQVNVUkVfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQkJCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQkJCVBNRUFTVVJFX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0KLQkJCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCQkJZG8KLQkJCQl7Ci0JCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQkJCXsKLQkJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCQl7Ci0JCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7Ci0JCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwotCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKLQotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0VOVFJZKSk7Ci0JCQkJcFRhYi0+U2l6ZS0tOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChwRW50cnktPlZhbGlkID09IEZBTFNFKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGkgPCBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUpCi0JCXsKLQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQlwRW50cnktPmxhc3RUaW1lID0gTm93OwotCQkJcEVudHJ5LT5WYWxpZCA9IFRSVUU7Ci0JCQlwRW50cnktPkRpYWxvZ1Rva2VuID0gRGlhbG9nVG9rZW47Ci0JCQlwVGFiLT5TaXplKys7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwRW50cnkgPSBOVUxMOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHBNZWFzdXJlUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCX0KLQotCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJSGFzaElkeCA9IE1RX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwotCQkJaWYgKHBUYWItPkhhc2hbSGFzaElkeF0gPT0gTlVMTCkKLQkJCXsKLQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5OwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBDdXJyRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCQkJCXdoaWxlIChwQ3VyckVudHJ5LT5wTmV4dCAhPSBOVUxMKQotCQkJCQlwQ3VyckVudHJ5ID0gcEN1cnJFbnRyeS0+cE5leHQ7Ci0JCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCQl9Ci0JCX0KLQotCQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKLQl9Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1WT0lEIE1lYXN1cmVSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKLXsKLQlQTUVBU1VSRV9SRVFfVEFCIHBUYWIgPSBwQWQtPkNvbW1vbkNmZy5wTWVhc3VyZVJlcVRhYjsKLQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwTWVhc3VyZVJlcVRhYiBkb2Vzbid0IGV4aXN0LlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBpZiBlbXB0eSwgcmV0dXJuCi0JaWYgKHBUYWItPlNpemUgPT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBNZWFzdXJlUmVxVGFiIGVtcHR5LlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JcEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JewotCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByZXZFbnRyeSA9IE5VTEw7Ci0JCVVMT05HIEhhc2hJZHggPSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQlQTUVBU1VSRV9SRVFfRU5UUlkgcFByb2JlRW50cnkgPSBwVGFiLT5IYXNoW0hhc2hJZHhdOwotCi0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLk1lYXN1cmVSZXFUYWJMb2NrKTsKLQkJLy8gdXBkYXRlIEhhc2ggbGlzdAotCQlkbwotCQl7Ci0JCQlpZiAocFByb2JlRW50cnkgPT0gcEVudHJ5KQotCQkJewotCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJewotCQkJCQlwVGFiLT5IYXNoW0hhc2hJZHhdID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcFByZXZFbnRyeSA9IHBQcm9iZUVudHJ5OwotCQkJcFByb2JlRW50cnkgPSBwUHJvYmVFbnRyeS0+cE5leHQ7Ci0JCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKLQotCQlOZGlzWmVyb01lbW9yeShwRW50cnksIHNpemVvZihNRUFTVVJFX1JFUV9FTlRSWSkpOwotCQlwVGFiLT5TaXplLS07Ci0KLQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5NZWFzdXJlUmVxVGFiTG9jayk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi1WT0lEIFRwY1JlcVRhYkluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTmRpc0FsbG9jYXRlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCi0JcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYiA9IGttYWxsb2Moc2l6ZW9mKFRQQ19SRVFfVEFCKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCi0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIsIHNpemVvZihUUENfUkVRX1RBQikpOwotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgRmFpbCB0byBhbGxvYyBtZW1vcnkgZm9yIHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotCXJldHVybjsKLX0KLQotVk9JRCBUcGNSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpCi0JCWtmcmVlKHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIpOwotCXBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWIgPSBOVUxMOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgUFRQQ19SRVFfRU5UUlkgVHBjUmVxTG9va1VwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVJTlQ4CQkJRGlhbG9nVG9rZW4pCi17Ci0JVUlOVCBIYXNoSWR4OwotCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMOwotCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCi0JaWYgKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0KLQlIYXNoSWR4ID0gVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoRGlhbG9nVG9rZW4pOwotCXBFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0KLQl3aGlsZSAocEVudHJ5KQotCXsKLQkJaWYgKHBFbnRyeS0+RGlhbG9nVG9rZW4gPT0gRGlhbG9nVG9rZW4pCi0JCQlicmVhazsKLQkJZWxzZQotCQl7Ci0JCQlwUHJldkVudHJ5ID0gcEVudHJ5OwotCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQkJfQotCX0KLQotCVJUTVBfU0VNX1VOTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi0KLXN0YXRpYyBQVFBDX1JFUV9FTlRSWSBUcGNSZXFJbnNlcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKLXsKLQlJTlQgaTsKLQlVTE9ORyBIYXNoSWR4OwotCVBUUENfUkVRX1RBQiBwVGFiID0gcEFkLT5Db21tb25DZmcucFRwY1JlcVRhYjsKLQlQVFBDX1JFUV9FTlRSWSBwRW50cnkgPSBOVUxMLCBwQ3VyckVudHJ5OwotCVVMT05HIE5vdzsKLQotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcEVudHJ5ID0gVHBjUmVxTG9va1VwKHBBZCwgRGlhbG9nVG9rZW4pOwotCWlmIChwRW50cnkgPT0gTlVMTCkKLQl7Ci0JCVJUTVBfU0VNX0xPQ0soJnBBZC0+Q29tbW9uQ2ZnLlRwY1JlcVRhYkxvY2spOwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RQQ19SRVFfVEFCX1NJWkU7IGkrKykKLQkJewotCQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJCXBFbnRyeSA9ICZwVGFiLT5Db250ZW50W2ldOwotCi0JCQlpZiAoKHBFbnRyeS0+VmFsaWQgPT0gVFJVRSkKLQkJCQkmJiBSVE1QX1RJTUVfQUZURVIoKHVuc2lnbmVkIGxvbmcpTm93LCAodW5zaWduZWQgbG9uZykocEVudHJ5LT5sYXN0VGltZSArIFRQQ19SRVFfQUdFX09VVCkpKQotCQkJewotCQkJCVBUUENfUkVRX0VOVFJZIHBQcmV2RW50cnkgPSBOVUxMOwotCQkJCVVMT05HIEhhc2hJZHggPSBUUENfRElBTE9HVE9LRU5fSEFTSF9JTkRFWChwRW50cnktPkRpYWxvZ1Rva2VuKTsKLQkJCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0KLQkJCQkvLyB1cGRhdGUgSGFzaCBsaXN0Ci0JCQkJZG8KLQkJCQl7Ci0JCQkJCWlmIChwUHJvYmVFbnRyeSA9PSBwRW50cnkpCi0JCQkJCXsKLQkJCQkJCWlmIChwUHJldkVudHJ5ID09IE5VTEwpCi0JCQkJCQl7Ci0JCQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcFByZXZFbnRyeS0+cE5leHQgPSBwRW50cnktPnBOZXh0OwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlwUHJldkVudHJ5ID0gcFByb2JlRW50cnk7Ci0JCQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwotCQkJCX0gd2hpbGUgKHBQcm9iZUVudHJ5KTsKLQotCQkJCU5kaXNaZXJvTWVtb3J5KHBFbnRyeSwgc2l6ZW9mKFRQQ19SRVFfRU5UUlkpKTsKLQkJCQlwVGFiLT5TaXplLS07Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKHBFbnRyeS0+VmFsaWQgPT0gRkFMU0UpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaSA8IE1BWF9UUENfUkVRX1RBQl9TSVpFKQotCQl7Ci0JCQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCQkJcEVudHJ5LT5sYXN0VGltZSA9IE5vdzsKLQkJCXBFbnRyeS0+VmFsaWQgPSBUUlVFOwotCQkJcEVudHJ5LT5EaWFsb2dUb2tlbiA9IERpYWxvZ1Rva2VuOwotCQkJcFRhYi0+U2l6ZSsrOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5ID0gTlVMTDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIHRhYiBmdWxsLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCX0KLQotCQkvLyBhZGQgdGhpcyBOZWlnaGJvciBlbnRyeSBpbnRvIEhBU0ggdGFibGUKLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKERpYWxvZ1Rva2VuKTsKLQkJCWlmIChwVGFiLT5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQ3VyckVudHJ5ID0gcFRhYi0+SGFzaFtIYXNoSWR4XTsKLQkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKLQkJCQkJcEN1cnJFbnRyeSA9IHBDdXJyRW50cnktPnBOZXh0OwotCQkJCXBDdXJyRW50cnktPnBOZXh0ID0gcEVudHJ5OwotCQkJfQotCQl9Ci0KLQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQl9Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1zdGF0aWMgVk9JRCBUcGNSZXFEZWxldGUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbikKLXsKLQlQVFBDX1JFUV9UQUIgcFRhYiA9IHBBZC0+Q29tbW9uQ2ZnLnBUcGNSZXFUYWI7Ci0JUFRQQ19SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQotCWlmKHBUYWIgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBwVHBjUmVxVGFiIGRvZXNuJ3QgZXhpc3QuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIGlmIGVtcHR5LCByZXR1cm4KLQlpZiAocFRhYi0+U2l6ZSA9PSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgicFRwY1JlcVRhYiBlbXB0eS5cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCXBFbnRyeSA9IFRwY1JlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKTsKLQlpZiAocEVudHJ5ICE9IE5VTEwpCi0JewotCQlQVFBDX1JFUV9FTlRSWSBwUHJldkVudHJ5ID0gTlVMTDsKLQkJVUxPTkcgSGFzaElkeCA9IFRQQ19ESUFMT0dUT0tFTl9IQVNIX0lOREVYKHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQlQVFBDX1JFUV9FTlRSWSBwUHJvYmVFbnRyeSA9IHBUYWItPkhhc2hbSGFzaElkeF07Ci0KLQkJUlRNUF9TRU1fTE9DSygmcEFkLT5Db21tb25DZmcuVHBjUmVxVGFiTG9jayk7Ci0JCS8vIHVwZGF0ZSBIYXNoIGxpc3QKLQkJZG8KLQkJewotCQkJaWYgKHBQcm9iZUVudHJ5ID09IHBFbnRyeSkKLQkJCXsKLQkJCQlpZiAocFByZXZFbnRyeSA9PSBOVUxMKQotCQkJCXsKLQkJCQkJcFRhYi0+SGFzaFtIYXNoSWR4XSA9IHBFbnRyeS0+cE5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBQcmV2RW50cnktPnBOZXh0ID0gcEVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBQcmV2RW50cnkgPSBwUHJvYmVFbnRyeTsKLQkJCXBQcm9iZUVudHJ5ID0gcFByb2JlRW50cnktPnBOZXh0OwotCQl9IHdoaWxlIChwUHJvYmVFbnRyeSk7Ci0KLQkJTmRpc1plcm9NZW1vcnkocEVudHJ5LCBzaXplb2YoVFBDX1JFUV9FTlRSWSkpOwotCQlwVGFiLT5TaXplLS07Ci0KLQkJUlRNUF9TRU1fVU5MT0NLKCZwQWQtPkNvbW1vbkNmZy5UcGNSZXFUYWJMb2NrKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJR2V0IEN1cnJlbnQgVGltZVMgdGFtcC4KLQotCVBhcmFtZXRyczoKLQotCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVUlOVDY0IEdldEN1cnJlbnRUaW1lU3RhbXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JLy8gZ2V0IGN1cnJlbnQgdGltZSBzdGFtcC4KLQlyZXR1cm4gMDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHZXQgQ3VycmVudCBUcmFuc21pdCBQb3dlci4KLQotCVBhcmFtZXRyczoKLQotCVJldHVybgk6IEN1cnJlbnQgVGltZSBTdGFtcC4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVUlOVDggR2V0Q3VyVHhQd3IoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDggV2NpZCkKLXsKLQlyZXR1cm4gMTY7IC8qIDE2IGRCbSAqLwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUdldCBDdXJyZW50IFRyYW5zbWl0IFBvd2VyLgotCi0JUGFyYW1ldHJzOgotCi0JUmV0dXJuCTogQ3VycmVudCBUaW1lIFN0YW1wLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgSW5zZXJ0Q2hhbm5lbFJlcElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBTVFJJTkcgcENvdW50cnksCi0JSU4gVUlOVDggUmVndWxhdG9yeUNsYXNzKQotewotCVVMT05HIFRlbXBMZW47Ci0JVUlOVDggTGVuOwotCVVJTlQ4IElFSWQgPSBJRV9BUF9DSEFOTkVMX1JFUE9SVDsKLQlQVUNIQVIgcENoTGlzdFB0ciA9IE5VTEw7Ci0KLQlMZW4gPSAxOwotCWlmIChzdHJuY21wKHBDb3VudHJ5LCAiVVMiLCAyKSA9PSAwKQotCXsKLQkJaWYgKFJlZ3VsYXRvcnlDbGFzcyA+PSBVU0FfUkVHVUxBVE9SWV9JTkZPX1NJWkUpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiBVU0EgVW5rbm93IFJlcXVsYXRvcnkgY2xhc3MgKCVkKVxuIiwKLQkJCQkJCV9fRlVOQ1RJT05fXywgUmVndWxhdG9yeUNsYXNzKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMZW4gKz0gVVNBUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0Lk51bWJlck9mQ2hhbm5lbHM7Ci0JCXBDaExpc3RQdHIgPSBVU0FSZWd1bGF0b3J5SW5mb1tSZWd1bGF0b3J5Q2xhc3NdLkNoYW5uZWxTZXQuQ2hhbm5lbExpc3Q7Ci0JfQotCWVsc2UgaWYgKHN0cm5jbXAocENvdW50cnksICJKUCIsIDIpID09IDApCi0JewotCQlpZiAoUmVndWxhdG9yeUNsYXNzID49IEpQX1JFR1VMQVRPUllfSU5GT19TSVpFKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogSlAgVW5rbm93IFJlcXVsYXRvcnkgY2xhc3MgKCVkKVxuIiwKLQkJCQkJCV9fRlVOQ1RJT05fXywgUmVndWxhdG9yeUNsYXNzKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMZW4gKz0gSmFwYW5SZWd1bGF0b3J5SW5mb1tSZWd1bGF0b3J5Q2xhc3NdLkNoYW5uZWxTZXQuTnVtYmVyT2ZDaGFubmVsczsKLQkJcENoTGlzdFB0ciA9IEphcGFuUmVndWxhdG9yeUluZm9bUmVndWxhdG9yeUNsYXNzXS5DaGFubmVsU2V0LkNoYW5uZWxMaXN0OwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlczogVW5rbm93IENvdW50cnkgKCVzKVxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCBwQ291bnRyeSkpOwotCQlyZXR1cm47Ci0JfQotCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkmVGVtcExlbiwKLQkJCQkJMSwJCQkJJklFSWQsCi0JCQkJCTEsCQkJCSZMZW4sCi0JCQkJCTEsCQkJCSZSZWd1bGF0b3J5Q2xhc3MsCi0JCQkJCUxlbiAtMSwJCQlwQ2hMaXN0UHRyLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IERpYWxvZyBUb2tlbiBpbnRvIGZyYW1lLgotCi0JUGFyYW1ldHJzOgotCQkxLiBmcmFtZSBidWZmZXIgcG9pbnRlci4KLQkJMi4gZnJhbWUgbGVuZ3RoLgotCQkzLiBEaWFsb2cgdG9rZW4uCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgSW5zZXJ0RGlhbG9nVG9rZW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggRGlhbG9nVG9rZW4pCi17Ci0JVUxPTkcgVGVtcExlbjsKLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCSZUZW1wTGVuLAotCQkJCQkxLAkJCQkmRGlhbG9nVG9rZW4sCi0JCQkJCUVORF9PRl9BUkdTKTsKLQotCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlJbnNlcnQgVFBDIFJlcXVlc3QgSUUgaW50byBmcmFtZS4KLQotCVBhcmFtZXRyczoKLQkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCi0JCTIuIGZyYW1lIGxlbmd0aC4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotIHN0YXRpYyBWT0lEIEluc2VydFRwY1JlcUlFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuKQotewotCVVMT05HIFRlbXBMZW47Ci0JVUxPTkcgTGVuID0gMDsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVRVUVTVDsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IFRQQyBSZXBvcnQgSUUgaW50byBmcmFtZS4KLQotCVBhcmFtZXRyczoKLQkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCi0JCTIuIGZyYW1lIGxlbmd0aC4KLQkJMy4gVHJhbnNtaXQgUG93ZXIuCi0JCTQuIExpbmsgTWFyZ2luLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEluc2VydFRwY1JlcG9ydElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pCi17Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSBzaXplb2YoVFBDX1JFUE9SVF9JTkZPKTsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9UUENfUkVQT1JUOwotCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBvcnRJRTsKLQotCVRwY1JlcG9ydElFLlR4UHdyID0gVHhQd3I7Ci0JVHBjUmVwb3J0SUUuTGlua01hcmdpbiA9IExpbmtNYXJnaW47Ci0KLQlNYWtlT3V0Z29pbmdGcmFtZShwRnJhbWVCdWYsCQkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJCSZFbGVtZW50SUQsCi0JCQkJCQkxLAkJCQkJCQkmTGVuLAotCQkJCQkJTGVuLAkJCQkJCSZUcGNSZXBvcnRJRSwKLQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCSpwRnJhbWVMZW4gPSAqcEZyYW1lTGVuICsgVGVtcExlbjsKLQotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUluc2VydCBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUgaW50byBmcmFtZS4KLQotCVBhcmFtZXRyczoKLQkJMS4gZnJhbWUgYnVmZmVyIHBvaW50ZXIuCi0JCTIuIGZyYW1lIGxlbmd0aC4KLQkJMy4gY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCi0JCTQuIG5ldyBzZWxlY3RlZCBjaGFubmVsLgotCQk1LiBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgY291bnQuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIEluc2VydENoU3dBbm5JRSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBGcmFtZUJ1ZiwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaGFubmVsLAotCUlOIFVJTlQ4IENoU3dDbnQpCi17Ci0JVUxPTkcgVGVtcExlbjsKLQlVTE9ORyBMZW4gPSBzaXplb2YoQ0hfU1dfQU5OX0lORk8pOwotCVVJTlQ4IEVsZW1lbnRJRCA9IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDsKLQlDSF9TV19BTk5fSU5GTyBDaFN3QW5uSUU7Ci0KLQlDaFN3QW5uSUUuQ2hTd01vZGUgPSBDaFN3TW9kZTsKLQlDaFN3QW5uSUUuQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JQ2hTd0FubklFLkNoU3dDbnQgPSBDaFN3Q250OwotCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkmVGVtcExlbiwKLQkJCQkJCTEsCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCSZDaFN3QW5uSUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlJbnNlcnQgTWVhc3VyZSBSZXF1ZXN0IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0JCTMuIE1lYXN1cmUgVG9rZW4uCi0JCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgotCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KLQkJNi4gTWVhc3VyZSBDaGFubmVsLgotCQk3LiBNZWFzdXJlIFN0YXJ0IHRpbWUuCi0JCTguIE1lYXN1cmUgRHVyYXRpb24uCi0KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIFZPSUQgSW5zZXJ0TWVhc3VyZVJlcUlFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IExlbiwKLQlJTiBQTUVBU1VSRV9SRVFfSU5GTyBwTWVhc3VyZVJlcUlFKQotewotCVVMT05HIFRlbXBMZW47Ci0JVUlOVDggRWxlbWVudElEID0gSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDsKLQotCU1ha2VPdXRnb2luZ0ZyYW1lKHBGcmFtZUJ1ZiwJCQkJCSZUZW1wTGVuLAotCQkJCQkJMSwJCQkJCQkJJkVsZW1lbnRJRCwKLQkJCQkJCTEsCQkJCQkJCSZMZW4sCi0JCQkJCQlzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyksCXBNZWFzdXJlUmVxSUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJSW5zZXJ0IE1lYXN1cmUgUmVwb3J0IElFIGludG8gZnJhbWUuCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIGZyYW1lIGJ1ZmZlciBwb2ludGVyLgotCQkyLiBmcmFtZSBsZW5ndGguCi0JCTMuIE1lYXN1cmUgVG9rZW4uCi0JCTQuIE1lYXN1cmUgUmVxdWVzdCBNb2RlLgotCQk1LiBNZWFzdXJlIFJlcXVlc3QgVHlwZS4KLQkJNi4gTGVuZ3RoIG9mIFJlcG9ydCBJbmZvbWF0aW9uCi0JCTcuIFBvaW50ZXIgb2YgUmVwb3J0IEluZm9tYXRpb24gQnVmZmVyLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBJbnNlcnRNZWFzdXJlUmVwb3J0SUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gUE1FQVNVUkVfUkVQT1JUX0lORk8gcE1lYXN1cmVSZXBvcnRJRSwKLQlJTiBVSU5UOCBSZXBvcnRMbmZvTGVuLAotCUlOIFBVSU5UOCBwUmVwb3J0SW5mbykKLXsKLQlVTE9ORyBUZW1wTGVuOwotCVVMT05HIExlbjsKLQlVSU5UOCBFbGVtZW50SUQgPSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ7Ci0KLQlMZW4gPSBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykgKyBSZXBvcnRMbmZvTGVuOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmLAkJCQkJJlRlbXBMZW4sCi0JCQkJCQkxLAkJCQkJCQkmRWxlbWVudElELAotCQkJCQkJMSwJCQkJCQkJJkxlbiwKLQkJCQkJCUxlbiwJCQkJCQlwTWVhc3VyZVJlcG9ydElFLAotCQkJCQkJRU5EX09GX0FSR1MpOwotCi0JKnBGcmFtZUxlbiA9ICpwRnJhbWVMZW4gKyBUZW1wTGVuOwotCi0JaWYgKChSZXBvcnRMbmZvTGVuID4gMCkgJiYgKHBSZXBvcnRJbmZvICE9IE5VTEwpKQotCXsKLQkJTWFrZU91dGdvaW5nRnJhbWUocEZyYW1lQnVmICsgKnBGcmFtZUxlbiwJCSZUZW1wTGVuLAotCQkJCQkJCVJlcG9ydExuZm9MZW4sCQkJCXBSZXBvcnRJbmZvLAotCQkJCQkJCUVORF9PRl9BUkdTKTsKLQotCQkqcEZyYW1lTGVuID0gKnBGcmFtZUxlbiArIFRlbXBMZW47Ci0JfQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIE1lYXN1cmVtZW50IHJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KLQkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KLQotCVBhcmFtZXRyczoKLQkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNYWtlTWVhc3VyZW1lbnRSZXFGcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBPdXRCdWZmZXIsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gVUlOVDggVG90YWxMZW4sCi0JSU4gVUlOVDggQ2F0ZWdvcnksCi0JSU4gVUlOVDggQWN0aW9uLAotCUlOIFVJTlQ4IE1lYXN1cmVUb2tlbiwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxTW9kZSwKLQlJTiBVSU5UOCBNZWFzdXJlUmVxVHlwZSwKLQlJTiBVSU5UOCBOdW1PZlJlcGV0aXRpb25zKQotewotCVVMT05HIFRlbXBMZW47Ci0JTUVBU1VSRV9SRVFfSU5GTyBNZWFzdXJlUmVxSUU7Ci0KLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwgQ2F0ZWdvcnksIEFjdGlvbik7Ci0KLQkvLyBmaWxsIERpYWxvZyBUb2tlbgotCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyAqcEZyYW1lTGVuKSwgcEZyYW1lTGVuLCBNZWFzdXJlVG9rZW4pOwotCi0JLyogZmlsbCBOdW1iZXIgb2YgcmVwZXRpdGlvbnMuICovCi0JaWYgKENhdGVnb3J5ID09IENBVEVHT1JZX1JNKQotCXsKLQkJTWFrZU91dGdvaW5nRnJhbWUoKHBPdXRCdWZmZXIrKnBGcmFtZUxlbiksCSZUZW1wTGVuLAotCQkJCQkJMiwJCQkJCQkJJk51bU9mUmVwZXRpdGlvbnMsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkJKnBGcmFtZUxlbiArPSBUZW1wTGVuOwotCX0KLQotCS8vIHByZXBhcmUgTWVhc3VyZW1lbnQgSUUuCi0JTmRpc1plcm9NZW1vcnkoJk1lYXN1cmVSZXFJRSwgc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pKTsKLQlNZWFzdXJlUmVxSUUuVG9rZW4gPSBNZWFzdXJlVG9rZW47Ci0JTWVhc3VyZVJlcUlFLlJlcU1vZGUud29yZCA9IE1lYXN1cmVSZXFNb2RlOwotCU1lYXN1cmVSZXFJRS5SZXFUeXBlID0gTWVhc3VyZVJlcVR5cGU7Ci0JSW5zZXJ0TWVhc3VyZVJlcUlFKHBBZCwgKHBPdXRCdWZmZXIrKnBGcmFtZUxlbiksIHBGcmFtZUxlbiwKLQkJVG90YWxMZW4sICZNZWFzdXJlUmVxSUUpOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggRGlhbG9nVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVRva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAotCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCi0JSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKQotewotCVBVQ0hBUiBwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUyBOU3RhdHVzOwotCVVMT05HIEZyYW1lTGVuOwotCUhFQURFUl84MDJfMTEgQWN0SGRyOwotCU1FQVNVUkVfUkVQT1JUX0lORk8gTWVhc3VyZVJlcElFOwotCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBEQSwKLQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MpOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybjsKLQl9Ci0JTmRpc01vdmVNZW1vcnkocE91dEJ1ZmZlciwgKFBDSEFSKSZBY3RIZHIsIHNpemVvZihIRUFERVJfODAyXzExKSk7Ci0JRnJhbWVMZW4gPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQlJbnNlcnRBY3RGaWVsZChwQWQsIChwT3V0QnVmZmVyICsgRnJhbWVMZW4pLCAmRnJhbWVMZW4sIENBVEVHT1JZX1NQRUNUUlVNLCBTUEVDX01SUCk7Ci0KLQkvLyBmaWxsIERpYWxvZyBUb2tlbgotCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOwotCi0JLy8gcHJlcGFyZSBNZWFzdXJlbWVudCBJRS4KLQlOZGlzWmVyb01lbW9yeSgmTWVhc3VyZVJlcElFLCBzaXplb2YoTUVBU1VSRV9SRVBPUlRfSU5GTykpOwotCU1lYXN1cmVSZXBJRS5Ub2tlbiA9IE1lYXN1cmVUb2tlbjsKLQlNZWFzdXJlUmVwSUUuUmVwb3J0TW9kZSA9IE1lYXN1cmVSZXFNb2RlOwotCU1lYXN1cmVSZXBJRS5SZXBvcnRUeXBlID0gTWVhc3VyZVJlcVR5cGU7Ci0JSW5zZXJ0TWVhc3VyZVJlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgJk1lYXN1cmVSZXBJRSwgUmVwb3J0SW5mb0xlbiwgcFJlcG9ydEluZm8pOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgVFBDIFJlcXVlc3QgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KLQkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KLQotCVBhcmFtZXRyczoKLQkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBFbnF1ZXVlVFBDUmVxKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUNIQVIgRGlhbG9nVG9rZW4pCi17Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47Ci0KLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUSk7Ci0KLQkvLyBmaWxsIERpYWxvZyBUb2tlbgotCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOwotCi0JLy8gSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLgotCUluc2VydFRwY1JlcUlFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbik7Ci0KLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIFFJRF9BQ19CRSwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pCi17Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47Ci0KLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19UUENSUCk7Ci0KLQkvLyBmaWxsIERpYWxvZyBUb2tlbgotCUluc2VydERpYWxvZ1Rva2VuKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgRGlhbG9nVG9rZW4pOwotCi0JLy8gSW5zZXJ0IFRQQyBSZXF1ZXN0IElFLgotCUluc2VydFRwY1JlcG9ydElFKHBBZCwgKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiksICZGcmFtZUxlbiwgVHhQd3IsIExpbmtNYXJnaW4pOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgQ2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0JCTIuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBtb2RlLgotCQkyLiBhIE5ldyBzZWxlY3RlZCBjaGFubmVsLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEVucXVldWVDaFN3QW5uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggQ2hTd01vZGUsCi0JSU4gVUlOVDggTmV3Q2gpCi17Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47Ci0KLQlIRUFERVJfODAyXzExIEFjdEhkcjsKLQotCS8vIGJ1aWxkIGFjdGlvbiBmcmFtZSBoZWFkZXIuCi0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZBY3RIZHIsIFNVQlRZUEVfQUNUSU9OLCAwLCBwREEsCi0JCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAoUFZPSUQpJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQlyZXR1cm47Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KHBPdXRCdWZmZXIsIChQQ0hBUikmQWN0SGRyLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCUZyYW1lTGVuID0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JSW5zZXJ0QWN0RmllbGQocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDQVRFR09SWV9TUEVDVFJVTSwgU1BFQ19DSEFOTkVMX1NXSVRDSCk7Ci0KLQlJbnNlcnRDaFN3QW5uSUUocEFkLCAocE91dEJ1ZmZlciArIEZyYW1lTGVuKSwgJkZyYW1lTGVuLCBDaFN3TW9kZSwgTmV3Q2gsIDApOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgQk9PTEVBTiBEZnNSZXF1aXJlbWVudENoZWNrKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVJTlQ4IENoYW5uZWwpCi17Ci0JQk9PTEVBTiBSZXN1bHQgPSBGQUxTRTsKLQlJTlQgaTsKLQotCWRvCi0JewotCQkvLyBjaGVjayBERlMgcHJvY2VkdXJlIGlzIHJ1bm5pbmcuCi0JCS8vIG1ha2Ugc3VyZSBERlMgcHJvY2VkdXJlIHdvbid0IHN0YXJ0IHR3aWNlLgotCQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlICE9IFJEX05PUk1BTF9NT0RFKQotCQl7Ci0JCQlSZXN1bHQgPSBGQUxTRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGhlIG5ldyBjaGFubmVsIGNhcnJpZWQgZnJvbSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1uZXQgaXMgdmFsaWQuCi0JCWZvciAoaT0wOyBpPHBBZC0+Q2hhbm5lbExpc3ROdW07IGkrKykKLQkJewotCQkJaWYgKChDaGFubmVsID09IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbCkKLQkJCQkmJihwQWQtPkNoYW5uZWxMaXN0W2ldLlJlbWFpbmluZ1RpbWVGb3JVc2UgPT0gMCkpCi0JCQl7Ci0JCQkJLy8gZm91bmQgcmFkYXIgc2lnbmFsIGluIHRoZSBjaGFubmVsLiB0aGUgY2hhbm5lbCBjYW4ndCB1c2UgYXQgbGVhc3QgZm9yIDMwIG1pbnV0ZXMuCi0JCQkJcEFkLT5DaGFubmVsTGlzdFtpXS5SZW1haW5pbmdUaW1lRm9yVXNlID0gMTgwMDsvLzMwIG1pbiA9IDE4MDAgc2VjCi0JCQkJUmVzdWx0ID0gVFJVRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gd2hpbGUoRkFMU0UpOwotCi0JcmV0dXJuIFJlc3VsdDsKLX0KLQotVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwUkEsCi0JSU4gUFVDSEFSIHBUQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBDaGFubmVsKQotewotI2lmZGVmIFdEU19TVVBQT1JUCi0JaWYgKCEoKHBSQVswXSAmIDB4ZmYpID09IDB4ZmYpKSAvLyBpcyBwUkEgYSBicm9hZGNhc2UgYWRkcmVzcy4KLQl7Ci0JCUlOVCBpOwotCQkvLyBpbmZvIG5laWdoYm9yIEFQcyB0aGF0IFJhZGFyIHNpZ25hbCBmb3VuZCB0aHJvZ2ggV0RTIGxpbmsuCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfV0RTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChWYWxpZFdkc0VudHJ5KHBBZCwgaSkpCi0JCQl7Ci0JCQkJUFVDSEFSIHBEQSA9IHBBZC0+V2RzVGFiLldkc0VudHJ5W2ldLlBlZXJXZHNBZGRyOwotCi0JCQkJLy8gREEgZXF1YWwgdG8gU0EuIGhhdmUgbm8gbmVjZXNzYXJ5IG9yaWduYWwgQVAgd2hpY2ggZm91bmQgUmFkYXIgc2lnbmFsLgotCQkJCWlmIChNQUNfQUREUl9FUVVBTChwVEEsIHBEQSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gc2VuZCBDaGFubmVsIFN3aXRjaCBBY3Rpb24gZnJhbWUgdG8gaW5mbyBOZWlnaGJybyBBUHMuCi0JCQkJRW5xdWV1ZUNoU3dBbm4ocEFkLCBwREEsIENoU3dNb2RlLCBDaGFubmVsKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZiAvLyBXRFNfU1VQUE9SVCAvLwotfQotCi1zdGF0aWMgVk9JRCBTdGFydERGU1Byb2NlZHVyZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIFVJTlQ4IENoU3dNb2RlKQotewotCS8vIHN0YXJ0IERGUyBwcm9jZWR1cmUKLQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gQ2hhbm5lbDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlOX0NoYW5uZWxDaGVjayhwQWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NXSVRDSElOR19NT0RFOwotCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LkNTQ291bnQgPSAwOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgotCi0JUGFyYW1ldHJzOgotCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJMi4gbWVzc2FnZSBsZW5ndGguCi0JCTMuIENoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBpbmZvbWF0aW9uIGJ1ZmZlci4KLQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLS8qCi0gIENoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBJRS4KLSAgKy0tLS0rLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKwotICB8IElEIHwgTGVuIHxDaCBTdyBNb2RlIHwgTmV3IENoIE51bSB8IENoIFN3IENudCB8Ci0gICstLS0tKy0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKLSAgICAxICAgIDEgICAgICAgIDEgICAgICAgICAgIDEgICAgICAgICAgICAxCi0qLwotc3RhdGljIEJPT0xFQU4gUGVlckNoU3dBbm5TYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBDSF9TV19BTk5fSU5GTyBwQ2hTd0FubkluZm8pCi17Ci0JUEZSQU1FXzgwMl8xMSBGciA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0JUFVDSEFSIHBGcmFtZVB0ciA9IEZyLT5PY3RldDsKLQlCT09MRUFOIHJlc3VsdCA9IEZBTFNFOwotCVBFSURfU1RSVUNUIGVpZF9wdHI7Ci0KLQkvLyBza2lwIDgwMi4xMSBoZWFkZXIuCi0JTXNnTGVuIC09IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCS8vIHNraXAgY2F0ZWdvcnkgYW5kIGFjdGlvbiBjb2RlLgotCXBGcmFtZVB0ciArPSAyOwotCU1zZ0xlbiAtPSAyOwotCi0JaWYgKHBDaFN3QW5uSW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JZWlkX3B0ciA9IChQRUlEX1NUUlVDVClwRnJhbWVQdHI7Ci0Jd2hpbGUgKCgoVUNIQVIqKWVpZF9wdHIgKyBlaWRfcHRyLT5MZW4gKyAxKSA8ICgoUFVDSEFSKXBGcmFtZVB0ciArIE1zZ0xlbikpCi0JewotCQlzd2l0Y2goZWlkX3B0ci0+RWlkKQotCQl7Ci0JCQljYXNlIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcENoU3dBbm5JbmZvLT5DaFN3TW9kZSwgZWlkX3B0ci0+T2N0ZXQsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQ2hTd0FubkluZm8tPkNoYW5uZWwsIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBDaFN3QW5uSW5mby0+Q2hTd0NudCwgZWlkX3B0ci0+T2N0ZXQgKyAyLCAxKTsKLQotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbiBmcmFtZSBzYW5pdHkgY2hlY2suCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCQkyLiBtZXNzYWdlIGxlbmd0aC4KLQkJMy4gTWVhc3VyZW1lbnQgcmVxdWVzdCBpbmZvbWF0aW9uIGJ1ZmZlci4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIEJPT0xFQU4gUGVlck1lYXN1cmVSZXFTYW5pdHkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVk9JRCAqcE1zZywKLQlJTiBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVSU5UOCBwRGlhbG9nVG9rZW4sCi0JT1VUIFBNRUFTVVJFX1JFUV9JTkZPIHBNZWFzdXJlUmVxSW5mbywKLQlPVVQgUE1FQVNVUkVfUkVRIHBNZWFzdXJlUmVxKQotewotCVBGUkFNRV84MDJfMTEgRnIgPSAoUEZSQU1FXzgwMl8xMSlwTXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBGci0+T2N0ZXQ7Ci0JQk9PTEVBTiByZXN1bHQgPSBGQUxTRTsKLQlQRUlEX1NUUlVDVCBlaWRfcHRyOwotCVBVQ0hBUiBwdHI7Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQotCS8vIHNraXAgODAyLjExIGhlYWRlci4KLQlNc2dMZW4gLT0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCi0JLy8gc2tpcCBjYXRlZ29yeSBhbmQgYWN0aW9uIGNvZGUuCi0JcEZyYW1lUHRyICs9IDI7Ci0JTXNnTGVuIC09IDI7Ci0KLQlpZiAocE1lYXN1cmVSZXFJbmZvID09IE5VTEwpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlOZGlzTW92ZU1lbW9yeShwRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0JcEZyYW1lUHRyICs9IDE7Ci0JTXNnTGVuIC09IDE7Ci0KLQllaWRfcHRyID0gKFBFSURfU1RSVUNUKXBGcmFtZVB0cjsKLQl3aGlsZSAoKChVQ0hBUiopZWlkX3B0ciArIGVpZF9wdHItPkxlbiArIDEpIDwgKChQVUNIQVIpcEZyYW1lUHRyICsgTXNnTGVuKSkKLQl7Ci0JCXN3aXRjaChlaWRfcHRyLT5FaWQpCi0JCXsKLQkJCWNhc2UgSUVfTUVBU1VSRU1FTlRfUkVRVUVTVDoKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5Ub2tlbiwgZWlkX3B0ci0+T2N0ZXQsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcUluZm8tPlJlcU1vZGUud29yZCwgZWlkX3B0ci0+T2N0ZXQgKyAxLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXFJbmZvLT5SZXFUeXBlLCBlaWRfcHRyLT5PY3RldCArIDIsIDEpOwotCQkJCXB0ciA9IChQVUNIQVIpKGVpZF9wdHItPk9jdGV0ICsgMyk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVxLT5DaE51bSwgcHRyLCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmTWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJcE1lYXN1cmVSZXEtPk1lYXN1cmVTdGFydFRpbWUgPSBTV0FQNjQoTWVhc3VyZVN0YXJ0VGltZSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJcE1lYXN1cmVSZXEtPk1lYXN1cmVEdXJhdGlvbiA9IFNXQVAxNihNZWFzdXJlRHVyYXRpb24pOwotCi0JCQkJcmVzdWx0ID0gVFJVRTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1lYXN1cmVtZW50IHJlcG9ydCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgotCi0JUGFyYW1ldHJzOgotCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJMi4gbWVzc2FnZSBsZW5ndGguCi0JCTMuIE1lYXN1cmVtZW50IHJlcG9ydCBpbmZvbWF0aW9uIGJ1ZmZlci4KLQkJNC4gYmFzaWMgcmVwb3J0IGluZm9tYXRpb24gYnVmZmVyLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLS8qCi0gIE1lYXN1cmVtZW50IFJlcG9ydCBJRS4KLSAgKy0tLS0rLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCi0gIHwgSUQgfCBMZW4gfCBUb2tlbiB8IFJlcG9ydCBNb2RlIHwgTWVhc3VyZSBUeXBlIHwgTWVhc3VyZSBSZXBvcnQgfAotICArLS0tLSstLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAxICAgICAxICAgICAgMSAgICAgICAgICAxICAgICAgICAgICAgIDEgICAgICAgICAgICB2YXJpYWJsZQotCi0gIEJhc2ljIFJlcG9ydC4KLSAgKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKwotICB8IENoIE51bSB8IFN0YXJ0IFRpbWUgfCBEdXJhdGlvbiB8IE1hcCB8Ci0gICstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLSsKLSAgICAgIDEgICAgICAgICAgOCAgICAgICAgICAgMiAgICAgICAgMQotCi0gIE1hcCBGaWVsZCBCaXQgRm9ybWF0LgotICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotICB8IEJzcyB8IE9GRE0gUHJlYW1ibGUgfCBVbmlkZW50aWZpZWQgc2lnbmFsIHwgUmFkYXIgfCBVbm1lYXN1cmVkIHwgUmVzZXJ2ZWQgfAotICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKwotICAgICAwICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAzICAgICAgICAgNCAgICAgICAgICA1LTcKLSovCi1zdGF0aWMgQk9PTEVBTiBQZWVyTWVhc3VyZVJlcG9ydFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKLQlPVVQgUE1FQVNVUkVfUkVQT1JUX0lORk8gcE1lYXN1cmVSZXBvcnRJbmZvLAotCU9VVCBQVUlOVDggcFJlcG9ydEJ1ZikKLXsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OwotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQlQVUNIQVIgcHRyOwotCi0JLy8gc2tpcCA4MDIuMTEgaGVhZGVyLgotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KLQlwRnJhbWVQdHIgKz0gMjsKLQlNc2dMZW4gLT0gMjsKLQotCWlmIChwTWVhc3VyZVJlcG9ydEluZm8gPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCU5kaXNNb3ZlTWVtb3J5KHBEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKLQlwRnJhbWVQdHIgKz0gMTsKLQlNc2dMZW4gLT0gMTsKLQotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9NRUFTVVJFTUVOVF9SRVBPUlQ6Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBNZWFzdXJlUmVwb3J0SW5mby0+VG9rZW4sIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcE1lYXN1cmVSZXBvcnRJbmZvLT5SZXBvcnRNb2RlLCBlaWRfcHRyLT5PY3RldCArIDEsIDEpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUsIGVpZF9wdHItPk9jdGV0ICsgMiwgMSk7Ci0JCQkJaWYgKHBNZWFzdXJlUmVwb3J0SW5mby0+UmVwb3J0VHlwZSA9PSBSTV9CQVNJQykKLQkJCQl7Ci0JCQkJCVBNRUFTVVJFX0JBU0lDX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0JBU0lDX1JFUE9SVClwUmVwb3J0QnVmOwotCQkJCQlwdHIgPSAoUFVDSEFSKShlaWRfcHRyLT5PY3RldCArIDMpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q2hOdW0sIHB0ciwgMSk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlU3RhcnRUaW1lLCBwdHIgKyAxLCA4KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVEdXJhdGlvbiwgcHRyICsgOSwgMik7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NYXAsIHB0ciArIDExLCAxKTsKLQotCQkJCX0KLQkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fQ0NBKQotCQkJCXsKLQkJCQkJUE1FQVNVUkVfQ0NBX1JFUE9SVCBwUmVwb3J0ID0gKFBNRUFTVVJFX0NDQV9SRVBPUlQpcFJlcG9ydEJ1ZjsKLQkJCQkJcHRyID0gKFBVQ0hBUikoZWlkX3B0ci0+T2N0ZXQgKyAzKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPkNoTnVtLCBwdHIsIDEpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZVN0YXJ0VGltZSwgcHRyICsgMSwgOCk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5NZWFzdXJlRHVyYXRpb24sIHB0ciArIDksIDIpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+Q0NBX0J1c3lfRnJhY3Rpb24sIHB0ciArIDExLCAxKTsKLQotCQkJCX0KLQkJCQllbHNlIGlmIChwTWVhc3VyZVJlcG9ydEluZm8tPlJlcG9ydFR5cGUgPT0gUk1fUlBJX0hJU1RPR1JBTSkKLQkJCQl7Ci0JCQkJCVBNRUFTVVJFX1JQSV9SRVBPUlQgcFJlcG9ydCA9IChQTUVBU1VSRV9SUElfUkVQT1JUKXBSZXBvcnRCdWY7Ci0JCQkJCXB0ciA9IChQVUNIQVIpKGVpZF9wdHItPk9jdGV0ICsgMyk7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KCZwUmVwb3J0LT5DaE51bSwgcHRyLCAxKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPk1lYXN1cmVTdGFydFRpbWUsIHB0ciArIDEsIDgpOwotCQkJCQlOZGlzTW92ZU1lbW9yeSgmcFJlcG9ydC0+TWVhc3VyZUR1cmF0aW9uLCBwdHIgKyA5LCAyKTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBSZXBvcnQtPlJQSV9EZW5zaXR5LCBwdHIgKyAxMSwgOCk7Ci0JCQkJfQotCQkJCXJlc3VsdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJZWlkX3B0ciA9IChQRUlEX1NUUlVDVCkoKFVDSEFSKillaWRfcHRyICsgMiArIGVpZF9wdHItPkxlbik7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUUEMgUmVxdWVzdCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgotCi0JUGFyYW1ldHJzOgotCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJMi4gbWVzc2FnZSBsZW5ndGguCi0JCTMuIERpYWxvZyBUb2tlbi4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIEJPT0xFQU4gUGVlclRwY1JlcVNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbikKLXsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OwotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KLQlwRnJhbWVQdHIgKz0gMjsKLQlNc2dMZW4gLT0gMjsKLQotCWlmIChwRGlhbG9nVG9rZW4gPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCU5kaXNNb3ZlTWVtb3J5KHBEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKLQlwRnJhbWVQdHIgKz0gMTsKLQlNc2dMZW4gLT0gMTsKLQotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9UUENfUkVRVUVTVDoKLQkJCQlyZXN1bHQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopZWlkX3B0ciArIDIgKyBlaWRfcHRyLT5MZW4pOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVFBDIFJlcG9ydCBhY3Rpb24gZnJhbWUgc2FuaXR5IGNoZWNrLgotCi0JUGFyYW1ldHJzOgotCQkxLiBNTE1FIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJMi4gbWVzc2FnZSBsZW5ndGguCi0JCTMuIERpYWxvZyBUb2tlbi4KLQkJNC4gVFBDIFJlcG9ydCBJRS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotc3RhdGljIEJPT0xFQU4gUGVlclRwY1JlcFNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBWT0lEICpwTXNnLAotCUlOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVJTlQ4IHBEaWFsb2dUb2tlbiwKLQlPVVQgUFRQQ19SRVBPUlRfSU5GTyBwVHBjUmVwSW5mbykKLXsKLQlQRlJBTUVfODAyXzExIEZyID0gKFBGUkFNRV84MDJfMTEpcE1zZzsKLQlQVUNIQVIgcEZyYW1lUHRyID0gRnItPk9jdGV0OwotCUJPT0xFQU4gcmVzdWx0ID0gRkFMU0U7Ci0JUEVJRF9TVFJVQ1QgZWlkX3B0cjsKLQotCU1zZ0xlbiAtPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0KLQkvLyBza2lwIGNhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KLQlwRnJhbWVQdHIgKz0gMjsKLQlNc2dMZW4gLT0gMjsKLQotCWlmIChwRGlhbG9nVG9rZW4gPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCU5kaXNNb3ZlTWVtb3J5KHBEaWFsb2dUb2tlbiwgcEZyYW1lUHRyLCAxKTsKLQlwRnJhbWVQdHIgKz0gMTsKLQlNc2dMZW4gLT0gMTsKLQotCWVpZF9wdHIgPSAoUEVJRF9TVFJVQ1QpcEZyYW1lUHRyOwotCXdoaWxlICgoKFVDSEFSKillaWRfcHRyICsgZWlkX3B0ci0+TGVuICsgMSkgPCAoKFBVQ0hBUilwRnJhbWVQdHIgKyBNc2dMZW4pKQotCXsKLQkJc3dpdGNoKGVpZF9wdHItPkVpZCkKLQkJewotCQkJY2FzZSBJRV9UUENfUkVQT1JUOgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwVHBjUmVwSW5mby0+VHhQd3IsIGVpZF9wdHItPk9jdGV0LCAxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcFRwY1JlcEluZm8tPkxpbmtNYXJnaW4sIGVpZF9wdHItPk9jdGV0ICsgMSwgMSk7Ci0JCQkJcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQllaWRfcHRyID0gKFBFSURfU1RSVUNUKSgoVUNIQVIqKWVpZF9wdHIgKyAyICsgZWlkX3B0ci0+TGVuKTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUNoYW5uZWwgU3dpdGNoIEFubm91bmNlbWVudCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyQ2hTd0FubkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JQ0hfU1dfQU5OX0lORk8gQ2hTd0FubkluZm87Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JVUNIQVIgaW5kZXggPSAwLCBDaGFubmVsID0gMCwgTmV3Q2hhbm5lbCA9IDA7Ci0JVUxPTkcgQnNzaWR4ID0gMDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCU5kaXNaZXJvTWVtb3J5KCZDaFN3QW5uSW5mbywgc2l6ZW9mKENIX1NXX0FOTl9JTkZPKSk7Ci0JaWYgKCEgUGVlckNoU3dBbm5TYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkNoU3dBbm5JbmZvKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkludmFsaWQgQ2hhbm5lbCBTd2l0Y2ggQWN0aW9uIEZyYW1lLlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCUJzc2lkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIHBGci0+SGRyLkFkZHIzLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQ2hTd0FubkFjdGlvbiAtIEJzc2lkeCBpcyBub3QgZm91bmRcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlxuKioqKkJzc2lkeCBpcyAlZCwgQ2hhbm5lbCA9ICVkXG4iLCBpbmRleCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCkpOwotCQloZXhfZHVtcCgiU1NJRCIscEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQnNzaWQgLDYpOwotCi0JCUNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCQlOZXdDaGFubmVsID0gQ2hTd0FubkluZm8uQ2hhbm5lbDsKLQotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmIChOZXdDaGFubmVsICE9IDApICYmIChDaGFubmVsICE9IE5ld0NoYW5uZWwpKQotCQl7Ci0JCQkvLyBTd2l0Y2hpbmcgdG8gY2hhbm5lbCAxIGNhbiBwcmV2ZW50IGZyb20gcmVzY2FubmluZyB0aGUgY3VycmVudCBjaGFubmVsIGltbWVkaWF0ZWx5IChieSBhdXRvIHJlY29ubmVjdGlvbikuCi0JCQkvLyBJbiBhZGRpdGlvbiwgY2xlYXIgdGhlIE1MTUUgcXVldWUgYW5kIHRoZSBzY2FuIHRhYmxlIHRvIGRpc2NhcmQgdGhlIFJYIHBhY2tldHMgYW5kIHByZXZpb3VzIHNjYW5uaW5nIHJlc3VsdHMuCi0JCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIDEsIEZBTFNFKTsKLQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIDEpOwotCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQlNbG1lUXVldWVJbml0KCZwQWQtPk1sbWUuUXVldWUpOwotCQkJQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCQkgICAgUlRNUHVzZWNEZWxheSgxMDAwMDAwKTsJCS8vIHVzZSBkZWxheSB0byBwcmV2ZW50IFNUQSBkbyByZWFzc29jCi0KLQkJCS8vIGNoYW5uZWwgc2FuaXR5IGNoZWNrCi0JCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgcEFkLT5DaGFubmVsTGlzdE51bTsgaW5kZXgrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5DaGFubmVsTGlzdFtpbmRleF0uQ2hhbm5lbCA9PSBOZXdDaGFubmVsKQotCQkJCXsKLQkJCQkJcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uQ2hhbm5lbCA9IE5ld0NoYW5uZWw7Ci0JCQkJCXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCQkJCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiYmJiYmJiYmJiYmJiYmJiZQZWVyQ2hTd0FubkFjdGlvbiAtIFNUQSByZWNlaXZlIGNoYW5uZWwgc3dpdGNoIGFubm91bmNlbWVudCBJRSAoTmV3IENoYW5uZWwgPSVkKVxuIiwgTmV3Q2hhbm5lbCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbmRleCA+PSBwQWQtPkNoYW5uZWxMaXN0TnVtKQotCQkJewotCQkJCURCR1BSSU5UX0VSUigoIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmUGVlckNoU3dBbm5BY3Rpb24oY2FuIG5vdCBmaW5kIE5ldyBDaGFubmVsPSVkIGluIENoYW5uZWxMaXN0WyVkXVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcEFkLT5DaGFubmVsTGlzdE51bSkpOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTWVhc3VyZW1lbnQgUmVxdWVzdCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyTWVhc3VyZVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUEZSQU1FXzgwMl8xMSBwRnIgPSAoUEZSQU1FXzgwMl8xMSlFbGVtLT5Nc2c7Ci0JVUlOVDggRGlhbG9nVG9rZW47Ci0JTUVBU1VSRV9SRVFfSU5GTyBNZWFzdXJlUmVxSW5mbzsKLQlNRUFTVVJFX1JFUQlNZWFzdXJlUmVxOwotCU1FQVNVUkVfUkVQT1JUX01PREUgUmVwb3J0TW9kZTsKLQotCWlmKFBlZXJNZWFzdXJlUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJk1lYXN1cmVSZXFJbmZvLCAmTWVhc3VyZVJlcSkpCi0JewotCQlSZXBvcnRNb2RlLndvcmQgPSAwOwotCQlSZXBvcnRNb2RlLmZpZWxkLkluY2FwYWJsZSA9IDE7Ci0JCUVucXVldWVNZWFzdXJlbWVudFJlcChwQWQsIHBGci0+SGRyLkFkZHIyLCBEaWFsb2dUb2tlbiwgTWVhc3VyZVJlcUluZm8uVG9rZW4sIFJlcG9ydE1vZGUud29yZCwgTWVhc3VyZVJlcUluZm8uUmVxVHlwZSwgMCwgTlVMTCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1lYXN1cmVtZW50IFJlcG9ydCBhY3Rpb24gZnJhbWUgaGFuZGxlci4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1zdGF0aWMgVk9JRCBQZWVyTWVhc3VyZVJlcG9ydEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JTUVBU1VSRV9SRVBPUlRfSU5GTyBNZWFzdXJlUmVwb3J0SW5mbzsKLQlQRlJBTUVfODAyXzExIHBGciA9IChQRlJBTUVfODAyXzExKUVsZW0tPk1zZzsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlQVUlOVDggcE1lYXN1cmVSZXBvcnRJbmZvOwotCi0vLwlpZiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggIT0gVFJVRSkKLS8vCQlyZXR1cm47Ci0KLQlpZiAoKHBNZWFzdXJlUmVwb3J0SW5mbyA9IGttYWxsb2Moc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgdW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgbWVhc3VyZSByZXBvcnQgYnVmZmVyIChzaXplPSVkKS5cbiIsIF9fRlVOQ1RJT05fXywgc2l6ZW9mKE1FQVNVUkVfUlBJX1JFUE9SVCkpKTsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KCZNZWFzdXJlUmVwb3J0SW5mbywgc2l6ZW9mKE1FQVNVUkVfUkVQT1JUX0lORk8pKTsKLQlOZGlzWmVyb01lbW9yeShwTWVhc3VyZVJlcG9ydEluZm8sIHNpemVvZihNRUFTVVJFX1JQSV9SRVBPUlQpKTsKLQlpZiAoUGVlck1lYXN1cmVSZXBvcnRTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgJkRpYWxvZ1Rva2VuLCAmTWVhc3VyZVJlcG9ydEluZm8sIHBNZWFzdXJlUmVwb3J0SW5mbykpCi0JewotCQlkbyB7Ci0JCQlQTUVBU1VSRV9SRVFfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQotCQkJLy8gTm90IGEgYXV0b25vbW91cyBtZWFzdXJlIHJlcG9ydC4KLQkJCS8vIGNoZWNrIHRoZSBkaWFsb2cgdG9rZW4gZmllbGQuIGRyb3AgaXQgaWYgdGhlIGRpYWxvZyB0b2tlbiBkb2Vzbid0IG1hdGNoLgotCQkJaWYgKChEaWFsb2dUb2tlbiAhPSAwKQotCQkJCSYmICgocEVudHJ5ID0gTWVhc3VyZVJlcUxvb2tVcChwQWQsIERpYWxvZ1Rva2VuKSkgPT0gTlVMTCkpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChwRW50cnkgIT0gTlVMTCkKLQkJCQlNZWFzdXJlUmVxRGVsZXRlKHBBZCwgcEVudHJ5LT5EaWFsb2dUb2tlbik7Ci0KLQkJCWlmIChNZWFzdXJlUmVwb3J0SW5mby5SZXBvcnRUeXBlID09IFJNX0JBU0lDKQotCQkJewotCQkJCVBNRUFTVVJFX0JBU0lDX1JFUE9SVCBwQmFzaWNSZXBvcnQgPSAoUE1FQVNVUkVfQkFTSUNfUkVQT1JUKXBNZWFzdXJlUmVwb3J0SW5mbzsKLQkJCQlpZiAoKHBCYXNpY1JlcG9ydC0+TWFwLmZpZWxkLlJhZGFyKQotCQkJCQkmJiAoRGZzUmVxdWlyZW1lbnRDaGVjayhwQWQsIHBCYXNpY1JlcG9ydC0+Q2hOdW0pID09IFRSVUUpKQotCQkJCXsKLQkJCQkJTm90aWZ5Q2hTd0FublRvUGVlckFQcyhwQWQsIHBGci0+SGRyLkFkZHIxLCBwRnItPkhkci5BZGRyMiwgMSwgcEJhc2ljUmVwb3J0LT5DaE51bSk7Ci0JCQkJCVN0YXJ0REZTUHJvY2VkdXJlKHBBZCwgcEJhc2ljUmVwb3J0LT5DaE51bSwgMSk7Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlIChGQUxTRSk7Ci0JfQotCWVsc2UKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZCBNZWFzdXJlbWVudCBSZXBvcnQgRnJhbWUuXG4iKSk7Ci0KLQlrZnJlZShwTWVhc3VyZVJlcG9ydEluZm8pOwotCi0JcmV0dXJuOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgotCi0JUGFyYW1ldHJzOgotCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIFBlZXJUcGNSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBGUkFNRV84MDJfMTEgcEZyID0gKFBGUkFNRV84MDJfMTEpRWxlbS0+TXNnOwotCVBVQ0hBUiBwRnJhbWVQdHIgPSBwRnItPk9jdGV0OwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVVJTlQ4IFR4UHdyID0gR2V0Q3VyVHhQd3IocEFkLCBFbGVtLT5XY2lkKTsKLQlVSU5UOCBMaW5rTWFyZ2luID0gMDsKLQlDSEFSIFJlYWxSc3NpOwotCi0JLy8gbGluayBtYXJnaW46IFJhdGlvIG9mIHRoZSByZWNlaXZlZCBzaWduYWwgcG93ZXIgdG8gdGhlIG1pbmltdW0gZGVzaXJlZCBieSB0aGUgc3RhdGlvbiAoU1RBKS4gVGhlCi0JLy8JCQkJU1RBIG1heSBpbmNvcnBvcmF0ZSByYXRlIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIGNvbmRpdGlvbnMsIGluY2x1ZGluZyBpbnRlcmZlcmVuY2UsIGludG8gaXRzIGNvbXB1dGF0aW9uCi0JLy8JCQkJb2YgbGluayBtYXJnaW4uCi0KLQlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLAotCQkJCQkJCQlDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksCi0JCQkJCQkJCUNvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7Ci0KLQkvLyBza2lwIENhdGVnb3J5IGFuZCBhY3Rpb24gY29kZS4KLQlwRnJhbWVQdHIgKz0gMjsKLQotCS8vIERpYWxvZyB0b2tlbi4KLQlOZGlzTW92ZU1lbW9yeSgmRGlhbG9nVG9rZW4sIHBGcmFtZVB0ciwgMSk7Ci0KLQlMaW5rTWFyZ2luID0gKFJlYWxSc3NpIC8gTUlOX1JDVl9QV1IpOwotCWlmIChQZWVyVHBjUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbikpCi0JCUVucXVldWVUUENSZXAocEFkLCBwRnItPkhkci5BZGRyMiwgRGlhbG9nVG9rZW4sIFR4UHdyLCBMaW5rTWFyZ2luKTsKLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlUUEMgUmVwb3J0IGFjdGlvbiBmcmFtZSBoYW5kbGVyLgotCi0JUGFyYW1ldHJzOgotCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLXN0YXRpYyBWT0lEIFBlZXJUcGNSZXBBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVJTlQ4IERpYWxvZ1Rva2VuOwotCVRQQ19SRVBPUlRfSU5GTyBUcGNSZXBJbmZvOwotCVBUUENfUkVRX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlOZGlzWmVyb01lbW9yeSgmVHBjUmVwSW5mbywgc2l6ZW9mKFRQQ19SRVBPUlRfSU5GTykpOwotCWlmIChQZWVyVHBjUmVwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZEaWFsb2dUb2tlbiwgJlRwY1JlcEluZm8pKQotCXsKLQkJaWYgKChwRW50cnkgPSBUcGNSZXFMb29rVXAocEFkLCBEaWFsb2dUb2tlbikpICE9IE5VTEwpCi0JCXsKLQkJCVRwY1JlcURlbGV0ZShwQWQsIHBFbnRyeS0+RGlhbG9nVG9rZW4pOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IERpYWxvZ1Rva2VuPSV4LCBUeFB3cj0lZCwgTGlua01hcmdpbj0lZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIERpYWxvZ1Rva2VuLCBUcGNSZXBJbmZvLlR4UHdyLCBUcGNSZXBJbmZvLkxpbmtNYXJnaW4pKTsKLQkJfQotCX0KLQotCXJldHVybjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlTcGVjdHJ1biBhY3Rpb24gZnJhbWVzIEhhbmRsZXIgc3VjaCBhcyBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCwKLQkJbWVhc3VyZW1lbnQgcmVwb3J0LCBtZWFzdXJlbWVudCByZXF1ZXN0IGFjdGlvbnMgZnJhbWVzLgotCi0JUGFyYW1ldHJzOgotCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlclNwZWN0cnVtQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQotCVVDSEFSCUFjdGlvbiA9IEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzFdOwotCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIICE9IFRSVUUpCi0JCXJldHVybjsKLQotCXN3aXRjaChBY3Rpb24pCi0JewotCQljYXNlIFNQRUNfTVJROgotCQkJLy8gY3VycmVudCBydDI4NjAgdW5hYmxlIGRvIHN1Y2ggbWVhc3VyZSBzcGVjaWZpZWQgaW4gTWVhc3VyZW1lbnQgUmVxdWVzdC4KLQkJCS8vIHJlamVjdCBhbGwgbWVhc3VyZW1lbnQgcmVxdWVzdC4KLQkJCVBlZXJNZWFzdXJlUmVxQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFNQRUNfTVJQOgotCQkJUGVlck1lYXN1cmVSZXBvcnRBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1BFQ19UUENSUToKLQkJCVBlZXJUcGNSZXFBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1BFQ19UUENSUDoKLQkJCVBlZXJUcGNSZXBBY3Rpb24ocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1BFQ19DSEFOTkVMX1NXSVRDSDoKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQkJCXsKLQkJCQlTRUNfQ0hBX09GRlNFVF9JRQlTZWNvbmRhcnk7Ci0JCQkJQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRQlDaGFubmVsU3dpdGNoOwotCi0JCQkJLy8gODAyLjExaCBvbmx5IGhhcyBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgSUUuCi0JCQkJUlRNUE1vdmVNZW1vcnkoJkNoYW5uZWxTd2l0Y2gsICZFbGVtLT5Nc2dbTEVOR1RIXzgwMl8xMSs0XSwgc2l6ZW9mIChDSEFfU1dJVENIX0FOTk9VTkNFX0lFKSk7Ci0KLQkJCQkvLyA4MDIuMTFuIEQzLjAzIGFkZHMgc2Vjb25kYXJ5IGNoYW5uZWwgb2Zmc2V0IGVsZW1lbnQgaW4gdGhlIGVuZC4KLQkJCQlpZiAoRWxlbS0+TXNnTGVuID09ICAoTEVOR1RIXzgwMl8xMSArIDIgKyBzaXplb2YgKENIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUpICsgc2l6ZW9mIChTRUNfQ0hBX09GRlNFVF9JRSkpKQotCQkJCXsKLQkJCQkJUlRNUE1vdmVNZW1vcnkoJlNlY29uZGFyeSwgJkVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzldLCBzaXplb2YgKFNFQ19DSEFfT0ZGU0VUX0lFKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVNlY29uZGFyeS5TZWNvbmRhcnlDaGFubmVsT2Zmc2V0ID0gMDsKLQkJCQl9Ci0KLQkJCQlpZiAoKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzJdID09IElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCkgJiYgKEVsZW0tPk1zZ1tMRU5HVEhfODAyXzExKzNdID09IDMpKQotCQkJCXsKLQkJCQkJQ2hhbm5lbFN3aXRjaEFjdGlvbihwQWQsIEVsZW0tPldjaWQsIENoYW5uZWxTd2l0Y2guTmV3Q2hhbm5lbCwgU2Vjb25kYXJ5LlNlY29uZGFyeUNoYW5uZWxPZmZzZXQpOwotCQkJCX0KLQkJCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLQkJCVBlZXJDaFN3QW5uQWN0aW9uKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCVBhcmFtZXRyczoKLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotSU5UIFNldF9NZWFzdXJlUmVxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UIEFpZCA9IDE7Ci0JVUlOVCBBcmdJZHg7Ci0JUFNUUklORyB0aGlzQ2hhcjsKLQotCU1FQVNVUkVfUkVRX01PREUgTWVhc3VyZVJlcU1vZGU7Ci0JVUlOVDggTWVhc3VyZVJlcVRva2VuID0gUmFuZG9tQnl0ZShwQWQpOwotCVVJTlQ4IE1lYXN1cmVSZXFUeXBlID0gUk1fQkFTSUM7Ci0JVUlOVDggTWVhc3VyZUNoID0gMTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZSA9IEdldEN1cnJlbnRUaW1lU3RhbXAocEFkKTsKLQlNRUFTVVJFX1JFUSBNZWFzdXJlUmVxOwotCVVJTlQ4IFRvdGFsTGVuOwotCi0JSEVBREVSXzgwMl8xMSBBY3RIZHI7Ci0JUFVDSEFSIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTIE5TdGF0dXM7Ci0JVUxPTkcgRnJhbWVMZW47Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBWT0lEKSZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcygpIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJZ290byBFTkRfT0ZfTUVBU1VSRV9SRVE7Ci0JfQotCi0JQXJnSWR4ID0gMTsKLQl3aGlsZSAoKHRoaXNDaGFyID0gc3Ryc2VwKChjaGFyICoqKSZhcmcsICItIikpICE9IE5VTEwpCi0JewotCQlzd2l0Y2goQXJnSWR4KQotCQl7Ci0JCQljYXNlIDE6CS8vIEFpZC4KLQkJCQlBaWQgPSAoVUlOVDgpIHNpbXBsZV9zdHJ0b2wodGhpc0NoYXIsIDAsIDE2KTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAyOiAvLyBNZWFzdXJlbWVudCBSZXF1ZXN0IFR5cGUuCi0JCQkJTWVhc3VyZVJlcVR5cGUgPSBzaW1wbGVfc3RydG9sKHRoaXNDaGFyLCAwLCAxNik7Ci0JCQkJaWYgKE1lYXN1cmVSZXFUeXBlID4gMykKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgTWVhc3VyZVJlcVR5cGUoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIE1lYXN1cmVSZXFUeXBlKSk7Ci0JCQkJCWdvdG8gRU5EX09GX01FQVNVUkVfUkVROwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOiAvLyBNZWFzdXJlbWVudCBjaGFubmVsLgotCQkJCU1lYXN1cmVDaCA9IChVSU5UOCkgc2ltcGxlX3N0cnRvbCh0aGlzQ2hhciwgMCwgMTYpOwotCQkJCWJyZWFrOwotCQl9Ci0JCUFyZ0lkeCsrOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZCwgTWVhc3VyZVJlcVR5cGU9JWQgTWVhc3VyZUNoPSVkXG4iLCBfX0ZVTkNUSU9OX18sIEFpZCwgTWVhc3VyZVJlcVR5cGUsIE1lYXN1cmVDaCkpOwotCWlmICghVkFMSURfV0NJRChBaWQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IHVua25vdyBzdGEgb2YgQWlkKCVkKVxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKLQkJZ290byBFTkRfT0ZfTUVBU1VSRV9SRVE7Ci0JfQotCi0JTWVhc3VyZVJlcU1vZGUud29yZCA9IDA7Ci0JTWVhc3VyZVJlcU1vZGUuZmllbGQuRW5hYmxlID0gMTsKLQotCU1lYXN1cmVSZXFJbnNlcnQocEFkLCBNZWFzdXJlUmVxVG9rZW4pOwotCi0JLy8gYnVpbGQgYWN0aW9uIGZyYW1lIGhlYWRlci4KLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkFjdEhkciwgU1VCVFlQRV9BQ1RJT04sIDAsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQWlkXS5BZGRyLAotCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0KLQlOZGlzTW92ZU1lbW9yeShwT3V0QnVmZmVyLCAoUENIQVIpJkFjdEhkciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQlGcmFtZUxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCVRvdGFsTGVuID0gc2l6ZW9mKE1FQVNVUkVfUkVRX0lORk8pICsgc2l6ZW9mKE1FQVNVUkVfUkVRKTsKLQotCU1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKHBBZCwgcE91dEJ1ZmZlciwgJkZyYW1lTGVuLAotCQlzaXplb2YoTUVBU1VSRV9SRVFfSU5GTyksIENBVEVHT1JZX1JNLCBSTV9CQVNJQywKLQkJTWVhc3VyZVJlcVRva2VuLCBNZWFzdXJlUmVxTW9kZS53b3JkLAotCQlNZWFzdXJlUmVxVHlwZSwgMCk7Ci0KLQlNZWFzdXJlUmVxLkNoTnVtID0gTWVhc3VyZUNoOwotCU1lYXN1cmVSZXEuTWVhc3VyZVN0YXJ0VGltZSA9IGNwdTJsZTY0KE1lYXN1cmVTdGFydFRpbWUpOwotCU1lYXN1cmVSZXEuTWVhc3VyZUR1cmF0aW9uID0gY3B1MmxlMTYoMjAwMCk7Ci0KLQl7Ci0JCVVMT05HIFRlbXBMZW47Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKAlwT3V0QnVmZmVyK0ZyYW1lTGVuLAkmVGVtcExlbiwKLQkJCQkJCQlzaXplb2YoTUVBU1VSRV9SRVEpLAkmTWVhc3VyZVJlcSwKLQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCUZyYW1lTGVuICs9IFRlbXBMZW47Ci0JfQotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIChVSU5UKUZyYW1lTGVuKTsKLQotRU5EX09GX01FQVNVUkVfUkVROgotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9UcGNSZXFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQgQWlkOwotCi0JVUlOVDggVHBjUmVxVG9rZW4gPSBSYW5kb21CeXRlKHBBZCk7Ci0KLQlBaWQgPSAoVUlOVCkgc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpBaWQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBBaWQpKTsKLQlpZiAoIVZBTElEX1dDSUQoQWlkKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmtub3cgc3RhIG9mIEFpZCglZClcbiIsIF9fRlVOQ1RJT05fXywgQWlkKSk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCVRwY1JlcUluc2VydChwQWQsIFRwY1JlcVRva2VuKTsKLQotCUVucXVldWVUUENSZXEocEFkLCBwQWQtPk1hY1RhYi5Db250ZW50W0FpZF0uQWRkciwgVHBjUmVxVG9rZW4pOwotCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NvbmZpZy5tayBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29uZmlnLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzkwYzQwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvY29uZmlnLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLSMgU3VwcG9ydCBBVEUgZnVuY3Rpb24KLUhBU19BVEU9eQotCi0jIFN1cHBvcnQgMjh4eCBRQSBBVEUgZnVuY3Rpb24KLUhBU18yOHh4X1FBPW4KLQotCi1IQVNfTklOVEVORE89bgotCi0jIFN1cHBvcnQgTExURCBmdW5jdGlvbgotSEFTX0xMVEQ9bgotCi0jIFN1cHBvcnQgV0RTIGZ1bmN0aW9uCi1IQVNfV0RTPW4KLQotIyBTdXBwb3J0IEFQLUNsaWVudCBmdW5jdGlvbgotSEFTX0FQQ0xJPW4KLQotIyBTdXBwb3J0IFdwYV9TdXBwbGljYW50Ci1IQVNfV1BBX1NVUFBMSUNBTlQ9eQotCi0jIFN1cHBvcnQgTmF0aXZlIFdwYVN1cHBsaWNhbnQgZm9yIE5ldHdvcmsgTWFnYW5nZXIKLUhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVD15Ci0KLSNTdXBwb3J0IE5ldCBpbnRlcmZhY2UgYmxvY2sgd2hpbGUgVHgtU3cgcXVldWUgZnVsbAotSEFTX0JMT0NLX05FVF9JRj1uCi0KLSNTdXBwb3J0IElHTVAtU25vb3BpbmcgZnVuY3Rpb24uCi1IQVNfSUdNUF9TTk9PUF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgREZTIGZ1bmN0aW9uCi1IQVNfREZTX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBDYXJyaWVyLVNlbnNlIGZ1bmN0aW9uCi1IQVNfQ1NfU1VQUE9SVD1uCi0KLSMgU3VwcG9ydCBmb3IgU1RBIEV0aGVybmV0IENvbnZlcnRlcgotSEFTX0VUSF9DT05WRVJUX1NVUFBPUlQ9bgotCi0jIFN1cHBvcnQgdXNlciBzcGVjaWZpYyB0cmFuc21pdCByYXRlIG9mIE11bHRpY2FzdCBwYWNrZXQuCi1IQVNfTUNBU1RfUkFURV9TUEVDSUZJQ19TVVBQT1JUPW4KLQotIyBTdXBwb3J0IGZvciBNdWx0aXBsZSBDYXJkcwotSEFTX01DX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmb3IgUENJLU1TSQotSEFTX01TSV9TVVBQT1JUPW4KLQotCi0jU3VwcG9ydCBmb3IgSUVFRTgwMi4xMWUgRExTCi1IQVNfUU9TX0RMU19TVVBQT1JUPW4KLQotI1N1cHBvcnQgZm9yIEVYVF9DSEFOTkVMCi1IQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVD1uCi0KLSNTdXBwb3J0IGZvciBJRFMKLUhBU19JRFNfU1VQUE9SVD1uCi0KLQotI1N1cHBvcnQgZm9yIE5ldC1TTk1QCi1IQVNfU05NUF9TVVBQT1JUPW4KLQotI1N1cHBvcnQgZmVhdHVyZXMgb2YgODAyLjExbiBEcmFmdDMKLUhBU19ET1QxMU5fRFJBRlQzX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBmZWF0dXJlcyBvZiBTaW5nbGUgU0tVLgotSEFTX1NJTkdMRV9TS1VfU1VQUE9SVD1uCi0KLSNTdXBwb3J0IGZlYXR1cmVzIG9mIDgwMi4xMW4KLUhBU19ET1QxMV9OX1NVUFBPUlQ9eQotCi0KLQotI1N1cHBvcnQgZm9yIDI4NjAvMjg4MCBjby1leGlzdAotSEFTX1JUMjg4MF9SVDI4NjBfQ09FWElTVD1uCi0KLUhBU19LVEhSRUFEX1NVUFBPUlQ9bgotCi0KLSNTdXBwb3J0IGZvciBBdXRvIGNoYW5uZWwgc2VsZWN0IGVuaGFuY2UKLUhBU19BVVRPX0NIX1NFTEVDVF9FTkhBTkNFPW4KLQotI1N1cHBvcnQgYnlwYXNzIGJyaWRnZQotSEFTX0JHX0ZUX1NVUFBPUlQ9bgotCi0jU3VwcG9ydCBBbnRlbm5hIERpdmVyc2l0eQotSEFTX0FOVEVOTkFfRElWRVJTSVRZX1NVUFBPUlQ9eQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1XRkxBR1MgOj0gLURBR0dSRUdBVElPTl9TVVBQT1JUIC1EUElHR1lCQUNLX1NVUFBPUlQgLURXTU1fU1VQUE9SVCAgLURMSU5VWCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdHJpZ3JhcGhzIC1XcG9pbnRlci1zaWduCi0KLWlmZXEgKCQoSEFTX0tUSFJFQURfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtREtUSFJFQURfU1VQUE9SVAotZW5kaWYKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgY29uZmlnIGZvciBTVEEgbW9kZQotCi1XRkxBR1MgKz0gLURDT05GSUdfU1RBX1NVUFBPUlQgLUREQkcKLQotaWZlcSAoJChIQVNfV1BBX1NVUFBMSUNBTlQpLHkpCi1XRkxBR1MgKz0gLURXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1pZmVxICgkKEhBU19OQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1lbmRpZgotZW5kaWYKLQotCi1pZmVxICgkKEhBU19FVEhfQ09OVkVSVF9TVVBQT1JUKSwgeSkKLVdGTEFHUyArPSAtREVUSF9DT05WRVJUX1NVUFBPUlQgIC1ETUFUX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0FURSkseSkKLVdGTEFHUyArPSAtRFJBTElOS19BVEUKLWlmZXEgKCQoSEFTXzI4eHhfUUEpLHkpCi1XRkxBR1MgKz0gLURSQUxJTktfMjh4eF9RQQotZW5kaWYKLWVuZGlmCi0KLQotaWZlcSAoJChIQVNfU05NUF9TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1EU05NUF9TVVBQT1JUCi1lbmRpZgotCi1pZmVxICgkKEhBU19RT1NfRExTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURRT1NfRExTX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0RPVDExX05fU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRERPVDExX05fU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfQ1NfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0FOVEVOTkFfRElWRVJTSVRZX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURBTlRfRElWRVJTSVRZX1NVUFBPUlQKLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIENvbW1vbiBjb21waWxlciBmbGFnCi0jCi0KLQotCi0KLQotaWZlcSAoJChIQVNfRVhUX0JVSUxEX0NIQU5ORUxfTElTVCkseSkKLVdGTEFHUyArPSAtREVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLWVuZGlmCi0KLWlmZXEgKCQoSEFTX0lEU19TVVBQT1JUKSx5KQotV0ZMQUdTICs9IC1ESURTX1NVUFBPUlQKLWVuZGlmCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDaGlwU2V0IHNwZWNpZmljIGRlZmluaXRpb25zLgotIwotV0ZMQUdTICs9LURSVE1QX01BQ19QQ0kgLURSVDMweHggLURSVDMwOTAgIC1EUlRNUF9QQ0lfU1VQUE9SVCAtRFJUTVBfUkZfUldfU1VQUE9SVCAtRFJUTVBfRUZVU0VfU1VQUE9SVAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLWlmZXEgKCQoSEFTX0JMT0NLX05FVF9JRikseSkKLVdGTEFHUyArPSAtREJMT0NLX05FVF9JRgotZW5kaWYKLQotaWZlcSAoJChIQVNfREZTX1NVUFBPUlQpLHkpCi1XRkxBR1MgKz0gLURERlNfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfTUNfU1VQUE9SVCkseSkKLVdGTEFHUyArPSAtRE1VTFRJUExFX0NBUkRfU1VQUE9SVAotZW5kaWYKLQotaWZlcSAoJChIQVNfTExURCkseSkKLVdGTEFHUyArPSAtRExMVERfU1VQUE9SVAotZW5kaWYKLQotRVhUUkFfQ0ZMQUdTIDo9ICQoV0ZMQUdTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9jcnlwdF9zaGEyLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NyeXB0X3NoYTIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVjMDQwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2NyeXB0X3NoYTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIGNyeXB0X3NoYTIuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEVkZHkgICAgICAgIDIwMDgvMTEvMjQgICAgICBDcmVhdGUgU0hBMQotICAgIEVkZHkgICAgICAgIDIwMDgvMDcvMjMgICAgICBDcmVhdGUgU0hBMjU2Ci0qLwotCi0jaWZuZGVmIF9fQ1JZUFRfU0hBMl9IX18KLSNkZWZpbmUgX19DUllQVF9TSEEyX0hfXwotCi0jaWZkZWYgQ1JZUFRfVEVTVFBMQU4KLSNpbmNsdWRlICJjcnlwdF90ZXN0cGxhbi5oIgotI2Vsc2UKLSNpbmNsdWRlICJydF9jb25maWcuaCIKLSNlbmRpZiAvKiBDUllQVF9URVNUUExBTiAqLwotCi0vKiBBbGdvcml0aG0gb3B0aW9ucyAqLwotI2RlZmluZSBTSEExX1NVUFBPUlQKLSNkZWZpbmUgU0hBMjU2X1NVUFBPUlQKLQotI2lmZGVmIFNIQTFfU1VQUE9SVAotI2RlZmluZSBTSEExX0JMT0NLX1NJWkUgICAgNjQgLyogNTEyIGJpdHMgPSA2NCBieXRlcyAqLwotI2RlZmluZSBTSEExX0RJR0VTVF9TSVpFICAgMjAgLyogMTYwIGJpdHMgPSAyMCBieXRlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgX1NIQTFfQ1RYX1NUUlVDIHsKLSAgICBVSU5UMzIgSGFzaFZhbHVlWzVdOyAgLyogNSA9IChTSEExX0RJR0VTVF9TSVpFIC8gMzIpICovCi0gICAgVUlOVDY0IE1lc3NhZ2VMZW47ICAgIC8qIHRvdGFsIHNpemUgKi8KLSAgICBVSU5UOCAgQmxvY2tbU0hBMV9CTE9DS19TSVpFXTsKLSAgICBVSU5UICAgQmxvY2tMZW47Ci19IFNIQTFfQ1RYX1NUUlVDLCAqUFNIQTFfQ1RYX1NUUlVDOwotCi1WT0lEIFNIQTFfSW5pdCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCk7Ci1WT0lEIFNIQTFfSGFzaCAoCi0gICAgSU4gIFNIQTFfQ1RYX1NUUlVDICpwU0hBX0NUWCk7Ci1WT0lEIFNIQTFfQXBwZW5kICgKLSAgICBJTiAgU0hBMV9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbik7Ci1WT0lEIFNIQTFfRW5kICgKLSAgICBJTiAgU0hBMV9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIE9VVCBVSU5UOCBEaWdlc3RNZXNzYWdlW10pOwotVk9JRCBSVF9TSEExICgKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSk7Ci0jZW5kaWYgLyogU0hBMV9TVVBQT1JUICovCi0KLSNpZmRlZiBTSEEyNTZfU1VQUE9SVAotI2RlZmluZSBTSEEyNTZfQkxPQ0tfU0laRSAgIDY0IC8qIDUxMiBiaXRzID0gNjQgYnl0ZXMgKi8KLSNkZWZpbmUgU0hBMjU2X0RJR0VTVF9TSVpFICAzMiAvKiAyNTYgYml0cyA9IDMyIGJ5dGVzICovCi10eXBlZGVmIHN0cnVjdCBfU0hBMjU2X0NUWF9TVFJVQyB7Ci0gICAgVUlOVDMyIEhhc2hWYWx1ZVs4XTsgIC8qIDggPSAoU0hBMjU2X0RJR0VTVF9TSVpFIC8gMzIpICovCi0gICAgVUlOVDY0IE1lc3NhZ2VMZW47ICAgIC8qIHRvdGFsIHNpemUgKi8KLSAgICBVSU5UOCAgQmxvY2tbU0hBMjU2X0JMT0NLX1NJWkVdOwotICAgIFVJTlQgICBCbG9ja0xlbjsKLX0gU0hBMjU2X0NUWF9TVFJVQywgKlBTSEEyNTZfQ1RYX1NUUlVDOwotCi1WT0lEIFNIQTI1Nl9Jbml0ICgKLSAgICBJTiAgU0hBMjU2X0NUWF9TVFJVQyAqcFNIQV9DVFgpOwotVk9JRCBTSEEyNTZfSGFzaCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYKTsKLVZPSUQgU0hBMjU2X0FwcGVuZCAoCi0gICAgSU4gIFNIQTI1Nl9DVFhfU1RSVUMgKnBTSEFfQ1RYLAotICAgIElOICBjb25zdCBVSU5UOCBNZXNzYWdlW10sCi0gICAgSU4gIFVJTlQgTWVzc2FnZUxlbik7Ci1WT0lEIFNIQTI1Nl9FbmQgKAotICAgIElOICBTSEEyNTZfQ1RYX1NUUlVDICpwU0hBX0NUWCwKLSAgICBPVVQgVUlOVDggRGlnZXN0TWVzc2FnZVtdKTsKLVZPSUQgUlRfU0hBMjU2ICgKLSAgICBJTiAgY29uc3QgVUlOVDggTWVzc2FnZVtdLAotICAgIElOICBVSU5UIE1lc3NhZ2VMZW4sCi0gICAgT1VUIFVJTlQ4IERpZ2VzdE1lc3NhZ2VbXSk7Ci0jZW5kaWYgLyogU0hBMjU2X1NVUFBPUlQgKi8KLQotI2VuZGlmIC8qIF9fQ1JZUFRfU0hBMl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZGZzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Rmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY0NjhlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZGZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBkZnMuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEZvbmNoaSAgICAwMy0xMi0yMDA3ICAgICAgY3JlYXRlZAotKi8KLQotI2RlZmluZSBSQURBUl9QVUxTRSAxCi0jZGVmaW5lIFJBREFSX1dJRFRIIDIKLQotI2RlZmluZSBXSURUSF9SRF9JRExFIDAKLSNkZWZpbmUgV0lEVEhfUkRfQ0hFQ0sgMQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqCURGUyBSYWRhciByZWxhdGVkIGRlZmluaXRpb25zLgotICAqCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9UQVNLX05VTQk2Ci0vLyNkZWZpbmUgUkFEQVJfREVURUNUX1RBU0tfTlVNCTcKLQotLy8gTWN1UmFkYXJTdGF0ZSAmJiBNY3VDYXJyaWVyU3RhdGUgZm9yIDI4ODAtU1ctTUNVCi0jZGVmaW5lIEZSRUVfRk9SX1RYCQkJCTAKLSNkZWZpbmUgV0FJVF9DVFNfQkVJTkdfU0VOVAkJMQotI2RlZmluZSBET19ERVRFQ1RJT04JCQkyCi0KLS8vIE1jdVJhZGFyRXZlbnQKLSNkZWZpbmUgUkFEQVJfRVZFTlRfQ1RTX1NFTlQJCQkweDAxIC8vIEhvc3Qgc2lnbmFsIE1DVSB0aGF0IENUUyBoYXMgYmVlbiBzZW50Ci0jZGVmaW5lIFJBREFSX0VWRU5UX0NUU19DQVJSSUVSX1NFTlQJMHgwMiAvLyBIb3N0IHNpZ25hbCBNQ1UgdGhhdCBDVFMgaGFzIGJlZW4gc2VudCAoQ2FycmllcikKLSNkZWZpbmUgUkFEQVJfRVZFTlRfUkFEQVJfREVURUNUSU5HCQkweDA0IC8vIFJhZGFyIGRldGVjdGlvbiBpcyBvbiBnb2luZywgY2FycmllciBkZXRlY3Rpb24gaG9sZCBiYWNrCi0jZGVmaW5lIFJBREFSX0VWRU5UX0NBUlJJRVJfREVURUNUSU5HCTB4MDggLy8gQ2FycmllciBkZXRlY3Rpb24gaXMgb24gZ29pbmcsIHJhZGFyIGRldGVjdGlvbiBob2xkIGJhY2sKLSNkZWZpbmUgUkFEQVJfRVZFTlRfV0lEVEhfUkFEQVIJCQkweDEwIC8vIEJCUCA9PSAyIHJhZGFyIGRldGVjdGVkCi0jZGVmaW5lIFJBREFSX0VWRU5UX0NUU19LSUNLRUQJCQkweDIwIC8vIFJhZGFyIGRldGVjdGlvbiBuZWVkIHRvIHNlbnQgZG91YmxlIENUUywgZmlyc3QgQ1RTIHNlbnQKLQotLy8gTWN1UmFkYXJDbWQKLSNkZWZpbmUgREVURUNUSU9OX1NUT1AJCQkwCi0jZGVmaW5lIFJBREFSX0RFVEVDVElPTgkJCTEKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RJT04JCTIKLQotCi0KLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi1JTlQgU2V0X0NhcnJpZXJDcml0ZXJpYV9Qcm9jKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBQU1RSSU5HIGFyZyk7Ci1pbnQgU2V0X0NhcnJpZXJSZUNoZWNrX1Byb2MoSU4gUFJUTVBfQURBUFRFUiBwQWQsIElOIFBTVFJJTkcgYXJnKTsKLUlOVCBTZXRfQ2FycmllclN0b3BDaGVja19Qcm9jKElOIFBSVE1QX0FEQVBURVIgcEFkLCBJTiBQU1RSSU5HIGFyZyk7Ci12b2lkIE5ld0NhcnJpZXJEZXRlY3Rpb25TdGFydChQUlRNUF9BREFQVEVSIHBBZCk7Ci12b2lkIFJUTVBIYW5kbGVSYWRhckludGVycnVwdChQUlRNUF9BREFQVEVSICBwQWQpOwotVk9JRCBDU0FzaWNEaXNhYmxlU3luYyhJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdGFydCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQmJwUmFkYXJEZXRlY3Rpb25TdG9wKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBSYWRhckRldGVjdGlvblN0YXJ0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEJPT0xFQU4gQ1RTX1Byb3RlY3QsCi0JSU4gVUlOVDggQ1RTUGVyaW9kKTsKLQotVk9JRCBSYWRhckRldGVjdGlvblN0b3AoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJhZGFyRGV0ZWN0UGVyaW9kaWMoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi0KLUJPT0xFQU4gUmFkYXJDaGFubmVsQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlDaCk7Ci0KLVVMT05HIEphcFJhZGFyVHlwZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVVMT05HIFJUTVBCYnBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVVMT05HIFJUTVBSZWFkUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUENsZWFuUmFkYXJEdXJhdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUFByZXBhcmVSRENUU0ZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTglVTE9ORwkJCUR1cmF0aW9uLAotCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKLQlJTiAgVUxPTkcgICAgICAgICAgIENUU0Jhc2VBZGRyLAotCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKLQotVk9JRCBSVE1QUHJlcGFyZVJhZGFyRGV0ZWN0UGFyYW1zKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1JTlQgU2V0X0NoTW92aW5nVGltZV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKTsKLQotSU5UIFNldF9Mb25nUHVsc2VSYWRhclRoX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9maXJtd2FyZS5oCmluZGV4IGYyODM2YTIuLjE3MDU2ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvZmlybXdhcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2Zpcm13YXJlLmgKQEAgLTIsNyArMiw3IEBACiAvKiBBVVRPIEdFTiBQTEVBU0UgRE8gTk9UIE1PRElGWSBJVCAqLwogCiAKLVVDSEFSIEZpcm13YXJlSW1hZ2UgW10gPSB7Cit1OCBGaXJtd2FyZUltYWdlXzMwOTAgW10gPSB7CiAweDAyLCAweDAyLCAweGYzLCAweDAyLCAweDAyLCAweGExLCAweDIyLCAweDIyLCAweGZmLCAweGZmLCAweGZmLCAweDAyLCAweDAxLCAweDI3LCAweGZmLCAweGZmLAogMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHgxZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMiwgMHgwMCwgMHhkOCwgMHhjMCwgMHhlMCwKIDB4YzAsIDB4ZjAsIDB4YzAsIDB4ODMsIDB4YzAsIDB4ODIsIDB4YzAsIDB4ZDAsIDB4NzUsIDB4ZDAsIDB4MTgsIDB4YzIsIDB4YWYsIDB4MzAsIDB4NDUsIDB4MDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL2lnbXBfc25vb3AuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaWdtcF9zbm9vcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y5NjkyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaWdtcF9zbm9vcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgaWdtcF9zbm9vcC5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBNaW5pcG9ydCBnZW5lcmljIHBvcnRpb24gaGVhZGVyIGZpbGUKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLSNpZm5kZWYgX19SVE1QX0lHTVBfU05PT1BfSF9fCi0jZGVmaW5lIF9fUlRNUF9JR01QX1NOT09QX0hfXwotCi0jaW5jbHVkZSAibGlua19saXN0LmgiCi0KLSNkZWZpbmUgSUdNUF9QUk9UT0NPTF9ERVNDUklQVE9SCTB4MDIKLSNkZWZpbmUgSUdNUF9WMV9NRU1CRVJTSElQX1JFUE9SVAkweDEyCi0jZGVmaW5lIElHTVBfVjJfTUVNQkVSU0hJUF9SRVBPUlQJMHgxNgotI2RlZmluZSBJR01QX0xFQVZFX0dST1VQCQkJMHgxNwotI2RlZmluZSBJR01QX1YzX01FTUJFUlNISVBfUkVQT1JUCTB4MjIKLQotI2RlZmluZSBNTERfVjFfTElTVEVORVJfUkVQT1JUCQkxMzEKLSNkZWZpbmUgTUxEX1YxX0xJU1RFTkVSX0RPTkUJCTEzMgotI2RlZmluZSBNTERfVjJfTElTVEVSTkVSX1JFUE9SVAkJMTQzCi0KLSNkZWZpbmUgSUdNUE1BQ19UQl9FTlRSWV9BR0VPVVRfVElNRSAxMjAgKiBPU19IWgotCi0jZGVmaW5lIE1VTFRJQ0FTVF9BRERSX0hBU0hfSU5ERVgoQWRkcikgICAgICAoTUFDX0FERFJfSEFTSChBZGRyKSAlIChNQVhfTEVOX09GX01VTFRJQ0FTVF9GSUxURVJfSEFTSF9UQUJMRSkpCi0KLSNkZWZpbmUgSVNfTVVMVElDQVNUX01BQ19BRERSKEFkZHIpCQkJKCgoKEFkZHJbMF0pICYgMHgwMSkgPT0gMHgwMSkgJiYgKChBZGRyWzBdKSAhPSAweGZmKSkKLSNkZWZpbmUgSVNfQlJPQURDQVNUX01BQ19BRERSKEFkZHIpCQkJKCgoKEFkZHJbMF0pICYgMHhmZikgPT0gMHhmZikpCi0KLVZPSUQgTXVsdGljYXN0RmlsdGVyVGFibGVJbml0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQotVk9JRCBNdWx0aUNhc3RGaWx0ZXJUYWJsZVJlc2V0KAotCUlOIFBNVUxUSUNBU1RfRklMVEVSX1RBQkxFICpwcE11bHRpY2FzdEZpbHRlclRhYmxlKTsKLQotQk9PTEVBTiBNdWx0aWNhc3RGaWx0ZXJUYWJsZUluc2VydEVudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwR3JwSWQsCi0JSU4gUFVDSEFSIHBNZW1iZXJBZGRyLAotCUlOIFBORVRfREVWIGRldiwKLQlJTiBNdWx0aWNhc3RGaWx0ZXJFbnRyeVR5cGUgdHlwZSk7Ci0KLUJPT0xFQU4gTXVsdGljYXN0RmlsdGVyVGFibGVEZWxldGVFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEdycElkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBkZXYpOwotCi1QTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBNdWx0aWNhc3RGaWx0ZXJUYWJsZUxvb2t1cCgKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRSBwTXVsdGljYXN0RmlsdGVyVGFibGUsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFBORVRfREVWIGRldik7Ci0KLUJPT0xFQU4gaXNJZ21wUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyKTsKLQotVk9JRCBJR01QU25vb3BpbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEc3RNYWNBZGRyLAotCUlOIFBVQ0hBUiBwU3JjTWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCUlOIFBORVRfREVWIHBEZXYpOwotCi1CT09MRUFOIGlzTWxkUGt0KAotCUlOIFBVQ0hBUiBwRHN0TWFjQWRkciwKLQlJTiBQVUNIQVIgcElwSGVhZGVyLAotCU9VVCBVSU5UOCAqcFByb3RvVHlwZSwKLQlPVVQgUFVDSEFSICpwTWxkSGVhZGVyKTsKLQotVk9JRCBNTERTbm9vcGluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERzdE1hY0FkZHIsCi0JSU4gUFVDSEFSIHBTcmNNYWNBZGRyLAotCUlOIFBVQ0hBUiBwSXBIZWFkZXIsCi0JSU4gUE5FVF9ERVYgcERldik7Ci0KLVVDSEFSIElnbXBNZW1iZXJDbnQoCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0KTsKLQotVk9JRCBJZ21wR3JvdXBEZWxNZW1iZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwTWVtYmVyQWRkciwKLQlJTiBQTkVUX0RFViBwRGV2KTsKLQotSU5UIFNldF9JZ21wU25fRW5hYmxlX1Byb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFNUUklORyBhcmcpOwotCi1JTlQgU2V0X0lnbXBTbl9BZGRFbnRyeV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBTVFJJTkcgYXJnKTsKLQotSU5UIFNldF9JZ21wU25fRGVsRW50cnlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLUlOVCBTZXRfSWdtcFNuX1RhYkRpc3BsYXlfUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIGFyZyk7Ci0KLXZvaWQgcnRtcF9yZWFkX2lnbXBfc25vb3BfZnJvbV9maWxlKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlQU1RSSU5HIHRtcGJ1ZiwKLQlQU1RSSU5HIGJ1ZmZlcik7Ci0KLU5ESVNfU1RBVFVTIElnbXBQa3RJbmZvUXVlcnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBTcmNCdWZWQSwKLQlJTiBQTkRJU19QQUNLRVQgcFBhY2tldCwKLQlJTiBVQ0hBUiBhcGlkeCwKLQlPVVQgQk9PTEVBTiAqcEluSWdtcEdyb3VwLAotCU9VVCBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSAqcHBHcm91cEVudHJ5KTsKLQotTkRJU19TVEFUVVMgSWdtcFBrdENsb25lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCUlOIFVDSEFSIFF1ZUlkeCwKLQlJTiBQTVVMVElDQVNUX0ZJTFRFUl9UQUJMRV9FTlRSWSBwR3JvdXBFbnRyeSk7Ci0KLSNlbmRpZiAvKiBfX1JUTVBfSUdNUF9TTk9PUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvaXB2Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9pcHY2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGE1ZjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9pcHY2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBpcHY2LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19JUFY2X0hEUl9IXwotI2RlZmluZSBfX0lQVjZfSERSX0hfCi0KLSNkZWZpbmUgSVBWNl9BRERSX0xFTiAxNgotI2RlZmluZSBJUFY2X0hEUl9MRU4gIDQwCi0KLS8vIElQdjYgYWRkcmVzcyBkZWZpbml0aW9uCi0jZGVmaW5lIElQVjZfTElOS19MT0NBTF9BRERSX1BSRUZJWAkJMHhGRTgKLSNkZWZpbmUgSVBWNl9TSVRFX0xPQ0FMX0FERFJfUFJFRklYCQkweEZFQwotI2RlZmluZSBJUFY2X0xPQ0FMX0FERFJfUFJFRklYCQkJMHhGRTgKLSNkZWZpbmUgSVBWNl9NVUxUSUNBU1RfQUREUl9QUkVGSVgJCTB4RkYKLSNkZWZpbmUgSVBWNl9MT09QQkFDS19BRERSCQkJCTB4MQotI2RlZmluZSBJUFY2X1VOU1BFQ0lGSUVEX0FERFIJCQkweDAKLQotLy8gZGVmaW5lZCBhcyBzZXF1ZW5jZSBpbiBJUHY2IGhlYWRlcgotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0hPUF9CWV9IT1AJCTB4MDAJLy8gMAotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0RFU1RJTkFUSU9OCTB4M2MJLy8gNjAKLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9ST1VUSU5HCQkweDJiCS8vIDQzCi0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfRlJBR01FTlQJCTB4MmMJLy8gNDQKLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9BVVRIRU5USUNBVElPTgkweDMzCS8vIDUxCi0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfRU5DQVBTVUxBVElPTgkweDMyCS8vIDUwLCBSRkMtMjQwNgotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX05PTkUJCQkweDNiCS8vIDU5Ci0KLSNkZWZpbmUgSVBWNl9ORVhUX0hFQURFUl9UQ1AJCQkweDA2Ci0jZGVmaW5lIElQVjZfTkVYVF9IRUFERVJfVURQCQkJMHgxMQotI2RlZmluZSBJUFY2X05FWFRfSEVBREVSX0lDTVBWNgkJCTB4M2EKLQotLy8gSUNNUHY2IG1zZyB0eXBlIGRlZmluaXRpb24KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX1JPVVRFUl9TT0xJQ0lUQVRJT04JCQkweDg1IC8vIDEzMwotI2RlZmluZSBST1VURVJfU09MSUNJVEFUSU9OX0ZJWEVEX0xFTgkJCQk4Ci0KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX1JPVVRFUl9BRFZFUlRJU0VNRU5UCQkweDg2IC8vIDEzNAotI2RlZmluZSBST1VURVJfQURWRVJUSVNFTUVOVF9GSVhFRF9MRU4JCQkJMTYKLQotI2RlZmluZSBJQ01QVjZfTVNHX1RZUEVfTkVJR0hCT1JfU09MSUNJVEFUSU9OCQkweDg3IC8vIDEzNQotI2RlZmluZSBORUlHSEJPUl9TT0xJQ0lUQVRJT05fRklYRURfTEVOCQkJCTI0Ci0KLSNkZWZpbmUgSUNNUFY2X01TR19UWVBFX05FSUdIQk9SX0FEVkVSVElTRU1FTlQJCTB4ODggLy8gMTM2Ci0jZGVmaW5lIE5FSUdIQk9SX0FEVkVSVElTRU1FTlRfRklYRURfTEVOCQkJMjQKLQotI2RlZmluZSBJQ01QVjZfTVNHX1RZUEVfUkVESVJFQ1QJCQkJCTB4ODkgLy8gMTM3Ci0jZGVmaW5lIFJFRElSRUNUX0ZJWEVEX0xFTgkJCQkJCQk0MAotCi0vKiBJUHY2IEFkZHJlc3MgcmVsYXRlZCBzdHJ1Y3R1cmVzICovCi10eXBlZGVmIHN0cnVjdCBydF9pcHY2X2FkZHJfCi17Ci0JdW5pb24KLQl7Ci0JCVVDSEFSCWlwdjZBZGRyOFsxNl07Ci0JCVVTSE9SVAlpcHY2QWRkcjE2WzhdOwotCQlVSU5UMzIJaXB2NkFkZHIzMls0XTsKLQl9YWRkcjsKLSNkZWZpbmUgaXB2Nl9hZGRyCQkJYWRkci5pcHY2QWRkcjgKLSNkZWZpbmUgaXB2Nl9hZGRyMTYJCQlhZGRyLmlwdjZBZGRyMTYKLSNkZWZpbmUgaXB2Nl9hZGRyMzIJCQlhZGRyLmlwdjZBZGRyMzIKLX1SVF9JUFY2X0FERFIsICpQUlRfSVBWNl9BRERSOwotCi0KLSNkZWZpbmUgUFJJTlRfSVBWNl9BRERSKGlwdjZBZGRyKQlcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNlswXSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzFdKSwgXAotCU9TX05UT0hTKChpcHY2QWRkcikuaXB2Nl9hZGRyMTZbMl0pLCBcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNlszXSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzRdKSwgXAotCU9TX05UT0hTKChpcHY2QWRkcikuaXB2Nl9hZGRyMTZbNV0pLCBcCi0JT1NfTlRPSFMoKGlwdjZBZGRyKS5pcHY2X2FkZHIxNls2XSksIFwKLQlPU19OVE9IUygoaXB2NkFkZHIpLmlwdjZfYWRkcjE2WzddKQotCi0KLS8qFBRJUHY2IEhlYWRlciByZWxhdGVkIHN0cnVjdHVyZXMgKi8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfcnRfaXB2Nl9oZHJfCi17Ci0JVUlOVDMyCQkJdmVyOjQsCi0JCQkJCXRyYWZmaWNDbGFzczo4LAotCQkJCWZsb3dMYWJlbDoyMDsKLQlVU0hPUlQJCQlwYXlsb2FkX2xlbjsKLQlVQ0hBUgkJCW5leHRIZHI7Ci0JVUNIQVIJCQlob3BMaW1pdDsKLQlSVF9JUFY2X0FERFIJc3JjQWRkcjsKLQlSVF9JUFY2X0FERFIJZHN0QWRkcjsKLX1SVF9JUFY2X0hEUiwgKlBSVF9JUFY2X0hEUjsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX3J0X2lwdjZfZXh0X2hkcl8KLXsKLQlVQ0hBUgluZXh0UHJvdG87IC8vIEluZGljYXRlIHRoZSBwcm90b2NvbCB0eXBlIG9mIG5leHQgZXh0ZW5zaW9uIGhlYWRlci4KLQlVQ0hBUglleHRIZHJMZW47IC8vIG9wdGlvbmFsIGZpZWxkIGZvciBtc2cgbGVuZ3RoIG9mIHRoaXMgZXh0ZW5zaW9uIGhlYWRlciB3aGljaCBkaWRuJ3QgaW5jbHVkZSB0aGUgZmlyc3QgIm5leHRQcm90byIgZmllbGQuCi0JVUNIQVIJb2N0ZXRzWzFdOyAvLyBob29rIHRvIGV4dGVuZCBoZWFkZXIgbWVzc2FnZSBib2R5LgotfVJUX0lQVjZfRVhUX0hEUiwgKlBSVF9JUFY2X0VYVF9IRFI7Ci0KLQotLyogSUNNUHY2IHJlbGF0ZWQgc3RydWN0dXJlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ydF9pcHY2X2ljbXB2Nl9oZHJfCi17Ci0JVUNIQVIJdHlwZTsKLQlVQ0hBUgljb2RlOwotCVVTSE9SVAljaGtzdW07Ci0JVUNIQVIJb2N0ZXRzWzFdOyAvL2hvb2sgdG8gZXh0ZW5kIGhlYWRlciBtZXNzYWdlIGJvZHkuCi19UlRfSUNNUFY2X0hEUiwgKlBSVF9JQ01QVjZfSERSOwotCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfcnRfaWNtcDZfb3B0aW9uX2hkcl8KLXsKLQlVQ0hBUiB0eXBlOwotCVVDSEFSIGxlbjsKLQlVQ0hBUiBvY3RldFsxXTsKLX1SVF9JQ01QVjZfT1BUSU9OX0hEUiwgKlBSVF9JQ01QVjZfT1BUSU9OX0hEUjsKLQotdHlwZWRlZiBlbnVtewotLy8gRGVmaW5lZCBJQ01QdjYgT3B0aW9uIFR5cGVzLgotCVRZUEVfU1JDX0xMX0FERFIJPSAxLAotCVRZUEVfVEdUX0xMX0FERFIJPSAyLAotCVRZUEVfUFJFRklYX0lORk8JCQk9IDMsCi0JVFlQRV9SRURJUkVDVEVEX0hEUgkJCT0gNCwKLQlUWVBFX01UVQkJCQkJPSA1LAotfUlDTVBWNl9PUFRJT05TX1RZUEVfREVGOwotCi0KLXN0YXRpYyBpbmxpbmUgQk9PTEVBTiBJUHY2RXh0SGRySGFuZGxlKAotCVJUX0lQVjZfRVhUX0hEUgkJKnBFeHRIZHIsCi0JVUNIQVIJCQkJKnBQcm90bywKLQlVSU5UMzIJCQkJKnBPZmZzZXQpCi17Ci0JVUNIQVIgbmV4dFByb3RvID0gMHhmZjsKLQlVSU5UMzIgZXh0TGVuID0gMDsKLQlCT09MRUFOIHN0YXR1cyA9IFRSVUU7Ci0KLQkvL3ByaW50aygiJXMoKTogcGFyc2luZyB0aGUgRXh0ZW5zaW9uIEhlYWRlciB3aXRoIFByb3RvY29sKDB4JXgpOlxuIiwgX19GVU5DVElPTl9fLCAqcFByb3RvKTsKLQlzd2l0Y2ggKCpwUHJvdG8pCi0JewotCQljYXNlIElQVjZfTkVYVF9IRUFERVJfSE9QX0JZX0hPUDoKLQkJCS8vIElQdjZFeHRIb3BCeUhvcEhhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gKHBFeHRIZHItPmV4dEhkckxlbiArIDEpICogODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9ERVNUSU5BVElPTjoKLQkJCS8vIElQdjZFeHREZXN0SGFuZGxlKCk7Ci0JCQluZXh0UHJvdG8gPSBwRXh0SGRyLT5uZXh0UHJvdG87Ci0JCQlleHRMZW4gPSAocEV4dEhkci0+ZXh0SGRyTGVuICsgMSkgKiA4OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUFY2X05FWFRfSEVBREVSX1JPVVRJTkc6Ci0JCQkvLyBJUHY2RXh0Um91dGluZ0hhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gKHBFeHRIZHItPmV4dEhkckxlbiArIDEpICogODsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9GUkFHTUVOVDoKLQkJCS8vIElQdjZFeHRGcmFnbWVudEhhbmRsZSgpOwotCQkJbmV4dFByb3RvID0gcEV4dEhkci0+bmV4dFByb3RvOwotCQkJZXh0TGVuID0gODsgLy8gVGhlIEZyYWdtZW50IGhlYWRlciBsZW5ndGggaXMgZml4ZWQgdG8gOCBieXRlcy4KLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBWNl9ORVhUX0hFQURFUl9BVVRIRU5USUNBVElPTjoKLQkJLy8gICBJUFY2X05FWFRfSEVBREVSX0VOQ0FQU1VMQVRJT046Ci0JCQkvKgotCQkJCVRPRE86IE5vdCBzdXBwb3J0LiBGb3IgZW5jcnlwdGlvbiBpc3N1ZS4KLQkJCSovCi0JCQluZXh0UHJvdG8gPSAweEZGOwotCQkJc3RhdHVzID0gRkFMU0U7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJbmV4dFByb3RvID0gMHhGRjsKLQkJCXN0YXR1cyA9IEZBTFNFOwotCQkJYnJlYWs7Ci0JfQotCi0JKnBQcm90byA9IG5leHRQcm90bzsKLQkqcE9mZnNldCArPSBleHRMZW47Ci0JLy9wcmludGsoIiVzKCk6IG5leHRQcm90byA9IDB4JXghLCBvZmZzZXQ9MHgleCFcbiIsIF9fRlVOQ1RJT05fXywgbmV4dFByb3RvLCBvZmZzZXQpOwotCi0JcmV0dXJuIHN0YXR1czsKLQotfQotCi0jZW5kaWYgLy8gX19JUFY2X0hEUl9IXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9saW5rX2xpc3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbGlua19saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNWI2MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9saW5rX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTElOS19MSVNUX0hfXwotI2RlZmluZSBfX0xJTktfTElTVF9IX18KLQotdHlwZWRlZiBzdHJ1Y3QgX0xJU1RfRU5UUlkKLXsKLQlzdHJ1Y3QgX0xJU1RfRU5UUlkgKnBOZXh0OwotfSBMSVNUX0VOVFJZLCAqUExJU1RfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9MSVNUX0hFQURSCi17Ci0JUExJU1RfRU5UUlkgcEhlYWQ7Ci0JUExJU1RfRU5UUlkgcFRhaWw7Ci0JVUNIQVIgc2l6ZTsKLX0gTElTVF9IRUFERVIsICpQTElTVF9IRUFERVI7Ci0KLXN0YXRpYyBpbmxpbmUgVk9JRCBpbml0TGlzdCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JcExpc3QtPnBIZWFkID0gcExpc3QtPnBUYWlsID0gTlVMTDsKLQlwTGlzdC0+c2l6ZSA9IDA7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIFZPSUQgaW5zZXJ0VGFpbExpc3QoCi0JSU4gUExJU1RfSEVBREVSIHBMaXN0LAotCUlOIFBMSVNUX0VOVFJZIHBFbnRyeSkKLXsKLQlwRW50cnktPnBOZXh0ID0gTlVMTDsKLQlpZiAocExpc3QtPnBUYWlsKQotCQlwTGlzdC0+cFRhaWwtPnBOZXh0ID0gcEVudHJ5OwotCWVsc2UKLQkJcExpc3QtPnBIZWFkID0gcEVudHJ5OwotCXBMaXN0LT5wVGFpbCA9IHBFbnRyeTsKLQlwTGlzdC0+c2l6ZSsrOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIHJlbW92ZUhlYWRMaXN0KAotCUlOIFBMSVNUX0hFQURFUiBwTGlzdCkKLXsKLQlQTElTVF9FTlRSWSBwTmV4dDsKLQlQTElTVF9FTlRSWSBwRW50cnk7Ci0KLQlwRW50cnkgPSBwTGlzdC0+cEhlYWQ7Ci0JaWYgKHBMaXN0LT5wSGVhZCAhPSBOVUxMKQotCXsKLQkJcE5leHQgPSBwTGlzdC0+cEhlYWQtPnBOZXh0OwotCQlwTGlzdC0+cEhlYWQgPSBwTmV4dDsKLQkJaWYgKHBOZXh0ID09IE5VTEwpCi0JCQlwTGlzdC0+cFRhaWwgPSBOVUxMOwotCQlwTGlzdC0+c2l6ZS0tOwotCX0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRMaXN0U2l6ZSgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QpCi17Ci0JcmV0dXJuIHBMaXN0LT5zaXplOwotfQotCi1zdGF0aWMgaW5saW5lIFBMSVNUX0VOVFJZIGRlbEVudHJ5TGlzdCgKLQlJTiBQTElTVF9IRUFERVIgcExpc3QsCi0JSU4gUExJU1RfRU5UUlkgcEVudHJ5KQotewotCVBMSVNUX0VOVFJZIHBDdXJFbnRyeTsKLQlQTElTVF9FTlRSWSBwUHJ2RW50cnk7Ci0KLQlpZihwTGlzdC0+cEhlYWQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZihwRW50cnkgPT0gcExpc3QtPnBIZWFkKQotCXsKLQkJcEN1ckVudHJ5ID0gcExpc3QtPnBIZWFkOwotCQlwTGlzdC0+cEhlYWQgPSBwQ3VyRW50cnktPnBOZXh0OwotCi0JCWlmKHBMaXN0LT5wSGVhZCA9PSBOVUxMKQotCQkJcExpc3QtPnBUYWlsID0gTlVMTDsKLQotCQlwTGlzdC0+c2l6ZS0tOwotCQlyZXR1cm4gcEN1ckVudHJ5OwotCX0KLQotCXBQcnZFbnRyeSA9IHBMaXN0LT5wSGVhZDsKLQlwQ3VyRW50cnkgPSBwUHJ2RW50cnktPnBOZXh0OwotCXdoaWxlKHBDdXJFbnRyeSAhPSBOVUxMKQotCXsKLQkJaWYgKHBFbnRyeSA9PSBwQ3VyRW50cnkpCi0JCXsKLQkJCXBQcnZFbnRyeS0+cE5leHQgPSBwQ3VyRW50cnktPnBOZXh0OwotCi0JCQlpZihwRW50cnkgPT0gcExpc3QtPnBUYWlsKQotCQkJCXBMaXN0LT5wVGFpbCA9IHBQcnZFbnRyeTsKLQotCQkJcExpc3QtPnNpemUtLTsKLQkJCWJyZWFrOwotCQl9Ci0JCXBQcnZFbnRyeSA9IHBDdXJFbnRyeTsKLQkJcEN1ckVudHJ5ID0gcFBydkVudHJ5LT5wTmV4dDsKLQl9Ci0KLQlyZXR1cm4gcEN1ckVudHJ5OwotfQotCi0jZW5kaWYgLy8gX19fTElOS19MSVNUX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNjc0My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNjAgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtbG1lLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huIENoYW5nCTIwMDMtMDgtMjgJCUNyZWF0ZWQKLQlKb2huIENoYW5nICAyMDA0LTA5LTA2ICAgICAgbW9kaWZpZWQgZm9yIFJUMjYwMAotKi8KLSNpZm5kZWYgX19NTE1FX0hfXwotI2RlZmluZSBfX01MTUVfSF9fCi0KLSNpbmNsdWRlICJydG1wX2RvdDExLmgiCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vLyBtYXhpbXVtIHN1cHBvcnRlZCBjYXBhYmlsaXR5IGluZm9ybWF0aW9uIC0KLS8vIEVTUywgSUJTUywgUHJpdmFjeSwgU2hvcnQgUHJlYW1ibGUsIFNwZWN0cnVtIG1nbXQsIFNob3J0IFNsb3QKLSNkZWZpbmUgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTyAgIDB4MDUzMwotCi0jZGVmaW5lIEVORF9PRl9BUkdTICAgICAgICAgICAgICAgICAtMQotI2RlZmluZSBMRlNSX01BU0sgICAgICAgICAgICAgICAgICAgMHg4MDAwMDA1NwotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19JTlRWICAgICAgICAgMTAwLyoyMDAqLyAgICAgICAvLwotI2RlZmluZSBMRUFEX1RJTUUgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNTE1FX1RBU0tfRVhFQ19NVUxUSVBMRSAgICAgICAxMCAgLyo1Ki8gICAgICAgLy8gTUxNRV9UQVNLX0VYRUNfTVVMVElQTEUgKiBNTE1FX1RBU0tfRVhFQ19JTlRWID0gMSBzZWMKLSNkZWZpbmUgUkVPUkRFUl9FWEVDX0lOVFYJCTEwMCAgICAgICAvLyAwLjEgc2VjCi0vLyNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgICAzODQgICAgICAgIC8vIHVzZWMuIExvbWdQcmVhbWJsZSArIDI0LWJ5dGUgYXQgMU1icHMKLQotLy8gVGhlIGRlZmluaXRpb24gb2YgUmFkYXIgZGV0ZWN0aW9uIGR1cmF0aW9uIHJlZ2lvbgotI2RlZmluZSBDRQkJMAotI2RlZmluZSBGQ0MJCTEKLSNkZWZpbmUgSkFQCQkyCi0jZGVmaW5lIEpBUF9XNTMJMwotI2RlZmluZSBKQVBfVzU2CTQKLSNkZWZpbmUgTUFYX1JEX1JFR0lPTiA1Ci0KLSNkZWZpbmUgQkVBQ09OX0xPU1RfVElNRSAgICAgICAgICAgIDQgKiBPU19IWiAgICAvLyAyMDQ4IG1zZWMgPSAyIHNlYwotCi0jZGVmaW5lIERMU19USU1FT1VUICAgICAgICAgICAgICAgICAxMjAwICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBBVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMzAwICAgICAgIC8vIHVuaXQ6IG1zZWMKLSNkZWZpbmUgQVNTT0NfVElNRU9VVCAgICAgICAgICAgICAgIDMwMCAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEpPSU5fVElNRU9VVCAgICAgICAgICAgICAgICAyMDAwICAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIFNIT1JUX0NIQU5ORUxfVElNRSAgICAgICAgICA5MCAgICAgICAgLy8gdW5pdDogbXNlYwotI2RlZmluZSBNSU5fQ0hBTk5FTF9USU1FICAgICAgICAgICAgMTEwICAgICAgICAvLyB1bml0OiBtc2VjLCBmb3IgZHVhbCBiYW5kIHNjYW4KLSNkZWZpbmUgTUFYX0NIQU5ORUxfVElNRSAgICAgICAgICAgIDE0MCAgICAgICAvLyB1bml0OiBtc2VjLCBmb3Igc2luZ2xlIGJhbmQgc2NhbgotI2RlZmluZQlGQVNUX0FDVElWRV9TQ0FOX1RJTUUJICAgIDMwCQkgIC8vIEFjdGl2ZSBzY2FuIHdhaXRpbmcgZm9yIHByb2JlIHJlc3BvbnNlIHRpbWUKLSNkZWZpbmUgQ1dfTUlOX0lOX0JJVFMgICAgICAgICAgICAgIDQgICAgICAgICAvLyBhY3R1YWwgQ3dNaW4gPSAyXkNXX01JTl9JTl9CSVRTIC0gMQotI2RlZmluZSBMSU5LX0RPV05fVElNRU9VVCAgICAgICAgICAgMjAwMDAgICAgICAvLyB1bml0OiBtc2VjCi0jZGVmaW5lIEFVVE9fV0FLRVVQX1RJTUVPVVQJCQk3MAkJCS8vdW5pdDogbXNlYwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgQ1dfTUFYX0lOX0JJVFMgICAgICAgICAgICAgIDEwICAgICAgICAvLyBhY3R1YWwgQ3dNYXggPSAyXkNXX01BWF9JTl9CSVRTIC0gMQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLWV4dGVybiBVSU5UMzIgQ1dfTUFYX0lOX0JJVFM7Ci0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLQotLy8gTm90ZTogUlNTSV9UT19EQk1fT0ZGU0VUIGhhcyBiZWVuIGNoYW5nZWQgdG8gdmFyaWFibGUgZm9yIG5ldyBSRiAoMjAwNC0wNzIwKS4KLS8vIFNIb3VsZCBub3QgcmVmZXIgdG8gdGhpcyBjb25zdGFudCBhbnltb3JlCi0vLyNkZWZpbmUgUlNTSV9UT19EQk1fT0ZGU0VUICAgICAgICAgIDEyMCAvLyBmb3IgUlQyNTMwIFJTU0ktMTE1ID0gZEJtCi0jZGVmaW5lIFJTU0lfRk9SX01JRF9UWF9QT1dFUiAgICAgICAtNTUgIC8vIC01NSBkYiBpcyBjb25zaWRlcmVkIG1pZC1kaXN0YW5jZQotI2RlZmluZSBSU1NJX0ZPUl9MT1dfVFhfUE9XRVIgICAgICAgLTQ1ICAvLyAtNDUgZGIgaXMgY29uc2lkZXJlZCB2ZXJ5IHNob3J0IGRpc3RhbmNlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsaWdpYmxlIHRvIHVzZSBhIGxvd2VyIFRYIHBvd2VyCi0jZGVmaW5lIFJTU0lfRk9SX0xPV0VTVF9UWF9QT1dFUiAgICAtMzAKLS8vI2RlZmluZSBNSURfVFhfUE9XRVJfREVMVEEgICAgICAgICAgMCAgIC8vIDAgZGIgZnJvbSBmdWxsIFRYIHBvd2VyIHVwb24gbWlkLWRpc3RhbmNlIHRvIEFQCi0jZGVmaW5lIExPV19UWF9QT1dFUl9ERUxUQSAgICAgICAgICA2ICAgIC8vIC0zIGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHZlcnkgc2hvcnQgZGlzdGFuY2UuIDEgZ3JhZGUgaXMgMC41IGRiCi0jZGVmaW5lIExPV0VTVF9UWF9QT1dFUl9ERUxUQSAgICAgICAxNiAgIC8vIC04IGRiIGZyb20gZnVsbCBUWCBwb3dlciB1cG9uIHNob3J0ZXN0IGRpc3RhbmNlLiAxIGdyYWRlIGlzIDAuNSBkYgotCi0jZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fQkVMT1dfVEhSRVNIT0xEICAgICAwCi0jZGVmaW5lIFJTU0lfVFJJR0dFUkVEX1VQT05fRVhDQ0VFRF9USFJFU0hPTEQgICAxCi0jZGVmaW5lIFJTU0lfVEhSRVNIT0xEX0ZPUl9ST0FNSU5HICAgICAgICAgICAgICAyNQotI2RlZmluZSBSU1NJX0RFTFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotCi0vLyBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbgotI2RlZmluZSBDUUlfSVNfR09PRChjcWkpICAgICAgICAgICAgKChjcWkpID49IDUwKQotLy8jZGVmaW5lIENRSV9JU19GQUlSKGNxaSkgICAgICAgICAgKCgoY3FpKSA+PSAyMCkgJiYgKChjcWkpIDwgNTApKQotI2RlZmluZSBDUUlfSVNfUE9PUihjcWkpICAgICAgICAgICAgKGNxaSA8IDUwKSAgLy8oKChjcWkpID49IDUpICYmICgoY3FpKSA8IDIwKSkKLSNkZWZpbmUgQ1FJX0lTX0JBRChjcWkpICAgICAgICAgICAgIChjcWkgPCA1KQotI2RlZmluZSBDUUlfSVNfREVBRChjcWkpICAgICAgICAgICAgKGNxaSA9PSAwKQotCi0vLyB3ZWlnaHRpbmcgZmFjdG9yIHRvIGNhbGN1bGF0ZSBDaGFubmVsIHF1YWxpdHksIHRvdGFsIHNob3VsZCBiZSAxMDAlCi0jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDUwCi0jZGVmaW5lIFRYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDMwCi0jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDIwCi0KLS8vI2RlZmluZSBQRUVSX0tFWV9OT1RfVVNFRCAgICAgICAgICAgICAgICAwCi0vLyNkZWZpbmUgUEVFUl9LRVlfNjRfQklUICAgICAgICAgICAgICAgICAgNjQKLS8vI2RlZmluZSBQRUVSX0tFWV8xMjhfQklUICAgICAgICAgICAgICAgICAxMjgKLQotLy8jZGVmaW5lIFBFRVJfS0VZXzY0QklUX0xFTiAgICAgICAgICAgICAgIDgKLS8vI2RlZmluZSBQRUVSX0tFWV8xMjhCSVRfTEVOICAgICAgICAgICAgICAxNgotCi0jZGVmaW5lIEJTU19OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9RVUVVRSAgICAgICAgICAgIDQwIC8vMTAKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2RlZmluZSBTQ0FOX1BBU1NJVkUgICAgICAgICAgICAgICAgICAgICAxOAkJLy8gc2NhbiB3aXRoIG5vIHByb2JlIHJlcXVlc3QsIG9ubHkgd2FpdCBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlCi0jZGVmaW5lIFNDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDE5CQkvLyBzY2FuIHdpdGggcHJvYmUgcmVxdWVzdCwgYW5kIHdhaXQgYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZQotI2RlZmluZQlTQ0FOX0NJU0NPX1BBU1NJVkUJCQkJIDIwCQkvLyBTaW5nbGUgY2hhbm5lbCBwYXNzaXZlIHNjYW4KLSNkZWZpbmUJU0NBTl9DSVNDT19BQ1RJVkUJCQkJIDIxCQkvLyBTaW5nbGUgY2hhbm5lbCBhY3RpdmUgc2NhbgotI2RlZmluZQlTQ0FOX0NJU0NPX05PSVNFCQkJCSAyMgkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBub2lzZSBoaXN0b2dyYW0gY29sbGVjdGlvbgotI2RlZmluZQlTQ0FOX0NJU0NPX0NIQU5ORUxfTE9BRAkJCSAyMwkJLy8gU2luZ2xlIGNoYW5uZWwgcGFzc2l2ZSBzY2FuIGZvciBjaGFubmVsIGxvYWQgY29sbGVjdGlvbgotI2RlZmluZSBGQVNUX1NDQU5fQUNUSVZFICAgICAgICAgICAgICAgICAyNAkJLy8gc2NhbiB3aXRoIHByb2JlIHJlcXVlc3QsIGFuZCB3YWl0IGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLSNkZWZpbmUgU0NBTl8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgICAgMjYKLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0KLS8vI2RlZmluZSBCU1NfVEFCTEVfRU1QVFkoeCkgICAgICAgICAgICAgKCh4KS5Cc3NOciA9PSAwKQotI2RlZmluZSBNQUNfQUREUl9JU19HUk9VUChBZGRyKSAgICAgICAoKChBZGRyWzBdKSAmIDB4MDEpKQotI2RlZmluZSBNQUNfQUREUl9IQVNIKEFkZHIpICAgICAgICAgICAgKEFkZHJbMF0gXiBBZGRyWzFdIF4gQWRkclsyXSBeIEFkZHJbM10gXiBBZGRyWzRdIF4gQWRkcls1XSkKLSNkZWZpbmUgTUFDX0FERFJfSEFTSF9JTkRFWChBZGRyKSAgICAgIChNQUNfQUREUl9IQVNIKEFkZHIpICUgSEFTSF9UQUJMRV9TSVpFKQotI2RlZmluZSBUSURfTUFDX0hBU0goQWRkcixUSUQpICAgICAgICAgICAgKFRJRF5BZGRyWzBdIF4gQWRkclsxXSBeIEFkZHJbMl0gXiBBZGRyWzNdIF4gQWRkcls0XSBeIEFkZHJbNV0pCi0jZGVmaW5lIFRJRF9NQUNfSEFTSF9JTkRFWChBZGRyLFRJRCkgICAgICAoVElEX01BQ19IQVNIKEFkZHIsVElEKSAlIEhBU0hfVEFCTEVfU0laRSkKLQotLy8gTEVEIENvbnRyb2wKLS8vIGFzc29pYXRpb24gT04uIG9uZSBMRUQgT04uIGFub3RoZXIgYmxpbmtpbmcgd2hlbiBUWCwgT0ZGIHdoZW4gaWRsZQotLy8gbm8gYXNzb2NpYXRpb24sIGJvdGggTEVEIG9mZgotI2RlZmluZSBBU0lDX0xFRF9BQ1RfT04ocEFkKSAgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDMxZTQ2KQotI2RlZmluZSBBU0lDX0xFRF9BQ1RfT0ZGKHBBZCkgICAgICAgUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX0NTUjE0LCAweDAwMDAxZTQ2KQotCi0vLyBiaXQgZGVmaW5pdGlvbiBvZiB0aGUgMi1ieXRlIHBCRUFDT04tPkNhcGFiaWxpdHkgZmllbGQKLSNkZWZpbmUgQ0FQX0lTX0VTU19PTih4KSAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwMDEpICE9IDApCi0jZGVmaW5lIENBUF9JU19JQlNTX09OKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHgwMDAyKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQ0ZfUE9MTEFCTEVfT04oeCkgICAgICAgICAoKCh4KSAmIDB4MDAwNCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX0NGX1BPTExfUkVRX09OKHgpICAgICAgICAgKCgoeCkgJiAweDAwMDgpICE9IDApCi0jZGVmaW5lIENBUF9JU19QUklWQUNZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDEwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04oeCkgICAgICAoKCh4KSAmIDB4MDAyMCkgIT0gMCkKLSNkZWZpbmUgQ0FQX0lTX1BCQ0NfT04oeCkgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAwNDApICE9IDApCi0jZGVmaW5lIENBUF9JU19BR0lMSVRZX09OKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwMDgwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfU1BFQ1RSVU1fTUdNVCh4KSAgICAgICAgICAoKCh4KSAmIDB4MDEwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX1FPUyh4KSAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDAyMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19TSE9SVF9TTE9UKHgpICAgICAgICAgICAgICgoKHgpICYgMHgwNDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfQVBTRCh4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MDgwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgQ0FQX0lTX0lNTUVEX0JBKHgpICAgICAgICAgICAgICAgKCgoeCkgJiAweDEwMDApICE9IDApICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIENBUF9JU19EU1NTX09GRE0oeCkgICAgICAgICAgICAgICgoKHgpICYgMHgyMDAwKSAhPSAwKQotI2RlZmluZSBDQVBfSVNfREVMQVlfQkEoeCkgICAgICAgICAgICAgICAoKCh4KSAmIDB4NDAwMCkgIT0gMCkgIC8vIDgwMi4xMWUgZDkKLQotI2RlZmluZSBDQVBfR0VORVJBVEUoZXNzLGlic3MscHJpdixzX3ByZSxzX3Nsb3Qsc3BlY3RydW0pICAoKChlc3MpID8gMHgwMDAxIDogMHgwMDAwKSB8ICgoaWJzcykgPyAweDAwMDIgOiAweDAwMDApIHwgKChwcml2KSA/IDB4MDAxMCA6IDB4MDAwMCkgfCAoKHNfcHJlKSA/IDB4MDAyMCA6IDB4MDAwMCkgfCAoKHNfc2xvdCkgPyAweDA0MDAgOiAweDAwMDApIHwgKChzcGVjdHJ1bSkgPyAweDAxMDAgOiAweDAwMDApKQotCi0vLyNkZWZpbmUgU1RBX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgMCAvLyAxLWJ5dGUuIHNlZSA4MDIuMTFlIGQ5LjAgZm9yIGJpdCBkZWZpbml0aW9uCi0KLSNkZWZpbmUgRVJQX0lTX05PTl9FUlBfUFJFU0VOVCh4KSAgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKSAgICAvLyA4MDIuMTFnCi0jZGVmaW5lIEVSUF9JU19VU0VfUFJPVEVDVElPTih4KSAgICAgICAgICgoKHgpICYgMHgwMikgIT0gMCkgICAgLy8gODAyLjExZwotI2RlZmluZSBFUlBfSVNfVVNFX0JBUktFUl9QUkVBTUJMRSh4KSAgICAoKCh4KSAmIDB4MDQpICE9IDApICAgIC8vIDgwMi4xMWcKLQotI2RlZmluZSBEUlNfVFhfUVVBTElUWV9XT1JTVF9CT1VORCAgICAgICA4Ly8gMyAgLy8ganVzdCB0ZXN0IGJ5IGdhcnkKLSNkZWZpbmUgRFJTX1BFTkFMVFkgICAgICAgICAgICAgICAgICAgICAgOAotCi0jZGVmaW5lIEJBX05PVFVTRQkyCi0vL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZQotI2RlZmluZSBJTU1FRF9CQQkxCi0jZGVmaW5lIERFTEFZX0JBCTAKLQotLy8gQkEgSW5pdGlhdG9yIHN1YmZpZWxkIGluIERFTEJBIGZyYW1lCi0jZGVmaW5lIE9SSUdJTkFUT1IJMQotI2RlZmluZSBSRUNJUElFTlQJMAotCi0vLyBBRERCQSBTdGF0dXMgQ29kZQotI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX1NVQ0NFU1MJCQkJCTAKLSNkZWZpbmUgQUREQkFfUkVTVUxUQ09ERV9SRUZVU0VECQkJCQkzNwotI2RlZmluZSBBRERCQV9SRVNVTFRDT0RFX0lOVkFMSURfUEFSQU1FVEVSUwkJCTM4Ci0KLS8vIERFTEJBIFJlYXNvbiBDb2RlCi0jZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfUVNUQV9MRUFWSU5HCQkJCTM2Ci0jZGVmaW5lIERFTEJBX1JFQVNPTkNPREVfRU5EX0JBCQkJCQkJMzcKLSNkZWZpbmUgREVMQkFfUkVBU09OQ09ERV9VTktOT1dOX0JBCQkJCQkzOAotI2RlZmluZSBERUxCQV9SRUFTT05DT0RFX1RJTUVPVVQJCQkJCTM5Ci0KLS8vIHJlc2V0IGFsbCBPbmVTZWNUeCBjb3VudGVycwotI2RlZmluZSBSRVNFVF9PTkVfU0VDX1RYX0NOVChfX3BFbnRyeSkgXAotaWYgKCgoX19wRW50cnkpKSAhPSBOVUxMKSBcCi17IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeFJldHJ5T2tDb3VudCA9IDA7IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeEZhaWxDb3VudCA9IDA7IFwKLQkoX19wRW50cnkpLT5PbmVTZWNUeE5vUmV0cnlPa0NvdW50ID0gMDsgXAotfQotCi0vLwotLy8gODAyLjExIGZyYW1lIGZvcm1hdHMKLS8vCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJTFNJR1R4b3BQcm9TdXA6MTsKLQlVU0hPUlQJRm9ydHlfTWh6X0ludG9sZXJhbnQ6MTsKLQlVU0hPUlQJUFNNUDoxOwotCVVTSE9SVAlDQ0ttb2RlaW40MDoxOwotCVVTSE9SVAlBTXNkdVNpemU6MTsKLQlVU0hPUlQJRGVsYXllZEJBOjE7CS8vcnQyODYwYyBub3Qgc3VwcG9ydAotCVVTSE9SVAlSeFNUQkM6MjsKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCU1pbW9QczoyOy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotCVVTSE9SVAlBZHZDb2Rpbmc6MTsKLSNlbHNlCi0JVVNIT1JUCUFkdkNvZGluZzoxOwotCVVTSE9SVAlDaGFubmVsV2lkdGg6MTsKLQlVU0hPUlQJTWltb1BzOjI7Ly9tb21pIHBvd2VyIHNhZmUKLQlVU0hPUlQJR0Y6MTsJLy9ncmVlbiBmaWVsZAotCVVTSE9SVAlTaG9ydEdJZm9yMjA6MTsKLQlVU0hPUlQJU2hvcnRHSWZvcjQwOjE7CS8vZm9yNDBNSHoKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVJ4U1RCQzoyOwotCVVTSE9SVAlEZWxheWVkQkE6MTsJLy9ydDI4NjBjIG5vdCBzdXBwb3J0Ci0JVVNIT1JUCUFNc2R1U2l6ZToxOwkvLyBvbmx5IHN1cHBvcnQgYXMgemVybwotCVVTSE9SVAlDQ0ttb2RlaW40MDoxOwotCVVTSE9SVAlQU01QOjE7Ci0JVVNIT1JUCUZvcnR5X01oel9JbnRvbGVyYW50OjE7Ci0JVVNIT1JUCUxTSUdUeG9wUHJvU3VwOjE7Ci0jZW5kaWYJLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gSFRfQ0FQX0lORk8sICpQSFRfQ0FQX0lORk87Ci0KLS8vICBIVCBDYXBhYmlsaXR5IElORk8gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCXJzdjozOy8vbW9taSBwb3dlciBzYWZlCi0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLSNlbHNlCi0JVUNIQVIJTWF4UkFtcGR1RmFjdG9yOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MzsKLQlVQ0hBUglyc3Y6MzsvL21vbWkgcG93ZXIgc2FmZQotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEhUX0NBUF9QQVJNLCAqUEhUX0NBUF9QQVJNOwotCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotCVVDSEFSCU1DU1NldFsxMF07Ci0JVUNIQVIJU3VwUmF0ZVsyXTsgIC8vIHVuaXQgOiAxTWJwcwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3Y6MzsKLQlVQ0hBUglNcGR1RGVuc2l0eToxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJVHhSeE5vdEVxdWFsOjE7Ci0JVUNIQVIJVHhNQ1NTZXREZWZpbmVkOjE7Ci0jZWxzZQotCVVDSEFSCVR4TUNTU2V0RGVmaW5lZDoxOwotCVVDSEFSCVR4UnhOb3RFcXVhbDoxOwotCVVDSEFSCVR4U3RyZWFtOjI7Ci0JVUNIQVIJTXBkdURlbnNpdHk6MTsKLQlVQ0hBUglyc3Y6MzsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0JVUNIQVIJcnN2M1szXTsKLX0gSFRfTUNTX1NFVCwgKlBIVF9NQ1NfU0VUOwotCi0vLyAgSFQgQ2FwYWJpbGl0eSBJTkZPIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2Mjo0OwotCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKLQlVU0hPUlQJUGx1c0hUQzoxOwkvLytIVEMgY29udHJvbCBmaWVsZCBzdXBwb3J0Ci0JVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCi0JVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCVRyYW5UaW1lOjI7Ci0JVVNIT1JUCVBjbzoxOwotI2Vsc2UKLQlVU0hPUlQJUGNvOjE7Ci0JVVNIT1JUCVRyYW5UaW1lOjI7Ci0JVVNIT1JUCXJzdjo1Oy8vbW9taSBwb3dlciBzYWZlCi0JVVNIT1JUCU1DU0ZlZWRiYWNrOjI7CS8vMDpubyBNQ1MgZmVlZGJhY2ssIDI6dW5zb2xpY2l0ZWQgTUNTIGZlZWRiYWNrLCAzOkZ1bGwgTUNTIGZlZWRiYWNrLCAgMTpyc3YuCi0JVVNIT1JUCVBsdXNIVEM6MTsJLy8rSFRDIGNvbnRyb2wgZmllbGQgc3VwcG9ydAotCVVTSE9SVAlSREdTdXBwb3J0OjE7CS8vcmV2ZXJzZSBEaXJlY3Rpb24gR3JhbnQgIHN1cHBvcnQKLQlVU0hPUlQJcnN2Mjo0OwotI2VuZGlmIC8qIFJUX0JJR19FTkRJQU4gKi8KLX0gRVhUX0hUX0NBUF9JTkZPLCAqUEVYVF9IVF9DQVBfSU5GTzsKLQotLy8gIEhUIEJlYW1mb3JtaW5nIGZpZWxkIGluIEhUIENhcCBJRSAuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0hUX0JGX0NBUHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUxPTkcJcnN2OjM7Ci0JVUxPTkcJQ2hhbkVzdGltYXRpb246MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlOb0NvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU1pbkdyb3VwaW5nOjI7Ci0JVUxPTkcJRXhwQ29tQkY6MjsKLQlVTE9ORwlFeHBOb0NvbUJGOjI7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwTm9Db21TdGVlckNhcGFibGU6MTsKLQlVTE9ORwlFeHBDU0lDYXBhYmxlOjE7Ci0JVUxPTkcJQ2FsaWJyYXRpb246MjsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCVR4TkRQQ2FwYWJsZToxOwotCVVMT05HCVJ4TkRQQ2FwYWJsZToxOwotCVVMT05HCVR4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJUnhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotI2Vsc2UKLQlVTE9ORwlUeEJGUmVjQ2FwYWJsZToxOwotCVVMT05HCVJ4U291bmRDYXBhYmxlOjE7Ci0JVUxPTkcJVHhTb3VuZENhcGFibGU6MTsKLQlVTE9ORwlSeE5EUENhcGFibGU6MTsKLQlVTE9ORwlUeE5EUENhcGFibGU6MTsKLQlVTE9ORwlJbXBUeEJGQ2FwYWJsZToxOwotCVVMT05HCUNhbGlicmF0aW9uOjI7Ci0JVUxPTkcJRXhwQ1NJQ2FwYWJsZToxOwotCVVMT05HCUV4cE5vQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ29tU3RlZXJDYXBhYmxlOjE7Ci0JVUxPTkcJRXhwQ1NJRmJrOjI7Ci0JVUxPTkcJRXhwTm9Db21CRjoyOwotCVVMT05HCUV4cENvbUJGOjI7Ci0JVUxPTkcJTWluR3JvdXBpbmc6MjsKLQlVTE9ORwlDU0lCRkFudFN1cDoyOwotCVVMT05HCU5vQ29tU3RlZXJCRkFudFN1cDoyOwotCVVMT05HCUNvbVN0ZWVyQkZBbnRTdXA6MjsKLQlVTE9ORwlDU0lSb3dCRlN1cDoyOwotCVVMT05HCUNoYW5Fc3RpbWF0aW9uOjI7Ci0JVUxPTkcJcnN2OjM7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotfSBIVF9CRl9DQVAsICpQSFRfQkZfQ0FQOwotCi0vLyAgSFQgYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQgaW4gSFQgQ2FwIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfSFRfQVNfQ0FQewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCVJ4QVNlbDoxOwotCVVDSEFSCUFudEluZEZiazoxOwotCVVDSEFSCUV4cENTSUZiazoxOwotCVVDSEFSCUFudEluZEZia1R4QVNFTDoxOwotCVVDSEFSCUV4cENTSUZia1R4QVNFTDoxOwotCVVDSEFSCUFudFNlbGVjdDoxOwotI2Vsc2UKLQlVQ0hBUglBbnRTZWxlY3Q6MTsKLQlVQ0hBUglFeHBDU0lGYmtUeEFTRUw6MTsKLQlVQ0hBUglBbnRJbmRGYmtUeEFTRUw6MTsKLQlVQ0hBUglFeHBDU0lGYms6MTsKLQlVQ0hBUglBbnRJbmRGYms6MTsKLQlVQ0hBUglSeEFTZWw6MTsKLQlVQ0hBUglUeFNvdW5kUFBEVToxOwotCVVDSEFSCXJzdjoxOwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLX0gSFRfQVNfQ0FQLCAqUEhUX0FTX0NBUDsKLQotLy8gRHJhZnQgMS4wIHNldCBJRSBsZW5ndGggMjYsIGJ1dCBpcyBleHRlbnNpYmxlLi4KLSNkZWZpbmUgU0laRV9IVF9DQVBfSUUJCTI2Ci0vLyBUaGUgc3RydWN0dXJlIGZvciBIVCBDYXBhYmlsaXR5IElFLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9IVF9DQVBBQklMSVRZX0lFewotCUhUX0NBUF9JTkZPCQlIdENhcEluZm87Ci0JSFRfQ0FQX1BBUk0JCUh0Q2FwUGFybTsKLS8vCUhUX01DU19TRVQJCUh0TUNTU2V0OwotCVVDSEFSCQkJTUNTU2V0WzE2XTsKLQlFWFRfSFRfQ0FQX0lORk8JRXh0SHRDYXBJbmZvOwotCUhUX0JGX0NBUAkJVHhCRkNhcDsJLy8gYmVhbWZvcm1pbmcgY2FwLiBydDI4NjBjIG5vdCBzdXBwb3J0IGJlYW1mb3JtaW5nLgotCUhUX0FTX0NBUAkJQVNDYXA7CS8vYW50ZW5uYSBzZWxlY3Rpb24uCi19IEhUX0NBUEFCSUxJVFlfSUUsICpQSFRfQ0FQQUJJTElUWV9JRTsKLQotCi0vLyA4MDIuMTFuIGRyYWZ0MyByZWxhdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KLS8vIDcuMy4yLjYwCi0jZGVmaW5lIGRvdDExT0JTU1NjYW5QYXNzaXZlRHdlbGwJCQkJCQkJMjAJLy8gaW4gVFUuIG1pbiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSBTVEEgY29udGlub3VzbHkgc2NhbnMgZWFjaCBjaGFubmVsIHdoZW4gcGVyZm9ybWluZyBhbiBhY3RpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuQWN0aXZlRHdlbGwJCQkJCQkJMTAJLy8gaW4gVFUubWluIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBjb250aW5vdXNseSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGFuIHBhc3NpdmUgT0JTUyBzY2FuLgotI2RlZmluZSBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbAkJCQkJMzAwICAvLyBpbiBzZWMuIG1heCBpbnRlcnZhbCBiZXR3ZWVuIHNjYW4gb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdG8gZGV0ZWN0IEJTUyBjaGFubmVsIHdpZHRoIHRyaWdnZXIgZXZlbnRzLgotI2RlZmluZSBkb3QxMU9CU1NTY2FuUGFzc2l2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAwCS8vIGluIFRVLiBtaW4gdG90YWwgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgU1RBIHNjYW5zIGVhY2ggY2hhbm5lbCB3aGVuIHBlcmZvcm1pbmcgYSBwYXNzaXZlIE9CU1Mgc2Nhbi4KLSNkZWZpbmUgZG90MTFPQlNTU2NhbkFjdGl2ZVRvdGFsUGVyQ2hhbm5lbAkJCQkJMjAJLy9pbiBUVS4gbWluIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIFNUQSBzY2FucyBlYWNoIGNoYW5uZWwgd2hlbiBwZXJmb3JtaW5nIGEgYWN0aXZlIE9CU1Mgc2NhbgotI2RlZmluZSBkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IJCQk1CS8vIG1pbiByYXRpbyBiZXR3ZWVuIHRoZSBkZWxheSB0aW1lIGluIHBlcmZvcm1pbmcgYSBzd2l0Y2ggZnJvbSAyME1IeiBCU1MgdG8gMjAvNDAgQlNTIG9wZXJhdGlvbiBhbmQgdGhlIG1heGltdW0KLQkJCQkJCQkJCQkJCQkJCQkvLwlpbnRlcnZhbCBiZXR3ZWVuIG92ZXJsYXBwaW5nIEJTUyBzY2FuIG9wZXJhdGlvbnMuCi0jZGVmaW5lIGRvdDExQlNTU2NhbkFjdGl2aXR5VGhyZXNob2xkCQkJCQkJMjUJLy8gaW4gJSUsIG1heCB0b3RhbCB0aW1lIHRoYXQgYSBTVEEgbWF5IGJlIGFjdGl2ZSBvbiB0aGUgbWVkaXVtIGR1cmluZyBhIHBlcmlvZCBvZgotCQkJCQkJCQkJCQkJCQkJCS8vCShkb3QxMUJTU1dpZHRoQ2hhbm5lbFRyYW5zYWN0aW9uRGVsYXlGYWN0b3IgKiBkb3QxMUJTU1dpZHRoVHJpZ2dlclNjYW5JbnRlcnZhbCkgc2Vjb25kcyB3aXRob3V0Ci0JCQkJCQkJCQkJCQkJCQkJLy8JYmVpbmcgb2JsaWdhdGVkIHRvIHBlcmZvcm0gT0JTUyBTY2FuIG9wZXJhdGlvbnMuIGRlZmF1bHQgaXMgMjUoPT0gMC4yNSUpCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfT1ZFUkxBUF9CU1NfU0NBTl9JRXsKLQlVU0hPUlQJCVNjYW5QYXNzaXZlRHdlbGw7Ci0JVVNIT1JUCQlTY2FuQWN0aXZlRHdlbGw7Ci0JVVNIT1JUCQlUcmlnZ2VyU2NhbkludDsJCQkJLy8gVHJpZ2dlciBzY2FuIGludGVydmFsCi0JVVNIT1JUCQlQYXNzaXZlVGFsUGVyQ2hhbm5lbDsJCS8vIHBhc3NpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCUFjdGl2ZVRhbFBlckNoYW5uZWw7CQkvLyBhY3RpdmUgdG90YWwgcGVyIGNoYW5uZWwKLQlVU0hPUlQJCURlbGF5RmFjdG9yOwkJCQkvLyBCU1Mgd2lkdGggY2hhbm5lbCB0cmFuc2l0aW9uIGRlbGF5IGZhY3RvcgotCVVTSE9SVAkJU2NhbkFjdFRocmU7CQkJCS8vIFNjYW4gQWN0aXZpdHkgdGhyZXNob2xkCi19T1ZFUkxBUF9CU1NfU0NBTl9JRSwgKlBPVkVSTEFQX0JTU19TQ0FOX0lFOwotCi0KLS8vICA3LjMuMi41Ni4gMjAvNDAgQ29leGlzdGVuY2UgZWxlbWVudCB1c2VkIGluICBFbGVtZW50IElEID0gNzIgPSBJRV8yMDQwX0JTU19DT0VYSVNUCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfQlNTXzIwNDBfQ09FWElTVF9JRXsKLSBzdHJ1Y3QgUEFDS0VEIHsKLSAjaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCXJzdjo1OwotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsKLQlVQ0hBUglJbnRvbGVyYW50NDA6MTsKLQlVQ0hBUglJbmZvUmVxOjE7Ci0gI2Vsc2UKLQlVQ0hBUglJbmZvUmVxOjE7Ci0JVUNIQVIJSW50b2xlcmFudDQwOjE7CQkJLy8gSW50ZXItQlNTLiBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBCU1MgZnJvbSBvcGVyYXRpbmcgYXMgYSAyMC80MCBNaHogQlNTLgotCVVDSEFSCUJTUzIwV2lkdGhSZXE6MTsJCS8vIEludHJhLUJTUyBzZXQgMSB3aGVuIHByb2hpYml0cyBhIHJlY2VpdmluZyBBUCBmcm9tIG9wZXJhdGluZyBpdHMgQlNTIGFzIGEgMjAvNDBNSHogQlNTLgotCVVDSEFSCXJzdjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLSAgICB9IGZpZWxkOwotIFVDSEFSICAgd29yZDsKLX0gQlNTXzIwNDBfQ09FWElTVF9JRSwgKlBCU1NfMjA0MF9DT0VYSVNUX0lFOwotCi0KLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVEF7Ci0JQk9PTEVBTgkJCWJWYWxpZDsKLQlVQ0hBUglCU1NJRFs2XTsKLQlVQ0hBUglSZWdDbGFzczsJLy8gUmVndWxhdG9yeSBDbGFzcwotCVVTSE9SVAlDaGFubmVsOwotCVVMT05HCUNEQ291bnRlcjsgICAvLyBNYWludGFpbiBhIHNlcGVyYXRlIGNvdW50IGRvd24gY291bnRlciBmb3IgZWFjaCBFdmVudCBBLgotfSBUUklHR0VSX0VWRU5UQSwgKlBUUklHR0VSX0VWRU5UQTsKLQotLy8gMjAvNDAgdHJpZ2dlciBldmVudCB0YWJsZQotLy8gSWYgb25lIEV2ZW50IEEgZGVsZXRlIG9yIGNyZWF0ZWQsIG9yIGlmIEV2ZW50IEIgaXMgZGV0ZWN0ZWQgb3Igbm90IGRldGVjdGVkLCBTVEEgc2hvdWxkIHNlbmQgMjA0MEJTU0NvZXhpc3RlbmNlIHRvIEFQLgotI2RlZmluZSBNQVhfVFJJR0dFUl9FVkVOVAkJNjQKLXR5cGVkZWYgc3RydWN0ICBfVFJJR0dFUl9FVkVOVF9UQUJ7Ci0JVUNIQVIJRXZlbnRBTm87Ci0JVFJJR0dFUl9FVkVOVEEJRXZlbnRBW01BWF9UUklHR0VSX0VWRU5UXTsKLQlVTE9ORwkJCUV2ZW50QkNvdW50RG93bjsJLy8gQ291bnQgZG93biBjb3VudGVyIGZvciBFdmVudCBCLgotfSBUUklHR0VSX0VWRU5UX1RBQiwgKlBUUklHR0VSX0VWRU5UX1RBQjsKLQotLy8gNy4zLjI3IDIwLzQwIEJzcyBDb2V4aXN0ZW5jZSBNZ210IGNhcGFiaWxpdHkgdXNlZCBpbiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgaW5mb3JtYXRpb24gSUUoIElEID0gMTI3ID0gSUVfRVhUX0NBUEFCSUxJVFkpLgotLy8JVGhpcyBpcyB0aGUgZmlyc3Qgb2N0ZXQgYW5kIHdhcyBkZWZpbmVkIGluIDgwMi4xMW4gRDMuMDMgYW5kIDgwMi4xMXlEOS4wCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VYVF9DQVBfSU5GT19FTEVNRU5UewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVQ0hBUglyc3YyOjU7Ci0JVUNIQVIJRXh0ZW5kQ2hhbm5lbFN3aXRjaDoxOwotCVVDSEFSCXJzdjoxOwotCVVDSEFSCUJzc0NvZXhpc3RNZ210U3VwcG9ydDoxOwotI2Vsc2UKLQlVQ0hBUglCc3NDb2V4aXN0TWdtdFN1cHBvcnQ6MTsKLQlVQ0hBUglyc3Y6MTsKLQlVQ0hBUglFeHRlbmRDaGFubmVsU3dpdGNoOjE7Ci0JVUNIQVIJcnN2Mjo1OwotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLX1FWFRfQ0FQX0lORk9fRUxFTUVOVCwgKlBFWFRfQ0FQX0lORk9fRUxFTUVOVDsKLQotCi0vLyA4MDIuMTFuIDcuMy4yLjYxCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0JTU18yMDQwX0NPRVhJU1RfRUxFTUVOVHsKLQlVQ0hBUgkJCQkJRWxlbWVudElEOwkJLy8gSUQgPSBJRV8yMDQwX0JTU19DT0VYSVNUID0gNzIKLQlVQ0hBUgkJCQkJTGVuOwotCUJTU18yMDQwX0NPRVhJU1RfSUUJCUJzc0NvZXhpc3RJZTsKLX1CU1NfMjA0MF9DT0VYSVNUX0VMRU1FTlQsICpQQlNTXzIwNDBfQ09FWElTVF9FTEVNRU5UOwotCi0KLS8vODAyLjExbiA3LjMuMi41OQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9CU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVHsKLQlVQ0hBUgkJCQlFbGVtZW50SUQ7CQkvLyBJRCA9IElFXzIwNDBfQlNTX0lOVE9MRVJBTlRfUkVQT1JUID0gNzMKLQlVQ0hBUgkJCQlMZW47Ci0JVUNIQVIJCQkJUmVndWxhdG9yeUNsYXNzOwotCVVDSEFSCQkJCUNoTGlzdFswXTsKLX1CU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVCwgKlBCU1NfMjA0MF9JTlRPTEVSQU5UX0NIX1JFUE9SVDsKLQotCi0vLyBUaGUgc3RydWN0dXJlIGZvciBjaGFubmVsIHN3aXRjaCBhbm5vdWNlbWVudCBJRS4gVGhpcyBpcyBpbiA4MDIuMTFuIEQzLjAzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NIQV9TV0lUQ0hfQU5OT1VOQ0VfSUV7Ci0JVUNIQVIJCQlTd2l0Y2hNb2RlOwkvL2NoYW5uZWwgc3dpdGNoIG1vZGUKLQlVQ0hBUgkJCU5ld0NoYW5uZWw7CS8vCi0JVUNIQVIJCQlTd2l0Y2hDb3VudDsJLy8KLX0gQ0hBX1NXSVRDSF9BTk5PVU5DRV9JRSwgKlBDSEFfU1dJVENIX0FOTk9VTkNFX0lFOwotCi0KLS8vIFRoZSBzdHJ1Y3R1cmUgZm9yIGNoYW5uZWwgc3dpdGNoIGFubm91Y2VtZW50IElFLiBUaGlzIGlzIGluIDgwMi4xMW4gRDMuMDMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfU0VDX0NIQV9PRkZTRVRfSUV7Ci0JVUNIQVIJCQlTZWNvbmRhcnlDaGFubmVsT2Zmc2V0OwkgLy8gMTogU2Vjb25kYXJ5IGFib3ZlLCAzOiBTZWNvbmRhcnkgYmVsb3csIDA6IG5vIFNlY29uZGFyeQotfSBTRUNfQ0hBX09GRlNFVF9JRSwgKlBTRUNfQ0hBX09GRlNFVF9JRTsKLQotCi0vLyBUaGlzIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSBzdHJ1Y3QgUlRfSFRfQ0FQQUJJTElUWQotdHlwZWRlZiBzdHJ1Y3QgewotCUJPT0xFQU4JCQliSHRFbmFibGU7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCi0JQk9PTEVBTgkJCWJQcmVOSHQ7CSAvLyBJZiB3ZSBzaG91bGQgdXNlIGh0IHJhdGUuCi0JLy9TdWJzdHJhY3QgZnJvbSBIVCBDYXBhYmlsaXR5IElFCi0JVUNIQVIJCQlNQ1NTZXRbMTZdOwotfSBSVF9IVF9QSFlfSU5GTywgKlBSVF9IVF9QSFlfSU5GTzsKLQotLy9UaGlzIHN0cnVjdHVyZSBzdWJzdHJhY3RzIHJhbGluayBzdXBwb3J0cyBmcm9tIGFsbCA4MDIuMTFuLXJlbGF0ZWQgZmVhdHVyZXMuCi0vL0ZlYXR1cmVzIG5vdCBsaXN0ZWQgaGVyZSBidXQgY29udGFpbmVkIGluIDgwMi4xMW4gc3BlYyBhcmUgbm90IHN1cHBvcnRlZCBpbiBydDI4NjAuCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVTSE9SVAlyc3Y6NTsKLQlVU0hPUlQJQW1zZHVTaXplOjE7CS8vIE1heCByZWNlaXZpbmcgQS1NU0RVIHNpemUKLQlVU0hPUlQJQW1zZHVFbmFibGU6MTsJLy8gRW5hYmxlIHRvIHRyYW5zbWl0IEEtTVNEVS4gU3VnZ2VzdCBkaXNhYmxlLiBXZSBzaG91bGQgdXNlIEEtTVBEVSB0byBnYWluIGJlc3QgYmVuaWZpdCBvZiA4MDIuMTFuCi0JVVNIT1JUCVJ4U1RCQzoyOwkvLyAyIGJpdHMKLQlVU0hPUlQJVHhTVEJDOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVNob3J0R0lmb3IyMDoxOwotCVVTSE9SVAlHRjoxOwkvL2dyZWVuIGZpZWxkCi0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUNoYW5uZWxXaWR0aDoxOwotI2Vsc2UKLQlVU0hPUlQJQ2hhbm5lbFdpZHRoOjE7Ci0JVVNIT1JUCU1pbW9QczoyOy8vbWltbyBwb3dlciBzYWZlIE1NUFNfCi0JVVNIT1JUCUdGOjE7CS8vZ3JlZW4gZmllbGQKLQlVU0hPUlQJU2hvcnRHSWZvcjIwOjE7Ci0JVVNIT1JUCVNob3J0R0lmb3I0MDoxOwkvL2ZvcjQwTUh6Ci0JVVNIT1JUCVR4U1RCQzoxOwotCVVTSE9SVAlSeFNUQkM6MjsJLy8gMiBiaXRzCi0JVVNIT1JUCUFtc2R1RW5hYmxlOjE7CS8vIEVuYWJsZSB0byB0cmFuc21pdCBBLU1TRFUuIFN1Z2dlc3QgZGlzYWJsZS4gV2Ugc2hvdWxkIHVzZSBBLU1QRFUgdG8gZ2FpbiBiZXN0IGJlbmlmaXQgb2YgODAyLjExbgotCVVTSE9SVAlBbXNkdVNpemU6MTsJLy8gTWF4IHJlY2VpdmluZyBBLU1TRFUgc2l6ZQotCVVTSE9SVAlyc3Y6NTsKLSNlbmRpZgotCi0JLy9TdWJzdHJhY3QgZnJvbSBBZGRpb250IEhUIElORk8gSUUKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUNIQVIJUmVjb21XaWR0aDoxOwotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCU1heFJBbXBkdUZhY3RvcjoyOwotI2Vsc2UKLQlVQ0hBUglNYXhSQW1wZHVGYWN0b3I6MjsKLQlVQ0hBUglNcGR1RGVuc2l0eTozOwotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsJLy8gUGxlYXNlIG5vdCB0aGUgZGlmZmVyZW5jZSB3aXRoIGZvbGxvd2luZwlVQ0hBUglOZXdFeHRDaGFubmVsT2Zmc2V0OyBmcm9tIDgwMi4xMW4KLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2MjoxMTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjM6MTsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotI2Vsc2UKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3YzOjE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3YyOjExOwotI2VuZGlmCi0KLQkvLyBOZXcgRXh0ZW5zaW9uIENoYW5uZWwgT2Zmc2V0IElFCi0JVUNIQVIJTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkvLyBFeHRlbnNpb24gQ2FwYWJpbGl0eSBJRSA9IDEyNwotCVVDSEFSCUJTU0NvZXhpc3QyMDQwOwotfSBSVF9IVF9DQVBBQklMSVRZLCAqUFJUX0hUX0NBUEFCSUxJVFk7Ci0KLS8vICAgZmllbGQgaW4gQWRkdGlvbmFsIEhUIEluZm9ybWF0aW9uIElFIC4KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCVNlckludGVyR3JhbnU6MzsKLQlVQ0hBUglTX1BTTVBTdXA6MTsKLQlVQ0hBUglSaWZzTW9kZToxOwotCVVDSEFSCVJlY29tV2lkdGg6MTsKLQlVQ0hBUglFeHRDaGFuT2Zmc2V0OjI7Ci0jZWxzZQotCVVDSEFSCUV4dENoYW5PZmZzZXQ6MjsKLQlVQ0hBUglSZWNvbVdpZHRoOjE7Ci0JVUNIQVIJUmlmc01vZGU6MTsKLQlVQ0hBUglTX1BTTVBTdXA6MTsJIC8vSW5kaWNhdGUgc3VwcG9ydCBmb3Igc2NoZWR1bGVkIFBTTVAKLQlVQ0hBUglTZXJJbnRlckdyYW51OjM7CSAvL3NlcnZpY2UgaW50ZXJ2YWwgZ3JhbnVsYXJpdHkKLSNlbmRpZgotfSBBRERfSFRJTkZPLCAqUEFERF9IVElORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVVNIT1JUCXJzdjI6MTE7Ci0JVVNIT1JUCU9CU1NfTm9uSFRFeGlzdDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJTm9uR2ZQcmVzZW50OjE7Ci0JVVNIT1JUCU9wZXJhaW9uTW9kZToyOwotI2Vsc2UKLQlVU0hPUlQJT3BlcmFpb25Nb2RlOjI7Ci0JVVNIT1JUCU5vbkdmUHJlc2VudDoxOwotCVVTSE9SVAlyc3Y6MTsKLQlVU0hPUlQJT0JTU19Ob25IVEV4aXN0OjE7Ci0JVVNIT1JUCXJzdjI6MTE7Ci0jZW5kaWYKLX0gQUREX0hUSU5GTzIsICpQQUREX0hUSU5GTzI7Ci0KLQotLy8gVE9ETzogTmVlZCBzeW5jIHdpdGggc3BlYyBhYm91dCB0aGUgZGVmaW5pdGlvbiBvZiBTdGJjTWNzLiBJbiBEcmFmdCAzLjAzLCBpdCdzIHJlc2VydmVkLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJcnN2OjQ7Ci0JVVNIT1JUCVBjb1BoYXNlOjE7Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlMc2lnVHhvcFByb3Q6MTsKLQlVU0hPUlQJU1RCQ0JlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlEdWFsQmVhY29uOjE7Ci0JVVNIT1JUCVN0YmNNY3M6NjsKLSNlbHNlCi0JVVNIT1JUCVN0YmNNY3M6NjsKLQlVU0hPUlQJRHVhbEJlYWNvbjoxOwotCVVTSE9SVAlEdWFsQ1RTUHJvdGVjdDoxOwotCVVTSE9SVAlTVEJDQmVhY29uOjE7Ci0JVVNIT1JUCUxzaWdUeG9wUHJvdDoxOwkvLyBMLVNJRyBUWE9QIHByb3RlY3Rpb24gZnVsbCBzdXBwb3J0Ci0JVVNIT1JUCVBjb0FjdGl2ZToxOwotCVVTSE9SVAlQY29QaGFzZToxOwotCVVTSE9SVAlyc3Y6NDsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi19IEFERF9IVElORk8zLCAqUEFERF9IVElORk8zOwotCi0jZGVmaW5lIFNJWkVfQUREX0hUX0lORk9fSUUJCTIyCi10eXBlZGVmIHN0cnVjdCAgUEFDS0VEewotCVVDSEFSCQkJCUNvbnRyb2xDaGFuOwotCUFERF9IVElORk8JCQlBZGRIdEluZm87Ci0JQUREX0hUSU5GTzIJCQlBZGRIdEluZm8yOwotCUFERF9IVElORk8zCQkJQWRkSHRJbmZvMzsKLQlVQ0hBUgkJCQlNQ1NTZXRbMTZdOwkJLy8gQmFzaWMgTUNTIHNldAotfSBBRERfSFRfSU5GT19JRSwgKlBBRERfSFRfSU5GT19JRTsKLQotdHlwZWRlZiBzdHJ1Y3QgIFBBQ0tFRHsKLQlVQ0hBUgkJCQlOZXdFeHRDaGFuT2Zmc2V0OwotfSBORVdfRVhUX0NIQU5fSUUsICpQTkVXX0VYVF9DSEFOX0lFOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FXzgwMl8xMSB7Ci0gICAgSEVBREVSXzgwMl8xMSAgIEhkcjsKLSAgICBVQ0hBUiAgICAgICAgICAgIE9jdGV0WzFdOwotfSAgIEZSQU1FXzgwMl8xMSwgKlBGUkFNRV84MDJfMTE7Ci0KLS8vIFFvU051bGwgZW1iZWRkaW5nIG9mIG1hbmFnZW1lbnQgYWN0aW9uLiBXaGVuIEhUIENvbnRyb2wgTUEgZmllbGQgc2V0IHRvIDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01BX0JPRFkgewotICAgIFVDSEFSICAgICAgICAgICAgQ2F0ZWdvcnk7Ci0gICAgVUNIQVIgICAgICAgICAgICBBY3Rpb247Ci0gICAgVUNIQVIgICAgICAgICAgICBPY3RldFsxXTsKLX0gICBNQV9CT0RZLCAqUE1BX0JPRFk7Ci0KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfSEVBREVSXzgwMl8zCXsKLSAgICBVQ0hBUiAgICAgICAgICAgREFBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBTQUFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIE9jdGV0WzJdOwotfQlIRUFERVJfODAyXzMsICpQSEVBREVSXzgwMl8zOwotLy8vL0Jsb2NrIEFDSyByZWxhdGVkIGZvcm1hdAotLy8gMi1ieXRlIEJBIFBhcmFtZXRlciAgZmllbGQgIGluCURFTEJBIGZyYW1lcyB0byB0ZXJtaW5hdGUgYW4gYWxyZWFkeSBzZXQgdXAgYkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi0gICAgVVNIT1JUICAgICAgSW5pdGlhdG9yOjE7CS8vIDE6IG9yaWdpbmF0b3IgICAgMDpyZWNpcGllbnQKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBSc3Y6MTE7CS8vIGFsd2F5cyBzZXQgdG8gMAotICAgIFVTSE9SVCAgICAgIEluaXRpYXRvcjoxOwkvLyAxOiBvcmlnaW5hdG9yICAgIDA6cmVjaXBpZW50Ci0gICAgVVNIT1JUICAgICAgVElEOjQ7CS8vIHZhbHVlIG9mIFRDIG9zIFRTCi0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gREVMQkFfUEFSTSwgKlBERUxCQV9QQVJNOwotCi0vLyAyLWJ5dGUgQkEgUGFyYW1ldGVyIFNldCBmaWVsZCAgaW4gQUREQkEgZnJhbWVzIHRvIHNpZ25hbCBwYXJtIGZvciBzZXR0aW5nIHVwIGEgQkEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIEJ1ZlNpemU6MTA7CS8vIG51bWJlciBvZiBidWZmZSBvZiBzaXplIDIzMDQgb2N0ZXRzcgotICAgIFVTSE9SVCAgICAgIFRJRDo0OwkvLyB2YWx1ZSBvZiBUQyBvcyBUUwotICAgIFVTSE9SVCAgICAgIEJBUG9saWN5OjE7CS8vIDE6IGltbWVkaWF0ZWx5IEJBICAgIDA6ZGVsYXllZCBCQQotICAgIFVTSE9SVCAgICAgIEFNU0RVU3VwcG9ydGVkOjE7CS8vIDA6IG5vdCBwZXJtaXR0ZWQJCTE6IHBlcm1pdHRlZAotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBBTVNEVVN1cHBvcnRlZDoxOwkvLyAwOiBub3QgcGVybWl0dGVkCQkxOiBwZXJtaXR0ZWQKLSAgICBVU0hPUlQgICAgICBCQVBvbGljeToxOwkvLyAxOiBpbW1lZGlhdGVseSBCQSAgICAwOmRlbGF5ZWQgQkEKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsJLy8gdmFsdWUgb2YgVEMgb3MgVFMKLSAgICBVU0hPUlQgICAgICBCdWZTaXplOjEwOwkvLyBudW1iZXIgb2YgYnVmZmUgb2Ygc2l6ZSAyMzA0IG9jdGV0c3IKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBCQV9QQVJNLCAqUEJBX1BBUk07Ci0KLS8vIDItYnl0ZSBCQSBTdGFydGluZyBTZXEgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiB1bmlvbiBQQUNLRUQgewotICAgIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50Ci0JVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgRnJhZ051bTo0OwkvLyBhbHdheXMgc2V0IHRvIDAKLQlVU0hPUlQgICAgICBTdGFydFNlcToxMjsgICAvLyBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIDFzdCBNU0RVIGZvciB3aGljaCB0aGlzIEJBUiBpcyBzZW50Ci0jZW5kaWYgLyogUlRfQklHX0VORElBTiAqLwotICAgIH0gICBmaWVsZDsKLSAgICBVU0hPUlQgICAgICAgICAgIHdvcmQ7Ci19IEJBU0VRX0NPTlRST0wsICpQQkFTRVFfQ09OVFJPTDsKLQotLy9CQUNvbnRyb2wgYW5kIEJBUkNvbnRyb2wgYXJlIHRoZSBzYW1lCi0vLyAyLWJ5dGUgQkEgQ09OVFJPTCBmaWVsZCBpbiBCQSBmcmFtZQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVElEOjQ7Ci0gICAgVVNIT1JUICAgICAgUnN2Ojk7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsJCS8vRVdDIFYxLjI0Ci0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7IC8vIG9ubHkgcmVsYXRlZCB0byBOLURlbGF5ZWQgQkEuIEJ1dCBub3Qgc3VwcG9ydCBpbiBSVDI4NjBiLiAwOk5vcm1hbEFDSyAgMTpObyBBQ0sKLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL0VXQyBWMS4yNAotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3Y6OTsKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBCQV9DT05UUk9MLCAqUEJBX0NPTlRST0w7Ci0KLS8vIDItYnl0ZSBCQVIgQ09OVFJPTCBmaWVsZCBpbiBCQVIgZnJhbWUKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotICAgIFVTSE9SVCAgICAgIFJzdjE6OTsKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwkJLy9pZiB0aGlzIGJpdDEsIHVzZSAgRlJBTUVfTVRCQV9SRVEsICBpZiAwLCB1c2UgRlJBTUVfQkFfUkVRCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0jZWxzZQotICAgIFVTSE9SVCAgICAgIEFDS1BvbGljeToxOyAvLyAwOm5vcm1hbCBhY2ssICAxOm5vIGFjay4KLSAgICBVU0hPUlQgICAgICBNVElEOjE7CQkvL2lmIHRoaXMgYml0MSwgdXNlICBGUkFNRV9NVEJBX1JFUSwgIGlmIDAsIHVzZSBGUkFNRV9CQV9SRVEKLSAgICBVU0hPUlQgICAgICBDb21wcmVzc2VkOjE7Ci0gICAgVVNIT1JUICAgICAgUnN2MTo5OwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IEJBUl9DT05UUk9MLCAqUEJBUl9DT05UUk9MOwotCi0vLyBCQVJDb250cm9sIGluIE1UQkFSIGZyYW1lCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBOdW1USUQ6NDsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgQ29tcHJlc3NlZDoxOwotICAgIFVTSE9SVCAgICAgIE1USUQ6MTsKLSAgICBVU0hPUlQgICAgICBBQ0tQb2xpY3k6MTsKLSNlbHNlCi0gICAgVVNIT1JUICAgICAgQUNLUG9saWN5OjE7Ci0gICAgVVNIT1JUICAgICAgTVRJRDoxOwotICAgIFVTSE9SVCAgICAgIENvbXByZXNzZWQ6MTsKLSAgICBVU0hPUlQgICAgICBSc3YxOjk7Ci0gICAgVVNIT1JUICAgICAgTnVtVElEOjQ7Ci0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gTVRCQVJfQ09OVFJPTCwgKlBNVEJBUl9DT05UUk9MOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBSc3YxOjEyOwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFBFUl9USURfSU5GTywgKlBQRVJfVElEX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlQRVJfVElEX0lORk8gICAgICBQZXJUSUQ7Ci0JQkFTRVFfQ09OVFJPTAkgQkFTdGFydGluZ1NlcTsKLX0gRUFDSF9USUQsICpQRUFDSF9USUQ7Ci0KLQotLy8gQkFSRVEgQU5EIE1UQkFSRVEgaGF2ZSB0aGUgc2FtZSBzdWJ0eXBlIEJBUiwgODAyLjExbiBCQVIgdXNlIGNvbXByZXNzZWQgYml0bWFwLgotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQV9SRVEgewotCUZSQU1FX0NPTlRST0wgICBGQzsKLQlVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0JVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JQkFSX0NPTlRST0wgIEJBUkNvbnRyb2w7Ci0JQkFTRVFfQ09OVFJPTAkgQkFTdGFydGluZ1NlcTsKLX0gICBGUkFNRV9CQV9SRVEsICpQRlJBTUVfQkFfUkVROwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX01UQkFfUkVRIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCU1UQkFSX0NPTlRST0wgIE1UQkFSQ29udHJvbDsKLQlQRVJfVElEX0lORk8JUGVyVElESW5mbzsKLQlCQVNFUV9DT05UUk9MCSBCQVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX01UQkFfUkVRLCAqUEZSQU1FX01UQkFfUkVROwotCi0vLyBDb21wcmVzc2VkIGZvcm1hdCBpcyBtYW5kYW50b3J5IGluIEhUIFNUQQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9NVEJBIHsKLQlGUkFNRV9DT05UUk9MICAgRkM7Ci0JVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotCVVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJBX0NPTlRST0wgIEJBQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCSBCQVN0YXJ0aW5nU2VxOwotCVVDSEFSCQlCaXRNYXBbOF07Ci19ICAgRlJBTUVfTVRCQSwgKlBGUkFNRV9NVEJBOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1BTTVBfQUNUSU9OIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglQc21wOwkvLyA3LjMuMS4yNQotfSAgIEZSQU1FX1BTTVBfQUNUSU9OLCAqUEZSQU1FX1BTTVBfQUNUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FDVElPTl9IRFIgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotfSAgIEZSQU1FX0FDVElPTl9IRFIsICpQRlJBTUVfQUNUSU9OX0hEUjsKLQotLy9BY3Rpb24gRnJhbWUKLS8vQWN0aW9uIEZyYW1lICBDYXRlZ29yeTpTcGVjdHJ1bSwgIEFjdGlvbjpDaGFubmVsIFN3aXRjaC4gNy4zLjIuMjAKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hBTl9TV0lUQ0hfQU5OT1VOQ0UgewotCVVDSEFSCQkJCQlFbGVtZW50SUQ7CS8vIElEID0gSUVfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UID0gMzcKLQlVQ0hBUgkJCQkJTGVuOwotCUNIQV9TV0lUQ0hfQU5OT1VOQ0VfSUUJQ1NBbm5vdW5jZUllOwotfSAgIENIQU5fU1dJVENIX0FOTk9VTkNFLCAqUENIQU5fU1dJVENIX0FOTk9VTkNFOwotCi0KLS8vODAyLjExbiA6IDcuMy4yLjIwYQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9TRUNPTkRfQ0hBTl9PRkZTRVQgewotCVVDSEFSCQkJCUVsZW1lbnRJRDsJCS8vIElEID0gSUVfU0VDT05EQVJZX0NIX09GRlNFVCA9IDYyCi0JVUNIQVIJCQkJTGVuOwotCVNFQ19DSEFfT0ZGU0VUX0lFCVNlY0NoT2Zmc2V0SWU7Ci19ICAgU0VDT05EX0NIQU5fT0ZGU0VULCAqUFNFQ09ORF9DSEFOX09GRlNFVDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX1NQRVRSVU1fQ1MgewotCUhFQURFUl84MDJfMTEgICBIZHI7Ci0JVUNIQVIJQ2F0ZWdvcnk7Ci0JVUNIQVIJQWN0aW9uOwotCUNIQU5fU1dJVENIX0FOTk9VTkNFCUNTQW5ub3VuY2U7Ci0JU0VDT05EX0NIQU5fT0ZGU0VUCQlTZWNvbmRDaGFubmVsOwotfSAgIEZSQU1FX1NQRVRSVU1fQ1MsICpQRlJBTUVfU1BFVFJVTV9DUzsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0FEREJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47CS8vIDEKLQlCQV9QQVJNCQlCYVBhcm07CSAgICAgIC8vICAyIC0gMTAKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsJLy8gMCAtIDAKLQlCQVNFUV9DT05UUk9MCUJhU3RhcnRTZXE7IC8vIDAtMAotfSAgIEZSQU1FX0FEREJBX1JFUSwgKlBGUkFNRV9BRERCQV9SRVE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfQUREQkFfUlNQIHsKLQlIRUFERVJfODAyXzExICAgSGRyOwotCVVDSEFSCUNhdGVnb3J5OwotCVVDSEFSCUFjdGlvbjsKLQlVQ0hBUglUb2tlbjsKLQlVU0hPUlQJU3RhdHVzQ29kZTsKLQlCQV9QQVJNCQlCYVBhcm07IC8vMCAtIDIKLQlVU0hPUlQJCVRpbWVPdXRWYWx1ZTsKLX0gICBGUkFNRV9BRERCQV9SU1AsICpQRlJBTUVfQUREQkFfUlNQOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0RFTEJBX1JFUSB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JREVMQkFfUEFSTQkJRGVsYmFQYXJtOwotCVVTSE9SVAlSZWFzb25Db2RlOwotfSAgIEZSQU1FX0RFTEJBX1JFUSwgKlBGUkFNRV9ERUxCQV9SRVE7Ci0KLQotLy83LjIuMS43Ci10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0ZSQU1FX0JBUiB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotfSAgIEZSQU1FX0JBUiwgKlBGUkFNRV9CQVI7Ci0KLS8vNy4yLjEuNwotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9GUkFNRV9CQSB7Ci0JRlJBTUVfQ09OVFJPTCAgIEZDOwotCVVTSE9SVCAgICAgICAgICBEdXJhdGlvbjsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlCQVJfQ09OVFJPTAkJQmFyQ29udHJvbDsKLQlCQVNFUV9DT05UUk9MCVN0YXJ0aW5nU2VxOwotCVVDSEFSCQliaXRtYXNrWzhdOwotfSAgIEZSQU1FX0JBLCAqUEZSQU1FX0JBOwotCi0KLS8vIFJhZGlvIE1lYXN1ZW1lbnQgUmVxdWVzdCBGcmFtZSBGb3JtYXQKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfRlJBTUVfUk1fUkVRX0FDVElPTiB7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjsKLQlVQ0hBUglDYXRlZ29yeTsKLQlVQ0hBUglBY3Rpb247Ci0JVUNIQVIJVG9rZW47Ci0JVVNIT1JUCVJlcGV0aXRpb247Ci0JVUNIQVIgICBkYXRhWzBdOwotfSAgIEZSQU1FX1JNX1JFUV9BQ1RJT04sICpQRlJBTUVfUk1fUkVRX0FDVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLQlVQ0hBUgkJSUQ7Ci0JVUNIQVIJCUxlbmd0aDsKLQlVQ0hBUgkJQ2hhbm5lbFN3aXRjaE1vZGU7Ci0JVUNIQVIJCU5ld1JlZ0NsYXNzOwotCVVDSEFSCQlOZXdDaGFubmVsTnVtOwotCVVDSEFSCQlDaGFubmVsU3dpdGNoQ291bnQ7Ci19IEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUsICpQSFRfRVhUX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVF9JRTsKLQotCi0vLwotLy8gX0xpbWl0IG11c3QgYmUgdGhlIDIqKm4gLSAxCi0vLyBfU0VRMSAsIF9TRVEyIG11c3QgYmUgd2l0aGluIDAgfiBfTGltaXQKLS8vCi0jZGVmaW5lIFNFUV9TVEVQT05FKF9TRVExLCBfU0VRMiwgX0xpbWl0KQkoKF9TRVExID09ICgoX1NFUTIrMSkgJiBfTGltaXQpKSkKLSNkZWZpbmUgU0VRX1NNQUxMRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoKF9TRVExLV9TRVEyKSAmICgoX0xpbWl0KzEpPj4xKSkpCi0jZGVmaW5lIFNFUV9MQVJHRVIoX1NFUTEsIF9TRVEyLCBfTGltaXQpCSgoX1NFUTEgIT0gX1NFUTIpICYmICEoKChfU0VRMS1fU0VRMikgJiAoKF9MaW1pdCsxKT4+MSkpKSkKLSNkZWZpbmUgU0VRX1dJVEhJTl9XSU4oX1NFUTEsIF9TRVEyLCBfV0lOLCBfTGltaXQpIChTRVFfTEFSR0VSKF9TRVExLCBfU0VRMiwgX0xpbWl0KSAmJiAgXAotCQkJCQkJCQkJCQkJU0VRX1NNQUxMRVIoX1NFUTEsICgoX1NFUTIrX1dJTisxKSZfTGltaXQpLCBfTGltaXQpKQotCi0vLwotLy8gQ29udGVudGlvbi1mcmVlIHBhcmFtZXRlciAod2l0aG91dCBJRCBhbmQgTGVuZ3RoKQotLy8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVUNIQVIgICAgICAgQ2ZwQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOwotICAgIFVTSE9SVCAgICAgIENmcER1clJlbWFpbmluZzsKLX0gQ0ZfUEFSTSwgKlBDRl9QQVJNOwotCi10eXBlZGVmCXN0cnVjdAlfQ0lQSEVSX1NVSVRFCXsKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyOwkJLy8gVW5pY2FzdCBjaXBoZXIgMSwgdGhpcyBvbmUgaGFzIG1vcmUgc2VjdXJlZCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlQYWlyQ2lwaGVyQXV4OwkvLyBVbmljYXN0IGNpcGhlciAyIGlmIEFQIGFubm91bmNlIHR3byB1bmljYXN0IGNpcGhlciBzdWl0ZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUdyb3VwQ2lwaGVyOwkvLyBHcm91cCBjaXBoZXIKLQlVU0hPUlQJCQkJCQkJUnNuQ2FwYWJpbGl0eTsJLy8gUlNOIGNhcGFiaWxpdHkgZnJvbSBiZWFjb24KLQlCT09MRUFOCQkJCQkJCWJNaXhNb2RlOwkJLy8gSW5kaWNhdGUgUGFpciAmIEdyb3VwIGNpcGhlciBtaWdodCBiZSBkaWZmZXJlbnQKLX0JQ0lQSEVSX1NVSVRFLCAqUENJUEhFUl9TVUlURTsKLQotLy8gRURDQSBjb25maWd1cmF0aW9uIGZyb20gQVAncyBCRUFDT04vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCT09MRUFOICAgICBiVmFsaWQ7ICAgICAgICAgLy8gMTogdmFyaWFibGUgY29udGFpbnMgdmFsaWQgdmFsdWUKLSAgICBCT09MRUFOICAgICBiQWRkOyAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0gICAgQk9PTEVBTiAgICAgYkFQU0RDYXBhYmxlOwotLy8gIEJPT0xFQU4gICAgIGJNb3JlRGF0YUFjazsKLSAgICBVQ0hBUiAgICAgICBFZGNhVXBkYXRlQ291bnQ7Ci0gICAgVUNIQVIgICAgICAgQWlmc25bNF07ICAgICAgIC8vIDA6QUNfQkssIDE6QUNfQkUsIDI6QUNfVkksIDM6QUNfVk8KLSAgICBVQ0hBUiAgICAgICBDd21pbls0XTsKLSAgICBVQ0hBUiAgICAgICBDd21heFs0XTsKLSAgICBVU0hPUlQgICAgICBUeG9wWzRdOyAgICAgIC8vIGluIHVuaXQgb2YgMzItdXMKLSAgICBCT09MRUFOICAgICBiQUNNWzRdOyAgICAgIC8vIDE6IEFkbWlzc2lvbiBDb250cm9sIG9mIEFDX0JLIGlzIG1hbmRhdHRvcnkKLX0gRURDQV9QQVJNLCAqUEVEQ0FfUEFSTTsKLQotLy8gUUJTUyBMT0FEIGluZm9ybWF0aW9uIGZyb20gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgVVNIT1JUICAgICAgU3RhTnVtOwotICAgIFVDSEFSICAgICAgIENoYW5uZWxVdGlsaXphdGlvbjsKLSAgICBVU0hPUlQgICAgICBSZW1haW5pbmdBZG1pc3Npb25Db250cm9sOyAgLy8gaW4gdW5pdCBvZiAzMi11cwotfSBRQlNTX0xPQURfUEFSTSwgKlBRQlNTX0xPQURfUEFSTTsKLQotLy8gUUJTUyBJbmZvIGZpZWxkIGluIFFTVEEncyBhc3NvYyByZXEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCQlSc3YyOjE7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOjI7Ci0JVUNIQVIJCVJzdjE6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQkU6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfQks6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVkk6MTsKLQlVQ0hBUgkJVUFQU0RfQUNfVk86MTsKLSNlbHNlCi0gICAgVUNIQVIJCVVBUFNEX0FDX1ZPOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX1ZJOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX0JLOjE7Ci0JVUNIQVIJCVVBUFNEX0FDX0JFOjE7Ci0JVUNIQVIJCVJzdjE6MTsKLQlVQ0hBUgkJTWF4U1BMZW5ndGg6MjsKLQlVQ0hBUgkJUnN2MjoxOwotI2VuZGlmIC8qICFSVF9CSUdfRU5ESUFOICovCi19IFFCU1NfU1RBX0lORk9fUEFSTSwgKlBRQlNTX1NUQV9JTkZPX1BBUk07Ci0KLS8vIFFCU1MgSW5mbyBmaWVsZCBpbiBRQVAncyBCZWFjb24vUHJvYmVSc3AKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCQlVQVBTRDoxOwotCVVDSEFSCQlSc3Y6MzsKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotI2Vsc2UKLSAgICBVQ0hBUgkJUGFyYW1TZXRDb3VudDo0OwotCVVDSEFSCQlSc3Y6MzsKLQlVQ0hBUgkJVUFQU0Q6MTsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBRQlNTX0FQX0lORk9fUEFSTSwgKlBRQlNTX0FQX0lORk9fUEFSTTsKLQotLy8gUU9TIENhcGFiaWxpdHkgcmVwb3J0ZWQgaW4gUUFQJ3MgQkVBQ09OL1Byb2JlUnNwCi0vLyBRT1MgQ2FwYWJpbGl0eSBzZW50IG91dCBpbiBRU1RBJ3MgQXNzb2NpYXRlUmVxL1JlQXNzb2NpYXRlUmVxCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQk9PTEVBTiAgICAgYlZhbGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDE6IHZhcmlhYmxlIGNvbnRhaW5zIHZhbGlkIHZhbHVlCi0gICAgQk9PTEVBTiAgICAgYlFBY2s7Ci0gICAgQk9PTEVBTiAgICAgYlF1ZXVlUmVxdWVzdDsKLSAgICBCT09MRUFOICAgICBiVHhvcFJlcXVlc3Q7Ci0vLyAgQk9PTEVBTiAgICAgYk1vcmVEYXRhQWNrOwotICAgIFVDSEFSICAgICAgIEVkY2FVcGRhdGVDb3VudDsKLX0gUU9TX0NBUEFCSUxJVFlfUEFSTSwgKlBRT1NfQ0FQQUJJTElUWV9QQVJNOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUNIQVIgICAgICAgSUVMZW47Ci0gICAgVUNIQVIgICAgICAgSUVbTUFYX0NVU1RPTV9MRU5dOwotfSBXUEFfSUVfOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBVQ0hBUiAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICBDaGFubmVsOwotCVVDSEFSICAgQ2VudHJhbENoYW5uZWw7CS8vU3RvcmUgdGhlIHdpZGUtYmFuZCBjZW50cmFsIGNoYW5uZWwgZm9yIDQwTUh6LiAgLnVzZWQgaW4gNDBNSHogQVAuIE9yIHRoaXMgaXMgdGhlIHNhbWUgYXMgQ2hhbm5lbC4KLSAgICBVQ0hBUiAgIEJzc1R5cGU7Ci0gICAgVVNIT1JUICBBdGltV2luOwotICAgIFVTSE9SVCAgQmVhY29uUGVyaW9kOwotCi0gICAgVUNIQVIgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIFN1cFJhdGVMZW47Ci0gICAgVUNIQVIgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLSAgICBVQ0hBUiAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHk7Ci0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW47Ci0JQUREX0hUX0lORk9fSUUgQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQ7Ci0JQ0hBUiAgICBSc3NpOwotICAgIFVDSEFSICAgUHJpdmFjeTsJCQkvLyBJbmRpY2F0ZSBzZWN1cml0eSBmdW5jdGlvbiBPTi9PRkYuIERvbid0IG1lc3MgdXAgd2l0aCBhdXRoIG1vZGUuCi0JVUNIQVIJSGlkZGVuOwotCi0gICAgVVNIT1JUICBEdGltUGVyaW9kOwotICAgIFVTSE9SVCAgQ2FwYWJpbGl0eUluZm87Ci0KLSAgICBVU0hPUlQgIENmcENvdW50OwotICAgIFVTSE9SVCAgQ2ZwUGVyaW9kOwotICAgIFVTSE9SVCAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICBDZnBEdXJSZW1haW5pbmc7Ci0gICAgVUNIQVIgICBTc2lkTGVuOwotICAgIENIQVIgICAgU3NpZFtNQVhfTEVOX09GX1NTSURdOwotCi0gICAgVUxPTkcgICBMYXN0QmVhY29uUnhUaW1lOyAvLyBPUydzIHRpbWVzdGFtcAotCi0JQk9PTEVBTgliU0VTOwotCi0JLy8gTmV3IGZvciBXUEEyCi0JQ0lQSEVSX1NVSVRFCQkJCQlXUEE7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQSBjaXBoZXIgc3VpdGUKLQlDSVBIRVJfU1VJVEUJCQkJCVdQQTI7CQkJLy8gQVAgYW5ub3VuY2VkIFdQQTIgY2lwaGVyIHN1aXRlCi0KLQkvLyBOZXcgZm9yIG1pY3Jvc29mdCBXUEEgc3VwcG9ydAotCU5ESVNfODAyXzExX0ZJWEVEX0lFcwlGaXhJRXM7Ci0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZUF1eDsJLy8gQWRkaXRpb24gbW9kZSBmb3IgV1BBMiAvIFdQQSBjYXBhYmxlIEFQCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERQlBdXRoTW9kZTsKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTCVdlcFN0YXR1czsJCQkJLy8gVW5pY2FzdCBFbmNyeXB0aW9uIEFsZ29yaXRobSBleHRyYWN0IGZyb20gVkFSX0lFCi0JVVNIT1JUCQkJCQlWYXJJRUxlbjsJCQkJLy8gTGVuZ3RoIG9mIG5leHQgVklFIGluY2x1ZGUgRUlEICYgTGVuZ3RoCi0JVUNIQVIJCQkJCVZhcklFc1tNQVhfVklFX0xFTl07Ci0KLQkvLyBDQ1ggQ2tpcCBpbmZvcm1hdGlvbgotICAgIFVDSEFSICAgQ2tpcEZsYWc7Ci0KLQkvLyBDQ1ggMiBUU0YKLQlVQ0hBUglQVFNGWzRdOwkJLy8gUGFyZW50IFRTRgotCVVDSEFSCVRUU0ZbOF07CQkvLyBUYXJnZXQgVFNGCi0KLSAgICAvLyA4MDIuMTFlIGQ5LCBhbmQgV01NCi0JRURDQV9QQVJNICAgICAgICAgICBFZGNhUGFybTsKLQlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7Ci0JUUJTU19MT0FEX1BBUk0gICAgICBRYnNzTG9hZDsKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSAgICBXUEFfSUVfICAgICBXcGFJRTsKLSAgICBXUEFfSUVfICAgICBSc25JRTsKLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JVUNIQVIJCUNvdW50cnlTdHJpbmdbM107Ci0JQk9PTEVBTgkJYkhhc0NvdW50cnlJRTsKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLX0gQlNTX0VOVFJZLCAqUEJTU19FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVDSEFSICAgICAgICAgICBCc3NOcjsKLSAgICBVQ0hBUiAgICAgICAgICAgQnNzT3ZlcmxhcE5yOwotICAgIEJTU19FTlRSWSAgICAgICBCc3NFbnRyeVtNQVhfTEVOX09GX0JTU19UQUJMRV07Ci19IEJTU19UQUJMRSwgKlBCU1NfVEFCTEU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfUVVFVUVfRUxFTSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTWFjaGluZTsKLSAgICBVTE9ORyAgICAgICAgICAgICBNc2dUeXBlOwotICAgIFVMT05HICAgICAgICAgICAgIE1zZ0xlbjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBNc2dbTUdNVF9ETUFfQlVGRkVSX1NJWkVdOwotICAgIExBUkdFX0lOVEVHRVIgICAgIFRpbWVTdGFtcDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMTsKLSAgICBVQ0hBUiAgICAgICAgICAgICBSc3NpMjsKLSAgICBVQ0hBUiAgICAgICAgICAgICBTaWduYWw7Ci0gICAgVUNIQVIgICAgICAgICAgICAgQ2hhbm5lbDsKLSAgICBVQ0hBUiAgICAgICAgICAgICBXY2lkOwotICAgIEJPT0xFQU4gICAgICAgICAgIE9jY3VwaWVkOwotI2lmZGVmIE1MTUVfRVgKLQlVU0hPUlQgICAgICAgICAgICBJZHg7Ci0jZW5kaWYgLy8gTUxNRV9FWCAvLwotfSBNTE1FX1FVRVVFX0VMRU0sICpQTUxNRV9RVUVVRV9FTEVNOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9RVUVVRSB7Ci0gICAgVUxPTkcgICAgICAgICAgICAgTnVtOwotICAgIFVMT05HICAgICAgICAgICAgIEhlYWQ7Ci0gICAgVUxPTkcgICAgICAgICAgICAgVGFpbDsKLSAgICBORElTX1NQSU5fTE9DSyAgIExvY2s7Ci0gICAgTUxNRV9RVUVVRV9FTEVNICBFbnRyeVtNQVhfTEVOX09GX01MTUVfUVVFVUVdOwotfSBNTE1FX1FVRVVFLCAqUE1MTUVfUVVFVUU7Ci0KLXR5cGVkZWYgVk9JRCAoKlNUQVRFX01BQ0hJTkVfRlVOQykoVk9JRCAqQWRhcHRvciwgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQVRFX01BQ0hJTkUgewotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yU3RhdGU7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBOck1zZzsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJTdGF0ZTsKLSAgICBTVEFURV9NQUNISU5FX0ZVTkMgICAgICAgICAgICAgKlRyYW5zRnVuYzsKLX0gU1RBVEVfTUFDSElORSwgKlBTVEFURV9NQUNISU5FOwotCi0KLS8vIE1MTUUgQVVYIGRhdGEgc3RydWN0dXJlIHRoYXQgaG9sZCB0ZW1wb3JhcmxpeSBzZXR0aW5ncyBkdXJpbmcgYSBjb25uZWN0aW9uIGF0dGVtcHQuCi0vLyBPbmNlIHRoaXMgYXR0ZW1wIHN1Y2NlZWRzLCBhbGwgc2V0dGluZ3Mgd2lsbCBiZSBjb3B5IHRvIHBBZC0+U3RhQWN0aXZlLgotLy8gQSBjb25uZWN0aW9uIGF0dGVtcHQgKHVzZXIgc2V0IE9JRCwgcm9hbWluZywgQ0NYIGZhc3Qgcm9hbWluZywuLikgY29uc2lzdHMgb2YKLS8vIHNldmVyYWwgc3RlcHMgKEpPSU4sIEFVVEgsIEFTU09DIG9yIFJFQVNTT0MpIGFuZCBtYXkgZmFpbCBhdCBhbnkgc3RlcC4gV2UgcHVycG9zZWx5Ci0vLyBzZXBhcmF0ZSB0aGlzIHVuZGVyLXRyaWFsIHNldHRpbmdzIGF3YXkgZnJvbSBwQWQtPlN0YUFjdGl2ZSBzbyB0aGF0IG9uY2UKLS8vIHRoaXMgbmV3IGF0dGVtcHQgZmFpbGVkLCBkcml2ZXIgY2FuIGF1dG8tcmVjb3ZlciBiYWNrIHRvIHRoZSBhY3RpdmUgc2V0dGluZ3MuCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BVVggewotICAgIFVDSEFSICAgICAgICAgICAgICAgQnNzVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIFNzaWRMZW47Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotCVVDSEFSCQkJCUF1dG9SZWNvbm5lY3RTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0JVUNIQVIJCQkJQXV0b1JlY29ubmVjdFNzaWRMZW47Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBbGc7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBTY2FuVHlwZTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIENoYW5uZWw7Ci0JVUNIQVIgICAgICAgICAgICAgICBDZW50cmFsQ2hhbm5lbDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIEFpZDsKLSAgICBVU0hPUlQgICAgICAgICAgICAgIENhcGFiaWxpdHlJbmZvOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgQ2ZwTWF4RHVyYXRpb247Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBDZnBQZXJpb2Q7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICBBdGltV2luOwotCi0JLy8gQ29weSBzdXBwb3J0ZWQgcmF0ZSBmcm9tIGRlc2lyZWQgQVAncyBiZWFjb24uIFdlIGFyZSB0cnlpbmcgdG8gbWF0Y2gKLQkvLyBBUCdzIHN1cHBvcnRlZCBhbmQgZXh0ZW5kZWQgcmF0ZSBzZXR0aW5ncy4KLQlVQ0hBUgkJICAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICAgICAgICBTdXBSYXRlTGVuOwotCVVDSEFSCQkgICAgICAgIEV4dFJhdGVMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRQkJSHRDYXBhYmlsaXR5OwotCVVDSEFSCQkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQ7Ci0JLy9SVF9IVF9DQVBBQklMSVRZCVN1cHBvcnRlZEh0UGh5OwotCi0gICAgLy8gbmV3IGZvciBRT1MKLSAgICBRT1NfQ0FQQUJJTElUWV9QQVJNIEFQUW9zQ2FwYWJpbGl0eTsgICAgLy8gUU9TIGNhcGFiaWxpdHkgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIEVEQ0FfUEFSTSAgICAgICAgICAgQVBFZGNhUGFybTsgICAgICAgICAvLyBFRENBIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotICAgIFFCU1NfTE9BRF9QQVJNICAgICAgQVBRYnNzTG9hZDsgICAgICAgICAvLyBRQlNTIGxvYWQgb2YgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBBUAotCi0gICAgLy8gbmV3IHRvIGtlZXAgUmFsaW5rIHNwZWNpZmljIGZlYXR1cmUKLSAgICBVTE9ORyAgICAgICAgICAgICAgIEFQUmFsaW5rSWU7Ci0KLSAgICBCU1NfVEFCTEUgICAgICAgICAgIFNzaWRCc3NUYWI7ICAgICAvLyBBUCBsaXN0IGZvciB0aGUgc2FtZSBTU0lECi0gICAgQlNTX1RBQkxFICAgICAgICAgICBSb2FtVGFiOyAgICAgICAgLy8gQVAgbGlzdCBlbGlnaWJsZSBmb3Igcm9hbWluZwotICAgIFVMT05HICAgICAgICAgICAgICAgQnNzSWR4OwotICAgIFVMT05HICAgICAgICAgICAgICAgUm9hbUlkeDsKLQotCUJPT0xFQU4JCQkJQ3VyclJlcUlzRnJvbU5kaXM7Ci0KLSAgICBSQUxJTktfVElNRVJfU1RSVUNUIEJlYWNvblRpbWVyLCBTY2FuVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBdXRoVGltZXI7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCBBc3NvY1RpbWVyLCBSZWFzc29jVGltZXIsIERpc2Fzc29jVGltZXI7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLX0gTUxNRV9BVVgsICpQTUxNRV9BVVg7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FEREJBX1JFUV9TVFJVQ1R7Ci0JVUNIQVIgICBXY2lkOwkvLwotCVVDSEFSICAgcEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIEJhQnVmU2l6ZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCVVDSEFSICAgVElEOwotCVVDSEFSICAgVG9rZW47Ci0JVVNIT1JUCUJhU3RhcnRTZXE7Ci19IE1MTUVfQUREQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0FEREJBX1JFUV9TVFJVQ1Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVMQkFfUkVRX1NUUlVDVHsKLQlVQ0hBUiAgIFdjaWQ7CS8vCi0JVUNIQVIgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgIFRJRDsKLQlVQ0hBUglJbml0aWF0b3I7Ci19IE1MTUVfREVMQkFfUkVRX1NUUlVDVCwgKlBNTE1FX0RFTEJBX1JFUV9TVFJVQ1Q7Ci0KLS8vIGFzc29jIHN0cnVjdCBpcyBlcXVhbCB0byByZWFzc29jCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9BU1NPQ19SRVFfU1RSVUNUewotICAgIFVDSEFSICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgIENhcGFiaWxpdHlJbmZvOwotICAgIFVTSE9SVCAgICBMaXN0ZW5JbnR2OwotICAgIFVMT05HICAgICBUaW1lb3V0OwotfSBNTE1FX0FTU09DX1JFUV9TVFJVQ1QsICpQTUxNRV9BU1NPQ19SRVFfU1RSVUNULCBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfRElTQVNTT0NfUkVRX1NUUlVDVHsKLSAgICBVQ0hBUiAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotICAgIFVTSE9SVCAgICBSZWFzb247Ci19IE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCwgKlBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0FVVEhfUkVRX1NUUlVDVCB7Ci0gICAgVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgQWxnOwotICAgIFVMT05HICAgICAgICBUaW1lb3V0OwotfSBNTE1FX0FVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0FVVEhfUkVRX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01MTUVfREVBVVRIX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgICBBZGRyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgIFJlYXNvbjsKLX0gTUxNRV9ERUFVVEhfUkVRX1NUUlVDVCwgKlBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUxPTkcgICAgICBCc3NJZHg7Ci19IE1MTUVfSk9JTl9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgewotICAgIFVDSEFSICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXTsKLSAgICBVQ0hBUiAgICAgIEJzc1R5cGU7Ci0gICAgVUNIQVIgICAgICBTY2FuVHlwZTsKLSAgICBVQ0hBUiAgICAgIFNzaWRMZW47Ci0gICAgQ0hBUiAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci19IE1MTUVfU0NBTl9SRVFfU1RSVUNULCAqUE1MTUVfU0NBTl9SRVFfU1RSVUNUOwotCi10eXBlZGVmIHN0cnVjdCBfTUxNRV9TVEFSVF9SRVFfU1RSVUNUIHsKLSAgICBDSEFSICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF07Ci0gICAgVUNIQVIgICAgICAgU3NpZExlbjsKLX0gTUxNRV9TVEFSVF9SRVFfU1RSVUNULCAqUE1MTUVfU1RBUlRfUkVRX1NUUlVDVDsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotLy8gc3RydWN0dXJlIGZvciBETFMKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfRExTIHsKLQlVU0hPUlQJCQkJCQlUaW1lT3V0OwkJLy8gVXNlIHRvIHRpbWUgb3V0IHdoaWxlIHNsaWVuY2UsIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQotCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyBVc2UgdG8gdGltZSBvdXQgd2hpbGUgc2xpZW5jZSx1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5Ci0JTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKLQlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKLQlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAkJCVRpbWVyOwkJCS8vIFVzZSB0byB0aW1lIG91dCB3aGlsZSBoYW5kc2hha2UKLQlVU0hPUlQJCQkJCQlTZXF1ZW5jZTsKLQlVU0hPUlQJCQkJCQlNYWNUYWJNYXRjaFdDSUQ7CS8vIEFTSUMKLQlCT09MRUFOCQkJCQkJYkhUQ2FwOwotCVBWT0lECQkJCQkJcEFkOwotfSBSVF84MDJfMTFfRExTLCAqUFJUXzgwMl8xMV9ETFM7Ci0KLXR5cGVkZWYgc3RydWN0IF9NTE1FX0RMU19SRVFfU1RSVUNUIHsKLSAgICBQUlRfODAyXzExX0RMUwlwRExTOwotICAgIFVTSE9SVAkJCVJlYXNvbjsKLX0gTUxNRV9ETFNfUkVRX1NUUlVDVCwgKlBNTE1FX0RMU19SRVFfU1RSVUNUOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotICAgIFVDSEFSICAgRWlkOwotICAgIFVDSEFSICAgTGVuOwotICAgIFVDSEFSICAgT2N0ZXRbMV07Ci19IEVJRF9TVFJVQ1QsKlBFSURfU1RSVUNULCBCRUFDT05fRUlEX1NUUlVDVCwgKlBCRUFDT05fRUlEX1NUUlVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVE1QX1RYX1JBVEVfU1dJVENICi17Ci0JVUNIQVIgICBJdGVtTm87Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVDSEFSCVJzdjI6MjsKLQlVQ0hBUglNb2RlOjI7Ci0JVUNIQVIJUnN2MToxOwotCVVDSEFSCUJXOjE7Ci0JVUNIQVIJU2hvcnRHSToxOwotCVVDSEFSCVNUQkM6MTsKLSNlbHNlCi0JVUNIQVIJU1RCQzoxOwotCVVDSEFSCVNob3J0R0k6MTsKLQlVQ0hBUglCVzoxOwotCVVDSEFSCVJzdjE6MTsKLQlVQ0hBUglNb2RlOjI7Ci0JVUNIQVIJUnN2MjoyOwotI2VuZGlmCi0JVUNIQVIgICBDdXJyTUNTOwotCVVDSEFSICAgVHJhaW5VcDsKLQlVQ0hBUiAgIFRyYWluRG93bjsKLX0gUlJUTVBfVFhfUkFURV9TV0lUQ0gsICpQUlRNUF9UWF9SQVRFX1NXSVRDSDsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gQVAgbWxtZS5oID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSNkZWZpbmUgVEJUVF9QUkVMT0FEX1RJTUUgICAgICAgMzg0ICAgICAgICAvLyB1c2VjLiBMb21nUHJlYW1ibGUgKyAyNC1ieXRlIGF0IDFNYnBzCi0jZGVmaW5lIERFRkFVTFRfRFRJTV9QRVJJT0QgICAgIDEKLQotLy8gd2VpZ2h0aW5nIGZhY3RvciB0byBjYWxjdWxhdGUgQ2hhbm5lbCBxdWFsaXR5LCB0b3RhbCBzaG91bGQgYmUgMTAwJQotLy8jZGVmaW5lIFJTU0lfV0VJR0hUSU5HICAgICAgICAgICAgICAgICAgIDAKLS8vI2RlZmluZSBUWF9XRUlHSFRJTkcgICAgICAgICAgICAgICAgICAgICA0MAotLy8jZGVmaW5lIFJYX1dFSUdIVElORyAgICAgICAgICAgICAgICAgICAgIDYwCi0KLSNkZWZpbmUgTUFDX1RBQkxFX0FHRU9VVF9USU1FCQkJMzAwCQkJLy8gdW5pdDogc2VjCi0jZGVmaW5lIE1BQ19UQUJMRV9BU1NPQ19USU1FT1VUCQkJNQkJCS8vIHVuaXQ6IHNlYwotI2RlZmluZSBNQUNfVEFCTEVfRlVMTChUYWIpCQkJCSgoVGFiKS5zaXplID09IE1BWF9MRU5fT0ZfTUFDX1RBQkxFKQotCi0vLyBBUCBzaGFsbCBkcm9wIHRoZSBzdGEgaWYgY29udGluZSBUeCBmYWlsIGNvdW50IHJlYWNoIGl0LgotI2RlZmluZSBNQUNfRU5UUllfTElGRV9DSEVDS19DTlQJCTIwCQkJLy8gcGFja2V0IGNudC4KLQotLy8gVmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+U3N0Ci10eXBlZGVmIGVudW0gX1NzdCB7Ci0gICAgU1NUX05PVF9BVVRILCAgIC8vIDA6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAxCi0gICAgU1NUX0FVVEgsICAgICAgIC8vIDE6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAyCi0gICAgU1NUX0FTU09DICAgICAgIC8vIDI6IGVxdWl2YWxlbnQgdG8gSUVFRSA4MDIuMTEvMTk5OSBzdGF0ZSAzCi19IFNTVDsKLQotLy8gdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+QXV0aFN0YXRlCi10eXBlZGVmIGVudW0gX0F1dGhTdGF0ZSB7Ci0gICAgQVNfTk9UX0FVVEgsCi0gICAgQVNfQVVUSF9PUEVOLCAgICAgICAvLyBTVEEgaGFzIGJlZW4gYXV0aGVudGljYXRlZCB1c2luZyBPUEVOIFNZU1RFTQotICAgIEFTX0FVVEhfS0VZLCAgICAgICAgLy8gU1RBIGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQgdXNpbmcgU0hBUkVEIEtFWQotICAgIEFTX0FVVEhFTlRJQ0FUSU5HICAgLy8gU1RBIGlzIHdhaXRpbmcgZm9yIEFVVEggc2VxIzMgdXNpbmcgU0hBUkVEIEtFWQotfSBBVVRIX1NUQVRFOwotCi0vL2Zvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX0FwV3BhU3RhdGUgewotICAgIEFTX05PVFVTRSwgICAgICAgICAgICAgIC8vIDAKLSAgICBBU19ESVNDT05ORUNULCAgICAgICAgICAvLyAxCi0gICAgQVNfRElTQ09OTkVDVEVELCAgICAgICAgLy8gMgotICAgIEFTX0lOSVRJQUxJWkUsICAgICAgICAgIC8vIDMKLSAgICBBU19BVVRIRU5USUNBVElPTiwgICAgICAvLyA0Ci0gICAgQVNfQVVUSEVOVElDQVRJT04yLCAgICAgLy8gNQotICAgIEFTX0lOSVRQTUssICAgICAgICAgICAgIC8vIDYKLSAgICBBU19JTklUUFNLLCAgICAgICAgICAgICAvLyA3Ci0gICAgQVNfUFRLU1RBUlQsICAgICAgICAgICAgLy8gOAotICAgIEFTX1BUS0lOSVRfTkVHT1RJQVRJTkcsIC8vIDkKLSAgICBBU19QVEtJTklURE9ORSwgICAgICAgICAvLyAxMAotICAgIEFTX1VQREFURUtFWVMsICAgICAgICAgIC8vIDExCi0gICAgQVNfSU5URUdSSVRZX0ZBSUxVUkUsICAgLy8gMTIKLSAgICBBU19LRVlVUERBVEUsICAgICAgICAgICAvLyAxMwotfSBBUF9XUEFfU1RBVEU7Ci0KLS8vIGZvci13cGEgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX0dUS1N0YXRlIHsKLSAgICBSRUtFWV9ORUdPVElBVElORywKLSAgICBSRUtFWV9FU1RBQkxJU0hFRCwKLSAgICBLRVlFUlJPUiwKLX0gR1RLX1NUQVRFOwotCi0vLyAgZm9yLXdwYSAgdmFsdWUgZG9tYWluIG9mIHBNYWNFbnRyeS0+V3BhU3RhdGUgIDgwMi4xaSBEMyAgIHAuMTE0Ci10eXBlZGVmIGVudW0gX1dwYUdUS1N0YXRlIHsKLSAgICBTRVRLRVlTLAotICAgIFNFVEtFWVNfRE9ORSwKLX0gV1BBX0dUS19TVEFURTsKLS8vID09PT09PT09PT09PT09PT09PT09PT0gZW5kIG9mIEFQIG1sbWUuaCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotI2VuZGlmCS8vIE1MTUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL21sbWVfZXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U5NGRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBtbG1lX2V4LmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGb25jaGkJCTIwMDctMDYtMjUJCUV4dGVuZCBvcmlnaW5hbCBtbG1lIEFQSXMgdG8gc3VwcG9ydCBtdWx0aS1lbnRyaWVzCi0qLwotI2lmbmRlZiBfX01MTUVfRVhfSF9fCi0jZGVmaW5lIF9fTUxNRV9FWF9IX18KLQotI2luY2x1ZGUgIm1sbWVfZXhfZGVmLmgiCi0KLQotVk9JRCBTdGF0ZU1hY2hpbmVJbml0RXgoCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggVHJhbnNbXSwKLQlJTiBVTE9ORyBTdE5yLAotCUlOIFVMT05HIE1zZ05yLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQ19FWCBEZWZGdW5jLAotCUlOIFVMT05HIEluaXRTdGF0ZSwKLQlJTiBVTE9ORyBCYXNlKTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVTZXRBY3Rpb25FeCgKLQlJTiBTVEFURV9NQUNISU5FX0VYICpTLAotCUlOIFVMT05HIFN0LAotCUlOIFVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkNfRVggRnVuYyk7Ci0KLUJPT0xFQU4gaXNWYWxpZEFwQ2xpSWYoCi0JU0hPUlQgSWR4KTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVQZXJmb3JtQWN0aW9uRXgoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORV9FWCAqUywKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sCi0JVVNIT1JUIElkeCwKLQlQVUxPTkcgcEN1cnJTdGF0ZSk7Ci0KLUJPT0xFQU4gTWxtZUVucXVldWVFeCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyBNYWNoaW5lLAotCUlOIFVMT05HIE1zZ1R5cGUsCi0JSU4gVUxPTkcgTXNnTGVuLAotCUlOIFZPSUQgKk1zZywKLQlJTiBVU0hPUlQgSWR4KTsKLQotVk9JRCBEcm9wRXgoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtLAotCVBVTE9ORyBwQ3VyclN0YXRlLAotCVVTSE9SVCBJZHgpOwotCi0jZW5kaWYgLyogX19NTE1FX0VYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lX2V4X2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9tbG1lX2V4X2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q2MGI0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbWxtZV9leF9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgbWxtZV9leF9kZWYuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgZ2VuZXJpYyBwb3J0aW9uIGhlYWRlciBmaWxlCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaQkJMjAwNy0wNi0yNQkJRXh0ZW5kIG9yaWdpbmFsIG1sbWUgQVBJcyB0byBzdXBwb3J0IG11bHRpLWVudHJpZXMKLSovCi0jaWZuZGVmIF9fTUxNRV9FWF9ERUZfSF9fCi0jZGVmaW5lIF9fTUxNRV9FWF9ERUZfSF9fCi0KLQotdHlwZWRlZiBWT0lEICgqU1RBVEVfTUFDSElORV9GVU5DX0VYKShWT0lEICpBZGFwdG9yLCBNTE1FX1FVRVVFX0VMRU0gKkVsZW0sIFBVTE9ORyBwQ3VyclN0YXRlLCBVU0hPUlQgSWR4KTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9TVEFURV9NQUNISU5FX0VYCi17Ci0JVUxPTkcJCQkJCUJhc2U7Ci0JVUxPTkcJCQkJCU5yU3RhdGU7Ci0JVUxPTkcJCQkJCU5yTXNnOwotCVVMT05HCQkJCQlDdXJyU3RhdGU7Ci0JU1RBVEVfTUFDSElORV9GVU5DX0VYCSpUcmFuc0Z1bmM7Ci19IFNUQVRFX01BQ0hJTkVfRVgsICpQU1RBX1NUQVRFX01BQ0hJTkVfRVg7Ci0KLSNlbmRpZiAvLyBfX01MTUVfRVhfREVGX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9uZXRpZl9ibG9jay5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9uZXRpZl9ibG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc1Mzg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvbmV0aWZfYmxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19ORVRfSUZfQkxPQ0tfSF9fCi0jZGVmaW5lIF9fTkVUX0lGX0JMT0NLX0hfXwotCi0jaW5jbHVkZSAibGlua19saXN0LmgiCi0jaW5jbHVkZSAicnRtcC5oIgotCi0jZGVmaW5lIEZSRUVfTkVUSUZfUE9PTF9TSVpFIDMyCi0KLXR5cGVkZWYgc3RydWN0IF9ORVRJRl9FTlRSWQotewotCXN0cnVjdCBfTkVUSUZfRU5UUlkgKnBOZXh0OwotCVBORVRfREVWIHBOZXREZXY7Ci19IE5FVElGX0VOVFJZLCAqUE5FVElGX0VOVFJZOwotCi12b2lkIGluaXRibG9ja1F1ZXVlVGFiKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBibG9ja05ldElmKAotCUlOIFBCTE9DS19RVUVVRV9FTlRSWSBwQmxvY2tRdWV1ZUVudHJ5LAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1WT0lEIHJlbGVhc2VOZXRJZigKLQlJTiBQQkxPQ0tfUVVFVUVfRU5UUlkgcEJsb2NrUXVldWVFbnRyeSk7Ci0KLVZPSUQgU3RvcE5ldElmUXVldWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVCBwUGFja2V0KTsKLSNlbmRpZiAvLyBfX05FVF9JRl9CTE9DS19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvb2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL29pZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWE0MzQwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvb2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jb2lkLmgKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlOYW1lCQlEYXRlCQkJTW9kaWZpY2F0aW9uIGxvZ3MKLSovCi0jaWZuZGVmIF9PSURfSF8KLSNkZWZpbmUgX09JRF9IXwotCi0vLyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRQkJCQkxCi0jZW5kaWYKLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UJCQkJMAotI2VuZGlmCi0vLwotLy8gSUVFRSA4MDIuMTEgU3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKLS8vCi0jZGVmaW5lIE1BWF9UWF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgMTAwICAgLyogbVcgKi8KLSNkZWZpbmUgTUFYX1JTU0lfVFJJR0dFUiAgICAgICAgICAgICAgICAtMTAgICAgLyogZEJtICovCi0jZGVmaW5lIE1JTl9SU1NJX1RSSUdHRVIgICAgICAgICAgICAgICAgLTIwMCAgIC8qIGRCbSAqLwotI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgICAgICAgICAgIDIzNDYgIC8qIGJ5dGUgY291bnQgKi8KLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAgICAgICAgICAyNTYgICAvKiBieXRlIGNvdW50ICovCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAgMjM0NyAgLyogYnl0ZSBjb3VudCAqLwotCi0vLyBuZXcgdHlwZXMgZm9yIE1lZGlhIFNwZWNpZmljIEluZGljYXRpb25zCi0vLyBFeHRlbnNpb24gY2hhbm5lbCBvZmZzZXQKLSNkZWZpbmUgRVhUQ0hBX05PTkUJCQkwCi0jZGVmaW5lIEVYVENIQV9BQk9WRQkJMHgxCi0jZGVmaW5lIEVYVENIQV9CRUxPVwkJMHgzCi0KLS8vIEJXCi0jZGVmaW5lIEJBTkRfV0lEVEhfMjAJCTAKLSNkZWZpbmUgQkFORF9XSURUSF80MAkJMQotI2RlZmluZSBCQU5EX1dJRFRIX0JPVEgJCTIKLSNkZWZpbmUgQkFORF9XSURUSF8xMAkJMwkvLyA4MDIuMTFqIGhhcyAxME1Iei4gVGhpcyBkZWZpbml0aW9uIGlzIGZvciBpbnRlcm5hbCB1c2FnZS4gZG9lc24ndCBmaWxsIGluIHRoZSBJRSBvciBvdGhlciBmaWVsZC4KLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0FQX0lOVEVSVkFMXzQwMAkxCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCi0jZGVmaW5lIEdBUF9JTlRFUlZBTF84MDAJMAotI2RlZmluZSBHQVBfSU5URVJWQUxfQk9USAkyCi0KLSNkZWZpbmUgTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQJCQkxCi0jZGVmaW5lIE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkCQkwCi0KLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1NTSUQgICAgICAgICAzMgotI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVMgICAgICAgIDgKLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYICAgICAxNgotI2RlZmluZSBNQUNfQUREUl9MRU5HVEggICAgICAgICAgICAgICAgIDYKLS8vI2RlZmluZSBNQVhfTlVNX09GX0NIUwkJCQkJNDkgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb25jCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQ0hTCQkJCTU0ICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSShsb3dlci9taWRkbGUpICsgMTZASGlwZXJMQU4yICsgMTFAVU5JSSh1cHBlcikgKyAwIEBKYXBhbiArIDEgYXMgTlVMTCB0ZXJtaW5hdGlvbgotI2RlZmluZSBNQVhfTlVNQkVSX09GX0VWRU5UCQkJCTEwICAvLyBlbnRyeSAjIGluIEVWRU5UIHRhYmxlCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfTUFDCQkJCTMyIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCi0jZGVmaW5lIE1BWF9OVU1CRVJfT0ZfQUNMCQkJCTY0Ci0jZGVmaW5lIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUwkJMTIgICAgLy8gMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NAotI2RlZmluZSBNQVhfTlVNQkVSX09GX0RMU19FTlRSWQkJCTQKLQotCi0jZGVmaW5lIFJUX1FVRVJZX1NJR05BTF9DT05URVhUCQkJCTB4MDQwMgotI2RlZmluZSBSVF9TRVRfSUFQUF9QSUQJCQkJMHgwNDA0Ci0jZGVmaW5lIFJUX1NFVF9BUERfUElECQkJCQkJMHgwNDA1Ci0jZGVmaW5lIFJUX1NFVF9ERUxfTUFDX0VOVFJZCQkJCTB4MDQwNgotI2RlZmluZSBSVF9RVUVSWV9FVkVOVF9UQUJMRQkJCTB4MDQwNwotLy8KLS8vIElFRUUgODAyLjExIE9JRHMKLS8vCi0jZGVmaW5lCU9JRF9HRVRfU0VUX1RPR0dMRQkJCTB4ODAwMAotI2RlZmluZQlPSURfR0VUX1NFVF9GUk9NX1VJCQkJMHg0MDAwCi0KLSNkZWZpbmUJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVTX1NVUFBPUlRFRAkJCTB4MDEwMwotI2RlZmluZQlPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJCQkJMHgwMTA0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUlNTSV9UUklHR0VSCQkJCQkJMHgwMTA3Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSQkJCQkJCQkweDAxMDggLy9ydDI4NjAJb25seSAsIGthdGh5Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlNTSV8xCQkJCQkJMHgwMTA5IC8vcnQyODYwCW9ubHkgLCBrYXRoeQotI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfMgkJCQkJCTB4MDEwQSAvL3J0Mjg2MAlvbmx5ICwga2F0aHkKLSNkZWZpbmUJT0lEXzgwMl8xMV9OVU1CRVJfT0ZfQU5URU5OQVMJCQkJMHgwMTBCCi0jZGVmaW5lCU9JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkJCQkweDAxMEMKLSNkZWZpbmUJT0lEXzgwMl8xMV9UWF9BTlRFTk5BX1NFTEVDVEVECQkJCTB4MDEwRAotI2RlZmluZQlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUwkJCQkJMHgwMTBFCi0jZGVmaW5lCU9JRF84MDJfMTFfQUREX1dFUAkJCQkJCQkweDAxMTIKLSNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfV0VQCQkJCQkJMHgwMTEzCi0jZGVmaW5lCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFCQkJCQkJMHgwMTE0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUFJJVkFDWV9GSUxURVIJCQkJCTB4MDExOAotI2RlZmluZQlPSURfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OCQkJMHgwMTFFCi0jZGVmaW5lCU9JRF84MDJfMTFfVEVTVAkJCQkJCQkJMHgwMTFGCi0KLQotI2RlZmluZQlSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OCQkJCTB4MDUwNwotI2RlZmluZQlPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJCQkJMHgwNTA4Ci0jZGVmaW5lCU9JRF84MDJfMTFfU1NJRAkJCQkJCQkJMHgwNTA5Ci0jZGVmaW5lCU9JRF84MDJfMTFfQlNTSUQJCQkJCQkJMHgwNTBBCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkFESU8JCQkJCQkJMHgwNTBCCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUEhZX01PREUJCQkJCQkweDA1MEMKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHCQkJCQkweDA1MEQKLSNkZWZpbmUJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJCQkweDA1MEUKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9QUkVBTUJMRQkJCQkJCTB4MDUwRgotI2RlZmluZQlPSURfODAyXzExX1dFUF9TVEFUVVMJCQkJCQkweDA1MTAKLSNkZWZpbmUJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFCQkJCTB4MDUxMQotI2RlZmluZQlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUJCQkJMHgwNTEyCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkVTRVRfQ09VTlRFUlMJCQkJMHgwNTEzCi0jZGVmaW5lCU9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRAkJCQkJMHgwNTE0Ci0jZGVmaW5lCU9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQJCQkweDA1MTUKLSNkZWZpbmUJT0lEXzgwMl8xMV9QT1dFUl9NT0RFCQkJCQkJMHgwNTE2Ci0jZGVmaW5lCU9JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUwJCQkJCTB4MDUxNwotI2RlZmluZQlSVF9PSURfODAyXzExX0FERF9XUEEJCQkJCQkweDA1MTgKLSNkZWZpbmUJT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJCQkJMHgwNTE5Ci0jZGVmaW5lCU9JRF84MDJfMTFfQUREX0tFWQkJCQkJCQkweDA1MjAKLSNkZWZpbmUJT0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OCQkJCQkweDA1MjEKLSNkZWZpbmUJT0lEXzgwMl8xMV9UWF9QQUNLRVRfQlVSU1QJCQkJCTB4MDUyMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMCQkJCTB4MDUyMwotI2RlZmluZQlSVF9PSURfODAyXzExX0VYVFJBX0lORk8JCQkJCTB4MDUyNAotI2lmZGVmCURCRwotI2RlZmluZQlSVF9PSURfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSCQkJCTB4MDUyNQotI2VuZGlmCi0jZGVmaW5lIE9JRF84MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgICAgICAgICAgICBPSURfODAyXzExX1dFUF9TVEFUVVMKLSNkZWZpbmUgT0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAweDA1MjYKLSNkZWZpbmUgT0lEXzgwMl8xMV9EUk9QX1VORU5DUllQVEVEICAgICAgICAgICAgICAgICAweDA1MjcKLSNkZWZpbmUgT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUgICAgICAgICAweDA1MjgKLSNkZWZpbmUgT0lEXzgwMl8xMV9FQVBfTUVUSE9ECQkJCQkJMHgwNTI5Ci0KLS8vIEZvciA4MDIuMXggZGFlbWluIHVzaW5nIHRvIHJlcXVpcmUgY3VycmVudCBkcml2ZXIgY29uZmlndXJhdGlvbgotI2RlZmluZSBPSURfODAyXzExX1JBRElVU19RVUVSWV9TRVRUSU5HCQkJCTB4MDU0MAotCi0jZGVmaW5lCVJUX09JRF9ERVZJQ0VfTkFNRQkJCQkJCQkweDA2MDcKLSNkZWZpbmUJUlRfT0lEX1ZFUlNJT05fSU5GTwkJCQkJCQkweDA2MDgKLSNkZWZpbmUJT0lEXzgwMl8xMV9CU1NJRF9MSVNUCQkJCQkJMHgwNjA5Ci0jZGVmaW5lCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MJCQkJCTB4MDYwQQotI2RlZmluZQlPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTCQkJCTB4MDYwQgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTCQkJCTB4MDYwQwotI2RlZmluZQlPSURfODAyXzExX1JTU0kJCQkJCQkJCTB4MDYwRAotI2RlZmluZQlPSURfODAyXzExX1NUQVRJU1RJQ1MJCQkJCQkweDA2MEUKLSNkZWZpbmUJT0lEX0dFTl9SQ1ZfT0sJCQkJCQkJCTB4MDYwRgotI2RlZmluZQlPSURfR0VOX1JDVl9OT19CVUZGRVIJCQkJCQkweDA2MTAKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9FRVBST01fVkVSU0lPTgkJCTB4MDYxMQotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0ZJUk1XQVJFX1ZFUlNJT04JCTB4MDYxMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfUlhfUkFURQkJCTB4MDYxMwotI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMXzEJCQkJMHgwNjE0Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfUElEVklECQkJCQkweDA2MTUKLS8vZm9yIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNkZWZpbmUgT0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgICAgICAgICAgICAgICAgICAgICAweDA2MTYKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICAgICAgICAgICAgICAgICAgICAweDA2MTcKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICAgICAgICAweDA2MTgKLSNkZWZpbmUgT0lEXzgwMl8xMV9QTUtJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjAKLSNkZWZpbmUgUlRfT0lEX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgICAgICAgICAgICAgICAweDA2MjEKLSNkZWZpbmUgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQgICAgICAgICAgICAgICAgICAweDA2MjIKLSNkZWZpbmUgUlRfT0lEX05FV19EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2MjMKLQotI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8wCQkJCQkJCTB4MDYzMAotI2RlZmluZQlSVF9PSURfODAyXzExX1NOUl8xCQkJCQkJCTB4MDYzMQotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0xBU1RfVFhfUkFURQkJCTB4MDYzMgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0hUX1BIWU1PREUJCQkJMHgwNjMzCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0hUX1BIWU1PREUJCQkJMHgwNjM0Ci0jZGVmaW5lCU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTCQkJCQkweDA2MzUKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkcJCQkweDA2MzYKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HCQkJCTB4MDYzNwotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0FQU0RfUFNNCQkJCTB4MDYzOAotI2RlZmluZQlSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTQkJCQkJMHgwNjM5Ci0jZGVmaW5lCVJUX09JRF84MDJfMTFfUVVFUllfRExTCQkJCQkJMHgwNjNBCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU0VUX0RMUwkJCQkJCTB4MDYzQgotI2RlZmluZQlSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTQkJCQkweDA2M0MKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TRVRfRExTX1BBUkFNCQkJCQkweDA2M0QKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU0JCQkJMHgwNjNFCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfU0VUX1dNTQkJCQkJCTB4MDYzRgotI2RlZmluZSBSVF9PSURfODAyXzExX1FVRVJZX0lNTUVfQkFfQ0FQCQkJCTB4MDY0MAotI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUAkJCQkweDA2NDEKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9CQVRBQkxFCQkJCQkweDA2NDIKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQQkJCQkJMHgwNjQzCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBCQkJCQkweDA2NDQKLSNkZWZpbmUgUlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSAgICAgICAgICAgICAgICAgICAweDA2NDUKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9RVUVSWV9EQVRfSFRfUEhZTU9ERSAgICAgICAgICAweDA2NDYKLSNkZWZpbmUgUlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCAgICAgICAgICAweDA2NDcKLSNkZWZpbmUgT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERQkJCQkweDA2NDgKLS8qKysrIGFkZCBieSB3b29keSArKysqLwotI2RlZmluZSBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFCQkJCTB4MDY0OQotLy8gUmFsaW5rIGRlZmluZWQgT0lEcwotLy8gRGVubmlzIExlZSBtb3ZlIHRvIHBsYXRmb3JtIHNwZWNpZmljCi0KLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9CU1NJRAkJCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRCkKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9TU0lECQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NTSUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfSU5GUkFTVFJVQ1RVUkVfTU9ERQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX1dFUAkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9XRVApCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfQUREX0tFWQkJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0FERF9LRVkpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUkVNT1ZFX1dFUAkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVNT1ZFX1dFUCkKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRU1PVkVfS0VZCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9SRU1PVkVfS0VZKQotI2RlZmluZQlSVF9PSURfODAyXzExX0RJU0FTU09DSUFURQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfRElTQVNTT0NJQVRFKQotI2RlZmluZQlSVF9PSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKQotI2RlZmluZQlSVF9PSURfODAyXzExX1BSSVZBQ1lfRklMVEVSCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1BSSVZBQ1lfRklMVEVSKQotI2RlZmluZQlSVF9PSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTgkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4pCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfV0VQX1NUQVRVUwkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfV0VQX1NUQVRVUykKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9SRUxPQURfREVGQVVMVFMJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUkVMT0FEX0RFRkFVTFRTKQotI2RlZmluZQlSVF9PSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ORVRXT1JLX1RZUEVfSU5fVVNFKQotI2RlZmluZQlSVF9PSURfODAyXzExX1RYX1BPV0VSX0xFVkVMCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMKQotI2RlZmluZQlSVF9PSURfODAyXzExX1JTU0lfVFJJR0dFUgkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUlNTSV9UUklHR0VSKQotI2RlZmluZQlSVF9PSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKQotI2RlZmluZQlSVF9PSURfODAyXzExX1JUU19USFJFU0hPTEQJCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JUU19USFJFU0hPTEQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUlhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1JYX0FOVEVOTkFfU0VMRUNURUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfVFhfQU5URU5OQV9TRUxFQ1RFRAkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1RYX0FOVEVOTkFfU0VMRUNURUQpCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfU1VQUE9SVEVEX1JBVEVTCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX1NVUFBPUlRFRF9SQVRFUykKLSNkZWZpbmUJUlRfT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTKQotI2RlZmluZQlSVF9PSURfODAyXzExX0NPTkZJR1VSQVRJT04JCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfAlPSURfODAyXzExX0NPTkZJR1VSQVRJT04pCi0jZGVmaW5lCVJUX09JRF84MDJfMTFfUE9XRVJfTU9ERQkJCSAgKE9JRF9HRVRfU0VUX1RPR0dMRSB8CU9JRF84MDJfMTFfUE9XRVJfTU9ERSkKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwJT0lEXzgwMl8xMV9TRVRfUFNQWExJTktfTU9ERSkKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9FQVBfTUVUSE9ECQkJICAoT0lEX0dFVF9TRVRfVE9HR0xFIHwgT0lEXzgwMl8xMV9FQVBfTUVUSE9EKQotI2RlZmluZSBSVF9PSURfODAyXzExX1NFVF9QQVNTUEhSQVNFCQkgIChPSURfR0VUX1NFVF9UT0dHTEUgfCBPSURfODAyXzExX1NFVF9QQVNTUEhSQVNFKQotCi0KLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9TVEFUVVNfVFlQRQotewotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX0F1dGhlbnRpY2F0aW9uLAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlX01lZGlhU3RyZWFtTW9kZSwKLSAgICBOZGlzODAyXzExU3RhdHVzVHlwZV9QTUtJRF9DYW5kaWRhdGVMaXN0LAotICAgIE5kaXM4MDJfMTFTdGF0dXNUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAotfSBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSwgKlBORElTXzgwMl8xMV9TVEFUVVNfVFlQRTsKLQotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTWzZdOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfU1RBVFVTX0lORElDQVRJT04KLXsKLSAgICBORElTXzgwMl8xMV9TVEFUVVNfVFlQRSBTdGF0dXNUeXBlOwotfSBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTiwgKlBORElTXzgwMl8xMV9TVEFUVVNfSU5ESUNBVElPTjsKLQotLy8gbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcwotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIDB4MGYKLQotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRIICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0tFWVVQREFURSAgICAgICAgICAweDAyCi0jZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUiAgICAgMHgwNgotI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfR1JPVVBfRVJST1IgICAgICAgIDB4MEUKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QKLXsKLSAgICBVTE9ORyBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOwotICAgIFVMT05HIEZsYWdzOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNULCAqUE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1Q7Ci0KLS8vQWRkZWQgbmV3IHR5cGVzIGZvciBQTUtJRCBDYW5kaWRhdGUgbGlzdHMuCi10eXBlZGVmIHN0cnVjdCBfUE1LSURfQ0FORElEQVRFIHsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVTE9ORyBGbGFnczsKLX0gUE1LSURfQ0FORElEQVRFLCAqUFBNS0lEX0NBTkRJREFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BNS0lEX0NBTkRJREFURV9MSVNUCi17Ci0gICAgVUxPTkcgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlCi0gICAgVUxPTkcgTnVtQ2FuZGlkYXRlczsgLy8gTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMKLSAgICBQTUtJRF9DQU5ESURBVEUgQ2FuZGlkYXRlTGlzdFsxXTsKLX0gTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1QsICpQTkRJU184MDJfMTFfUE1LSURfQ0FORElEQVRFX0xJU1Q7Ci0KLS8vRmxhZ3MgZm9yIFBNS0lEIENhbmRpZGF0ZSBsaXN0IHN0cnVjdHVyZQotI2RlZmluZSBORElTXzgwMl8xMV9QTUtJRF9DQU5ESURBVEVfUFJFQVVUSF9FTkFCTEVECTB4MDEKLQotLy8gQWRkZWQgbmV3IHR5cGVzIGZvciBPRkRNIDVHIGFuZCAyLjRHCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfVFlQRQotewotICAgTmRpczgwMl8xMUZILAotICAgTmRpczgwMl8xMURTLAotICAgIE5kaXM4MDJfMTFPRkRNNSwKLSAgICBOZGlzODAyXzExT0ZETTI0LAotCU5kaXM4MDJfMTFBdXRvbW9kZSwKLSAgICBOZGlzODAyXzExT0ZETTVfTiwKLSAgICBOZGlzODAyXzExT0ZETTI0X04sCi0gICAgTmRpczgwMl8xMU5ldHdvcmtUeXBlTWF4ICAgIC8vIG5vdCBhIHJlYWwgdHlwZSwgZGVmaW5lZCBhcyBhbiB1cHBlciBib3VuZAotfSBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QKLXsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkl0ZW1zOyAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgIE5ldHdvcmtUeXBlIFsxXTsKLX0gTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1QsICpQTkRJU184MDJfMTFfTkVUV09SS19UWVBFX0xJU1Q7Ci0KLXR5cGVkZWYgZW51bSBfTkRJU184MDJfMTFfUE9XRVJfTU9ERQotewotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVDQU0sCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1AsCi0gICAgTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQLAotICAgIE5kaXM4MDJfMTFQb3dlck1vZGVNYXggICAgICAvLyBub3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgYW4gdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfUE9XRVJfTU9ERSwgKlBORElTXzgwMl8xMV9QT1dFUl9NT0RFOwotCi10eXBlZGVmIFVMT05HICAgTkRJU184MDJfMTFfVFhfUE9XRVJfTEVWRUw7IC8vIGluIG1pbGxpd2F0dHMKLQotLy8KLS8vIFJlY2VpdmVkIFNpZ25hbCBTdHJlbmd0aCBJbmRpY2F0aW9uCi0vLwotdHlwZWRlZiBMT05HICAgIE5ESVNfODAyXzExX1JTU0k7ICAgICAgICAgICAvLyBpbiBkQm0KLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkgKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHN0cnVjdHVyZQotICAgVUxPTkcgICAgICAgICAgIEhvcFBhdHRlcm47ICAgICAgICAvLyBBcyBkZWZpbmVkIGJ5IDgwMi4xMSwgTVNCIHNldAotICAgVUxPTkcgICAgICAgICAgIEhvcFNldDsgICAgICAgICAgICAvLyB0byBvbmUgaWYgbm9uLTgwMi4xMQotICAgVUxPTkcgICAgICAgICAgIER3ZWxsVGltZTsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLX0gTkRJU184MDJfMTFfQ09ORklHVVJBVElPTl9GSCwgKlBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OX0ZIOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ09ORklHVVJBVElPTgotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhY29uUGVyaW9kOyAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRJTVdpbmRvdzsgICAgICAgICAvLyB1bml0cyBhcmUgS3VzZWMKLSAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNDb25maWc7ICAgICAgICAgICAvLyBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHoKLSAgIE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT05fRkggICAgRkhDb25maWc7Ci19IE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04sICpQTkRJU184MDJfMTFfQ09ORklHVVJBVElPTjsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1NUQVRJU1RJQ1MKLXsKLSAgIFVMT05HICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiBzdHJ1Y3R1cmUKLSAgIExBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZhaWxlZENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgTXVsdGlwbGVSZXRyeUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFJUU1N1Y2Nlc3NDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgQUNLRmFpbHVyZUNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIEZyYW1lRHVwbGljYXRlQ291bnQ7Ci0gICBMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudDsKLSAgIExBUkdFX0lOVEVHRVIgICBGQ1NFcnJvckNvdW50OwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBMb2NhbE1JQ0ZhaWx1cmVzOwotICAgTEFSR0VfSU5URUdFUiAgIFRLSVBSZW1vdGVNSUNFcnJvcnM7Ci0gICBMQVJHRV9JTlRFR0VSICAgVEtJUElDVkVycm9yczsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQQ291bnRlck1lYXN1cmVzSW52b2tlZDsKLSAgIExBUkdFX0lOVEVHRVIgICBUS0lQUmVwbGF5czsKLSAgIExBUkdFX0lOVEVHRVIgICBDQ01QRm9ybWF0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBSZXBsYXlzOwotICAgTEFSR0VfSU5URUdFUiAgIENDTVBEZWNyeXB0RXJyb3JzOwotICAgTEFSR0VfSU5URUdFUiAgIEZvdXJXYXlIYW5kc2hha2VGYWlsdXJlczsKLX0gTkRJU184MDJfMTFfU1RBVElTVElDUywgKlBORElTXzgwMl8xMV9TVEFUSVNUSUNTOwotCi10eXBlZGVmICBVTE9ORyAgTkRJU184MDJfMTFfS0VZX0lOREVYOwotdHlwZWRlZiBVTE9OR0xPTkcgICBORElTXzgwMl8xMV9LRVlfUlNDOwotCi0jZGVmaW5lIE1BWF9SQURJVVNfU1JWX05VTQkJCTIJICAvLyA4MDIuMXggZmFpbG92ZXIgbnVtYmVyCi0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX1NSVl9JTkZPIHsKLQlVSU5UMzIJCQlyYWRpdXNfaXA7Ci0JVUlOVDMyCQkJcmFkaXVzX3BvcnQ7Ci0JVUNIQVIJCQlyYWRpdXNfa2V5WzY0XTsKLQlVQ0hBUgkJCXJhZGl1c19rZXlfbGVuOwotfSBSQURJVVNfU1JWX0lORk8sICpQUkFESVVTX1NSVl9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JBRElVU19LRVlfSU5GTwotewotCVVDSEFSCQkJcmFkaXVzX3Nydl9udW07Ci0JUkFESVVTX1NSVl9JTkZPCXJhZGl1c19zcnZfaW5mb1tNQVhfUkFESVVTX1NSVl9OVU1dOwotCVVDSEFSCQkJaWVlZTgwMjF4V0VQOwkJIC8vIGR5bmFtaWMgV0VQCi0gICAgVUNIQVIgICAgICAgICAgIGtleV9pbmRleDsKLSAgICBVQ0hBUiAgICAgICAgICAga2V5X2xlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIFVDSEFSICAgICAgICAgICBrZXlfbWF0ZXJpYWxbMTNdOwotfSBSQURJVVNfS0VZX0lORk8sICpQUkFESVVTX0tFWV9JTkZPOwotCi0vLyBJdCdzIHVzZWQgYnkgODAyLjF4IGRhZW1vbiB0byByZXF1aXJlIHJlbGF0aXZlIGNvbmZpZ3VyYXRpb24KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUkFESVVTX0NPTkYKLXsKLSAgICBVSU5UMzIgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUKLSAgICBVQ0hBUgkJCW1ic3NfbnVtOwkJCS8vIGluZGljYXRlIG11bHRpcGxlIEJTUyBudW1iZXIKLQlVSU5UMzIJCQlvd25faXBfYWRkcjsKLQlVSU5UMzIJCQlyZXRyeV9pbnRlcnZhbDsKLQlVSU5UMzIJCQlzZXNzaW9uX3RpbWVvdXRfaW50ZXJ2YWw7Ci0JVUNIQVIJCQlFQVBpZm5hbWVbOF1bSUZOQU1TSVpdOwotCVVDSEFSCQkJRUFQaWZuYW1lX2xlbls4XTsKLQlVQ0hBUgkJCVByZUF1dGhpZm5hbWVbOF1bSUZOQU1TSVpdOwotCVVDSEFSCQkJUHJlQXV0aGlmbmFtZV9sZW5bOF07Ci0JUkFESVVTX0tFWV9JTkZPCVJhZGl1c0luZm9bOF07Ci19IFJBRElVU19DT05GLCAqUFJBRElVU19DT05GOwotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIFVJTlQgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotICAgIE5ESVNfODAyXzExX0tFWV9SU0MgS2V5UlNDOwotICAgIFVDSEFSICAgICAgICAgICBLZXlNYXRlcmlhbFsxXTsgICAgIC8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKLX0gTkRJU184MDJfMTFfS0VZLCAqUE5ESVNfODAyXzExX0tFWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1BBU1NQSFJBU0UKLXsKLSAgICBVSU5UICAgICAgICAgICBLZXlMZW5ndGg7ICAgICAgICAgIC8vIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBVQ0hBUiAgICAgICAgICAgS2V5TWF0ZXJpYWxbMV07ICAgICAvLyB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkCi19IE5ESVNfODAyXzExX1BBU1NQSFJBU0UsICpQTkRJU184MDJfMTFfUEFTU1BIUkFTRTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotdHlwZWRlZiBzdHJ1Y3QgX05ESVNfODAyXzExX1JFTU9WRV9LRVkKLXsKLSAgICBVSU5UICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIFVJTlQgICAgICAgICAgIEtleUluZGV4OwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJTU0lEOwotfSBORElTXzgwMl8xMV9SRU1PVkVfS0VZLCAqUE5ESVNfODAyXzExX1JFTU9WRV9LRVk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9XRVAKLXsKLSAgIFVJTlQgICAgIExlbmd0aDsgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgVUlOVCAgICAgS2V5SW5kZXg7ICAgICAgICAgICAvLyAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwgMS1OIGFyZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwga2V5cwotICAgVUlOVCAgICAgS2V5TGVuZ3RoOyAgICAgLy8gbGVuZ3RoIG9mIGtleSBpbiBieXRlcwotICAgVUNIQVIgICAgIEtleU1hdGVyaWFsWzFdOy8vIHZhcmlhYmxlIGxlbmd0aCBkZXBlbmRpbmcgb24gYWJvdmUgZmllbGQKLX0gTkRJU184MDJfMTFfV0VQLCAqUE5ESVNfODAyXzExX1dFUDsKLQotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUKLXsKLSAgIE5kaXM4MDJfMTFJQlNTLAotICAgTmRpczgwMl8xMUluZnJhc3RydWN0dXJlLAotICAgTmRpczgwMl8xMUF1dG9Vbmtub3duLAotICAgTmRpczgwMl8xMU1vbml0b3IsCi0gICBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXggICAgIC8vIE5vdCBhIHJlYWwgdmFsdWUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSwgKlBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFOwotCi0vLyBBZGQgbmV3IGF1dGhlbnRpY2F0aW9uIG1vZGVzCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUKLXsKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZU9wZW4sCi0gICBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCi0gICBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAotICAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKLSAgICBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCi0gICAgTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKLSAgIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIsCi0gICBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFXUEEyLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTFQU0tXUEEyUFNLLAotICAgTmRpczgwMl8xMUF1dGhNb2RlTWF4ICAgICAgICAgICAvLyBOb3QgYSByZWFsIG1vZGUsIGRlZmluZWQgYXMgdXBwZXIgYm91bmQKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOwotCi10eXBlZGVmIFVDSEFSICAgTkRJU184MDJfMTFfUkFURVNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTXTsgICAgICAgIC8vIFNldCBvZiA4IGRhdGEgcmF0ZXMKLXR5cGVkZWYgVUNIQVIgICBORElTXzgwMl8xMV9SQVRFU19FWFtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOyAgLy8gU2V0IG9mIDE2IGRhdGEgcmF0ZXMKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9TU0lECi17Ci0gICAgVUlOVCAgIFNzaWRMZW5ndGg7ICAgICAgICAgLy8gbGVuZ3RoIG9mIFNTSUQgZmllbGQgYmVsb3csIGluIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSB6ZXJvLgotICAgIFVDSEFSICAgU3NpZFtORElTXzgwMl8xMV9MRU5HVEhfU1NJRF07ICAgICAgICAgICAvLyBTU0lEIGluZm9ybWF0aW9uIGZpZWxkCi19IE5ESVNfODAyXzExX1NTSUQsICpQTkRJU184MDJfMTFfU1NJRDsKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfV0xBTl9CU1NJRAotewotICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoOyAgICAgLy8gTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlCi0gICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBNYWNBZGRyZXNzOyAvLyBCU1NJRAotICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWRbMl07Ci0gICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAvLyBTU0lECi0gICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAvLyBXRVAgZW5jcnlwdGlvbiByZXF1aXJlbWVudAotICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgLy8gcmVjZWl2ZSBzaWduYWwgc3RyZW5ndGggaW4gZEJtCi0gICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXR3b3JrVHlwZUluVXNlOwotICAgTkRJU184MDJfMTFfQ09ORklHVVJBVElPTiAgICAgICAgICAgQ29uZmlndXJhdGlvbjsKLSAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgIE5ESVNfODAyXzExX1JBVEVTICAgICAgICAgICAgICAgICAgIFN1cHBvcnRlZFJhdGVzOwotfSBORElTX1dMQU5fQlNTSUQsICpQTkRJU19XTEFOX0JTU0lEOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX05ESVNfODAyXzExX0JTU0lEX0xJU1QKLXsKLSAgIFVJTlQgICAgICAgICAgIE51bWJlck9mSXRlbXM7ICAgICAgLy8gaW4gbGlzdCBiZWxvdywgYXQgbGVhc3QgMQotICAgTkRJU19XTEFOX0JTU0lEIEJzc2lkWzFdOwotfSBORElTXzgwMl8xMV9CU1NJRF9MSVNULCAqUE5ESVNfODAyXzExX0JTU0lEX0xJU1Q7Ci0KLS8vIEFkZGVkIENhcGFiaWxpdGllcywgSUVMZW5ndGggYW5kIElFcyBmb3IgZWFjaCBCU1NJRAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTX1dMQU5fQlNTSURfRVgKLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAgICAgIC8vIExlbmd0aCBvZiB0aGlzIHN0cnVjdHVyZQotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTICAgICAgICAgICAgIE1hY0FkZHJlc3M7ICAgICAgICAgLy8gQlNTSUQKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZFsyXTsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkOyAgICAgICAgICAgICAgIC8vIFNTSUQKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YWN5OyAgICAgICAgICAgIC8vIFdFUCBlbmNyeXB0aW9uIHJlcXVpcmVtZW50Ci0gICAgTkRJU184MDJfMTFfUlNTSSAgICAgICAgICAgICAgICAgICAgUnNzaTsgICAgICAgICAgICAgICAvLyByZWNlaXZlIHNpZ25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZW5ndGggaW4gZEJtCi0gICAgTkRJU184MDJfMTFfTkVUV09SS19UWVBFICAgICAgICAgICAgTmV0d29ya1R5cGVJblVzZTsKLSAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWd1cmF0aW9uOwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEluZnJhc3RydWN0dXJlTW9kZTsKLSAgICBORElTXzgwMl8xMV9SQVRFU19FWCAgICAgICAgICAgICAgICBTdXBwb3J0ZWRSYXRlczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRUxlbmd0aDsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRXNbMV07Ci19IE5ESVNfV0xBTl9CU1NJRF9FWCwgKlBORElTX1dMQU5fQlNTSURfRVg7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTkRJU184MDJfMTFfQlNTSURfTElTVF9FWAotewotICAgIFVJTlQgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZJdGVtczsgICAgICAvLyBpbiBsaXN0IGJlbG93LCBhdCBsZWFzdCAxCi0gICAgTkRJU19XTEFOX0JTU0lEX0VYICAgICAgQnNzaWRbMV07Ci19IE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgsICpQTkRJU184MDJfMTFfQlNTSURfTElTVF9FWDsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9ORElTXzgwMl8xMV9GSVhFRF9JRXMKLXsKLSAgICBVQ0hBUiBUaW1lc3RhbXBbOF07Ci0gICAgVVNIT1JUIEJlYWNvbkludGVydmFsOwotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci19IE5ESVNfODAyXzExX0ZJWEVEX0lFcywgKlBORElTXzgwMl8xMV9GSVhFRF9JRXM7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMKLXsKLSAgICBVQ0hBUiBFbGVtZW50SUQ7Ci0gICAgVUNIQVIgTGVuZ3RoOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBmaWVsZAotICAgIFVDSEFSIGRhdGFbMV07Ci19IE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcywgKlBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXM7Ci0KLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQ7Ci0KLXR5cGVkZWYgIFVMT05HICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRDsKLQotdHlwZWRlZiAgVUxPTkcgICBORElTXzgwMl8xMV9BTlRFTk5BOwotCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX1BSSVZBQ1lfRklMVEVSCi17Ci0gICBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbCwKLSAgIE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVAKLX0gTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIsICpQTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVI7Ci0KLS8vIEFkZGVkIG5ldyBlbmNyeXB0aW9uIHR5cGVzCi0vLyBBbHNvIGFsaWFzZWQgdHlwZWRlZiB0byBuZXcgbmFtZQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9XRVBfU1RBVFVTCi17Ci0gICBOZGlzODAyXzExV0VQRW5hYmxlZCwKLSAgICBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0gICBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKLSAgIE5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKLSAgIE5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCi0gICAgTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEVuYWJsZWQsCS8vIFRLSVAgb3IgQUVTIG1peAotICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uNEtleUFic2VudCwKLSAgICBOZGlzODAyXzExR3JvdXBXRVA0MEVuYWJsZWQsCi0JTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCwKLX0gTkRJU184MDJfMTFfV0VQX1NUQVRVUywgKlBORElTXzgwMl8xMV9XRVBfU1RBVFVTLAotICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUywgKlBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUzsKLQotdHlwZWRlZiBlbnVtIF9ORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFMKLXsKLSAgIE5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCi19IE5ESVNfODAyXzExX1JFTE9BRF9ERUZBVUxUUywgKlBORElTXzgwMl8xMV9SRUxPQURfREVGQVVMVFM7Ci0KLSNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVRRklfQ0FQQUJJTElUSUVTICAgICAgMQotI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTCAgICAyCi0jZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFUUZJX0NVUlJFTlRBUEFERFJFU1MgIDQKLQotI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9DQVBBQklMSVRJRVMgICAgICAxCi0jZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX1NUQVRVU0NPREUgICAgICAgIDIKLSNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfQVNTT0NJQVRJT05JRCAgICAgNAotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQUlfUkVRRkkKLXsKLSAgICBVU0hPUlQgQ2FwYWJpbGl0aWVzOwotICAgIFVTSE9SVCBMaXN0ZW5JbnRlcnZhbDsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgQ3VycmVudEFQQWRkcmVzczsKLX0gTkRJU184MDJfMTFfQUlfUkVRRkksICpQTkRJU184MDJfMTFfQUlfUkVRRkk7Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BSV9SRVNGSQotewotICAgIFVTSE9SVCBDYXBhYmlsaXRpZXM7Ci0gICAgVVNIT1JUIFN0YXR1c0NvZGU7Ci0gICAgVVNIT1JUIEFzc29jaWF0aW9uSWQ7Ci19IE5ESVNfODAyXzExX0FJX1JFU0ZJLCAqUE5ESVNfODAyXzExX0FJX1JFU0ZJOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04KLXsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBMZW5ndGg7Ci0gICAgVVNIT1JUICAgICAgICAgICAgICAgICAgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOwotICAgIE5ESVNfODAyXzExX0FJX1JFUUZJICAgIFJlcXVlc3RGaXhlZElFczsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SUVMZW5ndGg7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgT2Zmc2V0UmVxdWVzdElFczsKLSAgICBVU0hPUlQgICAgICAgICAgICAgICAgICBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOwotICAgIE5ESVNfODAyXzExX0FJX1JFU0ZJICAgIFJlc3BvbnNlRml4ZWRJRXM7Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VJRUxlbmd0aDsKLSAgICBVTE9ORyAgICAgICAgICAgICAgICAgICBPZmZzZXRSZXNwb25zZUlFczsKLX0gTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04sICpQTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT047Ci0KLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVAotewotICAgIE5ESVNfODAyXzExX1NUQVRVU19JTkRJQ0FUSU9OICAgICAgIFN0YXR1czsKLSAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICBSZXF1ZXN0WzFdOwotfSBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVCwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FVkVOVDsKLQotLyoKLXR5cGVkZWYgc3RydWN0IF9ORElTXzgwMl8xMV9URVNUCi17Ci0gICAgVUxPTkcgTGVuZ3RoOwotICAgIFVMT05HIFR5cGU7Ci0gICAgdW5pb24KLSAgICB7Ci0gICAgICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX0VWRU5UIEF1dGhlbnRpY2F0aW9uRXZlbnQ7Ci0gICAgICAgIE5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7Ci0gICAgfTsKLX0gTkRJU184MDJfMTFfVEVTVCwgKlBORElTXzgwMl8xMV9URVNUOwotICovCi0KLS8vIDgwMi4xMSBNZWRpYSBzdHJlYW0gY29uc3RyYWludHMsIGFzc29jaWF0ZWQgd2l0aCBPSURfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCi10eXBlZGVmIGVudW0gX05ESVNfODAyXzExX01FRElBX1NUUkVBTV9NT0RFCi17Ci0gICAgTmRpczgwMl8xMU1lZGlhU3RyZWFtT2ZmLAotICAgIE5kaXM4MDJfMTFNZWRpYVN0cmVhbU9uLAotfSBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERSwgKlBORElTXzgwMl8xMV9NRURJQV9TVFJFQU1fTU9ERTsKLQotLy8gUE1LSUQgU3RydWN0dXJlcwotdHlwZWRlZiBVQ0hBUiAgIE5ESVNfODAyXzExX1BNS0lEX1ZBTFVFWzE2XTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotdHlwZWRlZiBzdHJ1Y3QgX0JTU0lEX0lORk8KLXsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyBCU1NJRDsKLSAgICBORElTXzgwMl8xMV9QTUtJRF9WQUxVRSBQTUtJRDsKLX0gQlNTSURfSU5GTywgKlBCU1NJRF9JTkZPOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfUE1LSUQKLXsKLSAgICBVSU5UICAgIExlbmd0aDsKLSAgICBVSU5UICAgIEJTU0lESW5mb0NvdW50OwotICAgIEJTU0lEX0lORk8gQlNTSURJbmZvWzFdOwotfSBORElTXzgwMl8xMV9QTUtJRCwgKlBORElTXzgwMl8xMV9QTUtJRDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTgotewotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgQXV0aE1vZGVTdXBwb3J0ZWQ7Ci0gICAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKLX0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fRU5DUllQVElPTiwgKlBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OOwotCi10eXBlZGVmIHN0cnVjdCBfTkRJU184MDJfMTFfQ0FQQUJJTElUWQotewotICAgICBVTE9ORyBMZW5ndGg7Ci0gICAgIFVMT05HIFZlcnNpb247Ci0gICAgIFVMT05HIE5vT2ZQTUtJRHM7Ci0gICAgIFVMT05HIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOwotICAgICBORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9FTkNSWVBUSU9OIEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKLX0gTkRJU184MDJfMTFfQ0FQQUJJTElUWSwgKlBORElTXzgwMl8xMV9DQVBBQklMSVRZOwotCi0jaWZkZWYgTElOVVgKLSNpZiBXSVJFTEVTU19FWFQgPD0gMTEKLSNpZm5kZWYgU0lPQ0RFVlBSSVZBVEUKLSNkZWZpbmUgU0lPQ0RFVlBSSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRTAKLSNlbmRpZgotI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJCQkJCQkJCVNJT0NERVZQUklWQVRFCi0jZW5kaWYKLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTAkJCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwMSkgLy8gU3luYy4gd2l0aCBBUCBmb3Igd3NjIHVwbnAgZGFlbW9uCi0jZGVmaW5lIFJUUFJJVl9JT0NUTF9TRVQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDIpCi0KLSNpZmRlZiBEQkcKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0JCUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwMykKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwNSkKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8gVE9ETzogc2hpYW5nLCBOZWVkIHRvIHJlYXNzaWduIHRoZSBvaWQgbnVtYmVyLiBBcmNoVGVhbSB1c2UgKFNJT0NJV0ZJUlNUUFJJViArIDB4MTkpIGZvciB0aGlzIG9pZAotI2RlZmluZSBSVFBSSVZfSU9DVExfUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDEzKSAgLy8gZWRpdCBieSBqb2hubGksIGZpeCByZWFkIHJmIHJlZ2lzdGVyIHByb2JsZW0KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQotI2RlZmluZSBSVFBSSVZfSU9DVExfRTJQICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSU9DSVdGSVJTVFBSSVYgKyAweDA3KQotI2VuZGlmIC8vIERCRyAvLwotCi0jaWZkZWYgUkFMSU5LX0FURQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jZGVmaW5lIFJUUFJJVl9JT0NUTF9BVEUJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MDgpCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwOSkKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0FERF9QTUtJRF9DQUNIRSAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQSkKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1JBRElVU19EQVRBICAgICAgICAgICAgICAgICAgICAoU0lPQ0lXRklSU1RQUklWICsgMHgwQykKLSNkZWZpbmUgUlRQUklWX0lPQ1RMX0dTSVRFU1VSVkVZCQkJCQkoU0lPQ0lXRklSU1RQUklWICsgMHgwRCkKLSNkZWZpbmUgUlRfUFJJVl9JT0NUTF9FWFQJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEUpIC8vIFN5bmMuIHdpdGggUlQ2MSAoZm9yIHdwYV9zdXBwbGljYW50KQotI2RlZmluZSBSVFBSSVZfSU9DVExfR0VUX01BQ19UQUJMRQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MEYpCi0KLSNkZWZpbmUgUlRQUklWX0lPQ1RMX1NIT1cJCQkJCQkJKFNJT0NJV0ZJUlNUUFJJViArIDB4MTEpCi1lbnVtIHsKLQlTSE9XX0NPTk5fU1RBVFVTID0gNCwKLQlTSE9XX0RSVklFUl9WRVJJT04gPSA1LAotCVNIT1dfQkFfSU5GTyA9IDYsCi0JU0hPV19ERVNDX0lORk8gPSA3LAotCVJBSU9fT0ZGID0gMTAsCi0JUkFJT19PTiA9IDExLAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVNIT1dfRExTX0VOVFJZX0lORk8gPSAxOSwKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQlTSE9XX0NGR19WQUxVRSA9IDIwLAotCVNIT1dfQURIT0NfRU5UUllfSU5GTyA9IDIxLAotfTsKLQotCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0vL1NOTVAgaWVlZSA4MDJkb3QxMSwga2F0aHkgLCAyMDA4XzAyMjAKLS8vIGRvdDExcmVzKDMpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVST1VJCQkJMHgwNzAwCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVSTkFNRQkJCTB4MDcwMQotI2RlZmluZSBSVF9PSURfODAyXzExX1JFU09VUkNFVFlQRUlETkFNRQkJMHgwNzAyCi0KLS8vIGRvdDExc210KDEpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfUFJJVkFDWU9QVElPTklNUExFTUVOVEVECTB4MDcwMwotI2RlZmluZSBSVF9PSURfODAyXzExX1BPV0VSTUFOQUdFTUVOVE1PREUJCTB4MDcwNAotI2RlZmluZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRQkJCTB4MDcwNSAvLyByZWFkICwgd3JpdGUKLSNkZWZpbmUgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQJCQkJMHgwNzA2Ci0jZGVmaW5lIFJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSAkJMHgwNzA3Ci0jZGVmaW5lIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUCQkJCTB4MDcwOAotI2RlZmluZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUCQkJCTB4MDcwOQotI2RlZmluZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRAkJCQkJMHgwNzEwCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRAkJCQkweDA3MTEKLQotLy8gLy9kb3QxMVBoeSg0KQotI2RlZmluZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMCQkJCTB4MDcxMgotCi0vL2RvdDExbWFjCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTUFDX0FERFJFU1MJCQkJMHgwNzEzCi0jZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgT0lEXzgwMl8xMV9CVUlMRF9DSEFOTkVMX0VYCQkJCTB4MDcxNAotI2RlZmluZSBPSURfODAyXzExX0dFVF9DSF9MSVNUCQkJCQkweDA3MTUKLSNkZWZpbmUgT0lEXzgwMl8xMV9HRVRfQ09VTlRSWV9DT0RFCQkJCTB4MDcxNgotI2RlZmluZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWQkJMHgwNzE3Ci0KLS8vI2RlZmluZSBSVF9PSURfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgIChPSURfR0VUX1NFVF9UT0dHTEUgfCBPSURfODAyXzExX1NUQVRJU1RJQ1MpCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgUlRfT0lEX1dTQ19TRVRfUEFTU1BIUkFTRSAgICAgICAgICAgICAgICAgICAweDA3NDAgLy8gcGFzc3BocmFzZSBmb3Igd3BhKDIpLXBzawotI2RlZmluZSBSVF9PSURfV1NDX0RSSVZFUl9BVVRPX0NPTk5FQ1QgICAgICAgICAgICAgIDB4MDc0MQotI2RlZmluZSBSVF9PSURfV1NDX1FVRVJZX0RFRkFVTFRfUFJPRklMRSAgICAgICAgICAgIDB4MDc0MgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9DT05OX0JZX1BST0ZJTEVfSU5ERVggICAgICAgIDB4MDc0MwotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NAotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NQotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QSU5fQ09ERSAgICAgICAgICAgICAgICAgICAgIDB4MDc0NgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDc0NyAvLyBQSU4gb3IgUEJDCi0jZGVmaW5lIFJUX09JRF9XU0NfU0VUX0NPTkZfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwNzQ4IC8vIEVucm9sbGVlIG9yIFJlZ2lzdHJhcgotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgIDB4MDc0OQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2RlZmluZQlSVF9PSURfV1NDX0NPTkZJR19TVEFUVVMJCQkJCTB4MDc0RgotI2RlZmluZSBSVF9PSURfODAyXzExX1dTQ19RVUVSWV9QUk9GSUxFCQkJCTB4MDc1MAotLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggUlQ2MQotI2RlZmluZSBSVF9PSURfV1NDX1FVRVJZX1NUQVRVUwkJCQkJCTB4MDc1MQotI2RlZmluZSBSVF9PSURfV1NDX1BJTl9DT0RFCQkJCQkJCTB4MDc1MgotI2RlZmluZSBSVF9PSURfV1NDX1VVSUQJCQkJCQkJCTB4MDc1MwotI2RlZmluZSBSVF9PSURfV1NDX1NFVF9TRUxFQ1RFRF9SRUdJU1RSQVIJCQkweDA3NTQKLSNkZWZpbmUgUlRfT0lEX1dTQ19FQVBNU0cJCQkJCQkJMHgwNzU1Ci0jZGVmaW5lIFJUX09JRF9XU0NfTUFOVUZBQ1RVUkVSCQkJCQkJMHgwNzU2Ci0jZGVmaW5lIFJUX09JRF9XU0NfTU9ERUxfTkFNRQkJCQkJCTB4MDc1NwotI2RlZmluZSBSVF9PSURfV1NDX01PREVMX05PCQkJCQkJCTB4MDc1OAotI2RlZmluZSBSVF9PSURfV1NDX1NFUklBTF9OTwkJCQkJCTB4MDc1OQotI2RlZmluZSBSVF9PSURfV1NDX01BQ19BRERSRVNTCQkJCQkJMHgwNzYwCi0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLS8vIGZvciBjb25zaXN0ZW5jeSB3aXRoIFJUNjEKLSNkZWZpbmUgUlRfT0lEX0dFVF9QSFlfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAweDc2MQotI2VuZGlmIC8vIExMVERfU1VQUE9SVCAvLwotCi0jaWZkZWYgTklOVEVORE9fQVAKLS8vI2RlZmluZSBSVF9PSURfTklOVEVORE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMTA3NzAKLSNkZWZpbmUgUlRfT0lEXzgwMl8xMV9OSU5URU5ET19HRVRfVEFCTEUJCQkweDA3NzEgLy8oKFJUX09JRF9OSU5URU5ETyArIDB4MDEpICYgMHhmZmZmKQotI2RlZmluZSBSVF9PSURfODAyXzExX05JTlRFTkRPX1NFVF9UQUJMRQkJCTB4MDc3MiAvLygoUlRfT0lEX05JTlRFTkRPICsgMHgwMikgJiAweGZmZmYpCi0jZGVmaW5lIFJUX09JRF84MDJfMTFfTklOVEVORE9fQ0FQQUJMRQkJCQkweDA3NzMgLy8oKFJUX09JRF9OSU5URU5ETyArIDB4MDMpICYgMHhmZmZmKQotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLQotLy8gTmV3IGZvciBNZWV0aW5nSG91c2UgQXBpIHN1cHBvcnQKLSNkZWZpbmUgT0lEX01IXzgwMl8xWF9TVVBQT1JURUQgICAgICAgICAgICAgICAweEZGRURDMTAwCi0KLS8vIE1JTU8gVHggcGFyYW1ldGVyLCBTaG9ydEdJLCBNQ1MsIFNUQkMsIGV0Yy4gIHRoZXNlIGFyZSBmaWVsZHMgaW4gVFhXSS4gRG9uJ3QgY2hhbmdlIHRoaXMgZGVmaW5pdGlvbiEhIQotdHlwZWRlZiB1bmlvbiAgX0hUVFJBTlNNSVRfU0VUVElORyB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCXN0cnVjdAl7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotLy8JVVNIT1JUCQlyc3Y6MzsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCXJzdjoyOwotCVVTSE9SVAkJU1RCQzoyOwkvL1NQQUNFCi0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQl9CWZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QJewotCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQlVU0hPUlQJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVVNIT1JUCQlTaG9ydEdJOjE7Ci0JVVNIT1JUCQlTVEJDOjI7CS8vU1BBQ0UKLS8vCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlyc3Y6MjsKLQlVU0hPUlQJCVR4QkY6MTsKLQlVU0hPUlQJCU1PREU6MjsJLy8gVXNlIGRlZmluaXRpb24gTU9ERV94eHguCi0JfQlmaWVsZDsKLSNlbmRpZgotCVVTSE9SVAkJd29yZDsKLSB9IEhUVFJBTlNNSVRfU0VUVElORywgKlBIVFRSQU5TTUlUX1NFVFRJTkc7Ci0KLXR5cGVkZWYgZW51bSBfUlRfODAyXzExX1BSRUFNQkxFIHsKLSAgICBSdDgwMl8xMVByZWFtYmxlTG9uZywKLSAgICBSdDgwMl8xMVByZWFtYmxlU2hvcnQsCi0gICAgUnQ4MDJfMTFQcmVhbWJsZUF1dG8KLX0gUlRfODAyXzExX1BSRUFNQkxFLCAqUFJUXzgwMl8xMV9QUkVBTUJMRTsKLQotdHlwZWRlZiBlbnVtIF9SVF84MDJfMTFfUEhZX01PREUgewotCVBIWV8xMUJHX01JWEVEID0gMCwKLQlQSFlfMTFCLAotCVBIWV8xMUEsCi0JUEhZXzExQUJHX01JWEVELAotCVBIWV8xMUcsCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JUEhZXzExQUJHTl9NSVhFRCwJLy8gYm90aCBiYW5kICAgNQotCVBIWV8xMU5fMl80RywJCS8vIDExbi1vbmx5IHdpdGggMi40RyBiYW5kCTYKLQlQSFlfMTFHTl9NSVhFRCwJLy8gMi40RyBiYW5kICAgICAgNwotCVBIWV8xMUFOX01JWEVELAkvLyA1RyAgYmFuZCAgICAgICA4Ci0JUEhZXzExQkdOX01JWEVELAkvLyBpZiBjaGVjayA4MDIuMTFiLiAgICAgIDkKLQlQSFlfMTFBR05fTUlYRUQsCS8vIGlmIGNoZWNrIDgwMi4xMWIuICAgICAgMTAKLQlQSFlfMTFOXzVHLAkJCS8vIDExbi1vbmx5IHdpdGggNUcgYmFuZAkJMTEKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLX0gUlRfODAyXzExX1BIWV9NT0RFOwotCi0KLS8vIHB1dCBhbGwgcHJvcHJpZXRlcnkgZm9yLXF1ZXJ5IG9iamVjdHMgaGVyZSB0byByZWR1Y2UgIyBvZiBRdWVyeV9PSUQKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTElOS19TVEFUVVMgewotICAgIFVMT05HICAgQ3VyclR4UmF0ZTsgICAgICAgICAvLyBpbiB1bml0cyBvZiAwLjVNYnBzCi0gICAgVUxPTkcgICBDaGFubmVsUXVhbGl0eTsgICAgIC8vIDAuLjEwMCAlCi0gICAgVUxPTkcgICBUeEJ5dGVDb3VudDsgICAgICAgIC8vIGJvdGggb2sgYW5kIGZhaWwKLSAgICBVTE9ORyAgIFJ4Qnl0ZUNvdW50OyAgICAgICAgLy8gYm90aCBvayBhbmQgZmFpbAotICAgIFVMT05HCUNlbnRyYWxDaGFubmVsOwkJLy8gNDBNSHogY2VudHJhbCBjaGFubmVsIG51bWJlcgotfSBSVF84MDJfMTFfTElOS19TVEFUVVMsICpQUlRfODAyXzExX0xJTktfU1RBVFVTOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX0xPRyB7Ci0gICAgTEFSR0VfSU5URUdFUiAgIFN5c3RlbVRpbWU7ICAvLyB0aW1lc3RhbW1wIHZpYSBOZGlzR2V0Q3VycmVudFN5c3RlbVRpbWUoKQotICAgIFVDSEFSICAgICAgICAgICBBZGRyW01BQ19BRERSX0xFTkdUSF07Ci0gICAgVVNIT1JUICAgICAgICAgIEV2ZW50OyAgICAgICAvLyBFVkVOVF94eHgKLX0gUlRfODAyXzExX0VWRU5UX0xPRywgKlBSVF84MDJfMTFfRVZFTlRfTE9HOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0VWRU5UX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgVUxPTkcgICAgICAgUnN2OyAgICAgLy8gdG8gYWxpZ24gTG9nW10gYXQgTEFSR0VfSU5FR0VSIGJvdW5kYXJ5Ci0gICAgUlRfODAyXzExX0VWRU5UX0xPRyAgIExvZ1tNQVhfTlVNQkVSX09GX0VWRU5UXTsKLX0gUlRfODAyXzExX0VWRU5UX1RBQkxFLCBQUlRfODAyXzExX0VWRU5UX1RBQkxFOwotCi0vLyBNSU1PIFR4IHBhcmFtZXRlciwgU2hvcnRHSSwgTUNTLCBTVEJDLCBldGMuICB0aGVzZSBhcmUgZmllbGRzIGluIFRYV0kuIERvbid0IGNoYW5nZSB0aGlzIGRlZmluaXRpb24hISEKLXR5cGVkZWYgdW5pb24gIF9NQUNIVFRSQU5TTUlUX1NFVFRJTkcgewotCXN0cnVjdAl7Ci0JVVNIT1JUCQlNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotCVVTSE9SVAkJQlc6MTsJLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQlVU0hPUlQJCVNob3J0R0k6MTsKLQlVU0hPUlQJCVNUQkM6MjsJLy9TUEFDRQotCVVTSE9SVAkJcnN2OjM7Ci0JVVNIT1JUCQlNT0RFOjI7CS8vIFVzZSBkZWZpbml0aW9uIE1PREVfeHh4LgotCX0JZmllbGQ7Ci0JVVNIT1JUCQl3b3JkOwotIH0gTUFDSFRUUkFOU01JVF9TRVRUSU5HLCAqUE1BQ0hUVFJBTlNNSVRfU0VUVElORzsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9NQUNfRU5UUlkgewotICAgIFVDSEFSICAgICAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVQ0hBUiAgICAgICBBaWQ7Ci0gICAgVUNIQVIgICAgICAgUHNtOyAgICAgLy8gMDpQV1JfQUNUSVZFLCAxOlBXUl9TQVZFCi0gICAgVUNIQVIJCU1pbW9QczsgIC8vIDA6TU1QU19TVEFUSUMsIDE6TU1QU19EWU5BTUlDLCAzOk1NUFNfRW5hYmxlZAotICAgIENIQVIJCUF2Z1Jzc2kwOwotCUNIQVIJCUF2Z1Jzc2kxOwotCUNIQVIJCUF2Z1Jzc2kyOwotCVVJTlQzMgkJQ29ubmVjdGVkVGltZTsKLSAgICBNQUNIVFRSQU5TTUlUX1NFVFRJTkcJVHhSYXRlOwotfSBSVF84MDJfMTFfTUFDX0VOVFJZLCAqUFJUXzgwMl8xMV9NQUNfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfTUFDX1RBQkxFIHsKLSAgICBVTE9ORyAgICAgICBOdW07Ci0gICAgUlRfODAyXzExX01BQ19FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX01BQ107Ci19IFJUXzgwMl8xMV9NQUNfVEFCTEUsICpQUlRfODAyXzExX01BQ19UQUJMRTsKLQotLy8gc3RydWN0dXJlIGZvciBxdWVyeS9zZXQgaGFyZHdhcmUgcmVnaXN0ZXIgLSBNQUMsIEJCUCwgUkYgcmVnaXN0ZXIKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfSEFSRFdBUkVfUkVHSVNURVIgewotICAgIFVMT05HICAgSGFyZHdhcmVUeXBlOyAgICAgICAvLyAwOk1BQywgMTpCQlAsIDI6UkYgcmVnaXN0ZXIsIDM6RUVQUk9NCi0gICAgVUxPTkcgICBPZmZzZXQ7ICAgICAgICAgICAgIC8vIFEvUyByZWdpc3RlciBvZmZzZXQgYWRkcgotICAgIFVMT05HICAgRGF0YTsgICAgICAgICAgICAgICAvLyBSL1cgZGF0YSBidWZmZXIKLX0gUlRfODAyXzExX0hBUkRXQVJFX1JFR0lTVEVSLCAqUFJUXzgwMl8xMV9IQVJEV0FSRV9SRUdJU1RFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9BUF9DT05GSUcgewotICAgIFVMT05HICAgRW5hYmxlVHhCdXJzdDsgICAgICAvLyAwLWRpc2FibGUsIDEtZW5hYmxlCi0gICAgVUxPTkcgICBFbmFibGVUdXJib1JhdGU7ICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUgNzIvMTAwbWJwcyB0dXJibyByYXRlCi0gICAgVUxPTkcgICBJc29sYXRlSW50ZXJTdGFUcmFmZmljOyAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBpc29sYXRpb24KLSAgICBVTE9ORyAgIEhpZGVTc2lkOyAgICAgICAgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSBoaWRpbmcKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX0FQX0NPTkZJRywgKlBSVF84MDJfMTFfQVBfQ09ORklHOwotCi0vLyBzdHJ1Y3R1cmUgdG8gcXVlcnkvc2V0IFNUQV9DT05GSUcKLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfU1RBX0NPTkZJRyB7Ci0gICAgVUxPTkcgICBFbmFibGVUeEJ1cnN0OyAgICAgIC8vIDAtZGlzYWJsZSwgMS1lbmFibGUKLSAgICBVTE9ORyAgIEVuYWJsZVR1cmJvUmF0ZTsgICAgLy8gMC1kaXNhYmxlLCAxLWVuYWJsZSA3Mi8xMDBtYnBzIHR1cmJvIHJhdGUKLSAgICBVTE9ORyAgIFVzZUJHUHJvdGVjdGlvbjsgICAgLy8gMC1BVVRPLCAxLWFsd2F5cyBPTiwgMi1hbHdheXMgT0ZGCi0gICAgVUxPTkcgICBVc2VTaG9ydFNsb3RUaW1lOyAgIC8vIDAtbm8gdXNlLCAxLXVzZSA5LXVzIHNob3J0IHNsb3QgdGltZSB3aGVuIGFwcGxpY2FibGUKLSAgICBVTE9ORyAgIEFkaG9jTW9kZTsJCQkvLyAwLTExYiByYXRlcyBvbmx5IChXSUZJIHNwZWMpLCAxIC0gYi9nIG1peGVkLCAyIC0gZyBvbmx5Ci0gICAgVUxPTkcgICBId1JhZGlvU3RhdHVzOyAgICAgIC8vIDAtT0ZGLCAxLU9OLCBkZWZhdWx0IGlzIDEsIFJlYWQtT25seQotICAgIFVMT05HICAgUnN2MTsgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAKLSAgICBVTE9ORyAgIFN5c3RlbUVycm9yQml0bWFwOyAgLy8gaWdub3JlIHVwb24gU0VULCByZXR1cm4gc3lzdGVtIGVycm9yIHVwb24gUVVFUlkKLX0gUlRfODAyXzExX1NUQV9DT05GSUcsICpQUlRfODAyXzExX1NUQV9DT05GSUc7Ci0KLS8vCi0vLyAgRm9yIE9JRCBRdWVyeSBvciBTZXQgYWJvdXQgQkEgc3RydWN0dXJlCi0vLwotdHlwZWRlZglzdHJ1Y3QJX09JRF9CQUNBUF9TVFJVQwl7Ci0JCVVDSEFSCQlSeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlUeEJBV2luTGltaXQ7Ci0JCVVDSEFSCQlQb2xpY3k7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UuIG90aGVyIHZhbHVlIGludmFsaWQKLQkJVUNIQVIJCU1wZHVEZW5zaXR5OwkvLyAwOiBERUxBWV9CQSAxOklNTUVEX0JBICAoLy9CQSBQb2xpY3kgc3ViZmlsZWQgdmFsdWUgaW4gQUREQkEgZnJhbWUpICAgMjpCQS1ub3QgdXNlLiBvdGhlciB2YWx1ZSBpbnZhbGlkCi0JCVVDSEFSCQlBbXNkdUVuYWJsZTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVQ0hBUgkJQW1zZHVTaXplOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVQ0hBUgkJTU1QU21vZGU7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlCT09MRUFOCQlBdXRvQkE7CS8vIEF1dG8gQkEgd2lsbCBhdXRvbWF0aWNhbGx5Ci19IE9JRF9CQUNBUF9TVFJVQywgKlBPSURfQkFDQVBfU1RSVUM7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVF84MDJfMTFfQUNMX0VOVFJZIHsKLSAgICBVQ0hBUiAgIEFkZHJbTUFDX0FERFJfTEVOR1RIXTsKLSAgICBVU0hPUlQgIFJzdjsKLX0gUlRfODAyXzExX0FDTF9FTlRSWSwgKlBSVF84MDJfMTFfQUNMX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUXzgwMl8xMV9BQ0wgewotICAgIFVMT05HICAgUG9saWN5OyAgICAgICAgICAgICAvLyAwLWRpc2FibGUsIDEtcG9zaXRpdmUgbGlzdCwgMi1uZWdhdGl2ZSBsaXN0Ci0gICAgVUxPTkcgICBOdW07Ci0gICAgUlRfODAyXzExX0FDTF9FTlRSWSBFbnRyeVtNQVhfTlVNQkVSX09GX0FDTF07Ci19IFJUXzgwMl8xMV9BQ0wsICpQUlRfODAyXzExX0FDTDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9XRFMgewotICAgIFVMT05HCQkJCQkJTnVtOwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTCQlFbnRyeVsyNC8qTUFYX05VTV9PRl9XRFNfTElOSyovXTsKLQlVTE9ORwkJCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQkJCUtleU1hdGVyaWFsWzMyXTsKLX0gUlRfODAyXzExX1dEUywgKlBSVF84MDJfMTFfV0RTOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX1RYX1JBVEVTXyB7Ci0gICAgVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci0gICAgVUNIQVIgICAgICAgRXh0UmF0ZUxlbjsKLSAgICBVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFU107Ci19IFJUXzgwMl8xMV9UWF9SQVRFUywgKlBSVF84MDJfMTFfVFhfUkFURVM7Ci0KLQotLy8gRGVmaW5pdGlvbiBvZiBleHRyYSBpbmZvcm1hdGlvbiBjb2RlCi0jZGVmaW5lCUdFTkVSQUxfTElOS19VUAkJCTB4MAkJCS8vIExpbmsgaXMgVXAKLSNkZWZpbmUJR0VORVJBTF9MSU5LX0RPV04JCTB4MQkJCS8vIExpbmsgaXMgRG93bgotI2RlZmluZQlIV19SQURJT19PRkYJCQkweDIJCQkvLyBIYXJkd2FyZSByYWRpbyBvZmYKLSNkZWZpbmUJU1dfUkFESU9fT0ZGCQkJMHgzCQkJLy8gU29mdHdhcmUgcmFkaW8gb2ZmCi0jZGVmaW5lCUFVVEhfRkFJTAkJCQkweDQJCQkvLyBPcGVuIGF1dGhlbnRpY2F0aW9uIGZhaWwKLSNkZWZpbmUJQVVUSF9GQUlMX0tFWVMJCQkweDUJCQkvLyBTaGFyZWQgYXV0aGVudGljYXRpb24gZmFpbAotI2RlZmluZQlBU1NPQ19GQUlMCQkJCTB4NgkJCS8vIEFzc29jaWF0aW9uIGZhaWxlZAotI2RlZmluZQlFQVBfTUlDX0ZBSUxVUkUJCQkweDcJCQkvLyBEZWF1dGhlbmNhdGlvbiBiZWNhdXNlIE1JQyBmYWlsdXJlCi0jZGVmaW5lCUVBUF80V0FZX1RJTUVPVVQJCTB4OAkJCS8vIERlYXV0aGVuY2F0aW9uIG9uIDQtd2F5IGhhbmRzaGFrZSB0aW1lb3V0Ci0jZGVmaW5lCUVBUF9HUk9VUF9LRVlfVElNRU9VVAkweDkJCQkvLyBEZWF1dGhlbmNhdGlvbiBvbiBncm91cCBrZXkgaGFuZHNoYWtlIHRpbWVvdXQKLSNkZWZpbmUJRUFQX1NVQ0NFU1MJCQkJMHhhCQkJLy8gRUFQIHN1Y2NlZWQKLSNkZWZpbmUJREVURUNUX1JBREFSX1NJR05BTAkJMHhiICAgICAgICAgLy8gUmFkYXIgc2lnbmFsIG9jY3VyIGluIGN1cnJlbnQgY2hhbm5lbAotI2RlZmluZSBFWFRSQV9JTkZPX01BWAkJCTB4YgkJCS8vIEluZGljYXRlIExhc3QgT0lECi0KLSNkZWZpbmUgRVhUUkFfSU5GT19DTEVBUgkJMHhmZmZmZmZmZgotCi0vLyBUaGlzIGlzIE9JRCBzZXR0aW5nIHN0cnVjdHVyZS4gU28gb25seSBHRiBvciBNTSBhcyBNb2RlLiBUaGlzIGlzIHZhbGlkIHdoZW4gb3VyIHdpcmVsc3MgbW9kZSBoYXMgODAyLjExbiBpbiB1c2UuCi10eXBlZGVmIHN0cnVjdCB7Ci0JUlRfODAyXzExX1BIWV9NT0RFCQlQaHlNb2RlOwkvLwotCVVDSEFSCQlUcmFuc21pdE5vOwotCVVDSEFSCQlIdE1vZGU7CQkvL0hUTU9ERV9HRiBvciBIVE1PREVfTU0KLQlVQ0hBUgkJRXh0T2Zmc2V0OwkvL2V4dGVuc2lvbiBjaGFubmVsIGFib3ZlIG9yIGJlbG93Ci0JVUNIQVIJCU1DUzsKLQlVQ0hBUgkJQlc7Ci0JVUNIQVIJCVNUQkM7Ci0JVUNIQVIJCVNIT1JUR0k7Ci0JVUNIQVIJCXJzdjsKLX0gT0lEX1NFVF9IVF9QSFlNT0RFLCAqUE9JRF9TRVRfSFRfUEhZTU9ERTsKLQotI2lmZGVmIE5JTlRFTkRPX0FQCi0jZGVmaW5lIE5JTlRFTkRPX01BWF9FTlRSWSAxNgotI2RlZmluZSBOSU5URU5ET19TU0lEX05BTUVfTE4gOAotI2RlZmluZSBOSU5URU5ET19TU0lEX05BTUUgIk5XQ1VTQkFQIgotI2RlZmluZSBOSU5URU5ET19QUk9CRV9SRVFfRkxBR19NQVNLIDB4MDMKLSNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX09OIDB4MDEKLSNkZWZpbmUgTklOVEVORE9fUFJPQkVfUkVRX1NJR05BTCAweDAyCi0jZGVmaW5lIE5JTlRFTkRPX1BST0JFX1JTUF9PTiAweDAxCi0jZGVmaW5lIE5JTlRFTkRPX1NTSURfTklDS05BTUVfTE4gMjAKLQotI2RlZmluZSBOSU5URU5ET19XRVBLRVlfTE4gMTMKLQotdHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1NTSUQKLXsKLQlVQ0hBUglOSU5URU5ET0ZpeENoYXJbTklOVEVORE9fU1NJRF9OQU1FX0xOXTsKLQlVQ0hBUgl6ZXJvMTsKLQlVQ0hBUglyZWdpc3RlOwotCVVDSEFSCUlEOwotCVVDSEFSCXplcm8yOwotCVVDSEFSCU5JQ0tuYW1lW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOwotfSBSVF9OSU5URU5ET19TU0lELCAqUFJUX05JTlRFTkRPX1NTSUQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9OSU5URU5ET19FTlRSWQotewotCVVDSEFSCU5JQ0tuYW1lW05JTlRFTkRPX1NTSURfTklDS05BTUVfTE5dOwotICAgIFVDSEFSICAgRFNfQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCVVDSEFSCXJlZ2lzdGU7Ci0JVUNIQVIJVXNlclNwYWNlQWNrOwotfSBSVF9OSU5URU5ET19FTlRSWSwgKlBSVF9OSU5URU5ET19FTlRSWTsKLQotLy9SVFBSSVZfSU9DVExfTklOVEVORE9fR0VUX1RBQkxFCi0vL1JUUFJJVl9JT0NUTF9OSU5URU5ET19TRVRfVEFCTEUKLXR5cGVkZWYgc3RydWN0IF9OSU5URU5ET19UQUJMRQotewotCVVJTlQJCQkJbnVtYmVyOwotCVJUX05JTlRFTkRPX0VOVFJZCWVudHJ5W05JTlRFTkRPX01BWF9FTlRSWV07Ci19IFJUX05JTlRFTkRPX1RBQkxFLCAqUFJUX05JTlRFTkRPX1RBQkxFOwotCi0vL1JUUFJJVl9JT0NUTF9OSU5URU5ET19TRUVEX1dFUEtFWQotdHlwZWRlZiBzdHJ1Y3QgX05JTlRFTkRPX1NFRURfV0VQS0VZCi17Ci0JVUNIQVIJc2VlZFtOSU5URU5ET19TU0lEX05JQ0tOQU1FX0xOXTsKLQlVQ0hBUgl3ZXBrZXlbMTZdOy8vdXNlIDEzIGZvciAxMDQgYml0cyB3ZXAga2V5Ci19IFJUX05JTlRFTkRPX1NFRURfV0VQS0VZLCAqUFJUX05JTlRFTkRPX1NFRURfV0VQS0VZOwotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLSNpZmRlZiBMTFREX1NVUFBPUlQKLXR5cGVkZWYgc3RydWN0IF9SVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZIHsKLSAgICBVQ0hBUiAgICAgICAgICAgQWRkcltFVEhfTEVOR1RIX09GX0FERFJFU1NdOwotICAgIHVuc2lnbmVkIHNob3J0ICBNT1I7ICAgICAgICAvLyBtYXhpbXVtIG9wZXJhdGlvbmFsIHJhdGUKLSAgICBVQ0hBUiAgICAgICAgICAgcGh5TW9kZTsKLX0gUlRfTExURF9BU1NPSUNBVElPTl9FTlRSWSwgKlBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfTExURF9BU1NPSUNBVElPTl9UQUJMRSB7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIE51bTsKLSAgICBSVF9MTFREX0FTU09JQ0FUSU9OX0VOVFJZICAgRW50cnlbTUFYX05VTUJFUl9PRl9NQUNdOwotfSBSVF9MTFREX0FTU09JQ0FUSU9OX1RBQkxFLCAqUFJUX0xMVERfQVNTT0lDQVRJT05fVEFCTEU7Ci0jZW5kaWYgLy8gTExURF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLS8vcnQyODYwLCBrYXRoeSAyMDA3LTAxMTgKLS8vIHN0cnVjdHVyZSBmb3IgRExTCi10eXBlZGVmIHN0cnVjdCBfUlRfODAyXzExX0RMU19VSSB7Ci0JVVNIT1JUCQkJCQkJVGltZU91dDsJCS8vIHVuaXQ6IHNlY29uZCAsIHNldCBieSBVSQotCVVTSE9SVAkJCQkJCUNvdW50RG93blRpbWVyOwkvLyB1bml0OiBzZWNvbmQgLCB1c2VkIGJ5IGRyaXZlciBvbmx5Ci0JTkRJU184MDJfMTFfTUFDX0FERFJFU1MJCU1hY0FkZHI7CQkvLyBzZXQgYnkgVUkKLQlVQ0hBUgkJCQkJCVN0YXR1czsJCQkvLyAwOiBub25lICwgMTogd2FpdCBTVEFrZXksIDI6IGZpbmlzaCBETFMgc2V0dXAgLCBzZXQgYnkgZHJpdmVyIG9ubHkKLQlCT09MRUFOCQkJCQkJVmFsaWQ7CQkJLy8gMTogdmFsaWQgLCAwOiBpbnZhbGlkICwgc2V0IGJ5IFVJLCB1c2UgdG8gc2V0dXAgb3IgdGVhciBkb3duIERMUyBsaW5rCi19IFJUXzgwMl8xMV9ETFNfVUksICpQUlRfODAyXzExX0RMU19VSTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUXzgwMl8xMV9ETFNfSU5GTyB7Ci0JUlRfODAyXzExX0RMU19VSQlFbnRyeVtNQVhfTlVNQkVSX09GX0RMU19FTlRSWV07Ci0JVUNIQVIJCQkJbnVtOwotfSBSVF84MDJfMTFfRExTX0lORk8sICpQUlRfODAyXzExX0RMU19JTkZPOwotCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9ETFNfTU9ERSB7Ci0gICAgRExTX05PTkUsCi0gICAgRExTX1dBSVRfS0VZLAotICAgIERMU19GSU5JU0gKLX0gUlRfODAyXzExX0RMU19NT0RFOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2RlZmluZQlSVF9BU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMQotI2RlZmluZQlSVF9ESVNBU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMgotI2RlZmluZQlSVF9SRVFJRV9FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMwotI2RlZmluZQlSVF9SRVNQSUVfRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAotI2RlZmluZQlSVF9BU1NPQ0lORk9fRVZFTlRfRkxBRyAgICAgICAgICAgICAgICAgICAgIDB4MDEwNQotI2RlZmluZSBSVF9QTUtJRENBTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNgotI2RlZmluZSBSVF9JTlRFUkZBQ0VfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNwotI2RlZmluZSBSVF9JTlRFUkZBQ0VfVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwOAotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCi0jZGVmaW5lIE1BWF9DVVNUT01fTEVOIDEyOAotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi10eXBlZGVmIGVudW0gX1JUXzgwMl8xMV9EX0NMSUVOVF9NT0RFCi17Ci0gICBSdDgwMl8xMV9EX05vbmUsCi0gICBSdDgwMl8xMV9EX0ZsZXhpYmxlLAotICAgUnQ4MDJfMTFfRF9TdHJpY3QsCi19IFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFLCAqUFJUXzgwMl8xMV9EX0NMSUVOVF9NT0RFOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi10eXBlZGVmIHN0cnVjdCBfUlRfQ0hBTk5FTF9MSVNUX0lORk8KLXsKLQlVQ0hBUiBDaGFubmVsTGlzdFtNQVhfTlVNX09GX0NIU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQotCVVDSEFSIENoYW5uZWxMaXN0TnVtOyAvLyBudW1iZXIgb2YgY2hhbm5lbCBpbiBDaGFubmVsTGlzdFtdCi19IFJUX0NIQU5ORUxfTElTVF9JTkZPLCAqUFJUX0NIQU5ORUxfTElTVF9JTkZPOwotCi0vLyBXU0MgY29uZmlndXJlZCBjcmVkZW50aWFsCi10eXBlZGVmCXN0cnVjdAlfV1NDX0NSRURFTlRJQUwKLXsKLQlORElTXzgwMl8xMV9TU0lECVNTSUQ7CQkJCS8vIG1hbmRhdG9yeQotCVVTSE9SVAkJCQlBdXRoVHlwZTsJCQkvLyBtYW5kYXRvcnksIDE6IG9wZW4sIDI6IHdwYS1wc2ssIDQ6IHNoYXJlZCwgODp3cGEsIDB4MTA6IHdwYTIsIDB4MjA6IHdwYTItcHNrCi0JVVNIT1JUCQkJCUVuY3JUeXBlOwkJCS8vIG1hbmRhdG9yeSwgMTogbm9uZSwgMjogd2VwLCA0OiB0a2lwLCA4OiBhZXMKLQlVQ0hBUgkJCQlLZXlbNjRdOwkJCS8vIG1hbmRhdG9yeSwgTWF4aW11bSA2NCBieXRlCi0JVVNIT1JUCQkJCUtleUxlbmd0aDsKLQlVQ0hBUgkJCQlNYWNBZGRyWzZdOwkJCS8vIG1hbmRhdG9yeSwgQVAgTUFDIGFkZHJlc3MKLQlVQ0hBUgkJCQlLZXlJbmRleDsJCQkvLyBvcHRpb25hbCwgZGVmYXVsdCBpcyAxCi0JVUNIQVIJCQkJUnN2ZFszXTsJCQkvLyBNYWtlIGFsaWdubWVudAotfQlXU0NfQ1JFREVOVElBTCwgKlBXU0NfQ1JFREVOVElBTDsKLQotLy8gV1NDIGNvbmZpZ3VyZWQgcHJvZmlsZXMKLXR5cGVkZWYJc3RydWN0CV9XU0NfUFJPRklMRQotewotCVVJTlQJCQlQcm9maWxlQ250OwotCVVJTlQJCQlBcHBseVByb2ZpbGVJZHg7ICAvLyBhZGQgYnkgam9obmxpLCBmaXggV1BTIHRlc3QgcGxhbiA1LjEuMQotCVdTQ19DUkVERU5USUFMCVByb2ZpbGVbOF07CQkJCS8vIFN1cHBvcnQgdXAgdG8gOCBwcm9maWxlcwotfQlXU0NfUFJPRklMRSwgKlBXU0NfUFJPRklMRTsKLQotCi0KLSNlbmRpZiAvLyBfT0lEX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3BjaV9tYWluX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9wY2lfbWFpbl9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxMDE1Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3BjaV9tYWluX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXBjaV9tYWluX2Rldi5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTmFtZQkJRGF0ZQkJCU1vZGlmaWNhdGlvbiBsb2dzCi0qLwotCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotLy8gRm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgc2hvdyB3aGVuIHlvdSBydW4gJ21vZGluZm8nCi0vLyAqKiogSWYgeW91IGhhdmUgYSBzb2x1dGlvbiBmb3IgdGhlIGJ1ZyBpbiBjdXJyZW50IHZlcnNpb24gb2YgZHJpdmVyLCBwbGVhc2UgbWFpbCB0byBtZS4KLS8vIE90aGVyd2lzZSBwb3N0IHRvIGZvcnVtIGluIHJhbGlua3RlY2gncyB3ZWIgc2l0ZSh3d3cucmFsaW5rdGVjaC5jb20pIGFuZCBsZXQgYWxsIHVzZXJzIGhlbHAgeW91LiAqKioKLU1PRFVMRV9BVVRIT1IoIkpldHQgQ2hlbiA8amV0dF9jaGVuQHJhbGlua3RlY2guY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSVDMwOTAgV2lyZWxlc3MgTGFuIExpbnV4IERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vLwotLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zCi0vLwotZXh0ZXJuIGludCBydDI4eHhfY2xvc2UoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotZXh0ZXJuIGludCBydDI4eHhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci0KLXN0YXRpYyBWT0lEIF9fZGV2ZXhpdCBydDI4NjBfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci1zdGF0aWMgSU5UIF9fZGV2aW5pdCBydDI4NjBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqZW50KTsKLXN0YXRpYyB2b2lkIF9fZXhpdCBydDI4NjBfY2xlYW51cF9tb2R1bGUodm9pZCk7Ci1zdGF0aWMgaW50IF9faW5pdCBydDI4NjBfaW5pdF9tb2R1bGUodm9pZCk7Ci0KLQotIHN0YXRpYyBWT0lEIFJUTVBJbml0UENJZURldmljZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiwKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgICBwQWQpOwotCi0KLSNpZmRlZiBDT05GSUdfUE0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotI2RlZmluZSBwbV9tZXNzYWdlX3QgdTMyCi0jZW5kaWYKLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7Ci0jZW5kaWYKLSNlbmRpZiAvLyBDT05GSUdfUE0gLy8KLQotLy8KLS8vIFJhbGluayBQQ0kgZGV2aWNlIHRhYmxlLCBpbmNsdWRlIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMKLS8vCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnQyODYwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0KLXsKLSNpZmRlZiBSVDMwOTAKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzA5MF9QQ0llX0RFVklDRV9JRCl9LAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRSgweDE0NjIsIDB4ODkxQSl9LAotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIFJUMzM5MAotCXtQQ0lfREVWSUNFKE5JQ19QQ0lfVkVORE9SX0lELCBOSUMzMzkwX1BDSWVfREVWSUNFX0lEKX0sCi0Je1BDSV9ERVZJQ0UoTklDX1BDSV9WRU5ET1JfSUQsIE5JQzMzOTFfUENJZV9ERVZJQ0VfSUQpfSwKLQl7UENJX0RFVklDRShOSUNfUENJX1ZFTkRPUl9JRCwgTklDMzM5Ml9QQ0llX0RFVklDRV9JRCl9LAotI2VuZGlmIC8vIFJUMzM5MCAvLwotICAgIHswLH0JCS8vIHRlcm1pbmF0ZSBsaXN0Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnQyODYwX3BjaV90YmwpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIE1PRFVMRV9WRVJTSU9OCi1NT0RVTEVfVkVSU0lPTihTVEFfRFJJVkVSX1ZFUlNJT04pOwotI2VuZGlmCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotLy8KLS8vIE91ciBQQ0kgZHJpdmVyIHN0cnVjdHVyZQotLy8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBydDI4NjBfZHJpdmVyID0KLXsKLSAgICBuYW1lOiAgICAgICAicnQzMDkwIiwKLSAgICBpZF90YWJsZTogICBydDI4NjBfcGNpX3RibCwKLSAgICBwcm9iZTogICAgICBydDI4NjBfcHJvYmUsCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MTIKLSAgICByZW1vdmU6ICAgICBfX2RldmV4aXRfcChydDI4NjBfcmVtb3ZlX29uZSksCi0jZWxzZQotICAgIHJlbW92ZTogICAgIF9fZGV2ZXhpdChydDI4NjBfcmVtb3ZlX29uZSksCi0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNpZmRlZiBDT05GSUdfUE0KLQlzdXNwZW5kOglydDI4NjBfc3VzcGVuZCwKLQlyZXN1bWU6CQlydDI4NjBfcmVzdW1lLAotI2VuZGlmCi0jZW5kaWYKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCVBDSSBkZXZpY2UgaW5pdGlhbGl6YXRpb24gcmVsYXRlZCBwcm9jZWR1cmVzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotI2lmZGVmIENPTkZJR19QTQotCi1WT0lEIFJUMjg2MFJlamVjdFBlbmRpbmdQYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotCS8vIGNsZWFyIFBTIHBhY2tldHMKLQkvLyBjbGVhciBUeFN3IHBhY2tldHMKLX0KLQotc3RhdGljIGludCBydDI4NjBfc3VzcGVuZCgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUilOVUxMOwotCUlOVDMyIHJldHZhbCA9IDA7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCi0JaWYgKG5ldF9kZXYgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5ldF9kZXYgPT0gTlVMTCFcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFkID0gKFBSVE1QX0FEQVBURVIpUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQkJLyogd2UgY2FuIG5vdCB1c2UgSUZGX1VQIGJlY2F1c2UgcmEwIGRvd24gYnV0IHJhMSB1cCAqLwotCQkvKiBhbmQgMSBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbiBmb3IgMSBtb2R1bGUsIG5vdCBmb3IgZWFjaCBpbnRlcmZhY2UgKi8KLQkJLyogc28gTGludXggd2lsbCBjYWxsIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIG9uY2UgKi8KLQkJaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPiAwKQotCQl7Ci0JCQkvLyBhdm9pZCB1c2VycyBkbyBzdXNwZW5kIGFmdGVyIGludGVyZmFjZSBpcyBkb3duCi0KLQkJCS8vIHN0b3AgaW50ZXJmYWNlCi0JCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7Ci0KLQkJCS8vIG1hcmsgZGV2aWNlIGFzIHJlbW92ZWQgZnJvbSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBubyBsb25nZXIgYXZhaWxhYmxlCi0JCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOwotCi0JCQkvLyBtYXJrIGhhbHQgZmxhZwotCQkJUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYpOwotCi0JCQkvLyB0YWtlIGRvd24gdGhlIGRldmljZQotCQkJcnQyOHh4X2Nsb3NlKChQTkVUX0RFViluZXRfZGV2KTsKLQotCQkJUlRfTU9EX0RFQ19VU0VfQ09VTlQoKTsKLQkJfQotCX0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCi0JLy8gcmVmZXJlbmNlIHRvIGh0dHA6Ly92b3ZvMjAwMC5jb20vdHlwZS1sYWIvbGludXgva2VybmVsLWFwaS9saW51eC1rZXJuZWwtYXBpLmh0bWwKLQkvLyBlbmFibGUgZGV2aWNlIHRvIGdlbmVyYXRlIFBNRSMgd2hlbiBzdXNwZW5kZWQKLQkvLyBwY2lfY2hvb3NlX3N0YXRlKCk6IENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZAotCXJldHZhbCA9IHBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSwgMSk7Ci0JLy8gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKLQlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKLQkvLyBkaXNhYmxlIFBDSSBkZXZpY2UgYWZ0ZXIgdXNlCi0JcGNpX2Rpc2FibGVfZGV2aWNlKHBjaV9kZXYpOwotCi0JcmV0dmFsID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBjaV9kZXYsIHN0YXRlKSk7Ci0jZW5kaWYKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3N1c3BlbmQoKVxuIikpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcnQyODYwX3Jlc3VtZSgKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQotCUlOVDMyIHJldHZhbDsKLQotCi0JLy8gc2V0IHRoZSBwb3dlciBzdGF0ZSBvZiBhIFBDSSBkZXZpY2UKLQkvLyBQQ0kgaGFzIDQgcG93ZXIgc3RhdGVzLCBETyAobm9ybWFsKSB+IEQzKGxlc3MgcG93ZXIpCi0JLy8gaW4gaW5jbHVkZS9saW51eC9wY2kuaCwgeW91IGNhbiBmaW5kIHRoYXQKLQkvLyAjZGVmaW5lIFBDSV9EMCAgICAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDApCi0JLy8gI2RlZmluZSBQQ0lfRDEgICAgICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSAxKQotCS8vICNkZWZpbmUgUENJX0QyICAgICAgICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgMikKLQkvLyAjZGVmaW5lIFBDSV9EM2hvdCAgICAgICAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIDMpCi0JLy8gI2RlZmluZSBQQ0lfRDNjb2xkICAgICAgKChwY2lfcG93ZXJfdCBfX2ZvcmNlKSA0KQotCS8vICNkZWZpbmUgUENJX1VOS05PV04gICAgICgocGNpX3Bvd2VyX3QgX19mb3JjZSkgNSkKLQkvLyAjZGVmaW5lIFBDSV9QT1dFUl9FUlJPUiAoKHBjaV9wb3dlcl90IF9fZm9yY2UpIC0xKQotCXJldHZhbCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKLQotCS8vIHJlc3RvcmUgdGhlIHNhdmVkIHN0YXRlIG9mIGEgUENJIGRldmljZQotCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOwotCi0JLy8gaW5pdGlhbGl6ZSBkZXZpY2UgYmVmb3JlIGl0J3MgdXNlZCBieSBhIGRyaXZlcgotCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKLQl7Ci0JCXByaW50aygicGNpIGVuYWJsZSBmYWlsIVxuIik7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcmVzdW1lKClcbiIpKTsKLQotCWlmIChuZXRfZGV2ID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJuZXRfZGV2ID09IE5VTEwhXG4iKSk7Ci0JfQotCWVsc2UKLQkJcEFkID0gKFBSVE1QX0FEQVBURVIpUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQlpZiAocEFkICE9IE5VTEwpCi0JewotCQkvKiB3ZSBjYW4gbm90IHVzZSBJRkZfVVAgYmVjYXVzZSByYTAgZG93biBidXQgcmExIHVwICovCi0JCS8qIGFuZCAxIHN1c3BlbmQvcmVzdW1lIGZ1bmN0aW9uIGZvciAxIG1vZHVsZSwgbm90IGZvciBlYWNoIGludGVyZmFjZSAqLwotCQkvKiBzbyBMaW51eCB3aWxsIGNhbGwgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb24gb25jZSAqLwotCQlpZiAoVklSVFVBTF9JRl9OVU0ocEFkKSA+IDApCi0JCXsKLQkJCS8vIG1hcmsgZGV2aWNlIGFzIGF0dGFjaGVkIGZyb20gc3lzdGVtIGFuZCByZXN0YXJ0IGlmIG5lZWRlZAotCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRfZGV2KTsKLQotCQkJaWYgKHJ0Mjh4eF9vcGVuKChQTkVUX0RFViluZXRfZGV2KSAhPSAwKQotCQkJewotCQkJCS8vIG9wZW4gZmFpbAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Jlc3VtZSgpXG4iKSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKLQkJCVJUX01PRF9JTkNfVVNFX0NPVU5UKCk7Ci0KLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0JCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRik7Ci0KLQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOwotCQkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQkJCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7Ci0JCX0KLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IHJ0Mjg2MF9yZXN1bWUoKVxuIikpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8vIENPTkZJR19QTSAvLwotI2VuZGlmCi0KLQotc3RhdGljIElOVCBfX2luaXQgcnQyODYwX2luaXRfbW9kdWxlKFZPSUQpCi17Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLSNlbHNlCi0gICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcnQyODYwX2RyaXZlcik7Ci0jZW5kaWYKLX0KLQotCi0vLwotLy8gRHJpdmVyIG1vZHVsZSB1bmxvYWQgZnVuY3Rpb24KLS8vCi1zdGF0aWMgVk9JRCBfX2V4aXQgcnQyODYwX2NsZWFudXBfbW9kdWxlKFZPSUQpCi17Ci0gICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZydDI4NjBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocnQyODYwX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHJ0Mjg2MF9jbGVhbnVwX21vZHVsZSk7Ci0KLQotLy8KLS8vIFBDSSBkZXZpY2UgcHJvYmUgJiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgotLy8KLXN0YXRpYyBJTlQgX19kZXZpbml0ICAgcnQyODYwX3Byb2JlKAotICAgIElOICBzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAgKnBjaV9kZXYsCi0gICAgSU4gIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICAqcGNpX2lkKQotewotCVBSVE1QX0FEQVBURVIJCXBBZCA9IChQUlRNUF9BREFQVEVSKU5VTEw7Ci0Jc3RydWN0ICBuZXRfZGV2aWNlCQkqbmV0X2RldjsKLQlQVk9JRAkJCQloYW5kbGU7Ci0JUFNUUklORwkJCQlwcmludF9uYW1lOwotCVVMT05HCQkJCWNzcl9hZGRyOwotCUlOVCBydiA9IDA7Ci0JUlRNUF9PU19ORVRERVZfT1BfSE9PSwluZXREZXZIb29rOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PiBydDI4NjBfcHJvYmVcbiIpKTsKLQotLy9QQ0lEZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8vIHdha2UgdXAgYW5kIGVuYWJsZSBkZXZpY2UKLQlpZiAoKHJ2ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIT0gMCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkVuYWJsZSBQQ0kgZGV2aWNlIGZhaWxlZCwgZXJybm89JWQhXG4iLCBydikpOwotCQlyZXR1cm4gcnY7Ci0JfQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXByaW50X25hbWUgPSBwY2lfZGV2ID8gcGNpX25hbWUocGNpX2RldikgOiAicnQzMDkwIjsKLSNlbHNlCi0JcHJpbnRfbmFtZSA9IHBjaV9kZXYgPyBwY2lfZGV2LT5zbG90X25hbWUgOiAicnQzMDkwIjsKLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLQotCWlmICgocnYgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBjaV9kZXYsIHByaW50X25hbWUpKSAhPSAwKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVxdWVzdCBQQ0kgcmVzb3VyY2UgZmFpbGVkLCBlcnJubz0lZCFcbiIsIHJ2KSk7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQkvLyBtYXAgcGh5c2ljYWwgYWRkcmVzcyB0byB2aXJ0dWFsIGFkZHJlc3MgZm9yIGFjY2Vzc2luZyByZWdpc3RlcgotCWNzcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQlpZiAoIWNzcl9hZGRyKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiaW9yZW1hcCBmYWlsZWQgZm9yIGRldmljZSAlcywgcmVnaW9uIDB4JWxYIEAgMHglbFhcbiIsCi0JCQkJCXByaW50X25hbWUsIChVTE9ORylwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApLCAoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApKSk7Ci0JCWdvdG8gZXJyX291dF9mcmVlX3JlczsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6IGF0IDB4JWx4LCBWQSAweCVseCwgSVJRICVkLiBcbiIsICBwcmludF9uYW1lLAotCQkJCQkoVUxPTkcpcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCAoVUxPTkcpY3NyX2FkZHIsIHBjaV9kZXYtPmlycSkpOwotCX0KLQotCS8vIFNldCBETUEgbWFzdGVyCi0JcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7Ci0KLQotLy9SdG1wRGV2SW5pdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBBbGxvY2F0ZSBSVE1QX0FEQVBURVIgYWRhcHRlciBzdHJ1Y3R1cmUKLQloYW5kbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NfY29va2llKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGhhbmRsZSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTogQWxsb2NhdGUgbWVtb3J5IGZvciBvcyBoYW5kbGUgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCWdvdG8gZXJyX291dF9pb3VubWFwOwotCX0KLQotCSgoUE9TX0NPT0tJRSloYW5kbGUpLT5wY2lfZGV2ID0gcGNpX2RldjsKLQotCXJ2ID0gUlRNUEFsbG9jQWRhcHRlckJsb2NrKGhhbmRsZSwgJnBBZCk7CS8vc2hpYW5nOiB3ZSBtYXkgbmVlZCB0aGUgcGNpX2RldiBmb3IgYWxsb2NhdGUgc3RydWN0dXJlIG9mICJSVE1QX0FEQVBURVIiCi0JaWYgKHJ2ICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gZXJyX291dF9pb3VubWFwOwotCS8vIEhlcmUgYXJlIHRoZSBSVE1QX0FEQVBURVIgc3RydWN0dXJlIHdpdGggcGNpLWJ1cyBzcGVjaWZpYyBwYXJhbWV0ZXJzLgotCXBBZC0+Q1NSQmFzZUFkZHJlc3MgPSAoUFVDSEFSKWNzcl9hZGRyOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoInBBZC0+Q1NSQmFzZUFkZHJlc3MgPTB4JWx4LCBjc3JfYWRkcj0weCVseCFcbiIsIChVTE9ORylwQWQtPkNTUkJhc2VBZGRyZXNzLCBjc3JfYWRkcikpOwotCVJ0bXBSYURldkN0cmxJbml0KHBBZCwgUlRNUF9ERVZfSU5GX1BDSSk7Ci0KLQotLy9OZXREZXZJbml0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCW5ldF9kZXYgPSBSdG1wUGh5TmV0RGV2SW5pdChwQWQsICZuZXREZXZIb29rKTsKLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCQlnb3RvIGVycl9vdXRfZnJlZV9yYWRldjsKLQotCS8vIEhlcmUgYXJlIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aXRoIHBjaS1idXMgc3BlY2lmaWMgcGFyYW1ldGVycy4KLQluZXRfZGV2LT5pcnEgPSBwY2lfZGV2LT5pcnE7CQkvLyBJbnRlcnJ1cHQgSVJRIG51bWJlcgotCW5ldF9kZXYtPmJhc2VfYWRkciA9IGNzcl9hZGRyOwkJLy8gU2F2ZSBDU1IgdmlydHVhbCBhZGRyZXNzIGFuZCBpcnEgdG8gZGV2aWNlIHN0cnVjdHVyZQotCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBuZXRfZGV2KTsJLy8gU2V0IGRyaXZlciBkYXRhCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotLyogZm9yIHN1cHBvcnRpbmcgTmV0d29yayBNYW5hZ2VyICovCi0JLyogU2V0IHRoZSBzeXNmcyBwaHlzaWNhbCBkZXZpY2UgcmVmZXJlbmNlIGZvciB0aGUgbmV0d29yayBsb2dpY2FsIGRldmljZQotCSAgKiBpZiBzZXQgcHJpb3IgdG8gcmVnaXN0cmF0aW9uIHdpbGwgY2F1c2UgYSBzeW1saW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi4KLQkgKi8KLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKLQlTRVRfTkVUREVWX0RFVihuZXRfZGV2LCAmKHBjaV9kZXYtPmRldikpOwotI2VuZGlmCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0vL0FsbCBkb25lLCBpdCdzIHRpbWUgdG8gcmVnaXN0ZXIgdGhlIG5ldCBkZXZpY2UgdG8gbGludXgga2VybmVsLgotCS8vIFJlZ2lzdGVyIHRoaXMgZGV2aWNlCi0JcnYgPSBSdG1wT1NOZXREZXZBdHRhY2gobmV0X2RldiwgJm5ldERldkhvb2spOwotCWlmIChydikKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JcEFkLT5TdGFDZmcuT3JpRGV2VHlwZSA9IG5ldF9kZXYtPnR5cGU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi1SVE1QSW5pdFBDSWVEZXZpY2UocGNpX2RldiwgcEFkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyODYwX3Byb2JlXG4iKSk7Ci0KLQlyZXR1cm4gMDsgLy8gcHJvYmUgb2sKLQotCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVSUk9SIEhBTkRMRSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLWVycl9vdXRfZnJlZV9uZXRkZXY6Ci0JUnRtcE9TTmV0RGV2RnJlZShuZXRfZGV2KTsKLQotZXJyX291dF9mcmVlX3JhZGV2OgotCS8qIGZyZWUgUlRNUF9BREFQVEVSIHN0cmN1dHVyZSBhbmQgb3NfY29va2llKi8KLQlSVE1QRnJlZUFkYXB0ZXIocEFkKTsKLQotZXJyX291dF9pb3VubWFwOgotCWlvdW5tYXAoKHZvaWQgKikoY3NyX2FkZHIpKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApKTsKLQotZXJyX291dF9mcmVlX3JlczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOwotCi1lcnJfb3V0OgotCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIjw9PT0gcnQyODYwX3Byb2JlIGZhaWxlZCB3aXRoIHJ2ID0gJWQhXG4iLCBydikpOwotCi0JcmV0dXJuIC1FTk9ERVY7IC8qIHByb2JlIGZhaWwgKi8KLX0KLQotCi1zdGF0aWMgVk9JRCBfX2RldmV4aXQgcnQyODYwX3JlbW92ZV9vbmUoCi0gICAgSU4gIHN0cnVjdCBwY2lfZGV2ICAqcGNpX2RldikKLXsKLQlQTkVUX0RFVgluZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCVJUTVBfQURBUFRFUgkqcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JVUxPTkcJCQljc3JfYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsgLy8gcEFkLT5DU1JCYXNlQWRkcmVzczsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyODYwX3JlbW92ZV9vbmVcbiIpKTsKLQotCWlmIChwQWQgIT0gTlVMTCkKLQl7Ci0JCS8vIFVucmVnaXN0ZXIvRnJlZSBhbGwgYWxsb2NhdGVkIG5ldF9kZXZpY2UuCi0JCVJ0bXBQaHlOZXREZXZFeGl0KHBBZCwgbmV0X2Rldik7Ci0KLQkJLy8gVW5tYXAgQ1NSIGJhc2UgYWRkcmVzcwotCQlpb3VubWFwKChjaGFyICopKGNzcl9hZGRyKSk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCi0JCS8vIEZyZWUgUlRNUF9BREFQVEVSIHJlbGF0ZWQgc3RydWN0dXJlcy4KLQkJUnRtcFJhRGV2Q3RybEV4aXQocEFkKTsKLQotCX0KLQllbHNlCi0JewotCQkvLyBVbnJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlCi0JCVJ0bXBPU05ldERldkRldGFjaChuZXRfZGV2KTsKLQotCQkvLyBVbm1hcCBDU1IgYmFzZSBhZGRyZXNzCi0JCWlvdW5tYXAoKGNoYXIgKikobmV0X2Rldi0+YmFzZV9hZGRyKSk7Ci0KLQkJLy8gcmVsZWFzZSBtZW1vcnkgcmVnaW9uCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOwotCX0KLQotCS8vIEZyZWUgdGhlIHJvb3QgbmV0X2RldmljZQotCVJ0bXBPU05ldERldkZyZWUobmV0X2Rldik7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENoZWNrIHRoZSBjaGlwc2V0IHZlbmRvci9wcm9kdWN0IElELgotCi1Bcmd1bWVudHM6Ci0gICAgX2Rldl9wCQkJCVBvaW50IHRvIHRoZSBQQ0kgb3IgVVNCIGRldmljZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgVFJVRQkJCQlDaGVjayBvawotCUZBTFNFCQkJCUNoZWNrIGZhaWwKLQotTm90ZToKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCkKLXsKLQkvKiBhbHdheXMgVFJVRSAqLwotCXJldHVybiBUUlVFOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCVBDSWUgZGV2aWNlIGluaXRpYWxpemF0aW9uIHJlbGF0ZWQgcHJvY2VkdXJlcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHN0YXRpYyBWT0lEIFJUTVBJbml0UENJZURldmljZSgKLSAgICBJTiAgc3RydWN0IHBjaV9kZXYgICAqcGNpX2RldiwKLSAgICBJTiBQUlRNUF9BREFQVEVSICAgICBwQWQpCi17Ci0JVVNIT1JUICBkZXZpY2VfaWQ7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKLQlkZXZpY2VfaWQgPSBsZTJjcHUxNihkZXZpY2VfaWQpOwotCXBPYmotPkRldmljZUlEID0gZGV2aWNlX2lkOwotCWlmICgKLSNpZmRlZiBSVDMwOTAKLQkJKGRldmljZV9pZCA9PSBOSUMzMDkwX1BDSWVfREVWSUNFX0lEKSB8fAotCQkoZGV2aWNlX2lkID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpIHx8Ci0JCShkZXZpY2VfaWQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkgfHwKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQkJIDApCi0JewotCQlVSU5UMzIgTWFjQ3NyMCA9IDAsIEluZGV4PSAwOwotCQlkbwotCQl7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19DU1IwLCAmTWFjQ3NyMCk7Ci0KLQkJCWlmICgoTWFjQ3NyMCAhPSAweDAwKSAmJiAoTWFjQ3NyMCAhPSAweEZGRkZGRkZGKSkKLQkJCQlicmVhazsKLQotCQkJUlRNUHVzZWNEZWxheSgxMCk7Ci0JCX0gd2hpbGUgKEluZGV4KysgPCAxMDApOwotCi0JCS8vIFN1cHBvcnQgYWR2YW5jZWQgcG93ZXIgc2F2ZSBhZnRlciAyODkyLzI3OTAuCi0JCS8vIE1BQyB2ZXJzaW9uIGF0IG9mZnNldCAweDEwMDAgaXMgMHgyODcyWFhYWC8weDI4NzBYWFhYKFBDSWUsIFVTQiwgU0RJTykuCi0JCWlmICgoTWFjQ3NyMCYweGZmZmYwMDAwKSAhPSAweDI4NjAwMDAwKQotCQl7Ci0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBJbml0UENJZUxpbmtDdHJsVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0gICAgSU5UICAgICBwb3M7Ci0gICAgVVNIT1JUCXJlZzE2LCBkYXRhMiwgUENJZVBvd2VyU2F2ZUxldmVsLCBDb25maWd1cmF0aW9uOwotCVVJTlQzMiBNYWNWYWx1ZTsKLSAgICBCT09MRUFOCWJGaW5kSW50ZWwgPSBGQUxTRTsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJcmV0dXJuOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JLy8gSW5pdCBFRVBST00sIGFuZCBzYXZlIHNldHRpbmdzCi0JaWYgKCEoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpKQotCXsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDIyLCBQQ0llUG93ZXJTYXZlTGV2ZWwpOwotCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9IFBDSWVQb3dlclNhdmVMZXZlbCAmIDB4ZmY7Ci0JCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOwotCQlpZiAoKFBDSWVQb3dlclNhdmVMZXZlbCYweGZmKSA9PSAweGZmKQotCQl7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBQQ0llUG93ZXJTYXZlTGV2ZWwgPSAweCV4LlxuIiwgUENJZVBvd2VyU2F2ZUxldmVsKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQllbHNlCi0JewotCQlQQ0llUG93ZXJTYXZlTGV2ZWwgJj0gMHgzOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKLQotCQlpZiggISgoKGRhdGEyJjB4ZmYwMCkgPT0gMHg5MjAwKSAmJiAoKGRhdGEyJjB4ODApICE9MCkpICkKLQkJewotCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEgKQotCQkJCVBDSWVQb3dlclNhdmVMZXZlbCA9IDE7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBXcml0ZSAweDgzID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsIChVQ0hBUilQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjIsIFBDSWVQb3dlclNhdmVMZXZlbCk7Ci0JCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweGZmOwotCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBQQ0llUG93ZXJTYXZlTGV2ZWwgPj4gNjsKLQkJc3dpdGNoKFBDSWVQb3dlclNhdmVMZXZlbCkKLQkJewotCQkJCWNhc2UgMDoJLy8gT25seSBzdXBwb3J0IEwwCi0JCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAwOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgMToJLy8gT25seSBlbmFibGUgTDBzCi0JCQkJCXBBZC0+TG5rQ3RybEJpdE1hc2sgPSAxOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoJLy8gZW5hYmxlIEwxLCBMMHMKLQkJCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgkvLyBzeW5jIHdpdGggaG9zdCBjbGsgYW5kIGVuYWJsZSBMMSwgTDBzCi0JCQkJcEFkLT5MbmtDdHJsQml0TWFzayA9IDB4MTAzOwotCQkJCWJyZWFrOwotCQl9Ci0JCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIDB4MjQsIGRhdGEyKTsKLQkJCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsJjB4ZmYpICE9IDB4ZmYpCi0JCQl7Ci0JCQkJUENJZVBvd2VyU2F2ZUxldmVsICY9IDB4MzsKLQotCQkJCWlmKCAhKCgoZGF0YTImMHhmZjAwKSA9PSAweDkyMDApICYmICgoZGF0YTImMHg4MCkgIT0wKSkgKQotCQkJCXsKLQkJCQkJaWYgKFBDSWVQb3dlclNhdmVMZXZlbCA+IDEgKQotCQkJCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQkJCQl9Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBydDI4eHggV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCQkJCQkgICAgICAgcHJpbnRrKCJcblxuXG4lczolZFxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOwotCi0JCQkJQXNpY1NlbmRDb21tYW5kVG9NY3UocEFkLCAweDgzLCAweGZmLCAoVUNIQVIpUENJZVBvd2VyU2F2ZUxldmVsLCAweDAwKTsKLQkJCX0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gTG5rQ3RybEJpdE1hc2sgPSAweCV4LlxuIiwgcEFkLT5MbmtDdHJsQml0TWFzaykpOwotCX0KLQl9Ci0JZWxzZSBpZiAoSVNfUlQzMDkwKHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkgfHwgSVNfUlQzMzkwKHBBZCkpCi0JewotCQlVQ0hBUglMaW5rQ3RybFNldHRpbmcgPSAwOwotCi0JCS8vIENoZWNrIDMwOTBFIHNwZWNpYWwgc2V0dGluZyBjaGlwLgotCQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAweDI0LCBkYXRhMik7Ci0JCWlmICgoZGF0YTIgPT0gMHg5MjgwKSAmJiAoKHBBZC0+TUFDVmVyc2lvbiYweGZmZmYpID09IDB4MDIxMSkpCi0JCXsKLQkJCXBBZC0+YjMwOTBFU3BlY2lhbENoaXAgPSBUUlVFOwotCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiU3BlY2lhbCAzMDkwRSBjaGlwIFxuIikpOwotCQl9Ci0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBBVVhfQ1RSTCwgJk1hY1ZhbHVlKTsKLQkJLy9lbmFibGUgV0FLRV9QQ0lFIGZ1bmN0aW9uLCB3aGljaCBmb3JjZXMgdG8gZW5hYmxlIFBDSUUgY2xvY2sgd2hlbiBtcHUgaW50ZXJydXB0IGFzc2VydGluZy4KLQkJLy9Gb3JjZSBQQ0lFIDEyNU1IeiBDTEsgdG8gdG9nZ2xlCi0JCU1hY1ZhbHVlIHw9IDB4NDAyOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBBVVhfQ1RSTCwgTWFjVmFsdWUpOwotCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgQVVYX0NUUkwgPSAweCUzMnhcbiIsIE1hY1ZhbHVlKSk7Ci0KLQotCi0JCS8vIGZvciBSVDMweHggRiBhbmQgYWZ0ZXIsIFBDSWUgaW5mdGVyZmFjZSwgYW5kIGZvciBwb3dlciBzb2x1dGlvbiAzCi0JCWlmICgoSVNfVkVSU0lPTl9BRlRFUl9GKHBBZCkpCi0JCQkmJiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eFBvd2VyTW9kZSA+PSAyKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPD0gMykpCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgQVVYX0NUUkwsICZNYWNWYWx1ZSk7Ci0JCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgUmVhZCBBVVhfQ1RSTCA9IDB4JXhcbiIsIE1hY1ZhbHVlKSk7Ci0JCQkvLyB0dXJuIG9uIGJpdCAxMi4KLQkJCS8vZW5hYmxlIDMyS0h6IGNsb2NrIG1vZGUgZm9yIHBvd2VyIHNhdmluZwotCQkJTWFjVmFsdWUgfD0gMHgxMDAwOwotCQkJaWYgKE1hY1ZhbHVlICE9IDB4ZmZmZmZmZmYpCi0JCQl7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgQVVYX0NUUkwsIE1hY1ZhbHVlKTsKLQkJCQlEQkdQUklOVF9SQVcoUlRfREVCVUdfRVJST1IsKCIgV3JpdGUgQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOwotCQkJCS8vIDEuIGlmIHVzZSBQQ0llUG93ZXJTZXR0aW5nIGlzIDIgb3IgMywgbmVlZCB0byBwcm9ncmFtIE9TQ19DVFJMIHRvIDB4M2ZmMTEuCi0JCQkJTWFjVmFsdWUgPSAweDNmZjExOwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE9TQ19DVFJMLCBNYWNWYWx1ZSk7Ci0JCQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiIE9TQ19DVFJMID0gMHgleFxuIiwgTWFjVmFsdWUpKTsKLQkJCQkvLyAyLiBXcml0ZSBQQ0kgcmVnaXN0ZXIgQ2xrIHJlZiBiaXQKLQkJCQlSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKHBBZCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gRXJyb3IgcmVhZCBBdXhfQ3RybCB2YWx1ZS4gIEZvcmNlIHRvIHVzZSBzb2x1dGlvbiAxCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIgRXJyb3IgVmFsdWUgaW4gQVVYX0NUUkwgPSAweCV4XG4iLCBNYWNWYWx1ZSkpOwotCQkJCXBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhQb3dlck1vZGUgPSAxOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiIEZvcmNlIHRvIHVzZSBwb3dlciBzb2x1dGlvbjEgXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gMS4gcmVhZCBzZXR0aW5nIGZyb20gaW5mIGZpbGUuCi0KLQkJUENJZVBvd2VyU2F2ZUxldmVsID0gKFVTSE9SVClwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQucnQzMHh4UG93ZXJNb2RlOwotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI9PT09PiBydDMweHggUmVhZCBQb3dlckxldmVsTW9kZSA9ICAweCV4LlxuIiwgUENJZVBvd2VyU2F2ZUxldmVsKSk7Ci0JCS8vIDIuIENoZWNrIEVuYWJsZU5ld1BTLgotCQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQotCQlpZiAoSVNfVkVSU0lPTl9CRUZPUkVfRihwQWQpICYmIChwQWQtPmIzMDkwRVNwZWNpYWxDaGlwID09IEZBTFNFKSkKLQkJewotCQkJLy8gQ2hpcCBWZXJzaW9uIEUgb25seSBhbGxvdyAxLCBTbyBmb3JjZSBzZXQgMS4KLQkJCVBDSWVQb3dlclNhdmVMZXZlbCAmPSAweDE7Ci0JCQlwQWQtPlBDSWVQb3dlclNhdmVMZXZlbCA9IChVU0hPUlQpUENJZVBvd2VyU2F2ZUxldmVsOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PT4gcnQzMHh4IEUgV3JpdGUgMHg4MyBDb21tYW5kID0gMHgleC5cbiIsIFBDSWVQb3dlclNhdmVMZXZlbCkpOwotCi0JCQlBc2ljU2VuZENvbW1hbmRUb01jdShwQWQsIDB4ODMsIDB4ZmYsIChVQ0hBUilQQ0llUG93ZXJTYXZlTGV2ZWwsIDB4MDApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gQ2hpcCBWZXJzaW9uIEYgYW5kIGFmdGVyIG9ubHkgYWxsb3cgMSBvciAyIG9yIDMuIFRoaXMgbWlnaHQgYmUgbW9kaWZpZWQgYWZ0ZXIgbmV3IGNoaXAgdmVyc2lvbiBjb21lIG91dC4KLQkJCWlmICghKChQQ0llUG93ZXJTYXZlTGV2ZWwgPT0gMSkgfHwgKFBDSWVQb3dlclNhdmVMZXZlbCA9PSAzKSkpCi0JCQkJUENJZVBvd2VyU2F2ZUxldmVsID0gMTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PT0+IHJ0MzB4eCBGIFdyaXRlIDB4ODMgQ29tbWFuZCA9IDB4JXguXG4iLCBQQ0llUG93ZXJTYXZlTGV2ZWwpKTsKLQkJCXBBZC0+UENJZVBvd2VyU2F2ZUxldmVsID0gKFVTSE9SVClQQ0llUG93ZXJTYXZlTGV2ZWw7Ci0JCQkvLyBmb3IgMzA5MEYgLCB3ZSBuZWVkIHRvIGFkZCBoaWdoLWJ5dGUgYXJnIGZvciAweDgzIGNvbW1hbmQgdG8gaW5kaWNhdGUgdGhlIGxpbmsgY29udHJvbCBzZXR0aW5nIGluCi0JCQkvLyBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZS4gQmVjYXVzZSBmaXJtd2FyZSBjYW4ndCByZWFkIFBDSSBDb25maWd1cmF0aW9uIFNwYWNlCi0JCQlpZiAoKHBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCAmIDB4MikgJiYgKHBBZC0+UnQzeHhIb3N0TGlua0N0cmwgJiAweDIpKQotCQkJewotCQkJCUxpbmtDdHJsU2V0dGluZyA9IDE7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBydDMweHhGIExpbmtDdHJsU2V0dGluZyA9IDB4JXguXG4iLCBMaW5rQ3RybFNldHRpbmcpKTsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHg4MywgMHhmZiwgKFVDSEFSKVBDSWVQb3dlclNhdmVMZXZlbCwgTGlua0N0cmxTZXR0aW5nKTsKLQkJfQotCi0JfQotCi0gICAgLy8gRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0KLSAgICBpZiAocG9zICE9IDApCi0gICAgewotICAgICAgICAvLyBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0Ci0gICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKLQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCAmcmVnMTYpOwotICAgICAgICBDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZWFkIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgcEFkLT5STG5rQ3RybENvbmZpZ3VyYXRpb24gPSAoQ29uZmlndXJhdGlvbiAmIDB4MTAzKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gfD0gKDB4MCk7Ci0KLSAgICAgICAgUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7Ci0gICAgICAgIGlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikKLSAgICAgICAgewotCQlVU0hPUlQgIHZlbmRvcl9pZDsKLQotCQlwY2lfcmVhZF9jb25maWdfd29yZChwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX1ZFTkRPUl9JRCwgJnZlbmRvcl9pZCk7Ci0JCXZlbmRvcl9pZCA9IGxlMmNwdTE2KHZlbmRvcl9pZCk7Ci0JCWlmICh2ZW5kb3JfaWQgPT0gUENJQlVTX0lOVEVMX1ZFTkRPUikKLSAgICAgICAgICAgICAgICAgewotCQkJYkZpbmRJbnRlbCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1NFVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19UT0dHTEVfTDEpOwotICAgICAgICAgICAgICAgICB9Ci0JCS8qCi0JCWVsc2UgaWYgKCh2ZW5kb3JfaWQgPT0gUENJQlVTX0FNRF9WRU5ET1IxKQotCQkJCQkmJiAoRGV2aWNlSUQgPT0gMHg5NjAwMDAwMCkpCi0JCQkJewotCQkJCQkvL1ZlcmlmaWVkIDI3OTIgQXNwaXJlIDg1MzAgQU1EIE5CIChTMy9TNC9DQm9vdC9XQm9vdC9DaGFyaW90KSBieSBjdXN0b21lciBhbmQgb3Vyc2VsdmVzLgotCQkJCQkvLyBTbyB1c2UgTDEgVG9nZ2xlIG1ldGhvZCBpbiB0aGlzIE5CLgotCQkJYkZpbmRJbnRlbCA9IFRSVUU7Ci0JCQkJCVJUTVBfU0VUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1RPR0dMRV9MMSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSA6IEFzcGlyZSA4NTMwIEFNRCBOQi4gVXNlIEwxIFRvZ2dsZS4gXG4iKSk7Ci0JCQkJfQotCQkqLwotCQkvLyBGaW5kIFBDSS10by1QQ0kgQnJpZGdlIEV4cHJlc3MgQ2FwYWJpbGl0eSBPZmZzZXQKLQkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wYXJlbnRfcGNpX2RldiwgUENJX0NBUF9JRF9FWFApOwotCi0JCWlmIChwb3MgIT0gMCkKLQkJewotCQkJQk9PTEVBTgkJYkNoYW5nZSA9IEZBTFNFOwotCQkJLy8gUENJLXRvLVBDSSBCcmlkZ2UgTGluayBDb250cm9sIFJlZ2lzdGVyIE9mZnNldAotCQkJcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0JCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JCQlwQWQtPkhvc3RMbmtDdHJsQ29uZmlndXJhdGlvbiA9IChDb25maWd1cmF0aW9uICYgMHgxMDMpOwotCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQlDb25maWd1cmF0aW9uIHw9ICgweDApOwotCi0JCQlzd2l0Y2ggKHBPYmotPkRldmljZUlEKQotCQkJewotI2lmZGVmIFJUMzA5MAotCQkJCWNhc2UgTklDMzA5MF9QQ0llX0RFVklDRV9JRDoKLQkJCQljYXNlIE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQ6Ci0JCQkJY2FzZSBOSUMzMDkyX1BDSWVfREVWSUNFX0lEOgotCQkJCQlpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKLQkJCQkJCWJDaGFuZ2UgPSBUUlVFOwotCQkJCQlicmVhazsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGJDaGFuZ2UpCi0JCQl7Ci0JCQkJcmVnMTYgPSBjcHUybGUxNihDb25maWd1cmF0aW9uKTsKLQkJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsIHJlZzE2KTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcml0ZSAoSG9zdCBQQ0ktdG8tUENJIEJyaWRnZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSAwOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCBmaW5kIFBDSS10by1QQ0kgQnJpZGdlIFBDSSBFeHByZXNzIENhcGFiaWxpdHkhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQgPSAwOwotICAgICAgICBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ID0gMDsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCBmaW5kIFJhbGluayBQQ0llIERldmljZSdzIFBDSSBFeHByZXNzIENhcGFiaWxpdHkhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLSAgICB9Ci0KLSAgICBpZiAoYkZpbmRJbnRlbCA9PSBGQUxTRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRvZXNuJ3QgZmluZCBJbnRlbCBQQ0kgaG9zdCBjb250cm9sbGVyLiBcbiIpKTsKLQkJLy8gRG9lc24ndCBzd2l0Y2ggTDAsIEwxLCBTbyBzZXQgUENJZVBvd2VyU2F2ZUxldmVsIHRvIDB4ZmYKLQkJcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWwgPSAweGZmOwotCQlpZiAoKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkKLSNpZmRlZiBSVDMwOTAKLQkJCSYmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKLQkJCQl8fChwT2JqLT5EZXZpY2VJRCA9PSBOSUMzMDkxX1BDSWVfREVWSUNFX0lEKQotCQkJCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQotI2VuZGlmIC8vIFJUMzA5MCAvLwotCQkpCi0JCXsKLQkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0JCQlDb25maWd1cmF0aW9uID0gbGUyY3B1MTYocmVnMTYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoUmFsaW5rIDMweHggUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpIG9mZnNldCAweCV4ID0gMHgleFxuIiwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQkJCXBBZC0+Ukxua0N0cmxDb25maWd1cmF0aW9uID0gKENvbmZpZ3VyYXRpb24gJiAweDEwMyk7Ci0JCQlDb25maWd1cmF0aW9uICY9IDB4ZmVmYzsKLQkJCUNvbmZpZ3VyYXRpb24gfD0gKDB4MCk7Ci0JCQlyZWcxNiA9IGNwdTJsZTE2KENvbmZpZ3VyYXRpb24pOwotCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIHJlZzE2KTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyaXRlIChSYWxpbmsgUENJZSBMaW5rIENvbnRyb2wgUmVnaXN0ZXIpICBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgQ29uZmlndXJhdGlvbikpOwotCQl9Ci0JfQotfQotCi1WT0lEIFJUTVBGaW5kSG9zdFBDSURldigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLSAgICBVU0hPUlQgIHJlZzE2OwotICAgIFVDSEFSICAgcmVnODsKLQlVSU5UCURldkZuOwotICAgIFBQQ0lfREVWICAgIHBQY2lfZGV2OwotCVBPU19DT09LSUUJcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQlyZXR1cm47Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcy49PT0+XG4iLCBfX0ZVTkNUSU9OX18pKTsKLQotICAgIHBPYmotPnBhcmVudF9wY2lfZGV2ID0gTlVMTDsKLSAgICBpZiAocE9iai0+cGNpX2Rldi0+YnVzLT5wYXJlbnQpCi0gICAgewotICAgICAgICBmb3IgKERldkZuID0gMDsgRGV2Rm4gPCAyNTU7IERldkZuKyspCi0gICAgICAgIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCi0gICAgICAgICAgICBwUGNpX2RldiA9IHBjaV9nZXRfc2xvdChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudCwgRGV2Rm4pOwotI2Vsc2UKLSAgICAgICAgICAgIHBQY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChwT2JqLT5wY2lfZGV2LT5idXMtPnBhcmVudC0+bnVtYmVyLCBEZXZGbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChwUGNpX2RldikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfd29yZChwUGNpX2RldiwgUENJX0NMQVNTX0RFVklDRSwgJnJlZzE2KTsKLSAgICAgICAgICAgICAgICByZWcxNiA9IGxlMmNwdTE2KHJlZzE2KTsKLSAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwUGNpX2RldiwgUENJX0NCX0NBUkRfQlVTLCAmcmVnOCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZWcxNiA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHJlZzggPT0gcE9iai0+cGNpX2Rldi0+YnVzLT5udW1iZXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcE9iai0+cGFyZW50X3BjaV9kZXYgPSBwUGNpX2RldjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCi0JQXJndW1lbnRzOgotCQlMZXZlbCA9IFJFU1RPUkVfSEFMVCA6IFJlc3RvcmUgUENJIGhvc3QgYW5kIFJhbGluayBQQ0llIExpbmsgQ29udHJvbCBmaWVsZCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkJTGV2ZWwgPSBPdGhlciBWYWx1ZSA6IFJlc3RvcmUgZnJvbSBkb3QxMSBwb3dlciBzYXZlIG9yIHJhZGlvIG9mZiBzdGF0dXMuIEFuZCBmb3JjZSBQQ0kgaG9zdCBMaW5rIENvbnRyb2wgZmllbGRzIHRvIDB4MQotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgVUNIQVIJCUxldmVsKQotewotCVVTSE9SVCAgUENJZVBvd2VyU2F2ZUxldmVsLCByZWcxNjsKLQlVU0hPUlQJQ29uZmlndXJhdGlvbjsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJcmV0dXJuOwotCi0JLy8gQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24KLQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQlyZXR1cm4gVFJVRTsKLQotCS8vMzA5MCB3aWxsIG5vdCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29kZXMuCi0JLy8gQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uCi0KLSNpZmRlZiBSVDMwOTAKLQlpZiAoKHBPYmotPkRldmljZUlEID09IE5JQzMwOTBfUENJZV9ERVZJQ0VfSUQpCi0JCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTFfUENJZV9ERVZJQ0VfSUQpCi0JCXx8KHBPYmotPkRldmljZUlEID09IE5JQzMwOTJfUENJZV9ERVZJQ0VfSUQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMuPT09PlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JUENJZVBvd2VyU2F2ZUxldmVsID0gcEFkLT5QQ0llUG93ZXJTYXZlTGV2ZWw7Ci0JaWYgKChQQ0llUG93ZXJTYXZlTGV2ZWwmMHhmZikgPT0gMHhmZikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgicmV0dXJuICBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLSAgICB7Ci0gICAgICAgIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmCi0gICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKQotICAgICAgICB7Ci0JCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkvLyBJZiBjYWxsIGZyb20gaW50ZXJmYWNlIGRvd24sIHJlc3RvcmUgdG8gb3JnaW5pYWwgc2V0dGluZy4KLQkJaWYgKExldmVsID09IFJFU1RPUkVfQ0xPU0UpCi0JCXsKLQkJCUNvbmZpZ3VyYXRpb24gfD0gcEFkLT5Ib3N0TG5rQ3RybENvbmZpZ3VyYXRpb247Ci0JCX0KLQkJZWxzZQotCQkJQ29uZmlndXJhdGlvbiB8PSAweDA7Ci0gICAgICAgICAgICBQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGFyZW50X3BjaV9kZXYsIHBBZC0+SG9zdExua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSZXN0b3JlIFBDSSBob3N0IDogb2Zmc2V0IDB4JXggPSAweCV4XG4iLCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUmVzdG9yZSBQQ0kgaG9zdCA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLCBDb25maWd1cmF0aW9uKSk7Ci0gICAgfQotCi0gICAgaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpCi0gICAgewotICAgICAgICBQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLSAgICAgICAgaWYgKChDb25maWd1cmF0aW9uICE9IDApICYmCi0gICAgICAgICAgICAoQ29uZmlndXJhdGlvbiAhPSAweEZGRkYpKQotICAgICAgICB7Ci0JCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJLy8gSWYgY2FsbCBmcm9tIGludGVyZmFjZSBkb3duLCByZXN0b3JlIHRvIG9yZ2luaWFsIHNldHRpbmcuCi0JCQlpZiAoTGV2ZWwgPT0gUkVTVE9SRV9DTE9TRSkKLQkJQ29uZmlndXJhdGlvbiB8PSBwQWQtPlJMbmtDdHJsQ29uZmlndXJhdGlvbjsKLQkJCWVsc2UKLQkJCQlDb25maWd1cmF0aW9uIHw9IDB4MDsKLSAgICAgICAgICAgIFBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVzdG9yZSBSYWxpbmsgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJSZXN0b3JlIFJhbGluayA6IFBDSV9SRUdfUkVBRF9XT1JEIGZhaWxlZCAoQ29uZmlndXJhdGlvbiA9IDB4JXgpXG4iLCBDb25maWd1cmF0aW9uKSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcyA8PT09XG4iLCBfX0ZVTkNUSU9OX18pKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0KLQlBcmd1bWVudHM6Ci0JCU1heCA6IGxpbWl0IEhvc3QgUENJIGFuZCBSYWxpbmsgUENJZSBkZXZpY2UncyBMSU5LIENPTlRST0wgZmllbGQncyB2YWx1ZS4KLQkJQmVjYXVzZSBub3cgZnJlcXVlbnRseSBzZXQgb3VyIGRldmljZSB0byBtb2RlIDEgb3IgbW9kZSAzIHdpbGwgY2F1c2UgcHJvYmxlbS4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFBDSWVMaW5rQ3RybFNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQlNYXgpCi17Ci0JVVNIT1JUICBQQ0llUG93ZXJTYXZlTGV2ZWwsIHJlZzE2OwotCVVTSE9SVAlDb25maWd1cmF0aW9uOwotCVBPU19DT09LSUUJcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQlyZXR1cm47Ci0KLQkvLyBDaGVjayBQU0NvbnRyb2wgQ29uZmlndXJhdGlvbgotCWlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCi0JCXJldHVybiBUUlVFOwotCi0JLy8gQ2hlY2sgaW50ZXJmYWNlIDogSWYgbm90IFBDSWUgaW50ZXJmYWNlLCByZXR1cm4uCi0JLy9CbG9jayAzMDkwIHRvIGVudGVyIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KLQotI2lmZGVmIFJUMzA5MAotCWlmICgocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MF9QQ0llX0RFVklDRV9JRCkKLQkJfHwocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5MV9QQ0llX0RFVklDRV9JRCkKLQkJfHwocE9iai0+RGV2aWNlSUQgPT0gTklDMzA5Ml9QQ0llX0RFVklDRV9JRCkpCi0JCXJldHVybjsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQlpZiAoIVJUTVBfVEVTVF9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywgKCJSVE1QUENJZVBvd2VyTGlua0N0cmwgcmV0dXJuIG9uIGZSVE1QX1BTX0NBTl9HT19TTEVFUCBmbGFnXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCIlcz09PT5cbiIsIF9fRlVOQ1RJT05fXykpOwotCVBDSWVQb3dlclNhdmVMZXZlbCA9IHBBZC0+UENJZVBvd2VyU2F2ZUxldmVsOwotCWlmICgoUENJZVBvd2VyU2F2ZUxldmVsJjB4ZmYpID09IDB4ZmYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInJldHVybiAgXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUENJZVBvd2VyU2F2ZUxldmVsID0gUENJZVBvd2VyU2F2ZUxldmVsPj42OwotCi0gICAgLy8gU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheQotCWlmIChwT2JqLT5wYXJlbnRfcGNpX2RldiAmJiAocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLQl7Ci0gICAgICAgIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJc3dpdGNoIChQQ0llUG93ZXJTYXZlTGV2ZWwpCi0JCXsKLQkJCWNhc2UgMDoKLQkJCQkvLyBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMAotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCS8vIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDAxCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJQ29uZmlndXJhdGlvbiB8PSAweDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJLy8gIFNldCBiMCBhbmQgYjEgb2YgTGlua0NvbnRyb2wgKGJvdGggMjg5MiBhbmQgUENJZSBicmlkZ2UpIHRvIDExCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7Ci0JCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgUENJX1JFR19XSVJURV9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3JpdGUgUENJIGhvc3Qgb2Zmc2V0IDB4JXggPSAweCV4XG4iLCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JfQotCi0JaWYgKHBPYmotPnBjaV9kZXYgJiYgKHBBZC0+Ukxua0N0cmxPZmZzZXQgIT0gMCkpCi0JewotCQkvLyBmaXJzdCAyODkyIGNoaXAgbm90IGFsbG93IHRvIGZyZXF1ZW50bHkgc2V0IG1vZGUgMy4gd2lsbCBjYXVzZSBoYW5nIHByb2JsZW0uCi0JCWlmIChQQ0llUG93ZXJTYXZlTGV2ZWwgPiBNYXgpCi0JCQlQQ0llUG93ZXJTYXZlTGV2ZWwgPSBNYXg7Ci0KLSAgICAgICAgUENJX1JFR19SRUFEX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbik7Ci0JCXN3aXRjaCAoUENJZVBvd2VyU2F2ZUxldmVsKQotCQl7Ci0JCQljYXNlIDA6Ci0JCQkJLy8gTm8gUENJIHBvd2VyIHNhZmUKLQkJCQkvLyBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAwMCAuCi0JCQkJQ29uZmlndXJhdGlvbiAmPSAweGZlZmM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJLy8gIEwwCi0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMDEgLgotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCS8vIEwwIGFuZCBMMQotCQkJCS8vICBTZXQgYjAgYW5kIGIxIG9mIExpbmtDb250cm9sIChib3RoIDI4OTIgYW5kIFBDSWUgYnJpZGdlKSB0byAxMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgzOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCQkJCS8vIEwwICwgTDEgYW5kIGNsb2NrIG1hbmFnZW1lbnQuCi0JCQkJLy8gU2V0IGIwIGFuZCBiMSBvZiBMaW5rQ29udHJvbCAoYm90aCAyODkyIGFuZCBQQ0llIGJyaWRnZSkgdG8gMTEgYW5kIGJpdCA4IG9mIExpbmtDb250cm9sIG9mIDI4OTIgdG8gMQotCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZWZjOwotCQkJCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDM7Ci0JCSAgICAgICAgICAgICAgcEFkLT5iUENJY2xrT2ZmID0gVFJVRTsKLQkJCQlicmVhazsKLQkJfQotICAgICAgICBQQ0lfUkVHX1dJUlRFX1dPUkQocE9iai0+cGNpX2RldiwgcEFkLT5STG5rQ3RybE9mZnNldCwgQ29uZmlndXJhdGlvbik7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIldyaXRlIFJhbGluayBkZXZpY2UgOiBvZmZzZXQgMHgleCA9IDB4JXhcbiIsIHBBZC0+Ukxua0N0cmxPZmZzZXQsIENvbmZpZ3VyYXRpb24pKTsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJUTVBQQ0llUG93ZXJMaW5rQ3RybCA8PT09PT09PT09PT09PT1cbiIpKTsKLX0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQkxLiBXcml0ZSBhIFBDSSByZWdpc3RlciBmb3IgcnQzMHh4IHBvd2VyIHNvbHV0aW9uIDMKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQotCVVMT05HCUhvc3RDb25maWd1cmF0aW9uOwotCVVMT05HCUNvbmZpZ3VyYXRpb247Ci0JVUxPTkcJVmVuZG9yOwotCVVMT05HCW9mZnNldDsKLQlQT1NfQ09PS0lFCXBPYmo7Ci0JSU5UICAgICBwb3M7Ci0JVVNIT1JUCXJlZzE2OwotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiUlRNUHJ0M3hTZXRQQ0llUG93ZXJMaW5rQ3RybC49PT0+ICV4XG4iLCBwQWQtPlN0YUNmZy5QU0NvbnRyb2wud29yZCkpOwotCi0JLy8gQ2hlY2sgUFNDb250cm9sIENvbmZpZ3VyYXRpb24KLQlpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLkVuYWJsZU5ld1BTID09IEZBTFNFKQotCQlyZXR1cm47Ci0JUlRNUEZpbmRIb3N0UENJRGV2KHBBZCk7Ci0gICAgICAgIGlmIChwT2JqLT5wYXJlbnRfcGNpX2RldikKLSAgICAgICAgewotCQlVU0hPUlQgIHZlbmRvcl9pZDsKLQkJLy8gRmluZCBQQ0ktdG8tUENJIEJyaWRnZSBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocE9iai0+cGFyZW50X3BjaV9kZXYsIFBDSV9DQVBfSURfRVhQKTsKLQotCQlpZiAocG9zICE9IDApCi0JCXsKLQkJCXBBZC0+SG9zdExua0N0cmxPZmZzZXQgPSBwb3MgKyBQQ0lfRVhQX0xOS0NUTDsKLQkJfQotCS8vIElmIGNvbmZpZ3VyYXJlZCB0byB0dXJuIG9uIEwxLgotCUhvc3RDb25maWd1cmF0aW9uID0gMDsKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBTQ29udHJvbC5maWVsZC5ydDMweHhGb3JjZUFTUE1UZXN0ID09IDEpCi0JCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkVudGVyLFBTTSA6IEZvcmNlIEFTUE0gXG4iKSk7Ci0KLQkJCS8vIFNraXAgbm9uLWV4aXN0IGRlaWNlIHJpZ2h0IGF3YXkKLQkJCWlmICgocEFkLT5Ib3N0TG5rQ3RybE9mZnNldCAhPSAwKSkKLQkJCXsKLQkJCSBQQ0lfUkVHX1JFQURfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgSG9zdENvbmZpZ3VyYXRpb24pOwotCQkJCS8vIFByZXBhcmUgQ29uZmlndXJhdGlvbiB0byB3cml0ZSB0byBIb3N0Ci0JCQkJSG9zdENvbmZpZ3VyYXRpb24gfD0gMHgzOwotCQkJCVBDSV9SRUdfV0lSVEVfV09SRChwT2JqLT5wYXJlbnRfcGNpX2RldiwgcEFkLT5Ib3N0TG5rQ3RybE9mZnNldCwgSG9zdENvbmZpZ3VyYXRpb24pOwotCQkJCXBBZC0+UnQzeHhIb3N0TGlua0N0cmwgPSBIb3N0Q29uZmlndXJhdGlvbjsKLQkJCQkvLyBCZWNhdXNlIGluIHJ0MzB4eEZvcmNlQVNQTVRlc3QgTW9kZSwgRm9yY2UgdHVybiBvbiBMMHMsIEwxLgotCQkJCS8vIEZpeCBIb3N0Q29uZmlndXJhdGlvbiBiaXQwOjEgPSAweDMgZm9yIGxhdGVyIHVzZS4KLQkJCQlIb3N0Q29uZmlndXJhdGlvbiA9IDB4MzsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOiBGb3JjZSBBU1BNIDogSG9zdCBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JXhcbiIsIEhvc3RDb25maWd1cmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID09IDEpCi0JCXsKLQotCQkJLy8gU2tpcCBub24tZXhpc3QgZGVpY2UgcmlnaHQgYXdheQotCQkJaWYgKChwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0ICE9IDApKQotCQkJewotCQkJIFBDSV9SRUdfUkVBRF9XT1JEKHBPYmotPnBhcmVudF9wY2lfZGV2LCBwQWQtPkhvc3RMbmtDdHJsT2Zmc2V0LCBIb3N0Q29uZmlndXJhdGlvbik7Ci0JCQkJcEFkLT5SdDN4eEhvc3RMaW5rQ3RybCA9IEhvc3RDb25maWd1cmF0aW9uOwotCQkJCUhvc3RDb25maWd1cmF0aW9uICY9IDB4MzsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQU00gOiBGb2xsb3cgSG9zdCBBU1BNIDogSG9zdCBkZXZpY2UgTDEvTDBzIFZhbHVlID0gIDB4JXhcbiIsIEhvc3RDb25maWd1cmF0aW9uKSk7Ci0JCQl9Ci0JCX0KLSAgICAgICAgfQotCS8vIFByZXBhcmUgdG8gd3JpdGUgUmFsaW5rIHNldHRpbmcuCi0JLy8gRmluZCBSYWxpbmsgUENJZSBEZXZpY2UncyBFeHByZXNzIENhcGFiaWxpdHkgT2Zmc2V0Ci0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwT2JqLT5wY2lfZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7Ci0KLSAgICBpZiAocG9zICE9IDApCi0gICAgewotICAgICAgICAvLyBSYWxpbmsgUENJZSBEZXZpY2UncyBMaW5rIENvbnRyb2wgUmVnaXN0ZXIgT2Zmc2V0Ci0gICAgICAgcEFkLT5STG5rQ3RybE9mZnNldCA9IHBvcyArIFBDSV9FWFBfTE5LQ1RMOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBPYmotPnBjaV9kZXYsIHBBZC0+Ukxua0N0cmxPZmZzZXQsICZyZWcxNik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb24gPSBsZTJjcHUxNihyZWcxNik7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmVhZCAoUmFsaW5rIFBDSWUgTGluayBDb250cm9sIFJlZ2lzdGVyKSBvZmZzZXQgMHgleCA9IDB4JXhcbiIsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlJMbmtDdHJsT2Zmc2V0LCBDb25maWd1cmF0aW9uKSk7Ci0JCUNvbmZpZ3VyYXRpb24gfD0gMHgxMDA7Ci0JCWlmICgocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvbGxvd0hvc3RBU1BNID09IDEpCi0JCQl8fCAocEFkLT5TdGFDZmcuUFNDb250cm9sLmZpZWxkLnJ0MzB4eEZvcmNlQVNQTVRlc3QgPT0gMSkpCi0JCXsKLQkJCXN3aXRjaChIb3N0Q29uZmlndXJhdGlvbikKLQkJCXsKLQkJCQljYXNlIDA6Ci0JCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCUNvbmZpZ3VyYXRpb24gJj0gMHhmZmZmZmZjOwotCQkJCQlDb25maWd1cmF0aW9uIHw9IDB4MTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQlDb25maWd1cmF0aW9uICY9IDB4ZmZmZmZmYzsKLQkJCQkJQ29uZmlndXJhdGlvbiB8PSAweDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJQ29uZmlndXJhdGlvbiB8PSAweDM7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZzE2ID0gY3B1MmxlMTYoQ29uZmlndXJhdGlvbik7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChwT2JqLT5wY2lfZGV2LCBwQWQtPlJMbmtDdHJsT2Zmc2V0LCByZWcxNik7Ci0JCXBBZC0+UnQzeHhSYWxpbmtMaW5rQ3RybCA9IENvbmZpZ3VyYXRpb247Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBTTSA6V3JpdGUgUmFsaW5rIGRldmljZSBMMS9MMHMgVmFsdWUgPSAgMHgleFxuIiwgQ29uZmlndXJhdGlvbikpOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCgiUFNNIDpSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsIDw9PT09PT09PT09PT09PVxuIikpOwotCi19Ci0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzkwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0MzM5MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJhYjNkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnQzMzkwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotICAgIHJ0MzM5MC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWZuZGVmIF9fUlQzMzkwX0hfXwotI2RlZmluZSBfX1JUMzM5MF9IX18KLQotI2lmZGVmIFJUMzM5MAotCi0jaWZuZGVmIFJUTVBfUENJX1NVUFBPUlQKLSNlcnJvciAiRm9yIFJUMzM5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfUENJX1NVUFBPUlQiCi0jZW5kaWYKLQotI2lmbmRlZiBSVE1QX01BQ19QQ0kKLSNlcnJvciAiRm9yIFJUMzM5MCwgeW91IHNob3VsZCBkZWZpbmUgdGhlIGNvbXBpbGUgZmxhZyAtRFJUTVBfTUFDX1BDSSIKLSNlbmRpZgotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotI2Vycm9yICJGb3IgUlQzMzkwLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGUgY29tcGlsZSBmbGFnIC1EUlRNUF9SRl9SV19TVVBQT1JUIgotI2VuZGlmCi0KLSNpZm5kZWYgUlQzMHh4Ci0jZXJyb3IgIkZvciBSVDMzOTAsIHlvdSBzaG91bGQgZGVmaW5lIHRoZSBjb21waWxlIGZsYWcgLURSVDMweHgiCi0jZW5kaWYKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLSNkZWZpbmUgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jZGVmaW5lIFBDSUVfUFNfU1VQUE9SVAotCi0jaW5jbHVkZSAibWFjX3BjaS5oIgotI2luY2x1ZGUgInJ0MzN4eC5oIgotCi0vLwotLy8gRGV2aWNlIElEICYgVmVuZG9yIElELCB0aGVzZSB2YWx1ZXMgc2hvdWxkIG1hdGNoIEVFUFJPTSB2YWx1ZQotLy8KLSNkZWZpbmUgTklDMzM5MF9QQ0llX0RFVklDRV9JRCAgMHgzMDkwCQkvLyAxVC8xUiBtaW5pQ2FyZAotI2RlZmluZSBOSUMzMzkxX1BDSWVfREVWSUNFX0lEICAweDMwOTEJCS8vIDFULzJSIG1pbmlDYXJkCi0jZGVmaW5lIE5JQzMzOTJfUENJZV9ERVZJQ0VfSUQgIDB4MzA5MgkJLy8gMlQvMlIgbWluaUNhcmQKLQotI2VuZGlmIC8vIFJUMzM5MCAvLwotCi0jZW5kaWYgLy9fX1JUMzM5MF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfYXRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTlhYWU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDg5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotI2lmZGVmIFJBTElOS19BVEUKLQotI2lmZGVmIFJUMzB4eAotI2RlZmluZSBBVEVfQkJQX1JFR19OVU0JMTY4Ci1VQ0hBUiByZXN0b3JlX0JCUFtBVEVfQkJQX1JFR19OVU1dPXswfTsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotLy8gODAyLjExIE1BQyBIZWFkZXIsIFR5cGU6RGF0YSwgTGVuZ3RoOjI0Ynl0ZXMKLVVDSEFSIFRlbXBsYXRlRnJhbWVbMjRdID0gezB4MDgsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCi0JCTB4MDAsMHhBQSwweEJCLDB4MTIsMHgzNCwweDU2LDB4MDAsMHgxMSwweDIyLDB4QUEsMHhCQiwweENDLDB4MDAsMHgwMH07Ci0KLWV4dGVybiBSVE1QX1JGX1JFR1MgUkYyODUwUmVnVGFibGVbXTsKLWV4dGVybiBVQ0hBUiBOVU1fT0ZfMjg1MF9DSE5MOwotCi1leHRlcm4gRlJFUVVFTkNZX0lURU0gRnJlcUl0ZW1zMzAyMFtdOwotZXh0ZXJuIFVDSEFSIE5VTV9PRl8zMDIwX0NITkw7Ci0KLQotCi0KLXN0YXRpYyBDSEFSIENDS1JhdGVUYWJsZVtdID0gezAsIDEsIDIsIDMsIDgsIDksIDEwLCAxMSwgLTF9OyAvKiBDQ0sgTW9kZS4gKi8KLXN0YXRpYyBDSEFSIE9GRE1SYXRlVGFibGVbXSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAtMX07IC8qIE9GRE0gTW9kZS4gKi8KLXN0YXRpYyBDSEFSIEhUTUlYUmF0ZVRhYmxlW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLTF9OyAvKiBIVCBNaXggTW9kZS4gKi8KLQotc3RhdGljIElOVCBUeERtYUJ1c3koCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1zdGF0aWMgSU5UIFJ4RG1hQnVzeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXN0YXRpYyBWT0lEIFJ0bXBEbWFFbmFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gSU5UIEVuYWJsZSk7Ci0KLXN0YXRpYyBWT0lEIEJicFNvZnRSZXNldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXN0YXRpYyBWT0lEIFJ0bXBSZklvV3JpdGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1zdGF0aWMgSU5UIEFURVNldFVwRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDMyIFR4SWR4KTsKLQotc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gY2hhciBpbmRleCk7Ci0KLXN0YXRpYyBJTlQgQVRFQ21kSGFuZGxlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotI2lmbmRlZiBSVDMweHgKLXN0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKLQlJTiBVQ0hBUiBNb2RlLAotCUlOIFVDSEFSIE1jcyk7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLSNpZmRlZiBSVDMweHgKLXN0YXRpYyBpbnQgQ2hlY2tNQ1NWYWxpZCgKLQlJTiBVQ0hBUiBNb2RlLAotCUlOIFVDSEFSIE1jcywKLQlJTiBCT09MRUFOIGJSVDIwNzApOwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMJcE91dFR4V0ksCi0JSU4JQk9PTEVBTgkJCUZSQUcsCi0JSU4JQk9PTEVBTgkJCUNGQUNLLAotCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCi0JSU4JQk9PTEVBTgkJCUFNUERVLAotCUlOCUJPT0xFQU4JCQlBY2ssCi0JSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KLQlJTglVQ0hBUgkJCUJBU2l6ZSwKLQlJTglVQ0hBUgkJCVdDSUQsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4JVUNIQVIJCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLXN0YXRpYyBWT0lEIFNldEphcGFuRmlsdGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLXN0YXRpYyBpbmxpbmUgSU5UCURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1JGX1dSSVRFX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEMTYoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTAotKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0lPX1JFQUQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9JT19XUklURSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0lPX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0JCUF9SRUFEOCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0JCUF9XUklURTgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfUkVBRF9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfQ09VTlRFUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9UWF9TVEFSVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9UWF9TVE9QKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9SWF9TVE9QKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfUlhfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0JXKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfRlJFUV9PRkZTRVQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfUFJFQU1CTEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9BRERSMigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZwotKTsKLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnCi0pOwotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfQkJQX1dSSVRFX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcKLSk7Ci0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLXN0YXRpYyBJTlQgVHhEbWFCdXN5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCUlOVCByZXN1bHQ7Ci0JV1BETUFfR0xPX0NGR19TVFJVQyBHbG9DZmc7Ci0KLQlSVE1QX0lPX1JFQUQzMihwQWQsIFdQRE1BX0dMT19DRkcsICZHbG9DZmcud29yZCk7CS8vIGRpc2FibGUgRE1BCi0JaWYgKEdsb0NmZy5maWVsZC5UeERNQUJ1c3kpCi0JCXJlc3VsdCA9IDE7Ci0JZWxzZQotCQlyZXN1bHQgPSAwOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgSU5UIFJ4RG1hQnVzeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlJTlQgcmVzdWx0OwotCVdQRE1BX0dMT19DRkdfU1RSVUMgR2xvQ2ZnOwotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQotCWlmIChHbG9DZmcuZmllbGQuUnhETUFCdXN5KQotCQlyZXN1bHQgPSAxOwotCWVsc2UKLQkJcmVzdWx0ID0gMDsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIFZPSUQgUnRtcERtYUVuYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBJTlQgRW5hYmxlKQotewotCUJPT0xFQU4gdmFsdWU7Ci0JVUxPTkcgV2FpdENudDsKLQlXUERNQV9HTE9fQ0ZHX1NUUlVDIEdsb0NmZzsKLQotCXZhbHVlID0gRW5hYmxlID4gMCA/IDEgOiAwOwotCi0JLy8gY2hlY2sgRE1BIGlzIGluIGJ1c3kgbW9kZS4KLQlXYWl0Q250ID0gMDsKLQotCXdoaWxlIChUeERtYUJ1c3kocEFkKSB8fCBSeERtYUJ1c3kocEFkKSkKLQl7Ci0JCVJUTVB1c2VjRGVsYXkoMTApOwotCQlpZiAoV2FpdENudCsrID4gMTAwKQotCQkJYnJlYWs7Ci0JfQotCi0JUlRNUF9JT19SRUFEMzIocEFkLCBXUERNQV9HTE9fQ0ZHLCAmR2xvQ2ZnLndvcmQpOwkvLyBkaXNhYmxlIERNQQotCUdsb0NmZy5maWVsZC5FbmFibGVUeERNQSA9IHZhbHVlOwotCUdsb0NmZy5maWVsZC5FbmFibGVSeERNQSA9IHZhbHVlOwotCVJUTVBfSU9fV1JJVEUzMihwQWQsIFdQRE1BX0dMT19DRkcsIEdsb0NmZy53b3JkKTsJLy8gYWJvcnQgYWxsIFRYIHJpbmdzCi0JUlRNUHVzZWNEZWxheSg1MDAwKTsKLQotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLQotc3RhdGljIFZPSUQgQmJwU29mdFJlc2V0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSIEJicERhdGEgPSAwOwotCi0JLy8gU29mdCByZXNldCwgc2V0IEJCUCBSMjEgYml0MD0xLT4wCi0JQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCAmQmJwRGF0YSk7Ci0JQmJwRGF0YSB8PSAweDAwMDAwMDAxOyAvL3NldCBiaXQwPTEKLQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIxLCBCYnBEYXRhKTsKLQotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgJkJicERhdGEpOwotCUJicERhdGEgJj0gfigweDAwMDAwMDAxKTsgLy9zZXQgYml0MD0wCi0JQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMSwgQmJwRGF0YSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotc3RhdGljIFZPSUQgUnRtcFJmSW9Xcml0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQkvLyBTZXQgUkYgdmFsdWUgMSdzIHNldCBSM1tiaXQyXSA9IFswXQotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIChwQWQtPkxhdGNoUmZSZWdzLlIzICYgKH4weDA0KSkpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCi0JUlRNUHVzZWNEZWxheSgyMDApOwotCi0JLy8gU2V0IFJGIHZhbHVlIDIncyBzZXQgUjNbYml0Ml0gPSBbMV0KLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIxKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlIyKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCAocEFkLT5MYXRjaFJmUmVncy5SMyB8IDB4MDQpKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBwQWQtPkxhdGNoUmZSZWdzLlI0KTsKLQotCVJUTVB1c2VjRGVsYXkoMjAwKTsKLQotCS8vIFNldCBSRiB2YWx1ZSAzJ3Mgc2V0IFIzW2JpdDJdID0gWzBdCi0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SMik7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgKHBBZC0+TGF0Y2hSZlJlZ3MuUjMgJiAofjB4MDQpKSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgcEFkLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotI2lmZGVmIFJUMzB4eAotc3RhdGljIGludCBDaGVja01DU1ZhbGlkKAotCVVDSEFSIE1vZGUsCi0JVUNIQVIgTWNzLAotCUJPT0xFQU4gYlJUMjA3MCkKLSNlbmRpZiAvLyBSVDMweHggLy8KLSNpZm5kZWYgUlQzMHh4Ci1zdGF0aWMgaW50IENoZWNrTUNTVmFsaWQoCi0JSU4gVUNIQVIgTW9kZSwKLQlJTiBVQ0hBUiBNY3MpCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi17Ci0JSU5UIGk7Ci0JUENIQVIgcFJhdGVUYWI7Ci0KLQlzd2l0Y2ggKE1vZGUpCi0JewotCQljYXNlIDA6Ci0JCQlwUmF0ZVRhYiA9IENDS1JhdGVUYWJsZTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlwUmF0ZVRhYiA9IE9GRE1SYXRlVGFibGU7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQljYXNlIDM6Ci0jaWZkZWYgUlQzMHh4Ci0JCQlpZiAoYlJUMjA3MCkKLQkJCQlwUmF0ZVRhYiA9IE9GRE1SYXRlVGFibGU7Ci0JCQllbHNlCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCQlwUmF0ZVRhYiA9IEhUTUlYUmF0ZVRhYmxlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJ1bnJlY29nbml6YWJsZSBUeCBNb2RlICVkXG4iLCBNb2RlKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCQlicmVhazsKLQl9Ci0KLQlpID0gMDsKLQl3aGlsZSAocFJhdGVUYWJbaV0gIT0gLTEpCi0JewotCQlpZiAocFJhdGVUYWJbaV0gPT0gTWNzKQotCQkJcmV0dXJuIDA7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLQotc3RhdGljIElOVCBBVEVUeFB3ckhhbmRsZXIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gY2hhciBpbmRleCkKLXsKLQlVTE9ORyBSOwotCUNIQVIgVHhQb3dlcjsKLQlVQ0hBUiBCYnA5NCA9IDA7Ci0JQk9PTEVBTiBiUG93ZXJSZWR1Y2UgPSBGQUxTRTsKLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlVQ0hBUiBSRlZhbHVlOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQotCXsKLQkJLyoKLQkJCVdoZW4gUUEgaXMgdXNlZCBmb3IgVHgsIHBBZC0+YXRlLlR4UG93ZXIwLzEgYW5kIHJlYWwgdHggcG93ZXIKLQkJCWFyZSBub3Qgc3luY2hyb25pemVkLgotCQkqLwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JewotCQlUeFBvd2VyID0gaW5kZXggPT0gMCA/IHBBZC0+YXRlLlR4UG93ZXIwIDogcEFkLT5hdGUuVHhQb3dlcjE7Ci0KLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCWlmIChUeFBvd2VyID4gMzEpCi0JCQl7Ci0KLQkJCQkvLyBSMywgUjQgY2FuJ3QgbGFyZ2UgdGhhbiAzMSAoMHgyNCksIDMxIH4gMzYgdXNlZCBieSBCQlAgOTQKLQkJCQlSID0gMzE7Ci0JCQkJaWYgKFR4UG93ZXIgPD0gMzYpCi0JCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQgKyAoVUNIQVIpKFR4UG93ZXIgLSAzMSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChUeFBvd2VyIDwgMCkKLQkJCXsKLQotCQkJCS8vIFIzLCBSNCBjYW4ndCBsZXNzIHRoYW4gMCwgLTEgfiAtNiB1c2VkIGJ5IEJCUCA5NAotCQkJCVIgPSAwOwotCQkJCWlmIChUeFBvd2VyID49IC02KQotCQkJCQlCYnA5NCA9IEJCUFI5NF9ERUZBVUxUICsgVHhQb3dlcjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyAwIH4gMzEKLQkJCQlSID0gKFVMT05HKSBUeFBvd2VyOwotCQkJCUJicDk0ID0gQkJQUjk0X0RFRkFVTFQ7Ci0JCQl9Ci0KLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSPSVsZCwgQkJQX1I5ND0lZClcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUiwgQmJwOTQpKTsKLQkJfQotCQllbHNlIC8qIDUuNSBHSHogKi8KLQkJewotCQkJaWYgKFR4UG93ZXIgPiAxNSkKLQkJCXsKLQotCQkJCS8vIFIzLCBSNCBjYW4ndCBsYXJnZSB0aGFuIDE1ICgweDBGKQotCQkJCVIgPSAxNTsKLQkJCX0KLQkJCWVsc2UgaWYgKFR4UG93ZXIgPCAwKQotCQkJewotCi0JCQkJLy8gUjMsIFI0IGNhbid0IGxlc3MgdGhhbiAwCi0JCQkJLy8gLTEgfiAtNwotCQkJCUFTU0VSVCgoVHhQb3dlciA+PSAtNykpOwotCQkJCVIgPSAoVUxPTkcpKFR4UG93ZXIgKyA3KTsKLQkJCQliUG93ZXJSZWR1Y2UgPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIDAgfiAxNQotCQkJCVIgPSAoVUxPTkcpIFR4UG93ZXI7Ci0JCQl9Ci0KLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIChUeFBvd2VyPSVkLCBSPSVsdSlcbiIsIF9fRlVOQ1RJT05fXywgVHhQb3dlciwgUikpOwotCQl9Ci0vLzIwMDgvMDkvMTA6S0ggYWRkcyB0byBzdXBwb3J0IDMwNzAgQVRFIFRYIFBvd2VyIHR1bm5pbmcgcmVhbCB0aW1lPC0tCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0JCWlmIChJU19SVDMweHgocEFkKSkKLQkJewotCQkJLy8gU2V0IFR4IFBvd2VyCi0JCQlBVEVfUkZfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgUkZfUjEyLCAoUFVDSEFSKSZSRlZhbHVlKTsKLQkJCVJGVmFsdWUgPSAoUkZWYWx1ZSAmIDB4RTApIHwgVHhQb3dlcjsKLQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjEyLCAoVUNIQVIpUkZWYWx1ZSk7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIzMDcwIG9yIDIwNzA6JXMgKFR4UG93ZXI9JWQsIFJGVmFsdWU9JXgpXG4iLCBfX0ZVTkNUSU9OX18sIFR4UG93ZXIsIFJGVmFsdWUpKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCWlmIChpbmRleCA9PSAwKQotCQkJewotCQkJCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRihSMykgcmVnaXN0ZXIgYml0IHBvc2l0aW9uCi0JCQkJUiA9IFIgPDwgOTsKLQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7Ci0JCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IFI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFI0KSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQlSID0gUiA8PCA2OwotCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKLQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKLQkJCX0KLQkJfQotCQllbHNlIC8qIDUuNUdIeiAqLwotCQl7Ci0JCQlpZiAoYlBvd2VyUmVkdWNlID09IEZBTFNFKQotCQkJewotCQkJCWlmIChpbmRleCA9PSAwKQotCQkJCXsKLQkJCQkJLy8gc2hpZnQgVFggcG93ZXIgY29udHJvbCB0byBjb3JyZWN0IFJGKFIzKSByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJCQkJUiA9IChSIDw8IDEwKSB8ICgxIDw8IDkpOwotCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7Ci0JCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgotCQkJCQlSID0gKFIgPDwgNykgfCAoMSA8PCA2KTsKLQkJCQkJUiB8PSAocEFkLT5MYXRjaFJmUmVncy5SNCAmIDB4ZmZmZmY4M2YpOwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gUjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGluZGV4ID09IDApCi0JCQkJewotCQkJCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjMpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgotCQkJCQlSID0gKFIgPDwgMTApOwotCQkJCQlSIHw9IChwQWQtPkxhdGNoUmZSZWdzLlIzICYgMHhmZmZmYzFmZik7Ci0KLQkJCQkJLyogQ2xlYXIgYml0IDkgb2YgUjMgdG8gcmVkdWNlIDdkQi4gKi8KLQkJCQkJcEFkLT5MYXRjaFJmUmVncy5SMyA9IChSICYgKH4oMSA8PCA5KSkpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBzaGlmdCBUWCBwb3dlciBjb250cm9sIHRvIGNvcnJlY3QgUkYoUjQpIHJlZ2lzdGVyIGJpdCBwb3NpdGlvbgotCQkJCQlSID0gKFIgPDwgNyk7Ci0JCQkJCVIgfD0gKHBBZC0+TGF0Y2hSZlJlZ3MuUjQgJiAweGZmZmZmODNmKTsKLQotCQkJCQkvKiBDbGVhciBiaXQgNiBvZiBSNCB0byByZWR1Y2UgN2RCLiAqLwotCQkJCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gKFIgJiAofigxIDw8IDYpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQl9Ci0vLzIwMDgvMDkvMTA6S0ggYWRkcyB0byBzdXBwb3J0IDMwNzAgQVRFIFRYIFBvd2VyIHR1bm5pbmcgcmVhbCB0aW1lLS0+Ci0KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIG9wZXJhdGlvbiBtb2RlIHRvCi0gICAgICAgIDAuIEFURVNUQVJUICA9IFN0YXJ0IEFURSBNb2RlCi0gICAgICAgIDEuIEFURVNUT1AgICA9IFN0b3AgQVRFIE1vZGUKLSAgICAgICAgMi4gVFhDT05UICAgID0gQ29udGludW91cyBUcmFuc21pdAotICAgICAgICAzLiBUWENBUlIgICAgPSBUcmFuc21pdCBDYXJyaWVyCi0gICAgICAgIDQuIFRYRlJBTUUgICA9IFRyYW5zbWl0IEZyYW1lcwotICAgICAgICA1LiBSWEZSQU1FICAgPSBSZWNlaXZlIEZyYW1lcwotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0gICAgICAgIDYuIFRYU1RPUCAgICA9IFN0b3AgQW55IFR5cGUgb2YgVHJhbnNtaXRpb24KLSAgICAgICAgNy4gUlhTVE9QICAgID0gU3RvcCBSZWNlaXZpbmcgRnJhbWVzCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIElOVAlBVEVDbWRIYW5kbGVyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVDMyCQkJVmFsdWUgPSAwOwotCVVDSEFSCQkJQmJwRGF0YTsKLQlVSU5UMzIJCQlNYWNEYXRhID0gMDsKLQlQVFhEX1NUUlVDCQlwVHhEOwotCUlOVAkJCQlpbmRleDsKLQlVSU5UCQkJaSA9IDAsIGF0ZW1vZGUgPSAwOwotCVBSWERfU1RSVUMJCXBSeEQ7Ci0JUFJUTVBfVFhfUklORwlwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07Ci0JTkRJU19TVEFUVVMJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0jaWZkZWYJUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+IEFURUNtZEhhbmRsZXIoKVxuIikpOwotCi0JQVRFQXNpY1N3aXRjaENoYW5uZWwocEFkKTsKLQotCS8qIGVtcHR5IGZ1bmN0aW9uICovCi0JQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5hdGUuQ2hhbm5lbCk7Ci0KLQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCi0JLy8gcmVhZCBNQUNfU1lTX0NUUkwgYW5kIGJhY2t1cCBNQUNfU1lTX0NUUkwgdmFsdWUuCi0JUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZNYWNEYXRhKTsKLQotCS8vIERlZmF1bHQgdmFsdWUgaW4gQkJQIFIyMiBpcyAweDAuCi0JQmJwRGF0YSA9IDA7Ci0KLQkvLyBjbGVhbiBiaXQ0IHRvIHN0b3AgY29udGludW91cyBUeCBwcm9kdWN0aW9uIHRlc3QuCi0JTWFjRGF0YSAmPSAweEZGRkZGRkVGOwotCi0JLy8gRW50ZXIgQVRFIG1vZGUgYW5kIHNldCBUeC9SeCBJZGxlCi0JaWYgKCFzdHJjbXAoYXJnLCAiQVRFU1RBUlQiKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogQVRFU1RBUlRcbiIpKTsKLQotI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSByZW1vdmVkIHRoZSBmaXJtd2FyZQotCQlpZiAoIShBVEVfT04ocEFkKSkpCi0JCXsKLQkJCU5JQ0VyYXNlRmlybXdhcmUocEFkKTsKLQkJfQotI2VuZGlmIC8vIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykgLy8KLQotCQlhdGVtb2RlID0gcEFkLT5hdGUuTW9kZTsKLQkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVEFSVDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQotCQlpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSKQotCQl7Ci0JCQkvLyBObyBDYXJyaWVyIFRlc3Qgc2V0IEJCUCBSMjIgYml0Nz0wLCBiaXQ2PTAsIGJpdFs1fjBdPTB4MAotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vIGNsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCi0JCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQkJfQotCQllbHNlIGlmIChhdGVtb2RlID09IEFURV9UWENBUlJTVVBQKQotCQl7Ci0JCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vIHNldCBiaXQ3PTAKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCi0JCQkvLyBObyBDYXJyaWVyIFN1cHByZXNzaW9uIHNldCBCQlAgUjI0IGJpdDA9MAotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGRkU7IC8vIGNsZWFyIGJpdDAKLQkJICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsIEJicERhdGEpOwotCQl9Ci0KLQkJLyoKLQkJCVdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggd2FzIGFsbG9jYXRlZAotCQkJd2hlbiBBVEVfVFhGUkFNRSAsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KLQkJKi8KLQkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQotCQl7Ci0JCQlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKLQotCQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ09OVCkKLQkJCXsKLQkJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKLQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy8gc2V0IGJpdDc9MAotCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCQkJfQotCi0JCQkvLyBBYm9ydCBUeCwgUnggRE1BLgotCQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCQkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJUE5ESVNfUEFDS0VUICBwUGFja2V0OwotCi0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLQkJCSAgICBwVHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7Ci0jZWxzZQotCQkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwQWQtPlR4UmluZ1tRSURfQUNfQkVdLkNlbGxbaV0uQWxsb2NWYTsKLQkJCVR4RCA9ICpwRGVzdFR4RDsKLQkJCXBUeEQgPSAmVHhEOwotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCQlwVHhELT5ETUFET05FID0gMDsKLQkJCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtpXS5wTmRpc1BhY2tldDsKLQotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMCwgcFR4RC0+U0RMZW4wLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJCX0KLQotCQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQgPSBOVUxMOwotCi0JCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0OwotCi0JCQkJaWYgKHBQYWNrZXQpCi0JCQkJewotCQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIxLCBwVHhELT5TRExlbjEsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQkJfQotCi0JCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmV4dE5kaXNQYWNrZXQgYXMgTlVMTCBhZnRlciBjbGVhcgotCQkJCXBUeFJpbmctPkNlbGxbaV0ucE5leHROZGlzUGFja2V0ID0gTlVMTDsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQkJV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJfQotCi0JCQkvLyBTdGFydCBUeCwgUlggRE1BCi0JCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7Ci0JCX0KLQotCQkvLyByZXNldCBSeCBzdGF0aXN0aWNzLgotCQlwQWQtPmF0ZS5MYXN0U05SMCA9IDA7Ci0JCXBBZC0+YXRlLkxhc3RTTlIxID0gMDsKLQkJcEFkLT5hdGUuTGFzdFJzc2kwID0gMDsKLQkJcEFkLT5hdGUuTGFzdFJzc2kxID0gMDsKLQkJcEFkLT5hdGUuTGFzdFJzc2kyID0gMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTAgPSAwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMSA9IDA7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kyID0gMDsKLQkJcEFkLT5hdGUuQXZnUnNzaTBYOCA9IDA7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kxWDggPSAwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMlg4ID0gMDsKLQkJcEFkLT5hdGUuTnVtT2ZBdmdSc3NpU2FtcGxlID0gMDsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCS8vIFR4IGZyYW1lCi0JCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKLQkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOwotCQlwQWQtPmF0ZS5zZXEgPSAwOwotCi0JCS8vIGNvdW50ZXJzCi0JCXBBZC0+YXRlLlUyTSA9IDA7Ci0JCXBBZC0+YXRlLk90aGVyRGF0YSA9IDA7Ci0JCXBBZC0+YXRlLkJlYWNvbiA9IDA7Ci0JCXBBZC0+YXRlLk90aGVyQ291bnQgPSAwOwotCQlwQWQtPmF0ZS5UeEFjMCA9IDA7Ci0JCXBBZC0+YXRlLlR4QWMxID0gMDsKLQkJcEFkLT5hdGUuVHhBYzIgPSAwOwotCQlwQWQtPmF0ZS5UeEFjMyA9IDA7Ci0JCS8qcEFkLT5hdGUuVHhIQ0NBID0gMDsqLwotCQlwQWQtPmF0ZS5UeE1nbXQgPSAwOwotCQlwQWQtPmF0ZS5SU1NJMCA9IDA7Ci0JCXBBZC0+YXRlLlJTU0kxID0gMDsKLQkJcEFkLT5hdGUuUlNTSTIgPSAwOwotCQlwQWQtPmF0ZS5TTlIwID0gMDsKLQkJcEFkLT5hdGUuU05SMSA9IDA7Ci0KLQkJLy8gY29udHJvbAotCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0JCS8vIFR4U3RhdHVzIDogMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKLQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQkJLy8gU29mdCByZXNldCBCQlAuCi0JCUJicFNvZnRSZXNldChwQWQpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJLyogTGlua0Rvd24oKSBoYXMgIkFzaWNEaXNhYmxlU3luYygpOyIgYW5kICJSVE1QX0JCUF9JT19SL1c4X0JZX1JFR19JRCgpOyIgaW5zaWRlLiAqLwotLy8gICAgICBMaW5rRG93bihwQWQsIEZBTFNFKTsKLS8vCQlBc2ljRW5hYmxlQnNzU3luYyhwQWQpOwotCi0jaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChWWFdPUktTKQotCQlSVE1QX09TX05FVERFVl9TVE9QX1FVRVVFKHBBZC0+bmV0X2Rldik7Ci0jZW5kaWYgLy8gZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChWWFdPUktTKSAvLwotCi0JCS8qCi0JCQlJZiB3ZSBza2lwICJMaW5rRG93bigpIiwgd2Ugc2hvdWxkIGRpc2FibGUgcHJvdGVjdGlvbgotCQkJdG8gcHJldmVudCBmcm9tIHNlbmRpbmcgb3V0IFJUUyBvciBDVFMtdG8tc2VsZi4KLQkJKi8KLQkJQVRFRGlzYWJsZUFzaWNQcm90ZWN0KHBBZCk7Ci0JCVJUTVBTdGF0aW9uU3RvcChwQWQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JCS8qIERpc2FibGUgVHggKi8KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLQkJLyogRGlzYWJsZSBSeCAqLwotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJBVEVTVE9QIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEFURVNUT1BcbiIpKTsKLQotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQkvLyByZWNvdmVyIHRoZSBNQUNfU1lTX0NUUkwgcmVnaXN0ZXIgYmFjawotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIE1hY0RhdGEpOwotCi0JCS8vIGRpc2FibGUgVHgsIFJ4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAoMHhmZmZmZmZmMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JCS8vIGFib3J0IFR4LCBSWCBETUEKLQkJUnRtcERtYUVuYWJsZShwQWQsIDApOwotCi0jaWZkZWYgTElOVVgKLQkJcEFkLT5hdGUuYkZXTG9hZGluZyA9IFRSVUU7Ci0KLQkJU3RhdHVzID0gTklDTG9hZEZpcm13YXJlKHBBZCk7Ci0KLQkJaWYgKFN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJOSUNMb2FkRmlybXdhcmUgZmFpbGVkLCBTdGF0dXNbPTB4JTA4eF1cbiIsIFN0YXR1cykpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0jZW5kaWYgLy8gTElOVVggLy8KLQkJcEFkLT5hdGUuTW9kZSA9IEFURV9TVE9QOwotCi0JCS8qCi0JCQlFdmVuIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBsb2FkZWQsCi0JCQl3ZSBzdGlsbCBjb3VsZCB1c2UgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoKS4KLQkJCUJ1dCB0aGlzIGlzIG5vdCBzdWdnZXN0ZWQuCi0JCSovCi0JCUJicFNvZnRSZXNldChwQWQpOwotCi0JCVJUTVBfQVNJQ19JTlRFUlJVUFRfRElTQUJMRShwQWQpOwotCi0JCU5JQ0luaXRpYWxpemVBZGFwdGVyKHBBZCwgVFJVRSk7Ci0KLQkJLyoKLQkJCVJlaW5pdGlhbGl6ZSBSeCBSaW5nIGJlZm9yZSBSeCBETUEgaXMgZW5hYmxlZC4KLQkJCT4+PlJ4Q29oZXJlbnQ8PDwgd2FzIGdvbmUgIQotCQkqLwotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBSWF9SSU5HX1NJWkU7IGluZGV4KyspCi0JCXsKLQkJCXBSeEQgPSAoUFJYRF9TVFJVQykgcEFkLT5SeFJpbmcuQ2VsbFtpbmRleF0uQWxsb2NWYTsKLQkJCXBSeEQtPkRET05FID0gMDsKLQkJfQotCi0JCS8vIFdlIHNob3VsZCByZWFkIEVFUFJPTSBmb3IgYWxsIGNhc2VzLgotCQlOSUNSZWFkRUVQUk9NUGFyYW1ldGVycyhwQWQsIE5VTEwpOwotCQlOSUNJbml0QXNpY0Zyb21FRVBST00ocEFkKTsKLQotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQotCQkvKiBlbXB0eSBmdW5jdGlvbiAqLwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQotCQkvKiBjbGVhciBnYXJiYWdlIGludGVycnVwdHMgKi8KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIDB4ZmZmZmZmZmYpOwotCQkvKiBFbmFibGUgSW50ZXJydXB0ICovCi0JCVJUTVBfQVNJQ19JTlRFUlJVUFRfRU5BQkxFKHBBZCk7Ci0KLQkJLyogcmVzdG9yZSBSWF9GSUxUUl9DRkcgKi8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQkvKiByZXN0b3JlIFJYX0ZJTFRSX0NGRyBkdWUgdG8gdGhhdCBRQSBtYXliZSBzZXQgaXQgdG8gMHgzICovCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCQkvLyBFbmFibGUgVHgKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCQkvLyBFbmFibGUgVHgsIFJ4IERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCi0JCS8vIEVuYWJsZSBSeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgfD0gKDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJUlRNUFN0YXRpb25TdGFydChwQWQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChWWFdPUktTKQotCQlSVE1QX09TX05FVERFVl9TVEFSVF9RVUVVRShwQWQtPm5ldF9kZXYpOwotI2VuZGlmIC8vIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykgLy8KLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWENBUlIiKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhDQVJSXG4iKSk7Ci0JCXBBZC0+YXRlLk1vZGUgPSBBVEVfVFhDQVJSOwotCi0JCS8vIFFBIGhhcyBkb25lIHRoZSBmb2xsb3dpbmcgc3RlcHMgaWYgaXQgaXMgdXNlZC4KLQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gRkFMU0UpCi0JCXsKLQkJCS8vIFNvZnQgcmVzZXQgQkJQLgotCQkJQmJwU29mdFJlc2V0KHBBZCk7Ci0KLQkJCS8vIENhcnJpZXIgVGVzdCBzZXQgQkJQIFIyMiBiaXQ3PTEsIGJpdDY9MSwgYml0WzV+MF09MHgwMQotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCAmQmJwRGF0YSk7Ci0JCQlCYnBEYXRhICY9IDB4RkZGRkZGMDA7IC8vY2xlYXIgYml0NywgYml0NiwgYml0WzV+MF0KLQkJCUJicERhdGEgfD0gMHgwMDAwMDBDMTsgLy9zZXQgYml0Nz0xLCBiaXQ2PTEsIGJpdFs1fjBdPTB4MDEKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCi0JCQkvLyBzZXQgTUFDX1NZU19DVFJMKDB4MTAwNCkgQ29udGludW91cyBUeCBQcm9kdWN0aW9uIFRlc3QgKGJpdDQpID0gMQotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCQlWYWx1ZSA9IFZhbHVlIHwgMHgwMDAwMDAxMDsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiVFhDT05UIikpCi0JewotCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCQl7Ci0JCQkvKgotCQkJCXNldCBNQUNfU1lTX0NUUkwoMHgxMDA0KSBiaXQ0KENvbnRpbnVvdXMgVHggUHJvZHVjdGlvbiBUZXN0KQotCQkJCWFuZCBiaXQyKE1BQyBUWCBlbmFibGUpIGJhY2sgdG8gemVyby4KLQkJCSovCi0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJk1hY0RhdGEpOwotCQkJTWFjRGF0YSAmPSAweEZGRkZGRkVCOwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQotCQkJLy8gc2V0IEJCUCBSMjIgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gMHhGRkZGRkY3RjsgLy9zZXQgYml0Nz0wCi0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQkJfQotCi0JCS8qCi0JCQlmb3IgVHhDb250IG1vZGUuCi0JCQlTdGVwIDE6IFNlbmQgNTAgcGFja2V0cyBmaXJzdCB0aGVuIHdhaXQgZm9yIGEgbW9tZW50LgotCQkJU3RlcCAyOiBTZW5kIG1vcmUgNTAgcGFja2V0IHRoZW4gc3RhcnQgY29udGludWUgbW9kZS4KLQkJKi8KLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBUWENPTlRcbiIpKTsKLQotCQkvLyBTdGVwIDE6IHNlbmQgNTAgcGFja2V0cyBmaXJzdC4KLQkJcEFkLT5hdGUuTW9kZSA9IEFURV9UWENPTlQ7Ci0JCXBBZC0+YXRlLlR4Q291bnQgPSA1MDsKLQotCQkvKiBEbyBpdCBhZnRlciBUeC9SeCBETUEgaXMgYWJvcnRlZC4gKi8KLS8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0KLQkJLy8gU29mdCByZXNldCBCQlAuCi0JCUJicFNvZnRSZXNldChwQWQpOwotCi0JCS8vIEFib3J0IFR4LCBSWCBETUEuCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAwKTsKLQotCQkvLyBGaXggY2FuJ3Qgc21vb3RoIGtpY2sKLQkJewotCQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsICAmcFR4UmluZy0+VHhEbWFJZHgpOwotCQkJcFR4UmluZy0+VHhTd0ZyZWVJZHggPSBwVHhSaW5nLT5UeERtYUlkeDsKLQkJCXBUeFJpbmctPlR4Q3B1SWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIDB4MTAsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQkJfQotCi0JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gMDsKLQotCQkvKiBPbmx5IG5lZWRlZCBpZiB3ZSBoYXZlIHRvIHNlbmQgc29tZSBub3JtYWwgZnJhbWVzLiAqLwotCQlTZXRKYXBhbkZpbHRlcihwQWQpOwotCi0JCWZvciAoaSA9IDA7IChpIDwgVFhfUklOR19TSVpFLTEpICYmIChpIDwgcEFkLT5hdGUuVHhDb3VudCk7IGkrKykKLQkJewotCQkJUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0JCQlVSU5UMzIgVHhJZHggPSBwVHhSaW5nLT5UeENwdUlkeDsKLQotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlwVHhEID0gKFBUWERfU1RSVUMpcFR4UmluZy0+Q2VsbFtUeElkeF0uQWxsb2NWYTsKLSNlbHNlCi0JCQlwRGVzdFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0JCQlUeEQgPSAqcERlc3RUeEQ7Ci0JCQlwVHhEID0gJlR4RDsKLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkvLyBDbGVhbiBjdXJyZW50IGNlbGwuCi0JCQlwUGFja2V0ID0gcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJaWYgKHBQYWNrZXQpCi0JCQl7Ci0JCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCXBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLQkJCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQotCQkJaWYgKEFURVNldFVwRnJhbWUocEFkLCBUeElkeCkgIT0gMCkKLQkJCQlicmVhazsKLQotCQkJSU5DX1JJTkdfSU5ERVgocFR4UmluZy0+VHhDcHVJZHgsIFRYX1JJTkdfU0laRSk7Ci0JCX0KLQotCQkvLyBTZXR1cCBmcmFtZSBmb3JtYXQuCi0JCUFURVNldFVwRnJhbWUocEFkLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0KLQkJLy8gU3RhcnQgVHgsIFJYIERNQS4KLQkJUnRtcERtYUVuYWJsZShwQWQsIDEpOwotCi0JCS8vIEVuYWJsZSBUeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgfD0gKDEgPDwgMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCi0JCS8vIERpc2FibGUgUngKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCQl7Ci0JCQlwQWQtPmF0ZS5UeFN0YXR1cyA9IDE7Ci0JCX0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0JCS8vIGtpY2sgVHgtUmluZwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7Ci0KLQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQotCi0JCS8vIFN0ZXAgMjogc2VuZCBtb3JlIDUwIHBhY2tldHMgdGhlbiBzdGFydCBjb250aW51ZSBtb2RlLgotCQkvLyBBYm9ydCBUeCwgUlggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7Ci0KLQkJLy8gQ29udC4gVFggc2V0IEJCUCBSMjIgYml0Nz0xCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQlCYnBEYXRhIHw9IDB4MDAwMDAwODA7IC8vc2V0IGJpdDc9MQotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQotCQlwQWQtPmF0ZS5UeENvdW50ID0gNTA7Ci0KLQkJLy8gRml4IGNhbid0IHNtb290aCBraWNrCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0JCX0KLQotCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0KLQkJU2V0SmFwYW5GaWx0ZXIocEFkKTsKLQotCQlmb3IgKGkgPSAwOyAoaSA8IFRYX1JJTkdfU0laRS0xKSAmJiAoaSA8IHBBZC0+YXRlLlR4Q291bnQpOyBpKyspCi0JCXsKLQkJCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCQkJVUlOVDMyIFR4SWR4ID0gcFR4UmluZy0+VHhDcHVJZHg7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJcFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCQkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCQkJVHhEID0gKnBEZXN0VHhEOwotCQkJcFR4RCA9ICZUeEQ7Ci0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJLy8gY2xlYW4gY3VycmVudCBjZWxsLgotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCi0JCQkJYnJlYWs7Ci0KLQkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotCQl9Ci0KLQkJQVRFU2V0VXBGcmFtZShwQWQsIHBUeFJpbmctPlR4Q3B1SWR4KTsKLQotCQkvLyBTdGFydCBUeCwgUlggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7Ci0KLQkJLy8gRW5hYmxlIFR4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSB8PSAoMSA8PCAyKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0KLQkJLy8gRGlzYWJsZSBSeAotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDMpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCi0JCXsKLQkJCXBBZC0+YXRlLlR4U3RhdHVzID0gMTsKLQkJfQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQkJLy8ga2ljayBUeC1SaW5nLgotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9DVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5UeENwdUlkeCk7Ci0KLQkJUlRNUHVzZWNEZWxheSg1MDApOwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmTWFjRGF0YSk7Ci0JCU1hY0RhdGEgfD0gMHgwMDAwMDAxMDsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWEZSQU1FIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFRYRlJBTUUoQ291bnQ9JWQpXG4iLCBwQWQtPmF0ZS5UeENvdW50KSk7Ci0JCXBBZC0+YXRlLk1vZGUgfD0gQVRFX1RYRlJBTUU7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsIEJicERhdGEpOwotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQotCQkvLyBBYm9ydCBUeCwgUlggRE1BLgotCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7Ci0KLQkJLy8gRml4IGNhbid0IHNtb290aCBraWNrCi0JCXsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfRFRYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCAgJnBUeFJpbmctPlR4RG1hSWR4KTsKLQkJCXBUeFJpbmctPlR4U3dGcmVlSWR4ID0gcFR4UmluZy0+VHhEbWFJZHg7Ci0JCQlwVHhSaW5nLT5UeENwdUlkeCA9IHBUeFJpbmctPlR4RG1hSWR4OwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfQ1RYX0lEWDAgKyBRSURfQUNfQkUgKiAweDEwLCBwVHhSaW5nLT5UeENwdUlkeCk7Ci0JCX0KLQotCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0KLQkJU2V0SmFwYW5GaWx0ZXIocEFkKTsKLQotCQlmb3IgKGkgPSAwOyAoaSA8IFRYX1JJTkdfU0laRS0xKSAmJiAoaSA8IHBBZC0+YXRlLlR4Q291bnQpOyBpKyspCi0JCXsKLQkJCVBORElTX1BBQ0tFVCBwUGFja2V0OwotCQkJVUlOVDMyIFR4SWR4ID0gcFR4UmluZy0+VHhDcHVJZHg7Ci0KLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJcFR4RCA9IChQVFhEX1NUUlVDKXBUeFJpbmctPkNlbGxbVHhJZHhdLkFsbG9jVmE7Ci0jZWxzZQotCQkJcERlc3RUeEQgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCQkJVHhEID0gKnBEZXN0VHhEOwotCQkJcFR4RCA9ICZUeEQ7Ci0JCQlSVE1QRGVzY3JpcHRvckVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeEQsIFRZUEVfVFhEKTsKLSNlbmRpZgotCQkJLy8gQ2xlYW4gY3VycmVudCBjZWxsLgotCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbVHhJZHhdLnBOZGlzUGFja2V0OwotCi0JCQlpZiAocFBhY2tldCkKLQkJCXsKLQkJCQlQQ0lfVU5NQVBfU0lOR0xFKHBBZCwgcFR4RC0+U0RQdHIwLCBwVHhELT5TRExlbjAsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCX0KLQotCQkJLy8gQWx3YXlzIGFzc2lnbiBwTmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmRpc1BhY2tldCA9IE5VTEw7Ci0KLQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQ7Ci0KLQkJCWlmIChwUGFja2V0KQotCQkJewotCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjEsIHBUeEQtPlNETGVuMSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJfQotCi0JCQkvLyBBbHdheXMgYXNzaWduIHBOZXh0TmRpc1BhY2tldCBhcyBOVUxMIGFmdGVyIGNsZWFyCi0JCQlwVHhSaW5nLT5DZWxsW1R4SWR4XS5wTmV4dE5kaXNQYWNrZXQgPSBOVUxMOwotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0JCQlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoKFBVQ0hBUilwRGVzdFR4RCwgKFBVQ0hBUilwVHhELCBGQUxTRSwgVFlQRV9UWEQpOwotI2VuZGlmCi0KLQkJCWlmIChBVEVTZXRVcEZyYW1lKHBBZCwgVHhJZHgpICE9IDApCi0JCQkJYnJlYWs7Ci0KLQkJCUlOQ19SSU5HX0lOREVYKHBUeFJpbmctPlR4Q3B1SWR4LCBUWF9SSU5HX1NJWkUpOwotCi0JCX0KLQotCQlBVEVTZXRVcEZyYW1lKHBBZCwgcFR4UmluZy0+VHhDcHVJZHgpOwotCi0JCS8vIFN0YXJ0IFR4LCBSeCBETUEuCi0JCVJ0bXBEbWFFbmFibGUocEFkLCAxKTsKLQotCQkvLyBFbmFibGUgVHgKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlIHw9ICgxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JCS8vIGFkZCB0aGlzIGZvciBMb29wQmFjayBtb2RlCi0JCWlmIChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IEZBTFNFKQotCQl7Ci0JCQkvLyBEaXNhYmxlIFJ4Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCQl9Ci0KLQkJaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQkJewotCQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAxOwotCQl9Ci0jZWxzZQotCQkvLyBEaXNhYmxlIFJ4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9EVFhfSURYMCArIFFJRF9BQ19CRSAqIFJJTkdSRUdfRElGRiwgJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uVHhEbWFJZHgpOwotCQkvLyBraWNrIFR4LVJpbmcuCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0NUWF9JRFgwICsgUUlEX0FDX0JFICogUklOR1JFR19ESUZGLCBwQWQtPlR4UmluZ1tRSURfQUNfQkVdLlR4Q3B1SWR4KTsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JfQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJUWFNUT1AiKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURTogVFhTVE9QXG4iKSk7Ci0JCWF0ZW1vZGUgPSBwQWQtPmF0ZS5Nb2RlOwotCQlwQWQtPmF0ZS5Nb2RlICY9IEFURV9UWFNUT1A7Ci0JCXBBZC0+YXRlLmJRQVR4U3RhcnQgPSBGQUxTRTsKLS8vCQlwQWQtPmF0ZS5UeERvbmVDb3VudCA9IHBBZC0+YXRlLlR4Q291bnQ7Ci0KLQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ0FSUikKLQkJewotCQkJLy8gTm8gQ2FycmllciBUZXN0IHNldCBCQlAgUjIyIGJpdDc9MCwgYml0Nj0wLCBiaXRbNX4wXT0weDAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSAweEZGRkZGRjAwOyAvL2NsZWFyIGJpdDcsIGJpdDYsIGJpdFs1fjBdCi0JCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQkJfQotCQllbHNlIGlmIChhdGVtb2RlID09IEFURV9UWENBUlJTVVBQKQotCQl7Ci0JCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgJkJicERhdGEpOwotCQkJQmJwRGF0YSAmPSB+KDEgPDwgNyk7IC8vc2V0IGJpdDc9MAotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0KLQkJCS8vIE5vIENhcnJpZXIgU3VwcHJlc3Npb24gc2V0IEJCUCBSMjQgYml0MD0wCi0JCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjQsICZCYnBEYXRhKTsKLQkJCUJicERhdGEgJj0gMHhGRkZGRkZGRTsgLy9jbGVhciBiaXQwCi0JCSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjI0LCBCYnBEYXRhKTsKLQkJfQotCi0JCS8qCi0JCQlXZSBzaG91bGQgZnJlZSBzb21lIHJlc291cmNlIHdoaWNoIHdhcyBhbGxvY2F0ZWQKLQkJCXdoZW4gQVRFX1RYRlJBTUUsIEFURV9TVE9QLCBhbmQgQVRFX1RYQ09OVC4KLQkJKi8KLQkJZWxzZSBpZiAoKGF0ZW1vZGUgJiBBVEVfVFhGUkFNRSkgfHwgKGF0ZW1vZGUgPT0gQVRFX1NUT1ApKQotCQl7Ci0JCQlQUlRNUF9UWF9SSU5HIHBUeFJpbmcgPSAmcEFkLT5UeFJpbmdbUUlEX0FDX0JFXTsKLQotCQkJaWYgKGF0ZW1vZGUgPT0gQVRFX1RYQ09OVCkKLQkJCXsKLQkJCQkvLyBObyBDb250LiBUWCBzZXQgQkJQIFIyMiBiaXQ3PTAKLQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMjIsICZCYnBEYXRhKTsKLQkJCQlCYnBEYXRhICY9IH4oMSA8PCA3KTsgLy9zZXQgYml0Nz0wCi0JCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IyMiwgQmJwRGF0YSk7Ci0JCQl9Ci0KLQkJCS8vIEFib3J0IFR4LCBSeCBETUEuCi0JCQlSdG1wRG1hRW5hYmxlKHBBZCwgMCk7Ci0KLQkJCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKQotCQkJewotCQkJCVBORElTX1BBQ0tFVCAgcFBhY2tldDsKLQotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkgICAgcFR4RCA9IChQVFhEX1NUUlVDKXBBZC0+VHhSaW5nW1FJRF9BQ19CRV0uQ2VsbFtpXS5BbGxvY1ZhOwotI2Vsc2UKLQkJCXBEZXN0VHhEID0gKFBUWERfU1RSVUMpcEFkLT5UeFJpbmdbUUlEX0FDX0JFXS5DZWxsW2ldLkFsbG9jVmE7Ci0JCQlUeEQgPSAqcERlc3RUeEQ7Ci0JCQlwVHhEID0gJlR4RDsKLQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotI2VuZGlmCi0JCQkJcFR4RC0+RE1BRE9ORSA9IDA7Ci0JCQkJcFBhY2tldCA9IHBUeFJpbmctPkNlbGxbaV0ucE5kaXNQYWNrZXQ7Ci0KLQkJCQlpZiAocFBhY2tldCkKLQkJCQl7Ci0JCQkJCVBDSV9VTk1BUF9TSU5HTEUocEFkLCBwVHhELT5TRFB0cjAsIHBUeEQtPlNETGVuMCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCQl9Ci0KLQkJCQkvLyBBbHdheXMgYXNzaWduIHBOZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZGlzUGFja2V0ID0gTlVMTDsKLQotCQkJCXBQYWNrZXQgPSBwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldDsKLQotCQkJCWlmIChwUGFja2V0KQotCQkJCXsKLQkJCQkJUENJX1VOTUFQX1NJTkdMRShwQWQsIHBUeEQtPlNEUHRyMSwgcFR4RC0+U0RMZW4xLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCQkJCX0KLQotCQkJCS8vIEFsd2F5cyBhc3NpZ24gcE5leHROZGlzUGFja2V0IGFzIE5VTEwgYWZ0ZXIgY2xlYXIKLQkJCQlwVHhSaW5nLT5DZWxsW2ldLnBOZXh0TmRpc1BhY2tldCA9IE5VTEw7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCQkJCVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4RCwgVFlQRV9UWEQpOwotCQkJCVdyaXRlQmFja1RvRGVzY3JpcHRvcigoUFVDSEFSKXBEZXN0VHhELCAoUFVDSEFSKXBUeEQsIEZBTFNFLCBUWVBFX1RYRCk7Ci0jZW5kaWYKLQkJCX0KLQkJCS8vIEVuYWJsZSBUeCwgUnggRE1BCi0JCQlSdG1wRG1hRW5hYmxlKHBBZCwgMSk7Ci0KLQkJfQotCi0JCS8vIFR4U3RhdHVzIDogMCAtLT4gdGFzayBpcyBpZGxlLCAxIC0tPiB0YXNrIGlzIHJ1bm5pbmcKLQkJcEFkLT5hdGUuVHhTdGF0dXMgPSAwOwotCi0JCS8vIFNvZnQgcmVzZXQgQkJQLgotCQlCYnBTb2Z0UmVzZXQocEFkKTsKLQotCQkvLyBEaXNhYmxlIFR4Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQlWYWx1ZSAmPSB+KDEgPDwgMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCX0KLQllbHNlIGlmICghc3RyY21wKGFyZywgIlJYU1RPUCIpKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFOiBSWFNUT1BcbiIpKTsKLQkJYXRlbW9kZSA9IHBBZC0+YXRlLk1vZGU7Ci0JCXBBZC0+YXRlLk1vZGUgJj0gQVRFX1JYU1RPUDsKLQkJcEFkLT5hdGUuYlFBUnhTdGFydCA9IEZBTFNFOwotLy8JCXBBZC0+YXRlLlR4RG9uZUNvdW50ID0gcEFkLT5hdGUuVHhDb3VudDsKLQotCQlpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSKQotCQl7Ci0JCQk7Ci0JCX0KLQkJZWxzZSBpZiAoYXRlbW9kZSA9PSBBVEVfVFhDQVJSU1VQUCkKLQkJewotCQkJOwotCQl9Ci0KLQkJLyoKLQkJCVdlIHNob3VsZCBmcmVlIHNvbWUgcmVzb3VyY2Ugd2hpY2ggd2FzIGFsbG9jYXRlZAotCQkJd2hlbiBBVEVfVFhGUkFNRSwgQVRFX1NUT1AsIGFuZCBBVEVfVFhDT05ULgotCQkqLwotCQllbHNlIGlmICgoYXRlbW9kZSAmIEFURV9UWEZSQU1FKSB8fCAoYXRlbW9kZSA9PSBBVEVfU1RPUCkpCi0JCXsKLQkJCWlmIChhdGVtb2RlID09IEFURV9UWENPTlQpCi0JCQl7Ci0JCQkJOwotCQkJfQotCQl9Ci0KLQkJLy8gU29mdCByZXNldCBCQlAuCi0JCUJicFNvZnRSZXNldChwQWQpOwotCi0JCS8vIERpc2FibGUgUngKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCVZhbHVlICY9IH4oMSA8PCAzKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0JfQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JZWxzZSBpZiAoIXN0cmNtcChhcmcsICJSWEZSQU1FIikpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IFJYRlJBTUVcbiIpKTsKLQotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjIyLCBCYnBEYXRhKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBNYWNEYXRhKTsKLQotCQlwQWQtPmF0ZS5Nb2RlIHw9IEFURV9SWEZSQU1FOwotCi0JCS8vIERpc2FibGUgVHggb2YgTUFDIGJsb2NrLgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gfigxIDw8IDIpOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQotCQkvLyBFbmFibGUgUnggb2YgTUFDIGJsb2NrLgotCQlSVE1QX0lPX1JFQUQzMihwQWQsIE1BQ19TWVNfQ1RSTCwgJlZhbHVlKTsKLQkJVmFsdWUgfD0gKDEgPDwgMyk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BQ19TWVNfQ1RSTCwgVmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVEU6IEludmFsaWQgYXJnIVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09IEFURUNtZEhhbmRsZXIoKVxuIikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09RW5kIG9mIFJUTVBfTUFDX1BDSSA9PT09PT09PT09PT09PT09PT09PT09PSovCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0KLUlOVAlTZXRfQVRFX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlpZiAoQVRFQ21kSGFuZGxlcihwQWQsIGFyZykpCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1Byb2MgRmFpbGVkXG4iKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgQUREUjE9REEgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCi0gICAgICAgIG9yCi0gICAgICAgIFNldCBBVEUgQUREUjM9REEgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfREFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVBTVFJJTkcJCQkJdmFsdWU7Ci0JSU5UCQkJCQlpOwotCi0JLy8gTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3Ci0JaWYgKHN0cmxlbihhcmcpICE9IDE3KQotCQlyZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGkgPSAwLCB2YWx1ZSA9IHJzdHJ0b2soYXJnLCAiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsICI6IikpCi0JewotCQkvKiBzYW5pdHkgY2hlY2sgKi8KLQkJaWYgKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkpCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JCUF0b0godmFsdWUsICZwQWQtPmF0ZS5BZGRyM1tpKytdLCAxKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0KLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAoaSAhPSA2KQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfREFfUHJvYyAoREEgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsIHBBZC0+YXRlLkFkZHIzWzBdLAotCQlwQWQtPmF0ZS5BZGRyM1sxXSwgcEFkLT5hdGUuQWRkcjNbMl0sIHBBZC0+YXRlLkFkZHIzWzNdLCBwQWQtPmF0ZS5BZGRyM1s0XSwgcEFkLT5hdGUuQWRkcjNbNV0pKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9EQV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIEFERFIzPVNBIGZvciBUeEZyYW1lKEFQICA6IFRvIERTID0gMCA7IEZyb20gRFMgPSAxKQotICAgICAgICBvcgotICAgICAgICBTZXQgQVRFIEFERFIyPVNBIGZvciBUeEZyYW1lKFNUQSA6IFRvIERTID0gMSA7IEZyb20gRFMgPSAwKQotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1NBX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaTsKLQotCS8vIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCWlmIChzdHJsZW4oYXJnKSAhPSAxNykKLQkJcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTAsIHZhbHVlID0gcnN0cnRvayhhcmcsICI6Iik7IHZhbHVlOyB2YWx1ZSA9IHJzdHJ0b2soTlVMTCwgIjoiKSkKLQl7Ci0JCS8qIHNhbml0eSBjaGVjayAqLwotCQlpZiAoKHN0cmxlbih2YWx1ZSkgIT0gMikgfHwgKCFpc3hkaWdpdCgqdmFsdWUpKSB8fCAoIWlzeGRpZ2l0KCoodmFsdWUrMSkpKSkKLQkJewotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJQXRvSCh2YWx1ZSwgJnBBZC0+YXRlLkFkZHIyW2krK10sIDEpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChpICE9IDYpCi0JewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9TQV9Qcm9jIChTQSA9ICUyWDolMlg6JTJYOiUyWDolMlg6JTJYKVxuIiwgcEFkLT5hdGUuQWRkcjJbMF0sCi0JCXBBZC0+YXRlLkFkZHIyWzFdLCBwQWQtPmF0ZS5BZGRyMlsyXSwgcEFkLT5hdGUuQWRkcjJbM10sIHBBZC0+YXRlLkFkZHIyWzRdLCBwQWQtPmF0ZS5BZGRyMls1XSkpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1NBX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgQUREUjI9QlNTSUQgZm9yIFR4RnJhbWUoQVAgIDogVG8gRFMgPSAwIDsgRnJvbSBEUyA9IDEpCi0gICAgICAgIG9yCi0gICAgICAgIFNldCBBVEUgQUREUjE9QlNTSUQgZm9yIFR4RnJhbWUoU1RBIDogVG8gRFMgPSAxIDsgRnJvbSBEUyA9IDApCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfQlNTSURfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVBTVFJJTkcJCQkJdmFsdWU7Ci0JSU5UCQkJCQlpOwotCi0JLy8gTWFjIGFkZHJlc3MgYWNjZXB0YWJsZSBmb3JtYXQgMDE6MDI6MDM6MDQ6MDU6MDYgbGVuZ3RoIDE3Ci0JaWYgKHN0cmxlbihhcmcpICE9IDE3KQotCQlyZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywgIjoiKTsgdmFsdWU7IHZhbHVlID0gcnN0cnRvayhOVUxMLCAiOiIpKQotCXsKLQkJLyogc2FuaXR5IGNoZWNrICovCi0JCWlmICgoc3RybGVuKHZhbHVlKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp2YWx1ZSkpIHx8ICghaXN4ZGlnaXQoKih2YWx1ZSsxKSkpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCQlBdG9IKHZhbHVlLCAmcEFkLT5hdGUuQWRkcjFbaSsrXSwgMSk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JfQotCi0JLyogc2FuaXR5IGNoZWNrICovCi0JaWYoaSAhPSA2KQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfQlNTSURfUHJvYyAoQlNTSUQgPSAlMlg6JTJYOiUyWDolMlg6JTJYOiUyWClcbiIsCXBBZC0+YXRlLkFkZHIxWzBdLAotCQlwQWQtPmF0ZS5BZGRyMVsxXSwgcEFkLT5hdGUuQWRkcjFbMl0sIHBBZC0+YXRlLkFkZHIxWzNdLCBwQWQtPmF0ZS5BZGRyMVs0XSwgcEFkLT5hdGUuQWRkcjFbNV0pKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9CU1NJRF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IENoYW5uZWwKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9DSEFOTkVMX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVQ0hBUiBjaGFubmVsOwotCi0JY2hhbm5lbCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQkvLyB0byBhbGxvdyBBIGJhbmQgY2hhbm5lbCA6ICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMTQpKQotCWlmICgoY2hhbm5lbCA8IDEpIHx8IChjaGFubmVsID4gMjE2KSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfQ0hBTk5FTF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAxfjE0LlxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9DSEFOTkVMX1Byb2MgKEFURSBDaGFubmVsID0gJWQpXG4iLCBwQWQtPmF0ZS5DaGFubmVsKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX0NIQU5ORUxfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IFBvd2VyMAotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JQ0hBUiBUeFBvd2VyOwotCi0JVHhQb3dlciA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKLQl7Ci0JCWlmICgoVHhQb3dlciA+IDMxKSB8fCAoVHhQb3dlciA8IDApKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCWVsc2UvKiA1LjUgR0h6ICovCi0JewotCQlpZiAoKFR4UG93ZXIgPiAxNSkgfHwgKFR4UG93ZXIgPCAtNykpCi0JCXsKLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIwX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0KLQlwQWQtPmF0ZS5UeFBvd2VyMCA9IFR4UG93ZXI7Ci0JQVRFVHhQd3JIYW5kbGVyKHBBZCwgMCk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX1BPV0VSMF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggUG93ZXIxCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfUE9XRVIxX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlDSEFSIFR4UG93ZXI7Ci0KLQlUeFBvd2VyID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCXsKLQkJaWYgKChUeFBvd2VyID4gMzEpIHx8IChUeFBvd2VyIDwgMCkpCi0JCXsKLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfUE9XRVIxX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCBUeFBvd2VyKSk7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKChUeFBvd2VyID4gMTUpIHx8IChUeFBvd2VyIDwgLTcpKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jOjpPdXQgb2YgcmFuZ2UgKFZhbHVlPSVkKVxuIiwgVHhQb3dlcikpOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCi0JcEFkLT5hdGUuVHhQb3dlcjEgPSBUeFBvd2VyOwotCUFURVR4UHdySGFuZGxlcihwQWQsIDEpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9QT1dFUjFfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IEFudGVubmEKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlDSEFSIHZhbHVlOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKCh2YWx1ZSA+IDIpIHx8ICh2YWx1ZSA8IDApKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gdmFsdWU7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuVHhBbnRlbm5hU2VsKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSYWxpbms6IFNldF9BVEVfVFhfQW50ZW5uYV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCS8vIGNhbGlicmF0aW9uIHBvd2VyIHVuYmFsYW5jZSBpc3N1ZXMsIG1lcmdlZCBmcm9tIEFyY2ggVGVhbQotCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFJ4IEFudGVubmEKLQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlDSEFSIHZhbHVlOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKCh2YWx1ZSA+IDMpIHx8ICh2YWx1ZSA8IDApKQotCXsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9SWF9BbnRlbm5hX1Byb2M6Ok91dCBvZiByYW5nZSAoVmFsdWU9JWQpXG4iLCB2YWx1ZSkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gdmFsdWU7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0FudGVubmFfUHJvYyAoQW50ZW5uYSA9ICVkKVxuIiwgcEFkLT5hdGUuUnhBbnRlbm5hU2VsKSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1JYX0FudGVubmFfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQkvLyBjYWxpYnJhdGlvbiBwb3dlciB1bmJhbGFuY2UgaXNzdWVzLCBtZXJnZWQgZnJvbSBBcmNoIFRlYW0KLQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBSRiBmcmVxdWVuY2Ugb2Zmc2V0Ci0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIgUkZGcmVxT2Zmc2V0ID0gMDsKLQlVTE9ORyBSNCA9IDA7Ci0KLQlSRkZyZXFPZmZzZXQgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotI2lmbmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLQlpZiAoUkZGcmVxT2Zmc2V0ID49IDY0KQotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCS8qIFJUMzV4eCBBVEUgd2lsbCByZXVzZSB0aGlzIGNvZGUgc2VnbWVudC4gKi8KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wOC8wNjogS0ggbW9kaWZpZWQgdGhlIGxpbWl0IG9mIG9mZnNldCB2YWx1ZSBmcm9tIDY1IHRvIDk1KDB4NUYpCi0JaWYgKFJGRnJlcU9mZnNldCA+PSA5NSkKLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jOjpPdXQgb2YgcmFuZ2UsIGl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjYzLlxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcEFkLT5hdGUuUkZGcmVxT2Zmc2V0ID0gUkZGcmVxT2Zmc2V0OwotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCS8vIFNldCBSRiBvZmZzZXQKLQkJVUNIQVIgUkZWYWx1ZTsKLQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IyMywgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0vLzIwMDgvMDgvMDY6IEtIIG1vZGlmaWVkICJwQWQtPlJGRnJlcU9mZnNldCIgdG8gInBBZC0+YXRlLlJGRnJlcU9mZnNldCIKLQkJUkZWYWx1ZSA9ICgoUkZWYWx1ZSAmIDB4ODApIHwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KTsKLQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMjMsIChVQ0hBUilSRlZhbHVlKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJLy8gUlQyOHh4Ci0JCS8vIHNoaWZ0IFRYIHBvd2VyIGNvbnRyb2wgdG8gY29ycmVjdCBSRiByZWdpc3RlciBiaXQgcG9zaXRpb24KLQkJUjQgPSBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQgPDwgMTU7Ci0JCVI0IHw9IChwQWQtPkxhdGNoUmZSZWdzLlI0ICYgKCh+MHgwMDFmODAwMCkpKTsKLQkJcEFkLT5MYXRjaFJmUmVncy5SNCA9IFI0OwotCi0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQl9Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2MgKFJGRnJlcU9mZnNldCA9ICVkKVxuIiwgcEFkLT5hdGUuUkZGcmVxT2Zmc2V0KSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUmFsaW5rOiBTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFJGIEJXCi0KLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9BVEVfVFhfQldfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCUlOVCBpOwotCVVDSEFSIHZhbHVlID0gMDsKLQlVQ0hBUiBCQlBDdXJyZW50Qlc7Ci0KLQlCQlBDdXJyZW50QlcgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKChCQlBDdXJyZW50QlcgPT0gMCkKLSNpZmRlZiBSVDMweHgKLQkJfHwgSVNfUlQyMDcwKHBBZCkKLSNlbmRpZiAvLyBSVDMweHggLy8KLQkJKQotCXsKLQkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOwotCX0KLQllbHNlCi0JewotCQlwQWQtPmF0ZS5UeFdJLkJXID0gQldfNDA7Ci0JfQotCi0JLyogUlQzNXh4IEFURSB3aWxsIHJldXNlIHRoaXMgY29kZSBzZWdtZW50LiAqLwotCS8vIEZpeCB0aGUgZXJyb3Igc3BlY3RydW0gb2YgQ0NLLTQwTUhaCi0JLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCi0JaWYgKChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPT0gTU9ERV9DQ0spICYmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfQldfUHJvYyEhIFdhcm5pbmchISBDQ0sgb25seSBzdXBwb3J0cyAyME1IWiEhXG5CYW5kd2lkdGggc3dpdGNoIHRvIDIwXG4iKSk7Ci0JCXBBZC0+YXRlLlR4V0kuQlcgPSBCV18yMDsKLQl9Ci0KLQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5DaGFubmVsIDw9IDE0KQotCQl7Ci0JCQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+VHgyME1Qd3JDZmdHQmFuZFtpXSAhPSAweGZmZmZmZmZmKQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbaV0pOwotCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAoaT0wOyBpPDU7IGkrKykKLQkJCXsKLQkJCQlpZiAocEFkLT5UeDIwTVB3ckNmZ0FCYW5kW2ldICE9IDB4ZmZmZmZmZmYpCi0JCQkJewotCQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9QV1JfQ0ZHXzAgKyBpKjQsIHBBZC0+VHgyME1Qd3JDZmdBQmFuZFtpXSk7Ci0JCQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IEJCUCBSNCBiaXRbNDozXT0wOjAKLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7Ci0JCXZhbHVlICY9ICh+MHgxOCk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgdmFsdWUpOwotCi0KLQkJLy8gU2V0IEJCUCBSNjY9MHgzQwotCQl2YWx1ZSA9IDB4M0M7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIHZhbHVlKTsKLQotCQkvLyBTZXQgQkJQIFI2OD0weDBCCi0JCS8vIHRvIGltcHJvdmUgUnggc2Vuc2l0aXZpdHkuCi0JCXZhbHVlID0gMHgwQjsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOwotCQkvLyBTZXQgQkJQIFI2OT0weDE2Ci0JCXZhbHVlID0gMHgxNjsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOwotCQkvLyBTZXQgQkJQIFI3MD0weDA4Ci0JCXZhbHVlID0gMHgwODsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOwotCQkvLyBTZXQgQkJQIFI3Mz0weDExCi0JCXZhbHVlID0gMHgxMTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOwotCi0JICAgIC8qCi0JCQlJZiBDaGFubmVsPTE0LCBCYW5kd2lkdGg9MjBNIGFuZCBNb2RlPUNDSywgU2V0IEJCUCBSNCBiaXQ1PTEKLQkJCSh0byBzZXQgSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cykuCi0JCQlUaGlzIHNlZ21lbnQgb2YgY29kZSB3aWxsIG9ubHkgd29ya3Mgd2hlbiBBVEVUWE1PREUgYW5kIEFURUNIQU5ORUwKLQkJCXdlcmUgc2V0IHRvIE1PREVfQ0NLIGFuZCAxNCByZXNwZWN0aXZlbHkgYmVmb3JlIEFURVRYQlcgaXMgc2V0IHRvIDAuCi0JICAgICovCi0JCWlmIChwQWQtPmF0ZS5DaGFubmVsID09IDE0KQotCQl7Ci0JCQlJTlQgVHhNb2RlID0gcEFkLT5hdGUuVHhXSS5QSFlNT0RFOwotCi0JCQlpZiAoVHhNb2RlID09IE1PREVfQ0NLKQotCQkJewotCQkJCS8vIHdoZW4gQ2hhbm5lbD09MTQgJiYgTW9kZT09Q0NLICYmIEJhbmRXaWR0aD09MjBNLCBCQlAgUjQgYml0NT0xCi0JCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZ2YWx1ZSk7Ci0JCQkJdmFsdWUgfD0gMHgyMDsgLy9zZXQgYml0NT0xCi0JCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQotI2lmZGVmIFJUMzB4eAotCQkvLyBzZXQgQlcgPSAyMCBNSHoKLQkJaWYgKElTX1JUMzB4eChwQWQpKQotCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMjQsIChVQ0hBUikgcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQpOwotCQllbHNlCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCS8vIHNldCBCVyA9IDIwIE1IegotCQl7Ci0JCQlwQWQtPkxhdGNoUmZSZWdzLlI0ICY9IH4weDAwMjAwMDAwOwotCQkJUnRtcFJmSW9Xcml0ZShwQWQpOwotCQl9Ci0KLQl9Ci0JLy8gSWYgYmFuZHdpZHRoID0gNDBNLCBzZXQgUkYgUmVnNCBiaXQgMjEgPSAwLgotCWVsc2UgaWYgKHBBZC0+YXRlLlR4V0kuQlcgPT0gQldfNDApCi0JewotCQlpZiAocEFkLT5hdGUuQ2hhbm5lbCA8PSAxNCkKLQkJewotCQkJZm9yIChpPTA7IGk8NTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbaV0gIT0gMHhmZmZmZmZmZikKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BXUl9DRkdfMCArIGkqNCwgcEFkLT5UeDQwTVB3ckNmZ0dCYW5kW2ldKTsKLQkJCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmb3IgKGk9MDsgaTw1OyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFtpXSAhPSAweGZmZmZmZmZmKQotCQkJCXsKLQkJCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbaV0pOwotCQkJCQlSVE1QdXNlY0RlbGF5KDUwMDApOwotCQkJCX0KLQkJCX0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCWlmICgocEFkLT5hdGUuVHhXSS5QSFlNT0RFID49IE1PREVfSFRNSVgpICYmIChwQWQtPmF0ZS5UeFdJLk1DUyA9PSA3KSkKLQkJCXsKLQkJCXZhbHVlID0gMHgyODsKLQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjcsIHZhbHVlKTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJfQotCi0JCS8vIFNldCBCQlAgUjQgYml0WzQ6M109MTowCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmdmFsdWUpOwotCQl2YWx1ZSAmPSAofjB4MTgpOwotCQl2YWx1ZSB8PSAweDEwOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIHZhbHVlKTsKLQotCi0JCS8vIFNldCBCQlAgUjY2PTB4M0MKLQkJdmFsdWUgPSAweDNDOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCB2YWx1ZSk7Ci0KLQkJLy8gU2V0IEJCUCBSNjg9MHgwQwotCQkvLyB0byBpbXByb3ZlIFJ4IHNlbnNpdGl2aXR5Ci0JCXZhbHVlID0gMHgwQzsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OCwgdmFsdWUpOwotCQkvLyBTZXQgQkJQIFI2OT0weDFBCi0JCXZhbHVlID0gMHgxQTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgdmFsdWUpOwotCQkvLyBTZXQgQkJQIFI3MD0weDBBCi0JCXZhbHVlID0gMHgwQTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MCwgdmFsdWUpOwotCQkvLyBTZXQgQkJQIFI3Mz0weDE2Ci0JCXZhbHVlID0gMHgxNjsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I3MywgdmFsdWUpOwotCi0JCS8vIElmIGJhbmR3aWR0aCA9IDQwTSwgc2V0IFJGIFJlZzQgYml0IDIxID0gMS4KLSNpZmRlZiBSVDMweHgKLQkJLy8gc2V0IEJXID0gNDAgTUh6Ci0JCWlmKElTX1JUMzB4eChwQWQpKQotCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMjQsIChVQ0hBUikgcEFkLT5NbG1lLkNhbGlCVzQwUmZSMjQpOwotCQllbHNlCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0JCS8vIHNldCBCVyA9IDQwIE1IegotCQl7Ci0JCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgfD0gMHgwMDIwMDAwMDsKLQkJUnRtcFJmSW9Xcml0ZShwQWQpOwotCQl9Ci0JfQotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0FURV9UWF9CV19Qcm9jIChCQlBDdXJyZW50QlcgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuQlcpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfQldfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgQVRFIFR4IGZyYW1lIGxlbmd0aAotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JcEFkLT5hdGUuVHhMZW5ndGggPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKChwQWQtPmF0ZS5UeExlbmd0aCA8IDI0KSB8fCAocEFkLT5hdGUuVHhMZW5ndGggPiAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSkKLQl7Ci0JCXBBZC0+YXRlLlR4TGVuZ3RoID0gKE1BWF9GUkFNRV9TSVpFIC0gMzQvKiA9PSAyMzEyICovKTsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9MRU5HVEhfUHJvYzo6T3V0IG9mIHJhbmdlLCBpdCBzaG91bGQgYmUgaW4gcmFuZ2Ugb2YgMjR+JWQuXG4iLCAoTUFYX0ZSQU1FX1NJWkUgLSAzNC8qID09IDIzMTIgKi8pKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1RYX0xFTkdUSF9Qcm9jIChUeExlbmd0aCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhMZW5ndGgpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTEVOR1RIX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBjb3VudAotCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX0NPVU5UX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlwQWQtPmF0ZS5UeENvdW50ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkLT5hdGUuVHhDb3VudCkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBBVEUgVHggZnJhbWUgTUNTCi0KLSAgICAgICAgUmV0dXJuOgotCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX01DU19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIgTUNTOwotCUlOVCByZXN1bHQ7Ci0KLQlNQ1MgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotI2lmbmRlZiBSVDMweHgKLQlyZXN1bHQgPSBDaGVja01DU1ZhbGlkKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSwgTUNTKTsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCS8qIFJUMzV4eCBBVEUgd2lsbCByZXVzZSB0aGlzIGNvZGUgc2VnbWVudC4gKi8KLSNpZmRlZiBSVDMweHgKLQlyZXN1bHQgPSBDaGVja01DU1ZhbGlkKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSwgTUNTLCBJU19SVDIwNzAocEFkKSk7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQotCWlmIChyZXN1bHQgIT0gLTEpCi0JewotCQlwQWQtPmF0ZS5UeFdJLk1DUyA9IChVQ0hBUilNQ1M7Ci0JfQotCWVsc2UKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNldF9BVEVfVFhfTUNTX1Byb2M6Ok91dCBvZiByYW5nZSwgcmVmZXIgdG8gcmF0ZSB0YWJsZS5cbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTUNTX1Byb2MgKE1DUyA9ICVkKVxuIiwgcEFkLT5hdGUuVHhXSS5NQ1MpKTsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSYWxpbms6IFNldF9BVEVfVFhfTUNTX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBNb2RlCi0gICAgICAgIDA6IE1PREVfQ0NLCi0gICAgICAgIDE6IE1PREVfT0ZETQotICAgICAgICAyOiBNT0RFX0hUTUlYCi0gICAgICAgIDM6IE1PREVfSFRHUkVFTkZJRUxECi0KLSAgICAgICAgUmV0dXJuOgotCQlUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSIEJicERhdGEgPSAwOwotCi0JcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChwQWQtPmF0ZS5UeFdJLlBIWU1PREUgPiAzKQotCXsKLQkJcEFkLT5hdGUuVHhXSS5QSFlNT0RFID0gMDsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9NT0RFX1Byb2M6Ok91dCBvZiByYW5nZS5cbkl0IHNob3VsZCBiZSBpbiByYW5nZSBvZiAwfjNcbiIpKTsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiMDogQ0NLLCAxOiBPRkRNLCAyOiBIVF9NSVgsIDM6IEhUX0dSRUVOX0ZJRUxELlxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JLy8gVHVybiBvbiBCQlAgMjBNSHogbW9kZSBieSByZXF1ZXN0IGhlcmUuCi0JaWYgKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9PSBNT0RFX0NDSykKLQl7Ci0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQmJwRGF0YSk7Ci0JCUJicERhdGEgJj0gKH4weDE4KTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCYnBEYXRhKTsKLQkJcEFkLT5hdGUuVHhXSS5CVyA9IEJXXzIwOwotCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJTZXRfQVRFX1RYX01PREVfUHJvYzo6Q0NLIE9ubHkgc3VwcG9ydCAyME1IWi4gU3dpdGNoIHRvIDIwTUhaLlxuIikpOwotCX0KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfTU9ERV9Qcm9jIChUeE1vZGUgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuUEhZTU9ERSkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9NT0RFX1Byb2MgU3VjY2Vzc1xuIikpOwotCi0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEFURSBUeCBmcmFtZSBHSQotCi0gICAgICAgIFJldHVybjoKLQkJVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQJU2V0X0FURV9UWF9HSV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmIChwQWQtPmF0ZS5UeFdJLlNob3J0R0kgPiAxKQotCXsKLQkJcEFkLT5hdGUuVHhXSS5TaG9ydEdJID0gMDsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiU2V0X0FURV9UWF9HSV9Qcm9jOjpPdXQgb2YgcmFuZ2VcbiIpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfR0lfUHJvYyAoR0kgPSAlZClcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSkpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9HSV9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UCVNldF9BVEVfUlhfRkVSX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlwQWQtPmF0ZS5iUnhGRVIgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKHBBZC0+YXRlLmJSeEZFUiA9PSAxKQotCXsKLQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMgPSAwOwotCQlwQWQtPmF0ZS5SeFRvdGFsQ250ID0gMDsKLQl9Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfQVRFX1JYX0ZFUl9Qcm9jIChiUnhGRVIgPSAlZClcbiIsIHBBZC0+YXRlLmJSeEZFUikpOwotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9SWF9GRVJfUHJvYyBTdWNjZXNzXG4iKSk7Ci0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQVRFX1JlYWRfUkZfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IFJUMzB4eCBBVEU8LS0KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQkvKiBtb2RpZnkgYnkgV1kgZm9yIFJlYWQgUkYgUmVnLiBlcnJvciAqLwotCQlVQ0hBUiBSRlZhbHVlOwotCQlJTlQgaW5kZXg9MDsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAzMjsgaW5kZXgrKykKLQkJewotCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIGluZGV4LCAoUFVDSEFSKSZSRlZhbHVlKTsKLQkJCWF0ZV9wcmludCgiUiVkPSVkXG4iLGluZGV4LFJGVmFsdWUpOwotCQl9Ci0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCBSVDMweHggQVRFLS0+Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjEgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjEpOwotCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjIgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjIpOwotCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjMgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjMpOwotCQlhdGVfcHJpbnQoS0VSTl9FTUVSRyAiUjQgPSAlbHhcbiIsIHBBZC0+TGF0Y2hSZlJlZ3MuUjQpOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQzMiB2YWx1ZSA9IChVSU5UMzIpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURTwtLQotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCWF0ZV9wcmludCgiV2FybmluZyEhIFJUM3h4eCBEb24ndCBTdXBwb3J0ICFcbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0KLQl9Ci0JZWxzZQotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFLS0+Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlwQWQtPkxhdGNoUmZSZWdzLlIxID0gdmFsdWU7Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9BVEVfV3JpdGVfUkYyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVSU5UMzIgdmFsdWUgPSAoVUlOVDMyKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTYpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEU8LS0KLQlpZiAoSVNfUlQzMHh4KHBBZCkgfHwgSVNfUlQzNTcyKHBBZCkpCi0JewotCQlhdGVfcHJpbnQoIldhcm5pbmchISBSVDN4eHggRG9uJ3QgU3VwcG9ydCAhXG4iKTsKLQkJcmV0dXJuIEZBTFNFOwotCi0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURS0tPgotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCXsKLQkJcEFkLT5MYXRjaFJmUmVncy5SMiA9IHZhbHVlOwotCQlSdG1wUmZJb1dyaXRlKHBBZCk7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLUlOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUlOVDMyIHZhbHVlID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDE2KTsKLQotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFPC0tCi0JaWYgKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzU3MihwQWQpKQotCXsKLQkJYXRlX3ByaW50KCJXYXJuaW5nISEgUlQzeHh4IERvbid0IFN1cHBvcnQgIVxuIik7Ci0JCXJldHVybiBGQUxTRTsKLQotCX0KLQllbHNlCi0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEUtLT4KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLQl7Ci0JCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSB2YWx1ZTsKLQkJUnRtcFJmSW9Xcml0ZShwQWQpOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVJTlQzMiB2YWx1ZSA9IChVSU5UMzIpIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxNik7Ci0KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURTwtLQotCWlmIChJU19SVDMweHgocEFkKSB8fCBJU19SVDM1NzIocEFkKSkKLQl7Ci0JCWF0ZV9wcmludCgiV2FybmluZyEhIFJUM3h4eCBEb24ndCBTdXBwb3J0ICFcbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0KLQl9Ci0JZWxzZQotLy8yMDA4LzA3LzEwOktIIGFkZCB0byBzdXBwb3J0IDMwNzAgQVRFLS0+Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0JewotCQlwQWQtPkxhdGNoUmZSZWdzLlI0ID0gdmFsdWU7Ci0JCVJ0bXBSZklvV3JpdGUocEFkKTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIExvYWQgYW5kIFdyaXRlIEVFUFJPTSBmcm9tIGEgYmluYXJ5IGZpbGUgcHJlcGFyZWQgaW4gYWR2YW5jZS4KLQotICAgICAgICBSZXR1cm46Ci0JCVRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoVlhXT1JLUykKLUlOVCBTZXRfQVRFX0xvYWRfRTJQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlCT09MRUFOCQkJcmV0ID0gRkFMU0U7Ci0JUFNUUklORwkJCXNyYyA9IEVFUFJPTV9CSU5fRklMRV9OQU1FOwotCVJUTVBfT1NfRkQJCXNyY2Y7Ci0JSU5UMzIJCQlyZXR2YWw7Ci0JVVNIT1JUCQkJV3JpdGVFRVBST01bKEVFUFJPTV9TSVpFLzIpXTsKLQlJTlQJCQkJRmlsZUxlbmd0aCA9IDA7Ci0JVUlOVDMyCQkJdmFsdWUgPSAoVUlOVDMyKSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCVJUTVBfT1NfRlNfSU5GTwlvc0ZTSW5mbzsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PT4gJXMgKHZhbHVlPSVkKVxuXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlKSk7Ci0KLQlpZiAodmFsdWUgPiAwKQotCXsKLQkJLyogemVybyB0aGUgZTJwIGJ1ZmZlciAqLwotCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKVdyaXRlRUVQUk9NLCBFRVBST01fU0laRSk7Ci0KLQkJUnRtcE9TRlNJbmZvQ2hhbmdlKCZvc0ZTSW5mbywgVFJVRSk7Ci0KLQkJZG8KLQkJewotCQkJLyogb3BlbiB0aGUgYmluIGZpbGUgKi8KLQkJCXNyY2YgPSBSdG1wT1NGaWxlT3BlbihzcmMsIE9fUkRPTkxZLCAwKTsKLQotCQkJaWYgKElTX0ZJTEVfT1BFTl9FUlIoc3JjZikpCi0JCQl7Ci0JCQkJYXRlX3ByaW50KCIlcyAtIEVycm9yIG9wZW5pbmcgZmlsZSAlc1xuIiwgX19GVU5DVElPTl9fLCBzcmMpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiByZWFkIHRoZSBmaXJtd2FyZSBmcm9tIHRoZSBmaWxlICouYmluICovCi0JCQlGaWxlTGVuZ3RoID0gUnRtcE9TRmlsZVJlYWQoc3JjZiwgKFBTVFJJTkcpV3JpdGVFRVBST00sIEVFUFJPTV9TSVpFKTsKLQotCQkJaWYgKEZpbGVMZW5ndGggIT0gRUVQUk9NX1NJWkUpCi0JCQl7Ci0JCQkJYXRlX3ByaW50KCIlczogZXJyb3IgZmlsZSBsZW5ndGggKD0lZCkgaW4gZTJwLmJpblxuIiwKLQkJCQkJICAgX19GVU5DVElPTl9fLCBGaWxlTGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvKiB3cml0ZSB0aGUgY29udGVudCBvZiAuYmluIGZpbGUgdG8gRUVQUk9NICovCi0JCQkJcnRfZWVfd3JpdGVfYWxsKHBBZCwgV3JpdGVFRVBST00pOwotCQkJCXJldCA9IFRSVUU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfSB3aGlsZShUUlVFKTsKLQotCQkvKiBjbG9zZSBmaXJtd2FyZSBmaWxlICovCi0JCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQl7Ci0JCQkJOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dmFsID0gUnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCi0JCQlpZiAocmV0dmFsKQotCQkJewotCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIi0tPiBFcnJvciAlZCBjbG9zaW5nICVzXG4iLCAtcmV0dmFsLCBzcmMpKTsKLQotCQkJfQotCQl9Ci0KLQkJLyogcmVzdG9yZSAqLwotCQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBGQUxTRSk7Ci0JfQotCi0gICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPD09PSAlcyAocmV0PSVkKVxuIiwgX19GVU5DVElPTl9fLCByZXQpKTsKLQotICAgIHJldHVybiByZXQ7Ci0KLX0KLSNlbmRpZiAvLyBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKFZYV09SS1MpIC8vCi0KLQotCi0KLUlOVCBTZXRfQVRFX1JlYWRfRTJQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOwotCVVTSE9SVCAqcDsKLQlpbnQgaTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZCwgKFVTSE9SVCAqKWJ1ZmZlcik7Ci0JcCA9IGJ1ZmZlcjsKLQlmb3IgKGkgPSAwOyBpIDwgKEVFUFJPTV9TSVpFLzIpOyBpKyspCi0JewotCQlhdGVfcHJpbnQoIiU0LjR4ICIsICpwKTsKLQkJaWYgKCgoaSsxKSAlIDE2KSA9PSAwKQotCQkJYXRlX3ByaW50KCJcbiIpOwotCQlwKys7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLQotCi1JTlQJU2V0X0FURV9TaG93X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlhdGVfcHJpbnQoIk1vZGU9JWRcbiIsIHBBZC0+YXRlLk1vZGUpOwotCWF0ZV9wcmludCgiVHhQb3dlcjA9JWRcbiIsIHBBZC0+YXRlLlR4UG93ZXIwKTsKLQlhdGVfcHJpbnQoIlR4UG93ZXIxPSVkXG4iLCBwQWQtPmF0ZS5UeFBvd2VyMSk7Ci0JYXRlX3ByaW50KCJUeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlR4QW50ZW5uYVNlbCk7Ci0JYXRlX3ByaW50KCJSeEFudGVubmFTZWw9JWRcbiIsIHBBZC0+YXRlLlJ4QW50ZW5uYVNlbCk7Ci0JYXRlX3ByaW50KCJCQlBDdXJyZW50Qlc9JWRcbiIsIHBBZC0+YXRlLlR4V0kuQlcpOwotCWF0ZV9wcmludCgiR0k9JWRcbiIsIHBBZC0+YXRlLlR4V0kuU2hvcnRHSSk7Ci0JYXRlX3ByaW50KCJNQ1M9JWRcbiIsIHBBZC0+YXRlLlR4V0kuTUNTKTsKLQlhdGVfcHJpbnQoIlR4TW9kZT0lZFxuIiwgcEFkLT5hdGUuVHhXSS5QSFlNT0RFKTsKLQlhdGVfcHJpbnQoIkFkZHIxPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwQWQtPmF0ZS5BZGRyMVswXSwgcEFkLT5hdGUuQWRkcjFbMV0sIHBBZC0+YXRlLkFkZHIxWzJdLCBwQWQtPmF0ZS5BZGRyMVszXSwgcEFkLT5hdGUuQWRkcjFbNF0sIHBBZC0+YXRlLkFkZHIxWzVdKTsKLQlhdGVfcHJpbnQoIkFkZHIyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwQWQtPmF0ZS5BZGRyMlswXSwgcEFkLT5hdGUuQWRkcjJbMV0sIHBBZC0+YXRlLkFkZHIyWzJdLCBwQWQtPmF0ZS5BZGRyMlszXSwgcEFkLT5hdGUuQWRkcjJbNF0sIHBBZC0+YXRlLkFkZHIyWzVdKTsKLQlhdGVfcHJpbnQoIkFkZHIzPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwQWQtPmF0ZS5BZGRyM1swXSwgcEFkLT5hdGUuQWRkcjNbMV0sIHBBZC0+YXRlLkFkZHIzWzJdLCBwQWQtPmF0ZS5BZGRyM1szXSwgcEFkLT5hdGUuQWRkcjNbNF0sIHBBZC0+YXRlLkFkZHIzWzVdKTsKLQlhdGVfcHJpbnQoIkNoYW5uZWw9JWRcbiIsIHBBZC0+YXRlLkNoYW5uZWwpOwotCWF0ZV9wcmludCgiVHhMZW5ndGg9JWRcbiIsIHBBZC0+YXRlLlR4TGVuZ3RoKTsKLQlhdGVfcHJpbnQoIlR4Q291bnQ9JXVcbiIsIHBBZC0+YXRlLlR4Q291bnQpOwotCWF0ZV9wcmludCgiUkZGcmVxT2Zmc2V0PSVkXG4iLCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQpOwotCWF0ZV9wcmludChLRVJOX0VNRVJHICJTZXRfQVRFX1Nob3dfUHJvYyBTdWNjZXNzXG4iKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQJU2V0X0FURV9IZWxwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlhdGVfcHJpbnQoIkFURT1BVEVTVEFSVCwgQVRFU1RPUCwgVFhDT05ULCBUWENBUlIsIFRYRlJBTUUsIFJYRlJBTUVcbiIpOwotCWF0ZV9wcmludCgiQVRFREFcbiIpOwotCWF0ZV9wcmludCgiQVRFU0FcbiIpOwotCWF0ZV9wcmludCgiQVRFQlNTSURcbiIpOwotCWF0ZV9wcmludCgiQVRFQ0hBTk5FTCwgcmFuZ2U6MH4xNCh1bmxlc3MgQSBiYW5kICEpXG4iKTsKLQlhdGVfcHJpbnQoIkFURVRYUE9XMCwgc2V0IHBvd2VyIGxldmVsIG9mIGFudGVubmEgMS5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhQT1cxLCBzZXQgcG93ZXIgbGV2ZWwgb2YgYW50ZW5uYSAyLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVUWEFOVCwgc2V0IFRYIGFudGVubmEuIDA6YWxsLCAxOmFudGVubmEgb25lLCAyOmFudGVubmEgdHdvLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVSWEFOVCwgc2V0IFJYIGFudGVubmEuMDphbGwsIDE6YW50ZW5uYSBvbmUsIDI6YW50ZW5uYSB0d28sIDM6YW50ZW5uYSB0aHJlZS5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhGUkVRT0ZGU0VULCBzZXQgZnJlcXVlbmN5IG9mZnNldCwgcmFuZ2UgMH42M1xuIik7Ci0JYXRlX3ByaW50KCJBVEVUWEJXLCBzZXQgQmFuZFdpZHRoLCAwOjIwTUh6LCAxOjQwTUh6LlxuIik7Ci0JYXRlX3ByaW50KCJBVEVUWExFTiwgc2V0IEZyYW1lIGxlbmd0aCwgcmFuZ2UgMjR+JWRcbiIsIChNQVhfRlJBTUVfU0laRSAtIDM0LyogPT0gMjMxMiAqLykpOwotCWF0ZV9wcmludCgiQVRFVFhDTlQsIHNldCBob3cgbWFueSBmcmFtZSBnb2luZyB0byB0cmFuc21pdC5cbiIpOwotCWF0ZV9wcmludCgiQVRFVFhNQ1MsIHNldCBNQ1MsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVUWE1PREUsIHNldCBNb2RlIDA6Q0NLLCAxOk9GRE0sIDI6SFQtTWl4LCAzOkdyZWVuRmllbGQsIHJlZmVyZW5jZSB0byByYXRlIHRhYmxlLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVUWEdJLCBzZXQgR0kgaW50ZXJ2YWwsIDA6TG9uZywgMTpTaG9ydFxuIik7Ci0JYXRlX3ByaW50KCJBVEVSWEZFUiwgMDpkaXNhYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuIDE6ZW5hYmxlIFJ4IEZyYW1lIGVycm9yIHJhdGUuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVJSRiwgc2hvdyBhbGwgUkYgcmVnaXN0ZXJzLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVXUkYxLCBzZXQgUkYxIHJlZ2lzdGVyLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVXUkYyLCBzZXQgUkYyIHJlZ2lzdGVyLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVXUkYzLCBzZXQgUkYzIHJlZ2lzdGVyLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVXUkY0LCBzZXQgUkY0IHJlZ2lzdGVyLlxuIik7Ci0JYXRlX3ByaW50KCJBVEVMREUyUCwgbG9hZCBFRVBST00gZnJvbSAuYmluIGZpbGUuXG4iKTsKLQlhdGVfcHJpbnQoIkFURVJFMlAsIGRpc3BsYXkgYWxsIEVFUFJPTSBjb250ZW50LlxuIik7Ci0JYXRlX3ByaW50KCJBVEVTSE9XLCBkaXNwbGF5IGFsbCBwYXJhbWV0ZXJzIG9mIEFURS5cbiIpOwotCWF0ZV9wcmludCgiQVRFSEVMUCwgb25saW5lIGhlbHAuXG4iKTsKLQotCXJldHVybiBUUlVFOwotfQotCi0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUFzaWNTd2l0Y2hDaGFubmVsKCkgZGVkaWNhdGVkIGZvciBBVEUuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBVEVBc2ljU3dpdGNoQ2hhbm5lbCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlVSU5UMzIgUjIgPSAwLCBSMyA9IERFRkFVTFRfUkZfVFhfUE9XRVIsIFI0ID0gMCwgVmFsdWUgPSAwOwotCUNIQVIgVHhQd2VyID0gMCwgVHhQd2VyMiA9IDA7Ci0JVUNIQVIgaW5kZXggPSAwLCBCYnBWYWx1ZSA9IDAsIFI2NiA9IDB4MzA7Ci0JUlRNUF9SRl9SRUdTICpSRlJlZ1RhYmxlOwotCVVDSEFSIENoYW5uZWwgPSAwOwotCi0JUkZSZWdUYWJsZSA9IE5VTEw7Ci0KLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCS8vIGZvciBRQSBtb2RlLCBUWCBwb3dlciB2YWx1ZXMgYXJlIHBhc3NlZCBmcm9tIFVJCi0JaWYgKChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpIHx8IChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpKQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgIT0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsKQotCQl7Ci0JCQlwQWQtPmF0ZS5DaGFubmVsID0gcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JQ2hhbm5lbCA9IHBBZC0+YXRlLkNoYW5uZWw7Ci0KLQkvLyBzZWxlY3QgYW50ZW5uYSBmb3IgUlQzMDkwCi0JQXNpY0FudGVubmFTZWxlY3QocEFkLCBDaGFubmVsKTsKLQotCS8vIGZpbGwgVHggcG93ZXIgdmFsdWUKLQlUeFB3ZXIgPSBwQWQtPmF0ZS5UeFBvd2VyMDsKLQlUeFB3ZXIyID0gcEFkLT5hdGUuVHhQb3dlcjE7Ci0jaWZkZWYgUlQzMHh4Ci0vLzIwMDgvMDcvMTA6S0ggYWRkIHRvIHN1cHBvcnQgMzA3MCBBVEU8LS0KLQotCS8qCi0JCVRoZSBSRiBwcm9ncmFtbWluZyBzZXF1ZW5jZSBpcyBkaWZmZXJlbmNlIGJldHdlZW4gM3h4eCBhbmQgMnh4eC4KLQkJVGhlIDMwNzAgaXMgMVQxUi4gVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGUgbnVtYmVyIG9mIFR4L1J4IHBhdGgKLQkJYW5kIHRoZSBvbmx5IGpvYiBpcyB0byBzZXQgdGhlIHBhcmFtZXRlcnMgb2YgY2hhbm5lbHMuCi0JKi8KLQlpZiAoSVNfUlQzMHh4KHBBZCkgJiYgKChwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMCkgfHwKLQkJCShwQWQtPlJmSWNUeXBlID09IFJGSUNfMzAyMSkgfHwgKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18zMDIyKSB8fAotCQkJKHBBZC0+UmZJY1R5cGUgPT0gUkZJQ18yMDIwKSkpCi0JewotCQkvKiBtb2RpZnkgYnkgV1kgZm9yIFJlYWQgUkYgUmVnLiBlcnJvciAqLwotCQlVQ0hBUiBSRlZhbHVlID0gMDsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMzAyMF9DSE5MOyBpbmRleCsrKQotCQl7Ci0JCQlpZiAoQ2hhbm5lbCA9PSBGcmVxSXRlbXMzMDIwW2luZGV4XS5DaGFubmVsKQotCQkJewotCQkJCS8vIFByb2dyYW1taW5nIGNoYW5uZWwgcGFyYW1ldGVycy4KLQkJCQlBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIFJGX1IwMiwgRnJlcUl0ZW1zMzAyMFtpbmRleF0uTik7Ci0JCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMDMsIEZyZXFJdGVtczMwMjBbaW5kZXhdLkspOwotCi0JCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IwNiwgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhGQykgfCBGcmVxSXRlbXMzMDIwW2luZGV4XS5SOwotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjA2LCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBTZXQgVHggUG93ZXIuCi0JCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IxMiwgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHhFMCkgfCBUeFB3ZXI7Ci0JCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMTIsIChVQ0hBUilSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBSRiBvZmZzZXQuCi0JCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IyMywgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQkJLy8yMDA4LzA4LzA2OiBLSCBtb2RpZmllZCAicEFkLT5SRkZyZXFPZmZzZXQiIHRvICJwQWQtPmF0ZS5SRkZyZXFPZmZzZXQiCi0JCQkJUkZWYWx1ZSA9IChSRlZhbHVlICYgMHg4MCkgfCBwQWQtPmF0ZS5SRkZyZXFPZmZzZXQ7Ci0JCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMjMsIChVQ0hBUilSRlZhbHVlKTsKLQotCQkJCS8vIFNldCBCVy4KLQkJCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKLQkJCQl7Ci0JCQkJCVJGVmFsdWUgPSBwQWQtPk1sbWUuQ2FsaUJXNDBSZlIyNDsKLS8vCQkJCQlESVNBQkxFXzExTl9DSEVDSyhwQWQpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSRlZhbHVlID0gcEFkLT5NbG1lLkNhbGlCVzIwUmZSMjQ7Ci0JCQkJfQotCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZCwgUkZfUjI0LCAoVUNIQVIpUkZWYWx1ZSk7Ci0KLQkJCQkvLyBFbmFibGUgUkYgdHVuaW5nCi0JCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIFJGX1IwNywgKFBVQ0hBUikmUkZWYWx1ZSk7Ci0JCQkJUkZWYWx1ZSA9IFJGVmFsdWUgfCAweDE7Ci0JCQkJQVRFX1JGX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBSRl9SMDcsIChVQ0hBUilSRlZhbHVlKTsKLQotCQkJCS8vIGxhdGNoIGNoYW5uZWwgZm9yIGZ1dHVyZSB1c2FnZQotCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA9IENoYW5uZWw7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN3aXRjaENoYW5uZWwjJWQoUkY9JWQsIFB3cjA9JWQsIFB3cjE9JWQsICVkVCksIE49MHglMDJYLCBLPTB4JTAyWCwgUj0weCUwMlhcbiIsCi0JCQlDaGFubmVsLAotCQkJcEFkLT5SZkljVHlwZSwKLQkJCVR4UHdlciwKLQkJCVR4UHdlcjIsCi0JCQlwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoLAotCQkJRnJlcUl0ZW1zMzAyMFtpbmRleF0uTiwKLQkJCUZyZXFJdGVtczMwMjBbaW5kZXhdLkssCi0JCQlGcmVxSXRlbXMzMDIwW2luZGV4XS5SKSk7Ci0JfQotCWVsc2UKLS8vMjAwOC8wNy8xMDpLSCBhZGQgdG8gc3VwcG9ydCAzMDcwIEFURS0tPgotI2VuZGlmIC8vIFJUMzB4eCAvLwotCXsKLQkJLyogUlQyOHh4ICovCi0JCVJGUmVnVGFibGUgPSBSRjI4NTBSZWdUYWJsZTsKLQotCQlzd2l0Y2ggKHBBZC0+UmZJY1R5cGUpCi0JCXsKLQkJCS8qIEJ1dCBvbmx5IDI4NTAgYW5kIDI3NTAgc3VwcG9ydCA1LjVHSHogYmFuZC4uLiAqLwotCQkJY2FzZSBSRklDXzI4MjA6Ci0JCQljYXNlIFJGSUNfMjg1MDoKLQkJCWNhc2UgUkZJQ18yNzIwOgotCQkJY2FzZSBSRklDXzI3NTA6Ci0KLQkJCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fT0ZfMjg1MF9DSE5MOyBpbmRleCsrKQotCQkJCXsKLQkJCQkJaWYgKENoYW5uZWwgPT0gUkZSZWdUYWJsZVtpbmRleF0uQ2hhbm5lbCkKLQkJCQkJewotCQkJCQkJUjIgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMjsKLQotCQkJCQkJLy8gSWYgVFggcGF0aCBpcyAxLCBiaXQgMTQgPSAxOwotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMSkKLQkJCQkJCXsKLQkJCQkJCQlSMiB8PSAweDQwMDA7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDIpCi0JCQkJCQl7Ci0JCQkJCQkJc3dpdGNoIChwQWQtPmF0ZS5SeEFudGVubmFTZWwpCi0JCQkJCQkJewotCQkJCQkJCQljYXNlIDE6Ci0JCQkJCQkJCQlSMiB8PSAweDIwMDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkJCVIyIHw9IDB4MTAwNDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKLQkJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7Ci0JCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOwotCQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQkJCVIyIHw9IDB4NDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKLQkJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7Ci0JCQkJCQkJCQkvKiBPbmx5IGVuYWJsZSB0d28gQW50ZW5uYSB0byByZWNlaXZlLiAqLwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwODsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCQkJCQkJewotCQkJCQkJCS8vIHdyaXRlIDEgdG8gb2ZmIFJ4UGF0aAotCQkJCQkJCVIyIHw9IDB4MjAwNDA7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAxKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gSWYgVFggQW50ZW5uYSBzZWxlY3QgaXMgMSAsIGJpdCAxNCA9IDE7IERpc2FibGUgQW50IDIKLQkJCQkJCQkJUjIgfD0gMHg0MDAwOwotCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgJkJicFZhbHVlKTsKLQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNzsJCS8vIDExMTAwMTExQgotCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAocEFkLT5hdGUuVHhBbnRlbm5hU2VsID09IDIpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBJZiBUWCBBbnRlbm5hIHNlbGVjdCBpcyAyICwgYml0IDE1ID0gMTsgRGlzYWJsZSBBbnQgMQotCQkJCQkJCQlSMiB8PSAweDgwMDA7Ci0JCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQmJwVmFsdWUpOwotCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU3OwotCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDA4OwotCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIEJicFZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCUJicFZhbHVlICY9IDB4RTc7Ci0JCQkJCQkJCUJicFZhbHVlIHw9IDB4MTA7Ci0JCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQmJwVmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JCQkJCQl7Ci0JCQkJCQkJc3dpdGNoIChwQWQtPmF0ZS5SeEFudGVubmFTZWwpCi0JCQkJCQkJewotCQkJCQkJCQljYXNlIDE6Ci0JCQkJCQkJCQlSMiB8PSAweDIwMDQwOwotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgwMDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkJCVIyIHw9IDB4MTAwNDA7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJkJicFZhbHVlKTsKLQkJCQkJCQkJCUJicFZhbHVlICY9IDB4RTQ7Ci0JCQkJCQkJCQlCYnBWYWx1ZSB8PSAweDAxOwotCQkJCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSAzOgotCQkJCQkJCQkJUjIgfD0gMHgzMDAwMDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmQmJwVmFsdWUpOwotCQkJCQkJCQkJQmJwVmFsdWUgJj0gMHhFNDsKLQkJCQkJCQkJCUJicFZhbHVlIHw9IDB4MDI7Ci0JCQkJCQkJCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIEJicFZhbHVlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZCYnBWYWx1ZSk7Ci0JCQkJCQkJCQlCYnBWYWx1ZSAmPSAweEU0OwotCQkJCQkJCQkJQmJwVmFsdWUgfD0gMHgxMDsKLQkJCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgQmJwVmFsdWUpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoQ2hhbm5lbCA+IDE0KQotCQkJCQkJewotCQkJCQkJCS8vIGluaXRpYWxpemUgUjMsIFI0Ci0JCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKTsKLQkJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSk7Ci0KLQkJICAgICAgICAgICAgICAgICAgICAvKgotCQkJICAgICAgICAgICAgICAgICAgICBBY2NvcmRpbmcgdGhlIFJvcnkncyBzdWdnZXN0aW9uIHRvIHNvbHZlIHRoZSBtaWRkbGUgcmFuZ2UgaXNzdWUuCi0KLQkJCQkJCQkJNS41RyBiYW5kIHBvd2VyIHJhbmdlIDogMHhGOX4wWDBGLCBUWDAgUmVnMyBiaXQ5L1RYMSBSZWc0IGJpdDY9IjAiCi0JCQkJCQkJCQkJCQkJCW1lYW5zIHRoZSBUWCBwb3dlciByZWR1Y2UgN2RCLgotCQkJCQkJCSovCi0JCQkJCQkJLy8gUjMKLQkJCQkJCQlpZiAoKFR4UHdlciA+PSAtNykgJiYgKFR4UHdlciA8IDApKQotCQkJCQkJCXsKLQkJCQkJCQkJVHhQd2VyID0gKDcrVHhQd2VyKTsKLQkJCQkJCQkJVHhQd2VyID0gKFR4UHdlciA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIpOwotCQkJCQkJCQlSMyB8PSAoVHhQd2VyIDw8IDEwKTsKLQkJCQkJCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVRFQXNpY1N3aXRjaENoYW5uZWw6IFR4UHdlcj0lZCBcbiIsIFR4UHdlcikpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIgPSAoVHhQd2VyID4gMHhGKSA/ICgweEYpIDogKFR4UHdlcik7Ci0JCQkJCQkJCVIzIHw9IChUeFB3ZXIgPDwgMTApIHwgKDEgPDwgOSk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gUjQKLQkJCQkJCQlpZiAoKFR4UHdlcjIgPj0gLTcpICYmIChUeFB3ZXIyIDwgMCkpCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIyID0gKDcrVHhQd2VyMik7Ci0JCQkJCQkJCVR4UHdlcjIgPSAoVHhQd2VyMiA+IDB4RikgPyAoMHhGKSA6IChUeFB3ZXIyKTsKLQkJCQkJCQkJUjQgfD0gKFR4UHdlcjIgPDwgNyk7Ci0JCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFURUFzaWNTd2l0Y2hDaGFubmVsOiBUeFB3ZXIyPSVkIFxuIiwgVHhQd2VyMikpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlUeFB3ZXIyID0gKFR4UHdlcjIgPiAweEYpID8gKDB4RikgOiAoVHhQd2VyMik7Ci0JCQkJCQkJCVI0IHw9IChUeFB3ZXIyIDw8IDcpIHwgKDEgPDwgNik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIFNldCBUWCBwb3dlcjAuCi0JCQkJCQkJUjMgPSAoUkZSZWdUYWJsZVtpbmRleF0uUjMgJiAweGZmZmZjMWZmKSB8IChUeFB3ZXIgPDwgOSk7Ci0JCQkJCQkJLy8gU2V0IGZyZXF1ZW5jeSBvZmZzZXQgYW5kIFRYIHBvd2VyMS4KLQkJCQkJCQlSNCA9IChSRlJlZ1RhYmxlW2luZGV4XS5SNCAmICh+MHgwMDFmODdjMCkpIHwgKHBBZC0+YXRlLlJGRnJlcU9mZnNldCA8PCAxNSkgfCAoVHhQd2VyMiA8PDYpOwotCQkJCQkJfQotCi0JCQkJCQkvLyBiYXNlZCBvbiBCQlAgY3VycmVudCBtb2RlIGJlZm9yZSBjaGFuZ2luZyBSRiBjaGFubmVsCi0JCQkJCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV180MCkKLQkJCQkJCXsKLQkJCQkJCQlSNCB8PTB4MjAwMDAwOwotCQkJCQkJfQotCi0JCQkJCQkvLyBVcGRhdGUgdmFyaWFibGVzLgotCQkJCQkJcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsID0gQ2hhbm5lbDsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjEgPSBSRlJlZ1RhYmxlW2luZGV4XS5SMTsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjIgPSBSMjsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjMgPSBSMzsKLQkJCQkJCXBBZC0+TGF0Y2hSZlJlZ3MuUjQgPSBSNDsKLQotCQkJCQkJUnRtcFJmSW9Xcml0ZShwQWQpOwotCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8vIENoYW5nZSBCQlAgc2V0dGluZyBkdXJpbmcgc3dpdGNoIGZyb20gYS0+ZywgZy0+YQotCWlmIChDaGFubmVsIDw9IDE0KQotCXsKLQkgICAgVUlOVDMyIFR4UGluQ2ZnID0gMHgwMDA1MEYwQTsvLyAyMDA3LjEwLjA5IGJ5IEJyaWFuIDogMHgwMDA1MDUwQSA9PT4gMHgwMDA1MEYwQQotCi0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjIsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MywgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY0LCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0KLQkJLyogRm9yIDFULzJSIGNoaXAgb25seS4uLiAqLwotCSAgICBpZiAocEFkLT5OaWNDb25maWcyLmZpZWxkLkV4dGVybmFsTE5BRm9yRykKLQkgICAgewotCSAgICAgICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHg2Mik7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjgyLCAweDg0KTsKLQkgICAgfQotCi0gICAgICAgIC8vIEFjY29yZGluZyB0aGUgUm9yeSdzIHN1Z2dlc3Rpb24gdG8gc29sdmUgdGhlIG1pZGRsZSByYW5nZSBpc3N1ZS4KLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAmQmJwVmFsdWUpOy8vIG1heSBiZSByZW1vdmVkIGZvciBSVDM1eHggKysKLQotCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsKLQkJaWYgKChCYnBWYWx1ZSAhPSAweDAwKSkKLQkJewotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4NiwgMHgwMCk7Ci0JCX0vLyBtYXkgYmUgcmVtb3ZlZCBmb3IgUlQzNXh4IC0tCi0KLQkJLy8gNS41IEdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDYpOwotCQlWYWx1ZSB8PSAoMHgwNCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0KLSAgICAgICAgLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JCX0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKLQkJfQotCi0JCS8vIGNhbGlicmF0aW9uIHBvd2VyIHVuYmFsYW5jZSBpc3N1ZXMKLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGggPT0gMikKLQkJewotCQkJaWYgKHBBZC0+YXRlLlR4QW50ZW5uYVNlbCA9PSAxKQotCQkJewotCQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjc7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPmF0ZS5UeEFudGVubmFTZWwgPT0gMikKLQkJCXsKLQkJCQlUeFBpbkNmZyAmPSAweEZGRkZGRkZEOwotCQkJfQotCQl9Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUElOX0NGRywgVHhQaW5DZmcpOwotCX0KLQllbHNlCi0JewotCSAgICBVSU5UMzIJVHhQaW5DZmcgPSAweDAwMDUwRjA1Oy8vIDIwMDcuMTAuMDkgYnkgQnJpYW4gOiAweDAwMDUwNTA1ID09PiAweDAwMDUwRjA1Ci0KLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2MiwgKDB4MzcgLSBHRVRfTE5BX0dBSU4ocEFkKSkpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjYzLCAoMHgzNyAtIEdFVF9MTkFfR0FJTihwQWQpKSk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjQsICgweDM3IC0gR0VUX0xOQV9HQUlOKHBBZCkpKTsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I4MiwgMHhGMik7Ci0KLSAgICAgICAgLy8gQWNjb3JkaW5nIHRoZSBSb3J5J3Mgc3VnZ2VzdGlvbiB0byBzb2x2ZSB0aGUgbWlkZGxlIHJhbmdlIGlzc3VlLgotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SODYsICZCYnBWYWx1ZSk7Ly8gbWF5IGJlIHJlbW92ZWQgZm9yIFJUMzV4eCArKwotCi0JCUFTU0VSVCgoQmJwVmFsdWUgPT0gMHgwMCkpOwotCQlpZiAoKEJicFZhbHVlICE9IDB4MDApKQotCQl7Ci0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjg2LCAweDAwKTsKLQkJfQotCi0JCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I5MSwgJkJicFZhbHVlKTsKLQkJQVNTRVJUKChCYnBWYWx1ZSA9PSAweDA0KSk7Ci0KLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjkyLCAmQmJwVmFsdWUpOwotCQlBU1NFUlQoKEJicFZhbHVlID09IDB4MDApKTsvLyBtYXkgYmUgcmVtb3ZlZCBmb3IgUlQzNXh4IC0tCi0KLQkJLy8gNS41IEdIeiBiYW5kIHNlbGVjdGlvbiBQSU4sIGJpdDEgYW5kIGJpdDIgYXJlIGNvbXBsZW1lbnQKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDYpOwotCQlWYWx1ZSB8PSAoMHgwMik7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0KLQkJLy8gVHVybiBvZmYgdW51c2VkIFBBIG9yIExOQSB3aGVuIG9ubHkgMVQgb3IgMVIuCi0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDEpCi0JCXsKLQkJCVR4UGluQ2ZnICY9IDB4RkZGRkZGRjM7Ci0JCX0KLQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPT0gMSkKLQkJewotCQkJVHhQaW5DZmcgJj0gMHhGRkZGRjNGRjsKLQkJfQotCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1BJTl9DRkcsIFR4UGluQ2ZnKTsKLQl9Ci0KLQotICAgIC8vIFI2NiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byBDaGFubmVsIGFuZCB1c2UgMjBNSHogd2hlbiBzY2FubmluZwotCWlmIChDaGFubmVsIDw9IDE0KQotCXsKLQkJLy8gQkcgYmFuZAotCQlSNjYgPSAweDJFICsgR0VUX0xOQV9HQUlOKHBBZCk7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIFI2Nik7Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIDUuNSBHSHogYmFuZAotCQlpZiAocEFkLT5hdGUuVHhXSS5CVyA9PSBCV18yMCkKLQkJewotCQkJUjY2ID0gKFVDSEFSKSgweDMyICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCBSNjYpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUjY2ID0gKFVDSEFSKSgweDNBICsgKEdFVF9MTkFfR0FJTihwQWQpKjUpLzMpOwotCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgUjY2KTsKLQkJfQotCX0KLQotCS8qCi0JCU9uIDExQSwgV2Ugc2hvdWxkIGRlbGF5IGFuZCB3YWl0IFJGL0JCUCB0byBiZSBzdGFibGUKLQkJYW5kIHRoZSBhcHByb3ByaWF0ZSB0aW1lIHNob3VsZCBiZSAxMDAwIG1pY3JvIHNlY29uZHMuCi0KLQkJMjAwNS8wNi8wNSAtIE9uIDExRywgV2UgYWxzbyBuZWVkIHRoaXMgZGVsYXkgdGltZS4gT3RoZXJ3aXNlIGl0J3MgZGlmZmljdWx0IHRvIHBhc3MgdGhlIFdIUUwuCi0JKi8KLQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCi0jaWZuZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCWlmIChDaGFubmVsID4gMTQpCi0JewotCQkvLyBXaGVuIDUuNUdIeiBiYW5kIHRoZSBMU0Igb2YgVHhQd3Igd2lsbCBiZSB1c2VkIHRvIHJlZHVjZWQgN2RCIG9yIG5vdC4KLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3dpdGNoQ2hhbm5lbCMlZChSRj0lZCwgJWRUKSB0byAsIFIxPTB4JTA4bHgsIFIyPTB4JTA4bHgsIFIzPTB4JTA4bHgsIFI0PTB4JTA4bHhcbiIsCi0JCQkJCQkJCSAgQ2hhbm5lbCwKLQkJCQkJCQkJICBwQWQtPlJmSWNUeXBlLAotCQkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKLQkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOwotCX0KLQllbHNlCi0JewotCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTd2l0Y2hDaGFubmVsIyVkKFJGPSVkLCBQd3IwPSV1LCBQd3IxPSV1LCAlZFQpIHRvICwgUjE9MHglMDhseCwgUjI9MHglMDhseCwgUjM9MHglMDhseCwgUjQ9MHglMDhseFxuIiwKLQkJCQkJCQkJICBDaGFubmVsLAotCQkJCQkJCQkgIHBBZC0+UmZJY1R5cGUsCi0JCQkJCQkJCSAgKFIzICYgMHgwMDAwM2UwMCkgPj4gOSwKLQkJCQkJCQkJICAoUjQgJiAweDAwMDAwN2MwKSA+PiA2LAotCQkJCQkJCQkgIHBBZC0+QW50ZW5uYS5maWVsZC5UeFBhdGgsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SMSwKLQkJCQkJCQkJICBwQWQtPkxhdGNoUmZSZWdzLlIyLAotCQkJCQkJCQkgIHBBZC0+TGF0Y2hSZlJlZ3MuUjMsCi0JCQkJCQkJCSAgcEFkLT5MYXRjaFJmUmVncy5SNCkpOwotICAgIH0KLSNlbmRpZiAvLyBSVE1QX1JGX1JXX1NVUFBPUlQgLy8KLX0KLQotCi0KLS8qIEluIGZhY3QsIG5vIG9uZSB3aWxsIGNhbGwgdGhpcyByb3V0aW5lIHNvIGZhciAhICovCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlHaXZlcyBDQ0sgVFggcmF0ZSAyIG1vcmUgZEIgVFggcG93ZXIuCi0JCVRoaXMgcm91dGluZSB3b3JrcyBvbmx5IGluIEFURSBtb2RlLgotCi0JCWNhbGN1bGF0ZSBkZXNpcmVkIFR4IHBvd2VyIGluIFJGIFIzLlR4MH41LAlzaG91bGQgY29uc2lkZXIgLQotCQkwLiBpZiBjdXJyZW50IHJhZGlvIGlzIGEgbm9pc3kgZW52aXJvbm1lbnQgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpCi0JCTEuIFR4UG93ZXJQZXJjZW50YWdlCi0JCTIuIGF1dG8gY2FsaWJyYXRpb24gYmFzZWQgb24gVFNTSSBmZWVkYmFjawotCQkzLiBleHRyYSAyIGRiIGZvciBDQ0sKLQkJNC4gLTEwIGRiIHVwb24gdmVyeS1zaG9ydCBkaXN0YW5jZSAoQXZnUlNTSSA+PSAtNDBkYikgdG8gQVAKLQotCU5PVEU6IFNpbmNlIHRoaXMgcm91dGluZSByZXF1aXJlcyB0aGUgdmFsdWUgb2YgKHBBZC0+RHJzQ291bnRlcnMuZk5vaXN5RW52aXJvbm1lbnQpLAotCQlpdCBzaG91bGQgYmUgY2FsbGVkIEFGVEVSIE1sbWVEeW5hbWljVHhSYXRlU3dpdGNoaW5nKCkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBBVEVBc2ljQWRqdXN0VHhQb3dlcigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlJTlQJCQlpLCBqOwotCUNIQVIJCURlbHRhUHdyID0gMDsKLQlCT09MRUFOCQliQXV0b1R4QWdjID0gRkFMU0U7Ci0JVUNIQVIJCVRzc2lSZWYsICpwVHNzaU1pbnVzQm91bmRhcnksICpwVHNzaVBsdXNCb3VuZGFyeSwgVHhBZ2NTdGVwOwotCVVDSEFSCQlCYnBSNDkgPSAwLCBpZHg7Ci0JUENIQVIJCXBUeEFnY0NvbXBlbnNhdGU7Ci0JVUxPTkcJCVR4UHdyWzVdOwotCUNIQVIJCVZhbHVlOwotCi0JLyogbm8gb25lIGNhbGxzIHRoaXMgcHJvY2VkdXJlIHNvIGZhciAqLwotCWlmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzQwKQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDQwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4NDBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHg0ME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHg0ME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDQwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4NDBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPiAxNCkKLQkJewotCQkJVHhQd3JbMF0gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbMF07Ci0JCQlUeFB3clsxXSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFsxXTsKLQkJCVR4UHdyWzJdID0gcEFkLT5UeDIwTVB3ckNmZ0FCYW5kWzJdOwotCQkJVHhQd3JbM10gPSBwQWQtPlR4MjBNUHdyQ2ZnQUJhbmRbM107Ci0JCQlUeFB3cls0XSA9IHBBZC0+VHgyME1Qd3JDZmdBQmFuZFs0XTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVR4UHdyWzBdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzBdOwotCQkJVHhQd3JbMV0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbMV07Ci0JCQlUeFB3clsyXSA9IHBBZC0+VHgyME1Qd3JDZmdHQmFuZFsyXTsKLQkJCVR4UHdyWzNdID0gcEFkLT5UeDIwTVB3ckNmZ0dCYW5kWzNdOwotCQkJVHhQd3JbNF0gPSBwQWQtPlR4MjBNUHdyQ2ZnR0JhbmRbNF07Ci0JCX0KLQl9Ci0KLQkvLyBUWCBwb3dlciBjb21wZW5zYXRpb24gZm9yIHRlbXBlcmF0dXJlIHZhcmlhdGlvbiBiYXNlZCBvbiBUU1NJLgotCS8vIERvIGl0IHBlciA0IHNlY29uZHMuCi0JaWYgKHBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kICUgNCA9PSAwKQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCS8qIGJnIGNoYW5uZWwgKi8KLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7Ci0JCQlUc3NpUmVmICAgICAgICAgICAgPSBwQWQtPlRzc2lSZWZHOwotCQkJcFRzc2lNaW51c0JvdW5kYXJ5ID0gJnBBZC0+VHNzaU1pbnVzQm91bmRhcnlHWzBdOwotCQkJcFRzc2lQbHVzQm91bmRhcnkgID0gJnBBZC0+VHNzaVBsdXNCb3VuZGFyeUdbMF07Ci0JCQlUeEFnY1N0ZXAgICAgICAgICAgPSBwQWQtPlR4QWdjU3RlcEc7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogYSBjaGFubmVsICovCi0JCQliQXV0b1R4QWdjICAgICAgICAgPSBwQWQtPmJBdXRvVHhBZ2NBOwotCQkJVHNzaVJlZiAgICAgICAgICAgID0gcEFkLT5Uc3NpUmVmQTsKLQkJCXBUc3NpTWludXNCb3VuZGFyeSA9ICZwQWQtPlRzc2lNaW51c0JvdW5kYXJ5QVswXTsKLQkJCXBUc3NpUGx1c0JvdW5kYXJ5ICA9ICZwQWQtPlRzc2lQbHVzQm91bmRhcnlBWzBdOwotCQkJVHhBZ2NTdGVwICAgICAgICAgID0gcEFkLT5UeEFnY1N0ZXBBOwotCQkJcFR4QWdjQ29tcGVuc2F0ZSAgID0gJnBBZC0+VHhBZ2NDb21wZW5zYXRlQTsKLQkJfQotCi0JCWlmIChiQXV0b1R4QWdjKQotCQl7Ci0JCQkvKiBCYnBSNDkgaXMgdW5zaWduZWQgY2hhci4gKi8KLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0OSwgJkJicFI0OSk7Ci0KLQkJCS8qIChwKSBUc3NpUGx1c0JvdW5kYXJ5R1swXSA9IDAgPSAobSkgVHNzaU1pbnVzQm91bmRhcnlHWzBdICovCi0JCQkvKiBjb21wZW5zYXRlOiArNCAgICAgKzMgICArMiAgICsxICAgIDAgICAtMSAgIC0yICAgLTMgICAtNCAqIHN0ZXBzICovCi0JCQkvKiBzdGVwIHZhbHVlIGlzIGRlZmluZWQgaW4gcEFkLT5UeEFnY1N0ZXBHIGZvciB0eCBwb3dlciB2YWx1ZSAqLwotCi0JCQkvKiBbNF0rMStbNF0gICBwNCAgICAgcDMgICBwMiAgIHAxICAgbzEgICBtMSAgIG0yICAgbTMgICBtNCAqLwotCQkJLyogZXg6ICAgICAgICAgMHgwMCAweDE1IDB4MjUgMHg0NSAweDg4IDB4QTAgMHhCNSAweEQwIDB4RjAKLQkJCSAgIGFib3ZlIHZhbHVlIGFyZSBleGFtaW5lZCBpbiBtYXNzIGZhY3RvcnkgcHJvZHVjdGlvbiAqLwotCQkJLyogICAgICAgICAgICAgWzRdICAgIFszXSAgWzJdICBbMV0gIFswXSAgWzFdICBbMl0gIFszXSAgWzRdICovCi0KLQkJCS8qIHBsdXMgaXMgMHgxMCB+IDB4NDAsIG1pbnVzIGlzIDB4NjAgfiAweDkwICovCi0JCQkvKiBpZiB2YWx1ZSBpcyBiZXR3ZWVuIHAxIH4gbzEgb3IgbzEgfiBzMSwgbm8gbmVlZCB0byBhZGp1c3QgdHggcG93ZXIgKi8KLQkJCS8qIGlmIHZhbHVlIGlzIDB4NjUsIHR4IHBvd2VyIHdpbGwgYmUgLT0gVHhBZ2NTdGVwKigyLTEpICovCi0KLQkJCWlmIChCYnBSNDkgPiBwVHNzaU1pbnVzQm91bmRhcnlbMV0pCi0JCQl7Ci0JCQkJLy8gUmVhZGluZyBpcyBsYXJnZXIgdGhhbiB0aGUgcmVmZXJlbmNlIHZhbHVlLgotCQkJCS8vIENoZWNrIGZvciBob3cgbGFyZ2Ugd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgVHggcG93ZXIuCi0JCQkJZm9yIChpZHggPSAxOyBpZHggPCA1OyBpZHgrKykKLQkJCQl7Ci0JCQkJCS8vIEZvdW5kIHRoZSByYW5nZS4KLQkJCQkJaWYgKEJicFI0OSA8PSBwVHNzaU1pbnVzQm91bmRhcnlbaWR4XSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8vIFRoZSBpbmRleCBpcyB0aGUgc3RlcCB3ZSBzaG91bGQgZGVjcmVhc2UsIGlkeCA9IDAgbWVhbnMgdGhlcmUgaXMgbm90aGluZyB0byBjb21wZW5zYXRlLgotLy8JCQkJaWYgKFIzID4gKFVMT05HKSAoVHhBZ2NTdGVwICogKGlkeC0xKSkpCi0JCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gLShUeEFnY1N0ZXAgKiAoaWR4LTEpKTsKLS8vCQkJCWVsc2UKLS8vCQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IC0oKFVDSEFSKVIzKTsKLQotCQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0gVHggUG93ZXIsIEJCUCBSMT0leCwgVHNzaVJlZj0leCwgVHhBZ2NTdGVwPSV4LCBzdGVwID0gLSVkXG4iLAotCQkJCQlCYnBSNDksIFRzc2lSZWYsIFR4QWdjU3RlcCwgaWR4LTEpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEJicFI0OSA8IHBUc3NpUGx1c0JvdW5kYXJ5WzFdKQotCQkJewotCQkJCS8vIFJlYWRpbmcgaXMgc21hbGxlciB0aGFuIHRoZSByZWZlcmVuY2UgdmFsdWUuCi0JCQkJLy8gQ2hlY2sgZm9yIGhvdyBsYXJnZSB3ZSBuZWVkIHRvIGluY3JlYXNlIHRoZSBUeCBwb3dlci4KLQkJCQlmb3IgKGlkeCA9IDE7IGlkeCA8IDU7IGlkeCsrKQotCQkJCXsKLQkJCQkJLy8gRm91bmQgdGhlIHJhbmdlLgotCQkJCQlpZiAoQmJwUjQ5ID49IHBUc3NpUGx1c0JvdW5kYXJ5W2lkeF0pCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQkvLyBUaGUgaW5kZXggaXMgdGhlIHN0ZXAgd2Ugc2hvdWxkIGluY3JlYXNlLCBpZHggPSAwIG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGVuc2F0ZS4KLQkJCQkqcFR4QWdjQ29tcGVuc2F0ZSA9IFR4QWdjU3RlcCAqIChpZHgtMSk7Ci0JCQkJRGVsdGFQd3IgKz0gKCpwVHhBZ2NDb21wZW5zYXRlKTsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIrKyBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCBpZHgtMSkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCSpwVHhBZ2NDb21wZW5zYXRlID0gMDsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIgICBUeCBQb3dlciwgQkJQIFIxPSV4LCBUc3NpUmVmPSV4LCBUeEFnY1N0ZXA9JXgsIHN0ZXAgPSArJWRcbiIsCi0JCQkJCUJicFI0OSwgVHNzaVJlZiwgVHhBZ2NTdGVwLCAwKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYgKHBBZC0+YXRlLkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCWJBdXRvVHhBZ2MgICAgICAgICA9IHBBZC0+YkF1dG9UeEFnY0c7Ci0JCQlwVHhBZ2NDb21wZW5zYXRlICAgPSAmcEFkLT5UeEFnY0NvbXBlbnNhdGVHOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJYkF1dG9UeEFnYyAgICAgICAgID0gcEFkLT5iQXV0b1R4QWdjQTsKLQkJCXBUeEFnY0NvbXBlbnNhdGUgICA9ICZwQWQtPlR4QWdjQ29tcGVuc2F0ZUE7Ci0JCX0KLQotCQlpZiAoYkF1dG9UeEFnYykKLQkJCURlbHRhUHdyICs9ICgqcFR4QWdjQ29tcGVuc2F0ZSk7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIGRlbHRhIHBvd2VyIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIHNwZWNpZmllZCBmcm9tIFVJLiAqLwotCS8vIEUyUFJPTSBzZXR0aW5nIGlzIGNhbGlicmF0ZWQgZm9yIG1heGltdW0gVFggcG93ZXIgKGkuZS4gMTAwJSkKLQkvLyBXZSBsb3dlciBUWCBwb3dlciBoZXJlIGFjY29yZGluZyB0byB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgZnJvbSBVSS4KLQlpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPT0gMHhmZmZmZmZmZikgICAgICAgLy8gQVVUTyBUWCBQT1dFUiBjb250cm9sCi0JCTsKLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDkwKSAgLy8gOTEgfiAxMDAlICYgQVVUTywgdHJlYXQgYXMgMTAwJSBpbiB0ZXJtcyBvZiBtVwotCQk7Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA2MCkgIC8vIDYxIH4gOTAlLCB0cmVhdCBhcyA3NSUgaW4gdGVybXMgb2YgbVcKLQl7Ci0JCURlbHRhUHdyIC09IDE7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID4gMzApICAvLyAzMSB+IDYwJSwgdHJlYXQgYXMgNTAlIGluIHRlcm1zIG9mIG1XCi0JewotCQlEZWx0YVB3ciAtPSAzOwotCX0KLQllbHNlIGlmIChwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA+IDE1KSAgLy8gMTYgfiAzMCUsIHRyZWF0IGFzIDI1JSBpbiB0ZXJtcyBvZiBtVwotCXsKLQkJRGVsdGFQd3IgLT0gNjsKLQl9Ci0JZWxzZSBpZiAocEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UgPiA5KSAgIC8vIDEwIH4gMTUlLCB0cmVhdCBhcyAxMi41JSBpbiB0ZXJtcyBvZiBtVwotCXsKLQkJRGVsdGFQd3IgLT0gOTsKLQl9Ci0JZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwIH4gOSAlLCB0cmVhdCBhcyBNSU4ofjMlKSBpbiB0ZXJtcyBvZiBtVwotCXsKLQkJRGVsdGFQd3IgLT0gMTI7Ci0JfQotCi0JLyogUmVzZXQgZGlmZmVyZW50IG5ldyB0eCBwb3dlciBmb3IgZGlmZmVyZW50IFRYIHJhdGUuICovCi0JZm9yIChpPTA7IGk8NTsgaSsrKQotCXsKLQkJaWYgKFR4UHdyW2ldICE9IDB4ZmZmZmZmZmYpCi0JCXsKLQkJCWZvciAoaj0wOyBqPDg7IGorKykKLQkJCXsKLQkJCQlWYWx1ZSA9IChDSEFSKSgoVHhQd3JbaV0gPj4gaio0KSAmIDB4MEYpOyAvKiAwIH4gMTUgKi8KLQotCQkJCWlmICgoVmFsdWUgKyBEZWx0YVB3cikgPCAwKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAwOyAvKiBtaW4gKi8KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFZhbHVlICsgRGVsdGFQd3IpID4gMHhGKQotCQkJCXsKLQkJCQkJVmFsdWUgPSAweEY7IC8qIG1heCAqLwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlWYWx1ZSArPSBEZWx0YVB3cjsgLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uICovCi0JCQkJfQotCi0JCQkJLyogZmlsbCBuZXcgdmFsdWUgdG8gQ1NSIG9mZnNldCAqLwotCQkJCVR4UHdyW2ldID0gKFR4UHdyW2ldICYgfigweDAwMDAwMDBGIDw8IGoqNCkpIHwgKFZhbHVlIDw8IGoqNCk7Ci0JCQl9Ci0KLQkJCS8qIHdyaXRlIHR4IHBvd2VyIHZhbHVlIHRvIENTUiAqLwotCQkJLyogVFhfUFdSX0NGR18wICg4IHR4IHJhdGUpIGZvcglUWCBwb3dlciBmb3IgT0ZETSAxMk0vMThNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBPRkRNIDZNLzlNCi0JCQkJCQkJCQkJCVRYIHBvd2VyIGZvciBDQ0s1LjVNLzExTQotCQkJCQkJCQkJCQlUWCBwb3dlciBmb3IgQ0NLMU0vMk0gKi8KLQkJCS8qIFRYX1BXUl9DRkdfMSB+IFRYX1BXUl9DRkdfNCAqLwotCQkJUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUFdSX0NGR18wICsgaSo0LCBUeFB3cltpXSk7Ci0KLQotCQl9Ci0JfQotCi19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVdyaXRlIFR4V0kgZm9yIEFURSBtb2RlLgotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgVk9JRCBBVEVXcml0ZVR4V0koCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYV0lfU1RSVUMJcE91dFR4V0ksCi0JSU4JQk9PTEVBTgkJCUZSQUcsCi0JSU4JQk9PTEVBTgkJCUNGQUNLLAotCUlOCUJPT0xFQU4JCQlJbnNUaW1lc3RhbXAsCi0JSU4JQk9PTEVBTgkJCUFNUERVLAotCUlOCUJPT0xFQU4JCQlBY2ssCi0JSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KLQlJTglVQ0hBUgkJCUJBU2l6ZSwKLQlJTglVQ0hBUgkJCVdDSUQsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4JVUNIQVIJCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpCi17Ci0JVFhXSV9TVFJVQwkJVHhXSTsKLQlQVFhXSV9TVFJVQwlwVHhXSTsKLQotCS8vCi0JLy8gQWx3YXlzIHVzZSBMb25nIHByZWFtYmxlIGJlZm9yZSB2ZXJpZmlhdGlvbiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzIHdlbGwuCi0JLy8gVG9kbzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBpZiBzaG9ydCBwcmVhbWJsZSBmdW5jdGlvbmFsaXR5IHdvcmtzCi0JLy8KLQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19TSE9SVF9QUkVBTUJMRV9JTlVTRUQpOwotCU5kaXNaZXJvTWVtb3J5KCZUeFdJLCBUWFdJX1NJWkUpOwotCXBUeFdJID0gJlR4V0k7Ci0KLQlwVHhXSS0+RlJBRz0gRlJBRzsKLQotCXBUeFdJLT5DRkFDSyA9IENGQUNLOwotCXBUeFdJLT5UUz0gSW5zVGltZXN0YW1wOwotCXBUeFdJLT5BTVBEVSA9IEFNUERVOwotCXBUeFdJLT5BQ0sgPSBBY2s7Ci0JcFR4V0ktPnR4b3A9IFR4b3Btb2RlOwotCi0JcFR4V0ktPk5TRVEgPSBOU2VxOwotCi0JLy8gSm9obiB0dW5lIHRoZSBwZXJmb3JtYWNlIHdpdGggSW50ZWwgQ2xpZW50IGluIDIwIE1IeiBwZXJmb3JtYW5jZQotCWlmICggQkFTaXplID43ICkKLQkJQkFTaXplID03OwotCi0JcFR4V0ktPkJBV2luU2l6ZSA9IEJBU2l6ZTsKLQlwVHhXSS0+V2lyZWxlc3NDbGlJRCA9IFdDSUQ7Ci0JcFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCA9IExlbmd0aDsKLQlwVHhXSS0+UGFja2V0SWQgPSBQSUQ7Ci0KLQkvLyBJZiBDQ0sgb3IgT0ZETSwgQlcgbXVzdCBiZSAyMAotCXBUeFdJLT5CVyA9IChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPD0gTU9ERV9PRkRNKSA/IChCV18yMCkgOiAocFRyYW5zbWl0LT5maWVsZC5CVyk7Ci0JcFR4V0ktPlNob3J0R0kgPSBwVHJhbnNtaXQtPmZpZWxkLlNob3J0R0k7Ci0JcFR4V0ktPlNUQkMgPSBwVHJhbnNtaXQtPmZpZWxkLlNUQkM7Ci0KLQlwVHhXSS0+TUNTID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7Ci0JcFR4V0ktPlBIWU1PREUgPSBwVHJhbnNtaXQtPmZpZWxkLk1PREU7Ci0JcFR4V0ktPkNGQUNLID0gQ2ZBY2s7Ci0JcFR4V0ktPk1JTU9wcyA9IDA7Ci0JcFR4V0ktPk1wZHVEZW5zaXR5ID0gMDsKLQotCXBUeFdJLT5QYWNrZXRJZCA9IHBUeFdJLT5NQ1M7Ci0JTmRpc01vdmVNZW1vcnkocE91dFR4V0ksICZUeFdJLCBzaXplb2YoVFhXSV9TVFJVQykpOwotCi0gICAgcmV0dXJuOwotfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlEaXNhYmxlIHByb3RlY3Rpb24gZm9yIEFURS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQVRFRGlzYWJsZUFzaWNQcm90ZWN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlQUk9UX0NGR19TVFJVQwlQcm90Q2ZnLCBQcm90Q2ZnNDsKLQlVSU5UMzIgUHJvdGVjdFs2XTsKLQlVU0hPUlQJCQlvZmZzZXQ7Ci0JVUNIQVIJCQlpOwotCVVJTlQzMiBNYWNSZWcgPSAwOwotCi0JLy8gQ29uZmlnIEFTSUMgUlRTIHRocmVzaG9sZCByZWdpc3RlcgotCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRTX0NGRywgJk1hY1JlZyk7Ci0JTWFjUmVnICY9IDB4RkYwMDAwRkY7Ci0JTWFjUmVnIHw9IChwQWQtPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQgPDwgOCk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgVFhfUlRTX0NGRywgTWFjUmVnKTsKLQotCS8vIEluaXRpYWwgY29tbW9uIHByb3RlY3Rpb24gc2V0dGluZ3MKLQlSVE1QWmVyb01lbW9yeShQcm90ZWN0LCBzaXplb2YoUHJvdGVjdCkpOwotCVByb3RDZmc0LndvcmQgPSAwOwotCVByb3RDZmcud29yZCA9IDA7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dHRjQwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd0dGMjAgPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93TU00MCA9IDE7Ci0JUHJvdENmZy5maWVsZC5UeG9wQWxsb3dNTTIwID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlR4b3BBbGxvd09mZG0gPSAxOwotCVByb3RDZmcuZmllbGQuVHhvcEFsbG93Q2NrID0gMTsKLQlQcm90Q2ZnLmZpZWxkLlJUU1RoRW4gPSAxOwotCVByb3RDZmcuZmllbGQuUHJvdGVjdE5hdiA9IEFTSUNfU0hPUlROQVY7Ci0KLQkvLyBIYW5kbGUgbGVnYWN5KEIvRykgcHJvdGVjdGlvbgotCVByb3RDZmcuZmllbGQuUHJvdGVjdFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5SdHNSYXRlOwotCVByb3RDZmcuZmllbGQuUHJvdGVjdEN0cmwgPSAwOwotCVByb3RlY3RbMF0gPSBQcm90Q2ZnLndvcmQ7Ci0JUHJvdGVjdFsxXSA9IFByb3RDZmcud29yZDsKLQotCS8vIE5PIFBST1RFQ1QKLQkvLyAxLkFsbCBTVEFzIGluIHRoZSBCU1MgYXJlIDIwLzQwIE1IeiBIVAotCS8vIDIuIGluIGFpIDIwLzQwTUh6IEJTUwotCS8vIDMuIGFsbCBTVEFzIGFyZSAyME1IeiBpbiBhIDIwTUh6IEJTUwotCS8vIFB1cmUgSFQuIG5vIHByb3RlY3Rpb24uCi0KLQkvLyBNTTIwX1BST1RfQ0ZHCi0JLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCS8vCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCi0JLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JLy8JUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQotCVByb3RlY3RbMl0gPSAweDAxNzQ0MDA0OwotCi0JLy8gTU00MF9QUk9UX0NGRwotCS8vCVJlc2VydmVkICgzMToyNykKLQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQotCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCi0JUHJvdGVjdFszXSA9IDB4MDNmNDQwODQ7Ci0KLQkvLyBDRjIwX1BST1RfQ0ZHCi0JLy8JUmVzZXJ2ZWQgKDMxOjI3KQotCS8vCVBST1RfVFhPUCgyNToyMCkgLS0gMDEwMTExCi0JLy8JUFJPVF9OQVYoMTk6MTgpICAtLSAwMSAoU2hvcnQgTkFWIHByb3RlY3Rpb24pCi0JLy8gIFBST1RfQ1RSTCgxNzoxNikgLS0gMDAgKE5vbmUpCi0JLy8JUFJPVF9SQVRFKDE1OjApICAtLSAweDQwMDQgKE9GRE0gMjRNKQotCVByb3RlY3RbNF0gPSAweDAxNzQ0MDA0OwotCi0JLy8gQ0Y0MF9QUk9UX0NGRwotCS8vCVJlc2VydmVkICgzMToyNykKLQkvLwlQUk9UX1RYT1AoMjU6MjApIC0tIDExMTExMQotCS8vCVBST1RfTkFWKDE5OjE4KSAgLS0gMDEgKFNob3J0IE5BViBwcm90ZWN0aW9uKQotCS8vICBQUk9UX0NUUkwoMTc6MTYpIC0tIDAwIChOb25lKQotCS8vCVBST1RfUkFURSgxNTowKSAgLS0gMHg0MDg0IChkdXBsaWNhdGUgT0ZETSAyNE0pCi0JUHJvdGVjdFs1XSA9IDB4MDNmNDQwODQ7Ci0KLQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJSVFNMb25nUHJvdE9uID0gRkFMU0U7Ci0KLQlvZmZzZXQgPSBDQ0tfUFJPVF9DRkc7Ci0JZm9yIChpID0gMDtpIDwgNjtpKyspCi0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIG9mZnNldCArIGkqNCwgUHJvdGVjdFtpXSk7Ci0KLX0KLQotCi0KLQotLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnZlcnQgUnNzaSAqLwotLyogdGhlIHdheSB1c2VkIHdpdGggR0VUX0xOQV9HQUlOKCkgKi8KLUNIQVIgQVRFQ29udmVydFRvUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglDSEFSCVJzc2ksCi0JSU4gIFVDSEFSICAgUnNzaU51bWJlcikKLXsKLQlVQ0hBUglSc3NpT2Zmc2V0LCBMTkFHYWluOwotCi0JLy8gUnNzaSBlcXVhbHMgdG8gemVybyBzaG91bGQgYmUgYW4gaW52YWxpZCB2YWx1ZQotCWlmIChSc3NpID09IDApCi0JCXJldHVybiAtOTk7Ci0KLQlMTkFHYWluID0gR0VUX0xOQV9HQUlOKHBBZCk7Ci0JaWYgKHBBZC0+TGF0Y2hSZlJlZ3MuQ2hhbm5lbCA+IDE0KQotCXsKLQkJaWYgKFJzc2lOdW1iZXIgPT0gMCkKLQkJCVJzc2lPZmZzZXQgPSBwQWQtPkFSc3NpT2Zmc2V0MDsKLQkJZWxzZSBpZiAoUnNzaU51bWJlciA9PSAxKQotCQkJUnNzaU9mZnNldCA9IHBBZC0+QVJzc2lPZmZzZXQxOwotCQllbHNlCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5BUnNzaU9mZnNldDI7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChSc3NpTnVtYmVyID09IDApCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQwOwotCQllbHNlIGlmIChSc3NpTnVtYmVyID09IDEpCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQxOwotCQllbHNlCi0JCQlSc3NpT2Zmc2V0ID0gcEFkLT5CR1Jzc2lPZmZzZXQyOwotCX0KLQotCXJldHVybiAoLTEyIC0gUnNzaU9mZnNldCAtIExOQUdhaW4gLSBSc3NpKTsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTZXQgSmFwYW4gZmlsdGVyIGNvZWZmaWNpZW50cyBpZiBuZWVkZWQuCi0JTm90ZToKLQkJVGhpcyByb3V0aW5lIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuCi0JCWVudGVyaW5nIFRYRlJBTUUgbW9kZSBvciBUWENPTlQgbW9kZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIFZPSUQgU2V0SmFwYW5GaWx0ZXIoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkKQotewotCVVDSEFSCQkJQmJwRGF0YSA9IDA7Ci0KLQkvLwotCS8vIElmIENoYW5uZWw9MTQgYW5kIEJhbmR3aWR0aD0yME0gYW5kIE1vZGU9Q0NLLCBzZXQgQkJQIFI0IGJpdDU9MQotCS8vIChKYXBhbiBUeCBmaWx0ZXIgY29lZmZpY2llbnRzKXdoZW4gKFRYRlJBTUUgb3IgVFhDT05UKS4KLQkvLwotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQmJwRGF0YSk7Ci0KLSAgICBpZiAoKHBBZC0+YXRlLlR4V0kuUEhZTU9ERSA9PSBNT0RFX0NDSykgJiYgKHBBZC0+YXRlLkNoYW5uZWwgPT0gMTQpICYmIChwQWQtPmF0ZS5UeFdJLkJXID09IEJXXzIwKSkKLSAgICB7Ci0gICAgICAgIEJicERhdGEgfD0gMHgyMDsgICAgLy8gdHVybiBvbgotICAgICAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRKYXBhbkZpbHRlciEhIVxuIikpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCQlCYnBEYXRhICY9IDB4ZGY7ICAgIC8vIHR1cm4gb2ZmCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNsZWFySmFwYW5GaWx0ZXIhISFcbiIpKTsKLSAgICB9Ci0KLQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJicERhdGEpOwotfQotCi0KLVZPSUQgQVRFU2FtcGxlUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpCi17Ci0JLyogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbGxlY3QgUlNTSS4gKi8KLS8vCXBBZC0+TGFzdFJ4UmF0ZSA9IChVU0hPUlQpKChwUnhXSS0+TUNTKSArIChwUnhXSS0+QlcgPDw3KSArIChwUnhXSS0+U2hvcnRHSSA8PDgpKyAocFJ4V0ktPlBIWU1PREUgPDwxNCkpIDsKLQlpZiAocFJ4V0ktPlJTU0kwICE9IDApCi0JewotCQlwQWQtPmF0ZS5MYXN0UnNzaTAJPSBBVEVDb252ZXJ0VG9Sc3NpKHBBZCwgKENIQVIpIHBSeFdJLT5SU1NJMCwgUlNTSV8wKTsKLQkJcEFkLT5hdGUuQXZnUnNzaTBYOAk9IChwQWQtPmF0ZS5BdmdSc3NpMFg4IC0gcEFkLT5hdGUuQXZnUnNzaTApICsgcEFkLT5hdGUuTGFzdFJzc2kwOwotCQlwQWQtPmF0ZS5BdmdSc3NpMAk9IHBBZC0+YXRlLkF2Z1Jzc2kwWDggPj4gMzsKLQl9Ci0JaWYgKHBSeFdJLT5SU1NJMSAhPSAwKQotCXsKLQkJcEFkLT5hdGUuTGFzdFJzc2kxCT0gQVRFQ29udmVydFRvUnNzaShwQWQsIChDSEFSKSBwUnhXSS0+UlNTSTEsIFJTU0lfMSk7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kxWDgJPSAocEFkLT5hdGUuQXZnUnNzaTFYOCAtIHBBZC0+YXRlLkF2Z1Jzc2kxKSArIHBBZC0+YXRlLkxhc3RSc3NpMTsKLQkJcEFkLT5hdGUuQXZnUnNzaTEJPSBwQWQtPmF0ZS5BdmdSc3NpMVg4ID4+IDM7Ci0JfQotCWlmIChwUnhXSS0+UlNTSTIgIT0gMCkKLQl7Ci0JCXBBZC0+YXRlLkxhc3RSc3NpMgk9IEFURUNvbnZlcnRUb1Jzc2kocEFkLCAoQ0hBUikgcFJ4V0ktPlJTU0kyLCBSU1NJXzIpOwotCQlwQWQtPmF0ZS5BdmdSc3NpMlg4CT0gKHBBZC0+YXRlLkF2Z1Jzc2kyWDggLSBwQWQtPmF0ZS5BdmdSc3NpMikgKyBwQWQtPmF0ZS5MYXN0UnNzaTI7Ci0JCXBBZC0+YXRlLkF2Z1Jzc2kyCT0gcEFkLT5hdGUuQXZnUnNzaTJYOCA+PiAzOwotCX0KLQotCXBBZC0+YXRlLkxhc3RTTlIwID0gKENIQVIpKHBSeFdJLT5TTlIwKTsvLyBDSEFSID09PiBVQ0hBUiA/Ci0JcEFkLT5hdGUuTGFzdFNOUjEgPSAoQ0hBUikocFJ4V0ktPlNOUjEpOy8vIENIQVIgPT0+IFVDSEFSID8KLQotCXBBZC0+YXRlLk51bU9mQXZnUnNzaVNhbXBsZSArKzsKLX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFJUTVBTdGF0aW9uU3RvcCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKLXsKLS8vCUJPT0xFQU4gICAgICAgQ2FuY2VsbGVkOwotCi0gICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT0+IFJUTVBTdGF0aW9uU3RvcFxuIikpOwotCi0JLy8gRm9yIHJ4IHN0YXRpc3RpY3MsIHdlIG5lZWQgdG8ga2VlcCB0aGlzIHRpbWVyIHJ1bm5pbmcuCi0vLwlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5QZXJpb2RpY1RpbWVyLCAgICAgICZDYW5jZWxsZWQpOwotCi0gICAgQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RvcFxuIikpOwotfQotCi0KLVZPSUQgUlRNUFN0YXRpb25TdGFydCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCkKLXsKLSAgICBBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT4gUlRNUFN0YXRpb25TdGFydFxuIikpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQotCS8qIFdlIGRpZCBub3QgY2FuY2VsIHRoaXMgdGltZXIgd2hlbiBlbnRlcmluZyBBVEUgbW9kZS4gKi8KLS8vCVJUTVBTZXRUaW1lcigmcEFkLT5NbG1lLlBlcmlvZGljVGltZXIsIE1MTUVfVEFTS19FWEVDX0lOVFYpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFJUTVBTdGF0aW9uU3RhcnRcbiIpKTsKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2V0dXAgRnJhbWUgZm9ybWF0LgotCU5PVEU6Ci0JCVRoaXMgcm91dGluZSBzaG91bGQgb25seSBiZSB1c2VkIGluIEFURSBtb2RlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1zdGF0aWMgSU5UIEFURVNldFVwRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUlOVDMyIFR4SWR4KQotewotCVVJTlQgajsKLQlQVFhEX1NUUlVDIHBUeEQ7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotICAgIFBUWERfU1RSVUMgICAgICBwRGVzdFR4RDsKLSAgICBUWERfU1RSVUMgICAgICAgVHhEOwotI2VuZGlmCi0JUE5ESVNfUEFDS0VUIHBQYWNrZXQ7Ci0JUFVDSEFSIHBEZXN0OwotCVBWT0lEIEFsbG9jVmE7Ci0JTkRJU19QSFlTSUNBTF9BRERSRVNTIEFsbG9jUGE7Ci0JSFRUUkFOU01JVF9TRVRUSU5HCVR4SFRQaHlNb2RlOwotCi0JUFJUTVBfVFhfUklORyBwVHhSaW5nID0gJnBBZC0+VHhSaW5nW1FJRF9BQ19CRV07Ci0JUFRYV0lfU1RSVUMgcFR4V0kgPSAoUFRYV0lfU1RSVUMpIHBUeFJpbmctPkNlbGxbVHhJZHhdLkRtYUJ1Zi5BbGxvY1ZhOwotCVBVQ0hBUiBwRE1BSGVhZGVyQnVmVkEgPSAoUFVDSEFSKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NWYTsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjgwMjExOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0KLQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJLy8gYWx3YXlzIHVzZSBRSURfQUNfQkUgYW5kIEZJRk9fRURDQQotCi0JCS8vIGZpbGwgVHhXSQotCQlUeEhUUGh5TW9kZS5maWVsZC5CVyA9IHBBZC0+YXRlLlR4V0kuQlc7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSBwQWQtPmF0ZS5UeFdJLlNob3J0R0k7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwotCQlUeEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPmF0ZS5UeFdJLk1DUzsKLQkJVHhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IHBBZC0+YXRlLlR4V0kuUEhZTU9ERTsKLQotCQlBVEVXcml0ZVR4V0kocEFkLCBwVHhXSSwgcEFkLT5hdGUuVHhXSS5GUkFHLCBwQWQtPmF0ZS5UeFdJLkNGQUNLLAotCQkJcEFkLT5hdGUuVHhXSS5UUywgIHBBZC0+YXRlLlR4V0kuQU1QRFUsIHBBZC0+YXRlLlR4V0kuQUNLLCBwQWQtPmF0ZS5UeFdJLk5TRVEsCi0JCQlwQWQtPmF0ZS5UeFdJLkJBV2luU2l6ZSwgMCwgcEFkLT5hdGUuVHhXSS5NUERVdG90YWxCeXRlQ291bnQsIHBBZC0+YXRlLlR4V0kuUGFja2V0SWQsIDAsIDAsCi0JCQlwQWQtPmF0ZS5UeFdJLnR4b3AvKklGU19IVFRYT1AqLywgcEFkLT5hdGUuVHhXSS5DRkFDSy8qRkFMU0UqLywgJlR4SFRQaHlNb2RlKTsKLQl9Ci0JZWxzZQotCXsKLQkJVHhIVFBoeU1vZGUuZmllbGQuQlcgPSBwQWQtPmF0ZS5UeFdJLkJXOwotCQlUeEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gcEFkLT5hdGUuVHhXSS5TaG9ydEdJOwotCQlUeEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJVHhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEFkLT5hdGUuVHhXSS5NQ1M7Ci0JCVR4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBwQWQtPmF0ZS5UeFdJLlBIWU1PREU7Ci0JCUFURVdyaXRlVHhXSShwQWQsIHBUeFdJLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCAgRkFMU0UsIEZBTFNFLCBGQUxTRSwKLQkJCTQsIDAsIHBBZC0+YXRlLlR4TGVuZ3RoLCAwLCAwLCAwLCBJRlNfSFRUWE9QLCBGQUxTRSwgJlR4SFRQaHlNb2RlKTsKLQl9Ci0KLQkvLyBmaWxsIDgwMi4xMSBoZWFkZXIKLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCWlmIChwQWQtPmF0ZS5iUUFUeFN0YXJ0ID09IFRSVUUpCi0JewotCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFLCBwQWQtPmF0ZS5IZWFkZXIsIHBBZC0+YXRlLkhMZW4pOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBETUFIZWFkZXJCdWZWQStUWFdJX1NJWkUsIFRlbXBsYXRlRnJhbWUsIExFTkdUSF84MDJfMTEpOwotCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFKzQsIHBBZC0+YXRlLkFkZHIxLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCQlOZGlzTW92ZU1lbW9yeShwRE1BSGVhZGVyQnVmVkErVFhXSV9TSVpFKzEwLCBwQWQtPmF0ZS5BZGRyMiwgRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKLQkJTmRpc01vdmVNZW1vcnkocERNQUhlYWRlckJ1ZlZBK1RYV0lfU0laRSsxNiwgcEFkLT5hdGUuQWRkcjMsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JfQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotCVJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsICgoKFBVQ0hBUilwRE1BSGVhZGVyQnVmVkEpK1RYV0lfU0laRSksIERJUl9SRUFELCBGQUxTRSk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JLyogYWxsb2MgYnVmZmVyIGZvciBwYXlsb2FkICovCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJcFBhY2tldCA9IFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsIHBBZC0+YXRlLkRMZW4gKyAweDEwMCwgRkFMU0UsICZBbGxvY1ZhLCAmQWxsb2NQYSk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCXsKLQkJcFBhY2tldCA9IFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcihwQWQsIHBBZC0+YXRlLlR4TGVuZ3RoLCBGQUxTRSwgJkFsbG9jVmEsICZBbGxvY1BhKTsKLQl9Ci0KLQlpZiAocFBhY2tldCA9PSBOVUxMKQotCXsKLQkJcEFkLT5hdGUuVHhDb3VudCA9IDA7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIGZhaWwgdG8gYWxsb2MgcGFja2V0IHNwYWNlLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcFR4UmluZy0+Q2VsbFtUeElkeF0ucE5leHROZGlzUGFja2V0ID0gcFBhY2tldDsKLQotCXBEZXN0ID0gKFBVQ0hBUikgQWxsb2NWYTsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JaWYgKHBBZC0+YXRlLmJRQVR4U3RhcnQgPT0gVFJVRSkKLQl7Ci0JCVJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW4gPSBwQWQtPmF0ZS5ETGVuOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQl7Ci0JCVJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW4gPSBwQWQtPmF0ZS5UeExlbmd0aCAtIExFTkdUSF84MDJfMTE7Ci0JfQotCi0JLy8gcHJlcGFyZSBmcmFtZSBwYXlsb2FkCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJLy8gY29weSBwYXR0ZXJuCi0JCWlmICgocEFkLT5hdGUuUExlbiAhPSAwKSkKLQkJewotCQkJaW50IGo7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBwQWQtPmF0ZS5ETGVuOyBqKz1wQWQtPmF0ZS5QTGVuKQotCQkJewotCQkJCW1lbWNweShSVFBLVF9UT19PU1BLVChwUGFja2V0KS0+ZGF0YSArIGosIHBBZC0+YXRlLlBhdHRlcm4sIHBBZC0+YXRlLlBMZW4pOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCXsKLQkJZm9yIChqID0gMDsgaiA8IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47IGorKykKLQkJewotCQkJcERlc3Rbal0gPSAweEE1OwotCQl9Ci0JfQotCi0JLyogYnVpbGQgVHggRGVzY3JpcHRvciAqLwotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JcFR4RCA9IChQVFhEX1NUUlVDKSBwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotI2Vsc2UKLSAgICBwRGVzdFR4RCAgPSAoUFRYRF9TVFJVQylwVHhSaW5nLT5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotICAgIFR4RCA9ICpwRGVzdFR4RDsKLSAgICBwVHhEID0gJlR4RDsKLSNlbmRpZiAvLyAhUlRfQklHX0VORElBTiAvLwotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQlpZiAocEFkLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJLy8gcHJlcGFyZSBUeEQKLQkJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQkJLy8gYnVpbGQgVFggREVTQwotCQlwVHhELT5TRFB0cjAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhwVHhSaW5nLT5DZWxsW1R4SWR4XS5EbWFCdWYuQWxsb2NQYSk7Ci0JCXBUeEQtPlNETGVuMCA9IFRYV0lfU0laRSArIHBBZC0+YXRlLkhMZW47Ci0JCXBUeEQtPkxhc3RTZWMwID0gMDsKLQkJcFR4RC0+U0RQdHIxID0gQWxsb2NQYTsKLQkJcFR4RC0+U0RMZW4xID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCktPmxlbjsKLQkJcFR4RC0+TGFzdFNlYzEgPSAxOwotCi0JCXBEZXN0ID0gKFBVQ0hBUilwVHhXSTsKLQkJcERlc3QgKz0gVFhXSV9TSVpFOwotCQlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcERlc3Q7Ci0KLQkJLy8gbW9kaWZ5IHNlcXVlbmNlIG51bWJlci4uLgotCQlpZiAocEFkLT5hdGUuVHhEb25lQ291bnQgPT0gMCkKLQkJewotCQkJcEFkLT5hdGUuc2VxID0gcEhlYWRlcjgwMjExLT5TZXF1ZW5jZTsKLQkJfQotCQllbHNlCi0JCQlwSGVhZGVyODAyMTEtPlNlcXVlbmNlID0gKytwQWQtPmF0ZS5zZXE7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCXsKLQkJTmRpc1plcm9NZW1vcnkocFR4RCwgVFhEX1NJWkUpOwotCQlSVE1QV3JpdGVUeERlc2NyaXB0b3IocEFkLCBwVHhELCBGQUxTRSwgRklGT19FRENBKTsKLQkJLy8gYnVpbGQgVFggREVTQwotCQlwVHhELT5TRFB0cjAgPSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyAocFR4UmluZy0+Q2VsbFtUeElkeF0uRG1hQnVmLkFsbG9jUGEpOwotCQlwVHhELT5TRExlbjAgPSBUWFdJX1NJWkUgKyBMRU5HVEhfODAyXzExOwotCQlwVHhELT5MYXN0U2VjMCA9IDA7Ci0JCXBUeEQtPlNEUHRyMSA9IEFsbG9jUGE7Ci0JCXBUeEQtPlNETGVuMSA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpLT5sZW47Ci0JCXBUeEQtPkxhc3RTZWMxID0gMTsKLQl9Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JUlRNUFdJRW5kaWFuQ2hhbmdlKChQVUNIQVIpcFR4V0ksIFRZUEVfVFhXSSk7Ci0JUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKHBBZCwgKCgoUFVDSEFSKXBETUFIZWFkZXJCdWZWQSkrVFhXSV9TSVpFKSwgRElSX1dSSVRFLCBGQUxTRSk7Ci0gICAgUlRNUERlc2NyaXB0b3JFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwVHhELCBUWVBFX1RYRCk7Ci0gICAgV3JpdGVCYWNrVG9EZXNjcmlwdG9yKChQVUNIQVIpcERlc3RUeEQsIChQVUNIQVIpcFR4RCwgRkFMU0UsIFRZUEVfVFhEKTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0KLQlyZXR1cm4gMDsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT1FbmQgb2YgUlRNUF9NQUNfUENJID09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLQotVk9JRCBydF9lZV9yZWFkX2FsbChQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUICpEYXRhKQotewotCVVTSE9SVCBpOwotCVVTSE9SVCB2YWx1ZTsKLQotCi0JZm9yIChpID0gMCA7IGkgPCBFRVBST01fU0laRS8yIDsgKQotCXsKLQkJLyogInZhbHVlIiBpcyBlc3BlY2lhbGx5IGZvciBzb21lIGNvbXBpbGVycy4uLiAqLwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIGkqMiwgdmFsdWUpOwotCQlEYXRhW2ldID0gdmFsdWU7Ci0JCWkrKzsKLQl9Ci19Ci0KLQotVk9JRCBydF9lZV93cml0ZV9hbGwoUFJUTVBfQURBUFRFUiBwQWQsIFVTSE9SVCAqRGF0YSkKLXsKLQlVU0hPUlQgaTsKLQlVU0hPUlQgdmFsdWU7Ci0KLQotCWZvciAoaSA9IDAgOyBpIDwgRUVQUk9NX1NJWkUvMiA7ICkKLQl7Ci0JCS8qICJ2YWx1ZSIgaXMgZXNwZWNpYWxseSBmb3Igc29tZSBjb21waWxlcnMuLi4gKi8KLQkJdmFsdWUgPSBEYXRhW2ldOwotCQlSVDI4eHhfRUVQUk9NX1dSSVRFMTYocEFkLCBpKjIsIHZhbHVlKTsKLQkJaSsrOwotCX0KLX0KLQotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLVZPSUQgQVRFX1FBX1N0YXRpc3RpY3MoCi0JSU4gUFJUTVBfQURBUFRFUgkJCXBBZCwKLQlJTiBQUlhXSV9TVFJVQwkJCQlwUnhXSSwKLQlJTiBQUlQyOFhYX1JYRF9TVFJVQwkJcFJ4RCwKLQlJTiBQSEVBREVSXzgwMl8xMQkJCXBIZWFkZXIpCi17Ci0JLy8gdXBkYXRlIGNvdW50ZXIgZmlyc3QKLQlpZiAocEhlYWRlciAhPSBOVUxMKQotCXsKLQkJaWYgKHBIZWFkZXItPkZDLlR5cGUgPT0gQlRZUEVfREFUQSkKLQkJewotCQkJaWYgKHBSeEQtPlUyTSkKLQkJCQlwQWQtPmF0ZS5VMk0rKzsKLQkJCWVsc2UKLQkJCQlwQWQtPmF0ZS5PdGhlckRhdGErKzsKLQkJfQotCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX01HTVQpCi0JCXsKLQkJCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKQotCQkJCXBBZC0+YXRlLkJlYWNvbisrOwotCQkJZWxzZQotCQkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKLQkJfQotCQllbHNlIGlmIChwSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0NOVEwpCi0JCXsKLQkJCXBBZC0+YXRlLk90aGVyQ291bnQrKzsKLQkJfQotCX0KLQlwQWQtPmF0ZS5SU1NJMCA9IHBSeFdJLT5SU1NJMDsKLQlwQWQtPmF0ZS5SU1NJMSA9IHBSeFdJLT5SU1NJMTsKLQlwQWQtPmF0ZS5SU1NJMiA9IHBSeFdJLT5SU1NJMjsKLQlwQWQtPmF0ZS5TTlIwID0gcFJ4V0ktPlNOUjA7Ci0JcEFkLT5hdGUuU05SMSA9IHBSeFdJLT5TTlIxOwotfQotCi0KLS8qIGNvbW1hbmQgaWQgd2l0aCBDbWQgVHlwZSA9PSAweDAwMDgoZm9yIDI4eHgpLzB4MDAwNShmb3IgaU5JQykgKi8KLSNkZWZpbmUgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTAkJMHgwMDAwCi0jZGVmaW5lIFJBQ0ZHX0NNRF9FMlBST01fUkVBRDE2CQkweDAwMDEKLSNkZWZpbmUgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2CTB4MDAwMgotI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1JFQURfQUxMCTB4MDAwMwotI2RlZmluZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTAkweDAwMDQKLSNkZWZpbmUgUkFDRkdfQ01EX0lPX1JFQUQJCQkweDAwMDUKLSNkZWZpbmUgUkFDRkdfQ01EX0lPX1dSSVRFCQkJMHgwMDA2Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEsJCTB4MDAwNwotI2RlZmluZSBSQUNGR19DTURfQkJQX1JFQUQ4CQkJMHgwMDA4Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9CQlBfV1JJVEU4CQkweDAwMDkKLSNkZWZpbmUgUkFDRkdfQ01EX0JCUF9SRUFEX0FMTAkJMHgwMDBhCi0jZGVmaW5lIFJBQ0ZHX0NNRF9HRVRfQ09VTlRFUgkJMHgwMDBiCi0jZGVmaW5lIFJBQ0ZHX0NNRF9DTEVBUl9DT1VOVEVSCQkweDAwMGMKLQotI2RlZmluZSBSQUNGR19DTURfUlNWMQkJCQkweDAwMGQKLSNkZWZpbmUgUkFDRkdfQ01EX1JTVjIJCQkJMHgwMDBlCi0jZGVmaW5lIFJBQ0ZHX0NNRF9SU1YzCQkJCTB4MDAwZgotCi0jZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVEFSVAkJCTB4MDAxMAotI2RlZmluZSBSQUNGR19DTURfR0VUX1RYX1NUQVRVUwkJMHgwMDExCi0jZGVmaW5lIFJBQ0ZHX0NNRF9UWF9TVE9QCQkJMHgwMDEyCi0jZGVmaW5lIFJBQ0ZHX0NNRF9SWF9TVEFSVAkJCTB4MDAxMwotI2RlZmluZSBSQUNGR19DTURfUlhfU1RPUAkJCTB4MDAxNAotI2RlZmluZSBSQUNGR19DTURfR0VUX05PSVNFX0xFVkVMCTB4MDAxNQotCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlQJCQkweDAwODAKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVE9QCQkJMHgwMDgxCi0KLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSCQkweDAxMDAKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UCQkJMHgwMTAxCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUJCTB4MDEwMgotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9CVwkgICAgICAgICAgICAweDAxMDMKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwCSAgICAgICAgMHgwMTA0Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMQkJCTB4MDEwNQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVAkJMHgwMTA2Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1MJCTB4MDEwNwotI2RlZmluZSBSQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIJCQkweDAxMDgKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQQkJMHgwMTA5Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VMX1JYX0FOVEVOTkEJCTB4MDEwYQotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRQkJCTB4MDEwYgotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMCQkJMHgwMTBjCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxCQkJCTB4MDEwZAotI2RlZmluZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMgkJCQkweDAxMGUKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9TRVRfQUREUjMJCQkJMHgwMTBmCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEUJCQkJMHgwMTEwCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTgkJMHgwMTExCi0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0NPVU5UCTB4MDExMgotI2RlZmluZSBSQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FCQkweDAxMTMKLSNkZWZpbmUgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLCTB4MDExNAotI2RlZmluZSBSQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLCTB4MDExNQotI2RlZmluZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsJCTB4MDExNgotI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEsJCTB4MDExNwotI2RlZmluZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLCTB4MDExOAotI2RlZmluZSBSQUNGR19DTURfQVRFX1JGX1JFQURfQlVMSwkJMHgwMTE5Ci0jZGVmaW5lIFJBQ0ZHX0NNRF9BVEVfUkZfV1JJVEVfQlVMSwkJMHgwMTFhCi0KLQotc3RhdGljIFZPSUQgbWVtY3B5X2V4bChQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUxPTkcgbGVuKTsKLXN0YXRpYyBWT0lEIG1lbWNweV9leHMoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbik7Ci1zdGF0aWMgVk9JRCBSVE1QX0lPX1JFQURfQlVMSyhQUlRNUF9BREFQVEVSIHBBZCwgVUNIQVIgKmRzdCwgVUNIQVIgKnNyYywgVUlOVDMyIGxlbik7Ci0KLQotCi1WT0lEIFJ0bXBEb0F0ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQotewotCVVTSE9SVCBDb21tYW5kX0lkOwotCUlOVAlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZzsKLQotCi0JaWYgKChwUmFDZmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRlX3JhY2ZnaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JewotCQlTdGF0dXMgPSAtRUlOVkFMOwotCQlyZXR1cm47Ci0JfQotCi0JTmRpc1plcm9NZW1vcnkocFJhQ2ZnLCBzaXplb2Yoc3RydWN0IGF0ZV9yYWNmZ2hkcikpOwotCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyKChQVUNIQVIpcFJhQ2ZnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQotCXsKLQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJa2ZyZWUocFJhQ2ZnKTsKLQkJcmV0dXJuOwotCX0KLQotCUNvbW1hbmRfSWQgPSBudG9ocyhwUmFDZmctPmNvbW1hbmRfaWQpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJcbiVzOiBDb21tYW5kX0lkID0gMHglMDR4ICFcbiIsIF9fRlVOQ1RJT05fXywgQ29tbWFuZF9JZCkpOwotCi0Jc3dpdGNoIChDb21tYW5kX0lkKQotCXsKLQkJLyogV2Ugd2lsbCBnZXQgdGhpcyBjb21tYW5kIHdoZW4gUUEgc3RhcnRzLiAqLwotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TVEFSVChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCS8qIFdlIHdpbGwgZ2V0IHRoaXMgY29tbWFuZCBlaXRoZXIgUUEgaXMgY2xvc2VkIG9yIGF0ZWQgaXMga2lsbGVkIGJ5IHVzZXIuICovCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TVE9QOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RPUChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX1JGX1dSSVRFX0FMTDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfUkZfV1JJVEVfQUxMKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1JFQUQxNjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfRTJQUk9NX1JFQUQxNihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9XUklURTE2OgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9FMlBST01fV1JJVEUxNihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0UyUFJPTV9SRUFEX0FMTDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfRTJQUk9NX1JFQURfQUxMKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0lPX1JFQUQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0lPX1JFQUQocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9JT19XUklURToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfSU9fV1JJVEUocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9JT19SRUFEX0JVTEs6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0lPX1JFQURfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0JCUF9SRUFEODoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQkJQX1JFQUQ4KHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkFDRkdfQ01EX0JCUF9XUklURTg6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0JCUF9XUklURTgocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9CQlBfUkVBRF9BTEw6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0JCUF9SRUFEX0FMTChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fUkVBRF9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9FMlBST01fV1JJVEVfQlVMSzoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEs6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9JT19XUklURV9CVUxLKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9SRUFEX0JVTEs6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfQkJQX1dSSVRFX0JVTEsocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgUkFDRkdfQ01EX0dFVF9OT0lTRV9MRVZFTDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfR0VUX05PSVNFX0xFVkVMKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfR0VUX0NPVU5URVI6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0dFVF9DT1VOVEVSKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQ0xFQVJfQ09VTlRFUjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQ0xFQVJfQ09VTlRFUihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX1RYX1NUQVJUOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9UWF9TVEFSVChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVM6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0dFVF9UWF9TVEFUVVMocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9UWF9TVE9QOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9UWF9TVE9QKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfUlhfU1RBUlQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX1JYX1NUQVJUKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfUlhfU1RPUDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfUlhfU1RPUChwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCS8qIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGZvciBuZXcgQVRFIEdVSShub3QgUUEpLiAqLwotCQkvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVI6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUUocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0JXOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX0JXKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjA6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjE6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9GUkVRX09GRlNFVDoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1M6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9HRVRfU1RBVElTVElDUyhwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfUkVTRVRfQ09VTlRFUihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQToKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFTF9UWF9BTlRFTk5BKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1BSRUFNQkxFKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX0NIQU5ORUwocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIxKHBBZGFwdGVyLHdycSxwUmFDZmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSQUNGR19DTURfQVRFX1NFVF9BRERSMjoKLQkJCVN0YXR1cz1ET19SQUNGR19DTURfQVRFX1NFVF9BRERSMihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfQUREUjM6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjMocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEU6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfUkFURShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOOgotCQkJU3RhdHVzPURPX1JBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTihwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQ6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlQocEFkYXB0ZXIsd3JxLHBSYUNmZyk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJBQ0ZHX0NNRF9BVEVfU1RBUlRfUlhfRlJBTUU6Ci0JCQlTdGF0dXM9RE9fUkFDRkdfQ01EX0FURV9TVEFSVF9SWF9GUkFNRShwQWRhcHRlcix3cnEscFJhQ2ZnKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0gICAgQVNTRVJUKHBSYUNmZyAhPSBOVUxMKTsKLQotICAgIGlmIChwUmFDZmcgIT0gTlVMTCkKLQkgICAga2ZyZWUocFJhQ2ZnKTsKLQotCXJldHVybjsKLX0KLQotCi1WT0lEIEJ1YmJsZVNvcnQoSU5UMzIgbiwgSU5UMzIgYVtdKQotewotCUlOVDMyIGssIGosIHRlbXA7Ci0KLQlmb3IgKGsgPSBuLTE7ICBrPjA7ICBrLS0pCi0JewotCQlmb3IgKGogPSAwOyBqPGs7IGorKykKLQkJewotCQkJaWYgKGFbal0gPiBhW2orMV0pCi0JCQl7Ci0JCQkJdGVtcCA9IGFbal07Ci0JCQkJYVtqXT1hW2orMV07Ci0JCQkJYVtqKzFdPXRlbXA7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLQotVk9JRCBDYWxOb2lzZUxldmVsKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiBjaGFubmVsLCBJTlQzMiBSU1NJWzNdWzEwXSkKLXsKLQlJTlQzMgkJUlNTSTAsIFJTU0kxLCBSU1NJMjsKLQlDSEFSCQlSc3NpME9mZnNldCwgUnNzaTFPZmZzZXQsIFJzc2kyT2Zmc2V0OwotCVVDSEFSCQlCYnBSNTBSc3NpMCA9IDAsIEJicFI1MVJzc2kxID0gMCwgQmJwUjUyUnNzaTIgPSAwOwotCVVDSEFSCQlPcmdfQkJQNjZ2YWx1ZSA9IDAsIE9yZ19CQlA2OXZhbHVlID0gMCwgT3JnX0JCUDcwdmFsdWUgPSAwLCBkYXRhID0gMDsKLQlVU0hPUlQJCUxOQV9HYWluID0gMDsKLQlJTlQzMiAgICAgICBqID0gMDsKLQlVQ0hBUgkJT3JnX0NoYW5uZWwgPSBwQWQtPmF0ZS5DaGFubmVsOwotCVVTSE9SVAkgICAgR2FpblZhbHVlID0gMCwgT2Zmc2V0VmFsdWUgPSAwOwotCi0JQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY2LCAmT3JnX0JCUDY2dmFsdWUpOwotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgJk9yZ19CQlA2OXZhbHVlKTsKLQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsICZPcmdfQkJQNzB2YWx1ZSk7Ci0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkvLyBSZWFkIHRoZSB2YWx1ZSBvZiBMTkEgZ2FpbiBhbmQgUnNzaSBvZmZzZXQKLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9MTkFfT0ZGU0VULCBHYWluVmFsdWUpOwotCi0JLy8gZm9yIE5vaXNlIExldmVsCi0JaWYgKGNoYW5uZWwgPD0gMTQpCi0JewotCQlMTkFfR2FpbiA9IEdhaW5WYWx1ZSAmIDB4MDBGRjsKLQotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0JHX09GRlNFVCwgT2Zmc2V0VmFsdWUpOwotCQlSc3NpME9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOwotCQlSc3NpMU9mZnNldCA9IChPZmZzZXRWYWx1ZSAmIDB4RkYwMCkgPj4gODsKLQkJUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkLCAoRUVQUk9NX1JTU0lfQkdfT0ZGU0VUICsgMikvKiAweDQ4ICovLCBPZmZzZXRWYWx1ZSk7Ci0JCVJzc2kyT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7Ci0JfQotCWVsc2UKLQl7Ci0JCUxOQV9HYWluID0gKEdhaW5WYWx1ZSAmIDB4RkYwMCkgPj4gODsKLQotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIEVFUFJPTV9SU1NJX0FfT0ZGU0VULCBPZmZzZXRWYWx1ZSk7Ci0JCVJzc2kwT2Zmc2V0ID0gT2Zmc2V0VmFsdWUgJiAweDAwRkY7Ci0JCVJzc2kxT2Zmc2V0ID0gKE9mZnNldFZhbHVlICYgMHhGRjAwKSA+PiA4OwotCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWQsIChFRVBST01fUlNTSV9BX09GRlNFVCArIDIpLyogMHg0QyAqLywgT2Zmc2V0VmFsdWUpOwotCQlSc3NpMk9mZnNldCA9IE9mZnNldFZhbHVlICYgMHgwMEZGOwotCX0KLQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQl7Ci0JCXBBZC0+YXRlLkNoYW5uZWwgPSBjaGFubmVsOwotCQlBVEVBc2ljU3dpdGNoQ2hhbm5lbChwQWQpOwotCQltZGVsYXkoNSk7Ci0KLQkJZGF0YSA9IDB4MTA7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsIGRhdGEpOwotCQlkYXRhID0gMHg0MDsKLQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgZGF0YSk7Ci0JCWRhdGEgPSAweDQwOwotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCBkYXRhKTsKLQkJbWRlbGF5KDUpOwotCi0JCS8vIHN0YXJ0IFJ4Ci0JCXBBZC0+YXRlLmJRQVJ4U3RhcnQgPSBUUlVFOwotCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhGUkFNRSIpOwotCi0JCW1kZWxheSg1KTsKLQotCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKLQkJewotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUwLCAmQmJwUjUwUnNzaTApOwotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUxLCAmQmJwUjUxUnNzaTEpOwotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjUyLCAmQmJwUjUyUnNzaTIpOwotCi0JCQltZGVsYXkoMTApOwotCi0JCQkvLyBjYWxjdWxhdGUgUlNTSSAwCi0JCQlpZiAoQmJwUjUwUnNzaTAgPT0gMCkKLQkJCXsKLQkJCQlSU1NJMCA9IC0xMDA7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJUlNTSTAgPSAoSU5UMzIpKC0xMiAtIEJicFI1MFJzc2kwIC0gTE5BX0dhaW4gLSBSc3NpME9mZnNldCk7Ci0JCQl9Ci0JCQlSU1NJWzBdW2pdID0gUlNTSTA7Ci0KLQkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKLQkJCXsKLQkJCQkvLyBjYWxjdWxhdGUgUlNTSSAxCi0JCQkJaWYgKEJicFI1MVJzc2kxID09IDApCi0JCQkJewotCQkJCQlSU1NJMSA9IC0xMDA7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJTU0kxID0gKElOVDMyKSgtMTIgLSBCYnBSNTFSc3NpMSAtIExOQV9HYWluIC0gUnNzaTFPZmZzZXQpOwotCQkJCX0KLQkJCQlSU1NJWzFdW2pdID0gUlNTSTE7Ci0JCQl9Ci0KLQkJCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAzICkgLy8gM1IKLQkJCXsKLQkJCQkvLyBjYWxjdWxhdGUgUlNTSSAyCi0JCQkJaWYgKEJicFI1MlJzc2kyID09IDApCi0JCQkJCVJTU0kyID0gLTEwMDsKLQkJCQllbHNlCi0JCQkJCVJTU0kyID0gKElOVDMyKSgtMTIgLSBCYnBSNTJSc3NpMiAtIExOQV9HYWluIC0gUnNzaTJPZmZzZXQpOwotCi0JCQkJUlNTSVsyXVtqXSA9IFJTU0kyOwotCQkJfQotCQl9Ci0KLQkJLy8gc3RvcCBSeAotCQlTZXRfQVRFX1Byb2MocEFkLCAiUlhTVE9QIik7Ci0KLQkJbWRlbGF5KDUpOwotCi0JCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMF0pOwkvLyAxUgotCi0JCWlmICggcEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+PSAyICkgLy8gMlIKLQkJewotCQkJQnViYmxlU29ydCgxMCwgUlNTSVsxXSk7Ci0JCX0KLQotCQlpZiAoIHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPj0gMyApIC8vIDNSCi0JCXsKLQkJCUJ1YmJsZVNvcnQoMTAsIFJTU0lbMl0pOwotCQl9Ci0JfQotCi0JcEFkLT5hdGUuQ2hhbm5lbCA9IE9yZ19DaGFubmVsOwotCUFURUFzaWNTd2l0Y2hDaGFubmVsKHBBZCk7Ci0KLQkvLyByZXN0b3JlIG9yaWdpbmFsIHZhbHVlCi0gICAgQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2NiwgT3JnX0JCUDY2dmFsdWUpOwotICAgIEFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNjksIE9yZ19CQlA2OXZhbHVlKTsKLSAgICBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCBPcmdfQkJQNzB2YWx1ZSk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotQk9PTEVBTiBTeW5jVHhSeENvbmZpZyhQUlRNUF9BREFQVEVSIHBBZCwgVVNIT1JUIG9mZnNldCwgVUNIQVIgdmFsdWUpCi17Ci0JVUNIQVIgdG1wID0gMCwgYmJwX2RhdGEgPSAwOwotCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICZiYnBfZGF0YSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIG9mZnNldCwgJmJicF9kYXRhKTsKLQl9Ci0KLQkvKiBjb25maXJtIGFnYWluICovCi0JQVNTRVJUKGJicF9kYXRhID09IHZhbHVlKTsKLQotCXN3aXRjaCAob2Zmc2V0KQotCXsKLQkJY2FzZSBCQlBfUjE6Ci0JCQkvKiBOZWVkIHRvIHN5bmNocm9uaXplIHR4IGNvbmZpZ3VyYXRpb24gd2l0aCBsZWdhY3kgQVRFLiAqLwotCQkJdG1wID0gKGJicF9kYXRhICYgKCgxIDw8IDQpIHwgKDEgPDwgMykpLyogMHgxOCAqLykgPj4gMzsKLQkJICAgIHN3aXRjaCAodG1wKQotCQkgICAgewotCQkJCS8qIFRoZSBCQlAgUjEgYml0WzQ6M10gPSAyIDo6IEJvdGggREFDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCi0JCSAgICAgICAgY2FzZSAyOgotCQkJCQkvKiBBbGwgKi8KLQkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMDsKLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDAgOjogREFDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMDoKLQkJCQkJLyogQW50ZW5uYSBvbmUgKi8KLQkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMTsKLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyogVGhlIEJCUCBSMSBiaXRbNDozXSA9IDEgOjogREFDIDEgd2lsbCBiZSB1c2VkIGJ5IFFBLiAqLwotCQkgICAgICAgIGNhc2UgMToKLQkJCQkJLyogQW50ZW5uYSB0d28gKi8KLQkJCQkJcEFkLT5hdGUuVHhBbnRlbm5hU2VsID0gMjsKLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCSAgICAgICAgZGVmYXVsdDoKLQkJICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLS0gU3RoLiB3cm9uZyEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0JCSAgICB9Ci0JCQlicmVhazsvKiBjYXNlIEJCUF9SMSAqLwotCi0JCWNhc2UgQkJQX1IzOgotCQkJLyogTmVlZCB0byBzeW5jaHJvbml6ZSByeCBjb25maWd1cmF0aW9uIHdpdGggbGVnYWN5IEFURS4gKi8KLQkJCXRtcCA9IChiYnBfZGF0YSAmICgoMSA8PCAxKSB8ICgxIDw8IDApKS8qIDB4MDMgKi8pOwotCQkgICAgc3dpdGNoKHRtcCkKLQkJICAgIHsKLQkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMyA6OiBBbGwgQURDcyB3aWxsIGJlIHVzZWQgYnkgUUEuICovCi0JCSAgICAgICAgY2FzZSAzOgotCQkJCQkvKiBBbGwgKi8KLQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKLQkJICAgICAgICAgICAgYnJlYWs7Ci0JCQkJLyoKLQkJCQkJVGhlIEJCUCBSMyBiaXRbMTowXSA9IDAgOjogQURDIDAgd2lsbCBiZSB1c2VkIGJ5IFFBLAotCQkJCQl1bmxlc3MgdGhlIEJCUCBSMyBiaXRbNDozXSA9IDIKLQkJCQkqLwotCQkgICAgICAgIGNhc2UgMDoKLQkJCQkJLyogQW50ZW5uYSBvbmUgKi8KLQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMTsKLQkJCQkJdG1wID0gKChiYnBfZGF0YSAmICgoMSA8PCA0KSB8ICgxIDw8IDMpKS8qIDB4MDMgKi8pID4+IDMpOwotCQkJCQlpZiAodG1wID09IDIpLy8gM1IKLQkJCQkJewotCQkJCQkJLyogRGVmYXVsdCA6IEFsbCBBRENzIHdpbGwgYmUgdXNlZCBieSBRQSAqLwotCQkJCQkJcEFkLT5hdGUuUnhBbnRlbm5hU2VsID0gMDsKLQkJCQkJfQotCQkgICAgICAgICAgICBicmVhazsKLQkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMSA6OiBBREMgMSB3aWxsIGJlIHVzZWQgYnkgUUEuICovCi0JCSAgICAgICAgY2FzZSAxOgotCQkJCQkvKiBBbnRlbm5hIHR3byAqLwotCQkJCQlwQWQtPmF0ZS5SeEFudGVubmFTZWwgPSAyOwotCQkgICAgICAgICAgICBicmVhazsKLQkJCQkvKiBUaGUgQkJQIFIzIGJpdFsxOjBdID0gMiA6OiBBREMgMiB3aWxsIGJlIHVzZWQgYnkgUUEuICovCi0JCSAgICAgICAgY2FzZSAyOgotCQkJCQkvKiBBbnRlbm5hIHRocmVlICovCi0JCQkJCXBBZC0+YXRlLlJ4QW50ZW5uYVNlbCA9IDM7Ci0JCSAgICAgICAgICAgIGJyZWFrOwotCQkgICAgICAgIGRlZmF1bHQ6Ci0JCSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIC0tIEltcG9zc2libGUhICA6IHJldHVybiBGQUxTRTsgXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCQkgICAgfQotCQkJYnJlYWs7LyogY2FzZSBCQlBfUjMgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgLS0gU3RoLiB3cm9uZyEgIDogcmV0dXJuIEZBTFNFOyBcbiIsIF9fRlVOQ1RJT05fXykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYyBWT0lEIG1lbWNweV9leGwoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVMT05HIGxlbikKLXsKLQlVTE9ORyBpLCBWYWx1ZSA9IDA7Ci0JVUxPTkcgKnBEc3QsICpwU3JjOwotCVVDSEFSICpwODsKLQotCXA4ID0gc3JjOwotCXBEc3QgPSAoVUxPTkcgKikgZHN0OwotCXBTcmMgPSAoVUxPTkcgKikgc3JjOwotCi0JZm9yIChpID0gMCA7IGkgPCAobGVuLzQpOyBpKyspCi0JewotCQkvKiBGb3IgYWxpZ25tZW50IGlzc3VlLCB3ZSBuZWVkIGEgdmFyaWFibGUgIlZhbHVlIi4gKi8KLQkJbWVtbW92ZSgmVmFsdWUsIHBTcmMsIDQpOwotCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKLQkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIDQpOwotCQlwRHN0Kys7Ci0JCXBTcmMrKzsKLQl9Ci0JaWYgKChsZW4gJSA0KSAhPSAwKQotCXsKLQkJLyogd2lzaCB0aGF0IGl0IHdpbGwgbmV2ZXIgcmVhY2ggaGVyZSAqLwotCQltZW1tb3ZlKCZWYWx1ZSwgcFNyYywgKGxlbiAlIDQpKTsKLQkJVmFsdWUgPSBodG9ubChWYWx1ZSk7Ci0JCW1lbW1vdmUocERzdCwgJlZhbHVlLCAobGVuICUgNCkpOwotCX0KLX0KLQotCi1zdGF0aWMgVk9JRCBtZW1jcHlfZXhzKFBSVE1QX0FEQVBURVIgcEFkLCBVQ0hBUiAqZHN0LCBVQ0hBUiAqc3JjLCBVTE9ORyBsZW4pCi17Ci0JVUxPTkcgaTsKLQlVQ0hBUiAqcERzdCwgKnBTcmM7Ci0KLQlwRHN0ID0gZHN0OwotCXBTcmMgPSBzcmM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKGxlbi8yKTsgaSsrKQotCXsKLQkJbWVtbW92ZShwRHN0LCBwU3JjLCAyKTsKLQkJKigoVVNIT1JUICopcERzdCkgPSBodG9ucygqKChVU0hPUlQgKilwRHN0KSk7Ci0JCXBEc3QrPTI7Ci0JCXBTcmMrPTI7Ci0JfQotCi0JaWYgKChsZW4gJSAyKSAhPSAwKQotCXsKLQkJbWVtbW92ZShwRHN0LCBwU3JjLCAxKTsKLQl9Ci19Ci0KLQotc3RhdGljIFZPSUQgUlRNUF9JT19SRUFEX0JVTEsoUFJUTVBfQURBUFRFUiBwQWQsIFVDSEFSICpkc3QsIFVDSEFSICpzcmMsIFVJTlQzMiBsZW4pCi17Ci0JVUlOVDMyIGksIFZhbHVlOwotCVVJTlQzMiAqcERzdCwgKnBTcmM7Ci0KLQlwRHN0ID0gKFVJTlQzMiAqKSBkc3Q7Ci0JcFNyYyA9IChVSU5UMzIgKikgc3JjOwotCi0JZm9yIChpID0gMCA7IGkgPCAobGVuLzQpOyBpKyspCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIChVTE9ORylwU3JjLCAmVmFsdWUpOwotCQlWYWx1ZSA9IGh0b25sKFZhbHVlKTsKLQkJbWVtbW92ZShwRHN0LCAmVmFsdWUsIDQpOwotCQlwRHN0Kys7Ci0JCXBTcmMrKzsKLQl9Ci0JcmV0dXJuOwotfQotCi0KLUlOVCBTZXRfVHhTdG9wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9UeFN0b3BfUHJvY1xuIikpOwotCi0JaWYgKFNldF9BVEVfUHJvYyhwQWQsICJUWFNUT1AiKSkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0KLUlOVCBTZXRfUnhTdG9wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldF9SeFN0b3BfUHJvY1xuIikpOwotCi0JaWYgKFNldF9BVEVfUHJvYyhwQWQsICJSWFNUT1AiKSkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotfQotCi0KLSNpZmRlZiBEQkcKLUlOVCBTZXRfRUVSZWFkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOwotCVVTSE9SVCAqcDsKLQlJTlQgaTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZCwgKFVTSE9SVCAqKWJ1ZmZlcik7Ci0JcCA9IGJ1ZmZlcjsKLQotCWZvciAoaSA9IDA7IGkgPCAoRUVQUk9NX1NJWkUvMik7IGkrKykKLQl7Ci0JCWF0ZV9wcmludChLRVJOX0VNRVJHICIlNC40eCAiLCAqcCk7Ci0JCWlmICgoKGkrMSkgJSAxNikgPT0gMCkKLQkJCWF0ZV9wcmludChLRVJOX0VNRVJHICJcbiIpOwotCQlwKys7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9FRVdyaXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlVU0hPUlQgb2Zmc2V0ID0gMCwgdmFsdWU7Ci0JUFNUUklORyBwMiA9IGFyZzsKLQotCXdoaWxlICgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKLQl7Ci0JCXAyKys7Ci0JfQotCi0JaWYgKCpwMiA9PSAnOicpCi0JewotCQlBMkhleChvZmZzZXQsIGFyZyk7Ci0JCUEySGV4KHZhbHVlLCBwMiArIDEpOwotCX0KLQllbHNlCi0JewotCQlBMkhleCh2YWx1ZSwgYXJnKTsKLQl9Ci0KLQlpZiAob2Zmc2V0ID49IEVFUFJPTV9TSVpFKQotCXsKLQkJYXRlX3ByaW50KEtFUk5fRU1FUkcgIk9mZnNldCBjYW4gbm90IGV4Y2VlZCBFRVBST01fU0laRSggPT0gMHglMDR4KVxuIiwgRUVQUk9NX1NJWkUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZCwgb2Zmc2V0LCB2YWx1ZSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotCi1JTlQgU2V0X0JCUFJlYWRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCVVDSEFSIHZhbHVlID0gMCwgb2Zmc2V0OwotCi0JQTJIZXgob2Zmc2V0LCBhcmcpOwotCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICAmdmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICAmdmFsdWUpOwotCX0KLQotCWF0ZV9wcmludChLRVJOX0VNRVJHICIleFxuIiwgdmFsdWUpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9CQlBXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVVNIT1JUIG9mZnNldCA9IDA7Ci0JUFNUUklORyBwMiA9IGFyZzsKLQlVQ0hBUiB2YWx1ZTsKLQotCXdoaWxlICgoKnAyICE9ICc6JykgJiYgKCpwMiAhPSAnXDAnKSkKLQl7Ci0JCXAyKys7Ci0JfQotCi0JaWYgKCpwMiA9PSAnOicpCi0JewotCQlBMkhleChvZmZzZXQsIGFyZyk7Ci0JCUEySGV4KHZhbHVlLCBwMiArIDEpOwotCX0KLQllbHNlCi0JewotCQlBMkhleCh2YWx1ZSwgYXJnKTsKLQl9Ci0KLQlpZiAoQVRFX09OKHBBZCkpCi0JewotCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICB2YWx1ZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBvZmZzZXQsICB2YWx1ZSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9SRldyaXRlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlQU1RSSU5HIHAyLCBwMywgcDQ7Ci0JVUlOVDMyIFIxLCBSMiwgUjMsIFI0OwotCi0JcDIgPSBhcmc7Ci0KLQl3aGlsZSAoKCpwMiAhPSAnOicpICYmICgqcDIgIT0gJ1wwJykpCi0JewotCQlwMisrOwotCX0KLQotCWlmICgqcDIgIT0gJzonKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlwMyA9IHAyICsgMTsKLQotCXdoaWxlKCgqcDMgIT0gJzonKSAmJiAoKnAzICE9ICdcMCcpKQotCXsKLQkJcDMrKzsKLQl9Ci0KLQlpZiAoKnAzICE9ICc6JykKLQkJcmV0dXJuIEZBTFNFOwotCi0JcDQgPSBwMyArIDE7Ci0KLQl3aGlsZSAoKCpwNCAhPSAnOicpICYmICgqcDQgIT0gJ1wwJykpCi0JewotCQlwNCsrOwotCX0KLQotCWlmICgqcDQgIT0gJzonKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQotCUEySGV4KFIxLCBhcmcpOwotCUEySGV4KFIyLCBwMiArIDEpOwotCUEySGV4KFIzLCBwMyArIDEpOwotCUEySGV4KFI0LCBwNCArIDEpOwotCi0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjEpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWQsIFIyKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkLCBSMyk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZCwgUjQpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gREJHIC8vCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCi0KLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0jZGVmaW5lCUxFTl9PRl9BUkcgMTYKLQotI2RlZmluZSBSRVNQT05TRV9UT19HVUkoX19wUmFDZmcsIF9fcHdycSwgX19MZW5ndGgsIF9fU3RhdHVzKQkJCQkJCQkJCVwKLQkoX19wUmFDZmcpLT5sZW5ndGggPSBodG9ucygoX19MZW5ndGgpKTsJCQkJCQkJCQkJCQkJCVwKLQkoX19wUmFDZmcpLT5zdGF0dXMgPSBodG9ucygoX19TdGF0dXMpKTsJCQkJCQkJCQkJCQkJCVwKLQkoX19wd3JxKS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZigoX19wUmFDZmcpLT5tYWdpY19ubykgKyBzaXplb2YoKF9fcFJhQ2ZnKS0+Y29tbWFuZF90eXBlKQlcCi0JCQkJCQkJKyBzaXplb2YoKF9fcFJhQ2ZnKS0+Y29tbWFuZF9pZCkgKyBzaXplb2YoKF9fcFJhQ2ZnKS0+bGVuZ3RoKQkJXAotCQkJCQkJCSsgc2l6ZW9mKChfX3BSYUNmZyktPnNlcXVlbmNlKSArIG50b2hzKChfX3BSYUNmZyktPmxlbmd0aCk7CQkJXAotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+dS5kYXRhLmxlbmd0aCA9ICVkXG4iLCAoX19wd3JxKS0+dS5kYXRhLmxlbmd0aCkpOwkJXAotCWlmIChjb3B5X3RvX3VzZXIoKF9fcHdycSktPnUuZGF0YS5wb2ludGVyLCAoVUNIQVIgKikoX19wUmFDZmcpLCAoX19wd3JxKS0+dS5kYXRhLmxlbmd0aCkpCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNvcHlfdG9fdXNlcigpIGZhaWwgaW4gJXNcbiIsIF9fRlVOQ1RJT05fXykpOwkJCQlcCi0JCXJldHVybiAoLUVGQVVMVCk7CQkJCQkJCQkJCQkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIGlzIGRvbmUgIVxuIiwgX19GVU5DVElPTl9fKSk7CQkJCQkJCVwKLQl9Ci0KLXN0YXRpYyBpbmxpbmUgSU5UCURPX1JBQ0ZHX0NNRF9BVEVfU1RBUlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVFxuIikpOwotCi0JLyogUHJlcGFyZSBmZWVkYmFjayBhcyBzb29uIGFzIHdlIGNhbiB0byBhdm9pZCBRQSB0aW1lb3V0LiAqLwotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiQVRFU1RBUlQiKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU1RPUCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JSU5UMzIgcmV0OwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NUT1BcbiIpKTsKLQotCS8qCi0JCURpc3Rpbmd1aXNoIHRoaXMgY29tbWFuZCBjYW1lIGZyb20gUUEodmlhIGF0ZSBhZ2VudCkKLQkJb3IgYXRlIGFnZW50IGFjY29yZGluZyB0byB0aGUgZXhpc3RlbmNlIG9mIHBpZCBpbiBwYXlsb2FkLgotCi0JCU5vIG5lZWQgdG8gcHJlcGFyZSBmZWVkYmFjayBpZiB0aGlzIGNtZCBjYW1lIGRpcmVjdGx5IGZyb20gYXRlIGFnZW50LAotCQlub3QgZnJvbSBRQS4KLQkqLwotCXBSYUNmZy0+bGVuZ3RoID0gbnRvaHMocFJhQ2ZnLT5sZW5ndGgpOwotCi0JaWYgKHBSYUNmZy0+bGVuZ3RoID09IHNpemVvZihwQWRhcHRlci0+YXRlLkF0ZVBpZCkpCi0JewotCQkvKgotCQkJVGhpcyBjb21tYW5kIGNhbWUgZnJvbSBRQS4KLQkJCUdldCB0aGUgcGlkIG9mIEFURSBhZ2VudC4KLQkJKi8KLQkJbWVtY3B5KChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkF0ZVBpZCwKLQkJCQkJCSgmcFJhQ2ZnLT5kYXRhWzBdKSAtIDIvKiA9PSBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpICovLAotCQkJCQkJc2l6ZW9mKHBBZGFwdGVyLT5hdGUuQXRlUGlkKSk7Ci0KLQkJLyogUHJlcGFyZSBmZWVkYmFjayBhcyBzb29uIGFzIHdlIGNhbiB0byBhdm9pZCBRQSB0aW1lb3V0LiAqLwotCQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JCS8qCi0JCQlLaWxsIEFURSBhZ2VudCB3aGVuIGxlYXZpbmcgQVRFIG1vZGUuCi0KLQkJCVdlIG11c3Qga2lsbCBBVEUgYWdlbnQgZmlyc3QgYmVmb3JlIHNldHRpbmcgQVRFU1RPUCwKLQkJCW9yIE1pY3Jvc29mdCB3aWxsIHJlcG9ydCBzdGguIHdyb25nLgotCQkqLwotCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocEFkYXB0ZXItPmF0ZS5BdGVQaWQsIFNJR1RFUk0sIDEpOwotCi0JCWlmIChyZXQpCi0JCXsKLQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzOiB1bmFibGUgdG8ga2lsbCBhdGUgdGhyZWFkXG4iLCBwQWRhcHRlci0+bmV0X2Rldi0+bmFtZSkpOwotCQl9Ci0JfQotCi0KLQkvKiBBUC9TVEEgbWlnaHQgaGF2ZSBpbiBBVEVfU1RPUCBtb2RlIGR1ZSB0byBjbWQgZnJvbSBRQS4gKi8KLQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQl7Ci0JCS8qIFNvbWVvbmUgaGFzIGtpbGxlZCBhdGUgYWdlbnQgd2hpbGUgUUEgR1VJIGlzIHN0aWxsIG9wZW4uICovCi0JCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIkFURVNUT1AiKTsKLQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUkFDRkdfQ01EX0FQX1NUQVJUIGlzIGRvbmUgIVxuIikpOwotCX0KLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9SRl9XUklURV9BTEwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVJTlQzMiBSMSwgUjIsIFIzLCBSNDsKLQlVU0hPUlQgY2hhbm5lbDsKLQotCW1lbWNweSgmUjEsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKLQltZW1jcHkoJlIyLCBwUmFDZmctPmRhdGErMiwgNCk7Ci0JbWVtY3B5KCZSMywgcFJhQ2ZnLT5kYXRhKzYsIDQpOwotCW1lbWNweSgmUjQsIHBSYUNmZy0+ZGF0YSsxMCwgNCk7Ci0JbWVtY3B5KCZjaGFubmVsLCBwUmFDZmctPmRhdGErMTQsIDIpOwotCi0JcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIxID0gbnRvaGwoUjEpOwotCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMiA9IG50b2hsKFIyKTsKLQlwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjMgPSBudG9obChSMyk7Ci0JcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlI0ID0gbnRvaGwoUjQpOwotCXBBZGFwdGVyLT5MYXRjaFJmUmVncy5DaGFubmVsID0gbnRvaHMoY2hhbm5lbCk7Ci0KLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SMSk7Ci0JUlRNUF9SRl9JT19XUklURTMyKHBBZGFwdGVyLCBwQWRhcHRlci0+TGF0Y2hSZlJlZ3MuUjIpOwotCVJUTVBfUkZfSU9fV1JJVEUzMihwQWRhcHRlciwgcEFkYXB0ZXItPkxhdGNoUmZSZWdzLlIzKTsKLQlSVE1QX1JGX0lPX1dSSVRFMzIocEFkYXB0ZXIsIHBBZGFwdGVyLT5MYXRjaFJmUmVncy5SNCk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuICBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9FMlBST01fUkVBRDE2KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMTYJb2Zmc2V0PTAsIHZhbHVlPTA7Ci0JVVNIT1JUICB0bXA9MDsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQotCS8qICJ0bXAiIGlzIGVzcGVjaWFsbHkgZm9yIHNvbWUgY29tcGlsZXJzLi4uICovCi0JUlQyOHh4X0VFUFJPTV9SRUFEMTYocEFkYXB0ZXIsIG9mZnNldCwgdG1wKTsKLQl2YWx1ZSA9IHRtcDsKLQl2YWx1ZSA9IGh0b25zKHZhbHVlKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRUVQUk9NIFJlYWQgb2Zmc2V0ID0gMHglMDR4LCB2YWx1ZSA9IDB4JTA0eFxuIiwgb2Zmc2V0LCB2YWx1ZSkpOwotCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgMik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrMiwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1dSSVRFMTYoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVAlvZmZzZXQsIHZhbHVlOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0JUlQyOHh4X0VFUFJPTV9XUklURTE2KHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1JFQURfQUxMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQgYnVmZmVyW0VFUFJPTV9TSVpFLzJdOwotCi0JcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7Ci0JbWVtY3B5X2V4cyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilidWZmZXIsIEVFUFJPTV9TSVpFKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKStFRVBST01fU0laRSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfRTJQUk9NX1dSSVRFX0FMTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQotCU5kaXNaZXJvTWVtb3J5KChVQ0hBUiAqKWJ1ZmZlciwgRUVQUk9NX1NJWkUpOwotCW1lbWNweV9leHMocEFkYXB0ZXIsIChVQ0hBUiAqKWJ1ZmZlciwgKFVDSEFSICopJnBSYUNmZy0+c3RhdHVzLCBFRVBST01fU0laRSk7Ci0JcnRfZWVfd3JpdGVfYWxsKHBBZGFwdGVyLChVU0hPUlQgKilidWZmZXIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9JT19SRUFEKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIJb2Zmc2V0OwotCVVJTlQzMgl2YWx1ZTsKLQotCW1lbWNweSgmb2Zmc2V0LCAmcFJhQ2ZnLT5zdGF0dXMsIDQpOwotCW9mZnNldCA9IG50b2hsKG9mZnNldCk7Ci0KLQkvKgotCQlXZSBkbyBub3QgbmVlZCB0aGUgYmFzZSBhZGRyZXNzLgotCQlTbyBqdXN0IGV4dHJhY3QgdGhlIG9mZnNldCBvdXQuCi0JKi8KLQlvZmZzZXQgJj0gMHgwMDAwRkZGRjsKLQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgb2Zmc2V0LCAmdmFsdWUpOwotCXZhbHVlID0gaHRvbmwodmFsdWUpOwotCW1lbWNweShwUmFDZmctPmRhdGEsICZ2YWx1ZSwgNCk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrNCwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfSU9fV1JJVEUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVJTlQzMglvZmZzZXQsIHZhbHVlOwotCi0JbWVtY3B5KCZvZmZzZXQsIHBSYUNmZy0+ZGF0YS0yLCA0KTsKLQltZW1jcHkoJnZhbHVlLCBwUmFDZmctPmRhdGErMiwgNCk7Ci0KLQlvZmZzZXQgPSBudG9obChvZmZzZXQpOwotCi0JLyoKLQkJV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KLQkJU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQgb3V0LgotCSovCi0Jb2Zmc2V0ICY9IDB4MDAwMEZGRkY7Ci0JdmFsdWUgPSBudG9obCh2YWx1ZSk7Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfSU9fV1JJVEU6IG9mZnNldCA9ICV4LCB2YWx1ZSA9ICV4XG4iLCBvZmZzZXQsIHZhbHVlKSk7Ci0JUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfSU9fUkVBRF9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIJb2Zmc2V0OwotCVVTSE9SVAlsZW47Ci0KLQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKLQlvZmZzZXQgPSBudG9obChvZmZzZXQpOwotCi0JLyoKLQkJV2UgZG8gbm90IG5lZWQgdGhlIGJhc2UgYWRkcmVzcy4KLQkJU28ganVzdCBleHRyYWN0IHRoZSBvZmZzZXQgb3V0LgotCSovCi0Jb2Zmc2V0ICY9IDB4MDAwMEZGRkY7Ci0JbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSsyLCAyKTsKLQlsZW4gPSBudG9ocyhsZW4pOwotCi0JaWYgKGxlbiA+IDM3MSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgibGVuZ3RoIHJlcXVlc3RlZCBpcyB0b28gbGFyZ2UsIG1ha2UgaXQgc21hbGxlclxuIikpOwotCQlwUmFDZmctPmxlbmd0aCA9IGh0b25zKDIpOwotCQlwUmFDZmctPnN0YXR1cyA9IGh0b25zKDEpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlSVE1QX0lPX1JFQURfQlVMSyhwQWRhcHRlciwgcFJhQ2ZnLT5kYXRhLCAoVUNIQVIgKilvZmZzZXQsIGxlbio0KTsvLyB1bml0IGluIGZvdXIgYnl0ZXMKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSsobGVuKjQpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfUkVBRDgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVTSE9SVAlvZmZzZXQ7Ci0JVUNIQVIJdmFsdWU7Ci0KLQl2YWx1ZSA9IDA7Ci0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCi0JaWYgKEFURV9PTihwQWRhcHRlcikpCi0JewotCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCAmdmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgJnZhbHVlKTsKLQl9Ci0KLQlwUmFDZmctPmRhdGFbMF0gPSB2YWx1ZTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSsxLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9CQlBfV1JJVEU4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQJb2Zmc2V0OwotCVVDSEFSCXZhbHVlOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmdmFsdWUsIHBSYUNmZy0+ZGF0YSwgMSk7Ci0KLQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQl7Ci0JCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOwotCX0KLQotCWlmICgob2Zmc2V0ID09IEJCUF9SMSkgfHwgKG9mZnNldCA9PSBCQlBfUjMpKQotCXsKLQkJU3luY1R4UnhDb25maWcocEFkYXB0ZXIsIG9mZnNldCwgdmFsdWUpOwotCX0KLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQkJQX1JFQURfQUxMKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQgYmJwX3JlZ19pbmRleDsKLQotCWZvciAoYmJwX3JlZ19pbmRleCA9IDA7IGJicF9yZWdfaW5kZXggPCBNQVhfQkJQX0lEKzE7IGJicF9yZWdfaW5kZXgrKykKLQl7Ci0JCXBSYUNmZy0+ZGF0YVtiYnBfcmVnX2luZGV4XSA9IDA7Ci0KLQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCXsKLQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBfcmVnX2luZGV4LCAmcFJhQ2ZnLT5kYXRhW2JicF9yZWdfaW5kZXhdKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwX3JlZ19pbmRleCwgJnBSYUNmZy0+ZGF0YVtiYnBfcmVnX2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrTUFYX0JCUF9JRCsxLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfTk9JU0VfTEVWRUwoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVDSEFSCWNoYW5uZWw7Ci0JSU5UMzIgICBidWZmZXJbM11bMTBdOy8qIDMgOiBSeFBhdGggOyAxMCA6IG5vLiBvZiBwZXIgcnNzaSBzYW1wbGVzICovCi0KLQljaGFubmVsID0gKG50b2hzKHBSYUNmZy0+c3RhdHVzKSAmIDB4MDBGRik7Ci0JQ2FsTm9pc2VMZXZlbChwQWRhcHRlciwgY2hhbm5lbCwgYnVmZmVyKTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAoVUNIQVIgKilwUmFDZmctPmRhdGEsIChVQ0hBUiAqKSYoYnVmZmVyWzBdWzBdKSwgKHNpemVvZihJTlQzMikqMyoxMCkpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKyhzaXplb2YoSU5UMzIpKjMqMTApLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfQ09VTlRFUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVswXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVTJNLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5PdGhlckRhdGEsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLkJlYWNvbiwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxMl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLk90aGVyQ291bnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMTZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4QWMxLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzI0XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhBYzIsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjhdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeEFjMywgNCk7Ci0JLyptZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzMyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuVHhIQ0NBLCA0KTsqLwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzZdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5UeE1nbXQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5SU1NJMCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0NF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlJTU0kxLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuUlNTSTIsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNTJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPmF0ZS5TTlIwLCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzU2XSwgKFVDSEFSICopJnBBZGFwdGVyLT5hdGUuU05SMSwgNCk7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cykrNjAsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0NMRUFSX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCXBBZGFwdGVyLT5hdGUuVTJNID0gMDsKLQlwQWRhcHRlci0+YXRlLk90aGVyRGF0YSA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5CZWFjb24gPSAwOwotCXBBZGFwdGVyLT5hdGUuT3RoZXJDb3VudCA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5UeEFjMCA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5UeEFjMSA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5UeEFjMiA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5UeEFjMyA9IDA7Ci0JLypwQWRhcHRlci0+YXRlLlR4SENDQSA9IDA7Ki8KLQlwQWRhcHRlci0+YXRlLlR4TWdtdCA9IDA7Ci0JcEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCA9IDA7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1RYX1NUQVJUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQgKnA7Ci0JVVNIT1JUCWVyciA9IDE7Ci0JVUNIQVIgICBCYnAyMlZhbHVlID0gMCwgQmJwMjRWYWx1ZSA9IDA7Ci0KLQlpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgKHBBZGFwdGVyLT5hdGUuTW9kZSAmIEFURV9UWEZSQU1FKSkKLQl7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQXRlIFR4IGlzIGFscmVhZHkgcnVubmluZywgdG8gcnVuIG5leHQgVHgsIHlvdSBtdXN0IHN0b3AgaXQgZmlyc3RcbiIpKTsKLQkJZXJyID0gMjsKLQkJZ290byBUWF9TVEFSVF9FUlJPUjsKLQl9Ci0JZWxzZSBpZiAoKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkgJiYgIShwQWRhcHRlci0+YXRlLk1vZGUgJiBBVEVfVFhGUkFNRSkpCi0JewotCQlpbnQgaSA9IDA7Ci0KLQkJd2hpbGUgKChpKysgPCAxMCkgJiYgKHBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgIT0gMCkpCi0JCXsKLQkJCVJUTVB1c2VjRGVsYXkoNTAwMCk7Ci0JCX0KLQotCQkvKiBmb3JjZSBpdCB0byBzdG9wICovCi0JCXBBZGFwdGVyLT5hdGUuVHhTdGF0dXMgPSAwOwotCQlwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50ID0gMDsKLQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gRkFMU0U7Ci0JfQotCi0JLyoKLQkJSWYgcFJhQ2ZnLT5sZW5ndGggPT0gMCwgdGhpcyAiUkFDRkdfQ01EX1RYX1NUQVJUIgotCQlpcyBmb3IgQ2FycmllciB0ZXN0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24uCi0JKi8KLQlpZiAobnRvaHMocFJhQ2ZnLT5sZW5ndGgpICE9IDApCi0JewotCQkvKiBnZXQgZnJhbWUgaW5mbyAqLwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLlR4V0ksIHBSYUNmZy0+ZGF0YSArIDIsIDE2KTsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKSZwQWRhcHRlci0+YXRlLlR4V0ksIFRZUEVfVFhXSSk7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLlR4Q291bnQsIHBSYUNmZy0+ZGF0YSArIDE4LCA0KTsKLQkJcEFkYXB0ZXItPmF0ZS5UeENvdW50ID0gbnRvaGwocEFkYXB0ZXItPmF0ZS5UeENvdW50KTsKLQotCQlwID0gKFVTSE9SVCAqKSgmcFJhQ2ZnLT5kYXRhWzIyXSk7Ci0KLQkJLyogYWx3YXlzIHVzZSBRSURfQUNfQkUgKi8KLQkJcEFkYXB0ZXItPmF0ZS5RSUQgPSAwOwotCi0JCXAgPSAoVVNIT1JUICopKCZwUmFDZmctPmRhdGFbMjRdKTsKLQkJcEFkYXB0ZXItPmF0ZS5ITGVuID0gbnRvaHMoKnApOwotCi0JCWlmIChwQWRhcHRlci0+YXRlLkhMZW4gPiAzMikKLQkJewotCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJwQWRhcHRlci0+YXRlLkhMZW4gPiAzMlxuIikpOwotCQkJZXJyID0gMzsKLQkJCWdvdG8gVFhfU1RBUlRfRVJST1I7Ci0JCX0KLQotCQlOZGlzTW92ZU1lbW9yeSgmcEFkYXB0ZXItPmF0ZS5IZWFkZXIsIHBSYUNmZy0+ZGF0YSArIDI2LCBwQWRhcHRlci0+YXRlLkhMZW4pOwotCi0JCXBBZGFwdGVyLT5hdGUuUExlbiA9IG50b2hzKHBSYUNmZy0+bGVuZ3RoKSAtIChwQWRhcHRlci0+YXRlLkhMZW4gKyAyOCk7Ci0KLQkJaWYgKHBBZGFwdGVyLT5hdGUuUExlbiA+IDMyKQotCQl7Ci0JCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoInBBZGFwdGVyLT5hdGUuUExlbiA+IDMyXG4iKSk7Ci0JCQllcnIgPSA0OwotCQkJZ290byBUWF9TVEFSVF9FUlJPUjsKLQkJfQotCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQWRhcHRlci0+YXRlLlBhdHRlcm4sIHBSYUNmZy0+ZGF0YSArIDI2ICsgcEFkYXB0ZXItPmF0ZS5ITGVuLCBwQWRhcHRlci0+YXRlLlBMZW4pOwotCQlwQWRhcHRlci0+YXRlLkRMZW4gPSBwQWRhcHRlci0+YXRlLlR4V0kuTVBEVXRvdGFsQnl0ZUNvdW50IC0gcEFkYXB0ZXItPmF0ZS5ITGVuOwotCX0KLQotCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjIyLCAmQmJwMjJWYWx1ZSk7Ci0KLQlzd2l0Y2ggKEJicDIyVmFsdWUpCi0JewotCQljYXNlIEJCUDIyX1RYRlJBTUU6Ci0JCQl7Ci0JCQkJaWYgKHBBZGFwdGVyLT5hdGUuVHhDb3VudCA9PSAwKQotCQkJCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJcEFkYXB0ZXItPmF0ZS5UeENvdW50ID0gMHhGRkZGRkZGRjsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQl9Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWEZSQU1FXG4iKSk7Ci0JCQkJcEFkYXB0ZXItPmF0ZS5iUUFUeFN0YXJ0ID0gVFJVRTsKLQkJCQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWEZSQU1FIik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUDoKLQkJCXsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkJCUDIyX1RYQ09OVF9PUl9DQVJSU1VQUFxuIikpOwotCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjI0LCAmQmJwMjRWYWx1ZSk7Ci0KLQkJCQlzd2l0Y2ggKEJicDI0VmFsdWUpCi0JCQkJewotCQkJCQljYXNlIEJCUDI0X1RYQ09OVDoKLQkJCQkJCXsKLQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNUQVJUIFRYQ09OVFxuIikpOwotCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7Ci0JCQkJCQkJU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiVFhDT05UIik7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIEJCUDI0X0NBUlJTVVBQOgotCQkJCQkJewotCQkJCQkJCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBUlQgVFhDQVJSU1VQUFxuIikpOwotCQkJCQkJCXBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9IFRSVUU7Ci0JCQkJCQkJcEFkYXB0ZXItPmF0ZS5Nb2RlIHw9IEFURV9UWENBUlJTVVBQOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXsKLQkJCQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gVFggc3VidHlwZSAhIikpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCQlAyMl9UWENBUlI6Ci0JCQl7Ci0JCQkJQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJTVEFSVCBUWENBUlJcbiIpKTsKLQkJCQlwQWRhcHRlci0+YXRlLmJRQVR4U3RhcnQgPSBUUlVFOwotCQkJCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYQ0FSUiIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXsKLQkJCQlBVEVEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIlVua25vd24gU3RhcnQgVFggc3VidHlwZSAhIikpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBBZGFwdGVyLT5hdGUuYlFBVHhTdGFydCA9PSBUUlVFKQotCXsKLQkJUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotCi1UWF9TVEFSVF9FUlJPUjoKLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIGVycik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9HRVRfVFhfU1RBVFVTKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVSU5UMzIgY291bnQ9MDsKLQotCWNvdW50ID0gaHRvbmwocEFkYXB0ZXItPmF0ZS5UeERvbmVDb3VudCk7Ci0JTmRpc01vdmVNZW1vcnkocFJhQ2ZnLT5kYXRhLCAmY291bnQsIDQpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzQsIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX1RYX1NUT1AoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX1RYX1NUT1BcbiIpKTsKLQotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYU1RPUCIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9SWF9TVEFSVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfUlhfU1RBUlRcbiIpKTsKLQotCXBBZGFwdGVyLT5hdGUuYlFBUnhTdGFydCA9IFRSVUU7Ci0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9SWF9TVE9QKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVE9QXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJSWFNUT1AiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0NBUlJJRVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DQVJSSUVSXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENBUlIiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0NPTlQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TVEFSVF9UWF9DT05UXG4iKSk7Ci0KLQlTZXRfQVRFX1Byb2MocEFkYXB0ZXIsICJUWENPTlQiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1RYX0ZSQU1FKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU1RBUlRfVFhfRlJBTUVcbiIpKTsKLQotCVNldF9BVEVfUHJvYyhwQWRhcHRlciwgIlRYRlJBTUUiKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9CVygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9CV1xuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0KLQlTZXRfQVRFX1RYX0JXX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX1BPV0VSMFxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9QT1dFUjBfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9QT1dFUjEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfUE9XRVIxXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0ZSRVFfT0ZGU0VUXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQlTZXRfQVRFX1RYX0ZSRVFPRkZTRVRfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0dFVF9TVEFUSVNUSUNTKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfR0VUX1NUQVRJU1RJQ1NcbiIpKTsKLQotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+YXRlLlR4RG9uZUNvdW50LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZXRyeUNvdW50LnUuTG93UGFydCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs4XSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuRmFpbGVkQ291bnQudS5Mb3dQYXJ0LCA0KTsKLQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzEyXSwgKFVDSEFSICopJnBBZGFwdGVyLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LnUuTG93UGFydCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsxNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC51Lkxvd1BhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjBdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMjRdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LnUuTG93UGFydCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVsyOF0sIChVQ0hBUiAqKSZwQWRhcHRlci0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIsIDQpOwotCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbMzJdLCAoVUNIQVIgKikmcEFkYXB0ZXItPldsYW5Db3VudGVycy5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCwgNCk7Ci0JbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVszNl0sIChVQ0hBUiAqKSZwQWRhcHRlci0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQsIDQpOwotCi0JaWYgKHBBZGFwdGVyLT5hdGUuUnhBbnRlbm5hU2VsID09IDApCi0JewotCQlJTlQzMiBSU1NJMCA9IDA7Ci0JCUlOVDMyIFJTU0kxID0gMDsKLQkJSU5UMzIgUlNTSTIgPSAwOwotCi0JCVJTU0kwID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMCAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7Ci0JCVJTU0kxID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMSAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7Ci0JCVJTU0kyID0gKElOVDMyKShwQWRhcHRlci0+YXRlLkxhc3RSc3NpMiAtIHBBZGFwdGVyLT5CYnBSc3NpVG9EYm1EZWx0YSk7Ci0JCW1lbWNweV9leGwocEFkYXB0ZXIsICZwUmFDZmctPmRhdGFbNDBdLCAoVUNIQVIgKikmUlNTSTAsIDQpOwotCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQ0XSwgKFVDSEFSICopJlJTU0kxLCA0KTsKLQkJbWVtY3B5X2V4bChwQWRhcHRlciwgJnBSYUNmZy0+ZGF0YVs0OF0sIChVQ0hBUiAqKSZSU1NJMiwgNCk7Ci0JCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSs1MiwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfQotCWVsc2UKLQl7Ci0JCUlOVDMyIFJTU0kwID0gMDsKLQotCQlSU1NJMCA9IChJTlQzMikocEFkYXB0ZXItPmF0ZS5MYXN0UnNzaTAgLSBwQWRhcHRlci0+QmJwUnNzaVRvRGJtRGVsdGEpOwotCQltZW1jcHlfZXhsKHBBZGFwdGVyLCAmcFJhQ2ZnLT5kYXRhWzQwXSwgKFVDSEFSICopJlJTU0kwLCA0KTsKLQkJUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpKzQ0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQl9Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1JFU0VUX0NPVU5URVIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMTsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9SRVNFVF9DT1VOVEVSXG4iKSk7Ci0KLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCXBBZGFwdGVyLT5hdGUuVHhEb25lQ291bnQgPSAwOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VMX1RYX0FOVEVOTkEoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRUxfVFhfQU5URU5OQVxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRUxfUlhfQU5URU5OQSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFTF9SWF9BTlRFTk5BXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQlTZXRfQVRFX1JYX0FudGVubmFfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9QUkVBTUJMRVxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9NT0RFX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQ0hBTk5FTCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JU0hPUlQgICAgdmFsdWUgPSAwOwotCVNUUklORyAgICBzdHJbTEVOX09GX0FSR107Ci0KLQlOZGlzWmVyb01lbW9yeShzdHIsIExFTl9PRl9BUkcpOwotCi0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9DSEFOTkVMXG4iKSk7Ci0KLQltZW1jcHkoKFBVQ0hBUikmdmFsdWUsIChQVUNIQVIpJihwUmFDZmctPnN0YXR1cyksIDIpOwotCXZhbHVlID0gbnRvaHModmFsdWUpOwotCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQlTZXRfQVRFX0NIQU5ORUxfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9BRERSMSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JQVRFREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJSQUNGR19DTURfQVRFX1NFVF9BRERSMVxuIikpOwotCi0JLyoKLQkJQWRkciBpcyBhbiBhcnJheSBvZiBVQ0hBUiwKLQkJc28gbm8gbmVlZCB0byBwZXJmb3JtIGVuZGlhbiBzd2FwLgotCSovCi0JbWVtY3B5KHBBZGFwdGVyLT5hdGUuQWRkcjEsIChQVUNIQVIpKHBSYUNmZy0+ZGF0YSAtIDIpLCBNQUNfQUREUl9MRU4pOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX0FERFIyXG4iKSk7Ci0KLQkvKgotCQlBZGRyIGlzIGFuIGFycmF5IG9mIFVDSEFSLAotCQlzbyBubyBuZWVkIHRvIHBlcmZvcm0gZW5kaWFuIHN3YXAuCi0JKi8KLQltZW1jcHkocEFkYXB0ZXItPmF0ZS5BZGRyMiwgKFBVQ0hBUikocFJhQ2ZnLT5kYXRhIC0gMiksIE1BQ19BRERSX0xFTik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfQUREUjMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfQUREUjNcbiIpKTsKLQotCS8qCi0JCUFkZHIgaXMgYW4gYXJyYXkgb2YgVUNIQVIsCi0JCXNvIG5vIG5lZWQgdG8gcGVyZm9ybSBlbmRpYW4gc3dhcC4KLQkqLwotCW1lbWNweShwQWRhcHRlci0+YXRlLkFkZHIzLCAoUFVDSEFSKShwUmFDZmctPmRhdGEgLSAyKSwgTUFDX0FERFJfTEVOKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9SQVRFKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1JBVEVcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0Jc3ByaW50ZigoY2hhciAqKXN0ciwgIiVkIiwgdmFsdWUpOwotCVNldF9BVEVfVFhfTUNTX1Byb2MocEFkYXB0ZXIsIHN0cik7Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfTEVOKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlTSE9SVCAgICB2YWx1ZSA9IDA7Ci0JU1RSSU5HICAgIHN0cltMRU5fT0ZfQVJHXTsKLQotCU5kaXNaZXJvTWVtb3J5KHN0ciwgTEVOX09GX0FSRyk7Ci0KLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9BVEVfU0VUX1RYX0ZSQU1FX0xFTlxuIikpOwotCi0JbWVtY3B5KChQVUNIQVIpJnZhbHVlLCAoUFVDSEFSKSYocFJhQ2ZnLT5zdGF0dXMpLCAyKTsKLQl2YWx1ZSA9IG50b2hzKHZhbHVlKTsKLQlzcHJpbnRmKChjaGFyICopc3RyLCAiJWQiLCB2YWx1ZSk7Ci0JU2V0X0FURV9UWF9MRU5HVEhfUHJvYyhwQWRhcHRlciwgc3RyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NFVF9UWF9GUkFNRV9DT1VOVCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUICAgIHZhbHVlID0gMDsKLQlTVFJJTkcgICAgc3RyW0xFTl9PRl9BUkddOwotCi0JTmRpc1plcm9NZW1vcnkoc3RyLCBMRU5fT0ZfQVJHKTsKLQotCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUkFDRkdfQ01EX0FURV9TRVRfVFhfRlJBTUVfQ09VTlRcbiIpKTsKLQotCW1lbWNweSgoUFVDSEFSKSZ2YWx1ZSwgKFBVQ0hBUikmKHBSYUNmZy0+c3RhdHVzKSwgMik7Ci0JdmFsdWUgPSBudG9ocyh2YWx1ZSk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvKiBUWF9GUkFNRV9DT1VOVCA9PSAwIG1lYW5zIHR4IGluZmluaXRlbHkgKi8KLQlpZiAodmFsdWUgPT0gMCkKLQl7Ci0JCS8qIFVzZSBUeENvdW50ID0gMHhGRkZGRkZGRiB0byBhcHByb3hpbWF0ZSB0aGUgaW5maW5pdHkuICovCi0JCXBBZGFwdGVyLT5hdGUuVHhDb3VudCA9IDB4RkZGRkZGRkY7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BVEVfVFhfQ09VTlRfUHJvYyAoVHhDb3VudCA9ICVkKVxuIiwgcEFkYXB0ZXItPmF0ZS5UeENvdW50KSk7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJhbGluazogU2V0X0FURV9UWF9DT1VOVF9Qcm9jIFN1Y2Nlc3NcbiIpKTsKLQotCi0JfQotCWVsc2UKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQl7Ci0JCXNwcmludGYoKGNoYXIgKilzdHIsICIlZCIsIHZhbHVlKTsKLQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jKHBBZGFwdGVyLCBzdHIpOwotCX0KLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX1NUQVJUX1JYX0ZSQU1FKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlBVEVEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlJBQ0ZHX0NNRF9SWF9TVEFSVFxuIikpOwotCi0JU2V0X0FURV9Qcm9jKHBBZGFwdGVyLCAiUlhGUkFNRSIpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgSU5UIERPX1JBQ0ZHX0NNRF9BVEVfRTJQUk9NX1JFQURfQlVMSygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxLAotCUlOICBzdHJ1Y3QgYXRlX3JhY2ZnaGRyICpwUmFDZmcpCi17Ci0JVVNIT1JUIG9mZnNldDsKLQlVU0hPUlQgbGVuOwotCVVTSE9SVCBidWZmZXJbRUVQUk9NX1NJWkUvMl07Ci0KLQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7Ci0JbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCXJ0X2VlX3JlYWRfYWxsKHBBZGFwdGVyLCAoVVNIT1JUICopYnVmZmVyKTsKLQotCWlmIChvZmZzZXQgKyBsZW4gPD0gRUVQUk9NX1NJWkUpCi0JCW1lbWNweV9leHMocEFkYXB0ZXIsIHBSYUNmZy0+ZGF0YSwgKFVDSEFSICopYnVmZmVyK29mZnNldCwgbGVuKTsKLQllbHNlCi0JCUFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImV4Y2VlZCBFRVBST00gc2l6ZVxuIikpOwotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpK2xlbiwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0UyUFJPTV9XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQgb2Zmc2V0OwotCVVTSE9SVCBsZW47Ci0JVVNIT1JUIGJ1ZmZlcltFRVBST01fU0laRS8yXTsKLQotCW9mZnNldCA9IG50b2hzKHBSYUNmZy0+c3RhdHVzKTsKLQltZW1jcHkoJmxlbiwgcFJhQ2ZnLT5kYXRhLCAyKTsKLQlsZW4gPSBudG9ocyhsZW4pOwotCi0JcnRfZWVfcmVhZF9hbGwocEFkYXB0ZXIsKFVTSE9SVCAqKWJ1ZmZlcik7Ci0JbWVtY3B5X2V4cyhwQWRhcHRlciwgKFVDSEFSICopYnVmZmVyICsgb2Zmc2V0LCAoVUNIQVIgKilwUmFDZmctPmRhdGEgKyAyLCBsZW4pOwotCXJ0X2VlX3dyaXRlX2FsbChwQWRhcHRlciwoVVNIT1JUICopYnVmZmVyKTsKLQotCVJFU1BPTlNFX1RPX0dVSShwUmFDZmcsIHdycSwgc2l6ZW9mKHBSYUNmZy0+c3RhdHVzKSwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0lPX1dSSVRFX0JVTEsoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSwKLQlJTiAgc3RydWN0IGF0ZV9yYWNmZ2hkciAqcFJhQ2ZnKQotewotCVVJTlQzMiBvZmZzZXQsIGksIHZhbHVlOwotCVVTSE9SVCBsZW47Ci0KLQltZW1jcHkoJm9mZnNldCwgJnBSYUNmZy0+c3RhdHVzLCA0KTsKLQlvZmZzZXQgPSBudG9obChvZmZzZXQpOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGErMiwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkKLQl7Ci0JCW1lbWNweV9leGwocEFkYXB0ZXIsIChVQ0hBUiAqKSZ2YWx1ZSwgcFJhQ2ZnLT5kYXRhKzQraSwgNCk7Ci0JCUFURURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiV3JpdGUgJXggJXhcbiIsIG9mZnNldCArIGksIHZhbHVlKSk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgKChvZmZzZXQraSkgJiAoMHhmZmZmKSksIHZhbHVlKTsKLQl9Ci0KLQlSRVNQT05TRV9UT19HVUkocFJhQ2ZnLCB3cnEsIHNpemVvZihwUmFDZmctPnN0YXR1cyksIE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGlubGluZSBJTlQgRE9fUkFDRkdfQ01EX0FURV9CQlBfUkVBRF9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQgb2Zmc2V0OwotCVVTSE9SVCBsZW47Ci0JVVNIT1JUIGo7Ci0KLQlvZmZzZXQgPSBudG9ocyhwUmFDZmctPnN0YXR1cyk7Ci0JbWVtY3B5KCZsZW4sIHBSYUNmZy0+ZGF0YSwgMik7Ci0JbGVuID0gbnRvaHMobGVuKTsKLQotCWZvciAoaiA9IG9mZnNldDsgaiA8IChvZmZzZXQrbGVuKTsgaisrKQotCXsKLQkJcFJhQ2ZnLT5kYXRhW2ogLSBvZmZzZXRdID0gMDsKLQotCQlpZiAocEFkYXB0ZXItPmF0ZS5Nb2RlID09IEFURV9TVE9QKQotCQl7Ci0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICZwUmFDZmctPmRhdGFbaiAtIG9mZnNldF0pOwotCQl9Ci0JfQotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpK2xlbiwgTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgaW5saW5lIElOVCBET19SQUNGR19DTURfQVRFX0JCUF9XUklURV9CVUxLKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEsCi0JSU4gIHN0cnVjdCBhdGVfcmFjZmdoZHIgKnBSYUNmZykKLXsKLQlVU0hPUlQgb2Zmc2V0OwotCVVTSE9SVCBsZW47Ci0JVVNIT1JUIGo7Ci0JVUNIQVIgKnZhbHVlOwotCi0Jb2Zmc2V0ID0gbnRvaHMocFJhQ2ZnLT5zdGF0dXMpOwotCW1lbWNweSgmbGVuLCBwUmFDZmctPmRhdGEsIDIpOwotCWxlbiA9IG50b2hzKGxlbik7Ci0KLQlmb3IgKGogPSBvZmZzZXQ7IGogPCAob2Zmc2V0K2xlbik7IGorKykKLQl7Ci0JCXZhbHVlID0gcFJhQ2ZnLT5kYXRhICsgMiArIChqIC0gb2Zmc2V0KTsKLQkJaWYgKHBBZGFwdGVyLT5hdGUuTW9kZSA9PSBBVEVfU1RPUCkKLQkJewotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgaiwgICp2YWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGosICAqdmFsdWUpOwotCQl9Ci0JfQotCi0JUkVTUE9OU0VfVE9fR1VJKHBSYUNmZywgd3JxLCBzaXplb2YocFJhQ2ZnLT5zdGF0dXMpLCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotI2VuZGlmCS8vIFJBTElOS19BVEUgLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfYXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2F0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ1OTYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX0FURV9IX18KLSNkZWZpbmUgX19BVEVfSF9fCi0KLQotI2lmZGVmIExJTlVYCi0jZGVmaW5lIGF0ZV9wcmludCBwcmludGsKLSNkZWZpbmUgQVRFREJHUFJJTlQgREJHUFJJTlQKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNkZWZpbmUgRUVQUk9NX1NJWkUJCQkJCQkJCTB4MjAwCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIEVFUFJPTV9CSU5fRklMRV9OQU1FICAiL2V0Yy9XaXJlbGVzcy9SVDI4NjBTVEEvZTJwLmJpbiIKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0KLSNkZWZpbmUgQVRFX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5hdGUuTW9kZSkgIT0gQVRFX1NUT1ApCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSNkZWZpbmUgQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQoX0EsIF9JLCBfcFYpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBCQlBfQ1NSX0NGR19TVFJVQyAgQmJwQ3NyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgICAgICAgICBqLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChqPTA7IGo8TUFYX0JVU1lfQ09VTlQ7IGorKykgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7ICAgICBcCi0gICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLndvcmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuZlJlYWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CQlBfUldfTU9ERSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLkJ1c3kgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgZm9yIChrPTA7IGs8TUFYX0JVU1lfQ09VTlQ7IGsrKykgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihfQSwgQkJQX0NTUl9DRkcsICZCYnBDc3Iud29yZCk7IFwKLSAgICAgICAgICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChCYnBDc3IuZmllbGQuQnVzeSA9PSBJRExFKSAmJiAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKEJicENzci5maWVsZC5SZWdOdW0gPT0gX0kpKSAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICooX3BWKSA9IChVQ0hBUilCYnBDc3IuZmllbGQuVmFsdWU7ICAgICAgICAgXAotICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChCYnBDc3IuZmllbGQuQnVzeSA9PSBCVVNZKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQVRFREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQkJQIHJlYWQgUiVkIGZhaWxcbiIsIF9JKSk7ICAgICAgXAotICAgICAgICAqKF9wVikgPSAoX0EpLT5CYnBXcml0ZUxhdGNoW19JXTsgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBBVEVfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQoX0EsIF9JLCBfVikgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEJCUF9DU1JfQ0ZHX1NUUlVDICBCYnBDc3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgICAgICAgIEJ1c3lDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKEJ1c3lDbnQ9MDsgQnVzeUNudDxNQVhfQlVTWV9DT1VOVDsgQnVzeUNudCsrKSAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fUkVBRDMyKF9BLCBCQlBfQ1NSX0NGRywgJkJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgaWYgKEJicENzci5maWVsZC5CdXN5ID09IEJVU1kpICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci53b3JkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLmZSZWFkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuQkJQX1JXX01PREUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJicENzci5maWVsZC5CdXN5ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQmJwQ3NyLmZpZWxkLlZhbHVlID0gX1Y7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBCYnBDc3IuZmllbGQuUmVnTnVtID0gX0k7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFJUTVBfSU9fV1JJVEUzMihfQSwgQkJQX0NTUl9DRkcsIEJicENzci53b3JkKTsgICAgIFwKLSAgICAgICAgKF9BKS0+QmJwV3JpdGVMYXRjaFtfSV0gPSBfVjsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQnVzeUNudCA9PSBNQVhfQlVTWV9DT1VOVCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEFURURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkJCUCB3cml0ZSBSJWQgZmFpbFxuIiwgX0kpKTsgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLSNpZmRlZiBSVDMweHgKLSNkZWZpbmUgQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChfQSwgX0ksIF9wVikgICAgIFJUTVBfUkZfSU9fUkVBRDhfQllfUkVHX0lEKF9BLCBfSSwgX3BWKQotI2RlZmluZSBBVEVfUkZfSU9fV1JJVEU4X0JZX1JFR19JRChfQSwgX0ksIF9WKSAgICAgUlRNUF9SRl9JT19XUklURThfQllfUkVHX0lEKF9BLCBfSSwgX1YpCi0jZW5kaWYgLy8gUlQzMHh4IC8vCi0KLQotVk9JRCBydF9lZV9yZWFkX2FsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgVVNIT1JUICpEYXRhKTsKLQotVk9JRCBydF9lZV93cml0ZV9hbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVTSE9SVCAqRGF0YSk7Ci0KLUlOVCBTZXRfQVRFX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX0RBX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1NBX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX0JTU0lEX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX0NIQU5ORUxfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfUE9XRVIwX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX1BPV0VSMV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1JYX0FudGVubmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfRlJFUU9GRlNFVF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9CV19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0FURV9UWF9MRU5HVEhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfQ09VTlRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfTUNTX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX1RYX01PREVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9BVEVfVFhfR0lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotCi1JTlQJU2V0X0FURV9SWF9GRVJfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfUmVhZF9SRl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfV3JpdGVfUkYyX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfQVRFX1dyaXRlX1JGM19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0FURV9Xcml0ZV9SRjRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfTG9hZF9FMlBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9BVEVfUmVhZF9FMlBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotCi1JTlQJU2V0X0FURV9TaG93X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQVRFX0hlbHBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1WT0lEIEFURV9RQV9TdGF0aXN0aWNzKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiBQUlhXSV9TVFJVQwkJCXBSeFdJLAotCUlOIFBSVDI4WFhfUlhEX1NUUlVDICAgIHAyOHh4UnhELAotCUlOIFBIRUFERVJfODAyXzExCQlwSGVhZGVyKTsKLQotVk9JRCBSdG1wRG9BdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQgQnViYmxlU29ydCgKLQlJTiAgSU5UMzIgbiwKLQlJTiAgSU5UMzIgYVtdKTsKLQotVk9JRCBDYWxOb2lzZUxldmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0JSU4gIFVDSEFSICAgICAgICAgICBjaGFubmVsLAotCU9VVCBJTlQzMiAgICAgICAgICAgYnVmZmVyWzNdWzEwXSk7Ci0KLUJPT0xFQU4gU3luY1R4UnhDb25maWcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglVU0hPUlQJCQlvZmZzZXQsCi0JSU4JVUNIQVIJCQl2YWx1ZSk7Ci0KLUlOVCBTZXRfVHhTdG9wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfUnhTdG9wX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBEQkcKLUlOVCBTZXRfRUVSZWFkX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfRUVXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0JCUFJlYWRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9CQlBXcml0ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1JGV3JpdGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZiAvLyBEQkcgLy8KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotCi0KLVZPSUQgQVRFQXNpY1N3aXRjaENoYW5uZWwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFURUFzaWNBZGp1c3RUeFBvd2VyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBVEVEaXNhYmxlQXNpY1Byb3RlY3QoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotQ0hBUiBBVEVDb252ZXJ0VG9Sc3NpKAotCUlOIFBSVE1QX0FEQVBURVIgIHBBZCwKLQlJTiBDSEFSCQkJCVJzc2ksCi0JSU4gVUNIQVIgICAgUnNzaU51bWJlcik7Ci0KLVZPSUQgQVRFU2FtcGxlUnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQUlhXSV9TVFJVQwkJcFJ4V0kpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgUlRNUFN0YXRpb25TdG9wKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QU3RhdGlvblN0YXJ0KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBfX0FURV9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfY29uZmlnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUxNDJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydF9jb25maWcuaAotCi0JQWJzdHJhY3Q6Ci0JQ2VudHJhbCBoZWFkZXIgZmlsZSB0byBtYWludGFpbiBhbGwgaW5jbHVkZSBmaWxlcyBmb3IgYWxsIE5ESVMKLQltaW5pcG9ydCBkcml2ZXIgcm91dGluZXMuCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobyAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotCS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVBhdWwgTGluICAgIDA4LTAxLTIwMDIgICAgY3JlYXRlZAotCi0qLwotI2lmbmRlZglfX1JUX0NPTkZJR19IX18KLSNkZWZpbmUJX19SVF9DT05GSUdfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLSNpbmNsdWRlICJydG1wX29zLmgiCi0KLSNpbmNsdWRlICJydG1wX2RlZi5oIgotI2luY2x1ZGUgInJ0bXBfY2hpcC5oIgotI2luY2x1ZGUgInJ0bXBfdGltZXIuaCIKLQotI2luY2x1ZGUgIm9pZC5oIgotI2luY2x1ZGUgIm1sbWUuaCIKLSNpbmNsdWRlICJ3cGEuaCIKLSNpbmNsdWRlICJjcnlwdF9tZDUuaCIKLSNpbmNsdWRlICJjcnlwdF9zaGEyLmgiCi0jaW5jbHVkZSAiY3J5cHRfaG1hYy5oIgotI2luY2x1ZGUgInJ0bXAuaCIKLSNpbmNsdWRlICJhcC5oIgotI2luY2x1ZGUgImRmcy5oIgotI2luY2x1ZGUgImNobGlzdC5oIgotI2luY2x1ZGUgInNwZWN0cnVtLmgiCi0KLSNpZmRlZiBNTE1FX0VYCi0jaW5jbHVkZQkibWxtZV9leF9kZWYuaCIKLSNpbmNsdWRlCSJtbG1lX2V4LmgiCi0jZW5kaWYgLy8gTUxNRV9FWCAvLwotCi0jaW5jbHVkZSAiZWVwcm9tLmgiCi0jaWYgZGVmaW5lZChSVE1QX1BDSV9TVVBQT1JUKSB8fCBkZWZpbmVkKFJUTVBfVVNCX1NVUFBPUlQpCi0jaW5jbHVkZSAicnRtcF9tY3UuaCIKLSNlbmRpZgotCi0KLQotI3VuZGVmIEFQX1dTQ19JTkNMVURFRAotI3VuZGVmIFNUQV9XU0NfSU5DTFVERUQKLSN1bmRlZiBXU0NfSU5DTFVERUQKLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIEJMT0NLX05FVF9JRgotI2luY2x1ZGUgIm5ldGlmX2Jsb2NrLmgiCi0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0KLSNpZmRlZiBJR01QX1NOT09QX1NVUFBPUlQKLSNpbmNsdWRlICJpZ21wX3Nub29wLmgiCi0jZW5kaWYgLy8gSUdNUF9TTk9PUF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSQUxJTktfQVRFCi0jaW5jbHVkZSAicnRfYXRlLmgiCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLSNpZm5kZWYgUkFMSU5LX0FURQotI2Vycm9yICJGb3Igc3VwcG9ydGluZyBRQSBHVUksIHBsZWFzZSBzZXQgSEFTX0FURT15IGFuZCBIQVNfMjh4eF9RQT15LiIKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLQotCi0KLQotI2lmIGRlZmluZWQoQVBfV1NDX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUQV9XU0NfSU5DTFVERUQpCi0jZGVmaW5lIFdTQ19JTkNMVURFRAotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNlcnJvciAiQnVpbGQgZm9yIGJlaW5nIGNvbnRyb2xsZWQgYnkgTmV0d29ya01hbmFnZXIgb3Igd2V4dCwgcGxlYXNlIHNldCBIQVNfV1BBX1NVUFBMSUNBTlQ9eSBhbmQgSEFTX05BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUPXkiCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLSNpZmRlZiBJS0FOT1NfVlhfMVgwCi0jaW5jbHVkZSAidnJfaWthbnMuaCIKLSNlbmRpZiAvLyBJS0FOT1NfVlhfMVgwIC8vCi0KLQotCi0jZW5kaWYJLy8gX19SVF9DT05GSUdfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTRhYTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYyNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlICJydF9jb25maWcuaCIKLQotVUxPTkcJUlREZWJ1Z0xldmVsID0gUlRfREVCVUdfRVJST1I7Ci0KLQotLy8gZm9yIHdpcmVsZXNzIHN5c3RlbSBldmVudCBtZXNzYWdlCi1jaGFyIGNvbnN0ICpwV2lyZWxlc3NTeXNFdmVudFRleHRbSVdfU1lTX0VWRU5UX1RZUEVfTlVNXSA9IHsKLQkvLyBzeXN0ZW0gc3RhdHVzIGV2ZW50Ci0gICAgImhhZCBhc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseSIsCQkJCQkJCS8qIElXX0FTU09DX0VWRU5UX0ZMQUcgKi8KLSAgICAiaGFkIGRpc2Fzc29jaWF0ZWQiLAkJCQkJCQkJCS8qIElXX0RJU0FTU09DX0VWRU5UX0ZMQUcgKi8KLSAgICAiaGFkIGRlYXV0aGVudGljYXRlZCIsCQkJCQkJCQkJLyogSVdfREVBVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiaGFkIGJlZW4gYWdlZC1vdXQgYW5kIGRpc2Fzc29jaWF0ZWQiLAkJCQkJLyogSVdfQUdFT1VUX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgQ291bnRlck1lYXN1cmVzIGF0dGFjayIsCQkJCQkJLyogSVdfQ09VTlRFUl9NRUFTVVJFU19FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIHJlcGxheSBjb3VudGVyIGRpZmZlcmVudCBpbiBLZXkgSGFuZHNoYWtpbmciLAkvKiBJV19SRVBMQVlfQ09VTlRFUl9ESUZGX0VWRU5UX0ZMQUcgKi8KLSAgICAib2NjdXJyZWQgUlNOSUUgZGlmZmVyZW50IGluIEtleSBIYW5kc2hha2luZyIsCQkJLyogSVdfUlNOSUVfRElGRl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIE1JQyBkaWZmZXJlbnQgaW4gS2V5IEhhbmRzaGFraW5nIiwJCQkvKiBJV19NSUNfRElGRl9FVkVOVF9GTEFHICovCi0gICAgIm9jY3VycmVkIElDViBlcnJvciBpbiBSWCIsCQkJCQkJCQkvKiBJV19JQ1ZfRVJST1JfRVZFTlRfRkxBRyAqLwotICAgICJvY2N1cnJlZCBNSUMgZXJyb3IgaW4gUlgiLAkJCQkJCQkJLyogSVdfTUlDX0VSUk9SX0VWRU5UX0ZMQUcgKi8KLQkiR3JvdXAgS2V5IEhhbmRzaGFraW5nIHRpbWVvdXQiLAkJCQkJCS8qIElXX0dST1VQX0hTX1RJTUVPVVRfRVZFTlRfRkxBRyAqLwotCSJQYWlyd2lzZSBLZXkgSGFuZHNoYWtpbmcgdGltZW91dCIsCQkJCQkJLyogSVdfUEFJUldJU0VfSFNfVElNRU9VVF9FVkVOVF9GTEFHICovCi0JIlJTTiBJRSBzYW5pdHkgY2hlY2sgZmFpbHVyZSIsCQkJCQkJCS8qIElXX1JTTklFX1NBTklUWV9GQUlMX0VWRU5UX0ZMQUcgKi8KLQkic2V0IGtleSBkb25lIGluIFdQQS9XUEFQU0siLAkJCQkJCQkvKiBJV19TRVRfS0VZX0RPTkVfV1BBMV9FVkVOVF9GTEFHICovCi0JInNldCBrZXkgZG9uZSBpbiBXUEEyL1dQQTJQU0siLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJV19TRVRfS0VZX0RPTkVfV1BBMl9FVkVOVF9GTEFHICovCi0JImNvbm5lY3RzIHdpdGggb3VyIHdpcmVsZXNzIGNsaWVudCIsICAgICAgICAgICAgICAgICAgICAvKiBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcgKi8KLQkiZGlzY29ubmVjdHMgd2l0aCBvdXIgd2lyZWxlc3MgY2xpZW50IiwgICAgICAgICAgICAgICAgIC8qIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHICovCi0JInNjYW4gY29tcGxldGVkIgkJCQkJCQkJCQkvKiBJV19TQ0FOX0NPTVBMRVRFRF9FVkVOVF9GTEFHICovCi0JInNjYW4gdGVybWluYXRlISEgQnVzeSEhIEVucXVldWUgZmFpbCEhIgkJCQkvKiBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHICovCi0JfTsKLQotLy8gZm9yIHdpcmVsZXNzIElEU19zcG9vZl9hdHRhY2sgZXZlbnQgbWVzc2FnZQotY2hhciBjb25zdCAqcFdpcmVsZXNzU3Bvb2ZFdmVudFRleHRbSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU1dID0gewotICAgICJkZXRlY3RlZCBjb25mbGljdCBTU0lEIiwJCQkJCQkJCS8qIElXX0NPTkZMSUNUX1NTSURfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIGFzc29jaWF0aW9uIHJlc3BvbnNlIiwJCQkJLyogSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgcmVhc3NvY2lhdGlvbiByZXNwb25zZXMiLAkJCQkvKiBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIHByb2JlIHJlc3BvbnNlIiwJCQkJCQkvKiBJV19TUE9PRl9QUk9CRV9SRVNQX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBiZWFjb24iLAkJCQkJCQkJLyogSVdfU1BPT0ZfQkVBQ09OX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkaXNhc3NvY2lhdGlvbiIsCQkJCQkJLyogSVdfU1BPT0ZfRElTQVNTT0NfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCBzcG9vZmVkIGF1dGhlbnRpY2F0aW9uIiwJCQkJCQkvKiBJV19TUE9PRl9BVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgc3Bvb2ZlZCBkZWF1dGhlbnRpY2F0aW9uIiwJCQkJCS8qIElXX1NQT09GX0RFQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHNwb29mZWQgdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lIiwJCQkvKiBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRyAqLwotCSJkZXRlY3RlZCByZXBsYXkgYXR0YWNrIgkJCQkJCQkJLyogSVdfUkVQTEFZX0FUVEFDS19FVkVOVF9GTEFHICovCi0JfTsKLQotLy8gZm9yIHdpcmVsZXNzIElEU19mbG9vZGluZ19hdHRhY2sgZXZlbnQgbWVzc2FnZQotY2hhciBjb25zdCAqcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU1dID0gewotCSJkZXRlY3RlZCBhdXRoZW50aWNhdGlvbiBmbG9vZGluZyIsCQkJCQkJLyogSVdfRkxPT0RfQVVUSF9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9BU1NPQ19SRVFfRVZFTlRfRkxBRyAqLwotICAgICJkZXRlY3RlZCByZWFzc29jaWF0aW9uIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkvKiBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIHByb2JlIHJlcXVlc3QgZmxvb2RpbmciLAkJCQkJCS8qIElXX0ZMT09EX1BST0JFX1JFUV9FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGRpc2Fzc29jaWF0aW9uIGZsb29kaW5nIiwJCQkJCQkvKiBJV19GTE9PRF9ESVNBU1NPQ19FVkVOVF9GTEFHICovCi0gICAgImRldGVjdGVkIGRlYXV0aGVudGljYXRpb24gZmxvb2RpbmciLAkJCQkJLyogSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcgKi8KLSAgICAiZGV0ZWN0ZWQgODAyLjF4IGVhcC1yZXF1ZXN0IGZsb29kaW5nIgkJCQkJLyogSVdfRkxPT0RfRUFQX1JFUV9FVkVOVF9GTEFHICovCi0JfTsKLQotCi0vKiB0aW1lb3V0IC0tIG1zICovCi1WT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KQotewotCXRpbWVvdXQgPSAoKHRpbWVvdXQqT1NfSFopIC8gMTAwMCk7Ci0JcFRpbWVyLT5leHBpcmVzID0gamlmZmllcyArIHRpbWVvdXQ7Ci0JYWRkX3RpbWVyKHBUaW1lcik7Ci19Ci0KLS8qIGNvbnZlcnQgTmRpc01Jbml0aWFsaXplVGltZXIgLS0+IFJUTVBfT1NfSW5pdF9UaW1lciAqLwotVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAotCUlOCVBWT0lEIGRhdGEpCi17Ci0JaW5pdF90aW1lcihwVGltZXIpOwotICAgIHBUaW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7Ci0gICAgcFRpbWVyLT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwotfQotCi0KLVZPSUQgUlRNUF9PU19BZGRfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0JaWYgKHRpbWVyX3BlbmRpbmcocFRpbWVyKSkKLQkJcmV0dXJuOwotCi0JdGltZW91dCA9ICgodGltZW91dCpPU19IWikgLyAxMDAwKTsKLQlwVGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKLQlhZGRfdGltZXIocFRpbWVyKTsKLX0KLQotVk9JRCBSVE1QX09TX01vZF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAotCUlOCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQl0aW1lb3V0ID0gKCh0aW1lb3V0Kk9TX0haKSAvIDEwMDApOwotCW1vZF90aW1lcihwVGltZXIsIGppZmZpZXMgKyB0aW1lb3V0KTsKLX0KLQotVk9JRCBSVE1QX09TX0RlbF9UaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSCQkqcFRpbWVyLAotCU9VVAlCT09MRUFOCQkJCQkqcENhbmNlbGxlZCkKLXsKLQlpZiAodGltZXJfcGVuZGluZyhwVGltZXIpKQotCXsKLQkJKnBDYW5jZWxsZWQgPSBkZWxfdGltZXJfc3luYyhwVGltZXIpOwotCX0KLQllbHNlCi0JewotCQkqcENhbmNlbGxlZCA9IFRSVUU7Ci0JfQotCi19Ci0KLVZPSUQgUlRNUF9PU19SZWxlYXNlX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQUVVFVUVfRU5UUlkgIHBFbnRyeSkKLXsKLQkvL1JUTVBGcmVlTmRpc1BhY2tldChwQWQsIChzdHJ1Y3Qgc2tfYnVmZiAqKXBFbnRyeSk7Ci19Ci0KLS8vIFVuaWZ5IGFsbCBkZWxheSByb3V0aW5lIGJ5IHVzaW5nIHVkZWxheQotVk9JRCBSVE1QdXNlY0RlbGF5KAotCUlOCVVMT05HCXVzZWMpCi17Ci0JVUxPTkcJaTsKLQotCWZvciAoaSA9IDA7IGkgPCAodXNlYyAvIDUwKTsgaSsrKQotCQl1ZGVsYXkoNTApOwotCi0JaWYgKHVzZWMgJSA1MCkKLQkJdWRlbGF5KHVzZWMgJSA1MCk7Ci19Ci0KLXZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKQotewotCXRpbWUtPnUuTG93UGFydCA9IGppZmZpZXM7Ci19Ci0KLS8vIHBBZCBNVVNUIGFsbG93IHRvIGJlIE5VTEwKLU5ESVNfU1RBVFVTIG9zX2FsbG9jX21lbSgKLQlJTglSVE1QX0FEQVBURVIgKnBBZCwKLQlPVVQJVUNIQVIgKiptZW0sCi0JSU4JVUxPTkcgIHNpemUpCi17Ci0JKm1lbSA9IChQVUNIQVIpIGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCptZW0pCi0JCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JZWxzZQotCQlyZXR1cm4gKE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotfQotCi0vLyBwQWQgTVVTVCBhbGxvdyB0byBiZSBOVUxMCi1ORElTX1NUQVRVUyBvc19mcmVlX21lbSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglQVk9JRCBtZW0pCi17Ci0KLQlBU1NFUlQobWVtKTsKLQlrZnJlZShtZW0pOwotCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci19Ci0KLQotCi0KLVBORElTX1BBQ0tFVCBSdG1wT1NOZXRQa3RBbGxvYygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCS8qIEFkZCAyIG1vcmUgYnl0ZXMgZm9yIGlwIGhlYWRlciBhbGlnbm1lbnQqLwotCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSsyKTsKLQotCXJldHVybiAoKFBORElTX1BBQ0tFVClza2IpOwotfQotCi0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlRnJhZ1BhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdDsKLQotCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKLQotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIGZyYWcgcnggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOwotCX0KLQotCWlmIChwa3QpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfU09VUkNFKE9TUEtUX1RPX1JUUEtUKHBrdCksIFBLVFNSQ19ORElTKTsKLQl9Ci0KLQlyZXR1cm4gKFBORElTX1BBQ0tFVCkgcGt0OwotfQotCi0KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlVHhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdDsKLQotCXBrdCA9IGRldl9hbGxvY19za2IoTGVuZ3RoKTsKLQotCWlmIChwa3QgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoImNhbid0IGFsbG9jYXRlIHR4ICVsZCBzaXplIHBhY2tldFxuIixMZW5ndGgpKTsKLQl9Ci0KLQlpZiAocGt0KQotCXsKLQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7Ci0JCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgcGt0LT5kYXRhOwotCX0KLQllbHNlCi0JewotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7Ci0JfQotCi0JcmV0dXJuIChQTkRJU19QQUNLRVQpIHBrdDsKLX0KLQotCi1WT0lEIGJ1aWxkX3R4X3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglQVUNIQVIJcEZyYW1lLAotCUlOCVVMT05HCUZyYW1lTGVuKQotewotCi0Jc3RydWN0IHNrX2J1ZmYJKnBUeFBrdDsKLQotCUFTU0VSVChwUGFja2V0KTsKLQlwVHhQa3QgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKLQotCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXQocFR4UGt0LCBGcmFtZUxlbiksIHBGcmFtZSwgRnJhbWVMZW4pOwotfQotCi1WT0lECVJUTVBGcmVlQWRhcHRlcigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlQT1NfQ09PS0lFIG9zX2Nvb2tpZTsKLQlpbnQgaW5kZXg7Ci0KLQlvc19jb29raWU9KFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQlpZiAocEFkLT5CZWFjb25CdWYpCi0JCWtmcmVlKHBBZC0+QmVhY29uQnVmKTsKLQotCi0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5NZ210UmluZ0xvY2spOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5SeFJpbmdMb2NrKTsKLSNpZmRlZiBSVDMwOTAKLU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+TWN1Q21kTG9jayk7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQlmb3IgKGluZGV4ID0wIDsgaW5kZXggPCBOVU1fT0ZfVFhfUklORzsgaW5kZXgrKykKLQl7Ci0JCU5kaXNGcmVlU3BpbkxvY2soJnBBZC0+VHhTd1F1ZXVlTG9ja1tpbmRleF0pOwotCQlOZGlzRnJlZVNwaW5Mb2NrKCZwQWQtPkRlUXVldWVMb2NrW2luZGV4XSk7Ci0JCXBBZC0+RGVRdWV1ZVJ1bm5pbmdbaW5kZXhdID0gRkFMU0U7Ci0JfQotCi0JTmRpc0ZyZWVTcGluTG9jaygmcEFkLT5pcnFfbG9jayk7Ci0KLQotCXZmcmVlKHBBZCk7IC8vIHBjaV9mcmVlX2NvbnNpc3RlbnQob3NfY29va2llLT5wY2lfZGV2LHNpemVvZihSVE1QX0FEQVBURVIpLHBBZCxvc19jb29raWUtPnBBZF9wYSk7Ci0JaWYgKG9zX2Nvb2tpZSkKLQkJa2ZyZWUob3NfY29va2llKTsKLX0KLQotQk9PTEVBTiBPU19OZWVkX0Nsb25lX1BhY2tldCh2b2lkKQotewotCXJldHVybiAoRkFMU0UpOwotfQotCi0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCWNsb25lIGFuIGlucHV0IE5ESVMgUEFDS0VUIHRvIGFub3RoZXIgb25lLiBUaGUgbmV3IGludGVybmFsbHkgY3JlYXRlZCBORElTIFBBQ0tFVAotCQltdXN0IGhhdmUgb25seSBvbmUgTkRJUyBCVUZGRVIKLQkJcmV0dXJuIC0gYnl0ZSBjb3BpZWQuIDAgbWVhbnMgY2FuJ3QgY3JlYXRlIE5ESVMgUEFDS0VUCi0JCU5PVEU6IGludGVybmFsbHkgY3JlYXRlZCBORElTX1BBQ0tFVCBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IFJUTVBGcmVlTmRpc1BhY2tldAotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwSW5zQU1TRFVIZHIJRVdDIEEtTVNEVSBmb3JtYXQgaGFzIGV4dHJhIDE0LWJ5dGVzIGhlYWRlci4gaWYgVFJVRSwgaW5zZXJ0IHRoaXMgMTQtYnl0ZSBoZHIgaW4gZnJvbnQgb2YgTVNEVS4KLQkJKnBTcmNUb3RhbExlbgkJCXJldHVybiB0b3RhbCBwYWNrZXQgbGVuZ3RoLiBUaGlzIGxlbmdodCBpcyBjYWxjdWxhdGVkIHdpdGggODAyLjMgZm9ybWF0IHBhY2tldC4KLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfU1VDQ0VTUwotCQlORElTX1NUQVRVU19GQUlMVVJFCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJcEluc0FNU0RVSGRyLAotCUlOCVBORElTX1BBQ0tFVAlwSW5QYWNrZXQsCi0JT1VUIFBORElTX1BBQ0tFVCAgICpwcE91dFBhY2tldCkKLXsKLQotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0KLQlBU1NFUlQocEluUGFja2V0KTsKLQlBU1NFUlQocHBPdXRQYWNrZXQpOwotCi0JLy8gMS4gQWxsb2NhdGUgYSBwYWNrZXQKLQlwa3QgPSBkZXZfYWxsb2Nfc2tiKDIwNDgpOwotCi0JaWYgKHBrdCA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JfQotCi0Jc2tiX3B1dChwa3QsIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOwotCU5kaXNNb3ZlTWVtb3J5KHBrdC0+ZGF0YSwgR0VUX09TX1BLVF9EQVRBUFRSKHBJblBhY2tldCksIEdFVF9PU19QS1RfTEVOKHBJblBhY2tldCkpOwotCSpwcE91dFBhY2tldCA9IE9TUEtUX1RPX1JUUEtUKHBrdCk7Ci0KLQotCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UoT1NQS1RfVE9fUlRQS1QocGt0KSwgUEtUU1JDX05ESVMpOwotCi0JcHJpbnRrKCIjIyNDbG9uZSMjI1xuIik7Ci0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vLyB0aGUgYWxsb2NhdGVkIE5ESVMgUEFDS0VUIG11c3QgYmUgZnJlZWQgdmlhIFJUTVBGcmVlTmRpc1BhY2tldCgpCi1ORElTX1NUQVRVUyBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBQTkRJU19QQUNLRVQgICAqcHBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlciwKLQlJTglVSU5UCQkJSGVhZGVyTGVuLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVJTlQJCQlEYXRhTGVuKQotewotCVBORElTX1BBQ0tFVAlwUGFja2V0OwotCUFTU0VSVChwRGF0YSk7Ci0JQVNTRVJUKERhdGFMZW4pOwotCi0JLy8gMS4gQWxsb2NhdGUgYSBwYWNrZXQKLQlwUGFja2V0ID0gKFBORElTX1BBQ0tFVCAqKSBkZXZfYWxsb2Nfc2tiKEhlYWRlckxlbiArIERhdGFMZW4gKyBSVE1QX1BLVF9UQUlMX1BBRERJTkcpOwotCWlmIChwUGFja2V0ID09IE5VTEwpCi0JewotCQkqcHBQYWNrZXQgPSBOVUxMOwotI2lmZGVmIERFQlVHCi0JCXByaW50aygiUlRNUEFsbG9jYXRlTmRpc1BhY2tldCBGYWlsXG5cbiIpOwotI2VuZGlmCi0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCS8vIDIuIGNsb25lIHRoZSBmcmFtZSBjb250ZW50Ci0JaWYgKEhlYWRlckxlbiA+IDApCi0JCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSwgcEhlYWRlciwgSGVhZGVyTGVuKTsKLQlpZiAoRGF0YUxlbiA+IDApCi0JCU5kaXNNb3ZlTWVtb3J5KEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KSArIEhlYWRlckxlbiwgcERhdGEsIERhdGFMZW4pOwotCi0JLy8gMy4gdXBkYXRlIGxlbmd0aCBvZiBwYWNrZXQKLQlza2JfcHV0KEdFVF9PU19QS1RfVFlQRShwUGFja2V0KSwgSGVhZGVyTGVuK0RhdGFMZW4pOwotCi0JUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShwUGFja2V0LCBQS1RTUkNfTkRJUyk7Ci0vLwlwcmludGsoIiVzIDogcFBhY2tldCA9ICVwLCBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLCBwUGFja2V0LCBHRVRfT1NfUEtUX0xFTihwUGFja2V0KSk7Ci0JKnBwUGFja2V0ID0gcFBhY2tldDsKLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotLyoKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIERlc2NyaXB0aW9uOgotCVRoaXMgcm91dGluZSBmcmVlcyBhIG1pbmlwb3J0IGludGVybmFsbHkgYWxsb2NhdGVkIE5ESVNfUEFDS0VUIGFuZCBpdHMKLQljb3JyZXNwb25kaW5nIE5ESVNfQlVGRkVSIGFuZCBhbGxvY2F0ZWQgbWVtb3J5LgotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBGcmVlTmRpc1BhY2tldCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTkRJU19QQUNLRVQgIHBQYWNrZXQpCi17Ci0JZGV2X2tmcmVlX3NrYl9hbnkoUlRQS1RfVE9fT1NQS1QocFBhY2tldCkpOwotfQotCi0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotLy8gTk9URTogd2UgZG8gaGF2ZSBhbiBhc3N1bXB0aW9uIGhlcmUsIHRoYXQgQnl0ZTAgYW5kIEJ5dGUxIGFsd2F5cyByZWFzaWQgYXQgdGhlIHNhbWUKLS8vCQkJIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcgotTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKLQlJTglQTkRJU19CVUZGRVIJcEZpcnN0QnVmZmVyLAotCUlOCVVDSEFSCQkJRGVzaXJlZE9mZnNldCwKLQlPVVQgUFVDSEFSCQkJcEJ5dGUwLAotCU9VVCBQVUNIQVIJCQlwQnl0ZTEpCi17Ci0gICAgKnBCeXRlMCA9ICooUFVDSEFSKShwRmlyc3RCdWZmZXIgKyBEZXNpcmVkT2Zmc2V0KTsKLSAgICAqcEJ5dGUxID0gKihQVUNIQVIpKHBGaXJzdEJ1ZmZlciArIERlc2lyZWRPZmZzZXQgKyAxKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pCi17Ci0JcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKLQlwUGFja2V0SW5mby0+cEZpcnN0QnVmZmVyID0gKFBORElTX0JVRkZFUilHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JcFBhY2tldEluZm8tPlBoeXNpY2FsQnVmZmVyQ291bnQgPSAxOwotCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCi0JKnBTcmNCdWZWQSA9IEdFVF9PU19QS1RfREFUQVBUUihwUGFja2V0KTsKLQkqcFNyY0J1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotfQotCi12b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKQotewotCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gTlVMTDsKLQotCWlmICgqcHBQYWNrZXQpCi0JCXBQYWNrZXQgPSBHRVRfT1NfUEtUX05FWFQoKnBwUGFja2V0KTsKLQotCWlmIChwUGFja2V0KQotCXsKLQkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMTsKLQkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IChQTkRJU19CVUZGRVIpR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCQlwUGFja2V0SW5mby0+UGh5c2ljYWxCdWZmZXJDb3VudCA9IDE7Ci0JCXBQYWNrZXRJbmZvLT5Ub3RhbFBhY2tldExlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCi0JCSpwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0JCSpwU3JjQnVmTGVuID0gR0VUX09TX1BLVF9MRU4ocFBhY2tldCk7Ci0JCSpwcFBhY2tldCA9IEdFVF9PU19QS1RfTkVYVChwUGFja2V0KTsKLQl9Ci0JZWxzZQotCXsKLQkJcFBhY2tldEluZm8tPkJ1ZmZlckNvdW50ID0gMDsKLQkJcFBhY2tldEluZm8tPnBGaXJzdEJ1ZmZlciA9IE5VTEw7Ci0JCXBQYWNrZXRJbmZvLT5QaHlzaWNhbEJ1ZmZlckNvdW50ID0gMDsKLQkJcFBhY2tldEluZm8tPlRvdGFsUGFja2V0TGVuZ3RoID0gMDsKLQotCQkqcFNyY0J1ZlZBID0gTlVMTDsKLQkJKnBTcmNCdWZMZW4gPSAwOwotCQkqcHBQYWNrZXQgPSBOVUxMOwotCX0KLX0KLQotCi1QTkRJU19QQUNLRVQgRHVwbGljYXRlUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKLQlQTkRJU19QQUNLRVQJcFJldFBhY2tldCA9IE5VTEw7Ci0JVVNIT1JUCQkJRGF0YVNpemU7Ci0JVUNIQVIJCQkqcERhdGE7Ci0KLQlEYXRhU2l6ZSA9IChVU0hPUlQpIEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCXBEYXRhID0gKFBVQ0hBUikgR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCi0KLQlza2IgPSBza2JfY2xvbmUoUlRQS1RfVE9fT1NQS1QocFBhY2tldCksIE1FTV9BTExPQ19GTEFHKTsKLQlpZiAoc2tiKQotCXsKLQkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXBSZXRQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOwotCX0KLQotCi0JcmV0dXJuIHBSZXRQYWNrZXQ7Ci0KLX0KLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotICAgIElOICBVSU5UICAgICAgICAgICAgSGRyTGVuLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOwotCVBORElTX1BBQ0tFVAlwUGFja2V0ID0gTlVMTDsKLQotCi0JaWYgKChza2IgPSBfX2Rldl9hbGxvY19za2IoSGRyTGVuICsgRGF0YVNpemUgKyAyLCBNRU1fQUxMT0NfRkxBRykpICE9IE5VTEwpCi0JewotCQlza2JfcmVzZXJ2ZShza2IsIDIpOwotCQlOZGlzTW92ZU1lbW9yeShza2JfdGFpbF9wb2ludGVyKHNrYiksIHBIZWFkZXI4MDJfMywgSGRyTGVuKTsKLQkJc2tiX3B1dChza2IsIEhkckxlbik7Ci0JCU5kaXNNb3ZlTWVtb3J5KHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgcERhdGEsIERhdGFTaXplKTsKLQkJc2tiX3B1dChza2IsIERhdGFTaXplKTsKLQkJc2tiLT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBGcm9tV2hpY2hCU1NJRCk7Ci0JCXBQYWNrZXQgPSBPU1BLVF9UT19SVFBLVChza2IpOwotCX0KLQotCXJldHVybiBwUGFja2V0OwotfQotCi0KLSNkZWZpbmUgVEtJUF9UWF9NSUNfU0laRQkJOAotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqc2tiLCAqbmV3c2tiOwotCi0KLQlza2IgPSBSVFBLVF9UT19PU1BLVChwUGFja2V0KTsKLQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBUS0lQX1RYX01JQ19TSVpFKQotCXsKLQkJLy8gYWxsb2MgYSBuZXcgc2tiIGFuZCBjb3B5IHRoZSBwYWNrZXQKLQkJbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIFRLSVBfVFhfTUlDX1NJWkUsIEdGUF9BVE9NSUMpOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQlpZiAobmV3c2tiID09IE5VTEwpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkV4dGVuZCBUeC5NSUMgZm9yIHBhY2tldCBmYWlsZWQhLCBkcm9wcGluZyBwYWNrZXQhXG4iKSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlza2IgPSBuZXdza2I7Ci0JfQotCi0JcmV0dXJuIE9TUEtUX1RPX1JUUEtUKHNrYik7Ci0KLQotfQotCi0KLQotCi1QTkRJU19QQUNLRVQgQ2xvbmVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcFJ4UGt0OwotCXN0cnVjdCBza19idWZmCSpwQ2xvbmVkUGt0OwotCi0JQVNTRVJUKHBQYWNrZXQpOwotCXBSeFBrdCA9IFJUUEtUX1RPX09TUEtUKHBQYWNrZXQpOwotCi0JLy8gY2xvbmUgdGhlIHBhY2tldAotCXBDbG9uZWRQa3QgPSBza2JfY2xvbmUocFJ4UGt0LCBNRU1fQUxMT0NfRkxBRyk7Ci0KLQlpZiAocENsb25lZFBrdCkKLQl7Ci0JLy8gc2V0IHRoZSBjb3JyZWN0IGRhdGFwdHIgYW5kIGRhdGEgbGVuCi0JcENsb25lZFBrdC0+ZGV2ID0gcFJ4UGt0LT5kZXY7Ci0JcENsb25lZFBrdC0+ZGF0YSA9IHBEYXRhOwotCXBDbG9uZWRQa3QtPmxlbiA9IERhdGFTaXplOwotCXBDbG9uZWRQa3QtPnRhaWwgPSBwQ2xvbmVkUGt0LT5kYXRhICsgcENsb25lZFBrdC0+bGVuOwotCQlBU1NFUlQoRGF0YVNpemUgPCAxNTMwKTsKLQl9Ci0JcmV0dXJuIHBDbG9uZWRQa3Q7Ci19Ci0KLS8vCi0vLyBjaGFuZ2UgT1MgcGFja2V0IERhdGFQdHIgYW5kIERhdGFMZW4KLS8vCi12b2lkICB1cGRhdGVfb3NfcGFja2V0X2luZm8oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OwotCi0JQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKLQlwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7Ci0KLQlwT1NQa3QtPmRldiA9IGdldF9uZXRkZXZfZnJvbV9ic3NpZChwQWQsIEZyb21XaGljaEJTU0lEKTsKLQlwT1NQa3QtPmRhdGEgPSBwUnhCbGstPnBEYXRhOwotCXBPU1BrdC0+bGVuID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlwT1NQa3QtPnRhaWwgPSBwT1NQa3QtPmRhdGEgKyBwT1NQa3QtPmxlbjsKLX0KLQotCi12b2lkIHdsYW5fODAyXzExX3RvXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLQlJTiAgVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZgkqcE9TUGt0OwotCi0JQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKLQlBU1NFUlQocEhlYWRlcjgwMl8zKTsKLQotCXBPU1BrdCA9IFJUUEtUX1RPX09TUEtUKHBSeEJsay0+cFJ4UGFja2V0KTsKLQotCXBPU1BrdC0+ZGV2ID0gZ2V0X25ldGRldl9mcm9tX2Jzc2lkKHBBZCwgRnJvbVdoaWNoQlNTSUQpOwotCXBPU1BrdC0+ZGF0YSA9IHBSeEJsay0+cERhdGE7Ci0JcE9TUGt0LT5sZW4gPSBwUnhCbGstPkRhdGFTaXplOwotCXBPU1BrdC0+dGFpbCA9IHBPU1BrdC0+ZGF0YSArIHBPU1BrdC0+bGVuOwotCi0JLy8KLQkvLyBjb3B5IDgwMi4zIGhlYWRlcgotCS8vCi0JLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCU5kaXNNb3ZlTWVtb3J5KHNrYl9wdXNoKHBPU1BrdCwgTEVOR1RIXzgwMl8zKSwgcEhlYWRlcjgwMl8zLCBMRU5HVEhfODAyXzMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCX0KLQotCi0KLXZvaWQgYW5ub3VuY2VfODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KQotewotCi0Jc3RydWN0IHNrX2J1ZmYJKnBSeFBrdDsKLSNpZmRlZiBJTkZfQU1BWk9OX1BQQQotICAgICAgICBpbnQgICAgICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgdW5zaWduZWQgaW50IHBwYV9mbGFncyA9IDA7IC8qIHJlc2VydmVkIGZvciBub3cgKi8KLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1BQQSAvLwotCi0JQVNTRVJUKHBQYWNrZXQpOwotCi0JcFJ4UGt0ID0gUlRQS1RfVE9fT1NQS1QocFBhY2tldCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotICAgIC8qIFB1c2ggdXAgdGhlIHByb3RvY29sIHN0YWNrICovCi0jaWZkZWYgSUtBTk9TX1ZYXzFYMAotCUlLQU5PU19EYXRhRnJhbWVSeChwQWQsIHBSeFBrdC0+ZGV2LCBwUnhQa3QsIHBSeFBrdC0+bGVuKTsKLSNlbHNlCi0jaWZkZWYgSU5GX0FNQVpPTl9TRQotI2lmZGVmIEJHX0ZUX1NVUFBPUlQKLSAgICAgICAgICAgIEJHX0ZUUEhfUGFja2V0RnJvbUFwSGFuZGxlKHBSeFBrdCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0jZW5kaWYgLy8gQkdfRlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIElORl9BTUFaT05fU0UgLy8KLQlwUnhQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocFJ4UGt0LCBwUnhQa3QtPmRldik7Ci0KLSNpZmRlZiBJTkZfQU1BWk9OX1BQQQotCWlmIChwcGFfaG9va19kaXJlY3RwYXRoX3NlbmRfZm4gJiYgcEFkLT5QUEFFbmFibGU9PVRSVUUgKQotCXsKLQkJbWVtc2V0KHBSeFBrdC0+aGVhZCwwLHBSeFBrdC0+ZGF0YS1wUnhQa3QtPmhlYWQtMTQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwcGFfaG9va19kaXJlY3RwYXRoX3NlbmRfZm4gcnggOnJldDolZCBoZWFkcm9vbTolZCBkZXY6JXMgcGt0bGVuOiVkPD09PVxuIixyZXQsc2tiX2hlYWRyb29tKHBSeFBrdCkKLQkJCSxwUnhQa3QtPmRldi0+bmFtZSxwUnhQa3QtPmxlbikpOwotCQloZXhfZHVtcCgicnggcGFja2V0IiwgcFJ4UGt0LT5kYXRhLCAzMik7Ci0JCXJldCA9IHBwYV9ob29rX2RpcmVjdHBhdGhfc2VuZF9mbihwQWQtPmdfaWZfaWQsIHBSeFBrdCwgcFJ4UGt0LT5sZW4sIHBwYV9mbGFncyk7Ci0JCXBSeFBrdD1OVUxMOwotCQlyZXR1cm47Ci0KLQl9Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotLy8jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0vLwkqKGludCopKHBSeFBrdC0+Y2IpID0gQlJJREdFX1RBRzsKLS8vI2VuZGlmCi0KLQl7Ci0JCW5ldGlmX3J4KHBSeFBrdCk7Ci0JfQotCi0jZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLwotfQotCi0KLVBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QKLXJ0X2dldF9zZ19saXN0X2Zyb21fcGFja2V0KFBORElTX1BBQ0tFVCBwUGFja2V0LCBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgKnNnKQotewotCXNnLT5OdW1iZXJPZkVsZW1lbnRzID0gMTsKLQlzZy0+RWxlbWVudHNbMF0uQWRkcmVzcyA9ICBHRVRfT1NfUEtUX0RBVEFQVFIocFBhY2tldCk7Ci0Jc2ctPkVsZW1lbnRzWzBdLkxlbmd0aCA9IEdFVF9PU19QS1RfTEVOKHBQYWNrZXQpOwotCXJldHVybiAoc2cpOwotfQotCi12b2lkIGhleF9kdW1wKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqcFNyY0J1ZlZBLCB1bnNpZ25lZCBpbnQgU3JjQnVmTGVuKQotewotCXVuc2lnbmVkIGNoYXIgKnB0OwotCWludCB4OwotCi0JaWYgKFJURGVidWdMZXZlbCA8IFJUX0RFQlVHX1RSQUNFKQotCQlyZXR1cm47Ci0KLQlwdCA9IHBTcmNCdWZWQTsKLQlwcmludGsoIiVzOiAlcCwgbGVuID0gJWRcbiIsc3RyLCAgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwotCWZvciAoeD0wOyB4PFNyY0J1ZkxlbjsgeCsrKQotCXsKLQkJaWYgKHggJSAxNiA9PSAwKQotCQkJcHJpbnRrKCIweCUwNHggOiAiLCB4KTsKLQkJcHJpbnRrKCIlMDJ4ICIsICgodW5zaWduZWQgY2hhcilwdFt4XSkpOwotCQlpZiAoeCUxNiA9PSAxNSkgcHJpbnRrKCJcbiIpOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlTZW5kIGxvZyBtZXNzYWdlIHRocm91Z2ggd2lyZWxlc3MgZXZlbnQKLQotCQlTdXBwb3J0IHN0YW5kYXJkIGl3X2V2ZW50IHdpdGggSVdFVkNVU1RPTS4gSXQgaXMgdXNlZCBiZWxvdy4KLQotCQlpd3JlcV9kYXRhLmRhdGEuZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSBldmVudF9mbGFnIHRoYXQgaXMgZGVmaW5lZCBieSB1c2VyLgotCQlpd3JlcV9kYXRhLmRhdGEubGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGV2ZW50IGxvZy4KLQotCQlUaGUgZm9ybWF0IG9mIHRoZSBldmVudCBsb2cgaXMgY29tcG9zZWQgb2YgdGhlIGVudHJ5J3MgTUFDIGFkZHJlc3MgYW5kCi0JCXRoZSBkZXNpcmVkIGxvZyBtZXNzYWdlIChyZWZlciB0byBwV2lyZWxlc3NFdmVudFRleHQpLgotCi0JCQlleDogMTE6MjI6MzM6NDQ6NTU6NjYgaGFzIGFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0KLQkJcC5zLiBUaGUgcmVxdWlyZW1lbnQgb2YgV2lyZWxlc3MgRXh0ZW5zaW9uIGlzIHYxNSBvciBuZXdlci4KLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCi0JSU4JUFVDSEFSCQkJcEFkZHIsCi0JSU4JVUNIQVIJCQlCc3NJZHgsCi0JSU4JQ0hBUgkJCVJzc2kpCi17Ci0jaWYgV0lSRUxFU1NfRVhUID49IDE1Ci0KLQkvL3VuaW9uCQlpd3JlcV9kYXRhICAgICAgd3JxdTsKLQlQU1RSSU5HCXBCdWYgPSBOVUxMLCBwQnVmUHRyID0gTlVMTDsKLQlVU0hPUlQJZXZlbnQsIHR5cGUsIEJ1ZkxlbjsKLQlVQ0hBUglldmVudF90YWJsZV9sZW4gPSAwOwotCi0JdHlwZSA9IEV2ZW50X2ZsYWcgJiAweEZGMDA7Ci0JZXZlbnQgPSBFdmVudF9mbGFnICYgMHgwMEZGOwotCi0Jc3dpdGNoICh0eXBlKQotCXsKLQkJY2FzZSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NZU19FVkVOVF9UWVBFX05VTTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVDoKLQkJCWV2ZW50X3RhYmxlX2xlbiA9IElXX1NQT09GX0VWRU5UX1RZUEVfTlVNOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJV19GTE9PRF9FVkVOVF9GTEFHX1NUQVJUOgotCQkJZXZlbnRfdGFibGVfbGVuID0gSVdfRkxPT0RfRVZFTlRfVFlQRV9OVU07Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZXZlbnRfdGFibGVfbGVuID09IDApCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IFRoZSB0eXBlKCUweDAyeCkgaXMgbm90IHZhbGlkLlxuIiwgX19GVU5DVElPTl9fLCB0eXBlKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZXZlbnQgPj0gZXZlbnRfdGFibGVfbGVuKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgZXZlbnQoJTB4MDJ4KSBpcyBub3QgdmFsaWQuXG4iLCBfX0ZVTkNUSU9OX18sIGV2ZW50KSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvL0FsbG9jYXRlIG1lbW9yeSBhbmQgY29weSB0aGUgbXNnLgotCWlmKChwQnVmID0ga21hbGxvYyhJV19DVVNUT01fTUFYX0xFTiwgR0ZQX0FUT01JQykpICE9IE5VTEwpCi0JewotCQkvL1ByZXBhcmUgdGhlIHBheWxvYWQKLQkJbWVtc2V0KHBCdWYsIDAsIElXX0NVU1RPTV9NQVhfTEVOKTsKLQotCQlwQnVmUHRyID0gcEJ1ZjsKLQotCQlpZiAocEFkZHIpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIihSVDI4NjApIFNUQSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkgIiwgUFJJTlRfTUFDKHBBZGRyKSk7Ci0JCWVsc2UgaWYgKEJzc0lkeCA8IE1BWF9NQlNTSURfTlVNKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSBCU1MocmElZCkgIiwgQnNzSWR4KTsKLQkJZWxzZQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIoUlQyODYwKSAiKTsKLQotCQlpZiAodHlwZSA9PSBJV19TWVNfRVZFTlRfRkxBR19TVEFSVCkKLQkJCXBCdWZQdHIgKz0gc3ByaW50ZihwQnVmUHRyLCAiJXMiLCBwV2lyZWxlc3NTeXNFdmVudFRleHRbZXZlbnRdKTsKLQkJZWxzZSBpZiAodHlwZSA9PSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUKQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyAoUlNTST0lZCkiLCBwV2lyZWxlc3NTcG9vZkV2ZW50VGV4dFtldmVudF0sIFJzc2kpOwotCQllbHNlIGlmICh0eXBlID09IElXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQpCi0JCQlwQnVmUHRyICs9IHNwcmludGYocEJ1ZlB0ciwgIiVzIiwgcFdpcmVsZXNzRmxvb2RFdmVudFRleHRbZXZlbnRdKTsKLQkJZWxzZQotCQkJcEJ1ZlB0ciArPSBzcHJpbnRmKHBCdWZQdHIsICIlcyIsICJ1bmtub3duIGV2ZW50Iik7Ci0KLQkJcEJ1ZlB0cltwQnVmUHRyIC0gcEJ1Zl0gPSAnXDAnOwotCQlCdWZMZW4gPSBwQnVmUHRyIC0gcEJ1ZjsKLQotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIEV2ZW50X2ZsYWcsIE5VTEwsIChQVUNIQVIpcEJ1ZiwgQnVmTGVuKTsKLQkJLy9EQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyA6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHBCdWYpKTsKLQotCQlrZnJlZShwQnVmKTsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcyA6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igd2lyZWxlc3MgZXZlbnQuXG4iLCBfX0ZVTkNUSU9OX18pKTsKLSNlbHNlCi0JREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBUaGUgV2lyZWxlc3MgRXh0ZW5zaW9uIE1VU1QgYmUgdjE1IG9yIG5ld2VyLlxuIiwgX19GVU5DVElPTl9fKSk7Ci0jZW5kaWYgIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLwotfQotCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi12b2lkIHNlbmRfbW9uaXRvcl9wYWNrZXRzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspCi17Ci0gICAgc3RydWN0IHNrX2J1ZmYJKnBPU1BrdDsKLSAgICB3bGFuX25nX3ByaXNtMl9oZWFkZXIgKnBoOwotICAgIGludCByYXRlX2luZGV4ID0gMDsKLSAgICBVU0hPUlQgaGVhZGVyX2xlbiA9IDA7Ci0gICAgVUNIQVIgdGVtcF9oZWFkZXJbNDBdID0gezB9OwotCi0gICAgdV9pbnQzMl90IHJhbGlua3JhdGVbMjU2XSA9IHsyLDQsMTEsMjIsIDEyLDE4LDI0LDM2LDQ4LDcyLDk2LCAgMTA4LCAgIDEwOSwgMTEwLCAxMTEsIDExMiwgMTMsIDI2LCAzOSwgNTIsNzgsMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgMjcsIDU0LDgxLDEwOCwxNjIsIDIxNiwgMjQzLCAyNzAsIC8vIExhc3QgMzgKLQk1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAgMTQsIDI5LCA0MywgNTcsIDg3LCAxMTUsIDEzMCwgMTQ0LCAyOSwgNTksODcsMTE1LCAxNzMsIDIzMCwyNjAsIDI4OCwgMzAsIDYwLDkwLDEyMCwxODAsMjQwLDI3MCwzMDAsNjAsMTIwLDE4MCwyNDAsMzYwLDQ4MCw1NDAsNjAwLCAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLAotCTExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwfTsKLQotCi0gICAgQVNTRVJUKHBSeEJsay0+cFJ4UGFja2V0KTsKLSAgICBpZiAocFJ4QmxrLT5EYXRhU2l6ZSA8IDEwKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMgOiBTaXplIGlzIHRvbyBzbWFsbCEgKCVkKVxuIiwgX19GVU5DVElPTl9fLCBwUnhCbGstPkRhdGFTaXplKSk7Ci0JCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLSAgICB9Ci0KLSAgICBpZiAocFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpID4gUlhfQlVGRkVSX0FHR1JFU0laRSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogU2l6ZSBpcyB0b28gbGFyZ2UhICglZClcbiIsIF9fRlVOQ1RJT05fXywgcFJ4QmxrLT5EYXRhU2l6ZSArIHNpemVvZih3bGFuX25nX3ByaXNtMl9oZWFkZXIpKSk7Ci0JCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLSAgICB9Ci0KLSAgICBwT1NQa3QgPSBSVFBLVF9UT19PU1BLVChwUnhCbGstPnBSeFBhY2tldCk7Ci0JcE9TUGt0LT5kZXYgPSBnZXRfbmV0ZGV2X2Zyb21fYnNzaWQocEFkLCBCU1MwKTsKLSAgICBpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5UeXBlID09IEJUWVBFX0RBVEEpCi0gICAgewotICAgICAgICBwUnhCbGstPkRhdGFTaXplIC09IExFTkdUSF84MDJfMTE7Ci0gICAgICAgIGlmICgocFJ4QmxrLT5wSGVhZGVyLT5GQy5Ub0RzID09IDEpICYmCi0gICAgICAgICAgICAocFJ4QmxrLT5wSGVhZGVyLT5GQy5GckRzID09IDEpKQotICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTFfV0lUSF9BRERSNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaGVhZGVyX2xlbiA9IExFTkdUSF84MDJfMTE7Ci0KLSAgICAgICAgLy8gUU9TCi0JaWYgKHBSeEJsay0+cEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpCi0JewotCSAgICBoZWFkZXJfbGVuICs9IDI7Ci0JCS8vIERhdGEgc2tpcCBRT1MgY29udG9ybCBmaWVsZAotCQlwUnhCbGstPkRhdGFTaXplIC09MjsKLQl9Ci0KLQkvLyBPcmRlciBiaXQ6IEEtUmFsaW5rIG9yIEhUQysKLQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5PcmRlcikKLQl7Ci0JICAgIGhlYWRlcl9sZW4gKz0gNDsKLQkJCS8vIERhdGEgc2tpcCBIVEMgY29udG9ybCBmaWVsZAotCQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSA0OwotCX0KLQotICAgICAgICAvLyBDb3B5IEhlYWRlcgotICAgICAgICBpZiAoaGVhZGVyX2xlbiA8PSA0MCkKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHRlbXBfaGVhZGVyLCBwUnhCbGstPnBEYXRhLCBoZWFkZXJfbGVuKTsKLQotICAgICAgICAvLyBza2lwIEhXIHBhZGRpbmcKLQlpZiAocFJ4QmxrLT5SeEQuTDJQQUQpCi0JICAgIHBSeEJsay0+cERhdGEgKz0gKGhlYWRlcl9sZW4gKyAyKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcFJ4QmxrLT5wRGF0YSArPSBoZWFkZXJfbGVuOwotICAgIH0gLy9lbmQgaWYKLQotCi0JaWYgKHBSeEJsay0+RGF0YVNpemUgPCBwT1NQa3QtPmxlbikgewotICAgICAgICBza2JfdHJpbShwT1NQa3QscFJ4QmxrLT5EYXRhU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2tiX3B1dChwT1NQa3QsKHBSeEJsay0+RGF0YVNpemUgLSBwT1NQa3QtPmxlbikpOwotICAgIH0gLy9lbmQgaWYKLQotICAgIGlmICgocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkgPiAwKSB7Ci0JICAgIHNrYl9wdXQocE9TUGt0LChwUnhCbGstPnBEYXRhIC0gcE9TUGt0LT5kYXRhKSk7Ci0JICAgIHNrYl9wdWxsKHBPU1BrdCwocFJ4QmxrLT5wRGF0YSAtIHBPU1BrdC0+ZGF0YSkpOwotICAgIH0gLy9lbmQgaWYKLQotICAgIGlmIChza2JfaGVhZHJvb20ocE9TUGt0KSA8IChzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSsgaGVhZGVyX2xlbikpIHsKLSAgICAgICAgaWYgKHBza2JfZXhwYW5kX2hlYWQocE9TUGt0LCAoc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikgKyBoZWFkZXJfbGVuKSwgMCwgR0ZQX0FUT01JQykpIHsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzIDogUmVhbGxvY2F0ZSBoZWFkZXIgc2l6ZSBvZiBza19idWZmIGZhaWwhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCWdvdG8gZXJyX2ZyZWVfc2tfYnVmZjsKLQkgICAgfSAvL2VuZCBpZgotICAgIH0gLy9lbmQgaWYKLQotICAgIGlmIChoZWFkZXJfbGVuID4gMCkKLSAgICAgICAgTmRpc01vdmVNZW1vcnkoc2tiX3B1c2gocE9TUGt0LCBoZWFkZXJfbGVuKSwgdGVtcF9oZWFkZXIsIGhlYWRlcl9sZW4pOwotCi0gICAgcGggPSAod2xhbl9uZ19wcmlzbTJfaGVhZGVyICopIHNrYl9wdXNoKHBPU1BrdCwgc2l6ZW9mKHdsYW5fbmdfcHJpc20yX2hlYWRlcikpOwotCU5kaXNaZXJvTWVtb3J5KHBoLCBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKSk7Ci0KLSAgICBwaC0+bXNnY29kZQkJICAgID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybTsKLQlwaC0+bXNnbGVuCQkgICAgPSBzaXplb2Yod2xhbl9uZ19wcmlzbTJfaGVhZGVyKTsKLQlzdHJjcHkoKFBTVFJJTkcpIHBoLT5kZXZuYW1lLCAoUFNUUklORykgcEFkLT5uZXRfZGV2LT5uYW1lKTsKLQotICAgIHBoLT5ob3N0dGltZS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2hvc3R0aW1lOwotCXBoLT5ob3N0dGltZS5zdGF0dXMgPSAwOwotCXBoLT5ob3N0dGltZS5sZW4gPSA0OwotCXBoLT5ob3N0dGltZS5kYXRhID0gamlmZmllczsKLQotCXBoLT5tYWN0aW1lLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZTsKLQlwaC0+bWFjdGltZS5zdGF0dXMgPSAwOwotCXBoLT5tYWN0aW1lLmxlbiA9IDA7Ci0JcGgtPm1hY3RpbWUuZGF0YSA9IDA7Ci0KLSAgICBwaC0+aXN0eC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHg7Ci0JcGgtPmlzdHguc3RhdHVzID0gMDsKLQlwaC0+aXN0eC5sZW4gPSAwOwotCXBoLT5pc3R4LmRhdGEgPSAwOwotCi0gICAgcGgtPmNoYW5uZWwuZGlkID0gRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsOwotCXBoLT5jaGFubmVsLnN0YXR1cyA9IDA7Ci0JcGgtPmNoYW5uZWwubGVuID0gNDsKLQotICAgIHBoLT5jaGFubmVsLmRhdGEgPSAodV9pbnQzMl90KXBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0KLSAgICBwaC0+cnNzaS5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2k7Ci0JcGgtPnJzc2kuc3RhdHVzID0gMDsKLQlwaC0+cnNzaS5sZW4gPSA0OwotICAgIHBoLT5yc3NpLmRhdGEgPSAodV9pbnQzMl90KVJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIHBSeEJsay0+cFJ4V0ktPlJTU0kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgcFJ4QmxrLT5wUnhXSS0+UlNTSTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBwUnhCbGstPnBSeFdJLT5SU1NJMiwgUlNTSV8yKSk7OwotCi0JcGgtPnNpZ25hbC5kaWQgPSBESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NpZ25hbDsKLQlwaC0+c2lnbmFsLnN0YXR1cyA9IDA7Ci0JcGgtPnNpZ25hbC5sZW4gPSA0OwotCXBoLT5zaWduYWwuZGF0YSA9IDA7IC8vcnNzaSArIG5vaXNlOwotCi0JcGgtPm5vaXNlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2U7Ci0JcGgtPm5vaXNlLnN0YXR1cyA9IDA7Ci0JcGgtPm5vaXNlLmxlbiA9IDQ7Ci0JcGgtPm5vaXNlLmRhdGEgPSAwOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgaWYgKHBSeEJsay0+cFJ4V0ktPlBIWU1PREUgPj0gTU9ERV9IVE1JWCkKLSAgICB7Ci0JcmF0ZV9pbmRleCA9IDE2ICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5CVyAqMTYpICsgKChVQ0hBUilwUnhCbGstPnBSeFdJLT5TaG9ydEdJICozMikgKyAoKFVDSEFSKXBSeEJsay0+cFJ4V0ktPk1DUyk7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlpZiAocFJ4QmxrLT5wUnhXSS0+UEhZTU9ERSA9PSBNT0RFX09GRE0pCi0JcmF0ZV9pbmRleCA9IChVQ0hBUikocFJ4QmxrLT5wUnhXSS0+TUNTKSArIDQ7Ci0gICAgZWxzZQotCXJhdGVfaW5kZXggPSAoVUNIQVIpKHBSeEJsay0+cFJ4V0ktPk1DUyk7Ci0gICAgaWYgKHJhdGVfaW5kZXggPCAwKQotICAgICAgICByYXRlX2luZGV4ID0gMDsKLSAgICBpZiAocmF0ZV9pbmRleCA+IDI1NSkKLSAgICAgICAgcmF0ZV9pbmRleCA9IDI1NTsKLQotCXBoLT5yYXRlLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fcmF0ZTsKLQlwaC0+cmF0ZS5zdGF0dXMgPSAwOwotCXBoLT5yYXRlLmxlbiA9IDQ7Ci0gICAgcGgtPnJhdGUuZGF0YSA9IHJhbGlua3JhdGVbcmF0ZV9pbmRleF07Ci0KLQlwaC0+ZnJtbGVuLmRpZCA9IERJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fZnJtbGVuOwotICAgIHBoLT5mcm1sZW4uc3RhdHVzID0gMDsKLQlwaC0+ZnJtbGVuLmxlbiA9IDQ7Ci0JcGgtPmZybWxlbi5kYXRhCT0gKHVfaW50MzJfdClwUnhCbGstPkRhdGFTaXplOwotCi0KLSAgICBwT1NQa3QtPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLSAgICBwT1NQa3QtPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMocE9TUGt0LCBwT1NQa3QtPmRldik7Ci0gICAgcE9TUGt0LT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotICAgIG5ldGlmX3J4KHBPU1BrdCk7Ci0KLSAgICByZXR1cm47Ci0KLWVycl9mcmVlX3NrX2J1ZmY6Ci0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQlyZXR1cm47Ci0KLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlGaWxlIG9wZW4vY2xvc2UgcmVsYXRlZCBmdW5jdGlvbnMuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUlRNUF9PU19GRCBSdG1wT1NGaWxlT3BlbihjaGFyICpwUGF0aCwgIGludCBmbGFnLCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgZmlsZQkqZmlsZVB0cjsKLQotCWZpbGVQdHIgPSBmaWxwX29wZW4ocFBhdGgsIGZsYWcsIDApOwotCWlmIChJU19FUlIoZmlsZVB0cikpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCIlcygpOiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19GVU5DVElPTl9fLCAtUFRSX0VSUihmaWxlUHRyKSwgcFBhdGgpKTsKLQl9Ci0KLQlyZXR1cm4gKFJUTVBfT1NfRkQpZmlsZVB0cjsKLX0KLQotaW50IFJ0bXBPU0ZpbGVDbG9zZShSVE1QX09TX0ZEIG9zZmQpCi17Ci0JZmlscF9jbG9zZShvc2ZkLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotCi12b2lkIFJ0bXBPU0ZpbGVTZWVrKFJUTVBfT1NfRkQgb3NmZCwgaW50IG9mZnNldCkKLXsKLQlvc2ZkLT5mX3BvcyA9IG9mZnNldDsKLX0KLQotCi1pbnQgUnRtcE9TRmlsZVJlYWQoUlRNUF9PU19GRCBvc2ZkLCBjaGFyICpwRGF0YVB0ciwgaW50IHJlYWRMZW4pCi17Ci0JLy8gVGhlIG9iamVjdCBtdXN0IGhhdmUgYSByZWFkIG1ldGhvZAotCWlmIChvc2ZkLT5mX29wICYmIG9zZmQtPmZfb3AtPnJlYWQpCi0JewotCQlyZXR1cm4gb3NmZC0+Zl9vcC0+cmVhZChvc2ZkLCAgcERhdGFQdHIsIHJlYWRMZW4sICZvc2ZkLT5mX3Bvcyk7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIm5vIGZpbGUgcmVhZCBtZXRob2RcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQotCi1pbnQgUnRtcE9TRmlsZVdyaXRlKFJUTVBfT1NfRkQgb3NmZCwgY2hhciAqcERhdGFQdHIsIGludCB3cml0ZUxlbikKLXsKLQlyZXR1cm4gb3NmZC0+Zl9vcC0+d3JpdGUob3NmZCwgcERhdGFQdHIsIChzaXplX3Qpd3JpdGVMZW4sICZvc2ZkLT5mX3Bvcyk7Ci19Ci0KLQotdm9pZCBSdG1wT1NGU0luZm9DaGFuZ2UoUlRNUF9PU19GU19JTkZPICpwT1NGU0luZm8sIEJPT0xFQU4gYlNldCkKLXsKLQlpZiAoYlNldCkKLQl7Ci0JCS8vIFNhdmUgdWlkIGFuZCBnaWQgdXNlZCBmb3IgZmlsZXN5c3RlbSBhY2Nlc3MuCi0JCS8vIFNldCB1c2VyIGFuZCBncm91cCB0byAwIChyb290KQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyOSkKLQkJcE9TRlNJbmZvLT5mc3VpZD0gY3VycmVudC0+ZnN1aWQ7Ci0JCXBPU0ZTSW5mby0+ZnNnaWQgPSBjdXJyZW50LT5mc2dpZDsKLQkJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT5mc2dpZCA9IDA7Ci0jZWxzZQotCQlwT1NGU0luZm8tPmZzdWlkID0gY3VycmVudF9mc3VpZCgpOwotCQlwT1NGU0luZm8tPmZzZ2lkID0gY3VycmVudF9mc2dpZCgpOwotI2VuZGlmCi0JCXBPU0ZTSW5mby0+ZnMgPSBnZXRfZnMoKTsKLQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JfQotCWVsc2UKLQl7Ci0JCXNldF9mcyhwT1NGU0luZm8tPmZzKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjkpCi0JCWN1cnJlbnQtPmZzdWlkID0gcE9TRlNJbmZvLT5mc3VpZDsKLQkJY3VycmVudC0+ZnNnaWQgPSBwT1NGU0luZm8tPmZzZ2lkOwotI2VuZGlmCi0JfQotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCVRhc2sgY3JlYXRlL21hbmFnZW1lbnQva2lsbCByZWxhdGVkIGZ1bmN0aW9ucy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrS2lsbCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKQotewotCVJUTVBfQURBUFRFUiAqcEFkOwotCWludCByZXQgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCi0JcEFkID0gKFJUTVBfQURBUFRFUiAqKXBUYXNrLT5wcml2OwotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0JaWYgKHBUYXNrLT5rdGhyZWFkX3Rhc2spCi0JewotCQlrdGhyZWFkX3N0b3AocFRhc2stPmt0aHJlYWRfdGFzayk7Ci0JCXJldCA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotI2Vsc2UKLQlDSEVDS19QSURfTEVHQUxJVFkocFRhc2stPnRhc2tQSUQpCi0JewotCQlwcmludGsoIlRlcm1pbmF0ZSB0aGUgdGFzayglcykgd2l0aCBwaWQoJWQpIVxuIiwgcFRhc2stPnRhc2tOYW1lLCBHRVRfUElEX05VTUJFUihwVGFzay0+dGFza1BJRCkpOwotCQltYigpOwotCQlwVGFzay0+dGFza19raWxsZWQgPSAxOwotCQltYigpOwotCQlyZXQgPSBLSUxMX1RIUkVBRF9QSUQocFRhc2stPnRhc2tQSUQsIFNJR1RFUk0sIDEpOwotCQlpZiAocmV0KQotCQl7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJraWxsIHRhc2soJXMpIHdpdGggcGlkKCVkKSBmYWlsZWQocmV0VmFsPSVkKSFcbiIsCi0JCQkJcFRhc2stPnRhc2tOYW1lLCBHRVRfUElEX05VTUJFUihwVGFzay0+dGFza1BJRCksIHJldCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwVGFzay0+dGFza0NvbXBsZXRlKTsKLQkJCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOwotCQkJcFRhc2stPnRhc2tfa2lsbGVkID0gMDsKLQkJCXJldCA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci0KLX0KLQotCi1JTlQgUnRtcE9TVGFza05vdGlmeVRvRXhpdCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKQotewotCi0jaWZuZGVmIEtUSFJFQURfU1VQUE9SVAotCWNvbXBsZXRlX2FuZF9leGl0KCZwVGFzay0+dGFza0NvbXBsZXRlLCAwKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBSdG1wT1NUYXNrQ3VzdG9taXplKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2spCi17Ci0KLSNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JZGFlbW9uaXplKChQU1RSSU5HKSZwVGFzay0+dGFza05hbWVbMF0vKiIlcyIscEFkLT5uZXRfZGV2LT5uYW1lKi8pOwotCi0JYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWRhZW1vbml6ZSgpOwotCXJlcGFyZW50X3RvX2luaXQoKTsKLQlzdHJjcHkoY3VycmVudC0+Y29tbSwgJnBUYXNrLT50YXNrTmFtZVswXSk7Ci0KLQlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBzaWdtYXNrKFNJR1RFUk0pIHwgc2lnbWFzayhTSUdLSUxMKSk7Ci0KLQkvKiBBbGxvdyBpbnRlcmNlcHRpb24gb2YgU0lHS0lMTCBvbmx5Ci0JICogRG9uJ3QgYWxsb3cgb3RoZXIgc2lnbmFscyB0byBpbnRlcnJ1cHQgdGhlIHRyYW5zbWlzc2lvbiAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNCwyMikKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnbWFza19sb2NrLCBmbGFncyk7Ci0JZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKLQlyZWNhbGNfc2lncGVuZGluZyhjdXJyZW50KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdtYXNrX2xvY2ssIGZsYWdzKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICAvKiBzaWduYWwgdGhhdCB3ZSd2ZSBzdGFydGVkIHRoZSB0aHJlYWQgKi8KLQljb21wbGV0ZSgmcFRhc2stPnRhc2tDb21wbGV0ZSk7Ci0KLSNlbmRpZgotfQotCi0KLU5ESVNfU1RBVFVTIFJ0bXBPU1Rhc2tBdHRhY2goCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzaywKLQlJTiBpbnQgKCpmbikodm9pZCAqKSwKLQlJTiB2b2lkICphcmcpCi17Ci0JTkRJU19TVEFUVVMgc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQlwaWRfdCBwaWRfbnVtYmVyID0gLTE7Ci0KLSNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKLQlwVGFzay0+dGFza19raWxsZWQgPSAwOwotCXBUYXNrLT5rdGhyZWFkX3Rhc2sgPSBOVUxMOwotCXBUYXNrLT5rdGhyZWFkX3Rhc2sgPSBrdGhyZWFkX3J1bihmbiwgYXJnLCBwVGFzay0+dGFza05hbWUpOwotCWlmIChJU19FUlIocFRhc2stPmt0aHJlYWRfdGFzaykpCi0JCXN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0jZWxzZQotCXBpZF9udW1iZXIgPSBrZXJuZWxfdGhyZWFkKGZuLCBhcmcsIFJUTVBfT1NfTUdNVF9UQVNLX0ZMQUdTKTsKLQlpZiAocGlkX251bWJlciA8IDApCi0JewotCQlEQkdQUklOVCAoUlRfREVCVUdfRVJST1IsICgiQXR0YWNoIHRhc2soJXMpIGZhaWxlZCFcbiIsIHBUYXNrLT50YXNrTmFtZSkpOwotCQlzdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQllbHNlCi0JewotCQlwVGFzay0+dGFza1BJRCA9IEdFVF9QSUQocGlkX251bWJlcik7Ci0KLQkJLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwVGFzay0+dGFza0NvbXBsZXRlKTsKLQkJc3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0KLU5ESVNfU1RBVFVTIFJ0bXBPU1Rhc2tJbml0KAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2ssCi0JSU4gUFNUUklORwkJcFRhc2tOYW1lLAotCUlOIFZPSUQJCQkqcFByaXYpCi17Ci0JaW50IGxlbjsKLQotCUFTU0VSVChwVGFzayk7Ci0KLSNpZm5kZWYgS1RIUkVBRF9TVVBQT1JUCi0JTmRpc1plcm9NZW1vcnkoKFBVQ0hBUikocFRhc2spLCBzaXplb2YoUlRNUF9PU19UQVNLKSk7Ci0jZW5kaWYKLQotCWxlbiA9IHN0cmxlbihwVGFza05hbWUpOwotCWxlbiA9IGxlbiA+IChSVE1QX09TX1RBU0tfTkFNRV9MRU4gLTEpID8gKFJUTVBfT1NfVEFTS19OQU1FX0xFTi0xKSA6IGxlbjsKLQlOZGlzTW92ZU1lbW9yeSgmcFRhc2stPnRhc2tOYW1lWzBdLCBwVGFza05hbWUsIGxlbik7Ci0JcFRhc2stPnByaXYgPSBwUHJpdjsKLQotI2lmbmRlZiBLVEhSRUFEX1NVUFBPUlQKLQlSVE1QX1NFTV9FVkVOVF9JTklUX0xPQ0tFRCgmKHBUYXNrLT50YXNrU2VtYSkpOwotCXBUYXNrLT50YXNrUElEID0gVEhSRUFEX1BJRF9JTklUX1ZBTFVFOwotCi0JaW5pdF9jb21wbGV0aW9uICgmcFRhc2stPnRhc2tDb21wbGV0ZSk7Ci0jZW5kaWYKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCXsKLQkJaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS1VQX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TVEFfTElOS0RPV05fRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQkJfQotCX0KLX0KLQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKLS8vc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoaW50IHNpemVvZl9wcml2LCBjb25zdCBjaGFyICptYXNrLCB2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKSAvL3NhbXBsZQotc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX25ldGRldigKLQlpbnQgc2l6ZW9mX3ByaXYsCi0JY29uc3QgY2hhciAqbWFzaywKLQl2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKQotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci0gICAgSU5UCQkJCQlhbGxvY19zaXplOwotCi0KLSAgICAvKiBlbnN1cmUgMzItYnl0ZSBhbGlnbm1lbnQgb2YgdGhlIHByaXZhdGUgYXJlYSAqLwotICAgIGFsbG9jX3NpemUgPSBzaXplb2YgKCpkZXYpICsgc2l6ZW9mX3ByaXYgKyAzMTsKLQotICAgIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBrbWFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwotICAgIGlmIChkZXYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAotCQkJCSgiYWxsb2NfbmV0ZGV2OiBVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG1lbW9yeS5cbiIpKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbWVtc2V0KGRldiwgMCwgYWxsb2Nfc2l6ZSk7Ci0KLSAgICBpZiAoc2l6ZW9mX3ByaXYpCi0gICAgICAgIGRldi0+cHJpdiA9ICh2b2lkICopICgoKGxvbmcpKGRldiArIDEpICsgMzEpICYgfjMxKTsKLQotICAgIHNldHVwKGRldik7Ci0gICAgc3RyY3B5KGRldi0+bmFtZSwgbWFzayk7Ci0KLSAgICByZXR1cm4gZGV2OwotfQotI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLwotCi0KLWludCBSdG1wT1NXcmllbGVzc0V2ZW50U2VuZCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVSU5UMzIJCWV2ZW50VHlwZSwKLQlJTiBJTlQJCQlmbGFncywKLQlJTiBQVUNIQVIJCXBTcmNNYWMsCi0JSU4gUFVDSEFSCQlwRGF0YSwKLQlJTiBVSU5UMzIJCWRhdGFMZW4pCi17Ci0JdW5pb24gaXdyZXFfZGF0YSAgICB3cnF1OwotCi0gICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCi0JaWYgKGZsYWdzPi0xKQotCSAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBmbGFnczsKLQotCWlmIChwU3JjTWFjKQotCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBTcmNNYWMsIE1BQ19BRERSX0xFTik7Ci0KLQlpZiAoKHBEYXRhIT0gTlVMTCkgJiYgKGRhdGFMZW4gPiAwKSkKLQkJd3JxdS5kYXRhLmxlbmd0aCA9IGRhdGFMZW47Ci0KLSAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgZXZlbnRUeXBlLCAmd3JxdSwgKGNoYXIgKilwRGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IFJ0bXBPU05ldERldkFkZHJTZXQoCi0JSU4gUE5FVF9ERVYgcE5ldERldiwKLQlJTiBQVUNIQVIJcE1hY0FkZHIpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7Ci0JUlRNUF9BREFQVEVSICpwQWQ7Ci0KLQluZXRfZGV2ID0gcE5ldERldjsKLQkvL3BBZCA9IChSVE1QX0FEQVBURVIgKiluZXRfZGV2LT5wcml2OwotCXBBZD1SVE1QX09TX05FVERFVl9HRVRfUFJJVihwTmV0RGV2KTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIHdvcmstYXJvdW5kIGZvciB0aGUgU3VTRSBkdWUgdG8gaXQgaGFzIGl0J3Mgb3duIGludGVyZmFjZSBuYW1lIG1hbmFnZW1lbnQgc3lzdGVtLgotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgMTYpOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5kZXZfbmFtZSwgbmV0X2Rldi0+bmFtZSwgc3RybGVuKG5ldF9kZXYtPm5hbWUpKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlOZGlzTW92ZU1lbW9yeShuZXRfZGV2LT5kZXZfYWRkciwgcE1hY0FkZHIsIDYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotCi0vKgotICAqCUFzc2lnbiB0aGUgbmV0d29yayBkZXYgbmFtZSBmb3IgY3JlYXRlZCBSYWxpbmsgV2lGaSBpbnRlcmZhY2UuCi0gICovCi1zdGF0aWMgaW50IFJ0bXBPU05ldERldlJlcXVlc3ROYW1lKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFBORVRfREVWIGRldiwKLQlJTiBQU1RSSU5HIHBQcmVmaXhTdHIsCi0JSU4gSU5UCWRldklkeCkKLXsKLQlQTkVUX0RFVgkJZXhpc3ROZXREZXY7Ci0JU1RSSU5HCQlzdWZmaXhOYW1lW0lGTkFNU0laXTsKLQlTVFJJTkcJCWRlc2lyZWROYW1lW0lGTkFNU0laXTsKLQlpbnQJaWZOYW1lSWR4LCBwcmVmaXhMZW4sIHNsb3ROYW1lTGVuOwotCWludCBTdGF0dXM7Ci0KLQotCXByZWZpeExlbiA9IHN0cmxlbihwUHJlZml4U3RyKTsKLQlBU1NFUlQoKHByZWZpeExlbiA8IElGTkFNU0laKSk7Ci0KLQlmb3IgKGlmTmFtZUlkeCA9IGRldklkeDsgaWZOYW1lSWR4IDwgMzI7IGlmTmFtZUlkeCsrKQotCXsKLQkJbWVtc2V0KHN1ZmZpeE5hbWUsIDAsIElGTkFNU0laKTsKLQkJbWVtc2V0KGRlc2lyZWROYW1lLCAwLCBJRk5BTVNJWik7Ci0JCXN0cm5jcHkoJmRlc2lyZWROYW1lWzBdLCBwUHJlZml4U3RyLCBwcmVmaXhMZW4pOwotCi0jaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCi0JCWlmIChwQWQtPk1DX1Jvd0lEID49IDApCi0JCQlzcHJpbnRmKHN1ZmZpeE5hbWUsICIlMDJkXyVkIiwgcEFkLT5NQ19Sb3dJRCwgaWZOYW1lSWR4KTsKLQkJZWxzZQotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCQlzcHJpbnRmKHN1ZmZpeE5hbWUsICIlZCIsIGlmTmFtZUlkeCk7Ci0KLQkJc2xvdE5hbWVMZW4gPSBzdHJsZW4oc3VmZml4TmFtZSk7Ci0JCUFTU0VSVCgoKHNsb3ROYW1lTGVuICsgcHJlZml4TGVuKSA8IElGTkFNU0laKSk7Ci0JCXN0cmNhdChkZXNpcmVkTmFtZSwgc3VmZml4TmFtZSk7Ci0KLQkJZXhpc3ROZXREZXYgPSBSdG1wT1NOZXREZXZHZXRCeU5hbWUoZGV2LCAmZGVzaXJlZE5hbWVbMF0pOwotCQlpZiAoZXhpc3ROZXREZXYgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQllbHNlCi0JCQlSdG1wT1NOZXREZXZpY2VSZWZQdXQoZXhpc3ROZXREZXYpOwotCX0KLQotCWlmKGlmTmFtZUlkeCA8IDMyKQotCXsKLQkJc3RyY3B5KCZkZXYtPm5hbWVbMF0sICZkZXNpcmVkTmFtZVswXSk7Ci0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLAotCQkJCQkoIkNhbm5vdCByZXF1ZXN0IERldk5hbWUgd2l0aCBwcmVpZngoJXMpIGFuZCBpbiByYW5nZSgwfjMyKSBhcyBzdWZmaXggZnJvbSBPUyFcbiIsIHBQcmVmaXhTdHIpKTsKLQkJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0KLXZvaWQgUnRtcE9TTmV0RGV2Q2xvc2UoCi0JSU4gUE5FVF9ERVYgcE5ldERldikKLXsKLQlkZXZfY2xvc2UocE5ldERldik7Ci19Ci0KLQotdm9pZCBSdG1wT1NOZXREZXZGcmVlKFBORVRfREVWIHBOZXREZXYpCi17Ci0JQVNTRVJUKHBOZXREZXYpOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCWZyZWVfbmV0ZGV2KHBOZXREZXYpOwotI2Vsc2UKLQlrZnJlZShwTmV0RGV2KTsKLSNlbmRpZgotfQotCi0KLUlOVCBSdG1wT1NOZXREZXZBbGxvYygKLQlJTiBQTkVUX0RFViAqbmV3X2Rldl9wLAotCUlOIFVJTlQzMglwcml2RGF0YVNpemUpCi17Ci0JLy8gYXNzaWduIGl0IGFzIG51bGwgZmlyc3QuCi0JKm5ld19kZXZfcCA9IE5VTEw7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBbGxvY2F0ZSBhIG5ldCBkZXZpY2Ugd2l0aCBwcml2YXRlIGRhdGEgc2l6ZT0lZCFcbiIsIHByaXZEYXRhU2l6ZSkpOwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSAweDIwNDAyIC8vIFJlZCBIYXQgNy4xCi0JKm5ld19kZXZfcCA9IGFsbG9jX25ldGRldihwcml2RGF0YVNpemUsICJldGglZCIsIGV0aGVyX3NldHVwKTsKLSNlbHNlCi0JKm5ld19kZXZfcCA9IGFsbG9jX2V0aGVyZGV2KHByaXZEYXRhU2l6ZSk7Ci0jZW5kaWYgLy8gTElOVVhfVkVSU0lPTl9DT0RFIC8vCi0KLQlpZiAoKm5ld19kZXZfcCkKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JZWxzZQotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLX0KLQotCi1QTkVUX0RFViBSdG1wT1NOZXREZXZHZXRCeU5hbWUoUE5FVF9ERVYgcE5ldERldiwgUFNUUklORyBwRGV2TmFtZSkKLXsKLQlQTkVUX0RFVglwVGFyZ2V0TmV0RGV2ID0gTlVMTDsKLQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNCkKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQotCXBUYXJnZXROZXREZXYgPSBkZXZfZ2V0X2J5X25hbWUoZGV2X25ldChwTmV0RGV2KSwgcERldk5hbWUpOwotI2Vsc2UKLQlBU1NFUlQocE5ldERldik7Ci0JcFRhcmdldE5ldERldiA9IGRldl9nZXRfYnlfbmFtZShwTmV0RGV2LT5uZF9uZXQsIHBEZXZOYW1lKTsKLSNlbmRpZgotI2Vsc2UKLQlwVGFyZ2V0TmV0RGV2ID0gZGV2X2dldF9ieV9uYW1lKHBEZXZOYW1lKTsKLSNlbmRpZiAvLyBLRVJORUxfVkVSU0lPTigyLDYsMjQpIC8vCi0KLSNlbHNlCi0JaW50CWRldk5hbWVMZW47Ci0KLQlkZXZOYW1lTGVuID0gc3RybGVuKHBEZXZOYW1lKTsKLQlBU1NFUlQoKGRldk5hbWVMZW4gPD0gSUZOQU1TSVopKTsKLQotCWZvcihwVGFyZ2V0TmV0RGV2PWRldl9iYXNlOyBwVGFyZ2V0TmV0RGV2IT1OVUxMOyBwVGFyZ2V0TmV0RGV2PXBUYXJnZXROZXREZXYtPm5leHQpCi0JewotCQlpZiAoc3RybmNtcChwVGFyZ2V0TmV0RGV2LT5uYW1lLCBwRGV2TmFtZSwgZGV2TmFtZUxlbikgPT0gMCkKLQkJCWJyZWFrOwotCX0KLSNlbmRpZiAvLyBLRVJORUxfVkVSU0lPTigyLDUsMCkgLy8KLQotCXJldHVybiBwVGFyZ2V0TmV0RGV2OwotfQotCi0KLXZvaWQgUnRtcE9TTmV0RGV2aWNlUmVmUHV0KFBORVRfREVWIHBOZXREZXYpCi17Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCS8qCi0JCWV2ZXJ5IHRpbWUgZGV2X2dldF9ieV9uYW1lIGlzIGNhbGxlZCwgYW5kIGl0IGhhcyByZXR1cm5lZCBhIHZhbGlkIHN0cnVjdAotCQluZXRfZGV2aWNlKiwgZGV2X3B1dCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyd2FyZHMsIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZQotCQltYWNoaW5lIGhhbmdzIHdoZW4gdGhlIGRldmljZSBpcyB1bnJlZ2lzdGVyZWQgKHNpbmNlIGRldi0+cmVmY250ID4gMSkuCi0JKi8KLQlpZihwTmV0RGV2KQotCQlkZXZfcHV0KHBOZXREZXYpOwotI2VuZGlmIC8vIExJTlVYX1ZFUlNJT05fQ09ERSAvLwotfQotCi0KLUlOVCBSdG1wT1NOZXREZXZEZXN0b3J5KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFBORVRfREVWCQlwTmV0RGV2KQotewotCi0JLy8gVE9ETzogTmVlZCB0byBmaXggdGhpcwotCXByaW50aygiV0FSTklORzogVGhpcyBmdW5jdGlvbiglcykgbm90IGltcGxlbWVudCB5ZXQhISFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBSdG1wT1NOZXREZXZEZXRhY2goUE5FVF9ERVYgcE5ldERldikKLXsKLQl1bnJlZ2lzdGVyX25ldGRldihwTmV0RGV2KTsKLX0KLQotCi1pbnQgUnRtcE9TTmV0RGV2QXR0YWNoKAotCUlOIFBORVRfREVWIHBOZXREZXYsCi0JSU4gUlRNUF9PU19ORVRERVZfT1BfSE9PSyAqcERldk9wSG9vaykKLXsKLQlpbnQgcmV0LCBydG5sX2xvY2tlZCA9IEZBTFNFOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUnRtcE9TTmV0RGV2QXR0YWNoKCktLS0+XG4iKSk7Ci0JLy8gSWYgd2UgbmVlZCBob29rIHNvbWUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIG5ldCBkZXZpY2Ugc3RydWN0cnVlLCBub3cgZG8gaXQuCi0JaWYgKHBEZXZPcEhvb2spCi0JewotCQlQUlRNUF9BREFQVEVSIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKHBOZXREZXYpOwotCi0JCXBOZXREZXYtPm5ldGRldl9vcHMgPSBwRGV2T3BIb29rLT5uZXRkZXZfb3BzOwotCi0JCS8qIE9TIHNwZWNpZmljIGZsYWdzLCBoZXJlIHdlIHVzZWQgdG8gaW5kaWNhdGUgaWYgd2UgYXJlIHZpcnR1YWwgaW50ZXJmYWNlICovCi0JCXBOZXREZXYtPnByaXZfZmxhZ3MgPSBwRGV2T3BIb29rLT5wcml2X2ZsYWdzOwotCi0jaWYgKFdJUkVMRVNTX0VYVCA8IDIxKSAmJiAoV0lSRUxFU1NfRVhUID49IDEyKQotCQlwTmV0RGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTIKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCXsKLQkJCXBOZXREZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKLQkJfQotI2VuZGlmIC8vV0lSRUxFU1NfRVhUID49IDEyCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgotCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQotCQl7Ci0JCQlwTmV0RGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7Ci0JCX0KLSNlbmRpZiAvL1dJUkVMRVNTX0VYVCA+PSAxMgotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLQkJLy8gY29weSB0aGUgbmV0IGRldmljZSBtYWMgYWRkcmVzcyB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCi0JCU5kaXNNb3ZlTWVtb3J5KHBOZXREZXYtPmRldl9hZGRyLCAmcERldk9wSG9vay0+ZGV2QWRkclswXSwgTUFDX0FERFJfTEVOKTsKLQotCQlydG5sX2xvY2tlZCA9IHBEZXZPcEhvb2stPm5lZWRQcm90Y3RlZDsKLQl9Ci0KLQlpZiAocnRubF9sb2NrZWQpCi0JCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZShwTmV0RGV2KTsKLQllbHNlCi0JCXJldCA9IHJlZ2lzdGVyX25ldGRldihwTmV0RGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjwtLS1SdG1wT1NOZXREZXZBdHRhY2goKSwgcmV0PSVkXG4iLCByZXQpKTsKLQlpZiAocmV0ID09IDApCi0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCWVsc2UKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci19Ci0KLQotUE5FVF9ERVYgUnRtcE9TTmV0RGV2Q3JlYXRlKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIElOVAkJCWRldlR5cGUsCi0JSU4gSU5UCQkJZGV2TnVtLAotCUlOIElOVAkJCXByaXZNZW1TaXplLAotCUlOIFBTVFJJTkcJCXBOYW1lUHJlZml4KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpwTmV0RGV2ID0gTlVMTDsKLQlpbnQgc3RhdHVzOwotCi0KLQkvKiBhbGxvY2F0ZSBhIG5ldyBuZXR3b3JrIGRldmljZSAqLwotCXN0YXR1cyA9IFJ0bXBPU05ldERldkFsbG9jKCZwTmV0RGV2LCAwIC8qcHJpdk1lbVNpemUqLyk7Ci0JaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJLyogYWxsb2NhdGlvbiBmYWlsLCBleGl0ICovCi0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGZhaWwgKCVzKS4uLlxuIiwgcE5hbWVQcmVmaXgpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0KLQkvKiBmaW5kIGEgYXZhaWxhYmxlIGludGVyZmFjZSBuYW1lLCBtYXggMzIgaW50ZXJmYWNlcyAqLwotCXN0YXR1cyA9IFJ0bXBPU05ldERldlJlcXVlc3ROYW1lKHBBZCwgcE5ldERldiwgcE5hbWVQcmVmaXgsIGRldk51bSk7Ci0JaWYgKHN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJLyogZXJyb3IhIG5vIGFueSBhdmFpbGFibGUgcmEgbmFtZSBjYW4gYmUgdXNlZCEgKi8KLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiQXNzaWduIGludGVyZmFjZSBuYW1lICglcyB3aXRoIHN1ZmZpeCAwfjMyKSBmYWlsZWQuLi5cbiIsIHBOYW1lUHJlZml4KSk7Ci0JCVJ0bXBPU05ldERldkZyZWUocE5ldERldik7Ci0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlRoZSBuYW1lIG9mIHRoZSBuZXcgJXMgaW50ZXJmYWNlIGlzICVzLi4uXG4iLCBwTmFtZVByZWZpeCwgcE5ldERldi0+bmFtZSkpOwotCX0KLQotCXJldHVybiBwTmV0RGV2OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9saW51eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTcwZTc4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMzQgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLQlydF9saW51eC5oCi0KLSAgICBBYnN0cmFjdDoKLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgIFdoZW4gICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpZm5kZWYgX19SVF9MSU5VWF9IX18KLSNkZWZpbmUgX19SVF9MSU5VWF9IX18KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLSNpbmNsdWRlIDxhc20vYW1hem9uX3NlL2lmeF9wcGFfaW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2FtYXpvbl9zZS9pZnhfcHBhX2hvb2suaD4KLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1BQQSAvLwotCi0vLyBsb2FkIGZpcm13YXJlCi0jZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4JLy8gZm9yIGdldF91bmFsaWduZWQoKQotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2VuZGlmIC8vIEtUSFJFQURfU1VQUE9SVCAvLwotCi0jdW5kZWYgQVBfV1NDX0lOQ0xVREVECi0jdW5kZWYgU1RBX1dTQ19JTkNMVURFRAotI3VuZGVmIFdTQ19JTkNMVURFRAotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDQpCi0jZXJyb3IgIlRoaXMga2VybmUgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQga3RocmVhZCEhIgotI2VuZGlmCi0jZW5kaWYgLy8gS1RIUkVBRF9TVVBQT1JUIC8vCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJUHJvZmlsZSByZWxhdGVkIHNlY3Rpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFJUTVBfTUFDX1BDSQotI2RlZmluZSBTVEFfUFJPRklMRV9QQVRICQkJIi9ldGMvV2lyZWxlc3MvUlQyODYwU1RBL1JUMjg2MFNUQS5kYXQiCi0jZGVmaW5lIFNUQV9EUklWRVJfVkVSU0lPTgkJCSIyLjEuMC4wIgotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotI2RlZmluZSBDQVJEX0lORk9fUEFUSAkJCSIvZXRjL1dpcmVsZXNzL1JUMjg2MFNUQS9SVDI4NjBTVEFDYXJkLmRhdCIKLSNlbmRpZiAvLyBNVUxUSVBMRV9DQVJEX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLWV4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2l3X2hhbmRsZXJfZGVmOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLWV4dGVybgljb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcnQyOHh4X2FwX2l3X2hhbmRsZXJfZGVmOwotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJQ29tcGlsZXIgcmVsYXRlZCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI3VuZGVmIF9faW5saW5lCi0jZGVmaW5lIF9faW5saW5lCQlzdGF0aWMgaW5saW5lCi0jZGVmaW5lIElOCi0jZGVmaW5lIE9VVAotI2RlZmluZSBJTk9VVAotI2RlZmluZSBORElTX1NUQVRVUwkJSU5UCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBTcGVjaWZpYyBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCBwY2lfZGV2CQkqIFBQQ0lfREVWOwotdHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZQkqIFBORVRfREVWOwotdHlwZWRlZiB2b2lkCQkJCSogUE5ESVNfUEFDS0VUOwotdHlwZWRlZiBjaGFyCQkJCU5ESVNfUEFDS0VUOwotdHlwZWRlZiBQTkRJU19QQUNLRVQJCSogUFBORElTX1BBQ0tFVDsKLXR5cGVkZWYJZG1hX2FkZHJfdAkJCU5ESVNfUEhZU0lDQUxfQUREUkVTUzsKLXR5cGVkZWYJZG1hX2FkZHJfdAkJCSogUE5ESVNfUEhZU0lDQUxfQUREUkVTUzsKLXR5cGVkZWYgdm9pZAkJCQkqIE5ESVNfSEFORExFOwotdHlwZWRlZiBjaGFyCQkJCSogUE5ESVNfQlVGRkVSOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKLXR5cGVkZWYJc3RydWN0IHBpZCAqCVJUTVBfT1NfUElEOwotI2Vsc2UKLXR5cGVkZWYgcGlkX3QJCQkJUlRNUF9PU19QSUQ7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VtYXBob3JlCVJUTVBfT1NfU0VNOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZuZGVmIFBDSV9ERVZJQ0UKLSNkZWZpbmUgUENJX0RFVklDRSh2ZW5kLGRldikgXAotCS52ZW5kb3IgPSAodmVuZCksIC5kZXZpY2UgPSAoZGV2KSwgXAotCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gUENJX0FOWV9JRAotI2VuZGlmIC8vIFBDSV9ERVZJQ0UgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNkZWZpbmUgUlRfTU9EX0lOQ19VU0VfQ09VTlQoKSBcCi0JaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpIFwKLQl7IFwKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXM6IGNhbm5vdCByZXNlcnZlIG1vZHVsZVxuIiwgX19GVU5DVElPTl9fKSk7IFwKLQkJcmV0dXJuIC0xOyBcCi0JfQotCi0jZGVmaW5lIFJUX01PRF9ERUNfVVNFX0NPVU5UKCkgbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0jZWxzZQotI2RlZmluZSBSVF9NT0RfSU5DX1VTRV9DT1VOVCgpCU1PRF9JTkNfVVNFX0NPVU5UOwotI2RlZmluZSBSVF9NT0RfREVDX1VTRV9DT1VOVCgpIE1PRF9ERUNfVVNFX0NPVU5UOwotI2VuZGlmCi0KLSNkZWZpbmUgUlRNUF9JTkNfUkVGKF9BKQkJMAotI2RlZmluZSBSVE1QX0RFQ19SRUYoX0EpCQkwCi0jZGVmaW5lIFJUTVBfR0VUX1JFRihfQSkJCTAKLQotCi0jaWYgV0lSRUxFU1NfRVhUID49IDEyCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gcXVlcnkgL3Byb2MKLXN0cnVjdCBpd19zdGF0aXN0aWNzICpydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzKAotICAgIElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJTmV0d29yayByZWxhdGVkIGNvbnN0YW50IGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIElGTkFNU0laCi0jZGVmaW5lIElGTkFNU0laIDE2Ci0jZW5kaWYKLQotI2RlZmluZSBFVEhfTEVOR1RIX09GX0FERFJFU1MJNgotCi0jZGVmaW5lIE5ESVNfU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIE5ESVNfU1RBVFVTX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIE5ESVNfU1RBVFVTX0lOVkFMSURfREFUQQkJCQkweDAyCi0jZGVmaW5lIE5ESVNfU1RBVFVTX1JFU09VUkNFUyAgICAgICAgICAgICAgICAgICAweDAzCi0KLSNkZWZpbmUgTkRJU19TRVRfUEFDS0VUX1NUQVRVUyhfcCwgX3N0YXR1cykJCQlkb3t9IHdoaWxlKDApCi0jZGVmaW5lIE5kaXNXcml0ZUVycm9yTG9nRW50cnkoX2EsIF9iLCBfYywgX2QpCQlkb3t9IHdoaWxlKDApCi0KLS8qIHN0YXRpc3RpY3MgY291bnRlciAqLwotI2RlZmluZSBTVEFUU19JTkNfUlhfUEFDS0VUUyhfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfUEFDS0VUUyhfcEFkLCBfZGV2KQotCi0jZGVmaW5lIFNUQVRTX0lOQ19SWF9CWVRFU1MoX3BBZCwgX2RldiwgbGVuKQotI2RlZmluZSBTVEFUU19JTkNfVFhfQllURVNTKF9wQWQsIF9kZXYsIGxlbikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfRVJST1JTKF9wQWQsIF9kZXYpCi0jZGVmaW5lIFNUQVRTX0lOQ19UWF9FUlJPUlMoX3BBZCwgX2RldikKLQotI2RlZmluZSBTVEFUU19JTkNfUlhfRFJPUFBFRChfcEFkLCBfZGV2KQotI2RlZmluZSBTVEFUU19JTkNfVFhfRFJPUFBFRChfcEFkLCBfZGV2KQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJUmFsaW5rIFNwZWNpZmljIG5ldHdvcmsgcmVsYXRlZCBjb25zdGFudCBkZWZpbml0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfQUlECQkJMHgwMAkJLy8weDAwfjB4M2YKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX01CU1NJRAkJMHgwMAkJLy8weDAwLDB4MTAsMHgyMCwweDMwCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9XRFMJCQkweDEwCQkvLzB4NDAsMHg1MCwweDYwLDB4NzAKLSNkZWZpbmUgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJCQkweDIwCi0jZGVmaW5lIE1JTl9ORVRfREVWSUNFX0ZPUl9NRVNICQkJMHgzMAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBNSU5fTkVUX0RFVklDRV9GT1JfRExTCQkJMHg0MAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2RlZmluZSBORVRfREVWSUNFX1JFQUxfSURYX01BU0sJCTB4MGYJCS8vIGZvciBlYWNoIG9wZXJhdGlvbiBtb2RlLCB3ZSBtYXhpbXVtIHN1cHBvcnQgMTUgZW50aXRpZXMuCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECQkwCi0jZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCQkxCi0jZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkyCi0jZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAkzCi0jZGVmaW5lIE5ESVNfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMJNAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJT1Mgc2lnbmFsaW5nIHJlbGF0ZWQgY29uc3RhbnQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU9TIGZpbGUgb3BlcmF0aW9uIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IGZpbGUqIFJUTVBfT1NfRkQ7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX09TX0ZTX0lORk9fCi17Ci0JaW50CQkJCWZzdWlkOwotCWludAkJCQlmc2dpZDsKLQltbV9zZWdtZW50X3QJZnM7Ci19UlRNUF9PU19GU19JTkZPOwotCi0jZGVmaW5lIElTX0ZJTEVfT1BFTl9FUlIoX2ZkKQlJU19FUlIoKF9mZCkpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBzZW1hcGhvcmUgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBvc19sb2NrICB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotfTsKLQotdHlwZWRlZiBzcGlubG9ja190CQkJTkRJU19TUElOX0xPQ0s7Ci0KLS8vCi0vLyAgc3Bpbl9sb2NrIGVuaGFuY2VkIGZvciBOZXN0ZWQgc3BpbiBsb2NrCi0vLwotI2RlZmluZSBOZGlzQWxsb2NhdGVTcGluTG9jayhfX2xvY2spICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzcGluX2xvY2tfaW5pdCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTmRpc0ZyZWVTcGluTG9jayhsb2NrKSAgICAgICAgICBcCi0JZG97fXdoaWxlKDApCi0KLQotI2RlZmluZSBSVE1QX1NFTV9MT0NLKF9fbG9jaykJCQkJCVwKLXsJCQkJCQkJCQkJCQlcCi0Jc3Bpbl9sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJXAotfQotCi0jZGVmaW5lIFJUTVBfU0VNX1VOTE9DSyhfX2xvY2spCQkJCQlcCi17CQkJCQkJCQkJCQkJXAotCXNwaW5fdW5sb2NrX2JoKChzcGlubG9ja190ICopKF9fbG9jaykpOwkJXAotfQotCi0KLS8vIHNhbXBsZSwgdXNlIHNlbWFwaG9yZSBsb2NrIHRvIHJlcGxhY2UgSVJRIGxvY2ssIDIwMDcvMTEvMTUKLSNkZWZpbmUgUlRNUF9JUlFfTE9DSyhfX2xvY2ssIF9faXJxZmxhZ3MpCQkJXAotewkJCQkJCQkJCQkJCQlcCi0JX19pcnFmbGFncyA9IDA7CQkJCQkJCQkJXAotCXNwaW5fbG9ja19iaCgoc3BpbmxvY2tfdCAqKShfX2xvY2spKTsJCQlcCi0JcEFkLT5pcnFfZGlzYWJsZWQgfD0gMTsgXAotfQotCi0jZGVmaW5lIFJUTVBfSVJRX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCi17CQkJCQkJCQkJCQkJCVwKLQlwQWQtPmlycV9kaXNhYmxlZCAmPSAwOwkJCQkJCQlcCi0Jc3Bpbl91bmxvY2tfYmgoKHNwaW5sb2NrX3QgKikoX19sb2NrKSk7CQkJXAotfQotCi0jZGVmaW5lIFJUTVBfSU5UX0xPQ0soX19sb2NrLCBfX2lycWZsYWdzKQkJCVwKLXsJCQkJCQkJCQkJCQkJXAotCXNwaW5fbG9ja19pcnFzYXZlKChzcGlubG9ja190ICopX19sb2NrLCBfX2lycWZsYWdzKTsJXAotfQotCi0jZGVmaW5lIFJUTVBfSU5UX1VOTE9DSyhfX2xvY2ssIF9faXJxZmxhZykJCQlcCi17CQkJCQkJCQkJCQkJCVwKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopKF9fbG9jayksICgodW5zaWduZWQgbG9uZylfX2lycWZsYWcpKTsJXAotfQotCi0jZGVmaW5lIE5kaXNBY3F1aXJlU3BpbkxvY2sJCVJUTVBfU0VNX0xPQ0sKLSNkZWZpbmUgTmRpc1JlbGVhc2VTcGluTG9jawkJUlRNUF9TRU1fVU5MT0NLCi0KLSNpZm5kZWYgd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQKLSNkZWZpbmUgX193YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgY29uZGl0aW9uLCByZXQpIFwKLWRvIHsgXAotICAgICAgICB3YWl0X3F1ZXVlX3QgX193YWl0OyBcCi0gICAgICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZfX3dhaXQsIGN1cnJlbnQpOyBcCi0gICAgICAgIGFkZF93YWl0X3F1ZXVlKCZ3cSwgJl9fd2FpdCk7IFwKLSAgICAgICAgZm9yICg7OykgeyBcCi0gICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsgXAotICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBzY2hlZHVsZV90aW1lb3V0KHJldCk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgXAotICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgIHJldCA9IC1FUkVTVEFSVFNZUzsgXAotICAgICAgICAgICAgICAgIGJyZWFrOyBcCi0gICAgICAgIH0gXAotICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsgXAotICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOyBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCBjb25kaXRpb24sIHRpbWVvdXQpIFwKLSh7IFwKLSAgICAgICAgbG9uZyBfX3JldCA9IHRpbWVvdXQ7IFwKLSAgICAgICAgaWYgKCEoY29uZGl0aW9uKSkgXAotICAgICAgICAgICAgICAgIF9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIGNvbmRpdGlvbiwgX19yZXQpOyBcCi0gICAgICAgIF9fcmV0OyBcCi19KQotI2VuZGlmCi0KLSNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfSU5JVF9MT0NLRUQoX3BTZW1hKQlzZW1hX2luaXQoKF9wU2VtYSksIDApCi0jZGVmaW5lIFJUTVBfU0VNX0VWRU5UX0lOSVQoX3BTZW1hKQkJCXNlbWFfaW5pdCgoX3BTZW1hKSwgMSkKLSNkZWZpbmUgUlRNUF9TRU1fRVZFTlRfV0FJVChfcFNlbWEsIF9zdGF0dXMpCSgoX3N0YXR1cykgPSBkb3duX2ludGVycnVwdGlibGUoKF9wU2VtYSkpKQotI2RlZmluZSBSVE1QX1NFTV9FVkVOVF9VUChfcFNlbWEpCQkJdXAoX3BTZW1hKQotCi0jaWZkZWYgS1RIUkVBRF9TVVBQT1JUCi0jZGVmaW5lIFJUTVBfV0FJVF9FVkVOVF9JTlRFUlJVUFRJQkxFKF9wQWQsIF9wVGFzaykgXAoteyBcCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShfcFRhc2stPmt0aHJlYWRfcSwgXAotCQkJCQkJCQkgX3BUYXNrLT5rdGhyZWFkX3J1bm5pbmcgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpKTsgXAotCQlfcFRhc2stPmt0aHJlYWRfcnVubmluZyA9IEZBTFNFOyBcCi0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIFwKLQkJeyBcCi0JCQlSVE1QX1NFVF9GTEFHKF9wQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7IFwKLQkJCWJyZWFrOyBcCi0JCX0gXAotfQotI2VuZGlmCi0KLSNpZmRlZiBLVEhSRUFEX1NVUFBPUlQKLSNkZWZpbmUgV0FLRV9VUChfcFRhc2spIFwKLQlkb3sgXAotCQlpZiAoKF9wVGFzayktPmt0aHJlYWRfdGFzaykgXAotICAgICAgICB7IFwKLQkJCShfcFRhc2spLT5rdGhyZWFkX3J1bm5pbmcgPSBUUlVFOyBcCi0JICAgICAgICB3YWtlX3VwKCYoX3BUYXNrKS0+a3RocmVhZF9xKTsgXAotCQl9IFwKLQl9d2hpbGUoMCkKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU9TIE1lbW9yeSBBY2Nlc3MgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTUVNX0FMTE9DX0ZMQUcgICAgICAoR0ZQX0FUT01JQykgLy8oR0ZQX0RNQSB8IEdGUF9BVE9NSUMpCi0KLSNkZWZpbmUgTmRpc01vdmVNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1tb3ZlKERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkKLSNkZWZpbmUgTmRpc0NvcHlNZW1vcnkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKSBtZW1jcHkoRGVzdGluYXRpb24sIFNvdXJjZSwgTGVuZ3RoKQotI2RlZmluZSBOZGlzWmVyb01lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoKSAgICAgICAgIG1lbXNldChEZXN0aW5hdGlvbiwgMCwgTGVuZ3RoKQotI2RlZmluZSBOZGlzRmlsbE1lbW9yeShEZXN0aW5hdGlvbiwgTGVuZ3RoLCBGaWxsKSAgIG1lbXNldChEZXN0aW5hdGlvbiwgRmlsbCwgTGVuZ3RoKQotI2RlZmluZSBOZGlzQ21wTWVtb3J5KERlc3RpbmF0aW9uLCBTb3VyY2UsIExlbmd0aCkgIG1lbWNtcChEZXN0aW5hdGlvbiwgU291cmNlLCBMZW5ndGgpCi0jZGVmaW5lIE5kaXNFcXVhbE1lbW9yeShTb3VyY2UxLCBTb3VyY2UyLCBMZW5ndGgpICAgKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKLSNkZWZpbmUgUlRNUEVxdWFsTWVtb3J5KFNvdXJjZTEsIFNvdXJjZTIsIExlbmd0aCkJKCFtZW1jbXAoU291cmNlMSwgU291cmNlMiwgTGVuZ3RoKSkKLQotI2RlZmluZSBNbG1lQWxsb2NhdGVNZW1vcnkoX3BBZCwgX3BwVkEpCQlvc19hbGxvY19tZW0oX3BBZCwgX3BwVkEsIE1HTVRfRE1BX0JVRkZFUl9TSVpFKQotI2RlZmluZSBNbG1lRnJlZU1lbW9yeShfcEFkLCBfcFZBKQkJCW9zX2ZyZWVfbWVtKF9wQWQsIF9wVkEpCi0KLSNkZWZpbmUgQ09QWV9NQUNfQUREUihBZGRyMSwgQWRkcjIpICAgICAgICAgICAgIG1lbWNweSgoQWRkcjEpLCAoQWRkcjIpLCBNQUNfQUREUl9MRU4pCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyB0YXNrIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmUgYW5kIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJUTVBfT1NfTUdNVF9UQVNLX0ZMQUdTCUNMT05FX1ZNCi0KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQotdHlwZWRlZglzdHJ1Y3QgcGlkICoJVEhSRUFEX1BJRDsKLSNkZWZpbmUJVEhSRUFEX1BJRF9JTklUX1ZBTFVFCU5VTEwKLSNkZWZpbmUJR0VUX1BJRChfdikJZmluZF9nZXRfcGlkKChfdikpCi0jZGVmaW5lCUdFVF9QSURfTlVNQkVSKF92KQlwaWRfbnIoKF92KSkKLSNkZWZpbmUgQ0hFQ0tfUElEX0xFR0FMSVRZKF9waWQpCWlmIChwaWRfbnIoKF9waWQpKSA+PSAwKQotI2RlZmluZSBLSUxMX1RIUkVBRF9QSUQoX0EsIF9CLCBfQykJa2lsbF9waWQoKF9BKSwgKF9CKSwgKF9DKSkKLSNlbHNlCi10eXBlZGVmCXBpZF90CVRIUkVBRF9QSUQ7Ci0jZGVmaW5lCVRIUkVBRF9QSURfSU5JVF9WQUxVRQktMQotI2RlZmluZQlHRVRfUElEKF92KQkoX3YpCi0jZGVmaW5lCUdFVF9QSURfTlVNQkVSKF92KQkoX3YpCi0jZGVmaW5lIENIRUNLX1BJRF9MRUdBTElUWShfcGlkKQlpZiAoKF9waWQpID49IDApCi0jZGVmaW5lIEtJTExfVEhSRUFEX1BJRChfQSwgX0IsIF9DKQlraWxsX3Byb2MoKF9BKSwgKF9CKSwgKF9DKSkKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgUlRNUF9ORVRfVEFTS19TVFJVQ1Q7Ci10eXBlZGVmIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgKlBSVE1QX05FVF9UQVNLX1NUUlVDVDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRpbWVyIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBPU19IWgkJCUhaCi0KLXR5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJTkRJU19NSU5JUE9SVF9USU1FUjsKLXR5cGVkZWYgc3RydWN0IHRpbWVyX2xpc3QJUlRNUF9PU19USU1FUjsKLXR5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKLQotCi0jZGVmaW5lIE9TX1dBSVQoX3RpbWUpIFwKLXsJaW50IF9pOyBcCi0JbG9uZyBfbG9vcCA9ICgoX3RpbWUpLygxMDAwL09TX0haKSkgPiAwID8gKChfdGltZSkvKDEwMDAvT1NfSFopKSA6IDE7XAotCXdhaXRfcXVldWVfaGVhZF90IF93YWl0OyBcCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmX3dhaXQpOyBcCi0JZm9yIChfaT0wOyBfaTwoX2xvb3ApOyBfaSsrKSBcCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KF93YWl0LCAwLCBPTkVfVElDSyk7IH0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikJCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShiKSAtIChsb25nKShhKSA8IDApKQotCi0jZGVmaW5lIFJUTVBfVElNRV9BRlRFUl9FUShhLGIpCVwKLQkodHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWEpICYmIFwKLQkgdHlwZWNoZWNrKHVuc2lnbmVkIGxvbmcsICh1bnNpZ25lZCBsb25nKWIpICYmIFwKLQkgKChsb25nKShhKSAtIChsb25nKShiKSA+PSAwKSkKLSNkZWZpbmUgUlRNUF9USU1FX0JFRk9SRShhLGIpCVJUTVBfVElNRV9BRlRFUl9FUShiLGEpCi0jZWxzZQotI2RlZmluZSB0eXBlY2hlY2sodHlwZSx4KSBcCi0oeyAgICAgIHR5cGUgX19kdW1teTsgXAotICAgICAgICB0eXBlb2YoeCkgX19kdW1teTI7IFwKLSAgICAgICAgKHZvaWQpKCZfX2R1bW15ID09ICZfX2R1bW15Mik7IFwKLSAgICAgICAgMTsgXAotfSkKLSNkZWZpbmUgUlRNUF9USU1FX0FGVEVSX0VRKGEsYikJXAotCSh0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYSkgJiYgXAotCSB0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgKHVuc2lnbmVkIGxvbmcpYikgJiYgXAotCSAoKGxvbmcpKGEpIC0gKGxvbmcpKGIpID49IDApKQotI2RlZmluZSBSVE1QX1RJTUVfQkVGT1JFKGEsYikJUlRNUF9USU1FX0FGVEVSX0VRKGIsYSkKLSNkZWZpbmUgUlRNUF9USU1FX0FGVEVSKGEsYikgdGltZV9hZnRlcihhLCBiKQotI2VuZGlmCi0KLSNkZWZpbmUgT05FX1RJQ0sgMQotCi1zdGF0aWMgaW5saW5lIHZvaWQgTmRpc0dldFN5c3RlbVVwVGltZShVTE9ORyAqdGltZSkKLXsKLQkqdGltZSA9IGppZmZpZXM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBzcGVjaWZpYyBjb29raWUgZGF0YSBzdHJ1Y3R1cmUgYmluZGluZyB0byBSVE1QX0FEQVBURVIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IG9zX2Nvb2tpZSB7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0Jc3RydWN0IHBjaV9kZXYJCQkqcGNpX2RldjsKLQlzdHJ1Y3QgcGNpX2RldgkJCSpwYXJlbnRfcGNpX2RldjsKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBEZXZpY2VJRDsKLQlkbWFfYWRkcl90CQkJCXBBZF9wYTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0JUlRNUF9ORVRfVEFTS19TVFJVQ1QgcnhfZG9uZV90YXNrOwotCVJUTVBfTkVUX1RBU0tfU1RSVUNUIG1nbXRfZG1hX2RvbmVfdGFzazsKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBhYzBfZG1hX2RvbmVfdGFzazsKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBhYzFfZG1hX2RvbmVfdGFzazsKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBhYzJfZG1hX2RvbmVfdGFzazsKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBhYzNfZG1hX2RvbmVfdGFzazsKLQkvKlJUTVBfTkVUX1RBU0tfU1RSVUNUIGhjY2FfZG1hX2RvbmVfdGFzazsqLwotCVJUTVBfTkVUX1RBU0tfU1RSVUNUIHRidHRfdGFzazsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQlSVE1QX05FVF9UQVNLX1NUUlVDVCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2s7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0JdW5zaWduZWQgbG9uZwkJCWFwZF9waWQ7IC8vODAyLjF4IGRhZW1vbiBwaWQKLQlJTlQJCQkJCQlpb2N0bF9pZl90eXBlOwotCUlOVAkJCQkJaW9jdGxfaWY7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBvc19jb29raWUJKiBQT1NfQ09PS0lFOwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPUyBkZWJ1Z2dpbmcgYW5kIHByaW50aW5nIHJlbGF0ZWQgZGVmaW5pdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFBSSU5UX01BQyhhZGRyKQlcCi0JYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwgYWRkcls0XSwgYWRkcls1XQotCi0jaWZkZWYgREJHCi1leHRlcm4gVUxPTkcJCVJURGVidWdMZXZlbDsKLQotI2RlZmluZSBEQkdQUklOVF9SQVcoTGV2ZWwsIEZtdCkgICAgXAotZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKExldmVsIDw9IFJURGVidWdMZXZlbCkgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHByaW50ayBGbXQ7ICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfXdoaWxlKDApCi0KLSNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkgICAgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCi0KLQotI2RlZmluZSBEQkdQUklOVF9FUlIoRm10KSAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50aygiRVJST1IhISEgIik7ICAgICAgICAgIFwKLSAgICBwcmludGsgRm10OyAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBEQkdQUklOVF9TKFN0YXR1cywgRm10KQkJXAotewkJCQkJCQkJCVwKLQlwcmludGsgRm10OwkJCQkJXAotfQotI2Vsc2UKLSNkZWZpbmUgREJHUFJJTlQoTGV2ZWwsIEZtdCkKLSNkZWZpbmUgREJHUFJJTlRfUkFXKExldmVsLCBGbXQpCi0jZGVmaW5lIERCR1BSSU5UX1MoU3RhdHVzLCBGbXQpCi0jZGVmaW5lIERCR1BSSU5UX0VSUihGbXQpCi0jZW5kaWYKLQotI3VuZGVmICBBU1NFUlQKLSNkZWZpbmUgQVNTRVJUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIF9fRklMRV9fICI6JWQgYXNzZXJ0ICIgI3ggImZhaWxlZFxuIiwgX19MSU5FX18pOyAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotdm9pZCBoZXhfZHVtcChjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnBTcmNCdWZWQSwgdW5zaWduZWQgaW50IFNyY0J1Zkxlbik7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCVRoZSBmb2xsb3dpbmcgY29kZSBhcmUgbm90IHJldmlzZWQsIHRlbXBvcmFyeSBwdXQgaXQgaGVyZS4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGV2aWNlIERNQSBBY2Nlc3MgcmVsYXRlZCBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1kbWFfYWRkcl90IGxpbnV4X3BjaV9tYXBfc2luZ2xlKHZvaWQgKmhhbmRsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IHNkX2lkeCwgaW50IGRpcmVjdGlvbik7Ci12b2lkIGxpbnV4X3BjaV91bm1hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7Ci0KLSNkZWZpbmUgUENJX01BUF9TSU5HTEUoX2hhbmRsZSwgX3B0ciwgX3NpemUsIF9zZF9pZHgsIF9kaXIpIFwKLQlsaW51eF9wY2lfbWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX3NkX2lkeCwgX2RpcikKLQotI2RlZmluZSBQQ0lfVU5NQVBfU0lOR0xFKF9oYW5kbGUsIF9wdHIsIF9zaXplLCBfZGlyKSBcCi0JbGludXhfcGNpX3VubWFwX3NpbmdsZShfaGFuZGxlLCBfcHRyLCBfc2l6ZSwgX2RpcikKLQotI2RlZmluZSBQQ0lfQUxMT0NfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF9wdHIpIFwKLQlwY2lfYWxsb2NfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF9wdHIpCi0KLSNkZWZpbmUgUENJX0ZSRUVfQ09OU0lTVEVOVChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKSBcCi0JcGNpX2ZyZWVfY29uc2lzdGVudChfcGNpX2RldiwgX3NpemUsIF92aXJ0dWFsX2FkZHIsIF9waHlzaWNhbF9hZGRyKQotCi0jZGVmaW5lIERFVl9BTExPQ19TS0IoX2xlbmd0aCkgXAotCWRldl9hbGxvY19za2IoX2xlbmd0aCkKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLS8qCi0gKiBVTE9ORwotICogUlRNUF9HZXRQaHlzaWNhbEFkZHJlc3NMb3coCi0gKiAgIElOIE5ESVNfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxBZGRyZXNzKTsKLSAqLwotI2RlZmluZSBSVE1QX0dldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MpCQkoUGh5c2ljYWxBZGRyZXNzKQotCi0vKgotICogVUxPTkcKLSAqIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MpOwotICovCi0jZGVmaW5lIFJUTVBfR2V0UGh5c2ljYWxBZGRyZXNzSGlnaChQaHlzaWNhbEFkZHJlc3MpCQkoMCkKLQotLyoKLSAqIFZPSUQKLSAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzTG93KAotICogICBJTiBORElTX1BIWVNJQ0FMX0FERFJFU1MgIFBoeXNpY2FsQWRkcmVzcywKLSAqICAgSU4gVUxPTkcgIFZhbHVlKTsKLSAqLwotI2RlZmluZSBSVE1QX1NldFBoeXNpY2FsQWRkcmVzc0xvdyhQaHlzaWNhbEFkZHJlc3MsIFZhbHVlKQlcCi0JCQlQaHlzaWNhbEFkZHJlc3MgPSBWYWx1ZTsKLQotLyoKLSAqIFZPSUQKLSAqIFJUTVBfU2V0UGh5c2ljYWxBZGRyZXNzSGlnaCgKLSAqICAgSU4gTkRJU19QSFlTSUNBTF9BRERSRVNTICBQaHlzaWNhbEFkZHJlc3MsCi0gKiAgIElOIFVMT05HICBWYWx1ZSk7Ci0gKi8KLSNkZWZpbmUgUlRNUF9TZXRQaHlzaWNhbEFkZHJlc3NIaWdoKFBoeXNpY2FsQWRkcmVzcywgVmFsdWUpCi0KLSNkZWZpbmUgTmRpc01JbmRpY2F0ZVN0YXR1cyhfdywgX3gsIF95LCBfeikKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGV2aWNlIFJlZ2lzdGVyIEkvTyBBY2Nlc3MgcmVsYXRlZCBkZWZpbml0aW9ucyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWYgZGVmaW5lZChJTkZfVFdJTlBBU1MpIHx8IGRlZmluZWQoSU5GX0RBTlVCRSkgfHwgZGVmaW5lZChJS0FOT1NfVlhfMVgwKQotLy9QYXRjaCBmb3IgQVNJQyB0dXJzdCByZWFkL3dyaXRlIGJ1ZywgbmVlZHMgdG8gcmVtb3ZlIGFmdGVyIG1ldGVsIGZpeAotI2RlZmluZSBSVE1QX0lPX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKLQkoKl9wViA9IFNXQVAzMigqKChVSU5UMzIgKikoX3BWKSkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQlcCi0JKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSkpOwkJXAotCSgqX3BWID0gcmVhZGIoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSkpOwkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JVUlOVDMyCV9WYWw7CQkJCQkJCQkJCQkJCVwKLQlfVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAotCV9WYWwgPSBTV0FQMzIoX1YpOwkJCQkJCQkJCQkJCVwKLQl3cml0ZWwoX1ZhbCwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAotCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJXAotCXdyaXRldyhTV0FQMTYoKF9WKSksIChQVVNIT1JUKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAotfQotI2Vsc2UKLS8vUGF0Y2ggZm9yIEFTSUMgdHVyc3QgcmVhZC93cml0ZSBidWcsIG5lZWRzIHRvIHJlbW92ZSBhZnRlciBtZXRlbCBmaXgKLSNkZWZpbmUgUlRNUF9JT19SRUFEMzIoX0EsIF9SLCBfcFYpCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCVwKLSAgICBpZiAoKF9BKS0+YlBDSWNsa09mZiA9PSBGQUxTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkJKCpfcFYgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZQkJCQkJCQkJCQkJCQkJCVwKLQkJKl9wViA9IDA7CQkJCQkJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1JFQUQzMihfQSwgX1IsIF9wVikJCQkJCQkJXAotewkJCQkJCQkJCQkJCQkJCQkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCVwKLQkoKl9wViA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgKF9SKSkpKTsJCQlcCi19Ci0KLSNkZWZpbmUgUlRNUF9JT19SRUFEOChfQSwgX1IsIF9wVikJCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJXAotCSgqX3BWID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpKTsJCQlcCi0JKCpfcFYgPSByZWFkYigodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKSk7CQkJCVwKLX0KLQotI2RlZmluZSBSVE1QX0lPX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0gICAgaWYgKChfQSktPmJQQ0ljbGtPZmYgPT0gRkFMU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCVVJTlQJVmFsOwkJCQkJCQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwkJCVwKLQl3cml0ZWwoKF9WKSwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJCQkJCQlcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSVE1QX0lPX0ZPUkNFX1dSSVRFMzIoX0EsIF9SLCBfVikJCQkJCQkJCQkJCQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQkJCQkJCVwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIE1BQ19DU1IwKSk7CQkJXAotCXdyaXRlbChfViwgKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyAoX1IpKSk7CQkJCQkJCQlcCi19Ci0KLQotCi0jaWYgZGVmaW5lZChCUkNNXzYzNTgpIHx8IGRlZmluZWQoUkFMSU5LXzI4ODApIHx8IGRlZmluZWQoUkFMSU5LXzMwNTIpCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgXAotCVVMT05HIFZhbDsgICAgICAgICAgICAgICAgXAotCVVDSEFSIF9pOyAgICAgICAgICAgICAgICBcCi0JX2kgPSAoKF9SKSAmIDB4Myk7ICAgICAgICAgICAgIFwKLQlWYWwgPSByZWFkbCgodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArICgoX1IpIC0gX2kpKSk7ICAgXAotCVZhbCA9IFZhbCAmICh+KDB4MDAwMDAwZmYgPDwgKChfaSkqOCkpKTsgICAgICAgICBcCi0JVmFsID0gVmFsIHwgKChVTE9ORykoX1YpIDw8ICgoX2kpKjgpKTsgICAgICAgICBcCi0Jd3JpdGVsKChWYWwpLCAodm9pZCAqKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArICgoX1IpIC0gX2kpKSk7ICAgIFwKLX0KLSNlbHNlCi0jZGVmaW5lIFJUTVBfSU9fV1JJVEU4KF9BLCBfUiwgX1YpCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQlcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQkJXAotCVZhbCA9IHJlYWRsKCh2b2lkICopKChfQSktPkNTUkJhc2VBZGRyZXNzICsgTUFDX0NTUjApKTsJXAotCXdyaXRlYigoX1YpLCAoUFVDSEFSKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJCVwKLX0KLSNlbmRpZiAvLyAjaWYgZGVmaW5lZChCUkNNXzYzNTgpIHx8IGRlZmluZWQoUkFMSU5LXzI4ODApIC8vCi0KLSNkZWZpbmUgUlRNUF9JT19XUklURTE2KF9BLCBfUiwgX1YpCQkJCQkJCVwKLXsJCQkJCQkJCQkJCQkJCQlcCi0JVUlOVAlWYWw7CQkJCQkJCQkJCQlcCi0JVmFsID0gcmVhZGwoKHZvaWQgKikoKF9BKS0+Q1NSQmFzZUFkZHJlc3MgKyBNQUNfQ1NSMCkpOwlcCi0Jd3JpdGV3KChfViksIChQVVNIT1JUKSgoX0EpLT5DU1JCYXNlQWRkcmVzcyArIChfUikpKTsJXAotfQotI2VuZGlmIC8vICNpZiBkZWZpbmVkKElORl9UV0lOUEFTUykgfHwgZGVmaW5lZChJTkZfREFOVUJFKSB8fCBkZWZpbmVkKElLQU5PU19WWF8xWDApIC8vCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU5ldHdvcmsgUmVsYXRlZCBkYXRhIHN0cnVjdHVyZSBhbmQgbWFyY28gZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgUEtUU1JDX05ESVMgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBQS1RTUkNfRFJJVkVSICAgICAgICAgICAweDBmCi0KLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyOSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfU0VUX1BSSVYoX3BOZXREZXYsIF9wUHJpdikJKChfcE5ldERldiktPnByaXYgPSAoX3BQcml2KSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoX3BOZXREZXYpCQkoKF9wTmV0RGV2KS0+cHJpdikKLSNlbHNlCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NFVF9QUklWKF9wTmV0RGV2LCBfcFByaXYpCSgoX3BOZXREZXYpLT5tbF9wcml2ID0gKF9wUHJpdikpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKF9wTmV0RGV2KQkJKChfcE5ldERldiktPm1sX3ByaXYpCi0jZW5kaWYKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfR0VUX0RFVk5BTUUoX3BOZXREZXYpCSgoX3BOZXREZXYpLT5uYW1lKQotI2RlZmluZSBSVE1QX09TX05FVERFVl9HRVRfUEhZQUREUihfUE5FVERFVikJKChfUE5FVERFViktPmRldl9hZGRyKQotCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX1NUQVJUX1FVRVVFKF9wTmV0RGV2KQluZXRpZl9zdGFydF9xdWV1ZSgoX3BOZXREZXYpKQotI2RlZmluZSBSVE1QX09TX05FVERFVl9TVE9QX1FVRVVFKF9wTmV0RGV2KQluZXRpZl9zdG9wX3F1ZXVlKChfcE5ldERldikpCi0jZGVmaW5lIFJUTVBfT1NfTkVUREVWX1dBS0VfUVVFVUUoX3BOZXREZXYpCW5ldGlmX3dha2VfcXVldWUoKF9wTmV0RGV2KSkKLSNkZWZpbmUgUlRNUF9PU19ORVRERVZfQ0FSUklFUl9PRkYoX3BOZXREZXYpCW5ldGlmX2NhcnJpZXJfb2ZmKChfcE5ldERldikpCi0KLSNkZWZpbmUgUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBFbnRyeSkgXAotCShQTkRJU19QQUNLRVQpKHBFbnRyeSkKLQotI2RlZmluZSBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkgXAotCShQUVVFVUVfRU5UUlkpKHBQYWNrZXQpCi0KLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLSNkZWZpbmUgQlJJREdFX1RBRyAweDM1NTY0MjUyICAgIC8vIGRlcGVuZHMgb24gNVZUIGRlZmluZSBpbiBicl9pbnB1dC5jCi0jZW5kaWYKLQotI2RlZmluZSBHRVRfU0dfTElTVF9GUk9NX1BBQ0tFVChfcCwgX3NjKQlcCi0gICAgcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoX3AsIF9zYykKLQotI2RlZmluZSBSRUxFQVNFX05ESVNfUEFDS0VUKF9wQWQsIF9wUGFja2V0LCBfU3RhdHVzKSAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBSVE1QRnJlZU5kaXNQYWNrZXQoX3BBZCwgX3BQYWNrZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKgotICogcGFja2V0IGhlbHBlcgotICoJLSBjb252ZXJ0IGludGVybmFsIHJ0IHBhY2tldCB0byBvcyBwYWNrZXQgb3IKLSAqICAgICAgICAgICAgIG9zIHBhY2tldCB0byBydCBwYWNrZXQKLSAqLwotI2RlZmluZSBSVFBLVF9UT19PU1BLVChfcCkJCSgoc3RydWN0IHNrX2J1ZmYgKikoX3ApKQotI2RlZmluZSBPU1BLVF9UT19SVFBLVChfcCkJCSgoUE5ESVNfUEFDS0VUKShfcCkpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9EQVRBUFRSKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKQotI2RlZmluZSBTRVRfT1NfUEtUX0RBVEFQVFIoX3BrdCwgX2RhdGFQdHIpCVwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kYXRhKSA9IChfZGF0YVB0cikKLQotI2RlZmluZSBHRVRfT1NfUEtUX0xFTihfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKQotI2RlZmluZSBTRVRfT1NfUEtUX0xFTihfcGt0LCBfbGVuKQlcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+bGVuKSA9IChfbGVuKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfREFUQVRBSUwoX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCktPnRhaWwpCi0jZGVmaW5lIFNFVF9PU19QS1RfREFUQVRBSUwoX3BrdCwgX3N0YXJ0LCBfbGVuKQlcCi0JCSgoUlRQS1RfVE9fT1NQS1QoX3BrdCkpLT50YWlsKSA9IChQVUNIQVIpKChfc3RhcnQpICsgKF9sZW4pKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfSEVBRChfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+aGVhZCkKLQotI2RlZmluZSBHRVRfT1NfUEtUX0VORChfcGt0KSBcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZW5kKQotCi0jZGVmaW5lIEdFVF9PU19QS1RfTkVUREVWKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5kZXYpCi0jZGVmaW5lIFNFVF9PU19QS1RfTkVUREVWKF9wa3QsIF9wTmV0RGV2KQlcCi0JCShSVFBLVF9UT19PU1BLVChfcGt0KS0+ZGV2KSA9IChfcE5ldERldikKLQotI2RlZmluZSBHRVRfT1NfUEtUX1RZUEUoX3BrdCkgXAotCQkoUlRQS1RfVE9fT1NQS1QoX3BrdCkpCi0KLSNkZWZpbmUgR0VUX09TX1BLVF9ORVhUKF9wa3QpIFwKLQkJKFJUUEtUX1RPX09TUEtUKF9wa3QpLT5uZXh0KQotCi0KLSNkZWZpbmUgT1NfUEtUX0NMT05FRChfcGt0KQkJc2tiX2Nsb25lZChSVFBLVF9UT19PU1BLVChfcGt0KSkKLQotI2RlZmluZSBPU19OVE9IUyhfVmFsKSBcCi0JCShudG9ocyhfVmFsKSkKLSNkZWZpbmUgT1NfSFRPTlMoX1ZhbCkgXAotCQkoaHRvbnMoX1ZhbCkpCi0jZGVmaW5lIE9TX05UT0hMKF9WYWwpIFwKLQkJKG50b2hsKF9WYWwpKQotI2RlZmluZSBPU19IVE9OTChfVmFsKSBcCi0JCShodG9ubChfVmFsKSkKLQotI2RlZmluZSBDQl9PRkYgIDEwCi0KLS8vIFVzZXIgUHJpb3JpdHkKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1VQKF9wLCBfcHJpbykJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMF0gPSBfcHJpbykKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1VQKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzBdKQotCi0vLyBGcmFnbWVudCAjCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9GUkFHTUVOVFMoX3AsIF9udW0pCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMV0gPSBfbnVtKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRlJBR01FTlRTKF9wKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxXSkKLQotLy8gMHgwIH4weDdmOiBUWCB0byBBUCdzIG93biBCU1Mgd2hpY2ggaGFzIHRoZSBzcGVjaWZpZWQgQUlELiBpZiBBSUQ+MTI3LCBzZXQgYml0IDcgaW4gUlRNUF9TRVRfUEFDS0VUX0VNQUNUQUIgdG9vLgotLy8odGhpcyB2YWx1ZSBhbHNvIGFzIE1BQyhvbi1jaGlwIFdDSUQpIHRhYmxlIGluZGV4KQotLy8gMHg4MH4weGZmOiBUWCB0byBhIFdEUyBsaW5rLiBiMH42OiBXRFMgaW5kZXgKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1dDSUQoX3AsIF93ZHNpZHgpCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMl0gPSBfd2RzaWR4KQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfV0NJRChfcCkJCQkoKFVDSEFSKShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisyXSkpCi0KLS8vIDB4ZmY6IFBLVFNSQ19ORElTLCBvdGhlcnM6IGxvY2FsIFRYIGJ1ZmZlciBpbmRleC4gVGhpcyB2YWx1ZSBhZmZlY3RzIGhvdyB0byBhIHBhY2tldAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfU09VUkNFKF9wLCBfcGt0c3JjKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzNdID0gX3BrdHNyYykKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1NPVVJDRShfcCkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrM10pCi0KLS8vIFJUUy9DVFMtdG8tc2VsZiBwcm90ZWN0aW9uIG1ldGhvZAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfUlRTKF9wLCBfbnVtKQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSA9IF9udW0pCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9SVFMoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis0XSkKLS8vIHNlZSBSVE1QX1MoRylFVF9QQUNLRVRfRU1BQ1RBQgotCi0vLyBUWCByYXRlIGluZGV4Ci0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9UWFJBVEUoX3AsIF9yYXRlKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzVdID0gX3JhdGUpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9UWFJBVEUoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis1XSkKLQotLy8gRnJvbSB3aGljaCBJbnRlcmZhY2UKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0lGKF9wLCBfaWZkeCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSA9IF9pZmR4KQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSUYoX3ApCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRis2XSkKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUJTU0lEKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksIChfYnNzKSkKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfV0RTKF9wLCBfYnNzKQkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2JzcykgKyBNSU5fTkVUX0RFVklDRV9GT1JfV0RTKSkKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfQVBDTEkoX3AsIF9pZHgpCVJUTVBfU0VUX1BBQ0tFVF9JRigoX3ApLCAoKF9pZHgpICsgTUlOX05FVF9ERVZJQ0VfRk9SX0FQQ0xJKSkKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05FVF9ERVZJQ0VfTUVTSChfcCwgX2lkeCkJUlRNUF9TRVRfUEFDS0VUX0lGKChfcCksICgoX2lkeCkgKyBNSU5fTkVUX0RFVklDRV9GT1JfTUVTSCkpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChfcCkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX05FVF9ERVZJQ0UoX3ApCQkJCQlSVE1QX0dFVF9QQUNLRVRfSUYoKF9wKSkKLQotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfTU9SRURBVEEoX3AsIF9tb3JlYml0KQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddID0gX21vcmViaXQpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9NT1JFREFUQShfcCkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzddKQotCi0KLQotCi0KLS8vCi0vLwlTZXBjaWZpYyBQYWtjZXQgVHlwZSBkZWZpbml0aW9uCi0vLwotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19DQl9PRkZTRVQJMTEKLQotI2RlZmluZSBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQCQkweDAxCi0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MCQkweDAyCi0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQJCTB4MDQKLSNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfV0FJCQkweDA4Ci0jZGVmaW5lIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4JCTB4MTAKLSNkZWZpbmUgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUAkweDIwCi0KLS8vU3BlY2lmaWMKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX1NQRUNJRklDKF9wLCBfZmxnKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSA9IF9mbGcpCi0KLS8vREhDUAotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfREhDUChfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCk7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19ESENQKTsJXAotCQkJfXdoaWxlKDApCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9ESENQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0RIQ1ApCi0KLS8vRUFQT0wKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0VBUE9MKF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAotCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19FQVBPTCk7CVwKLQkJCX13aGlsZSgwKQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfRUFQT0woX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfRUFQT0wpCi0KLS8vV0FJCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9XQUkoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCQlcCi0JCQlkb3sJCQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQlpZiAoX2ZsZykJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgfD0gKFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSk7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpOwlcCi0JCQl9d2hpbGUoMCkKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX1dBSShfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19XQUkpCi0KLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0xPV1JBVEUoX3ApCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdICYgKFJUTVBfUEFDS0VUX1NQRUNJRklDX0VBUE9MIHwgUlRNUF9QQUNLRVRfU1BFQ0lGSUNfREhDUCB8IFJUTVBfUEFDS0VUX1NQRUNJRklDX1dBSSkpCi0KLS8vVkxBTgotI2RlZmluZSBSVE1QX1NFVF9QQUNLRVRfVkxBTihfcCwgX2ZsZykJCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfVkxBTik7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19WTEFOKTsJXAotCQkJfXdoaWxlKDApCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9WTEFOKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX1ZMQU4pCi0KLS8vTExDL1NOQVAKLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0xMQ1NOQVAoX3AsIF9mbGcpCQkJCQkJCQkJCQkJCVwKLQkJCWRvewkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCWlmIChfZmxnKQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSB8PSAoUlRNUF9QQUNLRVRfU1BFQ0lGSUNfTExDU05BUCk7CQlcCi0JCQkJZWxzZQkJCQkJCQkJCQkJCQkJCQkJCVwKLQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSkgJj0gKCFSVE1QX1BBQ0tFVF9TUEVDSUZJQ19MTENTTkFQKTsJCVwKLQkJCX13aGlsZSgwKQotCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF9MTENTTkFQKF9wKQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzExXSAmIFJUTVBfUEFDS0VUX1NQRUNJRklDX0xMQ1NOQVApCi0KLS8vIElQCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF9JUFY0KF9wLCBfZmxnKQkJCQkJCQkJCQkJCQkJXAotCQkJZG97CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJaWYgKF9mbGcpCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0pIHw9IChSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KTsJCVwKLQkJCQllbHNlCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJCQkoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTFdKSAmPSAoIVJUTVBfUEFDS0VUX1NQRUNJRklDX0lQVjQpOwlcCi0JCQl9d2hpbGUoMCkKLQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfSVBWNChfcCkJCShSVFBLVF9UT19PU1BLVChfcCktPmNiW0NCX09GRisxMV0gJiBSVE1QX1BBQ0tFVF9TUEVDSUZJQ19JUFY0KQotCi0KLS8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHRoaXMgRUFQb0wgZnJhbWUgTVVTVCBiZSBjbGVhci4KLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCwgX2ZsZykgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdID0gX2ZsZykKLSNkZWZpbmUgUlRNUF9HRVRfUEFDS0VUX0NMRUFSX0VBUF9GUkFNRShfcCkgICAgICAgICAoUlRQS1RfVE9fT1NQS1QoX3ApLT5jYltDQl9PRkYrMTJdKQotCi0KLQotLyogdXNlIGJpdDMgb2YgY2JbQ0JfT0ZGKzE2XSAqLwotCi0jZGVmaW5lIFJUTVBfU0VUX1BBQ0tFVF81VlQoX3AsIF9mbGcpICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSA9IF9mbGcpCi0jZGVmaW5lIFJUTVBfR0VUX1BBQ0tFVF81VlQoX3ApICAgICAgICAgKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzIyXSkKLQotI2lmZGVmIElORl9BTUFaT05fU0UKLS8qIFtDQl9PRkYrMjhdLCAxQiwgSXZlcnNvbiBwYXRjaCBmb3IgV01NIEE1LVQwNyAsV2lyZWxlc3NTdGFUb1dpcmVsZXNzU3RhIGRvIG5vdCBidWxrIG91dCBhZ2dyZWdhdGUgKi8KLSNkZWZpbmUgUlRNUF9TRVRfUEFDS0VUX05PQlVMS09VVChfcCwgX21vcmViaXQpCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzI4XSA9IF9tb3JlYml0KQotI2RlZmluZSBSVE1QX0dFVF9QQUNLRVRfTk9CVUxLT1VUKF9wKQkJCQkJKFJUUEtUX1RPX09TUEtUKF9wKS0+Y2JbQ0JfT0ZGKzI4XSkKLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1NFIC8vCi0vKiBNYXggc2tiLT5jYiA9IDQ4QiA9IFtDQl9PRkYrMzhdICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCU90aGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgZGVmaW5pdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUlRNUF9HZXRDdXJyZW50U3lzdGVtVGltZShMQVJHRV9JTlRFR0VSICp0aW1lKTsKLWludCBydDI4eHhfcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLQotdm9pZCBGbGFzaFdyaXRlKFVDSEFSICogcCwgVUxPTkcgYSwgVUxPTkcgYik7Ci12b2lkIEZsYXNoUmVhZChVQ0hBUiAqIHAsIFVMT05HIGEsIFVMT05HIGIpOwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IDB4MjA0MDIJLy8gUmVkIEhhdCA3LjEKLXN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19uZXRkZXYoaW50IHNpemVvZl9wcml2LCBjb25zdCBjaGFyICptYXNrLCB2b2lkICgqc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKLSNlbmRpZiAvLyBMSU5VWF9WRVJTSU9OX0NPREUgLy8KLQotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0vKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0jZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgaXJxcmV0dXJuX3QKLSNlbHNlCi0jZGVmaW5lIElSUV9IQU5ETEVfVFlQRSAgdm9pZAotI2VuZGlmCi0KLUlSUV9IQU5ETEVfVFlQRQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKLXJ0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKLSNlbHNlCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotI2VuZGlmCi0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotSU5UIHJ0Mjh4eF9pb2N0bCgKLQlJTglQTkVUX0RFVgkJbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQljbWQpOwotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLUlOVCBydDI4eHhfc3RhX2lvY3RsKAotCUlOCVBORVRfREVWCQluZXRfZGV2LAotCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAotCUlOCUlOVAkJCWNtZCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLWV4dGVybiBpbnQgcmFfbXRkX3dyaXRlKGludCBudW0sIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgY29uc3QgdV9jaGFyICpidWYpOwotZXh0ZXJuIGludCByYV9tdGRfcmVhZChpbnQgbnVtLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgdV9jaGFyICpidWYpOwotCi0jZW5kaWYgLy8gX19SVF9MSU5VWF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbWFpbl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRfbWFpbl9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwN2E1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X21haW5fZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBydF9tYWluX2Rldi5jCi0KLSAgICBBYnN0cmFjdDoKLSAgICBDcmVhdGUgYW5kIHJlZ2lzdGVyIG5ldHdvcmsgaW50ZXJmYWNlLgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgICAgV2hhdAotICAgIC0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAicnRfY29uZmlnLmgiCi0KLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi1VSU5UMzIgQ1dfTUFYX0lOX0JJVFM7Ci0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogUHJpdmF0ZSBWYXJpYWJsZXMgVXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1QU1RSSU5HIG1hYyA9ICIiOwkJICAgLy8gZGVmYXVsdCAwMDowMDowMDowMDowMDowMAotUFNUUklORyBob3N0bmFtZSA9ICIiOwkJICAgLy8gZGVmYXVsdCBDTVBDCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtFUk5FTF9WRVJTSU9OKDIsNiwxMikKLU1PRFVMRV9QQVJNIChtYWMsICJzIik7Ci0jZWxzZQotbW9kdWxlX3BhcmFtIChtYWMsIGNoYXJwLCAwKTsKLSNlbmRpZgotTU9EVUxFX1BBUk1fREVTQyAobWFjLCAicnQyOHh4OiB3aXJlbGVzcyBtYWMgYWRkciIpOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFByb3RvdHlwZXMgb2YgRnVuY3Rpb25zIFVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLy8gcHVibGljIGZ1bmN0aW9uIHByb3RvdHlwZQotaW50IHJ0Mjh4eF9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7Ci1pbnQgcnQyOHh4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotCi0vLyBwcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZQotc3RhdGljIElOVCBydDI4eHhfc2VuZF9wYWNrZXRzKElOIHN0cnVjdCBza19idWZmICpza2JfcCwgSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKLSAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOwotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENsb3NlIHJheHggaW50ZXJmYWNlLgotCi1Bcmd1bWVudHM6Ci0JKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJT3BlbiBPSwotCW90aGVyd2lzZQkJCU9wZW4gRmFpbAotCi1Ob3RlOgotCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgotCTIuIEZyZWUgbWVtb3J5IGZvcgotCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKLQkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKLQkJKDMpIEJBIFJlb3JkZXJpbmc6CQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1pbnQgTWFpblZpcnR1YWxJRl9jbG9zZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLSAgICBSVE1QX0FEQVBURVIgKnBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCi0JLy8gU2FuaXR5IGNoZWNrIGZvciBwQWQKLQlpZiAocEFkID09IE5VTEwpCi0JCXJldHVybiAwOyAvLyBjbG9zZSBvawotCi0JbmV0aWZfY2Fycmllcl9vZmYocEFkLT5uZXRfZGV2KTsKLQluZXRpZl9zdG9wX3F1ZXVlKHBBZC0+bmV0X2Rldik7Ci0KLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJQk9PTEVBTgkJCUNhbmNlbGxlZDsKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UsCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJewotCQkJVUNIQVIgaTsKLQotCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQkJCXsKLQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQkJCXsKLQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCX0KLQkJCX0KLQkJCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0JCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQlpZiAoSU5GUkFfT04ocEFkKSAmJgotCQkJKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpKQotCQl7Ci0JCQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QJRGlzUmVxOwotCQkJTUxNRV9RVUVVRV9FTEVNICpNc2dFbGVtID0gKE1MTUVfUVVFVUVfRUxFTSAqKSBrbWFsbG9jKHNpemVvZihNTE1FX1FVRVVFX0VMRU0pLCBNRU1fQUxMT0NfRkxBRyk7Ci0KLQkJCWlmIChNc2dFbGVtKQotCQkJewotCQkJQ09QWV9NQUNfQUREUihEaXNSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJRGlzUmVxLlJlYXNvbiA9ICBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HOwotCi0JCQlNc2dFbGVtLT5NYWNoaW5lID0gQVNTT0NfU1RBVEVfTUFDSElORTsKLQkJCU1zZ0VsZW0tPk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQlNc2dFbGVtLT5Nc2dMZW4gPSBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KE1zZ0VsZW0tPk1zZywgJkRpc1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOwotCi0JCQkvLyBQcmV2ZW50IHRvIGNvbm5lY3QgQVAgYWdhaW4gaW4gU1RBTWxtZVBlcmlvZGljRXhlYwotCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7Ci0JCQlNbG1lRGlzYXNzb2NSZXFBY3Rpb24ocEFkLCBNc2dFbGVtKTsKLQkJCWtmcmVlKE1zZ0VsZW0pOwotCQkJfQotCi0JCQlSVE1QdXNlY0RlbGF5KDEwMDApOwotCQl9Ci0KLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5TdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lciwgJkNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXIsICZDYW5jZWxsZWQpOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50IGZvciBpbmZyb21pbmcgaW50ZXJmYWNlIGRvd24uCi0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfSU5URVJGQUNFX0RPV04sIE5VTEwsIE5VTEwsIDApOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlWSVJUVUFMX0lGX0RPV04ocEFkKTsKLQotCVJUX01PRF9ERUNfVVNFX0NPVU5UKCk7Ci0KLQlyZXR1cm4gMDsgLy8gY2xvc2Ugb2sKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUm91dGluZSBEZXNjcmlwdGlvbjoKLSAgICBPcGVuIHJheHggaW50ZXJmYWNlLgotCi1Bcmd1bWVudHM6Ci0JKm5ldF9kZXYJCQl0aGUgcmF4eCBpbnRlcmZhY2UgcG9pbnRlcgotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMAkJCQkJT3BlbiBPSwotCW90aGVyd2lzZQkJCU9wZW4gRmFpbAotCi1Ob3RlOgotCTEuIGlmIG9wZW4gZmFpbCwga2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGNsb3NlIGZ1bmN0aW9uLgotCTIuIEZyZWUgbWVtb3J5IGZvcgotCQkoMSkgTWxtZSBNZW1vcnkgSGFuZGxlcjoJCU1sbWVIYWx0KCkKLQkJKDIpIFRYICYgUlg6CQkJCQlSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KCkKLQkJKDMpIEJBIFJlb3JkZXJpbmc6CQkJCWJhX3Jlb3JkZXJpbmdfcmVzb3VyY2VfcmVsZWFzZSgpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1pbnQgTWFpblZpcnR1YWxJRl9vcGVuKElOIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQotewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0KLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAotCWlmIChwQWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi0KLQlpZiAoVklSVFVBTF9JRl9VUChwQWQpICE9IDApCi0JCXJldHVybiAtMTsKLQotCS8vIGluY3JlYXNlIE1PRFVMRSB1c2UgY291bnQKLQlSVF9NT0RfSU5DX1VTRV9DT1VOVCgpOwotCi0JbmV0aWZfc3RhcnRfcXVldWUobmV0X2Rldik7Ci0JbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQluZXRpZl93YWtlX3F1ZXVlKG5ldF9kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgQ2xvc2UgcmF4eCBpbnRlcmZhY2UuCi0KLUFyZ3VtZW50czoKLQkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICAwCQkJCQlPcGVuIE9LCi0Jb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCi0KLU5vdGU6Ci0JMS4gaWYgb3BlbiBmYWlsLCBrZXJuZWwgd2lsbCBub3QgY2FsbCB0aGUgY2xvc2UgZnVuY3Rpb24uCi0JMi4gRnJlZSBtZW1vcnkgZm9yCi0JCSgxKSBNbG1lIE1lbW9yeSBIYW5kbGVyOgkJTWxtZUhhbHQoKQotCQkoMikgVFggJiBSWDoJCQkJCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkoKQotCQkoMykgQkEgUmVvcmRlcmluZzoJCQkJYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKCkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLWludCBydDI4eHhfY2xvc2UoSU4gUE5FVF9ERVYgZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKLSAgICBSVE1QX0FEQVBURVIJKnBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCUJPT0xFQU4JCQlDYW5jZWxsZWQ7Ci0JVUlOVDMyCQkJaSA9IDA7Ci0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT4gcnQyOHh4X2Nsb3NlXG4iKSk7Ci0KLQlDYW5jZWxsZWQgPSBGQUxTRTsKLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAotCWlmIChwQWQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi0KLQotCi0jaWZkZWYgV0RTX1NVUFBPUlQKLQlXZHNEb3duKHBBZCk7Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlSVE1QUENJZUxpbmtDdHJsVmFsdWVSZXN0b3JlKHBBZCwgUkVTVE9SRV9DTE9TRSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJLy8gSWYgZGlydmVyIGRvZXNuJ3Qgd2FrZSB1cCBmaXJtd2FyZSBoZXJlLAotCQkvLyBOSUNMb2FkRmlybXdhcmUgd2lsbCBoYW5nIGZvcmV2ZXIgd2hlbiBpbnRlcmZhY2UgaXMgdXAgYWdhaW4uCi0JCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotICAgICAgICB7Ci0JCSAgICBBc2ljRm9yY2VXYWtldXAocEFkLCBUUlVFKTsKLSAgICAgICAgfQotCi0KLQkJTWxtZVJhZGlvT2ZmKHBBZCk7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCVJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpOwotCi0JZm9yIChpID0gMCA7IGkgPCBOVU1fT0ZfVFhfUklORzsgaSsrKQotCXsKLQkJd2hpbGUgKHBBZC0+RGVRdWV1ZVJ1bm5pbmdbaV0gPT0gVFJVRSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV2FpdGluZyBmb3IgVHhRdWV1ZVslZF0gZG9uZS4uLi4uLi4uLi5cbiIsIGkpKTsKLQkJCVJUTVB1c2VjRGVsYXkoMTAwMCk7Ci0JCX0KLQl9Ci0KLQotCi0JLy8gU3RvcCBNbG1lIHN0YXRlIG1hY2hpbmUKLQlNbG1lSGFsdChwQWQpOwotCi0JLy8gQ2xvc2UgbmV0IHRhc2tsZXRzCi0JUnRtcE5ldFRhc2tFeGl0KHBBZCk7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlNYWNUYWJsZVJlc2V0KHBBZCk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQlNZWFzdXJlUmVxVGFiRXhpdChwQWQpOwotCVRwY1JlcVRhYkV4aXQocEFkKTsKLQotCi0JLy8gQ2xvc2Uga2VybmVsIHRocmVhZHMKLQlSdG1wTWdtdFRhc2tFeGl0KHBBZCk7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQl7Ci0JCQlCT09MRUFOIGJyYzsKLQkJCS8vCVVMT05HCQkJVmFsdWU7Ci0KLQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSkpCi0JCQl7Ci0JCQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7Ci0JCQl9Ci0KLQkJCS8vIFJlY2VpdmUgcGFja2V0cyB0byBjbGVhciBETUEgaW5kZXggYWZ0ZXIgZGlzYWJsZSBpbnRlcnJ1cHQuCi0JCQkvL1JUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQocEFkKTsKLQkJCS8vIHB1dCB0byByYWRpbyBvZmYgdG8gc2F2ZSBwb3dlciB3aGVuIGRyaXZlciB1bmxvYWQuICBBZnRlciByYWRpb29mZiwgY2FuJ3Qgd3JpdGUgL3JlYWQgcmVnaXN0ZXIuICBTbyBuZWVkIHRvIGZpbmlzaCBhbGwKLQkJCS8vIHJlZ2lzdGVyIGFjY2VzcyBiZWZvcmUgUmFkaW8gb2ZmLgotCi0KLQkJCWJyYz1SVDI4eHhQY2lBc2ljUmFkaW9PZmYocEFkLCBSVE1QX0hBTFQsIDApOwotCi0vL0luICBzb2x1dGlvbiAzIG9mIDMwOTBGLCB0aGUgYlBDSWNsa09mZiB3aWxsIGJlIHNldCB0byBUUlVFIGFmdGVyIGNhbGxpbmcgUlQyOHh4UGNpQXNpY1JhZGlvT2ZmCi0JCQlwQWQtPmJQQ0ljbGtPZmYgPSBGQUxTRTsKLQotCQkJaWYgKGJyYz09RkFMU0UpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCIlcyBjYWxsIFJUMjh4eFBjaUFzaWNSYWRpb09mZiBmYWlsICEhXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCX0KLQl9Ci0KLQotLyoKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUpKQotCXsKLQkJUlRNUF9BU0lDX0lOVEVSUlVQVF9ESVNBQkxFKHBBZCk7Ci0JfQotCi0JLy8gRGlzYWJsZSBSeCwgcmVnaXN0ZXIgdmFsdWUgc3VwcG9zZWQgd2lsbCByZW1haW4gYWZ0ZXIgcmVzZXQKLQlOSUNJc3N1ZVJlc2V0KHBBZCk7Ci0qLwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JLy8gRnJlZSBJUlEKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJLy8gRGVyZWdpc3RlciBpbnRlcnJ1cHQgZnVuY3Rpb24KLQkJUlRNUF9JUlFfUkVMRUFTRShuZXRfZGV2KQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpOwotCX0KLQotCS8vIEZyZWUgUmluZyBvciBVU0IgYnVmZmVycwotCVJUTVBGcmVlVHhSeFJpbmdNZW1vcnkocEFkKTsKLQotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkvLyBGcmVlIEJBIHJlb3JkZXIgcmVzb3VyY2UKLQliYV9yZW9yZGVyaW5nX3Jlc291cmNlX3JlbGVhc2UocEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JUlRNUF9DTEVBUl9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCk7Ci0KLS8qKysrTW9kaWZ5IGJ5IHdvb2R5IHRvIHNvbHZlIHRoZSBidWxrIGZhaWwrKysqLwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PT0gcnQyOHh4X2Nsb3NlXG4iKSk7Ci0JcmV0dXJuIDA7IC8vIGNsb3NlIG9rCi19IC8qIEVuZCBvZiBydDI4eHhfY2xvc2UgKi8KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIE9wZW4gcmF4eCBpbnRlcmZhY2UuCi0KLUFyZ3VtZW50czoKLQkqbmV0X2RldgkJCXRoZSByYXh4IGludGVyZmFjZSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICAwCQkJCQlPcGVuIE9LCi0Jb3RoZXJ3aXNlCQkJT3BlbiBGYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1pbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCWludCByZXR2YWwgPSAwOwotCS8vUE9TX0NPT0tJRSBwT2JqOwotCi0KLQkvLyBTYW5pdHkgY2hlY2sgZm9yIHBBZAotCWlmIChwQWQgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQotCXsKLQkJQ1dfTUFYX0lOX0JJVFMgPSA2OwotCX0KLQllbHNlIGlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCXsKLQkJQ1dfTUFYX0lOX0JJVFMgPSAxMDsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgotCWlmIChuZXRfZGV2LT5wcml2X2ZsYWdzID09IElOVF9NQUlOKQotCXsKLSNpZmRlZiBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVAotCQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX0FQKQotCQkJbmV0X2Rldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopICZydDI4eHhfYXBfaXdfaGFuZGxlcl9kZWY7Ci0jZW5kaWYgLy8gQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQgLy8KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJaWYgKHBBZC0+T3BNb2RlID09IE9QTU9ERV9TVEEpCi0JCQluZXRfZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnJ0Mjh4eF9pd19oYW5kbGVyX2RlZjsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQl9Ci0jZW5kaWYgLy8gV0lSRUxFU1NfRVhUID49IDEyIC8vCi0KLQkvLyBSZXF1ZXN0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIFBDSSBkZXZpY2UKLQkvLyByZWdpc3RlciB0aGUgaW50ZXJydXB0IHJvdXRpbmUgd2l0aCB0aGUgb3MKLQlSVE1QX0lSUV9SRVFVRVNUKG5ldF9kZXYpOwotCi0JLy8gSW5pdCBJUlEgcGFyYW1ldGVycyBzdG9yZWQgaW4gcEFkCi0JUlRNUF9JUlFfSU5JVChwQWQpOwotCi0JLy8gQ2hpcCAmIG90aGVyIGluaXQKLQlpZiAocnQyOHh4X2luaXQocEFkLCBtYWMsIGhvc3RuYW1lKSA9PSBGQUxTRSkKLQkJZ290byBlcnI7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCS8vIEVuYWJsZSBJbnRlcnJ1cHQKLQlSVE1QX0lSUV9FTkFCTEUocEFkKTsKLQotCS8vIE5vdyBFbmFibGUgUnhUeAotCVJUTVBFbmFibGVSeFR4KHBBZCk7Ci0JUlRNUF9TRVRfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfU1RBUlRfVVApOwotCi0JewotCVVJTlQzMiByZWcgPSAwOwotCVJUTVBfSU9fUkVBRDMyKHBBZCwgMHgxMzAwLCAmcmVnKTsgIC8vIGNsZWFyIGdhcmJhZ2UgaW50ZXJydXB0cwotCXByaW50aygiMHgxMzAwID0gJTA4eFxuIiwgcmVnKTsKLQl9Ci0KLQl7Ci0vLwl1MzIgcmVnOwotLy8JVUlOVDggIGJ5dGU7Ci0vLwl1MTYgdG1wOwotCi0vLwlSVE1QX0lPX1JFQUQzMihwQWQsIFhJRlNfVElNRV9DRkcsICZyZWcpOwotCi0vLwl0bXAgPSAweDA4MDU7Ci0vLwlyZWcgID0gKHJlZyAmIDB4ZmZmZjAwMDApIHwgdG1wOwotLy8JUlRNUF9JT19XUklURTMyKHBBZCwgWElGU19USU1FX0NGRywgcmVnKTsKLQotCX0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLSAgICAgICAgUlRNUEluaXRQQ0llTGlua0N0cmxWYWx1ZShwQWQpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JcmV0dXJuIChyZXR2YWwpOwotCi1lcnI6Ci0vLysrK0FkZCBieSBzaGlhbmcsIG1vdmUgZnJvbSBydDI4eHhfaW5pdCgpIHRvIGhlcmUuCi0JUlRNUF9JUlFfUkVMRUFTRShuZXRfZGV2KTsKLS8vLS0tQWRkIGJ5IHNoaWFuZywgbW92ZSBmcm9tIHJ0Mjh4eF9pbml0KCkgdG8gaGVyZS4KLQlyZXR1cm4gKC0xKTsKLX0gLyogRW5kIG9mIHJ0Mjh4eF9vcGVuICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnQzMDkwX25ldGRldl9vcHMgPSB7Ci0JLm5kb19vcGVuCQk9IE1haW5WaXJ0dWFsSUZfb3BlbiwKLQkubmRvX3N0b3AJCT0gTWFpblZpcnR1YWxJRl9jbG9zZSwKLQkubmRvX2RvX2lvY3RsCQk9IHJ0Mjh4eF9pb2N0bCwKLQkubmRvX2dldF9zdGF0cwkJPSBSVDI4eHhfZ2V0X2V0aGVyX3N0YXRzLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAotCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKLSNpZmRlZiBJS0FOT1NfVlhfMVgwCi0JLm5kb19zdGFydF94bWl0CQk9IElLQU5PU19EYXRhRnJhbWVzVHgsCi0jZWxzZQotCS5uZG9fc3RhcnRfeG1pdAkJPSBydDI4eHhfc2VuZF9wYWNrZXRzLAotI2VuZGlmCi19OwotCi1QTkVUX0RFViBSdG1wUGh5TmV0RGV2SW5pdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSVE1QX09TX05FVERFVl9PUF9IT09LICpwTmV0RGV2SG9vaykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldiA9IE5VTEw7Ci0vLwlORElTX1NUQVRVUwkJU3RhdHVzOwotCi0JbmV0X2RldiA9IFJ0bXBPU05ldERldkNyZWF0ZShwQWQsIElOVF9NQUlOLCAwLCBzaXplb2YoUFJUTVBfQURBUFRFUiksIElORl9NQUlOX0RFVl9OQU1FKTsKLQlpZiAobmV0X2RldiA9PSBOVUxMKQotCXsKLQkJcHJpbnRrKCJSdG1wUGh5TmV0RGV2SW5pdCgpOiBjcmVhdGlvbiBmYWlsZWQgZm9yIG1haW4gcGh5c2ljYWwgbmV0IGRldmljZSFcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeSgodW5zaWduZWQgY2hhciAqKXBOZXREZXZIb29rLCBzaXplb2YoUlRNUF9PU19ORVRERVZfT1BfSE9PSykpOwotCXBOZXREZXZIb29rLT5uZXRkZXZfb3BzID0gJnJ0MzA5MF9uZXRkZXZfb3BzOwotCXBOZXREZXZIb29rLT5wcml2X2ZsYWdzID0gSU5UX01BSU47Ci0JcE5ldERldkhvb2stPm5lZWRQcm90Y3RlZCA9IEZBTFNFOwotCi0JUlRNUF9PU19ORVRERVZfU0VUX1BSSVYobmV0X2RldiwgcEFkKTsKLQkvL25ldF9kZXYtPnByaXYgPSAoUFZPSUQpcEFkOwotCXBBZC0+bmV0X2RldiA9IG5ldF9kZXY7Ci0KLQotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotCVNFVF9NT0RVTEVfT1dORVIobmV0X2Rldik7Ci0jZW5kaWYKLQotCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7Ci0KLQlyZXR1cm4gbmV0X2RldjsKLQotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgVGhlIGVudHJ5IHBvaW50IGZvciBMaW51eCBrZXJuZWwgc2VudCBwYWNrZXQgdG8gb3VyIGRyaXZlci4KLQotQXJndW1lbnRzOgotICAgIHNrX2J1ZmYgKnNrYgkJdGhlIHBvaW50ZXIgcmVmZXIgdG8gYSBza19idWZmZXIuCi0KLVJldHVybiBWYWx1ZToKLSAgICAwCi0KLU5vdGU6Ci0JVGhpcyBmdW5jdGlvbiBpcyB0aGUgZW50cnkgcG9pbnQgb2YgVHggUGF0aCBmb3IgT3MgZGVsaXZlcnkgcGFja2V0IHRvCi0Jb3VyIGRyaXZlci4gWW91IG9ubHkgY2FuIHB1dCBPUy1kZXBlbmVkICYgU1RBL0FQIGNvbW1vbiBoYW5kbGUgcHJvY2VkdXJlcwotCWluIGhlcmUuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1pbnQgcnQyOHh4X3BhY2tldF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBza2ItPmRldjsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCWludCBzdGF0dXMgPSAwOwotCVBORElTX1BBQ0tFVCBwUGFja2V0ID0gKFBORElTX1BBQ0tFVCkgc2tiOwotCi0JLyogUlQyODcwU1RBIGRvZXMgdGhpcyBpbiBSVE1QU2VuZFBhY2tldHMoKSAqLwotI2lmZGVmIFJBTElOS19BVEUKLQlpZiAoQVRFX09OKHBBZCkpCi0JewotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfUkVTT1VSQ0VTKTsKLQkJcmV0dXJuIDA7Ci0JfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB3ZSBhcmUgaW4gbW9uaXRvciBtb2RlCi0JCWlmIChNT05JVE9SX09OKHBBZCkpCi0JCXsKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotICAgICAgICAvLyBFYXBvbFN0YXJ0IHNpemUgaXMgMTgKLQlpZiAoc2tiLT5sZW4gPCAxNCkKLQl7Ci0JCS8vcHJpbnRrKCJiYWQgcGFja2V0IHNpemU6ICVkXG4iLCBwa3QtPmxlbik7Ci0JCWhleF9kdW1wKCJiYWQgcGFja2V0Iiwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJZ290byBkb25lOwotCX0KLQotCi0KLQlSVE1QX1NFVF9QQUNLRVRfNVZUKHBQYWNrZXQsIDApOwotLy8JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBwa3QtPmRhdGEsIHBrdC0+bGVuKTsKLSNpZmRlZiBDT05GSUdfNVZUX0VOSEFOQ0UKLSAgICBpZiAoKihpbnQqKShza2ItPmNiKSA9PSBCUklER0VfVEFHKSB7Ci0JCVJUTVBfU0VUX1BBQ0tFVF81VlQocFBhY2tldCwgMSk7Ci0gICAgfQotI2VuZGlmCi0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQl7Ci0KLQkJU1RBU2VuZFBhY2tldHMoKE5ESVNfSEFORExFKXBBZCwgKFBQTkRJU19QQUNLRVQpICZwUGFja2V0LCAxKTsKLQl9Ci0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXN0YXR1cyA9IDA7Ci1kb25lOgotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIFNlbmQgYSBwYWNrZXQgdG8gV0xBTi4KLQotQXJndW1lbnRzOgotICAgIHNrYl9wICAgICAgICAgICBwb2ludHMgdG8gb3VyIGFkYXB0ZXIKLSAgICBkZXZfcCAgICAgICAgICAgd2hpY2ggV0xBTiBuZXR3b3JrIGludGVyZmFjZQotCi1SZXR1cm4gVmFsdWU6Ci0gICAgMDogdHJhbnNtaXQgc3VjY2Vzc2Z1bGx5Ci0gICAgb3RoZXJ3aXNlOiB0cmFuc21pdCBmYWlsCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IHJ0Mjh4eF9zZW5kX3BhY2tldHMoCi0JSU4gc3RydWN0IHNrX2J1ZmYJCSpza2JfcCwKLQlJTiBzdHJ1Y3QgbmV0X2RldmljZQkqbmV0X2RldikKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCi0JaWYgKCEobmV0X2Rldi0+ZmxhZ3MgJiBJRkZfVVApKQotCXsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIChQTkRJU19QQUNLRVQpc2tiX3AsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSZza2JfcC0+Y2JbQ0JfT0ZGXSwgMTUpOwotCVJUTVBfU0VUX1BBQ0tFVF9ORVRfREVWSUNFX01CU1NJRChza2JfcCwgTUFJTl9NQlNTSUQpOwotCi0JcmV0dXJuIHJ0Mjh4eF9wYWNrZXRfeG1pdChza2JfcCk7Ci19Ci0KLQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgotLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuIHF1ZXJ5IC9wcm9jCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcnQyOHh4X2dldF93aXJlbGVzc19zdGF0cygKLSAgICBJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCi0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLS0tPlxuIikpOwotCi0JcEFkLT5pd19zdGF0cy5zdGF0dXMgPSAwOyAvLyBTdGF0dXMgLSBkZXZpY2UgZGVwZW5kZW50IGZvciBub3cKLQotCS8vIGxpbmsgcXVhbGl0eQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCWlmIChwQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotCXBBZC0+aXdfc3RhdHMucXVhbC5xdWFsID0gKChwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHkgKiAxMikvMTAgKyAxMCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlpZihwQWQtPml3X3N0YXRzLnF1YWwucXVhbCA+IDEwMCkKLQkJcEFkLT5pd19zdGF0cy5xdWFsLnF1YWwgPSAxMDA7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlpZiAocEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQSkKLQl7Ci0JCXBBZC0+aXdfc3RhdHMucXVhbC5sZXZlbCA9Ci0JCQlSVE1QTWF4UnNzaShwQWQsIHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kwLAotCQkJCQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxLAotCQkJCQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyKTsKLQl9Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQlwQWQtPml3X3N0YXRzLnF1YWwubm9pc2UgPSBwQWQtPkJicFdyaXRlTGF0Y2hbNjZdOyAvLyBub2lzZSBsZXZlbCAoZEJtKQotCi0JcEFkLT5pd19zdGF0cy5xdWFsLm5vaXNlICs9IDI1NiAtIDE0MzsKLQlwQWQtPml3X3N0YXRzLnF1YWwudXBkYXRlZCA9IDE7ICAgICAvLyBGbGFncyB0byBrbm93IGlmIHVwZGF0ZWQKLSNpZmRlZiBJV19RVUFMX0RCTQotCXBBZC0+aXdfc3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfREJNOwkvLyBMZXZlbCArIE5vaXNlIGFyZSBkQm0KLSNlbmRpZiAvLyBJV19RVUFMX0RCTSAvLwotCi0JcEFkLT5pd19zdGF0cy5kaXNjYXJkLm53aWQgPSAwOyAgICAgLy8gUnggOiBXcm9uZyBud2lkL2Vzc2lkCi0JcEFkLT5pd19zdGF0cy5taXNzLmJlYWNvbiA9IDA7ICAgICAgLy8gTWlzc2VkIGJlYWNvbnMvc3VwZXJmcmFtZQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPC0tLSBydDI4eHhfZ2V0X3dpcmVsZXNzX3N0YXRzXG4iKSk7Ci0JcmV0dXJuICZwQWQtPml3X3N0YXRzOwotfQotI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCAvLwotCi0KLXZvaWQgdGJ0dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLS8vI2RlZmluZSBNQVhfVFhfSU5fVEJUVAkJKDE2KQotCi19Ci0KLUlOVCBydDI4eHhfaW9jdGwoCi0JSU4JUE5FVF9ERVYJbmV0X2RldiwKLQlJTglPVVQJc3RydWN0IGlmcmVxCSpycSwKLQlJTglJTlQJCQkJCWNtZCkKLXsKLQlSVE1QX0FEQVBURVIJKnBBZCA9IE5VTEw7Ci0JSU5UCQkJCXJldCA9IDA7Ci0KLQlwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KTsKLQlpZiAocEFkID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JewotCQlyZXQgPSBydDI4eHhfc3RhX2lvY3RsKG5ldF9kZXYsIHJxLCBjbWQpOwotCX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJvdXRpbmUgRGVzY3JpcHRpb246Ci0gICAgICAgIHJldHVybiBldGhlcm5ldCBzdGF0aXN0aWNzIGNvdW50ZXIKLQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgbmV0X2RldiAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gbmV0X2RldmljZQotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBuZXRfZGV2aWNlX3N0YXRzKgotCi0gICAgTm90ZToKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqUlQyOHh4X2dldF9ldGhlcl9zdGF0cygKLSAgICBJTiAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0gICAgUlRNUF9BREFQVEVSICpwQWQgPSBOVUxMOwotCi0JaWYgKG5ldF9kZXYpCi0JCXBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKG5ldF9kZXYpOwotCi0JaWYgKHBBZCkKLQl7Ci0KLQkJcEFkLT5zdGF0cy5yeF9wYWNrZXRzID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwotCQlwQWQtPnN0YXRzLnR4X3BhY2tldHMgPSBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQ7Ci0KLQkJcEFkLT5zdGF0cy5yeF9ieXRlcyA9IHBBZC0+UmFsaW5rQ291bnRlcnMuUmVjZWl2ZWRCeXRlQ291bnQ7Ci0JCXBBZC0+c3RhdHMudHhfYnl0ZXMgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OwotCi0JCXBBZC0+c3RhdHMucnhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuUnhFcnJvcnM7Ci0JCXBBZC0+c3RhdHMudHhfZXJyb3JzID0gcEFkLT5Db3VudGVyczgwMjMuVHhFcnJvcnM7Ci0KLQkJcEFkLT5zdGF0cy5yeF9kcm9wcGVkID0gMDsKLQkJcEFkLT5zdGF0cy50eF9kcm9wcGVkID0gMDsKLQotCSAgICBwQWQtPnN0YXRzLm11bHRpY2FzdCA9IHBBZC0+V2xhbkNvdW50ZXJzLk11bHRpY2FzdFJlY2VpdmVkRnJhbWVDb3VudC5RdWFkUGFydDsgICAvLyBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZAotCSAgICBwQWQtPnN0YXRzLmNvbGxpc2lvbnMgPSBwQWQtPkNvdW50ZXJzODAyMy5PbmVDb2xsaXNpb24gKyBwQWQtPkNvdW50ZXJzODAyMy5Nb3JlQ29sbGlzaW9uczsgIC8vIENvbGxpc2lvbiBwYWNrZXRzCi0KLQkgICAgcEFkLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIHJpbmcgYnVmZiBvdmVyZmxvdwotCSAgICBwQWQtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAwOy8vcEFkLT5XbGFuQ291bnRlcnMuRkNTRXJyb3JDb3VudDsgICAgIC8vIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IKLQkgICAgcEFkLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSBwQWQtPkNvdW50ZXJzODAyMy5SY3ZBbGlnbm1lbnRFcnJvcnM7ICAgICAgICAgIC8vIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IKLQkgICAgcEFkLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXI7ICAgICAgICAgICAgICAgICAgIC8vIHJlY3YnciBmaWZvIG92ZXJydW4KLQkgICAgcEFkLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQKLQotCSAgICAvLyBkZXRhaWxlZCB0eF9lcnJvcnMKLQkgICAgcEFkLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOwotCSAgICBwQWQtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKLQkgICAgcEFkLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKLQotCSAgICAvLyBmb3IgY3NsaXAgZXRjCi0JICAgIHBBZC0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7Ci0JICAgIHBBZC0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7Ci0KLQkJcmV0dXJuICZwQWQtPnN0YXRzOwotCX0KLQllbHNlCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotQk9PTEVBTiBSdG1wUGh5TmV0RGV2RXhpdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkVUX0RFViBuZXRfZGV2KQotewotCi0KLQotI2lmZGVmIElORl9BTUFaT05fUFBBCi0JaWYgKHBwYV9ob29rX2RpcmVjdHBhdGhfcmVnaXN0ZXJfZGV2X2ZuICYmIHBBZC0+UFBBRW5hYmxlPT1UUlVFKQotCXsKLQkJVUlOVCBzdGF0dXM7Ci0JCXN0YXR1cz1wcGFfaG9va19kaXJlY3RwYXRoX3JlZ2lzdGVyX2Rldl9mbigmcEFkLT5nX2lmX2lkLCBwQWQtPm5ldF9kZXYsIE5VTEwsIFBQQV9GX0RJUkVDVFBBVEhfREVSRUdJU1RFUik7Ci0JCXByaW50aygidW5yZWdpc3RlciBQUEE6Z19pZl9pZD0lZCBzdGF0dXM9JWRcbiIscEFkLT5nX2lmX2lkLHN0YXR1cyk7Ci0JfQotCWtmcmVlKHBBZC0+cERpcmVjdHBhdGhDYik7Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotCS8vIFVucmVnaXN0ZXIgbmV0d29yayBkZXZpY2UKLQlpZiAobmV0X2RldiAhPSBOVUxMKQotCXsKLQkJcHJpbnRrKCJSdG1wT1NOZXREZXZEZXRhY2goKTogUnRtcE9TTmV0RGV2aWNlRGV0YWNoKCksIGRldi0+bmFtZT0lcyFcbiIsIG5ldF9kZXYtPm5hbWUpOwotCQlSdG1wT1NOZXREZXZEZXRhY2gobmV0X2Rldik7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWRhcHRlciBjb250cm9sIGJsb2NrLgotCi1Bcmd1bWVudHM6Ci0gICAgcEFkCQkJCQlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLVJldHVybiBWYWx1ZToKLQlORElTX1NUQVRVU19TVUNDRVNTCi0JTkRJU19TVEFUVVNfRkFJTFVSRQotCU5ESVNfU1RBVFVTX1JFU09VUkNFUwotCi1Ob3RlOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCi0JSU4gUFZPSUQJaGFuZGxlLAotCU9VVAlQVk9JRAkqcHBBZCkKLXsKLQotCSpwcEFkID0gKFBWT0lEKXZtYWxsb2Moc2l6ZW9mKFJUTVBfQURBUFRFUikpOyAvL3BjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIHNpemVvZihSVE1QX0FEQVBURVIpLCBwaHlfYWRkcik7Ci0KLQlpZiAoKnBwQWQpCi0JewotCQlOZGlzWmVyb01lbW9yeSgqcHBBZCwgc2l6ZW9mKFJUTVBfQURBUFRFUikpOwotCQkoKFBSVE1QX0FEQVBURVIpKnBwQWQpLT5PU19Db29raWUgPSBoYW5kbGU7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfU1VDQ0VTUyk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChORElTX1NUQVRVU19GQUlMVVJFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X3BjaV9yYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X3BjaV9yYnVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTEzMTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wY2lfcmJ1cy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTg5ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRfcGNpX3JidXMuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgQ3JlYXRlIGFuZCByZWdpc3RlciBuZXR3b3JrIGludGVyZmFjZS4KLQotICAgIFJldmlzaW9uIEhpc3Rvcnk6Ci0gICAgV2hvICAgICAgICAgV2hlbiAgICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0KLUlSUV9IQU5ETEVfVFlQRQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDE5KSkKLXJ0Mjg2MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKLSNlbHNlCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgcnhfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBtZ210X2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBhYzFfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYWMyX2RtYV9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0vKnN0YXRpYyB2b2lkIGhjY2FfZG1hX2RvbmVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOyovCi1zdGF0aWMgdm9pZCBmaWZvX3N0YXRpc3RpY19mdWxsX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFN5bWJvbCAmIE1hY3JvIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgUlQyODYwX0lOVF9SWF9ETFkJCQkJKDE8PDApCQkvLyBiaXQgMAotI2RlZmluZSBSVDI4NjBfSU5UX1RYX0RMWQkJCQkoMTw8MSkJCS8vIGJpdCAxCi0jZGVmaW5lIFJUMjg2MF9JTlRfUlhfRE9ORQkJCQkoMTw8MikJCS8vIGJpdCAyCi0jZGVmaW5lIFJUMjg2MF9JTlRfQUMwX0RNQV9ET05FCQkJKDE8PDMpCQkvLyBiaXQgMwotI2RlZmluZSBSVDI4NjBfSU5UX0FDMV9ETUFfRE9ORQkJCSgxPDw0KQkJLy8gYml0IDQKLSNkZWZpbmUgUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUJCQkoMTw8NSkJCS8vIGJpdCA1Ci0jZGVmaW5lIFJUMjg2MF9JTlRfQUMzX0RNQV9ET05FCQkJKDE8PDYpCQkvLyBiaXQgNgotI2RlZmluZSBSVDI4NjBfSU5UX0hDQ0FfRE1BX0RPTkUJCSgxPDw3KQkJLy8gYml0IDcKLSNkZWZpbmUgUlQyODYwX0lOVF9NR01UX0RPTkUJCQkoMTw8OCkJCS8vIGJpdCA4Ci0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBSVDI4NjBfSU5UX1RPTkVfUkFEQVIJCQkoMTw8MjApCQkvLyBiaXQgMjAKLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgSU5UX1JYCQkJUlQyODYwX0lOVF9SWF9ET05FCi0KLSNkZWZpbmUgSU5UX0FDMF9ETFkJCShSVDI4NjBfSU5UX0FDMF9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfQUMxX0RMWQkJKFJUMjg2MF9JTlRfQUMxX0RNQV9ET05FKSAvL3wgUlQyODYwX0lOVF9UWF9ETFkpCi0jZGVmaW5lIElOVF9BQzJfRExZCQkoUlQyODYwX0lOVF9BQzJfRE1BX0RPTkUpIC8vfCBSVDI4NjBfSU5UX1RYX0RMWSkKLSNkZWZpbmUgSU5UX0FDM19ETFkJCShSVDI4NjBfSU5UX0FDM19ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfSENDQV9ETFkJKFJUMjg2MF9JTlRfSENDQV9ETUFfRE9ORSkgLy98IFJUMjg2MF9JTlRfVFhfRExZKQotI2RlZmluZSBJTlRfTUdNVF9ETFkJUlQyODYwX0lOVF9NR01UX0RPTkUKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0jZGVmaW5lIElOVF9UT05FX1JBREFSCShSVDI4NjBfSU5UX1RPTkVfUkFEQVIpCi0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqCUludGVyZmFjZS1kZXBlbmRlZCBtZW1vcnkgYWxsb2NhdGlvbi9GcmVlIHJlbGF0ZWQgcHJvY2VkdXJlcy4KLSAgKgkJTWFpbmx5IGZvciBIYXJkd2FyZSBUeERlc2MvUnhEZXNjL01nbXREZXNjLCBETUEgTWVtb3J5IGZvciBUeERhdGEvUnhEYXRhLCBldGMuLAotICAqCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gRnVuY3Rpb24gZm9yIFR4RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4KLXZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClwY2lfYWxsb2NfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLX0KLQotCi0vLyBGdW5jdGlvbiBmb3IgTWdtdERlc2MgTWVtb3J5IGFsbG9jYXRpb24uCi12b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotCi19Ci0KLQotLy8gRnVuY3Rpb24gZm9yIFJ4RGVzYyBNZW1vcnkgYWxsb2NhdGlvbi4KLXZvaWQgUlRNUF9BbGxvY2F0ZVJ4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpCi17Ci0JUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpcEFkLT5PU19Db29raWU7Ci0KLQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpcGNpX2FsbG9jX2NvbnNpc3RlbnQocE9iai0+cGNpX2RldixzaXplb2YoY2hhcikqTGVuZ3RoLCBQaHlzaWNhbEFkZHJlc3MpOwotCi19Ci0KLQotLy8gRnVuY3Rpb24gZm9yIGZyZWUgYWxsb2NhdGVkIERlc2MgTWVtb3J5Lgotdm9pZCBSVE1QX0ZyZWVEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglQVk9JRAlWaXJ0dWFsQWRkcmVzcywKLQlJTglORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcGNpX2ZyZWVfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBMZW5ndGgsIFZpcnR1YWxBZGRyZXNzLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi0KLS8vIEZ1bmN0aW9uIGZvciBUeERhdGEgRE1BIE1lbW9yeSBhbGxvY2F0aW9uLgotdm9pZCBSVE1QX0FsbG9jYXRlRmlyc3RUeEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClwY2lfYWxsb2NfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci19Ci0KLQotdm9pZCBSVE1QX0ZyZWVGaXJzdFR4QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlJTglQVk9JRAlWaXJ0dWFsQWRkcmVzcywKLQlJTglORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCVBPU19DT09LSUUgcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcGNpX2ZyZWVfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LCBMZW5ndGgsIFZpcnR1YWxBZGRyZXNzLCBQaHlzaWNhbEFkZHJlc3MpOwotfQotCi0KLS8qCi0gKiBGVU5DVElPTjogQWxsb2NhdGUgYSBjb21tb24gYnVmZmVyIGZvciBETUEKLSAqIEFSR1VNRU5UUzoKLSAqICAgICBBZGFwdGVySGFuZGxlOiAgQWRhcHRlckhhbmRsZQotICogICAgIExlbmd0aDogIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQotICogICAgIENhY2hlZDogIFdoZXRoZXIgb3Igbm90IHRoZSBtZW1vcnkgY2FuIGJlIGNhY2hlZAotICogICAgIFZpcnR1YWxBZGRyZXNzOiAgUG9pbnRlciB0byBtZW1vcnkgaXMgcmV0dXJuZWQgaGVyZQotICogICAgIFBoeXNpY2FsQWRkcmVzczogIFBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB2aXJ0dWFsIGFkZHJlc3MKLSAqLwotdm9pZCBSVE1QX0FsbG9jYXRlU2hhcmVkTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcykKLXsKLQlQT1NfQ09PS0lFIHBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRClwY2lfYWxsb2NfY29uc2lzdGVudChwT2JqLT5wY2lfZGV2LHNpemVvZihjaGFyKSpMZW5ndGgsIFBoeXNpY2FsQWRkcmVzcyk7Ci19Ci0KLQotLyoKLSAqIEZVTkNUSU9OOiBBbGxvY2F0ZSBhIHBhY2tldCBidWZmZXIgZm9yIERNQQotICogQVJHVU1FTlRTOgotICogICAgIEFkYXB0ZXJIYW5kbGU6ICBBZGFwdGVySGFuZGxlCi0gKiAgICAgTGVuZ3RoOiAgTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCi0gKiAgICAgQ2FjaGVkOiAgV2hldGhlciBvciBub3QgdGhlIG1lbW9yeSBjYW4gYmUgY2FjaGVkCi0gKiAgICAgVmlydHVhbEFkZHJlc3M6ICBQb2ludGVyIHRvIG1lbW9yeSBpcyByZXR1cm5lZCBoZXJlCi0gKiAgICAgUGh5c2ljYWxBZGRyZXNzOiAgUGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHZpcnR1YWwgYWRkcmVzcwotICogTm90ZXM6Ci0gKiAgICAgQ2FjaGVkIGlzIGlnbm9yZWQ6IGFsd2F5cyBjYWNoZWQgbWVtb3J5Ci0gKi8KLVBORElTX1BBQ0tFVCBSVE1QX0FsbG9jYXRlUnhQYWNrZXRCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKQotewotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0KLQlwa3QgPSBkZXZfYWxsb2Nfc2tiKExlbmd0aCk7Ci0KLQlpZiAocGt0ID09IE5VTEwpIHsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiY2FuJ3QgYWxsb2NhdGUgcnggJWxkIHNpemUgcGFja2V0XG4iLExlbmd0aCkpOwotCX0KLQotCWlmIChwa3QpIHsKLQkJUlRNUF9TRVRfUEFDS0VUX1NPVVJDRShPU1BLVF9UT19SVFBLVChwa3QpLCBQS1RTUkNfTkRJUyk7Ci0JCSpWaXJ0dWFsQWRkcmVzcyA9IChQVk9JRCkgcGt0LT5kYXRhOwotLy8jaWZkZWYgQ09ORklHXzVWVF9FTkhBTkNFCi0vLwkJKlBoeXNpY2FsQWRkcmVzcyA9IFBDSV9NQVBfU0lOR0xFKHBBZCwgKlZpcnR1YWxBZGRyZXNzLCAxNjAwLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotLy8jZWxzZQotCQkqUGh5c2ljYWxBZGRyZXNzID0gUENJX01BUF9TSU5HTEUocEFkLCAqVmlydHVhbEFkZHJlc3MsIExlbmd0aCwgIC0xLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotLy8jZW5kaWYKLQl9IGVsc2UgewotCQkqVmlydHVhbEFkZHJlc3MgPSAoUFZPSUQpIE5VTEw7Ci0JCSpQaHlzaWNhbEFkZHJlc3MgPSAoTkRJU19QSFlTSUNBTF9BRERSRVNTKSBOVUxMOwotCX0KLQotCXJldHVybiAoUE5ESVNfUEFDS0VUKSBwa3Q7Ci19Ci0KLQotVk9JRCBJbnZhbGlkX1JlbWFpbmluZ19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JIFVMT05HIFZpcnR1YWxBZGRyZXNzKQotewotCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3M7Ci0KLQlQaHlzaWNhbEFkZHJlc3MgPSBQQ0lfTUFQX1NJTkdMRShwQWQsICh2b2lkICopKFZpcnR1YWxBZGRyZXNzKzE2MDApLCBSWF9CVUZGRVJfTk9STVNJWkUtMTYwMCwgLTEsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci19Ci0KLQotaW50IFJ0bXBPU0lSUVJlcXVlc3QoSU4gc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikoUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2RldikpOwotCWludCByZXR2YWwgPSAwOwotCi0JQVNTRVJUKHBBZCk7Ci0KLQlpZiAocEFkLT5pbmZUeXBlICE9IFJUTVBfREVWX0lORl9SQlVTKQotCXsKLQkJUE9TX0NPT0tJRSBfcE9iaiA9IChQT1NfQ09PS0lFKShwQWQtPk9TX0Nvb2tpZSk7Ci0JCVJUTVBfTVNJX0VOQUJMRShwQWQpOwotCQlyZXR2YWwgPSByZXF1ZXN0X2lycShfcE9iai0+cGNpX2Rldi0+aXJxLCAgcnQyODYwX2ludGVycnVwdCwgU0FfU0hJUlEsIChuZXRfZGV2KS0+bmFtZSwgKG5ldF9kZXYpKTsKLQkJaWYgKHJldHZhbCAhPSAwKQotCQkJcHJpbnRrKCJSVDI4NjA6IHJlcXVlc3RfaXJxICBFUlJPUiglZClcbiIsIHJldHZhbCk7Ci0JfQotCWVsc2UKLQl7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKLQkJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShuZXRfZGV2LT5pcnEsIHJ0Mjg2MF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBuZXRfZGV2LT5uYW1lICxuZXRfZGV2KSkpCi0jZWxzZQotCQlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKG5ldF9kZXYtPmlycSxydDI4NjBfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsIG5ldF9kZXYtPm5hbWUgLG5ldF9kZXYpKSkKLSNlbmRpZgotCQl7Ci0JCQlwcmludGsoIlJUMjg2MDogcmVxdWVzdF9pcnEgIEVSUk9SKCVkKVxuIiwgcmV0dmFsKTsKLQkJfQotCX0KLQotCXJldHVybiByZXR2YWw7Ci0KLX0KLQotCi1pbnQgUnRtcE9TSVJRUmVsZWFzZShJTiBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IChQUlRNUF9BREFQVEVSKShSVE1QX09TX05FVERFVl9HRVRfUFJJVihuZXRfZGV2KSk7Ci0KLQlBU1NFUlQocEFkKTsKLQlpZiAocEFkLT5pbmZUeXBlICE9IFJUTVBfREVWX0lORl9SQlVTKQotCXsKLQkJUE9TX0NPT0tJRSBwT2JqID0gKFBPU19DT09LSUUpKHBBZC0+T1NfQ29va2llKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0JCXN5bmNocm9uaXplX2lycShwT2JqLT5wY2lfZGV2LT5pcnEpOwotI2VuZGlmCi0JCWZyZWVfaXJxKHBPYmotPnBjaV9kZXYtPmlycSwgKG5ldF9kZXYpKTsKLQkJUlRNUF9NU0lfRElTQUJMRShwQWQpOwotCX0KLQllbHNlCi0JewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLQkJc3luY2hyb25pemVfaXJxKG5ldF9kZXYtPmlycSk7Ci0jZW5kaWYKLQkJZnJlZV9pcnEobmV0X2Rldi0+aXJxLCAobmV0X2RldikpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLU5ESVNfU1RBVFVTIFJ0bXBOZXRUYXNrSW5pdChJTiBSVE1QX0FEQVBURVIgKnBBZCkKLXsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCi0JdGFza2xldF9pbml0KCZwT2JqLT5yeF9kb25lX3Rhc2ssIHJ4X2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQl0YXNrbGV0X2luaXQoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzaywgbWdtdF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2ssIGFjMF9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2ssIGFjMV9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2ssIGFjMl9kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCXRhc2tsZXRfaW5pdCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2ssIGFjM19kbWFfZG9uZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylwQWQpOwotCS8qdGFza2xldF9pbml0KCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2ssIGhjY2FfZG1hX2RvbmVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsqLwotCXRhc2tsZXRfaW5pdCgmcE9iai0+dGJ0dF90YXNrLCB0YnR0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXBBZCk7Ci0JdGFza2xldF9pbml0KCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2ssIGZpZm9fc3RhdGlzdGljX2Z1bGxfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpcEFkKTsKLQotCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotfQotCi0KLXZvaWQgUnRtcE5ldFRhc2tFeGl0KElOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCVBPU19DT09LSUUgcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQl0YXNrbGV0X2tpbGwoJnBPYmotPnJ4X2RvbmVfdGFzayk7Ci0JdGFza2xldF9raWxsKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMwX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMyX2RtYV9kb25lX3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCS8qdGFza2xldF9raWxsKCZwT2JqLT5oY2NhX2RtYV9kb25lX3Rhc2spOyovCi0JdGFza2xldF9raWxsKCZwT2JqLT50YnR0X3Rhc2spOwotCXRhc2tsZXRfa2lsbCgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKLX0KLQotCi1ORElTX1NUQVRVUyBSdG1wTWdtdFRhc2tJbml0KElOIFJUTVBfQURBUFRFUiAqcEFkKQotewotCi0KLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIENsb3NlIGtlcm5lbCB0aHJlYWRzLgotCi1Bcmd1bWVudHM6Ci0JKnBBZAkJCQl0aGUgcmF4eCBpbnRlcmZhY2UgZGF0YSBwb2ludGVyCi0KLVJldHVybiBWYWx1ZToKLSAgICBOT05FCi0KLU5vdGU6Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJ0bXBNZ210VGFza0V4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpCi17Ci0KLQotCXJldHVybjsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcnQyODYwX2ludF9lbmFibGUoUFJUTVBfQURBUFRFUiBwQWQsIHVuc2lnbmVkIGludCBtb2RlKQotewotCXUzMiByZWdWYWx1ZTsKLQotCXBBZC0+aW50X2Rpc2FibGVfbWFzayAmPSB+KG1vZGUpOwotCXJlZ1ZhbHVlID0gcEFkLT5pbnRfZW5hYmxlX3JlZyAmIH4ocEFkLT5pbnRfZGlzYWJsZV9tYXNrKTsKLQkvL2lmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9NQVNLX0NTUiwgcmVnVmFsdWUpOyAgICAgLy8gMTplbmFibGUKLQl9Ci0JLy9lbHNlCi0JLy8JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZk9QX1NUQVRVU19ET1pFICFcbiIpKTsKLQotCWlmIChyZWdWYWx1ZSAhPSAwKQotCQlSVE1QX1NFVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfQUNUSVZFKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcnQyODYwX2ludF9kaXNhYmxlKFBSVE1QX0FEQVBURVIgcEFkLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1MzIgcmVnVmFsdWU7Ci0KLQlwQWQtPmludF9kaXNhYmxlX21hc2sgfD0gbW9kZTsKLQlyZWdWYWx1ZSA9CXBBZC0+aW50X2VuYWJsZV9yZWcgJiB+KHBBZC0+aW50X2Rpc2FibGVfbWFzayk7Ci0JUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX01BU0tfQ1NSLCByZWdWYWx1ZSk7ICAgICAvLyAwOiBkaXNhYmxlCi0KLQlpZiAocmVnVmFsdWUgPT0gMCkKLQl7Ci0JCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0FDVElWRSk7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqCXRhc2tsZXQgcmVsYXRlZCBwcm9jZWR1cmVzLgotICAqCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbWdtdF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLS8vCXByaW50aygibWdtdF9kbWFfZG9uZV9wcm9jZXNzXG4iKTsKLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLk1nbXREbWFEb25lID0gMTsKLQlwQWQtPmludF9wZW5kaW5nICY9IH5JTlRfTUdNVF9ETFk7Ci0KLQlSVE1QSGFuZGxlTWdtdFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCk7Ci0KLQkvLyBpZiB5b3UgdXNlIFJUTVBfU0VNX0xPQ0ssIHNvbWV0aW1lcyBrZXJuZWwgd2lsbCBoYW5nIHVwLCBubyBhbnkKLQkvLyBidWcgcmVwb3J0IG91dHB1dAotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIElOVF9NR01UX0RMWSkKLQl7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPm1nbXRfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX01HTVRfRExZKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCByeF9kb25lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgZGF0YTsKLQlCT09MRUFOCWJSZXNjaGVkdWxlID0gMDsKLQlQT1NfQ09PS0lFIHBPYmo7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JVUFQU0RfVElNSU5HX1JFQ09SRChwQWQsIFVBUFNEX1RJTUlOR19SRUNPUkRfVEFTS0xFVCk7Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXBBZC0+aW50X3BlbmRpbmcgJj0gfihJTlRfUlgpOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUlGX0RFVl9DT05GSUdfT1BNT0RFX09OX1NUQShwQWQpCi0JCWJSZXNjaGVkdWxlID0gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKHBBZCwgMCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBVQVBTRF9BUF9TVVBQT1JUCi0JVUFQU0RfVElNSU5HX1JFQ09SRF9TVE9QKCk7Ci0jZW5kaWYgLy8gVUFQU0RfQVBfU1VQUE9SVCAvLwotCi0JUlRNUF9JTlRfTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogZG91YmxlIGNoZWNrIHRvIGF2b2lkIHJvdHRpbmcgcGFja2V0Ci0JICovCi0JaWYgKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfUlggfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5yeF9kb25lX3Rhc2spOwotCQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGVuYWJsZSBSeElOVCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX1JYKTsKLQlSVE1QX0lOVF9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQotfQotCi0KLXZvaWQgZmlmb19zdGF0aXN0aWNfZnVsbF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0gICAgcE9iaiA9IChQT1NfQ09PS0lFKSBwQWQtPk9TX0Nvb2tpZTsKLQotCXBBZC0+aW50X3BlbmRpbmcgJj0gfihGaWZvU3RhRnVsbEludCk7Ci0JTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKHBBZCk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBkb3VibGUgY2hlY2sgdG8gYXZvaWQgcm90dGluZyBwYWNrZXQKLQkgKi8KLQlpZiAocEFkLT5pbnRfcGVuZGluZyAmIEZpZm9TdGFGdWxsSW50KQotCXsKLQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+Zmlmb19zdGF0aXN0aWNfZnVsbF90YXNrKTsKLQkJUlRNUF9JTlRfVU5MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBlbmFibGUgUnhJTlQgYWdhaW4gKi8KLQotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgRmlmb1N0YUZ1bGxJbnQpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCi19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIGFjM19kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLS8vCXByaW50aygiYWMwX2RtYV9kb25lX3Byb2Nlc3NcbiIpOwotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMzRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDM19ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMzX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzNfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDM19ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFjMl9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQlJbnRTb3VyY2Uud29yZCA9IDA7Ci0JSW50U291cmNlLmZpZWxkLkFjMkRtYURvbmUgPSAxOwotCXBBZC0+aW50X3BlbmRpbmcgJj0gfklOVF9BQzJfRExZOwotCi0JYlJlc2NoZWR1bGUgPSBSVE1QSGFuZGxlVHhSaW5nRG1hRG9uZUludGVycnVwdChwQWQsIEludFNvdXJjZSk7Ci0KLQlSVE1QX0lOVF9MT0NLKCZwQWQtPmlycV9sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMyX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMl9ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFjMV9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0gICAgSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotICAgIHBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLS8vCXByaW50aygiYWMwX2RtYV9kb25lX3Byb2Nlc3NcbiIpOwotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMxRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMV9ETFk7Ci0KLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMxX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzFfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMV9ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyB2b2lkIGFjMF9kbWFfZG9uZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCVBSVE1QX0FEQVBURVIgcEFkID0gKFBSVE1QX0FEQVBURVIpIGRhdGE7Ci0JSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQlCT09MRUFOIGJSZXNjaGVkdWxlID0gMDsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUyB8IGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCkpCi0JCXJldHVybjsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLS8vCXByaW50aygiYWMwX2RtYV9kb25lX3Byb2Nlc3NcbiIpOwotCUludFNvdXJjZS53b3JkID0gMDsKLQlJbnRTb3VyY2UuZmllbGQuQWMwRG1hRG9uZSA9IDE7Ci0JcEFkLT5pbnRfcGVuZGluZyAmPSB+SU5UX0FDMF9ETFk7Ci0KLS8vCVJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQocEFkKTsKLQliUmVzY2hlZHVsZSA9IFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KHBBZCwgSW50U291cmNlKTsKLQotCVJUTVBfSU5UX0xPQ0soJnBBZC0+aXJxX2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIGRvdWJsZSBjaGVjayB0byBhdm9pZCBsb3NlIG9mIGludGVycnVwdHMKLQkgKi8KLQlpZiAoKHBBZC0+aW50X3BlbmRpbmcgJiBJTlRfQUMwX0RMWSkgfHwgYlJlc2NoZWR1bGUpCi0JewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzBfZG1hX2RvbmVfdGFzayk7Ci0JCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIFR4RGF0YUludCBhZ2FpbiAqLwotCXJ0Mjg2MF9pbnRfZW5hYmxlKHBBZCwgSU5UX0FDMF9ETFkpOwotCVJUTVBfSU5UX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgZmxhZ3MpOwotfQotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKglpbnRlcnJ1cHQgaGFuZGxlciByZWxhdGVkIHByb2NlZHVyZXMuCi0gICoKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcHJpbnRfaW50X2NvdW50OwotCi1JUlFfSEFORExFX1RZUEUKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkpCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKLSNlbHNlCi1ydDI4NjBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi0jZW5kaWYKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7Ci0JUFJUTVBfQURBUFRFUiBwQWQgPSAoUFJUTVBfQURBUFRFUikgUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JSU5UX1NPVVJDRV9DU1JfU1RSVUMJSW50U291cmNlOwotCVBPU19DT09LSUUgcE9iajsKLQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLQotCS8qIE5vdGUgMDMzMTIwMDg6IHdlIGNhbiBub3QgcmV0dXJuIGhlcmUgYmVmb3JlCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsICZJbnRTb3VyY2Uud29yZCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIElOVF9TT1VSQ0VfQ1NSLCBJbnRTb3VyY2Uud29yZCk7Ci0JCU9yIGtlcm5lbCB3aWxsIHBhbmljIGFmdGVyIGlmY29uZmlnIHJhMCBkb3duIHNvbWV0aW1lcyAqLwotCi0KLQkvLwotCS8vIEluaXRhbCB0aGUgSW50ZXJydXB0IHNvdXJjZS4KLQkvLwotCUludFNvdXJjZS53b3JkID0gMHgwMDAwMDAwMEw7Ci0vLwlNY3VJbnRTb3VyY2Uud29yZCA9IDB4MDAwMDAwMDBMOwotCi0JLy8KLQkvLyBHZXQgdGhlIGludGVycnVwdCBzb3VyY2VzICYgc2F2ZWQgdG8gbG9jYWwgdmFyaWFibGUKLQkvLwotCS8vUlRNUF9JT19SRUFEMzIocEFkLCB3aGVyZSwgJk1jdUludFNvdXJjZS53b3JkKTsKLQkvL1JUTVBfSU9fV1JJVEUzMihwQWQsICwgTWN1SW50U291cmNlLndvcmQpOwotCi0JLy8KLQkvLyBGbGFnIGZPUF9TVEFUVVNfRE9aRSBPbiwgbWVhbnMgQVNJQyBwdXQgdG8gc2xlZXAsIGVsYXNlIG1lYW5zIEFTSUNLIFdha2VVcAotCS8vIEFuZCBhdCB0aGUgc2FtZSB0aW1lLCBjbG9jayBtYXliZSB0dXJuZWQgb2ZmIHRoYXQgc2F5IHRoZXJlIGlzIG5vIERNQSBzZXJ2aWNlLgotCS8vIHdoZW4gQVNJQyBnZXQgdG8gc2xlZXAuCi0JLy8gVG8gcHJldmVudCBzeXN0ZW0gaGFuZyBvbiBwb3dlciBzYXZpbmcuCi0JLy8gV2UgbmVlZCB0byBjaGVjayBpdCBiZWZvcmUgaGFuZGxlIHRoZSBJTlRfU09VUkNFX0NTUiwgQVNJQyBtdXN0IGJlIHdha2UgdXAuCi0JLy8KLQkvLyBSVDI2NjEgPT4gd2hlbiBBU0lDIGlzIHNsZWVwaW5nLCBNQUMgcmVnaXN0ZXIgY2Fubm90IGJlIHJlYWQgYW5kIHdyaXR0ZW4uCi0JLy8gUlQyODYwID0+IHdoZW4gQVNJQyBpcyBzbGVlcGluZywgTUFDIHJlZ2lzdGVyIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuLgotLy8JaWYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0RPWkUpKQotCXsKLQkJUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJkludFNvdXJjZS53b3JkKTsKLQkJUlRNUF9JT19XUklURTMyKHBBZCwgSU5UX1NPVVJDRV9DU1IsIEludFNvdXJjZS53b3JkKTsgLy8gd3JpdGUgMSB0byBjbGVhcgotCX0KLS8vCWVsc2UKLS8vCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI+Pj5mT1BfU1RBVFVTX0RPWkU8PDxcbiIpKTsKLQotLy8JUlRNUF9JT19SRUFEMzIocEFkLCBJTlRfU09VUkNFX0NTUiwgJklzckFmdGVyQ2xlYXIpOwotLy8JUlRNUF9JT19SRUFEMzIocEFkLCBNQ1VfSU5UX1NPVVJDRV9DU1IsICZNY3VJc3JBZnRlckNsZWFyKTsKLS8vCURCR1BSSU5UKFJUX0RFQlVHX0lORk8sICgiPT09PT4gUlRNUEhhbmRsZUludGVycnVwdChJU1I9JTA4eCxNY3UgSVNSPSUwOHgsIEFmdGVyIGNsZWFyIElTUj0lMDh4LCBNQ1UgSVNSPSUwOHgpXG4iLAotLy8JCQlJbnRTb3VyY2Uud29yZCwgTWN1SW50U291cmNlLndvcmQsIElzckFmdGVyQ2xlYXIsIE1jdUlzckFmdGVyQ2xlYXIpKTsKLQotCS8vIERvIG5vdGhpbmcgaWYgUmVzZXQgaW4gcHJvZ3Jlc3MKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCAoZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUyB8ZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTKSkpCi0JewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMCkKLSAgICAgICAgcmV0dXJuICBJUlFfSEFORExFRDsKLSNlbHNlCi0gICAgICAgIHJldHVybjsKLSNlbmRpZgotCX0KLQotCS8vCi0JLy8gSGFuZGxlIGludGVycnVwdCwgd2FsayB0aHJvdWdoIGFsbCBiaXRzCi0JLy8gU2hvdWxkIHN0YXJ0IGZyb20gaGlnaGVzdCBwcmlvcml0eSBpbnRlcnJ1cHQKLQkvLyBUaGUgcHJpb3JpdHkgY2FuIGJlIGFkanVzdCBieSBhbHRlcmluZyBwcm9jZXNzaW5nIGlmIHN0YXRlbWVudAotCS8vCi0KLSNpZmRlZiBEQkcKLQotI2VuZGlmCi0KLQotCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotCi0JLy8gSWYgcmVxdWlyZWQgc3BpbmxvY2ssIGVhY2ggaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBoYXMgdG8gYWNxdWlyZQotCS8vIGFuZCByZWxlYXNlIGl0c2VsZi4KLQkvLwotCi0JLy8gRG8gbm90aGluZyBpZiBOSUMgZG9lc24ndCBleGlzdAotCWlmIChJbnRTb3VyY2Uud29yZCA9PSAweGZmZmZmZmZmKQotCXsKLQkJUlRNUF9TRVRfRkxBRyhwQWQsIChmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QgfCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDApCi0gICAgICAgIHJldHVybiAgSVJRX0hBTkRMRUQ7Ci0jZWxzZQotICAgICAgICByZXR1cm47Ci0jZW5kaWYKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBUeENvaGVyZW50KQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiPj4+VHhDb2hlcmVudDw8PFxuIikpOwotCQlSVE1QSGFuZGxlUnhDb2hlcmVudEludGVycnVwdChwQWQpOwotCX0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIFJ4Q29oZXJlbnQpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCI+Pj5SeENvaGVyZW50PDw8XG4iKSk7Ci0JCVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KHBBZCk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgRmlmb1N0YUZ1bGxJbnQpCi0JewotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIEZpZm9TdGFGdWxsSW50KSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIEZpZm9TdGFGdWxsSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBGaWZvU3RhRnVsbEludCk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5maWZvX3N0YXRpc3RpY19mdWxsX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gRmlmb1N0YUZ1bGxJbnQ7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX01HTVRfRExZKQotCXsKLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfTUdNVF9ETFkpID09MCApCi0JCXsKLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9NR01UX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5tZ210X2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX01HTVRfRExZIDsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfUlgpCi0JewotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9SWCkgPT0gMCkKLQkJewotCi0JCQkvKiBtYXNrIFJ4SU5UICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfUlgpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+cnhfZG9uZV90YXNrKTsKLQkJfQotCQlwQWQtPmludF9wZW5kaW5nIHw9IElOVF9SWDsKLQl9Ci0KLQotCWlmIChJbnRTb3VyY2Uud29yZCAmIElOVF9BQzNfRExZKQotCXsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzNfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDM19ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMzX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDM19ETFk7Ci0JfQotCi0JaWYgKEludFNvdXJjZS53b3JkICYgSU5UX0FDMl9ETFkpCi0JewotCi0JCWlmICgocEFkLT5pbnRfZGlzYWJsZV9tYXNrICYgSU5UX0FDMl9ETFkpID09IDApCi0JCXsKLQkJCS8qIG1hc2sgVHhEYXRhSW50ICovCi0JCQlydDI4NjBfaW50X2Rpc2FibGUocEFkLCBJTlRfQUMyX0RMWSk7Ci0JCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwT2JqLT5hYzJfZG1hX2RvbmVfdGFzayk7Ci0JCX0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMyX0RMWTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMxX0RMWSkKLQl7Ci0KLQkJcEFkLT5pbnRfcGVuZGluZyB8PSBJTlRfQUMxX0RMWTsKLQotCQlpZiAoKHBBZC0+aW50X2Rpc2FibGVfbWFzayAmIElOVF9BQzFfRExZKSA9PSAwKQotCQl7Ci0JCQkvKiBtYXNrIFR4RGF0YUludCAqLwotCQkJcnQyODYwX2ludF9kaXNhYmxlKHBBZCwgSU5UX0FDMV9ETFkpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcE9iai0+YWMxX2RtYV9kb25lX3Rhc2spOwotCQl9Ci0KLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBJTlRfQUMwX0RMWSkKLQl7Ci0KLS8qCi0JCWlmIChJbnRTb3VyY2Uud29yZCAmIDB4MikgewotCQkJdTMyIHJlZzsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgREVMQVlfSU5UX0NGRywgJnJlZyk7Ci0JCQlwcmludGsoIkludFNvdXJjZS53b3JkID0gJTA4eCwgREVMQVlfUkVHID0gJTA4eFxuIiwgSW50U291cmNlLndvcmQsIHJlZyk7Ci0JCX0KLSovCi0JCXBBZC0+aW50X3BlbmRpbmcgfD0gSU5UX0FDMF9ETFk7Ci0KLQkJaWYgKChwQWQtPmludF9kaXNhYmxlX21hc2sgJiBJTlRfQUMwX0RMWSkgPT0gMCkKLQkJewotCQkJLyogbWFzayBUeERhdGFJbnQgKi8KLQkJCXJ0Mjg2MF9pbnRfZGlzYWJsZShwQWQsIElOVF9BQzBfRExZKTsKLQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnBPYmotPmFjMF9kbWFfZG9uZV90YXNrKTsKLQkJfQotCi0JfQotCi0KLQlpZiAoSW50U291cmNlLndvcmQgJiBQcmVUQlRUSW50KQotCXsKLQkJUlRNUEhhbmRsZVByZVRCVFRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQlpZiAoSW50U291cmNlLndvcmQgJiBUQlRUSW50KQotCXsKLQkJUlRNUEhhbmRsZVRCVFRJbnRlcnJ1cHQocEFkKTsKLQl9Ci0KLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlJRl9ERVZfQ09ORklHX09QTU9ERV9PTl9TVEEocEFkKQotCXsKLQkJaWYgKEludFNvdXJjZS53b3JkICYgQXV0b1dha2V1cEludCkKLQkJCVJUTVBIYW5kbGVUd2FrZXVwSW50ZXJydXB0KHBBZCk7Ci0JfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSwwKQotCXJldHVybiAgSVJRX0hBTkRMRUQ7Ci0jZW5kaWYKLQotfQotCi0vKgotICogaW52YWlsZCBvciB3cml0ZWJhY2sgY2FjaGUKLSAqIGFuZCBjb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCi0gKi8KLWRtYV9hZGRyX3QgbGludXhfcGNpX21hcF9zaW5nbGUodm9pZCAqaGFuZGxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplLCBpbnQgc2RfaWR4LCBpbnQgZGlyZWN0aW9uKQotewotCVBSVE1QX0FEQVBURVIgcEFkOwotCVBPU19DT09LSUUgcE9iajsKLQotCS8qCi0JCS0tLS0tLSBQb3J0aW5nIEluZm9ybWF0aW9uIC0tLS0tLQotCQk+IEZvciBUeCBBbGxvYzoKLQkJCW1nbXQgcGFja2V0cyA9PiBzZF9pZHggPSAwCi0JCQlTd0lkeDogcEFkLT5NZ210UmluZy5UeENwdUlkeAotCQkJcFR4RCA6IHBBZC0+TWdtdFJpbmcuQ2VsbFtTd0lkeF0uQWxsb2NWYTsKLQotCQkJZGF0YSBwYWNrZXRzID0+IHNkX2lkeCA9IDEKLQkJCVR4SWR4IDogcEFkLT5UeFJpbmdbcFR4QmxrLT5RdWVJZHhdLlR4Q3B1SWR4Ci0JCQlRdWVJZHg6IHBUeEJsay0+UXVlSWR4Ci0JCQlwVHhEICA6IHBBZC0+VHhSaW5nW3BUeEJsay0+UXVlSWR4XS5DZWxsW1R4SWR4XS5BbGxvY1ZhOwotCi0JCT4gRm9yIFJ4IEFsbG9jOgotCQkJc2RfaWR4ID0gLTEKLQkqLwotCi0JcEFkID0gKFBSVE1QX0FEQVBURVIpaGFuZGxlOwotCXBPYmogPSAoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZTsKLQotCWlmIChzZF9pZHggPT0gMSkKLQl7Ci0JCVBUWF9CTEsJCXBUeEJsazsKLQkJcFR4QmxrID0gKFBUWF9CTEspcHRyOwotCQlyZXR1cm4gcGNpX21hcF9zaW5nbGUocE9iai0+cGNpX2RldiwgcFR4QmxrLT5wU3JjQnVmRGF0YSwgcFR4QmxrLT5TcmNCdWZMZW4sIGRpcmVjdGlvbik7Ci0JfQotCWVsc2UKLQl7Ci0JCXJldHVybiBwY2lfbWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7Ci0JfQotCi19Ci0KLXZvaWQgbGludXhfcGNpX3VubWFwX3NpbmdsZSh2b2lkICpoYW5kbGUsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQotewotCVBSVE1QX0FEQVBURVIgcEFkOwotCVBPU19DT09LSUUgcE9iajsKLQotCXBBZD0oUFJUTVBfQURBUFRFUiloYW5kbGU7Ci0JcE9iaiA9IChQT1NfQ09PS0lFKXBBZC0+T1NfQ29va2llOwotCi0JcGNpX3VubWFwX3NpbmdsZShwT2JqLT5wY2lfZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X3Byb2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhMDU5MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0X3Byb2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXJ0X3Byb2ZpbGUuYwotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotI2luY2x1ZGUgInJ0X2NvbmZpZy5oIgotCi0KLU5ESVNfU1RBVFVTCVJUTVBSZWFkUGFyYW1ldGVyc0hvb2soCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JUFNUUklORwkJCQkJc3JjID0gTlVMTDsKLQlSVE1QX09TX0ZECQkJCXNyY2Y7Ci0JUlRNUF9PU19GU19JTkZPCQkJb3NGU0luZm87Ci0JSU5UCQkJCQkJcmV0dmFsID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQlQU1RSSU5HCQkJCQlidWZmZXI7Ci0KLQlidWZmZXIgPSBrbWFsbG9jKE1BWF9JTklfQlVGRkVSX1NJWkUsIE1FTV9BTExPQ19GTEFHKTsKLQlpZihidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JbWVtc2V0KGJ1ZmZlciwgMHgwMCwgTUFYX0lOSV9CVUZGRVJfU0laRSk7Ci0KLQl7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQkJSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKHBBZCkKLQkJewotCQkJc3JjID0gU1RBX1BST0ZJTEVfUEFUSDsKLQkJfQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotCQlzcmMgPSAoUFNUUklORylwQWQtPk1DX0ZpbGVOYW1lOwotI2VuZGlmIC8vIE1VTFRJUExFX0NBUkRfU1VQUE9SVCAvLwotCX0KLQotCWlmIChzcmMgJiYgKnNyYykKLQl7Ci0JCVJ0bXBPU0ZTSW5mb0NoYW5nZSgmb3NGU0luZm8sIFRSVUUpOwotCQlzcmNmID0gUnRtcE9TRmlsZU9wZW4oc3JjLCBPX1JET05MWSwgMCk7Ci0JCWlmIChJU19GSUxFX09QRU5fRVJSKHNyY2YpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJPcGVuIGZpbGUgXCIlc1wiIGZhaWxlZCFcbiIsIHNyYykpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dmFsID1SdG1wT1NGaWxlUmVhZChzcmNmLCBidWZmZXIsIE1BWF9JTklfQlVGRkVSX1NJWkUpOwotCQkJaWYgKHJldHZhbCA+IDApCi0JCQl7Ci0JCQkJUlRNUFNldFByb2ZpbGVQYXJhbWV0ZXJzKHBBZCwgYnVmZmVyKTsKLQkJCQlyZXR2YWwgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJfQotCQkJZWxzZQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlJlYWQgZmlsZSBcIiVzXCIgZmFpbGVkKGVyckNvZGU9JWQpIVxuIiwgc3JjLCByZXR2YWwpKTsKLQotCQkJcmV0dmFsID0gUnRtcE9TRmlsZUNsb3NlKHNyY2YpOwotCQkJaWYgKCByZXR2YWwgIT0gMCkKLQkJCXsKLQkJCQlyZXR2YWwgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIkNsb3NlIGZpbGUgXCIlc1wiIGZhaWxlZChlcnJDb2RlPSVkKSFcbiIsIHNyYywgcmV0dmFsKSk7Ci0JCQl9Ci0JCX0KLQotCQlSdG1wT1NGU0luZm9DaGFuZ2UoJm9zRlNJbmZvLCBGQUxTRSk7Ci0JfQotCi0Ja2ZyZWUoYnVmZmVyKTsKLQotCXJldHVybiAocmV0dmFsKTsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmNmQwYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4NzMgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBydG1wLmgKLQotICAgIEFic3RyYWN0OgotICAgIE1pbmlwb3J0IGdlbmVyaWMgcG9ydGlvbiBoZWFkZXIgZmlsZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAyMDAyLTA4LTAxICAgIGNyZWF0ZWQKLSAgICBKYW1lcyBUYW4gICAyMDAyLTA5LTA2ICAgIG1vZGlmaWVkIChSZXZpc2UgTlRDUmVnVGFibGUpCi0gICAgSm9obiBDaGFuZyAgMjAwNC0wOS0wNiAgICBtb2RpZmllZCBmb3IgUlQyNjAwCi0qLwotI2lmbmRlZiBfX1JUTVBfSF9fCi0jZGVmaW5lIF9fUlRNUF9IX18KLQotI2luY2x1ZGUgImxpbmtfbGlzdC5oIgotI2luY2x1ZGUgInNwZWN0cnVtX2RlZi5oIgotCi0jaW5jbHVkZSAicnRtcF9kb3QxMS5oIgotCi0jaWZkZWYgTUxNRV9FWAotI2luY2x1ZGUgIm1sbWVfZXhfZGVmLmgiCi0jZW5kaWYgLy8gTUxNRV9FWCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSN1bmRlZiBBUF9XU0NfSU5DTFVERUQKLSN1bmRlZiBTVEFfV1NDX0lOQ0xVREVECi0jdW5kZWYgV1NDX0lOQ0xVREVECi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0jaWYgZGVmaW5lZChBUF9XU0NfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RBX1dTQ19JTkNMVURFRCkKLSNkZWZpbmUgV1NDX0lOQ0xVREVECi0jZW5kaWYKLQotCi0KLQotCi0jaW5jbHVkZSAicnRtcF9jaGlwLmgiCi0KLQotCi10eXBlZGVmIHN0cnVjdCBfUlRNUF9BREFQVEVSCQlSVE1QX0FEQVBURVI7Ci10eXBlZGVmIHN0cnVjdCBfUlRNUF9BREFQVEVSCQkqUFJUTVBfQURBUFRFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfQ0hJUF9PUF8gUlRNUF9DSElQX09QOwotCi0KLS8vI2RlZmluZSBEQkcJCTEKLQotLy8jZGVmaW5lIERCR19ESUFHTk9TRQkJMQotCi0KLS8vKysrQWRkIGJ5IHNoaWFuZyBmb3IgbWVyZ2UgTWluaXBvcnRNTVJlcXVlc3QoKSBhbmQgTWluaXBvcnREYXRhTU1SZXF1ZXN0KCkgaW50byBvbmUgZnVuY3Rpb24KLSNkZWZpbmUgTUFYX0RBVEFNTV9SRVRSWQkzCi0jZGVmaW5lIE1HTVRfVVNFX1FVRVVFX0ZMQUcJMHg4MAotLy8tLS1BZGQgYnkgc2hpYW5nIGZvciBtZXJnZSBNaW5pcG9ydE1NUmVxdWVzdCgpIGFuZCBNaW5pcG9ydERhdGFNTVJlcXVlc3QoKSBpbnRvIG9uZSBmdW5jdGlvbgotCi0jZGVmaW5lCU1BWFNFUQkJKDB4RkZGKQotCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUF9TVVBQT1JUKSAmJiBkZWZpbmVkKENPTkZJR19TVEFfU1VQUE9SVCkKLSNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkJaWYoX3BBZC0+T3BNb2RlID09IE9QTU9ERV9BUCkKLSNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCWlmKF9wQWQtPk9wTW9kZSA9PSBPUE1PREVfU1RBKQotI2Vsc2UKLSNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fQVAoX3BBZCkKLSNkZWZpbmUgSUZfREVWX0NPTkZJR19PUE1PREVfT05fU1RBKF9wQWQpCi0jZW5kaWYKLQotZXh0ZXJuICB1bnNpZ25lZCBjaGFyICAgU05BUF9BSVJPTkVUW107Ci1leHRlcm4gIHVuc2lnbmVkIGNoYXIgICBDSVNDT19PVUlbXTsKLWV4dGVybiAgVUNIQVIJQmFTaXplQXJyYXlbNF07Ci0KLWV4dGVybiBVQ0hBUiBCUk9BRENBU1RfQUREUltNQUNfQUREUl9MRU5dOwotZXh0ZXJuIFVDSEFSIFpFUk9fTUFDX0FERFJbTUFDX0FERFJfTEVOXTsKLWV4dGVybiBVTE9ORyBCSVQzMlszMl07Ci1leHRlcm4gVUNIQVIgQklUOFs4XTsKLWV4dGVybiBjaGFyKiBDaXBoZXJOYW1lW107Ci1leHRlcm4gY2hhciogTUNTVG9NYnBzW107Ci1leHRlcm4gVUNIQVIJIFJ4d2lNQ1NUb09mZG1SYXRlWzEyXTsKLWV4dGVybiBVQ0hBUiBTTkFQXzgwMl8xSFs2XTsKLWV4dGVybiBVQ0hBUiBTTkFQX0JSSURHRV9UVU5ORUxbNl07Ci1leHRlcm4gVUNIQVIgU05BUF9BSVJPTkVUWzhdOwotZXh0ZXJuIFVDSEFSIENLSVBfTExDX1NOQVBbOF07Ci1leHRlcm4gVUNIQVIgRUFQT0xfTExDX1NOQVBbOF07Ci1leHRlcm4gVUNIQVIgRUFQT0xbMl07Ci1leHRlcm4gVUNIQVIgSVBYWzJdOwotZXh0ZXJuIFVDSEFSIEFQUExFX1RBTEtbMl07Ci1leHRlcm4gVUNIQVIgUmF0ZUlkVG9QbGNwU2lnbmFsWzEyXTsgLy8gc2VlIElFRUU4MDIuMTFhLTE5OTkgcC4xNAotZXh0ZXJuIFVDSEFSCSBPZmRtUmF0ZVRvUnh3aU1DU1tdOwotZXh0ZXJuIFVDSEFSIE9mZG1TaWduYWxUb1JhdGVJZFsxNl0gOwotZXh0ZXJuIFVDSEFSIGRlZmF1bHRfY3dtaW5bNF07Ci1leHRlcm4gVUNIQVIgZGVmYXVsdF9jd21heFs0XTsKLWV4dGVybiBVQ0hBUiBkZWZhdWx0X3N0YV9haWZzbls0XTsKLWV4dGVybiBVQ0hBUiBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5WzhdOwotCi1leHRlcm4gVVNIT1JUIFJhdGVVcFBFUltdOwotZXh0ZXJuIFVTSE9SVCBSYXRlRG93blBFUltdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUJOZXh0UmF0ZURvd253YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQk5leHRSYXRlVXB3YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZURvd253YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQkdOZXh0UmF0ZVVwd2FyZFtdOwotZXh0ZXJuIFVDSEFSICBQaHkxMUFOZXh0UmF0ZURvd253YXJkW107Ci1leHRlcm4gVUNIQVIgIFBoeTExQU5leHRSYXRlVXB3YXJkW107Ci1leHRlcm4gQ0hBUiAgIFJzc2lTYWZlTGV2ZWxGb3JUeFJhdGVbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZUlkVG9NYnBzW107Ci1leHRlcm4gVVNIT1JUIFJhdGVJZFRvNTAwS2Jwc1tdOwotCi1leHRlcm4gVUNIQVIgIENpcGhlclN1aXRlV3BhTm9uZVRraXBbXTsKLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lVGtpcExlbjsKLQotZXh0ZXJuIFVDSEFSICBDaXBoZXJTdWl0ZVdwYU5vbmVBZXNbXTsKLWV4dGVybiBVQ0hBUiAgQ2lwaGVyU3VpdGVXcGFOb25lQWVzTGVuOwotCi1leHRlcm4gVUNIQVIgIFNzaWRJZTsKLWV4dGVybiBVQ0hBUiAgU3VwUmF0ZUllOwotZXh0ZXJuIFVDSEFSICBFeHRSYXRlSWU7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLWV4dGVybiBVQ0hBUiAgSHRDYXBJZTsKLWV4dGVybiBVQ0hBUiAgQWRkSHRJbmZvSWU7Ci1leHRlcm4gVUNIQVIgIE5ld0V4dENoYW5JZTsKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1leHRlcm4gVUNIQVIgIEV4dEh0Q2FwSWU7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1leHRlcm4gVUNIQVIgIEVycEllOwotZXh0ZXJuIFVDSEFSICBEc0llOwotZXh0ZXJuIFVDSEFSICBUaW1JZTsKLWV4dGVybiBVQ0hBUiAgV3BhSWU7Ci1leHRlcm4gVUNIQVIgIFdwYTJJZTsKLWV4dGVybiBVQ0hBUiAgSWJzc0llOwotZXh0ZXJuIFVDSEFSICBDY3gySWU7Ci1leHRlcm4gVUNIQVIgIFdhcGlJZTsKLQotZXh0ZXJuIFVDSEFSICBXUEFfT1VJW107Ci1leHRlcm4gVUNIQVIgIFJTTl9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgV0FQSV9PVUlbXTsKLWV4dGVybiBVQ0hBUiAgV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSICBXTUVfUEFSTV9FTEVNW107Ci1leHRlcm4gVUNIQVIgIENjeDJRb3NJbmZvW107Ci1leHRlcm4gVUNIQVIgIENjeDJJZUluZm9bXTsKLWV4dGVybiBVQ0hBUiAgUkFMSU5LX09VSVtdOwotZXh0ZXJuIFVDSEFSICBQb3dlckNvbnN0cmFpbnRJRVtdOwotCi0KLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlW107Ci1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQltdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUdbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR1tdOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1leHRlcm4gVUNIQVIgIFJhdGVTd2l0Y2hUYWJsZTExQkdOMVNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFCR04yU1tdOwotZXh0ZXJuIFVDSEFSICBSYXRlU3dpdGNoVGFibGUxMUJHTjJTRm9yQUJhbmRbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMVNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNbXTsKLWV4dGVybiBVQ0hBUiAgUmF0ZVN3aXRjaFRhYmxlMTFOMlNGb3JBQmFuZFtdOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1leHRlcm4gVUNIQVIgIFBSRV9OX0hUX09VSVtdOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBSQUxJTktfQVRFCi10eXBlZGVmCXN0cnVjdCBfQVRFX0lORk8gewotCVVDSEFSCU1vZGU7Ci0JQ0hBUglUeFBvd2VyMDsKLQlDSEFSCVR4UG93ZXIxOwotCUNIQVIgICAgVHhBbnRlbm5hU2VsOwotCUNIQVIgICAgUnhBbnRlbm5hU2VsOwotCVRYV0lfU1RSVUMgIFR4V0k7CSAgLy8gVFhXSQotCVVTSE9SVAlRSUQ7Ci0JVUNIQVIJQWRkcjFbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUglBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSCUFkZHIzW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJQ2hhbm5lbDsKLQlVSU5UMzIJVHhMZW5ndGg7Ci0JVUlOVDMyCVR4Q291bnQ7Ci0JVUlOVDMyCVR4RG9uZUNvdW50OyAvLyBUeCBETUEgRG9uZQotCVVJTlQzMglSRkZyZXFPZmZzZXQ7Ci0JQk9PTEVBTgliUnhGRVI7CQkvLyBTaG93IFJ4IEZyYW1lIEVycm9yIFJhdGUKLQlCT09MRUFOCWJRQVR4U3RhcnQ7IC8vIEhhdmUgY29tcGlsZWQgUUEgaW4gYW5kIHVzZSBpdCB0byBBVEUgdHguCi0JQk9PTEVBTgliUUFSeFN0YXJ0OwkvLyBIYXZlIGNvbXBpbGVkIFFBIGluIGFuZCB1c2UgaXQgdG8gQVRFIHJ4LgotI2lmZGVmIFJUTVBfTUFDX1BDSQotCUJPT0xFQU4JYkZXTG9hZGluZzsJLy8gUmVsb2FkIGZpcm13YXJlIHdoZW4gQVRFIGlzIGRvbmUuCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JVUlOVDMyCVJ4VG90YWxDbnQ7Ci0JVUlOVDMyCVJ4Q250UGVyU2VjOwotCi0JQ0hBUglMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBTTlIKLQlDSEFSICAgIExhc3RTTlIxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFNOUiBmb3IgMm5kICBhbnRlbm5hCi0JQ0hBUiAgICBMYXN0UnNzaTA7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJCi0JQ0hBUiAgICBMYXN0UnNzaTE7ICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBSU1NJIGZvciAybmQgIGFudGVubmEKLQlDSEFSICAgIExhc3RSc3NpMjsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kgZm9yIDNyZCAgYW50ZW5uYQotCUNIQVIgICAgQXZnUnNzaTA7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQotCUNIQVIgICAgQXZnUnNzaTE7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQotCUNIQVIgICAgQXZnUnNzaTI7ICAgICAgICAgICAgIC8vIGxhc3QgOCBmcmFtZXMnIGF2ZXJhZ2UgUlNTSQotCVNIT1JUICAgQXZnUnNzaTBYODsgICAgICAgICAgIC8vIHN1bSBvZiBsYXN0IDggZnJhbWVzJyBSU1NJCi0JU0hPUlQgICBBdmdSc3NpMVg4OyAgICAgICAgICAgLy8gc3VtIG9mIGxhc3QgOCBmcmFtZXMnIFJTU0kKLQlTSE9SVCAgIEF2Z1Jzc2kyWDg7ICAgICAgICAgICAvLyBzdW0gb2YgbGFzdCA4IGZyYW1lcycgUlNTSQotCi0JVUlOVDMyCU51bU9mQXZnUnNzaVNhbXBsZTsKLQotCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkvLyBUeCBmcmFtZQotCVVTSE9SVAkJSExlbjsgLy8gSGVhZGVyIExlbmd0aAotCVVTSE9SVAkJUExlbjsgLy8gUGF0dGVybiBMZW5ndGgKLQlVQ0hBUgkJSGVhZGVyWzMyXTsgLy8gSGVhZGVyIGJ1ZmZlcgotCVVDSEFSCQlQYXR0ZXJuWzMyXTsgLy8gUGF0dGVybiBidWZmZXIKLQlVU0hPUlQJCURMZW47IC8vIERhdGEgTGVuZ3RoCi0JVVNIT1JUCQlzZXE7Ci0JVUlOVDMyCQlDSUQ7Ci0JUlRNUF9PU19QSUQJQXRlUGlkOwotCS8vIGNvdW50ZXJzCi0JVUlOVDMyCQlVMk07Ci0JVUlOVDMyCQlPdGhlckRhdGE7Ci0JVUlOVDMyCQlCZWFjb247Ci0JVUlOVDMyCQlPdGhlckNvdW50OwotCVVJTlQzMgkJVHhBYzA7Ci0JVUlOVDMyCQlUeEFjMTsKLQlVSU5UMzIJCVR4QWMyOwotCVVJTlQzMgkJVHhBYzM7Ci0JLypVSU5UMzIJCVR4SENDQTsqLwotCVVJTlQzMgkJVHhNZ210OwotCVVJTlQzMgkJUlNTSTA7Ci0JVUlOVDMyCQlSU1NJMTsKLQlVSU5UMzIJCVJTU0kyOwotCVVJTlQzMgkJU05SMDsKLQlVSU5UMzIJCVNOUjE7Ci0JLy8gVHhTdGF0dXMgOiAwIC0tPiB0YXNrIGlzIGlkbGUsIDEgLS0+IHRhc2sgaXMgcnVubmluZwotCVVDSEFSCQlUeFN0YXR1czsKLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotfQlBVEVfSU5GTywgKlBBVEVfSU5GTzsKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi1zdHJ1Y3QgYXRlX3JhY2ZnaGRyIHsKLQlVSU5UMzIJCW1hZ2ljX25vOwotCVVTSE9SVAkJY29tbWFuZF90eXBlOwotCVVTSE9SVAkJY29tbWFuZF9pZDsKLQlVU0hPUlQJCWxlbmd0aDsKLQlVU0hPUlQJCXNlcXVlbmNlOwotCVVTSE9SVAkJc3RhdHVzOwotCVVDSEFSCQlkYXRhWzIwNDZdOwotfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLQotdHlwZWRlZiBzdHJ1Y3QJX1JTU0lfU0FNUExFIHsKLQlDSEFSCQkJTGFzdFJzc2kwOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKLQlDSEFSCQkJTGFzdFJzc2kxOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKLQlDSEFSCQkJTGFzdFJzc2kyOyAgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIFJTU0kKLQlDSEFSCQkJQXZnUnNzaTA7Ci0JQ0hBUgkJCUF2Z1Jzc2kxOwotCUNIQVIJCQlBdmdSc3NpMjsKLQlTSE9SVAkJCUF2Z1Jzc2kwWDg7Ci0JU0hPUlQJCQlBdmdSc3NpMVg4OwotCVNIT1JUCQkJQXZnUnNzaTJYODsKLX0gUlNTSV9TQU1QTEU7Ci0KLS8vCi0vLyAgUXVldWUgc3RydWN0dXJlIGFuZCBtYWNyb3MKLS8vCi10eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0VOVFJZICAgIHsKLQlzdHJ1Y3QgX1FVRVVFX0VOVFJZICAgICAqTmV4dDsKLX0gICBRVUVVRV9FTlRSWSwgKlBRVUVVRV9FTlRSWTsKLQotLy8gUXVldWUgc3RydWN0dXJlCi10eXBlZGVmIHN0cnVjdCAgX1FVRVVFX0hFQURFUiAgIHsKLQlQUVVFVUVfRU5UUlkgICAgSGVhZDsKLQlQUVVFVUVfRU5UUlkgICAgVGFpbDsKLQlVTE9ORyAgICAgICAgICAgTnVtYmVyOwotfSAgIFFVRVVFX0hFQURFUiwgKlBRVUVVRV9IRUFERVI7Ci0KLSNkZWZpbmUgSW5pdGlhbGl6ZVF1ZXVlSGVhZGVyKFF1ZXVlSGVhZGVyKSAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKFF1ZXVlSGVhZGVyKS0+SGVhZCA9IChRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgIFwKLQkoUXVldWVIZWFkZXIpLT5OdW1iZXIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFJlbW92ZUhlYWRRdWV1ZShRdWV1ZUhlYWRlcikgICAgICAgICAgICAgICAgXAotKFF1ZXVlSGVhZGVyKS0+SGVhZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JUFFVRVVFX0VOVFJZIHBOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWlmICgoUXVldWVIZWFkZXIpLT5IZWFkICE9IE5VTEwpCQkJCVwKLQl7CQkJCQkJCQkJCQkJXAotCQlwTmV4dCA9IChRdWV1ZUhlYWRlciktPkhlYWQtPk5leHQ7ICAgICAgICAgIFwKLQkJKFF1ZXVlSGVhZGVyKS0+SGVhZC0+TmV4dCA9IE5VTEw7CQlcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQgPSBwTmV4dDsgICAgICAgICAgICAgICAgXAotCQlpZiAocE5leHQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSBOVUxMOyAgICAgICAgICAgICBcCi0JCShRdWV1ZUhlYWRlciktPk51bWJlci0tOyAgICAgICAgICAgICAgICAgICAgXAotCX0JCQkJCQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgSW5zZXJ0SGVhZFF1ZXVlKFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KSAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSAoUXVldWVIZWFkZXIpLT5IZWFkOyBcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAotCQlpZiAoKFF1ZXVlSGVhZGVyKS0+VGFpbCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICBcCi0JCShRdWV1ZUhlYWRlciktPk51bWJlcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEluc2VydFRhaWxRdWV1ZShRdWV1ZUhlYWRlciwgUXVldWVFbnRyeSkJCQkJXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoKFBRVUVVRV9FTlRSWSlRdWV1ZUVudHJ5KS0+TmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCi0JaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkoUXVldWVIZWFkZXIpLT5UYWlsLT5OZXh0ID0gKFBRVUVVRV9FTlRSWSkoUXVldWVFbnRyeSk7IFwKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgXAotCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsgICAgICAgICAgIFwKLQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgSW5zZXJ0VGFpbFF1ZXVlQWMocEFkLCBwRW50cnksIFF1ZXVlSGVhZGVyLCBRdWV1ZUVudHJ5KQkJCVwKLXsJCQkJCQkJCQkJCQkJCQkJCQlcCi0JKChQUVVFVUVfRU5UUlkpUXVldWVFbnRyeSktPk5leHQgPSBOVUxMOwkJCQkJCQlcCi0JaWYgKChRdWV1ZUhlYWRlciktPlRhaWwpCQkJCQkJCQkJCQlcCi0JCShRdWV1ZUhlYWRlciktPlRhaWwtPk5leHQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsJCQlcCi0JZWxzZQkJCQkJCQkJCQkJCQkJCQlcCi0JCShRdWV1ZUhlYWRlciktPkhlYWQgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsJCQkJXAotCShRdWV1ZUhlYWRlciktPlRhaWwgPSAoUFFVRVVFX0VOVFJZKShRdWV1ZUVudHJ5KTsJCQkJCVwKLQkoUXVldWVIZWFkZXIpLT5OdW1iZXIrKzsJCQkJCQkJCQkJCVwKLX0KLQotCi0KLS8vCi0vLyAgTWFjcm9zIGZvciBmbGFnIGFuZCByZWYgY291bnQgb3BlcmF0aW9ucwotLy8KLSNkZWZpbmUgUlRNUF9TRVRfRkxBRyhfTSwgX0YpICAgICAgICgoX00pLT5GbGFncyB8PSAoX0YpKQotI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUcoX00sIF9GKSAgICAgKChfTSktPkZsYWdzICY9IH4oX0YpKQotI2RlZmluZSBSVE1QX0NMRUFSX0ZMQUdTKF9NKSAgICAgICAgKChfTSktPkZsYWdzID0gMCkKLSNkZWZpbmUgUlRNUF9URVNUX0ZMQUcoX00sIF9GKSAgICAgICgoKF9NKS0+RmxhZ3MgJiAoX0YpKSAhPSAwKQotI2RlZmluZSBSVE1QX1RFU1RfRkxBR1MoX00sIF9GKSAgICAgKCgoX00pLT5GbGFncyAmIChfRikpID09IChfRikpCi0vLyBNYWNybyBmb3IgcG93ZXIgc2F2ZSBmbGFnLgotI2RlZmluZSBSVE1QX1NFVF9QU0ZMQUcoX00sIF9GKSAgICAgICAoKF9NKS0+UFNGbGFncyB8PSAoX0YpKQotI2RlZmluZSBSVE1QX0NMRUFSX1BTRkxBRyhfTSwgX0YpICAgICAoKF9NKS0+UFNGbGFncyAmPSB+KF9GKSkKLSNkZWZpbmUgUlRNUF9DTEVBUl9QU0ZMQUdTKF9NKSAgICAgICAgKChfTSktPlBTRmxhZ3MgPSAwKQotI2RlZmluZSBSVE1QX1RFU1RfUFNGTEFHKF9NLCBfRikgICAgICAoKChfTSktPlBTRmxhZ3MgJiAoX0YpKSAhPSAwKQotI2RlZmluZSBSVE1QX1RFU1RfUFNGTEFHUyhfTSwgX0YpICAgICAoKChfTSktPlBTRmxhZ3MgJiAoX0YpKSA9PSAoX0YpKQotCi0jZGVmaW5lIE9QU1RBVFVTX1NFVF9GTEFHKF9wQWQsIF9GKSAgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgfD0gKF9GKSkKLSNkZWZpbmUgT1BTVEFUVVNfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICAoKF9wQWQpLT5Db21tb25DZmcuT3BTdGF0dXNGbGFncyAmPSB+KF9GKSkKLSNkZWZpbmUgT1BTVEFUVVNfVEVTVF9GTEFHKF9wQWQsIF9GKSAgICAoKChfcEFkKS0+Q29tbW9uQ2ZnLk9wU3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQotCi0jZGVmaW5lIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoX3BFbnRyeSxfRikgICAgICAoKF9wRW50cnkpLT5DbGllbnRTdGF0dXNGbGFncyB8PSAoX0YpKQotI2RlZmluZSBDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoX3BFbnRyeSxfRikgICAgKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJj0gfihfRikpCi0jZGVmaW5lIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKF9wRW50cnksX0YpICAgICAoKChfcEVudHJ5KS0+Q2xpZW50U3RhdHVzRmxhZ3MgJiAoX0YpKSAhPSAwKQotCi0jZGVmaW5lIFJYX0ZJTFRFUl9TRVRfRkxBRyhfcEFkLCBfRikgICAgKChfcEFkKS0+Q29tbW9uQ2ZnLlBhY2tldEZpbHRlciB8PSAoX0YpKQotI2RlZmluZSBSWF9GSUxURVJfQ0xFQVJfRkxBRyhfcEFkLCBfRikgICgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJj0gfihfRikpCi0jZGVmaW5lIFJYX0ZJTFRFUl9URVNUX0ZMQUcoX3BBZCwgX0YpICAgKCgoX3BBZCktPkNvbW1vbkNmZy5QYWNrZXRGaWx0ZXIgJiAoX0YpKSAhPSAwKQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZGVmaW5lIFNUQV9OT19TRUNVUklUWV9PTihfcCkgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQpCi0jZGVmaW5lIFNUQV9XRVBfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpCi0jZGVmaW5lIFNUQV9US0lQX09OKF9wKSAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0jZGVmaW5lIFNUQV9BRVNfT04oX3ApICAgICAgICAgICAgICAgICAgKF9wLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0KLSNkZWZpbmUgU1RBX1RHTl9XSUZJX09OKF9wKSAgICAgICAgICAgICAoX3AtPlN0YUNmZy5iVEduV2lmaVRlc3QgPT0gVFJVRSkKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2RlZmluZSBDS0lQX0tQX09OKF9wKQkJCQkoKCgoX3ApLT5TdGFDZmcuQ2tpcEZsYWcpICYgMHgxMCkgJiYgKChfcCktPlN0YUNmZy5iQ2tpcENtaWNPbiA9PSBUUlVFKSkKLSNkZWZpbmUgQ0tJUF9DTUlDX09OKF9wKQkJCSgoKChfcCktPlN0YUNmZy5Da2lwRmxhZykgJiAweDA4KSAmJiAoKF9wKS0+U3RhQ2ZnLmJDa2lwQ21pY09uID09IFRSVUUpKQotCi0KLSNkZWZpbmUgSU5DX1JJTkdfSU5ERVgoX2lkeCwgX1JpbmdTaXplKSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChfaWR4KSA9IChfaWR4KzEpICUgKF9SaW5nU2l6ZSk7ICAgICAgIFwKLX0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IGlzIGNvcGllZCBmcm9tIEFQIGJlYWNvbi4gIERvbid0IG5lZWQgdG8gdXBkYXRlIGhlcmUuCi0jZGVmaW5lIENPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcoX3BBZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5DaGFubmVsV2lkdGggPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoOyAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTWltb1BzID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLk1pbW9QczsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkdGID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGOyAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuU2hvcnRHSWZvcjIwID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMDsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlNob3J0R0lmb3I0MCA9IF9wQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yNDA7ICAgICAgXAotCV9wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5UeFNUQkMgPSBfcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDOyAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuUnhTVEJDID0gX3BBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQzsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LkV4dENoYW5PZmZzZXQgPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldDsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5LlJlY29tV2lkdGggPSBfcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8uUmVjb21XaWR0aDsgICAgICBcCi0JX3BBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk9wZXJhaW9uTW9kZSA9IF9wQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlOyAgICAgIFwKLQlfcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTm9uR2ZQcmVzZW50ID0gX3BBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7ICAgICAgXAotCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRDYXBhYmlsaXR5Lk1DU1NldCwgKF9wQWQpLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXQsIHNpemVvZihVQ0hBUikgKiAxNik7XAotfQotCi0jZGVmaW5lIENPUFlfQVBfSFRTRVRUSU5HU19GUk9NX0JFQUNPTihfcEFkLCBfcEh0Q2FwYWJpbGl0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9wQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSA9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemUpOwlcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTW1wc01vZGU9IChVQ0hBUikoX3BIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHMpOwlcCi0JX3BBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uTWF4UkFtcGR1RmFjdG9yID0gKFVDSEFSKShfcEh0Q2FwYWJpbGl0eS0+SHRDYXBQYXJtLk1heFJBbXBkdUZhY3Rvcik7CVwKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLy8KLS8vIE1BQ1JPIGZvciAzMi1iaXQgUENJIHJlZ2lzdGVyIHJlYWQgLyB3cml0ZQotLy8KLS8vIFVzYWdlIDogUlRNUF9JT19SRUFEMzIoCi0vLyAgICAgICAgICAgICAgUFJUTVBfQURBUFRFUiBwQWQsCi0vLyAgICAgICAgICAgICAgVUxPTkcgUmVnaXN0ZXJfT2Zmc2V0LAotLy8gICAgICAgICAgICAgIFBVTE9ORyAgcFZhbHVlKQotLy8KLS8vICAgICAgICAgUlRNUF9JT19XUklURTMyKAotLy8gICAgICAgICAgICAgIFBSVE1QX0FEQVBURVIgcEFkLAotLy8gICAgICAgICAgICAgIFVMT05HIFJlZ2lzdGVyX09mZnNldCwKLS8vICAgICAgICAgICAgICBVTE9ORyBWYWx1ZSkKLS8vCi0KLQotLy8KLS8vIENvbW1vbiBmcmFnbWVudCBsaXN0IHN0cnVjdHVyZSAtICBJZGVudGljYWwgdG8gdGhlIHNjYXR0ZXIgZ2F0aGVyIGZyYWcgbGlzdCBzdHJ1Y3R1cmUKLS8vCi0vLyNkZWZpbmUgUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UICAgICAgICAgU0NBVFRFUl9HQVRIRVJfRUxFTUVOVAotLy8jZGVmaW5lIFBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgICAgICAgIFBTQ0FUVEVSX0dBVEhFUl9FTEVNRU5UCi0jZGVmaW5lIE5JQ19NQVhfUEhZU19CVUZfQ09VTlQgICAgICAgICAgICAgIDgKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfU0NBVFRFUl9HQVRIRVJfRUxFTUVOVCB7Ci0gICAgUFZPSUQJCUFkZHJlc3M7Ci0gICAgVUxPTkcJCUxlbmd0aDsKLSAgICBQVUxPTkcJCVJlc2VydmVkOwotfSBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQsICpQUlRNUF9TQ0FUVEVSX0dBVEhFUl9FTEVNRU5UOwotCi0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX1NDQVRURVJfR0FUSEVSX0xJU1QgewotICAgIFVMT05HICBOdW1iZXJPZkVsZW1lbnRzOwotICAgIFBVTE9ORyBSZXNlcnZlZDsKLSAgICBSVE1QX1NDQVRURVJfR0FUSEVSX0VMRU1FTlQgRWxlbWVudHNbTklDX01BWF9QSFlTX0JVRl9DT1VOVF07Ci19IFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCwgKlBSVE1QX1NDQVRURVJfR0FUSEVSX0xJU1Q7Ci0KLQotLy8KLS8vICBTb21lIHV0aWxpdHkgbWFjcm9zCi0vLwotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKF9hLCBfYikgICAgICgoKF9hKSA8IChfYikpID8gKF9hKSA6IChfYikpCi0jZW5kaWYKLQotI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KF9hLCBfYikgICAgICgoKF9hKSA+IChfYikpID8gKF9hKSA6IChfYikpCi0jZW5kaWYKLQotI2RlZmluZSBHRVRfTE5BX0dBSU4oX3BBZCkJKChfcEFkLT5MYXRjaFJmUmVncy5DaGFubmVsIDw9IDE0KSA/IChfcEFkLT5CTE5BR2FpbikgOiAoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gNjQpID8gKF9wQWQtPkFMTkFHYWluMCkgOiAoKF9wQWQtPkxhdGNoUmZSZWdzLkNoYW5uZWwgPD0gMTI4KSA/IChfcEFkLT5BTE5BR2FpbjEpIDogKF9wQWQtPkFMTkFHYWluMikpKSkKLQotI2RlZmluZSBJTkNfQ09VTlRFUjY0KFZhbCkgICAgICAgICAgKFZhbC5RdWFkUGFydCsrKQotCi0jZGVmaW5lIElORlJBX09OKF9wKSAgICAgICAgICAgICAgICAoT1BTVEFUVVNfVEVTVF9GTEFHKF9wLCBmT1BfU1RBVFVTX0lORlJBX09OKSkKLSNkZWZpbmUgQURIT0NfT04oX3ApICAgICAgICAgICAgICAgIChPUFNUQVRVU19URVNUX0ZMQUcoX3AsIGZPUF9TVEFUVVNfQURIT0NfT04pKQotI2RlZmluZSBNT05JVE9SX09OKF9wKSAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuQnNzVHlwZSkgPT0gQlNTX01PTklUT1IpCi0jZGVmaW5lIElETEVfT04oX3ApICAgICAgICAgICAgICAgICAoIUlORlJBX09OKF9wKSAmJiAhQURIT0NfT04oX3ApKQotCi0vLyBDaGVjayBMRUFQICYgQ0NLTSBmbGFncwotI2RlZmluZSBMRUFQX09OKF9wKSAgICAgICAgICAgICAgICAgKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApCi0jZGVmaW5lIExFQVBfQ0NLTV9PTihfcCkgICAgICAgICAgICAoKCgoX3ApLT5TdGFDZmcuTGVhcEF1dGhNb2RlKSA9PSBDSVNDT19BdXRoTW9kZUxFQVApICYmICgoX3ApLT5TdGFDZmcuTGVhcEF1dGhJbmZvLkNDS00gPT0gVFJVRSkpCi0KLS8vIGlmIG9yZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsIHRoZW4gYW4gZXh0cmEgTExDL1NOQVAgZW5jYXAgaXMgcmVxdWlyZWQKLSNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChfcEJ1ZlZBLCBfcEV4dHJhTGxjU25hcEVuY2FwKQkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0JaWYgKCgoKihfcEJ1ZlZBICsgMTIpIDw8IDgpICsgKihfcEJ1ZlZBICsgMTMpKSA+IDE1MDApCQlcCi0JewkJCQkJCQkJCQkJCQkJCVwKLQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfODAyXzFIOwkJCQkJCVwKLQkJaWYgKE5kaXNFcXVhbE1lbW9yeShJUFgsIF9wQnVmVkEgKyAxMiwgMikgfHwJCQlcCi0JCQlOZGlzRXF1YWxNZW1vcnkoQVBQTEVfVEFMSywgX3BCdWZWQSArIDEyLCAyKSkJCVwKLQkJewkJCQkJCQkJCQkJCQkJXAotCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJXAotCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJXAotfQotCi0vLyBOZXcgRGVmaW5lIGZvciBuZXcgVHggUGF0aC4KLSNkZWZpbmUgRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQoX3BCdWZWQSwgX3BFeHRyYUxsY1NuYXBFbmNhcCkJXAotewkJCQkJCQkJCQkJCQkJCQlcCi0JaWYgKCgoKihfcEJ1ZlZBKSA8PCA4KSArICooX3BCdWZWQSArIDEpKSA+IDE1MDApCQkJXAotCXsJCQkJCQkJCQkJCQkJCQlcCi0JCV9wRXh0cmFMbGNTbmFwRW5jYXAgPSBTTkFQXzgwMl8xSDsJCQkJCQlcCi0JCWlmIChOZGlzRXF1YWxNZW1vcnkoSVBYLCBfcEJ1ZlZBLCAyKSB8fAkJCQkJXAotCQkJTmRpc0VxdWFsTWVtb3J5KEFQUExFX1RBTEssIF9wQnVmVkEsIDIpKQkJCVwKLQkJewkJCQkJCQkJCQkJCQkJXAotCQkJX3BFeHRyYUxsY1NuYXBFbmNhcCA9IFNOQVBfQlJJREdFX1RVTk5FTDsJCQlcCi0JCX0JCQkJCQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJXAotCWVsc2UJCQkJCQkJCQkJCQkJCVwKLQl7CQkJCQkJCQkJCQkJCQkJXAotCQlfcEV4dHJhTGxjU25hcEVuY2FwID0gTlVMTDsJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJCQkJXAotfQotCi0KLSNkZWZpbmUgTUFLRV84MDJfM19IRUFERVIoX3AsIF9wTWFjMSwgX3BNYWMyLCBfcFR5cGUpICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGlzTW92ZU1lbW9yeShfcCwgX3BNYWMxLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4pLCBfcE1hYzIsIE1BQ19BRERSX0xFTik7ICAgICAgICAgIFwKLSAgICBOZGlzTW92ZU1lbW9yeSgoX3AgKyBNQUNfQUREUl9MRU4gKiAyKSwgX3BUeXBlLCBMRU5HVEhfODAyXzNfVFlQRSk7IFwKLX0KLQotLy8gaWYgcERhdGEgaGFzIG5vIExMQy9TTkFQIChuZWl0aGVyIFJGQzEwNDIgbm9yIEJyaWRnZSB0dW5uZWwpLCBrZWVwIGl0IHRoYXQgd2F5LgotLy8gZWxzZSBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgTExDL1NOQVAtZW5jYXBlZCBJUFggb3IgQVBQTEVUQUxLLCBwcmVzZXJ2ZSB0aGUgTExDL1NOQVAgZmllbGQKLS8vIGVsc2UgcmVtb3ZlIHRoZSBMTEMvU05BUCBmaWVsZCBmcm9tIHRoZSByZXN1bHQgRXRoZXJuZXQgZnJhbWUKLS8vIFBhdGNoIGZvciBXSFFMIG9ubHksIHdoaWNoIGRpZCBub3QgdHVybiBvbiBOZXRiaW9zIGJ1dCB1c2UgSVBYIHdpdGhpbiBpdHMgcGF5bG9hZAotLy8gTm90ZToKLS8vICAgICBfcERhdGEgJiBfRGF0YVNpemUgbWF5IGJlIGFsdGVyZWQgKHJlbW92ZSA4LWJ5dGUgTExDL1NOQVApIGJ5IHRoaXMgTUFDUk8KLS8vICAgICBfcFJlbW92ZWRMTENTTkFQOiBwb2ludGVyIHRvIHJlbW92ZWQgTExDL1NOQVA7IE5VTEwgaXMgbm90IHJlbW92ZWQKLSNkZWZpbmUgQ09OVkVSVF9UT184MDJfMyhfcDgwMjNoZHIsIF9wREEsIF9wU0EsIF9wRGF0YSwgX0RhdGFTaXplLCBfcFJlbW92ZWRMTENTTkFQKSAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIExMQ19MZW5bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfcFJlbW92ZWRMTENTTkFQID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpICB8fCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfQlJJREdFX1RVTk5FTCwgX3BEYXRhLCA2KSkgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgUFVDSEFSIHBQcm90byA9IF9wRGF0YSArIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChOZGlzRXF1YWxNZW1vcnkoSVBYLCBwUHJvdG8sIDIpIHx8IE5kaXNFcXVhbE1lbW9yeShBUFBMRV9UQUxLLCBwUHJvdG8sIDIpKSAmJiAgXAotICAgICAgICAgICAgTmRpc0VxdWFsTWVtb3J5KFNOQVBfODAyXzFILCBfcERhdGEsIDYpKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTExDX0xlblswXSA9IChVQ0hBUikoX0RhdGFTaXplIC8gMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTExDX0xlblsxXSA9IChVQ0hBUikoX0RhdGFTaXplICUgMjU2KTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBMTENfTGVuKTsgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgTUFLRV84MDJfM19IRUFERVIoX3A4MDIzaGRyLCBfcERBLCBfcFNBLCBwUHJvdG8pOyAgICAgICAgICAgXAotICAgICAgICAgICAgX3BSZW1vdmVkTExDU05BUCA9IF9wRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX0RhdGFTaXplIC09IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX3BEYXRhICs9IExFTkdUSF84MDJfMV9IOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBMTENfTGVuWzBdID0gKFVDSEFSKShfRGF0YVNpemUgLyAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBMTENfTGVuWzFdID0gKFVDSEFSKShfRGF0YVNpemUgJSAyNTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBNQUtFXzgwMl8zX0hFQURFUihfcDgwMjNoZHIsIF9wREEsIF9wU0EsIExMQ19MZW4pOyAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0KLS8vIEVucXVldWUgdGhpcyBmcmFtZSB0byBNTE1FIGVuZ2luZQotLy8gV2UgbmVlZCB0byBlbnF1ZXVlIHRoZSB3aG9sZSBmcmFtZSBiZWNhdXNlIE1MTUUgbmVlZCB0byBwYXNzIGRhdGEgdHlwZQotLy8gaW5mb3JtYXRpb24gZnJvbSA4MDIuMTEgaGVhZGVyCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jZGVmaW5lIFJFUE9SVF9NR01UX0ZSQU1FX1RPX01MTUUoX3BBZCwgV2NpZCwgX3BGcmFtZSwgX0ZyYW1lU2l6ZSwgX1Jzc2kwLCBfUnNzaTEsIF9Sc3NpMiwgX1BsY3BTaWduYWwpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVJTlQzMiBIaWdoMzJUU0YsIExvdzMyVFNGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUlRNUF9JT19SRUFEMzIoX3BBZCwgVFNGX1RJTUVSX0RXMSwgJkhpZ2gzMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJUTVBfSU9fUkVBRDMyKF9wQWQsIFRTRl9USU1FUl9EVzAsICZMb3czMlRTRik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNbG1lRW5xdWV1ZUZvclJlY3YoX3BBZCwgV2NpZCwgSGlnaDMyVFNGLCBMb3czMlRTRiwgKFVDSEFSKV9Sc3NpMCwgKFVDSEFSKV9Sc3NpMSwoVUNIQVIpX1Jzc2kyLF9GcmFtZVNpemUsIF9wRnJhbWUsIChVQ0hBUilfUGxjcFNpZ25hbCk7ICAgXAotfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jZGVmaW5lIE1BQ19BRERSX0VRVUFMKHBBZGRyMSxwQWRkcjIpICAgICAgICAgICBSVE1QRXF1YWxNZW1vcnkoKFBWT0lEKShwQWRkcjEpLCAoUFZPSUQpKHBBZGRyMiksIE1BQ19BRERSX0xFTikKLSNkZWZpbmUgU1NJRF9FUVVBTChzc2lkMSwgbGVuMSwgc3NpZDIsIGxlbjIpICAgICgobGVuMT09bGVuMikgJiYgKFJUTVBFcXVhbE1lbW9yeShzc2lkMSwgc3NpZDIsIGxlbjEpKSkKLQotLy8KLS8vIENoZWNrIGlmIGl0IGlzIEphcGFuIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVsLgotLy8KLSNkZWZpbmUgSmFwYW5DaGFubmVsQ2hlY2soY2hhbm5lbCkgICgoY2hhbm5lbCA9PSA1MikgfHwgKGNoYW5uZWwgPT0gNTYpIHx8IChjaGFubmVsID09IDYwKSB8fCAoY2hhbm5lbCA9PSA2NCkpCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNkZWZpbmUgU1RBX0VYVFJBX1NFVFRJTkcoX3BBZCkKLQotI2RlZmluZSBTVEFfUE9SVF9TRUNVUkVEKF9wQWQpIFwKLXsgXAotCUJPT0xFQU4JQ2FuY2VsbGVkOyBcCi0JKF9wQWQpLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsgXAotCU5kaXNBY3F1aXJlU3BpbkxvY2soJigoX3BBZCktPk1hY1RhYkxvY2spKTsgXAotCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUG9ydFNlY3VyZWQgPSAoX3BBZCktPlN0YUNmZy5Qb3J0U2VjdXJlZDsgXAotCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyQWNjZXB0QWxsO1wKLQlOZGlzUmVsZWFzZVNwaW5Mb2NrKCYoX3BBZCktPk1hY1RhYkxvY2spOyBcCi0JUlRNUENhbmNlbFRpbWVyKCYoKF9wQWQpLT5NbG1lLkxpbmtEb3duVGltZXIpLCAmQ2FuY2VsbGVkKTtcCi0JU1RBX0VYVFJBX1NFVFRJTkcoX3BBZCk7IFwKLX0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLS8vCi0vLyAgRGF0YSBidWZmZXIgZm9yIERNQSBvcGVyYXRpb24sIHRoZSBidWZmZXIgbXVzdCBiZSBjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeQotLy8gIEJvdGggRE1BIHRvIC8gZnJvbSBDUFUgdXNlIHRoZSBzYW1lIHN0cnVjdHVyZS4KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1JUTVBfRE1BQlVGCi17Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOwotCVBWT0lEICAgICAgICAgICAgICAgICAgIEFsbG9jVmE7ICAgICAgICAgICAgLy8gVHhCdWYgdmlydHVhbCBhZGRyZXNzCi0JTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBUeEJ1ZiBwaHlzaWNhbCBhZGRyZXNzCi19IFJUTVBfRE1BQlVGLCAqUFJUTVBfRE1BQlVGOwotCi0KLS8vCi0vLyBDb250cm9sIGJsb2NrIChEZXNjcmlwdG9yKSBmb3IgYWxsIHJpbmcgZGVzY3JpcHRvciBETUEgb3BlcmF0aW9uLCBidWZmZXIgbXVzdCBiZQotLy8gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIE5ESVNfUEFDS0VUIHN0b3JlZCB0aGUgYmluZGluZyBSeCBwYWNrZXQgZGVzY3JpcHRvcgotLy8gd2hpY2ggd29uJ3QgYmUgcmVsZWFzZWQsIGRyaXZlciBoYXMgdG8gd2FpdCB1bnRpbCB1cHBlciBsYXllciByZXR1cm4gdGhlIHBhY2tldAotLy8gYmVmb3JlIGdpdmVpbmcgdXAgdGhpcyByeCByaW5nIGRlc2NyaXB0b3IgdG8gQVNJQy4gTkRJU19CVUZGRVIgaXMgYXNzb2NhaXRlZCBwYWlyCi0vLyB0byBkZXNjcmliZSB0aGUgcGFja2V0IGJ1ZmZlci4gRm9yIFR4LCBORElTX1BBQ0tFVCBzdG9yZWQgdGhlIHR4IHBhY2tldCBkZXNjcmlwdG9yCi0vLyB3aGljaCBkcml2ZXIgc2hvdWxkIEFDSyB1cHBlciBsYXllciB3aGVuIHRoZSB0eCBpcyBwaHlzaWNhbGx5IGRvbmUgb3IgZmFpbGVkLgotLy8KLXR5cGVkZWYgc3RydWN0IF9SVE1QX0RNQUNCCi17Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgQWxsb2NTaXplOyAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHNpemUKLQlQVk9JRCAgICAgICAgICAgICAgICAgICBBbGxvY1ZhOyAgICAgICAgICAgIC8vIENvbnRyb2wgYmxvY2sgdmlydHVhbCBhZGRyZXNzCi0JTkRJU19QSFlTSUNBTF9BRERSRVNTICAgQWxsb2NQYTsgICAgICAgICAgICAvLyBDb250cm9sIGJsb2NrIHBoeXNpY2FsIGFkZHJlc3MKLQlQTkRJU19QQUNLRVQgcE5kaXNQYWNrZXQ7Ci0JUE5ESVNfUEFDS0VUIHBOZXh0TmRpc1BhY2tldDsKLQotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIERtYUJ1ZjsgICAgICAgICAgICAgLy8gQXNzb2NpYXRlZCBETUEgYnVmZmVyIHN0cnVjdHVyZQotfSBSVE1QX0RNQUNCLCAqUFJUTVBfRE1BQ0I7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX1JUTVBfVFhfUklORwotewotCVJUTVBfRE1BQ0IgIENlbGxbVFhfUklOR19TSVpFXTsKLQlVSU5UMzIJCVR4Q3B1SWR4OwotCVVJTlQzMgkJVHhEbWFJZHg7Ci0JVUlOVDMyCQlUeFN3RnJlZUlkeDsJLy8gc29mdHdhcmUgbmV4dCBmcmVlIHR4IGluZGV4Ci19IFJUTVBfVFhfUklORywgKlBSVE1QX1RYX1JJTkc7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX1JYX1JJTkcKLXsKLQlSVE1QX0RNQUNCICBDZWxsW1JYX1JJTkdfU0laRV07Ci0JVUlOVDMyCQlSeENwdUlkeDsKLQlVSU5UMzIJCVJ4RG1hSWR4OwotCUlOVDMyCQlSeFN3UmVhZElkeDsJLy8gc29mdHdhcmUgbmV4dCByZWFkIGluZGV4Ci19IFJUTVBfUlhfUklORywgKlBSVE1QX1JYX1JJTkc7Ci0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX01HTVRfUklORwotewotCVJUTVBfRE1BQ0IgIENlbGxbTUdNVF9SSU5HX1NJWkVdOwotCVVJTlQzMgkJVHhDcHVJZHg7Ci0JVUlOVDMyCQlUeERtYUlkeDsKLQlVSU5UMzIJCVR4U3dGcmVlSWR4OyAvLyBzb2Z0d2FyZSBuZXh0IGZyZWUgdHggaW5kZXgKLX0gUlRNUF9NR01UX1JJTkcsICpQUlRNUF9NR01UX1JJTkc7Ci0KLQotLy8KLS8vICBTdGF0aXN0aWMgY291bnRlciBzdHJ1Y3R1cmUKLS8vCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl84MDJfMwotewotCS8vIEdlbmVyYWwgU3RhdHMKLQlVTE9ORyAgICAgICBHb29kVHJhbnNtaXRzOwotCVVMT05HICAgICAgIEdvb2RSZWNlaXZlczsKLQlVTE9ORyAgICAgICBUeEVycm9yczsKLQlVTE9ORyAgICAgICBSeEVycm9yczsKLQlVTE9ORyAgICAgICBSeE5vQnVmZmVyOwotCi0JLy8gRXRoZXJuZXQgU3RhdHMKLQlVTE9ORyAgICAgICBSY3ZBbGlnbm1lbnRFcnJvcnM7Ci0JVUxPTkcgICAgICAgT25lQ29sbGlzaW9uOwotCVVMT05HICAgICAgIE1vcmVDb2xsaXNpb25zOwotCi19IENPVU5URVJfODAyXzMsICpQQ09VTlRFUl84MDJfMzsKLQotdHlwZWRlZiBzdHJ1Y3QgX0NPVU5URVJfODAyXzExIHsKLQlVTE9ORyAgICAgICAgICAgTGVuZ3RoOwotCUxBUkdFX0lOVEVHRVIgICBMYXN0VHJhbnNtaXR0ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBUcmFuc21pdHRlZEZyYWdtZW50Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIE11bHRpY2FzdFRyYW5zbWl0dGVkRnJhbWVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgRmFpbGVkQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJldHJ5Q291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIE11bHRpcGxlUmV0cnlDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUlRTU3VjY2Vzc0NvdW50OwotCUxBUkdFX0lOVEVHRVIgICBSVFNGYWlsdXJlQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEFDS0ZhaWx1cmVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgRnJhbWVEdXBsaWNhdGVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgUmVjZWl2ZWRGcmFnbWVudENvdW50OwotCUxBUkdFX0lOVEVHRVIgICBNdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIEZDU0Vycm9yQ291bnQ7Ci19IENPVU5URVJfODAyXzExLCAqUENPVU5URVJfODAyXzExOwotCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9SQUxJTksgewotCVVMT05HICAgICAgICAgICBUcmFuc21pdHRlZEJ5dGVDb3VudDsgICAvLyBib3RoIHN1Y2Nlc3NmdWwgYW5kIGZhaWx1cmUsIHVzZWQgdG8gY2FsY3VsYXRlIFRYIHRocm91Z2hwdXQKLQlVTE9ORyAgICAgICAgICAgUmVjZWl2ZWRCeXRlQ291bnQ7ICAgICAgLy8gYm90aCBDUkMgb2theSBhbmQgQ1JDIGVycm9yLCB1c2VkIHRvIGNhbGN1bGF0ZSBSWCB0aHJvdWdocHV0Ci0JVUxPTkcgICAgICAgICAgIEJlZW5EaXNhc3NvY2lhdGVkQ291bnQ7Ci0JVUxPTkcgICAgICAgICAgIEJhZENRSUF1dG9SZWNvdmVyeUNvdW50OwotCVVMT05HICAgICAgICAgICBQb29yQ1FJUm9hbWluZ0NvdW50OwotCVVMT05HICAgICAgICAgICBNZ210UmluZ0Z1bGxDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUnhDb3VudFNpbmNlTGFzdE5VTEw7Ci0JVUxPTkcgICAgICAgICAgIFJ4Q291bnQ7Ci0JVUxPTkcgICAgICAgICAgIFJ4UmluZ0VyckNvdW50OwotCVVMT05HICAgICAgICAgICBLaWNrVHhDb3VudDsKLQlVTE9ORyAgICAgICAgICAgVHhSaW5nRXJyQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgIFJlYWxGY3NFcnJDb3VudDsKLQlVTE9ORyAgICAgICAgICAgUGVuZGluZ05kaXNQYWNrZXRDb3VudDsKLQotCVVMT05HICAgICAgICAgICBPbmVTZWNPc1R4Q291bnRbTlVNX09GX1RYX1JJTkddOwotCVVMT05HICAgICAgICAgICBPbmVTZWNEbWFEb25lQ291bnRbTlVNX09GX1RYX1JJTkddOwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeERvbmVDb3VudDsKLQlVTE9ORyAgICAgICAgICAgT25lU2VjUnhDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhBZ2dyZWdhdGlvbkNvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEFnZ3JlZ2F0aW9uQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50OwotCVVJTlQzMgkJCU9uZVNlY0ZyYW1lRHVwbGljYXRlQ291bnQ7Ci0KLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHJhbnNtaXR0ZWRCeXRlQ291bnQ7ICAgLy8gYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsdXJlLCB1c2VkIHRvIGNhbGN1bGF0ZSBUWCB0aHJvdWdocHV0Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4Tm9SZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4UmV0cnlPa0NvdW50OwotCVVJTlQzMiAgICAgICAgICBPbmVTZWNUeEZhaWxDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjRmFsc2VDQ0FDbnQ7ICAgICAgLy8gQ0NBIGVycm9yIGNvdW50LCBmb3IgZGVidWcgcHVycG9zZSwgbWlnaHQgbW92ZSB0byBnbG9iYWwgY291bnRlcgotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeE9rQ250OyAgICAgICAgICAvLyBSWCB3aXRob3V0IGVycm9yCi0JVUlOVDMyICAgICAgICAgIE9uZVNlY1J4T2tEYXRhQ250OyAgICAgIC8vIHVuaWNhc3QtdG8tbWUgREFUQSBmcmFtZSBjb3VudAotCVVJTlQzMiAgICAgICAgICBPbmVTZWNSeEZjc0VyckNudDsgICAgICAvLyBDUkMgZXJyb3IKLQlVSU5UMzIgICAgICAgICAgT25lU2VjQmVhY29uU2VudENudDsKLQlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1RvdGFsVHhDb3VudDsgLy8gT25lU2VjVHhOb1JldHJ5T2tDb3VudCArIE9uZVNlY1R4UmV0cnlPa0NvdW50ICsgT25lU2VjVHhGYWlsQ291bnQKLQlVSU5UMzIgICAgICAgICAgTGFzdE9uZVNlY1J4T2tEYXRhQ250OyAgLy8gT25lU2VjUnhPa0RhdGFDbnQKLQlVTE9ORwkJRHVwbGljYXRlUmN2OwotCVVMT05HCQlUeEFnZ0NvdW50OwotCVVMT05HCQlUeE5vbkFnZ0NvdW50OwotCVVMT05HCQlUeEFnZzFNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnMk1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2czTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzRNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnNU1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c2TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzdNUERVQ291bnQ7Ci0JVUxPTkcJCVR4QWdnOE1QRFVDb3VudDsKLQlVTE9ORwkJVHhBZ2c5TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzEwTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzExTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzEyTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzEzTVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzE0TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzE1TVBEVUNvdW50OwotCVVMT05HCQlUeEFnZzE2TVBEVUNvdW50OwotCi0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZE9jdGV0c0luQU1TRFU7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBUcmFuc21pdHRlZEFNU0RVQ291bnQ7Ci0JTEFSR0VfSU5URUdFUiAgICAgICBSZWNlaXZlZE9jdGVzSW5BTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgUmVjZWl2ZWRBTVNEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRBTVBEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudDsKLQlMQVJHRV9JTlRFR0VSICAgICAgIFRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50OwotCUxBUkdFX0lOVEVHRVIgICAgICAgTVBEVUluUmVjZWl2ZWRBTVBEVUNvdW50OwotfSBDT1VOVEVSX1JBTElOSywgKlBDT1VOVEVSX1JBTElOSzsKLQotCi10eXBlZGVmIHN0cnVjdCBfQ09VTlRFUl9EUlMgewotCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KLQlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQlVQ0hBUiAgICAgICAgICAgUEVSW01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLQlVQ0hBUiAgICAgICAgICAgVHhSYXRlVXBQZW5hbHR5OyAgICAgIC8vIGV4dHJhICMgb2Ygc2Vjb25kIHBlbmFsdHkgZHVlIHRvIGxhc3QgdW5zdGFibGUgY29uZGl0aW9uCi0JVUxPTkcgICAgICAgICAgIEN1cnJUeFJhdGVTdGFibGVUaW1lOyAvLyAjIG9mIHNlY29uZCBpbiBjdXJyZW50IFRYIHJhdGUKLQlCT09MRUFOICAgICAgICAgZk5vaXN5RW52aXJvbm1lbnQ7Ci0JQk9PTEVBTiAgICAgICAgIGZMYXN0U2VjQWNjb3JkaW5nUlNTSTsKLQlVQ0hBUiAgICAgICAgICAgTGFzdFNlY1R4UmF0ZUNoYW5nZUFjdGlvbjsgLy8gMDogbm8gY2hhbmdlLCAxOnJhdGUgVVAsIDI6cmF0ZSBkb3duCi0JVUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCi0JVUxPTkcJCQlMYXN0VHhPa0NvdW50OwotfSBDT1VOVEVSX0RSUywgKlBDT1VOVEVSX0RSUzsKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCXNlY3VyaXR5IGtleSByZWxhdGVkIGRhdGEgc3RydWN0dXJlCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgX0NJUEhFUl9LRVkgewotCVVDSEFSICAgS2V5WzE2XTsgICAgICAgICAgICAvLyByaWdodCBub3cgd2UgaW1wbGVtZW50IDQga2V5cywgMTI4IGJpdHMgbWF4Ci0JVUNIQVIgICBSeE1pY1s4XTsJCQkvLyBtYWtlIGFsaWdubWVudAotCVVDSEFSICAgVHhNaWNbOF07Ci0JVUNIQVIgICBUeFRzY1s2XTsgICAgICAgICAgIC8vIDQ4Yml0IFRTQyB2YWx1ZQotCVVDSEFSICAgUnhUc2NbNl07ICAgICAgICAgICAvLyA0OGJpdCBUU0MgdmFsdWUKLQlVQ0hBUiAgIENpcGhlckFsZzsgICAgICAgICAgLy8gMC1ub25lLCAxOldFUDY0LCAyOldFUDEyOCwgMzpUS0lQLCA0OkFFUywgNTpDS0lQNjQsIDY6Q0tJUDEyOAotCVVDSEFSICAgS2V5TGVuOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVVDSEFSICAgQnNzSWRbNl07Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0gICAgICAgICAgICAvLyBLZXkgbGVuZ3RoIGZvciBlYWNoIGtleSwgMDogZW50cnkgaXMgaW52YWxpZAotCVVDSEFSICAgVHlwZTsgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZSBQYWlyd2lzZS9Hcm91cCB3aGVuIHJlcG9ydGluZyBNSUMgZXJyb3IKLX0gQ0lQSEVSX0tFWSwgKlBDSVBIRVJfS0VZOwotCi0KLS8vIHN0cnVjdHVyZSB0byBkZWZpbmUgV1BBIEdyb3VwIEtleSBSZWtleSBJbnRlcnZhbAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9SVF84MDJfMTFfV1BBX1JFS0VZIHsKLQlVTE9ORyBSZUtleU1ldGhvZDsgICAgICAgICAgLy8gbWVjaGFuaXNtIGZvciByZWtleWluZzogMDpkaXNhYmxlLCAxOiB0aW1lLWJhc2VkLCAyOiBwYWNrZXQtYmFzZWQKLQlVTE9ORyBSZUtleUludGVydmFsOyAgICAgICAgLy8gdGltZS1iYXNlZDogc2Vjb25kcywgcGFja2V0LWJhc2VkOiBraWxvLXBhY2tldHMKLX0gUlRfV1BBX1JFS0VZLCpQUlRfV1BBX1JFS0VZLCBSVF84MDJfMTFfV1BBX1JFS0VZLCAqUFJUXzgwMl8xMV9XUEFfUkVLRVk7Ci0KLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgICAgICAgIEFkZHJbTUFDX0FERFJfTEVOXTsKLQlVQ0hBUiAgICAgICAgRXJyb3JDb2RlWzJdOyAgLy8wMCAwMS1JbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHR5cGUKLQkJCQkJCQkvLzAwIDAyLUF1dGhlbnRpY2F0aW9uIHRpbWVvdXQKLQkJCQkJCQkvLzAwIDAzLUNoYWxsZW5nZSBmcm9tIEFQIGZhaWxlZAotCQkJCQkJCS8vMDAgMDQtQ2hhbGxlbmdlIHRvIEFQIGZhaWxlZAotCUJPT0xFQU4gICAgICBSZXBvcnRlZDsKLX0gUk9HVUVBUF9FTlRSWSwgKlBST0dVRUFQX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUNIQVIgICAgICAgICAgICAgICBSb2d1ZUFwTnI7Ci0JUk9HVUVBUF9FTlRSWSAgICAgICBSb2d1ZUFwRW50cnlbTUFYX0xFTl9PRl9CU1NfVEFCTEVdOwotfSBST0dVRUFQX1RBQkxFLCAqUFJPR1VFQVBfVEFCTEU7Ci0KLS8vCi0vLyBDaXNjbyBJQVBQIGZvcm1hdAotLy8KLXR5cGVkZWYgc3RydWN0ICBfQ0lTQ09fSUFQUF9DT05URU5UXwotewotCVVTSE9SVCAgICAgTGVuZ3RoOyAgICAgICAgLy9JQVBQIExlbmd0aAotCVVDSEFSICAgICAgTWVzc2FnZVR5cGU7ICAgICAgLy9JQVBQIHR5cGUKLQlVQ0hBUiAgICAgIEZ1bmN0aW9uQ29kZTsgICAgIC8vSUFQUCBmdW5jdGlvbiB0eXBlCi0JVUNIQVIgICAgICBEZXN0aW5haW9uTUFDW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICBTb3VyY2VNQUNbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQgICAgIFRhZzsgICAgICAgICAgIC8vVGFnKGVsZW1lbnQgSUUpIC0gQWRqYWNlbnQgQVAgcmVwb3J0Ci0JVVNIT1JUICAgICBUYWdMZW5ndGg7ICAgICAvL0xlbmd0aCBvZiBlbGVtZW50IG5vdCBpbmNsdWRpbmcgNCBieXRlIGhlYWRlcgotCVVDSEFSICAgICAgT1VJWzRdOyAgICAgICAgICAgLy8weDAwLCAweDQwLCAweDk2LCAweDAwCi0JVUNIQVIgICAgICBQcmV2aW91c0FQW01BQ19BRERSX0xFTl07ICAgICAgIC8vTUFDIEFkZHJlc3Mgb2YgYWNjZXNzIHBvaW50Ci0JVVNIT1JUICAgICBDaGFubmVsOwotCVVTSE9SVCAgICAgU3NpZExlbjsKLQlVQ0hBUiAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVU0hPUlQgICAgIFNlY29uZHM7ICAgICAgICAgIC8vU2Vjb25kcyB0aGF0IHRoZSBjbGllbnQgaGFzIGJlZW4gZGlzYXNzb2NpYXRlZC4KLX0gQ0lTQ09fSUFQUF9DT05URU5ULCAqUENJU0NPX0lBUFBfQ09OVEVOVDsKLQotCi0vKgotICAqCUZyYWdtZW50IEZyYW1lIHN0cnVjdHVyZQotICAqLwotdHlwZWRlZiBzdHJ1Y3QgIF9GUkFHTUVOVF9GUkFNRSB7Ci0JUE5ESVNfUEFDS0VUICAgIHBGcmFnUGFja2V0OwotCVVMT05HICAgICAgIFJ4U2l6ZTsKLQlVU0hPUlQgICAgICBTZXF1ZW5jZTsKLQlVU0hPUlQgICAgICBMYXN0RnJhZzsKLQlVTE9ORyAgICAgICBGbGFnczsgICAgICAgICAgLy8gU29tZSBleHRyYSBmcmFtZSBpbmZvcm1hdGlvbi4gYml0IDA6IExMQyBwcmVzZW50ZWQKLX0gRlJBR01FTlRfRlJBTUUsICpQRlJBR01FTlRfRlJBTUU7Ci0KLQotLy8KLS8vIFBhY2tldCBpbmZvcm1hdGlvbiBmb3IgTmRpc1F1ZXJ5UGFja2V0Ci0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9QQUNLRVRfSU5GTyAgICB7Ci0JVUlOVCAgICAgICAgICAgIFBoeXNpY2FsQnVmZmVyQ291bnQ7ICAgIC8vIFBoeXNpY2FsIGJyZWFrcyBvZiBidWZmZXIgZGVzY3JpcG9yIGNoYWluZWQKLQlVSU5UICAgICAgICAgICAgQnVmZmVyQ291bnQgOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIEJ1ZmZlciBkZXNjcmlwdG9yIGNoYWluZWQKLQlVSU5UICAgICAgICAgICAgVG90YWxQYWNrZXRMZW5ndGggOyAgICAgLy8gU2VsZiBleHBsYWluZWQKLQlQTkRJU19CVUZGRVIgICAgcEZpcnN0QnVmZmVyOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBmaXJzdCBidWZmZXIgZGVzY3JpcHRvcgotfSBQQUNLRVRfSU5GTywgKlBQQUNLRVRfSU5GTzsKLQotCi0vLwotLy8gIEFyY2ZvdXIgU3RydWN0dXJlIEFkZGVkIGJ5IFBhdWxXdQotLy8KLXR5cGVkZWYgc3RydWN0ICBfQVJDRk9VUgotewotCVVJTlQgICAgICAgICAgICBYOwotCVVJTlQgICAgICAgICAgICBZOwotCVVDSEFSICAgICAgICAgICBTVEFURVsyNTZdOwotfSBBUkNGT1VSQ09OVEVYVCwgKlBBUkNGT1VSQ09OVEVYVDsKLQotCi0vLwotLy8gVGtpcCBLZXkgc3RydWN0dXJlIHdoaWNoIFJDNCBrZXkgJiBNSUMgY2FsY3VsYXRpb24KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1RLSVBfS0VZX0lORk8gIHsKLQlVSU5UICAgICAgICBuQnl0ZXNJbk07ICAvLyAjIGJ5dGVzIGluIE0gZm9yIE1JQ0tFWQotCVVMT05HICAgICAgIElWMTY7Ci0JVUxPTkcgICAgICAgSVYzMjsKLQlVTE9ORyAgICAgICBLMDsgICAgICAgICAvLyBmb3IgTUlDS0VZIExvdwotCVVMT05HICAgICAgIEsxOyAgICAgICAgIC8vIGZvciBNSUNLRVkgSGlnCi0JVUxPTkcgICAgICAgTDsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCi0JVUxPTkcgICAgICAgUjsgICAgICAgICAgLy8gQ3VycmVudCBzdGF0ZSBmb3IgTUlDS0VZCi0JVUxPTkcgICAgICAgTTsgICAgICAgICAgLy8gTWVzc2FnZSBhY2N1bXVsYXRvciBmb3IgTUlDS0VZCi0JVUNIQVIgICAgICAgUkM0S0VZWzE2XTsKLQlVQ0hBUiAgICAgICBNSUNbOF07Ci19IFRLSVBfS0VZX0lORk8sICpQVEtJUF9LRVlfSU5GTzsKLQotCi0vLwotLy8gUHJpdmF0ZSAvIE1pc2MgZGF0YSwgY291bnRlcnMgZm9yIGRyaXZlciBpbnRlcm5hbCB1c2UKLS8vCi10eXBlZGVmIHN0cnVjdCAgX19QUklWQVRFX1NUUlVDIHsKLQlVSU5UICAgICAgIFN5c3RlbVJlc2V0Q250OyAgICAgICAgIC8vIFN5c3RlbSByZXNldCBjb3VudGVyCi0JVUlOVCAgICAgICBUeFJpbmdGdWxsQ250OyAgICAgICAgICAvLyBUeCByaW5nIGZ1bGwgb2NjdXJyYW5jZSBudW1iZXIKLQlVSU5UICAgICAgIFBoeVJ4RXJyQ250OyAgICAgICAgICAgIC8vIFBIWSBSeCBlcnJvciBjb3VudCwgZm9yIGRlYnVnIHB1cnBvc2UsIG1pZ2h0IG1vdmUgdG8gZ2xvYmFsIGNvdW50ZXIKLQkvLyBWYXJpYWJsZXMgZm9yIFdFUCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiBpbiBydG1wX3dlcC5jCi0JVUlOVCAgICAgICBGQ1NDUkMzMjsKLQlBUkNGT1VSQ09OVEVYVCAgV0VQQ09OVEVYVDsKLQkvLyBUa2lwIHN0dWZmCi0JVEtJUF9LRVlfSU5GTyAgIFR4OwotCVRLSVBfS0VZX0lORk8gICBSeDsKLX0gUFJJVkFURV9TVFJVQywgKlBQUklWQVRFX1NUUlVDOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglDaGFubmVsIGFuZCBCQlAgcmVsYXRlZCBkYXRhIHN0cnVjdHVyZXMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBzdHJ1Y3R1cmUgdG8gdHVuZSBCQlAgUjY2IChCQlAgVFVOSU5HKQotdHlwZWRlZiBzdHJ1Y3QgX0JCUF9SNjZfVFVOSU5HIHsKLQlCT09MRUFOICAgICBiRW5hYmxlOwotCVVTSE9SVCAgICAgIEZhbHNlQ2NhTG93ZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDEwMAotCVVTSE9SVCAgICAgIEZhbHNlQ2NhVXBwZXJUaHJlc2hvbGQ7ICAvLyBkZWZhdWx0IDUxMgotCVVDSEFSICAgICAgIFI2NkRlbHRhOwotCVVDSEFSICAgICAgIFI2NkN1cnJlbnRWYWx1ZTsKLQlCT09MRUFOCQlSNjZMb3dlclVwcGVyU2VsZWN0OyAvL0JlZm9yZSBMaW5rVXAsIFVzZWQgTG93ZXJCb3VuZCBvciBVcHBlckJvdW5kIGFzIFI2NiB2YWx1ZS4KLX0gQkJQX1I2Nl9UVU5JTkcsICpQQkJQX1I2Nl9UVU5JTkc7Ci0KLS8vIHN0cnVjdHVyZSB0byBzdG9yZSBjaGFubmVsIFRYIHBvd2VyCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9UWF9QT1dFUiB7Ci0JVVNIT1JUICAgICBSZW1haW5pbmdUaW1lRm9yVXNlOwkJLy91bml0OiBzZWMKLQlVQ0hBUiAgICAgIENoYW5uZWw7Ci0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCUJPT0xFQU4gICAgICAgYkVmZmVjdGVkQ2hhbm5lbDsJLy8gRm9yIEJXIDQwIG9wZXJhdGluZyBpbiAyLjRHSHogLCB0aGUgImVmZmVjdGVkIGNoYW5uZWwiIGlzIHRoZSBjaGFubmVsIHRoYXQgaXMgY292ZXJlZCBpbiA0ME1oei4KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0JQ0hBUiAgICAgICBQb3dlcjsKLQlDSEFSICAgICAgIFBvd2VyMjsKLQlVQ0hBUiAgICAgIE1heFR4UHdyOwotCVVDSEFSICAgICAgRGZzUmVxOwotfSBDSEFOTkVMX1RYX1BPV0VSLCAqUENIQU5ORUxfVFhfUE9XRVI7Ci0KLS8vIHN0cnVjdHVyZSB0byBzdG9yZSA4MDIuMTFqIGNoYW5uZWwgVFggcG93ZXIKLXR5cGVkZWYgc3RydWN0IF9DSEFOTkVMXzExSl9UWF9QT1dFUiB7Ci0JVUNIQVIgICAgICBDaGFubmVsOwotCVVDSEFSICAgICAgQlc7CS8vIEJXXzEwIG9yIEJXXzIwCi0JQ0hBUiAgICAgICBQb3dlcjsKLQlDSEFSICAgICAgIFBvd2VyMjsKLQlVU0hPUlQgICAgIFJlbWFpbmluZ1RpbWVGb3JVc2U7CQkvL3VuaXQ6IHNlYwotfSBDSEFOTkVMXzExSl9UWF9QT1dFUiwgKlBDSEFOTkVMXzExSl9UWF9QT1dFUjsKLQotdHlwZWRlZiBzdHJ1Y3QgX1NPRlRfUlhfQU5UX0RJVkVSU0lUWV9TVFJVQ1QgewotCVVDSEFSICAgICBFdmFsdWF0ZVBlcmlvZDsJCSAvLyAwOm5vdCBldmFsdXRlIHN0YXR1cywgMTogZXZhbHVhdGUgc3RhdHVzLCAyOiBzd2l0Y2hpbmcgc3RhdHVzCi0JVUNIQVIgICAgIEV2YWx1YXRlU3RhYmxlQ250OwotCVVDSEFSICAgICBQYWlyMVByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgotCVVDSEFSICAgICBQYWlyMVNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUxLCAxOkFudC1FMgotCVVDSEFSICAgICBQYWlyMlByaW1hcnlSeEFudDsgICAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAotCVVDSEFSICAgICBQYWlyMlNlY29uZGFyeVJ4QW50OyAgIC8vIDA6QW50LUUzLCAxOkFudC1FNAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCVNIT1JUICAgICBQYWlyMUF2Z1Jzc2lbMl07ICAgICAgIC8vIEF2Z1Jzc2lbMF06RTEsIEF2Z1Jzc2lbMV06RTIKLQlTSE9SVCAgICAgUGFpcjJBdmdSc3NpWzJdOyAgICAgICAvLyBBdmdSc3NpWzBdOkUzLCBBdmdSc3NpWzFdOkU0Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JU0hPUlQgICAgIFBhaXIxTGFzdEF2Z1Jzc2k7ICAgICAgLy8KLQlTSE9SVCAgICAgUGFpcjJMYXN0QXZnUnNzaTsgICAgICAvLwotCVVMT05HICAgICBSY3ZQa3ROdW1XaGVuRXZhbHVhdGU7Ci0JQk9PTEVBTiAgIEZpcnN0UGt0QXJyaXZlZFdoZW5FdmFsdWF0ZTsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgIFJ4QW50RGl2ZXJzaXR5VGltZXI7Ci19IFNPRlRfUlhfQU5UX0RJVkVSU0lUWSwgKlBTT0ZUX1JYX0FOVF9ESVZFUlNJVFk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCXN0cnVjdHVyZSBmb3IgcmFkYXIgZGV0ZWN0aW9uIGFuZCBjaGFubmVsIHN3aXRjaAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9SQURBUl9ERVRFQ1RfU1RSVUNUIHsKLSAgICAvL0JPT0xFQU4JCUlFRUU4MDIxMUg7CQkJLy8gMDogZGlzYWJsZSwgMTogZW5hYmxlIElFRUU4MDIuMTFoCi0JVUNIQVIJCUNTQ291bnQ7CQkJLy9DaGFubmVsIHN3aXRjaCBjb3VudGVyCi0JVUNIQVIJCUNTUGVyaW9kOwkJCS8vQ2hhbm5lbCBzd2l0Y2ggcGVyaW9kIChiZWFjb24gY291bnQpCi0JVUNIQVIJCVJEQ291bnQ7CQkJLy9SYWRhciBkZXRlY3Rpb24gY291bnRlcgotCVVDSEFSCQlSRE1vZGU7CQkJCS8vUmFkYXIgRGV0ZWN0aW9uIG1vZGUKLQlVQ0hBUgkJUkREdXJSZWdpb247CQkvL1JhZGFyIGRldGVjdGlvbiBkdXJhdGlvbiByZWdpb24KLQlVQ0hBUgkJQkJQUjE2OwotCVVDSEFSCQlCQlBSMTc7Ci0JVUNIQVIJCUJCUFIxODsKLQlVQ0hBUgkJQkJQUjIxOwotCVVDSEFSCQlCQlBSMjI7Ci0JVUNIQVIJCUJCUFI2NDsKLQlVTE9ORwkJSW5TZXJ2aWNlTW9uaXRvckNvdW50OyAvLyB1bml0OiBzZWMKLQlVSU5UOAkJRGZzU2Vzc2lvblRpbWU7Ci0jaWZkZWYgREZTX0ZDQ19CVzQwX0ZJWAotCUNIQVIJCURmc1Nlc3Npb25GY2NPZmY7Ci0jZW5kaWYKLQlCT09MRUFOCQliRmFzdERmczsKLQlVSU5UOAkJQ2hNb3ZpbmdUaW1lOwotCVVJTlQ4CQlMb25nUHVsc2VSYWRhclRoOwotI2lmZGVmIE1FUkdFX0FSQ0hfVEVBTQotCUNIQVIJCUF2Z1Jzc2lSZXE7Ci0JVUxPTkcJCURmc0xvd2VyTGltaXQ7Ci0JVUxPTkcJCURmc1VwcGVyTGltaXQ7Ci0JVUlOVDgJCUZpeERmc0xpbWl0OwotCVVMT05HCQl1cHBlcmxpbWl0OwotCVVMT05HCQlsb3dlcmxpbWl0OwotI2VuZGlmIC8vIE1FUkdFX0FSQ0hfVEVBTSAvLwotfSBSQURBUl9ERVRFQ1RfU1RSVUNULCAqUFJBREFSX0RFVEVDVF9TVFJVQ1Q7Ci0KLSNpZmRlZiBDQVJSSUVSX0RFVEVDVElPTl9TVVBQT1JUCi10eXBlZGVmIGVudW0gQ0RfU1RBVEVfbgotewotCUNEX05PUk1BTCwKLQlDRF9TSUxFTkNFLAotCUNEX01BWF9TVEFURQotfSBDRF9TVEFURTsKLQotI2lmZGVmIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfUkVDSEVDS19USU1FCQkJMwotCi0KLSNpZmRlZiBDQVJSSUVSX1NFTlNFX05FV19BTEdPCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX0NSSVRJUklBCQkJCTQwMAotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9TVE9QX1JBVElPCQkJCTB4MTEKLSNkZWZpbmUJQ0FSUklFUl9ERVRFQ1RfU1RPUF9SQVRJT19PTERfMzA5MAkJCTIKLSNlbmRpZiAvLyBDQVJSSUVSX1NFTlNFX05FV19BTEdPIC8vCi0KLQotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9TVE9QX1JFQ0hFQ0tfVElNRQkJNAotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9DUklUSVJJQV9BCQkJCTIzMAotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9ERUxUQQkJCQkJNwotI2RlZmluZSBDQVJSSUVSX0RFVEVDVF9ESVZfRkxBRwkJCQkwCi0jaWZkZWYgUlQzMDkwCi0jZGVmaW5lIENBUlJJRVJfREVURUNUX1RIUkVTSE9MRF8zMDkwQQkJCTB4MWZmZmZmZmYKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNpZmRlZiBSVDMzOTAKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfVEhSRVNIT0xECQkJMHgwZmZmZmZmZgotI2VuZGlmIC8vIFJUMzM5MCAvLwotI2lmbmRlZiBSVDMzOTAKLSNkZWZpbmUgQ0FSUklFUl9ERVRFQ1RfVEhSRVNIT0xECQkJMHgwZmZmZmZmZgotI2VuZGlmIC8vIFJUMzM5MCAvLwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQotdHlwZWRlZiBzdHJ1Y3QgQ0FSUklFUl9ERVRFQ1RJT05fcwotewotCUJPT0xFQU4JCQkJCUVuYWJsZTsKLQlVSU5UOAkJCQkJQ0RTZXNzaW9uVGltZTsKLQlVSU5UOAkJCQkJQ0RQZXJpb2Q7Ci0JQ0RfU1RBVEUJCQkJQ0RfU3RhdGU7Ci0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotCVVJTlQ4CQkJCQlkZWx0YTsKLQlVSU5UOAkJCQkJZGl2X2ZsYWc7Ci0JVUlOVDMyCQkJCQl0aHJlc2hvbGQ7Ci0JVUlOVDgJCQkJCXJlY2hlY2s7Ci0JVUlOVDgJCQkJCXJlY2hlY2sxOwotCVVJTlQ4CQkJCQlyZWNoZWNrMjsKLQlVSU5UMzIJCQkJCVRpbWVTdGFtcDsKLQlVSU5UMzIJCQkJCWNyaXRlcmlhOwotCVVJTlQzMgkJCQkJQ2FycmllckRlYnVnOwotCVVMT05HCQkJCQlpZGxlX3RpbWU7Ci0JVUxPTkcJCQkJCWJ1c3lfdGltZTsKLQlVTE9ORwkJCQkJRGVidWc7Ci0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotfUNBUlJJRVJfREVURUNUSU9OX1NUUlVDVCwgKlBDQVJSSUVSX0RFVEVDVElPTl9TVFJVQ1Q7Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0KLSNpZmRlZiBORVdfREZTCi10eXBlZGVmIHN0cnVjdCBfTmV3REZTRGVidWcKLXsKLQlVQ0hBUiBjaGFubmVsOwotCVVMT05HIHdhaXRfdGltZTsKLQlVQ0hBUiBkZWx0YV9kZWxheV9yYW5nZTsKLQlVQ0hBUiBkZWx0YV9kZWxheV9zdGVwOwotCVVDSEFSIEVMX3JhbmdlOwotCVVDSEFSIEVMX3N0ZXA7Ci0JVUNIQVIgRUhfcmFuZ2U7Ci0JVUNIQVIgRUhfc3RlcDsKLQlVQ0hBUiBXTF9yYW5nZTsKLQlVQ0hBUiBXTF9zdGVwOwotCVVDSEFSIFdIX3JhbmdlOwotCVVDSEFSIFdIX3N0ZXA7Ci0JVUxPTkcgVF9leHBlY3RlZDsKLQlVTE9ORyBUX21hcmdpbjsKLQlVQ0hBUiBzdGFydDsKLQlVTE9ORyBjb3VudDsKLQlVTE9ORyBpZHg7Ci0KLX1OZXdERlNEZWJ1ZywgKnBOZXdERlNEZWJ1ZzsKLQotI2RlZmluZSBORVdfREZTX0ZDQ181X0VOVF9OVU0JCTUKLSNkZWZpbmUgTkVXX0RGU19EQkdfUE9SVF9FTlRfTlVNX1BPV0VSCTgKLSNkZWZpbmUgTkVXX0RGU19EQkdfUE9SVF9FTlRfTlVNCQkoMSA8PCBORVdfREZTX0RCR19QT1JUX0VOVF9OVU1fUE9XRVIpICAvLyBDRSBEZWJ1ZyBQb3J0IGVudHJ5IG51bWJlciwgMjU2Ci0jZGVmaW5lIE5FV19ERlNfREJHX1BPUlRfTUFTSwkweGZmCi0KLS8vIE1hdGNoZWQgUGVyaW9kIGRlZmluaXRpb24KLSNkZWZpbmUgTkVXX0RGU19NUEVSSU9EX0VOVF9OVU1fUE9XRVIJCTgKLSNkZWZpbmUgTkVXX0RGU19NUEVSSU9EX0VOVF9OVU0JCSgxIDw8IE5FV19ERlNfTVBFUklPRF9FTlRfTlVNX1BPV0VSKQkgLy8gQ0UgUGVyaW9kIFRhYmxlIGVudHJ5IG51bWJlciwgNTEyCi0jZGVmaW5lIE5FV19ERlNfTUFYX0NIQU5ORUwJNAotCi10eXBlZGVmIHN0cnVjdCBfTmV3REZTRGVidWdQb3J0ewotCVVMT05HIGNvdW50ZXI7Ci0JVUxPTkcgdGltZXN0YW1wOwotCVVTSE9SVCB3aWR0aDsKLQlVU0hPUlQgc3RhcnRfaWR4OyAvLyBzdGFydCBpbmRleCB0byBwZXJpb2QgdGFibGUKLQlVU0hPUlQgZW5kX2lkeDsgLy8gZW5kIGluZGV4IHRvIHBlcmlvZCB0YWJsZQotfU5ld0RGU0RlYnVnUG9ydCwgKnBOZXdERlNEZWJ1Z1BvcnQ7Ci0KLS8vIE1hdGNoZWQgUGVyaW9kIFRhYmxlCi10eXBlZGVmIHN0cnVjdCBfTmV3REZTTVBlcmlvZHsKLQlVU0hPUlQJaWR4OwotCVVTSE9SVCB3aWR0aDsKLQlVU0hPUlQJaWR4MjsKLQlVU0hPUlQgd2lkdGgyOwotCVVMT05HIHBlcmlvZDsKLX1OZXdERlNNUGVyaW9kLCAqcE5ld0RGU01QZXJpb2Q7Ci0KLSNlbmRpZiAvLyBORVdfREZTIC8vCi0KLQotdHlwZWRlZiBlbnVtIF9BQkdCQU5EX1NUQVRFXyB7Ci0JVU5LTk9XTl9CQU5ELAotCUJHX0JBTkQsCi0JQV9CQU5ELAotfSBBQkdCQU5EX1NUQVRFOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vLyBQb3dlciBzYXZlIG1ldGhvZCBjb250cm9sCi10eXBlZGVmCXVuaW9uCV9QU19DT05UUk9MCXsKLQlzdHJ1Y3QJewotCQlVTE9ORwkJRW5hYmxlUFNpbklkbGU6MTsJCQkvLyBFbmFibGUgcmFkaW8gb2ZmIHdoZW4gbm90IGNvbm5lY3QgdG8gQVAuIHJhZGlvIG9uIG9ubHkgd2hlbiBzaXRlc3VydmV5LAotCQlVTE9ORwkJRW5hYmxlTmV3UFM6MTsJCS8vIEVuYWJsZSBuZXcgIENoaXAgcG93ZXIgc2F2ZSBmdWNudGlvbiAuIE5ldyBtZXRob2QgY2FuIG9ubHkgYmUgYXBwbGllZCBpbiBjaGlwIHZlcnNpb24gYWZ0ZXIgMjg3Mi4gYW5kIFBDSWUuCi0JCVVMT05HCQlydDMweHhQb3dlck1vZGU6MjsJCQkvLyBQb3dlciBMZXZlbCBNb2RlIGZvciBydDMweHggY2hpcAotCQlVTE9ORwkJcnQzMHh4Rm9sbG93SG9zdEFTUE06MTsJCQkvLyBDYXJkIEZvbGxvd3MgSG9zdCdzIHNldHRpbmcgZm9yIHJ0MzB4eCBjaGlwLgotCQlVTE9ORwkJcnQzMHh4Rm9yY2VBU1BNVGVzdDoxOwkJCS8vIEZvcmNlIGVuYWJsZSBMMSBmb3IgcnQzMHh4IGNoaXAuIFRoaXMgaGFzIGhpZ2hlciBwcmlvcml0eSB0aGFuIHJ0MzB4eEZvbGxvd0hvc3RBU1BNIE1vZGUuCi0JCVVMT05HCQlyc3Y6MjY7CQkJLy8gUmFkaW8gTWVhc3VyZW1lbnQgRW5hYmxlCi0JfQlmaWVsZDsKLQlVTE9ORwkJCXdvcmQ7Ci19CVBTX0NPTlRST0wsICpQUFNfQ09OVFJPTDsKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglzdHJ1Y3R1cmUgZm9yIE1MTUUgc3RhdGUgbWFjaGluZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9NTE1FX1NUUlVDVCB7Ci0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0JLy8gU1RBIHN0YXRlIG1hY2hpbmVzCi0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQ250bE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQXNzb2NNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIEF1dGhSc3BNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFN5bmNNYWNoaW5lOwotCVNUQVRFX01BQ0hJTkUgICAgICAgICAgIFdwYVBza01hY2hpbmU7Ci0JU1RBVEVfTUFDSElORSAgICAgICAgICAgTGVhcE1hY2hpbmU7Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXNzb2NGdW5jW0FTU09DX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgQXV0aEZ1bmNbQVVUSF9GVU5DX1NJWkVdOwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEF1dGhSc3BGdW5jW0FVVEhfUlNQX0ZVTkNfU0laRV07Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgU3luY0Z1bmNbU1lOQ19GVU5DX1NJWkVdOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCVNUQVRFX01BQ0hJTkVfRlVOQyAgICAgIEFjdEZ1bmNbQUNUX0ZVTkNfU0laRV07Ci0JLy8gQWN0aW9uCi0JU1RBVEVfTUFDSElORSAgICAgICAgICAgQWN0TWFjaGluZTsKLQotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JU1RBVEVfTUFDSElORQkJCURsc01hY2hpbmU7Ci0JU1RBVEVfTUFDSElORV9GVU5DICAgICAgRGxzRnVuY1tETFNfRlVOQ19TSVpFXTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCi0JLy8gY29tbW9uIFdQQSBzdGF0ZSBtYWNoaW5lCi0JU1RBVEVfTUFDSElORSAgICAgICAgICAgV3BhTWFjaGluZTsKLQlTVEFURV9NQUNISU5FX0ZVTkMgICAgICBXcGFGdW5jW1dQQV9GVU5DX1NJWkVdOwotCi0KLQotCVVMT05HICAgICAgICAgICAgICAgICAgIENoYW5uZWxRdWFsaXR5OyAgLy8gMC4uMTAwLCBDaGFubmVsIFF1YWxpdHkgSW5kaWNhdGlvbiBmb3IgUm9hbWluZwotCVVMT05HICAgICAgICAgICAgICAgICAgIE5vdzMyOyAgICAgICAgICAgLy8gbGF0Y2ggdGhlIHZhbHVlIG9mIE5kaXNHZXRTeXN0ZW1VcFRpbWUoKQotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RTZW5kTlVMTHBzbVRpbWU7Ci0KLQlCT09MRUFOICAgICAgICAgICAgICAgICBiUnVubmluZzsKLQlORElTX1NQSU5fTE9DSyAgICAgICAgICBUYXNrTG9jazsKLQlNTE1FX1FVRVVFICAgICAgICAgICAgICBRdWV1ZTsKLQotCVVJTlQgICAgICAgICAgICAgICAgICAgIFNoaWZ0UmVnOwotCi0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUGVyaW9kaWNUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBBUFNEUGVyaW9kaWNUaW1lcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICBMaW5rRG93blRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QgICAgIExpbmtVcFRpbWVyOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGJQc1BvbGxUaW1lclJ1bm5pbmc7Ci0gICAgUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUHNQb2xsVGltZXI7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCAgICAgUmFkaW9Pbk9mZlRpbWVyOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCVVMT05HICAgICAgICAgICAgICAgICAgIFBlcmlvZGljUm91bmQ7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgT25lU2VjUGVyaW9kaWNSb3VuZDsKLQotCVVDSEFSCQkJCQlSZWFsUnhQYXRoOwotCUJPT0xFQU4JCQkJCWJMb3dUaHJvdWdocHV0OwotCUJPT0xFQU4JCQkJCWJFbmFibGVBdXRvQW50ZW5uYUNoZWNrOwotCVJBTElOS19USU1FUl9TVFJVQ1QJCVJ4QW50RXZhbFRpbWVyOwotCi0jaWZkZWYgUlQzMHh4Ci0JVUNIQVIgQ2FsaUJXNDBSZlIyNDsKLQlVQ0hBUiBDYWxpQlcyMFJmUjI0OwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi19IE1MTUVfU1RSVUNULCAqUE1MTUVfU1RSVUNUOwotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgk4MDIuMTEgTiByZWxhdGVkIGRhdGEgc3RydWN0dXJlcwotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCByZW9yZGVyaW5nX21wZHUKLXsKLQlzdHJ1Y3QgcmVvcmRlcmluZ19tcGR1CSpuZXh0OwotCVBORElTX1BBQ0tFVAkJCXBQYWNrZXQ7CQkvKiBjb3ZlcnRlZCB0byA4MDIuMyBmcmFtZSAqLwotCWludAkJCQkJCVNlcXVlbmNlOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIE1QRFUgKi8KLQlCT09MRUFOCQkJCQliQU1TRFU7Ci19OwotCi1zdHJ1Y3QgcmVvcmRlcmluZ19saXN0Ci17Ci0Jc3RydWN0IHJlb3JkZXJpbmdfbXBkdSAqbmV4dDsKLQlpbnQJcWxlbjsKLX07Ci0KLXN0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbAotewotCVBWT0lECQkJCQltZW07Ci0JTkRJU19TUElOX0xPQ0sJCQlsb2NrOwotCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QJZnJlZWxpc3Q7Ci19OwotCi10eXBlZGVmIGVudW0gX1JFQ19CTE9DS0FDS19TVEFUVVMKLXsKLSAgICBSZWNpcGllbnRfTk9ORT0wLAotCVJlY2lwaWVudF9VU0VELAotCVJlY2lwaWVudF9IYW5kbGVSZXMsCi0gICAgUmVjaXBpZW50X0FjY2VwdAotfSBSRUNfQkxPQ0tBQ0tfU1RBVFVTLCAqUFJFQ19CTE9DS0FDS19TVEFUVVM7Ci0KLXR5cGVkZWYgZW51bSBfT1JJX0JMT0NLQUNLX1NUQVRVUwotewotICAgIE9yaWdpbmF0b3JfTk9ORT0wLAotCU9yaWdpbmF0b3JfVVNFRCwKLSAgICBPcmlnaW5hdG9yX1dhaXRSZXMsCi0gICAgT3JpZ2luYXRvcl9Eb25lCi19IE9SSV9CTE9DS0FDS19TVEFUVVMsICpQT1JJX0JMT0NLQUNLX1NUQVRVUzsKLQotdHlwZWRlZiBzdHJ1Y3QgX0JBX09SSV9FTlRSWXsKLQlVQ0hBUiAgIFdjaWQ7Ci0JVUNIQVIgICBUSUQ7Ci0JVUNIQVIgICBCQVdpblNpemU7Ci0JVUNIQVIgICBUb2tlbjsKLS8vIFNlcXVlbmNlIGlzIHRvIGZpbGwgZXZlcnkgb3V0Z29pbmcgUW9TIERBVEEgZnJhbWUncyBzZXF1ZW5jZSBmaWVsZCBpbiA4MDIuMTEgaGVhZGVyLgotCVVTSE9SVAlTZXF1ZW5jZTsKLQlVU0hPUlQJVGltZU91dFZhbHVlOwotCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXM7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCBPUklCQVRpbWVyOwotCVBWT0lECXBBZGFwdGVyOwotfSBCQV9PUklfRU5UUlksICpQQkFfT1JJX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfQkFfUkVDX0VOVFJZIHsKLQlVQ0hBUiAgIFdjaWQ7Ci0JVUNIQVIgICBUSUQ7Ci0JVUNIQVIgICBCQVdpblNpemU7CS8vIDcuMy4xLjE0LiBlYWNoIGJ1ZmZlciBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgYSBtYXggQU1TRFUgb3IgTVNEVS4KLQkvL1VDSEFSCU51bU9mUnhQa3Q7Ci0JLy9VQ0hBUiAgICBDdXJpbmRpZHg7IC8vIHRoZSBoZWFkIGluIHRoZSBSWCByZW9yZGVyaW5nIGJ1ZmZlcgotCVVTSE9SVAkJTGFzdEluZFNlcTsKLS8vCVVTSE9SVAkJTGFzdEluZFNlcUF0VGltZXI7Ci0JVVNIT1JUCQlUaW1lT3V0VmFsdWU7Ci0JUkFMSU5LX1RJTUVSX1NUUlVDVCBSRUNCQVRpbWVyOwotCVVMT05HCQlMYXN0SW5kU2VxQXRUaW1lcjsKLQlVTE9ORwkJbkRyb3BQYWNrZXQ7Ci0JVUxPTkcJCXJjdlNlcTsKLQlSRUNfQkxPQ0tBQ0tfU1RBVFVTICBSRUNfQkFfU3RhdHVzOwotLy8JVUNIQVIJUnhCdWZJZHhVc2VkOwotCS8vIGNvcnJlc3BvbmRpbmcgdmlydHVhbCBhZGRyZXNzIGZvciBSWCByZW9yZGVyaW5nIHBhY2tldCBzdG9yYWdlLgotCS8vUlRNUF9SRU9SREVSRE1BQlVGIE1BUF9SWEJ1ZltNQVhfUlhfUkVPUkRFUkJVRl07Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgUnhSZVJpbmdMb2NrOyAgICAgICAgICAgICAgICAgLy8gUnggUmluZyBzcGlubG9jawotLy8Jc3RydWN0IF9CQV9SRUNfRU5UUlkgKnBOZXh0OwotCVBWT0lECXBBZGFwdGVyOwotCXN0cnVjdCByZW9yZGVyaW5nX2xpc3QJbGlzdDsKLX0gQkFfUkVDX0VOVFJZLCAqUEJBX1JFQ19FTlRSWTsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JVUxPTkcJCW51bUFzUmVjaXBpZW50OwkJLy8gSSBhbSByZWNpcGllbnQgb2YgbnVtQXNSZWNpcGllbnQgY2xpZW50cy4gVGhlc2UgY2xpZW50IGFyZSBpbiB0aGUgQkFSZWNFbnRyeVtdCi0JVUxPTkcJCW51bUFzT3JpZ2luYXRvcjsJLy8gSSBhbSBvcmlnaW5hdG9yIG9mCW51bUFzT3JpZ2luYXRvciBjbGllbnRzLiBUaGVzZSBjbGllbnRzIGFyZSBpbiB0aGUgQkFPcmlFbnRyeVtdCi0JVUxPTkcJCW51bURvbmVPcmlnaW5hdG9yOwkvLyBjb3VudCBEb25lIE9yaWdpbmF0b3Igc2Vzc2lvbnMKLQlCQV9PUklfRU5UUlkgICAgICAgQkFPcmlFbnRyeVtNQVhfTEVOX09GX0JBX09SSV9UQUJMRV07Ci0JQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwotfSBCQV9UQUJMRSwgKlBCQV9UQUJMRTsKLQotLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKLXR5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9SRUNfRU5UUll7Ci0JVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBCYUJpdG1hcDsgICAvLyBpZiAoQmFCaXRtYXAmKDE8PFRJRCkpLCB0aGlzIHNlc3Npb24gd2l0aHtNQUNBZGRyLCBUSUR9ZXhpc3RzLCBzbyByZWFkIEJ1ZlNpemVbVElEXSBmb3IgQnVmZmVyU2l6ZQotCVVDSEFSICAgcnN2OwotCVVDSEFSICAgQnVmU2l6ZVs4XTsKLQlSRUNfQkxPQ0tBQ0tfU1RBVFVTCVJFQ19CQV9TdGF0dXNbOF07Ci19IE9JRF9CQV9SRUNfRU5UUlksICpQT0lEX0JBX1JFQ19FTlRSWTsKLQotLy9Gb3IgUXVyZXlCQVRhYmxlT0lEIHVzZTsKLXR5cGVkZWYgc3RydWN0ICBQQUNLRUQgX09JRF9CQV9PUklfRU5UUll7Ci0JVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBCYUJpdG1hcDsgIC8vIGlmIChCYUJpdG1hcCYoMTw8VElEKSksIHRoaXMgc2Vzc2lvbiB3aXRoe01BQ0FkZHIsIFRJRH1leGlzdHMsIHNvIHJlYWQgQnVmU2l6ZVtUSURdIGZvciBCdWZmZXJTaXplLCByZWFkIE9SSV9CQV9TdGF0dXNbVElEXSBmb3Igc3RhdHVzCi0JVUNIQVIgICByc3Y7Ci0JVUNIQVIgICBCdWZTaXplWzhdOwotCU9SSV9CTE9DS0FDS19TVEFUVVMgIE9SSV9CQV9TdGF0dXNbOF07Ci19IE9JRF9CQV9PUklfRU5UUlksICpQT0lEX0JBX09SSV9FTlRSWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1FVRVJZQkFfVEFCTEV7Ci0JT0lEX0JBX09SSV9FTlRSWSAgICAgICBCQU9yaUVudHJ5WzMyXTsKLQlPSURfQkFfUkVDX0VOVFJZICAgICAgIEJBUmVjRW50cnlbMzJdOwotCVVDSEFSICAgT3JpTnVtOy8vIE51bWJlciBvZiBiZWxvdyBCQU9yaUVudHJ5Ci0JVUNIQVIgICBSZWNOdW07Ly8gTnVtYmVyIG9mIGJlbG93IEJBUmVjRW50cnkKLX0gUVVFUllCQV9UQUJMRSwgKlBRVUVSWUJBX1RBQkxFOwotCi10eXBlZGVmCXVuaW9uCV9CQUNBUF9TVFJVQwl7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgOjQ7Ci0JCVVJTlQzMiAgICAgYjIwNDBDb2V4aXN0U2NhblN1cDoxOwkJLy9BcyBTdGEsIHN1cHBvcnQgZG8gMjA0MCBjb2V4aXN0ZW5jZSBzY2FuIGZvciBBUC4gQXMgQXAsIHN1cHBvcnQgbW9uaXRvciB0cmlnZ2VyIGV2ZW50IHRvIGNoZWNrIGlmIGNhbiB1c2UgQlcgNDBNSHouCi0JCVVJTlQzMiAgICAgYkh0QWRob2M6MTsJCQkvLyBhZGhvYyBjYW4gdXNlIGh0IHJhdGUuCi0JCVVJTlQzMiAgICAgTU1QU21vZGU6MjsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUsIDA6c3RhdGljLCAxOmR5bmFtaWMsIDI6cnN2LCAzOm1pbW8gZW5hYmxlCi0JCVVJTlQzMiAgICAgQW1zZHVTaXplOjE7CS8vIDA6MzgzOSwgMTo3OTM1IGJ5dGVzLiBVSU5UICBNU0RVU2l6ZVRvQnl0ZXNbXQk9IHsgMzgzOSwgNzkzNX07Ci0JCVVJTlQzMiAgICAgQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7Ci0JCVVJTlQzMgkJUG9saWN5OjI7CS8vIDA6IERFTEFZX0JBIDE6SU1NRURfQkEgICgvL0JBIFBvbGljeSBzdWJmaWxlZCB2YWx1ZSBpbiBBRERCQSBmcmFtZSkgICAyOkJBLW5vdCB1c2UKLQkJVUlOVDMyCQlBdXRvQkE6MTsJLy8gYXV0b21hdGljYWxseSBCQQotCQlVSU5UMzIJCVR4QkFXaW5MaW1pdDo4OwotCQlVSU5UMzIJCVJ4QkFXaW5MaW1pdDo4OwotCX0JZmllbGQ7Ci0jZWxzZQotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnhCQVdpbkxpbWl0Ojg7Ci0JCVVJTlQzMgkJVHhCQVdpbkxpbWl0Ojg7Ci0JCVVJTlQzMgkJQXV0b0JBOjE7CS8vIGF1dG9tYXRpY2FsbHkgQkEKLQkJVUlOVDMyCQlQb2xpY3k6MjsJLy8gMDogREVMQVlfQkEgMTpJTU1FRF9CQSAgKC8vQkEgUG9saWN5IHN1YmZpbGVkIHZhbHVlIGluIEFEREJBIGZyYW1lKSAgIDI6QkEtbm90IHVzZQotCQlVSU5UMzIJCU1wZHVEZW5zaXR5OjM7Ci0JCVVJTlQzMgkJQW1zZHVFbmFibGU6MTsJLy9FbmFibGUgQU1TRFUgdHJhbnNtaXNzdGlvbgotCQlVSU5UMzIJCUFtc2R1U2l6ZToxOwkvLyAwOjM4MzksIDE6NzkzNSBieXRlcy4gVUlOVCAgTVNEVVNpemVUb0J5dGVzW10JPSB7IDM4MzksIDc5MzV9OwotCQlVSU5UMzIJCU1NUFNtb2RlOjI7CS8vIE1JTU8gcG93ZXIgc2F2ZSBtb3JlLCAwOnN0YXRpYywgMTpkeW5hbWljLCAyOnJzdiwgMzptaW1vIGVuYWJsZQotCQlVSU5UMzIJCWJIdEFkaG9jOjE7CQkJLy8gYWRob2MgY2FuIHVzZSBodCByYXRlLgotCQlVSU5UMzIJCWIyMDQwQ29leGlzdFNjYW5TdXA6MTsJCS8vQXMgU3RhLCBzdXBwb3J0IGRvIDIwNDAgY29leGlzdGVuY2Ugc2NhbiBmb3IgQVAuIEFzIEFwLCBzdXBwb3J0IG1vbml0b3IgdHJpZ2dlciBldmVudCB0byBjaGVjayBpZiBjYW4gdXNlIEJXIDQwTUh6LgotCQlVSU5UMzIJCTo0OwotCX0JZmllbGQ7Ci0jZW5kaWYKLQlVSU5UMzIJCQl3b3JkOwotfSBCQUNBUF9TVFJVQywgKlBCQUNBUF9TVFJVQzsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JQk9PTEVBTgkJSXNSZWNpcGllbnQ7Ci0JVUNIQVIgICBNQUNBZGRyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICBUSUQ7Ci0JVUNIQVIgICBuTVNEVTsKLQlVU0hPUlQgICBUaW1lT3V0OwotCUJPT0xFQU4gYkFsbFRpZDsgIC8vIElmIFRydWUsIGRlbGV0ZSBhbGwgVElEIGZvciBCQSBzZXNzaW9ucyB3aXRoIHRoaXMgTUFDYWRkci4KLX0gT0lEX0FERF9CQV9FTlRSWSwgKlBPSURfQUREX0JBX0VOVFJZOwotCi0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi10eXBlZGVmIGVudW0gX0JTUzIwNDBDT0VYSVNUX0ZMQUd7Ci0JQlNTXzIwNDBfQ09FWElTVF9ESVNBQkxFID0gMCwKLQlCU1NfMjA0MF9DT0VYSVNUX1RJTUVSX0ZJUkVEICA9IDEsCi0JQlNTXzIwNDBfQ09FWElTVF9JTkZPX1NZTkMgPSAyLAotCUJTU18yMDQwX0NPRVhJU1RfSU5GT19OT1RJRlkgPSA0LAotfUJTUzIwNDBDT0VYSVNUX0ZMQUc7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0jZGVmaW5lIElTX0hUX1NUQShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLSNkZWZpbmUgSVNfSFRfUkFURShfcE1hY0VudHJ5KQlcCi0JKF9wTWFjRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID49IE1PREVfSFRNSVgpCi0KLSNkZWZpbmUgUEVFUl9JU19IVF9SQVRFKF9wTWFjRW50cnkpCVwKLQkoX3BNYWNFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPj0gTU9ERV9IVE1JWCkKLQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0KLS8vVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGFsbCA4MDIuMTFuIGNhcmQgSW50ZXJPcHRpYmlsaXR5VGVzdCBhY3Rpb24uIFJlc2V0IGFsbCBOdW0gZXZlcnkgbiBzZWNvbmQuICAoRGV0YWlscyBzZWUgTUxNRVBlcmlvZGljKQotdHlwZWRlZglzdHJ1Y3QJX0lPVF9TVFJVQwl7Ci0JVUNIQVIJCQlUaHJlc2hvbGRbMl07Ci0JVUNIQVIJCQlSZW9yZGVyVGltZU91dE51bVtNQVhfTEVOX09GX0JBX1JFQ19UQUJMRV07CS8vIGNvbXBhcmUgd2l0aCB0aHJlc2hvbGRbMF0KLQlVQ0hBUgkJCVJlZnJlc2hOdW1bTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEVdOwkvLyBjb21wYXJlIHdpdGggdGhyZXNob2xkWzFdCi0JVUxPTkcJCQlPbmVTZWNJbldpbmRvd0NvdW50OwotCVVMT05HCQkJT25lU2VjRnJhbWVEdXBsaWNhdGVDb3VudDsKLQlVTE9ORwkJCU9uZVNlY091dFdpbmRvd0NvdW50OwotCVVDSEFSCQkJRGVsT3JpQWN0OwotCVVDSEFSCQkJRGVsUmVjQWN0OwotCVVDSEFSCQkJUlRTU2hvcnRQcm90OwotCVVDSEFSCQkJUlRTTG9uZ1Byb3Q7Ci0JQk9PTEVBTgkJCWJSVFNMb25nUHJvdE9uOwotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUJPT0xFQU4JCQliTGFzdEF0aGVyb3M7Ci0gICAgQk9PTEVBTgkJCWJDdXJyZW50QXRoZXJvczsKLSAgICBCT09MRUFOICAgICAgICAgYk5vd0F0aGVyb3NCdXJzdE9uOwotCUJPT0xFQU4JCQliTmV4dERpc2FibGVSeEJBOwotICAgIEJPT0xFQU4JCQliVG9nZ2xlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotfSBJT1RfU1RSVUMsICpQSU9UX1NUUlVDOwotCi0KLS8vIFRoaXMgaXMgdGhlIHJlZ2lzdHJ5IHNldHRpbmcgZm9yIDgwMi4xMW4gdHJhbnNtaXQgc2V0dGluZy4gIFVzZWQgaW4gYWR2YW5jZWQgcGFnZS4KLXR5cGVkZWYgdW5pb24gX1JFR19UUkFOU01JVF9TRVRUSU5HIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gc3RydWN0IHsKLSAgICAgICAgIFVJTlQzMiAgcnN2OjEzOwotCQkgVUlOVDMyICBFWFRDSEE6MjsKLQkJIFVJTlQzMiAgSFRNT0RFOjE7Ci0JCSBVSU5UMzIgIFRSQU5TTk86MjsKLQkJIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCi0JCSBVSU5UMzIgIFNob3J0R0k6MTsKLQkJIFVJTlQzMiAgQlc6MTsgLy9jaGFubmVsIGJhbmR3aWR0aCAyME1IeiBvciA0MCBNSHoKLQkJIFVJTlQzMiAgVHhCRjoxOyAvLyAzKjMKLQkJIFVJTlQzMiAgcnN2MDoxMDsKLQkJIC8vVUlOVDMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotICAgICAgICAgLy9VSU5UMzIgIFBoeU1vZGU6NDsKLSAgICB9IGZpZWxkOwotI2Vsc2UKLSBzdHJ1Y3QgewotICAgICAgICAgLy9VSU5UMzIgIFBoeU1vZGU6NDsKLSAgICAgICAgIC8vVUlOVDMyICBNQ1M6NzsgICAgICAgICAgICAgICAgIC8vIE1DUwotCQkgVUlOVDMyICByc3YwOjEwOwotCQkgVUlOVDMyICBUeEJGOjE7Ci0gICAgICAgICBVSU5UMzIgIEJXOjE7IC8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0gICAgICAgICBVSU5UMzIgIFNob3J0R0k6MTsKLSAgICAgICAgIFVJTlQzMiAgU1RCQzoxOyAvL1NQQUNFCi0gICAgICAgICBVSU5UMzIgIFRSQU5TTk86MjsKLSAgICAgICAgIFVJTlQzMiAgSFRNT0RFOjE7Ci0gICAgICAgICBVSU5UMzIgIEVYVENIQToyOwotICAgICAgICAgVUlOVDMyICByc3Y6MTM7Ci0gICAgfSBmaWVsZDsKLSNlbmRpZgotIFVJTlQzMiAgIHdvcmQ7Ci19IFJFR19UUkFOU01JVF9TRVRUSU5HLCAqUFJFR19UUkFOU01JVF9TRVRUSU5HOwotCi0KLXR5cGVkZWYgdW5pb24gIF9ERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkcgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlzdHJ1Y3QJewotCQkJVVNIT1JUCQlyc3Y6MzsKLQkJCVVTSE9SVAkJRml4ZWRUeE1vZGU6MjsJCQkvLyBJZiBNQ1MgaXNuJ3QgQVVUTywgZml4IHJhdGUgaW4gQ0NLLCBPRkRNIG9yIEhUIG1vZGUuCi0JCQlVU0hPUlQJCVBoeU1vZGU6NDsKLQkJCVVTSE9SVAkJTUNTOjc7ICAgICAgICAgICAgICAgICAvLyBNQ1MKLQl9CWZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QJewotCQkJVVNIT1JUCQlNQ1M6NzsJCQkvLyBNQ1MKLQkJCVVTSE9SVAkJUGh5TW9kZTo0OwotCQkJVVNIT1JUCQlGaXhlZFR4TW9kZToyOwkJCS8vIElmIE1DUyBpc24ndCBBVVRPLCBmaXggcmF0ZSBpbiBDQ0ssIE9GRE0gb3IgSFQgbW9kZS4KLQkJCVVTSE9SVAkJcnN2OjM7Ci0JfQlmaWVsZDsKLSNlbmRpZgotCVVTSE9SVAkJd29yZDsKLSB9IERFU0lSRURfVFJBTlNNSVRfU0VUVElORywgKlBERVNJUkVEX1RSQU5TTUlUX1NFVFRJTkc7Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKglNdWx0aXBsZSBTU0lEIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBXTEFOX01BWF9OVU1fT0ZfVElNCQkJKChNQVhfTEVOX09GX01BQ19UQUJMRSA+PiAzKSArIDEpIC8qIC84ICsgMSAqLwotI2RlZmluZSBXTEFOX0NUX1RJTV9CQ01DX09GRlNFVAkJMCAvKiB1bml0OiAzMkIgKi8KLQotLyogY2xlYXIgYmNtYyBUSU0gYml0ICovCi0jZGVmaW5lIFdMQU5fTVJfVElNX0JDTUNfQ0xFQVIoYXBpZHgpIFwKLQlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1tXTEFOX0NUX1RJTV9CQ01DX09GRlNFVF0gJj0gfkJJVDhbMF07Ci0KLS8qIHNldCBiY21jIFRJTSBiaXQgKi8KLSNkZWZpbmUgV0xBTl9NUl9USU1fQkNNQ19TRVQoYXBpZHgpIFwKLQlwQWQtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1tXTEFOX0NUX1RJTV9CQ01DX09GRlNFVF0gfD0gQklUOFswXTsKLQotLyogY2xlYXIgYSBzdGF0aW9uIFBTIFRJTSBiaXQgKi8KLSNkZWZpbmUgV0xBTl9NUl9USU1fQklUX0NMRUFSKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCi0JewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCi0JCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCi0JCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSAmPSAofkJJVDhbYml0X29mZnNldF0pOyB9Ci0KLS8qIHNldCBhIHN0YXRpb24gUFMgVElNIGJpdCAqLwotI2RlZmluZSBXTEFOX01SX1RJTV9CSVRfU0VUKGFkX3AsIGFwaWR4LCB3Y2lkKSBcCi0JewlVQ0hBUiB0aW1fb2Zmc2V0ID0gd2NpZCA+PiAzOyBcCi0JCVVDSEFSIGJpdF9vZmZzZXQgPSB3Y2lkICYgMHg3OyBcCi0JCWFkX3AtPkFwQ2ZnLk1CU1NJRFthcGlkeF0uVGltQml0bWFwc1t0aW1fb2Zmc2V0XSB8PSBCSVQ4W2JpdF9vZmZzZXRdOyB9Ci0KLQotLy8gY29uZmlndXJhdGlvbiBjb21tb24gdG8gT1BNT0RFX0FQIGFzIHdlbGwgYXMgT1BNT0RFX1NUQQotdHlwZWRlZiBzdHJ1Y3QgX0NPTU1PTl9DT05GSUcgewotCi0JQk9PTEVBTgkJYkNvdW50cnlGbGFnOwotCVVDSEFSCQlDb3VudHJ5Q29kZVszXTsKLQlVQ0hBUgkJR2VvZ3JhcGh5OwotCVVDSEFSICAgICAgIENvdW50cnlSZWdpb247ICAgICAgLy8gRW51bSBvZiBjb3VudHJ5IHJlZ2lvbiwgMDpGQ0MsIDE6SUMsIDI6RVRTSSwgMzpTUEFJTiwgNDpGcmFuY2UsIDU6TUtLLCA2Ok1LSzEsIDc6SXNyYWVsCi0JVUNIQVIgICAgICAgQ291bnRyeVJlZ2lvbkZvckFCYW5kOwkvLyBFbnVtIG9mIGNvdW50cnkgcmVnaW9uIGZvciBBIGJhbmQKLQlVQ0hBUiAgICAgICBQaHlNb2RlOyAgICAgICAgICAgIC8vIFBIWV8xMUEsIFBIWV8xMUIsIFBIWV8xMUJHX01JWEVELCBQSFlfQUJHX01JWEVECi0JVUNIQVIgICAgICAgRGVzaXJlZFBoeU1vZGU7ICAgICAgICAgICAgLy8gUEhZXzExQSwgUEhZXzExQiwgUEhZXzExQkdfTUlYRUQsIFBIWV9BQkdfTUlYRUQKLQlVU0hPUlQgICAgICBEc2lmczsgICAgICAgICAgICAgIC8vIGluIHVuaXRzIG9mIHVzZWMKLQlVTE9ORyAgICAgICBQYWNrZXRGaWx0ZXI7ICAgICAgIC8vIFBhY2tldCBmaWx0ZXIgZm9yIHJlY2VpdmluZwotCVVJTlQ4CQlSZWd1bGF0b3J5Q2xhc3NbTUFYX05VTV9PRl9SRUdVTEFUT1JZX0NMQVNTXTsKLQotCUNIQVIgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAotCVVDSEFSICAgICAgIFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCi0JVUNIQVIgICAgICAgTGFzdFNzaWRMZW47ICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCBzc2lkIGxlbmd0aCBpbiB1c2VkCi0JQ0hBUiAgICAgICAgTGFzdFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsgLy8gTk9UIE5VTEwtdGVybWluYXRlZAotCVVDSEFSCQlMYXN0QnNzaWRbTUFDX0FERFJfTEVOXTsKLQotCVVDSEFSICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgQmVhY29uUGVyaW9kOwotCVVDSEFSICAgICAgIENoYW5uZWw7Ci0JVUNIQVIgICAgICAgQ2VudHJhbENoYW5uZWw7CS8vIENlbnRyYWwgQ2hhbm5lbCB3aGVuIHVzaW5nIDQwTUh6IGlzIGluZGljYXRpbmcuIG5vdCByZWFsIGNoYW5uZWwuCi0KLQlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgRGVzaXJlUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107ICAgICAgLy8gT0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTCi0JVUNIQVIgICAgICAgTWF4RGVzaXJlZFJhdGU7Ci0JVUNIQVIgICAgICAgRXhwZWN0ZWRBQ0tSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQotCVVMT05HICAgICAgIEJhc2ljUmF0ZUJpdG1hcDsgICAgICAgIC8vIGJhY2t1cCBiYXNpYyByYXRlYml0bWFwCi0KLQlCT09MRUFOCQliQVBTRENhcGFibGU7Ci0JQk9PTEVBTgkJYkluU2VydmljZVBlcmlvZDsKLQlCT09MRUFOCQliQVBTREFDX0JFOwotCUJPT0xFQU4JCWJBUFNEQUNfQks7Ci0JQk9PTEVBTgkJYkFQU0RBQ19WSTsKLQlCT09MRUFOCQliQVBTREFDX1ZPOwotCi0JLyogYmVjYXVzZSBUU1BFQyBjYW4gbW9kaWZ5IHRoZSBBUFNEIGZsYWcsIHdlIG5lZWQgdG8ga2VlcCB0aGUgQVBTRCBmbGFnCi0JCXJlcXVlc3RlZCBpbiBhc3NvY2lhdGlvbiBzdGFnZSBmcm9tIHRoZSBzdGF0aW9uOwotCQl3ZSBuZWVkIHRvIHJlY292ZXIgdGhlIEFQU0QgZmxhZyBhZnRlciB0aGUgVFNQRUMgaXMgZGVsZXRlZC4gKi8KLQlCT09MRUFOCQliQUNNQVBTREJhY2t1cFs0XTsgLyogZm9yIGRlbGl2ZXJ5LWVuYWJsZWQgJiB0cmlnZ2VyLWVuYWJsZWQgYm90aCAqLwotCUJPT0xFQU4JCWJBQ01BUFNEVHJbNF07IC8qIG5vIHVzZSAqLwotCi0JQk9PTEVBTgkJYk5lZWRTZW5kVHJpZ2dlckZyYW1lOwotCUJPT0xFQU4JCWJBUFNERm9yY2VQb3dlclNhdmU7CS8vIEZvcmNlIHBvd2VyIHNhdmUgbW9kZSwgc2hvdWxkIG9ubHkgdXNlIGluIEFQU0QtU1RBVVQKLQlVTE9ORwkJVHJpZ2dlclRpbWVyQ291bnQ7Ci0JVUNIQVIJCU1heFNQTGVuZ3RoOwotCVVDSEFSCQlCQlBDdXJyZW50Qlc7CS8vIEJXXzEwLAlCV18yMCwgQldfNDAKLQkvLyBtb3ZlIHRvIE1VTFRJU1NJRF9TVFJVQ1QgZm9yIE1CU1MKLQkvL0hUVFJBTlNNSVRfU0VUVElORwlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgotCVJFR19UUkFOU01JVF9TRVRUSU5HICAgICAgICBSZWdUcmFuc21pdFNldHRpbmc7IC8vcmVnaXN0cnkgdHJhbnNtaXQgc2V0dGluZy4gdGhpcyBpcyBmb3IgcmVhZGluZyByZWdpc3RyeSBzZXR0aW5nIG9ubHkuIG5vdCB1c2VmdWwuCi0JLy9VQ0hBUiAgICAgICBGaXhlZFR4TW9kZTsgICAgICAgICAgICAgIC8vIEZpeGVkIFR4IE1vZGUgKENDSywgT0ZETSksIGZvciBIVCBmaXhlZCB0eCBtb2RlIChHRiwgTUlYKSAsIHJlZmVyIHRvIFJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5IVE1vZGUKLQlVQ0hBUiAgICAgICBUeFJhdGU7ICAgICAgICAgICAgICAgICAvLyBTYW1lIHZhbHVlIHRvIGZpbGwgaW4gVFhELiBUeFJhdGUgaXMgNi1iaXQKLQlVQ0hBUiAgICAgICBNYXhUeFJhdGU7ICAgICAgICAgICAgICAvLyBSQVRFXzEsIFJBVEVfMiwgUkFURV81XzUsIFJBVEVfMTEKLQlVQ0hBUiAgICAgICBUeFJhdGVJbmRleDsgICAgICAgICAgICAvLyBUeCByYXRlIGluZGV4IGluIFJhdGVTd2l0Y2hUYWJsZQotCVVDSEFSICAgICAgIFR4UmF0ZVRhYmxlU2l6ZTsgICAgICAgIC8vIFZhbGlkIFR4IHJhdGUgdGFibGUgc2l6ZSBpbiBSYXRlU3dpdGNoVGFibGUKLQkvL0JPT0xFQU4JCWJBdXRvVHhSYXRlU3dpdGNoOwotCVVDSEFSICAgICAgIE1pblR4UmF0ZTsgICAgICAgICAgICAgIC8vIFJBVEVfMSwgUkFURV8yLCBSQVRFXzVfNSwgUkFURV8xMQotCVVDSEFSICAgICAgIFJ0c1JhdGU7ICAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4Ci0JSFRUUkFOU01JVF9TRVRUSU5HCU1sbWVUcmFuc21pdDsgICAvLyBNR01UIGZyYW1lIFBIWSByYXRlIHNldHRpbmcgd2hlbiBvcGVyYXRpbiBhdCBIdCByYXRlLgotCVVDSEFSICAgICAgIE1sbWVSYXRlOyAgICAgICAgICAgICAgIC8vIFJBVEVfeHh4LCB1c2VkIHRvIHNlbmQgTUxNRSBmcmFtZXMKLQlVQ0hBUiAgICAgICBCYXNpY01sbWVSYXRlOyAgICAgICAgICAvLyBEZWZhdWx0IFJhdGUgZm9yIHNlbmRpbmcgTUxNRSBmcmFtZXMKLQotCVVTSE9SVCAgICAgIFJ0c1RocmVzaG9sZDsgICAgICAgICAgIC8vIGluIHVuaXQgb2YgQllURQotCVVTSE9SVCAgICAgIEZyYWdtZW50VGhyZXNob2xkOyAgICAgIC8vIGluIHVuaXQgb2YgQllURQotCi0JVUNIQVIgICAgICAgVHhQb3dlcjsgICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiBtVwotCVVMT05HICAgICAgIFR4UG93ZXJQZXJjZW50YWdlOyAgICAgIC8vIDB+MTAwICUKLQlVTE9ORyAgICAgICBUeFBvd2VyRGVmYXVsdDsgICAgICAgICAvLyBrZWVwIGZvciBUeFBvd2VyUGVyY2VudGFnZQotCVVJTlQ4CQlQd3JDb25zdHJhaW50OwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQkFDQVBfU1RSVUMgICAgICAgIEJBQ2FwYWJpbGl0eTsgLy8gICBOTyBVU0UgPSAwWEZGICA7ICBJTU1FRF9CQSA9MSAgOyAgREVMQVlfQkE9MAotCUJBQ0FQX1NUUlVDICAgICAgICBSRUdCQUNhcGFiaWxpdHk7IC8vICAgTk8gVVNFID0gMFhGRiAgOyAgSU1NRURfQkEgPTEgIDsgIERFTEFZX0JBPTAKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlJT1RfU1RSVUMJCUlPVGVzdFBhcm07CS8vIDgwMi4xMW4gSW50ZXJPcGJpbGl0eSBUZXN0IFBhcmFtZXRlcjsKLQlVTE9ORyAgICAgICBUeFByZWFtYmxlOyAgICAgICAgICAgICAvLyBSdDgwMl8xMVByZWFtYmxlTG9uZywgUnQ4MDJfMTFQcmVhbWJsZVNob3J0LCBSdDgwMl8xMVByZWFtYmxlQXV0bwotCUJPT0xFQU4gICAgIGJVc2VaZXJvVG9EaXNhYmxlRnJhZ21lbnQ7ICAgICAvLyBNaWNyb3NvZnQgdXNlIDAgYXMgZGlzYWJsZQotCVVMT05HICAgICAgIFVzZUJHUHJvdGVjdGlvbjsgICAgICAgIC8vIDA6IGF1dG8sIDE6IGFsd2F5cyB1c2UsIDI6IGFsd2F5cyBub3QgdXNlCi0JQk9PTEVBTiAgICAgYlVzZVNob3J0U2xvdFRpbWU7ICAgICAgLy8gMDogZGlzYWJsZSwgMSAtIHVzZSBzaG9ydCBzbG90ICg5dXMpCi0JQk9PTEVBTiAgICAgYkVuYWJsZVR4QnVyc3Q7ICAgICAgICAgLy8gMTogZW5ibGUgVFggUEFDS0VUIEJVUlNUICh3aGVuIEJBIGlzIGVzdGFibGlzaGVkIG9yIEFQIGlzIG5vdCBhIGxlZ2FjeSBXTU0gQVApLCAwOiBkaXNhYmxlIFRYIFBBQ0tFVCBCVVJTVAotCUJPT0xFQU4gICAgIGJBZ2dyZWdhdGlvbkNhcGFibGU7ICAgICAgLy8gMTogZW5hYmxlIFRYIGFnZ3JlZ2F0aW9uIHdoZW4gdGhlIHBlZXIgc3VwcG9ydHMgaXQKLQlCT09MRUFOICAgICBiUGlnZ3lCYWNrQ2FwYWJsZTsJCS8vIDE6IGVuYWJsZSBUWCBwaWdneS1iYWNrIGFjY29yZGluZyBNQUMncyB2ZXJzaW9uCi0JQk9PTEVBTiAgICAgYklFRUU4MDIxMUg7CQkJLy8gMTogZW5hYmxlIElFRUU4MDIuMTFoIHNwZWMuCi0JVUxPTkcJCURpc2FibGVPTEJDRGV0ZWN0OwkJLy8gMDogZW5hYmxlIE9MQkMgZGV0ZWN0OyAxIGRpc2FibGUgT0xCQyBkZXRlY3QKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCUJPT0xFQU4JCQkJYlJkZzsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlCT09MRUFOICAgICAgICAgICAgIGJXbW1DYXBhYmxlOyAgICAgICAgLy8gMDpkaXNhYmxlIFdNTSwgMTplbmFibGUgV01NCi0JUU9TX0NBUEFCSUxJVFlfUEFSTSBBUFFvc0NhcGFiaWxpdHk7ICAgIC8vIFFPUyBjYXBhYmlsaXR5IG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKLQlFRENBX1BBUk0gICAgICAgICAgIEFQRWRjYVBhcm07ICAgICAgICAgLy8gRURDQSBwYXJhbWV0ZXJzIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKLQlRQlNTX0xPQURfUEFSTSAgICAgIEFQUWJzc0xvYWQ7ICAgICAgICAgLy8gUUJTUyBsb2FkIG9mIHRoZSBjdXJyZW50IGFzc29jaWF0ZWQgQVAKLQlVQ0hBUiAgICAgICAgICAgICAgIEFja1BvbGljeVs0XTsgICAgICAgLy8gQUNLIHBvbGljeSBvZiB0aGUgc3BlY2lmaWVkIEFDLiBzZWUgQUNLX3h4eAotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCUJPT0xFQU4JCQkJYkRMU0NhcGFibGU7CQkvLyAwOmRpc2FibGUgRExTLCAxOmVuYWJsZSBETFMKLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQkvLyBhIGJpdG1hcCBvZiBCT09MRUFOIGZsYWdzLiBlYWNoIGJpdCByZXByZXNlbnQgYW4gb3BlcmF0aW9uIHN0YXR1cyBvZiBhIHBhcnRpY3VsYXIKLQkvLyBCT09MRUFOIGNvbnRyb2wsIGVpdGhlciBPTiBvciBPRkYuIFRoZXNlIGZsYWdzIHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWQgdmlhCi0JLy8gT1BTVEFUVVNfVEVTVF9GTEFHKCksIE9QU1RBVFVTX1NFVF9GTEFHKCksIE9QX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgotCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24KLQlVTE9ORyAgICAgICAgICAgICAgIE9wU3RhdHVzRmxhZ3M7Ci0KLQlCT09MRUFOCQkJCU5kaXNSYWRpb1N0YXRlT2ZmOyAvL0ZvciBIQ1QgMTIuMCwgc2V0IHRoaXMgZmxhZyB0byBUUlVFIGluc3RlYWQgb2YgY2FsbGVkIE1sbWVSYWRpb09mZi4KLQlBQkdCQU5EX1NUQVRFCQlCYW5kU3RhdGU7CQkvLyBGb3Igc2V0dGluZyBCQlAgdXNlZCBvbiBCL0cgb3IgQSBtb2RlLgotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotCVVDSEFSCQkJCWJSeEFudERpdmVyc2l0eTsgLy8gMDpkaXNhYmxlLCAxOmVuYWJsZSBTb2Z0d2FyZSBSeCBBbnRlbm5hIERpdmVyc2l0eS4KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQotCS8vIElFRUU4MDIuMTFILS1ERlMuCi0JUkFEQVJfREVURUNUX1NUUlVDVAlSYWRhckRldGVjdDsKLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLQlDQVJSSUVSX0RFVEVDVElPTl9TVFJVQ1QJCUNhcnJpZXJEZXRlY3Q7Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gSFQKLQlVQ0hBUgkJCUJBU2l6ZTsJCS8vIFVTZXIgZGVzaXJlZCBCQVdpbmRvd1NpemUuIFNob3VsZCBub3QgZXhjZWVkIG91ciBtYXggY2FwYWJpbGl0eQotCS8vUlRfSFRfQ0FQQUJJTElUWQlTdXBwb3J0ZWRIdFBoeTsKLQlSVF9IVF9DQVBBQklMSVRZCURlc2lyZWRIdFBoeTsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEhUSW5mbzsJLy8gVXNlZnVsIGFzIEFQLgotCS8vVGhpcyBJRSBpcyB1c2VkIHdpdGggY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGVsZW1lbnQgd2hlbiBjaGFuZ2luZyB0byBhIG5ldyA0ME1Iei4KLQkvL1RoaXMgSUUgaXMgaW5jbHVkZWQgaW4gY2hhbm5lbCBzd2l0Y2ggYW1tb3VuY2VtZW50IGZyYW1lcyA3LjQuMS41LCBiZWFjb25zLCBwcm9iZSBSc3AuCi0JTkVXX0VYVF9DSEFOX0lFCU5ld0V4dENoYW5PZmZzZXQ7CS8vNy4zLjIuMjBBLCAxIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIGFib3ZlIHRoZSBjb250cm9sIGNoYW5uZWwsIDMgaWYgYmVsb3csIDAgaWYgbm90IHByZXNlbnQKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLQlVQ0hBUgkJCQkJQnNzMjA0MENvZXhpc3RGbGFnOwkJLy8gYml0IDA6IGJCc3NDb2V4aXN0VGltZXJSdW5uaW5nLCBiaXQgMTogTmVlZFN5bmNBZGRIdEluZm8uCi0JUkFMSU5LX1RJTUVSX1NUUlVDVAlCc3MyMDQwQ29leGlzdFRpbWVyOwotCi0JLy9UaGlzIElFIGlzIHVzZWQgZm9yIDIwLzQwIEJTUyBDb2V4aXN0ZW5jZS4KLQlCU1NfMjA0MF9DT0VYSVNUX0lFCQlCU1MyMDQwQ29leGlzdEluZm87Ci0JLy8gPT09PT09IDExbiBEMy4wID09PT09PT09PT09PT09PT09PT09PT09PgotCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiA1fjEwMDAKLQlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3RpdmVEd2VsbDsJCQkJLy8gVW5pdCA6IFRVLiAxMH4xMDAwCi0JVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoVHJpZ2dlclNjYW5JbnQ7CQkJLy8gVW5pdCA6IFNlY29uZAotCVVTSE9SVAkJCQkJRG90MTFPQnNzU2NhblBhc3NpdmVUb3RhbFBlckNoYW5uZWw7CS8vIFVuaXQgOiBUVS4gMjAwfjEwMDAwCi0JVVNIT1JUCQkJCQlEb3QxMU9Cc3NTY2FuQWN0aXZlVG90YWxQZXJDaGFubmVsOwkvLyBVbml0IDogVFUuIDIwfjEwMDAwCi0JVVNIT1JUCQkJCQlEb3QxMUJzc1dpZHRoQ2hhblRyYW5EZWxheUZhY3RvcjsKLQlVU0hPUlQJCQkJCURvdDExT0Jzc1NjYW5BY3Rpdml0eVRocmU7CQkJCS8vIFVuaXQgOiBwZXJjZW50YWdlCi0KLQlVTE9ORwkJCQkJRG90MTFCc3NXaWR0aENoYW5UcmFuRGVsYXk7CQkJLy8gbXVsdGlwbGUgb2YgKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQotCVVMT05HCQkJCQlDb3VudERvd25DdHI7CS8vIENvdW50RG93biBDb3VudGVyIGZyb20gKERvdDExQnNzV2lkdGhUcmlnZ2VyU2NhbkludCAqIERvdDExQnNzV2lkdGhDaGFuVHJhbkRlbGF5RmFjdG9yKQotCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgVHJpZ2dlckV2ZW50VGFiTG9jazsKLQlCU1NfMjA0MF9DT0VYSVNUX0lFCQlMYXN0QlNTQ29leGlzdDIwNDA7Ci0JQlNTXzIwNDBfQ09FWElTVF9JRQkJQlNTQ29leGlzdDIwNDA7Ci0JVFJJR0dFUl9FVkVOVF9UQUIJCVRyaWdnZXJFdmVudFRhYjsKLQlVQ0hBUgkJCQkJQ2hhbm5lbExpc3RJZHg7Ci0JLy8gPD09PT09PSAxMW4gRDMuMCA9PT09PT09PT09PT09PT09PT09PT09PQotCUJPT0xFQU4JCQkJCWJPdmVybGFwU2Nhbm5pbmc7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCi0gICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgYkhUUHJvdGVjdDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICBiTUlNT1BTRW5hYmxlOwotICAgIEJPT0xFQU4JCQkJCWJCQURlY2xpbmU7Ci0vLzIwMDgvMTEvMDU6IEtIIGFkZCB0byBzdXBwb3J0IEFudGVubmEgcG93ZXItc2F2aW5nIG9mIEFQPC0tCi0JQk9PTEVBTgkJCQkJYkdyZWVuQVBFbmFibGU7Ci0JQk9PTEVBTgkJCQkJYkJsb2NrQW50RGl2Zm9yR3JlZW5BUDsKLS8vMjAwOC8xMS8wNTogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVAtLT4KLQlCT09MRUFOCQkJCQliRGlzYWJsZVJlb3JkZXJpbmc7Ci0JQk9PTEVBTgkJCQkJYkZvcnR5X01oel9JbnRvbGVyYW50OwotCUJPT0xFQU4JCQkJCWJFeHRDaGFubmVsU3dpdGNoQW5ub3VuY2VtZW50OwotCUJPT0xFQU4JCQkJCWJSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHM7Ci0JVUxPTkcJCQkJCUxhc3RSY3ZCU1NXaWR0aFRyaWdnZXJFdmVudHNUaW1lOwotCi0JVUNIQVIJCQkJCVR4QkFTaXplOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gRW5hYmxlIHdpcmVsZXNzIGV2ZW50Ci0JQk9PTEVBTgkJCQliV2lyZWxlc3NFdmVudDsKLQlCT09MRUFOCQkJCWJXaUZpVGVzdDsJCQkJLy8gRW5hYmxlIHRoaXMgcGFyYW1ldGVyIGZvciBXaUZpIHRlc3QKLQotCS8vIFR4ICYgUnggU3RyZWFtIG51bWJlciBzZWxlY3Rpb24KLQlVQ0hBUgkJCQlUeFN0cmVhbTsKLQlVQ0hBUgkJCQlSeFN0cmVhbTsKLQotCS8vIHRyYW5zbWl0IHBoeSBtb2RlLCB0cmFzbWl0IHJhdGUgZm9yIE11bHRpY2FzdC4KLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0JVUNIQVIJCQkJTWNhc3RUcmFuc21pdE1jczsKLQlVQ0hBUgkJCQlNY2FzdFRyYW5zbWl0UGh5TW9kZTsKLSNlbmRpZiAvLyBNQ0FTVF9SQVRFX1NQRUNJRklDIC8vCi0KLQlCT09MRUFOCQkJYkhhcmR3YXJlUmFkaW87ICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIGVuYWJsZWQKLQotCi0KLQlORElTX1NQSU5fTE9DSwkJCU1lYXN1cmVSZXFUYWJMb2NrOwotCVBNRUFTVVJFX1JFUV9UQUIJCXBNZWFzdXJlUmVxVGFiOwotCi0JTkRJU19TUElOX0xPQ0sJCQlUcGNSZXFUYWJMb2NrOwotCVBUUENfUkVRX1RBQgkJCXBUcGNSZXFUYWI7Ci0KLQkvLyB0cmFuc21pdCBwaHkgbW9kZSwgdHJhc21pdCByYXRlIGZvciBNdWx0aWNhc3QuCi0jaWZkZWYgTUNBU1RfUkFURV9TUEVDSUZJQwotCUhUVFJBTlNNSVRfU0VUVElORwkJTUNhc3RQaHlNb2RlOwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQotI2lmZGVmIFNJTkdMRV9TS1UKLQlVSU5UMTYJCQkJCURlZmluZU1heFR4UHdyOwotI2VuZGlmIC8vIFNJTkdMRV9TS1UgLy8KLQotCi0JQk9PTEVBTgkJCQlQU1BYbGluazsgIC8vIDA6IERpc2FibGUuIDE6IEVuYWJsZQotCi0KLSNpZiBkZWZpbmVkKFJUMzA1eCl8fGRlZmluZWQoUlQzMHh4KQotCS8vIHJlcXVlc3QgYnkgR2FyeSwgZm9yIEhpZ2ggUG93ZXIgaXNzdWUKLQlVQ0hBUglIaWdoUG93ZXJQYXRjaERpc2FibGVkOwotI2VuZGlmCi0KLQlCT09MRUFOCQlIVF9EaXNhbGxvd1RLSVA7CQkvKiBSZXN0cmljdCB0aGUgZW5jcnlwdGlvbiB0eXBlIGluIDExbiBIVCBtb2RlICovCi19IENPTU1PTl9DT05GSUcsICpQQ09NTU9OX0NPTkZJRzsKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0vKiBNb2RpZmllZCBieSBXdSBYaS1LdW4gNC8yMS8yMDA2ICovCi0vLyBTVEEgY29uZmlndXJhdGlvbiBhbmQgc3RhdHVzCi10eXBlZGVmIHN0cnVjdCBfU1RBX0FETUlOX0NPTkZJRyB7Ci0JLy8gR1JPVVAgMSAtCi0JLy8gICBVc2VyIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gUmVnaXN0cnksIEUyUFJPTSBvciBPSURfeHh4LiBUaGVzZSBzZXR0aW5ncyBkZXNjcmliZQotCS8vICAgdGhlIHVzZXIgaW50ZW5kZWQgY29uZmlndXJhdGlvbiwgYnV0IG5vdCBuZWNlc3NhcnkgZnVsbHkgZXF1YWwgdG8gdGhlIGZpbmFsCi0JLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIGFmdGVyIG5lZ290aWF0aW9uL2NvbXByb21pemUgd2l0aCB0aGUgQlNTIGhvbGRlciAoZWl0aGVyCi0JLy8gICBBUCBvciBJQlNTIGhvbGRlcikuCi0JLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAotCVVDSEFSICAgICAgIEJzc1R5cGU7ICAgICAgICAgICAgICAvLyBCU1NfSU5GUkEgb3IgQlNTX0FESE9DCi0JVVNIT1JUICAgICAgQXRpbVdpbjsgICAgICAgICAgLy8gdXNlZCB3aGVuIHN0YXJ0aW5nIGEgbmV3IElCU1MKLQotCS8vIEdST1VQIDIgLQotCS8vICAgVXNlciBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIFJlZ2lzdHJ5LCBFMlBST00gb3IgT0lEX3h4eC4gVGhlc2Ugc2V0dGluZ3MgZGVzY3JpYmUKLQkvLyAgIHRoZSB1c2VyIGludGVuZGVkIGNvbmZpZ3VyYXRpb24sIGFuZCBzaG91bGQgYmUgYWx3YXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsCi0JLy8gICBzZXR0aW5ncyBpbiBBQ1RJVkUgQlNTIHdpdGhvdXQgY29tcHJvbWlzaW5nIHdpdGggdGhlIEJTUyBob2xkZXIuCi0JLy8gICBPbmNlIGluaXRpYWxpemVkLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2FuIG9ubHkgYmUgY2hhbmdlZCB2aWEgT0lEX3h4eAotCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyOwotCVVDSEFSICAgICAgIFJzc2lUcmlnZ2VyTW9kZTsgICAgICAvLyBSU1NJX1RSSUdHRVJFRF9VUE9OX0JFTE9XX1RIUkVTSE9MRCBvciBSU1NJX1RSSUdHRVJFRF9VUE9OX0VYQ0NFRURfVEhSRVNIT0xECi0JVVNIT1JUICAgICAgRGVmYXVsdExpc3RlbkNvdW50OyAgIC8vIGRlZmF1bHQgbGlzdGVuIGNvdW50OwotCVVMT05HICAgICAgIFdpbmRvd3NQb3dlck1vZGU7ICAgICAgICAgICAvLyBQb3dlciBtb2RlIGZvciBBQyBwb3dlcgotCVVMT05HICAgICAgIFdpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlOyAgICAvLyBQb3dlciBtb2RlIGZvciBiYXR0ZXJ5IGlmIGV4aXN0cwotCUJPT0xFQU4gICAgIGJXaW5kb3dzQUNDQU1FbmFibGU7ICAgICAgICAvLyBFbmFibGUgQ0FNIHBvd2VyIG1vZGUgd2hlbiBBQyBvbgotCUJPT0xFQU4gICAgIGJBdXRvUmVjb25uZWN0OyAgICAgICAgIC8vIFNldCB0byBUUlVFIHdoZW4gc2V0dGluZyBPSURfODAyXzExX1NTSUQgd2l0aCBubyBtYXRjaGluZyBCU1NJRAotCVVMT05HICAgICAgIFdpbmRvd3NQb3dlclByb2ZpbGU7ICAgIC8vIFdpbmRvd3MgcG93ZXIgcHJvZmlsZSwgZm9yIE5ESVM1LjEgUG5QCi0KLQkvLyBNSUI6aWVlZTgwMmRvdDExLmRvdDExc210KDEpLmRvdDExU3RhdGlvbkNvbmZpZ1RhYmxlKDEpCi0JVVNIT1JUICAgICAgUHNtOyAgICAgICAgICAgICAgICAgIC8vIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAgIChQV1JfQUNUSVZFfFBXUl9TQVZFKQotCVVTSE9SVCAgICAgIERpc2Fzc29jUmVhc29uOwotCVVDSEFSICAgICAgIERpc2Fzc29jU3RhW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgRGVhdXRoUmVhc29uOwotCVVDSEFSICAgICAgIERlYXV0aFN0YVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVCAgICAgIEF1dGhGYWlsUmVhc29uOwotCVVDSEFSICAgICAgIEF1dGhGYWlsU3RhW01BQ19BRERSX0xFTl07Ci0KLQlORElTXzgwMl8xMV9QUklWQUNZX0ZJTFRFUiAgICAgICAgICBQcml2YWN5RmlsdGVyOyAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKLQlORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICAgICBBdXRoTW9kZTsgICAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUwkJCQlPcmlnV2VwU3RhdHVzOwkvLyBPcmlnaW5hbCB3ZXAgc3RhdHVzIHNldCBmcm9tIE9JRAotCi0JLy8gQWRkIHRvIHN1cHBvcnQgZGlmZmVyZW50IGNpcGhlciBzdWl0ZSBmb3IgV1BBMi9XUEEgbW9kZQotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCQlHcm91cENpcGhlcjsJCS8vIE11bHRpY2FzdCBjaXBoZXIgc3VpdGUKLQlORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwkJUGFpckNpcGhlcjsJCQkvLyBVbmljYXN0IGNpcGhlciBzdWl0ZQotCUJPT0xFQU4JCQkJCQkJCWJNaXhDaXBoZXI7CQkJLy8gSW5kaWNhdGUgY3VycmVudCBQYWlyICYgR3JvdXAgdXNlIGRpZmZlcmVudCBjaXBoZXIgc3VpdGVzCi0JVVNIT1JUCQkJCQkJCQlSc25DYXBhYmlsaXR5OwotCi0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7Ci0KLQlVQ0hBUgkJV3BhUGFzc1BocmFzZVs2NF07CQkvLyBXUEEgUFNLIHBhc3MgcGhyYXNlCi0JVUlOVAkJV3BhUGFzc1BocmFzZUxlbjsJCS8vIHRoZSBsZW5ndGggb2YgV1BBIFBTSyBwYXNzIHBocmFzZQotCVVDSEFSCQlQTUtbMzJdOyAgICAgICAgICAgICAgICAvLyBXUEEgUFNLIG1vZGUgUE1LCi0JVUNIQVIgICAgICAgUFRLWzY0XTsgICAgICAgICAgICAgICAgLy8gV1BBIFBTSyBtb2RlIFBUSwotCVVDSEFSCQlHVEtbMzJdOwkJCQkvLyBHVEsgZnJvbSBhdXRoZW50aWNhdG9yCi0JQlNTSURfSU5GTwlTYXZlZFBNS1tQTUtJRF9OT107Ci0JVUlOVAkJU2F2ZWRQTUtOdW07CQkJLy8gU2F2ZWQgUE1LSUQgbnVtYmVyCi0KLQlVQ0hBUgkJRGVmYXVsdEtleUlkOwotCi0KLQkvLyBXUEEgODAyLjF4IHBvcnQgY29udHJvbCwgV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQsIFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRAotCVVDSEFSICAgICAgIFBvcnRTZWN1cmVkOwotCi0JLy8gRm9yIFdQQSBjb3VudGVybWVhc3VyZXMKLQlVTE9ORyAgICAgICBMYXN0TWljRXJyb3JUaW1lOyAgIC8vIHJlY29yZCBsYXN0IE1JQyBlcnJvciB0aW1lCi0JVUxPTkcgICAgICAgTWljRXJyQ250OyAgICAgICAgICAvLyBTaG91bGQgYmUgMCwgMSwgMiwgdGhlbiByZXNldCB0byB6ZXJvIChhZnRlciBkaXNhc3NvaWNpYXRpb24pLgotCUJPT0xFQU4gICAgIGJCbG9ja0Fzc29jOyAgICAgICAgLy8gQmxvY2sgYXNzb2NpYXRlIGF0dGVtcHQgZm9yIDYwIHNlY29uZHMgYWZ0ZXIgY291bnRlciBtZWFzdXJlIG9jY3VycmVkLgotCS8vIEZvciBXUEEtUFNLIHN1cHBsaWNhbnQgc3RhdGUKLQlXUEFfU1RBVEUgICBXcGFTdGF0ZTsgICAgICAgICAgIC8vIERlZmF1bHQgaXMgU1NfTk9UVVNFIGFuZCBoYW5kbGVkIGJ5IG1pY3Jvc29mdCA4MDIuMXgKLQlVQ0hBUiAgICAgICBSZXBsYXlDb3VudGVyWzhdOwotCVVDSEFSICAgICAgIEFOb25jZVszMl07ICAgICAgICAgLy8gQU5vbmNlIGZvciBXUEEtUFNLIGZyb20gYXVyaGVudGljYXRvcgotCVVDSEFSICAgICAgIFNOb25jZVszMl07ICAgICAgICAgLy8gU05vbmNlIGZvciBXUEEtUFNLCi0KLQlVQ0hBUiAgICAgICBMYXN0U05SMDsgICAgICAgICAgICAgLy8gbGFzdCByZWNlaXZlZCBCRUFDT04ncyBTTlIKLQlVQ0hBUiAgICAgICBMYXN0U05SMTsgICAgICAgICAgICAvLyBsYXN0IHJlY2VpdmVkIEJFQUNPTidzIFNOUiBmb3IgMm5kICBhbnRlbm5hCi0JUlNTSV9TQU1QTEUgUnNzaVNhbXBsZTsKLQlVTE9ORyAgICAgICBOdW1PZkF2Z1Jzc2lTYW1wbGU7Ci0KLQlVTE9ORyAgICAgICBMYXN0QmVhY29uUnhUaW1lOyAgICAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgQkVBQ09OIFJYIHRpbWUKLQlVTE9ORyAgICAgICBMYXN0MTFiQmVhY29uUnhUaW1lOyAgLy8gT1MncyB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgMTFCIEJFQUNPTiBSWCB0aW1lCi0JVUxPTkcJCUxhc3QxMWdCZWFjb25SeFRpbWU7CS8vIE9TJ3MgdGltZXN0YW1wIG9mIHRoZSBsYXN0IDExRyBCRUFDT04gUlggdGltZQotCVVMT05HCQlMYXN0MjBOQmVhY29uUnhUaW1lOwkvLyBPUydzIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCAyME1IeiBOIEJFQUNPTiBSWCB0aW1lCi0KLQlVTE9ORyAgICAgICBMYXN0U2NhblRpbWU7ICAgICAgIC8vIFJlY29yZCBsYXN0IHNjYW4gdGltZSBmb3IgaXNzdWUgQlNTSURfU0NBTl9MSVNUCi0JVUxPTkcgICAgICAgU2NhbkNudDsgICAgICAgICAgICAvLyBTY2FuIGNvdW50cyBzaW5jZSBtb3N0IHJlY2VudCBTU0lELCBCU1NJRCwgU0NBTiBPSUQgcmVxdWVzdAotCUJPT0xFQU4gICAgIGJTd1JhZGlvOyAgICAgICAgICAgLy8gU29mdHdhcmUgY29udHJvbGxlZCBSYWRpbyBPbi9PZmYsIFRSVUU6IE9uCi0JQk9PTEVBTiAgICAgYkh3UmFkaW87ICAgICAgICAgICAvLyBIYXJkd2FyZSBjb250cm9sbGVkIFJhZGlvIE9uL09mZiwgVFJVRTogT24KLQlCT09MRUFOICAgICBiUmFkaW87ICAgICAgICAgICAgIC8vIFJhZGlvIHN0YXRlLCBBbmQgb2YgU3cgJiBIdyByYWRpbyBzdGF0ZQotCUJPT0xFQU4gICAgIGJIYXJkd2FyZVJhZGlvOyAgICAgLy8gSGFyZHdhcmUgY29udHJvbGxlZCBSYWRpbyBlbmFibGVkCi0JQk9PTEVBTiAgICAgYlNob3dIaWRkZW5TU0lEOyAgICAvLyBTaG93IGFsbCBrbm93biBTU0lEIGluIFNTSUQgbGlzdCBnZXQgb3BlcmF0aW9uCi0KLQkvLyBOZXcgZm9yIFdQQSwgd2luZG93cyB3YW50IHVzIHRvIHRvIGtlZXAgYXNzb2NpYXRpb24gaW5mb3JtYXRpb24gYW5kCi0JLy8gRml4ZWQgSUVzIGZyb20gbGFzdCBhc3NvY2lhdGlvbiByZXNwb25zZQotCU5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OICAgICBBc3NvY0luZm87Ci0JVVNIT1JUICAgICAgIFJlcVZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKLQlVQ0hBUiAgICAgICBSZXFWYXJJRXNbTUFYX1ZJRV9MRU5dOwkJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JVVNIT1JUICAgICAgIFJlc1ZhcklFTGVuOyAgICAgICAgICAgICAgICAvLyBMZW5ndGggb2YgbmV4dCBWSUUgaW5jbHVkZSBFSUQgJiBMZW5ndGgKLQlVQ0hBUiAgICAgICBSZXNWYXJJRXNbTUFYX1ZJRV9MRU5dOwotCi0JVUNIQVIgICAgICAgUlNOSUVfTGVuOwotCVVDSEFSICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsJLy8gVGhlIGNvbnRlbnQgc2F2ZWQgaGVyZSBzaG91bGQgYmUgbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0KLQlVTE9ORyAgICAgICAgICAgICAgIENMQnVzeUJ5dGVzOyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSB0b3RhbCBieXRlcyByZWNlaXZlZCBkdXJuaW5nIGNoYW5uZWwgbG9hZCBzY2FuIHRpbWUKLQlVU0hPUlQgICAgICAgICAgICAgIFJQSURlbnNpdHlbOF07ICAgICAgICAgICAgICAvLyBBcnJheSBmb3IgUlBJIGRlbnNpdHkgY29sbGVjdGlvbgotCi0JVUNIQVIgICAgICAgICAgICAgICBSTVJlcUNudDsgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCi0JVUNIQVIgICAgICAgICAgICAgICBDdXJyZW50Uk1SZXFJZHg7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG1lYXN1cmVtZW50IHJlcXVlc3Qgc2F2ZWQuCi0JQk9PTEVBTiAgICAgICAgICAgICBQYXJhbGxlbFJlcTsgICAgICAgICAgICAgICAgLy8gUGFyYWxsZWwgbWVhc3VyZW1lbnQsIG9ubHkgb25lIHJlcXVlc3QgcGVyZm9ybWVkLAotCQkJCQkJCQkJCQkJCS8vIEl0IG11c3QgYmUgdGhlIHNhbWUgY2hhbm5lbCB3aXRoIG1heGltdW0gZHVyYXRpb24KLQlVU0hPUlQgICAgICAgICAgICAgIFBhcmFsbGVsRHVyYXRpb247ICAgICAgICAgICAvLyBNYXhpbXVtIGR1cmF0aW9uIGZvciBwYXJhbGxlbCBtZWFzdXJlbWVudAotCVVDSEFSICAgICAgICAgICAgICAgUGFyYWxsZWxDaGFubmVsOyAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYW5uZWwgd2l0aCBwYXJhbGxlbCBtZWFzdXJlbWVudAotCVVTSE9SVCAgICAgICAgICAgICAgSUFQUFRva2VuOyAgICAgICAgICAgICAgICAgIC8vIElBUFAgZGlhbG9nIHRva2VuCi0JLy8gSGFjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0b2dyYW0gcGFyYW1ldGVycwotCVVDSEFSICAgICAgICAgICAgICAgTkhGYWN0b3I7ICAgICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlciBmb3IgTm9pc2UgaGlzdG9ncmFtCi0JVUNIQVIgICAgICAgICAgICAgICBDTEZhY3RvcjsgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyIGZvciBjaGFubmVsIGxvYWQKLQotCVJBTElOS19USU1FUl9TVFJVQ1QJU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwVGltZXI7Ci0JQk9PTEVBTgkJCQlTdGFRdWlja1Jlc3BvbmVGb3JSYXRlVXBUaW1lclJ1bm5pbmc7Ci0KLQlVQ0hBUgkJCUR0aW1Db3VudDsgICAgICAvLyAwLi4gRHRpbVBlcmlvZC0xCi0JVUNIQVIJCQlEdGltUGVyaW9kOyAgICAgLy8gZGVmYXVsdCA9IDMKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCVJUXzgwMl8xMV9ETFMJCURMU0VudHJ5W01BWF9OVU1fT0ZfRExTX0VOVFJZXTsKLQlVQ0hBUgkJCQlEbHNSZXBsYXlDb3VudGVyWzhdOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBUaGlzIGlzIG9ubHkgZm9yIFdIUUwgdGVzdC4KLQlCT09MRUFOCQkJCVdocWxUZXN0OwotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIFJBTElOS19USU1FUl9TVFJVQ1QgV3BhRGlzYXNzb2NBbmRCbG9ja0Fzc29jVGltZXI7Ci0gICAgLy8gRmFzdCBSb2FtaW5nCi0JQk9PTEVBTgkJICAgICAgICBiQXV0b1JvYW1pbmc7ICAgICAgIC8vIDA6ZGlzYWJsZSBhdXRvIHJvYW1pbmcgYnkgUlNTSSwgMTplbmFibGUgYXV0byByb2FtaW5nIGJ5IFJTU0kKLQlDSEFSCQkgICAgICAgIGRCbVRvUm9hbTsgICAgICAgICAgLy8gdGhlIGNvbmRpdGlvbiB0byByb2FtIHdoZW4gcmVjZWl2aW5nIFJzc2kgbGVzcyB0aGFuIHRoaXMgdmFsdWUuIEl0J3MgbmVnYXRpdmUgdmFsdWUuCi0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMVg7Ci0gICAgQk9PTEVBTiAgICAgICAgICAgICBJRUVFODAyMXhfcmVxdWlyZWRfa2V5czsKLSAgICBDSVBIRVJfS0VZCSAgICAgICAgRGVzaXJlU2hhcmVkS2V5WzRdOwkvLyBSZWNvcmQgdXNlciBkZXNpcmVkIFdFUCBrZXlzCi0gICAgVUNIQVIgICAgICAgICAgICAgICBEZXNpcmVTaGFyZWRLZXlJZDsKLQotICAgIC8vIDA6IGRyaXZlciBpZ25vcmVzIHdwYV9zdXBwbGljYW50Ci0gICAgLy8gMTogd3BhX3N1cHBsaWNhbnQgaW5pdGlhdGVzIHNjYW5uaW5nIGFuZCBBUCBzZWxlY3Rpb24KLSAgICAvLyAyOiBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzY2FubmluZywgQVAgc2VsZWN0aW9uLCBhbmQgSUVFRSA4MDIuMTEgYXNzb2NpYXRpb24gcGFyYW1ldGVycwotICAgIFVDSEFSICAgICAgICAgICAgICAgV3BhU3VwcGxpY2FudFVQOwotCVVDSEFSCQkJCVdwYVN1cHBsaWNhbnRTY2FuQ291bnQ7Ci0JQk9PTEVBTgkJCQliUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50OwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotICAgIENIQVIgICAgICAgICAgICAgICAgZGV2X25hbWVbMTZdOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgT3JpRGV2VHlwZTsKLQotICAgIEJPT0xFQU4gICAgICAgICAgICAgYlRHbldpZmlUZXN0OwotCUJPT0xFQU4JCQkgICAgYlNjYW5SZXFJc0Zyb21XZWJVSTsKLQotCUhUVFJBTlNNSVRfU0VUVElORwkJCQlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgotCURFU0lSRURfVFJBTlNNSVRfU0VUVElORwlEZXNpcmVkVHJhbnNtaXRTZXR0aW5nOwotCVJUX0hUX1BIWV9JTkZPCQkJCQlEZXNpcmVkSHRQaHlJbmZvOwotCUJPT0xFQU4JCQkJCQkJYkF1dG9UeFJhdGVTd2l0Y2g7Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBVQ0hBUiAgICAgICBCQlBSMzsKLQkvLyBQUyBDb250cm9sIGhhcyAyIG1lYW5pbmdzIGZvciBhZHZhbmNlZCBwb3dlciBzYXZlIGZ1bmN0aW9uLgotCS8vIDEuIEVuYWJsZVBTaW5JZGxlIDogV2hlbiBubyBjb25uZWN0aW9uLCBhbHdheXMgcmFkaW8gb2ZmIGV4Y2VwdCBuZWVkIHRvIGRvIHNpdGUgc3VydmV5LgotCS8vIDIuIEVuYWJsZU5ld1BTICA6IHdpbGwgc2F2ZSBtb3JlIGN1cnJlbnQgaW4gc2xlZXAgb3IgcmFkaW8gb2ZmIG1vZGUuCi0JUFNfQ09OVFJPTAkJCQlQU0NvbnRyb2w7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JVUNIQVIJCQkJSUVFRTgwMjExZENsaWVudE1vZGU7Ci0JVUNIQVIJCQkJU3RhT3JpQ291bnRyeUNvZGVbM107Ci0JVUNIQVIJCQkJU3RhT3JpR2VvZ3JhcGh5OwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotCi0KLQlCT09MRUFOCQkJCWJBdXRvQ29ubmVjdEJ5QnNzaWQ7Ci0JVUxPTkcJCQkJQmVhY29uTG9zdFRpbWU7CS8vIHNlY29uZHMKLQlCT09MRUFOCQkJYkZvcmNlVHhCdXJzdDsgICAgICAgICAgLy8gMTogZm9yY2UgZW5ibGUgVFggUEFDS0VUIEJVUlNULCAwOiBkaXNhYmxlCi19IFNUQV9BRE1JTl9DT05GSUcsICpQU1RBX0FETUlOX0NPTkZJRzsKLQotLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBrZWVwIHRoZSBjdXJyZW50IGFjdGl2ZSBCU1MvSUJTUydzIGNvbmZpZ3VyYXRpb24gdGhhdCB0aGlzIFNUQQotLy8gaGFkIGFncmVlZCB1cG9uIGpvaW5pbmcgdGhlIG5ldHdvcmsuIFdoaWNoIG1lYW5zIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHVzdWFsbHkgZGVjaWRlZAotLy8gYnkgdGhlIEJTUy9JQlNTIGNyZWF0b3IgaW5zdGVhZCBvZiB1c2VyIGNvbmZpZ3VyYXRpb24uIERhdGEgaW4gdGhpcyBkYXRhIHN0cnVjdHVycmUKLS8vIGlzIHZhbGlkIG9ubHkgd2hlbiBlaXRoZXIgQURIT0NfT04ocEFkKSBvciBJTkZSQV9PTihwQWQpIGlzIFRSVUUuCi0vLyBOb3JtYWxseSwgYWZ0ZXIgU0NBTiBvciBmYWlsZWQgcm9hbWluZyBhdHRlbXB0cywgd2UgbmVlZCB0byByZWNvdmVyIGJhY2sgdG8KLS8vIHRoZSBjdXJyZW50IGFjdGl2ZSBzZXR0aW5ncy4KLXR5cGVkZWYgc3RydWN0IF9TVEFfQUNUSVZFX0NPTkZJRyB7Ci0JVVNIT1JUICAgICAgQWlkOwotCVVTSE9SVCAgICAgIEF0aW1XaW47ICAgICAgICAgICAgICAgIC8vIGluIGt1c2VjOyBJQlNTIHBhcmFtZXRlciBzZXQgZWxlbWVudAotCVVTSE9SVCAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVTSE9SVCAgICAgIENmcE1heER1cmF0aW9uOwotCVVTSE9SVCAgICAgIENmcFBlcmlvZDsKLQotCS8vIENvcHkgc3VwcG9ydGVkIHJhdGUgZnJvbSBkZXNpcmVkIEFQJ3MgYmVhY29uLiBXZSBhcmUgdHJ5aW5nIHRvIG1hdGNoCi0JLy8gQVAncyBzdXBwb3J0ZWQgYW5kIGV4dGVuZGVkIHJhdGUgc2V0dGluZ3MuCi0JVUNIQVIgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU107Ci0JVUNIQVIgICAgICAgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBFeHRSYXRlTGVuOwotCS8vIENvcHkgc3VwcG9ydGVkIGh0IGZyb20gZGVzaXJlZCBBUCdzIGJlYWNvbi4gV2UgYXJlIHRyeWluZyB0byBtYXRjaAotCVJUX0hUX1BIWV9JTkZPCQlTdXBwb3J0ZWRQaHlJbmZvOwotCVJUX0hUX0NBUEFCSUxJVFkJU3VwcG9ydGVkSHRQaHk7Ci19IFNUQV9BQ1RJVkVfQ09ORklHLCAqUFNUQV9BQ1RJVkVfQ09ORklHOwotCi0KLQotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSB7Ci0JLy9DaG9vc2UgMSBmcm9tIFZhbGlkQXNXRFMgYW5kIFZhbGlkQXNDTEkgIHRvIHZhbGlkaXplLgotCUJPT0xFQU4JCVZhbGlkQXNDTEk7CQkvLyBTdGEgbW9kZSwgc2V0IHRoaXMgVFJVRSBhZnRlciBMaW5rdXAsdG9vLgotCUJPT0xFQU4JCVZhbGlkQXNXRFM7CS8vIFRoaXMgaXMgV0RTIEVudHJ5LiBvbmx5IGZvciBBUCBtb2RlLgotCUJPT0xFQU4JCVZhbGlkQXNBcENsaTsgICAvL1RoaXMgaXMgYSBBUC1DbGllbnQgZW50cnksIG9ubHkgZm9yIEFQIG1vZGUgd2hpY2ggZW5hYmxlIEFQLUNsaWVudCBmdW5jdGlvbnMuCi0JQk9PTEVBTgkJVmFsaWRBc01lc2g7Ci0JQk9PTEVBTgkJVmFsaWRBc0RsczsJLy8gVGhpcyBpcyBETFMgRW50cnkuIG9ubHkgZm9yIFNUQSBtb2RlLgotCUJPT0xFQU4JCWlzQ2FjaGVkOwotCUJPT0xFQU4JCWJJQW1CYWRBdGhlcm9zOwkvLyBGbGFnIGlmIHRoaXMgaXMgQXRoZXJvcyBjaGlwIHRoYXQgaGFzIElPVCBwcm9ibGVtLiAgV2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgcHJvdGVjdGlvbi4KLQotCVVDSEFSCQlFbnF1ZXVlRWFwb2xTdGFydFRpbWVyUnVubmluZzsgIC8vIEVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgRUFQIFNNCi0JLy9qYW4gZm9yIHdwYQotCS8vIHJlY29yZCB3aGljaCBlbnRyeSByZXZva2UgTUlDIEZhaWx1cmUgLCBpZiBpdCBsZWF2ZXMgdGhlIEJTUyBpdHNlbGYsIEFQIHdvbid0IHVwZGF0ZSBhTUlDRmFpbFRpbWUgTUlCCi0JVUNIQVIgICAgICAgICAgIENNVGltZXJSdW5uaW5nOwotCVVDSEFSICAgICAgICAgICBhcGlkeDsJCQkvLyBNQlNTIG51bWJlcgotCVVDSEFSICAgICAgICAgICBSU05JRV9MZW47Ci0JVUNIQVIgICAgICAgICAgIFJTTl9JRVtNQVhfTEVOX09GX1JTTklFXTsKLQlVQ0hBUiAgICAgICAgICAgQU5vbmNlW0xFTl9LRVlfREVTQ19OT05DRV07Ci0JVUNIQVIgICAgICAgICAgIFNOb25jZVtMRU5fS0VZX0RFU0NfTk9OQ0VdOwotCVVDSEFSICAgICAgICAgICBSX0NvdW50ZXJbTEVOX0tFWV9ERVNDX1JFUExBWV07Ci0JVUNIQVIgICAgICAgICAgIFBUS1s2NF07Ci0JVUNIQVIgICAgICAgICAgIFJlVHJ5Q291bnRlcjsKLQlSQUxJTktfVElNRVJfU1RSVUNUICAgICAgICAgICAgICAgICBSZXRyeVRpbWVyOwotCVJBTElOS19USU1FUl9TVFJVQ1QJCQkJCUVucXVldWVTdGFydEZvclBTS1RpbWVyOwkvLyBBIHRpbWVyIHdoaWNoIGVucXVldWUgRUFQb0wtU3RhcnQgZm9yIHRyaWdnZXJpbmcgUFNLIFNNCi0JTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGU7ICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdG8gd2hhdGV2ZXIgbWljcm9zb2Z0IGRlZmluZWQKLQlORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0JTkRJU184MDJfMTFfV0VQX1NUQVRVUyAgICAgICAgICAgICAgR3JvdXBLZXlXZXBTdGF0dXM7Ci0JQVBfV1BBX1NUQVRFICAgIFdwYVN0YXRlOwotCUdUS19TVEFURSAgICAgICBHVEtTdGF0ZTsKLQlVU0hPUlQgICAgICAgICAgUG9ydFNlY3VyZWQ7Ci0JTkRJU184MDJfMTFfUFJJVkFDWV9GSUxURVIgIFByaXZhY3lGaWx0ZXI7ICAgICAgLy8gUHJpdmFjeUZpbHRlciBlbnVtIGZvciA4MDIuMVgKLQlDSVBIRVJfS0VZICAgICAgUGFpcndpc2VLZXk7Ci0JUFZPSUQgICAgICAgICAgIHBBZDsKLQlJTlQJCQkJUE1LSURfQ2FjaGVJZHg7Ci0JVUNIQVIJCQlQTUtJRFtMRU5fUE1LSURdOwotCi0KLQlVQ0hBUiAgICAgICAgICAgQWRkcltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgICAgICBQc01vZGU7Ci0JU1NUICAgICAgICAgICAgIFNzdDsKLQlBVVRIX1NUQVRFICAgICAgQXV0aFN0YXRlOyAvLyBmb3IgU0hBUkVEIEtFWSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIHVzZWQgb25seQotCUJPT0xFQU4JCQlJc1JlYXNzb2NTdGE7CS8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhIHJlYXNzb2NpYXRpb24gcHJvY2VkdXJlCi0JVVNIT1JUICAgICAgICAgIEFpZDsKLQlVU0hPUlQgICAgICAgICAgQ2FwYWJpbGl0eUluZm87Ci0JVUNIQVIgICAgICAgICAgIExhc3RSc3NpOwotCVVMT05HICAgICAgICAgICBOb0RhdGFJZGxlQ291bnQ7Ci0JVUlOVDE2CQkJU3RhdGlvbktlZXBBbGl2ZUNvdW50OyAvLyB1bml0OiBzZWNvbmQKLQlVTE9ORyAgICAgICAgICAgUHNRSWRsZUNvdW50OwotCVFVRVVFX0hFQURFUiAgICBQc1F1ZXVlOwotCi0JVUlOVDMyCQkJU3RhQ29ubmVjdFRpbWU7CQkvLyB0aGUgbGl2ZSB0aW1lIG9mIHRoaXMgc3RhdGlvbiBzaW5jZSBhc3NvY2lhdGVkIHdpdGggQVAKLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQk9PTEVBTgkJCWJTZW5kQkFSOwotCVVTSE9SVAkJCU5vQkFEYXRhQ291bnREb3duOwotCi0JVUlOVDMyCQkJQ2FjaGVkQnVmWzE2XTsJCS8vIFVJTlQgKDQgYnl0ZXMpIGZvciBhbGlnbm1lbnQKLQlVSU5UCQkJVHhCRkNvdW50OyAvLyAzKjMKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlVSU5UCQkJRklGT0NvdW50OwotCVVJTlQJCQlEZWJ1Z0ZJRk9Db3VudDsKLQlVSU5UCQkJRGVidWdUeENvdW50OwotICAgIEJPT0xFQU4JCQliRGxzSW5pdDsKLQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vV0RTIGVudHJ5IG5lZWRzIHRoZXNlCi0vLyBpZiBWYWxpZEFzV0RTPT1UUlVFLCBNYXRjaFdEU1RhYklkeCBpcyB0aGUgaW5kZXggaW4gV2RzVGFiLk1hY1RhYgotCVVJTlQJCQlNYXRjaFdEU1RhYklkeDsKLQlVQ0hBUiAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZTsKLQlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZTsKLQlVQ0hBUiAgICAgICAgICAgQ3VyclR4UmF0ZUluZGV4OwotCS8vIHRvIHJlY29yZCB0aGUgZWFjaCBUWCByYXRlJ3MgcXVhbGl0eS4gMCBpcyBiZXN0LCB0aGUgYmlnZ2VyIHRoZSB3b3JzZS4KLQlVU0hPUlQgICAgICAgICAgVHhRdWFsaXR5W01BWF9TVEVQX09GX1RYX1JBVEVfU1dJVENIXTsKLS8vCVVTSE9SVCAgICAgICAgICBPbmVTZWNUeE9rQ291bnQ7Ci0JVUlOVDMyCQkJT25lU2VjVHhOb1JldHJ5T2tDb3VudDsKLQlVSU5UMzIgICAgICAgICAgT25lU2VjVHhSZXRyeU9rQ291bnQ7Ci0JVUlOVDMyICAgICAgICAgIE9uZVNlY1R4RmFpbENvdW50OwotCVVJTlQzMgkJCUNvbnRpbnVlVHhGYWlsQ250OwotCVVJTlQzMiAgICAgICAgICBDdXJyVHhSYXRlU3RhYmxlVGltZTsgLy8gIyBvZiBzZWNvbmQgaW4gY3VycmVudCBUWCByYXRlCi0JVUNIQVIgICAgICAgICAgIFR4UmF0ZVVwUGVuYWx0eTsgICAgICAvLyBleHRyYSAjIG9mIHNlY29uZCBwZW5hbHR5IGR1ZSB0byBsYXN0IHVuc3RhYmxlIGNvbmRpdGlvbgotI2lmZGVmIFdEU19TVVBQT1JUCi0JQk9PTEVBTgkJTG9ja0VudHJ5VHg7IC8vIFRSVUUgPSBibG9jayB0byBXRFMgRW50cnkgdHJhZmZpYywgRkFMU0UgPSBub3QuCi0JVUlOVDMyCQlUaW1lU3RhbXBfdG9UeFJpbmc7Ci0jZW5kaWYgLy8gV0RTX1NVUFBPUlQgLy8KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JVUlOVAkJCU1hdGNoRGxzRW50cnlJZHg7IC8vIGluZGljYXRlIHRoZSBpbmRleCBpbiBwQWQtPlN0YUNmZy5ETFNFbnRyeQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0JQk9PTEVBTiAgICAgICAgIGZOb2lzeUVudmlyb25tZW50OwotCUJPT0xFQU4JCQlmTGFzdFNlY0FjY29yZGluZ1JTU0k7Ci0JVUNIQVIgICAgICAgICAgIExhc3RTZWNUeFJhdGVDaGFuZ2VBY3Rpb247IC8vIDA6IG5vIGNoYW5nZSwgMTpyYXRlIFVQLCAyOnJhdGUgZG93bgotCUNIQVIJCQlMYXN0VGltZVR4UmF0ZUNoYW5nZUFjdGlvbjsgLy9LZWVwIGxhc3QgdGltZSB2YWx1ZSBvZiBMYXN0U2VjVHhSYXRlQ2hhbmdlQWN0aW9uCi0JVUxPTkcJCQlMYXN0VHhPa0NvdW50OwotCVVDSEFSICAgICAgICAgICBQRVJbTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0hdOwotCi0JLy8gYSBiaXRtYXAgb2YgQk9PTEVBTiBmbGFncy4gZWFjaCBiaXQgcmVwcmVzZW50IGFuIG9wZXJhdGlvbiBzdGF0dXMgb2YgYSBwYXJ0aWN1bGFyCi0JLy8gQk9PTEVBTiBjb250cm9sLCBlaXRoZXIgT04gb3IgT0ZGLiBUaGVzZSBmbGFncyBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkIHZpYQotCS8vIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKCksIENMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoKSwgQ0xJRU5UX1NUQVRVU19DTEVBUl9GTEFHKCkgbWFjcm9zLgotCS8vIHNlZSBmT1BfU1RBVFVTX3h4eCBpbiBSVE1QX0RFRi5DIGZvciBkZXRhaWwgYml0IGRlZmluaXRpb24uIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRAotCVVMT05HICAgICAgICAgICBDbGllbnRTdGF0dXNGbGFnczsKLQotCUhUVFJBTlNNSVRfU0VUVElORwlIVFBoeU1vZGUsIE1heEhUUGh5TW9kZSwgTWluSFRQaHlNb2RlOy8vIEZvciB0cmFuc21pdCBwaHkgc2V0dGluZyBpbiBUWFdJLgotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gSFQgRVdDIE1JTU8tTiB1c2VkIHBhcmFtZXRlcnMKLQlVU0hPUlQJCVJYQkFiaXRtYXA7CS8vIGZpbGwgdG8gb24tY2hpcCAgUlhXSV9CQV9CSVRNQVNLIGluIDguMS4zUlggYXR0cmlidXRlIGVudHJ5IGZvcm1hdAotCVVTSE9SVAkJVFhCQWJpdG1hcDsJLy8gVGhpcyBiaXRtYXAgYXMgb3JpZ2luYXRvciwgb25seSBrZWVwIGluIHNvZnR3YXJlIHVzZWQgdG8gbWFyayBBTVBEVSBiaXQgaW4gVFhXSQotCVVTSE9SVAkJVFhBdXRvQkFiaXRtYXA7Ci0JVVNIT1JUCQlCQURlY2xpbmVCaXRtYXA7Ci0JVVNIT1JUCQlCQVJlY1djaWRBcnJheVtOVU1fT0ZfVElEXTsJLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiByZWNpcGllbnQgc2Vzc2lvbi4gaWYgUlhCQWJpdG1hcCBiaXQgaXMgbWFza2VkCi0JVVNIT1JUCQlCQU9yaVdjaWRBcnJheVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCVVTSE9SVAkJQkFPcmlTZXF1ZW5jZVtOVU1fT0ZfVElEXTsgLy8gVGhlIG1hcHBpbmcgd2NpZCBvZiBvcmlnaW5hdG9yIHNlc3Npb24uIGlmIFRYQkFiaXRtYXAgYml0IGlzIG1hc2tlZAotCi0JLy8gODAyLjExbiBmZWF0dXJlcy4KLQlVQ0hBUgkJTXBkdURlbnNpdHk7Ci0JVUNIQVIJCU1heFJBbXBkdUZhY3RvcjsKLQlVQ0hBUgkJQU1zZHVTaXplOwotCVVDSEFSCQlNbXBzTW9kZTsJLy8gTUlNTyBwb3dlciBzYXZlIG1vcmUuCi0KLQlIVF9DQVBBQklMSVRZX0lFCQlIVENhcGFiaWxpdHk7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JVUNIQVIJCUJTUzIwNDBDb2V4aXN0ZW5jZU1nbXRTdXBwb3J0OwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCUJPT0xFQU4JCWJBdXRvVHhSYXRlU3dpdGNoOwotCi0JVUNIQVIgICAgICAgUmF0ZUxlbjsKLQlzdHJ1Y3QgX01BQ19UQUJMRV9FTlRSWSAqcE5leHQ7Ci0gICAgVVNIT1JUICAgICAgVHhTZXFbTlVNX09GX1RJRF07Ci0JVVNIT1JUCQlOb25Rb3NEYXRhU2VxOwotCi0JUlNTSV9TQU1QTEUJUnNzaVNhbXBsZTsKLQotCVVJTlQzMgkJCVRYTUNTRXhwZWN0ZWRbMTZdOwotCVVJTlQzMgkJCVRYTUNTU3VjY2Vzc2Z1bFsxNl07Ci0JVUlOVDMyCQkJVFhNQ1NGYWlsZWRbMTZdOwotCVVJTlQzMgkJCVRYTUNTQXV0b0ZhbGxCYWNrWzE2XVsxNl07Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlVTE9ORwkJCUxhc3RCZWFjb25SeFRpbWU7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotCi0JVUxPTkcgQXNzb2NEZWFkTGluZTsKLQotCi0KLQlVTE9ORyBDaGFubmVsUXVhbGl0eTsgIC8vIDAuLjEwMCwgQ2hhbm5lbCBRdWFsaXR5IEluZGljYXRpb24gZm9yIFJvYW1pbmcKLQotfSBNQUNfVEFCTEVfRU5UUlksICpQTUFDX1RBQkxFX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfTUFDX1RBQkxFIHsKLQlVU0hPUlQJCQlTaXplOwotCU1BQ19UQUJMRV9FTlRSWSAqSGFzaFtIQVNIX1RBQkxFX1NJWkVdOwotCU1BQ19UQUJMRV9FTlRSWSBDb250ZW50W01BWF9MRU5fT0ZfTUFDX1RBQkxFXTsKLQlRVUVVRV9IRUFERVIgICAgTWNhc3RQc1F1ZXVlOwotCVVMT05HICAgICAgICAgICBQc1FJZGxlQ291bnQ7Ci0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSW5Qc207Ci0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uQmFkQXRoZXJvczsJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gaXMgYXRoZXJvcyA4MDIuMTFuIENoaXAuICBXZSBuZWVkIHRvIHVzZSBSVFMvQ1RTIHdpdGggQXRoZXJvcyA4MDIsLjExbiBjaGlwLgotCUJPT0xFQU4JCQlmQW55VHhPUEZvcmNlRGlzYWJsZTsJLy8gQ2hlY2sgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgQkUgVHhPUAotCUJPT0xFQU4JCQlmQWxsU3RhdGlvbkFzUmFsaW5rOwkvLyBDaGVjayBpZiBhbGwgc3RhdGlvbnMgYXJlIHJhbGluay1jaGlwc2V0Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JQk9PTEVBTiAgICAgICAgIGZBbnlTdGF0aW9uSXNMZWdhY3k7CS8vIENoZWNrIGlmIEkgdXNlIGxlZ2FjeSByYXRlIHRvIHRyYW5zbWl0IHRvIG15IEJTUyBTdGF0aW9uLwotCUJPT0xFQU4gICAgICAgICBmQW55U3RhdGlvbk5vbkdGOwkJLy8gQ2hlY2sgaWYgYW55IFN0YXRpb24gY2FuJ3Qgc3VwcG9ydCBHRi4KLQlCT09MRUFOICAgICAgICAgZkFueVN0YXRpb24yME9ubHk7CQkvLyBDaGVjayBpZiBhbnkgU3RhdGlvbiBjYW4ndCBzdXBwb3J0IEdGLgotCUJPT0xFQU4JCQlmQW55U3RhdGlvbk1JTU9QU0R5bmFtaWM7IC8vIENoZWNrIGlmIGFueSBTdGF0aW9uIGlzIE1JTU8gRHluYW1pYwotCUJPT0xFQU4gICAgICAgICBmQW55QkFTZXNzaW9uOyAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIEJBIHNlc3Npb24uICBGb3JjZSB0dXJuIG9uIFJUUy9DVFMKLS8vMjAwOC8xMC8yODogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVA8LS0KLS8vMjAwOC8xMC8yODogS0ggYWRkIHRvIHN1cHBvcnQgQW50ZW5uYSBwb3dlci1zYXZpbmcgb2YgQVAtLT4KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLX0gTUFDX1RBQkxFLCAqUE1BQ19UQUJMRTsKLQotCi0KLQotI2lmZGVmIEJMT0NLX05FVF9JRgotdHlwZWRlZiBzdHJ1Y3QgX0JMT0NLX1FVRVVFX0VOVFJZCi17Ci0JQk9PTEVBTiBTd1R4UXVldWVCbG9ja0ZsYWc7Ci0JTElTVF9IRUFERVIgTmV0SWZMaXN0OwotfSBCTE9DS19RVUVVRV9FTlRSWSwgKlBCTE9DS19RVUVVRV9FTlRSWTsKLSNlbmRpZiAvLyBCTE9DS19ORVRfSUYgLy8KLQotCi1zdHJ1Y3Qgd2lmaWNvbmYKLXsKLQlCT09MRUFOCWJTaG9ydEdJOwotCUJPT0xFQU4gYkdyZWVuRmllbGQ7Ci19OwotCi0KLXR5cGVkZWYgc3RydWN0IF9SVE1QX0RFVl9JTkZPXwotewotCVVDSEFSCQkJY2hpcE5hbWVbMTZdOwotCVJUTVBfSU5GX1RZUEUJaW5mVHlwZTsKLX1SVE1QX0RFVl9JTkZPOwotCi0KLSNpZmRlZiBEQkdfRElBR05PU0UKLSNkZWZpbmUgRElBR05PU0VfVElNRQkxMCAgIC8vIDEwIHNlYwotdHlwZWRlZiBzdHJ1Y3QgX1J0bXBEaWFnU3RyY3V0XwotewkvLyBEaWFnbm9zaXMgUmVsYXRlZCBlbGVtZW50Ci0JdW5zaWduZWQgY2hhcgkJaW5pdGVkOwotCXVuc2lnbmVkIGNoYXIJcUlkeDsKLQl1bnNpZ25lZCBjaGFyCUFycmF5U3RhcnRJZHg7Ci0JdW5zaWduZWQgY2hhcgkJQXJyYXlDdXJJZHg7Ci0JLy8gVHggUmVsYXRlZCBDb3VudAotCVVTSE9SVAkJCVR4RGF0YUNudFtESUFHTk9TRV9USU1FXTsKLQlVU0hPUlQJCQlUeEZhaWxDbnRbRElBR05PU0VfVElNRV07Ci0vLwlVU0hPUlQJCQlUeERlc2NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJLy8gVHhEZXNjIHF1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwfjE0LCA+PTE1Ci0JVVNIT1JUCQkJVHhEZXNjQ250W0RJQUdOT1NFX1RJTUVdWzI0XTsgLy8gMyozCS8vIFR4RGVzYyBxdWV1ZSBsZW5ndGggaW4gc2NhbGUgb2YgMH4xNCwgPj0xNQotLy8JVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMTZdOwkJCS8vIFR4RGF0ZSBNQ1MgQ291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBzdGVwIGluIDEuCi0JVVNIT1JUCQkJVHhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKLQlVU0hPUlQJCQlUeFNXUXVlQ250W0RJQUdOT1NFX1RJTUVdWzldOwkJLy8gVHhTd1F1ZXVlIGxlbmd0aCBpbiBzY2FsZSBvZiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA+PTgKLQotCVVTSE9SVAkJCVR4QWdnQ250W0RJQUdOT1NFX1RJTUVdOwotCVVTSE9SVAkJCVR4Tm9uQWdnQ250W0RJQUdOT1NFX1RJTUVdOwotLy8JVVNIT1JUCQkJVHhBTVBEVUNudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyAxMCBzZWMsIFR4RE1BIEFQTURVIEFnZ3JlZ2F0aW9uIGNvdW50IGluIHJhbmdlIGZyb20gMCB0byAxNSwgaW4gc2V0cCBvZiAxLgotCVVTSE9SVAkJCVR4QU1QRFVDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMgLy8gMTAgc2VjLCBUeERNQSBBUE1EVSBBZ2dyZWdhdGlvbiBjb3VudCBpbiByYW5nZSBmcm9tIDAgdG8gMTUsIGluIHNldHAgb2YgMS4KLQlVU0hPUlQJCQlUeFJhbGlua0NudFtESUFHTk9TRV9USU1FXTsJCQkvLyBUeFJhbGluayBBZ2dyZWdhdGlvbiBDb3VudCBpbiAxIHNlYyBzY2FsZS4KLQlVU0hPUlQJCQlUeEFNU0RVQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFR4QU1TVUQgQWdncmVnYXRpb24gQ291bnQgaW4gMSBzZWMgc2NhbGUuCi0KLQkvLyBSeCBSZWxhdGVkIENvdW50Ci0JVVNIT1JUCQkJUnhEYXRhQ250W0RJQUdOT1NFX1RJTUVdOwkJCS8vIFJ4IFRvdGFsIERhdGEgY291bnQuCi0JVVNIT1JUCQkJUnhDcmNFcnJDbnRbRElBR05PU0VfVElNRV07Ci0vLwlVU0hPUlQJCQlSeE1jc0NudFtESUFHTk9TRV9USU1FXVsxNl07CQkvLyBSeCBNQ1MgQ291bnQgaW4gcmFuZ2UgZnJvbSAwIHRvIDE1LCBzdGVwIGluIDEuCi0JVVNIT1JUCQkJUnhNY3NDbnRbRElBR05PU0VfVElNRV1bMjRdOyAvLyAzKjMKLX1SdG1wRGlhZ1N0cnVjdDsKLSNlbmRpZiAvLyBEQkdfRElBR05PU0UgLy8KLQotCi1zdHJ1Y3QgX1JUTVBfQ0hJUF9PUF8KLXsKLQkvKiAgQ2FsaWJyYXRpb24gYWNjZXNzIHJlbGF0ZWQgY2FsbGJhY2sgZnVuY3Rpb25zICovCi0JaW50ICgqZWVpbml0KShSVE1QX0FEQVBURVIgKnBBZCk7CQkJCQkJCQkJCS8qIGludCAoKmVlaW5pdCkoUlRNUF9BREFQVEVSICpwQWQpOyAqLwotCWludCAoKmVlcmVhZCkoUlRNUF9BREFQVEVSICpwQWQsIFVTSE9SVCBvZmZzZXQsIFBVU0hPUlQgcFZhbHVlKTsJCQkJLyogaW50ICgqZWVyZWFkKShSVE1QX0FEQVBURVIgKnBBZCwgaW50IG9mZnNldCwgUFVTSE9SVCBwVmFsdWUpOyAqLwotCWludCAoKmVld3JpdGUpKFJUTVBfQURBUFRFUiAqcEFkLCBVU0hPUlQgb2Zmc2V0LCBVU0hPUlQgdmFsdWUpOzsJCQkJLyogaW50ICgqZWV3cml0ZSkoUlRNUF9BREFQVEVSICpwQWQsIGludCBvZmZzZXQsIFVTSE9SVCB2YWx1ZSk7ICovCi0KLQkvKiBNQ1UgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLQlpbnQgKCpsb2FkRmlybXdhcmUpKFJUTVBfQURBUFRFUiAqcEFkKTsJCQkJCQkJCS8qIGludCAoKmxvYWRGaXJtd2FyZSkoUlRNUF9BREFQVEVSICpwQWQpOyAqLwotCWludCAoKmVyYXNlRmlybXdhcmUpKFJUTVBfQURBUFRFUiAqcEFkKTsJCQkJCQkJCS8qIGludCAoKmVyYXNlRmlybXdhcmUpKFJUTVBfQURBUFRFUiAqcEFkKTsgKi8KLQlpbnQgKCpzZW5kQ29tbWFuZFRvTWN1KShSVE1QX0FEQVBURVIgKnBBZCwgVUNIQVIgY21kLCBVQ0hBUiB0b2tlbiwgVUNIQVIgYXJnMCwgVUNIQVIgYXJnMSk7OwkvKiBpbnQgKCpzZW5kQ29tbWFuZFRvTWN1KShSVE1QX0FEQVBURVIgKnBBZCwgVUNIQVIgY21kLCBVQ0hBUiB0b2tlbiwgVUNIQVIgYXJnMCwgVUNIQVIgYXJnMSk7ICovCi0KLQkvKiBSRiBhY2Nlc3MgcmVsYXRlZCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLQlSRUdfUEFJUiAqcFJGUmVnVGFibGU7Ci0Jdm9pZCAoKkFzaWNSZkluaXQpKFJUTVBfQURBUFRFUiAqcEFkKTsKLQl2b2lkICgqQXNpY1JmVHVybk9uKShSVE1QX0FEQVBURVIgKnBBZCk7Ci0Jdm9pZCAoKkFzaWNSZlR1cm5PZmYpKFJUTVBfQURBUFRFUiAqcEFkKTsKLQl2b2lkICgqQXNpY1JldmVyc2VSZkZyb21TbGVlcE1vZGUpKFJUTVBfQURBUFRFUiAqcEFkKTsKLQl2b2lkICgqQXNpY0hhbHRBY3Rpb24pKFJUTVBfQURBUFRFUiAqcEFkKTsKLX07Ci0KLQotLy8KLS8vICBUaGUgbWluaXBvcnQgYWRhcHRlciBzdHJ1Y3R1cmUKLS8vCi1zdHJ1Y3QgX1JUTVBfQURBUFRFUgotewotCVBWT0lECQkJCQlPU19Db29raWU7CS8vIHNhdmUgc3BlY2lmaWMgc3RydWN0dXJlIHJlbGF0aXZlIHRvIE9TCi0JUE5FVF9ERVYJCQkJbmV0X2RldjsKLQlVTE9ORwkJCQkJVmlydHVhbElmQ250OwotCi0JUlRNUF9DSElQX09QCQkJY2hpcE9wczsKLQlVU0hPUlQJCQkJCVRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwOwotCi0jaWZkZWYgSU5GX0FNQVpPTl9QUEEKLQlVSU5UMzIgIGdfaWZfaWQ7Ci0JQk9PTEVBTglQUEFFbmFibGU7Ci0JUFBBX0RJUkVDVFBBVEhfQ0IgICAgICAgKnBEaXJlY3RwYXRoQ2I7Ci0jZW5kaWYgLy8gSU5GX0FNQVpPTl9QUEEgLy8KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICBQQ0kgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkJCSAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlQVUNIQVIgICAgICAgICAgICAgICAgICBDU1JCYXNlQWRkcmVzczsgICAgIC8vIFBDSSBNTUlPIEJhc2UgQWRkcmVzcywgYWxsIGFjY2VzcyB3aWxsIHVzZQotCXVuc2lnbmVkIGludAkJCWlycV9udW07Ci0KLQlVU0hPUlQJCSAgICAgICAgICAgIExua0N0cmxCaXRNYXNrOwotCVVTSE9SVAkJICAgICAgICAgICAgUkxua0N0cmxDb25maWd1cmF0aW9uOwotCVVTSE9SVCAgICAgICAgICAgICAgICAgIFJMbmtDdHJsT2Zmc2V0OwotCVVTSE9SVAkJICAgICAgICAgICAgSG9zdExua0N0cmxDb25maWd1cmF0aW9uOwotCVVTSE9SVCAgICAgICAgICAgICAgICAgIEhvc3RMbmtDdHJsT2Zmc2V0OwotCVVTSE9SVAkJICAgICAgICAgICAgUENJZVBvd2VyU2F2ZUxldmVsOwotCVVMT05HCQkJCVJ0M3h4SG9zdExpbmtDdHJsOwkvLyBVU2VkIGZvciAzMDkwRiBjaGlwCi0JVUxPTkcJCQkJUnQzeHhSYWxpbmtMaW5rQ3RybDsJLy8gVVNlZCBmb3IgMzA5MEYgY2hpcAotCVVTSE9SVAkJCQlEZXZpY2VJRDsgICAgICAgICAgIC8vIFJlYWQgZnJvbSBQQ0kgY29uZmlnCi0JVUxPTkcJCQkJQWNjZXNzQkJQRmFpbENvdW50OwotCUJPT0xFQU4JCQkJCWJQQ0ljbGtPZmY7CQkJCQkJLy8gZmxhZyB0aGF0IGluZGljYXRlIGlmIHRoZSBQSUNFIHBvd2VyIHN0YXR1cyBpbiBDb25maWd1cmF0aW9uIFNQYWNlLi4KLQlCT09MRUFOCQkJCQliUENJY2xrT2ZmRGlzYWJsZVR4OwkJCS8vCi0KLQlCT09MRUFOCQkJCQlicnQzMHh4QmFuTWN1Q21kOwkvL3doZW4gPSAweGZmIG1lYW5zIGFsbCBjb21tYW5kcyBhcmUgb2sgdG8gc2V0IC4KLQlCT09MRUFOCQkJCQliMzA5MEVTcGVjaWFsQ2hpcDsJLy8zMDkwRSBzcGVjaWFsIGNoaXAgdGhhdCB3cml0ZSBFRVBST00gMHgyND0weDkyODAuCi0JVUxPTkcJCQkJCUNoZWNrRG1hQnVzeUNvdW50OyAgLy8gQ2hlY2sgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBDb3VudC4KLQotCVVJTlQJCQkJCWludF9lbmFibGVfcmVnOwotCVVJTlQJCQkJCWludF9kaXNhYmxlX21hc2s7Ci0JVUlOVAkJCQkJaW50X3BlbmRpbmc7Ci0KLQotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIFR4QnVmU3BhY2VbTlVNX09GX1RYX1JJTkddOyAvLyBTaGFyZWQgbWVtb3J5IG9mIGFsbCAxc3QgcHJlLWFsbG9jYXRlZCBUeEJ1ZiBhc3NvY2lhdGVkIHdpdGggZWFjaCBUWEQKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBSeERlc2NSaW5nOyAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIG1lbW9yeSBmb3IgUlggZGVzY3JpcHRvcnMKLQlSVE1QX0RNQUJVRiAgICAgICAgICAgICBUeERlc2NSaW5nW05VTV9PRl9UWF9SSU5HXTsJLy8gU2hhcmVkIG1lbW9yeSBmb3IgVHggZGVzY3JpcHRvcnMKLQlSVE1QX1RYX1JJTkcgICAgICAgICAgICBUeFJpbmdbTlVNX09GX1RYX1JJTkddOwkJLy8gQUMwfjQgKyBIQ0NBCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQotCU5ESVNfU1BJTl9MT0NLCQlpcnFfbG9jazsKLQlVQ0hBUgkJCQlpcnFfZGlzYWJsZWQ7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICBSQlVTIHJlbGF0ZWQgcGFyYW1ldGVycwkJCQkJCQkJCQkJCQkJCQkgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICBCb3RoIFBDSS9VU0IgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLy9SVE1QX0RFVl9JTkZPCQkJY2hpcEluZm87Ci0JUlRNUF9JTkZfVFlQRQkJCWluZlR5cGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgRHJpdmVyIE1nbXQgcmVsYXRlZCBwYXJhbWV0ZXJzCQkJCQkJCQkJCQkJCQkgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JUlRNUF9PU19UQVNLCQkJbWxtZVRhc2s7Ci0jaWZkZWYgUlRNUF9USU1FUl9UQVNLX1NVUFBPUlQKLQkvLyBJZiB5b3Ugd2FudCB1c2UgdGltZXIgdGFzayB0byBoYW5kbGUgdGhlIHRpbWVyIHJlbGF0ZWQgam9icywgZW5hYmxlIHRoaXMuCi0JUlRNUF9USU1FUl9UQVNLX1FVRVVFCVRpbWVyUTsKLQlORElTX1NQSU5fTE9DSwkJCVRpbWVyUUxvY2s7Ci0JUlRNUF9PU19UQVNLCQkJdGltZXJUYXNrOwotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICBUeCByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JQk9PTEVBTiAgICAgICAgICAgICAgICAgRGVRdWV1ZVJ1bm5pbmdbTlVNX09GX1RYX1JJTkddOyAgLy8gZm9yIGVuc3VyaW5nIFJUVVNCRGVRdWV1ZVBhY2tldCBnZXQgY2FsbCBvbmNlCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgRGVRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwotCi0KLQkvLyByZXNvdXJjZSBmb3Igc29mdHdhcmUgYmFja2xvZyBxdWV1ZXMKLQlRVUVVRV9IRUFERVIgICAgICAgICAgICBUeFN3UXVldWVbTlVNX09GX1RYX1JJTkddOyAgLy8gNCBBQyArIDEgSENDQQotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFR4U3dRdWV1ZUxvY2tbTlVNX09GX1RYX1JJTkddOwkvLyBUeFN3UXVldWUgc3BpbmxvY2sKLQotCVJUTVBfRE1BQlVGICAgICAgICAgICAgIE1nbXREZXNjUmluZzsJCQkvLyBTaGFyZWQgbWVtb3J5IGZvciBNR01UIGRlc2NyaXB0b3JzCi0JUlRNUF9NR01UX1JJTkcgICAgICAgICAgTWdtdFJpbmc7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWdtdFJpbmdMb2NrOwkJCS8vIFByaW8gUmluZyBzcGlubG9jawotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgUnggcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0JUlRNUF9SWF9SSU5HICAgICAgICAgICAgUnhSaW5nOwotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIFJ4UmluZ0xvY2s7ICAgICAgICAgICAgICAgICAvLyBSeCBSaW5nIHNwaW5sb2NrCi0jaWZkZWYgUlQzMDkwCi0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgTWN1Q21kTG9jazsgICAgICAgICAgICAgIC8vTUNVIENvbW1hbmQgUXVldWUgc3BpbmxvY2sKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgQVNJQyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlVSU5UMzIJCQlNQUNWZXJzaW9uOwkJLy8gTUFDIHZlcnNpb24uIFJlY29yZCBydDI4NjBDKDB4Mjg2MDAxMDApIG9yIHJ0Mjg2MEQgKDB4Mjg2MDAxMDEpLi4KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIEUyUFJPTQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCVVMT05HCQkJCUVlcHJvbVZlcnNpb247ICAgICAgICAgIC8vIGJ5dGUgMDogdmVyc2lvbiwgYnl0ZSAxOiByZXZpc2lvbiwgYnl0ZSAyfjM6IHVudXNlZAotCVVMT05HCQkJCUZpcm13YXJlVmVyc2lvbjsgICAgICAgIC8vIGJ5dGUgMDogTWlub3IgdmVyc2lvbiwgYnl0ZSAxOiBNYWpvciB2ZXJzaW9uLCBvdGhlcndpc2UgdW51c2VkLgotCVVTSE9SVAkJCQlFRVBST01EZWZhdWx0VmFsdWVbTlVNX0VFUFJPTV9CQlBfUEFSTVNdOwotCVVDSEFSCQkJCUVFUFJPTUFkZHJlc3NOdW07ICAgICAgIC8vIDkzYzQ2PTYgIDkzYzY2PTgKLQlCT09MRUFOCQkJCUVlcHJvbUFjY2VzczsKLQlVQ0hBUgkJCQlFRnVzZVRhZzsKLQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gQkJQIENvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZmRlZiBNRVJHRV9BUkNIX1RFQU0KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBCYnBXcml0ZUxhdGNoWzI1Nl07ICAgICAvLyByZWNvcmQgbGFzdCBCQlAgcmVnaXN0ZXIgdmFsdWUgd3JpdHRlbiB2aWEgQkJQX0lPX1dSSVRFL0JCUF9JT19XUklURV9WWV9SRUdfSUQKLSNlbHNlCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQmJwV3JpdGVMYXRjaFsxNDBdOyAgICAgLy8gcmVjb3JkIGxhc3QgQkJQIHJlZ2lzdGVyIHZhbHVlIHdyaXR0ZW4gdmlhIEJCUF9JT19XUklURS9CQlBfSU9fV1JJVEVfVllfUkVHX0lECi0jZW5kaWYgLy8gTUVSR0VfQVJDSF9URUFNIC8vCi0JQ0hBUgkJCQkJQmJwUnNzaVRvRGJtRGVsdGE7CQkvLyBjaGFuZ2UgZnJvbSBVQ0hBUiB0byBDSEFSIGZvciBoaWdoIHBvd2VyCi0JQkJQX1I2Nl9UVU5JTkcgICAgICAgICAgQmJwVHVuaW5nOwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFJGSUMgY29udHJvbAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBSZkljVHlwZTsgICAgICAgLy8gUkZJQ194eHgKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBSZkZyZXFPZmZzZXQ7ICAgLy8gRnJlcXVlbmN5IG9mZnNldCBmb3IgY2hhbm5lbCBzd2l0Y2hpbmcKLQlSVE1QX1JGX1JFR1MgICAgICAgICAgICBMYXRjaFJmUmVnczsgICAgLy8gbGF0Y2ggdGggbGF0ZXN0IFJGIHByb2dyYW1taW5nIHZhbHVlIHNpbmNlIFJGIElDIGRvZXNuJ3Qgc3VwcG9ydCBSRUFECi0KLQlFRVBST01fQU5URU5OQV9TVFJVQyAgICBBbnRlbm5hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBBTnRlbm5hIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGZvciBhICYgZy4gV2UgbmVlZCB0byBzYXZlIGl0IGZvciBmdXR1cmUgcmVmZXJlbmNlLgotCUVFUFJPTV9OSUNfQ09ORklHMl9TVFJVQyAgICBOaWNDb25maWcyOwotCi0JLy8gVGhpcyBzb2Z0IFJ4IEFudGVubmEgRGl2ZXJzaXR5IG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgd2hlbiB1c2VyIHNldAotCS8vIFJYIEFudGVubmEgPSBESVZFUlNJVFkgT04KLQlTT0ZUX1JYX0FOVF9ESVZFUlNJVFkgICBSeEFudDsKLQotCVVDSEFSICAgICAgICAgICAgICAgICAgIFJGUHJvZ1NlcTsKLQlDSEFOTkVMX1RYX1BPV0VSICAgICAgICBUeFBvd2VyW01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgICAgICAvLyBTdG9yZSBUeCBwb3dlciB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzLgotCUNIQU5ORUxfVFhfUE9XRVIgICAgICAgIENoYW5uZWxMaXN0W01BWF9OVU1fT0ZfQ0hBTk5FTFNdOyAgIC8vIGxpc3QgYWxsIHN1cHBvcnRlZCBjaGFubmVscyBmb3Igc2l0ZSBzdXJ2ZXkKLQlDSEFOTkVMXzExSl9UWF9QT1dFUiAgICBUeFBvd2VyMTFKW01BWF9OVU1fT0ZfMTFKQ0hBTk5FTFNdOyAgICAgICAvLyA4MDIuMTFqIGNoYW5uZWwgYW5kIGJ3Ci0JQ0hBTk5FTF8xMUpfVFhfUE9XRVIgICAgQ2hhbm5lbExpc3QxMUpbTUFYX05VTV9PRl8xMUpDSEFOTkVMU107ICAgLy8gbGlzdCBhbGwgc3VwcG9ydGVkIGNoYW5uZWxzIGZvciBzaXRlIHN1cnZleQotCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExpc3ROdW07ICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWwgaW4gQ2hhbm5lbExpc3RbXQotCVVDSEFSCQkJCQlCYnA5NDsKLQlCT09MRUFOCQkJCQlCYnBGb3JDQ0s7Ci0JVUxPTkcJCVR4MjBNUHdyQ2ZnQUJhbmRbNV07Ci0JVUxPTkcJCVR4MjBNUHdyQ2ZnR0JhbmRbNV07Ci0JVUxPTkcJCVR4NDBNUHdyQ2ZnQUJhbmRbNV07Ci0JVUxPTkcJCVR4NDBNUHdyQ2ZnR0JhbmRbNV07Ci0KLQlCT09MRUFOICAgICBiQXV0b1R4QWdjQTsgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGRyaXZlciBhdXRvIFR4IEFnYyBjb250cm9sCi0JVUNIQVIJICAgIFRzc2lSZWZBOwkJCQkJLy8gU3RvcmUgVHNzaSByZWZlcmVuY2UgdmFsdWUgYXMgMjUgdGVtcGVyYXR1cmUuCi0JVUNIQVIJICAgIFRzc2lQbHVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgaW5jcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KLQlVQ0hBUgkgICAgVHNzaU1pbnVzQm91bmRhcnlBWzVdOwkJLy8gVHNzaSBib3VuZGFyeSBmb3IgZGVjcmVhc2UgVHggcG93ZXIgdG8gY29tcGVuc2F0ZS4KLQlVQ0hBUgkgICAgVHhBZ2NTdGVwQTsJCQkJCS8vIFN0b3JlIFR4IFRTU0kgZGVsdGEgaW5jcmVtZW50IC8gZGVjcmVtZW50IHZhbHVlCi0JQ0hBUgkJVHhBZ2NDb21wZW5zYXRlQTsJCQkvLyBTdG9yZSB0aGUgY29tcGVuc2F0aW9uIChUeEFnY1N0ZXAgKiAoaWR4LTEpKQotCi0JQk9PTEVBTiAgICAgYkF1dG9UeEFnY0c7ICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBkcml2ZXIgYXV0byBUeCBBZ2MgY29udHJvbAotCVVDSEFSCSAgICBUc3NpUmVmRzsJCQkJCS8vIFN0b3JlIFRzc2kgcmVmZXJlbmNlIHZhbHVlIGFzIDI1IHRlbXBlcmF0dXJlLgotCVVDSEFSCSAgICBUc3NpUGx1c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGluY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFRzc2lNaW51c0JvdW5kYXJ5R1s1XTsJCS8vIFRzc2kgYm91bmRhcnkgZm9yIGRlY3JlYXNlIFR4IHBvd2VyIHRvIGNvbXBlbnNhdGUuCi0JVUNIQVIJICAgIFR4QWdjU3RlcEc7CQkJCQkvLyBTdG9yZSBUeCBUU1NJIGRlbHRhIGluY3JlbWVudCAvIGRlY3JlbWVudCB2YWx1ZQotCUNIQVIJCVR4QWdjQ29tcGVuc2F0ZUc7CQkJLy8gU3RvcmUgdGhlIGNvbXBlbnNhdGlvbiAoVHhBZ2NTdGVwICogKGlkeC0xKSkKLQotCUNIQVIJCUJHUnNzaU9mZnNldDA7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDQ2aAotCUNIQVIJCUJHUnNzaU9mZnNldDE7CQkJCS8vIFN0b3JlIEIvRyBSU1NJIzEgT2Zmc2V0IHZhbHVlCi0JQ0hBUgkJQkdSc3NpT2Zmc2V0MjsJCQkJLy8gU3RvcmUgQi9HIFJTU0kjMiBPZmZzZXQgdmFsdWUKLQotCUNIQVIJCUFSc3NpT2Zmc2V0MDsJCQkJLy8gU3RvcmUgQSBSU1NJIzAgT2Zmc2V0IHZhbHVlIG9uIEVFUFJPTSAweDRBaAotCUNIQVIJCUFSc3NpT2Zmc2V0MTsJCQkJLy8gU3RvcmUgQSBSU1NJIzEgT2Zmc2V0IHZhbHVlCi0JQ0hBUgkJQVJzc2lPZmZzZXQyOwkJCQkvLyBTdG9yZSBBIFJTU0kjMiBPZmZzZXQgdmFsdWUKLQotCUNIQVIJCUJMTkFHYWluOwkJCQkJLy8gU3RvcmUgQi9HIGV4dGVybmFsIExOQSMwIHZhbHVlIG9uIEVFUFJPTSAweDQ0aAotCUNIQVIJCUFMTkFHYWluMDsJCQkJCS8vIFN0b3JlIEEgZXh0ZXJuYWwgTE5BIzAgdmFsdWUgZm9yIGNoMzZ+NjQKLQlDSEFSCQlBTE5BR2FpbjE7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMxIHZhbHVlIGZvciBjaDEwMH4xMjgKLQlDSEFSCQlBTE5BR2FpbjI7CQkJCQkvLyBTdG9yZSBBIGV4dGVybmFsIExOQSMyIHZhbHVlIGZvciBjaDEzMn4xNjUKLSNpZmRlZiBSVDMweHgKLQkvLyBmb3IgMzU3MgotCVVDSEFSCQlCYnAyNTsKLQlVQ0hBUgkJQmJwMjY7Ci0KLQlVQ0hBUgkJVHhNaXhlckdhaW4yNEc7CQkJCS8vIFR4IG1peGVyIGdhaW4gdmFsdWUgZnJvbSBFRVBST00gdG8gaW1wcm92ZSBUeCBFVk0gLyBUeCBEQUMsIDIuNEcKLQlVQ0hBUgkJVHhNaXhlckdhaW41RzsKLSNlbmRpZiAvLyBSVDMweHggLy8KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gTEVEIGNvbnRyb2wKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTUNVX0xFRENTX1NUUlVDCQlMZWRDbnRsOwotCVVTSE9SVAkJCQlMZWQxOwkvLyByZWFkIGZyb20gRUVQUk9NIDB4M2MKLQlVU0hPUlQJCQkJTGVkMjsJLy8gRUVQUk9NIDB4M2UKLQlVU0hPUlQJCQkJTGVkMzsJLy8gRUVQUk9NIDB4NDAKLQlVQ0hBUgkJCQlMZWRJbmRpY2F0b3JTdHJlbmd0aDsKLQlVQ0hBUgkJCQlSc3NpU2luZ2Fsc3RyZW5ndGhPZmZldDsKLQlCT09MRUFOCQkJCWJMZWRPblNjYW5uaW5nOwotCVVDSEFSCQkJCUxlZFN0YXR1czsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICA4MDIuMTEgcmVsYXRlZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCS8vIG91dGdvaW5nIEJFQUNPTiBmcmFtZSBidWZmZXIgYW5kIGNvcnJlc3BvbmRpbmcgVFhECi0JVFhXSV9TVFJVQwkJCUJlYWNvblR4V0k7Ci0JUFVDSEFSCQkJCQkJQmVhY29uQnVmOwotCVVTSE9SVAkJCQkJCUJlYWNvbk9mZnNldFtIV19CRUFDT05fTUFYX0NPVU5UXTsKLQotCS8vIHByZS1idWlsZCBQUy1QT0xMIGFuZCBOVUxMIGZyYW1lIHVwb24gbGluayB1cC4gZm9yIGVmZmljaWVuY3kgcHVycG9zZS4KLQlQU1BPTExfRlJBTUUJCQlQc1BvbGxGcmFtZTsKLQlIRUFERVJfODAyXzExCQkJTnVsbEZyYW1lOwotCi0KLQotCi0vLz09PT09PT09PUFQPT09PT09PT09PT0KLQotCi0vLz09PT09PT1TVEE9PT09PT09PT09PQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gU1RBIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gJiBvcGVyYXRpb24gc3RhdHVzCi0JLy8gdXNlZCBvbmx5IHdoZW4gcEFkLT5PcE1vZGUgPT0gT1BNT0RFX1NUQQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JU1RBX0FETUlOX0NPTkZJRyAgICAgICAgU3RhQ2ZnOwkJLy8gdXNlciBkZXNpcmVkIHNldHRpbmdzCi0JU1RBX0FDVElWRV9DT05GSUcgICAgICAgU3RhQWN0aXZlOwkJLy8gdmFsaWQgb25seSB3aGVuIEFESE9DX09OKHBBZCkgfHwgSU5GUkFfT04ocEFkKQotCUNIQVIgICAgICAgICAgICAgICAgICAgIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOyAvLyBuaWNrbmFtZSwgb25seSB1c2VkIGluIHRoZSBpd2NvbmZpZyBpL2YKLQlORElTX01FRElBX1NUQVRFICAgICAgICBQcmVNZWRpYVN0YXRlOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0vLz09PT09PT1Db21tb249PT09PT09PT09PQotCS8vIE9QIG1vZGU6IGVpdGhlciBBUCBvciBTVEEKLQlVQ0hBUiAgICAgICAgICAgICAgICAgICBPcE1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gT1BNT0RFX1NUQSwgT1BNT0RFX0FQCi0KLQlORElTX01FRElBX1NUQVRFICAgICAgICBJbmRpY2F0ZU1lZGlhU3RhdGU7CQkJLy8gQmFzZSBvbiBJbmRpY2F0aW9uIHN0YXRlLCBkZWZhdWx0IGlzIE5kaXNNZWRpYVN0YXRlRGlzQ29ubmVjdGVkCi0KLQotCS8qIE1BVCByZWxhdGVkIHBhcmFtZXRlcnMgKi8KLQotCS8vIGNvbmZpZ3VyYXRpb246IHJlYWQgZnJvbSBSZWdpc3RyeSAmIEUyUFJPTQotCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJMb2NhbEFkbWluTUFDOyAgICAgICAgICAgICAvLyBVc2UgdXNlciBjaGFuZ2VkIE1BQwotCVVDSEFSICAgICAgICAgICAgICAgICAgIFBlcm1hbmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgLy8gRmFjdG9yeSBkZWZhdWx0IE1BQyBhZGRyZXNzCi0JVUNIQVIgICAgICAgICAgICAgICAgICAgQ3VycmVudEFkZHJlc3NbTUFDX0FERFJfTEVOXTsgICAgICAvLyBVc2VyIGNoYW5nZWQgTUFDIGFkZHJlc3MKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIGNvbW1vbiBjb25maWd1cmF0aW9uIHRvIGJvdGggT1BNT0RFX1NUQSBhbmQgT1BNT0RFX0FQCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQ09NTU9OX0NPTkZJRyAgICAgICAgICAgQ29tbW9uQ2ZnOwotCU1MTUVfU1RSVUNUICAgICAgICAgICAgIE1sbWU7Ci0KLQkvLyBBUCBuZWVkcyB0aG9zZSB2YWlhYmxlcyBmb3Igc2l0ZSBzdXJ2ZXkgZmVhdHVyZS4KLQlNTE1FX0FVWCAgICAgICAgICAgICAgICBNbG1lQXV4OyAgICAgICAgICAgLy8gdGVtcG9yYXJ5IHNldHRpbmdzIHVzZWQgZHVyaW5nIE1MTUUgc3RhdGUgbWFjaGluZQotCUJTU19UQUJMRSAgICAgICAgICAgICAgIFNjYW5UYWI7ICAgICAgICAgICAvLyBzdG9yZSB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0Ci0KLQkvL0Fib3V0IE1hY1RhYiwgdGhlIHN0YSBkcml2ZXIgd2lsbCB1c2UgIzAgYW5kICMxIGZvciBtdWx0aWNhc3QgYW5kIEFQLgotCU1BQ19UQUJMRSAgICAgICAgICAgICAgICAgTWFjVGFiOyAgICAgLy8gQVNJQyBvbi1jaGlwIFdDSUQgZW50cnkgdGFibGUuICBBdCBUWCwgQVNJQyBhbHdheXMgdXNlIGtleSBhY2NvcmRpbmcgdG8gdGhpcyBvbi1jaGlwIHRhYmxlLgotCU5ESVNfU1BJTl9MT0NLICAgICAgICAgIE1hY1RhYkxvY2s7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlCQV9UQUJMRQkJCUJBVGFibGU7Ci0JTkRJU19TUElOX0xPQ0sgICAgICAgICAgQkFUYWJMb2NrOwotCVJBTElOS19USU1FUl9TVFJVQ1QgUkVDQkFUaW1lcjsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBLRVkgdGFibGVzCi0JQ0lQSEVSX0tFWSAgICAgICAgICAgICAgU2hhcmVkS2V5W01BWF9NQlNTSURfTlVNXVs0XTsgLy8gU1RBIGFsd2F5cyB1c2UgU2hhcmVkS2V5W0JTUzBdWzAuLjNdCi0KLQkvLyBSWCByZS1hc3NlbWJseSBidWZmZXIgZm9yIGZyYWdtZW50YXRpb24KLQlGUkFHTUVOVF9GUkFNRSAgICAgICAgICBGcmFnRnJhbWU7ICAgICAgICAgICAgICAgICAgLy8gRnJhbWUgc3RvcmFnZSBmb3IgZnJhZ21lbnQgZnJhbWUKLQotCS8vIHZhcmlvdXMgQ291bnRlcnMKLQlDT1VOVEVSXzgwMl8zICAgICAgICAgICBDb3VudGVyczgwMjM7ICAgICAgICAgICAgICAgLy8gODAyLjMgY291bnRlcnMKLQlDT1VOVEVSXzgwMl8xMSAgICAgICAgICBXbGFuQ291bnRlcnM7ICAgICAgICAgICAgICAgLy8gODAyLjExIE1JQiBjb3VudGVycwotCUNPVU5URVJfUkFMSU5LICAgICAgICAgIFJhbGlua0NvdW50ZXJzOyAgICAgICAgICAgICAvLyBSYWxpbmsgcHJvcHJpZXR5IGNvdW50ZXJzCi0JQ09VTlRFUl9EUlMgICAgICAgICAgICAgRHJzQ291bnRlcnM7ICAgICAgICAgICAgICAgIC8vIGNvdW50ZXJzIGZvciBEeW5hbWljIFRYIFJhdGUgU3dpdGNoaW5nCi0JUFJJVkFURV9TVFJVQyAgICAgICAgICAgUHJpdmF0ZUluZm87ICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgaW5mb3JtYXRpb24gJiBjb3VudGVycwotCi0JLy8gZmxhZ3MsIHNlZSBmUlRNUF9BREFQVEVSX3h4eCBmbGFncwotCVVMT05HICAgICAgICAgICAgICAgICAgIEZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnQgY3VycmVudCBkZXZpY2Ugc3RhdHVzCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgUFNGbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIFBvd2VyIFNhdmUgb3BlcmF0aW9uIGZsYWcuCi0KLQkvLyBjdXJyZW50IFRYIHNlcXVlbmNlICMKLQlVU0hPUlQgICAgICAgICAgICAgICAgICBTZXF1ZW5jZTsKLQotCS8vIENvbnRyb2wgZGlzY29ubmVjdCAvIGNvbm5lY3QgZXZlbnQgZ2VuZXJhdGlvbgotCS8vKysrRGlkbid0IHVzZWQgYW55bW9yZQotCVVMT05HICAgICAgICAgICAgICAgICAgIExpbmtEb3duVGltZTsKLQkvLy0tLQotCVVMT05HICAgICAgICAgICAgICAgICAgIExhc3RSeFJhdGU7Ci0JVUxPTkcgICAgICAgICAgICAgICAgICAgTGFzdFR4UmF0ZTsKLQkvLysrK1VzZWQgb25seSBmb3IgU3RhdGlvbgotCUJPT0xFQU4gICAgICAgICAgICAgICAgIGJDb25maWdDaGFuZ2VkOyAgICAgICAgIC8vIENvbmZpZyBDaGFuZ2UgZmxhZyBmb3IgdGhlIHNhbWUgU1NJRCBzZXR0aW5nCi0JLy8tLS0KLQotCVVMT05HICAgICAgICAgICAgICAgICAgIEV4dHJhSW5mbzsgICAgICAgICAgICAgIC8vIEV4dHJhIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5aW5nIHN0YXR1cwotCVVMT05HICAgICAgICAgICAgICAgICAgIFN5c3RlbUVycm9yQml0bWFwOyAgICAgIC8vIGIwOiBFMlBST00gdmVyc2lvbiBlcnJvcgotCi0JLy8rKytEaWRuJ3QgdXNlZCBhbnltb3JlCi0JVUxPTkcgICAgICAgICAgICAgICAgICAgTWFjSWNWZXJzaW9uOyAgICAgICAgICAgLy8gTUFDL0JCUCBzZXJpYWwgaW50ZXJmYWNlIGlzc3VlIHNvbHZlZCBhZnRlciB2ZXIuRAotCS8vLS0tCi0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTeXN0ZW0gZXZlbnQgbG9nCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JUlRfODAyXzExX0VWRU5UX1RBQkxFICAgRXZlbnRUYWI7Ci0KLQotCUJPT0xFQU4JCUhUQ0VuYWJsZTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiAgICAgIFN0YXRpc3RpYyByZWxhdGVkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JQk9PTEVBTgkJCQkJCWJVcGRhdGVCY25DbnREb25lOwotCVVMT05HCQkJCQkJd2F0Y2hEb2dNYWNEZWFkbG9jazsJLy8gcHJldmVudCBNQUMvQkJQIGludG8gZGVhZGxvY2sgY29uZGl0aW9uCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIERFQlVHIHBhcmFtZXJ0cwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvL1VMT05HCQlEZWJ1Z1NldHRpbmdbNF07Ci0JQk9PTEVBTgkJYkJhbkFsbEJhU2V0dXA7Ci0JQk9PTEVBTgkJYlByb21pc2N1b3VzOwotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIHJ0Mjg2MGMgZW11bGF0aW9uLXVzZSBQYXJhbWV0ZXJzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vVUxPTkcJCXJ0c2FjY3VbMzBdOwotCS8vVUxPTkcJCWN0c2FjY3VbMzBdOwotCS8vVUxPTkcJCWNmZW5kYWNjdVszMF07Ci0JLy9VTE9ORwkJYmFjb250ZW50WzE2XTsKLQkvL1VMT05HCQlyeGludFtSWF9SSU5HX1NJWkUrMV07Ci0JLy9VQ0hBUgkJcmN2YmFbNjBdOwotCUJPT0xFQU4JCWJMaW5rQWRhcHQ7Ci0JQk9PTEVBTgkJYkZvcmNlUHJpbnRUWDsKLQlCT09MRUFOCQliRm9yY2VQcmludFJYOwotCS8vQk9PTEVBTgkJYkRpc2FibGVzY2FubmluZzsJCS8vZGVmaW5lZCBpbiBSVDI4NzAgVVNCCi0JQk9PTEVBTgkJYlN0YUZpZm9UZXN0OwotCUJPT0xFQU4JCWJQcm90ZWN0aW9uVGVzdDsKLQkvKgotCUJPT0xFQU4JCWJIQ0NBVGVzdDsKLQlCT09MRUFOCQliR2VuT25lSENDQTsKLQkqLwotCUJPT0xFQU4JCWJCcm9hZENvbUhUOwotCS8vKysrRm9sbG93aW5nIGFkZCBmcm9tIFJUMjg3MCBVU0IuCi0JVUxPTkcJCUJ1bGtPdXRSZXE7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZTsKLQlVTE9ORwkJQnVsa091dENvbXBsZXRlT3RoZXI7Ci0JVUxPTkcJCUJ1bGtPdXRDb21wbGV0ZUNhbmNlbDsJLy8gc2VlbXMgbm90IHVzZSBub3c/Ci0JVUxPTkcJCUJ1bGtJblJlcTsKLQlVTE9ORwkJQnVsa0luQ29tcGxldGU7Ci0JVUxPTkcJCUJ1bGtJbkNvbXBsZXRlRmFpbDsKLQkvLy0tLQotCi0gICAgc3RydWN0IHdpZmljb25mCQkJV0lGSXRlc3RiZWQ7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JQVRFX0lORk8JCQkJYXRlOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXN0cnVjdCByZW9yZGVyaW5nX21wZHVfcG9vbCBtcGR1X2Jsa19wb29sOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JVUxPTkcJCQkJCU9uZVNlY29uZG5vbkJFcGFja2V0czsJCS8vIHJlY29yZCBub24gQkUgcGFja2V0cyBwZXIgc2Vjb25kCi0KLSNpZmRlZiBMSU5VWAotI2lmIFdJUkVMRVNTX0VYVCA+PSAxMgotICAgIHN0cnVjdCBpd19zdGF0aXN0aWNzICAgIGl3X3N0YXRzOwotI2VuZGlmCi0KLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKLSNlbmRpZiAvLyBMSU5VWCAvLwotCi0jaWZkZWYgQkxPQ0tfTkVUX0lGCi0JQkxPQ0tfUVVFVUVfRU5UUlkJCWJsb2NrUXVldWVUYWJbTlVNX09GX1RYX1JJTkddOwotI2VuZGlmIC8vIEJMT0NLX05FVF9JRiAvLwotCi0KLQotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotCUlOVDMyCQkJCQlNQ19Sb3dJRDsKLQlTVFJJTkcJCQkJCU1DX0ZpbGVOYW1lWzI1Nl07Ci0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0KLQlVTE9ORwkJCQkJVGJ0dFRpY2tDb3VudDsKLSNpZmRlZiBQQ0lfTVNJX1NVUFBPUlQKLQlCT09MRUFOCQkJCQlIYXZlTXNpOwotI2VuZGlmIC8vIFBDSV9NU0lfU1VQUE9SVCAvLwotCi0KLQlVQ0hBUgkJCQkJaXNfb247Ci0KLSNkZWZpbmUgVElNRV9CQVNFCQkJKDEwMDAwMDAvT1NfSFopCi0jZGVmaW5lIFRJTUVfT05FX1NFQ09ORAkJKDEwMDAwMDAvVElNRV9CQVNFKQotCVVDSEFSCQkJCQlmbGdfYmVfYWRqdXN0OwotCVVMT05HCQkJCQliZV9hZGp1c3RfbGFzdF90aW1lOwotCi0jaWZkZWYgTklOVEVORE9fQVAKLQlOSU5ET19DVFJMX0JMT0NLCQluaW5kb19jdHJsX2Jsb2NrOwotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLQotI2lmZGVmIElLQU5PU19WWF8xWDAKLQlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8JSWthbm9zVHhJbmZvOwotCXN0cnVjdCBJS0FOT1NfVFhfSU5GTwlJa2Fub3NSeEluZm9bTUFYX01CU1NJRF9OVU0gKyBNQVhfV0RTX0VOVFJZICsgTUFYX0FQQ0xJX05VTSArIE1BWF9NRVNIX05VTV07Ci0jZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLwotCi0KLSNpZmRlZiBEQkdfRElBR05PU0UKLQlSdG1wRGlhZ1N0cnVjdAlEaWFnU3RydWN0OwotI2VuZGlmIC8vIERCR19ESUFHTk9TRSAvLwotCi0KLQlVSU5UOAkJCQkJRmxnQ3RzRW5hYmxlZDsKLQlVSU5UOAkJCQkJUE1fRmxnU3VzcGVuZDsKLQotI2lmZGVmIFJUMzB4eAotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotCUJPT0xFQU4JCWJVc2VFZnVzZTsKLQlCT09MRUFOCQliRUVQUk9NRmlsZTsKLQlCT09MRUFOCQliRnJvY2VFRVBST01CdWZmZXI7Ci0JVUNIQVIJCUVFUFJPTUltYWdlWzEwMjRdOwotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFJUMzB4eCAvLwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLX07Ci0KLQotCi0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotI2RlZmluZSBERUxBWUlOVE1BU0sJCTB4MDAxM2ZmZmIKLSNkZWZpbmUgSU5UTUFTSwkJCQkweDAwMTNmZmZiCi0jZGVmaW5lIEluZE1hc2sJCQkJMHgwMDEzZmZmYwotI2RlZmluZSBSYWRhckludAkJCTB4MDAxMDAwMDAKLSNlbHNlCi0jZGVmaW5lIERFTEFZSU5UTUFTSwkJMHgwMDAzZmZmYgotI2RlZmluZSBJTlRNQVNLCQkJCTB4MDAwM2ZmZmIKLSNkZWZpbmUgSW5kTWFzawkJCQkweDAwMDNmZmZjCi0jZW5kaWYgLy8gVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVCAvLwotCi0jZGVmaW5lIFJ4SU5UCQkJCTB4MDAwMDAwMDUJLy8gRGVsYXllZCBSeCBvciBpbmRpdmkgcngKLSNkZWZpbmUgVHhEYXRhSW50CQkJMHgwMDAwMDBmYQkvLyBEZWxheWVkIFR4IG9yIGluZGl2aSB0eAotI2RlZmluZSBUeE1nbXRJbnQJCQkweDAwMDAwMTAyCS8vIERlbGF5ZWQgVHggb3IgaW5kaXZpIHR4Ci0jZGVmaW5lIFR4Q29oZXJlbnQJCQkweDAwMDIwMDAwCS8vIHR4IGNvaGVyZW50Ci0jZGVmaW5lIFJ4Q29oZXJlbnQJCQkweDAwMDEwMDAwCS8vIHJ4IGNvaGVyZW50Ci0jZGVmaW5lIE1jdUNvbW1hbmQJCQkweDAwMDAwMjAwCS8vIG1jdQotI2RlZmluZSBQcmVUQlRUSW50CQkJMHgwMDAwMTAwMAkvLyBQcmUtVEJUVCBpbnRlcnJ1cHQKLSNkZWZpbmUgVEJUVEludAkJCQkweDAwMDAwODAwCQkvLyBUQlRUIGludGVycnVwdAotI2RlZmluZSBHUFRpbWVPdXRJbnQJCQkweDAwMDA4MDAwCQkvLyBHUHRpbWVvdXQgaW50ZXJydXB0Ci0jZGVmaW5lIEF1dG9XYWtldXBJbnQJCTB4MDAwMDQwMDAJCS8vIEF1dG9XYWtldXBJbnQgaW50ZXJydXB0Ci0jZGVmaW5lIEZpZm9TdGFGdWxsSW50CQkJMHgwMDAwMjAwMAkvLyAgZmlmbyBzdGF0aXN0aWNzIGZ1bGwgaW50ZXJydXB0Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCVJ4IFBhdGggc29mdHdhcmUgY29udHJvbCBibG9jayByZWxhdGVkIGRhdGEgc3RydWN0dXJlcwotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0IF9SWF9CTEtfCi17Ci0vLwlSWERfU1RSVUMJCVJ4RDsgLy8gc2FtcGxlCi0JUlQyOFhYX1JYRF9TVFJVQwlSeEQ7Ci0JUFJYV0lfU1RSVUMJCQlwUnhXSTsKLQlQSEVBREVSXzgwMl8xMQkJcEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJCXBSeFBhY2tldDsKLQlVQ0hBUgkJCQkqcERhdGE7Ci0JVVNIT1JUCQkJCURhdGFTaXplOwotCVVTSE9SVAkJCQlGbGFnczsKLQlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CS8vIGZvciBjYWxjdWxhdGUgVEtJUCBNSUMgdXNpbmcKLX0gUlhfQkxLOwotCi0KLSNkZWZpbmUgUlhfQkxLX1NFVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkJKF9wUnhCbGstPkZsYWdzIHw9IF9mbGFnKQotI2RlZmluZSBSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIF9mbGFnKQkoX3BSeEJsay0+RmxhZ3MgJiBfZmxhZykKLSNkZWZpbmUgUlhfQkxLX0NMRUFSX0ZMQUcoX3BSeEJsaywgX2ZsYWcpCShfcFJ4QmxrLT5GbGFncyAmPSB+KF9mbGFnKSkKLQotCi0jZGVmaW5lIGZSWF9XRFMJCQkweDAwMDEKLSNkZWZpbmUgZlJYX0FNU0RVCQkweDAwMDIKLSNkZWZpbmUgZlJYX0FSQUxJTksJCTB4MDAwNAotI2RlZmluZSBmUlhfSFRDCQkJMHgwMDA4Ci0jZGVmaW5lIGZSWF9QQUQJCQkweDAwMTAKLSNkZWZpbmUgZlJYX0FNUERVCQkweDAwMjAKLSNkZWZpbmUgZlJYX1FPUwkJCTB4MDA0MAotI2RlZmluZSBmUlhfSU5GUkEJCTB4MDA4MAotI2RlZmluZSBmUlhfRUFQCQkJMHgwMTAwCi0jZGVmaW5lIGZSWF9NRVNICQkweDAyMDAKLSNkZWZpbmUgZlJYX0FQQ0xJCQkweDA0MDAKLSNkZWZpbmUgZlJYX0RMUwkJCTB4MDgwMAotI2RlZmluZSBmUlhfV1BJCQkJMHgxMDAwCi0KLSNkZWZpbmUgTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRAkxNAotI2RlZmluZSBMRU5HVEhfQVJBTElOS19TVUJGUkFNRUhFQUQJMTQKLSNkZWZpbmUgTEVOR1RIX0FSQUxJTktfSEVBREVSX0ZJRUxECSAyCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCVR4IFBhdGggc29mdHdhcmUgY29udHJvbCBibG9jayByZWxhdGVkIGRhdGEgc3RydWN0dXJlcwotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgVFhfVU5LT1dOX0ZSQU1FCQkweDAwCi0jZGVmaW5lIFRYX01DQVNUX0ZSQU1FCQkJMHgwMQotI2RlZmluZSBUWF9MRUdBQ1lfRlJBTUUJCTB4MDIKLSNkZWZpbmUgVFhfQU1QRFVfRlJBTUUJCTB4MDQKLSNkZWZpbmUgVFhfQU1TRFVfRlJBTUUJCTB4MDgKLSNkZWZpbmUgVFhfUkFMSU5LX0ZSQU1FCQkweDEwCi0jZGVmaW5lIFRYX0ZSQUdfRlJBTUUJCQkweDIwCi0KLQotLy8JQ3VycmVudGx5IHRoZSBzaXplb2YoVFhfQkxLKSBpcyAxNDggYnl0ZXMuCi10eXBlZGVmIHN0cnVjdCBfVFhfQkxLXwotewotCVVDSEFSCQkJCVF1ZUlkeDsKLQlVQ0hBUgkJCQlUeEZyYW1lVHlwZTsJCQkJLy8gSW5kaWNhdGUgdGhlIFRyYW5zbWlzc2lvbiB0eXBlIG9mIHRoZSBhbGwgZnJhbWVzIGluIG9uZSBiYXRjaAotCVVDSEFSCQkJCVRvdGFsRnJhbWVOdW07CQkJCS8vIFRvdGFsIGZyYW1lIG51bWJlciB3YW50IHRvIHNlbmQtb3V0IGluIG9uZSBiYXRjaAotCVVTSE9SVAkJCQlUb3RhbEZyYWdOdW07CQkJCS8vIFRvdGFsIGZyYW1lIGZyYWdtZW50cyByZXF1aXJlZCBpbiBvbmUgYmF0Y2gKLQlVU0hPUlQJCQkJVG90YWxGcmFtZUxlbjsJCQkJLy8gVG90YWwgbGVuZ3RoIG9mIGFsbCBmcmFtZXMgd2FudCB0byBzZW5kLW91dCBpbiBvbmUgYmF0Y2gKLQotCVFVRVVFX0hFQURFUgkJVHhQYWNrZXRMaXN0OwotCU1BQ19UQUJMRV9FTlRSWQkJKnBNYWNFbnRyeTsJCQkJCS8vIE5VTEw6IHBhY2tldCB3aXRoIDgwMi4xMSBSQSBmaWVsZCBpcyBtdWx0aWNhc3QvYnJvYWRjYXN0IGFkZHJlc3MKLQlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKLQotCS8vIEZvbGxvd2luZyBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIHBhY2tldC4KLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQ7Ci0JUFVDSEFSCQkJCXBTcmNCdWZIZWFkZXI7CQkJCS8vIFJlZmVyZW5jZSB0byB0aGUgaGVhZCBvZiBza19idWZmLT5kYXRhCi0JUFVDSEFSCQkJCXBTcmNCdWZEYXRhOwkJCQkvLyBSZWZlcmVuY2UgdG8gdGhlIHNrX2J1ZmYtPmRhdGEsIHdpbGwgY2hhbmdlZCBkZXBlbmRzIG9uIGhhbmxkaW5nIHByb2dyZXNzcwotCVVJTlQJCQkJU3JjQnVmTGVuOwkJCQkJLy8gTGVuZ3RoIG9mIHBhY2tldCBwYXlsb2FkIHdoaWNoIG5vdCBpbmNsdWRpbmcgTGF5ZXIgMiBoZWFkZXIKLQlQVUNIQVIJCQkJcEV4dHJhTGxjU25hcEVuY2FwOwkJCS8vIE5VTEwgbWVhbnMgbm8gZXh0cmEgTExDL1NOQVAgaXMgcmVxdWlyZWQKLQlVQ0hBUgkJCQlIZWFkZXJCdWZbOTZdOwkJCQkvLyBUZW1wQnVmZmVyIGZvciBUWF9JTkZPICsgVFhfV0kgKyA4MDIuMTEgSGVhZGVyICsgcGFkZGluZyArIEFNU0RVIFN1YkhlYWRlciArIExMQy9TTkFQCi0JVUNIQVIJCQkJTXBkdUhlYWRlckxlbjsJCQkJLy8gODAyLjExIGhlYWRlciBsZW5ndGggTk9UIGluY2x1ZGluZyB0aGUgcGFkZGluZwotCVVDSEFSCQkJCUhkclBhZExlbjsJCQkJCS8vIHJlY29yZGluZyBIZWFkZXIgUGFkZGluZyBMZW5ndGg7Ci0JVUNIQVIJCQkJYXBpZHg7CQkJCQkJLy8gVGhlIGludGVyZmFjZSBhc3NvY2lhdGVkIHRvIHRoaXMgcGFja2V0Ci0JVUNIQVIJCQkJV2NpZDsJCQkJCQkvLyBUaGUgTUFDIGVudHJ5IGFzc29jaWF0ZWQgdG8gdGhpcyBwYWNrZXQKLQlVQ0hBUgkJCQlVc2VyUHJpb3JpdHk7CQkJCS8vIHByaW9yaXR5IGNsYXNzIG9mIHBhY2tldAotCVVDSEFSCQkJCUZyYW1lR2FwOwkJCQkJLy8gd2hhdCBraW5kIG9mIElGUyB0aGlzIHBhY2tldCB1c2UKLQlVQ0hBUgkJCQlNcGR1UmVxTnVtOwkJCQkJLy8gbnVtYmVyIG9mIGZyYWdtZW50cyBvZiB0aGlzIGZyYW1lCi0JVUNIQVIJCQkJVHhSYXRlOwkJCQkJCS8vIFRPRE86IE9ic29sZXRlZD8gU2hvdWxkIGNoYW5nZSB0byBNQ1M/Ci0JVUNIQVIJCQkJQ2lwaGVyQWxnOwkJCQkJLy8gY2lwaGVyIGFsb2dyaXRobQotCVBDSVBIRVJfS0VZCQkJcEtleTsKLQotCi0KLQlVU0hPUlQJCQkJRmxhZ3M7CQkJCQkJLy9TZWUgZm9sbG93aW5nIGRlZmluaXRpb25zIGZvciBkZXRhaWwuCi0KLQkvL1lPVSBTSE9VTEQgTk9UIFRPVUNIIElUISBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3IgaGFyZHdhcmUtZGVwZW5kZWQgbGF5ZXIuCi0JVUxPTkcJCQkJUHJpdjsJCQkJCQkvLyBIYXJkd2FyZSBzcGVjaWZpYyB2YWx1ZSBzYXZlZCBpbiBoZXJlLgotCi19IFRYX0JMSywgKlBUWF9CTEs7Ci0KLQotI2RlZmluZSBmVFhfYlJ0c1JlcXVpcmVkCQkJMHgwMDAxCS8vIEluZGljYXRlIGlmIG5lZWQgc2VuZCBSVFMgZnJhbWUgZm9yIHByb3RlY3Rpb24uIE5vdCB1c2VkIGluIFJUMjg2MC9SVDI4NzAuCi0jZGVmaW5lIGZUWF9iQWNrUmVxdWlyZWQJCQkweDAwMDIJLy8gdGhlIHBhY2tldCBuZWVkIGFjayByZXNwb25zZQotI2RlZmluZSBmVFhfYlBpZ2d5QmFjawkJCTB4MDAwNAkvLyBMZWdhY3kgZGV2aWNlIHVzZSBQaWdnYmFjayBvciBub3QKLSNkZWZpbmUgZlRYX2JIVFJhdGUJCQkJMHgwMDA4CS8vIGFsbG93IHRvIHVzZSBIVCByYXRlCi0jZGVmaW5lIGZUWF9iRm9yY2VOb25Rb1MJCTB4MDAxMAkvLyBmb3JjZSB0byB0cmFuc21pdCBmcmFtZSB3aXRob3V0IFdNTS1Rb1MgaW4gSFQgbW9kZQotI2RlZmluZSBmVFhfYkFsbG93RnJhZwkJCTB4MDAyMAkvLyBhbGxvdyB0byBmcmFnbWVudCB0aGUgcGFja2V0LCBBLU1QRFUsIEEtTVNEVSwgQS1SYWxpbmsgaXMgbm90IGFsbG93ZWQgdG8gZnJhZ21lbnQKLSNkZWZpbmUgZlRYX2JNb3JlRGF0YQkJCTB4MDA0MAkvLyB0aGVyZSBhcmUgbW9yZSBkYXRhIHBhY2tldHMgaW4gUG93ZXJTYXZlIFF1ZXVlCi0jZGVmaW5lIGZUWF9iV01NCQkJCTB4MDA4MAkvLyBRT1MgRGF0YQotI2RlZmluZSBmVFhfYkNsZWFyRUFQRnJhbWUJCTB4MDEwMAotCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLQotCi0jZGVmaW5lIFRYX0JMS19TRVRfRkxBRyhfcFR4QmxrLCBfZmxhZykJCShfcFR4QmxrLT5GbGFncyB8PSBfZmxhZykKLSNkZWZpbmUgVFhfQkxLX1RFU1RfRkxBRyhfcFR4QmxrLCBfZmxhZykJKCgoX3BUeEJsay0+RmxhZ3MgJiBfZmxhZykgPT0gX2ZsYWcpID8gMSA6IDApCi0jZGVmaW5lIFRYX0JMS19DTEVBUl9GTEFHKF9wVHhCbGssIF9mbGFnKQkoX3BUeEJsay0+RmxhZ3MgJj0gfihfZmxhZykpCi0KLQotCi0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJRW5kaWFuIGNvbnZlcnNpb24gcmVsYXRlZCBmdW5jdGlvbnMKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRW5kaWFuIGNvbnZlcnNpb24gb2YgVHgvUnggZGVzY3JpcHRvciAuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCXBEYXRhCQkJUG9pbnRlciB0byBUeC9SeCBkZXNjcmlwdG9yCi0JCURlc2NyaXB0b3JUeXBlCURpcmVjdGlvbiBvZiB0aGUgZnJhbWUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgZGVzY3JpcHRvcgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLXN0YXRpYyBpbmxpbmUgVk9JRAlSVE1QV0lFbmRpYW5DaGFuZ2UoCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEZXNjcmlwdG9yVHlwZSkKLXsKLQlpbnQgc2l6ZTsKLQlpbnQgaTsKLQotCXNpemUgPSAoKERlc2NyaXB0b3JUeXBlID09IFRZUEVfVFhXSSkgPyBUWFdJX1NJWkUgOiBSWFdJX1NJWkUpOwotCi0JaWYoRGVzY3JpcHRvclR5cGUgPT0gVFlQRV9UWFdJKQotCXsKLQkJKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOwkJLy8gQnl0ZSAwfjMKLQkJKigoVUlOVDMyICopKHBEYXRhICsgNCkpID0gU1dBUDMyKCooKFVJTlQzMiAqKShwRGF0YSs0KSkpOwkvLyBCeXRlIDR+NwotCX0KLQllbHNlCi0JewotCQlmb3IoaT0wOyBpIDwgc2l6ZS80IDsgaSsrKQotCQkJKigoKFVJTlQzMiAqKXBEYXRhKSAraSkgPSBTV0FQMzIoKigoKFVJTlQzMiAqKXBEYXRhKStpKSk7Ci0JfQotfQotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLXN0YXRpYyBpbmxpbmUgVk9JRAlXcml0ZUJhY2tUb0Rlc2NyaXB0b3IoCi0JSU4gIFBVQ0hBUgkJCURlc3QsCi0JSU4JUFVDSEFSCQkJU3JjLAotICAgIElOICBCT09MRUFOCQkJRG9FbmNyeXB0LAotCUlOICBVTE9ORyAgICAgICAgICAgRGVzY3JpcHRvclR5cGUpCi17Ci0JVUlOVDMyICpwMSwgKnAyOwotCi0JcDEgPSAoKFVJTlQzMiAqKURlc3QpOwotCXAyID0gKChVSU5UMzIgKilTcmMpOwotCi0JKnAxID0gKnAyOwotCSoocDErMikgPSAqKHAyKzIpOwotCSoocDErMykgPSAqKHAyKzMpOwotCSoocDErMSkgPSAqKHAyKzEpOyAvLyBXb3JkIDE7IHRoaXMgbXVzdCBiZSB3cml0dGVuIGJhY2sgbGFzdAotfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlFbmRpYW4gY29udmVyc2lvbiBvZiBUeC9SeCBkZXNjcmlwdG9yIC4KLQotCUFyZ3VtZW50czoKLQkJcEFkCVBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkJcERhdGEJCQlQb2ludGVyIHRvIFR4L1J4IGRlc2NyaXB0b3IKLQkJRGVzY3JpcHRvclR5cGUJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlOb3RlOgotCQlDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiByZWFkIG9yIHVwZGF0ZSBkZXNjcmlwdG9yCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotc3RhdGljIGlubGluZSBWT0lECVJUTVBEZXNjcmlwdG9yRW5kaWFuQ2hhbmdlKAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGVzY3JpcHRvclR5cGUpCi17Ci0JKigoVUlOVDMyICopKHBEYXRhKSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKSkpOwkJLy8gQnl0ZSAwfjMKLQkqKChVSU5UMzIgKikocERhdGEgKyA4KSkgPSBTV0FQMzIoKigoVUlOVDMyICopKHBEYXRhKzgpKSk7CS8vIEJ5dGUgOH4xMQotCSooKFVJTlQzMiAqKShwRGF0YSArMTIpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEgKyAxMikpKTsJLy8gQnl0ZSAxMn4xNQotCSooKFVJTlQzMiAqKShwRGF0YSArIDQpKSA9IFNXQVAzMigqKChVSU5UMzIgKikocERhdGEgKyA0KSkpOwkJCQkvLyBCeXRlIDR+NywgdGhpcyBtdXN0IGJlIHN3YXBwZWQgbGFzdAotfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJRW5kaWFuIGNvbnZlcnNpb24gb2YgYWxsIGtpbmRzIG9mIDgwMi4xMSBmcmFtZXMgLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwRGF0YQkJCVBvaW50ZXIgdG8gdGhlIDgwMi4xMSBmcmFtZSBzdHJ1Y3R1cmUKLQkJRGlyCQkJRGlyZWN0aW9uIG9mIHRoZSBmcmFtZQotCQlGcm9tUnhEb25lSW50CUNhbGxlciBpcyBmcm9tIFJ4RG9uZSBpbnRlcnJ1cHQKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JTm90ZToKLQkJQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gcmVhZCBvciB1cGRhdGUgYnVmZmVyIGRhdGEKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW5saW5lIFZPSUQJUlRNUEZyYW1lRW5kaWFuQ2hhbmdlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGlyLAotCUlOCUJPT0xFQU4JCQlGcm9tUnhEb25lSW50KQotewotCVBIRUFERVJfODAyXzExIHBGcmFtZTsKLQlQVUNIQVIJcE1hY0hkcjsKLQotCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEZyYW1lIENvbnRyb2wgZmllbGQKLQlpZihEaXIgPT0gRElSX1JFQUQpCi0JewotCQkqKFVTSE9SVCAqKXBEYXRhID0gU1dBUDE2KCooVVNIT1JUICopcERhdGEpOwotCX0KLQotCXBGcmFtZSA9IChQSEVBREVSXzgwMl8xMSkgcERhdGE7Ci0JcE1hY0hkciA9IChQVUNIQVIpIHBGcmFtZTsKLQotCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIER1cmF0aW9uL0lEIGZpZWxkCi0JKihVU0hPUlQgKikocE1hY0hkciArIDIpID0gU1dBUDE2KCooVVNIT1JUICopKHBNYWNIZHIgKyAyKSk7Ci0KLQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTZXF1ZW5jZSBDb250cm9sIGZpZWxkCi0JKihVU0hPUlQgKikocE1hY0hkciArIDIyKSA9IFNXQVAxNigqKFVTSE9SVCAqKShwTWFjSGRyICsgMjIpKTsKLQotCWlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9NR01UKQotCXsKLQkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKLQkJewotCQkJY2FzZSBTVUJUWVBFX0FTU09DX1JFUToKLQkJCWNhc2UgU1VCVFlQRV9SRUFTU09DX1JFUToKLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAotCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKEhFQURFUl84MDJfMTEpOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCi0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gTGlzdGVuIEludGVydmFsIGZpZWxkCi0JCQkJcE1hY0hkciArPSAyOwotCQkJCSooVVNIT1JUICopcE1hY0hkciA9IFNXQVAxNigqKFVTSE9SVCAqKXBNYWNIZHIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVQlRZUEVfQVNTT0NfUlNQOgotCQkJY2FzZSBTVUJUWVBFX1JFQVNTT0NfUlNQOgotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIENhcGFiaWxpdHlJbmZvIGZpZWxkCi0JCQkJcE1hY0hkciArPSBzaXplb2YoSEVBREVSXzgwMl8xMSk7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0KLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBTdGF0dXMgQ29kZSBmaWVsZAotCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEFJRCBmaWVsZAotCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVUJUWVBFX0FVVEg6Ci0JCQkJLy8gSWYgZnJvbSBBUEhhbmRsZVJ4RG9uZUludGVycnVwdCByb3V0aW5lLCBpdCBpcyBzdGlsbCBhIGVuY3J5cHQgZm9ybWF0LgotCQkJCS8vIFRoZSBjb252ZXJ0aW9uIGlzIGRlbGF5ZWQgdG8gUlRNUEhhbmRsZURlY3J5cHRpb25Eb25lSW50ZXJydXB0LgotCQkJCWlmKCFGcm9tUnhEb25lSW50ICYmIHBGcmFtZS0+RkMuV2VwID09IDEpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEF1dGggQWxnIE5vLiBmaWVsZAotCQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0KLQkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gQXV0aCBTZXEgTm8uIGZpZWxkCi0JCQkJCXBNYWNIZHIgKz0gMjsKLQkJCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0KLQkJCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gU3RhdHVzIENvZGUgZmllbGQKLQkJCQkJcE1hY0hkciArPSAyOwotCQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VCVFlQRV9CRUFDT046Ci0JCQljYXNlIFNVQlRZUEVfUFJPQkVfUlNQOgotCQkJCS8vIHN3YWIgMTYgYml0IGZpZWxkcyAtIEJlYWNvbkludGVydmFsIGZpZWxkCi0JCQkJcE1hY0hkciArPSAoc2l6ZW9mKEhFQURFUl84MDJfMTEpICsgVElNRVNUQU1QX0xFTik7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0KLQkJCQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBDYXBhYmlsaXR5SW5mbyBmaWVsZAotCQkJCXBNYWNIZHIgKz0gc2l6ZW9mKFVTSE9SVCk7Ci0JCQkJKihVU0hPUlQgKilwTWFjSGRyID0gU1dBUDE2KCooVVNIT1JUICopcE1hY0hkcik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VCVFlQRV9ERUFVVEg6Ci0JCQljYXNlIFNVQlRZUEVfRElTQVNTT0M6Ci0JCQkJLy8gc3dhYiAxNiBiaXQgZmllbGRzIC0gUmVhc29uIGNvZGUgZmllbGQKLQkJCQlwTWFjSGRyICs9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQkJCQkqKFVTSE9SVCAqKXBNYWNIZHIgPSBTV0FQMTYoKihVU0hPUlQgKilwTWFjSGRyKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQllbHNlIGlmKCBwRnJhbWUtPkZDLlR5cGUgPT0gQlRZUEVfREFUQSApCi0JewotCX0KLQllbHNlIGlmKHBGcmFtZS0+RkMuVHlwZSA9PSBCVFlQRV9DTlRMKQotCXsKLQkJc3dpdGNoKHBGcmFtZS0+RkMuU3ViVHlwZSkKLQkJewotCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDS19SRVE6Ci0JCQkJewotCQkJCQlQRlJBTUVfQkFfUkVRIHBCQVJlcSA9IChQRlJBTUVfQkFfUkVRKXBGcmFtZTsKLQkJCQkJKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkgPSBTV0FQMTYoKihVU0hPUlQgKikoJnBCQVJlcS0+QkFSQ29udHJvbCkpOwotCQkJCQlwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCA9IFNXQVAxNihwQkFSZXEtPkJBU3RhcnRpbmdTZXEud29yZCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTVUJUWVBFX0JMT0NLX0FDSzoKLQkJCQkvLyBGb3IgQmxvY2sgQWNrIHBhY2tldCwgdGhlIEhUX0NPTlRST0wgZmllbGQgaXMgaW4gdGhlIHNhbWUgb2Zmc2V0IHdpdGggQWRkcjMKLQkJCQkqKFVJTlQzMiAqKSgmcEZyYW1lLT5BZGRyM1swXSkgPSBTV0FQMzIoKihVSU5UMzIgKikoJnBGcmFtZS0+QWRkcjNbMF0pKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVUJUWVBFX0FDSzoKLQkJCQkvL0ZvciBBQ0sgcGFja2V0LCB0aGUgSFRfQ09OVFJPTCBmaWVsZCBpcyBpbiB0aGUgc2FtZSBvZmZzZXQgd2l0aCBBZGRyMgotCQkJCSooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKT0JU1dBUDMyKCooVUlOVDMyICopKCZwRnJhbWUtPkFkZHIyWzBdKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJJbnZhbGlkIEZyYW1lIFR5cGUhISFcbiIpKTsKLQl9Ci0KLQkvLyBzd2FiIDE2IGJpdCBmaWVsZHMgLSBGcmFtZSBDb250cm9sCi0JaWYoRGlyID09IERJUl9XUklURSkKLQl7Ci0JCSooVVNIT1JUICopcERhdGEgPSBTV0FQMTYoKihVU0hPUlQgKilwRGF0YSk7Ci0JfQotfQotI2VuZGlmIC8vIFJUX0JJR19FTkRJQU4gLy8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoJT3RoZXIgc3RhdGljIGlubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucwotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgVk9JRCBDb252ZXJ0TXVsdGljYXN0SVAyTUFDKAotCUlOIFBVQ0hBUiBwSXBBZGRyLAotCUlOIFBVQ0hBUiAqcHBNYWNBZGRyLAotCUlOIFVJTlQxNiBQcm90b1R5cGUpCi17Ci0JaWYgKHBJcEFkZHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKHBwTWFjQWRkciA9PSBOVUxMIHx8ICpwcE1hY0FkZHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChQcm90b1R5cGUpCi0JewotCQljYXNlIEVUSF9QX0lQVjY6Ci0vLwkJCW1lbXNldCgqcHBNYWNBZGRyLCAwLCBFVEhfTEVOR1RIX09GX0FERFJFU1MpOwotCQkJKigqcHBNYWNBZGRyKSA9IDB4MzM7Ci0JCQkqKCpwcE1hY0FkZHIgKyAxKSA9IDB4MzM7Ci0JCQkqKCpwcE1hY0FkZHIgKyAyKSA9IHBJcEFkZHJbMTJdOwotCQkJKigqcHBNYWNBZGRyICsgMykgPSBwSXBBZGRyWzEzXTsKLQkJCSooKnBwTWFjQWRkciArIDQpID0gcElwQWRkclsxNF07Ci0JCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbMTVdOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFVEhfUF9JUDoKLQkJZGVmYXVsdDoKLS8vCQkJbWVtc2V0KCpwcE1hY0FkZHIsIDAsIEVUSF9MRU5HVEhfT0ZfQUREUkVTUyk7Ci0JCQkqKCpwcE1hY0FkZHIpID0gMHgwMTsKLQkJCSooKnBwTWFjQWRkciArIDEpID0gMHgwMDsKLQkJCSooKnBwTWFjQWRkciArIDIpID0gMHg1ZTsKLQkJCSooKnBwTWFjQWRkciArIDMpID0gcElwQWRkclsxXSAmIDB4N2Y7Ci0JCQkqKCpwcE1hY0FkZHIgKyA0KSA9IHBJcEFkZHJbMl07Ci0JCQkqKCpwcE1hY0FkZHIgKyA1KSA9IHBJcEFkZHJbM107Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLQotY2hhciAqR2V0UGh5TW9kZShpbnQgTW9kZSk7Ci1jaGFyKiBHZXRCVyhpbnQgQlcpOwotCi0KLQotQk9PTEVBTiBSVE1QQ2hlY2tGb3JIYW5nKAotCUlOICBORElTX0hBTkRMRSBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0KTsKLQotVk9JRCAgUlRNUEhhbHQoCi0JSU4gIE5ESVNfSEFORExFIE1pbmlwb3J0QWRhcHRlckNvbnRleHQpOwotCi0vLwotLy8gIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9pbml0LmMKLS8vCi1ORElTX1NUQVRVUyBSVE1QQWxsb2NBZGFwdGVyQmxvY2soCi0JSU4gUFZPSUQJCQloYW5kbGUsCi0JT1VUIFBSVE1QX0FEQVBURVIgICAqcHBBZGFwdGVyKTsKLQotTkRJU19TVEFUVVMgUlRNUEFsbG9jVHhSeFJpbmdNZW1vcnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1ORElTX1NUQVRVUyBSVE1QRmluZEFkYXB0ZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE5ESVNfSEFORExFICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQpOwotCi1ORElTX1NUQVRVUwlSVE1QUmVhZFBhcmFtZXRlcnNIb29rKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkKTsKLQotTkRJU19TVEFUVVMJUlRNUFNldFByb2ZpbGVQYXJhbWV0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFBTVFJJTkcJCXBCdWZmZXIpOwotCi1JTlQgUlRNUEdldEtleVBhcmFtZXRlcigKLSAgICBJTiBQU1RSSU5HIGtleSwKLSAgICBPVVQgUFNUUklORyBkZXN0LAotICAgIElOIElOVCBkZXN0c2l6ZSwKLSAgICBJTiBQU1RSSU5HIGJ1ZmZlciwKLSAgICBJTiBCT09MRUFOIGJUcmltU3BhY2UpOwotCi1WT0lEIFJUTVBGcmVlQWRhcHRlcigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIE5JQ1JlYWRSZWdQYXJhbWV0ZXJzKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTiAgTkRJU19IQU5ETEUgICAgICAgICBXcmFwcGVyQ29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi1WT0lEIE5JQ0luaXRSRlJlZ2lzdGVycygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUnRtcENoaXBPcHNSRkhvb2soCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi1ORElTX1NUQVRVUwlSVDMweHhXcml0ZVJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlyZWdJRCwKLQlJTglVQ0hBUgkJCXZhbHVlKTsKLQotTkRJU19TVEFUVVMJUlQzMHh4UmVhZFJGUmVnaXN0ZXIoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJCQlyZWdJRCwKLQlJTglQVUNIQVIJCQlwVmFsdWUpOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotCi1WT0lEIE5JQ1JlYWRFRVBST01QYXJhbWV0ZXJzKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLQlJTglQVUNIQVIJCQkJbWFjX2FkZHIpOwotCi1WT0lEIE5JQ0luaXRBc2ljRnJvbUVFUFJPTSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgICAgICBwQWQpOwotCi0KLU5ESVNfU1RBVFVTIE5JQ0luaXRpYWxpemVBZGFwdGVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICAgQk9PTEVBTiAgICBiSGFyZFJlc2V0KTsKLQotTkRJU19TVEFUVVMgTklDSW5pdGlhbGl6ZUFzaWMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIEJPT0xFQU4JCWJIYXJkUmVzZXQpOwotCi1WT0lEIE5JQ0lzc3VlUmVzZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBSaW5nQ2xlYW5VcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlKTsKLQotVk9JRCBSeFRlc3QoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1ORElTX1NUQVRVUyBEYmdTZW5kUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7Ci0KLVZPSUQgVXNlckNmZ0luaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE5JQ1Jlc2V0RnJvbUVycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgTklDTG9hZEZpcm13YXJlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBOSUNFcmFzZUZpcm13YXJlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotTkRJU19TVEFUVVMgTklDTG9hZFJhdGVTd2l0Y2hpbmdQYXJhbXMoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIE5JQ0NoZWNrRm9ySGFuZygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTklDVXBkYXRlRmlmb1N0YUNvdW50ZXJzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBOSUNVcGRhdGVSYXdDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUFplcm9NZW1vcnkoCi0JSU4gIFBWT0lEICAgcFNyYywKLQlJTiAgVUxPTkcgICBMZW5ndGgpOwotCi1VTE9ORyBSVE1QQ29tcGFyZU1lbW9yeSgKLQlJTiAgUFZPSUQgICBwU3JjMSwKLQlJTiAgUFZPSUQgICBwU3JjMiwKLQlJTiAgVUxPTkcgICBMZW5ndGgpOwotCi1WT0lEIFJUTVBNb3ZlTWVtb3J5KAotCU9VVCBQVk9JRCAgIHBEZXN0LAotCUlOICBQVk9JRCAgIHBTcmMsCi0JSU4gIFVMT05HICAgTGVuZ3RoKTsKLQotVk9JRCBBdG9IKAotCVBTVFJJTkcJc3JjLAotCVBVQ0hBUiBkZXN0LAotCWludAkJZGVzdGxlbik7Ci0KLVVDSEFSIEJ0b0goCi0JY2hhciBjaCk7Ci0KLVZPSUQgUlRNUFBhdGNoTWFjQmJwQnVnKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QUGF0Y2hDYXJkQnVzKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIpOwotCi1WT0lEIFJUTVBQYXRjaFJhbGlua0NhcmRCdXMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglVTE9ORwkJCUJ1cyk7Ci0KLVVMT05HIFJUTVBSZWFkQ0JDb25maWcoCi0JSU4JVUxPTkcJQnVzLAotCUlOCVVMT05HCVNsb3QsCi0JSU4JVUxPTkcJRnVuYywKLQlJTglVTE9ORwlPZmZzZXQpOwotCi1WT0lEIFJUTVBXcml0ZUNCQ29uZmlnKAotCUlOCVVMT05HCUJ1cywKLQlJTglVTE9ORwlTbG90LAotCUlOCVVMT05HCUZ1bmMsCi0JSU4JVUxPTkcJT2Zmc2V0LAotCUlOCVVMT05HCVZhbHVlKTsKLQotVk9JRCBSVE1QSW5pdFRpbWVyKAotCUlOICBQUlRNUF9BREFQVEVSICAgICAgICAgICBwQWQsCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKLQlJTiAgUFZPSUQgICAgICAgICAgICAgICAgICAgcFRpbWVyRnVuYywKLQlJTglQVk9JRAkJCQkJcERhdGEsCi0JSU4gIEJPT0xFQU4gICAgICAgICAgICAgICAgIFJlcGVhdCk7Ci0KLVZPSUQgUlRNUFNldFRpbWVyKAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCAgICBwVGltZXIsCi0JSU4gIFVMT05HICAgICAgICAgICAgICAgICAgIFZhbHVlKTsKLQotCi1WT0lEIFJUTVBNb2RUaW1lcigKLQlJTglQUkFMSU5LX1RJTUVSX1NUUlVDVAlwVGltZXIsCi0JSU4JVUxPTkcJCQkJCVZhbHVlKTsKLQotVk9JRCBSVE1QQ2FuY2VsVGltZXIoCi0JSU4gIFBSQUxJTktfVElNRVJfU1RSVUNUICAgIHBUaW1lciwKLQlPVVQgQk9PTEVBTiAgICAgICAgICAgICAgICAgKnBDYW5jZWxsZWQpOwotCi1WT0lEIFJUTVBTZXRMRUQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlTdGF0dXMpOwotCi1WT0lEIFJUTVBTZXRTaWduYWxMRUQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gTkRJU184MDJfMTFfUlNTSSBEYm0pOwotCi0KLVZPSUQgUlRNUEVuYWJsZVJ4VHgoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi0vLwotLy8gcHJvdG90eXBlIGluIGFjdGlvbi5jCi0vLwotVk9JRCBBY3Rpb25TdGF0ZU1hY2hpbmVJbml0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOICBTVEFURV9NQUNISU5FICpTLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgTWxtZUFEREJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZURFTEJBQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZURMU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVJbnZhbGlkQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZVFPU0FjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFBlZXJBZGRCQVJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJBZGRCQVJzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJEZWxCQUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJCQUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIFNlbmRQU01QQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJV2NpZCwKLQlJTiBVQ0hBUgkJCVBzbXApOwotCi0KLVZPSUQgUGVlclJNQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlclB1YmxpY0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi1WT0lEIFN0YVB1YmxpY0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBCc3MyMDQwQ29leGlzdCk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotVk9JRCBQZWVyQlNTVHJhbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFBlZXJIVEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIFBlZXJRT1NBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotVk9JRCBQZWVyRExTQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLVZPSUQgRGxzUGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfRExTX1JFUV9TVFJVQ1QgKnBEbHNSZXEsCi0JSU4gUFJUXzgwMl8xMV9ETFMgcERscywKLQlJTiBVU0hPUlQgcmVhc29uKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBSRUNCQVRpbWVyVGltZW91dCgKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIE9SSUJBVGltZXJUaW1lb3V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBTZW5kUmVmcmVzaEJBUigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSk7Ci0KLSNpZmRlZiBET1QxMU5fRFJBRlQzCi1WT0lEIFNlbmRCU1MyMDQwQ29leGlzdE1nbXRBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJV2NpZCwKLQlJTglVQ0hBUglhcGlkeCwKLQlJTglVQ0hBUglJbmZvUmVxKTsKLQotVk9JRCBTZW5kTm90aWZ5QldBY3Rpb25GcmFtZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgV2NpZCwKLQlJTiBVQ0hBUiBhcGlkeCk7Ci0KLUJPT0xFQU4gQ2hhbm5lbFN3aXRjaFNhbml0eUNoZWNrKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICAgIFVDSEFSICBXY2lkLAotCUlOICAgIFVDSEFSICBOZXdDaGFubmVsLAotCUlOICAgIFVDSEFSICBTZWNvbmRhcnkpOwotCi1WT0lEIENoYW5uZWxTd2l0Y2hBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4gICAgVUNIQVIgIENoYW5uZWwsCi0JSU4gICAgVUNIQVIgIFNlY29uZGFyeSk7Ci0KLVVMT05HIEJ1aWxkSW50b2xlcmFudENoYW5uZWxSZXAoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgUFVDSEFSICBwRGVzdCk7Ci0KLVZPSUQgVXBkYXRlMjA0MENvZXhpc3RGcmFtZUFuZE5vdGlmeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgV2NpZCwKLQlJTglCT09MRUFOCWJBZGRJbnRvbGVyYW50Q2hhKTsKLQotVk9JRCBTZW5kMjA0MENvZXhpc3RBY3Rpb24oCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICAgVUNIQVIgIFdjaWQsCi0JSU4JQk9PTEVBTgliQWRkSW50b2xlcmFudENoYSk7Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEIEFjdEhlYWRlckluaXQoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLSAgICBJTiBQVUNIQVIgQWRkcjEsCi0gICAgSU4gUFVDSEFSIEFkZHIyLAotICAgIElOIFBVQ0hBUiBBZGRyMyk7Ci0KLVZPSUQgQmFySGVhZGVySW5pdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBPVVQgUEZSQU1FX0JBUiBwQ250bEJhciwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFBVQ0hBUiBwU0EpOwotCi1WT0lEIEluc2VydEFjdEZpZWxkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IENhdGVnb3J5LAotCUlOIFVJTlQ4IEFjdENvZGUpOwotCi1CT09MRUFOIFFvc0JBRGF0YVBhcnNlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIEJPT0xFQU4gYkFNU0RVLAotCUlOIFBVQ0hBUiBwODAyM0hlYWRlciwKLQlJTiBVQ0hBUglXQ0lELAotCUlOIFVDSEFSCVRJRCwKLQlJTiBVU0hPUlQgU2VxdWVuY2UsCi0JSU4gVUNIQVIgRGF0YU9mZnNldCwKLQlJTiBVU0hPUlQgRGF0YXNpemUsCi0JSU4gVUlOVCAgIEN1clJ4SW5kZXgpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1CT09MRUFOIENudGxFbnF1ZXVlRm9yUmVjdigKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVTE9ORyBXY2lkLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlJTiBQRlJBTUVfQkFfUkVRIHBNc2cpOwotCi1WT0lEIEJhQXV0b01hblN3aXRjaCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgSFRJT1RDaGVjaygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgICBVQ0hBUiAgICAgQmF0UmVjSWR4KTsKLQotLy8KLS8vIFByaXZhdGUgcm91dGluZXMgaW4gcnRtcF9kYXRhLmMKLS8vCi1CT09MRUFOIFJUTVBIYW5kbGVSeERvbmVJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBIYW5kbGVUeERvbmVJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1CT09MRUFOIFJUTVBIYW5kbGVUeFJpbmdEbWFEb25lSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBJTlRfU09VUkNFX0NTUl9TVFJVQyBUeFJpbmdCaXRtYXApOwotCi1WT0lEIFJUTVBIYW5kbGVNZ210UmluZ0RtYURvbmVJbnRlcnJ1cHQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBIYW5kbGVUQlRUSW50ZXJydXB0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBSVE1QSGFuZGxlUHJlVEJUVEludGVycnVwdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLXZvaWQgUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lECVJUTVBIYW5kbGVSeENvaGVyZW50SW50ZXJydXB0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1CT09MRUFOIFR4RnJhbWVJc0FnZ3JlZ2F0aWJsZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBQcmV2QWRkcjEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwODAyM2hkcik7Ci0KLUJPT0xFQU4gUGVlcklzQWdncmVPbigKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgVUxPTkcgICAgICAgICAgVHhSYXRlLAotICAgIElOICBQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSk7Ci0KLQotTkRJU19TVEFUVVMgU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcigKLQlJTiAgUE5ESVNfQlVGRkVSICAgIHBGaXJzdEJ1ZmZlciwKLQlJTiAgVUNIQVIgICAgICAgICAgIERlc2lyZWRPZmZzZXQsCi0JT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTAsCi0JT1VUIFBVQ0hBUiAgICAgICAgICBwQnl0ZTEpOwotCi1ORElTX1NUQVRVUyBTVEFTZW5kUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7Ci0KLVZPSUQgU1RBU2VuZFBhY2tldHMoCi0JSU4gIE5ESVNfSEFORExFICAgICBNaW5pcG9ydEFkYXB0ZXJDb250ZXh0LAotCUlOICBQUE5ESVNfUEFDS0VUICAgcHBQYWNrZXRBcnJheSwKLQlJTiAgVUlOVCAgICAgICAgICAgIE51bWJlck9mUGFja2V0cyk7Ci0KLVZPSUQgUlRNUERlUXVldWVQYWNrZXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JQk9PTEVBTgkJCWJJbnRDb250ZXh0LAotCUlOICBVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVQ0hBUgkJCU1heF9UeF9QYWNrZXRzKTsKLQotTkRJU19TVEFUVVMJUlRNUEhhcmRUcmFuc21pdCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4gIFVDSEFSCQkJUXVlSWR4LAotCU9VVAlQVUxPTkcJCQlwRnJlZVRYRExlZnQpOwotCi1ORElTX1NUQVRVUwlTVEFIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVFhfQkxLCQkJKnBUeEJsaywKLQlJTiAgVUNIQVIJCQlRdWVJZHgpOwotCi1WT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLU5ESVNfU1RBVFVTIFJUTVBGcmVlVFhEUmVxdWVzdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFJpbmdUeXBlLAotCUlOICBVQ0hBUiAgICAgICAgICAgTnVtYmVyUmVxdWlyZWQsCi0JSU4JUFVDSEFSICAgICAgICAgIEZyZWVOdW1iZXJJcyk7Ci0KLU5ESVNfU1RBVFVTIE1sbWVIYXJkVHJhbnNtaXQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSCVF1ZUlkeCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0TWdtdFJpbmcoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSCVF1ZUlkeCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi1ORElTX1NUQVRVUyBNbG1lSGFyZFRyYW5zbWl0VHhSaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUglRdWVJZHgsCi0JSU4gIFBORElTX1BBQ0tFVCAgICBwUGFja2V0KTsKLQotTkRJU19TVEFUVVMgTWxtZURhdGFIYXJkVHJhbnNtaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJUXVlSWR4LAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKLQotVk9JRCBSVE1QV3JpdGVUeERlc2NyaXB0b3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFRYRF9TVFJVQwkJcFR4RCwKLQlJTglCT09MRUFOCQkJYldJViwKLQlJTglVQ0hBUgkJCVFTRUwpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi1VU0hPUlQgIFJUTVBDYWxjRHVyYXRpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgICAgICAgICBSYXRlLAotCUlOICBVTE9ORyAgICAgICAgICAgU2l6ZSk7Ci0KLVZPSUQgUlRNUFdyaXRlVHhXSSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4gIEJPT0xFQU4JCUZSQUcsCi0JSU4gIEJPT0xFQU4JCUNGQUNLLAotCUlOICBCT09MRUFOCQlJbnNUaW1lc3RhbXAsCi0JSU4JQk9PTEVBTgkJCUFNUERVLAotCUlOCUJPT0xFQU4JCQlBY2ssCi0JSU4JQk9PTEVBTgkJCU5TZXEsCQkvLyBIVyBuZXcgYSBzZXF1ZW5jZS4KLQlJTglVQ0hBUgkJCUJBU2l6ZSwKLQlJTglVQ0hBUgkJCVdDSUQsCi0JSU4JVUxPTkcJCQlMZW5ndGgsCi0JSU4gIFVDSEFSCQlQSUQsCi0JSU4JVUNIQVIJCQlUSUQsCi0JSU4JVUNIQVIJCQlUeFJhdGUsCi0JSU4JVUNIQVIJCQlUeG9wbW9kZSwKLQlJTglCT09MRUFOCQkJQ2ZBY2ssCi0JSU4JSFRUUkFOU01JVF9TRVRUSU5HCSpwVHJhbnNtaXQpOwotCi0KLVZPSUQgUlRNUFdyaXRlVHhXSV9EYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglPVVQgUFRYV0lfU1RSVUMJCXBUeFdJLAotCUlOCVRYX0JMSwkJCQkqcFR4QmxrKTsKLQotCi1WT0lEIFJUTVBXcml0ZVR4V0lfQ2FjaGUoCi0JSU4JUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCU9VVCBQVFhXSV9TVFJVQwkJcFR4V0ksCi0JSU4JVFhfQkxLCQkJCSpwVHhCbGspOwotCi1WT0lEIFJUTVBTdXNwZW5kTXNkdVRyYW5zbWlzc2lvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgUlRNUFJlc3VtZU1zZHVUcmFuc21pc3Npb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1ORElTX1NUQVRVUyBNaW5pcG9ydE1NUmVxdWVzdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbmd0aCk7Ci0KLS8vKysrbWFyayBieSBzaGlhbmcsIG5vdyB0aGlzIGZ1bmN0aW9uIG1lcmdlIHRvIE1pbmlwb3J0TU1SZXF1ZXN0KCkKLS8vLS0tbWFyayBieSBzaGlhbmcsIG5vdyB0aGlzIGZ1bmN0aW9uIG1lcmdlIHRvIE1pbmlwb3J0TU1SZXF1ZXN0KCkKLQotVk9JRCBSVE1QU2VuZE51bGxGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLQlJTglCT09MRUFOCQkJYlFvc051bGwpOwotCi1WT0lEIFJUTVBTZW5kRGlzYXNzb2NpYXRpb25GcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlRNUFNlbmRSVFNGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSwKLQlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAotCUlOICBVQ0hBUiAgICAgICAgICAgVHhSYXRlLAotCUlOICBVQ0hBUiAgICAgICAgICAgUlRTUmF0ZSwKLQlJTiAgVVNIT1JUICAgICAgICAgIEFja0R1cmF0aW9uLAotCUlOICBVQ0hBUiAgICAgICAgICAgUXVlSWR4LAotCUlOICBVQ0hBUgkJCUZyYW1lR2FwKTsKLQotCi1ORElTX1NUQVRVUyBSVE1QQXBwbHlQYWNrZXRGaWx0ZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBSVDI4WFhfUlhEX1NUUlVDICAgICAgcFJ4RCwKLQlJTiAgUEhFQURFUl84MDJfMTEgIHBIZWFkZXIpOwotCi1QUVVFVUVfSEVBREVSICAgUlRNUENoZWNrVHhTd1F1ZXVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBVQ0hBUiAgICAgICAgICAgKlF1ZUlkeCk7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLVZPSUQgUlRNUFJlcG9ydE1pY0Vycm9yKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQQ0lQSEVSX0tFWSAgICAgcFdwYUtleSk7Ci0KLVZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgICBXcGFEaXNhc3NvY0FwQW5kQmxvY2tBc3NvYygKLSAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOICBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0gICAgSU4gIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiAgUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBXcGFTdGFQYWlyd2lzZUtleVNldHRpbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFdwYVN0YUdyb3VwS2V5U2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotTkRJU19TVEFUVVMgUlRNUENsb25lTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglCT09MRUFOICAgIHBJbnNBTVNEVUhkciwKLQlJTiAgUE5ESVNfUEFDS0VUICAgIHBJblBhY2tldCwKLQlPVVQgUE5ESVNfUEFDS0VUICAgKnBwT3V0UGFja2V0KTsKLQotTkRJU19TVEFUVVMgUlRNUEFsbG9jYXRlTmRpc1BhY2tldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUE5ESVNfUEFDS0VUICAgICpwUGFja2V0LAotCUlOICBQVUNIQVIgICAgICAgICAgcEhlYWRlciwKLQlJTiAgVUlOVCAgICAgICAgICAgIEhlYWRlckxlbiwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEYXRhLAotCUlOICBVSU5UICAgICAgICAgICAgRGF0YUxlbik7Ci0KLVZPSUQgUlRNUEZyZWVOZGlzUGFja2V0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCk7Ci0KLUJPT0xFQU4gUlRNUEZyZWVUWERVcG9uVHhEbWFEb25lKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgICAgUXVlSWR4KTsKLQotQk9PTEVBTiBSVE1QQ2hlY2tESENQRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQpOwotCi0KLUJPT0xFQU4gUlRNUENoZWNrRXRoZXJUeXBlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0KTsKLQotCi1WT0lEIFJUTVBDY2tCYnBUdW5pbmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUlOVAkJCVR4UmF0ZSk7Ci0KLS8vCi0vLyBQcml2YXRlIHJvdXRpbmVzIGluIHJ0bXBfd2VwLmMKLS8vCi1WT0lEIFJUTVBJbml0V2VwRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleUlkLAotCUlOICBVQ0hBUiAgICAgICAgICAgS2V5TGVuLAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QpOwotCi1WT0lEIFJUTVBFbmNyeXB0RGF0YSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLUJPT0xFQU4JUlRNUERlY3J5cHREYXRhKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFVDSEFSCQkJcFNyYywKLQlJTglVSU5UCQkJTGVuLAotCUlOCVVJTlQJCQlpZHgpOwotCi1CT09MRUFOCVJUTVBTb2Z0RGVjcnlwdFdFUCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBQVUNIQVIJCQlwRGF0YSwKLQlJTiBVTE9ORwkJCURhdGFCeXRlQ250LAotCUlOIFBDSVBIRVJfS0VZCQlwR3JvdXBLZXkpOwotCi1WT0lEIFJUTVBTZXRJQ1YoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCk7Ci0KLVZPSUQgQVJDRk9VUl9JTklUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcEtleSwKLQlJTiAgVUlOVCAgICAgICAgICAgIEtleUxlbik7Ci0KLVVDSEFSICAgQVJDRk9VUl9CWVRFKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgICAgIEN0eCk7Ci0KLVZPSUQgQVJDRk9VUl9ERUNSWVBUKAotCUlOICBQQVJDRk9VUkNPTlRFWFQgQ3R4LAotCUlOICBQVUNIQVIgICAgICAgICAgcERlc3QsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKLQotVk9JRCBBUkNGT1VSX0VOQ1JZUFQoCi0JSU4gIFBBUkNGT1VSQ09OVEVYVCBDdHgsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwRGVzdCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFVJTlQgICAgICAgICAgICBMZW4pOwotCi1WT0lEIFdQQUFSQ0ZPVVJfRU5DUllQVCgKLQlJTiAgUEFSQ0ZPVVJDT05URVhUIEN0eCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEZXN0LAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLVVJTlQgUlRNUF9DQUxDX0ZDUzMyKAotCUlOICBVSU5UICAgRmNzLAotCUlOICBQVUNIQVIgIENwLAotCUlOICBJTlQgICAgIExlbik7Ci0KLS8vCi0vLyBNTE1FIHJvdXRpbmVzCi0vLwotCi0vLyBBc2ljL1JGL0JCUCByZWxhdGVkIGZ1bmN0aW9ucwotCi1WT0lEIEFzaWNBZGp1c3RUeFBvd2VyKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRAlBc2ljVXBkYXRlUHJvdGVjdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVTSE9SVAkJCU9wZXJhaW9uTW9kZSwKLQlJTgkJVUNIQVIJCQlTZXRNYXNrLAotCUlOCQlCT09MRUFOCQkJYkRpc2FibGVCR1Byb3RlY3QsCi0JSU4JCUJPT0xFQU4JCQliTm9uR0ZFeGlzdCk7Ci0KLVZPSUQgQXNpY1N3aXRjaENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4JVUNIQVIJCQlDaGFubmVsLAotCUlOCUJPT0xFQU4JCQliU2Nhbik7Ci0KLVZPSUQgQXNpY0xvY2tDaGFubmVsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIENoYW5uZWwpIDsKLQotVk9JRCBBc2ljQW50ZW5uYVNlbGVjdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUNIQVIgICAgICAgICAgIENoYW5uZWwpOwotCi1WT0lEIEFzaWNBbnRlbm5hU2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglBQkdCQU5EX1NUQVRFCUJhbmRTdGF0ZSk7Ci0KLVZPSUQgQXNpY1JmVHVuaW5nRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0KLVZPSUQgQXNpY1Jlc2V0QkJQQWdlbnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVU0hPUlQgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLVZPSUQgQXNpY0ZvcmNlU2xlZXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgIGJGcm9tVHgpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1WT0lEIEFzaWNTZXRCc3NpZCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBCc3NpZCk7Ci0KLVZPSUQgQXNpY1NldE1jYXN0V0MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi0KLVZPSUQgQXNpY0RlbFdjaWRUYWIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIJV2NpZCk7Ci0KLVZPSUQgQXNpY0VuYWJsZVJERygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgQXNpY0Rpc2FibGVSREcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIEFzaWNEaXNhYmxlU3luYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQXNpY0VuYWJsZUJzc1N5bmMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEFzaWNFbmFibGVJYnNzU3luYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQXNpY1NldEVkY2FQYXJtKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBFRENBX1BBUk0gICAgcEVkY2FQYXJtKTsKLQotVk9JRCBBc2ljU2V0U2xvdFRpbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gQk9PTEVBTiBiVXNlU2hvcnRTbG90VGltZSk7Ci0KLQotVk9JRCBBc2ljQWRkU2hhcmVkS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBCc3NJbmRleCwKLQlJTiBVQ0hBUiAgICAgICAgIEtleUlkeCwKLQlJTiBVQ0hBUiAgICAgICAgIENpcGhlckFsZywKLQlJTiBQVUNIQVIgICAgICAgIHBLZXksCi0JSU4gUFVDSEFSICAgICAgICBwVHhNaWMsCi0JSU4gUFVDSEFSICAgICAgICBwUnhNaWMpOwotCi1WT0lEIEFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgIEJzc0luZGV4LAotCUlOIFVDSEFSICAgICAgICAgS2V5SWR4KTsKLQotVk9JRCBBc2ljVXBkYXRlV0NJREF0dHJpYnV0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSICAgICAgICBDaXBoZXJBbGcsCi0JSU4gQk9PTEVBTgkJYlVzZVBhaXJld2lzZUtleVRhYmxlKTsKLQotVk9JRCBBc2ljVXBkYXRlV0NJRElWRUlWKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVAkJV0NJRCwKLQlJTiBVTE9ORyAgICAgICAgdUlWLAotCUlOIFVMT05HICAgICAgICB1RUlWKTsKLQotVk9JRCBBc2ljVXBkYXRlUnhXQ0lEVGFibGUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVVNIT1JUCQlXQ0lELAotCUlOIFBVQ0hBUiAgICAgICAgcEFkZHIpOwotCi1WT0lEIEFzaWNBZGRLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQJCVdDSUQsCi0JSU4gVUNIQVIJCUJzc0luZGV4LAotCUlOIFVDSEFSCQlLZXlJZHgsCi0JSU4gUENJUEhFUl9LRVkJcENpcGhlcktleSwKLQlJTiBCT09MRUFOCQliVXNlUGFpcmV3aXNlS2V5VGFibGUsCi0JSU4gQk9PTEVBTgkJYlR4S2V5KTsKLQotVk9JRCBBc2ljQWRkUGFpcndpc2VLZXlFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgICAgICAgIHBBZGRyLAotCUlOIFVDSEFSCQlXQ0lELAotCUlOIENJUEhFUl9LRVkJCSAqcENpcGhlcktleSk7Ci0KLVZPSUQgQXNpY1JlbW92ZVBhaXJ3aXNlS2V5RW50cnkoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFVDSEFSCQkgQnNzSWR4LAotCUlOIFVDSEFSCQkgV2NpZCk7Ci0KLUJPT0xFQU4gQXNpY1NlbmRDb21tYW5kVG9NY3UoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgICAgICBDb21tYW5kLAotCUlOIFVDSEFSICAgICAgICAgVG9rZW4sCi0JSU4gVUNIQVIgICAgICAgICBBcmcwLAotCUlOIFVDSEFSICAgICAgICAgQXJnMSk7Ci0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotQk9PTEVBTiBBc2ljQ2hlY2tDb21tYW5PaygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJIENvbW1hbmQpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi1WT0lEIE1hY0FkZHJSYW5kb21Cc3NpZCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUFVDSEFSIHBBZGRyKTsKLQotVk9JRCBNZ3RNYWNIZWFkZXJJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgICBwQWQsCi0JSU4gT1VUIFBIRUFERVJfODAyXzExIHBIZHI4MDIxMSwKLQlJTiBVQ0hBUiBTdWJUeXBlLAotCUlOIFVDSEFSIFRvRHMsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBQVUNIQVIgcEJzc2lkKTsKLQotVk9JRCBNbG1lUmFkaW9PZmYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotCi1WT0lEIEJzc1RhYmxlSW5pdCgKLQlJTiBCU1NfVEFCTEUgKlRhYik7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgQkFUYWJsZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gQkFfVEFCTEUgKlRhYik7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVVMT05HIEJzc1RhYmxlU2VhcmNoKAotCUlOIEJTU19UQUJMRSAqVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gVUNIQVIgQ2hhbm5lbCk7Ci0KLVVMT05HIEJzc1NzaWRUYWJsZVNlYXJjaCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIgICAgcEJzc2lkLAotCUlOIFBVQ0hBUiAgICBwU3NpZCwKLQlJTiBVQ0hBUiAgICAgU3NpZExlbiwKLQlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7Ci0KLVVMT05HIEJzc1RhYmxlU2VhcmNoV2l0aFNTSUQoCi0JSU4gQlNTX1RBQkxFICpUYWIsCi0JSU4gUFVDSEFSICAgIEJzc2lkLAotCUlOIFBVQ0hBUiAgICBwU3NpZCwKLQlJTiBVQ0hBUiAgICAgU3NpZExlbiwKLQlJTiBVQ0hBUiAgICAgQ2hhbm5lbCk7Ci0KLVVMT05HIEJzc1NzaWRUYWJsZVNlYXJjaEJ5U1NJRCgKLQlJTiBCU1NfVEFCTEUgKlRhYiwKLQlJTiBQVUNIQVIJIHBTc2lkLAotCUlOIFVDSEFSCSBTc2lkTGVuKTsKLQotVk9JRCBCc3NUYWJsZURlbGV0ZUVudHJ5KAotCUlOIE9VVCAgUEJTU19UQUJMRSBwVGFiLAotCUlOICAgICAgUFVDSEFSIHBCc3NpZCwKLQlJTiAgICAgIFVDSEFSIENoYW5uZWwpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIEJBVGFibGVEZWxldGVPUklFbnRyeSgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCUJBX09SSV9FTlRSWQkqcEJBT1JJRW50cnkpOwotCi1WT0lEIEJBVGFibGVEZWxldGVSRUNFbnRyeSgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCUJBX1JFQ19FTlRSWQkqcEJBUkVDRW50cnkpOwotCi1WT0lEIEJBVGFibGVUZWFyT1JJRW50cnkoCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCQlVQ0hBUiBUSUQsCi0JSU4JCVVDSEFSIFdjaWQsCi0JSU4JCUJPT0xFQU4gYkZvcmNlRGVsZXRlLAotCUlOCQlCT09MRUFOIEFMTCk7Ci0KLVZPSUQgQkFUYWJsZVRlYXJSRUNFbnRyeSgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCVVDSEFSIFRJRCwKLQlJTgkJVUNIQVIgV0NJRCwKLQlJTgkJQk9PTEVBTiBBTEwpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1WT0lEICBCc3NFbnRyeVNldCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlPVVQgUEJTU19FTlRSWSBwQnNzLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbiwKLQlJTiBVQ0hBUiBCc3NUeXBlLAotCUlOIFVTSE9SVCBCZWFjb25QZXJpb2QsCi0JSU4gUENGX1BBUk0gQ2ZQYXJtLAotCUlOIFVTSE9SVCBBdGltV2luLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVQ0hBUiBTdXBSYXRlW10sCi0JSU4gVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiBVQ0hBUiBFeHRSYXRlW10sCi0JSU4gVUNIQVIgRXh0UmF0ZUxlbiwKLQlJTiBIVF9DQVBBQklMSVRZX0lFICpwSHRDYXBhYmlsaXR5LAotCUlOIEFERF9IVF9JTkZPX0lFICpwQWRkSHRJbmZvLAkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCUFkZEh0SW5mb0xlbiwKLQlJTiBVQ0hBUgkJCU5ld0V4dENoYW5PZmZzZXQsCi0JSU4gVUNIQVIgQ2hhbm5lbCwKLQlJTiBDSEFSIFJzc2ksCi0JSU4gTEFSR0VfSU5URUdFUiBUaW1lU3RhbXAsCi0JSU4gVUNIQVIgQ2tpcEZsYWcsCi0JSU4gUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JSU4gUFFPU19DQVBBQklMSVRZX1BBUk0gcFFvc0NhcGFiaWxpdHksCi0JSU4gUFFCU1NfTE9BRF9QQVJNIHBRYnNzTG9hZCwKLQlJTiBVU0hPUlQgTGVuZ3RoVklFLAotCUlOIFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMgcFZJRSk7Ci0KLVVMT05HICBCc3NUYWJsZVNldEVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBQQlNTX1RBQkxFIHBUYWIsCi0JSU4gUFVDSEFSIHBCc3NpZCwKLQlJTiBDSEFSIFNzaWRbXSwKLQlJTiBVQ0hBUiBTc2lkTGVuLAotCUlOIFVDSEFSIEJzc1R5cGUsCi0JSU4gVVNIT1JUIEJlYWNvblBlcmlvZCwKLQlJTiBDRl9QQVJNICpDZlBhcm0sCi0JSU4gVVNIT1JUIEF0aW1XaW4sCi0JSU4gVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JSU4gQUREX0hUX0lORk9fSUUgKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotCUlOIFVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuLAotCUlOIFVDSEFSCQkJQWRkSHRJbmZvTGVuLAotCUlOIFVDSEFSCQkJTmV3RXh0Q2hhbk9mZnNldCwKLQlJTiBVQ0hBUiBDaGFubmVsLAotCUlOIENIQVIgUnNzaSwKLQlJTiBMQVJHRV9JTlRFR0VSIFRpbWVTdGFtcCwKLQlJTiBVQ0hBUiBDa2lwRmxhZywKLQlJTiBQRURDQV9QQVJNIHBFZGNhUGFybSwKLQlJTiBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlJTiBQUUJTU19MT0FEX1BBUk0gcFFic3NMb2FkLAotCUlOIFVTSE9SVCBMZW5ndGhWSUUsCi0JSU4gUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcyBwVklFKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBCQVRhYmxlSW5zZXJ0RW50cnkoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVVNIT1JUIEFpZCwKLSAgICBJTiBVU0hPUlQJCVRpbWVPdXRWYWx1ZSwKLQlJTiBVU0hPUlQJCVN0YXJ0aW5nU2VxLAotICAgIElOIFVDSEFSIFRJRCwKLQlJTiBVQ0hBUiBCQVdpblNpemUsCi0JSU4gVUNIQVIgT3JpZ2luYXRvclN0YXR1cywKLSAgICBJTiBCT09MRUFOIElzUmVjaXBpZW50KTsKLQotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgQnNzMjA0MENvZXhpc3RUaW1lT3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLQotVk9JRCAgVHJpRXZlbnRJbml0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVUxPTkcgVHJpRXZlbnRUYWJsZVNldEVudHJ5KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVCBUUklHR0VSX0VWRU5UX1RBQiAqVGFiLAotCUlOIFBVQ0hBUiBwQnNzaWQsCi0JSU4gSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlJTiBVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBVQ0hBUgkJCVJlZ0NsYXNzLAotCUlOIFVDSEFSIENoYW5uZWxObyk7Ci0KLVZPSUQgVHJpRXZlbnRDb3VudGVyTWFpbnRlbmFuY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBCc3NUYWJsZVNzaWRTb3J0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCU9VVCBCU1NfVEFCTEUgKk91dFRhYiwKLQlJTiAgQ0hBUiBTc2lkW10sCi0JSU4gIFVDSEFSIFNzaWRMZW4pOwotCi1WT0lEICBCc3NUYWJsZVNvcnRCeVJzc2koCi0JSU4gT1VUIEJTU19UQUJMRSAqT3V0VGFiKTsKLQotVk9JRCBCc3NDaXBoZXJQYXJzZSgKLQlJTiBPVVQgIFBCU1NfRU5UUlkgIHBCc3MpOwotCi1ORElTX1NUQVRVUyAgTWxtZVF1ZXVlSW5pdCgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7Ci0KLVZPSUQgIE1sbWVRdWV1ZURlc3Ryb3koCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwotCi1CT09MRUFOIE1sbWVFbnF1ZXVlKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVMT05HIE1hY2hpbmUsCi0JSU4gVUxPTkcgTXNnVHlwZSwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gVk9JRCAqTXNnKTsKLQotQk9PTEVBTiBNbG1lRW5xdWV1ZUZvclJlY3YoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gVUxPTkcgV2NpZCwKLQlJTiBVTE9ORyBUaW1lU3RhbXBIaWdoLAotCUlOIFVMT05HIFRpbWVTdGFtcExvdywKLQlJTiBVQ0hBUiBSc3NpMCwKLQlJTiBVQ0hBUiBSc3NpMSwKLQlJTiBVQ0hBUiBSc3NpMiwKLQlJTiBVTE9ORyBNc2dMZW4sCi0JSU4gUFZPSUQgTXNnLAotCUlOIFVDSEFSIFNpZ25hbCk7Ci0KLQotQk9PTEVBTiBNbG1lRGVxdWV1ZSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSwKLQlPVVQgTUxNRV9RVUVVRV9FTEVNICoqRWxlbSk7Ci0KLVZPSUQgICAgTWxtZVJlc3RhcnRTdGF0ZU1hY2hpbmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1CT09MRUFOICBNbG1lUXVldWVFbXB0eSgKLQlJTiBNTE1FX1FVRVVFICpRdWV1ZSk7Ci0KLUJPT0xFQU4gIE1sbWVRdWV1ZUZ1bGwoCi0JSU4gTUxNRV9RVUVVRSAqUXVldWUpOwotCi1CT09MRUFOICBNc2dUeXBlU3Vic3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUEZSQU1FXzgwMl8xMSBwRnJhbWUsCi0JT1VUIElOVCAqTWFjaGluZSwKLQlPVVQgSU5UICpNc2dUeXBlKTsKLQotVk9JRCBTdGF0ZU1hY2hpbmVJbml0KAotCUlOIFNUQVRFX01BQ0hJTkUgKlNtLAotCUlOIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdLAotCUlOIFVMT05HIFN0TnIsCi0JSU4gVUxPTkcgTXNnTnIsCi0JSU4gU1RBVEVfTUFDSElORV9GVU5DIERlZkZ1bmMsCi0JSU4gVUxPTkcgSW5pdFN0YXRlLAotCUlOIFVMT05HIEJhc2UpOwotCi1WT0lEIFN0YXRlTWFjaGluZVNldEFjdGlvbigKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIFVMT05HIFN0LAotCVVMT05HIE1zZywKLQlJTiBTVEFURV9NQUNISU5FX0ZVTkMgRik7Ci0KLVZPSUQgU3RhdGVNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBTVEFURV9NQUNISU5FICpTLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgRHJvcCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEFzc29jU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKTsKLQotVk9JRCBSZWFzc29jVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEFzc29jVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIERpc2Fzc29jVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVZPSUQgTWxtZURpc2Fzc29jUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNbG1lUmVhc3NvY1JlcUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJSZWFzc29jUnNwQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJEaXNhc3NvY0FjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBSZWFzc29jVGltZW91dEFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCAgQ2xzM2VyckFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyKTsKLQotVk9JRCAgSW52YWxpZFN0YXRlV2hlbkFzc29jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEICBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuRGlzYXNzb2NpYXRlKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotCi1WT0lEICBDb21wb3NlUHNQb2xsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCAgQ29tcG9zZU51bGxGcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEICBBc3NvY1Bvc3RQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgcEFkZHIyLAotCUlOICBVU0hPUlQgQ2FwYWJpbGl0eUluZm8sCi0JSU4gIFVTSE9SVCBBaWQsCi0JSU4gIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiAgVUNIQVIgU3VwUmF0ZUxlbiwKLQlJTiAgVUNIQVIgRXh0UmF0ZVtdLAotCUlOICBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUiBIdENhcGFiaWxpdHlMZW4sCi0JSU4gQUREX0hUX0lORk9fSUUJCSpwQWRkSHRJbmZvKTsKLQotVk9JRCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiBQU1RBVEVfTUFDSElORSBzbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIEF1dGhUaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgTWxtZUF1dGhSZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckF1dGhSc3BBdFNlcTRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ2xzMmVyckFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSIHBBZGRyKTsKLQotVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1WT0lEIEF1dGhSc3BTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQU1RBVEVfTUFDSElORSBTbSwKLQlJTiAgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIFBlZXJEZWF1dGhBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGRyODAyMTEsCi0JSU4gIFVTSE9SVCBBbGcsCi0JSU4gIFVTSE9SVCBTZXEsCi0JSU4gIFVTSE9SVCBSZWFzb24sCi0JSU4gIFVTSE9SVCBTdGF0dXMpOwotCi0vLwotLy8gUHJpdmF0ZSByb3V0aW5lcyBpbiBkbHMuYwotLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotdm9pZCBEbHNTdGF0ZU1hY2hpbmVJbml0KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFNUQVRFX01BQ0hJTkUgKlNtLAotICAgIE9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgTWxtZURsc1JlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJEbHNSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUglwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNCSpFbGVtKTsKLQotVk9JRCBQZWVyRGxzUnNwQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7Ci0KLVZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIJcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTQkqRWxlbSk7Ci0KLVZPSUQgUlRNUENoZWNrRExTVGltZU91dCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUJPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKLQlJTiBVTE9ORwkJCUxlbiwKLQlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKTsKLQotSU5UCVJUTVBDaGVja0RMU0ZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBKTsKLQotVk9JRCBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEpOwotCi1ORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcERBKTsKLQotTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcERBKTsKLQotVk9JRCBEbHNUaW1lb3V0QWN0aW9uKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLUJPT0xFQU4gTWxtZURsc1JlcVNhbml0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQUlRfODAyXzExX0RMUyAqcERMUywKLSAgICBPVVQgUFVTSE9SVCBwUmVhc29uKTsKLQotSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBhcmcpOwotCi1NQUNfVEFCTEVfRU5UUlkgKk1hY1RhYmxlSW5zZXJ0RGxzRW50cnkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUglwQWRkciwKLQlJTiAgVUlOVAlEbHNFbnRyeUlkeCk7Ci0KLUJPT0xFQU4gTWFjVGFibGVEZWxldGVEbHNFbnRyeSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgd2NpZCwKLQlJTiBQVUNIQVIgcEFkZHIpOwotCi1NQUNfVEFCTEVfRU5UUlkgKkRsc0VudHJ5VGFibGVMb29rdXAoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSCXBBZGRyLAotCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKLQotTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCXdjaWQsCi0JSU4gUFVDSEFSCXBBZGRyLAotCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KTsKLQotSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0Rsc1RlYXJEb3duRW50cnlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotQk9PTEVBTiBQZWVyRGxzUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwREEsCi0gICAgT1VUIFBVQ0hBUiBwU0EsCi0gICAgT1VUIFVTSE9SVCAqcENhcGFiaWxpdHlJbmZvLAotICAgIE9VVCBVU0hPUlQgKnBEbHNUaW1lb3V0LAotICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAotICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAotICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7Ci0KLUJPT0xFQU4gUGVlckRsc1JzcFNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcERBLAotICAgIE9VVCBQVUNIQVIgcFNBLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVQ0hBUiAqcFJhdGVzTGVuLAotICAgIE9VVCBVQ0hBUiBSYXRlc1tdLAotICAgIE9VVCBVQ0hBUiAqcEh0Q2FwYWJpbGl0eUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSk7Ci0KLUJPT0xFQU4gUGVlckRsc1RlYXJEb3duU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4sCi0gICAgT1VUIFBVQ0hBUiBwREEsCi0gICAgT1VUIFBVQ0hBUiBwU0EsCi0gICAgT1VUIFVTSE9SVCAqcFJlYXNvbik7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1WT0lEIFN5bmNTdGF0ZU1hY2hpbmVJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTbSwKLQlPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pOwotCi1WT0lEIEJlYWNvblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBTY2FuVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TY2FuKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5Kb2luKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5TdGFydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQmVhY29uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEVucXVldWVQcm9iZVJlcXVlc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1CT09MRUFOIFNjYW5SdW5uaW5nKAotCQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVZPSUQgTWxtZUNudGxJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBTVEFURV9NQUNISU5FICpTLAotCU9VVCBTVEFURV9NQUNISU5FX0ZVTkMgVHJhbnNbXSk7Ci0KLVZPSUQgTWxtZUNudGxNYWNoaW5lUGVyZm9ybUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgU1RBVEVfTUFDSElORSAqUywKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsSWRsZVByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bE9pZFNjYW5Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsT2lkU3NpZFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pOwotCi1WT0lEIENudGxPaWRSVEJzc2lkUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7Ci0KLVZPSUQgQ250bE1sbWVSb2FtaW5nUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICogRWxlbSk7Ci0KLVZPSUQgQ250bFdhaXREaXNhc3NvY1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bFdhaXRKb2luUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBDbnRsV2FpdFJlYXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0U3RhcnRQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0QXV0aFByb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgQ250bFdhaXRBdXRoUHJvYzIoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIENudGxXYWl0QXNzb2NQcm9jKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi1WT0lEIENudGxPaWRETFNTZXR1cFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotVk9JRCBMaW5rVXAoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSIEJzc1R5cGUpOwotCi1WT0lEIExpbmtEb3duKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBCT09MRUFOICAgICAgICAgSXNSZXFGcm9tQVApOwotCi1WT0lEIEl0ZXJhdGVPbkJzc1RhYigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7OwotCi1WT0lEIEpvaW5QYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfSk9JTl9SRVFfU1RSVUNUICpKb2luUmVxLAotCUlOICBVTE9ORyBCc3NJZHgpOwotCi1WT0lEIEFzc29jUGFybUZpbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gT1VUIE1MTUVfQVNTT0NfUkVRX1NUUlVDVCAqQXNzb2NSZXEsCi0JSU4gIFBVQ0hBUiBwQWRkciwKLQlJTiAgVVNIT1JUIENhcGFiaWxpdHlJbmZvLAotCUlOICBVTE9ORyBUaW1lb3V0LAotCUlOICBVU0hPUlQgTGlzdGVuSW50dik7Ci0KLVZPSUQgU2NhblBhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgKlNjYW5SZXEsCi0JSU4gIFNUUklORyBTc2lkW10sCi0JSU4gIFVDSEFSIFNzaWRMZW4sCi0JSU4gIFVDSEFSIEJzc1R5cGUsCi0JSU4gIFVDSEFSIFNjYW5UeXBlKTsKLQotVk9JRCBEaXNhc3NvY1Bhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICpEaXNhc3NvY1JlcSwKLQlJTiAgUFVDSEFSIHBBZGRyLAotCUlOICBVU0hPUlQgUmVhc29uKTsKLQotVk9JRCBTdGFydFBhcm1GaWxsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBPVVQgTUxNRV9TVEFSVF9SRVFfU1RSVUNUICpTdGFydFJlcSwKLQlJTiAgQ0hBUiBTc2lkW10sCi0JSU4gIFVDSEFSIFNzaWRMZW4pOwotCi1WT0lEIEF1dGhQYXJtRmlsbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgT1VUIE1MTUVfQVVUSF9SRVFfU1RSVUNUICpBdXRoUmVxLAotCUlOICBQVUNIQVIgcEFkZHIsCi0JSU4gIFVTSE9SVCBBbGcpOwotCi1WT0lEIEVucXVldWVQc1BvbGwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIEVucXVldWVCZWFjb25GcmFtZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZVNjYW5SZXFBY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgTWxtZVN0YXJ0UmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFNjYW5UaW1lb3V0QWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJCZWFjb24oCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlclByb2JlUmVxQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiAgTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBTY2FuTmV4dENoYW5uZWwoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1VTE9ORyBNYWtlSWJzc0JlYWNvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQ0NYQWRqYWNlbnRBUFJlcG9ydCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLUJPT0xFQU4gTWxtZVNjYW5SZXFTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBVQ0hBUiAqQnNzVHlwZSwKLQlPVVQgQ0hBUiBzc2lkW10sCi0JT1VUIFVDSEFSICpTc2lkTGVuLAotCU9VVCBVQ0hBUiAqU2NhblR5cGUpOwotCi1CT09MRUFOIFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JSU4gIFVDSEFSIE1zZ0NoYW5uZWwsCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFBVQ0hBUiBwQnNzaWQsCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqcFNzaWRMZW4sCi0JT1VUIFVDSEFSICpwQnNzVHlwZSwKLQlPVVQgVVNIT1JUICpwQmVhY29uUGVyaW9kLAotCU9VVCBVQ0hBUiAqcENoYW5uZWwsCi0JT1VUIFVDSEFSICpwTmV3Q2hhbm5lbCwKLQlPVVQgTEFSR0VfSU5URUdFUiAqcFRpbWVzdGFtcCwKLQlPVVQgQ0ZfUEFSTSAqcENmUGFybSwKLQlPVVQgVVNIT1JUICpwQXRpbVdpbiwKLQlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0JT1VUIFVDSEFSICpwRXJwLAotCU9VVCBVQ0hBUiAqcER0aW1Db3VudCwKLQlPVVQgVUNIQVIgKnBEdGltUGVyaW9kLAotCU9VVCBVQ0hBUiAqcEJjYXN0RmxhZywKLQlPVVQgVUNIQVIgKnBNZXNzYWdlVG9NZSwKLQlPVVQgVUNIQVIgU3VwUmF0ZVtdLAotCU9VVCBVQ0hBUiAqcFN1cFJhdGVMZW4sCi0JT1VUIFVDSEFSIEV4dFJhdGVbXSwKLQlPVVQgVUNIQVIgKnBFeHRSYXRlTGVuLAotCU9VVAlVQ0hBUiAqcENraXBGbGFnLAotCU9VVAlVQ0hBUiAqcEFpcm9uZXRDZWxsUG93ZXJMaW1pdCwKLQlPVVQgUEVEQ0FfUEFSTSAgICAgICBwRWRjYVBhcm0sCi0JT1VUIFBRQlNTX0xPQURfUEFSTSAgcFFic3NMb2FkLAotCU9VVCBQUU9TX0NBUEFCSUxJVFlfUEFSTSBwUW9zQ2FwYWJpbGl0eSwKLQlPVVQgVUxPTkcgKnBSYWxpbmtJZSwKLQlPVVQgVUNIQVIJCSAqcEh0Q2FwYWJpbGl0eUxlbiwKLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLQlPVVQgVUNIQVIJCSAqcFByZU5IdENhcGFiaWxpdHlMZW4sCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0JT1VUIEhUX0NBUEFCSUxJVFlfSUUgKnBIdENhcGFiaWxpdHksCi0JT1VUIFVDSEFSCQkgKkFkZEh0SW5mb0xlbiwKLQlPVVQgQUREX0hUX0lORk9fSUUgKkFkZEh0SW5mbywKLQlPVVQgVUNIQVIgKk5ld0V4dENoYW5uZWwsCi0JT1VUIFVTSE9SVCAqTGVuZ3RoVklFLAotCU9VVCBQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzIHBWSUUpOwotCi1CT09MRUFOIFBlZXJBZGRCQVJlcUFjdGlvblNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMik7Ci0KLUJPT0xFQU4gUGVlckFkZEJBUnNwQWN0aW9uU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuKTsKLQotQk9PTEVBTiBQZWVyRGVsQkFBY3Rpb25TYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVUNIQVIgV2NpZCwKLSAgICBJTiBWT0lEICpwTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbik7Ci0KLUJPT0xFQU4gTWxtZUFzc29jUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBcEFkZHIsCi0JT1VUIFVTSE9SVCAqQ2FwYWJpbGl0eUluZm8sCi0JT1VUIFVMT05HICpUaW1lb3V0LAotCU9VVCBVU0hPUlQgKkxpc3RlbkludHYpOwotCi1CT09MRUFOIE1sbWVBdXRoUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyLAotCU9VVCBVTE9ORyAqVGltZW91dCwKLQlPVVQgVVNIT1JUICpBbGcpOwotCi1CT09MRUFOIE1sbWVTdGFydFJlcVNhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIENIQVIgU3NpZFtdLAotCU9VVCBVQ0hBUiAqU3NpZGxlbik7Ci0KLUJPT0xFQU4gUGVlckF1dGhTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIsCi0JT1VUIFVTSE9SVCAqQWxnLAotCU9VVCBVU0hPUlQgKlNlcSwKLQlPVVQgVVNIT1JUICpTdGF0dXMsCi0JT1VUIENIQVIgQ2hsZ1RleHRbXSk7Ci0KLUJPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgVVNIT1JUICpwQ2FwYWJpbGl0eUluZm8sCi0JT1VUIFVTSE9SVCAqcFN0YXR1cywKLQlPVVQgVVNIT1JUICpwQWlkLAotCU9VVCBVQ0hBUiBTdXBSYXRlW10sCi0JT1VUIFVDSEFSICpwU3VwUmF0ZUxlbiwKLQlPVVQgVUNIQVIgRXh0UmF0ZVtdLAotCU9VVCBVQ0hBUiAqcEV4dFJhdGVMZW4sCi0gICAgT1VUIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotICAgIE9VVCBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8sCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotICAgIE9VVCBVQ0hBUgkJCSpwSHRDYXBhYmlsaXR5TGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwQWRkSHRJbmZvTGVuLAotICAgIE9VVCBVQ0hBUgkJCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCwKLQlPVVQgUEVEQ0FfUEFSTSBwRWRjYVBhcm0sCi0JT1VUIFVDSEFSICpwQ2tpcEZsYWcpOwotCi1CT09MRUFOIFBlZXJEaXNhc3NvY1Nhbml0eSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVk9JRCAqTXNnLAotCUlOICBVTE9ORyBNc2dMZW4sCi0JT1VUIFBVQ0hBUiBwQWRkcjIsCi0JT1VUIFVTSE9SVCAqUmVhc29uKTsKLQotQk9PTEVBTiBQZWVyV3BhTWVzc2FnZVNhbml0eSgKLSAgICBJTglQUlRNUF9BREFQVEVSCQlwQWQsCi0gICAgSU4JUEVBUE9MX1BBQ0tFVAkJcE1zZywKLSAgICBJTglVTE9ORwkJCQlNc2dMZW4sCi0gICAgSU4JVUNIQVIJCQkJTXNnVHlwZSwKLSAgICBJTglNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi1CT09MRUFOIFBlZXJEZWF1dGhTYW5pdHkoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFZPSUQgKk1zZywKLQlJTiAgVUxPTkcgTXNnTGVuLAotCU9VVCBQVUNIQVIgcEFkZHIyLAotCU9VVCBVU0hPUlQgKlJlYXNvbik7Ci0KLUJPT0xFQU4gUGVlclByb2JlUmVxU2FuaXR5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBWT0lEICpNc2csCi0JSU4gIFVMT05HIE1zZ0xlbiwKLQlPVVQgUFVDSEFSIHBBZGRyMiwKLQlPVVQgQ0hBUiBTc2lkW10sCi0JT1VUIFVDSEFSICpwU3NpZExlbik7Ci0KLUJPT0xFQU4gR2V0VGltQml0KAotCUlOICBDSEFSICpQdHIsCi0JSU4gIFVTSE9SVCBBaWQsCi0JT1VUIFVDSEFSICpUaW1MZW4sCi0JT1VUIFVDSEFSICpCY2FzdEZsYWcsCi0JT1VUIFVDSEFSICpEdGltQ291bnQsCi0JT1VUIFVDSEFSICpEdGltUGVyaW9kLAotCU9VVCBVQ0hBUiAqTWVzc2FnZVRvTWUpOwotCi1VQ0hBUiBDaGFubmVsU2FuaXR5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSIGNoYW5uZWwpOwotCi1ORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgTmV0d29ya1R5cGVJblVzZVNhbml0eSgKLQlJTiBQQlNTX0VOVFJZIHBCc3MpOwotCi0KLUJPT0xFQU4gTWxtZURlbEJBUmVxU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKk1zZywKLSAgICBJTiBVTE9ORyBNc2dMZW4pOwotCi1CT09MRUFOIE1sbWVBZGRCQVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyKTsKLQotVUxPTkcgTWFrZU91dGdvaW5nRnJhbWUoCi0JT1VUIFVDSEFSICpCdWZmZXIsCi0JT1VUIFVMT05HICpMZW5ndGgsIC4uLik7Ci0KLVZPSUQgIExmc3JJbml0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyBTZWVkKTsKLQotVUNIQVIgUmFuZG9tQnl0ZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBUeFJhdGUpOwotCi1WT0lEICBNbG1lUGVyaW9kaWNFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgTGlua0Rvd25FeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgTGlua1VwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIFNUQU1sbWVQZXJpb2RpY0V4ZWMoCi0JUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIE1sbWVBdXRvU2NhbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTWxtZUF1dG9SZWNvbm5lY3RMYXN0U1NJRCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUJPT0xFQU4gTWxtZVZhbGlkYXRlU1NJRCgKLQlJTiBQVUNIQVIgcFNzaWQsCi0JSU4gVUNIQVIgIFNzaWRMZW4pOwotCi1WT0lEIE1sbWVDaGVja0ZvclJvYW1pbmcoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUxPTkcgICAgTm93MzIpOwotCi1CT09MRUFOIE1sbWVDaGVja0ZvckZhc3RSb2FtaW5nKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBNbG1lRHluYW1pY1R4UmF0ZVN3aXRjaGluZygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTWxtZVNldFR4UmF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBSVE1QX1RYX1JBVEVfU1dJVENICXBUeFJhdGUpOwotCi1WT0lEIE1sbWVTZWxlY3RUeFJhdGVUYWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQkJcEVudHJ5LAotCUlOIFBVQ0hBUgkJCQkqcHBUYWJsZSwKLQlJTiBQVUNIQVIJCQkJcFRhYmxlU2l6ZSwKLQlJTiBQVUNIQVIJCQkJcEluaXRUeFJhdGVJZHgpOwotCi1WT0lEIE1sbWVDYWxjdWxhdGVDaGFubmVsUXVhbGl0eSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSwKLQlJTiBVTE9ORyBOb3cpOwotCi1WT0lEIE1sbWVDaGVja1BzbUNoYW5nZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVTE9ORyAgICBOb3czMik7Ci0KLVZPSUQgTWxtZVNldFBzbUJpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgcHNtKTsKLQotVk9JRCBNbG1lU2V0VHhQcmVhbWJsZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVU0hPUlQgVHhQcmVhbWJsZSk7Ci0KLVZPSUQgVXBkYXRlQmFzaWNSYXRlQml0bWFwKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBNbG1lVXBkYXRlVHhSYXRlcygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJYkxpbmtVcCwKLQlJTglVQ0hBUgkJCWFwaWR4KTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRCBNbG1lVXBkYXRlSHRUeFJhdGVzKAotCUlOIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgICAgUlRNUENoZWNrUmF0ZXMoCi0JSU4gICAgICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE9VVCAgVUNIQVIgICAgICAgICAgIFN1cFJhdGVbXSwKLQlJTiBPVVQgIFVDSEFSICAgICAgICAgICAqU3VwUmF0ZUxlbik7Ci0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLUJPT0xFQU4gUlRNUENoZWNrQ2hhbm5lbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUgkJQ2VudHJhbENoYW5uZWwsCi0JSU4gVUNIQVIJCUNoYW5uZWwpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1CT09MRUFOCQlSVE1QQ2hlY2tIdCgKLQlJTgkJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCVdjaWQsCi0JSU4gT1VUCUhUX0NBUEFCSUxJVFlfSUUJCQkqcEh0Q2FwYWJpbGl0eSwKLQlJTiBPVVQJQUREX0hUX0lORk9fSUUJCQkqcEFkZEh0SW5mbyk7Ci0KLVZPSUQgU3RhUXVpY2tSZXNwb25lRm9yUmF0ZVVwRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEFzaWNCYnBUdW5pbmcxKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBBc2ljQmJwVHVuaW5nMigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgUlRNUFVwZGF0ZU1sbWVSYXRlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotQ0hBUiBSVE1QTWF4UnNzaSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBDSEFSCQkJCVJzc2kwLAotCUlOIENIQVIJCQkJUnNzaTEsCi0JSU4gQ0hBUgkJCQlSc3NpMik7Ci0KLSNpZmRlZiBSVDMweHgKLVZPSUQgQXNpY1NldFJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFVDSEFSCQkJQW50KTsKLQotVk9JRCBSVE1QRmlsdGVyQ2FsaWJyYXRpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi0jaWZkZWYgUlRNUF9FRlVTRV9TVVBQT1JUCi0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2U8LS0KLUlOVCBzZXRfZUZ1c2VHZXRGcmVlQmxvY2tDb3VudF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgc2V0X2VGdXNlZHVtcF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotVk9JRCBlRnVzZVBoeXNpY2FsUmVhZFJlZ2lzdGVycygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQgT2Zmc2V0LAotCUlOCVVTSE9SVCBMZW5ndGgsCi0JT1VUCVVTSE9SVCogcERhdGEpOwotCi1pbnQgUnRtcEVmdXNlU3VwcG9ydENoZWNrKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLQotSU5UIHNldF9lRnVzZUJ1ZmZlck1vZGVXcml0ZUJhY2tfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIGVGdXNlTG9hZEVFUFJPTSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLUlOVCBlRnVzZVdyaXRlRWVlcHByb21CdWYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1WT0lEIGVGdXNlR2V0RnJlZUJsb2NrQ291bnQoSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JUFVJTlQgRWZ1c2VGcmVlQmxvY2spOwotCi1JTlQgZUZ1c2VfaW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU5UU1RBVFVTIGVGdXNlUmVhZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVU0hPUlQJCQlPZmZzZXQsCi0JT1VUCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCUxlbmd0aCk7Ci0KLU5UU1RBVFVTIGVGdXNlV3JpdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVVNIT1JUCQkJT2Zmc2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVTSE9SVAkJCWxlbmd0aCk7Ci0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2UtLT4KLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLQotLy8gYWRkIGJ5IGpvaG5saSwgUkYgcG93ZXIgc2VxdWVuY2Ugc2V0dXAKLVZPSUQgUlQzMHh4TG9hZFJGTm9ybWFsTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVDMweHhMb2FkUkZTbGVlcE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzMHh4UmV2ZXJzZVJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotLy8gZW5kIGpvaG5saQotCi0KLSNpZmRlZiBSVDMwOTAKLVZPSUQgTklDSW5pdFJUMzA5MFJGUmVnaXN0ZXJzKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkKTsKLSNlbmRpZiAvLyBSVDMwOTAgLy8KLQotVk9JRCBSVDMweHhIYWx0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVDMweHhTZXRSeEFudCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVQ0hBUgkJCUFudCk7Ci0jZW5kaWYgLy8gUlQzMHh4IC8vCi0jaWZkZWYgUlQzM3h4Ci1WT0lEIFJUMzN4eExvYWRSRk5vcm1hbE1vZGVTZXR1cCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzM3h4TG9hZFJGU2xlZXBNb2RlU2V0dXAoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUMzN4eFJldmVyc2VSRlNsZWVwTW9kZVNldHVwKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotI2lmZGVmIFJUMzM3MAotVk9JRCBOSUNJbml0UlQzMzcwUkZSZWdpc3RlcnMoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIFJUMzA3MCAvLwotCi0jaWZkZWYgUlQzMzkwCi1WT0lEIE5JQ0luaXRSVDMzOTBSRlJlZ2lzdGVycygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0KLVZPSUQgUlQzM3h4SGFsdEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLVZPSUQgUlQzM3h4U2V0UnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlBbnQpOwotCi0jZW5kaWYgLy8gUlQzM3h4IC8vCi0KLQotCi1WT0lEIEFzaWNFdmFsdWF0ZVJ4QW50KAotCUlOIFBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIEFQU0RQZXJpb2RpY0V4ZWMoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKTsKLQotQk9PTEVBTiBSVE1QQ2hlY2tFbnRyeUVuYWJsZUF1dG9SYXRlU3dpdGNoKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKLQotVUNIQVIgUlRNUFN0YUZpeGVkVHhNb2RlKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKLQotVk9JRCBSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKAotCQlVQ0hBUgkJCQlmaXhlZF90eF9tb2RlLAotCQlQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSk7Ci0KLUJPT0xFQU4gUlRNUEF1dG9SYXRlU3dpdGNoQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQpOwotCi1ORElTX1NUQVRVUyBNbG1lSW5pdCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgTWxtZUhhbmRsZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIE1sbWVIYWx0KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotVk9JRCBNbG1lUmVzZXRSYWxpbmtDb3VudGVycygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVZPSUQgQnVpbGRDaGFubmVsTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVVDSEFSIEZpcnN0Q2hhbm5lbCgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCk7Ci0KLVVDSEFSIE5leHRDaGFubmVsKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVQ0hBUiBjaGFubmVsKTsKLQotVk9JRCBDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSICAgICAgICAgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKLQotLy8KLS8vIFByb3RvdHlwZXMgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBydG1wX3RraXAuYwotLy8KLVZPSUQgICAgUlRNUEluaXRUa2lwRW5naW5lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcFRLZXksCi0JSU4gIFVDSEFSICAgICAgICAgICBLZXlJZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBUQSwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBNSUNLZXksCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwVFNDLAotCU9VVCBQVUxPTkcgICAgICAgICAgcElWMTYsCi0JT1VUIFBVTE9ORyAgICAgICAgICBwSVYzMik7Ci0KLVZPSUQgICAgUlRNUEluaXRNSUNFbmdpbmUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5LAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBVQ0hBUiAgICAgICAgICAgVXNlclByaW9yaXR5LAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSk7Ci0KLUJPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU3JjLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNBLAotCUlOICBQVUNIQVIgICAgICAgICAgcE1JQ0tleSwKLQlJTglVQ0hBUgkJCVVzZXJQcmlvcml0eSwKLQlJTiAgVUlOVCAgICAgICAgICAgIExlbik7Ci0KLVZPSUQgICAgUlRNUENhbGN1bGF0ZU1JQ1ZhbHVlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQTkRJU19QQUNLRVQgICAgcFBhY2tldCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBFbmNhcCwKLQlJTiAgUENJUEhFUl9LRVkgICAgIHBLZXksCi0JSU4JVUNIQVIJCQlhcGlkeCk7Ci0KLUJPT0xFQU4gUlRNUFRraXBDb21wYXJlTUlDVmFsdWVXaXRoTExDKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcExMQywKLQlJTiAgUFVDSEFSICAgICAgICAgIHBTcmMsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwREEsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwU0EsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwTUlDS2V5LAotCUlOICBVSU5UICAgICAgICAgICAgTGVuKTsKLQotVk9JRCAgICBSVE1QVGtpcEFwcGVuZEJ5dGUoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCwKLQlJTiAgVUNIQVIgICAgICAgICAgIHVDaGFyKTsKLQotVk9JRCAgICBSVE1QVGtpcEFwcGVuZCgKLQlJTiAgUFRLSVBfS0VZX0lORk8gIHBUa2lwLAotCUlOICBQVUNIQVIgICAgICAgICAgcFNyYywKLQlJTiAgVUlOVCAgICAgICAgICAgIG5CeXRlcyk7Ci0KLVZPSUQgICAgUlRNUFRraXBHZXRNSUMoCi0JSU4gIFBUS0lQX0tFWV9JTkZPICBwVGtpcCk7Ci0KLUJPT0xFQU4gUlRNUFNvZnREZWNyeXB0VEtJUCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gVUNIQVIgICAgVXNlclByaW9yaXR5LAotCUlOIFBDSVBIRVJfS0VZCXBXcGFLZXkpOwotCi1CT09MRUFOIFJUTVBTb2Z0RGVjcnlwdEFFUygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIJcERhdGEsCi0JSU4gVUxPTkcJRGF0YUJ5dGVDbnQsCi0JSU4gUENJUEhFUl9LRVkJcFdwYUtleSk7Ci0KLQotCi0vLwotLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMKLS8vCi1JTlQgUlRfQ2ZnU2V0Q291bnRyeVJlZ2lvbigKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnLAotCUlOIElOVAkJCQliYW5kKTsKLQotSU5UIFJUX0NmZ1NldFdpcmVsZXNzTW9kZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFJUX0NmZ1NldFNob3J0U2xvdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVJUX0NmZ1NldFdlcEtleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJa2V5U3RyaW5nLAotCUlOCUNJUEhFUl9LRVkJCSpwU2hhcmVkS2V5LAotCUlOCUlOVAkJCQlrZXlJZHgpOwotCi1JTlQgUlRfQ2ZnU2V0V1BBUFNLS2V5KAotCUlOIFJUTVBfQURBUFRFUgkqcEFkLAotCUlOIFBTVFJJTkcJCWtleVN0cmluZywKLQlJTiBVQ0hBUgkJKnBIYXNoU3RyLAotCUlOIElOVAkJCWhhc2hTdHJMZW4sCi0JT1VUIFBVQ0hBUgkJcFBNS0J1Zik7Ci0KLQotCi0vLwotLy8gUHJvdG90eXBlcyBvZiBmdW5jdGlvbiBkZWZpbml0aW9uIGluIGNtbV9pbmZvLmMKLS8vCi1ORElTX1NUQVRVUyBSVE1QV1BBUmVtb3ZlS2V5UHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFZPSUQgICAgICAgICAgIHBCdWYpOwotCi1WT0lEICAgIFJUTVBXUEFSZW1vdmVBbGxLZXlzKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotQk9PTEVBTiBSVE1QQ2hlY2tTdHJQcmludEFibGUoCi0gICAgSU4gIENIQVIgKnBJblB1dFN0ciwKLSAgICBJTiAgVUNIQVIgc3RyTGVuKTsKLQotVk9JRCAgICBSVE1QU2V0UGh5TW9kZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgVUxPTkcgcGh5bW9kZSk7Ci0KLVZPSUQJUlRNUFVwZGF0ZUhUSUUoCi0JSU4JUlRfSFRfQ0FQQUJJTElUWQkqcFJ0SHQsCi0JSU4JCVVDSEFSCQkJCSpwTWNzU2V0LAotCU9VVAkJSFRfQ0FQQUJJTElUWV9JRSAqcEh0Q2FwYWJpbGl0eSwKLQlPVVQJCUFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbyk7Ci0KLVZPSUQJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUJzc0lkeCwKLQlJTglVQ0hBUgkJCUtleUlkeCwKLQlJTglVQ0hBUgkJCUNpcGhlckFsZywKLQlJTglNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSk7Ci0KLVBTVFJJTkcgR2V0RW5jcnlwdFR5cGUoCi0JQ0hBUiBlbmMpOwotCi1QU1RSSU5HIEdldEF1dGhNb2RlKAotCUNIQVIgYXV0aCk7Ci0KLQotVk9JRCBSVE1QSW5kaWNhdGVXUEEyU3RhdHVzKAotCUlOICBQUlRNUF9BREFQVEVSICBwQWRhcHRlcik7Ci0KLVZPSUQJUlRNUE9QTW9kZVN3aXRjaGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotVk9JRAlSVE1QU2V0SFQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JT0lEX1NFVF9IVF9QSFlNT0RFICpwSFRQaHlNb2RlKTsKLQotVk9JRAlSVE1QU2V0SW5kaXZpZHVhbEhUKAotCUlOCVBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTglVQ0hBUgkJCQlhcGlkeCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLVZPSUQgUlRNUFNlbmRXaXJlbGVzc0V2ZW50KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJCUV2ZW50X2ZsYWcsCi0JSU4JUFVDSEFSCQkJcEFkZHIsCi0JSU4gIFVDSEFSCQkJQnNzSWR4LAotCUlOCUNIQVIJCQlSc3NpKTsKLQotVk9JRAlOSUNVcGRhdGVDbnRsQ291bnRlcnMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUEhFQURFUl84MDJfMTEJcEhlYWRlciwKLQlJTiAgICBVQ0hBUgkJCVN1YlR5cGUsCi0JSU4JUFJYV0lfU1RSVUMJcFJ4V0kpOwotCi1WT0lEICAgIERCR1BSSU5UX1RYX1JJTkcoCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIFVDSEFSICAgICAgICAgIFF1ZUlkeCk7Ci0KLVZPSUQgREJHUFJJTlRfUlhfUklORygKLQlJTiBQUlRNUF9BREFQVEVSICBwQWQpOwotCi1DSEFSICAgIENvbnZlcnRUb1Jzc2koCi0JSU4gUFJUTVBfQURBUFRFUiAgcEFkLAotCUlOIENIQVIJCQkJUnNzaSwKLQlJTiBVQ0hBUiAgICBSc3NpTnVtYmVyKTsKLQotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotVk9JRCBCdWlsZEVmZmVjdGVkQ2hhbm5lbExpc3QoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotCi1WT0lEIEFQQXNpY0V2YWx1YXRlUnhBbnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpOwotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1WT0lECUFQQXNpY0FudGVubmFBdmcoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVUNIQVIJICAgICAgICAgICAgICBBbnRTZWxlY3QsCi0JSU4JU0hPUlQJICAgICAgICAgICAgICAqUnNzaUF2Zyk7Ci0jZW5kaWYgLy8gQU5UX0RJVkVSU0lUWV9TVVBQT1JUIC8vCi0KLVZPSUQgQVBBc2ljUnhBbnRFdmFsVGltZW91dCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlGdW5jdGlvbiBwcm90b3R5cGUgaW4gY21tX3dwYS5jCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1WT0lECVJUTVBUb1dpcmVsZXNzU3RhKAotICAgIElOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0gICAgSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotICAgIElOICBQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQJCQlIZHJMZW4sCi0gICAgSU4gIFBVQ0hBUgkJCXBEYXRhLAotICAgIElOICBVSU5UCQkJRGF0YUxlbiwKLSAgICBJTglCT09MRUFOCQkJCWJDbGVhckZyYW1lKTsKLQotVk9JRCBXcGFEZXJpdmVQVEsoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFVDSEFSICAgKlBNSywKLQlJTiAgVUNIQVIgICAqQU5vbmNlLAotCUlOICBVQ0hBUiAgICpBQSwKLQlJTiAgVUNIQVIgICAqU05vbmNlLAotCUlOICBVQ0hBUiAgICpTQSwKLQlPVVQgVUNIQVIgICAqb3V0cHV0LAotCUlOICBVSU5UICAgIGxlbik7Ci0KLVZPSUQgICAgR2VuUmFuZG9tKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJKm1hY0FkZHIsCi0JT1VUCVVDSEFSCQkJKnJhbmRvbSk7Ci0KLUJPT0xFQU4gUlRNUENoZWNrV1BBZnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUE1BQ19UQUJMRV9FTlRSWQlwRW50cnksCi0JSU4gUFVDSEFSCQkJcERhdGEsCi0JSU4gVUxPTkcJCQlEYXRhQnl0ZUNvdW50LAotCUlOIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi1WT0lEIEFFU19HVEtfS0VZX1VOV1JBUCgKLQlJTiAgVUNIQVIgICAqa2V5LAotCU9VVCBVQ0hBUiAgICpwbGFpbnRleHQsCi0JSU4JVUlOVDMyCWNfbGVuLAotCUlOICBVQ0hBUiAgICpjaXBoZXJ0ZXh0KTsKLQotQk9PTEVBTiBSVE1QUGFyc2VFYXBvbEtleURhdGEoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBVQ0hBUiAgICAgICAgICBwS2V5RGF0YSwKLQlJTiAgVUNIQVIgICAgICAgICAgIEtleURhdGFMZW4sCi0JSU4JVUNIQVIJCQlHcm91cEtleUluZGV4LAotCUlOCVVDSEFSCQkJTXNnVHlwZSwKLQlJTglCT09MRUFOCQkJYldQQTIsCi0JSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKLQotVk9JRAlDb25zdHJ1Y3RFYXBvbE1zZygKLQlJTglQTUFDX1RBQkxFX0VOVFJZCXBFbnRyeSwKLSAgICBJTglVQ0hBUgkJCQlHcm91cEtleVdlcFN0YXR1cywKLSAgICBJTglVQ0hBUgkJCQlNc2dUeXBlLAotICAgIElOCVVDSEFSCQkJCURlZmF1bHRLZXlJZHgsCi0JSU4JVUNIQVIJCQkJKktleU5vbmNlLAotCUlOCVVDSEFSCQkJCSpUeFJTQywKLQlJTglVQ0hBUgkJCQkqR1RLLAotCUlOCVVDSEFSCQkJCSpSU05JRSwKLQlJTglVQ0hBUgkJCQlSU05JRV9MZW4sCi0gICAgT1VUIFBFQVBPTF9QQUNLRVQgICAgICAgcE1zZyk7Ci0KLU5ESVNfU1RBVFVTCVJUTVBTb2Z0RGVjcnlwdEJyb2FkQ2FzdERhdGEoCi0JSU4JUFJUTVBfQURBUFRFUgkJCQkJcEFkLAotCUlOCVJYX0JMSwkJCQkJCQkqcFJ4QmxrLAotCUlOICBORElTXzgwMl8xMV9FTkNSWVBUSU9OX1NUQVRVUwlHcm91cENpcGhlciwKLQlJTiAgUENJUEhFUl9LRVkJCQkJCQlwU2hhcmRfa2V5KTsKLQotVk9JRCBSVE1QTWFrZVJTTklFKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVSU5UICAgICAgICAgICAgQXV0aE1vZGUsCi0JSU4gIFVJTlQgICAgICAgICAgICBXZXBTdGF0dXMsCi0JSU4JVUNIQVIJCQlhcGlkeCk7Ci0KLS8vCi0vLyBmdW5jdGlvbiBwcm90b3R5cGUgaW4gYXBfd3BhLmMKLS8vCi1WT0lEIFJUTVBHZXRUeFRzY0Zyb21Bc2ljKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCVVDSEFSCQkJYXBpZHgsCi0JT1VUCVBVQ0hBUgkJCXBUeFRzYyk7Ci0KLVZPSUQgQVBJbnN0YWxsUGFpcndpc2VLZXkoCi0JUFJUTVBfQURBUFRFUgkJcEFkLAotCVBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5KTsKLQotTUFDX1RBQkxFX0VOVFJZICpQQUNJbnF1aXJ5KAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOICBVTE9ORyAgICAgICAgICAgV2NpZCk7Ci0KLVVJTlQJQVBWYWxpZGF0ZVJTTklFKAotCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCUlOIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotCUlOIFBVQ0hBUgkJCXBSc25JZSwKLQlJTiBVQ0hBUgkJCXJzbmllX2xlbik7Ci0KLVZPSUQgSGFuZGxlQ291bnRlck1lYXN1cmUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5KTsKLQotVk9JRCBXUEFTdGFydDRXYXlIUygKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgTUFDX1RBQkxFX0VOVFJZICpwRW50cnksCi0JSU4JVUxPTkcJCQlUaW1lSW50ZXJ2YWwpOwotCi1WT0lEIFdQQVN0YXJ0MldheUdyb3VwSFMoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIE1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5KTsKLQotVk9JRCBQZWVyUGFpck1zZzFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlclBhaXJNc2cyQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1BQ19UQUJMRV9FTlRSWSAgKnBFbnRyeSwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi1WT0lEIFBlZXJQYWlyTXNnM0FjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKTsKLQotVk9JRCBQZWVyUGFpck1zZzRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUFDX1RBQkxFX0VOVFJZICAqcEVudHJ5LAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSk7Ci0KLVZPSUQgUGVlckdyb3VwTXNnMUFjdGlvbigKLQlJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5LAotICAgIElOICBNTE1FX1FVRVVFX0VMRU0gICpFbGVtKTsKLQotVk9JRCBQZWVyR3JvdXBNc2cyQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCi0JSU4gIFZPSUQgICAgICAgICAgICAgKk1zZywKLQlJTiAgVUlOVCAgICAgICAgICAgICBNc2dMZW4pOwotCi1WT0lEIENNVGltZXJFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgV1BBUmV0cnlFeGVjKAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMyk7Ci0KLVZPSUQgRW5xdWV1ZVN0YXJ0Rm9yUFNLRXhlYygKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0gICAgSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotICAgIElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEIFJUTVBIYW5kbGVTVEFLZXkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiAgICBwQWRhcHRlciwKLSAgICBJTiBNQUNfVEFCTEVfRU5UUlkgICpwRW50cnksCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICAqRWxlbSk7Ci0KLVZPSUQgUGFpckRpc0Fzc29jQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCi0JSU4gIFVTSE9SVCAgICAgICAgICAgUmVhc29uKTsKLQotVk9JRCBNbG1lRGVBdXRoQWN0aW9uKAotCUlOICBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnksCi0JSU4gIFVTSE9SVCAgICAgICAgICAgUmVhc29uKTsKLQotVk9JRCBHUkVLRVlQZXJpb2RpY0V4ZWMoCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMxLAotCUlOICBQVk9JRCAgIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiAgUFZPSUQgICBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gIFBWT0lEICAgU3lzdGVtU3BlY2lmaWMzKTsKLQotVk9JRCBXcGFEZXJpdmVHVEsoCi0JSU4gIFVDSEFSICAgKlBNSywKLQlJTiAgVUNIQVIgICAqR05vbmNlLAotCUlOICBVQ0hBUiAgICpBQSwKLQlPVVQgVUNIQVIgICAqb3V0cHV0LAotCUlOICBVSU5UICAgIGxlbik7Ci0KLVZPSUQgQUVTX0dUS19LRVlfV1JBUCgKLQlJTiBVQ0hBUiAqa2V5LAotCUlOIFVDSEFSICpwbGFpbnRleHQsCi0JSU4gVUlOVDMyIHBfbGVuLAotCU9VVCBVQ0hBUiAqY2lwaGVydGV4dCk7Ci0KLVZPSUQgQUVTXzEyOF9DTUFDKAotCUlOCVBVQ0hBUglrZXksCi0JSU4JUFVDSEFSCWlucHV0LAotCUlOCUlOVAkJbGVuLAotCU9VVAlQVUNIQVIJbWFjKTsKLQotVk9JRCAgICBXcGFTZW5kKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBVQ0hBUiAgICAgICAgICBwUGFja2V0LAotICAgIElOICBVTE9ORyAgICAgICAgICAgTGVuKTsKLQotVk9JRCBSVE1QQWRkUE1LSURDYWNoZSgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCUlOVAkJCQkJCWFwaWR4LAotCUlOCVBVQ0hBUgkJCQlwQWRkciwKLQlJTglVQ0hBUgkJCQkJKlBNS0lELAotCUlOCVVDSEFSCQkJCQkqUE1LKTsKLQotSU5UIFJUTVBTZWFyY2hQTUtJRENhY2hlKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOCUlOVAkJCQlhcGlkeCwKLQlJTglQVUNIQVIJCXBBZGRyKTsKLQotVk9JRCBSVE1QRGVsZXRlUE1LSURDYWNoZSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTglJTlQJCQkJYXBpZHgsCi0JSU4gIElOVAkJCQlpZHgpOwotCi1WT0lEIFJUTVBNYWludGFpblBNS0lEQ2FjaGUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lECVJUTVBTZW5kVHJpZ2dlckZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBWT0lECQkJcEJ1ZmZlciwKLQlJTglVTE9ORwkJCUxlbmd0aCwKLQlJTiAgVUNIQVIgICAgICAgICAgIFR4UmF0ZSwKLQlJTglCT09MRUFOCQkJYlFvc051bGwpOwotCi0vL3R5cGVkZWYgdm9pZCAoKlRJTUVSX0ZVTkNUSU9OKSh1bnNpZ25lZCBsb25nKTsKLQotCi0vKiB0aW1lb3V0IC0tIG1zICovCi1WT0lEIFJUTVBfU2V0UGVyaW9kaWNUaW1lcigKLQlJTglORElTX01JTklQT1JUX1RJTUVSICpwVGltZXIsCi0JSU4JdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLQotVk9JRCBSVE1QX09TX0luaXRfVGltZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUiAqcFRpbWVyLAotCUlOCVRJTUVSX0ZVTkNUSU9OIGZ1bmN0aW9uLAotCUlOCVBWT0lEIGRhdGEpOwotCi1WT0lEIFJUTVBfT1NfQWRkX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwotCi1WT0lEIFJUTVBfT1NfTW9kX1RpbWVyKAotCUlOCU5ESVNfTUlOSVBPUlRfVElNRVIJKnBUaW1lciwKLQlJTgl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwotCi0KLVZPSUQgUlRNUF9PU19EZWxfVGltZXIoCi0JSU4JTkRJU19NSU5JUE9SVF9USU1FUgkqcFRpbWVyLAotCU9VVAlCT09MRUFOCQkJCSAqcENhbmNlbGxlZCk7Ci0KLQotVk9JRCBSVE1QX09TX1JlbGVhc2VfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVBRVUVVRV9FTlRSWSAgcEVudHJ5KTsKLQotVk9JRCBSVE1QdXNlY0RlbGF5KAotCUlOCVVMT05HCXVzZWMpOwotCi1ORElTX1NUQVRVUyBvc19hbGxvY19tZW0oCi0JSU4JUlRNUF9BREFQVEVSICpwQWQsCi0JT1VUCVVDSEFSICoqbWVtLAotCUlOCVVMT05HICBzaXplKTsKLQotTkRJU19TVEFUVVMgb3NfZnJlZV9tZW0oCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JUFZPSUQgbWVtKTsKLQotCi12b2lkIFJUTVBfQWxsb2NhdGVTaGFyZWRNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotVk9JRCBSVE1QRnJlZVR4UnhSaW5nTWVtb3J5KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkKTsKLQotTkRJU19TVEFUVVMgQWRhcHRlckJsb2NrQWxsb2NhdGVNZW1vcnkoCi0JSU4gUFZPSUQJaGFuZGxlLAotCU9VVAlQVk9JRAkqcHBBZCk7Ci0KLXZvaWQgUlRNUF9BbGxvY2F0ZVR4RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVSU5UCUluZGV4LAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzLAotCU9VVAlQTkRJU19QSFlTSUNBTF9BRERSRVNTIFBoeXNpY2FsQWRkcmVzcyk7Ci0KLXZvaWQgUlRNUF9BbGxvY2F0ZUZpcnN0VHhCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUlOVAlJbmRleCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwotCi12b2lkIFJUTVBfRnJlZUZpcnN0VHhCdWZmZXIoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCUlOCVBWT0lECVZpcnR1YWxBZGRyZXNzLAotCUlOCU5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwotCi12b2lkIFJUTVBfQWxsb2NhdGVNZ210RGVzY01lbW9yeSgKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwotCi12b2lkIFJUTVBfQWxsb2NhdGVSeERlc2NNZW1vcnkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JVUxPTkcJTGVuZ3RoLAotCUlOCUJPT0xFQU4JQ2FjaGVkLAotCU9VVAlQVk9JRAkqVmlydHVhbEFkZHJlc3MsCi0JT1VUCVBORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotdm9pZCBSVE1QX0ZyZWVEZXNjTWVtb3J5KAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglQVk9JRAlWaXJ0dWFsQWRkcmVzcywKLQlJTglORElTX1BIWVNJQ0FMX0FERFJFU1MgUGh5c2ljYWxBZGRyZXNzKTsKLQotUE5ESVNfUEFDS0VUIFJ0bXBPU05ldFBrdEFsbG9jKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIGludCBzaXplKTsKLQotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVSeFBhY2tldEJ1ZmZlcigKLQlJTglQUlRNUF9BREFQVEVSIHBBZCwKLQlJTglVTE9ORwlMZW5ndGgsCi0JSU4JQk9PTEVBTglDYWNoZWQsCi0JT1VUCVBWT0lECSpWaXJ0dWFsQWRkcmVzcywKLQlPVVQJUE5ESVNfUEhZU0lDQUxfQUREUkVTUyBQaHlzaWNhbEFkZHJlc3MpOwotCi1QTkRJU19QQUNLRVQgUlRNUF9BbGxvY2F0ZVR4UGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCwKLQlJTglCT09MRUFOCUNhY2hlZCwKLQlPVVQJUFZPSUQJKlZpcnR1YWxBZGRyZXNzKTsKLQotUE5ESVNfUEFDS0VUIFJUTVBfQWxsb2NhdGVGcmFnUGFja2V0QnVmZmVyKAotCUlOCVBSVE1QX0FEQVBURVIgcEFkLAotCUlOCVVMT05HCUxlbmd0aCk7Ci0KLXZvaWQgUlRNUF9RdWVyeVBhY2tldEluZm8oCi0JSU4gIFBORElTX1BBQ0tFVCBwUGFja2V0LAotCU9VVCBQQUNLRVRfSU5GTyAgKnBQYWNrZXRJbmZvLAotCU9VVCBQVUNIQVIJCSAqcFNyY0J1ZlZBLAotCU9VVAlVSU5UCQkgKnBTcmNCdWZMZW4pOwotCi12b2lkIFJUTVBfUXVlcnlOZXh0UGFja2V0SW5mbygKLQlJTiAgUE5ESVNfUEFDS0VUICpwcFBhY2tldCwKLQlPVVQgUEFDS0VUX0lORk8gICpwUGFja2V0SW5mbywKLQlPVVQgUFVDSEFSCQkgKnBTcmNCdWZWQSwKLQlPVVQJVUlOVAkJICpwU3JjQnVmTGVuKTsKLQotCi1CT09MRUFOIFJUTVBfRmlsbFR4QmxrSW5mbygKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsgKnBUeEJsayk7Ci0KLQotUFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVAotcnRfZ2V0X3NnX2xpc3RfZnJvbV9wYWNrZXQoUE5ESVNfUEFDS0VUIHBQYWNrZXQsIFJUTVBfU0NBVFRFUl9HQVRIRVJfTElTVCAqc2cpOwotCi0KLSB2b2lkIGFubm91bmNlXzgwMl8zX3BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Ci0KLQotVUlOVCBCQV9SZW9yZGVyX0FNU0RVX0Fubm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCk7Ci0KLQotVUlOVCBIYW5kbGVfQU1TRFVfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUsCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLXZvaWQgY29udmVydF84MDJfMTFfdG9fODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXA4MDIzaGRyLAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUsCi0JSU4gIFVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLVBORVRfREVWIGdldF9uZXRkZXZfZnJvbV9ic3NpZCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1QTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0gICAgSU4gIFVJTlQgICAgICAgICAgICBIZHJMZW4sCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotCi1QTkRJU19QQUNLRVQgZHVwbGljYXRlX3BrdF93aXRoX1RLSVBfTUlDKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwT2xkUGt0KTsKLQotUE5ESVNfUEFDS0VUIGR1cGxpY2F0ZV9wa3Rfd2l0aF9WTEFOKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBIZWFkZXI4MDJfMywKLSAgICBJTiAgVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlJTglQVUNIQVIJCQlwRGF0YSwKLQlJTglVTE9ORwkJCURhdGFTaXplLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotCi0KLVVDSEFSIFZMQU5fODAyM19IZWFkZXJfQ29weSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlwSGVhZGVyODAyXzMsCi0JSU4JVUlOVCAgICAgICAgICAgIEhkckxlbiwKLQlPVVQgUFVDSEFSCQkJcERhdGEsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLXZvaWQgYmFfZmx1c2hfcmVvcmRlcmluZ190aW1lb3V0X21wZHVzKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFBCQV9SRUNfRU5UUlkJcEJBRW50cnksCi0JSU4gVUxPTkcJCQlOb3czMik7Ci0KLQotVk9JRCBCQU9yaVNlc3Npb25TZXRVcCgKLQkJCUlOIFBSVE1QX0FEQVBURVIgICAgcEFkLAotCQkJSU4gTUFDX1RBQkxFX0VOVFJZCSpwRW50cnksCi0JCQlJTiBVQ0hBUgkJCVRJRCwKLQkJCUlOIFVTSE9SVAkJCVRpbWVPdXQsCi0JCQlJTiBVTE9ORwkJCURlbGF5VGltZSwKLQkJCUlOIEJPT0xFQU4JCWlzRm9yY2VkKTsKLQotVk9JRCBCQVNlc3Npb25UZWFyRG93bkFMTCgKLQlJTiBPVVQJUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4JCVVDSEFSIFdjaWQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1CT09MRUFOIE9TX05lZWRfQ2xvbmVfUGFja2V0KHZvaWQpOwotCi0KLVZPSUQgYnVpbGRfdHhfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUglwRnJhbWUsCi0JSU4JVUxPTkcJRnJhbWVMZW4pOwotCi0KLVZPSUQgQkFPcmlTZXNzaW9uVGVhckRvd24oCi0JSU4gT1VUCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCQlVQ0hBUgkJCVdjaWQsCi0JSU4JCVVDSEFSCQkJVElELAotCUlOCQlCT09MRUFOCQkJYlBhc3NpdmUsCi0JSU4JCUJPT0xFQU4JCQliRm9yY2VTZW5kKTsKLQotVk9JRCBCQVJlY1Nlc3Npb25UZWFyRG93bigKLQlJTiBPVVQJUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JCVVDSEFSCQkJV2NpZCwKLQlJTgkJVUNIQVIJCQlUSUQsCi0JSU4JCUJPT0xFQU4JCQliUGFzc2l2ZSk7Ci0KLUJPT0xFQU4gYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9pbml0KFBSVE1QX0FEQVBURVIgcEFkLCBpbnQgbnVtKTsKLXZvaWQgYmFfcmVvcmRlcmluZ19yZXNvdXJjZV9yZWxlYXNlKFBSVE1QX0FEQVBURVIgcEFkKTsKLQotCi0KLSNpZmRlZiBOSU5URU5ET19BUAotVk9JRAlJbml0TklOVEVORE9fVEFCTEUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1VQ0hBUglDaGVja05JTlRFTkRPX1RBQkxFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCVBDSEFSIHBEU19Tc2lkLAotCVVDSEFSIERTX1NzaWRMZW4sCi0JUFVDSEFSIHBEU19BZGRyKTsKLQotVUNIQVIJRGVsTklOVEVORE9fRU5UUlkoCi0JSU4JUFJUTVBfQURBUFRFUiBwQWQsCi0JVUNIQVIgKiBwRFNfQWRkcik7Ci0KLVZPSUQJUlRNUElvY3RsTmludGVuZG9DYXBhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotVk9JRAlSVE1QSW9jdGxOaW50ZW5kb0dldFRhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotVk9JRAlSVE1QSW9jdGxOaW50ZW5kb1NldFRhYmxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotI2VuZGlmIC8vIE5JTlRFTkRPX0FQIC8vCi0KLUJPT0xFQU4gcnRzdHJtYWN0b2hleCgKLQlJTiBQU1RSSU5HIHMxLAotCUlOIFBTVFJJTkcgczIpOwotCi1CT09MRUFOIHJ0c3RyY2FzZWNtcCgKLQlJTiBQU1RSSU5HIHMxLAotCUlOIFBTVFJJTkcgczIpOwotCi1QU1RSSU5HIHJ0c3Ryc3RydW5jYXNlY21wKAotCUlOIFBTVFJJTkcgczEsCi0JSU4gUFNUUklORyBzMik7Ci0KLVBTVFJJTkcgcnRzdHJzdHIoCi0JSU4JY29uc3QgUFNUUklORyBzMSwKLQlJTgljb25zdCBQU1RSSU5HIHMyKTsKLQotUFNUUklORyByc3RydG9rKAotCUlOIFBTVFJJTkcgcywKLQlJTiBjb25zdCBQU1RSSU5HIGN0KTsKLQotaW50IHJ0aW5ldF9hdG9uKAotCWNvbnN0IFBTVFJJTkcgY3AsCi0JdW5zaWduZWQgaW50ICphZGRyKTsKLQotLy8vLy8vLy8vLyBjb21tb24gaW9jdGwgZnVuY3Rpb25zIC8vLy8vLy8vLy8KLUlOVCBTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0NvdW50cnlSZWdpb25fUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9Db3VudHJ5UmVnaW9uQUJhbmRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9XaXJlbGVzc01vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9DaGFubmVsX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfU2hvcnRTbG90X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfVHhQb3dlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X0JHUHJvdGVjdGlvbl9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1R4UHJlYW1ibGVfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9SVFNUaHJlc2hvbGRfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLQotSU5UIFNldF9GcmFnVGhyZXNob2xkX1Byb2MoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfVHhCdXJzdF9Qcm9jKAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBTVFJJTkcJCQlhcmcpOwotCi0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotSU5UCVNldF9Qa3RBZ2dyZWdhdGVfUHJvYygKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZiAvLyBBR0dSRUdBVElPTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBJTkZfQU1BWk9OX1BQQQotSU5UCVNldF9JTkZfQU1BWk9OX1NFX1BQQV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZyk7Ci0KLSNlbmRpZiAvLyBJTkZfQU1BWk9OX1BQQSAvLwotCi1JTlQJU2V0X0lFRUU4MDIxMUhfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIERCRwotSU5UCVNldF9EZWJ1Z19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotI2VuZGlmCi0KLUlOVAlTaG93X0Rlc2NJbmZvX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfUmVzZXRTdGF0Q291bnRlcl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1JTlQJU2V0X0JBU2V0dXBfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9CQURlY2xpbmVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9CQU9yaVRlYXJEb3duX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfQkFSZWNUZWFyRG93bl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0QndfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdE1jc19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0R2lfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdE9wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0U3RiY19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0SHRjX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRFeHRjaGFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdE1wZHVEZW5zaXR5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRCYVdpblNpemVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldF9IdFJkZ19Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0TGlua0FkYXB0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRBbXNkdV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0QXV0b0JhX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRQcm90ZWN0X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVAlTZXRfSHRNaW1vUHNfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotCi1JTlQJU2V0X0ZvcmNlU2hvcnRHSV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0ZvcmNlR0ZfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotSU5UCVNldENvbW1vbkhUKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotSU5UCVNldF9TZW5kUFNNUEFjdGlvbl9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0TUlNT1BTbW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi0KLUlOVAlTZXRfSHRUeEJBU2l6ZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQJU2V0X0h0RGlzYWxsb3dUS0lQX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vRGxzICwJa2F0aHkKLVZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8vQmxvY2sgQUNLCi1WT0lEIFF1ZXJ5QkFUQUJMRSgKLQlJTiAgUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBRVUVSWUJBX1RBQkxFIHBCQVQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIJCQkJcEZyYW1lLAotCUlOICBVU0hPUlQJCQkJRnJhbWVMZW4sCi0JSU4gIFVTSE9SVAkJCQlPZmZTZXQpOwotCi1WT0lEICAgIFdwYVNlbmRNaWNGYWlsdXJlVG9XcGFTdXBwbGljYW50KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCwKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgICAgICBiVW5pY2FzdCk7Ci0KLVZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAotICAgIElOICBQUlRNUF9BREFQVEVSICAgICAgIHBBZCk7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLWludCB3ZXh0X25vdGlmeV9ldmVudF9hc3NvYygKLQlJTiAgUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNlbmRpZiAvLyBDT05GSUdfU1RBX1NVUFBPUlQgLy8KLQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLVZPSUQgSGFuZGxlX0JTU19XaWR0aF9UcmlnZ2VyX0V2ZW50cygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLXZvaWQgYnVpbGRfZXh0X2NoYW5uZWxfc3dpdGNoX2llKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIEhUX0VYVF9DSEFOTkVMX1NXSVRDSF9BTk5PVU5DRU1FTlRfSUUgKnBJRSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQotQk9PTEVBTiBBUFJ4RG9uZUludGVycnVwdEhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCk7Ci0KLUJPT0xFQU4gU1RBUnhEb25lSW50ZXJydXB0SGFuZGxlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCUJPT0xFQU4JCQlhcmdjKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotLy8gQU1QRFUgcGFja2V0IGluZGljYXRpb24KLVZPSUQgSW5kaWNhdGVfQU1QRFVfUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLS8vIEFNU0RVIHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0FNU0RVX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrLAotCUlOCVVDSEFSCQkJRnJvbVdoaWNoQlNTSUQpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0vLyBOb3JtYWwgbGVnYWN5IFJ4IHBhY2tldCBpbmRpY2F0aW9uCi1WT0lEIEluZGljYXRlX0xlZ2FjeV9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBJbmRpY2F0ZV9FQVBPTF9QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaywKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotdm9pZCAgdXBkYXRlX29zX3BhY2tldF9pbmZvKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLXZvaWQgd2xhbl84MDJfMTFfdG9fODAyXzNfcGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JUFVDSEFSCQkJcEhlYWRlcjgwMl8zLAotCUlOICBVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVUlOVCBkZWFnZ3JlZ2F0ZV9BTVNEVV9hbm5vdW5jZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlQTkRJU19QQUNLRVQJCXBQYWNrZXQsCi0JSU4JUFVDSEFSCQkJcERhdGEsCi0JSU4JVUxPTkcJCQlEYXRhU2l6ZSk7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotLy8gcmVtb3ZlIExMQyBhbmQgZ2V0IDgwMl8zIEhlYWRlcgotI2RlZmluZSAgUlRNUF84MDJfMTFfUkVNT1ZFX0xMQ19BTkRfQ09OVkVSVF9UT184MDJfMyhfcFJ4QmxrLCBfcEhlYWRlcjgwMl8zKQlcCi17CQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JUFVDSEFSIF9wUmVtb3ZlZExMQ1NOQVAgPSBOVUxMLCBfcERBLCBfcFNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9NRVNIKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlfcFNBID0gKFBVQ0hBUilfcFJ4QmxrLT5wSGVhZGVyICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpOyAgICAgICAgICAgICAgICBcCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9JTkZSQSkpCQkJCVwKLQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJX3BEQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChSWF9CTEtfVEVTVF9GTEFHKF9wUnhCbGssIGZSWF9ETFMpKQkJCQkJCQkJCVwKLQkJCV9wU0EgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMjsJCQkJCQkJCQkJXAotCQllbHNlCQkJCQkJCQkJCQkJCQkJCQlcCi0JCQlfcFNBID0gX3BSeEJsay0+cEhlYWRlci0+QWRkcjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCV9wREEgPSBfcFJ4QmxrLT5wSGVhZGVyLT5BZGRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJX3BTQSA9IF9wUnhCbGstPnBIZWFkZXItPkFkZHIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JQ09OVkVSVF9UT184MDJfMyhfcEhlYWRlcjgwMl8zLCBfcERBLCBfcFNBLCBfcFJ4QmxrLT5wRGF0YSwJCQkJXAotCQlfcFJ4QmxrLT5EYXRhU2l6ZSwgX3BSZW1vdmVkTExDU05BUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLQotQk9PTEVBTiBBUEZvd2FyZFdpcmVsZXNzU3RhVG9XaXJlbGVzc1N0YSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVTE9ORwkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBBbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKTsKLQotVk9JRCBTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotI2RlZmluZSBBTk5PVU5DRV9PUl9GT1JXQVJEXzgwMl8zX1BBQ0tFVChfcEFkLCBfcFBhY2tldCwgX0Zyb21XaGljaEJTUylcCi0JCQlTdGFfQW5ub3VuY2Vfb3JfRm9yd2FyZF84MDJfM19QYWNrZXQoX3BBZCwgX3BQYWNrZXQsIF9Gcm9tV2hpY2hCU1MpOwotCQkJLy9hbm5vdW5jZV84MDJfM19wYWNrZXQoX3BBZCwgX3BQYWNrZXQpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi0KLVBORElTX1BBQ0tFVCBEdXBsaWNhdGVQYWNrZXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUE5ESVNfUEFDS0VUCXBQYWNrZXQsCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLQotUE5ESVNfUEFDS0VUIENsb25lUGFja2V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBORElTX1BBQ0tFVAlwUGFja2V0LAotCUlOCVBVQ0hBUgkJCXBEYXRhLAotCUlOCVVMT05HCQkJRGF0YVNpemUpOwotCi0KLS8vIE5vcm1hbCwgQU1QRFUgb3IgQU1TRFUKLVZPSUQgQ21tUnhub25SYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCk7Ci0KLVZPSUQgVXBkYXRlX1Jzc2lfU2FtcGxlKAotCUlOIFBSVE1QX0FEQVBURVIJcEFkLAotCUlOIFJTU0lfU0FNUExFCQkqcFJzc2ksCi0JSU4gUFJYV0lfU1RSVUMJCXBSeFdJKTsKLQotUE5ESVNfUEFDS0VUIEdldFBhY2tldEZyb21SeFJpbmcoCi0JSU4JCVBSVE1QX0FEQVBURVIJcEFkLAotCU9VVAkJUFJUMjhYWF9SWERfU1RSVUMJCXBTYXZlUnhELAotCU9VVAkJQk9PTEVBTgkJCSpwYlJlc2NoZWR1bGUsCi0JSU4gT1VUCVVJTlQzMgkJCSpwUnhQZW5kaW5nKTsKLQotUE5ESVNfUEFDS0VUIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVJYX0JMSwkJCSpwUnhCbGspOwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVZPSUQgUlRNUElvY3RsR2V0U2l0ZVN1cnZleSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKTsKLQotCi0KLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0vL2ZvciBzbm1wICwga2F0aHkKLXR5cGVkZWYgc3RydWN0IF9EZWZhdWx0S2V5SWR4VmFsdWUKLXsKLQlVQ0hBUglLZXlJZHg7Ci0JVUNIQVIJVmFsdWVbMTZdOwotfSBEZWZhdWx0S2V5SWR4VmFsdWUsICpQRGVmYXVsdEtleUlkeFZhbHVlOwotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotZW51bSB7Ci0JRElEbXNnX2xueGluZF93bGFuc25pZmZybQkJPSAweDAwMDAwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1faG9zdHRpbWUJPSAweDAwMDEwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbWFjdGltZQk9IDB4MDAwMjAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9jaGFubmVsCT0gMHgwMDAzMDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3Jzc2kJCT0gMHgwMDA0MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3NxCQk9IDB4MDAwNTAwNDQsCi0JRElEbXNnX2xueGluZF93bGFuc25pZmZybV9zaWduYWwJPSAweDAwMDYwMDQ0LAotCURJRG1zZ19sbnhpbmRfd2xhbnNuaWZmcm1fbm9pc2UJCT0gMHgwMDA3MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX3JhdGUJCT0gMHgwMDA4MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2lzdHgJCT0gMHgwMDA5MDA0NCwKLQlESURtc2dfbG54aW5kX3dsYW5zbmlmZnJtX2ZybWxlbgk9IDB4MDAwQTAwNDQKLX07Ci1lbnVtIHsKLQlQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX25vX3ZhbHVlCT0gMHgwMAotfTsKLWVudW0gewotCVA4MDIxMUVOVU1fdHJ1dGhfZmFsc2UJCQk9IDB4MDAsCi0JUDgwMjExRU5VTV90cnV0aF90cnVlCQkJPSAweDAxCi19OwotCi0vKiBEZWZpbml0aW9uIGZyb20gbWFkd2lmaSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBVSU5UMzIgZGlkOwotICAgICAgICBVSU5UMTYgc3RhdHVzOwotICAgICAgICBVSU5UMTYgbGVuOwotICAgICAgICBVSU5UMzIgZGF0YTsKLX0gcDgwMjExaXRlbV91aW50MzJfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBVSU5UMzIgbXNnY29kZTsKLSAgICAgICAgVUlOVDMyIG1zZ2xlbjsKLSNkZWZpbmUgV0xBTl9ERVZOQU1FTEVOX01BWCAxNgotICAgICAgICBVSU5UOCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGhvc3R0aW1lOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IG1hY3RpbWU7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgY2hhbm5lbDsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByc3NpOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNxOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IHNpZ25hbDsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCBub2lzZTsKLSAgICAgICAgcDgwMjExaXRlbV91aW50MzJfdCByYXRlOwotICAgICAgICBwODAyMTFpdGVtX3VpbnQzMl90IGlzdHg7Ci0gICAgICAgIHA4MDIxMWl0ZW1fdWludDMyX3QgZnJtbGVuOwotfSB3bGFuX25nX3ByaXNtMl9oZWFkZXI7Ci0KLS8qIFRoZSByYWRpbyBjYXB0dXJlIGhlYWRlciBwcmVjZWRlcyB0aGUgODAyLjExIGhlYWRlci4gKi8KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciB7Ci0gICAgVUlOVDgJaXRfdmVyc2lvbjsJLyogVmVyc2lvbiAwLiBPbmx5IGluY3JlYXNlcwotCQkJCSAqIGZvciBkcmFzdGljIGNoYW5nZXMsCi0JCQkJICogaW50cm9kdWN0aW9uIG9mIGNvbXBhdGlibGUKLQkJCQkgKiBuZXcgZmllbGRzIGRvZXMgbm90IGNvdW50LgotCQkJCSAqLwotICAgIFVJTlQ4CWl0X3BhZDsKLSAgICBVSU5UMTYgICAgIGl0X2xlbjsgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIHdob2xlCi0JCQkJICogaGVhZGVyIGluIGJ5dGVzLCBpbmNsdWRpbmcKLQkJCQkgKiBpdF92ZXJzaW9uLCBpdF9wYWQsCi0JCQkJICogaXRfbGVuLCBhbmQgZGF0YSBmaWVsZHMuCi0JCQkJICovCi0gICAgVUlOVDMyICAgaXRfcHJlc2VudDsJLyogQSBiaXRtYXAgdGVsbGluZyB3aGljaAotCQkJCQkgKiBmaWVsZHMgYXJlIHByZXNlbnQuIFNldCBiaXQgMzEKLQkJCQkJICogKDB4ODAwMDAwMDApIHRvIGV4dGVuZCB0aGUKLQkJCQkJICogYml0bWFwIGJ5IGFub3RoZXIgMzIgYml0cy4KLQkJCQkJICogQWRkaXRpb25hbCBleHRlbnNpb25zIGFyZSBtYWRlCi0JCQkJCSAqIGJ5IHNldHRpbmcgYml0IDMxLgotCQkJCQkgKi8KLX1pZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIDsKLQotZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSB7Ci0gICAgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAotICAgIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKLSAgICBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCi0gICAgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMKLX07Ci0KLSNkZWZpbmUgV0xBTl9SQURJT1RBUF9QUkVTRU5UICgJCQlcCi0JKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQpCXwJXAotCSgxIDw8IElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUykgfAlcCi0JKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1JBVEUpICB8CVwKLQkgMCkKLQotdHlwZWRlZiBzdHJ1Y3QgX3dsYW5fcmFkaW90YXBfaGVhZGVyIHsKLQlpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHd0X2loZHI7Ci0JSU5UNjQgd3RfdHNmdDsKLQlVSU5UOCB3dF9mbGFnczsKLQlVSU5UOCB3dF9yYXRlOwotfSB3bGFuX3JhZGlvdGFwX2hlYWRlcjsKLS8qIERlZmluaXRpb24gZnJvbSBtYWR3aWZpICovCi0KLXZvaWQgc2VuZF9tb25pdG9yX3BhY2tldHMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsayk7Ci0KLQotVk9JRCAgICBSVE1QU2V0RGVzaXJlZFJhdGVzKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIExPTkcgICAgICAgICAgICBSYXRlcyk7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLUlOVAlTZXRfRml4ZWRUeE1vZGVfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLQotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi1JTlQJU2V0X09wTW9kZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0KLUlOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUJPT0xFQU4gUlQyOFhYQ2hpcHNldENoZWNrKAotCUlOIHZvaWQgKl9kZXZfcCk7Ci0KLQotVk9JRCBSVDI4WFhETUFEaXNhYmxlKAotCUlOIFJUTVBfQURBUFRFUgkJCSpwQWQpOwotCi1WT0lEIFJUMjhYWERNQUVuYWJsZSgKLQlJTiBSVE1QX0FEQVBURVIJCQkqcEFkKTsKLQotVk9JRCBSVDI4eHhfVXBkYXRlQmVhY29uVG9Bc2ljKAotCUlOIFJUTVBfQURBUFRFUiAqIHBBZCwKLQlJTiBJTlQgYXBpZHgsCi0JSU4gVUxPTkcgQmVhY29uTGVuLAotCUlOIFVMT05HIFVwZGF0ZVBvcyk7Ci0KLWludCBydDI4eHhfaW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQU1RSSU5HIHBEZWZhdWx0TWFjLAotCUlOIFBTVFJJTkcgcEhvc3ROYW1lKTsKLQotQk9PTEVBTiBSVDI4WFhTZWN1cml0eUtleUFkZCgKLQlJTgkJUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOCQlVTE9ORwkJCQlhcGlkeCwKLQlJTgkJVUxPTkcJCQkJS2V5SWR4LAotCUlOCQlNQUNfVEFCTEVfRU5UUlkJCSpwRW50cnkpOwotCi1ORElTX1NUQVRVUyBSdG1wTmV0VGFza0luaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi1WT0lEIFJ0bXBOZXRUYXNrRXhpdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLU5ESVNfU1RBVFVTIFJ0bXBNZ210VGFza0luaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi1WT0lEIFJ0bXBNZ210VGFza0V4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi12b2lkIHRidHRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotCi0KLVBORVRfREVWIFJ0bXBQaHlOZXREZXZJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJUTVBfT1NfTkVUREVWX09QX0hPT0sgKnBOZXRIb29rKTsKLQotQk9PTEVBTiBSdG1wUGh5TmV0RGV2RXhpdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBQTkVUX0RFViBuZXRfZGV2KTsKLQotSU5UIFJ0bXBSYURldkN0cmxJbml0KAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFJUTVBfSU5GX1RZUEUgaW5mVHlwZSk7Ci0KLUJPT0xFQU4gUnRtcFJhRGV2Q3RybEV4aXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLS8vCi0vLyBGdW5jdGlvbiBQcm90b3R5cGUgaW4gY21tX2RhdGFfcGNpLmMKLS8vCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwotCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVNpbmdsZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwotCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZU11bHRpVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhbWVOdW0sCi0JT1VUCVVTSE9SVAkJCSpGcmVlTnVtYmVyKTsKLQotVVNIT1JUCVJ0bXBQQ0lfV3JpdGVGcmFnVHhSZXNvdXJjZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrLAotCUlOCVVDSEFSCQkJZnJhZ051bSwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwotCi1VU0hPUlQgUnRtcFBDSV9Xcml0ZVN1YlR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglCT09MRUFOCQkJYklzTGFzdCwKLQlPVVQJVVNIT1JUCQkJKkZyZWVOdW1iZXIpOwotCi1WT0lEIFJ0bXBQQ0lfRmluYWxXcml0ZVR4UmVzb3VyY2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVU0hPUlQJCQl0b3RhbE1QRFVTaXplLAotCUlOCVVTSE9SVAkJCUZpcnN0VHhJZHgpOwotCi1WT0lEIFJ0bXBQQ0lEYXRhTGFzdFR4SWR4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJUXVlSWR4LAotCUlOCVVTSE9SVAkJCUxhc3RUeElkeCk7Ci0KLVZPSUQgUnRtcFBDSURhdGFLaWNrT3V0KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGssCi0JSU4JVUNIQVIJCQlRdWVJZHgpOwotCi0KLWludCBSdG1wUENJTWdtdEtpY2tPdXQoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIFVDSEFSCQkJUXVlSWR4LAotCUlOIFBORElTX1BBQ0tFVAkJcFBhY2tldCwKLQlJTiBQVUNIQVIJCQlwU3JjQnVmVkEsCi0JSU4gVUlOVAkJCQlTcmNCdWZMZW4pOwotCi0KLU5ESVNfU1RBVFVTIFJUTVBDaGVja1J4RXJyb3IoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFBIRUFERVJfODAyXzExICBwSGVhZGVyLAotCUlOCVBSWFdJX1NUUlVDCXBSeFdJLAotCUlOICBQUlQyOFhYX1JYRF9TVFJVQyAgICAgIHBSeEQpOwotCi1CT09MRUFOIFJUMjh4eFBjaUFzaWNSYWRpb09mZigKLQlJTiBQUlRNUF9BREFQVEVSICAgIHBBZCwKLQlJTiBVQ0hBUiAgICAgICAgICAgIExldmVsLAotCUlOIFVTSE9SVCAgICAgICAgICAgVGJ0dE51bVRvTmV4dFdha2VVcCk7Ci0KLUJPT0xFQU4gUlQyOHh4UGNpQXNpY1JhZGlvT24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gVUNIQVIgICAgIExldmVsKTsKLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBSVE1QSW5pdFBDSWVMaW5rQ3RybFZhbHVlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotVk9JRCBSVE1QRmluZEhvc3RQQ0lEZXYoCi0gICAgSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJUTVBQQ0llTGlua0N0cmxWYWx1ZVJlc3RvcmUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gICBVQ0hBUgkJTGV2ZWwpOwotCi1WT0lEIFJUTVBQQ0llTGlua0N0cmxTZXR0aW5nKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVTSE9SVAkJTWF4KTsKLQotVk9JRCBSVE1QcnQzeFNldFBDSWVQb3dlckxpbmtDdHJsKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKTsKLQotCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNGb3JjZVdha2V1cCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBCT09MRUFOICAgICAgIGJGcm9tVHgpOwotCi1WT0lEIFJUMjh4eFBjaVN0YUFzaWNTbGVlcFRoZW5BdXRvV2FrZXVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLQotVk9JRCBQc1BvbGxXYWtlRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotCi1WT0lEICBSYWRpb09uRXhlYygKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMiwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpOwotI2VuZGlmIC8vIENPTkZJR19TVEFfU1VQUE9SVCAvLwotCi1WT0lEIFJUMjh4eFBjaU1sbWVSYWRpb09uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBSVDI4eHhQY2lNbG1lUmFkaW9PRkYoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi1WT0lEIEFzaWNUdXJuT2ZmUkZDbGsoCi0JSU4gUFJUTVBfQURBUFRFUiAgICBwQWQsCi0JSU4JVUNIQVIgICAgICAgICAgIENoYW5uZWwpOwotCi1WT0lEIEFzaWNUdXJuT25SRkNsaygKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglVQ0hBUgkJCUNoYW5uZWwpOwotCi0KLQotI2lmZGVmIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUCi1JTlQgUnRtcFRpbWVyUVRocmVhZCgKLQlJTiBPVVQgUFZPSUQgQ29udGV4dCk7Ci0KLVJUTVBfVElNRVJfVEFTS19FTlRSWSAqUnRtcFRpbWVyUUluc2VydCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBSQUxJTktfVElNRVJfU1RSVUNUICpwVGltZXIpOwotCi1CT09MRUFOIFJ0bXBUaW1lclFSZW1vdmUoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gUkFMSU5LX1RJTUVSX1NUUlVDVCAqcFRpbWVyKTsKLQotdm9pZCBSdG1wVGltZXJRRXhpdCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCk7Ci0KLXZvaWQgUnRtcFRpbWVyUUluaXQoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQpOwotI2VuZGlmIC8vIFJUTVBfVElNRVJfVEFTS19TVVBQT1JUIC8vCi0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVZPSUQgUUJTU19Mb2FkSW5pdCgKLQlJTgkJUlRNUF9BREFQVEVSCSpwQWQpOwotCi1VSU5UMzIgUUJTU19Mb2FkRWxlbWVudEFwcGVuZCgKLQlJTgkJUlRNUF9BREFQVEVSCSpwQWQsCi0JT1VUCQlVSU5UOAkJCSpidWZfcCk7Ci0KLVZPSUQgUUJTU19Mb2FkVXBkYXRlKAotCUlOCQlSVE1QX0FEQVBURVIJKnBBZCk7Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotSU5UIFJUTVBTaG93Q2ZnVmFsdWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCXBOYW1lLAotCUlOCVBTVFJJTkcJCQlwQnVmKTsKLQotUFNUUklORyBSVE1QR2V0UmFsaW5rQXV0aE1vZGVTdHIoCi0gICAgSU4gIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgYXV0aE1vZGUpOwotCi1QU1RSSU5HIFJUTVBHZXRSYWxpbmtFbmNyeU1vZGVTdHIoCi0gICAgSU4gIFVTSE9SVCBlbmNyeU1vZGUpOwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotI2lmZGVmIENPTkZJR19TVEFfU1VQUE9SVAotVk9JRCBBc2ljU3RhQmJwVHVuaW5nKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywKLQlJTiAgVUNIQVIJCQkJQWRkSHRJbmZvTGVuLAotCUlOICBVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbyk7Ci0KLQotQk9PTEVBTglBVVRIX1JlcVNlbmQoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUE1MTUVfUVVFVUVfRUxFTQlwRWxlbSwKLQlJTiAgUFJBTElOS19USU1FUl9TVFJVQ1QgcEF1dGhUaW1lciwKLQlJTiAgUFNUUklORwkJCQlwU01OYW1lLAotCUlOICBVU0hPUlQJCQkJU2VxTm8sCi0JSU4gIFBVQ0hBUgkJCQlwTmV3RWxlbWVudCwKLQlJTiAgVUxPTkcJCQkJRWxlbWVudExlbik7Ci0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLXZvaWQgUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQpOwotCi1WT0lEIFJlU3luY0JlYWNvblRpbWUoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQpOwotCi1WT0lEIFJUTVBTZXRBR0NJbml0VmFsdWUoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUNIQVIJCQlCYW5kV2lkdGgpOwotCi1pbnQgcnQyOHh4X2Nsb3NlKElOIFBORVRfREVWIGRldik7Ci1pbnQgcnQyOHh4X29wZW4oSU4gUE5FVF9ERVYgZGV2KTsKLQotCi0jZGVmaW5lIFZJUlRVQUxfSUZfSU5DKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KyspCi0jZGVmaW5lIFZJUlRVQUxfSUZfREVDKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250LS0pCi0jZGVmaW5lIFZJUlRVQUxfSUZfTlVNKF9fcEFkKSAoKF9fcEFkKS0+VmlydHVhbElmQ250KQotCi0KLSNpZmRlZiBMSU5VWAotX19pbmxpbmUgSU5UIFZJUlRVQUxfSUZfVVAoUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKLQl7Ci0JCWlmIChydDI4eHhfb3BlbihwQWQtPm5ldF9kZXYpICE9IDApCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0Mjh4eF9vcGVuIHJldHVybiBmYWlsIVxuIikpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JfQotCVZJUlRVQUxfSUZfSU5DKHBBZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLV9faW5saW5lIFZPSUQgVklSVFVBTF9JRl9ET1dOKFBSVE1QX0FEQVBURVIgcEFkKQotewotCVZJUlRVQUxfSUZfREVDKHBBZCk7Ci0JaWYgKFZJUlRVQUxfSUZfTlVNKHBBZCkgPT0gMCkKLQkJcnQyOHh4X2Nsb3NlKHBBZC0+bmV0X2Rldik7Ci0JcmV0dXJuOwotfQotI2VuZGlmIC8vIExJTlVYIC8vCi0KLQotCi0KLS8qCi0JT1MgUmVsYXRlZCBmdW5jaXRvbiBwcm90b3R5cGUgZGVmaW5pdGlvbnMuCi0JVE9ETzogTWF5YmUgd2UgbmVlZCB0byBtb3ZlIHRoZXNlIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gb3RoZXIgcHJvcGVyIHBsYWNlLgotKi8KLWludCBSdG1wT1NXcmllbGVzc0V2ZW50U2VuZCgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBVSU5UMzIJCWV2ZW50VHlwZSwKLQlJTiBJTlQJCQlmbGFncywKLQlJTiBQVUNIQVIJCXBTcmNNYWMsCi0JSU4gUFVDSEFSCQlwRGF0YSwKLQlJTiBVSU5UMzIJCWRhdGFMZW4pOwotCi1pbnQgUnRtcE9TTmV0RGV2QWRkclNldCgKLQlJTiBQTkVUX0RFViBwTmV0RGV2LAotCUlOIFBVQ0hBUglwTWFjQWRkcik7Ci0KLWludCBSdG1wT1NOZXREZXZBdHRhY2goCi0JSU4gUE5FVF9ERVYgcE5ldERldiwKLQlJTiBSVE1QX09TX05FVERFVl9PUF9IT09LICpwRGV2T3BIb29rKTsKLQotdm9pZCBSdG1wT1NOZXREZXZDbG9zZSgKLQlJTiBQTkVUX0RFViBwTmV0RGV2KTsKLQotdm9pZCBSdG1wT1NOZXREZXZEZXRhY2goCi0JSU4gUE5FVF9ERVYgcE5ldERldik7Ci0KLUlOVCBSdG1wT1NOZXREZXZBbGxvYygKLQlJTiBQTkVUX0RFViAqcE5ld05ldERldiwKLQlJTiBVSU5UMzIJcHJpdkRhdGFTaXplKTsKLQotdm9pZCBSdG1wT1NOZXREZXZGcmVlKAotCUlOIFBORVRfREVWIHBOZXREZXYpOwotCi1QTkVUX0RFViBSdG1wT1NOZXREZXZHZXRCeU5hbWUoCi0JSU4gUE5FVF9ERVYgcE5ldERldiwKLQlJTiBQU1RSSU5HCXBEZXZOYW1lKTsKLQotdm9pZCBSdG1wT1NOZXREZXZpY2VSZWZQdXQoCi0JSU4gUE5FVF9ERVYgcE5ldERldik7Ci0KLVBORVRfREVWIFJ0bXBPU05ldERldkNyZWF0ZSgKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBJTlQJCQlkZXZUeXBlLAotCUlOIElOVAkJCWRldk51bSwKLQlJTiBJTlQJCQlwcml2TWVtU2l6ZSwKLQlJTiBQU1RSSU5HCQlwTmFtZVByZWZpeCk7Ci0KLS8qCi0JVGFzayBvcGVyYXRpb24gcmVsYXRlZCBmdW5jdGlvbiBwcm90b3R5cGVzCi0qLwotdm9pZCBSdG1wT1NUYXNrQ3VzdG9taXplKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2spOwotCi1JTlQgUnRtcE9TVGFza05vdGlmeVRvRXhpdCgKLQlJTiBSVE1QX09TX1RBU0sgKnBUYXNrKTsKLQotTkRJU19TVEFUVVMgUnRtcE9TVGFza0tpbGwoCi0JSU4gUlRNUF9PU19UQVNLICpwVGFzayk7Ci0KLU5ESVNfU1RBVFVTIFJ0bXBPU1Rhc2tJbml0KAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2ssCi0JUFNUUklORwkJCSBwVGFza05hbWUsCi0JVk9JRAkJCSAqcFByaXYpOwotCi1ORElTX1NUQVRVUyBSdG1wT1NUYXNrQXR0YWNoKAotCUlOIFJUTVBfT1NfVEFTSyAqcFRhc2ssCi0JSU4gaW50ICgqZm4pKHZvaWQgKiksCi0JSU4gdm9pZCAqYXJnKTsKLQotCi0vKgotCUZpbGUgb3BlcmF0aW9uIHJlbGF0ZWQgZnVuY3Rpb24gcHJvdG90eXBlcwotKi8KLVJUTVBfT1NfRkQgUnRtcE9TRmlsZU9wZW4oCi0JSU4gY2hhciAqcFBhdGgsCi0JSU4gaW50IGZsYWcsCi0JSU4gaW50IG1vZGUpOwotCi1pbnQgUnRtcE9TRmlsZUNsb3NlKAotCUlOIFJUTVBfT1NfRkQgb3NmZCk7Ci0KLXZvaWQgUnRtcE9TRmlsZVNlZWsoCi0JSU4gUlRNUF9PU19GRCBvc2ZkLAotCUlOIGludCBvZmZzZXQpOwotCi1pbnQgUnRtcE9TRmlsZVJlYWQoCi0JSU4gUlRNUF9PU19GRCBvc2ZkLAotCUlOIGNoYXIgKnBEYXRhUHRyLAotCUlOIGludCByZWFkTGVuKTsKLQotaW50IFJ0bXBPU0ZpbGVXcml0ZSgKLQlJTiBSVE1QX09TX0ZEIG9zZmQsCi0JSU4gY2hhciAqcERhdGFQdHIsCi0JSU4gaW50IHdyaXRlTGVuKTsKLQotdm9pZCBSdG1wT1NGU0luZm9DaGFuZ2UoCi0JSU4gUlRNUF9PU19GU19JTkZPICpwT1NGU0luZm8sCi0JSU4gQk9PTEVBTiBiU2V0KTsKLQotCi0jZW5kaWYgIC8vIF9fUlRNUF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9jaGlwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfY2hpcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI0YmYwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9jaGlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX2NoaXAuaAotCi0JQWJzdHJhY3Q6Ci0JUmFsaW5rIFdpcmVsZXNzIENoaXAgcmVsYXRlZCBkZWZpbml0aW9uICYgc3RydWN0dXJlcwotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkgIFdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotI2lmbmRlZglfX1JUTVBfQ0hJUF9IX18KLSNkZWZpbmUJX19SVE1QX0NISVBfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLQotI2lmZGVmIFJUMzA5MAotI2luY2x1ZGUgInJ0MzA5MC5oIgotI2VuZGlmIC8vIFJUMzA5MCAvLwotCi0jaWZkZWYgUlQzMzcwCi0jaW5jbHVkZSAicnQzMzcwLmgiCi0jZW5kaWYgLy8gUlQzMzcwIC8vCi0KLSNpZmRlZiBSVDMzOTAKLSNpbmNsdWRlICJydDMzOTAuaCIKLSNlbmRpZiAvLyBSVDMzOTAgLy8KLQotLy8gV2Ugd2lsbCBoYXZlIGEgY29zdCBkb3duIHZlcnNpb24gd2hpY2ggbWFjIHZlcnNpb24gaXMgMHgzMDkweHh4eAotLy8KLS8vIFJUMzA5MEEgZmFjdHMKLS8vCi0vLyBhKSAyLjQgR0h6Ci0vLyBiKSBSZXBsYWNlbWVudCBmb3IgUlQzMDkwCi0vLyBjKSBJbnRlcm5hbCBMTkEKLS8vIGQpIEludGVyZmVyZW5jZSBvdmVyIGNoYW5uZWwgIzE0Ci0vLyBlKSBOZXcgQkJQIGZlYXR1cmVzIChlLmcuLCBTSUcgcmUtbW9kdWxhdGlvbikKLS8vCi0jZGVmaW5lIElTX1JUMzA5MEEoX3BBZCkJCQkJKCgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDkwMDAwMCkpCi0KLS8vIFdlIHdpbGwgaGF2ZSBhIGNvc3QgZG93biB2ZXJzaW9uIHdoaWNoIG1hYyB2ZXJzaW9uIGlzIDB4MzA5MHh4eHgKLSNkZWZpbmUgSVNfUlQzMDkwKF9wQWQpCQkJCSgoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MTAwMDApIHx8IChJU19SVDMwOTBBKF9wQWQpKSkKLQotI2RlZmluZSBJU19SVDMwNzAoX3BBZCkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzMDcwMDAwMCkKLSNkZWZpbmUgSVNfUlQzMDcxKF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmZjAwMDApID09IDB4MzA3MTAwMDApCi0jZGVmaW5lIElTX1JUMjA3MChfcEFkKQkJKCgoX3BBZCktPlJmSWNUeXBlID09IFJGSUNfMjAyMCkgfHwgKChfcEFkKS0+RUZ1c2VUYWcgPT0gMHgyNykpCi0KLSNkZWZpbmUgSVNfUlQzMHh4KF9wQWQpCQkoKChfcEFkKS0+TUFDVmVyc2lvbiAmIDB4ZmZmMDAwMDApID09IDB4MzA3MDAwMDB8fElTX1JUMzA5MEEoX3BBZCkpCi0vLyNkZWZpbmUgSVNfUlQzMDVYKF9wQWQpCQkoKF9wQWQpLT5NQUNWZXJzaW9uID09IDB4Mjg3MjAyMDApCi0KLS8qIFJUMzU3MiwgMzU5MiwgMzU2MiwgMzA2MiBzaGFyZSB0aGUgc2FtZSBNQUMgdmVyc2lvbiAqLwotI2RlZmluZSBJU19SVDM1NzIoX3BBZCkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uICYgMHhmZmZmMDAwMCkgPT0gMHgzNTcyMDAwMCkKLSNkZWZpbmUgSVNfVkVSU0lPTl9CRUZPUkVfRihfcEFkKQkJCSgoKF9wQWQpLT5NQUNWZXJzaW9uJjB4ZmZmZikgPD0gMHgwMjExKQotLy8gRiB2ZXJzaW9uIGlzIDB4MDIxMiwgRSB2ZXJzaW9uIGlzIDB4MDIxMS4gMzA5eCBjYW4gc2F2ZSBtb3JlIHBvd2VyIGFmdGVyIEYgdmVyc2lvbi4KLSNkZWZpbmUgSVNfVkVSU0lPTl9BRlRFUl9GKF9wQWQpCQkJKCgoKF9wQWQpLT5NQUNWZXJzaW9uJjB4ZmZmZikgPj0gMHgwMjEyKSB8fCAoKChfcEFkKS0+YjMwOTBFU3BlY2lhbENoaXAgPT0gVFJVRSkpKQotLy8KLS8vIFJUMzM5MCBmYWN0cwotLy8KLS8vIGEpIEJhc2Ugb24gUlQzMDkwIChSRiBJQzogUlQzMDIwKQotLy8gYikgMi40IEdIegotLy8gYykgMXgxCi0vLyBkKSBTaW5nbGUgY2hpcAotLy8gZSkgSW50ZXJuYWwgY29tcG9uZW50czogUEEgYW5kIExOQQotLy8KLS8vUlQzMzkwLFJUMzM3MAotI2RlZmluZSBJU19SVDMzOTAoX3BBZCkJCQkJKCgoX3BBZCktPk1BQ1ZlcnNpb24gJiAweEZGRkYwMDAwKSA9PSAweDMzOTAwMDAwKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBDSSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgwMDAwCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUgQ0hJUF9QQ0lfQ0ZHCQkweDAwMDAKLSNkZWZpbmUgQ0hJUF9QQ0lfRUVDVFJMCQkweDAwMDQKLSNkZWZpbmUgQ0hJUF9QQ0lfTUNVQ1RSTAkweDAwMDgKLQotI2RlZmluZSBPUFRfMTQJCQkweDExNAotCi0jZGVmaW5lIFJFVFJZX0xJTUlUCQkxMAotCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCQlAgJiBSRglkZWZpbml0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUJQlVTWQkJICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUJSURMRQkJICAgICAgICAgICAgICAgIDAKLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVFUFJPTSBkZWZpbml0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUgRUVETyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgRUVESSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgRUVDUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgRUVTSyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgRUVSTCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKLQotI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFICAgICAgICAgMHgwNQotI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUgICAgICAgICAgMHgwNgotI2RlZmluZSBFRVBST01fRVdEU19PUENPREUgICAgICAgICAgMHgxMAotI2RlZmluZSBFRVBST01fRVdFTl9PUENPREUgICAgICAgICAgMHgxMwotCi0jZGVmaW5lIE5VTV9FRVBST01fQkJQX1BBUk1TCQkxOQkJCS8vIEluY2x1ZGUgTklDIENvbmZpZyAwLCAxLCBDUiwgVFggQUxDIHN0ZXAsIEJCUHMKLSNkZWZpbmUgTlVNX0VFUFJPTV9UWF9HX1BBUk1TCQk3Ci0jZGVmaW5lIEVFUFJPTV9OSUMxX09GRlNFVCAgICAgICAgICAweDM0CQkvLyBUaGUgYWRkcmVzcyBpcyBmcm9tIE5JQyBjb25maWcgMCwgbm90IEJCUCByZWdpc3RlciBJRAotI2RlZmluZSBFRVBST01fTklDMl9PRkZTRVQgICAgICAgICAgMHgzNgkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKLSNkZWZpbmUgRUVQUk9NX0JCUF9CQVNFX09GRlNFVAkJMHhmMAkJLy8gVGhlIGFkZHJlc3MgaXMgZnJvbSBOSUMgY29uZmlnIDAsIG5vdCBCQlAgcmVnaXN0ZXIgSUQKLSNkZWZpbmUgRUVQUk9NX0dfVFhfUFdSX09GRlNFVAkJMHg1MgotI2RlZmluZSBFRVBST01fR19UWDJfUFdSX09GRlNFVAkJMHg2MAotI2RlZmluZSBFRVBST01fTEVEMV9PRkZTRVQJCQkweDNjCi0jZGVmaW5lIEVFUFJPTV9MRUQyX09GRlNFVAkJCTB4M2UKLSNkZWZpbmUgRUVQUk9NX0xFRDNfT0ZGU0VUCQkJMHg0MAotI2RlZmluZSBFRVBST01fTE5BX09GRlNFVAkJCTB4NDQKLSNkZWZpbmUgRUVQUk9NX1JTU0lfQkdfT0ZGU0VUCQkweDQ2Ci0jZGVmaW5lIEVFUFJPTV9UWE1JWEVSX0dBSU5fMl80RwkweDQ4Ci0jZGVmaW5lIEVFUFJPTV9SU1NJX0FfT0ZGU0VUCQkweDRhCi0jZGVmaW5lIEVFUFJPTV9UWE1JWEVSX0dBSU5fNUcJCTB4NGMKLSNkZWZpbmUgRUVQUk9NX0RFRklORV9NQVhfVFhQV1IJCTB4NGUKLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzIwTUhaXzJfNEcJMHhkZQkvLyAyME1IWiAyLjRHIHR4IHBvd2VyLgotI2RlZmluZSBFRVBST01fVFhQT1dFUl9CWVJBVEVfNDBNSFpfMl80RwkweGVlCS8vIDQwTUhaIDIuNEcgdHggcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0JZUkFURV8yME1IWl81RwkJMHhmYQkvLyAyME1IWiA1RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFXzQwTUhaXzVHCQkweDEwYQkvLyA0ME1IWiA1RyB0eCBwb3dlci4KLSNkZWZpbmUgRUVQUk9NX0FfVFhfUFdSX09GRlNFVCAgICAgIDB4NzgKLSNkZWZpbmUgRUVQUk9NX0FfVFgyX1BXUl9PRkZTRVQgICAgICAweGE2Ci0vLyNkZWZpbmUgRUVQUk9NX0phcGFuX1RYX1BXUl9PRkZTRVQgICAgICAweDkwIC8vIDgwMi4xMWoKLS8vI2RlZmluZSBFRVBST01fSmFwYW5fVFgyX1BXUl9PRkZTRVQgICAgICAweGJlCi0vLyNkZWZpbmUgRUVQUk9NX1RTU0lfUkVGX09GRlNFVAkweDU0Ci0vLyNkZWZpbmUgRUVQUk9NX1RTU0lfREVMVEFfT0ZGU0VUCTB4MjQKLS8vI2RlZmluZSBFRVBST01fQ0NLX1RYX1BXUl9PRkZTRVQgIDB4NjIKLS8vI2RlZmluZSBFRVBST01fQ0FMSUJSQVRFX09GRlNFVAkweDdjCi0jZGVmaW5lIEVFUFJPTV9WRVJTSU9OX09GRlNFVCAgICAgICAweDAyCi0jZGVmaW5lIEVFUFJPTV9GUkVRX09GRlNFVAkJCTB4M2EKLSNkZWZpbmUgRUVQUk9NX1RYUE9XRVJfQllSQVRFCTB4ZGUJLy8gMjBNSFogcG93ZXIuCi0jZGVmaW5lIEVFUFJPTV9UWFBPV0VSX0RFTFRBCQkweDUwCS8vIDIwTUhaIEFORCA0MCBNSFogdXNlIGRpZmZlcmVudCBwb3dlci4gVGhpcyBpcyBkZWx0YSBpbiA0ME1IWi4KLSNkZWZpbmUgVkFMSURfRUVQUk9NX1ZFUlNJT04gICAgICAgIDEKLQotCi0vKgotICAqICAgRUVQUk9NIG9wZXJhdGlvbiByZWxhdGVkIG1hcmNvcwotICAqLwotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1JFQUQxNihfcEFkLCBfb2Zmc2V0LCBfdmFsdWUpCQkJXAotCShfcEFkKS0+Y2hpcE9wcy5lZXJlYWQoKFJUTVBfQURBUFRFUiAqKShfcEFkKSwgKFVTSE9SVCkoX29mZnNldCksIChQVVNIT1JUKSYoX3ZhbHVlKSkKLQotI2RlZmluZSBSVDI4eHhfRUVQUk9NX1dSSVRFMTYoX3BBZCwgX29mZnNldCwgX3ZhbHVlKQkJXAotCShfcEFkKS0+Y2hpcE9wcy5lZXdyaXRlKChSVE1QX0FEQVBURVIgKikoX3BBZCksIChVU0hPUlQpKF9vZmZzZXQpLCAoVVNIT1JUKShfdmFsdWUpKQotCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIEUyUFJPTSBkYXRhIGxheW91dAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLwotLy8gTUNVX0xFRENTOiBNQ1UgTEVEIENvbnRyb2wgU2V0dGluZy4KLS8vCi10eXBlZGVmIHVuaW9uICBfTUNVX0xFRENTX1NUUlVDIHsKLQlzdHJ1Y3QJewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJVUNIQVIJCVBvbGFyaXR5OjE7Ci0JCVVDSEFSCQlMZWRNb2RlOjc7Ci0jZWxzZQotCQlVQ0hBUgkJTGVkTW9kZTo3OwotCQlVQ0hBUgkJUG9sYXJpdHk6MTsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0JfSBmaWVsZDsKLQlVQ0hBUgkJCQl3b3JkOwotfSBNQ1VfTEVEQ1NfU1RSVUMsICpQTUNVX0xFRENTX1NUUlVDOwotCi0KLS8vCi0vLyBFRVBST00gYW50ZW5uYSBzZWxlY3QgZm9ybWF0Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9BTlRFTk5BX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQgICAgICBSc3Y6NDsKLQkJVVNIT1JUICAgICAgUmZJY1R5cGU6NDsgICAgICAgICAgICAgLy8gc2VlIEUyUFJPTSBkb2N1bWVudAotCQlVU0hPUlQJCVR4UGF0aDo0OwkvLyAxOiAxVCwgMjogMlQKLQkJVVNIT1JUCQlSeFBhdGg6NDsJLy8gMTogMVIsIDI6IDJSLCAzOiAzUgotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JRUVQUk9NX0FOVEVOTkFfU1RSVUMsICpQRUVQUk9NX0FOVEVOTkFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX0FOVEVOTkFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJUnhQYXRoOjQ7CS8vIDE6IDFSLCAyOiAyUiwgMzogM1IKLQkJVVNIT1JUCQlUeFBhdGg6NDsJLy8gMTogMVQsIDI6IDJUCi0JCVVTSE9SVCAgICAgIFJmSWNUeXBlOjQ7ICAgICAgICAgICAgIC8vIHNlZSBFMlBST00gZG9jdW1lbnQKLQkJVVNIT1JUICAgICAgUnN2OjQ7Ci0JfQlmaWVsZDsKLQlVU0hPUlQJCQl3b3JkOwotfQlFRVBST01fQU5URU5OQV9TVFJVQywgKlBFRVBST01fQU5URU5OQV9TVFJVQzsKLSNlbmRpZgotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbiBfRUVQUk9NX05JQ19DSU5GSUcyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVU0hPUlQJCURBQ1Rlc3RCaXQ6MTsJCQkvLyBjb250cm9sIGlmIGRyaXZlciBzaG91bGQgcGF0Y2ggdGhlIERBQyBpc3N1ZQotCQlVU0hPUlQJCVJzdjI6MzsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCUFudERpdmVyc2l0eToxOwkJCS8vIEFudGVubmEgZGl2ZXJzaXR5Ci0JCVVTSE9SVAkJUnN2MToxOwkJCQkJLy8gbXVzdCBiZSAwCi0JCVVTSE9SVAkJQlc0ME1BdmFpbEZvckE6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCi0JCVVTSE9SVAkJQlc0ME1BdmFpbEZvckc6MTsJCQkvLyAwOmVuYWJsZSwgMTpkaXNhYmxlCi0JCVVTSE9SVAkJRW5hYmxlV1BTUEJDOjE7ICAgICAgICAgICAgICAgICAvLyBXUFMgUEJDIENvbnRyb2wgYml0Ci0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckE6MTsKLQkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yRzoxOwotCQlVU0hPUlQJCUNhcmRidXNBY2NlbGVyYXRpb246MTsJLy8gISEhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JBOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgNUcKLQkJVVNIT1JUCQlFeHRlcm5hbExOQUZvckc6MTsJCQkvLyBleHRlcm5hbCBMTkEgZW5hYmxlIGZvciAyLjRHCi0JCVVTSE9SVAkJRHluYW1pY1R4QWdjQ29udHJvbDoxOwkJCS8vCi0JCVVTSE9SVAkJSGFyZHdhcmVSYWRpb0NvbnRyb2w6MTsJLy8gV2hldGhlciBSRiBpcyBjb250cm9sbGVkIGJ5IGRyaXZlciBvciBIVy4gMTplbmFibGUgaHcgY29udHJvbCwgMDpkaXNhYmxlCi0JfQlmaWVsZDsKLQlVU0hPUlQJCQl3b3JkOwotfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24gX0VFUFJPTV9OSUNfQ0lORklHMl9TVFJVQwl7Ci0Jc3RydWN0IHsKLQkJVVNIT1JUCQlIYXJkd2FyZVJhZGlvQ29udHJvbDoxOwkvLyAxOmVuYWJsZSwgMDpkaXNhYmxlCi0JCVVTSE9SVAkJRHluYW1pY1R4QWdjQ29udHJvbDoxOwkJCS8vCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JHOjE7CQkJCS8vCi0JCVVTSE9SVAkJRXh0ZXJuYWxMTkFGb3JBOjE7CQkJLy8gZXh0ZXJuYWwgTE5BIGVuYWJsZSBmb3IgMi40RwotCQlVU0hPUlQJCUNhcmRidXNBY2NlbGVyYXRpb246MTsJLy8gISEhIE5PVEU6IDAgLSBlbmFibGUsIDEgLSBkaXNhYmxlCi0JCVVTSE9SVAkJQlc0ME1TaWRlYmFuZEZvckc6MTsKLQkJVVNIT1JUCQlCVzQwTVNpZGViYW5kRm9yQToxOwotCQlVU0hPUlQJCUVuYWJsZVdQU1BCQzoxOyAgICAgICAgICAgICAgICAgLy8gV1BTIFBCQyBDb250cm9sIGJpdAotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JHOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCUJXNDBNQXZhaWxGb3JBOjE7CQkJLy8gMDplbmFibGUsIDE6ZGlzYWJsZQotCQlVU0hPUlQJCVJzdjE6MTsJCQkJCS8vIG11c3QgYmUgMAotCQlVU0hPUlQJCUFudERpdmVyc2l0eToxOwkJCS8vIEFudGVubmEgZGl2ZXJzaXR5Ci0JCVVTSE9SVAkJUnN2MjozOwkJCQkJLy8gbXVzdCBiZSAwCi0JCVVTSE9SVAkJREFDVGVzdEJpdDoxOwkJCS8vIGNvbnRyb2wgaWYgZHJpdmVyIHNob3VsZCBwYXRjaCB0aGUgREFDIGlzc3VlCi0JfQlmaWVsZDsKLQlVU0hPUlQJCQl3b3JkOwotfQlFRVBST01fTklDX0NPTkZJRzJfU1RSVUMsICpQRUVQUk9NX05JQ19DT05GSUcyX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBUWF9QV1IgVmFsdWUgdmFsaWQgcmFuZ2UgMHhGQSgtNikgfiAweDI0KDM2KQotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVFhfUFdSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlDSEFSCUJ5dGUxOwkJCQkvLyBIaWdoIEJ5dGUKLQkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fVFhfUFdSX1NUUlVDLCAqUEVFUFJPTV9UWF9QV1JfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX1RYX1BXUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJQ0hBUglCeXRlMDsJCQkJLy8gTG93IEJ5dGUKLQkJQ0hBUglCeXRlMTsJCQkJLy8gSGlnaCBCeXRlCi0JfQlmaWVsZDsKLQlVU0hPUlQJd29yZDsKLX0JRUVQUk9NX1RYX1BXUl9TVFJVQywgKlBFRVBST01fVFhfUFdSX1NUUlVDOwotI2VuZGlmCi0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKLQkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9FRVBST01fVkVSU0lPTl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJRmFlUmVsZWFzZU51bWJlcjsJLy8gTG93IEJ5dGUKLQkJVUNIQVIJVmVyc2lvbjsJCQkvLyBIaWdoIEJ5dGUKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fVkVSU0lPTl9TVFJVQywgKlBFRVBST01fVkVSU0lPTl9TVFJVQzsKLSNlbmRpZgotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKLQkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT180OjE7CS8vIFBvbGFyaXR5IEdQSU8jNCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMjoxOwkvLyBQb2xhcml0eSBHUElPIzIgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18xOjE7CS8vIFBvbGFyaXR5IEdQSU8jMSBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUFDVDoxOwkJLy8gUG9sYXJpdHkgQUNUIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlSRFlfRzoxOwkJLy8gUG9sYXJpdHkgUkRZX0cgc2V0dGluZy4KLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfRUVQUk9NX0xFRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVVNIT1JUCVBvbGFyaXR5UkRZX0c6MTsJCS8vIFBvbGFyaXR5IFJEWV9HIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eVJEWV9BOjE7CQkvLyBQb2xhcml0eSBSRFlfQSBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlBQ1Q6MTsJCS8vIFBvbGFyaXR5IEFDVCBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzA6MTsJLy8gUG9sYXJpdHkgR1BJTyMwIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fMToxOwkvLyBQb2xhcml0eSBHUElPIzEgc2V0dGluZy4KLQkJVVNIT1JUCVBvbGFyaXR5R1BJT18yOjE7CS8vIFBvbGFyaXR5IEdQSU8jMiBzZXR0aW5nLgotCQlVU0hPUlQJUG9sYXJpdHlHUElPXzM6MTsJLy8gUG9sYXJpdHkgR1BJTyMzIHNldHRpbmcuCi0JCVVTSE9SVAlQb2xhcml0eUdQSU9fNDoxOwkvLyBQb2xhcml0eSBHUElPIzQgc2V0dGluZy4KLQkJVVNIT1JUCUxlZE1vZGU6NTsJCQkvLyBMZWQgbW9kZS4KLQkJVVNIT1JUCVJzdmQ6MzsJCQkJLy8gUmVzZXJ2ZWQKLQl9CWZpZWxkOwotCVVTSE9SVAl3b3JkOwotfQlFRVBST01fTEVEX1NUUlVDLCAqUEVFUFJPTV9MRURfU1RSVUM7Ci0jZW5kaWYKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUglUeFBvd2VyRW5hYmxlOjE7Ly8gRW5hYmxlCi0JCVVDSEFSCVR5cGU6MTsJCQkvLyAxOiBwbHVzIHRoZSBkZWx0YSB2YWx1ZSwgMDogbWludXMgdGhlIGRlbHRhIHZhbHVlCi0JCVVDSEFSCURlbHRhVmFsdWU6NjsJLy8gVHggUG93ZXIgZGFsdGEgdmFsdWUgKE1BWD00KQotCX0JZmllbGQ7Ci0JVUNIQVIJdmFsdWU7Ci19CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUglEZWx0YVZhbHVlOjY7CS8vIFR4IFBvd2VyIGRhbHRhIHZhbHVlIChNQVg9NCkKLQkJVUNIQVIJVHlwZToxOwkJCS8vIDE6IHBsdXMgdGhlIGRlbHRhIHZhbHVlLCAwOiBtaW51cyB0aGUgZGVsdGEgdmFsdWUKLQkJVUNIQVIJVHhQb3dlckVuYWJsZToxOy8vIEVuYWJsZQotCX0JZmllbGQ7Ci0JVUNIQVIJdmFsdWU7Ci19CUVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDLCAqUEVFUFJPTV9UWFBPV0VSX0RFTFRBX1NUUlVDOwotI2VuZGlmCi0KLSNlbmRpZgkvLyBfX1JUTVBfQ0hJUF9IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF9kZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViNzM5ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgTW9kdWxlIE5hbWU6Ci0gICAgcnRtcF9kZWYuaAotCi0gICAgQWJzdHJhY3Q6Ci0gICAgTWluaXBvcnQgcmVsYXRlZCBkZWZpbml0aW9uIGhlYWRlcgotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBQYXVsIExpbiAgICAwOC0wMS0yMDAyICAgIGNyZWF0ZWQKLSAgICBKb2huIENoYW5nICAwOC0wNS0yMDAzICAgIGFkZCBkZWZpbml0aW9uIGZvciAxMWcgJiBvdGhlciBkcmFmdHMKLSovCi0jaWZuZGVmIF9fUlRNUF9ERUZfSF9fCi0jZGVmaW5lIF9fUlRNUF9ERUZfSF9fCi0KLSNpbmNsdWRlICJvaWQuaCIKLQotI3VuZGVmIEFQX1dTQ19JTkNMVURFRAotI3VuZGVmIFNUQV9XU0NfSU5DTFVERUQKLSN1bmRlZiBXU0NfSU5DTFVERUQKLQotCi0jaWZkZWYgQ09ORklHX1NUQV9TVVBQT1JUCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZiBkZWZpbmVkKEFQX1dTQ19JTkNMVURFRCkgfHwgZGVmaW5lZChTVEFfV1NDX0lOQ0xVREVEKQotI2RlZmluZSBXU0NfSU5DTFVERUQKLSNlbmRpZgotLy8KLS8vICBEZWJ1ZyBpbmZvcm1hdGlvbiB2ZXJib3NpdHk6IGxvd2VyIHZhbHVlcyBpbmRpY2F0ZSBoaWdoZXIgdXJnZW5jeQotLy8KLSNkZWZpbmUgUlRfREVCVUdfT0ZGICAgICAgICAwCi0jZGVmaW5lIFJUX0RFQlVHX0VSUk9SICAgICAgMQotI2RlZmluZSBSVF9ERUJVR19XQVJOICAgICAgIDIKLSNkZWZpbmUgUlRfREVCVUdfVFJBQ0UgICAgICAzCi0jZGVmaW5lIFJUX0RFQlVHX0lORk8gICAgICAgNAotI2RlZmluZSBSVF9ERUJVR19MT1VEICAgICAgIDUKLQotI2RlZmluZSBOSUNfVEFHICAgICAgICAgICAgICgoVUxPTkcpJzA2ODInKQotI2RlZmluZSBOSUNfREJHX1NUUklORyAgICAgICgiKipSVDI4eHgqKiIpCi0KLSNpZmRlZiBTTk1QX1NVUFBPUlQKLS8vIGZvciBzbm1wCi0vLyB0byBnZXQgbWFudWZhY3R1cmVyIE9VSSwga2F0aHksIDIwMDhfMDIyMAotI2RlZmluZSBNYW51ZmFjdHVyZXJPVUlfTEVOCQkJMwotI2RlZmluZSBNYW51ZmFjdHVyZXJOQU1FCQkJKCJSYWxpbmsgVGVjaG5vbG9neSBDb21wYW55LiIpCi0jZGVmaW5lCVJlc291cmNlVHlwZUlkTmFtZQkJCSgiUmFsaW5rX0lEIikKLSNlbmRpZgotCi0KLS8vI2RlZmluZSBQQUNLRUQKLQotI2RlZmluZSBSQUxJTktfMjg4M19WRVJTSU9OCQkoKFVJTlQzMikweDI4ODMwMzAwKQotI2RlZmluZSBSQUxJTktfMjg4MEVfVkVSU0lPTgkoKFVJTlQzMikweDI4NzIwMjAwKQotI2RlZmluZSBSQUxJTktfMzA3MF9WRVJTSU9OCQkoKFVJTlQzMikweDMwNzAwMjAwKQotCi0jZGVmaW5lIE1BWF9SWF9QS1RfTEVOCTE1MjAKLQotLy8KLS8vIEVudHJ5IG51bWJlciBmb3IgZWFjaCBETUEgZGVzY3JpcHRvciByaW5nCi0vLwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0jZGVmaW5lIFRYX1JJTkdfU0laRSAgICAgICAgICAgIDY0IC8vNjQKLSNkZWZpbmUgTUdNVF9SSU5HX1NJWkUgICAgICAgICAgMTI4Ci0jZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAgICAgIDEyOCAvLzY0Ci0jZGVmaW5lIE1BWF9UWF9QUk9DRVNTICAgICAgICAgIFRYX1JJTkdfU0laRSAvLzgKLSNkZWZpbmUgTUFYX0RNQV9ET05FX1BST0NFU1MgICAgVFhfUklOR19TSVpFCi0jZGVmaW5lIE1BWF9UWF9ET05FX1BST0NFU1MgICAgIFRYX1JJTkdfU0laRSAvLzgKLSNkZWZpbmUgTE9DQUxfVFhCVUZfU0laRSAgICAgICAgMgotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0jZGVmaW5lIFBDSV9WSVJUX1RPX1BIWVMoX19BZGRyKQkoKChVSU5UMzIpKF9fQWRkcikpICYgMHgwRkZGRkZGRikKLQotCi0jaWZkZWYgTVVMVElQTEVfQ0FSRF9TVVBQT1JUCi0vLyBNQzogTXVsdHBsZSBDYXJkcwotI2RlZmluZSBNQVhfTlVNX09GX01VTFRJUExFX0NBUkQJCTMyCi0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgTUFYX1JYX1BST0NFU1MgICAgICAgICAgMTI4IC8vNjQgLy8zMgotI2RlZmluZSBOVU1fT0ZfTE9DQUxfVFhCVUYgICAgICAyCi0jZGVmaW5lIFRYRF9TSVpFICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFRYV0lfU0laRSAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIFJYRF9TSVpFCQkxNgotI2RlZmluZSBSWFdJX1NJWkUJCTE2Ci0vLyBUWElORk9fU0laRSArIFRYV0lfU0laRSArIDgwMi4xMSBIZWFkZXIgU2l6ZSArIEFNU0RVIHN1YiBmcmFtZSBoZWFkZXIKLSNkZWZpbmUgVFhfRE1BXzFTVF9CVUZGRVJfU0laRSAgOTYgICAgLy8gb25seSB0aGUgMXN0IHBoeXNpY2FsIGJ1ZmZlciBpcyBwcmUtYWxsb2NhdGVkCi0jZGVmaW5lIE1HTVRfRE1BX0JVRkZFUl9TSVpFICAgIDE1MzYgLy8yMDQ4Ci0jZGVmaW5lIFJYX0JVRkZFUl9BR0dSRVNJWkUgICAgIDM4NDAgLy8zOTA0IC8vMzk2OCAvLzQwOTYgLy8yMDQ4IC8vNDA5NgotI2RlZmluZSBSWF9CVUZGRVJfTk9STVNJWkUgICAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2IC8vMjA0OCAvLzQwOTYKLSNkZWZpbmUgVFhfQlVGRkVSX05PUk1TSVpFCQlSWF9CVUZGRVJfTk9STVNJWkUKLSNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgMjM0NiAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSA4MDIuMTEgZnJhbWUgc2l6ZQotI2RlZmluZSBNQVhfQUdHUkVHQVRJT05fU0laRSAgICAzODQwIC8vMzkwNCAvLzM5NjggLy80MDk2Ci0jZGVmaW5lIE1BWF9OVU1fT0ZfVFVQTEVfQ0FDSEUgIDIKLSNkZWZpbmUgTUFYX01DQVNUX0xJU1RfU0laRSAgICAgMzIKLSNkZWZpbmUgTUFYX0xFTl9PRl9WRU5ET1JfREVTQyAgNjQKLS8vI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAoTlVNX09GX0xPQ0FMX1RYQlVGID4+IDIpIC8vIEFQIHdvbid0IHNwZW5kIG1vcmUgdGhhbiAxLzQgb2YgdG90YWwgYnVmZmVycyBvbiBNL0JDQVNUIFBTUQotI2RlZmluZSBNQVhfU0laRV9PRl9NQ0FTVF9QU1EgICAgICAgICAgICAgICAzMgotCi0jZGVmaW5lIE1BWF9SWF9QUk9DRVNTX0NOVAkoUlhfUklOR19TSVpFKQotCi0KLS8qCi0JV01NIE5vdGU6IElmIG1lbW9yeSBvZiB5b3VyIHN5c3RlbSBpcyBub3QgbXVjaCwgcGxlYXNlIHJlZHVjZSB0aGUgZGVmaW5pdGlvbjsKLQlvciB3aGVuIHlvdSBkbyBXTU0gdGVzdCwgdGhlIHF1ZXVlIGZvciBsb3cgcHJpb3JpdHkgQUMgd2lsbCBiZSBmdWxsLCBpLmUuCi0JVFhfUklOR19TSVpFICsgTUFYX1BBQ0tFVFNfSU5fUVVFVUUgcGFja2V0cyBmb3IgdGhlIEFDIHdpbGwgYmUgYnVmZmVyZWQgaW4KLQlXTEFOLCBtYXliZSBubyBhbnkgcGFja2V0IGJ1ZmZlciBjYW4gYmUgZ290IGluIEV0aGVybmV0IGRyaXZlci4KLQotCVNvbWV0aW1lcyBubyBwYWNrZXQgYnVmZmVyIGNhbiBiZSBnb3QgaW4gRXRoZXJuZXQgZHJpdmVyLCB0aGUgc3lzdGVtIHdpbGwKLQlzZW5kIGZsb3cgY29udHJvbCBwYWNrZXQgdG8gdGhlIHNlbmRlciB0byBzbG93IGRvd24gaXRzIHNlbmRpbmcgcmF0ZS4KLQlTbyBubyBXTU0gY2FuIGJlIHNhdyBpbiB0aGUgYWlyLgotKi8KLQotLyoKLQlOZWVkIHRvIHVzZSA2NCBpbiB2eHdvcmtzIGZvciB0ZXN0IGNhc2UgV01NIEE1LVQwNwotCVR3byBkbmxpbmsgKDEwTWJwcykgZnJvbSBhIFdNTSBzdGF0aW9uIHRvIGEgbm9uLVdNTSBzdGF0aW9uLgotCUlmIHVzZSAyNTYsIHF1ZXVlIGlzIG5vdCBlbm91Z2guCi0JQW5kIGluIHJ0X21haW5fZW5kLmMsIGNsQ29uZmlnLmNsTnVtID0gUlhfUklOR19TSVpFICogMzsgaXMgY2hhbmdlZCB0bwotCWNsQ29uZmlnLmNsTnVtID0gUlhfUklOR19TSVpFICogNDsKLSovCi0vLyBUT0RPOiBGb3IgVnhXb3JrcyB0aGUgc2l6ZSBpcyAyNTYuIFNoYWxsIHdlIGNhaG5nZSB0aGUgdmFsdWUgYXMgMjU2IGZvciBhbGwgT1M/Pz8/PwotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9RVUVVRQkJCQkoNTEyKSAvLyg1MTIpICAgIC8vIHRvIHBhc3MgV01NIEE1LVdQQVBTSwotCi0jZGVmaW5lIE1BWF9QQUNLRVRTX0lOX01DQVNUX1BTX1FVRVVFCQkzMgotI2RlZmluZSBNQVhfUEFDS0VUU19JTl9QU19RVUVVRQkJCQkxMjgJLy8zMgotI2RlZmluZSBXTU1fTlVNX09GX0FDICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBBQzAsIEFDMSwgQUMyLCBhbmQgQUMzICovCi0KLQotI2lmZGVmIFJUTVBfRUZVU0VfU1VQUE9SVAotLy8yMDA4LzA5LzExOktIIGFkZCB0byBzdXBwb3J0IGVmdXNlPC0tCi0jZGVmaW5lIE1BWF9FRVBST01fQklOX0ZJTEVfU0laRQkJCQkxMDI0Ci0jZGVmaW5lIEVGVVNFX0JVRkZFUl9QQVRICQkJCQkJIi90bXAvUlQzMHh4RUVQUk9NLmJpbiIKLS8vMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZS0tPgotI2VuZGlmIC8vIFJUTVBfRUZVU0VfU1VQUE9SVCAvLwotCi0vLyBSeEZpbHRlcgotI2RlZmluZSBTVEFOT1JNQUwJIDB4MTdmOTcKLSNkZWZpbmUgQVBOT1JNQUwJIDB4MTVmOTcKLSNkZWZpbmUgUFNQWExJTksJIDB4MTdmOTMKLS8vCi0vLyAgUlRNUF9BREFQVEVSIGZsYWdzCi0vLwotI2RlZmluZSBmUlRNUF9BREFQVEVSX01BUF9SRUdJU1RFUiAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUiAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1NDQVRURVJfR0FUSEVSICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIGZSVE1QX0FEQVBURVJfU0VORF9QQUNLRVRfRVJST1IgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9NTE1FX1JFU0VUX0lOX1BST0dSRVNTIDB4MDAwMDAwMjAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTklDX05PVF9FWElTVCAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9UWF9SSU5HX0FMTE9DQVRFRCAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1JFTU9WRV9JTl9QUk9HUkVTUyAgICAweDAwMDAwNDAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUlNT1JBVEVfSU5VU0VEICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9SWF9SSU5HX0FMTE9DQVRFRCAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9BQ1RJVkUgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MgIDB4MDAwMDQwMDAKLSNkZWZpbmUJZlJUTVBfQURBUFRFUl9SRUFTU09DX0lOX1BST0dSRVNTCTB4MDAwMDgwMDAKLSNkZWZpbmUJZlJUTVBfQURBUFRFUl9NRURJQV9TVEFURV9QRU5ESU5HCTB4MDAwMTAwMDAKLSNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19PRkYJCQkJMHgwMDAyMDAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX0JVTEtPVVRfUkVTRVQJCQkweDAwMDQwMDAwCi0jZGVmaW5lCWZSVE1QX0FEQVBURVJfQlVMS0lOX1JFU0VUCQkJMHgwMDA4MDAwMAotI2RlZmluZSBmUlRNUF9BREFQVEVSX1JER19BQ1RJVkUJCQkweDAwMTAwMDAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfRFlOQU1JQ19CRV9UWE9QX0FDVElWRSAweDAwMjAwMDAwCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfU0NBTl8yMDQwCQkJCTB4MDQwMDAwMDAKLSNkZWZpbmUJZlJUTVBfQURBUFRFUl9SQURJT19NRUFTVVJFTUVOVAkJMHgwODAwMDAwMAotCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfU1RBUlRfVVAJCQkweDEwMDAwMDAwCS8vRGV2aXZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYW5kIGVuYWJsZWQgVHgvUnguCi0jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUVESUFfU1RBVEVfQ0hBTkdFICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRiAgICAgICAgMHg0MDAwMDAwMAotCi0vLyBMb2NrIGJpdCBmb3IgYWNjZXNzaW5nIGRpZmZlcmVudCByaW5nIGJ1ZmZlcnMKLS8vI2RlZmluZSBmUlRNUF9BREFQVEVSX1RYX1JJTkdfQlVTWSAgICAgICAgMHg4MDAwMDAwMAotLy8jZGVmaW5lIGZSVE1QX0FEQVBURVJfTUdNVF9SSU5HX0JVU1kgICAgICAweDQwMDAwMDAwCi0vLyNkZWZpbmUgZlJUTVBfQURBUFRFUl9BVElNX1JJTkdfQlVTWSAgICAgIDB4MjAwMDAwMDAKLS8vI2RlZmluZSBmUlRNUF9BREFQVEVSX1JYX1JJTkdfQlVTWSAgICAgICAgMHgxMDAwMDAwMAotCi0vLyBMb2NrIGJpdCBmb3IgYWNjZXNzaW5nIGRpZmZlcmVudCBxdWV1ZQotLy8jZGVmaW5lICAgZlJUTVBfQURBUFRFUl9UWF9RVUVVRV9CVVNZICAgICAweDA4MDAwMDAwCi0vLyNkZWZpbmUgICBmUlRNUF9BREFQVEVSX01HTVRfUVVFVUVfQlVTWSAgIDB4MDQwMDAwMDAKLQotLy8KLS8vICBTVEEgb3BlcmF0aW9uIHN0YXR1cyBmbGFncwotLy8KLSNkZWZpbmUgZk9QX1NUQVRVU19JTkZSQV9PTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBmT1BfU1RBVFVTX0FESE9DX09OICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgZk9QX1NUQVRVU19TSE9SVF9TTE9UX0lOVVNFRCAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCAgICAweDAwMDAwMDEwCi0jZGVmaW5lIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNICAgICAgICAgICAgIDB4MDAwMDAwMjAKLS8vI2RlZmluZSBmT1BfU1RBVFVTX1RYX1JBVEVfU1dJVENIX0VOQUJMRUQgICAweDAwMDAwMDQwCi0jZGVmaW5lIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgZk9QX1NUQVRVU19XTU1fSU5VU0VEICAgICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIGZPUF9TVEFUVVNfRE9aRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgIC8vIGRlYnVnIHB1cnBvc2UKLSNkZWZpbmUgZk9QX1NUQVRVU19QSUdHWUJBQ0tfSU5VU0VEICAgICAgICAgMHgwMDAwMDgwMCAgLy8gcGlnZ3ktYmFjaywgYW5kIGFnZ3JlZ2F0aW9uCi0jZGVmaW5lIGZPUF9TVEFUVVNfQVBTRF9JTlVTRUQJCQkJMHgwMDAwMTAwMAotI2RlZmluZSBmT1BfU1RBVFVTX1RYX0FNU0RVX0lOVVNFRAkJCTB4MDAwMDIwMDAKLSNkZWZpbmUgZk9QX1NUQVRVU19NQVhfUkVUUllfRU5BQkxFRAkJMHgwMDAwNDAwMAotI2RlZmluZSBmT1BfU1RBVFVTX1dBS0VVUF9OT1cgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UgICAgICAgMHgwMDAyMDAwMAotCi0vLwotLy8gIFJUTVBfQURBUFRFUiBQU0ZsYWdzIDogcmVsYXRlZCB0byBhZHZhbmNlZCBwb3dlciBzYXZlLgotLy8KLS8vIEluZGljYXRlIHdoZXRoZXIgZHJpdmVyIGNhbiBnbyB0byBzbGVlcCBtb2RlIGZyb20gbm93LiBUaGlzIGZsYWcgaXMgdXNlZnVsIEFGVEVSIGxpbmsgdXAKLSNkZWZpbmUgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQICAgICAgICAgIDB4MDAwMDAwMDEKLS8vIEluZGljYXRlIHdoZXRoZXIgZHJpdmVyIGhhcyBpc3N1ZSBhIExpbmtDb250cm9sIGNvbW1hbmQgdG8gUENJZSBMMQotI2RlZmluZSBmUlRNUF9QU19TRVRfUENJX0NMS19PRkZfQ09NTUFORCAgICAgICAgICAweDAwMDAwMDAyCi0vLyBJbmRpY2F0ZSBkcml2ZXIgc2hvdWxkIGRpc2FibGUga2ljayBvZmYgaGFyZHdhcmUgdG8gc2VuZCBwYWNrZXRzIGZyb20gbm93LgotI2RlZmluZSBmUlRNUF9QU19ESVNBQkxFX1RYICAgICAgICAgMHgwMDAwMDAwNAotLy8gSW5kaWNhdGUgZHJpdmVyIHNob3VsZCBJTU1FRElBVEVMWSBmbyB0byBzbGVlcCBhZnRlciByZWNlaXZpbmcgQVAncyBiZWFjb24gaW4gd2hpY2ggIGRvZXNuJ3QgaW5kaWNhdGUgdW5pY2F0ZSBub3IgbXVsdGljYXN0IHBhY2tldHMgZm9yIG1lCi0vLy4gVGhpcyBmbGFnIGlzIHVzZWQgT05MWSBpbiBSVE1QSGFuZGxlUnhEb25lSW50ZXJydXB0IHJvdXRpbmUuCi0jZGVmaW5lIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgZlJUTVBfUFNfVE9HR0xFX0wxCQkweDAwMDAwMDEwCS8vIFVzZSBUb2dnbGUgTDEgbWVjaGFuaXNtIGZvciBydDI4eHggUENJZQotI2lmZGVmIFJUMzA5MAotI2RlZmluZSBXQUtFX01DVV9DTUQJCQkJMHgzMQotI2RlZmluZSBTTEVFUF9NQ1VfQ01ECQkJCQkweDMwCi0jZGVmaW5lIFJGT0ZGX01DVV9DTUQJCQkJMHgzNQotI2VuZGlmIC8vIFJUMzA5MCAvLwotI2lmZGVmIERPVDExTl9EUkFGVDMKLSNkZWZpbmUgZk9QX1NUQVRVU19TQ0FOXzIwNDAJCQkgICAgMHgwMDA0MDAwMAotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotI2RlZmluZSBDQ0tTRVRQUk9URUNUCQkweDEKLSNkZWZpbmUgT0ZETVNFVFBST1RFQ1QJCTB4MgotI2RlZmluZSBNTTIwU0VUUFJPVEVDVAkJMHg0Ci0jZGVmaW5lIE1NNDBTRVRQUk9URUNUCQkweDgKLSNkZWZpbmUgR0YyMFNFVFBST1RFQ1QJCTB4MTAKLSNkZWZpbmUgR1I0MFNFVFBST1RFQ1QJCTB4MjAKLSNkZWZpbmUgQUxMTl9TRVRQUk9URUNUCQkoR1I0MFNFVFBST1RFQ1QgfCBHRjIwU0VUUFJPVEVDVCB8IE1NNDBTRVRQUk9URUNUIHwgTU0yMFNFVFBST1RFQ1QpCi0KLS8vCi0vLyAgQVAncyBjbGllbnQgdGFibGUgb3BlcmF0aW9uIHN0YXR1cyBmbGFncwotLy8KLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUgICAgICAgICAgMHgwMDAwMDAwMSAgLy8gQ0xJRU5UIGNhbiBwYXJzZSBRT1MgREFUQSBmcmFtZQotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFICAweDAwMDAwMDAyICAvLyBDTElFTlQgY2FuIHJlY2VpdmUgUmFsaW5rJ3MgcHJvcHJpZXRhcnkgVFggYWdncmVnYXRpb24gZnJhbWUKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUgICAgMHgwMDAwMDAwNCAgLy8gQ0xJRU5UIHN1cHBvcnQgcGlnZ3ktYmFjawotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQJCQkweDAwMDAwMDA4Ci0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUJCTB4MDAwMDAwMTAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRQkJMHgwMDAwMDAyMAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19UeFNUQkNfQ0FQQUJMRQkJMHgwMDAwMDA0MAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRQkJMHgwMDAwMDA4MAotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRQkJCTB4MDAwMDAxMDAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfUkRHX0NBUEFCTEUJCQkweDAwMDAwMjAwCi0jZGVmaW5lIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUgIDB4MDAwMDA0MDAKLSNkZWZpbmUgZkNMSUVOVF9TVEFUVVNfQVBTRF9DQVBBQkxFICAgICAgICAgMHgwMDAwMDgwMCAgLyogVUFQU0QgU1RBVElPTiAqLwotCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19CU1NDT0VYSVNUX0NBUEFCTEUJMHgwMDAwMTAwMAotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLQotI2RlZmluZSBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVAkJMHgwMDEwMDAwMAotLy8KLS8vICBTVEEgY29uZmlndXJhdGlvbiBmbGFncwotLy8KLS8vI2RlZmluZSBmU1RBX0NGR19FTkFCTEVfVFhfQlVSU1QgICAgICAgICAgMHgwMDAwMDAwMQotCi0vLyA4MDIuMTFuIE9wZXJhdGluZyBNb2RlIERlZmluaXRpb24uIDAtMyBhbHNvIHVzZWQgaW4gQVNJQ1VQZGF0ZVByb3RlY3Qgc3dpdGNoIGNhc2UKLSNkZWZpbmUgSFRfTk9fUFJPVEVDVAkwCi0jZGVmaW5lIEhUX0xFR0FDWV9QUk9URUNUCTEKLSNkZWZpbmUgSFRfNDBfUFJPVEVDVAkyCi0jZGVmaW5lIEhUXzIwNDBfUFJPVEVDVAkzCi0jZGVmaW5lIEhUX1JUU0NUU182TQk3Ci0vL2ZvbGxvd2luZyBpcyBvdXIgb3duIGRlZmluaXRpb24gaW4gb3JkZXIgdG8gdHVybiBvbiBvdXIgQVNJQyBwcm90ZWN0aW9uIHJlZ2lzdGVyIGluIElORlJBU1RSVUNUVVJFLgotI2RlZmluZSBIVF9BVEhFUk9TCTgJLy8gcnQyODYwYyBoYXMgcHJvYmxlbSB3aXRoIGF0aGVyb3MgY2hpcC4gd2UgbmVlZCB0byB0dXJuIG9uIFJUUy9DVFMgLgotI2RlZmluZSBIVF9GT1JDRVJUU0NUUwk5CS8vIEZvcmNlIHR1cm4gb24gUlRTL0NUUyBmaXJzdC4gdGhlbiBnbyB0byBldmFsdWF0ZSBpZiB0aGlzIGZvcmNlIFJUUyBpcyBuZWNlc3NhcnkuCi0KLS8vCi0vLyBSWCBQYWNrZXQgRmlsdGVyIGNvbnRyb2wgZmxhZ3MuIEFwcGx5IG9uIHBBZC0+UGFja2V0RmlsdGVyCi0vLwotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9ESVJFQ1QgICAgICAgICAgICBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECi0jZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX01VTFRJQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfTVVMVElDQVNUCi0jZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0JST0FEQ0FTVCAgICAgICAgIE5ESVNfUEFDS0VUX1RZUEVfQlJPQURDQVNUCi0jZGVmaW5lIGZSWF9GSUxURVJfQUNDRVBUX0FMTF9NVUxUSUNBU1QgICAgIE5ESVNfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVAotI2RlZmluZSBmUlhfRklMVEVSX0FDQ0VQVF9QUk9NSVNDVU9VUyAgICAgICBORElTX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCi0KLS8vCi0vLyBFcnJvciBjb2RlIHNlY3Rpb24KLS8vCi0vLyBORElTX0VSUk9SX0NPREVfQURBUFRFUl9OT1RfRk9VTkQKLSNkZWZpbmUgRVJSTE9HX1JFQURfUENJX1NMT1RfRkFJTEVEICAgICAweDAwMDAwMTAxTAotI2RlZmluZSBFUlJMT0dfV1JJVEVfUENJX1NMT1RfRkFJTEVEICAgIDB4MDAwMDAxMDJMCi0jZGVmaW5lIEVSUkxPR19WRU5ET1JfREVWSUNFX05PTUFUQ0ggICAgMHgwMDAwMDEwM0wKLQotLy8gTkRJU19FUlJPUl9DT0RFX0FEQVBURVJfRElTQUJMRUQKLSNkZWZpbmUgRVJSTE9HX0JVU19NQVNURVJfRElTQUJMRUQgICAgICAweDAwMDAwMjAxTAotCi0vLyBORElTX0VSUk9SX0NPREVfVU5TVVBQT1JURURfQ09ORklHVVJBVElPTgotI2RlZmluZSBFUlJMT0dfSU5WQUxJRF9TUEVFRF9EVVBMRVggICAgIDB4MDAwMDAzMDFMCi0jZGVmaW5lIEVSUkxPR19TRVRfU0VDT05EQVJZX0ZBSUxFRCAgICAgMHgwMDAwMDMwMkwKLQotLy8gTkRJU19FUlJPUl9DT0RFX09VVF9PRl9SRVNPVVJDRVMKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAweDAwMDAwNDAxTAotI2RlZmluZSBFUlJMT0dfT1VUX09GX1NIQVJFRF9NRU1PUlkgICAgIDB4MDAwMDA0MDJMCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfTUFQX1JFR0lTVEVSUyAgICAgMHgwMDAwMDQwM0wKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9CVUZGRVJfUE9PTCAgICAgICAweDAwMDAwNDA0TAotI2RlZmluZSBFUlJMT0dfT1VUX09GX05ESVNfQlVGRkVSICAgICAgIDB4MDAwMDA0MDVMCi0jZGVmaW5lIEVSUkxPR19PVVRfT0ZfUEFDS0VUX1BPT0wgICAgICAgMHgwMDAwMDQwNkwKLSNkZWZpbmUgRVJSTE9HX09VVF9PRl9ORElTX1BBQ0tFVCAgICAgICAweDAwMDAwNDA3TAotI2RlZmluZSBFUlJMT0dfT1VUX09GX0xPT0tBU0lERV9NRU1PUlkgIDB4MDAwMDA0MDhMCi0KLS8vIE5ESVNfRVJST1JfQ09ERV9IQVJEV0FSRV9GQUlMVVJFCi0jZGVmaW5lIEVSUkxPR19TRUxGVEVTVF9GQUlMRUQgICAgICAgICAgMHgwMDAwMDUwMUwKLSNkZWZpbmUgRVJSTE9HX0lOSVRJQUxJWkVfQURBUFRFUiAgICAgICAweDAwMDAwNTAyTAotI2RlZmluZSBFUlJMT0dfUkVNT1ZFX01JTklQT1JUICAgICAgICAgIDB4MDAwMDA1MDNMCi0KLS8vIE5ESVNfRVJST1JfQ09ERV9SRVNPVVJDRV9DT05GTElDVAotI2RlZmluZSBFUlJMT0dfTUFQX0lPX1NQQUNFICAgICAgICAgICAgIDB4MDAwMDA2MDFMCi0jZGVmaW5lIEVSUkxPR19RVUVSWV9BREFQVEVSX1JFU09VUkNFUyAgMHgwMDAwMDYwMkwKLSNkZWZpbmUgRVJSTE9HX05PX0lPX1JFU09VUkNFICAgICAgICAgICAweDAwMDAwNjAzTAotI2RlZmluZSBFUlJMT0dfTk9fSU5URVJSVVBUX1JFU09VUkNFICAgIDB4MDAwMDA2MDRMCi0jZGVmaW5lIEVSUkxPR19OT19NRU1PUllfUkVTT1VSQ0UgICAgICAgMHgwMDAwMDYwNUwKLQotCi0vLyBXRFMgZGVmaW5pdGlvbgotI2RlZmluZQlNQVhfV0RTX0VOVFJZICAgICAgICAgICAgICAgNAotI2RlZmluZSBXRFNfUEFJUldJU0VfS0VZX09GRlNFVCAgICAgNjAgICAgLy8gV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKLQotI2RlZmluZQlXRFNfRElTQUJMRV9NT0RFICAgICAgICAgICAgMAotI2RlZmluZQlXRFNfUkVTVFJJQ1RfTU9ERSAgICAgICAgICAgMQotI2RlZmluZQlXRFNfQlJJREdFX01PREUgICAgICAgICAgICAgMgotI2RlZmluZQlXRFNfUkVQRUFURVJfTU9ERSAgICAgICAgICAgMwotI2RlZmluZQlXRFNfTEFaWV9NT0RFICAgICAgICAgICAgICAgNAotCi0KLSNkZWZpbmUgTUFYX01FU0hfTlVNCQkJCTAKLQotI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTAKLSNpZmRlZiBBUENMSV9TVVBQT1JUCi0jdW5kZWYJTUFYX0FQQ0xJX05VTQotI2RlZmluZSBNQVhfQVBDTElfTlVNCQkJCTEKLSNlbmRpZiAvLyBBUENMSV9TVVBQT1JUIC8vCi0KLSNkZWZpbmUgTUFYX01CU1NJRF9OVU0JCQkJMQotI2lmZGVmIE1CU1NfU1VQUE9SVAotI3VuZGVmCU1BWF9NQlNTSURfTlVNCi0jZGVmaW5lIE1BWF9NQlNTSURfTlVNCQkJCSg4IC0gTUFYX01FU0hfTlVNIC0gTUFYX0FQQ0xJX05VTSkKLSNlbmRpZiAvLyBNQlNTX1NVUFBPUlQgLy8KLQotLyogc2FuaXR5IGNoZWNrIGZvciBhcGlkeCAqLwotI2RlZmluZSBNQlNTX01SX0FQSURYX1NBTklUWV9DSEVDSyhhcGlkeCkgXAotICAgIHsgaWYgKGFwaWR4ID4gTUFYX01CU1NJRF9OVU0pIHsgXAotICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIiVzPiBFcnJvciEgYXBpZHggPSAlZCA+IE1BWF9NQlNTSURfTlVNIVxuIiwgX19GVU5DVElPTl9fLCBhcGlkeCkpOyBcCi0JICBhcGlkeCA9IE1BSU5fTUJTU0lEOyB9IH0KLQotI2RlZmluZSBWQUxJRF9XQ0lEKF93Y2lkKQkoKF93Y2lkKSA+IDAgJiYgKF93Y2lkKSA8IE1BWF9MRU5fT0ZfTUFDX1RBQkxFICkKLQotI2RlZmluZSBNQUlOX01CU1NJRCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGSVJTVF9NQlNTSUQgICAgICAgICAgICAgICAgMQotCi0KLSNkZWZpbmUgTUFYX0JFQUNPTl9TSVpFCQkJCTUxMgotLy8gSWYgdGhlIE1BWF9NQlNTSURfTlVNIGlzIGxhcmdlciB0aGFuIDYsCi0vLyBpdCBzaGFsbCByZXNlcnZlIHNvbWUgV0NJRCBzcGFjZSh3Y2lkIDIyMn4yNTMpIGZvciBiZWFjb24gZnJhbWVzLgotLy8gLQl0aGVzZSB3Y2lkIDIzOH4yNTMgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNihyYTYpLgotLy8gLQl0aGVzZSB3Y2lkIDIyMn4yMzcgYXJlIHJlc2VydmVkIGZvciBiZWFjb24jNyhyYTcpLgotI2lmIGRlZmluZWQoTUFYX01CU1NJRF9OVU0pICYmIChNQVhfTUJTU0lEX05VTSA9PSA4KQotI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTIyMgotI2VsaWYgZGVmaW5lZChNQVhfTUJTU0lEX05VTSkgJiYgKE1BWF9NQlNTSURfTlVNID09IDcpCi0jZGVmaW5lIEhXX1JFU0VSVkVEX1dDSUQJMjM4Ci0jZWxzZQotI2RlZmluZSBIV19SRVNFUlZFRF9XQ0lECTI1NQotI2VuZGlmCi0KLS8vIFRoZW4gZGVkaWNhdGUgd2NpZCBvZiBERlMgYW5kIENhcnJpZXItU2Vuc2UuCi0jZGVmaW5lIERGU19DVFNfV0NJRAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAxKQotI2RlZmluZSBDU19DVFNfV0NJRAkJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQotI2RlZmluZSBMQVNUX1NQRUNJRklDX1dDSUQJKEhXX1JFU0VSVkVEX1dDSUQgLSAyKQotCi0vLyBJZiBNQVhfTUJTU0lEX05VTSBpcyA4LCB0aGUgbWF4aW11bSBhdmFpbGFibGUgd2NpZCBmb3IgdGhlIGFzc29jaWF0ZWQgU1RBIGlzIDIxMS4KLS8vIElmIE1BWF9NQlNTSURfTlVNIGlzIDcsIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSB3Y2lkIGZvciB0aGUgYXNzb2NpYXRlZCBTVEEgaXMgMjI4LgotI2RlZmluZSBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECShMQVNUX1NQRUNJRklDX1dDSUQgLSBNQVhfTUJTU0lEX05VTSAtIDEpCi0KLS8vIFRYIG5lZWQgV0NJRCB0byBmaW5kIENpcGhlciBLZXkKLS8vIHRoZXNlIHdjaWQgMjEyIH4gMjE5IGFyZSByZXNlcnZlZCBmb3IgYmMvbWMgcGFja2V0cyBpZiBNQVhfTUJTU0lEX05VTSBpcyA4LgotI2RlZmluZSBHRVRfR3JvdXBLZXlfV0NJRChfX3djaWQsIF9fYnNzaWR4KSBcCi0JewkJCQkJCQkJCQlcCi0JCV9fd2NpZCA9IExBU1RfU1BFQ0lGSUNfV0NJRCAtIChNQVhfTUJTU0lEX05VTSkgKyBfX2Jzc2lkeDsJXAotCX0KLQotI2RlZmluZSBJc0dyb3VwS2V5V0NJRChfX3djaWQpICgoKF9fd2NpZCkgPCBMQVNUX1NQRUNJRklDX1dDSUQpICYmICgoX193Y2lkKSA+PSAoTEFTVF9TUEVDSUZJQ19XQ0lEIC0gKE1BWF9NQlNTSURfTlVNKSkpKQotCi0KLS8vIGRlZmluaXRpb24gdG8gc3VwcG9ydCBtdWx0aXBsZSBCU1NJRAotI2RlZmluZSBCU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQlNTMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEJTUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBCU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQlNTNCAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEJTUzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBCU1M2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgQlNTNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3Ci0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIExlbmd0aCBkZWZpbml0aW9ucwotI2RlZmluZSBQRUVSX0tFWV9OTyAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUFDX0FERFJfTEVOICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFRJTUVTVEFNUF9MRU4gICAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyAgICAgIE1BWF9MRU5HVEhfT0ZfU1VQUE9SVF9SQVRFUyAvLyAxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0Ci0jZGVmaW5lIE1BWF9OVU1fT0ZfUkVHVUxBVE9SWV9DTEFTUwkJMTYKLSNkZWZpbmUgTUFYX0xFTl9PRl9LRVkgICAgICAgICAgICAgICAgICAzMiAgICAgIC8vIDMyIG9jdGV0cyA9PSAyNTYgYml0cywgUmVkZWZpbmUgZm9yIFdQQQotI2RlZmluZSBNQVhfTlVNX09GX0NIQU5ORUxTICAgICAgICAgICAgIE1BWF9OVU1fT0ZfQ0hTICAgICAgLy8gMTQgY2hhbm5lbHMgQDIuNEcgKyAgMTJAVU5JSSArIDQgQE1NQUMgKyAxMSBASGlwZXJMQU4yICsgNyBASmFwYW4gKyAxIGFzIE5VTEwgdGVybWluYXRpb24KLSNkZWZpbmUgTUFYX05VTV9PRl8xMUpDSEFOTkVMUyAgICAgICAgICAgICAyMCAgICAgIC8vIDE0IGNoYW5uZWxzIEAyLjRHICsgIDEyQFVOSUkgKyA0IEBNTUFDICsgMTEgQEhpcGVyTEFOMiArIDcgQEphcGFuICsgMSBhcyBOVUxMIHRlcm1pbmF0aW9uCi0jZGVmaW5lIE1BWF9MRU5fT0ZfU1NJRCAgICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgQ0lQSEVSX1RFWFRfTEVOICAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgTUFYX1ZJRV9MRU4gICAgICAgICAgICAgICAgICAgICAxMDI0ICAgLy8gTmV3IGZvciBXUEEgY2lwaGVyIHN1aXRlIHZhcmlhYmxlIElFIHNpemVzLgotI2RlZmluZSBNQVhfU1VQUE9SVF9NQ1MgICAgICAgICAgICAgMzIKLSNkZWZpbmUgTUFYX05VTV9PRl9CQlBfTEFUQ0ggICAgICAgICAgICAgMTQwCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQVNJQyBXQ0lEIFRhYmxlIGRlZmluaXRpb24uCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBCU1NJRF9XQ0lECQkxCS8vIGluIGluZnJhIG1vZGUsIGFsd2F5cyBwdXQgYnNzaWQgd2l0aCB0aGlzIFdDSUQKLSNkZWZpbmUgTUNBU1RfV0NJRAkweDAKLSNkZWZpbmUgQlNTME1jYXN0X1dDSUQJMHgwCi0jZGVmaW5lIEJTUzFNY2FzdF9XQ0lECTB4ZjgKLSNkZWZpbmUgQlNTMk1jYXN0X1dDSUQJMHhmOQotI2RlZmluZSBCU1MzTWNhc3RfV0NJRAkweGZhCi0jZGVmaW5lIEJTUzRNY2FzdF9XQ0lECTB4ZmIKLSNkZWZpbmUgQlNTNU1jYXN0X1dDSUQJMHhmYwotI2RlZmluZSBCU1M2TWNhc3RfV0NJRAkweGZkCi0jZGVmaW5lIEJTUzdNY2FzdF9XQ0lECTB4ZmUKLSNkZWZpbmUgUkVTRVJWRURfV0NJRAkJMHhmZgotCi0jZGVmaW5lIE1BWF9OVU1fT0ZfQUNMX0xJU1QJCQkJTUFYX05VTUJFUl9PRl9BQ0wKLQotI2RlZmluZSBNQVhfTEVOX09GX01BQ19UQUJMRSAgICAgICAgICAgIE1BWF9OVU1CRVJfT0ZfTUFDIC8vIGlmIE1BWF9NQlNTSURfTlVNIGlzIDgsIHRoaXMgdmFsdWUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gMjExCi0KLSNpZiBNQVhfTEVOX09GX01BQ19UQUJMRT5NQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lECi0jZXJyb3IgTUFYX0xFTl9PRl9NQUNfVEFCTEUgY2FuIG5vdCBiZSBsYXJnZXIgdGhhbiBNQVhfQVZBSUxBQkxFX0NMSUVOVF9XQ0lEISEhIQotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX05VTV9PRl9XRFNfTElOS19QRVJCU1NJRAkgICAgICAgICAgICAzCi0jZGVmaW5lIE1BWF9OVU1fT0ZfV0RTX0xJTksJICAgICAgICAgICAgKE1BWF9OVU1fT0ZfV0RTX0xJTktfUEVSQlNTSUQqTUFYX01CU1NJRF9OVU0pCi0jZGVmaW5lIE1BWF9OVU1fT0ZfRVZFTlQgICAgICAgICAgICAgICAgTUFYX05VTUJFUl9PRl9FVkVOVAotI2RlZmluZSBXRFNfTElOS19TVEFSVF9XQ0lECQkJCShNQVhfTEVOX09GX01BQ19UQUJMRS0xKQotCi0jZGVmaW5lIE5VTV9PRl9USUQJCQk4Ci0jZGVmaW5lIE1BWF9BSURfQkEgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUFYX0xFTl9PRl9CQV9SRUNfVEFCTEUgICAgICAgICAgKChOVU1fT0ZfVElEICogTUFYX0xFTl9PRl9NQUNfVEFCTEUpLzIpLy8gICAoTlVNX09GX1RJRCpNQVhfQUlEX0JBICsgMzIpCSAvL0Jsb2NrIEFDSyByZWNpcGllbnQKLSNkZWZpbmUgTUFYX0xFTl9PRl9CQV9PUklfVEFCTEUgICAgICAgICAgKChOVU1fT0ZfVElEICogTUFYX0xFTl9PRl9NQUNfVEFCTEUpLzIpLy8gICAoTlVNX09GX1RJRCpNQVhfQUlEX0JBICsgMzIpICAgLy8gQmxvY2sgQUNLIG9yaWdpbmF0b3IKLSNkZWZpbmUgTUFYX0xFTl9PRl9CU1NfVEFCTEUgICAgICAgICAgICAgNjQKLSNkZWZpbmUgTUFYX1JFT1JERVJJTkdfTVBEVV9OVU0JCQkgNTEyCi0KLS8vIGtleSByZWxhdGVkIGRlZmluaXRpb25zCi0jZGVmaW5lIFNIQVJFX0tFWV9OVU0gICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfTEVOX09GX1NIQVJFX0tFWSAgICAgICAgICAgIDE2ICAgIC8vIGJ5dGUgY291bnQKLSNkZWZpbmUgTUFYX0xFTl9PRl9QRUVSX0tFWSAgICAgICAgICAgICAxNiAgICAvLyBieXRlIGNvdW50Ci0jZGVmaW5lIFBBSVJXSVNFX0tFWV9OVU0gICAgICAgICAgICAgICAgNjQgICAgLy8gaW4gTUFDIEFTSUMgcGFpcndpc2Uga2V5IHRhYmxlCi0jZGVmaW5lIEdST1VQX0tFWV9OVU0gICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBQTUtfTEVOICAgICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIFdEU19QQUlSV0lTRV9LRVlfT0ZGU0VUICAgICAgICAgNjAgICAgLy8gV0RTIGxpbmtzIHVzZXMgcGFpcndpc2Uga2V5IzYwIH4gNjMgaW4gQVNJQyBwYWlyd2lzZSBrZXkgdGFibGUKLSNkZWZpbmUJUE1LSURfTk8gICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAvLyBOdW1iZXIgb2YgUE1LSUQgc2F2ZWQgc3VwcG9ydGVkCi0jZGVmaW5lIE1BWF9MRU5fT0ZfTUxNRV9CVUZGRVIgICAgICAgICAgMjA0OAotCi0vLyBwb3dlciBzdGF0dXMgcmVsYXRlZCBkZWZpbml0aW9ucwotI2RlZmluZSBQV1JfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUFdSX1NBVkUgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFBXUl9NTVBTICAgICAgICAgICAgICAgICAgICAgICAgMgkJCS8vTUlNTyBwb3dlciBzYXZlCi0vLyNkZWZpbmUgUFdSX1VOS05PV04gICAgICAgICAgICAgICAgICAgMgotCi0vLyBBdXRoIGFuZCBBc3NvYyBtb2RlIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSNkZWZpbmUgQVVUSF9NT0RFX09QRU4gICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIEFVVEhfTU9ERV9LRVkgICAgICAgICAgICAgICAgICAgMHgwMQotLy8jZGVmaW5lIEFVVEhfTU9ERV9BVVRPX1NXSVRDSCAgICAgICAgIDB4MDMKLS8vI2RlZmluZSBBVVRIX01PREVfREVBVVRIICAgICAgICAgICAgICAweDA0Ci0vLyNkZWZpbmUgQVVUSF9NT0RFX1VQTEFZRVIgICAgICAgICAgICAgMHgwNSAvLyByZXNlcnZlZCBmb3IgODAyLjExaSB1c2UKLQotLy8gQlNTIFR5cGUgZGVmaW5pdGlvbnMKLSNkZWZpbmUgQlNTX0FESE9DICAgICAgICAgICAgICAgICAgICAgICAwICAvLyA9IE5kaXM4MDJfMTFJQlNTCi0jZGVmaW5lIEJTU19JTkZSQSAgICAgICAgICAgICAgICAgICAgICAgMSAgLy8gPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUKLSNkZWZpbmUgQlNTX0FOWSAgICAgICAgICAgICAgICAgICAgICAgICAyICAvLyA9IE5kaXM4MDJfMTFBdXRvVW5rbm93bgotI2RlZmluZSBCU1NfTU9OSVRPUgkJCSAgICAgICAgICAgIDMgIC8vID0gTmRpczgwMl8xMU1vbml0b3IKLQotCi0vLyBSZWFzb24gY29kZSBkZWZpbml0aW9ucwotI2RlZmluZSBSRUFTT05fUkVTRVJWRUQgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVBU09OX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFJFQVNPTl9OT19MT05HRVJfVkFMSUQgICAgICAgICAgMgotI2RlZmluZSBSRUFTT05fREVBVVRIX1NUQV9MRUFWSU5HICAgICAgIDMKLSNkZWZpbmUgUkVBU09OX0RJU0FTU09DX0lOQUNUSVZFICAgICAgICA0Ci0jZGVmaW5lIFJFQVNPTl9ESVNBU1NQQ19BUF9VTkFCTEUgICAgICAgNQotI2RlZmluZSBSRUFTT05fQ0xTMkVSUiAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgUkVBU09OX0NMUzNFUlIgICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyAgICAgOAotI2RlZmluZSBSRUFTT05fU1RBX1JFUV9BU1NPQ19OT1RfQVVUSCAgIDkKLSNkZWZpbmUgUkVBU09OX0lOVkFMSURfSUUgICAgICAgICAgICAgICAxMwotI2RlZmluZSBSRUFTT05fTUlDX0ZBSUxVUkUgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFJFQVNPTl80X1dBWV9USU1FT1VUICAgICAgICAgICAgMTUKLSNkZWZpbmUgUkVBU09OX0dST1VQX0tFWV9IU19USU1FT1VUICAgICAxNgotI2RlZmluZSBSRUFTT05fSUVfRElGRkVSRU5UICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFJFQVNPTl9NQ0lQSEVSX05PVF9WQUxJRCAgICAgICAgMTgKLSNkZWZpbmUgUkVBU09OX1VDSVBIRVJfTk9UX1ZBTElEICAgICAgICAxOQotI2RlZmluZSBSRUFTT05fQUtNUF9OT1RfVkFMSUQgICAgICAgICAgIDIwCi0jZGVmaW5lIFJFQVNPTl9VTlNVUFBPUlRfUlNORV9WRVIgICAgICAgMjEKLSNkZWZpbmUgUkVBU09OX0lOVkFMSURfUlNORV9DQVAgICAgICAgICAyMgotI2RlZmluZSBSRUFTT05fODAyMVhfQVVUSF9GQUlMICAgICAgICAgIDIzCi0jZGVmaW5lIFJFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgICAgMjQKLSNkZWZpbmUgUkVBU09OX0RFQ0xJTkVEICAgICAgICAgICAgICAgICAzNwotCi0jZGVmaW5lIFJFQVNPTl9RT1NfVU5TUEVDSUZZICAgICAgICAgICAgICAzMgotI2RlZmluZSBSRUFTT05fUU9TX0xBQ0tfQkFORFdJRFRIICAgICAgICAgMzMKLSNkZWZpbmUgUkVBU09OX1BPT1JfQ0hBTk5FTF9DT05ESVRJT04gICAgIDM0Ci0jZGVmaW5lIFJFQVNPTl9RT1NfT1VUU0lERV9UWE9QX0xJTUlUSU9OICAzNQotI2RlZmluZSBSRUFTT05fUU9TX1FTVEFfTEVBVklOR19RQlNTICAgICAgMzYKLSNkZWZpbmUgUkVBU09OX1FPU19VTldBTlRFRF9NRUNIQU5JU00gICAgIDM3Ci0jZGVmaW5lIFJFQVNPTl9RT1NfTUVDSF9TRVRVUF9SRVFVSVJFRCAgICAzOAotI2RlZmluZSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVCAgICAgICAgMzkKLSNkZWZpbmUgUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQgICAgIDQ1Ci0KLS8vIFN0YXR1cyBjb2RlIGRlZmluaXRpb25zCi0jZGVmaW5lIE1MTUVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBNTE1FX1VOU1BFQ0lGWV9GQUlMICAgICAgICAgICAgIDEKLSNkZWZpbmUgTUxNRV9DQU5OT1RfU1VQUE9SVF9DQVAgICAgICAgICAxMAotI2RlZmluZSBNTE1FX1JFQVNTT0NfREVOWV9BU1NPQ19FWElTVCAgIDExCi0jZGVmaW5lIE1MTUVfQVNTT0NfREVOWV9PVVRfU0NPUEUgICAgICAgMTIKLSNkZWZpbmUgTUxNRV9BTEdfTk9UX1NVUFBPUlQgICAgICAgICAgICAxMwotI2RlZmluZSBNTE1FX1NFUV9OUl9PVVRfT0ZfU0VRVUVOQ0UgICAgIDE0Ci0jZGVmaW5lIE1MTUVfUkVKX0NIQUxMRU5HRV9GQUlMVVJFICAgICAgMTUKLSNkZWZpbmUgTUxNRV9SRUpfVElNRU9VVCAgICAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIE1MTUVfQVNTT0NfUkVKX1VOQUJMRV9IQU5ETEVfU1RBICAxNwotI2RlZmluZSBNTE1FX0FTU09DX1JFSl9EQVRBX1JBVEUgICAgICAgICAgMTgKLQotI2RlZmluZSBNTE1FX0FTU09DX1JFSl9OT19FWFRfUkFURSAgICAgICAgMjIKLSNkZWZpbmUgTUxNRV9BU1NPQ19SRUpfTk9fRVhUX1JBVEVfUEJDQyAgIDIzCi0jZGVmaW5lIE1MTUVfQVNTT0NfUkVKX05PX0NDS19PRkRNICAgICAgICAyNAotCi0jZGVmaW5lIE1MTUVfUU9TX1VOU1BFQ0lGWSAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBNTE1FX1JFUVVFU1RfREVDTElORUQgICAgICAgICAgICAgMzcKLSNkZWZpbmUgTUxNRV9SRVFVRVNUX1dJVEhfSU5WQUxJRF9QQVJBTSAgIDM4Ci0jZGVmaW5lIE1MTUVfSU5WQUxJRF9HUk9VUF9DSVBIRVIJICA0MQotI2RlZmluZSBNTE1FX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSCSAgNDIKLSNkZWZpbmUgTUxNRV9JTlZBTElEX0FLTVAJCQkgIDQzCi0jZGVmaW5lIE1MTUVfRExTX05PVF9BTExPV19JTl9RQlNTICAgICAgICA0OAotI2RlZmluZSBNTE1FX0RFU1RfU1RBX05PVF9JTl9RQlNTICAgICAgICAgNDkKLSNkZWZpbmUgTUxNRV9ERVNUX1NUQV9JU19OT1RfQV9RU1RBICAgICAgIDUwCi0KLSNkZWZpbmUgTUxNRV9JTlZBTElEX0ZPUk1BVCAgICAgICAgICAgICAweDUxCi0jZGVmaW5lIE1MTUVfRkFJTF9OT19SRVNPVVJDRSAgICAgICAgICAgMHg1MgotI2RlZmluZSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUICAgICAgIDB4NTMKLSNkZWZpbmUgTUxNRV9NQUNfVEFCTEVfRkFJTCAgICAgICAgICAgICAweDU0Ci0KLS8vIElFIGNvZGUKLSNkZWZpbmUgSUVfU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElFX1NVUFBfUkFURVMgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBJRV9GSF9QQVJNICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSUVfRFNfUEFSTSAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIElFX0NGX1BBUk0gICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBJRV9USU0gICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgSUVfSUJTU19QQVJNICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIElFX0NPVU5UUlkgICAgICAgICAgICAgICAgICAgICAgNyAgICAgLy8gODAyLjExZAotI2RlZmluZSBJRV84MDJfMTFEX1JFUVVFU1QgICAgICAgICAgICAgIDEwICAgIC8vIDgwMi4xMWQKLSNkZWZpbmUgSUVfUUJTU19MT0FEICAgICAgICAgICAgICAgICAgICAxMSAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX0VEQ0FfUEFSQU1FVEVSICAgICAgICAgICAgICAgMTIgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9UU1BFQyAgICAgICAgICAgICAgICAgICAgICAgIDEzICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVENMQVMgICAgICAgICAgICAgICAgICAgICAgICAxNCAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgMTUgICAgLy8gODAyLjExZSBkOQotI2RlZmluZSBJRV9DSEFMTEVOR0VfVEVYVCAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIElFX1BPV0VSX0NPTlNUUkFJTlQgICAgICAgICAgICAgMzIgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1BPV0VSX0NBUEFCSUxJVFkgICAgICAgICAgICAgMzMgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1RQQ19SRVFVRVNUICAgICAgICAgICAgICAgICAgMzQgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1RQQ19SRVBPUlQgICAgICAgICAgICAgICAgICAgMzUgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1NVUFBfQ0hBTk5FTFMgICAgICAgICAgICAgICAgMzYgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX0NIQU5ORUxfU1dJVENIX0FOTk9VTkNFTUVOVCAgMzcgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUVVFU1QgICAgICAgICAgMzggICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX01FQVNVUkVNRU5UX1JFUE9SVCAgICAgICAgICAgMzkgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX1FVSUVUICAgICAgICAgICAgICAgICAgICAgICAgNDAgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX0lCU1NfREZTICAgICAgICAgICAgICAgICAgICAgNDEgICAgLy8gODAyLjExaCBkMy4zCi0jZGVmaW5lIElFX0VSUCAgICAgICAgICAgICAgICAgICAgICAgICAgNDIgICAgLy8gODAyLjExZwotI2RlZmluZSBJRV9UU19ERUxBWSAgICAgICAgICAgICAgICAgICAgIDQzICAgIC8vIDgwMi4xMWUgZDkKLSNkZWZpbmUgSUVfVENMQVNfUFJPQ0VTU0lORyAgICAgICAgICAgICA0NCAgICAvLyA4MDIuMTFlIGQ5Ci0jZGVmaW5lIElFX1FPU19DQVBBQklMSVRZICAgICAgICAgICAgICAgNDYgICAgLy8gODAyLjExZSBkNgotI2RlZmluZSBJRV9IVF9DQVAgICAgICAgICAgICAgICAgICAgICAgIDQ1ICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX0FQX0NIQU5ORUxfUkVQT1JUCQkJNTEgICAgLy8gODAyLjExayBkNgotI2RlZmluZSBJRV9IVF9DQVAyICAgICAgICAgICAgICAgICAgICAgICAgIDUyICAgIC8vIDgwMi4xMW4gZDEuIEhUIENBUEFCSUxJVFkuIEVMRU1FTlQgSUQgVEJECi0jZGVmaW5lIElFX1JTTiAgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gODAyLjExaSBkMy4wCi0jZGVmaW5lIElFX1dQQTIgICAgICAgICAgICAgICAgICAgICAgICAgNDggICAgLy8gV1BBMgotI2RlZmluZSBJRV9FWFRfU1VQUF9SQVRFUyAgICAgICAgICAgICAgIDUwICAgIC8vIDgwMi4xMWcKLSNkZWZpbmUgSUVfU1VQUF9SRUdfQ0xBU1MgICAgICAgICAgICAgICA1OSAgICAvLyA4MDIuMTF5LiBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzc2VzLgotI2RlZmluZSBJRV9FWFRfQ0hBTk5FTF9TV0lUQ0hfQU5OT1VOQ0VNRU5UCTYwCS8vIDgwMi4xMW4KLSNkZWZpbmUgSUVfQUREX0hUICAgICAgICAgICAgICAgICAgICAgICAgIDYxICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKLSNkZWZpbmUgSUVfQUREX0hUMiAgICAgICAgICAgICAgICAgICAgICAgIDUzICAgIC8vIDgwMi4xMW4gZDEuIEFERElUSU9OQUwgSFQgQ0FQQUJJTElUWS4gRUxFTUVOVCBJRCBUQkQKLQotCi0vLyBGb3IgODAyLjExbiBEMy4wMwotLy8jZGVmaW5lIElFX05FV19FWFRfQ0hBX09GRlNFVCAgICAgICAgICAgICA2MiAgICAvLyA4MDIuMTFuIGQxLiBOZXcgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0IGVsZW1ldAotI2RlZmluZSBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VUCQk2MgkvLyA4MDIuMTFuIEQzLjAzCVNlY29uZGFyeSBDaGFubmVsIE9mZnNldCBlbGVtZW50Ci0jZGVmaW5lIElFX1dBUEkJCQkJCQkJNjgJCS8vIFdBUEkgaW5mb3JtYXRpb24gZWxlbWVudAotI2RlZmluZSBJRV8yMDQwX0JTU19DT0VYSVNUICAgICAgICAgICAgICAgNzIgICAgLy8gODAyLjExbiBEMy4wLjMKLSNkZWZpbmUgSUVfMjA0MF9CU1NfSU5UT0xFUkFOVF9SRVBPUlQgICAgIDczICAgIC8vIDgwMi4xMW4gRDMuMDMKLSNkZWZpbmUgSUVfT1ZFUkxBUEJTU19TQ0FOX1BBUk0gICAgICAgICAgIDc0ICAgIC8vIDgwMi4xMW4gRDMuMDMKLSNkZWZpbmUgSUVfRVhUX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgMTI3ICAgLy8gODAyLjExbiBEMy4wMwotCi0KLSNkZWZpbmUgSUVfV1BBICAgICAgICAgICAgICAgICAgICAgICAgICAyMjEgICAvLyBXUEEKLSNkZWZpbmUgSUVfVkVORE9SX1NQRUNJRklDICAgICAgICAgICAgICAyMjEgICAvLyBXaWZpIFdNTSAoV01FKQotCi0jZGVmaW5lIE9VSV9CUk9BRENPTV9IVCAgICAgICAgICAgICAgNTEgICAvLwotI2RlZmluZSBPVUlfQlJPQURDT01fSFRBREQgICAgICAgICAgICAgIDUyICAgLy8KLSNkZWZpbmUgT1VJX1BSRU5fSFRfQ0FQICAgICAgICAgICAgICA1MSAgIC8vCi0jZGVmaW5lIE9VSV9QUkVOX0FERF9IVCAgICAgICAgICAgICAgNTIgICAvLwotCi0vLyBDQ1ggaW5mb3JtYXRpb24KLSNkZWZpbmUgSUVfQUlST05FVF9DS0lQICAgICAgICAgICAgICAgICAxMzMgICAvLyBDQ1gxLjAgSUQgODVIIGZvciBDS0lQCi0jZGVmaW5lIElFX0FQX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgMTUwICAgLy8gQ0NYIDIuMCBmb3IgQVAgdHJhbnNtaXQgcG93ZXIKLSNkZWZpbmUgSUVfTUVBU1VSRU1FTlRfQ0FQQUJJTElUWSAgICAgICAyMjEgICAvLyBDQ1ggMi4wCi0jZGVmaW5lIElFX0NDWF9WMiAgICAgICAgICAgICAgICAgICAgICAgMjIxCi0jZGVmaW5lIElFX0FJUk9ORVRfSVBBRERSRVNTICAgICAgICAgICAgMTQ5ICAgLy8gQ0NYIElEIDk1SCBmb3IgSVAgQWRkcmVzcwotI2RlZmluZSBJRV9BSVJPTkVUX0NDS01SRUFTU09DICAgICAgICAgIDE1NiAgIC8vIENDWCBJRCA5Q0ggZm9yIENDS00gUmVhc3NvY2lhdGlvbiBSZXF1ZXN0IGVsZW1lbnQKLSNkZWZpbmUgQ0tJUF9ORUdPVElBVElPTl9MRU5HVEggICAgICAgICAzMAotI2RlZmluZSBBSVJPTkVUX0lQQUREUkVTU19MRU5HVEggICAgICAgIDEwCi0jZGVmaW5lIEFJUk9ORVRfQ0NLTVJFQVNTT0NfTEVOR1RIICAgICAgMjQKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE1MTUUgc3RhdGUgbWFjaGluZSBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBTVEEgTUxNRSBzdGF0ZSBtYWhjaW5lcwotI2RlZmluZSBBU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVVUSF9TVEFURV9NQUNISU5FICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFVVEhfUlNQX1NUQVRFX01BQ0hJTkUgICAgICAgICAgMwotI2RlZmluZSBTWU5DX1NUQVRFX01BQ0hJTkUgICAgICAgICAgICAgIDQKLSNkZWZpbmUgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUgICAgICAgICA1Ci0jZGVmaW5lIFdQQV9QU0tfU1RBVEVfTUFDSElORSAgICAgICAgICAgNgotLy8jZGVmaW5lIExFQVBfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgNwotI2RlZmluZSBBSVJPTkVUX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDgKLSNkZWZpbmUgQUNUSU9OX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDkKLQotLy8gQVAgTUxNRSBzdGF0ZSBtYWNoaW5lcwotI2RlZmluZSBBUF9BU1NPQ19TVEFURV9NQUNISU5FICAgICAgICAgIDExCi0jZGVmaW5lIEFQX0FVVEhfU1RBVEVfTUFDSElORSAgICAgICAgICAgMTIKLSNkZWZpbmUgQVBfU1lOQ19TVEFURV9NQUNISU5FICAgICAgICAgICAxNAotI2RlZmluZSBBUF9DTlRMX1NUQVRFX01BQ0hJTkUgICAgICAgICAgIDE1Ci0jZGVmaW5lIFdTQ19TVEFURV9NQUNISU5FICAgICAgICAgICAgMTcKLSNkZWZpbmUgV1NDX1VQTlBfU1RBVEVfTUFDSElORQkJICAgIDE4Ci0KLQotI2RlZmluZSBXUEFfU1RBVEVfTUFDSElORQkJCTIzCi0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotI2RlZmluZSBETFNfU1RBVEVfTUFDSElORSAgICAgICAgICAgICAgIDI2Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLS8vCi0vLyBTVEEncyBDT05UUk9ML0NPTk5FQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIENOVExfSURMRSAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDTlRMX1dBSVRfRElTQVNTT0MgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQ05UTF9XQUlUX0pPSU4gICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIENOVExfV0FJVF9SRUFTU09DICAgICAgICAgICAgICAgMwotI2RlZmluZSBDTlRMX1dBSVRfU1RBUlQgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQ05UTF9XQUlUX0FVVEggICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIENOVExfV0FJVF9BU1NPQyAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBDTlRMX1dBSVRfQVVUSDIgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU4gICAgICAgICA4Ci0jZGVmaW5lIENOVExfV0FJVF9PSURfRElTQVNTT0MgICAgICAgICAgOQotCi0jZGVmaW5lIE1UMl9BU1NPQ19DT05GICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgTVQyX0FVVEhfQ09ORiAgICAgICAgICAgICAgICAgICAzNQotI2RlZmluZSBNVDJfREVBVVRIX0NPTkYgICAgICAgICAgICAgICAgIDM2Ci0jZGVmaW5lIE1UMl9ESVNBU1NPQ19DT05GICAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgTVQyX1JFQVNTT0NfQ09ORiAgICAgICAgICAgICAgICAzOAotI2RlZmluZSBNVDJfUFdSX01HTVRfQ09ORiAgICAgICAgICAgICAgIDM5Ci0jZGVmaW5lIE1UMl9KT0lOX0NPTkYgICAgICAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgTVQyX1NDQU5fQ09ORiAgICAgICAgICAgICAgICAgICA0MQotI2RlZmluZSBNVDJfU1RBUlRfQ09ORiAgICAgICAgICAgICAgICAgIDQyCi0jZGVmaW5lIE1UMl9HRVRfQ09ORiAgICAgICAgICAgICAgICAgICAgNDMKLSNkZWZpbmUgTVQyX1NFVF9DT05GICAgICAgICAgICAgICAgICAgICA0NAotI2RlZmluZSBNVDJfUkVTRVRfQ09ORiAgICAgICAgICAgICAgICAgIDQ1Ci0jZGVmaW5lIE1UMl9GVF9PVERfQ09ORgkJCQkJNDYKLSNkZWZpbmUgTVQyX01MTUVfUk9BTUlOR19SRVEgICAgICAgICAgICA1MgotCi0jZGVmaW5lIENOVExfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgMQotCi0vLwotLy8gU1RBJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFTU09DX0lETEUgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUkVBU1NPQ19XQUlUX1JTUCAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIERJU0FTU09DX1dBSVRfUlNQICAgICAgICAgICAgICAgMwotI2RlZmluZSBNQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgICAgIDQKLQotI2RlZmluZSBBU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX01MTUVfQVNTT0NfUkVRICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1UMl9NTE1FX1JFQVNTT0NfUkVRICAgICAgICAgICAgMQotI2RlZmluZSBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgICAgIDIKLSNkZWZpbmUgTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAgICAzCi0jZGVmaW5lIE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICAgICAgICAgNAotI2RlZmluZSBNVDJfUEVFUl9BU1NPQ19SU1AgICAgICAgICAgICAgIDUKLSNkZWZpbmUgTVQyX1BFRVJfUkVBU1NPQ19SRVEgICAgICAgICAgICA2Ci0jZGVmaW5lIE1UMl9QRUVSX1JFQVNTT0NfUlNQICAgICAgICAgICAgNwotI2RlZmluZSBNVDJfRElTQVNTT0NfVElNRU9VVCAgICAgICAgICAgIDgKLSNkZWZpbmUgTVQyX0FTU09DX1RJTUVPVVQgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIE1UMl9SRUFTU09DX1RJTUVPVVQgICAgICAgICAgICAgMTAKLSNkZWZpbmUgTUFYX0FTU09DX01TRyAgICAgICAgICAgICAgICAgICAxMQotCi0jZGVmaW5lIEFTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BU1NPQ19TVEFURSAqIE1BWF9BU1NPQ19NU0cpCi0KLS8vCi0vLyBBQ1Qgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFDVF9JRExFICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTUFYX0FDVF9TVEFURSAgICAgICAgICAgICAgICAgMQotCi0jZGVmaW5lIEFDVF9NQUNISU5FX0JBU0UgICAgICAgICAgICAgIDAKLQotLy9UaG9zZSBQRUVSX3h4X0NBVEUgbnVtYmVyIGlzIGJhc2VkIG9uIHJlYWwgQ2F0ZWdhcnkgdmFsdWUgaW4gSUVFRSBzcGVjLiBQbGVhc2UgZG9uJ2VzIG1vZGlmeSBpdCBieSB5b3VyIHNlbGYuCi0vL0NhdGVnb3J5Ci0jZGVmaW5lIE1UMl9QRUVSX1NQRUNUUlVNX0NBVEUgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX1BFRVJfUU9TX0NBVEUgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTVQyX1BFRVJfRExTX0NBVEUgICAgICAgICAgICAgMgotI2RlZmluZSBNVDJfUEVFUl9CQV9DQVRFICAgICAgICAgICAgIDMKLSNkZWZpbmUgTVQyX1BFRVJfUFVCTElDX0NBVEUgICAgICAgICAgICAgNAotI2RlZmluZSBNVDJfUEVFUl9STV9DQVRFICAgICAgICAgICAgIDUKLS8qICJGVF9DQVRFR09SWV9CU1NfVFJBTlNJVElPTiBlcXVhbCB0byA2IiBpcyBkZWZpbmVkIGZpbGUgb2YgImRvdDExcl9mdC5oIiAqLwotI2RlZmluZSBNVDJfUEVFUl9IVF9DQVRFICAgICAgICAgICAgIDcJLy8JNy40LjcKLSNkZWZpbmUgTUFYX1BFRVJfQ0FURV9NU0cgICAgICAgICAgICAgICAgICAgNwotCi0KLSNkZWZpbmUgTVQyX01MTUVfQUREX0JBX0NBVEUgICAgICAgICAgICAgOAotI2RlZmluZSBNVDJfTUxNRV9PUklfREVMQkFfQ0FURSAgICAgICAgICAgICA5Ci0jZGVmaW5lIE1UMl9NTE1FX1JFQ19ERUxCQV9DQVRFICAgICAgICAgICAgIDEwCi0jZGVmaW5lIE1UMl9NTE1FX1FPU19DQVRFICAgICAgICAgICAgICAxMQotI2RlZmluZSBNVDJfTUxNRV9ETFNfQ0FURSAgICAgICAgICAgICAxMgotI2RlZmluZSBNVDJfQUNUX0lOVkFMSUQgICAgICAgICAgICAgMTMKLQotI2RlZmluZSBNQVhfQUNUX01TRyAgICAgICAgICAgICAgICAgICAxNAotCi0KLS8vQ2F0ZWdvcnkgZmllbGQKLSNkZWZpbmUgQ0FURUdPUllfU1BFQ1RSVU0JCTAKLSNkZWZpbmUgQ0FURUdPUllfUU9TCQkJMQotI2RlZmluZSBDQVRFR09SWV9ETFMJCQkyCi0jZGVmaW5lIENBVEVHT1JZX0JBCQkJMwotI2RlZmluZSBDQVRFR09SWV9QVUJMSUMJCTQKLSNkZWZpbmUgQ0FURUdPUllfUk0JCQk1Ci0jZGVmaW5lIENBVEVHT1JZX0hUCQkJNwotCi0KLS8vIERMUyBBY3Rpb24gZnJhbWUgZGVmaW5pdGlvbgotI2RlZmluZSBBQ1RJT05fRExTX1JFUVVFU1QJCQkwCi0jZGVmaW5lIEFDVElPTl9ETFNfUkVTUE9OU0UJCQkxCi0jZGVmaW5lIEFDVElPTl9ETFNfVEVBUkRPV04JCQkyCi0KLS8vU3BlY3RydW0gIEFjdGlvbiBmaWVsZCB2YWx1ZSA4MDIuMTFoIDcuNC4xCi0jZGVmaW5lIFNQRUNfTVJRCTAJLy8gUmVxdWVzdAotI2RlZmluZSBTUEVDX01SUAkxCS8vUmVwb3J0Ci0jZGVmaW5lIFNQRUNfVFBDUlEJMgotI2RlZmluZSBTUEVDX1RQQ1JQCTMKLSNkZWZpbmUgU1BFQ19DSEFOTkVMX1NXSVRDSAk0Ci0KLQotLy9CQSAgQWN0aW9uIGZpZWxkIHZhbHVlCi0jZGVmaW5lIEFEREJBX1JFUQkwCi0jZGVmaW5lIEFEREJBX1JFU1AJMQotI2RlZmluZSBERUxCQSAgIDIKLQotLy9QdWJsaWMncyAgQWN0aW9uIGZpZWxkIHZhbHVlIGluIFB1YmxpYyBDYXRlZ29yeS4gIFNvbWUgaW4gODAyLjExeSBhbmQgc29tZSBpbiAxMW4KLSNkZWZpbmUgQUNUSU9OX0JTU18yMDQwX0NPRVhJU1QJCQkJMAkvLyAxMW4KLSNkZWZpbmUgQUNUSU9OX0RTRV9FTkFCTEVNRU5UCQkJCQkxCS8vIDExeSBEOS4wCi0jZGVmaW5lIEFDVElPTl9EU0VfREVFTkFCTEVNRU5UCQkJCTIJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9SRUdfTE9DQVRJT05fQU5OT1VOQ0UJMwkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRVhUX0NIX1NXSVRDSF9BTk5PVU5DRQkJNAkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX01FQVNVUkVNRU5UX1JFUQkJCTUJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX0RTRV9NRUFTVVJFTUVOVF9SRVBPUlQJCTYJLy8gMTF5IEQ5LjAKLSNkZWZpbmUgQUNUSU9OX01FQVNVUkVNRU5UX1BJTE9UX0FDVElPTgkJNwkvLyAxMXkgRDkuMAotI2RlZmluZSBBQ1RJT05fRFNFX1BPV0VSX0NPTlNUUkFJTlQJCQk4CS8vIDExeSBEOS4wCi0KLQotLy9IVCAgQWN0aW9uIGZpZWxkIHZhbHVlCi0jZGVmaW5lIE5PVElGWV9CV19BQ1RJT04JCQkJMAotI2RlZmluZSBTTVBTX0FDVElPTgkJCQkJCTEKLSNkZWZpbmUgUFNNUF9BQ1RJT04JCQkJCTIKLSNkZWZpbmUgU0VUUENPX0FDVElPTgkJCQkJMwotI2RlZmluZSBNSU1PX0NIQV9NRUFTVVJFX0FDVElPTgkJCTQKLSNkZWZpbmUgTUlNT19OX0JFQUNPTkZPUk0JCQkJNQotI2RlZmluZSBNSU1PX0JFQUNPTkZPUk0JCQkJCTYKLSNkZWZpbmUgQU5URU5OQV9TRUxFQ1QJCQkJCTcKLSNkZWZpbmUgSFRfSU5GT19FWENIQU5HRQkJCQk4Ci0KLSNkZWZpbmUgQUNUX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgKE1BWF9BQ1RfU1RBVEUgKiBNQVhfQUNUX01TRykKLS8vCi0vLyBTVEEncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2dmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFVVEhfUkVRX0lETEUgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBVVRIX1dBSVRfU0VRMiAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVVUSF9XQUlUX1NFUTQgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIEFVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfTUxNRV9BVVRIX1JFUSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9BVVRIX1RJTUVPVVQgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgICAgIDMKLQotI2RlZmluZSBBVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgICAgIChNQVhfQVVUSF9TVEFURSAqIE1BWF9BVVRIX01TRykKLQotLy8KLS8vIFNUQSdzIEFVVEhfUlNQIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBVVRIX1JTUF9JRExFICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVVUSF9SU1BfV0FJVF9DSEFMICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1BWF9BVVRIX1JTUF9TVEFURSAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIEFVVEhfUlNQX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAotI2RlZmluZSBNVDJfQVVUSF9DSEFMTEVOR0VfVElNRU9VVCAgICAgIDAKLSNkZWZpbmUgTVQyX1BFRVJfQVVUSF9PREQgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfQVVUSF9SU1BfTVNHICAgICAgICAgICAgICAgIDMKLQotI2RlZmluZSBBVVRIX1JTUF9GVU5DX1NJWkUgICAgICAgICAgICAgIChNQVhfQVVUSF9SU1BfU1RBVEUgKiBNQVhfQVVUSF9SU1BfTVNHKQotCi0vLwotLy8gU1RBJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQotI2RlZmluZSBKT0lOX1dBSVRfQkVBQ09OICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgU0NBTl9MSVNURU4gICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE1BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIFNZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfTUxNRV9TQ0FOX1JFUSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX01MTUVfSk9JTl9SRVEgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9NTE1FX1NUQVJUX1JFUSAgICAgICAgICAgICAgMgotI2RlZmluZSBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTVQyX1BFRVJfUFJPQkVfUlNQICAgICAgICAgICAgICA0Ci0jZGVmaW5lIE1UMl9QRUVSX0FUSU0gICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNVDJfU0NBTl9USU1FT1VUICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTVQyX0JFQUNPTl9USU1FT1VUICAgICAgICAgICAgICA3Ci0jZGVmaW5lIE1UMl9BVElNX1RJTUVPVVQgICAgICAgICAgICAgICAgOAotI2RlZmluZSBNVDJfUEVFUl9QUk9CRV9SRVEgICAgICAgICAgICAgIDkKLSNkZWZpbmUgTUFYX1NZTkNfTVNHICAgICAgICAgICAgICAgICAgICAxMAotCi0jZGVmaW5lIFNZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgICAgKE1BWF9TWU5DX1NUQVRFICogTUFYX1NZTkNfTVNHKQotCi0vL01lc3NhZ2VzIGZvciB0aGUgRExTIHN0YXRlIG1hY2hpbmUKLSNkZWZpbmUgRExTX0lETEUJCQkJCQkwCi0jZGVmaW5lIE1BWF9ETFNfU1RBVEUJCQkJCTEKLQotI2RlZmluZSBETFNfTUFDSElORV9CQVNFCQkJCTAKLSNkZWZpbmUgTVQyX01MTUVfRExTX1JFUQkJCSAgICAwCi0jZGVmaW5lIE1UMl9QRUVSX0RMU19SRVEJCQkgICAgMQotI2RlZmluZSBNVDJfUEVFUl9ETFNfUlNQCQkJICAgIDIKLSNkZWZpbmUgTVQyX01MTUVfRExTX1RFQVJfRE9XTgkJICAgIDMKLSNkZWZpbmUgTVQyX1BFRVJfRExTX1RFQVJfRE9XTgkJICAgIDQKLSNkZWZpbmUgTUFYX0RMU19NU0cJCQkJICAgICAgICA1Ci0KLSNkZWZpbmUgRExTX0ZVTkNfU0laRQkJCQkJKE1BWF9ETFNfU1RBVEUgKiBNQVhfRExTX01TRykKLQotLy8KLS8vIFdTQyBTdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLQotLy8KLS8vIEFQJ3MgQ09OVFJPTC9DT05ORUNUIHN0YXRlIG1hY2hpbmU6IHN0YXRlcywgZXZlbnRzLCB0b3RhbCBmdW5jdGlvbiAjCi0vLwotI2RlZmluZSBBUF9DTlRMX0ZVTkNfU0laRSAgICAgICAgICAgICAgIDEKLQotLy8KLS8vIEFQJ3MgQVNTT0Mgc3RhdGUgbWFjaGluZTogc3RhdGVzLCBldmVudHMsIHRvdGFsIGZ1bmN0aW9uICMKLS8vCi0jZGVmaW5lIEFQX0FTU09DX0lETEUgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBBUF9NQVhfQVNTT0NfU1RBVEUgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBBUF9BU1NPQ19NQUNISU5FX0JBU0UgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfTUxNRV9ESVNBU1NPQ19SRVEgICAgICAgICAwCi0jZGVmaW5lIEFQTVQyX1BFRVJfRElTQVNTT0NfUkVRICAgICAgICAgMQotI2RlZmluZSBBUE1UMl9QRUVSX0FTU09DX1JFUSAgICAgICAgICAgIDIKLSNkZWZpbmUgQVBNVDJfUEVFUl9SRUFTU09DX1JFUSAgICAgICAgICAzCi0jZGVmaW5lIEFQTVQyX0NMUzNFUlIgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBBUF9NQVhfQVNTT0NfTVNHICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZSBBUF9BU1NPQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUF9NQVhfQVNTT0NfU1RBVEUgKiBBUF9NQVhfQVNTT0NfTVNHKQotCi0vLwotLy8gQVAncyBBVVRIRU5USUNBVElPTiBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVBfQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQX01BWF9BVVRIX1NUQVRFICAgICAgICAgICAgICAgMQotCi0jZGVmaW5lIEFQX0FVVEhfTUFDSElORV9CQVNFICAgICAgICAgICAgMAotI2RlZmluZSBBUE1UMl9NTE1FX0RFQVVUSF9SRVEgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfQ0xTMkVSUiAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQTVQyX1BFRVJfREVBVVRICQkJCTIKLSNkZWZpbmUgQVBNVDJfUEVFUl9BVVRIX1JFUQkJCQkzCi0jZGVmaW5lIEFQTVQyX1BFRVJfQVVUSF9DT05GSVJNCQkJNAotI2RlZmluZSBBUF9NQVhfQVVUSF9NU0cgICAgICAgICAgICAgICAgIDUKLQotI2RlZmluZSBBUF9BVVRIX0ZVTkNfU0laRSAgICAgICAgICAgICAgIChBUF9NQVhfQVVUSF9TVEFURSAqIEFQX01BWF9BVVRIX01TRykKLQotLy8KLS8vIEFQJ3MgU1lOQyBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgQVBfU1lOQ19JRExFICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQX1NDQU5fTElTVEVOCQkJCQkxCi0jZGVmaW5lIEFQX01BWF9TWU5DX1NUQVRFICAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIEFQX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAgMAotI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JFUSAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBNVDJfUEVFUl9CRUFDT04gICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQTVQyX01MTUVfU0NBTl9SRVEJCQkJMgotI2RlZmluZSBBUE1UMl9QRUVSX1BST0JFX1JTUAkJCTMKLSNkZWZpbmUgQVBNVDJfU0NBTl9USU1FT1VUCQkJCTQKLSNkZWZpbmUgQVBNVDJfTUxNRV9TQ0FOX0NOQ0wJCQk1Ci0jZGVmaW5lIEFQX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAgNgotCi0jZGVmaW5lIEFQX1NZTkNfRlVOQ19TSVpFICAgICAgICAgICAgICAgKEFQX01BWF9TWU5DX1NUQVRFICogQVBfTUFYX1NZTkNfTVNHKQotCi0vLwotLy8gQ29tbW9uIFdQQSBzdGF0ZSBtYWNoaW5lOiBzdGF0ZXMsIGV2ZW50cywgdG90YWwgZnVuY3Rpb24gIwotLy8KLSNkZWZpbmUgV1BBX1BUSyAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1BWF9XUEFfUFRLX1NUQVRFICAgICAgICAgICAgMQotCi0jZGVmaW5lIFdQQV9NQUNISU5FX0JBU0UgICAgICAgICAgICAgMAotI2RlZmluZSBNVDJfRUFQUGFja2V0ICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVQyX0VBUE9MU3RhcnQgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE1UMl9FQVBPTExvZ29mZiAgICAgICAgICAgICAgMgotI2RlZmluZSBNVDJfRUFQT0xLZXkgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgTVQyX0VBUE9MQVNGQWxlcnQgICAgICAgICAgICA0Ci0jZGVmaW5lIE1BWF9XUEFfTVNHICAgICAgICAgICAgICAgICAgNQotCi0jZGVmaW5lIFdQQV9GVU5DX1NJWkUgICAgICAgICAgICAgICAgKE1BWF9XUEFfUFRLX1NUQVRFICogTUFYX1dQQV9NU0cpCi0KLSNpZmRlZiBBUENMSV9TVVBQT1JUCi0vL0FwQ2xpIGF1dGhlbnRpY2F0aW9uIHN0YXRlIG1hY2hpbmUKLSNkZWZpbmUgQVBDTElfQVVUSF9SRVFfSURMRSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX0FVVEhfV0FJVF9TRVEyICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUENMSV9BVVRIX1dBSVRfU0VRNCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQVBDTElfTUFYX0FVVEhfU1RBVEUgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVBDTElfQVVUSF9NQUNISU5FX0JBU0UgICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX01UMl9NTE1FX0FVVEhfUkVRICAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfTUxNRV9ERUFVVEhfUkVRICAgICAgICAgIDEKLSNkZWZpbmUgQVBDTElfTVQyX1BFRVJfQVVUSF9FVkVOICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0RFQVVUSCAgICAgICAgICAgICAgMwotI2RlZmluZSBBUENMSV9NVDJfQVVUSF9USU1FT1VUICAgICAgICAgICAgIDQKLSNkZWZpbmUgQVBDTElfTUFYX0FVVEhfTVNHICAgICAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgQVBDTElfQVVUSF9GVU5DX1NJWkUgICAgICAgICAgICAgICAoQVBDTElfTUFYX0FVVEhfU1RBVEUgKiBBUENMSV9NQVhfQVVUSF9NU0cpCi0KLS8vQXBDbGkgYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZQotI2RlZmluZSBBUENMSV9BU1NPQ19JRExFICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfQVNTT0NfV0FJVF9SU1AgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX01BWF9BU1NPQ19TVEFURSAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIEFQQ0xJX0FTU09DX01BQ0hJTkVfQkFTRSAgICAgICAgICAgMAotI2RlZmluZSBBUENMSV9NVDJfTUxNRV9BU1NPQ19SRVEgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfTVQyX01MTUVfRElTQVNTT0NfUkVRICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX01UMl9QRUVSX0RJU0FTU09DX1JFUSAgICAgICAgMgotI2RlZmluZSBBUENMSV9NVDJfUEVFUl9BU1NPQ19SU1AgICAgICAgICAgIDMKLSNkZWZpbmUgQVBDTElfTVQyX0FTU09DX1RJTUVPVVQgICAgICAgICAgICA0Ci0jZGVmaW5lIEFQQ0xJX01BWF9BU1NPQ19NU0cgICAgICAgICAgICAgICAgNQotCi0jZGVmaW5lIEFQQ0xJX0FTU09DX0ZVTkNfU0laRSAgICAgICAgICAgICAgKEFQQ0xJX01BWF9BU1NPQ19TVEFURSAqIEFQQ0xJX01BWF9BU1NPQ19NU0cpCi0KLS8vQXBDbGkgc3luYyBzdGF0ZSBtYWNoaW5lCi0jZGVmaW5lIEFQQ0xJX1NZTkNfSURMRSAgICAgICAgICAgICAgICAgICAwICAvLyBtZXJnZSBOT19CU1MsSUJTU19JRExFLElCU1NfQUNUSVZFIGFuZCBCU1MgaW4gdG8gMSBzdGF0ZQotI2RlZmluZSBBUENMSV9KT0lOX1dBSVRfUFJPQkVfUlNQICAgICAgICAgMQotI2RlZmluZSBBUENMSV9NQVhfU1lOQ19TVEFURSAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIEFQQ0xJX1NZTkNfTUFDSElORV9CQVNFICAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX01UMl9NTE1FX1BST0JFX1JFUSAgICAgICAgICAwCi0jZGVmaW5lIEFQQ0xJX01UMl9QRUVSX1BST0JFX1JTUCAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX01UMl9QUk9CRV9USU1FT1VUICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX01BWF9TWU5DX01TRyAgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgQVBDTElfU1lOQ19GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfU1lOQ19TVEFURSAqIEFQQ0xJX01BWF9TWU5DX01TRykKLQotLy9BcENsaSBjdHJsIHN0YXRlIG1hY2hpbmUKLSNkZWZpbmUgQVBDTElfQ1RSTF9ESVNDT05ORUNURUQgICAgICAgICAgIDAgIC8vIG1lcmdlIE5PX0JTUyxJQlNTX0lETEUsSUJTU19BQ1RJVkUgYW5kIEJTUyBpbiB0byAxIHN0YXRlCi0jZGVmaW5lIEFQQ0xJX0NUUkxfUFJPQkUgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSCAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEFQQ0xJX0NUUkxfQVVUSF8yICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEFQQ0xJX0NUUkxfQVNTT0MgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfREVBU1NPQyAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEFQQ0xJX0NUUkxfQ09OTkVDVEVEICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEFQQ0xJX01BWF9DVFJMX1NUQVRFICAgICAgICAgICAgICA3Ci0KLSNkZWZpbmUgQVBDTElfQ1RSTF9NQUNISU5FX0JBU0UgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfQ1RSTF9KT0lOX1JFUSAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVBDTElfQ1RSTF9QUk9CRV9SU1AgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIX1JTUCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQVBDTElfQ1RSTF9ESVNDT05ORUNUX1JFUSAgICAgICAgIDMKLSNkZWZpbmUgQVBDTElfQ1RSTF9QRUVSX0RJU0NPTk5FQ1RfUkVRICAgIDQKLSNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQ19SU1AgICAgICAgICAgICAgIDUKLSNkZWZpbmUgQVBDTElfQ1RSTF9ERUFTU09DX1JTUCAgICAgICAgICAgIDYKLSNkZWZpbmUgQVBDTElfQ1RSTF9KT0lOX1JFUV9USU1FT1VUICAgICAgIDcKLSNkZWZpbmUgQVBDTElfQ1RSTF9BVVRIX1JFUV9USU1FT1VUICAgICAgIDgKLSNkZWZpbmUgQVBDTElfQ1RSTF9BU1NPQ19SRVFfVElNRU9VVCAgICAgIDkKLSNkZWZpbmUgQVBDTElfTUFYX0NUUkxfTVNHICAgICAgICAgICAgICAgIDEwCi0KLSNkZWZpbmUgQVBDTElfQ1RSTF9GVU5DX1NJWkUgICAgICAgICAgICAgIChBUENMSV9NQVhfQ1RSTF9TVEFURSAqIEFQQ0xJX01BWF9DVFJMX01TRykKLQotCi0jZW5kaWYgLy8gQVBDTElfU1VQUE9SVCAvLwotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHZhbHVlIGRvbWFpbiBvZiA4MDIuMTEgaGVhZGVyIEZDLlR5dGUsIHdoaWNoIGlzIGIzLi5iMiBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgotI2RlZmluZSBCVFlQRV9NR01UICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBCVFlQRV9DTlRMICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBCVFlQRV9EQVRBICAgICAgICAgICAgICAgICAgMgotCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIE1HTVQgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgotI2RlZmluZSBTVUJUWVBFX0FTU09DX1JFUSAgICAgICAgICAgMAotI2RlZmluZSBTVUJUWVBFX0FTU09DX1JTUCAgICAgICAgICAgMQotI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUkVRICAgICAgICAgMgotI2RlZmluZSBTVUJUWVBFX1JFQVNTT0NfUlNQICAgICAgICAgMwotI2RlZmluZSBTVUJUWVBFX1BST0JFX1JFUSAgICAgICAgICAgNAotI2RlZmluZSBTVUJUWVBFX1BST0JFX1JTUCAgICAgICAgICAgNQotI2RlZmluZSBTVUJUWVBFX0JFQUNPTiAgICAgICAgICAgICAgOAotI2RlZmluZSBTVUJUWVBFX0FUSU0gICAgICAgICAgICAgICAgOQotI2RlZmluZSBTVUJUWVBFX0RJU0FTU09DICAgICAgICAgICAgMTAKLSNkZWZpbmUgU1VCVFlQRV9BVVRIICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIFNVQlRZUEVfREVBVVRIICAgICAgICAgICAgICAxMgotI2RlZmluZSBTVUJUWVBFX0FDVElPTiAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgU1VCVFlQRV9BQ1RJT05fTk9fQUNLICAgICAgICAgICAgICAxNAotCi0vLyB2YWx1ZSBkb21haW4gb2YgODAyLjExIENOVEwgZnJhbWUncyBGQy5zdWJ0eXBlLCB3aGljaCBpcyBiNy4uNCBvZiB0aGUgMXN0LWJ5dGUgb2YgTUFDIGhlYWRlcgotI2RlZmluZSBTVUJUWVBFX1dSQVBQRVIJCTcKLSNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0tfUkVRICAgICAgIDgKLSNkZWZpbmUgU1VCVFlQRV9CTE9DS19BQ0sgICAgICAgICAgIDkKLSNkZWZpbmUgU1VCVFlQRV9QU19QT0xMICAgICAgICAgICAgIDEwCi0jZGVmaW5lIFNVQlRZUEVfUlRTICAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBTVUJUWVBFX0NUUyAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgU1VCVFlQRV9BQ0sgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIFNVQlRZUEVfQ0ZFTkQgICAgICAgICAgICAgICAxNAotI2RlZmluZSBTVUJUWVBFX0NGRU5EX0NGQUNLICAgICAgICAgMTUKLQotLy8gdmFsdWUgZG9tYWluIG9mIDgwMi4xMSBEQVRBIGZyYW1lJ3MgRkMuc3VidHlwZSwgd2hpY2ggaXMgYjcuLjQgb2YgdGhlIDFzdC1ieXRlIG9mIE1BQyBoZWFkZXIKLSNkZWZpbmUgU1VCVFlQRV9EQVRBICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLICAgICAgICAgIDEKLSNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGUE9MTCAgICAgICAgIDIKLSNkZWZpbmUgU1VCVFlQRV9EQVRBX0NGQUNLX0NGUE9MTCAgIDMKLSNkZWZpbmUgU1VCVFlQRV9OVUxMX0ZVTkMgICAgICAgICAgIDQKLSNkZWZpbmUgU1VCVFlQRV9DRkFDSyAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgU1VCVFlQRV9DRlBPTEwgICAgICAgICAgICAgIDYKLSNkZWZpbmUgU1VCVFlQRV9DRkFDS19DRlBPTEwgICAgICAgIDcKLSNkZWZpbmUgU1VCVFlQRV9RREFUQSAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRkFDSyAgICAgICAgIDkKLSNkZWZpbmUgU1VCVFlQRV9RREFUQV9DRlBPTEwgICAgICAgIDEwCi0jZGVmaW5lIFNVQlRZUEVfUURBVEFfQ0ZBQ0tfQ0ZQT0xMICAxMQotI2RlZmluZSBTVUJUWVBFX1FPU19OVUxMICAgICAgICAgICAgMTIKLSNkZWZpbmUgU1VCVFlQRV9RT1NfQ0ZBQ0sgICAgICAgICAgIDEzCi0jZGVmaW5lIFNVQlRZUEVfUU9TX0NGUE9MTCAgICAgICAgICAxNAotI2RlZmluZSBTVUJUWVBFX1FPU19DRkFDS19DRlBPTEwgICAgMTUKLQotLy8gQUNLIHBvbGljeSBvZiBRT1MgQ29udHJvbCBmaWVsZCBiaXQgNjo1Ci0jZGVmaW5lIE5PUk1BTF9BQ0sgICAgICAgICAgICAgICAgICAweDAwICAvLyBiNjo1ID0gMDAKLSNkZWZpbmUgTk9fQUNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAgIC8vIGI2OjUgPSAwMQotI2RlZmluZSBOT19FWFBMSUNJVF9BQ0sgICAgICAgICAgICAgMHg0MCAgLy8gYjY6NSA9IDEwCi0jZGVmaW5lIEJMT0NLX0FDSyAgICAgICAgICAgICAgICAgICAweDYwICAvLyBiNjo1ID0gMTEKLQotLy8KLS8vIHJ0bXBfZGF0YS5jIHVzZSB0aGVzZSBkZWZpbml0aW9uCi0vLwotI2RlZmluZSBMRU5HVEhfODAyXzExICAgICAgICAgICAgICAgMjQKLSNkZWZpbmUgTEVOR1RIXzgwMl8xMV9BTkRfSCAgICAgICAgIDMwCi0jZGVmaW5lIExFTkdUSF84MDJfMTFfQ1JDX0ggICAgICAgICAzNAotI2RlZmluZSBMRU5HVEhfODAyXzExX0NSQyAgICAgICAgICAgMjgKLSNkZWZpbmUgTEVOR1RIXzgwMl8xMV9XSVRIX0FERFI0ICAgIDMwCi0jZGVmaW5lIExFTkdUSF84MDJfMyAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBMRU5HVEhfODAyXzNfVFlQRSAgICAgICAgICAgMgotI2RlZmluZSBMRU5HVEhfODAyXzFfSCAgICAgICAgICAgICAgOAotI2RlZmluZSBMRU5HVEhfRUFQT0xfSCAgICAgICAgICAgICAgNAotI2RlZmluZSBMRU5HVEhfV01NUU9TX0gJCQkJMgotI2RlZmluZSBMRU5HVEhfQ1JDICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBNQVhfU0VRX05VTUJFUiAgICAgICAgICAgICAgMHgwZmZmCi0jZGVmaW5lIExFTkdUSF84MDJfM19OT19UWVBFCQkxMgotI2RlZmluZSBMRU5HVEhfODAyXzFRCQkJCTQgLyogVkxBTiByZWxhdGVkICovCi0KLS8vIFNUQV9DU1I0LmZpZWxkLlR4UmVzdWx0Ci0jZGVmaW5lIFRYX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAwCi0jZGVmaW5lIFRYX1JFU1VMVF9aRVJPX0xFTkdUSCAgICAgICAxCi0jZGVmaW5lIFRYX1JFU1VMVF9VTkRFUl9SVU4gICAgICAgICAyCi0jZGVmaW5lIFRYX1JFU1VMVF9PSFlfRVJST1IgICAgICAgICA0Ci0jZGVmaW5lIFRYX1JFU1VMVF9SRVRSWV9GQUlMICAgICAgICA2Ci0KLS8vIEFsbCBQSFkgcmF0ZSBzdW1tYXJ5IGluIFRYRAotLy8gUHJlYW1ibGUgTU9ERSBpbiBUeEQKLSNkZWZpbmUgTU9ERV9DQ0sJMAotI2RlZmluZSBNT0RFX09GRE0gICAxCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jZGVmaW5lIE1PREVfSFRNSVgJMgotI2RlZmluZSBNT0RFX0hUR1JFRU5GSUVMRAkzCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0vLyBNQ1MgZm9yIENDSy4gIEJXLlNHSS5TVEJDIGFyZSByZXNlcnZlZAotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDAJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzCi0jZGVmaW5lIE1DU19MT05HUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQkvLyBsb25nIHByZWFtYmxlIENDSyAxTWJwcwotI2RlZmluZSBNQ1NfTE9OR1BfUkFURV81XzUgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTUNTX0xPTkdQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIE1DU19TSE9SVFBfUkFURV8xICAgICAgICAgICAgICAgICAgICAgIDQJIC8vIGxvbmcgcHJlYW1ibGUgQ0NLIDFNYnBzLiBzaG9ydCBpcyBmb3JiaWRkZW4gaW4gMU1icHMKLSNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzIgICAgICAgICAgICAgICAgICAgICAgNQkvLyBzaG9ydCBwcmVhbWJsZSBDQ0sgMk1icHMKLSNkZWZpbmUgTUNTX1NIT1JUUF9SQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBNQ1NfU0hPUlRQX1JBVEVfMTEgICAgICAgICAgICAgICAgICAgICA3Ci0vLyBUbyBzZW5kIGR1cGxpY2F0ZSBsZWdhY3kgT0ZETS4gc2V0IEJXPUJXXzQwLiAgU0dJLlNUQkMgYXJlIHJlc2VydmVkCi0jZGVmaW5lIE1DU19SQVRFXzYgICAgICAgICAgICAgICAgICAgICAgMCAgIC8vIGxlZ2FjeSBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzkgICAgICAgICAgICAgICAgICAgICAgMSAgIC8vIE9GRE0KLSNkZWZpbmUgTUNTX1JBVEVfMTIgICAgICAgICAgICAgICAgICAgICAyICAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8xOCAgICAgICAgICAgICAgICAgICAgIDMgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzI0ICAgICAgICAgICAgICAgICAgICAgNCAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV8zNiAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCi0jZGVmaW5lIE1DU19SQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgNiAgLy8gT0ZETQotI2RlZmluZSBNQ1NfUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDcgLy8gT0ZETQotLy8gSFQKLSNkZWZpbmUgTUNTXzAJCTAJLy8gMVMKLSNkZWZpbmUgTUNTXzEJCTEKLSNkZWZpbmUgTUNTXzIJCTIKLSNkZWZpbmUgTUNTXzMJCTMKLSNkZWZpbmUgTUNTXzQJCTQKLSNkZWZpbmUgTUNTXzUJCTUKLSNkZWZpbmUgTUNTXzYJCTYKLSNkZWZpbmUgTUNTXzcJCTcKLSNkZWZpbmUgTUNTXzgJCTgJLy8gMlMKLSNkZWZpbmUgTUNTXzkJCTkKLSNkZWZpbmUgTUNTXzEwCQkxMAotI2RlZmluZSBNQ1NfMTEJCTExCi0jZGVmaW5lIE1DU18xMgkJMTIKLSNkZWZpbmUgTUNTXzEzCQkxMwotI2RlZmluZSBNQ1NfMTQJCTE0Ci0jZGVmaW5lIE1DU18xNQkJMTUKLSNkZWZpbmUgTUNTXzE2CQkxNgkvLyAzKjMKLSNkZWZpbmUgTUNTXzE3CQkxNwotI2RlZmluZSBNQ1NfMTgJCTE4Ci0jZGVmaW5lIE1DU18xOQkJMTkKLSNkZWZpbmUgTUNTXzIwCQkyMAotI2RlZmluZSBNQ1NfMjEJCTIxCi0jZGVmaW5lIE1DU18yMgkJMjIKLSNkZWZpbmUgTUNTXzIzCQkyMwotI2RlZmluZSBNQ1NfMzIJCTMyCi0jZGVmaW5lIE1DU19BVVRPCQkzMwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0vLyBPSURfSFRQSFlNT0RFCi0vLyBNT0RFCi0jZGVmaW5lIEhUTU9ERV9NTQkwCi0jZGVmaW5lIEhUTU9ERV9HRgkxCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLS8vIEZpeGVkIFR4IE1PREUgLSBIVCwgQ0NLIG9yIE9GRE0KLSNkZWZpbmUgRklYRURfVFhNT0RFX0hUCQkwCi0jZGVmaW5lIEZJWEVEX1RYTU9ERV9DQ0sJMQotI2RlZmluZSBGSVhFRF9UWE1PREVfT0ZETQkyCi0vLyBCVwotI2RlZmluZSBCV18yMAkJQkFORF9XSURUSF8yMAotI2RlZmluZSBCV180MAkJQkFORF9XSURUSF80MAotI2RlZmluZSBCV19CT1RICQlCQU5EX1dJRFRIX0JPVEgKLSNkZWZpbmUgQldfMTAJCUJBTkRfV0lEVEhfMTAJLy8gODAyLjExaiBoYXMgMTBNSHouIFRoaXMgZGVmaW5pdGlvbiBpcyBmb3IgaW50ZXJuYWwgdXNhZ2UuIGRvZXNuJ3QgZmlsbCBpbiB0aGUgSUUgb3Igb3RoZXIgZmllbGQuCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLS8vIFNIT1JUR0kKLSNkZWZpbmUgR0lfNDAwCQlHQVBfSU5URVJWQUxfNDAwCS8vIG9ubHkgc3VwcG9ydCBpbiBIVCBtb2RlCi0jZGVmaW5lIEdJX0JPVEgJCUdBUF9JTlRFUlZBTF9CT1RICi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0jZGVmaW5lIEdJXzgwMAkJR0FQX0lOVEVSVkFMXzgwMAotLy8gU1RCQwotI2RlZmluZSBTVEJDX05PTkUJMAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2RlZmluZSBTVEJDX1VTRQkxCS8vIGxpbWl0ZWQgdXNlIGluIHJ0Mjg2MGIgcGh5Ci0jZGVmaW5lIFJYU1RCQ19PTkUJMQkvLyByeCBzdXBwb3J0IG9mIG9uZSBzcGF0aWFsIHN0cmVhbQotI2RlZmluZSBSWFNUQkNfVFdPCTIJLy8gcnggc3VwcG9ydCBvZiAxIGFuZCAyIHNwYXRpYWwgc3RyZWFtCi0jZGVmaW5lIFJYU1RCQ19USFIJMwkvLyByeCBzdXBwb3J0IG9mIDF+MyBzcGF0aWFsIHN0cmVhbQotLy8gTUNTIEZFRURCQUNLCi0jZGVmaW5lIE1DU0ZCS19OT05FCTAgIC8vIG5vdCBzdXBwb3J0IG1jcyBmZWVkYmFjayAvCi0jZGVmaW5lIE1DU0ZCS19SU1YJMQkvLyByZXNlcnZlZAotI2RlZmluZSBNQ1NGQktfVU5TT0xJQ0lUCTIJLy8gb25seSBzdXBwb3J0IHVuc29saWN0IG1jcyBmZWVkYmFjawotI2RlZmluZSBNQ1NGQktfTVJRCTMJLy8gcmVzcG9uc2UgdG8gYm90aCBNUlEgYW5kIHVuc29saWN0IG1jcyBmZWVkYmFjawotCi0vLyBNSU1PIHBvd2VyIHNhZmUKLSNkZWZpbmUJTU1QU19TVEFUSUMJMAotI2RlZmluZQlNTVBTX0RZTkFNSUMJCTEKLSNkZWZpbmUgICBNTVBTX1JTVgkJMgotI2RlZmluZSBNTVBTX0VOQUJMRQkJMwotCi0KLS8vIEEtTVNEVSBzaXplCi0jZGVmaW5lCUFNU0RVXzAJMAotI2RlZmluZQlBTVNEVV8xCQkxCi0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotLy8gTUNTIHVzZSA3IGJpdHMKLSNkZWZpbmUgVFhSQVRFTUlNTwkJMHg4MAotI2RlZmluZSBUWFJBVEVNQ1MJCTB4N0YKLSNkZWZpbmUgVFhSQVRFT0ZETQkJMHg3RgotI2RlZmluZSBSQVRFXzEgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBSQVRFXzIgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBSQVRFXzVfNSAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBSQVRFXzExICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBSQVRFXzYgICAgICAgICAgICAgICAgICAgICAgNCAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV85ICAgICAgICAgICAgICAgICAgICAgIDUgICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMTIgICAgICAgICAgICAgICAgICAgICA2ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzE4ICAgICAgICAgICAgICAgICAgICAgNyAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV8yNCAgICAgICAgICAgICAgICAgICAgIDggICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfMzYgICAgICAgICAgICAgICAgICAgICA5ICAgLy8gT0ZETQotI2RlZmluZSBSQVRFXzQ4ICAgICAgICAgICAgICAgICAgICAgMTAgIC8vIE9GRE0KLSNkZWZpbmUgUkFURV81NCAgICAgICAgICAgICAgICAgICAgIDExICAvLyBPRkRNCi0jZGVmaW5lIFJBVEVfRklSU1RfT0ZETV9SQVRFICAgICAgICBSQVRFXzYKLSNkZWZpbmUgUkFURV9MQVNUX09GRE1fUkFURQkJUkFURV81NAotI2RlZmluZSBSQVRFXzZfNSAgICAgICAgICAgICAgICAgICAgMTIgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzEzICAgICAgICAgICAgICAgICAgICAgMTMgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzE5XzUgICAgICAgICAgICAgICAgICAgMTQgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzI2ICAgICAgICAgICAgICAgICAgICAgMTUgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzM5ICAgICAgICAgICAgICAgICAgICAgMTYgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzUyICAgICAgICAgICAgICAgICAgICAgMTcgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzU4XzUgICAgICAgICAgICAgICAgICAgMTggIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzY1ICAgICAgICAgICAgICAgICAgICAgMTkgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzc4ICAgICAgICAgICAgICAgICAgICAgMjAgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzEwNCAgICAgICAgICAgICAgICAgICAgMjEgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzExNyAgICAgICAgICAgICAgICAgICAgMjIgIC8vIEhUIG1peAotI2RlZmluZSBSQVRFXzEzMCAgICAgICAgICAgICAgICAgICAgMjMgIC8vIEhUIG1peAotLy8jZGVmaW5lIFJBVEVfQVVUT19TV0lUQ0ggICAgICAgICAgICAyNTUgLy8gZm9yIFN0YUNmZy5GaXhlZFR4UmF0ZSBvbmx5Ci0jZGVmaW5lIEhUUkFURV8wICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFJBVEVfRklSU1RfTU1fUkFURSAgICAgICAgSFRSQVRFXzAKLSNkZWZpbmUgUkFURV9GSVJTVF9IVF9SQVRFICAgICAgICBIVFJBVEVfMAotI2RlZmluZSBSQVRFX0xBU1RfSFRfUkFURSAgICAgICAgSFRSQVRFXzAKLQotLy8gcFR4V0ktPnR4b3AKLSNkZWZpbmUgSUZTX0hUVFhPUCAgICAgICAgICAgICAgICAgMAkvLyBUaGUgdHhvcCB3aWxsIGJlIGhhbmRsZXMgYnkgQVNJQy4KLSNkZWZpbmUgSUZTX1BJRlMgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgSUZTX1NJRlMgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSUZTX0JBQ0tPRkYgICAgICAgICAgICAgICAgIDMKLQotLy8gcFR4RC0+UmV0cnlNb2RlCi0jZGVmaW5lIExPTkdfUkVUUlkgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNIT1JUX1JFVFJZICAgICAgICAgICAgICAgICAwCi0KLS8vIENvdW50cnkgUmVnaW9uIGRlZmluaXRpb24KLSNkZWZpbmUgUkVHSU9OX01JTklNVU1fQkdfQkFORCAgICAgICAgICAgIDAKLSNkZWZpbmUgUkVHSU9OXzBfQkdfQkFORCAgICAgICAgICAgICAgICAgIDAgICAgICAgLy8gMS0xMQotI2RlZmluZSBSRUdJT05fMV9CR19CQU5EICAgICAgICAgICAgICAgICAgMSAgICAgICAvLyAxLTEzCi0jZGVmaW5lIFJFR0lPTl8yX0JHX0JBTkQgICAgICAgICAgICAgICAgICAyICAgICAgIC8vIDEwLTExCi0jZGVmaW5lIFJFR0lPTl8zX0JHX0JBTkQgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDEwLTEzCi0jZGVmaW5lIFJFR0lPTl80X0JHX0JBTkQgICAgICAgICAgICAgICAgICA0ICAgICAgIC8vIDE0Ci0jZGVmaW5lIFJFR0lPTl81X0JHX0JBTkQgICAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDEtMTQKLSNkZWZpbmUgUkVHSU9OXzZfQkdfQkFORCAgICAgICAgICAgICAgICAgIDYgICAgICAgLy8gMy05Ci0jZGVmaW5lIFJFR0lPTl83X0JHX0JBTkQgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDUtMTMKLSNkZWZpbmUgUkVHSU9OXzMxX0JHX0JBTkQgICAgICAgICAgICAgICAgIDMxICAgICAgIC8vIDUtMTMKLSNkZWZpbmUgUkVHSU9OX01BWElNVU1fQkdfQkFORCAgICAgICAgICAgIDcKLQotI2RlZmluZSBSRUdJT05fTUlOSU1VTV9BX0JBTkQgICAgICAgICAgICAgMAotI2RlZmluZSBSRUdJT05fMF9BX0JBTkQgICAgICAgICAgICAgICAgICAgMCAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0jZGVmaW5lIFJFR0lPTl8xX0FfQkFORCAgICAgICAgICAgICAgICAgICAxICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKLSNkZWZpbmUgUkVHSU9OXzJfQV9CQU5EICAgICAgICAgICAgICAgICAgIDIgICAgICAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0Ci0jZGVmaW5lIFJFR0lPTl8zX0FfQkFORCAgICAgICAgICAgICAgICAgICAzICAgICAgIC8vIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEKLSNkZWZpbmUgUkVHSU9OXzRfQV9CQU5EICAgICAgICAgICAgICAgICAgIDQgICAgICAgLy8gMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzVfQV9CQU5EICAgICAgICAgICAgICAgICAgIDUgICAgICAgLy8gMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl82X0FfQkFORCAgICAgICAgICAgICAgICAgICA2ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4Ci0jZGVmaW5lIFJFR0lPTl83X0FfQkFORCAgICAgICAgICAgICAgICAgICA3ICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MwotI2RlZmluZSBSRUdJT05fOF9BX0JBTkQgICAgICAgICAgICAgICAgICAgOCAgICAgICAvLyA1MiwgNTYsIDYwLCA2NAotI2RlZmluZSBSRUdJT05fOV9BX0JBTkQgICAgICAgICAgICAgICAgICAgOSAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQotI2RlZmluZSBSRUdJT05fMTBfQV9CQU5EICAgICAgICAgICAgICAgICAgMTAJICAvLyAzNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzExX0FfQkFORCAgICAgICAgICAgICAgICAgIDExCSAgLy8gMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxNDksIDE1MywgMTU3LCAxNjEKLSNkZWZpbmUgUkVHSU9OXzEyX0FfQkFORCAgICAgICAgICAgICAgICAgIDEyICAgICAgIC8vIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAKLSNkZWZpbmUgUkVHSU9OXzEzX0FfQkFORCAgICAgICAgICAgICAgICAgIDEzICAgICAgIC8vIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxCi0jZGVmaW5lIFJFR0lPTl8xNF9BX0JBTkQgICAgICAgICAgICAgICAgICAxNCAgICAgICAvLyAzNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjUKLSNkZWZpbmUgUkVHSU9OXzE1X0FfQkFORCAgICAgICAgICAgICAgICAgIDE1ICAgICAgIC8vIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1LCAxNjksIDE3MwotI2RlZmluZSBSRUdJT05fTUFYSU1VTV9BX0JBTkQgICAgICAgICAgICAgMTUKLQotLy8gcFR4RC0+Q2lwaGVyQWxnCi0jZGVmaW5lIENJUEhFUl9OT05FICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIENJUEhFUl9XRVA2NCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIENJUEhFUl9XRVAxMjggICAgICAgICAgICAgICAyCi0jZGVmaW5lIENJUEhFUl9US0lQICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIENJUEhFUl9BRVMgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIENJUEhFUl9DS0lQNjQgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIENJUEhFUl9DS0lQMTI4ICAgICAgICAgICAgICA2Ci0jZGVmaW5lIENJUEhFUl9US0lQX05PX01JQyAgICAgICAgICA3ICAgICAgIC8vIE1JQyBhcHBlbmRlZCBieSBkcml2ZXI6IG5vdCBhIHZhbGlkIHZhbHVlIGluIGhhcmR3YXJlIGtleSB0YWJsZQotI2RlZmluZSBDSVBIRVJfU01TNAkJCQkJOAotCi0KLS8vIExFRCBTdGF0dXMuCi0jZGVmaW5lIExFRF9MSU5LX0RPV04gICAgICAgICAgICAgICAwCi0jZGVmaW5lIExFRF9MSU5LX1VQICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExFRF9SQURJT19PRkYgICAgICAgICAgICAgICAyCi0jZGVmaW5lIExFRF9SQURJT19PTiAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIExFRF9IQUxUICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIExFRF9XUFMgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIExFRF9PTl9TSVRFX1NVUlZFWSAgICAgICAgICA2Ci0jZGVmaW5lIExFRF9QT1dFUl9VUCAgICAgICAgICAgICAgICA3Ci0KLQotLy8gdmFsdWUgZG9tYWluIG9mIHBBZC0+TGVkQ250bC5MZWRNb2RlIGFuZCBFMlBST00KLSNkZWZpbmUgTEVEX01PREVfREVGQVVMVCAgICAgICAgICAgIDAKLSNkZWZpbmUgTEVEX01PREVfVFdPX0xFRAkJCTEKLS8vI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJOCAgLy8gRUVQUk9NIGRlZmluZSA9OAotI2RlZmluZSBMRURfTU9ERV9TSUdOQUxfU1RSRUdUSAkJMHg0MCAvLyBFRVBST00gZGVmaW5lID0gNjQKLQotLy8gUkM0IGluaXQgdmFsdWUsIHVzZWQgZnJvIFdFUCAmIFRLSVAKLSNkZWZpbmUgUFBQSU5JVEZDUzMyICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYgICAvKiBJbml0aWFsIEZDUyB2YWx1ZSAqLwotCi0vLyB2YWx1ZSBkb21haW4gb2YgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQuIDgwMi4xWCBjb250cm9sbGVkIHBvcnQgZGVmaW5pdGlvbgotI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCAgICAgMQotI2RlZmluZSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQgMgotCi0jZGVmaW5lIFBBSVJXSVNFX0tFWSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEdST1VQX0tFWSAgICAgICAgICAgICAgICAgICAyCi0KLS8vZGVmaW5pdGlvbiBvZiBEUlMKLSNkZWZpbmUgTUFYX1NURVBfT0ZfVFhfUkFURV9TV0lUQ0gJMzIKLQotCi0vLyBwcmUtYWxsb2NhdGVkIGZyZWUgTkRJUyBQQUNLRVQvQlVGRkVSIHBvbGwgZm9yIGludGVybmFsIHVzYWdlCi0jZGVmaW5lIE1BWF9OVU1fT0ZfRlJFRV9ORElTX1BBQ0tFVCAxMjgKLQotLy9CbG9jayBBQ0sKLSNkZWZpbmUgTUFYX1RYX1JFT1JERVJCVUYgICA2NAotI2RlZmluZSBNQVhfUlhfUkVPUkRFUkJVRiAgIDY0Ci0jZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVCAgIDMwCi0jZGVmaW5lIERFRkFVTFRfUlhfVElNRU9VVCAgIDMwCi0KLS8vIGRlZmluaXRpb24gb2YgUmVjaXBpZW50IG9yIE9yaWdpbmF0b3IKLSNkZWZpbmUgSV9SRUNJUElFTlQgICAgICAgICAgICAgICAgICBUUlVFCi0jZGVmaW5lIElfT1JJR0lOQVRPUiAgICAgICAgICAgICAgICAgICBGQUxTRQotCi0jZGVmaW5lIERFRkFVTFRfQkJQX1RYX1BPV0VSICAgICAgICAwCi0jZGVmaW5lIERFRkFVTFRfUkZfVFhfUE9XRVIgICAgICAgICA1Ci0KLSNkZWZpbmUgTUFYX0lOSV9CVUZGRVJfU0laRQkJNDA5NgotI2RlZmluZSBNQVhfUEFSQU1fQlVGRkVSX1NJWkUJCSgyMDQ4KSAvLyBlbm91Z2ggZm9yIEFDTCAoMTgqNjQpCi0JCQkJCQkJCQkJCS8vMTggOiB0aGUgbGVuZ3RoIG9mIE1hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0ICIwMTowMjowMzowNDowNTowNjsiKQotCQkJCQkJCQkJCQkvLzY0IDogTUFYX05VTV9PRl9BQ0xfTElTVAotLy8gZGVmaW5pdGlvbiBvZiBwQWQtPk9wTW9kZQotI2RlZmluZSBPUE1PREVfU1RBICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBPUE1PREVfQVAgICAgICAgICAgICAgICAgICAgMQotLy8jZGVmaW5lIE9QTU9ERV9MM19CUkcgICAgICAgICAgICAgICAyICAgICAgIC8vIGFzIEFQIGFuZCBTVEEgYXQgdGhlIHNhbWUgdGltZQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotI2RlZmluZSBESVJfUkVBRCAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBESVJfV1JJVEUgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBUWVBFX1RYRCAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBUWVBFX1JYRCAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBUWVBFX1RYSU5GTwkJCQkJMAotI2RlZmluZSBUWVBFX1JYSU5GTwkJCQkJMQotI2RlZmluZSBUWVBFX1RYV0kJCQkJCTAKLSNkZWZpbmUgVFlQRV9SWFdJCQkJCQkxCi0jZW5kaWYKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBBUCBydG1wX2RlZi5oID09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gdmFsdWUgZG9tYWluIGZvciBwQWQtPkV2ZW50VGFiLkxvZ1tdLkV2ZW50Ci0jZGVmaW5lIEVWRU5UX1JFU0VUX0FDQ0VTU19QT0lOVCAgICAwIC8vIExvZyA9ICJoaDptbTpzcyAgIFJlc3RhcnQgQWNjZXNzIFBvaW50IgotI2RlZmluZSBFVkVOVF9BU1NPQ0lBVEVEICAgICAgICAgICAgMSAvLyBMb2cgPSAiaGg6bW06c3MgICBTVEEgMDA6MDE6MDI6MDM6MDQ6MDUgYXNzb2NpYXRlZCIKLSNkZWZpbmUgRVZFTlRfRElTQVNTT0NJQVRFRCAgICAgICAgIDIgLy8gTG9nID0gImhoOm1tOnNzICAgU1RBIDAwOjAxOjAyOjAzOjA0OjA1IGxlZnQgdGhpcyBCU1MiCi0jZGVmaW5lIEVWRU5UX0FHRURfT1VUICAgICAgICAgICAgICAzIC8vIExvZyA9ICJoaDptbTpzcyAgIFNUQSAwMDowMTowMjowMzowNDowNSB3YXMgYWdlZC1vdXQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIEJTUyIKLSNkZWZpbmUgRVZFTlRfQ09VTlRFUl9NICAgICAgICAgICAgIDQKLSNkZWZpbmUgRVZFTlRfSU5WQUxJRF9QU0sgICAgICAgICAgIDUKLSNkZWZpbmUgRVZFTlRfTUFYX0VWRU5UX1RZUEUgICAgICAgIDYKLS8vID09PT0gZW5kIG9mIEFQIHJ0bXBfZGVmLmggPT09PT09PT09PT09Ci0KLS8vIGRlZmluaXRpb24gUlNTSSBOdW1iZXIKLSNkZWZpbmUgUlNTSV8wCQkJCQkwCi0jZGVmaW5lIFJTU0lfMQkJCQkJMQotI2RlZmluZSBSU1NJXzIJCQkJCTIKLQotLy8gZGVmaW5pdGlvbiBvZiByYWRhciBkZXRlY3Rpb24KLSNkZWZpbmUgUkRfTk9STUFMX01PREUJCQkJMAkvLyBOb3QgZm91bmQgcmFkYXIgc2lnbmFsCi0jZGVmaW5lIFJEX1NXSVRDSElOR19NT0RFCQkJMQkvLyBGb3VuZCByYWRhciBzaWduYWwsIGFuZCBkb2luZyBjaGFubmVsIHN3aXRjaAotI2RlZmluZSBSRF9TSUxFTkNFX01PREUJCQkJMgkvLyBBZnRlciBjaGFubmVsIHN3aXRjaCwgbmVlZCB0byBiZSBzaWxlbmNlIGEgd2hpbGUgdG8gZW5zdXJlIHJhZGFyIG5vdCBmb3VuZAotCi0vL0RyaXZlciBkZWZpbmVkIGNpZCBmb3IgbWFwcGluZyBzdGF0dXMgYW5kIGNvbW1hbmQuCi0jZGVmaW5lICBTTEVFUENJRAkweDExCi0jZGVmaW5lICBXQUtFQ0lECTB4MjIKLSNkZWZpbmUgIFFVRVJZUE9XRVJDSUQJMHgzMwotI2RlZmluZSAgT1dORVJNQ1UJMHgxCi0jZGVmaW5lICBPV05FUkNQVQkweDAKLQotLy8gTUJTU0lEIGRlZmluaXRpb24KLSNkZWZpbmUgRU5UUllfTk9UX0ZPVU5EICAgICAgICAgICAgIDB4RkYKLQotCi0vKiBBZnRlciBMaW51eCAyLjYuOSwKLSAqIFZMQU4gbW9kdWxlIHVzZSBQcml2YXRlIChmcm9tIHVzZXIpIGludGVyZmFjZSBmbGFncyAobmV0ZGV2aWNlLT5wcml2X2ZsYWdzKS4KLSAqICNkZWZpbmUgSUZGXzgwMl8xUV9WTEFOIDB4MSAgICAgICAgIC0tICAgIDgwMi4xUSBWTEFOIGRldmljZS4gIGluIGlmLmgKLSAqIHJlZiB0byBpcF9zYWJvdGFnZV9vdXQoKSBbIG91dC0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiBdIGluIGJyX25ldGZpbHRlci5jCi0gKgotICogRm9yIHRoaXMgcmVhc29uLCB3ZSBNVVNUIHVzZSBFVkVOIHZhbHVlIGluIHByaXZfZmxhZ3MKLSAqLwotI2RlZmluZSBJTlRfTUFJTgkJCTB4MDEwMAotI2RlZmluZSBJTlRfTUJTU0lECQkJMHgwMjAwCi0jZGVmaW5lIElOVF9XRFMJCQkJMHgwMzAwCi0jZGVmaW5lIElOVF9BUENMSQkJCTB4MDQwMAotI2RlZmluZSBJTlRfTUVTSAkJCTB4MDUwMAotCi0jZGVmaW5lIElORl9NQUlOX0RFVl9OQU1FCQkid2xhbiIKLSNkZWZpbmUgSU5GX01CU1NJRF9ERVZfTkFNRQkJIndsYW4iCi0jZGVmaW5lIElORl9XRFNfREVWX05BTUUJCSJ3ZHMiCi0jZGVmaW5lIElORl9BUENMSV9ERVZfTkFNRQkJImFwY2xpIgotI2RlZmluZSBJTkZfTUVTSF9ERVZfTkFNRQkJIm1lc2giCi0KLS8vIFVzZSBiaXRtYXAgdG8gYWxsb3cgY29leGlzdCBvZiBBVEVfVFhGUkFNRSBhbmQgQVRFX1JYRlJBTUUoaS5lLix0byBzdXBwb3J0IExvb3BCYWNrIG1vZGUpLgotI2lmZGVmIFJBTElOS19BVEUKLSNkZWZpbmUJQVRFX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4MDAgICAvLyBTdGFydCBBVEUKLSNkZWZpbmUJQVRFX1NUT1AgICAgICAgICAgICAgICAgICAgIDB4ODAgICAvLyBTdG9wIEFURQotI2RlZmluZQlBVEVfVFhDT05UICAgICAgICAgICAgICAgICAgMHgwNSAgIC8vIENvbnRpbnVvdXMgVHJhbnNtaXQKLSNkZWZpbmUJQVRFX1RYQ0FSUiAgICAgICAgICAgICAgICAgIDB4MDkgICAvLyBUcmFuc21pdCBDYXJyaWVyCi0jZGVmaW5lCUFURV9UWENBUlJTVVBQICAgICAgICAgICAgICAweDExICAgLy8gVHJhbnNtaXQgQ2FycmllciBTdXBwcmVzc2lvbgotI2RlZmluZQlBVEVfVFhGUkFNRSAgICAgICAgICAgICAgICAgMHgwMSAgIC8vIFRyYW5zbWl0IEZyYW1lcwotI2RlZmluZQlBVEVfUlhGUkFNRSAgICAgICAgICAgICAgICAgMHgwMiAgIC8vIFJlY2VpdmUgRnJhbWVzCi0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLSNkZWZpbmUgQVRFX1RYU1RPUCAgICAgICAgICAgICAgICAgIDB4ZTIgICAvLyBTdG9wIFRyYW5zbWl0aW9uKGkuZS4sIFRYQ09OVCwgVFhDQVJSLCBUWENBUlJTVVBQLCBhbmQgVFhGUkFNRSkKLSNkZWZpbmUgQVRFX1JYU1RPUAkJCQkJMHhmZCAgIC8vIFN0b3AgcmVjZWl2aW5nIEZyYW1lcwotI2RlZmluZQlCQlAyMl9UWEZSQU1FCQkJCTB4MDAgICAvLyBUcmFuc21pdCBGcmFtZXMKLSNkZWZpbmUJQkJQMjJfVFhDT05UX09SX0NBUlJTVVBQICAgIDB4ODAgICAvLyBDb250aW51b3VzIFRyYW5zbWl0IG9yIENhcnJpZXIgU3VwcHJlc3Npb24KLSNkZWZpbmUJQkJQMjJfVFhDQVJSICAgICAgICAgICAgICAgIDB4YzEgICAvLyBUcmFuc21pdCBDYXJyaWVyCi0jZGVmaW5lCUJCUDI0X1RYQ09OVCAgICAgICAgICAgICAgICAweDAwICAgLy8gQ29udGludW91cyBUcmFuc21pdAotI2RlZmluZQlCQlAyNF9DQVJSU1VQUCAgICAgICAgICAgICAgMHgwMSAgIC8vIENhcnJpZXIgU3VwcHJlc3Npb24KLSNlbmRpZiAvLyBSQUxJTktfMjh4eF9RQSAvLwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotLy8gV0VQIEtleSBUWVBFCi0jZGVmaW5lIFdFUF9IRVhBREVDSU1BTF9UWVBFICAgIDAKLSNkZWZpbmUgV0VQX0FTQ0lJX1RZUEUgICAgICAgICAgMQotCi0KLQotLy8gV0lSRUxFU1MgRVZFTlRTIGRlZmluaXRpb24KLS8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQsIHJlZmVyIHRvIHdpcmVsZXNzX3Rvb2xzLjI4L3dpcmVsZXNzLjIwLmggKi8KLSNkZWZpbmUgSVdfQ1VTVE9NX01BWF9MRU4JCQkJCQkJMjU1CS8qIEluIGJ5dGVzICovCi0KLS8vIEZvciBzeXN0ZW0gZXZlbnQgLSBzdGFydAotI2RlZmluZQlJV19TWVNfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZQlJV19BU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZQlJV19ESVNBU1NPQ19FVkVOVF9GTEFHICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQotI2RlZmluZQlJV19ERUFVVEhfRVZFTlRfRkxBRwkJCQkweDAyMDIKLSNkZWZpbmUJSVdfQUdFT1VUX0VWRU5UX0ZMQUcJCQkJMHgwMjAzCi0jZGVmaW5lCUlXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRyAgICAgICAgICAgICAgMHgwMjA0Ci0jZGVmaW5lCUlXX1JFUExBWV9DT1VOVEVSX0RJRkZfRVZFTlRfRkxBRyAgICAgICAgICAgMHgwMjA1Ci0jZGVmaW5lCUlXX1JTTklFX0RJRkZfRVZFTlRfRkxBRwkJCQkweDAyMDYKLSNkZWZpbmUJSVdfTUlDX0RJRkZfRVZFTlRfRkxBRwkJCQkJMHgwMjA3Ci0jZGVmaW5lIElXX0lDVl9FUlJPUl9FVkVOVF9GTEFHCQkJCQkJMHgwMjA4Ci0jZGVmaW5lIElXX01JQ19FUlJPUl9FVkVOVF9GTEFHCQkJCQkJMHgwMjA5Ci0jZGVmaW5lIElXX0dST1VQX0hTX1RJTUVPVVRfRVZFTlRfRkxBRwkJCQkweDAyMEEKLSNkZWZpbmUJSVdfUEFJUldJU0VfSFNfVElNRU9VVF9FVkVOVF9GTEFHCQkJMHgwMjBCCi0jZGVmaW5lIElXX1JTTklFX1NBTklUWV9GQUlMX0VWRU5UX0ZMQUcJCQkJMHgwMjBDCi0jZGVmaW5lIElXX1NFVF9LRVlfRE9ORV9XUEExX0VWRU5UX0ZMQUcJCQkJMHgwMjBECi0jZGVmaW5lIElXX1NFVF9LRVlfRE9ORV9XUEEyX0VWRU5UX0ZMQUcJCQkJMHgwMjBFCi0jZGVmaW5lIElXX1NUQV9MSU5LVVBfRVZFTlRfRkxBRwkJCQkJMHgwMjBGCi0jZGVmaW5lIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHCQkJCQkweDAyMTAKLSNkZWZpbmUgSVdfU0NBTl9DT01QTEVURURfRVZFTlRfRkxBRwkJCQkweDAyMTEKLSNkZWZpbmUgSVdfU0NBTl9FTlFVRVVFX0ZBSUxfRVZFTlRfRkxBRwkJCQkweDAyMTIKLS8vIGlmIGFkZCBuZXcgc3lzdGVtIGV2ZW50IGZsYWcsIHBsZWFzZSB1cGFkdGUgdGhlIElXX1NZU19FVkVOVF9GTEFHX0VORAotI2RlZmluZQlJV19TWVNfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAgIDB4MDIxMgotI2RlZmluZQlJV19TWVNfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfU1lTX0VWRU5UX0ZMQUdfRU5EIC0gSVdfU1lTX0VWRU5UX0ZMQUdfU1RBUlQgKyAxKQotLy8gRm9yIHN5c3RlbSBldmVudCAtIGVuZAotCi0vLyBGb3Igc3Bvb2YgYXR0YWNrIGV2ZW50IC0gc3RhcnQKLSNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfRkxBR19TVEFSVCAgICAgICAgICAgICAgICAgICAweDAzMDAKLSNkZWZpbmUgSVdfQ09ORkxJQ1RfU1NJRF9FVkVOVF9GTEFHCQkJCQkweDAzMDAKLSNkZWZpbmUgSVdfU1BPT0ZfQVNTT0NfUkVTUF9FVkVOVF9GTEFHCQkJCTB4MDMwMQotI2RlZmluZSBJV19TUE9PRl9SRUFTU09DX1JFU1BfRVZFTlRfRkxBRwkJCTB4MDMwMgotI2RlZmluZSBJV19TUE9PRl9QUk9CRV9SRVNQX0VWRU5UX0ZMQUcJCQkJMHgwMzAzCi0jZGVmaW5lIElXX1NQT09GX0JFQUNPTl9FVkVOVF9GTEFHCQkJCQkweDAzMDQKLSNkZWZpbmUgSVdfU1BPT0ZfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDAzMDUKLSNkZWZpbmUgSVdfU1BPT0ZfQVVUSF9FVkVOVF9GTEFHCQkJCQkweDAzMDYKLSNkZWZpbmUgSVdfU1BPT0ZfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDMwNwotI2RlZmluZSBJV19TUE9PRl9VTktOT1dOX01HTVRfRVZFTlRfRkxBRwkJCTB4MDMwOAotI2RlZmluZSBJV19SRVBMQVlfQVRUQUNLX0VWRU5UX0ZMQUcJCQkJCTB4MDMwOQotLy8gaWYgYWRkIG5ldyBzcG9vZiBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQKLSNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgICAgICAgICAgICAgICAgICAgICAweDAzMDkKLSNkZWZpbmUJSVdfU1BPT0ZfRVZFTlRfVFlQRV9OVU0JCQkJCQkoSVdfU1BPT0ZfRVZFTlRfRkxBR19FTkQgLSBJV19TUE9PRl9FVkVOVF9GTEFHX1NUQVJUICsgMSkKLS8vIEZvciBzcG9vZiBhdHRhY2sgZXZlbnQgLSBlbmQKLQotLy8gRm9yIGZsb29kaW5nIGF0dGFjayBldmVudCAtIHN0YXJ0Ci0jZGVmaW5lCUlXX0ZMT09EX0VWRU5UX0ZMQUdfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIElXX0ZMT09EX0FVVEhfRVZFTlRfRkxBRwkJCQkJMHgwNDAwCi0jZGVmaW5lIElXX0ZMT09EX0FTU09DX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMQotI2RlZmluZSBJV19GTE9PRF9SRUFTU09DX1JFUV9FVkVOVF9GTEFHCQkJCTB4MDQwMgotI2RlZmluZSBJV19GTE9PRF9QUk9CRV9SRVFfRVZFTlRfRkxBRwkJCQkweDA0MDMKLSNkZWZpbmUgSVdfRkxPT0RfRElTQVNTT0NfRVZFTlRfRkxBRwkJCQkweDA0MDQKLSNkZWZpbmUgSVdfRkxPT0RfREVBVVRIX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNQotI2RlZmluZSBJV19GTE9PRF9FQVBfUkVRX0VWRU5UX0ZMQUcJCQkJCTB4MDQwNgotLy8gaWYgYWRkIG5ldyBmbG9vZGluZyBhdHRhY2sgZXZlbnQgZmxhZywgcGxlYXNlIHVwYWR0ZSB0aGUgSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQKLSNkZWZpbmUJSVdfRkxPT0RfRVZFTlRfRkxBR19FTkQJCQkJMHgwNDA2Ci0jZGVmaW5lCUlXX0ZMT09EX0VWRU5UX1RZUEVfTlVNCQkJCQkJKElXX0ZMT09EX0VWRU5UX0ZMQUdfRU5EIC0gSVdfRkxPT0RfRVZFTlRfRkxBR19TVEFSVCArIDEpCi0vLyBGb3IgZmxvb2RpbmcgYXR0YWNrIC0gZW5kCi0KLS8vIEVuZCAtIFdJUkVMRVNTIEVWRU5UUyBkZWZpbml0aW9uCi0KLSNpZmRlZiBDT05GSUdfU1RBX1NVUFBPUlQKLS8vIGRlZmluaXRpb24gZm9yIERMUywga2F0aHkKLSNkZWZpbmUJTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSAgIDEKLSNkZWZpbmUJTUFYX05VTV9PRl9ETFNfRU5UUlkgICAgICAgIE1BWF9OVU1CRVJfT0ZfRExTX0VOVFJZCi0KLS8vQmxvY2sgQUNLLCBrYXRoeQotI2RlZmluZSBNQVhfVFhfUkVPUkRFUkJVRgkJNjQKLSNkZWZpbmUgTUFYX1JYX1JFT1JERVJCVUYJCTY0Ci0jZGVmaW5lIERFRkFVTFRfVFhfVElNRU9VVAkJMzAKLSNkZWZpbmUgREVGQVVMVF9SWF9USU1FT1VUCQkzMAotI2RlZmluZSBNQVhfQkFSRUNJX1NFU1NJT04JCTgKLQotI2lmbmRlZiBJV19FU1NJRF9NQVhfU0laRQotLyogTWF4aW11bSBzaXplIG9mIHRoZSBFU1NJRCBhbmQgcEFkLT5uaWNrbmFtZSBzdHJpbmdzICovCi0jZGVmaW5lIElXX0VTU0lEX01BWF9TSVpFCQkzMgotI2VuZGlmCi0jZW5kaWYgLy8gQ09ORklHX1NUQV9TVVBQT1JUIC8vCi0KLSNpZmRlZiBNQ0FTVF9SQVRFX1NQRUNJRklDCi0jZGVmaW5lIE1DQVNUX0RJU0FCTEUJMAotI2RlZmluZSBNQ0FTVF9DQ0sJCTEKLSNkZWZpbmUgTUNBU1RfT0ZETQkJMgotI2RlZmluZSBNQ0FTVF9IVE1JWAkJMwotI2VuZGlmIC8vIE1DQVNUX1JBVEVfU1BFQ0lGSUMgLy8KLQotLy8gRm9yIEFzaWNSYWRpb09mZi9Bc2ljUmFkaW9PbiBmdW5jdGlvbgotI2RlZmluZSBET1QxMVBPV0VSU0FWRQkJMAotI2RlZmluZSBHVUlSQURJT19PRkYJCTEKLSNkZWZpbmUgUlRNUF9IQUxUCQkgICAgMgotI2RlZmluZSBHVUlfSURMRV9QT1dFUl9TQVZFCQkzCi0vLyAtLQotCi0KLS8vIGRlZmluaXRpb24gZm9yIFdwYVN1cHBvcnQgZmxhZwotI2RlZmluZSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFCQkJCTAKLSNkZWZpbmUgV1BBX1NVUFBMSUNBTlRfRU5BQkxFCQkJCTEKLSNkZWZpbmUJV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJCTIKLQotLy8gZGVmaW5pdGlvbiBmb3IgQW50ZW5uYSBEaXZlcnNpdHkgZmxhZwotI2lmZGVmIEFOVF9ESVZFUlNJVFlfU1VQUE9SVAotZW51bSBBTlRfRElWRVJTSVRZX1RZUEUgewotICAgIEFOVF9ESVZFUlNJVFlfRElTQUJMRSA9IDAsCi0gICAgQU5UX0RJVkVSU0lUWV9FTkFCTEUgPSAxLAotICAgIEFOVF9GSVhfQU5UMSA9IDIsCi0gICAgQU5UX0ZJWF9BTlQyID0gMwotfTsKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLQotLy8gRW5kaWFuIGJ5dGUgc3dhcHBpbmcgY29kZXMKLSNkZWZpbmUgU1dBUDE2KHgpIFwKLSAgICAoKFVJTlQxNikoIFwKLSAgICAoKChVSU5UMTYpKHgpICYgKFVJTlQxNikgMHgwMGZmVSkgPDwgOCkgfCBcCi0gICAgKCgoVUlOVDE2KSh4KSAmIChVSU5UMTYpIDB4ZmYwMFUpID4+IDgpICkpCi0KLSNkZWZpbmUgU1dBUDMyKHgpIFwKLSAgICAoKFVJTlQzMikoIFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCi0gICAgKCgoVUlOVDMyKSh4KSAmIChVSU5UMzIpIDB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAotICAgICgoKFVJTlQzMikoeCkgJiAoVUlOVDMyKSAweDAwZmYwMDAwVUwpID4+ICA4KSB8IFwKLSAgICAoKChVSU5UMzIpKHgpICYgKFVJTlQzMikgMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKLQotI2RlZmluZSBTV0FQNjQoeCkgXAotICAgICgoVUlOVDY0KSggXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAotICAgIChVSU5UNjQpKCgoVUlOVDY0KSh4KSAmIChVSU5UNjQpIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCi0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0KLSNkZWZpbmUgY3B1MmxlNjQoeCkgU1dBUDY0KCh4KSkKLSNkZWZpbmUgbGUyY3B1NjQoeCkgU1dBUDY0KCh4KSkKLSNkZWZpbmUgY3B1MmxlMzIoeCkgU1dBUDMyKCh4KSkKLSNkZWZpbmUgbGUyY3B1MzIoeCkgU1dBUDMyKCh4KSkKLSNkZWZpbmUgY3B1MmxlMTYoeCkgU1dBUDE2KCh4KSkKLSNkZWZpbmUgbGUyY3B1MTYoeCkgU1dBUDE2KCh4KSkKLSNkZWZpbmUgY3B1MmJlNjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBiZTJjcHU2NCh4KSAoKFVJTlQ2NCkoeCkpCi0jZGVmaW5lIGNwdTJiZTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgYmUyY3B1MzIoeCkgKChVSU5UMzIpKHgpKQotI2RlZmluZSBjcHUyYmUxNih4KSAoKFVJTlQxNikoeCkpCi0jZGVmaW5lIGJlMmNwdTE2KHgpICgoVUlOVDE2KSh4KSkKLQotI2Vsc2UgICAvLyBMaXR0bGVfRW5kaWFuCi0KLSNkZWZpbmUgY3B1MmxlNjQoeCkgKChVSU5UNjQpKHgpKQotI2RlZmluZSBsZTJjcHU2NCh4KSAoKFVJTlQ2NCkoeCkpCi0jZGVmaW5lIGNwdTJsZTMyKHgpICgoVUlOVDMyKSh4KSkKLSNkZWZpbmUgbGUyY3B1MzIoeCkgKChVSU5UMzIpKHgpKQotI2RlZmluZSBjcHUybGUxNih4KSAoKFVJTlQxNikoeCkpCi0jZGVmaW5lIGxlMmNwdTE2KHgpICgoVUlOVDE2KSh4KSkKLSNkZWZpbmUgY3B1MmJlNjQoeCkgU1dBUDY0KCh4KSkKLSNkZWZpbmUgYmUyY3B1NjQoeCkgU1dBUDY0KCh4KSkKLSNkZWZpbmUgY3B1MmJlMzIoeCkgU1dBUDMyKCh4KSkKLSNkZWZpbmUgYmUyY3B1MzIoeCkgU1dBUDMyKCh4KSkKLSNkZWZpbmUgY3B1MmJlMTYoeCkgU1dBUDE2KCh4KSkKLSNkZWZpbmUgYmUyY3B1MTYoeCkgU1dBUDE2KCh4KSkKLQotI2VuZGlmICAvLyBSVF9CSUdfRU5ESUFOCi0KLSNkZWZpbmUgQUJTKF94LCBfeSkgKChfeCkgPiAoX3kpKSA/ICgoX3gpIC0oX3kpKSA6ICgoX3kpIC0oX3gpKQotCi0KLSNkZWZpbmUgQTJEZWMoX1gsIF9wKQkJCQlcCi17CQkJCQkJCQkJXAotCVVDSEFSICpwOwkJCQkJCVwKLQlfWCA9IDA7CQkJCQkJCVwKLQlwID0gX3A7CQkJCQkJCVwKLQl3aGlsZSAoKCgqcCA+PSAnMCcpICYmICgqcCA8PSAnOScpKSkJCVwKLQl7CQkJCQkJCQkJCQkJXAotCQlpZiAoKCpwID49ICcwJykgJiYgKCpwIDw9ICc5JykpCQlcCi0JCQlfWCA9IF9YICogMTAgKyAqcCAtIDQ4OwkJCQkJXAotCQlwKys7CQkJCQkJCQkJCVwKLQl9CQkJCQkJCQkJCQkJXAotfQotCi0KLSNkZWZpbmUgQTJIZXgoX1gsIF9wKQkJCQlcCi1kb3sJCQkJCQkJCQlcCi0JY2hhciAqX19wOwkJCQkJCVwKLQkoX1gpID0gMDsJCQkJCQkJXAotCV9fcCA9IChjaGFyICopKF9wKTsJCQkJCQkJXAotCXdoaWxlICgoKCpfX3AgPj0gJ2EnKSAmJiAoKl9fcCA8PSAnZicpKSB8fCAoKCpfX3AgPj0gJ0EnKSAmJiAoKl9fcCA8PSAnRicpKSB8fCAoKCpfX3AgPj0gJzAnKSAmJiAoKl9fcCA8PSAnOScpKSkJCVwKLQl7CQkJCQkJCQkJCQkJXAotCQlpZiAoKCpfX3AgPj0gJ2EnKSAmJiAoKl9fcCA8PSAnZicpKQkJCQlcCi0JCQkoX1gpID0gKF9YKSAqIDE2ICsgKl9fcCAtIDg3OwkJCQkJXAotCQllbHNlIGlmICgoKl9fcCA+PSAnQScpICYmICgqX19wIDw9ICdGJykpCQlcCi0JCQkoX1gpID0gKF9YKSAqIDE2ICsgKl9fcCAtIDU1OwkJCQkJXAotCQllbHNlIGlmICgoKl9fcCA+PSAnMCcpICYmICgqX19wIDw9ICc5JykpCQlcCi0JCQkoX1gpID0gKF9YKSAqIDE2ICsgKl9fcCAtIDQ4OwkJCQkJXAotCQlfX3ArKzsJCQkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQlcCi19d2hpbGUoMCkKLQotI2VuZGlmICAvLyBfX1JUTVBfREVGX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX2RvdDExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZG90MTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzNzgyNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfZG90MTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19ET1QxMV9CQVNFX0hfXwotI2RlZmluZSBfX0RPVDExX0JBU0VfSF9fCi0KLSNpbmNsdWRlICJydG1wX3R5cGUuaCIKLQotCi0vLyA0LWJ5dGUgSFRDIGZpZWxkLiAgbWF5YmUgaW5jbHVkZWQgaW4gYW55IGZyYW1lIGV4Y2VwdCBub24tUU9TIGRhdGEgZnJhbWUuICBUaGUgT3JkZXIgYml0IG11c3Qgc2V0IDEuCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVSU5UMzIJCVJERzoxOwkvL1JERyAvIE1vcmUgUFBEVQotICAgIFVJTlQzMgkJQUNDb25zdHJhaW50OjE7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJcnN2OjU7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlaTEZBbm5vdWNlOjE7CS8vIFpMRiBhbm5vdW5jZW1lbnQKLSAgICBVSU5UMzIJCUNTSVNURUVSSU5HOjI7CS8vQ1NJLyBTVEVFUklORwotICAgIFVJTlQzMgkJRkJLUmVxOjI7CS8vZmVlZGJhY2sgcmVxdWVzdAotICAgIFVJTlQzMgkJQ2FsU2VxOjI7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlDYWxQb3M6MjsJLy8gY2FsaWJyYXRpb24gcG9zaXRpb24KLSAgICBVSU5UMzIJCU1GQm9yQVNDOjc7CS8vTGluayBhZGFwdGF0aW9uIGZlZWRiYWNrIGNvbnRhaW5pbmcgcmVjb21tZW5kZWQgTUNTLiAweDdmIGZvciBubyBmZWVkYmFjayBvciBub3QgYXZhaWxhYmxlCi0gICAgVUlOVDMyCQlNRlM6MzsJLy9TRVQgdG8gdGhlIHJlY2VpdmVkIHZhbHVlIG9mIE1SUy4gMHgxMTEgZm9yIHVuc29saWNpdGVkIE1GQi4KLSAgICBVSU5UMzIJCU1SU29yQVNJOjM7CS8vIE1SUSBTZXF1ZW5jZSBpZGVudGlmaWVyLiB1bmNoYW5nZWQgZHVyaW5nIGVudGlyZSBwcm9jZWR1cmUuIDB4MDAwLTB4MTEwLgotICAgIFVJTlQzMgkJTVJROjE7CS8vTUNTIGZlZWRiYWNrLiBSZXF1ZXN0IGZvciBhIE1DUyBmZWVkYmFjawotICAgIFVJTlQzMgkJVFJROjE7CS8vc291bmRpbmcgcmVxdWVzdAotICAgIFVJTlQzMgkJTUE6MTsJLy9tYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpCi0jZWxzZQotICAgIFVJTlQzMgkJTUE6MTsJLy9tYW5hZ2VtZW50IGFjdGlvbiBwYXlsb2FkIGV4aXN0IGluIChRb1MgTnVsbCtIVEMpCi0gICAgVUlOVDMyCQlUUlE6MTsJLy9zb3VuZGluZyByZXF1ZXN0Ci0gICAgVUlOVDMyCQlNUlE6MTsJLy9NQ1MgZmVlZGJhY2suIFJlcXVlc3QgZm9yIGEgTUNTIGZlZWRiYWNrCi0gICAgVUlOVDMyCQlNUlNvckFTSTozOwkvLyBNUlEgU2VxdWVuY2UgaWRlbnRpZmllci4gdW5jaGFuZ2VkIGR1cmluZyBlbnRpcmUgcHJvY2VkdXJlLiAweDAwMC0weDExMC4KLSAgICBVSU5UMzIJCU1GUzozOwkvL1NFVCB0byB0aGUgcmVjZWl2ZWQgdmFsdWUgb2YgTVJTLiAweDExMSBmb3IgdW5zb2xpY2l0ZWQgTUZCLgotICAgIFVJTlQzMgkJTUZCb3JBU0M6NzsJLy9MaW5rIGFkYXB0YXRpb24gZmVlZGJhY2sgY29udGFpbmluZyByZWNvbW1lbmRlZCBNQ1MuIDB4N2YgZm9yIG5vIGZlZWRiYWNrIG9yIG5vdCBhdmFpbGFibGUKLSAgICBVSU5UMzIJCUNhbFBvczoyOwkvLyBjYWxpYnJhdGlvbiBwb3NpdGlvbgotICAgIFVJTlQzMgkJQ2FsU2VxOjI7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlGQktSZXE6MjsJLy9mZWVkYmFjayByZXF1ZXN0Ci0gICAgVUlOVDMyCQlDU0lTVEVFUklORzoyOwkvL0NTSS8gU1RFRVJJTkcKLSAgICBVSU5UMzIJCVpMRkFubm91Y2U6MTsJLy8gWkxGIGFubm91bmNlbWVudAotICAgIFVJTlQzMgkJcnN2OjU7ICAvL2NhbGlicmF0aW9uIHNlcXVlbmNlCi0gICAgVUlOVDMyCQlBQ0NvbnN0cmFpbnQ6MTsJLy9mZWVkYmFjayByZXF1ZXN0Ci0gICAgVUlOVDMyCQlSREc6MTsJLy9SREcgLyBNb3JlIFBQRFUKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotfSBIVF9DT05UUk9MLCAqUEhUX0NPTlRST0w7Ci0KLS8vIDItYnl0ZSBRT1MgQ09OVFJPTCBmaWVsZAotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgVVNIT1JUICAgICAgVHhvcF9RdWV1ZVNpemU6ODsKLSAgICBVU0hPUlQgICAgICBBTXNkdVByZXNlbnQ6MTsKLSAgICBVU0hPUlQgICAgICBBY2tQb2xpY3k6MjsgIC8vMDogbm9ybWFsIEFDSyAxOk5vIEFDSyAyOnNjaGVkdWxlZCB1bmRlciBNVEJBL1BTTVAgIDM6IEJBCi0gICAgVVNIT1JUICAgICAgRU9TUDoxOwotICAgIFVTSE9SVCAgICAgIFRJRDo0OwotI2Vsc2UKLSAgICBVU0hPUlQgICAgICBUSUQ6NDsKLSAgICBVU0hPUlQgICAgICBFT1NQOjE7Ci0gICAgVVNIT1JUICAgICAgQWNrUG9saWN5OjI7ICAvLzA6IG5vcm1hbCBBQ0sgMTpObyBBQ0sgMjpzY2hlZHVsZWQgdW5kZXIgTVRCQS9QU01QICAzOiBCQQotICAgIFVTSE9SVCAgICAgIEFNc2R1UHJlc2VudDoxOwotICAgIFVTSE9SVCAgICAgIFR4b3BfUXVldWVTaXplOjg7Ci0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gUU9TX0NPTlRST0wsICpQUU9TX0NPTlRST0w7Ci0KLQotLy8gMi1ieXRlIEZyYW1lIGNvbnRyb2wgZmllbGQKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCB7Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCVVTSE9SVAkJT3JkZXI6MTsJCQkvLyBTdHJpY3Qgb3JkZXIgZXhwZWN0ZWQKLQlVU0hPUlQJCVdlcDoxOwkJCQkvLyBXZXAgZGF0YQotCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0Ci0JVVNIT1JUCQlQd3JNZ210OjE7CQkJLy8gUG93ZXIgbWFuYWdlbWVudCBiaXQKLQlVU0hPUlQJCVJldHJ5OjE7CQkJLy8gUmV0cnkgc3RhdHVzIGJpdAotCVVTSE9SVAkJTW9yZUZyYWc6MTsJCQkvLyBNb3JlIGZyYWdtZW50IGJpdAotCVVTSE9SVAkJRnJEczoxOwkJCQkvLyBGcm9tIERTIGluZGljYXRpb24KLQlVU0hPUlQJCVRvRHM6MTsJCQkJLy8gVG8gRFMgaW5kaWNhdGlvbgotCVVTSE9SVAkJU3ViVHlwZTo0OwkJCS8vIE1TRFUgc3VidHlwZQotCVVTSE9SVAkJVHlwZToyOwkJCQkvLyBNU0RVIHR5cGUKLQlVU0hPUlQJCVZlcjoyOwkJCQkvLyBQcm90b2NvbCB2ZXJzaW9uCi0jZWxzZQotCVVTSE9SVAkJVmVyOjI7CQkJCS8vIFByb3RvY29sIHZlcnNpb24KLQlVU0hPUlQJCVR5cGU6MjsJCQkJLy8gTVNEVSB0eXBlCi0JVVNIT1JUCQlTdWJUeXBlOjQ7CQkJLy8gTVNEVSBzdWJ0eXBlCi0JVVNIT1JUCQlUb0RzOjE7CQkJCS8vIFRvIERTIGluZGljYXRpb24KLQlVU0hPUlQJCUZyRHM6MTsJCQkJLy8gRnJvbSBEUyBpbmRpY2F0aW9uCi0JVVNIT1JUCQlNb3JlRnJhZzoxOwkJCS8vIE1vcmUgZnJhZ21lbnQgYml0Ci0JVVNIT1JUCQlSZXRyeToxOwkJCS8vIFJldHJ5IHN0YXR1cyBiaXQKLQlVU0hPUlQJCVB3ck1nbXQ6MTsJCQkvLyBQb3dlciBtYW5hZ2VtZW50IGJpdAotCVVTSE9SVAkJTW9yZURhdGE6MTsJCQkvLyBNb3JlIGRhdGEgYml0Ci0JVVNIT1JUCQlXZXA6MTsJCQkJLy8gV2VwIGRhdGEKLQlVU0hPUlQJCU9yZGVyOjE7CQkJLy8gU3RyaWN0IG9yZGVyIGV4cGVjdGVkCi0jZW5kaWYgLyogIVJUX0JJR19FTkRJQU4gKi8KLX0gRlJBTUVfQ09OVFJPTCwgKlBGUkFNRV9DT05UUk9MOwotCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX0hFQURFUl84MDJfMTEJewotICAgIEZSQU1FX0NPTlRST0wgICBGQzsKLSAgICBVU0hPUlQgICAgICAgICAgRHVyYXRpb247Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIxW01BQ19BRERSX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIJCQlBZGRyM1tNQUNfQUREUl9MRU5dOwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKLQlVU0hPUlQJCQlGcmFnOjQ7Ci0jZWxzZQotCVVTSE9SVAkJCUZyYWc6NDsKLQlVU0hPUlQJCQlTZXF1ZW5jZToxMjsKLSNlbmRpZiAvKiAhUlRfQklHX0VORElBTiAqLwotCVVDSEFSCQkJT2N0ZXRbMF07Ci19CUhFQURFUl84MDJfMTEsICpQSEVBREVSXzgwMl8xMTsKLQotdHlwZWRlZiBzdHJ1Y3QgUEFDS0VEIF9QU1BPTExfRlJBTUUgewotICAgIEZSQU1FX0NPTlRST0wgICBGQzsKLSAgICBVU0hPUlQgICAgICAgICAgQWlkOwotICAgIFVDSEFSICAgICAgICAgICBCc3NpZFtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBUYVtNQUNfQUREUl9MRU5dOwotfSAgIFBTUE9MTF9GUkFNRSwgKlBQU1BPTExfRlJBTUU7Ci0KLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfUlRTX0ZSQU1FCXsKLSAgICBGUkFNRV9DT05UUk9MICAgRkM7Ci0gICAgVVNIT1JUICAgICAgICAgIER1cmF0aW9uOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMVtNQUNfQUREUl9MRU5dOwotICAgIFVDSEFSICAgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotfVJUU19GUkFNRSwgKlBSVFNfRlJBTUU7Ci0KLSNlbmRpZiAvLyBfX0RPVDExX0JBU0VfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWFjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfbWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1N2IyOTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9ydG1wX21hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMwNCArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfbWFjLmgKLQotCUFic3RyYWN0OgotCVJhbGluayBXaXJlbGVzcyBDaGlwIE1BQyByZWxhdGVkIGRlZmluaXRpb24gJiBzdHJ1Y3R1cmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCSAgV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaWZuZGVmIF9fUlRNUF9NQUNfSF9fCi0jZGVmaW5lIF9fUlRNUF9NQUNfSF9fCi0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRYIC8gUlggcmluZyBkZXNjcmlwdG9yIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmaXJzdCAyNC1ieXRlIGluIFRYRCBpcyBjYWxsZWQgVFhJTkZPIGFuZCB3aWxsIGJlIERNQWVkIHRvIE1BQyBibG9jayB0aHJvdWdoIFRYRklGTy4KLS8vIE1BQyBibG9jayB1c2UgdGhpcyBUWElORk8gdG8gY29udHJvbCB0aGUgdHJhbnNtaXNzaW9uIGJlaGF2aW9yIG9mIHRoaXMgZnJhbWUuCi0jZGVmaW5lIEZJRk9fTUdNVCAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBGSUZPX0hDQ0EgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRklGT19FRENBICAgICAgICAgICAgICAgICAyCi0KLQotLy8KLS8vIFRYRCBXaXJlbGVzcyBJbmZvcm1hdGlvbiBmb3JtYXQgZm9yIFR4IHJpbmcgYW5kIE1nbXQgUmluZwotLy8KLS8vdHhvcCA6IGZvciB0eG9wIG1vZGUKLS8vIDA6dHhvcCBmb3IgdGhlIE1QRFUgZnJhbWUgd2lsbCBiZSBoYW5kbGVzIGJ5IEFTSUMgYnkgcmVnaXN0ZXIKLS8vIDEvMi8zOnRoZSBNUERVIGZyYW1lIGlzIHNlbmQgYWZ0ZXIgUElGUy9iYWNrb2ZmL1NJRlMKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1RYV0lfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJUEhZTU9ERToyOwotCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKLQlVSU5UMzIJCXJzdjI6MTsKLS8vCVVJTlQzMgkJcnN2MjoyOwotCVVJTlQzMgkJSWZzOjE7CS8vCi0JVUlOVDMyCQlTVEJDOjI7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlCVzoxOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJTUNTOjc7Ci0KLQlVSU5UMzIJCXJzdjo2OwotCVVJTlQzMgkJdHhvcDoyOwkvL3R4IGJhY2sgb2ZmIG1vZGUgMDpIVCBUWE9QIHJ1bGUgLCAxOlBJRlMgVFggLDI6QmFja29mZiwgMzpzaWZzIG9ubHkgd2hlbiBwcmV2aW91cyBmcmFtZSBleGNoYW5nZSBpcyBzdWNjZXNzZnVsLgotCVVJTlQzMgkJTXBkdURlbnNpdHk6MzsKLQlVSU5UMzIJCUFNUERVOjE7Ci0KLQlVSU5UMzIJCVRTOjE7Ci0JVUlOVDMyCQlDRkFDSzoxOwotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCS8vIFdvcmQgMQotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQlVSU5UMzIJCU1QRFV0b3RhbEJ5dGVDb3VudDoxMjsKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJTlNFUToxOwotCVVJTlQzMgkJQUNLOjE7Ci0JLy8gV29yZCAyCi0JVUlOVDMyCQlJVjsKLQkvLyBXb3JkIDMKLQlVSU5UMzIJCUVJVjsKLX0JVFhXSV9TVFJVQywgKlBUWFdJX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CVBBQ0tFRCBfVFhXSV9TVFJVQyB7Ci0JLy8gV29yZAkwCi0JLy8gZXg6IDAwIDAzIDAwIDQwIG1lYW5zIHR4b3AgPSAzLCBQSFlNT0RFID0gMQotCVVJTlQzMgkJRlJBRzoxOwkJLy8gMSB0byBpbmZvcm0gVEtJUCBlbmdpbmUgdGhpcyBpcyBhIGZyYWdtZW50LgotCVVJTlQzMgkJTUlNT3BzOjE7CS8vIHRoZSByZW1vdGUgcGVlciBpcyBpbiBkeW5hbWljIE1JTU8tUFMgbW9kZQotCVVJTlQzMgkJQ0ZBQ0s6MTsKLQlVSU5UMzIJCVRTOjE7Ci0KLQlVSU5UMzIJCUFNUERVOjE7Ci0JVUlOVDMyCQlNcGR1RGVuc2l0eTozOwotCVVJTlQzMgkJdHhvcDoyOwkvL0ZPUiAiVEhJUyIgZnJhbWUuIDA6SFQgVFhPUCBydWxlICwgMTpQSUZTIFRYICwyOkJhY2tvZmYsIDM6c2lmcyBvbmx5IHdoZW4gcHJldmlvdXMgZnJhbWUgZXhjaGFuZ2UgaXMgc3VjY2Vzc2Z1bC4KLQlVSU5UMzIJCXJzdjo2OwotCi0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCUJXOjE7CS8vY2hhbm5lbCBiYW5kd2lkdGggMjBNSHogb3IgNDAgTUh6Ci0JVUlOVDMyCQlTaG9ydEdJOjE7Ci0JVUlOVDMyCQlTVEJDOjI7CS8vIDE6IFNUQkMgc3VwcG9ydCBNQ1MgPTAtNywgICAyLDMgOiBSRVNFUlZFCi0JVUlOVDMyCQlJZnM6MTsJLy8KLS8vCVVJTlQzMgkJcnN2MjoyOwkvL2NoYW5uZWwgYmFuZHdpZHRoIDIwTUh6IG9yIDQwIE1IegotCVVJTlQzMgkJcnN2MjoxOwotCVVJTlQzMgkJVHhCRjoxOwkvLyAzKjMKLQlVSU5UMzIJCVBIWU1PREU6MjsKLQkvLyBXb3JkMQotCS8vIGV4OiAgMWMgZmYgMzggMDAgbWVhbnMgQUNLPTAsIEJBV2luU2l6ZT03LCBNUERVdG90YWxCeXRlQ291bnQgPSAweDM4Ci0JVUlOVDMyCQlBQ0s6MTsKLQlVSU5UMzIJCU5TRVE6MTsKLQlVSU5UMzIJCUJBV2luU2l6ZTo2OwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCVVJTlQzMgkJTVBEVXRvdGFsQnl0ZUNvdW50OjEyOwotCVVJTlQzMgkJUGFja2V0SWQ6NDsKLQkvL1dvcmQyCi0JVUlOVDMyCQlJVjsKLQkvL1dvcmQzCi0JVUlOVDMyCQlFSVY7Ci19CVRYV0lfU1RSVUMsICpQVFhXSV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBSWFdJIHdpcmVsZXNzIGluZm9ybWF0aW9uIGZvcm1hdCwgaW4gUEJGLiBpbnZpc2libGUgaW4gZHJpdmVyLgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXN0cnVjdAlQQUNLRUQgX1JYV0lfU1RSVUMgewotCS8vIFdvcmQgMAotCVVJTlQzMgkJVElEOjQ7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlVREY6MzsKLQlVSU5UMzIJCUJTU0lEOjM7Ci0JVUlOVDMyCQlLZXlJbmRleDoyOwotCVVJTlQzMgkJV2lyZWxlc3NDbGlJRDo4OwotCS8vIFdvcmQgMQotCVVJTlQzMgkJUEhZTU9ERToyOyAgICAgICAgICAgICAgLy8gMTogdGhpcyBSWCBmcmFtZSBpcyB1bmljYXN0IHRvIG1lCi0JVUlOVDMyCQlyc3Y6MzsKLQlVSU5UMzIJCVNUQkM6MjsKLQlVSU5UMzIJCVNob3J0R0k6MTsKLQlVSU5UMzIJCUJXOjE7Ci0JVUlOVDMyCQlNQ1M6NzsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJRlJBRzo0OwotCS8vIFdvcmQgMgotCVVJTlQzMgkJcnN2MTo4OwotCVVJTlQzMgkJUlNTSTI6ODsKLQlVSU5UMzIJCVJTU0kxOjg7Ci0JVUlOVDMyCQlSU1NJMDo4OwotCS8vIFdvcmQgMwotCS8qVUlOVDMyCQlyc3YyOjE2OyovCi0JVUlOVDMyCQlyc3YyOjg7Ci0JVUlOVDMyCQlGT0ZGU0VUOjg7CS8vIFJUMzV4eAotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJU05SMDo4OwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZglzdHJ1Y3QJUEFDS0VEIF9SWFdJX1NUUlVDIHsKLQkvLyBXb3JkCTAKLQlVSU5UMzIJCVdpcmVsZXNzQ2xpSUQ6ODsKLQlVSU5UMzIJCUtleUluZGV4OjI7Ci0JVUlOVDMyCQlCU1NJRDozOwotCVVJTlQzMgkJVURGOjM7Ci0JVUlOVDMyCQlNUERVdG90YWxCeXRlQ291bnQ6MTI7Ci0JVUlOVDMyCQlUSUQ6NDsKLQkvLyBXb3JkCTEKLQlVSU5UMzIJCUZSQUc6NDsKLQlVSU5UMzIJCVNFUVVFTkNFOjEyOwotCVVJTlQzMgkJTUNTOjc7Ci0JVUlOVDMyCQlCVzoxOwotCVVJTlQzMgkJU2hvcnRHSToxOwotCVVJTlQzMgkJU1RCQzoyOwotCVVJTlQzMgkJcnN2OjM7Ci0JVUlOVDMyCQlQSFlNT0RFOjI7ICAgICAgICAgICAgICAvLyAxOiB0aGlzIFJYIGZyYW1lIGlzIHVuaWNhc3QgdG8gbWUKLQkvL1dvcmQyCi0JVUlOVDMyCQlSU1NJMDo4OwotCVVJTlQzMgkJUlNTSTE6ODsKLQlVSU5UMzIJCVJTU0kyOjg7Ci0JVUlOVDMyCQlyc3YxOjg7Ci0JLy9Xb3JkMwotCVVJTlQzMgkJU05SMDo4OwotCVVJTlQzMgkJU05SMTo4OwotCVVJTlQzMgkJRk9GRlNFVDo4OwkvLyBSVDM1eHgKLQlVSU5UMzIJCXJzdjI6ODsKLQkvKlVJTlQzMgkJcnN2MjoxNjsqLwotfQlSWFdJX1NUUlVDLCAqUFJYV0lfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFJlZ2lzdGVyIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotLy8KLS8vIFNDSC9ETUEgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MDIwMAotLy8KLS8vIElOVF9TT1VSQ0VfQ1NSOiBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLiBXcml0ZSBvbmUgdG8gY2xlYXIgY29ycmVzcG9uZGluZyBiaXQKLS8vCi0jZGVmaW5lIERNQV9DU1IwCQkweDIwMAotI2RlZmluZSBJTlRfU09VUkNFX0NTUgkJMHgyMDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJCToxMTsKLQkJVUlOVDMyCQkJUmFkYXJJTlQ6MTsKLQkJVUlOVDMyCQlyc3Y6MjsKLSNlbHNlIC8vIG9yaWdpbmFsIHNvdXJjZSBjb2RlCi0JCVVJTlQzMgkJOjE0OwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlUeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJUnhDb2hlcmVudDoxOwotCQlVSU5UMzIJCUdQVGltZXI6MTsKLQkJVUlOVDMyCQlBdXRvV2FrZXVwOjE7Ly9iaXQxNAotCQlVSU5UMzIJCVRYRmlmb1N0YXR1c0ludDoxOy8vRklGTyBTdGF0aXN0aWNzIGlzIGZ1bGwsIHN3IHNob3VsZCByZWFkIDB4MTcxYwotCQlVSU5UMzIJCVByZVRCVFQ6MTsKLQkJVUlOVDMyCQlUQlRUSW50OjE7Ci0JCVVJTlQzMgkJUnhUeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJTUNVQ29tbWFuZElOVDoxOwotCQlVSU5UMzIJCU1nbXREbWFEb25lOjE7Ci0JCVVJTlQzMgkJSGNjYURtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMURtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ci0JCVVJTlQzMgkJUnhEb25lOjE7Ci0JCVVJTlQzMgkJVHhEZWxheUlOVDoxOwkvL2RlbGF5ZWQgaW50ZXJydXB0LCBub3QgaW50ZXJydXB0IHVudGlsIHNldmVyYWwgaW50IG9yIHRpbWUgbGltaXQgaGl0Ci0JCVVJTlQzMgkJUnhEZWxheUlOVDoxOyAvL2RlYWx5ZWQgaW50ZXJydXB0Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9JTlRfU09VUkNFX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSeERlbGF5SU5UOjE7Ci0JCVVJTlQzMgkJVHhEZWxheUlOVDoxOwotCQlVSU5UMzIJCVJ4RG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsvLzQKLQkJVUlOVDMyCQlBYzFEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMyRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyCQlIY2NhRG1hRG9uZToxOyAvLyBiaXQ3Ci0JCVVJTlQzMgkJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyCQlNQ1VDb21tYW5kSU5UOjE7Ly9iaXQgOQotCQlVSU5UMzIJCVJ4VHhDb2hlcmVudDoxOwotCQlVSU5UMzIJCVRCVFRJbnQ6MTsKLQkJVUlOVDMyCQlQcmVUQlRUOjE7Ci0JCVVJTlQzMgkJVFhGaWZvU3RhdHVzSW50OjE7Ly9GSUZPIFN0YXRpc3RpY3MgaXMgZnVsbCwgc3cgc2hvdWxkIHJlYWQgMHgxNzFjCi0JCVVJTlQzMgkJQXV0b1dha2V1cDoxOy8vYml0MTQKLQkJVUlOVDMyCQlHUFRpbWVyOjE7Ci0JCVVJTlQzMgkJUnhDb2hlcmVudDoxOy8vYml0MTYKLQkJVUlOVDMyCQlUeENvaGVyZW50OjE7Ci0jaWZkZWYgVE9ORV9SQURBUl9ERVRFQ1RfU1VQUE9SVAotCQlVSU5UMzIJCXJzdjoyOwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCQk6MTE7Ci0jZWxzZQotCQlVSU5UMzIJCToxNDsKLSNlbmRpZiAvLyBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUIC8vCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBJTlRfU09VUkNFX0NTUl9TVFJVQywgKlBJTlRfU09VUkNFX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gSU5UX01BU0tfQ1NSOiAgIEludGVycnVwdCBNQVNLIHJlZ2lzdGVyLiAgIDE6IHRoZSBpbnRlcnJ1cHQgaXMgbWFzayBPRkYKLS8vCi0jZGVmaW5lIElOVF9NQVNLX0NTUiAgICAgICAgMHgyMDQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JTlRfTUFTS19DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVHhDb2hlcmVudDoxOwotCQlVSU5UMzIJCVJ4Q29oZXJlbnQ6MTsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJCTo5OwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCXJzdjoxMDsKLSNlbHNlCi0JCVVJTlQzMgkJOjIwOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlNQ1VDb21tYW5kSU5UOjE7Ci0JCVVJTlQzMgkJTWdtdERtYURvbmU6MTsKLQkJVUlOVDMyCQlIY2NhRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjM0RtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzJEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMERtYURvbmU6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlUeERlbGF5OjE7Ci0JCVVJTlQzMgkJUlhEZWxheV9JTlRfTVNLOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfUlOVF9NQVNLX0NTUl9TVFJVQywgKlBJTlRfTUFTS19DU1JfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfSU5UX01BU0tfQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYRGVsYXlfSU5UX01TSzoxOwotCQlVSU5UMzIJCVR4RGVsYXk6MTsKLQkJVUlOVDMyCQlSeERvbmU6MTsKLQkJVUlOVDMyCQlBYzBEbWFEb25lOjE7Ci0JCVVJTlQzMgkJQWMxRG1hRG9uZToxOwotCQlVSU5UMzIJCUFjMkRtYURvbmU6MTsKLQkJVUlOVDMyCQlBYzNEbWFEb25lOjE7Ci0JCVVJTlQzMgkJSGNjYURtYURvbmU6MTsKLQkJVUlOVDMyCQlNZ210RG1hRG9uZToxOwotCQlVSU5UMzIJCU1DVUNvbW1hbmRJTlQ6MTsKLSNpZmRlZiBUT05FX1JBREFSX0RFVEVDVF9TVVBQT1JUCi0JCVVJTlQzMgkJcnN2OjEwOwotCQlVSU5UMzIJCQlSYWRhcklOVDoxOwotCQlVSU5UMzIJCQk6OTsKLSNlbHNlCi0JCVVJTlQzMgkJOjIwOwotI2VuZGlmIC8vIFRPTkVfUkFEQVJfREVURUNUX1NVUFBPUlQgLy8KLQkJVUlOVDMyCQlSeENvaGVyZW50OjE7Ci0JCVVJTlQzMgkJVHhDb2hlcmVudDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gSU5UX01BU0tfQ1NSX1NUUlVDLCAqUElOVF9NQVNLX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIFdQRE1BX0dMT19DRkcJMHgyMDgKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUhEUl9TRUdfTEVOOjE2OwotCQlVSU5UMzIJCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMgkJQmlnRW5kaWFuOjE7Ci0JCVVJTlQzMgkJRW5UWFdyaXRlQmFja0RET05FOjE7Ci0JCVVJTlQzMgkJV1BETUFCdXJzdFNJWkU6MjsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyCQlFbmFibGVSeERNQToxOwotCQlVSU5UMzIJCVR4RE1BQnVzeToxOwotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfVdQRE1BX0dMT19DRkdfU1RSVUMsICpQV1BETUFfR0xPX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9XUERNQV9HTE9fQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUVuYWJsZVR4RE1BOjE7Ci0JCVVJTlQzMgkJVHhETUFCdXN5OjE7Ci0JCVVJTlQzMgkJRW5hYmxlUnhETUE6MTsKLQkJVUlOVDMyCQlSeERNQUJ1c3k6MTsKLQkJVUlOVDMyCQlXUERNQUJ1cnN0U0laRToyOwotCQlVSU5UMzIJCUVuVFhXcml0ZUJhY2tERE9ORToxOwotCQlVSU5UMzIJCUJpZ0VuZGlhbjoxOwotCQlVSU5UMzIJCVJYSGRyU2NhdGVyOjg7Ci0JCVVJTlQzMgkJSERSX1NFR19MRU46MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfSBXUERNQV9HTE9fQ0ZHX1NUUlVDLCAqUFdQRE1BX0dMT19DRkdfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBXUERNQV9SU1RfSURYCTB4MjBjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQk6MTU7Ci0JCVVJTlQzMgkJUlNUX0RSWF9JRFgwOjE7Ci0JCVVJTlQzMgkJcnN2OjEwOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYNToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYNDoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMzoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMjoxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMToxOwotCQlVSU5UMzIJCVJTVF9EVFhfSURYMDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX1XUERNQV9SU1RfSURYX1NUUlVDLCAqUFdQRE1BX1JTVF9JRFhfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfV1BETUFfUlNUX0lEWF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDA6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDE6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDI6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDM6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDQ6MTsKLQkJVUlOVDMyCQlSU1RfRFRYX0lEWDU6MTsKLQkJVUlOVDMyCQlyc3Y6MTA7Ci0JCVVJTlQzMgkJUlNUX0RSWF9JRFgwOjE7Ci0JCVVJTlQzMgkJOjE1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gV1BETUFfUlNUX0lEWF9TVFJVQywgKlBXUERNQV9SU1RfSURYX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIERFTEFZX0lOVF9DRkcgIDB4MDIxMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0RFTEFZX0lOVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVFhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMgkJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJUlhETFlfSU5UX0VOOjE7Ci0JCVVJTlQzMgkJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfURFTEFZX0lOVF9DRkdfU1RSVUMsICpQREVMQVlfSU5UX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9ERUxBWV9JTlRfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJUlhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVJYRExZX0lOVF9FTjoxOwotCQlVSU5UMzIJCVRYTUFYX1BUSU1FOjg7Ci0JCVVJTlQzMgkJVFhNQVhfUElOVDo3OwotCQlVSU5UMzIJCVRYRExZX0lOVF9FTjoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0gREVMQVlfSU5UX0NGR19TVFJVQywgKlBERUxBWV9JTlRfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFdNTV9BSUZTTl9DRkcgICAweDAyMTQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQkgICAgVUlOVDMyICAgQWlmc24zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEFpZnNuMTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQWlmc24wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BSUZTTl9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEFpZnNuMDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQWlmc24xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBBaWZzbjI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEFpZnNuMzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUlGU05fQ1NSX1NUUlVDLCAqUEFJRlNOX0NTUl9TVFJVQzsKLSNlbmRpZgotLy8KLS8vIENXTUlOX0NTUjogQ1dtaW4gZm9yIGVhY2ggRURDQSBBQwotLy8KLSNkZWZpbmUgV01NX0NXTUlOX0NGRyAgIDB4MDIxOAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCSAgICBVSU5UMzIgICBDd21pbjM6NDsgICAgICAgLy8gZm9yIEFDX1ZPCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4xOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21pbjA6NDsgICAgICAgLy8gZm9yIEFDX0JFCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0NXTUlOX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgQ3dtaW4wOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCSAgICBVSU5UMzIgICBDd21pbjE6NDsgICAgICAgLy8gZm9yIEFDX0JLCi0JICAgIFVJTlQzMiAgIEN3bWluMjo0OyAgICAgICAvLyBmb3IgQUNfVkkKLQkgICAgVUlOVDMyICAgQ3dtaW4zOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBSc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlDV01JTl9DU1JfU1RSVUMsICpQQ1dNSU5fQ1NSX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBDV01BWF9DU1I6IENXbWluIGZvciBlYWNoIEVEQ0EgQUMKLS8vCi0jZGVmaW5lIFdNTV9DV01BWF9DRkcgICAweDAyMWMKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIFJzdjoxNjsKLQkgICAgVUlOVDMyICAgQ3dtYXgzOjQ7ICAgICAgIC8vIGZvciBBQ19WTwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4MTo0OyAgICAgICAvLyBmb3IgQUNfQksKLQkgICAgVUlOVDMyICAgQ3dtYXgwOjQ7ICAgICAgIC8vIGZvciBBQ19CRQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9DV01BWF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEN3bWF4MDo0OyAgICAgICAvLyBmb3IgQUNfQkUKLQkgICAgVUlOVDMyICAgQ3dtYXgxOjQ7ICAgICAgIC8vIGZvciBBQ19CSwotCSAgICBVSU5UMzIgICBDd21heDI6NDsgICAgICAgLy8gZm9yIEFDX1ZJCi0JICAgIFVJTlQzMiAgIEN3bWF4Mzo0OyAgICAgICAvLyBmb3IgQUNfVk8KLQkgICAgVUlOVDMyICAgUnN2OjE2OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQ1dNQVhfQ1NSX1NUUlVDLCAqUENXTUFYX0NTUl9TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBBQ19UWE9QX0NTUjA6IEFDX0JLL0FDX0JFIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMF9DRkcgICAgMHgwMjIwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjMVR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkUsIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjMFR4b3A7ICAgICAgICAvLyBmb3IgQUNfQkssIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IwX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMwVHhvcDsgICAgICAgIC8vIGZvciBBQ19CSywgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMxVHhvcDsgICAgICAgIC8vIGZvciBBQ19CRSwgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjBfU1RSVUMsICpQQUNfVFhPUF9DU1IwX1NUUlVDOwotI2VuZGlmCi0KLS8vCi0vLyBBQ19UWE9QX0NTUjE6IEFDX1ZPL0FDX1ZJIFRYT1AgcmVnaXN0ZXIKLS8vCi0jZGVmaW5lIFdNTV9UWE9QMV9DRkcgICAgMHgwMjI0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQUNfVFhPUF9DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFjM1R4b3A7ICAgICAgICAvLyBmb3IgQUNfVk8sIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVU0hPUlQgIEFjMlR4b3A7ICAgICAgICAvLyBmb3IgQUNfVkksIGluIHVuaXQgb2YgMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQUNfVFhPUF9DU1IxX1NUUlVDLCAqUEFDX1RYT1BfQ1NSMV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BQ19UWE9QX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWMyVHhvcDsgICAgICAgIC8vIGZvciBBQ19WSSwgaW4gdW5pdCBvZiAzMnVzCi0JICAgIFVTSE9SVCAgQWMzVHhvcDsgICAgICAgIC8vIGZvciBBQ19WTywgaW4gdW5pdCBvZiAzMnVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBQ19UWE9QX0NTUjFfU1RSVUMsICpQQUNfVFhPUF9DU1IxX1NUUlVDOwotI2VuZGlmCi0KLQotI2RlZmluZSBSSU5HUkVHX0RJRkYJCQkweDEwCi0jZGVmaW5lIEdQSU9fQ1RSTF9DRkcgICAgMHgwMjI4CS8vTUFDX0NTUjEzCi0jZGVmaW5lIE1DVV9DTURfQ0ZHICAgIDB4MDIyYwotI2RlZmluZSBUWF9CQVNFX1BUUjAgICAgIDB4MDIzMAkvL0FDX0JLIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMCAgICAgIDB4MDIzNAotI2RlZmluZSBUWF9DVFhfSURYMCAgICAgICAweDAyMzgKLSNkZWZpbmUgVFhfRFRYX0lEWDAgICAgICAweDAyM2MKLSNkZWZpbmUgVFhfQkFTRV9QVFIxICAgICAweDAyNDAJCS8vQUNfQkUgYmFzZSBhZGRyZXNzCi0jZGVmaW5lIFRYX01BWF9DTlQxICAgICAgMHgwMjQ0Ci0jZGVmaW5lIFRYX0NUWF9JRFgxICAgICAgIDB4MDI0OAotI2RlZmluZSBUWF9EVFhfSURYMSAgICAgIDB4MDI0YwotI2RlZmluZSBUWF9CQVNFX1BUUjIgICAgIDB4MDI1MAkJLy9BQ19WSSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDIgICAgICAweDAyNTQKLSNkZWZpbmUgVFhfQ1RYX0lEWDIgICAgICAgMHgwMjU4Ci0jZGVmaW5lIFRYX0RUWF9JRFgyICAgICAgMHgwMjVjCi0jZGVmaW5lIFRYX0JBU0VfUFRSMyAgICAgMHgwMjYwCQkvL0FDX1ZPIGJhc2UgYWRkcmVzcwotI2RlZmluZSBUWF9NQVhfQ05UMyAgICAgIDB4MDI2NAotI2RlZmluZSBUWF9DVFhfSURYMyAgICAgICAweDAyNjgKLSNkZWZpbmUgVFhfRFRYX0lEWDMgICAgICAweDAyNmMKLSNkZWZpbmUgVFhfQkFTRV9QVFI0ICAgICAweDAyNzAJCS8vSENDQSBiYXNlIGFkZHJlc3MKLSNkZWZpbmUgVFhfTUFYX0NOVDQgICAgICAweDAyNzQKLSNkZWZpbmUgVFhfQ1RYX0lEWDQgICAgICAgMHgwMjc4Ci0jZGVmaW5lIFRYX0RUWF9JRFg0ICAgICAgMHgwMjdjCi0jZGVmaW5lIFRYX0JBU0VfUFRSNSAgICAgMHgwMjgwCQkvL01HTVQgYmFzZSBhZGRyZXNzCi0jZGVmaW5lICBUWF9NQVhfQ05UNSAgICAgMHgwMjg0Ci0jZGVmaW5lIFRYX0NUWF9JRFg1ICAgICAgIDB4MDI4OAotI2RlZmluZSBUWF9EVFhfSURYNSAgICAgIDB4MDI4YwotI2RlZmluZSBUWF9NR01UTUFYX0NOVCAgICAgIFRYX01BWF9DTlQ1Ci0jZGVmaW5lIFRYX01HTVRDVFhfSURYICAgICAgIFRYX0NUWF9JRFg1Ci0jZGVmaW5lIFRYX01HTVREVFhfSURYICAgICAgVFhfRFRYX0lEWDUKLSNkZWZpbmUgUlhfQkFTRV9QVFIgICAgIDB4MDI5MAkvL1JYIGJhc2UgYWRkcmVzcwotI2RlZmluZSBSWF9NQVhfQ05UICAgICAgMHgwMjk0Ci0jZGVmaW5lIFJYX0NSWF9JRFggICAgICAgMHgwMjk4Ci0jZGVmaW5lIFJYX0RSWF9JRFggICAgICAweDAyOWMKLQotCi0jZGVmaW5lIFVTQl9ETUFfQ0ZHICAgICAgMHgwMmEwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgVHhCdXN5OjE7CQkvL1VTQiBETUEgVFggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5Ci0JICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kgLiBkZWJ1ZyBvbmx5Ci0JICAgIFVJTlQzMiAgRXBvdXRWYWxpZDo2OyAgICAgICAgLy9PVVQgZW5kcG9pbnQgZGF0YSB2YWxpZC4gZGVidWcgb25seQotCSAgICBVSU5UMzIgIFR4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFR4Ci0JICAgIFVJTlQzMiAgUnhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgUngKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgotCSAgICBVSU5UMzIgIFR4b3BIYWx0OjE7ICAgICAgICAvL0hhbHQgVFhPUCBjb3VudCBkb3duIHdoZW4gVFggYnVmZmVyIGlzIGZ1bGwuCi0JICAgIFVJTlQzMiAgVHhDbGVhcjoxOyAgICAgICAgLy9DbGVhciBVU0IgRE1BIFRYIHBhdGgKLQkgICAgVUlOVDMyICByc3Y6MjsKLQkgICAgVUlOVDMyICBwaHljbGVhcjoxOwkJCS8vcGh5IHdhdGNoIGRvZyBlbmFibGUuIHdyaXRlIDEKLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dMbXQ6ODsgICAgICAgIC8vUnggQnVsayBBZ2dyZWdhdGlvbiBMaW1pdCAgaW4gdW5pdCBvZiAxMDI0IGJ5dGVzCi0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVVNCX0RNQV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgUnhCdWxrQWdnVE91dDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIFRpbWVPdXQgIGluIHVuaXQgb2YgMzNucwotCSAgICBVSU5UMzIgIFJ4QnVsa0FnZ0xtdDo4OyAgICAgICAgLy9SeCBCdWxrIEFnZ3JlZ2F0aW9uIExpbWl0ICBpbiB1bml0IG9mIDI1NiBieXRlcwotCSAgICBVSU5UMzIgIHBoeWNsZWFyOjE7CQkJLy9waHkgd2F0Y2ggZG9nIGVuYWJsZS4gd3JpdGUgMQotCSAgICBVSU5UMzIgIHJzdjoyOwotCSAgICBVSU5UMzIgIFR4Q2xlYXI6MTsgICAgICAgIC8vQ2xlYXIgVVNCIERNQSBUWCBwYXRoCi0JICAgIFVJTlQzMiAgVHhvcEhhbHQ6MTsgICAgICAgIC8vSGFsdCBUWE9QIGNvdW50IGRvd24gd2hlbiBUWCBidWZmZXIgaXMgZnVsbC4KLQkgICAgVUlOVDMyICBSeEJ1bGtBZ2dFbjoxOyAgICAgICAgLy9FbmFibGUgUnggQnVsayBBZ2dyZWdhdGlvbgotCSAgICBVSU5UMzIgIFJ4QnVsa0VuOjE7ICAgICAgICAvL0VuYWJsZSBVU0IgRE1BIFJ4Ci0JICAgIFVJTlQzMiAgVHhCdWxrRW46MTsgICAgICAgIC8vRW5hYmxlIFVTQiBETUEgVHgKLQkgICAgVUlOVDMyICBFcG91dFZhbGlkOjY7ICAgICAgICAvL09VVCBlbmRwb2ludCBkYXRhIHZhbGlkCi0JICAgIFVJTlQzMiAgUnhCdXN5OjE7ICAgICAgICAvL1VTQiBETUEgUlggRlNNIGJ1c3kKLQkgICAgVUlOVDMyICBUeEJ1c3k6MTsJCS8vVVNCIERNQSBUWCBGU00gYnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVVNCX0RNQV9DRkdfU1RSVUMsICpQVVNCX0RNQV9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gIDMgIFBCRiAgcmVnaXN0ZXJzCi0vLwotLy8KLS8vIE1vc3QgYXJlIGZvciBkZWJ1Zy4gRHJpdmVyIGRvZXNuJ3QgdG91Y2ggUEJGIHJlZ2lzdGVyLgotI2RlZmluZSBQQkZfU1lTX0NUUkwJIDB4MDQwMAotI2RlZmluZSBQQkZfQ0ZHICAgICAgICAgICAgICAgICAweDA0MDgKLSNkZWZpbmUgUEJGX01BWF9QQ05UCSAweDA0MEMKLSNkZWZpbmUgUEJGX0NUUkwJCTB4MDQxMAotI2RlZmluZSBQQkZfSU5UX1NUQQkgMHgwNDE0Ci0jZGVmaW5lIFBCRl9JTlRfRU5BCSAweDA0MTgKLSNkZWZpbmUgVFhSWFFfUENOVAkgMHgwNDM4Ci0jZGVmaW5lIFBCRl9EQkcJCQkgMHgwNDNjCi0jZGVmaW5lIFBCRl9DQVBfQ1RSTCAgICAgMHgwNDQwCi0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLS8vIGVGdXNlIHJlZ2lzdGVycwotI2RlZmluZSBFRlVTRV9DVFJMCQkJCTB4MDU4MAotI2RlZmluZSBFRlVTRV9EQVRBMAkJCQkweDA1OTAKLSNkZWZpbmUgRUZVU0VfREFUQTEJCQkJMHgwNTk0Ci0jZGVmaW5lIEVGVVNFX0RBVEEyCQkJCTB4MDU5OAotI2RlZmluZSBFRlVTRV9EQVRBMwkJCQkweDA1OWMKLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotI2RlZmluZSBPU0NfQ1RSTAkJMHg1YTQKLSNkZWZpbmUgUENJRV9QSFlfVFhfQVRURU5VQVRJT05fQ1RSTAkweDA1QzgKLSNkZWZpbmUgTERPX0NGRzAJCQkJMHgwNWQ0Ci0jZGVmaW5lIEdQSU9fU1dJVENICQkJCTB4MDVkYwotCi0KLS8vCi0vLyAgNCAgTUFDICByZWdpc3RlcnMKLS8vCi0vLwotLy8gIDQuMSBNQUMgU1lTVEVNICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTAwMCkKLS8vCi0jZGVmaW5lIE1BQ19DU1IwICAgICAgICAgICAgMHgxMDAwCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfQVNJQ19WRVJfSURfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQVNJQ1ZlcjsgICAgICAgIC8vIHZlcnNpb24gOiAyODYwCi0JICAgIFVTSE9SVCAgQVNJQ1JldjsgICAgICAgIC8vIHJldmVyc2lvbiAgOiAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBU0lDX1ZFUl9JRF9TVFJVQywgKlBBU0lDX1ZFUl9JRF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9BU0lDX1ZFUl9JRF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBU0lDUmV2OyAgICAgICAgLy8gcmV2ZXJzaW9uICA6IDAKLQkgICAgVVNIT1JUICBBU0lDVmVyOyAgICAgICAgLy8gdmVyc2lvbiA6IDI4NjAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUFTSUNfVkVSX0lEX1NUUlVDLCAqUEFTSUNfVkVSX0lEX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIE1BQ19TWVNfQ1RSTCAgICAgICAgICAgIDB4MTAwNAkJLy9NQUNfQ1NSMQotI2RlZmluZSBNQUNfQUREUl9EVzAJCQkJMHgxMDA4CQkvLyBNQUMgQUREUiBEVzAKLSNkZWZpbmUgTUFDX0FERFJfRFcxCQkJIDB4MTAwYwkJLy8gTUFDIEFERFIgRFcxCi0vLwotLy8gTUFDX0NTUjI6IFNUQSBNQUMgcmVnaXN0ZXIgMAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQkJVUNIQVIJCUJ5dGUyOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAyCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJQnl0ZTA7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDAKLQkJVUNIQVIJCUJ5dGUxOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAxCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTM7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19EVzBfU1RSVUMsICpQTUFDX0RXMF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gTUFDX0NTUjM6IFNUQSBNQUMgcmVnaXN0ZXIgMQotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NQUNfRFcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJUnN2ZDE7Ci0JCVVDSEFSCQlVMk1lTWFzazsKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTUFDX0RXMV9TVFJVQywgKlBNQUNfRFcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX01BQ19EVzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKLQkJVUNIQVIJCVUyTWVNYXNrOwotCQlVQ0hBUgkJUnN2ZDE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfRFcxX1NUUlVDLCAqUE1BQ19EVzFfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBNQUNfQlNTSURfRFcwCQkJCTB4MTAxMAkJLy8gTUFDIEJTU0lEIERXMAotI2RlZmluZSBNQUNfQlNTSURfRFcxCQkJCTB4MTAxNAkJLy8gTUFDIEJTU0lEIERXMQotCi0vLwotLy8gTUFDX0NTUjU6IEJTU0lEIHJlZ2lzdGVyIDEKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfTUFDX0NTUjVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJQnNzSWRNb2RlOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVUNIQVIJCUJ5dGU1OwkJIC8vIEJTU0lEIGJ5dGUgNQotCQlVQ0hBUgkJQnl0ZTQ7CQkgLy8gQlNTSUQgYnl0ZSA0Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNQUNfQ1NSNV9TVFJVQywgKlBNQUNfQ1NSNV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9NQUNfQ1NSNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGU0OwkJIC8vIEJTU0lEIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkgLy8gQlNTSUQgYnl0ZSA1Ci0JCVVTSE9SVAkJQnNzSWRNYXNrOjI7IC8vIDA6IG9uZSBCU1NJRCwgMTA6IDQgQlNTSUQsICAwMTogMiBCU1NJRCAsIDExOiA4QlNTSUQKLQkJVVNIT1JUCQlNQnNzQmNuTnVtOjM7Ci0JCVVTSE9SVAkJUnN2ZDoxMTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1BQ19DU1I1X1NUUlVDLCAqUE1BQ19DU1I1X1NUUlVDOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0xFTl9DRkcgICAgICAgICAgICAgIDB4MTAxOAkJLy8gcnQyODYwYiBtYXggMTZrIGJ5dGVzLiBiaXQxMjoxMyBNYXhpbXVtIFBTRFUgbGVuZ3RoIChwb3dlciBmYWN0b3IpIDA6Ml4xMywgMToyXjE0LCAyOjJeMTUsIDM6Ml4xNgotI2RlZmluZSBCQlBfQ1NSX0NGRwkJCTB4MTAxYwkJLy8KLS8vCi0vLyBCQlBfQ1NSX0NGRzogQkJQIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0JCUF9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCToxMjsKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAvLyAwOiA0IE1BQyBjbG9jayBjeWNsZXMgIDE6IDggTUFDIGNsb2NrIGN5Y2xlcwotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgQkJQIHByb2dyYW1taW5nLgotCQlVSU5UMzIJCWZSZWFkOjE7CQkgICAgLy8gMDogV3JpdGUJQkJQLCAxOglSZWFkIEJCUAotCQlVSU5UMzIJCVJlZ051bTo4OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVZhbHVlOjg7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfQkJQX0NTUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVmFsdWU6ODsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUmVnTnVtOjg7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJZlJlYWQ6MTsJCSAgICAvLyAwOiBXcml0ZQlCQlAsIDE6CVJlYWQgQkJQCi0JCVVJTlQzMgkJQnVzeToxOwkJCQkvLyAxOiBBU0lDIGlzIGJ1c3kgZXhlY3V0ZSBCQlAgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJQkJQX1BBUl9EVVI6MTsJCSAgICAgLy8gMDogNCBNQUMgY2xvY2sgY3ljbGVzICAxOiA4IE1BQyBjbG9jayBjeWNsZXMKLQkJVUlOVDMyCQlCQlBfUldfTU9ERToxOwkJLy8gMDogdXNlIHNlcmlhbCBtb2RlICAxOnBhcmFsbGVsCi0JCVVJTlQzMgkJOjEyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQkJQX0NTUl9DRkdfU1RSVUMsICpQQkJQX0NTUl9DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzAJCQkweDEwMjAKLS8vCi0vLyBSRl9DU1JfQ0ZHOiBSRiBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUJ1c3k6MTsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JCVVJTlQzMgkJU2VsOjE7CQkJCS8vIDA6UkZfTEUwIGFjdGl2YXRlICAxOlJGX0xFMSBhY3RpdmF0ZQotCQlVSU5UMzIJCVN0YW5kYnlNb2RlOjE7CQkgICAgLy8gMDogaGlnaCB3aGVuIHN0YW5kIGJ5IDE6CWxvdyB3aGVuIHN0YW5kYnkKLQkJVUlOVDMyCQliaXR3aWR0aDo1OwkJCS8vIFNlbGVjdGVkCUJCUAlyZWdpc3RlcgotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMF9TVFJVQywgKlBSRl9DU1JfQ0ZHMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCWJpdHdpZHRoOjU7CQkJLy8gU2VsZWN0ZWQJQkJQCXJlZ2lzdGVyCi0JCVVJTlQzMgkJU3RhbmRieU1vZGU6MTsJCSAgICAvLyAwOiBoaWdoIHdoZW4gc3RhbmQgYnkgMToJbG93IHdoZW4gc3RhbmRieQotCQlVSU5UMzIJCVNlbDoxOwkJCQkvLyAwOlJGX0xFMCBhY3RpdmF0ZSAgMTpSRl9MRTEgYWN0aXZhdGUKLQkJVUlOVDMyCQlCdXN5OjE7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzBfU1RSVUMsICpQUkZfQ1NSX0NGRzBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzEJCQkweDEwMjQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlyc3Y6NzsJCSAgICAvLyAwOiBpZGxlIDE6IDhidXN5Ci0JCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCi0JCVVJTlQzMgkJUmVnSWRBbmRDb250ZW50OjI0OwkJCS8vIFJlZ2lzdGVyCXZhbHVlIHRvIHByb2dyYW0gaW50byBCQlAKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcxX1NUUlVDLCAqUFJGX0NTUl9DRkcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1JGX0NTUl9DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JCVVJTlQzMgkJUkZHYXA6NTsJCQkvLyBHYXAgYmV0d2VlbiBCQl9DT05UUk9MX1JGIGFuZCBSRl9MRS4gMDogMyBzeXN0ZW0gY2xvY2sgY3ljbGUgKDM3LjV1c2VjKSAxOiA1IHN5c3RlbSBjbG9jayBjeWNsZSAoNjIuNXVzZWMpCi0JCVVJTlQzMgkJcnN2Ojc7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUkZfQ1NSX0NGRzFfU1RSVUMsICpQUkZfQ1NSX0NGRzFfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgUkZfQ1NSX0NGRzIJCQkweDEwMjgJCS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfUkZfQ1NSX0NGRzJfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJcnN2Ojg7CQkgICAgLy8gMDogaWRsZSAxOiA4YnVzeQotCQlVSU5UMzIJCVJlZ0lkQW5kQ29udGVudDoyNDsJCQkvLyBSZWdpc3Rlcgl2YWx1ZSB0byBwcm9ncmFtIGludG8gQkJQCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSRl9DU1JfQ0ZHMl9TVFJVQywgKlBSRl9DU1JfQ0ZHMl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZWdJZEFuZENvbnRlbnQ6MjQ7CQkJLy8gUmVnaXN0ZXIJdmFsdWUgdG8gcHJvZ3JhbSBpbnRvIEJCUAotCQlVSU5UMzIJCXJzdjo4OwkJICAgIC8vIDA6IGlkbGUgMTogOGJ1c3kKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJGX0NTUl9DRkcyX1NUUlVDLCAqUFJGX0NTUl9DRkcyX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIExFRF9DRkcJCQkJMHgxMDJjCQkvLyAgTUFDX0NTUjE0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQk6MTsKLQkJVUlOVDMyCQlMZWRQb2xhcjoxOwkJCS8vIExlZCBQb2xhcml0eS4gIDA6IGFjdGl2ZSBsb3cxOiBhY3RpdmUgaGlnaAotCQlVSU5UMzIJCVlMZWRNb2RlOjI7CQkJLy8geWVsbG93IExlZCBNb2RlCi0JCVVJTlQzMgkJR0xlZE1vZGU6MjsJCQkvLyBncmVlbiBMZWQgTW9kZQotCQlVSU5UMzIJCVJMZWRNb2RlOjI7CQkJLy8gcmVkIExlZCBNb2RlICAgIDA6IG9mZjE6IGJsaW5raW5nIHVwb24gVFgyOiBwZXJpb2RpYyBzbG93IGJsaW5raW5nMzogYWx3YXlzIG9uCi0JCVVJTlQzMgkJcnN2OjI7Ci0JCVVJTlQzMgkJU2xvd0JsaW5rUGVyaW9kOjY7CQkJLy8gc2xvdyBibGlua2luZyBwZXJpb2QuIHVuaXQ6MW1zCi0JCVVJTlQzMgkJT2ZmUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb2ZmIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCU9uUGVyaW9kOjg7CQkJLy8gYmxpbmtpbmcgb24gcGVyaW9kIHVuaXQgMW1zCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfTEVEX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlPblBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9uIHBlcmlvZCB1bml0IDFtcwotCQlVSU5UMzIJCU9mZlBlcmlvZDo4OwkJCS8vIGJsaW5raW5nIG9mZiBwZXJpb2QgdW5pdCAxbXMKLQkJVUlOVDMyCQlTbG93QmxpbmtQZXJpb2Q6NjsJCQkvLyBzbG93IGJsaW5raW5nIHBlcmlvZC4gdW5pdDoxbXMKLQkJVUlOVDMyCQlyc3Y6MjsKLQkJVUlOVDMyCQlSTGVkTW9kZToyOwkJCS8vIHJlZCBMZWQgTW9kZSAgICAwOiBvZmYxOiBibGlua2luZyB1cG9uIFRYMjogcGVyaW9kaWMgc2xvdyBibGlua2luZzM6IGFsd2F5cyBvbgotCQlVSU5UMzIJCUdMZWRNb2RlOjI7CQkJLy8gZ3JlZW4gTGVkIE1vZGUKLQkJVUlOVDMyCQlZTGVkTW9kZToyOwkJCS8vIHllbGxvdyBMZWQgTW9kZQotCQlVSU5UMzIJCUxlZFBvbGFyOjE7CQkJLy8gTGVkIFBvbGFyaXR5LiAgMDogYWN0aXZlIGxvdzE6IGFjdGl2ZSBoaWdoCi0JCVVJTlQzMgkJOjE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMRURfQ0ZHX1NUUlVDLCAqUExFRF9DRkdfU1RSVUM7Ci0jZW5kaWYKLS8vCi0vLyAgNC4yIE1BQyBUSU1JTkcgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIChvZmZzZXQ6MHgxMTAwKQotLy8KLSNkZWZpbmUgWElGU19USU1FX0NGRyAgICAgICAgICAgICAweDExMDAJCSAvLyBNQUNfQ1NSOCAgTUFDX0NTUjkKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgcnN2OjI7Ci0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIEVJRlM6OTsgICAgICAgIC8vICB1bml0IDF1cwotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIENja21TaWZzVGltZTo4OyAgICAgICAgLy8gIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIENDSyBSWC9UWAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9JRlNfU0xPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgQ2NrbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgQ0NLIFJYL1RYCi0JICAgIFVJTlQzMiAgT2ZkbVNpZnNUaW1lOjg7ICAgICAgICAvLyAgdW5pdCAxdXMuIEFwcGxpZWQgYWZ0ZXIgT0ZETSBSWC9UWAotCSAgICBVSU5UMzIgIE9mZG1YaWZzVGltZTo0OyAgICAgICAgLy9PRkRNIFNJRlMuIHVuaXQgMXVzLiBBcHBsaWVkIGFmdGVyIE9GRE0gUlggd2hlbiBNQUMgZG9lc24ndCByZWZlcmVuY2UgQkJQIHNpZ25hbCBCQlJYRU5ECi0JICAgIFVJTlQzMiAgRUlGUzo5OyAgICAgICAgLy8gIHVuaXQgMXVzCi0JICAgIFVJTlQzMiAgQkJSeGVuZEVuYWJsZToxOyAgICAgICAgLy8gIHJlZmVyZW5jZSBSWEVORCBzaWduYWwgdG8gYmVnaW4gWElGUyBkZWZlcgotCSAgICBVSU5UMzIgIHJzdjoyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSUZTX1NMT1RfQ0ZHX1NUUlVDLCAqUElGU19TTE9UX0NGR19TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIEJLT0ZGX1NMT1RfQ0ZHICAgICAgICAgICAgIDB4MTEwNAkJIC8vICBtYWNfY3NyOSBsYXN0IDggYml0cwotI2RlZmluZSBOQVZfVElNRV9DRkcgICAgICAgICAgICAgMHgxMTA4CQkgLy8gTkFWICAoTUFDX0NTUjE1KQotI2RlZmluZSBDSF9USU1FX0NGRyAgICAgICAgICAgICAweDExMEMJCQkvLyBDb3VudCBhcyBjaGFubmVsIGJ1c3kKLSNkZWZpbmUgUEJGX0xJRkVfVElNRVIgICAgICAgICAgICAgMHgxMTEwCQkgLy9UWC9SWCBNUERVIHRpbWVzdGFtcCB0aW1lciAoZnJlZSBydW4pVW5pdDogMXVzCi0jZGVmaW5lIEJDTl9USU1FX0NGRyAgICAgICAgICAgICAweDExMTQJCSAvLyBUWFJYX0NTUjkKLQotI2RlZmluZSBCQ05fT0ZGU0VUMAkJCQkweDA0MkMKLSNkZWZpbmUgQkNOX09GRlNFVDEJCQkJMHgwNDMwCi0KLS8vCi0vLyBCQ05fVElNRV9DRkcgOiBTeW5jaHJvbml6YXRpb24gY29udHJvbCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9CQ05fVElNRV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJVHhUaW1lc3RhbXBDb21wZW5zYXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQliQmVhY29uR2VuOjE7CQkvLyBFbmFibGUgYmVhY29uIGdlbmVyYXRvcgotICAgICAgICBVSU5UMzIgICAgICAgYlRCVFRFbmFibGU6MTsKLQkJVUlOVDMyCQlUc2ZTeW5jTW9kZToyOwkJLy8gRW5hYmxlIFRTRiBzeW5jLCAwMDogZGlzYWJsZSwgMDE6IGluZnJhIG1vZGUsIDEwOiBhZC1ob2MgbW9kZQotCQlVSU5UMzIJCWJUc2ZUaWNraW5nOjE7CQkvLyBFbmFibGUgVFNGIGF1dG8gY291bnRpbmcKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlCQ05fVElNRV9DRkdfU1RSVUMsICpQQkNOX1RJTUVfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0JDTl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJlYWNvbkludGVydmFsOjE2OyAgLy8gaW4gdW5pdCBvZiAxLzE2IFRVCi0JCVVJTlQzMgkJYlRzZlRpY2tpbmc6MTsJCS8vIEVuYWJsZSBUU0YgYXV0byBjb3VudGluZwotCQlVSU5UMzIJCVRzZlN5bmNNb2RlOjI7CQkvLyBFbmFibGUgVFNGIHN5bmMsIDAwOiBkaXNhYmxlLCAwMTogaW5mcmEgbW9kZSwgMTA6IGFkLWhvYyBtb2RlCi0gICAgICAgIFVJTlQzMiAgICAgICBiVEJUVEVuYWJsZToxOwotCQlVSU5UMzIJCWJCZWFjb25HZW46MTsJCS8vIEVuYWJsZSBiZWFjb24gZ2VuZXJhdG9yCi0gICAgICAgIFVJTlQzMiAgICAgICA6MzsKLQkJVUlOVDMyCQlUeFRpbWVzdGFtcENvbXBlbnNhdGU6ODsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUJDTl9USU1FX0NGR19TVFJVQywgKlBCQ05fVElNRV9DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVEJUVF9TWU5DX0NGRyAgICAgICAgICAgIDB4MTExOAkJCS8vIHR4cnhfY3NyMTAKLSNkZWZpbmUgVFNGX1RJTUVSX0RXMCAgICAgICAgICAgICAweDExMUMJCS8vIExvY2FsIFRTRiB0aW1lciBsc2IgMzIgYml0cy4gUmVhZC1vbmx5Ci0jZGVmaW5lIFRTRl9USU1FUl9EVzEgICAgICAgICAgICAgMHgxMTIwCQkvLyBtc2IgMzIgYml0cy4gUmVhZC1vbmx5LgotI2RlZmluZSBUQlRUX1RJTUVSCQkweDExMjQJCQkvLyBUSW1lciByZW1haW5zIHRpbGwgbmV4dCBUQlRULiBSZWFkLW9ubHkuICBUWFJYX0NTUjE0Ci0jZGVmaW5lIElOVF9USU1FUl9DRkcJCQkweDExMjgJCQkvLwotI2RlZmluZSBJTlRfVElNRVJfRU4JCQkweDExMmMJCQkvLyAgR1AtdGltZXIgYW5kIHByZS10YnR0IEludCBlbmFibGUKLSNkZWZpbmUgQ0hfSURMRV9TVEEJCQkweDExMzAJCQkvLyAgY2hhbm5lbCBpZGxlIHRpbWUKLSNkZWZpbmUgQ0hfQlVTWV9TVEEJCQkweDExMzQJCQkvLyAgY2hhbm5sZSBidXN5IHRpbWUKLS8vCi0vLyAgNC4yIE1BQyBQT1dFUiAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKG9mZnNldDoweDEyMDApCi0vLwotI2RlZmluZSBNQUNfU1RBVFVTX0NGRyAgICAgICAgICAgICAweDEyMDAJCSAvLyBvbGQgTUFDX0NTUjEyCi0jZGVmaW5lIFBXUl9QSU5fQ0ZHICAgICAgICAgICAgIDB4MTIwNAkJIC8vIG9sZCBNQUNfQ1NSMTIKLSNkZWZpbmUgQVVUT19XQUtFVVBfQ0ZHICAgICAgICAgICAgIDB4MTIwOAkJIC8vIG9sZCBNQUNfQ1NSMTAKLS8vCi0vLyBBVVRPX1dBS0VVUF9DRkc6IE1hbnVhbCBwb3dlciBjb250cm9sIC8gc3RhdHVzIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0FVVE9fV0FLRVVQX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCToxNjsKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyICAgICAgIEF1dG9MZWFkVGltZTo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JQVVUT19XQUtFVVBfU1RSVUMsICpQQVVUT19XQUtFVVBfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfQVVUT19XQUtFVVBfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICBBdXRvTGVhZFRpbWU6ODsKLQkJVUlOVDMyICAgICAgIE51bW9mU2xlZXBpbmdUYnR0Ojc7ICAgICAgICAgIC8vIEZvcmNlV2FrZSBoYXMgaGlnaCBwcml2aWxlZ2UgdGhhbiBQdXRUb1NsZWVwIHdoZW4gYm90aCBzZXQKLQkJVUlOVDMyCQlFbmFibGVBdXRvV2FrZXVwOjE7CS8vIDA6c2xlZXAsIDE6YXdha2UKLQkJVUlOVDMyCQk6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlBVVRPX1dBS0VVUF9TVFJVQywgKlBBVVRPX1dBS0VVUF9TVFJVQzsKLSNlbmRpZgotLy8KLS8vICA0LjMgTUFDIFRYICBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTMwMCkKLS8vCi0KLSNkZWZpbmUgRURDQV9BQzBfQ0ZHCTB4MTMwMAkJLy9BQ19UWE9QX0NTUjAgMHgzNDc0Ci0jZGVmaW5lIEVEQ0FfQUMxX0NGRwkweDEzMDQKLSNkZWZpbmUgRURDQV9BQzJfQ0ZHCTB4MTMwOAotI2RlZmluZSBFRENBX0FDM19DRkcJMHgxMzBjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfRURDQV9BQ19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgOjEyOyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBDd21heDo0OyAgICAgICAgLy91bml0IHBvd2VyIG9mIDIKLQkgICAgVUlOVDMyICBDd21pbjo0OyAgICAgICAgLy8KLQkgICAgVUlOVDMyICBBaWZzbjo0OyAgICAgICAgLy8gIyBvZiBzbG90IHRpbWUKLQkgICAgVUlOVDMyICBBY1R4b3A6ODsgICAgICAgIC8vICBpbiB1bml0IG9mIDMydXMKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0VEQ0FfQUNfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgIEFjVHhvcDo4OyAgICAgICAgLy8gIGluIHVuaXQgb2YgMzJ1cwotCSAgICBVSU5UMzIgIEFpZnNuOjQ7ICAgICAgICAvLyAjIG9mIHNsb3QgdGltZQotCSAgICBVSU5UMzIgIEN3bWluOjQ7ICAgICAgICAvLwotCSAgICBVSU5UMzIgIEN3bWF4OjQ7ICAgICAgICAvL3VuaXQgcG93ZXIgb2YgMgotCSAgICBVSU5UMzIgIDoxMjsgICAgICAgLy8KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUVEQ0FfQUNfQ0ZHX1NUUlVDLCAqUEVEQ0FfQUNfQ0ZHX1NUUlVDOwotI2VuZGlmCi0KLSNkZWZpbmUgRURDQV9USURfQUNfTUFQCTB4MTMxMAotI2RlZmluZSBUWF9QV1JfQ0ZHXzAJMHgxMzE0Ci0jZGVmaW5lIFRYX1BXUl9DRkdfMQkweDEzMTgKLSNkZWZpbmUgVFhfUFdSX0NGR18yCTB4MTMxQwotI2RlZmluZSBUWF9QV1JfQ0ZHXzMJMHgxMzIwCi0jZGVmaW5lIFRYX1BXUl9DRkdfNAkweDEzMjQKLSNkZWZpbmUgVFhfUElOX0NGRwkJMHgxMzI4Ci0jZGVmaW5lIFRYX0JBTkRfQ0ZHCTB4MTMyYwkJLy8gMHgxIHVzZSB1cHBlciAyME1Iei4gMCBqdXNlIGxvd2VyIDIwTUh6Ci0jZGVmaW5lIFRYX1NXX0NGRzAJCTB4MTMzMAotI2RlZmluZSBUWF9TV19DRkcxCQkweDEzMzQKLSNkZWZpbmUgVFhfU1dfQ0ZHMgkJMHgxMzM4Ci0jZGVmaW5lIFRYT1BfVEhSRVNfQ0ZHCQkweDEzM2MKLSNkZWZpbmUgVFhPUF9DVFJMX0NGRwkJMHgxMzQwCi0jZGVmaW5lIFRYX1JUU19DRkcJCTB4MTM0NAotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfUlRTX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIHJzdjo3OwotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSdHNUaHJlczoxNjsgICAgLy8gdW5pdDpieXRlCi0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRTX0NGR19TVFJVQywgKlBUWF9SVFNfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX1JUU19DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBBdXRvUnRzUmV0cnlMaW1pdDo4OwotCSAgICBVSU5UMzIgICAgICAgUnRzVGhyZXM6MTY7ICAgIC8vIHVuaXQ6Ynl0ZQotCSAgICBVSU5UMzIgICAgICAgUnRzRmJrRW46MTsgICAgLy8gZW5hYmxlIHJ0cyByYXRlIGZhbGxiYWNrCi0JICAgIFVJTlQzMiAgICAgICByc3Y6NzsgICAgIC8vIDE6IEhUIG5vbi1TVEJDIGNvbnRyb2wgZnJhbWUgZW5hYmxlCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9SVFNfQ0ZHX1NUUlVDLCAqUFRYX1JUU19DRkdfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfVElNRU9VVF9DRkcJMHgxMzQ4Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3YyOjg7Ci0JICAgIFVJTlQzMiAgICAgICBUeG9wVGltZW91dDo4OwkvL1RYT1AgdGltZW91dCB2YWx1ZSBmb3IgVFhPUCB0cnVuY2F0aW9uLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAoU0xPVF9USU1FKSA+IChUWF9PUF9USU1FT1VUKSA+IChSWF9BQ0tfVElNRU9VVCkKLQkgICAgVUlOVDMyICAgICAgIFJ4QWNrVGltZW91dDo4OwkvLyB1bml0OnNsb3QuIFVzZWQgZm9yIFRYIHByZWNlZHVyZQotCSAgICBVSU5UMzIgICAgICAgTXBkdUxpZmVUaW1lOjQ7ICAgIC8vICBleHBpcmF0aW9uIHRpbWUgPSAyXig5K01QRFUgTElGRSBUSU1FKSAgdXMKLQkgICAgVUlOVDMyICAgICAgIHJzdjo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfVElNRU9VVF9DRkdfU1RSVUMsICpQVFhfVElNRU9VVF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfVElNRU9VVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6NDsKLQkgICAgVUlOVDMyICAgICAgIE1wZHVMaWZlVGltZTo0OyAgICAvLyAgZXhwaXJhdGlvbiB0aW1lID0gMl4oOStNUERVIExJRkUgVElNRSkgIHVzCi0JICAgIFVJTlQzMiAgICAgICBSeEFja1RpbWVvdXQ6ODsJLy8gdW5pdDpzbG90LiBVc2VkIGZvciBUWCBwcmVjZWR1cmUKLQkgICAgVUlOVDMyICAgICAgIFR4b3BUaW1lb3V0Ojg7CS8vVFhPUCB0aW1lb3V0IHZhbHVlIGZvciBUWE9QIHRydW5jYXRpb24uICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IChTTE9UX1RJTUUpID4gKFRYX09QX1RJTUVPVVQpID4gKFJYX0FDS19USU1FT1VUKQotCSAgICBVSU5UMzIgICAgICAgcnN2Mjo4OyAgICAgLy8gMTogSFQgbm9uLVNUQkMgY29udHJvbCBmcmFtZSBlbmFibGUKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1RJTUVPVVRfQ0ZHX1NUUlVDLCAqUFRYX1RJTUVPVVRfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX1JUWV9DRkcJMHgxMzRjCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1JUWV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6MTsKLQkgICAgVUlOVDMyICAgICAgIFR4YXV0b0ZCRW5hYmxlOjE7ICAgIC8vIFR4IHJldHJ5IFBIWSByYXRlIGF1dG8gZmFsbGJhY2sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBOb25BZ2dSdHlNb2RlOjE7CS8vIE5vbi1BZ2dyZWdhdGUgTVBEVSByZXRyeSBtb2RlLiAgMDpleHBpcmVkIGJ5IHJldHJ5IGxpbWl0LCAxOiBleHBpcmVkIGJ5IG1wZHUgbGlmZSB0aW1lcgotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eVRocmU6MTI7CS8vIExvbmcgcmV0cnkgdGhyZXNob29sZAotCSAgICBVSU5UMzIgICAgICAgTG9uZ1J0eUxpbWl0Ojg7CS8vbG9uZyByZXRyeSBsaW1pdAotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9SVFlfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgU2hvcnRSdHlMaW1pdDo4OwkvLyAgc2hvcnQgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlMaW1pdDo4OwkvL2xvbmcgcmV0cnkgbGltaXQKLQkgICAgVUlOVDMyICAgICAgIExvbmdSdHlUaHJlOjEyOwkvLyBMb25nIHJldHJ5IHRocmVzaG9vbGQKLQkgICAgVUlOVDMyICAgICAgIE5vbkFnZ1J0eU1vZGU6MTsJLy8gTm9uLUFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBBZ2dSdHlNb2RlOjE7CS8vIEFnZ3JlZ2F0ZSBNUERVIHJldHJ5IG1vZGUuICAwOmV4cGlyZWQgYnkgcmV0cnkgbGltaXQsIDE6IGV4cGlyZWQgYnkgbXBkdSBsaWZlIHRpbWVyCi0JICAgIFVJTlQzMiAgICAgICBUeGF1dG9GQkVuYWJsZToxOyAgICAvLyBUeCByZXRyeSBQSFkgcmF0ZSBhdXRvIGZhbGxiYWNrIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgcnN2OjE7ICAgICAvLyAxOiBIVCBub24tU1RCQyBjb250cm9sIGZyYW1lIGVuYWJsZQotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfUlRZX0NGR19TVFJVQywgKlBUWF9SVFlfQ0ZHX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0xJTktfQ0ZHCTB4MTM1MAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JUEFDS0VEIF9UWF9MSU5LX0NGR19TVFJVQwl7Ci0Jc3RydWN0IFBBQ0tFRCB7Ci0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GQjo4OyAgICAvLyAgcmVtb3RlIE1DUyBmZWVkYmFjawotCSAgICBVSU5UMzIgICAgICAgcnN2OjM7CS8vCi0JICAgIFVJTlQzMiAgICAgICBUeENGQWNrRW46MTsJLy8gICBQaWdneWJhY2sgQ0YtQUNLIGVuYWJsZQotCSAgICBVSU5UMzIgICAgICAgVHhSREdFbjoxOwkvLyBSREcgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeE1SUUVuOjE7CS8vICBNQ1MgcmVxdWVzdCBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgTUZCRW5hYmxlOjE7CS8vICBUWCBhcHBseSByZW1vdGUgTUZCIDE6ZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdGVNRkJMaWZlVGltZTo4OwkvL3JlbW90ZSBNRkIgbGlmZSB0aW1lLiB1bml0IDogMzJ1cwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfTElOS19DRkdfU1RSVUMsICpQVFhfTElOS19DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglQQUNLRUQgX1RYX0xJTktfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QgUEFDS0VEIHsKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZU1GQkxpZmVUaW1lOjg7CS8vcmVtb3RlIE1GQiBsaWZlIHRpbWUuIHVuaXQgOiAzMnVzCi0JICAgIFVJTlQzMiAgICAgICBNRkJFbmFibGU6MTsJLy8gIFRYIGFwcGx5IHJlbW90ZSBNRkIgMTplbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFJlbW90ZVVNRlNFbmFibGU6MTsJLy8gIHJlbW90ZSB1bnNvbGljaXQgIE1GQiBlbmFibGUuICAwOiBub3QgYXBwbHkgcmVtb3RlIHJlbW90ZSB1bnNvbGljaXQgKE1GUz03KQotCSAgICBVSU5UMzIgICAgICAgVHhNUlFFbjoxOwkvLyAgTUNTIHJlcXVlc3QgVFggZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICBUeFJER0VuOjE7CS8vIFJERyBUWCBlbmFibGUKLQkgICAgVUlOVDMyICAgICAgIFR4Q0ZBY2tFbjoxOwkvLyAgIFBpZ2d5YmFjayBDRi1BQ0sgZW5hYmxlCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MzsJLy8KLQkgICAgVUlOVDMyICAgICAgIFJlbW90TUZCOjg7ICAgIC8vICByZW1vdGUgTUNTIGZlZWRiYWNrCi0JICAgIFVJTlQzMiAgICAgICBSZW1vdE1GUzo4OwkvL3JlbW90ZSBNQ1MgZmVlZGJhY2sgc2VxdWVuY2UgbnVtYmVyCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9MSU5LX0NGR19TVFJVQywgKlBUWF9MSU5LX0NGR19TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBIVF9GQktfQ0ZHMAkweDEzNTQKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uIFBBQ0tFRCBfSFRfRkJLX0NGRzBfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M1RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MyRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMEZCSzo0OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSFRfRkJLX0NGRzBfU1RSVUMsICpQSFRfRkJLX0NGRzBfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX0hUX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MwRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MzRkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M2RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzdGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcwX1NUUlVDLCAqUEhUX0ZCS19DRkcwX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIEhUX0ZCS19DRkcxCTB4MTM1OAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxNEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxM0ZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMkZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMUZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1MxMEZCSzo0OwotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M5RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzhGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX0hUX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgSFRNQ1M4RkJLOjQ7Ci0JICAgIFVJTlQzMiAgICAgICBIVE1DUzlGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTBGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTFGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTJGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTNGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTRGQks6NDsKLQkgICAgVUlOVDMyICAgICAgIEhUTUNTMTVGQks6NDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhUX0ZCS19DRkcxX1NUUlVDLCAqUEhUX0ZCS19DRkcxX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIExHX0ZCS19DRkcwCTB4MTM1YwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzdGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDYKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzRGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDMKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzFGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDAKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMF9TVFJVQywgKlBMR19GQktfQ0ZHMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9MR19GQktfQ0ZHMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzJGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDEKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTNEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMwotCSAgICBVSU5UMzIgICAgICAgT0ZETU1DUzVGQks6NDsJLy9pbml0aWFsIHZhbHVlIGlzIDQKLQkgICAgVUlOVDMyICAgICAgIE9GRE1NQ1M2RkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyA1Ci0JICAgIFVJTlQzMiAgICAgICBPRkRNTUNTN0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgNgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzBfU1RSVUMsICpQTEdfRkJLX0NGRzBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgTEdfRkJLX0NGRzEJCTB4MTM2MAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0xHX0ZCS19DRkcxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVSU5UMzIgICAgICAgcnN2OjE2OwotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTM0ZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMgotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMkZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMQotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMUZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCSAgICBVSU5UMzIgICAgICAgQ0NLTUNTMEZCSzo0OwkvL2luaXRpYWwgdmFsdWUgaXMgMAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JTEdfRkJLX0NGRzFfU1RSVUMsICpQTEdfRkJLX0NGRzFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfTEdfRkJLX0NGRzFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MwRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MxRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAwCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MyRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAxCi0JICAgIFVJTlQzMiAgICAgICBDQ0tNQ1MzRkJLOjQ7CS8vaW5pdGlhbCB2YWx1ZSBpcyAyCi0JICAgIFVJTlQzMiAgICAgICByc3Y6MTY7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlMR19GQktfQ0ZHMV9TVFJVQywgKlBMR19GQktfQ0ZHMV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy89PT09PT09PT09PT09PT09IFByb3RlY3Rpb24gUGFyYW1hdGVyPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2RlZmluZSBDQ0tfUFJPVF9DRkcJMHgxMzY0CQkvL0NDSyBQcm90ZWN0aW9uCi0jZGVmaW5lIEFTSUNfU0hPUlROQVYJCTEKLSNkZWZpbmUgQVNJQ19MT05HTkFWCQkyCi0jZGVmaW5lIEFTSUNfUlRTCQkxCi0jZGVmaW5lIEFTSUNfQ1RTCQkyCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICByc3Y6NTsKLQkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuIDA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dPZmRtOjE7CS8vQ0NLIFRYT1AgYWxsb3dhbmNlLjA6ZGlzYWxsb3cuCi0JICAgIFVJTlQzMiAgICAgICBUeG9wQWxsb3dDY2s6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3RDdHJsOjI7CS8vUHJvdGVjdGlvbiBjb250cm9sIGZyYW1lIHR5cGUgZm9yIENDSyBUWC4gMTpSVFMvQ1RTLCAyOkNUUy10by1zZWxmLCAwOk5vbmUsIDM6cnN2Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUFJPVF9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgICAgICBQcm90ZWN0UmF0ZToxNjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgcmF0ZSBmb3IgQ0NLIFRYKFJUUy9DVFMvQ0ZFbmQpLgotCSAgICBVSU5UMzIgICAgICAgUHJvdGVjdEN0cmw6MjsJLy9Qcm90ZWN0aW9uIGNvbnRyb2wgZnJhbWUgdHlwZSBmb3IgQ0NLIFRYLiAxOlJUUy9DVFMsIDI6Q1RTLXRvLXNlbGYsIDA6Tm9uZSwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFByb3RlY3ROYXY6MjsJLy9UWE9QIHByb3RlY3Rpb24gdHlwZSBmb3IgQ0NLIFRYLiAwOk5vbmUsIDE6U2hvcnROQVZwcm90ZWN0LCAgMjpMb25nTkFWUHJvdGVjdCwgMzpyc3YKLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0NjazoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93T2ZkbToxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4wOmRpc2FsbG93LgotCSAgICBVSU5UMzIgICAgICAgVHhvcEFsbG93TU0yMDoxOwkvL0NDSyBUWE9QIGFsbG93YW5jZS4gMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd01NNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGMjA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFR4b3BBbGxvd0dGNDA6MTsJLy9DQ0sgVFhPUCBhbGxvd2FuY2UuMDpkaXNhbGxvdy4KLQkgICAgVUlOVDMyICAgICAgIFJUU1RoRW46MTsJLy9SVFMgdGhyZXNob2xkIGVuYWJsZSBvbiBDQ0sgVFgKLQkgICAgVUlOVDMyICAgICAgIHJzdjo1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUFJPVF9DRkdfU1RSVUMsICpQUFJPVF9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotI2RlZmluZSBPRkRNX1BST1RfQ0ZHCTB4MTM2OAkJLy9PRkRNIFByb3RlY3Rpb24KLSNkZWZpbmUgTU0yMF9QUk9UX0NGRwkweDEzNkMJCS8vTU0yMCBQcm90ZWN0aW9uCi0jZGVmaW5lIE1NNDBfUFJPVF9DRkcJMHgxMzcwCQkvL01NNDAgUHJvdGVjdGlvbgotI2RlZmluZSBHRjIwX1BST1RfQ0ZHCTB4MTM3NAkJLy9HRjIwIFByb3RlY3Rpb24KLSNkZWZpbmUgR0Y0MF9QUk9UX0NGRwkweDEzNzgJCS8vR1I0MCBQcm90ZWN0aW9uCi0jZGVmaW5lIEVYUF9DVFNfVElNRQkweDEzN0MJCS8vCi0jZGVmaW5lIEVYUF9BQ0tfVElNRQkweDEzODAJCS8vCi0KLS8vCi0vLyAgNC40IE1BQyBSWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAob2Zmc2V0OjB4MTQwMCkKLS8vCi0jZGVmaW5lIFJYX0ZJTFRSX0NGRwkweDE0MDAJCQkvL1RYUlhfQ1NSMAotI2RlZmluZSBBVVRPX1JTUF9DRkcJMHgxNDA0CQkJLy9UWFJYX0NTUjQKLS8vCi0vLyBUWFJYX0NTUjQ6IEF1dG8tUmVzcG9uZGVyLwotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgewotIHN0cnVjdCB7Ci0gICAgIFVJTlQzMiAgICAgICAgOjI0OwotICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICBEdWFsQ1RTRW46MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIHJzdjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlclByZWFtYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQ1RTNDBNUmVmOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTU1vZGU6MTsgIC8vIFJlc3BvbnNlIENUUyA0ME1IeiBkdXBsaWNhdGUgbW9kZQotICAgICBVSU5UMzIgICAgICAgQkFDQWNrUG9saWN5RW5hYmxlOjE7ICAgIC8vIDA6bG9uZywgMTpzaG9ydCBwcmVhbWJsZQotICAgICBVSU5UMzIgICAgICAgQXV0b1Jlc3BvbmRlckVuYWJsZToxOwotIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKLX0gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmIHVuaW9uIF9BVVRPX1JTUF9DRkdfU1RSVUMgewotIHN0cnVjdCB7Ci0gICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyRW5hYmxlOjE7Ci0gICAgIFVJTlQzMiAgICAgICBCQUNBY2tQb2xpY3lFbmFibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCi0gICAgIFVJTlQzMiAgICAgICBDVFM0ME1Nb2RlOjE7ICAvLyBSZXNwb25zZSBDVFMgNDBNSHogZHVwbGljYXRlIG1vZGUKLSAgICAgVUlOVDMyICAgICAgIENUUzQwTVJlZjoxOyAgLy8gUmVzcG9uc2UgQ1RTIDQwTUh6IGR1cGxpY2F0ZSBtb2RlCi0gICAgIFVJTlQzMiAgICAgICBBdXRvUmVzcG9uZGVyUHJlYW1ibGU6MTsgICAgLy8gMDpsb25nLCAxOnNob3J0IHByZWFtYmxlCi0gICAgIFVJTlQzMiAgICAgICByc3Y6MTsgICAvLyBQb3dlciBiaXQgdmFsdWUgaW4gY29ucnRyb2wgZnJhbWUKLSAgICAgVUlOVDMyICAgICAgIER1YWxDVFNFbjoxOyAgIC8vIFBvd2VyIGJpdCB2YWx1ZSBpbiBjb25ydHJvbCBmcmFtZQotICAgICBVSU5UMzIgICAgICAgQWNrQ3RzUHNtQml0OjE7ICAgLy8gUG93ZXIgYml0IHZhbHVlIGluIGNvbnJ0cm9sIGZyYW1lCi0gICAgIFVJTlQzMiAgICAgICAgOjI0OwotIH0gZmllbGQ7Ci0gVUlOVDMyICAgd29yZDsKLX0gQVVUT19SU1BfQ0ZHX1NUUlVDLCAqUEFVVE9fUlNQX0NGR19TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lIExFR0FDWV9CQVNJQ19SQVRFCTB4MTQwOAkvLyAgVFhSWF9DU1I1ICAgICAgICAgICAweDMwNTQKLSNkZWZpbmUgSFRfQkFTSUNfUkFURQkJMHgxNDBjCi0jZGVmaW5lIEhUX0NUUkxfQ0ZHCQkweDE0MTAKLSNkZWZpbmUgU0lGU19DT1NUX0NGRwkJMHgxNDE0Ci0jZGVmaW5lIFJYX1BBUlNFUl9DRkcJCTB4MTQxOAkvL1NldCBOQVYgZm9yIGFsbCByZWNlaXZlZCBmcmFtZXMKLQotLy8KLS8vICA0LjUgTUFDIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKG9mZnNldDoweDE1MDApCi0vLwotI2RlZmluZSBUWF9TRUNfQ05UMAkJMHgxNTAwCQkvLwotI2RlZmluZSBSWF9TRUNfQ05UMAkJMHgxNTA0CQkvLwotI2RlZmluZSBDQ01QX0ZDX01VVEUJCTB4MTUwOAkJLy8KLS8vCi0vLyAgNC42IEhDQ0EvUFNNUCAob2Zmc2V0OjB4MTYwMCkKLS8vCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMAkJMHgxNjAwCi0jZGVmaW5lIFRYT1BfSExEUl9BRERSMQkJMHgxNjA0Ci0jZGVmaW5lIFRYT1BfSExEUl9FVAkJMHgxNjA4Ci0jZGVmaW5lIFFPU19DRlBPTExfUkFfRFcwCQkweDE2MGMKLSNkZWZpbmUgUU9TX0NGUE9MTF9BMV9EVzEJCTB4MTYxMAotI2RlZmluZSBRT1NfQ0ZQT0xMX1FDCQkweDE2MTQKLS8vCi0vLyAgNC43IE1BQyBTdGF0aXN0aXMgcmVnaXN0ZXJzIChvZmZzZXQ6MHgxNzAwKQotLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDAJCTB4MTcwMAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDEJCTB4MTcwNAkJLy8KLSNkZWZpbmUgUlhfU1RBX0NOVDIJCTB4MTcwOAkJLy8KLQotLy8KLS8vIFJYX1NUQV9DTlQwX1NUUlVDOiBSWCBQTENQIGVycm9yIGNvdW50ICYgUlggQ1JDIGVycm9yIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFBoeUVycjsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMF9TVFJVQywgKlBSWF9TVEFfQ05UMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBDcmNFcnI7Ci0JICAgIFVTSE9SVCAgUGh5RXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDBfU1RSVUMsICpQUlhfU1RBX0NOVDBfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFJYX1NUQV9DTlQxX1NUUlVDOiBSWCBGYWxzZSBDQ0EgY291bnQgJiBSWCBMT05HIGZyYW1lIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFBsY3BFcnI7Ci0JICAgIFVTSE9SVCAgRmFsc2VDY2E7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlSWF9TVEFfQ05UMV9TVFJVQywgKlBSWF9TVEFfQ05UMV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBGYWxzZUNjYTsKLQkgICAgVVNIT1JUICBQbGNwRXJyOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDFfU1RSVUMsICpQUlhfU1RBX0NOVDFfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFJYX1NUQV9DTlQyX1NUUlVDOgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX1NUQV9DTlQyX1NUUlVDLCAqUFJYX1NUQV9DTlQyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1JYX1NUQV9DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFJ4RHVwbGlDb3VudDsKLQkgICAgVVNIT1JUICBSeEZpZm9PdmVyZmxvd0NvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfU1RBX0NOVDJfU1RSVUMsICpQUlhfU1RBX0NOVDJfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfU1RBX0NOVDAJCTB4MTcwQwkJLy8KLS8vCi0vLyBTVEFfQ1NSMzogVFggQmVhY29uIGNvdW50Ci0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4QmVhY29uQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhGYWlsQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMF9TVFJVQywgKlBUWF9TVEFfQ05UMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUeEZhaWxDb3VudDsKLQkgICAgVVNIT1JUICBUeEJlYWNvbkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0NOVDBfU1RSVUMsICpQVFhfU1RBX0NOVDBfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfU1RBX0NOVDEJCTB4MTcxMAkJLy8KLS8vCi0vLyBUWF9TVEFfQ05UMTogVFggdHggY291bnQKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDFfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhSZXRyYW5zbWl0OwotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQxX1NUUlVDLCAqUFRYX1NUQV9DTlQxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX1NUQV9DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIFR4U3VjY2VzczsKLQkgICAgVVNIT1JUICBUeFJldHJhbnNtaXQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfQ05UMV9TVFJVQywgKlBUWF9TVEFfQ05UMV9TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBUWF9TVEFfQ05UMgkJMHgxNzE0CQkvLwotLy8KLS8vIFRYX1NUQV9DTlQyOiBUWCB0eCBjb3VudAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9UWF9TVEFfQ05UMl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUeFVuZGVyRmxvd0NvdW50OwotCSAgICBVU0hPUlQgIFR4WmVyb0xlbkNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0NOVDJfU1RSVUMsICpQVFhfU1RBX0NOVDJfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfU1RBX0NOVDJfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgVHhaZXJvTGVuQ291bnQ7Ci0JICAgIFVTSE9SVCAgVHhVbmRlckZsb3dDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX1NUQV9DTlQyX1NUUlVDLCAqUFRYX1NUQV9DTlQyX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX1NUQV9GSUZPCQkweDE3MTgJCS8vCi0vLwotLy8gVFhfU1RBX0ZJRk9fU1RSVUM6IFRYIFJlc3VsdCBmb3Igc3BlY2lmaWMgUElEIHN0YXR1cyBmaWZvIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9UWF9TVEFfRklGT19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JCVVJTlQzMgkJVHhCRjoxOyAvLyAzKjMKLQkJVUlOVDMyCQlTdWNjZXNzUmF0ZToxMzsJLy9pbmNsdWRlIE1DUywgbW9kZSAsc2hvcnRHSSwgQlcgc2V0dGluZ1NhbWUgZm9ybWF0IGFzIFRYV0kgV29yZCAwIEJpdCAzMS0xNi4KLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCXdjaWQ6ODsJCS8vd2lyZWxlc3MgY2xpZW50IGluZGV4Ci0JCVVJTlQzMgkJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBhY2sgcmVxdWlyZWQKLQkJVUlOVDMyCQlUeEFnZ3JlOjE7ICAgIC8vIFR4IGlzIGFnZ3JlZ2F0ZWQKLQkJVUlOVDMyCQlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBzdWNjZXNzLiB3aGV0aGVyIHN1Y2Nlc3Mgb3Igbm90Ci0JCVVJTlQzMgkJUGlkVHlwZTo0OwotCQlVSU5UMzIJCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfU1RBX0ZJRk9fU1RSVUMsICpQVFhfU1RBX0ZJRk9fU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbiBQQUNLRUQgX1RYX1NUQV9GSUZPX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCWJWYWxpZDoxOyAgIC8vIDE6VGhpcyByZWdpc3RlciBjb250YWlucyBhIHZhbGlkIFRYIHJlc3VsdAotCQlVSU5UMzIJCVBpZFR5cGU6NDsKLQkJVUlOVDMyCQlUeFN1Y2Nlc3M6MTsgICAvLyBUeCBObyByZXRyeSBzdWNjZXNzCi0JCVVJTlQzMgkJVHhBZ2dyZToxOyAgICAvLyBUeCBSZXRyeSBTdWNjZXNzCi0JCVVJTlQzMgkJVHhBY2tSZXF1aXJlZDoxOyAgICAvLyBUeCBmYWlsCi0JCVVJTlQzMgkJd2NpZDo4OwkJLy93aXJlbGVzcyBjbGllbnQgaW5kZXgKLS8vCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjE2OwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVN1Y2Nlc3NSYXRlOjEzOwkvL2luY2x1ZGUgTUNTLCBtb2RlICxzaG9ydEdJLCBCVyBzZXR0aW5nU2FtZSBmb3JtYXQgYXMgVFhXSSBXb3JkIDAgQml0IDMxLTE2LgotCQlVSU5UMzIJCVR4QkY6MTsKLQkJVUlOVDMyCQlSZXNlcnZlOjI7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9TVEFfRklGT19TVFJVQywgKlBUWF9TVEFfRklGT19TVFJVQzsKLSNlbmRpZgotLy8gRGVidWcgY291bnRlcgotI2RlZmluZSBUWF9BR0dfQ05UCTB4MTcxYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBOb25BZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgTm9uQWdnVHhDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dUeENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVF9TVFJVQywgKlBUWF9BR0dfQ05UX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQwCTB4MTcyMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUyQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTFDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQwX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQwX1NUUlVDLCAqUFRYX0FHR19DTlQwX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQxCTB4MTcyNAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU0Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTNDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUzQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTRDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQxX1NUUlVDLCAqUFRYX0FHR19DTlQxX1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0FHR19DTlQyCTB4MTcyOAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU2Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTVDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQyX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTZDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQyX1NUUlVDLCAqUFRYX0FHR19DTlQyX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQzCTB4MTcyYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU4Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTdDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQzX1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemU3Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZThDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQzX1NUUlVDLCAqUFRYX0FHR19DTlQzX1NUUlVDOwotI2VuZGlmCi0vLyBEZWJ1ZyBjb3VudGVyCi0jZGVmaW5lIFRYX0FHR19DTlQ0CTB4MTczMAotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemU5Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNF9TVFJVQywgKlBUWF9BR0dfQ05UNF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplOUNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxMENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDRfU1RSVUMsICpQVFhfQUdHX0NOVDRfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfQUdHX0NOVDUJMHgxNzM0Ci0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDVfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTEyQ291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTExQ291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UNV9TVFJVQywgKlBUWF9BR0dfQ05UNV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTFDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTJDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ1X1NUUlVDLCAqUFRYX0FHR19DTlQ1X1NUUlVDOwotI2VuZGlmCi0jZGVmaW5lIFRYX0FHR19DTlQ2CQkweDE3MzgKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9UWF9BR0dfQ05UNl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTRDb3VudDsKLQkgICAgVVNIT1JUICBBZ2dTaXplMTNDb3VudDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVRYX0FHR19DTlQ2X1NUUlVDLCAqUFRYX0FHR19DTlQ2X1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ2X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxM0NvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNENvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDZfU1RSVUMsICpQVFhfQUdHX0NOVDZfU1RSVUM7Ci0jZW5kaWYKLSNkZWZpbmUgVFhfQUdHX0NOVDcJCTB4MTczYwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1RYX0FHR19DTlQ3X1NUUlVDCXsKLQlzdHJ1Y3QJewotCSAgICBVU0hPUlQgIEFnZ1NpemUxNkNvdW50OwotCSAgICBVU0hPUlQgIEFnZ1NpemUxNUNvdW50OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JVFhfQUdHX0NOVDdfU1RSVUMsICpQVFhfQUdHX0NOVDdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfVFhfQUdHX0NOVDdfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE1Q291bnQ7Ci0JICAgIFVTSE9SVCAgQWdnU2l6ZTE2Q291bnQ7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlUWF9BR0dfQ05UN19TVFJVQywgKlBUWF9BR0dfQ05UN19TVFJVQzsKLSNlbmRpZgotI2RlZmluZSBNUERVX0RFTlNJVFlfQ05UCQkweDE3NDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9NUERVX0RFTl9DTlRfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVTSE9SVCAgUlhaZXJvRGVsQ291bnQ7CS8vUlggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50Ci0JICAgIFVTSE9SVCAgVFhaZXJvRGVsQ291bnQ7CS8vVFggemVybyBsZW5ndGggZGVsaW1pdGVyIGNvdW50Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlNUERVX0RFTl9DTlRfU1RSVUMsICpQTVBEVV9ERU5fQ05UX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX01QRFVfREVOX0NOVF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVVNIT1JUICBUWFplcm9EZWxDb3VudDsJLy9UWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQkgICAgVVNIT1JUICBSWFplcm9EZWxDb3VudDsJLy9SWCB6ZXJvIGxlbmd0aCBkZWxpbWl0ZXIgY291bnQKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU1QRFVfREVOX0NOVF9TVFJVQywgKlBNUERVX0RFTl9DTlRfU1RSVUM7Ci0jZW5kaWYKLS8vCi0vLyBUWFJYIGNvbnRyb2wgcmVnaXN0ZXJzIC0gYmFzZSBhZGRyZXNzIDB4MzAwMAotLy8KLS8vIHJ0Mjg2MGIgIFVOS05PV04gcmVnIHVzZSBSL08gUmVnIEFkZHIgMHg3N2QwIGZpcnN0Li4KLSNkZWZpbmUgVFhSWF9DU1IxICAgICAgICAgICAweDc3ZDAKLQotLy8KLS8vIFNlY3VyaXR5IGtleSB0YWJsZSBtZW1vcnksIGJhc2UgYWRkcmVzcyA9IDB4MTAwMAotLy8KLSNkZWZpbmUgTUFDX1dDSURfQkFTRQkJMHgxODAwIC8vOC1ieXRlcyh1c2Ugb25seSA2LWJ5dGVzKSAqIDI1NiBlbnRyeSA9Ci0jZGVmaW5lIEhXX1dDSURfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgUEFJUldJU0VfS0VZX1RBQkxFX0JBU0UgICAgIDB4NDAwMCAgICAgIC8vIDMyLWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfS0VZX0VOVFJZX1NJWkUgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUEFJUldJU0VfSVZFSVZfVEFCTEVfQkFTRSAgICAgMHg2MDAwICAgICAgLy8gOC1ieXRlICogMjU2LWVudHJ5ID0gIC1ieXRlCi0jZGVmaW5lIE1BQ19JVkVJVl9UQUJMRV9CQVNFICAgICAweDYwMDAgICAgICAvLyA4LWJ5dGUgKiAyNTYtZW50cnkgPSAgLWJ5dGUKLSNkZWZpbmUgSFdfSVZFSVZfRU5UUllfU0laRSAgIDgKLSNkZWZpbmUgTUFDX1dDSURfQVRUUklCVVRFX0JBU0UgICAgIDB4NjgwMCAgICAgIC8vIDQtYnl0ZSAqIDI1Ni1lbnRyeSA9ICAtYnl0ZQotI2RlZmluZSBIV19XQ0lEX0FUVFJJX1NJWkUgICA0Ci0jZGVmaW5lIFdDSURfUkVTRVJWRUQJCQkweDZiZmMKLSNkZWZpbmUgU0hBUkVEX0tFWV9UQUJMRV9CQVNFICAgICAgIDB4NmMwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIFNIQVJFRF9LRVlfTU9ERV9CQVNFICAgICAgIDB4NzAwMCAgICAgIC8vIDMyLWJ5dGUgKiAxNi1lbnRyeSA9IDUxMi1ieXRlCi0jZGVmaW5lIEhXX1NIQVJFRF9LRVlfTU9ERV9TSVpFICAgNAotI2RlZmluZSBTSEFSRURLRVlUQUJMRQkJCTAKLSNkZWZpbmUgUEFJUldJU0VLRVlUQUJMRQkJCTEKLQotCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglfU0hBUkVES0VZX01PREVfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlTSEFSRURLRVlfTU9ERV9TVFJVQywgKlBTSEFSRURLRVlfTU9ERV9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9TSEFSRURLRVlfTU9ERV9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczBLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkwQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkxQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkyQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQkJVUlOVDMyICAgICAgIEJzczFLZXkzQ2lwaGVyQWxnOjM7Ci0JCVVJTlQzMiAgICAgICA6MTsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNIQVJFREtFWV9NT0RFX1NUUlVDLCAqUFNIQVJFREtFWV9NT0RFX1NUUlVDOwotI2VuZGlmCi0vLyA2NC1lbnRyeSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi10eXBlZGVmIHN0cnVjdCBfSFdfV0NJRF9FTlRSWSB7ICAvLyA4LWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBBZGRyZXNzWzZdOwotICAgIFVDSEFSICAgUnN2WzJdOwotfSBIV19XQ0lEX0VOVFJZLCBQSFdfV0NJRF9FTlRSWTsKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdDSUQgIGZvcm1hdAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLzcuMQlXQ0lEICBFTlRSWSAgZm9ybWF0ICA6IDhieXRlcwotdHlwZWRlZglzdHJ1Y3QJX1dDSURfRU5UUllfU1RSVUMgewotCVVDSEFSCQlSWEJBQml0bWFwNzsgICAgLy8gYml0MCBmb3IgVElEOCwgYml0NyBmb3IgVElEIDE1Ci0JVUNIQVIJCVJYQkFCaXRtYXAwOyAgICAvLyBiaXQwIGZvciBUSUQwLCBiaXQ3IGZvciBUSUQgNwotCVVDSEFSCQlNQUNbNl07CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLX0JV0NJRF9FTlRSWV9TVFJVQywgKlBXQ0lEX0VOVFJZX1NUUlVDOwotCi0vLzguMS4xCVNFQ1VSSVRZICBLRVkgIGZvcm1hdCAgOiA4RFcKLS8vIDMyLWJ5dGUgcGVyIGVudHJ5LCB0b3RhbCAxNi1lbnRyeSBmb3Igc2hhcmVkIGtleSB0YWJsZSwgNjQtZW50cnkgZm9yIHBhaXJ3aXNlIGtleSB0YWJsZQotdHlwZWRlZiBzdHJ1Y3QgX0hXX0tFWV9FTlRSWSB7ICAgICAgICAgIC8vIDMyLWJ5dGUgcGVyIGVudHJ5Ci0gICAgVUNIQVIgICBLZXlbMTZdOwotICAgIFVDSEFSICAgVHhNaWNbOF07Ci0gICAgVUNIQVIgICBSeE1pY1s4XTsKLX0gSFdfS0VZX0VOVFJZLCAqUEhXX0tFWV9FTlRSWTsKLQotLy84LjEuMglJVi9FSVYgIGZvcm1hdCAgOiAyRFcKLQotLy84LjEuMwlSWCBhdHRyaWJ1dGUgZW50cnkgZm9ybWF0ICA6IDFEVwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCXJzdjoyMjsKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCUJTU0lESWR4OjM7IC8vbXVsdGlwbGVCU1MgaW5kZXggZm9yIHRoZSBXQ0lECi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJS2V5VGFiOjE7CS8vIDAgZm9yIHNoYXJlZCBrZXkgdGFibGUuICAxIGZvciBwYWlyd2lzZSBrZXkgdGFibGUKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJc3RydWN0CV9NQUNfQVRUUklCVVRFX1NUUlVDIHsKLQlVSU5UMzIJCUtleVRhYjoxOwkvLyAwIGZvciBzaGFyZWQga2V5IHRhYmxlLiAgMSBmb3IgcGFpcndpc2Uga2V5IHRhYmxlCi0JVUlOVDMyCQlQYWlyS2V5TW9kZTozOwotCVVJTlQzMgkJQlNTSURJZHg6MzsgLy9tdWx0aXBsZUJTUyBpbmRleCBmb3IgdGhlIFdDSUQKLQlVSU5UMzIJCVJYV0lVREY6MzsKLQlVSU5UMzIJCXJzdjoyMjsKLX0JTUFDX0FUVFJJQlVURV9TVFJVQywgKlBNQUNfQVRUUklCVVRFX1NUUlVDOwotI2VuZGlmCi0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBIT1NULU1DVSBjb21tdW5pY2F0aW9uIGRhdGEgc3RydWN0dXJlCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8KLS8vIEgyTV9NQUlMQk9YX0NTUjogSG9zdC10by1NQ1UgTWFpbGJveAotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmIHVuaW9uICBfSDJNX01BSUxCT1hfU1RSVUMgewotICAgIHN0cnVjdCB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBPd25lcjo4OwotICAgICAgICBVSU5UMzIgICAgICAgQ21kVG9rZW46ODsgICAgLy8gMHhmZiB0ZWxscyBNQ1Ugbm90IHRvIHJlcG9ydCBDbWREb25lSW50IGFmdGVyIGV4Y3V0aW5nIHRoZSBjb21tYW5kCi0gICAgICAgIFVJTlQzMiAgICAgICBIaWdoQnl0ZTo4OwotICAgICAgICBVSU5UMzIgICAgICAgTG93Qnl0ZTo4OwotICAgIH0gICBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IEgyTV9NQUlMQk9YX1NUUlVDLCAqUEgyTV9NQUlMQk9YX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYgdW5pb24gIF9IMk1fTUFJTEJPWF9TVFJVQyB7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgVUlOVDMyICAgICAgIExvd0J5dGU6ODsKLSAgICAgICAgVUlOVDMyICAgICAgIEhpZ2hCeXRlOjg7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjo4OwotICAgICAgICBVSU5UMzIgICAgICAgT3duZXI6ODsKLSAgICB9ICAgZmllbGQ7Ci0gICAgVUlOVDMyICAgICAgICAgICB3b3JkOwotfSBIMk1fTUFJTEJPWF9TVFJVQywgKlBIMk1fTUFJTEJPWF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gTTJIX0NNRF9ET05FX0NTUjogTUNVLXRvLUhvc3QgY29tbWFuZCBjb21wbGV0ZSBpbmRpY2F0aW9uCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYgdW5pb24gX00ySF9DTURfRE9ORV9TVFJVQyB7Ci0gICAgc3RydWN0ICB7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjM7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjI7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjE7Ci0gICAgICAgIFVJTlQzMiAgICAgICBDbWRUb2tlbjA7Ci0gICAgfSBmaWVsZDsKLSAgICBVSU5UMzIgICAgICAgICAgIHdvcmQ7Ci19IE0ySF9DTURfRE9ORV9TVFJVQywgKlBNMkhfQ01EX0RPTkVfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZiB1bmlvbiBfTTJIX0NNRF9ET05FX1NUUlVDIHsKLSAgICBzdHJ1Y3QgIHsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMDsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMTsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMjsKLSAgICAgICAgVUlOVDMyICAgICAgIENtZFRva2VuMzsKLSAgICB9IGZpZWxkOwotICAgIFVJTlQzMiAgICAgICAgICAgd29yZDsKLX0gTTJIX0NNRF9ET05FX1NUUlVDLCAqUE0ySF9DTURfRE9ORV9TVFJVQzsKLSNlbmRpZgotCi0KLS8vTkFWX1RJTUVfQ0ZHIDpOQVYKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9OQVZfVElNRV9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVTSE9SVAkJcnN2OjY7Ci0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlOQVZfVElNRV9DRkdfU1RSVUMsICpQTkFWX1RJTUVfQ0ZHX1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX05BVl9USU1FX0NGR19TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCVNpZnM7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVDSEFSICAgICAgIFNsb3RUaW1lOyAgICAvLyBpbiB1bml0IG9mIDEtdXMKLQkJVVNIT1JUCQlFaWZzOjk7ICAgICAgICAgICAgICAgLy8gaW4gdW5pdCBvZiAxLXVzCi0JCVVTSE9SVAkJWmVyb1NpZnM6MTsgICAgICAgICAgICAgICAvLyBBcHBsaWVkIHplcm8gU0lGUyB0aW1lciBhZnRlciBPRkRNIFJYIDA6IGRpc2FibGUKLQkJVVNIT1JUCQlyc3Y6NjsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CU5BVl9USU1FX0NGR19TVFJVQywgKlBOQVZfVElNRV9DRkdfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gUlhfRklMVFJfQ0ZHOiAgL1JYIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKLS8vCi0jaWZkZWYgUlRfQklHX0VORElBTgotdHlwZWRlZgl1bmlvbglSWF9GSUxUUl9DRkdfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJOjE1OwotCQlVSU5UMzIgICAgICAgRHJvcFJzdkNudGxUeXBlOjE7Ci0KLQkJVUlOVDMyCQlEcm9wQkFSOjE7ICAgICAgIC8vCi0JCVVJTlQzMgkJRHJvcEJBOjE7CQkvLwotCQlVSU5UMzIJCURyb3BQc1BvbGw6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BSdHM6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcENGRW5kOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCi0JCVVJTlQzMgkJRHJvcER1cGxpY2F0ZToxOwkJLy8gRHJvcCBkdXBsaWNhdGUgZnJhbWUKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BNY2FzdDoxOwkJLy8gRHJvcCBtdWx0aWNhc3QgZnJhbWVzCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wTm90TXlCU1NJRDoxOwkJCS8vIERyb3AgZnJhbSBUb0RzIGJpdCBpcyB0cnVlCi0JCVVJTlQzMgkJRHJvcE5vdFRvTWU6MTsJCS8vIERyb3Agbm90IHRvIG1lIHVuaWNhc3QgZnJhbWUKLQkJVUlOVDMyCQlEcm9wUGh5RXJyOjE7CQkvLyBEcm9wIHBoeXNpY2FsIGVycm9yCi0JCVVJTlQzMgkJRHJvcENSQ0VycjoxOwkJLy8gRHJvcCBDUkMgZXJyb3IKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVJYX0ZJTFRSX0NGR19TVFJVQywgKlBSWF9GSUxUUl9DRkdfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUlhfRklMVFJfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCURyb3BDUkNFcnI6MTsJCS8vIERyb3AgQ1JDIGVycm9yCi0JCVVJTlQzMgkJRHJvcFBoeUVycjoxOwkJLy8gRHJvcCBwaHlzaWNhbCBlcnJvcgotCQlVSU5UMzIJCURyb3BOb3RUb01lOjE7CQkvLyBEcm9wIG5vdCB0byBtZSB1bmljYXN0IGZyYW1lCi0JCVVJTlQzMgkJRHJvcE5vdE15QlNTSUQ6MTsJCQkvLyBEcm9wIGZyYW0gVG9EcyBiaXQgaXMgdHJ1ZQotCi0JCVVJTlQzMgkJRHJvcFZlckVycjoxOwkgICAgLy8gRHJvcCB2ZXJzaW9uIGVycm9yIGZyYW1lCi0JCVVJTlQzMgkJRHJvcE1jYXN0OjE7CQkvLyBEcm9wIG11bHRpY2FzdCBmcmFtZXMKLQkJVUlOVDMyCQlEcm9wQmNhc3Q6MTsJCS8vIERyb3AgYnJvYWRjYXN0IGZyYW1lcwotCQlVSU5UMzIJCURyb3BEdXBsaWNhdGU6MTsJCS8vIERyb3AgZHVwbGljYXRlIGZyYW1lCi0KLQkJVUlOVDMyCQlEcm9wQ0ZFbmRBY2s6MTsJCS8vIERyb3AgUHMtUG9sbAotCQlVSU5UMzIJCURyb3BDRkVuZDoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEFjazoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0JCVVJTlQzMgkJRHJvcEN0czoxOwkJLy8gRHJvcCBQcy1Qb2xsCi0KLQkJVUlOVDMyCQlEcm9wUnRzOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wUHNQb2xsOjE7CQkvLyBEcm9wIFBzLVBvbGwKLQkJVUlOVDMyCQlEcm9wQkE6MTsJCS8vCi0JCVVJTlQzMgkJRHJvcEJBUjoxOyAgICAgICAvLwotCi0JCVVJTlQzMgkJRHJvcFJzdkNudGxUeXBlOjE7Ci0JCVVJTlQzMgkJOjE1OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUlhfRklMVFJfQ0ZHX1NUUlVDLCAqUFJYX0ZJTFRSX0NGR19TVFJVQzsKLSNlbmRpZgotCi0KLQotCi0vLwotLy8gUEhZX0NTUjQ6IFJGIHNlcmlhbCBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1BIWV9DU1I0X1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCUJ1c3k6MTsJCQkJLy8gMTogQVNJQyBpcyBidXN5IGV4ZWN1dGUgUkYgcHJvZ3JhbW1pbmcuCi0JCVVJTlQzMgkJUExMX0xEOjE7CQkJLy8gUkYgUExMX0xEIHN0YXR1cwotCQlVSU5UMzIJCUlGU2VsZWN0OjE7CQkJLy8gMTogc2VsZWN0IElGCXRvIHByb2dyYW0sCTA6IHNlbGVjdCBSRiB0bwlwcm9ncmFtCi0JCVVJTlQzMgkJTnVtYmVyT2ZCaXRzOjU7CQkvLyBOdW1iZXIgb2YgYml0cyB1c2VkIGluIFJGUmVnVmFsdWUgKEk6MjAsCVJGTUQ6MjIpCi0JCVVJTlQzMgkJUkZSZWdWYWx1ZToyNDsJCS8vIFJlZ2lzdGVyCXZhbHVlIChpbmNsdWRlIHJlZ2lzdGVyCWlkKQlzZXJpYWwgb3V0IHRvIFJGL0lGCWNoaXAuCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlQSFlfQ1NSNF9TVFJVQywgKlBQSFlfQ1NSNF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9QSFlfQ1NSNF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUlOVDMyCQlSRlJlZ1ZhbHVlOjI0OwkJLy8gUmVnaXN0ZXIJdmFsdWUgKGluY2x1ZGUgcmVnaXN0ZXIJaWQpCXNlcmlhbCBvdXQgdG8gUkYvSUYJY2hpcC4KLQkJVUlOVDMyCQlOdW1iZXJPZkJpdHM6NTsJCS8vIE51bWJlciBvZiBiaXRzIHVzZWQgaW4gUkZSZWdWYWx1ZSAoSToyMCwJUkZNRDoyMikKLQkJVUlOVDMyCQlJRlNlbGVjdDoxOwkJCS8vIDE6IHNlbGVjdCBJRgl0byBwcm9ncmFtLAkwOiBzZWxlY3QgUkYgdG8JcHJvZ3JhbQotCQlVSU5UMzIJCVBMTF9MRDoxOwkJCS8vIFJGIFBMTF9MRCBzdGF0dXMKLQkJVUlOVDMyCQlCdXN5OjE7CQkJCS8vIDE6IEFTSUMgaXMgYnVzeSBleGVjdXRlIFJGIHByb2dyYW1taW5nLgotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUEhZX0NTUjRfU1RSVUMsICpQUEhZX0NTUjRfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gU0VDX0NTUjU6IHNoYXJlZCBrZXkgdGFibGUgc2VjdXJpdHkgbW9kZSByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9TRUNfQ1NSNV9TVFJVQwl7Ci0Jc3RydWN0CXsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CVNFQ19DU1I1X1NUUlVDLCAqUFNFQ19DU1I1X1NUUlVDOwotI2Vsc2UKLXR5cGVkZWYJdW5pb24JX1NFQ19DU1I1X1NUUlVDCXsKLQlzdHJ1Y3QJewotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzMktleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTBDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTFDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTJDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotICAgICAgICBVSU5UMzIgICAgICAgQnNzM0tleTNDaXBoZXJBbGc6MzsKLSAgICAgICAgVUlOVDMyICAgICAgIDoxOwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JU0VDX0NTUjVfU1RSVUMsICpQU0VDX0NTUjVfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gSE9TVF9DTURfQ1NSOiBGb3IgSE9TVCB0byBpbnRlcnJ1cHQgZW1iZWRkZWQgcHJvY2Vzc29yCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0hPU1RfQ01EX0NTUl9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkgICAgVUlOVDMyICAgUnN2OjI0OwotCSAgICBVSU5UMzIgICBIb3N0Q29tbWFuZDo4OwotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JSE9TVF9DTURfQ1NSX1NUUlVDLCAqUEhPU1RfQ01EX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9IT1NUX0NNRF9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JICAgIFVJTlQzMiAgIEhvc3RDb21tYW5kOjg7Ci0JICAgIFVJTlQzMiAgIFJzdjoyNDsKLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUhPU1RfQ01EX0NTUl9TVFJVQywgKlBIT1NUX0NNRF9DU1JfU1RSVUM7Ci0jZW5kaWYKLQotCi0vLwotLy8gQUlGU05fQ1NSOiBBSUZTTiBmb3IgZWFjaCBFRENBIEFDCi0vLwotCi0KLQotLy8KLS8vIEUyUFJPTV9DU1I6IEVFUFJPTSBjb250cm9sIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX0UyUFJPTV9DU1JfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVJTlQzMgkJUnN2ZDoyNTsKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVR5cGU6MTsJCQkvLyAxOiA5M0M0NiwgMDo5M0M2NgotCQlVSU5UMzIJCUVlcHJvbURPOjE7Ci0JCVVJTlQzMgkJRWVwcm9tREk6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbVNLOjE7Ci0JCVVJTlQzMgkJUmVsb2FkOjE7CQkvLyBSZWxvYWQgRUVQUk9NIGNvbnRlbnQsIHdyaXRlIG9uZSB0byByZWxvYWQsIHNlbGYtY2xlYXJlZC4KLQl9CWZpZWxkOwotCVVJTlQzMgkJCXdvcmQ7Ci19CUUyUFJPTV9DU1JfU1RSVUMsICpQRTJQUk9NX0NTUl9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9FMlBST01fQ1NSX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UMzIJCVJlbG9hZDoxOwkJLy8gUmVsb2FkIEVFUFJPTSBjb250ZW50LCB3cml0ZSBvbmUgdG8gcmVsb2FkLCBzZWxmLWNsZWFyZWQuCi0JCVVJTlQzMgkJRWVwcm9tU0s6MTsKLQkJVUlOVDMyCQlFZXByb21DUzoxOwotCQlVSU5UMzIJCUVlcHJvbURJOjE7Ci0JCVVJTlQzMgkJRWVwcm9tRE86MTsKLQkJVUlOVDMyCQlUeXBlOjE7CQkJLy8gMTogOTNDNDYsIDA6OTNDNjYKLQkJVUlOVDMyICAgICAgIExvYWRTdGF0dXM6MTsgICAvLyAxOmxvYWRpbmcsIDA6ZG9uZQotCQlVSU5UMzIJCVJzdmQ6MjU7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlFMlBST01fQ1NSX1NUUlVDLCAqUEUyUFJPTV9DU1JfU1RSVUM7Ci0jZW5kaWYKLQotLy8KLS8vIFFPU19DU1IwOiBUWE9QIGhvbGRlciBhZGRyZXNzMCByZWdpc3RlcgotLy8KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JCVVDSEFSCQlCeXRlMjsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMgotCQlVQ0hBUgkJQnl0ZTE7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDEKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9RT1NfQ1NSMF9TVFJVQwl7Ci0Jc3RydWN0CXsKLQkJVUNIQVIJCUJ5dGUwOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAwCi0JCVVDSEFSCQlCeXRlMTsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgMQotCQlVQ0hBUgkJQnl0ZTI7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDIKLQkJVUNIQVIJCUJ5dGUzOwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSAzCi0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMF9TVFJVQywgKlBRT1NfQ1NSMF9TVFJVQzsKLSNlbmRpZgotCi0vLwotLy8gUU9TX0NTUjE6IFRYT1AgaG9sZGVyIGFkZHJlc3MxIHJlZ2lzdGVyCi0vLwotI2lmZGVmIFJUX0JJR19FTkRJQU4KLXR5cGVkZWYJdW5pb24JX1FPU19DU1IxX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVQ0hBUgkJUnN2ZDE7Ci0JCVVDSEFSCQlSc3ZkMDsKLQkJVUNIQVIJCUJ5dGU1OwkJLy8gTUFDIGFkZHJlc3MgYnl0ZSA1Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCX0JZmllbGQ7Ci0JVUlOVDMyCQkJd29yZDsKLX0JUU9TX0NTUjFfU1RSVUMsICpQUU9TX0NTUjFfU1RSVUM7Ci0jZWxzZQotdHlwZWRlZgl1bmlvbglfUU9TX0NTUjFfU1RSVUMJewotCXN0cnVjdAl7Ci0JCVVDSEFSCQlCeXRlNDsJCS8vIE1BQyBhZGRyZXNzIGJ5dGUgNAotCQlVQ0hBUgkJQnl0ZTU7CQkvLyBNQUMgYWRkcmVzcyBieXRlIDUKLQkJVUNIQVIJCVJzdmQwOwotCQlVQ0hBUgkJUnN2ZDE7Ci0JfQlmaWVsZDsKLQlVSU5UMzIJCQl3b3JkOwotfQlRT1NfQ1NSMV9TVFJVQywgKlBRT1NfQ1NSMV9TVFJVQzsKLSNlbmRpZgotCi0jZGVmaW5lCVJGX0NTUl9DRkcJMHg1MDAKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UCVJzdmQxOjE0OwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCi0JCVVJTlQJUkZfQ1NSX1dSOjE7CQkJLy8gMDogcmVhZCAgMTogd3JpdGUKLQkJVUlOVAlSc3ZkMjozOwkJCQkvLyBSZXNlcnZlZAotCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECi0JCVVJTlQJUkZfQ1NSX0RBVEE6ODsJCQkvLyBEQVRBCi0JfQlmaWVsZDsKLQlVSU5UCXdvcmQ7Ci19CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKLSNlbHNlCi10eXBlZGVmCXVuaW9uCV9SRl9DU1JfQ0ZHX1NUUlVDCXsKLQlzdHJ1Y3QJewotCQlVSU5UCVJGX0NTUl9EQVRBOjg7CQkJLy8gREFUQQotCQlVSU5UCVRFU1RDU1JfUkZBQ0NfUkVHTlVNOjU7CS8vIFJGIHJlZ2lzdGVyIElECi0JCVVJTlQJUnN2ZDI6MzsJCQkJLy8gUmVzZXJ2ZWQKLQkJVUlOVAlSRl9DU1JfV1I6MTsJCQkvLyAwOiByZWFkICAxOiB3cml0ZQotCQlVSU5UCVJGX0NTUl9LSUNLOjE7CQkJLy8ga2ljayBSRiByZWdpc3RlciByZWFkL3dyaXRlCi0JCVVJTlQJUnN2ZDE6MTQ7CQkJCS8vIFJlc2VydmVkCi0JfQlmaWVsZDsKLQlVSU5UCXdvcmQ7Ci19CVJGX0NTUl9DRkdfU1RSVUMsICpQUkZfQ1NSX0NGR19TVFJVQzsKLSNlbmRpZgotCi0KLS8vCi0vLyBPdGhlciBvbi1jaGlwIHNoYXJlZCBtZW1vcnkgc3BhY2UsIGJhc2UgPSAweDIwMDAKLS8vCi0KLS8vIENJUyBzcGFjZSAtIGJhc2UgYWRkcmVzcyA9IDB4MjAwMAotI2RlZmluZSBIV19DSVNfQkFTRSAgICAgICAgICAgICAweDIwMDAKLQotLy8gQ2Fycmllci1zZW5zZSBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgY2Fycmllci1zZW5zZSBmcmFtZSBmb3IgY2Fycmllci1zZW5zZSBmdW5jdGlvbi4KLSNkZWZpbmUgSFdfQ1NfQ1RTX0JBU0UJCQkweDc3MDAKLS8vIERGUyBDVFMgZnJhbWUgYmFzZSBhZGRyZXNzLiBJdCdzIHdoZXJlIG1hYyBzdG9yZXMgQ1RTIGZyYW1lIGZvciBERlMuCi0jZGVmaW5lIEhXX0RGU19DVFNfQkFTRQkJCTB4Nzc4MAotI2RlZmluZSBIV19DVFNfRlJBTUVfU0laRQkJMHg4MAotCi0vLyAyMDA0LTExLTA4IGpvaG4gLSBzaW5jZSBOVUxMIGZyYW1lIHdvbid0IGJlIHRoYXQgbG9uZyAoMjU2IGJ5dGUpLiBXZSBzdGVhbCAxNiB0YWlsIGJ5dGVzCi0vLyB0byBzYXZlIGRlYnVnZ2luZyBzZXR0aW5ncwotI2RlZmluZSBIV19ERUJVR19TRVRUSU5HX0JBU0UgICAweDc3ZjAgIC8vIDB4NzdmMH4weDc3ZmYgdG90YWwgMTYgYnl0ZXMKLSNkZWZpbmUgSFdfREVCVUdfU0VUVElOR19CQVNFMiAgIDB4Nzc3MCAgLy8gMHg3N2YwfjB4NzdmZiB0b3RhbCAxNiBieXRlcwotCi0vLyBJbiBvcmRlciB0byBzdXBwb3J0IG1heGltdW0gOCBNQlNTIGFuZCBpdHMgbWF4aW11bSBsZW5ndGggaXMgNTEyIGZvciBlYWNoIGJlYWNvbgotLy8gVGhyZWUgc2VjdGlvbiBkaXNjb250aW51ZSBtZW1vcnkgc2VnbWVudHMgd2lsbCBiZSB1c2VkLgotLy8gMS4gVGhlIG9yaWdpbmFsIHJlZ2lvbiBmb3IgQkNOIDB+MwotLy8gMi4gRXh0cmFjdCBtZW1vcnkgZnJvbSBGQ0UgdGFibGUgZm9yIEJDTiA0fjUKLS8vIDMuIEV4dHJhY3QgbWVtb3J5IGZyb20gUGFpci13aXNlIGtleSB0YWJsZSBmb3IgQkNOIDZ+NwotLy8JICBJdCBvY2N1cGllZCB0aG9zZSBtZW1vcnkgb2Ygd2NpZCAyMzh+MjUzIGZvciBCQ04gNgotLy8JCQkJCQkgICAgICBhbmQgd2NpZCAyMjJ+MjM3IGZvciBCQ04gNwotI2RlZmluZSBIV19CRUFDT05fTUFYX1NJWkUgICAgICAweDEwMDAgLyogdW5pdDogYnl0ZSAqLwotI2RlZmluZSBIV19CRUFDT05fQkFTRTAgICAgICAgICAweDc4MDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0UxICAgICAgICAgMHg3QTAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFMiAgICAgICAgIDB4N0MwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTMgICAgICAgICAweDdFMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U0ICAgICAgICAgMHg3MjAwCi0jZGVmaW5lIEhXX0JFQUNPTl9CQVNFNSAgICAgICAgIDB4NzQwMAotI2RlZmluZSBIV19CRUFDT05fQkFTRTYgICAgICAgICAweDVEQzAKLSNkZWZpbmUgSFdfQkVBQ09OX0JBU0U3ICAgICAgICAgMHg1QkMwCi0KLSNkZWZpbmUgSFdfQkVBQ09OX01BWF9DT1VOVCAgICAgOAotI2RlZmluZSBIV19CRUFDT05fT0ZGU0VUCQkweDAyMDAKLSNkZWZpbmUgSFdfQkVBQ09OX0NPTlRFTlRfTEVOCShIV19CRUFDT05fT0ZGU0VUIC0gVFhXSV9TSVpFKQotCi0vLyBIT1NULU1DVSBzaGFyZWQgbWVtb3J5IC0gYmFzZSBhZGRyZXNzID0gMHgyMTAwCi0jZGVmaW5lIEhPU1RfQ01EX0NTUgkJMHg0MDQKLSNkZWZpbmUgSDJNX01BSUxCT1hfQ1NSICAgICAgICAgMHg3MDEwCi0jZGVmaW5lIEgyTV9NQUlMQk9YX0NJRCAgICAgICAgIDB4NzAxNAotI2RlZmluZSBIMk1fTUFJTEJPWF9TVEFUVVMgICAgICAweDcwMWMKLSNkZWZpbmUgSDJNX0lOVF9TUkMgICAgICAgICAgICAgMHg3MDI0Ci0jZGVmaW5lIEgyTV9CQlBfQUdFTlQgICAgICAgICAgIDB4NzAyOAotI2RlZmluZSBNMkhfQ01EX0RPTkVfQ1NSICAgICAgICAweDAwMGMKLSNkZWZpbmUgTUNVX1RYT1BfQVJSQVlfQkFTRSAgICAgMHgwMDBjICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0jZGVmaW5lIE1DVV9UWE9QX0VOVFJZX1NJWkUgICAgIDMyICAgICAgIC8vIFRPRE86IHRvIGJlIHByb3ZpZGVkIGJ5IEFsYmVydAotI2RlZmluZSBNQVhfTlVNX09GX1RYT1BfRU5UUlkgICAxNiAgICAgICAvLyBUT0RPOiBtdXN0IGJlIHNhbWUgd2l0aCA4MDUxIGZpcm13YXJlCi0jZGVmaW5lIE1DVV9NQk9YX1ZFUlNJT04gICAgICAgIDB4MDEgICAgIC8vIFRPRE86IHRvIGJlIGNvbmZpcm1lZCBieSBBbGJlcnQKLSNkZWZpbmUgTUNVX01CT1hfVkVSU0lPTl9PRkZTRVQgNSAgICAgICAgLy8gVE9ETzogdG8gYmUgcHJvdmlkZWQgYnkgQWxiZXJ0Ci0KLS8vCi0vLyBIb3N0IERNQSByZWdpc3RlcnMgLSBiYXNlIGFkZHJlc3MgMHgyMDAgLiAgVFgwLTM9RURDQVFpZDAtMywgVFg0PUhDQ0EsIFRYNT1NR01ULAotLy8KLS8vCi0vLyAgRE1BIFJJTkcgREVTQ1JJUFRPUgotLy8KLSNkZWZpbmUgRTJQUk9NX0NTUiAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU9fQ05UTF9DU1IgICAgICAgICAweDc3ZDAKLQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFR4IC8JUnggLyBNZ210IHJpbmcgZGVzY3JpcHRvciBkZWZpbml0aW9uCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIHRoZSBmb2xsb3dpbmcgUElEIHZhbHVlcyBhcmUgdXNlZCB0byBtYXJrIG91dGdvaW5nIGZyYW1lIHR5cGUgaW4gVFhELT5QSUQgc28gdGhhdAotLy8gcHJvcGVyIFRYIHN0YXRpc3RpY3MgY2FuIGJlIGNvbGxlY3RlZCBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzCi0vLyBiMy0yIG9mIFBJRCBmaWVsZCAtCi0jZGVmaW5lIFBJRF9NR01UCQkJMHgwNQotI2RlZmluZSBQSURfQkVBQ09OCQkJMHgwYwotI2RlZmluZSBQSURfREFUQV9OT1JNQUxVQ0FTVAkJMHgwMgotI2RlZmluZSBQSURfREFUQV9BTVBEVQkJMHgwNAotI2RlZmluZSBQSURfREFUQV9OT19BQ0sJCTB4MDgKLSNkZWZpbmUgUElEX0RBVEFfTk9UX05PUk1fQUNLCQkweDAzCi0vLyB2YWx1ZSBkb21haW4gb2YgcFR4RC0+SG9zdFFJZCAoNC1iaXQ6IDB+MTUpCi0jZGVmaW5lIFFJRF9BQ19CSyAgICAgICAgICAgICAgIDEgICAvLyBtZWV0IEFDSSBkZWZpbml0aW9uIGluIDgwMi4xMWUKLSNkZWZpbmUgUUlEX0FDX0JFICAgICAgICAgICAgICAgMCAgIC8vIG1lZXQgQUNJIGRlZmluaXRpb24gaW4gODAyLjExZQotI2RlZmluZSBRSURfQUNfVkkgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFFJRF9BQ19WTyAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgUUlEX0hDQ0EgICAgICAgICAgICAgICAgNAotLy8jZGVmaW5lIE5VTV9PRl9UWF9SSU5HICAgICAgICAgIDUKLSNkZWZpbmUgTlVNX09GX1RYX1JJTkcgICAgICAgICAgNAotI2RlZmluZSBRSURfTUdNVCAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBRSURfUlggICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBRSURfT1RIRVIgICAgICAgICAgICAgICAxNQotCi0jZW5kaWYgLy8gX19SVE1QX01BQ19IX18gLy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF90eXBlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3J0bXBfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI1NzFlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvcnRtcF90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBydG1wX3R5cGUuaAotCi0gICAgQWJzdHJhY3Q6Ci0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgIFdoZW4gICAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBOYW1lICAgICAgICBEYXRlICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGxvZ3MKLSAgICBQYXVsIExpbiAgICAxLTItMjAwNAotKi8KLQotI2lmbmRlZiBfX1JUTVBfVFlQRV9IX18KLSNkZWZpbmUgX19SVE1QX1RZUEVfSF9fCi0KLQotI2RlZmluZSBQQUNLRUQgIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQotCi0jaWZkZWYgTElOVVgKLS8vIFB1dCBwbGF0Zm9ybSBkZXBlbmRlbnQgZGVjbGFyYXRpb24gaGVyZQotLy8gRm9yIGV4YW1wbGUsIGxpbnV4IHR5cGUgZGVmaW5pdGlvbgotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQkJVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0CQkJVUlOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQJCQlVSU5UMzI7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwkJVUlOVDY0OwotdHlwZWRlZiBpbnQJCQkJCUlOVDMyOwotdHlwZWRlZiBsb25nIGxvbmcJCQkJSU5UNjQ7Ci0jZW5kaWYgLy8gTElOVVggLy8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICoJCVBVSU5UODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgKgkJUFVJTlQxNjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICoJCQlQVUlOVDMyOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgKglQVUlOVDY0OwotdHlwZWRlZiBpbnQJKgkJCQlQSU5UMzI7Ci10eXBlZGVmIGxvbmcgbG9uZyAqCQkJUElOVDY0OwotCi0vLyBtb2RpZmllZCBmb3IgZml4aW5nIGNvbXBpbGUgd2FybmluZyBvbiBTaWdtYSA4NjM0IHBsYXRmb3JtCi10eXBlZGVmIGNoYXIJCQkJCVNUUklORzsKLXR5cGVkZWYgc2lnbmVkIGNoYXIJCQlDSEFSOwotCi10eXBlZGVmIHNpZ25lZCBzaG9ydAkJCVNIT1JUOwotdHlwZWRlZiBzaWduZWQgaW50CQkJCUlOVDsKLXR5cGVkZWYgc2lnbmVkIGxvbmcJCQlMT05HOwotdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nCQlMT05HTE9ORzsKLQotCi0jaWZkZWYgTElOVVgKLXR5cGVkZWYgdW5zaWduZWQgY2hhcgkJCVVDSEFSOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCVVTSE9SVDsKLXR5cGVkZWYgdW5zaWduZWQgaW50CQkJVUlOVDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwkJCVVMT05HOwotI2VuZGlmIC8vIExJTlVYIC8vCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZwkJVUxPTkdMT05HOwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlCT09MRUFOOwotI2lmZGVmIExJTlVYCi10eXBlZGVmIHZvaWQJCQkJCVZPSUQ7Ci0jZW5kaWYgLy8gTElOVVggLy8KLQotdHlwZWRlZiBjaGFyICoJCQkJUFNUUklORzsKLXR5cGVkZWYgVk9JRCAqCQkJCVBWT0lEOwotdHlwZWRlZiBDSEFSICoJCQkJUENIQVI7Ci10eXBlZGVmIFVDSEFSICoJCQkJCVBVQ0hBUjsKLXR5cGVkZWYgVVNIT1JUICoJCQlQVVNIT1JUOwotdHlwZWRlZiBMT05HICoJCQkJUExPTkc7Ci10eXBlZGVmIFVMT05HICoJCQkJUFVMT05HOwotdHlwZWRlZiBVSU5UICoJCQkJUFVJTlQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50CQkJTkRJU19NRURJQV9TVEFURTsKLQotdHlwZWRlZiB1bmlvbiBfTEFSR0VfSU5URUdFUiB7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgVUlOVCBMb3dQYXJ0OwotICAgICAgICBJTlQzMiBIaWdoUGFydDsKLSAgICB9IHU7Ci0gICAgSU5UNjQgUXVhZFBhcnQ7Ci19IExBUkdFX0lOVEVHRVI7Ci0KLQotLy8KLS8vIFJlZ2lzdGVyIHNldCBwYWlyIGZvciBpbml0aWFsemF0aW9uIHJlZ2lzdGVyIHNldCBkZWZpbml0aW9uCi0vLwotdHlwZWRlZiBzdHJ1Y3QgIF9SVE1QX1JFR19QQUlSCi17Ci0JVUxPTkcgICBSZWdpc3RlcjsKLQlVTE9ORyAgIFZhbHVlOwotfSBSVE1QX1JFR19QQUlSLCAqUFJUTVBfUkVHX1BBSVI7Ci0KLXR5cGVkZWYgc3RydWN0ICBfUkVHX1BBSVIKLXsKLQlVQ0hBUiAgIFJlZ2lzdGVyOwotCVVDSEFSICAgVmFsdWU7Ci19IFJFR19QQUlSLCAqUFJFR19QQUlSOwotCi0vLwotLy8gUmVnaXN0ZXIgc2V0IHBhaXIgZm9yIGluaXRpYWx6YXRpb24gcmVnaXN0ZXIgc2V0IGRlZmluaXRpb24KLS8vCi10eXBlZGVmIHN0cnVjdCAgX1JUTVBfUkZfUkVHUwotewotCVVDSEFSICAgQ2hhbm5lbDsKLQlVTE9ORyAgIFIxOwotCVVMT05HICAgUjI7Ci0JVUxPTkcgICBSMzsKLQlVTE9ORyAgIFI0OwotfSBSVE1QX1JGX1JFR1MsICpQUlRNUF9SRl9SRUdTOwotCi10eXBlZGVmIHN0cnVjdCBfRlJFUVVFTkNZX0lURU0gewotCVVDSEFSCUNoYW5uZWw7Ci0JVUNIQVIJTjsKLQlVQ0hBUglSOwotCVVDSEFSCUs7Ci19IEZSRVFVRU5DWV9JVEVNLCAqUEZSRVFVRU5DWV9JVEVNOwotCi0KLXR5cGVkZWYgaW50CQkJCU5UU1RBVFVTOwotCi0KLSNkZWZpbmUgU1RBVFVTX1NVQ0NFU1MJCQkJMHgwMAotI2RlZmluZSBTVEFUVVNfVU5TVUNDRVNTRlVMCQkweDAxCi0KLSNlbmRpZiAgLy8gX19SVE1QX1RZUEVfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3NwZWN0cnVtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3NwZWN0cnVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOWJhZTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19TUEVDVFJVTV9IX18KLSNkZWZpbmUgX19TUEVDVFJVTV9IX18KLQotI2luY2x1ZGUgInJ0bXBfdHlwZS5oIgotI2luY2x1ZGUgInNwZWN0cnVtX2RlZi5oIgotCi0KLUNIQVIgUlRNUF9HZXRUeFB3cigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBIVFRSQU5TTUlUX1NFVFRJTkcgSFRUeE1vZGUpOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb24gZnJhbWUgYW5kIGVucXVldWUgaXQgaW50bwotCQltYW5hZ2VtZW50IHF1ZXVlIHdhaXRpbmcgZm9yIHRyYW5zbWl0aW9uLgotCi0JUGFyYW1ldHJzOgotCQkxLiB0aGUgZGVzdGluYXRpb24gbWFjIGFkZHJlc3Mgb2YgdGhlIGZyYW1lLgotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1ha2VNZWFzdXJlbWVudFJlcUZyYW1lKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcE91dEJ1ZmZlciwKLQlPVVQgUFVMT05HIHBGcmFtZUxlbiwKLQlJTiBVSU5UOCBUb3RhbExlbiwKLQlJTiBVSU5UOCBDYXRlZ29yeSwKLQlJTiBVSU5UOCBBY3Rpb24sCi0JSU4gVUlOVDggTWVhc3VyZVRva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAotCUlOIFVJTlQ4IE51bU9mUmVwZXRpdGlvbnMpOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZXBhcmUgTWVhc3VyZW1lbnQgcmVwb3J0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZU1lYXN1cmVtZW50UmVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggRGlhbG9nVG9rZW4sCi0JSU4gVUlOVDggTWVhc3VyZVRva2VuLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFNb2RlLAotCUlOIFVJTlQ4IE1lYXN1cmVSZXFUeXBlLAotCUlOIFVJTlQ4IFJlcG9ydEluZm9MZW4sCi0JSU4gUFVJTlQ4IHBSZXBvcnRJbmZvKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIFRQQyBSZXF1ZXN0IGFjdGlvbiBmcmFtZSBhbmQgZW5xdWV1ZSBpdCBpbnRvCi0JCW1hbmFnZW1lbnQgcXVldWUgd2FpdGluZyBmb3IgdHJhbnNtaXRpb24uCi0KLQlQYXJhbWV0cnM6Ci0JCTEuIHRoZSBkZXN0aW5hdGlvbiBtYWMgYWRkcmVzcyBvZiB0aGUgZnJhbWUuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVRQQ1JlcSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcERBLAotCUlOIFVDSEFSIERpYWxvZ1Rva2VuKTsKLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlQcmVwYXJlIFRQQyBSZXBvcnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KLQkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KLQotCVBhcmFtZXRyczoKLQkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KLQotCVJldHVybgk6IE5vbmUuCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBFbnF1ZXVlVFBDUmVwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwREEsCi0JSU4gVUlOVDggRGlhbG9nVG9rZW4sCi0JSU4gVUlOVDggVHhQd3IsCi0JSU4gVUlOVDggTGlua01hcmdpbik7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJUHJlcGFyZSBDaGFubmVsIFN3aXRjaCBBbm5vdW5jZW1lbnQgYWN0aW9uIGZyYW1lIGFuZCBlbnF1ZXVlIGl0IGludG8KLQkJbWFuYWdlbWVudCBxdWV1ZSB3YWl0aW5nIGZvciB0cmFuc21pdGlvbi4KLQotCVBhcmFtZXRyczoKLQkJMS4gdGhlIGRlc3RpbmF0aW9uIG1hYyBhZGRyZXNzIG9mIHRoZSBmcmFtZS4KLQkJMi4gQ2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IG1vZGUuCi0JCTIuIGEgTmV3IHNlbGVjdGVkIGNoYW5uZWwuCi0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZUNoU3dBbm4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSIHBEQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBOZXdDaCk7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU3BlY3RydW4gYWN0aW9uIGZyYW1lcyBIYW5kbGVyIHN1Y2ggYXMgY2hhbm5lbCBzd2l0Y2ggYW5ub3VjZW1lbnQsCi0JCW1lYXN1cmVtZW50IHJlcG9ydCwgbWVhc3VyZW1lbnQgcmVxdWVzdCBhY3Rpb25zIGZyYW1lcy4KLQotCVBhcmFtZXRyczoKLQkJRWxtZSAtIE1MTUUgbWVzc2FnZSBjb250YWluaW5nIHRoZSByZWNlaXZlZCBmcmFtZQotCi0JUmV0dXJuCTogTm9uZS4KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJTcGVjdHJ1bUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pOwotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlQYXJhbWV0cnM6Ci0KLQlSZXR1cm4JOiBOb25lLgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUlOVCBTZXRfTWVhc3VyZVJlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1RwY1JlcV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1B3ckNvbnN0cmFpbnQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLQotVk9JRCBNZWFzdXJlUmVxVGFiSW5pdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCk7Ci0KLVZPSUQgTWVhc3VyZVJlcVRhYkV4aXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpOwotCi1QTUVBU1VSRV9SRVFfRU5UUlkgTWVhc3VyZVJlcUxvb2tVcCgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKTsKLQotUE1FQVNVUkVfUkVRX0VOVFJZIE1lYXN1cmVSZXFJbnNlcnQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVUlOVDgJCQlEaWFsb2dUb2tlbik7Ci0KLVZPSUQgTWVhc3VyZVJlcURlbGV0ZSgKLQlJTiBQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiBVSU5UOAkJCURpYWxvZ1Rva2VuKTsKLQotVk9JRCBJbnNlcnRDaGFubmVsUmVwSUUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JT1VUIFBVQ0hBUiBwRnJhbWVCdWYsCi0JT1VUIFBVTE9ORyBwRnJhbWVMZW4sCi0JSU4gUFNUUklORyBwQ291bnRyeSwKLQlJTiBVSU5UOCBSZWd1bGF0b3J5Q2xhc3MpOwotCi1WT0lEIEluc2VydFRwY1JlcG9ydElFKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IFR4UHdyLAotCUlOIFVJTlQ4IExpbmtNYXJnaW4pOwotCi1WT0lEIEluc2VydERpYWxvZ1Rva2VuKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCU9VVCBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFVJTlQ4IERpYWxvZ1Rva2VuKTsKLQotVk9JRCBUcGNSZXFUYWJJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBUcGNSZXFUYWJFeGl0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKTsKLQotVk9JRCBOb3RpZnlDaFN3QW5uVG9QZWVyQVBzKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBwUkEsCi0JSU4gUFVDSEFSIHBUQSwKLQlJTiBVSU5UOCBDaFN3TW9kZSwKLQlJTiBVSU5UOCBDaGFubmVsKTsKLQotVk9JRCBSZ3VDbGFzc19CdWlsZEJjbkNoTGlzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlPVVQgUFVDSEFSIHBCdWYsCi0JT1VUCVBVTE9ORyBwQnVmTGVuKTsKLSNlbmRpZiAvLyBfX1NQRUNUUlVNX0hfXyAvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bV9kZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3BlY3RydW1fZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzODliMDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zcGVjdHJ1bV9kZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXNwZWN0cnVtX2RlZi5oCi0KLSAgICBBYnN0cmFjdDoKLSAgICBIYW5kbGUgYXNzb2NpYXRpb24gcmVsYXRlZCByZXF1ZXN0cyBlaXRoZXIgZnJvbSBXU1RBIG9yIGZyb20gbG9jYWwgTUxNRQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICAgV2hlbiAgICAgICAgICBXaGF0Ci0gICAgLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZvbmNoaSBXdSAgICAyMDA4CQkgICBjcmVhdGVkIGZvciA4MDIuMTFoCi0gKi8KLQotI2lmbmRlZiBfX1NQRUNUUlVNX0RFRl9IX18KLSNkZWZpbmUgX19TUEVDVFJVTV9ERUZfSF9fCi0KLQotI2RlZmluZSBNQVhfTUVBU1VSRV9SRVFfVEFCX1NJWkUJCTMyCi0jZGVmaW5lIE1BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFCU1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRQotCi0jZGVmaW5lIE1BWF9UUENfUkVRX1RBQl9TSVpFCQkJMzIKLSNkZWZpbmUgTUFYX0hBU0hfVFBDX1JFUV9UQUJfU0laRQkJTUFYX1RQQ19SRVFfVEFCX1NJWkUKLQotI2RlZmluZSBNSU5fUkNWX1BXUgkJCQkxMDAJCS8qIE5lZ2F0aXZlIHZhbHVlICgoZEJtKSAqLwotCi0jZGVmaW5lIFRQQ19SRVFfQUdFX09VVAkJCTUwMAkJLyogbXMgKi8KLSNkZWZpbmUgTVFfUkVRX0FHRV9PVVQJCQk1MDAJCS8qIG1zICovCi0KLSNkZWZpbmUgVFBDX0RJQUxPR1RPS0VOX0hBU0hfSU5ERVgoX0RpYWxvZ1Rva2VuKQkoKF9EaWFsb2dUb2tlbikgJSBNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFKQotI2RlZmluZSBNUV9ESUFMT0dUT0tFTl9IQVNIX0lOREVYKF9EaWFsb2dUb2tlbikJCSgoX0RpYWxvZ1Rva2VuKSAlIE1BWF9NRUFTVVJFX1JFUV9UQUJfU0laRSkKLQotdHlwZWRlZiBzdHJ1Y3QgX01FQVNVUkVfUkVRX0VOVFJZCi17Ci0Jc3RydWN0IF9NRUFTVVJFX1JFUV9FTlRSWSAqcE5leHQ7Ci0JVUxPTkcgbGFzdFRpbWU7Ci0JQk9PTEVBTglWYWxpZDsKLQlVSU5UOCBEaWFsb2dUb2tlbjsKLQlVSU5UOCBNZWFzdXJlRGlhbG9nVG9rZW5bM107CS8vIDA6YmFzaWMgbWVhc3VyZSwgMTogQ0NBIG1lYXN1cmUsIDI6IFJQSV9IaXN0b2dyYW0gbWVhc3VyZS4KLX0gTUVBU1VSRV9SRVFfRU5UUlksICpQTUVBU1VSRV9SRVFfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9NRUFTVVJFX1JFUV9UQUIKLXsKLQlVQ0hBUiBTaXplOwotCVBNRUFTVVJFX1JFUV9FTlRSWSBIYXNoW01BWF9IQVNIX01FQVNVUkVfUkVRX1RBQl9TSVpFXTsKLQlNRUFTVVJFX1JFUV9FTlRSWSBDb250ZW50W01BWF9NRUFTVVJFX1JFUV9UQUJfU0laRV07Ci19IE1FQVNVUkVfUkVRX1RBQiwgKlBNRUFTVVJFX1JFUV9UQUI7Ci0KLXR5cGVkZWYgc3RydWN0IF9UUENfUkVRX0VOVFJZCi17Ci0Jc3RydWN0IF9UUENfUkVRX0VOVFJZICpwTmV4dDsKLQlVTE9ORyBsYXN0VGltZTsKLQlCT09MRUFOIFZhbGlkOwotCVVJTlQ4IERpYWxvZ1Rva2VuOwotfSBUUENfUkVRX0VOVFJZLCAqUFRQQ19SRVFfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9UUENfUkVRX1RBQgotewotCVVDSEFSIFNpemU7Ci0JUFRQQ19SRVFfRU5UUlkgSGFzaFtNQVhfSEFTSF9UUENfUkVRX1RBQl9TSVpFXTsKLQlUUENfUkVRX0VOVFJZIENvbnRlbnRbTUFYX1RQQ19SRVFfVEFCX1NJWkVdOwotfSBUUENfUkVRX1RBQiwgKlBUUENfUkVRX1RBQjsKLQotCi0vKiBUaGUgcmVndWxhdG9yeSBpbmZvcm1hdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX0RPVDExX0NIQU5ORUxfU0VUCi17Ci0JVUNIQVIgTnVtYmVyT2ZDaGFubmVsczsKLQlVSU5UOCBNYXhUeFB3cjsKLQlVQ0hBUiBDaGFubmVsTGlzdFsxNl07Ci19IERPVDExX0NIQU5ORUxfU0VULCAqUERPVDExX0NIQU5ORUxfU0VUOwotCi10eXBlZGVmIHN0cnVjdCBfRE9UMTFfUkVHVUxBVE9SWV9JTkZPUk1BVElPTgotewotCVVDSEFSIFJlZ3VsYXRvcnlDbGFzczsKLQlET1QxMV9DSEFOTkVMX1NFVCBDaGFubmVsU2V0OwotfSBET1QxMV9SRUdVTEFUT1JZX0lORk9STUFUSU9OLCAqUERPVDExX1JFR1VMQVRPUllfSU5GT1JNQVRJT047Ci0KLQotCi0jZGVmaW5lIFJNX1RQQ19SRVEJCQkJMAotI2RlZmluZSBSTV9NRUFTVVJFX1JFUQkJCTEKLQotI2RlZmluZSBSTV9CQVNJQwkJCQkwCi0jZGVmaW5lIFJNX0NDQQkJCQkJMQotI2RlZmluZSBSTV9SUElfSElTVE9HUkFNCQkyCi0jZGVmaW5lIFJNX0NIX0xPQUQJCQkJMwotI2RlZmluZSBSTV9OT0lTRV9ISVNUT0dSQU0JCTQKLQotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1RQQ19SRVBPUlRfSU5GTwotewotCVVJTlQ4IFR4UHdyOwotCVVJTlQ4IExpbmtNYXJnaW47Ci19IFRQQ19SRVBPUlRfSU5GTywgKlBUUENfUkVQT1JUX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfQ0hfU1dfQU5OX0lORk8KLXsKLQlVSU5UOCBDaFN3TW9kZTsKLQlVSU5UOCBDaGFubmVsOwotCVVJTlQ4IENoU3dDbnQ7Ci19IENIX1NXX0FOTl9JTkZPLCAqUENIX1NXX0FOTl9JTkZPOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9SRVFfTU9ERQotewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlzdHJ1Y3QgUEFDS0VECi0JewotCi0JCVVJTlQ4IDozOwotCQlVSU5UOCBEdXJhdGlvbk1hbmRhdG9yeToxOwotCQlVSU5UOCBSZXBvcnQ6MTsKLQkJVUlOVDggUmVxdWVzdDoxOwotCQlVSU5UOCBFbmFibGU6MTsKLQkJVUlOVDggUGFyYWxsZWw6MTsKLQl9IGZpZWxkOwotI2Vsc2UKLQlzdHJ1Y3QgUEFDS0VECi0JewotCQlVSU5UOCBQYXJhbGxlbDoxOwotCQlVSU5UOCBFbmFibGU6MTsKLQkJVUlOVDggUmVxdWVzdDoxOwotCQlVSU5UOCBSZXBvcnQ6MTsKLQkJVUlOVDggRHVyYXRpb25NYW5kYXRvcnk6MTsKLQkJVUlOVDggOjM7Ci0JfSBmaWVsZDsKLSNlbmRpZiAvLyBSVF9CSUdfRU5ESUFOIC8vCi0JVUlOVDggd29yZDsKLX0gTUVBU1VSRV9SRVFfTU9ERSwgKlBNRUFTVVJFX1JFUV9NT0RFOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVRCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLX0gTUVBU1VSRV9SRVEsICpQTUVBU1VSRV9SRVE7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SRVFfSU5GTwotewotCVVJTlQ4IFRva2VuOwotCU1FQVNVUkVfUkVRX01PREUgUmVxTW9kZTsKLQlVSU5UOCBSZXFUeXBlOwotCVVJTlQ4IE9jdFswXTsKLX0gTUVBU1VSRV9SRVFfSU5GTywgKlBNRUFTVVJFX1JFUV9JTkZPOwotCi10eXBlZGVmIHVuaW9uIFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlRfTUFQCi17Ci0jaWZkZWYgUlRfQklHX0VORElBTgotCXN0cnVjdCBQQUNLRUQKLQl7Ci0JCVVJTlQ4IFJldjozOwotCi0JCVVJTlQ4IFVubWVhc3VyZToxOwotCQlVSU5UOCBSYWRhcjoxOwotCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKLQkJVUlOVDggT2ZkbVByZWFtYmxlOjE7Ci0JCVVJTlQ4IEJTUzoxOwotCX0gZmllbGQ7Ci0jZWxzZQotCXN0cnVjdCBQQUNLRUQKLQl7Ci0JCVVJTlQ4IEJTUzoxOwotCi0JCVVJTlQ4IE9mZG1QcmVhbWJsZToxOwotCQlVSU5UOCBVbmlkZW50aWZpZWRTaWduYWw6MTsKLQkJVUlOVDggUmFkYXI6MTsKLQkJVUlOVDggVW5tZWFzdXJlOjE7Ci0JCVVJTlQ4IFJldjozOwotCX0gZmllbGQ7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCVVJTlQ4IHdvcmQ7Ci19IE1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCwgKlBNRUFTVVJFX0JBU0lDX1JFUE9SVF9NQVA7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9CQVNJQ19SRVBPUlQKLXsKLQlVSU5UOCBDaE51bTsKLQlVSU5UNjQgTWVhc3VyZVN0YXJ0VGltZTsKLQlVSU5UMTYgTWVhc3VyZUR1cmF0aW9uOwotCU1FQVNVUkVfQkFTSUNfUkVQT1JUX01BUCBNYXA7Ci19IE1FQVNVUkVfQkFTSUNfUkVQT1JULCAqUE1FQVNVUkVfQkFTSUNfUkVQT1JUOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfQ0NBX1JFUE9SVAotewotCVVJTlQ4IENoTnVtOwotCVVJTlQ2NCBNZWFzdXJlU3RhcnRUaW1lOwotCVVJTlQxNiBNZWFzdXJlRHVyYXRpb247Ci0JVUlOVDggQ0NBX0J1c3lfRnJhY3Rpb247Ci19IE1FQVNVUkVfQ0NBX1JFUE9SVCwgKlBNRUFTVVJFX0NDQV9SRVBPUlQ7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfTUVBU1VSRV9SUElfUkVQT1JUCi17Ci0JVUlOVDggQ2hOdW07Ci0JVUlOVDY0IE1lYXN1cmVTdGFydFRpbWU7Ci0JVUlOVDE2IE1lYXN1cmVEdXJhdGlvbjsKLQlVSU5UOCBSUElfRGVuc2l0eVs4XTsKLX0gTUVBU1VSRV9SUElfUkVQT1JULCAqUE1FQVNVUkVfUlBJX1JFUE9SVDsKLQotdHlwZWRlZiB1bmlvbiBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX01PREUKLXsKLQlzdHJ1Y3QgUEFDS0VECi0JewotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJVUlOVDggUmV2OjU7Ci0JCVVJTlQ4IFJlZnVzZWQ6MTsKLQkJVUlOVDggSW5jYXBhYmxlOjE7Ci0JCVVJTlQ4IExhdGU6MTsKLSNlbHNlCi0JCVVJTlQ4IExhdGU6MTsKLQkJVUlOVDggSW5jYXBhYmxlOjE7Ci0JCVVJTlQ4IFJlZnVzZWQ6MTsKLQkJVUlOVDggUmV2OjU7Ci0jZW5kaWYgLy8gUlRfQklHX0VORElBTiAvLwotCX0gZmllbGQ7Ci0JVUlOVDggd29yZDsKLX0gTUVBU1VSRV9SRVBPUlRfTU9ERSwgKlBNRUFTVVJFX1JFUE9SVF9NT0RFOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX01FQVNVUkVfUkVQT1JUX0lORk8KLXsKLQlVSU5UOCBUb2tlbjsKLQlVSU5UOCBSZXBvcnRNb2RlOwotCVVJTlQ4IFJlcG9ydFR5cGU7Ci0JVUlOVDggT2N0ZWN0WzBdOwotfSBNRUFTVVJFX1JFUE9SVF9JTkZPLCAqUE1FQVNVUkVfUkVQT1JUX0lORk87Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUVVJRVRfSU5GTwotewotCVVJTlQ4IFF1aWV0Q250OwotCVVJTlQ4IFF1aWV0UGVyaW9kOwotCVVJTlQxNiBRdWlldER1cmF0aW9uOwotCVVJTlQxNiBRdWlldE9mZnNldDsKLX0gUVVJRVRfSU5GTywgKlBRVUlFVF9JTkZPOwotCi0jZW5kaWYgLy8gX19TUEVDVFJVTV9ERUZfSF9fIC8vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hc3NvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXNzb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyZWQyYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hc3NvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3MyArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWFzc29jLmMKLQotCUFic3RyYWN0OgotCi0JUmV2aXNpb24gSGlzdG9yeToKLQlXaG8JCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlKb2huCQkyMDA0LTktMwkJcG9ydGluZyBmcm9tIFJUMjUwMAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLVVDSEFSCUNpcGhlcldwYVRlbXBsYXRlW10gPSB7Ci0JCTB4ZGQsCQkJCQkvLyBXUEEgSUUKLQkJMHgxNiwJCQkJCS8vIExlbmd0aAotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLQotVUNIQVIJQ2lwaGVyV3BhMlRlbXBsYXRlW10gPSB7Ci0JCTB4MzAsCQkJCQkvLyBSU04gSUUKLQkJMHgxNCwJCQkJCS8vIExlbmd0aAotCQkweDAxLCAweDAwLAkJCQkvLyBWZXJzaW9uCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIGdyb3VwIGNpcGhlciwgVEtJUAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgcGFpcndpc2UKLQkJMHgwMCwgMHgwZiwgMHhhYywgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4MGYsIDB4YWMsIDB4MDIsCS8vIGF1dGhlbnRpY2F0aW9uCi0JCTB4MDAsIDB4MDAsCQkJCS8vIFJTTiBjYXBhYmlsaXR5Ci0JCX07Ci0KLVVDSEFSCUNjeDJJZUluZm9bXSA9IHsgMHgwMCwgMHg0MCwgMHg5NiwgMHgwMywgMHgwMn07Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJYXNzb2NpYXRpb24gc3RhdGUgbWFjaGluZSBpbml0LCBpbmNsdWRpbmcgc3RhdGUgdHJhbnNpdGlvbiBhbmQgdGltZXIgaW5pdAotCVBhcmFtZXRlcnM6Ci0JCVMgLSBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGlvbiBzdGF0ZSBtYWNoaW5lCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBBc3NvY1N0YXRlTWFjaGluZUluaXQoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gIFNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVN0YXRlTWFjaGluZUluaXQoUywgVHJhbnMsIE1BWF9BU1NPQ19TVEFURSwgTUFYX0FTU09DX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBU1NPQ19JRExFLCBBU1NPQ19NQUNISU5FX0JBU0UpOwotCi0JLy8gZmlyc3QgY29sdW1uCi0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lQXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfTUxNRV9SRUFTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lUmVhc3NvY1JlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX0lETEUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lRGlzYXNzb2NSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19JRExFLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKLQotCS8vIHNlY29uZCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIEFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckFzc29jUnNwQWN0aW9uKTsKLQkvLwotCS8vIFBhdGNoIDNDb20gQVAgTU9kZTozQ1JXRTQ1NEc3MgotCS8vIFdlIHNlbmQgQXNzb2MgcmVxdWVzdCBmcmFtZSB0byB0aGlzIEFQLCBpdCBhbHdheXMgc2VuZCBSZWFzc29jIFJzcCBub3QgQXNzb2NpYXRlIFJzcC4KLQkvLwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckFzc29jUnNwQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgQVNTT0NfV0FJVF9SU1AsIE1UMl9BU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUFzc29jVGltZW91dEFjdGlvbik7Ci0KLQkvLyB0aGlyZCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5Bc3NvYyk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIFJFQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX1JFQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5SZWFzc29jKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9ESVNBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckRpc2Fzc29jQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgUkVBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfUkVBU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJlYXNzb2NSc3BBY3Rpb24pOwotCS8vCi0JLy8gUGF0Y2gsIEFQIGRvZXNuJ3Qgc2VuZCBSZWFzc29jaWF0ZSBSc3AgZnJhbWUgdG8gU3RhdGlvbi4KLQkvLwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUEVFUl9BU1NPQ19SU1AsIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlclJlYXNzb2NSc3BBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBSRUFTU09DX1dBSVRfUlNQLCBNVDJfUkVBU1NPQ19USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVJlYXNzb2NUaW1lb3V0QWN0aW9uKTsKLQotCS8vIGZvdXJ0aCBjb2x1bW4KLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oUywgRElTQVNTT0NfV0FJVF9SU1AsIE1UMl9NTE1FX0FTU09DX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfUkVBU1NPQ19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblJlYXNzb2MpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5EaXNhc3NvY2lhdGUpOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTLCBESVNBU1NPQ19XQUlUX1JTUCwgTVQyX1BFRVJfRElTQVNTT0NfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEaXNhc3NvY0FjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFMsIERJU0FTU09DX1dBSVRfUlNQLCBNVDJfRElTQVNTT0NfVElNRU9VVCwgKFNUQVRFX01BQ0hJTkVfRlVOQylEaXNhc3NvY1RpbWVvdXRBY3Rpb24pOwotCi0JLy8gaW5pdGlhbGl6ZSB0aGUgdGltZXIKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oQXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci0JUlRNUEluaXRUaW1lcihwQWQsICZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oUmVhc3NvY1RpbWVvdXQpLCBwQWQsIEZBTFNFKTsKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5EaXNhc3NvY1RpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oRGlzYXNzb2NUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJQXNzb2NpYXRpb24gdGltZW91dCBwcm9jZWR1cmUuIEFmdGVyIGFzc29jaWF0aW9uIHRpbWVvdXQsIHRoaXMgZnVuY3Rpb24KLQkJd2lsbCBiZSBjYWxsZWQgYW5kIGl0IHdpbGwgcHV0IGEgbWVzc2FnZSBpbnRvIHRoZSBNTE1FIHF1ZXVlCi0JUGFyYW1ldGVyczoKLQkJU3RhbmRhcmQgdGltZXIgcGFyYW1ldGVycwotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCSBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0JTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfVElNRU9VVCwgMCwgTlVMTCk7Ci0JUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlSZWFzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciByZWFzc29jaWF0aW9uIHRpbWVvdXQsIHRoaXMKLQkJZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYW5kIHB1dCBhIG1lc3NhZ2UgaW50byB0aGUgTUxNRSBxdWV1ZQotCVBhcmFtZXRlcnM6Ci0JCVN0YW5kYXJkIHRpbWVyIHBhcmFtZXRlcnMKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBSZWFzc29jVGltZW91dChJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzEsCi0JCQkJCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQkJCQkJSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzMpCi17Ci0JUlRNUF9BREFQVEVSICpwQWQgPSAoUlRNUF9BREFQVEVSICopRnVuY3Rpb25Db250ZXh0OwotCi0JLy8gRG8gbm90aGluZyBpZiB0aGUgZHJpdmVyIGlzIHN0YXJ0aW5nIGhhbHQgc3RhdGUuCi0JLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aW1lciBhbHJlYWR5IGJlZW4gZmlyZWQgYmVmb3JlIGNhbmNlbCB0aW1lciB3aXRoIG1sbWVoYWx0Ci0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwgZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSkKLQkJcmV0dXJuOwotCi0JTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCURpc2Fzc29jaWF0aW9uIHRpbWVvdXQgcHJvY2VkdXJlLiBBZnRlciBkaXNhc3NvY2lhdGlvbiB0aW1lb3V0LCB0aGlzCi0JCWZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFuZCBwdXQgYSBtZXNzYWdlIGludG8gdGhlIE1MTUUgcXVldWUKLQlQYXJhbWV0ZXJzOgotCQlTdGFuZGFyZCB0aW1lciBwYXJhbWV0ZXJzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRGlzYXNzb2NUaW1lb3V0KElOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQkJCQkJSU4gUFZPSUQgRnVuY3Rpb25Db250ZXh0LAotCQkJCQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JCQkJCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19USU1FT1VULCAwLCBOVUxMKTsKLQlSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCW1sbWUgYXNzb2MgcmVxIGhhbmRsaW5nIHByb2NlZHVyZQotCVBhcmFtZXRlcnM6Ci0JCUFkYXB0ZXIgLSBBZGFwdGVyIHBvaW50ZXIKLQkJRWxlbSAtIE1MTUUgUXVldWUgRWxlbWVudAotCVByZToKLQkJdGhlIHN0YXRpb24gaGFzIGJlZW4gYXV0aGVudGljYXRlZCBhbmQgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGNvbmZpZwotCQkJLSMgU1NJRAotCQkJLSMgc3VwcG9ydGVkIHJhdGVzIGFuZCB0aGVpciBsZW5ndGgKLQkJCS0jIGxpc3RlbiBpbnRlcnZhbCAoQWRhcHRlci0+U3RhQ2ZnLmRlZmF1bHRfbGlzdGVuX2NvdW50KQotCQkJLSMgVHJhbnNtaXQgcG93ZXIgIChBZGFwdGVyLT5TdGFDZmcudHhfcG93ZXIpCi0JUG9zdCAgOgotCQktIyBBbiBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lIGlzIGdlbmVyYXRlZCBhbmQgc2VudCB0byB0aGUgYWlyCi0JCS0jIEFzc29jaWF0aW9uIHRpbWVyIHN0YXJ0cwotCQktIyBBc3NvY2lhdGlvbiBzdGF0ZSAtPiBBU1NPQ19XQUlUX1JTUAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVBc3NvY1JlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIJCQlBcEFkZHJbNl07Ci0JSEVBREVSXzgwMl8xMQlBc3NvY0hkcjsKLQlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07Ci0JVVNIT1JUCQkJTGlzdGVuSW50djsKLQlVTE9ORwkJCVRpbWVvdXQ7Ci0JVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm87Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJRnJhbWVMZW4gPSAwOwotCVVMT05HCQkJdG1wOwotCVVTSE9SVAkJCVZhckllc09mZnNldDsKLQlVU0hPUlQJCQlTdGF0dXM7Ci0KLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgQXNzb2MgcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QhXG4iKSk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCX0KLQkvLyBjaGVjayBzYW5pdHkgZmlyc3QKLQllbHNlIGlmIChNbG1lQXNzb2NSZXFTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQXBBZGRyLCAmQ2FwYWJpbGl0eUluZm8sICZUaW1lb3V0LCAmTGlzdGVuSW50dikpCi0JewotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQXBBZGRyKTsKLQotCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFTU09DIC0gTWxtZUFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEFkZCBieSBKYW1lcyAwMy8wNi8yNwotCQlwQWQtPlN0YUNmZy5Bc3NvY0luZm8uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKLQkJLy8gQXNzb2NpYXRpb24gZG9uJ3QgbmVlZCB0byByZXBvcnQgTUFDIGFkZHJlc3MKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLkF2YWlsYWJsZVJlcXVlc3RGaXhlZElFcyA9Ci0JCQlORElTXzgwMl8xMV9BSV9SRVFGSV9DQVBBQklMSVRJRVMgfCBORElTXzgwMl8xMV9BSV9SRVFGSV9MSVNURU5JTlRFUlZBTDsKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5DYXBhYmlsaXRpZXMgPSBDYXBhYmlsaXR5SW5mbzsKLQkJcEFkLT5TdGFDZmcuQXNzb2NJbmZvLlJlcXVlc3RGaXhlZElFcy5MaXN0ZW5JbnRlcnZhbCA9IExpc3RlbkludHY7Ci0JCS8vIE9ubHkgcmVhc3NvY2lhdGUgbmVlZCB0aGlzCi0JCS8vQ09QWV9NQUNfQUREUihwQWQtPlN0YUNmZy5Bc3NvY0luZm8uUmVxdWVzdEZpeGVkSUVzLkN1cnJlbnRBUEFkZHJlc3MsIEFwQWRkcik7Ci0JCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5PZmZzZXRSZXF1ZXN0SUVzID0gc2l6ZW9mKE5ESVNfODAyXzExX0FTU09DSUFUSU9OX0lORk9STUFUSU9OKTsKLQotICAgICAgICBOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMsIE1BWF9WSUVfTEVOKTsKLQkJLy8gRmlyc3QgYWRkIFNTSUQKLQkJVmFySWVzT2Zmc2V0ID0gMDsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUmVxVmFySUVzICsgVmFySWVzT2Zmc2V0LCAmU3NpZEllLCAxKTsKLQkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAxKTsKLQkJVmFySWVzT2Zmc2V0ICs9IDE7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOwotCi0JCS8vIFNlY29uZCBhZGQgU3VwcG9ydGVkIHJhdGVzCi0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJlN1cFJhdGVJZSwgMSk7Ci0JCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgMSk7Ci0JCVZhckllc09mZnNldCArPSAxOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbik7Ci0JCVZhckllc09mZnNldCArPSBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbjsKLQkJLy8gRW5kIEFkZCBieSBKYW1lcwotCi0gICAgICAgIGlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KSAmJgotICAgICAgICAgICAgKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IFRSVUUpKQotICAgICAgICAgICAgQ2FwYWJpbGl0eUluZm8gfD0gMHgwMTAwOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBBU1NPQyByZXF1ZXN0Li4uXG4iKSk7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmQXNzb2NIZHIsIFNVQlRZUEVfQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7Ci0KLQkJLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksCSZBc3NvY0hkciwKLQkJCQkJCSAgMiwJCQkJCQkmQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkgIDIsCQkJCQkJJkxpc3RlbkludHYsCi0JCQkJCQkgIDEsCQkJCQkJJlNzaWRJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLAkJcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsCQkJCQkJJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmRXh0UmF0ZUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvLyBIVAotCQlpZiAoKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPiAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgSHRMZW47Ci0JCQlVQ0hBUiBCUk9BRENPTVs0XSA9IHsweDAsIDB4OTAsIDB4NGMsIDB4MzN9OwotCQkJaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYlByZU5IdCA9PSBUUlVFKQotCQkJewotCQkJCUh0TGVuID0gU0laRV9IVF9DQVBfSUUgKyA0OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXcGFJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSHRMZW4sCi0JCQkJCQkJICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJST0FEQ09NWzBdLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCSAgICAgICAgSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7Ci0jZW5kaWYKLQotI2lmbmRlZiBSVF9CSUdfRU5ESUFOCi0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sCi0JCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5VG1wLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LCBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuKTsKLQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOwotCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7Ci0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCZIdENhcGFiaWxpdHlUbXAsCi0JCQkJCQkJCUVORF9PRl9BUkdTKTsKLSNlbmRpZgotCQkJfQotCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJLy8gYWRkIFJhbGluayBwcm9wcmlldGFyeSBJRSB0byBpbmZvcm0gQVAgdGhpcyBTVEEgaXMgZ29pbmcgdG8gdXNlIEFHR1JFR0FUSU9OIG9yIFBJR0dZLUJBQ0srQUdHUkVHQVRJT04KLQkJLy8gQ2FzZSBJOiAoQWdncmVnYXRpb24gKyBQaWdneS1CYWNrKQotCQkvLyAxLiB1c2VyIGVuYWJsZSBhZ2dyZWdhdGlvbiwgQU5ECi0JCS8vIDIuIE1hYyBzdXBwb3J0IHBpZ2d5LWJhY2sKLQkJLy8gMy4gQVAgYW5ub3VjZXMgaXQncyBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCi0JCS8vIENhc2UgSUk6IChBZ2dyZWdhdGlvbikKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBBUCBhbm5vdWNlcyBpdCdzIEFHR1JFR0FUSU9OLWNhcGFibGUgaW4gQkVBQ09OCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAoKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMykgPT0gMykpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDEpCi0JCQl7Ci0JCQkJVUxPTkcgVG1wTGVuOwotCQkJCVVDSEFSIFJhbGlua0llWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgNywgMHgwMCwgMHgwYywgMHg0MywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMH07Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbGlua0llLAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlVTE9ORyBUbXBMZW47Ci0JCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwJCSAmVG1wTGVuLAotCQkJCQkJCSAgOSwJCQkJCQkgUmFsaW5rSWUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSBUbXBMZW47Ci0JCX0KLQotCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJCXsKLQkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKLQotCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87Ci0JCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOwotCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOwotCQkJfQotCQkJZWxzZQotCQkJewotICAgICAgICAgICAgICAgIC8vIFRoZSBQYXJhbWV0ZXIgU2V0IENvdW50IGlzIHNldCB0byDvv73vv70w77+977+9IGluIHRoZSBhc3NvY2lhdGlvbiByZXF1ZXN0IGZyYW1lcwotICAgICAgICAgICAgICAgIC8vIFdtZUllWzhdIHw9IChwQWQtPk1sbWVBdXguQVBFZGNhUGFybS5FZGNhVXBkYXRlQ291bnQgJiAweDBmKTsKLQkJCX0KLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAmdG1wLAotCQkJCQkJCSAgOSwgICAgICAgICAgICAgICAgICAgICAgICAmV21lSWVbMF0sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSB0bXA7Ci0JCX0KLQotCQkvLwotCQkvLyBMZXQgV1BBKCMyMjEpIEVsZW1lbnQgSUQgb24gdGhlIGVuZCBvZiB0aGlzIGFzc29jaWF0aW9uIGZyYW1lLgotCQkvLyBPdGhlcndpc2Ugc29tZSBBUCB3aWxsIGZhaWwgb24gcGFyc2luZyBFbGVtZW50IElEIGFuZCBzZXQgc3RhdHVzIGZhaWwgb24gQXNzb2MgUnNwLgotCQkvLyBGb3IgZXhhbXBsZTogUHV0IFZlbmRvciBTcGVjaWZpYyBJRSBvbiB0aGUgZnJvbnQgb2YgV1BBIElFLgotCQkvLyBUaGlzIGhhcHBlbnMgb24gQVAgKE1vZGVsIE5vOkxpbmtzeXMgV1JLNTRHKQotCQkvLwotCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKLSAgICAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLQkJCSkKLSAgICAgICAgICAgICkKLQkJewotCQkJVUNIQVIgUlNOSWUgPSBJRV9XUEE7Ci0KLQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKLSAgICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCi0JCQl7Ci0JCQkJUlNOSWUgPSBJRV9XUEEyOwotCQkJfQotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZmRlZiBTSU9DU0lXR0VOSUUKLQkJCWlmICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKLQkJCQkocEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9PSBGQUxTRSkpCi0jZW5kaWYgLy8gU0lPQ1NJV0dFTklFIC8vCi0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIFJUTVBNYWtlUlNOSUUocEFkLCBwQWQtPlN0YUNmZy5BdXRoTW9kZSwgcEFkLT5TdGFDZmcuV2VwU3RhdHVzLCBCU1MwKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFdQQSBQTUsgY2FjaGUgbGlzdAotCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JCQl7Ci0JCQkgICAgSU5UICAgICBpZHg7Ci0gICAgICAgICAgICAgICAgQk9PTEVBTiBGb3VuZFBNSyA9IEZBTFNFOwotCQkJCS8vIFNlYXJjaCBjaGNoZWQgUE1LSUQsIGFwcGVuZCBpdCBpZiBleGlzdGVkCi0JCQkJZm9yIChpZHggPSAwOyBpZHggPCBQTUtJRF9OTzsgaWR4KyspCi0JCQkJewotCQkJCQlpZiAoTmRpc0VxdWFsTWVtb3J5KEFwQWRkciwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSUQsIDYpKQotCQkJCQl7Ci0JCQkJCQlGb3VuZFBNSyA9IFRSVUU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChGb3VuZFBNSykKLQkJCQl7Ci0JCQkJCS8vIFNldCBQTUsgbnVtYmVyCi0JCQkJCSooUFVTSE9SVCkgJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW5dID0gMTsKLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlJTTl9JRVtwQWQtPlN0YUNmZy5SU05JRV9MZW4gKyAyXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uUE1LSUQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuICs9IDE4OwotCQkJCX0KLQkJCX0KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpICYmCi0JCQkJKHBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPT0gVFJVRSkpCi0JCQl7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkJJnRtcCwKLQkJCQkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkJJnRtcCwKLQkJCQkJCTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJTTkllLAotCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCi0JCQkJCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwJCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCQkJCUVORF9PRl9BUkdTKTsKLQkJCX0KLQotCQkJRnJhbWVMZW4gKz0gdG1wOwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZmRlZiBTSU9DU0lXR0VOSUUKLQkJCWlmICgocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgfHwKLQkJCQkocEFkLT5TdGFDZmcuYlJTTl9JRV9Gcm9tV3BhU3VwcGxpY2FudCA9PSBGQUxTRSkpCi0jZW5kaWYKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQkJewotICAgICAgICAgICAgLy8gQXBwZW5kIFZhcmlhYmxlIElFCi0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5SZXFWYXJJRXMgKyBWYXJJZXNPZmZzZXQsICZSU05JZSwgMSk7Ci0gICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwgMSk7Ci0gICAgICAgICAgICBWYXJJZXNPZmZzZXQgKz0gMTsKLQkJCX0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcVZhcklFcyArIFZhckllc09mZnNldCwgcEFkLT5TdGFDZmcuUlNOX0lFLCBwQWQtPlN0YUNmZy5SU05JRV9MZW4pOwotCQkJVmFySWVzT2Zmc2V0ICs9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQotCQkJLy8gU2V0IFZhcmlhYmxlIElFcyBMZW5ndGgKLQkJCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gVmFySWVzT2Zmc2V0OwotCQl9Ci0KLQotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZUF1eC5Bc3NvY1RpbWVyLCBUaW1lb3V0KTsKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19XQUlUX1JTUDsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVBc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEhISBcbiIpKTsKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJbWxtZSByZWFzc29jIHJlcSBoYW5kbGluZyBwcm9jZWR1cmUKLQlQYXJhbWV0ZXJzOgotCQlFbGVtIC0KLQlQcmU6Ci0JCS0jIFNTSUQgIChBZGFwdGVyLT5TdGFDZmcuc3NpZFtdKQotCQktIyBCU1NJRCAoQVAgYWRkcmVzcywgQWRhcHRlci0+U3RhQ2ZnLmJzc2lkKQotCQktIyBTdXBwb3J0ZWQgcmF0ZXMgKEFkYXB0ZXItPlN0YUNmZy5zdXBwb3J0ZWRfcmF0ZXNbXSkKLQkJLSMgU3VwcG9ydGVkIHJhdGVzIGxlbmd0aCAoQWRhcHRlci0+U3RhQ2ZnLnN1cHBvcnRlZF9yYXRlc19sZW4pCi0JCS0jIFR4IHBvd2VyIChBZGFwdGVyLT5TdGFDZmcudHhfcG93ZXIpCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZVJlYXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSCQkJQXBBZGRyWzZdOwotCUhFQURFUl84MDJfMTEJUmVhc3NvY0hkcjsKLQlVQ0hBUgkJCVdtZUllWzldID0ge0lFX1ZFTkRPUl9TUEVDSUZJQywgMHgwNywgMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07Ci0JVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm8sIExpc3RlbkludHY7Ci0JVUxPTkcJCQlUaW1lb3V0OwotCVVMT05HCQkJRnJhbWVMZW4gPSAwOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCXRtcDsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlVU0hPUlQJCQlTdGF0dXM7Ci0KLQkvLyBCbG9jayBhbGwgYXV0aGVudGljYXRpb24gcmVxdWVzdCBkdXJuaW5nIFdQQSBibG9jayBwZXJpb2QKLQlpZiAocEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPT0gVFJVRSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQmxvY2sgUmVBc3NvYyByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZCFcbiIpKTsKLQkJcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQl9Ci0JLy8gdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBhc3NvY2lhdGlvbgotCWVsc2UgaWYoTWxtZUFzc29jUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFwQWRkciwgJkNhcGFiaWxpdHlJbmZvLCAmVGltZW91dCwgJkxpc3RlbkludHYpKQotCXsKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JCWlmKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJBU1NPQyAtIE1sbWVSZWFzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9SRUFTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ09QWV9NQUNfQUREUihwQWQtPk1sbWVBdXguQnNzaWQsIEFwQWRkcik7Ci0KLQkJLy8gbWFrZSBmcmFtZSwgdXNlIGJzc2lkIGFzIHRoZSBBUCBhZGRyZXNzPz8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBTZW5kIFJFLUFTU09DIHJlcXVlc3QuLi5cbiIpKTsKLQkJTWd0TWFjSGVhZGVySW5pdChwQWQsICZSZWFzc29jSGRyLCBTVUJUWVBFX1JFQVNTT0NfUkVRLCAwLCBBcEFkZHIsIEFwQWRkcik7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZSZWFzc29jSGRyLAotCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmTGlzdGVuSW50diwKLQkJCQkJCSAgTUFDX0FERFJfTEVOLCAgICAgICAgICAgICBBcEFkZHIsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LlNzaWRMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCAgICAgcEFkLT5NbG1lQXV4LlNzaWQsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJCSAgMSwJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuLCAgcEFkLT5NbG1lQXV4LlN1cFJhdGUsCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgJnRtcCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCi0JCQkJCQkJICBwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwJICAgIHBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLQotCQlpZiAocEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0uYlZhbGlkKQotCQl7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+TWxtZUF1eC5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkKLQkJCXsKLQkJCQlRQlNTX1NUQV9JTkZPX1BBUk0gUW9zSW5mbzsKLQotCQkJCU5kaXNaZXJvTWVtb3J5KCZRb3NJbmZvLCBzaXplb2YoUUJTU19TVEFfSU5GT19QQVJNKSk7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19CRSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkU7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19CSyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQks7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19WSSA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkk7Ci0JCQkJUW9zSW5mby5VQVBTRF9BQ19WTyA9IHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk87Ci0JCQkJUW9zSW5mby5NYXhTUExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLk1heFNQTGVuZ3RoOwotCQkJCVdtZUllWzhdIHw9ICooUFVDSEFSKSZRb3NJbmZvOwotCQkJfQotCi0JCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICZ0bXAsCi0JCQkJCQkJICA5LCAgICAgICAgICAgICAgICAgICAgICAgICZXbWVJZVswXSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCUZyYW1lTGVuICs9IHRtcDsKLQkJfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCS8vIEhUCi0JCWlmICgocEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCQl7Ci0JCQlVTE9ORyBUbXBMZW47Ci0JCQlVQ0hBUiBIdExlbjsKLQkJCVVDSEFSIEJST0FEQ09NWzRdID0gezB4MCwgMHg5MCwgMHg0YywgMHgzM307Ci0JCQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID09IFRSVUUpCi0JCQl7Ci0JCQkJSHRMZW4gPSBTSVpFX0hUX0NBUF9JRSArIDQ7Ci0JCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLCAgICAgICAgICAgICZUbXBMZW4sCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJldwYUllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQlJPQURDT01bMF0sCi0JCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdENhcEllLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCSBwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuLCAgICAgICAgICAmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCX0KLQkJCUZyYW1lTGVuICs9IFRtcExlbjsKLQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JCS8vIGFkZCBSYWxpbmsgcHJvcHJpZXRhcnkgSUUgdG8gaW5mb3JtIEFQIHRoaXMgU1RBIGlzIGdvaW5nIHRvIHVzZSBBR0dSRUdBVElPTiBvciBQSUdHWS1CQUNLK0FHR1JFR0FUSU9OCi0JCS8vIENhc2UgSTogKEFnZ3JlZ2F0aW9uICsgUGlnZ3ktQmFjaykKLQkJLy8gMS4gdXNlciBlbmFibGUgYWdncmVnYXRpb24sIEFORAotCQkvLyAyLiBNYWMgc3VwcG9ydCBwaWdneS1iYWNrCi0JCS8vIDMuIEFQIGFubm91Y2VzIGl0J3MgUElHR1ktQkFDSytBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQkvLyBDYXNlIElJOiAoQWdncmVnYXRpb24pCi0JCS8vIDEuIHVzZXIgZW5hYmxlIGFnZ3JlZ2F0aW9uLCBBTkQKLQkJLy8gMi4gQVAgYW5ub3VjZXMgaXQncyBBR0dSRUdBVElPTi1jYXBhYmxlIGluIEJFQUNPTgotCQlpZiAocEFkLT5Db21tb25DZmcuYkFnZ3JlZ2F0aW9uQ2FwYWJsZSkKLQkJewotCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUGlnZ3lCYWNrQ2FwYWJsZSkgJiYgKChwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAmIDB4MDAwMDAwMDMpID09IDMpKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQkJZWxzZSBpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAxKQotCQkJewotCQkJCVVMT05HIFRtcExlbjsKLQkJCQlVQ0hBUiBSYWxpbmtJZVs5XSA9IHtJRV9WRU5ET1JfU1BFQ0lGSUMsIDcsIDB4MDAsIDB4MGMsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9OwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWxpbmtJZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJVUxPTkcgVG1wTGVuOwotCQkJVUNIQVIgUmFsaW5rSWVbOV0gPSB7SUVfVkVORE9SX1NQRUNJRklDLCA3LCAweDAwLCAweDBjLCAweDQzLCAweDA0LCAweDAwLCAweDAwLCAweDAwfTsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIrRnJhbWVMZW4sCQkgJlRtcExlbiwKLQkJCQkJCQkgIDksCQkJCQkJIFJhbGlua0llLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQl9Ci0KLQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQkJUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCBUaW1lb3V0KTsgLyogaW4gbVNlYyAqLwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IFJFQVNTT0NfV0FJVF9SU1A7Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVNTT0MgLSBNbG1lUmVhc3NvY1JlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsZWQuIEJVRyEhISEgXG4iKSk7Ci0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQkJU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVVwcGVyIGxheWVyIGlzc3VlcyBkaXNhc3NvYyByZXF1ZXN0Ci0JUGFyYW1ldGVyczoKLQkJRWxlbSAtCi0KLQlJUlFMID0gUEFTU0lWRV9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lRGlzYXNzb2NSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgcERpc2Fzc29jUmVxOwotCUhFQURFUl84MDJfMTEgICAgICAgICBEaXNhc3NvY0hkcjsKLQlQSEVBREVSXzgwMl8xMSAgICAgICAgcERpc2Fzc29jSGRyOwotCVBVQ0hBUiAgICAgICAgICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCU5ESVNfU1RBVFVTICAgICAgICAgICBOU3RhdHVzOwotCUJPT0xFQU4gICAgICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlVTE9ORyAgICAgICAgICAgICAgICAgVGltZW91dCA9IDUwMDsKLQlVU0hPUlQgICAgICAgICAgICAgICAgU3RhdHVzOwotCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JLy8gc2VuZCBETFMtVEVBUl9ET1dOIG1lc3NhZ2UsCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCXsKLQkJVUNIQVIgaTsKLQotCQkvLyB0ZWFyIGRvd24gbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGkrKykKLQkJewotCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkpCi0JCQl7Ci0JCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCX0KLQkJfQotCi0JCS8vIHRlYXIgZG93biBwZWVyIGRscyB0YWJsZSBlbnRyeQotCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCXsKLQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JLy8gc2tpcCBzYW5pdHkgY2hlY2sKLQlwRGlzYXNzb2NSZXEgPSAoUE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkoRWxlbS0+TXNnKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gTWxtZURpc2Fzc29jUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIikpOwotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCVN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLQkJTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0RJU0FTU09DX0NPTkYsIDIsICZTdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0KLQotCi0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gU2VuZCBESVNBU1NPQyByZXF1ZXN0W0JTU0lEOjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAoUmVhc29uPSVkKVxuIiwKLQkJCQlwRGlzYXNzb2NSZXEtPkFkZHJbMF0sIHBEaXNhc3NvY1JlcS0+QWRkclsxXSwgcERpc2Fzc29jUmVxLT5BZGRyWzJdLAotCQkJCXBEaXNhc3NvY1JlcS0+QWRkclszXSwgcERpc2Fzc29jUmVxLT5BZGRyWzRdLCBwRGlzYXNzb2NSZXEtPkFkZHJbNV0sIHBEaXNhc3NvY1JlcS0+UmVhc29uKSk7Ci0JTWd0TWFjSGVhZGVySW5pdChwQWQsICZEaXNhc3NvY0hkciwgU1VCVFlQRV9ESVNBU1NPQywgMCwgcERpc2Fzc29jUmVxLT5BZGRyLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwkvLyBwYXRjaCBwZWFwIHR0bHMgc3dpdGNoaW5nIGlzc3VlCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRpc2Fzc29jSGRyLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAmcERpc2Fzc29jUmVxLT5SZWFzb24sCi0JCQkJCSAgRU5EX09GX0FSR1MpOwotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCi0JLy8gVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAKLQkvLyBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lCi0JLy8gVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4KLQlwRGlzYXNzb2NIZHIgPSAoUEhFQURFUl84MDJfMTEpcE91dEJ1ZmZlcjsKLQlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORzsKLQlDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRpc2Fzc29jU3RhLCBwRGlzYXNzb2NSZXEtPkFkZHIpOwotCi0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguRGlzYXNzb2NUaW1lciwgVGltZW91dCk7IC8qIGluIG1TZWMgKi8KLQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IERJU0FTU09DX1dBSVRfUlNQOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2lmbmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkKLQl7Ci0JCS8vc2VuZCBkaXNhc3NvY2lhdGUgZXZlbnQgdG8gd3BhX3N1cHBsaWNhbnQKLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCBSVF9ESVNBU1NPQ19FVkVOVF9GTEFHLCBOVUxMLCBOVUxMLCAwKTsKLQl9Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgTlVMTCwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXBlZXIgc2VuZHMgYXNzb2MgcnNwIGJhY2sKLQlQYXJhbWV0ZXJzOgotCQlFbG1lIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckFzc29jUnNwQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBTdGF0dXMsIEFpZDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBTdXBSYXRlTGVuOwotCVVDSEFSICAgICAgICAgRXh0UmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVMZW47Ci0JVUNIQVIgICAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIgICAgICAgICBDa2lwRmxhZzsKLQlFRENBX1BBUk0gICAgIEVkY2FQYXJtOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotCi0JaWYgKFBlZXJBc3NvY1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJkNhcGFiaWxpdHlJbmZvLCAmU3RhdHVzLCAmQWlkLCBTdXBSYXRlLCAmU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgJkV4dFJhdGVMZW4sCi0JCSZIdENhcGFiaWxpdHksJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwmQWRkSHRJbmZvTGVuLCZOZXdFeHRDaGFubmVsT2Zmc2V0LCAmRWRjYVBhcm0sICZDa2lwRmxhZykpCi0JewotCQkvLyBUaGUgZnJhbWUgaXMgZm9yIG1lID8KLQkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJBc3NvY1JzcEFjdGlvbigpOkFTU09DIC0gcmVjZWl2ZSBBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckFzc29jUnNwQWN0aW9uKCk6TWFjVGFibGUgWyVkXS5BTXNkdVNpemUgPSAlZC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAweCVseCBcbiIsRWxlbS0+V2NpZCwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQ2xpZW50U3RhdHVzRmxhZ3MpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkFzc29jVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQotCQkJaWYoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLQkJCXsKLQkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOwotCQkJCVVDSEFSCQkJaWR4OwotCi0JCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKLQkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCi0JCQkgICAgewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOwotCQkJICAgIH0KLQotCQkJCWZvciAoaWR4PTA7IGlkeDxFeHRSYXRlTGVuOyBpZHgrKykKLQkJCSAgICB7Ci0JCQkgICAgICAgIGlmIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzIDwgKEV4dFJhdGVbaWR4XSAmIDB4N2YpKQotCQkJICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IEV4dFJhdGVbaWR4XSAmIDB4N2Y7Ci0JCQkgICAgfQotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSZFZGNhUGFybSwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCAmQWRkSHRJbmZvKTsKLQotCQkJCVN0YUFkZE1hY1RhYmxlRW50cnkocEFkLAotCQkJCQkJCQkJJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sCi0JCQkJCQkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCUh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJCSZBZGRIdEluZm8sCi0JCQkJCQkJCQlBZGRIdEluZm9MZW4sCi0JCQkJCQkJCQlDYXBhYmlsaXR5SW5mbyk7Ci0JCQl9Ci0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBQZWVyQXNzb2NSc3BBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwZWVyIHNlbmRzIHJlYXNzb2MgcnNwCi0JUGFyYW1ldHJzOgotCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNudGFpbmluZyB0aGUgcmVjZWl2ZWQgZnJhbWUKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyUmVhc3NvY1JzcEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgQ2FwYWJpbGl0eUluZm87Ci0JVVNIT1JUICAgICAgU3RhdHVzOwotCVVTSE9SVCAgICAgIEFpZDsKLQlVQ0hBUiAgICAgICBTdXBSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgU3VwUmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXSwgRXh0UmF0ZUxlbjsKLQlVQ0hBUiAgICAgICBBZGRyMltNQUNfQUREUl9MRU5dOwotCVVDSEFSICAgICAgIENraXBGbGFnOwotCUJPT0xFQU4gICAgIFRpbWVyQ2FuY2VsbGVkOwotCUVEQ0FfUEFSTSAgIEVkY2FQYXJtOwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCUh0Q2FwYWJpbGl0eUxlbjsKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotCi0JaWYoUGVlckFzc29jUnNwU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQ2FwYWJpbGl0eUluZm8sICZTdGF0dXMsICZBaWQsIFN1cFJhdGUsICZTdXBSYXRlTGVuLCBFeHRSYXRlLCAmRXh0UmF0ZUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwJJkFkZEh0SW5mbywgJkh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mb0xlbiwmTmV3RXh0Q2hhbm5lbE9mZnNldCwgJkVkY2FQYXJtLCAmQ2tpcEZsYWcpKQotCXsKLQkJaWYoTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCkpIC8vIFRoZSBmcmFtZSBpcyBmb3IgbWUgPwotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIHJlY2VpdmUgUkVBU1NPQ19SU1AgdG8gbWUgKHN0YXR1cz0lZClcbiIsIFN0YXR1cykpOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguUmVhc3NvY1RpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JCQlpZihTdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQotCQkJewotCQkJCS8vIGdvIHRvIHByb2NlZHVyZSBsaXN0ZWQgb24gcGFnZSAzNzYKLQkJCQlBc3NvY1Bvc3RQcm9jKHBBZCwgQWRkcjIsIENhcGFiaWxpdHlJbmZvLCBBaWQsIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCSAmRWRjYVBhcm0sICZIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbiwgJkFkZEh0SW5mbyk7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotCQkJewotCQkJCVNlbmRBc3NvY0lFc1RvV3BhU3VwcGxpY2FudChwQWQpOwotCQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfQVNTT0NfRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JCQl9Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCAmcEFkLT5NbG1lQXV4LkJzc2lkWzBdLCBOVUxMLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCQkJfQotCi0JCQkvLyBDa2lwRmxhZyBpcyBubyB1c2UgZm9yIHJlYXNzb2NpYXRlCi0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfUkVBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJSZWFzc29jUnNwQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLQl9Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlwcm9jZWR1cmVzIG9uIElFRUUgODAyLjExLzE5OTkgcC4zNzYKLQlQYXJhbWV0cnM6Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXNzb2NQb3N0UHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBQVUNIQVIgcEFkZHIyLAotCUlOIFVTSE9SVCBDYXBhYmlsaXR5SW5mbywKLQlJTiBVU0hPUlQgQWlkLAotCUlOIFVDSEFSIFN1cFJhdGVbXSwKLQlJTiBVQ0hBUiBTdXBSYXRlTGVuLAotCUlOIFVDSEFSIEV4dFJhdGVbXSwKLQlJTiBVQ0hBUiBFeHRSYXRlTGVuLAotCUlOIFBFRENBX1BBUk0gcEVkY2FQYXJtLAotCUlOIEhUX0NBUEFCSUxJVFlfSUUJCSpwSHRDYXBhYmlsaXR5LAotCUlOIFVDSEFSIEh0Q2FwYWJpbGl0eUxlbiwKLQlJTiBBRERfSFRfSU5GT19JRQkJKnBBZGRIdEluZm8pCS8vIEFQIG1pZ2h0IHVzZSB0aGlzIGFkZGl0aW9uYWwgaHQgaW5mbyBJRQotewotCVVMT05HIElkeDsKLQotCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQlNTX0lORlJBOwotCUNPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBwQWRkcjIpOwotCXBBZC0+TWxtZUF1eC5BaWQgPSBBaWQ7Ci0JcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm8gJiBTVVBQT1JURURfQ0FQQUJJTElUWV9JTkZPOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gU29tZSBIVCBBUCBtaWdodCBsb3N0IFdNTSBJRS4gV2UgYWRkIFdNTSBvdXJzZWx2ZXMuIGJlYWN1YXNlIEhUIHJlcXVpcmVzIFFvUyBvbi4KLQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApICYmIChwRWRjYVBhcm0tPmJWYWxpZCA9PSBGQUxTRSkpCi0JewotCQlwRWRjYVBhcm0tPmJWYWxpZCA9IFRSVUU7Ci0JCXBFZGNhUGFybS0+QWlmc25bMF0gPSAzOwotCQlwRWRjYVBhcm0tPkFpZnNuWzFdID0gNzsKLQkJcEVkY2FQYXJtLT5BaWZzblsyXSA9IDI7Ci0JCXBFZGNhUGFybS0+QWlmc25bM10gPSAyOwotCi0JCXBFZGNhUGFybS0+Q3dtaW5bMF0gPSA0OwotCQlwRWRjYVBhcm0tPkN3bWluWzFdID0gNDsKLQkJcEVkY2FQYXJtLT5Dd21pblsyXSA9IDM7Ci0JCXBFZGNhUGFybS0+Q3dtaW5bM10gPSAyOwotCi0JCXBFZGNhUGFybS0+Q3dtYXhbMF0gPSAxMDsKLQkJcEVkY2FQYXJtLT5Dd21heFsxXSA9IDEwOwotCQlwRWRjYVBhcm0tPkN3bWF4WzJdID0gNDsKLQkJcEVkY2FQYXJtLT5Dd21heFszXSA9IDM7Ci0KLQkJcEVkY2FQYXJtLT5UeG9wWzBdICA9IDA7Ci0JCXBFZGNhUGFybS0+VHhvcFsxXSAgPSAwOwotCQlwRWRjYVBhcm0tPlR4b3BbMl0gID0gOTY7Ci0JCXBFZGNhUGFybS0+VHhvcFszXSAgPSA0ODsKLQotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgcEVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0KLQkvLyBmaWx0ZXIgb3V0IHVuLXN1cHBvcnRlZCByYXRlcwotCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgU3VwUmF0ZSwgU3VwUmF0ZUxlbik7Ci0JUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKLQotCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIHJhdGVzCi0JcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gPSBFeHRSYXRlTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5FeHRSYXRlLCAmcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JaWYgKEh0Q2FwYWJpbGl0eUxlbiA+IDApCi0JewotCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsIHBIdENhcGFiaWxpdHksIHBBZGRIdEluZm8pOwotCX0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBc3NvY1Bvc3RQcm9jPT09PiAgQVAuQU1zZHVTaXplID0gJWQuIENsaWVudFN0YXR1c0ZsYWdzID0gMHglbHggXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFNc2R1U2l6ZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5DbGllbnRTdGF0dXNGbGFncykpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gICAgKE1tcHM9JWQsIEFtc2R1U2l6ZT0lZCwgKVxuIiwKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5NbXBzTW9kZSwgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BTXNkdVNpemUpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIFNldCBOZXcgV1BBIGluZm9ybWF0aW9uCi0JSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcEFkZHIyLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0JaWYgKElkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiQVNTT0MgLSBDYW4ndCBmaW5kIEJTUyBhZnRlciByZWNlaXZpbmcgQXNzb2MgcmVzcG9uc2VcbiIpKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gSW5pdCB2YXJpYWJsZQotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbiA9IDA7Ci0JCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBNQVhfTEVOX09GX1JTTklFKTsKLQotCQkvLyBTdG9yZSBhcHByb3ByaWF0ZSBSU05fSUUgZm9yIFdQQSBTTSBuZWdvdGlhdGlvbiBsYXRlcgotCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFTGVuICE9IDApKQotCQl7Ci0JCQlQVUNIQVIgICAgICAgICAgICAgIHBWSUU7Ci0JCQlVU0hPUlQgICAgICAgICAgICAgIGxlbjsKLQkJCVBFSURfU1RSVUNUICAgICAgICAgcEVpZDsKLQotCQkJcFZJRSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlZhcklFczsKLQkJCWxlbgkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5WYXJJRUxlbjsKLQkJCS8vS0ggbmVlZCB0byBjaGVjayBhZ2FpbgotCQkJLy8gRG9uJ3QgYWxsb3cgdG8gZ28gdG8gc2xlZXAgbW9kZSBpZiBhdXRobW9kZSBpcyBXUEEtcmVsYXRlZC4KLQkJCS8vVGhpcyBjYW4gbWFrZSBBdXRoZW50aWNhdGlvbiBwcm9jZXNzIG1vcmUgc21vb3RobHkuCi0JCQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0NBTl9HT19TTEVFUCk7Ci0KLQkJCXdoaWxlIChsZW4gPiAwKQotCQkJewotCQkJCXBFaWQgPSAoUEVJRF9TVFJVQ1QpIHBWSUU7Ci0JCQkJLy8gRm9yIFdQQS9XUEFQU0sKLQkJCQlpZiAoKHBFaWQtPkVpZCA9PSBJRV9XUEEpICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdQQV9PVUksIDQpKQotCQkJCQkmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKLQkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBIFNNIG5lZ290aWF0aW9uIFxuIikpOwotCQkJCX0KLQkJCQkvLyBGb3IgV1BBMi9XUEEyUFNLCi0JCQkJZWxzZSBpZiAoKHBFaWQtPkVpZCA9PSBJRV9SU04pICYmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQgKyAyLCBSU05fT1VJLCAzKSkKLQkJCQkJJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0JCQkJewotCQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTl9JRSwgcFZJRSwgKHBFaWQtPkxlbiArIDIpKTsKLQkJCQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPSAocEVpZC0+TGVuICsgMik7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFzc29jUG9zdFByb2M9PT0+IFN0b3JlIFJTTl9JRSBmb3IgV1BBMiBTTSBuZWdvdGlhdGlvbiBcbiIpKTsKLQkJCQl9Ci0KLQkJCQlwVklFICs9IChwRWlkLT5MZW4gKyAyKTsKLQkJCQlsZW4gIC09IChwRWlkLT5MZW4gKyAyKTsKLQkJCX0KLQotCi0JCX0KLQotCQlpZiAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5SU05JRV9MZW4gPT0gMCkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQXNzb2NQb3N0UHJvYz09PT4gbm8gUlNOX0lFIFxuIikpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaGV4X2R1bXAoIlJTTl9JRSIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUlNOX0lFLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJTTklFX0xlbik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJbGVmdCBwYXJ0IG9mIElFRUUgODAyLjExLzE5OTkgcC4zNzQKLQlQYXJhbWV0ZXJzOgotCQlFbGVtIC0gTUxNRSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIHJlY2VpdmVkIGZyYW1lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckRpc2Fzc29jQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUICAgICAgICBSZWFzb247Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFBlZXJEaXNhc3NvY0FjdGlvbigpXG4iKSk7Ci0JaWYoUGVlckRpc2Fzc29jU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmUmVhc29uKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgUmVhc29uID0gJWRcbiIsIFJlYXNvbikpOwotCQlpZiAoSU5GUkFfT04ocEFkKSAmJiBNQUNfQUREUl9FUVVBTChwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgQWRkcjIpKQotCQl7Ci0KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCXsKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQkJfQotCi0KLQkJCUxpbmtEb3duKHBBZCwgVFJVRSk7Ci0JCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0JCQl7Ci0JCQkJLy9zZW5kIGRpc2Fzc29jaWF0ZSBldmVudCB0byB3cGFfc3VwcGxpY2FudAotCQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfRElTQVNTT0NfRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JCQl9Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gUGVlckRpc2Fzc29jQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLQl9Ci0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQl3aGF0IHRoZSBzdGF0ZSBtYWNoaW5lIHdpbGwgZG8gYWZ0ZXIgYXNzb2MgdGltZW91dAotCVBhcmFtZXRlcnM6Ci0JCUVsbWUgLQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEFzc29jVGltZW91dEFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVNTT0MgLSBBc3NvY1RpbWVvdXRBY3Rpb25cbiIpKTsKLQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJd2hhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIGRvIGFmdGVyIHJlYXNzb2MgdGltZW91dAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJlYXNzb2NUaW1lb3V0QWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIFJlYXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7Ci0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJd2hhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIGRvIGFmdGVyIGRpc2Fzc29jIHRpbWVvdXQKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBEaXNhc3NvY1RpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgU3RhdHVzOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gRGlzYXNzb2NUaW1lb3V0QWN0aW9uXG4iKSk7Ci0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfRElTQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLVZPSUQgSW52YWxpZFN0YXRlV2hlbkFzc29jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5Bc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotVk9JRCBJbnZhbGlkU3RhdGVXaGVuUmVhc3NvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5SZWFzc29jKHN0YXRlPSVsZCksIHJlc2V0IEFTU09DIHN0YXRlIG1hY2hpbmVcbiIsCi0JCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlKSk7Ci0JcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfU1RBVEVfTUFDSElORV9SRUpFQ1Q7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX1JFQVNTT0NfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLVZPSUQgSW52YWxpZFN0YXRlV2hlbkRpc2Fzc29jaWF0ZSgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUIFN0YXR1czsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBU1NPQyAtIEludmFsaWRTdGF0ZVdoZW5EaXNhc3NvYyhzdGF0ZT0lbGQpLCByZXNldCBBU1NPQyBzdGF0ZSBtYWNoaW5lXG4iLAotCQlwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5Bc3NvY01hY2hpbmUuQ3VyclN0YXRlID0gQVNTT0NfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ESVNBU1NPQ19DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlyaWdodCBwYXJ0IG9mIElFRUUgODAyLjExLzE5OTkgcGFnZSAzNzQKLQlOb3RlOgotCQlUaGlzIGV2ZW50IHNob3VsZCBuZXZlciBjYXVzZSBBU1NPQyBzdGF0ZSBtYWNoaW5lIHBlcmZvcm0gc3RhdGUKLQkJdHJhbnNpdGlvbiwgYW5kIGhhcyBubyByZWxhdGlvbnNoaXAgd2l0aCBDTlRMIG1hY2hpbmUuIFNvIHdlIHNlcGFyYXRlCi0JCXRoaXMgcm91dGluZSBhcyBhIHNlcnZpY2Ugb3V0c2lkZSBvZiBBU1NPQyBzdGF0ZSB0cmFuc2l0aW9uIHRhYmxlLgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIENsczNlcnJBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gUFVDSEFSICAgICAgICBwQWRkcikKLXsKLQlIRUFERVJfODAyXzExICAgICAgICAgRGlzYXNzb2NIZHI7Ci0JUEhFQURFUl84MDJfMTEgICAgICAgIHBEaXNhc3NvY0hkcjsKLQlQVUNIQVIgICAgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlORElTX1NUQVRVUyAgICAgICAgICAgTlN0YXR1czsKLQlVU0hPUlQgICAgICAgICAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzNFUlI7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFTU09DIC0gQ2xhc3MgMyBFcnJvciwgU2VuZCBESVNBU1NPQyBmcmFtZVxuIikpOwotCU1ndE1hY0hlYWRlckluaXQocEFkLCAmRGlzYXNzb2NIZHIsIFNVQlRZUEVfRElTQVNTT0MsIDAsIHBBZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7CS8vIHBhdGNoIHBlYXAgdHRscyBzd2l0Y2hpbmcgaXNzdWUKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkgIHNpemVvZihIRUFERVJfODAyXzExKSwmRGlzYXNzb2NIZHIsCi0JCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICZSZWFzb24sCi0JCQkJCSAgRU5EX09GX0FSR1MpOwotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCi0JLy8gVG8gcGF0Y2ggSW5zdGFuY2UgYW5kIEJ1ZmZhbG8oTikgQVAKLQkvLyBEcml2ZXIgaGFzIHRvIHNlbmQgZGVhdXRoIHRvIEluc3RhbmNlIEFQLCBidXQgQnVmZmFsbyhOKSBuZWVkcyB0byBzZW5kIGRpc2Fzc29jIHRvIHJlc2V0IEF1dGhlbnRpY2F0b3IncyBzdGF0ZSBtYWNoaW5lCi0JLy8gVGhlcmVmb3JlLCB3ZSBzZW5kIGJvdGggb2YgdGhlbS4KLQlwRGlzYXNzb2NIZHIgPSAoUEhFQURFUl84MDJfMTEpcE91dEJ1ZmZlcjsKLQlwRGlzYXNzb2NIZHItPkZDLlN1YlR5cGUgPSBTVUJUWVBFX0RFQVVUSDsKLQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQlwQWQtPlN0YUNmZy5EaXNhc3NvY1JlYXNvbiA9IFJFQVNPTl9DTFMzRVJSOwotCUNPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGlzYXNzb2NTdGEsIHBBZGRyKTsKLX0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSNpZm5kZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLVZPSUQgICAgU2VuZEFzc29jSUVzVG9XcGFTdXBwbGljYW50KAotICAgIElOICBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlTVFJJTkcgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OwotCi0JaWYgKChwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KSA8PSBJV19DVVNUT01fTUFYKQotCXsKLQkJc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk9fUmVxSUVzPSIpOwotCQlOZGlzTW92ZU1lbW9yeShjdXN0b20rMTcsIHBBZC0+U3RhQ2ZnLlJlcVZhcklFcywgcEFkLT5TdGFDZmcuUmVxVmFySUVMZW4pOwotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX1JFUUlFX0VWRU5UX0ZMQUcsIE5VTEwsIChQVUNIQVIpY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3KTsKLQotCQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIElXRVZDVVNUT00sIFJUX0FTU09DSU5GT19FVkVOVF9GTEFHLCBOVUxMLCBOVUxMLCAwKTsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiArIDE3ID4gTUFYX0NVU1RPTV9MRU5cbiIpKTsKLQotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi1pbnQgd2V4dF9ub3RpZnlfZXZlbnRfYXNzb2MoCi0JSU4gIFJUTVBfQURBUFRFUiAqcEFkKQotewotCWNoYXIgY3VzdG9tW0lXX0NVU1RPTV9NQVhdID0gezB9OwotCi0jaWYgV0lSRUxFU1NfRVhUID4gMTcKLQlpZiAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4gPD0gSVdfQ1VTVE9NX01BWCkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgcEFkLT5TdGFDZmcuUmVxVmFySUVzLCBwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbik7Ci0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkFTU09DUkVRSUUsIC0xLCBOVUxMLCBjdXN0b20sIHBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuKTsKLQl9Ci0JZWxzZQotCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJwQWQtPlN0YUNmZy5SZXFWYXJJRUxlbiA+IE1BWF9DVVNUT01fTEVOXG4iKSk7Ci0jZWxzZQotCWludCBsZW47Ci0KLQlsZW4gPSAocEFkLT5TdGFDZmcuUmVxVmFySUVMZW4qMikgKyAxNzsKLQlpZiAobGVuIDw9IElXX0NVU1RPTV9NQVgpCi0JewotCQlVQ0hBUiAgIGlkeDsKLQkJc3ByaW50ZihjdXN0b20sICJBU1NPQ0lORk8oUmVxSUVzPSIpOwotCQlmb3IgKGlkeD0wOyBpZHg8cEFkLT5TdGFDZmcuUmVxVmFySUVMZW47IGlkeCsrKQotCQkgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWQtPlN0YUNmZy5SZXFWYXJJRXNbaWR4XSk7Ci0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgLTEsIE5VTEwsIGN1c3RvbSwgbGVuKTsKLQl9Ci0JZWxzZQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJsZW4oJWQpID4gTUFYX0NVU1RPTV9MRU5cbiIsIGxlbikpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLQotfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQotQk9PTEVBTiBTdGFBZGRNYWNUYWJsZUVudHJ5KAotCUlOICBQUlRNUF9BREFQVEVSCQlwQWQsCi0JSU4gIFBNQUNfVEFCTEVfRU5UUlkJcEVudHJ5LAotCUlOICBVQ0hBUgkJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzLAotCUlOICBIVF9DQVBBQklMSVRZX0lFCSpwSHRDYXBhYmlsaXR5LAotCUlOICBVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4sCi0JSU4gIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywKLQlJTiAgVUNIQVIJCQkJQWRkSHRJbmZvTGVuLAotCUlOICBVU0hPUlQJCQlDYXBhYmlsaXR5SW5mbykKLXsKLQlVQ0hBUiAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCi0JaWYgKEFESE9DX09OKHBBZCkpCi0JCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQotCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKLSAgICB7Ci0gICAgICAgIGNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKLSAgICAgICAgY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDcyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMzY7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKLSAgICAgICAgY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTI7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKLSAgICAgICAgY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTsgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKE1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCS8vIDExbiBvbmx5Ci0JaWYgKCgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFOXzJfNEcpIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMU5fNUcpKSYmIChIdENhcGFiaWxpdHlMZW4gPT0gMCkpCi0JCXJldHVybiBGQUxTRTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCWlmICghcEVudHJ5KQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCWlmIChwRW50cnkpCi0JewotCQlwRW50cnktPlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCWlmICgoTWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKSB8fAotCQkJKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikpCi0JCXsKLQkJCXBFbnRyeS0+UmF0ZUxlbiA9IDQ7Ci0JCQlpZiAoTWF4U3VwcG9ydGVkUmF0ZSA+PSBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJCQlNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKLQkJfQotCQllbHNlCi0JCQlwRW50cnktPlJhdGVMZW4gPSAxMjsKLQotCQlwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gMDsKLQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUud29yZCA9IDA7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSAwOwotCQlwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPSBNYXhTdXBwb3J0ZWRSYXRlOwotCQlpZiAocEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlIDwgUkFURV9GSVJTVF9PRkRNX1JBVEUpCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJfQotCQlwRW50cnktPkNhcGFiaWxpdHlJbmZvID0gQ2FwYWJpbGl0eUluZm87Ci0JCUNMSUVOVF9TVEFUVVNfQ0xFQVJfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FHR1JFR0FUSU9OX0NBUEFCTEUpOwotCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19QSUdHWUJBQ0tfQ0FQQUJMRSk7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTmRpc1plcm9NZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCBzaXplb2YocEVudHJ5LT5IVENhcGFiaWxpdHkpKTsKLQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KLQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQl7Ci0JCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOwotCQlDSEFSICAgIGk7Ci0KLQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCQlpZiAoKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUR1JFRU5GSUVMRDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb25Ob25HRiA9IFRSVUU7Ci0JCQlwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSAxOwotCQl9Ci0KLQkJaWYgKChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5DaGFubmVsV2lkdGgpICYmCi0JCQkoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKSB8fCAoKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKSAmJiAocEFkZEh0SW5mby0+QWRkSHRJbmZvLkV4dENoYW5PZmZzZXQgPT0gcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0KSkpKQotCQl7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjQwKSYocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKSk7Ci0JCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7Ci0JCX0KLQotCQkvLyAzKjMKLQkJaWYgKHBBZC0+TUFDVmVyc2lvbiA+PSBSQUxJTktfMjg4M19WRVJTSU9OICYmIHBBZC0+TUFDVmVyc2lvbiA8IFJBTElOS18zMDcwX1ZFUlNJT04pCi0JCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5UeEJGID0gcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLlR4QkY7Ci0KLQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQotCQlmb3IgKGk9MjM7IGk+PTA7IGktLSkgLy8gMyozCi0JCXsKLQkJCWogPSBpLzg7Ci0JCQliaXRtYXNrID0gKDE8PChpLShqKjgpKSk7Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkRlc2lyZWRIdFBoeUluZm8uTUNTU2V0W2pdICYgYml0bWFzaykgJiYgKHBIdENhcGFiaWxpdHktPk1DU1NldFtqXSAmIGJpdG1hc2spKQotCQkJewotCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoaT09MCkKLQkJCQlicmVhazsKLQkJfQotCi0KLQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCi0JCQl7Ci0JCQkJLy8gRml4IE1DUyBhcyBIVCBEdXBsaWNhdGVkIE1vZGUKLQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7Ci0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IDA7Ci0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7Ci0JCQl9Ci0JCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJewotCQkJCS8vIFNUQSBzdXBwb3J0cyBmaXhlZCBNQ1MKLQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJfQotCQl9Ci0KLQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKLQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IHBIdENhcGFiaWxpdHktPkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBwSHRDYXBhYmlsaXR5LT5IdENhcFBhcm0uTWF4UkFtcGR1RmFjdG9yOwotCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5NaW1vUHM7Ci0JCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKXBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5BTXNkdVNpemU7Ci0JCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUgJiYgKHBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPT0gRkFMU0UpKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX0FNU0RVX0lOVVNFRCk7Ci0JCWlmIChwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwotCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKLQkJaWYgKHBIdENhcGFiaWxpdHktPkh0Q2FwSW5mby5UeFNUQkMpCi0JCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOwotCQlpZiAocEh0Q2FwYWJpbGl0eS0+SHRDYXBJbmZvLlJ4U1RCQykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JCWlmIChwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8uUGx1c0hUQykKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKLQkJaWYgKHBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOwotCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksIHBIdENhcGFiaWxpdHksIEh0Q2FwYWJpbGl0eUxlbik7Ci0JfQotCWVsc2UKLQl7Ci0JCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uSXNMZWdhY3kgPSBUUlVFOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwotCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQotCS8vIFNldCBhc2ljIGF1dG8gZmFsbCBiYWNrCi0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IFRSVUUpCi0JewotCQlQVUNIQVIJCQkJCXBUYWJsZTsKLQkJVUNIQVIJCQkJCVRhYmxlU2l6ZSA9IDA7Ci0KLQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOwotCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQlwRW50cnktPmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0KLQkJLy8gSWYgdGhlIGxlZ2FjeSBtb2RlIGlzIHNldCwgb3ZlcndyaXRlIHRoZSB0cmFuc21pdCBzZXR0aW5nIG9mIHRoaXMgZW50cnkuCi0JCVJUTVBVcGRhdGVMZWdhY3lUeFNldHRpbmcoKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuRml4ZWRUeE1vZGUsIHBFbnRyeSk7Ci0JfQotCi0JcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOwotCXBFbnRyeS0+QXV0aFN0YXRlID0gQVNfQVVUSF9PUEVOOwotCXBFbnRyeS0+QXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKLSAgICB7Ci0gICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgICAgd3JxdTsKLQotICAgICAgICBTZW5kQXNzb2NJRXNUb1dwYVN1cHBsaWNhbnQocEFkKTsKLSAgICAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotICAgICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9BU1NPQ19FVkVOVF9GTEFHOwotICAgICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBBZC0+bmV0X2RldiwgSVdFVkNVU1RPTSwgJndycXUsIE5VTEwpOwotICAgIH0KLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgewotICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICAgIHdycXU7Ci0gICAgICAgIHdleHRfbm90aWZ5X2V2ZW50X2Fzc29jKHBBZCk7Ci0KLSAgICAgICAgbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBNQUNfQUREUl9MRU4pOwotICAgICAgICBtZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLSAgICAgICAgd2lyZWxlc3Nfc2VuZF9ldmVudChwQWQtPm5ldF9kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotCi0gICAgfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1N2UyOTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvYXV0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0JYXV0aC5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC05LTMJCXBvcnRpbmcgZnJvbSBSVDI1MDAKLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIGF1dGhlbnRpY2F0ZSBzdGF0ZSBtYWNoaW5lIGluaXQsIGluY2x1ZGluZyBzdGF0ZSB0cmFuc2l0aW9uIGFuZCB0aW1lciBpbml0Ci0gICAgUGFyYW1ldGVyczoKLSAgICAgICAgU20gLSBwb2ludGVyIHRvIHRoZSBhdXRoIHN0YXRlIG1hY2hpbmUKLSAgICBOb3RlOgotICAgICAgICBUaGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoaXMKLQotICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9SRVFfSURMRSAgICAgICAgICAgQVVUSF9XQUlUX1NFUTIgICAgICAgICAgICAgICAgICAgQVVUSF9XQUlUX1NFUTQKLSAgICBNVDJfTUxNRV9BVVRIX1JFUSAgIG1sbWVfYXV0aF9yZXFfYWN0aW9uICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoICAgICAgICAgIGludmFsaWRfc3RhdGVfd2hlbl9hdXRoCi0gICAgTVQyX1BFRVJfQVVUSF9FVkVOICBkcm9wICAgICAgICAgICAgICAgICAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXEyX2FjdGlvbiAgICBwZWVyX2F1dGhfZXZlbl9hdF9zZXE0X2FjdGlvbgotICAgIE1UMl9BVVRIX1RJTUVPVVQgICAgRHJvcCAgICAgICAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbiAgICAgICAgICAgICAgYXV0aF90aW1lb3V0X2FjdGlvbgotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotdm9pZCBBdXRoU3RhdGVNYWNoaW5lSW5pdCgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBTVEFURV9NQUNISU5FICpTbSwKLSAgICBPVVQgU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCi17Ci0gICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1NUQVRFLCBNQVhfQVVUSF9NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgQVVUSF9SRVFfSURMRSwgQVVUSF9NQUNISU5FX0JBU0UpOwotCi0gICAgLy8gdGhlIGZpcnN0IGNvbHVtbgotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgQVVUSF9SRVFfSURMRSwgTVQyX01MTUVfQVVUSF9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZUF1dGhSZXFBY3Rpb24pOwotCi0gICAgLy8gdGhlIHNlY29uZCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRMiwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXEyQWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVEyLCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKLQotICAgIC8vIHRoZSB0aGlyZCBjb2x1bW4KLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfTUxNRV9BVVRIX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuQXV0aCk7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1dBSVRfU0VRNCwgTVQyX1BFRVJfQVVUSF9FVkVOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfV0FJVF9TRVE0LCBNVDJfQVVUSF9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKUF1dGhUaW1lb3V0QWN0aW9uKTsKLQotCVJUTVBJbml0VGltZXIocEFkLCAmcEFkLT5NbG1lQXV4LkF1dGhUaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEF1dGhUaW1lb3V0KSwgcEFkLCBGQUxTRSk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGltZXIgdGhyZWFkIHdoZW4gYXV0aCB0aW1lciBleHBpcmVzCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXV0aFRpbWVvdXQoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotICAgIFJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSCAtIEF1dGhUaW1lb3V0XG4iKSk7Ci0KLQkvLyBEbyBub3RoaW5nIGlmIHRoZSBkcml2ZXIgaXMgc3RhcnRpbmcgaGFsdCBzdGF0ZS4KLQkvLyBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIHRpbWVyIGFscmVhZHkgYmVlbiBmaXJlZCBiZWZvcmUgY2FuY2VsIHRpbWVyIHdpdGggbWxtZWhhbHQKLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MgfCBmUlRNUF9BREFQVEVSX05JQ19OT1RfRVhJU1QpKQotCQlyZXR1cm47Ci0KLQkvLyBzZW5kIGEgZGUtYXV0aCB0byByZXNldCBBUCdzIHN0YXRlIG1hY2hpbmUgKFBhdGNoIEFQLURpcjYzNSkKLQlpZiAocEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9PSBBVVRIX1dBSVRfU0VRMikKLQkJQ2xzMmVyckFjdGlvbihwQWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0KLQotICAgIE1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9USU1FT1VULCAwLCBOVUxMKTsKLSAgICBSVE1QX01MTUVfSEFORExFUihwQWQpOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lQXV0aFJlcUFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JaWYgKEFVVEhfUmVxU2VuZChwQWQsIEVsZW0sICZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAiQVVUSCIsIDEsIE5VTEwsIDApKQotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTI7Ci0gICAgZWxzZQotICAgIHsKLQkJVVNIT1JUIFN0YXR1czsKLQotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9JTlZBTElEX0ZPUk1BVDsKLSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckF1dGhSc3BBdFNlcTJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotICAgIFVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICAgIFNlcSwgU3RhdHVzLCBSZW1vdGVTdGF0dXMsIEFsZzsKLSAgICBVQ0hBUiAgICAgICAgIENobGdUZXh0W0NJUEhFUl9URVhUX0xFTl07Ci0gICAgVUNIQVIgICAgICAgICBDeXBlckNobGdUZXh0W0NJUEhFUl9URVhUX0xFTiArIDggKyA4XTsKLSAgICBVQ0hBUiAgICAgICAgIEVsZW1lbnRbMl07Ci0gICAgSEVBREVSXzgwMl8xMSBBdXRoSGRyOwotICAgIEJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0gICAgUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLSAgICBORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0gICAgVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgVVNIT1JUICAgICAgICBTdGF0dXMyOwotCi0gICAgaWYgKFBlZXJBdXRoU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIEFkZHIyLCAmQWxnLCAmU2VxLCAmU3RhdHVzLCAoUENIQVIpQ2hsZ1RleHQpKQotICAgIHsKLSAgICAgICAgaWYgKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjMiB0byBtZSAoQWxnPSVkLCBTdGF0dXM9JWQpXG4iLCBBbGcsIFN0YXR1cykpOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0gICAgICAgICAgICBpZiAoU3RhdHVzID09IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBdXRoZW50aWNhdGlvbiBNb2RlICJMRUFQIiBoYXMgYWxsb3cgZm9yIENDWCAxLlgKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5NbG1lQXV4LkFsZyA9PSBOZGlzODAyXzExQXV0aE1vZGVPcGVuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAyLiBzaGFyZWQga2V5LCBuZWVkIHRvIGJlIGNoYWxsZW5nZWQKLSAgICAgICAgICAgICAgICAgICAgU2VxKys7Ci0gICAgICAgICAgICAgICAgICAgIFJlbW90ZVN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKLQotCQkJCQkvLyBHZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBpZihOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBQZWVyQXV0aFJzcEF0U2VxMkFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czIgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gU2VuZCBBVVRIIHJlcXVlc3Qgc2VxIzMuLi5cbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIEFkZHIyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgICAgICAgICAgICAgICAgICBBdXRoSGRyLkZDLldlcCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgY2hhbGxlbmdlIHRleHQgJiBhdXRoIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIFJUTVBJbml0V2VwRW5naW5lKAotCQkJcEFkLAotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0JCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKLQkJCUN5cGVyQ2hsZ1RleHQpOwotCi0JCQkJCUFsZyA9IGNwdTJsZTE2KCooVVNIT1JUICopJkFsZyk7Ci0JCQkJCVNlcSA9IGNwdTJsZTE2KCooVVNIT1JUICopJlNlcSk7Ci0JCQkJCVJlbW90ZVN0YXR1cz0gY3B1MmxlMTYoKihVU0hPUlQgKikmUmVtb3RlU3RhdHVzKTsKLQotCQkJCQlSVE1QRW5jcnlwdERhdGEocEFkLCAoUFVDSEFSKSAmQWxnLCBDeXBlckNobGdUZXh0ICsgNCwgMik7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIChQVUNIQVIpICZTZXEsIEN5cGVyQ2hsZ1RleHQgKyA2LCAyKTsKLQkJCQkJUlRNUEVuY3J5cHREYXRhKHBBZCwgKFBVQ0hBUikgJlJlbW90ZVN0YXR1cywgQ3lwZXJDaGxnVGV4dCArIDgsIDIpOwotCQkJCQlFbGVtZW50WzBdID0gMTY7Ci0JCQkJCUVsZW1lbnRbMV0gPSAxMjg7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIEVsZW1lbnQsIEN5cGVyQ2hsZ1RleHQgKyAxMCwgMik7Ci0JCQkJCVJUTVBFbmNyeXB0RGF0YShwQWQsIENobGdUZXh0LCBDeXBlckNobGdUZXh0ICsgMTIsIDEyOCk7Ci0JCQkJCVJUTVBTZXRJQ1YocEFkLCBDeXBlckNobGdUZXh0ICsgMTQwKTsKLSAgICAgICAgICAgICAgICAgICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIRUFERVJfODAyXzExKSwgICAgJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9URVhUX0xFTiArIDE2LCAgICAgQ3lwZXJDaGxnVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgICAgICAgICAgICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCBBVVRIX1RJTUVPVVQpOwotICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9XQUlUX1NFUTQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkF1dGhGYWlsUmVhc29uID0gU3RhdHVzOwotICAgICAgICAgICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuQXV0aEZhaWxTdGEsIEFkZHIyKTsKLSAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgICAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUGVlckF1dGhTYW5pdHkoKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwotICAgIH0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBVQ0hBUiAgICAgICAgIEFkZHIyW01BQ19BRERSX0xFTl07Ci0gICAgVVNIT1JUICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOwotICAgIENIQVIgICAgICAgICAgQ2hsZ1RleHRbQ0lQSEVSX1RFWFRfTEVOXTsKLSAgICBCT09MRUFOICAgICAgIFRpbWVyQ2FuY2VsbGVkOwotCi0gICAgaWYoUGVlckF1dGhTYW5pdHkocEFkLCBFbGVtLT5Nc2csIEVsZW0tPk1zZ0xlbiwgQWRkcjIsICZBbGcsICZTZXEsICZTdGF0dXMsIENobGdUZXh0KSkKLSAgICB7Ci0gICAgICAgIGlmKE1BQ19BRERSX0VRVUFMKHBBZC0+TWxtZUF1eC5Cc3NpZCwgQWRkcjIpICYmIFNlcSA9PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gUmVjZWl2ZSBBVVRIX1JTUCBzZXEjNCB0byBtZVxuIikpOwotICAgICAgICAgICAgUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0gICAgICAgICAgICBpZiAoU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5BdXRoRmFpbFJlYXNvbiA9IFN0YXR1czsKLSAgICAgICAgICAgICAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkF1dGhGYWlsU3RhLCBBZGRyMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIFBlZXJBdXRoUnNwQXRTZXE0QWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBNbG1lRGVhdXRoUmVxQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICpwSW5mbzsKLSAgICBIRUFERVJfODAyXzExIERlYXV0aEhkcjsKLSAgICBQVUNIQVIgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotICAgIE5ESVNfU1RBVFVTICAgTlN0YXR1czsKLSAgICBVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLSAgICBVU0hPUlQgICAgICAgIFN0YXR1czsKLQotICAgIHBJbmZvID0gKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgKilFbGVtLT5Nc2c7Ci0KLSAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJBVVRIIC0gTWxtZURlYXV0aFJlcUFjdGlvbigpIGFsbG9jYXRlIG1lbW9yeSBmYWlsXG4iKSk7Ci0gICAgICAgIHBBZC0+TWxtZS5BdXRoTWFjaGluZS5DdXJyU3RhdGUgPSBBVVRIX1JFUV9JRExFOwotICAgICAgICBTdGF0dXMgPSBNTE1FX0ZBSUxfTk9fUkVTT1VSQ0U7Ci0gICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBTZW5kIERFLUFVVEggcmVxdWVzdCAoUmVhc29uPSVkKS4uLlxuIiwgcEluZm8tPlJlYXNvbikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEluZm8tPkFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJnBJbmZvLT5SZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgRU5EX09GX0FSR1MpOwotICAgIE1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLSAgICBwQWQtPlN0YUNmZy5EZWF1dGhSZWFzb24gPSBwSW5mby0+UmVhc29uOwotICAgIENPUFlfTUFDX0FERFIocEFkLT5TdGFDZmcuRGVhdXRoU3RhLCBwSW5mby0+QWRkcik7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9TVUNDRVNTOwotICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9ERUFVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0KLQkvLyBzZW5kIHdpcmVsZXNzIGV2ZW50IC0gZm9yIGRlYXV0aGVudGljYXRpb24KLQlpZiAocEFkLT5Db21tb25DZmcuYldpcmVsZXNzRXZlbnQpCi0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXV0aFRpbWVvdXRBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotICAgIFVTSE9SVCBTdGF0dXM7Ci0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVVUSCAtIEF1dGhUaW1lb3V0QWN0aW9uXG4iKSk7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9SRUpfVElNRU9VVDsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEludmFsaWRTdGF0ZVdoZW5BdXRoKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLSAgICBVU0hPUlQgU3RhdHVzOwotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBJbnZhbGlkU3RhdGVXaGVuQXV0aCAoc3RhdGU9JWxkKSwgcmVzZXQgQVVUSCBzdGF0ZSBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlKSk7Ci0gICAgcEFkLT5NbG1lLkF1dGhNYWNoaW5lLkN1cnJTdGF0ZSA9IEFVVEhfUkVRX0lETEU7Ci0gICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLSAgICBNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfQVVUSF9DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTb21lIFNUQS9BUAotICAgIE5vdGU6Ci0gICAgICAgIFRoaXMgYWN0aW9uIHNob3VsZCBuZXZlciB0cmlnZ2VyIEFVVEggc3RhdGUgdHJhbnNpdGlvbiwgdGhlcmVmb3JlIHdlCi0gICAgICAgIHNlcGFyYXRlIGl0IGZyb20gQVVUSCBzdGF0ZSBtYWNoaW5lLCBhbmQgbWFrZSBpdCBhcyBhIHN0YW5kYWxvbmUgc2VydmljZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIENsczJlcnJBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFVDSEFSIHBBZGRyKQotewotICAgIEhFQURFUl84MDJfMTEgRGVhdXRoSGRyOwotICAgIFBVQ0hBUiAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICBOU3RhdHVzOwotICAgIFVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotICAgIFVTSE9SVCAgICAgICAgUmVhc29uID0gUkVBU09OX0NMUzJFUlI7Ci0KLSAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFVVEggLSBDbGFzcyAyIGVycm9yLCBTZW5kIERFQVVUSCBmcmFtZS4uLlxuIikpOwotICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmRGVhdXRoSGRyLCBTVUJUWVBFX0RFQVVUSCwgMCwgcEFkZHIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkRlYXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQotICAgIHBBZC0+U3RhQ2ZnLkRlYXV0aFJlYXNvbiA9IFJlYXNvbjsKLSAgICBDT1BZX01BQ19BRERSKHBBZC0+U3RhQ2ZnLkRlYXV0aFN0YSwgcEFkZHIpOwotfQotCi1CT09MRUFOCUFVVEhfUmVxU2VuZCgKLQlJTiAgUFJUTVBfQURBUFRFUgkJcEFkLAotCUlOICBQTUxNRV9RVUVVRV9FTEVNCXBFbGVtLAotCUlOICBQUkFMSU5LX1RJTUVSX1NUUlVDVCBwQXV0aFRpbWVyLAotCUlOICBQU1RSSU5HCQkJCXBTTU5hbWUsCi0JSU4gIFVTSE9SVAkJCQlTZXFObywKLQlJTiAgUFVDSEFSCQkJCXBOZXdFbGVtZW50LAotCUlOICBVTE9ORwkJCQlFbGVtZW50TGVuKQotewotCVVTSE9SVCAgICAgICAgICAgICBBbGcsIFNlcSwgU3RhdHVzOwotCVVDSEFSICAgICAgICAgICAgICBBZGRyWzZdOwotICAgIFVMT05HICAgICAgICAgICAgICBUaW1lb3V0OwotICAgIEhFQURFUl84MDJfMTEgICAgICBBdXRoSGRyOwotICAgIEJPT0xFQU4gICAgICAgICAgICBUaW1lckNhbmNlbGxlZDsKLSAgICBORElTX1NUQVRVUyAgICAgICAgTlN0YXR1czsKLSAgICBQVUNIQVIgICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgVUxPTkcgICAgICAgICAgICAgIEZyYW1lTGVuID0gMCwgdG1wID0gMDsKLQotCS8vIEJsb2NrIGFsbCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGR1cm5pbmcgV1BBIGJsb2NrIHBlcmlvZAotCWlmIChwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9PSBUUlVFKQotCXsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSBCbG9jayBBdXRoIHJlcXVlc3QgZHVybmluZyBXUEEgYmxvY2sgcGVyaW9kIVxuIiwgcFNNTmFtZSkpOwotICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLSAgICAgICAgTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0FVVEhfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotICAgIGVsc2UgaWYoTWxtZUF1dGhSZXFTYW5pdHkocEFkLCBwRWxlbS0+TXNnLCBwRWxlbS0+TXNnTGVuLCBBZGRyLCAmVGltZW91dCwgJkFsZykpCi0gICAgewotCS8qIHJlc2V0IHRpbWVyICovCi0JCVJUTVBDYW5jZWxUaW1lcihwQXV0aFRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0gICAgICAgIENPUFlfTUFDX0FERFIocEFkLT5NbG1lQXV4LkJzc2lkLCBBZGRyKTsKLSAgICAgICAgcEFkLT5NbG1lQXV4LkFsZyAgPSBBbGc7Ci0gICAgICAgIFNlcSA9IFNlcU5vOwotICAgICAgICBTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0KLSAgICAgICAgTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICAgICAgaWYoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlcyAtIE1sbWVBdXRoUmVxQWN0aW9uKEFsZzolZCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZFxuIiwgcFNNTmFtZSwgQWxnKSk7Ci0gICAgICAgICAgICBwQWQtPk1sbWUuQXV0aE1hY2hpbmUuQ3VyclN0YXRlID0gQVVUSF9SRVFfSURMRTsKLSAgICAgICAgICAgIFN0YXR1cyA9IE1MTUVfRkFJTF9OT19SRVNPVVJDRTsKLSAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9BVVRIX0NPTkYsIDIsICZTdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXMgLSBTZW5kIEFVVEggcmVxdWVzdCBzZXEjMSAoQWxnPSVkKS4uLlxuIiwgcFNNTmFtZSwgQWxnKSk7Ci0gICAgICAgIE1ndE1hY0hlYWRlckluaXQocEFkLCAmQXV0aEhkciwgU1VCVFlQRV9BVVRILCAwLCBBZGRyLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotICAgICAgICBNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLCAgICAgICAgICAgJkZyYW1lTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEVBREVSXzgwMl8xMSksJkF1dGhIZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAmQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgJlNlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCQlpZiAocE5ld0VsZW1lbnQgJiYgRWxlbWVudExlbikKLQkJewotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlcitGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCQkgIEVsZW1lbnRMZW4sCQkJcE5ld0VsZW1lbnQsCi0JCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSB0bXA7Ci0JCX0KLQotICAgICAgICBNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JCVJUTVBTZXRUaW1lcihwQXV0aFRpbWVyLCBUaW1lb3V0KTsKLQkJcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UX0VSUigoIiVzIC0gTWxtZUF1dGhSZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbGVkXG4iLCBwU01OYW1lKSk7Ci0JCXJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2F1dGhfcnNwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9hdXRoX3JzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDdiZmVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL2F1dGhfcnNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlhdXRoX3JzcC5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obgkJMjAwNC0xMC0xCQljb3B5IGZyb20gUlQyNTYwCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBhdXRoZW50aWNhdGlvbiBzdGF0ZSBtYWNoaW5lIGluaXQgcHJvY2VkdXJlCi0gICAgUGFyYW1ldGVyczoKLSAgICAgICAgU20gLSB0aGUgc3RhdGUgbWFjaGluZQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgQXV0aFJzcFN0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUFNUQVRFX01BQ0hJTkUgU20sCi0gICAgSU4gU1RBVEVfTUFDSElORV9GVU5DIFRyYW5zW10pCi17Ci0gICAgU3RhdGVNYWNoaW5lSW5pdChTbSwgVHJhbnMsIE1BWF9BVVRIX1JTUF9TVEFURSwgTUFYX0FVVEhfUlNQX01TRywgKFNUQVRFX01BQ0hJTkVfRlVOQylEcm9wLCBBVVRIX1JTUF9JRExFLCBBVVRIX1JTUF9NQUNISU5FX0JBU0UpOwotCi0gICAgLy8gY29sdW1uIDEKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIEFVVEhfUlNQX0lETEUsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKLQotICAgIC8vIGNvbHVtbiAyCi0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBBVVRIX1JTUF9XQUlUX0NIQUwsIE1UMl9QRUVSX0RFQVVUSCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGVhdXRoQWN0aW9uKTsKLQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBQZWVyQXV0aFNpbXBsZVJzcEdlbkFuZFNlbmQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gUEhFQURFUl84MDJfMTEgcEhkcjgwMjExLAotICAgIElOIFVTSE9SVCBBbGcsCi0gICAgSU4gVVNIT1JUIFNlcSwKLSAgICBJTiBVU0hPUlQgUmVhc29uLAotICAgIElOIFVTSE9SVCBTdGF0dXMpCi17Ci0gICAgSEVBREVSXzgwMl8xMSAgICAgQXV0aEhkcjsKLSAgICBVTE9ORyAgICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0gICAgUFVDSEFSICAgICAgICAgICAgcE91dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTkRJU19TVEFUVVMgICAgICAgTlN0YXR1czsKLQotICAgIGlmIChSZWFzb24gIT0gTUxNRV9TVUNDRVNTKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlciBBVVRIIGZhaWwuLi5cbiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotCS8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLSAgICBOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotICAgIGlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybjsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgQVVUSCByZXNwb25zZSAoc2VxIzIpLi4uXG4iKSk7Ci0gICAgTWd0TWFjSGVhZGVySW5pdChwQWQsICZBdXRoSGRyLCBTVUJUWVBFX0FVVEgsIDAsIHBIZHI4MDIxMS0+QWRkcjIsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0gICAgTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAmQXV0aEhkciwKLSAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICZBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAmU2VxLAotICAgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgJlJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0gICAgTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgUGVlckRlYXV0aEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBQTUxNRV9RVUVVRV9FTEVNIEVsZW0pCi17Ci0gICAgVUNIQVIgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLSAgICBVU0hPUlQgICAgICBSZWFzb247Ci0KLSAgICBpZiAoUGVlckRlYXV0aFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgJlJlYXNvbikpCi0gICAgewotICAgICAgICBpZiAoSU5GUkFfT04ocEFkKQotCQkJJiYgTUFDX0FERFJfRVFVQUwoQWRkcjIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKQotCQkJKQotICAgICAgICB7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkFVVEhfUlNQIC0gcmVjZWl2ZSBERS1BVVRIIGZyb20gb3VyIEFQIChSZWFzb249JWQpXG4iLCBSZWFzb24pKTsKLQotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBTSU9DR0lXQVAsIC0xLCBOVUxMLCBOVUxMLCAwKTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0KLQkJCS8vIHNlbmQgd2lyZWxlc3MgZXZlbnQgLSBmb3IgZGVhdXRoZW50aWNhdGlvbgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0RFQVVUSF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCi0gICAgICAgICAgICBMaW5rRG93bihwQWQsIFRSVUUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQVVUSF9SU1AgLSBQZWVyRGVhdXRoQWN0aW9uKCkgc2FuaXR5IGNoZWNrIGZhaWxcbiIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9jb25uZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9jb25uZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTM1ZWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvY29ubmVjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1OSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCWNvbm5lY3QuYwotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUpvaG4JCQkyMDA0LTA4LTA4CQkJTWFqb3IgbW9kaWZpY2F0aW9uIGZyb20gUlQyNTYwCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotVUNIQVIJQ2lwaGVyU3VpdGVXcGFOb25lVGtpcFtdID0gewotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDAyLAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZVRraXBMZW4gPSAoc2l6ZW9mKENpcGhlclN1aXRlV3BhTm9uZVRraXApIC8gc2l6ZW9mKFVDSEFSKSk7Ci0KLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZUFlc1tdID0gewotCQkweDAwLCAweDUwLCAweGYyLCAweDAxLAkvLyBvdWkKLQkJMHgwMSwgMHgwMCwJCQkJLy8gVmVyc2lvbgotCQkweDAwLCAweDUwLCAweGYyLCAweDA0LAkvLyBNdWx0aWNhc3QKLQkJMHgwMSwgMHgwMCwJCQkJLy8gTnVtYmVyIG9mIHVuaWNhc3QKLQkJMHgwMCwgMHg1MCwgMHhmMiwgMHgwNCwJLy8gdW5pY2FzdAotCQkweDAxLCAweDAwLAkJCQkvLyBudW1iZXIgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kCi0JCTB4MDAsIDB4NTAsIDB4ZjIsIDB4MDAJLy8gYXV0aGVudGljYXRpb24KLQkJfTsKLVVDSEFSCUNpcGhlclN1aXRlV3BhTm9uZUFlc0xlbiA9IChzaXplb2YoQ2lwaGVyU3VpdGVXcGFOb25lQWVzKSAvIHNpemVvZihVQ0hBUikpOwotCi0vLyBUaGUgZm9sbG93aW5nIE1BQ1JPIGlzIGNhbGxlZCBhZnRlciAxLiBzdGFydGluZyBhbiBuZXcgSUJTUywgMi4gc3VjY2VzZnVsbHkgSk9JTiBhbiBJQlNTLAotLy8gb3IgMy4gc3VjY2VzZnVsbHkgQVNTT0NJQVRFIHRvIGEgQlNTLCA0LiBzdWNjZXNzZnVsbHkgUkVfQVNTT0NJQVRFIHRvIGEgQlNTCi0vLyBBbGwgc2V0dGluZ3Mgc3VjY2Vzc2Z1bHkgbmVnb3RpYXRlZCBmdXJpbmcgTUxNRSBzdGF0ZSBtYWNoaW5lcyBiZWNvbWUgZmluYWwgc2V0dGluZ3MKLS8vIGFuZCBhcmUgY29waWVkIHRvIHBBZC0+U3RhQWN0aXZlCi0jZGVmaW5lIENPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKF9wQWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlOZGlzWmVyb01lbW9yeSgoX3BBZCktPkNvbW1vbkNmZy5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwkJCQkJCQlcCi0JKF9wQWQpLT5Db21tb25DZmcuU3NpZExlbiA9IChfcEFkKS0+TWxtZUF1eC5Tc2lkTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+Q29tbW9uQ2ZnLlNzaWQsIChfcEFkKS0+TWxtZUF1eC5Tc2lkLCAoX3BBZCktPk1sbWVBdXguU3NpZExlbik7IFwKLQlDT1BZX01BQ19BRERSKChfcEFkKS0+Q29tbW9uQ2ZnLkJzc2lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpOyAgICAgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5Db21tb25DZmcuQ2hhbm5lbCA9IChfcEFkKS0+TWxtZUF1eC5DaGFubmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gKF9wQWQpLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsOyAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPlN0YUFjdGl2ZS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5TdGFBY3RpdmUuQXRpbVdpbiA9IChfcEFkKS0+TWxtZUF1eC5BdGltV2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+U3RhQWN0aXZlLkNhcGFiaWxpdHlJbmZvID0gKF9wQWQpLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvOyAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoX3BBZCktPk1sbWVBdXguQmVhY29uUGVyaW9kOyAgICAgICAgICAgICAgICAgICAgICBcCi0JKF9wQWQpLT5TdGFBY3RpdmUuQ2ZwTWF4RHVyYXRpb24gPSAoX3BBZCktPk1sbWVBdXguQ2ZwTWF4RHVyYXRpb247ICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+U3RhQWN0aXZlLkNmcFBlcmlvZCA9IChfcEFkKS0+TWxtZUF1eC5DZnBQZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JTmRpc01vdmVNZW1vcnkoKF9wQWQpLT5TdGFBY3RpdmUuU3VwUmF0ZSwgKF9wQWQpLT5NbG1lQXV4LlN1cFJhdGUsIChfcEFkKS0+TWxtZUF1eC5TdXBSYXRlTGVuKTtcCi0JKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiA9IChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCU5kaXNNb3ZlTWVtb3J5KChfcEFkKS0+U3RhQWN0aXZlLkV4dFJhdGUsIChfcEFkKS0+TWxtZUF1eC5FeHRSYXRlLCAoX3BBZCktPk1sbWVBdXguRXh0UmF0ZUxlbik7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUEVkY2FQYXJtLCAmKF9wQWQpLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTtcCi0JTmRpc01vdmVNZW1vcnkoJihfcEFkKS0+Q29tbW9uQ2ZnLkFQUW9zQ2FwYWJpbGl0eSwgJihfcEFkKS0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7XAotCU5kaXNNb3ZlTWVtb3J5KCYoX3BBZCktPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmKF9wQWQpLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpO1wKLQlDT1BZX01BQ19BRERSKChfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgKF9wQWQpLT5NbG1lQXV4LkJzc2lkKTsgICAgICBcCi0JKF9wQWQpLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BaWQgPSAoX3BBZCktPk1sbWVBdXguQWlkOyAgICAgICAgICAgICAgICAgICAgICAgXAotCShfcEFkKS0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gKF9wQWQpLT5TdGFDZmcuUGFpckNpcGhlcjtcCi0JQ09QWV9NQUNfQUREUigoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBhaXJ3aXNlS2V5LkJzc0lkLCAoX3BBZCktPk1sbWVBdXguQnNzaWQpO1wKLQkoX3BBZCktPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlJhdGVMZW4gPSAoX3BBZCktPlN0YUFjdGl2ZS5TdXBSYXRlTGVuICsgKF9wQWQpLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbjtcCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgTWxtZUNudGxJbml0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCS8vIENvbnRyb2wgc3RhdGUgbWFjaGluZSBkaWZmZXJzIGZyb20gb3RoZXIgc3RhdGUgbWFjaGluZXMsIHRoZSBpbnRlcmZhY2UKLQkvLyBmb2xsb3dzIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UKLQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBNbG1lQ250bE1hY2hpbmVQZXJmb3JtQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFNUQVRFX01BQ0hJTkUgKlMsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCXN3aXRjaChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlKQotCXsKLQkJY2FzZSBDTlRMX0lETEU6Ci0JCQlDbnRsSWRsZVByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIENOVExfV0FJVF9ESVNBU1NPQzoKLQkJCUNudGxXYWl0RGlzYXNzb2NQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfSk9JTjoKLQkJCUNudGxXYWl0Sm9pblByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCS8vIENOVExfV0FJVF9SRUFTU09DIGlzIHRoZSBvbmx5IHN0YXRlIGluIENOVEwgbWFjaGluZSB0aGF0IGRvZXMKLQkJLy8gbm90IHRyaWdnZXJlZCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGJ5ICJSVE1QU2V0SW5mb3JtYXRpb24oT0lEX3h4eCkiLgotCQkvLyBUaGVyZWZvcmUgbm90IHByb3RlY3RlZCBieSBORElTJ3MgIm9ubHkgb25lIG91dHN0YW5kaW5nIE9JRCByZXF1ZXN0IgotCQkvLyBydWxlLiBXaGljaCBtZWFucyBORElTIG1heSBTRVQgT0lEIGluIHRoZSBtaWRkbGUgb2YgUk9BTWluZyBhdHRlbXB0cy4KLQkJLy8gQ3VycmVudCBhcHByb2FjaCBpcyB0byBibG9jayBuZXcgU0VUIHJlcXVlc3QgYXQgUlRNUFNldEluZm9ybWF0aW9uKCkKLQkJLy8gd2hlbiBDbnRsTWFjaGluZS5DdXJyU3RhdGUgaXMgbm90IENOVExfSURMRQotCQljYXNlIENOVExfV0FJVF9SRUFTU09DOgotCQkJQ250bFdhaXRSZWFzc29jUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTlRMX1dBSVRfU1RBUlQ6Ci0JCQlDbnRsV2FpdFN0YXJ0UHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FVVEg6Ci0JCQlDbnRsV2FpdEF1dGhQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTlRMX1dBSVRfQVVUSDI6Ci0JCQlDbnRsV2FpdEF1dGhQcm9jMihwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ05UTF9XQUlUX0FTU09DOgotCQkJQ250bFdhaXRBc3NvY1Byb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ05UTF9XQUlUX09JRF9MSVNUX1NDQU46Ci0JCQlpZihFbGVtLT5Nc2dUeXBlID09IE1UMl9TQ0FOX0NPTkYpCi0JCQl7Ci0JCQkJLy8gUmVzdW1lIFR4UmluZyBhZnRlciBTQ0FOSU5HIGNvbXBsZXRlLiBXZSBob3BlIHRoZSBvdXQtb2Ytc2VydmljZSB0aW1lCi0JCQkJLy8gd29uJ3QgYmUgdG9vIGxvbmcgdG8gbGV0IHVwcGVyIGxheWVyIHRpbWUtb3V0IHRoZSB3YWl0aW5nIGZyYW1lcwotCQkJCVJUTVBSZXN1bWVNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0KLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0gICAgICAgICAgICAgICAgLy8KLQkJCQkvLyBTZXQgTEVEIHN0YXR1cyB0byBwcmV2aW91cyBzdGF0dXMuCi0JCQkJLy8KLQkJCQlpZiAocEFkLT5iTGVkT25TY2FubmluZykKLQkJCQl7Ci0JCQkJCXBBZC0+YkxlZE9uU2Nhbm5pbmcgPSBGQUxTRTsKLQkJCQkJUlRNUFNldExFRChwQWQsIHBBZC0+TGVkU3RhdHVzKTsKLQkJCQl9Ci0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCQkJCS8vIEFQIHNlbnQgYSAyMDQwQ29leGlzdGVuY2UgbWdtdCBmcmFtZSwgdGhlbiBzdGF0aW9uIHBlcmZvcm0gYSBzY2FuLCBhbmQgdGhlbiBzZW5kIGJhY2sgdGhlIHJlc3BvbmUuCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJTU0NvZXhpc3QyMDQwLmZpZWxkLkluZm9SZXEgPT0gMSkKLQkJCQl7Ci0JCQkJCVVwZGF0ZTIwNDBDb2V4aXN0RnJhbWVBbmROb3RpZnkocEFkLCBCU1NJRF9XQ0lELCBUUlVFKTsKLQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDTlRMX1dBSVRfT0lEX0RJU0FTU09DOgotCQkJaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCi0JCQl7Ci0JCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlRfRVJSKCgiIUVSUk9SISBDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIHR5cGUoPSVsZCkiLCBFbGVtLT5Nc2dUeXBlKSk7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bElkbGVQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKLQotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoKEVsZW0tPk1zZ1R5cGUpCi0JewotCQljYXNlIE9JRF84MDJfMTFfU1NJRDoKLQkJCUNudGxPaWRTc2lkUHJvYyhwQWQsIEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0JTU0lEOgotCQkJQ250bE9pZFJUQnNzaWRQcm9jKHBBZCxFbGVtKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU46Ci0JCQlDbnRsT2lkU2NhblByb2MocEFkLEVsZW0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0RJU0FTU09DSUFURToKLQkJCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fRElTQVNTT0NfU1RBX0xFQVZJTkcpOwotCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsIHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfRElTQVNTT0M7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCAhPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEVfV0lUSF9XRUJfVUkpCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgICAgICAgICAgewotCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgotCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLSAgICAgICAgICAgIH0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTVQyX01MTUVfUk9BTUlOR19SRVE6Ci0JCQlDbnRsTWxtZVJvYW1pbmdQcm9jKHBBZCwgRWxlbSk7Ci0JCQlicmVhazsKLQotICAgICAgICBjYXNlIE9JRF84MDJfMTFfTUlDX0ZBSUxVUkVfUkVQT1JUX0ZSQU1FOgotICAgICAgICAgICAgV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKHBBZCwgRWxlbSk7Ci0gICAgICAgICAgICBicmVhazsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQljYXNlIFJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTToKLQkJCUNudGxPaWRETFNTZXR1cFByb2MocEFkLCBFbGVtKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gSWxsZWdhbCBtZXNzYWdlIGluIENudGxJZGxlUHJvYyhNc2dUeXBlPSVsZClcbiIsRWxlbS0+TXNnVHlwZSkpOwotCQkJYnJlYWs7Ci0JfQotfQotCi1WT0lEIENudGxPaWRTY2FuUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICAgICBCc3NJZHggPSBCU1NfTk9UX0ZPVU5EOwotCUJTU19FTlRSWSAgICAgICAgICAgICAgICAgIEN1cnJCc3M7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0vKiBEaXNhYmxlIHNjYW5uaW5nIHdoZW4gQVRFIGlzIHJ1bm5pbmcuICovCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0KLQkvLyByZWNvcmQgY3VycmVudCBCU1MgaWYgbmV0d29yayBpcyBjb25uZWN0ZWQuCi0JLy8gMjAwMy0yLTEzIGRvIG5vdCBpbmNsdWRlIGN1cnJlbnQgSUJTUyBpZiB0aGlzIGlzIHRoZSBvbmx5IFNUQSBpbiB0aGlzIElCU1MuCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQl7Ci0JCUJzc0lkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgKFBVQ0hBUilwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJaWYgKEJzc0lkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQl7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmQ3VyckJzcywgJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLCBzaXplb2YoQlNTX0VOVFJZKSk7Ci0JCX0KLQl9Ci0KLQkvLyBjbGVhbiB1cCBwcmV2aW91cyBTQ0FOIHJlc3VsdCwgYWRkIGN1cnJlbnQgQlNTIGJhY2sgdG8gdGFibGUgaWYgYW55Ci0JQnNzVGFibGVJbml0KCZwQWQtPlNjYW5UYWIpOwotCWlmIChCc3NJZHggIT0gQlNTX05PVF9GT1VORCkKLQl7Ci0JCS8vIERESyBOb3RlOiBJZiB0aGUgTklDIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgQlNTSUQgYW5kIFNTSUQKLQkJLy8gICAgdGhhdCBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgbGlzdCBvZiBCU1NJRHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc2NhbiwgdGhlCi0JCS8vICAgIEJTU0lEIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBCU1NJRCBhbmQgU1NJRCBzaG91bGQgYmUKLQkJLy8gICAgYXBwZW5kZWQgdG8gdGhlIGxpc3Qgb2YgQlNTSURzIGluIHRoZSBOSUMncyBkYXRhYmFzZS4KLQkJLy8gVG8gZW5zdXJlIHRoaXMsIHdlIGFwcGVuZCB0aGlzIEJTUyBhcyB0aGUgZmlyc3QgZW50cnkgaW4gU0NBTiByZXN1bHQKLQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVswXSwgJkN1cnJCc3MsIHNpemVvZihCU1NfRU5UUlkpKTsKLQkJcEFkLT5TY2FuVGFiLkJzc05yID0gMTsKLQl9Ci0KLQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgKFBTVFJJTkcpIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBCU1NfQU5ZLCBTQ0FOX0FDVElWRSk7Ci0JTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLAotCQlzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9PSURfTElTVF9TQ0FOOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZSwgdXNlciBkZXNpcmVkIFNTSUQgc2hvdWxkIGFscmVhZHkgYmVlbgotCQlyZWNvcmRlZCBpbiBDb21tb25DZmcuU3NpZFtdCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bE9pZFNzaWRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqIEVsZW0pCi17Ci0JUE5ESVNfODAyXzExX1NTSUQgICAgICAgICAgcE9pZFNzaWQgPSAoTkRJU184MDJfMTFfU1NJRCAqKUVsZW0tPk1zZzsKLQlNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QgICBEaXNhc3NvY1JlcTsKLQlVTE9ORwkJCQkJICAgTm93OwotCi0KLQkvLyBTdGVwIDEuIHJlY29yZCB0aGUgZGVzaXJlZCB1c2VyIHNldHRpbmdzIHRvIE1sbWVBdXgKLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgcE9pZFNzaWQtPlNzaWQsIHBPaWRTc2lkLT5Tc2lkTGVuZ3RoKTsKLQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IChVQ0hBUilwT2lkU3NpZC0+U3NpZExlbmd0aDsKLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQnNzaWQsIE1BQ19BRERSX0xFTik7Ci0JcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQWQtPlN0YUNmZy5Cc3NUeXBlOwotCi0JcEFkLT5TdGFDZmcuYkF1dG9Db25uZWN0QnlCc3NpZCA9IEZBTFNFOwotCi0JLy8KLQkvLyBVcGRhdGUgUmVjb25uZWN0IFNzaWQsIHRoYXQgdXNlciBkZXNpcmVkIHRvIGNvbm5lY3QuCi0JLy8KLQlOZGlzWmVyb01lbW9yeShwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkLCBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCXBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbiA9IHBBZC0+TWxtZUF1eC5Tc2lkTGVuOwotCi0JLy8gc3RlcCAyLiBmaW5kIGFsbCBtYXRjaGluZyBCU1MgaW4gdGhlIGxhc3Rlc3QgU0NBTiByZXN1bHQgKGluQnNzVGFiKQotCS8vICAgICYgbG9nIHRoZW0gaW50byBNbG1lQXV4LlNzaWRCc3NUYWIgZm9yIGxhdGVyLW9uIGl0ZXJhdGlvbi4gU29ydCBieSBSU1NJIG9yZGVyCi0JQnNzVGFibGVTc2lkU29ydChwQWQsICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgKFBDSEFSKXBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gJWQgQlNTIG9mICVkIEJTUyBtYXRjaCB0aGUgZGVzaXJlICglZClTU0lEIC0gJXNcbiIsCi0JCQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciwgcEFkLT5TY2FuVGFiLkJzc05yLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5NbG1lQXV4LlNzaWQpKTsKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZOb3cpOwotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSAmJgotCQkocEFkLT5Db21tb25DZmcuU3NpZExlbiA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVswXS5Tc2lkTGVuKSAmJgotCQlOZGlzRXF1YWxNZW1vcnkocEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbMF0uU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikgJiYKLQkJTUFDX0FERFJfRVFVQUwocEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLkJzc2lkKSkKLQl7Ci0JCS8vIENhc2UgMS4gYWxyZWFkeSBjb25uZWN0ZWQgd2l0aCBhbiBBUCB3aG8gaGFzIHRoZSBkZXNpcmVkIFNTSUQKLQkJLy8gICAgICAgICB3aXRoIGhpZ2hlc3QgUlNTSQotCi0JCS8vIEFkZCBjaGVja2luZyBNb2RlICJMRUFQIiBmb3IgQ0NYIDEuMAotCQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwKLQkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLQkJCSApICYmCi0JCQkocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkJewotCQkJLy8gY2FzZSAxLjEgRm9yIFdQQSwgV1BBLVBTSywgaWYgdGhlIDF4IHBvcnQgaXMgbm90IHNlY3VyZWQsIHdlIGhhdmUgdG8gcmVkbwotCQkJLy8gICAgICAgICAgY29ubmVjdGlvbiBwcm9jZXNzCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9ESVNBU1NPQzsKLQkJfQotCQllbHNlIGlmIChwQWQtPmJDb25maWdDaGFuZ2VkID09IFRSVUUpCi0JCXsKLQkJCS8vIGNhc2UgMS4yIEltcG9ydGFudCBDb25maWcgaGFzIGNoYW5nZWQsIHdlIGhhdmUgdG8gcmVjb25uZWN0IHRvIHRoZSBzYW1lIEFQCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUCBCZWNhdXNlIGNvbmZpZyBjaGFuZ2VkLi4uXG4iKSk7Ci0JCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLAotCQkJCQkJc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCksICZEaXNhc3NvY1JlcSk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gY2FzZSAxLjMuIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBTU0lEIHdpdGggaGlnaGVzdCBSU1NJLgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGFscmVhZHkgd2l0aCB0aGlzIEJTU0lELiBpZ25vcmUgdGhpcyBTRVRfU1NJRCByZXF1ZXN0XG4iKSk7Ci0JCQkvLwotCQkJLy8gKEhDVCAxMi4xKSAxY193bGFuX21lZGlhZXZlbnRzIHJlcXVpcmVkCi0JCQkvLyBtZWRpYSBjb25uZWN0IGV2ZW50cyBhcmUgaW5kaWNhdGVkIHdoZW4gYXNzb2NpYXRpbmcgd2l0aCB0aGUgc2FtZSBBUAotCQkJLy8KLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCS8vCi0JCQkJLy8gU2luY2UgTWVkaWFTdGF0ZSBhbHJlYWR5IGlzIE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkCi0JCQkJLy8gV2UganVzdCBpbmRpY2F0ZSB0aGUgY29ubmVjdCBldmVudCBhZ2FpbiB0byBtZWV0IHRoZSBXSFFMIHJlcXVpcmVkLgotCQkJCS8vCi0JCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOyAgIC8vIFVwZGF0ZSBleHRyYSBpbmZvcm1hdGlvbiB0byBsaW5rIGlzIHVwCi0JCQl9Ci0KLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgU0lPQ0dJV0FQLCAtMSwgJnBBZC0+TWxtZUF1eC5Cc3NpZFswXSwgTlVMTCwgMCk7Ci0jZW5kaWYgLy8gTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJfQotCX0KLQllbHNlIGlmIChJTkZSQV9PTihwQWQpKQotCXsKLQkJLy8KLQkJLy8gRm9yIFJUNjEKLQkJLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKLQkJLy8gUlQ2MSBtYXkgbG9zdCBTU0lELCBhbmQgbm90IGNvbm5lY3QgdG8gTkRURVNUX1dFUF9BUDIgYW5kIHdpbGwgY29ubmVjdCB0byBORFRFU1RfV0VQX0FQMiBieSBBdXRvcmVjb25uZWN0Ci0JCS8vIEJ1dCBtZWRpYSBzdGF0dXMgaXMgY29ubmVjdGVkLCBzbyB0aGUgU1NJRCBub3QgcmVwb3J0IGNvcnJlY3RseS4KLQkJLy8KLQkJaWYgKCFTU0lEX0VRVUFMKHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbikpCi0JCXsKLQkJCS8vCi0JCQkvLyBEaWZmZXJlbnQgU1NJRCBtZWFucyBub3QgUm9hbWluZyBjYXNlLCBzbyB3ZSBsZXQgTGlua0Rvd24oKSB0byBJbmRpY2F0ZSBhIGRpc2Nvbm5lY3QgZXZlbnQuCi0JCQkvLwotCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gVFJVRTsKLQkJfQotCQkvLyBjYXNlIDIuIGFjdGl2ZSBJTkZSQSBhc3NvY2lhdGlvbiBleGlzdGVudAotCQkvLyAgICByb2FtaW5nIGlzIGRvbmUgd2l0aGluIG1pbmlwb3J0IGRyaXZlciwgbm90aGluZyB0byBkbyB3aXRoIGNvbmZpZ3VyYXRpb24KLQkJLy8gICAgdXRpbGl0eS4gc28gdXBvbiBhIG5ldyBTRVQoT0lEXzgwMl8xMV9TU0lEKSBpcyByZWNlaXZlZCwgd2UganVzdAotCQkvLyAgICBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEFQLAotCQkvLyAgICB0aGVuIHBlcmZvcm0gYSBuZXcgYXNzb2NpYXRpb24gd2l0aCB0aGlzIG5ldyBTU0lELCBubyBtYXR0ZXIgdGhlCi0JCS8vICAgIG5ldy9vbGQgU1NJRCBhcmUgdGhlIHNhbWUgb3Igbm90LgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gZGlzYXNzb2NpYXRlIHdpdGggY3VycmVudCBBUC4uLlxuIikpOwotCQlEaXNhc3NvY1Bhcm1GaWxsKHBBZCwgJkRpc2Fzc29jUmVxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgUkVBU09OX0RJU0FTU09DX1NUQV9MRUFWSU5HKTsKLQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ESVNBU1NPQ19SRVEsCi0JCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCX0KLQllbHNlCi0JewotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6Q05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOwotCQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpOwotCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ250bE9pZFNzaWRQcm9jKCk6TkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOwotCQl9Ci0KLQkJaWYgKChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9PSAwKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID09IFRSVUUpICYmCi0JCQkocEFkLT5NbG1lQXV4LkJzc1R5cGUgPT0gQlNTX0lORlJBKSAmJgotCQkJKE1sbWVWYWxpZGF0ZVNTSUQocEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKSA9PSBUUlVFKQotCQkJKQotCQl7Ci0JCQlNTE1FX1NDQU5fUkVRX1NUUlVDVCAgICAgICBTY2FuUmVxOwotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDbnRsT2lkU3NpZFByb2MoKTpDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBzY2FuXG4iKSk7Ci0JCQlTY2FuUGFybUZpbGwocEFkLCAmU2NhblJlcSwgKFBTVFJJTkcpIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgQlNTX0FOWSwgU0NBTl9BQ1RJVkUpOwotCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9MSVNUX1NDQU47Ci0JCQkvLyBSZXNldCBNaXNzZWQgc2NhbiBudW1iZXIKLQkJCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQkJfQotCQllbHNlCi0JCXsKLQotCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0JCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQkJfQotCX0KLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsT2lkUlRCc3NpZFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICogRWxlbSkKLXsKLQlVTE9ORyAgICAgICBCc3NJZHg7Ci0JUFVDSEFSICAgICAgcE9pZEJzc2lkID0gKFBVQ0hBUilFbGVtLT5Nc2c7Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUICAgIERpc2Fzc29jUmVxOwotCU1MTUVfSk9JTl9SRVFfU1RSVUNUICAgICAgICBKb2luUmVxOwotCi0jaWZkZWYgUkFMSU5LX0FURQotLyogTm8gbmVlZCB0byBwZXJmb3JtIHRoaXMgcm91dGluZSB3aGVuIEFURSBpcyBydW5uaW5nLiAqLwotCWlmIChBVEVfT04ocEFkKSkKLQkJcmV0dXJuOwotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCS8vIHJlY29yZCB1c2VyIGRlc2lyZWQgc2V0dGluZ3MKLQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcE9pZEJzc2lkKTsKLQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IHBBZC0+U3RhQ2ZnLkJzc1R5cGU7Ci0KLQkvLyBmaW5kIHRoZSBkZXNpcmVkIEJTUyBpbiB0aGUgbGF0ZXN0IFNDQU4gcmVzdWx0IHRhYmxlCi0JQnNzSWR4ID0gQnNzVGFibGVTZWFyY2goJnBBZC0+U2NhblRhYiwgcE9pZEJzc2lkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0JaWYgKEJzc0lkeCA9PSBCU1NfTk9UX0ZPVU5EKQotCXsKLQkJTUxNRV9TQ0FOX1JFUV9TVFJVQ1QgICAgICAgU2NhblJlcTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQlNTSUQgbm90IGZvdW5kLiByZXBseSBORElTX1NUQVRVU19OT1RfQUNDRVBURURcbiIpKTsKLQkJLy9wQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBCU1NJRCBub3QgZm91bmQuIHN0YXJ0IGEgbmV3IHNjYW5cbiIpKTsKLQkJU2NhblBhcm1GaWxsKHBBZCwgJlNjYW5SZXEsIChQU1RSSU5HKSBwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4sIEJTU19BTlksIFNDQU5fQUNUSVZFKTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NDQU5fUkVRLCBzaXplb2YoTUxNRV9TQ0FOX1JFUV9TVFJVQ1QpLCAmU2NhblJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfT0lEX0xJU1RfU0NBTjsKLQkJLy8gUmVzZXQgTWlzc2VkIHNjYW4gbnVtYmVyCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJnBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLwotCS8vIFVwZGF0ZSBSZWNvbm5lY3QgU3NpZCwgdGhhdCB1c2VyIGRlc2lyZWQgdG8gY29ubmVjdC4KLQkvLwotCU5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLQlwQWQtPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uU3NpZExlbik7Ci0KLQkvLyBjb3B5IHRoZSBtYXRjaGVkIEJTUyBlbnRyeSBmcm9tIFNjYW5UYWIgdG8gTWxtZUF1eC5Tc2lkQnNzVGFiLiBXaHk/Ci0JLy8gQmVjYXVzZSB3ZSBuZWVkIHRoaXMgZW50cnkgdG8gYmVjb21lIHRoZSBKT0lOIHRhcmdldCBpbiBsYXRlciBvbiBTWU5DIHN0YXRlIG1hY2hpbmUKLQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKLQlwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NOciA9IDE7Ci0JTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5WzBdLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0sIHNpemVvZihCU1NfRU5UUlkpKTsKLQotCS8vIEFkZCBTU0lEIGludG8gTWxtZUF1eCBmb3Igc2l0ZSBzdXJleSBqb2luaW5nIGhpZGRlbiBTU0lECi0JcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkTGVuOwotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbik7Ci0KLQl7Ci0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0JCQkvLyBkaXNhc3NvYyBmcm9tIGN1cnJlbnQgQVAgZmlyc3QKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBkaXNhc3NvY2lhdGUgd2l0aCBjdXJyZW50IEFQIC4uLlxuIikpOwotCQkJRGlzYXNzb2NQYXJtRmlsbChwQWQsICZEaXNhc3NvY1JlcSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIFJFQVNPTl9ESVNBU1NPQ19TVEFfTEVBVklORyk7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIEFTU09DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RJU0FTU09DX1JFUSwKLQkJCQkJCXNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpLCAmRGlzYXNzb2NSZXEpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0RJU0FTU09DOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKEFESE9DX09OKHBBZCkpCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIGRyb3AgY3VycmVudCBBREhPQ1xuIikpOwotCQkJCUxpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0JCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBDIVxuIikpOwotCQkJfQotCi0JCQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKLQkJCXBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQotCQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkJLy8gU2V0IHRoZSBQYWlyd2lzZSBhbmQgR3JvdXAgY2lwaGVyIHRvIG1hdGNoIHRoZSBpbnRlbmRlZCBBUCBzZXR0aW5nCi0JCQkvLyBXZSBjYW4gb25seSBjb25uZWN0IHRvIEFQIHdpdGggbGVzcyBzZWN1cmVkIGNpcGhlciBzZXR0aW5nCi0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCQl7Ci0JCQkJcEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7Ci0KLQkJCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXI7Ci0JCQkJZWxzZSBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXg7Ci0JCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCQl9Ci0JCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQkJewotCQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKLQotCQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyKQotCQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyOwotCQkJCWVsc2UgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXJBdXg7Ci0JCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0KLQkJCQkvLyBSU04gY2FwYWJpbGl0eQotCQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlJzbkNhcGFiaWxpdHk7Ci0JCQl9Ci0KLQkJCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKLQkJCXBBZC0+U3RhQ2ZnLmJNaXhDaXBoZXIgPSAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcikgPyBGQUxTRSA6IFRSVUU7Ci0JCQkvKmlmIChwQWQtPlN0YUNmZy5iTWl4Q2lwaGVyID09IFRSVUUpCi0JCQl7Ci0JCQkJLy8gSWYgbWl4IGNpcGhlciwgcmUtYnVpbGQgUlNOSUUKLQkJCQlSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgMCk7Ci0JCQl9Ki8KLQkJCS8vIE5vIGFjdGl2ZSBhc3NvY2lhdGlvbiwgam9pbiB0aGUgQlNTIGltbWVkaWF0ZWx5Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gam9pbmluZyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAuLi5cbiIsCi0JCQkJcE9pZEJzc2lkWzBdLHBPaWRCc3NpZFsxXSxwT2lkQnNzaWRbMl0scE9pZEJzc2lkWzNdLHBPaWRCc3NpZFs0XSxwT2lkQnNzaWRbNV0pKTsKLQotCQkJSm9pblBhcm1GaWxsKHBBZCwgJkpvaW5SZXEsIHBBZC0+TWxtZUF1eC5Cc3NJZHgpOwotCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0pPSU5fUkVRLCBzaXplb2YoTUxNRV9KT0lOX1JFUV9TVFJVQ1QpLCAmSm9pblJlcSk7Ci0KLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfSk9JTjsKLQkJfQotCX0KLX0KLQotLy8gUm9hbWluZyBpcyB0aGUgb25seSBleHRlcm5hbCByZXF1ZXN0IHRyaWdnZXJpbmcgQ05UTCBzdGF0ZSBtYWNoaW5lCi0vLyBkZXNwaXRlIG9mIG90aGVyICJTRVQgT0lEIiBvcGVyYXRpb24uIEFsbCAiU0VUIE9JRCIgcmVsYXRlZCBvZXJhdGlvbnMKLS8vIGhhcHBlbiBpbiBzZXF1ZW5jZSwgYmVjYXVzZSBubyBvdGhlciBTRVQgT0lEIHdpbGwgYmUgc2VudCB0byB0aGlzIGRldmljZQotLy8gdW50aWwgdGhlIHRoZSBwcmV2aW91cyBTRVQgb3BlcmF0aW9uIGlzIGNvbXBsZXRlIChzdWNjZXNzZnVsIG8gZmFpbGVkKS4KLS8vIFNvLCBob3cgZG8gd2UgcXVhcmFudGVlIHRoaXMgUk9BTUlORyByZXF1ZXN0IHdvbid0IGNvcnJ1cHQgb3RoZXIgIlNFVCBPSUQiPwotLy8gb3IgYmVlbiBjb3JydXB0ZWQgYnkgb3RoZXIgIlNFVCBPSUQiPwotLy8KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRCBDbnRsTWxtZVJvYW1pbmdQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiBCQlBWYWx1ZSA9IDA7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBSb2FtaW5nIGluIE1sbWVBdXguUm9hbVRhYi4uLlxuIikpOwotCi0JewotCQkvL0xldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gKGZhc3QpIHJvYW1pbmcuCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJkJCUFZhbHVlKTsKLQkJQkJQVmFsdWUgJj0gKH4weDE4KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQkJQVmFsdWUpOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYiwgJnBBZC0+TWxtZUF1eC5Sb2FtVGFiLCBzaXplb2YocEFkLT5NbG1lQXV4LlJvYW1UYWIpKTsKLQkJcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzTnIgPSBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcjsKLQotCQlCc3NUYWJsZVNvcnRCeVJzc2koJnBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiKTsKLQkJcEFkLT5NbG1lQXV4LkJzc0lkeCA9IDA7Ci0JCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwotCX0KLX0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bE9pZERMU1NldHVwUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JUFJUXzgwMl8xMV9ETFMJCXBETFMgPSAoUFJUXzgwMl8xMV9ETFMpRWxlbS0+TXNnOwotCU1MTUVfRExTX1JFUV9TVFJVQ1QJTWxtZURsc1JlcTsKLQlJTlQJCQkJCWk7Ci0JVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9VTlNQRUNJRlk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSAoT0lEIHNldCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCB3aXRoIFZhbGlkPSVkLCBTdGF0dXM9JWQsIFRpbWVPdXQ9JWQsIENvdW50RG93blRpbWVyPSVkKVxuIiwKLQkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSwKLQkJcERMUy0+VmFsaWQsIHBETFMtPlN0YXR1cywgcERMUy0+VGltZU91dCwgcERMUy0+Q291bnREb3duVGltZXIpKTsKLQotCWlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXJldHVybjsKLQotCS8vIERMUyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgd2hlbiBBZGhvYyBtb2RlCi0JaWYgKElORlJBX09OKHBBZCkpCi0JewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJewotCQkJaWYgKHBETFMtPlZhbGlkICYmIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYKLQkJCQkocERMUy0+VGltZU91dCA9PSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSAmJiBNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQkvLyAxLiBTYW1lIHNldHRpbmcsIGp1c3QgZHJvcCBpdAotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIHNldHRpbmcgdW5jaGFuZ2VkXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICghcERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSAmJgotCQkJCU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQkJewotCQkJCS8vIDIuIERpc2FibGUgRExTIGxpbmsgY2FzZSwganVzdCB0ZWFyIGRvd24gRExTIGxpbmsKLQkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBzdGFydCB0ZWFyIGRvd24gcHJvY2VkdXJlXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICgoaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZKSAmJiBwRExTLT5WYWxpZCAmJiAhcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQpCi0JCQl7Ci0JCQkJLy8gMy4gRW5hYmxlIGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHBETFMsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7Ci0KLQkJCQkvL1VwZGF0ZSBjb3VudGRvd24gdGltZXIKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7Ci0JCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyBzZXR1cCBjYXNlXG4iKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICgoaSA8IE1BWF9OVU1fT0ZfRExTX0VOVFJZKSAmJiBwRExTLT5WYWxpZCAmJiBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJgotCQkJCShwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPT0gRExTX0ZJTklTSCkgJiYgIU1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQkJewotCQkJCS8vIDQuIHVwZGF0ZSBtYWMgY2FzZSwgdGVhciBkb3duIG9sZCBETFMgYW5kIHNldHVwIG5ldyBETFMKLQkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1VOV0FOVEVEX01FQ0hBTklTTTsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHBETFMsIHNpemVvZihSVF84MDJfMTFfRExTX1VJKSk7Ci0JCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19SRVEsIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiQ05UTCAtIERMUyB0ZWFyIGRvd24gYW5kIHJlc3RhcnQgY2FzZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKLQkJCQlNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSBwRExTLT5UaW1lT3V0KSkKLQkJCXsKLQkJCQkvLyA1LiB1cGRhdGUgdGltZW91dCBjYXNlLCBzdGFydCBETFMgc2V0dXAgcHJvY2VkdXJlIChubyB0ZWFyIGRvd24pCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dAk9IHBETFMtPlRpbWVPdXQ7Ci0JCQkJLy9VcGRhdGUgY291bnRkb3duIHRpbWVyCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfUkVRLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkNOVEwgLSBETFMgdXBkYXRlIHRpbWVvdXQgY2FzZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAocERMUy0+VmFsaWQgJiYgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYKLQkJCQkocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzICE9IERMU19GSU5JU0gpICYmIE1BQ19BRERSX0VRVUFMKHBETFMtPk1hY0FkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQkJewotCQkJCS8vIDYuIHJlLXNldHVwIGNhc2UsIHN0YXJ0IERMUyBzZXR1cCBwcm9jZWR1cmUgKG5vIHRlYXIgZG93bikKLQkJCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCAmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0sIHJlYXNvbik7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1JFUSwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJDTlRMIC0gRExTIHJldHJ5IHNldHVwIHByb2NlZHVyZVxuIikpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sKCJDTlRMIC0gRExTIG5vdCBjaGFuZ2VkIGluIGVudHJ5IC0gJWQgLSBWYWxpZD0lZCwgU3RhdHVzPSVkLCBUaW1lT3V0PSVkXG4iLAotCQkJCQlpLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxXYWl0RGlzYXNzb2NQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgICAgIFN0YXJ0UmVxOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0RJU0FTU09DX0NPTkYpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gRGlzLWFzc29jaWF0ZSBzdWNjZXNzZnVsXG4iKSk7Ci0KLQkgICAgaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19ESVNBU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0KLQkJTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0KLQkJLy8gY2FzZSAxLiBubyBtYXRjaGluZyBCU1MsIGFuZCB1c2VyIHdhbnRzIEFESE9DLCBzbyB3ZSBqdXN0IHN0YXJ0IGEgbmV3IG9uZQotCQlpZiAoKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yPT0wKSAmJiAocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gTm8gbWF0Y2hpbmcgQlNTLCBzdGFydCBhIG5ldyBBREhPQyAoU3NpZD0lcykuLi5cbiIscEFkLT5NbG1lQXV4LlNzaWQpKTsKLQkJCVN0YXJ0UGFybUZpbGwocEFkLCAmU3RhcnRSZXEsIChQQ0hBUilwQWQtPk1sbWVBdXguU3NpZCwgcEFkLT5NbG1lQXV4LlNzaWRMZW4pOwotCQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1NUQVJUOwotCQl9Ci0JCS8vIGNhc2UgMi4gdHJ5IGVhY2ggbWF0Y2hlZCBCU1MKLQkJZWxzZQotCQl7Ci0JCQlwQWQtPk1sbWVBdXguQnNzSWR4ID0gMDsKLQotCQkJSXRlcmF0ZU9uQnNzVGFiKHBBZCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxXYWl0Sm9pblByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgIEF1dGhSZXE7Ci0KLQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfSk9JTl9DT05GKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7Ci0JCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQotCQl7Ci0JCQkvLyAxLiBqb2luZWQgYW4gSUJTUywgd2UgYXJlIHByZXR0eSBtdWNoIGRvbmUgaGVyZQotCQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19BREhPQykKLQkJCXsKLQkJCSAgICAvLwotCQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgotCQkJCS8vIEFkIGhvYyBtdXN0IGJlIGRpc2FibGVkIGluIFc1MyhjaDUyLDU2LDYwLDY0KSBjaGFubmVscy4KLQkJCQkvLwotCQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCQkJCSAgICkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBDaGFubmVsPSVkLCBKb2luIGFkaG9jIG9uIFc1Myg1Miw1Niw2MCw2NCkgQ2hhbm5lbHMgYXJlIG5vdCBhY2NlcHRlZFxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJTGlua1VwKHBBZCwgQlNTX0FESE9DKTsKLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBqb2luIHRoZSBJQlNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggLi4uXG4iLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzFdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzJdLAotCQkJCXBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzRdLHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzVdKSk7Ci0KLSAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgIHBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX1VQOwotCQkJfQotCQkJLy8gMi4gam9pbmVkIGEgbmV3IElORlJBIG5ldHdvcmssIHN0YXJ0IGZyb20gYXV0aGVudGljYXRpb24KLQkJCWVsc2UKLQkJCXsKLQkJCQl7Ci0JCQkJCS8vIGVpdGhlciBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQgb3IgTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwgdHJ5IHNoYXJlZCBrZXkgZmlyc3QKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpIHx8Ci0JCQkJCQkocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkpCi0JCQkJCXsKLQkJCQkJCUF1dGhQYXJtRmlsbChwQWQsICZBdXRoUmVxLCBwQWQtPk1sbWVBdXguQnNzaWQsIEFVVEhfTU9ERV9LRVkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQVVUSF9NT0RFX09QRU4pOwotCQkJCQl9Ci0JCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVVUSF9TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BVVRIX1JFUSwKLQkJCQkJCQlzaXplb2YoTUxNRV9BVVRIX1JFUV9TVFJVQ1QpLCAmQXV0aFJlcSk7Ci0JCQkJfQotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gMy4gZmFpbGVkLCB0cnkgbmV4dCBCU1MKLQkJCXBBZC0+TWxtZUF1eC5Cc3NJZHgrKzsKLQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwotCQl9Ci0JfQotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxXYWl0U3RhcnRQcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVU0hPUlQgICAgICBSZXN1bHQ7Ci0KLQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfU1RBUlRfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkgICAgLy8KLQkJCS8vIDVHIGJhbmRzIHJ1bGVzIG9mIEphcGFuOgotCQkJLy8gQWQgaG9jIG11c3QgYmUgZGlzYWJsZWQgaW4gVzUzKGNoNTIsNTYsNjAsNjQpIGNoYW5uZWxzLgotCQkJLy8KLQkJCWlmICggKHBBZC0+Q29tbW9uQ2ZnLmJJRUVFODAyMTFIID09IDEpICYmCi0gICAgICAgICAgICAgICAgICBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpCi0JCQkgICApCi0JCQl7Ci0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQ2hhbm5lbD0lZCwgU3RhcnQgYWRob2Mgb24gVzUzKDUyLDU2LDYwLDY0KSBDaGFubmVscyBhcmUgbm90IGFjY2VwdGVkXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAxNik7Ci0JCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJewotCQkJCU5fQ2hhbm5lbENoZWNrKHBBZCk7Ci0JCQkJU2V0Q29tbW9uSFQocEFkKTsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJnBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0JCQkJUlRNUENoZWNrSHQocEFkLCBCU1NJRF9XQ0lELCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LCAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IFRSVUU7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdLCAmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lk1DU1NldFswXSwgMTYpOwotCQkJCUNPUFlfSFRTRVRUSU5HU19GUk9NX01MTUVfQVVYX1RPX0FDVElWRV9DRkcocEFkKTsKLQotCQkJCWlmICgocEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggID09IEJXXzQwKSAmJgotCQkJCQkocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsICsgMjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoICA9PSBCV180MCkgJiYKLQkJCQkJCSAocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9CRUxPVykpCi0JCQkJewotCQkJCQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsIC0gMjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBGQUxTRTsKLQkJCX0KLQkJCUxpbmtVcChwQWQsIEJTU19BREhPQyk7Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9JRExFOwotCQkJLy8gQmVmb3JlIHNlbmQgYmVhY29uLCBkcml2ZXIgbmVlZCBkbyByYWRhciBkZXRlY3Rpb24KLQkJCWlmICgocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0ICkKLQkJCQkmJiAocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkKLQkJCQkmJiBSYWRhckNoYW5uZWxDaGVjayhwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpKQotCQkJewotCQkJCXBBZC0+Q29tbW9uQ2ZnLlJhZGFyRGV0ZWN0LlJETW9kZSA9IFJEX1NJTEVOQ0VfTU9ERTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5SYWRhckRldGVjdC5SRENvdW50ID0gMDsKLSNpZmRlZiBERlNfU1VQUE9SVAotCQkJCUJicFJhZGFyRGV0ZWN0aW9uU3RhcnQocEFkKTsKLSNlbmRpZiAvLyBERlNfU1VQUE9SVCAvLwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gc3RhcnQgYSBuZXcgSUJTUyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IC4uLlxuIiwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFswXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsxXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKLQkJCQlwQWQtPkNvbW1vbkNmZy5Cc3NpZFszXSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs0XSxwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIFN0YXJ0IElCU1MgZmFpbC4gQlVHISEhISFcbiIpKTsKLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIENudGxXYWl0QXV0aFByb2MoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgUmVhc29uOwotCU1MTUVfQVNTT0NfUkVRX1NUUlVDVCAgICAgICAgQXNzb2NSZXE7Ci0JTUxNRV9BVVRIX1JFUV9TVFJVQ1QgICAgICAgICBBdXRoUmVxOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FVVEhfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZWFzb24sIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVhc29uID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggT0tcbiIpKTsKLQkJCUFzc29jUGFybUZpbGwocEFkLCAmQXNzb2NSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwotCi0JCQl7Ci0JCQkJTWxtZUVucXVldWUocEFkLCBBU1NPQ19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9BU1NPQ19SRVEsCi0JCQkJCQkJc2l6ZW9mKE1MTUVfQVNTT0NfUkVRX1NUUlVDVCksICZBc3NvY1JlcSk7Ci0KLQkJCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FTU09DOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gVGhpcyBmYWlsIG1heSBiZWNhdXNlIG9mIHRoZSBBUCBhbHJlYWR5IGtlZXAgdXMgaW4gaXRzIE1BQyB0YWJsZSB3aXRob3V0Ci0JCQkvLyBhZ2Vpbmctb3V0LiBUaGUgcHJldmlvdXMgYXV0aGVudGljYXRpb24gYXR0ZW1wdCBtdXN0IGhhdmUgbGV0IGl0IHJlbW92ZSB1cy4KLQkJCS8vIHNvIHRyeSBBdXRoZW50aWNhdGlvbiBhZ2FpbiBtYXkgaGVscC4gRm9yIEQtTGluayBEV0wtOTAwQVArIGNvbXBhdGliaWxpdHkuCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgYWdhaW4uLi5cbiIpKTsKLQkJCXsKLQkJCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkgfHwKLQkJCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2gpKQotCQkJCXsKLQkJCQkJLy8gZWl0aGVyIE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCBvciBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLCB0cnkgc2hhcmVkIGtleSBmaXJzdAotCQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBBVVRIX01PREVfS0VZKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQXV0aFBhcm1GaWxsKHBBZCwgJkF1dGhSZXEsIHBBZC0+TWxtZUF1eC5Cc3NpZCwgQVVUSF9NT0RFX09QRU4pOwotCQkJCX0KLQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCi0JCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOwotCi0JCQl9Ci0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX0FVVEgyOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdEF1dGhQcm9jMigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICBSZWFzb247Ci0JTUxNRV9BU1NPQ19SRVFfU1RSVUNUICAgICAgICBBc3NvY1JlcTsKLQlNTE1FX0FVVEhfUkVRX1NUUlVDVCAgICAgICAgIEF1dGhSZXE7Ci0KLQlpZiAoRWxlbS0+TXNnVHlwZSA9PSBNVDJfQVVUSF9DT05GKQotCXsKLQkJTmRpc01vdmVNZW1vcnkoJlJlYXNvbiwgRWxlbS0+TXNnLCBzaXplb2YoVVNIT1JUKSk7Ci0JCWlmIChSZWFzb24gPT0gTUxNRV9TVUNDRVNTKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBPS1xuIikpOwotCQkJQXNzb2NQYXJtRmlsbChwQWQsICZBc3NvY1JlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBwQWQtPk1sbWVBdXguQ2FwYWJpbGl0eUluZm8sCi0JCQkJCQkJICBBU1NPQ19USU1FT1VULCBwQWQtPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQpOwotCQkJewotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVNTT0NfUkVRLAotCQkJCQkJCXNpemVvZihNTE1FX0FTU09DX1JFUV9TVFJVQ1QpLCAmQXNzb2NSZXEpOwotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BU1NPQzsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCkgJiYKLQkJCQkgKHBBZC0+TWxtZUF1eC5BbGcgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gQVVUSCBGQUlMLCB0cnkgT1BFTiBzeXN0ZW0uLi5cbiIpKTsKLQkJCQlBdXRoUGFybUZpbGwocEFkLCAmQXV0aFJlcSwgcEFkLT5NbG1lQXV4LkJzc2lkLCBOZGlzODAyXzExQXV0aE1vZGVPcGVuKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIEFVVEhfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfQVVUSF9SRVEsCi0JCQkJCQkJc2l6ZW9mKE1MTUVfQVVUSF9SRVFfU1RSVUNUKSwgJkF1dGhSZXEpOwotCi0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9BVVRIMjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBub3Qgc3VjY2VzcywgdHJ5IG5leHQgQlNTCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQ05UTCAtIEFVVEggRkFJTCwgZ2l2ZSB1cDsgdHJ5IG5leHQgQlNTXG4iKSk7Ci0JCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsgLy8/Pz8/Pz8/Ci0JCQkJcEFkLT5NbG1lQXV4LkJzc0lkeCsrOwotCQkJCUl0ZXJhdGVPbkJzc1RhYihwQWQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBDbnRsV2FpdEFzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgUmVhc29uOwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX0FTU09DX0NPTkYpCi0JewotCQlOZGlzTW92ZU1lbW9yeSgmUmVhc29uLCBFbGVtLT5Nc2csIHNpemVvZihVU0hPUlQpKTsKLQkJaWYgKFJlYXNvbiA9PSBNTE1FX1NVQ0NFU1MpCi0JCXsKLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQkJCXsKLQkJCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19BU1NPQ19FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQkJfQotCi0JCQlMaW5rVXAocEFkLCBCU1NfSU5GUkEpOwotCQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLHBBZC0+TWxtZUF1eC5Cc3NJZHgpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8vIG5vdCBzdWNjZXNzLCB0cnkgbmV4dCBCU1MKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBc3NvY2lhdGlvbiBmYWlscyBvbiBCU1MgIyVsZFxuIixwQWQtPk1sbWVBdXguQnNzSWR4KSk7Ci0JCQlwQWQtPk1sbWVBdXguQnNzSWR4Kys7Ci0JCQlJdGVyYXRlT25Cc3NUYWIocEFkKTsKLQkJfQotCX0KLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgQ250bFdhaXRSZWFzc29jUHJvYygKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUICAgICAgUmVzdWx0OwotCi0JaWYgKEVsZW0tPk1zZ1R5cGUgPT0gTVQyX1JFQVNTT0NfQ09ORikKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZSZXN1bHQsIEVsZW0tPk1zZywgc2l6ZW9mKFVTSE9SVCkpOwotCQlpZiAoUmVzdWx0ID09IE1MTUVfU1VDQ0VTUykKLQkJewotCQkJLy8gc2VuZCB3aXJlbGVzcyBldmVudCAtIGZvciBhc3NvY2lhdGlvbgotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0FTU09DX0VWRU5UX0ZMQUcsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uQWRkciwgQlNTMCwgMCk7Ci0KLQkJCS8vCi0JCQkvLyBORElTIHJlcXVpcmVzIGEgbmV3IExpbmsgVVAgaW5kaWNhdGlvbiBidXQgbm8gTGluayBEb3duIGZvciBSRS1BU1NPQwotCQkJLy8KLQkJCUxpbmtVcChwQWQsIEJTU19JTkZSQSk7Ci0KLQkJCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX0lETEU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gUmUtYXNzb2NpdGlvbiBzdWNjZXNzZnVsIG9uIEJTUyAjJWxkXG4iLCBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gcmVhc3NvYyBmYWlsZWQsIHRyeSB0byBwaWNrIG5leHQgQlNTIGluIHRoZSBCU1MgVGFibGUKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBSZS1hc3NvY2l0aW9uIGZhaWxzIG9uIEJTUyAjJWxkXG4iLCBwQWQtPk1sbWVBdXguUm9hbUlkeCkpOwotCQkJewotCQkJCXBBZC0+TWxtZUF1eC5Sb2FtSWR4Kys7Ci0JCQkJSXRlcmF0ZU9uQnNzVGFiMihwQWQpOwotCQkJfQotCQl9Ci0JfQotfQotCi0KLVZPSUQJQWRob2NUdXJuT25Rb3MoCi0JSU4gIFBSVE1QX0FEQVBURVIgcEFkKQotewotI2RlZmluZSBBQzBfREVGX1RYT1AJCTAKLSNkZWZpbmUgQUMxX0RFRl9UWE9QCQkwCi0jZGVmaW5lIEFDMl9ERUZfVFhPUAkJOTQKLSNkZWZpbmUgQUMzX0RFRl9UWE9QCQk0NwotCi0JLy8gVHVybiBvbiBRT3MgaWYgdXNlIEhUIHJhdGUuCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYlZhbGlkID09IEZBTFNFKQotCXsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iVmFsaWQgPSBUUlVFOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzBdID0gMzsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5BaWZzblsxXSA9IDc7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQWlmc25bMl0gPSAxOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkFpZnNuWzNdID0gMTsKLQotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzBdID0gNDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21pblsxXSA9IDQ7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtaW5bMl0gPSAzOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWluWzNdID0gMjsKLQotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzBdID0gMTA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uQ3dtYXhbMV0gPSA2OwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkN3bWF4WzJdID0gNDsKLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5Dd21heFszXSA9IDM7Ci0KLQkJcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5UeG9wWzBdICA9IDA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uVHhvcFsxXSAgPSAwOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbMl0gID0gQUMyX0RFRl9UWE9QOwotCQlwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLlR4b3BbM10gID0gQUMzX0RFRl9UWE9QOwotCX0KLQlBc2ljU2V0RWRjYVBhcm0ocEFkLCAmcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybSk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIExpbmtVcCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBVQ0hBUiBCc3NUeXBlKQotewotCVVMT05HCU5vdzsKLQlVSU5UMzIJRGF0YTsKLQlCT09MRUFOCUNhbmNlbGxlZDsKLQlVQ0hBUglWYWx1ZSA9IDAsIGlkeCA9IDAsIEhhc2hJZHggPSAwOwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTCwgKnBDdXJyRW50cnkgPSBOVUxMOwotCi0JLy8gSW5pdCBDaGFubmVsUXVhbGl0eSB0byBwcmV2ZW50IERFQURfQ1FJIGF0IGluaXRpYWwgTGlua1VwCi0JcEFkLT5NbG1lLkNoYW5uZWxRdWFsaXR5ID0gNTA7Ci0KLQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlpZiAocEVudHJ5KQotCXsKLQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBFbnRyeS0+QWlkLCBwRW50cnktPkFkZHIpOwotCQlwRW50cnkgPSBOVUxMOwotCX0KLQotCi0JcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0KLQkvLwotCS8vIEFTU09DIC0gRGlzYXNzb2NUaW1lb3V0QWN0aW9uCi0JLy8gQ05UTCAtIERpcy1hc3NvY2lhdGUgc3VjY2Vzc2Z1bAotCS8vICEhISBMSU5LIERPV04gISEhCi0JLy8gWzg4ODg4XSBPSURfODAyXzExX1NTSUQgc2hvdWxkIGhhdmUgcmV0dXJuZWQgTkRURVNUX1dFUF9BUDIoUmV0dXJuZWQ6ICkKLQkvLwotCS8vIFRvIHByZXZlbnQgRGlzYXNzb2NUaW1lb3V0QWN0aW9uIHRvIGNhbGwgTGluayBkb3duIGFmdGVyIHdlIGxpbmsgdXAsCi0JLy8gY2FuY2VsIHRoZSBEaXNhc3NvY1RpbWVyIG5vIG1hdHRlciB3aGF0IGl0IHN0YXJ0IG9yIG5vdC4KLQkvLwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkRpc2Fzc29jVGltZXIsICAmQ2FuY2VsbGVkKTsKLQotCUNPUFlfU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlDT1BZX0hUU0VUVElOR1NfRlJPTV9NTE1FX0FVWF9UT19BQ1RJVkVfQ0ZHKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkvLyBCZWZvcmUgcG93ZXIgc2F2ZSBiZWZvcmUgbGluayB1cCBmdW5jdGlvbiwgV2Ugd2lsbCBmb3JjZSB1c2UgMVIuCi0JLy8gU28gYWZ0ZXIgbGluayB1cCwgY2hlY2sgUnggYW50ZW5uYSAjIGFnYWluLgotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgJlZhbHVlKTsKLQlpZihwQWQtPkFudGVubmEuZmllbGQuUnhQYXRoID09IDMpCi0JewotCQlWYWx1ZSB8PSAoMHgxMCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAyKQotCXsKLQkJVmFsdWUgfD0gKDB4OCk7Ci0JfQotCWVsc2UgaWYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA9PSAxKQotCXsKLQkJVmFsdWUgfD0gKDB4MCk7Ci0JfQotCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLQlwQWQtPlN0YUNmZy5CQlBSMyA9IFZhbHVlOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0JaWYgKEJzc1R5cGUgPT0gQlNTX0FESE9DKQotCXsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKLQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfSU5GUkFfT04pOwotCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLyBSb2dlciBzeW5jIENhcnJpZXIKLQkJLy8gTm8gY2FycmllciBkZXRlY3Rpb24gd2hlbiBhZGhvYwotCQkvLyBDYXJyaWVyRGV0ZWN0aW9uU3RvcChwQWQpOwotCQlwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkNEX1N0YXRlID0gQ0RfTk9STUFMOwotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKQotCQkJQWRob2NUdXJuT25Rb3MocEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFBZGhvYyBMSU5LIFVQICEhISBcbiIgKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFJbmZyYSBMSU5LIFVQICEhISBcbiIgKSk7Ci0JfQotCi0JCS8vIDMqMwotCQkvLyByZXNldCBUeCBiZWFtZm9ybWluZyBiaXQKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MDEpOwotCQlWYWx1ZSB8PSBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuVHhCRjsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gQ2hhbmdlIHRvIEFQIGNoYW5uZWwKLSAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA+IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpICYmIChwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGggPT0gQldfNDApKQotCXsKLQkJLy8gTXVzdCB1c2luZyA0ME1Iei4KLQkJcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfNDA7Ci0JCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotCi0JCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJVmFsdWUgJj0gKH4weDE4KTsKLQkJVmFsdWUgfD0gMHgxMDsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHgyMCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJUlRNUF9JT19SRUFEMzIocEFkLCBUWF9CQU5EX0NGRywgJkRhdGEpOwotCQlEYXRhICY9IDB4ZmZmZmZmZmU7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7Ci0JCX0KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISE0ME1IeiBMb3dlciBMSU5LIFVQICEhISBDb250cm9sIENoYW5uZWwgYXQgQmVsb3cuIENlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCX0KLQkJZWxzZSBpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsIDwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkgJiYgKHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JICAgIHsKLQkJICAgIC8vIE11c3QgdXNpbmcgNDBNSHouCi0JCQlwQWQtPkNvbW1vbkNmZy5CQlBDdXJyZW50QlcgPSBCV180MDsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJICAgIEFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmVmFsdWUpOwotCQlWYWx1ZSAmPSAofjB4MTgpOwotCQlWYWx1ZSB8PSAweDEwOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgVmFsdWUpOwotCi0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJRGF0YSB8PSAweDE7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkgICAgVmFsdWUgfD0gKDB4MjApOwotCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgVmFsdWUpOwotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuQkJQUjMgPSBWYWx1ZTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCQlpZiAocEFkLT5NQUNWZXJzaW9uID09IDB4Mjg2MDAxMDApCi0JCXsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjY5LCAweDFBKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjcwLCAweDBBKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDE2KTsKLQkJCSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7Ci0JCX0KLQotCQkgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIDQwTUh6IFVwcGVyIExJTksgVVAgISEhIENvbnRyb2wgQ2hhbm5lbCBhdCBVcHBlckNlbnRyYWwgPSAlZCBcbiIsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICkpOwotCSAgICB9Ci0JICAgIGVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkgICAgewotCQkgICAgcEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID0gQldfMjA7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJCUFzaWNTd2l0Y2hDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgRkFMU0UpOwotCQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0KLQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgJlZhbHVlKTsKLQkJCVZhbHVlICY9ICh+MHgxOCk7Ci0JCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBWYWx1ZSk7Ci0KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfQkFORF9DRkcsICZEYXRhKTsKLQkJCURhdGEgJj0gMHhmZmZmZmZmZTsKLQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX0JBTkRfQ0ZHLCBEYXRhKTsKLQotCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCAmVmFsdWUpOwotCQkJVmFsdWUgJj0gKH4weDIwKTsKLQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjMsIFZhbHVlKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkJCUFIzID0gVmFsdWU7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkJCWlmIChwQWQtPk1BQ1ZlcnNpb24gPT0gMHgyODYwMDEwMCkKLQkJCXsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I2OSwgMHgxNik7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNzAsIDB4MDgpOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjczLCAweDExKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISFydDI4NjBDICEhISBcbiIgKSk7Ci0JCQl9Ci0KLQkJICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISAyME1IeiBMSU5LIFVQICEhISBcbiIgKSk7Ci0JfQotCi0JUlRNUFNldEFHQ0luaXRWYWx1ZShwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyk7Ci0JLy8KLQkvLyBTYXZlIEJCUF9SNjYgdmFsdWUsIGl0IHdpbGwgYmUgdXNlZCBpbiBSVFVTQlJlc3VtZU1zZHVUcmFuc21pc3Npb24KLQkvLwotCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWQsIEJCUF9SNjYsICZwQWQtPkJicFR1bmluZy5SNjZDdXJyZW50VmFsdWUpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExJTksgVVAgISEhIChCc3NUeXBlPSVkLCBBSUQ9JWQsIHNzaWQ9JXMsIENoYW5uZWw9JWQsIENlbnRyYWxDaGFubmVsID0gJWQpXG4iLAotCQlCc3NUeXBlLCBwQWQtPlN0YUFjdGl2ZS5BaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgKERlbnNpdHkgPSVkLCApXG4iLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLk1wZHVEZW5zaXR5KSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JQXNpY1NldFNsb3RUaW1lKHBBZCwgVFJVRSk7Ci0JQXNpY1NldEVkY2FQYXJtKHBBZCwgJnBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0pOwotCi0KLQkvLyBDYWxsIHRoaXMgZm9yIFJUUyBwcm90ZWN0aW9uZm9yIGxlZ2FjeSByYXRlLCB3ZSB3aWxsIGFsd2F5cyBlbmFibGUgUlRTIHRocmVzaG9sZCwgYnV0IG5vcm1hbGx5IGl0IHdpbGwgbm90IGhpdAotCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgMCwgKE9GRE1TRVRQUk9URUNUIHwgQ0NLU0VUUFJPVEVDVCksIFRSVUUsIEZBTFNFKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmICgocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gVFJVRSkpCi0JewotCQkvLyBVcGRhdGUgSFQgcHJvdGVjdGlvbmZvciBiYXNlZCBvbiBBUCdzIG9wZXJhdGluZyBtb2RlLgotCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCi0JewotCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsICBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKLQl9Ci0JZWxzZQotCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAgQUxMTl9TRVRQUk9URUNULCBGQUxTRSwgRkFMU0UpOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPkRyc0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9EUlMpKTsKLQotCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JcEFkLT5TdGFDZmcuTGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAotCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlICE9IFJ0ODAyXzExUHJlYW1ibGVMb25nKSAmJgotCQlDQVBfSVNfU0hPUlRfUFJFQU1CTEVfT04ocEFkLT5TdGFBY3RpdmUuQ2FwYWJpbGl0eUluZm8pKQotCXsKLQkJTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOwotCX0KLQotCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Ci0KLQlpZiAocEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID09IFJEX1NJTEVOQ0VfTU9ERSkKLQl7Ci0jaWZkZWYgREZTX1NVUFBPUlQKLQkJUmFkYXJEZXRlY3Rpb25TdG9wKHBBZCk7Ci0jZW5kaWYgLy8gREZTX1NVUFBPUlQgLy8KLQl9Ci0JcEFkLT5Db21tb25DZmcuUmFkYXJEZXRlY3QuUkRNb2RlID0gUkRfTk9STUFMX01PREU7Ci0KLQlpZiAoQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JewotCQlNYWtlSWJzc0JlYWNvbihwQWQpOwotCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQkJCSYmIChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKQotCQkJJiYgUmFkYXJDaGFubmVsQ2hlY2socEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSkKLQkJewotCQkJOyAvL0RvIG5vdGhpbmcKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOwotCQl9Ci0KLQkJLy8gSW4gYWQgaG9jIG1vZGUsIHVzZSBNQUMgdGFibGUgZnJvbSBpbmRleCAxLgotCQkvLyBwLnMgQVNJQyB1c2UgYWxsIDB4ZmYgYXMgdGVybWluYXRpb24gb2YgV0NJRCB0YWJsZSBzZWFyY2guVG8gcHJldmVudCBpdCdzIDB4ZmYtZmYtZmYtZmYtZmYtZmYsIFdyaXRlIDAgaGVyZS4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1dDSURfQkFTRSwgMHgwMCk7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIDB4MTgwOCwgMHgwMCk7Ci0KLQkJLy8gSWYgV0VQIGlzIGVuYWJsZWQsIGFkZCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyBpbnRvIEFzaWMKLQkJLy8gRmlsbCBpbiBTaGFyZWQgS2V5IFRhYmxlKG9mZnNldDogMHg2YzAwKSBhbmQgU2hhcmVkIEtleSBNb2RlKG9mZnNldDogMHg3MDAwKQotCi0JCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpCi0JCXsKLQkJCVBVQ0hBUglLZXk7Ci0JCQlVQ0hBUglDaXBoZXJBbGc7Ci0KLQkJCWZvciAoaWR4PTA7IGlkeCA8IFNIQVJFX0tFWV9OVU07IGlkeCsrKQotCQl7Ci0JCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5DaXBoZXJBbGc7Ci0JCQlLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleTsKLQotCQkJCWlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbiA+IDApCi0JCQkJewotCQkJCQkvLyBTZXQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgdG8gQXNpYwotCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkKQotCQkJCQl7Ci0JCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKLQkJCQkJfQotCQkJCX0KLQotCi0JCQl9Ci0JCX0KLQkJLy8gSWYgV1BBTm9uZSBpcyBlbmFibGVkLCBhZGQga2V5IG1hdGVyaWFsIGFuZCBjaXBoZXJBbGcgaW50byBBc2ljCi0JCS8vIEZpbGwgaW4gU2hhcmVkIEtleSBUYWJsZShvZmZzZXQ6IDB4NmMwMCkgYW5kIFNoYXJlZCBLZXkgTW9kZShvZmZzZXQ6IDB4NzAwMCkKLQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gMDsJLy8gYWx3YXlzIGJlIHplcm8KLQotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOwotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwQWQtPlN0YUNmZy5QTUssIExFTl9US0lQX0VLKTsKLQotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLSAgICAgICAgICAgIHsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLCAmcEFkLT5TdGFDZmcuUE1LWzE2XSwgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgIH0KLQotCQkJLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQkJCWlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ0lQSEVSX0FFUzsKLQkJCWVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJVbmtub3cgQ2lwaGVyICg9JWQpLCBzZXQgQ2lwaGVyIHRvIEFFU1xuIiwgcEFkLT5TdGFDZmcuUGFpckNpcGhlcikpOwotCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0gICAgICAgICAgICB9Ci0KLQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0JCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCSAgMCwKLQkJCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlJ4TWljKTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZSBmb3IgdGhpcyBncm91cCBrZXkgdGFibGUKLQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCAwLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcsIE5VTEwpOwotCi0JCX0KLQotCX0KLQllbHNlIC8vIEJTU19JTkZSQQotCXsKLQkJLy8gQ2hlY2sgdGhlIG5ldyBTU0lEIHdpdGggbGFzdCBTU0lECi0JCXdoaWxlIChDYW5jZWxsZWQgPT0gVFJVRSkKLQkJewotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkTGVuID09IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pCi0JCQl7Ci0JCQkJaWYgKFJUTVBDb21wYXJlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbikgPT0gMCkKLQkJCQl7Ci0JCQkJCS8vIExpbmsgdG8gdGhlIG9sZCBvbmUgbm8gbGlua2Rvd24gaXMgcmVxdWlyZWQuCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIFNlbmQgbGluayBkb3duIGV2ZW50IGJlZm9yZSBzZXQgdG8gbGluayB1cAotCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBQSFcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8KLQkJLy8gT24gV1BBIG1vZGUsIFJlbW92ZSBBbGwgS2V5cyBpZiBub3QgY29ubmVjdCB0byB0aGUgbGFzdCBCU1NJRAotCQkvLyBLZXkgd2lsbCBiZSBzZXQgYWZ0ZXIgNC13YXkgaGFuZHNoYWtlLgotCQkvLwotCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQl7Ci0JCQlVTE9ORwkJSVY7Ci0KLQkJCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKLQkJCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQkJCVJUTVBXUEFSZW1vdmVBbGxLZXlzKHBBZCk7Ci0JCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQkJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwotCi0JCQkvLyBGaXhlZCBjb25uZWN0aW9uIGZhaWxlZCB3aXRoIFJhbmdlIE1heGltaXplciAtIDUxNSBBUCAoTWFydmVsbCBDaGlwKSB3aGVuIHNlY3VyaXR5IGlzIFdQQVBTSy9US0lQCi0JCQkvLyBJZiBJViByZWxhdGVkIHZhbHVlcyBhcmUgdG9vIGxhcmdlIGluIEdyb3VwTXNnMiwgQVAgd291bGQgaWdub3JlIHRoaXMgbWVzc2FnZS4KLQkJCUlWID0gMTsKLQkJCUlWIHw9IChwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPDwgMzApOwotCQkJQXNpY1VwZGF0ZVdDSURJVkVJVihwQWQsIEJTU0lEX1dDSUQsIElWLCAwKTsKLQkJCS8vUlRNUF9DTEVBUl9QU0ZMQUcocEFkLCBmUlRNUF9QU19DQU5fR09fU0xFRVApOwotCQl9Ci0KLQkJLy8gTk9URToKLQkJLy8gdGhlIGRlY2lzaW9uIG9mIHVzaW5nICJzaG9ydCBzbG90IHRpbWUiIG9yIG5vdCBtYXkgY2hhbmdlIGR5bmFtaWNhbGx5IGR1ZSB0bwotCQkvLyBuZXcgU1RBIGFzc29jaWF0aW9uIHRvIHRoZSBBUC4gc28gd2UgaGF2ZSB0byBkZWNpZGUgdGhhdCB1cG9uIHBhcnNpbmcgQkVBQ09OLCBub3QgaGVyZQotCi0JCS8vIE5PVEU6Ci0JCS8vIHRoZSBkZWNpc2lvbiB0byB1c2UgIlJUQy9DVFMiIG9yICJDVFMtdG8tc2VsZiIgcHJvdGVjdGlvbiBvciBub3QgbWF5IGNoYW5nZSBkeW5hbWljYWxseQotCQkvLyBkdWUgdG8gbmV3IFNUQSBhc3NvY2lhdGlvbiB0byB0aGUgQVAuIHNvIHdlIGhhdmUgdG8gZGVjaWRlIHRoYXQgdXBvbiBwYXJzaW5nIEJFQUNPTiwgbm90IGhlcmUKLQotCQlDb21wb3NlUHNQb2xsKHBBZCk7Ci0JCUNvbXBvc2VOdWxsRnJhbWUocEFkKTsKLQotCQkJQXNpY0VuYWJsZUJzc1N5bmMocEFkKTsKLQotCQkvLyBBZGQgQlNTSUQgdG8gV0NJRCBzZWFyY2ggdGFibGUKLQkJQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgQlNTSURfV0NJRCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JCS8vIElmIFdFUCBpcyBlbmFibGVkLCBhZGQgcGFpZXdpc2UgYW5kIHNoYXJlZCBrZXkKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgIGlmICgoKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkmJgotICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpJiYKLSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpKSB8fAotICAgICAgICAgICAgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkmJgotICAgICAgICAgICAgICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSkpCi0jZWxzZQotCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJewotCQkJUFVDSEFSCUtleTsKLQkJCVVDSEFSCUNpcGhlckFsZzsKLQotCQkJZm9yIChpZHg9MDsgaWR4IDwgU0hBUkVfS0VZX05VTTsgaWR4KyspCi0JCXsKLQkJCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZzsKLQkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5OwotCi0JCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gMCkKLQkJCQl7Ci0JCQkJCS8vIFNldCBrZXkgbWF0ZXJpYWwgYW5kIGNpcGhlckFsZyB0byBBc2ljCi0JCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7Ci0KLQkJCQkJaWYgKGlkeCA9PSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpCi0JCQkJCXsKLQkJCQkJCS8vIEFzc2lnbiBncm91cCBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKLQotCQkJCQkJcEVudHJ5LT5BaWQgPSBCU1NJRF9XQ0lEOwotCQkJCQkJLy8gQXNzaWduIHBhaXJ3aXNlIGtleSBpbmZvCi0JCQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwgQlNTMCwgaWR4LCBDaXBoZXJBbGcsIHBFbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgbmVlZCB0byBpbmRpY2F0ZSBjb25uZWN0aXZpdHkgaW1tZWRpYXRlbHk7IEFESE9DIG1vZGUKLQkJLy8gc2hvdWxkIHdhaXQgdW50aWwgYXQgbGVhc3QgMiBhY3RpdmUgbm9kZXMgaW4gdGhpcyBCU1NJRC4KLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0KLSAgICAgICAgLy8gRm9yIEdVSSArKwotCQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCXsKLQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsKLQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0JCX0KLQkJZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQl7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9ESVNBQkxFKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJCQlSVE1QU2V0VGltZXIoJnBBZC0+TWxtZS5MaW5rRG93blRpbWVyLCBMSU5LX0RPV05fVElNRU9VVCk7Ci0JCX0KLSAgICAgICAgLy8gLS0KLQotCQkvLyBBZGQgQlNTSUQgaW4gbXkgTUFDIFRhYmxlLgotICAgICAgICBOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotCQkvLyBhZGQgdGhpcyBNQUMgZW50cnkgaW50byBIQVNIIHRhYmxlCi0JCWlmIChwRW50cnkpCi0JCXsKLQkJCUhhc2hJZHggPSBNQUNfQUREUl9IQVNIX0lOREVYKHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCWlmIChwQWQtPk1hY1RhYi5IYXNoW0hhc2hJZHhdID09IE5VTEwpCi0JCQl7Ci0JCQkJcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XSA9IHBFbnRyeTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwQ3VyckVudHJ5ID0gcEFkLT5NYWNUYWIuSGFzaFtIYXNoSWR4XTsKLQkJCQl3aGlsZSAocEN1cnJFbnRyeS0+cE5leHQgIT0gTlVMTCkKLQkJCQl7Ci0JCQkJCXBDdXJyRW50cnkgPSBwQ3VyckVudHJ5LT5wTmV4dDsKLQkJCQl9Ci0JCQkJcEN1cnJFbnRyeS0+cE5leHQgPSBwRW50cnk7Ci0JCQl9Ci0JCX0KLQkJUlRNUE1vdmVNZW1vcnkocEVudHJ5LT5BZGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJcEVudHJ5LT5BaWQgPSBCU1NJRF9XQ0lEOwotCQlwRW50cnktPnBBZCA9IHBBZDsKLQkJcEVudHJ5LT5WYWxpZEFzQ0xJID0gVFJVRTsJLy9BbHRob3VnaCB0aGlzIGlzIGJzc2lkLi5zdGlsbCBzZXQgVmFsaWRBc0NsCi0JCXBBZC0+TWFjVGFiLlNpemUgPSAxOwkvLyBpbmZyYSBtb2RlIGFsd2F5cyBzZXQgTUFDdGFiIHNpemUgPTEuCi0JCXBFbnRyeS0+U3N0ID0gU1NUX0FTU09DOwotCQlwRW50cnktPkF1dGhTdGF0ZSA9IFNTVF9BU1NPQzsKLQkJcEVudHJ5LT5BdXRoTW9kZSA9IHBBZC0+U3RhQ2ZnLkF1dGhNb2RlOwotCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJaWYgKHBFbnRyeS0+QXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCXsKLQkJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19OT1RVU0U7Ci0JCQlwRW50cnktPlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXBFbnRyeS0+V3BhU3RhdGUgPSBBU19QVEtTVEFSVDsKLQkJCXBFbnRyeS0+UHJpdmFjeUZpbHRlciA9IE5kaXM4MDJfMTFQcml2RmlsdGVyODAyMXhXRVA7Ci0JCX0KLQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBVUCAhISEgIENsaWVudFN0YXR1c0ZsYWdzPSVseClcbiIsCi0JCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7Ci0KLQotCQlNbG1lVXBkYXRlVHhSYXRlcyhwQWQsIFRSVUUsIEJTUzApOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlNbG1lVXBkYXRlSHRUeFJhdGVzKHBBZCwgQlNTMCk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIFVQICEhIChTdGFBY3RpdmUuYkh0RW5hYmxlID0lZCwgKVxuIiwgcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUpKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQWdncmVnYXRpb25DYXBhYmxlKQotCQl7Ci0JCQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLmJQaWdneUJhY2tDYXBhYmxlKSAmJiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgJiAweDAwMDAwMDAzKSA9PSAzKQotCQkJewotCi0JCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOwotCQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19BR0dSRUdBVElPTl9JTlVTRUQpOwotCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BR0dSRUdBVElPTl9DQVBBQkxFKTsKLQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUElHR1lCQUNLX0NBUEFCTEUpOwotCQkJCVJUTVBTZXRQaWdneUJhY2socEFkLCBUUlVFKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJUdXJuIG9uIFBpZ2d5LUJhY2tcbiIpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5BUFJhbGlua0llICYgMHgwMDAwMDAwMSkKLQkJCXsKLQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfQUdHUkVHQVRJT05fQ0FQQUJMRSk7Ci0JCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocEFkLT5NbG1lQXV4LkFQUmFsaW5rSWUgIT0gMHgwKQotCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKSkKLQkJCXsKLQkJCQlBc2ljRW5hYmxlUkRHKHBBZCk7Ci0JCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKLQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmQ0xJRU5UX1NUQVRVU19SQUxJTktfQ0hJUFNFVCk7Ci0JCQlDTElFTlRfU1RBVFVTX0NMRUFSX0ZMQUcoJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sIGZDTElFTlRfU1RBVFVTX1JBTElOS19DSElQU0VUKTsKLQkJfQotCX0KLQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfQ09OTkVDVCBFdmVudCBCIS5CQUNhcGFiaWxpdHkgPSAleC4gQ2xpZW50U3RhdHVzRmxhZ3MgPSAlbHhcbiIsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS53b3JkLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkNsaWVudFN0YXR1c0ZsYWdzKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBTZXQgTEVECi0JUlRNUFNldExFRChwQWQsIExFRF9MSU5LX1VQKTsKLQotCXBBZC0+TWxtZS5QZXJpb2RpY1JvdW5kID0gMDsKLQlwQWQtPk1sbWUuT25lU2VjUGVyaW9kaWNSb3VuZCA9IDA7Ci0JcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IEZBTFNFOyAgICAgICAgLy8gUmVzZXQgY29uZmlnIGZsYWcKLQlwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19VUDsgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAotCi0JLy8gU2V0IGFzaWMgYXV0byBmYWxsIGJhY2sKLQl7Ci0JCVBVQ0hBUgkJCQkJcFRhYmxlOwotCQlVQ0hBUgkJCQkJVGFibGVTaXplID0gMDsKLQotCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBBZC0+Q29tbW9uQ2ZnLlR4UmF0ZUluZGV4KTsKLQkJQXNpY1VwZGF0ZUF1dG9GYWxsQmFja1RhYmxlKHBBZCwgcFRhYmxlKTsKLQl9Ci0KLQlOZGlzQWNxdWlyZVNwaW5Mb2NrKCZwQWQtPk1hY1RhYkxvY2spOwotICAgIHBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUud29yZDsKLSAgICBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0JaWYgKHBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID09IEZBTFNFKQotCXsKLQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKQotCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IEdJXzgwMDsKLQotCQlpZiAoKHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA+IE1DU183KSB8fCAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID09IDMyKSkKLQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSBTVEJDX05PTkU7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCS8vIElmIHRoZSBsZWdhY3kgbW9kZSBpcyBzZXQsIG92ZXJ3cml0ZSB0aGUgdHJhbnNtaXQgc2V0dGluZyBvZiB0aGlzIGVudHJ5LgotCQlpZiAocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pCi0JCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCX0KLQllbHNlCi0JCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQkvLyAgTGV0IExpbmsgU3RhdHVzIFBhZ2UgZGlzcGxheSBmaXJzdCBpbml0aWFsIHJhdGUuCi0JcEFkLT5MYXN0VHhSYXRlID0gKFVTSE9SVCkocEVudHJ5LT5IVFBoeU1vZGUud29yZCk7Ci0JLy8gU2VsZWN0IERBQyBhY2NvcmRpbmcgdG8gSFQgb3IgTGVnYWN5Ci0JaWYgKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0WzBdICE9IDB4MDApCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHgxOCk7Ci0JCWlmIChwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoID09IDIpCi0JCXsKLQkJICAgIFZhbHVlIHw9IDB4MTA7Ci0JCX0KLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgVmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsICZWYWx1ZSk7Ci0JCVZhbHVlICY9ICh+MHgxOCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjEsIFZhbHVlKTsKLQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAocEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPT0gRkFMU0UpCi0JewotCX0KLQllbHNlIGlmIChwRW50cnktPk1heFJBbXBkdUZhY3RvciA9PSAwKQotCXsKLQkgICAgLy8gSWYgSFQgQVAgZG9lc24ndCBzdXBwb3J0IE1heFJBbXBkdUZhY3RvciA9IDEsIHdlIG5lZWQgdG8gc2V0IG1heCBQU0RVIHRvIDAuCi0JICAgIC8vIEJlY2F1c2Ugb3VyIEluaXQgdmFsdWUgaXMgMSBhdCBNQUNSZWdUYWJsZS4KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFYX0xFTl9DRkcsIDB4MGZmZik7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JLy8gUGF0Y2ggZm9yIE1hcnZlbCBBUCB0byBnYWluIGhpZ2ggdGhyb3VnaHB1dAotCS8vIE5lZWQgdG8gc2V0IGFzIGZvbGxvd2luZywKLQkvLyAxLiBTZXQgdHhvcCBpbiByZWdpc3Rlci1FRENBX0FDMF9DRkcgYXMgMHg2MAotCS8vIDIuIFNldCBFblRYV3JpdGVCYWNrRERPTkUgaW4gcmVnaXN0ZXItV1BETUFfR0xPX0NGRyBhcyB6ZXJvCi0JLy8gMy4gUEJGX01BWF9QQ05UIGFzIDB4MUYzRkJGOUYKLQkvLyA0LiBraWNrIHBlciB0d28gcGFja2V0cyB3aGVuIGRlcXVldWUKLQkvLwotCS8vIFR4b3AgY2FuIG9ubHkgYmUgbW9kaWZpZWQgd2hlbiBSREcgaXMgb2ZmLCBXTU0gaXMgZGlzYWJsZSBhbmQgVHhCdXJzdCBpcyBlbmFibGUKLQkvLwotCS8vIGlmIDEuIExlZ2FjeSBBUCBXTU0gb24sICBvciAyLiAxMW4gQVAsIEFNUERVIGRpc2FibGUuICBGb3JjZSB0dXJuIG9mZiBidXJzdCBubyBtYXR0ZXIgd2hhdCBiRW5hYmxlVHhCdXJzdCBpcy4KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoISgocEFkLT5Db21tb25DZmcuUnhTdHJlYW0gPT0gMSkmJihwQWQtPkNvbW1vbkNmZy5UeFN0cmVhbSA9PSAxKSkgJiYKLQkJKHBBZC0+U3RhQ2ZnLmJGb3JjZVR4QnVyc3QgPT0gRkFMU0UpICYmCi0JCSgoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IEZBTFNFKSAmJiBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpKQotCQl8fCAoKHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID09IFRSVUUpICYmIChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUG9saWN5ID09IEJBX05PVFVTRSkpKSkKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7Ci0JCURhdGEgICY9IDB4RkZGRkZGMDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAxXG4iKSk7Ci0JfQotCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JewotCQlSVE1QX0lPX1JFQUQzMihwQWQsIEVEQ0FfQUMwX0NGRywgJkRhdGEpOwotCQlEYXRhICAmPSAweEZGRkZGRjAwOwotCQlEYXRhICB8PSAweDYwOwotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIERhdGEpOwotCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOb3dBdGhlcm9zQnVyc3RPbiA9IFRSVUU7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0ZCRjlGKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAyXG4iKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmRGF0YSk7Ci0JCURhdGEgICY9IDB4RkZGRkZGMDA7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIEVEQ0FfQUMwX0NGRywgRGF0YSk7Ci0KLQkJUlRNUF9JT19XUklURTMyKHBBZCwgUEJGX01BWF9QQ05ULCAweDFGM0Y3RjlGKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiVHhidXJzdCAzXG4iKSk7Ci0JfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JLy8gUmUtY2hlY2sgdG8gdHVybiBvbiBUWCBidXJzdCBvciBub3QuCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJMYXN0QXRoZXJvcyA9PSBUUlVFKSAmJiAoKFNUQV9XRVBfT04ocEFkKSl8fChTVEFfVEtJUF9PTihwQWQpKSkpCi0JewotCQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEgPSBUUlVFOwotCQlpZiAocEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QpCi0JCXsKLQkJICAgIFVJTlQzMiBNQUNWYWx1ZSA9IDA7Ci0JCQkvLyBGb3JjZSBkaXNhYmxlICBUWE9QIHZhbHVlIGluIHRoaXMgY2FzZS4gVGhlIHNhbWUgYWN0aW9uIGluIE1MTUVVcGRhdGVQcm90ZWN0IHRvby4KLQkJCS8vIEkgZGlkbid0IGNoYW5nZSBQQkZfTUFYX1BDTlQgc2V0dGluZy4KLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgRURDQV9BQzBfQ0ZHLCAmTUFDVmFsdWUpOwotCQkJTUFDVmFsdWUgICY9IDB4RkZGRkZGMDA7Ci0JCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBFRENBX0FDMF9DRkcsIE1BQ1ZhbHVlKTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTmV4dERpc2FibGVSeEJBID0gRkFMU0U7Ci0JfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JcEFkLT5Db21tb25DZmcuSU9UZXN0UGFybS5iTGFzdEF0aGVyb3MgPSBGQUxTRTsKLQlDT1BZX01BQ19BRERSKHBBZC0+Q29tbW9uQ2ZnLkxhc3RCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhIXBBZC0+Yk5leHREaXNhYmxlUnhCQT0gJWQgXG4iLCBwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJOZXh0RGlzYWJsZVJ4QkEpKTsKLQkvLyBCU1NJRCBhZGQgaW4gb25lIE1BQyBlbnRyeSB0b28uICBCZWNhdXNlIGluIFR4LCBBU0lDIG5lZWQgdG8gY2hlY2sgQ2lwaGVyIGFuZCBJVi9FSVYsIEJBYml0bWFwCi0JLy8gUHRoZXIgaW5mb3JtYXRpb24gaW4gTUFDVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0gaXMgbm90IG5lY2Vzc2FyeSBmb3IgZHJpdmVyLgotCS8vIE5vdGU6IEFzIFNUQSwgVGhlIE1BQ1RhYi5Db250ZW50W0JTU0lEX1dDSURdLiBQYWlyd2lzZUtleSBhbmQgU2hhcmVkIEtleSBmb3IgQlNTMCBhcmUgdGhlIHNhbWUuCi0KLQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzIDw9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQl7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQlpZiAocEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICYmCi0JCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJgotCQkJKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKSkKLQkJCTsKLQkJZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJewotCQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlckFjY2VwdEFsbDsKLQkJfQotCX0KLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JcEVudHJ5LT5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLSAgICAvLwotCS8vIFBhdGNoIEF0aGVyb3MgQVAgVFggd2lsbCBicmVha2Rvd24gaXNzdWUuCi0JLy8gQVAgTW9kZWw6IERMaW5rIERXTC04MjAwQVAKLQkvLwotCWlmIChJTkZSQV9PTihwQWQpICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgJiYgU1RBX1RLSVBfT04ocEFkKSkKLQl7Ci0JCVJUTVBfSU9fV1JJVEUzMihwQWQsIFJYX1BBUlNFUl9DRkcsIDB4MDEpOwotCX0KLQllbHNlCi0JewotCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBSWF9QQVJTRVJfQ0ZHLCAweDAwKTsKLQl9Ci0KLQlSVE1QX0NMRUFSX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLQlSVE1QX0NMRUFSX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0dPX1RPX1NMRUVQX05PVyk7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JaWYgKChwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuYjIwNDBDb2V4aXN0U2NhblN1cCkgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTEpKQotCXsKLQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NDQU5fMjA0MCk7Ci0JCUJ1aWxkRWZmZWN0ZWRDaGFubmVsTGlzdChwQWQpOwotCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUJRGVzY3JpcHRpb246Ci0JCURpc2Nvbm5lY3QgY3VycmVudCBCU1NJRAotCi0JQXJndW1lbnRzOgotCQlwQWQJCQkJLSBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCUlzUmVxRnJvbUFQCQktIFJlcXVlc3QgZnJvbSBBUAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0JCVdlIG5lZWQgbW9yZSBpbmZvcm1hdGlvbiB0byBrbm93IGl0J3MgdGhpcyByZXF1c3QgZnJvbSBBUC4KLQkJSWYgeWVzISB3ZSBuZWVkIHRvIGRvIGV4dHJhIGhhbmRsaW5nLCBmb3IgZXhhbXBsZSwgcmVtb3ZlIHRoZSBXUEEga2V5LgotCQlPdGhlcndpc2Ugb24gNC13YXkgaGFuZHNoYWtpbmcgd2lsbCBmYWllZCwgc2luY2UgdGhlIFdQQSBrZXkgZGlkbid0IGJlCi0JCXJlbW92ZSB3aGlsZSBhdXRvIHJlY29ubmVjdC4KLQkJRGlzY29ubmVjdCByZXF1ZXN0IGZyb20gQVAsIGl0IG1lYW5zIHdlIHdpbGwgc3RhcnQgYWZyZXNoIDQtd2F5IGhhbmRzaGFraW5nCi0JCW9uIFdQQSBtb2RlLgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIExpbmtEb3duKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOICBCT09MRUFOICAgICAgSXNSZXFGcm9tQVApCi17Ci0JVUNIQVIJCQkgICAgaSwgQnl0ZVZhbHVlID0gMDsKLQotCUJPT0xFQU4JCUNhbmNlbGxlZDsKLQotCS8vIERvIG5vdGhpbmcgaWYgbW9uaXRvciBtb2RlIGlzIG9uCi0JaWYgKE1PTklUT1JfT04ocEFkKSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCS8vIE5vdGhpbmcgdG8gZG8gaW4gQVRFIG1vZGUuCi0JaWYgKEFURV9PTihwQWQpKQotCQlyZXR1cm47Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfR09fVE9fU0xFRVBfTk9XKTsKLQkvL0NvbW1lbnQgdGhlIGNvZGVzLCBiZWFzdWUgdGhlIGxpbmUgMjI5MSBjYWxsIHRoZSBzYW1lIGZ1bmN0aW9uLgotCS8vUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWUuUHNQb2xsVGltZXIsCQkmQ2FuY2VsbGVkKTsKLQkvLyBOb3QgYWxsb3cgZ28gdG8gc2xlZXAgd2l0aGluIGxpbmtkb3duIGZ1bmN0aW9uLgotCVJUTVBfQ0xFQVJfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLQotICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iV2lyZWxlc3NFdmVudCkKLQl7Ci0JCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX1NUQV9MSU5LRE9XTl9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gISEhXG4iKSk7Ci0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgIGlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLSAgICB7Ci0JICAgIEJPT0xFQU4gQ2FuY2VsbGVkOwotICAgICAgICBwQWQtPk1sbWUuYlBzUG9sbFRpbWVyUnVubmluZyA9IEZBTFNFOwotICAgICAgICBSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZS5Qc1BvbGxUaW1lciwJJkNhbmNlbGxlZCk7Ci0gICAgfQotCi0JcEFkLT5iUENJY2xrT2ZmID0gRkFMU0U7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLSAgICBpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKQotfHwJUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX1NFVF9QQ0lfQ0xLX09GRl9DT01NQU5EKQotCQl8fCBSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpKQotICAgIHsKLSAgICAgICAgQVVUT19XQUtFVVBfU1RSVUMgQXV0b1dha2V1cENmZzsKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0gICAgICAgIEF1dG9XYWtldXBDZmcud29yZCA9IDA7Ci0JICAgIFJUTVBfSU9fV1JJVEUzMihwQWQsIEFVVE9fV0FLRVVQX0NGRywgQXV0b1dha2V1cENmZy53b3JkKTsKLSAgICAgICAgT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfRE9aRSk7Ci0gICAgfQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCXBBZC0+YlBDSWNsa09mZiA9IEZBTFNFOwotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCWlmIChBREhPQ19PTihwQWQpKQkJLy8gQWRob2MgbW9kZSBsaW5rIGRvd24KLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMSU5LIERPV04gMSEhIVxuIikpOwotCi0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKLQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0JCQlwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCQlSVE1QX0luZGljYXRlTWVkaWFTdGF0ZShwQWQpOwotICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfRE9XTjsKLQkJCUJzc1RhYmxlRGVsZXRlRW50cnkoJnBBZC0+U2NhblRhYiwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTWFjVGFiLlNpemU9JWQgISEhXG4iLCBwQWQtPk1hY1RhYi5TaXplKSk7Ci0JfQotCWVsc2UJCQkJCS8vIEluZnJhIHN0cnVjdHVyZSBtb2RlCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTElOSyBET1dOIDIhISFcbiIpKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkvLyBETFMgdGVhciBkb3duIGZyYW1lIG11c3QgYmUgc2VudCBiZWZvcmUgbGluayBkb3duCi0JCS8vIHNlbmQgRExTLVRFQVJfRE9XTiBtZXNzYWdlCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJewotCQkJLy8gdGVhciBkb3duIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQkJCXsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7Ci0JCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdGVhciBkb3duIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JCQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCQkJewotCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09ICBETFNfRklOSVNIKSkKLQkJCQl7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQlSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19JTkZSQV9PTik7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0KLQkJLy8gU2F2ZWQgbGFzdCBTU0lEIGZvciBsaW5rdXAgY29tcGFyaXNvbgotCQlwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbiA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkxhc3RTc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5MYXN0U3NpZExlbik7Ci0JCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuTGFzdEJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCWlmIChwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPT0gVFJVRSkKLQkJewotCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkJCVJUTVBfSW5kaWNhdGVNZWRpYVN0YXRlKHBBZCk7Ci0gICAgICAgICAgICBwQWQtPkV4dHJhSW5mbyA9IEdFTkVSQUxfTElOS19ET1dOOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTkRJU19TVEFUVVNfTUVESUFfRElTQ09OTkVDVCBFdmVudCBBIVxuIikpOwotCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgICAvLwotCQkJLy8gSWYgZGlzYXNzb2NpYXRpb24gcmVxdWVzdCBpcyBmcm9tIE5ESVMsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgQlNTSUQgZnJvbSBlbnRyeS4KLQkJCS8vIE90aGVyd2lzZSBsb3N0IGJlYWNvbiBvciByZWNlaXZlIERlLUF1dGhlbnRpY2F0aW9uIGZyb20gQVAsCi0JCQkvLyB0aGVuIHdlIHNob3VsZCBkZWxldGUgQlNTSUQgZnJvbSBCc3NUYWJsZS4KLQkJCS8vIElmIHdlIGRvbid0IGRlbGV0ZSBmcm9tIGVudHJ5LCByb2FtaW5nIHdpbGwgZmFpbC4KLQkJCS8vCi0JCQlCc3NUYWJsZURlbGV0ZUVudHJ5KCZwQWQtPlNjYW5UYWIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJfQotCi0JCS8vIHJlc3RvcmUgYmFjayB0byAtCi0JCS8vICAgICAgMS4gbG9uZyBzbG90ICgyMCB1cykgb3Igc2hvcnQgc2xvdCAoOSB1cykgdGltZQotCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KLQkJLy8gICAgICAzLiBzaG9ydCBwcmVhbWJsZQotCQlPUFNUQVRVU19DTEVBUl9GTEFHKHBBZCwgZk9QX1NUQVRVU19CR19QUk9URUNUSU9OX0lOVVNFRCk7Ci0KLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi0JCS8vIENvdW50cnkgSUUgb2YgdGhlIEFQIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCB3aWxsIGJlIHVzZWQuCi0JCWlmIChwQWQtPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSAhPSBSdDgwMl8xMV9EX05vbmUpCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVswXSwgJnBBZC0+U3RhQ2ZnLlN0YU9yaUNvdW50cnlDb2RlWzBdLCAyKTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IHBBZC0+U3RhQ2ZnLlN0YU9yaUdlb2dyYXBoeTsKLQkJCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOwotCQl9Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCi0JfQotCi0KLQlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uVmFsaWRBc0NMSSA9PSBUUlVFKQotCQkJTWFjVGFibGVEZWxldGVFbnRyeShwQWQsIHBBZC0+TWFjVGFiLkNvbnRlbnRbaV0uQWlkLCBwQWQtPk1hY1RhYi5Db250ZW50W2ldLkFkZHIpOwotCX0KLQotCUFzaWNTZXRTbG90VGltZShwQWQsIFRSVUUpOyAvL0ZBTFNFKTsKLQlBc2ljU2V0RWRjYVBhcm0ocEFkLCBOVUxMKTsKLQotCS8vIFNldCBMRUQKLQlSVE1QU2V0TEVEKHBBZCwgTEVEX0xJTktfRE9XTik7Ci0gICAgcEFkLT5MZWRJbmRpY2F0b3JTdHJlbmd0aCA9IDB4RjA7Ci0gICAgUlRNUFNldFNpZ25hbExFRChwQWQsIC0xMDApOwkvLyBGb3JjZSBzaWduYWwgc3RyZW5ndGggTGVkIHRvIGJlIHR1cm5lZCBvZmYsIGZpcm13YXJlIGlzIG5vdCBkb25lIGl0LgotCi0JCUFzaWNEaXNhYmxlU3luYyhwQWQpOwotCi0JcEFkLT5NbG1lLlBlcmlvZGljUm91bmQgPSAwOwotCXBBZC0+TWxtZS5PbmVTZWNQZXJpb2RpY1JvdW5kID0gMDsKLQotCWlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19JTkZSQSkKLQl7Ci0JLy8gUmVtb3ZlIFN0YUNmZyBJbmZvcm1hdGlvbiBhZnRlciBsaW5rIGRvd24KLQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgTUFDX0FERFJfTEVOKTsKLQlOZGlzWmVyb01lbW9yeShwQWQtPkNvbW1vbkNmZy5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCQlwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuID0gMDsKLQl9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOwotCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIFJlc2V0IFdQQS1QU0sgc3RhdGUuIE9ubHkgcmVzZXQgd2hlbiBzdXBwbGljYW50IGVuYWJsZWQKLQlpZiAocEFkLT5TdGFDZmcuV3BhU3RhdGUgIT0gU1NfTk9UVVNFKQotCXsKLQkJcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKLQkJLy8gQ2xlYXIgUmVwbGF5IGNvdW50ZXIKLQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgOCk7Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQkJTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgOCk7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JfQotCi0JLy8KLQkvLyBpZiBsaW5rIGRvd24gY29tZSBmcm9tIEFQLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgV1BBIGtleXMgb24gV1BBIG1vZGUuCi0JLy8gb3RoZXJ3aXNlIHdpbGwgY2F1c2UgNC13YXkgaGFuZHNoYWtpbmcgZmFpbGVkLCBzaW5jZSB0aGUgV1BBIGtleSBub3QgZW1wdHkuCi0JLy8KLQlpZiAoKElzUmVxRnJvbUFQKSAmJiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSkKLQl7Ci0JCS8vIFJlbW92ZSBhbGwgV1BBIGtleXMKLQkJUlRNUFdQQVJlbW92ZUFsbEtleXMocEFkKTsKLQl9Ci0KLQkvLyA4MDIuMXggcG9ydCBjb250cm9sCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCS8vIFByZXZlbnQgY2xlYXIgUG9ydFNlY3VyZWQgaGVyZSB3aXRoIHN0YXRpYyBXRVAKLQkvLyBOZXR3b3JrTWFuZ2VyIHNldCBzZWN1cml0eSBwb2xpY3kgZmlyc3QgdGhlbiBzZXQgU1NJRCB0byBjb25uZWN0IEFQLgotCWlmIChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKLQkJKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExV0VQRW5hYmxlZCkgJiYKLQkJKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBGQUxTRSkpCi0JewotCQlwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCXsKLQkJcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0JCXBBZC0+U3RhQ2ZnLlByaXZhY3lGaWx0ZXIgPSBOZGlzODAyXzExUHJpdkZpbHRlcjgwMjF4V0VQOwotCX0KLQotCU5kaXNBY3F1aXJlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TWFjVGFiLCBzaXplb2YoTUFDX1RBQkxFKSk7Ci0JcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5Qb3J0U2VjdXJlZCA9IHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkOwotCU5kaXNSZWxlYXNlU3BpbkxvY2soJnBBZC0+TWFjVGFiTG9jayk7Ci0KLQlwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPSAwOwotCi0gICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZURpc2Nvbm5lY3RlZDsKLQkvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24gdG8gbGluayBpcyB1cAotCXBBZC0+RXh0cmFJbmZvID0gR0VORVJBTF9MSU5LX0RPV047Ci0KLSAgICBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCi0KLQkvLyBDbGVhbiBhc3NvY2lhdGlvbiBpbmZvcm1hdGlvbgotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlN0YUNmZy5Bc3NvY0luZm8sIHNpemVvZihORElTXzgwMl8xMV9BU1NPQ0lBVElPTl9JTkZPUk1BVElPTikpOwotCXBBZC0+U3RhQ2ZnLkFzc29jSW5mby5MZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04pOwotCXBBZC0+U3RhQ2ZnLlJlcVZhcklFTGVuID0gMDsKLQlwQWQtPlN0YUNmZy5SZXNWYXJJRUxlbiA9IDA7Ci0KLQkvLwotCS8vIFJlc2V0IFJTU0kgdmFsdWUgYWZ0ZXIgbGluayBkb3duCi0JLy8KLQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwID0gMDsKLQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDggPSAwOwotCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTEgPSAwOwotCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuQXZnUnNzaTFYOCA9IDA7Ci0JcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMiA9IDA7Ci0JcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5BdmdSc3NpMlg4ID0gMDsKLQotCS8vIFJlc3RvcmUgTWxtZVJhdGUKLQlwQWQtPkNvbW1vbkNmZy5NbG1lUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7Ci0JcEFkLT5Db21tb25DZmcuUnRzUmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLkJhc2ljTWxtZVJhdGU7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkvLwotCS8vIEFmdGVyIExpbmsgZG93biwgcmVzZXQgcGlnZ3ktYmFjayBzZXR0aW5nIGluIEFTSUMuIERpc2FibGUgUkRHLgotCS8vCi0JaWYgKHBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9PSBCV180MCkKLQl7Ci0JCXBBZC0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCeXRlVmFsdWUpOwotCQlCeXRlVmFsdWUgJj0gKH4weDE4KTsKLQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SNCwgQnl0ZVZhbHVlKTsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JLy8gUmVzZXQgREFDCi0JUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1IxLCAmQnl0ZVZhbHVlKTsKLQlCeXRlVmFsdWUgJj0gKH4weDE4KTsKLQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlR4UGF0aCA9PSAyKQotCXsKLQlCeXRlVmFsdWUgfD0gMHgxMDsKLQl9Ci0JUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMSwgQnl0ZVZhbHVlKTsKLQotCQlSVE1QU2V0UGlnZ3lCYWNrKHBBZCxGQUxTRSk7Ci0JCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BJR0dZQkFDS19JTlVTRUQpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQgPSBwQWQtPkNvbW1vbkNmZy5SRUdCQUNhcGFiaWxpdHkud29yZDsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vIFJlc3RvcmUgYWxsIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcuCi0JQXNpY1VwZGF0ZVByb3RlY3QocEFkLCAwLCAoQUxMTl9TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8T0ZETVNFVFBST1RFQ1QpLCBUUlVFLCBGQUxTRSk7Ci0JQXNpY0Rpc2FibGVSREcocEFkKTsKLQlwQWQtPkNvbW1vbkNmZy5JT1Rlc3RQYXJtLmJDdXJyZW50QXRoZXJvcyA9IEZBTFNFOwotCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYk5vd0F0aGVyb3NCdXJzdE9uID0gRkFMU0U7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNpZmRlZiBET1QxMU5fRFJBRlQzCi0JT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWQsIGZPUF9TVEFUVVNfU0NBTl8yMDQwKTsKLQlwQWQtPkNvbW1vbkNmZy5CU1NDb2V4aXN0MjA0MC53b3JkID0gMDsKLQlUcmlFdmVudEluaXQocEFkKTsKLQlmb3IgKGkgPSAwOyBpIDwgKHBBZC0+Q2hhbm5lbExpc3ROdW0gLSAxKTsgaSsrKQotCXsKLQkJcEFkLT5DaGFubmVsTGlzdFtpXS5iRWZmZWN0ZWRDaGFubmVsID0gRkFMU0U7Ci0JfQotI2VuZGlmIC8vIERPVDExTl9EUkFGVDMgLy8KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCVJUTVBfSU9fV1JJVEUzMihwQWQsIE1BWF9MRU5fQ0ZHLCAweDFmZmYpOwotCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpOwotLy8gQWxsb3cgZ28gdG8gc2xlZXAgYWZ0ZXIgbGlua2Rvd24gc3RlcHMuCi0JUlRNUF9TRVRfUFNGTEFHKHBBZCwgZlJUTVBfUFNfQ0FOX0dPX1NMRUVQKTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZuZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkgewotCQkvL3NlbmQgZGlzYXNzb2NpYXRlIGV2ZW50IHRvIHdwYV9zdXBwbGljYW50Ci0JCVJ0bXBPU1dyaWVsZXNzRXZlbnRTZW5kKHBBZCwgSVdFVkNVU1RPTSwgUlRfRElTQVNTT0NfRVZFTlRfRkxBRywgTlVMTCwgTlVMTCwgMCk7Ci0JfQotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgTkFUSVZFX1dQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQlSdG1wT1NXcmllbGVzc0V2ZW50U2VuZChwQWQsIFNJT0NHSVdBUCwgLTEsIE5VTEwsIE5VTEwsIDApOwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBSVDMweHgKLQlpZiAoKElTX1JUMzB4eChwQWQpIHx8IElTX1JUMzA5MChwQWQpfHxJU19SVDMzOTAocEFkKSkKLQkJJiYocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aD4xfHxwQWQtPkFudGVubmEuZmllbGQuVHhQYXRoPjEpKQotCXsKLQkJUlRNUF9BU0lDX01NUFNfRElTQUJMRShwQWQpOwotCX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBJdGVyYXRlT25Cc3NUYWIoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTUxNRV9TVEFSVF9SRVFfU1RSVUNUICAgU3RhcnRSZXE7Ci0JTUxNRV9KT0lOX1JFUV9TVFJVQ1QgICAgSm9pblJlcTsKLQlVTE9ORyAgICAgICAgICAgICAgICAgICBCc3NJZHg7Ci0KLQkvLyBDaGFuZ2UgdGhlIHdlcHN0YXR1cyB0byBvcmlnaW5hbCB3ZXBzdGF0dXMKLQlwQWQtPlN0YUNmZy5XZXBTdGF0dXMgICA9IHBBZC0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXM7Ci0JcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgPSBwQWQtPlN0YUNmZy5PcmlnV2VwU3RhdHVzOwotCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1czsKLQotCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Cc3NJZHg7Ci0JaWYgKEJzc0lkeCA8IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKQotCXsKLQkJLy8gQ2hlY2sgY2lwaGVyIHN1aXRlLCBBUCBtdXN0IGhhdmUgbW9yZSBzZWN1cmVkIGNpcGhlciB0aGFuIHN0YXRpb24gc2V0dGluZwotCQkvLyBTZXQgdGhlIFBhaXJ3aXNlIGFuZCBHcm91cCBjaXBoZXIgdG8gbWF0Y2ggdGhlIGludGVuZGVkIEFQIHNldHRpbmcKLQkJLy8gV2UgY2FuIG9ubHkgY29ubmVjdCB0byBBUCB3aXRoIGxlc3Mgc2VjdXJlZCBjaXBoZXIgc2V0dGluZwotCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuR3JvdXBDaXBoZXI7Ci0KLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcikKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEuUGFpckNpcGhlcjsKLQkJCWVsc2UgaWYgKHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBLlBhaXJDaXBoZXJBdXggIT0gTmRpczgwMl8xMVdFUERpc2FibGVkKQotCQkJCXBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQS5QYWlyQ2lwaGVyQXV4OwotCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJfQotCQllbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5Hcm91cENpcGhlcjsKLQotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlcikKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gcEFkLT5NbG1lQXV4LlNzaWRCc3NUYWIuQnNzRW50cnlbQnNzSWR4XS5XUEEyLlBhaXJDaXBoZXI7Ci0JCQllbHNlIGlmIChwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUGFpckNpcGhlckF1eCAhPSBOZGlzODAyXzExV0VQRGlzYWJsZWQpCi0JCQkJcEFkLT5TdGFDZmcuUGFpckNpcGhlciA9IHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc0VudHJ5W0Jzc0lkeF0uV1BBMi5QYWlyQ2lwaGVyQXV4OwotCQkJZWxzZQkvLyBUaGVyZSBpcyBubyBQYWlyQ2lwaGVyIEF1eCwgZG93bmdyYWRlIG91ciBjYXBhYmlsaXR5IHRvIFRLSVAKLQkJCQlwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQotCQkJLy8gUlNOIGNhcGFiaWxpdHkKLQkJCXBBZC0+U3RhQ2ZnLlJzbkNhcGFiaWxpdHkgPSBwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtCc3NJZHhdLldQQTIuUnNuQ2FwYWJpbGl0eTsKLQkJfQotCi0JCS8vIFNldCBNaXggY2lwaGVyIGZsYWcKLQkJcEFkLT5TdGFDZmcuYk1peENpcGhlciA9IChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyKSA/IEZBTFNFIDogVFJVRTsKLQkJLyppZiAocEFkLT5TdGFDZmcuYk1peENpcGhlciA9PSBUUlVFKQotCQl7Ci0JCQkvLyBJZiBtaXggY2lwaGVyLCByZS1idWlsZCBSU05JRQotCQkJUlRNUE1ha2VSU05JRShwQWQsIHBBZC0+U3RhQ2ZnLkF1dGhNb2RlLCBwQWQtPlN0YUNmZy5XZXBTdGF0dXMsIDApOwotCQl9Ki8KLQotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJDTlRMIC0gaXRlcmF0ZSBCU1MgJWxkIG9mICVkXG4iLCBCc3NJZHgsIHBBZC0+TWxtZUF1eC5Tc2lkQnNzVGFiLkJzc05yKSk7Ci0JCUpvaW5QYXJtRmlsbChwQWQsICZKb2luUmVxLCBCc3NJZHgpOwotCQlNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfSk9JTl9SRVEsIHNpemVvZihNTE1FX0pPSU5fUkVRX1NUUlVDVCksCi0JCQkJCSZKb2luUmVxKTsKLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfV0FJVF9KT0lOOwotCX0KLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgQlNTIGZhaWw7IHN0YXJ0IGEgbmV3IEFESE9DIChTc2lkPSVzKS4uLlxuIixwQWQtPk1sbWVBdXguU3NpZCkpOwotCQlTdGFydFBhcm1GaWxsKHBBZCwgJlN0YXJ0UmVxLCAoUENIQVIpcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuKTsKLQkJTWxtZUVucXVldWUocEFkLCBTWU5DX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgc2l6ZW9mKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCksICZTdGFydFJlcSk7Ci0JCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfU1RBUlQ7Ci0JfQotCWVsc2UgLy8gbm8gbW9yZSBCU1MKLQl7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJewotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0KLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQl9Ci19Ci0KLS8vIGZvciByZS1hc3NvY2lhdGlvbiBvbmx5Ci0vLyBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLVZPSUQgSXRlcmF0ZU9uQnNzVGFiMigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCBSZWFzc29jUmVxOwotCVVMT05HICAgICAgICAgICAgICAgICAgIEJzc0lkeDsKLQlCU1NfRU5UUlkgICAgICAgICAgICAgICAqcEJzczsKLQotCUJzc0lkeCA9IHBBZC0+TWxtZUF1eC5Sb2FtSWR4OwotCXBCc3MgPSAmcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzRW50cnlbQnNzSWR4XTsKLQotCWlmIChCc3NJZHggPCBwQWQtPk1sbWVBdXguUm9hbVRhYi5Cc3NOcikKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBpdGVyYXRlIEJTUyAlbGQgb2YgJWRcbiIsIEJzc0lkeCwgcEFkLT5NbG1lQXV4LlJvYW1UYWIuQnNzTnIpKTsKLQotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBCc3MtPkNoYW5uZWwsIEZBTFNFKTsKLQkJQXNpY0xvY2tDaGFubmVsKHBBZCwgcEJzcy0+Q2hhbm5lbCk7Ci0KLQkJLy8gcmVhc3NvY2lhdGUgbWVzc2FnZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIGFzc29jaWF0ZSBtZXNzYWdlCi0JCUFzc29jUGFybUZpbGwocEFkLCAmUmVhc3NvY1JlcSwgcEJzcy0+QnNzaWQsIHBCc3MtPkNhcGFiaWxpdHlJbmZvLAotCQkJCQkgIEFTU09DX1RJTUVPVVQsIHBBZC0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCk7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfUkVBU1NPQ19SRVEsCi0JCQkJCXNpemVvZihNTE1FX1JFQVNTT0NfUkVRX1NUUlVDVCksICZSZWFzc29jUmVxKTsKLQotCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX1JFQVNTT0M7Ci0JfQotCWVsc2UgLy8gbm8gbW9yZSBCU1MKLQl7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJewotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkNOVEwgLSBBbGwgcm9hbWluZyBmYWlsZWQsIHJlc3RvcmUgdG8gY2hhbm5lbCAlZCwgVG90YWwgQlNTWyUwMmRdXG4iLHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCQl9Ci0KLQkJcEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSA9IENOVExfSURMRTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEpvaW5QYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9KT0lOX1JFUV9TVFJVQ1QgKkpvaW5SZXEsCi0JSU4gVUxPTkcgQnNzSWR4KQotewotCUpvaW5SZXEtPkJzc0lkeCA9IEJzc0lkeDsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU2NhblBhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX1NDQU5fUkVRX1NUUlVDVCAqU2NhblJlcSwKLQlJTiBTVFJJTkcgU3NpZFtdLAotCUlOIFVDSEFSIFNzaWRMZW4sCi0JSU4gVUNIQVIgQnNzVHlwZSwKLQlJTiBVQ0hBUiBTY2FuVHlwZSkKLXsKLSAgICBOZGlzWmVyb01lbW9yeShTY2FuUmVxLT5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCVNjYW5SZXEtPlNzaWRMZW4gPSBTc2lkTGVuOwotCU5kaXNNb3ZlTWVtb3J5KFNjYW5SZXEtPlNzaWQsIFNzaWQsIFNzaWRMZW4pOwotCVNjYW5SZXEtPkJzc1R5cGUgPSBCc3NUeXBlOwotCVNjYW5SZXEtPlNjYW5UeXBlID0gU2NhblR5cGU7Ci19Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIERsc1Bhcm1GaWxsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE9VVCBNTE1FX0RMU19SRVFfU1RSVUNUICpwRGxzUmVxLAotCUlOIFBSVF84MDJfMTFfRExTIHBEbHMsCi0JSU4gVVNIT1JUIHJlYXNvbikKLXsKLQlwRGxzUmVxLT5wRExTID0gcERsczsKLQlwRGxzUmVxLT5SZWFzb24gPSByZWFzb247Ci19Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFN0YXJ0UGFybUZpbGwoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gT1VUIE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqU3RhcnRSZXEsCi0JSU4gQ0hBUiBTc2lkW10sCi0JSU4gVUNIQVIgU3NpZExlbikKLXsKLQlBU1NFUlQoU3NpZExlbiA8PSBNQVhfTEVOX09GX1NTSUQpOwotCU5kaXNNb3ZlTWVtb3J5KFN0YXJ0UmVxLT5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQlTdGFydFJlcS0+U3NpZExlbiA9IFNzaWRMZW47Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIEF1dGhQYXJtRmlsbCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBPVVQgTUxNRV9BVVRIX1JFUV9TVFJVQ1QgKkF1dGhSZXEsCi0JSU4gUFVDSEFSIHBBZGRyLAotCUlOIFVTSE9SVCBBbGcpCi17Ci0JQ09QWV9NQUNfQUREUihBdXRoUmVxLT5BZGRyLCBwQWRkcik7Ci0JQXV0aFJlcS0+QWxnID0gQWxnOwotCUF1dGhSZXEtPlRpbWVvdXQgPSBBVVRIX1RJTUVPVVQ7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotVk9JRCBDb21wb3NlUHNQb2xsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCU5kaXNaZXJvTWVtb3J5KCZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Ci0JcEFkLT5Qc1BvbGxGcmFtZS5GQy5UeXBlID0gQlRZUEVfQ05UTDsKLQlwQWQtPlBzUG9sbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX1BTX1BPTEw7Ci0JcEFkLT5Qc1BvbGxGcmFtZS5BaWQgPSBwQWQtPlN0YUFjdGl2ZS5BaWQgfCAweEMwMDA7Ci0JQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLkJzc2lkLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JQ09QWV9NQUNfQUREUihwQWQtPlBzUG9sbEZyYW1lLlRhLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLX0KLQotLy8gSVJRTCA9IERJU1BBVENIX0xFVkVMCi1WT0lEIENvbXBvc2VOdWxsRnJhbWUoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JTmRpc1plcm9NZW1vcnkoJnBBZC0+TnVsbEZyYW1lLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCXBBZC0+TnVsbEZyYW1lLkZDLlR5cGUgPSBCVFlQRV9EQVRBOwotCXBBZC0+TnVsbEZyYW1lLkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKLQlwQWQtPk51bGxGcmFtZS5GQy5Ub0RzID0gMTsKLQlDT1BZX01BQ19BRERSKHBBZC0+TnVsbEZyYW1lLkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JQ09QWV9NQUNfQUREUihwQWQtPk51bGxGcmFtZS5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCi0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVByZS1idWlsZCBhIEJFQUNPTiBmcmFtZSBpbiB0aGUgc2hhcmVkIG1lbW9yeQotCi0JSVJRTCA9IFBBU1NJVkVfTEVWRUwKLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVUxPTkcgTWFrZUlic3NCZWFjb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOwotCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB4MDR9OwotCUhFQURFUl84MDJfMTEgQmNuSGRyOwotCVVTSE9SVCAgICAgICAgQ2FwYWJpbGl0eUluZm87Ci0JTEFSR0VfSU5URUdFUiBGYWtlVGltZXN0YW1wOwotCVVMT05HICAgICAgICAgRnJhbWVMZW4gPSAwOwotCVBUWFdJX1NUUlVDCSAgcFR4V0kgPSAmcEFkLT5CZWFjb25UeFdJOwotCVVDSEFSICAgICAgICAgKnBCZWFjb25GcmFtZSA9IHBBZC0+QmVhY29uQnVmOwotCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSICAgICAgICAgU3VwUmF0ZUxlbiA9IDA7Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUiAgICAgICAgIEV4dFJhdGVMZW4gPSAwOwotCVVDSEFSICAgICAgICAgUlNOSWUgPSBJRV9XUEE7Ci0KLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPD0gMTQpKQotCXsKLQkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcwotCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCi0JCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcwotCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcwotCQlTdXBSYXRlTGVuID0gNDsKLQkJRXh0UmF0ZUxlbiA9IDA7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwgPiAxNCkKLQl7Ci0JCVN1cFJhdGVbMF0gID0gMHg4QzsgICAgLy8gNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQlTdXBSYXRlWzFdICA9IDB4MTI7ICAgIC8vIDkgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZVsyXSAgPSAweDk4OyAgICAvLyAxMiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcywgYmFzaWMgcmF0ZQotCQlTdXBSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbNF0gID0gMHhiMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsIGJhc2ljIHJhdGUKLQkJU3VwUmF0ZVs1XSAgPSAweDQ4OyAgICAvLyAzNiBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlTdXBSYXRlWzZdICA9IDB4NjA7ICAgIC8vIDQ4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCVN1cFJhdGVbN10gID0gMHg2YzsgICAgLy8gNTQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJU3VwUmF0ZUxlbiAgPSA4OwotCQlFeHRSYXRlTGVuICA9IDA7Ci0KLQkJLy8KLQkJLy8gQWxzbyBVcGRhdGUgTWxtZVJhdGUgJiBSdHNSYXRlIGZvciBHIG9ubHkgJiBBIG9ubHkKLQkJLy8KLQkJcEFkLT5Db21tb25DZmcuTWxtZVJhdGUgPSBSQVRFXzY7Ci0JCXBBZC0+Q29tbW9uQ2ZnLlJ0c1JhdGUgPSBSQVRFXzY7Ci0JCXBBZC0+Q29tbW9uQ2ZnLk1sbWVUcmFuc21pdC5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQlwQWQtPkNvbW1vbkNmZy5NbG1lVHJhbnNtaXQuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEFkLT5Db21tb25DZmcuTWxtZVJhdGVdOwotCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTUzBNY2FzdF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJcEFkLT5NYWNUYWIuQ29udGVudFtCU1MwTWNhc3RfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BBZC0+Q29tbW9uQ2ZnLk1sbWVSYXRlXTsKLQl9Ci0JZWxzZQotCXsKLQkJU3VwUmF0ZVswXSA9IDB4ODI7IC8vIDEgbWJwcwotCQlTdXBSYXRlWzFdID0gMHg4NDsgLy8gMiBtYnBzCi0JCVN1cFJhdGVbMl0gPSAweDhiOyAvLyA1LjUgbWJwcwotCQlTdXBSYXRlWzNdID0gMHg5NjsgLy8gMTEgbWJwcwotCQlTdXBSYXRlTGVuID0gNDsKLQotCQlFeHRSYXRlWzBdICA9IDB4MEM7ICAgIC8vIDYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCi0JCUV4dFJhdGVbMV0gID0gMHgxMjsgICAgLy8gOSBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzJdICA9IDB4MTg7ICAgIC8vIDEyIG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzLAotCQlFeHRSYXRlWzNdICA9IDB4MjQ7ICAgIC8vIDE4IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVbNF0gID0gMHgzMDsgICAgLy8gMjQgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMsCi0JCUV4dFJhdGVbNV0gID0gMHg0ODsgICAgLy8gMzYgbWJwcywgaW4gdW5pdHMgb2YgMC41IE1icHMKLQkJRXh0UmF0ZVs2XSAgPSAweDYwOyAgICAvLyA0OCBtYnBzLCBpbiB1bml0cyBvZiAwLjUgTWJwcwotCQlFeHRSYXRlWzddICA9IDB4NmM7ICAgIC8vIDU0IG1icHMsIGluIHVuaXRzIG9mIDAuNSBNYnBzCi0JCUV4dFJhdGVMZW4gID0gODsKLQl9Ci0KLQlwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlTGVuID0gU3VwUmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBSYXRlLCBTdXBSYXRlLCBTdXBSYXRlTGVuKTsKLQlwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQotCS8vIGNvbXBvc2UgSUJTUyBiZWFjb24gZnJhbWUKLQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgJkJjbkhkciwgU1VCVFlQRV9CRUFDT04sIDAsIEJST0FEQ0FTVF9BRERSLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JUHJpdmFjeSA9IChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCkgfHwKLQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJICAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpOwotCUNhcGFiaWxpdHlJbmZvID0gQ0FQX0dFTkVSQVRFKDAsIDEsIFByaXZhY3ksIChwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCksIDAsIDApOwotCi0JTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lLCAgICAgICAgICAgICAgICAmRnJhbWVMZW4sCi0JCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgICAgJkJjbkhkciwKLQkJCQkJICBUSU1FU1RBTVBfTEVOLCAgICAgICAgICAgICAgICAgICAmRmFrZVRpbWVzdGFtcCwKLQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDYXBhYmlsaXR5SW5mbywKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAotCQkJCQkgIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4sICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsCi0JCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN1cFJhdGVJZSwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUxlbiwKLQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBTdXBSYXRlLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0llLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQ2hhbm5lbCwKLQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSWJzc0llLAotCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAotCQkJCQkgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPlN0YUFjdGl2ZS5BdGltV2luLAotCQkJCQkgIEVORF9PRl9BUkdTKTsKLQotCS8vIGFkZCBFUlBfSUUgYW5kIEVYVF9SQUUgSUUgb2YgaW4gODAyLjExZwotCWlmIChFeHRSYXRlTGVuKQotCXsKLQkJVUxPTkcJdG1wOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBCZWFjb25GcmFtZSArIEZyYW1lTGVuLCAgICAgICAgICZ0bXAsCi0JCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlTGVuLAotCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICBFeHRSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCUZyYW1lTGVuICs9IHRtcDsKLQl9Ci0KLQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQotCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotCXsKLQkJVUxPTkcgdG1wOwotICAgICAgICBSVE1QTWFrZVJTTklFKHBBZCwgcEFkLT5TdGFDZmcuQXV0aE1vZGUsIHBBZC0+U3RhQ2ZnLldlcFN0YXR1cywgQlNTMCk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lICsgRnJhbWVMZW4sCQkmdG1wLAotCQkJCQkJICAxLAkJCQkJJlJTTkllLAotCQkJCQkJICAxLAkJCQkJJnBBZC0+U3RhQ2ZnLlJTTklFX0xlbiwKLQkJCQkJCSAgcEFkLT5TdGFDZmcuUlNOSUVfTGVuLAkJcEFkLT5TdGFDZmcuUlNOX0lFLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCUZyYW1lTGVuICs9IHRtcDsKLQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JewotCQlVTE9ORyBUbXBMZW47Ci0JCVVDSEFSIEh0TGVuLCBIdExlbjE7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotCQlBRERfSFRfSU5GT19JRQlhZGRIVEluZm9UbXA7Ci0JCVVTSE9SVAliMmxUbXAsIGIybFRtcDI7Ci0jZW5kaWYKLQotCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQotCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOwotCQlIdExlbjEgPSBzaXplb2YocEFkLT5Db21tb25DZmcuQWRkSFRJbmZvKTsKLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQlNYWtlT3V0Z29pbmdGcmFtZShwQmVhY29uRnJhbWUrRnJhbWVMZW4sCSZUbXBMZW4sCi0JCQkJCQkgIDEsCQkJCQkJJkh0Q2FwSWUsCi0JCQkJCQkgIDEsCQkJCQkJJkh0TGVuLAotCQkJCQkJICBIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkgIDEsCQkJCQkJJkFkZEh0SW5mb0llLAotCQkJCQkJICAxLAkJCQkJCSZIdExlbjEsCi0JCQkJCQkgIEh0TGVuMSwJCQkJCSZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sCi0JCQkJCQkgIEVORF9PRl9BUkdTKTsKLSNlbHNlCi0JCU5kaXNNb3ZlTWVtb3J5KCZIdENhcGFiaWxpdHlUbXAsICZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksIEh0TGVuKTsKLQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSk7Ci0JCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotCi0JCU5kaXNNb3ZlTWVtb3J5KCZhZGRIVEluZm9UbXAsICZwQWQtPkNvbW1vbkNmZy5BZGRIVEluZm8sIEh0TGVuMSk7Ci0JCSooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMikgPSBTV0FQMTYoKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8yKSk7Ci0JCSooVVNIT1JUICopKCZhZGRIVEluZm9UbXAuQWRkSHRJbmZvMykgPSBTV0FQMTYoKihVU0hPUlQgKikoJmFkZEhUSW5mb1RtcC5BZGRIdEluZm8zKSk7Ci0KLQkJTWFrZU91dGdvaW5nRnJhbWUocEJlYWNvbkZyYW1lK0ZyYW1lTGVuLAkmVG1wTGVuLAotCQkJCQkJICAxLAkJCQkJCSZIdENhcEllLAotCQkJCQkJICAxLAkJCQkJCSZIdExlbiwKLQkJCQkJCSAgSHRMZW4sCQkJCQkmSHRDYXBhYmlsaXR5VG1wLAotCQkJCQkJICAxLAkJCQkJCSZBZGRIdEluZm9JZSwKLQkJCQkJCSAgMSwJCQkJCQkmSHRMZW4xLAotCQkJCQkJICBIdExlbjEsCQkJCQkmYWRkSFRJbmZvVG1wLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0jZW5kaWYKLQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCS8vYmVhY29uIHVzZSByZXNlcnZlZCBXQ0lEIDB4ZmYKLSAgICBpZiAocEFkLT5Db21tb25DZmcuQ2hhbm5lbCA+IDE0KQotICAgIHsKLQlSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCi0JCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmcEFkLT5Db21tb25DZmcuTWxtZVRyYW5zbWl0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gU2V0IHRvIHVzZSAxTWJwcyBmb3IgQWRob2MgYmVhY29uLgotCQlIVFRSQU5TTUlUX1NFVFRJTkcgVHJhbnNtaXQ7Ci0gICAgICAgIFRyYW5zbWl0LndvcmQgPSAwOwotICAgICAgICBSVE1QV3JpdGVUeFdJKHBBZCwgcFR4V0ksIEZBTFNFLCBGQUxTRSwgIFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgMCwgMHhmZiwgRnJhbWVMZW4sCi0JCVBJRF9NR01ULCBQSURfQkVBQ09OLCBSQVRFXzEsIElGU19IVFRYT1AsIEZBTFNFLCAmVHJhbnNtaXQpOwotICAgIH0KLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQlSVE1QRnJhbWVFbmRpYW5DaGFuZ2UocEFkLCBwQmVhY29uRnJhbWUsIERJUl9XUklURSwgRkFMU0UpOwotCVJUTVBXSUVuZGlhbkNoYW5nZSgoUFVDSEFSKXBUeFdJLCBUWVBFX1RYV0kpOwotI2VuZGlmCi0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNYWtlSWJzc0JlYWNvbiAobGVuPSVsZCksIFN1cFJhdGVMZW49JWQsIEV4dFJhdGVMZW49JWQsIENoYW5uZWw9JWQsIFBoeU1vZGU9JWRcbiIsCi0JCQkJCUZyYW1lTGVuLCBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNvbW1vbkNmZy5QaHlNb2RlKSk7Ci0JcmV0dXJuIEZyYW1lTGVuOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvZGxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9kbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZTE2Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9kbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBkbHMuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSGFuZGxlIFdNTS1ETFMgc3RhdGUgbWFjaGluZQotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBSb3J5IENoZW4gICAwMi0xNC0yMDA2Ci0JQXJ2aW4gVGFpCTA2LTAzLTIwMDgJICBNb2RpZmllZCBmb3IgUlQyOHh4Ci0gKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgZGxzIHN0YXRlIG1hY2hpbmUgaW5pdCwgaW5jbHVkaW5nIHN0YXRlIHRyYW5zaXRpb24gYW5kIHRpbWVyIGluaXQKLSAgICBQYXJhbWV0ZXJzOgotICAgICAgICBTbSAtIHBvaW50ZXIgdG8gdGhlIGRscyBzdGF0ZSBtYWNoaW5lCi0gICAgTm90ZToKLSAgICAgICAgVGhlIHN0YXRlIG1hY2hpbmUgbG9va3MgbGlrZSB0aGlzCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBETFNfSURMRQotICAgIE1UMl9NTE1FX0RMU19SRVFVRVNUICAgTWxtZURsc1JlcUFjdGlvbgotICAgIE1UMl9QRUVSX0RMU19SRVFVRVNUICAgUGVlckRsc1JlcUFjdGlvbgotICAgIE1UMl9QRUVSX0RMU19SRVNQT05TRSAgUGVlckRsc1JzcEFjdGlvbgotICAgIE1UMl9NTE1FX0RMU19URUFSRE9XTiAgTWxtZVRlYXJEb3duQWN0aW9uCi0gICAgTVQyX1BFRVJfRExTX1RFQVJET1dOICBQZWVyVGVhckRvd25BY3Rpb24KLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi12b2lkIERsc1N0YXRlTWFjaGluZUluaXQoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gU1RBVEVfTUFDSElORSAqU20sCi0gICAgT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVVDSEFSCWk7Ci0KLSAgICBTdGF0ZU1hY2hpbmVJbml0KFNtLCAoU1RBVEVfTUFDSElORV9GVU5DKilUcmFucywgTUFYX0RMU19TVEFURSwgTUFYX0RMU19NU0csIChTVEFURV9NQUNISU5FX0ZVTkMpRHJvcCwgRExTX0lETEUsIERMU19NQUNISU5FX0JBU0UpOwotCi0gICAgLy8gdGhlIGZpcnN0IGNvbHVtbgotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9NTE1FX0RMU19SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURsc1JlcUFjdGlvbik7Ci0gICAgU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBETFNfSURMRSwgTVQyX1BFRVJfRExTX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyRGxzUmVxQWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfUlNQLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNSc3BBY3Rpb24pOwotICAgIFN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgRExTX0lETEUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZURsc1RlYXJEb3duQWN0aW9uKTsKLSAgICBTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIERMU19JRExFLCBNVDJfUEVFUl9ETFNfVEVBUl9ET1dOLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJEbHNUZWFyRG93bkFjdGlvbik7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0ucEFkID0gcEFkOwotCQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCBHRVRfVElNRVJfRlVOQ1RJT04oRGxzVGltZW91dEFjdGlvbiksIHBBZCwgRkFMU0UpOwotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVEbHNSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJRnJhbWVMZW4gPSAwOwotCUhFQURFUl84MDJfMTEJRGxzUmVxSGRyOwotCVBSVF84MDJfMTFfRExTCXBETFMgPSBOVUxMOwotCVVDSEFSCQkJQ2F0ZWdvcnkgPSBDQVRFR09SWV9ETFM7Ci0JVUNIQVIJCQlBY3Rpb24gPSBBQ1RJT05fRExTX1JFUVVFU1Q7Ci0JVUxPTkcJCQl0bXA7Ci0JVVNIT1JUCQkJcmVhc29uOwotCVVMT05HCQkJVGltZW91dDsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0KLQlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJnJlYXNvbikpCi0JCXJldHVybjsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gTWxtZURsc1JlcUFjdGlvbigpIFxuIikpOwotCi0JTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQlpZiAoTlN0YXR1cyAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBNbG1lRGxzUmVxQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCUFjdEhlYWRlckluaXQocEFkLCAmRGxzUmVxSGRyLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCi0JLy8gQnVpbGQgYmFzaWMgZnJhbWUgZmlyc3QKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSZXFIZHIsCi0JCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKLQkJCQkJMSwJCQkJCQkJJkFjdGlvbiwKLQkJCQkJNiwJCQkJCQkJJnBETFMtPk1hY0FkZHIsCi0JCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKLQkJCQkJMiwJCQkJCQkJJnBETFMtPlRpbWVPdXQsCi0JCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCi0JCQkJCTEsCQkJCQkJCSZwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwKLQkJCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5TdXBSYXRlLAotCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQlpZiAocEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4gIT0gMCkKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCSAgMSwJCQkJCQkmRXh0UmF0ZUllLAotCQkJCQkJICAxLAkJCQkJCSZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiwKLQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCUZyYW1lTGVuICs9IHRtcDsKLQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkpCi0JewotCQlVQ0hBUiBIdExlbjsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJSFRfQ0FQQUJJTElUWV9JRSBIdENhcGFiaWxpdHlUbXA7Ci0jZW5kaWYKLQotCQkvLyBhZGQgSFQgQ2FwYWJpbGl0eSBJRQotCQlIdExlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sCSZ0bXAsCi0JCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKLQkJCQkJCQlIdExlbiwJCQkJCSZwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHksCi0JCQkJCQkJRU5EX09GX0FSR1MpOwotI2Vsc2UKLQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOwotCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuSHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykpOwotCQkJCQkJCSooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSA9IFNXQVAxNigqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkV4dEh0Q2FwSW5mbykpOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAotCQkJCQkJCTEsCQkJCQkJJkh0TGVuLAotCQkJCQkJCUh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKLQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZW5kaWYKLQkJRnJhbWVMZW4gPSBGcmFtZUxlbiArIHRtcDsKLQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlSVE1QQ2FuY2VsVGltZXIoJnBETFMtPlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCVRpbWVvdXQgPSBETFNfVElNRU9VVDsKLQlSVE1QU2V0VGltZXIoJnBETFMtPlRpbWVyLCBUaW1lb3V0KTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJEbHNSZXFBY3Rpb24oCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCVVMT05HCQkJRnJhbWVMZW4gPSAwOwotCVVTSE9SVAkJCVN0YXR1c0NvZGUgPSBNTE1FX1NVQ0NFU1M7Ci0JSEVBREVSXzgwMl8xMQlEbHNSc3BIZHI7Ci0JVUNIQVIJCQlDYXRlZ29yeSA9IENBVEVHT1JZX0RMUzsKLQlVQ0hBUgkJCUFjdGlvbiA9IEFDVElPTl9ETFNfUkVTUE9OU0U7Ci0JVUxPTkcJCQl0bXA7Ci0JVVNIT1JUCQkJQ2FwYWJpbGl0eUluZm87Ci0JVUNIQVIJCQlEQVtNQUNfQUREUl9MRU5dLCBTQVtNQUNfQUREUl9MRU5dOwotCVVTSE9SVAkJCURMU1RpbWVPdXQ7Ci0JU0hPUlQJCQlpOwotCVVMT05HCQkJVGltZW91dDsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0JUFJUXzgwMl8xMV9ETFMJcERMUyA9IE5VTEw7Ci0JVUNIQVIJCQlNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gMDsKLSAgICBVQ0hBUgkJCVN1cHBvcnRlZFJhdGVzTGVuOwotICAgIFVDSEFSCQkJU3VwcG9ydGVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkJSHRDYXBhYmlsaXR5TGVuOwotCUhUX0NBUEFCSUxJVFlfSUUJSHRDYXBhYmlsaXR5OwotCi0JaWYgKCFQZWVyRGxzUmVxU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJkNhcGFiaWxpdHlJbmZvLCAmRExTVGltZU91dCwKLQkJCQkJCQkmU3VwcG9ydGVkUmF0ZXNMZW4sICZTdXBwb3J0ZWRSYXRlc1swXSwgJkh0Q2FwYWJpbGl0eUxlbiwgJkh0Q2FwYWJpbGl0eSkpCi0JCXJldHVybjsKLQotICAgIC8vIHN1cHBvcnRlZCByYXRlcyBhcnJheSBtYXkgbm90IGJlIHNvcnRlZC4gc29ydCBpdCBhbmQgZmluZCB0aGUgbWF4aW11bSByYXRlCi0gICAgZm9yIChpID0gMDsgaSA8IFN1cHBvcnRlZFJhdGVzTGVuOyBpKyspCi0gICAgewotICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2YpKQotICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZjsKLSAgICB9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7Ci0KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSZXFBY3Rpb24oKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFJTkZSQV9PTihwQWQpKQotCXsKLQkJU3RhdHVzQ29kZSA9IE1MTUVfUkVRVUVTVF9ERUNMSU5FRDsKLQl9Ci0JZWxzZSBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKQotCXsKLQkJU3RhdHVzQ29kZSA9IE1MTUVfREVTVF9TVEFfSVNfTk9UX0FfUVNUQTsKLQl9Ci0JZWxzZSBpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCXsKLQkJU3RhdHVzQ29kZSA9IE1MTUVfUkVRVUVTVF9ERUNMSU5FRDsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gZmluZCB0YWJsZSB0byB1cGRhdGUgcGFyYW1ldGVycwotCQlmb3IgKGkgPSAoTUFYX05VTV9PRl9ETFNfRU5UUlktMSk7IGkgPj0gMDsgaS0tKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQkJewotCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKLQkJCQllbHNlCi0JCQkJewotCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOwotCQkJCX0KLQotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0ID0gRExTVGltZU91dDsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IERMU1RpbWVPdXQ7Ci0JCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7Ci0JCQkJcERMUyA9ICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIGNhbiBub3QgZmluZCBpbiB0YWJsZSwgY3JlYXRlIGEgbmV3IG9uZQotCQlpZiAoaSA8IDApCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JlcUFjdGlvbigpIGNhbiBub3QgZmluZCBzYW1lIGVudHJ5IFxuIikpOwotCQkJZm9yIChpPShNQVhfTlVNX09GX0RMU19FTlRSWSAtIDEpOyBpID49IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGktLSkKLQkJCXsKLQkJCQlpZiAoIXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKQotCQkJCXsKLQkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JCQkJCVVDSEFSIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOwotCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJCXsKLQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfRklOSVNIOwotCQkJCQl9Ci0KLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCA9IFRSVUU7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgPSBETFNUaW1lT3V0OwotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IERMU1RpbWVPdXQ7Ci0JCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFNBLCBNQUNfQUREUl9MRU4pOwotCQkJCQlpZiAoSHRDYXBhYmlsaXR5TGVuICE9IDApCi0JCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBUUlVFOwotCQkJCQllbHNlCi0JCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5iSFRDYXAgPSBGQUxTRTsKLQkJCQkJcERMUyA9ICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXTsKLQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnREbHNFbnRyeShwQWQsIFNBLCBpKTsKLQotCQkJCQlzd2l0Y2ggKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMpCi0JCQkJCXsKLQkJCQkJCWNhc2UgMTA4OiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81NDsgICBicmVhazsKLQkJCQkJCWNhc2UgOTY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV80ODsgICBicmVhazsKLQkJCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKLQkJCQkJCWNhc2UgNDg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yNDsgICBicmVhazsKLQkJCQkJCWNhc2UgMzY6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xODsgICBicmVhazsKLQkJCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKLQkJCQkJCWNhc2UgMTg6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV85OyAgICBicmVhazsKLQkJCQkJCWNhc2UgMTI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV82OyAgICBicmVhazsKLQkJCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJCWNhc2UgMTE6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV81XzU7ICBicmVhazsKLQkJCQkJCWNhc2UgNDogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8yOyAgICBicmVhazsKLQkJCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKLQkJCQkJCWRlZmF1bHQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJfQotCi0JCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOwotCi0JCQkJCWlmIChwRW50cnktPk1heFN1cHBvcnRlZFJhdGUgPCBSQVRFX0ZJUlNUX09GRE1fUkFURSkKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJCQl9Ci0KLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOwotCQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMV0gPSAwOwotCi0JCQkJCS8vIElmIHRoaXMgRW50cnkgc3VwcG9ydHMgODAyLjExbiwgdXBncmFkZSB0byBIVCByYXRlLgotCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJCQkJewotCQkJCQkJVUNIQVIJaiwgYml0bWFzazsgLy9rLGJpdG1hc2s7Ci0JCQkJCQlDSEFSICAgIGlpOwotCi0JCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7Ci0KLQkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKLQkJCQkJCXsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKLQkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKLQkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQotCQkJCQkJewotCQkJCQkJCWogPSBpaS84OwotCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7Ci0JCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCi0JCQkJCQkJewotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChpaT09MCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQotCQkJCQkJaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTICE9IE1DU19BVVRPKQotCQkJCQkJewotCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIkBAQCBwQWQtPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gJWRcbiIsCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MpKTsKLQkJCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPT0gMzIpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IDE7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9IDA7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IDMyOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPiBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTKQotCQkJCQkJCXsKLQkJCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU1RCQyA9IChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQyAmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuVHhTVEJDKSk7Ci0JCQkJCQlwRW50cnktPk1wZHVEZW5zaXR5ID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NcGR1RGVuc2l0eTsKLQkJCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7Ci0JCQkJCQlwRW50cnktPk1tcHNNb2RlID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzOwotCQkJCQkJcEVudHJ5LT5BTXNkdVNpemUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5BTXNkdVNpemU7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjIwKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0kyMF9DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJNDBfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5UeFNUQkMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlJ4U1RCQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfUnhTVEJDX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfSFRDX0NBUEFCTEUpOwotCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJSZGcgJiYgSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5SREdTdXBwb3J0KQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5NQ1NGZWVkYmFjayA9PSAweDAzKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19NQ1NGRUVEQkFDS19DQVBBQkxFKTsKLQotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCQkJCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUud29yZCA9IHBFbnRyeS0+TWF4SFRQaHlNb2RlLndvcmQ7Ci0JCQkJCXBFbnRyeS0+Q3VyclR4UmF0ZSA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuYkF1dG9UeFJhdGVTd2l0Y2ggPT0gVFJVRSkKLQkJCQkJewotCQkJCQkJUFVDSEFSIHBUYWJsZTsKLQkJCQkJCVVDSEFSIFRhYmxlU2l6ZSA9IDA7Ci0KLQkJCQkJCU1sbWVTZWxlY3RUeFJhdGVUYWJsZShwQWQsIHBFbnRyeSwgJnBUYWJsZSwgJlRhYmxlU2l6ZSwgJnBFbnRyeS0+Q3VyclR4UmF0ZUluZGV4KTsKLQkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERQk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUzsKLQkJCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLQotCQkJCQkJUlRNUFVwZGF0ZUxlZ2FjeVR4U2V0dGluZygoVUNIQVIpcEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5GaXhlZFR4TW9kZSwgcEVudHJ5KTsKLQkJCQkJfQotCQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RhdHVzQ29kZSA9IE1MTUVfU1VDQ0VTUzsKLQotCQkvLyBjYW4gbm90IGZpbmQgaW4gdGFibGUsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJaWYgKGkgPCAwKQotCQl7Ci0JCQlTdGF0dXNDb2RlID0gTUxNRV9RT1NfVU5TUEVDSUZZOwotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgRExTRW50cnkgdGFibGUgZnVsbChvbmx5IGNhbiBzdXBwb3J0ICVkIERMUyBzZXNzaW9uKSBcbiIsIE1BWF9OVU1fT0ZfRExTX0VOVFJZIC0gTUFYX05VTV9PRl9JTklUX0RMU19FTlRSWSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBQZWVyRGxzUmVxQWN0aW9uKCkgdXNlIGVudHJ5KCVkKSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQlpLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7Ci0JCX0KLQl9Ci0KLQlBY3RIZWFkZXJJbml0KHBBZCwgJkRsc1JzcEhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCS8vIEJ1aWxkIGJhc2ljIGZyYW1lIGZpcnN0Ci0JaWYgKFN0YXR1c0NvZGUgPT0gTUxNRV9TVUNDRVNTKQotCXsKLQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwJCQkJJkZyYW1lTGVuLAotCQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1JzcEhkciwKLQkJCQkJCTEsCQkJCQkJCSZDYXRlZ29yeSwKLQkJCQkJCTEsCQkJCQkJCSZBY3Rpb24sCi0JCQkJCQkyLAkJCQkJCQkmU3RhdHVzQ29kZSwKLQkJCQkJCTYsCQkJCQkJCVNBLAotCQkJCQkJNiwJCQkJCQkJcEFkLT5DdXJyZW50QWRkcmVzcywKLQkJCQkJCTIsCQkJCQkJCSZwQWQtPlN0YUFjdGl2ZS5DYXBhYmlsaXR5SW5mbywKLQkJCQkJCTEsCQkJCQkJCSZTdXBSYXRlSWUsCi0JCQkJCQkxLAkJCQkJCQkmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4sCi0JCQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwJcEFkLT5NbG1lQXV4LlN1cFJhdGUsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuICE9IDApCi0JCXsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCQkgIDEsCQkJCQkJJkV4dFJhdGVJZSwKLQkJCQkJCQkgIDEsCQkJCQkJJnBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuLAotCQkJCQkJCSAgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4sCXBBZC0+TWxtZUF1eC5FeHRSYXRlLAotCQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQkJRnJhbWVMZW4gKz0gdG1wOwotCQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCQl7Ci0JCQlVQ0hBUiBIdExlbjsKLQotI2lmZGVmIFJUX0JJR19FTkRJQU4KLQkJCUhUX0NBUEFCSUxJVFlfSUUgSHRDYXBhYmlsaXR5VG1wOwotI2VuZGlmCi0KLQkJCS8vIGFkZCBIVCBDYXBhYmlsaXR5IElFCi0JCQlIdExlbiA9IHNpemVvZihIVF9DQVBBQklMSVRZX0lFKTsKLSNpZm5kZWYgUlRfQklHX0VORElBTgotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciArIEZyYW1lTGVuLAkmdG1wLAotCQkJCQkJCQkxLAkJCQkJCSZIdENhcEllLAotCQkJCQkJCQkxLAkJCQkJCSZIdExlbiwKLQkJCQkJCQkJSHRMZW4sCQkJCQkmcEFkLT5Db21tb25DZmcuSHRDYXBhYmlsaXR5LAotCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0jZWxzZQotCQkJTmRpc01vdmVNZW1vcnkoJkh0Q2FwYWJpbGl0eVRtcCwgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwgSHRMZW4pOwotCQkJCQkJCQkqKFVTSE9SVCAqKSgmSHRDYXBhYmlsaXR5VG1wLkh0Q2FwSW5mbykgPSBTV0FQMTYoKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5IdENhcEluZm8pKTsKLQkJCQkJCQkJKihVU0hPUlQgKikoJkh0Q2FwYWJpbGl0eVRtcC5FeHRIdENhcEluZm8pID0gU1dBUDE2KCooVVNIT1JUICopKCZIdENhcGFiaWxpdHlUbXAuRXh0SHRDYXBJbmZvKSk7Ci0KLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJJnRtcCwKLQkJCQkJCQkJMSwJCQkJCQkmSHRDYXBJZSwKLQkJCQkJCQkJMSwJCQkJCQkmSHRMZW4sCi0JCQkJCQkJCUh0TGVuLAkJCQkJJkh0Q2FwYWJpbGl0eVRtcCwKLQkJCQkJCQkJRU5EX09GX0FSR1MpOwotI2VuZGlmCi0JCQlGcmFtZUxlbiA9IEZyYW1lTGVuICsgdG1wOwotCQl9Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkJaWYgKHBETFMgJiYgKHBETFMtPlN0YXR1cyAhPSBETFNfRklOSVNIKSkKLQkJewotCQkJUlRNUENhbmNlbFRpbWVyKCZwRExTLT5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCVRpbWVvdXQgPSBETFNfVElNRU9VVDsKLQkJCVJUTVBTZXRUaW1lcigmcERMUy0+VGltZXIsIFRpbWVvdXQpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNSc3BIZHIsCi0JCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCi0JCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAotCQkJCQkJMiwJCQkJCQkJJlN0YXR1c0NvZGUsCi0JCQkJCQk2LAkJCQkJCQlTQSwKLQkJCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JfQotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckRsc1JzcEFjdGlvbigKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVVNIT1JUCQlDYXBhYmlsaXR5SW5mbzsKLQlVQ0hBUgkJREFbTUFDX0FERFJfTEVOXSwgU0FbTUFDX0FERFJfTEVOXTsKLQlVU0hPUlQJCVN0YXR1c0NvZGU7Ci0JU0hPUlQJCWk7Ci0JQk9PTEVBTgkJVGltZXJDYW5jZWxsZWQ7Ci0JVUNIQVIJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOwotICAgIFVDSEFSCQlTdXBwb3J0ZWRSYXRlc0xlbjsKLSAgICBVQ0hBUgkJU3VwcG9ydGVkUmF0ZXNbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQlIdENhcGFiaWxpdHlMZW47Ci0JSFRfQ0FQQUJJTElUWV9JRQlIdENhcGFiaWxpdHk7Ci0KLQlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQlyZXR1cm47Ci0KLQlpZiAoIUlORlJBX09OKHBBZCkpCi0JCXJldHVybjsKLQotCWlmICghUGVlckRsc1JzcFNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBEQSwgU0EsICZDYXBhYmlsaXR5SW5mbywgJlN0YXR1c0NvZGUsCi0JCQkJCQkJJlN1cHBvcnRlZFJhdGVzTGVuLCAmU3VwcG9ydGVkUmF0ZXNbMF0sICZIdENhcGFiaWxpdHlMZW4sICZIdENhcGFiaWxpdHkpKQotCQlyZXR1cm47Ci0KLSAgICAvLyBzdXBwb3J0ZWQgcmF0ZXMgYXJyYXkgbWF5IG5vdCBiZSBzb3J0ZWQuIHNvcnQgaXQgYW5kIGZpbmQgdGhlIG1heGltdW0gcmF0ZQotICAgIGZvciAoaT0wOyBpPFN1cHBvcnRlZFJhdGVzTGVuOyBpKyspCi0gICAgewotICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBwb3J0ZWRSYXRlc1tpXSAmIDB4N2YpKQotICAgICAgICAgICAgTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA9IFN1cHBvcnRlZFJhdGVzW2ldICYgMHg3ZjsKLSAgICB9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IHdpdGggU3RhdHVzQ29kZT0lZCwgQ2FwYWJpbGl0eUluZm89MHgleFxuIiwKLQkJU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSwgU3RhdHVzQ29kZSwgQ2FwYWJpbGl0eUluZm8pKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlpZiAoU3RhdHVzQ29kZSA9PSBNTE1FX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0JCQkJVUNIQVIgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTE7Ci0KLQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOwotCi0JCQkJc3dpdGNoIChNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzKQotCQkJCXsKLQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOwotCQkJCQljYXNlIDk2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNDg7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgNzI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8zNjsgICBicmVhazsKLQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOwotCQkJCQljYXNlIDM2OiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMTg7ICAgYnJlYWs7Ci0JCQkJCWNhc2UgMjQ6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMjsgICBicmVhazsKLQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOwotCQkJCQljYXNlIDEyOiAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfNjsgICAgYnJlYWs7Ci0JCQkJCWNhc2UgMjI6ICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsgICBicmVhazsKLQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOwotCQkJCQljYXNlIDQ6ICAgTWF4U3VwcG9ydGVkUmF0ZSA9IFJBVEVfMjsgICAgYnJlYWs7Ci0JCQkJCWNhc2UgMjogICBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xOyAgICBicmVhazsKLQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotCQkJCX0KLQotCQkJCXBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA9IG1pbihwQWQtPkNvbW1vbkNmZy5NYXhUeFJhdGUsIE1heFN1cHBvcnRlZFJhdGUpOwotCi0JCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQotCQkJCXsKLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfQ0NLOwotCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0NDSzsKLQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJcEVudHJ5LT5NaW5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQl9Ci0KLQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLkJXID0gQldfMjA7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQlwRW50cnktPkhUQ2FwYWJpbGl0eS5NQ1NTZXRbMF0gPSAwOwotCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7Ci0KLQkJCQkvLyBJZiB0aGlzIEVudHJ5IHN1cHBvcnRzIDgwMi4xMW4sIHVwZ3JhZGUgdG8gSFQgcmF0ZS4KLQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKSAmJiAocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSkKLQkJCQl7Ci0JCQkJCVVDSEFSCWosIGJpdG1hc2s7IC8vayxiaXRtYXNrOwotCQkJCQlDSEFSICAgIGlpOwotCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIFJlY2VpdmUgUGVlciBIVCBDYXBhYmxlIFNUQSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7Ci0KLQkJCQkJaWYgKChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkdGKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkdGKSkKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7Ci0JCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbk5vbkdGID0gVFJVRTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7Ci0JCQkJCX0KLQotCQkJCQlpZiAoKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoKSAmJiAocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkNoYW5uZWxXaWR0aCkpCi0JCQkJCXsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXPSBCV180MDsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yNDApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kgPSAoKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5TaG9ydEdJZm9yMjApJihIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3IyMCkpOwotCQkJCQkJcEFkLT5NYWNUYWIuZkFueVN0YXRpb24yME9ubHkgPSBUUlVFOwotCQkJCQl9Ci0KLQkJCQkJLy8gZmluZCBtYXggZml4ZWQgcmF0ZQotCQkJCQlmb3IgKGlpPTE1OyBpaT49MDsgaWktLSkKLQkJCQkJewotCQkJCQkJaiA9IGlpLzg7Ci0JCQkJCQliaXRtYXNrID0gKDE8PChpaS0oaio4KSkpOwotCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gaWk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaWk9PTApCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlpZiAocEFkLT5TdGFDZmcuRGVzaXJlZFRyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgIT0gTUNTX0FVVE8pCi0JCQkJCXsKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKLQkJCQkJCXsKLQkJCQkJCQkvLyBGaXggTUNTIGFzIEhUIER1cGxpY2F0ZWQgTW9kZQotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9IVE1JWDsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gMDsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSAzMjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gU1RBIHN1cHBvcnRzIGZpeGVkIE1DUwotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKLQkJCQkJcEVudHJ5LT5NcGR1RGVuc2l0eSA9IEh0Q2FwYWJpbGl0eS5IdENhcFBhcm0uTXBkdURlbnNpdHk7Ci0JCQkJCXBFbnRyeS0+TWF4UkFtcGR1RmFjdG9yID0gSHRDYXBhYmlsaXR5Lkh0Q2FwUGFybS5NYXhSQW1wZHVGYWN0b3I7Ci0JCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7Ci0JCQkJCXBFbnRyeS0+QU1zZHVTaXplID0gKFVDSEFSKUh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplOwotCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQotCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfU0dJMjBfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlNob3J0R0lmb3I0MCkKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uVHhTVEJDKQotCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1R4U1RCQ19DQVBBQkxFKTsKLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQotCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1J4U1RCQ19DQVBBQkxFKTsKLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUGx1c0hUQykKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7Ci0JCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iUmRnICYmIEh0Q2FwYWJpbGl0eS5FeHRIdENhcEluZm8uUkRHU3VwcG9ydCkKLQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSk7Ci0JCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCi0JCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfTUNTRkVFREJBQ0tfQ0FQQUJMRSk7Ci0KLQkJCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+SFRDYXBhYmlsaXR5LCAmSHRDYXBhYmlsaXR5LCBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSkpOwotCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQkJCQlwRW50cnktPkN1cnJUeFJhdGUgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1dNTV9DQVBBQkxFKTsKLQotCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCQkJCXsKLQkJCQkJUFVDSEFSIHBUYWJsZTsKLQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKLQotCQkJCQlNbG1lU2VsZWN0VHhSYXRlVGFibGUocEFkLCBwRW50cnksICZwVGFibGUsICZUYWJsZVNpemUsICZwRW50cnktPkN1cnJUeFJhdGVJbmRleCk7Ci0JCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBUUlVFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUwk9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQkJCXBFbnRyeS0+YkF1dG9UeFJhdGVTd2l0Y2ggPSBGQUxTRTsKLQotCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCQkJCX0KLQkJCQlwRW50cnktPlJhdGVMZW4gPSBTdXBwb3J0ZWRSYXRlc0xlbjsKLQotCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJewotCQkJCQkvLyBJZiBzdXBwb3J0IFdQQSBvciBXUEEyLCBzdGFydCBTVEFLZXkgaGFuZCBzaGFrZSwKLQkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCi0JCQkJCWlmIChSVE1QU2VuZFNUQUtleVJlcXVlc3QocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCQl7Ci0JCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7Ci0JCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7Ci0KLQkJCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX05PTkU7Ci0JCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX1dBSVRfS0VZOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSB3YWl0aW5nIGZvciBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZVxuIikpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19GSU5JU0g7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCQkJCX0KLQotCQkJCS8vaW5pdGlhbGl6ZSBzZXEgbm8gZm9yIERMUyBmcmFtZXMuCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU2VxdWVuY2UgPSAwOwotCQkJCWlmIChIdENhcGFiaWxpdHlMZW4gIT0gMCkKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKLQkJCQllbHNlCi0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLmJIVENhcCA9IEZBTFNFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gZmFpbGVkIHdpdGggU3RhdHVzQ29kZT0lZCBcbiIsIFN0YXR1c0NvZGUpKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChpID49IE1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24oKSB1cGRhdGUgdGltZW91dCB2YWx1ZSBcbiIpKTsKLQkJZm9yIChpPShNQVhfTlVNX09GX0RMU19FTlRSWS0xKTsgaT49TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaS0tKQotCQl7Ci0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQkJewotCQkJCWlmIChTdGF0dXNDb2RlID09IE1MTUVfU1VDQ0VTUykKLQkJCQl7Ci0JCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCQkJCQlVQ0hBUiBNYXhTdXBwb3J0ZWRSYXRlID0gUkFURV8xMTsKLQotCQkJCQlwRW50cnkgPSBNYWNUYWJsZUluc2VydERsc0VudHJ5KHBBZCwgU0EsIGkpOwotCi0JCQkJCXN3aXRjaCAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcykKLQkJCQkJewotCQkJCQkJY2FzZSAxMDg6IE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzU0OyAgIGJyZWFrOwotCQkJCQkJY2FzZSA5NjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzQ4OyAgIGJyZWFrOwotCQkJCQkJY2FzZSA3MjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzM2OyAgIGJyZWFrOwotCQkJCQkJY2FzZSA0ODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI0OyAgIGJyZWFrOwotCQkJCQkJY2FzZSAzNjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE4OyAgIGJyZWFrOwotCQkJCQkJY2FzZSAyNDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzEyOyAgIGJyZWFrOwotCQkJCQkJY2FzZSAxODogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzk7ICAgIGJyZWFrOwotCQkJCQkJY2FzZSAxMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzY7ICAgIGJyZWFrOwotCQkJCQkJY2FzZSAyMjogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotCQkJCQkJY2FzZSAxMTogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzVfNTsgIGJyZWFrOwotCQkJCQkJY2FzZSA0OiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzI7ICAgIGJyZWFrOwotCQkJCQkJY2FzZSAyOiAgIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzE7ICAgIGJyZWFrOwotCQkJCQkJZGVmYXVsdDogIE1heFN1cHBvcnRlZFJhdGUgPSBSQVRFXzExOyAgIGJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlID0gbWluKHBBZC0+Q29tbW9uQ2ZnLk1heFR4UmF0ZSwgTWF4U3VwcG9ydGVkUmF0ZSk7Ci0KLQkJCQkJaWYgKHBFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZSA8IFJBVEVfRklSU1RfT0ZETV9SQVRFKQotCQkJCQl7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9DQ0s7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBwRW50cnktPk1heFN1cHBvcnRlZFJhdGU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NT0RFID0gTU9ERV9PRkRNOwotCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gT2ZkbVJhdGVUb1J4d2lNQ1NbcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlXTsKLQkJCQkJCXBFbnRyeS0+TWluSFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX09GRE07Ci0JCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5NQ1MgPSBPZmRtUmF0ZVRvUnh3aU1DU1twRW50cnktPk1heFN1cHBvcnRlZFJhdGVdOwotCQkJCQkJcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfT0ZETTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLk1DUyA9IE9mZG1SYXRlVG9SeHdpTUNTW3BFbnRyeS0+TWF4U3VwcG9ydGVkUmF0ZV07Ci0JCQkJCX0KLQotCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCQkJCQlwRW50cnktPk1pbkhUUGh5TW9kZS5maWVsZC5CVyA9IEJXXzIwOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFswXSA9IDA7Ci0JCQkJCXBFbnRyeS0+SFRDYXBhYmlsaXR5Lk1DU1NldFsxXSA9IDA7Ci0KLQkJCQkJLy8gSWYgdGhpcyBFbnRyeSBzdXBwb3J0cyA4MDIuMTFuLCB1cGdyYWRlIHRvIEhUIHJhdGUuCi0JCQkJCWlmICgoSHRDYXBhYmlsaXR5TGVuICE9IDApICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpKQotCQkJCQl7Ci0JCQkJCQlVQ0hBUglqLCBiaXRtYXNrOyAvL2ssYml0bWFzazsKLQkJCQkJCUNIQVIgICAgaWk7Ci0KLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRMUyAtIFBlZXJEbHNSc3BBY3Rpb24gUmVjZWl2ZSBQZWVyIEhUIENhcGFibGUgU1RBIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCQkJCQkJCQlTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdKSk7Ci0KLQkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5HRikgJiYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5HRikpCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRHUkVFTkZJRUxEOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1PREUgPSBNT0RFX0hUTUlYOwotCQkJCQkJCXBBZC0+TWFjVGFiLmZBbnlTdGF0aW9uTm9uR0YgPSBUUlVFOwotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk5vbkdmUHJlc2VudCA9IDE7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICgoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpICYmIChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQ2hhbm5lbFdpZHRoKSkKLQkJCQkJCXsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5CVz0gQldfNDA7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuU2hvcnRHSSA9ICgocEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LlNob3J0R0lmb3I0MCkmKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuQlcgPSBCV18yMDsKLQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gKChwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuU2hvcnRHSWZvcjIwKSYoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApKTsKLQkJCQkJCQlwQWQtPk1hY1RhYi5mQW55U3RhdGlvbjIwT25seSA9IFRSVUU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGZpbmQgbWF4IGZpeGVkIHJhdGUKLQkJCQkJCWZvciAoaWk9MTU7IGlpPj0wOyBpaS0tKQotCQkJCQkJewotCQkJCQkJCWogPSBpaS84OwotCQkJCQkJCWJpdG1hc2sgPSAoMTw8KGlpLShqKjgpKSk7Ci0JCQkJCQkJaWYgKCAocEFkLT5TdGFDZmcuRGVzaXJlZEh0UGh5SW5mby5NQ1NTZXRbal0mYml0bWFzaykgJiYgKEh0Q2FwYWJpbGl0eS5NQ1NTZXRbal0mYml0bWFzaykpCi0JCQkJCQkJewotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5NQ1MgPSBpaTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChpaT09MCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyAhPSBNQ1NfQVVUTykKLQkJCQkJCXsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiQEBAIHBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5NQ1MgPSAlZFxuIiwKLQkJCQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUykpOwotCQkJCQkJCWlmIChwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9PSAzMikKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIEZpeCBNQ1MgYXMgSFQgRHVwbGljYXRlZCBNb2RlCi0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLkJXID0gMTsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTU9ERSA9IE1PREVfSFRNSVg7Ci0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLlNUQkMgPSAwOwotCQkJCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TaG9ydEdJID0gMDsKLQkJCQkJCQkJcEVudHJ5LT5NYXhIVFBoeU1vZGUuZmllbGQuTUNTID0gMzI7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA+IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1MpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBTVEEgc3VwcG9ydHMgZml4ZWQgTUNTCi0JCQkJCQkJCXBFbnRyeS0+TWF4SFRQaHlNb2RlLmZpZWxkLk1DUyA9IHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NQ1M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlwRW50cnktPk1heEhUUGh5TW9kZS5maWVsZC5TVEJDID0gKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDICYgKHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5UeFNUQkMpKTsKLQkJCQkJCXBFbnRyeS0+TXBkdURlbnNpdHkgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5OwotCQkJCQkJcEVudHJ5LT5NYXhSQW1wZHVGYWN0b3IgPSBIdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1heFJBbXBkdUZhY3RvcjsKLQkJCQkJCXBFbnRyeS0+TW1wc01vZGUgPSAoVUNIQVIpSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5NaW1vUHM7Ci0JCQkJCQlwRW50cnktPkFNc2R1U2l6ZSA9IChVQ0hBUilIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkFNc2R1U2l6ZTsKLQkJCQkJCXBFbnRyeS0+SFRQaHlNb2RlLndvcmQgPSBwRW50cnktPk1heEhUUGh5TW9kZS53b3JkOwotCi0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5TaG9ydEdJZm9yMjApCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1NHSTIwX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uU2hvcnRHSWZvcjQwKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19TR0k0MF9DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLlR4U1RCQykKLQkJCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfVHhTVEJDX0NBUEFCTEUpOwotCQkJCQkJaWYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uUnhTVEJDKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19SeFNUQkNfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAoSHRDYXBhYmlsaXR5LkV4dEh0Q2FwSW5mby5QbHVzSFRDKQotCQkJCQkJCUNMSUVOVF9TVEFUVVNfU0VUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19IVENfQ0FQQUJMRSk7Ci0JCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYlJkZyAmJiBIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLlJER1N1cHBvcnQpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX1JER19DQVBBQkxFKTsKLQkJCQkJCWlmIChIdENhcGFiaWxpdHkuRXh0SHRDYXBJbmZvLk1DU0ZlZWRiYWNrID09IDB4MDMpCi0JCQkJCQkJQ0xJRU5UX1NUQVRVU19TRVRfRkxBRyhwRW50cnksIGZDTElFTlRfU1RBVFVTX01DU0ZFRURCQUNLX0NBUEFCTEUpOwotCi0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5IVENhcGFiaWxpdHksICZIdENhcGFiaWxpdHksIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSk7Ci0JCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJCQlwRW50cnktPkhUUGh5TW9kZS53b3JkID0gcEVudHJ5LT5NYXhIVFBoeU1vZGUud29yZDsKLQkJCQkJcEVudHJ5LT5DdXJyVHhSYXRlID0gcEVudHJ5LT5NYXhTdXBwb3J0ZWRSYXRlOwotCQkJCQlDTElFTlRfU1RBVFVTX1NFVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpOwotCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBUUlVFKQotCQkJCQl7Ci0JCQkJCQlQVUNIQVIgcFRhYmxlOwotCQkJCQkJVUNIQVIgVGFibGVTaXplID0gMDsKLQotCQkJCQkJTWxtZVNlbGVjdFR4UmF0ZVRhYmxlKHBBZCwgcEVudHJ5LCAmcFRhYmxlLCAmVGFibGVTaXplLCAmcEVudHJ5LT5DdXJyVHhSYXRlSW5kZXgpOwotCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IFRSVUU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFCT0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREU7Ci0JCQkJCQlwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MJPSBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJCQkJcEVudHJ5LT5iQXV0b1R4UmF0ZVN3aXRjaCA9IEZBTFNFOwotCi0JCQkJCQlSVE1QVXBkYXRlTGVnYWN5VHhTZXR0aW5nKChVQ0hBUilwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkZpeGVkVHhNb2RlLCBwRW50cnkpOwotCQkJCQl9Ci0JCQkJCXBFbnRyeS0+UmF0ZUxlbiA9IFN1cHBvcnRlZFJhdGVzTGVuOwotCi0JCQkJCWlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0JCQkJCXsKLQkJCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAotCQkJCQkJLy8gSWYgZmFpbGVkIGhhbmQgc2hha2UsIGp1c3QgdGVhciBkb3duIHBlZXIgRExTCi0JCQkJCQlpZiAoUlRNUFNlbmRTVEFLZXlSZXF1ZXN0KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQkJCXsKLQkJCQkJCQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7Ci0JCQkJCQkJVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfQ0lQSEVSX05PVF9TVVBQT1JUOwotCi0JCQkJCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOwotCQkJCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19OT05FOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aGVuIGNhbGwgUlRNUFNlbmRTVEFLZXlSZXF1ZXN0IFxuIikpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9IERMU19XQUlUX0tFWTsKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIHdhaXRpbmcgZm9yIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlXG4iKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUGVlckRsc1JzcEFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggU3VjY2VlZCB3aXRoIFdFUCBvciBubyBzZWN1cml0eVxuIiwgU0FbMF0sIFNBWzFdLCBTQVsyXSwgU0FbM10sIFNBWzRdLCBTQVs1XSkpOwotCQkJCQl9Ci0JCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlNlcXVlbmNlID0gMDsKLQkJCQkJaWYgKEh0Q2FwYWJpbGl0eUxlbiAhPSAwKQotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gVFJVRTsKLQkJCQkJZWxzZQotCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uYkhUQ2FwID0gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vIERMUyBzZXR1cCBwcm9jZWR1cmUgZmFpbGVkLgotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMgPSBETFNfTk9ORTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJETFMgLSBQZWVyRGxzUnNwQWN0aW9uIGZhaWxlZCB3aXRoIFN0YXR1c0NvZGU9JWQgXG4iLCBTdGF0dXNDb2RlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZURsc1RlYXJEb3duQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIJCQlwT3V0QnVmZmVyID0gTlVMTDsKLQlORElTX1NUQVRVUwkJTlN0YXR1czsKLQlVTE9ORwkJCUZyYW1lTGVuID0gMDsKLQlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOwotCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKLQlVU0hPUlQJCQlSZWFzb25Db2RlID0gUkVBU09OX1FPU19VTlNQRUNJRlk7Ci0JSEVBREVSXzgwMl8xMQlEbHNUZWFyRG93bkhkcjsKLQlQUlRfODAyXzExX0RMUwlwRExTOwotCUJPT0xFQU4JCQlUaW1lckNhbmNlbGxlZDsKLQlVQ0hBUgkJCWk7Ci0KLQlpZighTWxtZURsc1JlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAmcERMUywgJlJlYXNvbkNvZGUpKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIE1sbWVEbHNUZWFyRG93bkFjdGlvbigpIHdpdGggUmVhc29uQ29kZT0lZCBcbiIsIFJlYXNvbkNvZGUpKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiRExTIC0gTWxtZURsc1RlYXJEb3duQWN0aW9uKCkgYWxsb2NhdGUgbWVtb3J5IGZhaWxlZCBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCUFjdEhlYWRlckluaXQocEFkLCAmRGxzVGVhckRvd25IZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0KLQkvLyBCdWlsZCBiYXNpYyBmcmFtZSBmaXJzdAotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsCQkJCSZGcmFtZUxlbiwKLQkJCQkJc2l6ZW9mKEhFQURFUl84MDJfMTEpLAkJJkRsc1RlYXJEb3duSGRyLAotCQkJCQkxLAkJCQkJCQkmQ2F0ZWdvcnksCi0JCQkJCTEsCQkJCQkJCSZBY3Rpb24sCi0JCQkJCTYsCQkJCQkJCSZwRExTLT5NYWNBZGRyLAotCQkJCQk2LAkJCQkJCQlwQWQtPkN1cnJlbnRBZGRyZXNzLAotCQkJCQkyLAkJCQkJCQkmUmVhc29uQ29kZSwKLQkJCQkJRU5EX09GX0FSR1MpOwotCi0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCBRSURfQUNfQkUsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCVJUTVBDYW5jZWxUaW1lcigmcERMUy0+VGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0KLQkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAoTUFDX0FERFJfRVFVQUwocERMUy0+TWFjQWRkciwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcikpCi0JCXsKLQkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQl9Ci0JfQotCi0JLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGkgPSBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpIDwgTUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCWlmIChNQUNfQUREUl9FUVVBTChwRExTLT5NYWNBZGRyLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQl9Ci0JfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckRsc1RlYXJEb3duQWN0aW9uKAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUgkJCURBW01BQ19BRERSX0xFTl0sIFNBW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUCQkJUmVhc29uQ29kZTsKLQlVSU5UCQkJaTsKLQlCT09MRUFOCQkJVGltZXJDYW5jZWxsZWQ7Ci0KLQlpZiAoIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQlyZXR1cm47Ci0KLQlpZiAoIUlORlJBX09OKHBBZCkpCi0JCXJldHVybjsKLQotCWlmICghUGVlckRsc1RlYXJEb3duU2FuaXR5KHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sIERBLCBTQSwgJlJlYXNvbkNvZGUpKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFBlZXJEbHNUZWFyRG93bkFjdGlvbigpIGZyb20gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggd2l0aCBSZWFzb25Db2RlPSVkXG4iLCBTQVswXSwgU0FbMV0sIFNBWzJdLCBTQVszXSwgU0FbNF0sIFNBWzVdLCBSZWFzb25Db2RlKSk7Ci0KLQkvLyBjbGVhciBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwoU0EsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQkJLy9Bc2ljRGVsV2NpZFRhYihwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7Ci0JCQkvL0FzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZCwgQlNTMCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lEKTsKLQkJCU1hY1RhYmxlRGVsZXRlRGxzRW50cnkocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQl9Ci0JfQotCi0JLy8gY2xlYXIgcGVlciBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaTxNQVhfTlVNX09GX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkICYmIE1BQ19BRERSX0VRVUFMKFNBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQkJCS8vQXNpY0RlbFdjaWRUYWIocEFkLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQpOwotCQkJLy9Bc2ljUmVtb3ZlUGFpcndpc2VLZXlFbnRyeShwQWQsIEJTUzAsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCk7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFJUTVBDaGVja0RMU1RpbWVPdXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQpCi17Ci0JVUxPTkcJCQkJaTsKLQlNTE1FX0RMU19SRVFfU1RSVUNUCU1sbWVEbHNSZXE7Ci0JVVNIT1JUCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfVU5TUEVDSUZZOwotCi0JaWYgKCEgcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JCXJldHVybjsKLQotCWlmICghIElORlJBX09OKHBBZCkpCi0JCXJldHVybjsKLQotCS8vIElmIHRpbWVvdXQgdmFsdWUgaXMgZXF1YWxlZCB0byB6ZXJvLCBpdCBtZWFucyBhbHdheXMgbm90IGJlIHRpbWVvdXQuCi0KLQkvLyB1cGRhdGUgbG9jYWwgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCkgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQgIT0gMCkpCi0JCXsKLQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLkNvdW50RG93blRpbWVyIC0tOwotCi0JCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPT0gMCkKLQkJCXsKLQkJCQlyZWFzb24gPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCi0JCQkmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVGltZU91dCAhPSAwKSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgLS07Ci0KLQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9PSAwKQotCQkJewotCQkJCXJlYXNvbiA9IFJFQVNPTl9RT1NfUkVRVUVTVF9USU1FT1VUOwotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQkJRGxzUGFybUZpbGwocEFkLCAmTWxtZURsc1JlcSwgJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLCByZWFzb24pOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwgRExTX1NUQVRFX01BQ0hJTkUsIE1UMl9NTE1FX0RMU19URUFSX0RPV04sIHNpemVvZihNTE1FX0RMU19SRVFfU1RSVUNUKSwgJk1sbWVEbHNSZXEpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUlRNUFJjdkZyYW1lRExTQ2hlY2soCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gUEhFQURFUl84MDJfMTEJcEhlYWRlciwKLQlJTiBVTE9ORwkJCUxlbiwKLQlJTiBQUlQyOFhYX1JYRF9TVFJVQwlwUnhEKQotewotCVVMT05HCQkJaTsKLQlCT09MRUFOCQkJYkZpbmRFbnRyeSA9IEZBTFNFOwotCUJPT0xFQU4JCQliU1RBS2V5RnJhbWUgPSBGQUxTRTsKLQlQRUFQT0xfUEFDS0VUCXBFYXA7Ci0JUFVDSEFSCQkJcFByb3RvLCBwQWRkciA9IE5VTEw7Ci0JUFVDSEFSCQkJcFNUQUtleSA9IE5VTEw7Ci0JVUNIQVIJCQlaZXJvUmVwbGF5W0xFTl9LRVlfREVTQ19SRVBMQVldOwotCVVDSEFSCQkJTWljWzE2XSwgT2xkTWljWzE2XTsKLQlVQ0hBUgkJCWRpZ2VzdFs4MF07Ci0JVUNIQVIJCQlEbHNQVEtbODBdOwotCVVDSEFSCQkJdGVtcFs2NF07Ci0JQk9PTEVBTgkJCVRpbWVyQ2FuY2VsbGVkOwotCUNJUEhFUl9LRVkJCVBhaXJ3aXNlS2V5OwotCi0KLQlpZiAoISBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCWlmICghIElORlJBX09OKHBBZCkpCi0JCXJldHVybiBiU1RBS2V5RnJhbWU7Ci0KLQlpZiAoTGVuIDwgTEVOR1RIXzgwMl8xMSArIDYgKyAyKSAvKiBMRU5HVEhfODAyXzExICsgTExDICsgRUFQT0wgcHJvdG9jb2wgdHlwZSAqLwotCQlyZXR1cm4gYlNUQUtleUZyYW1lOwotCi0JcFByb3RvCT0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMTsKLQotCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDgpKQotCQlwUHJvdG8JKz0gMjsJLyogUU9TIENvbnRyb2wgZmllbGQgKi8KLQotICAgICAvKiBTa2lwIDQtYnl0ZXMgZm9yIEhUQyAqLwotICAgICBpZiAocEhlYWRlci0+RkMuT3JkZXIgJiYgKCFPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0FHR1JFR0FUSU9OX0lOVVNFRCkpKQotICAgICB7Ci0gICAgICAgICAgcFByb3RvICs9IDQ7Ci0gICAgIH0KLQotCS8qIEwyUEFEIGJpdCBvbiB3aWxsIHBhZCAyIGJ5dGVzIGF0IExMQyAqLwotCWlmIChwUnhELT5MMlBBRCkKLQl7Ci0JCXBQcm90byArPSAyOwotCX0KLQotCXBQcm90bwkrPSA2OwkvKiAweEFBIDB4QUEgMHhBQSAweDAwIDB4MDAgMHgwMCAqLwotCi0JaWYgKCghKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkgJiYgKCFSVE1QRXF1YWxNZW1vcnkoRUFQT0wsIHBQcm90bywgMikpKQotCQlyZXR1cm4gYlNUQUtleUZyYW1lOwotCi0JcEFkZHIJPSBwSGVhZGVyLT5BZGRyMjsKLQotCWlmIChSVE1QRXF1YWxNZW1vcnkoRUFQT0wsIHBQcm90bywgMikgJiYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID49ICBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCXsKLQkJcEVhcCA9IChQRUFQT0xfUEFDS0VUKSAocFByb3RvICsgMik7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiBMZW49JWxkLCBEYXRhTGVuPSVkLCBLZXlNaWM9JWQsIEluc3RhbGw9JWQsIEtleUFjaz0lZCwgU2VjdXJlPSVkLCBFS0RfREw9JWQsIEVycm9yPSVkLCBSZXF1ZXN0PSVkXG4iLCBMZW4sCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExFTkdUSF84MDJfMTEgKyA2ICsgMiArIDIgKyBzaXplb2YoRUFQT0xfUEFDS0VUKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyAxNiksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYywKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uSW5zdGFsbCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uS2V5QWNrLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFYXAtPktleURlc2MuS2V5SW5mby5TZWN1cmUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkVLRF9ETCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QpKTsKLQotCQlpZiAoKExlbiA+PSAoTEVOR1RIXzgwMl8xMSArIDYgKyAyICsgMiArIHNpemVvZihFQVBPTF9QQUNLRVQpIC0gTUFYX0xFTl9PRl9SU05JRSArIDE2KSkgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleU1pYwotCQkJJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLkluc3RhbGwgJiYgcEVhcC0+S2V5RGVzYy5LZXlJbmZvLktleUFjayAmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uU2VjdXJlCi0JCQkmJiBwRWFwLT5LZXlEZXNjLktleUluZm8uRUtEX0RMICYmICFwRWFwLT5LZXlEZXNjLktleUluZm8uRXJyb3IgJiYgIXBFYXAtPktleURlc2MuS2V5SW5mby5SZXF1ZXN0KQotCQl7Ci0JCQkvLyBGaXJzdCB2YWxpZGF0ZSByZXBsYXkgY291bnRlciwgb25seSBhY2NlcHQgbWVzc2FnZSB3aXRoIGxhcmdlciByZXBsYXkgY291bnRlcgotCQkJLy8gTGV0IGVxdWFsIHBhc3MsIHNvbWUgQVAgc3RhcnQgd2l0aCBhbGwgemVybyByZXBsYXkgY291bnRlcgotCQkJTmRpc1plcm9NZW1vcnkoWmVyb1JlcGxheSwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCQlpZiAoKFJUTVBDb21wYXJlTWVtb3J5KHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSkgIT0gMSkgJiYKLQkJCQkoUlRNUENvbXBhcmVNZW1vcnkocEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBaZXJvUmVwbGF5LCBMRU5fS0VZX0RFU0NfUkVQTEFZKSAhPSAwKSkKLQkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOwotCi0JCQkvL1JUTVBNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIHBFYXAtPktleURlc2MuUmVwbGF5Q291bnRlciwgTEVOX0tFWV9ERVNDX1JFUExBWSk7Ci0JCQlSVE1QTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5EbHNSZXBsYXlDb3VudGVyLCBwRWFwLT5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBTbmlmZiByZXBsYXkgY291bnRlciAoJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4KSBMZW49JWxkLCBLZXlEYXRhTGVuPSVkXG4iLAotCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMF0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMV0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbMl0sCi0JCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclszXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls0XSwJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlcls1XSwKLQkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzZdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzddLCBMZW4sIHBFYXAtPktleURlc2MuS2V5RGF0YVsxXSkpOwotCi0JCQkvLyBwdXQgdGhlc2UgY29kZSBzZWdtZW50IHRvIGdldCB0aGUgcmVwbGF5IGNvdW50ZXIKLQkJCWlmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpCi0JCQkJcmV0dXJuIGJTVEFLZXlGcmFtZTsKLQotCQkJLy8gQ2hlY2sgTUlDIHZhbHVlCi0JCQkvLyBTYXZlIHRoZSBNSUMgYW5kIHJlcGxhY2Ugd2l0aCB6ZXJvCi0JCQkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCi0JCQlOZGlzWmVyb01lbW9yeSh0ZW1wLCA2NCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSh0ZW1wLCAiSUVFRTgwMi4xMSBXSVJFTEVTUyBBQ0NFU1MgUE9JTlQiLCAzMik7Ci0JCQlXcGFEZXJpdmVQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKLQotCQkJTmRpc01vdmVNZW1vcnkoT2xkTWljLCBwRWFwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0JCQlOZGlzWmVyb01lbW9yeShwRWFwLT5LZXlEZXNjLktleU1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0JCQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQl7Ci0JCQkJLy8gQUVTCi0JCQkJSE1BQ19TSEExKERsc1BUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoTWljLAlkaWdlc3QsCUxFTl9LRVlfREVTQ19NSUMpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUhNQUNfTUQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCAoUFVDSEFSKSBwRWFwLCBwRWFwLT5Cb2R5X0xlblsxXSArIDQsIE1pYywgTUQ1X0RJR0VTVF9TSVpFKTsKLQkJCX0KLQotCQkJaWYgKCFOZGlzRXF1YWxNZW1vcnkoT2xkTWljLCBNaWMsIExFTl9LRVlfREVTQ19NSUMpKQotCQkJewotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIk1JQyBEaWZmZXJlbnQgaW4gTXNnMSBvZiBTVEFLZXkgaGFuZHNoYWtlISBcbiIpKTsKLQkJCQlyZXR1cm4gYlNUQUtleUZyYW1lOwotCQkJfQotCQkJZWxzZQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1JQyBWQUxJRCBpbiBNc2cxIG9mIFNUQUtleSBoYW5kc2hha2UhIFxuIikpOwotCQkJaWYgKChwRWFwLT5LZXlEZXNjLktleURhdGFbMF0gPT0gMHhERCkgJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVsyXSA9PSAweDAwKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzNdID09IDB4MEMpCi0JCQkJJiYgKHBFYXAtPktleURlc2MuS2V5RGF0YVs0XSA9PSAweDQzKSAmJiAocEVhcC0+S2V5RGVzYy5LZXlEYXRhWzVdID09IDB4MDIpKQotCQkJewotCQkJCXBBZGRyCQkJPSBwRWFwLT5LZXlEZXNjLktleURhdGEgKyA4OwkJLy8gVHBlKDEpLCBMZW4oMSksIE9VSSgzKSwgRGF0YVR5cGUoMSksIFJlc2VydmVkKDIpCi0JCQkJcFNUQUtleQkJCT0gcEVhcC0+S2V5RGVzYy5LZXlEYXRhICsgMTQ7CS8vIFRwZSgxKSwgTGVuKDEpLCBPVUkoMyksIERhdGFUeXBlKDEpLCBSZXNlcnZlZCgyKSwgU1RBS2V5X01hY19BZGRyKDYpCi0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCi0JCQkJCXBBZGRyWzBdLCBwQWRkclsxXSwgcEFkZHJbMl0sIHBBZGRyWzNdLCBwQWRkcls0XSwgcEFkZHJbNV0sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7Ci0KLQkJCQliU1RBS2V5RnJhbWUgPSBUUlVFOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoTGVuID49IChMRU5HVEhfODAyXzExICsgNiArIDIgKyAyICsgc2l6ZW9mKEVBUE9MX1BBQ0tFVCkgLSBNQVhfTEVOX09GX1JTTklFKSkKLQkJewotCQkJUlRNUE1vdmVNZW1vcnkocEFkLT5TdGFDZmcuRGxzUmVwbGF5Q291bnRlciwgcEVhcC0+S2V5RGVzYy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gU25pZmYgcmVwbGF5IGNvdW50ZXIgMiglMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngpIExlbj0lbGQsIEtleURhdGFMZW49JWRcbiIsCi0JCQkJcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclswXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsxXSwgcEFkLT5TdGFDZmcuUmVwbGF5Q291bnRlclsyXSwKLQkJCQlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzNdLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzRdLAlwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyWzVdLAotCQkJCXBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbNl0sIHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXJbN10sIExlbiwgcEVhcC0+S2V5RGVzYy5LZXlEYXRhWzFdKSk7Ci0JCX0KLQl9Ci0KLQkvLyBJZiB0aW1lb3V0IHZhbHVlIGlzIGVxdWFsZWQgdG8gemVybywgaXQgbWVhbnMgYWx3YXlzIG5vdCBiZSB0aW1lb3V0LgotCS8vIHVwZGF0ZSBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQlmb3IgKGk9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlpZiAoYlNUQUtleUZyYW1lKQotCQkJewotCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5OwotCi0JCQkJLy8gU1RBS2V5IGZyYW1lLCBhZGQgcGFpcndpc2Uga2V5IHRhYmxlCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCQkJCS8vUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7Ci0JCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCi0JCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOwotCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAotCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7Ci0JCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJCUFzaWNBZGRQYWlyd2lzZUtleUVudHJ5KHBBZCwKLQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyLAotCQkJCQkJCQkJCShVQ0hBUilwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNUYWJNYXRjaFdDSUQsCi0JCQkJCQkJCQkJJlBhaXJ3aXNlS2V5KTsKLQotCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkJCQkgIDAsCi0JCQkJCQkJCQkJICBQYWlyd2lzZUtleS5DaXBoZXJBbGcsCi0JCQkJCQkJCQkJICBwRW50cnkpOwotCi0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJTmRpc01vdmVNZW1vcnkoJnBFbnRyeS0+UGFpcndpc2VLZXksICZQYWlyd2lzZUtleSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJlY2VpdmUgU1RBS2V5IE1lc3NhZ2UtMSAoUGVlciBTVEEgTUFDIEFkZHJlc3MgU1RBS2V5KSBcbiIpKTsKLQotCQkJCVJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIEZpbmlzaCBTVEFLZXkgaGFuZHNoYWtlIHByb2NlZHVyZSAoSW5pdGlhdG9yIHNpZGUpXG4iKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gRGF0YSBmcmFtZSwgdXBkYXRlIHRpbWVvdXQgdmFsdWUKLQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCi0JCQkJewotCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5Db3VudERvd25UaW1lciA9IHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVPdXQ7Ci0JCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7Ci0JCQkJfQotCQkJfQotCi0JCQliRmluZEVudHJ5ID0gVFJVRTsKLQkJfQotCX0KLQotCS8vIHVwZGF0ZSBwZWVyIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgTUFDX0FERFJfRVFVQUwocEFkZHIsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlpZiAoYlNUQUtleUZyYW1lKQotCQkJewotCQkJCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQotCQkJCS8vIFNUQUtleSBmcmFtZSwgYWRkIHBhaXJ3aXNlIGtleSB0YWJsZSwgYW5kIHNlbmQgU1RBa2V5IE1zZy0yCi0JCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID0gRExTX0ZJTklTSDsKLQkJCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JCQkJUGFpcndpc2VLZXkuS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0JCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuS2V5LCAmcFNUQUtleVswXSwgTEVOX1RLSVBfRUspOwotCQkJCU5kaXNNb3ZlTWVtb3J5KFBhaXJ3aXNlS2V5LlR4TWljLCAmcFNUQUtleVsxNl0sIExFTl9US0lQX1JYTUlDSyk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoUGFpcndpc2VLZXkuUnhNaWMsICZwU1RBS2V5WzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCQkJCS8vUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGc7Ci0JCQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCQkJUGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gQ0lQSEVSX1RLSVA7Ci0JCQkJZWxzZSBpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJCQlQYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCi0JCQkJcEVudHJ5ID0gRGxzRW50cnlUYWJsZUxvb2t1cChwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIsIFRSVUUpOwotCQkJCS8vQXNpY0FkZEtleUVudHJ5KHBBZCwgKFVTSE9SVCkoaSArIDIpLCBCU1MwLCAwLCAmUGFpcndpc2VLZXksIFRSVUUsIFRSVUUpOwkvLyByZXNlcnZlIDAgZm9yIG11bHRpY2FzdCwgMSBmb3IgdW5pY2FzdAotCQkJCS8vQXNpY1VwZGF0ZVJ4V0NJRFRhYmxlKHBBZCwgKFVTSE9SVCkoaSArIDIpLCBwQWRkcik7Ci0JCQkJLy8gQWRkIFBhaXItd2lzZSBrZXkgdG8gQXNpYwotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlBc2ljQWRkUGFpcndpc2VLZXlFbnRyeShwQWQsCi0JCQkJCQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkciwKLQkJCQkJCQkJCQkoVUNIQVIpcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELAotCQkJCQkJCQkJCSZQYWlyd2lzZUtleSk7Ci0KLQkJCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCQkJICAwLAotCQkJCQkJCQkJCSAgUGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCQkJCQkJCSAgcEVudHJ5KTsKLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEVudHJ5LT5QYWlyd2lzZUtleSwgJlBhaXJ3aXNlS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gUmVjZWl2ZSBTVEFLZXkgTWVzc2FnZS0xIChJbml0aWF0b3IgU1RBIE1BQyBBZGRyZXNzIFNUQUtleSlcbiIpKTsKLQotCQkJCS8vIElmIHN1cHBvcnQgV1BBIG9yIFdQQTIsIHN0YXJ0IFNUQUtleSBoYW5kIHNoYWtlLAotCQkJCS8vIElmIGZhaWxlZCBoYW5kIHNoYWtlLCBqdXN0IHRlYXIgZG93biBwZWVyIERMUwotCQkJCWlmIChSVE1QU2VuZFNUQUtleUhhbmRTaGFrZShwQWQsIHBBZGRyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJCXsKLQkJCQkJTUxNRV9ETFNfUkVRX1NUUlVDVAlNbG1lRGxzUmVxOwotCQkJCQlVU0hPUlQJCQkJcmVhc29uID0gUkVBU09OX1FPU19DSVBIRVJfTk9UX1NVUFBPUlQ7Ci0KLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQJPSBGQUxTRTsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzCT0gRExTX05PTkU7Ci0JCQkJCURsc1Bhcm1GaWxsKHBBZCwgJk1sbWVEbHNSZXEsICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgcmVhc29uKTsKLQkJCQkJTWxtZUVucXVldWUocEFkLCBETFNfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRExTX1RFQVJfRE9XTiwgc2l6ZW9mKE1MTUVfRExTX1JFUV9TVFJVQ1QpLCAmTWxtZURsc1JlcSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiRExTIC0gRmluaXNoIFNUQUtleSBoYW5kc2hha2UgcHJvY2VkdXJlIChQZWVyIHNpZGUpXG4iKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIERhdGEgZnJhbWUsIHVwZGF0ZSB0aW1lb3V0IHZhbHVlCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJCXsKLQkJCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uQ291bnREb3duVGltZXIgPSBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0OwotCQkJCX0KLQkJCX0KLQotCQkJYkZpbmRFbnRyeSA9IFRSVUU7Ci0JCX0KLQl9Ci0KLQotCXJldHVybiBiU1RBS2V5RnJhbWU7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lCURlc2NyaXB0aW9uOgotCQlDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAkJUG9pbnRlcgl0byBhZGFwdGVyCi0KLQlSZXR1cm4gVmFsdWU6Ci0JCURMUyBlbnRyeSBpbmRleAotCi0JTm90ZToKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVAlSVE1QQ2hlY2tETFNGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTiAgUFVDSEFSICAgICAgICAgIHBEQSkKLXsKLQlJTlQgcnZhbCA9IC0xOwotCUlOVAlpOwotCi0JaWYgKCFwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkKLQkJcmV0dXJuIHJ2YWw7Ci0KLQlpZiAoIUlORlJBX09OKHBBZCkpCi0JCXJldHVybiBydmFsOwotCi0JZG97Ci0JCS8vIGNoZWNrIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCQlmb3IgKGk9MDsgaTxNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCi0JCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQlydmFsID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JCWZvciAoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCXsKLQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpICYmCi0JCQkJTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJCXsKLQkJCQlydmFsID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0gd2hpbGUgKEZBTFNFKTsKLQotCXJldHVybiBydmFsOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOICBQVUNIQVIgICAgICAgICAgcERBKQotewotCVBVQ0hBUgkJCXBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTCQlOU3RhdHVzOwotCUhFQURFUl84MDJfMTEJRGxzVGVhckRvd25IZHI7Ci0JVUxPTkcJCQlGcmFtZUxlbiA9IDA7Ci0JVVNIT1JUCQkJUmVhc29uID0gUkVBU09OX1FPU19RU1RBX0xFQVZJTkdfUUJTUzsKLQlVQ0hBUgkJCUNhdGVnb3J5ID0gQ0FURUdPUllfRExTOwotCVVDSEFSCQkJQWN0aW9uID0gQUNUSU9OX0RMU19URUFSRE9XTjsKLQlVQ0hBUgkJCWkgPSAwOwotCi0JaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SRVNFVF9JTl9QUk9HUkVTUykgfHwKLQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpKQotCQlyZXR1cm47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZW5kIERMUyBUZWFyRG93biBGcmFtZSBcbiIpKTsKLQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7ICAvL0dldCBhbiB1bnVzZWQgbm9ucGFnZWQgbWVtb3J5Ci0JaWYgKE5TdGF0dXMgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiQVNTT0MgLSBSVE1QU2VuZERMU1RlYXJEb3duRnJhbWUoKSBhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JQWN0SGVhZGVySW5pdChwQWQsICZEbHNUZWFyRG93bkhkciwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyLAkJCQkmRnJhbWVMZW4sCi0JCQkJCXNpemVvZihIRUFERVJfODAyXzExKSwJCSZEbHNUZWFyRG93bkhkciwKLQkJCQkJMSwJCQkJCQkJJkNhdGVnb3J5LAotCQkJCQkxLAkJCQkJCQkmQWN0aW9uLAotCQkJCQk2LAkJCQkJCQlwREEsCi0JCQkJCTYsCQkJCQkJCXBBZC0+Q3VycmVudEFkZHJlc3MsCi0JCQkJCTIsCQkJCQkJCSZSZWFzb24sCi0JCQkJCUVORF9PRl9BUkdTKTsKLQotCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0KLQkvLyBSZW1vdmUga2V5IGluIGxvY2FsIGRscyB0YWJsZSBlbnRyeQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKQotCQkJJiYgTUFDX0FERFJfRVFVQUwocERBLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKSkKLQkJewotCQkJTWFjVGFibGVEZWxldGVEbHNFbnRyeShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCX0KLQl9Ci0KLQkvLyBSZW1vdmUga2V5IGluIHBlZXIgZGxzIHRhYmxlIGVudHJ5Ci0JZm9yIChpPU1BWF9OVU1fT0ZfSU5JVF9ETFNfRU5UUlk7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQl7Ci0JCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpCi0JCQkmJiBNQUNfQUREUl9FUVVBTChwREEsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpKQotCQl7Ci0JCQlNYWNUYWJsZURlbGV0ZURsc0VudHJ5KHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjVGFiTWF0Y2hXQ0lELCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyKTsKLQkJfQotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNlbmQgRExTIFRlYXJEb3duIEZyYW1lIGFuZCByZW1vdmUga2V5IGluIChpPSVkKSBcbiIsIGkpKTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1ORElTX1NUQVRVUyBSVE1QU2VuZFNUQUtleVJlcXVlc3QoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcERBKQotewotCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKLQlORElTX1NUQVRVUwkJCU5TdGF0dXM7Ci0JVUxPTkcJCQkJRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVAkJUGFja2V0OwotCVVDSEFSCQkJCU1pY1sxNl07Ci0JVUNIQVIJCQkJZGlnZXN0WzgwXTsKLQlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKLQlVQ0hBUgkJCQl0ZW1wWzY0XTsKLQlVQ0hBUgkJCQlEbHNQVEtbODBdOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJETFMgLSBSVE1QU2VuZFNUQUtleVJlcXVlc3QoKSB0byAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgcERBWzBdLCBwREFbMV0sIHBEQVsyXSwgcERBWzNdLCBwREFbNF0sIHBEQVs1XSkpOwotCi0JcEFkLT5TZXF1ZW5jZSArKzsKLQlNQUtFXzgwMl8zX0hFQURFUihIZWFkZXI4MDJfMywgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q3VycmVudEFkZHJlc3MsIEVBUE9MKTsKLQotCS8vIFplcm8gbWVzc2FnZSBib2R5Ci0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIgPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUgICAgPSBFQVBPTEtleTsKLQlQYWNrZXQuQm9keV9MZW5bMV0gID0gc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUgKyA2ICsgTUFDX0FERFJfTEVOOwkJLy8gZGF0YSBmaWVsZCBjb250YWluIEtERSBhbmRQZWVyIE1BQyBhZGRyZXNzCi0KLQkvLyBTVEFLZXkgTWVzc2FnZSBpcyBhcyBFQVBPTC1LZXkoMSwxLDAsMCxHLzAsMCwwLCBNSUMsIDAsUGVlciBNQUMgS0RFKQotCWlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSkKLSAgICB7Ci0gICAgICAgIFBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotICAgIH0KLSAgICBlbHNlIGlmICgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikgfHwgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKQotICAgIHsKLSAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTJfS0VZX0RFU0M7Ci0gICAgfQotCi0JLy8gS2V5IGRlc2NyaXB0b3IgdmVyc2lvbgotCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9Ci0JCSgoKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkgfHwgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSA/IChERVNDX1RZUEVfQUVTKSA6IChERVNDX1RZUEVfVEtJUCkpOwotCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMJPSAxOwotCVBhY2tldC5LZXlEZXNjLktleUluZm8uU2VjdXJlCT0gMTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QJPSAxOwotCi0JUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOwotCi0JLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCi0JUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7Ci0JTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKLQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7Ci0JaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuIE5TdGF0dXM7Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCi0JTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOwotCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKLQlXcGFEZXJpdmVQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKLQotCS8vIGNhbGN1bGF0ZSBNSUMKLQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJTmRpc1plcm9NZW1vcnkoZGlnZXN0LAlzaXplb2YoZGlnZXN0KSk7Ci0JCUhNQUNfU0hBMShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJTmRpc1plcm9NZW1vcnkoTWljLAlzaXplb2YoTWljKSk7Ci0JCUhNQUNfTUQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljLCBNRDVfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKLQkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKLQkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlSZXF1ZXN0LSBTZW5kIFNUQUtleSByZXF1ZXN0IChOU3RhdHVzPSV4LCBGcmFtZUxlbj0lbGQpXG4iLCBOU3RhdHVzLCBGcmFtZUxlbikpOwotCi0JcmV0dXJuIE5TdGF0dXM7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotTkRJU19TVEFUVVMgUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFVDSEFSCQkJcERBKQotewotCVVDSEFSCQkJCUhlYWRlcjgwMl8zWzE0XTsKLQlORElTX1NUQVRVUwkJCU5TdGF0dXM7Ci0JVUxPTkcJCQkJRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVAkJUGFja2V0OwotCVVDSEFSCQkJCU1pY1sxNl07Ci0JVUNIQVIJCQkJZGlnZXN0WzgwXTsKLQlQVUNIQVIJCQkJcE91dEJ1ZmZlciA9IE5VTEw7Ci0JUE5ESVNfUEFDS0VUCQlwTmRpc1BhY2tldDsKLQlVQ0hBUgkJCQl0ZW1wWzY0XTsKLQlVQ0hBUgkJCQlEbHNQVEtbODBdOwkJCS8vIER1ZSB0byBkaXJ2ZXIgY2FuIG5vdCBnZXQgUFRLLCB1c2UgcHJvcHJpZXRhcnkgUFRLCi0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIkRMUyAtIFJUTVBTZW5kU1RBS2V5SGFuZFNoYWtlKCkgdG8gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIHBEQVswXSwgcERBWzFdLCBwREFbMl0sIHBEQVszXSwgcERBWzRdLCBwREFbNV0pKTsKLQotCXBBZC0+U2VxdWVuY2UgKys7Ci0JTUFLRV84MDJfM19IRUFERVIoSGVhZGVyODAyXzMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFQVBPTCk7Ci0KLQkvLyBaZXJvIG1lc3NhZ2UgYm9keQotCU5kaXNaZXJvTWVtb3J5KCZQYWNrZXQsIHNpemVvZihQYWNrZXQpKTsKLQlQYWNrZXQuUHJvVmVyID0gRUFQT0xfVkVSOwotCVBhY2tldC5Qcm9UeXBlICAgID0gRUFQT0xLZXk7Ci0JUGFja2V0LkJvZHlfTGVuWzFdICA9IHNpemVvZihLRVlfREVTQ1JJUFRFUikgLSBNQVhfTEVOX09GX1JTTklFICsgNiArIE1BQ19BRERSX0xFTjsJCS8vIGRhdGEgZmllbGQgY29udGFpbiBLREUgYW5kIFBlZXIgTUFDIGFkZHJlc3MKLQotCS8vIFNUQUtleSBNZXNzYWdlIGlzIGFzIEVBUE9MLUtleSgxLDEsMCwwLEcvMCwwLDAsIE1JQywgMCxQZWVyIE1BQyBLREUpCi0JaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8IChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKQotICAgIHsKLSAgICAgICAgUGFja2V0LktleURlc2MuVHlwZSA9IFdQQTFfS0VZX0RFU0M7Ci0gICAgfQotICAgIGVsc2UgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fCAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykpCi0gICAgewotICAgICAgICBQYWNrZXQuS2V5RGVzYy5UeXBlID0gV1BBMl9LRVlfREVTQzsKLSAgICB9Ci0KLQkvLyBLZXkgZGVzY3JpcHRvciB2ZXJzaW9uCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0KLQkJKCgocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSB8fCAocEFkLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpID8gKERFU0NfVFlQRV9BRVMpIDogKERFU0NfVFlQRV9US0lQKSk7Ci0KLQlQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLktleU1pYwk9IDE7Ci0JUGFja2V0LktleURlc2MuS2V5SW5mby5TZWN1cmUJPSAxOwotCi0JUGFja2V0LktleURlc2MuS2V5RGF0YUxlblsxXQk9IDEyOwotCi0JLy8gdXNlIG91ciBvd24gT1VJIHRvIGRpc3Rpbmd1aXNoIHByb3ByaWV0YXJ5IHdpdGggc3RhbmRhcmQuCi0JUGFja2V0LktleURlc2MuS2V5RGF0YVswXQkJPSAweEREOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbMV0JCT0gMHgwQTsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzJdCQk9IDB4MDA7Ci0JUGFja2V0LktleURlc2MuS2V5RGF0YVszXQkJPSAweDBDOwotCVBhY2tldC5LZXlEZXNjLktleURhdGFbNF0JCT0gMHg0MzsKLQlQYWNrZXQuS2V5RGVzYy5LZXlEYXRhWzVdCQk9IDB4MDM7Ci0JTmRpc01vdmVNZW1vcnkoJlBhY2tldC5LZXlEZXNjLktleURhdGFbNl0sIHBEQSwgTUFDX0FERFJfTEVOKTsKLQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLlJlcGxheUNvdW50ZXIsIHBBZC0+U3RhQ2ZnLkRsc1JlcGxheUNvdW50ZXIsIExFTl9LRVlfREVTQ19SRVBMQVkpOwotCi0JLy8gQWxsb2NhdGUgYnVmZmVyIGZvciB0cmFuc21pdHRpbmcgbWVzc2FnZQotCU5TdGF0dXMgPSBNbG1lQWxsb2NhdGVNZW1vcnkocEFkLCAmcE91dEJ1ZmZlcik7Ci0JaWYgKE5TdGF0dXMJIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuIE5TdGF0dXM7Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAmRnJhbWVMZW4sCi0JCSAgICAgICAgICAgICAgUGFja2V0LkJvZHlfTGVuWzFdICsgNCwgICAgJlBhY2tldCwKLQkJICAgICAgICAgICAgICBFTkRfT0ZfQVJHUyk7Ci0KLQkvLyB1c2UgcHJvcHJpZXRhcnkgUFRLCi0JTmRpc1plcm9NZW1vcnkodGVtcCwgNjQpOwotCU5kaXNNb3ZlTWVtb3J5KHRlbXAsICJJRUVFODAyLjExIFdJUkVMRVNTIEFDQ0VTUyBQT0lOVCIsIDMyKTsKLQlXcGFEZXJpdmVQVEsocEFkLCB0ZW1wLCB0ZW1wLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgdGVtcCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRGxzUFRLLCBMRU5fUFRLKTsKLQotCS8vIGNhbGN1bGF0ZSBNSUMKLQlpZiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JewotCQkvLyBBRVMKLQkJTmRpc1plcm9NZW1vcnkoZGlnZXN0LAlzaXplb2YoZGlnZXN0KSk7Ci0JCUhNQUNfU0hBMShEbHNQVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsKLQkJTmRpc1plcm9NZW1vcnkoTWljLAlzaXplb2YoTWljKSk7Ci0JCUhNQUNfTUQ1KERsc1BUSywgTEVOX0VBUF9NSUNLLCBwT3V0QnVmZmVyLCBGcmFtZUxlbiwgTWljLCBNRDVfRElHRVNUX1NJWkUpOwotCQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5LZXlNaWMsIE1pYywgTEVOX0tFWV9ERVNDX01JQyk7Ci0JfQotCi0JTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICZGcmFtZUxlbiwKLQkgICAgICAgICAgICAgICAgICBzaXplb2YoSGVhZGVyODAyXzMpLAlIZWFkZXI4MDJfMywKLQkJICAgICAgICAgICAgICBQYWNrZXQuQm9keV9MZW5bMV0gKyA0LAkmUGFja2V0LAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCU5TdGF0dXMgPSBSVE1QQWxsb2NhdGVOZGlzUGFja2V0KHBBZCwgJnBOZGlzUGFja2V0LCBOVUxMLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JaWYgKE5TdGF0dXMgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBOZGlzUGFja2V0LCBCU1NJRF9XQ0lEKTsKLQkJU1RBU2VuZFBhY2tldChwQWQsIHBOZGlzUGFja2V0KTsKLQkJUlRNUERlUXVldWVQYWNrZXQocEFkLCBGQUxTRSwgTlVNX09GX1RYX1JJTkcsIE1BWF9UWF9QUk9DRVNTKTsKLQl9Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUFNlbmRTVEFLZXlIYW5kU2hha2UtIFNlbmQgU1RBS2V5IE1lc3NhZ2UtMiAoTlN0YXR1cz0leCwgRnJhbWVMZW49JWxkKVxuIiwgTlN0YXR1cywgRnJhbWVMZW4pKTsKLQotCXJldHVybiBOU3RhdHVzOwotfQotCi1WT0lEIERsc1RpbWVvdXRBY3Rpb24oCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCU1MTUVfRExTX1JFUV9TVFJVQ1QJCU1sbWVEbHNSZXE7Ci0JVVNIT1JUCQkJCQlyZWFzb247Ci0JUFJUXzgwMl8xMV9ETFMJCQlwRExTID0gKFBSVF84MDJfMTFfRExTKUZ1bmN0aW9uQ29udGV4dDsKLQlQUlRNUF9BREFQVEVSCQkJcEFkID0gcERMUy0+cEFkOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiRGxzVGltZW91dCAtIFRlYXIgZG93biBETFMgbGlua3MgKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KVxuIiwKLQkJcERMUy0+TWFjQWRkclswXSwgcERMUy0+TWFjQWRkclsxXSwgcERMUy0+TWFjQWRkclsyXSwgcERMUy0+TWFjQWRkclszXSwgcERMUy0+TWFjQWRkcls0XSwgcERMUy0+TWFjQWRkcls1XSkpOwotCi0JaWYgKChwRExTKSAmJiAocERMUy0+VmFsaWQpKQotCXsKLQkJcmVhc29uCQkJPSBSRUFTT05fUU9TX1JFUVVFU1RfVElNRU9VVDsKLQkJcERMUy0+VmFsaWQJCT0gRkFMU0U7Ci0JCXBETFMtPlN0YXR1cwk9IERMU19OT05FOwotCQlEbHNQYXJtRmlsbChwQWQsICZNbG1lRGxzUmVxLCBwRExTLCByZWFzb24pOwotCQlNbG1lRW5xdWV1ZShwQWQsIERMU19TVEFURV9NQUNISU5FLCBNVDJfTUxNRV9ETFNfVEVBUl9ET1dOLCBzaXplb2YoTUxNRV9ETFNfUkVRX1NUUlVDVCksICZNbG1lRGxzUmVxKTsKLQkJUlRNUF9NTE1FX0hBTkRMRVIocEFkKTsKLQl9Ci19Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1EZXNjcmlwdGlvbiA6IGJlY2F1c2UgRExTIGFuZCBDTEkgc2hhcmUgdGhlIHNhbWUgV0NJRCB0YWJsZSBpbiBBU0lDLgotTWVzaCBlbnRyeSBhbHNvIGluc2VydCB0byBwQWQtPk1hY1RhYi5jb250ZW50W10uICBTdWNoIGlzIG1hcmtlZCBhcyBWYWxpZEFzRGxzID0gVFJVRS4KLUFsc28gZmlsbHMgdGhlIHBhaXJ3aXNlIGtleS4KLUJlY2F1c2UgZnJvbnQgTUFYX0FJRF9CQSBlbnRyaWVzIGhhdmUgZGlyZWN0IG1hcHBpbmcgdG8gQkFFbnRyeSwgd2hpY2ggaXMgb25seSB1c2VkIGFzIENMSS4gU28gd2UgaW5zZXJ0IERscwotZnJvbSBpbmRleCBNQVhfQUlEX0JBLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU1BQ19UQUJMRV9FTlRSWSAqTWFjVGFibGVJbnNlcnREbHNFbnRyeSgKLQlJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLQlJTiAgUFVDSEFSCXBBZGRyLAotCUlOICBVSU5UCURsc0VudHJ5SWR4KQotewotCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5ID0gTlVMTDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+IE1hY1RhYmxlSW5zZXJ0RGxzRW50cnlcbiIpKTsKLQkvLyBpZiBGVUxMLCByZXR1cm4KLQlpZiAocEFkLT5NYWNUYWIuU2l6ZSA+PSBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkbwotCXsKLQkJaWYoKHBFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXAocEFkLCBwQWRkciwgVFJVRSkpICE9IE5VTEwpCi0JCQlicmVhazsKLQotCQkvLyBhbGxvY2F0ZSBvbmUgTUFDIGVudHJ5Ci0JCXBFbnRyeSA9IE1hY1RhYmxlSW5zZXJ0RW50cnkocEFkLCBwQWRkciwgRGxzRW50cnlJZHggKyBNSU5fTkVUX0RFVklDRV9GT1JfRExTLCBUUlVFKTsKLQkJaWYgKHBFbnRyeSkKLQkJewotCQkJcEFkLT5TdGFDZmcuRExTRW50cnlbRGxzRW50cnlJZHhdLk1hY1RhYk1hdGNoV0NJRCA9IHBFbnRyeS0+QWlkOwotCQkJcEVudHJ5LT5NYXRjaERsc0VudHJ5SWR4ID0gRGxzRW50cnlJZHg7Ci0JCQlwRW50cnktPkF1dGhNb2RlID0gcEFkLT5TdGFDZmcuQXV0aE1vZGU7Ci0JCQlwRW50cnktPldlcFN0YXR1cyA9IHBBZC0+U3RhQ2ZnLldlcFN0YXR1czsKLQkJCXBFbnRyeS0+UG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjVGFibGVJbnNlcnREbHNFbnRyeSAtIGFsbG9jYXRlIGVudHJ5ICMlZCwgVG90YWw9ICVkXG4iLHBFbnRyeS0+QWlkLCBwQWQtPk1hY1RhYi5TaXplKSk7Ci0KLQkJCS8vIElmIGxlZ2FjeSBXRVAgaXMgdXNlZCwgc2V0IHBhaXItd2lzZSBjaXBoZXJBbGcgaW50byBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBmb3IgdGhpcyBlbnRyeQotCQkJaWYgKChwRW50cnktPlZhbGlkQXNEbHMpICYmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUEVuYWJsZWQpKQotCQkJewotCQkJCVVDSEFSIEtleUlkeCA9IDA7Ci0JCQkJVUNIQVIgQ2lwaGVyQWxnID0gMDsKLQotCQkJCUtleUlkeAk9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQotCQkJCUNpcGhlckFsZwk9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnOwotCi0JCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsCi0JCQkJCQkJCQkJCUJTUzAsCi0JCQkJCQkJCQkJCXBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcsCi0JCQkJCQkJCQkJCXBFbnRyeSk7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZShGQUxTRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PSBNYWNUYWJsZUluc2VydERsc0VudHJ5XG4iKSk7Ci0KLQlyZXR1cm4gcEVudHJ5OwotfQotCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJRGVsZXRlIGFsbCBNZXNoIEVudHJ5IGluIHBBZC0+TWFjVGFiCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVTSE9SVCB3Y2lkLAotCUlOIFBVQ0hBUiBwQWRkcikKLXsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiBNYWNUYWJsZURlbGV0ZURsc0VudHJ5XG4iKSk7Ci0KLQlpZiAoIVZBTElEX1dDSUQod2NpZCkpCi0JCXJldHVybiBGQUxTRTsKLQotCU1hY1RhYmxlRGVsZXRlRW50cnkocEFkLCB3Y2lkLCBwQWRkcik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT09PSBNYWNUYWJsZURlbGV0ZURsc0VudHJ5XG4iKSk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUglwQWRkciwKLQlJTiBCT09MRUFOCWJSZXNldElkZWxDb3VudCkKLXsKLQlVTE9ORyBIYXNoSWR4OwotCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5ID0gTlVMTDsKLQotCVJUTVBfU0VNX0xPQ0soJnBBZC0+TWFjVGFiTG9jayk7Ci0JSGFzaElkeCA9IE1BQ19BRERSX0hBU0hfSU5ERVgocEFkZHIpOwotCXBFbnRyeSA9IHBBZC0+TWFjVGFiLkhhc2hbSGFzaElkeF07Ci0KLQl3aGlsZSAocEVudHJ5KQotCXsKLQkJaWYgKChwRW50cnktPlZhbGlkQXNEbHMgPT0gVFJVRSkKLQkJCSYmIE1BQ19BRERSX0VRVUFMKHBFbnRyeS0+QWRkciwgcEFkZHIpKQotCQl7Ci0JCQlpZihiUmVzZXRJZGVsQ291bnQpCi0JCQkJcEVudHJ5LT5Ob0RhdGFJZGxlQ291bnQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJcEVudHJ5ID0gcEVudHJ5LT5wTmV4dDsKLQl9Ci0KLQlSVE1QX1NFTV9VTkxPQ0soJnBBZC0+TWFjVGFiTG9jayk7Ci0JcmV0dXJuIHBFbnRyeTsKLX0KLQotTUFDX1RBQkxFX0VOVFJZICpEbHNFbnRyeVRhYmxlTG9va3VwQnlXY2lkKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFVDSEFSCXdjaWQsCi0JSU4gUFVDSEFSCXBBZGRyLAotCUlOIEJPT0xFQU4JYlJlc2V0SWRlbENvdW50KQotewotCVVMT05HIERMc0luZGV4OwotCVBNQUNfVEFCTEVfRU5UUlkgcEN1ckVudHJ5ID0gTlVMTDsKLQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9IE5VTEw7Ci0KLQlpZiAoIVZBTElEX1dDSUQod2NpZCkpCi0JCXJldHVybiBOVUxMOwotCi0JUlRNUF9TRU1fTE9DSygmcEFkLT5NYWNUYWJMb2NrKTsKLQotCWRvCi0JewotCQlwQ3VyRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFt3Y2lkXTsKLQotCQlETHNJbmRleCA9IDB4ZmY7Ci0JCWlmICgocEN1ckVudHJ5KSAmJiAocEN1ckVudHJ5LT5WYWxpZEFzRGxzPT0gVFJVRSkpCi0JCXsKLQkJCURMc0luZGV4ID0gcEN1ckVudHJ5LT5NYXRjaERsc0VudHJ5SWR4OwotCQl9Ci0KLQkJaWYgKERMc0luZGV4ID09IDB4ZmYpCi0JCQlicmVhazsKLQotCQlpZiAoTUFDX0FERFJfRVFVQUwocEN1ckVudHJ5LT5BZGRyLCBwQWRkcikpCi0JCXsKLQkJCWlmKGJSZXNldElkZWxDb3VudCkKLQkJCQlwQ3VyRW50cnktPk5vRGF0YUlkbGVDb3VudCA9IDA7Ci0JCQlwRW50cnkgPSBwQ3VyRW50cnk7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUoRkFMU0UpOwotCi0JUlRNUF9TRU1fVU5MT0NLKCZwQWQtPk1hY1RhYkxvY2spOwotCi0JcmV0dXJuIHBFbnRyeTsKLX0KLQotSU5UIFNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIFBVQ0hBUiBhcmcpCi17Ci0JSU5UIGk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lLTE5cyUtOHNcbiIsICJNQUMiLCAiVElNRU9VVFxuIikpOwotCWZvciAoaT0wOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JewotCQlpZiAoKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkKSAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQl7Ci0JCQlQTUFDX1RBQkxFX0VOVFJZIHBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY1RhYk1hdGNoV0NJRF07Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAgIiwKLQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzBdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzFdLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5NYWNBZGRyWzJdLAotCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbM10sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNF0sIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHJbNV0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLThkXG4iLCBwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5UaW1lT3V0KSk7Ci0KLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiIpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUtMTlzJS00cyUtNHMlLTRzJS00cyUtN3MlLTdzJS03cyIsIk1BQyIsICJBSUQiLCAiQlNTIiwgIlBTTSIsICJXTU0iLCAiUlNTSTAiLCAiUlNTSTEiLCAiUlNTSTIiKSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS04cyUtMTBzJS02cyUtNnMlLTZzJS02cyIsICJNSU1PUFMiLCAiUGhNZCIsICJCVyIsICJNQ1MiLCAiU0dJIiwgIlNUQkMiKSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiXG4lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAgIiwKLQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAotCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTRkIiwgKGludClwRW50cnktPkFpZCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtNGQiLCAoaW50KXBFbnRyeS0+YXBpZHgpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTRkIiwgKGludClwRW50cnktPlBzTW9kZSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtNGQiLCAoaW50KUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS03ZCIsIHBFbnRyeS0+UnNzaVNhbXBsZS5BdmdSc3NpMCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtN2QiLCBwRW50cnktPlJzc2lTYW1wbGUuQXZnUnNzaTEpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTdkIiwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS04ZCIsIChpbnQpcEVudHJ5LT5NbXBzTW9kZSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtMTBzIiwgR2V0UGh5TW9kZShwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NT0RFKSkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtNnMiLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTUNTKSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19PRkYsICgiJS02ZCIsIHBFbnRyeS0+SFRQaHlNb2RlLmZpZWxkLlNob3J0R0kpKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCIlLTZkIiwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQykpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIiUtMTBkLCAlZCwgJWQlJVxuIiwgcEVudHJ5LT5EZWJ1Z0ZJRk9Db3VudCwgcEVudHJ5LT5EZWJ1Z1R4Q291bnQsCi0JCQkJCQkocEVudHJ5LT5EZWJ1Z1R4Q291bnQpID8gKChwRW50cnktPkRlYnVnVHhDb3VudC1wRW50cnktPkRlYnVnRklGT0NvdW50KSoxMDAvcEVudHJ5LT5EZWJ1Z1R4Q291bnQpIDogMCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuIikpOwotCi0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQotSU5UCVNldF9EbHNBZGRFbnRyeV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0gICAgVUNIQVIJbWFjW01BQ19BRERSX0xFTl07Ci0JVVNIT1JUCVRpbWVvdXQ7Ci0JUFNUUklORyB0b2tlbjsKLQlTVFJJTkcgc2VwVmFsdWVbXSA9ICI6IiwgREFTSCA9ICctJzsKLQlJTlQgaTsKLSAgICBSVF84MDJfMTFfRExTCURsczsKLQotICAgIGlmKHN0cmxlbihhcmcpIDwgMTkpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNyBwbHVzIHRoZSAiLSIgYW5kIHRpbWVvdXQgdmFsdWUgaW4gZGVjaW1hbCBmb3JtYXQuCi0JCXJldHVybiBGQUxTRTsKLQotCXRva2VuID0gc3RyY2hyKGFyZywgREFTSCk7Ci0JaWYgKCh0b2tlbiAhPSBOVUxMKSAmJiAoc3RybGVuKHRva2VuKT4xKSkKLQl7Ci0JCVRpbWVvdXQgPSAoVVNIT1JUKSBzaW1wbGVfc3RydG9sKCh0b2tlbisxKSwgMCwgMTApOwotCi0JCSp0b2tlbiA9ICdcMCc7Ci0JCWZvciAoaSA9IDAsIHRva2VuID0gcnN0cnRvayhhcmcsICZzZXBWYWx1ZVswXSk7IHRva2VuOyB0b2tlbiA9IHJzdHJ0b2soTlVMTCwgJnNlcFZhbHVlWzBdKSwgaSsrKQotCQl7Ci0JCQlpZigoc3RybGVuKHRva2VuKSAhPSAyKSB8fCAoIWlzeGRpZ2l0KCp0b2tlbikpIHx8ICghaXN4ZGlnaXQoKih0b2tlbisxKSkpKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCUF0b0godG9rZW4sICgmbWFjW2ldKSwgMSk7Ci0JCX0KLQkJaWYoaSAhPSA2KQotCQkJcmV0dXJuIEZBTFNFOwotCi0JICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJcbiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LSVkIiwgbWFjWzBdLCBtYWNbMV0sCi0JICAgICAgICAgICBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0sIChpbnQpVGltZW91dCkpOwotCi0JCU5kaXNaZXJvTWVtb3J5KCZEbHMsIHNpemVvZihSVF84MDJfMTFfRExTKSk7Ci0JCURscy5UaW1lT3V0ID0gVGltZW91dDsKLQkJQ09QWV9NQUNfQUREUihEbHMuTWFjQWRkciwgbWFjKTsKLQkJRGxzLlZhbGlkID0gMTsKLQotCQlNbG1lRW5xdWV1ZShwQWQsCi0JCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCi0JCQkJCXNpemVvZihSVF84MDJfMTFfRExTKSwKLQkJCQkJJkRscyk7Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotCi19Ci0KLUlOVAlTZXRfRGxzVGVhckRvd25FbnRyeV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0JVUNIQVIJCQltYWNBZGRyW01BQ19BRERSX0xFTl07Ci0JUFNUUklORwkJCXZhbHVlOwotCUlOVAkJCQlpOwotCVJUXzgwMl8xMV9ETFMJRGxzOwotCi0JaWYoc3RybGVuKGFyZykgIT0gMTcpICAvL01hYyBhZGRyZXNzIGFjY2VwdGFibGUgZm9ybWF0IDAxOjAyOjAzOjA0OjA1OjA2IGxlbmd0aCAxNwotCQlyZXR1cm4gRkFMU0U7Ci0KLQlmb3IgKGk9MCwgdmFsdWUgPSByc3RydG9rKGFyZywiOiIpOyB2YWx1ZTsgdmFsdWUgPSByc3RydG9rKE5VTEwsIjoiKSkKLQl7Ci0JCWlmKChzdHJsZW4odmFsdWUpICE9IDIpIHx8ICghaXN4ZGlnaXQoKnZhbHVlKSkgfHwgKCFpc3hkaWdpdCgqKHZhbHVlKzEpKSkgKQotCQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkCi0KLQkJQXRvSCh2YWx1ZSwgJm1hY0FkZHJbaSsrXSwgMik7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlxuJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLCBtYWNBZGRyWzBdLCBtYWNBZGRyWzFdLAotCSAgICAgICAgICAgbWFjQWRkclsyXSwgbWFjQWRkclszXSwgbWFjQWRkcls0XSwgbWFjQWRkcls1XSkpOwotCi0JTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKLQlDT1BZX01BQ19BRERSKERscy5NYWNBZGRyLCBtYWNBZGRyKTsKLQlEbHMuVmFsaWQgPSAwOwotCi0JTWxtZUVucXVldWUocEFkLAotCQkJCU1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotCQkJCVJUX09JRF84MDJfMTFfU0VUX0RMU19QQVJBTSwKLQkJCQlzaXplb2YoUlRfODAyXzExX0RMUyksCi0JCQkJJkRscyk7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfY2tpcG1pYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvcnRtcF9ja2lwbWljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNmRiZDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvcnRtcF9ja2lwbWljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzkgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQlydG1wX2NraXBtaWMuYwotCi0JQWJzdHJhY3Q6Ci0JRGF0YSBwYXRoIHN1YnJvdXRpbmVzCi0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0jaW5jbHVkZSAiLi4vcnRtcF9ja2lwbWljLmgiCi0KLQotI2RlZmluZSBNSUNfQUNDVU0odikgICAgICAgICAgICBwQ29udGV4dC0+YWNjdW0gKz0gKFVMT05HTE9ORyl2ICogUlRNUE1pY0dldENvZWZmaWNpZW50KHBDb250ZXh0KQotI2RlZmluZSBHQihwLGkscykgICAgICAgICAgICAgICAoICgoVUxPTkcpICooKFVDSEFSKikocCkraSkgKSA8PCAocykgKQotI2RlZmluZSBHRVRCSUczMihwKSAgICAgICAgICAgICBHQihwLDAsMjQpfEdCKHAsMSwxNil8R0IocCwyLDgpfEdCKHAsMywwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVDSEFSIFNib3hUYWJsZVsyNTZdID0KLXsKLSAgICAweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAotICAgIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCi0gICAgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKLSAgICAweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAotICAgIDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCi0gICAgMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKLSAgICAweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAotICAgIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCi0gICAgMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKLSAgICAweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAotICAgIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCi0gICAgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKLSAgICAweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAotICAgIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCi0gICAgMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKLSAgICAweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAotICAgIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCi0gICAgMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKLSAgICAweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAotICAgIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCi0gICAgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKLSAgICAweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAotICAgIDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCi0gICAgMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKLSAgICAweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAotICAgIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCi0gICAgMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKLSAgICAweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAotICAgIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCi0gICAgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKLSAgICAweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAotICAgIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKLX07Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PSBDS0lQIEtFWSBQRVJNVVRBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogMi1ieXRlIGJ5IDItYnl0ZSBzdWJzZXQgb2YgdGhlIGZ1bGwgQUVTIHRhYmxlICovCi1zdGF0aWMgY29uc3QgVVNIT1JUIFNib3hbMjU2XSA9Ci17Ci0gICAgMHhDNkE1LDB4Rjg4NCwweEVFOTksMHhGNjhELDB4RkYwRCwweEQ2QkQsMHhERUIxLDB4OTE1NCwKLSAgICAweDYwNTAsMHgwMjAzLDB4Q0VBOSwweDU2N0QsMHhFNzE5LDB4QjU2MiwweDRERTYsMHhFQzlBLAotICAgIDB4OEY0NSwweDFGOUQsMHg4OTQwLDB4RkE4NywweEVGMTUsMHhCMkVCLDB4OEVDOSwweEZCMEIsCi0gICAgMHg0MUVDLDB4QjM2NywweDVGRkQsMHg0NUVBLDB4MjNCRiwweDUzRjcsMHhFNDk2LDB4OUI1QiwKLSAgICAweDc1QzIsMHhFMTFDLDB4M0RBRSwweDRDNkEsMHg2QzVBLDB4N0U0MSwweEY1MDIsMHg4MzRGLAotICAgIDB4Njg1QywweDUxRjQsMHhEMTM0LDB4RjkwOCwweEUyOTMsMHhBQjczLDB4NjI1MywweDJBM0YsCi0gICAgMHgwODBDLDB4OTU1MiwweDQ2NjUsMHg5RDVFLDB4MzAyOCwweDM3QTEsMHgwQTBGLDB4MkZCNSwKLSAgICAweDBFMDksMHgyNDM2LDB4MUI5QiwweERGM0QsMHhDRDI2LDB4NEU2OSwweDdGQ0QsMHhFQTlGLAotICAgIDB4MTIxQiwweDFEOUUsMHg1ODc0LDB4MzQyRSwweDM2MkQsMHhEQ0IyLDB4QjRFRSwweDVCRkIsCi0gICAgMHhBNEY2LDB4NzY0RCwweEI3NjEsMHg3RENFLDB4NTI3QiwweEREM0UsMHg1RTcxLDB4MTM5NywKLSAgICAweEE2RjUsMHhCOTY4LDB4MDAwMCwweEMxMkMsMHg0MDYwLDB4RTMxRiwweDc5QzgsMHhCNkVELAotICAgIDB4RDRCRSwweDhENDYsMHg2N0Q5LDB4NzI0QiwweDk0REUsMHg5OEQ0LDB4QjBFOCwweDg1NEEsCi0gICAgMHhCQjZCLDB4QzUyQSwweDRGRTUsMHhFRDE2LDB4ODZDNSwweDlBRDcsMHg2NjU1LDB4MTE5NCwKLSAgICAweDhBQ0YsMHhFOTEwLDB4MDQwNiwweEZFODEsMHhBMEYwLDB4Nzg0NCwweDI1QkEsMHg0QkUzLAotICAgIDB4QTJGMywweDVERkUsMHg4MEMwLDB4MDU4QSwweDNGQUQsMHgyMUJDLDB4NzA0OCwweEYxMDQsCi0gICAgMHg2M0RGLDB4NzdDMSwweEFGNzUsMHg0MjYzLDB4MjAzMCwweEU1MUEsMHhGRDBFLDB4QkY2RCwKLSAgICAweDgxNEMsMHgxODE0LDB4MjYzNSwweEMzMkYsMHhCRUUxLDB4MzVBMiwweDg4Q0MsMHgyRTM5LAotICAgIDB4OTM1NywweDU1RjIsMHhGQzgyLDB4N0E0NywweEM4QUMsMHhCQUU3LDB4MzIyQiwweEU2OTUsCi0gICAgMHhDMEEwLDB4MTk5OCwweDlFRDEsMHhBMzdGLDB4NDQ2NiwweDU0N0UsMHgzQkFCLDB4MEI4MywKLSAgICAweDhDQ0EsMHhDNzI5LDB4NkJEMywweDI4M0MsMHhBNzc5LDB4QkNFMiwweDE2MUQsMHhBRDc2LAotICAgIDB4REIzQiwweDY0NTYsMHg3NDRFLDB4MTQxRSwweDkyREIsMHgwQzBBLDB4NDg2QywweEI4RTQsCi0gICAgMHg5RjVELDB4QkQ2RSwweDQzRUYsMHhDNEE2LDB4MzlBOCwweDMxQTQsMHhEMzM3LDB4RjI4QiwKLSAgICAweEQ1MzIsMHg4QjQzLDB4NkU1OSwweERBQjcsMHgwMThDLDB4QjE2NCwweDlDRDIsMHg0OUUwLAotICAgIDB4RDhCNCwweEFDRkEsMHhGMzA3LDB4Q0YyNSwweENBQUYsMHhGNDhFLDB4NDdFOSwweDEwMTgsCi0gICAgMHg2RkQ1LDB4RjA4OCwweDRBNkYsMHg1QzcyLDB4MzgyNCwweDU3RjEsMHg3M0M3LDB4OTc1MSwKLSAgICAweENCMjMsMHhBMTdDLDB4RTg5QywweDNFMjEsMHg5NkRELDB4NjFEQywweDBEODYsMHgwRjg1LAotICAgIDB4RTA5MCwweDdDNDIsMHg3MUM0LDB4Q0NBQSwweDkwRDgsMHgwNjA1LDB4RjcwMSwweDFDMTIsCi0gICAgMHhDMkEzLDB4NkE1RiwweEFFRjksMHg2OUQwLDB4MTc5MSwweDk5NTgsMHgzQTI3LDB4MjdCOSwKLSAgICAweEQ5MzgsMHhFQjEzLDB4MkJCMywweDIyMzMsMHhEMkJCLDB4QTk3MCwweDA3ODksMHgzM0E3LAotICAgIDB4MkRCNiwweDNDMjIsMHgxNTkyLDB4QzkyMCwweDg3NDksMHhBQUZGLDB4NTA3OCwweEE1N0EsCi0gICAgMHgwMzhGLDB4NTlGOCwweDA5ODAsMHgxQTE3LDB4NjVEQSwweEQ3MzEsMHg4NEM2LDB4RDBCOCwKLSAgICAweDgyQzMsMHgyOUIwLDB4NUE3NywweDFFMTEsMHg3QkNCLDB4QThGQywweDZERDYsMHgyQzNBCi0gICAgfTsKLQotI2RlZmluZSBMbzgodjE2KSAgICAgKCh2MTYpICAgICAgICYgMHhGRikKLSNkZWZpbmUgSGk4KHYxNikgICAgKCgodjE2KSA+PiA4KSAmIDB4RkYpCi0jZGVmaW5lIHUxNlN3YXAoaSkgICggKCgoaSkgPj4gOCkgJiAweEZGKSB8ICgoKGkpIDw8IDgpICYgMHhGRjAwKSApCi0jZGVmaW5lIF9TXyhpKSAgICAgIChTYm94W0xvOChpKV0gXiB1MTZTd2FwKFNib3hbSGk4KGkpXSkpCi0KLSNkZWZpbmUgcm90TGVmdF8xKHgpICgoKCh4KSA8PCAxKSB8ICgoeCkgPj4gMTUpKSAmIDB4RkZGRikKLVZPSUQgQ0tJUF9rZXlfcGVybXV0ZQotICAgICgKLSAgICAgT1VUIFVDSEFSICAqUEssICAgICAgICAgICAvKiBvdXRwdXQgcGVybXV0ZWQga2V5ICovCi0gICAgIElOIFVDSEFSICpDSywgICAgICAgICAgIC8qIGlucHV0IENLSVAga2V5ICovCi0gICAgIElOIFVDSEFSICB0b0RzRnJvbURzLCAgICAvKiBpbnB1dCB0b0RzL0Zyb21EcyBiaXRzICovCi0gICAgIElOIFVDSEFSICpwaXYgICAgICAgICAgIC8qIGlucHV0IHBvaW50ZXIgdG8gSVYgKi8KLSAgICAgKQotewotICAgIGludCBpOwotICAgIFVTSE9SVCBIWzJdLCB0bXA7ICAgICAgICAgIC8qIEg9MzItYml0cyBvZiBwZXItcGFja2V0IGhhc2ggdmFsdWUgKi8KLSAgICBVU0hPUlQgTFs4XSwgUls4XTsgICAgICAgICAvKiBMPXUxNiBhcnJheSBvZiBDSywgUj11MTYgYXJyYXkgb2YgUEsgKi8KLQotICAgIC8qIGJ1aWxkIEwgZnJvbSBpbnB1dCBrZXkgKi8KLSAgICBtZW1zZXQoTCwgMCwgc2l6ZW9mKEwpKTsKLSAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKSB7Ci0gICAgICAgIExbaT4+MV0gfD0gKCAoKFVTSE9SVCkoQ0tbaV0pKSA8PCAoIGkgJiAxID8gOCA6IDApICk7Ci0gICAgfQotCi0gICAgSFswXSA9ICgoKFVTSE9SVClwaXZbMF0pIDw8IDgpICsgcGl2WzFdOwotICAgIEhbMV0gPSAoICgoVVNIT1JUKXRvRHNGcm9tRHMpIDw8IDgpIHwgcGl2WzJdOwotCi0gICAgZm9yIChpPTA7IGk8ODsgaSsrKSB7Ci0gICAgICAgIEhbMF0gXj0gTFtpXTsgICAgICAgICAgIC8qIDE2LWJpdHMgb2Yga2V5IG1hdGVyaWFsICovCi0gICAgICAgIHRtcCAgID0gX1NfKEhbMF0pOyAgICAgIC8qIDE2eDE2IHBlcm11dGF0aW9uICovCi0gICAgICAgIEhbMF0gID0gdG1wIF4gSFsxXTsgICAgIC8qIHNldCB1cCBmb3IgbmV4dCByb3VuZCAqLwotICAgICAgICBIWzFdICA9IHRtcDsKLSAgICAgICAgUltpXSAgPSBIWzBdOyAgICAgICAgICAgLyogc3RvcmUgaW50byBrZXkgYXJyYXkgICovCi0gICAgfQotCi0gICAgLyogc3dlZXAgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiAqLwotICAgIHRtcD1MWzBdOwotICAgIGZvciAoaT03OyBpPjA7IGktLSkgewotICAgICAgICBSW2ldID0gdG1wID0gcm90TGVmdF8xKHRtcCkgKyBSW2ldOwotICAgIH0KLQotICAgIC8qIElWIG9mIHRoZSBwZXJtdXRlZCBrZXkgaXMgdW5jaGFuZ2VkICovCi0gICAgUEtbMF0gPSBwaXZbMF07Ci0gICAgUEtbMV0gPSBwaXZbMV07Ci0gICAgUEtbMl0gPSBwaXZbMl07Ci0KLSAgICAvKiBrZXkgcG9ydGlvbiBvZiB0aGUgcGVybXV0ZWQga2V5IGlzIGNoYW5nZWQgKi8KLSAgICBmb3IgKGk9MzsgaTwxNjsgaSsrKSB7Ci0gICAgICAgIFBLW2ldID0gKFVDSEFSKSAoUltpPj4xXSA+PiAoaSAmIDEgPyA4IDogMCkpOwotICAgIH0KLX0KLQotLyogcHJlcGFyZSBmb3IgY2FsY3VsYXRpb24gb2YgYSBuZXcgbWljICovCi1WT0lEIFJUTVBDa2lwTWljSW5pdCgKLSAgICBJTiAgUE1JQ19DT05URVhUICAgICAgICBwQ29udGV4dCwKLSAgICBJTiAgUFVDSEFSICAgICAgICAgICAgICBDSykKLXsKLSAgICAvKiBwcmVwYXJlIGZvciBuZXcgbWljIGNhbGN1bGF0aW9uICovCi0gICAgTmRpc01vdmVNZW1vcnkocENvbnRleHQtPkNLLCBDSywgc2l6ZW9mKHBDb250ZXh0LT5DSykpOwotICAgIHBDb250ZXh0LT5hY2N1bSA9IDA7Ci0gICAgcENvbnRleHQtPnBvc2l0aW9uID0gMDsKLX0KLQotLyogYWRkIHNvbWUgYnl0ZXMgdG8gdGhlIG1pYyBjYWxjdWxhdGlvbiAqLwotVk9JRCBSVE1QTWljVXBkYXRlKAotICAgIElOICBQTUlDX0NPTlRFWFQgICAgICAgIHBDb250ZXh0LAotICAgIElOICBQVUNIQVIgICAgICAgICAgICAgIHBPY3RldHMsCi0gICAgSU4gIElOVCAgICAgICAgICAgICAgICAgbGVuKQotewotICAgIElOVCAgICAgYnl0ZV9wb3NpdGlvbjsKLSAgICBVTE9ORyAgIHZhbDsKLQotICAgIGJ5dGVfcG9zaXRpb24gPSAocENvbnRleHQtPnBvc2l0aW9uICYgMyk7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgLyogYnVpbGQgYSAzMi1iaXQgd29yZCBmb3IgTUlDIG11bHRpcGx5IGFjY3VtdWxhdGUgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0gICAgICAgICAgICBwQ29udGV4dC0+cGFydFtieXRlX3Bvc2l0aW9uKytdID0gKnBPY3RldHMrKzsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wb3NpdGlvbisrOwotICAgICAgICAgICAgbGVuLS07Ci0gICAgICAgIH0gd2hpbGUgKGJ5dGVfcG9zaXRpb24gPCA0KTsKLSAgICAgICAgLyogaGF2ZSBhIGZ1bGwgMzItYml0IHdvcmQgdG8gcHJvY2VzcyAqLwotICAgICAgICB2YWwgPSBHRVRCSUczMigmcENvbnRleHQtPnBhcnRbMF0pOwotICAgICAgICBNSUNfQUNDVU0odmFsKTsKLSAgICAgICAgYnl0ZV9wb3NpdGlvbiA9IDA7Ci0gICAgfQotfQotCi1VTE9ORyBSVE1QTWljR2V0Q29lZmZpY2llbnQoCi0gICAgSU4gIFBNSUNfQ09OVEVYVCAgICAgICAgIHBDb250ZXh0KQotewotICAgIFVDSEFSICAgYWVzX2NvdW50ZXJbMTZdOwotICAgIElOVCAgICAgY29lZmZfcG9zaXRpb247Ci0gICAgVUNIQVIgICAqcDsKLQotICAgIGNvZWZmX3Bvc2l0aW9uID0gKHBDb250ZXh0LT5wb3NpdGlvbiAtIDEpID4+IDI7Ci0gICAgaWYgKCAoY29lZmZfcG9zaXRpb24gJiAzKSA9PSAwKSB7Ci0gICAgICAgIC8qIGZldGNoaW5nIHRoZSBmaXJzdCBjb2VmZmljaWVudCAtLSBnZXQgbmV3IDE2LWJ5dGUgYWVzIGNvdW50ZXIgb3V0cHV0ICovCi0gICAgICAgIHUzMiBjb3VudGVyID0gKGNvZWZmX3Bvc2l0aW9uID4+IDIpOwotCi0gICAgICAgIC8qIG5ldyBjb3VudGVyIHZhbHVlICovCi0gICAgICAgIG1lbXNldCgmYWVzX2NvdW50ZXJbMF0sIDAsIHNpemVvZihhZXNfY291bnRlcikpOwotICAgICAgICBhZXNfY291bnRlclsxNV0gPSAoVUlOVDgpKGNvdW50ZXIgPj4gMCk7Ci0gICAgICAgIGFlc19jb3VudGVyWzE0XSA9IChVSU5UOCkoY291bnRlciA+PiA4KTsKLSAgICAgICAgYWVzX2NvdW50ZXJbMTNdID0gKFVJTlQ4KShjb3VudGVyID4+IDE2KTsKLSAgICAgICAgYWVzX2NvdW50ZXJbMTJdID0gKFVJTlQ4KShjb3VudGVyID4+IDI0KTsKLQotICAgICAgICBSVE1QQWVzRW5jcnlwdCgmcENvbnRleHQtPkNLWzBdLCAmYWVzX2NvdW50ZXJbMF0sIHBDb250ZXh0LT5jb2VmZmljaWVudCk7Ci0gICAgfQotICAgIHAgPSAmKHBDb250ZXh0LT5jb2VmZmljaWVudFsgKGNvZWZmX3Bvc2l0aW9uICYgMykgPDwgMiBdKTsKLSAgICByZXR1cm4gR0VUQklHMzIocCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYWVzMTI4azEyOGQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQZXJmb3JtcyBhIDEyOCBiaXQgQUVTIGVuY3J5cHQgd2l0aCAgKi8KLS8qIDEyOCBiaXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1WT0lEIHhvcl8xMjgoCi0gICAgSU4gIFBVQ0hBUiAgYSwKLSAgICBJTiAgUFVDSEFSICBiLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBJTlQgaTsKLQotICAgIGZvciAoaT0wO2k8MTY7IGkrKykKLSAgICB7Ci0gICAgICAgIG91dFtpXSA9IGFbaV0gXiBiW2ldOwotICAgIH0KLX0KLQotVUNIQVIgUlRNUENraXBTYm94KAotICAgIElOICBVQ0hBUiAgIGEpCi17Ci0gICAgcmV0dXJuIFNib3hUYWJsZVsoaW50KWFdOwotfQotCi1WT0lEIHhvcl8zMigKLSAgICBJTiAgUFVDSEFSICBhLAotICAgIElOICBQVUNIQVIgIGIsCi0gICAgT1VUIFBVQ0hBUiAgb3V0KQotewotICAgIElOVCBpOwotCi0gICAgZm9yIChpPTA7aTw0OyBpKyspCi0gICAgewotICAgICAgICBvdXRbaV0gPSBhW2ldIF4gYltpXTsKLSAgICB9Ci19Ci0KLVZPSUQgbmV4dF9rZXkoCi0gICAgSU4gIFBVQ0hBUiAga2V5LAotICAgIElOICBJTlQgICAgIHJvdW5kKQotewotICAgIFVDSEFSICAgICAgIHJjb247Ci0gICAgVUNIQVIgICAgICAgc2JveF9rZXlbNF07Ci0gICAgVUNIQVIgICAgICAgcmNvbl90YWJsZVsxMl0gPQotICAgIHsKLSAgICAgICAgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKLSAgICAgICAgMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgotICAgIH07Ci0KLSAgICBzYm94X2tleVswXSA9IFJUTVBDa2lwU2JveChrZXlbMTNdKTsKLSAgICBzYm94X2tleVsxXSA9IFJUTVBDa2lwU2JveChrZXlbMTRdKTsKLSAgICBzYm94X2tleVsyXSA9IFJUTVBDa2lwU2JveChrZXlbMTVdKTsKLSAgICBzYm94X2tleVszXSA9IFJUTVBDa2lwU2JveChrZXlbMTJdKTsKLQotICAgIHJjb24gPSByY29uX3RhYmxlW3JvdW5kXTsKLQotICAgIHhvcl8zMigma2V5WzBdLCBzYm94X2tleSwgJmtleVswXSk7Ci0gICAga2V5WzBdID0ga2V5WzBdIF4gcmNvbjsKLQotICAgIHhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKLSAgICB4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7Ci0gICAgeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Ci19Ci0KLVZPSUQgYnl0ZV9zdWIoCi0gICAgSU4gIFBVQ0hBUiAgaW4sCi0gICAgT1VUIFBVQ0hBUiAgb3V0KQotewotICAgIElOVCBpOwotCi0gICAgZm9yIChpPTA7IGk8IDE2OyBpKyspCi0gICAgewotICAgICAgICBvdXRbaV0gPSBSVE1QQ2tpcFNib3goaW5baV0pOwotICAgIH0KLX0KLQotVk9JRCBzaGlmdF9yb3coCi0gICAgSU4gIFBVQ0hBUiAgaW4sCi0gICAgT1VUIFBVQ0hBUiAgb3V0KQotewotICAgIG91dFswXSA9ICBpblswXTsKLSAgICBvdXRbMV0gPSAgaW5bNV07Ci0gICAgb3V0WzJdID0gIGluWzEwXTsKLSAgICBvdXRbM10gPSAgaW5bMTVdOwotICAgIG91dFs0XSA9ICBpbls0XTsKLSAgICBvdXRbNV0gPSAgaW5bOV07Ci0gICAgb3V0WzZdID0gIGluWzE0XTsKLSAgICBvdXRbN10gPSAgaW5bM107Ci0gICAgb3V0WzhdID0gIGluWzhdOwotICAgIG91dFs5XSA9ICBpblsxM107Ci0gICAgb3V0WzEwXSA9IGluWzJdOwotICAgIG91dFsxMV0gPSBpbls3XTsKLSAgICBvdXRbMTJdID0gaW5bMTJdOwotICAgIG91dFsxM10gPSBpblsxXTsKLSAgICBvdXRbMTRdID0gaW5bNl07Ci0gICAgb3V0WzE1XSA9IGluWzExXTsKLX0KLQotVk9JRCBtaXhfY29sdW1uKAotICAgIElOICBQVUNIQVIgIGluLAotICAgIE9VVCBQVUNIQVIgIG91dCkKLXsKLSAgICBJTlQgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgIGFkZDFiWzRdOwotICAgIFVDSEFSICAgICAgIGFkZDFiZjdbNF07Ci0gICAgVUNIQVIgICAgICAgcm90bFs0XTsKLSAgICBVQ0hBUiAgICAgICBzd2FwX2hhbGZzWzRdOwotICAgIFVDSEFSICAgICAgIGFuZGY3WzRdOwotICAgIFVDSEFSICAgICAgIHJvdHJbNF07Ci0gICAgVUNIQVIgICAgICAgdGVtcFs0XTsKLSAgICBVQ0hBUiAgICAgICB0ZW1wYls0XTsKLQotICAgIGZvciAoaT0wIDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBpZiAoKGluW2ldICYgMHg4MCk9PSAweDgwKQotICAgICAgICAgICAgYWRkMWJbaV0gPSAweDFiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhZGQxYltpXSA9IDB4MDA7Ci0gICAgfQotCi0gICAgc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbGZzICovCi0gICAgc3dhcF9oYWxmc1sxXSA9IGluWzNdOwotICAgIHN3YXBfaGFsZnNbMl0gPSBpblswXTsKLSAgICBzd2FwX2hhbGZzWzNdID0gaW5bMV07Ci0KLSAgICByb3RsWzBdID0gaW5bM107ICAgICAgICAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KLSAgICByb3RsWzFdID0gaW5bMF07Ci0gICAgcm90bFsyXSA9IGluWzFdOwotICAgIHJvdGxbM10gPSBpblsyXTsKLQotICAgIGFuZGY3WzBdID0gaW5bMF0gJiAweDdmOwotICAgIGFuZGY3WzFdID0gaW5bMV0gJiAweDdmOwotICAgIGFuZGY3WzJdID0gaW5bMl0gJiAweDdmOwotICAgIGFuZGY3WzNdID0gaW5bM10gJiAweDdmOwotCi0gICAgZm9yIChpID0gMzsgaT4wOyBpLS0pICAgIC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwotICAgIHsKLSAgICAgICAgYW5kZjdbaV0gPSBhbmRmN1tpXSA8PCAxOwotICAgICAgICBpZiAoKGFuZGY3W2ktMV0gJiAweDgwKSA9PSAweDgwKQotICAgICAgICB7Ci0gICAgICAgICAgICBhbmRmN1tpXSA9IChhbmRmN1tpXSB8IDB4MDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKLSAgICBhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKLQotICAgIHhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOwotCi0gICAgeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKLQotICAgIHRlbXBbMF0gPSByb3RyWzBdOyAgICAgICAgIC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLSAgICByb3RyWzBdID0gcm90clsxXTsKLSAgICByb3RyWzFdID0gcm90clsyXTsKLSAgICByb3RyWzJdID0gcm90clszXTsKLSAgICByb3RyWzNdID0gdGVtcFswXTsKLQotICAgIHhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLSAgICB4b3JfMzIoc3dhcF9oYWxmcywgcm90bCx0ZW1wYik7Ci0gICAgeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwotfQotCi1WT0lEIFJUTVBBZXNFbmNyeXB0KAotICAgIElOICBQVUNIQVIgIGtleSwKLSAgICBJTiAgUFVDSEFSICBkYXRhLAotICAgIElOICBQVUNIQVIgIGNpcGhlcnRleHQpCi17Ci0gICAgSU5UICAgICAgICAgICAgIHJvdW5kOwotICAgIElOVCAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICBpbnRlcm1lZGlhdGVhWzE2XTsKLSAgICBVQ0hBUiAgICAgICAgICAgaW50ZXJtZWRpYXRlYlsxNl07Ci0gICAgVUNIQVIgICAgICAgICAgIHJvdW5kX2tleVsxNl07Ci0KLSAgICBmb3IoaT0wOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKLQotICAgIGZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKQotICAgIHsKLSAgICAgICAgaWYgKHJvdW5kID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKLSAgICAgICAgICAgIG5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJvdW5kID09IDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLSAgICAgICAgICAgIHNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLSAgICAgICAgICAgIHhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgIC8qIDEgLSA5ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotICAgICAgICAgICAgc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotICAgICAgICAgICAgbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOwotICAgICAgICAgICAgbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOwotICAgICAgICAgICAgbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOwotICAgICAgICAgICAgbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7Ci0gICAgICAgICAgICB4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0gICAgICAgICAgICBuZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0vKiBjYWxjdWxhdGUgdGhlIG1pYyAqLwotVk9JRCBSVE1QTWljRmluYWwoCi0gICAgSU4gIFBNSUNfQ09OVEVYVCAgICBwQ29udGV4dCwKLSAgICBPVVQgVUNIQVIgICAgICAgICAgIGRpZ2VzdFs0XSkKLXsKLSAgICBJTlQgICAgICAgICAgICAgYnl0ZV9wb3NpdGlvbjsKLSAgICBVTE9ORyAgICAgICAgICAgdmFsOwotICAgIFVMT05HTE9ORyAgICAgICBzdW0sIHV0bXA7Ci0gICAgTE9OR0xPTkcgICAgICAgIHN0bXA7Ci0KLSAgICAvKiBkZWFsIHdpdGggcGFydGlhbCAzMi1iaXQgd29yZCBsZWZ0IG92ZXIgZnJvbSBsYXN0IHVwZGF0ZSAqLwotICAgIGlmICggKGJ5dGVfcG9zaXRpb24gPSAocENvbnRleHQtPnBvc2l0aW9uICYgMykpICE9IDApIHsKLSAgICAgICAgLyogaGF2ZSBhIHBhcnRpYWwgd29yZCBpbiBwYXJ0IHRvIGRlYWwgd2l0aCAtLSB6ZXJvIHVudXNlZCBieXRlcyAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cGFydFtieXRlX3Bvc2l0aW9uKytdID0gMDsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wb3NpdGlvbisrOwotICAgICAgICB9IHdoaWxlIChieXRlX3Bvc2l0aW9uIDwgNCk7Ci0gICAgICAgIHZhbCA9IEdFVEJJRzMyKCZwQ29udGV4dC0+cGFydFswXSk7Ci0gICAgICAgIE1JQ19BQ0NVTSh2YWwpOwotICAgIH0KLQotICAgIC8qIHJlZHVjZSB0aGUgYWNjdW11bGF0ZWQgdTY0IHRvIGEgMzItYml0IE1JQyAqLwotICAgIHN1bSA9IHBDb250ZXh0LT5hY2N1bTsKLSAgICBzdG1wID0gKHN1bSAgJiAweGZmZmZmZmZmTCkgLSAoKHN1bSA+PiAzMikgICogMTUpOwotICAgIHV0bXAgPSAoc3RtcCAmIDB4ZmZmZmZmZmZMKSAtICgoc3RtcCA+PiAzMikgKiAxNSk7Ci0gICAgc3VtID0gdXRtcCAmIDB4ZmZmZmZmZmZMOwotICAgIGlmICh1dG1wID4gMHgxMDAwMDAwMGZMKQotICAgICAgICBzdW0gLT0gMTU7Ci0KLSAgICB2YWwgPSAoVUxPTkcpc3VtOwotICAgIGRpZ2VzdFswXSA9IChVQ0hBUikoKHZhbD4+MjQpICYgMHhGRik7Ci0gICAgZGlnZXN0WzFdID0gKFVDSEFSKSAoKHZhbD4+MTYpICYgMHhGRik7Ci0gICAgZGlnZXN0WzJdID0gKFVDSEFSKSAoKHZhbD4+OCkgJiAweEZGKTsKLSAgICBkaWdlc3RbM10gPSAoVUNIQVIpKCh2YWw+PjApICYgMHhGRik7Ci19Ci0KLVZPSUQgUlRNUENraXBJbnNlcnRDTUlDKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIE9VVCBQVUNIQVIgICAgICAgICAgcE1JQywKLSAgICBJTiAgUFVDSEFSICAgICAgICAgIHA4MDIxMWhkciwKLSAgICBJTiAgUE5ESVNfUEFDS0VUICAgIHBQYWNrZXQsCi0gICAgSU4gIFBDSVBIRVJfS0VZICAgICBwS2V5LAotICAgIElOICBQVUNIQVIgICAgICAgICAgbWljX3NuYXApCi17Ci0JUEFDS0VUX0lORk8JCVBhY2tldEluZm87Ci0JUFVDSEFSCQkJcFNyY0J1ZlZBOwotCVVMT05HCQkJU3JjQnVmTGVuOwotICAgIFBVQ0hBUiAgICAgICAgICBwREEsIHBTQSwgcFByb3RvOwotICAgIFVDSEFSICAgICAgICAgICBiaWdldGhsZW5bMl07Ci0JVUNIQVIJCQlja2lwX2NrWzE2XTsKLSAgICBNSUNfQ09OVEVYVCAgICAgbWljX2N0eDsKLSAgICBVU0hPUlQgICAgICAgICAgcGF5bG9hZGxlbjsKLQlVQ0hBUgkJCWk7Ci0KLQlpZiAocEtleSA9PSBOVUxMKQotCXsKLQkJREJHUFJJTlRfRVJSKCgiUlRNUENraXBJbnNlcnRDTUlDLCBCZWZvcmUgdG8gZm9ybSB0aGUgQ0tJUCBrZXkgKENLKSwgcEtleSBjYW4ndCBiZSBOVUxMXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLSAgICBzd2l0Y2ggKCoocDgwMjExaGRyKzEpICYgMykKLSAgICB7Ci0gICAgICAgIGNhc2UgMDogLyogRnJvbURzPTAsIFRvRHM9MCAqLwotICAgICAgICAgICAgcERBID0gcDgwMjExaGRyKzQ7Ci0gICAgICAgICAgICBwU0EgPSBwODAyMTFoZHIrMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAvKiBGcm9tRHM9MCwgVG9Ecz0xICovCi0gICAgICAgICAgICBwREEgPSBwODAyMTFoZHIrMTY7Ci0gICAgICAgICAgICBwU0EgPSBwODAyMTFoZHIrMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOiAvKiBGcm9tRHM9MSwgVG9Ecz0wICovCi0gICAgICAgICAgICBwREEgPSBwODAyMTFoZHIrNDsKLSAgICAgICAgICAgIHBTQSA9IHA4MDIxMWhkcisxNjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6IC8qIEZyb21Ecz0xLCBUb0RzPTEgKi8KLSAgICAgICAgICAgIHBEQSA9IHA4MDIxMWhkcisxNjsKLSAgICAgICAgICAgIHBTQSA9IHA4MDIxMWhkcisyNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQotICAgIGlmIChTcmNCdWZMZW4gPCBMRU5HVEhfODAyXzMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHBQcm90byA9IHBTcmNCdWZWQSArIDEyOwotICAgIHBheWxvYWRsZW4gPSBQYWNrZXRJbmZvLlRvdGFsUGFja2V0TGVuZ3RoIC0gTEVOR1RIXzgwMl8zICsgMTg7IC8vIENLSVBfTExDKDgpK0NNSUMoNCkrVHhTRVEoNCkrUFJPVE8oMik9MTgKLQotICAgIGJpZ2V0aGxlblswXSA9ICh1bnNpZ25lZCBjaGFyKShwYXlsb2FkbGVuID4+IDgpOwotICAgIGJpZ2V0aGxlblsxXSA9ICh1bnNpZ25lZCBjaGFyKXBheWxvYWRsZW47Ci0KLQkvLwotCS8vIEVuY3J5cHRpb24gS2V5IGV4cGFuc2lvbiB0byBmb3JtIHRoZSBDS0lQIEtleSAoQ0tJUF9DSykuCi0JLy8KLQlpZiAocEtleS0+S2V5TGVuIDwgMTYpCi0JewotCQlmb3IoaSA9IDA7IGkgPCAoMTYgLyBwS2V5LT5LZXlMZW4pOyBpKyspCi0JCXsKLQkJCU5kaXNNb3ZlTWVtb3J5KGNraXBfY2sgKyBpICogcEtleS0+S2V5TGVuLAotCQkJCQkJCXBLZXktPktleSwKLQkJCQkJCQlwS2V5LT5LZXlMZW4pOwotCQl9Ci0JCU5kaXNNb3ZlTWVtb3J5KGNraXBfY2sgKyBpICogcEtleS0+S2V5TGVuLAotCQkJCQkJcEtleS0+S2V5LAotCQkJCQkJMTYgLSAoaSAqIHBLZXktPktleUxlbikpOwotCX0KLQllbHNlCi0JewotCQlOZGlzTW92ZU1lbW9yeShja2lwX2NrLCBwS2V5LT5LZXksIHBLZXktPktleUxlbik7Ci0JfQotICAgIFJUTVBDa2lwTWljSW5pdCgmbWljX2N0eCwgY2tpcF9jayk7Ci0gICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgcERBLCBNQUNfQUREUl9MRU4pOyAgICAgICAgICAgIC8vIE1JQyA8LS0gREEKLSAgICBSVE1QTWljVXBkYXRlKCZtaWNfY3R4LCBwU0EsIE1BQ19BRERSX0xFTik7ICAgICAgICAgICAgLy8gTUlDIDwtLSBTQQotICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIGJpZ2V0aGxlbiwgMik7ICAgICAgICAgICAgICAgICAvLyBNSUMgPC0tIHBheWxvYWQgbGVuZ3RoIHN0YXJ0aW5nIGZyb20gQ0tJUCBTTkFQCi0gICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgbWljX3NuYXAsIDgpOyAgICAgICAgICAgICAgICAgIC8vIE1JQyA8LS0gc25hcCBoZWFkZXIKLSAgICBSVE1QTWljVXBkYXRlKCZtaWNfY3R4LCBwQWQtPlN0YUNmZy5UeFNFUSwgNCk7ICAgLy8gTUlDIDwtLSBUeFNFUQotICAgIFJUTVBNaWNVcGRhdGUoJm1pY19jdHgsIHBQcm90bywgMik7ICAgICAgICAgICAgICAgICAgICAvLyBNSUMgPC0tIFByb3RvY29sCi0KLSAgICBwU3JjQnVmVkEgKz0gTEVOR1RIXzgwMl8zOwotICAgIFNyY0J1ZkxlbiAtPSBMRU5HVEhfODAyXzM7Ci0KLSAgICAvLyBNaWMgPC0tIG9yaWdpbmFsIHBheWxvYWQuIGxvb3AgdW50aWwgYWxsIHBheWxvYWQgcHJvY2Vzc2VkCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIGlmIChTcmNCdWZMZW4gPiAwKQotICAgICAgICAgICAgUlRNUE1pY1VwZGF0ZSgmbWljX2N0eCwgcFNyY0J1ZlZBLCBTcmNCdWZMZW4pOwotCi0JCU5kaXNHZXROZXh0QnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCAmUGFja2V0SW5mby5wRmlyc3RCdWZmZXIpOwotICAgICAgICBpZiAoUGFja2V0SW5mby5wRmlyc3RCdWZmZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5ESVNfUVVFUllfQlVGRkVSKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsKLSAgICB9IHdoaWxlIChUUlVFKTsKLQotICAgIFJUTVBNaWNGaW5hbCgmbWljX2N0eCwgcE1JQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgTUlDCi19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9ydG1wX2RhdGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfZGF0YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTkxMzY0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3J0bXBfZGF0YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXJ0bXBfZGF0YS5jCi0KLQlBYnN0cmFjdDoKLQlEYXRhIHBhdGggc3Vicm91dGluZXMKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQlXaGVuCQkJV2hhdAotCS0tLS0tLS0tCS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi1WT0lEIFNUQVJ4RUFQT0xGcmFtZUluZGljYXRlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQlQUlQyOFhYX1JYRF9TVFJVQwlwUnhEID0gJihwUnhCbGstPlJ4RCk7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJID0gcFJ4QmxrLT5wUnhXSTsKLQlVQ0hBUgkJCSpwVG1wQnVmOwotCi0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKLQl7Ci0JCS8vIEFsbCBFQVBvTCBmcmFtZXMgaGF2ZSB0byBwYXNzIHRvIHVwcGVyIGxheWVyIChleC4gV1BBX1NVUFBMSUNBTlQgZGFlbW9uKQotCQkvLyBUQkQgOiBwcm9jZXNzIGZyYWdtZW50ZWQgRUFQb2wgZnJhbWVzCi0JCXsKLQkJCS8vIEluIDgwMi4xeCBtb2RlLCBpZiB0aGUgcmVjZWl2ZWQgZnJhbWUgaXMgRUFQLVNVQ0NFU1MgcGFja2V0LCB0dXJuIG9uIHRoZSBQb3J0U2VjdXJlZCB2YXJpYWJsZQotCQkJaWYgKCBwQWQtPlN0YUNmZy5JRUVFODAyMVggPT0gVFJVRSAmJgotCQkJCSAoRUFQX0NPREVfU1VDQ0VTUyA9PSBXcGFDaGVja0VhcENvZGUocEFkLCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBMRU5HVEhfODAyXzFfSCkpKQotCQkJewotCQkJCVBVQ0hBUglLZXk7Ci0JCQkJVUNIQVIJQ2lwaGVyQWxnOwotCQkJCWludCAgICAgaWR4ID0gMDsKLQotCQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCJSZWNlaXZlIEVBUC1TVUNDRVNTIFBhY2tldFxuIikpOwotCQkJCS8vcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZHggPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlJZDsKLSAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uQ2lwaGVyQWxnOwotCQkJCQlLZXkgPSBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtpZHhdLktleUxlbiA+IDApCi0JCQkJewotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLQotCQkJCQkJLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLQkJCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0JCQkJCQkvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBpZHgsIENpcGhlckFsZywgTlVMTCk7Ci0KLQkJCQkJCS8vIEFzc2lnbiBwYWlyd2lzZSBrZXkgaW5mbwotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIGlkeCwgQ2lwaGVyQWxnLCBwRW50cnkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJCQkvLyBGb3IgUHJldmVudGluZyBTaGFyZEtleSBUYWJsZSBpcyBjbGVhcmVkIGJ5IHJlbW92ZSBrZXkgcHJvY2VkdXJlLgotCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID0gcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W2lkeF0uS2V5TGVuOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXksCi0JCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXksCi0JCQkJCQkJCQkgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbaWR4XS5LZXlMZW4pOwotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQllbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCXsKLQkJLy8gU3BlY2lhbCBEQVRBIGZyYW1lIHRoYXQgaGFzIHRvIHBhc3MgdG8gTUxNRQotCQkvLwkgMS4gQ2lzY28gQWlyb25ldCBmcmFtZXMgZm9yIENDWDIuIFdlIG5lZWQgcGFzcyBpdCB0byBNTE1FIGZvciBzcGVjaWFsIHByb2Nlc3MKLQkJLy8JIDIuIEVBUE9MIGhhbmRzaGFraW5nIGZyYW1lcyB3aGVuIGRyaXZlciBzdXBwbGljYW50IGVuYWJsZWQsIHBhc3MgdG8gTUxNRSBmb3Igc3BlY2lhbCBwcm9jZXNzCi0JCXsKLQkJCXBUbXBCdWYgPSBwUnhCbGstPnBEYXRhIC0gTEVOR1RIXzgwMl8xMTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBUbXBCdWYsIHBSeEJsay0+cEhlYWRlciwgTEVOR1RIXzgwMl8xMSk7Ci0JCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBUbXBCdWYsIHBSeEJsay0+RGF0YVNpemUgKyBMRU5HVEhfODAyXzExLCBwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKLQkJCURCR1BSSU5UX1JBVyhSVF9ERUJVR19UUkFDRSwgKCIhISEgcmVwb3J0IEVBUE9ML0FJUk9ORVQgREFUQSB0byBNTE1FIChsZW49JWQpICEhIVxuIiwgcFJ4QmxrLT5EYXRhU2l6ZSkpOwotCQl9Ci0JfQotCi0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQlyZXR1cm47Ci0KLX0KLQotVk9JRCBTVEFSeERhdGFGcmFtZUFubm91bmNlKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCU1BQ19UQUJMRV9FTlRSWQkqcEVudHJ5LAotCUlOCVJYX0JMSwkJCSpwUnhCbGssCi0JSU4JVUNIQVIJCQlGcm9tV2hpY2hCU1NJRCkKLXsKLQotCS8vIG5vbi1FQVAgZnJhbWUKLQlpZiAoIVJUTVBDaGVja1dQQWZyYW1lKHBBZCwgcEVudHJ5LCBwUnhCbGstPnBEYXRhLCBwUnhCbGstPkRhdGFTaXplLCBGcm9tV2hpY2hCU1NJRCkpCi0JewotCi0JCXsKLQkJCS8vIGRyb3AgYWxsIG5vbi1FQVAgREFUQSBmcmFtZSBiZWZvcmUKLQkJCS8vIHRoaXMgY2xpZW50J3MgUG9ydC1BY2Nlc3MtQ29udHJvbCBpcyBzZWN1cmVkCi0JCQlpZiAocFJ4QmxrLT5wSGVhZGVyLT5GQy5XZXApCi0JCQl7Ci0JCQkJLy8gdW5zdXBwb3J0ZWQgY2lwaGVyIHN1aXRlCi0JCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKQotCQkJCXsKLQkJCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBlbmNyeXB0aW9uIGluLXVzZSBidXQgcmVjZWl2ZSBhIG5vbi1FQVBPTCBjbGVhciB0ZXh0IGZyYW1lLCBkcm9wIGl0Ci0JCQkJaWYgKChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCkgJiYKLQkJCQkJKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRCkpCi0JCQkJewotCQkJCQkvLyByZWxlYXNlIHBhY2tldAotCQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4QmxrLT5wUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVJYX0JMS19DTEVBUl9GTEFHKHBSeEJsaywgZlJYX0VBUCk7Ci0KLQotCQlpZiAoIVJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQVJBTElOSykpCi0JCXsKLQkJCS8vIE5vcm1hbCBsZWdhY3ksIEFNUERVIG9yIEFNU0RVCi0JCQlDbW1SeG5vblJhbGlua0ZyYW1lSW5kaWNhdGUocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gQVJBTElOSwotCQkJQ21tUnhSYWxpbmtGcmFtZUluZGljYXRlKHBBZCwgcEVudHJ5LCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJfQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlSWF9CTEtfQ0xFQVJfRkxBRyhwUnhCbGssIGZSWF9ETFMpOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCX0KLQllbHNlCi0JewotCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfRUFQKTsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpICYmIChwQWQtPkNvbW1vbkNmZy5iRGlzYWJsZVJlb3JkZXJpbmcgPT0gMCkpCi0JCXsKLQkJCUluZGljYXRlX0FNUERVX1BhY2tldChwQWQsIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJewotCQkJLy8gRGV0ZXJtaW4gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBFQVAgZnJhbWUKLQkJCS8vICB0byBXUEEgc3RhdGUgbWFjaGluZSBvciB1cHBlciBsYXllcgotCQkJU1RBUnhFQVBPTEZyYW1lSW5kaWNhdGUocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQl9Ci0JfQotfQotCi0KLS8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQotQk9PTEVBTiBTVEFDaGVja1RraXBNSUNWYWx1ZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglNQUNfVEFCTEVfRU5UUlkJKnBFbnRyeSwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQotewotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JVUNIQVIJCQkqcERhdGEgPSBwUnhCbGstPnBEYXRhOwotCVVTSE9SVAkJCURhdGFTaXplID0gcFJ4QmxrLT5EYXRhU2l6ZTsKLQlVQ0hBUgkJCVVzZXJQcmlvcml0eSA9IHBSeEJsay0+VXNlclByaW9yaXR5OwotCVBDSVBIRVJfS0VZCQlwV3BhS2V5OwotCVVDSEFSCQkJKnBEQSwgKnBTQTsKLQotCXBXcGFLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcFJ4QmxrLT5wUnhXSS0+S2V5SW5kZXhdOwotCi0JcERBID0gcEhlYWRlci0+QWRkcjE7Ci0JaWYgKFJYX0JMS19URVNUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpKQotCXsKLQkJcFNBID0gcEhlYWRlci0+QWRkcjM7Ci0JfQotCWVsc2UKLQl7Ci0JCXBTQSA9IHBIZWFkZXItPkFkZHIyOwotCX0KLQotCWlmIChSVE1QVGtpcENvbXBhcmVNSUNWYWx1ZShwQWQsCi0JCQkJCQkJCXBEYXRhLAotCQkJCQkJCQlwREEsCi0JCQkJCQkJCXBTQSwKLQkJCQkJCQkJcFdwYUtleS0+UnhNaWMsCi0JCQkJCQkJCVVzZXJQcmlvcml0eSwKLQkJCQkJCQkJRGF0YVNpemUpID09IEZBTFNFKQotCXsKLQkJREJHUFJJTlRfUkFXKFJUX0RFQlVHX0VSUk9SLCgiUnggTUlDIFZhbHVlIGVycm9yIDJcbiIpKTsKLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkKLQkJewotCQkJV3BhU2VuZE1pY0ZhaWx1cmVUb1dwYVN1cHBsaWNhbnQocEFkLCAocFdwYUtleS0+VHlwZSA9PSBQQUlSV0lTRUtFWSkgPyBUUlVFIDogRkFMU0UpOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JCXsKLQkJCVJUTVBSZXBvcnRNaWNFcnJvcihwQWQsIHBXcGFLZXkpOwotCQl9Ci0KLQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeEJsay0+cFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLS8vCi0vLyBBbGwgUnggcm91dGluZXMgdXNlIFJYX0JMSyBzdHJ1Y3R1cmUgdG8gaGFuZGUgcnggZXZlbnRzCi0vLyBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0byBidWlsZCBwUnhCbGsgYXR0cmlidXRlcwotLy8gIDEuIHBIZWFkZXIgcG9pbnRlciB0byA4MDIuMTEgSGVhZGVyCi0vLyAgMi4gcERhdGEgcG9pbnRlciB0byBwYXlsb2FkIGluY2x1ZGluZyBMTEMgKGp1c3Qgc2tpcCBIZWFkZXIpCi0vLyAgMy4gc2V0IHBheWxvYWQgc2l6ZSBpbmNsdWRpbmcgTExDIHRvIERhdGFTaXplCi0vLyAgNC4gc2V0IHNvbWUgZmxhZ3Mgd2l0aCBSWF9CTEtfU0VUX0ZMQUcoKQotLy8KLVZPSUQgU1RBSGFuZGxlUnhEYXRhRnJhbWUoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUlhfQkxLCQkJKnBSeEJsaykKLXsKLQlQUlQyOFhYX1JYRF9TVFJVQwkJCQlwUnhEID0gJihwUnhCbGstPlJ4RCk7Ci0JUFJYV0lfU1RSVUMJCQkJCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0JUEhFQURFUl84MDJfMTEJCQkJCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCQkJCQlwUnhQYWNrZXQgPSBwUnhCbGstPnBSeFBhY2tldDsKLQlCT09MRUFOCQkJCQkJCWJGcmFnbWVudCA9IEZBTFNFOwotCU1BQ19UQUJMRV9FTlRSWQkJCQkqcEVudHJ5ID0gTlVMTDsKLQlVQ0hBUgkJCQkJCQlGcm9tV2hpY2hCU1NJRCA9IEJTUzA7Ci0JVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyUHJpb3JpdHkgPSAwOwotCi0JewotCQkvLyBiZWZvcmUgTElOSyBVUCwgYWxsIERBVEEgZnJhbWVzIGFyZSByZWplY3RlZAotCQlpZiAoIU9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkKLQkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJLy9pZiAoKHBIZWFkZXItPkZDLkZyRHMgPT0gMCkgJiYgKHBIZWFkZXItPkZDLlRvRHMgPT0gMCkpCi0JCWlmIChSVE1QUmN2RnJhbWVETFNDaGVjayhwQWQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsIHBSeEQpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQkvLyBEcm9wIG5vdCBteSBCU1MgZnJhbWVzCi0JCWlmIChwUnhELT5NeUJzcyA9PSAwKQotCQl7Ci0JCQl7Ci0JCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnRTaW5jZUxhc3ROVUxMKys7Ci0JCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgJiYgcEFkLT5Db21tb25DZmcuQVBFZGNhUGFybS5iQVBTRENhcGFibGUgJiYgKHBIZWFkZXItPkZDLlN1YlR5cGUgJiAweDA4KSkKLQkJewotCQkJVUNIQVIgKnBEYXRhOwotCQkJREJHUFJJTlQoUlRfREVCVUdfSU5GTywoImJBUFNEQ2FwYWJsZVxuIikpOwotCi0JCQkvLyBRb3MgYml0IDQKLQkJCXBEYXRhID0gKFBVQ0hBUilwSGVhZGVyICsgTEVOR1RIXzgwMl8xMTsKLQkJCWlmICgoKnBEYXRhID4+IDQpICYgMHgwMSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19JTkZPLCgiUnhEb25lLSBSY3YgRU9TUCBmcmFtZSwgZHJpdmVyIG1heSBmYWxsIGludG8gc2xlZXBcbiIpKTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kID0gRkFMU0U7Ci0KLQkJCQkvLyBGb3JjZSBkcml2ZXIgdG8gZmFsbCBpbnRvIHNsZWVwIG1vZGUgd2hlbiByY3YgRU9TUCBmcmFtZQotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCQl7Ci0JCQkJCVVTSE9SVCAgVGJ0dE51bVRvTmV4dFdha2VVcDsKLQkJCQkJVVNIT1JUICBOZXh0RHRpbSA9IHBBZC0+U3RhQ2ZnLkR0aW1QZXJpb2Q7Ci0JCQkJCVVMT05HICAgTm93OwotCi0JCQkJCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCQkJCU5leHREdGltIC09IChVU0hPUlQpKE5vdyAtIHBBZC0+U3RhQ2ZnLkxhc3RCZWFjb25SeFRpbWUpL3BBZC0+Q29tbW9uQ2ZnLkJlYWNvblBlcmlvZDsKLQotCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OwotCQkJCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pICYmIChUYnR0TnVtVG9OZXh0V2FrZVVwID4gTmV4dER0aW0pKQotCQkJCQkJVGJ0dE51bVRvTmV4dFdha2VVcCA9IE5leHREdGltOwotCi0JCQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLCBQV1JfU0FWRSk7Ci0JCQkJCS8vIGlmIFdNTS1BUFNEIGlzIGZhaWxlZCwgdHJ5IHRvIGRpc2FibGUgZm9sbG93aW5nIGxpbmUKLQkJCQkJQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgocEhlYWRlci0+RkMuTW9yZURhdGEpICYmIChwQWQtPkNvbW1vbkNmZy5iSW5TZXJ2aWNlUGVyaW9kKSkKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNlbmRpbmcgYW5vdGhlciB0cmlnZ2VyIGZyYW1lIHdoZW4gTW9yZSBEYXRhIGJpdCBpcyBzZXQgdG8gMVxuIikpOwotCQkJfQotCQl9Ci0KLQkJLy8gRHJvcCBOVUxMLCBDRi1BQ0sobm8gZGF0YSksIENGLVBPTEwobm8gZGF0YSksIGFuZCBDRi1BQ0srQ0YtUE9MTChubyBkYXRhKSBkYXRhIGZyYW1lCi0JCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSAmIDB4MDQpKSAvLyBiaXQgMiA6IG5vIERBVEEKLQkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkgICAgLy8gRHJvcCBub3QgbXkgQlNTIGZyYW1lICh3ZSBjYW4gbm90IG9ubHkgY2hlY2sgdGhlIE15QnNzIGJpdCBpbiBSeEQpCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JICAgIGlmICghcEFkLT5Db21tb25DZmcuYkRMU0NhcGFibGUpCi0JICAgIHsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJaWYgKElORlJBX09OKHBBZCkpCi0JCXsKLQkJCS8vIEluZnJhc3RydWN0dXJlIG1vZGUsIGNoZWNrIGFkZHJlc3MgMiBmb3IgQlNTSUQKLQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMiwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKLQkJCXsKLQkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAotCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0Ci0JICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWVsc2UJLy8gQWQtSG9jIG1vZGUgb3IgTm90IGFzc29jaWF0ZWQKLQkJewotCQkJLy8gQWQtSG9jIG1vZGUsIGNoZWNrIGFkZHJlc3MgMyBmb3IgQlNTSUQKLQkJCWlmICghUlRNUEVxdWFsTWVtb3J5KCZwSGVhZGVyLT5BZGRyMywgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCA2KSkKLQkJCXsKLQkJCQkvLyBSZWNlaXZlIGZyYW1lIG5vdCBteSBCU1NJRAotCSAgICAgICAgICAgIC8vIHJlbGVhc2UgcGFja2V0Ci0JICAgICAgICAgICAgUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JICAgIH0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQkvLwotCQkvLyBmaW5kIHBFbnRyeQotCQkvLwotCQlpZiAocFJ4V0ktPldpcmVsZXNzQ2xpSUQgPCBNQVhfTEVOX09GX01BQ19UQUJMRSkKLQkJewotCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbcFJ4V0ktPldpcmVsZXNzQ2xpSURdOwotCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyAxLiByZWxlYXNlIHBhY2tldCBpZiBpbmZyYSBtb2RlCi0JCQkvLyAyLiBuZXcgYSBwRW50cnkgaWYgYWQtaG9jIG1vZGUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaW5mcmEgb3IgYWQtaG9jCi0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0JCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSU5GUkEpOwotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQkJaWYgKChwSGVhZGVyLT5GQy5GckRzID09IDApICYmIChwSGVhZGVyLT5GQy5Ub0RzID09IDApKQotCQkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9ETFMpOwotCQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQkJQVNTRVJUKHBSeFdJLT5XaXJlbGVzc0NsaUlEID09IEJTU0lEX1dDSUQpOwotCQl9Ci0KLQkJLy8gY2hlY2sgQXRoZXJvcyBDbGllbnQKLQkJaWYgKChwRW50cnktPmJJQW1CYWRBdGhlcm9zID09IEZBTFNFKSAmJiAgKHBSeEQtPkFNUERVID09IDEpICYmIChwSGVhZGVyLT5GQy5SZXRyeSApKQotCQl7Ci0JCQlwRW50cnktPmJJQW1CYWRBdGhlcm9zID0gVFJVRTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkN1cnJlbnRBdGhlcm9zID0gVFJVRTsKLQkJCXBBZC0+Q29tbW9uQ2ZnLklPVGVzdFBhcm0uYkxhc3RBdGhlcm9zID0gVFJVRTsKLQkJCWlmICghU1RBX0FFU19PTihwQWQpKQotCQkJewotCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgOCwgQUxMTl9TRVRQUk9URUNULCBUUlVFLCBGQUxTRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwUnhCbGstPnBEYXRhID0gKFVDSEFSICopcEhlYWRlcjsKLQotCS8vCi0JLy8gdXBkYXRlIFJ4QmxrLT5wRGF0YSwgRGF0YVNpemUKLQkvLyA4MDIuMTEgSGVhZGVyLCBRT1MsIEhUQywgSHcgUGFkZGluZwotCS8vCi0KLQkvLyAxLiBza2lwIDgwMi4xMSBIRUFERVIKLQl7Ci0JCXBSeEJsay0+cERhdGEgKz0gTEVOR1RIXzgwMl8xMTsKLQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPSBMRU5HVEhfODAyXzExOwotCX0KLQotCS8vIDIuIFFPUwotCWlmIChwSGVhZGVyLT5GQy5TdWJUeXBlICYgMHgwOCkKLQl7Ci0JCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9RT1MpOwotCQlVc2VyUHJpb3JpdHkgPSAqKHBSeEJsay0+cERhdGEpICYgMHgwZjsKLQkJLy8gYml0IDcgaW4gUW9TIENvbnRyb2wgZmllbGQgc2lnbmFscyB0aGUgSFQgQS1NU0RVIGZvcm1hdAotCQlpZiAoKCpwUnhCbGstPnBEYXRhKSAmIDB4ODApCi0JCXsKLQkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BTVNEVSk7Ci0JCX0KLQotCQkvLyBza2lwIFFPUyBjb250b3JsIGZpZWxkCi0JCXBSeEJsay0+cERhdGEgKz0gMjsKLQkJcFJ4QmxrLT5EYXRhU2l6ZSAtPTI7Ci0JfQotCXBSeEJsay0+VXNlclByaW9yaXR5ID0gVXNlclByaW9yaXR5OwotCi0JLyogY2hlY2sgaWYgbmVlZCB0byByZXNlbmQgUFMgUG9sbCB3aGVuIHJlY2VpdmVkIHBhY2tldCB3aXRoIE1vcmVEYXRhID0gMSAqLwotCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiAocEhlYWRlci0+RkMuTW9yZURhdGEgPT0gMSkpCi0JewotCQlpZiAoKCgoVXNlclByaW9yaXR5ID09IDApIHx8IChVc2VyUHJpb3JpdHkgPT0gMykpICYmCi0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFID09IDApIHx8Ci0JCQkoKChVc2VyUHJpb3JpdHkgPT0gMSkgfHwgKFVzZXJQcmlvcml0eSA9PSAyKSkgJiYKLQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPT0gMCkgfHwKLQkJCSgoKFVzZXJQcmlvcml0eSA9PSA0KSB8fCAoVXNlclByaW9yaXR5ID09IDUpKSAmJgotCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9PSAwKSB8fAotCQkJKCgoVXNlclByaW9yaXR5ID09IDYpIHx8IChVc2VyUHJpb3JpdHkgPT0gNykpICYmCi0JCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID09IDApKQotCQl7Ci0JCQkvKiBub24tVUFQU0QgZGVsaXZlcnktZW5hYmxlZCBBQyAqLwotCQkJUlRNUF9QU19QT0xMX0VOUVVFVUUocEFkKTsKLQkJfQotCX0KLQotCS8vIDMuIE9yZGVyIGJpdDogQS1SYWxpbmsgb3IgSFRDKwotCWlmIChwSGVhZGVyLT5GQy5PcmRlcikKLQl7Ci0jaWZkZWYgQUdHUkVHQVRJT05fU1VQUE9SVAotCQlpZiAoKHBSeFdJLT5QSFlNT0RFIDw9IE1PREVfT0ZETSkgJiYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkpCi0JCXsKLQkJCVJYX0JMS19TRVRfRkxBRyhwUnhCbGssIGZSWF9BUkFMSU5LKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfSFRDKTsKLQkJCS8vIHNraXAgSFRDIGNvbnRvcmwgZmllbGQKLQkJCXBSeEJsay0+cERhdGEgKz0gNDsKLQkJCXBSeEJsay0+RGF0YVNpemUgLT0gNDsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJfQotCX0KLQotCS8vIDQuIHNraXAgSFcgcGFkZGluZwotCWlmIChwUnhELT5MMlBBRCkKLQl7Ci0JCS8vIGp1c3QgbW92ZSBwRGF0YSBwb2ludGVyCi0JCS8vIGJlY2F1c2UgRGF0YVNpemUgZXhjbHVkaW5nIEhXIHBhZGRpbmcKLQkJUlhfQkxLX1NFVF9GTEFHKHBSeEJsaywgZlJYX1BBRCk7Ci0JCXBSeEJsay0+cERhdGEgKz0gMjsKLQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlpZiAocFJ4RC0+QkEpCi0JewotCQlSWF9CTEtfU0VUX0ZMQUcocFJ4QmxrLCBmUlhfQU1QRFUpOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCi0JLy8KLQkvLyBDYXNlIEkgIFByb2Nlc3MgQnJvYWRjYXN0ICYgTXVsdGljYXN0IGRhdGEgZnJhbWUKLQkvLwotCWlmIChwUnhELT5CY2FzdCB8fCBwUnhELT5NY2FzdCkKLQl7Ci0JCUlOQ19DT1VOVEVSNjQocEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0UmVjZWl2ZWRGcmFtZUNvdW50KTsKLQotCQkvLyBEcm9wIE1jYXN0L0JjYXN0IGZyYW1lIHdpdGggZnJhZ21lbnQgYml0IG9uCi0JCWlmIChwSGVhZGVyLT5GQy5Nb3JlRnJhZykKLQkJewotCQkJLy8gcmVsZWFzZSBwYWNrZXQKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRmlsdGVyIG91dCBCY2FzdCBmcmFtZSB3aGljaCBBUCByZWxheWVkIGZvciB1cwotCQlpZiAocEhlYWRlci0+RkMuRnJEcyAmJiBNQUNfQUREUl9FUVVBTChwSGVhZGVyLT5BZGRyMywgcEFkLT5DdXJyZW50QWRkcmVzcykpCi0JCXsKLQkJCS8vIHJlbGVhc2UgcGFja2V0Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUluZGljYXRlX0xlZ2FjeV9QYWNrZXQocEFkLCBwUnhCbGssIEZyb21XaGljaEJTU0lEKTsKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmIChwUnhELT5VMk0pCi0JewotCQlwQWQtPkxhc3RSeFJhdGUgPSAoVVNIT1JUKSgocFJ4V0ktPk1DUykgKyAocFJ4V0ktPkJXIDw8NykgKyAocFJ4V0ktPlNob3J0R0kgPDw4KSsgKHBSeFdJLT5QSFlNT0RFIDw8MTQpKSA7Ci0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotICAgICAgICBpZiAoUlhfQkxLX1RFU1RfRkxBRyhwUnhCbGssIGZSWF9ETFMpKQotCQl7Ci0JCQlNQUNfVEFCTEVfRU5UUlkgKnBEbHNFbnRyeSA9IE5VTEw7Ci0KLQkJCXBEbHNFbnRyeSA9IERsc0VudHJ5VGFibGVMb29rdXBCeVdjaWQocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgcEhlYWRlci0+QWRkcjIsIFRSVUUpOwotCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBEbHNFbnRyeSkKLQkJCVVwZGF0ZV9Sc3NpX1NhbXBsZShwQWQsICZwRGxzRW50cnktPlJzc2lTYW1wbGUsIHBSeFdJKTsKLQkJfQotCQllbHNlCi0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0JCWlmIChBREhPQ19PTihwQWQpKQotCQl7Ci0JCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBIZWFkZXItPkFkZHIyKTsKLQkJCWlmIChwRW50cnkpCi0JCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBFbnRyeS0+UnNzaVNhbXBsZSwgcFJ4V0kpOwotCQl9Ci0KLQotCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOwotCi0JCXBBZC0+U3RhQ2ZnLkxhc3RTTlIwID0gKFVDSEFSKShwUnhXSS0+U05SMCk7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RTTlIxID0gKFVDSEFSKShwUnhXSS0+U05SMSk7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNSeE9rRGF0YUNudCsrOwotCi0KLQlpZiAoISgocEhlYWRlci0+RnJhZyA9PSAwKSAmJiAocEhlYWRlci0+RkMuTW9yZUZyYWcgPT0gMCkpKQotCXsKLQkJLy8gcmUtYXNzZW1ibGUgdGhlIGZyYWdtZW50ZWQgcGFja2V0cwotCQkvLyByZXR1cm4gY29tcGxldGUgZnJhbWUgKHBSeFBhY2tldCkgb3IgTlVMTAotCQliRnJhZ21lbnQgPSBUUlVFOwotCQlwUnhQYWNrZXQgPSBSVE1QRGVGcmFnbWVudERhdGFGcmFtZShwQWQsIHBSeEJsayk7Ci0JfQotCi0JaWYgKHBSeFBhY2tldCkKLQl7Ci0JCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W3BSeFdJLT5XaXJlbGVzc0NsaUlEXTsKLQotCQkvLyBwcm9jZXNzIGNvbXBsZXRlIGZyYW1lCi0JCWlmIChiRnJhZ21lbnQgJiYgKHBSeEQtPkRlY3J5cHRlZCkgJiYgKHBFbnRyeS0+V2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQotCQl7Ci0JCQkvLyBNaW51cyBNSUMgbGVuZ3RoCi0JCQlwUnhCbGstPkRhdGFTaXplIC09IDg7Ci0KLQkJCS8vIEZvciBUS0lQIGZyYW1lLCBjYWxjdWxhdGUgdGhlIE1JQyB2YWx1ZQotCQkJaWYgKFNUQUNoZWNrVGtpcE1JQ1ZhbHVlKHBBZCwgcEVudHJ5LCBwUnhCbGspID09IEZBTFNFKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCVNUQVJ4RGF0YUZyYW1lQW5ub3VuY2UocEFkLCBwRW50cnksIHBSeEJsaywgRnJvbVdoaWNoQlNTSUQpOwotCQkJcmV0dXJuOwotCX0KLQllbHNlCi0JewotCQkvLyBqdXN0IHJldHVybgotCQkvLyBiZWNhdXNlIFJUTVBEZUZyYWdtZW50RGF0YUZyYW1lKCkgd2lsbCByZWxlYXNlIHJ4IHBhY2tldCwKLQkJLy8gaWYgcGFja2V0IGlzIGZyYWdtZW50ZWQKLQkJcmV0dXJuOwotCX0KLQl9Ci0KLQlBU1NFUlQoMCk7Ci0JLy8gcmVsZWFzZSBwYWNrZXQKLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLX0KLQotVk9JRCBTVEFIYW5kbGVSeE1nbXRGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQotewotCVBSVDI4WFhfUlhEX1NUUlVDCXBSeEQgPSAmKHBSeEJsay0+UnhEKTsKLQlQUlhXSV9TVFJVQwkJcFJ4V0kgPSBwUnhCbGstPnBSeFdJOwotCVBIRUFERVJfODAyXzExCXBIZWFkZXIgPSBwUnhCbGstPnBIZWFkZXI7Ci0JUE5ESVNfUEFDS0VUCXBSeFBhY2tldCA9IHBSeEJsay0+cFJ4UGFja2V0OwotCi0JZG8KLQl7Ci0KLQotCQkvKiBjaGVjayBpZiBuZWVkIHRvIHJlc2VuZCBQUyBQb2xsIHdoZW4gcmVjZWl2ZWQgcGFja2V0IHdpdGggTW9yZURhdGEgPSAxICovCi0JCWlmICgocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSAmJiAocEhlYWRlci0+RkMuTW9yZURhdGEgPT0gMSkpCi0JCXsKLQkJCS8qIGZvciBVQVBTRCwgYWxsIG1hbmFnZW1lbnQgZnJhbWVzIHdpbGwgYmUgVk8gcHJpb3JpdHkgKi8KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPID09IDApCi0JCQl7Ci0JCQkJLyogbm9uLVVBUFNEIGRlbGl2ZXJ5LWVuYWJsZWQgQUMgKi8KLQkJCQlSVE1QX1BTX1BPTExfRU5RVUVVRShwQWQpOwotCQkJfQotCQl9Ci0KLQkJLyogVE9ETzogaWYgTW9yZURhdGEgPT0gMCwgc3RhdGlvbiBjYW4gZ28gdG8gc2xlZXAgKi8KLQotCi0JCS8vIFdlIHNob3VsZCBjb2xsZWN0IFJTU0kgbm90IG9ubHkgVTJNIGRhdGEgYnV0IGFsc28gbXkgYmVhY29uCi0JCWlmICgocEhlYWRlci0+RkMuU3ViVHlwZSA9PSBTVUJUWVBFX0JFQUNPTikgJiYgKE1BQ19BRERSX0VRVUFMKCZwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgJnBIZWFkZXItPkFkZHIyKSkKLQkJCSYmIChwQWQtPlJ4QW50LkV2YWx1YXRlUGVyaW9kID09IDApKQotCQl7Ci0JCQlVcGRhdGVfUnNzaV9TYW1wbGUocEFkLCAmcEFkLT5TdGFDZmcuUnNzaVNhbXBsZSwgcFJ4V0kpOwotCi0JCQlwQWQtPlN0YUNmZy5MYXN0U05SMCA9IChVQ0hBUikocFJ4V0ktPlNOUjApOwotCQkJcEFkLT5TdGFDZmcuTGFzdFNOUjEgPSAoVUNIQVIpKHBSeFdJLT5TTlIxKTsKLQkJfQotCi0jaWZkZWYgUlQzMHh4Ci0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi0JCS8vIGNvbGxlY3QgcnNzaSBpbmZvcm1hdGlvbiBmb3IgYW50ZW5uYSBkaXZlcnNpdHkKLQkJaWYgKChwQWQtPk5pY0NvbmZpZzIuZmllbGQuQW50RGl2ZXJzaXR5KSAmJgotCQkJKHBBZC0+Q29tbW9uQ2ZnLmJSeEFudERpdmVyc2l0eSAhPSBBTlRfRElWRVJTSVRZX0RJU0FCTEUpKQotCQl7Ci0JCQlpZiAoKHBSeEQtPlUyTSkgfHwgKChwSGVhZGVyLT5GQy5TdWJUeXBlID09IFNVQlRZUEVfQkVBQ09OKSAmJiAoTUFDX0FERFJfRVFVQUwoJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCAmcEhlYWRlci0+QWRkcjIpKSkpCi0JCQl7Ci0JCQkJCUNPTExFQ1RfUlhfQU5URU5OQV9BVkVSQUdFX1JTU0kocEFkLCBDb252ZXJ0VG9Sc3NpKHBBZCwgKFVDSEFSKXBSeFdJLT5SU1NJMCwgUlNTSV8wKSwgMCk7IC8vTm90ZTogUlNTSTIgbm90IHVzZWQgb24gUlQ3MwotCQkJCQlwQWQtPlN0YUNmZy5OdW1PZkF2Z1Jzc2lTYW1wbGUgKys7Ci0JCQl9Ci0JCX0KLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLQotCQkvLyBGaXJzdCBjaGVjayB0aGUgc2l6ZSwgaXQgTVVTVCBub3QgZXhjZWVkIHRoZSBtbG1lIHF1ZXVlIHNpemUKLQkJaWYgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQgPiBNR01UX0RNQV9CVUZGRVJfU0laRSkKLQkJewotCQkJREJHUFJJTlRfRVJSKCgiU1RBSGFuZGxlUnhNZ210RnJhbWU6IGZyYW1lIHRvbyBsYXJnZSwgc2l6ZSA9ICVkIFxuIiwgcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlSRVBPUlRfTUdNVF9GUkFNRV9UT19NTE1FKHBBZCwgcFJ4V0ktPldpcmVsZXNzQ2xpSUQsIHBIZWFkZXIsIHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQsCi0JCQkJCQkJCQlwUnhXSS0+UlNTSTAsIHBSeFdJLT5SU1NJMSwgcFJ4V0ktPlJTU0kyLCBwUnhELT5QbGNwU2lnbmFsKTsKLQl9IHdoaWxlIChGQUxTRSk7Ci0KLQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotVk9JRCBTVEFIYW5kbGVSeENvbnRyb2xGcmFtZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglSWF9CTEsJCQkqcFJ4QmxrKQotewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCVBSWFdJX1NUUlVDCQlwUnhXSSA9IHBSeEJsay0+cFJ4V0k7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JUEhFQURFUl84MDJfMTEJcEhlYWRlciA9IHBSeEJsay0+cEhlYWRlcjsKLQlQTkRJU19QQUNLRVQJcFJ4UGFja2V0ID0gcFJ4QmxrLT5wUnhQYWNrZXQ7Ci0KLQlzd2l0Y2ggKHBIZWFkZXItPkZDLlN1YlR5cGUpCi0JewotCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLX1JFUToKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCXsKLQkJCQlDbnRsRW5xdWV1ZUZvclJlY3YocEFkLCBwUnhXSS0+V2lyZWxlc3NDbGlJRCwgKHBSeFdJLT5NUERVdG90YWxCeXRlQ291bnQpLCAoUEZSQU1FX0JBX1JFUSlwSGVhZGVyKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQljYXNlIFNVQlRZUEVfQkxPQ0tfQUNLOgotCQljYXNlIFNVQlRZUEVfQUNLOgotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBSeFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCVByb2Nlc3MgUnhEb25lIGludGVycnVwdCwgcnVubmluZyBpbiBEUEMgbGV2ZWwKLQotCUFyZ3VtZW50czoKLQkJcEFkIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCQlUaGlzIHJvdXRpbmUgaGFzIHRvIG1haW50YWluIFJ4IHJpbmcgcmVhZCBwb2ludGVyLgotCQlOZWVkIHRvIGNvbnNpZGVyIFFPUyBEQVRBIGZvcm1hdCB3aGVuIGNvbnZlcnRpbmcgdG8gODAyLjMKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1CT09MRUFOIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglCT09MRUFOCQkJYXJnYykKLXsKLQlORElTX1NUQVRVUwkJCVN0YXR1czsKLQlVSU5UMzIJCQlSeFByb2Nlc3NlZCwgUnhQZW5kaW5nOwotCUJPT0xFQU4JCQliUmVzY2hlZHVsZSA9IEZBTFNFOwotCVJUMjhYWF9SWERfU1RSVUMJKnBSeEQ7Ci0JVUNIQVIJCQkqcERhdGE7Ci0JUFJYV0lfU1RSVUMJCXBSeFdJOwotCVBORElTX1BBQ0tFVAlwUnhQYWNrZXQ7Ci0JUEhFQURFUl84MDJfMTEJcEhlYWRlcjsKLQlSWF9CTEsJCQlSeENlbGw7Ci0KLQlSeFByb2Nlc3NlZCA9IFJ4UGVuZGluZyA9IDA7Ci0KLQkvLyBwcm9jZXNzIHdob2xlIHJ4IHJpbmcKLQl3aGlsZSAoMSkKLQl7Ci0KLQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9SQURJT19PRkYgfAotCQkJCQkJCQlmUlRNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTIHwKLQkJCQkJCQkJZlJUTVBfQURBUFRFUl9OSUNfTk9UX0VYSVNUKSB8fAotCQkJIVJUTVBfVEVTVF9GTEFHKHBBZCxmUlRNUF9BREFQVEVSX1NUQVJUX1VQKSkKLQkJewotCQkJYnJlYWs7Ci0JCX0KLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQlpZiAoUnhQcm9jZXNzZWQrKyA+IE1BWF9SWF9QUk9DRVNTX0NOVCkKLQkJewotCQkJLy8gbmVlZCB0byByZXNjaGVkdWxlIHJ4IGhhbmRsZQotCQkJYlJlc2NoZWR1bGUgPSBUUlVFOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCQlSeFByb2Nlc3NlZCArKzsgLy8gdGVzdAotCi0JCS8vIDEuIGFsbG9jYXRlIGEgbmV3IGRhdGEgcGFja2V0IGludG8gcnggcmluZyB0byByZXBsYWNlIHJlY2VpdmVkIHBhY2tldAotCQkvLyAgICB0aGVuIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIHBhY2tldAotCQkvLyAyLiB0aGUgY2FsbGVlIG11c3QgdGFrZSBjaGFyZ2Ugb2YgcmVsZWFzZSBvZiBwYWNrZXQKLQkJLy8gMy4gQXMgZmFyIGFzIGRyaXZlciBpcyBjb25jZXJuZWQgLAotCQkvLyAgICB0aGUgcnggcGFja2V0IG11c3QKLQkJLy8gICAgICBhLiBiZSBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIgb3IKLQkJLy8gICAgICBiLiBiZSByZWxlYXNlZCBpZiBpdCBpcyBkaXNjYXJkZWQKLQkJcFJ4UGFja2V0ID0gR2V0UGFja2V0RnJvbVJ4UmluZyhwQWQsICYoUnhDZWxsLlJ4RCksICZiUmVzY2hlZHVsZSwgJlJ4UGVuZGluZyk7Ci0JCWlmIChwUnhQYWNrZXQgPT0gTlVMTCkKLQkJewotCQkJLy8gbm8gbW9yZSBwYWNrZXQgdG8gcHJvY2VzcwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBnZXQgcnggcmluZyBkZXNjcmlwdG9yCi0JCXBSeEQgPSAmKFJ4Q2VsbC5SeEQpOwotCQkvLyBnZXQgcnggZGF0YSBidWZmZXIKLQkJcERhdGEJPSBHRVRfT1NfUEtUX0RBVEFQVFIocFJ4UGFja2V0KTsKLQkJcFJ4V0kJPSAoUFJYV0lfU1RSVUMpIHBEYXRhOwotCQlwSGVhZGVyID0gKFBIRUFERVJfODAyXzExKSAocERhdGErUlhXSV9TSVpFKSA7Ci0KLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JICAgIFJUTVBGcmFtZUVuZGlhbkNoYW5nZShwQWQsIChQVUNIQVIpcEhlYWRlciwgRElSX1JFQUQsIFRSVUUpOwotCQlSVE1QV0lFbmRpYW5DaGFuZ2UoKFBVQ0hBUilwUnhXSSwgVFlQRV9SWFdJKTsKLSNlbmRpZgotCi0JCS8vIGJ1aWxkIFJ4Q2VsbAotCQlSeENlbGwucFJ4V0kgPSBwUnhXSTsKLQkJUnhDZWxsLnBIZWFkZXIgPSBwSGVhZGVyOwotCQlSeENlbGwucFJ4UGFja2V0ID0gcFJ4UGFja2V0OwotCQlSeENlbGwucERhdGEgPSAoVUNIQVIgKikgcEhlYWRlcjsKLQkJUnhDZWxsLkRhdGFTaXplID0gcFJ4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudDsKLQkJUnhDZWxsLkZsYWdzID0gMDsKLQotCQkvLyBJbmNyZWFzZSBUb3RhbCByZWNlaXZlIGJ5dGUgY291bnRlciBhZnRlciByZWFsIGRhdGEgcmVjZWl2ZWQgbm8gbWF0ZXIgYW55IGVycm9yIG9yIG5vdAotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJlY2VpdmVkQnl0ZUNvdW50ICs9ICBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1JlY2VpdmVkQnl0ZUNvdW50ICs9ICBwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50OwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLlJ4Q291bnQgKys7Ci0KLQkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQpOwotCi0JCWlmIChwUnhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50IDwgMTQpCi0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19GQUlMVVJFOwotCi0gICAgICAgIGlmIChNT05JVE9SX09OKHBBZCkpCi0JCXsKLSAgICAgICAgICAgIHNlbmRfbW9uaXRvcl9wYWNrZXRzKHBBZCwgJlJ4Q2VsbCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFNUQVJ4RG9uZUludGVycnVwdEhhbmRsZSgpIGlzIGNhbGxlZCBpbiBydHVzYl9idWxrLmMgKi8KLSNpZmRlZiBSQUxJTktfQVRFCi0JCWlmIChBVEVfT04ocEFkKSkKLQkJewotCQkJcEFkLT5hdGUuUnhDbnRQZXJTZWMrKzsKLQkJCUFURVNhbXBsZVJzc2kocEFkLCBwUnhXSSk7Ci0jaWZkZWYgUkFMSU5LXzI4eHhfUUEKLQkJCWlmIChwQWQtPmF0ZS5iUUFSeFN0YXJ0ID09IFRSVUUpCi0JCQl7Ci0JCQkJLyogKCpwUnhEKSBoYXMgYmVlbiBzd2FwcGVkIGluIEdldFBhY2tldEZyb21SeFJpbmcoKSAqLwotCQkJCUFURV9RQV9TdGF0aXN0aWNzKHBBZCwgcFJ4V0ksIHBSeEQsCXBIZWFkZXIpOwotCQkJfQotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFJ4UGFja2V0LCBORElTX1NUQVRVU19TVUNDRVNTKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCS8vIENoZWNrIGZvciBhbGwgUnhEIGVycm9ycwotCQlTdGF0dXMgPSBSVE1QQ2hlY2tSeEVycm9yKHBBZCwgcEhlYWRlciwgcFJ4V0ksIHBSeEQpOwotCi0JCS8vIEhhbmRsZSB0aGUgcmVjZWl2ZWQgZnJhbWUKLQkJaWYgKFN0YXR1cyA9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlzd2l0Y2ggKHBIZWFkZXItPkZDLlR5cGUpCi0JCQl7Ci0JCQkJLy8gQ0FTRSBJLCByZWNlaXZlIGEgREFUQSBmcmFtZQotCQkJCWNhc2UgQlRZUEVfREFUQToKLQkJCQl7Ci0JCQkJCS8vIHByb2Nlc3MgREFUQSBmcmFtZQotCQkJCQlTVEFIYW5kbGVSeERhdGFGcmFtZShwQWQsICZSeENlbGwpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkvLyBDQVNFIElJLCByZWNlaXZlIGEgTUdNVCBmcmFtZQotCQkJCWNhc2UgQlRZUEVfTUdNVDoKLQkJCQl7Ci0JCQkJCVNUQUhhbmRsZVJ4TWdtdEZyYW1lKHBBZCwgJlJ4Q2VsbCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCS8vIENBU0UgSUlJLiByZWNlaXZlIGEgQ05UTCBmcmFtZQotCQkJCWNhc2UgQlRZUEVfQ05UTDoKLQkJCQl7Ci0JCQkJCVNUQUhhbmRsZVJ4Q29udHJvbEZyYW1lKHBBZCwgJlJ4Q2VsbCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCS8vIGRpc2NhcmQgb3RoZXIgdHlwZQotCQkJCWRlZmF1bHQ6Ci0JCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXBBZC0+Q291bnRlcnM4MDIzLlJ4RXJyb3JzKys7Ci0JCQkvLyBkaXNjYXJkIHRoaXMgZnJhbWUKLQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUnhQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGJSZXNjaGVkdWxlOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQJUlRNUEhhbmRsZVR3YWtldXBJbnRlcnJ1cHQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQpCi17Ci0JQXNpY0ZvcmNlV2FrZXVwKHBBZCwgRkFMU0UpOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotICAgIEVhcmx5IGNoZWNraW5nIGFuZCBPUy1kZXBlbmVkIHBhcnNpbmcgZm9yIFR4IHBhY2tldCBzZW5kIHRvIG91ciBTVEEgZHJpdmVyLgotCi1Bcmd1bWVudHM6Ci0gICAgTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQJUG9pbnRlciByZWZlciB0byB0aGUgZGV2aWNlIGhhbmRsZSwgaS5lLiwgdGhlIHBBZC4KLQlQUE5ESVNfUEFDS0VUCXBwUGFja2V0QXJyYXkJCQlUaGUgcGFja2V0IGFycmF5IG5lZWQgdG8gZG8gdHJhbnNtaXNzaW9uLgotCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMJCQlOdW1iZXIgb2YgcGFja2V0IGluIHBhY2tldCBhcnJheS4KLQotUmV0dXJuIFZhbHVlOgotCU5PTkUKLQotTm90ZToKLQlUaGlzIGZ1bmN0aW9uIGRvIGVhcmx5IGNoZWNraW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3Igc2VuZC1vdXQgcGFja2V0LgotCVlvdSBvbmx5IGNhbiBwdXQgT1MtZGVwZW5lZCAmIFNUQSByZWxhdGVkIGNvZGUgaW4gaGVyZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLVZPSUQgU1RBU2VuZFBhY2tldHMoCi0JSU4JTkRJU19IQU5ETEUJCU1pbmlwb3J0QWRhcHRlckNvbnRleHQsCi0JSU4JUFBORElTX1BBQ0tFVAlwcFBhY2tldEFycmF5LAotCUlOCVVJTlQJCQlOdW1iZXJPZlBhY2tldHMpCi17Ci0JVUlOVAkJCUluZGV4OwotCVBSVE1QX0FEQVBURVIJcEFkID0gKFBSVE1QX0FEQVBURVIpIE1pbmlwb3J0QWRhcHRlckNvbnRleHQ7Ci0JUE5ESVNfUEFDS0VUCXBQYWNrZXQ7Ci0JQk9PTEVBTgkJCWFsbG93VG9TZW5kID0gRkFMU0U7Ci0KLQotCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IE51bWJlck9mUGFja2V0czsgSW5kZXgrKykKLQl7Ci0JCXBQYWNrZXQgPSBwcFBhY2tldEFycmF5W0luZGV4XTsKLQotCQlkbwotCQl7Ci0KLQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkVTRVRfSU5fUFJPR1JFU1MpIHx8Ci0JCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0hBTFRfSU5fUFJPR1JFU1MpIHx8Ci0JCQkJUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX1JBRElPX09GRikpCi0JCQl7Ci0JCQkJLy8gRHJvcCBzZW5kIHJlcXVlc3Qgc2luY2UgaGFyZHdhcmUgaXMgaW4gcmVzZXQgc3RhdGUKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmICghSU5GUkFfT04ocEFkKSAmJiAhQURIT0NfT04ocEFkKSkKLQkJCXsKLQkJCQkvLyBEcm9wIHNlbmQgcmVxdWVzdCBzaW5jZSB0aGVyZSBhcmUgbm8gcGh5c2ljYWwgY29ubmVjdGlvbiB5ZXQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8gUmVjb3JkIHRoYXQgb3JpZ25hbCBwYWNrZXQgc291cmNlIGlzIGZyb20gTkRJUyBsYXllcixzbyB0aGF0Ci0JCQkJLy8gbGF0ZXIgb24gZHJpdmVyIGtub3dzIGhvdyB0byByZWxlYXNlIHRoaXMgTkRJUyBQQUNLRVQKLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJCQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeTsKLQkJCQlQVUNIQVIgcFNyY0J1ZlZBID0gR0VUX09TX1BLVF9EQVRBUFRSKHBQYWNrZXQpOwotCi0JCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwU3JjQnVmVkEpOwotCQkJCWlmIChwRW50cnkgJiYgKHBFbnRyeS0+VmFsaWRBc0RscyA9PSBUUlVFKSkKLQkJCQl7Ci0JCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIHBFbnRyeS0+QWlkKTsKLQkJCQl9Ci0JCQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIDApOyAvLyB0aGlzIGZpZWxkIGlzIHVzZWxlc3Mgd2hlbiBpbiBTVEEgbW9kZQotCQkJCVJUTVBfU0VUX1BBQ0tFVF9TT1VSQ0UocFBhY2tldCwgUEtUU1JDX05ESVMpOwotCQkJCU5ESVNfU0VUX1BBQ0tFVF9TVEFUVVMocFBhY2tldCwgTkRJU19TVEFUVVNfUEVORElORyk7Ci0JCQkJcEFkLT5SYWxpbmtDb3VudGVycy5QZW5kaW5nTmRpc1BhY2tldENvdW50Kys7Ci0KLQkJCQlhbGxvd1RvU2VuZCA9IFRSVUU7Ci0JCQl9Ci0JCX0gd2hpbGUoRkFMU0UpOwotCi0JCWlmIChhbGxvd1RvU2VuZCA9PSBUUlVFKQotCQkJU1RBU2VuZFBhY2tldChwQWQsIHBQYWNrZXQpOwotCQllbHNlCi0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gRGVxdWV1ZSBvdXRnb2luZyBmcmFtZXMgZnJvbSBUeFN3UXVldWVbXSBhbmQgcHJvY2VzcyBpdAotCVJUTVBEZVF1ZXVlUGFja2V0KHBBZCwgRkFMU0UsIE5VTV9PRl9UWF9SSU5HLCBNQVhfVFhfUFJPQ0VTUyk7Ci0KLX0KLQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1Sb3V0aW5lIERlc2NyaXB0aW9uOgotCVRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGRvIHBhY2tldCBwYXJzaW5nIGFuZCBjbGFzc2lmaWNhdGlvbiBmb3IgVHggcGFja2V0Ci0JdG8gU1RBIGRldmljZSwgYW5kIGl0IHdpbGwgZW4tcXVldWUgcGFja2V0cyB0byBvdXIgVHhTd1F1ZXVlIGRlcGVuZHMgb24gQUMKLQljbGFzcy4KLQotQXJndW1lbnRzOgotCXBBZAkJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCXBQYWNrZXQJCVBvaW50ZXIgdG8gc2VuZCBwYWNrZXQKLQotUmV0dXJuIFZhbHVlOgotCU5ESVNfU1RBVFVTX1NVQ0NFU1MJCQlJZiBzdWNjZXMgdG8gcXVldWUgdGhlIHBhY2tldCBpbnRvIFR4U3dRdWV1ZS4KLQlORElTX1NUQVRVU19GQUlMVVJFCQkJSWYgZmFpbGVkIHRvIGRvIGVuLXF1ZXVlLgotCi1Ob3RlOgotCVlvdSBvbmx5IGNhbiBwdXQgT1MtaW5kZXBlbmVkICYgU1RBIHJlbGF0ZWQgY29kZSBpbiBoZXJlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotTkRJU19TVEFUVVMgU1RBU2VuZFBhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCkKLXsKLQlQQUNLRVRfSU5GTwlQYWNrZXRJbmZvOwotCVBVQ0hBUgkJCXBTcmNCdWZWQTsKLQlVSU5UCQkJU3JjQnVmTGVuOwotCVVJTlQJCQlBbGxvd0ZyYWdTaXplOwotCVVDSEFSCQkJTnVtYmVyT2ZGcmFnOwotCVVDSEFSCQkJUlRTUmVxdWlyZWQ7Ci0JVUNIQVIJCQlRdWVJZHgsIFVzZXJQcmlvcml0eTsKLQlNQUNfVEFCTEVfRU5UUlkgKnBFbnRyeSA9IE5VTEw7Ci0JdW5zaWduZWQgaW50CUlycUZsYWdzOwotCVVDSEFSCQkJRmxnSXNJUCA9IDA7Ci0JVUNIQVIJCQlSYXRlOwotCi0JLy8gUHJlcGFyZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciBidWZmZXIgZGVzY3JpcHRvcgotCS8vIGNoYWluZWQgd2l0aGluIGEgc2luZ2xlIE5ESVMgcGFja2V0LgotCVJUTVBfUXVlcnlQYWNrZXRJbmZvKHBQYWNrZXQsICZQYWNrZXRJbmZvLCAmcFNyY0J1ZlZBLCAmU3JjQnVmTGVuKTsKLQotCWlmIChwU3JjQnVmVkEgPT0gTlVMTCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gcFNyY0J1ZlZBID09IE5VTEwgISEhU3JjQnVmTGVuPSV4XG4iLFNyY0J1ZkxlbikpOwotCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKLQkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQotCWlmIChTcmNCdWZMZW4gPCAxNCkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldCAtLT4gTmRpcyBQYWNrZXQgYnVmZmVyIGVycm9yICEhIVxuIikpOwotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0JLy8gSW4gSFQgcmF0ZSBhZGhvYyBtb2RlLCBBLU1QRFUgaXMgb2Z0ZW4gdXNlZC4gU28gbmVlZCB0byBsb29rdXAgQkEgVGFibGUgYW5kIE1BQyBFbnRyeS4KLQkvLyBOb3RlIG11bHRpY2FzdCBwYWNrZXRzIGluIGFkaG9jIGFsc28gdXNlIEJTU0lEX1dDSUQgaW5kZXguCi0JewotCQlpZihJTkZSQV9PTihwQWQpKQotCQl7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQlVU0hPUlQJdG1wV2NpZDsKLQotCQkJdG1wV2NpZCA9IFJUTVBfR0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQpOwotCQkJaWYgKFZBTElEX1dDSUQodG1wV2NpZCkgJiYKLQkJCQkocEFkLT5NYWNUYWIuQ29udGVudFt0bXBXY2lkXS5WYWxpZEFzRGxzPT0gVFJVRSkpCi0JCQl7Ci0JCQkJcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF07Ci0JCQkJUmF0ZSA9IHBBZC0+TWFjVGFiLkNvbnRlbnRbdG1wV2NpZF0uQ3VyclR4UmF0ZTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCXsKLQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCQkJUlRNUF9TRVRfUEFDS0VUX1dDSUQocFBhY2tldCwgQlNTSURfV0NJRCk7Ci0JCQlSYXRlID0gcEFkLT5Db21tb25DZmcuVHhSYXRlOwotCQl9Ci0JCX0KLQkJZWxzZSBpZiAoQURIT0NfT04ocEFkKSkKLQkJewotCQkJaWYgKCpwU3JjQnVmVkEgJiAweDAxKQotCQkJewotCQkJCVJUTVBfU0VUX1BBQ0tFVF9XQ0lEKHBQYWNrZXQsIE1DQVNUX1dDSUQpOwotCQkJCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W01DQVNUX1dDSURdOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcFNyY0J1ZlZBKTsKLQkJCX0KLQkJCVJhdGUgPSBwQWQtPkNvbW1vbkNmZy5UeFJhdGU7Ci0JCX0KLQl9Ci0KLQlpZiAoIXBFbnRyeSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCgiU1RBU2VuZFBhY2tldC0+Q2Fubm90IGZpbmQgcEVudHJ5KCUyeDolMng6JTJ4OiUyeDolMng6JTJ4KSBpbiBNYWNUYWIhXG4iLCBQUklOVF9NQUMocFNyY0J1ZlZBKSkpOwotCQkvLyBSZXNvdXJlY2UgaXMgbG93LCBzeXN0ZW0gZGlkIG5vdCBhbGxvY2F0ZSB2aXJ0dWFsIGFkZHJlc3MKLQkJLy8gcmV0dXJuIE5ESVNfU1RBVFVTX0ZBSUxVUkUgZGlyZWN0bHkgdG8gdXBwZXIgbGF5ZXIKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0KLQlpZiAoQURIT0NfT04ocEFkKQotCQkpCi0JewotCQlSVE1QX1NFVF9QQUNLRVRfV0NJRChwUGFja2V0LCAoVUNIQVIpcEVudHJ5LT5BaWQpOwotCX0KLQotCS8vCi0JLy8gQ2hlY2sgdGhlIEV0aGVybmV0IEZyYW1lIHR5cGUgb2YgdGhpcyBwYWNrZXQsIGFuZCBzZXQgdGhlIFJUTVBfU0VUX1BBQ0tFVF9TUEVDSUZJQyBmbGFncy4KLQkvLwkJSGVyZSB3ZSBzZXQgdGhlIFBBQ0tFVF9TUEVDSUZJQyBmbGFncyhMTEMsIFZMQU4sIERIQ1AvQVJQLCBFQVBPTCkuCi0JUlRNUENoZWNrRXRoZXJUeXBlKHBBZCwgcFBhY2tldCk7Ci0KLQotCi0JLy8KLQkvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sIC0gZHJvcCBhbGwgbm9uLTgwMi4xeCBmcmFtZSBiZWZvcmUgcG9ydCBzZWN1cmVkCi0JLy8KLQlpZiAoKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKSB8fAotCQkgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JCSAgfHwgKHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9PSBUUlVFKQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQkJICApCi0JCSAgJiYgKChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpIHx8IChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPj0gMikpCi0JCSAgJiYgKFJUTVBfR0VUX1BBQ0tFVF9FQVBPTChwUGFja2V0KT09IEZBTFNFKQotCQkgICkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1RBU2VuZFBhY2tldCAtLT4gRHJvcCBwYWNrZXQgYmVmb3JlIHBvcnQgc2VjdXJlZCAhISFcbiIpKTsKLQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBQYWNrZXQsIE5ESVNfU1RBVFVTX0ZBSUxVUkUpOwotCi0JCXJldHVybiAoTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotCi0KLQkvLyBTVEVQIDEuIERlY2lkZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlcXVpcmVkIHRvIGRlbGl2ZXIgdGhpcyBNU0RVLgotCS8vCSAgIFRoZSBlc3RpbWF0aW9uIGhlcmUgaXMgbm90IHZlcnkgYWNjdXJhdGUgYmVjYXVzZSBkaWZmaWN1bHQgdG8KLQkvLwkgICB0YWtlIGVuY3J5cHRpb24gb3ZlcmhlYWQgaW50byBjb25zaWRlcmF0aW9uIGhlcmUuIFRoZSByZXN1bHQKLQkvLwkgICAiTnVtYmVyT2ZGcmFnIiBpcyB0aGVuIGp1c3QgdXNlZCB0byBwcmUtY2hlY2sgaWYgZW5vdWdoIGZyZWUKLQkvLwkgICBUWEQgYXJlIGF2YWlsYWJsZSB0byBob2xkIHRoaXMgTVNEVS4KLQotCi0JaWYgKCpwU3JjQnVmVkEgJiAweDAxKQkvLyBmcmFnbWVudGF0aW9uIG5vdCBhbGxvd2VkIG9uIG11bHRpY2FzdCAmIGJyb2FkY2FzdAotCQlOdW1iZXJPZkZyYWcgPSAxOwotCWVsc2UgaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQUdHUkVHQVRJT05fSU5VU0VEKSkKLQkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gQWdncmVnYXRpb24gb3ZlcndoZWxtcyBmcmFnbWVudGF0aW9uCi0JZWxzZSBpZiAoQ0xJRU5UX1NUQVRVU19URVNUX0ZMQUcocEVudHJ5LCBmQ0xJRU5UX1NUQVRVU19BTVNEVV9JTlVTRUQpKQotCQlOdW1iZXJPZkZyYWcgPSAxOwkvLyBBZ2dyZWdhdGlvbiBvdmVyd2hlbG1zIGZyYWdtZW50YXRpb24KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQllbHNlIGlmICgocEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1PREUgPT0gTU9ERV9IVE1JWCkgfHwgKHBBZC0+U3RhQ2ZnLkhUUGh5TW9kZS5maWVsZC5NT0RFID09IE1PREVfSFRHUkVFTkZJRUxEKSkKLQkJTnVtYmVyT2ZGcmFnID0gMTsJLy8gTUlNTyBSQVRFIG92ZXJ3aGVsbXMgZnJhZ21lbnRhdGlvbgotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCWVsc2UKLQl7Ci0JCS8vIFRoZSBjYWxjdWxhdGVkICJOdW1iZXJPZkZyYWciIGlzIGEgcm91Z2ggZXN0aW1hdGlvbiBiZWNhdXNlIG9mIHZhcmlvdXMKLQkJLy8gZW5jcnlwdGlvbi9lbmNhcHN1bGF0aW9uIG92ZXJoZWFkIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoaXMgbnVtYmVyIGlzIGp1c3QKLQkJLy8gdXNlZCB0byBtYWtlIHN1cmUgZW5vdWdoIGZyZWUgVFhEIGFyZSBhdmFpbGFibGUgYmVmb3JlIGZyYWdtZW50YXRpb24gdGFrZXMgcGxhY2UuCi0JCS8vIEluIGNhc2UgdGhlIGFjdHVhbCByZXF1aXJlZCBudW1iZXIgb2YgZnJhZ21lbnRzIG9mIGFuIE5ESVMgcGFja2V0Ci0JCS8vIGV4Y2NlZWRzICJOdW1iZXJPZkZyYWciY2FjdWxhdGVkIGhlcmUgYW5kIG5vdCBlbm91Z2ggZnJlZSBUWEQgYXZhaWxhYmxlLCB0aGUKLQkJLy8gbGFzdCBmcmFnbWVudCAoaS5lLiBsYXN0IE1QRFUpIHdpbGwgYmUgZHJvcHBlZCBpbiBSVE1QSGFyZFRyYW5zbWl0KCkgZHVlIHRvIG91dCBvZgotCQkvLyByZXNvdXJjZSwgYW5kIHRoZSBORElTIHBhY2tldCB3aWxsIGJlIGluZGljYXRlZCBORElTX1NUQVRVU19GQUlMVVJFLiBUaGlzIHNob3VsZAotCQkvLyByYXJlbHkgaGFwcGVuIGFuZCB0aGUgcGVuYWx0eSBpcyBqdXN0IGxpa2UgYSBUWCBSRVRSWSBmYWlsLiBBZmZvcmRhYmxlLgotCi0JCUFsbG93RnJhZ1NpemUgPSAocEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpIC0gTEVOR1RIXzgwMl8xMSAtIExFTkdUSF9DUkM7Ci0JCU51bWJlck9mRnJhZyA9ICgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAvIEFsbG93RnJhZ1NpemUpICsgMTsKLQkJLy8gVG8gZ2V0IGFjY3VyYXRlIG51bWJlciBvZiBmcmFnbWVudGF0aW9uLCBNaW51cyAxIGlmIHRoZSBzaXplIGp1c3QgbWF0Y2ggdG8gYWxsb3dhYmxlIGZyYWdtZW50IHNpemUKLQkJaWYgKCgoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCAtIExFTkdUSF84MDJfMyArIExFTkdUSF84MDJfMV9IKSAlIEFsbG93RnJhZ1NpemUpID09IDApCi0JCXsKLQkJCU51bWJlck9mRnJhZy0tOwotCQl9Ci0JfQotCi0JLy8gU2F2ZSBmcmFnbWVudCBudW1iZXIgdG8gTmRpcyBwYWNrZXQgcmVzZXJ2ZWQgZmllbGQKLQlSVE1QX1NFVF9QQUNLRVRfRlJBR01FTlRTKHBQYWNrZXQsIE51bWJlck9mRnJhZyk7Ci0KLQotCS8vIFNURVAgMi4gQ2hlY2sgdGhlIHJlcXVpcmVtZW50IG9mIFJUUzoKLQkvLwkgICBJZiBtdWx0aXBsZSBmcmFnbWVudCByZXF1aXJlZCwgUlRTIGlzIHJlcXVpcmVkIG9ubHkgZm9yIHRoZSBmaXJzdCBmcmFnbWVudAotCS8vCSAgIGlmIHRoZSBmcmFnbWVudCBzaXplIGxhcmdlIHRoYW4gUlRTIHRocmVzaG9sZAotCS8vICAgICBGb3IgUlQyOHh4LCBMZXQgQVNJQyBzZW5kIFJUUy9DVFMKLS8vCVJUTVBfU0VUX1BBQ0tFVF9SVFMocFBhY2tldCwgMCk7Ci0JaWYgKE51bWJlck9mRnJhZyA+IDEpCi0JCVJUU1JlcXVpcmVkID0gKHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID4gcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKSA/IDEgOiAwOwotCWVsc2UKLQkJUlRTUmVxdWlyZWQgPSAoUGFja2V0SW5mby5Ub3RhbFBhY2tldExlbmd0aCA+IHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCkgPyAxIDogMDsKLQotCS8vIFNhdmUgUlRTIHJlcXVpcmVtZW50IHRvIE5kaXMgcGFja2V0IHJlc2VydmVkIGZpZWxkCi0JUlRNUF9TRVRfUEFDS0VUX1JUUyhwUGFja2V0LCBSVFNSZXF1aXJlZCk7Ci0JUlRNUF9TRVRfUEFDS0VUX1RYUkFURShwUGFja2V0LCBwQWQtPkNvbW1vbkNmZy5UeFJhdGUpOwotCi0JLy8KLQkvLyBTVEVQIDMuIFRyYWZmaWMgY2xhc3NpZmljYXRpb24uIG91dGNvbWUgPSA8VXNlclByaW9yaXR5LCBRdWVJZHg+Ci0JLy8KLQlVc2VyUHJpb3JpdHkgPSAwOwotCVF1ZUlkeAkJID0gUUlEX0FDX0JFOwotCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1dNTV9JTlVTRUQpICYmCi0JCUNMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBFbnRyeSwgZkNMSUVOVF9TVEFUVVNfV01NX0NBUEFCTEUpKQotCXsKLQkJVVNIT1JUIFByb3RvY29sOwotCQlVQ0hBUiAgTGxjU25hcExlbiA9IDAsIEJ5dGUwLCBCeXRlMTsKLQkJZG8KLQkJewotCQkJLy8gZ2V0IEV0aGVybmV0IHByb3RvY29sIGZpZWxkCi0JCQlQcm90b2NvbCA9IChVU0hPUlQpKChwU3JjQnVmVkFbMTJdIDw8IDgpICsgcFNyY0J1ZlZBWzEzXSk7Ci0JCQlpZiAoUHJvdG9jb2wgPD0gMTUwMCkKLQkJCXsKLQkJCQkvLyBnZXQgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQgZnJvbSBMTEMvU05BUAotCQkJCWlmIChTbmlmZjJCeXRlc0Zyb21OZGlzQnVmZmVyKFBhY2tldEluZm8ucEZpcnN0QnVmZmVyLCBMRU5HVEhfODAyXzMgKyA2LCAmQnl0ZTAsICZCeXRlMSkgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQkJCQkJYnJlYWs7Ci0KLQkJCQlQcm90b2NvbCA9IChVU0hPUlQpKChCeXRlMCA8PCA4KSArIEJ5dGUxKTsKLQkJCQlMbGNTbmFwTGVuID0gODsKLQkJCX0KLQotCQkJLy8gYWx3YXlzIEFDX0JFIGZvciBub24tSVAgcGFja2V0Ci0JCQlpZiAoUHJvdG9jb2wgIT0gMHgwODAwKQotCQkJCWJyZWFrOwotCi0JCQkvLyBnZXQgSVAgaGVhZGVyCi0JCQlpZiAoU25pZmYyQnl0ZXNGcm9tTmRpc0J1ZmZlcihQYWNrZXRJbmZvLnBGaXJzdEJ1ZmZlciwgTEVOR1RIXzgwMl8zICsgTGxjU25hcExlbiwgJkJ5dGUwLCAmQnl0ZTEpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJYnJlYWs7Ci0KLQkJCS8vIHJldHVybiBBQ19CRSBpZiBwYWNrZXQgaXMgbm90IElQdjQKLQkJCWlmICgoQnl0ZTAgJiAweGYwKSAhPSAweDQwKQotCQkJCWJyZWFrOwotCi0JCQlGbGdJc0lQID0gMTsKLQkJCVVzZXJQcmlvcml0eSA9IChCeXRlMSAmIDB4ZTApID4+IDU7Ci0JCQlRdWVJZHggPSBNYXBVc2VyUHJpb3JpdHlUb0FjY2Vzc0NhdGVnb3J5W1VzZXJQcmlvcml0eV07Ci0KLQkJCS8vIFRPRE86IGhhdmUgdG8gY2hlY2sgQUNNIGJpdC4gYXBwbHkgVFNQRUMgaWYgQUNNIGlzIE9OCi0JCQkvLyBUT0RPOiBkb3duZ3JhZGUgVVAgJiBRdWVJZHggYmVmb3JlIHBhc3NpbmcgQUNNCi0JCQkvKgotCQkJCVVuZGVyIFdNTSBBQ00gY29udHJvbCwgd2UgZG9udCBuZWVkIHRvIGNoZWNrIHRoZSBiaXQ7Ci0JCQkJT3Igd2hlbiBhIFRTUEVDIGlzIGJ1aWx0IGZvciBWTyBidXQgd2Ugd2lsbCBjaGFuZ2UgdG8gaXNzdWUKLQkJCQlCQSBzZXNzaW9uIGZvciBCRSBoZXJlLCBzbyB3ZSB3aWxsIG5vdCB1c2UgQkEgdG8gc2VuZCBWTyBwYWNrZXRzLgotCQkJKi8KLQkJCWlmIChwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBQ01bUXVlSWR4XSkKLQkJCXsKLQkJCQlVc2VyUHJpb3JpdHkgPSAwOwotCQkJCVF1ZUlkeAkJID0gUUlEX0FDX0JFOwotCQkJfQotCQl9IHdoaWxlIChGQUxTRSk7Ci0JfQotCi0JUlRNUF9TRVRfUEFDS0VUX1VQKHBQYWNrZXQsIFVzZXJQcmlvcml0eSk7Ci0KLQotCi0JLy8gTWFrZSBzdXJlIFNlbmRUeFdhaXQgcXVldWUgcmVzb3VyY2Ugd29uJ3QgYmUgdXNlZCBieSBvdGhlciB0aHJlYWRzCi0JUlRNUF9JUlFfTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotCWlmIChwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLk51bWJlciA+PSBNQVhfUEFDS0VUU19JTl9RVUVVRSkKLQl7Ci0JCVJUTVBfSVJRX1VOTE9DSygmcEFkLT5pcnFfbG9jaywgSXJxRmxhZ3MpOwotI2lmZGVmIEJMT0NLX05FVF9JRgotCQlTdG9wTmV0SWZRdWV1ZShwQWQsIFF1ZUlkeCwgcFBhY2tldCk7Ci0jZW5kaWYgLy8gQkxPQ0tfTkVUX0lGIC8vCi0JCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQotCQlyZXR1cm4gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQl9Ci0JZWxzZQotCXsKLQkJSW5zZXJ0VGFpbFF1ZXVlQWMocEFkLCBwRW50cnksICZwQWQtPlR4U3dRdWV1ZVtRdWVJZHhdLCBQQUNLRVRfVE9fUVVFVUVfRU5UUlkocFBhY2tldCkpOwotCX0KLQlSVE1QX0lSUV9VTkxPQ0soJnBBZC0+aXJxX2xvY2ssIElycUZsYWdzKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIGlmICgocEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLkF1dG9CQSA9PSBUUlVFKSYmCi0gICAgICAgIElTX0hUX1NUQShwRW50cnkpKQotCXsKLQkgICAgLy9QTUFDX1RBQkxFX0VOVFJZIHBNYWNFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotCQlpZiAoKChwRW50cnktPlRYQkFiaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKLSAgICAgICAgICAgICgocEVudHJ5LT5CQURlY2xpbmVCaXRtYXAgJiAoMTw8VXNlclByaW9yaXR5KSkgPT0gMCkgJiYKLSAgICAgICAgICAgIChwRW50cnktPlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKQotCQkJIC8vIEZvciBJT1QgY29tcGF0aWJpbGl0eSwgaWYKLQkJCSAvLyAxLiBJdCBpcyBSYWxpbmsgY2hpcCBvcgotCQkJIC8vIDIuIEl0IGlzIE9QRU4gb3IgQUVTIG1vZGUsCi0JCQkgLy8gdGhlbiBCQSBzZXNzaW9uIGNhbiBiZSBidWxpdC4KLQkJCSAmJiAoKHBFbnRyeS0+VmFsaWRBc0NMSSAmJiBwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSAhPSAweDApIHx8Ci0JCQkJIChwRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExV0VQRW5hYmxlZCAmJiBwRW50cnktPldlcFN0YXR1cyAhPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSkKLQkJCSkKLQkJewotCQkJQkFPcmlTZXNzaW9uU2V0VXAocEFkLCBwRW50cnksIFVzZXJQcmlvcml0eSwgMCwgMTAsIEZBTFNFKTsKLQkJfQotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjT3NUeENvdW50W1F1ZUlkeF0rKzsgLy8gVE9ETzogZm9yIGRlYnVnIG9ubHkuIHRvIGJlIHJlbW92ZWQKLQlyZXR1cm4gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLX0KLQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0JUm91dGluZSBEZXNjcmlwdGlvbjoKLQkJVGhpcyBzdWJyb3V0aW5lIHdpbGwgc2NhbiB0aHJvdWdoIHJlbGVhdGl2ZSByaW5nIGRlc2NyaXB0b3IgdG8gZmluZAotCQlvdXQgYXZhbGlhYmxlIGZyZWUgcmluZyBkZXNjcmlwdG9yIGFuZCBjb21wYXJlIHdpdGggcmVxdWVzdCBzaXplLgotCi0JQXJndW1lbnRzOgotCQlwQWQgUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlRdWVJZHgJCVNlbGVjdGVkIFRYIFJpbmcKLQotCVJldHVybiBWYWx1ZToKLQkJTkRJU19TVEFUVVNfRkFJTFVSRQlOb3QgZW5vdWdoIGZyZWUgZGVzY3JpcHRvcgotCQlORElTX1NUQVRVU19TVUNDRVNTCUVub3VnaCBmcmVlIGRlc2NyaXB0b3IKLQotCUlSUUwgPSBQQVNTSVZFX0xFVkVMCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2lmZGVmIFJUTVBfTUFDX1BDSQotTkRJU19TVEFUVVMgUlRNUEZyZWVUWERSZXF1ZXN0KAotCUlOCQlQUlRNUF9BREFQVEVSCXBBZCwKLQlJTgkJVUNIQVIJCQlRdWVJZHgsCi0JSU4JCVVDSEFSCQkJTnVtYmVyUmVxdWlyZWQsCi0JSU4JCVBVQ0hBUgkJCUZyZWVOdW1iZXJJcykKLXsKLQlVTE9ORwkJRnJlZU51bWJlciA9IDA7Ci0JTkRJU19TVEFUVVMJU3RhdHVzID0gTkRJU19TVEFUVVNfRkFJTFVSRTsKLQotCXN3aXRjaCAoUXVlSWR4KQotCXsKLQkJY2FzZSBRSURfQUNfQks6Ci0JCWNhc2UgUUlEX0FDX0JFOgotCQljYXNlIFFJRF9BQ19WSToKLQkJY2FzZSBRSURfQUNfVk86Ci0JCS8qY2FzZSBRSURfSENDQToqLwotCQkJaWYgKHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggPiBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4KQotCQkJCUZyZWVOdW1iZXIgPSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4U3dGcmVlSWR4IC0gcEFkLT5UeFJpbmdbUXVlSWR4XS5UeENwdUlkeCAtIDE7Ci0JCQllbHNlCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+VHhSaW5nW1F1ZUlkeF0uVHhTd0ZyZWVJZHggKyBUWF9SSU5HX1NJWkUgLSBwQWQtPlR4UmluZ1tRdWVJZHhdLlR4Q3B1SWR4IC0gMTsKLQotCQkJaWYgKEZyZWVOdW1iZXIgPj0gTnVtYmVyUmVxdWlyZWQpCi0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUUlEX01HTVQ6Ci0JCQlpZiAocEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCA+IHBBZC0+TWdtdFJpbmcuVHhDcHVJZHgpCi0JCQkJRnJlZU51bWJlciA9IHBBZC0+TWdtdFJpbmcuVHhTd0ZyZWVJZHggLSBwQWQtPk1nbXRSaW5nLlR4Q3B1SWR4IC0gMTsKLQkJCWVsc2UKLQkJCQlGcmVlTnVtYmVyID0gcEFkLT5NZ210UmluZy5UeFN3RnJlZUlkeCArIE1HTVRfUklOR19TSVpFIC0gcEFkLT5NZ210UmluZy5UeENwdUlkeCAtIDE7Ci0KLQkJCWlmIChGcmVlTnVtYmVyID49IE51bWJlclJlcXVpcmVkKQotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsKCJSVE1QRnJlZVRYRFJlcXVlc3Q6OkludmFsaWQgUXVlSWR4KD0lZClcbiIsIFF1ZUlkeCkpOwotCQkJYnJlYWs7Ci0JfQotCSpGcmVlTnVtYmVySXMgPSAoVUNIQVIpRnJlZU51bWJlcjsKLQotCXJldHVybiAoU3RhdHVzKTsKLX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCi0KLVZPSUQgUlRNUFNlbmREaXNhc3NvY2lhdGlvbkZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkKQotewotfQotCi1WT0lECVJUTVBTZW5kTnVsbEZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCUJPT0xFQU4JCQliUW9zTnVsbCkKLXsKLQlVQ0hBUglOdWxsRnJhbWVbNDhdOwotCVVMT05HCUxlbmd0aDsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyXzgwMl8xMTsKLQotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmKEFURV9PTihwQWQpKQotCXsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSAgICAvLyBXUEEgODAyLjF4IHNlY3VyZWQgcG9ydCBjb250cm9sCi0gICAgaWYgKCgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLSAgICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKSB8fAotICAgICAgICAgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQkJICB8fCAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpCi0jZW5kaWYKLSAgICAgICAgKSAmJgotICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCXsKLQkJcmV0dXJuOwotCX0KLQotCU5kaXNaZXJvTWVtb3J5KE51bGxGcmFtZSwgNDgpOwotCUxlbmd0aCA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCXBIZWFkZXJfODAyXzExID0gKFBIRUFERVJfODAyXzExKSBOdWxsRnJhbWU7Ci0KLQlwSGVhZGVyXzgwMl8xMS0+RkMuVHlwZSA9IEJUWVBFX0RBVEE7Ci0JcEhlYWRlcl84MDJfMTEtPkZDLlN1YlR5cGUgPSBTVUJUWVBFX05VTExfRlVOQzsKLQlwSGVhZGVyXzgwMl8xMS0+RkMuVG9EcyA9IDE7Ci0JQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQl9Ci0JZWxzZQotCXsKLQkJcEhlYWRlcl84MDJfMTEtPkZDLlB3ck1nbXQgPSAocEFkLT5TdGFDZmcuUHNtID09IFBXUl9TQVZFKSA/IDE6IDA7Ci0JfQotCXBIZWFkZXJfODAyXzExLT5EdXJhdGlvbiA9IHBBZC0+Q29tbW9uQ2ZnLkRzaWZzICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIFR4UmF0ZSwgMTQpOwotCi0JcEFkLT5TZXF1ZW5jZSsrOwotCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBBZC0+U2VxdWVuY2U7Ci0KLQkvLyBQcmVwYXJlIFFvc051bGwgZnVuY3Rpb24gZnJhbWUKLQlpZiAoYlFvc051bGwpCi0JewotCQlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9IFNVQlRZUEVfUU9TX05VTEw7Ci0KLQkJLy8gY29weSBRT1MgY29udHJvbCBieXRlcwotCQlOdWxsRnJhbWVbTGVuZ3RoXQk9ICAwOwotCQlOdWxsRnJhbWVbTGVuZ3RoKzFdID0gIDA7Ci0JCUxlbmd0aCArPSAyOy8vIGlmIHBhZCB3aXRoIDIgYnl0ZXMgZm9yIGFsaWdubWVudCwgQVBTRCB3aWxsIGZhaWwKLQl9Ci0KLQlIQUxfS2lja091dE51bGxGcmFtZVR4KHBBZCwgMCwgTnVsbEZyYW1lLCBMZW5ndGgpOwotCi19Ci0KLS8vIElSUUwgPSBESVNQQVRDSF9MRVZFTAotVk9JRAlSVE1QU2VuZFJUU0ZyYW1lKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCXBEQSwKLQlJTgl1bnNpZ25lZCBpbnQJTmV4dE1wZHVTaXplLAotCUlOCVVDSEFSCQkJVHhSYXRlLAotCUlOCVVDSEFSCQkJUlRTUmF0ZSwKLQlJTglVU0hPUlQJCQlBY2tEdXJhdGlvbiwKLQlJTglVQ0hBUgkJCVF1ZUlkeCwKLQlJTglVQ0hBUgkJCUZyYW1lR2FwKQotewotfQotCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBGSU5EIEVOQ1JZUFQgS0VZIEFORCBERUNJREUgQ0lQSEVSIEFMR09SSVRITQotLy8JCUZpbmQgdGhlIFdQQSBrZXksIGVpdGhlciBHcm91cCBvciBQYWlyd2lzZSBLZXkKLS8vCQlMRUFQICsgVEtJUCBhbHNvIHVzZSBXUEEga2V5LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlY2lkZSBXRVAgYml0IGFuZCBjaXBoZXIgc3VpdGUgdG8gYmUgdXNlZC4gU2FtZSBjaXBoZXIgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIHdob2xlIGZyYWdtZW50IGJ1cnN0Ci0vLyBJbiBDaXNjbyBDQ1ggMi4wIExlYXAgQXV0aGVudGljYXRpb24KLS8vCQkgICBXZXBTdGF0dXMgaXMgTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCBidXQgdGhlIGtleSB3aWxsIHVzZSBQYWlyd2lzZUtleQotLy8JCSAgIEluc3RlYWQgb2YgdGhlIFNoYXJlZEtleSwgU2hhcmVkS2V5IExlbmd0aCBtYXkgYmUgWmVyby4KLVZPSUQgU1RBRmluZENpcGhlckFsZ29yaXRobSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglUWF9CTEsJCQkqcFR4QmxrKQotewotCU5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTCUNpcGhlcjsJCQkJLy8gVG8gaW5kaWNhdGUgY2lwaGVyIHVzZWQgZm9yIHRoaXMgcGFja2V0Ci0JVUNIQVIJCQkJCQkJQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7CQkvLyBjaXBoZXIgYWxvZ3JpdGhtCi0JVUNIQVIJCQkJCQkJS2V5SWR4ID0gMHhmZjsKLQlQVUNIQVIJCQkJCQkJcFNyY0J1ZlZBOwotCVBDSVBIRVJfS0VZCQkJCQkJcEtleSA9IE5VTEw7Ci0KLQlwU3JjQnVmVkEgPSBHRVRfT1NfUEtUX0RBVEFQVFIocFR4QmxrLT5wUGFja2V0KTsKLQotCXsKLQkgICAgLy8gU2VsZWN0IENpcGhlcgotCSAgICBpZiAoKCpwU3JjQnVmVkEgJiAweDAxKSAmJiAoQURIT0NfT04ocEFkKSkpCi0JICAgICAgICBDaXBoZXIgPSBwQWQtPlN0YUNmZy5Hcm91cENpcGhlcjsgLy8gQ2lwaGVyIGZvciBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0Ci0JICAgIGVsc2UKLQkgICAgICAgIENpcGhlciA9IHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXI7IC8vIENpcGhlciBmb3IgVW5pY2FzdAotCi0JCWlmIChSVE1QX0dFVF9QQUNLRVRfRUFQT0wocFR4QmxrLT5wUGFja2V0KSkKLQkJewotCQkJQVNTRVJUKHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA8PSBDSVBIRVJfQ0tJUDEyOCk7Ci0KLQkJCS8vIDQtd2F5IGhhbmRzaGFraW5nIGZyYW1lIG11c3QgYmUgY2xlYXIKLQkJCWlmICghKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYkNsZWFyRUFQRnJhbWUpKSAmJiAocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnKSAmJgotCQkJCShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pKQotCQkJewotCQkJCUNpcGhlckFsZyA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZzsKLQkJCQlLZXlJZHggPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKQotCQl7Ci0JCQkJS2V5SWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCQl9Ci0JCWVsc2UgaWYgKChDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkKLQkJewotCQkJaWYgKCgqcFNyY0J1ZlZBICYgMHgwMSkgJiYgKEFESE9DX09OKHBBZCkpKSAvLyBtdWx0aWNhc3QKLQkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JCQllbHNlIGlmIChwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5LZXlMZW4pCi0JCQkJS2V5SWR4ID0gMDsKLQkJCWVsc2UKLQkJCQlLZXlJZHggPSBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQ7Ci0JCX0KLQotCQlpZiAoS2V5SWR4ID09IDB4ZmYpCi0JCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJZWxzZSBpZiAoKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkKSB8fCAocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPT0gMCkpCi0JCQlDaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JICAgIGVsc2UgaWYgKCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgJiYKLQkgICAgICAgICAgICAgKENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSAmJgotCSAgICAgICAgICAgICAocEFkLT5TdGFDZmcuSUVFRTgwMjFYID09IFRSVUUpICYmCi0JICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotCSAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCQllbHNlCi0JCXsKLQkJCS8vSGVhZGVyXzgwMl8xMS5GQy5XZXAgPSAxOwotCQkJQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGc7Ci0JCQlwS2V5ID0gJnBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF07Ci0JCX0KLQl9Ci0KLQlwVHhCbGstPkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQlwVHhCbGstPnBLZXkgPSBwS2V5OwotfQotCi0KLVZPSUQgU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIoCi0JSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0JSU4gIFRYX0JMSyAgICAgICAgICAqcFR4QmxrKQotewotCi0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JQk9PTEVBTgliRExTRnJhbWUgPSBGQUxTRTsKLQlJTlQJRGxzRW50cnlJbmRleCA9IDA7Ci0jZW5kaWYgLy8gUU9TX0RMU19TVVBQT1JUIC8vCi0KLQkvLwotCS8vIE1BS0UgQSBDT01NT04gODAyLjExIEhFQURFUgotCS8vCi0KLQkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cwotCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQotCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJfODAyXzExLCBzaXplb2YoSEVBREVSXzgwMl8xMSkpOwotCi0JcEhlYWRlcl84MDJfMTEtPkZDLkZyRHMgPSAwOwotCXBIZWFkZXJfODAyXzExLT5GQy5UeXBlID0gQlRZUEVfREFUQTsKLQlwSGVhZGVyXzgwMl8xMS0+RkMuU3ViVHlwZSA9ICgoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkgPyBTVUJUWVBFX1FEQVRBIDogU1VCVFlQRV9EQVRBKTsKLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCWlmIChJTkZSQV9PTihwQWQpKQotCXsKLQkJLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGNhbiBiZSBzZW50IHRocm91Z2ggRExTIGRpcmVjdCBsaW5rIGludGVyZmFjZQotCQkvLyBJZiBwYWNrZXQgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMsIHRoZW4gZm9yY2UgYWdncmVnYXRpb24gZGlzYWJsZS4gKEhhcmQgdG8gZGV0ZXJtaW5lIHBlZXIgU1RBJ3MgY2FwYWJpbGl0eSkKLQkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKLQkJCWJETFNGcmFtZSA9IFRSVUU7Ci0JCWVsc2UKLQkJCWJETFNGcmFtZSA9IEZBTFNFOwotCX0KLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotICAgIGlmIChwVHhCbGstPnBNYWNFbnRyeSkKLQl7Ci0JCWlmIChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JGb3JjZU5vblFvUykpCi0JCXsKLQkJCXBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5Ob25Rb3NEYXRhU2VxOwotCQkJcFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXEgPSAocFR4QmxrLT5wTWFjRW50cnktPk5vblFvc0RhdGFTZXErMSkgJiBNQVhTRVE7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl7Ci0JICAgIHBIZWFkZXJfODAyXzExLT5TZXF1ZW5jZSA9IHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV07Ci0JICAgIHBUeEJsay0+cE1hY0VudHJ5LT5UeFNlcVtwVHhCbGstPlVzZXJQcmlvcml0eV0gPSAocFR4QmxrLT5wTWFjRW50cnktPlR4U2VxW3BUeEJsay0+VXNlclByaW9yaXR5XSsxKSAmIE1BWFNFUTsKLQl9Ci0JfQotCX0KLQllbHNlCi0JewotCQlwSGVhZGVyXzgwMl8xMS0+U2VxdWVuY2UgPSBwQWQtPlNlcXVlbmNlOwotCQlwQWQtPlNlcXVlbmNlID0gKHBBZC0+U2VxdWVuY2UrMSkgJiBNQVhTRVE7IC8vIG5leHQgc2VxdWVuY2UKLQl9Ci0KLQlwSGVhZGVyXzgwMl8xMS0+RnJhZyA9IDA7Ci0KLQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZURhdGEgPSBUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JNb3JlRGF0YSk7Ci0KLQl7Ci0JCWlmIChJTkZSQV9PTihwQWQpKQotCQl7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCQlpZiAoYkRMU0ZyYW1lKQotCQkJewotCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOwotCQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIyLCBwQWQtPkN1cnJlbnRBZGRyZXNzKTsKLQkJCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJCXsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCk7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMiwgcEFkLT5DdXJyZW50QWRkcmVzcyk7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXJfODAyXzExLT5BZGRyMywgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMTsKLQkJfQotCQl9Ci0JCWVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0JCXsKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcl84MDJfMTEtPkFkZHIxLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjIsIHBBZC0+Q3VycmVudEFkZHJlc3MpOwotCQkJQ09QWV9NQUNfQUREUihwSGVhZGVyXzgwMl8xMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Ub0RzID0gMDsKLQkJfQotCX0KLQotCWlmIChwVHhCbGstPkNpcGhlckFsZyAhPSBDSVBIRVJfTk9ORSkKLQkJcEhlYWRlcl84MDJfMTEtPkZDLldlcCA9IDE7Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCWVsc2UKLQlwSGVhZGVyXzgwMl8xMS0+RkMuUHdyTWdtdCA9IChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpOwotfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1WT0lEIFNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIoCi0JSU4gUlRNUF9BREFQVEVSCQkqcEFkLAotCUlOIFRYX0JMSwkJCSpwVHhCbGssCi0JSU4gVUNIQVIJCQkqcEhlYWRlcikKLXsKLQlNQUNfVEFCTEVfRU5UUlkJKnBNYWNFbnRyeTsKLQlQSEVBREVSXzgwMl8xMQlwSGVhZGVyODAyMTE7Ci0KLQlwSGVhZGVyODAyMTEgPSAoUEhFQURFUl84MDJfMTEpcEhlYWRlcjsKLQlwTWFjRW50cnkgPSBwVHhCbGstPnBNYWNFbnRyeTsKLQotCS8vCi0JLy8gVXBkYXRlIHRoZSBjYWNoZWQgODAyLjExIEhFQURFUgotCS8vCi0KLQkvLyBub3JtYWwgd2xhbiBoZWFkZXIgc2l6ZSA6IDI0IG9jdGV0cwotCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHNpemVvZihIRUFERVJfODAyXzExKTsKLQotCS8vIE1vcmUgQml0Ci0JcEhlYWRlcjgwMjExLT5GQy5Nb3JlRGF0YSA9IFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYk1vcmVEYXRhKTsKLQotCS8vIFNlcXVlbmNlCi0JcEhlYWRlcjgwMjExLT5TZXF1ZW5jZSA9IHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldOwotICAgIHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldID0gKHBNYWNFbnRyeS0+VHhTZXFbcFR4QmxrLT5Vc2VyUHJpb3JpdHldKzEpICYgTUFYU0VROwotCi0JewotCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCBETFMgZGlyZWN0IGxpbmsgaW50ZXJmYWNlCi0JCS8vIElmIHBhY2tldCBjYW4gYmUgc2VudCB0aHJvdWdoIERMUywgdGhlbiBmb3JjZSBhZ2dyZWdhdGlvbiBkaXNhYmxlLiAoSGFyZCB0byBkZXRlcm1pbmUgcGVlciBTVEEncyBjYXBhYmlsaXR5KQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlCT09MRUFOCWJETFNGcmFtZSA9IEZBTFNFOwotCQlJTlQJRGxzRW50cnlJbmRleCA9IDA7Ci0KLQkJRGxzRW50cnlJbmRleCA9IFJUTVBDaGVja0RMU0ZyYW1lKHBBZCwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQkJaWYgKERsc0VudHJ5SW5kZXggPj0gMCkKLQkJCWJETFNGcmFtZSA9IFRSVUU7Ci0JCWVsc2UKLQkJCWJETFNGcmFtZSA9IEZBTFNFOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JCS8vIFRoZSBhZGRyMyBvZiBub3JtYWwgcGFja2V0IHNlbmQgZnJvbSBEUyBpcyBEZXN0IE1hYyBhZGRyZXNzLgotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQlpZiAoYkRMU0ZyYW1lKQotCQl7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjEsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcik7Ci0JCQlDT1BZX01BQ19BRERSKHBIZWFkZXI4MDIxMS0+QWRkcjMsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCXBIZWFkZXI4MDIxMS0+RkMuVG9EcyA9IDA7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCQlpZiAoQURIT0NfT04ocEFkKSkKLQkJCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQllbHNlCi0JCUNPUFlfTUFDX0FERFIocEhlYWRlcjgwMjExLT5BZGRyMywgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNURVAgMi4gTUFLRSBBIENPTU1PTiA4MDIuMTEgSEVBREVSIFNIQVJFRCBCWSBFTlRJUkUgRlJBR01FTlQgQlVSU1QuIEZpbGwgc2VxdWVuY2UgbGF0ZXIuCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkKLQlwSGVhZGVyODAyMTEtPkZDLlB3ck1nbXQgPSBQV1JfU0FWRTsKLQllbHNlCi0JcEhlYWRlcjgwMjExLT5GQy5Qd3JNZ210ID0gKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSk7Ci19Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLXN0YXRpYyBpbmxpbmUgUFVDSEFSIFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcigKLQlJTiBSVE1QX0FEQVBURVIgKnBBZCwKLQlJTiBUWF9CTEsJCSpwVHhCbGspCi17Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQlQTkRJU19QQUNLRVQJcE5leHRQYWNrZXQ7Ci0JVUlOVDMyCQkJbmV4dEJ1ZkxlbjsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQotCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKLQotCi0JcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwotCi0JLy8gc3RlYWwgIm9yZGVyIiBiaXQgdG8gbWFyayAiYWdncmVnYXRpb24iCi0JcEhlYWRlcl84MDJfMTEtPkZDLk9yZGVyID0gMTsKLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCi0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQl9Ci0KLQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIuIExMQyBoZWFkZXIgc2hvdWxkIGF0IDQtYnl0ZXMgYWxpZ21lbnQuCi0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUilST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKLQotCS8vIEZvciBSQSBBZ2dyZWdhdGlvbiwKLQkvLyBwdXQgdGhlIDJuZCBNU0RVIGxlbmd0aChleHRyYSAyLWJ5dGUgZmllbGQpIGFmdGVyIFFPU19DT05UUk9MIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0Ci0JcFFFbnRyeSA9IHBUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQ7Ci0JcE5leHRQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7Ci0JbmV4dEJ1ZkxlbiA9IEdFVF9PU19QS1RfTEVOKHBOZXh0UGFja2V0KTsKLQlpZiAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocE5leHRQYWNrZXQpKQotCQluZXh0QnVmTGVuIC09IExFTkdUSF84MDJfMVE7Ci0KLQkqcEhlYWRlckJ1ZlB0ciA9IChVQ0hBUiluZXh0QnVmTGVuICYgMHhmZjsKLQkqKHBIZWFkZXJCdWZQdHIrMSkgPSAoVUNIQVIpKG5leHRCdWZMZW4gPj4gOCk7Ci0KLQlwSGVhZGVyQnVmUHRyICs9IDI7Ci0JcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IDI7Ci0KLQlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKLQotfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi1zdGF0aWMgaW5saW5lIFBVQ0hBUiBTVEFfQnVpbGRfQU1TRFVfRnJhbWVfSGVhZGVyKAotCUlOIFJUTVBfQURBUFRFUiAqcEFkLAotCUlOIFRYX0JMSwkJKnBUeEJsaykKLXsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOy8vLCBwU2F2ZUJ1ZlB0cjsKLQlIRUFERVJfODAyXzExCSpwSGVhZGVyXzgwMl8xMTsKLQotCi0JU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7Ci0JU1RBQnVpbGRDb21tb244MDJfMTFIZWFkZXIocEFkLCBwVHhCbGspOwotCi0JcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRSArIFRYV0lfU0laRV07Ci0JcEhlYWRlcl84MDJfMTEgPSAoSEVBREVSXzgwMl8xMSAqKSBwSGVhZGVyQnVmUHRyOwotCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCi0JcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47Ci0KLQkvLwotCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JLy8KLQkqcEhlYWRlckJ1ZlB0ciA9IChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpOwotCi0JLy8KLQkvLyBBLU1TRFUgcGFja2V0Ci0JLy8KLQkqcEhlYWRlckJ1ZlB0ciB8PSAweDgwOwotCi0JKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQlwSGVhZGVyQnVmUHRyICs9MjsKLQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQotCS8vcFNhdmVCdWZQdHIgPSBwSGVhZGVyQnVmUHRyOwotCi0JLy8KLQkvLyBwYWRkaW5nIGF0IGZyb250IG9mIExMQyBoZWFkZXIKLQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKLQkvLwotCS8vIEBAQCBNcGR1SGVhZGVyTGVuIGV4Y2x1ZGluZyBwYWRkaW5nIEBAQAotCS8vCi0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQlyZXR1cm4gcEhlYWRlckJ1ZlB0cjsKLQotfQotCi0KLVZPSUQgU1RBX0FNUERVX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCi17Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCU1BQ19UQUJMRV9FTlRSWQkqcE1hY0VudHJ5OwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQotCUFTU0VSVChwVHhCbGspOwotCi0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7Ci0JCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCQlpZiAoIFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwotCi0JCXBNYWNFbnRyeSA9IHBUeEJsay0+cE1hY0VudHJ5OwotCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKLQkJewotCQkJLy8gTk9URTogUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2l6ZSBvZiBwTWFjRW50cnktPkNhY2hlZEJ1ZltdIGlzIHNtYWxsZXIgdGhhbiBwVHhCbGstPkhlYWRlckJ1ZltdISEhIQotCQkJTmRpc01vdmVNZW1vcnkoKFBVQ0hBUikmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdLCAoUFVDSEFSKSZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSwgVFhXSV9TSVpFICsgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJCXBIZWFkZXJCdWZQdHIgPSAoUFVDSEFSKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdKTsKLQkJCVNUQUJ1aWxkQ2FjaGU4MDJfMTFIZWFkZXIocEFkLCBwVHhCbGssIHBIZWFkZXJCdWZQdHIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJU1RBRmluZENpcGhlckFsZ29yaXRobShwQWQsIHBUeEJsayk7Ci0JCQlTVEFCdWlsZENvbW1vbjgwMl8xMUhlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQkJCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCQl9Ci0KLQotCQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopIHBIZWFkZXJCdWZQdHI7Ci0KLQkJLy8gc2tpcCBjb21tb24gaGVhZGVyCi0JCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JCS8vCi0JCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JCS8vCi0JCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7Ci0JCSoocEhlYWRlckJ1ZlB0cisxKSA9IDA7Ci0JCXBIZWFkZXJCdWZQdHIgKz0yOwotCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gMjsKLQotCQkvLwotCQkvLyBidWlsZCBIVEMrCi0JCS8vIEhUQyBjb250cm9sIGZpbGVkIGZvbGxvd2luZyBRb1MgZmllbGQKLQkJLy8KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iUmRnID09IFRSVUUpICYmIENMSUVOVF9TVEFUVVNfVEVTVF9GTEFHKHBUeEJsay0+cE1hY0VudHJ5LCBmQ0xJRU5UX1NUQVRVU19SREdfQ0FQQUJMRSkpCi0JCXsKLQkJCWlmIChwTWFjRW50cnktPmlzQ2FjaGVkID09IEZBTFNFKQotCQkJewotCQkJCS8vIG1hcmsgSFRDIGJpdAotCQkJCXBIZWFkZXJfODAyXzExLT5GQy5PcmRlciA9IDE7Ci0KLQkJCQlOZGlzWmVyb01lbW9yeShwSGVhZGVyQnVmUHRyLCA0KTsKLQkJCQkqKHBIZWFkZXJCdWZQdHIrMykgfD0gMHg4MDsKLQkJCX0KLQkJCXBIZWFkZXJCdWZQdHIgKz0gNDsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSA0OwotCQl9Ci0KLQkJLy9wVHhCbGstPk1wZHVIZWFkZXJMZW4gPSBwSGVhZGVyQnVmUHRyIC0gcFR4QmxrLT5IZWFkZXJCdWYgLSBUWFdJX1NJWkUgLSBUWElORk9fU0laRTsKLQkJQVNTRVJUKHBUeEJsay0+TXBkdUhlYWRlckxlbiA+PSAyNCk7Ci0KLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKLQotCQkvLyBza2lwIHZsYW4gdGFnCi0JCWlmIChiVkxBTlBrdCkKLQkJewotCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKLQkJfQotCi0JCS8vCi0JCS8vIHBhZGRpbmcgYXQgZnJvbnQgb2YgTExDIGhlYWRlcgotCQkvLyBMTEMgaGVhZGVyIHNob3VsZCBsb2NhdGUgYXQgNC1vY3RldHMgYWxpZ21lbnQKLQkJLy8KLQkJLy8gQEBAIE1wZHVIZWFkZXJMZW4gZXhjbHVkaW5nIHBhZGRpbmcgQEBACi0JCS8vCi0JCXBUeEJsay0+SGRyUGFkTGVuID0gKFVMT05HKXBIZWFkZXJCdWZQdHI7Ci0JCXBIZWFkZXJCdWZQdHIgPSAoUFVDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQkJcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQkJewotCi0JCQkvLwotCQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkJLy8KLQkJCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCQkJaWYgKHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwLCA2KTsKLQkJCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmRGF0YS0yLCAyKTsKLQkJCQlwSGVhZGVyQnVmUHRyICs9IDI7Ci0JCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOwotCQkJfQotCi0JCX0KLQotCQlpZiAocE1hY0VudHJ5LT5pc0NhY2hlZCkKLQkJewotICAgICAgICAgICAgUlRNUFdyaXRlVHhXSV9DYWNoZShwQWQsIChQVFhXSV9TVFJVQykoJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFXSksIHBUeEJsayk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCi0JCQlOZGlzWmVyb01lbW9yeSgoUFVDSEFSKSgmcE1hY0VudHJ5LT5DYWNoZWRCdWZbMF0pLCBzaXplb2YocE1hY0VudHJ5LT5DYWNoZWRCdWYpKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KChQVUNIQVIpKCZwTWFjRW50cnktPkNhY2hlZEJ1ZlswXSksIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCAocEhlYWRlckJ1ZlB0ciAtIChQVUNIQVIpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pKSk7Ci0JCQlwTWFjRW50cnktPmlzQ2FjaGVkID0gVFJVRTsKLQkJfQotCi0JCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVBEVSBjb3VudCBhbmQgQnl0ZUNvdW50Ci0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRNUERVc0luQU1QRFVDb3VudC51Lkxvd1BhcnQgKys7Ci0JCQlwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkT2N0ZXRzSW5BTVBEVUNvdW50LlF1YWRQYXJ0ICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCQl9Ci0KLQkJLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCi0JCUhBTF9Xcml0ZVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIFRSVUUsICZGcmVlTnVtYmVyKTsKLQotCQkvLwotCQkvLyBLaWNrIG91dCBUeAotCQkvLwotICAgICAgICAgICAgICAgIGlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCQlIQUxfS2lja091dFR4KHBBZCwgcFR4QmxrLCBwVHhCbGstPlF1ZUlkeCk7Ci0KLQkJcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4RG9uZUNvdW50Kys7Ci0JfQotCi19Ci0KLQotVk9JRCBTVEFfQU1TRFVfRnJhbWVfVHgoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JVFhfQkxLCQkJKnBUeEJsaykKLXsKLQlQVUNIQVIJCQlwSGVhZGVyQnVmUHRyOwotCVVTSE9SVAkJCUZyZWVOdW1iZXI7Ci0JVVNIT1JUCQkJc3ViRnJhbWVQYXlsb2FkTGVuID0gMDsJLy8gQU1TRFUgU3ViZnJhbWUgbGVuZ3RoIHdpdGhvdXQgQU1TRFUtSGVhZGVyIC8gUGFkZGluZy4KLQlVU0hPUlQJCQl0b3RhbE1QRFVTaXplPTA7Ci0JVUNIQVIJCQkqc3ViRnJhbWVIZWFkZXI7Ci0JVUNIQVIJCQlwYWRkaW5nID0gMDsKLQlVU0hPUlQJCQlGaXJzdFR4ID0gMCwgTGFzdFR4SWR4ID0gMDsKLQlCT09MRUFOCQkJYlZMQU5Qa3Q7Ci0JaW50CQkJZnJhbWVOdW0gPSAwOwotCVBRVUVVRV9FTlRSWQlwUUVudHJ5OwotCi0KLQlBU1NFUlQocFR4QmxrKTsKLQotCUFTU0VSVCgocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyID4gMSkpOwotCi0Jd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCkKLQl7Ci0JCXBRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJnBUeEJsay0+VHhQYWNrZXRMaXN0KTsKLQkJcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCQlpZiAoUlRNUF9GaWxsVHhCbGtJbmZvKHBBZCwgcFR4QmxrKSAhPSBUUlVFKQotCQl7Ci0JCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJYlZMQU5Qa3QgPSAoUlRNUF9HRVRfUEFDS0VUX1ZMQU4ocFR4QmxrLT5wUGFja2V0KSA/IFRSVUUgOiBGQUxTRSk7Ci0KLQkJLy8gc2tpcCA4MDIuMyBoZWFkZXIKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YSA9IHBUeEJsay0+cFNyY0J1ZkhlYWRlciArIExFTkdUSF84MDJfMzsKLQkJcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKLQotCQkvLyBza2lwIHZsYW4gdGFnCi0JCWlmIChiVkxBTlBrdCkKLQkJewotCQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKLQkJfQotCi0JCWlmIChmcmFtZU51bSA9PSAwKQotCQl7Ci0JCQlwSGVhZGVyQnVmUHRyID0gU1RBX0J1aWxkX0FNU0RVX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQkJCS8vIE5PVEU6IFR4V0ktPk1QRFV0b3RhbEJ5dGVDb3VudCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuCi0JCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKLQkJCXBhZGRpbmcgPSBST1VORF9VUChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgc3ViRnJhbWVQYXlsb2FkTGVuLCA0KSAtIChMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEICsgc3ViRnJhbWVQYXlsb2FkTGVuKTsKLQkJCU5kaXNaZXJvTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBhZGRpbmcgKyBMRU5HVEhfQU1TRFVfU1VCRlJBTUVIRUFEKTsKLQkJCXBIZWFkZXJCdWZQdHIgKz0gcGFkZGluZzsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IHBhZGRpbmc7Ci0JCX0KLQotCQkvLwotCQkvLyBBLU1TRFUgc3ViZnJhbWUKLQkJLy8gICBEQSg2KStTQSg2KStMZW5ndGgoMikgKyBMTEMvU05BUCBFbmNhcAotCQkvLwotCQlzdWJGcmFtZUhlYWRlciA9IHBIZWFkZXJCdWZQdHI7Ci0JCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOwotCi0JCU5kaXNNb3ZlTWVtb3J5KHN1YkZyYW1lSGVhZGVyLCBwVHhCbGstPnBTcmNCdWZIZWFkZXIsIDEyKTsKLQotCi0JCXBIZWFkZXJCdWZQdHIgKz0gTEVOR1RIX0FNU0RVX1NVQkZSQU1FSEVBRDsKLQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF9BTVNEVV9TVUJGUkFNRUhFQUQ7Ci0KLQotCQkvLwotCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCS8vCi0JCUVYVFJBX0xMQ1NOQVBfRU5DQVBfRlJPTV9QS1RfT0ZGU0VUKHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCi0JCXN1YkZyYW1lUGF5bG9hZExlbiA9IHBUeEJsay0+U3JjQnVmTGVuOwotCi0JCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuICs9IExFTkdUSF84MDJfMV9IOwotCQkJc3ViRnJhbWVQYXlsb2FkTGVuICs9IExFTkdUSF84MDJfMV9IOwotCQl9Ci0KLQkJLy8gdXBkYXRlIHN1YkZyYW1lIExlbmd0aCBmaWVsZAotCQlzdWJGcmFtZUhlYWRlclsxMl0gPSAoc3ViRnJhbWVQYXlsb2FkTGVuICYgMHhGRjAwKSA+PiA4OwotCQlzdWJGcmFtZUhlYWRlclsxM10gPSBzdWJGcmFtZVBheWxvYWRMZW4gJiAweEZGOwotCi0JCXRvdGFsTVBEVVNpemUgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuICsgcFR4QmxrLT5TcmNCdWZMZW47Ci0KLQkJaWYgKGZyYW1lTnVtID09MCkKLQkJCUZpcnN0VHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7Ci0JCWVsc2UKLQkJCUxhc3RUeElkeCA9IEhBTF9Xcml0ZU11bHRpVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhbWVOdW0sICZGcmVlTnVtYmVyKTsKLQotCQlmcmFtZU51bSsrOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0JCS8vIGNhbGN1bGF0ZSBUcmFuc21pdHRlZCBBTVNEVSBDb3VudCBhbmQgQnl0ZUNvdW50Ci0JCXsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRBTVNEVUNvdW50LnUuTG93UGFydCArKzsKLQkJCXBBZC0+UmFsaW5rQ291bnRlcnMuVHJhbnNtaXR0ZWRPY3RldHNJbkFNU0RVLlF1YWRQYXJ0ICs9IHRvdGFsTVBEVVNpemU7Ci0JCX0KLQotCX0KLQotCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7Ci0JSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOwotCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0gICAgICAgIGlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKLX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotVk9JRCBTVEFfTGVnYWN5X0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCi17Ci0JSEVBREVSXzgwMl8xMQkqcEhlYWRlcl84MDJfMTE7Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQotCUFTU0VSVChwVHhCbGspOwotCi0KLQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7Ci0JcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JewotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwVHhCbGstPlR4RnJhbWVUeXBlID09IFRYX01DQVNUX0ZSQU1FKQotCXsKLQkJSU5DX0NPVU5URVI2NChwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQpOwotCX0KLQotCWlmIChSVE1QX0dFVF9QQUNLRVRfUlRTKHBUeEJsay0+cFBhY2tldCkpCi0JCVRYX0JMS19TRVRfRkxBRyhwVHhCbGssIGZUWF9iUnRzUmVxdWlyZWQpOwotCWVsc2UKLQkJVFhfQkxLX0NMRUFSX0ZMQUcocFR4QmxrLCBmVFhfYlJ0c1JlcXVpcmVkKTsKLQotCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwotCi0JaWYgKHBUeEJsay0+VHhSYXRlIDwgcEFkLT5Db21tb25DZmcuTWluVHhSYXRlKQotCQlwVHhCbGstPlR4UmF0ZSA9IHBBZC0+Q29tbW9uQ2ZnLk1pblR4UmF0ZTsKLQotCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKLQotCi0JLy8gc2tpcCA4MDIuMyBoZWFkZXIKLQlwVHhCbGstPnBTcmNCdWZEYXRhID0gcFR4QmxrLT5wU3JjQnVmSGVhZGVyICsgTEVOR1RIXzgwMl8zOwotCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQkvLyBza2lwIHZsYW4gdGFnCi0JaWYgKGJWTEFOUGt0KQotCXsKLQkJcFR4QmxrLT5wU3JjQnVmRGF0YQkrPSBMRU5HVEhfODAyXzFROwotCQlwVHhCbGstPlNyY0J1ZkxlbgktPSBMRU5HVEhfODAyXzFROwotCX0KLQotCXBIZWFkZXJCdWZQdHIgPSAmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkUgKyBUWFdJX1NJWkVdOwotCXBIZWFkZXJfODAyXzExID0gKEhFQURFUl84MDJfMTEgKikgcEhlYWRlckJ1ZlB0cjsKLQotCS8vIHNraXAgY29tbW9uIGhlYWRlcgotCXBIZWFkZXJCdWZQdHIgKz0gcFR4QmxrLT5NcGR1SGVhZGVyTGVuOwotCi0JaWYgKFRYX0JMS19URVNUX0ZMQUcocFR4QmxrLCBmVFhfYldNTSkpCi0JewotCQkvLwotCQkvLyBidWlsZCBRT1MgQ29udHJvbCBieXRlcwotCQkvLwotCQkqKHBIZWFkZXJCdWZQdHIpID0gKChwVHhCbGstPlVzZXJQcmlvcml0eSAmIDB4MEYpIHwgKHBBZC0+Q29tbW9uQ2ZnLkFja1BvbGljeVtwVHhCbGstPlF1ZUlkeF08PDUpKTsKLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7Ci0JCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwotCX0KLQotCS8vIFRoZSByZW1haW5pbmcgY29udGVudCBvZiBNUERVIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpcEhlYWRlckJ1ZlB0cjsKLQlwSGVhZGVyQnVmUHRyID0gKFBVQ0hBUikgUk9VTkRfVVAocEhlYWRlckJ1ZlB0ciwgNCk7Ci0JcFR4QmxrLT5IZHJQYWRMZW4gPSAoVUxPTkcpKHBIZWFkZXJCdWZQdHIgLSBwVHhCbGstPkhkclBhZExlbik7Ci0KLQl7Ci0KLQkJLy8KLQkJLy8gSW5zZXJ0IExMQy1TTkFQIGVuY2Fwc3VsYXRpb24gLSA4IG9jdGV0cwotCQkvLwotCQkvLwotCQkvLyBpZiBvcmlnaW5hbCBFdGhlcm5ldCBmcmFtZSBjb250YWlucyBubyBMTEMvU05BUCwKLQkJLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAotCQkvLwotCQlFWFRSQV9MTENTTkFQX0VOQ0FQX0ZST01fUEtUX1NUQVJUKHBUeEJsay0+cFNyY0J1ZkhlYWRlciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApOwotCQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JCXsKLQkJCVVDSEFSIHZsYW5fc2l6ZTsKLQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJLy8gc2tpcCB2bGFuIHRhZwotCQkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKLQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyKzEyK3ZsYW5fc2l6ZSwgMik7Ci0JCQlwSGVhZGVyQnVmUHRyICs9IDI7Ci0JCQlwVHhCbGstPk1wZHVIZWFkZXJMZW4gKz0gTEVOR1RIXzgwMl8xX0g7Ci0JCX0KLQotCX0KLQotCS8vCi0JLy8gcHJlcGFyZSBmb3IgVFhXSQotCS8vIHVzZSBXY2lkIGFzIEtleSBJbmRleAotCS8vCi0KLQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCi0JLy9GcmVlTnVtYmVyID0gR0VUX1RYUklOR19GUkVFTk8ocEFkLCBRdWVJZHgpOwotCi0JSEFMX1dyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgVFJVRSwgJkZyZWVOdW1iZXIpOwotCi0JcEFkLT5SYWxpbmtDb3VudGVycy5LaWNrVHhDb3VudCsrOwotCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCS8vCi0JLy8gS2ljayBvdXQgVHgKLQkvLwotCWlmICghUlRNUF9URVNUX1BTRkxBRyhwQWQsIGZSVE1QX1BTX0RJU0FCTEVfVFgpKQotCUhBTF9LaWNrT3V0VHgocEFkLCBwVHhCbGssIHBUeEJsay0+UXVlSWR4KTsKLX0KLQotCi1WT0lEIFNUQV9BUmFsaW5rX0ZyYW1lX1R4KAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVRYX0JMSwkJCSpwVHhCbGspCi17Ci0JUFVDSEFSCQkJcEhlYWRlckJ1ZlB0cjsKLQlVU0hPUlQJCQlGcmVlTnVtYmVyOwotCVVTSE9SVAkJCXRvdGFsTVBEVVNpemU9MDsKLQlVU0hPUlQJCQlGaXJzdFR4LCBMYXN0VHhJZHg7Ci0JaW50CQkJZnJhbWVOdW0gPSAwOwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQotCi0JQVNTRVJUKHBUeEJsayk7Ci0KLQlBU1NFUlQoKHBUeEJsay0+VHhQYWNrZXRMaXN0Lk51bWJlcj09IDIpKTsKLQotCi0JRmlyc3RUeCA9IExhc3RUeElkeCA9IDA7ICAvLyBJcyBpdCBvayBpbml0IHRoZXkgYXMgMD8KLQl3aGlsZShwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkKQotCXsKLQkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCQlwVHhCbGstPnBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFFFbnRyeSk7Ci0KLQkJaWYgKFJUTVBfRmlsbFR4QmxrSW5mbyhwQWQsIHBUeEJsaykgIT0gVFJVRSkKLQkJewotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChwQWQsIHBUeEJsay0+cFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWJWTEFOUGt0ID0gKFJUTVBfR0VUX1BBQ0tFVF9WTEFOKHBUeEJsay0+cFBhY2tldCkgPyBUUlVFIDogRkFMU0UpOwotCi0JCS8vIHNraXAgODAyLjMgaGVhZGVyCi0JCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JCXBUeEJsay0+U3JjQnVmTGVuICAtPSBMRU5HVEhfODAyXzM7Ci0KLQkJLy8gc2tpcCB2bGFuIHRhZwotCQlpZiAoYlZMQU5Qa3QpCi0JCXsKLQkJCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJCXBUeEJsay0+U3JjQnVmTGVuCS09IExFTkdUSF84MDJfMVE7Ci0JCX0KLQotCQlpZiAoZnJhbWVOdW0gPT0gMCkKLQkJewkvLyBGb3IgZmlyc3QgZnJhbWUsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyICsgcGFkZGluZyhvcHRpb25hbCkgKyBSQS1BR0ctTEVOICsgU05BUCBIZWFkZXIKLQotCQkJcEhlYWRlckJ1ZlB0ciA9IFNUQV9CdWlsZF9BUmFsaW5rX0ZyYW1lX0hlYWRlcihwQWQsIHBUeEJsayk7Ci0KLQkJCS8vIEl0J3Mgb2sgd3JpdGUgdGhlIFR4V0kgaGVyZSwgYmVjYXVzZSB0aGUgVHhXSS0+TVBEVXRvdGFsQnl0ZUNvdW50Ci0JCQkvLwl3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgZmluYWwgZnJhbWUgd2FzIGhhbmRsZWQuCi0JCQlSVE1QV3JpdGVUeFdJX0RhdGEocEFkLCAoUFRYV0lfU1RSVUMpKCZwVHhCbGstPkhlYWRlckJ1ZltUWElORk9fU0laRV0pLCBwVHhCbGspOwotCi0KLQkJCS8vCi0JCQkvLyBJbnNlcnQgTExDLVNOQVAgZW5jYXBzdWxhdGlvbiAtIDggb2N0ZXRzCi0JCQkvLwotCQkJRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9PRkZTRVQocFR4QmxrLT5wU3JjQnVmRGF0YS0yLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCk7Ci0KLQkJCWlmIChwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCwgNik7Ci0JCQkJcEhlYWRlckJ1ZlB0ciArPSA2OwotCQkJCS8vIGdldCAyIG9jdGV0cyAoVHlwZW9mTGVuKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkRhdGEtMiwgMik7Ci0JCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsJLy8gRm9yIHNlY29uZCBhZ2dyZWdhdGVkIGZyYW1lLCB3ZSBuZWVkIGNyZWF0ZSB0aGUgODAyLjMgaGVhZGVyIHRvIGhlYWRlckJ1ZiwgYmVjYXVzZSBQQ0kgd2lsbCBjb3B5IGl0IHRvIFNEUHRyMC4KLQotCQkJcEhlYWRlckJ1ZlB0ciA9ICZwVHhCbGstPkhlYWRlckJ1ZlswXTsKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiA9IDA7Ci0KLQkJCS8vIEEtUmFsaW5rIHN1Yi1zZXF1ZW50IGZyYW1lIGhlYWRlciBpcyB0aGUgc2FtZSBhcyA4MDIuMyBoZWFkZXIuCi0JCQkvLyAgIERBKDYpK1NBKDYpK0ZyYW1lVHlwZSgyKQotCQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wU3JjQnVmSGVhZGVyLCAxMik7Ci0JCQlwSGVhZGVyQnVmUHRyICs9IDEyOwotCQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCQlOZGlzTW92ZU1lbW9yeShwSGVhZGVyQnVmUHRyLCBwVHhCbGstPnBTcmNCdWZEYXRhLTIsIDIpOwotCQkJcEhlYWRlckJ1ZlB0ciArPSAyOwotCQkJcFR4QmxrLT5NcGR1SGVhZGVyTGVuID0gTEVOR1RIX0FSQUxJTktfU1VCRlJBTUVIRUFEOwotCQl9Ci0KLQkJdG90YWxNUERVU2l6ZSArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW4gKyBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCQkvL0ZyZWVOdW1iZXIgPSBHRVRfVFhSSU5HX0ZSRUVOTyhwQWQsIFF1ZUlkeCk7Ci0JCWlmIChmcmFtZU51bSA9PTApCi0JCQlGaXJzdFR4ID0gSEFMX1dyaXRlTXVsdGlUeFJlc291cmNlKHBBZCwgcFR4QmxrLCBmcmFtZU51bSwgJkZyZWVOdW1iZXIpOwotCQllbHNlCi0JCQlMYXN0VHhJZHggPSBIQUxfV3JpdGVNdWx0aVR4UmVzb3VyY2UocEFkLCBwVHhCbGssIGZyYW1lTnVtLCAmRnJlZU51bWJlcik7Ci0KLQkJZnJhbWVOdW0rKzsKLQotCQlwQWQtPlJhbGlua0NvdW50ZXJzLk9uZVNlY1R4QWdncmVnYXRpb25Db3VudCsrOwotCQlwQWQtPlJhbGlua0NvdW50ZXJzLktpY2tUeENvdW50Kys7Ci0JCXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjVHhEb25lQ291bnQrKzsKLQotCX0KLQotCUhBTF9GaW5hbFdyaXRlVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgdG90YWxNUERVU2l6ZSwgRmlyc3RUeCk7Ci0JSEFMX0xhc3RUeElkeChwQWQsIHBUeEJsay0+UXVlSWR4LCBMYXN0VHhJZHgpOwotCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0JaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0JSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwotCi19Ci0KLQotVk9JRCBTVEFfRnJhZ21lbnRfRnJhbWVfVHgoCi0JSU4gUlRNUF9BREFQVEVSICpwQWQsCi0JSU4gVFhfQkxLCQkqcFR4QmxrKQotewotCUhFQURFUl84MDJfMTEJKnBIZWFkZXJfODAyXzExOwotCVBVQ0hBUgkJCXBIZWFkZXJCdWZQdHI7Ci0JVVNIT1JUCQkJRnJlZU51bWJlcjsKLQlVQ0hBUgkJCWZyYWdOdW0gPSAwOwotCVBBQ0tFVF9JTkZPCQlQYWNrZXRJbmZvOwotCVVTSE9SVAkJCUVuY3J5cHRpb25PdmVyaGVhZCA9IDA7Ci0JVUlOVDMyCQkJRnJlZU1wZHVTaXplLCBTcmNSZW1haW5pbmdCeXRlczsKLQlVU0hPUlQJCQlBY2tEdXJhdGlvbjsKLQlVSU5UCQkJTmV4dE1wZHVTaXplOwotCUJPT0xFQU4JCQliVkxBTlBrdDsKLQlQUVVFVUVfRU5UUlkJcFFFbnRyeTsKLQlIVFRSQU5TTUlUX1NFVFRJTkcJKnBUcmFuc21pdDsKLQotCi0JQVNTRVJUKHBUeEJsayk7Ci0KLQlwUUVudHJ5ID0gUmVtb3ZlSGVhZFF1ZXVlKCZwVHhCbGstPlR4UGFja2V0TGlzdCk7Ci0JcFR4QmxrLT5wUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCWlmIChSVE1QX0ZpbGxUeEJsa0luZm8ocEFkLCBwVHhCbGspICE9IFRSVUUpCi0JewotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFR4QmxrLT5wUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJcmV0dXJuOwotCX0KLQotCUFTU0VSVChUWF9CTEtfVEVTVF9GTEFHKHBUeEJsaywgZlRYX2JBbGxvd0ZyYWcpKTsKLQliVkxBTlBrdCA9IChSVE1QX0dFVF9QQUNLRVRfVkxBTihwVHhCbGstPnBQYWNrZXQpID8gVFJVRSA6IEZBTFNFKTsKLQotCVNUQUZpbmRDaXBoZXJBbGdvcml0aG0ocEFkLCBwVHhCbGspOwotCVNUQUJ1aWxkQ29tbW9uODAyXzExSGVhZGVyKHBBZCwgcFR4QmxrKTsKLQotCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQl7Ci0JCXBUeEJsay0+cFBhY2tldCA9IGR1cGxpY2F0ZV9wa3Rfd2l0aF9US0lQX01JQyhwQWQsIHBUeEJsay0+cFBhY2tldCk7Ci0JCWlmIChwVHhCbGstPnBQYWNrZXQgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJUlRNUF9RdWVyeVBhY2tldEluZm8ocFR4QmxrLT5wUGFja2V0LCAmUGFja2V0SW5mbywgJnBUeEJsay0+cFNyY0J1ZkhlYWRlciwgJnBUeEJsay0+U3JjQnVmTGVuKTsKLQl9Ci0KLQkvLyBza2lwIDgwMi4zIGhlYWRlcgotCXBUeEJsay0+cFNyY0J1ZkRhdGEgPSBwVHhCbGstPnBTcmNCdWZIZWFkZXIgKyBMRU5HVEhfODAyXzM7Ci0JcFR4QmxrLT5TcmNCdWZMZW4gIC09IExFTkdUSF84MDJfMzsKLQotCi0JLy8gc2tpcCB2bGFuIHRhZwotCWlmIChiVkxBTlBrdCkKLQl7Ci0JCXBUeEJsay0+cFNyY0J1ZkRhdGEJKz0gTEVOR1RIXzgwMl8xUTsKLQkJcFR4QmxrLT5TcmNCdWZMZW4JLT0gTEVOR1RIXzgwMl8xUTsKLQl9Ci0KLQlwSGVhZGVyQnVmUHRyID0gJnBUeEJsay0+SGVhZGVyQnVmW1RYSU5GT19TSVpFICsgVFhXSV9TSVpFXTsKLQlwSGVhZGVyXzgwMl8xMSA9IChIRUFERVJfODAyXzExICopcEhlYWRlckJ1ZlB0cjsKLQotCi0JLy8gc2tpcCBjb21tb24gaGVhZGVyCi0JcEhlYWRlckJ1ZlB0ciArPSBwVHhCbGstPk1wZHVIZWFkZXJMZW47Ci0KLQlpZiAoVFhfQkxLX1RFU1RfRkxBRyhwVHhCbGssIGZUWF9iV01NKSkKLQl7Ci0JCS8vCi0JCS8vIGJ1aWxkIFFPUyBDb250cm9sIGJ5dGVzCi0JCS8vCi0JCSpwSGVhZGVyQnVmUHRyID0gKHBUeEJsay0+VXNlclByaW9yaXR5ICYgMHgwRik7Ci0KLQkJKihwSGVhZGVyQnVmUHRyKzEpID0gMDsKLQkJcEhlYWRlckJ1ZlB0ciArPTI7Ci0JCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSAyOwotCX0KLQotCS8vCi0JLy8gcGFkZGluZyBhdCBmcm9udCBvZiBMTEMgaGVhZGVyCi0JLy8gTExDIGhlYWRlciBzaG91bGQgbG9jYXRlIGF0IDQtb2N0ZXRzIGFsaWdtZW50Ci0JLy8KLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORylwSGVhZGVyQnVmUHRyOwotCXBIZWFkZXJCdWZQdHIgPSAoUFVDSEFSKSBST1VORF9VUChwSGVhZGVyQnVmUHRyLCA0KTsKLQlwVHhCbGstPkhkclBhZExlbiA9IChVTE9ORykocEhlYWRlckJ1ZlB0ciAtIHBUeEJsay0+SGRyUGFkTGVuKTsKLQotCi0KLQkvLwotCS8vIEluc2VydCBMTEMtU05BUCBlbmNhcHN1bGF0aW9uIC0gOCBvY3RldHMKLQkvLwotCS8vCi0JLy8gaWYgb3JpZ2luYWwgRXRoZXJuZXQgZnJhbWUgY29udGFpbnMgbm8gTExDL1NOQVAsCi0JLy8gdGhlbiBhbiBleHRyYSBMTEMvU05BUCBlbmNhcCBpcyByZXF1aXJlZAotCS8vCi0JRVhUUkFfTExDU05BUF9FTkNBUF9GUk9NX1BLVF9TVEFSVChwVHhCbGstPnBTcmNCdWZIZWFkZXIsIHBUeEJsay0+cEV4dHJhTGxjU25hcEVuY2FwKTsKLQlpZiAocFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXApCi0JewotCQlVQ0hBUiB2bGFuX3NpemU7Ci0KLQkJTmRpc01vdmVNZW1vcnkocEhlYWRlckJ1ZlB0ciwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIDYpOwotCQlwSGVhZGVyQnVmUHRyICs9IDY7Ci0JCS8vIHNraXAgdmxhbiB0YWcKLQkJdmxhbl9zaXplID0gIChiVkxBTlBrdCkgPyBMRU5HVEhfODAyXzFRIDogMDsKLQkJLy8gZ2V0IDIgb2N0ZXRzIChUeXBlb2ZMZW4pCi0JCU5kaXNNb3ZlTWVtb3J5KHBIZWFkZXJCdWZQdHIsIHBUeEJsay0+cFNyY0J1ZkhlYWRlcisxMit2bGFuX3NpemUsIDIpOwotCQlwSGVhZGVyQnVmUHRyICs9IDI7Ci0JCXBUeEJsay0+TXBkdUhlYWRlckxlbiArPSBMRU5HVEhfODAyXzFfSDsKLQl9Ci0KLQotCS8vIElmIFRLSVAgaXMgdXNlZCBhbmQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZC4gRHJpdmVyIGhhcyB0bwotCS8vCWFwcGVuZCBUS0lQIE1JQyBhdCB0YWlsIG9mIHRoZSBzY2F0dGVyIGJ1ZmZlcgotCS8vCU1BQyBBU0lDIHdpbGwgb25seSBwZXJmb3JtIElWL0VJVi9JQ1YgaW5zZXJ0aW9uIGJ1dCBubyBUS0lQIE1JQwotCWlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUCkKLQl7Ci0JCVJUTVBDYWxjdWxhdGVNSUNWYWx1ZShwQWQsIHBUeEJsay0+cFBhY2tldCwgcFR4QmxrLT5wRXh0cmFMbGNTbmFwRW5jYXAsIHBUeEJsay0+cEtleSwgMCk7Ci0KLQkJLy8gTk9URTogRE9OJ1QgcmVmZXIgdGhlIHNrYi0+bGVuIGRpcmVjdGx5IGFmdGVyIGZvbGxvd2luZyBjb3B5LiBCZWNhc3VlIHRoZSBsZW5ndGggaXMgbm90IGFkanVzdAotCQkvLwkJCXRvIGNvcnJlY3QgbGVuZ2h0LCByZWZlciB0byBwVHhCbGstPlNyY0J1ZkxlbiBmb3IgdGhlIHBhY2tldCBsZW5ndGggaW4gZm9sbG93aW5nIHByb2dyZXNzLgotCQlOZGlzTW92ZU1lbW9yeShwVHhCbGstPnBTcmNCdWZEYXRhICsgcFR4QmxrLT5TcmNCdWZMZW4sICZwQWQtPlByaXZhdGVJbmZvLlR4Lk1JQ1swXSwgOCk7Ci0JCS8vc2tiX3B1dCgoUlRQS1RfVE9fT1NQS1QocFR4QmxrLT5wUGFja2V0KSktPnRhaWwsIDgpOwotCQlwVHhCbGstPlNyY0J1ZkxlbiArPSA4OwotCQlwVHhCbGstPlRvdGFsRnJhbWVMZW4gKz0gODsKLQkJcFR4QmxrLT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUF9OT19NSUM7Ci0JfQotCi0JLy8KLQkvLyBjYWxjdWF0ZSB0aGUgb3ZlcmhlYWQgYnl0ZXMgdGhhdCBlbmNyeXB0aW9uIGFsZ29yaXRobSBtYXkgYWRkLiBUaGlzCi0JLy8gYWZmZWN0cyB0aGUgY2FsY3VsYXRlIG9mICJkdXJhdGlvbiIgZmllbGQKLQkvLwotCWlmICgocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDY0KSB8fCAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1dFUDEyOCkpCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDg7IC8vV0VQOiBJVls0XSArIElDVls0XTsKLQllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfVEtJUF9OT19NSUMpCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDEyOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0sIE1JQyB3aWxsIGJlIGFkZGVkIHRvIFRvdGFsUGFja2V0TGVuZ3RoCi0JZWxzZSBpZiAocFR4QmxrLT5DaXBoZXJBbGcgPT0gQ0lQSEVSX1RLSVApCi0JCUVuY3J5cHRpb25PdmVyaGVhZCA9IDIwOy8vVEtJUDogSVZbNF0gKyBFSVZbNF0gKyBJQ1ZbNF0gKyBNSUNbOF0KLQllbHNlIGlmIChwVHhCbGstPkNpcGhlckFsZyA9PSBDSVBIRVJfQUVTKQotCQlFbmNyeXB0aW9uT3ZlcmhlYWQgPSAxNjsJLy8gQUVTOiBJVls0XSArIEVJVls0XSArIE1JQ1s4XQotCWVsc2UKLQkJRW5jcnlwdGlvbk92ZXJoZWFkID0gMDsKLQotCXBUcmFuc21pdCA9IHBUeEJsay0+cFRyYW5zbWl0OwotCS8vIERlY2lkZSB0aGUgVFggcmF0ZQotCWlmIChwVHJhbnNtaXQtPmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCi0JCXBUeEJsay0+VHhSYXRlID0gcFRyYW5zbWl0LT5maWVsZC5NQ1M7Ci0JZWxzZSBpZiAocFRyYW5zbWl0LT5maWVsZC5NT0RFID09IE1PREVfT0ZETSkKLQkJcFR4QmxrLT5UeFJhdGUgPSBwVHJhbnNtaXQtPmZpZWxkLk1DUyArIFJBVEVfRklSU1RfT0ZETV9SQVRFOwotCWVsc2UKLQkJcFR4QmxrLT5UeFJhdGUgPSBSQVRFXzZfNTsKLQotCS8vIGRlY2lkZSBob3cgbXVjaCB0aW1lIGFuIEFDSy9DVFMgZnJhbWUgd2lsbCBjb25zdW1lIGluIHRoZSBhaXIKLQlpZiAocFR4QmxrLT5UeFJhdGUgPD0gUkFURV9MQVNUX09GRE1fUkFURSkKLQkJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgcEFkLT5Db21tb25DZmcuRXhwZWN0ZWRBQ0tSYXRlW3BUeEJsay0+VHhSYXRlXSwgMTQpOwotCWVsc2UKLQkJQWNrRHVyYXRpb24gPSBSVE1QQ2FsY0R1cmF0aW9uKHBBZCwgUkFURV82XzUsIDE0KTsKLQotCS8vIEluaXQgdGhlIHRvdGFsIHBheWxvYWQgbGVuZ3RoIG9mIHRoaXMgZnJhbWUuCi0JU3JjUmVtYWluaW5nQnl0ZXMgPSBwVHhCbGstPlNyY0J1ZkxlbjsKLQotCXBUeEJsay0+VG90YWxGcmFnTnVtID0gMHhmZjsKLQotCWRvIHsKLQotCQlGcmVlTXBkdVNpemUgPSBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZCAtIExFTkdUSF9DUkM7Ci0KLQkJRnJlZU1wZHVTaXplIC09IHBUeEJsay0+TXBkdUhlYWRlckxlbjsKLQotCQlpZiAoU3JjUmVtYWluaW5nQnl0ZXMgPD0gRnJlZU1wZHVTaXplKQotCQl7CS8vIHRoaXMgaXMgdGhlIGxhc3Qgb3Igb25seSBmcmFnbWVudAotCi0JCQlwVHhCbGstPlNyY0J1ZkxlbiA9IFNyY1JlbWFpbmluZ0J5dGVzOwotCi0JCQlwSGVhZGVyXzgwMl8xMS0+RkMuTW9yZUZyYWcgPSAwOwotCQkJcEhlYWRlcl84MDJfMTEtPkR1cmF0aW9uID0gcEFkLT5Db21tb25DZmcuRHNpZnMgKyBBY2tEdXJhdGlvbjsKLQotCQkJLy8gSW5kaWNhdGUgdGhlIGxvd2VyIGxheWVyIHRoYXQgdGhpcydzIHRoZSBsYXN0IGZyYWdtZW50LgotCQkJcFR4QmxrLT5Ub3RhbEZyYWdOdW0gPSBmcmFnTnVtOwotCQl9Ci0JCWVsc2UKLQkJewkvLyBtb3JlIGZyYWdtZW50IGlzIHJlcXVpcmVkCi0KLQkJCXBUeEJsay0+U3JjQnVmTGVuID0gRnJlZU1wZHVTaXplOwotCi0JCQlOZXh0TXBkdVNpemUgPSBtaW4oKChVSU5UKVNyY1JlbWFpbmluZ0J5dGVzIC0gcFR4QmxrLT5TcmNCdWZMZW4pLCAoKFVJTlQpcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQpKTsKLQkJCXBIZWFkZXJfODAyXzExLT5GQy5Nb3JlRnJhZyA9IDE7Ci0JCQlwSGVhZGVyXzgwMl8xMS0+RHVyYXRpb24gPSAoMyAqIHBBZC0+Q29tbW9uQ2ZnLkRzaWZzKSArICgyICogQWNrRHVyYXRpb24pICsgUlRNUENhbGNEdXJhdGlvbihwQWQsIHBUeEJsay0+VHhSYXRlLCBOZXh0TXBkdVNpemUgKyBFbmNyeXB0aW9uT3ZlcmhlYWQpOwotCQl9Ci0KLQkJaWYgKGZyYWdOdW0gPT0gMCkKLQkJCXBUeEJsay0+RnJhbWVHYXAgPSBJRlNfSFRUWE9QOwotCQllbHNlCi0JCQlwVHhCbGstPkZyYW1lR2FwID0gSUZTX1NJRlM7Ci0KLQkJUlRNUFdyaXRlVHhXSV9EYXRhKHBBZCwgKFBUWFdJX1NUUlVDKSgmcFR4QmxrLT5IZWFkZXJCdWZbVFhJTkZPX1NJWkVdKSwgcFR4QmxrKTsKLQotCQlIQUxfV3JpdGVGcmFnVHhSZXNvdXJjZShwQWQsIHBUeEJsaywgZnJhZ051bSwgJkZyZWVOdW1iZXIpOwotCi0JCXBBZC0+UmFsaW5rQ291bnRlcnMuS2lja1R4Q291bnQrKzsKLQkJcEFkLT5SYWxpbmtDb3VudGVycy5PbmVTZWNUeERvbmVDb3VudCsrOwotCi0JCS8vIFVwZGF0ZSB0aGUgZnJhbWUgbnVtYmVyLCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgTkRJUyBwYWNrZXQgcGF5bG9hZC4KLQotCQkvLyBzcGFjZSBmb3IgODAyLjExIGhlYWRlci4KLQkJaWYgKGZyYWdOdW0gPT0gMCAmJiBwVHhCbGstPnBFeHRyYUxsY1NuYXBFbmNhcCkKLQkJCXBUeEJsay0+TXBkdUhlYWRlckxlbiAtPSBMRU5HVEhfODAyXzFfSDsKLQotCQlmcmFnTnVtKys7Ci0JCVNyY1JlbWFpbmluZ0J5dGVzIC09IHBUeEJsay0+U3JjQnVmTGVuOwotCQlwVHhCbGstPnBTcmNCdWZEYXRhICs9IHBUeEJsay0+U3JjQnVmTGVuOwotCi0JCXBIZWFkZXJfODAyXzExLT5GcmFnKys7CSAvLyBpbmNyZWFzZSBGcmFnICMKLQotCX13aGlsZShTcmNSZW1haW5pbmdCeXRlcyA+IDApOwotCi0JLy8KLQkvLyBLaWNrIG91dCBUeAotCS8vCi0JaWYgKCFSVE1QX1RFU1RfUFNGTEFHKHBBZCwgZlJUTVBfUFNfRElTQUJMRV9UWCkpCi0JSEFMX0tpY2tPdXRUeChwQWQsIHBUeEJsaywgcFR4QmxrLT5RdWVJZHgpOwotfQotCi0KLSNkZWZpbmUgUkVMRUFTRV9GUkFNRVNfT0ZfVFhCTEsoX3BBZCwgX3BUeEJsaywgX3BRRW50cnksIF9TdGF0dXMpCQkJCQkJCQkJCVwKLQkJd2hpbGUoX3BUeEJsay0+VHhQYWNrZXRMaXN0LkhlYWQpCQkJCQkJCQkJCQkJCQlcCi0JCXsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAotCQkJX3BRRW50cnkgPSBSZW1vdmVIZWFkUXVldWUoJl9wVHhCbGstPlR4UGFja2V0TGlzdCk7CQkJCQkJCQkJXAotCQkJUkVMRUFTRV9ORElTX1BBQ0tFVChfcEFkLCBRVUVVRV9FTlRSWV9UT19QQUNLRVQoX3BRRW50cnkpLCBfU3RhdHVzKTsJXAotCQl9Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCVJvdXRpbmUgRGVzY3JpcHRpb246Ci0JCUNvcHkgZnJhbWUgZnJvbSB3YWl0aW5nIHF1ZXVlIGludG8gcmVsYXRpdmUgcmluZyBidWZmZXIgYW5kIHNldAotCWFwcHJvcHJpYXRlIEFTSUMgcmVnaXN0ZXIgdG8ga2ljayBoYXJkd2FyZSBlbmNyeXB0aW9uIGJlZm9yZSByZWFsbHkKLQlzZW50IG91dCB0byBhaXIuCi0KLQlBcmd1bWVudHM6Ci0JCXBBZAlQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0JCVBORElTX1BBQ0tFVAlQb2ludGVyIHRvIG91dGdvaW5nIE5kaXMgZnJhbWUKLQkJTnVtYmVyT2ZGcmFnCU51bWJlciBvZiBmcmFnbWVudCByZXF1aXJlZAotCi0JUmV0dXJuIFZhbHVlOgotCQlOb25lCi0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotCU5vdGU6Ci0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1ORElTX1NUQVRVUyBTVEFIYXJkVHJhbnNtaXQoCi0JSU4gUFJUTVBfQURBUFRFUglwQWQsCi0JSU4gVFhfQkxLCQkJKnBUeEJsaywKLQlJTglVQ0hBUgkJCVF1ZUlkeCkKLXsKLQlORElTX1BBQ0tFVAkJKnBQYWNrZXQ7Ci0JUFFVRVVFX0VOVFJZCXBRRW50cnk7Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTVEVQIDAuIERPIFNBTklUWSBDSEVDSyBBTkQgU09NRSBFQVJMWSBQUkVQQVJBVElPTi4KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLwotCUFTU0VSVChwVHhCbGstPlR4UGFja2V0TGlzdC5OdW1iZXIpOwotCWlmIChwVHhCbGstPlR4UGFja2V0TGlzdC5IZWFkID09IE5VTEwpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJwVHhCbGstPlRvdGFsRnJhbWVOdW0gPT0gJWxkIVxuIiwgcFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKSk7Ci0JCXJldHVybiBORElTX1NUQVRVU19GQUlMVVJFOwotCX0KLQotCXBQYWNrZXQgPSBRVUVVRV9FTlRSWV9UT19QQUNLRVQocFR4QmxrLT5UeFBhY2tldExpc3QuSGVhZCk7Ci0KLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIFNURVAgMS4gV0FLRSBVUCBQSFkKLQkvLwkJb3V0Z29pbmcgZnJhbWUgYWx3YXlzIHdha2V1cCBQSFkgdG8gcHJldmVudCBmcmFtZSBsb3N0IGFuZAotCS8vCQl0dXJuIG9mZiBQU00gYml0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBub3QgdG8gY2hhbmdlIFBTTSBiaXQsIGp1c3Qgc2VuZCB0aGlzIGZyYW1lIG91dD8KLQlpZiAoKHBBZC0+U3RhQ2ZnLlBzbSA9PSBQV1JfU0FWRSkgJiYgT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQl7Ci0JICAgIERCR1BSSU5UX1JBVyhSVF9ERUJVR19JTkZPLCAoIkFzaWNGb3JjZVdha2V1cCBBdCBIYXJkVHhcbiIpKTsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJQXNpY0ZvcmNlV2FrZXVwKHBBZCwgVFJVRSk7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JfQotCi0JLy8gSXQgc2hvdWxkIG5vdCBjaGFuZ2UgUFNNIGJpdCwgd2hlbiBBUFNEIHR1cm4gb24uCi0JaWYgKCghKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSAmJiBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLmJBUFNEQ2FwYWJsZSkgJiYgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUgPT0gRkFMU0UpKQotCQl8fCAoUlRNUF9HRVRfUEFDS0VUX0VBUE9MKHBUeEJsay0+cFBhY2tldCkpCi0JCXx8IChSVE1QX0dFVF9QQUNLRVRfV0FJKHBUeEJsay0+cFBhY2tldCkpKQotCXsKLQkJaWYgKChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpICYmCi0gICAgICAgICAgICAocEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1ApKQotCQkJUlRNUF9TRVRfUFNNX0JJVChwQWQsIFBXUl9BQ1RJVkUpOwotCX0KLQotCXN3aXRjaCAocFR4QmxrLT5UeEZyYW1lVHlwZSkKLQl7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWNhc2UgVFhfQU1QRFVfRlJBTUU6Ci0JCQkJU1RBX0FNUERVX0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKLQkJCWJyZWFrOwotCQljYXNlIFRYX0FNU0RVX0ZSQU1FOgotCQkJCVNUQV9BTVNEVV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJY2FzZSBUWF9MRUdBQ1lfRlJBTUU6Ci0JCQkJU1RBX0xlZ2FjeV9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9NQ0FTVF9GUkFNRToKLQkJCQlTVEFfTGVnYWN5X0ZyYW1lX1R4KHBBZCwgcFR4QmxrKTsKLQkJCWJyZWFrOwotCQljYXNlIFRYX1JBTElOS19GUkFNRToKLQkJCQlTVEFfQVJhbGlua19GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJY2FzZSBUWF9GUkFHX0ZSQU1FOgotCQkJCVNUQV9GcmFnbWVudF9GcmFtZV9UeChwQWQsIHBUeEJsayk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXsKLQkJCQkvLyBJdCBzaG91bGQgbm90IGhhcHBlbmVkIQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIlNlbmQgYSBwYWNla3Qgd2FzIG5vdCBjbGFzc2lmaWVkISEgSXQgc2hvdWxkIG5vdCBoYXBwZW4hXG4iKSk7Ci0JCQkJd2hpbGUocFR4QmxrLT5UeFBhY2tldExpc3QuTnVtYmVyKQotCQkJCXsKLQkJCQkJcFFFbnRyeSA9IFJlbW92ZUhlYWRRdWV1ZSgmcFR4QmxrLT5UeFBhY2tldExpc3QpOwotCQkJCQlwUGFja2V0ID0gUVVFVUVfRU5UUllfVE9fUEFDS0VUKHBRRW50cnkpOwotCQkJCQlpZiAocFBhY2tldCkKLQkJCQkJCVJFTEVBU0VfTkRJU19QQUNLRVQocEFkLCBwUGFja2V0LCBORElTX1NUQVRVU19GQUlMVVJFKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKE5ESVNfU1RBVFVTX1NVQ0NFU1MpOwotCi19Ci0KLVVMT05HICBIYXNoQnl0ZXNQb2x5bm9taWFsKFVDSEFSICp2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgIHVuc2lnbmVkIGNoYXIgKndvcmQgPSB2YWx1ZTsKLSAgIHVuc2lnbmVkIGludCByZXQgPSAwOwotICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgIGZvcihpPTA7IGkgPCBsZW47IGkrKykKLSAgIHsKLQkgIGludCBtb2QgPSBpICUgMzI7Ci0JICByZXQgXj0odW5zaWduZWQgaW50KSAod29yZFtpXSkgPDwgbW9kOwotCSAgcmV0IF49KHVuc2lnbmVkIGludCkgKHdvcmRbaV0pID4+ICgzMiAtIG1vZCk7Ci0gICB9Ci0gICByZXR1cm4gcmV0OwotfQotCi1WT0lEIFN0YV9Bbm5vdW5jZV9vcl9Gb3J3YXJkXzgwMl8zX1BhY2tldCgKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQTkRJU19QQUNLRVQJcFBhY2tldCwKLQlJTglVQ0hBUgkJCUZyb21XaGljaEJTU0lEKQotewotCWlmIChUUlVFCi0JCSkKLQl7Ci0JCWFubm91bmNlXzgwMl8zX3BhY2tldChwQWQsIHBQYWNrZXQpOwotCX0KLQllbHNlCi0JewotCQkvLyByZWxlYXNlIHBhY2tldAotCQlSRUxFQVNFX05ESVNfUEFDS0VUKHBBZCwgcFBhY2tldCwgTkRJU19TVEFUVVNfRkFJTFVSRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvc2FuaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zYW5pdHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkYTE1Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zYW5pdHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXNhbml0eS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obiBDaGFuZyAgMjAwNC0wOS0wMSAgICAgIGFkZCBXTU0gc3VwcG9ydAotKi8KLQotI2luY2x1ZGUgIi4uL3J0X2NvbmZpZy5oIgotCi0KLWV4dGVybiBVQ0hBUglDSVNDT19PVUlbXTsKLQotZXh0ZXJuIFVDSEFSCVdQQV9PVUlbXTsKLWV4dGVybiBVQ0hBUglSU05fT1VJW107Ci1leHRlcm4gVUNIQVIJV01FX0lORk9fRUxFTVtdOwotZXh0ZXJuIFVDSEFSCVdNRV9QQVJNX0VMRU1bXTsKLWV4dGVybiBVQ0hBUglDY3gyUW9zSW5mb1tdOwotZXh0ZXJuIFVDSEFSCVJBTElOS19PVUlbXTsKLWV4dGVybiBVQ0hBUglCUk9BRENPTV9PVUlbXTsKLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotQk9PTEVBTiBNbG1lU3RhcnRSZXFTYW5pdHkoCi0gICAgSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0gICAgSU4gVk9JRCAqTXNnLAotICAgIElOIFVMT05HIE1zZ0xlbiwKLSAgICBPVVQgQ0hBUiBTc2lkW10sCi0gICAgT1VUIFVDSEFSICpwU3NpZExlbikKLXsKLSAgICBNTE1FX1NUQVJUX1JFUV9TVFJVQ1QgKkluZm87Ci0KLSAgICBJbmZvID0gKE1MTUVfU1RBUlRfUkVRX1NUUlVDVCAqKShNc2cpOwotCi0gICAgaWYgKEluZm8tPlNzaWRMZW4gPiBNQVhfTEVOX09GX1NTSUQpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFTYW5pdHkgZmFpbCAtIHdyb25nIFNTSUQgbGVuZ3RoXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAqcFNzaWRMZW4gPSBJbmZvLT5Tc2lkTGVuOwotICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsIEluZm8tPlNzaWQsICpwU3NpZExlbik7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBNTE1FIG1lc3NhZ2Ugc2FuaXR5IGNoZWNrCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0KLSAgICBJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gUGVlckFzc29jUnNwU2FuaXR5KAotICAgIElOIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOIFZPSUQgKnBNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBVU0hPUlQgKnBDYXBhYmlsaXR5SW5mbywKLSAgICBPVVQgVVNIT1JUICpwU3RhdHVzLAotICAgIE9VVCBVU0hPUlQgKnBBaWQsCi0gICAgT1VUIFVDSEFSIFN1cFJhdGVbXSwKLSAgICBPVVQgVUNIQVIgKnBTdXBSYXRlTGVuLAotICAgIE9VVCBVQ0hBUiBFeHRSYXRlW10sCi0gICAgT1VUIFVDSEFSICpwRXh0UmF0ZUxlbiwKLSAgICBPVVQgSFRfQ0FQQUJJTElUWV9JRQkJKnBIdENhcGFiaWxpdHksCi0gICAgT1VUIEFERF9IVF9JTkZPX0lFCQkqcEFkZEh0SW5mbywJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0gICAgT1VUIFVDSEFSCQkJKnBIdENhcGFiaWxpdHlMZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBBZGRIdEluZm9MZW4sCi0gICAgT1VUIFVDSEFSCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0LAotICAgIE9VVCBQRURDQV9QQVJNIHBFZGNhUGFybSwKLSAgICBPVVQgVUNIQVIgKnBDa2lwRmxhZykKLXsKLSAgICBDSEFSICAgICAgICAgIEllVHlwZSwgKlB0cjsKLSAgICBQRlJBTUVfODAyXzExIHBGcmFtZSA9IChQRlJBTUVfODAyXzExKXBNc2c7Ci0gICAgUEVJRF9TVFJVQ1QgICBwRWlkOwotICAgIFVMT05HICAgICAgICAgTGVuZ3RoID0gMDsKLQotCSpwTmV3RXh0Q2hhbm5lbE9mZnNldCA9IDB4ZmY7Ci0JKnBIdENhcGFiaWxpdHlMZW4gPSAwOwotCSpwQWRkSHRJbmZvTGVuID0gMDsKLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotICAgIFB0ciA9IChQQ0hBUilwRnJhbWUtPk9jdGV0OwotICAgIExlbmd0aCArPSBMRU5HVEhfODAyXzExOwotCi0gICAgTmRpc01vdmVNZW1vcnkocENhcGFiaWxpdHlJbmZvLCAmcEZyYW1lLT5PY3RldFswXSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7Ci0gICAgTmRpc01vdmVNZW1vcnkocFN0YXR1cywgICAgICAgICAmcEZyYW1lLT5PY3RldFsyXSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7Ci0gICAgKnBDa2lwRmxhZyA9IDA7Ci0gICAgKnBFeHRSYXRlTGVuID0gMDsKLSAgICBwRWRjYVBhcm0tPmJWYWxpZCA9IEZBTFNFOwotCi0gICAgaWYgKCpwU3RhdHVzICE9IE1MTUVfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBOZGlzTW92ZU1lbW9yeShwQWlkLCAmcEZyYW1lLT5PY3RldFs0XSwgMik7Ci0gICAgTGVuZ3RoICs9IDI7Ci0KLSAgICAvLyBBaWQgYWxyZWFkeSBzd2FwZWQgYnl0ZSBvcmRlciBpbiBSVE1QRnJhbWVFbmRpYW5DaGFuZ2UoKSBmb3IgYmlnIGVuZGlhbiBwbGF0Zm9ybQotICAgICpwQWlkID0gKCpwQWlkKSAmIDB4M2ZmZjsgLy8gQUlEIGlzIGxvdyAxNC1iaXQKLQotICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFs2XTsKLSAgICAqcFN1cFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0WzddOwotICAgIGlmICgoSWVUeXBlICE9IElFX1NVUFBfUkFURVMpIHx8ICgqcFN1cFJhdGVMZW4gPiBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUykpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgZmFpbCAtIHdyb25nIFN1cHBvcnRlZFJhdGVzIElFXG4iKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBOZGlzTW92ZU1lbW9yeShTdXBSYXRlLCAmcEZyYW1lLT5PY3RldFs4XSwgKnBTdXBSYXRlTGVuKTsKLQotCi0gICAgTGVuZ3RoID0gTGVuZ3RoICsgMiArICpwU3VwUmF0ZUxlbjsKLQotICAgIC8vIG1hbnkgQVAgaW1wbGVtZW50IHByb3ByaWV0YXJ5IElFcyBpbiBub24tc3RhbmRhcmQgb3JkZXIsIHdlJ2QgYmV0dGVyCi0gICAgLy8gdG9sZXJhdGUgbWlzLW9yZGVyZWQgSUVzIHRvIGdldCBiZXN0IGNvbXBhdGliaWxpdHkKLSAgICBwRWlkID0gKFBFSURfU1RSVUNUKSAmcEZyYW1lLT5PY3RldFs4ICsgKCpwU3VwUmF0ZUxlbildOwotCi0gICAgLy8gZ2V0IHZhcmlhYmxlIGZpZWxkcyBmcm9tIHBheWxvYWQgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIKLSAgICB3aGlsZSAoKExlbmd0aCArIDIgKyBwRWlkLT5MZW4pIDw9IE1zZ0xlbikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAocEVpZC0+RWlkKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIElFX0VYVF9TVVBQX1JBVEVTOgotICAgICAgICAgICAgICAgIGlmIChwRWlkLT5MZW4gPD0gTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShFeHRSYXRlLCBwRWlkLT5PY3RldCwgcEVpZC0+TGVuKTsKLSAgICAgICAgICAgICAgICAgICAgKnBFeHRSYXRlTGVuID0gcEVpZC0+TGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgIGNhc2UgSUVfSFRfQ0FQOgotICAgICAgICAgICAgY2FzZSBJRV9IVF9DQVAyOgotCQkJaWYgKHBFaWQtPkxlbiA+PSBTSVpFX0hUX0NBUF9JRSkgIC8vTm90ZTogYWxsb3cgZXh0ZW5zaW9uLiEhCi0JCQl7Ci0JCQkJTmRpc01vdmVNZW1vcnkocEh0Q2FwYWJpbGl0eSwgcEVpZC0+T2N0ZXQsIFNJWkVfSFRfQ0FQX0lFKTsKLQotCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5IdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkh0Q2FwSW5mbykpOwotCQkJCSooVVNIT1JUICopKCZwSHRDYXBhYmlsaXR5LT5FeHRIdENhcEluZm8pID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBIdENhcGFiaWxpdHktPkV4dEh0Q2FwSW5mbykpOwotCi0JCQkJKnBIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0hUX0NBUC4gXG4iKSk7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgICAgICAgICBjYXNlIElFX0FERF9IVDoKLSAgICAgICAgICAgIGNhc2UgSUVfQUREX0hUMjoKLQkJCWlmIChwRWlkLT5MZW4gPj0gc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSkKLQkJCXsKLQkJCQkvLyBUaGlzIElFIGFsbG93cyBleHRlbnNpb24sIGJ1dCB3ZSBjYW4gaWdub3JlIGV4dHJhIGJ5dGVzIGJleW9uZCBvdXIga25vd2xlZGdlICwgc28gb25seQotCQkJCS8vIGNvcHkgZmlyc3Qgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKQotCQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGRIdEluZm8sIHBFaWQtPk9jdGV0LCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQotCQkJCSooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSA9IGNwdTJsZTE2KCooVVNIT1JUICopKCZwQWRkSHRJbmZvLT5BZGRIdEluZm8yKSk7Ci0JCQkJKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpID0gY3B1MmxlMTYoKihVU0hPUlQgKikoJnBBZGRIdEluZm8tPkFkZEh0SW5mbzMpKTsKLQotCQkJCSpwQWRkSHRJbmZvTGVuID0gU0laRV9BRERfSFRfSU5GT19JRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19XQVJOLCAoIlBlZXJBc3NvY1JzcFNhbml0eSAtIHdyb25nIElFX0FERF9IVC4gXG4iKSk7Ci0JCQl9Ci0KLQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElFX1NFQ09OREFSWV9DSF9PRkZTRVQ6Ci0JCQlpZiAocEVpZC0+TGVuID09IDEpCi0JCQl7Ci0JCQkJKnBOZXdFeHRDaGFubmVsT2Zmc2V0ID0gcEVpZC0+T2N0ZXRbMF07Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSB3cm9uZyBJRV9TRUNPTkRBUllfQ0hfT0ZGU0VULiBcbiIpKTsKLQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgSUVfVkVORE9SX1NQRUNJRklDOgotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBXTUUgUEFSQU1URVIgRUxFTUVOVAotICAgICAgICAgICAgICAgIGlmIChOZGlzRXF1YWxNZW1vcnkocEVpZC0+T2N0ZXQsIFdNRV9QQVJNX0VMRU0sIDYpICYmIChwRWlkLT5MZW4gPT0gMjQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUFVDSEFSIHB0cjsKLSAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2luZyBFRENBIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVmFsaWQgICAgICAgICAgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJRQWNrICAgICAgICAgICA9IEZBTFNFOyAvLyBwRWlkLT5PY3RldFswXSAmIDB4MTA7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YlF1ZXVlUmVxdWVzdCAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHgyMDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5iVHhvcFJlcXVlc3QgICAgPSBGQUxTRTsgLy8gcEVpZC0+T2N0ZXRbMF0gJiAweDQwOwotICAgICAgICAgICAgICAgICAgICAvL3BFZGNhUGFybS0+Yk1vcmVEYXRhQWNrICAgID0gRkFMU0U7IC8vIHBFaWQtPk9jdGV0WzBdICYgMHg4MDsKLSAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5FZGNhVXBkYXRlQ291bnQgPSBwRWlkLT5PY3RldFs2XSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+YkFQU0RDYXBhYmxlICAgID0gKHBFaWQtPk9jdGV0WzZdICYgMHg4MCkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgcHRyID0gKFBVQ0hBUikmcEVpZC0+T2N0ZXRbOF07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgYWNpID0gKCpwdHIgJiAweDYwKSA+PiA1OyAvLyBiNX42IGlzIEFDIElOREVYCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPmJBQ01bYWNpXSAgPSAoKCgqcHRyKSAmIDB4MTApID09IDB4MTApOyAgIC8vIGI1IGlzIEFDTQotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5BaWZzblthY2ldID0gKCpwdHIpICYgMHgwZjsgICAgICAgICAgICAgICAvLyBiMH4zIGlzIEFJRlNOCi0gICAgICAgICAgICAgICAgICAgICAgICBwRWRjYVBhcm0tPkN3bWluW2FjaV0gPSAqKHB0cisxKSAmIDB4MGY7ICAgICAgICAgICAgIC8vIGIwfjQgaXMgQ3dtaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFZGNhUGFybS0+Q3dtYXhbYWNpXSA9ICoocHRyKzEpID4+IDQ7ICAgICAgICAgICAgICAgLy8gYjV+OCBpcyBDd21heAotICAgICAgICAgICAgICAgICAgICAgICAgcEVkY2FQYXJtLT5UeG9wW2FjaV0gID0gKihwdHIrMikgKyAyNTYgKiAoKihwdHIrMykpOyAvLyBpbiB1bml0IG9mIDMyLXVzCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsgLy8gcG9pbnQgdG8gbmV4dCBBQwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQXNzb2NSc3BTYW5pdHkgLSBpZ25vcmUgdW5yZWNvZ25pemVkIEVJRCA9ICVkXG4iLCBwRWlkLT5FaWQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIExlbmd0aCA9IExlbmd0aCArIDIgKyBwRWlkLT5MZW47Ci0gICAgICAgIHBFaWQgPSAoUEVJRF9TVFJVQ1QpKChVQ0hBUiopcEVpZCArIDIgKyBwRWlkLT5MZW4pOwotICAgIH0KLQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgTUxNRSBtZXNzYWdlIHNhbml0eSBjaGVjawotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1CT09MRUFOIFBlZXJQcm9iZVJlcVNhbml0eSgKLSAgICBJTiBQUlRNUF9BREFQVEVSIHBBZCwKLSAgICBJTiBWT0lEICpNc2csCi0gICAgSU4gVUxPTkcgTXNnTGVuLAotICAgIE9VVCBQVUNIQVIgcEFkZHIyLAotICAgIE9VVCBDSEFSIFNzaWRbXSwKLSAgICBPVVQgVUNIQVIgKnBTc2lkTGVuKQotewotICAgIFVDSEFSICAgICAgICAgSWR4OwotICAgIFVDSEFSCSAgICAgIFJhdGVMZW47Ci0gICAgQ0hBUiAgICAgICAgICBJZVR5cGU7Ci0gICAgUEZSQU1FXzgwMl8xMSBwRnJhbWUgPSAoUEZSQU1FXzgwMl8xMSlNc2c7Ci0KLSAgICBDT1BZX01BQ19BRERSKHBBZGRyMiwgcEZyYW1lLT5IZHIuQWRkcjIpOwotCi0gICAgaWYgKChwRnJhbWUtPk9jdGV0WzBdICE9IElFX1NTSUQpIHx8IChwRnJhbWUtPk9jdGV0WzFdID4gTUFYX0xFTl9PRl9TU0lEKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU1NJRCBJRShUeXBlPSVkLExlbj0lZClcbiIscEZyYW1lLT5PY3RldFswXSxwRnJhbWUtPk9jdGV0WzFdKSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAqcFNzaWRMZW4gPSBwRnJhbWUtPk9jdGV0WzFdOwotICAgIE5kaXNNb3ZlTWVtb3J5KFNzaWQsICZwRnJhbWUtPk9jdGV0WzJdLCAqcFNzaWRMZW4pOwotCi0gICAgSWR4ID0gKnBTc2lkTGVuICsgMjsKLQotICAgIC8vIC0tIGdldCBzdXBwb3J0ZWQgcmF0ZXMgZnJvbSBwYXlsb2FkIGFuZCBhZHZhbmNlIHRoZSBwb2ludGVyCi0gICAgSWVUeXBlID0gcEZyYW1lLT5PY3RldFtJZHhdOwotICAgIFJhdGVMZW4gPSBwRnJhbWUtPk9jdGV0W0lkeCArIDFdOwotICAgIGlmIChJZVR5cGUgIT0gSUVfU1VQUF9SQVRFUykKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJQcm9iZVJlcVNhbml0eSBmYWlsIC0gd3JvbmcgU3VwcG9ydFJhdGVzIElFKFR5cGU9JWQsTGVuPSVkKVxuIixwRnJhbWUtPk9jdGV0W0lkeF0scEZyYW1lLT5PY3RldFtJZHgrMV0pKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykgJiYgKFJhdGVMZW4gPCA4KSkKLSAgICAgICAgICAgIHJldHVybiAoRkFMU0UpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0KLQlJUlFMID0gRElTUEFUQ0hfTEVWRUwKLQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLUJPT0xFQU4gR2V0VGltQml0KAotICAgIElOIENIQVIgKlB0ciwKLSAgICBJTiBVU0hPUlQgQWlkLAotICAgIE9VVCBVQ0hBUiAqVGltTGVuLAotICAgIE9VVCBVQ0hBUiAqQmNhc3RGbGFnLAotICAgIE9VVCBVQ0hBUiAqRHRpbUNvdW50LAotICAgIE9VVCBVQ0hBUiAqRHRpbVBlcmlvZCwKLSAgICBPVVQgVUNIQVIgKk1lc3NhZ2VUb01lKQotewotICAgIFVDSEFSICAgICAgICAgIEJpdENudGwsIE4xLCBOMiwgTXlCeXRlLCBNeUJpdDsKLSAgICBDSEFSICAgICAgICAgICpJZHhQdHI7Ci0KLSAgICBJZHhQdHIgPSBQdHI7Ci0KLSAgICBJZHhQdHIgKys7Ci0gICAgKlRpbUxlbiA9ICpJZHhQdHI7Ci0KLSAgICAvLyBnZXQgRFRJTSBDb3VudCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgSWR4UHRyICsrOwotICAgICpEdGltQ291bnQgPSAqSWR4UHRyOwotCi0gICAgLy8gZ2V0IERUSU0gUGVyaW9kIGZyb20gVElNIGVsZW1lbnQKLSAgICBJZHhQdHIrKzsKLSAgICAqRHRpbVBlcmlvZCA9ICpJZHhQdHI7Ci0KLSAgICAvLyBnZXQgQml0bWFwIENvbnRyb2wgZnJvbSBUSU0gZWxlbWVudAotICAgIElkeFB0cisrOwotICAgIEJpdENudGwgPSAqSWR4UHRyOwotCi0gICAgaWYgKCgqRHRpbUNvdW50ID09IDApICYmIChCaXRDbnRsICYgMHgwMSkpCi0gICAgICAgICpCY2FzdEZsYWcgPSBUUlVFOwotICAgIGVsc2UKLSAgICAgICAgKkJjYXN0RmxhZyA9IEZBTFNFOwotCi0gICAgLy8gUGFyc2UgUGFydGlhbCBWaXJ0dWFsIEJpdG1hcCBmcm9tIFRJTSBlbGVtZW50Ci0gICAgTjEgPSBCaXRDbnRsICYgMHhmZTsgICAgLy8gTjEgaXMgdGhlIGZpcnN0IGJpdG1hcCBieXRlIwotICAgIE4yID0gKlRpbUxlbiAtIDQgKyBOMTsgIC8vIE4yIGlzIHRoZSBsYXN0IGJpdG1hcCBieXRlIwotCi0gICAgaWYgKChBaWQgPCAoTjEgPDwgMykpIHx8IChBaWQgPj0gKChOMiArIDEpIDw8IDMpKSkKLSAgICAgICAgKk1lc3NhZ2VUb01lID0gRkFMU0U7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTXlCeXRlID0gKEFpZCA+PiAzKSAtIE4xOyAgICAgICAgICAgICAgICAgICAgICAgLy8gbXkgYnl0ZSBwb3NpdGlvbiBpbiB0aGUgYml0bWFwIGJ5dGUtc3RyZWFtCi0gICAgICAgIE15Qml0ID0gQWlkICUgMTYgLSAoKE15Qnl0ZSAmIDB4MDEpPyA4OjApOwotCi0gICAgICAgIElkeFB0ciArPSAoTXlCeXRlICsgMSk7Ci0KLSAgICAgICAgLy9pZiAoKklkeFB0cikKLSAgICAgICAgLy8gICAgREJHUFJJTlQoUlRfREVCVUdfV0FSTiwgKCJUSU0gYml0bWFwID0gMHglMDJ4XG4iLCAqSWR4UHRyKSk7Ci0KLSAgICAgICAgaWYgKCpJZHhQdHIgJiAoMHgwMSA8PCBNeUJpdCkpCi0gICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBUUlVFOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqTWVzc2FnZVRvTWUgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhL3N5bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyMGUwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS9zeW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQwICswLDAgQEAKLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUmFsaW5rIFRlY2ggSW5jLgotICogNUYuLCBOby4zNiwgVGFpeXVhbiBTdC4sIEpodWJlaSBDaXR5LAotICogSHNpbmNodSBDb3VudHkgMzAyLAotICogVGFpd2FuLCBSLk8uQy4KLSAqCi0gKiAoYykgQ29weXJpZ2h0IDIwMDItMjAwNywgUmFsaW5rIFRlY2hub2xvZ3ksIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKgotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICoKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAqCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAqCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICoKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICoKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JTW9kdWxlIE5hbWU6Ci0Jc3luYy5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSm9obiBDaGFuZwkyMDA0LTA5LTAxICAgICAgbW9kaWZpZWQgZm9yIHJ0MjU2MS8yNjYxCi0JSmFuIExlZQkJMjAwNi0wOC0wMSAgICAgIG1vZGlmaWVkIGZvciBydDI4NjAgZm9yIDgwMi4xMW4KLSovCi0KLSNpbmNsdWRlICIuLi9ydF9jb25maWcuaCIKLQotCi0jZGVmaW5lIEFESE9DX0VOVFJZX0JFQUNPTl9MT1NUX1RJTUUJKDIqT1NfSFopCS8vIDIgc2VjCi0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJVGhlIHN5bmMgc3RhdGUgbWFjaGluZSwKLQlQYXJhbWV0ZXJzOgotCQlTbSAtIHBvaW50ZXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUKLQlOb3RlOgotCQl0aGUgc3RhdGUgbWFjaGluZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcKLQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgU3luY1N0YXRlTWFjaGluZUluaXQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gU1RBVEVfTUFDSElORSAqU20sCi0JT1VUIFNUQVRFX01BQ0hJTkVfRlVOQyBUcmFuc1tdKQotewotCVN0YXRlTWFjaGluZUluaXQoU20sIFRyYW5zLCBNQVhfU1lOQ19TVEFURSwgTUFYX1NZTkNfTVNHLCAoU1RBVEVfTUFDSElORV9GVU5DKURyb3AsIFNZTkNfSURMRSwgU1lOQ19NQUNISU5FX0JBU0UpOwotCi0JLy8gY29sdW1uIDEKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNZTkNfSURMRSwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpTWxtZVNjYW5SZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lSm9pblJlcUFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9NTE1FX1NUQVJUX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylNbG1lU3RhcnRSZXFBY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU1lOQ19JRExFLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTWU5DX0lETEUsIE1UMl9QRUVSX1BST0JFX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyUHJvYmVSZXFBY3Rpb24pOwotCi0JLy9jb2x1bW4gMgotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU0NBTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlblNjYW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfSk9JTl9SRVEsIChTVEFURV9NQUNISU5FX0ZVTkMpSW52YWxpZFN0YXRlV2hlbkpvaW4pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgSk9JTl9XQUlUX0JFQUNPTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfUEVFUl9CRUFDT04sIChTVEFURV9NQUNISU5FX0ZVTkMpUGVlckJlYWNvbkF0Sm9pbkFjdGlvbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBKT0lOX1dBSVRfQkVBQ09OLCBNVDJfQkVBQ09OX1RJTUVPVVQsIChTVEFURV9NQUNISU5FX0ZVTkMpQmVhY29uVGltZW91dEF0Sm9pbkFjdGlvbik7Ci0KLQkvLyBjb2x1bW4gMwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9NTE1FX1NDQU5fUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TY2FuKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfTUxNRV9KT0lOX1JFUSwgKFNUQVRFX01BQ0hJTkVfRlVOQylJbnZhbGlkU3RhdGVXaGVuSm9pbik7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX01MTUVfU1RBUlRfUkVRLCAoU1RBVEVfTUFDSElORV9GVU5DKUludmFsaWRTdGF0ZVdoZW5TdGFydCk7Ci0JU3RhdGVNYWNoaW5lU2V0QWN0aW9uKFNtLCBTQ0FOX0xJU1RFTiwgTVQyX1BFRVJfQkVBQ09OLCAoU1RBVEVfTUFDSElORV9GVU5DKVBlZXJCZWFjb25BdFNjYW5BY3Rpb24pOwotCVN0YXRlTWFjaGluZVNldEFjdGlvbihTbSwgU0NBTl9MSVNURU4sIE1UMl9QRUVSX1BST0JFX1JTUCwgKFNUQVRFX01BQ0hJTkVfRlVOQylQZWVyQmVhY29uQXRTY2FuQWN0aW9uKTsKLQlTdGF0ZU1hY2hpbmVTZXRBY3Rpb24oU20sIFNDQU5fTElTVEVOLCBNVDJfU0NBTl9USU1FT1VULCAoU1RBVEVfTUFDSElORV9GVU5DKVNjYW5UaW1lb3V0QWN0aW9uKTsKLQotCS8vIHRpbWVyIGluaXQKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgR0VUX1RJTUVSX0ZVTkNUSU9OKEJlYWNvblRpbWVvdXQpLCBwQWQsIEZBTFNFKTsKLQlSVE1QSW5pdFRpbWVyKHBBZCwgJnBBZC0+TWxtZUF1eC5TY2FuVGltZXIsIEdFVF9USU1FUl9GVU5DVElPTihTY2FuVGltZW91dCksIHBBZCwgRkFMU0UpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCUJlYWNvbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIEJlYWNvblRpbWVvdXQoCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotCUlOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLQlJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotCVJUTVBfQURBUFRFUiAqcEFkID0gKFJUTVBfQURBUFRFUiAqKUZ1bmN0aW9uQ29udGV4dDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU1lOQyAtIEJlYWNvblRpbWVvdXRcbiIpKTsKLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JCXJldHVybjsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCWlmICgocEFkLT5Db21tb25DZmcuQkJQQ3VycmVudEJXID09IEJXXzQwKQotCQkpCi0JewotCQlVQ0hBUiAgICAgICAgQkJQVmFsdWUgPSAwOwotCQlBc2ljU3dpdGNoQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCAmQkJQVmFsdWUpOwotCQlCQlBWYWx1ZSAmPSAofjB4MTgpOwotCQlCQlBWYWx1ZSB8PSAweDEwOwotCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBFbmQgb2YgU0NBTiwgcmVzdG9yZSB0byA0ME1IeiBjaGFubmVsICVkLCBUb3RhbCBCU1NbJTAyZF1cbiIscEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIHBBZC0+U2NhblRhYi5Cc3NOcikpOwotCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCU1sbWVFbnF1ZXVlKHBBZCwgU1lOQ19TVEFURV9NQUNISU5FLCBNVDJfQkVBQ09OX1RJTUVPVVQsIDAsIE5VTEwpOwotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2NhbiB0aW1lb3V0IGhhbmRsZXIsIGV4ZWN1dGVkIGluIHRpbWVyIHRocmVhZAotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFNjYW5UaW1lb3V0KAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMSwKLQlJTiBQVk9JRCBGdW5jdGlvbkNvbnRleHQsCi0JSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMyLAotCUlOIFBWT0lEIFN5c3RlbVNwZWNpZmljMykKLXsKLQlSVE1QX0FEQVBURVIgKnBBZCA9IChSVE1QX0FEQVBURVIgKilGdW5jdGlvbkNvbnRleHQ7Ci0KLQotCS8vIERvIG5vdGhpbmcgaWYgdGhlIGRyaXZlciBpcyBzdGFydGluZyBoYWx0IHN0YXRlLgotCS8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGltZXIgYWxyZWFkeSBiZWVuIGZpcmVkIGJlZm9yZSBjYW5jZWwgdGltZXIgd2l0aCBtbG1laGFsdAotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSEFMVF9JTl9QUk9HUkVTUykpCi0JCXJldHVybjsKLQotCWlmIChNbG1lRW5xdWV1ZShwQWQsIFNZTkNfU1RBVEVfTUFDSElORSwgTVQyX1NDQU5fVElNRU9VVCwgMCwgTlVMTCkpCi0JewotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci19Ci0JZWxzZQotCXsKLQkJLy8gVG8gcHJldmVudCBTeW5jTWFjaGluZS5DdXJyU3RhdGUgaXMgU0NBTl9MSVNURU4gZm9yZXZlci4KLQkJcEFkLT5NbG1lQXV4LkNoYW5uZWwgPSAwOwotCQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQl7Ci0JCQlSVE1QU2VuZFdpcmVsZXNzRXZlbnQocEFkLCBJV19TQ0FOX0VOUVVFVUVfRkFJTF9FVkVOVF9GTEFHLCBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkFkZHIsIEJTUzAsIDApOwotCQl9Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCU1MTUUgU0NBTiByZXEgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVTY2FuUmVxQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIFNjYW5UeXBlLCBCc3NUeXBlLCBCQlBWYWx1ZSA9IDA7Ci0JQk9PTEVBTiAgICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JVUxPTkcJCSAgIE5vdzsKLQlVU0hPUlQgICAgICAgICBTdGF0dXM7Ci0JUEhFQURFUl84MDJfMTEgcEhkcjgwMjExOwotCVBVQ0hBUiAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCU5ESVNfU1RBVFVTICAgIE5TdGF0dXM7Ci0KLQkvLyBDaGVjayB0aGUgdG90YWwgc2NhbiB0cmllcyBmb3Igb25lIHNpbmdsZSBPSUQgY29tbWFuZAotCS8vIElmIHRoaXMgaXMgdGhlIENDWCAyLjAgQ2FzZSwgc2tpcCB0aGF0IQotCWlmICggIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9TVEFSVF9VUCkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24gYmVmb3JlIFN0YXJ0dXBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vIEluY3JlYXNlIHRoZSBzY2FuIHJldHJ5IGNvdW50ZXJzLgotCXBBZC0+U3RhQ2ZnLlNjYW5DbnQrKzsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19QQ0lFX0RFVklDRSkpICYmCi0gICAgICAgIChJRExFX09OKHBBZCkpICYmCi0JCShwQWQtPlN0YUNmZy5iUmFkaW8gPT0gVFJVRSkgJiYKLQkJKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JRExFX1JBRElPX09GRikpKQotCXsKLQkgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QU0NvbnRyb2wuZmllbGQuRW5hYmxlTmV3UFMgPT0gRkFMU0UpCi0JCXsKLQkJCUFzaWNTZW5kQ29tbWFuZFRvTWN1KHBBZCwgMHgzMSwgUG93ZXJXYWtlQ0lELCAweDAwLCAweDAyKTsKLQkJCUFzaWNDaGVja0NvbW1hbk9rKHBBZCwgUG93ZXJXYWtlQ0lEKTsKLQkJCVJUTVBfQ0xFQVJfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSURMRV9SQURJT19PRkYpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUFNNIC0gSXNzdWUgV2FrZSB1cCBjb21tYW5kIFxuIikpOwotCQl9Ci0JCWVsc2UKLQkJewotCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOwotCX0KLQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0KLQkvLyBmaXJzdCBjaGVjayB0aGUgcGFyYW1ldGVyIHNhbml0eQotCWlmIChNbG1lU2NhblJlcVNhbml0eShwQWQsCi0JCQkJCQkgIEVsZW0tPk1zZywKLQkJCQkJCSAgRWxlbS0+TXNnTGVuLAotCQkJCQkJICAmQnNzVHlwZSwKLQkJCQkJCSAgKFBDSEFSKVNzaWQsCi0JCQkJCQkgICZTc2lkTGVuLAotCQkJCQkJICAmU2NhblR5cGUpKQotCXsKLQotCQkvLyBDaGVjayBmb3IgY2hhbm5lbCBsb2FkIGFuZCBub2lzZSBoaXN0IHJlcXVlc3QKLQkJLy8gU3VzcGVuZCBNU0RVIG9ubHkgYXQgc2NhbiByZXF1ZXN0LCBub3QgdGhlIGxhc3QgdHdvIG1lbnRpb25lZAotCQkvLyBTdXNwZW5kIE1TRFUgdHJhbnNtaXNzaW9uIGhlcmUKLQkJUlRNUFN1c3BlbmRNc2R1VHJhbnNtaXNzaW9uKHBBZCk7Ci0KLQkJLy8KLQkJLy8gVG8gcHJldmVudCBkYXRhIGxvc3QuCi0JCS8vIFNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb24gdG8gY3VycmVudCBhc3NvY2lhdGVkIEFQIGJlZm9yZSBTQ0FOIHByb2dyZXNzLgotCQkvLyBBbmQgc2hvdWxkIHNlbmQgYW4gTlVMTCBkYXRhIHdpdGggdHVybmVkIFBTTSBiaXQgb2ZmIHRvIEFQLCB3aGVuIHNjYW4gcHJvZ3Jlc3MgZG9uZQotCQkvLwotCQlpZiAoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpICYmIChJTkZSQV9PTihwQWQpKSkKLQkJewotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsIChQVk9JRCkmcE91dEJ1ZmZlcik7Ci0JCQlpZiAoTlN0YXR1cwk9PSBORElTX1NUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCXBIZHI4MDIxMSA9IChQSEVBREVSXzgwMl8xMSkgcE91dEJ1ZmZlcjsKLQkJCQlNZ3RNYWNIZWFkZXJJbml0KHBBZCwgcEhkcjgwMjExLCBTVUJUWVBFX05VTExfRlVOQywgMSwgcEFkLT5Db21tb25DZmcuQnNzaWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCQlwSGRyODAyMTEtPkR1cmF0aW9uID0gMDsKLQkJCQlwSGRyODAyMTEtPkZDLlR5cGUgPSBCVFlQRV9EQVRBOwotCQkJCXBIZHI4MDIxMS0+RkMuUHdyTWdtdCA9IFBXUl9TQVZFOwotCi0JCQkJLy8gU2VuZCB1c2luZyBwcmlvcml0eSBxdWV1ZQotCQkJCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgc2l6ZW9mKEhFQURFUl84MDJfMTEpKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU2NhblJlcUFjdGlvbiAtLSBTZW5kIFBTTSBEYXRhIGZyYW1lIGZvciBvZmYgY2hhbm5lbCBSTVxuIikpOwotCQkJCU1sbWVGcmVlTWVtb3J5KHBBZCwgcE91dEJ1ZmZlcik7Ci0JCQkJUlRNUHVzZWNEZWxheSg1MDAwKTsKLQkJCX0KLQkJfQotCi0JCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RTY2FuVGltZSA9IE5vdzsKLQkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsICZUaW1lckNhbmNlbGxlZCk7Ci0JCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LlNjYW5UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkvLyByZWNvcmQgZGVzaXJlZCBCU1MgcGFyYW1ldGVycwotCQlwQWQtPk1sbWVBdXguQnNzVHlwZSA9IEJzc1R5cGU7Ci0JCXBBZC0+TWxtZUF1eC5TY2FuVHlwZSA9IFNjYW5UeXBlOwotCQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IFNzaWRMZW47Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBNQVhfTEVOX09GX1NTSUQpOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7Ci0KLQkJLy8gc3RhcnQgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbAotCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IEZpcnN0Q2hhbm5lbChwQWQpOwotCi0JCS8vIExldCBCQlAgcmVnaXN0ZXIgYXQgMjBNSHogdG8gZG8gc2NhbgotCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JCUJCUFZhbHVlICY9ICh+MHgxOCk7Ci0JCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsIEJCUFZhbHVlKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7Ci0JCVNjYW5OZXh0Q2hhbm5lbChwQWQpOwotCX0KLQllbHNlCi0JewotCQlEQkdQUklOVF9FUlIoKCJTWU5DIC0gTWxtZVNjYW5SZXFBY3Rpb24oKSBzYW5pdHkgY2hlY2sgZmFpbFxuIikpOwotCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKLQl9Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJTUxNRSBKT0lOIHJlcSBzdGF0ZSBtYWNoaW5lIHByb2NlZHVyZQotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgTWxtZUpvaW5SZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICBCQlBWYWx1ZSA9IDA7Ci0JQlNTX0VOVFJZICAgICpwQnNzOwotCUJPT0xFQU4gICAgICAgVGltZXJDYW5jZWxsZWQ7Ci0JSEVBREVSXzgwMl8xMSBIZHI4MDIxMTsKLQlORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0JVUxPTkcgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlQVUNIQVIgICAgICAgIHBTdXBSYXRlID0gTlVMTDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVMZW47Ci0JUFVDSEFSICAgICAgICBwRXh0UmF0ZSA9IE5VTEw7Ci0JVUNIQVIgICAgICAgICBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQVN1cFJhdGVbXSA9IHsweDhDLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZDfTsKLQlVQ0hBUiAgICAgICAgIEFTdXBSYXRlTGVuID0gc2l6ZW9mKEFTdXBSYXRlKS9zaXplb2YoVUNIQVIpOwotCU1MTUVfSk9JTl9SRVFfU1RSVUNUICpwSW5mbyA9IChNTE1FX0pPSU5fUkVRX1NUUlVDVCAqKShFbGVtLT5Nc2cpOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVKb2luUmVxQWN0aW9uKEJTUyAjJWxkKVxuIiwgcEluZm8tPkJzc0lkeCkpOwotCi0jaWZkZWYgUlRNUF9NQUNfUENJCi0gICAgaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkgJiYKLSAgICAgICAgKElETEVfT04ocEFkKSkgJiYKLQkJKHBBZC0+U3RhQ2ZnLmJSYWRpbyA9PSBUUlVFKSAmJgotCQkoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lETEVfUkFESU9fT0ZGKSkpCi0JewotCQlSVDI4eHhQY2lBc2ljUmFkaW9PbihwQWQsIEdVSV9JRExFX1BPV0VSX1NBVkUpOwotCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQotCS8vIHJlc2V0IGFsbCB0aGUgdGltZXJzCi0JUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCVJUTVBDYW5jZWxUaW1lcigmcEFkLT5NbG1lQXV4LkJlYWNvblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCi0JcEJzcyA9ICZwQWQtPk1sbWVBdXguU3NpZEJzc1RhYi5Cc3NFbnRyeVtwSW5mby0+QnNzSWR4XTsKLQotCS8vIHJlY29yZCB0aGUgZGVzaXJlZCBTU0lEICYgQlNTSUQgd2UncmUgd2FpdGluZyBmb3IKLQlDT1BZX01BQ19BRERSKHBBZC0+TWxtZUF1eC5Cc3NpZCwgcEJzcy0+QnNzaWQpOwotCi0JLy8gSWYgQVAncyBTU0lEIGlzIG5vdCBoaWRkZW4sIGl0IGlzIE9LIGZvciB1cGRhdGluZyBzc2lkIHRvIE1sbWVBdXggYWdhaW4uCi0JaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQotCXsKLQkJUlRNUFplcm9NZW1vcnkocEFkLT5NbG1lQXV4LlNzaWQsIE1BWF9MRU5fT0ZfU1NJRCk7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBwQnNzLT5Tc2lkLCBwQnNzLT5Tc2lkTGVuKTsKLQlwQWQtPk1sbWVBdXguU3NpZExlbiA9IHBCc3MtPlNzaWRMZW47Ci0JfQotCi0JcEFkLT5NbG1lQXV4LkJzc1R5cGUgPSBwQnNzLT5Cc3NUeXBlOwotCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEJzcy0+Q2hhbm5lbDsKLQlwQWQtPk1sbWVBdXguQ2VudHJhbENoYW5uZWwgPSBwQnNzLT5DZW50cmFsQ2hhbm5lbDsKLQotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkvLyBDb3VudHJ5IElFIG9mIHRoZSBBUCB3aWxsIGJlIGV2YWx1YXRlZCBhbmQgd2lsbCBiZSB1c2VkLgotCWlmICgocEFkLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgIT0gUnQ4MDJfMTFfRF9Ob25lKSAmJgotCQkocEJzcy0+Ykhhc0NvdW50cnlJRSA9PSBUUlVFKSkKLQl7Ci0JCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZVswXSwgJnBCc3MtPkNvdW50cnlTdHJpbmdbMF0sIDIpOwotCQlpZiAocEJzcy0+Q291bnRyeVN0cmluZ1syXSA9PSAnSScpCi0JCQlwQWQtPkNvbW1vbkNmZy5HZW9ncmFwaHkgPSBJRE9SOwotCQllbHNlIGlmIChwQnNzLT5Db3VudHJ5U3RyaW5nWzJdID09ICdPJykKLQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IE9ET1I7Ci0JCWVsc2UKLQkJCXBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSA9IEJPVEg7Ci0JCUJ1aWxkQ2hhbm5lbExpc3RFeChwQWQpOwotCX0KLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0KLQkvLyBMZXQgQkJQIHJlZ2lzdGVyIGF0IDIwTUh6IHRvIGRvIHNjYW4KLQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkLCBCQlBfUjQsICZCQlBWYWx1ZSk7Ci0JQkJQVmFsdWUgJj0gKH4weDE4KTsKLQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1I0LCBCQlBWYWx1ZSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJCUCBSNCB0byAyME1Iei5sXG4iKSk7Ci0KLQkvLyBzd2l0Y2ggY2hhbm5lbCBhbmQgd2FpdGluZyBmb3IgYmVhY29uIHRpbWVyCi0JQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOwotCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+TWxtZUF1eC5DaGFubmVsKTsKLQotCi0JUlRNUFNldFRpbWVyKCZwQWQtPk1sbWVBdXguQmVhY29uVGltZXIsIEpPSU5fVElNRU9VVCk7Ci0KLSAgICBkbwotCXsKLQkJaWYgKCgocEFkLT5Db21tb25DZmcuYklFRUU4MDIxMUggPT0gMSkgJiYKLSAgICAgICAgICAgIChwQWQtPk1sbWVBdXguQ2hhbm5lbCA+IDE0KSAmJgotICAgICAgICAgICAgIFJhZGFyQ2hhbm5lbENoZWNrKHBBZCwgcEFkLT5NbG1lQXV4LkNoYW5uZWwpKQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8gUm9nZXIgc3luYyBDYXJyaWVyCi0gICAgICAgICAgICAgfHwgKHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID09IFRSVUUpCi0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotICAgICAgICAgICAgKQotCQl7Ci0JCQkvLwotCQkJLy8gV2UgY2FuJ3Qgc2VuZCBhbnkgUHJvYmUgcmVxdWVzdCBmcmFtZSB0byBtZWV0IDgwMi4xMWguCi0JCQkvLwotCQkJaWYgKHBCc3MtPkhpZGRlbiA9PSAwKQotCQkJYnJlYWs7Ci0JCX0KLQotCS8vCi0JLy8gc2VuZCBwcm9iZSByZXF1ZXN0Ci0JLy8KLQlOU3RhdHVzID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOwotCWlmIChOU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlpZiAocEFkLT5NbG1lQXV4LkNoYW5uZWwgPD0gMTQpCi0JCXsKLQkJCXBTdXBSYXRlID0gcEFkLT5Db21tb25DZmcuU3VwUmF0ZTsKLQkJCVN1cFJhdGVMZW4gPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwotCQkJcEV4dFJhdGUgPSBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlOwotCQkJRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLwotCQkJLy8gT3ZlcndyaXRlIFN1cHBvcnQgUmF0ZSwgQ0NLIHJhdGUgYXJlIG5vdCBhbGxvd2VkCi0JCQkvLwotCQkJcFN1cFJhdGUgPSBBU3VwUmF0ZTsKLQkJCVN1cFJhdGVMZW4gPSBBU3VwUmF0ZUxlbjsKLQkJCUV4dFJhdGVMZW4gPSAwOwotCQl9Ci0KLQkJaWYgKHBBZC0+TWxtZUF1eC5Cc3NUeXBlID09IEJTU19JTkZSQSkKLQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBwQWQtPk1sbWVBdXguQnNzaWQsIHBBZC0+TWxtZUF1eC5Cc3NpZCk7Ci0JCWVsc2UKLQkJCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOwotCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICZIZHI4MDIxMSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPk1sbWVBdXguU3NpZExlbiwKLQkJCQkJCSAgcEFkLT5NbG1lQXV4LlNzaWRMZW4sCSAgICBwQWQtPk1sbWVBdXguU3NpZCwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAmU3VwUmF0ZUllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlTGVuLAotCQkJCQkJICBTdXBSYXRlTGVuLCAgICAgICAgICAgICAgIHBTdXBSYXRlLAotCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJaWYgKEV4dFJhdGVMZW4pCi0JCXsKLQkJCVVMT05HIFRtcDsKLQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFeHRSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVMZW4sCi0JCQkJCQkJICBFeHRSYXRlTGVuLCAgICAgICAgICAgICAgICAgICAgICAgcEV4dFJhdGUsCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQlGcmFtZUxlbiArPSBUbXA7Ci0JCX0KLQotCi0JCU1pbmlwb3J0TU1SZXF1ZXN0KHBBZCwgMCwgcE91dEJ1ZmZlciwgRnJhbWVMZW4pOwotCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCX0KLSAgICB9IHdoaWxlIChGQUxTRSk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gU3dpdGNoIHRvIGNoICVkLCBXYWl0IEJFQUNPTiBmcm9tICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQlwQnNzLT5DaGFubmVsLCBwQnNzLT5Cc3NpZFswXSwgcEJzcy0+QnNzaWRbMV0sIHBCc3MtPkJzc2lkWzJdLCBwQnNzLT5Cc3NpZFszXSwgcEJzcy0+QnNzaWRbNF0sIHBCc3MtPkJzc2lkWzVdKSk7Ci0KLQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gSk9JTl9XQUlUX0JFQUNPTjsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCQlNTE1FIFNUQVJUIFJlcXVlc3Qgc3RhdGUgbWFjaGluZSBwcm9jZWR1cmUsIHN0YXJ0aW5nIGFuIElCU1MKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIE1sbWVTdGFydFJlcUFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW47Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQotCS8vIE5ldyBmb3IgV1BBIHNlY3VyaXR5IHN1aXRlcwotCVVDSEFSCQkJCQkJVmFySUVbTUFYX1ZJRV9MRU5dOwkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JTEFSR0VfSU5URUdFUgkJCQlUaW1lU3RhbXA7Ci0JQk9PTEVBTiBQcml2YWN5OwotCVVTSE9SVCBTdGF0dXM7Ci0KLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7Ci0JcFZJRS0+TGVuZ3RoID0gMDsKLQlUaW1lU3RhbXAudS5Mb3dQYXJ0ICA9IDA7Ci0JVGltZVN0YW1wLnUuSGlnaFBhcnQgPSAwOwotCi0JaWYgKE1sbWVTdGFydFJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCAoUENIQVIpU3NpZCwgJlNzaWRMZW4pKQotCXsKLQkJLy8gcmVzZXQgYWxsIHRoZSB0aW1lcnMKLQkJUlRNUENhbmNlbFRpbWVyKCZwQWQtPk1sbWVBdXguU2NhblRpbWVyLCAmVGltZXJDYW5jZWxsZWQpOwotCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkvLwotCQkvLyBTdGFydCBhIG5ldyBJQlNTLiBBbGwgSUJTUyBwYXJhbWV0ZXJzIGFyZSBkZWNpZGVkIG5vdy4uLi4KLQkJLy8KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWxtZVN0YXJ0UmVxQWN0aW9uIC0gU3RhcnQgYSBuZXcgSUJTUy4gQWxsIElCU1MgcGFyYW1ldGVycyBhcmUgZGVjaWRlZCBub3cuLi4uIFxuIikpOwotCQlwQWQtPk1sbWVBdXguQnNzVHlwZSAgICAgICAgICAgPSBCU1NfQURIT0M7Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5Tc2lkLCBTc2lkLCBTc2lkTGVuKTsKLQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gICAgICAgICAgID0gU3NpZExlbjsKLQotCQkvLyBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRAotCQlNYWNBZGRyUmFuZG9tQnNzaWQocEFkLCBwQWQtPk1sbWVBdXguQnNzaWQpOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJNbG1lU3RhcnRSZXFBY3Rpb24gLSBnZW5lcmF0ZSBhIHJhZG9tIG51bWJlciBhcyBCU1NJRCBcbiIpKTsKLQotCQlQcml2YWN5ID0gKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkKSB8fAotCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKTsKLQkJcEFkLT5NbG1lQXV4LkNhcGFiaWxpdHlJbmZvICAgID0gQ0FQX0dFTkVSQVRFKDAsMSxQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAxLCAwKTsKLQkJcEFkLT5NbG1lQXV4LkJlYWNvblBlcmlvZCAgICAgID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOwotCQlwQWQtPk1sbWVBdXguQXRpbVdpbiAgICAgICAgICAgPSBwQWQtPlN0YUNmZy5BdGltV2luOwotCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCAgICAgICAgICAgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCi0JCXBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsICA9IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWw7Ci0JCXBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCAgICA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwotCi0JCXBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuPSBwQWQtPkNvbW1vbkNmZy5TdXBSYXRlTGVuOwotCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3VwUmF0ZSwgcEFkLT5Db21tb25DZmcuU3VwUmF0ZSwgTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVMpOwotCQlSVE1QQ2hlY2tSYXRlcyhwQWQsIHBBZC0+TWxtZUF1eC5TdXBSYXRlLCAmcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4pOwotCQlwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbiA9IHBBZC0+Q29tbW9uQ2ZnLkV4dFJhdGVMZW47Ci0JCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBwQWQtPkNvbW1vbkNmZy5FeHRSYXRlLCBNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFUyk7Ci0JCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0JCXsKLQkJCVJUTVBVcGRhdGVIVElFKCZwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHksICZwQWQtPlN0YUNmZy5EZXNpcmVkSHRQaHlJbmZvLk1DU1NldFswXSwgJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksICZwQWQtPk1sbWVBdXguQWRkSHRJbmZvKTsKLQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSBzaXplb2YoSFRfQ0FQQUJJTElUWV9JRSk7Ci0JCQkvLyBOb3QgdHVybiBwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFIGhlcmUuCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC1wQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRIdFBoeS5iSHRFbmFibGUgPSBUUlVFXG4iKSk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQl7Ci0JCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gMDsKLQkJCXBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uYkh0RW5hYmxlID0gRkFMU0U7Ci0JCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5NQ1NTZXRbMF0sIDE2KTsKLQkJfQotCQkvLyB0ZW1wb3JhcmlseSBub3Qgc3VwcG9ydCBRT1MgaW4gSUJTUwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCBzaXplb2YoUUJTU19MT0FEX1BBUk0pKTsKLQkJTmRpc1plcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFvc0NhcGFiaWxpdHksIHNpemVvZihRT1NfQ0FQQUJJTElUWV9QQVJNKSk7Ci0KLQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCwgRkFMU0UpOwotCQlBc2ljTG9ja0NoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0KLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbihjaD0gJWQsc3VwIHJhdGVzPSAlZCwgZXh0IHJhdGVzPSVkKVxuIiwKLQkJCXBBZC0+TWxtZUF1eC5DaGFubmVsLCBwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKLQotCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9TVEFSVF9DT05GLCAyLCAmU3RhdHVzKTsKLQl9Ci0JZWxzZQotCXsKLQkJREJHUFJJTlRfRVJSKCgiU1lOQyAtIE1sbWVTdGFydFJlcUFjdGlvbigpIHNhbml0eSBjaGVjayBmYWlsLlxuIikpOwotCQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCQlTdGF0dXMgPSBNTE1FX0lOVkFMSURfRk9STUFUOwotCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Ci0JfQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXBlZXIgc2VuZHMgYmVhY29uIGJhY2sgd2hlbiBzY2FubmluZwotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgUGVlckJlYWNvbkF0U2NhbkFjdGlvbigKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCwKLQlJTiBNTE1FX1FVRVVFX0VMRU0gKkVsZW0pCi17Ci0JVUNIQVIgICAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXSwgQnNzVHlwZSwgQ2hhbm5lbCwgTmV3Q2hhbm5lbCwKLQkJCQkJU3NpZExlbiwgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE1lc3NhZ2VUb01lOwotCUNGX1BBUk0gICAgICAgICBDZlBhcm07Ci0JVVNIT1JUICAgICAgICAgIEJlYWNvblBlcmlvZCwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm87Ci0JUEZSQU1FXzgwMl8xMSAgIHBGcmFtZTsKLQlMQVJHRV9JTlRFR0VSICAgVGltZVN0YW1wOwotCVVDSEFSICAgICAgICAgICBFcnA7Ci0JVUNIQVIJCVN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJCVN1cFJhdGVMZW4sIEV4dFJhdGVMZW47Ci0JVVNIT1JUCQkJTGVuVklFOwotCVVDSEFSCQkJQ2tpcEZsYWc7Ci0JVUNIQVIJCQlBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7Ci0JRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOwotCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKLQlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7Ci0JVUxPTkcJCQkJCQlSYWxpbmtJZTsKLQlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01Ci0JTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotCi0KLQkvLyBOZGlzRmlsbE1lbW9yeShTc2lkLCBNQVhfTEVOX09GX1NTSUQsIDB4MDApOwotCXBGcmFtZSA9IChQRlJBTUVfODAyXzExKSBFbGVtLT5Nc2c7Ci0JLy8gSW5pdCBWYXJpYWJsZSBJRSBzdHJ1Y3R1cmUKLQlwVklFID0gKFBORElTXzgwMl8xMV9WQVJJQUJMRV9JRXMpIFZhcklFOwotCXBWSUUtPkxlbmd0aCA9IDA7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgUlRNUFplcm9NZW1vcnkoJkh0Q2FwYWJpbGl0eSwgc2l6ZW9mKEh0Q2FwYWJpbGl0eSkpOwotCVJUTVBaZXJvTWVtb3J5KCZBZGRIdEluZm8sIHNpemVvZihBRERfSFRfSU5GT19JRSkpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0JaWYgKFBlZXJCZWFjb25BbmRQcm9iZVJzcFNhbml0eShwQWQsCi0JCQkJCQkJCUVsZW0tPk1zZywKLQkJCQkJCQkJRWxlbS0+TXNnTGVuLAotCQkJCQkJCQlFbGVtLT5DaGFubmVsLAotCQkJCQkJCQlBZGRyMiwKLQkJCQkJCQkJQnNzaWQsCi0JCQkJCQkJCShQQ0hBUilTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmUGFybSwKLQkJCQkJCQkJJkF0aW1XaW4sCi0JCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkJJkVycCwKLQkJCQkJCQkJJkR0aW1Db3VudCwKLQkJCQkJCQkJJkR0aW1QZXJpb2QsCi0JCQkJCQkJCSZCY2FzdEZsYWcsCi0JCQkJCQkJCSZNZXNzYWdlVG9NZSwKLQkJCQkJCQkJU3VwUmF0ZSwKLQkJCQkJCQkJJlN1cFJhdGVMZW4sCi0JCQkJCQkJCUV4dFJhdGUsCi0JCQkJCQkJCSZFeHRSYXRlTGVuLAotCQkJCQkJCQkmQ2tpcEZsYWcsCi0JCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JCQkJCQkJCSZFZGNhUGFybSwKLQkJCQkJCQkJJlFic3NMb2FkLAotCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCQkJJlJhbGlua0llLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCi0JCQkJCQkJCSZMZW5WSUUsCi0JCQkJCQkJCXBWSUUpKQotCXsKLQkJVUxPTkcgSWR4OwotCQlDSEFSIFJzc2kgPSAwOwotCi0JCUlkeCA9IEJzc1RhYmxlU2VhcmNoKCZwQWQtPlNjYW5UYWIsIEJzc2lkLCBDaGFubmVsKTsKLQkJaWYgKElkeCAhPSBCU1NfTk9UX0ZPVU5EKQotCQkJUnNzaSA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlJzc2k7Ci0KLQkJUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCi0JCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIChQQ0hBUilTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCSAgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sICAmSHRDYXBhYmlsaXR5LAotCQkJCQkgJkFkZEh0SW5mbywgSHRDYXBhYmlsaXR5TGVuLCBBZGRIdEluZm9MZW4sIE5ld0V4dENoYW5uZWxPZmZzZXQsIENoYW5uZWwsIFJzc2ksIFRpbWVTdGFtcCwgQ2tpcEZsYWcsCi0JCQkJCSAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0jaWZkZWYgRE9UMTFOX0RSQUZUMwotCQlpZiAocEFkLT5DaGFubmVsTGlzdFtwQWQtPkNvbW1vbkNmZy5DaGFubmVsTGlzdElkeF0uYkVmZmVjdGVkQ2hhbm5lbCA9PSBUUlVFKQotCQl7Ci0JCQlVQ0hBUgkJUmVnQ2xhc3M7Ci0JCQlQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkyKHBBZCwgRWxlbS0+TXNnLCBFbGVtLT5Nc2dMZW4sICZSZWdDbGFzcyk7Ci0JCQlUcmlFdmVudFRhYmxlU2V0RW50cnkocEFkLCAmcEFkLT5Db21tb25DZmcuVHJpZ2dlckV2ZW50VGFiLCBCc3NpZCwgJkh0Q2FwYWJpbGl0eSwgSHRDYXBhYmlsaXR5TGVuLCBSZWdDbGFzcywgQ2hhbm5lbCk7Ci0JCX0KLSNlbmRpZiAvLyBET1QxMU5fRFJBRlQzIC8vCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCX0KLQotCX0KLQkvLyBzYW5pdHkgY2hlY2sgZmFpbCwgaWdub3JlZAotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVdoZW4gd2FpdGluZyBqb2luaW5nIHRoZSAoSSlCU1MsIGJlYWNvbiByZWNlaXZlZCBmcm9tIGV4dGVybmFsCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyQmVhY29uQXRKb2luQWN0aW9uKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlVQ0hBUiAgICAgICAgIEJzc2lkW01BQ19BRERSX0xFTl0sIEFkZHIyW01BQ19BRERSX0xFTl07Ci0JVUNIQVIgICAgICAgICBTc2lkW01BWF9MRU5fT0ZfU1NJRF0sIFNzaWRMZW4sIEJzc1R5cGUsIENoYW5uZWwsIE1lc3NhZ2VUb01lLAotCQkJCSAgRHRpbUNvdW50LCBEdGltUGVyaW9kLCBCY2FzdEZsYWcsIE5ld0NoYW5uZWw7Ci0JTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7Ci0JVVNIT1JUICAgICAgICBCZWFjb25QZXJpb2QsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvOwotCUNGX1BBUk0gICAgICAgQ2Y7Ci0JQk9PTEVBTiAgICAgICBUaW1lckNhbmNlbGxlZDsKLQlVQ0hBUiAgICAgICAgIEVycDsKLQlVQ0hBUiAgICAgICAgIFN1cFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdLCBFeHRSYXRlW01BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTXTsKLQlVQ0hBUgkJICBTdXBSYXRlTGVuLCBFeHRSYXRlTGVuOwotCVVDSEFSICAgICAgICAgQ2tpcEZsYWc7Ci0JVVNIT1JUCQkgIExlblZJRTsKLQlVQ0hBUgkJICBBaXJvbmV0Q2VsbFBvd2VyTGltaXQ7Ci0JRURDQV9QQVJNICAgICAgIEVkY2FQYXJtOwotCVFCU1NfTE9BRF9QQVJNICBRYnNzTG9hZDsKLQlRT1NfQ0FQQUJJTElUWV9QQVJNIFFvc0NhcGFiaWxpdHk7Ci0JVVNIT1JUICAgICAgICBTdGF0dXM7Ci0JVUNIQVIJCQkJCQlWYXJJRVtNQVhfVklFX0xFTl07CQkvLyBUb3RhbCBWSUUgbGVuZ3RoID0gTUFYX1ZJRV9MRU4gLSAtNQotCU5ESVNfODAyXzExX1ZBUklBQkxFX0lFcwkqcFZJRSA9IE5VTEw7Ci0JVUxPTkcgICAgICAgICAgIFJhbGlua0llOwotCVVMT05HICAgICAgICAgSWR4OwotCUhUX0NBUEFCSUxJVFlfSUUJCUh0Q2FwYWJpbGl0eTsKLQlBRERfSFRfSU5GT19JRQkJQWRkSHRJbmZvOwkvLyBBUCBtaWdodCB1c2UgdGhpcyBhZGRpdGlvbmFsIGh0IGluZm8gSUUKLQlVQ0hBUgkJCQlIdENhcGFiaWxpdHlMZW4gPSAwLCBQcmVOSHRDYXBhYmlsaXR5TGVuID0gMDsKLQlVQ0hBUgkJCUFkZEh0SW5mb0xlbjsKLQlVQ0hBUgkJCU5ld0V4dENoYW5uZWxPZmZzZXQgPSAweGZmOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCVVDSEFSCQkJQ2VudHJhbENoYW5uZWw7Ci0JQk9PTEVBTgkJCWJBbGxvd05yYXRlID0gRkFMU0U7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQkvLyBJbml0IFZhcmlhYmxlIElFIHN0cnVjdHVyZQotCXBWSUUgPSAoUE5ESVNfODAyXzExX1ZBUklBQkxFX0lFcykgVmFySUU7Ci0JcFZJRS0+TGVuZ3RoID0gMDsKLSAgICBSVE1QWmVyb01lbW9yeSgmSHRDYXBhYmlsaXR5LCBzaXplb2YoSHRDYXBhYmlsaXR5KSk7Ci0JUlRNUFplcm9NZW1vcnkoJkFkZEh0SW5mbywgc2l6ZW9mKEFERF9IVF9JTkZPX0lFKSk7Ci0KLQotCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQkoUENIQVIpU3NpZCwKLQkJCQkJCQkJJlNzaWRMZW4sCi0JCQkJCQkJCSZCc3NUeXBlLAotCQkJCQkJCQkmQmVhY29uUGVyaW9kLAotCQkJCQkJCQkmQ2hhbm5lbCwKLQkJCQkJCQkJJk5ld0NoYW5uZWwsCi0JCQkJCQkJCSZUaW1lU3RhbXAsCi0JCQkJCQkJCSZDZiwKLQkJCQkJCQkJJkF0aW1XaW4sCi0JCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkJJkVycCwKLQkJCQkJCQkJJkR0aW1Db3VudCwKLQkJCQkJCQkJJkR0aW1QZXJpb2QsCi0JCQkJCQkJCSZCY2FzdEZsYWcsCi0JCQkJCQkJCSZNZXNzYWdlVG9NZSwKLQkJCQkJCQkJU3VwUmF0ZSwKLQkJCQkJCQkJJlN1cFJhdGVMZW4sCi0JCQkJCQkJCUV4dFJhdGUsCi0JCQkJCQkJCSZFeHRSYXRlTGVuLAotCQkJCQkJCQkmQ2tpcEZsYWcsCi0JCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JCQkJCQkJCSZFZGNhUGFybSwKLQkJCQkJCQkJJlFic3NMb2FkLAotCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCQkJJlJhbGlua0llLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCi0JCQkJCQkJCSZMZW5WSUUsCi0JCQkJCQkJCXBWSUUpKQotCXsKLQkJLy8gRGlzcXVhbGlmeSAxMWIgb25seSBhZGhvYyB3aGVuIHdlIGFyZSBpbiAxMWcgb25seSBhZGhvYyBtb2RlCi0JCWlmICgoQnNzVHlwZSA9PSBCU1NfQURIT0MpICYmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID09IFBIWV8xMUcpICYmICgoU3VwUmF0ZUxlbitFeHRSYXRlTGVuKTwgMTIpKQotCQkJcmV0dXJuOwotCi0JCS8vIEJFQUNPTiBmcm9tIGRlc2lyZWQgQlNTL0lCU1MgZm91bmQuIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlY2lkZSBtb3N0Ci0JCS8vIEJTUyBwYXJhbWV0ZXJzIGhlcmUuCi0JCS8vIFEuIEJ1dCB3aGF0IGhhcHBlbiBpZiB0aGlzIEpPSU4gZG9lc24ndCBjb25jbHVkZSBhIHN1Y2Nlc3NmdWwgQVNTT0NJQVRFSU9OPwotCQkvLyAgICBEbyB3ZSBuZWVkIHRvIHJlY2VvdmVyIGJhY2sgYWxsIHBhcmFtZXRlcnMgYmVsb25naW5nIHRvIHByZXZpb3VzIEJTUz8KLQkJLy8gQS4gU2hvdWxkIGJlIG5vdC4gVGhlcmUncyBubyBiYWNrLWRvb3IgcmVjb3ZlciB0byBwcmV2aW91cyBBUC4gSXQgc3RpbGwgbmVlZAotCQkvLyAgICBhIG5ldyBKT0lOLUFVVEgtQVNTT0Mgc2VxdWVuY2UuCi0JCWlmIChNQUNfQUREUl9FUVVBTChwQWQtPk1sbWVBdXguQnNzaWQsIEJzc2lkKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIHJlY2VpdmUgZGVzaXJlZCBCRUFDT04gYXQgSm9pbldhaXRCZWFjb24uLi4gQ2hhbm5lbCA9ICVkXG4iLCBDaGFubmVsKSk7Ci0JCQlSVE1QQ2FuY2VsVGltZXIoJnBBZC0+TWxtZUF1eC5CZWFjb25UaW1lciwgJlRpbWVyQ2FuY2VsbGVkKTsKLQotCQkJLy8gVXBkYXRlIFJTU0kgdG8gcHJldmVudCBObyBzaWduYWwgZGlzcGxheSB3aGVuIGNhcmRzIGZpcnN0IGluaXRpYWxpemVkCi0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMAk9IENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKTsKLQkJCXBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kxCT0gQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpOwotCQkJcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIJPSBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMik7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kwIDw8IDM7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTE7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kxIDw8IDM7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyCT0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTI7Ci0JCQlwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyWDgJPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkF2Z1Jzc2kyIDw8IDM7Ci0KLQkJCS8vCi0JCQkvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIFNTSUQgb25seSBzZXQgdG8gYW55LCB0aGVuIHdlIGNhbiByZWNvcmQgdGhlIGN1cnJlbnQgU1NJRC4KLQkJCS8vIE90aGVyd2lzZSB3aWxsIGNhdXNlIGhpZGRlbiBTU0lEIGFzc29jaWF0aW9uIGZhaWxlZC4KLQkJCS8vCi0JCQlpZiAocEFkLT5NbG1lQXV4LlNzaWRMZW4gPT0gMCkKLQkJCXsKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPk1sbWVBdXguU3NpZCwgU3NpZCwgU3NpZExlbik7Ci0JCQkJcEFkLT5NbG1lQXV4LlNzaWRMZW4gPSBTc2lkTGVuOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUlkeCA9IEJzc1NzaWRUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgcEFkLT5NbG1lQXV4LlNzaWQsIHBBZC0+TWxtZUF1eC5Tc2lkTGVuLCBDaGFubmVsKTsKLQotCQkJCWlmIChJZHggPT0gQlNTX05PVF9GT1VORCkKLQkJCQl7Ci0JCQkJCUNIQVIgUnNzaSA9IDA7Ci0JCQkJCVJzc2kgPSBSVE1QTWF4UnNzaShwQWQsIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMCwgUlNTSV8wKSwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kxLCBSU1NJXzEpLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTIsIFJTU0lfMikpOwotCQkJCQlJZHggPSBCc3NUYWJsZVNldEVudHJ5KHBBZCwgJnBBZC0+U2NhblRhYiwgQnNzaWQsIChDSEFSICopIFNzaWQsIFNzaWRMZW4sIEJzc1R5cGUsIEJlYWNvblBlcmlvZCwKLQkJCQkJCQkJCQkmQ2YsIEF0aW1XaW4sIENhcGFiaWxpdHlJbmZvLCBTdXBSYXRlLCBTdXBSYXRlTGVuLCBFeHRSYXRlLCBFeHRSYXRlTGVuLCAgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCQkmQWRkSHRJbmZvLCBIdENhcGFiaWxpdHlMZW4sIEFkZEh0SW5mb0xlbiwgTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwgUnNzaSwgVGltZVN0YW1wLCBDa2lwRmxhZywKLQkJCQkJCQkJCQkmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LCAmUWJzc0xvYWQsIExlblZJRSwgcFZJRSk7Ci0JCQkJCWlmIChJZHggIT0gQlNTX05PVF9GT1VORCkKLQkJCQkJewotCQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uUFRTRiwgJkVsZW0tPk1zZ1syNF0sIDQpOwotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLlRUU0ZbMF0sICZFbGVtLT5UaW1lU3RhbXAudS5Mb3dQYXJ0LCA0KTsKLQkJCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbSWR4XS5UVFNGWzRdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQkJCQlDYXBhYmlsaXR5SW5mbyA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtJZHhdLkNhcGFiaWxpdHlJbmZvOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8vCi0JCQkJCS8vIE11bHRpcGxlIFNTSUQgY2FzZSwgdXNlZCBjb3JyZWN0IENhcGFiaWxpdHlJbmZvCi0JCQkJCS8vCi0JCQkJCUNhcGFiaWxpdHlJbmZvID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0lkeF0uQ2FwYWJpbGl0eUluZm87Ci0JCQkJfQotCQkJfQotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LkJzc2lkLCBCc3NpZCwgTUFDX0FERFJfTEVOKTsKLQkJCXBBZC0+TWxtZUF1eC5DYXBhYmlsaXR5SW5mbyA9IENhcGFiaWxpdHlJbmZvICYgU1VQUE9SVEVEX0NBUEFCSUxJVFlfSU5GTzsKLQkJCXBBZC0+TWxtZUF1eC5Cc3NUeXBlID0gQnNzVHlwZTsKLQkJCXBBZC0+TWxtZUF1eC5CZWFjb25QZXJpb2QgPSBCZWFjb25QZXJpb2Q7Ci0JCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IENoYW5uZWw7Ci0JCQlwQWQtPk1sbWVBdXguQXRpbVdpbiA9IEF0aW1XaW47Ci0JCQlwQWQtPk1sbWVBdXguQ2ZwUGVyaW9kID0gQ2YuQ2ZwUGVyaW9kOwotCQkJcEFkLT5NbG1lQXV4LkNmcE1heER1cmF0aW9uID0gQ2YuQ2ZwTWF4RHVyYXRpb247Ci0JCQlwQWQtPk1sbWVBdXguQVBSYWxpbmtJZSA9IFJhbGlua0llOwotCi0JCQkvLyBDb3B5IEFQJ3Mgc3VwcG9ydGVkIHJhdGUgdG8gTWxtZUF1eCBmb3IgY3JlYXRpbmcgYXNzb2ljYXRpb24gcmVxdWVzdAotCQkJLy8gQWxzbyBmaWx0ZXIgb3V0IG5vdCBzdXBwb3J0ZWQgcmF0ZQotCQkJcEFkLT5NbG1lQXV4LlN1cFJhdGVMZW4gPSBTdXBSYXRlTGVuOwotCQkJTmRpc01vdmVNZW1vcnkocEFkLT5NbG1lQXV4LlN1cFJhdGUsIFN1cFJhdGUsIFN1cFJhdGVMZW4pOwotCQkJUlRNUENoZWNrUmF0ZXMocEFkLCBwQWQtPk1sbWVBdXguU3VwUmF0ZSwgJnBBZC0+TWxtZUF1eC5TdXBSYXRlTGVuKTsKLQkJCXBBZC0+TWxtZUF1eC5FeHRSYXRlTGVuID0gRXh0UmF0ZUxlbjsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+TWxtZUF1eC5FeHRSYXRlLCBFeHRSYXRlLCBFeHRSYXRlTGVuKTsKLQkJCVJUTVBDaGVja1JhdGVzKHBBZCwgcEFkLT5NbG1lQXV4LkV4dFJhdGUsICZwQWQtPk1sbWVBdXguRXh0UmF0ZUxlbik7Ci0KLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZFBoeUluZm8uTUNTU2V0LCAxNik7Ci0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKCgocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFXRVBFbmFibGVkKSAmJiAocEFkLT5TdGFDZmcuV2VwU3RhdHVzICE9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpKQotCQkJCXx8IChwQWQtPkNvbW1vbkNmZy5IVF9EaXNhbGxvd1RLSVAgPT0gRkFMU0UpKQotCQkJewotCQkJCWJBbGxvd05yYXRlID0gVFJVRTsKLQkJCX0KLQotCQkJcEFkLT5NbG1lQXV4Lk5ld0V4dENoYW5uZWxPZmZzZXQgPSBOZXdFeHRDaGFubmVsT2Zmc2V0OwotCQkJcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eUxlbiA9IEh0Q2FwYWJpbGl0eUxlbjsKLQotCQkJUlRNUFplcm9NZW1vcnkoJnBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHksIFNJWkVfSFRfQ0FQX0lFKTsKLQkJCS8vIGZpbHRlciBvdXQgdW4tc3VwcG9ydGVkIGh0IHJhdGVzCi0JCQlpZiAoKChIdENhcGFiaWxpdHlMZW4gPiAwKSB8fCAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA+IDApKSAmJgotCQkJCSgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA+PSBQSFlfMTFBQkdOX01JWEVEKSAmJiAoYkFsbG93TnJhdGUpKSkKLQkJCXsKLQkJCQlSVE1QTW92ZU1lbW9yeSgmcEFkLT5NbG1lQXV4LkFkZEh0SW5mbywgJkFkZEh0SW5mbywgU0laRV9BRERfSFRfSU5GT19JRSk7Ci0KLQkJCQkvLyBTdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTUNTU2V0IHN0b3JlcyBQZWVyIEFQJ3MgMTFuIFJ4IGNhcGFiaWxpdHkKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLk1DU1NldCwgSHRDYXBhYmlsaXR5Lk1DU1NldCwgMTYpOwotCQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gTmV3RXh0Q2hhbm5lbE9mZnNldDsKLQkJCQlwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5TGVuID0gU0laRV9IVF9DQVBfSUU7Ci0JCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iSHRFbmFibGUgPSBUUlVFOwotCQkJCWlmIChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkKLQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkUGh5SW5mby5iUHJlTkh0ID0gVFJVRTsKLQkJCQlSVE1QQ2hlY2tIdChwQWQsIEJTU0lEX1dDSUQsICZIdENhcGFiaWxpdHksICZBZGRIdEluZm8pOwotCQkJCS8vIENvcHkgQVAgUGFyYW1ldGVyIHRvIFN0YUFjdGl2ZS4gIFRoaXMgaXMgYWxzbyBpbiBMaW5rVXAuCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiEgKE1wZHVEZW5zaXR5PSVkLCBNYXhSQW1wZHVGYWN0b3I9JWQsIEJXPSVkKVxuIiwKLQkJCQkJcEFkLT5TdGFBY3RpdmUuU3VwcG9ydGVkSHRQaHkuTXBkdURlbnNpdHksIHBBZC0+U3RhQWN0aXZlLlN1cHBvcnRlZEh0UGh5Lk1heFJBbXBkdUZhY3RvciwgSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mby5DaGFubmVsV2lkdGgpKTsKLQotCQkJCWlmIChBZGRIdEluZm9MZW4gPiAwKQotCQkJCXsKLQkJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW47Ci0JCQkJCS8vIENoZWNrIGFnYWluIHRoZSBCYW5kd2lkdGggY2FwYWJpbGl0eSBvZiB0aGlzIEFQLgotCQkJCQlpZiAoKEFkZEh0SW5mby5Db250cm9sQ2hhbiA+IDIpJiYgKEFkZEh0SW5mby5BZGRIdEluZm8uRXh0Q2hhbk9mZnNldCA9PSBFWFRDSEFfQkVMT1cpICYmIChIdENhcGFiaWxpdHkuSHRDYXBJbmZvLkNoYW5uZWxXaWR0aCA9PSBCV180MCkpCi0JCQkJCXsKLQkJCQkJCUNlbnRyYWxDaGFubmVsID0gQWRkSHRJbmZvLkNvbnRyb2xDaGFuIC0gMjsKLQkJCQkJfQotCQkJCQllbHNlIGlmICgoQWRkSHRJbmZvLkFkZEh0SW5mby5FeHRDaGFuT2Zmc2V0ID09IEVYVENIQV9BQk9WRSkgJiYgKEh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQ2hhbm5lbFdpZHRoID09IEJXXzQwKSkKLQkJCQkJewotCQkJCQkJQ2VudHJhbENoYW5uZWwgPSBBZGRIdEluZm8uQ29udHJvbENoYW4gKyAyOwotCQkJCQl9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgRXJyb3IgLgotCQkJCQlpZiAocEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsICE9IENlbnRyYWxDaGFubmVsKQotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiUGVlckJlYWNvbkF0Sm9pbkFjdGlvbiBIVD09PT5CZWFjb24gQ2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLiBNbG1lYXV4IENlbnRyYWxDaGFubmVsID0gJWRcbiIsIENlbnRyYWxDaGFubmVsLCBBZGRIdEluZm8uQ29udHJvbENoYW4sIHBBZC0+TWxtZUF1eC5DZW50cmFsQ2hhbm5lbCkpOwotCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlBlZXJCZWFjb25BdEpvaW5BY3Rpb24gSFQ9PT0+Q2VudHJhbCBDaGFubmVsID0gJWQsIENvbnRyb2wgQ2hhbm5lbCA9ICVkLCAgLlxuIiwgQ2VudHJhbENoYW5uZWwsIEFkZEh0SW5mby5Db250cm9sQ2hhbikpOwotCi0JCQkJfQotCi0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQl7Ci0JCQkJLy8gVG8gcHJldmVudCBlcnJvciwgbGV0IGxlZ2FjeSBBUCBtdXN0IGhhdmUgc2FtZSBDZW50cmFsQ2hhbm5lbCBhbmQgQ2hhbm5lbC4KLQkJCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA9PSAwKSAmJiAoUHJlTkh0Q2FwYWJpbGl0eUxlbiA9PSAwKSkKLQkJCQkJcEFkLT5NbG1lQXV4LkNlbnRyYWxDaGFubmVsID0gcEFkLT5NbG1lQXV4LkNoYW5uZWw7Ci0KLQkJCQlwQWQtPlN0YUFjdGl2ZS5TdXBwb3J0ZWRQaHlJbmZvLmJIdEVuYWJsZSA9IEZBTFNFOwotCQkJCXBBZC0+TWxtZUF1eC5OZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQkJCQlSVE1QWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4Lkh0Q2FwYWJpbGl0eSwgU0laRV9IVF9DQVBfSUUpOwotCQkJCXBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4gPSAwOwotCQkJCVJUTVBaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQWRkSHRJbmZvLCBTSVpFX0FERF9IVF9JTkZPX0lFKTsKLQkJCX0KLQotCQkJUlRNUFVwZGF0ZU1sbWVSYXRlKHBBZCk7Ci0KLQkJCS8vIGNvcHkgUU9TIHJlbGF0ZWQgaW5mb3JtYXRpb24KLQkJCWlmICgocEFkLT5Db21tb25DZmcuYldtbUNhcGFibGUpCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJIHx8IChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQpCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJKQotCQkJewotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBFZGNhUGFybSwgJkVkY2FQYXJtLCBzaXplb2YoRURDQV9QQVJNKSk7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+TWxtZUF1eC5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCAmUW9zQ2FwYWJpbGl0eSwgc2l6ZW9mKFFPU19DQVBBQklMSVRZX1BBUk0pKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQRWRjYVBhcm0sIHNpemVvZihFRENBX1BBUk0pKTsKLQkJCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5NbG1lQXV4LkFQUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNaZXJvTWVtb3J5KCZwQWQtPk1sbWVBdXguQVBRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOwotCQkJfQotCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gYWZ0ZXIgSk9JTiwgU3VwUmF0ZUxlbj0lZCwgRXh0UmF0ZUxlbj0lZFxuIiwKLQkJCQlwQWQtPk1sbWVBdXguU3VwUmF0ZUxlbiwgcEFkLT5NbG1lQXV4LkV4dFJhdGVMZW4pKTsKLQotCQkJaWYgKEFpcm9uZXRDZWxsUG93ZXJMaW1pdCAhPSAweEZGKQotCQkJewotCQkJCS8vV2UgbmVlZCB0byBjaGFuZ2Ugb3VyIFR4UG93ZXIgZm9yIENDWCAyLjAgQVAgQ29udHJvbCBvZiBDbGllbnQgVHJhbnNtaXQgUG93ZXIKLQkJCQlDaGFuZ2VUb0NlbGxQb3dlckxpbWl0KHBBZCwgQWlyb25ldENlbGxQb3dlckxpbWl0KTsKLQkJCX0KLQkJCWVsc2UgIC8vVXNlZCB0aGUgZGVmYXVsdCBUWCBQb3dlciBQZXJjZW50YWdlLgotCQkJCXBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlID0gcEFkLT5Db21tb25DZmcuVHhQb3dlckRlZmF1bHQ7Ci0KLQkJCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7Ci0JCQlTdGF0dXMgPSBNTE1FX1NVQ0NFU1M7Ci0JCQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfSk9JTl9DT05GLCAyLCAmU3RhdHVzKTsKLQkJfQotCQkvLyBub3QgdG8gbWUgQkVBQ09OLCBpZ25vcmVkCi0JfQotCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCXJlY2VpdmUgQkVBQ09OIGZyb20gcGVlcgotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1WT0lEIFBlZXJCZWFjb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICAgQnNzaWRbTUFDX0FERFJfTEVOXSwgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlDRl9QQVJNICAgICAgIENmUGFybTsKLQlVQ0hBUiAgICAgICAgIFNzaWRMZW4sIE1lc3NhZ2VUb01lPTAsIEJzc1R5cGUsIENoYW5uZWwsIE5ld0NoYW5uZWwsIGluZGV4PTA7Ci0JVUNIQVIgICAgICAgICBEdGltQ291bnQ9MCwgRHRpbVBlcmlvZD0wLCBCY2FzdEZsYWc9MDsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvLCBBdGltV2luLCBCZWFjb25QZXJpb2Q7Ci0JTEFSR0VfSU5URUdFUiBUaW1lU3RhbXA7Ci0JVVNIT1JUICAgICAgICBUYnR0TnVtVG9OZXh0V2FrZVVwOwotCVVDSEFSICAgICAgICAgRXJwOwotCVVDSEFSICAgICAgICAgU3VwUmF0ZVtNQVhfTEVOX09GX1NVUFBPUlRFRF9SQVRFU10sIEV4dFJhdGVbTUFYX0xFTl9PRl9TVVBQT1JURURfUkFURVNdOwotCVVDSEFSCQkgIFN1cFJhdGVMZW4sIEV4dFJhdGVMZW47Ci0JVUNIQVIJCSAgQ2tpcEZsYWc7Ci0JVVNIT1JUICAgICAgICBMZW5WSUU7Ci0JVUNIQVIJCSAgQWlyb25ldENlbGxQb3dlckxpbWl0OwotCUVEQ0FfUEFSTSAgICAgICBFZGNhUGFybTsKLQlRQlNTX0xPQURfUEFSTSAgUWJzc0xvYWQ7Ci0JUU9TX0NBUEFCSUxJVFlfUEFSTSBRb3NDYXBhYmlsaXR5OwotCVVMT05HICAgICAgICAgICBSYWxpbmtJZTsKLQkvLyBOZXcgZm9yIFdQQSBzZWN1cml0eSBzdWl0ZXMKLQlVQ0hBUgkJCQkJCVZhcklFW01BWF9WSUVfTEVOXTsJCS8vIFRvdGFsIFZJRSBsZW5ndGggPSBNQVhfVklFX0xFTiAtIC01Ci0JTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzCSpwVklFID0gTlVMTDsKLQlIVF9DQVBBQklMSVRZX0lFCQlIdENhcGFiaWxpdHk7Ci0JQUREX0hUX0lORk9fSUUJCUFkZEh0SW5mbzsJLy8gQVAgbWlnaHQgdXNlIHRoaXMgYWRkaXRpb25hbCBodCBpbmZvIElFCi0JVUNIQVIJCQlIdENhcGFiaWxpdHlMZW4sIFByZU5IdENhcGFiaWxpdHlMZW47Ci0JVUNIQVIJCQlBZGRIdEluZm9MZW47Ci0JVUNIQVIJCQlOZXdFeHRDaGFubmVsT2Zmc2V0ID0gMHhmZjsKLQotCi0jaWZkZWYgUkFMSU5LX0FURQotICAgIGlmIChBVEVfT04ocEFkKSkKLSAgICB7Ci0JCXJldHVybjsKLSAgICB9Ci0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JaWYgKCEoSU5GUkFfT04ocEFkKSB8fCBBREhPQ19PTihwQWQpCi0JCSkpCi0JCXJldHVybjsKLQotCS8vIEluaXQgVmFyaWFibGUgSUUgc3RydWN0dXJlCi0JcFZJRSA9IChQTkRJU184MDJfMTFfVkFSSUFCTEVfSUVzKSBWYXJJRTsKLQlwVklFLT5MZW5ndGggPSAwOwotICAgIFJUTVBaZXJvTWVtb3J5KCZIdENhcGFiaWxpdHksIHNpemVvZihIdENhcGFiaWxpdHkpKTsKLQlSVE1QWmVyb01lbW9yeSgmQWRkSHRJbmZvLCBzaXplb2YoQUREX0hUX0lORk9fSUUpKTsKLQotCWlmIChQZWVyQmVhY29uQW5kUHJvYmVSc3BTYW5pdHkocEFkLAotCQkJCQkJCQlFbGVtLT5Nc2csCi0JCQkJCQkJCUVsZW0tPk1zZ0xlbiwKLQkJCQkJCQkJRWxlbS0+Q2hhbm5lbCwKLQkJCQkJCQkJQWRkcjIsCi0JCQkJCQkJCUJzc2lkLAotCQkJCQkJCQlTc2lkLAotCQkJCQkJCQkmU3NpZExlbiwKLQkJCQkJCQkJJkJzc1R5cGUsCi0JCQkJCQkJCSZCZWFjb25QZXJpb2QsCi0JCQkJCQkJCSZDaGFubmVsLAotCQkJCQkJCQkmTmV3Q2hhbm5lbCwKLQkJCQkJCQkJJlRpbWVTdGFtcCwKLQkJCQkJCQkJJkNmUGFybSwKLQkJCQkJCQkJJkF0aW1XaW4sCi0JCQkJCQkJCSZDYXBhYmlsaXR5SW5mbywKLQkJCQkJCQkJJkVycCwKLQkJCQkJCQkJJkR0aW1Db3VudCwKLQkJCQkJCQkJJkR0aW1QZXJpb2QsCi0JCQkJCQkJCSZCY2FzdEZsYWcsCi0JCQkJCQkJCSZNZXNzYWdlVG9NZSwKLQkJCQkJCQkJU3VwUmF0ZSwKLQkJCQkJCQkJJlN1cFJhdGVMZW4sCi0JCQkJCQkJCUV4dFJhdGUsCi0JCQkJCQkJCSZFeHRSYXRlTGVuLAotCQkJCQkJCQkmQ2tpcEZsYWcsCi0JCQkJCQkJCSZBaXJvbmV0Q2VsbFBvd2VyTGltaXQsCi0JCQkJCQkJCSZFZGNhUGFybSwKLQkJCQkJCQkJJlFic3NMb2FkLAotCQkJCQkJCQkmUW9zQ2FwYWJpbGl0eSwKLQkJCQkJCQkJJlJhbGlua0llLAotCQkJCQkJCQkmSHRDYXBhYmlsaXR5TGVuLAotCQkJCQkJCQkmUHJlTkh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJJkFkZEh0SW5mb0xlbiwKLQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJJk5ld0V4dENoYW5uZWxPZmZzZXQsCi0JCQkJCQkJCSZMZW5WSUUsCi0JCQkJCQkJCXBWSUUpKQotCXsKLQkJQk9PTEVBTiBpc19teV9ic3NpZCwgaXNfbXlfc3NpZDsKLQkJVUxPTkcgICBCc3NpZHgsIE5vdzsKLQkJQlNTX0VOVFJZICpwQnNzOwotCQlDSEFSCQlSZWFsUnNzaSA9IFJUTVBNYXhSc3NpKHBBZCwgQ29udmVydFRvUnNzaShwQWQsIEVsZW0tPlJzc2kwLCBSU1NJXzApLCBDb252ZXJ0VG9Sc3NpKHBBZCwgRWxlbS0+UnNzaTEsIFJTU0lfMSksIENvbnZlcnRUb1Jzc2kocEFkLCBFbGVtLT5Sc3NpMiwgUlNTSV8yKSk7Ci0KLQkJaXNfbXlfYnNzaWQgPSBNQUNfQUREUl9FUVVBTChCc3NpZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpPyBUUlVFIDogRkFMU0U7Ci0JCWlzX215X3NzaWQgPSBTU0lEX0VRVUFMKFNzaWQsIFNzaWRMZW4sIHBBZC0+Q29tbW9uQ2ZnLlNzaWQsIHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW4pPyBUUlVFOkZBTFNFOwotCi0KLQkJLy8gaWdub3JlIEJFQUNPTiBub3QgZm9yIG15IFNTSUQKLQkJaWYgKCghIGlzX215X3NzaWQpICYmICghIGlzX215X2Jzc2lkKSkKLQkJCXJldHVybjsKLQotCQkvLyBJdCBtZWFucyBTVEEgd2FpdHMgZGlzYXNzb2MgY29tcGxldGVseSBmcm9tIHRoaXMgQVAsIGlnbm9yZXMgdGhpcyBiZWFjb24uCi0JCWlmIChwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID09IENOVExfV0FJVF9ESVNBU1NPQykKLQkJCXJldHVybjsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkvLyBDb3B5IENvbnRyb2wgY2hhbm5lbCBmb3IgdGhpcyBCU1NJRC4KLQkJaWYgKEFkZEh0SW5mb0xlbiAhPSAwKQotCQkJQ2hhbm5lbCA9IEFkZEh0SW5mby5Db250cm9sQ2hhbjsKLQotCQlpZiAoKEh0Q2FwYWJpbGl0eUxlbiA+IDApIHx8IChQcmVOSHRDYXBhYmlsaXR5TGVuID4gMCkpCi0JCQlIdENhcGFiaWxpdHlMZW4gPSBTSVpFX0hUX0NBUF9JRTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkvLwotCQkvLyBIb3VzZWtlZXBpbmcgIlNzaWRCc3NUYWIiIHRhYmxlIGZvciBsYXRlci1vbiBST0FNaW5nIHVzYWdlLgotCQkvLwotCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJewotCQkJLy8gZGlzY292ZXIgbmV3IEFQIG9mIHRoaXMgbmV0d29yaywgY3JlYXRlIEJTUyBlbnRyeQotCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkgJkNmUGFybSwgQXRpbVdpbiwgQ2FwYWJpbGl0eUluZm8sIFN1cFJhdGUsIFN1cFJhdGVMZW4sIEV4dFJhdGUsIEV4dFJhdGVMZW4sCi0JCQkJCQkmSHRDYXBhYmlsaXR5LCAmQWRkSHRJbmZvLEh0Q2FwYWJpbGl0eUxlbixBZGRIdEluZm9MZW4sTmV3RXh0Q2hhbm5lbE9mZnNldCwgQ2hhbm5lbCwKLQkJCQkJCVJlYWxSc3NpLCBUaW1lU3RhbXAsIENraXBGbGFnLCAmRWRjYVBhcm0sICZRb3NDYXBhYmlsaXR5LAotCQkJCQkJJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJaWYgKEJzc2lkeCA9PSBCU1NfTk9UX0ZPVU5EKSAvLyByZXR1cm4gaWYgQlNTIHRhYmxlIGZ1bGwKLQkJCQlyZXR1cm47Ci0KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLlBUU0YsICZFbGVtLT5Nc2dbMjRdLCA0KTsKLQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XS5UVFNGWzBdLCAmRWxlbS0+VGltZVN0YW1wLnUuTG93UGFydCwgNCk7Ci0JCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uVFRTRls0XSwgJkVsZW0tPlRpbWVTdGFtcC51Lkxvd1BhcnQsIDQpOwotCi0KLQotCQl9Ci0KLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iSUVFRTgwMjExSCA9PSAxKSAmJiAoTmV3Q2hhbm5lbCAhPSAwKSAmJiAoQ2hhbm5lbCAhPSBOZXdDaGFubmVsKSkKLQkJewotCQkJLy8gU3dpdGNoaW5nIHRvIGNoYW5uZWwgMSBjYW4gcHJldmVudCBmcm9tIHJlc2Nhbm5pbmcgdGhlIGN1cnJlbnQgY2hhbm5lbCBpbW1lZGlhdGVseSAoYnkgYXV0byByZWNvbm5lY3Rpb24pLgotCQkJLy8gSW4gYWRkaXRpb24sIGNsZWFyIHRoZSBNTE1FIHF1ZXVlIGFuZCB0aGUgc2NhbiB0YWJsZSB0byBkaXNjYXJkIHRoZSBSWCBwYWNrZXRzIGFuZCBwcmV2aW91cyBzY2FubmluZyByZXN1bHRzLgotCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCAxLCBGQUxTRSk7Ci0JCQlBc2ljTG9ja0NoYW5uZWwocEFkLCAxKTsKLQkJICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOwotCQkJTWxtZVF1ZXVlSW5pdCgmcEFkLT5NbG1lLlF1ZXVlKTsKLQkJCUJzc1RhYmxlSW5pdCgmcEFkLT5TY2FuVGFiKTsKLQkJICAgIFJUTVB1c2VjRGVsYXkoMTAwMDAwMCk7CQkvLyB1c2UgZGVsYXkgdG8gcHJldmVudCBTVEEgZG8gcmVhc3NvYwotCi0JCQkvLyBjaGFubmVsIHNhbml0eSBjaGVjawotCQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IHBBZC0+Q2hhbm5lbExpc3ROdW07IGluZGV4KyspCi0JCQl7Ci0JCQkJaWYgKHBBZC0+Q2hhbm5lbExpc3RbaW5kZXhdLkNoYW5uZWwgPT0gTmV3Q2hhbm5lbCkKLQkJCQl7Ci0JCQkJCXBBZC0+U2NhblRhYi5Cc3NFbnRyeVtCc3NpZHhdLkNoYW5uZWwgPSBOZXdDaGFubmVsOwotCQkJCQlwQWQtPkNvbW1vbkNmZy5DaGFubmVsID0gTmV3Q2hhbm5lbDsKLQkJCQkJQXNpY1N3aXRjaENoYW5uZWwocEFkLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBGQUxTRSk7Ci0JCQkJCUFzaWNMb2NrQ2hhbm5lbChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJQZWVyQmVhY29uIC0gU1RBIHJlY2VpdmUgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IElFIChOZXcgQ2hhbm5lbCA9JWQpXG4iLCBOZXdDaGFubmVsKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGluZGV4ID49IHBBZC0+Q2hhbm5lbExpc3ROdW0pCi0JCQl7Ci0JCQkJREJHUFJJTlRfRVJSKCgiUGVlckJlYWNvbihjYW4gbm90IGZpbmQgTmV3IENoYW5uZWw9JWQgaW4gQ2hhbm5lbExpc3RbJWRdXG4iLCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCBwQWQtPkNoYW5uZWxMaXN0TnVtKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgc3NpZCBtYXRjaGVkICYgYnNzaWQgdW5tYXRjaGVkLCB3ZSBzaG91bGQgc2VsZWN0IHRoZSBic3NpZCB3aXRoIGxhcmdlIHZhbHVlLgotCQkvLyBUaGlzIG1pZ2h0IGhhcHBlbmVkIHdoZW4gdHdvIFNUQSBzdGFydCBhdCB0aGUgc2FtZSB0aW1lCi0JCWlmICgoISBpc19teV9ic3NpZCkgJiYgQURIT0NfT04ocEFkKSkKLQkJewotCQkJSU5UCWk7Ci0KLQkJCS8vIEFkZCB0aGUgc2FmZWd1YXJkIGFnYWluc3QgdGhlIG1pc21hdGNoIG9mIGFkaG9jIHdlcCBzdGF0dXMKLQkJCWlmIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgIT0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W0Jzc2lkeF0uV2VwU3RhdHVzKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gY29sbGFwc2UgaW50byB0aGUgQURIT0MgbmV0d29yayB3aGljaCBoYXMgYmlnZ2VyIEJTU0lEIHZhbHVlLgotCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCXsKLQkJCQlpZiAoQnNzaWRbaV0gPiBwQWQtPkNvbW1vbkNmZy5Cc3NpZFtpXSkKLQkJCQl7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNZTkMgLSBtZXJnZSB0byB0aGUgSUJTUyB3aXRoIGJpZ2dlciBCU1NJRD0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJCQkJCUJzc2lkWzBdLCBCc3NpZFsxXSwgQnNzaWRbMl0sIEJzc2lkWzNdLCBCc3NpZFs0XSwgQnNzaWRbNV0pKTsKLQkJCQkJQXNpY0Rpc2FibGVTeW5jKHBBZCk7Ci0JCQkJCUNPUFlfTUFDX0FERFIocEFkLT5Db21tb25DZmcuQnNzaWQsIEJzc2lkKTsKLQkJCQkJQXNpY1NldEJzc2lkKHBBZCwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJCQlNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0JCQkJCUFzaWNFbmFibGVJYnNzU3luYyhwQWQpOyAgICAvLyBjb3B5IEJFQUNPTiBmcmFtZSB0byBvbi1jaGlwIG1lbW9yeQotCQkJCQlpc19teV9ic3NpZCA9IFRSVUU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChCc3NpZFtpXSA8IHBBZC0+Q29tbW9uQ2ZnLkJzc2lkW2ldKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0KLQkJTmRpc0dldFN5c3RlbVVwVGltZSgmTm93KTsKLQkJcEJzcyA9ICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbQnNzaWR4XTsKLQkJcEJzcy0+UnNzaSA9IFJlYWxSc3NpOyAgICAgICAvLyBsYXN0ZXN0IFJTU0kKLQkJcEJzcy0+TGFzdEJlYWNvblJ4VGltZSA9IE5vdzsgICAvLyBsYXN0IFJYIHRpbWVzdGFtcAotCi0JCS8vCi0JCS8vIEJFQUNPTiBmcm9tIG15IEJTU0lEIC0gZWl0aGVyIElCU1Mgb3IgSU5GUkEgbmV0d29yawotCQkvLwotCQlpZiAoaXNfbXlfYnNzaWQpCi0JCXsKLQkJCVJYV0lfU1RSVUMJUnhXSTsKLQotCQkJcEFkLT5TdGFDZmcuRHRpbUNvdW50ID0gRHRpbUNvdW50OwotCQkJcEFkLT5TdGFDZmcuRHRpbVBlcmlvZCA9IER0aW1QZXJpb2Q7Ci0JCQlwQWQtPlN0YUNmZy5MYXN0QmVhY29uUnhUaW1lID0gTm93OwotCi0KLQkJCVJ4V0kuUlNTSTAgPSBFbGVtLT5Sc3NpMDsKLQkJCVJ4V0kuUlNTSTEgPSBFbGVtLT5Sc3NpMTsKLQkJCVJ4V0kuUlNTSTIgPSBFbGVtLT5Sc3NpMjsKLQotCQkJVXBkYXRlX1Jzc2lfU2FtcGxlKHBBZCwgJnBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUsICZSeFdJKTsKLQkJCWlmIChBaXJvbmV0Q2VsbFBvd2VyTGltaXQgIT0gMHhGRikKLQkJCXsKLQkJCQkvLwotCQkJCS8vIFdlIGdldCB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIHJlcXVpcmVkCi0JCQkJLy8gQ2hhbmdlZCB0byBhcHByb3ByaWF0ZSBUeFBvd2VyIExpbWl0IGZvciBDaXNvIENvbXBhdGlibGUgRXh0ZW5zaW9ucwotCQkJCS8vCi0JCQkJQ2hhbmdlVG9DZWxsUG93ZXJMaW1pdChwQWQsIEFpcm9uZXRDZWxsUG93ZXJMaW1pdCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLy8KLQkJCQkvLyBBaXJvbmV0Q2VsbFBvd2VyTGltaXQgZXF1YWwgdG8gMHhGRiBtZWFucyB0aGUgQ2lzY28gKGNjeCkgIlR4UG93ZXIgTGltaXQiIG5vdCBleGlzdC4KLQkJCQkvLyBVc2VkIHRoZSBkZWZhdWx0IFRYIFBvd2VyIFBlcmNlbnRhZ2UsIHRoYXQgc2V0IGZyb20gVUkuCi0JCQkJLy8KLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotCQkJfQotCi0JCQlpZiAoQURIT0NfT04ocEFkKSAmJiAoQ0FQX0lTX0lCU1NfT04oQ2FwYWJpbGl0eUluZm8pKSkKLQkJCXsKLQkJCQlVQ0hBUgkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSAwOwotCQkJCVVDSEFSCQkJaWR4OwotCQkJCU1BQ19UQUJMRV9FTlRSWSAqcEVudHJ5OwotCi0JCQkJLy8gc3VwcG9ydGVkIHJhdGVzIGFycmF5IG1heSBub3QgYmUgc29ydGVkLiBzb3J0IGl0IGFuZCBmaW5kIHRoZSBtYXhpbXVtIHJhdGUKLQkJCSAgICBmb3IgKGlkeD0wOyBpZHg8U3VwUmF0ZUxlbjsgaWR4KyspCi0JCQkJewotCQkJICAgICAgICBpZiAoTWF4U3VwcG9ydGVkUmF0ZUluNTAwS2JwcyA8IChTdXBSYXRlW2lkeF0gJiAweDdmKSkKLQkJCSAgICAgICAgICAgIE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPSBTdXBSYXRlW2lkeF0gJiAweDdmOwotCQkJCQkJfQotCi0JCQkJZm9yIChpZHg9MDsgaWR4PEV4dFJhdGVMZW47IGlkeCsrKQotCQkJICAgIHsKLQkJCSAgICAgICAgaWYgKE1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMgPCAoRXh0UmF0ZVtpZHhdICYgMHg3ZikpCi0JCQkgICAgICAgICAgICBNYXhTdXBwb3J0ZWRSYXRlSW41MDBLYnBzID0gRXh0UmF0ZVtpZHhdICYgMHg3ZjsKLQkJCQkJfQotCi0JCQkJLy8gbG9vayB1cCB0aGUgZXhpc3RpbmcgdGFibGUKLQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIEFkZHIyKTsKLQotCQkJCS8vIEFkLWhvYyBtb2RlIGlzIHVzaW5nIE1BQyBhZGRyZXNzIGFzIEJBIHNlc3Npb24uIFNvIHdlIG5lZWQgdG8gY29udGludW91c2x5IGZpbmQgbmV3bHkgam9pbmVkIGFkaG9jIHN0YXRpb24gYnkgcmVjZWl2aW5nIGJlYWNvbi4KLQkJCQkvLyBUbyBwcmV2ZW50IGFsd2F5cyBjaGVjayB0aGlzLCB3ZSB1c2Ugd2NpZCA9PSBSRVNFUlZFRF9XQ0lEIHRvIHJlY29nbml6ZSBpdCBhcyBuZXdseSBqb2luZWQgYWRob2Mgc3RhdGlvbi4KLQkJCQlpZiAoKEFESE9DX09OKHBBZCkgJiYgKEVsZW0tPldjaWQgPT0gUkVTRVJWRURfV0NJRCkpIHx8Ci0JCQkJCShwRW50cnkgJiYgKChwRW50cnktPkxhc3RCZWFjb25SeFRpbWUgKyBBREhPQ19FTlRSWV9CRUFDT05fTE9TVF9USU1FKSA8IE5vdykpKQotCQkJCQkJewotCQkJCQlpZiAocEVudHJ5ID09IE5VTEwpCi0JCQkJCQkvLyBBbm90aGVyIGFkaG9jIGpvaW5pbmcsIGFkZCB0byBvdXIgTUFDIHRhYmxlLgotCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVJbnNlcnRFbnRyeShwQWQsIEFkZHIyLCBCU1MwLCBGQUxTRSk7Ci0KLQkJCQkJaWYgKFN0YUFkZE1hY1RhYmxlRW50cnkocEFkLAotCQkJCQkJCQkJCQlwRW50cnksCi0JCQkJCQkJCQkJCU1heFN1cHBvcnRlZFJhdGVJbjUwMEticHMsCi0JCQkJCQkJCQkJCSZIdENhcGFiaWxpdHksCi0JCQkJCQkJCQkJCUh0Q2FwYWJpbGl0eUxlbiwKLQkJCQkJCQkJCQkJJkFkZEh0SW5mbywKLQkJCQkJCQkJCQkJQWRkSHRJbmZvTGVuLAotCQkJCQkJCQkJCQlDYXBhYmlsaXR5SW5mbykgPT0gRkFMU0UpCi0JCQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DIC0gQWRkIEVudHJ5IGZhaWxlZC5cbiIpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChwRW50cnkgJiYKLQkJCQkJCShFbGVtLT5XY2lkID09IFJFU0VSVkVEX1dDSUQpKQotCQkJCXsKLQkJCQkJCWlkeCA9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZDsKLQkJCQkJCVJUTVBfU1RBX1NFQ1VSSVRZX0lORk9fQUREKHBBZCwgQlNTMCwgaWR4LCBwRW50cnkpOwotCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocEVudHJ5ICYmIHBFbnRyeS0+VmFsaWRBc0NMSSkKLQkJCQkJcEVudHJ5LT5MYXN0QmVhY29uUnhUaW1lID0gTm93OwotCi0JCQkJLy8gQXQgbGVhc3QgYW5vdGhlciBwZWVyIGluIHRoaXMgSUJTUywgZGVjbGFyZSBNZWRpYVN0YXRlIGFzIENPTk5FQ1RFRAotCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCQkJCXsKLQkJCQkJT1BTVEFUVVNfU0VUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0KLQkJCQkJcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQkJCQkJUlRNUF9JbmRpY2F0ZU1lZGlhU3RhdGUocEFkKTsKLQkgICAgICAgICAgICAgICAgcEFkLT5FeHRyYUluZm8gPSBHRU5FUkFMX0xJTktfVVA7Ci0JCQkJCUFzaWNTZXRCc3NpZChwQWQsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQotCQkJCQkvLyAyMDAzLzAzLzEyIC0gam9obgotCQkJCQkvLyBNYWtlIHN1cmUgdGhpcyBlbnRyeSBpbiAiU2NhblRhYiIgdGFibGUsIHRodXMgY29tcGxpZXMgdG8gTWljcm9zb2Z0J3MgcG9saWN5IHRoYXQKLQkJCQkJLy8gInNpdGUgc3VydmV5IiByZXN1bHQgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBjdXJyZW50IGNvbm5lY3RlZCBuZXR3b3JrLgotCQkJCQkvLwotCQkJCQlCc3NpZHggPSBCc3NUYWJsZVNlYXJjaCgmcEFkLT5TY2FuVGFiLCBCc3NpZCwgQ2hhbm5lbCk7Ci0JCQkJCWlmIChCc3NpZHggPT0gQlNTX05PVF9GT1VORCkKLQkJCQkJewotCQkJCQkJQnNzaWR4ID0gQnNzVGFibGVTZXRFbnRyeShwQWQsICZwQWQtPlNjYW5UYWIsIEJzc2lkLCBTc2lkLCBTc2lkTGVuLCBCc3NUeXBlLCBCZWFjb25QZXJpb2QsCi0JCQkJCQkJCQkmQ2ZQYXJtLCBBdGltV2luLCBDYXBhYmlsaXR5SW5mbywgU3VwUmF0ZSwgU3VwUmF0ZUxlbiwgRXh0UmF0ZSwgRXh0UmF0ZUxlbiwgJkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJCSZBZGRIdEluZm8sIEh0Q2FwYWJpbGl0eUxlbiwgQWRkSHRJbmZvTGVuLCBOZXdFeHRDaGFubmVsT2Zmc2V0LCBDaGFubmVsLCBSZWFsUnNzaSwgVGltZVN0YW1wLCAwLAotCQkJCQkJCQkJJkVkY2FQYXJtLCAmUW9zQ2FwYWJpbGl0eSwgJlFic3NMb2FkLCBMZW5WSUUsIHBWSUUpOwotCQkJCQl9Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkFESE9DICBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRC5cbiIpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChJTkZSQV9PTihwQWQpKQotCQkJewotCQkJCUJPT0xFQU4gYlVzZVNob3J0U2xvdCwgYlVzZUJHUHJvdGVjdGlvbjsKLQotCQkJCS8vIGRlY2lkZSB0byB1c2UvY2hhbmdlIHRvIC0KLQkJCQkvLyAgICAgIDEuIGxvbmcgc2xvdCAoMjAgdXMpIG9yIHNob3J0IHNsb3QgKDkgdXMpIHRpbWUKLQkJCQkvLyAgICAgIDIuIHR1cm4gb24vb2ZmIFJUUy9DVFMgYW5kL29yIENUUy10by1zZWxmIHByb3RlY3Rpb24KLQkJCQkvLyAgICAgIDMuIHNob3J0IHByZWFtYmxlCi0KLQkJCQkvL2JVc2VTaG9ydFNsb3QgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSAmJiBDQVBfSVNfU0hPUlRfU0xPVChDYXBhYmlsaXR5SW5mbyk7Ci0JCQkJYlVzZVNob3J0U2xvdCA9IENBUF9JU19TSE9SVF9TTE9UKENhcGFiaWxpdHlJbmZvKTsKLQkJCQlpZiAoYlVzZVNob3J0U2xvdCAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1NMT1RfSU5VU0VEKSkKLQkJCQkJQXNpY1NldFNsb3RUaW1lKHBBZCwgYlVzZVNob3J0U2xvdCk7Ci0KLQkJCQliVXNlQkdQcm90ZWN0aW9uID0gKHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiA9PSAxKSB8fCAgICAvLyBhbHdheXMgdXNlCi0JCQkJCQkJCSAgICgocEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uID09IDApICYmIEVSUF9JU19VU0VfUFJPVEVDVElPTihFcnApKTsKLQotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5DaGFubmVsID4gMTQpIC8vIGFsd2F5cyBubyBCRyBwcm90ZWN0aW9uIGluIEEtYmFuZC4gZmFsc2VseSBoYXBwZW5lZCB3aGVuIHN3aXRjaGluZyBBL0cgYmFuZCB0byBhIGR1YWwtYmFuZCBBUAotCQkJCQliVXNlQkdQcm90ZWN0aW9uID0gRkFMU0U7Ci0KLQkJCQlpZiAoYlVzZUJHUHJvdGVjdGlvbiAhPSBPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKSkKLQkJCQl7Ci0JCQkJCWlmIChiVXNlQkdQcm90ZWN0aW9uKQotCQkJCQl7Ci0JCQkJCQlPUFNUQVRVU19TRVRfRkxBRyhwQWQsIGZPUF9TVEFUVVNfQkdfUFJPVEVDVElPTl9JTlVTRUQpOwotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCAoT0ZETVNFVFBST1RFQ1R8Q0NLU0VUUFJPVEVDVHxBTExOX1NFVFBST1RFQ1QpLEZBTFNFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCU9QU1RBVFVTX0NMRUFSX0ZMQUcocEFkLCBmT1BfU1RBVFVTX0JHX1BST1RFQ1RJT05fSU5VU0VEKTsKLQkJCQkJCUFzaWNVcGRhdGVQcm90ZWN0KHBBZCwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSwgKE9GRE1TRVRQUk9URUNUfENDS1NFVFBST1RFQ1R8QUxMTl9TRVRQUk9URUNUKSxUUlVFLChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpKTsKLQkJCQkJfQotCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1dBUk4sICgiU1lOQyAtIEFQIGNoYW5nZWQgQi9HIHByb3RlY3Rpb24gdG8gJWRcbiIsIGJVc2VCR1Byb3RlY3Rpb24pKTsKLQkJCQl9Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQkvLyBjaGVjayBIdCBwcm90ZWN0aW9uIG1vZGUuIGFuZCBhZGhlcmUgdG8gdGhlIE5vbi1HRiBkZXZpY2UgaW5kaWNhdGlvbiBieSBBUC4KLQkJCQlpZiAoKEFkZEh0SW5mb0xlbiAhPSAwKSAmJgotCQkJCQkoKEFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSAhPSBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlKSB8fAotCQkJCQkoQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ICE9IHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQpKSkKLQkJCQl7Ci0JCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5Ob25HZlByZXNlbnQ7Ci0JCQkJCXBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUgPSBBZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGU7Ci0JCQkJCWlmIChwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuTm9uR2ZQcmVzZW50ID09IDEpCi0JCQkJewotCQkJCQkJQXNpY1VwZGF0ZVByb3RlY3QocEFkLCBwQWQtPk1sbWVBdXguQWRkSHRJbmZvLkFkZEh0SW5mbzIuT3BlcmFpb25Nb2RlLCBBTExOX1NFVFBST1RFQ1QsIEZBTFNFLCBUUlVFKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlBc2ljVXBkYXRlUHJvdGVjdChwQWQsIHBBZC0+TWxtZUF1eC5BZGRIdEluZm8uQWRkSHRJbmZvMi5PcGVyYWlvbk1vZGUsIEFMTE5fU0VUUFJPVEVDVCwgRkFMU0UsIEZBTFNFKTsKLQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlZCBOIE9wZXJhaW9uTW9kZSB0byAlZFxuIiwgcEFkLT5NbG1lQXV4LkFkZEh0SW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSkpOwotCQkJCX0KLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1NIT1JUX1BSRUFNQkxFX0lOVVNFRCkgJiYKLQkJCQkJRVJQX0lTX1VTRV9CQVJLRVJfUFJFQU1CTEUoRXJwKSkKLQkJCQl7Ci0JCQkJCU1sbWVTZXRUeFByZWFtYmxlKHBBZCwgUnQ4MDJfMTFQcmVhbWJsZUxvbmcpOwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgZm9yY2VkIHRvIHVzZSBMT05HIHByZWFtYmxlXG4iKSk7Ci0JCQkJfQotCi0JCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfV01NX0lOVVNFRCkgICAgJiYKLQkJCQkJKEVkY2FQYXJtLmJWYWxpZCA9PSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLQkJCQkJKEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCAhPSBwQWQtPkNvbW1vbkNmZy5BUEVkY2FQYXJtLkVkY2FVcGRhdGVDb3VudCkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTWU5DIC0gQVAgY2hhbmdlIEVEQ0EgcGFyYW1ldGVycyhmcm9tICVkIHRvICVkKVxuIiwKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50LAotCQkJCQkJRWRjYVBhcm0uRWRjYVVwZGF0ZUNvdW50KSk7Ci0JCQkJCUFzaWNTZXRFZGNhUGFybShwQWQsICZFZGNhUGFybSk7Ci0JCQkJfQotCi0JCQkJLy8gY29weSBRT1MgcmVsYXRlZCBpbmZvcm1hdGlvbgotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFic3NMb2FkLCAmUWJzc0xvYWQsIHNpemVvZihRQlNTX0xPQURfUEFSTSkpOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPkNvbW1vbkNmZy5BUFFvc0NhcGFiaWxpdHksICZRb3NDYXBhYmlsaXR5LCBzaXplb2YoUU9TX0NBUEFCSUxJVFlfUEFSTSkpOwotCQkJfQotCi0JCQkvLyBvbmx5IElORlJBU1RSVUNUVVJFIG1vZGUgc3VwcG9ydCBwb3dlci1zYXZpbmcgZmVhdHVyZQotCQkJaWYgKChJTkZSQV9PTihwQWQpICYmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFdSX1NBVkUpKSB8fCAocEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpCi0JCQl7Ci0JCQkJVUNIQVIgRnJlZU51bWJlcjsKLQkJCQkvLyAgMS4gQVAgaGFzIGJhY2tsb2dnZWQgdW5pY2FzdC10by1tZSBmcmFtZSwgc3RheSBBV0FLRSwgc2VuZCBQU1BPTEwKLQkJCQkvLyAgMi4gQVAgaGFzIGJhY2tsb2dnZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZSBhbmQgd2Ugd2FudCB0aG9zZSBmcmFtZXMsIHN0YXkgQVdBS0UKLQkJCQkvLyAgMy4gd2UgaGF2ZSBvdXRnb2luZyBmcmFtZXMgaW4gVHhSaW5nIG9yIE1nbXRSaW5nLCBiZXR0ZXIgc3RheSBBV0FLRQotCQkJCS8vICA0LiBQc20gY2hhbmdlIHRvIFBXUl9TQVZFLCBidXQgQVAgbm90IGJlZW4gaW5mb3JtZWQgeWV0LCB3ZSBiZXR0ZXIgc3RheSBBV0FLRQotCQkJCS8vICA1LiBvdGhlcndpc2UsIHB1dCBQSFkgYmFjayB0byBzbGVlcCB0byBzYXZlIGJhdHRlcnkuCi0JCQkJaWYgKE1lc3NhZ2VUb01lKQotCQkJCXsKLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQkJCQl7Ci0JCQkJCQkvLyBSZXN0b3JlIHRvIGNvcnJlY3QgQkJQIFIzIHZhbHVlCi0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCi0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7Ci0JCQkJCQkvLyBUdXJuIGNsayB0byA4ME1oei4KLQkJCQkJfQotI2VuZGlmIC8vIFJUTVBfTUFDX1BDSSAvLwotCQkJCQlpZiAocEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlICYmIHBBZC0+Q29tbW9uQ2ZnLkFQRWRjYVBhcm0uYkFQU0RDYXBhYmxlICYmCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFICYmIHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgJiYgcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSAmJiBwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPKQotCQkJCQl7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5iTmVlZFNlbmRUcmlnZ2VyRnJhbWUgPSBUUlVFOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCVJUTVBfUFNfUE9MTF9FTlFVRVVFKHBBZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEJjYXN0RmxhZyAmJiAoRHRpbUNvdW50ID09IDApICYmIE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSkKLQkJCQl7Ci0jaWZkZWYgUlRNUF9NQUNfUENJCi0JCQkJCWlmIChPUFNUQVRVU19URVNUX0ZMQUcocEFkLCBmT1BfU1RBVFVTX1BDSUVfREVWSUNFKSkKLQkJCQkJewotCQkJCQkJaWYgKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGggPiAxKQotCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWQsIEJCUF9SMywgcEFkLT5TdGFDZmcuQkJQUjMpOwotCQkJCQl9Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JCQkJfQotCQkJCWVsc2UgaWYgKChwQWQtPlR4U3dRdWV1ZVtRSURfQUNfQktdLk51bWJlciAhPSAwKQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19CRV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WSV0uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKHBBZC0+VHhTd1F1ZXVlW1FJRF9BQ19WT10uTnVtYmVyICE9IDApCQkJCQkJCQkJCQkJCQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19CSywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX0FDX0JFLCBUWF9SSU5HX1NJWkUgLSAxLCAmRnJlZU51bWJlcikgIT0gTkRJU19TVEFUVVNfU1VDQ0VTUykJfHwKLQkJCQkJCShSVE1QRnJlZVRYRFJlcXVlc3QocEFkLCBRSURfQUNfVkksIFRYX1JJTkdfU0laRSAtIDEsICZGcmVlTnVtYmVyKSAhPSBORElTX1NUQVRVU19TVUNDRVNTKQl8fAotCQkJCQkJKFJUTVBGcmVlVFhEUmVxdWVzdChwQWQsIFFJRF9BQ19WTywgVFhfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCXx8Ci0JCQkJCQkoUlRNUEZyZWVUWERSZXF1ZXN0KHBBZCwgUUlEX01HTVQsIE1HTVRfUklOR19TSVpFIC0gMSwgJkZyZWVOdW1iZXIpICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpKQotCQkJCXsKLQkJCQkJLy8gVE9ETzogY29uc2lkZXIgc2NoZWR1bGVkIEhDQ0EuIG1pZ2h0IG5vdCBiZSBwcm9wZXIgdG8gdXNlIHRyYWRpdGlvbmFsIERUSU0tYmFzZWQgcG93ZXItc2F2aW5nIHNjaGVtZQotCQkJCQkvLyBjYW4gd2UgY2hlYXQgaGVyZSAoaS5lLiBqdXN0IGNoZWNrIE1HTVQgJiBBQ19CRSkgZm9yIGJldHRlciBwZXJmb3JtYW5jZT8KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUENJRV9ERVZJQ0UpKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5BbnRlbm5hLmZpZWxkLlJ4UGF0aCA+IDEpCi0JCQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZCwgQkJQX1IzLCBwQWQtPlN0YUNmZy5CQlBSMyk7Ci0JCQkJCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKChwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyW1FJRF9BQ19WT10pIHx8Ci0JCQkJCQkocEFkLT5Db21tb25DZmcuYkFDTUFQU0RUcltRSURfQUNfVkldKSB8fAotCQkJCQkJKHBBZC0+Q29tbW9uQ2ZnLmJBQ01BUFNEVHJbUUlEX0FDX0JLXSkgfHwKLQkJCQkJCShwQWQtPkNvbW1vbkNmZy5iQUNNQVBTRFRyW1FJRF9BQ19CRV0pKQotCQkJCQl7Ci0JCQkJCQkvKgotCQkJCQkJCVdNTSBTcGVjIHYxLjAgMy42LjIuNCwKLQkJCQkJCQlUaGUgV01NIFNUQSBzaGFsbCByZW1haW4gYXdha2UgdW50aWwgaXQgcmVjZWl2ZXMgYQotCQkJCQkJCVFvUyBEYXRhIG9yIE51bGwgZnJhbWUgYWRkcmVzc2VkIHRvIGl0LCB3aXRoIHRoZQotCQkJCQkJCUVPU1Agc3ViZmllbGQgaW4gUW9TIENvbnRyb2wgZmllbGQgc2V0IHRvIDEuCi0KLQkJCQkJCQlTbyB3ZSBjYW4gbm90IHNsZWVwIGhlcmUgb3Igd2Ugd2lsbCBzdWZmZXIgYSBjYXNlOgotCi0JCQkJCQkJUFMgTWFuYWdlbWVudCBGcmFtZSAtLT4KLQkJCQkJCQlUcmlnZ2VyIGZyYW1lIC0tPgotCQkJCQkJCUJlYWNvbiAoVElNPTApIChCZWFjb24gaXMgY2xvc2VyIHRvIFRyaWcgZnJhbWUpIC0tPgotCQkJCQkJCVN0YXRpb24gZ29lcyB0byBzbGVlcCAtLT4KLQkJCQkJCQlBUCBkZWxpdmVyeSBxdWV1ZWQgVUFQU0QgcGFja2V0cyAtLT4KLQkJCQkJCQlTdGF0aW9uIGNhbiBOT1QgcmVjZWl2ZSB0aGUgcmVwbHkKLQotCQkJCQkJCU1heWJlIHdlIG5lZWQgYSB0aW1lb3V0IHRpbWVyIHRvIGF2b2lkIHRoYXQgd2UgZG8KLQkJCQkJCQlOT1QgcmVjZWl2ZSB0aGUgRU9TUCBmcmFtZS4KLQotCQkJCQkJCVdlIGNhbiBub3QgdXNlIE1vcmUgRGF0YSB0byBjaGVjayBpZiBTUCBpcyBlbmRlZAotCQkJCQkJCWR1ZSB0byBNYXhTUExlbmd0aC4KLQkJCQkJCSovCi0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlVU0hPUlQgTmV4dER0aW0gPSBEdGltQ291bnQ7Ci0KLQotCQkJCQkJaWYgKE5leHREdGltID09IDApCi0JCQkJCQkJTmV4dER0aW0gPSBEdGltUGVyaW9kOwotCi0JCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gcEFkLT5TdGFDZmcuRGVmYXVsdExpc3RlbkNvdW50OwotCQkJCQkJaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWQsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKSAmJiAoVGJ0dE51bVRvTmV4dFdha2VVcCA+IE5leHREdGltKSkKLQkJCQkJCQlUYnR0TnVtVG9OZXh0V2FrZVVwID0gTmV4dER0aW07Ci0KLQkJCQkJCWlmICghT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19ET1pFKSkKLQkJCQkJCXsKLQkJCQkJCQkvLyBTZXQgYSBmbGFnIHRvIGdvIHRvIHNsZWVwIC4gVGhlbiBhZnRlciBwYXJzZSB0aGlzIFJ4RG9uZUludGVycnVwdCwgd2lsbCBnbyB0byBzbGVlcCBtb2RlLgotCQkJCQkJCXBBZC0+VGhpc1RidHROdW1Ub05leHRXYWtlVXAgPSBUYnR0TnVtVG9OZXh0V2FrZVVwOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpY1NsZWVwVGhlbkF1dG9XYWtldXAocEFkLCBwQWQtPlRoaXNUYnR0TnVtVG9OZXh0V2FrZVVwKTsKLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vdCBteSBCU1NJRCwgaWdub3JlIGl0Ci0JfQotCS8vIHNhbml0eSBjaGVjayBmYWlsLCBpZ25vcmUgdGhpcyBmcmFtZQotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JCVJlY2VpdmUgUFJPQkUgUkVRIGZyb20gcmVtb3RlIHBlZXIgd2hlbiBvcGVyYXRpbmcgaW4gSUJTUyBtb2RlCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBQZWVyUHJvYmVSZXFBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVDSEFSICAgICAgICAgQWRkcjJbTUFDX0FERFJfTEVOXTsKLQlDSEFSICAgICAgICAgIFNzaWRbTUFYX0xFTl9PRl9TU0lEXTsKLQlVQ0hBUiAgICAgICAgIFNzaWRMZW47Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JVUNIQVIJCSAgSHRMZW4sIEFkZEh0TGVuLCBOZXdFeHRMZW47Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JSEVBREVSXzgwMl8xMSBQcm9iZVJzcEhkcjsKLQlORElTX1NUQVRVUyAgIE5TdGF0dXM7Ci0JUFVDSEFSICAgICAgICBwT3V0QnVmZmVyID0gTlVMTDsKLQlVTE9ORyAgICAgICAgIEZyYW1lTGVuID0gMDsKLQlMQVJHRV9JTlRFR0VSIEZha2VUaW1lc3RhbXA7Ci0JVUNIQVIgICAgICAgICBEc0xlbiA9IDEsIElic3NMZW4gPSAyOwotCVVDSEFSICAgICAgICAgTG9jYWxFcnBJZVszXSA9IHtJRV9FUlAsIDEsIDB9OwotCUJPT0xFQU4gICAgICAgUHJpdmFjeTsKLQlVU0hPUlQgICAgICAgIENhcGFiaWxpdHlJbmZvOwotCVVDSEFSCQkgIFJTTkllID0gSUVfV1BBOwotCi0JaWYgKCEgQURIT0NfT04ocEFkKSkKLQkJcmV0dXJuOwotCi0JaWYgKFBlZXJQcm9iZVJlcVNhbml0eShwQWQsIEVsZW0tPk1zZywgRWxlbS0+TXNnTGVuLCBBZGRyMiwgU3NpZCwgJlNzaWRMZW4pKQotCXsKLQkJaWYgKChTc2lkTGVuID09IDApIHx8IFNTSURfRVFVQUwoU3NpZCwgU3NpZExlbiwgcEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpCi0JCXsKLQkJCS8vIGFsbG9jYXRlIGFuZCBzZW5kIG91dCBQcm9iZVJzcCBmcmFtZQotCQkJTlN0YXR1cyA9IE1sbWVBbGxvY2F0ZU1lbW9yeShwQWQsICZwT3V0QnVmZmVyKTsgIC8vR2V0IGFuIHVudXNlZCBub25wYWdlZCBtZW1vcnkKLQkJCWlmIChOU3RhdHVzICE9IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJcmV0dXJuOwotCi0JCQkvL3BBZC0+U3RhQ2ZnLkF0aW1XaW4gPSAwOyAgLy8gPz8/Pz8/Ci0KLQkJCVByaXZhY3kgPSAocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQpIHx8Ci0JCQkJCSAgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCQkgIChwQWQtPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCk7Ci0JCQlDYXBhYmlsaXR5SW5mbyA9IENBUF9HRU5FUkFURSgwLCAxLCBQcml2YWN5LCAocEFkLT5Db21tb25DZmcuVHhQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlU2hvcnQpLCAwLCAwKTsKLQotCQkJTWFrZU91dGdvaW5nRnJhbWUocE91dEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJCSAgc2l6ZW9mKEhFQURFUl84MDJfMTEpLCAgICAgICAgJlByb2JlUnNwSGRyLAotCQkJCQkJCSAgVElNRVNUQU1QX0xFTiwgICAgICAgICAgICAgICAgJkZha2VUaW1lc3RhbXAsCi0JCQkJCQkJICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNhcGFiaWxpdHlJbmZvLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNzaWRJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAotCQkJCQkJCSAgcEFkLT5Db21tb25DZmcuU3NpZExlbiwgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZUxlbiwKLQkJCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGUsCi0JCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRHNJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEc0xlbiwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLAotCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJklic3NJZSwKLQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJYnNzTGVuLAotCQkJCQkJCSAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLkF0aW1XaW4sCi0JCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0KLQkJCWlmIChwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuKQotCQkJewotCQkJCVVMT05HIHRtcDsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAmdG1wLAotCQkJCQkJCQkgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsRXJwSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4dFJhdGVJZSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZUxlbiwKLQkJCQkJCQkJICBwQWQtPlN0YUFjdGl2ZS5FeHRSYXRlTGVuLCAgICAmcEFkLT5TdGFBY3RpdmUuRXh0UmF0ZSwKLQkJCQkJCQkJICBFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gdG1wOwotCQkJfQotCi0JCQkvLyBJZiBhZGhvYyBzZWNydWl0eSBpcyBzZXQgZm9yIFdQQS1Ob25lLCBhcHBlbmQgdGhlIGNpcGhlciBzdWl0ZSBJRQotCQkJaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0JCQl7Ci0JCQkJVUxPTkcgdG1wOwotCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwJCSZ0bXAsCi0JCQkJCQkJCQkxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSU05JZSwKLQkJCQkJCQkJCTEsCQkJCSZwQWQtPlN0YUNmZy5SU05JRV9MZW4sCi0JCQkJCQkJCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4sCQlwQWQtPlN0YUNmZy5SU05fSUUsCi0JCQkJCQkJCQlFTkRfT0ZfQVJHUyk7Ci0JCQkJRnJhbWVMZW4gKz0gdG1wOwotCQkJfQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCkKLQkJCXsKLQkJCQlVTE9ORyBUbXBMZW47Ci0JCQkJVUNIQVIJQlJPQURDT01bNF0gPSB7MHgwLCAweDkwLCAweDRjLCAweDMzfTsKLQkJCQlIdExlbiA9IHNpemVvZihwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkpOwotCQkJCUFkZEh0TGVuID0gc2l6ZW9mKHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mbyk7Ci0JCQkJTmV3RXh0TGVuID0gMTsKLQkJCQkvL05ldyBleHRlbnNpb24gY2hhbm5lbCBvZmZzZXQgSUUgaXMgaW5jbHVkZWQgaW4gQmVhY29uLCBQcm9iZSBSc3Agb3IgY2hhbm5lbCBTd2l0Y2ggQW5ub3VuY2VtZW50IEZyYW1lCi0JCQkJaWYgKHBBZC0+YkJyb2FkQ29tSFQgPT0gVFJVRSkKLQkJCQl7Ci0JCQkJCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIgKyBGcmFtZUxlbiwgICAgICAgICAgICAmVG1wTGVuLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV3BhSWUsCi0JCQkJCQkJCSAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCUk9BRENPTVswXSwKLQkJCQkJCQkJIHBBZC0+TWxtZUF1eC5IdENhcGFiaWxpdHlMZW4sICAgICAgICAgICZwQWQtPk1sbWVBdXguSHRDYXBhYmlsaXR5LAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQlNYWtlT3V0Z29pbmdGcmFtZShwT3V0QnVmZmVyICsgRnJhbWVMZW4sICAgICAgICAgICAgJlRtcExlbiwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkh0Q2FwSWUsCi0JCQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIdExlbiwKLQkJCQkJCQkJIHNpemVvZihIVF9DQVBBQklMSVRZX0lFKSwgICAgICAgICAgJnBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eSwKLQkJCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFkZEh0SW5mb0llLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWRkSHRMZW4sCi0JCQkJCQkJCSBzaXplb2YoQUREX0hUX0lORk9fSUUpLCAgICAgICAgICAmcEFkLT5Db21tb25DZmcuQWRkSFRJbmZvLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0Q2hhbkllLAotCQkJCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTmV3RXh0TGVuLAotCQkJCQkJCQkgc2l6ZW9mKE5FV19FWFRfQ0hBTl9JRSksICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5OZXdFeHRDaGFuT2Zmc2V0LAotCQkJCQkJCQkgIEVORF9PRl9BUkdTKTsKLQkJCQl9Ci0JCQkJRnJhbWVMZW4gKz0gVG1wTGVuOwotCQkJfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCBwT3V0QnVmZmVyLCBGcmFtZUxlbik7Ci0JCQlNbG1lRnJlZU1lbW9yeShwQWQsIHBPdXRCdWZmZXIpOwotCQl9Ci0JfQotfQotCi1WT0lEIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU1lOQyAtIEJlYWNvblRpbWVvdXRBdEpvaW5BY3Rpb25cbiIpKTsKLQlwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlID0gU1lOQ19JRExFOwotCVN0YXR1cyA9IE1MTUVfUkVKX1RJTUVPVVQ7Ci0JTWxtZUVucXVldWUocEFkLCBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwgTVQyX0pPSU5fQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQkJU2NhbiB0aW1lb3V0IHByb2NlZHVyZS4gYmFzaWNhbGx5IGFkZCBjaGFubmVsIGluZGV4IGJ5IDEgYW5kIHJlc2NhbgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgU2NhblRpbWVvdXRBY3Rpb24oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gTmV4dENoYW5uZWwocEFkLCBwQWQtPk1sbWVBdXguQ2hhbm5lbCk7Ci0KLQkvLyBPbmx5IG9uZSBjaGFubmVsIHNjYW5uZWQgZm9yIENJU0NPIGJlYWNvbiByZXF1ZXN0Ci0JaWYgKChwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19BQ1RJVkUpIHx8Ci0JCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19QQVNTSVZFKSB8fAotCQkocEFkLT5NbG1lQXV4LlNjYW5UeXBlID09IFNDQU5fQ0lTQ09fTk9JU0UpIHx8Ci0JCShwQWQtPk1sbWVBdXguU2NhblR5cGUgPT0gU0NBTl9DSVNDT19DSEFOTkVMX0xPQUQpKQotCQlwQWQtPk1sbWVBdXguQ2hhbm5lbCA9IDA7Ci0KLQkvLyB0aGlzIHJvdXRpbmUgd2lsbCBzdG9wIGlmIHBBZC0+TWxtZUF1eC5DaGFubmVsID09IDAKLQlTY2FuTmV4dENoYW5uZWwocEFkKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgSW52YWxpZFN0YXRlV2hlblNjYW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQVlOQyAtIEludmFsaWRTdGF0ZVdoZW5TY2FuKHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU0NBTl9DT05GLCAyLCAmU3RhdHVzKTsKLX0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgSW52YWxpZFN0YXRlV2hlbkpvaW4oCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlbkpvaW4oc3RhdGU9JWxkKS4gUmVzZXQgU1lOQyBtYWNoaW5lXG4iLCBwQWQtPk1sbWUuU3luY01hY2hpbmUuQ3VyclN0YXRlKSk7Ci0JcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSA9IFNZTkNfSURMRTsKLQlTdGF0dXMgPSBNTE1FX1NUQVRFX01BQ0hJTkVfUkVKRUNUOwotCU1sbWVFbnF1ZXVlKHBBZCwgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsIE1UMl9KT0lOX0NPTkYsIDIsICZTdGF0dXMpOwotfQotCi0vKgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JRGVzY3JpcHRpb246Ci0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBJbnZhbGlkU3RhdGVXaGVuU3RhcnQoCi0JSU4gUFJUTVBfQURBUFRFUiBwQWQsCi0JSU4gTUxNRV9RVUVVRV9FTEVNICpFbGVtKQotewotCVVTSE9SVCBTdGF0dXM7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSW52YWxpZFN0YXRlV2hlblN0YXJ0KHN0YXRlPSVsZCkuIFJlc2V0IFNZTkMgbWFjaGluZVxuIiwgcEFkLT5NbG1lLlN5bmNNYWNoaW5lLkN1cnJTdGF0ZSkpOwotCXBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPSBTWU5DX0lETEU7Ci0JU3RhdHVzID0gTUxNRV9TVEFURV9NQUNISU5FX1JFSkVDVDsKLQlNbG1lRW5xdWV1ZShwQWQsIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLCBNVDJfU1RBUlRfQ09ORiwgMiwgJlN0YXR1cyk7Ci19Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQlEZXNjcmlwdGlvbjoKLQotCUlSUUwgPSBESVNQQVRDSF9MRVZFTAotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotVk9JRCBFbnF1ZXVlUHNQb2xsKAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotI2lmZGVmIFJBTElOS19BVEUKLSAgICBpZiAoQVRFX09OKHBBZCkpCi0gICAgewotCQlyZXR1cm47Ci0gICAgfQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQotCi0JaWYgKHBBZC0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPT0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1ApCi0JcEFkLT5Qc1BvbGxGcmFtZS5GQy5Qd3JNZ210ID0gUFdSX1NBVkU7Ci0JTWluaXBvcnRNTVJlcXVlc3QocEFkLCAwLCAoUFVDSEFSKSZwQWQtPlBzUG9sbEZyYW1lLCBzaXplb2YoUFNQT0xMX0ZSQU1FKSk7Ci19Ci0KLQotLyoKLQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCURlc2NyaXB0aW9uOgotCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLVZPSUQgRW5xdWV1ZVByb2JlUmVxdWVzdCgKLQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlORElTX1NUQVRVUyAgICAgTlN0YXRlOwotCVBVQ0hBUiAgICAgICAgICBwT3V0QnVmZmVyOwotCVVMT05HICAgICAgICAgICBGcmFtZUxlbiA9IDA7Ci0JSEVBREVSXzgwMl8xMSAgIEhkcjgwMjExOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiZm9yY2Ugb3V0IGEgUHJvYmVSZXF1ZXN0IC4uLlxuIikpOwotCi0JTlN0YXRlID0gTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgJnBPdXRCdWZmZXIpOyAgLy9HZXQgYW4gdW51c2VkIG5vbnBhZ2VkIG1lbW9yeQotCWlmIChOU3RhdGUgPT0gTkRJU19TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCU1ndE1hY0hlYWRlckluaXQocEFkLCAmSGRyODAyMTEsIFNVQlRZUEVfUFJPQkVfUkVRLCAwLCBCUk9BRENBU1RfQUREUiwgQlJPQURDQVNUX0FERFIpOwotCi0JCS8vIHRoaXMgUHJvYmVSZXF1ZXN0IGV4cGxpY2l0bHkgc3BlY2lmeSBTU0lEIHRvIHJlZHVjZSB1bndhbnRlZCBQcm9iZVJlc3BvbnNlCi0JCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkJCQkJICBzaXplb2YoSEVBREVSXzgwMl8xMSksICAgICAgICAgICZIZHI4MDIxMSwKLQkJCQkJCSAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3NpZEllLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAotCQkJCQkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkTGVuLAkJICBwQWQtPkNvbW1vbkNmZy5Tc2lkLAotCQkJCQkJICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdXBSYXRlSWUsCi0JCQkJCQkgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sCi0JCQkJCQkgIHBBZC0+U3RhQWN0aXZlLlN1cFJhdGVMZW4sICAgICAgcEFkLT5TdGFBY3RpdmUuU3VwUmF0ZSwKLQkJCQkJCSAgRU5EX09GX0FSR1MpOwotCQlNaW5pcG9ydE1NUmVxdWVzdChwQWQsIDAsIHBPdXRCdWZmZXIsIEZyYW1lTGVuKTsKLQkJTWxtZUZyZWVNZW1vcnkocEFkLCBwT3V0QnVmZmVyKTsKLQl9Ci0KLX0KLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotI2lmZGVmIERPVDExTl9EUkFGVDMKLVZPSUQgQnVpbGRFZmZlY3RlZENoYW5uZWxMaXN0KAotCUlOIFBSVE1QX0FEQVBURVIgcEFkKQotewotCVVDSEFSCQlFQ2hhbm5lbFsxMV07Ci0JVUNIQVIJCWksIGosIGs7Ci0JVUNIQVIJCVVwcGVyQ2hhbm5lbCA9IDAsIExvd2VyQ2hhbm5lbCA9IDA7Ci0KLQlSVE1QWmVyb01lbW9yeShFQ2hhbm5lbCwgMTEpOwotCWkgPSAwOwotCS8vIEZpbmQgdXBwZXIgY2hhbm5lbCBhbmQgbG93ZXIgY2hhbm5lbC4KLQlpZiAocEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKQotCXsKLQkJVXBwZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQkJTG93ZXJDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7Ci0JfQotCWVsc2UgaWYgKHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID4gcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkKLQl7Ci0JCVVwcGVyQ2hhbm5lbCA9IHBBZC0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsOwotCQlMb3dlckNoYW5uZWwgPSBwQWQtPkNvbW1vbkNmZy5DaGFubmVsOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYmVsb3cgbG93ZXIgY2hhbm5lbC4uCi0JaWYgKExvd2VyQ2hhbm5lbCA+IDEpCi0JewotCQlFQ2hhbm5lbFswXSA9IExvd2VyQ2hhbm5lbCAtIDE7Ci0JCWkgPSAxOwotCQlpZiAoTG93ZXJDaGFubmVsID4gMikKLQkJewotCQkJRUNoYW5uZWxbMV0gPSBMb3dlckNoYW5uZWwgLSAyOwotCQkJaSA9IDI7Ci0JCQlpZiAoTG93ZXJDaGFubmVsID4gMykKLQkJCXsKLQkJCQlFQ2hhbm5lbFsyXSA9IExvd2VyQ2hhbm5lbCAtIDM7Ci0JCQkJaSA9IDM7Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYmV0d2VlbiAgbG93ZXIgY2hhbm5lbCBhbmQgdXBwZXIgY2hhbm5lbC4KLQlmb3IgKGsgPSBMb3dlckNoYW5uZWw7ayA8IFVwcGVyQ2hhbm5lbDtrKyspCi0JewotCQlFQ2hhbm5lbFtpXSA9IGs7Ci0JCWkrKzsKLQl9Ci0JLy8gUmVjb3JkIGNoYW5uZWxzIHRoYXQgaXMgYWJvdmUgdXBwZXIgY2hhbm5lbC4uCi0JaWYgKExvd2VyQ2hhbm5lbCA8IDExKQotCXsKLQkJRUNoYW5uZWxbaV0gPSBVcHBlckNoYW5uZWwgKyAxOwotCQlpKys7Ci0JCWlmIChMb3dlckNoYW5uZWwgPCAxMCkKLQkJewotCQkJRUNoYW5uZWxbaV0gPSBMb3dlckNoYW5uZWwgKyAyOwotCQkJaSsrOwotCQkJaWYgKExvd2VyQ2hhbm5lbCA8IDkpCi0JCQl7Ci0JCQkJRUNoYW5uZWxbaV0gPSBMb3dlckNoYW5uZWwgKyAzOwotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQkvLwotCWZvciAoaiA9IDA7aiA8IGk7aisrKQotCXsKLQkJZm9yIChrID0gMDtrIDwgcEFkLT5DaGFubmVsTGlzdE51bTtrKyspCi0JCXsKLQkJCWlmIChwQWQtPkNoYW5uZWxMaXN0W2tdLkNoYW5uZWwgPT0gRUNoYW5uZWxbal0pCi0JCQl7Ci0JCQkJcEFkLT5DaGFubmVsTGlzdFtrXS5iRWZmZWN0ZWRDaGFubmVsID0gVFJVRTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIiBFZmZlY3RlZENoYW5uZWwoID0lZClcbiIsIEVDaGFubmVsW2pdKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLy8gRE9UMTFOX0RSQUZUMyAvLwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1CT09MRUFOIFNjYW5SdW5uaW5nKAotCQlJTiBQUlRNUF9BREFQVEVSIHBBZCkKLXsKLQlyZXR1cm4gKHBBZC0+TWxtZS5TeW5jTWFjaGluZS5DdXJyU3RhdGUgPT0gU0NBTl9MSVNURU4pID8gVFJVRSA6IEZBTFNFOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGEvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS93cGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZGJhNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3N0YS93cGEuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCU1vZHVsZSBOYW1lOgotCXdwYS5jCi0KLQlBYnN0cmFjdDoKLQotCVJldmlzaW9uIEhpc3Rvcnk6Ci0JV2hvCQkJV2hlbgkJCVdoYXQKLQktLS0tLS0tLQktLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JSmFuCUxlZQkJMDMtMDctMjIJCUluaXRpYWwKLQlQYXVsIExpbgkwMy0xMS0yOAkJTW9kaWZ5IGZvciBzdXBwbGljYW50Ci0qLwotCi0jaW5jbHVkZSAiLi4vcnRfY29uZmlnLmgiCi0KLQotdm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbik7Ci0KLS8qCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQlSb3V0aW5lIERlc2NyaXB0aW9uOgotCQlQcm9jZXNzIE1JQyBlcnJvciBpbmRpY2F0aW9uIGFuZCByZWNvcmQgTUlDIGVycm9yIHRpbWVyLgotCi0JQXJndW1lbnRzOgotCQlwQWQJUG9pbnRlciB0byBvdXIgYWRhcHRlcgotCQlwV3BhS2V5CQkJUG9pbnRlciB0byB0aGUgV1BBIGtleSBzdHJ1Y3R1cmUKLQotCVJldHVybiBWYWx1ZToKLQkJTm9uZQotCi0JSVJRTCA9IERJU1BBVENIX0xFVkVMCi0KLQlOb3RlOgotCi0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRAlSVE1QUmVwb3J0TWljRXJyb3IoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUENJUEhFUl9LRVkJcFdwYUtleSkKLXsKLQlVTE9ORwlOb3c7Ci0gICAgVUNIQVIgICB1bmljYXN0S2V5ID0gKHBXcGFLZXktPlR5cGUgPT0gUEFJUldJU0VfS0VZID8gMTowKTsKLQotCS8vIFJlY29yZCBMYXN0IE1JQyBlcnJvciB0aW1lIGFuZCBjb3VudAotCU5kaXNHZXRTeXN0ZW1VcFRpbWUoJk5vdyk7Ci0JaWYgKHBBZC0+U3RhQ2ZnLk1pY0VyckNudCA9PSAwKQotCXsKLQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7Ci0JCXBBZC0+U3RhQ2ZnLkxhc3RNaWNFcnJvclRpbWUgPSBOb3c7Ci0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlJlcGxheUNvdW50ZXIsIDgpOwotCX0KLQllbHNlIGlmIChwQWQtPlN0YUNmZy5NaWNFcnJDbnQgPT0gMSkKLQl7Ci0JCWlmICgocEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSArICg2MCAqIE9TX0haKSkgPCBOb3cpCi0JCXsKLQkJCS8vIFVwZGF0ZSBMYXN0IE1JQyBlcnJvciB0aW1lLCB0aGlzIGRpZCBub3QgdmlvbGF0ZSB0d28gTUlDIGVycm9ycyB3aXRoaW4gNjAgc2Vjb25kcwotCQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKLQkJfQotCQllbHNlCi0JCXsKLQotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLmJXaXJlbGVzc0V2ZW50KQotCQkJCVJUTVBTZW5kV2lyZWxlc3NFdmVudChwQWQsIElXX0NPVU5URVJfTUVBU1VSRVNfRVZFTlRfRkxBRywgcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5BZGRyLCBCU1MwLCAwKTsKLQotCQkJcEFkLT5TdGFDZmcuTGFzdE1pY0Vycm9yVGltZSA9IE5vdzsKLQkJCS8vIFZpb2xhdGUgTUlDIGVycm9yIGNvdW50cywgTUlDIGNvdW50ZXJtZWFzdXJlcyBraWNrcyBpbgotCQkJcEFkLT5TdGFDZmcuTWljRXJyQ250Kys7Ci0JCQkvLyBXZSBzaGFsbCBibG9jayBhbGwgcmVjZXB0aW9uCi0JCQkvLyBXZSBzaGFsbCBjbGVhbiBhbGwgVHggcmluZyBhbmQgZGlzYXNzb2ljYXRlIGZyb20gQVAgYWZ0ZXIgbmV4dCBFQVBPTCBmcmFtZQotCQkJLy8KLQkJCS8vIE5vIG5lY2Vzc2FyeSB0byBjbGVhbiBhbGwgVHggcmluZywgb24gUlRNUEhhcmRUcmFuc21pdCB3aWxsIHN0b3Agc2VuZGluZyBub24tODAyLjFYIEVBUE9MIHBhY2tldHMKLQkJCS8vIGlmIHBBZC0+U3RhQ2ZnLk1pY0VyckNudCBncmVhdGVyIHRoYW4gMi4KLQkJCS8vCi0JCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfQkspOwotCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0FDX0JFKTsKLQkJCS8vIFJUTVBSaW5nQ2xlYW5VcChwQWQsIFFJRF9BQ19WSSk7Ci0JCQkvLyBSVE1QUmluZ0NsZWFuVXAocEFkLCBRSURfQUNfVk8pOwotCQkJLy8gUlRNUFJpbmdDbGVhblVwKHBBZCwgUUlEX0hDQ0EpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIE1JQyBlcnJvciBjb3VudCA+PSAyCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJOwotCX0KLSAgICBNbG1lRW5xdWV1ZShwQWQsCi0JCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQkJT0lEXzgwMl8xMV9NSUNfRkFJTFVSRV9SRVBPUlRfRlJBTUUsCi0JCQkJMSwKLQkJCQkmdW5pY2FzdEtleSk7Ci0KLSAgICBpZiAocEFkLT5TdGFDZmcuTWljRXJyQ250ID09IDIpCi0gICAgewotICAgICAgICBSVE1QU2V0VGltZXIoJnBBZC0+U3RhQ2ZnLldwYURpc2Fzc29jQW5kQmxvY2tBc3NvY1RpbWVyLCAxMDApOwotICAgIH0KLX0KLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotI2RlZmluZQlMRU5HVEhfRUFQX0ggICAgNAotLy8gSWYgdGhlIHJlY2VpdmVkIGZyYW1lIGlzIEVBUC1QYWNrZXQgLGZpbmQgb3V0IGl0cyBFQVAtQ29kZSAoUmVxdWVzdCgweDAxKSwgUmVzcG9uc2UoMHgwMiksIFN1Y2Nlc3MoMHgwMyksIEZhaWx1cmUoMHgwNCkpLgotSU5UCSAgICBXcGFDaGVja0VhcENvZGUoCi0JSU4gIFBSVE1QX0FEQVBURVIJCXBBZCwKLQlJTiAgUFVDSEFSCQkJCXBGcmFtZSwKLQlJTiAgVVNIT1JUCQkJCUZyYW1lTGVuLAotCUlOICBVU0hPUlQJCQkJT2ZmU2V0KQotewotCi0JUFVDSEFSCXBEYXRhOwotCUlOVAlyZXN1bHQgPSAwOwotCi0JaWYoIEZyYW1lTGVuIDwgT2ZmU2V0ICsgTEVOR1RIX0VBUE9MX0ggKyBMRU5HVEhfRUFQX0ggKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JcERhdGEgPSBwRnJhbWUgKyBPZmZTZXQ7IC8vIHNraXAgb2Zmc2V0IGJ5dGVzCi0KLQlpZigqKHBEYXRhKzEpID09IEVBUFBhY2tldCkJLy8gODAyLjF4IGhlYWRlciAtIFBhY2tldCBUeXBlCi0JewotCQkgcmVzdWx0ID0gKihwRGF0YSs0KTsJCS8vIEVBUCBoZWFkZXIgLSBDb2RlCi0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotVk9JRCAgICBXcGFTZW5kTWljRmFpbHVyZVRvV3BhU3VwcGxpY2FudCgKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgICBwQWQsCi0gICAgSU4gIEJPT0xFQU4gICAgICAgICAgYlVuaWNhc3QpCi17Ci0JY2hhciBjdXN0b21bSVdfQ1VTVE9NX01BWF0gPSB7MH07Ci0KLQlzcHJpbnRmKGN1c3RvbSwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbiIpOwotCWlmKGJVbmljYXN0KQotCQlzcHJpbnRmKGN1c3RvbSwgIiVzIHVuaWNhc3QiLCBjdXN0b20pOwotCi0JUnRtcE9TV3JpZWxlc3NFdmVudFNlbmQocEFkLCBJV0VWQ1VTVE9NLCAtMSwgTlVMTCwgKFBVQ0hBUiljdXN0b20sIHN0cmxlbihjdXN0b20pKTsKLQotCXJldHVybjsKLX0KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLVZPSUQJV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lKAotCUlOICBQUlRNUF9BREFQVEVSICAgcEFkLAotCUlOIE1MTUVfUVVFVUVfRUxFTSAqRWxlbSkKLXsKLQlQVUNIQVIgICAgICAgICAgICAgIHBPdXRCdWZmZXIgPSBOVUxMOwotCVVDSEFSICAgICAgICAgICAgICAgSGVhZGVyODAyXzNbMTRdOwotCVVMT05HICAgICAgICAgICAgICAgRnJhbWVMZW4gPSAwOwotCUVBUE9MX1BBQ0tFVCAgICAgICAgUGFja2V0OwotCVVDSEFSICAgICAgICAgICAgICAgTWljWzE2XTsKLSAgICBCT09MRUFOICAgICAgICAgICAgIGJVbmljYXN0OwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiV3BhTWljRmFpbHVyZVJlcG9ydEZyYW1lIC0tLS0tPlxuIikpOwotCi0gICAgYlVuaWNhc3QgPSAoRWxlbS0+TXNnWzBdID09IDEgPyBUUlVFOkZBTFNFKTsKLQlwQWQtPlNlcXVlbmNlID0gKChwQWQtPlNlcXVlbmNlKSArIDEpICYgKE1BWF9TRVFfTlVNQkVSKTsKLQotCS8vIGluaXQgODAyLjMgaGVhZGVyIGFuZCBGaWxsIFBhY2tldAotCU1BS0VfODAyXzNfSEVBREVSKEhlYWRlcjgwMl8zLCBwQWQtPkNvbW1vbkNmZy5Cc3NpZCwgcEFkLT5DdXJyZW50QWRkcmVzcywgRUFQT0wpOwotCi0JTmRpc1plcm9NZW1vcnkoJlBhY2tldCwgc2l6ZW9mKFBhY2tldCkpOwotCVBhY2tldC5Qcm9WZXIJPSBFQVBPTF9WRVI7Ci0JUGFja2V0LlByb1R5cGUJPSBFQVBPTEtleTsKLQotCVBhY2tldC5LZXlEZXNjLlR5cGUgPSBXUEExX0tFWV9ERVNDOwotCi0gICAgLy8gUmVxdWVzdCBmaWVsZCBwcmVzZW50ZWQKLSAgICBQYWNrZXQuS2V5RGVzYy5LZXlJbmZvLlJlcXVlc3QgPSAxOwotCi0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsKLQkJUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlEZXNjVmVyID0gMjsKLQl9Ci0JZWxzZQkgIC8vIFRLSVAKLQl7Ci0JCVBhY2tldC5LZXlEZXNjLktleUluZm8uS2V5RGVzY1ZlciA9IDE7Ci0JfQotCi0gICAgUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlUeXBlID0gKGJVbmljYXN0ID8gUEFJUldJU0VLRVkgOiBHUk9VUEtFWSk7Ci0KLQkvLyBLZXlNaWMgZmllbGQgcHJlc2VudGVkCi0JUGFja2V0LktleURlc2MuS2V5SW5mby5LZXlNaWMgID0gMTsKLQotICAgIC8vIEVycm9yIGZpZWxkIHByZXNlbnRlZAotCVBhY2tldC5LZXlEZXNjLktleUluZm8uRXJyb3IgID0gMTsKLQotCS8vIFVwZGF0ZSBwYWNrZXQgbGVuZ3RoIGFmdGVyIGRlY2lkZSBLZXkgZGF0YSBwYXlsb2FkCi0JU0VUX1VJTlQxNl9UT19BUlJBUlkoUGFja2V0LkJvZHlfTGVuLCBMRU5fRUFQT0xfS0VZX01TRykKLQotCS8vIEtleSBSZXBsYXkgQ291bnQKLQlOZGlzTW92ZU1lbW9yeShQYWNrZXQuS2V5RGVzYy5SZXBsYXlDb3VudGVyLCBwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCBMRU5fS0VZX0RFU0NfUkVQTEFZKTsKLSAgICBpbmNfYnl0ZV9hcnJheShwQWQtPlN0YUNmZy5SZXBsYXlDb3VudGVyLCA4KTsKLQotCS8vIENvbnZlcnQgdG8gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCi0JKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pID0gY3B1MmxlMTYoKigoVVNIT1JUICopJlBhY2tldC5LZXlEZXNjLktleUluZm8pKTsKLQotCi0JTWxtZUFsbG9jYXRlTWVtb3J5KHBBZCwgKFBVQ0hBUiAqKSZwT3V0QnVmZmVyKTsgIC8vIGFsbG9jYXRlIG1lbW9yeQotCWlmKHBPdXRCdWZmZXIgPT0gTlVMTCkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBQcmVwYXJlIEVBUE9MIGZyYW1lIGZvciBNSUMgY2FsY3VsYXRpb24KLQkvLyBCZSBjYXJlZnVsLCBvbmx5IEVBUE9MIGZyYW1lIGlzIGNvdW50ZWQgZm9yIE1JQyBjYWxjdWxhdGlvbgotCU1ha2VPdXRnb2luZ0ZyYW1lKHBPdXRCdWZmZXIsICAgICAgICAgICAgICAgJkZyYW1lTGVuLAotCQkgICAgICAgICAgICAgIENPTlZfQVJSQVJZX1RPX1VJTlQxNihQYWNrZXQuQm9keV9MZW4pICsgNCwgICAmUGFja2V0LAotCQkgICAgICAgICAgICAgIEVORF9PRl9BUkdTKTsKLQotCS8vIFByZXBhcmUgYW5kIEZpbGwgTUlDIHZhbHVlCi0JTmRpc1plcm9NZW1vcnkoTWljLCBzaXplb2YoTWljKSk7Ci0JaWYocEFkLT5TdGFDZmcuV2VwU3RhdHVzICA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCXsJLy8gQUVTCi0gICAgICAgIFVDSEFSIGRpZ2VzdFsyMF0gPSB7MH07Ci0JCUhNQUNfU0hBMShwQWQtPlN0YUNmZy5QVEssIExFTl9FQVBfTUlDSywgcE91dEJ1ZmZlciwgRnJhbWVMZW4sIGRpZ2VzdCwgU0hBMV9ESUdFU1RfU0laRSk7Ci0JCU5kaXNNb3ZlTWVtb3J5KE1pYywgZGlnZXN0LCBMRU5fS0VZX0RFU0NfTUlDKTsKLQl9Ci0JZWxzZQotCXsJLy8gVEtJUAotCQlITUFDX01ENShwQWQtPlN0YUNmZy5QVEssICBMRU5fRUFQX01JQ0ssIHBPdXRCdWZmZXIsIEZyYW1lTGVuLCBNaWMsIE1ENV9ESUdFU1RfU0laRSk7Ci0JfQotCU5kaXNNb3ZlTWVtb3J5KFBhY2tldC5LZXlEZXNjLktleU1pYywgTWljLCBMRU5fS0VZX0RFU0NfTUlDKTsKLQotCS8vIGNvcHkgZnJhbWUgdG8gVHggcmluZyBhbmQgc2VuZCBNSUMgZmFpbHVyZSByZXBvcnQgZnJhbWUgdG8gYXV0aGVudGljYXRvcgotCVJUTVBUb1dpcmVsZXNzU3RhKHBBZCwgJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0sCi0JCQkJCSAgSGVhZGVyODAyXzMsIExFTkdUSF84MDJfMywKLQkJCQkJICAoUFVDSEFSKSZQYWNrZXQsCi0JCQkJCSAgQ09OVl9BUlJBUllfVE9fVUlOVDE2KFBhY2tldC5Cb2R5X0xlbikgKyA0LCBGQUxTRSk7Ci0KLQlNbG1lRnJlZU1lbW9yeShwQWQsIChQVUNIQVIpcE91dEJ1ZmZlcik7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJXcGFNaWNGYWlsdXJlUmVwb3J0RnJhbWUgPC0tLS0tXG4iKSk7Ci19Ci0KLS8qKiBmcm9tIHdwYV9zdXBwbGljYW50Ci0gKiBpbmNfYnl0ZV9hcnJheSAtIEluY3JlbWVudCBhcmJpdHJhcnkgbGVuZ3RoIGJ5dGUgYXJyYXkgYnkgb25lCi0gKiBAY291bnRlcjogUG9pbnRlciB0byBieXRlIGFycmF5Ci0gKiBAbGVuOiBMZW5ndGggb2YgdGhlIGNvdW50ZXIgaW4gYnl0ZXMKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY291bnRlciBieSBvbmUgYW5kIGNvbnRpbnVlcwotICogcm9sbGluZyBvdmVyIHRvIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZXMgaWYgdGhlIGJ5dGUgd2FzIGluY3JlbWVudGVkIGZyb20KLSAqIDB4ZmYgdG8gMHgwMC4KLSAqLwotdm9pZCBpbmNfYnl0ZV9hcnJheShVQ0hBUiAqY291bnRlciwgaW50IGxlbikKLXsKLQlpbnQgcG9zID0gbGVuIC0gMTsKLQl3aGlsZSAocG9zID49IDApIHsKLQkJY291bnRlcltwb3NdKys7Ci0JCWlmIChjb3VudGVyW3Bvc10gIT0gMCkKLQkJCWJyZWFrOwotCQlwb3MtLTsKLQl9Ci19Ci0KLVZPSUQgV3BhRGlzYXNzb2NBcEFuZEJsb2NrQXNzb2MoCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMxLAotICAgIElOIFBWT0lEIEZ1bmN0aW9uQ29udGV4dCwKLSAgICBJTiBQVk9JRCBTeXN0ZW1TcGVjaWZpYzIsCi0gICAgSU4gUFZPSUQgU3lzdGVtU3BlY2lmaWMzKQotewotICAgIFJUTVBfQURBUFRFUiAgICAgICAgICAgICAgICAqcEFkID0gKFBSVE1QX0FEQVBURVIpRnVuY3Rpb25Db250ZXh0OwotICAgIE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCAgICBEaXNhc3NvY1JlcTsKLQotCS8vIGRpc2Fzc29jIGZyb20gY3VycmVudCBBUCBmaXJzdAotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUTVBSZXBvcnRNaWNFcnJvciAtIGRpc2Fzc29jaWF0ZSB3aXRoIGN1cnJlbnQgQVAgYWZ0ZXIgc2VuZGluZyBzZWNvbmQgY29udGludW91cyBFQVBPTCBmcmFtZVxuIikpOwotCURpc2Fzc29jUGFybUZpbGwocEFkLCAmRGlzYXNzb2NSZXEsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBSRUFTT05fTUlDX0ZBSUxVUkUpOwotCU1sbWVFbnF1ZXVlKHBBZCwgQVNTT0NfU1RBVEVfTUFDSElORSwgTVQyX01MTUVfRElTQVNTT0NfUkVRLCBzaXplb2YoTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUKSwgJkRpc2Fzc29jUmVxKTsKLQotCXBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgPSBDTlRMX1dBSVRfRElTQVNTT0M7Ci0JcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOwotfQotCi1WT0lEIFdwYVN0YVBhaXJ3aXNlS2V5U2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlQQ0lQSEVSX0tFWSBwU2hhcmVkS2V5OwotCVBNQUNfVEFCTEVfRU5UUlkgcEVudHJ5OwotCi0JcEVudHJ5ID0gJnBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF07Ci0KLQkvLyBQYWlyd2lzZSBrZXkgc2hhbGwgdXNlIGtleSMwCi0JcFNoYXJlZEtleSA9ICZwQWQtPlNoYXJlZEtleVtCU1MwXVswXTsKLQotCU5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLlBUSywgcEVudHJ5LT5QVEssIExFTl9QVEspOwotCi0JLy8gUHJlcGFyZSBwYWlyLXdpc2Uga2V5IGluZm9ybWF0aW9uIGludG8gc2hhcmVkIGtleSB0YWJsZQotCU5kaXNaZXJvTWVtb3J5KHBTaGFyZWRLZXksIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0JcFNoYXJlZEtleS0+S2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+S2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlJ4TWljLCAmcEFkLT5TdGFDZmcuUFRLWzQ4XSwgTEVOX1RLSVBfUlhNSUNLKTsKLQlOZGlzTW92ZU1lbW9yeShwU2hhcmVkS2V5LT5UeE1pYywgJnBBZC0+U3RhQ2ZnLlBUS1s0OCtMRU5fVEtJUF9SWE1JQ0tdLCBMRU5fVEtJUF9UWE1JQ0spOwotCi0JLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQlpZiAocEFkLT5TdGFDZmcuUGFpckNpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9BRVM7Ci0JZWxzZQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotCS8vIFVwZGF0ZSB0aGVzZSByZWxhdGVkIGluZm9ybWF0aW9uIHRvIE1BQ19UQUJMRV9FTlRSWQotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuS2V5LCAmcEFkLT5TdGFDZmcuUFRLWzMyXSwgTEVOX1RLSVBfRUspOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuUnhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDhdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KHBFbnRyeS0+UGFpcndpc2VLZXkuVHhNaWMsICZwQWQtPlN0YUNmZy5QVEtbNDgrTEVOX1RLSVBfUlhNSUNLXSwgTEVOX1RLSVBfVFhNSUNLKTsKLQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IHBTaGFyZWRLZXktPkNpcGhlckFsZzsKLQotCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAgMCwKLQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJICBwU2hhcmVkS2V5LT5LZXksCi0JCQkJCQkgIHBTaGFyZWRLZXktPlR4TWljLAotCQkJCQkJICBwU2hhcmVkS2V5LT5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJCSAgcEVudHJ5KTsKLQlTVEFfUE9SVF9TRUNVUkVEKHBBZCk7Ci0JcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIDogQUlEKCVkKSBwb3J0IHNlY3VyZWRcbiIsIF9fRlVOQ1RJT05fXywgcEVudHJ5LT5BaWQpKTsKLQotfQotCi1WT0lEIFdwYVN0YUdyb3VwS2V5U2V0dGluZygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCkKLXsKLQlQQ0lQSEVSX0tFWQkJcFNoYXJlZEtleTsKLQotCXBTaGFyZWRLZXkgPSAmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXTsKLQotCS8vIFByZXBhcmUgcGFpci13aXNlIGtleSBpbmZvcm1hdGlvbiBpbnRvIHNoYXJlZCBrZXkgdGFibGUKLQlOZGlzWmVyb01lbW9yeShwU2hhcmVkS2V5LCBzaXplb2YoQ0lQSEVSX0tFWSkpOwotCXBTaGFyZWRLZXktPktleUxlbiA9IExFTl9US0lQX0VLOwotCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPktleSwgcEFkLT5TdGFDZmcuR1RLLCBMRU5fVEtJUF9FSyk7Ci0JTmRpc01vdmVNZW1vcnkocFNoYXJlZEtleS0+UnhNaWMsICZwQWQtPlN0YUNmZy5HVEtbMTZdLCBMRU5fVEtJUF9SWE1JQ0spOwotCU5kaXNNb3ZlTWVtb3J5KHBTaGFyZWRLZXktPlR4TWljLCAmcEFkLT5TdGFDZmcuR1RLWzI0XSwgTEVOX1RLSVBfVFhNSUNLKTsKLQotCS8vIFVwZGF0ZSBTaGFyZWQgS2V5IENpcGhlckFsZwotCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9OT05FOwotCWlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfVEtJUDsKLQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQlwU2hhcmVkS2V5LT5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDQwRW5hYmxlZCkKLQkJcFNoYXJlZEtleS0+Q2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCWVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFHcm91cFdFUDEwNEVuYWJsZWQpCi0JCXBTaGFyZWRLZXktPkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0KLQkvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkgIEJTUzAsCi0JCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCSAgcFNoYXJlZEtleS0+Q2lwaGVyQWxnLAotCQkJCQkJICBwU2hhcmVkS2V5LT5LZXksCi0JCQkJCQkgIHBTaGFyZWRLZXktPlR4TWljLAotCQkJCQkJICBwU2hhcmVkS2V5LT5SeE1pYyk7Ci0KLQkvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJICBwU2hhcmVkS2V5LT5DaXBoZXJBbGcsCi0JCQkJCQkJICBOVUxMKTsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGFfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvc3RhX2lvY3RsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWI4NGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0MzA5MC9zdGFfaW9jdGwuYworKysgL2Rldi9udWxsCkBAIC0xLDc1NTcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICBNb2R1bGUgTmFtZToKLSAgICBzdGFfaW9jdGwuYwotCi0gICAgQWJzdHJhY3Q6Ci0gICAgSU9DVEwgcmVsYXRlZCBzdWJyb3V0aW5lcwotCi0gICAgUmV2aXNpb24gSGlzdG9yeToKLSAgICBXaG8gICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBSb3J5IENoZW4gICAwMS0wMy0yMDAzICAgIGNyZWF0ZWQKLQlSb3J5IENoZW4gICAwMi0xNC0yMDA1ICAgIG1vZGlmeSB0byBzdXBwb3J0IFJUNjEKLSovCi0KLSNpbmNsdWRlCSJydF9jb25maWcuaCIKLQotI2lmZGVmIERCRwotZXh0ZXJuIFVMT05HICAgIFJURGVidWdMZXZlbDsKLSNlbmRpZgotCi0jZGVmaW5lIE5SX1dFUF9LRVlTCQkJCTQKLSNkZWZpbmUgV0VQX1NNQUxMX0tFWV9MRU4JCQkoNDAvOCkKLSNkZWZpbmUgV0VQX0xBUkdFX0tFWV9MRU4JCQkoMTA0LzgpCi0KLSNkZWZpbmUgR1JPVVBfS0VZX05PICAgICAgICAgICAgICAgIDQKLQotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCi0jZGVmaW5lIElXRV9TVFJFQU1fQUREX0VWRU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KF9BLCBfQiwgX0MsIF9ELCBfRSkKLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfUE9JTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfcG9pbnQoX0EsIF9CLCBfQywgX0QsIF9FKQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQotI2Vsc2UKLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoX0EsIF9CLCBfQywgX0QsIF9FKQkJaXdlX3N0cmVhbV9hZGRfZXZlbnQoX0IsIF9DLCBfRCwgX0UpCi0jZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKF9BLCBfQiwgX0MsIF9ELCBfRSkJCWl3ZV9zdHJlYW1fYWRkX3BvaW50KF9CLCBfQywgX0QsIF9FKQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9WQUxVRShfQSwgX0IsIF9DLCBfRCwgX0UsIF9GKQlpd2Vfc3RyZWFtX2FkZF92YWx1ZShfQiwgX0MsIF9ELCBfRSwgX0YpCi0jZW5kaWYKLQotZXh0ZXJuIFVDSEFSICAgIENpcGhlcldwYTJUZW1wbGF0ZVtdOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JUX1ZFUlNJT05fSU5GT3sKLSAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uVzsKLSAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWDsKLSAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWTsKLSAgICBVQ0hBUiAgICAgICBEcml2ZXJWZXJzaW9uWjsKLSAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZFllYXI7Ci0gICAgVUlOVCAgICAgICAgRHJpdmVyQnVpbGRNb250aDsKLSAgICBVSU5UICAgICAgICBEcml2ZXJCdWlsZERheTsKLX0gUlRfVkVSU0lPTl9JTkZPLCAqUFJUX1ZFUlNJT05fSU5GTzsKLQotc3RydWN0IGl3X3ByaXZfYXJncyBwcml2dGFiW10gPSB7Ci17IFJUUFJJVl9JT0NUTF9TRVQsCi0gIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgMCwKLSAgInNldCJ9LAotCi17IFJUUFJJVl9JT0NUTF9TSE9XLCBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssCi0gICIifSwKLS8qIC0tLSBzdWItaW9jdGxzIGRlZmluaXRpb25zIC0tLSAqLwotICAgIHsgU0hPV19DT05OX1NUQVRVUywKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImNvbm5TdGF0dXMiIH0sCi0JeyBTSE9XX0RSVklFUl9WRVJJT04sCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJkcml2ZXJWZXIiIH0sCi0gICAgeyBTSE9XX0JBX0lORk8sCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJiYWluZm8iIH0sCi0JeyBTSE9XX0RFU0NfSU5GTywKLQkgIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgImRlc2NpbmZvIiB9LAotICAgIHsgUkFJT19PRkYsCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJyYWRpb19vZmYiIH0sCi0JeyBSQUlPX09OLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAicmFkaW9fb24iIH0sCi0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JeyBTSE9XX0RMU19FTlRSWV9JTkZPLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiZGxzZW50cnlpbmZvIiB9LAotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCXsgU0hPV19DRkdfVkFMVUUsCi0JICBJV19QUklWX1RZUEVfQ0hBUiB8IDEwMjQsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX01BU0ssICJzaG93IiB9LAotCXsgU0hPV19BREhPQ19FTlRSWV9JTkZPLAotCSAgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCAiYWRob2NFbnRyeSIgfSwKLS8qIC0tLSBzdWItaW9jdGxzIHJlbGF0aW9ucyAtLS0gKi8KLQotI2lmZGVmIERCRwoteyBSVFBSSVZfSU9DVExfQkJQLAotICBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAotICAiYmJwIn0sCi17IFJUUFJJVl9JT0NUTF9NQUMsCi0gIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAotICAibWFjIn0sCi0jaWZkZWYgUlRNUF9SRl9SV19TVVBQT1JUCi17IFJUUFJJVl9JT0NUTF9SRiwKLSAgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfTUFTSywKLSAgInJmIn0sCi0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi17IFJUUFJJVl9JT0NUTF9FMlAsCi0gIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMDI0LAotICAiZTJwIn0sCi0jZW5kaWYgIC8qIERCRyAqLwotCi17IFJUUFJJVl9JT0NUTF9TVEFUSVNUSUNTLAotICAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9NQVNLLAotICAic3RhdCJ9LAoteyBSVFBSSVZfSU9DVExfR1NJVEVTVVJWRVksCi0gIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgMTAyNCwKLSAgImdldF9zaXRlX3N1cnZleSJ9LAotCi0KLX07Ci0KLXN0YXRpYyBfX3MzMiByYWxpbmtyYXRlW10gPQotCXsyLCAgNCwgICAxMSwgIDIyLCAvLyBDQ0sKLQkxMiwgMTgsICAgMjQsICAzNiwgNDgsIDcyLCA5NiwgMTA4LCAvLyBPRkRNCi0JMTMsIDI2LCAgIDM5LCAgNTIsICA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsICA1MiwgIDc4LCAxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTM5LCA3OCwgIDExNywgMTU2LCAyMzQsIDMxMiwgMzUxLCAzOTAsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDgwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLQkyNywgNTQsICAgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLCAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwJCQkJCQkJCQkJICAvLyA0ME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMwotCTE0LCAyOSwgICA0MywgIDU3LCAgODcsIDExNSwgMTMwLCAxNDQsIDI5LCA1OSwgICA4NywgMTE1LCAxNzMsIDIzMCwgMjYwLCAyODgsIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAwIH4gMTUKLQk0MywgODcsICAxMzAsIDE3MywgMjYwLCAzMTcsIDM5MCwgNDMzLAkJCQkJCQkJCQkgIC8vIDIwTUh6LCA0MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0JMzAsIDYwLCAgIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDB9OwotCi0KLQotSU5UIFNldF9TU0lEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi0jaWZkZWYgV01NX1NVUFBPUlQKLUlOVAlTZXRfV21tQ2FwYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotI2VuZGlmCi0KLUlOVCBTZXRfTmV0d29ya1R5cGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfQXV0aE1vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfRW5jcnlwVHlwZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9EZWZhdWx0S2V5SURfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5MV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9LZXkyX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotCi1JTlQgU2V0X0tleTNfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLUlOVCBTZXRfS2V5NF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9XUEFQU0tfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLQotSU5UIFNldF9QU01vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0KLSNpZmRlZiBSVDMwOTAKLUlOVCBTZXRfUENJZVBTTGV2ZWxfUHJvYygKLUlOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi1JTiAgUFVDSEFSICAgICAgICAgIGFyZyk7Ci0jZW5kaWYgLy8gUlQzMDkwIC8vCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotSU5UIFNldF9XcGFfU3VwcG9ydCgKLSAgICBJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKTsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSNpZmRlZiBEQkcKLQotVk9JRCBSVE1QSW9jdGxNQUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0KLVZPSUQgUlRNUElvY3RsRTJQUk9NKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIHN0cnVjdCBpd3JlcSAgICAqd3JxKTsKLSNlbmRpZiAvLyBEQkcgLy8KLQotCi1ORElTX1NUQVRVUyBSVE1QV1BBTm9uZUFkZEtleVByb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4JUFZPSUQJCQlwQnVmKTsKLQotSU5UIFNldF9GcmFnVGVzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLUlOVCBTZXRfTG9uZ1JldHJ5TGltaXRfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCVBTVFJJTkcJCQlhcmcpOwotCi1JTlQgU2V0X1Nob3J0UmV0cnlMaW1pdF9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLSNpZmRlZiBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUCi1JTlQgU2V0X0llZWU4MDIxMWRDbGllbnRNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpOwotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLUlOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZyk7Ci0jZW5kaWYgLy8gQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVCAvLwotCi1JTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlleHRyYSk7Ci0KLSNpZmRlZiBSVE1QX1JGX1JXX1NVUFBPUlQKLVZPSUQgUlRNUElvY3RsUkYoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSk7Ci0jZW5kaWYgLy8gUlRNUF9SRl9SV19TVVBQT1JUIC8vCi0KLQotSU5UIFNldF9CZWFjb25Mb3N0VGltZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9BdXRvUm9hbWluZ19Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgYXJnKTsKLQotSU5UIFNldF9TaXRlU3VydmV5X1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZyk7Ci0KLUlOVCBTZXRfRm9yY2VUeEJ1cnN0X1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWQsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICBhcmcpOwotCi0jaWZkZWYgQU5UX0RJVkVSU0lUWV9TVVBQT1JUCi1JTlQJU2V0X0FudGVubmFfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQVUNIQVIJCQlhcmcpOwotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwotCi1zdGF0aWMgc3RydWN0IHsKLQlQU1RSSU5HIG5hbWU7Ci0JSU5UICgqc2V0X3Byb2MpKFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsIFBTVFJJTkcgYXJnKTsKLX0gKlBSVE1QX1BSSVZBVEVfU0VUX1BST0MsIFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0NbXSA9IHsKLQl7IkRyaXZlclZlcnNpb24iLAkJCQlTZXRfRHJpdmVyVmVyc2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb24iLAkJCQlTZXRfQ291bnRyeVJlZ2lvbl9Qcm9jfSwKLQl7IkNvdW50cnlSZWdpb25BQmFuZCIsCQkJU2V0X0NvdW50cnlSZWdpb25BQmFuZF9Qcm9jfSwKLQl7IlNTSUQiLAkJCQkJCVNldF9TU0lEX1Byb2N9LAotCXsiV2lyZWxlc3NNb2RlIiwJCQkJU2V0X1dpcmVsZXNzTW9kZV9Qcm9jfSwKLQl7IlR4QnVyc3QiLAkJCQkJU2V0X1R4QnVyc3RfUHJvY30sCi0JeyJUeFByZWFtYmxlIiwJCQkJU2V0X1R4UHJlYW1ibGVfUHJvY30sCi0JeyJUeFBvd2VyIiwJCQkJCVNldF9UeFBvd2VyX1Byb2N9LAotCXsiQ2hhbm5lbCIsCQkJCQlTZXRfQ2hhbm5lbF9Qcm9jfSwKLQl7IkJHUHJvdGVjdGlvbiIsCQkJCVNldF9CR1Byb3RlY3Rpb25fUHJvY30sCi0JeyJSVFNUaHJlc2hvbGQiLAkJCQlTZXRfUlRTVGhyZXNob2xkX1Byb2N9LAotCXsiRnJhZ1RocmVzaG9sZCIsCQkJCVNldF9GcmFnVGhyZXNob2xkX1Byb2N9LAotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCXsiSHRCdyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0QndfUHJvY30sCi0JeyJIdE1jcyIsCQkgICAgICAgICAgICAgICAgU2V0X0h0TWNzX1Byb2N9LAotCXsiSHRHaSIsCQkgICAgICAgICAgICAgICAgU2V0X0h0R2lfUHJvY30sCi0JeyJIdE9wTW9kZSIsCQkgICAgICAgICAgICBTZXRfSHRPcE1vZGVfUHJvY30sCi0JeyJIdEV4dGNoYSIsCQkgICAgICAgICAgICBTZXRfSHRFeHRjaGFfUHJvY30sCi0JeyJIdE1wZHVEZW5zaXR5IiwJCSAgICAgICAgU2V0X0h0TXBkdURlbnNpdHlfUHJvY30sCi0JeyJIdEJhV2luU2l6ZSIsCQkJCVNldF9IdEJhV2luU2l6ZV9Qcm9jfSwKLQl7Ikh0UmRnIiwJCQkJCVNldF9IdFJkZ19Qcm9jfSwKLQl7Ikh0QW1zZHUiLAkJCQkJU2V0X0h0QW1zZHVfUHJvY30sCi0JeyJIdEF1dG9CYSIsCQkJCVNldF9IdEF1dG9CYV9Qcm9jfSwKLQl7Ikh0QmFEZWNsaW5lIiwJCQkJCVNldF9CQURlY2xpbmVfUHJvY30sCi0JeyJIdFByb3RlY3QiLAkJCQlTZXRfSHRQcm90ZWN0X1Byb2N9LAotCXsiSHRNaW1vUHMiLAkJCQlTZXRfSHRNaW1vUHNfUHJvY30sCi0JeyJIdERpc2FsbG93VEtJUCIsCQkJCVNldF9IdERpc2FsbG93VEtJUF9Qcm9jfSwKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotI2lmZGVmIEFHR1JFR0FUSU9OX1NVUFBPUlQKLQl7IlBrdEFnZ3JlZ2F0ZSIsCQkJCVNldF9Qa3RBZ2dyZWdhdGVfUHJvY30sCi0jZW5kaWYgLy8gQUdHUkVHQVRJT05fU1VQUE9SVCAvLwotCi0jaWZkZWYgV01NX1NVUFBPUlQKLQl7IldtbUNhcGFibGUiLAkJCQkJU2V0X1dtbUNhcGFibGVfUHJvY30sCi0jZW5kaWYKLQl7IklFRUU4MDIxMUgiLAkJCQkJU2V0X0lFRUU4MDIxMUhfUHJvY30sCi0gICAgeyJOZXR3b3JrVHlwZSIsICAgICAgICAgICAgICAgICBTZXRfTmV0d29ya1R5cGVfUHJvY30sCi0JeyJBdXRoTW9kZSIsCQkJCQlTZXRfQXV0aE1vZGVfUHJvY30sCi0JeyJFbmNyeXBUeXBlIiwJCQkJCVNldF9FbmNyeXBUeXBlX1Byb2N9LAotCXsiRGVmYXVsdEtleUlEIiwJCQkJU2V0X0RlZmF1bHRLZXlJRF9Qcm9jfSwKLQl7IktleTEiLAkJCQkJCVNldF9LZXkxX1Byb2N9LAotCXsiS2V5MiIsCQkJCQkJU2V0X0tleTJfUHJvY30sCi0JeyJLZXkzIiwJCQkJCQlTZXRfS2V5M19Qcm9jfSwKLQl7IktleTQiLAkJCQkJCVNldF9LZXk0X1Byb2N9LAotCXsiV1BBUFNLIiwJCQkJCQlTZXRfV1BBUFNLX1Byb2N9LAotCXsiUmVzZXRDb3VudGVyIiwJCQkJU2V0X1Jlc2V0U3RhdENvdW50ZXJfUHJvY30sCi0JeyJQU01vZGUiLCAgICAgICAgICAgICAgICAgICAgICBTZXRfUFNNb2RlX1Byb2N9LAotI2lmZGVmIERCRwotCXsiRGVidWciLAkJCQkJCVNldF9EZWJ1Z19Qcm9jfSwKLSNlbmRpZiAvLyBEQkcgLy8KLQotI2lmZGVmIFJBTElOS19BVEUKLQl7IkFURSIsCQkJCQkJCVNldF9BVEVfUHJvY30sCi0JeyJBVEVEQSIsCQkJCQkJU2V0X0FURV9EQV9Qcm9jfSwKLQl7IkFURVNBIiwJCQkJCQlTZXRfQVRFX1NBX1Byb2N9LAotCXsiQVRFQlNTSUQiLAkJCQkJU2V0X0FURV9CU1NJRF9Qcm9jfSwKLQl7IkFURUNIQU5ORUwiLAkJCQkJU2V0X0FURV9DSEFOTkVMX1Byb2N9LAotCXsiQVRFVFhQT1cwIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIwX1Byb2N9LAotCXsiQVRFVFhQT1cxIiwJCQkJCVNldF9BVEVfVFhfUE9XRVIxX1Byb2N9LAotCXsiQVRFVFhBTlQiLAkJCQkJU2V0X0FURV9UWF9BbnRlbm5hX1Byb2N9LAotCXsiQVRFUlhBTlQiLAkJCQkJU2V0X0FURV9SWF9BbnRlbm5hX1Byb2N9LAotCXsiQVRFVFhGUkVRT0ZGU0VUIiwJCQkJU2V0X0FURV9UWF9GUkVRT0ZGU0VUX1Byb2N9LAotCXsiQVRFVFhCVyIsCQkJCQkJU2V0X0FURV9UWF9CV19Qcm9jfSwKLQl7IkFURVRYTEVOIiwJCQkJCVNldF9BVEVfVFhfTEVOR1RIX1Byb2N9LAotCXsiQVRFVFhDTlQiLAkJCQkJU2V0X0FURV9UWF9DT1VOVF9Qcm9jfSwKLQl7IkFURVRYTUNTIiwJCQkJCVNldF9BVEVfVFhfTUNTX1Byb2N9LAotCXsiQVRFVFhNT0RFIiwJCQkJCVNldF9BVEVfVFhfTU9ERV9Qcm9jfSwKLQl7IkFURVRYR0kiLAkJCQkJCVNldF9BVEVfVFhfR0lfUHJvY30sCi0JeyJBVEVSWEZFUiIsCQkJCQlTZXRfQVRFX1JYX0ZFUl9Qcm9jfSwKLQl7IkFURVJSRiIsCQkJCQkJU2V0X0FURV9SZWFkX1JGX1Byb2N9LAotCXsiQVRFV1JGMSIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjFfUHJvY30sCi0JeyJBVEVXUkYyIiwJCQkJCQlTZXRfQVRFX1dyaXRlX1JGMl9Qcm9jfSwKLQl7IkFURVdSRjMiLAkJCQkJCVNldF9BVEVfV3JpdGVfUkYzX1Byb2N9LAotCXsiQVRFV1JGNCIsCQkJCQkJU2V0X0FURV9Xcml0ZV9SRjRfUHJvY30sCi0JeyJBVEVMREUyUCIsCQkJCSAgICBTZXRfQVRFX0xvYWRfRTJQX1Byb2N9LAotCXsiQVRFUkUyUCIsCQkJCQkJU2V0X0FURV9SZWFkX0UyUF9Qcm9jfSwKLQl7IkFURVNIT1ciLAkJCQkJCVNldF9BVEVfU2hvd19Qcm9jfSwKLQl7IkFURUhFTFAiLAkJCQkJCVNldF9BVEVfSGVscF9Qcm9jfSwKLQotI2lmZGVmIFJBTElOS18yOHh4X1FBCi0JeyJUeFN0b3AiLAkJCQkJCVNldF9UeFN0b3BfUHJvY30sCi0JeyJSeFN0b3AiLAkJCQkJCVNldF9SeFN0b3BfUHJvY30sCi0jZW5kaWYgLy8gUkFMSU5LXzI4eHhfUUEgLy8KLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgeyJXcGFTdXBwb3J0IiwgICAgICAgICAgICAgICAgICBTZXRfV3BhX1N1cHBvcnR9LAotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotCi0KLQotCi0JeyJGaXhlZFR4TW9kZSIsICAgICAgICAgICAgICAgICBTZXRfRml4ZWRUeE1vZGVfUHJvY30sCi0jaWZkZWYgQ09ORklHX0FQU1RBX01JWEVEX1NVUFBPUlQKLQl7Ik9wTW9kZSIsCQkJCQkJU2V0X09wTW9kZV9Qcm9jfSwKLSNlbmRpZiAvLyBDT05GSUdfQVBTVEFfTUlYRURfU1VQUE9SVCAvLwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgIHsiVEduV2lmaVRlc3QiLCAgICAgICAgICAgICAgICAgU2V0X1RHbldpZmlUZXN0X1Byb2N9LAotICAgIHsiRm9yY2VHRiIsCQkJCQlTZXRfRm9yY2VHRl9Qcm9jfSwKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQl7IkRsc0FkZEVudHJ5IiwJCQkJCVNldF9EbHNBZGRFbnRyeV9Qcm9jfSwKLQl7IkRsc1RlYXJEb3duRW50cnkiLAkJCVNldF9EbHNUZWFyRG93bkVudHJ5X1Byb2N9LAotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCXsiTG9uZ1JldHJ5IiwJCQkJU2V0X0xvbmdSZXRyeUxpbWl0X1Byb2N9LAotCXsiU2hvcnRSZXRyeSIsCQkJCVNldF9TaG9ydFJldHJ5TGltaXRfUHJvY30sCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotCXsiMTFkQ2xpZW50TW9kZSIsCQkJCVNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jfSwKLSNlbmRpZiAvLyBFWFRfQlVJTERfQ0hBTk5FTF9MSVNUIC8vCi0jaWZkZWYgQ0FSUklFUl9ERVRFQ1RJT05fU1VQUE9SVAotCXsiQ2FycmllckRldGVjdCIsCQkJCVNldF9DYXJyaWVyRGV0ZWN0X1Byb2N9LAotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotCi0vLzIwMDgvMDkvMTE6S0ggYWRkIHRvIHN1cHBvcnQgZWZ1c2U8LS0KLSNpZmRlZiBSVDMweHgKLSNpZmRlZiBSVE1QX0VGVVNFX1NVUFBPUlQKLQl7ImVmdXNlRnJlZU51bWJlciIsCQkJCXNldF9lRnVzZUdldEZyZWVCbG9ja0NvdW50X1Byb2N9LAotCXsiZWZ1c2VEdW1wIiwJCQkJCXNldF9lRnVzZWR1bXBfUHJvY30sCi0JeyJlZnVzZUxvYWRGcm9tQmluIiwJCQkJc2V0X2VGdXNlTG9hZEZyb21CaW5fUHJvY30sCi0JeyJlZnVzZUJ1ZmZlck1vZGVXcml0ZUJhY2siLAkJc2V0X2VGdXNlQnVmZmVyTW9kZVdyaXRlQmFja19Qcm9jfSwKLSNlbmRpZiAvLyBSVE1QX0VGVVNFX1NVUFBPUlQgLy8KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLQl7ImFudCIsCQkJCQlTZXRfQW50ZW5uYV9Qcm9jfSwKLSNlbmRpZiAvLyBBTlRfRElWRVJTSVRZX1NVUFBPUlQgLy8KLSNlbmRpZiAvLyBSVDMweHggLy8KLS8vMjAwOC8wOS8xMTpLSCBhZGQgdG8gc3VwcG9ydCBlZnVzZS0tPgotCi0JeyJCZWFjb25Mb3N0VGltZSIsCQkJCVNldF9CZWFjb25Mb3N0VGltZV9Qcm9jfSwKLQl7IkF1dG9Sb2FtaW5nIiwJCQkJCVNldF9BdXRvUm9hbWluZ19Qcm9jfSwKLQl7IlNpdGVTdXJ2ZXkiLAkJCQkJU2V0X1NpdGVTdXJ2ZXlfUHJvY30sCi0JeyJGb3JjZVR4QnVyc3QiLAkJCQlTZXRfRm9yY2VUeEJ1cnN0X1Byb2N9LAotCi0Je05VTEwsfQotfTsKLQotCi1WT0lEIFJUTVBBZGRLZXkoCi0JSU4JUFJUTVBfQURBUFRFUgkgICAgcEFkLAotCUlOCVBORElTXzgwMl8xMV9LRVkgICAgcEtleSkKLXsKLQlVTE9ORwkJCQlLZXlJZHg7Ci0JTUFDX1RBQkxFX0VOVFJZCQkqcEVudHJ5OwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUlRNUEFkZEtleSAtLS0tLS0+XG4iKSk7Ci0KLQlpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCXsKLQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJewotCQkgICAgaWYgKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuUE1LLCAzMik7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuUE1LLCBwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLQkJICAgIC8vIFVwZGF0ZSBQVEsKLQkJICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlNoYXJlZEtleVtCU1MwXVswXSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBwS2V5LT5LZXlNYXRlcmlhbCwgTEVOX1RLSVBfRUspOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIHBLZXktPktleU1hdGVyaWFsICsgTEVOX1RLSVBfRUsgKyBMRU5fVEtJUF9UWE1JQ0ssIExFTl9US0lQX1JYTUlDSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgICAgICAgICAgewotCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSyArIExFTl9US0lQX1RYTUlDSywgTEVOX1RLSVBfUlhNSUNLKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRGVjaWRlIGl0cyBDaGlwZXJBbGcKLQkJaWYgKHBBZC0+U3RhQ2ZnLlBhaXJDaXBoZXIgPT0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkKLQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5QYWlyQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCQllbHNlCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZXNlIHJlbGF0ZWQgaW5mb3JtYXRpb24gdG8gTUFDX1RBQkxFX0VOVFJZCi0JCXBFbnRyeSA9ICZwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5LZXksIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgTEVOX1RLSVBfRUspOwotCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LlJ4TWljLCBwQWQtPlNoYXJlZEtleVtCU1MwXVswXS5SeE1pYywgTEVOX1RLSVBfUlhNSUNLKTsKLQkJTmRpc01vdmVNZW1vcnkocEVudHJ5LT5QYWlyd2lzZUtleS5UeE1pYywgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uVHhNaWMsIExFTl9US0lQX1RYTUlDSyk7Ci0JCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnID0gcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnOwotCi0JCS8vIFVwZGF0ZSBwYWlyd2lzZSBrZXkgaW5mb3JtYXRpb24gdG8gQVNJQyBTaGFyZWQgS2V5IFRhYmxlCi0JCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsCi0JCQkJCQkJICBCU1MwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLlR4TWljLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uUnhNaWMpOwotCi0JCS8vIFVwZGF0ZSBBU0lDIFdDSUQgYXR0cmlidXRlIHRhYmxlIGFuZCBJVkVJViB0YWJsZQotCQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZCwKLQkJCQkJCQkJICBCU1MwLAotCQkJCQkJCQkgIDAsCi0JCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkgIHBFbnRyeSk7Ci0KLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCi0JICAgICAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkKTsKLQotICAgICAgICAgICAgICAgIC8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0gICAgICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgIH0KLQkJfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBHVEsKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChwS2V5LT5LZXlJbmRleCAmIDB4RkYpOwotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0sIHNpemVvZihDSVBIRVJfS0VZKSk7Ci0gICAgICAgICAgICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiA9IExFTl9US0lQX0VLOwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksIHBLZXktPktleU1hdGVyaWFsLCBMRU5fVEtJUF9FSyk7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIHsKLQkJTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5UeE1pYywgcEtleS0+S2V5TWF0ZXJpYWwgKyBMRU5fVEtJUF9FSywgTEVOX1RLSVBfVFhNSUNLKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlJ4TWljLCBwS2V5LT5LZXlNYXRlcmlhbCArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgU2hhcmVkIEtleSBDaXBoZXJBbGcKLQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJaWYgKHBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpCi0JCQlwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLkNpcGhlckFsZyA9IENJUEhFUl9US0lQOwotCQllbHNlIGlmIChwQWQtPlN0YUNmZy5Hcm91cENpcGhlciA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKQotCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5DaXBoZXJBbGcgPSBDSVBIRVJfQUVTOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwKLQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksCi0JCQkJCQkJICBwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLlR4TWljLAotCQkJCQkJCSAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5SeE1pYyk7Ci0KLQkJLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLAotCQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJCSAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkLAotCQkJCQkJCQkgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uQ2lwaGVyQWxnLAotCQkJCQkJCQkgIE5VTEwpOwotCi0gICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCSAgICAgICAgLy9wQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotICAgICAgICAgICAgcEFkLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgfQotCX0KLQllbHNlCS8vIGR5bmFtaWMgV0VQIGZyb20gd3BhX3N1cHBsaWNhbnQKLQl7Ci0JCVVDSEFSCUNpcGhlckFsZzsKLQlQVUNIQVIJS2V5OwotCi0JCWlmKHBLZXktPktleUxlbmd0aCA9PSAzMikKLQkJCWdvdG8gZW5kOwotCi0JCUtleUlkeCA9IHBLZXktPktleUluZGV4ICYgMHgwZmZmZmZmZjsKLQotCQlpZiAoS2V5SWR4IDwgNCkKLQkJewotCQkJLy8gaXQgaXMgYSBkZWZhdWx0IHNoYXJlZCBrZXksIGZvciBQYWlyd2lzZSBrZXkgc2V0dGluZwotCQkJaWYgKHBLZXktPktleUluZGV4ICYgMHg4MDAwMDAwMCkKLQkJCXsKLQkJCQlwRW50cnkgPSBNYWNUYWJsZUxvb2t1cChwQWQsIHBLZXktPkJTU0lEKTsKLQotCQkJCWlmIChwRW50cnkpCi0JCQkJewotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJSVE1QQWRkS2V5OiBTZXQgUGFpci13aXNlIEtleVxuIikpOwotCi0JCQkJCS8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5LZXlMZW4gPSAoVUNIQVIpcEtleS0+S2V5TGVuZ3RoOwotCQkJCQlOZGlzTW92ZU1lbW9yeShwRW50cnktPlBhaXJ3aXNlS2V5LktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOwotCi0JCQkJCS8vIHNldCBDaXBoZXIgdHlwZQotCQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCi0JCQkJCQlwRW50cnktPlBhaXJ3aXNlS2V5LkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCQkJZWxzZQotCQkJCQkJcEVudHJ5LT5QYWlyd2lzZUtleS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JCQkJCS8vIEFkZCBQYWlyLXdpc2Uga2V5IHRvIEFzaWMKLQkJCQkJQXNpY0FkZFBhaXJ3aXNlS2V5RW50cnkoCi0JCQkJCQlwQWQsCi0JCQkJCQlwRW50cnktPkFkZHIsCi0JCQkJCQkoVUNIQVIpcEVudHJ5LT5BaWQsCi0JCQkJJnBFbnRyeS0+UGFpcndpc2VLZXkpOwotCi0JCQkJCS8vIHVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZW50cnkKLQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeSgKLQkJCQkJCXBBZCwKLQkJCQkJCUJTUzAsCi0JCQkJCQlLZXlJZHgsIC8vIFRoZSB2YWx1ZSBtYXkgYmUgbm90IHplcm8KLQkJCQkJCXBFbnRyeS0+UGFpcndpc2VLZXkuQ2lwaGVyQWxnLAotCQkJCQkJcEVudHJ5KTsKLQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLSAgICAgICAgICAgIHsKLQkJCQkvLyBEZWZhdWx0IGtleSBmb3IgdHggKHNoYXJlZCBrZXkpCi0JCQkJcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7Ci0KLQkJCQkvLyBzZXQga2V5IG1hdGVyaWFsIGFuZCBrZXkgbGVuZ3RoCi0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKLQkJCQlOZGlzTW92ZU1lbW9yeShwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleSwgJnBLZXktPktleU1hdGVyaWFsLCBwS2V5LT5LZXlMZW5ndGgpOwotCi0JCQkJLy8gU2V0IENpcGVyIHR5cGUKLQkJCQlpZiAocEtleS0+S2V5TGVuZ3RoID09IDUpCi0JCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQkJCWVsc2UKLQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotCi0JCQlDaXBoZXJBbGcgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLkNpcGhlckFsZzsKLQkJCUtleSA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uS2V5OwotCi0JCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCi0JCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgS2V5LCBOVUxMLCBOVUxMKTsKLQotCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCi0JCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKLQotCQkJfQotCQl9Ci0JfQotZW5kOgotCXJldHVybjsKLX0KLQotY2hhciAqIHJ0c3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYykKLXsKLSAgICBmb3IoOyAqcyAhPSAoY2hhcikgYzsgKytzKQotICAgICAgICBpZiAoKnMgPT0gJ1wwJykKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiAoY2hhciAqKSBzOwotfQotCi0vKgotVGhpcyBpcyByZXF1aXJlZCBmb3IgTGluRVgyMDA0L2tlcm5lbDIuNi43IHRvIHByb3ZpZGUgaXdsaXN0IHNjYW5uaW5nIGZ1bmN0aW9uCi0qLwotCi1pbnQKLXJ0X2lvY3RsX2dpd25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgY2hhciAqbmFtZSwgY2hhciAqZXh0cmEpCi17Ci0KLSNpZmRlZiBSVE1QX01BQ19QQ0kKLSAgICBzdHJuY3B5KG5hbWUsICJSVDI4NjAgV2lyZWxlc3MiLCBJRk5BTVNJWik7Ci0jZW5kaWYgLy8gUlRNUF9NQUNfUENJIC8vCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X2ZyZXEgKmZyZXEsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCWludAljaGFuID0gLTE7Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQotCWlmIChmcmVxLT5lID4gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZigoZnJlcS0+ZSA9PSAwKSAmJiAoZnJlcS0+bSA8PSAxMDAwKSkKLQkJY2hhbiA9IGZyZXEtPm07CS8vIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIKLQllbHNlCi0JCU1BUF9LSFpfVE9fQ0hBTk5FTF9JRCggKGZyZXEtPm0gLzEwMCkgLCBjaGFuKTsgLy8gU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICwgbGlrZSAyLjQxMkcsIDIuNDIyRywKLQotICAgIGlmIChDaGFubmVsU2FuaXR5KHBBZGFwdGVyLCBjaGFuKSA9PSBUUlVFKQotICAgIHsKLQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgPSBjaGFuOwotCURCR1BSSU5UKFJUX0RFQlVHX0VSUk9SLCAoIj09PnJ0X2lvY3RsX3Npd2ZyZXE6OlNJT0NTSVdGUkVRW2NtZD0weCV4XSAoQ2hhbm5lbD0lZClcbiIsIFNJT0NTSVdGUkVRLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBydF9pb2N0bF9naXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gTlVMTDsKLQlVQ0hBUiBjaDsKLQlVTE9ORwltID0gMjQxMjAwMDsKLQotCXBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCQljaCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbDsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiPT0+cnRfaW9jdGxfZ2l3ZnJlcSAgJWRcbiIsIGNoKSk7Ci0KLQlNQVBfQ0hBTk5FTF9JRF9UT19LSFooY2gsIG0pOwotCWZyZXEtPm0gPSBtICogMTAwOwotCWZyZXEtPmUgPSAxOwotCXJldHVybiAwOwotfQotCi0KLWludCBydF9pb2N0bF9zaXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLSAgICB9Ci0KLQlzd2l0Y2ggKCptb2RlKQotCXsKLQkJY2FzZSBJV19NT0RFX0FESE9DOgotCQkJU2V0X05ldHdvcmtUeXBlX1Byb2MocEFkYXB0ZXIsICJBZGhvYyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiSW5mcmEiKTsKLQkJCWJyZWFrOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQotICAgICAgICBjYXNlIElXX01PREVfTU9OSVRPUjoKLQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZGFwdGVyLCAiTW9uaXRvciIpOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zaXdtb2RlOjpTSU9DU0lXTU9ERSAodW5rbm93biAlZClcbiIsICptb2RlKSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvLyBSZXNldCBSYWxpbmsgc3VwcGxpY2FudCB0byBub3QgdXNlLCBpdCB3aWxsIGJlIHNldCB0byBzdGFydCB3aGVuIFVJIHNldCBQTUsga2V5Ci0JcEFkYXB0ZXItPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBydF9pb2N0bF9naXdtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIF9fdTMyICptb2RlLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKEFESE9DX09OKHBBZGFwdGVyKSkKLQkJKm1vZGUgPSBJV19NT0RFX0FESE9DOwotICAgIGVsc2UgaWYgKElORlJBX09OKHBBZGFwdGVyKSkKLQkJKm1vZGUgPSBJV19NT0RFX0lORlJBOwotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDQsMjApKQotICAgIGVsc2UgaWYgKE1PTklUT1JfT04ocEFkYXB0ZXIpKQotICAgIHsKLSAgICAgICAgKm1vZGUgPSBJV19NT0RFX01PTklUT1I7Ci0gICAgfQotI2VuZGlmCi0gICAgZWxzZQotICAgICAgICAqbW9kZSA9IElXX01PREVfQVVUTzsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PnJ0X2lvY3RsX2dpd21vZGUobW9kZT0lZClcbiIsICptb2RlKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXdzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCSAgIGNoYXIgKm5hbWUsIGNoYXIgKmV4dHJhKQotewotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKLQl1MTYgdmFsOwotCWludCBpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+cnRfaW9jdGxfZ2l3cmFuZ2VcbiIpKTsKLQlkYXRhLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKLQltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKLQotCXJhbmdlLT50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07Ci0KLQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpfHxBREhPQ19PTihwQWRhcHRlcikpCi0JewotCQlyYW5nZS0+bWluX3BtcCA9IDEgKiAxMDI0OwotCQlyYW5nZS0+bWF4X3BtcCA9IDY1NTM1ICogMTAyNDsKLQkJcmFuZ2UtPm1pbl9wbXQgPSAxICogMTAyNDsKLQkJcmFuZ2UtPm1heF9wbXQgPSAxMDAwICogMTAyNDsKLQkJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKLQkJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7Ci0JCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8Ci0JCQlJV19QT1dFUl9VTklDQVNUX1IgfCBJV19QT1dFUl9BTExfUjsKLQl9Ci0KLQlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgPSAxNDsKLQotCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQ7Ci0JcmFuZ2UtPnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7Ci0JcmFuZ2UtPm1pbl9yZXRyeSA9IDA7Ci0JcmFuZ2UtPm1heF9yZXRyeSA9IDI1NTsKLQotCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAgcEFkYXB0ZXItPkNoYW5uZWxMaXN0TnVtOwotCi0JdmFsID0gMDsKLQlmb3IgKGkgPSAxOyBpIDw9IHJhbmdlLT5udW1fY2hhbm5lbHM7IGkrKykKLQl7Ci0JCXUzMiBtID0gMjQxMjAwMDsKLQkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gcEFkYXB0ZXItPkNoYW5uZWxMaXN0W2ktMV0uQ2hhbm5lbDsKLQkJTUFQX0NIQU5ORUxfSURfVE9fS0haKHBBZGFwdGVyLT5DaGFubmVsTGlzdFtpLTFdLkNoYW5uZWwsIG0pOwotCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBtICogMTAwOyAvKiBPU19IWiAqLwotCi0JCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7Ci0JCXZhbCsrOwotCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKLQkJCWJyZWFrOwotCX0KLQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKLQotCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOyAvKiB3aGF0IGlzIGNvcnJlY3QgbWF4PyBUaGlzIHdhcyBub3QKLQkJCQkJKiBkb2N1bWVudGVkIGV4YWN0bHkuIEF0IGxlYXN0Ci0JCQkJCSogNjkgaGFzIGJlZW4gb2JzZXJ2ZWQuICovCi0JcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsgLyogZEIgKi8KLQlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOyAvKiBkQiAqLwotCi0JLyogV2hhdCB3b3VsZCBiZSBzdWl0YWJsZSB2YWx1ZXMgZm9yICJhdmVyYWdlL3R5cGljYWwiIHF1YWw/ICovCi0JcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAyMDsKLQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAtNjA7Ci0JcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gLTk1OwotCXJhbmdlLT5zZW5zaXRpdml0eSA9IDM7Ci0KLQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE5SX1dFUF9LRVlTOwotCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOwotCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gNTsKLQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IDEzOwotCi0JcmFuZ2UtPm1pbl9ydHMgPSAwOwotCXJhbmdlLT5tYXhfcnRzID0gMjM0NzsKLQlyYW5nZS0+bWluX2ZyYWcgPSAyNTY7Ci0JcmFuZ2UtPm1heF9mcmFnID0gMjM0NjsKLQotI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci0JLyogSVdfRU5DX0NBUEFfKiBiaXQgZmllbGQgKi8KLQlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9XUEEyIHwKLQkJCQkJSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVAgfCBJV19FTkNfQ0FQQV9DSVBIRVJfQ0NNUDsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotICAgIE5ESVNfODAyXzExX01BQ19BRERSRVNTIEJzc2lkOwotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotICAgIHsKLSAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7Ci0gICAgfQotCi0gICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCi0gICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KLSAgICBwQWRhcHRlci0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCi0JcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW49IDMyOwotCi0gICAgbWVtc2V0KEJzc2lkLCAwLCBNQUNfQUREUl9MRU4pOwotICAgIG1lbWNweShCc3NpZCwgYXBfYWRkci0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKLSAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAotICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCi0gICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU9DVEw6OlNJT0NTSVdBUCAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLSAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoSU5GUkFfT04ocEFkYXB0ZXIpIHx8IEFESE9DX09OKHBBZGFwdGVyKSkKLQl7Ci0JCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsICZwQWRhcHRlci0+Q29tbW9uQ2ZnLkJzc2lkLCBFVEhfQUxFTik7Ci0JfQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAvLyBBZGQgZm9yIFJUMjg3MAotICAgIGVsc2UgaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQICE9IFdQQV9TVVBQTElDQU5UX0RJU0FCTEUpCi0gICAgewotICAgICAgICBhcF9hZGRyLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0gICAgICAgIG1lbWNweShhcF9hZGRyLT5zYV9kYXRhLCAmcEFkYXB0ZXItPk1sbWVBdXguQnNzaWQsIEVUSF9BTEVOKTsKLSAgICB9Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCWVsc2UKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklPQ1RMOjpTSU9DR0lXQVAoPUVNUFRZKVxuIikpOwotCQlyZXR1cm4gLUVOT1RDT05OOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogVW5pdHMgYXJlIGluIGRiIGFib3ZlIHRoZSBub2lzZSBmbG9vci4gVGhhdCBtZWFucyB0aGUKLSAqIHJzc2kgdmFsdWVzIHJlcG9ydGVkIGluIHRoZSB0eC9yeCBkZXNjcmlwdG9ycyBpbiB0aGUKLSAqIGRyaXZlciBhcmUgdGhlIFNOUiBleHByZXNzZWQgaW4gZGIuCi0gKgotICogSWYgeW91IGFzc3VtZSB0aGF0IHRoZSBub2lzZSBmbG9vciBpcyAtOTUsIHdoaWNoIGlzIGFuCi0gKiBleGNlbGxlbnQgYXNzdW1wdGlvbiA5OS41ICUgb2YgdGhlIHRpbWUsIHRoZW4geW91IGNhbgotICogZGVyaXZlIHRoZSBhYnNvbHV0ZSBzaWduYWwgbGV2ZWwgKGkuZS4gLTk1ICsgcnNzaSkuCi0gKiBUaGVyZSBhcmUgc29tZSBvdGhlciBzbGlnaHQgZmFjdG9ycyB0byB0YWtlIGludG8gYWNjb3VudAotICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJzc2kgbWVhc3VyZW1lbnQgaXMgZnJvbSAxMWIsCi0gKiAxMWcsIG9yIDExYS4gICBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgYXQgbW9zdCAyZGIgYW5kCi0gKiBjYW4gYmUgZG9jdW1lbnRlZC4KLSAqCi0gKiBOQjogdmFyaW91cyBjYWxjdWxhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBvcmlub2NvL3dhdmVsYW4KLSAqICAgICBkcml2ZXJzIGZvciBjb21wYXRpYmlsaXR5Ci0gKi8KLXN0YXRpYyB2b2lkIHNldF9xdWFsaXR5KFBSVE1QX0FEQVBURVIgcEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcXVhbGl0eSAqaXEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgY2hhciByc3NpKQotewotCV9fdTggQ2hhbm5lbFF1YWxpdHk7Ci0KLQkvLyBOb3JtYWxpemUgUnNzaQotCWlmIChyc3NpID49IC01MCkKLSAgICAgICAgQ2hhbm5lbFF1YWxpdHkgPSAxMDA7Ci0JZWxzZSBpZiAocnNzaSA+PSAtODApIC8vIGJldHdlZW4gLTUwIH4gLTgwZGJtCi0JCUNoYW5uZWxRdWFsaXR5ID0gKF9fdTgpKDI0ICsgKChyc3NpICsgODApICogMjYpLzEwKTsKLQllbHNlIGlmIChyc3NpID49IC05MCkgICAvLyBiZXR3ZWVuIC04MCB+IC05MGRibQotICAgICAgICBDaGFubmVsUXVhbGl0eSA9IChfX3U4KSgocnNzaSArIDkwKSAqIDI2KS8xMDsKLQllbHNlCi0JCUNoYW5uZWxRdWFsaXR5ID0gMDsKLQotICAgIGlxLT5xdWFsID0gKF9fdTgpQ2hhbm5lbFF1YWxpdHk7Ci0KLSAgICBpcS0+bGV2ZWwgPSAoX191OCkocnNzaSk7Ci0gICAgaXEtPm5vaXNlID0gKHBBZGFwdGVyLT5CYnBXcml0ZUxhdGNoWzY2XSA+IHBBZGFwdGVyLT5CYnBUdW5pbmcuRmFsc2VDY2FVcHBlclRocmVzaG9sZCkgPyAoKF9fdTgpcEFkYXB0ZXItPkJicFR1bmluZy5GYWxzZUNjYVVwcGVyVGhyZXNob2xkKSA6ICgoX191OCkgcEFkYXB0ZXItPkJicFdyaXRlTGF0Y2hbNjZdKTsJCS8vIG5vaXNlIGxldmVsIChkQm0pCi0gICAgaXEtPm5vaXNlICs9IDI1NiAtIDE0MzsKLSAgICBpcS0+dXBkYXRlZCA9IHBBZGFwdGVyLT5pd19zdGF0cy5xdWFsLnVwZGF0ZWQ7Ci19Ci0KLWludCBydF9pb2N0bF9pd2FwbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlzdHJ1Y3Qgc29ja2FkZHIgYWRkcltJV19NQVhfQVBdOwotCXN0cnVjdCBpd19xdWFsaXR5IHF1YWxbSVdfTUFYX0FQXTsKLQlpbnQgaTsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCWRhdGEtPmxlbmd0aCA9IDA7Ci0JCXJldHVybiAwOwotICAgICAgICAvL3JldHVybiAtRU5FVERPV047Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8SVdfTUFYX0FQIDsgaSsrKQotCXsKLQkJaWYgKGkgPj0gIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yKQotCQkJYnJlYWs7Ci0JCWFkZHJbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQkJbWVtY3B5KGFkZHJbaV0uc2FfZGF0YSwgJnBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOwotCQlzZXRfcXVhbGl0eShwQWRhcHRlciwgJnF1YWxbaV0sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kpOwotCX0KLQlkYXRhLT5sZW5ndGggPSBpOwotCW1lbWNweShleHRyYSwgJmFkZHIsIGkqc2l6ZW9mKGFkZHJbMF0pKTsKLQlkYXRhLT5mbGFncyA9IDE7CQkvKiBzaWduYWwgcXVhbGl0eSBwcmVzZW50IChzb3J0IG9mKSAqLwotCW1lbWNweShleHRyYSArIGkqc2l6ZW9mKGFkZHJbMF0pLCAmcXVhbCwgaSpzaXplb2YocXVhbFtpXSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBTSU9DR0lXU0NBTgotaW50IHJ0X2lvY3RsX3Npd3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JVUxPTkcJCQkJCQkJCU5vdzsKLQlpbnQgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0JaWYgKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkKLQl7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFNjYW5Db3VudCsrOwotCX0KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLSAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCWlmIChSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwotCWRvewotCQlOb3cgPSBqaWZmaWVzOwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQlpZiAoKHBBZGFwdGVyLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID09IFdQQV9TVVBQTElDQU5UX0VOQUJMRSkgJiYKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIFdwYVN1cHBsaWNhbnRTY2FuQ291bnQgPiAzXG4iKSk7Ci0JCQlTdGF0dXMgPSBORElTX1NUQVRVU19TVUNDRVNTOwotCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQkJaWYgKChPUFNUQVRVU19URVNUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfTUVESUFfU1RBVEVfQ09OTkVDVEVEKSkgJiYKLQkJCSgocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpIHx8Ci0JCQkocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spKSAmJgotCQkJKHBBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEKSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIExpbmsgVVAsIFBvcnQgTm90IFNlY3VyZWQhIGlnbm9yZSB0aGlzIHNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU5cbiIpKTsKLQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChwQWRhcHRlci0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotCQl7Ci0JCQlSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7Ci0JCX0KLQotCQkvLyB0ZWxsIENOVEwgc3RhdGUgbWFjaGluZSB0byBjYWxsIE5kaXNNU2V0SW5mb3JtYXRpb25Db21wbGV0ZSgpIGFmdGVyIGNvbXBsZXRpbmcKLQkJLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KLQkJcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLQkJLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKLQkJcEFkYXB0ZXItPlN0YUNmZy5TY2FuQ250ID0gMDsKLQkJcEFkYXB0ZXItPlN0YUNmZy5MYXN0U2NhblRpbWUgPSBOb3c7Ci0KLQkJTWxtZUVucXVldWUocEFkYXB0ZXIsCi0JCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCU9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOLAotCQkJMCwKLQkJCU5VTEwpOwotCi0JCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCVJUTVBfTUxNRV9IQU5ETEVSKHBBZGFwdGVyKTsKLQl9d2hpbGUoMCk7Ci0JcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLWludCBydF9pb2N0bF9naXdzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCWludCBpPTA7Ci0JUFNUUklORyBjdXJyZW50X2V2ID0gZXh0cmEsIHByZXZpb3VzX2V2ID0gZXh0cmE7Ci0JUFNUUklORyBlbmRfYnVmOwotCVBTVFJJTkcgY3VycmVudF92YWw7Ci0JU1RSSU5HIGN1c3RvbVtNQVhfQ1VTVE9NX0xFTl0gPSB7MH07Ci0jaWZuZGVmIElXRVZHRU5JRQotCXVuc2lnbmVkIGNoYXIgaWR4OwotI2VuZGlmIC8vIElXRVZHRU5JRSAvLwotCXN0cnVjdCBpd19ldmVudCBpd2U7Ci0KLQlpZiAoUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfQlNTX1NDQU5fSU5fUFJPR1JFU1MpKQotICAgIHsKLQkJLyoKLQkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KLQkJICovCi0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JewotCQlwQWRhcHRlci0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRTY2FuQ291bnQgPSAwOwotCX0KLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzTnIgPT0gMCkKLQl7Ci0JCWRhdGEtPmxlbmd0aCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgIGlmIChkYXRhLT5sZW5ndGggPiAwKQotICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBkYXRhLT5sZW5ndGg7Ci0gICAgZWxzZQotICAgICAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOwotI2Vsc2UKLSAgICBlbmRfYnVmID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOwotI2VuZGlmCi0KLQlmb3IgKGkgPSAwOyBpIDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzTnI7IGkrKykKLQl7Ci0JCWlmIChjdXJyZW50X2V2ID49IGVuZF9idWYpCi0gICAgICAgIHsKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0JCS8vTUFDIGFkZHJlc3MKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gU0lPQ0dJV0FQOwotCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQkJCQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCAmcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzaWQsIEVUSF9BTEVOKTsKLQotICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJLyoKLQkJUHJvdG9jb2w6Ci0JCQlpdCB3aWxsIHNob3cgc2Nhbm5lZCBBUCdzIFdpcmVsZXNzTW9kZSAuCi0JCQlpdCBtaWdodCBiZQotCQkJCQk4MDIuMTFhCi0JCQkJCTgwMi4xMWEvbgotCQkJCQk4MDIuMTFnL24KLQkJCQkJODAyLjExYi9nL24KLQkJCQkJODAyLjExZwotCQkJCQk4MDIuMTFiL2cKLQkJKi8KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdOQU1FOwotCi0KLQl7Ci0JCVBCU1NfRU5UUlkgcEJzc0VudHJ5PSZwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXTsKLQkJQk9PTEVBTiBpc0dvbmx5PUZBTFNFOwotCQlpbnQgcmF0ZUNudD0wOwotCi0JCWlmIChwQnNzRW50cnktPkNoYW5uZWw+MTQpCi0JCXsKLQkJCWlmIChwQnNzRW50cnktPkh0Q2FwYWJpbGl0eUxlbiE9MCkKLQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExYS9uIik7Ci0JCQllbHNlCi0JCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWEiKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCS8qCi0JCQkJaWYgb25lIG9mIG5vbiBCIG1vZGUgcmF0ZSBpcyBzZXQgc3VwcG9ydGVkIHJhdGUgLiBpdCBtZWFuIEcgb25seS4KLQkJCSovCi0JCQlmb3IgKHJhdGVDbnQ9MDtyYXRlQ250PHBCc3NFbnRyeS0+U3VwUmF0ZUxlbjtyYXRlQ250KyspCi0JCQl7Ci0JCQkJLyoKLQkJCQkJNk1icHMoMTQwKSA5TWJwcygxNDYpIGFuZCA+PTEyTWJwcygxNTIpIGFyZSBzdXBwb3J0ZWQgcmF0ZSAsIGl0IG1lYW4gRyBvbmx5LgotCQkJCSovCi0JCQkJaWYgKHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XT09MTQwIHx8IHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XT09MTQ2IHx8IHBCc3NFbnRyeS0+U3VwUmF0ZVtyYXRlQ250XT49MTUyKQotCQkJCQlpc0dvbmx5PVRSVUU7Ci0JCQl9Ci0KLQkJCWZvciAocmF0ZUNudD0wO3JhdGVDbnQ8cEJzc0VudHJ5LT5FeHRSYXRlTGVuO3JhdGVDbnQrKykKLQkJCXsKLQkJCQlpZiAocEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPT0xNDAgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPT0xNDYgfHwgcEJzc0VudHJ5LT5FeHRSYXRlW3JhdGVDbnRdPj0xNTIpCi0JCQkJCWlzR29ubHk9VFJVRTsKLQkJCX0KLQotCi0JCQlpZiAocEJzc0VudHJ5LT5IdENhcGFiaWxpdHlMZW4hPTApCi0JCQl7Ci0JCQkJaWYgKGlzR29ubHk9PVRSVUUpCi0JCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFnL24iKTsKLQkJCQllbHNlCi0JCQkJCXN0cmNweShpd2UudS5uYW1lLCI4MDIuMTFiL2cvbiIpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChpc0dvbmx5PT1UUlVFKQotCQkJCQlzdHJjcHkoaXdlLnUubmFtZSwiODAyLjExZyIpOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChwQnNzRW50cnktPlN1cFJhdGVMZW49PTQgJiYgcEJzc0VudHJ5LT5FeHRSYXRlTGVuPT0wKQotCQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWIiKTsKLQkJCQkJZWxzZQotCQkJCQkJc3RyY3B5KGl3ZS51Lm5hbWUsIjgwMi4xMWIvZyIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKLQkJaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0JCQlyZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJLy9FU1NJRAotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7Ci0JCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbjsKLQkJaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0KLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldixlbmRfYnVmLCAmaXdlLCAoUFNUUklORykgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCk7Ci0gICAgICAgIGlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vTmV0d29yayBUeXBlCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOwotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSUJTUykKLQkJewotCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7Ci0JCX0KLQkJZWxzZSBpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQnNzVHlwZSA9PSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmUpCi0JCXsKLQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaXdlLnUubW9kZSA9IElXX01PREVfQVVUTzsKLQkJfQotCQlpd2UubGVuID0gSVdfRVZfVUlOVF9MRU47Ci0KLSAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIElXX0VWX1VJTlRfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJLy9DaGFubmVsIGFuZCBGcmVxdWVuY3kKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7Ci0JCWlmIChJTkZSQV9PTihwQWRhcHRlcikgfHwgQURIT0NfT04ocEFkYXB0ZXIpKQotCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKLQkJZWxzZQotCQkJaXdlLnUuZnJlcS5tID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbDsKLQkJaXdlLnUuZnJlcS5lID0gMDsKLQkJaXdlLnUuZnJlcS5pID0gMDsKLQotCQlwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0JCWN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBjdXJyZW50X2V2LGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0KLSAgICAgICAgLy9BZGQgcXVhbGl0eSBzdGF0aXN0aWNzCi0gICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQlpd2UuY21kID0gSVdFVlFVQUw7Ci0JaXdlLnUucXVhbC5sZXZlbCA9IDA7Ci0JaXdlLnUucXVhbC5ub2lzZSA9IDA7Ci0Jc2V0X3F1YWxpdHkocEFkYXB0ZXIsICZpd2UudS5xdWFsLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc3NpKTsKLQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwotCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQlicmVhazsKLSNlbmRpZgotCi0JCS8vRW5jeXB0aW9uIGtleQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOwotCQlpZiAoQ0FQX0lTX1BSSVZBQ1lfT04gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkNhcGFiaWxpdHlJbmZvICkpCi0JCQlpd2UudS5kYXRhLmZsYWdzID1JV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKLQkJZWxzZQotCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQotICAgICAgICBwcmV2aW91c19ldiA9IGN1cnJlbnRfZXY7Ci0gICAgICAgIGN1cnJlbnRfZXYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCZpd2UsIChjaGFyICopcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsoaXdlLnUuZGF0YS5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCktMV0uS2V5KTsKLSAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJLy9CaXQgUmF0ZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JCWlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBVQ0hBUiB0bXBSYXRlID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZVtwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5TdXBSYXRlTGVuLTFdOwotCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKLQkJY3VycmVudF92YWwgPSBjdXJyZW50X2V2ICsgSVdfRVZfTENQX0xFTjsKLSAgICAgICAgICAgIGlmICh0bXBSYXRlID09IDB4ODIpCi0gICAgICAgICAgICAgICAgaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICAxICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg4NCkKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDIgKiAxMDAwMDAwOwotICAgICAgICAgICAgZWxzZSBpZiAodG1wUmF0ZSA9PSAweDhCKQotICAgICAgICAgICAgICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgNS41ICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRtcFJhdGUgPT0gMHg5NikKLSAgICAgICAgICAgICAgICBpd2UudS5iaXRyYXRlLnZhbHVlID0gIDExICogMTAwMDAwMDsKLSAgICAgICAgICAgIGVsc2UKLQkJICAgIGl3ZS51LmJpdHJhdGUudmFsdWUgPSAgKHRtcFJhdGUvMikgKiAxMDAwMDAwOwotCi0JCQlpZiAodG1wUmF0ZSA9PSAweDZjICYmIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkh0Q2FwYWJpbGl0eUxlbiA+IDApCi0JCQl7Ci0JCQkJaW50IHJhdGVfY291bnQgPSBzaXplb2YocmFsaW5rcmF0ZSkvc2l6ZW9mKF9fczMyKTsKLQkJCQlIVF9DQVBfSU5GTyBjYXBJbmZvID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSHRDYXBhYmlsaXR5Lkh0Q2FwSW5mbzsKLQkJCQlpbnQgc2hvcnRHSSA9IGNhcEluZm8uQ2hhbm5lbFdpZHRoID8gY2FwSW5mby5TaG9ydEdJZm9yNDAgOiBjYXBJbmZvLlNob3J0R0lmb3IyMDsKLQkJCQlpbnQgbWF4TUNTID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uSHRDYXBhYmlsaXR5Lk1DU1NldFsxXSA/ICAxNSA6IDc7Ci0JCQkJaW50IHJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpY2FwSW5mby5DaGFubmVsV2lkdGggKiAyNCkgKyAoKFVDSEFSKXNob3J0R0kgKjQ4KSArICgoVUNIQVIpbWF4TUNTKTsKLQkJCQlpZiAocmF0ZV9pbmRleCA8IDApCi0JCQkJCXJhdGVfaW5kZXggPSAwOwotCQkJCWlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKLQkJCQkJcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7Ci0JCQkJaXdlLnUuYml0cmF0ZS52YWx1ZQk9ICByYWxpbmtyYXRlW3JhdGVfaW5kZXhdICogNTAwMDAwOwotCQkJfQotCi0JCQlpd2UudS5iaXRyYXRlLmRpc2FibGVkID0gMDsKLQkJCWN1cnJlbnRfdmFsID0gSVdFX1NUUkVBTV9BRERfVkFMVUUoaW5mbywgY3VycmVudF9ldiwKLQkJCQljdXJyZW50X3ZhbCwgZW5kX2J1ZiwgJml3ZSwKLQkJCUlXX0VWX1BBUkFNX0xFTik7Ci0KLQkJaWYoKGN1cnJlbnRfdmFsLWN1cnJlbnRfZXYpPklXX0VWX0xDUF9MRU4pCi0JCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKLQkJZWxzZQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLQotI2lmZGVmIElXRVZHRU5JRQotICAgICAgICAvL1dQQSBJRQotCQlpZiAocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4gPiAwKQotICAgICAgICB7Ci0JCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVbMF0pLAotCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW4pOwotCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKLQkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uV3BhSUUuSUVMZW47Ci0JCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKLQkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJICAgIGJyZWFrOwotI2VuZGlmCi0JCX0KLQotCQkvL1dQQTIgSUUKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzbklFLklFTGVuID4gMCkKLSAgICAgICAgewotCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJCW1lbWNweShjdXN0b20sICYocEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVbMF0pLAotCQkJCQkJICAgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW4pOwotCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKLQkJCWl3ZS51LmRhdGEubGVuZ3RoID0gcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47Ci0JCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgY3VzdG9tKTsKLQkJCWlmIChjdXJyZW50X2V2ID09IHByZXZpb3VzX2V2KQotI2lmIFdJUkVMRVNTX0VYVCA+PSAxNwotICAgICAgICAgICAgICAgIHJldHVybiAtRTJCSUc7Ci0jZWxzZQotCQkJICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIC8vV1BBIElFCi0JCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuID4gMCkKLSAgICAgICAgewotCQlOZGlzWmVyb01lbW9yeSgmaXdlLCBzaXplb2YoaXdlKSk7Ci0JCQltZW1zZXQoJmN1c3RvbVswXSwgMCwgTUFYX0NVU1RPTV9MRU4pOwotCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKLSAgICAgICAgICAgIGl3ZS51LmRhdGEubGVuZ3RoID0gKHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFTGVuICogMikgKyA3OwotICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkoY3VzdG9tLCAid3BhX2llPSIsIDcpOwotICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5XcGFJRS5JRUxlbjsgaWR4KyspCi0gICAgICAgICAgICAgICAgc3ByaW50ZihjdXN0b20sICIlcyUwMngiLCBjdXN0b20sIHBBZGFwdGVyLT5TY2FuVGFiLkJzc0VudHJ5W2ldLldwYUlFLklFW2lkeF0pOwotICAgICAgICAgICAgcHJldmlvdXNfZXYgPSBjdXJyZW50X2V2OwotCQljdXJyZW50X2V2ID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgIGN1c3RvbSk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudF9ldiA9PSBwcmV2aW91c19ldikKLSNpZiBXSVJFTEVTU19FWFQgPj0gMTcKLSAgICAgICAgICAgICAgICByZXR1cm4gLUUyQklHOwotI2Vsc2UKLQkJCSAgICBicmVhazsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgLy9XUEEyIElFCi0gICAgICAgIGlmIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiA+IDApCi0gICAgICAgIHsKLQkJTmRpc1plcm9NZW1vcnkoJml3ZSwgc2l6ZW9mKGl3ZSkpOwotCQkJbWVtc2V0KCZjdXN0b21bMF0sIDAsIE1BWF9DVVNUT01fTEVOKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0gICAgICAgICAgICBpd2UudS5kYXRhLmxlbmd0aCA9IChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRUxlbiAqIDIpICsgNzsKLSAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KGN1c3RvbSwgInJzbl9pZT0iLCA3KTsKLQkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcEFkYXB0ZXItPlNjYW5UYWIuQnNzRW50cnlbaV0uUnNuSUUuSUVMZW47IGlkeCsrKQotICAgICAgICAgICAgICAgIHNwcmludGYoY3VzdG9tLCAiJXMlMDJ4IiwgY3VzdG9tLCBwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Sc25JRS5JRVtpZHhdKTsKLSAgICAgICAgICAgIHByZXZpb3VzX2V2ID0gY3VycmVudF9ldjsKLQkJY3VycmVudF9ldiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsICBjdXN0b20pOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRfZXYgPT0gcHJldmlvdXNfZXYpCi0jaWYgV0lSRUxFU1NfRVhUID49IDE3Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSNlbHNlCi0JCQkgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgfQotI2VuZGlmIC8vIElXRVZHRU5JRSAvLwotCX0KLQotCWRhdGEtPmxlbmd0aCA9IGN1cnJlbnRfZXYgLSBleHRyYTsKLSAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiAsKCI9PT0+cnRfaW9jdGxfZ2l3c2Nhbi4gJWQoJWQpIEJTUyByZXR1cm5lZCwgZGF0YS0+bGVuZ3RoID0gJWRcbiIsaSAsIHBBZGFwdGVyLT5TY2FuVGFiLkJzc05yLCBkYXRhLT5sZW5ndGgpKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1pbnQgcnRfaW9jdGxfc2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCXJldHVybiAtRU5FVERPV047Ci0gICAgfQotCi0JaWYgKGRhdGEtPmZsYWdzKQotCXsKLQkJUFNUUklORwlwU3NpZFN0cmluZyA9IE5VTEw7Ci0KLQkJLy8gSW5jbHVkZXMgbnVsbCBjaGFyYWN0ZXIuCi0JCWlmIChkYXRhLT5sZW5ndGggPiAoSVdfRVNTSURfTUFYX1NJWkUgKyAxKSkKLQkJCXJldHVybiAtRTJCSUc7Ci0KLQkJcFNzaWRTdHJpbmcgPSBrbWFsbG9jKE1BWF9MRU5fT0ZfU1NJRCsxLCBNRU1fQUxMT0NfRkxBRyk7Ci0JCWlmIChwU3NpZFN0cmluZykKLSAgICAgICAgewotCQkJTmRpc1plcm9NZW1vcnkocFNzaWRTdHJpbmcsIE1BWF9MRU5fT0ZfU1NJRCsxKTsKLQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBlc3NpZCwgZGF0YS0+bGVuZ3RoKTsKLQkJCWlmIChTZXRfU1NJRF9Qcm9jKHBBZGFwdGVyLCBwU3NpZFN0cmluZykgPT0gRkFMU0UpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQllbHNlCi0gICAgewotCQkvLyBBTlkgc3NpZAotCQlpZiAoU2V0X1NTSURfUHJvYyhwQWRhcHRlciwgIiIpID09IEZBTFNFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQlpZiAocEFkYXB0ZXIgPT0gTlVMTCkKLQl7Ci0JCS8qIGlmIDFzdCBvcGVuIGZhaWwsIHBBZCB3aWxsIGJlIGZyZWU7Ci0JCSAgIFNvIHRoZSBuZXRfZGV2LT5wcml2IHdpbGwgYmUgTlVMTCBpbiAycmQgb3BlbiAqLwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWRhdGEtPmZsYWdzID0gMTsKLSAgICBpZiAoTU9OSVRPUl9PTihwQWRhcHRlcikpCi0gICAgewotICAgICAgICBkYXRhLT5sZW5ndGggID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0JaWYgKE9QU1RBVFVTX1RFU1RfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiTWVkaWFTdGF0ZSBpcyBjb25uZWN0ZWRcbiIpKTsKLQkJZGF0YS0+bGVuZ3RoID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuOwotCQltZW1jcHkoZXNzaWQsIHBBZGFwdGVyLT5Db21tb25DZmcuU3NpZCwgcEFkYXB0ZXItPkNvbW1vbkNmZy5Tc2lkTGVuKTsKLQl9Ci0JZWxzZQotCXsvL3RoZSBBTlkgc3NpZCB3YXMgc3BlY2lmaWVkCi0JCWRhdGEtPmxlbmd0aCAgPSAwOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJNZWRpYVN0YXRlIGlzIG5vdCBjb25uZWN0ZWQsIGVzc1xuIikpOwotCX0KLQotCXJldHVybiAwOwotCi19Ci0KLWludCBydF9pb2N0bF9zaXduaWNrbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0gICAgaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotICAgIHsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotICAgICAgICByZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCWlmIChkYXRhLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQocEFkYXB0ZXItPm5pY2tuYW1lLCAwLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOwotCW1lbWNweShwQWRhcHRlci0+bmlja25hbWUsIG5pY2tuYW1lLCBkYXRhLT5sZW5ndGgpOwotCi0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX2dpd25pY2tuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKm5pY2tuYW1lKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoZGF0YS0+bGVuZ3RoID4gc3RybGVuKChQU1RSSU5HKSBwQWRhcHRlci0+bmlja25hbWUpICsgMSkKLQkJZGF0YS0+bGVuZ3RoID0gc3RybGVuKChQU1RSSU5HKSBwQWRhcHRlci0+bmlja25hbWUpICsgMTsKLQlpZiAoZGF0YS0+bGVuZ3RoID4gMCkgewotCQltZW1jcHkobmlja25hbWUsIHBBZGFwdGVyLT5uaWNrbmFtZSwgZGF0YS0+bGVuZ3RoLTEpOwotCQluaWNrbmFtZVtkYXRhLT5sZW5ndGgtMV0gPSAnXDAnOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0X2lvY3RsX3Npd3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQl1MTYgdmFsOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLSAgICBpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0gICAgICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgfQotCi0JaWYgKHJ0cy0+ZGlzYWJsZWQpCi0JCXZhbCA9IE1BWF9SVFNfVEhSRVNIT0xEOwotCWVsc2UgaWYgKHJ0cy0+dmFsdWUgPCAwIHx8IHJ0cy0+dmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZSBpZiAocnRzLT52YWx1ZSA9PSAwKQotCSAgICB2YWwgPSBNQVhfUlRTX1RIUkVTSE9MRDsKLQllbHNlCi0JCXZhbCA9IHJ0cy0+dmFsdWU7Ci0KLQlpZiAodmFsICE9IHBBZGFwdGVyLT5Db21tb25DZmcuUnRzVGhyZXNob2xkKQotCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IHZhbDsKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgICAgc3RydWN0IGl3X3BhcmFtICpydHMsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlydHMtPnZhbHVlID0gcEFkYXB0ZXItPkNvbW1vbkNmZy5SdHNUaHJlc2hvbGQ7Ci0JcnRzLT5kaXNhYmxlZCA9IChydHMtPnZhbHVlID09IE1BWF9SVFNfVEhSRVNIT0xEKTsKLQlydHMtPmZpeGVkID0gMTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgcnRfaW9jdGxfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCXN0cnVjdCBpd19wYXJhbSAqZnJhZywgY2hhciAqZXh0cmEpCi17Ci0JUFJUTVBfQURBUFRFUiBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JdTE2IHZhbDsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWlmIChmcmFnLT5kaXNhYmxlZCkKLQkJdmFsID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCWVsc2UgaWYgKGZyYWctPnZhbHVlID49IE1JTl9GUkFHX1RIUkVTSE9MRCB8fCBmcmFnLT52YWx1ZSA8PSBNQVhfRlJBR19USFJFU0hPTEQpCi0gICAgICAgIHZhbCA9IF9fY3B1X3RvX2xlMTYoZnJhZy0+dmFsdWUgJiB+MHgxKTsgLyogZXZlbiBudW1iZXJzIG9ubHkgKi8KLQllbHNlIGlmIChmcmFnLT52YWx1ZSA9PSAwKQotCSAgICB2YWwgPSBNQVhfRlJBR19USFJFU0hPTEQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBBZGFwdGVyLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSB2YWw7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXdmcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJc3RydWN0IGl3X3BhcmFtICpmcmFnLCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZGFwdGVyID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JZnJhZy0+dmFsdWUgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkOwotCWZyYWctPmRpc2FibGVkID0gKGZyYWctPnZhbHVlID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7Ci0JZnJhZy0+Zml4ZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgTUFYX1dFUF9LRVlfU0laRSAxMwotI2RlZmluZSBNSU5fV0VQX0tFWV9TSVpFIDUKLWludCBydF9pb2N0bF9zaXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKChlcnEtPmxlbmd0aCA9PSAwKSAmJgotICAgICAgICAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkpCi0JewotCQlwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0gICAgICAgIGdvdG8gZG9uZTsKLQl9Ci0JZWxzZSBpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEIHx8IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfT1BFTikKLQl7Ci0JICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQlTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLQkJcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLQkJcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0JCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkOwotCWVsc2UKLQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCX0KLQotICAgIGlmIChlcnEtPmxlbmd0aCA+IDApCi0JewotCQlpbnQga2V5SWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKLQkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLwotCQlpZiAoZXJxLT5sZW5ndGggPiBNQVhfV0VQX0tFWV9TSVpFKQotCQl7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQkvKiBDaGVjayBrZXkgaW5kZXggKi8KLQkJaWYgKChrZXlJZHggPCAwKSB8fCAoa2V5SWR4ID49IE5SX1dFUF9LRVlTKSkKLSAgICAgICAgewotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXcm9uZyBrZXlJZHg9JWQhIFVzaW5nIGRlZmF1bHQga2V5IGluc3RlYWQgKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlJZHgsIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0KLSAgICAgICAgICAgIC8vVXNpbmcgZGVmYXVsdCBrZXkKLQkJCWtleUlkeCA9IHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotICAgICAgICB9Ci0JCWVsc2UKLQkJCXBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0ga2V5SWR4OwotCi0gICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksICAxNik7Ci0KLQkJaWYgKGVycS0+bGVuZ3RoID09IE1BWF9XRVBfS0VZX1NJWkUpCi0gICAgICAgIHsKLQkJCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXlMZW4gPSBNQVhfV0VQX0tFWV9TSVpFOwotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0JCX0KLQkJZWxzZSBpZiAoZXJxLT5sZW5ndGggPT0gTUlOX1dFUF9LRVlfU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IE1JTl9XRVBfS0VZX1NJWkU7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotCQl9Ci0JCWVsc2UKLQkJCS8qIERpc2FibGUgdGhlIGtleSAqLwotCQkJcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7Ci0KLQkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkKLQkJewotCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KLQkJCU5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dHJhLCBlcnEtPmxlbmd0aCk7Ci0gICAgICAgIH0KLQl9Ci0gICAgZWxzZQotCQkJewotCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLwotCQlpbnQgaW5kZXggPSAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotCQlpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IDQpKQotICAgICAgICB7Ci0JCQlwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICBlbHNlCi0JCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLwotCQlpZiAoIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi1kb25lOgotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PnJ0X2lvY3RsX3Npd2VuY29kZTo6ZXJxLT5mbGFncz0leFxuIixlcnEtPmZsYWdzKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpBdXRoTW9kZT0leFxuIixwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpEZWZhdWx0S2V5SWQ9JXgsIEtleUxlbiA9ICVkXG4iLHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkICwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuKSk7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT0+cnRfaW9jdGxfc2l3ZW5jb2RlOjpXZXBTdGF0dXM9JXhcbiIscEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMpKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50Ci1ydF9pb2N0bF9naXdlbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKLXsKLQlpbnQga2lkOwotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0JaWYgKHBBZGFwdGVyID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQkvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotCWtpZCA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7Ci0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PnJ0X2lvY3RsX2dpd2VuY29kZSAlZFxuIiwgZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkpOwotCi0JaWYgKHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFXRVBEaXNhYmxlZCkKLQl7Ci0JCWVycS0+bGVuZ3RoID0gMDsKLQkJZXJxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQl9Ci0JZWxzZSBpZiAoKGtpZCA+IDApICYmIChraWQgPD00KSkKLQl7Ci0JCS8vIGNvcHkgd2VwIGtleQotCQllcnEtPmZsYWdzID0ga2lkIDsJCQkvKiBOQjogYmFzZSAxICovCi0JCWlmIChlcnEtPmxlbmd0aCA+IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2lkLTFdLktleUxlbikKLQkJCWVycS0+bGVuZ3RoID0gcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtraWQtMV0uS2V5TGVuOwotCQltZW1jcHkoa2V5LCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tpZC0xXS5LZXksIGVycS0+bGVuZ3RoKTsKLQkJLy9pZiAoKGtpZCA9PSBwQWRhcHRlci0+UG9ydENmZy5EZWZhdWx0S2V5SWQpKQotCQkvL2VycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CS8qIFhYWCAqLwotCQlpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQpCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOwkJLyogWFhYICovCi0JCWVsc2UKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CQkvKiBYWFggKi8KLQotCX0KLQllbHNlIGlmIChraWQgPT0gMCkKLQl7Ci0JCWlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCkKLQkJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CQkvKiBYWFggKi8KLQkJZWxzZQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsJCS8qIFhYWCAqLwotCQllcnEtPmxlbmd0aCA9IHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbjsKLQkJbWVtY3B5KGtleSwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5LCBlcnEtPmxlbmd0aCk7Ci0JCS8vIGNvcHkgZGVmYXVsdCBrZXkgSUQKLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKQotCQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsJCS8qIFhYWCAqLwotCQllbHNlCi0JCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwkJLyogWFhYICovCi0JCWVycS0+ZmxhZ3MgPSBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCArIDE7CQkJLyogTkI6IGJhc2UgMSAqLwotCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwkvKiBYWFggKi8KLQl9Ci0KLQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgaW50Ci1ydF9pb2N0bF9zZXRwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHZvaWQgKncsIGNoYXIgKmV4dHJhKQotewotCVBSVE1QX0FEQVBURVIgcEFkYXB0ZXI7Ci0JUE9TX0NPT0tJRSBwT2JqOwotCVBTVFJJTkcgdGhpc19jaGFyID0gZXh0cmE7Ci0JUFNUUklORyB2YWx1ZTsKLQlpbnQgIFN0YXR1cz0wOwotCi0JcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCWlmIChwQWRhcHRlciA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JcE9iaiA9IChQT1NfQ09PS0lFKSBwQWRhcHRlci0+T1NfQ29va2llOwotCXsKLQkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOwotICAgICAgICBwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOwotCX0KLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZGFwdGVyLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlpZiAoISp0aGlzX2NoYXIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKLQkgICAgKnZhbHVlKysgPSAwOwotCi0JaWYgKCF2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNpdGVTdXJ2ZXkiKSAhPSAwKSkKLQkgICAgcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZQotCQlnb3RvIFNFVF9QUk9DOwotCi0JLy8gcmVqZWN0IHNldHRpbmcgbm90aGluZyBiZXNpZGVzIEFOWSBzc2lkKHNzaWRMZW49MCkKLSAgICBpZiAoISp2YWx1ZSAmJiAoc3RyY21wKHRoaXNfY2hhciwgIlNTSUQiKSAhPSAwKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLVNFVF9QUk9DOgotCWZvciAoUFJUTVBfUFJJVkFURV9TRVRfUFJPQyA9IFJUTVBfUFJJVkFURV9TVVBQT1JUX1BST0M7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MtPm5hbWU7IFBSVE1QX1BSSVZBVEVfU0VUX1BST0MrKykKLQl7Ci0JICAgIGlmIChzdHJjbXAodGhpc19jaGFyLCBQUlRNUF9QUklWQVRFX1NFVF9QUk9DLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgICBpZighUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+c2V0X3Byb2MocEFkYXB0ZXIsIHZhbHVlKSkKLQkgICAgICAgIHsJLy9GQUxTRTpTZXQgcHJpdmF0ZSBmYWlsZWQgdGhlbiByZXR1cm4gSW52YWxpZCBhcmd1bWVudAotCQkJICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0JICAgICAgICB9Ci0JCSAgICBicmVhazsJLy9FeGl0IGZvciBsb29wLgotCSAgICB9Ci0JfQotCi0JaWYoUFJUTVBfUFJJVkFURV9TRVRfUFJPQy0+bmFtZSA9PSBOVUxMKQotCXsgIC8vTm90IGZvdW5kIGFyZ3VtZW50Ci0JICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0JICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT5ydF9pb2N0bF9zZXRwYXJhbTo6IChpd3ByaXYpIE5vdCBTdXBwb3J0IFNldCBDb21tYW5kIFslcz0lc11cbiIsIHRoaXNfY2hhciwgdmFsdWUpKTsKLQl9Ci0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi0KLXN0YXRpYyBpbnQKLXJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQotewotCUlOVAkJCQlTdGF0dXMgPSAwOwotICAgIFBSVE1QX0FEQVBURVIgICBwQWQgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCi0gICAgaWYgKGV4dHJhID09IE5VTEwpCi0gICAgewotICAgICAgICB3cnEtPmxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybiAtRUlPOwotICAgIH0KLQotICAgIG1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotICAgIHNwcmludGYoZXh0cmEsICJcblxuIik7Ci0KLSNpZmRlZiBSQUxJTktfQVRFCi0JaWYgKEFURV9PTihwQWQpKQotCXsKLQkgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+YXRlLlR4RG9uZUNvdW50KTsKLQkgICAgLy9zcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5hdGUuVHhEb25lQ291bnQpOwotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCXsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIHdpdGhvdXQgcmV0cnkgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuVHJhbnNtaXR0ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0IC0gKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLlJldHJ5Q291bnQuUXVhZFBhcnQpOwotCX0KLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJUeCBzdWNjZXNzIGFmdGVyIHJldHJ5ICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydCk7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiVHggZmFpbCB0byBSY3YgQUNLIGFmdGVyIHJldHJ5ICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgU3VjY2VzcyBSY3YgQ1RTICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTU3VjY2Vzc0NvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSVFMgRmFpbCBSY3YgQ1RTICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5XbGFuQ291bnRlcnMuUlRTRmFpbHVyZUNvdW50LlF1YWRQYXJ0KTsKLQotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHN1Y2Nlc3MgICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5SZWNlaXZlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQpOwotICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJ4IHdpdGggQ1JDICAgICAgICAgICAgICAgICAgICAgPSAlbGRcbiIsIChVTE9ORylwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0KTsKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSeCBkcm9wIGR1ZSB0byBvdXQgb2YgcmVzb3VyY2UgID0gJWxkXG4iLCAoVUxPTkcpcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcik7Ci0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUnggZHVwbGljYXRlIGZyYW1lICAgICAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQuUXVhZFBhcnQpOwotCi0gICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiRmFsc2UgQ0NBIChvbmUgc2Vjb25kKSAgICAgICAgICA9ICVsZFxuIiwgKFVMT05HKXBBZC0+UmFsaW5rQ291bnRlcnMuT25lU2VjRmFsc2VDQ0FDbnQpOwotCi0jaWZkZWYgUkFMSU5LX0FURQotCWlmIChBVEVfT04ocEFkKSkKLQl7Ci0JCWlmIChwQWQtPmF0ZS5SeEFudGVubmFTZWwgPT0gMCkKLQkJewotCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5hdGUuTGFzdFJzc2kwIC0gcEFkLT5CYnBSc3NpVG9EYm1EZWx0YSkpOwotCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1CIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQyAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcblxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMiAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVsZFxuIiwgKExPTkcpKHBBZC0+YXRlLkxhc3RSc3NpMCAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLQkJfQotCX0KLQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCXsKLQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSU1NJLUEgICAgICAgICAgICAgICAgICAgICAgICAgID0gJWxkXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0gICAgICAgIHNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlJTU0ktQiAoaWYgYXZhaWxhYmxlKSAgICAgICAgICAgPSAlbGRcbiIsIChMT05HKShwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMSAtIHBBZC0+QmJwUnNzaVRvRGJtRGVsdGEpKTsKLSAgICAgICAgc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUlNTSS1DIChpZiBhdmFpbGFibGUpICAgICAgICAgICA9ICVsZFxuXG4iLCAoTE9ORykocEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTIgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhKSk7Ci0JfQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICBzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJXcGFTdXBwbGljYW50VVAgICAgICAgICAgICAgICAgID0gJWRcblxuIiwgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQKTsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQotCi0gICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IHJ0X3ByaXZhdGVfZ2V0X3N0YXRpc3RpY3MsIHdycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7Ci0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi12b2lkCWdldEJhSW5mbygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJcE91dEJ1ZikKLXsKLQlJTlQgaSwgajsKLQlCQV9PUklfRU5UUlkgKnBPcmlCQUVudHJ5OwotCUJBX1JFQ19FTlRSWSAqcFJlY0JBRW50cnk7Ci0KLQlmb3IgKGk9MDsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQkJaWYgKCgocEVudHJ5LT5WYWxpZEFzQ0xJIHx8IHBFbnRyeS0+VmFsaWRBc0FwQ2xpKSAmJiAocEVudHJ5LT5Tc3QgPT0gU1NUX0FTU09DKSkKLQkJCXx8IChwRW50cnktPlZhbGlkQXNXRFMpIHx8IChwRW50cnktPlZhbGlkQXNNZXNoKSkKLQkJewotCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIChBaWQgPSAlZCkgKEFQKSAtXG4iLAotICAgICAgICAgICAgICAgIHBPdXRCdWYsCi0JCQkJcEVudHJ5LT5BZGRyWzBdLCBwRW50cnktPkFkZHJbMV0sIHBFbnRyeS0+QWRkclsyXSwKLQkJCQlwRW50cnktPkFkZHJbM10sIHBFbnRyeS0+QWRkcls0XSwgcEVudHJ5LT5BZGRyWzVdLCBwRW50cnktPkFpZCk7Ci0KLQkJCXNwcmludGYocE91dEJ1ZiwgIiVzW1JlY2lwaWVudF1cbiIsIHBPdXRCdWYpOwotCQkJZm9yIChqPTA7IGogPCBOVU1fT0ZfVElEOyBqKyspCi0JCQl7Ci0JCQkJaWYgKHBFbnRyeS0+QkFSZWNXY2lkQXJyYXlbal0gIT0gMCkKLQkJCQl7Ci0JCQkJCXBSZWNCQUVudHJ5ID0mcEFkLT5CQVRhYmxlLkJBUmVjRW50cnlbcEVudHJ5LT5CQVJlY1djaWRBcnJheVtqXV07Ci0JCQkJCXNwcmludGYocE91dEJ1ZiwgIiVzVElEPSVkLCBCQVdpblNpemU9JWQsIExhc3RJbmRTZXE9JWQsIFJlb3JkZXJpbmdQa3RzPSVkXG4iLCBwT3V0QnVmLCBqLCBwUmVjQkFFbnRyeS0+QkFXaW5TaXplLCBwUmVjQkFFbnRyeS0+TGFzdEluZFNlcSwgcFJlY0JBRW50cnktPmxpc3QucWxlbik7Ci0JCQkJfQotCQkJfQotCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNcbiIsIHBPdXRCdWYpOwotCi0JCQlzcHJpbnRmKHBPdXRCdWYsICIlc1tPcmlnaW5hdG9yXVxuIiwgcE91dEJ1Zik7Ci0JCQlmb3IgKGo9MDsgaiA8IE5VTV9PRl9USUQ7IGorKykKLQkJCXsKLQkJCQlpZiAocEVudHJ5LT5CQU9yaVdjaWRBcnJheVtqXSAhPSAwKQotCQkJCXsKLQkJCQkJcE9yaUJBRW50cnkgPSZwQWQtPkJBVGFibGUuQkFPcmlFbnRyeVtwRW50cnktPkJBT3JpV2NpZEFycmF5W2pdXTsKLQkJCQkJc3ByaW50ZihwT3V0QnVmLCAiJXNUSUQ9JWQsIEJBV2luU2l6ZT0lZCwgU3RhcnRTZXE9JWQsIEN1clR4U2VxPSVkXG4iLCBwT3V0QnVmLCBqLCBwT3JpQkFFbnRyeS0+QkFXaW5TaXplLCBwT3JpQkFFbnRyeS0+U2VxdWVuY2UsIHBFbnRyeS0+VHhTZXFbal0pOwotCQkJCX0KLQkJCX0KLQkJCXNwcmludGYocE91dEJ1ZiwgIiVzXG5cbiIsIHBPdXRCdWYpOwotCQl9Ci0gICAgICAgIGlmIChzdHJsZW4ocE91dEJ1ZikgPiAoSVdfUFJJVl9TSVpFX01BU0sgLSAzMCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotCi0JcmV0dXJuOwotfQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi1zdGF0aWMgaW50Ci1ydF9wcml2YXRlX3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJc3RydWN0IGl3X3BvaW50ICp3cnEsIFBTVFJJTkcgZXh0cmEpCi17Ci0JSU5UCQkJCVN0YXR1cyA9IDA7Ci0JUFJUTVBfQURBUFRFUiAgIHBBZDsKLQlQT1NfQ09PS0lFCQlwT2JqOwotCXUzMiAgICAgICAgICAgICBzdWJjbWQgPSB3cnEtPmZsYWdzOwotCi0JcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlpZiAocEFkID09IE5VTEwpCi0JewotCQkvKiBpZiAxc3Qgb3BlbiBmYWlsLCBwQWQgd2lsbCBiZSBmcmVlOwotCQkgICBTbyB0aGUgbmV0X2Rldi0+cHJpdiB3aWxsIGJlIE5VTEwgaW4gMnJkIG9wZW4gKi8KLQkJcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLQlwT2JqID0gKFBPU19DT09LSUUpIHBBZC0+T1NfQ29va2llOwotCWlmIChleHRyYSA9PSBOVUxMKQotCXsKLQkJd3JxLT5sZW5ndGggPSAwOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JbWVtc2V0KGV4dHJhLCAweDAwLCBJV19QUklWX1NJWkVfTUFTSyk7Ci0KLQl7Ci0JCXBPYmotPmlvY3RsX2lmX3R5cGUgPSBJTlRfTUFJTjsKLQkJcE9iai0+aW9jdGxfaWYgPSBNQUlOX01CU1NJRDsKLQl9Ci0KLSAgICBzd2l0Y2goc3ViY21kKQotICAgIHsKLQotICAgICAgICBjYXNlIFNIT1dfQ09OTl9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAoTU9OSVRPUl9PTihwQWQpKQotICAgICAgICAgICAgewotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkJXKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiTW9uaXRvciBNb2RlKENlbnRyYWxDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIk1vbml0b3IgTW9kZShDaGFubmVsICVkKVxuIiwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID09IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkKQotCQl7Ci0JCSAgICBpZiAoSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkKEFQOiAlc1slMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWF0pXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuU3NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuQnNzaWRbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Cc3NpZFs1XSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCJTc2lkPSVzICxTc2lkbGVuID0gJWRcbiIscEFkLT5Db21tb25DZmcuU3NpZCwgcEFkLT5Db21tb25DZmcuU3NpZExlbikpOwotCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFESE9DX09OKHBBZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGV4dHJhLCAiQ29ubmVjdGVkXG4iKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIHNwcmludGYoZXh0cmEsICJEaXNjb25uZWN0ZWRcbiIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiQ29ublN0YXR1cyBpcyBub3QgY29ubmVjdGVkXG4iKSk7Ci0JCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0hPV19EUlZJRVJfVkVSSU9OOgotICAgICAgICAgICAgc3ByaW50ZihleHRyYSwgIkRyaXZlciB2ZXJzaW9uLSVzLCAlcyAlc1xuIiwgU1RBX0RSSVZFUl9WRVJTSU9OLCBfX0RBVEVfXywgX19USU1FX18gKTsKLSAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgICAgIGNhc2UgU0hPV19CQV9JTkZPOgotICAgICAgICAgICAgZ2V0QmFJbmZvKHBBZCwgZXh0cmEpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJY2FzZSBTSE9XX0RFU0NfSU5GTzoKLQkJCXsKLQkJCQlTaG93X0Rlc2NJbmZvX1Byb2MocEFkLCBOVUxMKTsKLQkJCQl3cnEtPmxlbmd0aCA9IDA7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJfQotCQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFJT19PRkY6Ci0gICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgICBSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpOwotCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7Ci0JCSAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gIT0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iUmFkaW8gPSAocEFkLT5TdGFDZmcuYkh3UmFkaW8gJiYgcEFkLT5TdGFDZmcuYlN3UmFkaW8pOwotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iUmFkaW8gPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4dHJhIGluZm9ybWF0aW9uCi0JCQkJCXBBZC0+RXh0cmFJbmZvID0gU1dfUkFESU9fT0ZGOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPZmZcbiIpOwotICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSQUlPX09OOgotICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBUUlVFOwotICAgICAgICAgICAgLy9pZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlJhZGlvID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvICYmIHBBZC0+U3RhQ2ZnLmJTd1JhZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PbihwQWQpOwotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJcEFkLT5FeHRyYUluZm8gPSBFWFRSQV9JTkZPX0NMRUFSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwcmludGYoZXh0cmEsICJSYWRpbyBPblxuIik7Ci0gICAgICAgICAgICB3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOyAvLyAxOiBzaXplIG9mICdcMCcKLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSNpZmRlZiBRT1NfRExTX1NVUFBPUlQKLQkJY2FzZSBTSE9XX0RMU19FTlRSWV9JTkZPOgotCQkJewotCQkJCVNldF9EbHNFbnRyeUluZm9fRGlzcGxheV9Qcm9jKHBBZCwgTlVMTCk7Ci0JCQkJd3JxLT5sZW5ndGggPSAwOyAvLyAxOiBzaXplIG9mICdcMCcKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIFFPU19ETFNfU1VQUE9SVCAvLwotCi0JCWNhc2UgU0hPV19DRkdfVkFMVUU6Ci0JCQl7Ci0JCQkJU3RhdHVzID0gUlRNUFNob3dDZmdWYWx1ZShwQWQsIChQU1RSSU5HKSB3cnEtPnBvaW50ZXIsIGV4dHJhKTsKLQkJCQlpZiAoU3RhdHVzID09IDApCi0JCQkJCXdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU0hPV19BREhPQ19FTlRSWV9JTkZPOgotCQkJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKHBBZCwgZXh0cmEpOwotCQkJd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQlicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzIC0gdW5rbm93IHN1YmNtZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN1YmNtZCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLQotI2lmZGVmIFNJT0NTSVdNTE1FCi1pbnQgcnRfaW9jdGxfc2l3bWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCi0JCQkgICBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfbWxtZSAqcE1sbWUgPSAoc3RydWN0IGl3X21sbWUgKil3cnF1LT5kYXRhLnBvaW50ZXI7Ci0JTUxNRV9RVUVVRV9FTEVNCQkJCU1zZ0VsZW07Ci0JTUxNRV9ESVNBU1NPQ19SRVFfU1RSVUNUCURpc0Fzc29jUmVxOwotCU1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICBEZUF1dGhSZXE7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT09PiAlc1xuIiwgX19GVU5DVElPTl9fKSk7Ci0KLQlpZiAocE1sbWUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2gocE1sbWUtPmNtZCkKLQl7Ci0jaWZkZWYgSVdfTUxNRV9ERUFVVEgKLQkJY2FzZSBJV19NTE1FX0RFQVVUSDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ERUFVVEhcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJQ09QWV9NQUNfQUREUihEZUF1dGhSZXEuQWRkciwgcEFkLT5Db21tb25DZmcuQnNzaWQpOwotCQkJRGVBdXRoUmVxLlJlYXNvbiA9IHBNbG1lLT5yZWFzb25fY29kZTsKLQkJCU1zZ0VsZW0uTXNnTGVuID0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEZUF1dGhSZXEsIHNpemVvZihNTE1FX0RFQVVUSF9SRVFfU1RSVUNUKSk7Ci0JCQlNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgJk1zZ0VsZW0pOwotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQl7Ci0JCQkgICAgTGlua0Rvd24ocEFkLCBGQUxTRSk7Ci0JCQkgICAgcEFkLT5NbG1lLkFzc29jTWFjaGluZS5DdXJyU3RhdGUgPSBBU1NPQ19JRExFOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gSVdfTUxNRV9ERUFVVEggLy8KLSNpZmRlZiBJV19NTE1FX0RJU0FTU09DCi0JCWNhc2UgSVdfTUxNRV9ESVNBU1NPQzoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gSVdfTUxNRV9ESVNBU1NPQ1xuIiwgX19GVU5DVElPTl9fKSk7Ci0JCQlDT1BZX01BQ19BRERSKERpc0Fzc29jUmVxLkFkZHIsIHBBZC0+Q29tbW9uQ2ZnLkJzc2lkKTsKLQkJCURpc0Fzc29jUmVxLlJlYXNvbiA9ICBwTWxtZS0+cmVhc29uX2NvZGU7Ci0KLQkJCU1zZ0VsZW0uTWFjaGluZSA9IEFTU09DX1NUQVRFX01BQ0hJTkU7Ci0JCQlNc2dFbGVtLk1zZ1R5cGUgPSBNVDJfTUxNRV9ESVNBU1NPQ19SRVE7Ci0JCQlNc2dFbGVtLk1zZ0xlbiA9IHNpemVvZihNTE1FX0RJU0FTU09DX1JFUV9TVFJVQ1QpOwotCQkJTmRpc01vdmVNZW1vcnkoTXNnRWxlbS5Nc2csICZEaXNBc3NvY1JlcSwgc2l6ZW9mKE1MTUVfRElTQVNTT0NfUkVRX1NUUlVDVCkpOwotCi0JCQlwQWQtPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlID0gQ05UTF9XQUlUX09JRF9ESVNBU1NPQzsKLQkJCU1sbWVEaXNhc3NvY1JlcUFjdGlvbihwQWQsICZNc2dFbGVtKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIElXX01MTUVfRElTQVNTT0MgLy8KLQkJZGVmYXVsdDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PT0+ICVzIC0gVW5rbm93IENvbW1hbmRcbiIsIF9fRlVOQ1RJT05fXykpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLy8gU0lPQ1NJV01MTUUgLy8KLQotI2lmIFdJUkVMRVNTX0VYVCA+IDE3Ci1pbnQgcnRfaW9jdGxfc2l3YXV0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQlzd2l0Y2ggKHBhcmFtLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLQljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046Ci0gICAgICAgICAgICBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0JCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MpCi0JCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBMikKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVA0MCB8fAotICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1dFUDEwNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxWCA9IEZBTFNFOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9US0lQKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLk9yaWdXZXBTdGF0dXMgPSBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1czsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBhaXJDaXBoZXIgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX0NDTVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9DSVBIRVJfUEFJUldJU0UgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgotICAgICAgICAgICAgaWYgKHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9OT05FKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfV0VQNDAgfHwKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52YWx1ZSA9PSBJV19BVVRIX0NJUEhFUl9XRVAxMDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0tPnZhbHVlID09IElXX0FVVEhfQ0lQSEVSX1RLSVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9DSVBIRVJfQ0NNUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIX0NJUEhFUl9HUk9VUCAtIHBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgPT0gSVdfQVVUSF9LRVlfTUdNVF84MDJfMVgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMjsKLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjFYID0gRkFMU0U7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAvLyBXRVAgMXgKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMVggPSBUUlVFOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLT52YWx1ZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfS0VZX01HTVQgLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIElXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0w6Ci0gICAgICAgICAgICBicmVhazsKLQljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgotICAgICAgICAgICAgLyppZiAocGFyYW0tPnZhbHVlID09IDApCi0JCQl7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotCQlicmVhazsKLQljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKLSAgICAgICAgICAgIGlmIChwYXJhbS0+dmFsdWUgIT0gMCkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX05PVF9TRUNVUkVEOwotCQkJZWxzZQotCQkJewotICAgICAgICAgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkJfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OklXX0FVVEhfV1BBX1ZFUlNJT04gLSBwYXJhbS0+dmFsdWUgPSAlZCFcbiIsIF9fRlVOQ1RJT05fXywgcGFyYW0tPnZhbHVlKSk7Ci0JCWJyZWFrOwotCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLQkJCWlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKQotICAgICAgICAgICAgewotCQkJCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJhbS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKLSAgICAgICAgICAgIHsKLQkJCQlwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkJCX0KLSAgICAgICAgICAgIGVsc2UKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19BVVRIXzgwMjExX0FVVEhfQUxHIC0gcGFyYW0tPnZhbHVlID0gJWQhXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmFtLT52YWx1ZSkpOwotCQkJYnJlYWs7Ci0JY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfQVVUSF9XUEFfRU5BQkxFRCAtIERyaXZlciBzdXBwb3J0cyBXUEEhKHBhcmFtLT52YWx1ZSA9ICVkKVxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dmFsdWUpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXdhdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCXN0cnVjdCBpd19wYXJhbSAqcGFyYW0gPSAmd3JxdS0+cGFyYW07Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotCWlmKCFSVE1QX1RFU1RfRkxBRyhwQWRhcHRlciwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLSAgICB7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotICAgIH0KLQotCXN3aXRjaCAocGFyYW0tPmZsYWdzICYgSVdfQVVUSF9JTkRFWCkgewotCWNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgotICAgICAgICBwYXJhbS0+dmFsdWUgPSAocEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgPT0gTmRpczgwMl8xMVdFUERpc2FibGVkKSA/IDAgOiAxOwotCQlicmVhazsKLQotCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKLSAgICAgICAgcGFyYW0tPnZhbHVlID0gKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlU2hhcmVkKSA/IElXX0FVVEhfQUxHX1NIQVJFRF9LRVkgOiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6Ci0JCXBhcmFtLT52YWx1ZSA9IChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgPyAxIDogMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX2dpd2F1dGg6OnBhcmFtLT52YWx1ZSA9ICVkIVxuIiwgcGFyYW0tPnZhbHVlKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZm5TZXRDaXBoZXJLZXkoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgSU5UICAgICAgICAgICAgIGtleUlkeCwKLSAgICBJTiAgVUNIQVIgICAgICAgICAgIENpcGhlckFsZywKLSAgICBJTiAgQk9PTEVBTiAgICAgICAgIGJHVEssCi0gICAgSU4gIHN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQpCi17Ci0gICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTEVOX1RLSVBfRUs7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgZXh0LT5rZXksIExFTl9US0lQX0VLKTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsIGV4dC0+a2V5ICsgTEVOX1RLSVBfRUssIExFTl9US0lQX1RYTUlDSyk7Ci0gICAgTmRpc01vdmVNZW1vcnkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLlJ4TWljLCBleHQtPmtleSArIExFTl9US0lQX0VLICsgTEVOX1RLSVBfVFhNSUNLLCBMRU5fVEtJUF9SWE1JQ0spOwotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBVcGRhdGUgZ3JvdXAga2V5IGluZm9ybWF0aW9uIHRvIEFTSUMgU2hhcmVkIEtleSBUYWJsZQotCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLQkJCQkJCSAgQlNTMCwKLQkJCQkJCSAga2V5SWR4LAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LAotCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uVHhNaWMsCi0JCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5SeE1pYyk7Ci0KLSAgICBpZiAoYkdUSykKLSAgICAgICAgLy8gVXBkYXRlIEFTSUMgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlCi0JUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWRhcHRlciwKLQkJCQkJCQkgIEJTUzAsCi0JCQkJCQkJICBrZXlJZHgsCi0JCQkJCQkJICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uQ2lwaGVyQWxnLAotCQkJCQkJCSAgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBVcGRhdGUgQVNJQyBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUKLQlSVE1QQWRkV2NpZEF0dHJpYnV0ZUVudHJ5KHBBZGFwdGVyLAotCQkJCQkJCSAgQlNTMCwKLQkJCQkJCQkgIGtleUlkeCwKLQkJCQkJCQkgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcsCi0JCQkJCQkJICAmcEFkYXB0ZXItPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdKTsKLX0KLQotaW50IHJ0X2lvY3RsX3Npd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCi0JCQkgICBjaGFyICpleHRyYSkKLQkJCXsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIgPSBSVE1QX09TX05FVERFVl9HRVRfUFJJVihkZXYpOwotCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7Ci0Jc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotICAgIGludCBrZXlJZHgsIGFsZyA9IGV4dC0+YWxnOwotCi0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkYXB0ZXIsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JcmV0dXJuIC1FTkVURE9XTjsKLQl9Ci0KLSAgICBpZiAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQotCXsKLSAgICAgICAga2V5SWR4ID0gKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOwotICAgICAgICAvLyBzZXQgQlNTSUQgd2NpZCBlbnRyeSBvZiB0aGUgUGFpci13aXNlIEtleSB0YWJsZSBhcyBuby1zZWN1cml0eSBtb2RlCi0JICAgIEFzaWNSZW1vdmVQYWlyd2lzZUtleUVudHJ5KHBBZGFwdGVyLCBCU1MwLCBCU1NJRF9XQ0lEKTsKLSAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleUxlbiA9IDA7Ci0JCXBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLCAwLCAoVUNIQVIpa2V5SWR4KTsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XSwgc2l6ZW9mKENJUEhFUl9LRVkpKTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OlJlbW92ZSBhbGwga2V5cyEoZW5jb2RpbmctPmZsYWdzID0gJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGVuY29kaW5nLT5mbGFncykpOwotICAgIH0KLQkJCQkJZWxzZQotICAgIHsKLSAgICAgICAgLy8gR2V0IEtleSBJbmRleCBhbmQgY29udmV0IHRvIG91ciBvd24gZGVmaW5lZCBrZXkgaW5kZXgKLQlrZXlJZHggPSAoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JaWYoKGtleUlkeCA8IDApIHx8IChrZXlJZHggPj0gTlJfV0VQX0tFWVMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkID0ga2V5SWR4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiJXM6OkRlZmF1bHRLZXlJZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBBZGFwdGVyLT5TdGFDZmcuRGVmYXVsdEtleUlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKGFsZykgewotCQljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19OT05FXG4iLCBfX0ZVTkNUSU9OX18pKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiVzOjpJV19FTkNPREVfQUxHX1dFUCAtIGV4dC0+a2V5X2xlbiA9ICVkLCBrZXlJZHggPSAlZFxuIiwgX19GVU5DVElPTl9fLCBleHQtPmtleV9sZW4sIGtleUlkeCkpOwotCQkJaWYgKGV4dC0+a2V5X2xlbiA9PSBNQVhfV0VQX0tFWV9TSVpFKQotICAgICAgICAgICAgICAgIHsKLQkJCQlwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUFYX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0JCQkJfQotCQkJZWxzZSBpZiAoZXh0LT5rZXlfbGVuID09IE1JTl9XRVBfS0VZX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5TGVuID0gTUlOX1dFUF9LRVlfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLQkJCX0KLQkJCWVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdW2tleUlkeF0uS2V5LCAgMTYpOwotCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1ba2V5SWR4XS5LZXksIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOwotCi0JCQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQNDBFbmFibGVkIHx8Ci0JCQkJCXBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgPT0gTmRpczgwMl8xMUdyb3VwV0VQMTA0RW5hYmxlZCkKLQkJCQl7Ci0JCQkJCS8vIFNldCBHcm91cCBrZXkgbWF0ZXJpYWwgdG8gQXNpYwotCQkJCQlBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLktleSwgTlVMTCwgTlVMTCk7Ci0JCQkJCS8vIFVwZGF0ZSBXQ0lEIGF0dHJpYnV0ZSB0YWJsZSBhbmQgSVZFSVYgdGFibGUgZm9yIHRoaXMgZ3JvdXAga2V5IHRhYmxlCi0JCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkYXB0ZXIsIEJTUzAsIGtleUlkeCwgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVtrZXlJZHhdLkNpcGhlckFsZywgTlVMTCk7Ci0JCQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkJCQkvLyBJbmRpY2F0ZSBDb25uZWN0ZWQgZm9yIEdVSQotCQkJCQlwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJfQotCQkJYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczo6SVdfRU5DT0RFX0FMR19US0lQIC0ga2V5SWR4ID0gJWQsIGV4dC0+a2V5X2xlbiA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGtleUlkeCwgZXh0LT5rZXlfbGVuKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dC0+a2V5X2xlbiA9PSAzMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIEZBTFNFLCBleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFfUE9SVF9TRUNVUkVEKHBBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX1RLSVAsIFRSVUUsIGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCA4MDIuMXggcG9ydCBjb250cm9sCi0JCSAgICAgICAgLy9wQWRhcHRlci0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCSAgICAgICAgU1RBX1BPUlRfU0VDVVJFRChwQWRhcHRlcik7Ci0JCSAgICAgICAgcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKLSAgICAgICAgICAgICAgICBpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpCi0JCXsKLSAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgRkFMU0UsIGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpCi0JCQkvL3BBZGFwdGVyLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRDsKLQkJCVNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkJcEFkYXB0ZXItPkluZGljYXRlTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm5TZXRDaXBoZXJLZXkocEFkYXB0ZXIsIGtleUlkeCwgQ0lQSEVSX0FFUywgVFJVRSwgZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgODAyLjF4IHBvcnQgY29udHJvbAotCQkgICAgICAgIC8vcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEOwotCQkgICAgICAgIFNUQV9QT1JUX1NFQ1VSRUQocEFkYXB0ZXIpOwotCQkgICAgICAgIHBBZGFwdGVyLT5JbmRpY2F0ZU1lZGlhU3RhdGUgPSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1pbnQKLXJ0X2lvY3RsX2dpd2VuY29kZWV4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSIHBBZCA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0JUENIQVIgcEtleSA9IE5VTEw7Ci0Jc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKLQlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7Ci0JaW50IGlkeCwgbWF4X2tleV9sZW47Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSAsKCI9PT0+IHJ0X2lvY3RsX2dpd2VuY29kZWV4dFxuIikpOwotCi0JbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOwotCWlmIChtYXhfa2V5X2xlbiA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCWlmIChpZHgpCi0JewotCQlpZiAoaWR4IDwgMSB8fCBpZHggPiA0KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlkeC0tOwotCi0JCWlmICgocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkocEFkLT5TdGFDZmcuV2VwU3RhdHVzID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKQotCQl7Ci0JCQlpZiAoaWR4ICE9IHBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCkKLQkJCXsKLQkJCQlleHQtPmtleV9sZW4gPSAwOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQkJaWR4ID0gcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkOwotCi0JZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKLQltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOwotCi0JZXh0LT5rZXlfbGVuID0gMDsKLQlzd2l0Y2gocEFkLT5TdGFDZmcuV2VwU3RhdHVzKSB7Ci0JCWNhc2UgTmRpczgwMl8xMVdFUERpc2FibGVkOgotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7Ci0JCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgTmRpczgwMl8xMVdFUEVuYWJsZWQ6Ci0JCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOwotCQkJaWYgKHBBZC0+U2hhcmVkS2V5W0JTUzBdW2lkeF0uS2V5TGVuID4gbWF4X2tleV9sZW4pCi0JCQkJcmV0dXJuIC1FMkJJRzsKLQkJCWVsc2UKLQkJCXsKLQkJCQlleHQtPmtleV9sZW4gPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtpZHhdLktleUxlbjsKLQkJCQlwS2V5ID0gKFBDSEFSKSYocEFkLT5TaGFyZWRLZXlbQlNTMF1baWR4XS5LZXlbMF0pOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDoKLQkJY2FzZSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOgotCQkJaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyA9PSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKQotCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOwotCQkJZWxzZQotCQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOwotCi0JCQlpZiAobWF4X2tleV9sZW4gPCAzMikKLQkJCQlyZXR1cm4gLUUyQklHOwotCQkJZWxzZQotCQkJewotCQkJCWV4dC0+a2V5X2xlbiA9IDMyOwotCQkJCXBLZXkgPSAoUENIQVIpJnBBZC0+U3RhQ2ZnLlBNS1swXTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGV4dC0+a2V5X2xlbiAmJiBwS2V5KQotCXsKLQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwotCQltZW1jcHkoZXh0LT5rZXksIHBLZXksIGV4dC0+a2V5X2xlbik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBTSU9DU0lXR0VOSUUKLWludCBydF9pb2N0bF9zaXdnZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoIj09PT4gcnRfaW9jdGxfc2l3Z2VuaWVcbiIpKTsKLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCXBBZC0+U3RhQ2ZnLmJSU05fSUVfRnJvbVdwYVN1cHBsaWNhbnQgPSBGQUxTRTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IE1BWF9MRU5fT0ZfUlNOSUUgfHwKLQkgICAgKHdycXUtPmRhdGEubGVuZ3RoICYmIGV4dHJhID09IE5VTEwpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCkKLQl7Ci0JCXBBZC0+U3RhQ2ZnLlJTTklFX0xlbiA9IHdycXUtPmRhdGEubGVuZ3RoOwotCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBleHRyYSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLSNpZmRlZiBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCQlwQWQtPlN0YUNmZy5iUlNOX0lFX0Zyb21XcGFTdXBwbGljYW50ID0gVFJVRTsKLSNlbmRpZiAvLyBOQVRJVkVfV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCX0KLQllbHNlCi0JewotCQlwQWQtPlN0YUNmZy5SU05JRV9MZW4gPSAwOwotCQlOZGlzWmVyb01lbW9yeSgmcEFkLT5TdGFDZmcuUlNOX0lFWzBdLCBNQVhfTEVOX09GX1JTTklFKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyBTSU9DU0lXR0VOSUUgLy8KLQotaW50IHJ0X2lvY3RsX2dpd2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQotCWlmICgocEFkLT5TdGFDZmcuUlNOSUVfTGVuID09IDApIHx8Ci0JCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkpCi0JewotCQl3cnF1LT5kYXRhLmxlbmd0aCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotI2lmZGVmIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUCi0jaWZkZWYgU0lPQ1NJV0dFTklFCi0JaWYgKHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCA9PSBXUEFfU1VQUExJQ0FOVF9FTkFCTEUpCi0JewotCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA8IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbikKLQkJcmV0dXJuIC1FMkJJRzsKLQotCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuOwotCW1lbWNweShleHRyYSwgJnBBZC0+U3RhQ2ZnLlJTTl9JRVswXSwgcEFkLT5TdGFDZmcuUlNOSUVfTGVuKTsKLQl9Ci0JZWxzZQotI2VuZGlmIC8vIFNJT0NTSVdHRU5JRSAvLwotI2VuZGlmIC8vIE5BVElWRV9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0JewotCQlVQ0hBUiBSU05JZSA9IElFX1dQQTsKLQotCQlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPCAocEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMikpIC8vIElELCBMZW4KLQkJCXJldHVybiAtRTJCSUc7Ci0JCXdycXUtPmRhdGEubGVuZ3RoID0gcEFkLT5TdGFDZmcuUlNOSUVfTGVuICsgMjsKLQotCQlpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spIHx8Ci0gICAgICAgICAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMikpCi0JCQlSU05JZSA9IElFX1JTTjsKLQotCQlleHRyYVswXSA9IChjaGFyKVJTTkllOwotCQlleHRyYVsxXSA9IHBBZC0+U3RhQ2ZnLlJTTklFX0xlbjsKLQkJbWVtY3B5KGV4dHJhKzIsICZwQWQtPlN0YUNmZy5SU05fSUVbMF0sIHBBZC0+U3RhQ2ZnLlJTTklFX0xlbik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9zaXdwbWtzYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCi0JCQkgICBjaGFyICpleHRyYSkKLXsKLQlQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLQlzdHJ1Y3QgaXdfcG1rc2EgKnBQbWtzYSA9IChzdHJ1Y3QgaXdfcG1rc2EgKil3cnF1LT5kYXRhLnBvaW50ZXI7Ci0JSU5UCUNhY2hlZElkeCA9IDAsIGlkeCA9IDA7Ci0KLQlpZiAocFBta3NhID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgiPT09PiBydF9pb2N0bF9zaXdwbWtzYVxuIikpOwotCXN3aXRjaChwUG1rc2EtPmNtZCkKLQl7Ci0JCWNhc2UgSVdfUE1LU0FfRkxVU0g6Ci0JCQlOZGlzWmVyb01lbW9yeShwQWQtPlN0YUNmZy5TYXZlZFBNSywgc2l6ZW9mKEJTU0lEX0lORk8pKlBNS0lEX05PKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFICwoInJ0X2lvY3RsX3Npd3Bta3NhIC0gSVdfUE1LU0FfRkxVU0hcbiIpKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX1BNS1NBX1JFTU9WRToKLQkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQotCQkJewotCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECi0JCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCi0JCSAgICAgICAgewotCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTik7Ci0JCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSUQsIDE2KTsKLQkJCQkJZm9yIChpZHggPSBDYWNoZWRJZHg7IGlkeCA8IChwQWQtPlN0YUNmZy5TYXZlZFBNS051bSAtIDEpOyBpZHgrKykKLQkJCQkJewotCQkJCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeF0uQlNTSURbMF0sICZwQWQtPlN0YUNmZy5TYXZlZFBNS1tpZHgrMV0uQlNTSURbMF0sIE1BQ19BRERSX0xFTik7Ci0JCQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbaWR4XS5QTUtJRFswXSwgJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW2lkeCsxXS5QTUtJRFswXSwgMTYpOwotCQkJCQl9Ci0JCQkJCXBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtLS07Ci0JCQkgICAgICAgIGJyZWFrOwotCQkgICAgICAgIH0KLQkgICAgICAgIH0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9SRU1PVkVcbiIpKTsKLQkJCWJyZWFrOwotCQljYXNlIElXX1BNS1NBX0FERDoKLQkJCWZvciAoQ2FjaGVkSWR4ID0gMDsgQ2FjaGVkSWR4IDwgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW07IENhY2hlZElkeCsrKQotCQkJewotCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECi0JCSAgICAgICAgaWYgKE5kaXNFcXVhbE1lbW9yeShwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uQlNTSUQsIE1BQ19BRERSX0xFTikpCi0JCQkgICAgICAgIGJyZWFrOwotCSAgICAgICAgfQotCi0JICAgICAgICAvLyBGb3VuZCwgcmVwbGFjZSBpdAotCSAgICAgICAgaWYgKENhY2hlZElkeCA8IFBNS0lEX05PKQotCSAgICAgICAgewotCQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX09GRiwgKCJVcGRhdGUgUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKLQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XS5CU1NJRFswXSwgcFBta3NhLT5ic3NpZC5zYV9kYXRhLCBNQUNfQUREUl9MRU4pOwotCQkJCU5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLlBNS0lEWzBdLCBwUG1rc2EtPnBta2lkLCAxNik7Ci0JCSAgICAgICAgcEFkLT5TdGFDZmcuU2F2ZWRQTUtOdW0rKzsKLQkgICAgICAgIH0KLQkgICAgICAgIC8vIE5vdCBmb3VuZCwgcmVwbGFjZSB0aGUgbGFzdCBvbmUKLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkJICAgICAgICAvLyBSYW5kb21seSByZXBsYWNlIG9uZQotCQkgICAgICAgIENhY2hlZElkeCA9IChwUG1rc2EtPmJzc2lkLnNhX2RhdGFbNV0gJSBQTUtJRF9OTyk7Ci0JCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBQTUtJRCwgaWR4ID0gJWRcbiIsIENhY2hlZElkeCkpOwotCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lEWzBdLCBwUG1rc2EtPmJzc2lkLnNhX2RhdGEsIE1BQ19BRERSX0xFTik7Ci0JCQkJTmRpc01vdmVNZW1vcnkoJnBBZC0+U3RhQ2ZnLlNhdmVkUE1LW0NhY2hlZElkeF0uUE1LSURbMF0sIHBQbWtzYS0+cG1raWQsIDE2KTsKLQkgICAgICAgIH0KLQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBJV19QTUtTQV9BRERcbiIpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UgLCgicnRfaW9jdGxfc2l3cG1rc2EgLSBVbmtub3cgQ29tbWFuZCEhXG4iKSk7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvLyAjaWYgV0lSRUxFU1NfRVhUID4gMTcKLQotI2lmZGVmIERCRwotc3RhdGljIGludAotcnRfcHJpdmF0ZV9pb2N0bF9iYnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJc3RydWN0IGl3X3BvaW50ICp3cnEsIGNoYXIgKmV4dHJhKQotCQkJewotCVBTVFJJTkcJCQkJdGhpc19jaGFyOwotCVBTVFJJTkcJCQkJdmFsdWUgPSBOVUxMOwotCVVDSEFSCQkJCXJlZ0JCUCA9IDA7Ci0vLwlDSEFSCQkJCWFyZ1syNTVdPXswfTsKLQlVSU5UMzIJCQkJYmJwSWQ7Ci0JVUlOVDMyCQkJCWJicFZhbHVlOwotCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxCQlAgPSBGQUxTRTsKLQlJTlQJCQkJCVN0YXR1cyA9IDA7Ci0gICAgUFJUTVBfQURBUFRFUiAgICAgICBwQWRhcHRlciA9IFJUTVBfT1NfTkVUREVWX0dFVF9QUklWKGRldik7Ci0KLQotCW1lbXNldChleHRyYSwgMHgwMCwgSVdfUFJJVl9TSVpFX01BU0spOwotCi0JaWYgKHdycS0+bGVuZ3RoID4gMSkgLy9ObyBwYXJhbWV0ZXJzLgotCQkJCXsKLQkJc3ByaW50ZihleHRyYSwgIlxuIik7Ci0KLQkJLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKLQkJdGhpc19jaGFyID0gd3JxLT5wb2ludGVyOwotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXNcbiIsIHRoaXNfY2hhcikpOwotCQlpZiAoISp0aGlzX2NoYXIpCi0JCQlnb3RvIG5leHQ7Ci0KLQkJaWYgKCh2YWx1ZSA9IHJ0c3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKLQkJCSp2YWx1ZSsrID0gMDsKLQotCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCi0JCXsgLy9SZWFkCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJ0aGlzX2NoYXI9JXMsIHZhbHVlPSVzXG4iLCB0aGlzX2NoYXIsIHZhbHVlKSk7Ci0JCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpCi0JCQl7Ci0JCQkJaWYgKGJicElkIDw9IE1BWF9CQlBfSUQpCi0JCQkJewotI2lmZGVmIFJBTElOS19BVEUKLQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQkJCXsKLQkJCQkJCUFURV9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQkJCQkJewotCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCQkJfQotCQkJCQlzcHJpbnRmKGV4dHJhK3N0cmxlbihleHRyYSksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIGJicElkLCBiYnBJZCwgcmVnQkJQKTsKLSAgICAgICAgICAgICAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIm1zZz0lc1xuIiwgZXh0cmEpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCi0JCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKLQkJCQkJZ290byBuZXh0OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsgLy9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAotCQkJCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKLQkJCQlnb3RvIG5leHQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7IC8vV3JpdGUKLQkJCWlmICgoc3NjYW5mKHRoaXNfY2hhciwgIiVkIiwgJihiYnBJZCkpID09IDEpICYmIChzc2NhbmYodmFsdWUsICIleCIsICYoYmJwVmFsdWUpKSA9PSAxKSkKLQkJCXsKLQkJCQlpZiAoYmJwSWQgPD0gTUFYX0JCUF9JRCkKLQkJCQl7Ci0jaWZkZWYgUkFMSU5LX0FURQotCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQkJCQkJewotCQkJCQkJQVRFX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgYmJwVmFsdWUpOwotCQkJCQkJLyogcmVhZCBpdCBiYWNrIGZvciBzaG93aW5nICovCi0JCQkJCQlBVEVfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgYmJwSWQsICZyZWdCQlApOwotCQkJCQl9Ci0JCQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQkJCXsKLQkJCQkJICAgIFJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCBiYnBWYWx1ZSk7Ci0JCQkJCS8qIHJlYWQgaXQgYmFjayBmb3Igc2hvd2luZyAqLwotCQkJCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCX0KLQkJCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiUiUwMmRbMHglMDJYXTolMDJYXG4iLCBiYnBJZCwgYmJwSWQsIHJlZ0JCUCk7Ci0gICAgICAgICAgICAgICAgICAgIHdycS0+bGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7IC8vIDE6IHNpemUgb2YgJ1wwJwotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJtc2c9JXNcbiIsIGV4dHJhKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIGJicAotCQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0JCQkJCWdvdG8gbmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBiYnAKLQkJCQliSXNQcmludEFsbEJCUCA9IFRSVUU7Ci0JCQkJZ290byBuZXh0OwotCQkJfQotCQl9Ci0JCX0KLQllbHNlCi0JCWJJc1ByaW50QWxsQkJQID0gVFJVRTsKLQotbmV4dDoKLQlpZiAoYklzUHJpbnRBbGxCQlApCi0JewotCQltZW1zZXQoZXh0cmEsIDB4MDAsIElXX1BSSVZfU0laRV9NQVNLKTsKLQkJc3ByaW50ZihleHRyYSwgIlxuIik7Ci0JCWZvciAoYmJwSWQgPSAwOyBiYnBJZCA8PSBNQVhfQkJQX0lEOyBiYnBJZCsrKQotCQl7Ci0JCSAgICBpZiAoc3RybGVuKGV4dHJhKSA+PSAoSVdfUFJJVl9TSVpFX01BU0sgLSAyMCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgUkFMSU5LX0FURQotCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQl7Ci0JCQkJQVRFX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCX0KLQkJCWVsc2UKLSNlbmRpZiAvLyBSQUxJTktfQVRFIC8vCi0JCQlSVE1QX0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCXNwcmludGYoZXh0cmErc3RybGVuKGV4dHJhKSwgIlIlMDJkWzB4JTAyWF06JTAyWCAgICAiLCBiYnBJZCwgYmJwSWQsIHJlZ0JCUCk7Ci0JCQlpZiAoYmJwSWQlNSA9PSA0KQotCQkJc3ByaW50ZihleHRyYStzdHJsZW4oZXh0cmEpLCAiJTAzZCA9ICUwMlhcbiIsIGJicElkLCByZWdCQlApOyAgLy8gZWRpdCBieSBqb2hubGksIGNoYW5nZSBkaXNwbGF5IGZvcm1hdAotCQl9Ci0KLSAgICAgICAgd3JxLT5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsgLy8gMTogc2l6ZSBvZiAnXDAnCi0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIndycS0+bGVuZ3RoID0gJWRcbiIsIHdycS0+bGVuZ3RoKSk7Ci0JfQotCi0JREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09cnRfcHJpdmF0ZV9pb2N0bF9iYnBcblxuIikpOwotCi0gICAgcmV0dXJuIFN0YXR1czsKLX0KLSNlbmRpZiAvLyBEQkcgLy8KLQotaW50IHJ0X2lvY3RsX3Npd3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLSAgICBVSU5UMzIgICAgICAgICAgcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWUsIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKLQotICAgIC8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYoIVJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKLQl7Ci0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQlyZXR1cm4gLUVORVRET1dOOwotCX0KLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInJ0X2lvY3RsX3Npd3JhdGU6OihyYXRlID0gJWQsIGZpeGVkID0gJWQpXG4iLCByYXRlLCBmaXhlZCkpOwotICAgIC8qIHJhdGUgPSAtMSA9PiBhdXRvIHJhdGUKLSAgICAgICByYXRlID0gWCwgZml4ZWQgPSAxID0+IChmaXhlZCByYXRlIFgpCi0gICAgKi8KLSAgICBpZiAocmF0ZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIC8vQXV0byBSYXRlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTID0gTUNTX0FVVE87Ci0JCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gVFJVRTsKLQkJaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlIDw9IFBIWV8xMUcpIHx8Ci0JCSAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQotICAgICAgICAgICAgUlRNUFNldERlc2lyZWRSYXRlcyhwQWQsIC0xKTsKLQotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgU2V0Q29tbW9uSFQocEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpeGVkKQotICAgICAgICB7Ci0JCXBBZC0+U3RhQ2ZnLmJBdXRvVHhSYXRlU3dpdGNoID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPD0gUEhZXzExRykgfHwKLSAgICAgICAgICAgICAgICAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKQotICAgICAgICAgICAgICAgIFJUTVBTZXREZXNpcmVkUmF0ZXMocEFkLCByYXRlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVkVHJhbnNtaXRTZXR0aW5nLmZpZWxkLk1DUyA9IE1DU19BVVRPOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotICAgICAgICAgICAgICAgIFNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJydF9pb2N0bF9zaXdyYXRlOjooSHRNY3M9JWQpXG4iLHBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiByYXRlID0gWCwgZml4ZWQgPSAwID0+IChyYXRlcyA8PSBYKQotICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBydF9pb2N0bF9naXdyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLSAgICBQUlRNUF9BREFQVEVSICAgcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYoZGV2KTsKLSAgICBpbnQgcmF0ZV9pbmRleCA9IDAsIHJhdGVfY291bnQgPSAwOwotICAgIEhUVFJBTlNNSVRfU0VUVElORyBodF9zZXR0aW5nOwotLyogUmVtb3ZlIHRvIGdsb2JhbCB2YXJpYWJsZQotICAgIF9fczMyIHJhbGlua3JhdGVbXSA9Ci0JezIsICA0LCAgIDExLCAgMjIsIC8vIENDSwotCTEyLCAxOCwgICAyNCwgIDM2LCA0OCwgNzIsIDk2LCAxMDgsIC8vIE9GRE0KLQkxMywgMjYsICAgMzksICA1MiwgIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgIDUyLCAgNzgsIDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLCAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JMzksIDc4LCAgMTE3LCAxNTYsIDIzNCwgMzEyLCAzNTEsIDM5MCwJCQkJCQkJCQkJICAvLyAyME1IeiwgODAwbnMgR0ksIE1DUzogMTYgfiAyMwotCTI3LCA1NCwgICA4MSwgMTA4LCAxNjIsIDIxNiwgMjQzLCAyNzAsIDU0LCAxMDgsIDE2MiwgMjE2LCAzMjQsIDQzMiwgNDg2LCA1NDAsIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAwIH4gMTUKLQk4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLAkJCQkJCQkJCQkgIC8vIDQwTUh6LCA4MDBucyBHSSwgTUNTOiAxNiB+IDIzCi0JMTQsIDI5LCAgIDQzLCAgNTcsICA4NywgMTE1LCAxMzAsIDE0NCwgMjksIDU5LCAgIDg3LCAxMTUsIDE3MywgMjMwLCAyNjAsIDI4OCwgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDAgfiAxNQotCTQzLCA4NywgIDEzMCwgMTczLCAyNjAsIDMxNywgMzkwLCA0MzMsCQkJCQkJCQkJCSAgLy8gMjBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLQkzMCwgNjAsICAgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwgNjAwLCAvLyA0ME1IeiwgNDAwbnMgR0ksIE1DUzogMCB+IDE1Ci0JOTAsIDE4MCwgMjcwLCAzNjAsIDU0MCwgNzIwLCA4MTAsIDkwMH07CQkJCQkJCQkJCSAgLy8gNDBNSHosIDQwMG5zIEdJLCBNQ1M6IDE2IH4gMjMKLSovCi0KLSAgICByYXRlX2NvdW50ID0gc2l6ZW9mKHJhbGlua3JhdGUpL3NpemVvZihfX3MzMik7Ci0gICAgLy9jaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGRvd24KLQlpZighUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0UpKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiSU5GTzo6TmV0d29yayBpcyBkb3duIVxuIikpOwotCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0gICAgaWYgKChwQWQtPlN0YUNmZy5iQXV0b1R4UmF0ZVN3aXRjaCA9PSBGQUxTRSkgJiYKLSAgICAgICAgKElORlJBX09OKHBBZCkpICYmCi0gICAgICAgICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA8PSBQSFlfMTFHKSB8fCAocEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERSA8PSBNT0RFX09GRE0pKSkKLSAgICAgICAgaHRfc2V0dGluZy53b3JkID0gcEFkLT5TdGFDZmcuSFRQaHlNb2RlLndvcmQ7Ci0gICAgZWxzZQotICAgICAgICBodF9zZXR0aW5nLndvcmQgPSBwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLkhUUGh5TW9kZS53b3JkOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA+PSBNT0RFX0hUTUlYKQotICAgIHsKLS8vCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMTYpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjMyKSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOwotCXJhdGVfaW5kZXggPSAxMiArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5CVyAqMjQpICsgKChVQ0hBUilodF9zZXR0aW5nLmZpZWxkLlNob3J0R0kgKjQ4KSArICgoVUNIQVIpaHRfc2V0dGluZy5maWVsZC5NQ1MpOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgaWYgKGh0X3NldHRpbmcuZmllbGQuTU9ERSA9PSBNT0RFX09GRE0pCi0JcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpICsgNDsKLSAgICBlbHNlIGlmIChodF9zZXR0aW5nLmZpZWxkLk1PREUgPT0gTU9ERV9DQ0spCi0JcmF0ZV9pbmRleCA9IChVQ0hBUikoaHRfc2V0dGluZy5maWVsZC5NQ1MpOwotCi0gICAgaWYgKHJhdGVfaW5kZXggPCAwKQotICAgICAgICByYXRlX2luZGV4ID0gMDsKLQotICAgIGlmIChyYXRlX2luZGV4ID4gcmF0ZV9jb3VudCkKLSAgICAgICAgcmF0ZV9pbmRleCA9IHJhdGVfY291bnQ7Ci0KLSAgICB3cnF1LT5iaXRyYXRlLnZhbHVlID0gcmFsaW5rcmF0ZVtyYXRlX2luZGV4XSAqIDUwMDAwMDsKLSAgICB3cnF1LT5iaXRyYXRlLmRpc2FibGVkID0gMDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgaXdfaGFuZGxlciBydF9oYW5kbGVyW10gPQotewotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmFtZSwJCQkvKiBTSU9DR0lXTkFNRSAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkJICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCSAgICAgICAgICAgIC8qIFNJT0NHSVdOV0lEICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZnJlcSwJCSAgICAvKiBTSU9DU0lXRlJFUSAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2ZyZXEsCQkgICAgLyogU0lPQ0dJV0ZSRVEgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdtb2RlLAkJICAgIC8qIFNJT0NTSVdNT0RFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bW9kZSwJCSAgICAvKiBTSU9DR0lXTU9ERSAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NFTlMgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTRU5TICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCAvKiBub3QgdXNlZCAqLywJCS8qIFNJT0NTSVdSQU5HRSAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmFuZ2UsCQkgICAgLyogU0lPQ0dJV1JBTkdFICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIG5vdCB1c2VkICovLAkJLyogU0lPQ1NJV1BSSVYgICAqLwotCShpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwgLyogbm90IHVzZWQgKi8sCQkvKiBTSU9DU0lXU1RBVFMgICovCi0JKGl3X2hhbmRsZXIpIHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdTVEFUUyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAgICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2FwLCAgICAgICAgICAgIC8qIFNJT0NTSVdBUCAgICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3YXAsCQkgICAgLyogU0lPQ0dJV0FQICAgICAqLwotI2lmZGVmIFNJT0NTSVdNTE1FCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd21sbWUsCSAgICAgICAgLyogU0lPQ1NJV01MTUUgICAqLwotI2Vsc2UKLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DU0lXTUxNRSAqLwotI2VuZGlmIC8vIFNJT0NTSVdNTE1FIC8vCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2l3YXBsaXN0LAkJICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KLSNpZmRlZiBTSU9DR0lXU0NBTgotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdzY2FuLAkJICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3c2NhbiwJCSAgICAvKiBTSU9DR0lXU0NBTiAgICovCi0jZWxzZQotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIFNJT0NTSVdTQ0FOICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiBTSU9DR0lXU0NBTiAgICovCi0jZW5kaWYgLyogU0lPQ0dJV1NDQU4gKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZXNzaWQsCQkgICAgLyogU0lPQ1NJV0VTU0lEICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlc3NpZCwJCSAgICAvKiBTSU9DR0lXRVNTSUQgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd25pY2tuLAkJICAgIC8qIFNJT0NTSVdOSUNLTiAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3bmlja24sCQkgICAgLyogU0lPQ0dJV05JQ0tOICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkgICAgICAgIC8qIC0tIGhvbGUgLS0gICAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJICAgICAgICAvKiAtLSBob2xlIC0tICAgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3JhdGUsICAgICAgICAgIC8qIFNJT0NTSVdSQVRFICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3cmF0ZSwgICAgICAgICAgLyogU0lPQ0dJV1JBVEUgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdydHMsCQkgICAgLyogU0lPQ1NJV1JUUyAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdydHMsCQkgICAgLyogU0lPQ0dJV1JUUyAgICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdmcmFnLAkJICAgIC8qIFNJT0NTSVdGUkFHICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfZ2l3ZnJhZywJCSAgICAvKiBTSU9DR0lXRlJBRyAgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9zaXdlbmNvZGUsCQkvKiBTSU9DU0lXRU5DT0RFICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX2dpd2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCSAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsCQkgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BPV0VSICAqLwotCShpd19oYW5kbGVyKSBOVUxMLAkJCQkJCS8qIC0tIGhvbGUgLS0gKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwJCQkJCQkvKiAtLSBob2xlIC0tICovCi0jaWYgV0lSRUxFU1NfRVhUID4gMTcKLSAgICAoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3Z2VuaWUsICAgICAgICAgLyogU0lPQ1NJV0dFTklFICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdnZW5pZSwgICAgICAgICAvKiBTSU9DR0lXR0VOSUUgICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd2F1dGgsCQkgICAgLyogU0lPQ1NJV0FVVEggICAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdhdXRoLAkJICAgIC8qIFNJT0NHSVdBVVRIICAgKi8KLQkoaXdfaGFuZGxlcikgcnRfaW9jdGxfc2l3ZW5jb2RlZXh0LAkgICAgLyogU0lPQ1NJV0VOQ09ERUVYVCAqLwotCShpd19oYW5kbGVyKSBydF9pb2N0bF9naXdlbmNvZGVleHQsCQkvKiBTSU9DR0lXRU5DT0RFRVhUICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3Npd3Bta3NhLCAgICAgICAgIC8qIFNJT0NTSVdQTUtTQSAgKi8KLSNlbmRpZgotfTsKLQotc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcnRfcHJpdl9oYW5kbGVyc1tdID0gewotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDAgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAxICovCi0JKGl3X2hhbmRsZXIpIHJ0X2lvY3RsX3NldHBhcmFtLCAvKiArIDB4MDIgKi8KLSNpZmRlZiBEQkcKLQkoaXdfaGFuZGxlcikgcnRfcHJpdmF0ZV9pb2N0bF9iYnAsIC8qICsgMHgwMyAqLwotI2Vsc2UKLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDAzICovCi0jZW5kaWYKLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA0ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwNSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MDYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDA3ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwOCAqLwotCShpd19oYW5kbGVyKSBydF9wcml2YXRlX2dldF9zdGF0aXN0aWNzLCAvKiArIDB4MDkgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBBICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwQiAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEMgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDBEICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgwRSAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MEYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDEwICovCi0JKGl3X2hhbmRsZXIpIHJ0X3ByaXZhdGVfc2hvdywgLyogKyAweDExICovCi0gICAgKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxMiAqLwotCShpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTMgKi8KLSAgICAoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE0ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxNSAqLwotICAgIChpd19oYW5kbGVyKSBOVUxMLCAvKiArIDB4MTYgKi8KLQkoaXdfaGFuZGxlcikgTlVMTCwgLyogKyAweDE3ICovCi0JKGl3X2hhbmRsZXIpIE5VTEwsIC8qICsgMHgxOCAqLwotfTsKLQotY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHJ0Mjh4eF9pd19oYW5kbGVyX2RlZiA9Ci17Ci0jZGVmaW5lCU4oYSkJKHNpemVvZiAoYSkgLyBzaXplb2YgKGFbMF0pKQotCS5zdGFuZGFyZAk9IChpd19oYW5kbGVyICopIHJ0X2hhbmRsZXIsCi0JLm51bV9zdGFuZGFyZAk9IHNpemVvZihydF9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKLQkucHJpdmF0ZQk9IChpd19oYW5kbGVyICopIHJ0X3ByaXZfaGFuZGxlcnMsCi0JLm51bV9wcml2YXRlCQk9IE4ocnRfcHJpdl9oYW5kbGVycyksCi0JLnByaXZhdGVfYXJncwk9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXZ0YWIsCi0JLm51bV9wcml2YXRlX2FyZ3MJPSBOKHByaXZ0YWIpLAotI2lmIElXX0hBTkRMRVJfVkVSU0lPTiA+PSA3Ci0gICAgLmdldF93aXJlbGVzc19zdGF0cyA9IHJ0Mjh4eF9nZXRfd2lyZWxlc3Nfc3RhdHMsCi0jZW5kaWYKLX07Ci0KLUlOVCBSVE1QU2V0SW5mb3JtYXRpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKLSAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCi17Ci0gICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7Ci0gICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKLSAgICBORElTXzgwMl8xMV9NQUNfQUREUkVTUyAgICAgICAgICAgICBCc3NpZDsKLSAgICBSVF84MDJfMTFfUEhZX01PREUgICAgICAgICAgICAgICAgICBQaHlNb2RlOwotICAgIFJUXzgwMl8xMV9TVEFfQ09ORklHICAgICAgICAgICAgICAgIFN0YUNvbmZpZzsKLSAgICBORElTXzgwMl8xMV9SQVRFUyAgICAgICAgICAgICAgICAgICBhcnlSYXRlczsKLSAgICBSVF84MDJfMTFfUFJFQU1CTEUgICAgICAgICAgICAgICAgICBQcmVhbWJsZTsKLSAgICBORElTXzgwMl8xMV9XRVBfU1RBVFVTICAgICAgICAgICAgICBXZXBTdGF0dXM7Ci0gICAgTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSAgICAgQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVNYXg7Ci0gICAgTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSAgQnNzVHlwZTsKLSAgICBORElTXzgwMl8xMV9SVFNfVEhSRVNIT0xEICAgICAgICAgICBSdHNUaHJlc2g7Ci0gICAgTkRJU184MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgRnJhZ1RocmVzaDsKLSAgICBORElTXzgwMl8xMV9QT1dFUl9NT0RFICAgICAgICAgICAgICBQb3dlck1vZGU7Ci0gICAgUE5ESVNfODAyXzExX0tFWSAgICAgICAgICAgICAgICAgICAgcEtleSA9IE5VTEw7Ci0gICAgUE5ESVNfODAyXzExX1dFUAkJCSAgICAgICAgcFdlcEtleSA9TlVMTDsKLSAgICBQTkRJU184MDJfMTFfUkVNT1ZFX0tFWSAgICAgICAgICAgICBwUmVtb3ZlS2V5ID0gTlVMTDsKLSAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICBDb25maWcsICpwQ29uZmlnID0gTlVMTDsKLSAgICBORElTXzgwMl8xMV9ORVRXT1JLX1RZUEUgICAgICAgICAgICBOZXRUeXBlOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdzsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSAwOwotICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1MsIE1heFBoeU1vZGUgPSBQSFlfMTFHOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyVGVtcDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWRpb1N0YXRlOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKLSAgICAgUE5ESVNfODAyXzExX1BBU1NQSFJBU0UgICAgICAgICAgICAgICAgICAgIHBwYXNzcGhyYXNlID0gTlVMTDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlPSURfU0VUX0hUX1BIWU1PREUJCQkJCUhUX1BoeU1vZGU7CS8vMTFuICxrYXRoeQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLSAgICBQTkRJU184MDJfMTFfUE1LSUQgICAgICAgICAgICAgICAgICBwUG1rSWQgPSBOVUxMOwotICAgIEJPT0xFQU4JCQkJICAgICAgICAgICAgICAgIElFRUU4MDIxeFN0YXRlID0gRkFMU0U7Ci0gICAgQk9PTEVBTgkJCQkgICAgICAgICAgICAgICAgSUVFRTgwMjF4X3JlcXVpcmVkX2tleXMgPSBGQUxTRTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9lbmFibGUgPSAwOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotI2lmZGVmIFNOTVBfU1VQUE9SVAotCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOwotCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKLQlVQ0hBUgkJCQkJCWN0bXA7Ci0jZW5kaWYgLy8gU05NUF9TVVBQT1JUIC8vCi0KLQotCi0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQlNYXhQaHlNb2RlID0gUEhZXzExTl81RzsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPlJUTVBTZXRJbmZvcm1hdGlvbigpLAkweCUwOHhcbiIsIGNtZCYweDdGRkYpKTsKLQlzd2l0Y2goY21kICYgMHg3RkZGKSB7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9DT1VOVFJZX1JFR0lPTjoKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPCBzaXplb2YoVUNIQVIpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkvLyBPbmx5IGF2YWxpYWJsZSB3aGVuIEVFUFJPTSBub3QgcHJvZ3JhbW1pbmcKLSAgICAgICAgICAgIGVsc2UgaWYgKCEocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbiAmIDB4ODApICYmICEocEFkLT5Db21tb25DZmcuQ291bnRyeVJlZ2lvbkZvckFCYW5kICYgMHg4MCkpCi0JCQl7Ci0JCQkJVUxPTkcgICBDb3VudHJ5OwotCQkJCVVDSEFSCVRtcFBoeTsKLQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb3VudHJ5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24gPSAoVUNIQVIpKENvdW50cnkgJiAweDAwMDAwMEZGKTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQgPSAoVUNIQVIpKChDb3VudHJ5ID4+IDgpICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAgICAgVG1wUGh5ID0gcEFkLT5Db21tb25DZmcuUGh5TW9kZTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5QaHlNb2RlID0gMHhmZjsKLQkJCQkvLyBCdWlsZCBhbGwgY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uCi0JCQkJUlRNUFNldFBoeU1vZGUocEFkLCBUbXBQaHkpOwotI2lmZGVmIERPVDExX05fU1VQUE9SVAotCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OIChBOiVkICBCL0c6JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5Db3VudHJ5UmVnaW9uRm9yQUJhbmQsCi0JCQkJICAgIHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOOgotICAgICAgICAgICAgTm93ID0gamlmZmllczsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sIFR4Q250ID0gJWQgXG4iLCBwQWQtPlJhbGlua0NvdW50ZXJzLkxhc3RPbmVTZWNUb3RhbFR4Q291bnQpKTsKLQotICAgICAgICAgICAgaWYgKE1PTklUT1JfT04ocEFkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgRHJpdmVyIGlzIGluIE1vbml0b3IgTW9kZSBub3cgISEhXG4iKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQkJCS8vQmVuc29uIGFkZCAyMDA4MDUyNywgd2hlbiByYWRpbyBvZmYsIHN0YSBkb24ndCBuZWVkIHRvIHNjYW4KLQkJCWlmIChSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfUkFESU9fT0ZGKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JCQl7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIERyaXZlciBpcyBzY2FubmluZyBub3cgISEhXG4iKSk7Ci0JCQkJcEFkLT5TdGFDZmcuYlNjYW5SZXFJc0Zyb21XZWJVSSA9IFRSVUU7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotCQkJaWYgKHBBZC0+UmFsaW5rQ291bnRlcnMuTGFzdE9uZVNlY1RvdGFsVHhDb3VudCA+IDEwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTGluayBVUCwgaWdub3JlIHRoaXMgc2V0OjpPSURfODAyXzExX0JTU0lEX0xJU1RfU0NBTlxuIikpOwotCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDk5OwkJLy8gUHJldmVudCBhdXRvIHNjYW4gdHJpZ2dlcmVkIGJ5IHRoaXMgT0lECi0JCQkJYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoT1BTVEFUVVNfVEVTVF9GTEFHKHBBZCwgZk9QX1NUQVRVU19NRURJQV9TVEFURV9DT05ORUNURUQpKSAmJgotCQkJCSgocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKSB8fAotCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spIHx8Ci0JCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIpIHx8Ci0JCQkJKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spKSAmJgotICAgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9PSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBMaW5rIFVQLCBQb3J0IE5vdCBTZWN1cmVkISBpZ25vcmUgdGhpcyBzZXQ6Ok9JRF84MDJfMTFfQlNTSURfTElTVF9TQ0FOXG4iKSk7Ci0JCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLQkJCQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gOTk7CQkvLyBQcmV2ZW50IGF1dG8gc2NhbiB0cmlnZ2VyZWQgYnkgdGhpcyBPSUQKLQkJCQlicmVhazsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KLSAgICAgICAgICAgIHBBZC0+TWxtZUF1eC5DdXJyUmVxSXNGcm9tTmRpcyA9IEZBTFNFOwotICAgICAgICAgICAgLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKLSAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlNjYW5DbnQgPSAwOwotICAgICAgICAgICAgcEFkLT5TdGFDZmcuTGFzdFNjYW5UaW1lID0gTm93OwotCi0JCQlwQWQtPlN0YUNmZy5iU2NhblJlcUlzRnJvbVdlYlVJID0gVFJVRTsKLSAgICAgICAgICAgIFJUTVBfU0VUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKTsKLSAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1MTUVfQ05UTF9TVEFURV9NQUNISU5FLAotICAgICAgICAgICAgICAgICAgICAgICAgT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1NJRDoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKQotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCVBTVFJJTkcgcFNzaWRTdHJpbmcgPSBOVUxMOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NTSUQgKExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKLSAgICAgICAgICAgICAgICBpZiAoU3NpZC5Tc2lkTGVuZ3RoID4gTUFYX0xFTl9PRl9TU0lEKQotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0JCQlpZiAoU3NpZC5Tc2lkTGVuZ3RoID09IDApCi0JCQkJewotCQkJCVNldF9TU0lEX1Byb2MocEFkLCAiIik7Ci0JCQkJfQotCQkJCQllbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLQkJCQlwU3NpZFN0cmluZyA9IChQU1RSSU5HKWttYWxsb2MoTUFYX0xFTl9PRl9TU0lEKzEsIE1FTV9BTExPQ19GTEFHKTsKLQkJCQkJCWlmIChwU3NpZFN0cmluZykKLQkJCQkJCXsKLQkJCQkJCQlOZGlzWmVyb01lbW9yeShwU3NpZFN0cmluZywgTUFYX0xFTl9PRl9TU0lEKzEpOwotCQkJCQkJCU5kaXNNb3ZlTWVtb3J5KHBTc2lkU3RyaW5nLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCk7Ci0JCQkJCQkJU2V0X1NTSURfUHJvYyhwQWQsIHBTc2lkU3RyaW5nKTsKLQkJCQkJCQlrZnJlZShwU3NpZFN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIE9JRF84MDJfMTFfU0VUX1BBU1NQSFJBU0U6Ci0JICAgIHBwYXNzcGhyYXNlPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JICAgIGlmKHBwYXNzcGhyYXNlPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLQkJU3RhdHVzID0gLUVOT01FTTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX1BBU1NQSFJBU0UsIEZhaWxlZCEhXG4iKSk7Ci0JCWJyZWFrOwotICAgICAgICAgICAgfQotCQkJZWxzZQotCQl7Ci0JCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBwYXNzcGhyYXNlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCQkJaWYgKFN0YXR1cykKLQkJewotCQkJU3RhdHVzICA9IC1FSU5WQUw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX1BBU1NQSFJBU0UsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJCWlmKHBwYXNzcGhyYXNlLT5LZXlMZW5ndGggPCA4IHx8IHBwYXNzcGhyYXNlLT5LZXlMZW5ndGggPiA2NCkKLQkJCQkJewotCQkJCQkJU3RhdHVzICA9IC1FSU5WQUw7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfU0VUX1BBU1NQSFJBU0UsIEZhaWxlZCAobGVuIGxlc3MgdGhhbiA4IG9yIGdyZWF0ZXIgdGhhbiA2NCkhIVxuIikpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy8gc2V0IGtleSBwYXNzcGhyYXNlIGFuZCBsZW5ndGgKLQkJCQkJCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLQkJCQkJTmRpc01vdmVNZW1vcnkocEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgJnBwYXNzcGhyYXNlLT5LZXlNYXRlcmlhbCwgcHBhc3NwaHJhc2UtPktleUxlbmd0aCk7Ci0JCQkJCQlwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID0gcHBhc3NwaHJhc2UtPktleUxlbmd0aDsKLQkJCQkJCWhleF9kdW1wKCJwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlIiwgcEFkLT5TdGFDZmcuV3BhUGFzc1BocmFzZSwgNjQpOwotCQkJCQkJcHJpbnRrKCJXcGFQYXNzUGhyYXNlPSVzXG4iLHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCQlrZnJlZShwcGFzc3BocmFzZSk7Ci0JCQlicmVhazsKLQotICAgICAgICBjYXNlIE9JRF84MDJfMTFfQlNTSUQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUykpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkJzc2lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgLy8gdGVsbCBDTlRMIHN0YXRlIG1hY2hpbmUgdG8gY2FsbCBOZGlzTVNldEluZm9ybWF0aW9uQ29tcGxldGUoKSBhZnRlciBjb21wbGV0aW5nCi0gICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0LCBiZWNhdXNlIHRoaXMgcmVxdWVzdCBpcyBpbml0aWF0ZWQgYnkgTkRJUy4KLSAgICAgICAgICAgICAgICBwQWQtPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBGQUxTRTsKLQotCQkJCS8vIFByZXZlbnQgdG8gY29ubmVjdCBBUCBhZ2FpbiBpbiBTVEFNbG1lUGVyaW9kaWNFeGVjCi0JCQkJcEFkLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFsbG93ZWQgc2NhbiByZXRyaWVzCi0JCQkJcEFkLT5TdGFDZmcuU2NhbkNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWQpOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1sbWVFbnF1ZXVlKHBBZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPSURfODAyXzExX0JTU0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihORElTXzgwMl8xMV9NQUNfQUREUkVTUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPSUQgKikmQnNzaWQpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgU3RhdGVNYWNoaW5lVG91Y2hlZCA9IFRSVUU7Ci0KLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQlNTSUQgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnNzaWRbMF0sIEJzc2lkWzFdLCBCc3NpZFsyXSwgQnNzaWRbM10sIEJzc2lkWzRdLCBCc3NpZFs1XSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKEJPT0xFQU4pKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSYWRpb1N0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOwotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5iU3dSYWRpbyAhPSBSYWRpb1N0YXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYlN3UmFkaW8gPSBSYWRpb1N0YXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvICE9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLmJSYWRpbyA9IChwQWQtPlN0YUNmZy5iSHdSYWRpbyAmJiBwQWQtPlN0YUNmZy5iU3dSYWRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuYlJhZGlvID09IFRSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVJhZGlvT24ocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IEVYVFJBX0lORk9fQ0xFQVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJaWYgKFJUTVBfVEVTVF9GTEFHKHBBZCwgZlJUTVBfQURBUFRFUl9CU1NfU0NBTl9JTl9QUk9HUkVTUykpCi0JCQkJICAgICAgICAgICAgewotCQkJCSAgICAgICAgICAgICAgICBpZiAocEFkLT5NbG1lLkNudGxNYWNoaW5lLkN1cnJTdGF0ZSAhPSBDTlRMX0lETEUpCi0JCQkJCQkgICAgICAgIHsKLQkJCQkJCSAgICAgICAgICAgIFJUTVBfTUxNRV9SRVNFVF9TVEFURV9NQUNISU5FKHBBZCk7Ci0JCQkJCQkgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIhISEgTUxNRSBidXN5LCByZXNldCBNTE1FIHN0YXRlIG1hY2hpbmUgISEhXG4iKSk7Ci0JCQkJCQkgICAgICAgIH0KLQkJCQkgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbG1lUmFkaW9PZmYocEFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXh0cmEgaW5mb3JtYXRpb24KLQkJCQkJCQlwQWQtPkV4dHJhSW5mbyA9IFNXX1JBRElPX09GRjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUEhZX01PREU6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfUEhZX01PREUpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQaHlNb2RlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCWlmIChQaHlNb2RlIDw9IE1heFBoeU1vZGUpCi0JCQkJewotICAgICAgICAgICAgICAgIFJUTVBTZXRQaHlNb2RlKHBBZCwgUGh5TW9kZSk7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQkJU2V0Q29tbW9uSFQocEFkKTsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQkJCQl9Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1BIWV9NT0RFICg9JWQpXG4iLCBQaHlNb2RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1NUQV9DT05GSUc6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRykpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCVVJTlQzMglWYWx1ZTsKLQotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZTdGFDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYkVuYWJsZVR4QnVyc3QgPSBTdGFDb25maWcuRW5hYmxlVHhCdXJzdDsKLSAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5Vc2VCR1Byb3RlY3Rpb24gPSBTdGFDb25maWcuVXNlQkdQcm90ZWN0aW9uOwotICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJVc2VTaG9ydFNsb3RUaW1lID0gMTsgLy8gMjAwMy0xMC0zMCBhbHdheXMgU0hPUlQgU0xPVCBjYXBhYmxlCi0gICAgICAgICAgICAgICAgaWYgKChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlICE9IFN0YUNvbmZpZy5BZGhvY01vZGUpICYmCi0JCQkJCShTdGFDb25maWcuQWRob2NNb2RlIDw9IE1heFBoeU1vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZHluYW1pYyBjaGFuZ2Ugb2YgIlVTRSBPRkRNIHJhdGUgb3Igbm90IiBpbiBBREhPQyBtb2RlCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHNldHRpbmcgY2hhbmdlZCwgbmVlZCB0byByZXNldCBjdXJyZW50IFRYIHJhdGUgYXMgd2VsbCBhcyBCRUFDT04gZnJhbWUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19BREhPQykKLSAgICAgICAgICAgICAgICAgICAgewotCQkJcEFkLT5Db21tb25DZmcuUGh5TW9kZSA9IFN0YUNvbmZpZy5BZGhvY01vZGU7Ci0JCQlSVE1QU2V0UGh5TW9kZShwQWQsIFBoeU1vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYWtlSWJzc0JlYWNvbihwQWQpOyAgICAgICAgICAgLy8gcmUtYnVpbGQgQkVBQ09OIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBBc2ljRW5hYmxlSWJzc1N5bmMocEFkKTsgICAvLyBjb3B5IHRvIG9uLWNoaXAgbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9TVEFfQ09ORklHIChCdXJzdD0lZCwgUHJvdGVjdGlvbj0lbGQsU2hvcnRTbG90PSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlVzZUJHUHJvdGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZSkpOwotCi0JCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKQotCQkJCQlWYWx1ZSA9IFBTUFhMSU5LOwotCQkJCWVsc2UKLQkJCQkJVmFsdWUgPSBTVEFOT1JNQUw7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgUlhfRklMVFJfQ0ZHLCBWYWx1ZSk7Ci0JCQkJVmFsdWUgPSAwOwotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJCVZhbHVlICY9ICh+MHg4MCk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZCwgTUFDX1NZU19DVFJMLCBWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0RFU0lSRURfUkFURVM6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFyeVJhdGVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGUsIE1BWF9MRU5fT0ZfU1VQUE9SVEVEX1JBVEVTKTsKLSAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlLCAmYXJ5UmF0ZXMsIHNpemVvZihORElTXzgwMl8xMV9SQVRFUykpOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERVNJUkVEX1JBVEVTICglMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngpXG4iLAotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzBdLHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMV0sCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbMl0scEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVszXSwKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuRGVzaXJlUmF0ZVs0XSxwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzVdLAotICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5EZXNpcmVSYXRlWzZdLHBBZC0+Q29tbW9uQ2ZnLkRlc2lyZVJhdGVbN10gKSk7Ci0gICAgICAgICAgICAgICAgLy8gQ2hhbmdpbmcgRGVzaXJlZFJhdGUgbWF5IGFmZmVjdCB0aGUgTUFYIFRYIHJhdGUgd2UgdXNlZCB0byBUWCBmcmFtZXMgb3V0Ci0gICAgICAgICAgICAgICAgTWxtZVVwZGF0ZVR4UmF0ZXMocEFkLCBGQUxTRSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BSRUFNQkxFOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoUlRfODAyXzExX1BSRUFNQkxFKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUHJlYW1ibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKFByZWFtYmxlID09IFJ0ODAyXzExUHJlYW1ibGVTaG9ydCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKLSAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlU2hvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoUHJlYW1ibGUgPT0gUnQ4MDJfMTFQcmVhbWJsZUxvbmcpIHx8IChQcmVhbWJsZSA9PSBSdDgwMl8xMVByZWFtYmxlQXV0bykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIHdhbnRzIEFVVE8sIGluaXRpYWxpemUgdG8gTE9ORyBoZXJlLCB0aGVuIGNoYW5nZSBhY2NvcmRpbmcgdG8gQVAncwotICAgICAgICAgICAgICAgICAgICAvLyBjYXBhYmlsaXR5IHVwb24gYXNzb2NpYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlR4UHJlYW1ibGUgPSBQcmVhbWJsZTsKLSAgICAgICAgICAgICAgICAgICAgTWxtZVNldFR4UHJlYW1ibGUocEFkLCBSdDgwMl8xMVByZWFtYmxlTG9uZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfUFJFQU1CTEUgKD0lZClcbiIsIFByZWFtYmxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1dFUF9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9XRVBfU1RBVFVTKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmV2VwU3RhdHVzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIC8vIFNpbmNlIFRLSVAsIEFFUywgV0VQIGFyZSBhbGwgc3VwcG9ydGVkLiBJdCBzaG91bGQgbm90IGhhdmUgYW55IGludmFsaWQgc2V0dGluZwotICAgICAgICAgICAgICAgIGlmIChXZXBTdGF0dXMgPD0gTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLldlcFN0YXR1cyAhPSBXZXBTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IFdlcFN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuT3JpZ1dlcFN0YXR1cyA9IFdlcFN0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IFdlcFN0YXR1czsKLQkJCXBBZC0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBXZXBTdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUF9TVEFUVVMgKD0lZClcbiIsV2VwU3RhdHVzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREU6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQXV0aE1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKEF1dGhNb2RlID4gTmRpczgwMl8xMUF1dGhNb2RlTWF4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gQXV0aE1vZGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZyBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuQXV0aE1vZGUgPSBBdXRoTW9kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPSBXUEFfODAyXzFYX1BPUlRfTk9UX1NFQ1VSRUQ7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgKD0lZCkgXG4iLHBBZC0+U3RhQ2ZnLkF1dGhNb2RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQnNzVHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCQkJCWlmIChCc3NUeXBlID09IE5kaXM4MDJfMTFJQlNTKQotCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWQsICJBZGhvYyIpOwotCQkJCWVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlKQotCQkJCQlTZXRfTmV0d29ya1R5cGVfUHJvYyhwQWQsICJJbmZyYSIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKEJzc1R5cGUgPT0gTmRpczgwMl8xMU1vbml0b3IpCi0JCQkJCVNldF9OZXR3b3JrVHlwZV9Qcm9jKHBBZCwgIk1vbml0b3IiKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgKHVua25vd24pXG4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0JIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfV0VQOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9XRVBcbiIpKTsKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0tFWV9JTkRFWCkpCi0gICAgICAgICAgICB7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQkJS2V5SWR4ID0gKihORElTXzgwMl8xMV9LRVlfSU5ERVggKikgd3JxLT51LmRhdGEucG9pbnRlcjsKLQotCQlpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKLQkJewotCQkJLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKLQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlLZXlJZHggPSBLZXlJZHggJiAweDBmZmZmZmZmOwotCQkJaWYgKEtleUlkeCA+PSA0KXsKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOwotCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDSVBIRVJfTk9ORTsKLQkJCQkJCUFzaWNSZW1vdmVTaGFyZWRLZXlFbnRyeShwQWQsIDAsIChVQ0hBUilLZXlJZHgpOwotCQkJfQotCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JFU0VUX0NPVU5URVJTOgotICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkoJnBBZC0+V2xhbkNvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl84MDJfMTEpKTsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPkNvdW50ZXJzODAyMywgc2l6ZW9mKENPVU5URVJfODAyXzMpKTsKLSAgICAgICAgICAgIE5kaXNaZXJvTWVtb3J5KCZwQWQtPlJhbGlua0NvdW50ZXJzLCBzaXplb2YoQ09VTlRFUl9SQUxJTkspKTsKLSAgICAgICAgICAgIHBBZC0+Q291bnRlcnM4MDIzLlJ4Tm9CdWZmZXIgICA9IDA7Ci0JCQlwQWQtPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXMgPSAwOwotCQkJcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlciAgID0gMDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9SRVNFVF9DT1VOVEVSUyBcbiIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlRTX1RIUkVTSE9MRDoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX1JUU19USFJFU0hPTEQpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSdHNUaHJlc2gsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJ0c1RocmVzaCA+IE1BWF9SVFNfVEhSRVNIT0xEKQotICAgICAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLlJ0c1RocmVzaG9sZCA9IChVU0hPUlQpUnRzVGhyZXNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQgKD0lbGQpXG4iLFJ0c1RocmVzaCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmRnJhZ1RocmVzaCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaWYgKEZyYWdUaHJlc2ggPiBNQVhfRlJBR19USFJFU0hPTEQgfHwgRnJhZ1RocmVzaCA8IE1JTl9GUkFHX1RIUkVTSE9MRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChGcmFnVGhyZXNoID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkZyYWdtZW50VGhyZXNob2xkID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuYlVzZVplcm9Ub0Rpc2FibGVGcmFnbWVudCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5Db21tb25DZmcuRnJhZ21lbnRUaHJlc2hvbGQgPSAoVVNIT1JUKUZyYWdUaHJlc2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRlJBR01FTlRBVElPTl9USFJFU0hPTEQgKD0lbGQpIFxuIixGcmFnVGhyZXNoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1BPV0VSX01PREU6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihORElTXzgwMl8xMV9QT1dFUl9NT0RFKSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlck1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNKQotCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZCwgIkNBTSIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFBvd2VyTW9kZSA9PSBOZGlzODAyXzExUG93ZXJNb2RlTUFYX1BTUCkKLQkJCVNldF9QU01vZGVfUHJvYyhwQWQsICJNYXhfUFNQIik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVGYXN0X1BTUCkKLQkJCQkJU2V0X1BTTW9kZV9Qcm9jKHBBZCwgIkZhc3RfUFNQIik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUG93ZXJNb2RlID09IE5kaXM4MDJfMTFQb3dlck1vZGVMZWdhY3lfUFNQKQotCQkJCQlTZXRfUFNNb2RlX1Byb2MocEFkLCAiTGVnYWN5X1BTUCIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFICg9JWQpXG4iLFBvd2VyTW9kZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIDwgc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZQb3dlclRlbXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJaWYgKFBvd2VyVGVtcCA+IDEwMCkKLQkJCQkJUG93ZXJUZW1wID0gMHhmZmZmZmZmZjsgIC8vIEFVVE8KLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyRGVmYXVsdCA9IFBvd2VyVGVtcDsgLy9rZWVwIGN1cnJlbnQgc2V0dGluZy4KLQkJCQlwQWQtPkNvbW1vbkNmZy5UeFBvd2VyUGVyY2VudGFnZSA9IHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJEZWZhdWx0OwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9UWF9QT1dFUl9MRVZFTF8xICg9JWxkKVxuIiwgcEFkLT5Db21tb25DZmcuVHhQb3dlclBlcmNlbnRhZ2UpKTsKLQkJCX0KLQkgICAgICAgIGJyZWFrOwotCQljYXNlIE9JRF84MDJfMTFfTkVUV09SS19UWVBFX0lOX1VTRToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX05FVFdPUktfVFlQRSkpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmTmV0VHlwZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCQkJCWlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFEUykKLQkJCQkJUlRNUFNldFBoeU1vZGUocEFkLCBQSFlfMTFCKTsKLQkJCQllbHNlIGlmIChOZXRUeXBlID09IE5kaXM4MDJfMTFPRkRNMjQpCi0JCQkJCVJUTVBTZXRQaHlNb2RlKHBBZCwgUEhZXzExQkdfTUlYRUQpOwotCQkJCWVsc2UgaWYgKE5ldFR5cGUgPT0gTmRpczgwMl8xMU9GRE01KQotCQkJCQlSVE1QU2V0UGh5TW9kZShwQWQsIFBIWV8xMUEpOwotCQkJCWVsc2UKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJCQlpZiAoU3RhdHVzID09IE5ESVNfU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVNldENvbW1vbkhUKHBBZCk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0UgKD0lZClcbiIsTmV0VHlwZSkpOwotCQkgICAgfQotCQkJYnJlYWs7Ci0gICAgICAgIC8vIEZvciBXUEEgUFNLIFBNSyBrZXkKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0FERF9XUEE6Ci0gICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwS2V5LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgaWYgKHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEsIEZhaWxlZCEhXG4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0JCQkJICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCQkJCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfV1BBLCBGYWlsZWQhISBbQXV0aE1vZGUgIT0gV1BBUFNLL1dQQTJQU0svV1BBTk9ORV1cbiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBBZC0+U3RhQ2ZnLkF1dGhNb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykgfHwKLQkJCQkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSykgfHwKLQkJCQkJCSAocEFkLT5TdGFDZmcuQXV0aE1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkgKSAgICAgLy8gT25seSBmb3IgV1BBIFBTSyBtb2RlCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5QTUssICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFJhQ29uZmlnIGFzIFBTSyBhZ2VudC4KLSAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgU1RBIHN1cHBsaWNhbnQgc3RhdGUgbWFjaGluZQotICAgICAgICAgICAgICAgICAgICBpZiAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfU1RBUlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdGF0ZSA9IFNTX05PVFVTRTsKLSAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX0FERF9XUEEgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtmcmVlKHBLZXkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SRU1PVkVfS0VZOgotICAgICAgICAgICAgcFJlbW92ZUtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZihwUmVtb3ZlS2V5ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFJlbW92ZUtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChwUmVtb3ZlS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIVxuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSVE1QV1BBUmVtb3ZlS2V5UHJvYyhwQWQsIHBSZW1vdmVLZXkpOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfUkVNT1ZFX0tFWSwgUmVtb3ZlIFdQQSBLZXkhIVxuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBLZXlJZHggPSBwUmVtb3ZlS2V5LT5LZXlJbmRleDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoS2V5SWR4ICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIHNldCBkZWZhdWx0IGJpdCB3aGVuIHJlbW92ZSBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVksIEZhaWxlZCEhKFNob3VsZCBuZXZlciBzZXQgZGVmYXVsdCBiaXQgd2hlbiByZW1vdmUga2V5KVxuIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4ID0gS2V5SWR4ICYgMHgwZmZmZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLZXlJZHggPiAzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9SRU1PVkVfS0VZLCBGYWlsZWQhIShLZXlJZFslZF0gb3V0IG9mIHJhbmdlKVxuIiwgS2V5SWR4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+U2hhcmVkS2V5W0JTUzBdW0tleUlkeF0uQ2lwaGVyQWxnID0gQ0lQSEVSX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNpY1JlbW92ZVNoYXJlZEtleUVudHJ5KHBBZCwgMCwgKFVDSEFSKUtleUlkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1JFTU9WRV9LRVkgKGlkPTB4JXgsIExlbj0lZC1ieXRlKVxuIiwgcFJlbW92ZUtleS0+S2V5SW5kZXgsIHBSZW1vdmVLZXktPkxlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAga2ZyZWUocFJlbW92ZUtleSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLy8gTmV3IGZvciBXUEEKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0FERF9LRVk6Ci0gICAgICAgICAgICBwS2V5ID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmKHBLZXkgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChwS2V5LT5MZW5ndGggIT0gd3JxLT51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfS0VZLCBGYWlsZWQhIVxuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJUTVBBZGRLZXkocEFkLCBwS2V5KTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX0tFWSAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpXG4iLCBwS2V5LT5LZXlJbmRleCwgcEtleS0+S2V5TGVuZ3RoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZnJlZShwS2V5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTjoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZDb25maWcsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcENvbmZpZyA9ICZDb25maWc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBDb25maWctPkJlYWNvblBlcmlvZCA+PSAyMCkgJiYgKHBDb25maWctPkJlYWNvblBlcmlvZCA8PTQwMCkpCi0gICAgICAgICAgICAgICAgICAgICBwQWQtPkNvbW1vbkNmZy5CZWFjb25QZXJpb2QgPSAoVVNIT1JUKSBwQ29uZmlnLT5CZWFjb25QZXJpb2Q7Ci0KLSAgICAgICAgICAgICAgICBwQWQtPlN0YUFjdGl2ZS5BdGltV2luID0gKFVTSE9SVCkgcENvbmZpZy0+QVRJTVdpbmRvdzsKLSAgICAgICAgICAgICAgICBNQVBfS0haX1RPX0NIQU5ORUxfSUQocENvbmZpZy0+RFNDb25maWcsIHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpOwotICAgICAgICAgICAgICAgIC8vCi0JCQkJLy8gU2F2ZSB0aGUgY2hhbm5lbCBvbiBNbG1lQXV4IGZvciBDbnRsT2lkUlRCc3NpZFByb2MgdXNlZC4KLQkJCQkvLwotCQkJCXBBZC0+TWxtZUF1eC5DaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2hhbm5lbDsKLQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9DT05GSUdVUkFUSU9OIChCZWFjblBlcmlvZD0lbGQsQXRpbVc9JWxkLENoPSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+QmVhY29uUGVyaW9kLCBwQ29uZmlnLT5BVElNV2luZG93LCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0gICAgICAgICAgICAgICAgLy8gQ29uZmlnIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgcEFkLT5iQ29uZmlnQ2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aAkhPSBzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJICAgIFBPSURfU0VUX0hUX1BIWU1PREUJcEhUUGh5TW9kZSA9ICZIVF9QaHlNb2RlOwotCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkhUX1BoeU1vZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpwSFRQaHlNb2RlCShQaHlNb2RlID0gJWQsVHJhbnNtaXRObyA9ICVkLCBIdE1vZGUgPQklZCwJRXh0T2Zmc2V0ID0JJWQgLCBNQ1MgPSAlZCwgQlcgPQklZCwJU1RCQyA9ICVkLCBTSE9SVEdJID0gJWQpIFxuIiwKLQkJCQlwSFRQaHlNb2RlLT5QaHlNb2RlLCBwSFRQaHlNb2RlLT5UcmFuc21pdE5vLHBIVFBoeU1vZGUtPkh0TW9kZSxwSFRQaHlNb2RlLT5FeHRPZmZzZXQsCi0JCQkJcEhUUGh5TW9kZS0+TUNTLCBwSFRQaHlNb2RlLT5CVywgcEhUUGh5TW9kZS0+U1RCQywJcEhUUGh5TW9kZS0+U0hPUlRHSSkpOwotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5QaHlNb2RlCT49IFBIWV8xMUFCR05fTUlYRUQpCi0JCQkJCVJUTVBTZXRIVChwQWQsCXBIVFBoeU1vZGUpOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9IVF9QSFlNT0RFKE1DUz0lZCxCVz0lZCxTR0k9JWQsU1RCQz0lZClcbiIsCi0JCQkJcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLk1DUywgcEFkLT5TdGFDZmcuSFRQaHlNb2RlLmZpZWxkLkJXLCBwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU2hvcnRHSSwKLQkJCQlwQWQtPlN0YUNmZy5IVFBoeU1vZGUuZmllbGQuU1RCQykpOwotCQkJYnJlYWs7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJVUxPTkcgYXBzZCA7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmFwc2QsIHdycS0+dS5kYXRhLnBvaW50ZXIsCXdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCQl8QjMxfkI3CXwJQjZ+QjUJIHwJIEI0CSB8CSBCMwkgfAlCMgkgfAlCMQkgfAkgICBCMAkJfAotCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCXwgUnN2ZAl8IE1heCBTUCBMZW4gfCBBQ19WTyB8IEFDX1ZJIHwgQUNfQksgfCBBQ19CRSB8IEFQU0QJQ2FwYWJsZQl8Ci0JCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUgPSAoYXBzZCAmIDB4MDAwMDAwMDEpID8gVFJVRSA6CUZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQkUgPSAoKGFwc2QJJiAweDAwMDAwMDAyKSA+PiAxKQk/IFRSVUUgOiBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLID0gKChhcHNkCSYgMHgwMDAwMDAwNCkgPj4gMikJPyBUUlVFIDogRkFMU0U7Ci0JCQkJcEFkLT5Db21tb25DZmcuYkFQU0RBQ19WSSA9ICgoYXBzZAkmIDB4MDAwMDAwMDgpID4+IDMpCT8gVFJVRSA6IEZBTFNFOwotCQkJCXBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPSAoKGFwc2QJJiAweDAwMDAwMDEwKSA+PiA0KQk/IFRSVUUgOiBGQUxTRTsKLQkJCQlwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aAk9IChVQ0hBUikoKGFwc2QJJiAweDAwMDAwMDYwKSA+PiA1KTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfQVBTRF9TRVRUSU5HIChhcHNkPTB4JWx4LCBBUFNEQ2FwPSVkLCBbQkUsQkssVkksVk9dPVslZC8lZC8lZC8lZF0sCU1heFNQTGVuPSVkKVxuIiwgYXBzZCwgcEFkLT5Db21tb25DZmcuYkFQU0RDYXBhYmxlLAotCQkJCQlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFLAlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLLAlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJLAlwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZPLAlwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9BUFNEX1BTTToKLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgJIT0gc2l6ZW9mKFVMT05HKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCS8vIERyaXZlciBuZWVkcwl0byBub3RpZnkgQVAgd2hlbiBQU00gY2hhbmdlcwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCWlmIChwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlCSE9IHBBZC0+U3RhQ2ZnLlBzbSkKLQkJCQl7Ci0JCQkJCVJUTVBfU0VUX1BTTV9CSVQocEFkLAlwQWQtPkNvbW1vbkNmZy5iQVBTREZvcmNlUG93ZXJTYXZlKTsKLQkJCQkJUlRNUFNlbmROdWxsRnJhbWUocEFkLAlwQWQtPkNvbW1vbkNmZy5UeFJhdGUsCVRSVUUpOwotCQkJCX0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX0FQU0RfUFNNIChiQVBTREZvcmNlUG93ZXJTYXZlOiVkKVxuIiwJcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOwotCQkJfQotCQkJYnJlYWs7Ci0jaWZkZWYgUU9TX0RMU19TVVBQT1JUCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9TRVRfRExTOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJQk9PTEVBTglvbGR2YWx1ZSA9IHBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlOwotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlpZiAob2xkdmFsdWUgJiYJIXBBZC0+Q29tbW9uQ2ZnLmJETFNDYXBhYmxlKQotCQkJCXsKLQkJCQkJaW50CWk7Ci0JCQkJCS8vIHRlYXIJZG93biBsb2NhbCBkbHMgdGFibGUgZW50cnkKLQkJCQkJZm9yCShpPTA7IGk8TUFYX05VTV9PRl9JTklUX0RMU19FTlRSWTsgaSsrKQotCQkJCQl7Ci0JCQkJCQlpZiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uVmFsaWQgJiYgKHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cyA9PSBETFNfRklOSVNIKSkKLQkJCQkJCXsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5TdGF0dXMJPSBETFNfTk9ORTsKLQkJCQkJCQlwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZAk9IEZBTFNFOwotCQkJCQkJCVJUTVBTZW5kRExTVGVhckRvd25GcmFtZShwQWQsIHBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLk1hY0FkZHIpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gdGVhcglkb3duIHBlZXIgZGxzIHRhYmxlCWVudHJ5Ci0JCQkJCWZvcgkoaT1NQVhfTlVNX09GX0lOSVRfRExTX0VOVFJZOyBpPE1BWF9OVU1fT0ZfRExTX0VOVFJZOyBpKyspCi0JCQkJCXsKLQkJCQkJCWlmIChwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXS5WYWxpZCAmJiAocEFkLT5TdGFDZmcuRExTRW50cnlbaV0uU3RhdHVzID09IERMU19GSU5JU0gpKQotCQkJCQkJewotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlN0YXR1cwk9IERMU19OT05FOwotCQkJCQkJCXBBZC0+U3RhQ2ZnLkRMU0VudHJ5W2ldLlZhbGlkCT0gRkFMU0U7Ci0JCQkJCQkJUlRNUFNlbmRETFNUZWFyRG93bkZyYW1lKHBBZCwgcEFkLT5TdGFDZmcuRExTRW50cnlbaV0uTWFjQWRkcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoIlNldDo6UlRfT0lEXzgwMl8xMV9TRVRfRExTICg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU06Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihSVF84MDJfMTFfRExTX1VJKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVJUXzgwMl8xMV9ETFMJRGxzOwotCi0JCQkJTmRpc1plcm9NZW1vcnkoJkRscywgc2l6ZW9mKFJUXzgwMl8xMV9ETFMpKTsKLQkJCQlSVE1QTW92ZU1lbW9yeSgmRGxzLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoUlRfODAyXzExX0RMU19VSSkpOwotCQkJCU1sbWVFbnF1ZXVlKHBBZCwKLQkJCQkJCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJCQkJCQlSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0sCi0JCQkJCQkJc2l6ZW9mKFJUXzgwMl8xMV9ETFMpLAotCQkJCQkJCSZEbHMpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9ETFNfUEFSQU0gXG4iKSk7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9XTU06Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoCSE9IHNpemVvZihCT09MRUFOKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJewotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF84MDJfMTFfU0VUX1dNTSAoPSVkKQlcbiIsIHBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfRElTQVNTT0NJQVRFOgotCQkJLy8KLQkJCS8vIFNldCBOZGlzUmFkaW9TdGF0ZU9mZiB0bwlUUlVFLCBpbnN0ZWFkIG9mIGNhbGxlZAlNbG1lUmFkaW9PZmYuCi0JCQkvLyBMYXRlciBvbiwgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWC0+TnVtYmVyT2ZJdGVtcyBzaG91bGQgYmUJMAotCQkJLy8gd2hlbglxdWVyeSBPSURfODAyXzExX0JTU0lEX0xJU1QuCi0JCQkvLwotCQkJLy8gVFJVRTogIE51bWJlck9mSXRlbXMJd2lsbCBzZXQgdG8JMC4KLQkJCS8vIEZBTFNFOiBOdW1iZXJPZkl0ZW1zCW5vIGNoYW5nZS4KLQkJCS8vCi0JCQlwQWQtPkNvbW1vbkNmZy5OZGlzUmFkaW9TdGF0ZU9mZiA9CVRSVUU7Ci0JCQkvLyBTZXQgdG8gaW1tZWRpYXRlbHkgc2VuZCB0aGUgbWVkaWEgZGlzY29ubmVjdAlldmVudAotCQkJcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzCT0gVFJVRTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ESVNBU1NPQ0lBVEUJXG4iKSk7Ci0KLQotCQkJaWYgKElORlJBX09OKHBBZCkpCi0JCQl7Ci0JCQkJaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0JQ05UTF9JRExFKQotCQkJCXsKLQkJCQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUJYnVzeSwgcmVzZXQJTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCQkJCX0KLQotCQkJCU1sbWVFbnF1ZXVlKHBBZCwKLQkJCQkJTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0JCQkJCU9JRF84MDJfMTFfRElTQVNTT0NJQVRFLAotCQkJCQkwLAotCQkJCQlOVUxMKTsKLQotCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQJPSBUUlVFOwotCQkJfQotCQkJYnJlYWs7Ci0KLSNpZmRlZiBET1QxMV9OX1NVUFBPUlQKLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9JTU1FX0JBX0NBUDoKLQkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQkFDQVBfU1RSVUMpKQotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCU9JRF9CQUNBUF9TVFJVQyBPcmRlIDsKLQkJCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJk9yZGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJCWlmIChPcmRlLlBvbGljeSA+IEJBX05PVFVTRSkKLQkJCQkJewotCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKE9yZGUuUG9saWN5ID09IEJBX05PVFVTRSkKLQkJCQkJewotCQkJCQkJcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LmZpZWxkLlBvbGljeSA9IEJBX05PVFVTRTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9Qcz0gT3JkZS5NTVBTbW9kZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NTVBTbW9kZSA9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEgPSBPcmRlLkF1dG9CQTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3kgPSBJTU1FRF9CQTsgLy8gd2Ugb25seSBzdXBwb3J0IGltbWVkaWF0ZSBCQS4KLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5NcGR1RGVuc2l0eSA9IE9yZGUuTXBkdURlbnNpdHk7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkgPSBPcmRlLk1wZHVEZW5zaXR5OwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5LkFtc2R1RW5hYmxlID0gT3JkZS5BbXNkdUVuYWJsZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkRlc2lyZWRIdFBoeS5BbXNkdVNpemU9IE9yZGUuQW1zZHVTaXplOwotCQkJCQkJcEFkLT5Db21tb25DZmcuRGVzaXJlZEh0UGh5Lk1pbW9QcyA9IE9yZGUuTU1QU21vZGU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuTU1QU21vZGUgPSBPcmRlLk1NUFNtb2RlOwotCi0JCQkJCQkvLyBVUGRhdGEgdG8gSFQgSUUKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uTWltb1BzID0gT3JkZS5NTVBTbW9kZTsKLQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkh0Q2FwYWJpbGl0eS5IdENhcEluZm8uQU1zZHVTaXplID0gT3JkZS5BbXNkdVNpemU7Ci0JCQkJCQlwQWQtPkNvbW1vbkNmZy5IdENhcGFiaWxpdHkuSHRDYXBQYXJtLk1wZHVEZW5zaXR5ID0gT3JkZS5NcGR1RGVuc2l0eTsKLQotCQkJCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPiBNQVhfUlhfUkVPUkRFUkJVRikKLQkJCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0ID0gTUFYX1JYX1JFT1JERVJCVUY7Ci0KLQkJCQkJfQotCi0JCQkJCXBBZC0+Q29tbW9uQ2ZnLlJFR0JBQ2FwYWJpbGl0eS53b3JkID0gcEFkLT5Db21tb25DZmcuQkFDYXBhYmlsaXR5LndvcmQ7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6KE9yZGUuQXV0b0JBID0gJWQpIChQb2xpY3k9JWQpKFJlQkFXaW5MaW1pdD0lZCkoVHhCQVdpbkxpbWl0PSVkKShBdXRvTW9kZT0lZClcbiIsT3JkZS5BdXRvQkEsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5Qb2xpY3ksCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5CQUNhcGFiaWxpdHkuZmllbGQuUnhCQVdpbkxpbWl0LHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5UeEJBV2luTGltaXQsIHBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5BdXRvQkEpKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjooTWltb1BzID0gJWQpKEFtc2R1RW5hYmxlID0gJWQpIChBbXNkdVNpemU9JWQpKE1wZHVEZW5zaXR5PSVkKVxuIixwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTWltb1BzLCBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVFbmFibGUsCi0JCQkJCQlwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuQW1zZHVTaXplLCBwQWQtPkNvbW1vbkNmZy5EZXNpcmVkSHRQaHkuTXBkdURlbnNpdHkpKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJY2FzZSBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIFNldCA6OiBSVF9PSURfODAyXzExX0FERF9JTU1FX0JBIFxuIikpOwotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoT0lEX0FERF9CQV9FTlRSWSkpCi0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJVUNIQVIJCSAgICAgICAgaW5kZXg7Ci0JCQkJT0lEX0FERF9CQV9FTlRSWSAgICBCQTsKLQkJCQlNQUNfVEFCTEVfRU5UUlkgICAgICpwRW50cnk7Ci0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmQkEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJaWYgKEJBLlRJRCA+IDE1KQotCQkJCXsKLQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy9CQVRhYmxlSW5zZXJ0RW50cnkKLQkJCQkJLy9BcyBhZC1ob2MgbW9kZSwgQkEgcGFpciBpcyBub3QgbGltaXRlZCB0byBvbmx5IEJTU0lELiBzbyBhZGQgdmlhIE9JRC4KLQkJCQkJaW5kZXggPSBCQS5USUQ7Ci0JCQkJCS8vIGluIGFkIGhvYyBtb2RlLCB3aGVuIGFkZGluZyBCQSBwYWlyLCB3ZSBzaG91bGQgaW5zZXJ0IHRoaXMgZW50cnkgaW50byBNQUNFbnRyeSB0b28KLQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBCQS5NQUNBZGRyKTsKLQkJCQkJaWYgKCFwRW50cnkpCi0JCQkJCXsKLQkJCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlJUX09JRF84MDJfMTFfQUREX0lNTUVfQkEuIGJyZWFrIG9uIG5vIGNvbm5lY3Rpb24uLS0tLToleDoleFxuIiwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKEJBLklzUmVjaXBpZW50ID09IEZBTFNFKQotCQkJCQl7Ci0JCQkJCSAgICBpZiAocEVudHJ5LT5iSUFtQmFkQXRoZXJvcyA9PSBUUlVFKQotCQkJCQkJCXBBZC0+Q29tbW9uQ2ZnLkJBQ2FwYWJpbGl0eS5maWVsZC5SeEJBV2luTGltaXQgPSAweDEwOwotCi0JCQkJCQlCQU9yaVNlc3Npb25TZXRVcChwQWQsIHBFbnRyeSwgaW5kZXgsIDAsIDEwMCwgVFJVRSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvL0JBVGFibGVJbnNlcnRFbnRyeShwQWQsIHBFbnRyeS0+QWlkLCBCQS5NQUNBZGRyLCAwLCAweGZmZmYsIEJBLlRJRCwgQkEubk1TRFUsIEJBLklzUmVjaXBpZW50KTsKLQkJCQkJfQotCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6UlRfT0lEXzgwMl8xMV9BRERfSU1NRV9CQS4gUmVjID0gJWQuIE1hYyA9ICV4OiV4OiV4OiV4OiV4OiV4IC4gXG4iLAotCQkJCQkJQkEuSXNSZWNpcGllbnQsIEJBLk1BQ0FkZHJbMF0sIEJBLk1BQ0FkZHJbMV0sIEJBLk1BQ0FkZHJbMl0sIEJBLk1BQ0FkZHJbMl0KLQkJCQkJCSwgQkEuTUFDQWRkcls0XSwgQkEuTUFDQWRkcls1XSkpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkE6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogUlRfT0lEXzgwMl8xMV9URUFSX0lNTUVfQkEgXG4iKSk7Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihPSURfQUREX0JBX0VOVFJZKSkKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlQT0lEX0FERF9CQV9FTlRSWQlwQkE7Ci0JCQkJTUFDX1RBQkxFX0VOVFJZICpwRW50cnk7Ci0KLQkJCQlwQkEgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JCQkJaWYgKHBCQSA9PSBOVUxMKQotCQkJCXsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBIGttYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5XG4iKSk7Ci0JCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX0ZBSUxVUkU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBCQSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IFJUX09JRF84MDJfMTFfVEVBUl9JTU1FX0JBKFRJRD0lZCwgYkFsbFRpZD0lZClcbiIsIHBCQS0+VElELCBwQkEtPmJBbGxUaWQpKTsKLQotCQkJCQlpZiAoIXBCQS0+YkFsbFRpZCAmJiAocEJBLT5USUQgPiBOVU1fT0ZfVElEKSkKLQkJCQkJewotCQkJCQkJU3RhdHVzID0gTkRJU19TVEFUVVNfSU5WQUxJRF9EQVRBOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlpZiAocEJBLT5Jc1JlY2lwaWVudCA9PSBGQUxTRSkKLQkJCQkJewotCQkJCQkJcEVudHJ5ID0gTWFjVGFibGVMb29rdXAocEFkLCBwQkEtPk1BQ0FkZHIpOwotCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+SXNSZWNpcGllbnQgPT0gRkFMU0VcbiIpKTsKLQkJCQkJCWlmIChwRW50cnkpCi0JCQkJCQl7Ci0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIHBCQS0+cEVudHJ5XG4iKSk7Ci0JCQkJCQkJQkFPcmlTZXNzaW9uVGVhckRvd24ocEFkLCBwRW50cnktPkFpZCwgcEJBLT5USUQsIEZBTFNFLCBUUlVFKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQgOjogTm90IGZvdW5kIHBFbnRyeSBcbiIpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXBFbnRyeSA9IE1hY1RhYmxlTG9va3VwKHBBZCwgcEJBLT5NQUNBZGRyKTsKLQkJCQkJCWlmIChwRW50cnkpCi0JCQkJCQl7Ci0JCQkJCQkJQkFSZWNTZXNzaW9uVGVhckRvd24oIHBBZCwgKFVDSEFSKXBFbnRyeS0+QWlkLCBwQkEtPlRJRCwgVFJVRSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0IDo6IE5vdCBmb3VuZCBwRW50cnkgXG4iKSk7Ci0JCQkJCX0KLQkJCQkJa2ZyZWUocEJBKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLQotICAgICAgICAvLyBGb3IgV1BBX1NVUFBMSUNBTlQgdG8gc2V0IHN0YXRpYyB3ZXAga2V5Ci0JY2FzZSBPSURfODAyXzExX0FERF9XRVA6Ci0JICAgIHBXZXBLZXkgPSBrbWFsbG9jKHdycS0+dS5kYXRhLmxlbmd0aCwgTUVNX0FMTE9DX0ZMQUcpOwotCi0JICAgIGlmKHBXZXBLZXkgPT0gTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9BRERfV0VQLCBGYWlsZWQhIVxuIikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdlcEtleSwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChTdGF0dXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0FERF9XRVAsIEZhaWxlZCAobGVuZ3RoIG1pc21hdGNoKSEhXG4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0JCSAgICAgICAgS2V5SWR4ID0gcFdlcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOwotICAgICAgICAgICAgICAgIC8vIEtleUlkeCBtdXN0IGJlIDAgfiAzCi0gICAgICAgICAgICAgICAgaWYgKEtleUlkeCA+IDQpCi0JCQl7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgRmFpbGVkIChLZXlJZHggbXVzdCBiZSBzbWFsbGVyIHRoYW4gNCkhIVxuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVQ0hBUiBDaXBoZXJBbGcgPSAwOwotICAgICAgICAgICAgICAgICAgICBQVUNIQVIgS2V5OwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNldCBrZXkgbWF0ZXJpYWwgYW5kIGtleSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5LZXksICZwV2VwS2V5LT5LZXlNYXRlcmlhbCwgcFdlcEtleS0+S2V5TGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocFdlcEtleS0+S2V5TGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCwgb25seSBzdXBwb3J0IENJUEhFUl9XRVA2NChsZW46NSkgJiBDSVBIRVJfV0VQMTI4KGxlbjoxMykhIVxuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TaGFyZWRLZXlbQlNTMF1bS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotICAgICAgICAgICAgICAgICAgICBpZiAocFdlcEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGtleSBtYXRlcmlhbCBhbmQga2V5IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5W0tleUlkeF0uS2V5LCAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5LZXlMZW4gPSAoVUNIQVIpIHBXZXBLZXktPktleUxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBBZC0+U3RhQ2ZnLkRlc2lyZVNoYXJlZEtleVtLZXlJZHhdLktleSwgJnBXZXBLZXktPktleU1hdGVyaWFsLCBwV2VwS2V5LT5LZXlMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVzaXJlU2hhcmVkS2V5SWQgPSBLZXlJZHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5EZXNpcmVTaGFyZWRLZXlbS2V5SWR4XS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkID0gKFVDSEFSKSBLZXlJZHg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQKLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgIT0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRSkgJiYKLQkJCQkJCShwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpKQotCQkJCQl7Ci0JCQkJCQlLZXkgPSBwV2VwS2V5LT5LZXlNYXRlcmlhbDsKLQotCQkJCQkJLy8gU2V0IEdyb3VwIGtleSBtYXRlcmlhbCB0byBBc2ljCi0JCQkJCUFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBLZXksIE5VTEwsIE5VTEwpOwotCi0JCQkJCQkvLyBVcGRhdGUgV0NJRCBhdHRyaWJ1dGUgdGFibGUgYW5kIElWRUlWIHRhYmxlIGZvciB0aGlzIGdyb3VwIGtleSB0YWJsZQotCQkJCQkJUlRNUEFkZFdjaWRBdHRyaWJ1dGVFbnRyeShwQWQsIEJTUzAsIEtleUlkeCwgQ2lwaGVyQWxnLCBOVUxMKTsKLQotCQkJCQkJU1RBX1BPUlRfU0VDVVJFRChwQWQpOwotCi0JCQkJCS8vIEluZGljYXRlIENvbm5lY3RlZCBmb3IgR1VJCi0JCQkJCXBBZC0+SW5kaWNhdGVNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQgPT0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQpCi0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBwQWQtPlNoYXJlZEtleVtCU1MwXVtLZXlJZHhdLktleTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGtleSBtYXRlcmlhbCBhbmQgY2lwaGVyQWxnIHRvIEFzaWMKLQkJCQkJQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZCwgQlNTMCwgS2V5SWR4LCBDaXBoZXJBbGcsIEtleSwgTlVMTCwgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwV2VwS2V5LT5LZXlJbmRleCAmIDB4ODAwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gZ3JvdXAga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgTlVMTCk7Ci0JCQkJCQkvLyBBc3NpZ24gcGFpcndpc2Uga2V5IGluZm8KLQkJCQkJCVJUTVBBZGRXY2lkQXR0cmlidXRlRW50cnkocEFkLCBCU1MwLCBLZXlJZHgsIENpcGhlckFsZywgcEVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfQUREX1dFUCAoaWQ9MHgleCwgTGVuPSVkLWJ5dGUpLCAlc1xuIiwgcFdlcEtleS0+S2V5SW5kZXgsIHBXZXBLZXktPktleUxlbmd0aCwgKHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID09IFdQQV84MDJfMVhfUE9SVF9TRUNVUkVEKSA/ICJQb3J0IFNlY3VyZWQiOiJQb3J0IE5PVCBTZWN1cmVkIikpOwotCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGtmcmVlKHBXZXBLZXkpOwotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotCSAgICBjYXNlIE9JRF9TRVRfQ09VTlRFUk1FQVNVUkVTOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoaW50KSkKLSAgICAgICAgICAgICAgICBTdGF0dXMgID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmVuYWJsZWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgcEFkLT5TdGFDZmcuYkJsb2NrQXNzb2MgPSBUUlVFOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gV1BBIE1JQyBlcnJvciBzaG91bGQgYmxvY2sgYXNzb2NpYXRpb24gYXR0ZW1wdCBmb3IgNjAgc2Vjb25kcwotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5iQmxvY2tBc3NvYyA9IEZBTFNFOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEX1NFVF9DT1VOVEVSTUVBU1VSRVMgYkJsb2NrQXNzb2M9JXNcbiIsIHBBZC0+U3RhQ2ZnLmJCbG9ja0Fzc29jID8gIlRSVUUiOiJGQUxTRSIpKTsKLSAgICAgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZ3cGFfc3VwcGxpY2FudF9lbmFibGUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSB3cGFfc3VwcGxpY2FudF9lbmFibGU7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKLQkJCX0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfREVBVVRIRU5USUNBVElPTjoKLSAgICAgICAgICAgIGlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1MTUVfREVBVVRIX1JFUV9TVFJVQ1QgICAgICAqcEluZm87Ci0JCU1MTUVfUVVFVUVfRUxFTSAqTXNnRWxlbSA9IChNTE1FX1FVRVVFX0VMRU0gKikga21hbGxvYyhzaXplb2YoTUxNRV9RVUVVRV9FTEVNKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgICAgIGlmIChNc2dFbGVtID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotCQkJREJHUFJJTlQoUlRfREVCVUdfRVJST1IsICgiJXMoKTphbGxvYyBtZW1vcnkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwSW5mbyA9IChNTE1FX0RFQVVUSF9SRVFfU1RSVUNUICopIE1zZ0VsZW0tPk1zZzsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwSW5mbywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBNbG1lRGVhdXRoUmVxQWN0aW9uKHBBZCwgTXNnRWxlbSk7Ci0JCQkJa2ZyZWUoTXNnRWxlbSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoSU5GUkFfT04ocEFkKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpbmtEb3duKHBBZCwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICBwQWQtPk1sbWUuQXNzb2NNYWNoaW5lLkN1cnJTdGF0ZSA9IEFTU09DX0lETEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9ERUFVVEhFTlRJQ0FUSU9OIChSZWFzb249JWQpXG4iLCBwSW5mby0+UmVhc29uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0RST1BfVU5FTkNSWVBURUQ6Ci0gICAgICAgICAgICBpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihpbnQpKQotICAgICAgICAgICAgICAgIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmZW5hYmxlZCwgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSAxKQotICAgICAgICAgICAgICAgICAgICBwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHBBZC0+U3RhQ2ZnLlBvcnRTZWN1cmVkID0gV1BBXzgwMl8xWF9QT1JUX1NFQ1VSRUQ7Ci0JCQkJTmRpc0FjcXVpcmVTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLQkJCQlwQWQtPk1hY1RhYi5Db250ZW50W0JTU0lEX1dDSURdLlBvcnRTZWN1cmVkID0gcEFkLT5TdGFDZmcuUG9ydFNlY3VyZWQ7Ci0JCQkJTmRpc1JlbGVhc2VTcGluTG9jaygmcEFkLT5NYWNUYWJMb2NrKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfRFJPUF9VTkVOQ1JZUFRFRCAoPSVkKVxuIiwgZW5hYmxlZCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYOgotICAgICAgICAgICAgaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklFRUU4MDIxeFN0YXRlLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkgICAgICAgIHBBZC0+U3RhQ2ZnLklFRUU4MDIxWCA9IElFRUU4MDIxeFN0YXRlOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYICg9JWQpXG4iLCBJRUVFODAyMXhTdGF0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCi0JCQkJIFN0YXR1cyAgPSAtRUlOVkFMOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJRUVFODAyMXhfcmVxdWlyZWRfa2V5cywgd3JxLT51LmRhdGEucG9pbnRlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCQlwQWQtPlN0YUNmZy5JRUVFODAyMXhfcmVxdWlyZWRfa2V5cyA9IElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9TRVRfSUVFRTgwMjFYX1JFUVVJUkVfS0VZICglZClcbiIsIElFRUU4MDIxeF9yZXF1aXJlZF9rZXlzKSk7Ci0JCQl9Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1BNS0lEOgotCSAgICAgICAgcFBta0lkID0ga21hbGxvYyh3cnEtPnUuZGF0YS5sZW5ndGgsIE1FTV9BTExPQ19GTEFHKTsKLQotCSAgICAgICAgaWYocFBta0lkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PTUVNOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFBta0lkLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JICAgICAgICAvLyBjaGVjayB0aGUgUE1LSUQgaW5mb3JtYXRpb24KLQkgICAgICAgIGlmIChwUG1rSWQtPkJTU0lESW5mb0NvdW50ID09IDApCi0gICAgICAgICAgICAgICAgTmRpc1plcm9NZW1vcnkocEFkLT5TdGFDZmcuU2F2ZWRQTUssIHNpemVvZihCU1NJRF9JTkZPKSpQTUtJRF9OTyk7Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JCSAgICAgICAgUEJTU0lEX0lORk8JcEJzc0lkSW5mbzsKLQkJICAgICAgICBVSU5UCQlCc3NJZHg7Ci0JCSAgICAgICAgVUlOVAkJQ2FjaGVkSWR4OwotCi0JCSAgICAgICAgZm9yIChCc3NJZHggPSAwOyBCc3NJZHggPCBwUG1rSWQtPkJTU0lESW5mb0NvdW50OyBCc3NJZHgrKykKLQkJICAgICAgICB7Ci0JCQkgICAgICAgIC8vIHBvaW50IHRvIHRoZSBpbmRleGVkIEJTU0lEX0lORk8gc3RydWN0dXJlCi0JCQkgICAgICAgIHBCc3NJZEluZm8gPSAoUEJTU0lEX0lORk8pICgoUFVDSEFSKSBwUG1rSWQgKyAyICogc2l6ZW9mKFVJTlQpICsgQnNzSWR4ICogc2l6ZW9mKEJTU0lEX0lORk8pKTsKLQkJCSAgICAgICAgLy8gRmluZCB0aGUgZW50cnkgaW4gdGhlIHNhdmVkIGRhdGEgYmFzZS4KLQkJCSAgICAgICAgZm9yIChDYWNoZWRJZHggPSAwOyBDYWNoZWRJZHggPCBwQWQtPlN0YUNmZy5TYXZlZFBNS051bTsgQ2FjaGVkSWR4KyspCi0JCQkgICAgICAgIHsKLQkJCQkgICAgICAgIC8vIGNvbXBhcmUgdGhlIEJTU0lECi0JCQkJICAgICAgICBpZiAoTmRpc0VxdWFsTWVtb3J5KHBCc3NJZEluZm8tPkJTU0lELCBwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLkJTU0lELCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKSkKLQkJCQkJICAgICAgICBicmVhazsKLQkJCSAgICAgICAgfQotCi0JCQkgICAgICAgIC8vIEZvdW5kLCByZXBsYWNlIGl0Ci0JCQkgICAgICAgIGlmIChDYWNoZWRJZHggPCBQTUtJRF9OTykKLQkJCSAgICAgICAgewotCQkJCSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfT0ZGLCAoIlVwZGF0ZSBPSURfODAyXzExX1BNS0lELCBpZHggPSAlZFxuIiwgQ2FjaGVkSWR4KSk7Ci0JCQkJICAgICAgICBOZGlzTW92ZU1lbW9yeSgmcEFkLT5TdGFDZmcuU2F2ZWRQTUtbQ2FjaGVkSWR4XSwgcEJzc0lkSW5mbywgc2l6ZW9mKEJTU0lEX0lORk8pKTsKLQkJCQkgICAgICAgIHBBZC0+U3RhQ2ZnLlNhdmVkUE1LTnVtKys7Ci0JCQkgICAgICAgIH0KLQkJCSAgICAgICAgLy8gTm90IGZvdW5kLCByZXBsYWNlIHRoZSBsYXN0IG9uZQotCQkJICAgICAgICBlbHNlCi0JCQkgICAgICAgIHsKLQkJCQkgICAgICAgIC8vIFJhbmRvbWx5IHJlcGxhY2Ugb25lCi0JCQkJICAgICAgICBDYWNoZWRJZHggPSAocEJzc0lkSW5mby0+QlNTSURbNV0gJSBQTUtJRF9OTyk7Ci0JCQkJICAgICAgICBEQkdQUklOVChSVF9ERUJVR19PRkYsICgiVXBkYXRlIE9JRF84MDJfMTFfUE1LSUQsIGlkeCA9ICVkXG4iLCBDYWNoZWRJZHgpKTsKLQkJCQkgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQWQtPlN0YUNmZy5TYXZlZFBNS1tDYWNoZWRJZHhdLCBwQnNzSWRJbmZvLCBzaXplb2YoQlNTSURfSU5GTykpOwotCQkJICAgICAgICB9Ci0JCSAgICAgICAgfQotCQkJfQotCQkJaWYocFBta0lkKQotCQkJCWtmcmVlKHBQbWtJZCk7Ci0JICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBXUEFfU1VQUExJQ0FOVF9TVVBQT1JUIC8vCi0KLQotCi0jaWZkZWYgU05NUF9TVVBQT1JUCi0JCWNhc2UgT0lEXzgwMl8xMV9TSE9SVFJFVFJZTElNSVQ6Ci0JCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IHNpemVvZihVTE9ORykpCi0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCXsKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmU2hvcnRSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JCQkJdHhfcnR5X2NmZy5maWVsZC5TaG9ydFJ0eUxpbWl0ID0gU2hvcnRSZXRyeUxpbWl0OwotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWQsIFRYX1JUWV9DRkcsIHR4X3J0eV9jZmcud29yZCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1NIT1JUUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5TaG9ydFJldHJ5TGltaXQ9JWQsIFNob3J0UmV0cnlMaW1pdD0lbGQpXG4iLCB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQsIFNob3J0UmV0cnlMaW1pdCkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0xPTkdSRVRSWUxJTUlUIFxuIikpOwotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUxPTkcpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JCQkJdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQgPSBMb25nUmV0cnlMaW1pdDsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkLCBUWF9SVFlfQ0ZHLCB0eF9ydHlfY2ZnLndvcmQpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCAodHhfcnR5X2NmZy5maWVsZC5Mb25nUmV0cnlMaW1pdD0gJWQsTG9uZ1JldHJ5TGltaXQ9JWxkKVxuIiwgdHhfcnR5X2NmZy5maWVsZC5Mb25nUnR5TGltaXQsIExvbmdSZXRyeUxpbWl0KSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX1dFUERFRkFVTFRLRVlWQUxVRVxuIikpOwotCQkJcEtleSA9IGttYWxsb2Mod3JxLT51LmRhdGEubGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKHBLZXksIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkvL3BLZXkgPSAmV2VwS2V5OwotCi0JCQlpZiAoIHBLZXktPkxlbmd0aCAhPSB3cnEtPnUuZGF0YS5sZW5ndGgpCi0JCQl7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXQ6Ok9JRF84MDJfMTFfV0VQREVGQVVMVEtFWVZBTFVFLCBGYWlsZWQhIVxuIikpOwotCQkJfQotCQkJS2V5SWR4ID0gcEtleS0+S2V5SW5kZXggJiAweDBmZmZmZmZmOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJwS2V5LT5LZXlJbmRleCA9JWQsIHBLZXktPktleUxlbmd0aD0lZFxuIiwgcEtleS0+S2V5SW5kZXgsIHBLZXktPktleUxlbmd0aCkpOwotCi0JCQkvLyBpdCBpcyBhIHNoYXJlZCBrZXkKLQkJCWlmIChLZXlJZHggPiA0KQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXlMZW4gPSAoVUNIQVIpIHBLZXktPktleUxlbmd0aDsKLQkJCQlOZGlzTW92ZU1lbW9yeSgmcEFkLT5TaGFyZWRLZXlbQlNTMF1bcEFkLT5TdGFDZmcuRGVmYXVsdEtleUlkXS5LZXksICZwS2V5LT5LZXlNYXRlcmlhbCwgcEtleS0+S2V5TGVuZ3RoKTsKLQkJCQlpZiAocEtleS0+S2V5SW5kZXggJiAweDgwMDAwMDAwKQotCQkJCXsKLQkJCQkJLy8gRGVmYXVsdCBrZXkgZm9yIHR4IChzaGFyZWQga2V5KQotCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQgPSAoVUNIQVIpIEtleUlkeDsKLQkJCQl9Ci0JCQkJLy9SZXN0YXJ0QVBJc1JlcXVpcmVkID0gVFJVRTsKLQkJCX0KLQkJCWJyZWFrOwotCi0KLQkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldDo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZSUQgXG4iKSk7Ci0KLQkJCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gc2l6ZW9mKFVDSEFSKSkKLQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJZWxzZQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQkJCWJyZWFrOwotCi0KLQkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0OjpPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMIFxuIikpOwotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoVUNIQVIpKQotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJmN0bXAsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJc3ByaW50ZigoUFNUUklORykmY3RtcCwiJWQiLCBjdG1wKTsKLQkJCQlTZXRfQ2hhbm5lbF9Qcm9jKHBBZCwgKFBTVFJJTkcpJmN0bXApOwotCQkJfQotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCi0KLQkJY2FzZSBSVF9PSURfODAyXzExX1NFVF9QU1BYTElOS19NT0RFOgotCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCAhPSBzaXplb2YoQk9PTEVBTikpCi0gICAgICAgICAgICAgICAgU3RhdHVzICA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJnBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rLCB3cnEtPnUuZGF0YS5wb2ludGVyLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCS8qaWYgKHBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rKQotCQkJCQlSWF9GSUxURVJfU0VUX0ZMQUcocEFkLCBmUlhfRklMVEVSX0FDQ0VQVF9QUk9NSVNDVU9VUykqLwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiU2V0OjpSVF9PSURfODAyXzExX1NFVF9QU1BYTElOS19NT0RFKD0lZCkgXG4iLCBwQWQtPkNvbW1vbkNmZy5QU1BYbGluaykpOwotICAgICAgICAgICAgfQotCQkJYnJlYWs7Ci0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gU3RhdHVzOwotfQotCi1JTlQgUlRNUFF1ZXJ5SW5mb3JtYXRpb24oCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgcEFkLAotICAgIElOICBPVVQgc3RydWN0IGlmcmVxICAgICpycSwKLSAgICBJTiAgSU5UICAgICAgICAgICAgICAgICBjbWQpCi17Ci0gICAgc3RydWN0IGl3cmVxICAgICAgICAgICAgICAgICAgICAgICAgKndycSA9IChzdHJ1Y3QgaXdyZXEgKikgcnE7Ci0gICAgTkRJU184MDJfMTFfQlNTSURfTElTVF9FWCAgICAgICAgICAgKnBCc3NpZExpc3QgPSBOVUxMOwotICAgIFBORElTX1dMQU5fQlNTSURfRVggICAgICAgICAgICAgICAgIHBCc3M7Ci0gICAgTkRJU184MDJfMTFfU1NJRCAgICAgICAgICAgICAgICAgICAgU3NpZDsKLSAgICBORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICAgICAgICAgICAqcENvbmZpZ3VyYXRpb24gPSBOVUxMOwotICAgIFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAgICAgICAgICAgICAgICpwTGlua1N0YXR1cyA9IE5VTEw7Ci0gICAgUlRfODAyXzExX1NUQV9DT05GSUcgICAgICAgICAgICAgICAgKnBTdGFDb25maWcgPSBOVUxMOwotICAgIE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICpwU3RhdGlzdGljcyA9IE5VTEw7Ci0gICAgTkRJU184MDJfMTFfUlRTX1RIUkVTSE9MRCAgICAgICAgICAgUnRzVGhyZXNoOwotICAgIE5ESVNfODAyXzExX0ZSQUdNRU5UQVRJT05fVEhSRVNIT0xEIEZyYWdUaHJlc2g7Ci0gICAgTkRJU184MDJfMTFfUE9XRVJfTU9ERSAgICAgICAgICAgICAgUG93ZXJNb2RlOwotICAgIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgIEJzc1R5cGU7Ci0gICAgUlRfODAyXzExX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgUHJlYW1UeXBlOwotICAgIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgICAgIEF1dGhNb2RlOwotICAgIE5ESVNfODAyXzExX1dFUF9TVEFUVVMgICAgICAgICAgICAgIFdlcFN0YXR1czsKLSAgICBORElTX01FRElBX1NUQVRFICAgICAgICAgICAgICAgICAgICBNZWRpYVN0YXRlOwotICAgIFVMT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUsIHVsSW5mbz0wLCBOZXR3b3JrVHlwZUxpc3RbNF0sIGFwc2QgPSAwOwotICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJzc0xlbiA9IDA7Ci0gICAgUFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZiA9IE5VTEwsIHBQdHI7Ci0gICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzID0gTkRJU19TVEFUVVNfU1VDQ0VTUzsKLSAgICBVSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIFBhZGRpbmcgPSAwOwotICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU3RhdGU7Ci0JU1RSSU5HCQkJCQkJCQlkcml2ZXJWZXJzaW9uWzhdOwotICAgIE9JRF9TRVRfSFRfUEhZTU9ERQkJCSAgICAgICAgKnBIVFBoeU1vZGUgPSBOVUxMOwotCi0KLSNpZmRlZiBTTk1QX1NVUFBPUlQKLQkvL2ZvciBzbm1wLCBrYXRoeQotCURlZmF1bHRLZXlJZHhWYWx1ZQkJCSpwS2V5SWR4VmFsdWU7Ci0JSU5UCQkJCQkJCXZhbHVlTGVuOwotCVRYX1JUWV9DRkdfU1RSVUMJCQl0eF9ydHlfY2ZnOwotCVVMT05HCQkJCQkJU2hvcnRSZXRyeUxpbWl0LCBMb25nUmV0cnlMaW1pdDsKLQlVQ0hBUgkJCQkJCXRtcFs2NF07Ci0jZW5kaWYgLy9TTk1QCi0KLSAgICBzd2l0Y2goY21kKQotICAgIHsKLSAgICAgICAgY2FzZSBSVF9PSURfREVWSUNFX05BTUU6Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YocEFkLT5uaWNrbmFtZSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEFkLT5uaWNrbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF9WRVJTSU9OX0lORk86Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1ZFUlNJT05fSU5GTyBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDgqc2l6ZW9mKENIQVIpOwotCQkJc3ByaW50ZigmZHJpdmVyVmVyc2lvblswXSwgIiVzIiwgU1RBX0RSSVZFUl9WRVJTSU9OKTsKLQkJCWRyaXZlclZlcnNpb25bN10gPSAnXDAnOwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZHJpdmVyVmVyc2lvblswXSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEX0xJU1Q6Ci0gICAgICAgICAgICBpZiAoUlRNUF9URVNUX0ZMQUcocEFkLCBmUlRNUF9BREFQVEVSX0JTU19TQ0FOX0lOX1BST0dSRVNTKSkKLSAgICAgICAgICAgIHsKLQkJLyoKLQkJICogU3RpbGwgc2Nhbm5pbmcsIGluZGljYXRlIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSBhZ2Fpbi4KLQkJICovCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEX0xJU1QgKFN0aWxsIHNjYW5uaW5nKVxuIikpOwotCQkJCXJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlNTSURfTElTVCAoJWQgQlNTIHJldHVybmVkKVxuIixwQWQtPlNjYW5UYWIuQnNzTnIpKTsKLQkJCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLSAgICAgICAgICAgIC8vIENsYWN1bGF0ZSB0b3RhbCBidWZmZXIgc2l6ZSByZXF1aXJlZAotICAgICAgICAgICAgQnNzQnVmU2l6ZSA9IHNpemVvZihVTE9ORyk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwQWQtPlNjYW5UYWIuQnNzTnI7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBbGlnbiBwb2ludGVyIHRvIDQgYnl0ZXMgYm91bmRhcnkuCi0gICAgICAgICAgICAgICAgLy9QYWRkaW5nID0gNCAtIChwQWRhcHRlci0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiAmIDB4MDAwMyk7Ci0gICAgICAgICAgICAgICAgLy9pZiAoUGFkZGluZyA9PSA0KQotICAgICAgICAgICAgICAgIC8vICAgIFBhZGRpbmcgPSAwOwotICAgICAgICAgICAgICAgIEJzc0J1ZlNpemUgKz0gKHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpICsgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlZhcklFTGVuICsgUGFkZGluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvciBzYWZldHkgaXNzdWUsIHdlIGFkZCAyNTYgYnl0ZXMganVzdCBpbiBjYXNlCi0gICAgICAgICAgICBCc3NCdWZTaXplICs9IDI1NjsKLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBzYW1lIHNpemUgYXMgcGFzc2VkIGZyb20gaGlnaGVyIGxheWVyCi0gICAgICAgICAgICBwQnVmID0ga21hbGxvYyhCc3NCdWZTaXplLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZihwQnVmID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEluaXQgODAyXzExX0JTU0lEX0xJU1RfRVggc3RydWN0dXJlCi0gICAgICAgICAgICBOZGlzWmVyb01lbW9yeShwQnVmLCBCc3NCdWZTaXplKTsKLSAgICAgICAgICAgIHBCc3NpZExpc3QgPSAoUE5ESVNfODAyXzExX0JTU0lEX0xJU1RfRVgpIHBCdWY7Ci0gICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gcEFkLT5TY2FuVGFiLkJzc05yOwotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYnVmZmVyIGxlbmd0aAotICAgICAgICAgICAgQnNzTGVuID0gNDsgLy8gQ29uc2lzdCBvZiBOdW1iZXJPZkl0ZW1zCi0gICAgICAgICAgICAvLyBQb2ludCB0byBzdGFydCBvZiBORElTX1dMQU5fQlNTSURfRVgKLSAgICAgICAgICAgIC8vIHBQdHIgPSBwQnVmICsgc2l6ZW9mKFVMT05HKTsKLSAgICAgICAgICAgIHBQdHIgPSAoUFVDSEFSKSAmcEJzc2lkTGlzdC0+QnNzaWRbMF07Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEFkLT5TY2FuVGFiLkJzc05yOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEJzcyA9IChQTkRJU19XTEFOX0JTU0lEX0VYKSBwUHRyOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KCZwQnNzLT5NYWNBZGRyZXNzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc2lkLCBNQUNfQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIGlmICgocEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkhpZGRlbiA9PSAxKSAmJiAocEFkLT5TdGFDZmcuYlNob3dIaWRkZW5TU0lEID09IEZBTFNFKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0JCQkJCS8vIFdlIG11c3QgcmV0dXJuIHRoaXMgU1NJRCBkdXJpbmcgNHdheSBoYW5kc2hha2luZywgb3RoZXJ3aXNlIEFlZ2lzIHdpbGwgZmFpbGVkIHRvIHBhcnNlIFdQQSBpbmZvbWF0aW9uCi0JCQkJCS8vIGFuZCB0aGVuIGZhaWxlZCB0byBzZW5kIEVBUE9sIGZhcmFtZS4KLQkJCQkJLy8KLQkJCQkJaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpICYmIChwQWQtPlN0YUNmZy5Qb3J0U2VjdXJlZCAhPSBXUEFfODAyXzFYX1BPUlRfU0VDVVJFRCkpCi0JCQkJCXsKLQkJCQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOwotCQkJCQkJTmRpc01vdmVNZW1vcnkocEJzcy0+U3NpZC5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZCwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlNzaWRMZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCXBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBCc3MtPlNzaWQuU3NpZExlbmd0aCA9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkTGVuOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5Tc2lkLlNzaWQsIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5Tc2lkLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3NpZExlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBCc3MtPlByaXZhY3kgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uUHJpdmFjeTsKLSAgICAgICAgICAgICAgICBwQnNzLT5Sc3NpID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlJzc2kgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotICAgICAgICAgICAgICAgIHBCc3MtPk5ldHdvcmtUeXBlSW5Vc2UgPSBOZXR3b3JrVHlwZUluVXNlU2FuaXR5KCZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0pOwotICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uTGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pOwotICAgICAgICAgICAgICAgIHBCc3MtPkNvbmZpZ3VyYXRpb24uQmVhY29uUGVyaW9kID0gcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJlYWNvblBlcmlvZDsKLSAgICAgICAgICAgICAgICBwQnNzLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cgPSBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uQXRpbVdpbjsKLQotICAgICAgICAgICAgICAgIE1BUF9DSEFOTkVMX0lEX1RPX0tIWihwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uQ2hhbm5lbCwgcEJzcy0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwQnNzLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKLQotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uU3VwUmF0ZSwgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4pOwotICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPlN1cHBvcnRlZFJhdGVzICsgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLlN1cFJhdGVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkV4dFJhdGVMZW4pOwotCi0gICAgICAgICAgICAgICAgaWYgKHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEJzcy0+SUVMZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKTsKLSAgICAgICAgICAgICAgICAgICAgTmRpc01vdmVNZW1vcnkocEJzcy0+SUVzLCAmcEFkLT5TY2FuVGFiLkJzc0VudHJ5W2ldLkZpeElFcywgc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykpOwotICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQnNzLT5JRUxlbmd0aCA9IChVTE9ORykoc2l6ZW9mKE5ESVNfODAyXzExX0ZJWEVEX0lFcykgKyBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOwotICAgICAgICAgICAgICAgICAgICBwUHRyID0gcFB0ciArIHNpemVvZihORElTX1dMQU5fQlNTSURfRVgpIC0gMSArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpOwotICAgICAgICAgICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShwQnNzLT5JRXMsICZwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uRml4SUVzLCBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIE5kaXNNb3ZlTWVtb3J5KHBCc3MtPklFcyArIHNpemVvZihORElTXzgwMl8xMV9GSVhFRF9JRXMpLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVzLCBwQWQtPlNjYW5UYWIuQnNzRW50cnlbaV0uVmFySUVMZW4pOwotICAgICAgICAgICAgICAgICAgICBwUHRyICs9IHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEJzcy0+TGVuZ3RoID0gKFVMT05HKShzaXplb2YoTkRJU19XTEFOX0JTU0lEX0VYKSAtIDEgKyBzaXplb2YoTkRJU184MDJfMTFfRklYRURfSUVzKSArIHBBZC0+U2NhblRhYi5Cc3NFbnRyeVtpXS5WYXJJRUxlbiArIFBhZGRpbmcpOwotCi0jaWYgV0lSRUxFU1NfRVhUIDwgMTcKLSAgICAgICAgICAgICAgICBpZiAoKEJzc0xlbiArIHBCc3MtPkxlbmd0aCkgPCB3cnEtPnUuZGF0YS5sZW5ndGgpCi0gICAgICAgICAgICAgICAgQnNzTGVuICs9IHBCc3MtPkxlbmd0aDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQnNzaWRMaXN0LT5OdW1iZXJPZkl0ZW1zID0gaTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBCc3NMZW4gKz0gcEJzcy0+TGVuZ3RoOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0KLSNpZiBXSVJFTEVTU19FWFQgPCAxNwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gQnNzTGVuOwotI2Vsc2UKLSAgICAgICAgICAgIGlmIChCc3NMZW4gPiB3cnEtPnUuZGF0YS5sZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FMkJJRzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBCc3NMZW47Ci0jZW5kaWYKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQnNzaWRMaXN0LCBCc3NMZW4pOwotICAgICAgICAgICAga2ZyZWUocEJzc2lkTGlzdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gTUFDX0FERFJfTEVOOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUzoKLSAgICAgICAgICAgIGlmIChwQWQtPkluZGljYXRlTWVkaWFTdGF0ZSA9PSBOZGlzTWVkaWFTdGF0ZUNvbm5lY3RlZCkKLSAgICAgICAgICAgICAgICBNZWRpYVN0YXRlID0gTmRpc01lZGlhU3RhdGVDb25uZWN0ZWQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTWVkaWFTdGF0ZSA9IE5kaXNNZWRpYVN0YXRlRGlzY29ubmVjdGVkOwotCi0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU19NRURJQV9TVEFURSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJk1lZGlhU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0JTU0lEOgotICAgICAgICAgICAgaWYgKElORlJBX09OKHBBZCkgfHwgQURIT0NfT04ocEFkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLkJzc2lkLCBzaXplb2YoTkRJU184MDJfMTFfTUFDX0FERFJFU1MpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0JTU0lEKD1FTVBUWSlcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRU5PVENPTk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1NTSUQ6Ci0JCQlOZGlzWmVyb01lbW9yeSgmU3NpZCwgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpKTsKLQkJCU5kaXNaZXJvTWVtb3J5KFNzaWQuU3NpZCwgTUFYX0xFTl9PRl9TU0lEKTsKLSAgICAgICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHBBZC0+Q29tbW9uQ2ZnLlNzaWRMZW47Ci0JCQltZW1jcHkoU3NpZC5Tc2lkLCBwQWQtPkNvbW1vbkNmZy5Tc2lkLAlTc2lkLlNzaWRMZW5ndGgpOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTc2lkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1NJRCAoTGVuPSVkLCBzc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLFNzaWQuU3NpZCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVUzoKLSAgICAgICAgICAgIHBMaW5rU3RhdHVzID0gKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyAqKSBrbWFsbG9jKHNpemVvZihSVF84MDJfMTFfTElOS19TVEFUVVMpLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZiAocExpbmtTdGF0dXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPkN1cnJUeFJhdGUgPSBSYXRlSWRUbzUwMEticHNbcEFkLT5Db21tb25DZmcuVHhSYXRlXTsgICAvLyB1bml0IDogNTAwIGticHMKLSAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+Q2hhbm5lbFF1YWxpdHkgPSBwQWQtPk1sbWUuQ2hhbm5lbFF1YWxpdHk7Ci0gICAgICAgICAgICAgICAgcExpbmtTdGF0dXMtPlJ4Qnl0ZUNvdW50ID0gcEFkLT5SYWxpbmtDb3VudGVycy5SZWNlaXZlZEJ5dGVDb3VudDsKLSAgICAgICAgICAgICAgICBwTGlua1N0YXR1cy0+VHhCeXRlQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlRyYW5zbWl0dGVkQnl0ZUNvdW50OwotCQkJcExpbmtTdGF0dXMtPkNlbnRyYWxDaGFubmVsID0gcEFkLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWw7Ci0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9MSU5LX1NUQVRVUyk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBMaW5rU3RhdHVzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGtmcmVlKHBMaW5rU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MSU5LX1NUQVRVU1xuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0xJTktfU1RBVFVTKGttYWxsb2MgZmFpbGVkKVxuIikpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX0NPTkZJR1VSQVRJT046Ci0gICAgICAgICAgICBwQ29uZmlndXJhdGlvbiA9IChORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OICopIGttYWxsb2Moc2l6ZW9mKE5ESVNfODAyXzExX0NPTkZJR1VSQVRJT04pLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZiAocENvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENvbmZpZ3VyYXRpb24tPkxlbmd0aCA9IHNpemVvZihORElTXzgwMl8xMV9DT05GSUdVUkFUSU9OKTsKLSAgICAgICAgICAgICAgICBwQ29uZmlndXJhdGlvbi0+QmVhY29uUGVyaW9kID0gcEFkLT5Db21tb25DZmcuQmVhY29uUGVyaW9kOwotICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93ID0gcEFkLT5TdGFBY3RpdmUuQXRpbVdpbjsKLSAgICAgICAgICAgICAgICBNQVBfQ0hBTk5FTF9JRF9UT19LSFoocEFkLT5Db21tb25DZmcuQ2hhbm5lbCwgcENvbmZpZ3VyYXRpb24tPkRTQ29uZmlnKTsKLSAgICAgICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoTkRJU184MDJfMTFfQ09ORklHVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDb25maWd1cmF0aW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oQmVhY29uUGVyaW9kPSVsZCxBdGltVz0lbGQsQ2hhbm5lbD0lZCkgXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWd1cmF0aW9uLT5CZWFjb25QZXJpb2QsIHBDb25maWd1cmF0aW9uLT5BVElNV2luZG93LCBwQWQtPkNvbW1vbkNmZy5DaGFubmVsKSk7Ci0JCQkJa2ZyZWUocENvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0NPTkZJR1VSQVRJT04oa21hbGxvYyBmYWlsZWQpXG4iKSk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gLUVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzA6Ci0JCQlpZiAoKHBBZC0+U3RhQ2ZnLkxhc3RTTlIwID4gMCkpCi0JCQl7Ci0JCQkJdWxJbmZvID0gKCgweGViCS0gcEFkLT5TdGFDZmcuTGFzdFNOUjApICogMykgLwkxNiA7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzAoMHg9JWx4KVxuIiwgdWxJbmZvKSk7Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlCi0JCQkgICAgU3RhdHVzID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfU05SXzE6Ci0JCQlpZiAoKHBBZC0+QW50ZW5uYS5maWVsZC5SeFBhdGgJPiAxKSAmJgotICAgICAgICAgICAgICAgIChwQWQtPlN0YUNmZy5MYXN0U05SMSA+IDApKQotCQkJewotCQkJCXVsSW5mbyA9ICgoMHhlYgktIHBBZC0+U3RhQ2ZnLkxhc3RTTlIxKSAqIDMpIC8JMTYgOwotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgiUXVlcnk6OlJUX09JRF84MDJfMTFfU05SXzEoMHg9JWx4KVxuIix1bEluZm8pKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TTlJfMShwQWQtPlN0YUNmZy5MYXN0U05SMT0lZClcbiIscEFkLT5TdGFDZmcuTGFzdFNOUjEpKTsKLQkJCWJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfUlNTSV9UUklHR0VSOgotICAgICAgICAgICAgdWxJbmZvID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTAgLSBwQWQtPkJicFJzc2lUb0RibURlbHRhOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JTU0lfVFJJR0dFUig9JWxkKVxuIiwgdWxJbmZvKSk7Ci0gICAgICAgICAgICBicmVhazsKLQkJY2FzZSBPSURfODAyXzExX1JTU0k6Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJOgotCQkJdWxJbmZvID0gcEFkLT5TdGFDZmcuUnNzaVNhbXBsZS5MYXN0UnNzaTA7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9SU1NJXzE6Ci0gICAgICAgICAgICB1bEluZm8gPSBwQWQtPlN0YUNmZy5Sc3NpU2FtcGxlLkxhc3RSc3NpMTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sCXdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1JTU0lfMjoKLSAgICAgICAgICAgIHVsSW5mbyA9IHBBZC0+U3RhQ2ZnLlJzc2lTYW1wbGUuTGFzdFJzc2kyOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywJd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotICAgICAgICBjYXNlIE9JRF84MDJfMTFfU1RBVElTVElDUzoKLSAgICAgICAgICAgIHBTdGF0aXN0aWNzID0gKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MgKikga21hbGxvYyhzaXplb2YoTkRJU184MDJfMTFfU1RBVElTVElDUyksIE1FTV9BTExPQ19GTEFHKTsKLSAgICAgICAgICAgIGlmIChwU3RhdGlzdGljcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9TVEFUSVNUSUNTIFxuIikpOwotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9zdCB1cC10by1kYXRlIGgvdyByYXcgY291bnRlcnMgaW50byBzb2Z0d2FyZSBjb3VudGVycwotCQkJICAgIE5JQ1VwZGF0ZVJhd0NvdW50ZXJzKHBBZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGNhbGN1bGF0aW9uIG9mIHN1Y2Vzc2Z1bCBjb3VudAotICAgICAgICAgICAgICAgIGlmIChwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPCBwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0KQotICAgICAgICAgICAgICAgICAgICBwQWQtPldsYW5Db3VudGVycy5UcmFuc21pdHRlZEZyYWdtZW50Q291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5SZXRyeUNvdW50LlF1YWRQYXJ0OwotCi0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlRyYW5zbWl0dGVkRnJhZ21lbnRDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGljYXN0VHJhbnNtaXR0ZWRGcmFtZUNvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GYWlsZWRDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLkZhaWxlZENvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuUmV0cnlDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+TXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuTXVsdGlwbGVSZXRyeUNvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5SVFNTdWNjZXNzQ291bnQuUXVhZFBhcnQ7Ci0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLlJUU0ZhaWx1cmVDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+QUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuQUNLRmFpbHVyZUNvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuRnJhbWVEdXBsaWNhdGVDb3VudC5RdWFkUGFydDsKLSAgICAgICAgICAgICAgICBwU3RhdGlzdGljcy0+UmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0ID0gcEFkLT5XbGFuQ291bnRlcnMuUmVjZWl2ZWRGcmFnbWVudENvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5NdWx0aWNhc3RSZWNlaXZlZEZyYW1lQ291bnQuUXVhZFBhcnQ7Ci0jaWZkZWYgREJHCi0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQgPSBwQWQtPlJhbGlua0NvdW50ZXJzLlJlYWxGY3NFcnJDb3VudDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgcFN0YXRpc3RpY3MtPkZDU0Vycm9yQ291bnQuUXVhZFBhcnQgPSBwQWQtPldsYW5Db3VudGVycy5GQ1NFcnJvckNvdW50LlF1YWRQYXJ0OwotICAgICAgICAgICAgICAgIHBTdGF0aXN0aWNzLT5GcmFtZUR1cGxpY2F0ZUNvdW50LnUuTG93UGFydCA9IHBBZC0+V2xhbkNvdW50ZXJzLkZyYW1lRHVwbGljYXRlQ291bnQudS5Mb3dQYXJ0IC8gMTAwOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE5ESVNfODAyXzExX1NUQVRJU1RJQ1MpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwU3RhdGlzdGljcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBrZnJlZShwU3RhdGlzdGljcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU1RBVElTVElDUyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfT0s6Ci0gICAgICAgICAgICB1bEluZm8gPSBwQWQtPkNvdW50ZXJzODAyMy5Hb29kUmVjZWl2ZXM7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSOgotICAgICAgICAgICAgdWxJbmZvID0gcEFkLT5Db3VudGVyczgwMjMuUnhOb0J1ZmZlcjsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1BIWV9NT0RFOgotICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUEhZX01PREUgKD0lbGQpXG4iLCB1bEluZm8pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfU1RBX0NPTkZJRzoKLSAgICAgICAgICAgIHBTdGFDb25maWcgPSAoUlRfODAyXzExX1NUQV9DT05GSUcgKikga21hbGxvYyhzaXplb2YoUlRfODAyXzExX1NUQV9DT05GSUcpLCBNRU1fQUxMT0NfRkxBRyk7Ci0gICAgICAgICAgICBpZiAocFN0YUNvbmZpZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHXG4iKSk7Ci0gICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+RW5hYmxlVHhCdXJzdCA9IHBBZC0+Q29tbW9uQ2ZnLmJFbmFibGVUeEJ1cnN0OwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPkVuYWJsZVR1cmJvUmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+VXNlQkdQcm90ZWN0aW9uID0gcEFkLT5Db21tb25DZmcuVXNlQkdQcm90ZWN0aW9uOwotICAgICAgICAgICAgICAgIHBTdGFDb25maWctPlVzZVNob3J0U2xvdFRpbWUgPSBwQWQtPkNvbW1vbkNmZy5iVXNlU2hvcnRTbG90VGltZTsKLSAgICAgICAgICAgICAgICAvL3BTdGFDb25maWctPkFkaG9jTW9kZSA9IHBBZC0+U3RhQ2ZnLkFkaG9jTW9kZTsKLSAgICAgICAgICAgICAgICBwU3RhQ29uZmlnLT5Id1JhZGlvU3RhdHVzID0gKHBBZC0+U3RhQ2ZnLmJId1JhZGlvID09IFRSVUUpID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+UnN2MSA9IDA7Ci0gICAgICAgICAgICAgICAgcFN0YUNvbmZpZy0+U3lzdGVtRXJyb3JCaXRtYXAgPSBwQWQtPlN5c3RlbUVycm9yQml0bWFwOwotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF84MDJfMTFfU1RBX0NPTkZJRyk7Ci0gICAgICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBTdGFDb25maWcsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAga2ZyZWUocFN0YUNvbmZpZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfU1RBX0NPTkZJRyhrbWFsbG9jIGZhaWxlZClcbiIpKTsKLSAgICAgICAgICAgICAgICBTdGF0dXMgPSAtRUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9SVFNfVEhSRVNIT0xEOgotICAgICAgICAgICAgUnRzVGhyZXNoID0gcEFkLT5Db21tb25DZmcuUnRzVGhyZXNob2xkOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJ0c1RocmVzaCk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJ0c1RocmVzaCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1JUU19USFJFU0hPTEQoPSVsZClcbiIsIFJ0c1RocmVzaCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRDoKLSAgICAgICAgICAgIEZyYWdUaHJlc2ggPSBwQWQtPkNvbW1vbkNmZy5GcmFnbWVudFRocmVzaG9sZDsKLSAgICAgICAgICAgIGlmIChwQWQtPkNvbW1vbkNmZy5iVXNlWmVyb1RvRGlzYWJsZUZyYWdtZW50ID09IFRSVUUpCi0gICAgICAgICAgICAgICAgRnJhZ1RocmVzaCA9IDA7Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoRnJhZ1RocmVzaCk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkZyYWdUaHJlc2gsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9GUkFHTUVOVEFUSU9OX1RIUkVTSE9MRCg9JWxkKVxuIiwgRnJhZ1RocmVzaCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9QT1dFUl9NT0RFOgotICAgICAgICAgICAgUG93ZXJNb2RlID0gcEFkLT5TdGFDZmcuV2luZG93c1Bvd2VyTW9kZTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihQb3dlck1vZGUpOwotICAgICAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZQb3dlck1vZGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9QT1dFUl9NT0RFKD0lZClcbiIsIFBvd2VyTW9kZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9SQURJTzoKLSAgICAgICAgICAgIFJhZGlvU3RhdGUgPSAoQk9PTEVBTikgcEFkLT5TdGFDZmcuYlN3UmFkaW87Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoUmFkaW9TdGF0ZSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlJhZGlvU3RhdGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9SQURJTyAoPSVkKVxuIiwgUmFkaW9TdGF0ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFOgotICAgICAgICAgICAgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0FESE9DKQotICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSUJTUzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHBBZC0+U3RhQ2ZnLkJzc1R5cGUgPT0gQlNTX0lORlJBKQotICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7Ci0gICAgICAgICAgICBlbHNlIGlmIChwQWQtPlN0YUNmZy5Cc3NUeXBlID09IEJTU19NT05JVE9SKQotICAgICAgICAgICAgICAgIEJzc1R5cGUgPSBOZGlzODAyXzExTW9uaXRvcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBCc3NUeXBlID0gTmRpczgwMl8xMUF1dG9Vbmtub3duOwotCi0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQnNzVHlwZSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkJzc1R5cGUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFKD0lZClcbiIsIEJzc1R5cGUpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUFJFQU1CTEU6Ci0gICAgICAgICAgICBQcmVhbVR5cGUgPSBwQWQtPkNvbW1vbkNmZy5UeFByZWFtYmxlOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFByZWFtVHlwZSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJlByZWFtVHlwZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSRUFNQkxFKD0lZClcbiIsIFByZWFtVHlwZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFOgotICAgICAgICAgICAgQXV0aE1vZGUgPSBwQWQtPlN0YUNmZy5BdXRoTW9kZTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihBdXRoTW9kZSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkF1dGhNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSg9JWQpXG4iLCBBdXRoTW9kZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0lEXzgwMl8xMV9XRVBfU1RBVFVTOgotICAgICAgICAgICAgV2VwU3RhdHVzID0gcEFkLT5TdGFDZmcuV2VwU3RhdHVzOwotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFdlcFN0YXR1cyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJldlcFN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1dFUF9TVEFUVVMoPSVkKVxuIiwgV2VwU3RhdHVzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5Db21tb25DZmcuVHhQb3dlciwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX1RYX1BPV0VSX0xFVkVMICV4XG4iLHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXIpKTsKLQkJCWJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMToKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfVFhfUE9XRVJfTEVWRUxfMSAoPSVsZClcbiIsIHBBZC0+Q29tbW9uQ2ZnLlR4UG93ZXJQZXJjZW50YWdlKSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRVNfU1VQUE9SVEVEOgotCQkJaWYgKChwQWQtPlJmSWNUeXBlCT09IFJGSUNfMjg1MCkgfHwgKHBBZC0+UmZJY1R5cGUgPT0JUkZJQ18yNzUwKSB8fCAocEFkLT5SZkljVHlwZSA9PSBSRklDXzMwNTIpKQotCQkJewotCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDM7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMwotCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgotCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZwotCQkJCU5ldHdvcmtUeXBlTGlzdFszXSA9IE5kaXM4MDJfMTFPRkRNNTsgICAvLyBOZXR3b3JrVHlwZVszXSA9IDExYQotICAgICAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCU5ldHdvcmtUeXBlTGlzdFswXSA9IDI7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXJPZkl0ZW1zID0gMgotCQkJCU5ldHdvcmtUeXBlTGlzdFsxXSA9IE5kaXM4MDJfMTFEUzsgICAgICAvLyBOZXR3b3JrVHlwZVsxXSA9IDExYgotCQkJCU5ldHdvcmtUeXBlTGlzdFsyXSA9IE5kaXM4MDJfMTFPRkRNMjQ7ICAvLyBOZXR3b3JrVHlwZVsyXSA9IDExZwotCQkJICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IDEyOwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmTmV0d29ya1R5cGVMaXN0WzBdLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJfQotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfTkVUV09SS19UWVBFU19TVVBQT1JURURcbiIpKTsKLQkJCQlicmVhazsKLQkgICAgY2FzZSBPSURfODAyXzExX05FVFdPUktfVFlQRV9JTl9VU0U6Ci0gICAgICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJaWYgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExQSkKLQkJCQl1bEluZm8gPSBOZGlzODAyXzExT0ZETTU7Ci0JCQllbHNlIGlmICgocEFkLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFCR19NSVhFRCkgfHwgKHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGUgPT0gUEhZXzExRykpCi0JCQkJdWxJbmZvID0gTmRpczgwMl8xMU9GRE0yNDsKLQkJCWVsc2UKLQkJCQl1bEluZm8gPSBOZGlzODAyXzExRFM7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9SWF9SQVRFOgotICAgICAgICAgICAgdWxJbmZvID0gKFVMT05HKXBBZC0+TGFzdFJ4UmF0ZTsKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZih1bEluZm8pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ1bEluZm8sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9MQVNUX1JYX1JBVEUgKD0lbGQpXG4iLCB1bEluZm8pKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFOgotCQkJLy91bEluZm8gPSAoVUxPTkcpcEFkLT5MYXN0VHhSYXRlOwotCQkJdWxJbmZvID0gKFVMT05HKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQ7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLAl3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfTEFTVF9UWF9SQVRFICg9JWx4KVxuIiwgdWxJbmZvKSk7Ci0JCQlicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0VFUFJPTV9WRVJTSU9OOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5FZXByb21WZXJzaW9uLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9GSVJNV0FSRV9WRVJTSU9OOgotICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5GaXJtd2FyZVZlcnNpb24sIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQkgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5CYnBXcml0ZUxhdGNoWzY2XSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX05PSVNFX0xFVkVMICg9JWQpXG4iLCBwQWQtPkJicFdyaXRlTGF0Y2hbNjZdKSk7Ci0JCQlicmVhazsKLQkgICAgY2FzZSBSVF9PSURfODAyXzExX0VYVFJBX0lORk86Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkV4dHJhSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX0VYVFJBX0lORk8gKD0lbGQpXG4iLCBwQWQtPkV4dHJhSW5mbykpOwotCSAgICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUlRfT0lEX1dFX1ZFUlNJT05fQ09NUElMRUQ6Ci0JICAgICAgICB3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUlOVCk7Ci0JICAgICAgICB3ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwotCSAgICAgICAgU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZ3ZV92ZXJzaW9uX2NvbXBpbGVkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCSAgICAgICAgYnJlYWs7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1NFVFRJTkc6Ci0JCQlhcHNkID0gKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQ2FwYWJsZSB8IChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JFIDw8IDEpIHwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfQksgPDwgMikKLQkJCQl8IChwQWQtPkNvbW1vbkNmZy5iQVBTREFDX1ZJIDw8IDMpCXwgKHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVk8gPDwgNCkJfCAocEFkLT5Db21tb25DZmcuTWF4U1BMZW5ndGggPDwgNSkpOwotCi0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUxPTkcpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZhcHNkLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfQVBTRF9TRVRUSU5HICg9MHglbHgsQVBTRENhcD0lZCxBQ19CRT0lZCxBQ19CSz0lZCxBQ19WST0lZCxBQ19WTz0lZCxNQVhTUExlbj0lZClcbiIsCi0JCQkJYXBzZCxwQWQtPkNvbW1vbkNmZy5iQVBTRENhcGFibGUscEFkLT5Db21tb25DZmcuYkFQU0RBQ19CRSxwQWQtPkNvbW1vbkNmZy5iQVBTREFDX0JLLHBBZC0+Q29tbW9uQ2ZnLmJBUFNEQUNfVkkscEFkLT5Db21tb25DZmcuYkFQU0RBQ19WTyxwQWQtPkNvbW1vbkNmZy5NYXhTUExlbmd0aCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTToKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLmJBUFNERm9yY2VQb3dlclNhdmUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9BUFNEX1BTTSAoPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuYkFQU0RGb3JjZVBvd2VyU2F2ZSkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9XTU06Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUVVFUllfV01NICg9JWQpXG4iLAlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOwotCQkJYnJlYWs7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgICAgICBjYXNlIFJUX09JRF9ORVdfRFJJVkVSOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVDSEFSIGVuYWJsZWQgPSAxOwotCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLQkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZW5hYmxlZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX05FV19EUklWRVIgKD0lZClcbiIsIGVuYWJsZWQpKTsKLSAgICAgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUOgotCSAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLQkgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF9XUEFfU1VQUExJQ0FOVF9TVVBQT1JUICg9JWQpXG4iLCBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVApKTsKLQkgICAgICAgIGJyZWFrOwotI2VuZGlmIC8vIFdQQV9TVVBQTElDQU5UX1NVUFBPUlQgLy8KLQotICAgICAgICBjYXNlIFJUX09JRF9EUklWRVJfREVWSUNFX05BTUU6Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX0RSSVZFUl9ERVZJQ0VfTkFNRSBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE2OwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwQWQtPlN0YUNmZy5kZXZfbmFtZSwgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJCXsKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFOgotICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTU9ERTsKLQkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLkJXOwotCQkJcEhUUGh5TW9kZS0+TUNTPSAoVUNIQVIpcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuTUNTOwotCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLmZpZWxkLlNob3J0R0k7Ci0JCQlwSFRQaHlNb2RlLT5TVEJDPSAoVUNIQVIpcEFkLT5NYWNUYWIuQ29udGVudFtCU1NJRF9XQ0lEXS5IVFBoeU1vZGUuZmllbGQuU1RCQzsKLQotCQkJcEhUUGh5TW9kZS0+RXh0T2Zmc2V0ID0gKChwQWQtPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA8IHBBZC0+Q29tbW9uQ2ZnLkNoYW5uZWwpID8gKEVYVENIQV9CRUxPVykgOiAoRVhUQ0hBX0FCT1ZFKSk7Ci0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKLQkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX0NPVU5UUllfUkVHSU9OOgotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfQ09VTlRSWV9SRUdJT04gXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YodWxJbmZvKTsKLSAgICAgICAgICAgIHVsSW5mbyA9IHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb25Gb3JBQmFuZDsKLSAgICAgICAgICAgIHVsSW5mbyA9ICh1bEluZm8gPDwgOCl8KHBBZC0+Q29tbW9uQ2ZnLkNvdW50cnlSZWdpb24pOwotCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdWxJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQotICAgICAgICAgICAgewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RBVF9IVF9QSFlNT0RFOgotICAgICAgICAgICAgcEhUUGh5TW9kZSA9IChPSURfU0VUX0hUX1BIWU1PREUgKikga21hbGxvYyhzaXplb2YoT0lEX1NFVF9IVF9QSFlNT0RFKSwgTUVNX0FMTE9DX0ZMQUcpOwotICAgICAgICAgICAgaWYgKHBIVFBoeU1vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEhUUGh5TW9kZS0+UGh5TW9kZSA9IHBBZC0+Q29tbW9uQ2ZnLlBoeU1vZGU7Ci0JCQlwSFRQaHlNb2RlLT5IdE1vZGUgPSAoVUNIQVIpcEFkLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkhUTU9ERTsKLQkJCXBIVFBoeU1vZGUtPkJXID0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVzsKLQkJCXBIVFBoeU1vZGUtPk1DUz0gKFVDSEFSKXBBZC0+U3RhQ2ZnLkRlc2lyZWRUcmFuc21pdFNldHRpbmcuZmllbGQuTUNTOwotCQkJcEhUUGh5TW9kZS0+U0hPUlRHST0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TaG9ydEdJOwotCQkJcEhUUGh5TW9kZS0+U1RCQz0gKFVDSEFSKXBBZC0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5TVEJDOwotCi0gICAgICAgICAgICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKE9JRF9TRVRfSFRfUEhZTU9ERSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwSFRQaHlNb2RlLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQotCQkJewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9RVUVSWV9IVF9QSFlNT0RFIChQaHlNb2RlID0gJWQsIE1DUyA9JWQsIEJXID0gJWQsIFNUQkMgPSAlZCwgRXh0T2Zmc2V0PSVkKVxuIiwKLQkJCQlwSFRQaHlNb2RlLT5IdE1vZGUsIHBIVFBoeU1vZGUtPk1DUywgcEhUUGh5TW9kZS0+QlcsIHBIVFBoeU1vZGUtPlNUQkMsIHBIVFBoeU1vZGUtPkV4dE9mZnNldCkpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiIE1sbWVVcGRhdGVUeFJhdGVzICgud29yZCA9ICV4IClcbiIsIHBBZC0+TWFjVGFiLkNvbnRlbnRbQlNTSURfV0NJRF0uSFRQaHlNb2RlLndvcmQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9TVEFfQ09ORklHKGttYWxsb2MgZmFpbGVkKVxuIikpOwotICAgICAgICAgICAgICAgIFN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSVF9PSURfUVVFUllfTVVMVElQTEVfQ0FSRF9TVVBQT1JUOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVDSEFSKTsKLSAgICAgICAgICAgIGkgPSAwOwotI2lmZGVmIE1VTFRJUExFX0NBUkRfU1VQUE9SVAotICAgICAgICAgICAgaSA9IDE7Ci0jZW5kaWYgLy8gTVVMVElQTEVfQ0FSRF9TVVBQT1JUIC8vCi0JCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZpLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQotICAgICAgICAgICAgewotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEX1FVRVJZX01VTFRJUExFX0NBUkRfU1VQUE9SVCg9JWQpIFxuIiwgaSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgU05NUF9TVVBQT1JUCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9NQUNfQUREUkVTUzoKLSAgICAgICAgICAgIHdycS0+dS5kYXRhLmxlbmd0aCA9IE1BQ19BRERSX0xFTjsKLSAgICAgICAgICAgIFN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcEFkLT5DdXJyZW50QWRkcmVzcywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUk6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJPVUkgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBNYW51ZmFjdHVyZXJPVUlfTEVOOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkN1cnJlbnRBZGRyZXNzLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX01BTlVGQUNUVVJFUk5BTUU6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6UlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRVJOQU1FIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKE1hbnVmYWN0dXJlck5BTUUpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIE1hbnVmYWN0dXJlck5BTUUsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUkVTT1VSQ0VUWVBFSUROQU1FIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKFJlc291cmNlVHlwZUlkTmFtZSk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgUmVzb3VyY2VUeXBlSWROYW1lLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCBcbiIpKTsKLQkJCXVsSW5mbyA9IDE7IC8vIDEgaXMgc3VwcG9ydCB3ZXAgZWxzZSAyIGlzIG5vdCBzdXBwb3J0LgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9QT1dFUk1BTkFHRU1FTlRNT0RFOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfUE9XRVJNQU5BR0VNRU5UTU9ERSBcbiIpKTsKLQkJCWlmIChwQWQtPlN0YUNmZy5Qc20gPT0gUFNNUF9BQ1RJT04pCi0JCQkJdWxJbmZvID0gMTsgLy8gMSBpcyBwb3dlciBhY3RpdmUgZWxzZSAyIGlzIHBvd2VyIHNhdmUuCi0JCQllbHNlCi0JCQkJdWxJbmZvID0gMjsKLQotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHVsSW5mbyk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnVsSW5mbywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUU6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9XRVBERUZBVUxUS0VZVkFMVUUgXG4iKSk7Ci0JCQkvL0tleUlkeFZhbHVlLktleUlkeCA9IHBBZC0+UG9ydENmZy5NQlNTSURbcEFkLT5Jb2N0bElGXS5EZWZhdWx0S2V5SWQ7Ci0JCQlwS2V5SWR4VmFsdWUgPSB3cnEtPnUuZGF0YS5wb2ludGVyOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJLZXlJZHhWYWx1ZS5LZXlJZHggPSAlZCwgXG4iLHBLZXlJZHhWYWx1ZS0+S2V5SWR4KSk7Ci0JCQl2YWx1ZUxlbiA9IHBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuOwotCQkJTmRpc01vdmVNZW1vcnkocEtleUlkeFZhbHVlLT5WYWx1ZSwKLQkJCQkJCSAgICZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleSwKLQkJCQkJCSAgIHZhbHVlTGVuKTsKLQkJCXBLZXlJZHhWYWx1ZS0+VmFsdWVbdmFsdWVMZW5dPSdcMCc7Ci0KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihEZWZhdWx0S2V5SWR4VmFsdWUpOwotCi0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcEtleUlkeFZhbHVlLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsKCJEZWZhdWx0S2V5SWQgPSAlZCwgdG90YWwgbGVuID0gJWQsIHN0ciBsZW49JWQsIEtleVZhbHVlPSAlMDJ4ICUwMnggJTAyeCAlMDJ4IFxuIiwKLQkJCQkJCQkJCQlwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQsCi0JCQkJCQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoLAotCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdW3BBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZF0uS2V5TGVuLAotCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzBdLktleVswXSwKLQkJCQkJCQkJCQlwQWQtPlNoYXJlZEtleVtCU1MwXVsxXS5LZXlbMF0sCi0JCQkJCQkJCQkJcEFkLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5WzBdLAotCQkJCQkJCQkJCXBBZC0+U2hhcmVkS2V5W0JTUzBdWzNdLktleVswXSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX1dFUERFRkFVTFRLRVlJRDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1dFUERFRkFVTFRLRVlJRCBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkRlZmF1bHRLZXlJZCA9JWQgXG4iLCBwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9XRVBLRVlNQVBQSU5HTEVOR1RIOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfV0VQS0VZTUFQUElOR0xFTkdUSCBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVQ0hBUik7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkJCQkJCSZwQWQtPlNoYXJlZEtleVtCU1MwXVtwQWQtPlN0YUNmZy5EZWZhdWx0S2V5SWRdLktleUxlbiwKLQkJCQkJCQkJCXdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0hPUlRSRVRSWUxJTUlUIFxuIikpOwotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKLQkJCVJUTVBfSU9fUkVBRDMyKHBBZCwgVFhfUlRZX0NGRywgJnR4X3J0eV9jZmcud29yZCk7Ci0JCQlTaG9ydFJldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLlNob3J0UnR5TGltaXQ7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTaG9ydFJldHJ5TGltaXQgPSVsZCwgIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSZXRyeUxpbWl0PSVkXG4iLCBTaG9ydFJldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuU2hvcnRSdHlMaW1pdCkpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZTaG9ydFJldHJ5TGltaXQsIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfTE9OR1JFVFJZTElNSVQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9MT05HUkVUUllMSU1JVCBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihVTE9ORyk7Ci0JCQlSVE1QX0lPX1JFQUQzMihwQWQsIFRYX1JUWV9DRkcsICZ0eF9ydHlfY2ZnLndvcmQpOwotCQkJTG9uZ1JldHJ5TGltaXQgPSB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdDsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkxvbmdSZXRyeUxpbWl0ID0lbGQsICB0eF9ydHlfY2ZnLmZpZWxkLkxvbmdSdHlMaW1pdD0lZFxuIiwgTG9uZ1JldHJ5TGltaXQsIHR4X3J0eV9jZmcuZmllbGQuTG9uZ1J0eUxpbWl0KSk7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJkxvbmdSZXRyeUxpbWl0LCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1BST0RVQ1RJRDoKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1BST0RVQ1RJRCBcbiIpKTsKLQotI2lmZGVmIFJUTVBfTUFDX1BDSQotCQkJewotCi0JCQkJVVNIT1JUICBkZXZpY2VfaWQ7Ci0JCQkJaWYgKCgoUE9TX0NPT0tJRSlwQWQtPk9TX0Nvb2tpZSktPnBjaV9kZXYgIT0gTlVMTCkKLQkJCQlwY2lfcmVhZF9jb25maWdfd29yZCgoKFBPU19DT09LSUUpcEFkLT5PU19Db29raWUpLT5wY2lfZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlX2lkKTsKLQkJCQllbHNlCi0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiBwY2lfZGV2ID0gTlVMTFxuIikpOwotCQkJCXNwcmludGYoKFBTVFJJTkcpdG1wLCAiJTA0eCAlMDR4XG4iLCBOSUNfUENJX1ZFTkRPUl9JRCwgZGV2aWNlX2lkKTsKLQkJCX0KLSNlbmRpZiAvLyBSVE1QX01BQ19QQ0kgLy8KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbigoUFNUUklORyl0bXApOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHRtcCwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUlRfT0lEXzgwMl8xMV9NQU5VRkFDVFVSRUlEOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6OlJUX09JRF84MDJfMTFfTUFOVUZBQ1RVUkVJRCBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihNYW51ZmFjdHVyZXJOQU1FKTsKLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBNYW51ZmFjdHVyZXJOQU1FLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0NVUlJFTlRDSEFOTkVMOgotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQ1VSUkVOVENIQU5ORUwgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic2l6ZW9mIFVDSEFSPSVkLCBjaGFubmVsPSVkIFxuIiwgc2l6ZW9mKFVDSEFSKSwgcEFkLT5Db21tb25DZmcuQ2hhbm5lbCkpOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5DaGFubmVsLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU3RhdHVzPSVkXG4iLCBTdGF0dXMpKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vU05NUF9TVVBQT1JUCi0KLQkJY2FzZSBPSURfODAyXzExX0JVSUxEX0NIQU5ORUxfRVg6Ci0JCQl7Ci0JCQkJVUNIQVIgdmFsdWU7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfQlVJTERfQ0hBTk5FTF9FWCBcbiIpKTsKLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoVUNIQVIpOwotI2lmZGVmIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdXBwb3J0IEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QuXG4iKSk7Ci0JCQkJdmFsdWUgPSAxOwotI2Vsc2UKLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJEb2Vzbid0IHN1cHBvcnQgRVhUX0JVSUxEX0NIQU5ORUxfTElTVC5cbiIpKTsKLQkJCQl2YWx1ZSA9IDA7Ci0jZW5kaWYgLy8gRVhUX0JVSUxEX0NIQU5ORUxfTElTVCAvLwotCQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmdmFsdWUsIDEpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfR0VUX0NIX0xJU1Q6Ci0JCQl7Ci0JCQkJUFJUX0NIQU5ORUxfTElTVF9JTkZPIHBDaExpc3RCdWY7Ci0KLQkJCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJRdWVyeTo6T0lEXzgwMl8xMV9HRVRfQ0hfTElTVCBcbiIpKTsKLQkJCQlpZiAocEFkLT5DaGFubmVsTGlzdE51bSA9PSAwKQotCQkJCXsKLQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcENoTGlzdEJ1ZiA9IChSVF9DSEFOTkVMX0xJU1RfSU5GTyAqKSBrbWFsbG9jKHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyksIE1FTV9BTExPQ19GTEFHKTsKLQkJCQlpZiAocENoTGlzdEJ1ZiA9PSBOVUxMKQotCQkJCXsKLQkJCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcENoTGlzdEJ1Zi0+Q2hhbm5lbExpc3ROdW0gPSBwQWQtPkNoYW5uZWxMaXN0TnVtOwotCQkJCWZvciAoaSA9IDA7IGkgPCBwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdE51bTsgaSsrKQotCQkJCQlwQ2hMaXN0QnVmLT5DaGFubmVsTGlzdFtpXSA9IHBBZC0+Q2hhbm5lbExpc3RbaV0uQ2hhbm5lbDsKLQotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTyk7Ci0JCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBDaExpc3RCdWYsIHNpemVvZihSVF9DSEFOTkVMX0xJU1RfSU5GTykpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlN0YXR1cz0lZFxuIiwgU3RhdHVzKSk7Ci0KLQkJCQlpZiAocENoTGlzdEJ1ZikKLQkJCQkJa2ZyZWUocENoTGlzdEJ1Zik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE9JRF84MDJfMTFfR0VUX0NPVU5UUllfQ09ERToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DT1VOVFJZX0NPREUgXG4iKSk7Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAyOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5Db3VudHJ5Q29kZSwgMik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWToKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpPSURfODAyXzExX0dFVF9DSEFOTkVMX0dFT0dSQVBIWSBcbiIpKTsKLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7Ci0JCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLkdlb2dyYXBoeSwgMSk7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTdGF0dXM9JWRcbiIsIFN0YXR1cykpOwotCQkJYnJlYWs7Ci0KLQotI2lmZGVmIFFPU19ETFNfU1VQUE9SVAotCQljYXNlIFJUX09JRF84MDJfMTFfUVVFUllfRExTOgotCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKEJPT0xFQU4pOwotCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSwgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMUyg9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5iRExTQ2FwYWJsZSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTToKLQkJCXsKLQkJCQlQUlRfODAyXzExX0RMU19JTkZPCXBEbHNJbmZvID0ga21hbGxvYyhzaXplb2YoUlRfODAyXzExX0RMU19JTkZPKSwgR0ZQX0FUT01JQyk7Ci0JCQkJaWYgKHBEbHNJbmZvID09IE5VTEwpCi0JCQkJCWJyZWFrOwotCi0JCQkJZm9yIChpPTA7IGk8TUFYX05VTV9PRl9ETFNfRU5UUlk7IGkrKykKLQkJCQl7Ci0JCQkJCVJUTVBNb3ZlTWVtb3J5KCZwRGxzSW5mby0+RW50cnlbaV0sICZwQWQtPlN0YUNmZy5ETFNFbnRyeVtpXSwgc2l6ZW9mKFJUXzgwMl8xMV9ETFNfVUkpKTsKLQkJCQl9Ci0KLQkJCQlwRGxzSW5mby0+bnVtID0gTUFYX05VTV9PRl9ETFNfRU5UUlk7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKFJUXzgwMl8xMV9ETFNfSU5GTyk7Ci0JCQkJU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIHBEbHNJbmZvLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5OjpSVF9PSURfODAyXzExX1FVRVJZX0RMU19QQVJBTVxuIikpOwotCi0JCQkJaWYgKHBEbHNJbmZvKQotCQkJCQlrZnJlZShwRGxzSW5mbyk7Ci0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZiAvLyBRT1NfRExTX1NVUFBPUlQgLy8KLQotCQljYXNlIE9JRF84MDJfMTFfU0VUX1BTUFhMSU5LX01PREU6Ci0JCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoQk9PTEVBTik7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgJnBBZC0+Q29tbW9uQ2ZnLlBTUFhsaW5rLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiUXVlcnk6Ok9JRF84MDJfMTFfU0VUX1BTUFhMSU5LX01PREUoPSVkKVxuIiwgcEFkLT5Db21tb25DZmcuUFNQWGxpbmspKTsKLQkJCWJyZWFrOwotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlF1ZXJ5Ojp1bmtub3duIElPQ1RMJ3Mgc3ViY21kID0gMHglMDh4XG4iLCBjbWQpKTsKLSAgICAgICAgICAgIFN0YXR1cyA9IC1FT1BOT1RTVVBQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBTdGF0dXM7Ci19Ci0KLUlOVCBydDI4eHhfc3RhX2lvY3RsKAotCUlOCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRfZGV2LAotCUlOCU9VVAlzdHJ1Y3QgaWZyZXEJKnJxLAotCUlOCUlOVAkJCQkJY21kKQotewotCVBPU19DT09LSUUJCQlwT2JqOwotCVJUTVBfQURBUFRFUiAgICAgICAgKnBBZCA9IE5VTEw7Ci0Jc3RydWN0IGl3cmVxICAgICAgICAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKLQlCT09MRUFOCQkJCVN0YXRlTWFjaGluZVRvdWNoZWQgPSBGQUxTRTsKLQlJTlQJCQkJCVN0YXR1cyA9IE5ESVNfU1RBVFVTX1NVQ0NFU1M7Ci0JVVNIT1JUCQkJCXN1YmNtZDsKLQotCi0JcEFkID0gUlRNUF9PU19ORVRERVZfR0VUX1BSSVYobmV0X2Rldik7Ci0JaWYgKHBBZCA9PSBOVUxMKQotCXsKLQkJLyogaWYgMXN0IG9wZW4gZmFpbCwgcEFkIHdpbGwgYmUgZnJlZTsKLQkJICAgU28gdGhlIG5ldF9kZXYtPnByaXYgd2lsbCBiZSBOVUxMIGluIDJyZCBvcGVuICovCi0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCXBPYmogPSAoUE9TX0NPT0tJRSkgcEFkLT5PU19Db29raWU7Ci0KLSAgICAvL2NoZWNrIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bgotICAgIGlmKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0gICAgewotI2lmZGVmIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUCi0JICAgIGlmICh3cnEtPnUuZGF0YS5wb2ludGVyID09IE5VTEwpCi0JICAgIHsKLQkJICAgIHJldHVybiBTdGF0dXM7Ci0JICAgIH0KLQotCSAgICBpZiAoc3Ryc3RyKHdycS0+dS5kYXRhLnBvaW50ZXIsICJPcE1vZGUiKSA9PSBOVUxMKQotI2VuZGlmIC8vIENPTkZJR19BUFNUQV9NSVhFRF9TVVBQT1JUIC8vCi0JCXsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklORk86Ok5ldHdvcmsgaXMgZG93biFcbiIpKTsKLQkJICAgIHJldHVybiAtRU5FVERPV047Ci0gICAgICAgIH0KLSAgICB9Ci0KLQl7CS8vIGRldGVybWluZSB0aGlzIGlvY3RsIGNvbW1hbmQgaXMgY29tbWluZyBmcm9tIHdoaWNoIGludGVyZmFjZS4KLQkJcE9iai0+aW9jdGxfaWZfdHlwZSA9IElOVF9NQUlOOwotCQlwT2JqLT5pb2N0bF9pZiA9IE1BSU5fTUJTU0lEOwotCX0KLQotCXN3aXRjaChjbWQpCi0JewotI2lmZGVmIFJBTElOS19BVEUKLSNpZmRlZiBSQUxJTktfMjh4eF9RQQotCQljYXNlIFJUUFJJVl9JT0NUTF9BVEU6Ci0JCQl7Ci0JCQkJUnRtcERvQXRlKHBBZCwgd3JxKTsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmIC8vIFJBTElOS18yOHh4X1FBIC8vCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotICAgICAgICBjYXNlIFNJT0NHSUZIV0FERFI6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJT0NUTDo6U0lPQ0dJRkhXQUREUlxuIikpOwotCQkJbWVtY3B5KHdycS0+dS5uYW1lLCBwQWQtPkN1cnJlbnRBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCQlicmVhazsKLQkJY2FzZSBTSU9DR0lXTkFNRToKLSAgICAgICAgewotCQljaGFyICpuYW1lPSZ3cnEtPnUubmFtZVswXTsKLQkJcnRfaW9jdGxfZ2l3bmFtZShuZXRfZGV2LCBOVUxMLCBuYW1lLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ0dJV0VTU0lEOiAgLy9HZXQgRVNTSUQKLSAgICAgICAgewotCQlzdHJ1Y3QgaXdfcG9pbnQgKmVzc2lkPSZ3cnEtPnUuZXNzaWQ7Ci0JCXJ0X2lvY3RsX2dpd2Vzc2lkKG5ldF9kZXYsIE5VTEwsIGVzc2lkLCBlc3NpZC0+cG9pbnRlcik7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NTSVdFU1NJRDogIC8vU2V0IEVTU0lECi0JCXsKLQkJc3RydWN0IGl3X3BvaW50CSplc3NpZD0md3JxLT51LmVzc2lkOwotCQlydF9pb2N0bF9zaXdlc3NpZChuZXRfZGV2LCBOVUxMLCBlc3NpZCwgZXNzaWQtPnBvaW50ZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DU0lXTldJRDogICAvLyBzZXQgbmV0d29yayBpZCAodGhlIGNlbGwpCi0JCWNhc2UgU0lPQ0dJV05XSUQ6ICAgLy8gZ2V0IG5ldHdvcmsgaWQKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ1NJV0ZSRVE6ICAgLy9zZXQgY2hhbm5lbC9mcmVxdWVuY3kgKEh6KQotCQl7Ci0JCXN0cnVjdCBpd19mcmVxICpmcmVxPSZ3cnEtPnUuZnJlcTsKLQkJcnRfaW9jdGxfc2l3ZnJlcShuZXRfZGV2LCBOVUxMLCBmcmVxLCBOVUxMKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ0dJV0ZSRVE6ICAgLy8gZ2V0IGNoYW5uZWwvZnJlcXVlbmN5IChIeikKLQkJewotCQlzdHJ1Y3QgaXdfZnJlcSAqZnJlcT0md3JxLT51LmZyZXE7Ci0JCXJ0X2lvY3RsX2dpd2ZyZXEobmV0X2RldiwgTlVMTCwgZnJlcSwgTlVMTCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNJT0NTSVdOSUNLTjogLy9zZXQgbm9kZSBuYW1lL25pY2tuYW1lCi0JCXsKLQkJLy9zdHJ1Y3QgaXdfcG9pbnQgKmRhdGE9JndycS0+dS5kYXRhOwotCQkvL3J0X2lvY3RsX3Npd25pY2tuKG5ldF9kZXYsIE5VTEwsIGRhdGEsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgU0lPQ0dJV05JQ0tOOiAvL2dldCBub2RlIG5hbWUvbmlja25hbWUKLSAgICAgICAgewotCQkJc3RydWN0IGl3X3BvaW50CSplcnEgPSBOVUxMOwotCQllcnEgPSAmd3JxLT51LmRhdGE7Ci0gICAgICAgICAgICBlcnEtPmxlbmd0aCA9IHN0cmxlbigoUFNUUklORykgcEFkLT5uaWNrbmFtZSk7Ci0gICAgICAgICAgICBTdGF0dXMgPSBjb3B5X3RvX3VzZXIoZXJxLT5wb2ludGVyLCBwQWQtPm5pY2tuYW1lLCBlcnEtPmxlbmd0aCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdSQVRFOiAgIC8vZ2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKLQkJICAgIHJ0X2lvY3RsX2dpd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLQkgICAgY2FzZSBTSU9DU0lXUkFURTogIC8vc2V0IGRlZmF1bHQgYml0IHJhdGUgKGJwcykKLQkgICAgICAgIHJ0X2lvY3RsX3Npd3JhdGUobmV0X2RldiwgTlVMTCwgJndycS0+dSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTSU9DR0lXUlRTOiAgLy8gZ2V0IFJUUy9DVFMgdGhyZXNob2xkIChieXRlcykKLQkJewotCQlzdHJ1Y3QgaXdfcGFyYW0gKnJ0cz0md3JxLT51LnJ0czsKLQkJcnRfaW9jdGxfZ2l3cnRzKG5ldF9kZXYsIE5VTEwsIHJ0cywgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotICAgICAgICBjYXNlIFNJT0NTSVdSVFM6ICAvL3NldCBSVFMvQ1RTIHRocmVzaG9sZCAoYnl0ZXMpCi0JCXsKLQkJc3RydWN0IGl3X3BhcmFtICpydHM9JndycS0+dS5ydHM7Ci0JCXJ0X2lvY3RsX3Npd3J0cyhuZXRfZGV2LCBOVUxMLCBydHMsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLSAgICAgICAgY2FzZSBTSU9DR0lXRlJBRzogIC8vZ2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKLQkJewotCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOwotCQlydF9pb2N0bF9naXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLSAgICAgICAgY2FzZSBTSU9DU0lXRlJBRzogIC8vc2V0IGZyYWdtZW50YXRpb24gdGhyIChieXRlcykKLQkJewotCQlzdHJ1Y3QgaXdfcGFyYW0gKmZyYWc9JndycS0+dS5mcmFnOwotCQlydF9pb2N0bF9zaXdmcmFnKG5ldF9kZXYsIE5VTEwsIGZyYWcsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLSAgICAgICAgY2FzZSBTSU9DR0lXRU5DT0RFOiAgLy9nZXQgZW5jb2RpbmcgdG9rZW4gJiBtb2RlCi0JCXsKLQkJc3RydWN0IGl3X3BvaW50ICplcnE9JndycS0+dS5lbmNvZGluZzsKLQkJaWYoZXJxKQotCQkJcnRfaW9jdGxfZ2l3ZW5jb2RlKG5ldF9kZXYsIE5VTEwsIGVycSwgZXJxLT5wb2ludGVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0gICAgICAgIGNhc2UgU0lPQ1NJV0VOQ09ERTogIC8vc2V0IGVuY29kaW5nIHRva2VuICYgbW9kZQotCQl7Ci0JCXN0cnVjdCBpd19wb2ludCAqZXJxPSZ3cnEtPnUuZW5jb2Rpbmc7Ci0JCWlmKGVycSkKLQkJCXJ0X2lvY3RsX3Npd2VuY29kZShuZXRfZGV2LCBOVUxMLCBlcnEsIGVycS0+cG9pbnRlcik7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdBUDogICAgIC8vZ2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCi0JCXsKLQkJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKLQkJcnRfaW9jdGxfZ2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7Ci0JCQlicmVhazsKLQkJfQotCSAgICBjYXNlIFNJT0NTSVdBUDogIC8vc2V0IGFjY2VzcyBwb2ludCBNQUMgYWRkcmVzc2VzCi0JCXsKLQkJc3RydWN0IHNvY2thZGRyICphcF9hZGRyPSZ3cnEtPnUuYXBfYWRkcjsKLQkJcnRfaW9jdGxfc2l3YXAobmV0X2RldiwgTlVMTCwgYXBfYWRkciwgYXBfYWRkci0+c2FfZGF0YSk7Ci0gICAgICAgICAgICBicmVhazsKLQkJfQotCQljYXNlIFNJT0NHSVdNT0RFOiAgIC8vZ2V0IG9wZXJhdGlvbiBtb2RlCi0JCXsKLQkJX191MzIgKm1vZGU9JndycS0+dS5tb2RlOwotCQlydF9pb2N0bF9naXdtb2RlKG5ldF9kZXYsIE5VTEwsIG1vZGUsIE5VTEwpOwotICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLQkJY2FzZSBTSU9DU0lXTU9ERTogICAvL3NldCBvcGVyYXRpb24gbW9kZQotCQl7Ci0JCV9fdTMyICptb2RlPSZ3cnEtPnUubW9kZTsKLQkJcnRfaW9jdGxfc2l3bW9kZShuZXRfZGV2LCBOVUxMLCBtb2RlLCBOVUxMKTsKLSAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWNhc2UgU0lPQ0dJV1NFTlM6ICAgLy9nZXQgc2Vuc2l0aXZpdHkgKGRCbSkKLQkJY2FzZSBTSU9DU0lXU0VOUzoJLy9zZXQgc2Vuc2l0aXZpdHkgKGRCbSkKLQkJY2FzZSBTSU9DR0lXUE9XRVI6ICAvL2dldCBQb3dlciBNYW5hZ2VtZW50IHNldHRpbmdzCi0JCWNhc2UgU0lPQ1NJV1BPV0VSOiAgLy9zZXQgUG93ZXIgTWFuYWdlbWVudCBzZXR0aW5ncwotCQljYXNlIFNJT0NHSVdUWFBPVzogIC8vZ2V0IHRyYW5zbWl0IHBvd2VyIChkQm0pCi0JCWNhc2UgU0lPQ1NJV1RYUE9XOiAgLy9zZXQgdHJhbnNtaXQgcG93ZXIgKGRCbSkKLQkJY2FzZSBTSU9DR0lXUkFOR0U6CS8vR2V0IHJhbmdlIG9mIHBhcmFtZXRlcnMKLQkJY2FzZSBTSU9DR0lXUkVUUlk6CS8vZ2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKLQkJY2FzZSBTSU9DU0lXUkVUUlk6CS8vc2V0IHJldHJ5IGxpbWl0cyBhbmQgbGlmZXRpbWUKLQkJCVN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlRfUFJJVl9JT0NUTDoKLSAgICAgICAgY2FzZSBSVF9QUklWX0lPQ1RMX0VYVDoKLQkJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOwotCQkJaWYoIHN1YmNtZCAmIE9JRF9HRVRfU0VUX1RPR0dMRSkKLQkJCQlTdGF0dXMgPSBSVE1QU2V0SW5mb3JtYXRpb24ocEFkLCBycSwgc3ViY21kKTsKLQkJCWVsc2UKLQkJCQlTdGF0dXMgPSBSVE1QUXVlcnlJbmZvcm1hdGlvbihwQWQsIHJxLCBzdWJjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0lPQ0dJV1BSSVY6Ci0JCQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKLQkJCXsKLQkJCQlpZiAoIGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihwcml2dGFiKSkgIT0gVFJVRSkKLQkJCQkJYnJlYWs7Ci0JCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOwotCQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJUUFJJVl9JT0NUTF9TRVQ6Ci0JCQlpZihhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHdycS0+dS5kYXRhLmxlbmd0aCkgIT0gVFJVRSkKLQkJCQkJYnJlYWs7Ci0JCQlydF9pb2N0bF9zZXRwYXJhbShuZXRfZGV2LCBOVUxMLCBOVUxMLCB3cnEtPnUuZGF0YS5wb2ludGVyKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUUFJJVl9JT0NUTF9HU0lURVNVUlZFWToKLQkJCVJUTVBJb2N0bEdldFNpdGVTdXJ2ZXkocEFkLCB3cnEpOwotCQkgICAgYnJlYWs7Ci0jaWZkZWYgREJHCi0JCWNhc2UgUlRQUklWX0lPQ1RMX01BQzoKLQkJCVJUTVBJb2N0bE1BQyhwQWQsIHdycSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSVFBSSVZfSU9DVExfRTJQOgotCQkJUlRNUElvY3RsRTJQUk9NKHBBZCwgd3JxKTsKLQkJCWJyZWFrOwotI2lmZGVmIFJUTVBfUkZfUldfU1VQUE9SVAotCQljYXNlIFJUUFJJVl9JT0NUTF9SRjoKLQkJCVJUTVBJb2N0bFJGKHBBZCwgd3JxKTsKLQkJCWJyZWFrOwotI2VuZGlmIC8vIFJUTVBfUkZfUldfU1VQUE9SVCAvLwotI2VuZGlmIC8vIERCRyAvLwotCi0gICAgICAgIGNhc2UgU0lPQ0VUSFRPT0w6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdQUklOVChSVF9ERUJVR19FUlJPUiwgKCJJT0NUTDo6dW5rbm93biBJT0NUTCdzIGNtZCA9IDB4JTA4eFxuIiwgY21kKSk7Ci0JCQlTdGF0dXMgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCX0KLQotICAgIGlmKFN0YXRlTWFjaGluZVRvdWNoZWQpIC8vIFVwcGVyIGxheWVyIHNlbnQgYSBNTE1FLXJlbGF0ZWQgb3BlcmF0aW9ucwotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0KLQlyZXR1cm4gU3RhdHVzOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBTU0lECi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1NTSURfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBORElTXzgwMl8xMV9TU0lEICAgICAgICAgICAgICAgICAgICBTc2lkLCAqcFNzaWQ9TlVMTDsKLSAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gRkFMU0U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7Ci0KLSAgICBpZiggc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKQotICAgIHsKLSAgICAgICAgTmRpc1plcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7Ci0gICAgICAgIGlmIChzdHJsZW4oYXJnKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBOZGlzTW92ZU1lbW9yeShTc2lkLlNzaWQsIGFyZywgc3RybGVuKGFyZykpOwotICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gc3RybGVuKGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgIC8vQU5ZIHNzaWQKLSAgICAgICAgewotICAgICAgICAgICAgU3NpZC5Tc2lkTGVuZ3RoID0gMDsKLQkgICAgbWVtY3B5KFNzaWQuU3NpZCwgIiIsIDApOwotCQlwQWRhcHRlci0+U3RhQ2ZnLkJzc1R5cGUgPSBCU1NfSU5GUkE7Ci0JCXBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldlcFN0YXR1cyAgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCX0KLSAgICAgICAgcFNzaWQgPSAmU3NpZDsKLQotICAgICAgICBpZiAocEFkYXB0ZXItPk1sbWUuQ250bE1hY2hpbmUuQ3VyclN0YXRlICE9IENOVExfSURMRSkKLSAgICAgICAgewotICAgICAgICAgICAgUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkYXB0ZXIpOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotICAgICAgICB9Ci0KLQkJaWYgKChwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPj0gOCkgJiYKLQkJCShwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPD0gNjQpKQotCQl7Ci0JCQlTVFJJTkcgcGFzc3BocmFzZV9zdHJbNjVdID0gezB9OwotCQkJVUNIQVIga2V5TWF0ZXJpYWxbNDBdOwotCi0JCQlSVE1QTW92ZU1lbW9yeShwYXNzcGhyYXNlX3N0ciwgcEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCBwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4pOwotCQkJUlRNUFplcm9NZW1vcnkocEFkYXB0ZXItPlN0YUNmZy5QTUssIDMyKTsKLQkJCWlmIChwQWRhcHRlci0+U3RhQ2ZnLldwYVBhc3NQaHJhc2VMZW4gPT0gNjQpCi0JCQl7Ci0JCQkgICAgQXRvSCgoUFNUUklORykgcEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCBwQWRhcHRlci0+U3RhQ2ZnLlBNSywgMzIpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICAgIFBhc3N3b3JkSGFzaCgoUFNUUklORykgcEFkYXB0ZXItPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCBTc2lkLlNzaWQsIFNzaWQuU3NpZExlbmd0aCwga2V5TWF0ZXJpYWwpOwotCQkJICAgIE5kaXNNb3ZlTWVtb3J5KHBBZGFwdGVyLT5TdGFDZmcuUE1LLCBrZXlNYXRlcmlhbCwgMzIpOwotCQkJfQotCQl9Ci0KLSAgICAgICAgcEFkYXB0ZXItPk1sbWVBdXguQ3VyclJlcUlzRnJvbU5kaXMgPSBUUlVFOwotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBGQUxTRTsKLQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKLQotICAgICAgICBNbG1lRW5xdWV1ZShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgTUxNRV9DTlRMX1NUQVRFX01BQ0hJTkUsCi0gICAgICAgICAgICAgICAgICAgIE9JRF84MDJfMTFfU1NJRCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE5ESVNfODAyXzExX1NTSUQpLAotICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKXBTc2lkKTsKLQotICAgICAgICBTdGF0ZU1hY2hpbmVUb3VjaGVkID0gVFJVRTsKLSAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1NTSURfUHJvYzo6KExlbj0lZCxTc2lkPSVzKVxuIiwgU3NpZC5Tc2lkTGVuZ3RoLCBTc2lkLlNzaWQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBzdWNjZXNzID0gRkFMU0U7Ci0KLSAgICBpZiAoU3RhdGVNYWNoaW5lVG91Y2hlZCkgLy8gVXBwZXIgbGF5ZXIgc2VudCBhIE1MTUUtcmVsYXRlZCBvcGVyYXRpb25zCi0JUlRNUF9NTE1FX0hBTkRMRVIocEFkYXB0ZXIpOwotCi0gICAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLSNpZmRlZiBXTU1fU1VQUE9SVAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV21tQ2FwYWJsZSBFbmFibGUgb3IgRGlzYWJsZQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UCVNldF9XbW1DYXBhYmxlX1Byb2MoCi0JSU4JUFJUTVBfQURBUFRFUglwQWQsCi0JSU4JUFNUUklORwkJCWFyZykKLXsKLQlCT09MRUFOCWJXbW1DYXBhYmxlOwotCi0JYldtbUNhcGFibGUgPSBzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApOwotCi0JaWYgKChiV21tQ2FwYWJsZSA9PSAxKQotCQkpCi0JCXBBZC0+Q29tbW9uQ2ZnLmJXbW1DYXBhYmxlID0gVFJVRTsKLQllbHNlIGlmIChiV21tQ2FwYWJsZSA9PSAwKQotCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSA9IEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOyAgLy9JbnZhbGlkIGFyZ3VtZW50Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfV21tQ2FwYWJsZV9Qcm9jOjooYldtbUNhcGFibGU9JWQpXG4iLAotCQlwQWQtPkNvbW1vbkNmZy5iV21tQ2FwYWJsZSkpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gV01NX1NVUFBPUlQgLy8KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgTmV0d29yayBUeXBlKEluZnJhc3RydWN0dXJlL0FkaG9jIG1vZGUpCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X05ldHdvcmtUeXBlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgVUlOVDMyCVZhbHVlID0gMDsKLQotICAgIGlmIChzdHJjbXAoYXJnLCAiQWRob2MiKSA9PSAwKQotCXsKLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfQURIT0MpCi0JCXsKLQkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAotCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKLSAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKLSAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJCVZhbHVlICY9ICh+MHg4MCk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLSAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLQkJCWlmIChJTkZSQV9PTihwQWRhcHRlcikpCi0JCQl7Ci0JCQkJLy9CT09MRUFOIENhbmNlbGxlZDsKLQkJCQkvLyBTZXQgdGhlIEF1dG9SZWNvbm5lY3RTc2lkIHRvIHByZXZlbnQgaXQgcmVjb25uZWN0IHRvIG9sZCBTU0lECi0JCQkJLy8gU2luY2UgY2FsbGluZyB0aGlzIGluZGljYXRlIHVzZXIgZG9uJ3Qgd2FudCB0byBjb25uZWN0IHRvIHRoYXQgU1NJRCBhbnltb3JlLgotCQkJCXBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuPSAzMjsKLQkJCQlOZGlzWmVyb01lbW9yeShwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZCwgcEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWRMZW4pOwotCi0JCQkJTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKLQotCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QgRXZlbnQgQkIhXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0FESE9DOwotICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooQUQtSE9DKVxuIikpOwotCX0KLSAgICBlbHNlIGlmIChzdHJjbXAoYXJnLCAiSW5mcmEiKSA9PSAwKQotCXsKLQkJaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSAhPSBCU1NfSU5GUkEpCi0JCXsKLQkJCS8vIENvbmZpZyBoYXMgY2hhbmdlZAotCQkJcEFkYXB0ZXItPmJDb25maWdDaGFuZ2VkID0gVFJVRTsKLSAgICAgICAgICAgIGlmIChNT05JVE9SX09OKHBBZGFwdGVyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFJYX0ZJTFRSX0NGRywgU1RBTk9STUFMKTsKLSAgICAgICAgICAgICAgICBSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgTUFDX1NZU19DVFJMLCAmVmFsdWUpOwotCQkJCVZhbHVlICY9ICh+MHg4MCk7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLSAgICAgICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5iQXV0b1JlY29ubmVjdCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgTGlua0Rvd24ocEFkYXB0ZXIsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLQkJCWlmIChBREhPQ19PTihwQWRhcHRlcikpCi0JCQl7Ci0JCQkJLy8gU2V0IHRoZSBBdXRvUmVjb25uZWN0U3NpZCB0byBwcmV2ZW50IGl0IHJlY29ubmVjdCB0byBvbGQgU1NJRAotCQkJCS8vIFNpbmNlIGNhbGxpbmcgdGhpcyBpbmRpY2F0ZSB1c2VyIGRvbid0IHdhbnQgdG8gY29ubmVjdCB0byB0aGF0IFNTSUQgYW55bW9yZS4KLQkJCQlwQWRhcHRlci0+TWxtZUF1eC5BdXRvUmVjb25uZWN0U3NpZExlbj0gMzI7Ci0JCQkJTmRpc1plcm9NZW1vcnkocEFkYXB0ZXItPk1sbWVBdXguQXV0b1JlY29ubmVjdFNzaWQsIHBBZGFwdGVyLT5NbG1lQXV4LkF1dG9SZWNvbm5lY3RTc2lkTGVuKTsKLQotCQkJCUxpbmtEb3duKHBBZGFwdGVyLCBGQUxTRSk7Ci0JCQl9Ci0JCX0KLQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX0lORlJBOwotICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IHBBZGFwdGVyLT5TdGFDZmcuT3JpRGV2VHlwZTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPT09PlNldF9OZXR3b3JrVHlwZV9Qcm9jOjooSU5GUkEpXG4iKSk7Ci0JfQotICAgIGVsc2UgaWYgKHN0cmNtcChhcmcsICJNb25pdG9yIikgPT0gMCkKLSAgICB7Ci0JCQlVQ0hBUgliYnBWYWx1ZSA9IDA7Ci0JCQlCQ05fVElNRV9DRkdfU1RSVUMgY3NyOwotCQkJT1BTVEFUVVNfQ0xFQVJfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19JTkZSQV9PTik7Ci0gICAgICAgICAgICBPUFNUQVRVU19DTEVBUl9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX0FESE9DX09OKTsKLQkJCU9QU1RBVFVTX1NFVF9GTEFHKHBBZGFwdGVyLCBmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCk7Ci0JCQkvLyBkaXNhYmxlIGFsbCBwZXJpb2RpYyBzdGF0ZSBtYWNoaW5lCi0JCQlwQWRhcHRlci0+U3RhQ2ZnLmJBdXRvUmVjb25uZWN0ID0gRkFMU0U7Ci0JCQkvLyByZXNldCBhbGwgbWxtZSBzdGF0ZSBtYWNoaW5lCi0JCQlSVE1QX01MTUVfUkVTRVRfU1RBVEVfTUFDSElORShwQWRhcHRlcik7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJmT1BfU1RBVFVTX01FRElBX1NUQVRFX0NPTk5FQ1RFRCBcbiIpKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsID09IDApCi0gICAgICAgICAgICB7Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5Db21tb25DZmcuUGh5TW9kZSA9PSBQSFlfMTFBTl9NSVhFRCkKLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDM2OwotICAgICAgICAgICAgICAgIGVsc2UKLSNlbmRpZiAvLyBET1QxMV9OX1NVUFBPUlQgLy8KLSAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IDY7Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTl9DaGFubmVsQ2hlY2socEFkYXB0ZXIpOwotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0JCQlpZiAocEFkYXB0ZXItPkNvbW1vbkNmZy5QaHlNb2RlID49IFBIWV8xMUFCR05fTUlYRUQgJiYKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLlJlZ1RyYW5zbWl0U2V0dGluZy5maWVsZC5CVyA9PSBCV180MCAmJgotICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQUJPVkUpCi0JCQl7Ci0JCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlICY9ICh+MHgxOCk7Ci0JCQkJYmJwVmFsdWUgfD0gMHgxMDsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKLQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQkJCS8vICBSWCA6IGNvbnRyb2wgY2hhbm5lbCBhdCBsb3dlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlICY9ICh+MHgyMCk7Ci0JCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1IzLCBiYnBWYWx1ZSk7Ci0KLQkJCQlSVE1QX0lPX1JFQUQzMihwQWRhcHRlciwgVFhfQkFORF9DRkcsICZWYWx1ZSk7Ci0JCQkJVmFsdWUgJj0gMHhmZmZmZmZmZTsKLQkJCQlSVE1QX0lPX1dSSVRFMzIocEFkYXB0ZXIsIFRYX0JBTkRfQ0ZHLCBWYWx1ZSk7Ci0JCQkJcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCA9IHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCArIDI7Ci0gICAgICAgICAgICAgICAgQXNpY1N3aXRjaENoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwsIEZBTFNFKTsKLQkJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwpOwotICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIkJXXzQwICxjb250cm9sX2NoYW5uZWwoJWQpLCBDZW50cmFsQ2hhbm5lbCglZCkgXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwQWRhcHRlci0+Q29tbW9uQ2ZnLlBoeU1vZGUgPj0gUEhZXzExQUJHTl9NSVhFRCAmJgotICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5SZWdUcmFuc21pdFNldHRpbmcuZmllbGQuQlcgPT0gQldfNDAgJiYKLSAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5Db21tb25DZmcuUmVnVHJhbnNtaXRTZXR0aW5nLmZpZWxkLkVYVENIQSA9PSBFWFRDSEFfQkVMT1cpCi0JCQl7Ci0JCQkJLy8gNDBNSHogLGNvbnRyb2wgY2hhbm5lbCBhdCB1cHBlcgotCQkJCVJUTVBfQkJQX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I0LCAmYmJwVmFsdWUpOwotCQkJCWJicFZhbHVlICY9ICh+MHgxOCk7Ci0JCQkJYmJwVmFsdWUgfD0gMHgxMDsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKLQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzQwOwotCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgJlZhbHVlKTsKLQkJCQlWYWx1ZSB8PSAweDE7Ci0JCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBUWF9CQU5EX0NGRywgVmFsdWUpOwotCi0JCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjMsICZiYnBWYWx1ZSk7Ci0JCQkJYmJwVmFsdWUgfD0gKDB4MjApOwotCQkJCVJUTVBfQkJQX0lPX1dSSVRFOF9CWV9SRUdfSUQocEFkYXB0ZXIsIEJCUF9SMywgYmJwVmFsdWUpOwotCQkJCXBBZGFwdGVyLT5Db21tb25DZmcuQ2VudHJhbENoYW5uZWwgPSBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwgLSAyOwotICAgICAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsLCBGQUxTRSk7Ci0JCQkgICAgQXNpY0xvY2tDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNlbnRyYWxDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJCV180MCAsY29udHJvbF9jaGFubmVsKCVkKSwgQ2VudHJhbENoYW5uZWwoJWQpIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkNvbW1vbkNmZy5DZW50cmFsQ2hhbm5lbCkpOwotCQkJfQotCQkJZWxzZQotI2VuZGlmIC8vIERPVDExX05fU1VQUE9SVCAvLwotCQkJewotCQkJCS8vIDIwTUh6Ci0JCQkJUlRNUF9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsICZiYnBWYWx1ZSk7Ci0JCQkJYmJwVmFsdWUgJj0gKH4weDE4KTsKLQkJCQlSVE1QX0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCBCQlBfUjQsIGJicFZhbHVlKTsKLQkJCQlwQWRhcHRlci0+Q29tbW9uQ2ZnLkJCUEN1cnJlbnRCVyA9IEJXXzIwOwotICAgICAgICAgICAgICAgIEFzaWNTd2l0Y2hDaGFubmVsKHBBZGFwdGVyLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwsIEZBTFNFKTsKLQkJCSAgICBBc2ljTG9ja0NoYW5uZWwocEFkYXB0ZXIsIHBBZGFwdGVyLT5Db21tb25DZmcuQ2hhbm5lbCk7Ci0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiQldfMjAsIENoYW5uZWwoJWQpXG4iLCBwQWRhcHRlci0+Q29tbW9uQ2ZnLkNoYW5uZWwpKTsKLQkJCX0KLQkJCS8vIEVuYWJsZSBSeCB3aXRoIHByb21pc2N1b3VzIHJlY2VwdGlvbgotCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBSWF9GSUxUUl9DRkcsIDB4Myk7Ci0JCQkvLyBBU0lDIHN1cHBvcnN0cyBzbmlmZmVyIGZ1bmN0aW9uIHdpdGggcmVwbGFjaW5nIFJTU0kgd2l0aCB0aW1lc3RhbXAuCi0JCQkvL1JUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsICZWYWx1ZSk7Ci0JCQkvL1ZhbHVlIHw9ICgweDgwKTsKLQkJCS8vUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBNQUNfU1lTX0NUUkwsIFZhbHVlKTsKLQkJCS8vIGRpc2FibGUgc3luYwotCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIEJDTl9USU1FX0NGRywgJmNzci53b3JkKTsKLQkJCWNzci5maWVsZC5iQmVhY29uR2VuID0gMDsKLQkJCWNzci5maWVsZC5iVEJUVEVuYWJsZSA9IDA7Ci0JCQljc3IuZmllbGQuVHNmU3luY01vZGUgPSAwOwotCQkJUlRNUF9JT19XUklURTMyKHBBZGFwdGVyLCBCQ05fVElNRV9DRkcsIGNzci53b3JkKTsKLQotCQkJcEFkYXB0ZXItPlN0YUNmZy5Cc3NUeXBlID0gQlNTX01PTklUT1I7Ci0gICAgICAgICAgICBwQWRhcHRlci0+bmV0X2Rldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUFJJU007IC8vQVJQSFJEX0lFRUU4MDIxMTsgLy8gSUVFRTgwMjExCi0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI9PT0+U2V0X05ldHdvcmtUeXBlX1Byb2M6OihNT05JVE9SKVxuIikpOwotICAgIH0KLQotICAgIC8vIFJlc2V0IFJhbGluayBzdXBwbGljYW50IHRvIG5vdCB1c2UsIGl0IHdpbGwgYmUgc2V0IHRvIHN0YXJ0IHdoZW4gVUkgc2V0IFBNSyBrZXkKLSAgICBwQWRhcHRlci0+U3RhQ2ZnLldwYVN0YXRlID0gU1NfTk9UVVNFOwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X05ldHdvcmtUeXBlX1Byb2M6OihOZXR3b3JrVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IEF1dGhlbnRpY2F0aW9uIG1vZGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfQXV0aE1vZGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoKHN0cmNtcChhcmcsICJXRVBBVVRPIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXBhdXRvIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiT1BFTiIpID09IDApIHx8IChzdHJjbXAoYXJnLCAib3BlbiIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIlNIQVJFRCIpID09IDApIHx8IChzdHJjbXAoYXJnLCAic2hhcmVkIikgPT0gMCkpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPSBOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQ7Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJXUEFQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYXBzayIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBTk9ORSIpID09IDApIHx8IChzdHJjbXAoYXJnLCAid3Bhbm9uZSIpID09IDApKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZTsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTJQU0siKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTJwc2siKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV1BBIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3cGEiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTsKLSAgICBlbHNlIGlmICgoc3RyY21wKGFyZywgIldQQTIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIndwYTIiKSA9PSAwKSkKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTI7Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcEFkYXB0ZXItPlN0YUNmZy5Qb3J0U2VjdXJlZCA9IFdQQV84MDJfMVhfUE9SVF9OT1RfU0VDVVJFRDsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9BdXRoTW9kZV9Qcm9jOjooQXV0aE1vZGU9JWQpXG4iLCBwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgRW5jcnlwdGlvbiBUeXBlCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0VuY3J5cFR5cGVfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoKHN0cmNtcChhcmcsICJOT05FIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJub25lIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiV0VQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ3ZXAiKSA9PSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMVdFUEVuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFXRVBFbmFibGVkOwotCSAgICBwQWRhcHRlci0+U3RhQ2ZnLkdyb3VwQ2lwaGVyICAgPSBOZGlzODAyXzExV0VQRW5hYmxlZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJUS0lQIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICJ0a2lwIikgPT0gMCkpCi0gICAgewotICAgICAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA8IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXMgICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5QYWlyQ2lwaGVyICAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkgICAgcEFkYXB0ZXItPlN0YUNmZy5Hcm91cENpcGhlciAgID0gTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJBRVMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgImFlcyIpID09IDApKQotICAgIHsKLSAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPCBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzICAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuUGFpckNpcGhlciAgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0JICAgIHBBZGFwdGVyLT5TdGFDZmcuR3JvdXBDaXBoZXIgICA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcEFkYXB0ZXItPlN0YUNmZy5PcmlnV2VwU3RhdHVzID0gcEFkYXB0ZXItPlN0YUNmZy5XZXBTdGF0dXM7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfRW5jcnlwVHlwZV9Qcm9jOjooRW5jcnlwVHlwZT0lZClcbiIsIHBBZGFwdGVyLT5TdGFDZmcuV2VwU3RhdHVzKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgRGVmYXVsdCBLZXkgSUQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfRGVmYXVsdEtleUlEX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgVUxPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SWR4OwotCi0gICAgS2V5SWR4ID0gc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLSAgICBpZigoS2V5SWR4ID49IDEgKSAmJiAoS2V5SWR4IDw9IDQpKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRLZXlJZCA9IChVQ0hBUikgKEtleUlkeCAtIDEgKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsgIC8vSW52YWxpZCBhcmd1bWVudAotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0RlZmF1bHRLZXlJRF9Qcm9jOjooRGVmYXVsdEtleUlEPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0S2V5SWQpKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMQotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkxX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OihLZXkxPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5MV9Qcm9jOjooS2V5MT0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkxX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzBdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMF0uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFNldCBXRVAgS0VZMgotICAgIFJldHVybjoKLSAgICAgICAgVFJVRSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgT0ssIEZBTFNFIG90aGVyd2lzZQotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotSU5UIFNldF9LZXkyX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5TGVuOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2lwaGVyQWxnPUNJUEhFUl9XRVA2NDsKLQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIGRvIG5vdGhpbmcKLQotICAgIEtleUxlbiA9IHN0cmxlbihhcmcpOwotCi0gICAgc3dpdGNoIChLZXlMZW4pCi0gICAgewotICAgICAgICBjYXNlIDU6IC8vd2VwIDQwIEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IC8vd2VwIDQwIEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiSGV4IikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IC8vd2VwIDEwNCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OihLZXkyPSVzIGFuZCB0eXBlPSVzKVxuIiwgYXJnLCAiQXNjaWkiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNjogLy93ZXAgMTA0IEhleCB0eXBlCi0gICAgICAgICAgICBmb3IoaT0wOyBpIDwgS2V5TGVuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICFpc3hkaWdpdCgqKGFyZytpKSkgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvL05vdCBIZXggdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleUxlbiA9IEtleUxlbiAvIDIgOwotICAgICAgICAgICAgQXRvSChhcmcsIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMV0uS2V5LCBLZXlMZW4gLyAyKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5Ml9Qcm9jOjooS2V5Mj0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvL0ludmFsaWQgYXJndW1lbnQKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkyX1Byb2M6OkludmFsaWQgYXJndW1lbnQgKD0lcylcbiIsIGFyZykpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLkNpcGhlckFsZyA9IENpcGhlckFsZzsKLQotICAgIC8vIFNldCBrZXlzIChpbnRvIEFTSUMpCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICA7ICAgLy8gbm90IHN1cHBvcnQKLSAgICBlbHNlICAgIC8vIE9sZCBXRVAgc3R1ZmYKLSAgICB7Ci0gICAgICAgIEFzaWNBZGRTaGFyZWRLZXlFbnRyeShwQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsxXS5DaXBoZXJBbGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzFdLktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdFUCBLRVkzCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X0tleTNfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZGFwdGVyLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMZW47Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXBoZXJBbGc9Q0lQSEVSX1dFUDY0OwotCi0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQXV0aE1vZGUgPj0gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgS2V5TGVuID0gc3RybGVuKGFyZyk7Ci0KLSAgICBzd2l0Y2ggKEtleUxlbikKLSAgICB7Ci0gICAgICAgIGNhc2UgNTogLy93ZXAgNDAgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVA2NDsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUFzY2lpKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDogLy93ZXAgNDAgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9SGV4KVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzogLy93ZXAgMTA0IEFzY2lpIHR5cGUKLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuOwotICAgICAgICAgICAgbWVtY3B5KHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LCBhcmcsIEtleUxlbik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6KEtleTM9JXMgYW5kIHR5cGU9QXNjaWkpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAvL3dlcCAxMDQgSGV4IHR5cGUKLSAgICAgICAgICAgIGZvcihpPTA7IGkgPCBLZXlMZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggIWlzeGRpZ2l0KCooYXJnK2kpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vTm90IEhleCB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5TGVuID0gS2V5TGVuIC8gMiA7Ci0gICAgICAgICAgICBBdG9IKGFyZywgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVsyXS5LZXksIEtleUxlbiAvIDIpOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDEyODsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9LZXkzX1Byb2M6OihLZXkzPSVzIGFuZCB0eXBlPUhleClcbiIsIGFyZykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vSW52YWxpZCBhcmd1bWVudAotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTNfUHJvYzo6SW52YWxpZCBhcmd1bWVudCAoPSVzKVxuIiwgYXJnKSk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uQ2lwaGVyQWxnID0gQ2lwaGVyQWxnOwotCi0gICAgLy8gU2V0IGtleXMgKGludG8gQVNJQykKLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIDsgICAvLyBub3Qgc3VwcG9ydAotICAgIGVsc2UgICAgLy8gT2xkIFdFUCBzdHVmZgotICAgIHsKLSAgICAgICAgQXNpY0FkZFNoYXJlZEtleUVudHJ5KHBBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzJdLkNpcGhlckFsZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bMl0uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV0VQIEtFWTQKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfS2V5NF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUxlbjsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOwotICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpcGhlckFsZz1DSVBIRVJfV0VQNjQ7Ci0KLSAgICBpZiAocEFkYXB0ZXItPlN0YUNmZy5BdXRoTW9kZSA+PSBOZGlzODAyXzExQXV0aE1vZGVXUEEpCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBkbyBub3RoaW5nCi0KLSAgICBLZXlMZW4gPSBzdHJsZW4oYXJnKTsKLQotICAgIHN3aXRjaCAoS2V5TGVuKQotICAgIHsKLSAgICAgICAgY2FzZSA1OiAvL3dlcCA0MCBBc2NpaSB0eXBlCi0gICAgICAgICAgICBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleUxlbiA9IEtleUxlbjsKLSAgICAgICAgICAgIG1lbWNweShwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgYXJnLCBLZXlMZW4pOwotICAgICAgICAgICAgQ2lwaGVyQWxnID0gQ0lQSEVSX1dFUDY0OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJBc2NpaSIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAvL3dlcCA0MCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQNjQ7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkhleCIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvL3dlcCAxMDQgQXNjaWkgdHlwZQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW47Ci0gICAgICAgICAgICBtZW1jcHkocEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksIGFyZywgS2V5TGVuKTsKLSAgICAgICAgICAgIENpcGhlckFsZyA9IENJUEhFUl9XRVAxMjg7Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjooS2V5ND0lcyBhbmQgdHlwZT0lcylcbiIsIGFyZywgIkFzY2lpIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IC8vd2VwIDEwNCBIZXggdHlwZQotICAgICAgICAgICAgZm9yKGk9MDsgaSA8IEtleUxlbjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoKihhcmcraSkpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLy9Ob3QgSGV4IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXlMZW4gPSBLZXlMZW4gLyAyIDsKLSAgICAgICAgICAgIEF0b0goYXJnLCBwQWRhcHRlci0+U2hhcmVkS2V5W0JTUzBdWzNdLktleSwgS2V5TGVuIC8gMik7Ci0gICAgICAgICAgICBDaXBoZXJBbGcgPSBDSVBIRVJfV0VQMTI4OwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X0tleTRfUHJvYzo6KEtleTQ9JXMgYW5kIHR5cGU9JXMpXG4iLCBhcmcsICJIZXgiKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLy9JbnZhbGlkIGFyZ3VtZW50Ci0gICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfS2V5NF9Qcm9jOjpJbnZhbGlkIGFyZ3VtZW50ICg9JXMpXG4iLCBhcmcpKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5DaXBoZXJBbGcgPSBDaXBoZXJBbGc7Ci0KLSAgICAvLyBTZXQga2V5cyAoaW50byBBU0lDKQotICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLkF1dGhNb2RlID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLSAgICAgICAgOyAgIC8vIG5vdCBzdXBwb3J0Ci0gICAgZWxzZSAgICAvLyBPbGQgV0VQIHN0dWZmCi0gICAgewotICAgICAgICBBc2ljQWRkU2hhcmVkS2V5RW50cnkocEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBZGFwdGVyLT5TaGFyZWRLZXlbQlNTMF1bM10uQ2lwaGVyQWxnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPlNoYXJlZEtleVtCU1MwXVszXS5LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgU2V0IFdQQSBQU0sga2V5Ci0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1dQQVBTS19Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgaWYgKChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0spICYmCi0gICAgICAgIChwQWQtPlN0YUNmZy5BdXRoTW9kZSAhPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKSAmJgotCSAgICAocEFkLT5TdGFDZmcuQXV0aE1vZGUgIT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSkKLQkJKQotICAgICAgICByZXR1cm4gVFJVRTsgICAgLy8gZG8gbm90aGluZwotCi0gICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jOjooV1BBUFNLPSVzKVxuIiwgYXJnKSk7Ci0KLQlzdGF0dXMgPSBSVF9DZmdTZXRXUEFQU0tLZXkocEFkLCBhcmcsIHBBZC0+TWxtZUF1eC5Tc2lkLCBwQWQtPk1sbWVBdXguU3NpZExlbiwgcEFkLT5TdGFDZmcuUE1LKTsKLQlpZiAoc3RhdHVzID09IEZBTFNFKQotCXsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiU2V0X1dQQVBTS19Qcm9jKCk6IFNldCBrZXkgZmFpbGVkIVxuIikpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCU5kaXNaZXJvTWVtb3J5KHBBZC0+U3RhQ2ZnLldwYVBhc3NQaHJhc2UsIDY0KTsKLSAgICBOZGlzTW92ZU1lbW9yeShwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlLCBhcmcsIHN0cmxlbihhcmcpKTsKLSAgICBwQWQtPlN0YUNmZy5XcGFQYXNzUGhyYXNlTGVuID0gKFVJTlQpc3RybGVuKGFyZyk7Ci0KLQotCi0gICAgaWYocEFkLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfQURIT0MgJiYKLSAgICAgICBwQWQtPlN0YUNmZy5BdXRoTW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lKQotICAgIHsKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19OT1RVU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8vIFN0YXJ0IFNUQSBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3RhdGUgPSBTU19TVEFSVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgUG93ZXIgU2F2aW5nIG1vZGUKLSAgICBSZXR1cm46Ci0gICAgICAgIFRSVUUgaWYgYWxsIHBhcmFtZXRlcnMgYXJlIE9LLCBGQUxTRSBvdGhlcndpc2UKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLUlOVCBTZXRfUFNNb2RlX1Byb2MoCi0gICAgSU4gIFBSVE1QX0FEQVBURVIgICBwQWRhcHRlciwKLSAgICBJTiAgUFNUUklORyAgICAgICAgICBhcmcpCi17Ci0gICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuQnNzVHlwZSA9PSBCU1NfSU5GUkEpCi0gICAgewotICAgICAgICBpZiAoKHN0cmNtcChhcmcsICJNYXhfUFNQIikgPT0gMCkgfHwKLQkJCShzdHJjbXAoYXJnLCAibWF4X3BzcCIpID09IDApIHx8Ci0JCQkoc3RyY21wKGFyZywgIk1BWF9QU1AiKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gZG8gTk9UIHR1cm4gb24gUFNNIGJpdCBoZXJlLCB3YWl0IHVudGlsIE1sbWVDaGVja1BzbUNoYW5nZSgpCi0gICAgICAgICAgICAvLyB0byBleGNsdWRlIGNlcnRhaW4gc2l0dWF0aW9ucy4KLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZU1BWF9QU1A7Ci0gICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSA1OwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKHN0cmNtcChhcmcsICJGYXN0X1BTUCIpID09IDApIHx8Ci0JCQkJIChzdHJjbXAoYXJnLCAiZmFzdF9wc3AiKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAoc3RyY21wKGFyZywgIkZBU1RfUFNQIikgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGRvIE5PVCB0dXJuIG9uIFBTTSBiaXQgaGVyZSwgd2FpdCB1bnRpbCBNbG1lQ2hlY2tQc21DaGFuZ2UoKQotICAgICAgICAgICAgLy8gdG8gZXhjbHVkZSBjZXJ0YWluIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlRmFzdF9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUZhc3RfUFNQOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5EZWZhdWx0TGlzdGVuQ291bnQgPSAzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiTGVnYWN5X1BTUCIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAibGVnYWN5X3BzcCIpID09IDApIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAoYXJnLCAiTEVHQUNZX1BTUCIpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBkbyBOT1QgdHVybiBvbiBQU00gYml0IGhlcmUsIHdhaXQgdW50aWwgTWxtZUNoZWNrUHNtQ2hhbmdlKCkKLSAgICAgICAgICAgIC8vIHRvIGV4Y2x1ZGUgY2VydGFpbiBzaXR1YXRpb25zLgotICAgICAgICAgICAgT1BTVEFUVVNfU0VUX0ZMQUcocEFkYXB0ZXIsIGZPUF9TVEFUVVNfUkVDRUlWRV9EVElNKTsKLSAgICAgICAgICAgIGlmIChwQWRhcHRlci0+U3RhQ2ZnLmJXaW5kb3dzQUNDQU1FbmFibGUgPT0gRkFMU0UpCi0gICAgICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NCYXR0ZXJ5UG93ZXJNb2RlID0gTmRpczgwMl8xMVBvd2VyTW9kZUxlZ2FjeV9QU1A7Ci0gICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLkRlZmF1bHRMaXN0ZW5Db3VudCA9IDM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0RlZmF1bHQgTmRpczgwMl8xMVBvd2VyTW9kZUNBTQotICAgICAgICAgICAgLy8gY2xlYXIgUFNNIGJpdCBpbW1lZGlhdGVseQotICAgICAgICAgICAgUlRNUF9TRVRfUFNNX0JJVChwQWRhcHRlciwgUFdSX0FDVElWRSk7Ci0gICAgICAgICAgICBPUFNUQVRVU19TRVRfRkxBRyhwQWRhcHRlciwgZk9QX1NUQVRVU19SRUNFSVZFX0RUSU0pOwotICAgICAgICAgICAgaWYgKHBBZGFwdGVyLT5TdGFDZmcuYldpbmRvd3NBQ0NBTUVuYWJsZSA9PSBGQUxTRSkKLSAgICAgICAgICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLldpbmRvd3NQb3dlck1vZGUgPSBOZGlzODAyXzExUG93ZXJNb2RlQ0FNOwotICAgICAgICAgICAgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzQmF0dGVyeVBvd2VyTW9kZSA9IE5kaXM4MDJfMTFQb3dlck1vZGVDQU07Ci0gICAgICAgIH0KLQotICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfUFNNb2RlX1Byb2M6OihQU01vZGU9JWxkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5XaW5kb3dzUG93ZXJNb2RlKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0KLSAgICByZXR1cm4gVFJVRTsKLX0KLS8vQWRkIHRvIHN1cG9ydCB0aGUgZnVuY3Rpb24gd2hpY2ggY2xvdWxkIGR5bmFtaWNhbGxseSBlbmFibGUvZGlzYWJsZSBQQ0llIFBvd2VyIFNhdmluZwotCi0jaWZkZWYgV1BBX1NVUFBMSUNBTlRfU1VQUE9SVAotLyoKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIERlc2NyaXB0aW9uOgotICAgICAgICBTZXQgV3BhU3VwcG9ydCBmbGFnLgotICAgIFZhbHVlOgotICAgICAgICAwOiBEcml2ZXIgaWdub3JlIHdwYV9zdXBwbGljYW50LgotICAgICAgICAxOiB3cGFfc3VwcGxpY2FudCBpbml0aWF0ZXMgc2Nhbm5pbmcgYW5kIEFQIHNlbGVjdGlvbi4KLSAgICAgICAgMjogZHJpdmVyIHRha2VzIGNhcmUgb2Ygc2Nhbm5pbmcsIEFQIHNlbGVjdGlvbiwgYW5kIElFRUUgODAyLjExIGFzc29jaWF0aW9uIHBhcmFtZXRlcnMuCi0gICAgUmV0dXJuOgotICAgICAgICBUUlVFIGlmIGFsbCBwYXJhbWV0ZXJzIGFyZSBPSywgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1dwYV9TdXBwb3J0KAotICAgIElOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlhcmcpCi17Ci0KLSAgICBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMCkKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLSAgICBlbHNlIGlmICggc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQotICAgICAgICBwQWQtPlN0YUNmZy5XcGFTdXBwbGljYW50VVAgPSBXUEFfU1VQUExJQ0FOVF9FTkFCTEU7Ci0gICAgZWxzZSBpZiAoIHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPT0gMikKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRU5BQkxFX1dJVEhfV0VCX1VJOwotICAgIGVsc2UKLSAgICAgICAgcEFkLT5TdGFDZmcuV3BhU3VwcGxpY2FudFVQID0gV1BBX1NVUFBMSUNBTlRfRElTQUJMRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9XcGFfU3VwcG9ydDo6KFdwYVN1cHBsaWNhbnRVUD0lZClcbiIsIHBBZC0+U3RhQ2ZnLldwYVN1cHBsaWNhbnRVUCkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYgLy8gV1BBX1NVUFBMSUNBTlRfU1VQUE9SVCAvLwotCi0jaWZkZWYgREJHCi0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFJlYWQgLyBXcml0ZSBNQUMKLSAgICBBcmd1bWVudHM6Ci0gICAgICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgICAgIHdycSAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpb2N0bCBhcmd1bWVudAotCi0gICAgUmV0dXJuIFZhbHVlOgotICAgICAgICBOb25lCi0KLSAgICBOb3RlOgotICAgICAgICBVc2FnZToKLSAgICAgICAgICAgICAgIDEuKSBpd3ByaXYgcmEwIG1hYyAwICAgICAgICA9PT4gcmVhZCBNQUMgd2hlcmUgQWRkcj0weDAKLSAgICAgICAgICAgICAgIDIuKSBpd3ByaXYgcmEwIG1hYyAwPTEyICAgICA9PT4gd3JpdGUgTUFDIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotVk9JRCBSVE1QSW9jdGxNQUMoCi0JSU4JUFJUTVBfQURBUFRFUglwQWRhcHRlciwKLQlJTglzdHJ1Y3QgaXdyZXEJKndycSkKLXsKLQlQU1RSSU5HCQkJCXRoaXNfY2hhcjsKLQlQU1RSSU5HCQkJCXZhbHVlOwotCUlOVAkJCQkJaiA9IDAsIGsgPSAwOwotCVNUUklORwkJCQltc2dbMTAyNF07Ci0JU1RSSU5HCQkJCWFyZ1syNTVdOwotCVVMT05HCQkJCW1hY0FkZHIgPSAwOwotCVVDSEFSCQkJCXRlbXBbMTZdOwotCVNUUklORwkJCQl0ZW1wMlsxNl07Ci0JVUlOVDMyCQkJCW1hY1ZhbHVlID0gMDsKLQlJTlQJCQkJCVN0YXR1czsKLQlCT09MRUFOCQkJCWJJc1ByaW50QWxsTUFDID0gRkFMU0U7Ci0KLQotCW1lbXNldChtc2csIDB4MDAsIDEwMjQpOwotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSAvL05vIHBhcmFtZXRlcnMuCi0JewotCSAgICBTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihhcmcsIHdycS0+dS5kYXRhLnBvaW50ZXIsICh3cnEtPnUuZGF0YS5sZW5ndGggPiAyNTUpID8gMjU1IDogd3JxLT51LmRhdGEubGVuZ3RoKTsKLQkJc3ByaW50Zihtc2csICJcbiIpOwotCi0JCS8vUGFyc2luZyBSZWFkIG9yIFdyaXRlCi0JICAgIHRoaXNfY2hhciA9IGFyZzsKLQkJaWYgKCEqdGhpc19jaGFyKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JCQkqdmFsdWUrKyA9IDA7Ci0KLQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQotCQl7IC8vUmVhZAotCQkJLy8gU2FuaXR5IGNoZWNrCi0JCQlpZihzdHJsZW4odGhpc19jaGFyKSA+IDQpCi0JCQkJZ290byBuZXh0OwotCi0JCQlqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCWlmKHRoaXNfY2hhcltqXSA+ICdmJyB8fCB0aGlzX2NoYXJbal0gPCAnMCcpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gTWFjIEFkZHIKLQkJCWsgPSBqID0gc3RybGVuKHRoaXNfY2hhcik7Ci0JCQl3aGlsZShqLS0gPiAwKQotCQkJewotCQkJCXRoaXNfY2hhcls0LWsral0gPSB0aGlzX2NoYXJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA0KQotCQkJCXRoaXNfY2hhclszLWsrK109JzAnOwotCQkJdGhpc19jaGFyWzRdPSdcMCc7Ci0KLQkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID09IDQpCi0JCQl7Ci0JCQkJQXRvSCh0aGlzX2NoYXIsIHRlbXAsIDIpOwotCQkJCW1hY0FkZHIgPSAqdGVtcCoyNTYgKyB0ZW1wWzFdOwotCQkJCWlmIChtYWNBZGRyIDwgMHhGRkZGKQotCQkJCXsKLQkJCQkJUlRNUF9JT19SRUFEMzIocEFkYXB0ZXIsIG1hY0FkZHIsICZtYWNWYWx1ZSk7Ci0JCQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIk1hY0FkZHI9JWx4LCBNYWNWYWx1ZT0leFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKLQkJCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDhsWF06JTA4WCAgIiwgbWFjQWRkciAsIG1hY1ZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgbWFjCi0JCQkJCWJJc1ByaW50QWxsTUFDID0gVFJVRTsKLQkJCQkJZ290byBuZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsgLy9Xcml0ZQotCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOwotCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOwotCi0JCQkvLyBTYW5pdHkgY2hlY2sKLQkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQotCQkJCWdvdG8gbmV4dDsKLQotCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWogPSBzdHJsZW4odGVtcDIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQlpZih0ZW1wMltqXSA+ICdmJyB8fCB0ZW1wMltqXSA8ICcwJykKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvL01BQyBBZGRyCi0JCQlrID0gaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQl0aGlzX2NoYXJbNC1rK2pdID0gdGhpc19jaGFyW2pdOwotCQkJfQotCi0JCQl3aGlsZShrIDwgNCkKLQkJCQl0aGlzX2NoYXJbMy1rKytdPScwJzsKLQkJCXRoaXNfY2hhcls0XT0nXDAnOwotCi0JCQkvL01BQyB2YWx1ZQotCQkJayA9IGogPSBzdHJsZW4odGVtcDIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQl0ZW1wMls4LWsral0gPSB0ZW1wMltqXTsKLQkJCX0KLQotCQkJd2hpbGUoayA8IDgpCi0JCQkJdGVtcDJbNy1rKytdPScwJzsKLQkJCXRlbXAyWzhdPSdcMCc7Ci0KLQkJCXsKLQkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7Ci0JCQkJbWFjQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07Ci0KLQkJCQlBdG9IKHRlbXAyLCB0ZW1wLCA0KTsKLQkJCQltYWNWYWx1ZSA9ICp0ZW1wKjI1NioyNTYqMjU2ICsgdGVtcFsxXSoyNTYqMjU2ICsgdGVtcFsyXSoyNTYgKyB0ZW1wWzNdOwotCi0JCQkJLy8gZGVidWcgbW9kZQotCQkJCWlmIChtYWNBZGRyID09IChIV19ERUJVR19TRVRUSU5HX0JBU0UgKyA0KSkKLQkJCQl7Ci0JCQkJCS8vIDB4MmJmNDogYnl0ZTAgbm9uLXplcm86IGVuYWJsZSBSMTcgdHVuaW5nLCAwOiBkaXNhYmxlIFIxNyB0dW5pbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hY1ZhbHVlICYgMHgwMDAwMDBmZikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFkYXB0ZXItPkJicFR1bmluZy5iRW5hYmxlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCgidHVybiBvbiBSMTcgdHVuaW5nXG4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBSNjY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQWRhcHRlci0+QmJwVHVuaW5nLmJFbmFibGUgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFI2NiA9IDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpOwotI2lmZGVmIFJBTElOS19BVEUKLQkJCQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJCQkJewotCQkJCQkJCUFURV9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCQkJCQkJUlRNUF9CQlBfSU9fV1JJVEU4X0JZX1JFR19JRChwQWRhcHRlciwgQkJQX1I2NiwgKDB4MjYgKyBHRVRfTE5BX0dBSU4ocEFkYXB0ZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwoInR1cm4gb2ZmIFIxNyB0dW5pbmcsIHJlc3RvcmUgdG8gMHglMDJ4XG4iLCBSNjYpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiTWFjQWRkcj0lMDJseCwgTWFjVmFsdWU9MHgleFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpKTsKLQotCQkJCVJUTVBfSU9fV1JJVEUzMihwQWRhcHRlciwgbWFjQWRkciwgbWFjVmFsdWUpOwotCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiWzB4JTA4bFhdOiUwOFggICIsIG1hY0FkZHIsIG1hY1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCWJJc1ByaW50QWxsTUFDID0gVFJVRTsKLW5leHQ6Ci0JaWYgKGJJc1ByaW50QWxsTUFDKQotCXsKLQkJc3RydWN0IGZpbGUJCSpmaWxlX3c7Ci0JCVBTVFJJTkcJCQlmaWxlTmFtZSA9ICJNYWNEdW1wLnR4dCI7Ci0JCW1tX3NlZ21lbnRfdAlvcmlnX2ZzOwotCi0JCW9yaWdfZnMgPSBnZXRfZnMoKTsKLQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0KLQkJLy8gb3BlbiBmaWxlCi0JCWZpbGVfdyA9IGZpbHBfb3BlbihmaWxlTmFtZSwgT19XUk9OTFl8T19DUkVBVCwgMCk7Ci0JCWlmIChJU19FUlIoZmlsZV93KSkKLQkJewotCQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiLS0+MikgJXM6IEVycm9yICVsZCBvcGVuaW5nICVzXG4iLCBfX0ZVTkNUSU9OX18sIC1QVFJfRVJSKGZpbGVfdyksIGZpbGVOYW1lKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoZmlsZV93LT5mX29wICYmIGZpbGVfdy0+Zl9vcC0+d3JpdGUpCi0JCQl7Ci0JCQkJZmlsZV93LT5mX3BvcyA9IDA7Ci0JCQkJbWFjQWRkciA9IDB4MTAwMDsKLQotCQkJCXdoaWxlIChtYWNBZGRyIDw9IDB4MTgwMCkKLQkJCQl7Ci0JCQkJCVJUTVBfSU9fUkVBRDMyKHBBZGFwdGVyLCBtYWNBZGRyLCAmbWFjVmFsdWUpOwotCQkJCQlzcHJpbnRmKG1zZywgIiUwOGx4ID0gJTA4WFxuIiwgbWFjQWRkciwgbWFjVmFsdWUpOwotCi0JCQkJCS8vIHdyaXRlIGRhdGEgdG8gZmlsZQotCQkJCQlmaWxlX3ctPmZfb3AtPndyaXRlKGZpbGVfdywgbXNnLCBzdHJsZW4obXNnKSwgJmZpbGVfdy0+Zl9wb3MpOwotCi0JCQkJCXByaW50aygiJXMiLCBtc2cpOwotCQkJCQltYWNBZGRyICs9IDQ7Ci0JCQkJfQotCQkJCXNwcmludGYobXNnLCAiXG5EdW1wIGFsbCBNQUMgdmFsdWVzIHRvICVzXG4iLCBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlmaWxwX2Nsb3NlKGZpbGVfdywgTlVMTCk7Ci0JCX0KLQkJc2V0X2ZzKG9yaWdfZnMpOwotCX0KLQlpZihzdHJsZW4obXNnKSA9PSAxKQotCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIj09PT5FcnJvciBjb21tYW5kIGZvcm1hdCEiKTsKLQotCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCi0Jd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JU3RhdHVzID0gY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIG1zZywgd3JxLT51LmRhdGEubGVuZ3RoKTsKLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bE1BQ1xuXG4iKSk7Ci19Ci0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgUmVhZCAvIFdyaXRlIEUyUFJPTQotICAgIEFyZ3VtZW50czoKLSAgICAgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAgICAgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgZTJwIDAJCT09PiByZWFkIEUyUFJPTSB3aGVyZSBBZGRyPTB4MAotICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgZTJwIDA9MTIzNCAgICA9PT4gd3JpdGUgRTJQUk9NIHdoZXJlIEFkZHI9MHgwLCB2YWx1ZT0xMjM0Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBJb2N0bEUyUFJPTSgKLQlJTglQUlRNUF9BREFQVEVSCXBBZGFwdGVyLAotCUlOCXN0cnVjdCBpd3JlcQkqd3JxKQotewotCVBTVFJJTkcJCQkJdGhpc19jaGFyOwotCVBTVFJJTkcJCQkJdmFsdWU7Ci0JSU5UCQkJCQlqID0gMCwgayA9IDA7Ci0JU1RSSU5HCQkJCW1zZ1sxMDI0XTsKLQlTVFJJTkcJCQkJYXJnWzI1NV07Ci0JVVNIT1JUCQkJCWVlcEFkZHIgPSAwOwotCVVDSEFSCQkJCXRlbXBbMTZdOwotCVNUUklORwkJCQl0ZW1wMlsxNl07Ci0JVVNIT1JUCQkJCWVlcFZhbHVlOwotCWludAkJCQkJU3RhdHVzOwotCUJPT0xFQU4JCQkJYklzUHJpbnRBbGxFMlAgPSBGQUxTRTsKLQotCi0JbWVtc2V0KG1zZywgMHgwMCwgMTAyNCk7Ci0JaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KLQl7Ci0JICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQlzcHJpbnRmKG1zZywgIlxuIik7Ci0KLQkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKLQkJdGhpc19jaGFyID0gYXJnOwotCi0KLQkJaWYgKCEqdGhpc19jaGFyKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgodmFsdWUgPSBydHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JCQkqdmFsdWUrKyA9IDA7Ci0KLQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQotCQl7IC8vUmVhZAotCi0JCQkvLyBTYW5pdHkgY2hlY2sKLQkJCWlmKHN0cmxlbih0aGlzX2NoYXIpID4gNCkKLQkJCQlnb3RvIG5leHQ7Ci0KLQkJCWogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGhpc19jaGFyW2pdID4gJ2YnIHx8IHRoaXNfY2hhcltqXSA8ICcwJykKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBFMlBST00gYWRkcgotCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKLQkJCX0KLQotCQkJd2hpbGUoayA8IDQpCi0JCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7Ci0JCQl0aGlzX2NoYXJbNF09J1wwJzsKLQotCQkJaWYoc3RybGVuKHRoaXNfY2hhcikgPT0gNCkKLQkJCXsKLQkJCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7Ci0JCQkJZWVwQWRkciA9ICp0ZW1wKjI1NiArIHRlbXBbMV07Ci0JCQkJaWYgKGVlcEFkZHIgPCAweEZGRkYpCi0JCQkJewotCQkJCQlSVDI4eHhfRUVQUk9NX1JFQUQxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOwotCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlsweCUwNFhdOjB4JTA0WCAgIiwgZWVwQWRkciAsIGVlcFZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgYmJwCi0JCQkJCWJJc1ByaW50QWxsRTJQID0gVFJVRTsKLQkJCQkJZ290byBuZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCXsgLy9Xcml0ZQotCQkJbWVtY3B5KCZ0ZW1wMiwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOwotCQkJdGVtcDJbc3RybGVuKHZhbHVlKV0gPSAnXDAnOwotCi0JCQkvLyBTYW5pdHkgY2hlY2sKLQkJCWlmKChzdHJsZW4odGhpc19jaGFyKSA+IDQpIHx8IHN0cmxlbih0ZW1wMikgPiA4KQotCQkJCWdvdG8gbmV4dDsKLQotCQkJaiA9IHN0cmxlbih0aGlzX2NoYXIpOwotCQkJd2hpbGUoai0tID4gMCkKLQkJCXsKLQkJCQlpZih0aGlzX2NoYXJbal0gPiAnZicgfHwgdGhpc19jaGFyW2pdIDwgJzAnKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlqID0gc3RybGVuKHRlbXAyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJaWYodGVtcDJbal0gPiAnZicgfHwgdGVtcDJbal0gPCAnMCcpCi0JCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy9NQUMgQWRkcgotCQkJayA9IGogPSBzdHJsZW4odGhpc19jaGFyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGhpc19jaGFyWzQtaytqXSA9IHRoaXNfY2hhcltqXTsKLQkJCX0KLQotCQkJd2hpbGUoayA8IDQpCi0JCQkJdGhpc19jaGFyWzMtaysrXT0nMCc7Ci0JCQl0aGlzX2NoYXJbNF09J1wwJzsKLQotCQkJLy9NQUMgdmFsdWUKLQkJCWsgPSBqID0gc3RybGVuKHRlbXAyKTsKLQkJCXdoaWxlKGotLSA+IDApCi0JCQl7Ci0JCQkJdGVtcDJbNC1rK2pdID0gdGVtcDJbal07Ci0JCQl9Ci0KLQkJCXdoaWxlKGsgPCA0KQotCQkJCXRlbXAyWzMtaysrXT0nMCc7Ci0JCQl0ZW1wMls0XT0nXDAnOwotCi0JCQlBdG9IKHRoaXNfY2hhciwgdGVtcCwgMik7Ci0JCQllZXBBZGRyID0gKnRlbXAqMjU2ICsgdGVtcFsxXTsKLQotCQkJQXRvSCh0ZW1wMiwgdGVtcCwgMik7Ci0JCQllZXBWYWx1ZSA9ICp0ZW1wKjI1NiArIHRlbXBbMV07Ci0KLQkJCVJUMjh4eF9FRVBST01fV1JJVEUxNihwQWRhcHRlciwgZWVwQWRkciwgZWVwVmFsdWUpOwotCQkJc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJbMHglMDJYXTolMDJYICAiLCBlZXBBZGRyLCBlZXBWYWx1ZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCQliSXNQcmludEFsbEUyUCA9IFRSVUU7Ci1uZXh0OgotCWlmIChiSXNQcmludEFsbEUyUCkKLQl7Ci0JCXN0cnVjdCBmaWxlCQkqZmlsZV93OwotCQlQU1RSSU5HCQkJZmlsZU5hbWUgPSAiRUVQUk9NRHVtcC50eHQiOwotCQltbV9zZWdtZW50X3QJb3JpZ19mczsKLQotCQlvcmlnX2ZzID0gZ2V0X2ZzKCk7Ci0JCXNldF9mcyhLRVJORUxfRFMpOwotCi0JCS8vIG9wZW4gZmlsZQotCQlmaWxlX3cgPSBmaWxwX29wZW4oZmlsZU5hbWUsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOwotCQlpZiAoSVNfRVJSKGZpbGVfdykpCi0JCXsKLQkJCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIi0tPjIpICVzOiBFcnJvciAlbGQgb3BlbmluZyAlc1xuIiwgX19GVU5DVElPTl9fLCAtUFRSX0VSUihmaWxlX3cpLCBmaWxlTmFtZSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKGZpbGVfdy0+Zl9vcCAmJiBmaWxlX3ctPmZfb3AtPndyaXRlKQotCQkJewotCQkJCWZpbGVfdy0+Zl9wb3MgPSAwOwotCQkJCWVlcEFkZHIgPSAweDAwOwotCi0JCQkJd2hpbGUgKGVlcEFkZHIgPD0gMHhGRSkKLQkJCQl7Ci0JCQkJCVJUMjh4eF9FRVBST01fUkVBRDE2KHBBZGFwdGVyLCBlZXBBZGRyLCBlZXBWYWx1ZSk7Ci0JCQkJCXNwcmludGYobXNnLCAiJTA4eCA9ICUwNHhcbiIsIGVlcEFkZHIgLCBlZXBWYWx1ZSk7Ci0KLQkJCQkJLy8gd3JpdGUgZGF0YSB0byBmaWxlCi0JCQkJCWZpbGVfdy0+Zl9vcC0+d3JpdGUoZmlsZV93LCBtc2csIHN0cmxlbihtc2cpLCAmZmlsZV93LT5mX3Bvcyk7Ci0KLQkJCQkJcHJpbnRrKCIlcyIsIG1zZyk7Ci0JCQkJCWVlcEFkZHIgKz0gMjsKLQkJCQl9Ci0JCQkJc3ByaW50Zihtc2csICJcbkR1bXAgYWxsIEVFUFJPTSB2YWx1ZXMgdG8gJXNcbiIsIGZpbGVOYW1lKTsKLQkJCX0KLQkJCWZpbHBfY2xvc2UoZmlsZV93LCBOVUxMKTsKLQkJfQotCQlzZXRfZnMob3JpZ19mcyk7Ci0JfQotCWlmKHN0cmxlbihtc2cpID09IDEpCi0JCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOwotCi0KLQkvLyBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlcgotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCVN0YXR1cyA9IGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBtc2csIHdycS0+dS5kYXRhLmxlbmd0aCk7Ci0KLQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCI8PT1SVE1QSW9jdGxFMlBST01cbiIpKTsKLX0KLQotCi0jaWZkZWYgUlQzMHh4Ci0vKgotICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgRGVzY3JpcHRpb246Ci0gICAgICAgIFJlYWQgLyBXcml0ZSBSRiByZWdpc3RlcgotQXJndW1lbnRzOgotICAgIHBBZGFwdGVyICAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgcmYgICAgICAgICAgICAgICAgPT0+IHJlYWQgYWxsIFJGIHJlZ2lzdGVycwotICAgICAgICAgICAgICAgMi4pIGl3cHJpdiByYTAgcmYgMSAgICAgICAgICAgICAgPT0+IHJlYWQgUkYgd2hlcmUgUmVnSUQ9MQotICAgICAgICAgICAgICAgMy4pIGl3cHJpdiByYTAgcmYgMT0xMAkJICAgID09PiB3cml0ZSBSRiBSMT0weDEwCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1WT0lEIFJUTVBJb2N0bFJGKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkYXB0ZXIsCi0JSU4Jc3RydWN0IGl3cmVxCSp3cnEpCi17Ci0JQ0hBUgkJCQkqdGhpc19jaGFyOwotCUNIQVIJCQkJKnZhbHVlOwotCVVDSEFSCQkJCXJlZ1JGID0gMDsKLQlTVFJJTkcJCQkJbXNnWzIwNDhdOwotCUNIQVIJCQkJYXJnWzI1NV07Ci0JSU5UCQkJCQlyZklkOwotCUxPTkcJCQkJcmZWYWx1ZTsKLQlpbnQJCQkJCVN0YXR1czsKLQlCT09MRUFOCQkJCWJJc1ByaW50QWxsUkYgPSBGQUxTRTsKLQotCi0JbWVtc2V0KG1zZywgMHgwMCwgMjA0OCk7Ci0JaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIC8vTm8gcGFyYW1ldGVycy4KLQl7Ci0JICAgIFN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKGFyZywgd3JxLT51LmRhdGEucG9pbnRlciwgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDI1NSkgPyAyNTUgOiB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCQlzcHJpbnRmKG1zZywgIlxuIik7Ci0KLQkgICAgLy9QYXJzaW5nIFJlYWQgb3IgV3JpdGUKLQkJdGhpc19jaGFyID0gYXJnOwotCQlpZiAoISp0aGlzX2NoYXIpCi0JCQlnb3RvIG5leHQ7Ci0KLQkJaWYgKCh2YWx1ZSA9IHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JCQkqdmFsdWUrKyA9IDA7Ci0KLQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKQotCQl7IC8vUmVhZAotCQkJaWYgKHNzY2FuZigoUFNUUklORykgdGhpc19jaGFyLCAiJWQiLCAmKHJmSWQpKSA9PSAxKQotCQkJewotCQkJCWlmIChyZklkIDw9IDMxKQotCQkJCXsKLSNpZmRlZiBSQUxJTktfQVRFCi0JCQkJCS8qCi0JCQkJCQlJbiBSVDI4NjAgQVRFIG1vZGUsIHdlIGRvIG5vdCBsb2FkIDgwNTEgZmlybXdhcmUuCi0JICAgICAgICAgICAgICAgICAgICBXZSBtdXN0IGFjY2VzcyBSRiBkaXJlY3RseS4KLQkJCQkJCUZvciBSVDI4NzAgQVRFIG1vZGUsIEFURV9SRl9JT19XUklURTgoL1JFQUQ4KV9CWV9SRUdfSUQgYXJlIHJlZGVmaW5lZC4KLQkJCQkJKi8KLQkJCQkJaWYgKEFURV9PTihwQWRhcHRlcikpCi0JCQkJCXsKLQkJCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQkJCX0KLQkJCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQkJCQkJLy8gYWNjb3JkaW5nIHRvIEFuZHksIEdhcnksIERhdmlkIHJlcXVpcmUuCi0JCQkJCS8vIHRoZSBjb21tYW5kIHJmIHNoYWxsIHJlYWQgcmYgcmVnaXN0ZXIgZGlyZWN0bHkgZm9yIGR1YnVnLgotCQkJCQkvLyBCQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCVJUMzB4eFJlYWRSRlJlZ2lzdGVyKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCi0JCQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiUiUwMmRbMHglMDJ4XTolMDJYICAiLCByZklkLCByZklkLCByZWdSRik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ly9JbnZhbGlkIHBhcmFtZXRlcywgc28gZGVmYXVsdCBwcmludGsgYWxsIFJGCi0JCQkJCWJJc1ByaW50QWxsUkYgPSBUUlVFOwotCQkJCQlnb3RvIG5leHQ7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeyAvL0ludmFsaWQgcGFyYW1ldGVzLCBzbyBkZWZhdWx0IHByaW50ayBhbGwgUkYKLQkJCQliSXNQcmludEFsbFJGID0gVFJVRTsKLQkJCQlnb3RvIG5leHQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7IC8vV3JpdGUKLQkJCWlmICgoc3NjYW5mKChQU1RSSU5HKSB0aGlzX2NoYXIsICIlZCIsICYocmZJZCkpID09IDEpICYmIChzc2NhbmYoKFBTVFJJTkcpIHZhbHVlLCAiJWx4IiwgJihyZlZhbHVlKSkgPT0gMSkpCi0JCQl7Ci0JCQkJaWYgKHJmSWQgPD0gMzEpCi0JCQkJewotI2lmZGVmIFJBTElOS19BVEUKLQkJCQkJCS8qCi0JCQkJCQkJSW4gUlQyODYwIEFURSBtb2RlLCB3ZSBkbyBub3QgbG9hZCA4MDUxIGZpcm13YXJlLgotCQkgICAgICAgICAgICAgICAgICAgIFdlIG11c3QgYWNjZXNzIFJGIGRpcmVjdGx5LgotCQkJCQkJCUZvciBSVDI4NzAgQVRFIG1vZGUsIEFURV9SRl9JT19XUklURTgoL1JFQUQ4KV9CWV9SRUdfSUQgYXJlIHJlZGVmaW5lZC4KLQkJCQkJCSovCi0JCQkJCQlpZiAoQVRFX09OKHBBZGFwdGVyKSkKLQkJCQkJCXsKLQkJCQkJCQlBVEVfUkZfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCByZklkLCAmcmVnUkYpOwotCQkJCQkJCUFURV9SRl9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCAoVUNIQVIpcmZJZCwoVUNIQVIpIHJmVmFsdWUpOwotCQkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCi0JCQkJCQkJQVRFX1JGX0lPX1JFQUQ4X0JZX1JFR19JRChwQWRhcHRlciwgcmZJZCwgJnJlZ1JGKTsKLQkJCQkJCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIlIlMDJkWzB4JTAyWF06JTAyWFxuIiwgcmZJZCwgcmZJZCwgcmVnUkYpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotI2VuZGlmIC8vIFJBTElOS19BVEUgLy8KLQkJCQkJCXsKLQkJCQkJCQkvLyBhY2NvcmRpbmcgdG8gQW5keSwgR2FyeSwgRGF2aWQgcmVxdWlyZS4KLQkJCQkJCQkvLyB0aGUgY29tbWFuZCBSRiBzaGFsbCByZWFkL3dyaXRlIFJGIHJlZ2lzdGVyIGRpcmVjdGx5IGZvciBkdWJ1Zy4KLQkJCQkJCQkvL0JCUF9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIGJicElkLCAmcmVnQkJQKTsKLQkJCQkJCQkvL0JCUF9JT19XUklURThfQllfUkVHX0lEKHBBZGFwdGVyLCAoVUNIQVIpYmJwSWQsKFVDSEFSKSBiYnBWYWx1ZSk7Ci0JCQkJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQkJCQkJUlQzMHh4V3JpdGVSRlJlZ2lzdGVyKHBBZGFwdGVyLCAoVUNIQVIpcmZJZCwoVUNIQVIpIHJmVmFsdWUpOwotCQkJCQkJCS8vUmVhZCBpdCBiYWNrIGZvciBzaG93aW5nCi0JCQkJCQkJLy9CQlBfSU9fUkVBRDhfQllfUkVHX0lEKHBBZGFwdGVyLCBiYnBJZCwgJnJlZ0JCUCk7Ci0JCQkJCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQkgICAgICAgICAgICAgICAgc3ByaW50Zihtc2crc3RybGVuKG1zZyksICJSJTAyZFsweCUwMlhdOiUwMlhcbiIsIHJmSWQsIHJmSWQsIHJlZ1JGKTsKLQkJCQkgICAgICAgICAgICAgICAgfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJey8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBSRgotCQkJCQliSXNQcmludEFsbFJGID0gVFJVRTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7IC8vSW52YWxpZCBwYXJhbWV0ZXMsIHNvIGRlZmF1bHQgcHJpbnRrIGFsbCBSRgotCQkJCWJJc1ByaW50QWxsUkYgPSBUUlVFOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQkJYklzUHJpbnRBbGxSRiA9IFRSVUU7Ci1uZXh0OgotCWlmIChiSXNQcmludEFsbFJGKQotCXsKLQkJbWVtc2V0KG1zZywgMHgwMCwgMjA0OCk7Ci0JCXNwcmludGYobXNnLCAiXG4iKTsKLQkJZm9yIChyZklkID0gMDsgcmZJZCA8PSAzMTsgcmZJZCsrKQotCQl7Ci0jaWZkZWYgUkFMSU5LX0FURQotCQkJLyoKLQkJCQlJbiBSVDI4NjAgQVRFIG1vZGUsIHdlIGRvIG5vdCBsb2FkIDgwNTEgZmlybXdhcmUuCi0gICAgICAgICAgICAgICAgV2UgbXVzdCBhY2Nlc3MgUkYgZGlyZWN0bHkuCi0JCQkJRm9yIFJUMjg3MCBBVEUgbW9kZSwgQVRFX1JGX0lPX1dSSVRFOCgvUkVBRDgpX0JZX1JFR19JRCBhcmUgcmVkZWZpbmVkLgotCQkJKi8KLQkJCWlmIChBVEVfT04ocEFkYXB0ZXIpKQotCQkJewotCQkJCUFURV9SRl9JT19SRUFEOF9CWV9SRUdfSUQocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQl9Ci0JCQllbHNlCi0jZW5kaWYgLy8gUkFMSU5LX0FURSAvLwotCi0JCQkvLyBhY2NvcmRpbmcgdG8gQW5keSwgR2FyeSwgRGF2aWQgcmVxdWlyZS4KLQkJCS8vIHRoZSBjb21tYW5kIFJGIHNoYWxsIHJlYWQvd3JpdGUgUkYgcmVnaXN0ZXIgZGlyZWN0bHkgZm9yIGR1YnVnLgotCQkJUlQzMHh4UmVhZFJGUmVnaXN0ZXIocEFkYXB0ZXIsIHJmSWQsICZyZWdSRik7Ci0JCQlzcHJpbnRmKG1zZytzdHJsZW4obXNnKSwgIiUwM2QgPSAlMDJYXG4iLCByZklkLCByZWdSRik7Ci0JCX0KLQkJLy8gQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgic3RybGVuKG1zZyk9JWRcbiIsIChVSU5UMzIpc3RybGVuKG1zZykpKTsKLQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc3RybGVuKG1zZyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpKQotCQl7Ci0JCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCIlczogY29weV90b191c2VyKCkgZmFpbFxuIiwgX19GVU5DVElPTl9fKSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaWYoc3RybGVuKG1zZykgPT0gMSkKLQkJCXNwcmludGYobXNnK3N0cmxlbihtc2cpLCAiPT09PkVycm9yIGNvbW1hbmQgZm9ybWF0ISIpOwotCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoImNvcHkgdG8gdXNlciBbbXNnPSVzXVxuIiwgbXNnKSk7Ci0JCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCi0JCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoInN0cmxlbihtc2cpID0lZFxuIiwgKFVJTlQzMilzdHJsZW4obXNnKSkpOwotCi0JCS8vIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyCi0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihtc2cpOwotCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgbXNnLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCX0KLQotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PVJUTVBJb2N0bFJGXG5cbiIpKTsKLX0KLSNlbmRpZiAvLyBSVDMweHggLy8KLSNlbmRpZiAvLyBEQkcgLy8KLQotCi0KLQotSU5UIFNldF9UR25XaWZpVGVzdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPlN0YUNmZy5iVEduV2lmaVRlc3QgPSBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfVEduV2lmaVRlc3RfUHJvYzo6KGJUR25XaWZpVGVzdD0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJUR25XaWZpVGVzdCkpOwotCXJldHVybiBUUlVFOwotfQotCi0jaWZkZWYgRVhUX0JVSUxEX0NIQU5ORUxfTElTVAotSU5UIFNldF9JZWVlODAyMTFkQ2xpZW50TW9kZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkYXB0ZXIsCi0gICAgSU4gIFBTVFJJTkcgICAgICAgICAgYXJnKQotewotICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX05vbmU7Ci0gICAgZWxzZSBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAxKQotICAgICAgICBwQWRhcHRlci0+U3RhQ2ZnLklFRUU4MDIxMWRDbGllbnRNb2RlID0gUnQ4MDJfMTFfRF9GbGV4aWJsZTsKLSAgICBlbHNlIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDIpCi0gICAgICAgIHBBZGFwdGVyLT5TdGFDZmcuSUVFRTgwMjExZENsaWVudE1vZGUgPSBSdDgwMl8xMV9EX1N0cmljdDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIlNldF9JZWVlODAyZE1vZGVfUHJvYzo6KElFRUVFMDIxMWRNb2RlPSVkKVxuIiwgcEFkYXB0ZXItPlN0YUNmZy5JRUVFODAyMTFkQ2xpZW50TW9kZSkpOwotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIEVYVF9CVUlMRF9DSEFOTkVMX0xJU1QgLy8KLQotI2lmZGVmIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQKLUlOVCBTZXRfQ2FycmllckRldGVjdF9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgYXJnKQotewotICAgIGlmIChzaW1wbGVfc3RydG9sKGFyZywgMCwgMTApID09IDApCi0gICAgICAgIHBBZC0+Q29tbW9uQ2ZnLkNhcnJpZXJEZXRlY3QuRW5hYmxlID0gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQ2FycmllckRldGVjdF9Qcm9jOjooQ2FycmllckRldGVjdC5FbmFibGU9JWQpXG4iLCBwQWQtPkNvbW1vbkNmZy5DYXJyaWVyRGV0ZWN0LkVuYWJsZSkpOwotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIENBUlJJRVJfREVURUNUSU9OX1NVUFBPUlQgLy8KLQotCi1JTlQJU2hvd19BZGhvY19NYWNUYWJsZV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBTVFJJTkcJCQlleHRyYSkKLXsKLQlJTlQgaTsKLQotCXNwcmludGYoZXh0cmEsICJcbiIpOwotCi0jaWZkZWYgRE9UMTFfTl9TVVBQT1JUCi0Jc3ByaW50ZihleHRyYSwgIiVzSFQgT3BlcmF0aW5nIE1vZGUgOiAlZFxuIiwgZXh0cmEsIHBBZC0+Q29tbW9uQ2ZnLkFkZEhUSW5mby5BZGRIdEluZm8yLk9wZXJhaW9uTW9kZSk7Ci0jZW5kaWYgLy8gRE9UMTFfTl9TVVBQT1JUIC8vCi0KLQlzcHJpbnRmKGV4dHJhLCAiJXNcbiUtMTlzJS00cyUtNHMlLTdzJS03cyUtN3MlLTEwcyUtNnMlLTZzJS02cyUtNnNcbiIsIGV4dHJhLAotCQkJIk1BQyIsICJBSUQiLCAiQlNTIiwgIlJTU0kwIiwgIlJTU0kxIiwgIlJTU0kyIiwgIlBoTWQiLCAiQlciLCAiTUNTIiwgIlNHSSIsICJTVEJDIik7Ci0KLQlmb3IgKGk9MTsgaTxNQVhfTEVOX09GX01BQ19UQUJMRTsgaSsrKQotCXsKLQkJUE1BQ19UQUJMRV9FTlRSWSBwRW50cnkgPSAmcEFkLT5NYWNUYWIuQ29udGVudFtpXTsKLQotCQlpZiAoc3RybGVuKGV4dHJhKSA+IChJV19QUklWX1NJWkVfTUFTSyAtIDMwKSkKLQkJICAgIGJyZWFrOwotCQlpZiAoKHBFbnRyeS0+VmFsaWRBc0NMSSB8fCBwRW50cnktPlZhbGlkQXNBcENsaSkgJiYgKHBFbnRyeS0+U3N0ID09IFNTVF9BU1NPQykpCi0JCXsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICAiLCBleHRyYSwKLQkJCQlwRW50cnktPkFkZHJbMF0sIHBFbnRyeS0+QWRkclsxXSwgcEVudHJ5LT5BZGRyWzJdLAotCQkJCXBFbnRyeS0+QWRkclszXSwgcEVudHJ5LT5BZGRyWzRdLCBwRW50cnktPkFkZHJbNV0pOwotCQkJc3ByaW50ZihleHRyYSwgIiVzJS00ZCIsIGV4dHJhLCAoaW50KXBFbnRyeS0+QWlkKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNGQiLCBleHRyYSwgKGludClwRW50cnktPmFwaWR4KTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kwKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kxKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtN2QiLCBleHRyYSwgcEVudHJ5LT5Sc3NpU2FtcGxlLkF2Z1Jzc2kyKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtMTBzIiwgZXh0cmEsIEdldFBoeU1vZGUocEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuTU9ERSkpOwotCQkJc3ByaW50ZihleHRyYSwgIiVzJS02cyIsIGV4dHJhLCBHZXRCVyhwRW50cnktPkhUUGh5TW9kZS5maWVsZC5CVykpOwotCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5NQ1MpOwotCQkJc3ByaW50ZihleHRyYSwgIiVzJS02ZCIsIGV4dHJhLCBwRW50cnktPkhUUGh5TW9kZS5maWVsZC5TaG9ydEdJKTsKLQkJCXNwcmludGYoZXh0cmEsICIlcyUtNmQiLCBleHRyYSwgcEVudHJ5LT5IVFBoeU1vZGUuZmllbGQuU1RCQyk7Ci0JCQlzcHJpbnRmKGV4dHJhLCAiJXMlLTEwZCwgJWQsICVkJSVcbiIsIGV4dHJhLCBwRW50cnktPkRlYnVnRklGT0NvdW50LCBwRW50cnktPkRlYnVnVHhDb3VudCwKLQkJCQkJCShwRW50cnktPkRlYnVnVHhDb3VudCkgPyAoKHBFbnRyeS0+RGVidWdUeENvdW50LXBFbnRyeS0+RGVidWdGSUZPQ291bnQpKjEwMC9wRW50cnktPkRlYnVnVHhDb3VudCkgOiAwKTsKLQkJCXNwcmludGYoZXh0cmEsICIlc1xuIiwgZXh0cmEpOwotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLQotSU5UIFNldF9CZWFjb25Mb3N0VGltZV9Qcm9jKAotICAgIElOICBQUlRNUF9BREFQVEVSICAgcEFkLAotICAgIElOICBQU1RSSU5HICAgICAgICAgYXJnKQotewotCVVMT05HIGx0bXAgPSAoVUxPTkcpc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKTsKLQotCWlmICgobHRtcCAhPSAwKSAmJiAobHRtcCA8PSA2MCkpCi0JCXBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lID0gKGx0bXAgKiBPU19IWik7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQmVhY29uTG9zdFRpbWVfUHJvYzo6KEJlYWNvbkxvc3RUaW1lPSVsZClcbiIsIHBBZC0+U3RhQ2ZnLkJlYWNvbkxvc3RUaW1lKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUlOVCBTZXRfQXV0b1JvYW1pbmdfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPlN0YUNmZy5iQXV0b1JvYW1pbmcgPSBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZyA9IFRSVUU7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJRiBTZXRfQXV0b1JvYW1pbmdfUHJvYzo6KGJBdXRvUm9hbWluZz0lZClcbiIsIHBBZC0+U3RhQ2ZnLmJBdXRvUm9hbWluZykpOwotCXJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBEZXNjcmlwdGlvbjoKLSAgICAgICAgSXNzdWUgYSBzaXRlIHN1cnZleSBjb21tYW5kIHRvIGRyaXZlcgotCUFyZ3VtZW50czoKLQkgICAgcEFkYXB0ZXIgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLQkgICAgd3JxICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlvY3RsIGFyZ3VtZW50Ci0KLSAgICBSZXR1cm4gVmFsdWU6Ci0gICAgICAgIE5vbmUKLQotICAgIE5vdGU6Ci0gICAgICAgIFVzYWdlOgotICAgICAgICAgICAgICAgMS4pIGl3cHJpdiByYTAgc2V0IHNpdGVfc3VydmV5Ci0gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1JTlQgU2V0X1NpdGVTdXJ2ZXlfUHJvYygKLQlJTglQUlRNUF9BREFQVEVSCXBBZCwKLQlJTglQU1RSSU5HCQkJYXJnKQotewotCU5ESVNfODAyXzExX1NTSUQgU3NpZDsKLQotCS8vY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBkb3duCi0JaWYgKCFSVE1QX1RFU1RfRkxBRyhwQWQsIGZSVE1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkpCi0JewotCQlEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJJTkZPOjpOZXR3b3JrIGlzIGRvd24hXG4iKSk7Ci0JCXJldHVybiAtRU5FVERPV047Ci0JfQotCi0JaWYgKE1PTklUT1JfT04ocEFkKSkKLSAgICB7Ci0gICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIiEhISBEcml2ZXIgaXMgaW4gTW9uaXRvciBNb2RlIG5vdyAhISFcbiIpKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0JUlRNUFplcm9NZW1vcnkoJlNzaWQsIHNpemVvZihORElTXzgwMl8xMV9TU0lEKSk7Ci0JU3NpZC5Tc2lkTGVuZ3RoID0gMDsKLQlpZiAoKGFyZyAhPSBOVUxMKSAmJgotCQkoc3RybGVuKGFyZykgPD0gTUFYX0xFTl9PRl9TU0lEKSkKLSAgICB7Ci0gICAgICAgIFJUTVBNb3ZlTWVtb3J5KFNzaWQuU3NpZCwgYXJnLCBzdHJsZW4oYXJnKSk7Ci0gICAgICAgIFNzaWQuU3NpZExlbmd0aCA9IHN0cmxlbihhcmcpOwotCX0KLQotCXBBZC0+U3RhQ2ZnLmJTY2FuUmVxSXNGcm9tV2ViVUkgPSBUUlVFOwotCi0JaWYgKHBBZC0+TWxtZS5DbnRsTWFjaGluZS5DdXJyU3RhdGUgIT0gQ05UTF9JRExFKQotCXsKLQkJUlRNUF9NTE1FX1JFU0VUX1NUQVRFX01BQ0hJTkUocEFkKTsKLQkJREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiISEhIE1MTUUgYnVzeSwgcmVzZXQgTUxNRSBzdGF0ZSBtYWNoaW5lICEhIVxuIikpOwotCX0KLQotCS8vIHRlbGwgQ05UTCBzdGF0ZSBtYWNoaW5lIHRvIGNhbGwgTmRpc01TZXRJbmZvcm1hdGlvbkNvbXBsZXRlKCkgYWZ0ZXIgY29tcGxldGluZwotCS8vIHRoaXMgcmVxdWVzdCwgYmVjYXVzZSB0aGlzIHJlcXVlc3QgaXMgaW5pdGlhdGVkIGJ5IE5ESVMuCi0JcEFkLT5NbG1lQXV4LkN1cnJSZXFJc0Zyb21OZGlzID0gRkFMU0U7Ci0JLy8gUmVzZXQgYWxsb3dlZCBzY2FuIHJldHJpZXMKLQlwQWQtPlN0YUNmZy5TY2FuQ250ID0gMDsKLQlOZGlzR2V0U3lzdGVtVXBUaW1lKCZwQWQtPlN0YUNmZy5MYXN0U2NhblRpbWUpOwotCi0JTWxtZUVucXVldWUocEFkLAotCQlNTE1FX0NOVExfU1RBVEVfTUFDSElORSwKLQkJT0lEXzgwMl8xMV9CU1NJRF9MSVNUX1NDQU4sCi0JCVNzaWQuU3NpZExlbmd0aCwKLQkJU3NpZC5Tc2lkKTsKLQotCVJUTVBfTUxNRV9IQU5ETEVSKHBBZCk7Ci0KLSAgICBEQkdQUklOVChSVF9ERUJVR19UUkFDRSwgKCJTZXRfU2l0ZVN1cnZleV9Qcm9jXG4iKSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotSU5UIFNldF9Gb3JjZVR4QnVyc3RfUHJvYygKLSAgICBJTiAgUFJUTVBfQURBUFRFUiAgIHBBZCwKLSAgICBJTiAgUFNUUklORyAgICAgICAgIGFyZykKLXsKLSAgICBpZiAoc2ltcGxlX3N0cnRvbChhcmcsIDAsIDEwKSA9PSAwKQotICAgICAgICBwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0ID0gRkFMU0U7Ci0gICAgZWxzZQotICAgICAgICBwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0ID0gVFJVRTsKLQotICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIklGIFNldF9Gb3JjZVR4QnVyc3RfUHJvYzo6KGJGb3JjZVR4QnVyc3Q9JWQpXG4iLCBwQWQtPlN0YUNmZy5iRm9yY2VUeEJ1cnN0KSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLSNpZmRlZiBBTlRfRElWRVJTSVRZX1NVUFBPUlQKLUlOVAlTZXRfQW50ZW5uYV9Qcm9jKAotCUlOCVBSVE1QX0FEQVBURVIJcEFkLAotCUlOCVBVQ0hBUgkJCWFyZykKLXsKLSAgICBVQ0hBUiBVc2VkQW50OwotCURCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIj09PiBTZXRfQW50ZW5uYV9Qcm9jICoqKioqKioqKioqKioqKioqKipcbiIpKTsKLQotICAgIGlmKHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCkgPD0gMykKLSAgICAgICAgVXNlZEFudCA9IHNpbXBsZV9zdHJ0b2woYXJnLCAwLCAxMCk7Ci0KLSAgICBwQWQtPkNvbW1vbkNmZy5iUnhBbnREaXZlcnNpdHkgPSBVc2VkQW50OyAvLyBBdXRvIHN3aXRjaAotICAgIGlmIChVc2VkQW50ID09IEFOVF9ESVZFUlNJVFlfRU5BQkxFKQotICAgIHsKLSAgICAgICAgICAgIHBBZC0+UnhBbnQuRXZhbHVhdGVTdGFibGVDbnQgPSAwOwotICAgICAgICAgICAgREJHUFJJTlQoUlRfREVCVUdfVFJBQ0UsICgiPD09IFNldF9BbnRlbm5hX1Byb2MoQXV0byBTd2l0Y2ggTW9kZSksICglZCwlZClcbiIsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIHBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCkpOwotICAgIH0KLSAgICAvKiAyOiBGaXggaW4gdGhlIFBIWSBBbnRlbm5hIENPTjEqLwotICAgIGlmIChVc2VkQW50ID09IEFOVF9GSVhfQU5UMSkKLSAgICB7Ci0gICAgICAgICAgICBBc2ljU2V0UnhBbnQocEFkLCAwKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfQW50ZW5uYV9Qcm9jKEZpeCBpbiBBbnQgQ09OMSksICglZCwlZClcbiIsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIHBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCkpOwotICAgIH0KLSAgICAvKiAzOiBGaXggaW4gdGhlIFBIWSBBbnRlbm5hIENPTjIqLwotICAgIGlmIChVc2VkQW50ID09IEFOVF9GSVhfQU5UMikKLSAgICB7Ci0gICAgICAgICAgICBBc2ljU2V0UnhBbnQocEFkLCAxKTsKLSAgICAgICAgICAgIERCR1BSSU5UKFJUX0RFQlVHX1RSQUNFLCAoIjw9PSBTZXRfQW50ZW5uYV9Qcm9jKEZpeCBpbiBBbnQgQ09OMiksICglZCwlZClcbiIsIHBBZC0+UnhBbnQuUGFpcjFQcmltYXJ5UnhBbnQsIHBBZC0+UnhBbnQuUGFpcjFTZWNvbmRhcnlSeEFudCkpOwotICAgIH0KLQotCXJldHVybiBUUlVFOwotfQotI2VuZGlmIC8vIEFOVF9ESVZFUlNJVFlfU1VQUE9SVCAvLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvdnJfaWthbnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvdnJfaWthbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiZmYzYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3ZyX2lrYW5zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhbGluayBUZWNoIEluYy4KLSAqIDVGLiwgTm8uMzYsIFRhaXl1YW4gU3QuLCBKaHViZWkgQ2l0eSwKLSAqIEhzaW5jaHUgQ291bnR5IDMwMiwKLSAqIFRhaXdhbiwgUi5PLkMuCi0gKgotICogKGMpIENvcHlyaWdodCAyMDAyLTIwMDcsIFJhbGluayBUZWNobm9sb2d5LCBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICoKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAqCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKgotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICoKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAqCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAqCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgIE1vZHVsZSBOYW1lOgotCXZyX2lrYW5zLmgKLQotICAgIEFic3RyYWN0OgotICAgIEhhbmRsZSBhc3NvY2lhdGlvbiByZWxhdGVkIHJlcXVlc3RzIGVpdGhlciBmcm9tIFdTVEEgb3IgZnJvbSBsb2NhbCBNTE1FCi0KLSAgICBSZXZpc2lvbiBIaXN0b3J5OgotICAgIFdobyAgICAgICAgICBXaGVuICAgICAgICAgIFdoYXQKLSAgICAtLS0tLS0tLS0gICAgLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU2FtcGxlIExpbgkwMS0yOC0yMDA4ICAgIENyZWF0ZWQKLSAqLwotCi0jaWZuZGVmIF9fVlJfSUtBTlNfSF9fCi0jZGVmaW5lIF9fVlJfSUtBTlNfSF9fCi0KLSNpZm5kZWYgTU9EVUxFX0lLQU5PUwotI2RlZmluZSBJS0FOT1NfRVhURVJOCWV4dGVybgotI2Vsc2UKLSNkZWZpbmUgSUtBTk9TX0VYVEVSTgotI2VuZGlmIC8vIE1PRFVMRV9JS0FOT1MgLy8KLQotI2lmZGVmIElLQU5PU19WWF8xWDAKLQl0eXBlZGVmIHZvaWQgKCpJa2Fub3NXbGFuVHhDYkZ1bmNQKSh2b2lkICosIHZvaWQgKik7Ci0KLQlzdHJ1Y3QgSUtBTk9TX1RYX0lORk8KLQl7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0JCUlrYW5vc1dsYW5UeENiRnVuY1AgKmZwOwotCX07Ci0jZW5kaWYgLy8gSUtBTk9TX1ZYXzFYMCAvLwotCi0KLUlLQU5PU19FWFRFUk4gdm9pZCBWUl9JS0FOT1NfRlBfSW5pdChVSU5UOCBCc3NOdW0sIFVJTlQ4ICpwQXBNYWMpOwotCi1JS0FOT1NfRVhURVJOIElOVDMyIElLQU5PU19EYXRhRnJhbWVzVHgoc3RydWN0IHNrX2J1ZmYgKnBTa2IsCi0JCQkJCQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKnBOZXREZXYpOwotCi1JS0FOT1NfRVhURVJOIHZvaWQgSUtBTk9TX0RhdGFGcmFtZVJ4KFBSVE1QX0FEQVBURVIgcEFkLAotCQkJCQkJCQkJCXZvaWQgKnBSeFBhcmFtLAotCQkJCQkJCQkJCXN0cnVjdCBza19idWZmICpwU2tiLAotCQkJCQkJCQkJCVVJTlQzMiBMZW5ndGgpOwotCi0jZW5kaWYgLy8gX19WUl9JS0FOU19IX18gLy8KLQotLyogRW5kIG9mIHZyX2lrYW5zLmggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvd3BhLmggYi9kcml2ZXJzL3N0YWdpbmcvcnQzMDkwL3dwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmFhMjg3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydDMwOTAvd3BhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSYWxpbmsgVGVjaCBJbmMuCi0gKiA1Ri4sIE5vLjM2LCBUYWl5dWFuIFN0LiwgSmh1YmVpIENpdHksCi0gKiBIc2luY2h1IENvdW50eSAzMDIsCi0gKiBUYWl3YW4sIFIuTy5DLgotICoKLSAqIChjKSBDb3B5cmlnaHQgMjAwMi0yMDA3LCBSYWxpbmsgVGVjaG5vbG9neSwgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAqCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKgotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICoKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICoKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKgotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKgotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlNb2R1bGUgTmFtZToKLQl3cGEuaAotCi0JQWJzdHJhY3Q6Ci0KLQlSZXZpc2lvbiBIaXN0b3J5OgotCVdobwkJCVdoZW4JCQlXaGF0Ci0JLS0tLS0tLS0JLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU5hbWUJCURhdGUJCQlNb2RpZmljYXRpb24gbG9ncwotKi8KLQotI2lmbmRlZglfX1dQQV9IX18KLSNkZWZpbmUJX19XUEFfSF9fCi0KLS8vIEVBUE9MIEtleSBkZXNjcmlwdGVyIGZyYW1lIGZvcm1hdCByZWxhdGVkIGxlbmd0aAotI2RlZmluZSBMRU5fS0VZX0RFU0NfTk9OQ0UJCQkzMgotI2RlZmluZSBMRU5fS0VZX0RFU0NfSVYJCQkJMTYKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX1JTQwkJCTgKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX0lECQkJCTgKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX1JFUExBWQkJCTgKLSNkZWZpbmUgTEVOX0tFWV9ERVNDX01JQwkJCTE2Ci0KLS8vIFRoZSBsZW5ndGggaXMgdGhlIEVBUG9MLUtleSBmcmFtZSBleGNlcHQga2V5IGRhdGEgZmllbGQuCi0vLyBQbGVhc2UgcmVmZXIgdG8gODAyLjExaS0yMDA0ICxGaWd1cmUgNDN1IGluIHAuNzgKLSNkZWZpbmUgTEVOX0VBUE9MX0tFWV9NU0cJCQkoc2l6ZW9mKEtFWV9ERVNDUklQVEVSKSAtIE1BWF9MRU5fT0ZfUlNOSUUpCi0KLS8vIEVBUCBDb2RlIFR5cGUuCi0jZGVmaW5lIEVBUF9DT0RFX1JFUVVFU1QJMQotI2RlZmluZSBFQVBfQ09ERV9SRVNQT05TRQkyCi0jZGVmaW5lIEVBUF9DT0RFX1NVQ0NFU1MgICAgMwotI2RlZmluZSBFQVBfQ09ERV9GQUlMVVJFICAgIDQKLQotLy8gRUFQT0wgZnJhbWUgUHJvdG9jb2wgVmVyc2lvbgotI2RlZmluZQlFQVBPTF9WRVIJCQkJCTEKLSNkZWZpbmUJRUFQT0xfVkVSMgkJCQkJMgotCi0vLyBFQVBPTC1LRVkgRGVzY3JpcHRvciBUeXBlCi0jZGVmaW5lCVdQQTFfS0VZX0RFU0MJCQkJMHhmZQotI2RlZmluZSBXUEEyX0tFWV9ERVNDICAgICAgICAgICAgICAgMHgwMgotCi0vLyBLZXkgRGVzY3JpcHRvciBWZXJzaW9uIG9mIEtleSBJbmZvcm1hdGlvbgotI2RlZmluZQlERVNDX1RZUEVfVEtJUAkJCQkxCi0jZGVmaW5lCURFU0NfVFlQRV9BRVMJCQkJMgotCi0jZGVmaW5lIExFTl9NU0cxXzJXQVkgICAgICAgICAgICAgICAweDdmCi0jZGVmaW5lIE1BWF9MRU5fT0ZfRUFQX0hTICAgICAgICAgICAyNTYKLQotI2RlZmluZSBMRU5fTUFTVEVSX0tFWQkJCQkzMgotCi0vLyBFQVBPTCBFSywgTUsKLSNkZWZpbmUgTEVOX0VBUF9FSwkJCQkJMTYKLSNkZWZpbmUgTEVOX0VBUF9NSUNLCQkJCTE2Ci0jZGVmaW5lIExFTl9FQVBfS0VZCQkJCQkoKExFTl9FQVBfRUspKyhMRU5fRUFQX01JQ0spKQotLy8gVEtJUCBrZXkgcmVsYXRlZAotI2RlZmluZSBMRU5fUE1LSUQJCQkJCTE2Ci0jZGVmaW5lIExFTl9US0lQX0VLCQkJCQkxNgotI2RlZmluZSBMRU5fVEtJUF9SWE1JQ0sJCQkJOAotI2RlZmluZSBMRU5fVEtJUF9UWE1JQ0sJCQkJOAotI2RlZmluZSBMRU5fQUVTX0VLCQkJCQkxNgotI2RlZmluZSBMRU5fQUVTX0tFWQkJCQkJTEVOX0FFU19FSwotI2RlZmluZSBMRU5fVEtJUF9LRVkJCQkJKChMRU5fVEtJUF9FSykrKExFTl9US0lQX1JYTUlDSykrKExFTl9US0lQX1RYTUlDSykpCi0jZGVmaW5lIFRLSVBfQVBfVFhNSUNLX09GRlNFVAkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0VLKSkKLSNkZWZpbmUgVEtJUF9BUF9SWE1JQ0tfT0ZGU0VUCQkoVEtJUF9BUF9UWE1JQ0tfT0ZGU0VUK0xFTl9US0lQX1RYTUlDSykKLSNkZWZpbmUgVEtJUF9HVEtfTEVOR1RICQkJCSgoTEVOX1RLSVBfRUspKyhMRU5fVEtJUF9SWE1JQ0spKyhMRU5fVEtJUF9UWE1JQ0spKQotI2RlZmluZSBMRU5fUFRLCQkJCQkJKChMRU5fRUFQX0tFWSkrKExFTl9US0lQX0tFWSkpCi0jZGVmaW5lIE1JTl9MRU5fT0ZfR1RLCQkJCTUKLSNkZWZpbmUgTEVOX1BNSwkJCQkJCTMyCi0jZGVmaW5lIExFTl9QTUtfTkFNRQkJCQkxNgotI2RlZmluZSBMRU5fTk9OQ0UJCQkJCTMyCi0KLS8vIFJTTiBJRSBMZW5ndGggZGVmaW5pdGlvbgotI2RlZmluZSBNQVhfTEVOX09GX1JTTklFCQkyNTUKLSNkZWZpbmUgTUlOX0xFTl9PRl9SU05JRQkJOAotCi0jZGVmaW5lIEtFWV9MSUZFVElNRQkJCQkzNjAwCi0KLS8vRUFQIFBhY2tldCBUeXBlCi0jZGVmaW5lCUVBUFBhY2tldAkJMAotI2RlZmluZQlFQVBPTFN0YXJ0CQkxCi0jZGVmaW5lCUVBUE9MTG9nb2ZmCQkyCi0jZGVmaW5lCUVBUE9MS2V5CQkzCi0jZGVmaW5lCUVBUE9MQVNGQWxlcnQJNAotI2RlZmluZQlFQVBUdHlwZU1heAkJNQotCi0jZGVmaW5lCUVBUE9MX01TR19JTlZBTElECTAKLSNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfMQkxCi0jZGVmaW5lCUVBUE9MX1BBSVJfTVNHXzIJMgotI2RlZmluZQlFQVBPTF9QQUlSX01TR18zCTMKLSNkZWZpbmUJRUFQT0xfUEFJUl9NU0dfNAk0Ci0jZGVmaW5lCUVBUE9MX0dST1VQX01TR18xCTUKLSNkZWZpbmUJRUFQT0xfR1JPVVBfTVNHXzIJNgotCi0jZGVmaW5lIFBBSVJXSVNFS0VZCQkJCQkxCi0jZGVmaW5lIEdST1VQS0VZCQkJCQkwCi0KLS8vIFJldHJ5IHRpbWVyIGNvdW50ZXIgaW5pdGlhbCB2YWx1ZQotI2RlZmluZSBQRUVSX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgICAwCi0jZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9USU1FUl9DVFIgICAgICAgICAgIDEwCi0jZGVmaW5lIEdST1VQX01TRzFfUkVUUllfVElNRVJfQ1RSICAgICAgICAgIDIwCi0KLS8vIFdQQSBtZWNoYW5pc20gcmV0cnkgdGltZXIgaW50ZXJ2YWwKLSNkZWZpbmUgUEVFUl9NU0cxX1JFVFJZX0VYRUNfSU5UViAgICAgICAgICAgMTAwMAkJCS8vIDEgc2VjCi0jZGVmaW5lIFBFRVJfTVNHM19SRVRSWV9FWEVDX0lOVFYgICAgICAgICAgIDMwMDAJCQkvLyAzIHNlYwotI2RlZmluZSBHUk9VUF9LRVlfVVBEQVRFX0VYRUNfSU5UViAgICAgICAgICAxMDAwCQkJCS8vIDEgc2VjCi0jZGVmaW5lIFBFRVJfR1JPVVBfS0VZX1VQREFURV9JTklWCQkJMjAwMAkJCQkvLyAyIHNlYwotCi0jZGVmaW5lIEVOUVVFVUVfRUFQT0xfU1RBUlRfVElNRVIJCQkyMDAJCQkJCS8vIDIwMCBtcwotCi0vLyBncm91cCByZWtleSBpbnRlcnZhbAotI2RlZmluZSBUSU1FX1JFS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBLVF9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRElTQUJMRV9SRUtFWSAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBNQVhfUkVLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0KLSNkZWZpbmUgTUFYX1JFS0VZX0lOVEVSICAgICAgICAgICAgICAgICAgICAgMHgzZmZmZmZmCi0KLSNkZWZpbmUgR1JPVVBfU1VJVEUJCQkJCTAKLSNkZWZpbmUgUEFJUldJU0VfU1VJVEUJCQkJMQotI2RlZmluZSBBS01fU1VJVEUJCQkJCTIKLSNkZWZpbmUgUE1LSURfTElTVAkJCQkJMwotCi0KLSNkZWZpbmUgRUFQT0xfU1RBUlRfRElTQUJMRQkJCQkJMAotI2RlZmluZSBFQVBPTF9TVEFSVF9QU0sJCQkJCQkxCi0jZGVmaW5lIEVBUE9MX1NUQVJUXzFYCQkJCQkJMgotCi0jZGVmaW5lIE1JWF9DSVBIRVJfV1BBX1RLSVBfT04oeCkgICAgICAgKCgoeCkgJiAweDA4KSAhPSAwKQotI2RlZmluZSBNSVhfQ0lQSEVSX1dQQV9BRVNfT04oeCkgICAgICAgICgoKHgpICYgMHgwNCkgIT0gMCkKLSNkZWZpbmUgTUlYX0NJUEhFUl9XUEEyX1RLSVBfT04oeCkgICAgICAoKCh4KSAmIDB4MDIpICE9IDApCi0jZGVmaW5lIE1JWF9DSVBIRVJfV1BBMl9BRVNfT04oeCkgICAgICAgKCgoeCkgJiAweDAxKSAhPSAwKQotCi0jaWZuZGVmIFJPVU5EX1VQCi0jZGVmaW5lIFJPVU5EX1VQKF9feCwgX195KSBcCi0JKCgoVUxPTkcpKChfX3gpKygoX195KS0xKSkpICYgKChVTE9ORyl+KChfX3kpLTEpKSkKLSNlbmRpZgotCi0jZGVmaW5lCVNFVF9VSU5UMTZfVE9fQVJSQVJZKF9WLCBfTEVOKQkJXAotewkJCQkJCQkJCQkJXAotCV9WWzBdID0gKF9MRU4gJiAweEZGMDApID4+IDg7CQkJXAotCV9WWzFdID0gKF9MRU4gJiAweEZGKTsJCQkJCVwKLX0KLQotI2RlZmluZQlJTkNfVUlOVDE2X1RPX0FSUkFSWShfViwgX0xFTikJCQlcCi17CQkJCQkJCQkJCQkJXAotCVVJTlQxNgl2YXJfbGVuOwkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JdmFyX2xlbiA9IChfVlswXTw8OCkgfCAoX1ZbMV0pOwkJCQlcCi0JdmFyX2xlbiArPSBfTEVOOwkJCQkJCQlcCi0JCQkJCQkJCQkJCQlcCi0JX1ZbMF0gPSAodmFyX2xlbiAmIDB4RkYwMCkgPj4gODsJCQlcCi0JX1ZbMV0gPSAodmFyX2xlbiAmIDB4RkYpOwkJCQkJXAotfQotCi0jZGVmaW5lCUNPTlZfQVJSQVJZX1RPX1VJTlQxNihfVikJKChfVlswXTw8OCkgfCAoX1ZbMV0pKQotCi0KLSNkZWZpbmUJQUREX09ORV9Ub182NEJJVF9WQVIoX1YpCQlcCi17CQkJCQkJCQkJCVwKLQlVQ0hBUgljbnQgPSBMRU5fS0VZX0RFU0NfUkVQTEFZOwlcCi0JZG8JCQkJCQkJCQlcCi0JewkJCQkJCQkJCVwKLQkJY250LS07CQkJCQkJCVwKLQkJX1ZbY250XSsrOwkJCQkJCVwKLQkJaWYgKGNudCA9PSAwKQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCX13aGlsZSAoX1ZbY250XSA9PSAwKTsJCQkJXAotfQotCi0jZGVmaW5lIElTX1dQQV9DQVBBQklMSVRZKGEpICAgICAgICgoKGEpID49IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkgJiYgKChhKSA8PSBOZGlzODAyXzExQXV0aE1vZGVXUEExUFNLV1BBMlBTSykpCi0KLS8vIEVBUE9MIEtleSBJbmZvcm1hdGlvbiBkZWZpbml0aW9uIHdpdGhpbiBLZXkgZGVzY3JpcHRvciBmb3JtYXQKLXR5cGVkZWYJc3RydWN0IFBBQ0tFRCBfS0VZX0lORk8KLXsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0JVUNIQVIJS2V5QWNrOjE7Ci0gICAgVUNIQVIJSW5zdGFsbDoxOwotICAgIFVDSEFSCUtleUluZGV4OjI7Ci0gICAgVUNIQVIJS2V5VHlwZToxOwotICAgIFVDSEFSCUtleURlc2NWZXI6MzsKLSAgICBVQ0hBUglSc3ZkOjM7Ci0gICAgVUNIQVIJRUtEX0RMOjE7CQkvLyBFS0QgZm9yIEFQOyBETCBmb3IgU1RBCi0gICAgVUNIQVIJUmVxdWVzdDoxOwotICAgIFVDSEFSCUVycm9yOjE7Ci0gICAgVUNIQVIJU2VjdXJlOjE7Ci0gICAgVUNIQVIJS2V5TWljOjE7Ci0jZWxzZQotCVVDSEFSCUtleU1pYzoxOwotCVVDSEFSCVNlY3VyZToxOwotCVVDSEFSCUVycm9yOjE7Ci0JVUNIQVIJUmVxdWVzdDoxOwotCVVDSEFSCUVLRF9ETDoxOyAgICAgICAvLyBFS0QgZm9yIEFQOyBETCBmb3IgU1RBCi0JVUNIQVIJUnN2ZDozOwotCVVDSEFSCUtleURlc2NWZXI6MzsKLQlVQ0hBUglLZXlUeXBlOjE7Ci0JVUNIQVIJS2V5SW5kZXg6MjsKLQlVQ0hBUglJbnN0YWxsOjE7Ci0JVUNIQVIJS2V5QWNrOjE7Ci0jZW5kaWYKLX0JS0VZX0lORk8sICpQS0VZX0lORk87Ci0KLS8vIEVBUE9MIEtleSBkZXNjcmlwdG9yIGZvcm1hdAotdHlwZWRlZglzdHJ1Y3QgUEFDS0VEIF9LRVlfREVTQ1JJUFRFUgotewotCVVDSEFSCQlUeXBlOwotCUtFWV9JTkZPCUtleUluZm87Ci0JVUNIQVIJCUtleUxlbmd0aFsyXTsKLQlVQ0hBUgkJUmVwbGF5Q291bnRlcltMRU5fS0VZX0RFU0NfUkVQTEFZXTsKLQlVQ0hBUgkJS2V5Tm9uY2VbTEVOX0tFWV9ERVNDX05PTkNFXTsKLQlVQ0hBUgkJS2V5SXZbTEVOX0tFWV9ERVNDX0lWXTsKLQlVQ0hBUgkJS2V5UnNjW0xFTl9LRVlfREVTQ19SU0NdOwotCVVDSEFSCQlLZXlJZFtMRU5fS0VZX0RFU0NfSURdOwotCVVDSEFSCQlLZXlNaWNbTEVOX0tFWV9ERVNDX01JQ107Ci0JVUNIQVIJCUtleURhdGFMZW5bMl07Ci0JVUNIQVIJCUtleURhdGFbTUFYX0xFTl9PRl9SU05JRV07Ci19CUtFWV9ERVNDUklQVEVSLCAqUEtFWV9ERVNDUklQVEVSOwotCi10eXBlZGVmCXN0cnVjdCBQQUNLRUQgX0VBUE9MX1BBQ0tFVAotewotCVVDSEFSCQkJCVByb1ZlcjsKLQlVQ0hBUgkJCQlQcm9UeXBlOwotCVVDSEFSCQkJCUJvZHlfTGVuWzJdOwotCUtFWV9ERVNDUklQVEVSCQlLZXlEZXNjOwotfQlFQVBPTF9QQUNLRVQsICpQRUFQT0xfUEFDS0VUOwotCi0vLzgwMi4xMWkgRDEwIHBhZ2UgODMKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfR1RLX0VOQ0FQCi17Ci0jaWZuZGVmIFJUX0JJR19FTkRJQU4KLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEtpZDoyOwotICAgIFVDSEFSICAgICAgICAgICAgICAgdHg6MTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjo1OwotICAgIFVDSEFSICAgICAgICAgICAgICAgcnN2MTsKLSNlbHNlCi0gICAgVUNIQVIgICAgICAgICAgICAgICByc3Y6NTsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHR4OjE7Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBLaWQ6MjsKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIHJzdjE7Ci0jZW5kaWYKLSAgICBVQ0hBUiAgICAgICAgICAgICAgIEdUS1tUS0lQX0dUS19MRU5HVEhdOwotfSAgIEdUS19FTkNBUCwgKlBHVEtfRU5DQVA7Ci0KLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfS0RFX0VOQ0FQCi17Ci0gICAgVUNIQVIgICAgICAgICAgICAgICBUeXBlOwotICAgIFVDSEFSICAgICAgICAgICAgICAgTGVuOwotICAgIFVDSEFSICAgICAgICAgICAgICAgT1VJWzNdOwotICAgIFVDSEFSICAgICAgICAgICAgICAgRGF0YVR5cGU7Ci0gICAgR1RLX0VOQ0FQICAgICAgR1RLRW5jYXA7Ci19ICAgS0RFX0VOQ0FQLCAqUEtERV9FTkNBUDsKLQotLy8gRm9yIFdQQTEKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUgewotICAgIFVDSEFSICAgb3VpWzRdOwotICAgIFVTSE9SVCAgdmVyc2lvbjsKLSAgICBVQ0hBUiAgIG1jYXN0WzRdOwotICAgIFVTSE9SVCAgdWNvdW50OwotICAgIHN0cnVjdCBQQUNLRUQgewotICAgICAgICBVQ0hBUiBvdWlbNF07Ci0gICAgfXVjYXN0WzFdOwotfSBSU05JRSwgKlBSU05JRTsKLQotLy8gRm9yIFdQQTIKLXR5cGVkZWYgc3RydWN0IFBBQ0tFRCBfUlNOSUUyIHsKLSAgICBVU0hPUlQgIHZlcnNpb247Ci0gICAgVUNIQVIgICBtY2FzdFs0XTsKLSAgICBVU0hPUlQgIHVjb3VudDsKLSAgICBzdHJ1Y3QgUEFDS0VEIHsKLSAgICAgICAgVUNIQVIgb3VpWzRdOwotICAgIH11Y2FzdFsxXTsKLX0gUlNOSUUyLCAqUFJTTklFMjsKLQotLy8gQUtNIFN1aXRlCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTklFX0FVVEggewotICAgIFVTSE9SVCBhY291bnQ7Ci0gICAgc3RydWN0IFBBQ0tFRCB7Ci0gICAgICAgIFVDSEFSIG91aVs0XTsKLSAgICB9YXV0aFsxXTsKLX0gUlNOSUVfQVVUSCwqUFJTTklFX0FVVEg7Ci0KLXR5cGVkZWYJdW5pb24gUEFDS0VEIF9SU05fQ0FQQUJJTElUSUVTCXsKLQlzdHJ1Y3QJUEFDS0VEIHsKLSNpZmRlZiBSVF9CSUdfRU5ESUFOCi0gICAgICAgIFVTSE9SVAkJUnN2ZDoxMDsKLSAgICAgICAgVVNIT1JUCQlHVEtTQV9SX0NvdW50ZXI6MjsKLSAgICAgICAgVVNIT1JUCQlQVEtTQV9SX0NvdW50ZXI6MjsKLSAgICAgICAgVVNIT1JUCQlOb19QYWlyd2lzZToxOwotCQlVU0hPUlQJCVByZUF1dGg6MTsKLSNlbHNlCi0gICAgICAgIFVTSE9SVAkJUHJlQXV0aDoxOwotCQlVU0hPUlQJCU5vX1BhaXJ3aXNlOjE7Ci0JCVVTSE9SVAkJUFRLU0FfUl9Db3VudGVyOjI7Ci0JCVVTSE9SVAkJR1RLU0FfUl9Db3VudGVyOjI7Ci0JCVVTSE9SVAkJUnN2ZDoxMDsKLSNlbmRpZgotCX0JZmllbGQ7Ci0JVVNIT1JUCQkJd29yZDsKLX0JUlNOX0NBUEFCSUxJVElFUywgKlBSU05fQ0FQQUJJTElUSUVTOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0VBUF9IRFIgewotICAgIFVDSEFSICAgUHJvVmVyOwotICAgIFVDSEFSICAgUHJvVHlwZTsKLSAgICBVQ0hBUiAgIEJvZHlfTGVuWzJdOwotICAgIFVDSEFSICAgY29kZTsKLSAgICBVQ0hBUiAgIGlkZW50aWZpZXI7Ci0gICAgVUNIQVIgICBsZW5ndGhbMl07IC8vIGluY2x1ZGluZyBjb2RlIGFuZCBpZGVudGlmaWVyLCBmb2xsb3dlZCBieSBsZW5ndGgtMiBvY3RldHMgb2YgZGF0YQotfSBFQVBfSERSLCAqUEVBUF9IRFI7Ci0KLS8vIEZvciBzdXBwbGljYW50IHN0YXRlIG1hY2hpbmUgc3RhdGVzLiA4MDIuMTFpIERyYWZ0IDQuMSwgcC4gOTcKLS8vIFdlIHNpbXBsaWZpZWQgaXQKLXR5cGVkZWYJZW51bQlfV3BhU3RhdGUKLXsKLQlTU19OT1RVU0UsCQkJCS8vIDAKLQlTU19TVEFSVCwJCQkJLy8gMQotCVNTX1dBSVRfTVNHXzMsCQkJLy8gMgotCVNTX1dBSVRfR1JPVVAsCQkJLy8gMwotCVNTX0ZJTklTSCwJCQkvLyA0Ci0JU1NfS0VZVVBEQVRFLAkJCS8vIDUKLX0JV1BBX1NUQVRFOwotCi0vLwotLy8JVGhlIGRlZmluaXRpb24gb2YgdGhlIGNpcGhlciBjb21iaW5hdGlvbgotLy8KLS8vCSBiaXQzCWJpdDIgIGJpdDEgICBiaXQwCi0vLwkrLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKLS8vCXwJICBXUEEJIHwJICAgV1BBMiAgIHwKLS8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKwotLy8JfCBUS0lQIHwgQUVTIHwgVEtJUCB8IEFFUyB8Ci0vLwl8CTAgIHwgIDEgIHwgICAxICB8ICAwICB8IC0+IDB4MDYKLS8vCXwJMCAgfCAgMSAgfCAgIDEgIHwgIDEgIHwgLT4gMHgwNwotLy8JfAkxICB8ICAwICB8ICAgMCAgfCAgMSAgfCAtPiAweDA5Ci0vLwl8CTEgIHwgIDAgIHwgICAxICB8ICAxICB8IC0+IDB4MEIKLS8vCXwJMSAgfCAgMSAgfCAgIDAgIHwgIDEgIHwgLT4gMHgwRAotLy8JfAkxICB8ICAxICB8ICAgMSAgfCAgMCAgfCAtPiAweDBFCi0vLwl8CTEgIHwgIDEgIHwgICAxICB8ICAxICB8CS0+IDB4MEYKLS8vCSstLS0tLS0rLS0tLS0rLS0tLS0tKy0tLS0tKwotLy8KLXR5cGVkZWYJZW51bQlfV3BhTWl4UGFpckNpcGhlcgotewotCU1JWF9DSVBIRVJfTk9UVVNFCQkJPSAweDAwLAotCVdQQV9OT05FX1dQQTJfVEtJUEFFUwkJPSAweDAzLAkJLy8gV1BBMi1US0lQQUVTCi0JV1BBX0FFU19XUEEyX1RLSVAJCQk9IDB4MDYsCi0JV1BBX0FFU19XUEEyX1RLSVBBRVMJCT0gMHgwNywKLQlXUEFfVEtJUF9XUEEyX0FFUwkJCT0gMHgwOSwKLQlXUEFfVEtJUF9XUEEyX1RLSVBBRVMJCT0gMHgwQiwKLQlXUEFfVEtJUEFFU19XUEEyX05PTkUJCT0gMHgwQywJCS8vIFdQQS1US0lQQUVTCi0JV1BBX1RLSVBBRVNfV1BBMl9BRVMJCT0gMHgwRCwKLQlXUEFfVEtJUEFFU19XUEEyX1RLSVAJCT0gMHgwRSwKLQlXUEFfVEtJUEFFU19XUEEyX1RLSVBBRVMJPSAweDBGLAotfQlXUEFfTUlYX1BBSVJfQ0lQSEVSOwotCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX1JTTl9JRV9IRUFERVJfU1RSVUNUCXsKLQlVQ0hBUgkJRWlkOwotCVVDSEFSCQlMZW5ndGg7Ci0JVVNIT1JUCQlWZXJzaW9uOwkvLyBMaXR0bGUgZW5kaWFuIGZvcm1hdAotfQlSU05fSUVfSEVBREVSX1NUUlVDVCwgKlBSU05fSUVfSEVBREVSX1NUUlVDVDsKLQotLy8gQ2lwaGVyIHN1aXRlIHNlbGVjdG9yIHR5cGVzCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0NJUEhFUl9TVUlURV9TVFJVQ1QJewotCVVDSEFSCQlPdWlbM107Ci0JVUNIQVIJCVR5cGU7Ci19CUNJUEhFUl9TVUlURV9TVFJVQ1QsICpQQ0lQSEVSX1NVSVRFX1NUUlVDVDsKLQotLy8gQXV0aGVudGljYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IHN1aXRlIHNlbGVjdG9yCi10eXBlZGVmIHN0cnVjdCBQQUNLRUQgX0FLTV9TVUlURV9TVFJVQ1QJewotCVVDSEFSCQlPdWlbM107Ci0JVUNIQVIJCVR5cGU7Ci19CUFLTV9TVUlURV9TVFJVQ1QsICpQQUtNX1NVSVRFX1NUUlVDVDsKLQotLy8gUlNOIGNhcGFiaWxpdHkKLXR5cGVkZWYgc3RydWN0CVBBQ0tFRCBfUlNOX0NBUEFCSUxJVFkJewotCVVTSE9SVAkJUnN2OjEwOwotCVVTSE9SVAkJR1RLU0FSZXBsYXlDbnQ6MjsKLQlVU0hPUlQJCVBUS1NBUmVwbGF5Q250OjI7Ci0JVVNIT1JUCQlOb1BhaXJ3aXNlOjE7Ci0JVVNIT1JUCQlQcmVBdXRoOjE7Ci19CVJTTl9DQVBBQklMSVRZLCAqUFJTTl9DQVBBQklMSVRZOwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCVRoZSBwcm90b3R5cGUgaXMgZGVmaW5lZCBpbiBjbW1fd3BhLmMKLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1CT09MRUFOIFdwYU1zZ1R5cGVTdWJzdCgKLQlJTiAgVUNIQVIgICBFQVBUeXBlLAotCU9VVCBJTlQJCSpNc2dUeXBlKTsKLQotVk9JRCAgICBQUkYoCi0JSU4gIFVDSEFSICAgKmtleSwKLQlJTiAgSU5UICAgICBrZXlfbGVuLAotCUlOICBVQ0hBUiAgICpwcmVmaXgsCi0JSU4gIElOVCAgICAgcHJlZml4X2xlbiwKLQlJTiAgVUNIQVIgICAqZGF0YSwKLQlJTiAgSU5UICAgICBkYXRhX2xlbiwKLQlPVVQgVUNIQVIgICAqb3V0cHV0LAotCUlOICBJTlQgICAgIGxlbik7Ci0KLWludCBQYXNzd29yZEhhc2goCi0JY2hhciAqcGFzc3dvcmQsCi0JdW5zaWduZWQgY2hhciAqc3NpZCwKLQlpbnQgc3NpZGxlbmd0aCwKLQl1bnNpZ25lZCBjaGFyICpvdXRwdXQpOwotCi1QVUlOVDgJR2V0U3VpdGVGcm9tUlNOSUUoCi0JCUlOCVBVSU5UOAlyc25pZSwKLQkJSU4JVUlOVAlyc25pZV9sZW4sCi0JCUlOCVVJTlQ4CXR5cGUsCi0JCU9VVAlVSU5UOAkqY291bnQpOwotCi1WT0lEIFdwYVNob3dBbGxzdWl0ZSgKLQlJTglQVUlOVDgJcnNuaWUsCi0JSU4JVUlOVAlyc25pZV9sZW4pOwotCi1WT0lEIFJUTVBJbnNlcnRSU05JRSgKLQlJTiBQVUNIQVIgcEZyYW1lQnVmLAotCU9VVCBQVUxPTkcgcEZyYW1lTGVuLAotCUlOIFBVSU5UOCByc25pZV9wdHIsCi0JSU4gVUlOVDggIHJzbmllX2xlbiwKLQlJTiBQVUlOVDggcG1raWRfcHRyLAotCUlOIFVJTlQ4ICBwbWtpZF9sZW4pOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9LY29uZmlnCmluZGV4IDMyMTFkZDMuLmUyNGE2ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL0tjb25maWcKQEAgLTEsNyArMSw4IEBACi1jb25maWcgUlRMODE4N1NFCitjb25maWcgUjgxODdTRQogCXRyaXN0YXRlICJSZWFsVGVrIFJUTDgxODdTRSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciIKIAlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOCiAJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBXRVhUX1BSSVYKIAlkZWZhdWx0IE4KIAktLS1oZWxwLS0tCisJICBJZiBidWlsdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgcjgxODdzZS5rby4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlCmluZGV4IGFjMzVjZmYuLmIzOTVhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNyBAQAogCiAjRVhUUkFfQ0ZMQUdTICs9IC1taGFyZC1mbG9hdCAtRENPTkZJR19GT1JDRV9IQVJEX0ZMT0FUPXkKIAotcnRsODE4N3NlLW9ianMgOj0JCQlcCityODE4N3NlLW9ianMgOj0JCQlcCiAJCXI4MTgwX2NvcmUubwkJXAogCQlyODE4MF85M2N4Ni5vCQlcCiAJCXI4MTgwX3d4Lm8JCVwKQEAgLTM1LDUgKzM1LDUgQEAKIAkJaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLm8JXAogCQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5vCiAKLW9iai0kKENPTkZJR19SVEw4MTg3U0UpCSs9IHJ0bDgxODdzZS5vCitvYmotJChDT05GSUdfUjgxODdTRSkJKz0gcjgxODdzZS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKaW5kZXggNWUyZTc5YjEuLmY4ODJkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggMzM0ZTRjNy4uMWZlMTljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0xODM3LDcgKzE4MzcsNyBAQAogCiAJCQkJCSAJICAgICAgICAgICAgaWYgKCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLndtbV9pbmZvXmluZm9fZWxlbWVudC0+ZGF0YVs2XSkmIFwKIAkJCQkJCQkJCQkgICAgMHgwZil8fCghaWVlZS0+aW5pdF93bW1wYXJhbV9mbGFnKSkgewotCQkJCQkJICAgCSAgICAgIC8vcmVmcmVzaCBwYXJhbWV0ZSBlbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKKwkJCQkJCSAgIAkgICAgICAvLyByZWZyZXNoIHBhcmFtZXRlciBlbGVtZW50IGZvciBjdXJyZW50IG5ldHdvcmsKIAkJCQkJCQkgICAgICAvLyB1cGRhdGUgdGhlIHJlZ2lzdGVyIHBhcmFtZXRlciBmb3IgaGFyZHdhcmUKIAkJCQkJCQkgICAgICBpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAxOwogCQkJCQkJCSAgICAgIHF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT53bW1fcGFyYW1fdXBkYXRlX3dxKTsKQEAgLTE5NTgsMTAgKzE5NTgsMTAgQEAKICAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KICAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKICAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCi0gKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogdG8gaGF2ZSBlbm91Z2ggcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgogICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCiAgKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgotICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCisgKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIGlzIG5vdCBlbm91Z2guLiBJZiB0aGUKICAqIGllZWU4MDIuMTEgc3RhY2sgcGFzc2VkIGEgVFhCIHN0cnVjdCB0aGVuIHlvdSBuZWVkZWQKICAqIHRvIGtlZXAgTiBmcmVlIGRlc2NyaXB0b3JzIHdoZXJlCiAgKiBOID0gTUFYX1BBQ0tFVF9TSVpFIC8gTUlOX0ZSQUdfVFJFU0hPTEQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKaW5kZXggZTI5NDVkYi4uZGRlMWYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCmluZGV4IGEwOGI5N2EuLjZhYWQ0OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0zMCw3ICszMCw2IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODAuaAppbmRleCAzNWVkNjBiLi5jZTgyODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MC5oCkBAIC03NywyMSArNzcsNiBAQAogCVdJUkVMRVNTX01PREVfQVVUTyA9IDB4MDgsCiB9IFdJUkVMRVNTX01PREU7CiAKLXR5cGVkZWYgZW51bSBfVkVSU0lPTl84MTg1ewotCS8vIFJUTDgxODUKLQlWRVJTSU9OXzgxODVfVU5LTk9XTiwKLQlWRVJTSU9OXzgxODVfQywgLy8gQy1jdXQKLQlWRVJTSU9OXzgxODVfRCwgLy8gRC1jdXQKLQkvLyBSVEw4MTg1QgotCVZFUlNJT05fODE4NUJfQiwgLy8gQi1jdXQKLQlWRVJTSU9OXzgxODVCX0QsIC8vIEQtY3V0Ci0JVkVSU0lPTl84MTg1Ql9FLCAvLyBFLWN1dAotCS8vUlRMODE4N1MtUENJRQotCVZFUlNJT05fODE4N1NfQiwgLy8gQi1jdXQKLQlWRVJTSU9OXzgxODdTX0MsIC8vIEMtY3V0Ci0JVkVSU0lPTl84MTg3U19ELCAvLyBELWN1dAotCi19VkVSU0lPTl84MTg1LCpQVkVSU0lPTl84MTg1OwogdHlwZWRlZiBzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nIHsKIAl1MTYgU0lGU19UaW1lcjsKIAl1MTYgRElGU19UaW1lcjsKQEAgLTM0MSwxMSArMzI2LDggQEAKIAlpbnQgaXJxOwogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTE7CiAKLSAgICAgICAgc2hvcnQgY2FyZF84MTg1OyAvKiBPOiBydGw4MTgwLCAxOnJ0bDgxODUgViBCL0MsIDI6cnRsODE4NSBWIEQsIDM6cnRsODE4NUIgKi8KLQlzaG9ydCBjYXJkXzgxODVfQnZlcnNpb247IC8qIGlmIFRDUiByZXBvcnRzIGNhcmQgViBCL0MgdGhpcyBkaXNjcmltaW5hdGVzICovCiAJc2hvcnQgcGh5X3ZlcjsgLyogbWVhbmluZ2Z1bCBmb3IgcnRsODIyNSAxOkEgMjpCIDM6QyAqLwogCXNob3J0IGVuYWJsZV9ncGlvMDsKLQllbnVtIGNhcmRfdHlwZSB7UENJLE1JTklQQ0ksQ0FSREJVUyxVU0IvKnJ0bDgxODcqL31jYXJkX3R5cGU7CiAJc2hvcnQgaHdfcGxjcF9sZW47CiAJc2hvcnQgcGxjcF9wcmVhbWJsZV9tb2RlOyAvLyAwOmF1dG8gMTpzaG9ydCAyOmxvbmcKIApAQCAtNTk5LDcgKzU4MSw3IEBACiAJdTgJCQkJCQlSU1NJOwogCWNoYXIJCQkJCVJ4UG93ZXI7CiAJIHU4IEluaXRpYWxHYWluOwotCSAvL0ZvciBhZGp1c3QgRGlnIFRocmVzaGhvbGQgZHVyaW5nIExlZ2FjeS9MZWlzdXJlIFBvd2VyIFNhdmUgTW9kZQorCSAvL0ZvciBhZGp1c3QgRGlnIFRocmVzaG9sZCBkdXJpbmcgTGVnYWN5L0xlaXN1cmUgUG93ZXIgU2F2ZSBNb2RlCiAJdTMyCQkJCURvemVQZXJpb2RJblBhc3QyU2VjOwogCSAvLyBEb24ndCBhY2Nlc3MgQkIvUkYgdW5kZXIgZGlzYWJsZSBQTEwgc2l0dWF0aW9uLgogCXU4CQkJCQlJbml0aWFsR2FpbkJhY2tVcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKaW5kZXggNTNlNjU0ZC4uNTdjNjJiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9jb3JlLmMKQEAgLTg4Niw4ICs4ODYsNiBAQAogCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8QUNDRVBUX0FMTE1BQ19GUkFNRV9TSElGVCk7CiAJfWVsc2V7CiAJCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxBQ0NFUFRfTklDTUFDX0ZSQU1FX1NISUZUKTsKLQkJaWYocHJpdi0+Y2FyZF84MTg1ID09IDApCi0JCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOwogCX0KIAogCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpewpAQCAtOTEwLDkgKzkwOCw2IEBACiAKIAlyeGNvbmYgPSByeGNvbmYgJn4gUkNSX0NTX01BU0s7CiAKLQlpZiAoIXByaXYtPmNhcmRfODE4NSkKLQkJcnhjb25mIHw9IChwcml2LT5yY3JfY3NlbnNlPDxSQ1JfQ1NfU0hJRlQpOwotCiAJd3JpdGVfbmljX2R3b3JkKGRldiwgUlhfQ09ORiwgcnhjb25mKTsKIAogCWZpeF9yeF9maWZvKGRldik7CkBAIC05NjQsMjggKzk1OSwxOSBAQAogCiAJdHhjb25mID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBUWF9DT05GKTsKIAotCWlmIChwcml2LT5jYXJkXzgxODUpIHsKLQkJYnl0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LENXX0NPTkYpOwotCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfQ1dfU0hJRlQpOwotCQlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENXX0NPTkYsIGJ5dGUpOworCWJ5dGUgPSByZWFkX25pY19ieXRlKGRldiwgQ1dfQ09ORik7CisJYnl0ZSAmPSB+KDE8PENXX0NPTkZfUEVSUEFDS0VUX0NXX1NISUZUKTsKKwlieXRlICY9IH4oMTw8Q1dfQ09ORl9QRVJQQUNLRVRfUkVUUllfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1dfQ09ORiwgYnl0ZSk7CiAKLQkJdHhfYWdjX2N0bCA9IHJlYWRfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMKTsKLQkJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0dBSU5fU0hJRlQpOwotCQl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfQU5UU0VMX1NISUZUKTsKLQkJdHhfYWdjX2N0bCB8PSgxPDxUWF9BR0NfQ1RMX0ZFRURCQUNLX0FOVCk7Ci0JCXdyaXRlX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCwgdHhfYWdjX2N0bCk7Ci0JCXdyaXRlX25pY19ieXRlKGRldiwgMHhlYywgMHgzZik7IC8qIERpc2FibGUgZWFybHkgVFggKi8KLQl9CisJdHhfYWdjX2N0bCA9IHJlYWRfbmljX2J5dGUoZGV2LCBUWF9BR0NfQ1RMKTsKKwl0eF9hZ2NfY3RsICY9IH4oMTw8VFhfQUdDX0NUTF9QRVJQQUNLRVRfR0FJTl9TSElGVCk7CisJdHhfYWdjX2N0bCAmPSB+KDE8PFRYX0FHQ19DVExfUEVSUEFDS0VUX0FOVFNFTF9TSElGVCk7CisJdHhfYWdjX2N0bCB8PSAoMTw8VFhfQUdDX0NUTF9GRUVEQkFDS19BTlQpOworCXdyaXRlX25pY19ieXRlKGRldiwgVFhfQUdDX0NUTCwgdHhfYWdjX2N0bCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweGVjLCAweDNmKTsgLyogRGlzYWJsZSBlYXJseSBUWCAqLwogCi0JaWYgKHByaXYtPmNhcmRfODE4NSkKLQkJdHhjb25mID0gdHhjb25mICZ+ICgxPDxUQ1JfUFJPQkVfTk9USU1FU1RBTVBfU0hJRlQpOwotCWVsc2UgewotCQlpZihod3NlcW51bSkKLQkJCXR4Y29uZj0gdHhjb25mICZ+ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOwotCQllbHNlCi0JCQl0eGNvbmY9IHR4Y29uZiB8ICgxPDxUWF9DT05GX0hFQURFUl9BVVRPSUNSRU1FTlRfU0hJRlQpOwotCX0KKwl0eGNvbmYgPSB0eGNvbmYgJiB+KDE8PFRDUl9QUk9CRV9OT1RJTUVTVEFNUF9TSElGVCk7CiAKIAl0eGNvbmYgPSB0eGNvbmYgJn4gVFhfTE9PUEJBQ0tfTUFTSzsKIAl0eGNvbmYgPSB0eGNvbmYgfCAoVFhfTE9PUEJBQ0tfTk9ORSA8PFRYX0xPT1BCQUNLX1NISUZUKTsKQEAgLTk5NSwxMyArOTgxLDEwIEBACiAJdHhjb25mID0gdHhjb25mIHwgKHByaXYtPnJldHJ5X3J0czw8VFhfUlRTUkVUUllfU0hJRlQpOwogCXR4Y29uZiA9IHR4Y29uZiAmfiAoMTw8VFhfTk9DUkNfU0hJRlQpOwogCi0JaWYgKHByaXYtPmNhcmRfODE4NSkgewotCQlpZiAocHJpdi0+aHdfcGxjcF9sZW4pCi0JCQl0eGNvbmYgPSB0eGNvbmYgJn4gVENSX1BMQ1BfTEVOOwotCQllbHNlCi0JCQl0eGNvbmYgPSB0eGNvbmYgfCBUQ1JfUExDUF9MRU47Ci0JfSBlbHNlCi0JCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfU0FUOworCWlmIChwcml2LT5od19wbGNwX2xlbikKKwkJdHhjb25mID0gdHhjb25mICYgflRDUl9QTENQX0xFTjsKKwllbHNlCisJCXR4Y29uZiA9IHR4Y29uZiB8IFRDUl9QTENQX0xFTjsKIAogCXR4Y29uZiA9IHR4Y29uZiAmfiBUQ1JfTVhETUFfTUFTSzsKIAl0eGNvbmYgPSB0eGNvbmYgfCAoVENSX01YRE1BXzIwNDg8PFRDUl9NWERNQV9TSElGVCk7CkBAIC0xNzIwLDggKzE3MDMsNiBAQAogCQllbHNlCiAJCQlxdWFsaXR5ID0gMTI3IC0gcXVhbGl0eTsKIAkJcHJpdi0+U2lnbmFsUXVhbGl0eSA9IHF1YWxpdHk7Ci0JCWlmKCFwcml2LT5jYXJkXzgxODUpCi0JCQlwcmludGsoImNoZWNrIHlvdXIgY2FyZCB0eXBlXG4iKTsKIAogCQlzdGF0cy5zaWduYWwgPSAodTgpcXVhbGl0eTsvL3ByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gcHJpdi0+U2lnbmFsU3RyZW5ndGg7CiAJCXN0YXRzLnNpZ25hbHN0cmVuZ3RoID0gUlhBR0M7CkBAIC0xODQ4LDcgKzE4MjksNyBAQAogCQkJCSAgICBzaXplb2YodTgpLAogCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi1kcm9wOiAvLyB0aGlzIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIG5vdCBlbm91Z2h0IG1lbQorZHJvcDogLy8gdGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBub3QgZW5vdWdoIG1lbQogCQkvKiByZXN0b3JlIHRoZSBkZXNjcmlwdG9yICovCiAJCSoocHJpdi0+cnhyaW5ndGFpbCsyKT1wcml2LT5yeGJ1ZmZlci0+ZG1hOwogCQkqKHByaXYtPnJ4cmluZ3RhaWwpPSoocHJpdi0+cnhyaW5ndGFpbCkgJn4gMHhmZmY7CkBAIC0xOTE5LDggKzE5MDAsOCBAQAogCS8qCiAJKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVxdWlyZSBsb2NrIGJlY2F1c2Ugd2UgbWFrZQogCSogc3VyZSBpdCdzIGNhbGxlZCB3aXRoIHRoZSB0eF9sb2NrIGFscmVhZHkgYWNxdWlyZWQuCi0JKiB0aGlzIGNvbWUgZnJvbSB0aGUga2VybmVsJ3MgaGFyZF94bWl0IGNhbGxiYWNrICh0cm91Z2h0Ci0JKiB0aGUgaWVlZSBzdGFjaywgb3IgZnJvbSB0aGUgdHJ5X3dha2VfcXVldWUgKGFnYWluIHRyb3VnaHQKKwkqIHRoaXMgY29tZSBmcm9tIHRoZSBrZXJuZWwncyBoYXJkX3htaXQgY2FsbGJhY2sgKHRocm91Z2gKKwkqIHRoZSBpZWVlIHN0YWNrLCBvciBmcm9tIHRoZSB0cnlfd2FrZV9xdWV1ZSAoYWdhaW4gdGhyb3VnaAogCSogdGhlIGllZWUgc3RhY2suCiAJKi8KIAlwcmlvcml0eSA9IEFDMlEoc2tiLT5wcmlvcml0eSk7CkBAIC0yMjIxLDEwICsyMjAyLDggQEAKIAkJKih0YWlsKzYpID0gMDsKIAkJKih0YWlsKzcpID0gMDsKIAotCQlpZihwcml2LT5jYXJkXzgxODUpewotCQkJLy9GSVhNRTogdGhpcyBzaG91bGQgYmUgdHJpZ2dlcmVkIGJ5IEhXIGVuY3J5cHRpb24gcGFyYW1ldGVycy4KLQkJCSp0YWlsIHw9ICgxPDwxNSk7IC8vbm8gZW5jcnlwdAotCQl9CisJCS8qRklYTUU6IHRoaXMgc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBIVyBlbmNyeXB0aW9uIHBhcmFtZXRlcnMuKi8KKwkJKnRhaWwgfD0gKDE8PDE1KTsgLyogbm8gZW5jcnlwdCAqLwogCiAJCWlmKHJlbWFpbj09bGVuICYmICFkZXNjZnJhZykgewogCQkJb3duYml0X2ZsYWcgPSBmYWxzZTsJLy9hZGRlZCBieSBkYXZpZCB3b28sMjAwNy4xMi4xNApAQCAtMjI2Niw3ICsyMjQ1LDcgQEAKIAogCQkvKiBod19wbGNwX2xlbiBpcyBub3QgdXNlZCBmb3IgcnRsODE4MCBjaGlwICovCiAJCS8qIEZJWE1FICovCi0JCWlmKHByaXYtPmNhcmRfODE4NSA9PSAwIHx8ICFwcml2LT5od19wbGNwX2xlbil7CisJCWlmICghcHJpdi0+aHdfcGxjcF9sZW4pIHsKIAkJCWR1cmF0aW9uID0gcnRsODE4MF9sZW4yZHVyYXRpb24obGVuLCByYXRlLCAmZXh0KTsKIAkJCSoodGFpbCsxKSA9ICoodGFpbCsxKSB8ICgoZHVyYXRpb24gJiAweDdmZmYpPDwxNik7CiAJCQlpZihleHQpICoodGFpbCsxKSA9ICoodGFpbCsxKSB8KDE8PDMxKTsgLy9wbGNwIGxlbmd0aCBleHRlbnNpb24KQEAgLTIzNTUsOCArMjMzNCw3IEBACiAKIAlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CiAKLQlpZihwcml2LT5jYXJkXzgxODUpCi0JCXJ0bDgxODBfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKwlydGw4MTgwX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7CiB9CiAKIHZvaWQgcnRsODE4MF9ycV90eF9hY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CkBAIC0yNzAyLDggKzI2ODAsNiBAQAogCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAl1MTYgd29yZDsKIAl1MTYgdmVyc2lvbjsKLQl1OCBod192ZXJzaW9uOwotCS8vdTggY29uZmlnMzsKIAl1MzIgdXNWYWx1ZTsKIAl1MTYgdG1wdTE2OwogCWludCBpLCBqOwpAQCAtMjkyOCw1MCArMjkwNCwxMyBAQAogCiAJcHJpdi0+SW5pdGlhbEdhaW4gPSA2OwogCi0JaHdfdmVyc2lvbiA9KCByZWFkX25pY19kd29yZChkZXYsIFRDUikgJiBUQ1JfSFdWRVJJRF9NQVNLKT4+VENSX0hXVkVSSURfU0hJRlQ7CisJRE1FU0coIk1BQyBjb250cm9sbGVyIGlzIGEgUlRMODE4N1NFIGIvZyIpOworCXByaXYtPnBoeV92ZXIgPSAyOwogCi0Jc3dpdGNoIChod192ZXJzaW9uKXsKLQkJY2FzZSBIV19WRVJJRF9SODE4NUJfQjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmNhcmRfODE4NSA9IFZFUlNJT05fODE4N1NfQzsKLQkJICAgICAgICBETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTg3U0UgYi9nIik7Ci0JCQlwcml2LT5waHlfdmVyID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEhXX1ZFUklEX1I4MTg1X0FCQzoKLQkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODUgYi9nIik7Ci0JCQlwcml2LT5jYXJkXzgxODUgPSAxOwotCQkJLyogeW91IHNob3VsZCBub3QgZmluZCBhIGNhcmQgd2l0aCA4MjI1IFBIWSB2ZXIgPCBDKi8KLQkJCXByaXYtPnBoeV92ZXIgPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFdfVkVSSURfUjgxODVfRDoKLQkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODUgYi9nIChWLiBEKSIpOwotCQkJcHJpdi0+Y2FyZF84MTg1ID0gMjsKLQkJCS8qIHlvdSBzaG91bGQgbm90IGZpbmQgYSBjYXJkIHdpdGggODIyNSBQSFkgdmVyIDwgQyovCi0JCQlwcml2LT5waHlfdmVyID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEhXX1ZFUklEX1I4MTgwX0FCQ0Q6Ci0JCQlETUVTRygiTUFDIGNvbnRyb2xsZXIgaXMgYSBSVEw4MTgwIik7Ci0JCQlwcml2LT5jYXJkXzgxODUgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFdfVkVSSURfUjgxODBfRjoKLQkJCURNRVNHKCJNQUMgY29udHJvbGxlciBpcyBhIFJUTDgxODAgKHYuIEYpIik7Ci0JCQlwcml2LT5jYXJkXzgxODUgPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlETUVTR1coIk1BQyBjaGlwIG5vdCByZWNvZ25pemVkOiB2ZXJzaW9uICV4LiBBc3N1bWluZyBSVEw4MTgwIixod192ZXJzaW9uKTsKLQkJCXByaXYtPmNhcmRfODE4NSA9IDA7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZihwcml2LT5jYXJkXzgxODUpewotCQlwcml2LT5pZWVlODAyMTEtPm1vZHVsYXRpb24gfD0gSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKLQkJcHJpdi0+aWVlZTgwMjExLT5zaG9ydF9zbG90ID0gMTsKLQl9Ci0JLyogeW91IHNob3VsZCBub3QgZm91bmQgYW55IDgxODUgVmVyIEIgQ2FyZCAqLwotCXByaXYtPmNhcmRfODE4NV9CdmVyc2lvbiA9IDA7CisJcHJpdi0+aWVlZTgwMjExLT5tb2R1bGF0aW9uIHw9IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047CisJcHJpdi0+aWVlZTgwMjExLT5zaG9ydF9zbG90ID0gMTsKIAogCS8vIGp1c3QgZm9yIHN5bmMgODUKLQlwcml2LT5jYXJkX3R5cGUgPSBQQ0k7Ci0gICAgICAgIERNRVNHKCJUaGlzIGlzIGEgUENJIE5JQyIpOwogCXByaXYtPmVuYWJsZV9ncGlvMCA9IDA7CiAKIAl1c1ZhbHVlID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9TV19SRVZEX09GRlNFVCk7CkBAIC0zMDI2LDEyICsyOTY1LDEwIEBACiAJCXByaXYtPmNodHhwd3JbaV09d29yZCAmIDB4ZmY7CiAJCXByaXYtPmNodHhwd3JbaSsxXT0od29yZCAmIDB4ZmYwMCk+Pjg7CiAJfQotCWlmKHByaXYtPmNhcmRfODE4NSl7Ci0JCWZvcihpPTEsaj0wOyBpPDE0OyBpKz0yLGorKyl7Ci0JCQl3b3JkID0gZXByb21fcmVhZChkZXYsRVBST01fVFhQV19PRkRNX0NIMV8yICsgaik7Ci0JCQlwcml2LT5jaHR4cHdyX29mZG1baV09d29yZCAmIDB4ZmY7Ci0JCQlwcml2LT5jaHR4cHdyX29mZG1baSsxXT0od29yZCAmIDB4ZmYwMCk+Pjg7Ci0JCX0KKwlmb3IgKGkgPSAxLCBqID0gMDsgaSA8IDE0OyBpICs9IDIsIGorKykgeworCQl3b3JkID0gZXByb21fcmVhZChkZXYsIEVQUk9NX1RYUFdfT0ZETV9DSDFfMiArIGopOworCQlwcml2LT5jaHR4cHdyX29mZG1baV0gPSB3b3JkICYgMHhmZjsKKwkJcHJpdi0+Y2h0eHB3cl9vZmRtW2krMV0gPSAod29yZCAmIDB4ZmYwMCk+Pjg7CiAJfQogCiAJLy8zUmVhZCBjcnlzdGFsIGNhbGlidHJhdGlvbiBhbmQgdGhlcm1hbCBtZXRlciBpbmRpY2F0aW9uIG9uIDg3U0UuCkBAIC0zMDU3LDM3ICsyOTk0LDExIEBACiAKIAl2ZXJzaW9uID0gZXByb21fcmVhZChkZXYsRVBST01fVkVSU0lPTik7CiAJRE1FU0coIkVFUFJPTSB2ZXJzaW9uICV4Iix2ZXJzaW9uKTsKLQlpZiggKCFwcml2LT5jYXJkXzgxODUpICYmIHZlcnNpb24gPCAweDAxMDEpewotCQlETUVTRyAoIkVFUFJPTSB2ZXJzaW9uIHRvbyBvbGQsIGFzc3VtaW5nIGRlZmF1bHRzIik7Ci0JCURNRVNHICgiSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UgKnBsYXNlKiBzZW5kIHlvdXIgXAotRE1FU0cgb3V0cHV0IHRvIGFuZHJlYW1ybEB0aXNjYWxpLml0IFRIQU5LUyIpOwotCQlwcml2LT5kaWdwaHk9MTsKLQkJcHJpdi0+YW50Yj0wOwotCQlwcml2LT5kaXZlcnNpdHk9MTsKLQkJcHJpdi0+Y3NfdHJlc2hvbGQ9MHhjOwotCQlwcml2LT5yY3JfY3NlbnNlPTE7Ci0JCXByaXYtPnJmX2NoaXA9UkZDSElQSURfUEhJTElQUzsKLQl9ZWxzZXsKLQkJaWYoIXByaXYtPmNhcmRfODE4NSl7Ci0JCQl1OCByZnBhcmFtID0gZXByb21fcmVhZChkZXYsUkZfUEFSQU0pOwotCQkJRE1FU0coIlJmUGFyYW06ICV4IixyZnBhcmFtKTsKKwlwcml2LT5yY3JfY3NlbnNlID0gMzsKIAotCQkJcHJpdi0+ZGlncGh5ID0gcmZwYXJhbSAmICgxPDxSRl9QQVJBTV9ESUdQSFlfU0hJRlQpID8gMDoxOwotCQkJcHJpdi0+YW50YiA9ICByZnBhcmFtICYgKDE8PFJGX1BBUkFNX0FOVEJERUZBVUxUX1NISUZUKSA/IDE6MDsKKwlwcml2LT5jc190cmVzaG9sZCA9IChlcHJvbV9yZWFkKGRldiwgRU5FUkdZX1RSRVNIT0xEKSAmIDB4ZmYwMCkgPj4gODsKIAotCQkJcHJpdi0+cmNyX2NzZW5zZSA9IChyZnBhcmFtICYgUkZfUEFSQU1fQ0FSUklFUlNFTlNFX01BU0spID4+Ci0JCQkJCVJGX1BBUkFNX0NBUlJJRVJTRU5TRV9TSElGVDsKLQotCQkJcHJpdi0+ZGl2ZXJzaXR5ID0KLQkJCQkocmVhZF9uaWNfYnl0ZShkZXYsQ09ORklHMikmKDE8PENPTkZJRzJfQU5URU5OQV9TSElGVCkpID8gMTowOwotCQl9ZWxzZXsKLQkJCXByaXYtPnJjcl9jc2Vuc2UgPSAzOwotCQl9Ci0KLQkJcHJpdi0+Y3NfdHJlc2hvbGQgPSAoZXByb21fcmVhZChkZXYsRU5FUkdZX1RSRVNIT0xEKSYweGZmMDApID4+ODsKLQotCQlwcml2LT5yZl9jaGlwID0gMHhmZiAmIGVwcm9tX3JlYWQoZGV2LFJGQ0hJUElEKTsKLQl9CisJcHJpdi0+cmZfY2hpcCA9IDB4ZmYgJiBlcHJvbV9yZWFkKGRldiwgUkZDSElQSUQpOwogCiAJcHJpdi0+cmZfY2hpcCA9IFJGX1pFQlJBNDsKIAlwcml2LT5yZl9zbGVlcCA9IHJ0bDgyMjV6NF9yZl9zbGVlcDsKQEAgLTMwOTksMTkgKzMwMTAsNiBAQAogCXByaXYtPnJmX3NldF9jaGFuID0gcnRsODIyNXoyX3JmX3NldF9jaGFuOwogCXByaXYtPnJmX3NldF9zZW5zID0gTlVMTDsKIAotCWlmKCFwcml2LT5jYXJkXzgxODUpewotCQlpZihwcml2LT5hbnRiKQotCQkJRE1FU0cgKCJBbnRlbm5hIEIgaXMgZGVmYXVsdCBhbnRlbm5hIik7Ci0JCWVsc2UKLQkJCURNRVNHICgiQW50ZW5uYSBBIGlzIGRlZmF1bHQgYW50ZW5uYSIpOwotCi0JCWlmKHByaXYtPmRpdmVyc2l0eSkKLQkJCURNRVNHICgiQW50ZW5uYSBkaXZlcnNpdHkgaXMgZW5hYmxlZCIpOwotCQllbHNlCi0JCQlETUVTRygiQW50ZW5uYSBkaXZlcnNpdHkgaXMgZGlzYWJsZWQiKTsKLQotCQlETUVTRygiQ2FycmllciBzZW5zZSAlZCIscHJpdi0+cmNyX2NzZW5zZSk7Ci0JfQogCiAJaWYgKDAhPWFsbG9jX3J4X2Rlc2NfcmluZyhkZXYsIHByaXYtPnJ4YnVmZmVyc2l6ZSwgcHJpdi0+cnhyaW5nY291bnQpKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTMxNDQsMTcgKzMwNDIsNiBAQAogCQkJCSAgVFhfQkVBQ09OX1JJTkdfQUREUikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYoIXByaXYtPmNhcmRfODE4NSl7Ci0JCWlmKHJlYWRfbmljX2J5dGUoZGV2LCBDT05GSUcwKSAmICgxPDxDT05GSUcwX1dFUDQwX1NISUZUKSkKLQkJCURNRVNHICgiNDAtYml0IFdFUCBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKLQkJZWxzZQotCQkJRE1FU0cgKCI0MC1iaXQgV0VQIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKLQotCQlpZihyZWFkX25pY19ieXRlKGRldixDT05GSUcwKSAmICgxPDxDT05GSUcwX1dFUDEwNF9TSElGVCkpCi0JCQlETUVTRyAoIjEwNC1iaXQgV0VQIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSIpOwotCQllbHNlCi0JCQlETUVTRyAoIjEwNC1iaXQgV0VQIGlzIE5PVCBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUiKTsKLQl9CiAjaWYgIWRlZmluZWQoU0FfU0hJUlEpCiAgICAgICAgIGlmKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKXJ0bDgxODBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpKXsKICNlbHNlCkBAIC0zMTcyLDE3ICszMDU5LDYgQEAKIAogdm9pZCBydGw4MTgwX25vX2h3X3dlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCByODE4MF9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCWlmICghcHJpdi0+Y2FyZF84MTg1KSB7Ci0JCXU4IHNlY3VyaXR5OwotCi0JCXNlY3VyaXR5ICA9IHJlYWRfbmljX2J5dGUoZGV2LCBTRUNVUklUWSk7Ci0JCXNlY3VyaXR5ICY9figxPDxTRUNVUklUWV9XRVBfVFhfRU5BQkxFX1NISUZUKTsKLQkJc2VjdXJpdHkgJj1+KDE8PFNFQ1VSSVRZX1dFUF9SWF9FTkFCTEVfU0hJRlQpOwotCi0JCXdyaXRlX25pY19ieXRlKGRldiwgU0VDVVJJVFksIHNlY3VyaXR5KTsKLQl9CiB9CiAKIHZvaWQgcnRsODE4MF9zZXRfaHdfd2VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0zMzU1LDkgKzMyMzEsNiBAQAogdm9pZCBydGw4MTgwX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICAgICAgICAgc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCXUzMiBhbmFwYXJhbTsKLQl1MTYgd29yZDsKLQl1OCBjb25maWczOwogCiAJcnRsODE4MF9ydHhfZGlzYWJsZShkZXYpOwogCXJ0bDgxODBfcmVzZXQoZGV2KTsKQEAgLTMzNzEsMTIgKzMyNDQsNiBAQAogCiAJcnRsODE4MF9iZWFjb25fdHhfZGlzYWJsZShkZXYpOwogCi0JaWYocHJpdi0+Y2FyZF90eXBlID09IENBUkRCVVMgKXsKLQkJY29uZmlnMz1yZWFkX25pY19ieXRlKGRldiwgQ09ORklHMyk7Ci0JCXdyaXRlX25pY19ieXRlKGRldixDT05GSUczLGNvbmZpZzMgfCBDT05GSUczX0Z1bmNSZWdFbik7Ci0JCXdyaXRlX25pY193b3JkKGRldixGRU1SLCBGRU1SX0lOVFIgfCBGRU1SX1dLVVAgfCBGRU1SX0dXQUtFIHwKLQkJCXJlYWRfbmljX3dvcmQoZGV2LCBGRU1SKSk7Ci0JfQogCXJ0bDgxODBfc2V0X21vZGUoZGV2LCBFUFJPTV9DTURfQ09ORklHKTsKIAl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiopZGV2LT5kZXZfYWRkcilbMF0pOwogCXdyaXRlX25pY193b3JkKGRldiwgTUFDNCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzFdICYgMHhmZmZmICk7CkBAIC0zMzg0LDEyICszMjUxLDYgQEAKIAogCXJ0bDgxODBfdXBkYXRlX21zcihkZXYpOwogCi0JaWYoIXByaXYtPmNhcmRfODE4NSl7Ci0JCWFuYXBhcmFtICA9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX0FOQVBBUkFNX0FERFJMV09SRCk7Ci0JCWFuYXBhcmFtIHw9IGVwcm9tX3JlYWQoZGV2LEVQUk9NX0FOQVBBUkFNX0FERFJIV09SRCk8PDE2OwotCi0JCXJ0bDgxODBfc2V0X2FuYXBhcmFtKGRldixhbmFwYXJhbSk7Ci0JfQogCS8qIFRoZXNlIG1pZ2h0IGJlIHVubmVjZXNzYXJ5IHNpbmNlIHdlIGRvIGluIHJ4X2VuYWJsZSAvIHR4X2VuYWJsZSAqLwogCWZpeF9yeF9maWZvKGRldik7CiAJZml4X3R4X2ZpZm8oZGV2KTsKQEAgLTMzOTksNjEgKzMyNjAsMzQgQEAKIAkvKgogCSAgIFRoZSBmb2xsb3dpbmcgaXMgdmVyeSBzdHJhbmdlLiBzZWVtcyB0byBiZSB0aGF0IDEgbWVhbnMgdGVzdCBtb2RlLAogCSAgIGJ1dCB3ZSBuZWVkIHRvIGFja25vbHdsZWRnZXMgdGhlIG5pYyB3aGVuIGEgcGFja2V0IGlzIHJlYWR5Ci0JICAgYWx0b3VnaHQgd2Ugc2V0IGl0IHRvIDAKKwkgICBhbHRob3VnaCB3ZSBzZXQgaXQgdG8gMAogCSovCiAKIAl3cml0ZV9uaWNfYnl0ZShkZXYsCiAJCSAgICAgICBDT05GSUcyLCByZWFkX25pY19ieXRlKGRldixDT05GSUcyKSAmflwKIAkJICAgICAgICgxPDxDT05GSUcyX0RNQV9QT0xMSU5HX01PREVfU0hJRlQpKTsKIAkvL150aGUgbmljIGlzbid0IGluIHRlc3QgbW9kZQotCWlmKHByaXYtPmNhcmRfODE4NSkKLQkJCXdyaXRlX25pY19ieXRlKGRldiwKKwl3cml0ZV9uaWNfYnl0ZShkZXYsCiAJCSAgICAgICBDT05GSUcyLCByZWFkX25pY19ieXRlKGRldixDT05GSUcyKXwoMTw8NCkpOwogCiAJcnRsODE4MF9zZXRfbW9kZShkZXYsRVBST01fQ01EX05PUk1BTCk7CiAKIAl3cml0ZV9uaWNfZHdvcmQoZGV2LElOVF9USU1FT1VULDApOwogCi0JaWYoIXByaXYtPmNhcmRfODE4NSkKLQl7Ci0JCS8qCi0JCWV4cGVyaW1lbnRhbCAtIHRoaXMgbWlnaHQgYmUgbmVlZGVkIHRvIGNhbGlicmF0ZSBBR0MsCi0JCWFueXdheSBpdCBzaG91bGRuJ3QgaHVydAotCQkqLwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzUsCi0JCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSkgfCAoMTw8QUdDUkVTRVRfU0hJRlQpKTsKLQkJcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzUpOwotCQl1ZGVsYXkoMTUpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENPTkZJRzUsCi0JCQlyZWFkX25pY19ieXRlKGRldiwgQ09ORklHNSkgJn4gKDE8PEFHQ1JFU0VUX1NISUZUKSk7Ci0JfWVsc2V7Ci0JCXdyaXRlX25pY19ieXRlKGRldiwgV1BBX0NPTkZJRywgMCk7Ci0JCS8vd3JpdGVfbmljX2J5dGUoZGV2LCBURVNUUiwgMHhkKTsKLQl9CisJd3JpdGVfbmljX2J5dGUoZGV2LCBXUEFfQ09ORklHLCAwKTsKIAogCXJ0bDgxODBfbm9faHdfd2VwKGRldik7CiAKLQlpZihwcml2LT5jYXJkXzgxODUpewotCQlydGw4MTg1X3NldF9yYXRlKGRldik7Ci0JCXdyaXRlX25pY19ieXRlKGRldiwgUkFURV9GQUxMQkFDSywgMHg4MSk7Ci0JfWVsc2V7Ci0JCXdvcmQgID0gcmVhZF9uaWNfd29yZChkZXYsIEJSU1IpOwotCQl3b3JkICY9IH5CUlNSX01CUjsKLQkJd29yZCAmPSB+QlJTUl9CUExDUDsKLQkJd29yZCB8PSBpZWVlcmF0ZTJydGxyYXRlKHByaXYtPmllZWU4MDIxMS0+YmFzaWNfcmF0ZSk7Ci0JCXdvcmQgfD0gMHgwZjsKLQkJd3JpdGVfbmljX3dvcmQoZGV2LCBCUlNSLCB3b3JkKTsKLQl9CisJcnRsODE4NV9zZXRfcmF0ZShkZXYpOworCXdyaXRlX25pY19ieXRlKGRldiwgUkFURV9GQUxMQkFDSywgMHg4MSk7CiAKLQlpZihwcml2LT5jYXJkXzgxODUpewotCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEdQX0VOQUJMRSxyZWFkX25pY19ieXRlKGRldiwgR1BfRU5BQkxFKSAmIH4oMTw8NikpOworCXdyaXRlX25pY19ieXRlKGRldiwgR1BfRU5BQkxFLCByZWFkX25pY19ieXRlKGRldiwgR1BfRU5BQkxFKSAmIH4oMTw8NikpOwogCi0JCS8vRklYTUUgY2ZnIDMgQ2xrUnVuIGVuYWJsZSAtIGlzbid0IGl0IFJlYWRPbmx5ID8KLQkJcnRsODE4MF9zZXRfbW9kZShkZXYsIEVQUk9NX0NNRF9DT05GSUcpOwotCQl3cml0ZV9uaWNfYnl0ZShkZXYsQ09ORklHMywgcmVhZF9uaWNfYnl0ZShkZXYsIENPTkZJRzMpCi0JCQkgICAgICAgfCAoMSA8PCBDT05GSUczX0NMS1JVTl9TSElGVCkpOwotCQlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7Ci0JfQorCS8qRklYTUUgY2ZnIDMgQ2xrUnVuIGVuYWJsZSAtIGlzbid0IGl0IFJlYWRPbmx5ID8gKi8KKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX0NPTkZJRyk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDT05GSUczLCByZWFkX25pY19ieXRlKGRldiwgQ09ORklHMykKKwkJICAgICAgIHwgKDEgPDwgQ09ORklHM19DTEtSVU5fU0hJRlQpKTsKKwlydGw4MTgwX3NldF9tb2RlKGRldiwgRVBST01fQ01EX05PUk1BTCk7CiAKIAlwcml2LT5yZl9pbml0KGRldik7CiAKQEAgLTQxNDQsNyArMzk3OCw3IEBACiAJCX0KIAogCS8qIHdlIGNoZWNrIGFsbCB0aGUgZGVzY3JpcHRvcnMgYmV0d2VlbiB0aGUgaGVhZCBhbmQgdGhlIG5pYywKLQkgKiBidXQgbm90IHRoZSBjdXJyZW5seSBwb2ludGVkIGJ5IHRoZSBuaWMgKHRoZSBuZXh0IHRvIGJlIHR4ZWQpCisJICogYnV0IG5vdCB0aGUgY3VycmVudGx5IHBvaW50ZWQgYnkgdGhlIG5pYyAodGhlIG5leHQgdG8gYmUgdHhlZCkKIAkgKiBhbmQgdGhlIHByZXZpb3VzIG9mIHRoZSBwb2ludGVkIChtaWdodCBiZSBpbiBwcm9jZXNzID8/KQogCSovCiAJb2ZmcyA9IChuaWMgLSBuaWNiZWdpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX2RtLmMKaW5kZXggYjZlZWVlYy4uY2JjYTU4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfZG0uYwpAQCAtMzYsNyArMzYsNyBAQAogLy8KIC8vCU5vdGU6CiAvLwkJVGhlIHJlYXNvbiB3aHkgd2UgdWRwYXRlIFR4IHBvd2VyIGxldmVsIGhlcmUgaW5zdGVhZCBvZiBEb1J4SGlnaFBvd2VyKCkKLS8vCQlpcyB0aGUgbnVtYmVyIG9mIElPIHRvIGNoYW5nZSBUeCBwb3dlciBpcyBtdWNoIG1vcmUgdGhhbiBjaGFuZSBUUiBzd2l0Y2gKKy8vCQlpcyB0aGUgbnVtYmVyIG9mIElPIHRvIGNoYW5nZSBUeCBwb3dlciBpcyBtdWNoIG1vcmUgdGhhbiBjaGFubmVsIFRSIHN3aXRjaAogLy8JCWFuZCB0aGV5IGFyZSByZWxhdGVkIHRvIE9GRE0gYW5kIE1BQyByZWdpc3RlcnMuCiAvLwkJU28sIHdlIGRvbid0IHdhbnQgdG8gdXBkYXRlIGl0IHNvIGZyZXF1ZW50bHkgaW4gcGVyLVJ4IHBhY2tldCBiYXNlLgogLy8KQEAgLTE5Nyw3ICsxOTcsNiBAQAogCXsgLy8gQWR2aXNlZCBmcm9tIFNEMyBEWgogCQlwcml2LT5Jbml0aWFsR2FpbiA9IDQ7IC8vIEluIDg3QiwgbTc0ZEJtIG1lYW5zIFN0YXRlIDQgKG04MmRCbSkKIAl9Ci0JLy9pZihwSGFsRGF0YS0+VmVyc2lvbklEICE9IFZFUlNJT05fODE4N0JfQikKIAl7IC8vIEFkdmlzZWQgZnJvbSBTRDMgRFoKIAkJT2ZkbUZBMSA9ICAweDIwOwogCX0KQEAgLTEzMjYsNyArMTMyNSw3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtub3duIFJGQ2hpcElEKCVkKVxuIiwgcHJpdi0+cmZfY2hpcCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTEzNDYsMTMgKzEzNDUsMTMgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlNldEFudGVubmE4MTg1OiB1bmtvd24gUkZDaGlwSUQoJWQpXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua25vd24gUkZDaGlwSUQoJWQpXG4iLCBwcml2LT5yZl9jaGlwKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJTZXRBbnRlbm5hODE4NTogdW5rb3duIHUxYkFudGVubmFJbmRleCglZClcbiIsIHUxYkFudGVubmFJbmRleCk7CisJCXByaW50aygiU2V0QW50ZW5uYTgxODU6IHVua25vd24gdTFiQW50ZW5uYUluZGV4KCVkKVxuIiwgdTFiQW50ZW5uYUluZGV4KTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNDQ4LDcgKzE0NDcsNyBAQAogCiAJCXByaXYtPmJBZFN3aXRjaGVkQ2hlY2tpbmcgPSBmYWxzZTsKIAotCQkvLyBBZGp1c3QgUnggc2lnbmFsIHN0cmVuZ3RoIHRocmVhc2hvbGQuCisJCS8vIEFkanVzdCBSeCBzaWduYWwgc3RyZW5ndGggdGhyZXNob2xkLgogCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoICsgcHJpdi0+QWRSeFNzQmVmb3JlU3dpdGNoZWQpIC8gMjsKIAogCQlwcml2LT5BZFJ4U3NUaHJlc2hvbGQgPSAocHJpdi0+QWRSeFNzVGhyZXNob2xkID4gcHJpdi0+QWRNYXhSeFNzVGhyZXNob2xkKSA/CkBAIC0xNTYyLDcgKzE1NjEsNyBAQAogLy8JCQkJcHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoLCBwcml2LT5BZFJ4U3NUaHJlc2hvbGQpOwogCiAJCQlwcml2LT5iQWRTd2l0Y2hlZENoZWNraW5nID0gZmFsc2U7Ci0JCQkvLyBJbmNyZWFzZSBSeCBzaWduYWwgc3RyZW5ndGggdGhyZWFzaG9sZCBpZiBuZWNlc3NhcnkuCisJCQkvLyBJbmNyZWFzZSBSeCBzaWduYWwgc3RyZW5ndGggdGhyZXNob2xkIGlmIG5lY2Vzc2FyeS4KIAkJCWlmKAkocHJpdi0+QWRSeFNpZ25hbFN0cmVuZ3RoID4gKHByaXYtPkFkUnhTc1RocmVzaG9sZCArIDEwKSkgJiYgLy8gU2lnbmFsIGlzIG11Y2ggc3Ryb25nZXIgdGhhbiBjdXJyZW50IHRocmVzaG9sZAogCQkJCXByaXYtPkFkUnhTc1RocmVzaG9sZCA8PSBwcml2LT5BZE1heFJ4U3NUaHJlc2hvbGQpIC8vIEN1cnJlbnQgdGhyZWhvbGQgaXMgbm90IHlldCByZWFjaCB1cHBlciBsaW1pdC4KIAkJCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCmluZGV4IGI2NDg3NTEuLmFmZTEwZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwpAQCAtMjMsNyArMjMsNiBAQAogCXUxNiBvdXQsIHNlbGVjdDsKIAl1OCBiaXQ7CiAJdTMyIGJhbmdkYXRhID0gKGRhdGEgPDwgNCkgfCAoYWRyICYgMHhmKTsKLQlzdHJ1Y3QgcjgxODBfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAKIAlvdXQgPSByZWFkX25pY193b3JkKGRldiwgUkZQaW5zT3V0cHV0KSAmIDB4ZmZmMzsKIApAQCAtMzMsNyArMzIsNyBAQAogCXNlbGVjdCA9IHJlYWRfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QpOwogCiAJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNTZWxlY3QsIHNlbGVjdCB8IDB4NyB8Ci0JCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAwIDogU1dfQ09OVFJPTF9HUElPKSk7CisJCSAgICAgICBTV19DT05UUk9MX0dQSU8pOwogCiAJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKIAl1ZGVsYXkoMTApOwpAQCAtNzEsMTYgKzcwLDExIEBACiAJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKIAl1ZGVsYXkoMTApOwogCi0Jd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8Ci0JCSgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyA0IDogQkJfSE9TVF9CQU5HX0VOKSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRlBpbnNPdXRwdXQsIG91dCB8IEJCX0hPU1RfQkFOR19FTik7CiAKLQl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwKLQkJKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSA/IDAgOiBTV19DT05UUk9MX0dQSU8pKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIFJGUGluc1NlbGVjdCwgc2VsZWN0IHwgU1dfQ09OVFJPTF9HUElPKTsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKQotCQltZGVsYXkoMik7Ci0JZWxzZQotCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7CisJcnRsODE4NV9yZl9waW5zX2VuYWJsZShkZXYpOwogfQogCiBzdGF0aWMgY29uc3QgdTE2IHJ0bDgyMjViY2RfcnhnYWluW10gPSB7CkBAIC0xNzQsMTUgKzE2OCw5IEBACiAJdTggY2NrX3Bvd2VyX2xldmVsID0gMHhmZiAmIHByaXYtPmNodHhwd3JbY2hdOwogCXU4IG9mZG1fcG93ZXJfbGV2ZWwgPSAweGZmICYgcHJpdi0+Y2h0eHB3cl9vZmRtW2NoXTsKIAotCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKSB7Ci0JCW1heF9jY2tfcG93ZXJfbGV2ZWwgPSAxMTsKLQkJbWF4X29mZG1fcG93ZXJfbGV2ZWwgPSAyNTsKLQkJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAxMDsKLQl9IGVsc2UgewotCQltYXhfY2NrX3Bvd2VyX2xldmVsID0gMzU7Ci0JCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMzU7Ci0JCW1pbl9vZmRtX3Bvd2VyX2xldmVsID0gMDsKLQl9CisJbWF4X2Nja19wb3dlcl9sZXZlbCA9IDM1OworCW1heF9vZmRtX3Bvd2VyX2xldmVsID0gMzU7CisJbWluX29mZG1fcG93ZXJfbGV2ZWwgPSAwOwogCiAJaWYgKGNja19wb3dlcl9sZXZlbCA+IG1heF9jY2tfcG93ZXJfbGV2ZWwpCiAJCWNja19wb3dlcl9sZXZlbCA9IG1heF9jY2tfcG93ZXJfbGV2ZWw7CkBAIC00NDUsMzAgKzQzMywyOCBAQAogCSAqIE9GRE0gUG93ZXIgaW4gZEJtID0gSW5kZXggKiAwLjUgKyAwCiAJICogQ0NLIFBvd2VyIGluIGRCbSA9IEluZGV4ICogMC4yNSArIDEzCiAJICovCi0JaWYgKHByaXYtPmNhcmRfODE4NSA+PSBWRVJTSU9OXzgxODdTX0IpIHsKLQkJczMyIHRtcCA9IDA7CisJczMyIHRtcCA9IDA7CiAKLQkJaWYgKFdpcmVsZXNzTW9kZSA9PSBXSVJFTEVTU19NT0RFX0cpIHsKLQkJCWJVc2VEZWZhdWx0ID0gZmFsc2U7Ci0JCQl0bXAgPSAoMiAqIFBvd2VySW5EYm0pOworCWlmIChXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9HKSB7CisJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CisJCXRtcCA9ICgyICogUG93ZXJJbkRibSk7CiAKLQkJCWlmICh0bXAgPCAwKQotCQkJCVR4UHdySWR4ID0gMDsKLQkJCWVsc2UgaWYgKHRtcCA+IDQwKSAvKiA0MCBtZWFucyAyMCBkQm0uICovCi0JCQkJVHhQd3JJZHggPSA0MDsKLQkJCWVsc2UKLQkJCQlUeFB3cklkeCA9IChzOCl0bXA7Ci0JCX0gZWxzZSBpZiAoV2lyZWxlc3NNb2RlID09IFdJUkVMRVNTX01PREVfQikgewotCQkJYlVzZURlZmF1bHQgPSBmYWxzZTsKLQkJCXRtcCA9ICg0ICogUG93ZXJJbkRibSkgLSA1MjsKKwkJaWYgKHRtcCA8IDApCisJCQlUeFB3cklkeCA9IDA7CisJCWVsc2UgaWYgKHRtcCA+IDQwKSAvKiA0MCBtZWFucyAyMCBkQm0uICovCisJCQlUeFB3cklkeCA9IDQwOworCQllbHNlCisJCQlUeFB3cklkeCA9IChzOCl0bXA7CisJfSBlbHNlIGlmIChXaXJlbGVzc01vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKSB7CisJCWJVc2VEZWZhdWx0ID0gZmFsc2U7CisJCXRtcCA9ICg0ICogUG93ZXJJbkRibSkgLSA1MjsKIAotCQkJaWYodG1wIDwgMCkKLQkJCQlUeFB3cklkeCA9IDA7Ci0JCQllbHNlIGlmICh0bXAgPiAyOCkgLyogMjggbWVhbnMgMjAgZEJtLiAqLwotCQkJCVR4UHdySWR4ID0gMjg7Ci0JCQllbHNlCi0JCQkJVHhQd3JJZHggPSAoczgpdG1wOwotCQl9CisJCWlmICh0bXAgPCAwKQorCQkJVHhQd3JJZHggPSAwOworCQllbHNlIGlmICh0bXAgPiAyOCkgLyogMjggbWVhbnMgMjAgZEJtLiAqLworCQkJVHhQd3JJZHggPSAyODsKKwkJZWxzZQorCQkJVHhQd3JJZHggPSAoczgpdG1wOwogCX0KIAogCS8qCkBAIC02MzEsOCArNjE3LDcgQEAKIAogCXByaXYtPmNoYW4gPSBjaGFubmVsOwogCi0JaWYgKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCi0JCXJ0bDgyMjVfaG9zdF9wY2lfaW5pdChkZXYpOworCXJ0bDgyMjVfaG9zdF9wY2lfaW5pdChkZXYpOwogCiAJd3JpdGVfbmljX2R3b3JkKGRldiwgUkZfVElNSU5HLCAweDAwMGE4MDA4KTsKIApAQCAtNjU1LDcgKzY0MCw3IEBACiAJd3JpdGVfcnRsODIyNShkZXYsIDB4NCwgMHg4YzMpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcnRsODIyNShkZXYsIDB4NSwgMHhjNzIpOyBtZGVsYXkoMSk7CiAJd3JpdGVfcnRsODIyNShkZXYsIDB4NiwgMHhlNik7ICBtZGVsYXkoMSk7Ci0Jd3JpdGVfcnRsODIyNShkZXYsIDB4NywgKChwcml2LT5jYXJkX3R5cGUgPT0gVVNCKT8gMHg4MmEgOiBydGw4MjI1X2NoYW5bY2hhbm5lbF0pKTsgIG1kZWxheSgxKTsKKwl3cml0ZV9ydGw4MjI1KGRldiwgMHg3LCBydGw4MjI1X2NoYW5bY2hhbm5lbF0pOyAgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDgsIDB4M2YpOyAgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweDksIDB4MzM1KTsgbWRlbGF5KDEpOwogCXdyaXRlX3J0bDgyMjUoZGV2LCAweGEsIDB4OWQ0KTsgbWRlbGF5KDEpOwpAQCAtNjgxLDEzICs2NjYsNiBAQAogCiAJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHhjNGQpOwogCi0JaWYgKHByaXYtPmNhcmRfdHlwZSA9PSBVU0IpIHsKLQkJbWRlbGF5KDIwMCk7Ci0KLQkJd3JpdGVfcnRsODIyNShkZXYsIDB4MiwgMHg0NGQpOwotCQltZGVsYXkoMTAwKTsKLQl9Ci0KIAkvKiBGSVhNRSEhIHJ0bDgxODcgd2UgaGF2ZSB0byBjaGVjayBpZiBjYWxpYnJhcmlvbgogCSAqIGlzIHN1Y2Nlc3NmdWwgYW5kIGV2ZW50dWFsbHkgY2FsLiBhZ2FpbiAocmVwZWF0CiAJICogdGhlIHR3byB3cml0ZSBvbiByZWcgMikKQEAgLTcwNyw5ICs2ODUsNiBAQAogCiAJd3JpdGVfcnRsODIyNShkZXYsIDB4MCwgMHgyYmYpOwogCi0JaWYgKHByaXYtPmNhcmRfdHlwZSAhPSBVU0IpCi0JCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKLQogCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgewogCQlkYXRhID0gcnRsODIyNV9hZ2NbaV07CiAKQEAgLTcyNiw3ICs3MDEsNyBAQAogCiAJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAwLCAweDAxKTsgbWRlbGF5KDEpOwogCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMSwgMHgwMik7IG1kZWxheSgxKTsKLQl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDIsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAweDQyIDogMHg2MikpOyBtZGVsYXkoMSk7CisJd3JpdGVfcGh5X29mZG0oZGV2LCAweDAyLCAweDYyKTsgbWRlbGF5KDEpOwogCXdyaXRlX3BoeV9vZmRtKGRldiwgMHgwMywgMHgwMCk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfb2ZkbShkZXYsIDB4MDQsIDB4MDApOyBtZGVsYXkoMSk7CiAJd3JpdGVfcGh5X29mZG0oZGV2LCAweDA1LCAweDAwKTsgbWRlbGF5KDEpOwpAQCAtNzc0LDcgKzc0OSw3IEBACiAJd3JpdGVfcGh5X2NjayhkZXYsIDB4NiwgMHhmYyk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfY2NrKGRldiwgMHg3LCAweDc4KTsgbWRlbGF5KDEpOwogCXdyaXRlX3BoeV9jY2soZGV2LCAweDgsIDB4MmUpOyBtZGVsYXkoMSk7Ci0Jd3JpdGVfcGh5X2NjayhkZXYsIDB4MTAsICgocHJpdi0+Y2FyZF90eXBlID09IFVTQikgPyAweDliOiAweDkzKSk7IG1kZWxheSgxKTsKKwl3cml0ZV9waHlfY2NrKGRldiwgMHgxMCwgMHg5Myk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfY2NrKGRldiwgMHgxMSwgMHg4OCk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfY2NrKGRldiwgMHgxMiwgMHg0Nyk7IG1kZWxheSgxKTsKIAl3cml0ZV9waHlfY2NrKGRldiwgMHgxMywgMHhkMCk7CkBAIC04MDgsMTIgKzc4Myw4IEBACiAJLyogc3dpdGNoIHRvIGhpZ2gtc3BlZWQgMy13aXJlCiAJICogbGFzdCBkaWdpdC4gMiBmb3IgYm90aCBjY2sgYW5kIG9mZG0KIAkgKi8KLQlpZiAocHJpdi0+Y2FyZF90eXBlID09IFVTQikKLQkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHg5NCwgMHgzZGMwMDAwMik7Ci0JZWxzZSB7Ci0JCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4MTVjMDAwMDIpOwotCQlydGw4MTg1X3JmX3BpbnNfZW5hYmxlKGRldik7Ci0JfQorCXdyaXRlX25pY19kd29yZChkZXYsIDB4OTQsIDB4MTVjMDAwMDIpOworCXJ0bDgxODVfcmZfcGluc19lbmFibGUoZGV2KTsKIAogCXJ0bDgyMjVfcmZfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKIH0KQEAgLTEwNTgsNyArMTAyOSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJSZXN1bHQgPSBmYWxzZTsKLQkJCXByaW50aygiU2V0WmVicmFSRlBvd2VyU3RhdGU4MTg1KCk6IHVua25vdyBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOworCQkJcHJpbnRrKCJTZXRaZWJyYVJGUG93ZXJTdGF0ZTgxODUoKTogdW5rbm93biBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3d4LmMKaW5kZXggNzY2ODkyZS4uNTM2Y2I2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfd3guYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLwogCiAJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA5MjsgLyogPiA4JSBtaXNzZWQgYmVhY29ucyBpcyAnYmFkJyAqLwotCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2wgdmFsdWUgZm9yIFJTU0kgKi8KKwkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sZCB2YWx1ZSBmb3IgUlNTSSAqLwogCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDIwICsgLTk4OwogCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CiAJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4NWJfaW5pdC5jCmluZGV4IGNkMDcwNTkuLjUwMzA5ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODViX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTg1Yl9pbml0LmMKQEAgLTEwMjMsNiArMTAyMyw3IEBACiAJdTMyCWFkZHIsZGF0YTsKIAl1MzIJdTRiUmVnT2Zmc2V0LCB1NGJSZWdWYWx1ZSwgdTRiUkYyMywgdTRiUkYyNDsKICAgICAgICB1OAkJCXUxYjI0RTsKKwlpbnQgZF9jdXQgPSAwOwogCiAKIAkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDM1LDggKzEwMzYsMTAgQEAKIAl1NGJSRjIzPSBSRl9SZWFkUmVnKGRldiwgMHgwOCk7CQkJbWRlbGF5KDEpOwogCXU0YlJGMjQ9IFJGX1JlYWRSZWcoZGV2LCAweDA5KTsJCQltZGVsYXkoMSk7CiAKLQlpZiAodTRiUkYyMz09MHg4MTggJiYgdTRiUkYyND09MHg3MEMgJiYgcHJpdi0+Y2FyZF84MTg1ID09IFZFUlNJT05fODE4N1NfQykKLQkJcHJpdi0+Y2FyZF84MTg1ID0gVkVSU0lPTl84MTg3U19EOworCWlmICh1NGJSRjIzID09IDB4ODE4ICYmIHU0YlJGMjQgPT0gMHg3MEMpIHsKKwkJZF9jdXQgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICJydGw4MTg3c2U6IGNhcmQgdHlwZSBjaGFuZ2VkIGZyb20gQy0gdG8gRC1jdXRcbiIpOworCX0KIAogCS8vIFBhZ2UwIDogcmVnMC1yZWcxNQogCkBAIC0xMDcwLDE4ICsxMDczLDkgQEAKIAogCVJGX1dyaXRlUmVnKGRldiwgMHgwMywgMHgwODA2KTsJCQltZGVsYXkoMSk7CiAKLQlpZihwcml2LT5jYXJkXzgxODUgPCBWRVJTSU9OXzgxODdTX0MpCi0JewotCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNmNyk7CQkJbWRlbGF5KDEpOwotCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDVhYik7CQkJbWRlbGF5KDEpOwotCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDBjMSk7CQkJbWRlbGF5KDEpOwotCX0KLQllbHNlCi0JewotCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNhNyk7CQkJbWRlbGF5KDEpOwotCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDUsIDB4MDU5Yik7CQkJbWRlbGF5KDEpOwotCQlSRl9Xcml0ZVJlZyhkZXYsIDB4MDYsIDB4MDA4MSk7CQkJbWRlbGF5KDEpOwotCX0KKwlSRl9Xcml0ZVJlZyhkZXYsIDB4MDQsIDB4MDNhNyk7CQkJbWRlbGF5KDEpOworCVJGX1dyaXRlUmVnKGRldiwgMHgwNSwgMHgwNTliKTsJCQltZGVsYXkoMSk7CisJUkZfV3JpdGVSZWcoZGV2LCAweDA2LCAweDAwODEpOwkJCW1kZWxheSgxKTsKIAogCiAJUkZfV3JpdGVSZWcoZGV2LCAweDA3LCAweDAxQTApOwkJCW1kZWxheSgxKTsKQEAgLTEwOTEsMTQgKzEwODUsMTEgQEAKIAlSRl9Xcml0ZVJlZyhkZXYsIDB4MGEsIDB4MDAwMSk7CQkJbWRlbGF5KDEpOwogCVJGX1dyaXRlUmVnKGRldiwgMHgwYiwgMHgwNDE4KTsJCQltZGVsYXkoMSk7CiAKLQlpZihwcml2LT5jYXJkXzgxODUgPT0gVkVSU0lPTl84MTg3U19EKQotCXsKKwlpZiAoZF9jdXQpIHsKIAkJUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDBmYmUpOwkJCW1kZWxheSgxKTsKIAkJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwMDgpOwkJCW1kZWxheSgxKTsKIAkJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDA4MDcpOwkJCW1kZWxheSgxKTsgLy8gUlggTE8gYnVmZmVyCi0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJUkZfV3JpdGVSZWcoZGV2LCAweDBjLCAweDBmYmUpOwkJCW1kZWxheSgxKTsKIAkJUkZfV3JpdGVSZWcoZGV2LCAweDBkLCAweDAwMDgpOwkJCW1kZWxheSgxKTsKIAkJUkZfV3JpdGVSZWcoZGV2LCAweDBlLCAweDA4MDYpOwkJCW1kZWxheSgxKTsgLy8gUlggTE8gYnVmZmVyCkBAIC0yNDkzLDggKzI0ODQsOCBAQAogCVBoeUNvbmZpZzgxODUoZGV2KTsKIAogCS8vIFdlIGFzc3VtZSBSZWdXaXJlbGVzc01vZGUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBiZWZvcmUsCi0JLy8gaG93ZXZlciwgd2UgaGFzIHRvIHZhbGlkYXRlIHRoZSB3aXJlbGVzcyBtb2RlIGhlcmUgYW5kIHByb3ZpZGUgYSByZWFzb25ibGUKLQkvLyBpbml0aWFsaXplZCB2YWx1ZSBpZiBuZWNlc3NhcnkuIDIwMDUuMDEuMTMsIGJ5IHJjbmprby4KKwkvLyBob3dldmVyLCB3ZSBoYXMgdG8gdmFsaWRhdGUgdGhlIHdpcmVsZXNzIG1vZGUgaGVyZSBhbmQgcHJvdmlkZSBhCisJLy8gcmVhc29uYWJsZSBpbml0aWFsaXplZCB2YWx1ZSBpZiBuZWNlc3NhcnkuIDIwMDUuMDEuMTMsIGJ5IHJjbmprby4KIAlTdXBwb3J0ZWRXaXJlbGVzc01vZGUgPSBHZXRTdXBwb3J0ZWRXaXJlbGVzc01vZGU4MTg1KGRldik7CiAJaWYoCShpZWVlLT5tb2RlICE9IFdJUkVMRVNTX01PREVfQikgJiYKIAkJKGllZWUtPm1vZGUgIT0gV0lSRUxFU1NfTU9ERV9HKSAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCAxMmMyYTE4Li4yNjQ0MTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAgCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CiAgCWllZWUtPmllZWU4MDJfMXggPSAxOwogCWllZWUtPnJhd190eCA9IDA7Ci0JLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhbHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCisJLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhdWx0IHN1cHBvcnQgaHcgc2VjdXJpdHkuIC8vdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkLgogCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7IC8vZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LgogCiAJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCBlYWU3YzQ1Li41OTNkMjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0yMzMwLDEwICsyMzMwLDEwIEBACiAgKiBjYXJlIG9mIHRoZSBpZWVlODAyLjExIGZyYWdtZW50YXRpb24uCiAgKiBTbyB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgcGVyIHRpbWUgYW5kIG1pZ2h0CiAgKiBjYWxsIHRoZSBzdG9wIGZ1bmN0aW9uIHdoZW4gaXQgd2FudCB3aXRob3V0IHRha2UgY2FyZQotICogdG8gaGF2ZSBlbm91Z2h0IHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KKyAqIHRvIGhhdmUgZW5vdWdoIHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KICAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgogICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KLSAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0cmVzaG9sZCBpcyBub3QgZW5vdWdodC4uIElmIHRoZQorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBub3QgZW5vdWdoLi4gSWYgdGhlCiAgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCiAgKiB0byBrZWVwIE4gZnJlZSBkZXNjcmlwdG9ycyB3aGVyZQogICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RSRVNIT0xECmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYwppbmRleCAwZWFlZTNhLi4zZDY3ZmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MF9ydGw4MjU2LmMKQEAgLTYyOSw3ICs2MjksNyBAQAogCiAJCQlkZWZhdWx0OgogCQkJCQliUmVzdWx0ID0gZmFsc2U7Ci0JCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiB1bmtub3cgc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IHVua25vd24gc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLCBlUkZQb3dlclN0YXRlKTsKIAkJCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwppbmRleCBiMDgwMmE3Li5mZjhmZTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NvcmUuYwpAQCAtMTA0MSw3ICsxMDQxLDcgQEAKICAgICAgICAgdHhfZGVzY184MTl4X3BjaSAqZW50cnkgPSAmcmluZy0+ZGVzY1tyaW5nLT5pZHhdOwogICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0gICAgICAgIC8qIGJlYWNvbiBwYWNrZXQgd2lsbCBvbmx5IHVzZSB0aGUgZmlyc3QgZGVzY3JpcHRvciBkZWZhdXRseSwKKyAgICAgICAgLyogYmVhY29uIHBhY2tldCB3aWxsIG9ubHkgdXNlIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGRlZmF1bHRseSwKICAgICAgICAgICogYW5kIHRoZSBPV04gbWF5IG5vdCBiZSBjbGVhcmVkIGJ5IHRoZSBoYXJkd2FyZQogICAgICAgICAgKiAqLwogICAgICAgICBpZihwcmlvICE9IEJFQUNPTl9RVUVVRSkgewpAQCAtMjU2Miw3ICsyNTYyLDcgQEAKIAkJcHJpdi0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0gPSBmYWxzZTsKIAl9CiAKLQkvLyAyMDA3LzExLzE1IE1IIDgxOTBQQ0kgRGVmYXVsdD0yVDRSLCA4MTkyUENJRSBkYWZhdWx0PTFUMlIKKwkvLyAyMDA3LzExLzE1IE1IIDgxOTBQQ0kgRGVmYXVsdD0yVDRSLCA4MTkyUENJRSBkZWZhdWx0PTFUMlIKIAlwcml2LT5yZl90eXBlID0gUlRMODE5WF9ERUZBVUxUX1JGX1RZUEU7CiAKIAlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA+IFZFUlNJT05fODE5MF9CRCkKQEAgLTM1NTQsNyArMzU1NCw3IEBACiAJLy9zcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CiAJLyogcHJlcGFyZSBtaXNjIGluZm8gZm9yIHRoZSBiZWFjb24geG1pdCAqLwogCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IEJFQUNPTl9RVUVVRTsKLQkvKiBJQlNTIGRvZXMgbm90IHN1cHBvcnQgSFQgeWV0LCB1c2UgMU0gZGVmYXV0bHkgKi8KKwkvKiBJQlNTIGRvZXMgbm90IHN1cHBvcnQgSFQgeWV0LCB1c2UgMU0gZGVmYXVsdGx5ICovCiAJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IDI7CiAJdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDc7CiAJdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kbS5jCmluZGV4IGJmODc2MzIuLjVmZmI0ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmMKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCQkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKIAkJfQogCi0JCS8vRGJnUHJpbnQoIltETV0gVEhyZXNoIEgvTD0lZC8lZFxuXHIiLCBSQVRSLkhpZ2hSU1NJVGhyZXNoRm9yUkEsIFJBVFIuTG93UlNTSVRocmVzaEZvclJBKTsKKwkJLy9EYmdQcmludCgiW0RNXSBUaHJlc2ggSC9MPSVkLyVkXG5cciIsIFJBVFIuSGlnaFJTU0lUaHJlc2hGb3JSQSwgUkFUUi5Mb3dSU1NJVGhyZXNoRm9yUkEpOwogCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChsb25nKUhpZ2hSU1NJVGhyZXNoRm9yUkEpCiAJCXsKIAkJCS8vRGJnUHJpbnQoIltETV0gUlNTST0lZCBTVEE9SElHSFxuXHIiLCBwSGFsRGF0YS0+VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpOwpAQCAtNTcxLDcgKzU3MSw3IEBACiAJMHg1YTQwMDE2OSwJLy8gMywgKzNkYgogCTB4NTA4MDAxNDIsCS8vIDQsICsyZGIKIAkweDQ3YzAwMTFmLAkvLyA1LCArMWRiCi0JMHg0MDAwMDEwMCwJLy8gNiwgKzBkYiA9PT0+IGRlZmF1bHQsIHVwcGVyIGZvciBoaWdoZXIgdGVtcHJhdHVyZSwgbG93ZXIgZm9yIGxvdyB0ZW1wcmF0dXJlCisJMHg0MDAwMDEwMCwJLy8gNiwgKzBkYiA9PT0+IGRlZmF1bHQsIHVwcGVyIGZvciBoaWdoZXIgdGVtcGVyYXR1cmUsIGxvd2VyIGZvciBsb3cgdGVtcGVyYXR1cmUKIAkweDM5MDAwMGU0LAkvLyA3LCAtMWRiCiAJMHgzMmMwMDBjYiwJLy8gOCwgLTJkYgogCTB4MmQ0MDAwYjUsCS8vIDksIC0zZGIKQEAgLTkzMiwxNCArOTMyLDE0IEBACiAJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlYWRiYWNrIFRoZXJtYWxNZXRlckEgPSAlZCBcbiIsIHRtcFJlZ0EpOwogCWlmKHRtcFJlZ0EgPCAzIHx8IHRtcFJlZ0EgPiAxMykKIAkJcmV0dXJuOwotCWlmKHRtcFJlZ0EgPj0gMTIpCS8vIGlmIG92ZXIgMTIsIFRQIHdpbGwgYmUgYmFkIHdoZW4gaGlnaCB0ZW1wcmF0dXJlCisJaWYodG1wUmVnQSA+PSAxMikJLy8gaWYgb3ZlciAxMiwgVFAgd2lsbCBiZSBiYWQgd2hlbiBoaWdoIHRlbXBlcmF0dXJlCiAJCXRtcFJlZ0EgPSAxMjsKIAlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiVmFsaWQgVGhlcm1hbE1ldGVyQSA9ICVkIFxuIiwgdG1wUmVnQSk7CiAJcHJpdi0+VGhlcm1hbE1ldGVyWzBdID0gVGhlcm1hbE1ldGVyVmFsOwkvL1dlIHVzZSBmaXhlZCB2YWx1ZSBieSBCcnlhbnQncyBzdWdnZXN0aW9uCiAJcHJpdi0+VGhlcm1hbE1ldGVyWzFdID0gVGhlcm1hbE1ldGVyVmFsOwkvL1dlIHVzZSBmaXhlZCB2YWx1ZSBieSBCcnlhbnQncyBzdWdnZXN0aW9uCiAKLQkvL0dldCBjdXJyZW50IFJGLUEgdGVtcHJhdHVyZSBpbmRleAotCWlmKHByaXYtPlRoZXJtYWxNZXRlclswXSA+PSAodTgpdG1wUmVnQSkJLy9sb3dlciB0ZW1wcmF0dXJlCisJLy9HZXQgY3VycmVudCBSRi1BIHRlbXBlcmF0dXJlIGluZGV4CisJaWYocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKQkvL2xvd2VyIHRlbXBlcmF0dXJlCiAJewogCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDYrKHByaXYtPlRoZXJtYWxNZXRlclswXS0odTgpdG1wUmVnQSk7CiAJCXRtcENDSzQwTWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggLSA2OwpAQCAtOTUzLDcgKzk1Myw3IEBACiAJZWxzZQogCXsKIAkJdG1wdmFsID0gKCh1OCl0bXBSZWdBIC0gcHJpdi0+VGhlcm1hbE1ldGVyWzBdKTsKLQkJaWYodG1wdmFsID49IDYpCQkJCQkJCQkvLyBoaWdoZXIgdGVtcHJhdHVyZQorCQlpZih0bXB2YWwgPj0gNikJCQkJCQkJCS8vIGhpZ2hlciB0ZW1wZXJhdHVyZQogCQkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSAwOwkJLy8gbWF4IHRvICs2ZEIKIAkJZWxzZQogCQkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSA2IC0gdG1wdmFsOwpAQCAtMjAxNyw3ICsyMDE3LDcgQEAKIAlkbV9kaWd0YWJsZS5kYmdfbW9kZSA9IERNX0RCR19PRkY7CS8vb2ZmPWJ5IHJlYWwgcnNzaSB2YWx1ZSwgb249YnkgRE1fRGlnVGFibGUuUnNzaV92YWwgZm9yIG5ldyBkaWcKIAlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CiAKLQkvKiAyMDA3LzEwLzA0IE1IIERlZmluZSBpbml0IGdhaW4gdGhyZXNob2wuICovCisJLyogMjAwNy8xMC8wNCBNSCBEZWZpbmUgaW5pdCBnYWluIHRocmVzaG9sZC4gKi8KIAlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CiAJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUJPSBETV9TVEFfRElHX01BWDsKIAlkbV9kaWd0YWJsZS5pbml0aWFsZ2Fpbl9sb3dlcmJvdW5kX3N0YXRlID0gZmFsc2U7CkBAIC0yMTQ1LDcgKzIxNDUsNyBAQAogCS8qRGJnUHJpbnQoIkRJRyBDaGVja1xuXHIgUlNTST0lZCBMT1c9JWQgSElHSD0lZCBTVEFURT0lZCIsCiAJcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBETV9EaWdUYWJsZS5Sc3NpTG93VGhyZXNoLAogCURNX0RpZ1RhYmxlLlJzc2lIaWdoVGhyZXNoLCBETV9EaWdUYWJsZS5EaWdfU3RhdGUpOyovCi0JLyogMS4gV2hlbiBSU1NJIGRlY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBhIHRyZXNob2xkCisJLyogMS4gV2hlbiBSU1NJIGRlY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBhIHRocmVzaG9sZAogCQkgIGFuZCB0aGVuIGV4ZWN1dGUgYmVsb3cgc3RlcC4gKi8KIAlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKIAl7CkBAIC0yMjA1LDcgKzIyMDUsNyBAQAogCiAJfQogCi0JLyogMi4gV2hlbiBSU1NJIGluY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIGxhcmdlciB0aGFuIGEgdHJlc2hvbGQKKwkvKiAyLiBXaGVuIFJTU0kgaW5jcmVhc2UsIFdlIGhhdmUgdG8ganVkZ2UgaWYgaXQgaXMgbGFyZ2VyIHRoYW4gYSB0aHJlc2hvbGQKIAkJICBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICAqLwogCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSApCiAJewpAQCAtMjMxNCw3ICsyMzE0LDcgQEAKIAl9CiAKIAkvKiAzLiBXaGVuIFJTU0kgPjc1JSBvciA8NzAlLCBpdCBpcyBhIGhpZ2ggcG93ZXIgaXNzdWUuIFdlIGhhdmUgdG8ganVkZ2UgaWYKLQkJICBpdCBpcyBsYXJnZXIgdGhhbiBhIHRyZXNob2xkIGFuZCB0aGVuIGV4ZWN1dGUgYmVsb3cgc3RlcC4gICovCisJCSAgaXQgaXMgbGFyZ2VyIHRoYW4gYSB0aHJlc2hvbGQgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KIAkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSBNb2RpZnkgUERfVEggZm9yIGhpZ2ggcG93ZXIgaXNzdWUuCiAJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5jCmluZGV4IGU5ZTc5OWMuLmQxZWI4OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmMKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KIAogCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gOTI7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KLQkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sIHZhbHVlIGZvciBSU1NJICovCisJLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbGQgdmFsdWUgZm9yIFJTU0kgKi8KIAlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKIAlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwogCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2NtZHBrdC5jCmluZGV4IGQ2YjdkMmYuLjJhYWE0ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9jbWRwa3QuYwpAQCAtNzgzLDcgKzc4Myw3IEBACiAKIAkJCWRlZmF1bHQ6CiAKLQkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FVkVOVFMsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3cgQ01EIEVsZW1lbnRcbiIpOworCQkJICAgICAgICBSVF9UUkFDRShDT01QX0VWRU5UUywgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOnVua25vd24gQ01EIEVsZW1lbnRcbiIpOwogCQkJCXJldHVybiAxOwkvKiBUaGlzIGlzIGEgY29tbWFuZCBwYWNrZXQuICovCiAJCX0KIAkJLy8gMjAwNy8wMS8yMiBNSCBEaXNwbGF5IHJlY2VpdmVkIHJ4IGNvbW1hbmQgcGFja2V0IGluZm8uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaAppbmRleCBkNGE0MzkyLi4zN2YwZmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5cmVnLmgKQEAgLTI5NCw3ICsyOTQsNyBAQAogI2RlZmluZSBiUjJSQ0NBTWFzayAgICAgICAgICAgICAgIAkJMHgwMDAwMGYwMAogI2RlZmluZSBiSFNTSV9SMlREZWxheSAgICAgICAgICAgIAkJMHhmODAwMDAwMAogI2RlZmluZSBiSFNTSV9UMlJEZWxheSAgICAgICAgICAgIAkJMHhmODAwMDAKLSNkZWZpbmUgYkNvbnRUeEhTU0kgICAgICAgICAgICAgICAJCTB4NDAwICAgICAvL2NoYW5lIGdhaW4gYXQgY29udGludWUgVHgKKyNkZWZpbmUgYkNvbnRUeEhTU0kgICAgICAgICAgICAgICAJCTB4NDAwICAgICAvL2NoYW5uZWwgZ2FpbiBhdCBjb250aW51ZSBUeAogI2RlZmluZSBiSUdGcm9tQ0NLICAgICAgICAgICAgICAgIAkJMHgyMDAKICNkZWZpbmUgYkFHQ0FkZHJlc3MgICAgICAgICAgICAgICAJCTB4M2YKICNkZWZpbmUgYlJ4SFBUeCAgICAgICAgICAgICAgICAgICAJCQkweDcwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvS2NvbmZpZwppbmRleCBiOGM5NWY5Li4xMjNmYTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFJUTDgxOTJTVQogCXRyaXN0YXRlICJSZWFsVGVrIFJUTDgxOTJTVSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciIKLQlkZXBlbmRzIG9uIFBDSSAmJiBXTEFOCisJZGVwZW5kcyBvbiBQQ0kgJiYgV0xBTiAmJiBVU0IKIAlkZXBlbmRzIG9uIFdJUkVMRVNTX0VYVAogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwppbmRleCBjMzM4M2JiLi5lOGM2N2Q1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jCkBAIC0xNTYsNyArMTU2LDcgQEAKICAJaWVlZS0+cHJpdmFjeV9pbnZva2VkID0gMDsKICAJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CiAJaWVlZS0+cmF3X3R4ID0gMDsKLQkvL2llZWUtPmh3c2VjX3N1cHBvcnQgPSAxOyAvL2RlZmFsdCBzdXBwb3J0IGh3IHNlY3VyaXR5LiAvL3VzZSBtb2R1bGVfcGFyYW0gaW5zdGVhZC4KKwkvL2llZWUtPmh3c2VjX3N1cHBvcnQgPSAxOyAvL2RlZmF1bHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCiAJaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsgLy9kaXNhYmxlIGh3c2VjLCBzd2l0Y2ggaXQgb24gd2hlbiBuZWNlc3NhcnkuCiAKIAlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCA4ZTU2Zjk3Li5hYzIyM2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IGZkOGUxMTIuLjIwM2MwYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMjEyMCwxMCArMjEyMCwxMCBAQAogICogY2FyZSBvZiB0aGUgaWVlZTgwMi4xMSBmcmFnbWVudGF0aW9uLgogICogU28gdGhlIGRyaXZlciByZWNlaXZlcyBhIGZyYWdtZW50IHBlciB0aW1lIGFuZCBtaWdodAogICogY2FsbCB0aGUgc3RvcCBmdW5jdGlvbiB3aGVuIGl0IHdhbnQgd2l0aG91dCB0YWtlIGNhcmUKLSAqIHRvIGhhdmUgZW5vdWdodCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCisgKiB0byBoYXZlIGVub3VnaCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCiAgKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiBlYWNoIGZyYWdtZW50IG5lZWQgaXQncyBvd24KICAqIGRlc2NyaXB0b3IsIHRodXMganVzdCBrZWVwIGEgdG90YWwgZnJlZSBtZW1vcnkgPiB0aGFuCi0gKiB0aGUgbWF4IGZyYWdtZW50YXRpb24gdHJlc2hvbGQgaXMgbm90IGVub3VnaHQuLiBJZiB0aGUKKyAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbm90IGVub3VnaC4uIElmIHRoZQogICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAogICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKICAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwppbmRleCA0N2ZmMGVmLi42MDYyMWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKaW5kZXggNjE0NmM2NC4uODVjN2U5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKQEAgLTMwLDcgKzMwLDYgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcmVhZG1lIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9pZWVlODAyMTEvcmVhZG1lCmluZGV4IDU3NjRmMjguLjdiYTE3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvaWVlZTgwMjExL3JlYWRtZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L2llZWU4MDIxMS9yZWFkbWUKQEAgLTM3LDcgKzM3LDcgQEAKICAgZGlzYXNzb2NpYXRlIGNsaWVudHMsIGFuZCBpdCBpcyByZWFsbHkgcHJvbmUgdG8gYWx3YXlzIGFsbG93IGFjY2Vzcy4KICAgSW4gYnNzIGNsaWVudCBtb2RlIGl0IGlzIGEgYml0IHJvdWdoIHdpdGggQVAgZGVhdXRoIGFuZCBkaXNhc3NvYyByZXF1ZXN0cy4KIC0gSXQgaGFzIG5vdCBhbnkgZW50cnkgcG9pbnQgdG8gdmlldyB0aGUgY29sbGVjdGVkIHN0YXRzLgotLSBBbHRvdWdodCBpdCB0YWtlcyBjYXJlIG9mIHRoZSBjYXJkIHN1cHBvcnRlZCByYXRlcyBpbiB0aGUgbWFuYWdlbWVudCBmcmFtZQorLSBBbHRob3VnaCBpdCB0YWtlcyBjYXJlIG9mIHRoZSBjYXJkIHN1cHBvcnRlZCByYXRlcyBpbiB0aGUgbWFuYWdlbWVudCBmcmFtZQogICBpdCBzZW5kcywgc3VwcG9ydCBmb3IgcmF0ZSBjaGFuZ2luZyBvbiBUWGVkIHBhY2tldCBpcyBub3QgY29tcGxldGUuCiAtIEdpdmUgdXAgb25jZSBhc3NvY2lhdGVkIGluIGJzcyBjbGllbnQgbW9kZSAoaXQgbmV2ZXIgZGV0ZWN0IGEKICAgc2lnbmFsIGxvc3MgY29uZGl0aW9uIHRvIGRpc2Fzc29jaWF0ZSBhbmQgcmVzdGFydCBzY2FubmluZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5LmMKaW5kZXggMmMxMTFkNy4uNzdhYjAyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5LmMKQEAgLTE3MjgsNyArMTcyOCw3IEBACiAKIAkJCWRlZmF1bHQ6CiAJCQkJYlJlc3VsdCA9IEZBTFNFOwotCQkJCS8vUlRfQVNTRVJUKEZBTFNFLCAoInBoeV9TZXRSRlBvd2VyU3RhdGU4MTkyU1UoKTogdW5rbm93IHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSkpOworCQkJCS8vUlRfQVNTRVJUKEZBTFNFLCAoInBoeV9TZXRSRlBvd2VyU3RhdGU4MTkyU1UoKTogdW5rbm93biBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpKTsKIAkJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTI3MTEsNyArMjcxMSw3IEBACiAvLyBIb3dldmVyLCB0aGlzIHByb2NlZHVyZSBpcyBwZXJmb3JtZWQgc3luY2hyb25vdXNseSAgd2hpY2ggc2hvdWxkIGJlIHJ1bm5pbmcgdW5kZXIKIC8vIHBhc3NpdmUgbGV2ZWwuCiAvLwotLy9ub3QgdW5kZXJzdGFudCBpdAorLy9ub3QgdW5kZXJzdGFuZCBpdAogdm9pZCBQSFlfU3dDaG5sUGh5ODE5MlMoCS8vIE9ubHkgY2FsbGVkIGR1cmluZyBpbml0aWFsaXplCiAJc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKIAl1OAkJY2hhbm5lbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcGh5cmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19waHlyZWcuaAppbmRleCBhY2Y2NDRmLi4yZTRkNzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19waHlyZWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19waHlyZWcuaApAQCAtNDUzLDcgKzQ1Myw3IEBACiAjZGVmaW5lCQliUjJSQ0NBTWFzayAgICAgICAgICAgICAgIAkJCTB4MDAwMDBmMDAKICNkZWZpbmUJCWJIU1NJX1IyVERlbGF5ICAgICAgICAgICAgCQkweGY4MDAwMDAwCiAjZGVmaW5lCQliSFNTSV9UMlJEZWxheSAgICAgICAgICAgIAkJMHhmODAwMDAKLSNkZWZpbmUJCWJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkJMHg0MDAgICAgIC8vY2hhbmUgZ2FpbiBhdCBjb250aW51ZSBUeAorI2RlZmluZQkJYkNvbnRUeEhTU0kgICAgICAgICAgICAgICAJCQkweDQwMCAgICAgLy9jaGFubmVsIGdhaW4gYXQgY29udGludWUgVHgKICNkZWZpbmUJCWJJR0Zyb21DQ0sgICAgICAgICAgICAgICAgCQkJMHgyMDAKICNkZWZpbmUJCWJBR0NBZGRyZXNzICAgICAgICAgICAgICAgCQkJMHgzZgogI2RlZmluZQkJYlJ4SFBUeCAgICAgICAgICAgICAgICAgICAJCQkweDcwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3J0bDYwNTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJTX3J0bDYwNTIuYwppbmRleCA2OWVmNmRmLi4yMjM5ODA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyU19ydGw2MDUyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlNfcnRsNjA1Mi5jCkBAIC0zMjYsNyArMzI2LDcgQEAKIAogCQkvLwogCQkvLyBJZiBwYXRoIEEgYW5kIFBhdGggQiBjb2V4aXN0LCB3ZSBtdXN0IGxpbWl0IFBhdGggQSB0eCBwb3dlci4KLQkJLy8gUHJvdGVjdCBQYXRoIEIgcHdyIG92ZXIgb3IgdW5kZXIgZmxvdy4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdXBwZXIgYW5kCisJCS8vIFByb3RlY3QgUGF0aCBCIHB3ciBvdmVyIG9yIHVuZGVyZmxvdy4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdXBwZXIgYW5kCiAJCS8vIGxvd2VyIGJvdW5kIG9mIHBhdGggQSB0eCBwb3dlci4KIAkJLy8KIAkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMlQyUikKQEAgLTM1NCw3ICszNTQsNyBAQAogCiAJCQkvLwogCQkJLy8gSWYgcGF0aCBBIGFuZCBQYXRoIEIgY29leGlzdCwgd2UgbXVzdCBsaW1pdCBQYXRoIEEgdHggcG93ZXIuCi0JCQkvLyBQcm90ZWN0IFBhdGggQiBwd3Igb3ZlciBvciB1bmRlciBmbG93LiBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB1cHBlciBhbmQKKwkJCS8vIFByb3RlY3QgUGF0aCBCIHB3ciB1bmRlci9vdmVyIGZsb3cuIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHVwcGVyIGFuZAogCQkJLy8gbG93ZXIgYm91bmQgb2YgcGF0aCBBIHR4IHBvd2VyLgogCQkJLy8KIAkJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUMlIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfZG0uYwppbmRleCA1MzU4YWU4Li43ODkxZTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX2RtLmMKQEAgLTU5Myw3ICs1OTMsNyBAQAogCTB4NWE0MDAxNjksCS8vIDMsICszZGIKIAkweDUwODAwMTQyLAkvLyA0LCArMmRiCiAJMHg0N2MwMDExZiwJLy8gNSwgKzFkYgotCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXByYXR1cmUsIGxvd2VyIGZvciBsb3cgdGVtcHJhdHVyZQorCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXBlcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXBlcmF0dXJlCiAJMHgzOTAwMDBlNCwJLy8gNywgLTFkYgogCTB4MzJjMDAwY2IsCS8vIDgsIC0yZGIKIAkweDJkNDAwMGI1LAkvLyA5LCAtM2RiCkBAIC05MTIsMTQgKzkxMiwxNCBAQAogCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZWFkYmFjayBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKIAlpZih0bXBSZWdBIDwgMyB8fCB0bXBSZWdBID4gMTMpCiAJCXJldHVybjsKLQlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcHJhdHVyZQorCWlmKHRtcFJlZ0EgPj0gMTIpCS8vIGlmIG92ZXIgMTIsIFRQIHdpbGwgYmUgYmFkIHdoZW4gaGlnaCB0ZW1wZXJhdHVyZQogCQl0bXBSZWdBID0gMTI7CiAJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlZhbGlkIFRoZXJtYWxNZXRlckEgPSAlZCBcbiIsIHRtcFJlZ0EpOwogCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgogCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgogCi0JLy9HZXQgY3VycmVudCBSRi1BIHRlbXByYXR1cmUgaW5kZXgKLQlpZihwcml2LT5UaGVybWFsTWV0ZXJbMF0gPj0gKHU4KXRtcFJlZ0EpCS8vbG93ZXIgdGVtcHJhdHVyZQorCS8vR2V0IGN1cnJlbnQgUkYtQSB0ZW1wZXJhdHVyZSBpbmRleAorCWlmKHByaXYtPlRoZXJtYWxNZXRlclswXSA+PSAodTgpdG1wUmVnQSkJLy9sb3dlciB0ZW1wZXJhdHVyZQogCXsKIAkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSA2Kyhwcml2LT5UaGVybWFsTWV0ZXJbMF0tKHU4KXRtcFJlZ0EpOwogCQl0bXBDQ0s0ME1pbmRleCA9IHRtcENDSzIwTWluZGV4IC0gNjsKQEAgLTkzMyw3ICs5MzMsNyBAQAogCWVsc2UKIAl7CiAJCXRtcHZhbCA9ICgodTgpdG1wUmVnQSAtIHByaXYtPlRoZXJtYWxNZXRlclswXSk7Ci0JCWlmKHRtcHZhbCA+PSA2KQkJCQkJCQkJLy8gaGlnaGVyIHRlbXByYXR1cmUKKwkJaWYodG1wdmFsID49IDYpCQkJCQkJCQkvLyBoaWdoZXIgdGVtcGVyYXR1cmUKIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsJCS8vIG1heCB0byArNmRCCiAJCWVsc2UKIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNiAtIHRtcHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTkyVV93eC5jCmluZGV4IDIyMDhjOWIuLmE3Y2M2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyc3UvcjgxOTJVX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5MlVfd3guYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLwogCiAJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA5MjsgLyogPiA4JSBtaXNzZWQgYmVhY29ucyBpcyAnYmFkJyAqLwotCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2wgdmFsdWUgZm9yIFJTU0kgKi8KKwkvKiBUT0RPOiBGaW5kIHJlYWwgJ2dvb2QnIHRvICdiYWQnIHRocmVzaG9sZCB2YWx1ZSBmb3IgUlNTSSAqLwogCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDIwICsgLTk4OwogCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CiAJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJzdS9yODE5eFVfY21kcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTl4VV9jbWRwa3QuYwppbmRleCBlMmJhOTNlLi4zZWJmZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTl4VV9jbWRwa3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnN1L3I4MTl4VV9jbWRwa3QuYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAKIAkJCWRlZmF1bHQ6CiAKLQkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FUlIsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3cgQ01EIEVsZW1lbnRcbiIpOworCQkJICAgICAgICBSVF9UUkFDRShDT01QX0VSUiwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOnVua25vd24gQ01EIEVsZW1lbnRcbiIpOwogCQkJCXJldHVybiAxOwkvKiBUaGlzIGlzIGEgY29tbWFuZCBwYWNrZXQuICovCiAJCX0KIAkJLy8gMjAwNy8wMS8yMiBNSCBEaXNwbGF5IHJlY2VpdmVkIHJ4IGNvbW1hbmQgcGFja2V0IGluZm8uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTNhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2NvbmZpZyBSVEw4MTkyVQorCXRyaXN0YXRlICJSZWFsVGVrIFJUTDgxOTJVIFdpcmVsZXNzIExBTiBOSUMgZHJpdmVyIgorCWRlcGVuZHMgb24gUENJICYmIFdMQU4gJiYgVVNCCisJZGVwZW5kcyBvbiBXSVJFTEVTU19FWFQKKwlkZWZhdWx0IE4KKwktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1OWM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBACitOSUNfU0VMRUNUID0gUlRMODE5MlUKKworRVhUUkFfQ0ZMQUdTICs9IC1zdGQ9Z251ODkKK0VYVFJBX0NGTEFHUyArPSAtTzIKKworRVhUUkFfQ0ZMQUdTICs9IC1taGFyZC1mbG9hdCAtRENPTkZJR19GT1JDRV9IQVJEX0ZMT0FUPXkKK0VYVFJBX0NGTEFHUyArPSAtREpBQ0tTT05fTkVXXzgxODcgLURKQUNLU09OX05FV19SWAorRVhUUkFfQ0ZMQUdTICs9IC1EVEhPTUFTX0JFQUNPTiAtRFRIT01BU19UQVNLTEVUIC1EVEhPTUFTX1NLQiAtRFRIT01BU19UVVJCTworI0VYVFJBX0NGTEFHUyArPSAtRFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisjRVhUUkFfQ0ZMQUdTICs9IC1EVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKK0VYVFJBX0NGTEFHUyArPSAtRFVTRV9PTkVfUElQRQorRVhUUkFfQ0ZMQUdTICs9IC1ERU5BQkxFX0RPVDExRAorRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMQorCityODE5MnVfdXNiLW9ianMgOj0gcjgxOTJVX2NvcmUubyByODE4MF85M2N4Ni5vIHI4MTkyVV93eC5vCQlcCisJCSAgcjgxOTBfcnRsODI1Ni5vIHI4MTl4VV9waHkubyByODE5eFVfZmlybXdhcmUubwlcCisJCSAgcjgxOXhVX2NtZHBrdC5vIHI4MTkyVV9kbS5vIHI4MTl4VV9maXJtd2FyZV9pbWcubwlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5vCQkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAubwkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAubwkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5vCQkJXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfcngubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLm8JCQkJXAorCQkgIGllZWU4MDIxMS9pZWVlODAyMTFfdHgubwkJCQlcCisJCSAgaWVlZTgwMjExL2llZWU4MDIxMV93eC5vCQkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5vCQkJCVwKKwkJICBpZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3gubwkJCVwKKwkJICBpZWVlODAyMTEvcnRsODE5eF9IVFByb2MubwkJCQlcCisJCSAgaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLm8JCQkJXAorCQkgIGllZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5vCQkJCVwKKwkJICBpZWVlODAyMTEvZG90MTFkLm8KKworb2JqLSQoQ09ORklHX1JUTDgxOTJVKSArPSByODE5MnVfdXNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9hdXRob3JzIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2F1dGhvcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4YmJhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9hdXRob3JzCkBAIC0wLDAgKzEgQEAKK0FuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jaGFuZ2VzIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2NoYW5nZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjMzNmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9jaGFuZ2VzCkBAIC0wLDAgKzEsNSBAQAordiAwLjEKKworRmlyc3QgdmVyc2lvbi4KK1RoaXMgaXMgYmFzZWQgb24gdGhlIHJ0bDgxODAtc2EyNDAwIHByZS0wLjIyLUNWUyBjb2RlLi4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2NvcHlpbmcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvY29weWluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBjMzFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2NvcHlpbmcKQEAgLTAsMCArMSwzNDAgQEAKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQorCisgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyICBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2RvdDExZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjdhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvZG90MTFkLmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgX19JTkNfRE9UMTFEX0gKKyNkZWZpbmUgX19JTkNfRE9UMTFEX0gKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworLy8jZGVmaW5lIEVOQUJMRV9ET1QxMUQKKworLy8jZGVmaW5lIERPVDExRF9NQVhfQ0hOTF9OVU0gODMKKwordHlwZWRlZiBzdHJ1Y3QgX0NITkxfVFhQT1dFUl9UUklQTEUgeworCXU4IEZpcnN0Q2hubDsKKwl1OCAgTnVtQ2hubHM7CisJdTggIE1heFR4UG93ZXJJbkRibTsKK31DSE5MX1RYUE9XRVJfVFJJUExFLCAqUENITkxfVFhQT1dFUl9UUklQTEU7CisKK3R5cGVkZWYgZW51bSBfRE9UMTFEX1NUQVRFIHsKKwlET1QxMURfU1RBVEVfTk9ORSA9IDAsCisJRE9UMTFEX1NUQVRFX0xFQVJORUQsCisJRE9UMTFEX1NUQVRFX0RPTkUsCit9RE9UMTFEX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBfUlRfRE9UMTFEX0lORk8geworCS8vREVDTEFSRV9SVF9PQkpFQ1QoUlRfRE9UMTFEX0lORk8pOworCisJYm9vbCBiRW5hYmxlZDsgLy8gZG90MTFNdWx0aURvbWFpbkNhcGFiaWxpdHlFbmFibGVkCisKKwl1MTYgQ291bnRyeUllTGVuOyAvLyA+IDAgaWYgQ291bnRyeUllQnVmW10gY29udGFpbnMgdmFsaWQgY291bnRyeSBpbmZvcm1hdGlvbiBlbGVtZW50LgorCXU4ICBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07CisJdTggIENvdW50cnlJZVNyY0FkZHJbNl07IC8vIFNvdXJjZSBBUCBvZiB0aGUgY291bnRyeSBJRS4KKwl1OCAgQ291bnRyeUllV2F0Y2hkb2c7CisKKwl1OCAgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOyAgLy8hISFWYWx1ZSAwOiBJbnZhbGlkLCAxOiBWYWxpZCAoYWN0aXZlIHNjYW4pLCAyOiBWYWxpZCAocGFzc2l2ZSBzY2FuKQorCS8vdTggIENobmxMaXN0TGVuOyAvLyAjQnl0ZXMgdmFsaWQgaW4gQ2hubExpc3RbXS4KKwkvL3U4ICBDaG5sTGlzdFtET1QxMURfTUFYX0NITkxfTlVNXTsKKwl1OCAgTWF4VHhQd3JEYm1MaXN0W01BWF9DSEFOTkVMX05VTUJFUisxXTsKKworCURPVDExRF9TVEFURSBTdGF0ZTsKK31SVF9ET1QxMURfSU5GTywgKlBSVF9ET1QxMURfSU5GTzsKKyNkZWZpbmUgZXFNYWNBZGRyKGEsYikJCSggKChhKVswXT09KGIpWzBdICYmIChhKVsxXT09KGIpWzFdICYmIChhKVsyXT09KGIpWzJdICYmIChhKVszXT09KGIpWzNdICYmIChhKVs0XT09KGIpWzRdICYmIChhKVs1XT09KGIpWzVdKSA/IDE6MCApCisjZGVmaW5lIGNwTWFjQWRkcihkZXMsc3JjKQkgICAgICAoKGRlcylbMF09KHNyYylbMF0sKGRlcylbMV09KHNyYylbMV0sKGRlcylbMl09KHNyYylbMl0sKGRlcylbM109KHNyYylbM10sKGRlcylbNF09KHNyYylbNF0sKGRlcylbNV09KHNyYylbNV0pCisjZGVmaW5lIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KSAoKFBSVF9ET1QxMURfSU5GTykoKF9fcEllZWVEZXYpLT5wRG90MTFkSW5mbykpCisKKyNkZWZpbmUgSVNfRE9UMTFEX0VOQUJMRShfX3BJZWVlRGV2KSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPmJFbmFibGVkCisjZGVmaW5lIElTX0NPVU5UUllfSUVfVkFMSUQoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuID4gMCkKKworI2RlZmluZSBJU19FUVVBTF9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBlcU1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKKyNkZWZpbmUgVVBEQVRFX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIGNwTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQorCisjZGVmaW5lIElTX0NPVU5UUllfSUVfQ0hBTkdFRChfX3BJZWVlRGV2LCBfX0llKSBcCisJKCgoX19JZSkuTGVuZ3RoID09IDAgfHwgKF9fSWUpLkxlbmd0aCAhPSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbikgPyBcCisJRkFMU0UgOiBcCisJKCFtZW1jbXAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVCdWYsIChfX0llKS5PY3RldCwgKF9fSWUpLkxlbmd0aCkpKQorCisjZGVmaW5lIENJRV9XQVRDSERPR19USCAxCisjZGVmaW5lIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVXYXRjaGRvZworI2RlZmluZSBSRVNFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDAKKyNkZWZpbmUgVVBEQVRFX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSArK0dFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikKKworI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5TdGF0ZSA9PSBET1QxMURfU1RBVEVfRE9ORSkKKworCit2b2lkCitEb3QxMWRfSW5pdCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2CisJKTsKKwordm9pZAorRG90MTFkX1Jlc2V0KAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYKKwkpOworCit2b2lkCitEb3QxMWRfVXBkYXRlQ291bnRyeUllKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCisJdTggKgkJcFRhZGRyLAorCXUxNglDb3V0cnlJZUxlbiwKKwl1OCAqIHBDb3V0cnlJZQorCSk7CisKK3U4CitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAorCXU4IENoYW5uZWwKKwkpOworCit2b2lkCitET1QxMURfU2NhbkNvbXBsZXRlKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2CisJKTsKKworaW50IElzTGVnYWxDaGFubmVsKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2LAorCXU4IGNoYW5uZWwKKyk7CisKK2ludCBUb0xlZ2FsQ2hhbm5lbCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKKwl1OCBjaGFubmVsCispOworI2VuZGlmIC8vRU5BQkxFX0RPVDExRAorI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfRE9UMTFEX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ3ZjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMjYzOCBAQAorLyoKKyAqIE1lcmdlZCB3aXRoIG1haW5saW5lIGllZWU4MDIxMS5oIGluIEF1ZyAyMDA0LiAgT3JpZ2luYWwgaWVlZTgwMl8xMQorICogcmVtYWlucyBjb3B5cmlnaHQgYnkgdGhlIG9yaWdpbmFsIGF1dGhvcnMKKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgbWVyZ2VkIGNvZGUgYXJlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzCisgKiBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIgZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBNb2RpZmllZCBmb3IgUmVhbHRlaydzIHdpLWZpIGNhcmRzIGJ5IEFuZHJlYSBNZXJlbGxvCisgKiA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfSAorI2RlZmluZSBJRUVFODAyMTFfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExL3J0bDgxOXhfSFQuaCIKKyNpbmNsdWRlICJpZWVlODAyMTEvcnRsODE5eF9CQS5oIgorI2luY2x1ZGUgImllZWU4MDIxMS9ydGw4MTl4X1RTLmgiCisKKworI2lmbmRlZiBJV19NT0RFX01PTklUT1IKKyNkZWZpbmUgSVdfTU9ERV9NT05JVE9SIDYKKyNlbmRpZgorCisjaWZuZGVmIElXRVZDVVNUT00KKyNkZWZpbmUgSVdFVkNVU1RPTSAweDhjMDIKKyNlbmRpZgorCisKKyNpZm5kZWYgY29udGFpbmVyX29mCisvKioKKyAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICoKKyAqIEBwdHI6ICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCisJY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOyAgICBcCisJKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKyNlbmRpZgorCisjZGVmaW5lIEtFWV9UWVBFX05BCQkweDAKKyNkZWZpbmUgS0VZX1RZUEVfV0VQNDAgCQkweDEKKyNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCisjZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAorI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQorCisvKiBhZGRlZCBmb3IgcnRsODE5eCB0eCBwcm9jZWR1cmUgKi8KKyNkZWZpbmUgTUFYX1FVRVVFX1NJWkUJCTB4MTAKKworLy8KKy8vIDgxOTAgcXVldWUgbWFwcGluZworLy8KKyNkZWZpbmUgQktfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCRV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVk9fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBIQ0NBX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRYQ01EX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUdOVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBISUdIX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEJFQUNPTl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBMT1dfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRV9RVUVVRQorI2RlZmluZSBOT1JNQUxfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICBNR05UX1FVRVVFCisKKy8vYWRkZWQgYnkgYW15IGZvciBwcworI2RlZmluZSBTV1JGX1RJTUVPVVQJCQkJNTAKKworLy9hZGRlZCBieSBhbXkgZm9yIExFQVAgcmVsYXRlZAorI2RlZmluZSBJRV9DSVNDT19GTEFHX1BPU0lUSU9OCQkweDA4CS8vIEZsYWcgYnl0ZTogYnl0ZSA4LCBudW1iZXJlZCBmcm9tIDAuCisjZGVmaW5lIFNVUFBPUlRfQ0tJUF9NSUMJCQkweDA4CS8vIGJpdDMKKyNkZWZpbmUgU1VQUE9SVF9DS0lQX1BLCQkJMHgxMAkvLyBiaXQ0CisvKiBkZWZpbmVkIGZvciBza2IgY2IgZmllbGQgKi8KKy8qIEF0IG1vc3QgMjggYnl0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgY2JfZGVzYyB7CisJLyogVHggRGVzYyBSZWxhdGVkIGZsYWdzICg4LTkpICovCisJdTggYkxhc3RJbmlQa3Q6MTsKKwl1OCBiQ21kT3JJbml0OjE7CisJdTggYkZpcnN0U2VnOjE7CisJdTggYkxhc3RTZWc6MTsKKwl1OCBiRW5jcnlwdDoxOworCXU4IGJUeERpc2FibGVSYXRlRmFsbEJhY2s6MTsKKwl1OCBiVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU6MTsKKwl1OCBiSHdTZWM6MTsgLy9pbmRpY2F0ZSB3aGV0aGVyIHVzZSBIdyBzZWN1cml0eS4gV0IKKworCXU4IHJlc2VydmVkMTsKKworCS8qIFR4IEZpcm13YXJlIFJlbGFnZWQgZmxhZ3MgKDEwLTExKSovCisJdTggYkNUU0VuYWJsZToxOworCXU4IGJSVFNFbmFibGU6MTsKKwl1OCBiVXNlU2hvcnRHSToxOworCXU4IGJVc2VTaG9ydFByZWFtYmxlOjE7CisJdTggYlR4RW5hYmxlRndDYWxjRHVyOjE7CisJdTggYkFNUERVRW5hYmxlOjE7CisJdTggYlJUU1NUQkM6MTsKKwl1OCBSVFNTQzoxOworCisJdTggYlJUU0JXOjE7CisJdTggYlBhY2tldEJXOjE7CisJdTggYlJUU1VzZVNob3J0UHJlYW1ibGU6MTsKKwl1OCBiUlRTVXNlU2hvcnRHSToxOworCXU4IGJNdWx0aWNhc3Q6MTsKKwl1OCBiQnJvYWRjYXN0OjE7CisJLy91OCByZXNlcnZlZDI6MjsKKwl1OCBkcnZfYWdnX2VuYWJsZToxOworCXU4IHJlc2VydmVkMjoxOworCisJLyogVHggRGVzYyByZWxhdGVkIGVsZW1lbnQoMTItMTkpICovCisJdTggcmF0YV9pbmRleDsKKwl1OCBxdWV1ZV9pbmRleDsKKwkvL3U4IHJlc2VydmVkMzsKKwkvL3U4IHJlc2VydmVkNDsKKwl1MTYgdHhidWZfc2l6ZTsKKwkvL3U4IHJlc2VydmVkNTsKKwl1OCBSQVRSSW5kZXg7CisJdTggcmVzZXJ2ZWQ2OworCXU4IHJlc2VydmVkNzsKKwl1OCByZXNlcnZlZDg7CisKKwkvKiBUeCBmaXJtd2FyZSByZWxhdGVkIGVsZW1lbnQoMjAtMjcpICovCisJdTggZGF0YV9yYXRlOworCXU4IHJ0c19yYXRlOworCXU4IGFtcGR1X2ZhY3RvcjsKKwl1OCBhbXBkdV9kZW5zaXR5OworCS8vdTggcmVzZXJ2ZWQ5OworCS8vdTggcmVzZXJ2ZWQxMDsKKwkvL3U4IHJlc2VydmVkMTE7CisJdTggRHJ2QWdnck51bTsKKwl1MTYgcGt0X3NpemU7CisJdTggcmVzZXJ2ZWQxMjsKK31jYl9kZXNjLCAqcGNiX2Rlc2M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1HTl8xTSAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUdOXzJNICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNR05fNV81TSAgICAgICAgICAgICAgICAweDBiCisjZGVmaW5lIE1HTl8xMU0gICAgICAgICAgICAgICAgIDB4MTYKKworI2RlZmluZSBNR05fNk0gICAgICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIE1HTl85TSAgICAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgTUdOXzEyTSAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBNR05fMThNICAgICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIE1HTl8yNE0gICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgTUdOXzM2TSAgICAgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBNR05fNDhNICAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIE1HTl81NE0gICAgICAgICAgICAgICAgIDB4NmMKKworI2RlZmluZSBNR05fTUNTMCAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIE1HTl9NQ1MxICAgICAgICAgICAgICAgIDB4ODEKKyNkZWZpbmUgTUdOX01DUzIgICAgICAgICAgICAgICAgMHg4MgorI2RlZmluZSBNR05fTUNTMyAgICAgICAgICAgICAgICAweDgzCisjZGVmaW5lIE1HTl9NQ1M0ICAgICAgICAgICAgICAgIDB4ODQKKyNkZWZpbmUgTUdOX01DUzUgICAgICAgICAgICAgICAgMHg4NQorI2RlZmluZSBNR05fTUNTNiAgICAgICAgICAgICAgICAweDg2CisjZGVmaW5lIE1HTl9NQ1M3ICAgICAgICAgICAgICAgIDB4ODcKKyNkZWZpbmUgTUdOX01DUzggICAgICAgICAgICAgICAgMHg4OAorI2RlZmluZSBNR05fTUNTOSAgICAgICAgICAgICAgICAweDg5CisjZGVmaW5lIE1HTl9NQ1MxMCAgICAgICAgICAgICAgIDB4OGEKKyNkZWZpbmUgTUdOX01DUzExICAgICAgICAgICAgICAgMHg4YgorI2RlZmluZSBNR05fTUNTMTIgICAgICAgICAgICAgICAweDhjCisjZGVmaW5lIE1HTl9NQ1MxMyAgICAgICAgICAgICAgIDB4OGQKKyNkZWZpbmUgTUdOX01DUzE0ICAgICAgICAgICAgICAgMHg4ZQorI2RlZmluZSBNR05fTUNTMTUgICAgICAgICAgICAgICAweDhmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8JCTgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFJlYXNvbiBDb2RlIGZpZWxkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VudW0JX1JlYXNvbkNvZGV7CisJdW5zcGVjX3JlYXNvbgk9IDB4MSwKKwlhdXRoX25vdF92YWxpZAk9IDB4MiwKKwlkZWF1dGhfbHZfc3MJPSAweDMsCisJaW5hY3Rpdml0eQkJPSAweDQsCisJYXBfb3ZlcmxvYWQgCT0gMHg1LAorCWNsYXNzMl9lcnIJCT0gMHg2LAorCWNsYXNzM19lcnIJCT0gMHg3LAorCWRpc2FzX2x2X3NzIAk9IDB4OCwKKwlhc29jX25vdF9hdXRoCT0gMHg5LAorCisJLy8tLS0tTUlDX0NIRUNLCisJbWljX2ZhaWx1cmUgCT0gMHhlLAorCS8vLS0tLUVORCBNSUNfQ0hFQ0sKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gODAyLjExaSBEMTAuMCBwLjI4LgorCWludmFsaWRfSUUJCT0gMHgwZCwKKwlmb3VyX3dheV90bW91dAk9IDB4MGYsCisJdHdvX3dheV90bW91dAk9IDB4MTAsCisJSUVfZGlzbWF0Y2ggCT0gMHgxMSwKKwlpbnZhbGlkX0djaXBoZXIgPSAweDEyLAorCWludmFsaWRfUGNpcGhlciA9IDB4MTMsCisJaW52YWxpZF9BS01QCT0gMHgxNCwKKwl1bnN1cF9SU05JRXZlciA9IDB4MTUsCisJaW52YWxpZF9SU05JRQk9IDB4MTYsCisJYXV0aF84MDJfMXhfZmFpbD0gMHgxNywKKwljaXBlcl9yZWplY3QJCT0gMHgxOCwKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0xNS4KKwlRb1NfdW5zcGVjCQk9IDB4MjAsIC8vIDMyCisJUUFQX2JhbmR3aWR0aAk9IDB4MjEsIC8vIDMzCisJcG9vcl9jb25kaXRpb24JPSAweDIyLCAvLyAzNAorCW5vX2ZhY2lsaXR5IAk9IDB4MjMsIC8vIDM1CisJCQkJCQkJLy8gV2hlcmUgaXMgMzY/Pz8KKwlyZXFfZGVjbGluZWQJPSAweDI1LCAvLyAzNworCWludmFsaWRfcGFyYW0JPSAweDI2LCAvLyAzOAorCXJlcV9ub3RfaG9ub3JlZD0gMHgyNywJLy8gMzkKKwlUU19ub3RfY3JlYXRlZAk9IDB4MkYsIC8vIDQ3CisJRExfbm90X2FsbG93ZWQJPSAweDMwLCAvLyA0OAorCWRlc3Rfbm90X2V4aXN0CT0gMHgzMSwgLy8gNDkKKwlkZXN0X25vdF9RU1RBCT0gMHgzMiwgLy8gNTAKK307CisKKworCisjZGVmaW5lIGFTaWZzVGltZQkgKChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfQSl8fChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcpfHwocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fNUcpKT8gMTYgOiAxMAorCisjZGVmaW5lIE1HTVRfUVVFVUVfTlVNIDUKKworI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQorI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKKyNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0CisKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKKyNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgorI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKKyNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKKyNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1CisjZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2CisvL0l0IHNob3VsZCBjb25zaXN0ZW50IHdpdGggdGhlIGRyaXZlcl9YWFguYworLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3CisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BST1RPX1dQQQkJCQkxCisjZGVmaW5lIElFRUVfUFJPVE9fUlNOCQkJCTIKKy8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgorLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKKyNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgorI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKKyNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAorI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQorCisjZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQorI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKKworI2RlZmluZSBJRUVFX01MTUVfU1RBX0RFQVVUSAkJCTEKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQwkJCTIKKworCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHCQkyCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUREUgkJMworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRAk0CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECTYKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNworCisKKyNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgorCisjZGVmaW5lIE1BWF9JRV9MRU4gIDB4ZmYKKworLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMgCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCAJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3JzbAorI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyAgCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzIGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyAJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV9jY21wX251bGwJCWllZWU4MDIxMV9jY21wX251bGxfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3RraXBfbnVsbAkJaWVlZTgwMjExX3RraXBfbnVsbF9yc2wKKworI2RlZmluZSBpZWVlODAyMTFfd2VwX251bGwJCWllZWU4MDIxMV93ZXBfbnVsbF9yc2wKKworI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICAJZnJlZV9pZWVlODAyMTFfcnNsCisjZGVmaW5lIGFsbG9jX2llZWU4MDIxMSAgICAgICAgCQlhbGxvY19pZWVlODAyMTFfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3J4IAkJCWllZWU4MDIxMV9yeF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9yc2wKKworI2RlZmluZSBpZWVlODAyMTFfZ2V0X2JlYWNvbgkJaWVlZTgwMjExX2dldF9iZWFjb25fcnNsCisjZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlCQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUJCWllZWU4MDIxMV9zdG9wX3F1ZXVlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfcmVzZXRfcXVldWUJCWllZWU4MDIxMV9yZXNldF9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbAlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2lzX3Nob3J0c2xvdAkJaWVlZTgwMjExX2lzX3Nob3J0c2xvdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2lzXzU0ZwkJaWVlZTgwMjExX2lzXzU0Z19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsCWllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3BzX3R4X2FjawkJaWVlZTgwMjExX3BzX3R4X2Fja19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfeG1pdAkJaWVlZTgwMjExX3NvZnRtYWNfeG1pdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19yc2wKKyNkZWZpbmUgbm90aWZ5X3d4X2Fzc29jX2V2ZW50CQlub3RpZnlfd3hfYXNzb2NfZXZlbnRfcnNsCisjZGVmaW5lIFNlbmREaXNhc3NvY2lhdGlvbgkJU2VuZERpc2Fzc29jaWF0aW9uX3JzbAorI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NjYW4JCWllZWU4MDIxMV9zdG9wX3NjYW5fcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybwlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNyb19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNyb19yc2wKKworI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkCQlpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkCQlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJCWllZWU4MDIxMV93eF9zZXRfcmF0ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9yYXRlCQlpZWVlODAyMTFfd3hfZ2V0X3JhdGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfd2FwCQlpZWVlODAyMTFfd3hfc2V0X3dhcF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJCWllZWU4MDIxMV93eF9nZXRfd2FwX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21vZGUJCWllZWU4MDIxMV93eF9zZXRfbW9kZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9tb2RlCQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbgkJaWVlZTgwMjExX3d4X3NldF9zY2FuX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEJCWllZWU4MDIxMV93eF9nZXRfZnJlcV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9mcmVxCQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJCWllZWU4MDIxMV93eF9zZXRfcmF3dHhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbmFtZQkJaWVlZTgwMjExX3d4X2dldF9uYW1lX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyCQlpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCQlpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcwlpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9ydHMJCWllZWU4MDIxMV93eF9zZXRfcnRzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3J0cwkJaWVlZTgwMjExX3d4X2dldF9ydHNfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3R4Yl9mcmVlCQlpZWVlODAyMTFfdHhiX2ZyZWVfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9nZW5faWUJCWllZWU4MDIxMV93eF9zZXRfZ2VuX2llX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4JCWllZWU4MDIxMV93eF9nZXRfc2Nhbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUJCWllZWU4MDIxMV93eF9zZXRfZW5jb2RlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZQkJaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnNsCisjaWYgV0lSRUxFU1NfRVhUID49IDE4CisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbWxtZQkJaWVlZTgwMjExX3d4X3NldF9tbG1lX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2F1dGgJCWllZWU4MDIxMV93eF9zZXRfYXV0aF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0CWllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0CWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dF9yc2wKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IGllZWVfcGFyYW0geworCXUzMiBjbWQ7CisJdTggc3RhX2FkZHJbRVRIX0FMRU5dOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4IHJlc2VydmVkWzMyXTsKKwkJCXU4IGRhdGFbMF07CisJCX0gd3BhX2llOworCQlzdHJ1Y3R7CisJCQlpbnQgY29tbWFuZDsKKwkJCWludCByZWFzb25fY29kZTsKKwkJfSBtbG1lOworCQlzdHJ1Y3QgeworCQkJdTggYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXU4IHNldF90eDsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVswXTsKKwkJfSBjcnlwdDsKKwl9IHU7Cit9aWVlZV9wYXJhbTsKKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisKKy8vIGxpbnV4IHVuZGVyIDIuNi45IHJlbGVhc2UgbWF5IG5vdCBzdXBwb3J0IGl0LCBzbyBtb2RpZnkgaXQgZm9yIGNvbW1vbiB1c2UKKyNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQorI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9yc2wgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCisKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworI2RlZmluZSBJRUVFODAyMTFfMUFERFJfTEVOIDEwCisjZGVmaW5lIElFRUU4MDIxMV8yQUREUl9MRU4gMTYKKyNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKKyNkZWZpbmUgSUVFRTgwMjExX0hMRU4gICAgICAgICAgICAgICAgICAoSUVFRTgwMjExXzRBRERSX0xFTikKKyNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTiAgICAgICAgICAgICAoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCisjZGVmaW5lIElFRUU4MDIxMV9NR01UX0hEUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSM19MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4gMzAKKworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQorCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFCTB4MDBmYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9UT0RTCQkweDAxMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJPTURTCQkweDAyMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRFNUT0RTCQkweDAzMDAgLy9hZGRlZCBieSBkYXZpZAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MJMHgwNDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1JFVFJZCQkweDA4MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUE0JCTB4MTAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFREFUQQkJMHgyMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9CTE9DS0FDSyAgIDB4MDA5NAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCisKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX1NFUQkJMHhGRkYwCisKKy8qIFFPUyBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9RQ1RMX1RJRCAgICAgICAgICAgICAgMHgwMDBGCisKKyNkZWZpbmUJRkNfUU9TX0JJVAkJCQkJQklUNworI2RlZmluZSBJc0RhdGFGcmFtZShwZHUpCQkJKCAoKHBkdVswXSAmIDB4MEMpPT0weDA4KSA/IHRydWUgOiBmYWxzZSApCisjZGVmaW5lCUlzTGVnYWN5RGF0YUZyYW1lKHBkdSkJKElzRGF0YUZyYW1lKHBkdSkgJiYgKCEocGR1WzBdJkZDX1FPU19CSVQpKSApCisvL2FkZGVkIGJ5IHdiLiBJcyB0aGlzIHJpZ2h0PworI2RlZmluZSBJc1FvU0RhdGFGcmFtZShwZnJhbWUpICAoKCoodTE2KilwZnJhbWUmKElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQXxJRUVFODAyMTFfRlRZUEVfREFUQSkpID09IChJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKQorI2RlZmluZSBGcmFtZV9PcmRlcihwZnJhbWUpICAgICAoKih1MTYqKXBmcmFtZSZJRUVFODAyMTFfRkNUTF9PUkRFUikKKyNkZWZpbmUgU05fTEVTUyhhLCBiKQkJKCgoYS1iKSYweDgwMCkhPTApCisjZGVmaW5lIFNOX0VRVUFMKGEsIGIpCShhID09IGIpCisjZGVmaW5lIE1BWF9ERVZfQUREUl9TSVpFIDgKK3R5cGVkZWYgZW51bSBfQUNUX0NBVEVHT1JZeworCUFDVF9DQVRfUU9TID0gMSwKKwlBQ1RfQ0FUX0RMUyA9IDIsCisJQUNUX0NBVF9CQSAgPSAzLAorCUFDVF9DQVRfSFQgID0gNywKKwlBQ1RfQ0FUX1dNTSA9IDE3LAorfSBBQ1RfQ0FURUdPUlksICpQQUNUX0NBVEVHT1JZOworCit0eXBlZGVmIGVudW0gX1RTX0FDVElPTnsKKwlBQ1RfQUREVFNSRVEgPSAwLAorCUFDVF9BRERUU1JTUCA9IDEsCisJQUNUX0RFTFRTICAgID0gMiwKKwlBQ1RfU0NIRURVTEUgPSAzLAorfSBUU19BQ1RJT04sICpQVFNfQUNUSU9OOworCit0eXBlZGVmIGVudW0gX0JBX0FDVElPTnsKKwlBQ1RfQUREQkFSRVEgPSAwLAorCUFDVF9BRERCQVJTUCA9IDEsCisJQUNUX0RFTEJBICAgID0gMiwKK30gQkFfQUNUSU9OLCAqUEJBX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9Jbml0aWFsR2Fpbk9wVHlwZXsKKwlJR19CYWNrdXA9MCwKKwlJR19SZXN0b3JlLAorCUlHX01heAorfUluaXRpYWxHYWluT3BUeXBlOworCisvKiBkZWJ1ZyBtYWNyb3MgKi8KKyNkZWZpbmUgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKK2V4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOworI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAorICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAiIGZtdCwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisvL3diIGFkZGVkIHRvIGRlYnVnIG91dCBkYXRhIGJ1ZgorLy9pZiB5b3Ugd2FudCBwcmludCBEQVRBIGJ1ZmZlciByZWxhdGVkIEJBLCBwbGVhc2Ugc2V0IGllZWU4MDIxMV9kZWJ1Z19sZXZlbCB0byBEQVRBfEJBCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKQlcCisJZG97IGlmICgoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgPT0gKGxldmVsKSkJXAorCQl7IAlcCisJCQlpbnQgaTsJCQkJCVwKKwkJCXU4KiBwZGF0YSA9ICh1OCopIGRhdGE7CQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJXMoKVxuIiwgX19GVU5DVElPTl9fKTsJXAorCQkJZm9yKGk9MDsgaTwoaW50KShkYXRhbGVuKTsgaSsrKQkJCVwKKwkJCXsJCQkJCQlcCisJCQkJcHJpbnRrKCIlMnggIiwgcGRhdGFbaV0pOwkJXAorCQkJCWlmICgoaSsxKSUxNiA9PSAwKSBwcmludGsoIlxuIik7CVwKKwkJCX0JCQkJXAorCQkJcHJpbnRrKCJcbiIpOwkJCVwKKwkJfQkJCQkJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworLyogZGVidWcgbWFjcm9zIG5vdCBkZXBlbmRlbnQgb24gQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJRUVFODAyMTFfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElFRUU4MDIxMV94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJRUVFODAyMTFfRExfSU5GTyAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1dYICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TQ0FOICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfRExfU1RBVEUgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX01HTVQgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9GUkFHICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfRExfRUFQICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0RST1AgICAgICAgICAgKDE8PDcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RYICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SWCAgICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9IVAkJICAgKDE8PDEwKSAgLy9IVAorI2RlZmluZSBJRUVFODAyMTFfRExfQkEJCSAgICgxPDwxMSkgIC8vYmEKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RTCQkgICAoMTw8MTIpICAvL1RTCisjZGVmaW5lIElFRUU4MDIxMV9ETF9RT1MgICAgICAgICAgICgxPDwxMykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1JFT1JERVIJICAgKDE8PDE0KQorI2RlZmluZSBJRUVFODAyMTFfRExfSU9UCSAgICgxPDwxNSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lQUwkgICAoMTw8MTYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UUkFDRQkgICAoMTw8MjkpICAvL3RyYWNlIGZ1bmN0aW9uLCBuZWVkIHRvIHVzZXIgbmV0X3JhdGVsaW1pdCgpIHRvZ2V0aGVyIGluIG9yZGVyIG5vdCB0byBwcmludCB0b28gbXVjaCB0byB0aGUgc2NyZWVuCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EQVRBCSAgICgxPDwzMCkgICAvL3VzZSB0aGlzIGZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHByaW50IGRhdGEgYnVmIG91dC4KKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VSUgkgICAoMTw8MzEpICAgLy9hbHdheXMgb3BlbgorI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TVEFURShmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TVEFURSwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX01HTVQoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfTUdNVCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0ZSQUcoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRlJBRywgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0VBUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FQVAsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EUk9QKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0RST1AsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19UWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1JYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUU9TKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1FPUywgZiwgIyMgYSkKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKy8qIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTIyLiAqLworI2RlZmluZSBNQVhfU1RSX0xFTiAgICAgNjQKKy8qIEkgd2FudCB0byBzZWUgQVNDSUkgMzMgdG8gMTI2IG9ubHkuIE90aGVyd2lzZSwgSSBwcmludCAnPycuIEFubmllLCAyMDA1LTExLTIyLiovCisjZGVmaW5lIFBSSU5UQUJMRShfY2gpICAoX2NoPichJyAmJiBfY2g8J34nKQorI2RlZmluZSBJRUVFODAyMTFfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCQlpZigoX0NvbXApICYgbGV2ZWwpICAgCQkJCQkJCVwKKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlpbnQgICAgICAgICAgICAgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXU4ICBidWZmZXJbTUFYX1NUUl9MRU5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCQkJaW50IGxlbmd0aCA9IChfTGVuPE1BWF9TVFJfTEVOKT8gX0xlbiA6IChNQVhfU1RSX0xFTi0xKSA7ICAJXAorCQkJCW1lbXNldChidWZmZXIsIDAsIE1BWF9TVFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgCQlcCisJCQkJbWVtY3B5KGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoICk7ICAgICAgICAgICAgCQlcCisJCQkJZm9yKCBfX2k9MDsgX19pPE1BWF9TVFJfTEVOOyBfX2krKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgaWYoICFQUklOVEFCTEUoYnVmZmVyW19faV0pICkgICBidWZmZXJbX19pXSA9ICc/JzsgICAgIAlcCisJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlidWZmZXJbbGVuZ3RoXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXByaW50aygiUnRsODE5eDogIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJCXByaW50ayhfVGl0bGVTdHJpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXByaW50aygiOiAlZCwgPCVzPlxuIiwgX0xlbiwgYnVmZmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJfQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisJdTggICAgZHNhcDsgICAvKiBhbHdheXMgMHhBQSAqLworCXU4ICAgIHNzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisJdTggICAgb3VpW1A4MDIxMV9PVUlfTEVOXTsgICAgLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFNOQVBfU0laRSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcikKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9WRVJTKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQorCisjZGVmaW5lIFdMQU5fRkNfR0VUX0ZSQU1FVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GUkFNRVRZUEUpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkFHKHNlcSkgKChzZXEpICYgSUVFRTgwMjExX1NDVExfRlJBRykKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUShzZXEpICAoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFdMQU5fQVVUSF9PUEVOIDAKKyNkZWZpbmUgV0xBTl9BVVRIX1NIQVJFRF9LRVkgMQorI2RlZmluZSBXTEFOX0FVVEhfTEVBUCAyCisKKyNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4CisKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0JTUyAoMTw8MCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lCU1MgKDE8PDEpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAoMTw8MikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVCAoMTw8MykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKDE8PDQpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSAoMTw8NSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BCQ0MgKDE8PDYpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DSEFOTkVMX0FHSUxJVFkgKDE8PDcpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TUEVDVFJVTV9NR01UICgxPDw4KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUU9TICgxPDw5KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCAoMTw8MTApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9EU1NTX09GRE0gKDE8PDEzKQorCisvKiA4MDIuMTFnIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisjZGVmaW5lIFdMQU5fRVJQX05PTl9FUlBfUFJFU0VOVCAoMTw8MCkKKyNkZWZpbmUgV0xBTl9FUlBfVVNFX1BST1RFQ1RJT04gKDE8PDEpCisjZGVmaW5lIFdMQU5fRVJQX0JBUktFUl9QUkVBTUJMRSAoMTw8MikKKworLyogU3RhdHVzIGNvZGVzICovCitlbnVtIGllZWU4MDIxMV9zdGF0dXNjb2RlIHsKKwlXTEFOX1NUQVRVU19TVUNDRVNTID0gMCwKKwlXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFID0gMSwKKwlXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEID0gMTAsCisJV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyA9IDExLAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9VTlNQRUMgPSAxMiwKKwlXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHID0gMTMsCisJV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OID0gMTQsCisJV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUwgPSAxNSwKKwlXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgPSAxNiwKKwlXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgPSAxNywKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfUkFURVMgPSAxOCwKKwkvKiA4MDIuMTFiICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRQUkVBTUJMRSA9IDE5LAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgPSAyMCwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9BR0lMSVRZID0gMjEsCisJLyogODAyLjExaCAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NQRUNUUlVNID0gMjIsCisJV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1BPV0VSID0gMjMsCisJV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1NVUFBfQ0hBTiA9IDI0LAorCS8qIDgwMi4xMWcgKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVFRJTUUgPSAyNSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9EU1NTT0ZETSA9IDI2LAorCS8qIDgwMi4xMWkgKi8KKwlXTEFOX1NUQVRVU19JTlZBTElEX0lFID0gNDAsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9HUk9VUF9DSVBIRVIgPSA0MSwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUiA9IDQyLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfQUtNUCA9IDQzLAorCVdMQU5fU1RBVFVTX1VOU1VQUF9SU05fVkVSU0lPTiA9IDQ0LAorCVdMQU5fU1RBVFVTX0lOVkFMSURfUlNOX0lFX0NBUCA9IDQ1LAorCVdMQU5fU1RBVFVTX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCA9IDQ2LAorfTsKKworLyogUmVhc29uIGNvZGVzICovCitlbnVtIGllZWU4MDIxMV9yZWFzb25jb2RlIHsKKwlXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCA9IDEsCisJV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCA9IDIsCisJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgPSAzLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZID0gNCwKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZID0gNSwKKwlXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA9IDYsCisJV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBID0gNywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgPSA4LAorCVdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIID0gOSwKKwkvKiA4MDIuMTFoICovCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1BPV0VSID0gMTAsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1NVUFBfQ0hBTiA9IDExLAorCS8qIDgwMi4xMWkgKi8KKwlXTEFOX1JFQVNPTl9JTlZBTElEX0lFID0gMTMsCisJV0xBTl9SRUFTT05fTUlDX0ZBSUxVUkUgPSAxNCwKKwlXTEFOX1JFQVNPTl80V0FZX0hBTkRTSEFLRV9USU1FT1VUID0gMTUsCisJV0xBTl9SRUFTT05fR1JPVVBfS0VZX0hBTkRTSEFLRV9USU1FT1VUID0gMTYsCisJV0xBTl9SRUFTT05fSUVfRElGRkVSRU5UID0gMTcsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9HUk9VUF9DSVBIRVIgPSAxOCwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1BBSVJXSVNFX0NJUEhFUiA9IDE5LAorCVdMQU5fUkVBU09OX0lOVkFMSURfQUtNUCA9IDIwLAorCVdMQU5fUkVBU09OX1VOU1VQUF9SU05fVkVSU0lPTiA9IDIxLAorCVdMQU5fUkVBU09OX0lOVkFMSURfUlNOX0lFX0NBUCA9IDIyLAorCVdMQU5fUkVBU09OX0lFRUU4MDIxWF9GQUlMRUQgPSAyMywKKwlXTEFOX1JFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSAyNCwKK307CisKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1NJR05BTCAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1JTU0kgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1JBVEUgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19XRU1BU0sgMHg3CisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTiAgCQk0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIJCQkweDAyCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUIJCQkweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCQkweDBCCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CCQkJMHgxNgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiAJCTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV82TUIJCQkweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkJMHgxMgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIJCTB4MTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CCQkweDI0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQgkJMHgzMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIJCTB4NDgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CCQkweDYwCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgkJMHg2QworI2RlZmluZSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCQkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSwkJMHgwMDAwMDAwRgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0JBU0lDX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMk1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURVNfTUFTSwkJMHgwMDAwMEZGMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSyAgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1JBVEVTX01BU0sgKElFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyB8IFwKKwkJCQlJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSykKKworI2RlZmluZSBJRUVFODAyMTFfTlVNX09GRE1fUkFURVMJICAgIDgKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9DQ0tfUkFURVMJCSAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisvKiB0aGlzIGlzIHN0b2xlbiBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgbWFkd2lmaSBkcml2ZXIqLworI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSwkJMHgwYworI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfREFUQQkJMHgwOAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSwkweEIwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykgXAorCSgoKGZjKSAmIChJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKSkgPT0gXAorCSAoSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkKKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciAqLworI2RlZmluZSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRSAzMQorc3RydWN0IGllZWVfaWJzc19zZXEgeworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IHNlcV9udW1bMTddOworCXUxNiBmcmFnX251bVsxN107CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZVsxN107CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU2NCB0c2Y7CisJdTMyIGJlYWNvbl90aW1lOworCXU4IG5pY190eXBlOworCXUxNiAgICAgICBMZW5ndGg7CisJLy8gICAgICB1OCAgICAgICAgRGF0YVJhdGU7ICAgICAgLy8gSW4gMC41IE1icHMKKwl1OCAgICAgICAgU2lnbmFsUXVhbGl0eTsgLy8gaW4gMC0xMDAgaW5kZXguCisJczMyICAgICAgIFJlY3ZTaWduYWxQb3dlcjsgLy8gUmVhbCBwb3dlciBpbiBkQm0gZm9yIHRoaXMgcGFja2V0LCBubyBiZWF1dGlmaWNhdGlvbiBhbmQgYWdncmVnYXRpb24uCisJczggICAgICAgIFJ4UG93ZXI7IC8vIGluIGRCbSBUcmFuc2xhdGUgZnJvbSBQV2RCCisJdTggICAgICAgIFNpZ25hbFN0cmVuZ3RoOyAvLyBpbiAwLTEwMCBpbmRleC4KKwl1MTYgICAgICAgYkh3RXJyb3I6MTsKKwl1MTYgICAgICAgYkNSQzoxOworCXUxNiAgICAgICBiSUNWOjE7CisJdTE2ICAgICAgIGJTaG9ydFByZWFtYmxlOjE7CisJdTE2ICAgICAgIEFudGVubmE6MTsgICAgICAvL2ZvciBydGw4MTg1CisJdTE2ICAgICAgIERlY3J5cHRlZDoxOyAgICAvL2ZvciBydGw4MTg1LCBydGw4MTg3CisJdTE2ICAgICAgIFdha2V1cDoxOyAgICAgICAvL2ZvciBydGw4MTg1CisJdTE2ICAgICAgIFJlc2VydmVkMDoxOyAgICAvL2ZvciBydGw4MTg1CisJdTggICAgICAgIEFHQzsKKwl1MzIgICAgICAgVGltZVN0YW1wTG93OworCXUzMiAgICAgICBUaW1lU3RhbXBIaWdoOworCWJvb2wgICAgICBiU2hpZnQ7CisJYm9vbCAgICAgIGJJc1Fvc0RhdGE7ICAgICAgICAgICAgIC8vIEFkZGVkIGJ5IEFubmllLCAyMDA1LTEyLTIyLgorCXU4ICAgICAgICBVc2VyUHJpb3JpdHk7CisKKwkvLzEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKwkvLzFBdHRlbnRpb24gUGxlYXNlISEhPDExbiBvciA4MTkwIHNwZWNpZmljIGNvZGUgc2hvdWxkIGJlIHB1dCBiZWxvdyB0aGlzIGxpbmU+CisJLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKwl1OCAgICAgICAgUnhEcnZJbmZvU2l6ZTsKKwl1OCAgICAgICAgUnhCdWZTaGlmdDsKKwlib29sICAgICAgYklzQU1QRFU7CisJYm9vbCAgICAgIGJGaXJzdE1QRFU7CisJYm9vbCAgICAgIGJDb250YWluSFRDOworCWJvb2wgICAgICBSeElzNDBNSHpQYWNrZXQ7CisJdTMyICAgICAgIFJ4UFdEQkFsbDsKKwl1OCAgICAgICAgUnhNSU1PU2lnbmFsU3RyZW5ndGhbNF07ICAgICAgICAvLyBpbiAwfjEwMCBpbmRleAorCXM4ICAgICAgICBSeE1JTU9TaWduYWxRdWFsaXR5WzJdOworCWJvb2wgICAgICBiUGFja2V0TWF0Y2hCU1NJRDsKKwlib29sICAgICAgYklzQ0NLOworCWJvb2wgICAgICBiUGFja2V0VG9TZWxmOworCS8vYWRkZWQgYnkgYW15CisJdTgqICAgICAgIHZpcnR1YWxfYWRkcmVzczsKKwl1MTYgICAgICAgICAgcGFja2V0bGVuZ3RoOyAgICAgICAgICAgICAgLy8gVG90YWwgcGFja2V0IGxlbmd0aDogTXVzdCBlcXVhbCB0byBzdW0gb2YgYWxsIEZyYWdMZW5ndGgKKwl1MTYgICAgICAgICAgZnJhZ2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGcmFnTGVuZ3RoIHNob3VsZCBlcXVhbCB0byBQYWNrZXRMZW5ndGggaW4gbm9uLWZyYWdtZW50IGNhc2UKKwl1MTYgICAgICAgICAgZnJhZ29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG9mZnNldCBmb3IgdGhpcyBmcmFnbWVudAorCXUxNiAgICAgICAgICBudG90YWxmcmFnOworCWJvb2wgICAgICAJICBiaXNyeGFnZ3JzdWJmcmFtZTsKKwlib29sCQkgIGJQYWNrZXRCZWFjb247CS8vY29zYSBhZGQgZm9yIHJzc2kKKwlib29sCQkgIGJUb1NlbGZCQTsJCS8vY29zYSBhZGQgZm9yIHJzc2kKKwljaGFyIAkgIGNja19hZGNfcHdkYls0XTsJLy9jb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24KKwl1MTYJCSAgU2VxX051bTsKKworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisjZGVmaW5lIFNFQ19FTkNSWVBUICAgICAgICgxPDw5KQorCisjZGVmaW5lIFNFQ19MRVZFTF8wICAgICAgMCAvKiBOb25lICovCisjZGVmaW5lIFNFQ19MRVZFTF8xICAgICAgMSAvKiBXRVAgNDAgYW5kIDEwNCBiaXQgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzIgICAgICAyIC8qIExldmVsIDEgKyBUS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8yX0NLSVAgMyAvKiBMZXZlbCAxICsgQ0tJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMyAgICAgIDQgLyogTGV2ZWwgMiArIENDTVAgKi8KKworI2RlZmluZSBTRUNfQUxHX05PTkUgICAgICAgICAgICAwCisjZGVmaW5lIFNFQ19BTEdfV0VQICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0VDX0FMR19US0lQICAgICAgICAgICAgMgorI2RlZmluZSBTRUNfQUxHX0NDTVAgICAgICAgICAgICAzCisKKyNkZWZpbmUgV0VQX0tFWVMgCQk0CisjZGVmaW5lIFdFUF9LRVlfTEVOCQkxMworI2RlZmluZSBTQ01fS0VZX0xFTiAgICAgICAgICAgICAzMgorI2RlZmluZSBTQ01fVEVNUE9SQUxfS0VZX0xFTkdUSCAxNgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorCSAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorCSAgICBhdXRoX2FsZ286NCwKKwkgICAgdW5pY2FzdF91c2VzX2dyb3VwOjEsCisJICAgIGVuY3J5cHQ6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1NDTV9LRVlfTEVOXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIGZyYW1lICB8ICBmY3MgfAorICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisqLworCisvKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KK2VudW0gaWVlZTgwMjExX21maWUgeworCU1GSUVfVFlQRV9TU0lEID0gMCwKKwlNRklFX1RZUEVfUkFURVMgPSAxLAorCU1GSUVfVFlQRV9GSF9TRVQgPSAyLAorCU1GSUVfVFlQRV9EU19TRVQgPSAzLAorCU1GSUVfVFlQRV9DRl9TRVQgPSA0LAorCU1GSUVfVFlQRV9USU0gPSA1LAorCU1GSUVfVFlQRV9JQlNTX1NFVCA9IDYsCisJTUZJRV9UWVBFX0NPVU5UUlkgPSA3LAorCU1GSUVfVFlQRV9IT1BfUEFSQU1TID0gOCwKKwlNRklFX1RZUEVfSE9QX1RBQkxFID0gOSwKKwlNRklFX1RZUEVfUkVRVUVTVCA9IDEwLAorCU1GSUVfVFlQRV9DSEFMTEVOR0UgPSAxNiwKKwlNRklFX1RZUEVfUE9XRVJfQ09OU1RSQUlOVCA9IDMyLAorCU1GSUVfVFlQRV9QT1dFUl9DQVBBQklMSVRZID0gMzMsCisJTUZJRV9UWVBFX1RQQ19SRVFVRVNUID0gMzQsCisJTUZJRV9UWVBFX1RQQ19SRVBPUlQgPSAzNSwKKwlNRklFX1RZUEVfU1VQUF9DSEFOTkVMUyA9IDM2LAorCU1GSUVfVFlQRV9DU0EgPSAzNywKKwlNRklFX1RZUEVfTUVBU1VSRV9SRVFVRVNUID0gMzgsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVQT1JUID0gMzksCisJTUZJRV9UWVBFX1FVSUVUID0gNDAsCisJTUZJRV9UWVBFX0lCU1NfREZTID0gNDEsCisJTUZJRV9UWVBFX0VSUCA9IDQyLAorCU1GSUVfVFlQRV9SU04gPSA0OCwKKwlNRklFX1RZUEVfUkFURVNfRVggPSA1MCwKKwlNRklFX1RZUEVfSFRfQ0FQPSA0NSwKKwkgTUZJRV9UWVBFX0hUX0lORk89IDYxLAorCSBNRklFX1RZUEVfQUlST05FVD0xMzMsCisJTUZJRV9UWVBFX0dFTkVSSUMgPSAyMjEsCisJTUZJRV9UWVBFX1FPU19QQVJBTUVURVIgPSAyMjIsCit9OworCisvKiBNaW5pbWFsIGhlYWRlcjsgY2FuIGJlIHVzZWQgZm9yIHBhc3NpbmcgODAyLjExIGZyYW1lcyB3aXRoIHN1ZmZpY2llbnQKKyAqIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdW5kZXJseWluZyBkYXRhIHR5cGUgaXMgYWN0dWFsbHkKKyAqIHN0b3JlZCBpbiB0aGUgZGF0YS4gKi8KK3N0cnVjdCBpZWVlODAyMTFfaGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwlfX2xlMTYgc2VxX2N0bDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwlfX2xlMTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKKwlfX2xlMTYgcW9zX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07CisJX19sZTE2IHFvc19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgeworCXU4IGlkOworCXU4IGxlbjsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgYWxnb3JpdGhtOworCV9fbGUxNiB0cmFuc2FjdGlvbjsKKwlfX2xlMTYgc3RhdHVzOworCS8qY2hhbGxlbmdlKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiByZWFzb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwlfX2xlMTYgYmVhY29uX2ludGVydmFsOworCV9fbGUxNiBjYXBhYmlsaXR5OworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgRkggcGFyYW1zLCBEUyBwYXJhbXMsCisJICogQ0YgcGFyYW1zLCBJQlNTIHBhcmFtcywgVElNIChpZiBiZWFjb24pLCBSU04gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQWxpYXMgYmVhY29uIGZvciBwcm9iZV9yZXNwb25zZSAqLworI2RlZmluZSBpZWVlODAyMTFfYmVhY29uIGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZQorCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwlfX2xlMTYgbGlzdGVuX2ludGVydmFsOworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgUlNOICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcmVhc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IHN0YXR1czsKKwlfX2xlMTYgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsgLyogc3VwcG9ydGVkIHJhdGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1OCBxdWV1ZV9pbmRleDsKKwl1OCBydHNfaW5jbHVkZWQ7CisJdTE2IHJlc2VydmVkOworCV9fbGUxNiBmcmFnX3NpemU7CisJX19sZTE2IHBheWxvYWRfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ21lbnRzWzBdOworfTsKKworI2RlZmluZSBNQVhfVFhfQUdHX0NPVU5UCQkgIDE2CitzdHJ1Y3QgaWVlZTgwMjExX2Rydl9hZ2dfdHhiIHsKKwl1OCBucl9kcnZfYWdnX2ZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfYWdnX2ZyYW1lc1tNQVhfVFhfQUdHX0NPVU5UXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBNQVhfU1VCRlJBTUVfQ09VTlQgCQkgIDY0CitzdHJ1Y3QgaWVlZTgwMjExX3J4YiB7CisJdTggbnJfc3ViZnJhbWVzOworCXN0cnVjdCBza19idWZmICpzdWJmcmFtZXNbTUFYX1NVQkZSQU1FX0NPVU5UXTsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgdW5pb24gX2ZyYW1lcW9zIHsKKwl1MTYgc2hvcnRkYXRhOworCXU4ICBjaGFyZGF0YVsyXTsKKwlzdHJ1Y3QgeworCQl1MTYgdGlkOjQ7CisJCXUxNiBlb3NwOjE7CisJCXUxNiBhY2tfcG9saWN5OjI7CisJCXUxNiByZXNlcnZlZDoxOworCQl1MTYgdHhvcDo4OworCX1maWVsZDsKK31mcmFtZXFvcywqcGZyYW1lcW9zOworCisvKiBTV0VFUCBUQUJMRSBFTlRSSUVTIE5VTUJFUiovCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFUwkJICA0MgorI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVNfUEVSX1BBQ0tFVCAgNworLyogTUFYX1JBVEVTX0xFTkdUSCBuZWVkcyB0byBiZSAxMi4gIFRoZSBzcGVjIHNheXMgOCwgYW5kIG1hbnkgQVBzCisgKiBvbmx5IHVzZSA4LCBhbmQgdGhlbiB1c2UgZXh0ZW5kZWQgcmF0ZXMgZm9yIHRoZSByZW1haW5pbmcgc3VwcG9ydGVkCisgKiByYXRlcy4gIE90aGVyIEFQcywgaG93ZXZlciwgc3RpY2sgYWxsIG9mIHRoZWlyIHN1cHBvcnRlZCByYXRlcyBvbiB0aGUKKyAqIG1haW4gcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudC4uLiAqLworI2RlZmluZSBNQVhfUkFURVNfTEVOR1RIICAgICAgICAgICAgICAgICAgKCh1OCkxMikKKyNkZWZpbmUgTUFYX1JBVEVTX0VYX0xFTkdUSCAgICAgICAgICAgICAgICgodTgpMTYpCisjZGVmaW5lIE1BWF9ORVRXT1JLX0NPVU5UICAgICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTUFYX0NIQU5ORUxfTlVNQkVSICAgICAgICAgICAgICAgICAxNjEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FCSAgIDEwMAorLy8oSFogLyAyKQorI2RlZmluZSBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FIChIWiAqIDIpCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAgICAgICAgICAgICAgICAgNFUKKworI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorCisjZGVmaW5lIE5FVFdPUktfRU1QVFlfRVNTSUQgKDE8PDApCisjZGVmaW5lIE5FVFdPUktfSEFTX09GRE0gICAgKDE8PDEpCisjZGVmaW5lIE5FVFdPUktfSEFTX0NDSyAgICAgKDE8PDIpCisKKy8qIFFvUyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlMgICAgICAoMTw8MykKKyNkZWZpbmUgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OICAgICAoMTw8NCkKKyNkZWZpbmUgTkVUV09SS19IQVNfUU9TX01BU0sgICAgICAgICAgICAoTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlMgfCBcCisJCQkJCSBORVRXT1JLX0hBU19RT1NfSU5GT1JNQVRJT04pCisvKiA4MDIuMTFoICovCisjZGVmaW5lIE5FVFdPUktfSEFTX1BPV0VSX0NPTlNUUkFJTlQgICAgKDE8PDUpCisjZGVmaW5lIE5FVFdPUktfSEFTX0NTQSAgICAgICAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FVSUVUICAgICAgICAgICAgICAgKDE8PDcpCisjZGVmaW5lIE5FVFdPUktfSEFTX0lCU1NfREZTICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIE5FVFdPUktfSEFTX1RQQ19SRVBPUlQgICAgICAgICAgKDE8PDkpCisKKyNkZWZpbmUgTkVUV09SS19IQVNfRVJQX1ZBTFVFICAgICAgICAgICAoMTw8MTApCisKKyNkZWZpbmUgUU9TX1FVRVVFX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFFPU19PVUlfTEVOICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBRT1NfT1VJX1RZUEUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUU9TX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgUU9TX09VSV9JTkZPX1NVQl9UWVBFICAgICAgICAgICAwCisjZGVmaW5lIFFPU19PVUlfUEFSQU1fU1VCX1RZUEUgICAgICAgICAgMQorI2RlZmluZSBRT1NfVkVSU0lPTl8xICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUU9TX0FJRlNOX01JTl9WQUxVRSAgICAgICAgICAgICAyCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50IHsKKwl1OCBlbGVtZW50SUQ7CisJdTggbGVuZ3RoOworCXU4IHF1aVtRT1NfT1VJX0xFTl07CisJdTggcXVpX3R5cGU7CisJdTggcXVpX3N1YnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCBhY19pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciB7CisJdTggYWNpX2FpZnNuOworCXU4IGVjd19taW5fbWF4OworCV9fbGUxNiB0eF9vcF9saW1pdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbyB7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCBpbmZvX2VsZW1lbnQ7CisJdTggcmVzZXJ2ZWQ7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyIGFjX3BhcmFtc19yZWNvcmRbUU9TX1FVRVVFX05VTV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyB7CisJX19sZTE2IGN3X21pbltRT1NfUVVFVUVfTlVNXTsKKwlfX2xlMTYgY3dfbWF4W1FPU19RVUVVRV9OVU1dOworCXU4IGFpZnNbUU9TX1FVRVVFX05VTV07CisJdTggZmxhZ1tRT1NfUVVFVUVfTlVNXTsKKwlfX2xlMTYgdHhfb3BfbGltaXRbUU9TX1FVRVVFX05VTV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSB7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOworCWludCBhY3RpdmU7CisJaW50IHN1cHBvcnRlZDsKKwl1OCBwYXJhbV9jb3VudDsKKwl1OCBvbGRfcGFyYW1fY291bnQ7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzIHsKKwl1OCB0aW1fY291bnQ7CisJdTggdGltX3BlcmlvZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvLyNlbHNlCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CitlbnVtIGVhcF90eXBlIHsKKwlFQVBfUEFDS0VUID0gMCwKKwlFQVBPTF9TVEFSVCwKKwlFQVBPTF9MT0dPRkYsCisJRUFQT0xfS0VZLAorCUVBUE9MX0VOQ0FQX0FTRl9BTEVSVAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVhcF90eXBlc1tdID0geworCVtFQVBfUEFDS0VUXQkJPSAiRUFQLVBhY2tldCIsCisJW0VBUE9MX1NUQVJUXQkJPSAiRUFQT0wtU3RhcnQiLAorCVtFQVBPTF9MT0dPRkZdCQk9ICJFQVBPTC1Mb2dvZmYiLAorCVtFQVBPTF9LRVldCQk9ICJFQVBPTC1LZXkiLAorCVtFQVBPTF9FTkNBUF9BU0ZfQUxFUlRdCT0gIkVBUE9MLUVuY2FwLUFTRi1BbGVydCIKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWFwX2dldF90eXBlKGludCB0eXBlKQoreworCXJldHVybiAoKHUzMil0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Cit9CisvL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgorc3RhdGljIGlubGluZSB1OCBGcmFtZV9Rb1NUSUQodTgqIGJ1ZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOworCXUxNiBmYzsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWY7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJcmV0dXJuICh1OCkoKGZyYW1lcW9zKikoYnVmICsgKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSYmKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSk/IDMwIDogMjQpKSktPmZpZWxkLnRpZDsKK30KKworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKworc3RydWN0IGVhcG9sIHsKKwl1OCBzbmFwWzZdOworCXUxNiBldGhlcnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCB0eXBlOworCXUxNiBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzeworCXVuc2lnbmVkIGludCByeF9hc3Nfb2s7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19lcnI7CisJdW5zaWduZWQgaW50IHJ4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9yczsKKwl1bnNpZ25lZCBpbnQgdHhfYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19lcnI7CisJdW5zaWduZWQgaW50IHR4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IG5vX2F1dGhfcnM7CisJdW5zaWduZWQgaW50IG5vX2Fzc19yczsKKwl1bnNpZ25lZCBpbnQgdHhfYXNzX3JxOworCXVuc2lnbmVkIGludCByeF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCByZWFzc29jOworCXVuc2lnbmVkIGludCBzd3R4c3RvcDsKKwl1bnNpZ25lZCBpbnQgc3d0eGF3YWtlOworCXVuc2lnbmVkIGNoYXIgQ3VycmVudFNob3dUeGF0ZTsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfcGFja2V0X3JhdGU7CisJdW5zaWduZWQgaW50IHR4cmV0cnljb3VudDsKK307CisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIHsKKwl1OCBpZDsKKwl1OCBsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDIgLy8xTWJwcworCitlbnVtIHtXTU1fYWxsX2ZyYW1lLCBXTU1fdHdvX2ZyYW1lLCBXTU1fZm91cl9mcmFtZSwgV01NX3NpeF9mcmFtZX07CisjZGVmaW5lIE1BWF9TUF9MZW4gIChXTU1fYWxsX2ZyYW1lIDw8IDQpCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfVElEIDB4MGYKKyNkZWZpbmUgUU9TX0NUTF9OT1RDT05UQUlOX0FDSyAoMHgwMSA8PCA1KQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorCisvL2FkZGVkIGJ5IERhdmlkIGZvciBRb1MgMjAwNi82LzMwCisvLyNkZWZpbmUgV01NX0hhbmdfODE4NworI2lmZGVmIFdNTV9IYW5nXzgxODcKKyN1bmRlZiBXTU1fSGFuZ184MTg3CisjZW5kaWYKKworI2RlZmluZSBXTUVfQUNfQksgICAweDAwCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDEKKyNkZWZpbmUgV01FX0FDX1ZJICAgMHgwMgorI2RlZmluZSBXTUVfQUNfVk8gICAweDAzCisjZGVmaW5lIFdNRV9BQ0lfTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BSUZTTl9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FDX1BSQU1fTEVOIDE2CisKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMAorCisvL1VQIE1hcHBpbmcgdG8gQUMsIHVzaW5nIGluIE1nbnRRdWVyeV9TZXF1ZW5jZU51bWJlcigpIGFuZCBtYXliZSBmb3IgRFNDUAorLy8jZGVmaW5lIFVQMkFDKHVwKQkoKHVwPDMpID8gKCh1cD09MCk/MTowKSA6ICh1cD4+MSkpCisjZGVmaW5lIFVQMkFDKHVwKSAoCQkgICBcCisJKCh1cCkgPCAxKSA/IFdNRV9BQ19CRSA6IFwKKwkoKHVwKSA8IDMpID8gV01FX0FDX0JLIDogXAorCSgodXApIDwgNCkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCA2KSA/IFdNRV9BQ19WSSA6IFwKKwlXTUVfQUNfVk8pCisvL0FDIE1hcHBpbmcgdG8gVVAsIHVzaW5nIGluIFR4IHBhcnQgZm9yIHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBUWCBxdWV1ZQorI2RlZmluZSBBQzJVUChfYWMpCSggICAgICAgXAorCSgoX2FjKSA9PSBXTUVfQUNfVk8pID8gNiA6IFwKKwkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IDUgOiBcCisJKChfYWMpID09IFdNRV9BQ19CSykgPyAxIDogXAorCTApCisKKyNkZWZpbmUJRVRIRVJfQUREUl9MRU4JCTYJLyogbGVuZ3RoIG9mIGFuIEV0aGVybmV0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUgICAgMTQgICAgICAvKiBsZW5ndGggb2YgdHdvIEV0aGVybmV0IGFkZHJlc3MgcGx1cyBldGhlciB0eXBlKi8KKworc3RydWN0CWV0aGVyX2hlYWRlciB7CisJdTggZXRoZXJfZGhvc3RbRVRIRVJfQUREUl9MRU5dOworCXU4IGV0aGVyX3Nob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1MTYgZXRoZXJfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNpZm5kZWYgRVRIRVJUWVBFX1BBRQorI2RlZmluZQlFVEhFUlRZUEVfUEFFCTB4ODg4ZQkJLyogRUFQT0wgUEFFLzgwMi4xeCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUAorI2RlZmluZQlFVEhFUlRZUEVfSVAJMHgwODAwCQkvKiBJUCBwcm90b2NvbCAqLworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9ic3NfaHR7CisKKwlib29sCQkJCXN1cHBvcnRfaHQ7CisKKwkvLyBIVCByZWxhdGVkIGVsZW1lbnRzCisJdTgJCQkJCWh0X2NhcF9idWZbMzJdOworCXUxNgkJCQkJaHRfY2FwX2xlbjsKKwl1OAkJCQkJaHRfaW5mb19idWZbMzJdOworCXUxNgkJCQkJaHRfaW5mb19sZW47CisKKwlIVF9TUEVDX1ZFUgkJCWh0X3NwZWNfdmVyOworCS8vSFRfQ0FQQUJJTElUWV9FTEUJCQliZEhUQ2FwRWxlOworCS8vSFRfSU5GT1JNQVRJT05fRUxFCQliZEhUSW5mb0VsZTsKKworCWJvb2wJCQkJYWdncmVnYXRpb247CisJYm9vbAkJCQlsb25nX3Nsb3RfdGltZTsKK31ic3NfaHQsICpwYnNzX2h0OworCit0eXBlZGVmIGVudW0gX2VycF90eworCUVSUF9Ob25FUlBwcmVzZW50CT0gMHgwMSwKKwlFUlBfVXNlUHJvdGVjdGlvbgk9IDB4MDIsCisJRVJQX0JhcmtlclByZWFtYmxlTW9kZSA9IDB4MDQsCit9IGVycF90OworCisKK3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayB7CisJLyogVGhlc2UgZW50cmllcyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIHVuaXF1ZSBuZXR3b3JrICovCisJdTggYnNzaWRbRVRIX0FMRU5dOworCXU4IGNoYW5uZWw7CisJLyogRW5zdXJlIG51bGwtdGVybWluYXRlZCBmb3IgYW55IGRlYnVnIG1zZ3MgKi8KKwl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJdTggc3NpZF9sZW47CisJc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSBxb3NfZGF0YTsKKwkvL2FkZGVkIGJ5IGFteSBmb3IgTEVBUAorCWJvb2wJYldpdGhBaXJvbmV0SUU7CisJYm9vbAliQ2tpcFN1cHBvcnRlZDsKKwlib29sCWJDY3hSbUVuYWJsZTsKKwl1MTYgCUNjeFJtU3RhdGVbMl07CisJLy8gQ0NYdjQgUzU5LCBNQlNTSUQuCisJYm9vbAliTUJzc2lkVmFsaWQ7CisJdTgJTUJzc2lkTWFzazsKKwl1OAlNQnNzaWRbNl07CisJLy8gQ0NYIDIgUzM4LCBXTEFOIERldmljZSBWZXJzaW9uIE51bWJlciBlbGVtZW50LiBBbm5pZSwgMjAwNi0wOC0yMC4KKwlib29sCWJXaXRoQ2N4VmVyTnVtOworCXU4CUJzc0NjeFZlck51bWJlcjsKKwkvKiBUaGVzZSBhcmUgbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBzdGF0czsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCAgcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggIHJhdGVzX2xlbjsKKwl1OCAgcmF0ZXNfZXhbTUFYX1JBVEVTX0VYX0xFTkdUSF07CisJdTggIHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCAgbW9kZTsKKwl1MzIgZmxhZ3M7CisJdTMyIGxhc3RfYXNzb2NpYXRlOworCXUzMiB0aW1lX3N0YW1wWzJdOworCXUxNiBiZWFjb25faW50ZXJ2YWw7CisJdTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1MTYgYXRpbV93aW5kb3c7CisJdTggIGVycF92YWx1ZTsKKwl1OCAgd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3Qgd3BhX2llX2xlbjsKKwl1OCAgcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKworCXN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMgdGltOworCXU4ICBkdGltX3BlcmlvZDsKKwl1OCAgZHRpbV9kYXRhOworCXUzMiBsYXN0X2R0aW1fc3RhX3RpbWVbMl07CisKKwkvL2FwcGVkZWQgZm9yIFFvUworCXU4IHdtbV9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfd21tX2FjX3BhcmFtIHdtbV9wYXJhbVs0XTsKKwl1OCBRb1NfRW5hYmxlOworI2lmZGVmIFRIT01BU19UVVJCTworCXU4IFR1cmJvX0VuYWJsZTsvL2VuYWJsZSB0dXJibyBtb2RlLCBhZGRlZCBieSB0aG9tYXMKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl1MTYgQ291bnRyeUllTGVuOworCXU4IENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKyNlbmRpZgorCS8vIEhUIFJlbGF0ZWQsIGJ5IGFteSwgMjAwOC4wNC4yOQorCUJTU19IVAlic3NodDsKKwkvLyBBZGQgdG8gaGFuZGxlIGJyb2FkY29tIEFQIG1hbmFnZW1lbnQgZnJhbWUgQ0NLIHJhdGUuCisJYm9vbCBicm9hZGNvbV9jYXBfZXhpc3Q7CisJYm9vbCByYWxpbmtfY2FwX2V4aXN0OworCWJvb2wgYXRoZXJvc19jYXBfZXhpc3Q7CisJYm9vbCBjaXNjb19jYXBfZXhpc3Q7CisJYm9vbCB1bmtub3duX2NhcF9leGlzdDsKKy8vCXU4CWJlcnBfaW5mbzsKKwlib29sCWJlcnBfaW5mb192YWxpZDsKKwlib29sIGJ1c2Vwcm90ZWN0aW9uOworCS8vcHV0IGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCUlFRUU4MDIxMV9OT0xJTksgPSAwLAorCisJLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJSUVFRTgwMjExX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAorCit9OworCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SVFMgKDE8PDIpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMIDEKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIDE0CisjZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9DSEFOTkVMUyAoSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIC0gXAorCQkJCSAgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMICsgMSkKKworI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfTUlOX0NIQU5ORUwgMzQKKyNkZWZpbmUgSUVFRTgwMjExXzUyR0haX01BWF9DSEFOTkVMIDE2NQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQ0hBTk5FTFMgKElFRUU4MDIxMV81MkdIWl9NQVhfQ0hBTk5FTCAtIFwKKwkJCQkgIElFRUU4MDIxMV81MkdIWl9NSU5fQ0hBTk5FTCArIDEpCisKKworCit0eXBlZGVmIHN0cnVjdCB0eF9wZW5kaW5nX3R7CisJaW50IGZyYWc7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKK310eF9wZW5kaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9iYW5kd2lkdGhfYXV0b3N3aXRjaAoreworCWxvbmcgdGhyZXNob2xkXzIwTWh6dG80ME1oejsKKwlsb25nCXRocmVzaG9sZF80ME1oenRvMjBNaHo7CisJYm9vbCBiZm9yY2VkX3R4MjBNaHo7CisJYm9vbCBiYXV0b3N3aXRjaF9lbmFibGU7Cit9YmFuZHdpZHRoX2F1dG9zd2l0Y2gsKnBiYW5kd2lkdGhfYXV0b3N3aXRjaDsKKworCisvL2FkZGVkIGJ5IGFteSBmb3Igb3JkZXIKKworI2RlZmluZSBSRU9SREVSX1dJTl9TSVpFCTEyOAorI2RlZmluZSBSRU9SREVSX0VOVFJZX05VTQkxMjgKK3R5cGVkZWYgc3RydWN0IF9SWF9SRU9SREVSX0VOVFJZCit7CisJc3RydWN0IGxpc3RfaGVhZAlMaXN0OworCXUxNgkJCVNlcU51bTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcHJ4YjsKK30gUlhfUkVPUkRFUl9FTlRSWSwgKlBSWF9SRU9SREVSX0VOVFJZOworLy9hZGRlZCBieSBhbXkgZm9yIG9yZGVyCit0eXBlZGVmIGVudW0gX0ZzeW5jX1N0YXRleworCURlZmF1bHRfRnN5bmMsCisJSFdfRnN5bmMsCisJU1dfRnN5bmMKK31Gc3luY19TdGF0ZTsKKworLy8gUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCit0eXBlZGVmCWVudW0gX1JUX1BTX01PREUKK3sKKwllQWN0aXZlLAkvLyBBY3RpdmUvQ29udGludW91cyBhY2Nlc3MuCisJZU1heFBzLAkJLy8gTWF4IHBvd2VyIHNhdmUgbW9kZS4KKwllRmFzdFBzCQkvLyBGYXN0IHBvd2VyIHNhdmUgbW9kZS4KK31SVF9QU19NT0RFOworCit0eXBlZGVmIGVudW0gX0lQU19DQUxMQkFDS19GVU5DSU9OCit7CisJSVBTX0NBTExCQUNLX05PTkUgPSAwLAorCUlQU19DQUxMQkFDS19NR05UX0xJTktfUkVRVUVTVCA9IDEsCisJSVBTX0NBTExCQUNLX0pPSU5fUkVRVUVTVCA9IDIsCit9SVBTX0NBTExCQUNLX0ZVTkNJT047CisKK3R5cGVkZWYgZW51bSBfUlRfSk9JTl9BQ1RJT057CisJUlRfSk9JTl9JTkZSQSAgID0gMSwKKwlSVF9KT0lOX0lCU1MgID0gMiwKKwlSVF9TVEFSVF9JQlNTID0gMywKKwlSVF9OT19BQ1RJT04gID0gNCwKK31SVF9KT0lOX0FDVElPTjsKKwordHlwZWRlZiBzdHJ1Y3QgX0lic3NQYXJtc3sKKwl1MTYgICBhdGltV2luOworfUlic3NQYXJtcywgKlBJYnNzUGFybXM7CisjZGVmaW5lIE1BWF9OVU1fUkFURVMJMjY0IC8vIE1heCBudW0gb2Ygc3VwcG9ydCByYXRlcyBlbGVtZW50OiA4LCAgTWF4IG51bSBvZiBleHQuIHN1cHBvcnQgcmF0ZTogMjU1LiAwNjExMjIsIGJ5IHJjbmprby4KKworLy8gUkYgc3RhdGUuCit0eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFCit7CisJZVJmT24sCisJZVJmU2xlZXAsCisJZVJmT2ZmCit9UlRfUkZfUE9XRVJfU1RBVEU7CisKK3R5cGVkZWYgc3RydWN0IF9SVF9QT1dFUl9TQVZFX0NPTlRST0wKK3sKKworCS8vCisJLy8gSW5hY3RpdmUgUG93ZXIgU2F2ZShJUFMpIDogRGlzYWJsZSBSRiB3aGVuIGRpc2Nvbm5lY3RlZAorCS8vCisJYm9vbAkJCQliSW5hY3RpdmVQczsKKwlib29sCQkJCWJJUFNNb2RlQmFja3VwOworCWJvb2wJCQkJYlN3UmZQcm9jZXNzaW5nOworCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7CisJc3RydWN0IHdvcmtfc3RydWN0IAlJbmFjdGl2ZVBzV29ya0l0ZW07CisJc3RydWN0IHRpbWVyX2xpc3QJSW5hY3RpdmVQc1RpbWVyOworCisJLy8gUmV0dXJuIHBvaW50IGZvciBqb2luIGFjdGlvbgorCUlQU19DQUxMQkFDS19GVU5DSU9OCVJldHVyblBvaW50OworCisJLy8gUmVjb3JlZCBQYXJhbWV0ZXJzIGZvciByZXNjaGVkdWxlZCBKb2luUmVxdWVzdAorCWJvb2wJCQkJYlRtcEJzc0Rlc2M7CisJUlRfSk9JTl9BQ1RJT04JCXRtcEpvaW5BY3Rpb247CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIHRtcEJzc0Rlc2M7CisKKwkvLyBSZWNvcmVkIFBhcmFtZXRlcnMgZm9yIHJlc2NoZWR1bGVkIE1nbnRMaW5rUmVxdWVzdAorCWJvb2wJCQkJYlRtcFNjYW5Pbmx5OworCWJvb2wJCQkJYlRtcEFjdGl2ZVNjYW47CisJYm9vbAkJCQliVG1wRmlsdGVySGlkZGVuQVA7CisJYm9vbAkJCQliVG1wVXBkYXRlUGFybXM7CisJdTgJCQkJCXRtcFNzaWRCdWZbMzNdOworCU9DVEVUX1NUUklORwkJCXRtcFNzaWQyU2NhbjsKKwlib29sCQkJCWJUbXBTc2lkMlNjYW47CisJdTgJCQkJCXRtcE5ldHdvcmtUeXBlOworCXU4CQkJCQl0bXBDaGFubmVsTnVtYmVyOworCXUxNgkJCQkJdG1wQmNuUGVyaW9kOworCXU4CQkJCQl0bXBEdGltUGVyaW9kOworCXUxNgkJCQkJdG1wbUNhcDsKKwlPQ1RFVF9TVFJJTkcJCQl0bXBTdXBwUmF0ZVNldDsKKwl1OAkJCQkJdG1wU3VwcFJhdGVCdWZbTUFYX05VTV9SQVRFU107CisJYm9vbAkJCQliVG1wU3VwcFJhdGU7CisJSWJzc1Bhcm1zCQkJCXRtcElicG07CisJYm9vbAkJCQliVG1wSWJwbTsKKworCS8vCisJLy8gTGVpc3JlIFBvc3dlciBTYXZlIDogRGlzYWJsZSBSRiBpZiBjb25uZWN0ZWQgYnV0IHRyYWZmaWMgaXMgbm90IGJ1c3kKKwkvLworCWJvb2wJCQkJYkxlaXN1cmVQczsKKworfVJUX1BPV0VSX1NBVkVfQ09OVFJPTCwqUFJUX1BPV0VSX1NBVkVfQ09OVFJPTDsKKwordHlwZWRlZiB1MzIgUlRfUkZfQ0hBTkdFX1NPVVJDRTsKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAorI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAorI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCS8vIERvIG5vdCBjaGFuZ2UgdGhlIFJGT2ZmIHJlYXNvbi4gRGVmaW5lZCBieSBCcnVjZSwgMjAwOC0wMS0xNy4KKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKK3R5cGVkZWYgZW51bQoreworCUNPVU5UUllfQ09ERV9GQ0MgPSAwLAorCUNPVU5UUllfQ09ERV9JQyA9IDEsCisJQ09VTlRSWV9DT0RFX0VUU0kgPSAyLAorCUNPVU5UUllfQ09ERV9TUEFJTiA9IDMsCisJQ09VTlRSWV9DT0RFX0ZSQU5DRSA9IDQsCisJQ09VTlRSWV9DT0RFX01LSyA9IDUsCisJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAorCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAorCUNPVU5UUllfQ09ERV9URUxFQywKKwlDT1VOVFJZX0NPREVfTUlDLAorCUNPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOCit9Y291bnRyeV9jb2RlX3R5cGVfdDsKKyNlbmRpZgorCisjZGVmaW5lIFJUX01BWF9MRF9TTE9UX05VTQkxMAordHlwZWRlZiBzdHJ1Y3QgX1JUX0xJTktfREVURUNUX1R7CisKKwl1MzIJCQkJTnVtUmVjdkJjbkluUGVyaW9kOworCXUzMgkJCQlOdW1SZWN2RGF0YUluUGVyaW9kOworCisJdTMyCQkJCVJ4QmNuTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBiZWFjb24gLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MzIJCQkJUnhEYXRhTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CS8vIG51bWJlciBvZiBSeCBkYXRhIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisJdTE2CQkJCVNsb3ROdW07CS8vIG51bWJlciBvZiBDaGVja0ZvckhhbmcgcGVyaW9kIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUxNgkJCQlTbG90SW5kZXg7CisKKwl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOworCXUzMgkJCQlOdW1SeE9rSW5QZXJpb2Q7CisJYm9vbAkJCQliQnVzeVRyYWZmaWM7Cit9UlRfTElOS19ERVRFQ1RfVCwgKlBSVF9MSU5LX0RFVEVDVF9UOworCisKK3N0cnVjdCBpZWVlODAyMTFfZGV2aWNlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjOworCisJLy9odyBzZWN1cml0eSByZWxhdGVkCisvLwl1OCBod3NlY19zdXBwb3J0OyAvL3N1cHBvcnQ/CisJdTggaHdzZWNfYWN0aXZlOyAgLy9odyBzZWN1cml0eSBhY3RpdmUuCisJYm9vbCBpc19zaWxlbnRfcmVzZXQ7CisJYm9vbCBpZWVlX3VwOworCS8vYWRkZWQgYnkgYW15CisJYm9vbCBiU3VwcG9ydFJlbW90ZVdha2VVcDsKKwlSVF9QU19NT0RFCWRvdDExUG93ZXJTYXZlTW9kZTsgLy8gUG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCisJYm9vbCBhY3RzY2FubmluZzsKKwlib29sIGJlaW5yZXRyeTsKKwlSVF9SRl9QT1dFUl9TVEFURQkJZVJGUG93ZXJTdGF0ZTsKKwlSVF9SRl9DSEFOR0VfU09VUkNFCVJmT2ZmUmVhc29uOworCWJvb2wgaXNfc2V0X2tleTsKKwkvLzExbiBzcGVjIHJlbGF0ZWQgSSB3b25kZXIgaWYgVGhlc2UgaW5mbyBzdHJ1Y3R1cmUgbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgaWVlZTgwMjExX2RldmljZQorCisJLy8xMW4gSFQgYmVsb3cKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm87CisJLy9zdHJ1Y3QgdGltZXJfbGlzdAkJU3dCd1RpbWVyOworLy8Jc3BpbmxvY2tfdCBjaG5sb3Bfc3BpbmxvY2s7CisJc3BpbmxvY2tfdCBid19zcGlubG9jazsKKworCXNwaW5sb2NrX3QgcmVvcmRlcl9zcGlubG9jazsKKwkvLyBmb3IgSFQgb3BlcmF0aW9uIHJhdGUgc2V0LiAgd2UgdXNlIHRoaXMgb25lIGZvciBIVCBkYXRhIHJhdGUgdG8gc2VwZXJhdGUgZGlmZmVyZW50IGRlc2NyaXB0b3JzCisJLy90aGUgd2F5IGZpbGwgdGhpcyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgSUUKKwl1OAlSZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzE2XTsJCS8vdXNlIFJBVFIgZm9ybWF0CisJdTgJZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvL3VzZSBSQVRSIGZvcm1hdAorCXU4CVJlZ0hUU3VwcFJhdGVTZXRbMTZdOworCXU4CQkJCUhUQ3VycmVudE9wZXJhUmF0ZTsKKwl1OAkJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7CisJLy93YiBhZGRlZCBmb3IgcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQorCXU4CWJUeERpc2FibGVSYXRlRmFsbEJhY2s7CisJdTggCWJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZTsKKwlhdG9taWNfdAlhdG1fY2hubG9wOworCWF0b21pY190CWF0bV9zd2J3OworLy8JdTgJSFRIaWdoZXN0T3BlcmFSYXRlOworLy8JdTggCUhUQ3VycmVudE9wZXJhUmF0ZTsKKworCS8vIDgwMi4xMWUgYW5kIFdNTSBUcmFmZmljIFN0cmVhbSBJbmZvIChUWCkKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19BZG1pdF9MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX1BlbmRpbmdfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19VbnVzZWRfTGlzdDsKKwlUWF9UU19SRUNPUkQJCVR4VHNSZWNvcmRbVE9UQUxfVFNfTlVNXTsKKwkvLyA4MDIuMTFlIGFuZCBXTU0gVHJhZmZpYyBTdHJlYW0gSW5mbyAoUlgpCisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfVW51c2VkX0xpc3Q7CisJUlhfVFNfUkVDT1JECQlSeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisvLyNpZmRlZiBUT19ET19MSVNUCisJUlhfUkVPUkRFUl9FTlRSWQlSeFJlb3JkZXJFbnRyeVsxMjhdOworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UmVvcmRlcl9VbnVzZWRfTGlzdDsKKy8vI2VuZGlmCisJLy8gUW9zIHJlbGF0ZWQuIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTAxLgorLy8JUFNUQV9RT1MJCQlwU3RhUW9zOworCXU4CQkJCUZvcmNlZFByaW9yaXR5OwkJLy8gRm9yY2UgcGVyLXBhY2tldCBwcmlvcml0eSAxfjcuIChkZWZhdWx0OiAwLCBub3QgdG8gZm9yY2UgaXQuKQorCisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOworCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3Qgd3BheF9zdWl0bGlzdF9sb2NrOworCisJaW50IHR4X2hlYWRyb29tOyAvKiBTZXQgdG8gc2l6ZSBvZiBhbnkgYWRkaXRpb25hbCByb29tIG5lZWRlZCBhdCBmcm9udAorCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzICovCisJdTMyIGNvbmZpZzsKKworCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KKwlpbnQgb3Blbl93ZXA7IC8qIFNldCB0byAxIHRvIGFsbG93IHVuZW5jcnlwdGVkIGZyYW1lcyAqLworCWludCBhdXRoX21vZGU7CisJaW50IHJlc2V0X29uX2tleWNoYW5nZTsgLyogU2V0IHRvIDEgaWYgdGhlIEhXIG5lZWRzIHRvIGJlIHJlc2V0IG9uCisJCQkJICogV0VQIGtleSBjaGFuZ2VzICovCisKKwkvKiBJZiB0aGUgaG9zdCBwZXJmb3JtcyB7ZW4sZGV9Y3J5cHRpb24sIHRoZW4gc2V0IHRvIDEgKi8KKwlpbnQgaG9zdF9lbmNyeXB0OworCWludCBob3N0X2VuY3J5cHRfbXNkdTsKKwlpbnQgaG9zdF9kZWNyeXB0OworCS8qIGhvc3QgcGVyZm9ybXMgbXVsdGljYXN0IGRlY3J5cHRpb24gKi8KKwlpbnQgaG9zdF9tY19kZWNyeXB0OworCisJLyogaG9zdCBzaG91bGQgc3RyaXAgSVYgYW5kIElDViBmcm9tIHByb3RlY3RlZCBmcmFtZXMgKi8KKwkvKiBtZWFuaW5nZnVsIG9ubHkgd2hlbiBoYXJkd2FyZSBkZWNyeXB0aW9uIGlzIGJlaW5nIHVzZWQgKi8KKwlpbnQgaG9zdF9zdHJpcF9pdl9pY3Y7CisKKwlpbnQgaG9zdF9vcGVuX2ZyYWc7CisJaW50IGhvc3RfYnVpbGRfaXY7CisJaW50IGllZWU4MDJfMXg7IC8qIGlzIElFRUUgODAyLjFYIHVzZWQgKi8KKworCS8qIFdQQSBkYXRhICovCisJYm9vbCBiSGFsZldpcmVsZXNzTjI0R01vZGU7CisJaW50IHdwYV9lbmFibGVkOworCWludCBkcm9wX3VuZW5jcnlwdGVkOworCWludCB0a2lwX2NvdW50ZXJtZWFzdXJlczsKKwlpbnQgcHJpdmFjeV9pbnZva2VkOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICp3cGFfaWU7CisJdTggYXBfbWFjX2FkZHJbNl07CisJdTE2IHBhaXJ3aXNlX2tleV90eXBlOworCXUxNiBncm91cF9rZXlfdHlwZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNyeXB0X2RlaW5pdF9saXN0OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHRbV0VQX0tFWVNdOworCWludCB0eF9rZXlpZHg7IC8qIGRlZmF1bHQgVFgga2V5IGluZGV4IChjcnlwdFt0eF9rZXlpZHhdKSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGNyeXB0X2RlaW5pdF90aW1lcjsKKwlpbnQgY3J5cHRfcXVpZXNjZWQ7CisKKwlpbnQgYmNyeF9zdGFfa2V5OyAvKiB1c2UgaW5kaXZpZHVhbCBrZXlzIHRvIG92ZXJyaWRlIGRlZmF1bHQga2V5cyBldmVuCisJCQkgICAqIHdpdGggUlggb2YgYnJvYWQvbXVsdGljYXN0IGZyYW1lcyAqLworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJLy8gZWFjaCBzdHJlYW1pbmcgY29udGFpbiBhIGVudHJ5CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQ2VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAxCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDZVCisJdTE2IHJ0czsgLyogUlRTIHRocmVzaG9sZCAqLworCisJLyogQXNzb2NpYXRpb24gaW5mbyAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qIFRoaXMgc3RvcmVzIGluZm9zIGZvciB0aGUgY3VycmVudCBuZXR3b3JrLgorCSAqIEVpdGhlciB0aGUgbmV0d29yayB3ZSBhcmUgYXNzb2NpYXRlZCBpbiBJTkZSQVNUUlVDVFVSRQorCSAqIG9yIHRoZSBuZXR3b3JrIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGluIE1BU1RFUiBtb2RlLgorCSAqIGFkLWhvYyBpcyBhIG1peHR1cmUgOy0pLgorCSAqIE5vdGUgdGhhdCBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlLCBldmVuIHdoZW4gbm90IGFzc29jaWF0ZWQsCisJICogZmllbGRzIGJzc2lkIGFuZCBlc3NpZCBtYXkgYmUgdmFsaWQgKGlmIHdwYV9zZXQgYW5kIGVzc2lkX3NldAorCSAqIGFyZSB0cnVlKSBhcyB0aHkgY2FycnkgdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciB2aWEgaXdjb25maWcKKwkgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgY3VycmVudF9uZXR3b3JrOworCisJZW51bSBpZWVlODAyMTFfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgcmVnX21vZGU7CisJaW50IG1vZGU7ICAgICAgIC8qIEEsIEIsIEcgKi8KKwlpbnQgbW9kdWxhdGlvbjsgLyogQ0NLLCBPRkRNICovCisJaW50IGZyZXFfYmFuZDsgIC8qIDIuNEdoeiwgNS4yR2h6LCBNaXhlZCAqLworCWludCBhYmdfdHJ1ZTsgICAvKiBBQkcgZmxhZyAgICAgICAgICAgICAgKi8KKworCS8qIHVzZWQgZm9yIGZvcmNpbmcgdGhlIGlic3Mgd29ya3F1ZXVlIHRvIHRlcm1pbmF0ZQorCSAqIHdpdGhvdXQgd2FpdCBmb3IgdGhlIHN5bmNybyBzY2FuIHRvIHRlcm1pbmF0ZQorCSAqLworCXNob3J0IHN5bmNfc2Nhbl9odXJyeXVwOworCisJaW50IHBlcmZlY3RfcnNzaTsKKwlpbnQgd29yc3RfcnNzaTsKKworCXUxNiBwcmV2X3NlcV9jdGw7ICAgICAgIC8qIHVzZWQgdG8gZHJvcCBkdXBsaWNhdGUgZnJhbWVzICovCisKKwkvKiBtYXAgb2YgYWxsb3dlZCBjaGFubmVscy4gMCBpcyBkdW1teSAqLworCS8vIEZJWE1FOiByZW1lYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl2b2lkKiBwRG90MTFkSW5mbzsKKwlib29sIGJHbG9iYWxEb21haW47CisjZWxzZQorCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisjZW5kaWYKKwlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCisJaW50IGJhc2ljX3JhdGU7CisJLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcworCXNob3J0IGFjdGl2ZV9zY2FuOworCisJLyogdGhpcyBjb250YWlucyBmbGFncyBmb3Igc2VsZWN0aXZlbHkgZW5hYmxlIHNvZnRtYWMgc3VwcG9ydCAqLworCXUxNiBzb2Z0bWFjX2ZlYXR1cmVzOworCisJLyogaWYgdGhlIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaXMgbm90IGZpbGxlZCBieSBIVyAqLworCXUxNiBzZXFfY3RybFs1XTsKKworCS8qIGFzc29jaWF0aW9uIHByb2NlZHVyZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1MTYgYXNzb2NpYXRlX3NlcTsKKworCS8qIEFJRCBmb3IgUlRYZWQgYXNzb2NpYXRpb24gcmVzcG9uc2VzICovCisJdTE2IGFzc29jX2lkOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQqLworCXNob3J0IHBzOworCXNob3J0IHN0YV9zbGVlcDsKKwlpbnQgcHNfdGltZW91dDsKKwlpbnQgcHNfcGVyaW9kOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXUzMiBwc190aDsKKwl1MzIgcHNfdGw7CisKKwlzaG9ydCByYXdfdHg7CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc2hvcnQgcXVldWVfc3RvcDsKKwlzaG9ydCBzY2FubmluZzsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCisJc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKKworCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOworCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CisKKwlzaG9ydCBiZWFjb25fdHhpbmc7CisKKwlzaG9ydCB3YXBfc2V0OworCXNob3J0IHNzaWRfc2V0OworCisJdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9CisJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CisKKwkvKiBRb1MgcmVsYXRlZCBmbGFnICovCisJY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisJLyogc2V0IG9uIGluaXRpYWxpemF0aW9uICovCisJdTggIHFvc19zdXBwb3J0OworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIElCU1MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlic3NfbWFjX2hhc2hbSUVFRV9JQlNTX01BQ19IQVNIX1NJWkVdOworCisJLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIEJTUyAqLworCXUxNiBsYXN0X3J4c2VxX251bVsxN107IC8qIHJ4IHNlcSBwcmV2aW91cyBwZXItdGlkICovCisJdTE2IGxhc3RfcnhmcmFnX251bVsxN107LyogdHggZnJhZyBwcmV2aW91cyBwZXItdGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3BhY2tldF90aW1lWzE3XTsKKworCS8qIGZvciBQUyBtb2RlICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3J4X3BzX3RpbWU7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0IHNrX2J1ZmYgKm1nbXRfcXVldWVfcmluZ1tNR01UX1FVRVVFX05VTV07CisJaW50IG1nbXRfcXVldWVfaGVhZDsKKwlpbnQgbWdtdF9xdWV1ZV90YWlsOworLy97IGFkZGVkIGZvciBydGw4MTl4CisjZGVmaW5lIElFRUU4MDIxMV9RVUVVRV9MSU1JVCAxMjgKKwl1OCBBc29jUmV0cnlDb3VudDsKKwl1bnNpZ25lZCBpbnQgaHdfaGVhZGVyOworCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX3dhaXRRW01BWF9RVUVVRV9TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICBza2JfYWdnUVtNQVhfUVVFVUVfU0laRV07CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAgc2tiX2Rydl9hZ2dRW01BWF9RVUVVRV9TSVpFXTsKKwl1MzIJc3RhX2VkY2FfcGFyYW1bNF07CisJYm9vbCBhZ2dyZWdhdGlvbjsKKwkvLyBFbmFibGUvRGlzYWJsZSBSeCBpbW1lZGlhdGUgQkEgY2FwYWJpbGl0eS4KKwlib29sIGVuYWJsZV9yeF9pbW1fQkE7CisJYm9vbCBiaWJzc2Nvb3JkaW5hdG9yOworCisJLy8rYnkgYW15IGZvciBETSAsMDgwNTE1CisJLy9EeW5hbWljIFR4IHBvd2VyIGZvciBuZWFyL2ZhciByYW5nZSBlbmFibGUvRGlzYWJsZSAgLCBieSBhbXkgLCAyMDA4LTA1LTE1CisJYm9vbAliZHluYW1pY190eHBvd2VyX2VuYWJsZTsKKworCWJvb2wgYkNUU1RvU2VsZkVuYWJsZTsKKwl1OCAJQ1RTVG9TZWxmVEg7CisKKwl1MzIgCWZzeW5jX3RpbWVfaW50ZXJ2YWw7CisJdTMyCWZzeW5jX3JhdGVfYml0bWFwOworCXU4CWZzeW5jX3Jzc2lfdGhyZXNob2xkOworCWJvb2wJYmZzeW5jX2VuYWJsZTsKKworCXU4CWZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbDsJCS8vIEZzeW5jTXVsdGlwbGVUaW1lSW50ZXJ2YWwgKiBGc3luY1RpbWVJbnRlcnZhbAorCXUzMglmc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZDsJCS8vIGxvdyB0aHJlc2hvbGQKKwl1MzIJZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkOwkgLy8gZGVjcmVhc2UgdGhyZXNob2xkCisJRnN5bmNfU3RhdGUJCQlmc3luY19zdGF0ZTsKKwlib29sCQliaXNfYW55X25vbmJlcGt0czsKKwkvLzIwTWh6IDQwTWh6IEF1dG9Td2l0Y2ggVGhyZXNob2xkCisJYmFuZHdpZHRoX2F1dG9zd2l0Y2ggYmFuZHdpZHRoX2F1dG9fc3dpdGNoOworCS8vZm9yIHR4cG93ZXIgdHJhY2tpbmcKKwlib29sIEZ3UldSRjsKKworCS8vYWRkZWQgYnkgYW15IGZvciBBUCByb2FtaW5nCisJUlRfTElOS19ERVRFQ1RfVAlMaW5rRGV0ZWN0SW5mbzsKKwkvL2FkZGVkIGJ5IGFteSBmb3IgcHMKKwlSVF9QT1dFUl9TQVZFX0NPTlRST0wJUG93ZXJTYXZlQ29udHJvbDsKKy8vfQorCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCAgdHhfcGVuZGluZ190IHR4X3BlbmRpbmc7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NpYXRlX3RpbWVyOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBiZWFjb25fdGltZXI7CisJc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX3Byb2NlZHVyZV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHNvZnRtYWNfc2Nhbl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKKwkgc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3eF9zeW5jX3NjYW5fd3E7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCS8vIFFvcyByZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0wMS4KKwkvL1NUQV9RT1MgIFN0YVFvczsKKworCS8vdTMyIFNUQV9FRENBX1BBUkFNWzRdOworCS8vQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyBDaGFubmVsQWNjZXNzU2V0dGluZzsKKworCisJLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCisJdm9pZCAoKnNldF9zZWN1cml0eSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSAqc2VjKTsKKworCS8qIFVzZWQgdG8gVFggZGF0YSBmcmFtZSBieSB1c2luZyB0eGIgc3RydWN0cy4KKwkgKiB0aGlzIGlzIG5vdCB1c2VkIGlmIGluIHRoZSBzb2Z0bWFjX2ZlYXR1cmVzCisJICogaXMgc2V0IHRoZSBmbGFnIElFRUVfU09GVE1BQ19UWF9RVUVVRQorCSAqLworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCWludCAoKnJlc2V0X3BvcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCWludCAoKmlzX3F1ZXVlX2Z1bGwpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IHByaSk7CisKKwlpbnQgKCpoYW5kbGVfbWFuYWdlbWVudCkgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yaywgdTE2IHR5cGUpOworCWludCAoKmlzX3Fvc19hY3RpdmUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTE2IHR4X3JhdGUpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCWludCAoKmhhbmRsZV9iZWFjb24pIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKiBiZWFjb24sIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspOworCWludCAoKmhhbmRsZV9hc3NvY19yZXNwb25zZSkgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICogcmVzcCwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yayk7CisKKworCS8qIGNoZWNrIHdoZXRoZXIgVHggaHcgcmVzb3VjZSBhdmFpbGFibGUgKi8KKwlzaG9ydCAoKmNoZWNrX25pY19lbm91Z2hfZGVzYykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKKwkvL2FkZGVkIGJ5IHdiIGZvciBIVCByZWxhdGVkCisvLwl2b2lkICgqU3dDaG5sQnlUaW1lckhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjaGFubmVsKTsKKwl2b2lkICgqU2V0QldNb2RlSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCk7CisvLwl2b2lkICgqVXBkYXRlSGFsUkFUUlRhYmxlSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTgqIHBNY3NSYXRlKTsKKwlib29sICgqR2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCXZvaWQgKCpTZXRXaXJlbGVzc01vZGUpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHdpcmVsZXNzX21vZGUpOworCWJvb2wgKCpHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKwl2b2lkICgqSW5pdGlhbEdhaW5IYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBPcGVyYXRpb24pOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTl8yNEcgCQkgICgxPDw0KQorI2RlZmluZQlJRUVFX05fNUcJCSAgKDE8PDUpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc192YWxpZF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZmMpKSB7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpCisJCQloZHJsZW4gPSBJRUVFODAyMTFfNEFERFJfTEVOOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IElFRUU4MDIxMV8xQUREUl9MRU47CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IElFRUU4MDIxMV8yQUREUl9MRU47CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGRybGVuOworfQorCitzdGF0aWMgaW5saW5lIHU4ICppZWVlODAyMTFfZ2V0X3BheWxvYWQoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzd2l0Y2ggKGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwljYXNlIElFRUU4MDIxMV8xQUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopaGRyKS0+cGF5bG9hZDsKKwljYXNlIElFRUU4MDIxMV8yQUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzJhZGRyICopaGRyKS0+cGF5bG9hZDsKKwljYXNlIElFRUU4MDIxMV8zQUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopaGRyKS0+cGF5bG9hZDsKKwljYXNlIElFRUU4MDIxMV80QUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopaGRyKS0+cGF5bG9hZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9pc19vZmRtX3JhdGUodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUgJiB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykgeworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV82TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfY2NrX3JhdGUodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUgJiB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykgeworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzFNQjoKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgorCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTgKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhKiB3cnF1LCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisjZW5kaWYKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbik7CisKKy8qIGllZWU4MDIxMV9zb2Z0bWFjLmMgKi8KK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KTsKKwordm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KiBhc1N0YSwgdTggYXNSc24pOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKTsKK2V4dGVybiB2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcHNfdHhfYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBzdWNjZXNzKTsKKworZXh0ZXJuIHZvaWQgc29mdG1hY19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKworLyogaWVlZTgwMjExX3NvZnRtYWNfd3guYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3J0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworLy9IVAorI2RlZmluZSBNQVhfUkVDRUlWRV9CVUZGRVJfU0laRSA5MTAwICAvLworZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUQ2FwYWJpbGl0eSh1OCogQ2FwSUUsIHU4KiBUaXRsZVN0cmluZyApOworZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUSW5mbyh1OCogIEluZm9JRSwgdTgqIFRpdGxlU3RyaW5nKTsKKwordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCAgICBPZmZzZXQpOworZXh0ZXJuIHZvaWQgSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7CitleHRlcm4gdm9pZCBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRDYXAsIHU4KiBsZW4sIHU4IGlzRW5jcnlwdCk7CitleHRlcm4gdm9pZCBIVENvbnN0cnVjdEluZm9FbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRJbmZvLCB1OCogbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwb3NSVDJSVEFnZywgdTgqIGxlbik7CitleHRlcm4gdm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgSFRJbml0aWFsaXplSFRJbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUJzc0Rlc2MoUEJTU19IVCBwQnNzSFQpOworZXh0ZXJuIHZvaWQgSFRSZXNldFNlbGZBbmRTYXZlUGVlclNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIHBOZXR3b3JrKTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlU2VsZkFuZFBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIHBOZXR3b3JrKTsKK2V4dGVybiB1OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE1DU1JhdGVTZXQsIHU4KiBwTUNTRmlsdGVyKTsKK2V4dGVybiB1OCBNQ1NfRklMVEVSX0FMTFtdOworZXh0ZXJuIHUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA7CitleHRlcm4gdTggSFRDQ2hlY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiAgIHBGcmFtZSk7CisvL2V4dGVybiB2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBIVFJlc2V0SU9UU2V0dGluZyhQUlRfSElHSF9USFJPVUdIUFVUICBwSFRJbmZvKTsKK2V4dGVybiBib29sIElzSFRIYWxmTm1vZGVBUHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworZXh0ZXJuIHUxNiBIVEhhbGZNY3NUb0RhdGFSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAgdTggICAgICBuTWNzUmF0ZSk7CitleHRlcm4gdTE2IEhUTWNzVG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5NY3NSYXRlKTsKK2V4dGVybiB1MTYgIFR4Q291bnRUb0RhdGFSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTggbkRhdGFSYXRlKTsKKy8vZnVuY3Rpb24gaW4gQkFQUk9DLmMKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X0FEREJBUmVxKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9BRERCQVJzcCggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZCBUc0luaXRBZGRCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUWF9UU19SRUNPUkQgICBwVFMsIHU4IFBvbGljeSwgdTggYk92ZXJ3cml0ZVBlbmRpbmcpOworZXh0ZXJuIHZvaWQgVHNJbml0RGVsQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgVFJfU0VMRUNUIFR4UnhTZWxlY3QpOworZXh0ZXJuIHZvaWQgQmFTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIFR4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIFJ4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIFJlc2V0QmFFbnRyeSggUEJBX1JFQ09SRCBwQkEpOworLy9mdW5jdGlvbiBpbiBUUy5jCitleHRlcm4gYm9vbCBHZXRUcygKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogICAgICAgIGllZWUsCisJUFRTX0NPTU1PTl9JTkZPICAgICAgICAgICAgICAgICAqcHBUUywKKwl1OCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUQsCisJVFJfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICBUeFJ4U2VsZWN0LCAgLy9SeDoxLCBUeDowCisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRkTmV3VHMKKwkpOworZXh0ZXJuIHZvaWQgVFNJbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiAgdm9pZCBUc1N0YXJ0QWRkQmFQcm9jZXNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JEICAgcFR4VFMpOworZXh0ZXJuIHZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogQWRkcik7CitleHRlcm4gdm9pZCBSZW1vdmVBbGxUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7Cit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisKKy8qIEZvciB0aGUgZnVuY3Rpb24gaXMgbW9yZSByZWxhdGVkIHRvIGhhcmR3YXJlIHNldHRpbmcsIGl0J3MgYmV0dGVyIHRvIHVzZSB0aGUKKyAqIGllZWUgaGFuZGxlciB0byByZWZlciB0byBpdC4KKyAqLworZXh0ZXJuIHNob3J0IGNoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcXVldWVfaW5kZXgpOworZXh0ZXJuIGludCBpZWVlODAyMTFfZGF0YV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKKwkJdTE2IGxlbmd0aCwKKwkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKK3ZvaWQgaWVlZTgwMjExX2luZGljYXRlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcnhiKiogcHJ4YkluZGljYXRlQXJyYXksdTggIGluZGV4KTsKKyNkZWZpbmUgUlRfQVNPQ19SRVRSWV9MSU1JVAk1CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9FbmRpYW5GcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4NWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvRW5kaWFuRnJlZS5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIF9fSU5DX0VORElBTkZSRUVfSAorI2RlZmluZSBfX0lOQ19FTkRJQU5GUkVFX0gKKworLyoKKyAqCUNhbGwgZW5kaWFuIGZyZWUgZnVuY3Rpb24gd2hlbgorICoJCTEuIFJlYWQvd3JpdGUgcGFja2V0IGNvbnRlbnQuCisgKgkJMi4gQmVmb3JlIHdyaXRlIGludGVnZXIgdG8gSU8uCisgKgkJMy4gQWZ0ZXIgcmVhZCBpbnRlZ2VyIGZyb20gSU8uCisgKi8KKworI2RlZmluZSBfX01BQ0hJTkVfTElUVExFX0VORElBTiAxMjM0ICAgIC8qIExTQiBmaXJzdDogaTM4NiwgdmF4ICovCisjZGVmaW5lIF9fTUFDSElORV9CSUdfRU5ESUFOICAgIDQzMjEgICAgLyogTVNCIGZpcnN0OiA2ODAwMCwgaWJtLCBuZXQsIHBwYyAqLworCisjZGVmaW5lIEJZVEVfT1JERVIgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KKworI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KKy8vIENvbnZlcnQgZGF0YQorI2RlZmluZSBFRjFCeXRlKF92YWwpCQkJCSgodTgpKF92YWwpKQorI2RlZmluZSBFRjJCeXRlKF92YWwpCQkJCSgodTE2KShfdmFsKSkKKyNkZWZpbmUgRUY0Qnl0ZShfdmFsKQkJCQkoKHUzMikoX3ZhbCkpCisKKyNlbHNlCisvLyBDb252ZXJ0IGRhdGEKKyNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgRUYyQnl0ZShfdmFsKQkJCQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfCgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKKyNkZWZpbmUgRUY0Qnl0ZShfdmFsKQkJCQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAorCQkJCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KXxcCisJCQkJCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpfFwKKwkJCQkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQorI2VuZGlmCisKKy8vIFJlYWQgZGF0YSBmcm9tIG1lbW9yeQorI2RlZmluZSBSZWFkRUYxQnl0ZShfcHRyKQkJRUYxQnl0ZSgqKCh1OCAqKShfcHRyKSkpCisjZGVmaW5lIFJlYWRFRjJCeXRlKF9wdHIpCQlFRjJCeXRlKCooKHUxNiAqKShfcHRyKSkpCisjZGVmaW5lIFJlYWRFRjRCeXRlKF9wdHIpCQlFRjRCeXRlKCooKHUzMiAqKShfcHRyKSkpCisKKy8vIFdyaXRlIGRhdGEgdG8gbWVtb3J5CisjZGVmaW5lIFdyaXRlRUYxQnl0ZShfcHRyLCBfdmFsKQkoKigodTggKikoX3B0cikpKT1FRjFCeXRlKF92YWwpCisjZGVmaW5lIFdyaXRlRUYyQnl0ZShfcHRyLCBfdmFsKQkoKigodTE2ICopKF9wdHIpKSk9RUYyQnl0ZShfdmFsKQorI2RlZmluZSBXcml0ZUVGNEJ5dGUoX3B0ciwgX3ZhbCkJKCooKHUzMiAqKShfcHRyKSkpPUVGNEJ5dGUoX3ZhbCkKKy8vIENvbnZlcnQgSG9zdCBzeXN0ZW0gc3BlY2lmaWMgYnl0ZSBvcmRpbmcgKGxpdHRlbiBvciBiaWcgZW5kaWEpIHRvIE5ldHdvcmsgYnl0ZSBvcmRpbmcgKGJpZyBlbmRpYW4pLgorLy8gMjAwNi4wNS4wNywgYnkgcmNuamtvLgorI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgSDJOMUJZVEUoX3ZhbCkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIEgyTjJCWVRFKF92YWwpCSgoKCgodTE2KShfdmFsKSkmMHgwMGZmKTw8OCl8XAorCQkJKCgoKHUxNikoX3ZhbCkpJjB4ZmYwMCk+PjgpKQorI2RlZmluZSBIMk40QllURShfdmFsKQkoKCgoKHUzMikoX3ZhbCkpJjB4MDAwMDAwZmYpPDwyNCl8XAorCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDAwMGZmMDApPDw4KQl8XAorCQkJKCgoKHUzMikoX3ZhbCkpJjB4MDBmZjAwMDApPj44KQl8XAorCQkJKCgoKHUzMikoX3ZhbCkpJjB4ZmYwMDAwMDApPj4yNCkpCisjZWxzZQorI2RlZmluZSBIMk4xQllURShfdmFsKQkJCSgodTgpKF92YWwpKQorI2RlZmluZSBIMk4yQllURShfdmFsKQkJCSgodTE2KShfdmFsKSkKKyNkZWZpbmUgSDJONEJZVEUoX3ZhbCkJCQkoKHUzMikoX3ZhbCkpCisjZW5kaWYKKworLy8gQ29udmVydCBmcm9tIE5ldHdvcmsgYnl0ZSBvcmRpbmcgKGJpZyBlbmRpYW4pIHRvIEhvc3Qgc3lzdGVtIHNwZWNpZmljIGJ5dGUgb3JkaW5nIChsaXR0ZW4gb3IgYmlnIGVuZGlhKS4KKy8vIDIwMDYuMDUuMDcsIGJ5IHJjbmprby4KKyNpZiBCWVRFX09SREVSID09IF9fTUFDSElORV9MSVRUTEVfRU5ESUFOCisjZGVmaW5lIE4ySDFCWVRFKF92YWwpCSgodTgpKF92YWwpKQorI2RlZmluZSBOMkgyQllURShfdmFsKQkoKCgoKHUxNikoX3ZhbCkpJjB4MDBmZik8PDgpfFwKKwkJCSgoKCh1MTYpKF92YWwpKSYweGZmMDApPj44KSkKKyNkZWZpbmUgTjJINEJZVEUoX3ZhbCkJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweDAwMDBmZjAwKTw8OCkJfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweDAwZmYwMDAwKT4+OCkJfFwKKwkJCSgoKCh1MzIpKF92YWwpKSYweGZmMDAwMDAwKT4+MjQpKQorI2Vsc2UKKyNkZWZpbmUgTjJIMUJZVEUoX3ZhbCkJCQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJCQkoKHUxNikoX3ZhbCkpCisjZGVmaW5lIE4ySDRCWVRFKF92YWwpCQkJKCh1MzIpKF92YWwpKQorI2VuZGlmCisKKy8vCisvLwlFeGFtcGxlOgorLy8JCUJJVF9MRU5fTUFTS18zMigwKSA9PiAweDAwMDAwMDAwCisvLwkJQklUX0xFTl9NQVNLXzMyKDEpID0+IDB4MDAwMDAwMDEKKy8vCQlCSVRfTEVOX01BU0tfMzIoMikgPT4gMHgwMDAwMDAwMworLy8JCUJJVF9MRU5fTUFTS18zMigzMikgPT4gMHhGRkZGRkZGRgorLy8KKyNkZWZpbmUgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSAoMHhGRkZGRkZGRiA+PiAoMzIgLSAoX19CaXRMZW4pKSkKKy8vCisvLwlFeGFtcGxlOgorLy8JCUJJVF9PRkZTRVRfTEVOX01BU0tfMzIoMCwgMikgPT4gMHgwMDAwMDAwMworLy8JCUJJVF9PRkZTRVRfTEVOX01BU0tfMzIoMTYsIDIpID0+IDB4MDAwMzAwMDAKKy8vCisjZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSAoQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQorCisvLworLy8JRGVzY3JpcHRpb246CisvLwkJUmV0dXJuIDQtYnl0ZSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXJpbmcgZnJvbQorLy8JCTQtYnl0ZSBwb2ludGVyIGluIGxpdHRlbi1lbmRpYW4gc3lzdGVtLgorLy8KKyNkZWZpbmUgTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpIChFRjRCeXRlKCooKHUzMiAqKShfX3BTdGFydCkpKSkKKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVRyYW5zbGF0ZSBzdWJmaWVsZCAoY29udGludW91cyBiaXRzIGluIGxpdHRsZS1lbmRpYW4pIG9mIDQtYnl0ZSB2YWx1ZSBpbiBsaXR0ZW4gYnl0ZSB0bworLy8JCTQtYnl0ZSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXJpbmcuCisvLworI2RlZmluZSBMRV9CSVRTX1RPXzRCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgICggTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkgKSBcCisJICAmIFwKKwkgIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgXAorCSkKKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCU1hc2sgc3ViZmllbGQgKGNvbnRpbnVvdXMgYml0cyBpbiBsaXR0bGUtZW5kaWFuKSBvZiA0LWJ5dGUgdmFsdWUgaW4gbGl0dGVuIGJ5dGUgb3JlZGVyaW5nCisvLwkJYW5kIHJldHVybiB0aGUgcmVzdWx0IGluIDQtYnl0ZSB2YWx1ZSBpbiBob3N0IGJ5dGUgb3JkZXJpbmcuCisvLworI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fNEJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCSggXAorCSAgTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpIFwKKwkgICYgXAorCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS18zMihfX0JpdE9mZnNldCwgX19CaXRMZW4pICkgXAorCSkKKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVNldCBzdWJmaWVsZCBvZiBsaXR0bGUtZW5kaWFuIDQtYnl0ZSB2YWx1ZSB0byBzcGVjaWZpZWQgdmFsdWUuCisvLworI2RlZmluZSBTRVRfQklUU19UT19MRV80QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCisJKigodTMyICopKF9fcFN0YXJ0KSkgPSBcCisJRUY0Qnl0ZSggXAorCUxFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJfCBcCisJKCAoKCh1MzIpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfMzIoX19CaXRMZW4pKSA8PCAoX19CaXRPZmZzZXQpICkgXAorICAgICAgICk7CisKKworI2RlZmluZSBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKKwkoMHhGRkZGID4+ICgxNiAtIChfX0JpdExlbikpKQorCisjZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKKworI2RlZmluZSBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgXAorCShFRjJCeXRlKCooKHUxNiAqKShfX3BTdGFydCkpKSkKKworI2RlZmluZSBMRV9CSVRTX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgICggTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkgKSBcCisJICAmIFwKKwkgIEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikgXAorCSkKKworI2RlZmluZSBMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCSggXAorCSAgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKKwkgICYgXAorCSAgKCB+QklUX09GRlNFVF9MRU5fTUFTS18xNihfX0JpdE9mZnNldCwgX19CaXRMZW4pICkgXAorCSkKKworI2RlZmluZSBTRVRfQklUU19UT19MRV8yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCisJKigodTE2ICopKF9fcFN0YXJ0KSkgPSBcCisJRUYyQnl0ZSggXAorCQlMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCQl8IFwKKwkJKCAoKCh1MTYpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pKSA8PCAoX19CaXRPZmZzZXQpICkgXAorICAgICAgICk7CisKKyNkZWZpbmUgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIFwKKwkoMHhGRiA+PiAoOCAtIChfX0JpdExlbikpKQorCisjZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfOChfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCisKKyNkZWZpbmUgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpIFwKKwkoRUYxQnl0ZSgqKCh1OCAqKShfX3BTdGFydCkpKSkKKworI2RlZmluZSBMRV9CSVRTX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgICggTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkgKSBcCisJICAmIFwKKwkgIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCisJKQorCisjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICBMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BTdGFydCkgXAorCSAgJiBcCisJICAoIH5CSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSApIFwKKwkpCisKKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkgXAorCSooKHU4ICopKF9fcFN0YXJ0KSkgPSBcCisJRUYxQnl0ZSggXAorCQlMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCQl8IFwKKwkJKCAoKCh1OClfX1ZhbHVlKSAmIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSkgPDwgKF9fQml0T2Zmc2V0KSApIFwKKyAgICAgICApOworCisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19FTkRJQU5GUkVFX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2E1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCkBAIC0wLDAgKzEsMTM5IEBACitOSUNfU0VMRUNUID0gUlRMODE5MlUKKworS1ZFUiAgOj0gJChzaGVsbCB1bmFtZSAtcikKK01PRERFU1RESVIgOj0gL2xpYi9tb2R1bGVzLyQoS1ZFUikva2VybmVsL2RyaXZlcnMvbmV0L3dpcmVsZXNzLyQoTklDX1NFTEVDVCkKKworQ0MgPSBnY2MKK2lmbmVxICgkKHNoZWxsIHVuYW1lIC1yfGN1dCAtZC4gLWYxLDIpLCAyLjQpCitFWFRSQV9DRkxBR1MgKz0gLUkkKFRPUERJUikvZHJpdmVycy9uZXQvd2lyZWxlc3MKK0VYVFJBX0NGTEFHUyArPSAtTzIKK0VYVFJBX0NGTEFHUyArPSAtREpBQ0tTT05fTkVXXzgxODcgLURKQUNLU09OX05FV19SWAorCisjaXQgd2lsbCBmYWlsIHRvIGNvbXBpbGUgaW4gc3VzZSBsaW51eCBlbnRlcnByaXNlIDEwIHNwMi4gVGhpcyBmbGFnIGlzIHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4KK2lmZXEgKCQoc2hlbGwgdW5hbWUgLXIgfCBjdXQgLWQuIC1mMSwyLDMsNCksIDIuNi4xNi42MC0wKQorRVhUUkFfQ0ZMQUdTICs9IC1ET1BFTlNVU0VfU0xFRAorZW5kaWYKKworaWZlcSAoJChOSUNfU0VMRUNUKSxSVEw4MTkyVSkKKyNFWFRSQV9DRkxBR1MgKz0gLURVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorI0VYVFJBX0NGTEFHUyArPSAtRFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCitlbmRpZgorI0VYVFJBX0NGTEFHUyArPSAtREpPSE5fTk9DUFkKKyNmbGFncyB0byBlbmFibGUgb3IgZGlzYmxlIDgwMjExRCBmZWF0dXJlCitFWFRSQV9DRkxBR1MgKz0gLURFTkFCTEVfRE9UMTFECitpZWVlODAyMTEtcnNsLW9ianMgOj0gaWVlZTgwMjExX3J4Lm8gXAorCQkgICAgICBpZWVlODAyMTFfc29mdG1hYy5vIFwKKwkJICAgICAgaWVlZTgwMjExX3R4Lm8gXAorCQkgICAgICBpZWVlODAyMTFfd3gubyBcCisJCSAgICAgIGllZWU4MDIxMV9tb2R1bGUubyBcCisJCSAgICAgIGllZWU4MDIxMV9zb2Z0bWFjX3d4Lm9cCisJCSAgICAgIHJ0bDgxOXhfSFRQcm9jLm9cCisJCSAgICAgIHJ0bDgxOXhfVFNQcm9jLm9cCisJCSAgICAgIHJ0bDgxOXhfQkFQcm9jLm9cCisJCSAgICAgIGRvdDExZC5vCisKK2llZWU4MDIxMV9jcnlwdC1yc2wtb2JqcyA6PSBpZWVlODAyMTFfY3J5cHQubworaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLW9ianMgOj0gaWVlZTgwMjExX2NyeXB0X3RraXAubworaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLW9ianMgOj0gaWVlZTgwMjExX2NyeXB0X2NjbXAubworaWVlZTgwMjExX2NyeXB0X3dlcC1yc2wtb2JqcyA6PSBpZWVlODAyMTFfY3J5cHRfd2VwLm8KKworb2JqLW0gKz1pZWVlODAyMTEtcnNsLm8KK29iai1tICs9aWVlZTgwMjExX2NyeXB0LXJzbC5vCitvYmotbSArPWllZWU4MDIxMV9jcnlwdF93ZXAtcnNsLm8KK29iai1tICs9aWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLm8KK29iai1tICs9aWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLm8KKworS1NSQyA6PSAvbGliL21vZHVsZXMvJChLVkVSKS9idWlsZAorSU5TVEFMTF9QUkVGSVggOj0KKworYWxsOiBtb2R1bGVzCisKK21vZHVsZXM6CisJJChNQUtFKSAtQyAkKEtTUkMpIE09JChQV0QpIENDPSQoQ0MpIG1vZHVsZXMKKworaW5zdGFsbDogbW9kdWxlcworCXJtIC1mciAkKE1PRERFU1RESVIpCisJbWtkaXIgLXAgJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHQtcnNsLmtvICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3dlcC1yc2wua28gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfdGtpcC1yc2wua28gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfY2NtcC1yc2wua28gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTEtcnNsLmtvICQoTU9EREVTVERJUikKKwlkZXBtb2QgLWEKK3VuaW5zdGFsbDoKKwlybSAtZnIgJChNT0RERVNURElSKQorCWRlcG1vZCAtYQorCitlbHNlCitMRCA6PSBsZAorS1NSQyA6PSAvbGliL21vZHVsZXMvJChLVkVSKS9idWlsZAorQ09ORklHX0ZJTEUgOj0gJChLU1JDKS9pbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgKKworQ0ZMQUdTICs9IC1ETElOVVggLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1PMiAtcGlwZSAtV2FsbAorQ0ZMQUdTICs9IC1JJChLU1JDKS9pbmNsdWRlIC1JLgorI0tlcm5lbCAyLjQuMzEKK0NGTEFHUyArPSAtRE1PRFZFUlNJT05TIC1ERVhQT1JUX1NZTVRBQiAtaW5jbHVkZSAkKEtTUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaAorI0tlcm5lbCAyLjQuMjAKKyNDRkxBR1MgKz0gLURfX05PX1ZFUlNJT05fXyAtREVYUE9SVF9TWU1UQUIKKyNDRkxBR1MgKz0gLURFTkFCTEVfRE9UMTFECitTTVAgOj0gJChzaGVsbCAkKENDKSAkKE1PRENGTEFHUykgLUUgLWRNICQoQ09ORklHX0ZJTEUpIHwgXAorICAgZ3JlcCBDT05GSUdfU01QIHwgYXdrICd7cHJpbnQgJCQzfScpCitpZm5lcSAoJChTTVApLDEpCisgICBTTVAgOj0gMAorZW5kaWYKK2lmZXEgKCQoU01QKSwxKQorICAgQ0ZMQUdTICAgICs9IC1EX19TTVBfXworZW5kaWYKKworI0NGTEFHUyArPSAtREpPSE5fTk9DUFkKKworT0JKUyA6PSAke3BhdHN1YnN0ICUuYywgJS5vLCAke3dpbGRjYXJkICouY319CithbGw6JHtPQkpTfSBpZWVlODAyMTFfY3J5cHQtcnNsLm8gbWljaGFlbF9taWMtcnNsLm8gYWVzLXJzbC5vIGllZWU4MDIxMV9jcnlwdF93ZXAtcnNsLm8gaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLm8gaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLm8gY3J5cHRvLXJzbC5vIGllZWU4MDIxMS1yc2wubworCitpZWVlODAyMTFfY3J5cHQtcnNsLm86IGllZWU4MDIxMV9jcnlwdC5vCisJbXYgJF4gJEAKKworbWljaGFlbF9taWMtcnNsLm86IG1pY2hhZWxfbWljLm8KKwltdiAkXiAkQAorCithZXMtcnNsLm86IGFlcy5vCisJbXYgJF4gJEAKKworaWVlZTgwMjExX2NyeXB0X3dlcC1yc2wubzogaWVlZTgwMjExX2NyeXB0X3dlcC5vCisJbXYgJF4gJEAKKworaWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLm86IGllZWU4MDIxMV9jcnlwdF90a2lwLm8KKwltdiAkXiAkQAorCitpZWVlODAyMTFfY3J5cHRfY2NtcC1yc2wubzogaWVlZTgwMjExX2NyeXB0X2NjbXAubworCW12ICReICRACisKK2NyeXB0by1yc2wubzogYXJjNC5vIGFwaS5vIGF1dG9sb2FkLm8gY2lwaGVyLm8gY29tcHJlc3MubyBkaWdlc3QubyBzY2F0dGVyd2Fsay5vIHByb2MubworCSQoTEQpIC1yICReIC1vICRACisKK2llZWU4MDIxMS1yc2wubzogaWVlZTgwMjExX3J4Lm8gaWVlZTgwMjExX3R4Lm8gaWVlZTgwMjExX3d4Lm8gaWVlZTgwMjExX21vZHVsZS5vIGllZWU4MDIxMV9zb2Z0bWFjX3d4Lm8gaWVlZTgwMjExX3NvZnRtYWMubyBydGw4MTl4X0hUUHJvYy5vIHJ0bDgxOXhfVFNQcm9jLm8gcnRsODE5eF9CQVByb2MubyBkb3QxMWQubworCSQoTEQpIC1yICReIC1vICRACitpbnN0YWxsOgorCXJtIC1mciAkKE1PRERFU1RESVIpCisJbWtkaXIgLXAgJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHQtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBjcnlwdG8tcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBtaWNoYWVsX21pYy1yc2wubyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGFlcy1yc2wubyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMV9jcnlwdF93ZXAtcnNsLm8gJChNT0RERVNURElSKQorCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfdGtpcC1yc2wubyAkKE1PRERFU1RESVIpCisJQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMV9jcnlwdF9jY21wLXJzbC5vICQoTU9EREVTVERJUikKKwlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExLXJzbC5vICQoTU9EREVTVERJUikKKwkvc2Jpbi9kZXBtb2QgLWEgJHtzaGVsbCB1bmFtZSAtcn0KKwordW5pbnN0YWxsOgorCXJtIC1mciAkKE1PRERFU1RESVIpCisJL3NiaW4vZGVwbW9kIC1hICR7c2hlbGwgdW5hbWUgLXJ9CisKK2VuZGlmCisKKy5QSE9OWTogY2xlYW4KK2NsZWFuOgorCXJtIC1mciAqLm1vZC5jICoubW9kICoubyAuKi5jbWQgKi5tb2QuKiAqLmtvICoubyAqfgorCXJtIC1yZiAudG1wX3ZlcnNpb25zCisJcm0gLXJmIE1vZHVsZS5zeW12ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2Flcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmJiNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hZXMuYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIEFFUyBDaXBoZXIgQWxnb3JpdGhtLgorICoKKyAqIEJhc2VkIG9uIEJyaWFuIEdsYWRtYW4ncyBjb2RlLgorICoKKyAqIExpbnV4IGRldmVsb3BlcnM6CisgKiAgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgorICogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBodnJsYWIub3JnPgorICogIEt5bGUgTWNNYXJ0aW4gPGt5bGVAZGViaWFuLm9yZz4KKyAqICBBZGFtIEouIFJpY2h0ZXIgPGFkYW1AeWdnZHJhc2lsLmNvbT4gKGNvbnZlcnNpb24gdG8gMi41IEFQSSkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgRHIgQnJpYW4gR2xhZG1hbiA8YnJnQGdsYWRtYW4ubWUudWs+LCBXb3JjZXN0ZXIsIFVLLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMSUNFTlNFIFRFUk1TCisgKgorICogVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5CisgKiBmb3JtIGlzIGFsbG93ZWQgKHdpdGggb3Igd2l0aG91dCBjaGFuZ2VzKSBwcm92aWRlZCB0aGF0OgorICoKKyAqICAgMS4gZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXI7CisgKgorICogICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzOworICoKKyAqICAgMy4gdGhlIGNvcHlyaWdodCBob2xkZXIncyBuYW1lIGlzIG5vdCB1c2VkIHRvIGVuZG9yc2UgcHJvZHVjdHMKKyAqICAgICAgYnVpbHQgdXNpbmcgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAorICogbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKyAqCisgKiBESVNDTEFJTUVSCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCisgKiBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKKyAqIGFuZC9vciBmaXRuZXNzIGZvciBwdXJwb3NlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogU29tZSBjaGFuZ2VzIGZyb20gdGhlIEdsYWRtYW4gdmVyc2lvbjoKKyAgICBzL1JJSk5EQUVMKGVfa2V5KS9FX0tFWS9nCisgICAgcy9SSUpOREFFTChkX2tleSkvRF9LRVkvZworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIEFFU19NSU5fS0VZX1NJWkUJMTYKKyNkZWZpbmUgQUVTX01BWF9LRVlfU0laRQkzMgorCisjZGVmaW5lIEFFU19CTE9DS19TSVpFCQkxNgorCitzdGF0aWMgaW5saW5lCit1MzIgZ2VuZXJpY19yb3RyMzIgKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBiaXRzKQoreworCWNvbnN0IHVuc2lnbmVkIG4gPSBiaXRzICUgMzI7CisJcmV0dXJuICh4ID4+IG4pIHwgKHggPDwgKDMyIC0gbikpOworfQorCitzdGF0aWMgaW5saW5lCit1MzIgZ2VuZXJpY19yb3RsMzIgKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBiaXRzKQoreworCWNvbnN0IHVuc2lnbmVkIG4gPSBiaXRzICUgMzI7CisJcmV0dXJuICh4IDw8IG4pIHwgKHggPj4gKDMyIC0gbikpOworfQorCisjZGVmaW5lIHJvdGwgZ2VuZXJpY19yb3RsMzIKKyNkZWZpbmUgcm90ciBnZW5lcmljX3JvdHIzMgorCisvKgorICogI2RlZmluZSBieXRlKHgsIG5yKSAoKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAobnIqOCkpKQorICovCitpbmxpbmUgc3RhdGljIHU4CitieXRlKGNvbnN0IHUzMiB4LCBjb25zdCB1bnNpZ25lZCBuKQoreworCXJldHVybiB4ID4+IChuIDw8IDMpOworfQorCisjZGVmaW5lIHUzMl9pbih4KSBsZTMyX3RvX2NwdSgqKGNvbnN0IHUzMiAqKSh4KSkKKyNkZWZpbmUgdTMyX291dCh0bywgZnJvbSkgKCoodTMyICopKHRvKSA9IGNwdV90b19sZTMyKGZyb20pKQorCitzdHJ1Y3QgYWVzX2N0eCB7CisJaW50IGtleV9sZW5ndGg7CisJdTMyIEVbNjBdOworCXUzMiBEWzYwXTsKK307CisKKyNkZWZpbmUgRV9LRVkgY3R4LT5FCisjZGVmaW5lIERfS0VZIGN0eC0+RAorCitzdGF0aWMgdTggcG93X3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggbG9nX3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggc2J4X3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTggaXNiX3RhYlsyNTZdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyIHJjb190YWJbMTBdOworc3RhdGljIHUzMiBmdF90YWJbNF1bMjU2XTsKK3N0YXRpYyB1MzIgaXRfdGFiWzRdWzI1Nl07CisKK3N0YXRpYyB1MzIgZmxfdGFiWzRdWzI1Nl07CitzdGF0aWMgdTMyIGlsX3RhYls0XVsyNTZdOworCitzdGF0aWMgaW5saW5lIHU4IF9faW5pdAorZl9tdWx0ICh1OCBhLCB1OCBiKQoreworCXU4IGFhID0gbG9nX3RhYlthXSwgY2MgPSBhYSArIGxvZ190YWJbYl07CisKKwlyZXR1cm4gcG93X3RhYltjYyArIChjYyA8IGFhID8gMSA6IDApXTsKK30KKworI2RlZmluZSBmZl9tdWx0KGEsYikgICAgKGEgJiYgYiA/IGZfbXVsdChhLCBiKSA6IDApCisKKyNkZWZpbmUgZl9ybihibywgYmksIG4sIGspCQkJCQlcCisgICAgYm9bbl0gPSAgZnRfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAorCSAgICAgZnRfdGFiWzFdW2J5dGUoYmlbKG4gKyAxKSAmIDNdLDEpXSBeCQlcCisJICAgICBmdF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKKwkgICAgIGZ0X3RhYlszXVtieXRlKGJpWyhuICsgMykgJiAzXSwzKV0gXiAqKGsgKyBuKQorCisjZGVmaW5lIGlfcm4oYm8sIGJpLCBuLCBrKQkJCQkJXAorICAgIGJvW25dID0gIGl0X3RhYlswXVtieXRlKGJpW25dLDApXSBeCQkJCVwKKwkgICAgIGl0X3RhYlsxXVtieXRlKGJpWyhuICsgMykgJiAzXSwxKV0gXgkJXAorCSAgICAgaXRfdGFiWzJdW2J5dGUoYmlbKG4gKyAyKSAmIDNdLDIpXSBeCQlcCisJICAgICBpdF90YWJbM11bYnl0ZShiaVsobiArIDEpICYgM10sMyldIF4gKihrICsgbikKKworI2RlZmluZSBsc19ib3goeCkJCQkJXAorICAgICggZmxfdGFiWzBdW2J5dGUoeCwgMCldIF4JCQlcCisgICAgICBmbF90YWJbMV1bYnl0ZSh4LCAxKV0gXgkJCVwKKyAgICAgIGZsX3RhYlsyXVtieXRlKHgsIDIpXSBeCQkJXAorICAgICAgZmxfdGFiWzNdW2J5dGUoeCwgMyldICkKKworI2RlZmluZSBmX3JsKGJvLCBiaSwgbiwgaykJCQkJCVwKKyAgICBib1tuXSA9ICBmbF90YWJbMF1bYnl0ZShiaVtuXSwwKV0gXgkJCQlcCisJICAgICBmbF90YWJbMV1bYnl0ZShiaVsobiArIDEpICYgM10sMSldIF4JCVwKKwkgICAgIGZsX3RhYlsyXVtieXRlKGJpWyhuICsgMikgJiAzXSwyKV0gXgkJXAorCSAgICAgZmxfdGFiWzNdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDMpXSBeICooayArIG4pCisKKyNkZWZpbmUgaV9ybChibywgYmksIG4sIGspCQkJCQlcCisgICAgYm9bbl0gPSAgaWxfdGFiWzBdW2J5dGUoYmlbbl0sMCldIF4JCQkJXAorCSAgICAgaWxfdGFiWzFdW2J5dGUoYmlbKG4gKyAzKSAmIDNdLDEpXSBeCQlcCisJICAgICBpbF90YWJbMl1bYnl0ZShiaVsobiArIDIpICYgM10sMildIF4JCVwKKwkgICAgIGlsX3RhYlszXVtieXRlKGJpWyhuICsgMSkgJiAzXSwzKV0gXiAqKGsgKyBuKQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2dlbl90YWJzICh2b2lkKQoreworCXUzMiBpLCB0OworCXU4IHAsIHE7CisKKwkvKiBsb2cgYW5kIHBvd2VyIHRhYmxlcyBmb3IgR0YoMioqOCkgZmluaXRlIGZpZWxkIHdpdGgKKwkgICAweDAxMWIgYXMgbW9kdWxhciBwb2x5bm9taWFsIC0gdGhlIHNpbXBsZXN0IHByaW1pdGl2ZQorCSAgIHJvb3QgaXMgMHgwMywgdXNlZCBoZXJlIHRvIGdlbmVyYXRlIHRoZSB0YWJsZXMgKi8KKworCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMjU2OyArK2kpIHsKKwkJcG93X3RhYltpXSA9ICh1OCkgcDsKKwkJbG9nX3RhYltwXSA9ICh1OCkgaTsKKworCQlwIF49IChwIDw8IDEpIF4gKHAgJiAweDgwID8gMHgwMWIgOiAwKTsKKwl9CisKKwlsb2dfdGFiWzFdID0gMDsKKworCWZvciAoaSA9IDAsIHAgPSAxOyBpIDwgMTA7ICsraSkgeworCQlyY29fdGFiW2ldID0gcDsKKworCQlwID0gKHAgPDwgMSkgXiAocCAmIDB4ODAgPyAweDAxYiA6IDApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlwID0gKGkgPyBwb3dfdGFiWzI1NSAtIGxvZ190YWJbaV1dIDogMCk7CisJCXEgPSAoKHAgPj4gNykgfCAocCA8PCAxKSkgXiAoKHAgPj4gNikgfCAocCA8PCAyKSk7CisJCXAgXj0gMHg2MyBeIHEgXiAoKHEgPj4gNikgfCAocSA8PCAyKSk7CisJCXNieF90YWJbaV0gPSBwOworCQlpc2JfdGFiW3BdID0gKHU4KSBpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlwID0gc2J4X3RhYltpXTsKKworCQl0ID0gcDsKKwkJZmxfdGFiWzBdW2ldID0gdDsKKwkJZmxfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWZsX3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKKwkJZmxfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCisJCXQgPSAoKHUzMikgZmZfbXVsdCAoMiwgcCkpIHwKKwkJICAgICgodTMyKSBwIDw8IDgpIHwKKwkJICAgICgodTMyKSBwIDw8IDE2KSB8ICgodTMyKSBmZl9tdWx0ICgzLCBwKSA8PCAyNCk7CisKKwkJZnRfdGFiWzBdW2ldID0gdDsKKwkJZnRfdGFiWzFdW2ldID0gcm90bCAodCwgOCk7CisJCWZ0X3RhYlsyXVtpXSA9IHJvdGwgKHQsIDE2KTsKKwkJZnRfdGFiWzNdW2ldID0gcm90bCAodCwgMjQpOworCisJCXAgPSBpc2JfdGFiW2ldOworCisJCXQgPSBwOworCQlpbF90YWJbMF1baV0gPSB0OworCQlpbF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKKwkJaWxfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOworCQlpbF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7CisKKwkJdCA9ICgodTMyKSBmZl9tdWx0ICgxNCwgcCkpIHwKKwkJICAgICgodTMyKSBmZl9tdWx0ICg5LCBwKSA8PCA4KSB8CisJCSAgICAoKHUzMikgZmZfbXVsdCAoMTMsIHApIDw8IDE2KSB8CisJCSAgICAoKHUzMikgZmZfbXVsdCAoMTEsIHApIDw8IDI0KTsKKworCQlpdF90YWJbMF1baV0gPSB0OworCQlpdF90YWJbMV1baV0gPSByb3RsICh0LCA4KTsKKwkJaXRfdGFiWzJdW2ldID0gcm90bCAodCwgMTYpOworCQlpdF90YWJbM11baV0gPSByb3RsICh0LCAyNCk7CisJfQorfQorCisjZGVmaW5lIHN0YXJfeCh4KSAoKCh4KSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4gKCgoKHgpICYgMHg4MDgwODA4MCkgPj4gNykgKiAweDFiKQorCisjZGVmaW5lIGltaXhfY29sKHkseCkgICAgICAgXAorICAgIHUgICA9IHN0YXJfeCh4KTsgICAgICAgIFwKKyAgICB2ICAgPSBzdGFyX3godSk7ICAgICAgICBcCisgICAgdyAgID0gc3Rhcl94KHYpOyAgICAgICAgXAorICAgIHQgICA9IHcgXiAoeCk7ICAgICAgICAgIFwKKyAgICh5KSAgPSB1IF4gdiBeIHc7ICAgICAgICBcCisgICAoeSkgXj0gcm90cih1IF4gdCwgIDgpIF4gXAorCSAgcm90cih2IF4gdCwgMTYpIF4gXAorCSAgcm90cih0LDI0KQorCisvKiBpbml0aWFsaXNlIHRoZSBrZXkgc2NoZWR1bGUgZnJvbSB0aGUgdXNlciBzdXBwbGllZCBrZXkgKi8KKworI2RlZmluZSBsb29wNChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICB0ID0gcm90cih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOyAgICBcCisgICAgdCBePSBFX0tFWVs0ICogaV07ICAgICBFX0tFWVs0ICogaSArIDRdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNCAqIGkgKyAxXTsgRV9LRVlbNCAqIGkgKyA1XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzQgKiBpICsgMl07IEVfS0VZWzQgKiBpICsgNl0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs0ICogaSArIDNdOyBFX0tFWVs0ICogaSArIDddID0gdDsgICAgXAorfQorCisjZGVmaW5lIGxvb3A2KGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgIHQgPSByb3RyKHQsICA4KTsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07ICAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpXTsgICAgIEVfS0VZWzYgKiBpICsgNl0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaSArIDFdOyBFX0tFWVs2ICogaSArIDddID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyAyXTsgRV9LRVlbNiAqIGkgKyA4XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzYgKiBpICsgM107IEVfS0VZWzYgKiBpICsgOV0gPSB0OyAgICBcCisgICAgdCBePSBFX0tFWVs2ICogaSArIDRdOyBFX0tFWVs2ICogaSArIDEwXSA9IHQ7ICAgXAorICAgIHQgXj0gRV9LRVlbNiAqIGkgKyA1XTsgRV9LRVlbNiAqIGkgKyAxMV0gPSB0OyAgIFwKK30KKworI2RlZmluZSBsb29wOChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICB0ID0gcm90cih0LCAgOCk7IDsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07ICBcCisgICAgdCBePSBFX0tFWVs4ICogaV07ICAgICBFX0tFWVs4ICogaSArIDhdID0gdDsgICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyAxXTsgRV9LRVlbOCAqIGkgKyA5XSA9IHQ7ICAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgMl07IEVfS0VZWzggKiBpICsgMTBdID0gdDsgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDNdOyBFX0tFWVs4ICogaSArIDExXSA9IHQ7ICAgXAorICAgIHQgID0gRV9LRVlbOCAqIGkgKyA0XSBeIGxzX2JveCh0KTsgICAgXAorICAgIEVfS0VZWzggKiBpICsgMTJdID0gdDsgICAgICAgICAgICAgICAgXAorICAgIHQgXj0gRV9LRVlbOCAqIGkgKyA1XTsgRV9LRVlbOCAqIGkgKyAxM10gPSB0OyAgIFwKKyAgICB0IF49IEVfS0VZWzggKiBpICsgNl07IEVfS0VZWzggKiBpICsgMTRdID0gdDsgICBcCisgICAgdCBePSBFX0tFWVs4ICogaSArIDddOyBFX0tFWVs4ICogaSArIDE1XSA9IHQ7ICAgXAorfQorCitzdGF0aWMgaW50CithZXNfc2V0X2tleSh2b2lkICpjdHhfYXJnLCBjb25zdCB1OCAqaW5fa2V5LCB1bnNpZ25lZCBpbnQga2V5X2xlbiwgdTMyICpmbGFncykKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwl1MzIgaSwgdCwgdSwgdiwgdzsKKworCWlmIChrZXlfbGVuICE9IDE2ICYmIGtleV9sZW4gIT0gMjQgJiYga2V5X2xlbiAhPSAzMikgeworCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWN0eC0+a2V5X2xlbmd0aCA9IGtleV9sZW47CisKKwlFX0tFWVswXSA9IHUzMl9pbiAoaW5fa2V5KTsKKwlFX0tFWVsxXSA9IHUzMl9pbiAoaW5fa2V5ICsgNCk7CisJRV9LRVlbMl0gPSB1MzJfaW4gKGluX2tleSArIDgpOworCUVfS0VZWzNdID0gdTMyX2luIChpbl9rZXkgKyAxMik7CisKKwlzd2l0Y2ggKGtleV9sZW4pIHsKKwljYXNlIDE2OgorCQl0ID0gRV9LRVlbM107CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorCQkJbG9vcDQgKGkpOworCQlicmVhazsKKworCWNhc2UgMjQ6CisJCUVfS0VZWzRdID0gdTMyX2luIChpbl9rZXkgKyAxNik7CisJCXQgPSBFX0tFWVs1XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjApOworCQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCQkJbG9vcDYgKGkpOworCQlicmVhazsKKworCWNhc2UgMzI6CisJCUVfS0VZWzRdID0gdTMyX2luIChpbl9rZXkgKyAxNik7CisJCUVfS0VZWzVdID0gdTMyX2luIChpbl9rZXkgKyAyMCk7CisJCUVfS0VZWzZdID0gdTMyX2luIChpbl9rZXkgKyAyNCk7CisJCXQgPSBFX0tFWVs3XSA9IHUzMl9pbiAoaW5fa2V5ICsgMjgpOworCQlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKQorCQkJbG9vcDggKGkpOworCQlicmVhazsKKwl9CisKKwlEX0tFWVswXSA9IEVfS0VZWzBdOworCURfS0VZWzFdID0gRV9LRVlbMV07CisJRF9LRVlbMl0gPSBFX0tFWVsyXTsKKwlEX0tFWVszXSA9IEVfS0VZWzNdOworCisJZm9yIChpID0gNDsgaSA8IGtleV9sZW4gKyAyNDsgKytpKSB7CisJCWltaXhfY29sIChEX0tFWVtpXSwgRV9LRVlbaV0pOworCX0KKworCXJldHVybiAwOworfQorCisvKiBlbmNyeXB0IGEgYmxvY2sgb2YgdGV4dCAqLworCisjZGVmaW5lIGZfbnJvdW5kKGJvLCBiaSwgaykgXAorICAgIGZfcm4oYm8sIGJpLCAwLCBrKTsgICAgIFwKKyAgICBmX3JuKGJvLCBiaSwgMSwgayk7ICAgICBcCisgICAgZl9ybihibywgYmksIDIsIGspOyAgICAgXAorICAgIGZfcm4oYm8sIGJpLCAzLCBrKTsgICAgIFwKKyAgICBrICs9IDQKKworI2RlZmluZSBmX2xyb3VuZChibywgYmksIGspIFwKKyAgICBmX3JsKGJvLCBiaSwgMCwgayk7ICAgICBcCisgICAgZl9ybChibywgYmksIDEsIGspOyAgICAgXAorICAgIGZfcmwoYm8sIGJpLCAyLCBrKTsgICAgIFwKKyAgICBmX3JsKGJvLCBiaSwgMywgaykKKworc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKQoreworCWNvbnN0IHN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCXUzMiBiMFs0XSwgYjFbNF07CisJY29uc3QgdTMyICprcCA9IEVfS0VZICsgNDsKKworCWIwWzBdID0gdTMyX2luIChpbikgXiBFX0tFWVswXTsKKwliMFsxXSA9IHUzMl9pbiAoaW4gKyA0KSBeIEVfS0VZWzFdOworCWIwWzJdID0gdTMyX2luIChpbiArIDgpIF4gRV9LRVlbMl07CisJYjBbM10gPSB1MzJfaW4gKGluICsgMTIpIF4gRV9LRVlbM107CisKKwlpZiAoY3R4LT5rZXlfbGVuZ3RoID4gMjQpIHsKKwkJZl9ucm91bmQgKGIxLCBiMCwga3ApOworCQlmX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJfQorCisJaWYgKGN0eC0+a2V5X2xlbmd0aCA+IDE2KSB7CisJCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwkJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCX0KKworCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlmX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJZl9ucm91bmQgKGIxLCBiMCwga3ApOworCWZfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlmX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJZl9ucm91bmQgKGIwLCBiMSwga3ApOworCWZfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlmX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJZl9ucm91bmQgKGIxLCBiMCwga3ApOworCWZfbHJvdW5kIChiMCwgYjEsIGtwKTsKKworCXUzMl9vdXQgKG91dCwgYjBbMF0pOworCXUzMl9vdXQgKG91dCArIDQsIGIwWzFdKTsKKwl1MzJfb3V0IChvdXQgKyA4LCBiMFsyXSk7CisJdTMyX291dCAob3V0ICsgMTIsIGIwWzNdKTsKK30KKworLyogZGVjcnlwdCBhIGJsb2NrIG9mIHRleHQgKi8KKworI2RlZmluZSBpX25yb3VuZChibywgYmksIGspIFwKKyAgICBpX3JuKGJvLCBiaSwgMCwgayk7ICAgICBcCisgICAgaV9ybihibywgYmksIDEsIGspOyAgICAgXAorICAgIGlfcm4oYm8sIGJpLCAyLCBrKTsgICAgIFwKKyAgICBpX3JuKGJvLCBiaSwgMywgayk7ICAgICBcCisgICAgayAtPSA0CisKKyNkZWZpbmUgaV9scm91bmQoYm8sIGJpLCBrKSBcCisgICAgaV9ybChibywgYmksIDAsIGspOyAgICAgXAorICAgIGlfcmwoYm8sIGJpLCAxLCBrKTsgICAgIFwKKyAgICBpX3JsKGJvLCBiaSwgMiwgayk7ICAgICBcCisgICAgaV9ybChibywgYmksIDMsIGspCisKK3N0YXRpYyB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwljb25zdCBzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwl1MzIgYjBbNF0sIGIxWzRdOworCWNvbnN0IGludCBrZXlfbGVuID0gY3R4LT5rZXlfbGVuZ3RoOworCWNvbnN0IHUzMiAqa3AgPSBEX0tFWSArIGtleV9sZW4gKyAyMDsKKworCWIwWzBdID0gdTMyX2luIChpbikgXiBFX0tFWVtrZXlfbGVuICsgMjRdOworCWIwWzFdID0gdTMyX2luIChpbiArIDQpIF4gRV9LRVlba2V5X2xlbiArIDI1XTsKKwliMFsyXSA9IHUzMl9pbiAoaW4gKyA4KSBeIEVfS0VZW2tleV9sZW4gKyAyNl07CisJYjBbM10gPSB1MzJfaW4gKGluICsgMTIpIF4gRV9LRVlba2V5X2xlbiArIDI3XTsKKworCWlmIChrZXlfbGVuID4gMjQpIHsKKwkJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCQlpX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJfQorCisJaWYgKGtleV9sZW4gPiAxNikgeworCQlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwl9CisKKwlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJaV9ucm91bmQgKGIwLCBiMSwga3ApOworCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlpX25yb3VuZCAoYjAsIGIxLCBrcCk7CisJaV9ucm91bmQgKGIxLCBiMCwga3ApOworCWlfbnJvdW5kIChiMCwgYjEsIGtwKTsKKwlpX25yb3VuZCAoYjEsIGIwLCBrcCk7CisJaV9ucm91bmQgKGIwLCBiMSwga3ApOworCWlfbnJvdW5kIChiMSwgYjAsIGtwKTsKKwlpX2xyb3VuZCAoYjAsIGIxLCBrcCk7CisKKwl1MzJfb3V0IChvdXQsIGIwWzBdKTsKKwl1MzJfb3V0IChvdXQgKyA0LCBiMFsxXSk7CisJdTMyX291dCAob3V0ICsgOCwgYjBbMl0pOworCXUzMl9vdXQgKG91dCArIDEyLCBiMFszXSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc19hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJhZXMiLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBhZXNfY3R4KSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCisJLmNyYV91CQkJPQl7CisJCS5jaXBoZXIgPSB7CisJCQkuY2lhX21pbl9rZXlzaXplCT0JQUVTX01JTl9LRVlfU0laRSwKKwkJCS5jaWFfbWF4X2tleXNpemUJPQlBRVNfTUFYX0tFWV9TSVpFLAorCQkJLmNpYV9zZXRrZXkJCT0gCWFlc19zZXRfa2V5LAorCQkJLmNpYV9lbmNyeXB0CQk9CWFlc19lbmNyeXB0LAorCQkJLmNpYV9kZWNyeXB0CQk9CWFlc19kZWNyeXB0CisJCX0KKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZXNfaW5pdCh2b2lkKQoreworCWdlbl90YWJzKCk7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWVzX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOworfQorCittb2R1bGVfaW5pdChhZXNfaW5pdCk7Cittb2R1bGVfZXhpdChhZXNfZmluaSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUmlqbmRhZWwgKEFFUykgQ2lwaGVyIEFsZ29yaXRobSIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FwaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjI3ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hcGkuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIFNjYXR0ZXJsaXN0IENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgorICogYW5kIE5ldHRsZSwgYnkgTmllbHMgTemwiGxlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgImttYXBfdHlwZXMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK0xJU1RfSEVBRChjcnlwdG9fYWxnX2xpc3QpOworREVDTEFSRV9SV1NFTShjcnlwdG9fYWxnX3NlbSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19hbGdfZ2V0KHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJcmV0dXJuIHRyeV9pbmNfbW9kX2NvdW50KGFsZy0+Y3JhX21vZHVsZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fYWxnX3B1dChzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCWlmIChhbGctPmNyYV9tb2R1bGUpCisJCV9fTU9EX0RFQ19VU0VfQ09VTlQoYWxnLT5jcmFfbW9kdWxlKTsKK30KKworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNyeXB0b19hbGcgKnEsICphbGcgPSBOVUxMOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmY3J5cHRvX2FsZ19saXN0LCBjcmFfbGlzdCkgeworCQlpZiAoIShzdHJjbXAocS0+Y3JhX25hbWUsIG5hbWUpKSkgeworCQkJaWYgKGNyeXB0b19hbGdfZ2V0KHEpKQorCQkJCWFsZyA9IHE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXVwX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKKwlyZXR1cm4gYWxnOworfQorCitzdGF0aWMgaW50IGNyeXB0b19pbml0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3sKKwl0Zm0tPmNydF9mbGFncyA9IDA7CisKKwlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSkgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NpcGhlcl9mbGFncyh0Zm0sIGZsYWdzKTsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2RpZ2VzdF9mbGFncyh0Zm0sIGZsYWdzKTsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgorCQlyZXR1cm4gY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3ModGZtLCBmbGFncyk7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlCVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjcnlwdG9faW5pdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzd2l0Y2ggKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSkgeworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2NpcGhlcl9vcHModGZtKTsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVDoKKwkJcmV0dXJuIGNyeXB0b19pbml0X2RpZ2VzdF9vcHModGZtKTsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgorCQlyZXR1cm4gY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHRmbSk7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlCVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgY3J5cHRvX2V4aXRfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkpIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DSVBIRVI6CisJCWNyeXB0b19leGl0X2NpcGhlcl9vcHModGZtKTsKKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCWNyeXB0b19leGl0X2RpZ2VzdF9vcHModGZtKTsKKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHRmbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisKKwl9Cit9CisKK3N0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfdGZtKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gTlVMTDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCisJYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUpOworCWlmIChhbGcgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwl0Zm0gPSBrbWFsbG9jKHNpemVvZigqdGZtKSArIGFsZy0+Y3JhX2N0eHNpemUsIEdGUF9LRVJORUwpOworCWlmICh0Zm0gPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJbWVtc2V0KHRmbSwgMCwgc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZSk7CisKKwl0Zm0tPl9fY3J0X2FsZyA9IGFsZzsKKworCWlmIChjcnlwdG9faW5pdF9mbGFncyh0Zm0sIGZsYWdzKSkKKwkJZ290byBvdXRfZnJlZV90Zm07CisKKwlpZiAoY3J5cHRvX2luaXRfb3BzKHRmbSkpIHsKKwkJY3J5cHRvX2V4aXRfb3BzKHRmbSk7CisJCWdvdG8gb3V0X2ZyZWVfdGZtOworCX0KKworCWdvdG8gb3V0OworCitvdXRfZnJlZV90Zm06CisJa2ZyZWUodGZtKTsKKwl0Zm0gPSBOVUxMOworb3V0X3B1dDoKKwljcnlwdG9fYWxnX3B1dChhbGcpOworb3V0OgorCXJldHVybiB0Zm07Cit9CisKK3ZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOworCWludCBzaXplID0gc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZTsKKworCWNyeXB0b19leGl0X29wcyh0Zm0pOworCWNyeXB0b19hbGdfcHV0KGFsZyk7CisJbWVtc2V0KHRmbSwgMCwgc2l6ZSk7CisJa2ZyZWUodGZtKTsKK30KKworaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqcTsKKworCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKCEoc3RyY21wKHEtPmNyYV9uYW1lLCBhbGctPmNyYV9uYW1lKSkpIHsKKwkJCXJldCA9IC1FRVhJU1Q7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxpc3RfYWRkX3RhaWwoJmFsZy0+Y3JhX2xpc3QsICZjcnlwdG9fYWxnX2xpc3QpOworb3V0OgorCXVwX3dyaXRlKCZjcnlwdG9fYWxnX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGNyeXB0b191bnJlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCWludCByZXQgPSAtRU5PRU5UOworCXN0cnVjdCBjcnlwdG9fYWxnICpxOworCisJQlVHX09OKCFhbGctPmNyYV9tb2R1bGUpOworCisJZG93bl93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKKwkJaWYgKGFsZyA9PSBxKSB7CisJCQlsaXN0X2RlbCgmYWxnLT5jcmFfbGlzdCk7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJdXBfd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSBjcnlwdG9fYWxnX21vZF9sb29rdXAobmFtZSk7CisKKwlpZiAoYWxnKSB7CisJCWNyeXB0b19hbGdfcHV0KGFsZyk7CisJCXJldCA9IDE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jcnlwdG8odm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgQ3J5cHRvZ3JhcGhpYyBBUElcbiIpOworCWNyeXB0b19pbml0X3Byb2MoKTsKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChpbml0X2NyeXB0byk7CisKKy8qCitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fcmVnaXN0ZXJfYWxnKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b191bnJlZ2lzdGVyX2FsZyk7CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxsb2NfdGZtKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19mcmVlX3RmbSk7CitFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fYWxnX2F2YWlsYWJsZSk7CisqLworCitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fcmVnaXN0ZXJfYWxnKTsKK0VYUE9SVF9TWU1CT0xfTk9WRVJTKGNyeXB0b191bnJlZ2lzdGVyX2FsZyk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fYWxsb2NfdGZtKTsKK0VYUE9SVF9TWU1CT0xfTk9WRVJTKGNyeXB0b19mcmVlX3RmbSk7CitFWFBPUlRfU1lNQk9MX05PVkVSUyhjcnlwdG9fYWxnX2F2YWlsYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvYXJjNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWQ4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2FyYzQuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJCisgKgorICogQVJDNCBDaXBoZXIgQWxnb3JpdGhtCisgKgorICogSm9uIE9iZXJoZWlkZSA8am9uQG9iZXJoZWlkZS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorCisjZGVmaW5lIEFSQzRfTUlOX0tFWV9TSVpFCTEKKyNkZWZpbmUgQVJDNF9NQVhfS0VZX1NJWkUJMjU2CisjZGVmaW5lIEFSQzRfQkxPQ0tfU0laRQkJMQorCitzdHJ1Y3QgYXJjNF9jdHggeworCXU4IFNbMjU2XTsKKwl1OCB4LCB5OworfTsKKworc3RhdGljIGludCBhcmM0X3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHUzMiAqZmxhZ3MpCit7CisJc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjdHhfYXJnOworCWludCBpLCBqID0gMCwgayA9IDA7CisKKwljdHgtPnggPSAxOworCWN0eC0+eSA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJY3R4LT5TW2ldID0gaTsKKworCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCXsKKwkJdTggYSA9IGN0eC0+U1tpXTsKKwkJaiA9IChqICsgaW5fa2V5W2tdICsgYSkgJiAweGZmOworCQljdHgtPlNbaV0gPSBjdHgtPlNbal07CisJCWN0eC0+U1tqXSA9IGE7CisJCWlmKCh1bnNpZ25lZCBpbnQpKytrID49IGtleV9sZW4pCisJCQlrID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXJjNF9jcnlwdCh2b2lkICpjdHhfYXJnLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJc3RydWN0IGFyYzRfY3R4ICpjdHggPSBjdHhfYXJnOworCisJdTggKmNvbnN0IFMgPSBjdHgtPlM7CisJdTggeCA9IGN0eC0+eDsKKwl1OCB5ID0gY3R4LT55OworCXU4IGEsIGI7CisKKwlhID0gU1t4XTsKKwl5ID0gKHkgKyBhKSAmIDB4ZmY7CisJYiA9IFNbeV07CisJU1t4XSA9IGI7CisJU1t5XSA9IGE7CisJeCA9ICh4ICsgMSkgJiAweGZmOworCSpvdXQrKyA9ICppbiBeIFNbKGEgKyBiKSAmIDB4ZmZdOworCisJY3R4LT54ID0geDsKKwljdHgtPnkgPSB5OworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYXJjNF9hbGcgPSB7CisJLmNyYV9uYW1lCQk9CSJhcmM0IiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQVJDNF9CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGFyYzRfY3R4KSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYXJjNF9hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeyAuY2lwaGVyID0geworCS5jaWFfbWluX2tleXNpemUJPQlBUkM0X01JTl9LRVlfU0laRSwKKwkuY2lhX21heF9rZXlzaXplCT0JQVJDNF9NQVhfS0VZX1NJWkUsCisJLmNpYV9zZXRrZXkJCT0gCWFyYzRfc2V0X2tleSwKKwkuY2lhX2VuY3J5cHQJCT0JYXJjNF9jcnlwdCwKKwkuY2lhX2RlY3J5cHQJCT0JYXJjNF9jcnlwdCB9IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFyYzRfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhcmM0X2FsZyk7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGFyYzRfZXhpdCh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYXJjNF9hbGcpOworfQorCittb2R1bGVfaW5pdChhcmM0X2luaXQpOworbW9kdWxlX2V4aXQoYXJjNF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBUkM0IENpcGhlciBBbGdvcml0aG0iKTsKK01PRFVMRV9BVVRIT1IoIkpvbiBPYmVyaGVpZGUgPGpvbkBvYmVyaGVpZGUub3JnPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9hdXRvbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Nzc1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2F1dG9sb2FkLmMKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIEFsZ29yaXRobSBhdXRvbG9hZGVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgImttYXBfdHlwZXMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKgorICogQSBmYXIgbW9yZSBpbnRlbGxpZ2VudCB2ZXJzaW9uIG9mIHRoaXMgaXMgcGxhbm5lZC4gIEZvciBub3csIGp1c3QKKyAqIHRyeSBhbiBleGFjdCBtYXRjaCBvbiB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLgorICovCit2b2lkIGNyeXB0b19hbGdfYXV0b2xvYWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXF1ZXN0X21vZHVsZShuYW1lKTsKK30KKworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSBjcnlwdG9fYWxnX2xvb2t1cChuYW1lKTsKKwlpZiAoYWxnID09IE5VTEwpIHsKKwkJY3J5cHRvX2FsZ19hdXRvbG9hZChuYW1lKTsKKwkJYWxnID0gY3J5cHRvX2FsZ19sb29rdXAobmFtZSk7CisJfQorCXJldHVybiBhbGc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NpcGhlci5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjllOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jaXBoZXIuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENpcGhlciBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSAicnRsX2NyeXB0by5oIgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgorCit0eXBlZGVmIHZvaWQgKGNyeXB0Zm5fdCkodm9pZCAqLCB1OCAqLCBjb25zdCB1OCAqKTsKK3R5cGVkZWYgdm9pZCAocHJvY2ZuX3QpKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosCisJCQl1OCosIGNyeXB0Zm5fdCwgaW50IGVuYywgdm9pZCAqLCBpbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yXzY0KHU4ICphLCBjb25zdCB1OCAqYikKK3sKKwkoKHUzMiAqKWEpWzBdIF49ICgodTMyICopYilbMF07CisJKCh1MzIgKilhKVsxXSBePSAoKHUzMiAqKWIpWzFdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yXzEyOCh1OCAqYSwgY29uc3QgdTggKmIpCit7CisJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOworCSgodTMyICopYSlbMV0gXj0gKCh1MzIgKiliKVsxXTsKKwkoKHUzMiAqKWEpWzJdIF49ICgodTMyICopYilbMl07CisJKCh1MzIgKilhKVszXSBePSAoKHUzMiAqKWIpWzNdOworfQorCisKKy8qCisgKiBHZW5lcmljIGVuY3J5cHQvZGVjcnlwdCB3cmFwcGVyIGZvciBjaXBoZXJzLCBoYW5kbGVzIG9wZXJhdGlvbnMgYWNyb3NzCisgKiBtdWx0aXBsZSBwYWdlIGJvdW5kYXJpZXMgYnkgdXNpbmcgdGVtcG9yYXJ5IGJsb2Nrcy4gIEluIHVzZXIgY29udGV4dCwKKyAqIHRoZSBrZXJuZWwgaXMgZ2l2ZW4gYSBjaGFuY2UgdG8gc2NoZWR1bGUgdXMgb25jZSBwZXIgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzLCBjcnlwdGZuX3QgY3JmbiwKKwkJIHByb2Nmbl90IHByZm4sIGludCBlbmMsIHZvaWQgKmluZm8pCit7CisJc3RydWN0IHNjYXR0ZXJfd2FsayB3YWxrX2luLCB3YWxrX291dDsKKwljb25zdCB1bnNpZ25lZCBpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKKwl1OCB0bXBfc3JjW2JzaXplXTsKKwl1OCB0bXBfZHN0W2JzaXplXTsKKworCWlmICghbmJ5dGVzKQorCQlyZXR1cm4gMDsKKworCWlmIChuYnl0ZXMgJSBic2l6ZSkgeworCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfQkxPQ0tfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19pbiwgc3JjKTsKKwlzY2F0dGVyd2Fsa19zdGFydCgmd2Fsa19vdXQsIGRzdCk7CisKKwlmb3IoOzspIHsKKwkJdTggKnNyY19wLCAqZHN0X3A7CisJCWludCBpbl9wbGFjZTsKKworCQlzY2F0dGVyd2Fsa19tYXAoJndhbGtfaW4sIDApOworCQlzY2F0dGVyd2Fsa19tYXAoJndhbGtfb3V0LCAxKTsKKwkJc3JjX3AgPSBzY2F0dGVyd2Fsa193aGljaGJ1Zigmd2Fsa19pbiwgYnNpemUsIHRtcF9zcmMpOworCQlkc3RfcCA9IHNjYXR0ZXJ3YWxrX3doaWNoYnVmKCZ3YWxrX291dCwgYnNpemUsIHRtcF9kc3QpOworCQlpbl9wbGFjZSA9IHNjYXR0ZXJ3YWxrX3NhbWVidWYoJndhbGtfaW4sICZ3YWxrX291dCwKKwkJCQkJICAgICAgIHNyY19wLCBkc3RfcCk7CisKKwkJbmJ5dGVzIC09IGJzaXplOworCisJCXNjYXR0ZXJ3YWxrX2NvcHljaHVua3Moc3JjX3AsICZ3YWxrX2luLCBic2l6ZSwgMCk7CisKKwkJcHJmbih0Zm0sIGRzdF9wLCBzcmNfcCwgY3JmbiwgZW5jLCBpbmZvLCBpbl9wbGFjZSk7CisKKwkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19pbiwgMCwgbmJ5dGVzKTsKKworCQlzY2F0dGVyd2Fsa19jb3B5Y2h1bmtzKGRzdF9wLCAmd2Fsa19vdXQsIGJzaXplLCAxKTsKKwkJc2NhdHRlcndhbGtfZG9uZSgmd2Fsa19vdXQsIDEsIG5ieXRlcyk7CisKKwkJaWYgKCFuYnl0ZXMpCisJCQlyZXR1cm4gMDsKKworCQljcnlwdG9feWllbGQodGZtKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNiY19wcm9jZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCisJCQljcnlwdGZuX3QgZm4sIGludCBlbmMsIHZvaWQgKmluZm8sIGludCBpbl9wbGFjZSkKK3sKKwl1OCAqaXYgPSBpbmZvOworCisJLyogTnVsbCBlbmNyeXB0aW9uICovCisJaWYgKCFpdikKKwkJcmV0dXJuOworCisJaWYgKGVuYykgeworCQl0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrKGl2LCBzcmMpOworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIGl2KTsKKwkJbWVtY3B5KGl2LCBkc3QsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwl9IGVsc2UgeworCQl1OCBzdGFja1tpbl9wbGFjZSA/IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pIDogMF07CisJCXU4ICpidWYgPSBpbl9wbGFjZSA/IHN0YWNrIDogZHN0OworCisJCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGJ1Ziwgc3JjKTsKKwkJdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jayhidWYsIGl2KTsKKwkJbWVtY3B5KGl2LCBzcmMsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwkJaWYgKGJ1ZiAhPSBkc3QpCisJCQltZW1jcHkoZHN0LCBidWYsIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVjYl9wcm9jZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCisJCQljcnlwdGZuX3QgZm4sIGludCBlbmMsIHZvaWQgKmluZm8sIGludCBpbl9wbGFjZSkKK3sKKwlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBpbnQgc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpYSA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWlmIChrZXlsZW4gPCBjaWEtPmNpYV9taW5fa2V5c2l6ZSB8fCBrZXlsZW4gPiBjaWEtPmNpYV9tYXhfa2V5c2l6ZSkgeworCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlCisJCXJldHVybiBjaWEtPmNpYV9zZXRrZXkoY3J5cHRvX3RmbV9jdHgodGZtKSwga2V5LCBrZXlsZW4sCisJCQkJICAgICAgICZ0Zm0tPmNydF9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZWNiX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKKwkJICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKKwkJICAgICBlY2JfcHJvY2VzcywgMSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZWNiX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCisJCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCisJCSAgICAgZWNiX3Byb2Nlc3MsIDEsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGNiY19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAorCQkgICAgIGNiY19wcm9jZXNzLCAxLCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2KTsKK30KKworc3RhdGljIGludCBjYmNfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAorCQkgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAorCQkgICAgIGNiY19wcm9jZXNzLCAxLCBpdik7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCisJCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCisJCSAgICAgY2JjX3Byb2Nlc3MsIDAsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOworfQorCitzdGF0aWMgaW50IGNiY19kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQoreworCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCisJCSAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCisJCSAgICAgY2JjX3Byb2Nlc3MsIDAsIGl2KTsKK30KKworc3RhdGljIGludCBub2NyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGludCBub2NyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQoreworCXJldHVybiAtRU5PU1lTOworfQorCitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKK3sKKwl1MzIgbW9kZSA9IGZsYWdzICYgQ1JZUFRPX1RGTV9NT0RFX01BU0s7CisKKwl0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPSBtb2RlID8gbW9kZSA6IENSWVBUT19URk1fTU9ERV9FQ0I7CisJaWYgKGZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpCisJCXRmbS0+Y3J0X2ZsYWdzID0gQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNyeXB0b19pbml0X2NpcGhlcl9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2lwaGVyX3RmbSAqb3BzID0gJnRmbS0+Y3J0X2NpcGhlcjsKKworCW9wcy0+Y2l0X3NldGtleSA9IHNldGtleTsKKworCXN3aXRjaCAodGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlKSB7CisJY2FzZSBDUllQVE9fVEZNX01PREVfRUNCOgorCQlvcHMtPmNpdF9lbmNyeXB0ID0gZWNiX2VuY3J5cHQ7CisJCW9wcy0+Y2l0X2RlY3J5cHQgPSBlY2JfZGVjcnlwdDsKKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19URk1fTU9ERV9DQkM6CisJCW9wcy0+Y2l0X2VuY3J5cHQgPSBjYmNfZW5jcnlwdDsKKwkJb3BzLT5jaXRfZGVjcnlwdCA9IGNiY19kZWNyeXB0OworCQlvcHMtPmNpdF9lbmNyeXB0X2l2ID0gY2JjX2VuY3J5cHRfaXY7CisJCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBjYmNfZGVjcnlwdF9pdjsKKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19URk1fTU9ERV9DRkI6CisJCW9wcy0+Y2l0X2VuY3J5cHQgPSBub2NyeXB0OworCQlvcHMtPmNpdF9kZWNyeXB0ID0gbm9jcnlwdDsKKwkJb3BzLT5jaXRfZW5jcnlwdF9pdiA9IG5vY3J5cHRfaXY7CisJCW9wcy0+Y2l0X2RlY3J5cHRfaXYgPSBub2NyeXB0X2l2OworCQlicmVhazsKKworCWNhc2UgQ1JZUFRPX1RGTV9NT0RFX0NUUjoKKwkJb3BzLT5jaXRfZW5jcnlwdCA9IG5vY3J5cHQ7CisJCW9wcy0+Y2l0X2RlY3J5cHQgPSBub2NyeXB0OworCQlvcHMtPmNpdF9lbmNyeXB0X2l2ID0gbm9jcnlwdF9pdjsKKwkJb3BzLT5jaXRfZGVjcnlwdF9pdiA9IG5vY3J5cHRfaXY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJaWYgKG9wcy0+Y2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0NCQykgeworCisJCXN3aXRjaCAoY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpIHsKKwkJY2FzZSA4OgorCQkJb3BzLT5jaXRfeG9yX2Jsb2NrID0geG9yXzY0OworCQkJYnJlYWs7CisKKwkJY2FzZSAxNjoKKwkJCW9wcy0+Y2l0X3hvcl9ibG9jayA9IHhvcl8xMjg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJsb2NrIHNpemUgJXUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSAgICAgICBjcnlwdG9fdGZtX2FsZ19uYW1lKHRmbSksCisJCQkgICAgICAgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJb3BzLT5jaXRfaXZzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7CisJCW9wcy0+Y2l0X2l2ID0ga21hbGxvYyhvcHMtPmNpdF9pdnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAob3BzLT5jaXRfaXYgPT0gTlVMTCkKKwkJCXJldCA9IC1FTk9NRU07CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaWYgKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpCisJCWtmcmVlKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzIzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NvbXByZXNzLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvbXByZXNzaW9uIG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgY3J5cHRvX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJCQkgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQoreworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NvbXByZXNzLmNvYV9jb21wcmVzcyhjcnlwdG9fdGZtX2N0eCh0Zm0pLAorCQkJCQkJCSBzcmMsIHNsZW4sIGRzdCwKKwkJCQkJCQkgZGxlbik7Cit9CisKK3N0YXRpYyBpbnQgY3J5cHRvX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJCQkgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfZGVjb21wcmVzcyhjcnlwdG9fdGZtX2N0eCh0Zm0pLAorCQkJCQkJCSAgIHNyYywgc2xlbiwgZHN0LAorCQkJCQkJCSAgIGRsZW4pOworfQorCitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQoreworCXJldHVybiBmbGFncyA/IC1FSU5WQUwgOiAwOworfQorCitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNvbXByZXNzX3RmbSAqb3BzID0gJnRmbS0+Y3J0X2NvbXByZXNzOworCisJcmV0ID0gdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW9wcy0+Y290X2NvbXByZXNzID0gY3J5cHRvX2NvbXByZXNzOworCW9wcy0+Y290X2RlY29tcHJlc3MgPSBjcnlwdG9fZGVjb21wcmVzczsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJdGZtLT5fX2NydF9hbGctPmNyYV9jb21wcmVzcy5jb2FfZXhpdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jcnlwdG9fY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0ODY1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY3J5cHRvX2NvbXBhdC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBIZWFkZXIgZmlsZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IGFtb25nIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgIDxsYXdyZW5jZV93YW5nQHJlYWxzaWwuY29tLmNuPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cit9CisKKyBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IE5VTEw7CisJaW50IGVycjsKKwlwcmludGsoImNhbGwgY3J5cHRvX2FsbG9jX3RmbSEhIVxuIik7CisJZG8geworCQlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCisJCWFsZyA9IGNyeXB0b19hbGdfbW9kX2xvb2t1cChuYW1lLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwkJZXJyID0gUFRSX0VSUihhbGcpOworCQlpZiAoSVNfRVJSKGFsZykpCisJCQljb250aW51ZTsKKworCQl0Zm0gPSBfX2NyeXB0b19hbGxvY190Zm0oYWxnLCBmbGFncyk7CisJCWVyciA9IDA7CisJCWlmIChJU19FUlIodGZtKSkgeworCQkJY3J5cHRvX21vZF9wdXQoYWxnKTsKKwkJCWVyciA9IFBUUl9FUlIodGZtKTsKKwkJCXRmbSA9IE5VTEw7CisJCX0KKwl9IHdoaWxlIChlcnIgPT0gLUVBR0FJTiAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOworCisJcmV0dXJuIHRmbTsKK30KKy8vRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX2FsbG9jX3RmbSk7CisvL0VYUE9SVF9TWU1CT0xfR1BMKGNyeXB0b19mcmVlX3RmbSk7CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kaWdlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxZWQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZGlnZXN0LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBEaWdlc3Qgb3BlcmF0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkIGluaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspIHsKKworCQlzdHJ1Y3QgcGFnZSAqcGcgPSBzZ1tpXS5wYWdlOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2dbaV0ub2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgbCA9IHNnW2ldLmxlbmd0aDsKKworCQlkbyB7CisJCQl1bnNpZ25lZCBpbnQgYnl0ZXNfZnJvbV9wYWdlID0gbWluKGwsICgodW5zaWduZWQgaW50KQorCQkJCQkJCSAgIChQQUdFX1NJWkUpKSAtCisJCQkJCQkJICAgb2Zmc2V0KTsKKwkJCWNoYXIgKnAgPSBjcnlwdG9fa21hcChwZywgMCkgKyBvZmZzZXQ7CisKKwkJCXRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV91cGRhdGUKKwkJCQkJKGNyeXB0b190Zm1fY3R4KHRmbSksIHAsCisJCQkJCSBieXRlc19mcm9tX3BhZ2UpOworCQkJY3J5cHRvX2t1bm1hcChwLCAwKTsKKwkJCWNyeXB0b195aWVsZCh0Zm0pOworCQkJb2Zmc2V0ID0gMDsKKwkJCXBnKys7CisJCQlsIC09IGJ5dGVzX2Zyb21fcGFnZTsKKwkJfSB3aGlsZSAobCA+IDApOworCX0KK30KKworc3RhdGljIHZvaWQgZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKK3sKKwl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZmluYWwoY3J5cHRvX3RmbV9jdHgodGZtKSwgb3V0KTsKK30KKworc3RhdGljIGludCBzZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwl1MzIgZmxhZ3M7CisJaWYgKHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9TWVM7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9zZXRrZXkoY3J5cHRvX3RmbV9jdHgodGZtKSwKKwkJCQkJCSAgICAga2V5LCBrZXlsZW4sICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQoreworCXVuc2lnbmVkIGludCBpOworCisJdGZtLT5jcnRfZGlnZXN0LmRpdF9pbml0KHRmbSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnNnOyBpKyspIHsKKwkJY2hhciAqcCA9IGNyeXB0b19rbWFwKHNnW2ldLnBhZ2UsIDApICsgc2dbaV0ub2Zmc2V0OworCQl0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfdXBkYXRlKGNyeXB0b190Zm1fY3R4KHRmbSksCisJCQkJCQkgICAgICBwLCBzZ1tpXS5sZW5ndGgpOworCQljcnlwdG9fa3VubWFwKHAsIDApOworCQljcnlwdG9feWllbGQodGZtKTsKKwl9CisJY3J5cHRvX2RpZ2VzdF9maW5hbCh0Zm0sIG91dCk7Cit9CisKK2ludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQoreworCXJldHVybiBmbGFncyA/IC1FSU5WQUwgOiAwOworfQorCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBkaWdlc3RfdGZtICpvcHMgPSAmdGZtLT5jcnRfZGlnZXN0OworCisJb3BzLT5kaXRfaW5pdAk9IGluaXQ7CisJb3BzLT5kaXRfdXBkYXRlCT0gdXBkYXRlOworCW9wcy0+ZGl0X2ZpbmFsCT0gZmluYWw7CisJb3BzLT5kaXRfZGlnZXN0CT0gZGlnZXN0OworCW9wcy0+ZGl0X3NldGtleQk9IHNldGtleTsKKworCXJldHVybiBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayh0Zm0pOworfQorCit2b2lkIGNyeXB0b19leGl0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwljcnlwdG9fZnJlZV9obWFjX2Jsb2NrKHRmbSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFjYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwpAQCAtMCwwICsxLDIyMyBAQAorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCUZpbGU6CisvLwkJRG90MTFkLmMKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlJbXBsZW1lbnQgODAyLjExZC4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJkb3QxMWQuaCIKKwordm9pZAorRG90MTFkX0luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOworCisJcERvdDExZEluZm8tPmJFbmFibGVkID0gMDsKKworCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOworCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOworCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKworCXByaW50aygiRG90MTFkX0luaXQoKVxuIik7Cit9CisKKy8vCisvLwlEZXNjcmlwdGlvbjoKKy8vCQlSZXNldCB0byB0aGUgc3RhdGUgYXMgd2UgYXJlIGp1c3QgZW50ZXJpbmcgYSByZWd1bGF0b3J5IGRvbWFpbi4KKy8vCit2b2lkCitEb3QxMWRfUmVzZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdTMyIGk7CisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOworCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAorCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKKwlmb3IgKGk9MTsgaTw9MTE7IGkrKykgeworCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7CisJfQorCWZvciAoaT0xMjsgaTw9MTQ7IGkrKykgeworCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDI7CisJfQorCisJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7CisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7CisJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCisJLy9wcmludGsoIkRvdDExZF9SZXNldCgpXG4iKTsKK30KKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVVwZGF0ZSBjb3VudHJ5IElFIGZyb20gQmVhY29uIG9yIFByb2JlIFJlc29wbnNlCisvLwkJYW5kIGNvbmZpZ3VyZSBQSFkgZm9yIG9wZXJhdGlvbiBpbiB0aGUgcmVndWxhdG9yeSBkb21haW4uCisvLworLy8JVE9ETzoKKy8vCQlDb25maWd1cmUgVHggcG93ZXIuCisvLworLy8JQXNzdW1wdGlvbjoKKy8vCQkxLiBJU19ET1QxMURfRU5BQkxFKCkgaXMgVFJVRS4KKy8vCQkyLiBJbnB1dCBJRSBpcyBhbiB2YWxpZCBvbmUuCisvLwordm9pZAorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAorCXU4ICoJCXBUYWRkciwKKwl1MTYJQ291dHJ5SWVMZW4sCisJdTggKiBwQ291dHJ5SWUKKwkpCit7CisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CisJdTggaSwgaiwgTnVtVHJpcGxlcywgTWF4Q2hubE51bTsKKwlQQ0hOTF9UWFBPV0VSX1RSSVBMRSBwVHJpcGxlOworCisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJTWF4Q2hubE51bSA9IDA7CisJTnVtVHJpcGxlcyA9IChDb3V0cnlJZUxlbiAtIDMpIC8gMzsgLy8gc2tpcCAzLWJ5dGUgY291bnRyeSBzdHJpbmcuCisJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkocENvdXRyeUllICsgMyk7CisJZm9yKGkgPSAwOyBpIDwgTnVtVHJpcGxlczsgaSsrKQorCXsKKwkJaWYoTWF4Q2hubE51bSA+PSBwVHJpcGxlLT5GaXJzdENobmwpCisJCXsgLy8gSXQgaXMgbm90IGluIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yZGVyLCBzbyBzdG9wIHByb2Nlc3NpbmcuCisJCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCAocFRyaXBsZS0+Rmlyc3RDaG5sICsgcFRyaXBsZS0+TnVtQ2hubHMpKQorCQl7IC8vIEl0IGlzIG5vdCBhIHZhbGlkIHNldCBvZiBjaGFubmVsIGlkLCBzbyBzdG9wIHByb2Nlc3NpbmcuCisJCQlwcmludGsoIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4yXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvcihqID0gMCA7IGogPCBwVHJpcGxlLT5OdW1DaG5sczsgaisrKQorCQl7CisJCQlwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSAxOworCQkJcERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdFtwVHJpcGxlLT5GaXJzdENobmwgKyBqXSA9IHBUcmlwbGUtPk1heFR4UG93ZXJJbkRibTsKKwkJCU1heENobmxOdW0gPSBwVHJpcGxlLT5GaXJzdENobmwgKyBqOworCQl9CisKKwkJcFRyaXBsZSA9IChQQ0hOTF9UWFBPV0VSX1RSSVBMRSkoKHU4KilwVHJpcGxlICsgMyk7CisJfQorCS8vcHJpbnRrKCJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IENoYW5uZWwgTGlzdDpcbiIpOworCXByaW50aygiQ2hhbm5lbCBMaXN0OiIpOworCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKKwkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkKKwkJCXByaW50aygiICVkIiwgaSk7CisJcHJpbnRrKCJcbiIpOworCisJVVBEQVRFX0NJRV9TUkMoZGV2LCBwVGFkZHIpOworCisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IENvdXRyeUllTGVuOworCW1lbWNweShwRG90MTFkSW5mby0+Q291bnRyeUllQnVmLCBwQ291dHJ5SWUsQ291dHJ5SWVMZW4pOworCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9MRUFSTkVEOworfQorCisKK3U4CitET1QxMURfR2V0TWF4VHhQd3JJbkRibSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAorCXU4IENoYW5uZWwKKwkpCit7CisJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CisJdTggTWF4VHhQd3JJbkRibSA9IDI1NTsKKworCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IENoYW5uZWwpCisJeworCQlwcmludGsoIkRPVDExRF9HZXRNYXhUeFB3ckluRGJtKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7CisJCXJldHVybiBNYXhUeFB3ckluRGJtOworCX0KKwlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbQ2hhbm5lbF0pCisJeworCQlNYXhUeFB3ckluRGJtID0gcERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdFtDaGFubmVsXTsKKwl9CisKKwlyZXR1cm4gTWF4VHhQd3JJbkRibTsKK30KKworCit2b2lkCitET1QxMURfU2NhbkNvbXBsZXRlKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICogZGV2CisJKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCisJc3dpdGNoKHBEb3QxMWRJbmZvLT5TdGF0ZSkKKwl7CisJY2FzZSBET1QxMURfU1RBVEVfTEVBUk5FRDoKKwkJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX0RPTkU7CisJCWJyZWFrOworCisJY2FzZSBET1QxMURfU1RBVEVfRE9ORToKKwkJaWYoIEdFVF9DSUVfV0FUQ0hET0coZGV2KSA9PSAwICkKKwkJeyAvLyBSZXNldCBjb3VudHJ5IElFIGlmIHByZXZpb3VzIG9uZSBpcyBnb25lLgorCQkJRG90MTFkX1Jlc2V0KGRldik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBET1QxMURfU1RBVEVfTk9ORToKKwkJYnJlYWs7CisJfQorfQorCitpbnQgSXNMZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCisJaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkKKwl7CisJCXByaW50aygiSXNMZWdhbENoYW5uZWwoKTogSW52YWxpZCBDaGFubmVsXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgVG9MZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKQoreworCVBSVF9ET1QxMURfSU5GTyBwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhkZXYpOworCXU4IGRlZmF1bHRfY2huID0gMDsKKwl1MzIgaSA9IDA7CisKKwlmb3IgKGk9MTsgaTw9IE1BWF9DSEFOTkVMX05VTUJFUjsgaSsrKQorCXsKKwkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkKKwkJeworCQkJZGVmYXVsdF9jaG4gPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKQorCXsKKwkJcHJpbnRrKCJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOworCQlyZXR1cm4gZGVmYXVsdF9jaG47CisJfQorCisJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKKwkJcmV0dXJuIGNoYW5uZWw7CisKKwlyZXR1cm4gZGVmYXVsdF9jaG47Cit9CitFWFBPUlRfU1lNQk9MKERvdDExZF9Jbml0KTsKK0VYUE9SVF9TWU1CT0woRG90MTFkX1Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woRG90MTFkX1VwZGF0ZUNvdW50cnlJZSk7CitFWFBPUlRfU1lNQk9MKERPVDExRF9HZXRNYXhUeFB3ckluRGJtKTsKK0VYUE9SVF9TWU1CT0woRE9UMTFEX1NjYW5Db21wbGV0ZSk7CitFWFBPUlRfU1lNQk9MKElzTGVnYWxDaGFubmVsKTsKK0VYUE9SVF9TWU1CT0woVG9MZWdhbENoYW5uZWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjdhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCkBAIC0wLDAgKzEsMTAyIEBACisjaWZuZGVmIF9fSU5DX0RPVDExRF9ICisjZGVmaW5lIF9fSU5DX0RPVDExRF9ICisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKy8vI2RlZmluZSBFTkFCTEVfRE9UMTFECisKKy8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzCisKK3R5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsKKwl1OCBGaXJzdENobmw7CisJdTggIE51bUNobmxzOworCXU4ICBNYXhUeFBvd2VySW5EYm07Cit9Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOworCit0eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7CisJRE9UMTFEX1NUQVRFX05PTkUgPSAwLAorCURPVDExRF9TVEFURV9MRUFSTkVELAorCURPVDExRF9TVEFURV9ET05FLAorfURPVDExRF9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsKKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsKKworCWJvb2wgYkVuYWJsZWQ7IC8vIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZAorCisJdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4KKwl1OCAgQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuCisJdTggIENvdW50cnlJZVdhdGNoZG9nOworCisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikKKwkvL3U4ICBDaG5sTGlzdExlbjsgLy8gI0J5dGVzIHZhbGlkIGluIENobmxMaXN0W10uCisJLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07CisJdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisKKwlET1QxMURfU1RBVEUgU3RhdGU7Cit9UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87CisjZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQorI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQorI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQorCisjZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZAorI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApCisKKyNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCisjZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBjcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKKworI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXAorCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8gXAorCUZBTFNFIDogXAorCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkKKworI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQorI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cKKyNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwCisjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpCisKKyNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpCisKKwordm9pZAorRG90MTFkX0luaXQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgorCSk7CisKK3ZvaWQKK0RvdDExZF9SZXNldCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2CisJKTsKKwordm9pZAorRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAorCXU4ICoJCXBUYWRkciwKKwl1MTYJQ291dHJ5SWVMZW4sCisJdTggKiBwQ291dHJ5SWUKKwkpOworCit1OAorRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKKwl1OCBDaGFubmVsCisJKTsKKwordm9pZAorRE9UMTFEX1NjYW5Db21wbGV0ZSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldgorCSk7CisKK2ludCBJc0xlZ2FsQ2hhbm5lbCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKKwl1OCBjaGFubmVsCispOworCitpbnQgVG9MZWdhbENoYW5uZWwoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCisJdTggY2hhbm5lbAorKTsKKyNlbmRpZiAvL0VOQUJMRV9ET1QxMUQKKyNlbmRpZiAvLyAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDkwOGUxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMjYzOSBAQAorLyoKKyAqIE1lcmdlZCB3aXRoIG1haW5saW5lIGllZWU4MDIxMS5oIGluIEF1ZyAyMDA0LiAgT3JpZ2luYWwgaWVlZTgwMl8xMQorICogcmVtYWlucyBjb3B5cmlnaHQgYnkgdGhlIG9yaWdpbmFsIGF1dGhvcnMKKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgbWVyZ2VkIGNvZGUgYXJlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzCisgKiBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIgZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBNb2RpZmllZCBmb3IgUmVhbHRlaydzIHdpLWZpIGNhcmRzIGJ5IEFuZHJlYSBNZXJlbGxvCisgKiA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBJRUVFODAyMTFfSAorI2RlZmluZSBJRUVFODAyMTFfSAorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAicnRsODE5eF9IVC5oIgorI2luY2x1ZGUgInJ0bDgxOXhfQkEuaCIKKyNpbmNsdWRlICJydGw4MTl4X1RTLmgiCisKKworI2lmbmRlZiBJV19NT0RFX01PTklUT1IKKyNkZWZpbmUgSVdfTU9ERV9NT05JVE9SIDYKKyNlbmRpZgorCisjaWZuZGVmIElXRVZDVVNUT00KKyNkZWZpbmUgSVdFVkNVU1RPTSAweDhjMDIKKyNlbmRpZgorCisKKyNpZm5kZWYgY29udGFpbmVyX29mCisvKioKKyAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICoKKyAqIEBwdHI6ICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCisJY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOyAgICBcCisJKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKyNlbmRpZgorCisjZGVmaW5lIEtFWV9UWVBFX05BCQkweDAKKyNkZWZpbmUgS0VZX1RZUEVfV0VQNDAgCQkweDEKKyNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCisjZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAorI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQorCisvKiBhZGRlZCBmb3IgcnRsODE5eCB0eCBwcm9jZWR1cmUgKi8KKyNkZWZpbmUgTUFYX1FVRVVFX1NJWkUJCTB4MTAKKworLy8KKy8vIDgxOTAgcXVldWUgbWFwcGluZworLy8KKyNkZWZpbmUgQktfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCRV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVk9fUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBIQ0NBX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRYQ01EX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTUdOVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBISUdIX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIEJFQUNPTl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBMT1dfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRV9RVUVVRQorI2RlZmluZSBOT1JNQUxfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICBNR05UX1FVRVVFCisKKy8vYWRkZWQgYnkgYW15IGZvciBwcworI2RlZmluZSBTV1JGX1RJTUVPVVQJCQkJNTAKKworLy9hZGRlZCBieSBhbXkgZm9yIExFQVAgcmVsYXRlZAorI2RlZmluZSBJRV9DSVNDT19GTEFHX1BPU0lUSU9OCQkweDA4CS8vIEZsYWcgYnl0ZTogYnl0ZSA4LCBudW1iZXJlZCBmcm9tIDAuCisjZGVmaW5lIFNVUFBPUlRfQ0tJUF9NSUMJCQkweDA4CS8vIGJpdDMKKyNkZWZpbmUgU1VQUE9SVF9DS0lQX1BLCQkJMHgxMAkvLyBiaXQ0CisvKiBkZWZpbmVkIGZvciBza2IgY2IgZmllbGQgKi8KKy8qIEF0IG1vc3QgMjggYnl0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgY2JfZGVzYyB7CisJLyogVHggRGVzYyBSZWxhdGVkIGZsYWdzICg4LTkpICovCisJdTggYkxhc3RJbmlQa3Q6MTsKKwl1OCBiQ21kT3JJbml0OjE7CisJdTggYkZpcnN0U2VnOjE7CisJdTggYkxhc3RTZWc6MTsKKwl1OCBiRW5jcnlwdDoxOworCXU4IGJUeERpc2FibGVSYXRlRmFsbEJhY2s6MTsKKwl1OCBiVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU6MTsKKwl1OCBiSHdTZWM6MTsgLy9pbmRpY2F0ZSB3aGV0aGVyIHVzZSBIdyBzZWN1cml0eS4gV0IKKworCXU4IHJlc2VydmVkMTsKKworCS8qIFR4IEZpcm13YXJlIFJlbGFnZWQgZmxhZ3MgKDEwLTExKSovCisJdTggYkNUU0VuYWJsZToxOworCXU4IGJSVFNFbmFibGU6MTsKKwl1OCBiVXNlU2hvcnRHSToxOworCXU4IGJVc2VTaG9ydFByZWFtYmxlOjE7CisJdTggYlR4RW5hYmxlRndDYWxjRHVyOjE7CisJdTggYkFNUERVRW5hYmxlOjE7CisJdTggYlJUU1NUQkM6MTsKKwl1OCBSVFNTQzoxOworCisJdTggYlJUU0JXOjE7CisJdTggYlBhY2tldEJXOjE7CisJdTggYlJUU1VzZVNob3J0UHJlYW1ibGU6MTsKKwl1OCBiUlRTVXNlU2hvcnRHSToxOworCXU4IGJNdWx0aWNhc3Q6MTsKKwl1OCBiQnJvYWRjYXN0OjE7CisJLy91OCByZXNlcnZlZDI6MjsKKwl1OCBkcnZfYWdnX2VuYWJsZToxOworCXU4IHJlc2VydmVkMjoxOworCisJLyogVHggRGVzYyByZWxhdGVkIGVsZW1lbnQoMTItMTkpICovCisJdTggcmF0YV9pbmRleDsKKwl1OCBxdWV1ZV9pbmRleDsKKwkvL3U4IHJlc2VydmVkMzsKKwkvL3U4IHJlc2VydmVkNDsKKwl1MTYgdHhidWZfc2l6ZTsKKwkvL3U4IHJlc2VydmVkNTsKKwl1OCBSQVRSSW5kZXg7CisJdTggcmVzZXJ2ZWQ2OworCXU4IHJlc2VydmVkNzsKKwl1OCByZXNlcnZlZDg7CisKKwkvKiBUeCBmaXJtd2FyZSByZWxhdGVkIGVsZW1lbnQoMjAtMjcpICovCisJdTggZGF0YV9yYXRlOworCXU4IHJ0c19yYXRlOworCXU4IGFtcGR1X2ZhY3RvcjsKKwl1OCBhbXBkdV9kZW5zaXR5OworCS8vdTggcmVzZXJ2ZWQ5OworCS8vdTggcmVzZXJ2ZWQxMDsKKwkvL3U4IHJlc2VydmVkMTE7CisJdTggRHJ2QWdnck51bTsKKwl1MTYgcGt0X3NpemU7CisJdTggcmVzZXJ2ZWQxMjsKK31jYl9kZXNjLCAqcGNiX2Rlc2M7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1HTl8xTSAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTUdOXzJNICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNR05fNV81TSAgICAgICAgICAgICAgICAweDBiCisjZGVmaW5lIE1HTl8xMU0gICAgICAgICAgICAgICAgIDB4MTYKKworI2RlZmluZSBNR05fNk0gICAgICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIE1HTl85TSAgICAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgTUdOXzEyTSAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBNR05fMThNICAgICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIE1HTl8yNE0gICAgICAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgTUdOXzM2TSAgICAgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBNR05fNDhNICAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIE1HTl81NE0gICAgICAgICAgICAgICAgIDB4NmMKKworI2RlZmluZSBNR05fTUNTMCAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIE1HTl9NQ1MxICAgICAgICAgICAgICAgIDB4ODEKKyNkZWZpbmUgTUdOX01DUzIgICAgICAgICAgICAgICAgMHg4MgorI2RlZmluZSBNR05fTUNTMyAgICAgICAgICAgICAgICAweDgzCisjZGVmaW5lIE1HTl9NQ1M0ICAgICAgICAgICAgICAgIDB4ODQKKyNkZWZpbmUgTUdOX01DUzUgICAgICAgICAgICAgICAgMHg4NQorI2RlZmluZSBNR05fTUNTNiAgICAgICAgICAgICAgICAweDg2CisjZGVmaW5lIE1HTl9NQ1M3ICAgICAgICAgICAgICAgIDB4ODcKKyNkZWZpbmUgTUdOX01DUzggICAgICAgICAgICAgICAgMHg4OAorI2RlZmluZSBNR05fTUNTOSAgICAgICAgICAgICAgICAweDg5CisjZGVmaW5lIE1HTl9NQ1MxMCAgICAgICAgICAgICAgIDB4OGEKKyNkZWZpbmUgTUdOX01DUzExICAgICAgICAgICAgICAgMHg4YgorI2RlZmluZSBNR05fTUNTMTIgICAgICAgICAgICAgICAweDhjCisjZGVmaW5lIE1HTl9NQ1MxMyAgICAgICAgICAgICAgIDB4OGQKKyNkZWZpbmUgTUdOX01DUzE0ICAgICAgICAgICAgICAgMHg4ZQorI2RlZmluZSBNR05fTUNTMTUgICAgICAgICAgICAgICAweDhmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8JCTgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFJlYXNvbiBDb2RlIGZpZWxkCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2VudW0JX1JlYXNvbkNvZGV7CisJdW5zcGVjX3JlYXNvbgk9IDB4MSwKKwlhdXRoX25vdF92YWxpZAk9IDB4MiwKKwlkZWF1dGhfbHZfc3MJPSAweDMsCisJaW5hY3Rpdml0eQkJPSAweDQsCisJYXBfb3ZlcmxvYWQgCT0gMHg1LAorCWNsYXNzMl9lcnIJCT0gMHg2LAorCWNsYXNzM19lcnIJCT0gMHg3LAorCWRpc2FzX2x2X3NzIAk9IDB4OCwKKwlhc29jX25vdF9hdXRoCT0gMHg5LAorCisJLy8tLS0tTUlDX0NIRUNLCisJbWljX2ZhaWx1cmUgCT0gMHhlLAorCS8vLS0tLUVORCBNSUNfQ0hFQ0sKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gODAyLjExaSBEMTAuMCBwLjI4LgorCWludmFsaWRfSUUJCT0gMHgwZCwKKwlmb3VyX3dheV90bW91dAk9IDB4MGYsCisJdHdvX3dheV90bW91dAk9IDB4MTAsCisJSUVfZGlzbWF0Y2ggCT0gMHgxMSwKKwlpbnZhbGlkX0djaXBoZXIgPSAweDEyLAorCWludmFsaWRfUGNpcGhlciA9IDB4MTMsCisJaW52YWxpZF9BS01QCT0gMHgxNCwKKwl1bnN1cF9SU05JRXZlciA9IDB4MTUsCisJaW52YWxpZF9SU05JRQk9IDB4MTYsCisJYXV0aF84MDJfMXhfZmFpbD0gMHgxNywKKwljaXBlcl9yZWplY3QJCT0gMHgxOCwKKworCS8vIFJlYXNvbiBjb2RlIGRlZmluZWQgaW4gNy4zLjEuNywgODAyLjFlIEQxMy4wLCBwLjQyLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0xNS4KKwlRb1NfdW5zcGVjCQk9IDB4MjAsIC8vIDMyCisJUUFQX2JhbmR3aWR0aAk9IDB4MjEsIC8vIDMzCisJcG9vcl9jb25kaXRpb24JPSAweDIyLCAvLyAzNAorCW5vX2ZhY2lsaXR5IAk9IDB4MjMsIC8vIDM1CisJCQkJCQkJLy8gV2hlcmUgaXMgMzY/Pz8KKwlyZXFfZGVjbGluZWQJPSAweDI1LCAvLyAzNworCWludmFsaWRfcGFyYW0JPSAweDI2LCAvLyAzOAorCXJlcV9ub3RfaG9ub3JlZD0gMHgyNywJLy8gMzkKKwlUU19ub3RfY3JlYXRlZAk9IDB4MkYsIC8vIDQ3CisJRExfbm90X2FsbG93ZWQJPSAweDMwLCAvLyA0OAorCWRlc3Rfbm90X2V4aXN0CT0gMHgzMSwgLy8gNDkKKwlkZXN0X25vdF9RU1RBCT0gMHgzMiwgLy8gNTAKK307CisKKworCisjZGVmaW5lIGFTaWZzVGltZQkgKChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfQSl8fChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcpfHwocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fNUcpKT8gMTYgOiAxMAorCisjZGVmaW5lIE1HTVRfUVVFVUVfTlVNIDUKKworI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQorI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKKyNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0CisKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKKyNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgorI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKKyNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKKyNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1CisjZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2CisvL0l0IHNob3VsZCBjb25zaXN0ZW50IHdpdGggdGhlIGRyaXZlcl9YWFguYworLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3CisvL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KKy8vICAgRGF2aWQsIDIwMDYuOS4yNgorI2RlZmluZSBJRUVFX1BST1RPX1dQQQkJCQkxCisjZGVmaW5lIElFRUVfUFJPVE9fUlNOCQkJCTIKKy8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgorLy8gICBEYXZpZCwgMjAwNi45LjI2CisjZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKKyNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKKyNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgorI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKKyNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAorI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQorCisjZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQorI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKKworI2RlZmluZSBJRUVFX01MTUVfU1RBX0RFQVVUSAkJCTEKKyNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQwkJCTIKKworCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHCQkyCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUREUgkJMworI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRAk0CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1CisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECTYKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNworCisKKyNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgorCisjZGVmaW5lIE1BWF9JRV9MRU4gIDB4ZmYKKworLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdAorI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMgCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCAJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3JzbAorI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyAgCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzIGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyAJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3JzbAorCisjZGVmaW5lIGllZWU4MDIxMV9jY21wX251bGwJCWllZWU4MDIxMV9jY21wX251bGxfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3RraXBfbnVsbAkJaWVlZTgwMjExX3RraXBfbnVsbF9yc2wKKworI2RlZmluZSBpZWVlODAyMTFfd2VwX251bGwJCWllZWU4MDIxMV93ZXBfbnVsbF9yc2wKKworI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICAJZnJlZV9pZWVlODAyMTFfcnNsCisjZGVmaW5lIGFsbG9jX2llZWU4MDIxMSAgICAgICAgCQlhbGxvY19pZWVlODAyMTFfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3J4IAkJCWllZWU4MDIxMV9yeF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9yc2wKKworI2RlZmluZSBpZWVlODAyMTFfZ2V0X2JlYWNvbgkJaWVlZTgwMjExX2dldF9iZWFjb25fcnNsCisjZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlCQlpZWVlODAyMTFfd2FrZV9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUJCWllZWU4MDIxMV9zdG9wX3F1ZXVlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfcmVzZXRfcXVldWUJCWllZWU4MDIxMV9yZXNldF9xdWV1ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbAlpZWVlODAyMTFfc29mdG1hY19zdG9wX3Byb3RvY29sX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2lzX3Nob3J0c2xvdAkJaWVlZTgwMjExX2lzX3Nob3J0c2xvdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX2lzXzU0ZwkJaWVlZTgwMjExX2lzXzU0Z19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsCWllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3BzX3R4X2FjawkJaWVlZTgwMjExX3BzX3R4X2Fja19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfeG1pdAkJaWVlZTgwMjExX3NvZnRtYWNfeG1pdF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29uc19yc2wKKyNkZWZpbmUgbm90aWZ5X3d4X2Fzc29jX2V2ZW50CQlub3RpZnlfd3hfYXNzb2NfZXZlbnRfcnNsCisjZGVmaW5lIFNlbmREaXNhc3NvY2lhdGlvbgkJU2VuZERpc2Fzc29jaWF0aW9uX3JzbAorI2RlZmluZSBpZWVlODAyMTFfZGlzYXNzb2NpYXRlCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnNfcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NjYW4JCWllZWU4MDIxMV9zdG9wX3NjYW5fcnNsCisjZGVmaW5lIGllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcXVlc3RzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybwlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNyb19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNyb19yc2wKKworI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkCQlpZWVlODAyMTFfd3hfZ2V0X2Vzc2lkX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2Vzc2lkCQlpZWVlODAyMTFfd3hfc2V0X2Vzc2lkX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3JhdGUJCWllZWU4MDIxMV93eF9zZXRfcmF0ZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9yYXRlCQlpZWVlODAyMTFfd3hfZ2V0X3JhdGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfd2FwCQlpZWVlODAyMTFfd3hfc2V0X3dhcF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF93YXAJCWllZWU4MDIxMV93eF9nZXRfd2FwX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21vZGUJCWllZWU4MDIxMV93eF9zZXRfbW9kZV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9tb2RlCQlpZWVlODAyMTFfd3hfZ2V0X21vZGVfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfc2NhbgkJaWVlZTgwMjExX3d4X3NldF9zY2FuX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEJCWllZWU4MDIxMV93eF9nZXRfZnJlcV9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9mcmVxCQlpZWVlODAyMTFfd3hfc2V0X2ZyZXFfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcmF3dHgJCWllZWU4MDIxMV93eF9zZXRfcmF3dHhfcnNsCisjZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbmFtZQkJaWVlZTgwMjExX3d4X2dldF9uYW1lX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyCQlpZWVlODAyMTFfd3hfc2V0X3Bvd2VyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyCQlpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llcwlpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc19yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9ydHMJCWllZWU4MDIxMV93eF9zZXRfcnRzX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3J0cwkJaWVlZTgwMjExX3d4X2dldF9ydHNfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3R4Yl9mcmVlCQlpZWVlODAyMTFfdHhiX2ZyZWVfcnNsCisKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9nZW5faWUJCWllZWU4MDIxMV93eF9zZXRfZ2VuX2llX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4JCWllZWU4MDIxMV93eF9nZXRfc2Nhbl9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUJCWllZWU4MDIxMV93eF9zZXRfZW5jb2RlX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZQkJaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfcnNsCisjaWYgV0lSRUxFU1NfRVhUID49IDE4CisjZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfbWxtZQkJaWVlZTgwMjExX3d4X3NldF9tbG1lX3JzbAorI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X2F1dGgJCWllZWU4MDIxMV93eF9zZXRfYXV0aF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0CWllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dF9yc2wKKyNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0CWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dF9yc2wKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IGllZWVfcGFyYW0geworCXUzMiBjbWQ7CisJdTggc3RhX2FkZHJbRVRIX0FMRU5dOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXU4IG5hbWU7CisJCQl1MzIgdmFsdWU7CisJCX0gd3BhX3BhcmFtOworCQlzdHJ1Y3QgeworCQkJdTMyIGxlbjsKKwkJCXU4IHJlc2VydmVkWzMyXTsKKwkJCXU4IGRhdGFbMF07CisJCX0gd3BhX2llOworCQlzdHJ1Y3R7CisJCQlpbnQgY29tbWFuZDsKKwkJCWludCByZWFzb25fY29kZTsKKwkJfSBtbG1lOworCQlzdHJ1Y3QgeworCQkJdTggYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXU4IHNldF90eDsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVswXTsKKwkJfSBjcnlwdDsKKwl9IHU7Cit9aWVlZV9wYXJhbTsKKworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisKKy8vIGxpbnV4IHVuZGVyIDIuNi45IHJlbGVhc2UgbWF5IG5vdCBzdXBwb3J0IGl0LCBzbyBtb2RpZnkgaXQgZm9yIGNvbW1vbiB1c2UKKyNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQorI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9yc2wgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCisKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworI2RlZmluZSBJRUVFODAyMTFfMUFERFJfTEVOIDEwCisjZGVmaW5lIElFRUU4MDIxMV8yQUREUl9MRU4gMTYKKyNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKKyNkZWZpbmUgSUVFRTgwMjExX0hMRU4gICAgICAgICAgICAgICAgICAoSUVFRTgwMjExXzRBRERSX0xFTikKKyNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTiAgICAgICAgICAgICAoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCisjZGVmaW5lIElFRUU4MDIxMV9NR01UX0hEUl9MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSM19MRU4gMjQKKyNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4gMzAKKworI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQorCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFCTB4MDBmYworI2RlZmluZSBJRUVFODAyMTFfRkNUTF9UT0RTCQkweDAxMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJPTURTCQkweDAyMDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRFNUT0RTCQkweDAzMDAgLy9hZGRlZCBieSBkYXZpZAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MJMHgwNDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1JFVFJZCQkweDA4MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUE0JCTB4MTAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFREFUQQkJMHgyMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9CTE9DS0FDSyAgIDB4MDA5NAorCisvKiBkYXRhICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCisKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX1NFUQkJMHhGRkYwCisKKy8qIFFPUyBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9RQ1RMX1RJRCAgICAgICAgICAgICAgMHgwMDBGCisKKyNkZWZpbmUJRkNfUU9TX0JJVAkJCQkJQklUNworI2RlZmluZSBJc0RhdGFGcmFtZShwZHUpCQkJKCAoKHBkdVswXSAmIDB4MEMpPT0weDA4KSA/IHRydWUgOiBmYWxzZSApCisjZGVmaW5lCUlzTGVnYWN5RGF0YUZyYW1lKHBkdSkJKElzRGF0YUZyYW1lKHBkdSkgJiYgKCEocGR1WzBdJkZDX1FPU19CSVQpKSApCisvL2FkZGVkIGJ5IHdiLiBJcyB0aGlzIHJpZ2h0PworI2RlZmluZSBJc1FvU0RhdGFGcmFtZShwZnJhbWUpICAoKCoodTE2KilwZnJhbWUmKElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQXxJRUVFODAyMTFfRlRZUEVfREFUQSkpID09IChJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKQorI2RlZmluZSBGcmFtZV9PcmRlcihwZnJhbWUpICAgICAoKih1MTYqKXBmcmFtZSZJRUVFODAyMTFfRkNUTF9PUkRFUikKKyNkZWZpbmUgU05fTEVTUyhhLCBiKQkJKCgoYS1iKSYweDgwMCkhPTApCisjZGVmaW5lIFNOX0VRVUFMKGEsIGIpCShhID09IGIpCisjZGVmaW5lIE1BWF9ERVZfQUREUl9TSVpFIDgKK3R5cGVkZWYgZW51bSBfQUNUX0NBVEVHT1JZeworCUFDVF9DQVRfUU9TID0gMSwKKwlBQ1RfQ0FUX0RMUyA9IDIsCisJQUNUX0NBVF9CQSAgPSAzLAorCUFDVF9DQVRfSFQgID0gNywKKwlBQ1RfQ0FUX1dNTSA9IDE3LAorfSBBQ1RfQ0FURUdPUlksICpQQUNUX0NBVEVHT1JZOworCit0eXBlZGVmIGVudW0gX1RTX0FDVElPTnsKKwlBQ1RfQUREVFNSRVEgPSAwLAorCUFDVF9BRERUU1JTUCA9IDEsCisJQUNUX0RFTFRTICAgID0gMiwKKwlBQ1RfU0NIRURVTEUgPSAzLAorfSBUU19BQ1RJT04sICpQVFNfQUNUSU9OOworCit0eXBlZGVmIGVudW0gX0JBX0FDVElPTnsKKwlBQ1RfQUREQkFSRVEgPSAwLAorCUFDVF9BRERCQVJTUCA9IDEsCisJQUNUX0RFTEJBICAgID0gMiwKK30gQkFfQUNUSU9OLCAqUEJBX0FDVElPTjsKKwordHlwZWRlZiBlbnVtIF9Jbml0aWFsR2Fpbk9wVHlwZXsKKwlJR19CYWNrdXA9MCwKKwlJR19SZXN0b3JlLAorCUlHX01heAorfUluaXRpYWxHYWluT3BUeXBlOworCisvKiBkZWJ1ZyBtYWNyb3MgKi8KKyNkZWZpbmUgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKK2V4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOworI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAorZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAorICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAiIGZtdCwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisvL3diIGFkZGVkIHRvIGRlYnVnIG91dCBkYXRhIGJ1ZgorLy9pZiB5b3Ugd2FudCBwcmludCBEQVRBIGJ1ZmZlciByZWxhdGVkIEJBLCBwbGVhc2Ugc2V0IGllZWU4MDIxMV9kZWJ1Z19sZXZlbCB0byBEQVRBfEJBCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKQlcCisJZG97IGlmICgoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgPT0gKGxldmVsKSkJXAorCQl7IAlcCisJCQlpbnQgaTsJCQkJCVwKKwkJCXU4KiBwZGF0YSA9ICh1OCopIGRhdGE7CQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJXMoKVxuIiwgX19GVU5DVElPTl9fKTsJXAorCQkJZm9yKGk9MDsgaTwoaW50KShkYXRhbGVuKTsgaSsrKQkJCVwKKwkJCXsJCQkJCQlcCisJCQkJcHJpbnRrKCIlMnggIiwgcGRhdGFbaV0pOwkJXAorCQkJCWlmICgoaSsxKSUxNiA9PSAwKSBwcmludGsoIlxuIik7CVwKKwkJCX0JCQkJXAorCQkJcHJpbnRrKCJcbiIpOwkJCVwKKwkJfQkJCQkJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KKworLyogZGVidWcgbWFjcm9zIG5vdCBkZXBlbmRlbnQgb24gQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLworCisjZGVmaW5lIE1BQ19GTVQgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorI2RlZmluZSBNQUNfQVJHKHgpICgodTgqKSh4KSlbMF0sKCh1OCopKHgpKVsxXSwoKHU4KikoeCkpWzJdLCgodTgqKSh4KSlbM10sKCh1OCopKHgpKVs0XSwoKHU4KikoeCkpWzVdCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJRUVFODAyMTFfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElFRUU4MDIxMV94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJRUVFODAyMTFfRExfSU5GTyAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1dYICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TQ0FOICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfRExfU1RBVEUgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX01HTVQgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9GUkFHICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfRExfRUFQICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0RST1AgICAgICAgICAgKDE8PDcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RYICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SWCAgICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIElFRUU4MDIxMV9ETF9IVAkJICAgKDE8PDEwKSAgLy9IVAorI2RlZmluZSBJRUVFODAyMTFfRExfQkEJCSAgICgxPDwxMSkgIC8vYmEKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RTCQkgICAoMTw8MTIpICAvL1RTCisjZGVmaW5lIElFRUU4MDIxMV9ETF9RT1MgICAgICAgICAgICgxPDwxMykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1JFT1JERVIJICAgKDE8PDE0KQorI2RlZmluZSBJRUVFODAyMTFfRExfSU9UCSAgICgxPDwxNSkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0lQUwkgICAoMTw8MTYpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9UUkFDRQkgICAoMTw8MjkpICAvL3RyYWNlIGZ1bmN0aW9uLCBuZWVkIHRvIHVzZXIgbmV0X3JhdGVsaW1pdCgpIHRvZ2V0aGVyIGluIG9yZGVyIG5vdCB0byBwcmludCB0b28gbXVjaCB0byB0aGUgc2NyZWVuCisjZGVmaW5lIElFRUU4MDIxMV9ETF9EQVRBCSAgICgxPDwzMCkgICAvL3VzZSB0aGlzIGZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHByaW50IGRhdGEgYnVmIG91dC4KKyNkZWZpbmUgSUVFRTgwMjExX0RMX0VSUgkgICAoMTw8MzEpICAgLy9hbHdheXMgb3BlbgorI2RlZmluZSBJRUVFODAyMTFfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAiaWVlZTgwMjExOiAiIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19JTkZPKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19XWChmLCBhLi4uKSAgICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NDQU4oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NDQU4sIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TVEFURShmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TVEFURSwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX01HTVQoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfTUdNVCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0ZSQUcoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRlJBRywgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0VBUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FQVAsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EUk9QKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0RST1AsIGYsICMjIGEpCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19UWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UWCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1JYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUU9TKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1FPUywgZiwgIyMgYSkKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKy8qIEFkZGVkIGJ5IEFubmllLCAyMDA1LTExLTIyLiAqLworI2RlZmluZSBNQVhfU1RSX0xFTiAgICAgNjQKKy8qIEkgd2FudCB0byBzZWUgQVNDSUkgMzMgdG8gMTI2IG9ubHkuIE90aGVyd2lzZSwgSSBwcmludCAnPycuIEFubmllLCAyMDA1LTExLTIyLiovCisjZGVmaW5lIFBSSU5UQUJMRShfY2gpICAoX2NoPichJyAmJiBfY2g8J34nKQorI2RlZmluZSBJRUVFODAyMTFfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCQlpZigoX0NvbXApICYgbGV2ZWwpICAgCQkJCQkJCVwKKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlpbnQgICAgICAgICAgICAgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXU4ICBidWZmZXJbTUFYX1NUUl9MRU5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCisJCQkJaW50IGxlbmd0aCA9IChfTGVuPE1BWF9TVFJfTEVOKT8gX0xlbiA6IChNQVhfU1RSX0xFTi0xKSA7ICAJXAorCQkJCW1lbXNldChidWZmZXIsIDAsIE1BWF9TVFJfTEVOKTsgICAgICAgICAgICAgICAgICAgICAgCQlcCisJCQkJbWVtY3B5KGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoICk7ICAgICAgICAgICAgCQlcCisJCQkJZm9yKCBfX2k9MDsgX19pPE1BWF9TVFJfTEVOOyBfX2krKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgaWYoICFQUklOVEFCTEUoYnVmZmVyW19faV0pICkgICBidWZmZXJbX19pXSA9ICc/JzsgICAgIAlcCisJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQlidWZmZXJbbGVuZ3RoXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXByaW50aygiUnRsODE5eDogIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAorCQkJCXByaW50ayhfVGl0bGVTdHJpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCXByaW50aygiOiAlZCwgPCVzPlxuIiwgX0xlbiwgYnVmZmVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJfQorI2Vsc2UKKyNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPiAvKiBBUlBIUkRfRVRIRVIgKi8KKworI2lmbmRlZiBXSVJFTEVTU19TUFkKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLy8gbmV3IGRyaXZlciBBUEkKKworI2lmbmRlZiBFVEhfUF9QQUUKKyNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2VuZGlmIC8qIEVUSF9QX1BBRSAqLworCisjZGVmaW5lIEVUSF9QX1BSRUFVVEggMHg4OEM3IC8qIElFRUUgODAyLjExaSBwcmUtYXV0aGVudGljYXRpb24gKi8KKworI2lmbmRlZiBFVEhfUF84MDIxMV9SQVcKKyNkZWZpbmUgRVRIX1BfODAyMTFfUkFXIChFVEhfUF9FQ09ORVQgKyAxKQorI2VuZGlmCisKKy8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KKworI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCisKK3N0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgeworCisJdTggICAgZHNhcDsgICAvKiBhbHdheXMgMHhBQSAqLworCXU4ICAgIHNzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCisJdTggICAgb3VpW1A4MDIxMV9PVUlfTEVOXTsgICAgLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCisKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFNOQVBfU0laRSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcikKKworI2RlZmluZSBXTEFOX0ZDX0dFVF9WRVJTKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQorCisjZGVmaW5lIFdMQU5fRkNfR0VUX0ZSQU1FVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GUkFNRVRZUEUpCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkFHKHNlcSkgKChzZXEpICYgSUVFRTgwMjExX1NDVExfRlJBRykKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUShzZXEpICAoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lIFdMQU5fQVVUSF9PUEVOIDAKKyNkZWZpbmUgV0xBTl9BVVRIX1NIQVJFRF9LRVkgMQorI2RlZmluZSBXTEFOX0FVVEhfTEVBUCAyCisKKyNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4CisKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0JTUyAoMTw8MCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lCU1MgKDE8PDEpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAoMTw8MikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVCAoMTw8MykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKDE8PDQpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSAoMTw8NSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BCQ0MgKDE8PDYpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DSEFOTkVMX0FHSUxJVFkgKDE8PDcpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TUEVDVFJVTV9NR01UICgxPDw4KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUU9TICgxPDw5KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCAoMTw8MTApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9EU1NTX09GRE0gKDE8PDEzKQorCisvKiA4MDIuMTFnIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisjZGVmaW5lIFdMQU5fRVJQX05PTl9FUlBfUFJFU0VOVCAoMTw8MCkKKyNkZWZpbmUgV0xBTl9FUlBfVVNFX1BST1RFQ1RJT04gKDE8PDEpCisjZGVmaW5lIFdMQU5fRVJQX0JBUktFUl9QUkVBTUJMRSAoMTw8MikKKworLyogU3RhdHVzIGNvZGVzICovCitlbnVtIGllZWU4MDIxMV9zdGF0dXNjb2RlIHsKKwlXTEFOX1NUQVRVU19TVUNDRVNTID0gMCwKKwlXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFID0gMSwKKwlXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEID0gMTAsCisJV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyA9IDExLAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9VTlNQRUMgPSAxMiwKKwlXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHID0gMTMsCisJV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OID0gMTQsCisJV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUwgPSAxNSwKKwlXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgPSAxNiwKKwlXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgPSAxNywKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfUkFURVMgPSAxOCwKKwkvKiA4MDIuMTFiICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRQUkVBTUJMRSA9IDE5LAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgPSAyMCwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9BR0lMSVRZID0gMjEsCisJLyogODAyLjExaCAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NQRUNUUlVNID0gMjIsCisJV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1BPV0VSID0gMjMsCisJV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1NVUFBfQ0hBTiA9IDI0LAorCS8qIDgwMi4xMWcgKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVFRJTUUgPSAyNSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9EU1NTT0ZETSA9IDI2LAorCS8qIDgwMi4xMWkgKi8KKwlXTEFOX1NUQVRVU19JTlZBTElEX0lFID0gNDAsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9HUk9VUF9DSVBIRVIgPSA0MSwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUiA9IDQyLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfQUtNUCA9IDQzLAorCVdMQU5fU1RBVFVTX1VOU1VQUF9SU05fVkVSU0lPTiA9IDQ0LAorCVdMQU5fU1RBVFVTX0lOVkFMSURfUlNOX0lFX0NBUCA9IDQ1LAorCVdMQU5fU1RBVFVTX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCA9IDQ2LAorfTsKKworLyogUmVhc29uIGNvZGVzICovCitlbnVtIGllZWU4MDIxMV9yZWFzb25jb2RlIHsKKwlXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCA9IDEsCisJV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCA9IDIsCisJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgPSAzLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZID0gNCwKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZID0gNSwKKwlXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA9IDYsCisJV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBID0gNywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgPSA4LAorCVdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIID0gOSwKKwkvKiA4MDIuMTFoICovCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1BPV0VSID0gMTAsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1NVUFBfQ0hBTiA9IDExLAorCS8qIDgwMi4xMWkgKi8KKwlXTEFOX1JFQVNPTl9JTlZBTElEX0lFID0gMTMsCisJV0xBTl9SRUFTT05fTUlDX0ZBSUxVUkUgPSAxNCwKKwlXTEFOX1JFQVNPTl80V0FZX0hBTkRTSEFLRV9USU1FT1VUID0gMTUsCisJV0xBTl9SRUFTT05fR1JPVVBfS0VZX0hBTkRTSEFLRV9USU1FT1VUID0gMTYsCisJV0xBTl9SRUFTT05fSUVfRElGRkVSRU5UID0gMTcsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9HUk9VUF9DSVBIRVIgPSAxOCwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1BBSVJXSVNFX0NJUEhFUiA9IDE5LAorCVdMQU5fUkVBU09OX0lOVkFMSURfQUtNUCA9IDIwLAorCVdMQU5fUkVBU09OX1VOU1VQUF9SU05fVkVSU0lPTiA9IDIxLAorCVdMQU5fUkVBU09OX0lOVkFMSURfUlNOX0lFX0NBUCA9IDIyLAorCVdMQU5fUkVBU09OX0lFRUU4MDIxWF9GQUlMRUQgPSAyMywKKwlXTEFOX1JFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSAyNCwKK307CisKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1NJR05BTCAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1JTU0kgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19OT0lTRSAoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX1NUQVRNQVNLX1JBVEUgKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19XRU1BU0sgMHg3CisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTiAgCQk0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIJCQkweDAyCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUIJCQkweDA0CisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCQkweDBCCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CCQkJMHgxNgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiAJCTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV82TUIJCQkweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkJMHgxMgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIJCTB4MTgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CCQkweDI0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQgkJMHgzMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIJCTB4NDgKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CCQkweDYwCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgkJMHg2QworI2RlZmluZSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCQkweDgwCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSwkJMHgwMDAwMDAwRgorI2RlZmluZSBJRUVFODAyMTFfQ0NLX0JBU0lDX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfQ0NLX1JBVEVfMk1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0spCisKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURVNfTUFTSwkJMHgwMDAwMEZGMAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSyAgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sgfCBcCisJSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0spCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1JBVEVTX01BU0sgKElFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyB8IFwKKwkJCQlJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSykKKworI2RlZmluZSBJRUVFODAyMTFfTlVNX09GRE1fUkFURVMJICAgIDgKKyNkZWZpbmUgSUVFRTgwMjExX05VTV9DQ0tfUkFURVMJCSAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisvKiB0aGlzIGlzIHN0b2xlbiBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgbWFkd2lmaSBkcml2ZXIqLworI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSwkJMHgwYworI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfREFUQQkJMHgwOAorI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSwkweEIwCisjZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykgXAorCSgoKGZjKSAmIChJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKSkgPT0gXAorCSAoSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkKKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciAqLworI2RlZmluZSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRSAzMQorc3RydWN0IGllZWVfaWJzc19zZXEgeworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IHNlcV9udW1bMTddOworCXUxNiBmcmFnX251bVsxN107CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZVsxN107CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWVbMl07CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworCXU2NCB0c2Y7CisJdTMyIGJlYWNvbl90aW1lOworCXU4IG5pY190eXBlOworCXUxNiAgICAgICBMZW5ndGg7CisJLy8gICAgICB1OCAgICAgICAgRGF0YVJhdGU7ICAgICAgLy8gSW4gMC41IE1icHMKKwl1OCAgICAgICAgU2lnbmFsUXVhbGl0eTsgLy8gaW4gMC0xMDAgaW5kZXguCisJczMyICAgICAgIFJlY3ZTaWduYWxQb3dlcjsgLy8gUmVhbCBwb3dlciBpbiBkQm0gZm9yIHRoaXMgcGFja2V0LCBubyBiZWF1dGlmaWNhdGlvbiBhbmQgYWdncmVnYXRpb24uCisJczggICAgICAgIFJ4UG93ZXI7IC8vIGluIGRCbSBUcmFuc2xhdGUgZnJvbSBQV2RCCisJdTggICAgICAgIFNpZ25hbFN0cmVuZ3RoOyAvLyBpbiAwLTEwMCBpbmRleC4KKwl1MTYgICAgICAgYkh3RXJyb3I6MTsKKwl1MTYgICAgICAgYkNSQzoxOworCXUxNiAgICAgICBiSUNWOjE7CisJdTE2ICAgICAgIGJTaG9ydFByZWFtYmxlOjE7CisJdTE2ICAgICAgIEFudGVubmE6MTsgICAgICAvL2ZvciBydGw4MTg1CisJdTE2ICAgICAgIERlY3J5cHRlZDoxOyAgICAvL2ZvciBydGw4MTg1LCBydGw4MTg3CisJdTE2ICAgICAgIFdha2V1cDoxOyAgICAgICAvL2ZvciBydGw4MTg1CisJdTE2ICAgICAgIFJlc2VydmVkMDoxOyAgICAvL2ZvciBydGw4MTg1CisJdTggICAgICAgIEFHQzsKKwl1MzIgICAgICAgVGltZVN0YW1wTG93OworCXUzMiAgICAgICBUaW1lU3RhbXBIaWdoOworCWJvb2wgICAgICBiU2hpZnQ7CisJYm9vbCAgICAgIGJJc1Fvc0RhdGE7ICAgICAgICAgICAgIC8vIEFkZGVkIGJ5IEFubmllLCAyMDA1LTEyLTIyLgorCXU4ICAgICAgICBVc2VyUHJpb3JpdHk7CisKKwkvLzEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKwkvLzFBdHRlbnRpb24gUGxlYXNlISEhPDExbiBvciA4MTkwIHNwZWNpZmljIGNvZGUgc2hvdWxkIGJlIHB1dCBiZWxvdyB0aGlzIGxpbmU+CisJLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisKKwl1OCAgICAgICAgUnhEcnZJbmZvU2l6ZTsKKwl1OCAgICAgICAgUnhCdWZTaGlmdDsKKwlib29sICAgICAgYklzQU1QRFU7CisJYm9vbCAgICAgIGJGaXJzdE1QRFU7CisJYm9vbCAgICAgIGJDb250YWluSFRDOworCWJvb2wgICAgICBSeElzNDBNSHpQYWNrZXQ7CisJdTMyICAgICAgIFJ4UFdEQkFsbDsKKwl1OCAgICAgICAgUnhNSU1PU2lnbmFsU3RyZW5ndGhbNF07ICAgICAgICAvLyBpbiAwfjEwMCBpbmRleAorCXM4ICAgICAgICBSeE1JTU9TaWduYWxRdWFsaXR5WzJdOworCWJvb2wgICAgICBiUGFja2V0TWF0Y2hCU1NJRDsKKwlib29sICAgICAgYklzQ0NLOworCWJvb2wgICAgICBiUGFja2V0VG9TZWxmOworCS8vYWRkZWQgYnkgYW15CisJdTgqICAgICAgIHZpcnR1YWxfYWRkcmVzczsKKwl1MTYgICAgICAgICAgcGFja2V0bGVuZ3RoOyAgICAgICAgICAgICAgLy8gVG90YWwgcGFja2V0IGxlbmd0aDogTXVzdCBlcXVhbCB0byBzdW0gb2YgYWxsIEZyYWdMZW5ndGgKKwl1MTYgICAgICAgICAgZnJhZ2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBGcmFnTGVuZ3RoIHNob3VsZCBlcXVhbCB0byBQYWNrZXRMZW5ndGggaW4gbm9uLWZyYWdtZW50IGNhc2UKKwl1MTYgICAgICAgICAgZnJhZ29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIG9mZnNldCBmb3IgdGhpcyBmcmFnbWVudAorCXUxNiAgICAgICAgICBudG90YWxmcmFnOworCWJvb2wgICAgICAJICBiaXNyeGFnZ3JzdWJmcmFtZTsKKwlib29sCQkgIGJQYWNrZXRCZWFjb247CS8vY29zYSBhZGQgZm9yIHJzc2kKKwlib29sCQkgIGJUb1NlbGZCQTsJCS8vY29zYSBhZGQgZm9yIHJzc2kKKwljaGFyIAkgIGNja19hZGNfcHdkYls0XTsJLy9jb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24KKwl1MTYJCSAgU2VxX051bTsKKworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2luY2x1ZGUgImllZWU4MDIxMV9jcnlwdC5oIgorCisjZGVmaW5lIFNFQ19LRVlfMSAgICAgICAgICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgU0VDX0tFWV8zICAgICAgICAgKDE8PDIpCisjZGVmaW5lIFNFQ19LRVlfNCAgICAgICAgICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwgICAgICAgICAoMTw8NykKKyNkZWZpbmUgU0VDX0VOQUJMRUQgICAgICAgKDE8PDgpCisjZGVmaW5lIFNFQ19FTkNSWVBUICAgICAgICgxPDw5KQorCisjZGVmaW5lIFNFQ19MRVZFTF8wICAgICAgMCAvKiBOb25lICovCisjZGVmaW5lIFNFQ19MRVZFTF8xICAgICAgMSAvKiBXRVAgNDAgYW5kIDEwNCBiaXQgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzIgICAgICAyIC8qIExldmVsIDEgKyBUS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8yX0NLSVAgMyAvKiBMZXZlbCAxICsgQ0tJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMyAgICAgIDQgLyogTGV2ZWwgMiArIENDTVAgKi8KKworI2RlZmluZSBTRUNfQUxHX05PTkUgICAgICAgICAgICAwCisjZGVmaW5lIFNFQ19BTEdfV0VQICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0VDX0FMR19US0lQICAgICAgICAgICAgMgorI2RlZmluZSBTRUNfQUxHX0NDTVAgICAgICAgICAgICAzCisKKyNkZWZpbmUgV0VQX0tFWVMgCQk0CisjZGVmaW5lIFdFUF9LRVlfTEVOCQkxMworI2RlZmluZSBTQ01fS0VZX0xFTiAgICAgICAgICAgICAzMgorI2RlZmluZSBTQ01fVEVNUE9SQUxfS0VZX0xFTkdUSCAxNgorCitzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorCSAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorCSAgICBhdXRoX2FsZ286NCwKKwkgICAgdW5pY2FzdF91c2VzX2dyb3VwOjEsCisJICAgIGVuY3J5cHQ6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1NDTV9LRVlfTEVOXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIGZyYW1lICB8ICBmY3MgfAorICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisqLworCisvKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KK2VudW0gaWVlZTgwMjExX21maWUgeworCU1GSUVfVFlQRV9TU0lEID0gMCwKKwlNRklFX1RZUEVfUkFURVMgPSAxLAorCU1GSUVfVFlQRV9GSF9TRVQgPSAyLAorCU1GSUVfVFlQRV9EU19TRVQgPSAzLAorCU1GSUVfVFlQRV9DRl9TRVQgPSA0LAorCU1GSUVfVFlQRV9USU0gPSA1LAorCU1GSUVfVFlQRV9JQlNTX1NFVCA9IDYsCisJTUZJRV9UWVBFX0NPVU5UUlkgPSA3LAorCU1GSUVfVFlQRV9IT1BfUEFSQU1TID0gOCwKKwlNRklFX1RZUEVfSE9QX1RBQkxFID0gOSwKKwlNRklFX1RZUEVfUkVRVUVTVCA9IDEwLAorCU1GSUVfVFlQRV9DSEFMTEVOR0UgPSAxNiwKKwlNRklFX1RZUEVfUE9XRVJfQ09OU1RSQUlOVCA9IDMyLAorCU1GSUVfVFlQRV9QT1dFUl9DQVBBQklMSVRZID0gMzMsCisJTUZJRV9UWVBFX1RQQ19SRVFVRVNUID0gMzQsCisJTUZJRV9UWVBFX1RQQ19SRVBPUlQgPSAzNSwKKwlNRklFX1RZUEVfU1VQUF9DSEFOTkVMUyA9IDM2LAorCU1GSUVfVFlQRV9DU0EgPSAzNywKKwlNRklFX1RZUEVfTUVBU1VSRV9SRVFVRVNUID0gMzgsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVQT1JUID0gMzksCisJTUZJRV9UWVBFX1FVSUVUID0gNDAsCisJTUZJRV9UWVBFX0lCU1NfREZTID0gNDEsCisJTUZJRV9UWVBFX0VSUCA9IDQyLAorCU1GSUVfVFlQRV9SU04gPSA0OCwKKwlNRklFX1RZUEVfUkFURVNfRVggPSA1MCwKKwlNRklFX1RZUEVfSFRfQ0FQPSA0NSwKKwkgTUZJRV9UWVBFX0hUX0lORk89IDYxLAorCSBNRklFX1RZUEVfQUlST05FVD0xMzMsCisJTUZJRV9UWVBFX0dFTkVSSUMgPSAyMjEsCisJTUZJRV9UWVBFX1FPU19QQVJBTUVURVIgPSAyMjIsCit9OworCisvKiBNaW5pbWFsIGhlYWRlcjsgY2FuIGJlIHVzZWQgZm9yIHBhc3NpbmcgODAyLjExIGZyYW1lcyB3aXRoIHN1ZmZpY2llbnQKKyAqIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgdW5kZXJseWluZyBkYXRhIHR5cGUgaXMgYWN0dWFsbHkKKyAqIHN0b3JlZCBpbiB0aGUgZGF0YS4gKi8KK3N0cnVjdCBpZWVlODAyMTFfaGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8yYWRkciB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwlfX2xlMTYgc2VxX2N0bDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwlfX2xlMTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggcGF5bG9hZFswXTsKKwlfX2xlMTYgcW9zX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCXU4IHBheWxvYWRbMF07CisJX19sZTE2IHFvc19jdGw7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgeworCXU4IGlkOworCXU4IGxlbjsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24geworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgYWxnb3JpdGhtOworCV9fbGUxNiB0cmFuc2FjdGlvbjsKKwlfX2xlMTYgc3RhdHVzOworCS8qY2hhbGxlbmdlKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyB7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOworCV9fbGUxNiByZWFzb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwlfX2xlMTYgYmVhY29uX2ludGVydmFsOworCV9fbGUxNiBjYXBhYmlsaXR5OworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgRkggcGFyYW1zLCBEUyBwYXJhbXMsCisJICogQ0YgcGFyYW1zLCBJQlNTIHBhcmFtcywgVElNIChpZiBiZWFjb24pLCBSU04gKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQWxpYXMgYmVhY29uIGZvciBwcm9iZV9yZXNwb25zZSAqLworI2RlZmluZSBpZWVlODAyMTFfYmVhY29uIGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZQorCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgeworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwlfX2xlMTYgbGlzdGVuX2ludGVydmFsOworCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgUlNOICovCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcmVhc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IHN0YXR1czsKKwlfX2xlMTYgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsgLyogc3VwcG9ydGVkIHJhdGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV90eGIgeworCXU4IG5yX2ZyYWdzOworCXU4IGVuY3J5cHRlZDsKKwl1OCBxdWV1ZV9pbmRleDsKKwl1OCBydHNfaW5jbHVkZWQ7CisJdTE2IHJlc2VydmVkOworCV9fbGUxNiBmcmFnX3NpemU7CisJX19sZTE2IHBheWxvYWRfc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ21lbnRzWzBdOworfTsKKworI2RlZmluZSBNQVhfVFhfQUdHX0NPVU5UCQkgIDE2CitzdHJ1Y3QgaWVlZTgwMjExX2Rydl9hZ2dfdHhiIHsKKwl1OCBucl9kcnZfYWdnX2ZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfYWdnX2ZyYW1lc1tNQVhfVFhfQUdHX0NPVU5UXTsKK31fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBNQVhfU1VCRlJBTUVfQ09VTlQgCQkgIDY0CitzdHJ1Y3QgaWVlZTgwMjExX3J4YiB7CisJdTggbnJfc3ViZnJhbWVzOworCXN0cnVjdCBza19idWZmICpzdWJmcmFtZXNbTUFYX1NVQkZSQU1FX0NPVU5UXTsKKwl1OCBkc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3R5cGVkZWYgdW5pb24gX2ZyYW1lcW9zIHsKKwl1MTYgc2hvcnRkYXRhOworCXU4ICBjaGFyZGF0YVsyXTsKKwlzdHJ1Y3QgeworCQl1MTYgdGlkOjQ7CisJCXUxNiBlb3NwOjE7CisJCXUxNiBhY2tfcG9saWN5OjI7CisJCXUxNiByZXNlcnZlZDoxOworCQl1MTYgdHhvcDo4OworCX1maWVsZDsKK31mcmFtZXFvcywqcGZyYW1lcW9zOworCisvKiBTV0VFUCBUQUJMRSBFTlRSSUVTIE5VTUJFUiovCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFUwkJICA0MgorI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVNfUEVSX1BBQ0tFVCAgNworLyogTUFYX1JBVEVTX0xFTkdUSCBuZWVkcyB0byBiZSAxMi4gIFRoZSBzcGVjIHNheXMgOCwgYW5kIG1hbnkgQVBzCisgKiBvbmx5IHVzZSA4LCBhbmQgdGhlbiB1c2UgZXh0ZW5kZWQgcmF0ZXMgZm9yIHRoZSByZW1haW5pbmcgc3VwcG9ydGVkCisgKiByYXRlcy4gIE90aGVyIEFQcywgaG93ZXZlciwgc3RpY2sgYWxsIG9mIHRoZWlyIHN1cHBvcnRlZCByYXRlcyBvbiB0aGUKKyAqIG1haW4gcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudC4uLiAqLworI2RlZmluZSBNQVhfUkFURVNfTEVOR1RIICAgICAgICAgICAgICAgICAgKCh1OCkxMikKKyNkZWZpbmUgTUFYX1JBVEVTX0VYX0xFTkdUSCAgICAgICAgICAgICAgICgodTgpMTYpCisjZGVmaW5lIE1BWF9ORVRXT1JLX0NPVU5UICAgICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTUFYX0NIQU5ORUxfTlVNQkVSICAgICAgICAgICAgICAgICAxNjEKKyNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FCSAgIDEwMAorLy8oSFogLyAyKQorI2RlZmluZSBJRUVFODAyMTFfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FIChIWiAqIDIpCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAgICAgICAgICAgICAgICAgNFUKKworI2RlZmluZSBNQVhfV1BBX0lFX0xFTiA2NAorCisjZGVmaW5lIE5FVFdPUktfRU1QVFlfRVNTSUQgKDE8PDApCisjZGVmaW5lIE5FVFdPUktfSEFTX09GRE0gICAgKDE8PDEpCisjZGVmaW5lIE5FVFdPUktfSEFTX0NDSyAgICAgKDE8PDIpCisKKy8qIFFvUyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlMgICAgICAoMTw8MykKKyNkZWZpbmUgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OICAgICAoMTw8NCkKKyNkZWZpbmUgTkVUV09SS19IQVNfUU9TX01BU0sgICAgICAgICAgICAoTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlMgfCBcCisJCQkJCSBORVRXT1JLX0hBU19RT1NfSU5GT1JNQVRJT04pCisvKiA4MDIuMTFoICovCisjZGVmaW5lIE5FVFdPUktfSEFTX1BPV0VSX0NPTlNUUkFJTlQgICAgKDE8PDUpCisjZGVmaW5lIE5FVFdPUktfSEFTX0NTQSAgICAgICAgICAgICAgICAgKDE8PDYpCisjZGVmaW5lIE5FVFdPUktfSEFTX1FVSUVUICAgICAgICAgICAgICAgKDE8PDcpCisjZGVmaW5lIE5FVFdPUktfSEFTX0lCU1NfREZTICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIE5FVFdPUktfSEFTX1RQQ19SRVBPUlQgICAgICAgICAgKDE8PDkpCisKKyNkZWZpbmUgTkVUV09SS19IQVNfRVJQX1ZBTFVFICAgICAgICAgICAoMTw8MTApCisKKyNkZWZpbmUgUU9TX1FVRVVFX05VTSAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFFPU19PVUlfTEVOICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBRT1NfT1VJX1RZUEUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUU9TX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgICAyMjEKKyNkZWZpbmUgUU9TX09VSV9JTkZPX1NVQl9UWVBFICAgICAgICAgICAwCisjZGVmaW5lIFFPU19PVUlfUEFSQU1fU1VCX1RZUEUgICAgICAgICAgMQorI2RlZmluZSBRT1NfVkVSU0lPTl8xICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUU9TX0FJRlNOX01JTl9WQUxVRSAgICAgICAgICAgICAyCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50IHsKKwl1OCBlbGVtZW50SUQ7CisJdTggbGVuZ3RoOworCXU4IHF1aVtRT1NfT1VJX0xFTl07CisJdTggcXVpX3R5cGU7CisJdTggcXVpX3N1YnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCBhY19pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciB7CisJdTggYWNpX2FpZnNuOworCXU4IGVjd19taW5fbWF4OworCV9fbGUxNiB0eF9vcF9saW1pdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbyB7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCBpbmZvX2VsZW1lbnQ7CisJdTggcmVzZXJ2ZWQ7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyIGFjX3BhcmFtc19yZWNvcmRbUU9TX1FVRVVFX05VTV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyB7CisJX19sZTE2IGN3X21pbltRT1NfUVVFVUVfTlVNXTsKKwlfX2xlMTYgY3dfbWF4W1FPU19RVUVVRV9OVU1dOworCXU4IGFpZnNbUU9TX1FVRVVFX05VTV07CisJdTggZmxhZ1tRT1NfUVVFVUVfTlVNXTsKKwlfX2xlMTYgdHhfb3BfbGltaXRbUU9TX1FVRVVFX05VTV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSB7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOworCWludCBhY3RpdmU7CisJaW50IHN1cHBvcnRlZDsKKwl1OCBwYXJhbV9jb3VudDsKKwl1OCBvbGRfcGFyYW1fY291bnQ7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX3RpbV9wYXJhbWV0ZXJzIHsKKwl1OCB0aW1fY291bnQ7CisJdTggdGltX3BlcmlvZDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvLyNlbHNlCitzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7CisJc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOworCXUxNiBub3JtX21zZHVfc2l6ZTsKKwl1MTYgbWF4X21zZHVfc2l6ZTsKKwl1MzIgbWluX3NlcnZfaW50ZXI7CisJdTMyIG1heF9zZXJ2X2ludGVyOworCXUzMiBpbmFjdF9pbnRlcjsKKwl1MzIgc3VzcGVuX2ludGVyOworCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7CisJdTMyIG1pbl9kYXRhX3JhdGU7CisJdTMyIG1lYW5fZGF0YV9yYXRlOworCXUzMiBwZWFrX2RhdGFfcmF0ZTsKKwl1MzIgbWF4X2J1cnN0X3NpemU7CisJdTMyIGRlbGF5X2JvdW5kOworCXUzMiBtaW5fcGh5X3JhdGU7CisJdTE2IHN1cnBfYmFuZF9hbGxvdzsKKwl1MTYgbWVkaXVtX3RpbWU7Cit9X19hdHRyaWJ1dGVfXygocGFja2VkKSk7CitlbnVtIGVhcF90eXBlIHsKKwlFQVBfUEFDS0VUID0gMCwKKwlFQVBPTF9TVEFSVCwKKwlFQVBPTF9MT0dPRkYsCisJRUFQT0xfS0VZLAorCUVBUE9MX0VOQ0FQX0FTRl9BTEVSVAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVhcF90eXBlc1tdID0geworCVtFQVBfUEFDS0VUXQkJPSAiRUFQLVBhY2tldCIsCisJW0VBUE9MX1NUQVJUXQkJPSAiRUFQT0wtU3RhcnQiLAorCVtFQVBPTF9MT0dPRkZdCQk9ICJFQVBPTC1Mb2dvZmYiLAorCVtFQVBPTF9LRVldCQk9ICJFQVBPTC1LZXkiLAorCVtFQVBPTF9FTkNBUF9BU0ZfQUxFUlRdCT0gIkVBUE9MLUVuY2FwLUFTRi1BbGVydCIKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWFwX2dldF90eXBlKGludCB0eXBlKQoreworCXJldHVybiAoKHUzMil0eXBlID49IEFSUkFZX1NJWkUoZWFwX3R5cGVzKSkgPyAiVW5rbm93biIgOiBlYXBfdHlwZXNbdHlwZV07Cit9CisvL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgorc3RhdGljIGlubGluZSB1OCBGcmFtZV9Rb1NUSUQodTgqIGJ1ZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOworCXUxNiBmYzsKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWY7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJcmV0dXJuICh1OCkoKGZyYW1lcW9zKikoYnVmICsgKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSYmKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSk/IDMwIDogMjQpKSktPmZpZWxkLnRpZDsKK30KKworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKworc3RydWN0IGVhcG9sIHsKKwl1OCBzbmFwWzZdOworCXUxNiBldGhlcnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCB0eXBlOworCXUxNiBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzeworCXVuc2lnbmVkIGludCByeF9hc3Nfb2s7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19lcnI7CisJdW5zaWduZWQgaW50IHJ4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9yczsKKwl1bnNpZ25lZCBpbnQgdHhfYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19lcnI7CisJdW5zaWduZWQgaW50IHR4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IG5vX2F1dGhfcnM7CisJdW5zaWduZWQgaW50IG5vX2Fzc19yczsKKwl1bnNpZ25lZCBpbnQgdHhfYXNzX3JxOworCXVuc2lnbmVkIGludCByeF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCByZWFzc29jOworCXVuc2lnbmVkIGludCBzd3R4c3RvcDsKKwl1bnNpZ25lZCBpbnQgc3d0eGF3YWtlOworCXVuc2lnbmVkIGNoYXIgQ3VycmVudFNob3dUeGF0ZTsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfcGFja2V0X3JhdGU7CisJdW5zaWduZWQgaW50IHR4cmV0cnljb3VudDsKK307CisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIHsKKwl1OCBpZDsKKwl1OCBsZW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCisjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDIgLy8xTWJwcworCitlbnVtIHtXTU1fYWxsX2ZyYW1lLCBXTU1fdHdvX2ZyYW1lLCBXTU1fZm91cl9mcmFtZSwgV01NX3NpeF9mcmFtZX07CisjZGVmaW5lIE1BWF9TUF9MZW4gIChXTU1fYWxsX2ZyYW1lIDw8IDQpCisjZGVmaW5lIElFRUU4MDIxMV9RT1NfVElEIDB4MGYKKyNkZWZpbmUgUU9TX0NUTF9OT1RDT05UQUlOX0FDSyAoMHgwMSA8PCA1KQorCisjZGVmaW5lIElFRUU4MDIxMV9EVElNX01CQ0FTVCA0CisjZGVmaW5lIElFRUU4MDIxMV9EVElNX1VDQVNUIDIKKyNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVkFMSUQgMQorI2RlZmluZSBJRUVFODAyMTFfRFRJTV9JTlZBTElEIDAKKworI2RlZmluZSBJRUVFODAyMTFfUFNfRElTQUJMRUQgMAorI2RlZmluZSBJRUVFODAyMTFfUFNfVU5JQ0FTVCBJRUVFODAyMTFfRFRJTV9VQ0FTVAorI2RlZmluZSBJRUVFODAyMTFfUFNfTUJDQVNUIElFRUU4MDIxMV9EVElNX01CQ0FTVAorCisvL2FkZGVkIGJ5IERhdmlkIGZvciBRb1MgMjAwNi82LzMwCisvLyNkZWZpbmUgV01NX0hhbmdfODE4NworI2lmZGVmIFdNTV9IYW5nXzgxODcKKyN1bmRlZiBXTU1fSGFuZ184MTg3CisjZW5kaWYKKworI2RlZmluZSBXTUVfQUNfQksgICAweDAwCisjZGVmaW5lIFdNRV9BQ19CRSAgIDB4MDEKKyNkZWZpbmUgV01FX0FDX1ZJICAgMHgwMgorI2RlZmluZSBXTUVfQUNfVk8gICAweDAzCisjZGVmaW5lIFdNRV9BQ0lfTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BSUZTTl9NQVNLIDB4MDMKKyNkZWZpbmUgV01FX0FDX1BSQU1fTEVOIDE2CisKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMAorCisvL1VQIE1hcHBpbmcgdG8gQUMsIHVzaW5nIGluIE1nbnRRdWVyeV9TZXF1ZW5jZU51bWJlcigpIGFuZCBtYXliZSBmb3IgRFNDUAorLy8jZGVmaW5lIFVQMkFDKHVwKQkoKHVwPDMpID8gKCh1cD09MCk/MTowKSA6ICh1cD4+MSkpCisjZGVmaW5lIFVQMkFDKHVwKSAoCQkgICBcCisJKCh1cCkgPCAxKSA/IFdNRV9BQ19CRSA6IFwKKwkoKHVwKSA8IDMpID8gV01FX0FDX0JLIDogXAorCSgodXApIDwgNCkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCA2KSA/IFdNRV9BQ19WSSA6IFwKKwlXTUVfQUNfVk8pCisvL0FDIE1hcHBpbmcgdG8gVVAsIHVzaW5nIGluIFR4IHBhcnQgZm9yIHNlbGVjdGluZyB0aGUgY29ycmVzcG9uZGluZyBUWCBxdWV1ZQorI2RlZmluZSBBQzJVUChfYWMpCSggICAgICAgXAorCSgoX2FjKSA9PSBXTUVfQUNfVk8pID8gNiA6IFwKKwkoKF9hYykgPT0gV01FX0FDX1ZJKSA/IDUgOiBcCisJKChfYWMpID09IFdNRV9BQ19CSykgPyAxIDogXAorCTApCisKKyNkZWZpbmUJRVRIRVJfQUREUl9MRU4JCTYJLyogbGVuZ3RoIG9mIGFuIEV0aGVybmV0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUgICAgMTQgICAgICAvKiBsZW5ndGggb2YgdHdvIEV0aGVybmV0IGFkZHJlc3MgcGx1cyBldGhlciB0eXBlKi8KKworc3RydWN0CWV0aGVyX2hlYWRlciB7CisJdTggZXRoZXJfZGhvc3RbRVRIRVJfQUREUl9MRU5dOworCXU4IGV0aGVyX3Nob3N0W0VUSEVSX0FERFJfTEVOXTsKKwl1MTYgZXRoZXJfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNpZm5kZWYgRVRIRVJUWVBFX1BBRQorI2RlZmluZQlFVEhFUlRZUEVfUEFFCTB4ODg4ZQkJLyogRUFQT0wgUEFFLzgwMi4xeCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUAorI2RlZmluZQlFVEhFUlRZUEVfSVAJMHgwODAwCQkvKiBJUCBwcm90b2NvbCAqLworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9ic3NfaHR7CisKKwlib29sCQkJCXN1cHBvcnRfaHQ7CisKKwkvLyBIVCByZWxhdGVkIGVsZW1lbnRzCisJdTgJCQkJCWh0X2NhcF9idWZbMzJdOworCXUxNgkJCQkJaHRfY2FwX2xlbjsKKwl1OAkJCQkJaHRfaW5mb19idWZbMzJdOworCXUxNgkJCQkJaHRfaW5mb19sZW47CisKKwlIVF9TUEVDX1ZFUgkJCWh0X3NwZWNfdmVyOworCS8vSFRfQ0FQQUJJTElUWV9FTEUJCQliZEhUQ2FwRWxlOworCS8vSFRfSU5GT1JNQVRJT05fRUxFCQliZEhUSW5mb0VsZTsKKworCWJvb2wJCQkJYWdncmVnYXRpb247CisJYm9vbAkJCQlsb25nX3Nsb3RfdGltZTsKK31ic3NfaHQsICpwYnNzX2h0OworCit0eXBlZGVmIGVudW0gX2VycF90eworCUVSUF9Ob25FUlBwcmVzZW50CT0gMHgwMSwKKwlFUlBfVXNlUHJvdGVjdGlvbgk9IDB4MDIsCisJRVJQX0JhcmtlclByZWFtYmxlTW9kZSA9IDB4MDQsCit9IGVycF90OworCisKK3N0cnVjdCBpZWVlODAyMTFfbmV0d29yayB7CisJLyogVGhlc2UgZW50cmllcyBhcmUgdXNlZCB0byBpZGVudGlmeSBhIHVuaXF1ZSBuZXR3b3JrICovCisJdTggYnNzaWRbRVRIX0FMRU5dOworCXU4IGNoYW5uZWw7CisJLyogRW5zdXJlIG51bGwtdGVybWluYXRlZCBmb3IgYW55IGRlYnVnIG1zZ3MgKi8KKwl1OCBzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJdTggc3NpZF9sZW47CisJc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSBxb3NfZGF0YTsKKworCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQCisJYm9vbAliV2l0aEFpcm9uZXRJRTsKKwlib29sCWJDa2lwU3VwcG9ydGVkOworCWJvb2wJYkNjeFJtRW5hYmxlOworCXUxNiAJQ2N4Um1TdGF0ZVsyXTsKKwkvLyBDQ1h2NCBTNTksIE1CU1NJRC4KKwlib29sCWJNQnNzaWRWYWxpZDsKKwl1OAlNQnNzaWRNYXNrOworCXU4CU1Cc3NpZFs2XTsKKwkvLyBDQ1ggMiBTMzgsIFdMQU4gRGV2aWNlIFZlcnNpb24gTnVtYmVyIGVsZW1lbnQuIEFubmllLCAyMDA2LTA4LTIwLgorCWJvb2wJYldpdGhDY3hWZXJOdW07CisJdTgJQnNzQ2N4VmVyTnVtYmVyOworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4ICByYXRlc1tNQVhfUkFURVNfTEVOR1RIXTsKKwl1OCAgcmF0ZXNfbGVuOworCXU4ICByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCAgcmF0ZXNfZXhfbGVuOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zY2FubmVkOworCXU4ICBtb2RlOworCXUzMiBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCAgZXJwX3ZhbHVlOworCXU4ICB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICByc25faWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCByc25faWVfbGVuOworCisJc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB0aW07CisJdTggIGR0aW1fcGVyaW9kOworCXU4ICBkdGltX2RhdGE7CisJdTMyIGxhc3RfZHRpbV9zdGFfdGltZVsyXTsKKworCS8vYXBwZWRlZCBmb3IgUW9TCisJdTggd21tX2luZm87CisJc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOworCXU4IFFvU19FbmFibGU7CisjaWZkZWYgVEhPTUFTX1RVUkJPCisJdTggVHVyYm9fRW5hYmxlOy8vZW5hYmxlIHR1cmJvIG1vZGUsIGFkZGVkIGJ5IHRob21hcworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXUxNiBDb3VudHJ5SWVMZW47CisJdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOworI2VuZGlmCisJLy8gSFQgUmVsYXRlZCwgYnkgYW15LCAyMDA4LjA0LjI5CisJQlNTX0hUCWJzc2h0OworCS8vIEFkZCB0byBoYW5kbGUgYnJvYWRjb20gQVAgbWFuYWdlbWVudCBmcmFtZSBDQ0sgcmF0ZS4KKwlib29sIGJyb2FkY29tX2NhcF9leGlzdDsKKwlib29sIHJhbGlua19jYXBfZXhpc3Q7CisJYm9vbCBhdGhlcm9zX2NhcF9leGlzdDsKKwlib29sIGNpc2NvX2NhcF9leGlzdDsKKwlib29sIHVua25vd25fY2FwX2V4aXN0OworLy8JdTgJYmVycF9pbmZvOworCWJvb2wJYmVycF9pbmZvX3ZhbGlkOworCWJvb2wgYnVzZXByb3RlY3Rpb247CisJLy9wdXQgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLgorCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK2VudW0gaWVlZTgwMjExX3N0YXRlIHsKKworCS8qIHRoZSBjYXJkIGlzIG5vdCBsaW5rZWQgYXQgYWxsICovCisJSUVFRTgwMjExX05PTElOSyA9IDAsCisKKwkvKiBJRUVFODAyMTFfQVNTT0NJQVRJTkcqIGFyZSBmb3IgQlNTIGNsaWVudCBtb2RlCisJICogdGhlIGRyaXZlciBzaGFsbCBub3QgcGVyZm9ybSBSWCBmaWx0ZXJpbmcgdW5sZXNzCisJICogdGhlIHN0YXRlIGlzIExJTktFRC4KKwkgKiBUaGUgZHJpdmVyIHNoYWxsIGp1c3QgY2hlY2sgZm9yIHRoZSBzdGF0ZSBMSU5LRUQgYW5kCisJICogZGVmYXVsdHMgdG8gTk9MSU5LIGZvciBBTEwgdGhlIG90aGVyIHN0YXRlcyAoaW5jbHVkaW5nCisJICogTElOS0VEX1NDQU5OSU5HKQorCSAqLworCisJLyogdGhlIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aWxsIHN0YXJ0ICh3cSBzY2hlZHVsaW5nKSovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HLAorCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19SRVRSWSwKKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaXMgc2VuZGluZyBBVVRIIHJlcXVlc3QqLworCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORywKKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgaGFzIHN1Y2Nlc3NmdWxseSBhdXRoZW50Y2F0ZWQKKwkgKiBhbmQgaXMgc2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0CisJICovCisJSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQsCisKKwkvKiB0aGUgbGluayBpcyBvay4gdGhlIGNhcmQgYXNzb2NpYXRlZCB0byBhIEJTUyBvciBsaW5rZWQKKwkgKiB0byBhIGlic3MgY2VsbCBvciBhY3RpbmcgYXMgYW4gQVAgYW5kIGNyZWF0aW5nIHRoZSBic3MKKwkgKi8KKwlJRUVFODAyMTFfTElOS0VELAorCisJLyogc2FtZSBhcyBMSU5LRUQsIGJ1dCB0aGUgZHJpdmVyIHNoYWxsIGFwcGx5IFJYIGZpbHRlcgorCSAqIHJ1bGVzIGFzIHdlIGFyZSBpbiBOT19MSU5LIG1vZGUuIEFzIHRoZSBjYXJkIGlzIHN0aWxsCisJICogbG9naWNhbGx5IGxpbmtlZCwgYnV0IGl0IGlzIGRvaW5nIGEgc3luY3JvIHNpdGUgc3VydmV5CisJICogdGhlbiBpdCB3aWxsIGJlIGJhY2sgdG8gTElOS0VEIHN0YXRlLgorCSAqLworCUlFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcsCisKK307CisKKyNkZWZpbmUgREVGQVVMVF9NQVhfU0NBTl9BR0UgKDE1ICogSFopCisjZGVmaW5lIERFRkFVTFRfRlRTIDIzNDYKKworI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQorI2RlZmluZSBDRkdfSUVFRTgwMjExX1JUUyAoMTw8MikKKworI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfTUlOX0NIQU5ORUwgMQorI2RlZmluZSBJRUVFODAyMTFfMjRHSFpfTUFYX0NIQU5ORUwgMTQKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0NIQU5ORUxTIChJRUVFODAyMTFfMjRHSFpfTUFYX0NIQU5ORUwgLSBcCisJCQkJICBJRUVFODAyMTFfMjRHSFpfTUlOX0NIQU5ORUwgKyAxKQorCisjZGVmaW5lIElFRUU4MDIxMV81MkdIWl9NSU5fQ0hBTk5FTCAzNAorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfTUFYX0NIQU5ORUwgMTY1CisjZGVmaW5lIElFRUU4MDIxMV81MkdIWl9DSEFOTkVMUyAoSUVFRTgwMjExXzUyR0haX01BWF9DSEFOTkVMIC0gXAorCQkJCSAgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMICsgMSkKKworCisKK3R5cGVkZWYgc3RydWN0IHR4X3BlbmRpbmdfdHsKKwlpbnQgZnJhZzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworfXR4X3BlbmRpbmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX2JhbmR3aWR0aF9hdXRvc3dpdGNoCit7CisJbG9uZyB0aHJlc2hvbGRfMjBNaHp0bzQwTWh6OworCWxvbmcJdGhyZXNob2xkXzQwTWh6dG8yME1oejsKKwlib29sIGJmb3JjZWRfdHgyME1oejsKKwlib29sIGJhdXRvc3dpdGNoX2VuYWJsZTsKK31iYW5kd2lkdGhfYXV0b3N3aXRjaCwqcGJhbmR3aWR0aF9hdXRvc3dpdGNoOworCisKKy8vYWRkZWQgYnkgYW15IGZvciBvcmRlcgorCisjZGVmaW5lIFJFT1JERVJfV0lOX1NJWkUJMTI4CisjZGVmaW5lIFJFT1JERVJfRU5UUllfTlVNCTEyOAordHlwZWRlZiBzdHJ1Y3QgX1JYX1JFT1JERVJfRU5UUlkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCUxpc3Q7CisJdTE2CQkJU2VxTnVtOworCXN0cnVjdCBpZWVlODAyMTFfcnhiKiBwcnhiOworfSBSWF9SRU9SREVSX0VOVFJZLCAqUFJYX1JFT1JERVJfRU5UUlk7CisvL2FkZGVkIGJ5IGFteSBmb3Igb3JkZXIKK3R5cGVkZWYgZW51bSBfRnN5bmNfU3RhdGV7CisJRGVmYXVsdF9Gc3luYywKKwlIV19Gc3luYywKKwlTV19Gc3luYworfUZzeW5jX1N0YXRlOworCisvLyBQb3dlciBzYXZlIG1vZGUgY29uZmlndXJlZC4KK3R5cGVkZWYJZW51bSBfUlRfUFNfTU9ERQoreworCWVBY3RpdmUsCS8vIEFjdGl2ZS9Db250aW51b3VzIGFjY2Vzcy4KKwllTWF4UHMsCQkvLyBNYXggcG93ZXIgc2F2ZSBtb2RlLgorCWVGYXN0UHMJCS8vIEZhc3QgcG93ZXIgc2F2ZSBtb2RlLgorfVJUX1BTX01PREU7CisKK3R5cGVkZWYgZW51bSBfSVBTX0NBTExCQUNLX0ZVTkNJT04KK3sKKwlJUFNfQ0FMTEJBQ0tfTk9ORSA9IDAsCisJSVBTX0NBTExCQUNLX01HTlRfTElOS19SRVFVRVNUID0gMSwKKwlJUFNfQ0FMTEJBQ0tfSk9JTl9SRVFVRVNUID0gMiwKK31JUFNfQ0FMTEJBQ0tfRlVOQ0lPTjsKKwordHlwZWRlZiBlbnVtIF9SVF9KT0lOX0FDVElPTnsKKwlSVF9KT0lOX0lORlJBICAgPSAxLAorCVJUX0pPSU5fSUJTUyAgPSAyLAorCVJUX1NUQVJUX0lCU1MgPSAzLAorCVJUX05PX0FDVElPTiAgPSA0LAorfVJUX0pPSU5fQUNUSU9OOworCit0eXBlZGVmIHN0cnVjdCBfSWJzc1Bhcm1zeworCXUxNiAgIGF0aW1XaW47Cit9SWJzc1Bhcm1zLCAqUElic3NQYXJtczsKKyNkZWZpbmUgTUFYX05VTV9SQVRFUwkyNjQgLy8gTWF4IG51bSBvZiBzdXBwb3J0IHJhdGVzIGVsZW1lbnQ6IDgsICBNYXggbnVtIG9mIGV4dC4gc3VwcG9ydCByYXRlOiAyNTUuIDA2MTEyMiwgYnkgcmNuamtvLgorCisvLyBSRiBzdGF0ZS4KK3R5cGVkZWYJZW51bSBfUlRfUkZfUE9XRVJfU1RBVEUKK3sKKwllUmZPbiwKKwllUmZTbGVlcCwKKwllUmZPZmYKK31SVF9SRl9QT1dFUl9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgX1JUX1BPV0VSX1NBVkVfQ09OVFJPTAoreworCisJLy8KKwkvLyBJbmFjdGl2ZSBQb3dlciBTYXZlKElQUykgOiBEaXNhYmxlIFJGIHdoZW4gZGlzY29ubmVjdGVkCisJLy8KKwlib29sCQkJCWJJbmFjdGl2ZVBzOworCWJvb2wJCQkJYklQU01vZGVCYWNrdXA7CisJYm9vbAkJCQliU3dSZlByb2Nlc3Npbmc7CisJUlRfUkZfUE9XRVJfU1RBVEUJZUluYWN0aXZlUG93ZXJTdGF0ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgCUluYWN0aXZlUHNXb3JrSXRlbTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlJbmFjdGl2ZVBzVGltZXI7CisKKwkvLyBSZXR1cm4gcG9pbnQgZm9yIGpvaW4gYWN0aW9uCisJSVBTX0NBTExCQUNLX0ZVTkNJT04JUmV0dXJuUG9pbnQ7CisKKwkvLyBSZWNvcmVkIFBhcmFtZXRlcnMgZm9yIHJlc2NoZWR1bGVkIEpvaW5SZXF1ZXN0CisJYm9vbAkJCQliVG1wQnNzRGVzYzsKKwlSVF9KT0lOX0FDVElPTgkJdG1wSm9pbkFjdGlvbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgdG1wQnNzRGVzYzsKKworCS8vIFJlY29yZWQgUGFyYW1ldGVycyBmb3IgcmVzY2hlZHVsZWQgTWdudExpbmtSZXF1ZXN0CisJYm9vbAkJCQliVG1wU2Nhbk9ubHk7CisJYm9vbAkJCQliVG1wQWN0aXZlU2NhbjsKKwlib29sCQkJCWJUbXBGaWx0ZXJIaWRkZW5BUDsKKwlib29sCQkJCWJUbXBVcGRhdGVQYXJtczsKKwl1OAkJCQkJdG1wU3NpZEJ1ZlszM107CisJT0NURVRfU1RSSU5HCQkJdG1wU3NpZDJTY2FuOworCWJvb2wJCQkJYlRtcFNzaWQyU2NhbjsKKwl1OAkJCQkJdG1wTmV0d29ya1R5cGU7CisJdTgJCQkJCXRtcENoYW5uZWxOdW1iZXI7CisJdTE2CQkJCQl0bXBCY25QZXJpb2Q7CisJdTgJCQkJCXRtcER0aW1QZXJpb2Q7CisJdTE2CQkJCQl0bXBtQ2FwOworCU9DVEVUX1NUUklORwkJCXRtcFN1cHBSYXRlU2V0OworCXU4CQkJCQl0bXBTdXBwUmF0ZUJ1ZltNQVhfTlVNX1JBVEVTXTsKKwlib29sCQkJCWJUbXBTdXBwUmF0ZTsKKwlJYnNzUGFybXMJCQkJdG1wSWJwbTsKKwlib29sCQkJCWJUbXBJYnBtOworCisJLy8KKwkvLyBMZWlzcmUgUG9zd2VyIFNhdmUgOiBEaXNhYmxlIFJGIGlmIGNvbm5lY3RlZCBidXQgdHJhZmZpYyBpcyBub3QgYnVzeQorCS8vCisJYm9vbAkJCQliTGVpc3VyZVBzOworCit9UlRfUE9XRVJfU0FWRV9DT05UUk9MLCpQUlRfUE9XRVJfU0FWRV9DT05UUk9MOworCit0eXBlZGVmIHUzMiBSVF9SRl9DSEFOR0VfU09VUkNFOworI2RlZmluZSBSRl9DSEFOR0VfQllfU1cgQklUMzEKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0hXIEJJVDMwCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9QUyBCSVQyOQorI2RlZmluZSBSRl9DSEFOR0VfQllfSVBTIEJJVDI4CisjZGVmaW5lIFJGX0NIQU5HRV9CWV9JTklUCTAJLy8gRG8gbm90IGNoYW5nZSB0aGUgUkZPZmYgcmVhc29uLiBEZWZpbmVkIGJ5IEJydWNlLCAyMDA4LTAxLTE3LgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAordHlwZWRlZiBlbnVtCit7CisJQ09VTlRSWV9DT0RFX0ZDQyA9IDAsCisJQ09VTlRSWV9DT0RFX0lDID0gMSwKKwlDT1VOVFJZX0NPREVfRVRTSSA9IDIsCisJQ09VTlRSWV9DT0RFX1NQQUlOID0gMywKKwlDT1VOVFJZX0NPREVfRlJBTkNFID0gNCwKKwlDT1VOVFJZX0NPREVfTUtLID0gNSwKKwlDT1VOVFJZX0NPREVfTUtLMSA9IDYsCisJQ09VTlRSWV9DT0RFX0lTUkFFTCA9IDcsCisJQ09VTlRSWV9DT0RFX1RFTEVDLAorCUNPVU5UUllfQ09ERV9NSUMsCisJQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4KK31jb3VudHJ5X2NvZGVfdHlwZV90OworI2VuZGlmCisKKyNkZWZpbmUgUlRfTUFYX0xEX1NMT1RfTlVNCTEwCit0eXBlZGVmIHN0cnVjdCBfUlRfTElOS19ERVRFQ1RfVHsKKworCXUzMgkJCQlOdW1SZWN2QmNuSW5QZXJpb2Q7CisJdTMyCQkJCU51bVJlY3ZEYXRhSW5QZXJpb2Q7CisKKwl1MzIJCQkJUnhCY25OdW1bUlRfTUFYX0xEX1NMT1RfTlVNXTsJLy8gbnVtYmVyIG9mIFJ4IGJlYWNvbiAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworCXUzMgkJCQlSeERhdGFOdW1bUlRfTUFYX0xEX1NMT1RfTlVNXTsJLy8gbnVtYmVyIG9mIFJ4IGRhdGEgLyBDaGVja0ZvckhhbmdfcGVyaW9kICB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKKwl1MTYJCQkJU2xvdE51bTsJLy8gbnVtYmVyIG9mIENoZWNrRm9ySGFuZyBwZXJpb2QgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCisJdTE2CQkJCVNsb3RJbmRleDsKKworCXUzMgkJCQlOdW1UeE9rSW5QZXJpb2Q7CisJdTMyCQkJCU51bVJ4T2tJblBlcmlvZDsKKwlib29sCQkJCWJCdXN5VHJhZmZpYzsKK31SVF9MSU5LX0RFVEVDVF9ULCAqUFJUX0xJTktfREVURUNUX1Q7CisKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWM7CisKKwkvL2h3IHNlY3VyaXR5IHJlbGF0ZWQKKy8vCXU4IGh3c2VjX3N1cHBvcnQ7IC8vc3VwcG9ydD8KKwl1OCBod3NlY19hY3RpdmU7ICAvL2h3IHNlY3VyaXR5IGFjdGl2ZS4KKwlib29sIGlzX3NpbGVudF9yZXNldDsKKwlib29sIGllZWVfdXA7CisJLy9hZGRlZCBieSBhbXkKKwlib29sIGJTdXBwb3J0UmVtb3RlV2FrZVVwOworCVJUX1BTX01PREUJZG90MTFQb3dlclNhdmVNb2RlOyAvLyBQb3dlciBzYXZlIG1vZGUgY29uZmlndXJlZC4KKwlib29sIGFjdHNjYW5uaW5nOworCWJvb2wgYmVpbnJldHJ5OworCVJUX1JGX1BPV0VSX1NUQVRFCQllUkZQb3dlclN0YXRlOworCVJUX1JGX0NIQU5HRV9TT1VSQ0UJUmZPZmZSZWFzb247CisJYm9vbCBpc19zZXRfa2V5OworCS8vMTFuIHNwZWMgcmVsYXRlZCBJIHdvbmRlciBpZiBUaGVzZSBpbmZvIHN0cnVjdHVyZSBuZWVkIHRvIGJlIG1vdmVkIG91dCBvZiBpZWVlODAyMTFfZGV2aWNlCisKKwkvLzExbiBIVCBiZWxvdworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbzsKKwkvL3N0cnVjdCB0aW1lcl9saXN0CQlTd0J3VGltZXI7CisvLwlzcGlubG9ja190IGNobmxvcF9zcGlubG9jazsKKwlzcGlubG9ja190IGJ3X3NwaW5sb2NrOworCisJc3BpbmxvY2tfdCByZW9yZGVyX3NwaW5sb2NrOworCS8vIGZvciBIVCBvcGVyYXRpb24gcmF0ZSBzZXQuICB3ZSB1c2UgdGhpcyBvbmUgZm9yIEhUIGRhdGEgcmF0ZSB0byBzZXBlcmF0ZSBkaWZmZXJlbnQgZGVzY3JpcHRvcnMKKwkvL3RoZSB3YXkgZmlsbCB0aGlzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBJRQorCXU4CVJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMTZdOwkJLy91c2UgUkFUUiBmb3JtYXQKKwl1OAlkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzE2XTsJCS8vdXNlIFJBVFIgZm9ybWF0CisJdTgJUmVnSFRTdXBwUmF0ZVNldFsxNl07CisJdTgJCQkJSFRDdXJyZW50T3BlcmFSYXRlOworCXU4CQkJCUhUSGlnaGVzdE9wZXJhUmF0ZTsKKwkvL3diIGFkZGVkIGZvciByYXRlIG9wZXJhdGlvbiBtb2RlIHRvIGZpcm13YXJlCisJdTgJYlR4RGlzYWJsZVJhdGVGYWxsQmFjazsKKwl1OCAJYlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOworCWF0b21pY190CWF0bV9jaG5sb3A7CisJYXRvbWljX3QJYXRtX3N3Ync7CisvLwl1OAlIVEhpZ2hlc3RPcGVyYVJhdGU7CisvLwl1OCAJSFRDdXJyZW50T3BlcmFSYXRlOworCisJLy8gODAyLjExZSBhbmQgV01NIFRyYWZmaWMgU3RyZWFtIEluZm8gKFRYKQorCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX0FkbWl0X0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfUGVuZGluZ19MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX1VudXNlZF9MaXN0OworCVRYX1RTX1JFQ09SRAkJVHhUc1JlY29yZFtUT1RBTF9UU19OVU1dOworCS8vIDgwMi4xMWUgYW5kIFdNTSBUcmFmZmljIFN0cmVhbSBJbmZvIChSWCkKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19BZG1pdF9MaXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4X1RTX1BlbmRpbmdfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19VbnVzZWRfTGlzdDsKKwlSWF9UU19SRUNPUkQJCVJ4VHNSZWNvcmRbVE9UQUxfVFNfTlVNXTsKKy8vI2lmZGVmIFRPX0RPX0xJU1QKKwlSWF9SRU9SREVSX0VOVFJZCVJ4UmVvcmRlckVudHJ5WzEyOF07CisJc3RydWN0IGxpc3RfaGVhZAkJUnhSZW9yZGVyX1VudXNlZF9MaXN0OworLy8jZW5kaWYKKwkvLyBRb3MgcmVsYXRlZC4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMDEuCisvLwlQU1RBX1FPUwkJCXBTdGFRb3M7CisJdTgJCQkJRm9yY2VkUHJpb3JpdHk7CQkvLyBGb3JjZSBwZXItcGFja2V0IHByaW9yaXR5IDF+Ny4gKGRlZmF1bHQ6IDAsIG5vdCB0byBmb3JjZSBpdC4pCisKKworCS8qIEJvb2trZWVwaW5nIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIGllZWVfc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zb2Z0bWFjX3N0YXRzIHNvZnRtYWNfc3RhdHM7CisKKwkvKiBQcm9iZSAvIEJlYWNvbiBtYW5hZ2VtZW50ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfbGlzdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmtzOworCWludCBzY2FuczsKKwlpbnQgc2Nhbl9hZ2U7CisKKwlpbnQgaXdfbW9kZTsgLyogb3BlcmF0aW5nIG1vZGUgKElXX01PREVfKikgKi8KKwlzdHJ1Y3QgaXdfc3B5X2RhdGEgc3B5X2RhdGE7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisJaW50IGF1dGhfbW9kZTsKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZW5jcnlwdF9tc2R1OworCWludCBob3N0X2RlY3J5cHQ7CisJLyogaG9zdCBwZXJmb3JtcyBtdWx0aWNhc3QgZGVjcnlwdGlvbiAqLworCWludCBob3N0X21jX2RlY3J5cHQ7CisKKwkvKiBob3N0IHNob3VsZCBzdHJpcCBJViBhbmQgSUNWIGZyb20gcHJvdGVjdGVkIGZyYW1lcyAqLworCS8qIG1lYW5pbmdmdWwgb25seSB3aGVuIGhhcmR3YXJlIGRlY3J5cHRpb24gaXMgYmVpbmcgdXNlZCAqLworCWludCBob3N0X3N0cmlwX2l2X2ljdjsKKworCWludCBob3N0X29wZW5fZnJhZzsKKwlpbnQgaG9zdF9idWlsZF9pdjsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlib29sIGJIYWxmV2lyZWxlc3NOMjRHTW9kZTsKKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKwl1OCBhcF9tYWNfYWRkcls2XTsKKwl1MTYgcGFpcndpc2Vfa2V5X3R5cGU7CisJdTE2IGdyb3VwX2tleV90eXBlOworCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfZGVpbml0X2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdFtXRVBfS0VZU107CisJaW50IHR4X2tleWlkeDsgLyogZGVmYXVsdCBUWCBrZXkgaW5kZXggKGNyeXB0W3R4X2tleWlkeF0pICovCisJc3RydWN0IHRpbWVyX2xpc3QgY3J5cHRfZGVpbml0X3RpbWVyOworCWludCBjcnlwdF9xdWllc2NlZDsKKworCWludCBiY3J4X3N0YV9rZXk7IC8qIHVzZSBpbmRpdmlkdWFsIGtleXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGV2ZW4KKwkJCSAgICogd2l0aCBSWCBvZiBicm9hZC9tdWx0aWNhc3QgZnJhbWVzICovCisKKwkvKiBGcmFnbWVudGF0aW9uIHN0cnVjdHVyZXMgKi8KKwkvLyBlYWNoIHN0cmVhbWluZyBjb250YWluIGEgZW50cnkKKwlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgZnJhZ19jYWNoZVsxN11bSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgZnJhZ19uZXh0X2lkeFsxN107CisJdTE2IGZ0czsgLyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEIDIzNDZVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEIDEKKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgMjM0NlUKKwl1MTYgcnRzOyAvKiBSVFMgdGhyZXNob2xkICovCisKKwkvKiBBc3NvY2lhdGlvbiBpbmZvICovCisJdTggYnNzaWRbRVRIX0FMRU5dOworCisJLyogVGhpcyBzdG9yZXMgaW5mb3MgZm9yIHRoZSBjdXJyZW50IG5ldHdvcmsuCisJICogRWl0aGVyIHRoZSBuZXR3b3JrIHdlIGFyZSBhc3NvY2lhdGVkIGluIElORlJBU1RSVUNUVVJFCisJICogb3IgdGhlIG5ldHdvcmsgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgaW4gTUFTVEVSIG1vZGUuCisJICogYWQtaG9jIGlzIGEgbWl4dHVyZSA7LSkuCisJICogTm90ZSB0aGF0IGluIGluZnJhc3RydWN0dXJlIG1vZGUsIGV2ZW4gd2hlbiBub3QgYXNzb2NpYXRlZCwKKwkgKiBmaWVsZHMgYnNzaWQgYW5kIGVzc2lkIG1heSBiZSB2YWxpZCAoaWYgd3BhX3NldCBhbmQgZXNzaWRfc2V0CisJICogYXJlIHRydWUpIGFzIHRoeSBjYXJyeSB0aGUgdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIHZpYSBpd2NvbmZpZworCSAqLworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBjdXJyZW50X25ldHdvcms7CisKKwllbnVtIGllZWU4MDIxMV9zdGF0ZSBzdGF0ZTsKKworCWludCBzaG9ydF9zbG90OworCWludCByZWdfbW9kZTsKKwlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLworCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KKwlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCisJaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisKKwlpbnQgcGVyZmVjdF9yc3NpOworCWludCB3b3JzdF9yc3NpOworCisJdTE2IHByZXZfc2VxX2N0bDsgICAgICAgLyogdXNlZCB0byBkcm9wIGR1cGxpY2F0ZSBmcmFtZXMgKi8KKworCS8qIG1hcCBvZiBhbGxvd2VkIGNoYW5uZWxzLiAwIGlzIGR1bW15ICovCisJLy8gRklYTUU6IHJlbWViZXIgdG8gZGVmYXVsdCB0byBhIGJhc2ljIGNoYW5uZWwgcGxhbiBkZXBlbmRpbmcgb2YgdGhlIFBIWSB0eXBlCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXZvaWQqIHBEb3QxMWRJbmZvOworCWJvb2wgYkdsb2JhbERvbWFpbjsKKyNlbHNlCisJaW50IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKyNlbmRpZgorCWludCByYXRlOyAgICAgICAvKiBjdXJyZW50IHJhdGUgKi8KKwlpbnQgYmFzaWNfcmF0ZTsKKwkvL0ZJWE1FOiBwbGVhY2UgY2FsbGJhY2ssIHNlZSBpZiByZWR1bmRhbnQgd2l0aCBzb2Z0bWFjX2ZlYXR1cmVzCisJc2hvcnQgYWN0aXZlX3NjYW47CisKKwkvKiB0aGlzIGNvbnRhaW5zIGZsYWdzIGZvciBzZWxlY3RpdmVseSBlbmFibGUgc29mdG1hYyBzdXBwb3J0ICovCisJdTE2IHNvZnRtYWNfZmVhdHVyZXM7CisKKwkvKiBpZiB0aGUgc2VxdWVuY2UgY29udHJvbCBmaWVsZCBpcyBub3QgZmlsbGVkIGJ5IEhXICovCisJdTE2IHNlcV9jdHJsWzVdOworCisJLyogYXNzb2NpYXRpb24gcHJvY2VkdXJlIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXUxNiBhc3NvY2lhdGVfc2VxOworCisJLyogQUlEIGZvciBSVFhlZCBhc3NvY2lhdGlvbiByZXNwb25zZXMgKi8KKwl1MTYgYXNzb2NfaWQ7CisKKwkvKiBwb3dlciBzYXZlIG1vZGUgcmVsYXRlZCovCisJc2hvcnQgcHM7CisJc2hvcnQgc3RhX3NsZWVwOworCWludCBwc190aW1lb3V0OworCWludCBwc19wZXJpb2Q7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHBzX3Rhc2s7CisJdTMyIHBzX3RoOworCXUzMiBwc190bDsKKworCXNob3J0IHJhd190eDsKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzaG9ydCBxdWV1ZV9zdG9wOworCXNob3J0IHNjYW5uaW5nOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNjYW5fc2VtOworCisJc3BpbmxvY2tfdCBtZ210X3R4X2xvY2s7CisJc3BpbmxvY2tfdCBiZWFjb25fbG9jazsKKworCXNob3J0IGJlYWNvbl90eGluZzsKKworCXNob3J0IHdhcF9zZXQ7CisJc2hvcnQgc3NpZF9zZXQ7CisKKwl1OCAgd3BheF90eXBlX3NldDsgICAgLy97YWRkZWQgYnkgRGF2aWQsIDIwMDYuOS4yOH0KKwl1MzIgd3BheF90eXBlX25vdGlmeTsgLy97YWRkZWQgYnkgRGF2aWQsIDIwMDYuOS4yNn0KKworCS8qIFFvUyByZWxhdGVkIGZsYWcgKi8KKwljaGFyIGluaXRfd21tcGFyYW1fZmxhZzsKKwkvKiBzZXQgb24gaW5pdGlhbGl6YXRpb24gKi8KKwl1OCAgcW9zX3N1cHBvcnQ7CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqbWdtdF9xdWV1ZV9yaW5nW01HTVRfUVVFVUVfTlVNXTsKKwlpbnQgbWdtdF9xdWV1ZV9oZWFkOworCWludCBtZ210X3F1ZXVlX3RhaWw7CisvL3sgYWRkZWQgZm9yIHJ0bDgxOXgKKyNkZWZpbmUgSUVFRTgwMjExX1FVRVVFX0xJTUlUIDEyOAorCXU4IEFzb2NSZXRyeUNvdW50OworCXVuc2lnbmVkIGludCBod19oZWFkZXI7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2Jfd2FpdFFbTUFYX1FVRVVFX1NJWkVdOworCXN0cnVjdCBza19idWZmX2hlYWQgIHNrYl9hZ2dRW01BWF9RVUVVRV9TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICBza2JfZHJ2X2FnZ1FbTUFYX1FVRVVFX1NJWkVdOworCXUzMglzdGFfZWRjYV9wYXJhbVs0XTsKKwlib29sIGFnZ3JlZ2F0aW9uOworCS8vIEVuYWJsZS9EaXNhYmxlIFJ4IGltbWVkaWF0ZSBCQSBjYXBhYmlsaXR5LgorCWJvb2wgZW5hYmxlX3J4X2ltbV9CQTsKKwlib29sIGJpYnNzY29vcmRpbmF0b3I7CisKKwkvLytieSBhbXkgZm9yIERNICwwODA1MTUKKwkvL0R5bmFtaWMgVHggcG93ZXIgZm9yIG5lYXIvZmFyIHJhbmdlIGVuYWJsZS9EaXNhYmxlICAsIGJ5IGFteSAsIDIwMDgtMDUtMTUKKwlib29sCWJkeW5hbWljX3R4cG93ZXJfZW5hYmxlOworCisJYm9vbCBiQ1RTVG9TZWxmRW5hYmxlOworCXU4IAlDVFNUb1NlbGZUSDsKKworCXUzMiAJZnN5bmNfdGltZV9pbnRlcnZhbDsKKwl1MzIJZnN5bmNfcmF0ZV9iaXRtYXA7CisJdTgJZnN5bmNfcnNzaV90aHJlc2hvbGQ7CisJYm9vbAliZnN5bmNfZW5hYmxlOworCisJdTgJZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsOwkJLy8gRnN5bmNNdWx0aXBsZVRpbWVJbnRlcnZhbCAqIEZzeW5jVGltZUludGVydmFsCisJdTMyCWZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkOwkJLy8gbG93IHRocmVzaG9sZAorCXUzMglmc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQ7CSAvLyBkZWNyZWFzZSB0aHJlc2hvbGQKKwlGc3luY19TdGF0ZQkJCWZzeW5jX3N0YXRlOworCWJvb2wJCWJpc19hbnlfbm9uYmVwa3RzOworCS8vMjBNaHogNDBNaHogQXV0b1N3aXRjaCBUaHJlc2hvbGQKKwliYW5kd2lkdGhfYXV0b3N3aXRjaCBiYW5kd2lkdGhfYXV0b19zd2l0Y2g7CisJLy9mb3IgdHhwb3dlciB0cmFja2luZworCWJvb2wgRndSV1JGOworCisJLy9hZGRlZCBieSBhbXkgZm9yIEFQIHJvYW1pbmcKKwlSVF9MSU5LX0RFVEVDVF9UCUxpbmtEZXRlY3RJbmZvOworCS8vYWRkZWQgYnkgYW15IGZvciBwcworCVJUX1BPV0VSX1NBVkVfQ09OVFJPTAlQb3dlclNhdmVDb250cm9sOworLy99CisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCisJc3RydWN0ICB0eF9wZW5kaW5nX3QgdHhfcGVuZGluZzsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSBpcyBzZXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY2lhdGVfdGltZXI7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGJlYWNvbl90aW1lcjsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYXNzb2NpYXRlX2NvbXBsZXRlX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfcHJvY2VkdXJlX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc29mdG1hY19zY2FuX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgYXNzb2NpYXRlX3JldHJ5X3dxOworCSBzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXJ0X2lic3Nfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IHd4X3N5bmNfc2Nhbl93cTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisgICAgICAgIC8vIFFvcyByZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0wMS4KKyAgICAgICAgLy9TVEFfUU9TICBTdGFRb3M7CisKKyAgICAgICAgLy91MzIgU1RBX0VEQ0FfUEFSQU1bNF07CisJLy9DSEFOTkVMX0FDQ0VTU19TRVRUSU5HIENoYW5uZWxBY2Nlc3NTZXR0aW5nOworCisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KKwl2b2lkICgqc2V0X3NlY3VyaXR5KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpOworCisJLyogVXNlZCB0byBUWCBkYXRhIGZyYW1lIGJ5IHVzaW5nIHR4YiBzdHJ1Y3RzLgorCSAqIHRoaXMgaXMgbm90IHVzZWQgaWYgaW4gdGhlIHNvZnRtYWNfZmVhdHVyZXMKKwkgKiBpcyBzZXQgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFCisJICovCisJaW50ICgqaGFyZF9zdGFydF94bWl0KShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJaW50ICgqcmVzZXRfcG9ydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisgICAgICAgIGludCAoKmlzX3F1ZXVlX2Z1bGwpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IHByaSk7CisKKyAgICAgICAgaW50ICgqaGFuZGxlX21hbmFnZW1lbnQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrLCB1MTYgdHlwZSk7CisgICAgICAgIGludCAoKmlzX3Fvc19hY3RpdmUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCS8qIFNvZnRtYWMtZ2VuZXJhdGVkIGZyYW1lcyAobWFtYWdlbWVudCkgYXJlIFRYZWQgdmlhIHRoaXMKKwkgKiBjYWxsYmFjayBpZiB0aGUgZmxhZyBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzCisJICogbm90IHNldC4gQXMgc29tZSBjYXJkcyBtYXkgaGF2ZSBkaWZmZXJlbnQgSFcgcXVldWVzIHRoYXQKKwkgKiBvbmUgbWlnaHQgd2FudCB0byB1c2UgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQgZnJhbWVzCisJICogdGhlIG9wdGlvbiB0byBoYXZlIHR3byBjYWxsYmFja3MgbWlnaHQgYmUgdXNlZnVsLgorCSAqIFRoaXMgZnVjbnRpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJaW50ICgqc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB1c2VkIGluc3RlYWQgb2YgaGFyZF9zdGFydF94bWl0IChub3Qgc29mdG1hY19oYXJkX3N0YXJ0X3htaXQpCisJICogaWYgdGhlIElFRUVfU09GVE1BQ19UWF9RVUVVRSBmZWF0dXJlIGlzIHVzZWQgdG8gVFggZGF0YQorCSAqIGZyYW1lcy4gSSB0aGUgb3B0aW9uIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgaXMgYWxzbyBzZXQKKwkgKiB0aGVuIGFsc28gbWFuYWdlbWVudCBmcmFtZXMgYXJlIHNlbnQgdmlhIHRoaXMgY2FsbGJhY2suCisJICogVGhpcyBmdW5jdGlvbiBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCByYXRlKTsKKworCS8qIHN0b3BzIHRoZSBIVyBxdWV1ZSBmb3IgREFUQSBmcmFtZXMuIFVzZWZ1bCB0byBhdm9pZAorCSAqIHdhc3RlIHRpbWUgdG8gVFggZGF0YSBmcmFtZSB3aGVuIHdlIGFyZSByZWFzc29jaWF0aW5nCisJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCisJICovCisJdm9pZCAoKmRhdGFfaGFyZF9zdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIE9LIHRoaXMgaXMgY29tcGxlbWVudGFyIHRvIGRhdGFfcG9sbF9oYXJkX3N0b3AgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3Jlc3VtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBhc2sgdG8gdGhlIGRyaXZlciB0byByZXR1bmUgdGhlIHJhZGlvIC4KKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4gdGhlIGRyaXZlciBzaG91bGQgZW5zdXJlCisJICogdGhlIHJhZGlvIGhhcyBiZWVuIHN3aXRoY2VkIGJlZm9yZSByZXR1cm4uCisJICovCisJdm9pZCAoKnNldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCisJICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgorCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCisJICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAorCSAqLworCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0CisJICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKKwkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQorCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKKwkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCisJICovCisJdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTE2IHR4X3JhdGUpOworCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcHNfcmVxdWVzdF90eF9hY2spIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdGgsIHUzMiB0bCk7CisJc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCWludCAoKmhhbmRsZV9iZWFjb24pIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKiBiZWFjb24sIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIG5ldHdvcmspOworCWludCAoKmhhbmRsZV9hc3NvY19yZXNwb25zZSkgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICogcmVzcCwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yayk7CisKKworCS8qIGNoZWNrIHdoZXRoZXIgVHggaHcgcmVzb3VjZSBhdmFpbGFibGUgKi8KKwlzaG9ydCAoKmNoZWNrX25pY19lbm91Z2hfZGVzYykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKKwkvL2FkZGVkIGJ5IHdiIGZvciBIVCByZWxhdGVkCisvLwl2b2lkICgqU3dDaG5sQnlUaW1lckhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjaGFubmVsKTsKKwl2b2lkICgqU2V0QldNb2RlSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCk7CisvLwl2b2lkICgqVXBkYXRlSGFsUkFUUlRhYmxlSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTgqIHBNY3NSYXRlKTsKKwlib29sICgqR2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCXZvaWQgKCpTZXRXaXJlbGVzc01vZGUpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHdpcmVsZXNzX21vZGUpOworCWJvb2wgKCpHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKwl2b2lkICgqSW5pdGlhbEdhaW5IYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBPcGVyYXRpb24pOworCisJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGRhdGEKKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX2llZWU4MDIxMSAqLworCXU4IHByaXZbMF07Cit9OworCisjZGVmaW5lIElFRUVfQSAgICAgICAgICAgICgxPDwwKQorI2RlZmluZSBJRUVFX0IgICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIElFRUVfTl8yNEcgCQkgICgxPDw0KQorI2RlZmluZQlJRUVFX05fNUcJCSAgKDE8PDUpCisjZGVmaW5lIElFRUVfTU9ERV9NQVNLICAgIChJRUVFX0F8SUVFRV9CfElFRUVfRykKKworLyogR2VuZXJhdGUgYSA4MDIuMTEgaGVhZGVyICovCisKKy8qIFVzZXMgdGhlIGNoYW5uZWwgY2hhbmdlIGNhbGxiYWNrIGRpcmVjdGx5CisgKiBpbnN0ZWFkIG9mIFtzdGFydC9zdG9wXSBzY2FuIGNhbGxiYWNrcworICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TQ0FOICgxPDwyKQorCisvKiBQZXJmb3JtIGF1dGhlbnRpY2F0aW9uIGFuZCBhc3NvY2lhdGlvbiBoYW5kc2hha2UgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSAoMTw8MykKKworLyogR2VuZXJhdGUgcHJvYmUgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlEgKDE8PDQpCisKKy8qIEdlbmVyYXRlIHJlc3BvbmVzIHRvIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJTICgxPDw1KQorCisvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZXMgdGhlIG5ldGlmIHF1ZXVlCisgKiB3YWtlL3N0b3AgZm9yIHRoZSBkcml2ZXIsIHRha2luZyBjYXJlIG9mIDgwMi4xMQorICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4gKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFICgxPDw3KQorCisvKiBVc2VzIG9ubHkgdGhlIHNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQKKyAqIGV2ZW4gZm9yIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKDE8PDgpCisKKy8qIEdlbmVyYXRlIGJlYWNvbnMuICBUaGUgc3RhY2sgd2lsbCBlbnF1ZXVlIGJlYWNvbnMKKyAqIHRvIHRoZSBjYXJkCisgKi8KKyNkZWZpbmUgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgKDE8PDYpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc192YWxpZF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZmMpKSB7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpCisJCQloZHJsZW4gPSBJRUVFODAyMTFfNEFERFJfTEVOOyAvKiBBZGRyNCAqLworCQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKQorCQkJaGRybGVuICs9IDI7IC8qIFFPUyBjdHJsKi8KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSkgeworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDSzoKKwkJCWhkcmxlbiA9IElFRUU4MDIxMV8xQUREUl9MRU47CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IElFRUU4MDIxMV8yQUREUl9MRU47CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGRybGVuOworfQorCitzdGF0aWMgaW5saW5lIHU4ICppZWVlODAyMTFfZ2V0X3BheWxvYWQoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlzd2l0Y2ggKGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKKwljYXNlIElFRUU4MDIxMV8xQUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopaGRyKS0+cGF5bG9hZDsKKwljYXNlIElFRUU4MDIxMV8yQUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzJhZGRyICopaGRyKS0+cGF5bG9hZDsKKwljYXNlIElFRUU4MDIxMV8zQUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopaGRyKS0+cGF5bG9hZDsKKwljYXNlIElFRUU4MDIxMV80QUREUl9MRU46CisJCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopaGRyKS0+cGF5bG9hZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9pc19vZmRtX3JhdGUodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUgJiB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykgeworCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV82TUI6CisJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKKwljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfY2NrX3JhdGUodTggcmF0ZSkKK3sKKwlzd2l0Y2ggKHJhdGUgJiB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykgeworCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzFNQjoKKwljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6CisJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgorCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKK2V4dGVybiBpbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IHNrX2J1ZmYgKmZyYWcsCisJaW50IGhkcl9sZW4pOworCitleHRlcm4gaW50IGllZWU4MDIxMV94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICopOworCisKKy8qIGllZWU4MDIxMV9yeC5jICovCitleHRlcm4gaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKKworLyogaWVlZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTgKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhKiB3cnF1LCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisjZW5kaWYKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbik7CisKKy8qIGllZWU4MDIxMV9zb2Z0bWFjLmMgKi8KK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOworZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KTsKKwordm9pZCBTZW5kRGlzYXNzb2NpYXRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KiBhc1N0YSwgdTggYXNSc24pOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc29mdG1hY19pbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKTsKK2V4dGVybiB2b2lkIG5vdGlmeV93eF9hc3NvY19ldmVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcHNfdHhfYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBzdWNjZXNzKTsKKworZXh0ZXJuIHZvaWQgc29mdG1hY19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworCisvKiBpZWVlODAyMTFfY3J5cHRfY2NtcCZ0a2lwJndlcC5jICovCitleHRlcm4gdm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKTsKKworLyogaWVlZTgwMjExX3NvZnRtYWNfd3guYyAqLworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0KTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKKy8vZXh0ZXJuIHZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfd3hfc3luY19zY2FuX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X3NldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfZ2V0X3J0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworLy9IVAorI2RlZmluZSBNQVhfUkVDRUlWRV9CVUZGRVJfU0laRSA5MTAwICAvLworZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUQ2FwYWJpbGl0eSh1OCogQ2FwSUUsIHU4KiBUaXRsZVN0cmluZyApOworZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUSW5mbyh1OCogIEluZm9JRSwgdTgqIFRpdGxlU3RyaW5nKTsKKwordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCAgICBPZmZzZXQpOworZXh0ZXJuIHZvaWQgSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7CitleHRlcm4gdm9pZCBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRDYXAsIHU4KiBsZW4sIHU4IGlzRW5jcnlwdCk7CitleHRlcm4gdm9pZCBIVENvbnN0cnVjdEluZm9FbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRJbmZvLCB1OCogbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwb3NSVDJSVEFnZywgdTgqIGxlbik7CitleHRlcm4gdm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgSFRJbml0aWFsaXplSFRJbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUJzc0Rlc2MoUEJTU19IVCBwQnNzSFQpOworZXh0ZXJuIHZvaWQgSFRSZXNldFNlbGZBbmRTYXZlUGVlclNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIHBOZXR3b3JrKTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlU2VsZkFuZFBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIHBOZXR3b3JrKTsKK2V4dGVybiB1OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE1DU1JhdGVTZXQsIHU4KiBwTUNTRmlsdGVyKTsKK2V4dGVybiB1OCBNQ1NfRklMVEVSX0FMTFtdOworZXh0ZXJuIHUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA7CitleHRlcm4gdTggSFRDQ2hlY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiAgIHBGcmFtZSk7CisvL2V4dGVybiB2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gdm9pZCBIVFJlc2V0SU9UU2V0dGluZyhQUlRfSElHSF9USFJPVUdIUFVUICBwSFRJbmZvKTsKK2V4dGVybiBib29sIElzSFRIYWxmTm1vZGVBUHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworZXh0ZXJuIHUxNiBIVEhhbGZNY3NUb0RhdGFSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAgdTggICAgICBuTWNzUmF0ZSk7CitleHRlcm4gdTE2IEhUTWNzVG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5NY3NSYXRlKTsKK2V4dGVybiB1MTYgIFR4Q291bnRUb0RhdGFSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTggbkRhdGFSYXRlKTsKKy8vZnVuY3Rpb24gaW4gQkFQUk9DLmMKK2V4dGVybiBpbnQgaWVlZTgwMjExX3J4X0FEREJBUmVxKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IGllZWU4MDIxMV9yeF9BRERCQVJzcCggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcnhfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZCBUc0luaXRBZGRCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUWF9UU19SRUNPUkQgICBwVFMsIHU4IFBvbGljeSwgdTggYk92ZXJ3cml0ZVBlbmRpbmcpOworZXh0ZXJuIHZvaWQgVHNJbml0RGVsQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgVFJfU0VMRUNUIFR4UnhTZWxlY3QpOworZXh0ZXJuIHZvaWQgQmFTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIFR4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIFJ4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB2b2lkIFJlc2V0QmFFbnRyeSggUEJBX1JFQ09SRCBwQkEpOworLy9mdW5jdGlvbiBpbiBUUy5jCitleHRlcm4gYm9vbCBHZXRUcygKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogICAgICAgIGllZWUsCisJUFRTX0NPTU1PTl9JTkZPICAgICAgICAgICAgICAgICAqcHBUUywKKwl1OCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHIsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUQsCisJVFJfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICBUeFJ4U2VsZWN0LCAgLy9SeDoxLCBUeDowCisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRkTmV3VHMKKwkpOworZXh0ZXJuIHZvaWQgVFNJbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKK2V4dGVybiAgdm9pZCBUc1N0YXJ0QWRkQmFQcm9jZXNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JEICAgcFR4VFMpOworZXh0ZXJuIHZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogQWRkcik7CitleHRlcm4gdm9pZCBSZW1vdmVBbGxUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSk7Cit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIGllZWU4MDIxMV9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pIHsKKwlzdGF0aWMgY2hhciBlc2NhcGVkW0lXX0VTU0lEX01BWF9TSVpFICogMiArIDFdOworCWNvbnN0IGNoYXIgKnMgPSBlc3NpZDsKKwljaGFyICpkID0gZXNjYXBlZDsKKworCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoZXNzaWQsIGVzc2lkX2xlbikpIHsKKwkJbWVtY3B5KGVzY2FwZWQsICI8aGlkZGVuPiIsIHNpemVvZigiPGhpZGRlbj4iKSk7CisJCXJldHVybiBlc2NhcGVkOworCX0KKworCWVzc2lkX2xlbiA9IG1pbihlc3NpZF9sZW4sICh1OClJV19FU1NJRF9NQVhfU0laRSk7CisJd2hpbGUgKGVzc2lkX2xlbi0tKSB7CisJCWlmICgqcyA9PSAnXDAnKSB7CisJCQkqZCsrID0gJ1xcJzsKKwkJCSpkKysgPSAnMCc7CisJCQlzKys7CisJCX0gZWxzZSB7CisJCQkqZCsrID0gKnMrKzsKKwkJfQorCX0KKwkqZCA9ICdcMCc7CisJcmV0dXJuIGVzY2FwZWQ7Cit9CisKKy8qIEZvciB0aGUgZnVuY3Rpb24gaXMgbW9yZSByZWxhdGVkIHRvIGhhcmR3YXJlIHNldHRpbmcsIGl0J3MgYmV0dGVyIHRvIHVzZSB0aGUKKyAqIGllZWUgaGFuZGxlciB0byByZWZlciB0byBpdC4KKyAqLworZXh0ZXJuIHNob3J0IGNoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcXVldWVfaW5kZXgpOworZXh0ZXJuIGludCBpZWVlODAyMTFfZGF0YV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKKwkJdTE2IGxlbmd0aCwKKwkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKK3ZvaWQgaWVlZTgwMjExX2luZGljYXRlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcnhiKiogcHJ4YkluZGljYXRlQXJyYXksdTggIGluZGV4KTsKKyNkZWZpbmUgUlRfQVNPQ19SRVRSWV9MSU1JVAk1CisjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWU3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogSG9zdCBBUCBjcnlwdG8gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3RBUCBjcnlwdG8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7Cit9OworCisKK3N0cnVjdCBpZWVlODAyMTFfY3J5cHRvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFsZ3M7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvICpoY3J5cHQ7CisKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgICBpbnQgZm9yY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmVudHJ5OworCisJZm9yIChwdHIgPSBpZWVlLT5jcnlwdF9kZWluaXRfbGlzdC5uZXh0LCBuID0gcHRyLT5uZXh0OworCSAgICAgcHRyICE9ICZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdDsgcHRyID0gbiwgbiA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEsIGxpc3QpOworCisJCWlmIChhdG9taWNfcmVhZCgmZW50cnktPnJlZmNudCkgIT0gMCAmJiAhZm9yY2UpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbChwdHIpOworCisJCWlmIChlbnRyeS0+b3BzKQorCQkJZW50cnktPm9wcy0+ZGVpbml0KGVudHJ5LT5wcml2KTsKKwkJa2ZyZWUoZW50cnkpOworCX0KK30KKwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMCk7CisJaWYgKCFsaXN0X2VtcHR5KCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRyaWVzIHJlbWFpbmluZyBpbiBkZWxheWVkIGNyeXB0ICIKKwkJICAgICAgICJkZWxldGlvbiBsaXN0XG4iLCBpZWVlLT5kZXYtPm5hbWUpOworCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK30KKwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKmNyeXB0ID09IE5VTEwpCisJCXJldHVybjsKKworCXRtcCA9ICpjcnlwdDsKKwkqY3J5cHQgPSBOVUxMOworCisJLyogbXVzdCBub3QgcnVuIG9wcy0+ZGVpbml0KCkgd2hpbGUgdGhlcmUgbWF5IGJlIHBlbmRpbmcgZW5jcnlwdCBvcgorCSAqIGRlY3J5cHQgb3BlcmF0aW9ucy4gVXNlIGEgbGlzdCBvZiBkZWxheWVkIGRlaW5pdHMgdG8gYXZvaWQgbmVlZGluZworCSAqIGxvY2tpbmcuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZ0bXAtPmxpc3QsICZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7CisJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpKSB7CisJCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGc7CisKKwlpZiAoaGNyeXB0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWFsZyA9IGttYWxsb2Moc2l6ZW9mKCphbGcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWxnID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGFsZywgMCwgc2l6ZW9mKCphbGcpKTsKKwlhbGctPm9wcyA9IG9wczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmYWxnLT5saXN0LCAmaGNyeXB0LT5hbGdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcydcbiIsCisJICAgICAgIG9wcy0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICpkZWxfYWxnID0gTlVMTDsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCWZvciAocHRyID0gaGNyeXB0LT5hbGdzLm5leHQ7IHB0ciAhPSAmaGNyeXB0LT5hbGdzOyBwdHIgPSBwdHItPm5leHQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCWlmIChhbGctPm9wcyA9PSBvcHMpIHsKKwkJCWxpc3RfZGVsKCZhbGctPmxpc3QpOworCQkJZGVsX2FsZyA9IGFsZzsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRlbF9hbGcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCisJCSAgICAgICAiJyVzJ1xuIiwgb3BzLT5uYW1lKTsKKwkJa2ZyZWUoZGVsX2FsZyk7CisJfQorCisJcmV0dXJuIGRlbF9hbGcgPyAwIDogLTE7Cit9CisKKworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICogaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICpmb3VuZF9hbGcgPSBOVUxMOworCisJaWYgKGhjcnlwdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlpZiAoc3RyY21wKGFsZy0+b3BzLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlmb3VuZF9hbGcgPSBhbGc7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmb3VuZF9hbGcpCisJCXJldHVybiBmb3VuZF9hbGctPm9wczsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkICogaWVlZTgwMjExX2NyeXB0X251bGxfaW5pdChpbnQga2V5aWR4KSB7IHJldHVybiAodm9pZCAqKSAxOyB9CitzdGF0aWMgdm9pZCBpZWVlODAyMTFfY3J5cHRfbnVsbF9kZWluaXQodm9pZCAqcHJpdikge30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfbnVsbCA9IHsKKwkubmFtZQkJCT0gIk5VTEwiLAorCS5pbml0CQkJPSBpZWVlODAyMTFfY3J5cHRfbnVsbF9pbml0LAorCS5kZWluaXQJCQk9IGllZWU4MDIxMV9jcnlwdF9udWxsX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IE5VTEwsCisJLmRlY3J5cHRfbXBkdQkJPSBOVUxMLAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gTlVMTCwKKwkuZ2V0X2tleQkJPSBOVUxMLAorCS5leHRyYV9wcmVmaXhfbGVuCT0gMCwKKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSAwLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCit9OworCitpbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9faW5pdCh2b2lkKQoreworCWludCByZXQgPSAtRU5PTUVNOworCisJaGNyeXB0ID0ga21hbGxvYyhzaXplb2YoKmhjcnlwdCksIEdGUF9LRVJORUwpOworCWlmICghaGNyeXB0KQorCQlnb3RvIG91dDsKKworCW1lbXNldChoY3J5cHQsIDAsIHNpemVvZigqaGNyeXB0KSk7CisJSU5JVF9MSVNUX0hFQUQoJmhjcnlwdC0+YWxncyk7CisJc3Bpbl9sb2NrX2luaXQoJmhjcnlwdC0+bG9jayk7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X251bGwpOworCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGhjcnlwdCk7CisJCWhjcnlwdCA9IE5VTEw7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKKworCWlmIChoY3J5cHQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dCwgbiA9IHB0ci0+bmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7CisJICAgICBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlsaXN0X2RlbChwdHIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJICAgICAgICInJXMnIChkZWluaXQpXG4iLCBhbGctPm9wcy0+bmFtZSk7CisJCWtmcmVlKGFsZyk7CisJfQorCisJa2ZyZWUoaGNyeXB0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGEzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgaWVlZTgwMjExIGNyeXB0byBtb2R1bGUuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0NSWVBUX0gKKyNkZWZpbmUgSUVFRTgwMjExX0NSWVBUX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBpbml0IG5ldyBjcnlwdG8gY29udGV4dCAoZS5nLiwgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHNwYWNlLAorCSAqIHNlbGVjdCBJViwgZXRjLik7IHJldHVybnMgTlVMTCBvbiBmYWlsdXJlIG9yIHBvaW50ZXIgdG8gYWxsb2NhdGVkCisJICogcHJpdmF0ZSBkYXRhIG9uIHN1Y2Nlc3MgKi8KKwl2b2lkICogKCppbml0KShpbnQga2V5aWR4KTsKKworCS8qIGRlaW5pdGlhbGl6ZSBjcnlwdG8gY29udGV4dCBhbmQgZnJlZSBhbGxvY2F0ZWQgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAoKmRlaW5pdCkodm9pZCAqcHJpdik7CisKKwkvKiBlbmNyeXB0L2RlY3J5cHQgcmV0dXJuIDwgMCBvbiBlcnJvciBvciA+PSAwIG9uIHN1Y2Nlc3MuIFRoZSByZXR1cm4KKwkgKiB2YWx1ZSBmcm9tIGRlY3J5cHRfbXBkdSBpcyBwYXNzZWQgYXMgdGhlIGtleWlkeCB2YWx1ZSBmb3IKKwkgKiBkZWNyeXB0X21zZHUuIHNrYiBtdXN0IGhhdmUgZW5vdWdoIGhlYWQgYW5kIHRhaWwgcm9vbSBmb3IgdGhlCisJICogZW5jcnlwdGlvbjsgaWYgbm90LCBlcnJvciB3aWxsIGJlIHJldHVybmVkOyB0aGVzZSBmdW5jdGlvbnMgYXJlCisJICogY2FsbGVkIGZvciBhbGwgTVBEVXMgKGkuZS4sIGZyYWdtZW50cykuCisJICovCisJaW50ICgqZW5jcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisKKwkvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgZnVsbCBNU0RVcywgaS5lLiBmdWxsIGZyYW1lcy4KKwkgKiBUaGVzZSBjYW4gYmUgTlVMTCBpZiBmdWxsIE1TRFUgb3BlcmF0aW9ucyBhcmUgbm90IG5lZWRlZC4gKi8KKwlpbnQgKCplbmNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsIGludCBoZHJfbGVuLAorCQkJICAgIHZvaWQgKnByaXYpOworCisJaW50ICgqc2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKwlpbnQgKCpnZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCisJLyogcHJvY2ZzIGhhbmRsZXIgZm9yIHByaW50aW5nIG91dCBrZXkgaW5mb3JtYXRpb24gYW5kIHBvc3NpYmxlCisJICogc3RhdGlzdGljcyAqLworCWNoYXIgKiAoKnByaW50X3N0YXRzKShjaGFyICpwLCB2b2lkICpwcml2KTsKKworCS8qIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIGJ5IGVuY3J5cHRpb247IGVuY3J5cHQgYnVmIGlzCisJICogYWxsb2NhdGVkIHdpdGggZXh0cmFfcHJlZml4X2xlbiBieXRlcywgY29weSBvZiBpbl9idWYsIGFuZAorCSAqIGV4dHJhX3Bvc3RmaXhfbGVuOyBlbmNyeXB0IG5lZWQgbm90IHVzZSBhbGwgdGhpcyBzcGFjZSwgYnV0CisJICogdGhlIHJlc3VsdCBtdXN0IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQgY29ycmVjdAorCSAqIGxlbmd0aCBtdXN0IGJlIHJldHVybmVkICovCisJaW50IGV4dHJhX3ByZWZpeF9sZW4sIGV4dHJhX3Bvc3RmaXhfbGVuOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogZGVsYXllZCBkZWxldGlvbiBsaXN0ICovCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJdm9pZCAqcHJpdjsKKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitpbnQgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICogaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiwgaW50KTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzM2JmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgQ0NNUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyAgICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBDQ01QIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgQUVTX0JMT0NLX0xFTiAxNgorI2RlZmluZSBDQ01QX0hEUl9MRU4gOAorI2RlZmluZSBDQ01QX01JQ19MRU4gOAorI2RlZmluZSBDQ01QX1RLX0xFTiAxNgorI2RlZmluZSBDQ01QX1BOX0xFTiA2CisKK3N0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhIHsKKwl1OCBrZXlbQ0NNUF9US19MRU5dOworCWludCBrZXlfc2V0OworCisJdTggdHhfcG5bQ0NNUF9QTl9MRU5dOworCXU4IHJ4X3BuW0NDTVBfUE5fTEVOXTsKKworCXUzMiBkb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnM7CisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXM7CisJdTMyIGRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnM7CisKKwlpbnQga2V5X2lkeDsKKworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisKKwkvKiBzY3JhdGNoIGJ1ZmZlcnMgZm9yIHZpcnRfdG9fcGFnZSgpIChjcnlwdG8gQVBJKSAqLworCXU4IHR4X2IwW0FFU19CTE9DS19MRU5dLCB0eF9iW0FFU19CTE9DS19MRU5dLAorCQl0eF9lW0FFU19CTE9DS19MRU5dLCB0eF9zMFtBRVNfQkxPQ0tfTEVOXTsKKwl1OCByeF9iMFtBRVNfQkxPQ0tfTEVOXSwgcnhfYltBRVNfQkxPQ0tfTEVOXSwgcnhfYVtBRVNfQkxPQ0tfTEVOXTsKK307CisKK3ZvaWQgaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgICAgY29uc3QgdTggcHRbMTZdLCB1OCBjdFsxNl0pCit7CisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSgodm9pZCopdGZtLCBjdCwgcHQpOworfQorCitzdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jY21wX2luaXQoaW50IGtleV9pZHgpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKnByaXY7CisKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAocHJpdiA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OworCisgICAgICAgcHJpdi0+dGZtID0gKHZvaWQqKWNyeXB0b19hbGxvY19jaXBoZXIoImFlcyIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dGZtKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X2NjbXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCSAgICAgICAiY3J5cHRvIEFQSSBhZXNcbiIpOworCQlwcml2LT50Zm0gPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHByaXY7CisKK2ZhaWw6CisJaWYgKHByaXYpIHsKKwkJaWYgKHByaXYtPnRmbSkKKwkJCWNyeXB0b19mcmVlX2NpcGhlcigodm9pZCopcHJpdi0+dGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIHZvaWQgaWVlZTgwMjExX2NjbXBfZGVpbml0KHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKl9wcml2ID0gcHJpdjsKKworCWlmIChfcHJpdiAmJiBfcHJpdi0+dGZtKQorCQljcnlwdG9fZnJlZV9jaXBoZXIoKHZvaWQqKV9wcml2LT50Zm0pOworCWtmcmVlKHByaXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4b3JfYmxvY2sodTggKmIsIHU4ICphLCBzaXplX3QgbGVuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYltpXSBePSBhW2ldOworfQorCisKKworc3RhdGljIHZvaWQgY2NtcF9pbml0X2Jsb2NrcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyLAorCQkJICAgICB1OCAqcG4sIHNpemVfdCBkbGVuLCB1OCAqYjAsIHU4ICphdXRoLAorCQkJICAgICB1OCAqczApCit7CisJdTggKnBvcywgcWMgPSAwOworCXNpemVfdCBhYWRfbGVuOworCXUxNiBmYzsKKwlpbnQgYTRfaW5jbHVkZWQsIHFjX2luY2x1ZGVkOworCXU4IGFhZFsyICogQUVTX0JMT0NLX0xFTl07CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlhNF9pbmNsdWRlZCA9ICgoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09CisJCSAgICAgICAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpOworCS8qCisJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgorCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4MDgpKTsKKwkqLworCS8vIGZpeGVkIGJ5IERhdmlkIDoyMDA2LjkuNgorCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKKwkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDgwKSk7CisJYWFkX2xlbiA9IDIyOworCWlmIChhNF9pbmNsdWRlZCkKKwkJYWFkX2xlbiArPSA2OworCWlmIChxY19pbmNsdWRlZCkgeworCQlwb3MgPSAodTggKikgJmhkci0+YWRkcjQ7CisJCWlmIChhNF9pbmNsdWRlZCkKKwkJCXBvcyArPSA2OworCQlxYyA9ICpwb3MgJiAweDBmOworCQlhYWRfbGVuICs9IDI7CisJfQorCS8qIENDTSBJbml0aWFsIEJsb2NrOgorCSAqIEZsYWcgKEluY2x1ZGUgYXV0aGVudGljYXRpb24gaGVhZGVyLCBNPTMgKDgtb2N0ZXQgTUlDKSwKKwkgKiAgICAgICBMPTEgKDItb2N0ZXQgRGxlbikpCisJICogTm9uY2U6IDB4MDAgfCBBMiB8IFBOCisJICogRGxlbiAqLworCWIwWzBdID0gMHg1OTsKKwliMFsxXSA9IHFjOworCW1lbWNweShiMCArIDIsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYjAgKyA4LCBwbiwgQ0NNUF9QTl9MRU4pOworCWIwWzE0XSA9IChkbGVuID4+IDgpICYgMHhmZjsKKwliMFsxNV0gPSBkbGVuICYgMHhmZjsKKworCS8qIEFBRDoKKwkgKiBGQyB3aXRoIGJpdHMgNC4uNiBhbmQgMTEuLjEzIG1hc2tlZCB0byB6ZXJvOyAxNCBpcyBhbHdheXMgb25lCisJICogQTEgfCBBMiB8IEEzCisJICogU0Mgd2l0aCBiaXRzIDQuLjE1IChzZXEjKSBtYXNrZWQgdG8gemVybworCSAqIEE0IChpZiBwcmVzZW50KQorCSAqIFFDIChpZiBwcmVzZW50KQorCSAqLworCXBvcyA9ICh1OCAqKSBoZHI7CisJYWFkWzBdID0gMDsgLyogYWFkX2xlbiA+PiA4ICovCisJYWFkWzFdID0gYWFkX2xlbiAmIDB4ZmY7CisJYWFkWzJdID0gcG9zWzBdICYgMHg4ZjsKKwlhYWRbM10gPSBwb3NbMV0gJiAweGM3OworCW1lbWNweShhYWQgKyA0LCBoZHItPmFkZHIxLCAzICogRVRIX0FMRU4pOworCXBvcyA9ICh1OCAqKSAmaGRyLT5zZXFfY3RsOworCWFhZFsyMl0gPSBwb3NbMF0gJiAweDBmOworCWFhZFsyM10gPSAwOyAvKiBhbGwgYml0cyBtYXNrZWQgKi8KKwltZW1zZXQoYWFkICsgMjQsIDAsIDgpOworCWlmIChhNF9pbmNsdWRlZCkKKwkJbWVtY3B5KGFhZCArIDI0LCBoZHItPmFkZHI0LCBFVEhfQUxFTik7CisJaWYgKHFjX2luY2x1ZGVkKSB7CisJCWFhZFthNF9pbmNsdWRlZCA/IDMwIDogMjRdID0gcWM7CisJCS8qIHJlc3Qgb2YgUUMgbWFza2VkICovCisJfQorCisJLyogU3RhcnQgd2l0aCB0aGUgZmlyc3QgYmxvY2sgYW5kIEFBRCAqLworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYjAsIGF1dGgpOworCXhvcl9ibG9jayhhdXRoLCBhYWQsIEFFU19CTE9DS19MRU4pOworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYXV0aCwgYXV0aCk7CisJeG9yX2Jsb2NrKGF1dGgsICZhYWRbQUVTX0JMT0NLX0xFTl0sIEFFU19CTE9DS19MRU4pOworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYXV0aCwgYXV0aCk7CisJYjBbMF0gJj0gMHgwNzsKKwliMFsxNF0gPSBiMFsxNV0gPSAwOworCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYjAsIHMwKTsKK30KKworCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwlpbnQgZGF0YV9sZW4sIGk7CisJdTggKnBvczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IENDTVBfSERSX0xFTiB8fAorCSAgICBza2JfdGFpbHJvb20oc2tiKSA8IENDTVBfTUlDX0xFTiB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgQ0NNUF9IRFJfTEVOKTsKKwltZW1tb3ZlKHBvcywgcG9zICsgQ0NNUF9IRFJfTEVOLCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKy8vCW1pYyA9IHNrYl9wdXQoc2tiLCBDQ01QX01JQ19MRU4pOworCisJaSA9IENDTVBfUE5fTEVOIC0gMTsKKwl3aGlsZSAoaSA+PSAwKSB7CisJCWtleS0+dHhfcG5baV0rKzsKKwkJaWYgKGtleS0+dHhfcG5baV0gIT0gMCkKKwkJCWJyZWFrOworCQlpLS07CisJfQorCisJKnBvcysrID0ga2V5LT50eF9wbls1XTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzRdOworCSpwb3MrKyA9IDA7CisJKnBvcysrID0gKGtleS0+a2V5X2lkeCA8PCA2KSB8ICgxIDw8IDUpIC8qIEV4dCBJViBpbmNsdWRlZCAqLzsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzNdOworCSpwb3MrKyA9IGtleS0+dHhfcG5bMl07CisJKnBvcysrID0ga2V5LT50eF9wblsxXTsKKwkqcG9zKysgPSBrZXktPnR4X3BuWzBdOworCisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCWludCBibG9ja3MsIGxhc3QsIGxlbjsKKwkJdTggKm1pYzsKKwkJdTggKmIwID0ga2V5LT50eF9iMDsKKwkJdTggKmIgPSBrZXktPnR4X2I7CisJCXU4ICplID0ga2V5LT50eF9lOworCQl1OCAqczAgPSBrZXktPnR4X3MwOworCisJCS8vbWljIGlzIG1vdmVkIHRvIGhlcmUgYnkgam9obgorCQltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKKworCQljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIGtleS0+dHhfcG4sIGRhdGFfbGVuLCBiMCwgYiwgczApOworCisJCWJsb2NrcyA9IChkYXRhX2xlbiArIEFFU19CTE9DS19MRU4gLSAxKSAvIEFFU19CTE9DS19MRU47CisJCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CisKKwkJZm9yIChpID0gMTsgaSA8PSBibG9ja3M7IGkrKykgeworCQkJbGVuID0gKGkgPT0gYmxvY2tzICYmIGxhc3QpID8gbGFzdCA6IEFFU19CTE9DS19MRU47CisJCQkvKiBBdXRoZW50aWNhdGlvbiAqLworCQkJeG9yX2Jsb2NrKGIsIHBvcywgbGVuKTsKKwkJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiLCBiKTsKKwkJCS8qIEVuY3J5cHRpb24sIHdpdGggY291bnRlciAqLworCQkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOworCQkJYjBbMTVdID0gaSAmIDB4ZmY7CisJCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGUpOworCQkJeG9yX2Jsb2NrKHBvcywgZSwgbGVuKTsKKwkJCXBvcyArPSBsZW47CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgQ0NNUF9NSUNfTEVOOyBpKyspCisJCQltaWNbaV0gPSBiW2ldIF4gczBbaV07CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwl1OCBrZXlpZHgsICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggcG5bNl07CisKKwlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgQ0NNUF9IRFJfTEVOICsgQ0NNUF9NSUNfTEVOKSB7CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzKys7CisJCXJldHVybiAtMTsKKwl9CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CisJa2V5aWR4ID0gcG9zWzNdOworCWlmICghKGtleWlkeCAmICgxIDw8IDUpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVjZWl2ZWQgcGFja2V0IHdpdGhvdXQgRXh0SVYiCisJCQkgICAgICAgIiBmbGFnIGZyb20gIiBNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQl9CisJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzKys7CisJCXJldHVybiAtMjsKKwl9CisJa2V5aWR4ID4+PSA2OworCWlmIChrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKKwkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwga2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlyZXR1cm4gLTY7CisJfQorCWlmICgha2V5LT5rZXlfc2V0KSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQKKwkJCSAgICAgICAiIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCIKKwkJCSAgICAgICAiIGtleVxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSwga2V5aWR4KTsKKwkJfQorCQlyZXR1cm4gLTM7CisJfQorCisJcG5bMF0gPSBwb3NbN107CisJcG5bMV0gPSBwb3NbNl07CisJcG5bMl0gPSBwb3NbNV07CisJcG5bM10gPSBwb3NbNF07CisJcG5bNF0gPSBwb3NbMV07CisJcG5bNV0gPSBwb3NbMF07CisJcG9zICs9IDg7CisKKwlpZiAobWVtY21wKHBuLCBrZXktPnJ4X3BuLCBDQ01QX1BOX0xFTikgPD0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ0NNUDogcmVwbGF5IGRldGVjdGVkOiBTVEE9IiBNQUNfRk1UCisJCQkgICAgICAgIiBwcmV2aW91cyBQTiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJICAgICAgICJyZWNlaXZlZCBQTiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQkgICAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSwgTUFDX0FSRyhrZXktPnJ4X3BuKSwKKwkJCSAgICAgICBNQUNfQVJHKHBuKSk7CisJCX0KKwkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBSZXBsYXlzKys7CisJCXJldHVybiAtNDsKKwl9CisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQorCXsKKwkJc2l6ZV90IGRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gQ0NNUF9IRFJfTEVOIC0gQ0NNUF9NSUNfTEVOOworCQl1OCAqbWljID0gc2tiLT5kYXRhICsgc2tiLT5sZW4gLSBDQ01QX01JQ19MRU47CisJCXU4ICpiMCA9IGtleS0+cnhfYjA7CisJCXU4ICpiID0ga2V5LT5yeF9iOworCQl1OCAqYSA9IGtleS0+cnhfYTsKKwkJaW50IGksIGJsb2NrcywgbGFzdCwgbGVuOworCisKKwkJY2NtcF9pbml0X2Jsb2NrcyhrZXktPnRmbSwgaGRyLCBwbiwgZGF0YV9sZW4sIGIwLCBhLCBiKTsKKwkJeG9yX2Jsb2NrKG1pYywgYiwgQ0NNUF9NSUNfTEVOKTsKKworCQlibG9ja3MgPSAoZGF0YV9sZW4gKyBBRVNfQkxPQ0tfTEVOIC0gMSkgLyBBRVNfQkxPQ0tfTEVOOworCQlsYXN0ID0gZGF0YV9sZW4gJSBBRVNfQkxPQ0tfTEVOOworCisJCWZvciAoaSA9IDE7IGkgPD0gYmxvY2tzOyBpKyspIHsKKwkJCWxlbiA9IChpID09IGJsb2NrcyAmJiBsYXN0KSA/IGxhc3QgOiBBRVNfQkxPQ0tfTEVOOworCQkJLyogRGVjcnlwdCwgd2l0aCBjb3VudGVyICovCisJCQliMFsxNF0gPSAoaSA+PiA4KSAmIDB4ZmY7CisJCQliMFsxNV0gPSBpICYgMHhmZjsKKwkJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiMCwgYik7CisJCQl4b3JfYmxvY2socG9zLCBiLCBsZW4pOworCQkJLyogQXV0aGVudGljYXRpb24gKi8KKwkJCXhvcl9ibG9jayhhLCBwb3MsIGxlbik7CisJCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYSwgYSk7CisJCQlwb3MgKz0gbGVuOworCQl9CisKKwkJaWYgKG1lbWNtcChtaWMsIGEsIENDTVBfTUlDX0xFTikgIT0gMCkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiBkZWNyeXB0IGZhaWxlZDogU1RBPSIKKwkJCQlNQUNfRk1UICJcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJfQorCQkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKys7CisJCQlyZXR1cm4gLTU7CisJCX0KKworCQltZW1jcHkoa2V5LT5yeF9wbiwgcG4sIENDTVBfUE5fTEVOKTsKKwl9CisJLyogUmVtb3ZlIGhkciBhbmQgTUlDICovCisJbWVtbW92ZShza2ItPmRhdGEgKyBDQ01QX0hEUl9MRU4sIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCBDQ01QX0hEUl9MRU4pOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBDQ01QX01JQ19MRU4pOworCisJcmV0dXJuIGtleWlkeDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKKwlpbnQga2V5aWR4OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkYXRhLT50Zm07CisKKwlrZXlpZHggPSBkYXRhLT5rZXlfaWR4OworCW1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsKKwlkYXRhLT5rZXlfaWR4ID0ga2V5aWR4OworCWRhdGEtPnRmbSA9IHRmbTsKKwlpZiAobGVuID09IENDTVBfVEtfTEVOKSB7CisJCW1lbWNweShkYXRhLT5rZXksIGtleSwgQ0NNUF9US19MRU4pOworCQlkYXRhLT5rZXlfc2V0ID0gMTsKKwkJaWYgKHNlcSkgeworCQkJZGF0YS0+cnhfcG5bMF0gPSBzZXFbNV07CisJCQlkYXRhLT5yeF9wblsxXSA9IHNlcVs0XTsKKwkJCWRhdGEtPnJ4X3BuWzJdID0gc2VxWzNdOworCQkJZGF0YS0+cnhfcG5bM10gPSBzZXFbMl07CisJCQlkYXRhLT5yeF9wbls0XSA9IHNlcVsxXTsKKwkJCWRhdGEtPnJ4X3BuWzVdID0gc2VxWzBdOworCQl9CisJCWNyeXB0b19jaXBoZXJfc2V0a2V5KCh2b2lkKilkYXRhLT50Zm0sIGRhdGEtPmtleSwgQ0NNUF9US19MRU4pOworCX0gZWxzZSBpZiAobGVuID09IDApCisJCWRhdGEtPmtleV9zZXQgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfY2NtcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CisKKwlpZiAobGVuIDwgQ0NNUF9US19MRU4pCisJCXJldHVybiAtMTsKKworCWlmICghZGF0YS0+a2V5X3NldCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGtleSwgZGF0YS0+a2V5LCBDQ01QX1RLX0xFTik7CisKKwlpZiAoc2VxKSB7CisJCXNlcVswXSA9IGRhdGEtPnR4X3BuWzVdOworCQlzZXFbMV0gPSBkYXRhLT50eF9wbls0XTsKKwkJc2VxWzJdID0gZGF0YS0+dHhfcG5bM107CisJCXNlcVszXSA9IGRhdGEtPnR4X3BuWzJdOworCQlzZXFbNF0gPSBkYXRhLT50eF9wblsxXTsKKwkJc2VxWzVdID0gZGF0YS0+dHhfcG5bMF07CisJfQorCisJcmV0dXJuIENDTVBfVEtfTEVOOworfQorCisKK3N0YXRpYyBjaGFyICogaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqY2NtcCA9IHByaXY7CisJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1DQ01QIGtleV9zZXQ9JWQgIgorCQkgICAgICJ0eF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJyeF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgICJmb3JtYXRfZXJyb3JzPSVkIHJlcGxheXM9JWQgZGVjcnlwdF9lcnJvcnM9JWRcbiIsCisJCSAgICAgY2NtcC0+a2V5X2lkeCwgY2NtcC0+a2V5X3NldCwKKwkJICAgICBNQUNfQVJHKGNjbXAtPnR4X3BuKSwgTUFDX0FSRyhjY21wLT5yeF9wbiksCisJCSAgICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzLAorCQkgICAgIGNjbXAtPmRvdDExUlNOQVN0YXRzQ0NNUFJlcGxheXMsCisJCSAgICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QRGVjcnlwdEVycm9ycyk7CisKKwlyZXR1cm4gcDsKK30KKwordm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpCit7CisvLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfY2NtcCA9IHsKKwkubmFtZQkJCT0gIkNDTVAiLAorCS5pbml0CQkJPSBpZWVlODAyMTFfY2NtcF9pbml0LAorCS5kZWluaXQJCQk9IGllZWU4MDIxMV9jY21wX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IGllZWU4MDIxMV9jY21wX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBpZWVlODAyMTFfY2NtcF9nZXRfa2V5LAorCS5wcmludF9zdGF0cwkJPSBpZWVlODAyMTFfY2NtcF9wcmludF9zdGF0cywKKwkuZXh0cmFfcHJlZml4X2xlbgk9IENDTVBfSERSX0xFTiwKKwkuZXh0cmFfcG9zdGZpeF9sZW4JPSBDQ01QX01JQ19MRU4sCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKK2ludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9jY21wKTsKK30KKwordm9pZCBfX2V4aXQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxYjk5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYwpAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqIEhvc3QgQVAgY3J5cHQ6IGhvc3QtYmFzZWQgVEtJUCBlbmNyeXB0aW9uIGltcGxlbWVudGF0aW9uIGZvciBIb3N0IEFQIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0LCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisJI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBUS0lQIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhIHsKKyNkZWZpbmUgVEtJUF9LRVlfTEVOIDMyCisJdTgga2V5W1RLSVBfS0VZX0xFTl07CisJaW50IGtleV9zZXQ7CisKKwl1MzIgdHhfaXYzMjsKKwl1MTYgdHhfaXYxNjsKKwl1MTYgdHhfdHRha1s1XTsKKwlpbnQgdHhfcGhhc2UxX2RvbmU7CisKKwl1MzIgcnhfaXYzMjsKKwl1MTYgcnhfaXYxNjsKKwl1MTYgcnhfdHRha1s1XTsKKwlpbnQgcnhfcGhhc2UxX2RvbmU7CisJdTMyIHJ4X2l2MzJfbmV3OworCXUxNiByeF9pdjE2X25ldzsKKworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzOworCXUzMiBkb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnM7CisJdTMyIGRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXM7CisKKwlpbnQga2V5X2lkeDsKKworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpyeF90Zm1fYXJjNDsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnJ4X3RmbV9taWNoYWVsOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0eF90Zm1fYXJjNDsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnR4X3RmbV9taWNoYWVsOworCisJLyogc2NyYXRjaCBidWZmZXJzIGZvciB2aXJ0X3RvX3BhZ2UoKSAoY3J5cHRvIEFQSSkgKi8KKwl1OCByeF9oZHJbMTZdLCB0eF9oZHJbMTZdOworfTsKKworc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfdGtpcF9pbml0KGludCBrZXlfaWR4KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5X2lkeDsKKworCXByaXYtPnR4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKKwkJCUNSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX2FyYzQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJCQkiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpdi0+dHhfdGZtX2FyYzQgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+dHhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAorCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm1fbWljaGFlbCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCSJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpdi0+dHhfdGZtX21pY2hhZWwgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJcHJpdi0+cnhfdGZtX2FyYzQgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLAorCQkJQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fYXJjNCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkJCSJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcml2LT5yeF90Zm1fYXJjNCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcml2LT5yeF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY19oYXNoKCJtaWNoYWVsX21pYyIsIDAsCisJCQlDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJ4X3RmbV9taWNoYWVsKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCQkJImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlwcml2LT5yeF90Zm1fbWljaGFlbCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gcHJpdjsKKworZmFpbDoKKwlpZiAocHJpdikgeworCQlpZiAocHJpdi0+dHhfdGZtX21pY2hhZWwpCisJCQljcnlwdG9fZnJlZV9oYXNoKHByaXYtPnR4X3RmbV9taWNoYWVsKTsKKwkJaWYgKHByaXYtPnR4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbV9hcmM0KTsKKwkJaWYgKHByaXYtPnJ4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChwcml2LT5yeF90Zm1fbWljaGFlbCk7CisJCWlmIChwcml2LT5yeF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT5yeF90Zm1fYXJjNCk7CisJCWtmcmVlKHByaXYpOworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV90a2lwX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpfcHJpdiA9IHByaXY7CisKKwlpZiAoX3ByaXYpIHsKKwkJaWYgKF9wcml2LT50eF90Zm1fbWljaGFlbCkKKwkJCWNyeXB0b19mcmVlX2hhc2goX3ByaXYtPnR4X3RmbV9taWNoYWVsKTsKKwkJaWYgKF9wcml2LT50eF90Zm1fYXJjNCkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+dHhfdGZtX2FyYzQpOworCQlpZiAoX3ByaXYtPnJ4X3RmbV9taWNoYWVsKQorCQkJY3J5cHRvX2ZyZWVfaGFzaChfcHJpdi0+cnhfdGZtX21pY2hhZWwpOworCQlpZiAoX3ByaXYtPnJ4X3RmbV9hcmM0KQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm1fYXJjNCk7CisJfQorCWtmcmVlKHByaXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IFJvdFIxKHUxNiB2YWwpCit7CisJcmV0dXJuICh2YWwgPj4gMSkgfCAodmFsIDw8IDE1KTsKK30KKworCitzdGF0aWMgaW5saW5lIHU4IExvOCh1MTYgdmFsKQoreworCXJldHVybiB2YWwgJiAweGZmOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTggSGk4KHUxNiB2YWwpCit7CisJcmV0dXJuIHZhbCA+PiA4OworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IExvMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsICYgMHhmZmZmOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IEhpMTYodTMyIHZhbCkKK3sKKwlyZXR1cm4gdmFsID4+IDE2OworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTYodTggaGksIHU4IGxvKQoreworCXJldHVybiBsbyB8ICgoKHUxNikgaGkpIDw8IDgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTE2IE1rMTZfbGUodTE2ICp2KQoreworCXJldHVybiBsZTE2X3RvX2NwdSgqdik7Cit9CisKKworc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPQoreworCTB4QzZBNSwgMHhGODg0LCAweEVFOTksIDB4RjY4RCwgMHhGRjBELCAweEQ2QkQsIDB4REVCMSwgMHg5MTU0LAorCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAorCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAorCTB4NDFFQywgMHhCMzY3LCAweDVGRkQsIDB4NDVFQSwgMHgyM0JGLCAweDUzRjcsIDB4RTQ5NiwgMHg5QjVCLAorCTB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAorCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAorCTB4MDgwQywgMHg5NTUyLCAweDQ2NjUsIDB4OUQ1RSwgMHgzMDI4LCAweDM3QTEsIDB4MEEwRiwgMHgyRkI1LAorCTB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAorCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAorCTB4QTRGNiwgMHg3NjRELCAweEI3NjEsIDB4N0RDRSwgMHg1MjdCLCAweEREM0UsIDB4NUU3MSwgMHgxMzk3LAorCTB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAorCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAorCTB4QkI2QiwgMHhDNTJBLCAweDRGRTUsIDB4RUQxNiwgMHg4NkM1LCAweDlBRDcsIDB4NjY1NSwgMHgxMTk0LAorCTB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAorCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAorCTB4NjNERiwgMHg3N0MxLCAweEFGNzUsIDB4NDI2MywgMHgyMDMwLCAweEU1MUEsIDB4RkQwRSwgMHhCRjZELAorCTB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAorCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAorCTB4QzBBMCwgMHgxOTk4LCAweDlFRDEsIDB4QTM3RiwgMHg0NDY2LCAweDU0N0UsIDB4M0JBQiwgMHgwQjgzLAorCTB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAorCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAorCTB4OUY1RCwgMHhCRDZFLCAweDQzRUYsIDB4QzRBNiwgMHgzOUE4LCAweDMxQTQsIDB4RDMzNywgMHhGMjhCLAorCTB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAorCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAorCTB4NkZENSwgMHhGMDg4LCAweDRBNkYsIDB4NUM3MiwgMHgzODI0LCAweDU3RjEsIDB4NzNDNywgMHg5NzUxLAorCTB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAorCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAorCTB4QzJBMywgMHg2QTVGLCAweEFFRjksIDB4NjlEMCwgMHgxNzkxLCAweDk5NTgsIDB4M0EyNywgMHgyN0I5LAorCTB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAorCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAorCTB4MDM4RiwgMHg1OUY4LCAweDA5ODAsIDB4MUExNywgMHg2NURBLCAweEQ3MzEsIDB4ODRDNiwgMHhEMEI4LAorCTB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAorfTsKKworCitzdGF0aWMgaW5saW5lIHUxNiBfU18odTE2IHYpCit7CisJdTE2IHQgPSBTYm94W0hpOCh2KV07CisJcmV0dXJuIFNib3hbTG84KHYpXSBeICgodCA8PCA4KSB8ICh0ID4+IDgpKTsKK30KKworCisjZGVmaW5lIFBIQVNFMV9MT09QX0NPVU5UIDgKKworCitzdGF0aWMgdm9pZCB0a2lwX21peGluZ19waGFzZTEodTE2ICpUVEFLLCBjb25zdCB1OCAqVEssIGNvbnN0IHU4ICpUQSwgdTMyIElWMzIpCit7CisJaW50IGksIGo7CisKKwkvKiBJbml0aWFsaXplIHRoZSA4MC1iaXQgVFRBSyBmcm9tIFRTQyAoSVYzMikgYW5kIFRBWzAuLjVdICovCisJVFRBS1swXSA9IExvMTYoSVYzMik7CisJVFRBS1sxXSA9IEhpMTYoSVYzMik7CisJVFRBS1syXSA9IE1rMTYoVEFbMV0sIFRBWzBdKTsKKwlUVEFLWzNdID0gTWsxNihUQVszXSwgVEFbMl0pOworCVRUQUtbNF0gPSBNazE2KFRBWzVdLCBUQVs0XSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEhBU0UxX0xPT1BfQ09VTlQ7IGkrKykgeworCQlqID0gMiAqIChpICYgMSk7CisJCVRUQUtbMF0gKz0gX1NfKFRUQUtbNF0gXiBNazE2KFRLWzEgKyBqXSwgVEtbMCArIGpdKSk7CisJCVRUQUtbMV0gKz0gX1NfKFRUQUtbMF0gXiBNazE2KFRLWzUgKyBqXSwgVEtbNCArIGpdKSk7CisJCVRUQUtbMl0gKz0gX1NfKFRUQUtbMV0gXiBNazE2KFRLWzkgKyBqXSwgVEtbOCArIGpdKSk7CisJCVRUQUtbM10gKz0gX1NfKFRUQUtbMl0gXiBNazE2KFRLWzEzICsgal0sIFRLWzEyICsgal0pKTsKKwkJVFRBS1s0XSArPSBfU18oVFRBS1szXSBeIE1rMTYoVEtbMSArIGpdLCBUS1swICsgal0pKSArIGk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHRraXBfbWl4aW5nX3BoYXNlMih1OCAqV0VQU2VlZCwgY29uc3QgdTggKlRLLCBjb25zdCB1MTYgKlRUQUssCisJCQkgICAgICAgdTE2IElWMTYpCit7CisJLyogTWFrZSB0ZW1wb3JhcnkgYXJlYSBvdmVybGFwIFdFUCBzZWVkIHNvIHRoYXQgdGhlIGZpbmFsIGNvcHkgY2FuIGJlCisJICogYXZvaWRlZCBvbiBsaXR0bGUgZW5kaWFuIGhvc3RzLiAqLworCXUxNiAqUFBLID0gKHUxNiAqKSAmV0VQU2VlZFs0XTsKKworCS8qIFN0ZXAgMSAtIG1ha2UgY29weSBvZiBUVEFLIGFuZCBicmluZyBpbiBUU0MgKi8KKwlQUEtbMF0gPSBUVEFLWzBdOworCVBQS1sxXSA9IFRUQUtbMV07CisJUFBLWzJdID0gVFRBS1syXTsKKwlQUEtbM10gPSBUVEFLWzNdOworCVBQS1s0XSA9IFRUQUtbNF07CisJUFBLWzVdID0gVFRBS1s0XSArIElWMTY7CisKKwkvKiBTdGVwIDIgLSA5Ni1iaXQgYmlqZWN0aXZlIG1peGluZyB1c2luZyBTLWJveCAqLworCVBQS1swXSArPSBfU18oUFBLWzVdIF4gTWsxNl9sZSgodTE2ICopICZUS1swXSkpOworCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gTWsxNl9sZSgodTE2ICopICZUS1syXSkpOworCVBQS1syXSArPSBfU18oUFBLWzFdIF4gTWsxNl9sZSgodTE2ICopICZUS1s0XSkpOworCVBQS1szXSArPSBfU18oUFBLWzJdIF4gTWsxNl9sZSgodTE2ICopICZUS1s2XSkpOworCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gTWsxNl9sZSgodTE2ICopICZUS1s4XSkpOworCVBQS1s1XSArPSBfU18oUFBLWzRdIF4gTWsxNl9sZSgodTE2ICopICZUS1sxMF0pKTsKKworCVBQS1swXSArPSBSb3RSMShQUEtbNV0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzEyXSkpOworCVBQS1sxXSArPSBSb3RSMShQUEtbMF0gXiBNazE2X2xlKCh1MTYgKikgJlRLWzE0XSkpOworCVBQS1syXSArPSBSb3RSMShQUEtbMV0pOworCVBQS1szXSArPSBSb3RSMShQUEtbMl0pOworCVBQS1s0XSArPSBSb3RSMShQUEtbM10pOworCVBQS1s1XSArPSBSb3RSMShQUEtbNF0pOworCisJLyogU3RlcCAzIC0gYnJpbmcgaW4gbGFzdCBvZiBUSyBiaXRzLCBhc3NpZ24gMjQtYml0IFdFUCBJViB2YWx1ZQorCSAqIFdFUFNlZWRbMC4uMl0gaXMgdHJhbnNtaXR0ZWQgYXMgV0VQIElWICovCisJV0VQU2VlZFswXSA9IEhpOChJVjE2KTsKKwlXRVBTZWVkWzFdID0gKEhpOChJVjE2KSB8IDB4MjApICYgMHg3RjsKKwlXRVBTZWVkWzJdID0gTG84KElWMTYpOworCVdFUFNlZWRbM10gPSBMbzgoKFBQS1s1XSBeIE1rMTZfbGUoKHUxNiAqKSAmVEtbMF0pKSA+PiAxKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlQUEtbaV0gPSAoUFBLW2ldIDw8IDgpIHwgKFBQS1tpXSA+PiA4KTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCQlpbnQgbGVuOworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7LnRmbSA9IHRrZXktPnR4X3RmbV9hcmM0fTsKKwlpbnQgcmV0ID0gMDsKKwl1OCByYzRrZXlbMTZdLCAgKmljdjsKKwl1MzIgY3JjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IDggfHwgc2tiX3RhaWxyb29tKHNrYikgPCA0IHx8CisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbikKKwkJcmV0dXJuIC0xOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKworCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCWlmICghdGtleS0+dHhfcGhhc2UxX2RvbmUpIHsKKwkJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT50eF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsCisJCQkJCXRrZXktPnR4X2l2MzIpOworCQkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOworCQl9CisJCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+dHhfdHRhaywgdGtleS0+dHhfaXYxNik7CisJfQorCWVsc2UKKwl0a2V5LT50eF9waGFzZTFfZG9uZSA9IDE7CisKKworCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIDgpOworCW1lbW1vdmUocG9zLCBwb3MgKyA4LCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKworCWlmICh0Y2JfZGVzYy0+Ykh3U2VjKQorCXsKKwkJKnBvcysrID0gSGk4KHRrZXktPnR4X2l2MTYpOworCQkqcG9zKysgPSAoSGk4KHRrZXktPnR4X2l2MTYpIHwgMHgyMCkgJiAweDdGOworCQkqcG9zKysgPSBMbzgodGtleS0+dHhfaXYxNik7CisJfQorCWVsc2UKKwl7CisJCSpwb3MrKyA9IHJjNGtleVswXTsKKwkJKnBvcysrID0gcmM0a2V5WzFdOworCQkqcG9zKysgPSByYzRrZXlbMl07CisJfQorCisJKnBvcysrID0gKHRrZXktPmtleV9pZHggPDwgNikgfCAoMSA8PCA1KSAvKiBFeHQgSVYgaW5jbHVkZWQgKi87CisJKnBvcysrID0gdGtleS0+dHhfaXYzMiAmIDB4ZmY7CisJKnBvcysrID0gKHRrZXktPnR4X2l2MzIgPj4gOCkgJiAweGZmOworCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDE2KSAmIDB4ZmY7CisJKnBvcysrID0gKHRrZXktPnR4X2l2MzIgPj4gMjQpICYgMHhmZjsKKworCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCWljdiA9IHNrYl9wdXQoc2tiLCA0KTsKKwkJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIGxlbik7CisJCWljdlswXSA9IGNyYzsKKwkJaWN2WzFdID0gY3JjID4+IDg7CisJCWljdlsyXSA9IGNyYyA+PiAxNjsKKwkJaWN2WzNdID0gY3JjID4+IDI0OworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT50eF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJCXNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7CisJCXJldD0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2csICZzZywgbGVuICsgNCk7CisJfQorCisJdGtleS0+dHhfaXYxNisrOworCWlmICh0a2V5LT50eF9pdjE2ID09IDApIHsKKwkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAwOworCQl0a2V5LT50eF9pdjMyKys7CisJfQorCisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIDA7CisKKworfQorCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2RlY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4IGtleWlkeCwgKnBvczsKKwl1MzIgaXYzMjsKKwl1MTYgaXYxNjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gdGtleS0+cnhfdGZtX2FyYzR9OworCXU4IHJjNGtleVsxNl07CisJdTggaWN2WzRdOworCXUzMiBjcmM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCWludCBwbGVuOworCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyA4ICsgNCkKKwkJcmV0dXJuIC0xOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleWlkeCA9IHBvc1szXTsKKwlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgorCQkJICAgICAgICIgZmxhZyBmcm9tICIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTI7CisJfQorCWtleWlkeCA+Pj0gNjsKKwlpZiAodGtleS0+a2V5X2lkeCAhPSBrZXlpZHgpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IFJYIHRrZXktPmtleV9pZHg9JWQgZnJhbWUgIgorCQkgICAgICAgImtleWlkeD0lZCBwcml2PSVwXG4iLCB0a2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlyZXR1cm4gLTY7CisJfQorCWlmICghdGtleS0+a2V5X3NldCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UCisJCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCisJCQkgICAgICAgIiBrZXlcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCX0KKwkJcmV0dXJuIC0zOworCX0KKwlpdjE2ID0gKHBvc1swXSA8PCA4KSB8IHBvc1syXTsKKwlpdjMyID0gcG9zWzRdIHwgKHBvc1s1XSA8PCA4KSB8IChwb3NbNl0gPDwgMTYpIHwgKHBvc1s3XSA8PCAyNCk7CisJcG9zICs9IDg7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCQlpZiAoaXYzMiA8IHRrZXktPnJ4X2l2MzIgfHwKKwkJKGl2MzIgPT0gdGtleS0+cnhfaXYzMiAmJiBpdjE2IDw9IHRrZXktPnJ4X2l2MTYpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIgTUFDX0ZNVAorCQkJCSIgcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkIFRTQyAiCisJCQkJIiUwOHglMDR4XG4iLCBNQUNfQVJHKGhkci0+YWRkcjIpLAorCQkJCXRrZXktPnJ4X2l2MzIsIHRrZXktPnJ4X2l2MTYsIGl2MzIsIGl2MTYpOworCQkJfQorCQkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQUmVwbGF5cysrOworCQkJcmV0dXJuIC00OworCQl9CisKKwkJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMiB8fCAhdGtleS0+cnhfcGhhc2UxX2RvbmUpIHsKKwkJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT5yeF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsIGl2MzIpOworCQkJdGtleS0+cnhfcGhhc2UxX2RvbmUgPSAxOworCQl9CisJCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+cnhfdHRhaywgaXYxNik7CisKKwkJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDEyOworCisJCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnJ4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKKwkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisKKwkJaWYgKGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgJnNnLCAmc2csIHBsZW4gKyA0KSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICI6IFRLSVA6IGZhaWxlZCB0byBkZWNyeXB0ICIKKwkJCQkJCSJyZWNlaXZlZCBwYWNrZXQgZnJvbSAiIE1BQ19GTVQgIlxuIiwKKwkJCQkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJfQorCQkJcmV0dXJuIC03OworCQl9CisKKwkJY3JjID0gfmNyYzMyX2xlKH4wLCBwb3MsIHBsZW4pOworCQlpY3ZbMF0gPSBjcmM7CisJCWljdlsxXSA9IGNyYyA+PiA4OworCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CisJCWljdlszXSA9IGNyYyA+PiAyNDsKKworCQlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgeworCQkJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMikgeworCQkJCS8qIFByZXZpb3VzbHkgY2FjaGVkIFBoYXNlMSByZXN1bHQgd2FzIGFscmVhZHkgbG9zdCwgc28KKwkJCQkqIGl0IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGFja2V0LiAqLworCQkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMDsKKwkJCX0KKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9IgorCQkJCU1BQ19GTVQgIlxuIiwgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQl9CisJCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMrKzsKKwkJCXJldHVybiAtNTsKKwkJfQorCisJfQorCisJLyogVXBkYXRlIHJlYWwgY291bnRlcnMgb25seSBhZnRlciBNaWNoYWVsIE1JQyB2ZXJpZmljYXRpb24gaGFzCisJICogY29tcGxldGVkICovCisJdGtleS0+cnhfaXYzMl9uZXcgPSBpdjMyOworCXRrZXktPnJ4X2l2MTZfbmV3ID0gaXYxNjsKKworCS8qIFJlbW92ZSBJViBhbmQgSUNWICovCisJbWVtbW92ZShza2ItPmRhdGEgKyA4LCBza2ItPmRhdGEsIGhkcl9sZW4pOworCXNrYl9wdWxsKHNrYiwgOCk7CisJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQpOworCisJcmV0dXJuIGtleWlkeDsKK30KKworc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbV9taWNoYWVsLCB1OCAqIGtleSwgdTggKiBoZHIsCisJCSAgICAgICB1OCAqIGRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKiBtaWMpCit7CisJc3RydWN0IGhhc2hfZGVzYyBkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKKworCWlmICh0Zm1fbWljaGFlbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNnX2luaXRfdGFibGUoc2csIDIpOworCXNnX3NldF9idWYoJnNnWzBdLCBoZHIsIDE2KTsKKwlzZ19zZXRfYnVmKCZzZ1sxXSwgZGF0YSwgZGF0YV9sZW4pOworCisJaWYgKGNyeXB0b19oYXNoX3NldGtleSh0Zm1fbWljaGFlbCwga2V5LCA4KSkKKwkJcmV0dXJuIC0xOworCisJZGVzYy50Zm0gPSB0Zm1fbWljaGFlbDsKKwlkZXNjLmZsYWdzID0gMDsKKwlyZXR1cm4gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKK30KKworc3RhdGljIHZvaWQgbWljaGFlbF9taWNfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpoZHIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjExOworCisJaGRyMTEgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCXN3aXRjaCAobGUxNl90b19jcHUoaGRyMTEtPmZyYW1lX2N0bCkgJgorCQkoSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUykpIHsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBEQSAqLworCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMiwgRVRIX0FMRU4pOyAvKiBTQSAqLworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIzLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHI0LCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtY3B5KGhkciwgaGRyMTEtPmFkZHIxLCBFVEhfQUxFTik7IC8qIERBICovCisJCW1lbWNweShoZHIgKyBFVEhfQUxFTiwgaGRyMTEtPmFkZHIyLCBFVEhfQUxFTik7IC8qIFNBICovCisJCWJyZWFrOworCX0KKworCWhkclsxMl0gPSAwOyAvKiBwcmlvcml0eSAqLworCisJaGRyWzEzXSA9IGhkclsxNF0gPSBoZHJbMTVdID0gMDsgLyogcmVzZXJ2ZWQgKi8KK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRrZXkgPSBwcml2OworCXU4ICpwb3M7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCA4IHx8IHNrYi0+bGVuIDwgaGRyX2xlbikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBwYWNrZXQgZm9yIE1pY2hhZWwgTUlDIGFkZCAiCisJCSAgICAgICAiKHRhaWxyb29tPSVkIGhkcl9sZW49JWQgc2tiLT5sZW49JWQpXG4iLAorCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksIGhkcl9sZW4sIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnR4X2hkcik7CisKKwkvLyB7IGRhdmlkLCAyMDA2LjkuMQorCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KKwlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCQl0a2V5LT50eF9oZHJbMTJdID0gKihza2ItPmRhdGEgKyBoZHJfbGVuIC0gMikgJiAweDA3OworCX0KKwkvLyB9CisJcG9zID0gc2tiX3B1dChza2IsIDgpOworCisJaWYgKG1pY2hhZWxfbWljKHRrZXktPnR4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzE2XSwgdGtleS0+dHhfaGRyLAorCQkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIHBvcykpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyLAorCQkJCSAgICAgICBpbnQga2V5aWR4KQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgZXY7CisKKwkvKiBUT0RPOiBuZWVkZWQgcGFyYW1ldGVyczogY291bnQsIGtleWlkLCBrZXkgdHlwZSwgVFNDICovCisJbWVtc2V0KCZldiwgMCwgc2l6ZW9mKGV2KSk7CisJZXYuZmxhZ3MgPSBrZXlpZHggJiBJV19NSUNGQUlMVVJFX0tFWV9JRDsKKwlpZiAoaGRyLT5hZGRyMVswXSAmIDB4MDEpCisJCWV2LmZsYWdzIHw9IElXX01JQ0ZBSUxVUkVfR1JPVVA7CisJZWxzZQorCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOworCWV2LnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGV2KTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JxdSwgKGNoYXIgKikgJmV2KTsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsCisJCQkJICAgICBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJdTggbWljWzhdOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCisJaWYgKCF0a2V5LT5rZXlfc2V0KQorCQlyZXR1cm4gLTE7CisKKwltaWNoYWVsX21pY19oZHIoc2tiLCB0a2V5LT5yeF9oZHIpOworCS8vIHsgZGF2aWQsIDIwMDYuOS4xCisJLy8gZml4IHRoZSB3cGEgcHJvY2VzcyB3aXRoIHdtbSBlbmFibGVkLgorCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJCXRrZXktPnJ4X2hkclsxMl0gPSAqKHNrYi0+ZGF0YSArIGhkcl9sZW4gLSAyKSAmIDB4MDc7CisJfQorCS8vIH0KKworCWlmIChtaWNoYWVsX21pYyh0a2V5LT5yeF90Zm1fbWljaGFlbCwgJnRrZXktPmtleVsyNF0sIHRrZXktPnJ4X2hkciwKKwkJCQlza2ItPmRhdGEgKyBoZHJfbGVuLCBza2ItPmxlbiAtIDggLSBoZHJfbGVuLCBtaWMpKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChtaWMsIHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gOCwgOCkgIT0gMCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yICIKKwkJICAgICAgICJNU0RVIGZyb20gIiBNQUNfRk1UICIga2V5aWR4PSVkXG4iLAorCQkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICJOL0EiLCBNQUNfQVJHKGhkci0+YWRkcjIpLAorCQkgICAgICAga2V5aWR4KTsKKwkJaWYgKHNrYi0+ZGV2KQorCQkJaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc2tiLT5kZXYsIGhkciwga2V5aWR4KTsKKwkJdGtleS0+ZG90MTFSU05BU3RhdHNUS0lQTG9jYWxNSUNGYWlsdXJlcysrOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVXBkYXRlIFRTQyBjb3VudGVycyBmb3IgUlggbm93IHRoYXQgdGhlIHBhY2tldCB2ZXJpZmljYXRpb24gaGFzCisJICogY29tcGxldGVkLiAqLworCXRrZXktPnJ4X2l2MzIgPSB0a2V5LT5yeF9pdjMyX25ldzsKKwl0a2V5LT5yeF9pdjE2ID0gdGtleS0+cnhfaXYxNl9uZXc7CisKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gOCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwlpbnQga2V5aWR4OworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtID0gdGtleS0+dHhfdGZtX21pY2hhZWw7CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTIgPSB0a2V5LT50eF90Zm1fYXJjNDsKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTMgPSB0a2V5LT5yeF90Zm1fbWljaGFlbDsKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtNCA9IHRrZXktPnJ4X3RmbV9hcmM0OworCisJa2V5aWR4ID0gdGtleS0+a2V5X2lkeDsKKwltZW1zZXQodGtleSwgMCwgc2l6ZW9mKCp0a2V5KSk7CisJdGtleS0+a2V5X2lkeCA9IGtleWlkeDsKKwl0a2V5LT50eF90Zm1fbWljaGFlbCA9IHRmbTsKKwl0a2V5LT50eF90Zm1fYXJjNCA9IHRmbTI7CisJdGtleS0+cnhfdGZtX21pY2hhZWwgPSB0Zm0zOworCXRrZXktPnJ4X3RmbV9hcmM0ID0gdGZtNDsKKworCWlmIChsZW4gPT0gVEtJUF9LRVlfTEVOKSB7CisJCW1lbWNweSh0a2V5LT5rZXksIGtleSwgVEtJUF9LRVlfTEVOKTsKKwkJdGtleS0+a2V5X3NldCA9IDE7CisJCXRrZXktPnR4X2l2MTYgPSAxOyAvKiBUU0MgaXMgaW5pdGlhbGl6ZWQgdG8gMSAqLworCQlpZiAoc2VxKSB7CisJCQl0a2V5LT5yeF9pdjMyID0gKHNlcVs1XSA8PCAyNCkgfCAoc2VxWzRdIDw8IDE2KSB8CisJCQkJKHNlcVszXSA8PCA4KSB8IHNlcVsyXTsKKwkJCXRrZXktPnJ4X2l2MTYgPSAoc2VxWzFdIDw8IDgpIHwgc2VxWzBdOworCQl9CisJfSBlbHNlIGlmIChsZW4gPT0gMCkKKwkJdGtleS0+a2V5X3NldCA9IDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKworCWlmIChsZW4gPCBUS0lQX0tFWV9MRU4pCisJCXJldHVybiAtMTsKKworCWlmICghdGtleS0+a2V5X3NldCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGtleSwgdGtleS0+a2V5LCBUS0lQX0tFWV9MRU4pOworCisJaWYgKHNlcSkgeworCQkvKiBSZXR1cm4gdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCB0cmFuc21pdHRlZCBmcmFtZS4gKi8KKwkJdTE2IGl2MTYgPSB0a2V5LT50eF9pdjE2OworCQl1MzIgaXYzMiA9IHRrZXktPnR4X2l2MzI7CisJCWlmIChpdjE2ID09IDApCisJCQlpdjMyLS07CisJCWl2MTYtLTsKKwkJc2VxWzBdID0gdGtleS0+dHhfaXYxNjsKKwkJc2VxWzFdID0gdGtleS0+dHhfaXYxNiA+PiA4OworCQlzZXFbMl0gPSB0a2V5LT50eF9pdjMyOworCQlzZXFbM10gPSB0a2V5LT50eF9pdjMyID4+IDg7CisJCXNlcVs0XSA9IHRrZXktPnR4X2l2MzIgPj4gMTY7CisJCXNlcVs1XSA9IHRrZXktPnR4X2l2MzIgPj4gMjQ7CisJfQorCisJcmV0dXJuIFRLSVBfS0VZX0xFTjsKK30KKworCitzdGF0aWMgY2hhciAqIGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRraXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9VEtJUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICAicmVwbGF5cz0lZCBpY3ZfZXJyb3JzPSVkIGxvY2FsX21pY19mYWlsdXJlcz0lZFxuIiwKKwkJICAgICB0a2lwLT5rZXlfaWR4LCB0a2lwLT5rZXlfc2V0LAorCQkgICAgICh0a2lwLT50eF9pdjMyID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MzIgPj4gMTYpICYgMHhmZiwKKwkJICAgICAodGtpcC0+dHhfaXYzMiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+dHhfaXYzMiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnR4X2l2MTYgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnR4X2l2MTYgJiAweGZmLAorCQkgICAgICh0a2lwLT5yeF9pdjMyID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MzIgPj4gMTYpICYgMHhmZiwKKwkJICAgICAodGtpcC0+cnhfaXYzMiA+PiA4KSAmIDB4ZmYsCisJCSAgICAgdGtpcC0+cnhfaXYzMiAmIDB4ZmYsCisJCSAgICAgKHRraXAtPnJ4X2l2MTYgPj4gOCkgJiAweGZmLAorCQkgICAgIHRraXAtPnJ4X2l2MTYgJiAweGZmLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUFJlcGxheXMsCisJCSAgICAgdGtpcC0+ZG90MTFSU05BU3RhdHNUS0lQSUNWRXJyb3JzLAorCQkgICAgIHRraXAtPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMpOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3RraXAgPSB7CisJLm5hbWUJCQk9ICJUS0lQIiwKKwkuaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfaW5pdCwKKwkuZGVpbml0CQkJPSBpZWVlODAyMTFfdGtpcF9kZWluaXQsCisJLmVuY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfdGtpcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZGVjcnlwdCwKKwkuZW5jcnlwdF9tc2R1CQk9IGllZWU4MDIxMV9taWNoYWVsX21pY19hZGQsCisJLmRlY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfdmVyaWZ5LAorCS5zZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX3NldF9rZXksCisJLmdldF9rZXkJCT0gaWVlZTgwMjExX3RraXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gaWVlZTgwMjExX3RraXBfcHJpbnRfc3RhdHMsCisJLmV4dHJhX3ByZWZpeF9sZW4JPSA0ICsgNCwgLyogSVYgKyBFeHRJViAqLworCS5leHRyYV9wb3N0Zml4X2xlbgk9IDggKyA0LCAvKiBNSUMgKyBJQ1YgKi8KKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorfTsKKworaW50IF9faW5pdCBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCh2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3RraXApOworfQorCit2b2lkIF9fZXhpdCBpZWVlODAyMTFfY3J5cHRvX3RraXBfZXhpdCh2b2lkKQoreworCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKK30KKwordm9pZCBpZWVlODAyMTFfdGtpcF9udWxsKHZvaWQpCit7CisvLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhZDExYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogSG9zdCBBUCBjcnlwdDogaG9zdC1iYXNlZCBXRVAgZW5jcnlwdGlvbiBpbXBsZW1lbnRhdGlvbiBmb3IgSG9zdCBBUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCwgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyAgICAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFdFUCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhIHsKKwl1MzIgaXY7CisjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCisJdTgga2V5W1dFUF9LRVlfTEVOICsgMV07CisJdTgga2V5X2xlbjsKKwl1OCBrZXlfaWR4OworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0eF90Zm07CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnJ4X3RmbTsKK307CisKKworc3RhdGljIHZvaWQgKiBwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpwcml2OworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKwlwcml2LT5rZXlfaWR4ID0ga2V5aWR4OworCisJcHJpdi0+dHhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT50eF90Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisJcHJpdi0+cnhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnJ4X3RmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBzdGFydCBXRVAgSVYgZnJvbSBhIHJhbmRvbSB2YWx1ZSAqLworCWdldF9yYW5kb21fYnl0ZXMoJnByaXYtPml2LCA0KTsKKworCXJldHVybiBwcml2OworCitmYWlsOgorCWlmIChwcml2KSB7CisJCWlmIChwcml2LT50eF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+dHhfdGZtKTsKKwkJaWYgKHByaXYtPnJ4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT5yeF90Zm0pOworCQlrZnJlZShwcml2KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZCBwcmlzbTJfd2VwX2RlaW5pdCh2b2lkICpwcml2KQoreworCXN0cnVjdCBwcmlzbTJfd2VwX2RhdGEgKl9wcml2ID0gcHJpdjsKKworCWlmIChfcHJpdikgeworCQlpZiAoX3ByaXYtPnR4X3RmbSkKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihfcHJpdi0+dHhfdGZtKTsKKwkJaWYgKF9wcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnJ4X3RmbSk7CisJfQorCWtmcmVlKHByaXYpOworfQorCisvKiBQZXJmb3JtIFdFUCBlbmNyeXB0aW9uIG9uIGdpdmVuIHNrYiB0aGF0IGhhcyBhdCBsZWFzdCA0IGJ5dGVzIG9mIGhlYWRyb29tCisgKiBmb3IgSVYgYW5kIDQgYnl0ZXMgb2YgdGFpbHJvb20gZm9yIElDVi4gQm90aCBJViBhbmQgSUNWIHdpbGwgYmUgdHJhbnNtaXR0ZWQsCisgKiBzbyB0aGUgcGF5bG9hZCBsZW5ndGggaW5jcmVhc2VzIHdpdGggOCBieXRlcy4KKyAqCisgKiBXRVAgZnJhbWUgcGF5bG9hZDogSVYgKyBUWCBrZXkgaWR4LCBSQzQoZGF0YSksIElDViA9IFJDNChDUkMzMihkYXRhKSkKKyAqLworc3RhdGljIGludCBwcmlzbTJfd2VwX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKwl1MzIga2xlbiwgbGVuOworCXU4IGtleVtXRVBfS0VZX0xFTiArIDNdOworCXU4ICpwb3M7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnR4X3RmbX07CisJdTMyIGNyYzsKKwl1OCAqaWN2OworCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA0IHx8IHNrYl90YWlscm9vbShza2IpIDwgNCB8fAorCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJCXJldHVybiAtMTsKKworCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlwb3MgPSBza2JfcHVzaChza2IsIDQpOworCW1lbW1vdmUocG9zLCBwb3MgKyA0LCBoZHJfbGVuKTsKKwlwb3MgKz0gaGRyX2xlbjsKKworCWtsZW4gPSAzICsgd2VwLT5rZXlfbGVuOworCisJd2VwLT5pdisrOworCisJLyogRmx1aHJlciwgTWFudGluLCBhbmQgU2hhbWlyIGhhdmUgcmVwb3J0ZWQgd2Vha25lc3NlcyBpbiB0aGUga2V5CisJICogc2NoZWR1bGluZyBhbGdvcml0aG0gb2YgUkM0LiBBdCBsZWFzdCBJVnMgKEtleUJ5dGUgKyAzLCAweGZmLCBOKQorCSAqIGNhbiBiZSB1c2VkIHRvIHNwZWVkdXAgYXR0YWNrcywgc28gYXZvaWQgdXNpbmcgdGhlbS4gKi8KKwlpZiAoKHdlcC0+aXYgJiAweGZmMDApID09IDB4ZmYwMCkgeworCQl1OCBCID0gKHdlcC0+aXYgPj4gMTYpICYgMHhmZjsKKwkJaWYgKEIgPj0gMyAmJiBCIDwga2xlbikKKwkJCXdlcC0+aXYgKz0gMHgwMTAwOworCX0KKworCS8qIFByZXBlbmQgMjQtYml0IElWIHRvIFJDNCBrZXkgYW5kIFRYIGZyYW1lICovCisJKnBvcysrID0ga2V5WzBdID0gKHdlcC0+aXYgPj4gMTYpICYgMHhmZjsKKwkqcG9zKysgPSBrZXlbMV0gPSAod2VwLT5pdiA+PiA4KSAmIDB4ZmY7CisJKnBvcysrID0ga2V5WzJdID0gd2VwLT5pdiAmIDB4ZmY7CisJKnBvcysrID0gd2VwLT5rZXlfaWR4IDw8IDY7CisKKwkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KKwltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CisKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCisJeworCisJCS8qIEFwcGVuZCBsaXR0bGUtZW5kaWFuIENSQzMyIGFuZCBlbmNyeXB0IGl0IHRvIHByb2R1Y2UgSUNWICovCisJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOworCQlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CisJCWljdlswXSA9IGNyYzsKKwkJaWN2WzFdID0gY3JjID4+IDg7CisJCWljdlsyXSA9IGNyYyA+PiAxNjsKKwkJaWN2WzNdID0gY3JjID4+IDI0OworCisJCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+dHhfdGZtLCBrZXksIGtsZW4pOworCQlzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOworCisJCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZywgJnNnLCBsZW4gKyA0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBQZXJmb3JtIFdFUCBkZWNyeXB0aW9uIG9uIGdpdmVuIGJ1ZmZlci4gQnVmZmVyIGluY2x1ZGVzIHdob2xlIFdFUCBwYXJ0IG9mCisgKiB0aGUgZnJhbWU6IElWICg0IGJ5dGVzKSwgZW5jcnlwdGVkIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQIGhlYWRlciksCisgKiBJQ1YgKDQgYnl0ZXMpLiBsZW4gaW5jbHVkZXMgYm90aCBJViBhbmQgSUNWLgorICoKKyAqIFJldHVybnMgMCBpZiBmcmFtZSB3YXMgZGVjcnlwdGVkIHN1Y2Nlc3NmdWxseSBhbmQgSUNWIHdhcyBjb3JyZWN0IGFuZCAtMSBvbgorICogZmFpbHVyZS4gSWYgZnJhbWUgaXMgT0ssIElWIGFuZCBJQ1Ygd2lsbCBiZSByZW1vdmVkLgorICovCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCXUzMiAga2xlbiwgcGxlbjsKKwl1OCBrZXlbV0VQX0tFWV9MRU4gKyAzXTsKKwl1OCBrZXlpZHgsICpwb3M7CisJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnJ4X3RmbX07CisJdTMyIGNyYzsKKwl1OCBpY3ZbNF07CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyA4KQorCQlyZXR1cm4gLTE7CisKKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOworCWtleVswXSA9ICpwb3MrKzsKKwlrZXlbMV0gPSAqcG9zKys7CisJa2V5WzJdID0gKnBvcysrOworCWtleWlkeCA9ICpwb3MrKyA+PiA2OworCWlmIChrZXlpZHggIT0gd2VwLT5rZXlfaWR4KQorCQlyZXR1cm4gLTE7CisKKwlrbGVuID0gMyArIHdlcC0+a2V5X2xlbjsKKworCS8qIENvcHkgcmVzdCBvZiB0aGUgV0VQIGtleSAodGhlIHNlY3JldCBwYXJ0KSAqLworCW1lbWNweShrZXkgKyAzLCB3ZXAtPmtleSwgd2VwLT5rZXlfbGVuKTsKKworCS8qIEFwcGx5IFJDNCB0byBkYXRhIGFuZCBjb21wdXRlIENSQzMyIG92ZXIgZGVjcnlwdGVkIGRhdGEgKi8KKwlwbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gODsKKworCWlmICghdGNiX2Rlc2MtPmJId1NlYykKKwl7CisJCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+cnhfdGZtLCBrZXksIGtsZW4pOworCQlzZ19pbml0X29uZSgmc2csIHBvcywgcGxlbis0KTsKKworCQlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCAmc2csICZzZywgcGxlbiArIDQpKQorCQkJcmV0dXJuIC03OworCisJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKKwkJaWN2WzBdID0gY3JjOworCQlpY3ZbMV0gPSBjcmMgPj4gODsKKwkJaWN2WzJdID0gY3JjID4+IDE2OworCQlpY3ZbM10gPSBjcmMgPj4gMjQ7CisJCWlmIChtZW1jbXAoaWN2LCBwb3MgKyBwbGVuLCA0KSAhPSAwKSB7CisJCQkvKiBJQ1YgbWlzbWF0Y2ggLSBkcm9wIGZyYW1lICovCisJCQlyZXR1cm4gLTI7CisJCX0KKwl9CisJLyogUmVtb3ZlIElWIGFuZCBJQ1YgKi8KKwltZW1tb3ZlKHNrYi0+ZGF0YSArIDQsIHNrYi0+ZGF0YSwgaGRyX2xlbik7CisJc2tiX3B1bGwoc2tiLCA0KTsKKwlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl93ZXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKworCWlmIChsZW4gPCAwIHx8IGxlbiA+IFdFUF9LRVlfTEVOKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkod2VwLT5rZXksIGtleSwgbGVuKTsKKwl3ZXAtPmtleV9sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByaXNtMl93ZXBfZ2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqd2VwID0gcHJpdjsKKworCWlmIChsZW4gPCB3ZXAtPmtleV9sZW4pCisJCXJldHVybiAtMTsKKworCW1lbWNweShrZXksIHdlcC0+a2V5LCB3ZXAtPmtleV9sZW4pOworCisJcmV0dXJuIHdlcC0+a2V5X2xlbjsKK30KKworCitzdGF0aWMgY2hhciAqIHByaXNtMl93ZXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9V0VQIGxlbj0lZFxuIiwKKwkJICAgICB3ZXAtPmtleV9pZHgsIHdlcC0+a2V5X2xlbik7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyBpZWVlODAyMTFfY3J5cHRfd2VwID0geworCS5uYW1lCQkJPSAiV0VQIiwKKwkuaW5pdAkJCT0gcHJpc20yX3dlcF9pbml0LAorCS5kZWluaXQJCQk9IHByaXNtMl93ZXBfZGVpbml0LAorCS5lbmNyeXB0X21wZHUJCT0gcHJpc20yX3dlcF9lbmNyeXB0LAorCS5kZWNyeXB0X21wZHUJCT0gcHJpc20yX3dlcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKKwkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCisJLnNldF9rZXkJCT0gcHJpc20yX3dlcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IHByaXNtMl93ZXBfZ2V0X2tleSwKKwkucHJpbnRfc3RhdHMJCT0gcHJpc20yX3dlcF9wcmludF9zdGF0cywKKwkuZXh0cmFfcHJlZml4X2xlbgk9IDQsIC8qIElWICovCisJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gNCwgLyogSUNWICovCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKK307CisKK2ludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKQoreworCXJldHVybiBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcygmaWVlZTgwMjExX2NyeXB0X3dlcCk7Cit9CisKK3ZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKK3sKKwlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKK30KKwordm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCkKK3sKKy8vCXByaW50aygiPT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTg2OTBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiODAyLjExIGRhdGEvbWFuYWdlbWVudC9jb250cm9sIHN0YWNrIik7CitNT0RVTEVfQVVUSE9SKCJDb3B5cmlnaHQgKEMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24gPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBEUlZfTkFNRSAiaWVlZTgwMjExIgorCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm4gMDsKKworCWllZWUtPm5ldHdvcmtzID0ga21hbGxvYygKKwkJTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoaWVlZS0+bmV0d29ya3MsIDAsCisJICAgICAgIE1BWF9ORVRXT1JLX0NPVU5UICogc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbmV0d29ya3NfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoIWllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm47CisJa2ZyZWUoaWVlZS0+bmV0d29ya3MpOworCWllZWUtPm5ldHdvcmtzID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19pbml0aWFsaXplKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19saXN0KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05FVFdPUktfQ09VTlQ7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmaWVlZS0+bmV0d29ya3NbaV0ubGlzdCwgJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKK30KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaWVlZTgwMjExKGludCBzaXplb2ZfcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLGVycjsKKworCUlFRUU4MDIxMV9ERUJVR19JTkZPKCJJbml0aWFsaXppbmcuLi5cbiIpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKSArIHNpemVvZl9wcml2KTsKKwlpZiAoIWRldikgeworCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBuZXR3b3JrIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwltZW1zZXQoaWVlZSwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKStzaXplb2ZfcHJpdik7CisJaWVlZS0+ZGV2ID0gZGV2OworCisJZXJyID0gaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKGllZWUpOworCWlmIChlcnIpIHsKKwkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gYWxsb2NhdGUgYmVhY29uIHN0b3JhZ2U6ICVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZWVlODAyMTFfbmV0d29ya3NfaW5pdGlhbGl6ZShpZWVlKTsKKworCisJLyogRGVmYXVsdCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBtYXhpbXVtIHBheWxvYWQgc2l6ZSAqLworCWllZWUtPmZ0cyA9IERFRkFVTFRfRlRTOworCWllZWUtPnNjYW5fYWdlID0gREVGQVVMVF9NQVhfU0NBTl9BR0U7CisJaWVlZS0+b3Blbl93ZXAgPSAxOworCisJLyogRGVmYXVsdCB0byBlbmFibGluZyBmdWxsIG9wZW4gV0VQIHdpdGggaG9zdCBiYXNlZCBlbmNyeXB0L2RlY3J5cHQgKi8KKwlpZWVlLT5ob3N0X2VuY3J5cHQgPSAxOworCWllZWUtPmhvc3RfZGVjcnlwdCA9IDE7CisJaWVlZS0+aWVlZTgwMl8xeCA9IDE7IC8qIERlZmF1bHQgdG8gc3VwcG9ydGluZyA4MDIuMXggKi8KKworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7CisJaW5pdF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyOworCisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5id19zcGlubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPnJlb3JkZXJfc3BpbmxvY2spOworCS8vYWRkZWQgYnkgV0IKKwlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX2NobmxvcCksIDApOworCWF0b21pY19zZXQoJihpZWVlLT5hdG1fc3didyksIDApOworCisJaWVlZS0+d3BheF90eXBlX3NldCA9IDA7CisJaWVlZS0+d3BhX2VuYWJsZWQgPSAwOworCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gMDsKKwlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gMDsKKwlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSAwOworCWllZWUtPmllZWU4MDJfMXggPSAxOworCWllZWUtPnJhd190eCA9IDA7CisJLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhbHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCisJaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsgLy9kaXNhYmxlIGh3c2VjLCBzd2l0Y2ggaXQgb24gd2hlbiBuZWNlc3NhcnkuCisKKwlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOworCisJaWVlZS0+cEhUSW5mbyA9IChSVF9ISUdIX1RIUk9VR0hQVVQqKWt6YWxsb2Moc2l6ZW9mKFJUX0hJR0hfVEhST1VHSFBVVCksIEdGUF9LRVJORUwpOworCWlmIChpZWVlLT5wSFRJbmZvID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIG1lbW9yeSBmb3IgSFRJbmZvXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUhUVXBkYXRlRGVmYXVsdFNldHRpbmcoaWVlZSk7CisJSFRJbml0aWFsaXplSFRJbmZvKGllZWUpOyAvL21heSBtb3ZlIHRvIG90aGVyIHBsYWNlLgorCVRTSW5pdGlhbGl6ZShpZWVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+aWJzc19tYWNfaGFzaFtpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCSAgaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkgIGllZWUtPmxhc3RfcnhmcmFnX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorCisvL1RoZXNlIGZ1bmN0aW9uIHdlcmUgYWRkZWQgdG8gbG9hZCBjcnlwdGUgbW9kdWxlIGF1dG9seQorCWllZWU4MDIxMV90a2lwX251bGwoKTsKKwlpZWVlODAyMTFfd2VwX251bGwoKTsKKwlpZWVlODAyMTFfY2NtcF9udWxsKCk7CisKKwlyZXR1cm4gZGV2OworCisgZmFpbGVkOgorCWlmIChkZXYpCisJCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCit2b2lkIGZyZWVfaWVlZTgwMjExKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCS8vc3RydWN0IGxpc3RfaGVhZCAqcCwgKnE7CisvLwlkZWxfdGltZXJfc3luYygmaWVlZS0+U3dCd1RpbWVyKTsKKwlpZiAoaWVlZS0+cEhUSW5mbyAhPSBOVUxMKQorCXsKKwkJa2ZyZWUoaWVlZS0+cEhUSW5mbyk7CisJCWllZWUtPnBIVEluZm8gPSBOVUxMOworCX0KKwlSZW1vdmVBbGxUUyhpZWVlKTsKKwlpZWVlODAyMTFfc29mdG1hY19mcmVlKGllZWUpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOworCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhpZWVlLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBpZWVlLT5jcnlwdFtpXTsKKwkJaWYgKGNyeXB0KSB7CisJCQlpZiAoY3J5cHQtPm9wcykKKwkJCQljcnlwdC0+b3BzLT5kZWluaXQoY3J5cHQtPnByaXYpOworCQkJa2ZyZWUoY3J5cHQpOworCQkJaWVlZS0+Y3J5cHRbaV0gPSBOVUxMOworCQl9CisJfQorCisJaWVlZTgwMjExX25ldHdvcmtzX2ZyZWUoaWVlZSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwordTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IDA7CitzdGF0aWMgaW50IGRlYnVnID0gXAorCS8vCQkgICAgSUVFRTgwMjExX0RMX0lORk8JfAorCS8vCQkgICAgSUVFRTgwMjExX0RMX1dYCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9TQ0FOCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9TVEFURQl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfTUdNVAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfRlJBRwl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfRUFQCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9EUk9QCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9UWAl8CisJLy8JCSAgICBJRUVFODAyMTFfRExfUlgJfAorCQkJICAgIC8vSUVFRTgwMjExX0RMX1FPUyAgICB8CisJLy8JCSAgICBJRUVFODAyMTFfRExfSFQgCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9UUwl8CisvLwkJCSAgICBJRUVFODAyMTFfRExfQkEgCXwKKwkvLwkJICAgIElFRUU4MDIxMV9ETF9SRU9SREVSfAorLy8JCQkgICAgSUVFRTgwMjExX0RMX1RSQUNFICB8CisJCQkgICAgLy9JRUVFODAyMTFfRExfREFUQQl8CisJCQkgICAgSUVFRTgwMjExX0RMX0VSUgkgIC8vYXdheWxzIG9wZW4gdGhpcyBmbGFncyB0byBzaG93IGVycm9yIG91dAorCQkJICAgIDsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaWVlZTgwMjExX3Byb2MgPSBOVUxMOworCitzdGF0aWMgaW50IHNob3dfZGVidWdfbGV2ZWwoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gc25wcmludGYocGFnZSwgY291bnQsICIweCUwOFhcbiIsIGllZWU4MDIxMV9kZWJ1Z19sZXZlbCk7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGJ1ZltdID0gIjB4MDAwMDAwMDAiOworCXVuc2lnbmVkIGxvbmcgbGVuID0gbWluKHNpemVvZihidWYpIC0gMSwgY291bnQpOworCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgbGVuKSkKKwkJcmV0dXJuIGNvdW50OworCWJ1ZltsZW5dID0gMDsKKwlpZiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcgfHwgcFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpIHsKKwkJcCsrOworCQlpZiAocFswXSA9PSAneCcgfHwgcFswXSA9PSAnWCcpCisJCQlwKys7CisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxNik7CisJfSBlbHNlCisJCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJaWYgKHAgPT0gYnVmKQorCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSAgICAgICAiOiAlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZQorCQlpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSB2YWw7CisKKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworaW50IF9faW5pdCBpZWVlODAyMTFfZGVidWdfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKworCWllZWU4MDIxMV9kZWJ1Z19sZXZlbCA9IGRlYnVnOworCisJaWVlZTgwMjExX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgaW5pdF9uZXQucHJvY19uZXQpOworCWlmIChpZWVlODAyMTFfcHJvYyA9PSBOVUxMKSB7CisJCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSAiIERSVl9OQU1FCisJCQkJIiBwcm9jIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgaWVlZTgwMjExX3Byb2MpOworCWlmICghZSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworCQlpZWVlODAyMTFfcHJvYyA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwllLT5yZWFkX3Byb2MgPSBzaG93X2RlYnVnX2xldmVsOworCWUtPndyaXRlX3Byb2MgPSBzdG9yZV9kZWJ1Z19sZXZlbDsKKwllLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBpZWVlODAyMTFfZGVidWdfZXhpdCh2b2lkKQoreworCWlmIChpZWVlODAyMTFfcHJvYykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBpZWVlODAyMTFfcHJvYyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CisJCWllZWU4MDIxMV9wcm9jID0gTlVMTDsKKwl9Cit9CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG91dHB1dCBtYXNrIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDAzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCkBAIC0wLDAgKzEsMjY2OCBAQAorLyoKKyAqIE9yaWdpbmFsIGNvZGUgYmFzZWQgSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MgTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyCisgKiBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zIC0gaG9zdGFwLm8gbW9kdWxlLCBjb21tb24gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9tb25pdG9yX3J4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopc2tiLT5kYXRhOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKworCXNrYi0+ZGV2ID0gaWVlZS0+ZGV2OworICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCisJc2tiX3B1bGwoc2tiLCBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYykpOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjExX1JBVyk7CisJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CisJbmV0aWZfcngoc2tiKTsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKgoraWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdW5zaWduZWQgaW50IHNlcSwKKwkJCSAgdW5zaWduZWQgaW50IGZyYWcsIHU4IHRpZCx1OCAqc3JjLCB1OCAqZHN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqZW50cnk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOOyBpKyspIHsKKwkJZW50cnkgPSAmaWVlZS0+ZnJhZ19jYWNoZVt0aWRdW2ldOworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmCisJCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGVudHJ5LT5maXJzdF9mcmFnX3RpbWUgKyAyICogSFopKSB7CisJCQlJRUVFODAyMTFfREVCVUdfRlJBRygKKwkJCQkiZXhwaXJpbmcgZnJhZ21lbnQgY2FjaGUgZW50cnkgIgorCQkJCSJzZXE9JXUgbGFzdF9mcmFnPSV1XG4iLAorCQkJCWVudHJ5LT5zZXEsIGVudHJ5LT5sYXN0X2ZyYWcpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7CisJCQllbnRyeS0+c2tiID0gTlVMTDsKKwkJfQorCisJCWlmIChlbnRyeS0+c2tiICE9IE5VTEwgJiYgZW50cnktPnNlcSA9PSBzZXEgJiYKKwkJICAgIChlbnRyeS0+bGFzdF9mcmFnICsgMSA9PSBmcmFnIHx8IGZyYWcgPT0gLTEpICYmCisJCSAgICBtZW1jbXAoZW50cnktPnNyY19hZGRyLCBzcmMsIEVUSF9BTEVOKSA9PSAwICYmCisJCSAgICBtZW1jbXAoZW50cnktPmRzdF9hZGRyLCBkc3QsIEVUSF9BTEVOKSA9PSAwKQorCQkJcmV0dXJuIGVudHJ5OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitpZWVlODAyMTFfZnJhZ19jYWNoZV9nZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwl1bnNpZ25lZCBpbnQgZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwl1bnNpZ25lZCBpbnQgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqaGRyXzNhZGRycW9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICpoZHJfNGFkZHJxb3M7CisJdTggdGlkOworCisJaWYgKCgoZmMgJiBJRUVFODAyMTFfRkNUTF9EU1RPRFMpID09IElFRUU4MDIxMV9GQ1RMX0RTVE9EUykmJklFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKKwkgIGhkcl80YWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqKWhkcjsKKwkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcnFvcy0+cW9zX2N0bCkgJiBJRUVFODAyMTFfUUNUTF9USUQ7CisJICB0aWQgPSBVUDJBQyh0aWQpOworCSAgdGlkICsrOworCX0gZWxzZSBpZiAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzNhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIHsKKwkgIHRpZCA9IDA7CisJfQorCisJaWYgKGZyYWcgPT0gMCkgeworCQkvKiBSZXNlcnZlIGVub3VnaCBzcGFjZSB0byBmaXQgbWF4aW11bSBmcmFtZSBsZW5ndGggKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihpZWVlLT5kZXYtPm10dSArCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcikgKworCQkJCSAgICA4IC8qIExMQyAqLyArCisJCQkJICAgIDIgLyogYWxpZ25tZW50ICovICsKKwkJCQkgICAgOCAvKiBXRVAgKi8gKworCQkJCSAgICBFVEhfQUxFTiAvKiBXRFMgKi8gKworCQkJCSAgICAoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKT8yOjApIC8qIFFPUyBDb250cm9sICovKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJZW50cnkgPSAmaWVlZS0+ZnJhZ19jYWNoZVt0aWRdW2llZWUtPmZyYWdfbmV4dF9pZHhbdGlkXV07CisJCWllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSsrOworCQlpZiAoaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdID49IElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTikKKwkJCWllZWUtPmZyYWdfbmV4dF9pZHhbdGlkXSA9IDA7CisKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCkKKwkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCisJCWVudHJ5LT5maXJzdF9mcmFnX3RpbWUgPSBqaWZmaWVzOworCQllbnRyeS0+c2VxID0gc2VxOworCQllbnRyeS0+bGFzdF9mcmFnID0gZnJhZzsKKwkJZW50cnktPnNrYiA9IHNrYjsKKwkJbWVtY3B5KGVudHJ5LT5zcmNfYWRkciwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQltZW1jcHkoZW50cnktPmRzdF9hZGRyLCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJLyogcmVjZWl2ZWQgYSBmcmFnbWVudCBvZiBhIGZyYW1lIGZvciB3aGljaCB0aGUgaGVhZCBmcmFnbWVudAorCQkgKiBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgKi8KKwkJZW50cnkgPSBpZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgZnJhZywgdGlkLGhkci0+YWRkcjIsCisJCQkJCQkgIGhkci0+YWRkcjEpOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCQlza2IgPSBlbnRyeS0+c2tiOworCQl9CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwl1bnNpZ25lZCBpbnQgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqaGRyXzNhZGRycW9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICpoZHJfNGFkZHJxb3M7CisJdTggdGlkOworCisJaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCSAgaGRyXzRhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICopaGRyOworCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKKwkgIHRpZCA9IFVQMkFDKHRpZCk7CisJICB0aWQgKys7CisJfSBlbHNlIGlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfM2FkZHJxb3MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKiloZHI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgeworCSAgdGlkID0gMDsKKwl9CisKKwllbnRyeSA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoaWVlZSwgc2VxLCAtMSwgdGlkLGhkci0+YWRkcjIsCisJCQkJCSAgaGRyLT5hZGRyMSk7CisKKwlpZiAoZW50cnkgPT0gTlVMTCkgeworCQlJRUVFODAyMTFfREVCVUdfRlJBRygKKwkJCSJjb3VsZCBub3QgaW52YWxpZGF0ZSBmcmFnbWVudCBjYWNoZSAiCisJCQkiZW50cnkgKHNlcT0ldSlcbiIsIHNlcSk7CisJCXJldHVybiAtMTsKKwl9CisKKwllbnRyeS0+c2tiID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qIGllZWU4MDIxMV9yeF9mcmFtZV9tZ3RtdAorICoKKyAqIFJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBtYW5hZ2VtZW50IGNvbnRyb2wgZnJhbWVzCisgKgorICogQ2FsbGVkIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAorCQkJdTE2IHN0eXBlKQoreworCS8qIE9uIHRoZSBzdHJ1Y3Qgc3RhdHMgZGVmaW5pdGlvbiB0aGVyZSBpcyB3cml0dGVuIHRoYXQKKwkgKiB0aGlzIGlzIG5vdCBtYW5kYXRvcnkuLi4uIGJ1dCBzZWVtcyB0aGF0IHRoZSBwcm9iZQorCSAqIHJlc3BvbnNlIHBhcnNlciB1c2VzIGl0CisJICovCisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICogaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopc2tiLT5kYXRhOworCisJcnhfc3RhdHMtPmxlbiA9IHNrYi0+bGVuOworCWllZWU4MDIxMV9yeF9tZ3QoaWVlZSwoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKilza2ItPmRhdGEscnhfc3RhdHMpOworICAgICAgICAvL2lmICgoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYgKG1lbWNtcChoZHItPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKSkpCisgICAgICAgIGlmICgobWVtY21wKGhkci0+YWRkcjEsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkpLy91c2UgQUREUjEgdG8gcGVyZm9ybSBhZGRyZXNzIG1hdGNoaW5nIGZvciBNYW5hZ2VtZW50IGZyYW1lcworICAgICAgICB7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisJaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCXJldHVybiAwOworCisJI2lmZGVmIE5PVF9ZRVQKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1hc3RlciBtb2RlIG5vdCB5ZXQgc3VwcHBvcnRlZC5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKy8qCisgIGhvc3RhcF91cGRhdGVfc3RhX3BzKGllZWUsIChzdHJ1Y3QgaG9zdGFwX2llZWU4MDIxMV9oZHJfNGFkZHIgKikKKyAgc2tiLT5kYXRhKTsqLworCX0KKworCWlmIChpZWVlLT5ob3N0YXBkICYmIHR5cGUgPT0gSUVFRTgwMjExX1RZUEVfTUdNVCkgeworCQlpZiAoc3R5cGUgPT0gV0xBTl9GQ19TVFlQRV9CRUFDT04gJiYKKwkJICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IyOworCQkJLyogUHJvY2VzcyBiZWFjb24gZnJhbWVzIGFsc28gaW4ga2VybmVsIGRyaXZlciB0bworCQkJICogdXBkYXRlIFNUQShBUCkgdGFibGUgc3RhdGlzdGljcyAqLworCQkJc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYjIpCisJCQkJaG9zdGFwX3J4KHNrYjItPmRldiwgc2tiMiwgcnhfc3RhdHMpOworCQl9CisKKwkJLyogc2VuZCBtYW5hZ2VtZW50IGZyYW1lcyB0byB0aGUgdXNlciBzcGFjZSBkYWVtb24gZm9yCisJCSAqIHByb2Nlc3NpbmcgKi8KKwkJaWVlZS0+YXBkZXZzdGF0cy5yeF9wYWNrZXRzKys7CisJCWllZWUtPmFwZGV2c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXByaXNtMl9yeF84MDIxMShpZWVlLT5hcGRldiwgc2tiLCByeF9zdGF0cywgUFJJU00yX1JYX01HTVQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkgICAgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKKwkJaWYgKHR5cGUgIT0gV0xBTl9GQ19UWVBFX01HTVQgJiYgdHlwZSAhPSBXTEFOX0ZDX1RZUEVfQ1RSTCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmtub3duIG1hbmFnZW1lbnQgZnJhbWUgIgorCQkJICAgICAgICIodHlwZT0weCUwMngsIHN0eXBlPTB4JTAyeCkgZHJvcHBlZFxuIiwKKwkJCSAgICAgICBza2ItPmRldi0+bmFtZSwgdHlwZSwgc3R5cGUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaG9zdGFwX3J4KHNrYi0+ZGV2LCBza2IsIHJ4X3N0YXRzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3N0YXBfcnhfZnJhbWVfbWdtdDogbWFuYWdlbWVudCBmcmFtZSAiCisJICAgICAgICJyZWNlaXZlZCBpbiBub24tSG9zdCBBUCBtb2RlXG4iLCBza2ItPmRldi0+bmFtZSk7CisJcmV0dXJuIC0xOworCSNlbmRpZgorfQorCisKKworLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KKy8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdID0KK3sgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworLyogQnJpZGdlLVR1bm5lbCBoZWFkZXIgKGZvciBFdGhlclR5cGVzIEVUSF9QX0FBUlAgYW5kIEVUSF9QX0lQWCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV90dW5uZWxfaGVhZGVyW10gPQoreyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CisvKiBObyBlbmNhcHN1bGF0aW9uIGhlYWRlciBpZiBFdGhlclR5cGUgPCAweDYwMCAoPWxlbmd0aCkgKi8KKworLyogQ2FsbGVkIGJ5IGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0ICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGhkcmxlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXUxNiBmYywgZXRoZXJ0eXBlOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJdTggKnBvczsKKworCWlmIChza2ItPmxlbiA8IDI0KQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwkvKiBjaGVjayB0aGF0IHRoZSBmcmFtZSBpcyB1bmljYXN0IGZyYW1lIHRvIHVzICovCisJaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkgICAgSUVFRTgwMjExX0ZDVExfVE9EUyAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjMsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIFRvRFMgZnJhbWUgd2l0aCBvd24gYWRkciBCU1NJRCBhbmQgREEgKi8KKwl9IGVsc2UgaWYgKChmYyAmIChJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgPT0KKwkJICAgSUVFRTgwMjExX0ZDVExfRlJPTURTICYmCisJCSAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcm9tRFMgZnJhbWUgd2l0aCBvd24gYWRkciBhcyBEQSAqLworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWlmIChza2ItPmxlbiA8IDI0ICsgOCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBmb3IgcG9ydCBhY2Nlc3MgZW50aXR5IEV0aGVybmV0IHR5cGUgKi8KKy8vCXBvcyA9IHNrYi0+ZGF0YSArIDI0OworCXBvcyA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlldGhlcnR5cGUgPSAocG9zWzZdIDw8IDgpIHwgcG9zWzddOworCWlmIChldGhlcnR5cGUgPT0gRVRIX1BfUEFFKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK2llZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOworCWludCByZXMsIGhkcmxlbjsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoaWVlZS0+aHdzZWNfYWN0aXZlKQorCXsKKwkJY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5iSHdTZWMgPSAxOworCX0KKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSk7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKKwlpZiAoaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgJiYKKwkgICAgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRLSVAgY291bnRlcm1lYXN1cmVzOiBkcm9wcGVkICIKKwkJCSAgICAgICAicmVjZWl2ZWQgcGFja2V0IGZyb20gIiBNQUNfRk1UICJcbiIsCisJCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBNQUNfQVJHKGhkci0+YWRkcjIpKTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisKKwlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKKwlyZXMgPSBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUoc2tiLCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCSJkZWNyeXB0aW9uIGZhaWxlZCAoU0E9IiBNQUNfRk1UCisJCQkiKSByZXM9JWRcbiIsIE1BQ19BUkcoaGRyLT5hZGRyMiksIHJlcyk7CisJCWlmIChyZXMgPT0gLTIpCisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgiRGVjcnlwdGlvbiBmYWlsZWQgSUNWICIKKwkJCQkJICAgICAibWlzbWF0Y2ggKGtleSAlZClcbiIsCisJCQkJCSAgICAgc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDYpOworCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiByZXM7Cit9CisKKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBpbnQga2V5aWR4LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJaW50IHJlcywgaGRybGVuOworCisJaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1ID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChpZWVlLT5od3NlY19hY3RpdmUpCisJeworCQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IrIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdGNiX2Rlc2MtPmJId1NlYyA9IDE7CisJfQorCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1KHNrYiwga2V5aWR4LCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKKwkJICAgICAgICIgKFNBPSIgTUFDX0ZNVCAiIGtleWlkeD0lZClcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIE1BQ19BUkcoaGRyLT5hZGRyMiksIGtleWlkeCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiB0aGlzIGZ1bmN0aW9uIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyKi8KKyNkZWZpbmUgSUVFRV9QQUNLRVRfUkVUUllfVElNRSAoNSpIWikKK3N0YXRpYyBpbnQgaXNfZHVwbGljYXRlX3BhY2tldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGVhZGVyKQoreworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKTsKKwl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZWFkZXItPnNlcV9jdGwpOworCXUxNiBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwl1MTYgZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwl1MTYgKmxhc3Rfc2VxLCAqbGFzdF9mcmFnOworCXVuc2lnbmVkIGxvbmcgKmxhc3RfdGltZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqaGRyXzNhZGRycW9zOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICpoZHJfNGFkZHJxb3M7CisJdTggdGlkOworCisKKwkvL1RPMkRTIGFuZCBRb1MKKwlpZigoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJICBoZHJfNGFkZHJxb3MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgKiloZWFkZXI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeyAvL1FvUworCSAgaGRyXzNhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zKiloZWFkZXI7CisJICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOworCSAgdGlkID0gVVAyQUModGlkKTsKKwkgIHRpZCArKzsKKwl9IGVsc2UgeyAvLyBubyBRb1MKKwkgIHRpZCA9IDA7CisJfQorCisJc3dpdGNoIChpZWVlLT5pd19tb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCXsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJc3RydWN0IGllZWVfaWJzc19zZXEgKmVudHJ5ID0gTlVMTDsKKwkJdTggKm1hYyA9IGhlYWRlci0+YWRkcjI7CisJCWludCBpbmRleCA9IG1hY1s1XSAlIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFOworCQkvL2ZvciAocG9zID0gKGhlYWQpLT5uZXh0OyBwb3MgIT0gKGhlYWQpOyBwb3MgPSBwb3MtPm5leHQpCisJCS8vX19saXN0X2Zvcl9lYWNoKHAsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgeworCQlsaXN0X2Zvcl9lYWNoKHAsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgeworCQkJZW50cnkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpZWVlX2lic3Nfc2VxLCBsaXN0KTsKKwkJCWlmICghbWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pKQorCQkJCWJyZWFrOworCQl9CisJLy8JaWYgKG1lbWNtcChlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKSl7CisJCWlmIChwID09ICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgeworCQkJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZV9pYnNzX3NlcSksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFlbnRyeSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbm5vdCBtYWxsb2MgbmV3IG1hYyBlbnRyeVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltZW1jcHkoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTik7CisJCQllbnRyeS0+c2VxX251bVt0aWRdID0gc2VxOworCQkJZW50cnktPmZyYWdfbnVtW3RpZF0gPSBmcmFnOworCQkJZW50cnktPnBhY2tldF90aW1lW3RpZF0gPSBqaWZmaWVzOworCQkJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAmaWVlZS0+aWJzc19tYWNfaGFzaFtpbmRleF0pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGFzdF9zZXEgPSAmZW50cnktPnNlcV9udW1bdGlkXTsKKwkJbGFzdF9mcmFnID0gJmVudHJ5LT5mcmFnX251bVt0aWRdOworCQlsYXN0X3RpbWUgPSAmZW50cnktPnBhY2tldF90aW1lW3RpZF07CisJCWJyZWFrOworCX0KKworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJbGFzdF9zZXEgPSAmaWVlZS0+bGFzdF9yeHNlcV9udW1bdGlkXTsKKwkJbGFzdF9mcmFnID0gJmllZWUtPmxhc3RfcnhmcmFnX251bVt0aWRdOworCQlsYXN0X3RpbWUgPSAmaWVlZS0+bGFzdF9wYWNrZXRfdGltZVt0aWRdOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworLy8JaWYodGlkICE9IDApIHsKKy8vCQlwcmludGsoS0VSTl9XQVJOSU5HICI6KSkpKSkpKSkpKSkleCAleCAleCwgZmMoJXgpXG4iLCB0aWQsICpsYXN0X3NlcSwgc2VxLCBoZWFkZXItPmZyYW1lX2N0bCk7CisvLwl9CisJaWYgKCgqbGFzdF9zZXEgPT0gc2VxKSAmJgorCSAgICB0aW1lX2FmdGVyKCpsYXN0X3RpbWUgKyBJRUVFX1BBQ0tFVF9SRVRSWV9USU1FLCBqaWZmaWVzKSkgeworCQlpZiAoKmxhc3RfZnJhZyA9PSBmcmFnKXsKKwkJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiWzFdIGdvIGRyb3AhXG4iKTsKKwkJCWdvdG8gZHJvcDsKKworCQl9CisJCWlmICgqbGFzdF9mcmFnICsgMSAhPSBmcmFnKQorCQkJLyogb3V0LW9mLW9yZGVyIGZyYWdtZW50ICovCisJCQkvL3ByaW50ayhLRVJOX1dBUk5JTkcgIlsyXSBnbyBkcm9wIVxuIik7CisJCQlnb3RvIGRyb3A7CisJfSBlbHNlCisJCSpsYXN0X3NlcSA9IHNlcTsKKworCSpsYXN0X2ZyYWcgPSBmcmFnOworCSpsYXN0X3RpbWUgPSBqaWZmaWVzOworCXJldHVybiAwOworCitkcm9wOgorLy8JQlVHX09OKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9SRVRSWSkpOworLy8JcHJpbnRrKCJEVVBcbiIpOworCisJcmV0dXJuIDE7Cit9Citib29sCitBZGRSZW9yZGVyRW50cnkoCisJUFJYX1RTX1JFQ09SRAkJCXBUUywKKwlQUlhfUkVPUkRFUl9FTlRSWQkJcFJlb3JkZXJFbnRyeQorCSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwTGlzdCA9ICZwVFMtPlJ4UGVuZGluZ1BrdExpc3Q7CisJd2hpbGUocExpc3QtPm5leHQgIT0gJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkKKwl7CisJCWlmKCBTTl9MRVNTKHBSZW9yZGVyRW50cnktPlNlcU51bSwgKChQUlhfUkVPUkRFUl9FTlRSWSlsaXN0X2VudHJ5KHBMaXN0LT5uZXh0LFJYX1JFT1JERVJfRU5UUlksTGlzdCkpLT5TZXFOdW0pICkKKwkJeworCQkJcExpc3QgPSBwTGlzdC0+bmV4dDsKKwkJfQorCQllbHNlIGlmKCBTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sICgoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwTGlzdC0+bmV4dCxSWF9SRU9SREVSX0VOVFJZLExpc3QpKS0+U2VxTnVtKSApCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJyZWFrOworCQl9CisJfQorCXBSZW9yZGVyRW50cnktPkxpc3QubmV4dCA9IHBMaXN0LT5uZXh0OworCXBSZW9yZGVyRW50cnktPkxpc3QubmV4dC0+cHJldiA9ICZwUmVvcmRlckVudHJ5LT5MaXN0OworCXBSZW9yZGVyRW50cnktPkxpc3QucHJldiA9IHBMaXN0OworCXBMaXN0LT5uZXh0ID0gJnBSZW9yZGVyRW50cnktPkxpc3Q7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9yeGIqKiBwcnhiSW5kaWNhdGVBcnJheSx1OCAgaW5kZXgpCit7CisJdTggaSA9IDAgLCBqPTA7CisJdTE2IGV0aGVydHlwZTsKKy8vCWlmKGluZGV4ID4gMSkKKy8vCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IGhhaGFoYWhoaGgsIFdlIGluZGljYXRlIHBhY2tldCBmcm9tIHJlb3JkZXIgbGlzdCwgaW5kZXggaXMgJXVcbiIsX19GVU5DVElPTl9fLGluZGV4KTsKKwlmb3IoaiA9IDA7IGo8aW5kZXg7IGorKykKKwl7CisvL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgorCQlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcHJ4YiA9IHByeGJJbmRpY2F0ZUFycmF5W2pdOworCQlmb3IoaSA9IDA7IGk8cHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpzdWJfc2tiID0gcHJ4Yi0+c3ViZnJhbWVzW2ldOworCisJCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwkJCWV0aGVydHlwZSA9IChzdWJfc2tiLT5kYXRhWzZdIDw8IDgpIHwgc3ViX3NrYi0+ZGF0YVs3XTsKKwkJCWlmIChzdWJfc2tiLT5sZW4gPj0gOCAmJgorCQkJCSgobWVtY21wKHN1Yl9za2ItPmRhdGEsIHJmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpID09IDAgJiYKKwkJCQkgIGV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CisJCQkJIG1lbWNtcChzdWJfc2tiLT5kYXRhLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgeworCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAorCQkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPnNyYywgRVRIX0FMRU4pOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPmRzdCwgRVRIX0FMRU4pOworCQkJfSBlbHNlIHsKKwkJCQl1MTYgbGVuOworCQkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KKwkJCQlsZW4gPSBodG9ucyhzdWJfc2tiLT5sZW4pOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCAyKSwgJmxlbiwgMik7CisJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgcHJ4Yi0+c3JjLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgcHJ4Yi0+ZHN0LCBFVEhfQUxFTik7CisJCQl9CisJCQkvL3N0YXRzLT5yeF9wYWNrZXRzKys7CisJCQkvL3N0YXRzLT5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47CisKKwkJLyogSW5kaWNhdCB0aGUgcGFja2V0cyB0byB1cHBlciBsYXllciAqLworCQkJaWYgKHN1Yl9za2IpIHsKKwkJCQkvL3ByaW50aygiMHNrYl9sZW4oJWQpXG4iLCBza2ItPmxlbik7CisJCQkJc3ViX3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhzdWJfc2tiLCBpZWVlLT5kZXYpOworCQkJCW1lbXNldChzdWJfc2tiLT5jYiwgMCwgc2l6ZW9mKHN1Yl9za2ItPmNiKSk7CisJCQkJc3ViX3NrYi0+ZGV2ID0gaWVlZS0+ZGV2OworCQkJCXN1Yl9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7IC8qIDgwMi4xMSBjcmMgbm90IHN1ZmZpY2llbnQgKi8KKwkJCQkvL3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7IC8qIDgwMi4xMSBjcmMgbm90IHN1ZmZpY2llbnQgKi8KKwkJCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCQkJCS8vcHJpbnRrKCIxc2tiX2xlbiglZClcbiIsIHNrYi0+bGVuKTsKKwkJCQluZXRpZl9yeChzdWJfc2tiKTsKKwkJCX0KKwkJfQorCQlrZnJlZShwcnhiKTsKKwkJcHJ4YiA9IE5VTEw7CisJfQorfQorCisKK3ZvaWQgUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcHJ4YiwKKwkJUFJYX1RTX1JFQ09SRAkJcFRTLAorCQl1MTYJCQlTZXFOdW0pCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlQUlhfUkVPUkRFUl9FTlRSWSAJcFJlb3JkZXJFbnRyeSA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGJJbmRpY2F0ZUFycmF5W1JFT1JERVJfV0lOX1NJWkVdOworCXU4CQkJV2luU2l6ZSA9IHBIVEluZm8tPlJ4UmVvcmRlcldpblNpemU7CisJdTE2CQkJV2luRW5kID0gKHBUUy0+UnhJbmRpY2F0ZVNlcSArIFdpblNpemUgLTEpJTQwOTY7CisJdTgJCQlpbmRleCA9IDA7CisJYm9vbAkJCWJNYXRjaFdpblN0YXJ0ID0gZmFsc2UsIGJQa3RJbkJ1ZiA9IGZhbHNlOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogU2VxIGlzICVkLHBUUy0+UnhJbmRpY2F0ZVNlcSBpcyAlZCwgV2luU2l6ZSBpcyAlZFxuIixfX0ZVTkNUSU9OX18sU2VxTnVtLHBUUy0+UnhJbmRpY2F0ZVNlcSxXaW5TaXplKTsKKwkvKiBSeCBSZW9yZGVyIGluaXRpYWxpemUgY29uZGl0aW9uLiovCisJaWYocFRTLT5SeEluZGljYXRlU2VxID09IDB4ZmZmZikgeworCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSBTZXFOdW07CisJfQorCisJLyogRHJvcCBvdXQgdGhlIHBhY2tldCB3aGljaCBTZXFOdW0gaXMgc21hbGxlciB0aGFuIFdpblN0YXJ0ICovCisJaWYoU05fTEVTUyhTZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpIHsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCJQYWNrZXQgRHJvcCEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLAorCQkJCSBwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCXBIVEluZm8tPlJ4UmVvcmRlckRyb3BDb3VudGVyKys7CisJCXsKKwkJCWludCBpOworCQkJZm9yKGkgPTA7IGkgPCBwcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgeworCQkJCWRldl9rZnJlZV9za2IocHJ4Yi0+c3ViZnJhbWVzW2ldKTsKKwkJCX0KKwkJCWtmcmVlKHByeGIpOworCQkJcHJ4YiA9IE5VTEw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogU2xpZGluZyB3aW5kb3cgbWFuaXB1bGF0aW9uLiBDb25kaXRpb25zIGluY2x1ZGVzOgorCSAqIDEuIEluY29taW5nIFNlcU51bSBpcyBlcXVhbCB0byBXaW5TdGFydCA9PldpbmRvdyBzaGlmdCAxCisJICogMi4gSW5jb21pbmcgU2VxTnVtIGlzIGxhcmdlciB0aGFuIHRoZSBXaW5FbmQgPT4gV2luZG93IHNoaWZ0IE4KKwkgKi8KKwlpZihTTl9FUVVBTChTZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpIHsKKwkJcFRTLT5SeEluZGljYXRlU2VxID0gKHBUUy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKKwkJYk1hdGNoV2luU3RhcnQgPSB0cnVlOworCX0gZWxzZSBpZihTTl9MRVNTKFdpbkVuZCwgU2VxTnVtKSkgeworCQlpZihTZXFOdW0gPj0gKFdpblNpemUgLSAxKSkgeworCQkJcFRTLT5SeEluZGljYXRlU2VxID0gU2VxTnVtICsgMSAtV2luU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IDQwOTUgLSAoV2luU2l6ZSAtIChTZXFOdW0gKzEpKSArIDE7CisJCX0KKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCAiV2luZG93IFNoaWZ0ISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIscFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOworCX0KKworCS8qCisJICogSW5kaWNhdGlvbiBwcm9jZXNzLgorCSAqIEFmdGVyIFBhY2tldCBkcm9wcGluZyBhbmQgU2xpZGluZyBXaW5kb3cgc2hpZnRpbmcgYXMgYWJvdmUsIHdlIGNhbiBub3cganVzdCBpbmRpY2F0ZSB0aGUgcGFja2V0cworCSAqIHdpdGggdGhlIFNlcU51bSBzbWFsbGVyIHRoYW4gbGF0ZXN0IFdpblN0YXJ0IGFuZCBidWZmZXIgb3RoZXIgcGFja2V0cy4KKwkgKi8KKwkvKiBGb3IgUnggUmVvcmRlciBjb25kaXRpb246CisJICogMS4gQWxsIHBhY2tldHMgd2l0aCBTZXFOdW0gc21hbGxlciB0aGFuIFdpblN0YXJ0ID0+IEluZGljYXRlCisJICogMi4gQWxsIHBhY2tldHMgd2l0aCBTZXFOdW0gbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gV2luU3RhcnQgPT4gQnVmZmVyIGl0LgorCSAqLworCWlmKGJNYXRjaFdpblN0YXJ0KSB7CisJCS8qIEN1cnJlbnQgcGFja2V0IGlzIGdvaW5nIHRvIGJlIGluZGljYXRlZC4qLworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsICJQYWNrZXRzIGluZGljYXRpb24hISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsXAorCQkJCXBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwkJcHJ4YkluZGljYXRlQXJyYXlbMF0gPSBwcnhiOworLy8JCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PiVzKCk6IFNlcU51bSBpcyAlZFxuIixfX0ZVTkNUSU9OX18sU2VxTnVtKTsKKwkJaW5kZXggPSAxOworCX0gZWxzZSB7CisJCS8qIEN1cnJlbnQgcGFja2V0IGlzIGdvaW5nIHRvIGJlIGluc2VydGVkIGludG8gcGVuZGluZyBsaXN0LiovCisJCS8vSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBXZSBSWCBubyBvcmRlcmVkIHBhY2tlZCwgaW5zZXJ0IHRvIG9yZGVyZCBsaXN0XG4iLF9fRlVOQ1RJT05fXyk7CisJCWlmKCFsaXN0X2VtcHR5KCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpKSB7CisJCQlwUmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkoaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0Lm5leHQsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQkvKiBNYWtlIGEgcmVvcmRlciBlbnRyeSBhbmQgaW5zZXJ0IGludG8gYSB0aGUgcGFja2V0IGxpc3QuKi8KKwkJCXBSZW9yZGVyRW50cnktPlNlcU51bSA9IFNlcU51bTsKKwkJCXBSZW9yZGVyRW50cnktPnByeGIgPSBwcnhiOworCS8vCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IHBSRW9yZGVyRW50cnktPlNlcU51bSBpcyAlZFxuIixfX0ZVTkNUSU9OX18scFJlb3JkZXJFbnRyeS0+U2VxTnVtKTsKKworCQkJaWYoIUFkZFJlb3JkZXJFbnRyeShwVFMsIHBSZW9yZGVyRW50cnkpKSB7CisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCAiJXMoKTogRHVwbGljYXRlIHBhY2tldCBpcyBkcm9wcGVkISEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZwUmVvcmRlckVudHJ5LT5MaXN0LCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQkJCXsKKwkJCQkJaW50IGk7CisJCQkJCWZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCQkJCWRldl9rZnJlZV9za2IocHJ4Yi0+c3ViZnJhbWVzW2ldKTsKKwkJCQkJfQorCQkJCQlrZnJlZShwcnhiKTsKKwkJCQkJcHJ4YiA9IE5VTEw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsCisJCQkJCSAiUGt0IGluc2VydCBpbnRvIGJ1ZmZlciEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIixwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogUGFja2V0cyBhcmUgZHJvcHBlZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJlb3JkZXIgZW50cmllcy4KKwkJCSAqIFRoaXMgcGFydCBzaGFsbCBiZSBtb2RpZmllZCEhIFdlIGNhbiBqdXN0IGluZGljYXRlIGFsbCB0aGUKKwkJCSAqIHBhY2tldHMgaW4gYnVmZmVyIGFuZCBnZXQgcmVvcmRlciBlbnRyaWVzLgorCQkJICovCisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IFRoZXJlIGlzIG5vIHJlb3JkZXIgZW50cnkhISBQYWNrZXQgaXMgZHJvcHBlZCEhXG4iKTsKKwkJCXsKKwkJCQlpbnQgaTsKKwkJCQlmb3IoaSA9MDsgaSA8IHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CisJCQkJCWRldl9rZnJlZV9za2IocHJ4Yi0+c3ViZnJhbWVzW2ldKTsKKwkJCQl9CisJCQkJa2ZyZWUocHJ4Yik7CisJCQkJcHJ4YiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuKi8KKwl3aGlsZSghbGlzdF9lbXB0eSgmcFRTLT5SeFBlbmRpbmdQa3RMaXN0KSkgeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IHN0YXJ0IFJSRU9SREVSIGluZGljYXRlXG4iLF9fRlVOQ1RJT05fXyk7CisJCXBSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwVFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOworCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkgfHwKKwkJCQlTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpCisJCXsKKwkJCS8qIFRoaXMgcHJvdGVjdCBidWZmZXIgZnJvbSBvdmVyZmxvdy4gKi8KKwkJCWlmKGluZGV4ID49IFJFT1JERVJfV0lOX1NJWkUpIHsKKwkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IEJ1ZmZlciBvdmVyZmxvdyEhIFxuIik7CisJCQkJYlBrdEluQnVmID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbGlzdF9kZWxfaW5pdCgmcFJlb3JkZXJFbnRyeS0+TGlzdCk7CisKKwkJCWlmKFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFRTLT5SeEluZGljYXRlU2VxKSkKKwkJCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAocFRTLT5SeEluZGljYXRlU2VxICsgMSkgJSA0MDk2OworCisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIlBhY2tldHMgaW5kaWNhdGlvbiEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIixwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7CisJCQlwcnhiSW5kaWNhdGVBcnJheVtpbmRleF0gPSBwUmVvcmRlckVudHJ5LT5wcnhiOworCQkvLwlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT4lcygpOiBwUmVvcmRlckVudHJ5LT5TZXFOdW0gaXMgJWRcbiIsX19GVU5DVElPTl9fLHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisJCQlpbmRleCsrOworCisJCQlsaXN0X2FkZF90YWlsKCZwUmVvcmRlckVudHJ5LT5MaXN0LCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQl9IGVsc2UgeworCQkJYlBrdEluQnVmID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSGFuZGxpbmcgcGVuZGluZyB0aW1lci4gU2V0IHRoaXMgdGltZXIgdG8gcHJldmVudCBmcm9tIGxvbmcgdGltZSBSeCBidWZmZXJpbmcuKi8KKwlpZihpbmRleD4wKSB7CisJCS8vIENhbmNlbCBwcmV2aW91cyBwZW5kaW5nIHRpbWVyLgorCS8vCWRlbF90aW1lcl9zeW5jKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKwkJcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKKworCQkvLyBJbmRpY2F0ZSBwYWNrZXRzCisJCWlmKGluZGV4PlJFT1JERVJfV0lOX1NJWkUpeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiBSeCBSZW9yZXIgYnVmZmVyIGZ1bGwhISBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKGllZWUsIHByeGJJbmRpY2F0ZUFycmF5LCBpbmRleCk7CisJfQorCisJaWYoYlBrdEluQnVmICYmIHBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikgeworCQkvLyBTZXQgbmV3IHBlbmRpbmcgdGltZXIuCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogU0VUIHJ4IHRpbWVvdXQgdGltZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSBwVFMtPlJ4SW5kaWNhdGVTZXE7CisJCWlmKHRpbWVyX3BlbmRpbmcoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQorCQkJZGVsX3RpbWVyX3N5bmMoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpOworCQlwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MocEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUpOworCQlhZGRfdGltZXIoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpOworCX0KK30KKwordTggcGFyc2Vfc3ViZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLAorCQkgIHN0cnVjdCBpZWVlODAyMTFfcnhiICpyeGIsdTgqIHNyYyx1OCogZHN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiApc2tiLT5kYXRhOworCXUxNgkJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwl1MTYJCUxMQ09mZnNldD0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwl1MTYJCUNoa0xlbmd0aDsKKwlib29sCQliSXNBZ2dyZWdhdGVGcmFtZSA9IGZhbHNlOworCXUxNgkJblN1YmZyYW1lX0xlbmd0aDsKKwl1OAkJblBhZGRpbmdfTGVuZ3RoID0gMDsKKwl1MTYJCVNlcU51bT0wOworCisJc3RydWN0IHNrX2J1ZmYgKnN1Yl9za2I7CisJdTggICAgICAgICAgICAgKmRhdGFfcHRyOworCS8qIGp1c3QgZm9yIGRlYnVnIHB1cnBvc2UgKi8KKwlTZXFOdW0gPSBXTEFOX0dFVF9TRVFfU0VRKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCkpOworCisJaWYoKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpJiZcCisJCQkoKChmcmFtZXFvcyAqKShza2ItPmRhdGEgKyBJRUVFODAyMTFfM0FERFJfTEVOKSktPmZpZWxkLnJlc2VydmVkKSkgeworCQliSXNBZ2dyZWdhdGVGcmFtZSA9IHRydWU7CisJfQorCisJaWYoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgeworCQlMTENPZmZzZXQgKz0gMjsKKwl9CisKKwlpZihyeF9zdGF0cy0+YkNvbnRhaW5IVEMpIHsKKwkJTExDT2Zmc2V0ICs9IHNIVENMbmc7CisJfQorCS8vcHJpbnRrKCJDaGtMZW5ndGggPSAlZFxuIiwgTExDT2Zmc2V0KTsKKwkvLyBOdWxsIHBhY2tldCwgZG9uJ3QgaW5kaWNhdGUgaXQgdG8gdXBwZXIgbGF5ZXIKKwlDaGtMZW5ndGggPSBMTENPZmZzZXQ7LyogKyAoRnJhbWVfV0VQKGZyYW1lKSE9MCA/QWRhcHRlci0+TWdudEluZm8uU2VjdXJpdHlJbmZvLkVuY3J5cHRpb25IZWFkT3ZlcmhlYWQ6MCk7Ki8KKworCWlmKCBza2ItPmxlbiA8PSBDaGtMZW5ndGggKSB7CisJCXJldHVybiAwOworCX0KKworCXNrYl9wdWxsKHNrYiwgTExDT2Zmc2V0KTsKKworCWlmKCFiSXNBZ2dyZWdhdGVGcmFtZSkgeworCQlyeGItPm5yX3N1YmZyYW1lcyA9IDE7CisjaWZkZWYgSk9ITl9OT0NQWQorCQlyeGItPnN1YmZyYW1lc1swXSA9IHNrYjsKKyNlbHNlCisJCXJ4Yi0+c3ViZnJhbWVzWzBdID0gc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKKyNlbmRpZgorCisJCW1lbWNweShyeGItPnNyYyxzcmMsRVRIX0FMRU4pOworCQltZW1jcHkocnhiLT5kc3QsZHN0LEVUSF9BTEVOKTsKKwkJLy9JRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfUlgsc2tiLT5kYXRhLHNrYi0+bGVuKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcnhiLT5ucl9zdWJmcmFtZXMgPSAwOworCQltZW1jcHkocnhiLT5zcmMsc3JjLEVUSF9BTEVOKTsKKwkJbWVtY3B5KHJ4Yi0+ZHN0LGRzdCxFVEhfQUxFTik7CisJCXdoaWxlKHNrYi0+bGVuID4gRVRIRVJORVRfSEVBREVSX1NJWkUpIHsKKwkJCS8qIE9mZnNldCAxMiBkZW5vdGUgMiBtYWMgYWRkcmVzcyAqLworCQkJblN1YmZyYW1lX0xlbmd0aCA9ICooKHUxNiopKHNrYi0+ZGF0YSArIDEyKSk7CisJCQkvLz09bT09PmNoYW5nZSB0aGUgbGVuZ3RoIG9yZGVyCisJCQluU3ViZnJhbWVfTGVuZ3RoID0gKG5TdWJmcmFtZV9MZW5ndGg+PjgpICsgKG5TdWJmcmFtZV9MZW5ndGg8PDgpOworCisJCQlpZihza2ItPmxlbjwoRVRIRVJORVRfSEVBREVSX1NJWkUgKyBuU3ViZnJhbWVfTGVuZ3RoKSkgeworCQkJCXByaW50aygiJXM6IEEtTVNEVSBwYXJzZSBlcnJvciEhIHBSZmQtPm5Ub3RhbFN1YmZyYW1lIDogJWRcbiIsXAorCQkJCQkJX19GVU5DVElPTl9fLHJ4Yi0+bnJfc3ViZnJhbWVzKTsKKwkJCQlwcmludGsoIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBTdWJmcmFtZSBMZW5ndGg6ICVkXG4iLF9fRlVOQ1RJT05fXywgblN1YmZyYW1lX0xlbmd0aCk7CisJCQkJcHJpbnRrKCJuUmVtYWluX0xlbmd0aCBpcyAlZCBhbmQgblN1YmZyYW1lX0xlbmd0aCBpcyA6ICVkXG4iLHNrYi0+bGVuLG5TdWJmcmFtZV9MZW5ndGgpOworCQkJCXByaW50aygiVGhlIFBhY2tldCBTZXFOdW0gaXMgJWRcbiIsU2VxTnVtKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJLyogbW92ZSB0aGUgZGF0YSBwb2ludCB0byBkYXRhIGNvbnRlbnQgKi8KKwkJCXNrYl9wdWxsKHNrYiwgRVRIRVJORVRfSEVBREVSX1NJWkUpOworCisjaWZkZWYgSk9ITl9OT0NQWQorCQkJc3ViX3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQkJc3ViX3NrYi0+bGVuID0gblN1YmZyYW1lX0xlbmd0aDsKKwkJCXN1Yl9za2ItPnRhaWwgPSBzdWJfc2tiLT5kYXRhICsgblN1YmZyYW1lX0xlbmd0aDsKKyNlbHNlCisJCQkvKiBBbGxvY2F0ZSBuZXcgc2tiIGZvciByZWxlYXNpbmcgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJCXN1Yl9za2IgPSBkZXZfYWxsb2Nfc2tiKG5TdWJmcmFtZV9MZW5ndGggKyAxMik7CisJCQlza2JfcmVzZXJ2ZShzdWJfc2tiLCAxMik7CisJCQlkYXRhX3B0ciA9ICh1OCAqKXNrYl9wdXQoc3ViX3NrYiwgblN1YmZyYW1lX0xlbmd0aCk7CisJCQltZW1jcHkoZGF0YV9wdHIsc2tiLT5kYXRhLG5TdWJmcmFtZV9MZW5ndGgpOworI2VuZGlmCisJCQlyeGItPnN1YmZyYW1lc1tyeGItPm5yX3N1YmZyYW1lcysrXSA9IHN1Yl9za2I7CisJCQlpZihyeGItPm5yX3N1YmZyYW1lcyA+PSBNQVhfU1VCRlJBTUVfQ09VTlQpIHsKKwkJCQlJRUVFODAyMTFfREVCVUdfUlgoIlBhcnNlU3ViZnJhbWUoKTogVG9vIG1hbnkgU3ViZnJhbWVzISBQYWNrZXRzIGRyb3BwZWQhXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYl9wdWxsKHNrYixuU3ViZnJhbWVfTGVuZ3RoKTsKKworCQkJaWYoc2tiLT5sZW4gIT0gMCkgeworCQkJCW5QYWRkaW5nX0xlbmd0aCA9IDQgLSAoKG5TdWJmcmFtZV9MZW5ndGggKyBFVEhFUk5FVF9IRUFERVJfU0laRSkgJSA0KTsKKwkJCQlpZihuUGFkZGluZ19MZW5ndGggPT0gNCkgeworCQkJCQluUGFkZGluZ19MZW5ndGggPSAwOworCQkJCX0KKworCQkJCWlmKHNrYi0+bGVuIDwgblBhZGRpbmdfTGVuZ3RoKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCXNrYl9wdWxsKHNrYixuUGFkZGluZ19MZW5ndGgpOworCQkJfQorCQl9CisjaWZkZWYgSk9ITl9OT0NQWQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisjZW5kaWYKKwkJLy97anVzdCBmb3IgZGVidWcgYWRkZWQgYnkgZGF2aWQKKwkJLy9wcmludGsoIkFNU0RVOjpyeGItPm5yX3N1YmZyYW1lcyA9ICVkXG4iLHJ4Yi0+bnJfc3ViZnJhbWVzKTsKKwkJLy99CisJCXJldHVybiByeGItPm5yX3N1YmZyYW1lczsKKwl9Cit9CisKKy8qIEFsbCByZWNlaXZlZCBmcmFtZXMgYXJlIHNlbnQgdG8gdGhpcyBmdW5jdGlvbi4gQHNrYiBjb250YWlucyB0aGUgZnJhbWUgaW4KKyAqIElFRUUgODAyLjExIGZvcm1hdCwgaS5lLiwgaW4gdGhlIGZvcm1hdCBpdCB3YXMgc2VudCBvdmVyIGFpci4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLiAqLworaW50IGllZWU4MDIxMV9yeChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwkvL3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICpoZHI7CisKKwlzaXplX3QgaGRybGVuOworCXUxNiBmYywgdHlwZSwgc3R5cGUsIHNjOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwl1bnNpZ25lZCBpbnQgZnJhZzsKKwl1OCAqcGF5bG9hZDsKKwl1MTYgZXRoZXJ0eXBlOworCS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCisJdTgJVElEID0gMDsKKwl1MTYJU2VxTnVtID0gMDsKKwlQUlhfVFNfUkVDT1JEIHBUUyA9IE5VTEw7CisJLy9ib29sIGJJc0FnZ3JlZ2F0ZUZyYW1lID0gZmFsc2U7CisJLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKyNpZmRlZiBOT1RfWUVUCisJc3RydWN0IG5ldF9kZXZpY2UgKndkcyA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOworCWludCBmcmFtZV9hdXRob3JpemVkID0gMDsKKwlpbnQgZnJvbV9hc3NvY19hcCA9IDA7CisJdm9pZCAqc3RhID0gTlVMTDsKKyNlbmRpZgorLy8JdTE2IHFvc19jdGwgPSAwOworCXU4IGRzdFtFVEhfQUxFTl07CisJdTggc3JjW0VUSF9BTEVOXTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCA9IE5VTEw7CisJaW50IGtleWlkeCA9IDA7CisKKwlpbnQgaTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcnhiID0gTlVMTDsKKwkvLyBjaGVhdCB0aGUgdGhlIGhkciB0eXBlCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopc2tiLT5kYXRhOworCXN0YXRzID0gJmllZWUtPnN0YXRzOworCisJaWYgKHNrYi0+bGVuIDwgMTApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNLQiBsZW5ndGggPCAxMFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJc3R5cGUgPSBXTEFOX0ZDX0dFVF9TVFlQRShmYyk7CisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCisJZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKwloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihmYyk7CisKKwlpZihIVENDaGVjayhpZWVlLCBza2ItPmRhdGEpKQorCXsKKwkJaWYobmV0X3JhdGVsaW1pdCgpKQorCQlwcmludGsoImZpbmQgSFRDQ29udHJvbFxuIik7CisJCWhkcmxlbiArPSA0OworCQlyeF9zdGF0cy0+YkNvbnRhaW5IVEMgPSAxOworCX0KKworCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworI2lmZGVmIE5PVF9ZRVQKKyNpZiBXSVJFTEVTU19FWFQgPiAxNQorCS8qIFB1dCB0aGlzIGNvZGUgaGVyZSBzbyB0aGF0IHdlIGF2b2lkIGR1cGxpY2F0aW5nIGl0IGluIGFsbAorCSAqIFJ4IHBhdGhzLiAtIEplYW4gSUkgKi8KKyNpZmRlZiBJV19XSVJFTEVTU19TUFkJCS8qIGRlZmluZWQgaW4gaXdfaGFuZGxlci5oICovCisJLyogSWYgc3B5IG1vbml0b3Jpbmcgb24gKi8KKwlpZiAoaWZhY2UtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwkJd3N0YXRzLmxldmVsID0gcnhfc3RhdHMtPnJzc2k7CisJCXdzdGF0cy5ub2lzZSA9IHJ4X3N0YXRzLT5ub2lzZTsKKwkJd3N0YXRzLnVwZGF0ZWQgPSA2OwkvKiBObyBxdWFsIHZhbHVlICovCisJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgaGRyLT5hZGRyMiwgJndzdGF0cyk7CisJfQorI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE1ICovCisJaG9zdGFwX3VwZGF0ZV9yeF9zdGF0cyhsb2NhbC0+YXAsIGhkciwgcnhfc3RhdHMpOworI2VuZGlmCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNQorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQlpZWVlODAyMTFfbW9uaXRvcl9yeChpZWVlLCBza2IsIHJ4X3N0YXRzKTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0KSB7CisJCWludCBpZHggPSAwOworCQlpZiAoc2tiLT5sZW4gPj0gaGRybGVuICsgMykKKwkJCWlkeCA9IHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2OworCQljcnlwdCA9IGllZWUtPmNyeXB0W2lkeF07CisjaWZkZWYgTk9UX1lFVAorCQlzdGEgPSBOVUxMOworCisJCS8qIFVzZSBzdGF0aW9uIHNwZWNpZmljIGtleSB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgaWYgdGhlCisJCSAqIHJlY2VpdmVyIGFkZHJlc3MgaXMgYSB1bmljYXN0IGFkZHJlc3MgKCJpbmRpdmlkdWFsIFJBIikuIElmCisJCSAqIGJjcnhfc3RhX2tleSBwYXJhbWV0ZXIgaXMgc2V0LCBzdGF0aW9uIHNwZWNpZmljIGtleSBpcyB1c2VkCisJCSAqIGV2ZW4gd2l0aCBicm9hZC9tdWx0aWNhc3QgdGFyZ2V0cyAodGhpcyBpcyBhZ2FpbnN0IElFRUUKKwkJICogODAyLjExLCBidXQgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBkaWZmZXJlbnQga2V5cyB3aXRoCisJCSAqIHN0YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgV0VQIGtleSBtYXBwaW5nKS4gKi8KKworCQlpZiAoIShoZHItPmFkZHIxWzBdICYgMHgwMSkgfHwgbG9jYWwtPmJjcnhfc3RhX2tleSkKKwkJCSh2b2lkKSBob3N0YXBfaGFuZGxlX3N0YV9jcnlwdG8obG9jYWwsIGhkciwgJmNyeXB0LAorCQkJCQkJCSZzdGEpOworI2VuZGlmCisKKwkJLyogYWxsb3cgTlVMTCBkZWNyeXB0IHRvIGluZGljYXRlIGFuIHN0YXRpb24gc3BlY2lmaWMgb3ZlcnJpZGUKKwkJICogZm9yIGRlZmF1bHQgZW5jcnlwdGlvbiAqLworCQlpZiAoY3J5cHQgJiYgKGNyeXB0LT5vcHMgPT0gTlVMTCB8fAorCQkJICAgICAgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tcGR1ID09IE5VTEwpKQorCQkJY3J5cHQgPSBOVUxMOworCisJCWlmICghY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSkgeworCQkJLyogVGhpcyBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgc29tZSAobXVsdGljYXN0PykKKwkJCSAqIGZyYW1lcyBmcm9tIG90aGVyIHRoYW4gY3VycmVudCBCU1MsIHNvIGp1c3QgZHJvcCB0aGUKKwkJCSAqIGZyYW1lcyBzaWxlbnRseSBpbnN0ZWFkIG9mIGZpbGxpbmcgc3lzdGVtIGxvZyB3aXRoCisJCQkgKiB0aGVzZSByZXBvcnRzLiAqLworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIChub3Qgc2V0KSIKKwkJCQkJICAgICAiIChTQT0iIE1BQ19GTVQgIilcbiIsCisJCQkJCSAgICAgTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCX0KKworCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjNfTEVOKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwkvLyBpZiBRb1MgZW5hYmxlZCwgc2hvdWxkIGNoZWNrIHRoZSBzZXF1ZW5jZSBmb3IgZWFjaCBvZiB0aGUgQUMKKwlpZiggKGllZWUtPnBIVEluZm8tPmJDdXJSeFJlb3JkZXJFbmFibGUgPT0gZmFsc2UpIHx8ICFpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlfHwgIUlzRGF0YUZyYW1lKHNrYi0+ZGF0YSkgfHwgSXNMZWdhY3lEYXRhRnJhbWUoc2tiLT5kYXRhKSl7CisJCWlmIChpc19kdXBsaWNhdGVfcGFja2V0KGllZWUsIGhkcikpCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCX0KKwllbHNlCisJeworCQlQUlhfVFNfUkVDT1JEIHBSeFRTID0gTlVMTDsKKwkJCS8vSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBRT1MgRU5BQkxFIEFORCBSRUNFSVZFIFFPUyBEQVRBICwgd2Ugd2lsbCBnZXQgVHMsIHRpZDolZFxuIixfX0ZVTkNUSU9OX18sIHRpZCk7CisJCWlmKEdldFRzKAorCQkJCWllZWUsCisJCQkJKFBUU19DT01NT05fSU5GTyopICZwUnhUUywKKwkJCQloZHItPmFkZHIyLAorCQkJCSh1OClGcmFtZV9Rb1NUSUQoKHU4Kikoc2tiLT5kYXRhKSksCisJCQkJUlhfRElSLAorCQkJCXRydWUpKQorCQl7CisKKwkJLy8JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBwUnhUUy0+UnhMYXN0RnJhZ051bSBpcyAlZCxmcmFnIGlzICVkLHBSeFRTLT5SeExhc3RTZXFOdW0gaXMgJWQsc2VxIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxwUnhUUy0+UnhMYXN0RnJhZ051bSxmcmFnLHBSeFRTLT5SeExhc3RTZXFOdW0sV0xBTl9HRVRfU0VRX1NFUShzYykpOworCQkJaWYoIAkoZmMgJiAoMTw8MTEpKSAgJiYKKwkJCQkJKGZyYWcgPT0gcFJ4VFMtPlJ4TGFzdEZyYWdOdW0pICYmCisJCQkJCShXTEFOX0dFVF9TRVFfU0VRKHNjKSA9PSBwUnhUUy0+UnhMYXN0U2VxTnVtKQkpCisJCQl7CisJCQkJZ290byByeF9kcm9wcGVkOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBSeFRTLT5SeExhc3RGcmFnTnVtID0gZnJhZzsKKwkJCQlwUnhUUy0+UnhMYXN0U2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiVzKCk6IE5vIFRTISEgU2tpcCB0aGUgY2hlY2shIVxuIixfX0ZVTkNUSU9OX18pOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJfQorCWlmICh0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSB7CisKKworCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlpZiAoaWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpKQorCQkJZ290byByeF9kcm9wcGVkOworCQllbHNlCisJCQlnb3RvIHJ4X2V4aXQ7CisJfQorCisJLyogRGF0YSBmcmFtZSAtIGV4dHJhY3Qgc3JjL2RzdCBhZGRyZXNzZXMgKi8KKwlzd2l0Y2ggKGZjICYgKElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFMpKSB7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRkNUTF9UT0RTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTIHwgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJaWYgKHNrYi0+bGVuIDwgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4pCisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgTk9UX1lFVAorCWlmIChob3N0YXBfcnhfZnJhbWVfd2RzKGllZWUsIGhkciwgZmMsICZ3ZHMpKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJaWYgKHdkcykgeworCQlza2ItPmRldiA9IGRldiA9IHdkczsKKwkJc3RhdHMgPSBob3N0YXBfZ2V0X3N0YXRzKGRldik7CisJfQorCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIgJiYgIXdkcyAmJgorCSAgICAoZmMgJiAoSUVFRTgwMjExX0ZDVExfVE9EUyB8IElFRUU4MDIxMV9GQ1RMX0ZST01EUykpID09IElFRUU4MDIxMV9GQ1RMX0ZST01EUyAmJgorCSAgICBpZWVlLT5zdGFkZXYgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjIsIGllZWUtPmFzc29jX2FwX2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIEZyYW1lIGZyb20gQlNTSUQgb2YgdGhlIEFQIGZvciB3aGljaCB3ZSBhcmUgYSBjbGllbnQgKi8KKwkJc2tiLT5kZXYgPSBkZXYgPSBpZWVlLT5zdGFkZXY7CisJCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOworCQlmcm9tX2Fzc29jX2FwID0gMTsKKwl9CisjZW5kaWYKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKyNpZmRlZiBOT1RfWUVUCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSIHx8CisJICAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfUkVQRUFUKSAmJgorCSAgICAhZnJvbV9hc3NvY19hcCkgeworCQlzd2l0Y2ggKGhvc3RhcF9oYW5kbGVfc3RhX3J4KGllZWUsIGRldiwgc2tiLCByeF9zdGF0cywKKwkJCQkJICAgICB3ZHMgIT0gTlVMTCkpIHsKKwkJY2FzZSBBUF9SWF9DT05USU5VRV9OT1RfQVVUSE9SSVpFRDoKKwkJCWZyYW1lX2F1dGhvcml6ZWQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgQVBfUlhfQ09OVElOVUU6CisJCQlmcmFtZV9hdXRob3JpemVkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEFQX1JYX0RST1A6CisJCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJCWNhc2UgQVBfUlhfRVhJVDoKKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCX0KKyNlbmRpZgorCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCS8qIE51bGxmdW5jIGZyYW1lcyBtYXkgaGF2ZSBQUy1iaXQgc2V0LCBzbyB0aGV5IG11c3QgYmUgcGFzc2VkIHRvCisJICogaG9zdGFwX2hhbmRsZV9zdGFfcngoKSBiZWZvcmUgYmVpbmcgZHJvcHBlZCBoZXJlLiAqLworCWlmIChzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQSAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSyAmJgorCSAgICBzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwgJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMJiYKKwkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBLy9hZGQgYnkgRGF2aWQsMjAwNi44LjQKKwkgICAgKSB7CisJCWlmIChzdHlwZSAhPSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpCisJCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCQkiUlg6IGRyb3BwZWQgZGF0YSBmcmFtZSAiCisJCQkJIndpdGggbm8gZGF0YSAodHlwZT0weCUwMngsICIKKwkJCQkic3VidHlwZT0weCUwMngsIGxlbj0lZClcbiIsCisJCQkJdHlwZSwgc3R5cGUsIHNrYi0+bGVuKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKyAgICAgICAgaWYgKG1lbWNtcChic3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikpCisgICAgICAgICAgICAgICAgZ290byByeF9kcm9wcGVkOworCisJLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCwgcG9zc2libHkgZW5jcnlwdGVkKSBwYXlsb2FkICovCisKKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKKwkgICAgKGtleWlkeCA9IGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KGllZWUsIHNrYiwgY3J5cHQpKSA8IDApCisJeworCQlwcmludGsoImRlY3J5cHQgZnJhbWUgZXJyb3JcbiIpOworCQlnb3RvIHJ4X2Ryb3BwZWQ7CisJfQorCisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCisJLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCkgcGxhaW50ZXh0IHBheWxvYWQgKi8KKwkvLyBQUjogRklYTUU6IGhvc3RhcCBoYXMgYWRkaXRpb25hbCBjb25kaXRpb25zIGluIHRoZSAiaWYiIGJlbG93OgorCS8vIGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCisJaWYgKChmcmFnICE9IDAgfHwgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkpIHsKKwkJaW50IGZsZW47CisJCXN0cnVjdCBza19idWZmICpmcmFnX3NrYiA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2dldChpZWVlLCBoZHIpOworCQlJRUVFODAyMTFfREVCVUdfRlJBRygiUnggRnJhZ21lbnQgcmVjZWl2ZWQgKCV1KVxuIiwgZnJhZyk7CisKKwkJaWYgKCFmcmFnX3NrYikgeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCB8IElFRUU4MDIxMV9ETF9GUkFHLAorCQkJCQkiUnggY2Fubm90IGdldCBza2IgZnJvbSBmcmFnbWVudCAiCisJCQkJCSJjYWNoZSAobW9yZWZyYWc9JWQgc2VxPSV1IGZyYWc9JXUpXG4iLAorCQkJCQkoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpICE9IDAsCisJCQkJCVdMQU5fR0VUX1NFUV9TRVEoc2MpLCBmcmFnKTsKKwkJCWdvdG8gcnhfZHJvcHBlZDsKKwkJfQorCQlmbGVuID0gc2tiLT5sZW47CisJCWlmIChmcmFnICE9IDApCisJCQlmbGVuIC09IGhkcmxlbjsKKworCQlpZiAoZnJhZ19za2ItPnRhaWwgKyBmbGVuID4gZnJhZ19za2ItPmVuZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhvc3QgZGVjcnlwdGVkIGFuZCAiCisJCQkgICAgICAgInJlYXNzZW1ibGVkIGZyYW1lIGRpZCBub3QgZml0IHNrYlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisKKwkJaWYgKGZyYWcgPT0gMCkgeworCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bworCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50CisJCQkgKiBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAorCQkJICAgICAgIGZsZW4pOworCQl9CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IE5VTEw7CisKKwkJaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSB7CisJCQkvKiBtb3JlIGZyYWdtZW50cyBleHBlY3RlZCAtIGxlYXZlIHRoZSBza2IgaW4gZnJhZ21lbnQKKwkJCSAqIGNhY2hlIGZvciBub3c7IGl0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHVwcGVyIGxheWVycworCQkJICogYWZ0ZXIgYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCisJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IGFuZCB0aGUgZnJhbWUgd2lsbCBiZQorCQkgKiBkZWxpdmVyZWQsIHNvIHJlbW92ZSBza2IgZnJvbSBmcmFnbWVudCBjYWNoZSAqLworCQlza2IgPSBmcmFnX3NrYjsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwkJaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOworCX0KKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIE1TRFUgcGF5bG9hZDsgcG9zc2libHkgc3RpbGwKKwkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZCAqLworCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCSAgICBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGllZWUsIHNrYiwga2V5aWR4LCBjcnlwdCkpCisJeworCQlwcmludGsoIj09PmRlY3J5cHQgbXNkdSBlcnJvclxuIik7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwkvL2FkZGVkIGJ5IGFteSBmb3IgQVAgcm9hbWluZworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2QrKzsKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QrKzsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmICFpZWVlLT5vcGVuX3dlcCkgeworCQlpZiAoLyppZWVlLT5pZWVlODAyXzF4ICYmKi8KKwkJICAgIGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCS8qIHBhc3MgdW5lbmNyeXB0ZWQgRUFQT0wgZnJhbWVzIGV2ZW4gaWYgZW5jcnlwdGlvbiBpcworCQkJICogY29uZmlndXJlZCAqLworCQkJc3RydWN0IGVhcG9sICplYXAgPSAoc3RydWN0IGVhcG9sICopKHNrYi0+ZGF0YSArCisJCQkJMjQpOworCQkJSUVFRTgwMjExX0RFQlVHX0VBUCgiUlg6IElFRUUgODAyLjFYIEVBUE9MIGZyYW1lOiAlc1xuIiwKKwkJCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCisJCQkJImVuY3J5cHRpb24gY29uZmlndXJlZCwgYnV0IFJYICIKKwkJCQkiZnJhbWUgbm90IGVuY3J5cHRlZCAoU0E9IiBNQUNfRk1UICIpXG4iLAorCQkJCU1BQ19BUkcoaGRyLT5hZGRyMikpOworCQkJZ290byByeF9kcm9wcGVkOworCQl9CisJfQorCisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgorCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQkyNCk7CisJCQlJRUVFODAyMTFfREVCVUdfRUFQKCJSWDogSUVFRSA4MDIuMVggRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCQkJZWFwX2dldF90eXBlKGVhcC0+dHlwZSkpOworCX0KKyNlbmRpZgorCisJaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmICFpZWVlLT5vcGVuX3dlcCAmJgorCSAgICAhaWVlZTgwMjExX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCQlJRUVFODAyMTFfREVCVUdfRFJPUCgKKwkJCSJkcm9wcGVkIHVuZW5jcnlwdGVkIFJYIGRhdGEgIgorCQkJImZyYW1lIGZyb20gIiBNQUNfRk1UCisJCQkiIChkcm9wX3VuZW5jcnlwdGVkPTEpXG4iLAorCQkJTUFDX0FSRyhoZHItPmFkZHIyKSk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisvKgorCWlmKGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUlg6IElFRUU4MDIuMVggRVBBT0wgZnJhbWUhXG4iKTsKKwl9CisqLworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlICYmIElzUW9TRGF0YUZyYW1lKHNrYi0+ZGF0YSkKKwkJJiYgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpICYmICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKKwl7CisJCVRJRCA9IEZyYW1lX1FvU1RJRChza2ItPmRhdGEpOworCQlTZXFOdW0gPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwkJR2V0VHMoaWVlZSwoUFRTX0NPTU1PTl9JTkZPKikgJnBUUyxoZHItPmFkZHIyLFRJRCxSWF9ESVIsdHJ1ZSk7CisJCWlmKFRJRCAhPTAgJiYgVElEICE9MykKKwkJeworCQkJaWVlZS0+YmlzX2FueV9ub25iZXBrdHMgPSB0cnVlOworCQl9CisJfQorLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKwkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLworCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJLy9ldGhlcnR5cGUgPSAocGF5bG9hZFs2XSA8PCA4KSB8IHBheWxvYWRbN107CisJcnhiID0gKHN0cnVjdCBpZWVlODAyMTFfcnhiKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4YiksR0ZQX0FUT01JQyk7CisJaWYocnhiID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwiJXMoKToga21hbGxvYyByeGIgZXJyb3JcbiIsX19GVU5DVElPTl9fKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKwkvKiB0byBwYXJzZSBhbXNkdSBwYWNrZXRzICovCisJLyogcW9zIGRhdGEgcGFja2V0cyAmIHJlc2VydmVkIGJpdCBpcyAxICovCisJaWYocGFyc2Vfc3ViZnJhbWUoc2tiLHJ4X3N0YXRzLHJ4YixzcmMsZHN0KSA9PSAwKSB7CisJCS8qIG9ubHkgdG8gZnJlZSByeGIsIGFuZCBub3Qgc3VibWl0IHRoZSBwYWNrZXRzIHRvIHVwcGVyIGxheWVyICovCisJCWZvcihpID0wOyBpIDwgcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgeworCQkJZGV2X2tmcmVlX3NrYihyeGItPnN1YmZyYW1lc1tpXSk7CisJCX0KKwkJa2ZyZWUocnhiKTsKKwkJcnhiID0gTlVMTDsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VyUnhSZW9yZGVyRW5hYmxlID09IGZhbHNlIHx8cFRTID09IE5VTEwpeworLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKKwkJZm9yKGkgPSAwOyBpPHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpzdWJfc2tiID0gcnhiLT5zdWJmcmFtZXNbaV07CisKKwkJCWlmIChzdWJfc2tiKSB7CisJCQkJLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLworCQkJCWV0aGVydHlwZSA9IChzdWJfc2tiLT5kYXRhWzZdIDw8IDgpIHwgc3ViX3NrYi0+ZGF0YVs3XTsKKwkJCQlpZiAoc3ViX3NrYi0+bGVuID49IDggJiYKKwkJCQkJCSgobWVtY21wKHN1Yl9za2ItPmRhdGEsIHJmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpID09IDAgJiYKKwkJCQkJCSAgZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKKwkJCQkJCSBtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKKwkJCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAorCQkJCQkgKiByZXBsYWNlIEV0aGVyVHlwZSAqLworCQkJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOworCQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKKwkJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdTE2IGxlbjsKKwkJCQkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KKwkJCQkJbGVuID0gaHRvbnMoc3ViX3NrYi0+bGVuKTsKKwkJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIDIpLCAmbGVuLCAyKTsKKwkJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgc3JjLCBFVEhfQUxFTik7CisJCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCQkJCX0KKworCQkJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHN1Yl9za2ItPmxlbjsKKwkJCQlpZihpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkc3QpKSB7CisJCQkJCXN0YXRzLT5tdWx0aWNhc3QrKzsKKwkJCQl9CisKKwkJCQkvKiBJbmRpY2F0IHRoZSBwYWNrZXRzIHRvIHVwcGVyIGxheWVyICovCisJCQkJLy9wcmludGsoIjBza2JfbGVuKCVkKVxuIiwgc2tiLT5sZW4pOworCQkJCXN1Yl9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc3ViX3NrYiwgZGV2KTsKKwkJCQltZW1zZXQoc3ViX3NrYi0+Y2IsIDAsIHNpemVvZihzdWJfc2tiLT5jYikpOworCQkJCXN1Yl9za2ItPmRldiA9IGRldjsKKwkJCQlzdWJfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCQkJLy9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOyAvKiA4MDIuMTEgY3JjIG5vdCBzdWZmaWNpZW50ICovCisJCQkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKKwkJCQkvL3ByaW50aygiMXNrYl9sZW4oJWQpXG4iLCBza2ItPmxlbik7CisJCQkJbmV0aWZfcngoc3ViX3NrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUocnhiKTsKKwkJcnhiID0gTlVMTDsKKworCX0KKwllbHNlCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IFJFT1JERVIgRU5BQkxFIEFORCBQVFMgbm90IE5VTEwsIGFuZCB3ZSB3aWxsIGVudGVyIFJ4UmVvcmRlckluZGljYXRlUGFja2V0KClcbiIsX19GVU5DVElPTl9fKTsKKwkJUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoaWVlZSwgcnhiLCBwVFMsIFNlcU51bSk7CisJfQorI2lmbmRlZiBKT0hOX05PQ1BZCisJZGV2X2tmcmVlX3NrYihza2IpOworI2VuZGlmCisKKyByeF9leGl0OgorI2lmZGVmIE5PVF9ZRVQKKwlpZiAoc3RhKQorCQlob3N0YXBfaGFuZGxlX3N0YV9yZWxlYXNlKHN0YSk7CisjZW5kaWYKKwlyZXR1cm4gMTsKKworIHJ4X2Ryb3BwZWQ6CisJaWYgKHJ4YiAhPSBOVUxMKQorCXsKKwkJa2ZyZWUocnhiKTsKKwkJcnhiID0gTlVMTDsKKwl9CisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKworCS8qIFJldHVybmluZyAwIGluZGljYXRlcyB0byBjYWxsZXIgdGhhdCB3ZSBoYXZlIG5vdCBoYW5kbGVkIHRoZSBTS0ItLQorCSAqIHNvIGl0IGlzIHN0aWxsIGFsbG9jYXRlZCBhbmQgY2FuIGJlIHVzZWQgYWdhaW4gYnkgdW5kZXJseWluZworCSAqIGhhcmR3YXJlIGFzIGEgRE1BIHRhcmdldCAqLworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1HTVRfRlJBTUVfRklYRURfUEFSVF9MRU5HVEggICAgICAgICAgICAweDI0CisKK3N0YXRpYyB1OCBxb3Nfb3VpW1FPU19PVUlfTEVOXSA9IHsgMHgwMCwgMHg1MCwgMHhGMiB9OworCisvKgorKiBNYWtlIHRoZXIgc3RydWN0dXJlIHdlIHJlYWQgZnJvbSB0aGUgYmVhY29uIHBhY2tldCBoYXMKKyogdGhlIHJpZ2h0IHZhbHVlcworKi8KK3N0YXRpYyBpbnQgaWVlZTgwMjExX3ZlcmlmeV9xb3NfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm9fZWxlbWVudCwgaW50IHN1Yl90eXBlKQoreworCisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPnF1aV9zdWJ0eXBlICE9IHN1Yl90eXBlKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG1lbWNtcChpbmZvX2VsZW1lbnQtPnF1aSwgcW9zX291aSwgUU9TX09VSV9MRU4pKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGluZm9fZWxlbWVudC0+cXVpX3R5cGUgIT0gUU9TX09VSV9UWVBFKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGluZm9fZWxlbWVudC0+dmVyc2lvbiAhPSBRT1NfVkVSU0lPTl8xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworCisvKgorICogUGFyc2UgYSBRb1MgcGFyYW1ldGVyIGVsZW1lbnQKKyAqLworc3RhdGljIGludCBpZWVlODAyMTFfcmVhZF9xb3NfcGFyYW1fZWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZWxlbWVudF9wYXJhbSwgc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluZm9fZWxlbWVudCkKK3sKKyAgICAgICAgaW50IHJldCA9IDA7CisgICAgICAgIHUxNiBzaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvKSAtIDI7CisKKyAgICAgICAgaWYgKChpbmZvX2VsZW1lbnQgPT0gTlVMTCkgfHwgKGVsZW1lbnRfcGFyYW0gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQtPmlkID09IFFPU19FTEVNRU5UX0lEICYmIGluZm9fZWxlbWVudC0+bGVuID09IHNpemUpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZWxlbWVudF9wYXJhbS0+aW5mb19lbGVtZW50LnF1aSwgaW5mb19lbGVtZW50LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisgICAgICAgICAgICAgICAgZWxlbWVudF9wYXJhbS0+aW5mb19lbGVtZW50LmVsZW1lbnRJRCA9IGluZm9fZWxlbWVudC0+aWQ7CisgICAgICAgICAgICAgICAgZWxlbWVudF9wYXJhbS0+aW5mb19lbGVtZW50Lmxlbmd0aCA9IGluZm9fZWxlbWVudC0+bGVuOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IGllZWU4MDIxMV92ZXJpZnlfcW9zX2luZm8oJmVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPU19PVUlfUEFSQU1fU1VCX1RZUEUpOworICAgICAgICByZXR1cm4gcmV0OworfQorCisvKgorICogUGFyc2UgYSBRb1MgaW5mb3JtYXRpb24gZWxlbWVudAorICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9yZWFkX3Fvc19pbmZvX2VsZW1lbnQoc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmVsZW1lbnRfaW5mbywgc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mb19lbGVtZW50KQoreworICAgICAgICBpbnQgcmV0ID0gMDsKKyAgICAgICAgdTE2IHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCkgLSAyOworCisgICAgICAgIGlmIChlbGVtZW50X2luZm8gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpbmZvX2VsZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgaWYgKChpbmZvX2VsZW1lbnQtPmlkID09IFFPU19FTEVNRU5UX0lEKSAmJiAoaW5mb19lbGVtZW50LT5sZW4gPT0gc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZWxlbWVudF9pbmZvLT5xdWksIGluZm9fZWxlbWVudC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5sZW4pOworICAgICAgICAgICAgICAgIGVsZW1lbnRfaW5mby0+ZWxlbWVudElEID0gaW5mb19lbGVtZW50LT5pZDsKKyAgICAgICAgICAgICAgICBlbGVtZW50X2luZm8tPmxlbmd0aCA9IGluZm9fZWxlbWVudC0+bGVuOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKworICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gaWVlZTgwMjExX3ZlcmlmeV9xb3NfaW5mbyhlbGVtZW50X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRT1NfT1VJX0lORk9fU1VCX1RZUEUpOworICAgICAgICByZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBXcml0ZSBRb1MgcGFyYW1ldGVycyBmcm9tIHRoZSBhYyBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgaW50IGllZWU4MDIxMV9xb3NfY29udmVydF9hY190b19wYXJhbWV0ZXJzKHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbV9lbG0sIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnFvc19wYXJhbSkKK3sKKyAgICAgICAgaW50IHJjID0gMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciAqYWNfcGFyYW1zOworCXU4IGFjaTsKKyAgICAgICAgLy91OCBjd19taW47CisgICAgICAgIC8vdTggY3dfbWF4OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBRT1NfUVVFVUVfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhY19wYXJhbXMgPSAmKHBhcmFtX2VsbS0+YWNfcGFyYW1zX3JlY29yZFtpXSk7CisKKwkJYWNpID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuICYgMHg2MCkgPj4gNTsKKworCQlpZihhY2kgPj0gUU9TX1FVRVVFX05VTSkKKwkJCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+YWlmc1thY2ldID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuKSAmIDB4MGY7CisKKwkJLyogV01NIHNwZWMgUC4xMTogVGhlIG1pbmltdW0gdmFsdWUgZm9yIEFJRlNOIHNoYWxsIGJlIDIgKi8KKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmFpZnNbYWNpXSA9IChxb3NfcGFyYW0tPmFpZnNbYWNpXSA8IDIpID8gMjpxb3NfcGFyYW0tPmFpZnNbYWNpXTsKKworICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+Y3dfbWluW2FjaV0gPSBhY19wYXJhbXMtPmVjd19taW5fbWF4ICYgMHgwRjsKKworICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+Y3dfbWF4W2FjaV0gPSAoYWNfcGFyYW1zLT5lY3dfbWluX21heCAmIDB4RjApID4+IDQ7CisKKyAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmZsYWdbYWNpXSA9CisgICAgICAgICAgICAgICAgICAgIChhY19wYXJhbXMtPmFjaV9haWZzbiAmIDB4MTApID8gMHgwMSA6IDB4MDA7CisgICAgICAgICAgICAgICAgcW9zX3BhcmFtLT50eF9vcF9saW1pdFthY2ldID0gbGUxNl90b19jcHUoYWNfcGFyYW1zLT50eF9vcF9saW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKgorICogd2UgaGF2ZSBhIGdlbmVyaWMgZGF0YSBlbGVtZW50IHdoaWNoIGl0IG1heSBjb250YWluIFFvUyBpbmZvcm1hdGlvbiBvcgorICogcGFyYW1ldGVycyBlbGVtZW50LiBjaGVjayB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBsZW5ndGggdG8gZGVjaWRlCisgKiB3aGljaCB0eXBlIHRvIHJlYWQKKyAqLworc3RhdGljIGludCBpZWVlODAyMTFfcGFyc2VfcW9zX2luZm9fcGFyYW1fSUUoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisgICAgICAgIGludCByYyA9IDA7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgKnFvc19wYXJhbSA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgcW9zX2luZm9fZWxlbWVudDsKKworICAgICAgICByYyA9IGllZWU4MDIxMV9yZWFkX3Fvc19pbmZvX2VsZW1lbnQoJnFvc19pbmZvX2VsZW1lbnQsIGluZm9fZWxlbWVudCk7CisKKyAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IHFvc19pbmZvX2VsZW1lbnQuYWNfaW5mbyAmIDB4MEY7CisgICAgICAgICAgICAgICAgbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvIHBhcmFtX2VsZW1lbnQ7CisKKyAgICAgICAgICAgICAgICByYyA9IGllZWU4MDIxMV9yZWFkX3Fvc19wYXJhbV9lbGVtZW50KCZwYXJhbV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50KTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcW9zX3BhcmFtID0gJihuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9xb3NfY29udmVydF9hY190b19wYXJhbWV0ZXJzKCZwYXJhbV9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zX3BhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTOworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2VsZW1lbnQuaW5mb19lbGVtZW50LmFjX2luZm8gJiAweDBGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1FPUygiUW9TIGlzIHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisjZGVmaW5lIE1GSUVfU1RSSU5HKHgpIGNhc2UgTUZJRV9UWVBFXyAjI3g6IHJldHVybiAjeAorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2luZm9fZWxlbWVudF9zdHJpbmcodTE2IGlkKQoreworICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoU1NJRCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUkFURVMpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEZIX1NFVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoRFNfU0VUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhDRl9TRVQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFRJTSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoSUJTU19TRVQpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKENPVU5UUlkpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEhPUF9QQVJBTVMpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEhPUF9UQUJMRSk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoQ0hBTExFTkdFKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhQT1dFUl9DT05TVFJBSU5UKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhQT1dFUl9DQVBBQklMSVRZKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhUUENfUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoVFBDX1JFUE9SVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoU1VQUF9DSEFOTkVMUyk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoQ1NBKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhNRUFTVVJFX1JFUVVFU1QpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKE1FQVNVUkVfUkVQT1JUKTsKKyAgICAgICAgICAgICAgICBNRklFX1NUUklORyhRVUlFVCk7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoSUJTU19ERlMpOworICAgICAgICAgICAgICAgLy8gTUZJRV9TVFJJTkcoRVJQX0lORk8pOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJTTik7CisgICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUkFURVNfRVgpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEdFTkVSSUMpOworICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFFPU19QQVJBTUVURVIpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgIH0KK30KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJdTggKiBhZGRyMgorKQoreworCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJeworCQlpZihpbmZvX2VsZW1lbnQtPmxlbiE9IDApCisJCXsKKwkJCW1lbWNweShuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pOworCQkJbmV0d29yay0+Q291bnRyeUllTGVuID0gaW5mb19lbGVtZW50LT5sZW47CisKKwkJCWlmKCFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQkJeworCQkJCURvdDExZF9VcGRhdGVDb3VudHJ5SWUoaWVlZSwgYWRkcjIsIGluZm9fZWxlbWVudC0+bGVuLCBpbmZvX2VsZW1lbnQtPmRhdGEpOworCQkJfQorCQl9CisKKwkJLy8KKwkJLy8gMDcwMzA1LCByY25qa286IEkgdXBkYXRlIGNvdW50cnkgSUUgd2F0Y2ggZG9nIGhlcmUgYmVjYXVzZQorCQkvLyBzb21lIEFQIChlLmcuIENpc2NvIDEyNDIpIGRvbid0IGluY2x1ZGUgY291bnRyeSBJRSBpbiB0aGVpcgorCQkvLyBwcm9iZSByZXNwb25zZSBmcmFtZS4KKwkJLy8KKwkJaWYoSVNfRVFVQUxfQ0lFX1NSQyhpZWVlLCBhZGRyMikgKQorCQl7CisJCQlVUERBVEVfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorCit9CisjZW5kaWYKKworaW50IGllZWU4MDIxMV9wYXJzZV9pbmZvX3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LAorCQl1MTYgbGVuZ3RoLAorCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworCXU4IGk7CisJc2hvcnQgb2Zmc2V0OworICAgICAgICB1MTYJdG1wX2h0Y2FwX2xlbj0wOworCXUxNgl0bXBfaHRpbmZvX2xlbj0wOworCXUxNiBodF9yZWFsdGVrX2FnZ19sZW49MDsKKwl1OCAgaHRfcmVhbHRla19hZ2dfYnVmW01BWF9JRV9MRU5dOworLy8JdTE2IGJyb2FkY29tX2xlbiA9IDA7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCWNoYXIgcmF0ZXNfc3RyWzY0XTsKKwljaGFyICpwOworI2VuZGlmCisKKwl3aGlsZSAobGVuZ3RoID49IHNpemVvZigqaW5mb19lbGVtZW50KSkgeworCQlpZiAoc2l6ZW9mKCppbmZvX2VsZW1lbnQpICsgaW5mb19lbGVtZW50LT5sZW4gPiBsZW5ndGgpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJJbmZvIGVsZW06IHBhcnNlIGZhaWxlZDogIgorCQkJCQkgICAgICJpbmZvX2VsZW1lbnQtPmxlbiArIDIgPiBsZWZ0IDogIgorCQkJCQkgICAgICJpbmZvX2VsZW1lbnQtPmxlbisyPSV6ZCBsZWZ0PSVkLCBpZD0lZC5cbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4gKworCQkJCQkgICAgIHNpemVvZigqaW5mb19lbGVtZW50KSwKKwkJCQkJICAgICBsZW5ndGgsIGluZm9fZWxlbWVudC0+aWQpOworCQkJLyogV2Ugc3RvcCBwcm9jZXNzaW5nIGJ1dCBkb24ndCByZXR1cm4gYW4gZXJyb3IgaGVyZQorCQkJICogYmVjYXVzZSBzb21lIG1pc2JlaGF2aW91ciBBUHMgYnJlYWsgdGhpcyBydWxlLiBpZS4KKwkJCSAqIE9yaW5vY28gQVAxMDAwLiAqLworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKGluZm9fZWxlbWVudC0+aWQpIHsKKwkJY2FzZSBNRklFX1RZUEVfU1NJRDoKKwkJCWlmIChpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLAorCQkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbikpIHsKKwkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0VNUFRZX0VTU0lEOworCQkJCWJyZWFrOworCQkJfQorCisJCQluZXR3b3JrLT5zc2lkX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwKKwkJCQkJCSh1OCkgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJbWVtY3B5KG5ldHdvcmstPnNzaWQsIGluZm9fZWxlbWVudC0+ZGF0YSwgbmV0d29yay0+c3NpZF9sZW4pOworCQkJaWYgKG5ldHdvcmstPnNzaWRfbGVuIDwgSVdfRVNTSURfTUFYX1NJWkUpCisJCQkJbWVtc2V0KG5ldHdvcmstPnNzaWQgKyBuZXR3b3JrLT5zc2lkX2xlbiwgMCwKKwkJCQkgICAgICAgSVdfRVNTSURfTUFYX1NJWkUgLSBuZXR3b3JrLT5zc2lkX2xlbik7CisKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfU1NJRDogJyVzJyBsZW49JWQuXG4iLAorCQkJCQkgICAgIG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JBVEVTOgorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCXAgPSByYXRlc19zdHI7CisjZW5kaWYKKwkJCW5ldHdvcmstPnJhdGVzX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwKKwkJCQkJCSBNQVhfUkFURVNfTEVOR1RIKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47IGkrKykgeworCQkJCW5ldHdvcmstPnJhdGVzW2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0KKwkJCQkJICAgICAgKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLAorCQkJCQkgICAgICBuZXR3b3JrLT5yYXRlc1tpXSk7CisjZW5kaWYKKwkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZQorCQkJCSAgICAoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgeworCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOworCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKKwkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCisJCQkJCQluZXR3b3JrLT5mbGFncyAmPQorCQkJCQkJICAgIH5ORVRXT1JLX0hBU19DQ0s7CisJCQkJfQorCQkJfQorCisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JBVEVTOiAnJXMnICglZClcbiIsCisJCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUkFURVNfRVg6CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJcCA9IHJhdGVzX3N0cjsKKyNlbmRpZgorCQkJbmV0d29yay0+cmF0ZXNfZXhfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLAorCQkJCQkJICAgIE1BWF9SQVRFU19FWF9MRU5HVEgpOworCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbjsgaSsrKSB7CisJCQkJbmV0d29yay0+cmF0ZXNfZXhbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCQkJCXAgKz0gc25wcmludGYocCwgc2l6ZW9mKHJhdGVzX3N0cikgLQorCQkJCQkgICAgICAocCAtIHJhdGVzX3N0ciksICIlMDJYICIsCisJCQkJCSAgICAgIG5ldHdvcmstPnJhdGVzW2ldKTsKKyNlbmRpZgorCQkJCWlmIChpZWVlODAyMTFfaXNfb2ZkbV9yYXRlCisJCQkJICAgIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX09GRE07CisJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0gJgorCQkJCQkgICAgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykKKwkJCQkJCW5ldHdvcmstPmZsYWdzICY9CisJCQkJCQkgICAgfk5FVFdPUktfSEFTX0NDSzsKKwkJCQl9CisJCQl9CisKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfUkFURVNfRVg6ICclcycgKCVkKVxuIiwKKwkJCQkJICAgICByYXRlc19zdHIsIG5ldHdvcmstPnJhdGVzX2V4X2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9EU19TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0RTX1NFVDogJWRcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdKTsKKwkJCW5ldHdvcmstPmNoYW5uZWwgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9GSF9TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0ZIX1NFVDogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9DRl9TRVQ6CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0NGX1NFVDogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9USU06CisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA8IDQpCisJCQkJYnJlYWs7CisKKwkJCW5ldHdvcmstPnRpbS50aW1fY291bnQgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CisJCQluZXR3b3JrLT50aW0udGltX3BlcmlvZCA9IGluZm9fZWxlbWVudC0+ZGF0YVsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9wZXJpb2QgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gc3RhdHMtPm1hY190aW1lWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzFdID0gc3RhdHMtPm1hY190aW1lWzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5kdGltX2RhdGEgPSBJRUVFODAyMTFfRFRJTV9WQUxJRDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb19lbGVtZW50LT5kYXRhWzBdICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmZvX2VsZW1lbnQtPmRhdGFbMl0gJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLT5kdGltX2RhdGEgfD0gSUVFRTgwMjExX0RUSU1fTUJDQVNUOworCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaW5mb19lbGVtZW50LT5kYXRhWzJdID4+IDEpKjI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJvZmZzZXQxOiV4IGFpZDoleFxuIixvZmZzZXQsIGllZWUtPmFzc29jX2lkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWVlZS0+YXNzb2NfaWQgPCA4Km9mZnNldCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlLT5hc3NvY19pZCA+IDgqKG9mZnNldCArIGluZm9fZWxlbWVudC0+bGVuIC0zKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGllZWUtPmFzc29jX2lkIC8gOCkgLSBvZmZzZXQ7Ly8gKyAoKGFpZCAlIDgpPyAwIDogMSkgOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmZvX2VsZW1lbnQtPmRhdGFbMytvZmZzZXRdICYgKDE8PChpZWVlLT5hc3NvY19pZCU4KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmR0aW1fZGF0YSB8PSBJRUVFODAyMTFfRFRJTV9VQ0FTVDsKKworCQkJLy9JRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1RJTTogcGFydGlhbGx5IGlnbm9yZWRcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRVJQOgorCQkJbmV0d29yay0+ZXJwX3ZhbHVlID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfRVJQX1ZBTFVFOworCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9FUlBfU0VUOiAlZFxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5lcnBfdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgTUZJRV9UWVBFX0lCU1NfU0VUOgorCQkJbmV0d29yay0+YXRpbV93aW5kb3cgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0lCU1NfU0VUOiAlZFxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5hdGltX3dpbmRvdyk7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9DSEFMTEVOR0U6CisJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0NIQUxMRU5HRTogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9HRU5FUklDOgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9HRU5FUklDOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQlpZiAoIWllZWU4MDIxMV9wYXJzZV9xb3NfaW5mb19wYXJhbV9JRShpbmZvX2VsZW1lbnQsCisJCQkJCQkJICAgICAgIG5ldHdvcmspKQorCQkJCWJyZWFrOworCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gNCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAxKSB7CisJCQkJbmV0d29yay0+d3BhX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCisJCQkJCQkJICBNQVhfV1BBX0lFX0xFTik7CisJCQkJbWVtY3B5KG5ldHdvcmstPndwYV9pZSwgaW5mb19lbGVtZW50LAorCQkJCSAgICAgICBuZXR3b3JrLT53cGFfaWVfbGVuKTsKKwkJCQlicmVhazsKKwkJCX0KKworI2lmZGVmIFRIT01BU19UVVJCTworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9fZWxlbWVudC0+bGVuID09IDcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweGUwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YVs0XSA9PSAweDAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgSFRjYXAgYW5kIEhUaW5mbyBwYXJhbWV0ZXJzCisJCQlpZih0bXBfaHRjYXBfbGVuID09IDApeworCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDkwICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKKwkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMzMpeworCisJCQkJCQl0bXBfaHRjYXBfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCh1OClNQVhfSUVfTEVOKTsKKwkJCQkgICAJCWlmKHRtcF9odGNhcF9sZW4gIT0gMCl7CisJCQkJICAgCQkJbmV0d29yay0+YnNzaHQuYmRIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9FV0M7CisJCQkJCQkJbmV0d29yay0+YnNzaHQuYmRIVENhcExlbiA9IHRtcF9odGNhcF9sZW4gPiBzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1Zik/XAorCQkJCQkJCQlzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1Zik6dG1wX2h0Y2FwX2xlbjsKKwkJCQkJCQltZW1jcHkobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZixpbmZvX2VsZW1lbnQtPmRhdGEsbmV0d29yay0+YnNzaHQuYmRIVENhcExlbik7CisJCQkJICAgCQl9CisJCQkJfQorCQkJCWlmKHRtcF9odGNhcF9sZW4gIT0gMCkKKwkJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSBmYWxzZTsKKwkJCX0KKworCisJCQlpZih0bXBfaHRpbmZvX2xlbiA9PSAwKXsKKwkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJICAgCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDkwICYmCisJCQkJICAgCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkJICAgCWluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzNCl7CisKKwkJCQkJCXRtcF9odGluZm9fbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCh1OClNQVhfSUVfTEVOKTsKKwkJCQkJCWlmKHRtcF9odGluZm9fbGVuICE9IDApeworCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOworCQkJCQkJCWlmKHRtcF9odGluZm9fbGVuKXsKKwkJCQkJCQkJbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPSB0bXBfaHRpbmZvX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik/XAorCQkJCQkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmKTp0bXBfaHRpbmZvX2xlbjsKKwkJCQkJCQkJbWVtY3B5KG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmLGluZm9fZWxlbWVudC0+ZGF0YSxuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbik7CisJCQkJCQkJfQorCisJCQkJCQl9CisKKwkJCQl9CisJCQl9CisKKwkJCWlmKGllZWUtPmFnZ3JlZ2F0aW9uKXsKKwkJCQlpZihuZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCl7CisJCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgorCQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKKwkJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyKXsKKworCQkJCQkJaHRfcmVhbHRla19hZ2dfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCh1OClNQVhfSUVfTEVOKTsKKwkJCQkJCW1lbWNweShodF9yZWFsdGVrX2FnZ19idWYsaW5mb19lbGVtZW50LT5kYXRhLGluZm9fZWxlbWVudC0+bGVuKTsKKworCQkJCQl9CisJCQkJCWlmKGh0X3JlYWx0ZWtfYWdnX2xlbiA+PSA1KXsKKwkJCQkJCW5ldHdvcmstPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbiA9IHRydWU7CisKKwkJCQkJCWlmKChodF9yZWFsdGVrX2FnZ19idWZbNF0gPT0gMSkgJiYgKGh0X3JlYWx0ZWtfYWdnX2J1Zls1XSAmIDB4MDIpKQorCQkJCQkJbmV0d29yay0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZSA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKworCQkJLy9pZih0bXBfaHRjYXBfbGVuICE9MCAgfHwgIHRtcF9odGluZm9fbGVuICE9IDApCisJCQl7CisJCQkJaWYoKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgwNSAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4YjUpIHx8CisJCQkJCSAoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDBhICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmNykgfHwKKwkJCQkJIChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MTAgJiYKKwkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDE4KSl7CisKKwkJCQkJCW5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCA9IHRydWU7CisKKwkJCQl9CisJCQl9CisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgwYyAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDQzKQorCQkJeworCQkJCW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJCW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgPSBmYWxzZTsKKwkJCS8vYWRkZWQgYnkgYW15IGZvciBhdGhlcm9zIEFQCisJCQlpZigoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MDMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg3ZikgfHwKKwkJCQkoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MTMgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg3NCkpCisJCQl7CisJCQkJcHJpbnRrKCI9PT09PT09PT4lcygpOiBhdGhyb3MgQVAgaXMgZXhpc3RcbiIsX19GVU5DVElPTl9fKTsKKwkJCQluZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCA9IHRydWU7CisJCQl9CisJCQllbHNlCisJCQkJbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgPSBmYWxzZTsKKworCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NikKKwkJCXsKKwkJCQluZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJCW5ldHdvcmstPmNpc2NvX2NhcF9leGlzdCA9IGZhbHNlOworCQkJLy9hZGRlZCBieSBhbXkgZm9yIExFQVAgb2YgY2lzY28KKwkJCWlmKGluZm9fZWxlbWVudC0+bGVuID4gNCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NiAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAxKQorCQkJeworCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID09IDYpCisJCQkJeworCQkJCQltZW1jcHkobmV0d29yay0+Q2N4Um1TdGF0ZSwgJmluZm9fZWxlbWVudFs0XSwgMik7CisJCQkJCWlmKG5ldHdvcmstPkNjeFJtU3RhdGVbMF0gIT0gMCkKKwkJCQkJeworCQkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQluZXR3b3JrLT5iQ2N4Um1FbmFibGUgPSBmYWxzZTsKKwkJCQkJLy8KKwkJCQkJLy8gQ0NYdjQgVGFibGUgNTktMSBNQlNTSUQgTWFza3MuCisJCQkJCS8vCisJCQkJCW5ldHdvcmstPk1Cc3NpZE1hc2sgPSBuZXR3b3JrLT5DY3hSbVN0YXRlWzFdICYgMHgwNzsKKwkJCQkJaWYobmV0d29yay0+TUJzc2lkTWFzayAhPSAwKQorCQkJCQl7CisJCQkJCQluZXR3b3JrLT5iTUJzc2lkVmFsaWQgPSB0cnVlOworCQkJCQkJbmV0d29yay0+TUJzc2lkTWFzayA9IDB4ZmYgPDwgKG5ldHdvcmstPk1Cc3NpZE1hc2spOworCQkJCQkJY3BNYWNBZGRyKG5ldHdvcmstPk1Cc3NpZCwgbmV0d29yay0+YnNzaWQpOworCQkJCQkJbmV0d29yay0+TUJzc2lkWzVdICY9IG5ldHdvcmstPk1Cc3NpZE1hc2s7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQluZXR3b3JrLT5iTUJzc2lkVmFsaWQgPSBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXR3b3JrLT5iQ2N4Um1FbmFibGUgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+IDQgICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg0MCAmJgorCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDk2ICYmCisJCQkJaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDMpCisJCQl7CisJCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPT0gNSkKKwkJCQl7CisJCQkJCW5ldHdvcmstPmJXaXRoQ2N4VmVyTnVtID0gdHJ1ZTsKKwkJCQkJbmV0d29yay0+QnNzQ2N4VmVyTnVtYmVyID0gaW5mb19lbGVtZW50LT5kYXRhWzRdOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXR3b3JrLT5iV2l0aENjeFZlck51bSA9IGZhbHNlOworCQkJCQluZXR3b3JrLT5Cc3NDY3hWZXJOdW1iZXIgPSAwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1JTTjoKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfUlNOOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQluZXR3b3JrLT5yc25faWVfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuICsgMiwKKwkJCQkJCSAgTUFYX1dQQV9JRV9MRU4pOworCQkJbWVtY3B5KG5ldHdvcmstPnJzbl9pZSwgaW5mb19lbGVtZW50LAorCQkJICAgICAgIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vSFQgcmVsYXRlZCBlbGVtZW50LgorCQljYXNlIE1GSUVfVFlQRV9IVF9DQVA6CisJCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0hUX0NBUDogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJdG1wX2h0Y2FwX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwodTgpTUFYX0lFX0xFTik7CisJCQlpZih0bXBfaHRjYXBfbGVuICE9IDApeworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPSB0bXBfaHRjYXBfbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpP1wKKwkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpOnRtcF9odGNhcF9sZW47CisJCQkJbWVtY3B5KG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsaW5mb19lbGVtZW50LT5kYXRhLG5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCisJCQkJLy9JZiBwZWVyIGlzIEhULCBidXQgbm90IFdNTSwgY2FsbCBRb3NTZXRMZWdhY3lXTU1QYXJhbVdpdGhIVCgpCisJCQkJLy8gd2luZG93cyBkcml2ZXIgd2lsbCB1cGRhdGUgV01NIHBhcmFtZXRlcnMgZWFjaCBiZWFjb24gcmVjZWl2ZWQgb25jZSBjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGludXggZHJpdmVyIGlzIGEgYml0IGRpZmZlcmVudC4KKwkJCQluZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCA9IHRydWU7CisJCQl9CisJCQllbHNlCisJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSBmYWxzZTsKKwkJCWJyZWFrOworCisKKwkJY2FzZSBNRklFX1RZUEVfSFRfSU5GTzoKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfSFRfSU5GTzogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJdG1wX2h0aW5mb19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOworCQkJaWYodG1wX2h0aW5mb19sZW4peworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfSUVFRTsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA9IHRtcF9odGluZm9fbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmKT9cCisJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik6dG1wX2h0aW5mb19sZW47CisJCQkJbWVtY3B5KG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmLGluZm9fZWxlbWVudC0+ZGF0YSxuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9BSVJPTkVUOgorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9BSVJPTkVUOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+SUVfQ0lTQ09fRkxBR19QT1NJVElPTikKKwkJCXsKKwkJCQluZXR3b3JrLT5iV2l0aEFpcm9uZXRJRSA9IHRydWU7CisKKwkJCQkvLyBDQ1ggMSBzcGVjIHYxLjEzLCBBMDEuMSBDS0lQIE5lZ290aWF0aW9uIChwYWdlMjMpOgorCQkJCS8vICJBIENpc2NvIGFjY2VzcyBwb2ludCBhZHZlcnRpc2VzIHN1cHBvcnQgZm9yIENLSVAgaW4gYmVhY29uIGFuZCBwcm9iZSByZXNwb25zZSBwYWNrZXRzLAorCQkJCS8vICBieSBhZGRpbmcgYW4gQWlyb25ldCBlbGVtZW50IGFuZCBzZXR0aW5nIG9uZSBvciBib3RoIG9mIHRoZSBDS0lQIG5lZ290aWF0aW9uIGJpdHMuIgorCQkJCWlmKAkoaW5mb19lbGVtZW50LT5kYXRhW0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dJlNVUFBPUlRfQ0tJUF9NSUMpCXx8CisJCQkJCShpbmZvX2VsZW1lbnQtPmRhdGFbSUVfQ0lTQ09fRkxBR19QT1NJVElPTl0mU1VQUE9SVF9DS0lQX1BLKQkpCisJCQkJeworCQkgCQkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSB0cnVlOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQluZXR3b3JrLT5iQ2tpcFN1cHBvcnRlZCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluZXR3b3JrLT5iV2l0aEFpcm9uZXRJRSA9IGZhbHNlOworCQkgCQluZXR3b3JrLT5iQ2tpcFN1cHBvcnRlZCA9IGZhbHNlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTUZJRV9UWVBFX1FPU19QQVJBTUVURVI6CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiUW9TIEVycm9yIG5lZWQgdG8gcGFyc2UgUU9TX1BBUkFNRVRFUiBJRVxuIik7CisJCQlicmVhazsKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkJY2FzZSBNRklFX1RZUEVfQ09VTlRSWToKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ09VTlRSWTogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJLy9wcmludGsoIj09PT09PlJlY2VpdmUgPCVzPiBDb3VudHJ5IElFXG4iLG5ldHdvcmstPnNzaWQpOworCQkJaWVlZTgwMjExX2V4dHJhY3RfY291bnRyeV9pZShpZWVlLCBpbmZvX2VsZW1lbnQsIG5ldHdvcmssIG5ldHdvcmstPmJzc2lkKTsvL2FkZHIyIGlzIHNhbWUgYXMgYWRkcjMgd2hlbiBmcm9tIGFuIEFQCisJCQlicmVhazsKKyNlbmRpZgorLyogVE9ETyAqLworCQlkZWZhdWx0OgorCQkJSUVFRTgwMjExX0RFQlVHX01HTVQKKwkJCSAgICAoIlVuc3VwcG9ydGVkIGluZm8gZWxlbWVudDogJXMgKCVkKVxuIiwKKwkJCSAgICAgZ2V0X2luZm9fZWxlbWVudF9zdHJpbmcoaW5mb19lbGVtZW50LT5pZCksCisJCQkgICAgIGluZm9fZWxlbWVudC0+aWQpOworCQkJYnJlYWs7CisJCX0KKworCQlsZW5ndGggLT0gc2l6ZW9mKCppbmZvX2VsZW1lbnQpICsgaW5mb19lbGVtZW50LT5sZW47CisJCWluZm9fZWxlbWVudCA9CisJCSAgICAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikmaW5mb19lbGVtZW50LT4KKwkJICAgIGRhdGFbaW5mb19lbGVtZW50LT5sZW5dOworCX0KKworCWlmKCFuZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCAmJiAhbmV0d29yay0+YnJvYWRjb21fY2FwX2V4aXN0ICYmCisJCSFuZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikKKwl7CisJCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gdHJ1ZTsKKwl9CisJZWxzZQorCXsKKwkJbmV0d29yay0+dW5rbm93bl9jYXBfZXhpc3QgPSBmYWxzZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaWVlZTgwMjExX1NpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKAorCXU4ICBDdXJyU1MKKwkpCit7CisJdTggUmV0U1M7CisKKwkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCisJaWYoQ3VyclNTID49IDcxICYmIEN1cnJTUyA8PSAxMDApCisJeworCQlSZXRTUyA9IDkwICsgKChDdXJyU1MgLSA3MCkgLyAzKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNDEgJiYgQ3VyclNTIDw9IDcwKQorCXsKKwkJUmV0U1MgPSA3OCArICgoQ3VyclNTIC0gNDApIC8gMyk7CisJfQorCWVsc2UgaWYoQ3VyclNTID49IDMxICYmIEN1cnJTUyA8PSA0MCkKKwl7CisJCVJldFNTID0gNjYgKyAoQ3VyclNTIC0gMzApOworCX0KKwllbHNlIGlmKEN1cnJTUyA+PSAyMSAmJiBDdXJyU1MgPD0gMzApCisJeworCQlSZXRTUyA9IDU0ICsgKEN1cnJTUyAtIDIwKTsKKwl9CisJZWxzZSBpZihDdXJyU1MgPj0gNSAmJiBDdXJyU1MgPD0gMjApCisJeworCQlSZXRTUyA9IDQyICsgKCgoQ3VyclNTIC0gNSkgKiAyKSAvIDMpOworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSA0KQorCXsKKwkJUmV0U1MgPSAzNjsKKwl9CisJZWxzZSBpZihDdXJyU1MgPT0gMykKKwl7CisJCVJldFNTID0gMjc7CisJfQorCWVsc2UgaWYoQ3VyclNTID09IDIpCisJeworCQlSZXRTUyA9IDE4OworCX0KKwllbHNlIGlmKEN1cnJTUyA9PSAxKQorCXsKKwkJUmV0U1MgPSA5OworCX0KKwllbHNlCisJeworCQlSZXRTUyA9IEN1cnJTUzsKKwl9CisJLy9SVF9UUkFDRShDT01QX0RCRywgREJHX0xPVUQsICgiIyMjIyMgQWZ0ZXIgTWFwcGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwkvLyBTdGVwIDIuIFNtb290aGluZy4KKworCS8vUlRfVFJBQ0UoQ09NUF9EQkcsIERCR19MT1VELCAoIiQkJCQkIEFmdGVyIFNtb290aGluZzogIExhc3RTUzogJWQsIEN1cnJTUzogJWQsIFJldFNTOiAlZFxuIiwgTGFzdFNTLCBDdXJyU1MsIFJldFNTKSk7CisKKwlyZXR1cm4gUmV0U1M7Cit9CisKK2xvbmcgaWVlZTgwMjExX3RyYW5zbGF0ZV90b2RibSh1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgJKS8vIDAtMTAwIGluZGV4LgoreworCWxvbmcJc2lnbmFsX3Bvd2VyOyAvLyBpbiBkQm0uCisKKwkvLyBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLgorCXNpZ25hbF9wb3dlciA9IChsb25nKSgoc2lnbmFsX3N0cmVuZ3RoX2luZGV4ICsgMSkgPj4gMSk7CisJc2lnbmFsX3Bvd2VyIC09IDk1OworCisJcmV0dXJuIHNpZ25hbF9wb3dlcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtfaW5pdCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkvL2NoYXIgcmF0ZXNfc3RyWzY0XTsKKwkvL2NoYXIgKnA7CisjZW5kaWYKKworICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5hY3RpdmUgPSAwOworICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5zdXBwb3J0ZWQgPSAwOworICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IDA7CisgICAgICAgIG5ldHdvcmstPnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IDA7CisKKwkvKiBQdWxsIG91dCBmaXhlZCBmaWVsZCBkYXRhICovCisJbWVtY3B5KG5ldHdvcmstPmJzc2lkLCBiZWFjb24tPmhlYWRlci5hZGRyMywgRVRIX0FMRU4pOworCW5ldHdvcmstPmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShiZWFjb24tPmNhcGFiaWxpdHkpOworCW5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+dGltZV9zdGFtcFswXSk7CisJbmV0d29yay0+dGltZV9zdGFtcFsxXSA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+dGltZV9zdGFtcFsxXSk7CisJbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25faW50ZXJ2YWwpOworCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7Ki8KKwluZXR3b3JrLT5saXN0ZW5faW50ZXJ2YWwgPSAweDBBOworCW5ldHdvcmstPnJhdGVzX2xlbiA9IG5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IDA7CisJbmV0d29yay0+bGFzdF9hc3NvY2lhdGUgPSAwOworCW5ldHdvcmstPnNzaWRfbGVuID0gMDsKKwluZXR3b3JrLT5mbGFncyA9IDA7CisJbmV0d29yay0+YXRpbV93aW5kb3cgPSAwOworCW5ldHdvcmstPmVycF92YWx1ZSA9IChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID8KKyAgICAgICAgICAgIDB4MyA6IDB4MDsKKwluZXR3b3JrLT5iZXJwX2luZm9fdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgbmV0d29yay0+YnJvYWRjb21fY2FwX2V4aXN0ID0gZmFsc2U7CisJbmV0d29yay0+cmFsaW5rX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPmF0aGVyb3NfY2FwX2V4aXN0ID0gZmFsc2U7CisJbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gZmFsc2U7CisJbmV0d29yay0+dW5rbm93bl9jYXBfZXhpc3QgPSBmYWxzZTsKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwluZXR3b3JrLT5UdXJib19FbmFibGUgPSAwOworI2VuZGlmCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IDA7CisJbWVtc2V0KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgMCwgTUFYX0lFX0xFTik7CisjZW5kaWYKKy8vSW5pdGlhbGl6ZSBIVCBwYXJhbWV0ZXJzCisJLy9pZWVlODAyMTFfaHRfaW5pdGlhbGl6ZSgmbmV0d29yay0+YnNzaHQpOworCUhUSW5pdGlhbGl6ZUJzc0Rlc2MoJm5ldHdvcmstPmJzc2h0KTsKKwlpZiAoc3RhdHMtPmZyZXEgPT0gSUVFRTgwMjExXzUyR0haX0JBTkQpIHsKKwkJLyogZm9yIEEgYmFuZCAoTm8gRFMgaW5mbykgKi8KKwkJbmV0d29yay0+Y2hhbm5lbCA9IHN0YXRzLT5yZWNlaXZlZF9jaGFubmVsOworCX0gZWxzZQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19DQ0s7CisKKyAJbmV0d29yay0+d3BhX2llX2xlbiA9IDA7CisgCW5ldHdvcmstPnJzbl9pZV9sZW4gPSAwOworCisgICAgICAgIGlmIChpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbQorICAgICAgICAgICAgKGllZWUsYmVhY29uLT5pbmZvX2VsZW1lbnQsIHN0YXRzLT5sZW4gLSBzaXplb2YoKmJlYWNvbiksIG5ldHdvcmssIHN0YXRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworCW5ldHdvcmstPm1vZGUgPSAwOworCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkKKwkJbmV0d29yay0+bW9kZSA9IElFRUVfQTsKKwllbHNlIHsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfT0ZETSkKKwkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9HOworCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19DQ0spCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfQjsKKwl9CisKKwlpZiAobmV0d29yay0+bW9kZSA9PSAwKSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJGaWx0ZXJlZCBvdXQgJyVzICgiIE1BQ19GTVQgIiknICIKKwkJCQkgICAgICJuZXR3b3JrLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAorCQkJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJICAgICBNQUNfQVJHKG5ldHdvcmstPmJzc2lkKSk7CisJCXJldHVybiAxOworCX0KKworCWlmKG5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKXsKKwkJaWYobmV0d29yay0+bW9kZSA9PSBJRUVFX0EpCisJCQluZXR3b3JrLT5tb2RlID0gSUVFRV9OXzVHOworCQllbHNlIGlmKG5ldHdvcmstPm1vZGUgJiAoSUVFRV9HIHwgSUVFRV9CKSkKKwkJCW5ldHdvcmstPm1vZGUgPSBJRUVFX05fMjRHOworCX0KKwlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSkKKwkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKKworCXN0YXRzLT5zaWduYWwgPSAzMCArIChzdGF0cy0+U2lnbmFsU3RyZW5ndGggKiA3MCkgLyAxMDA7CisJLy9zdGF0cy0+c2lnbmFsID0gaWVlZTgwMjExX1NpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKHN0YXRzLT5zaWduYWwpOworCXN0YXRzLT5ub2lzZSA9IGllZWU4MDIxMV90cmFuc2xhdGVfdG9kYm0oKHU4KSgxMDAtc3RhdHMtPnNpZ25hbCkpIC0yNTsKKworCW1lbWNweSgmbmV0d29yay0+c3RhdHMsIHN0YXRzLCBzaXplb2YobmV0d29yay0+c3RhdHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMsCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmRzdCwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJLyogQSBuZXR3b3JrIGlzIG9ubHkgYSBkdXBsaWNhdGUgaWYgdGhlIGNoYW5uZWwsIEJTU0lELCBFU1NJRAorCSAqIGFuZCB0aGUgY2FwYWJpbGl0eSBmaWVsZCAoaW4gcGFydGljdWxhciBJQlNTIGFuZCBCU1MpIGFsbCBtYXRjaC4KKwkgKiBXZSB0cmVhdCBhbGwgPGhpZGRlbj4gd2l0aCB0aGUgc2FtZSBCU1NJRCBhbmQgY2hhbm5lbAorCSAqIGFzIG9uZSBuZXR3b3JrICovCisJcmV0dXJuIC8vKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pICYmCisJCSgoKHNyYy0+c3NpZF9sZW4gPT0gZHN0LT5zc2lkX2xlbikgfHwgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpICYmCisJCShzcmMtPmNoYW5uZWwgPT0gZHN0LT5jaGFubmVsKSAmJgorCQkhbWVtY21wKHNyYy0+YnNzaWQsIGRzdC0+YnNzaWQsIEVUSF9BTEVOKSAmJgorCQkvLyFtZW1jbXAoc3JjLT5zc2lkLCBkc3QtPnNzaWQsIHNyYy0+c3NpZF9sZW4pICYmCisJCSghbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYKKwkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgJiYKKwkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQorCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMpCit7CisJaW50IHFvc19hY3RpdmU7CisJdTggb2xkX3BhcmFtOworCisJbWVtY3B5KCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMpKTsKKwlkc3QtPmNhcGFiaWxpdHkgPSBzcmMtPmNhcGFiaWxpdHk7CisJbWVtY3B5KGRzdC0+cmF0ZXMsIHNyYy0+cmF0ZXMsIHNyYy0+cmF0ZXNfbGVuKTsKKwlkc3QtPnJhdGVzX2xlbiA9IHNyYy0+cmF0ZXNfbGVuOworCW1lbWNweShkc3QtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4X2xlbik7CisJZHN0LT5yYXRlc19leF9sZW4gPSBzcmMtPnJhdGVzX2V4X2xlbjsKKwlpZihzcmMtPnNzaWRfbGVuID4gMCkKKwl7CisJCW1lbXNldChkc3QtPnNzaWQsIDAsIGRzdC0+c3NpZF9sZW4pOworCQlkc3QtPnNzaWRfbGVuID0gc3JjLT5zc2lkX2xlbjsKKwkJbWVtY3B5KGRzdC0+c3NpZCwgc3JjLT5zc2lkLCBzcmMtPnNzaWRfbGVuKTsKKwl9CisJZHN0LT5tb2RlID0gc3JjLT5tb2RlOworCWRzdC0+ZmxhZ3MgPSBzcmMtPmZsYWdzOworCWRzdC0+dGltZV9zdGFtcFswXSA9IHNyYy0+dGltZV9zdGFtcFswXTsKKwlkc3QtPnRpbWVfc3RhbXBbMV0gPSBzcmMtPnRpbWVfc3RhbXBbMV07CisJaWYgKHNyYy0+ZmxhZ3MgJiBORVRXT1JLX0hBU19FUlBfVkFMVUUpCisJeworCQlkc3QtPmVycF92YWx1ZSA9IHNyYy0+ZXJwX3ZhbHVlOworCQlkc3QtPmJlcnBfaW5mb192YWxpZCA9IHNyYy0+YmVycF9pbmZvX3ZhbGlkID0gdHJ1ZTsKKwl9CisJZHN0LT5iZWFjb25faW50ZXJ2YWwgPSBzcmMtPmJlYWNvbl9pbnRlcnZhbDsKKwlkc3QtPmxpc3Rlbl9pbnRlcnZhbCA9IHNyYy0+bGlzdGVuX2ludGVydmFsOworCWRzdC0+YXRpbV93aW5kb3cgPSBzcmMtPmF0aW1fd2luZG93OworCWRzdC0+ZHRpbV9wZXJpb2QgPSBzcmMtPmR0aW1fcGVyaW9kOworCWRzdC0+ZHRpbV9kYXRhID0gc3JjLT5kdGltX2RhdGE7CisJZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVswXTsKKwlkc3QtPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHNyYy0+bGFzdF9kdGltX3N0YV90aW1lWzFdOworCW1lbWNweSgmZHN0LT50aW0sICZzcmMtPnRpbSwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMpKTsKKworICAgICAgICBkc3QtPmJzc2h0LmJkU3VwcG9ydEhUID0gc3JjLT5ic3NodC5iZFN1cHBvcnRIVDsKKwlkc3QtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbiA9IHNyYy0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uOworCWRzdC0+YnNzaHQuYmRIVENhcExlbj0gc3JjLT5ic3NodC5iZEhUQ2FwTGVuOworCW1lbWNweShkc3QtPmJzc2h0LmJkSFRDYXBCdWYsc3JjLT5ic3NodC5iZEhUQ2FwQnVmLHNyYy0+YnNzaHQuYmRIVENhcExlbik7CisJZHN0LT5ic3NodC5iZEhUSW5mb0xlbj0gc3JjLT5ic3NodC5iZEhUSW5mb0xlbjsKKwltZW1jcHkoZHN0LT5ic3NodC5iZEhUSW5mb0J1ZixzcmMtPmJzc2h0LmJkSFRJbmZvQnVmLHNyYy0+YnNzaHQuYmRIVEluZm9MZW4pOworCWRzdC0+YnNzaHQuYmRIVFNwZWNWZXIgPSBzcmMtPmJzc2h0LmJkSFRTcGVjVmVyOworCWRzdC0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZSA9IHNyYy0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZTsKKwlkc3QtPmJyb2FkY29tX2NhcF9leGlzdCA9IHNyYy0+YnJvYWRjb21fY2FwX2V4aXN0OworCWRzdC0+cmFsaW5rX2NhcF9leGlzdCA9IHNyYy0+cmFsaW5rX2NhcF9leGlzdDsKKwlkc3QtPmF0aGVyb3NfY2FwX2V4aXN0ID0gc3JjLT5hdGhlcm9zX2NhcF9leGlzdDsKKwlkc3QtPmNpc2NvX2NhcF9leGlzdCA9IHNyYy0+Y2lzY29fY2FwX2V4aXN0OworCWRzdC0+dW5rbm93bl9jYXBfZXhpc3QgPSBzcmMtPnVua25vd25fY2FwX2V4aXN0OworCW1lbWNweShkc3QtPndwYV9pZSwgc3JjLT53cGFfaWUsIHNyYy0+d3BhX2llX2xlbik7CisJZHN0LT53cGFfaWVfbGVuID0gc3JjLT53cGFfaWVfbGVuOworCW1lbWNweShkc3QtPnJzbl9pZSwgc3JjLT5yc25faWUsIHNyYy0+cnNuX2llX2xlbik7CisJZHN0LT5yc25faWVfbGVuID0gc3JjLT5yc25faWVfbGVuOworCisJZHN0LT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOworCS8qIHFvcyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKwkvL3Fvc19hY3RpdmUgPSBzcmMtPnFvc19kYXRhLmFjdGl2ZTsKKwlxb3NfYWN0aXZlID0gZHN0LT5xb3NfZGF0YS5hY3RpdmU7CisJLy9vbGRfcGFyYW0gPSBkc3QtPnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudDsKKwlvbGRfcGFyYW0gPSBkc3QtPnFvc19kYXRhLnBhcmFtX2NvdW50OworCWlmKGRzdC0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfTUFTSykKKwkJbWVtY3B5KCZkc3QtPnFvc19kYXRhLCAmc3JjLT5xb3NfZGF0YSwKKwkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19kYXRhKSk7CisJZWxzZSB7CisJCWRzdC0+cW9zX2RhdGEuc3VwcG9ydGVkID0gc3JjLT5xb3NfZGF0YS5zdXBwb3J0ZWQ7CisJCWRzdC0+cW9zX2RhdGEucGFyYW1fY291bnQgPSBzcmMtPnFvc19kYXRhLnBhcmFtX2NvdW50OworCX0KKworCWlmKGRzdC0+cW9zX2RhdGEuc3VwcG9ydGVkID09IDEpIHsKKwkJZHN0LT5Rb1NfRW5hYmxlID0gMTsKKwkJaWYoZHN0LT5zc2lkX2xlbikKKwkJCUlFRUU4MDIxMV9ERUJVR19RT1MKKwkJCQkoIlFvUyB0aGUgbmV0d29yayAlcyBpcyBRb1Mgc3VwcG9ydGVkXG4iLAorCQkJCWRzdC0+c3NpZCk7CisJCWVsc2UKKwkJCUlFRUU4MDIxMV9ERUJVR19RT1MKKwkJCQkoIlFvUyB0aGUgbmV0d29yayBpcyBRb1Mgc3VwcG9ydGVkXG4iKTsKKwl9CisJZHN0LT5xb3NfZGF0YS5hY3RpdmUgPSBxb3NfYWN0aXZlOworCWRzdC0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0gb2xkX3BhcmFtOworCisJLyogZHN0LT5sYXN0X2Fzc29jaWF0ZSBpcyBub3Qgb3ZlcndyaXR0ZW4gKi8KKwlkc3QtPndtbV9pbmZvID0gc3JjLT53bW1faW5mbzsgLy9zdXJlIHRvIGV4aXN0IGluIGJlYWNvbiBvciBwcm9iZSByZXNwb25zZSBmcmFtZS4KKwlpZihzcmMtPndtbV9wYXJhbVswXS5hY19hY2lfYWNtX2FpZnNufHwgXAorCSAgIHNyYy0+d21tX3BhcmFtWzFdLmFjX2FjaV9hY21fYWlmc258fCBcCisJICAgc3JjLT53bW1fcGFyYW1bMl0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNuKSB7CisJICBtZW1jcHkoZHN0LT53bW1fcGFyYW0sIHNyYy0+d21tX3BhcmFtLCBXTUVfQUNfUFJBTV9MRU4pOworCX0KKwkvL2RzdC0+UW9TX0VuYWJsZSA9IHNyYy0+UW9TX0VuYWJsZTsKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwlkc3QtPlR1cmJvX0VuYWJsZSA9IHNyYy0+VHVyYm9fRW5hYmxlOworI2VuZGlmCisKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJZHN0LT5Db3VudHJ5SWVMZW4gPSBzcmMtPkNvdW50cnlJZUxlbjsKKwltZW1jcHkoZHN0LT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUxlbik7CisjZW5kaWYKKworCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQCisJZHN0LT5iV2l0aEFpcm9uZXRJRSA9IHNyYy0+YldpdGhBaXJvbmV0SUU7CisJZHN0LT5iQ2tpcFN1cHBvcnRlZCA9IHNyYy0+YkNraXBTdXBwb3J0ZWQ7CisJbWVtY3B5KGRzdC0+Q2N4Um1TdGF0ZSxzcmMtPkNjeFJtU3RhdGUsMik7CisJZHN0LT5iQ2N4Um1FbmFibGUgPSBzcmMtPmJDY3hSbUVuYWJsZTsKKwlkc3QtPk1Cc3NpZE1hc2sgPSBzcmMtPk1Cc3NpZE1hc2s7CisJZHN0LT5iTUJzc2lkVmFsaWQgPSBzcmMtPmJNQnNzaWRWYWxpZDsKKwltZW1jcHkoZHN0LT5NQnNzaWQsc3JjLT5NQnNzaWQsNik7CisJZHN0LT5iV2l0aENjeFZlck51bSA9IHNyYy0+YldpdGhDY3hWZXJOdW07CisJZHN0LT5Cc3NDY3hWZXJOdW1iZXIgPSBzcmMtPkJzc0NjeFZlck51bWJlcjsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19iZWFjb24oX19sZTE2IGZjKQoreworCXJldHVybiAoV0xBTl9GQ19HRVRfU1RZUEUobGUxNl90b19jcHUoZmMpKSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29yazsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm9sZGVzdCA9IE5VTEw7CisjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQgPSAmYmVhY29uLT5pbmZvX2VsZW1lbnRbMF07CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IHJlbmV3OworCS8vdTggd21tX2luZm87CisKKwltZW1zZXQoJm5ldHdvcmssIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKwlJRUVFODAyMTFfREVCVUdfU0NBTigKKwkJIiclcycgKCIgTUFDX0ZNVCAiKTogJWMlYyVjJWMgJWMlYyVjJWMtJWMlYyVjJWMgJWMlYyVjJWNcbiIsCisJCWVzY2FwZV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKSwKKwkJTUFDX0FSRyhiZWFjb24tPmhlYWRlci5hZGRyMyksCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHhmKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHhlKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHhkKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHhjKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHhiKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHhhKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHg5KSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHg4KSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHg3KSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHg2KSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHg1KSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHg0KSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHgzKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHgyKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHgxKSkgPyAnMScgOiAnMCcsCisJCShiZWFjb24tPmNhcGFiaWxpdHkgJiAoMTw8MHgwKSkgPyAnMScgOiAnMCcpOworCisJaWYgKGllZWU4MDIxMV9uZXR3b3JrX2luaXQoaWVlZSwgYmVhY29uLCAmbmV0d29yaywgc3RhdHMpKSB7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJEcm9wcGVkICclcycgKCIgTUFDX0ZNVCAiKSB2aWEgJXMuXG4iLAorCQkJCSAgICAgZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkJCSAgaW5mb19lbGVtZW50LT5sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhiZWFjb24tPmhlYWRlci5hZGRyMyksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCS8vIEZvciBBc3VzIEVlZVBjIHJlcXVlc3QsCisJLy8gKDEpIGlmIHdpcmVsZXNzIGFkYXB0ZXIgcmVjZWl2ZSBnZXQgYW55IDgwMi4xMWQgY291bnRyeSBjb2RlIGluIEFQIGJlYWNvbiwKKwkvLwkgICB3aXJlbGVzcyBhZGFwdGVyIHNob3VsZCBmb2xsb3cgdGhlIGNvdW50cnkgY29kZS4KKwkvLyAoMikgIElmIHRoZXJlIGlzIG5vIGFueSBjb3VudHJ5IGNvZGUgaW4gYmVhY29uLAorCS8vICAgICAgIHRoZW4gd2lyZWxlc3MgYWRhcHRlciBzaG91bGQgZG8gYWN0aXZlIHNjYW4gZnJvbSBjaDF+MTEgYW5kCisJLy8gICAgICAgcGFzc2l2ZSBzY2FuIGZyb20gY2gxMn4xNAorCisJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKKwkJcmV0dXJuOworCWlmKGllZWUtPmJHbG9iYWxEb21haW4pCisJeworCQlpZiAoV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCkKKwkJeworCQkJLy8gQ2FzZSAxOiBDb3VudHJ5IGNvZGUKKwkJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkgKQorCQkJeworCQkJCWlmKCAhSXNMZWdhbENoYW5uZWwoaWVlZSwgbmV0d29yay5jaGFubmVsKSApCisJCQkJeworCQkJCQlwcmludGsoIkdldFNjYW5JbmZvKCk6IEZvciBDb3VudHJ5IGNvZGUsIGZpbHRlciBwcm9iZSByZXNwb25zZSBhdCBjaGFubmVsKCVkKS5cbiIsIG5ldHdvcmsuY2hhbm5lbCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvLyBDYXNlIDI6IE5vIGFueSBjb3VudHJ5IGNvZGUuCisJCQllbHNlCisJCQl7CisJCQkJLy8gRmlsdGVyIG92ZXIgY2hhbm5lbCBjaDEyfjE0CisJCQkJaWYobmV0d29yay5jaGFubmVsID4gMTEpCisJCQkJeworCQkJCQlwcmludGsoIkdldFNjYW5JbmZvKCk6IEZvciBHbG9iYWwgRG9tYWluLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLCBuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gQ2FzZSAxOiBDb3VudHJ5IGNvZGUKKwkJCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkgKQorCQkJeworCQkJCWlmKCAhSXNMZWdhbENoYW5uZWwoaWVlZSwgbmV0d29yay5jaGFubmVsKSApCisJCQkJeworCQkJCQlwcmludGsoIkdldFNjYW5JbmZvKCk6IEZvciBDb3VudHJ5IGNvZGUsIGZpbHRlciBiZWFjb24gYXQgY2hhbm5lbCglZCkuXG4iLG5ldHdvcmsuY2hhbm5lbCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvLyBDYXNlIDI6IE5vIGFueSBjb3VudHJ5IGNvZGUuCisJCQllbHNlCisJCQl7CisJCQkJLy8gRmlsdGVyIG92ZXIgY2hhbm5lbCBjaDEyfjE0CisJCQkJaWYobmV0d29yay5jaGFubmVsID4gMTQpCisJCQkJeworCQkJCQlwcmludGsoIkdldFNjYW5JbmZvKCk6IEZvciBHbG9iYWwgRG9tYWluLCBmaWx0ZXIgYmVhY29uIGF0IGNoYW5uZWwoJWQpLlxuIixuZXR3b3JrLmNoYW5uZWwpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBUaGUgbmV0d29yayBwYXJzZWQgY29ycmVjdGx5IC0tIHNvIG5vdyB3ZSBzY2FuIG91ciBrbm93biBuZXR3b3JrcworCSAqIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBpdCBpbiBvdXIgbGlzdC4KKwkgKgorCSAqIE5PVEU6ICBUaGlzIHNlYXJjaCBpcyBkZWZpbml0ZWx5IG5vdCBvcHRpbWl6ZWQuICBPbmNlIGl0cyBkb2luZworCSAqICAgICAgICB0aGUgInJpZ2h0IHRoaW5nIiB3ZSdsbCBvcHRpbWl6ZSBpdCBmb3IgZWZmaWNpZW5jeSBpZgorCSAqICAgICAgICBuZWNlc3NhcnkgKi8KKworCS8qIFNlYXJjaCBmb3IgdGhpcyBlbnRyeSBpbiB0aGUgbGlzdCBhbmQgdXBkYXRlIGl0IGlmIGl0IGlzCisJICogYWxyZWFkeSB0aGVyZS4gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpKSB7CisJCXVwZGF0ZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrKTsKKwkJaWYoKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcgfHwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9HKQorCQkmJiBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVycF9pbmZvX3ZhbGlkKXsKKwkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmVycF92YWx1ZSYgRVJQX1VzZVByb3RlY3Rpb24pCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24gPSB0cnVlOworCQllbHNlCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24gPSBmYWxzZTsKKwkJfQorCQlpZihpc19iZWFjb24oYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSkKKwkJeworCQkJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QrKzsKKwkJfQorCQllbHNlIC8vaGlkZGVuIEFQCisJCQluZXR3b3JrLmZsYWdzID0gKH5ORVRXT1JLX0VNUFRZX0VTU0lEICYgbmV0d29yay5mbGFncyl8KE5FVFdPUktfRU1QVFlfRVNTSUQgJiBpZWVlLT5jdXJyZW50X25ldHdvcmsuZmxhZ3MpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisJCWlmIChpc19zYW1lX25ldHdvcmsodGFyZ2V0LCAmbmV0d29yaywgaWVlZSkpCisJCQlicmVhazsKKwkJaWYgKChvbGRlc3QgPT0gTlVMTCkgfHwKKwkJICAgICh0YXJnZXQtPmxhc3Rfc2Nhbm5lZCA8IG9sZGVzdC0+bGFzdF9zY2FubmVkKSkKKwkJCW9sZGVzdCA9IHRhcmdldDsKKwl9CisKKwkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQorCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLworCWlmICgmdGFyZ2V0LT5saXN0ID09ICZpZWVlLT5uZXR3b3JrX2xpc3QpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KSkgeworCQkJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgc2xvdHMsIGV4cGlyZSB0aGUgb2xkZXN0ICovCisJCQlsaXN0X2RlbCgmb2xkZXN0LT5saXN0KTsKKwkJCXRhcmdldCA9IG9sZGVzdDsKKwkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJFeHBpcmVkICclcycgKCIgTUFDX0ZNVCAiKSBmcm9tICIKKwkJCQkJICAgICAibmV0d29yayBsaXN0LlxuIiwKKwkJCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAorCQkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCisJCQkJCSAgICAgTUFDX0FSRyh0YXJnZXQtPmJzc2lkKSk7CisJCX0gZWxzZSB7CisJCQkvKiBPdGhlcndpc2UganVzdCBwdWxsIGZyb20gdGhlIGZyZWUgbGlzdCAqLworCQkJdGFyZ2V0ID0gbGlzdF9lbnRyeShpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0LAorCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrLCBsaXN0KTsKKwkJCWxpc3RfZGVsKGllZWUtPm5ldHdvcmtfZnJlZV9saXN0Lm5leHQpOworCQl9CisKKworI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkFkZGluZyAnJXMnICgiIE1BQ19GTVQgIikgdmlhICVzLlxuIiwKKwkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLnNzaWQsCisJCQkJCQkgIG5ldHdvcmsuc3NpZF9sZW4pLAorCQkJCSAgICAgTUFDX0FSRyhuZXR3b3JrLmJzc2lkKSwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisjZW5kaWYKKwkJbWVtY3B5KHRhcmdldCwgJm5ldHdvcmssIHNpemVvZigqdGFyZ2V0KSk7CisJCWxpc3RfYWRkX3RhaWwoJnRhcmdldC0+bGlzdCwgJmllZWUtPm5ldHdvcmtfbGlzdCk7CisJCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKQorCQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCZuZXR3b3JrKTsKKwl9IGVsc2UgeworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiVXBkYXRpbmcgJyVzJyAoIiBNQUNfRk1UICIpIHZpYSAlcy5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAorCQkJCQkJICB0YXJnZXQtPnNzaWRfbGVuKSwKKwkJCQkgICAgIE1BQ19BUkcodGFyZ2V0LT5ic3NpZCksCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/CisJCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOworCisJCS8qIHdlIGhhdmUgYW4gZW50cnkgYW5kIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgaXQuIEJ1dCB0aGlzIGVudHJ5IG1heQorCQkgKiBiZSBhbHJlYWR5IGV4cGlyZWQuIEluIHRoaXMgY2FzZSB3ZSBkbyB0aGUgc2FtZSBhcyB3ZSBmb3VuZCBhIG5ldworCQkgKiBuZXQgYW5kIGNhbGwgdGhlIG5ld19uZXQgaGFuZGxlcgorCQkgKi8KKwkJcmVuZXcgPSAhdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKTsKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKKwkJaWYoaXNfYmVhY29uKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gMCkKKwkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIHRhcmdldC0+ZmxhZ3MpOworCQkvL2lmKHN0cm5jbXAobmV0d29yay5zc2lkLCAibGlua3N5cy1jIiw5KSA9PSAwKQorCQkvLwlwcmludGsoIj09PT0+MiBuZXR3b3JrLnNzaWQ9JXMgRkxBRz0lZCB0YXJnZXQuc3NpZD0lcyBGTEFHPSVkXG4iLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuZmxhZ3MsIHRhcmdldC0+c3NpZCwgdGFyZ2V0LT5mbGFncyk7CisJCWlmKCgobmV0d29yay5mbGFncyAmIE5FVFdPUktfRU1QVFlfRVNTSUQpID09IE5FVFdPUktfRU1QVFlfRVNTSUQpIFwKKwkJICAgICYmICgoKG5ldHdvcmsuc3NpZF9sZW4gPiAwKSAmJiAoc3RybmNtcCh0YXJnZXQtPnNzaWQsIG5ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkX2xlbikpKVwKKwkJICAgIHx8KChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gbmV0d29yay5zc2lkX2xlbikmJihzdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZF9sZW4pID09IDApJiYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykpKSkKKwkJCXJlbmV3ID0gMTsKKwkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAsZW5kCisKKwkJdXBkYXRlX25ldHdvcmsodGFyZ2V0LCAmbmV0d29yayk7CisJCWlmKHJlbmV3ICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkpCisJCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsJm5ldHdvcmspOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaXNfYmVhY29uKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkmJmlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yaywgaWVlZSkmJlwKKwkJKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKSB7CisJCWlmKGllZWUtPmhhbmRsZV9iZWFjb24gIT0gTlVMTCkgeworCQkJaWVlZS0+aGFuZGxlX2JlYWNvbihpZWVlLT5kZXYsYmVhY29uLCZpZWVlLT5jdXJyZW50X25ldHdvcmspOworCQl9CisJfQorfQorCit2b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIsCisJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKSB7CisKKwljYXNlIElFRUU4MDIxMV9TVFlQRV9CRUFDT046CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBCRUFDT04gKCVkKVxuIiwKKwkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJCZWFjb25cbiIpOworCQlpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKKwkJCWllZWUsIChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopaGVhZGVyLCBzdGF0cyk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUDoKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFBST0JFIFJFU1BPTlNFICglZClcbiIsCisJCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlJRUVFODAyMTFfREVCVUdfU0NBTigiUHJvYmUgcmVzcG9uc2VcbiIpOworCQlpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKKwkJCWllZWUsIChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopaGVhZGVyLCBzdGF0cyk7CisJCWJyZWFrOworCisJfQorfQorCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yeF9tZ3QpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODZlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTAsMCArMSwzMjg3IEBACisvKiBJRUVFIDgwMi4xMSBTb2Z0TUFDIGxheWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIE1vc3RseSBleHRyYWN0ZWQgZnJvbSB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyIGZvciB0aGUKKyAqIGluLWtlcm5lbCBnZW5lcmljIGllZWU4MDIuMTEgc3RhY2suCisgKgorICogRmV3IGxpbmVzIG1pZ2h0IGJlIHN0b2xlbiBmcm9tIG90aGVyIHBhcnQgb2YgdGhlIGllZWU4MDIxMQorICogc3RhY2suIENvcHlyaWdodCB3aG8gb3duIGl0J3MgY29weXJpZ2h0CisgKgorICogV1BBIGNvZGUgc3RvbGVuIGZyb20gdGhlIGlwdzIyMDAgZHJpdmVyLgorICogQ29weXJpZ2h0IHdobyBvd24gaXQncyBjb3B5cmlnaHQuCisgKgorICogcmVsZWFzZWQgdW5kZXIgdGhlIEdQTAorICovCisKKworI2luY2x1ZGUgImllZWU4MDIxMS5oIgorCisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKwordTggcnNuX2F1dGhlbl9jaXBoZXJfc3VpdGVbMTZdWzRdID0geworCXsweDAwLDB4MEYsMHhBQywweDAwfSwgLy9Vc2UgZ3JvdXAga2V5LCAvL1Jlc2VydmVkCisJezB4MDAsMHgwRiwweEFDLDB4MDF9LCAvL1dFUC00MCAgICAgICAgIC8vUlNOQSBkZWZhdWx0CisJezB4MDAsMHgwRiwweEFDLDB4MDJ9LCAvL1RLSVAgICAgICAgICAgIC8vTk9ORQkJLy97dXNlZCBqdXN0IGFzIGRlZmF1bHR9CisJezB4MDAsMHgwRiwweEFDLDB4MDN9LCAvL1dSQVAtaGlzdG9yaWNhbAorCXsweDAwLDB4MEYsMHhBQywweDA0fSwgLy9DQ01QCisJezB4MDAsMHgwRiwweEFDLDB4MDV9LCAvL1dFUC0xMDQKK307CisKK3Nob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCkKK3sKKwlyZXR1cm4gKChuZXQucmF0ZXNfZXhfbGVuID4gMCkgfHwgKG5ldC5yYXRlc19sZW4gPiA0KSk7Cit9CisKK3Nob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCkKK3sKKwlyZXR1cm4gKG5ldC5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworfQorCisvKiByZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggbmVlZGVkIGZvciBwbGVhY2luZyB0aGUgUkFURSBNRklFCisgKiB0YWcgYW5kIHRoZSBFWFRFTkRFRCBSQVRFIE1GSUUgdGFnIGlmIG5lZWRlZC4KKyAqIEl0IGVuY2x1ZGVzIHR3byBieXRlcyBwZXIgdGFnIGZvciB0aGUgdGFnIGl0c2VsZiBhbmQgaXRzIGxlbgorICovCit1bnNpZ25lZCBpbnQgaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gMDsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKQorCQlyYXRlX2xlbiA9IElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gKyAyOworCisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCisJCXJhdGVfbGVuICs9IElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOICsgMjsKKworCXJldHVybiByYXRlX2xlbjsKK30KKworLyogcGxlYWNlIHRoZSBNRklFIHJhdGUsIHRhZyB0byB0aGUgbWVtb3J5IChkb3VibGUpIHBvaW5lZC4KKyAqIFRoZW4gaXQgdXBkYXRlcyB0aGUgcG9pbnRlciBzbyB0aGF0CisgKiBpdCBwb2ludHMgYWZ0ZXIgdGhlIG5ldyBNRklFIHRhZyBhZGRlZC4KKyAqLwordm9pZCBpZWVlODAyMTFfTUZJRV9CcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3sKKwl1OCAqdGFnID0gKnRhZ19wOworCisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVM7CisJCSp0YWcrKyA9IDQ7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKKwl9CisKKwkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLworCSp0YWdfcCA9IHRhZzsKK30KKwordm9pZCBpZWVlODAyMTFfTUZJRV9HcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3sKKwl1OCAqdGFnID0gKnRhZ19wOworCisJCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7CisKKwkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTX0VYOworCQkqdGFnKysgPSA4OworCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV82TUI7CisJCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKKwkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKKworCX0KKworCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVyBtaWdodCBzdXBwb3J0ICovCisJKnRhZ19wID0gdGFnOworfQorCisKK3ZvaWQgaWVlZTgwMjExX1dNTV9JbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKSB7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvLzAKKwkqdGFnKysgPSA3OworCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHg1MDsKKwkqdGFnKysgPSAweGYyOworCSp0YWcrKyA9IDB4MDI7Ly81CisJKnRhZysrID0gMHgwMDsKKwkqdGFnKysgPSAweDAxOworI2lmZGVmIFNVUFBPUlRfVVNQRAorCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay53bW1faW5mbyAmIDB4ODApIHsKKwkJKnRhZysrID0gMHgwZnxNQVhfU1BfTGVuOworCX0gZWxzZSB7CisJCSp0YWcrKyA9IE1BWF9TUF9MZW47CisJfQorI2Vsc2UKKwkqdGFnKysgPSBNQVhfU1BfTGVuOworI2VuZGlmCisJKnRhZ19wID0gdGFnOworfQorCisjaWZkZWYgVEhPTUFTX1RVUkJPCit2b2lkIGllZWU4MDIxMV9UVVJCT19JbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKSB7CisJdTggKnRhZyA9ICp0YWdfcDsKKworCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOyAvLzAKKwkqdGFnKysgPSA3OworCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHhlMDsKKwkqdGFnKysgPSAweDRjOworCSp0YWcrKyA9IDB4MDE7Ly81CisJKnRhZysrID0gMHgwMjsKKwkqdGFnKysgPSAweDExOworCSp0YWcrKyA9IDB4MDA7CisKKwkqdGFnX3AgPSB0YWc7CisJcHJpbnRrKEtFUk5fQUxFUlQgIlRoaXMgaXMgZW5hYmxlIHR1cmJvIG1vZGUgSUUgcHJvY2Vzc1xuIik7Cit9CisjZW5kaWYKKwordm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5oOworCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArMSkgJSBNR01UX1FVRVVFX05VTTsKKworLyoKKyAqIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dCB3ZSBoYXZlIG5ld2VyIGZyYW1lcyB0aGVuCisgKiBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9sZGVzdC4KKyAqCisgKiBpZiAobmggPT0gaWVlZS0+bWdtdF9xdWV1ZV90YWlsKQorICoJCXJldHVybiAtMTsKKyAqLworCWllZWUtPm1nbXRfcXVldWVfaGVhZCA9IG5oOworCWllZWUtPm1nbXRfcXVldWVfcmluZ1tuaF0gPSBza2I7CisKKwkvL3JldHVybiAwOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpyZXQ7CisKKwlpZihpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IGllZWUtPm1nbXRfcXVldWVfcmluZ1tpZWVlLT5tZ210X3F1ZXVlX3RhaWxdOworCisJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0KKwkJKGllZWUtPm1nbXRfcXVldWVfdGFpbCsxKSAlIE1HTVRfUVVFVUVfTlVNOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpbml0X21nbXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+bWdtdF9xdWV1ZV90YWlsID0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkID0gMDsKK30KKwordTggTWdudFF1ZXJ5X01nbnRGcmFtZVR4UmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUICAgICAgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJdTggcmF0ZTsKKworCS8vIDIwMDgvMDEvMjUgTUggRm9yIGJyb2FkY29tLCBNR05UIGZyYW1lIHNldCBhcyBPRkRNIDZNLgorCWlmKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNKQorCQlyYXRlID0gMHgwYzsKKwllbHNlCisJCXJhdGUgPSBpZWVlLT5iYXNpY19yYXRlICYgMHg3ZjsKKworCWlmKHJhdGUgPT0gMCl7CisJCS8vIDIwMDUuMDEuMjYsIGJ5IHJjbmprby4KKwkJaWYoaWVlZS0+bW9kZSA9PSBJRUVFX0F8fAorCQkgICBpZWVlLT5tb2RlPT0gSUVFRV9OXzVHfHwKKwkJICAgKGllZWUtPm1vZGU9PSBJRUVFX05fMjRHJiYhcEhUSW5mby0+YkN1clN1cHBDQ0spKQorCQkJcmF0ZSA9IDB4MGM7CisJCWVsc2UKKwkJCXJhdGUgPSAweDAyOworCX0KKworCS8qCisJLy8gRGF0YSByYXRlIG9mIFByb2JlUmVxIGlzIGFscmVhZHkgZGVjaWRlZC4gQW5uaWUsIDIwMDUtMDMtMzEKKwlpZiggcE1nbnRJbmZvLT5iU2NhbkluUHJvZ3Jlc3MgfHwgKHBNZ250SW5mby0+YkR1YWxNb2RlU2NhblN0ZXAhPTApICkKKwl7CisJaWYocE1nbnRJbmZvLT5kb3QxMUN1cnJlbnRXaXJlbGVzc01vZGU9PVdJUkVMRVNTX01PREVfQSkKKwlyYXRlID0gMHgwYzsKKwllbHNlCisJcmF0ZSA9IDB4MDI7CisJfQorCSAqLworCXJldHVybiByYXRlOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3N0YV93YWtldXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IG5sKTsKKworaW5saW5lIHZvaWQgc29mdG1hY19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlcj0KKwkJKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqKSBza2ItPmRhdGE7CisKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyA4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcmFtIDAsIG5vIG1nbXQgbG9jayByZXF1aXJlZCAqLworCWllZWU4MDIxMV9zdGFfd2FrZXVwKGllZWUsMCk7CisKKwl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBNR05UX1FVRVVFOworCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKGllZWUpOworCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OworCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKKwl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKKworCWlmKHNpbmdsZSl7CisJCWlmKGllZWUtPnF1ZXVlX3N0b3ApeworCQkJZW5xdWV1ZV9tZ210KGllZWUsc2tiKTsKKwkJfWVsc2V7CisJCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXTw8NCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkJLyogYXZvaWQgd2F0Y2hkb2cgdHJpZ2dlcnMgKi8KKwkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl9ZWxzZXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFncyk7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCS8qIGNoZWNrIHdldGhlciB0aGUgbWFuYWdlZCBwYWNrZXQgcXVldWVkIGdyZWF0ZXIgdGhhbiA1ICovCisJCWlmKCFpZWVlLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoaWVlZS0+ZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fFwKKwkJCQkoc2tiX3F1ZXVlX2xlbigmaWVlZS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pICE9IDApfHxcCisJCQkJKGllZWUtPnF1ZXVlX3N0b3ApICkgeworCQkJLyogaW5zZXJ0IHRoZSBza2IgcGFja2V0IHRvIHRoZSBtYW5hZ2VtZW50IHF1ZXVlICovCisJCQkvKiBhcyBmb3IgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24sIGl0IGRvZXMgbm90IG5lZWQKKwkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgorCQkJICogKi8KKwkJCXByaW50aygiJXMoKTppbnNlcnQgdG8gd2FpdHF1ZXVlIVxuIixfX0ZVTkNUSU9OX18pOworCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLCBza2IpOworCQl9IGVsc2UgeworCQkJLy9wcmludGsoIlRYIHBhY2tldCFcbiIpOworCQkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGllZWUtPmRldik7CisJCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCX0KK30KKworaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhlYWRlciA9CisJCShzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisKKwlpZihzaW5nbGUpeworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLworCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCisJfWVsc2V7CisKKwkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQllbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCWllZWUtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYixpZWVlLT5kZXYpOworCisJfQorCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLHJhdGVfbGVuOworCXU4ICp0YWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKnJlcTsKKworCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKworCXJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpICsKKwkJCSAgICAyICsgbGVuICsgcmF0ZV9sZW4gKyBpZWVlLT50eF9oZWFkcm9vbSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwlyZXEgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0ICopIHNrYl9wdXQoc2tiLHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QpKTsKKwlyZXEtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKKwlyZXEtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUU6IGlzIHRoaXMgT0sgPworCisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIxLCAweGZmLCBFVEhfQUxFTik7CisJbWVtY3B5KHJlcS0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CisKKwl0YWcgPSAodTggKikgc2tiX3B1dChza2IsbGVuKzIrcmF0ZV9sZW4pOworCisJKnRhZysrID0gTUZJRV9UWVBFX1NTSUQ7CisJKnRhZysrID0gbGVuOworCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBsZW4pOworCXRhZyArPSBsZW47CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCZ0YWcpOworCWllZWU4MDIxMV9NRklFX0dyYXRlKGllZWUsJnRhZyk7CisJcmV0dXJuIHNrYjsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uXyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Cit2b2lkIGllZWU4MDIxMV9zZW5kX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWlmKCFpZWVlLT5pZWVlX3VwKQorCQlyZXR1cm47CisJLy91bnNpZ25lZCBsb25nIGZsYWdzOworCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKKworCWlmIChza2IpeworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9CisvLwlpZWVlLT5iZWFjb25fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworLy8JCShNU0VDUyggaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAtNSkpOworCisJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCWlmKGllZWUtPmJlYWNvbl90eGluZyAmJiBpZWVlLT5pZWVlX3VwKXsKKy8vCQlpZighdGltZXJfcGVuZGluZygmaWVlZS0+YmVhY29uX3RpbWVyKSkKKy8vCQkJYWRkX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOworCQltb2RfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcixqaWZmaWVzKyhNU0VDUyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsLTUpKSk7CisJfQorCS8vc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiKHVuc2lnbmVkIGxvbmcgX2llZWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPQorCQkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikgX2llZWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOworCWllZWU4MDIxMV9zZW5kX2JlYWNvbihpZWVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGllZWU4MDIxMV9wcm9iZV9yZXEoaWVlZSk7CisJaWYgKHNrYil7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnErKzsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPmFjdGl2ZV9zY2FuICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1BST0JFUlEpKXsKKwkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CisJCWllZWU4MDIxMV9zZW5kX3Byb2JlKGllZWUpOworCX0KK30KKworLyogdGhpcyBwZXJmb3JtcyBzeW5jcm8gc2NhbiBibG9ja2luZyB0aGUgY2FsbGVyIHVudGlsIGFsbCBjaGFubmVscworICogaW4gdGhlIGFsbG93ZWQgY2hhbm5lbCBtYXAgaGFzIGJlZW4gY2hlY2tlZC4KKyAqLwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzaG9ydCBjaCA9IDA7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKwltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKyNlbmRpZgorCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKworCXdoaWxlKDEpCisJeworCisJCWRveworCQkJY2grKzsKKwkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKKwkJCQlnb3RvIG91dDsgLyogc2NhbiBjb21wbGV0ZWQgKi8KKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJCX13aGlsZSghY2hhbm5lbF9tYXBbY2hdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbmRpZgorCisJCS8qIHRoaXMgZnVjdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCisJCSAqIDEtIFdlIGhhdmUgc3dpdGNoZWQgdG8gYWQtaG9jIG1vZGUgYW5kIHdlIGFyZQorCQkgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCisJCSAqICAgIHRoZXJlIGFyZSBubyBpbnRlcmVzdGluZyBjZWxsIGFuZCB0byBjcmVhdGUgYQorCQkgKiAgICBuZXcgb25lLiBJbiB0aGlzIGNhc2UgdGhlIGxpbmsgc3RhdGUgaXMKKwkJICogICAgSUVFRTgwMjExX05PTElOSyB1bnRpbCB3ZSBmb3VuZCBhbiBpbnRlcmVzdGluZyBjZWxsLgorCQkgKiAgICBJZiBzbyB0aGUgaWVlZTgwMjFfbmV3X25ldCwgY2FsbGVkIGJ5IHRoZSBSWCBwYXRoCisJCSAqICAgIHdpbGwgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTElOS0VELCBzbyB3ZSBzdG9wCisJCSAqICAgIHNjYW5uaW5nCisJCSAqIDItIFdlIGFyZSBsaW5rZWQgYW5kIHRoZSByb290IHVzZXMgcnVuIGl3bGlzdCBzY2FuLgorCQkgKiAgICBTbyB3ZSBzd2l0Y2ggdG8gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyB0byByZW1lbWJlcgorCQkgKiAgICB0aGF0IHdlIGFyZSBzdGlsbCBsb2dpY2FsbHkgbGlua2VkIChub3QgaW50ZXJlc3RlZCBpbgorCQkgKiAgICBuZXcgbmV0d29yayBldmVudHMsIGRlc3BpdGUgZm9yIHVwZGF0aW5nIHRoZSBuZXQgbGlzdCwKKwkJICogICAgYnV0IHdlIGFyZSB0ZW1wb3Jhcmx5ICd1bmxpbmtlZCcgYXMgdGhlIGRyaXZlciBzaGFsbAorCQkgKiAgICBub3QgZmlsdGVyIFJYIGZyYW1lcyBhbmQgdGhlIGNoYW5uZWwgaXMgY2hhbmdpbmcuCisJCSAqIFNvIHRoZSBvbmx5IHNpdHVhdGlvbiBpbiB3aXRjaCBhcmUgaW50ZXJlc3RlZCBpcyB0byBjaGVjaworCQkgKiBpZiB0aGUgc3RhdGUgYmVjb21lIExJTktFRCBiZWNhdXNlIG9mIHRoZSAjMSBzaXR1YXRpb24KKwkJICovCisKKwkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCQlnb3RvIG91dDsKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaCk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZihjaGFubmVsX21hcFtjaF0gPT0gMSkKKyNlbmRpZgorCQlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhpZWVlKTsKKworCQkvKiB0aGlzIHByZXZlbnQgZXhjZXNzaXZlIHRpbWUgd2FpdCB3aGVuIHdlCisJCSAqIG5lZWQgdG8gd2FpdCBmb3IgYSBzeW5jcm8gc2NhbiB0byBlbmQuLgorCQkgKi8KKwkJaWYoaWVlZS0+c3RhdGUgPCBJRUVFODAyMTFfTElOS0VEKQorCQkJOworCQllbHNlCisJCWlmIChpZWVlLT5zeW5jX3NjYW5faHVycnl1cCkKKwkJCWdvdG8gb3V0OworCisKKwkJbXNsZWVwX2ludGVycnVwdGlibGVfcnNsKElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRSk7CisKKwl9CitvdXQ6CisJaWYoaWVlZS0+c3RhdGUgPCBJRUVFODAyMTFfTElOS0VEKXsKKwkJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwkJdXAoJmllZWUtPnNjYW5fc2VtKTsKKwl9CisJZWxzZXsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisjZW5kaWYKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworfQorfQorCisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOworCXN0YXRpYyBzaG9ydCB3YXRjaGRvZyA9IDA7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKwltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKyNlbmRpZgorCWlmKCFpZWVlLT5pZWVlX3VwKQorCQlyZXR1cm47CisJZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCWRveworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9CisJCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKKwkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCXsKKwkJLy9pZiBjdXJyZW50IGNoYW5uZWwgaXMgbm90IGluIGNoYW5uZWwgbWFwLCBzZXQgdG8gZGVmYXVsdCBjaGFubmVsLgorCQkjaWZkZWYgRU5BQkxFX0RPVDExRAorCQkJaWYgKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworCQkjZWxzZQorCQkJaWYgKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOworCQkjZW5kaWYKKwkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IDY7CisJCQkJZ290byBvdXQ7IC8qIG5vIGdvb2QgY2hhbnMgKi8KKwkJfQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwl9d2hpbGUoIWNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisjZWxzZQorCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKKyNlbmRpZgorCWlmIChpZWVlLT5zY2FubmluZyA9PSAwICkKKwkJZ290byBvdXQ7CisJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQorI2VuZGlmCisJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7CisKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKKworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJcmV0dXJuOworb3V0OgorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOworI2VuZGlmCisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwl3YXRjaGRvZyA9IDA7CisJaWVlZS0+c2Nhbm5pbmcgPSAwOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7Cit9CisKKworCit2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKKworCWllZWUtPmJlYWNvbl90eGluZyA9IDE7CisJaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworfQorCit2b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7CisKKwlpZWVlLT5iZWFjb25fdHhpbmcgPSAwOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5iZWFjb25fdGltZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOworCit9CisKKwordm9pZCBpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+c3RvcF9zZW5kX2JlYWNvbnMpCisJCWllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKGllZWUtPmRldik7CisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKKwkJaWVlZTgwMjExX2JlYWNvbnNfc3RvcChpZWVlKTsKK30KKworCit2b2lkIGllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYoaWVlZS0+c3RhcnRfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMoaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCWlmKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQkVBQ09OUykKKwkJaWVlZTgwMjExX2JlYWNvbnNfc3RhcnQoaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisvLwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLy9pZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPnNjYW5uaW5nID09IDEpeworCQlpZWVlLT5zY2FubmluZyA9IDA7CisKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKKwl9CisKKy8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl1cCgmaWVlZS0+c2Nhbl9zZW0pOworfQorCit2b2lkIGllZWU4MDIxMV9zdG9wX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikKKwkJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKGllZWUpOworCWVsc2UKKwkJaWVlZS0+c3RvcF9zY2FuKGllZWUtPmRldik7Cit9CisKKy8qIGNhbGxlZCB3aXRoIGllZWUtPmxvY2sgaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCisJeworCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQorCQl7CisJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKXsKKwkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApeworCQkJaWVlZS0+c2Nhbm5pbmcgPSAxOworCQkJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCAwKTsKKwkJfQorCX1lbHNlCisJCWllZWUtPnN0YXJ0X3NjYW4oaWVlZS0+ZGV2KTsKKworfQorCisvKiBjYWxsZWQgd2l0aCB3eF9zZW0gaGVsZCAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCXsKKwkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJeworCQkJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCQl9CisJfQorI2VuZGlmCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCisJCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKGllZWUpOworCWVsc2UKKwkJaWVlZS0+c2Nhbl9zeW5jcm8oaWVlZS0+ZGV2KTsKKworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjaGFsbGVuZ2VsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphdXRoOworCWludCBsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgKyBjaGFsbGVuZ2VsZW4gKyBpZWVlLT50eF9oZWFkcm9vbTsKKworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCWlmICghc2tiKSByZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCWF1dGggPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pKTsKKworCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBJRUVFODAyMTFfU1RZUEVfQVVUSDsKKwlpZiAoY2hhbGxlbmdlbGVuKSBhdXRoLT5oZWFkZXIuZnJhbWVfY3RsIHw9IElFRUU4MDIxMV9GQ1RMX1dFUDsKKworCWF1dGgtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDB4MDEzYTsgLy9GSVhNRQorCisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwkvL2F1dGgtPmFsZ29yaXRobSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlpZihpZWVlLT5hdXRoX21vZGUgPT0gMCkKKwkJYXV0aC0+YWxnb3JpdGhtID0gV0xBTl9BVVRIX09QRU47CisJZWxzZSBpZihpZWVlLT5hdXRoX21vZGUgPT0gMSkKKwkJYXV0aC0+YWxnb3JpdGhtID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJZWxzZSBpZihpZWVlLT5hdXRoX21vZGUgPT0gMikKKwkJYXV0aC0+YWxnb3JpdGhtID0gV0xBTl9BVVRIX09QRU47Ly8weDgwOworCXByaW50aygiPT09PT09PT09PT09PT09PT0+JXMoKTphdXRoLT5hbGdvcml0aG0gaXMgJWRcbiIsX19GVU5DVElPTl9fLGF1dGgtPmFsZ29yaXRobSk7CisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNihpZWVlLT5hc3NvY2lhdGVfc2VxKTsKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisKKwlhdXRoLT5zdGF0dXMgPSBjcHVfdG9fbGUxNihXTEFOX1NUQVRVU19TVUNDRVNTKTsKKworCXJldHVybiBza2I7CisKK30KKworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYqIGllZWU4MDIxMV9wcm9iZV9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKwl1OCAqdGFnOworCWludCBiZWFjb25fc2l6ZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiZWFjb25fYnVmOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCBlbmNyeXB0OworCWludCBhdGltX2xlbixlcnBfbGVuOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisKKwljaGFyICpzc2lkID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQ7CisJaW50IHNzaWRfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCWludCByYXRlX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4rMjsKKwlpbnQgcmF0ZV9leF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuOworCWludCB3cGFfaWVfbGVuID0gaWVlZS0+d3BhX2llX2xlbjsKKwl1OCBlcnBpbmZvX2NvbnRlbnQgPSAwOworCisJdTgqIHRtcF9odF9jYXBfYnVmOworCXU4IHRtcF9odF9jYXBfbGVuPTA7CisJdTgqIHRtcF9odF9pbmZvX2J1ZjsKKwl1OCB0bXBfaHRfaW5mb19sZW49MDsKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXU4KiB0bXBfZ2VuZXJpY19pZV9idWY9TlVMTDsKKwl1OCB0bXBfZ2VuZXJpY19pZV9sZW49MDsKKworCWlmKHJhdGVfZXhfbGVuID4gMCkgcmF0ZV9leF9sZW4rPTI7CisKKwlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKQorCQlhdGltX2xlbiA9IDQ7CisJZWxzZQorCQlhdGltX2xlbiA9IDA7CisKKwlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykpCisJCWVycF9sZW4gPSAzOworCWVsc2UKKwkJZXJwX2xlbiA9IDA7CisKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKworCisJZW5jcnlwdCA9IGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmCisJCSgoMCA9PSBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpIHx8IHdwYV9pZV9sZW4pKTsKKwkvL0hUIHJhbGF0ZWQgZWxlbWVudAorCXRtcF9odF9jYXBfYnVmID0odTgqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJdG1wX2h0X2NhcF9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKKwl0bXBfaHRfaW5mb19idWYgPSh1OCopICYoaWVlZS0+cEhUSW5mby0+U2VsZkhUSW5mbyk7CisJdG1wX2h0X2luZm9fbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVEluZm8pOworCUhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoaWVlZSwgdG1wX2h0X2NhcF9idWYsICZ0bXBfaHRfY2FwX2xlbixlbmNyeXB0KTsKKwlIVENvbnN0cnVjdEluZm9FbGVtZW50KGllZWUsdG1wX2h0X2luZm9fYnVmLCZ0bXBfaHRfaW5mb19sZW4sIGVuY3J5cHQpOworCisKKwlpZihwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKKwl7CisJCXRtcF9nZW5lcmljX2llX2J1ZiA9IGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXI7CisJCXRtcF9nZW5lcmljX2llX2xlbiA9IHNpemVvZihpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyKTsKKwkJSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoaWVlZSwgdG1wX2dlbmVyaWNfaWVfYnVmLCAmdG1wX2dlbmVyaWNfaWVfbGVuKTsKKwl9CisvLwlwcmludGsoIj09PT09PT09PT09PT09PT50bXBfaHRfY2FwX2xlbiBpcyAlZCx0bXBfaHRfaW5mb19sZW4gaXMgJWQsIHRtcF9nZW5lcmljX2llX2xlbiBpcyAlZFxuIix0bXBfaHRfY2FwX2xlbix0bXBfaHRfaW5mb19sZW4sdG1wX2dlbmVyaWNfaWVfbGVuKTsKKwliZWFjb25fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKSsyKworCQlzc2lkX2xlbgorCQkrMyAvL2NoYW5uZWwKKwkJK3JhdGVfbGVuCisJCStyYXRlX2V4X2xlbgorCQkrYXRpbV9sZW4KKwkJK2VycF9sZW4KKwkJK3dwYV9pZV9sZW4KKwkvLwkrdG1wX2h0X2NhcF9sZW4KKwkvLwkrdG1wX2h0X2luZm9fbGVuCisJLy8JK3RtcF9nZW5lcmljX2llX2xlbgorLy8JCSt3bW1fbGVuKzIKKwkJK2llZWUtPnR4X2hlYWRyb29tOworCXNrYiA9IGRldl9hbGxvY19za2IoYmVhY29uX3NpemUpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKwliZWFjb25fYnVmID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UqKSBza2JfcHV0KHNrYiwgKGJlYWNvbl9zaXplIC0gaWVlZS0+dHhfaGVhZHJvb20pKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMSwgZGVzdCxFVEhfQUxFTik7CisJbWVtY3B5IChiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwliZWFjb25fYnVmLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOyAvL0ZJWE1FCisJYmVhY29uX2J1Zi0+YmVhY29uX2ludGVydmFsID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCk7CisJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSA9CisJCWNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCWJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpOyAvL2FkZCBzaG9ydCBwcmVhbWJsZSBoZXJlCisKKwlpZihpZWVlLT5zaG9ydF9zbG90ICYmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSkKKwkJY3B1X3RvX2xlMTYoKGJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKTsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwlpZiAoZW5jcnlwdCkKKwkJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisKKworCWJlYWNvbl9idWYtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmlkID0gTUZJRV9UWVBFX1NTSUQ7CisJYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmxlbiA9IHNzaWRfbGVuOworCisJdGFnID0gKHU4KikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmRhdGE7CisKKwltZW1jcHkodGFnLCBzc2lkLCBzc2lkX2xlbik7CisKKwl0YWcgKz0gc3NpZF9sZW47CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFUzsKKwkqKHRhZysrKSA9IHJhdGVfbGVuLTI7CisJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXMscmF0ZV9sZW4tMik7CisJdGFnKz1yYXRlX2xlbi0yOworCisJKih0YWcrKykgPSBNRklFX1RZUEVfRFNfU0VUOworCSoodGFnKyspID0gMTsKKwkqKHRhZysrKSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCisJaWYoYXRpbV9sZW4peworCXUxNiB2YWwxNjsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfSUJTU19TRVQ7CisJCSoodGFnKyspID0gMjsKKwkJLy8qKCh1MTYqKSh0YWcpKSA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisJCSB2YWwxNiA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisJCW1lbWNweSgodTggKil0YWcsICh1OCAqKSZ2YWwxNiwgMik7CisJCXRhZys9MjsKKwl9CisKKwlpZihlcnBfbGVuKXsKKwkJKih0YWcrKykgPSBNRklFX1RZUEVfRVJQOworCQkqKHRhZysrKSA9IDE7CisJCSoodGFnKyspID0gZXJwaW5mb19jb250ZW50OworCX0KKwlpZihyYXRlX2V4X2xlbil7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTX0VYOworCQkqKHRhZysrKSA9IHJhdGVfZXhfbGVuLTI7CisJCW1lbWNweSh0YWcsaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4LHJhdGVfZXhfbGVuLTIpOworCQl0YWcrPXJhdGVfZXhfbGVuLTI7CisJfQorCisJaWYgKHdwYV9pZV9sZW4pCisJeworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQl7Ly9hcyBXaW5kb3dzIHdpbGwgc2V0IHBhaXJ3aXNlIGtleSBzYW1lIGFzIHRoZSBncm91cCBrZXkgd2hpY2ggaXMgbm90IGFsbG93ZWQgaW4gTGludXgsIHNvIHNldCB0aGlzIGZvciBJT1QgaXNzdWUuIFdCIDIwMDguMDcuMDcKKwkJCW1lbWNweSgmaWVlZS0+d3BhX2llWzE0XSwgJmllZWUtPndwYV9pZVs4XSwgNCk7CisJCX0KKwkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKwkJdGFnICs9IHdwYV9pZV9sZW47CisJfQorCisJLy9za2ItPmRldiA9IGllZWUtPmRldjsKKwlyZXR1cm4gc2tiOworfQorCisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXNzb2NfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCogdGFnOworCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKKwlzaG9ydCBlbmNyeXB0OworCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSArIHJhdGVfbGVuICsgaWVlZS0+dHhfaGVhZHJvb207CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCWFzc29jID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikKKwkJc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKKworCWFzc29jLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJYXNzb2MtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSID8KKwkJV0xBTl9DQVBBQklMSVRZX0JTUyA6IFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKworCisJaWYoaWVlZS0+c2hvcnRfc2xvdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCisJaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWVsc2UgY3J5cHQgPSBOVUxMOworCisJZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisKKwlpZiAoZW5jcnlwdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJYXNzb2MtPnN0YXR1cyA9IDA7CisJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOworCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKKworCXRhZyA9ICh1OCopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisKKwlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKKwlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXV0aF9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLGludCBzdGF0dXMsIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKwlpbnQgbGVuID0gaWVlZS0+dHhfaGVhZHJvb20gKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikrMTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYi0+bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCisJYXV0aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopc2tiLT5kYXRhOworCisJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKKwlhdXRoLT50cmFuc2FjdGlvbiA9IGNwdV90b19sZTE2KDIpOworCWF1dGgtPmFsZ29yaXRobSA9IGNwdV90b19sZTE2KFdMQU5fQVVUSF9PUEVOKTsKKworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOworCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVVUSCk7CisJcmV0dXJuIHNrYjsKKworCit9CisKK3N0cnVjdCBza19idWZmKiBpZWVlODAyMTFfbnVsbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLHNob3J0IHB3cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBoZHI7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKilza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCW1lbWNweShoZHItPmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCWhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAorCQlJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMgfCBJRUVFODAyMTFfRkNUTF9UT0RTIHwKKwkJKHB3ciA/IElFRUU4MDIxMV9GQ1RMX1BNOjApKTsKKworCXJldHVybiBza2I7CisKKworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KiBkZXN0KQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXNzb2NfcmVzcChpZWVlLCBkZXN0KTsKKworCWlmIChidWYpCisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzcF90b19hdXRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgcywgdTgqIGRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9hdXRoX3Jlc3AoaWVlZSwgcywgZGVzdCk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCisKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgZGVzdCk7CisJaWYgKGJ1ZikKKwkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKK30KKworCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKKwl1OCAqdGFnOy8vLCpyc25faWU7CisJLy9zaG9ydCBpbmZvX2FkZHIgPSAwOworCS8vaW50IGk7CisJLy91MTYgc3VpdGVfY291bnQgPSAwOworCS8vdTggc3VpdF9zZWxlY3QgPSAwOworCS8vdW5zaWduZWQgaW50IHdwYV9sZW4gPSBiZWFjb24tPndwYV9pZV9sZW47CisJLy9mb3IgSFQKKwl1OCogaHRfY2FwX2J1ZiA9IE5VTEw7CisJdTggaHRfY2FwX2xlbj0wOworCXU4KiByZWFsdGVrX2llX2J1Zj1OVUxMOworCXU4IHJlYWx0ZWtfaWVfbGVuPTA7CisJaW50IHdwYV9pZV9sZW49IGllZWUtPndwYV9pZV9sZW47CisJdW5zaWduZWQgaW50IGNraXBfaWVfbGVuPTA7CisJdW5zaWduZWQgaW50IGNjeHJtX2llX2xlbj0wOworCXVuc2lnbmVkIGludCBjeHZlcm51bV9pZV9sZW49MDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCWludCBlbmNyeXB0OworCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJdW5zaWduZWQgaW50IHdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+cW9zX2RhdGEuc3VwcG9ydGVkPzk6MDsKKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl1bnNpZ25lZCBpbnQgdHVyYm9faW5mb19sZW4gPSBiZWFjb24tPlR1cmJvX0VuYWJsZT85OjA7CisjZW5kaWYKKworCWludCBsZW4gPSAwOworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJiAoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsIldFUCIpIHx8IHdwYV9pZV9sZW4pKTsKKworCS8vSW5jbHVkZSBIaWdoIFRocm91cHV0IGNhcGFiaWxpdHkgJiYgUmVhbHRlayBwcm9wcmlldGFyeQorCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpCisJeworCQlodF9jYXBfYnVmID0gKHU4KikmKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJCWh0X2NhcF9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKKwkJSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChpZWVlLCBodF9jYXBfYnVmLCAmaHRfY2FwX2xlbiwgZW5jcnlwdCk7CisJCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbikKKwkJeworCQkJcmVhbHRla19pZV9idWYgPSBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyOworCQkJcmVhbHRla19pZV9sZW4gPSBzaXplb2YoIGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXIpOworCQkJSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoaWVlZSwgcmVhbHRla19pZV9idWYsICZyZWFsdGVrX2llX2xlbik7CisKKwkJfQorCX0KKwlpZihpZWVlLT5xb3Nfc3VwcG9ydCl7CisJCXdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+cW9zX2RhdGEuc3VwcG9ydGVkPzk6MDsKKwl9CisKKworCWlmKGJlYWNvbi0+YkNraXBTdXBwb3J0ZWQpCisJeworCQlja2lwX2llX2xlbiA9IDMwKzI7CisJfQorCWlmKGJlYWNvbi0+YkNjeFJtRW5hYmxlKQorCXsKKwkJY2N4cm1faWVfbGVuID0gNisyOworCX0KKwlpZiggYmVhY29uLT5Cc3NDY3hWZXJOdW1iZXIgPj0gMiApCisJeworCQljeHZlcm51bV9pZV9sZW4gPSA1KzI7CisJfQorI2lmZGVmIFRIT01BU19UVVJCTworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKyAyCisJCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAorCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCisJCSsgd3BhX2llX2xlbgorCQkrIHdtbV9pbmZvX2xlbgorCQkrIHR1cmJvX2luZm9fbGVuCisJCSsgaHRfY2FwX2xlbgorCQkrIHJlYWx0ZWtfaWVfbGVuCisJCSsgY2tpcF9pZV9sZW4KKwkJKyBjY3hybV9pZV9sZW4KKwkJKyBjeHZlcm51bV9pZV9sZW4KKwkJKyBpZWVlLT50eF9oZWFkcm9vbTsKKyNlbHNlCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrIDIKKwkJKyBiZWFjb24tPnNzaWRfbGVuLy9lc3NpZCB0YWdnZWQgdmFsCisJCSsgcmF0ZV9sZW4vL3JhdGVzIHRhZ2dlZCB2YWwKKwkJKyB3cGFfaWVfbGVuCisJCSsgd21tX2luZm9fbGVuCisJCSsgaHRfY2FwX2xlbgorCQkrIHJlYWx0ZWtfaWVfbGVuCisJCSsgY2tpcF9pZV9sZW4KKwkJKyBjY3hybV9pZV9sZW4KKwkJKyBjeHZlcm51bV9pZV9sZW4KKwkJKyBpZWVlLT50eF9oZWFkcm9vbTsKKyNlbmRpZgorCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICopCisJCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsyKTsKKworCisJaGRyLT5oZWFkZXIuZnJhbWVfY3RsID0gSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUTsKKwloZHItPmhlYWRlci5kdXJhdGlvbl9pZD0gMzc7IC8vRklYTUUKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKworCW1lbWNweShpZWVlLT5hcF9tYWNfYWRkciwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOy8vZm9yIEhXIHNlY3VyaXR5LCBKb2huCisKKwloZHItPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfQlNTKTsKKwlpZiAoYmVhY29uLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7IC8vYWRkIHNob3J0X3ByZWFtYmxlIGhlcmUKKworCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCk7CisJaWYgKHdtbV9pbmZvX2xlbikgLy9RT1MKKwloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1FPUyk7CisKKwloZHItPmxpc3Rlbl9pbnRlcnZhbCA9IDB4YTsgLy9GSVhNRQorCisJaGRyLT5pbmZvX2VsZW1lbnRbMF0uaWQgPSBNRklFX1RZUEVfU1NJRDsKKworCWhkci0+aW5mb19lbGVtZW50WzBdLmxlbiA9IGJlYWNvbi0+c3NpZF9sZW47CisJdGFnID0gc2tiX3B1dChza2IsIGJlYWNvbi0+c3NpZF9sZW4pOworCW1lbWNweSh0YWcsIGJlYWNvbi0+c3NpZCwgYmVhY29uLT5zc2lkX2xlbik7CisKKwl0YWcgPSBza2JfcHV0KHNrYiwgcmF0ZV9sZW4pOworCisJaWVlZTgwMjExX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisJLy8gRm9yIENDWCAxIFMxMywgQ0tJUC4gQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDgtMTQuCisJaWYoIGJlYWNvbi0+YkNraXBTdXBwb3J0ZWQgKQorCXsKKwkJc3RhdGljIHU4CUFpcm9uZXRJZU91aVtdID0gezB4MDAsIDB4MDEsIDB4NjZ9OyAvLyAiNDUwMC1jbGllbnQiCisJCXU4CUNjeEFpcm9uZXRCdWZbMzBdOworCQlPQ1RFVF9TVFJJTkcJb3NDY3hBaXJvbmV0SUU7CisKKwkJbWVtc2V0KENjeEFpcm9uZXRCdWYsIDAsMzApOworCQlvc0NjeEFpcm9uZXRJRS5PY3RldCA9IENjeEFpcm9uZXRCdWY7CisJCW9zQ2N4QWlyb25ldElFLkxlbmd0aCA9IHNpemVvZihDY3hBaXJvbmV0QnVmKTsKKwkJLy8KKwkJLy8gUmVmLiBDQ1ggdGVzdCBwbGFuIHYzLjYxLCAzLjIuMy4xIHN0ZXAgMTMuCisJCS8vIFdlIHdhbnQgdG8gbWFrZSB0aGUgZGV2aWNlIHR5cGUgYXMgIjQ1MDAtY2xpZW50Ii4gMDYwOTI2LCBieSBDQ1cuCisJCS8vCisJCW1lbWNweShvc0NjeEFpcm9uZXRJRS5PY3RldCwgQWlyb25ldEllT3VpLCBzaXplb2YoQWlyb25ldEllT3VpKSk7CisKKwkJLy8gQ0NYMSBzcGVjIFYxLjEzLCBBMDEuMSBDS0lQIE5lZ290aWF0aW9uIChwYWdlMjMpOgorCQkvLyAiVGhlIENLSVAgbmVnb3RpYXRpb24gaXMgc3RhcnRlZCB3aXRoIHRoZSBhc3NvY2lhdGUgcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIGFjY2VzcyBwb2ludCwKKwkJLy8gIGNvbnRhaW5pbmcgYW4gQWlyb25ldCBlbGVtZW50IHdpdGggYm90aCB0aGUgTUlDIGFuZCBLUCBiaXRzIHNldC4iCisJCW9zQ2N4QWlyb25ldElFLk9jdGV0W0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dIHw9ICAoU1VQUE9SVF9DS0lQX1BLfFNVUFBPUlRfQ0tJUF9NSUMpIDsKKwkJdGFnID0gc2tiX3B1dChza2IsIGNraXBfaWVfbGVuKTsKKwkJKnRhZysrID0gTUZJRV9UWVBFX0FJUk9ORVQ7CisJCSp0YWcrKyA9IG9zQ2N4QWlyb25ldElFLkxlbmd0aDsKKwkJbWVtY3B5KHRhZyxvc0NjeEFpcm9uZXRJRS5PY3RldCxvc0NjeEFpcm9uZXRJRS5MZW5ndGgpOworCQl0YWcgKz0gb3NDY3hBaXJvbmV0SUUuTGVuZ3RoOworCX0KKworCWlmKGJlYWNvbi0+YkNjeFJtRW5hYmxlKQorCXsKKwkJc3RhdGljIHU4IENjeFJtQ2FwQnVmW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMSwgMHgwMSwgMHgwMH07CisJCU9DVEVUX1NUUklORyBvc0NjeFJtQ2FwOworCisJCW9zQ2N4Um1DYXAuT2N0ZXQgPSBDY3hSbUNhcEJ1ZjsKKwkJb3NDY3hSbUNhcC5MZW5ndGggPSBzaXplb2YoQ2N4Um1DYXBCdWYpOworCQl0YWcgPSBza2JfcHV0KHNrYixjY3hybV9pZV9sZW4pOworCQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsKKwkJKnRhZysrID0gb3NDY3hSbUNhcC5MZW5ndGg7CisJCW1lbWNweSh0YWcsb3NDY3hSbUNhcC5PY3RldCxvc0NjeFJtQ2FwLkxlbmd0aCk7CisJCXRhZyArPSBvc0NjeFJtQ2FwLkxlbmd0aDsKKwl9CisKKwlpZiggYmVhY29uLT5Cc3NDY3hWZXJOdW1iZXIgPj0gMiApCisJeworCQl1OAkJCUNjeFZlck51bUJ1ZltdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDB9OworCQlPQ1RFVF9TVFJJTkcJb3NDY3hWZXJOdW07CisJCUNjeFZlck51bUJ1Zls0XSA9IGJlYWNvbi0+QnNzQ2N4VmVyTnVtYmVyOworCQlvc0NjeFZlck51bS5PY3RldCA9IENjeFZlck51bUJ1ZjsKKwkJb3NDY3hWZXJOdW0uTGVuZ3RoID0gc2l6ZW9mKENjeFZlck51bUJ1Zik7CisJCXRhZyA9IHNrYl9wdXQoc2tiLGN4dmVybnVtX2llX2xlbik7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOworCQkqdGFnKysgPSBvc0NjeFZlck51bS5MZW5ndGg7CisJCW1lbWNweSh0YWcsb3NDY3hWZXJOdW0uT2N0ZXQsb3NDY3hWZXJOdW0uTGVuZ3RoKTsKKwkJdGFnICs9IG9zQ2N4VmVyTnVtLkxlbmd0aDsKKwl9CisJLy9IVCBjYXAgZWxlbWVudAorCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpeworCQlpZihpZWVlLT5wSFRJbmZvLT5lUGVlckhUU3BlY1ZlciAhPSBIVF9TUEVDX1ZFUl9FV0MpCisJCXsKKwkJCXRhZyA9IHNrYl9wdXQoc2tiLCBodF9jYXBfbGVuKTsKKwkJCSp0YWcrKyA9IE1GSUVfVFlQRV9IVF9DQVA7CisJCQkqdGFnKysgPSBodF9jYXBfbGVuIC0gMjsKKwkJCW1lbWNweSh0YWcsIGh0X2NhcF9idWYsaHRfY2FwX2xlbiAtMik7CisJCQl0YWcgKz0gaHRfY2FwX2xlbiAtMjsKKwkJfQorCX0KKworCisJLy9jaG9vc2Ugd2hhdCB3cGFfc3VwcGxpY2FudCBnaXZlcyB0byBhc3NvY2lhdGUuCisJdGFnID0gc2tiX3B1dChza2IsIHdwYV9pZV9sZW4pOworCWlmICh3cGFfaWVfbGVuKXsKKwkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKKwl9CisKKwl0YWcgPSBza2JfcHV0KHNrYix3bW1faW5mb19sZW4pOworCWlmKHdtbV9pbmZvX2xlbikgeworCSAgaWVlZTgwMjExX1dNTV9JbmZvKGllZWUsICZ0YWcpOworCX0KKyNpZmRlZiBUSE9NQVNfVFVSQk8KKwl0YWcgPSBza2JfcHV0KHNrYix0dXJib19pbmZvX2xlbik7CisJaWYodHVyYm9faW5mb19sZW4pIHsKKwkJaWVlZTgwMjExX1RVUkJPX0luZm8oaWVlZSwgJnRhZyk7CisJfQorI2VuZGlmCisKKwlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCYmaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKXsKKwkJaWYoaWVlZS0+cEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgPT0gSFRfU1BFQ19WRVJfRVdDKQorCQl7CisJCQl0YWcgPSBza2JfcHV0KHNrYiwgaHRfY2FwX2xlbik7CisJCQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsKKwkJCSp0YWcrKyA9IGh0X2NhcF9sZW4gLSAyOworCQkJbWVtY3B5KHRhZywgaHRfY2FwX2J1ZixodF9jYXBfbGVuIC0gMik7CisJCQl0YWcgKz0gaHRfY2FwX2xlbiAtMjsKKwkJfQorCisJCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbil7CisJCQl0YWcgPSBza2JfcHV0KHNrYiwgcmVhbHRla19pZV9sZW4pOworCQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCQkqdGFnKysgPSByZWFsdGVrX2llX2xlbiAtIDI7CisJCQltZW1jcHkodGFnLCByZWFsdGVrX2llX2J1ZixyZWFsdGVrX2llX2xlbiAtMiApOworCQl9CisJfQorLy8JcHJpbnRrKCI8PT09PT0lcygpLCAlcCwgJXBcbiIsIF9fRlVOQ1RJT05fXywgaWVlZS0+ZGV2LCBpZWVlLT5kZXYtPmRldl9hZGRyKTsKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlyZXR1cm4gc2tiOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZWVlLT5hc3NvY2lhdGVfc2VxKys7CisKKwkvKiBkb24ndCBzY2FuLCBhbmQgYXZvaWQgdG8gaGF2ZSB0aGUgUlggcGF0aCBwb3NzaWJpbHkKKwkgKiB0cnkgYWdhaW4gdG8gYXNzb2NpYXRlLiBFdmVuIGRvIG5vdCByZWFjdCB0byBBVVRIIG9yCisJICogQVNTT0MgcmVzcG9uc2UuIEp1c3Qgd2FpdCBmb3IgdGhlIHJldHJ5IHdxIHRvIGJlIHNjaGVkdWxlZC4KKwkgKiBIZXJlIHdlIHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIGdvb2QgbmV0cyB0byBhc3NvY2lhdGUKKwkgKiB3aXRoLCBzbyB3ZSByZXRyeSBvciBqdXN0IGdldCBiYWNrIHRvIE5PX0xJTksgYW5kIHNjYW5uaW5nCisJICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyl7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2F1dGhfcnMrKzsKKwl9ZWxzZXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkFzc29jaWF0aW9uIGZhaWxlZFxuIik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXNzX3JzKys7CisJfQorCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsIFwKKwkJCSAgIElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2IodW5zaWduZWQgbG9uZyBkZXYpCit7CisJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydCgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKikgZGV2KTsKK30KKworCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlJRUVFODAyMTFfREVCVUdfTUdNVCgiU3RvcHBpbmcgc2NhblxuIik7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKKwlza2I9aWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIDApOworCisJaWYgKCFza2IpCisJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJZWxzZXsKKwkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcgOworCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKKwkJLy9wcmludGsoS0VSTl9XQVJOSU5HICJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RcbiIpOworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkvL0JVR09OIHdoZW4geW91IHRyeSB0byBhZGRfdGltZXIgdHdpY2UsIHVzaW5nIG1vZF90aW1lciBtYXkgYmUgYmV0dGVyLCBqb2huMDcwOQorCQlpZighdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSl7CisJCQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogLyAyKTsKKwkJCWFkZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwkJfQorCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KK30KKwordm9pZCBpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKK3sKKwl1OCAqYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKy8vCWludCBobGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOworCisJc2tiID0gaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIGNobGVuKzIpOworCWlmICghc2tiKQorCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCWVsc2V7CisJCWMgPSBza2JfcHV0KHNrYiwgY2hsZW4rMik7CisJCSooYysrKSA9IE1GSUVfVFlQRV9DSEFMTEVOR0U7CisJCSooYysrKSA9IGNobGVuOworCQltZW1jcHkoYywgY2hhbGxlbmdlLCBjaGxlbik7CisKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIHJlc3BvbnNlXG4iKTsKKworCQlpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKSk7CisKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJbW9kX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIsIGppZmZpZXMgKyAoSFovMikpOworCQkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7Ly9lZGl0IGJ5IHRob21hcworCX0KKwlrZnJlZShjaGFsbGVuZ2UpOworfQorCit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKworCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGFzc29jaWF0aW9uIHJlcXVlc3RcbiIpOworCisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hc3NfcnErKzsKKwlza2I9aWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShiZWFjb24sIGllZWUpOworCWlmICghc2tiKQorCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCWVsc2V7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCW1vZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIpKTsKKwkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwl9Cit9Cit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfY29tcGxldGVfd3EpOworCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CisKKwkJaWVlZS0+cmF0ZSA9IDEwODsKKwkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKKwl9ZWxzZXsKKwkJaWVlZS0+cmF0ZSA9IDIyOworCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXM6JWRcbiIsIGllZWUtPnJhdGUpOworCX0KKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkKKwl7CisJCXByaW50aygiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQsIGh0IGVuYWJsZWRcbiIpOworCQlIVE9uQXNzb2NSc3AoaWVlZSk7CisJfQorCWVsc2UKKwl7CisJCXByaW50aygiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQsIGh0IG5vdCBlbmFibGVkKCVkLCAlZClcbiIsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0LCBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpOworCQltZW1zZXQoaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOworCQkvL0hUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCX0KKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtID0gMiAqICgxICsgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC81MDApOworCS8vIFRvIHByZXZlbnQgdGhlIGltbWVkaWF0ZWx5IGNhbGxpbmcgd2F0Y2hfZG9nIGFmdGVyIGFzc29jaWF0aW9uLgorCWlmKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCisJeworCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPSAxOworCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPSAxOworCX0KKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCWlmKGllZWUtPmlzX3NpbGVudF9yZXNldCA9PSAwKXsKKwkJcHJpbnRrKCI9PT09PT09PT09PT0+bm9ybWFsIGFzc29jaWF0ZVxuIik7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCX0KKwllbHNlIGlmKGllZWUtPmlzX3NpbGVudF9yZXNldCA9PSAxKQorCXsKKwkJcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+c2lsZW50IHJlc2V0IGFzc29jaWF0ZVxuIik7CisJCWllZWUtPmlzX3NpbGVudF9yZXNldCA9IDA7CisJfQorCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7Cit9CisKK3ZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKy8vCWludCBpOworLy8Jc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGllZWUtPmRldjsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwkvL2llZWUtPlVwZGF0ZUhhbFJBVFJUYWJsZUhhbmRsZXIoZGV2LCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0KTsKKwlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKK30KKwordm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3Byb2NlZHVyZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKwlwcmludGsoIj09PT4lcygpLCBjaGFuOiVkXG4iLCBfX0ZVTkNUSU9OX18sIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwkvL2llZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCUhUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSA9IDE7CisJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMShpZWVlKTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCitpbmxpbmUgdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKK3sKKwl1OCB0bXBfc3NpZFtJV19FU1NJRF9NQVhfU0laRSsxXTsKKwlpbnQgdG1wX3NzaWRfbGVuID0gMDsKKworCXNob3J0IGFwc2V0LHNzaWRzZXQsc3NpZGJyb2FkLGFwbWF0Y2gsc3NpZG1hdGNoOworCisJLyogd2UgYXJlIGludGVyZXN0ZWQgaW4gbmV3IG5ldyBvbmx5IGlmIHdlIGFyZSBub3QgYXNzb2NpYXRlZAorCSAqIGFuZCB3ZSBhcmUgbm90IGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcKKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX05PTElOSykKKwkJcmV0dXJuOworCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmICEobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpCisJCXJldHVybjsKKworCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAhKG5ldC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKKwkJcmV0dXJuOworCisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyl7CisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0aGUgQVAgTUFDLCB3ZSBuZWVkIGFsc28gdGhlIGVzc2lkCisJCSAqIFRoaXMgY291bGQgYmUgb2J0YWluZWQgYnkgYmVhY29ucyBvciwgaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QKKwkJICogYnJvYWRjYXN0IGl0LCBpdCBjYW4gYmUgcHV0IG1hbnVhbGx5LgorCQkgKi8KKwkJYXBzZXQgPSBpZWVlLT53YXBfc2V0Oy8vKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHplcm8sRVRIX0FMRU4pIT0wICk7CisJCXNzaWRzZXQgPSBpZWVlLT5zc2lkX3NldDsvL2llZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdICE9ICdcMCc7CisJCXNzaWRicm9hZCA9ICAhKG5ldC0+c3NpZF9sZW4gPT0gMCB8fCBuZXQtPnNzaWRbMF09PSAnXDAnKTsKKwkJYXBtYXRjaCA9IChtZW1jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBuZXQtPmJzc2lkLCBFVEhfQUxFTik9PTApOworCQlzc2lkbWF0Y2ggPSAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IG5ldC0+c3NpZF9sZW4pJiZcCisJCQkJKCFzdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXQtPnNzaWQsIG5ldC0+c3NpZF9sZW4pKTsKKworCisJCWlmICgJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBBUCBjaGVjayBpZiBtYXRjaC4KKwkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90IGJyb2FkY2FzdCBlc3NpZCB3ZSBjaGVjayB0aGUgdXNlciBzdXBwbHllZCBBTlkgZXNzaWQKKwkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkb2VzIG5vdCBzZXQgZXNzaWQgaXQgaXMgT0sKKwkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkaWQgc2V0IGVzc2lkIGNoZWNoIGlmIGVzc2lkIG1hdGNoCisJCQkgKi8KKwkJCSggYXBzZXQgJiYgYXBtYXRjaCAmJgorCQkJCSgoc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fCAoc3NpZGJyb2FkICYmICFzc2lkc2V0KSB8fCAoIXNzaWRicm9hZCAmJiBzc2lkc2V0KSkgKSB8fAorCQkJLyogaWYgdGhlIGFwIGlzIG5vdCBzZXQsIGNoZWNrIHRoYXQgdGhlIHVzZXIgc2V0IHRoZSBic3NpZAorCQkJICogYW5kIHRoZSBuZXR3b3JrIGRvZXMgYnJhZGNhc3QgYW5kIHRoYXQgdGhvc2UgdHdvIGJzc2lkIG1hdGNoZXMKKwkJCSAqLworCQkJKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpCisJCQkpeworCQkJCS8qIGlmIHRoZSBlc3NpZCBpcyBoaWRkZW4gcmVwbGFjZSBpdCB3aXRoIHRoZQorCQkJCSogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCisJCQkJKi8KKwkJCQlpZiAoIXNzaWRicm9hZCl7CisJCQkJCXN0cm5jcHkodG1wX3NzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7CisJCQkJCXRtcF9zc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwkJCQl9CisJCQkJbWVtY3B5KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIG5ldCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOworCisJCQkJaWYgKCFzc2lkYnJvYWQpeworCQkJCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCB0bXBfc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOworCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSB0bXBfc3NpZF9sZW47CisJCQkJfQorCQkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzLGNoYW5uZWw6JWQsIHFvczolZCwgbXlIVDolZCwgbmV0d29ya0hUOiVkXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsLCBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkLCBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCk7CisKKwkJCQkvL2llZWUtPnBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisJCQkJSFRSZXNldElPVFNldHRpbmcoaWVlZS0+cEhUSW5mbyk7CisJCQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisJCQkJCS8qIEpvaW4gdGhlIG5ldHdvcmsgZm9yIHRoZSBmaXJzdCB0aW1lICovCisJCQkJCWllZWUtPkFzb2NSZXRyeUNvdW50ID0gMDsKKwkJCQkJLy9mb3IgSFQgYnkgYW15IDA4MDUxNAorCQkJCQlpZigoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9PSAxKSAmJgorCQkJCQkgIC8vIChpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQgJiYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2h0LmJkU3VwcG9ydEhUKSkKKwkJCQkJICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2h0LmJkU3VwcG9ydEhUKQorLypXQiwgMjAwOC4wOS4wOTpiQ3VycmVudEhUU3VwcG9ydCBhbmQgYkVuYWJsZUhUIHR3byBmbGFncyBhcmUgZ29pbmcgdG8gcHV0IHRvZ2V0aGVyIHRvIGNoZWNrIHdoZXRoZXIgd2UgYXJlIGluIEhUIG5vdywgc28gbmVlZG4ndCB0byBjaGVjayBiRW5hYmxlSFQgZmxhZ3MgaGVyZS4gVGhhdCdzIGlzIHRvIHNheSB3ZSB3aWxsIHNldCB0byBIVCBzdXBwb3J0IHdoZW5ldmVyIGpvaW5lZCBBUCBoYXMgdGhlIGFiaWxpdHkgdG8gc3VwcG9ydCBIVC4gQW5kIHdoZXRoZXIgd2UgYXJlIGluIEhUIG9yIG5vdCwgcGxlYXNlIGNoZWNrIGJDdXJyZW50SFRTdXBwb3J0JiZiRW5hYmxlSFQgbm93IHBsZWFzZS4qLworCQkJCQl7CisJCQkJCS8vCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gdHJ1ZTsKKwkJCQkJCUhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKGllZWUsICYoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCQkJCQl9CisKKwkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCQl9ZWxzZXsKKwkJCQkJaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKKwkJCQkJCWllZWUtPnJhdGUgPSAxMDg7CisJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKKwkJCQkJfWVsc2V7CisJCQkJCQlpZWVlLT5yYXRlID0gMjI7CisJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0IpOworCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKKwkJCQkJfQorCQkJCQltZW1zZXQoaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOworCQkJCQkvL0hUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJCQkJfQorCisJCX0KKwl9CisKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisKKwkJLyogaWYgdGhlIHN0YXRlIGJlY29tZSBkaWZmZXJlbnQgdGhhdCBOT0xJTksgbWVhbnMKKwkJICogd2UgaGFkIGZvdW5kIHdoYXQgd2UgYXJlIHNlYXJjaGluZyBmb3IKKwkJICovCisKKwkJaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCQlicmVhazsKKworCQlpZiAoaWVlZS0+c2Nhbl9hZ2UgPT0gMCB8fCB0aW1lX2FmdGVyKHRhcmdldC0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQorCQlpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KGllZWUsIHRhcmdldCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKKworc3RhdGljIGlubGluZSB1MTYgYXV0aF9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCoqIGNoYWxsZW5nZSwgaW50ICpjaGxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphOworCXU4ICp0OworCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsc2tiLT5sZW4pOworCQlyZXR1cm4gMHhjYWZlOworCX0KKwkqY2hhbGxlbmdlID0gTlVMTDsKKwlhID0gKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24qKSBza2ItPmRhdGE7CisJaWYoc2tiLT5sZW4gPiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICszKSl7CisJCXQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CisKKwkJaWYoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpeworCQkJKmNobGVuID0gKih0KyspOworCQkJKmNoYWxsZW5nZSA9ICh1OCopa21hbGxvYygqY2hsZW4sIEdGUF9BVE9NSUMpOworCQkJbWVtY3B5KCpjaGFsbGVuZ2UsIHQsICpjaGxlbik7CisJCX0KKwl9CisKKwlyZXR1cm4gY3B1X3RvX2xlMTYoYS0+c3RhdHVzKTsKKworfQorCisKK2ludCBhdXRoX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTgqIGRlc3QpCit7CisJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKKworCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDogJWRcbiIsc2tiLT5sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKKworCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOworCisJaWYgKGxlMTZfdG9fY3B1KGEtPmFsZ29yaXRobSkgIT0gV0xBTl9BVVRIX09QRU4pCisJCXJldHVybiAgV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKKworCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgc2hvcnQgcHJvYmVfcnFfcGFyc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsIHU4ICpzcmMpCit7CisJdTggKnRhZzsKKwl1OCAqc2tiZW5kOworCXU4ICpzc2lkPU5VTEw7CisJdTggc3NpZGxlbiA9IDA7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICpoZWFkZXIgPQorCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqKSBza2ItPmRhdGE7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApKQorCQlyZXR1cm4gLTE7IC8qIGNvcnJ1cHRlZCAqLworCisJbWVtY3B5KHNyYyxoZWFkZXItPmFkZHIyLCBFVEhfQUxFTik7CisKKwlza2JlbmQgPSAodTgqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOworCisJdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKTsKKworCXdoaWxlICh0YWcrMSA8IHNrYmVuZCl7CisJCWlmICgqdGFnID09IDApeworCQkJc3NpZCA9IHRhZysyOworCQkJc3NpZGxlbiA9ICoodGFnKzEpOworCQkJYnJlYWs7CisJCX0KKwkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBsZW4gZmllbGQgKi8KKwkJdGFnID0gdGFnICsgKih0YWcpOyAvKiBwb2ludCB0byB0aGUgbGFzdCBkYXRhIGJ5dGUgb2YgdGhlIHRhZyAqLworCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIG5leHQgdGFnICovCisJfQorCisJLy9JRUVFODAyMTFETUVTRygiQ2FyZCBNQUMgYWRkcmVzcyBpcyAiTUFDU1RSLCBNQUMyU1RSKHNyYykpOworCWlmIChzc2lkbGVuID09IDApIHJldHVybiAxOworCisJaWYgKCFzc2lkKSByZXR1cm4gMTsgLyogc3NpZCBub3QgZm91bmQgaW4gdGFnZ2VkIHBhcmFtICovCisJcmV0dXJuICghc3RybmNtcChzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgc3NpZGxlbikpOworCit9CisKK2ludCBhc3NvY19ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHU4KiBkZXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqYTsKKworCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSAtCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKSB7CisKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDolZCBcbiIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKikgc2tiLT5kYXRhOworCisJbWVtY3B5KGRlc3QsYS0+aGVhZGVyLmFkZHIyLEVUSF9BTEVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhc3NvY19wYXJzZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICphaWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqcmVzcG9uc2VfaGVhZDsKKwl1MTYgc3RhdHVzX2NvZGU7CisKKwlpZiAoc2tiLT5sZW4gPCAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKXsKKwkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIDB4Y2FmZTsKKwl9CisKKwlyZXNwb25zZV9oZWFkID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKSBza2ItPmRhdGE7CisJKmFpZCA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlX2hlYWQtPmFpZCkgJiAweDNmZmY7CisKKwlzdGF0dXNfY29kZSA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlX2hlYWQtPnN0YXR1cyk7CisJaWYoKHN0YXR1c19jb2RlPT1XTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfUkFURVMgfHwgXAorCSAgIHN0YXR1c19jb2RlPT1XTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEKSYmCisJICAgKChpZWVlLT5tb2RlID09IElFRUVfRykgJiYKKwkgICAgKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcpICYmCisJICAgIChpZWVlLT5Bc29jUmV0cnlDb3VudCsrIDwgKFJUX0FTT0NfUkVUUllfTElNSVQtMSkpKSkgeworCQkgaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfUFVSRV9OX01PREU7CisJfWVsc2UgeworCQkgaWVlZS0+QXNvY1JldHJ5Q291bnQgPSAwOworCX0KKworCXJldHVybiBsZTE2X3RvX2NwdShyZXNwb25zZV9oZWFkLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9wcm9iZV9ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKworCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOworCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7CisJaWYgKHByb2JlX3JxX3BhcnNlKGllZWUsIHNrYiwgZGVzdCkpeworCQkvL0lFRUU4MDIxMURNRVNHKCJXYXMgZm9yIG1lISIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JzKys7CisJCWllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKGllZWUsIGRlc3QpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfcnhfYXV0aF9ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwlpbnQgc3RhdHVzOworCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JxKys7CisKKwlpZiAoKHN0YXR1cyA9IGF1dGhfcnFfcGFyc2Uoc2tiLCBkZXN0KSkhPSAtMSl7CisJCWllZWU4MDIxMV9yZXNwX3RvX2F1dGgoaWVlZSwgc3RhdHVzLCBkZXN0KTsKKwl9CisJLy9ETUVTRygiRGVzdCBpcyAiTUFDU1RSLCBNQUMyU1RSKGRlc3QpKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2llZWU4MDIxMV9yeF9hc3NvY19ycShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKworCXU4IGRlc3RbRVRIX0FMRU5dOworCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX3JxKys7CisJaWYgKGFzc29jX3JxX3BhcnNlKHNrYixkZXN0KSAhPSAtMSl7CisJCWllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKGllZWUsIGRlc3QpOworCX0KKworCXByaW50ayhLRVJOX0lORk8iTmV3IGNsaWVudCBhc3NvY2lhdGVkOiAiTUFDX0ZNVCJcbiIsIE1BQ19BUkcoZGVzdCkpOworCS8vRklYTUUKK30KKworCisKK3ZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKK3sKKworCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfbnVsbF9mdW5jKGllZWUsIHB3cik7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX3BzX21nbXRfeG1pdChidWYsIGllZWUpOworCit9CisKKworc2hvcnQgaWVlZTgwMjExX3N0YV9wc19zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTMyICp0aW1lX2gsIHUzMiAqdGltZV9sKQoreworCWludCB0aW1lb3V0ID0gaWVlZS0+cHNfdGltZW91dDsKKwl1OCBkdGltOworCS8qaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CisJCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCisJCXJldHVybiAwOworCSovCisJZHRpbSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX2RhdGE7CisJLy9wcmludGsoIkRUSU1cbiIpOworCWlmKCEoZHRpbSAmIElFRUU4MDIxMV9EVElNX1ZBTElEKSkKKwkJcmV0dXJuIDA7CisJdGltZW91dCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7IC8vc2hvdWxkIHdlIHVzZSBwc190aW1lb3V0IHZhbHVlIG9yIGJlYWNvbl9pbnRlcnZhbAorCS8vcHJpbnRrKCJWQUxJRFxuIik7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YSA9IElFRUU4MDIxMV9EVElNX0lOVkFMSUQ7CisKKwlpZihkdGltICYgKChJRUVFODAyMTFfRFRJTV9VQ0FTVCB8IElFRUU4MDIxMV9EVElNX01CQ0FTVCkmIGllZWUtPnBzKSkKKwkJcmV0dXJuIDI7CisKKwlpZighdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgTVNFQ1ModGltZW91dCkpKQorCQlyZXR1cm4gMDsKKworCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmxhc3RfcnhfcHNfdGltZSArIE1TRUNTKHRpbWVvdXQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZigoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUgKSAmJgorCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCisJCXJldHVybiAwOworCisJaWYodGltZV9sKXsKKwkJKnRpbWVfbCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0KKwkJCSsgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwKKwkJCSogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSAqIDEwMDA7CisJfQorCisJaWYodGltZV9oKXsKKwkJKnRpbWVfaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMV07CisJCWlmKHRpbWVfbCAmJiAqdGltZV9sIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXSkKKwkJCSp0aW1lX2ggKz0gMTsKKwl9CisKKwlyZXR1cm4gMTsKKworCit9CisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisKKwl1MzIgdGgsdGw7CisJc2hvcnQgc2xlZXA7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZigoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8CisJCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSl7CisKKwkvLwkjd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLCAxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCisJc2xlZXAgPSBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKGllZWUsJnRoLCAmdGwpOworCS8qIDIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nICovCisJaWYoc2xlZXAgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZihzbGVlcCA9PSAxKXsKKworCQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMSkKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldix0aCx0bCk7CisKKwkJZWxzZSBpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7CisJCS8vCXByaW50aygic2VuZCBudWxsIDFcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQkJaWYoaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkoaWVlZS0+ZGV2KSl7CisKKworCQkJCWllZWUtPnN0YV9zbGVlcCA9IDI7CisKKwkJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCisJCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwxKTsKKworCQkJCWllZWUtPnBzX3RoID0gdGg7CisJCQkJaWVlZS0+cHNfdGwgPSB0bDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQl9CisKKworCX1lbHNlIGlmKHNsZWVwID09IDIpeworLy8jd2FybmluZyBDSEVDS19MT0NLX0hFUkUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK30KKwordm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpCit7CisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDApeworCQlpZihubCl7CisJCQlwcmludGsoIldhcm5pbmc6IGRyaXZlciBpcyBwcm9iYWJseSBmYWlsaW5nIHRvIHJlcG9ydCBUWCBwcyBlcnJvclxuIik7CisJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCX0KKwkJcmV0dXJuOworCisJfQorCisJaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCisJCWllZWUtPnN0YV93YWtlX3VwKGllZWUtPmRldik7CisKKwlpZWVlLT5zdGFfc2xlZXAgPSAwOworCisJaWYobmwpeworCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOworCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKwl9Cit9CisKK3ZvaWQgaWVlZTgwMjExX3BzX3R4X2FjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2VzcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLGZsYWdzMjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMil7CisJCS8qIE51bGwgZnJhbWUgd2l0aCBQUyBiaXQgc2V0ICovCisJCWlmKHN1Y2Nlc3MpeworCQkJaWVlZS0+c3RhX3NsZWVwID0gMTsKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldixpZWVlLT5wc190aCxpZWVlLT5wc190bCk7CisJCX0KKwkJLyogaWYgdGhlIGNhcmQgcmVwb3J0IG5vdCBzdWNjZXNzIHdlIGNhbid0IGJlIHN1cmUgdGhlIEFQCisJCSAqIGhhcyBub3QgUlhlZCBzbyB3ZSBjYW4ndCBhc3N1bWUgdGhlIEFQIGJlbGlldmUgdXMgYXdha2UKKwkJICovCisJfQorCS8qIDIxMTEyMDA1IC0gdHggYWdhaW4gbnVsbCB3aXRob3V0IFBTIGJpdCBpZiBsb3N0ICovCisJZWxzZSB7CisKKwkJaWYoKGllZWUtPnN0YV9zbGVlcCA9PSAwKSAmJiAhc3VjY2Vzcyl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQordm9pZCBpZWVlODAyMTFfcHJvY2Vzc19hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmKiBza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIqIGhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciopc2tiLT5kYXRhOworCXU4KiBhY3QgPSBpZWVlODAyMTFfZ2V0X3BheWxvYWQoaGVhZGVyKTsKKwl1OCB0bXAgPSAwOworLy8JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAoYWN0ID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImVycm9yIHRvIGdldCBwYXlsb2FkIG9mIGFjdGlvbiBmcmFtZVxuIik7CisJCXJldHVybjsKKwl9CisJdG1wID0gKmFjdDsKKwlhY3QgKys7CisJc3dpdGNoICh0bXApCisJeworCQljYXNlIEFDVF9DQVRfQkE6CisJCQlpZiAoKmFjdCA9PSBBQ1RfQUREQkFSRVEpCisJCQlpZWVlODAyMTFfcnhfQUREQkFSZXEoaWVlZSwgc2tiKTsKKwkJCWVsc2UgaWYgKCphY3QgPT0gQUNUX0FEREJBUlNQKQorCQkJaWVlZTgwMjExX3J4X0FEREJBUnNwKGllZWUsIHNrYik7CisJCQllbHNlIGlmICgqYWN0ID09IEFDVF9ERUxCQSkKKwkJCWllZWU4MDIxMV9yeF9ERUxCQShpZWVlLCBza2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisvLwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisvLwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJ1bmtub3duIGFjdGlvbiBmcmFtZSglZClcbiIsIHRtcCk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuOworCit9CitpbmxpbmUgaW50CitpZWVlODAyMTFfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKKwl1MTYgZXJyY29kZTsKKwl1OCogY2hhbGxlbmdlOworCWludCBjaGxlbj0wOworCWludCBhaWQ7CisJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqYXNzb2NfcmVzcDsKKy8vCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQ7CisJYm9vbCBiU3VwcG9ydE5tb2RlID0gdHJ1ZSwgYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsgLy9kZWZhdWx0IHN1cHBvcnQgTiBtb2RlLCBkaXNhYmxlIGhhbGZObW9kZQorCisJaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybiAwOworCisJaWYoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQgJiYKKwkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCisJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQorCisJCXRhc2tsZXRfc2NoZWR1bGUoJmllZWUtPnBzX3Rhc2spOworCisJaWYoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpICE9IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQICYmCisJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQorCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1A6CisKKwkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBbUkVdQVNTT0NJQVRJT04gUkVTUE9OU0UgKCVkKVxuIiwKKwkJCQkJV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCisJCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXR3b3JrX3Jlc3A7CisJCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrID0gJm5ldHdvcmtfcmVzcDsKKworCQkJCWlmICgwID09IChlcnJjb2RlPWFzc29jX3BhcnNlKGllZWUsc2tiLCAmYWlkKSkpeworCQkJCQlpZWVlLT5zdGF0ZT1JRUVFODAyMTFfTElOS0VEOworCQkJCQlpZWVlLT5hc3NvY19pZCA9IGFpZDsKKwkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3Nfb2srKzsKKwkJCQkJLyogc3RhdGlvbiBzdXBwb3J0IHFvcyAqLworCQkJCQkvKiBMZXQgdGhlIHJlZ2lzdGVyIHNldHRpbmcgZGVmYXVsdGx5IHdpdGggTGVnYWN5IHN0YXRpb24gKi8KKwkJCQkJaWYoaWVlZS0+cW9zX3N1cHBvcnQpIHsKKwkJCQkJCWFzc29jX3Jlc3AgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopc2tiLT5kYXRhOworCQkJCQkJbWVtc2V0KG5ldHdvcmssIDAsIHNpemVvZigqbmV0d29yaykpOworCQkJCQkJaWYgKGllZWU4MDIxMV9wYXJzZV9pbmZvX3BhcmFtKGllZWUsYXNzb2NfcmVzcC0+aW5mb19lbGVtZW50LFwKKwkJCQkJCQkJCXJ4X3N0YXRzLT5sZW4gLSBzaXplb2YoKmFzc29jX3Jlc3ApLFwKKwkJCQkJCQkJCW5ldHdvcmsscnhfc3RhdHMpKXsKKwkJCQkJCQlyZXR1cm4gMTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsJLy9maWxsaW5nIHRoZSBQZWVySFRDYXAuIC8vbWF5YmUgbm90IG5lY2Nlc2FyeSBhcyB3ZSBjYW4gZ2V0IGl0cyBpbmZvIGZyb20gY3VycmVudF9uZXR3b3JrLgorCQkJCQkJCW1lbWNweShpZWVlLT5wSFRJbmZvLT5QZWVySFRDYXBCdWYsIG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsIG5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCQkJCQkJCW1lbWNweShpZWVlLT5wSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZiwgbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJCQkJfQorCQkJCQkJaWYgKGllZWUtPmhhbmRsZV9hc3NvY19yZXNwb25zZSAhPSBOVUxMKQorCQkJCQkJCWllZWUtPmhhbmRsZV9hc3NvY19yZXNwb25zZShpZWVlLT5kZXYsIChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKiloZWFkZXIsIG5ldHdvcmspOworCQkJCQl9CisJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGUoaWVlZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogYWlkIGNvdWxkIG5vdCBiZWVuIGFsbG9jYXRlZCAqLworCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19lcnIrKzsKKwkJCQkJcHJpbnRrKAorCQkJCQkJIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQkJCQllcnJjb2RlKTsKKwkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoCisJCQkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKKwkJCQkJCWVycmNvZGUpOworCQkJCQlpZihpZWVlLT5Bc29jUmV0cnlDb3VudCA8IFJUX0FTT0NfUkVUUllfTElNSVQpIHsKKwkJCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgorCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisKKwkJCQlpZWVlODAyMTFfcnhfYXNzb2NfcnEoaWVlZSwgc2tiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6CisKKwkJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSl7CisJCQkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyAmJgorCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSl7CisKKwkJCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJSZWNlaXZlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZSIpOworCisJCQkJCQlpZiAoMCA9PSAoZXJyY29kZT1hdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKSkpeworCQkJCQkJCWlmKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpeworCQkJCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEOworCQkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKKwkJCQkJCQkJaWYoIShpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24mSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWlmICghaWVlZS0+R2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcoaWVlZS0+ZGV2KSkKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJCS8vIFdFUCBvciBUS0lQIGVuY3J5cHRpb24KKwkJCQkJCQkJCQlpZihJc0hUSGFsZk5tb2RlQVBzKGllZWUpKQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJYlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJCQkJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gdHJ1ZTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJYlN1cHBvcnRObW9kZSA9IGZhbHNlOworCQkJCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCXByaW50aygiPT09PT09PT09PT50byBsaW5rIHdpdGggQVAgdXNpbmcgU0VDKCVkLCAlZCkiLCBiU3VwcG9ydE5tb2RlLCBiSGFsZlN1cHBvcnRObW9kZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJLyogRHVtbXkgd2lybGVzcyBtb2RlIHNldHRpbmcgdG8gYXZvaWQgZW5jcnlwdGlvbiBpc3N1ZSAqLworCQkJCQkJCQlpZihiU3VwcG9ydE5tb2RlKSB7CisJCQkJCQkJCQkvL04gbW9kZSBzZXR0aW5nCisJCQkJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBcCisJCQkJCQkJCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlKTsKKwkJCQkJCQkJfWVsc2V7CisJCQkJCQkJCQkvL2IvZyBtb2RlIHNldHRpbmcKKwkJCQkJCQkJCS8qVE9ETyovCisJCQkJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQkJCQkJCQl9CisKKwkJCQkJCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcgJiYgYkhhbGZTdXBwb3J0Tm1vZGUgPT0gdHJ1ZSkKKwkJCQkJCQkJeworCQkJCQkJCQkJcHJpbnRrKCI9PT09PT09PT09PT09PT0+ZW50ZXJuIGhhbGYgTiBtb2RlXG4iKTsKKwkJCQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gZmFsc2U7CisKKwkJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKKwkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJaWVlZTgwMjExX2F1dGhfY2hhbGxlbmdlKGllZWUsIGNoYWxsZW5nZSwgY2hsZW4pOworCQkJCQkJCX0KKwkJCQkJCX1lbHNleworCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19lcnIrKzsKKwkJCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9zZSBzdGF0dXMgY29kZSAweCV4IixlcnJjb2RlKTsKKwkJCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQkJCQkJfQorCisJCQkJCX1lbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJCQkJCWllZWU4MDIxMV9yeF9hdXRoX3JxKGllZWUsIHNrYik7CisJCQkJCX0KKwkJCQl9CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CisKKwkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJTKSAmJgorCQkJCSgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8CisJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgJiYKKwkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSl7CisJCQkJaWVlZTgwMjExX3J4X3Byb2JlX3JxKGllZWUsIHNrYik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfREVBVVRIOgorCQkJLyogRklYTUUgZm9yIG5vdyByZXBlYXQgYWxsIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUKKwkJCSogYm90aCBmb3IgZGlzYXNzb2NpYXRpb24gYW5kIGRlYXV0aGVudGljYXRpb24KKwkJCSovCisJCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCisJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yZWFzc29jKys7CisKKwkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisJCQkJLy9IVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwkJCQlSZW1vdmVQZWVyVFMoaWVlZSwgaGVhZGVyLT5hZGRyMik7CisJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX01BTkFHRV9BQ1Q6CisJCQlpZWVlODAyMTFfcHJvY2Vzc19hY3Rpb24oaWVlZSxza2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwl9CisKKwkvL2Rldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGZvbGxvd2luZyBhcmUgZm9yIGEgc2ltcGxpZXIgVFggcXVldWUgbWFuYWdlbWVudC4KKyAqIEluc3RlYWQgb2YgdXNpbmcgbmV0aWZfW3N0b3Avd2FrZV1fcXVldWUgdGhlIGRyaXZlcgorICogd2lsbCB1c2VzIHRoZXNlIHR3byBmdW5jdGlvbiAocGx1cyBhIHJlc2V0IG9uZSksIHRoYXQKKyAqIHdpbGwgaW50ZXJuYWxseSB1c2VzIHRoZSBrZXJuZWwgbmV0aWZfKiBhbmQgdGFrZXMKKyAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KKyAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKKyAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCisgKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCisgKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCisgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCisgKiB0byBrZWVwIE4gZnJlZSBkZXNjcmlwdG9ycyB3aGVyZQorICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RSRVNIT0xECisgKiBJbiB0aGlzIHdheSB5b3UgbmVlZCBqdXN0IG9uZSBhbmQgdGhlIDgwMi4xMSBzdGFjaworICogd2lsbCB0YWtlIGNhcmUgb2YgYnVmZmVyaW5nIGZyYWdtZW50cyBhbmQgcGFzcyB0aGVtIHRvCisgKiB0byB0aGUgZHJpdmVyIGxhdGVyLCB3aGVuIGl0IHdha2VzIHRoZSBxdWV1ZS4KKyAqLwordm9pZCBpZWVlODAyMTFfc29mdG1hY194bWl0KHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgaW50IHF1ZXVlX2luZGV4ID0gdHhiLT5xdWV1ZV9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgaTsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisKKwkvKiBjYWxsZWQgd2l0aCAybmQgcGFybSAwLCBubyB0eCBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDApOworCisJLyogdXBkYXRlIHRoZSB0eCBzdGF0dXMgKi8KKwlpZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKKwlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKSh0eGItPmZyYWdtZW50c1swXS0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJaWYodGNiX2Rlc2MtPmJNdWx0aWNhc3QpIHsKKwkJaWVlZS0+c3RhdHMubXVsdGljYXN0Kys7CisJfQorCS8qIGlmIHhtaXQgYXZhaWxhYmxlLCBqdXN0IHhtaXQgaXQgaW1tZWRpYXRlbHksIGVsc2UganVzdCBpbnNlcnQgaXQgdG8gdGhlIHdhaXQgcXVldWUgKi8KKwlmb3IoaSA9IDA7IGkgPCB0eGItPm5yX2ZyYWdzOyBpKyspIHsKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl9kcnZfYWdnUVtxdWV1ZV9pbmRleF0pICE9IDApIHx8CisjZWxzZQorCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pICE9IDApIHx8CisjZW5kaWYKKwkJKCFpZWVlLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoaWVlZS0+ZGV2LHF1ZXVlX2luZGV4KSl8fFwKKwkJICAgICAoaWVlZS0+cXVldWVfc3RvcCkpIHsKKwkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgd2FpdCBxdWV1ZSAqLworCQkJLyogYXMgZm9yIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkCisJCQkgKiB0byBjaGVjayBpdCBhbnkgbW9yZS4KKwkJCSAqICovCisJCQkvL3ByaW50aygiZXJyb3I6bm8gZGVzY3JpcHRvciBsZWZ0QHF1ZXVlX2luZGV4ICVkXG4iLCBxdWV1ZV9pbmRleCk7CisJCQkvL2llZWU4MDIxMV9zdG9wX3F1ZXVlKGllZWUpOworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSwgdHhiLT5mcmFnbWVudHNbaV0pOworI2Vsc2UKKwkJCXNrYl9xdWV1ZV90YWlsKCZpZWVlLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdLCB0eGItPmZyYWdtZW50c1tpXSk7CisjZW5kaWYKKwkJfWVsc2V7CisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAorCQkJCQl0eGItPmZyYWdtZW50c1tpXSwKKwkJCQkJaWVlZS0+ZGV2LGllZWUtPnJhdGUpOworCQkJLy9pZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkvL2llZWUtPnN0YXRzLnR4X2J5dGVzICs9IHR4Yi0+ZnJhZ21lbnRzW2ldLT5sZW47CisJCQkvL2llZWUtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQl9CisJfQorCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOworCisvL2V4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7CisKK30KKworLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLwordm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCWludCBpOworCWZvcihpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKKworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7CisJCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOworCQkJcmV0dXJuOworCQl9ZWxzZXsKKworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAorCQkJCWllZWUtPmRldixpZWVlLT5yYXRlKTsKKwkJCQkvLyhpKzEpPGllZWUtPnR4X3BlbmRpbmcudHhiLT5ucl9mcmFncyk7CisJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KKworCisJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKKwlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7Cit9CisKKwordm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisJaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKXsKKwkJaWVlZTgwMjExX3R4Yl9mcmVlKGllZWUtPnR4X3BlbmRpbmcudHhiKTsKKwkJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCX0KKwlpZWVlLT5xdWV1ZV9zdG9wID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworfQorCit2b2lkIGllZWU4MDIxMV93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOworCWlmICghIGllZWUtPnF1ZXVlX3N0b3ApIGdvdG8gZXhpdDsKKworCWllZWUtPnF1ZXVlX3N0b3AgPSAwOworCisJaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpeworCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpeworCisJCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsaWVlZS0+ZGV2LGllZWUtPmJhc2ljX3JhdGUpOworCQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKKwkJfQorCX0KKwlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgaWVlZS0+dHhfcGVuZGluZy50eGIpCisJCWllZWU4MDIxMV9yZXN1bWVfdHgoaWVlZSk7CisKKwlpZiAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKXsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4YXdha2UrKzsKKwkJbmV0aWZfd2FrZV9xdWV1ZShpZWVlLT5kZXYpOworCX0KKworZXhpdCA6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CisKKwlpZiAoISBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCQluZXRpZl9zdG9wX3F1ZXVlKGllZWUtPmRldik7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eHN0b3ArKzsKKwl9CisJaWVlZS0+cXVldWVfc3RvcCA9IDE7CisJLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKKworfQorCisKK2lubGluZSB2b2lkIGllZWU4MDIxMV9yYW5kb21pemVfY2VsbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKworCWdldF9yYW5kb21fYnl0ZXMoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwkvKiBhbiBJQlNTIGNlbGwgYWRkcmVzcyBtdXN0IGhhdmUgdGhlIHR3byBsZXNzIHNpZ25pZmljYW50CisJICogYml0cyBvZiB0aGUgZmlyc3QgYnl0ZSA9IDIKKwkgKi8KKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0gJj0gfjB4MDE7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdIHw9IDB4MDI7Cit9CisKKy8qIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgb25seSAqLwordm9pZCBpZWVlODAyMTFfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5hc3NvY19pZCA9IDE7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLAorCQkJSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQsCisJCQlJV19FU1NJRF9NQVhfU0laRSk7CisKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gc3RybGVuKElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKKwkJaWVlZS0+c3NpZF9zZXQgPSAxOworCX0KKworCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZihpZWVlLT5yYXdfdHgpeworCisJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwl9Cit9Cit2b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkZWxheWVkX3dvcmssIHdvcmspOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgc3RhcnRfaWJzc193cSk7CisJLyogaXdjb25maWcgbW9kZSBhZC1ob2Mgd2lsbCBzY2hlZHVsZSB0aGlzIGFuZCByZXR1cm4KKwkgKiBvbiB0aGUgb3RoZXIgaGFuZCB0aGlzIHdpbGwgYmxvY2sgZnVydGhlciBpd2NvbmZpZyBTRVQKKwkgKiBvcGVyYXRpb25zIGJlY2F1c2Ugb2YgdGhlIHd4X3NlbSBob2xkLgorCSAqIEFueXdheSBzb21lIG1vc3Qgc2V0IG9wZXJhdGlvbnMgc2V0IGEgZmxhZyB0byBzcGVlZC11cAorCSAqIChhYm9ydCkgdGhpcyB3cSAod2hlbiBzeW5jcm8gc2Nhbm5pbmcpIGJlZm9yZSBzbGVlcGluZworCSAqIG9uIHRoZSBzZW1hcGhvcmUKKwkgKi8KKwlpZighaWVlZS0+cHJvdG9fc3RhcnRlZCl7CisJCXByaW50aygiPT09PT09PT09PW9oIGRyaXZlciBkb3duIHJldHVyblxuIik7CisJCXJldHVybjsKKwl9CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXN0cmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHN0cmxlbihJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIHRoaXMgY2VsbCBpbiBvdXIgbmV0d29yayBsaXN0ICovCisJaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CisKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQgLy9pZiBjcmVhdGluZyBhbiBhZC1ob2MsIHNldCBpdHMgY2hhbm5lbCB0byAxMCB0ZW1wb3JhcmlseS0tdGhpcyBpcyB0aGUgcmVxdWlyZW1lbnQgZm9yIEFTVVMsIG5vdCAxMUQsIHNvIGRpc2FibGUgMTFkLgorLy8JaWYoKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpICYmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSkKKwlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OworI2VuZGlmCisJLyogaWYgbm90IHRoZW4gdGhlIHN0YXRlIGlzIG5vdCBsaW5rZWQuIE1heWJlIHRoZSB1c2VyIHN3aXRoY2VkIHRvCisJICogYWQtaG9jIG1vZGUganVzdCBhZnRlciBiZWluZyBpbiBtb25pdG9yIG1vZGUsIG9yIGp1c3QgYWZ0ZXIKKwkgKiBiZWluZyB2ZXJ5IGZldyB0aW1lIGluIG1hbmFnZWQgbW9kZSAoc28gdGhlIGNhcmQgaGF2ZSBoYWQgbm8KKwkgKiB0aW1lIHRvIHNjYW4gYWxsIHRoZSBjaGFucy4uKSBvciB3ZSBoYXZlIGp1c3QgcnVuIHVwIHRoZSBpZmFjZQorCSAqIGFmdGVyIHNldHRpbmcgYWQtaG9jIG1vZGUuIFNvIHdlIGhhdmUgdG8gZ2l2ZSBhbm90aGVyIHRyeS4uCisJICogSGVyZSwgaW4gaWJzcyBtb2RlLCBzaG91bGQgYmUgc2FmZSB0byBkbyB0aGlzIHdpdGhvdXQgZXh0cmEgY2FyZQorCSAqIChpbiBic3MgbW9kZSB3ZSBoYWQgdG8gbWFrZSBzdXJlIG5vLW9uZSB0cnllZCB0byBhc3NvY2lhdGUgd2hlbgorCSAqIHdlIGhhZCBqdXN0IGNoZWNrZWQgdGhlIGllZWUtPnN0YXRlIGFuZCB3ZSB3YXMgZ29pbmcgdG8gc3RhcnQgdGhlCisJICogc2NhbikgYmVhY2F1c2UgaW4gaWJzcyBtb2RlIHRoZSBpZWVlODAyMTFfbmV3X25ldCBmdW5jdGlvbiwgd2hlbgorCSAqIGZpbmRzIGEgZ29vZCBuZXQsIGp1c3Qgc2V0IHRoZSBpZWVlLT5zdGF0ZSB0byBJRUVFODAyMTFfTElOS0VELAorCSAqIHNvLCBhdCB3b3JzdCwgd2Ugd2FzdGUgYSBiaXQgb2YgdGltZSB0byBpbml0aWF0ZSBhbiB1bm5lZWRlZCBzeW5jcm8KKwkgKiBzY2FuLCB0aGF0IHdpbGwgc3RvcCBhdCB0aGUgZmlyc3Qgcm91bmQgYmVjYXVzZSBpdCBzZWVzIHRoZSBzdGF0ZQorCSAqIGFzc29jaWF0ZWQuCisJICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyhpZWVlKTsKKworCS8qIHRoZSBuZXR3b3JrIGRlZmluaXRpdmVseSBpcyBub3QgaGVyZS4uIGNyZWF0ZSBhIG5ldyBjZWxsICovCisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCQlwcmludGsoImNyZWF0aW5nIG5ldyBJQlNTIGNlbGxcbiIpOworCQlpZighaWVlZS0+d2FwX3NldCkKKwkJCWllZWU4MDIxMV9yYW5kb21pemVfY2VsbChpZWVlKTsKKworCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDQ7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1swXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzFdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1szXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKKworCQl9ZWxzZQorCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDA7CisKKwkJaWYoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDg7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFswXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFsxXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFsyXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbM10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzRdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs1XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNl0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV80OE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzddID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKKworCQkJaWVlZS0+cmF0ZSA9IDEwODsKKwkJfWVsc2V7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gMDsKKwkJCWllZWUtPnJhdGUgPSAyMjsKKwkJfQorCisJCS8vIEJ5IGRlZmF1bHQsIFdNTSBmdW5jdGlvbiB3aWxsIGJlIGRpc2FibGVkIGluIElCU1MgbW9kZQorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSA9IDA7CisJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsIElFRUVfRyk7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyA9IDA7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7CisJCWlmKGllZWUtPnNob3J0X3Nsb3QpCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVDsKKworCX0KKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKKworCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgMTUwKTsKK30KKworLyogdGhpcyBpcyBjYWxsZWQgb25seSBpbiB1c2VyIGNvbnRleHQsIHdpdGggd3hfc2VtIGhlbGQgKi8KK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwkvLworCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMworCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KKwkvLworCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJeworCQlpZighIGllZWUtPmJHbG9iYWxEb21haW4pCisJCXsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlCisJICogYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCisJICogaWYgbm90ICh3ZSBhcmUgZGlzYXNzb2NpYXRlZCBhbmQgd2UgYXJlIG5vdAorCSAqIGluIGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcgcGhhc2UpIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nLgorCSAqLworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisJLyogZW5zdXJlIG5vLW9uZSBzdGFydCBhbiBhc3NvY2lhdGluZyBwcm9jZXNzICh0aHVzIHNldHRpbmcKKwkgKiB0aGUgaWVlZS0+c3RhdGUgdG8gaWVlZTgwMjExX0FTU09DSUFUSU5HKSB3aGlsZSB3ZQorCSAqIGhhdmUganVzdCBjaGVrZWQgaXQgYW5kIHdlIGFyZSBnb2luZyB0byBlbmFibGUgc2Nhbi4KKwkgKiBUaGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoCisJICogbG9jayBoZWxkIChmcm9tIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kCisJICogdGhlIHJ4IHBhdGgpLCBzbyB3ZSBjYW5ub3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBzdWNoIGZ1bmN0aW9uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKKwkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOworCQlpZWVlODAyMTFfc3RhcnRfc2NhbihpZWVlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworfQorCisvKiBjYWxsZWQgb25seSBpbiB1c2Vyc3BhY2UgY29udGV4dCAqLwordm9pZCBpZWVlODAyMTFfZGlzYXNzb2NpYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCisKKwluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKQorCQkJaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRG90MTFkX1Jlc2V0KGllZWUpOworI2VuZGlmCisJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOworCWllZWUtPmlzX3NldF9rZXkgPSBmYWxzZTsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCS8vSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCit9Cit2b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKKyAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcmV0cnlfd3EpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlnb3RvIGV4aXQ7CisKKwlpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlkpCisJCWdvdG8gZXhpdDsKKworCS8qIHVudGlsIHdlIGRvIG5vdCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksKKwkqIHRoZXJlIGFyZSBubyBwb3NzaWJpbGl0eSB0byBoYXZlIHNvbWVvbmUgZWxzZSB0cnlpbmcKKwkqIHRvIHN0YXJ0IGFuIGFzc29jaWF0aW9uIHByb2NkdXJlICh3ZSBnZXQgaGVyZSB3aXRoCisJKiBpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORykuCisJKiBXaGVuIHdlIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX05PTElOSyBpdCBpcyBwb3NzaWJsZQorCSogdGhhdCB0aGUgUlggcGF0aCBydW4gYW4gYXR0ZW1wdCB0byBhc3NvY2lhdGUsIGJ1dAorCSogYm90aCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyBhbmQgdGhlCisJKiBSWCBwYXRoIHdvcmtzIHdpdGggaWVlZS0+bG9jayBoZWxkIHNvIHRoZXJlIGFyZSBubworCSogcHJvYmxlbXMuIElmIHdlIGFyZSBzdGlsbCBkaXNhc3NvY2lhdGVkIHRoZW4gc3RhcnQgYSBzY2FuLgorCSogdGhlIGxvY2sgaGVyZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5vIG9uZSB0cnkgdG8gc3RhcnQKKwkqIGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aGVuIHdlIGhhdmUganVzdCBjaGVja2VkIHRoZQorCSogc3RhdGUgYW5kIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgc2Nhbi4KKwkqLworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKworCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspCisJCWllZWU4MDIxMV9zdGFydF9zY2FuKGllZWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOworCisJc2tiID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgYnJvYWRjYXN0X2FkZHIpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKKwliLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CisKKwlyZXR1cm4gc2tiOworCit9CisKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7CisKKwlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7CisJaWYoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwliID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikgc2tiLT5kYXRhOworCWItPmhlYWRlci5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwllbHNlCisJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwlyZXR1cm4gc2tiOworfQorCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSk7CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKKwordm9pZCBpZWVlODAyMTFfc3RvcF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybjsKKworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAwOworCisJaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c3RhcnRfaWJzc193cSk7CisJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKworCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CisJUmVtb3ZlQWxsVFMoaWVlZSk7IC8vYWRkZWQgYXMgd2UgZGlzY29ubmVjdCBmcm9tIHRoZSBwcmV2aW91cyBCU1MsIFJlbW92ZSBhbGwgVFMKK30KKwordm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKK3ZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXNob3J0IGNoID0gMDsKKwlpbnQgaSA9IDA7CisJaWYgKGllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybjsKKworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApeworCQlkb3sKKwkJCWNoKys7CisJCQlpZiAoY2ggPiBNQVhfQ0hBTk5FTF9OVU1CRVIpCisJCQkJcmV0dXJuOyAvKiBubyBjaGFubmVsIGZvdW5kICovCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQl9d2hpbGUoIUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbHNlCisJCX13aGlsZSghaWVlZS0+Y2hhbm5lbF9tYXBbY2hdKTsKKyNlbmRpZgorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOworCX0KKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID09IDApCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSAxMDA7CisvLwlwcmludGsoIj09PT4lcygpLCBjaGFuOiVkXG4iLCBfX0ZVTkNUSU9OX18sIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKy8vCWllZWUtPnNldF9jaGFuKGllZWUtPmRldixpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwlmb3IoaSA9IDA7IGkgPCAxNzsgaSsrKSB7CisJICBpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOworCSAgaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7CisJICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKKwl9CisKKwlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOy8vcmVpbml0aWFsaXplIEFDX3h4X1BBUkFNIHJlZ2lzdGVycy4KKworCisJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBNQUMgb2YgdGhlIGFkLWhvYyBjZWxsIGFuZCB0aGVuCisJICogc3dpdGNoIHRvIG1hbmFnZWQgbW9kZSwgc2hhbGwgd2UgIG1ha2Ugc3VyZSB0aGF0IGFzc29jaWF0aW9uCisJICogYXR0ZW1wdHMgZG9lcyBub3QgZmFpbCBqdXN0IGJlY2F1c2UgdGhlIHVzZXIgcHJvdmlkZSB0aGUgZXNzaWQKKwkgKiBhbmQgdGhlIG5pYyBpcyBzdGlsbCBjaGVja2luZyBmb3IgdGhlIEFQIE1BQyA/PworCSAqLworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7CisKKwllbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCWllZWU4MDIxMV9zdGFydF9pYnNzKGllZWUpOworCisJZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3MoaWVlZSk7CisKKwllbHNlIGlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKGllZWUpOworfQorCisKKyNkZWZpbmUgRFJWX05BTUUgICJJZWVlODAyMTEiCit2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisJbWVtc2V0KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisJZm9yKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJICBpZWVlLT5zZXFfY3RybFtpXSA9IDA7CisJfQorI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZWVlLT5wRG90MTFkSW5mbyA9IGttYWxsb2Moc2l6ZW9mKFJUX0RPVDExRF9JTkZPKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFpZWVlLT5wRG90MTFkSW5mbykKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIERPVDExRFxuIik7CisJbWVtc2V0KGllZWUtPnBEb3QxMWRJbmZvLCAwLCBzaXplb2YoUlRfRE9UMTFEX0lORk8pKTsKKyNlbmRpZgorCS8vYWRkZWQgZm9yICBBUCByb2FtaW5nCisJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDI7CisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPTA7CisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD0wOworCisJaWVlZS0+YXNzb2NfaWQgPSAwOworCWllZWUtPnF1ZXVlX3N0b3AgPSAwOworCWllZWUtPnNjYW5uaW5nID0gMDsKKwlpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzID0gMDsgLy9zbyBJRUVFMjEwMC1saWtlIGRyaXZlciBhcmUgaGFwcHkKKwlpZWVlLT53YXBfc2V0ID0gMDsKKwlpZWVlLT5zc2lkX3NldCA9IDA7CisJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CisJaWVlZS0+YmFzaWNfcmF0ZSA9IElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEU7CisJaWVlZS0+cmF0ZSA9IDIyOworCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX0RJU0FCTEVEOworCWllZWUtPnN0YV9zbGVlcCA9IDA7CisJaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFswXT0gMHhmZjsvL3N1cHBvcnQgTUNTIDB+NworCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMV09IDB4ZmY7Ly9zdXBwb3J0IE1DUyA4fjE1CisJaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFs0XT0gMHgwMTsKKwkvL2FkZGVkIGJ5IGFteQorCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJaWVlZS0+aXNfc2V0X2tleSA9IGZhbHNlOworCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKKworCWllZWUtPnN0YV9lZGNhX3BhcmFtWzBdID0gMHgwMDAwQTQwMzsKKwlpZWVlLT5zdGFfZWRjYV9wYXJhbVsxXSA9IDB4MDAwMEE0Mjc7CisJaWVlZS0+c3RhX2VkY2FfcGFyYW1bMl0gPSAweDAwNUU0MzQyOworCWllZWUtPnN0YV9lZGNhX3BhcmFtWzNdID0gMHgwMDJGMzI2MjsKKwlpZWVlLT5hZ2dyZWdhdGlvbiA9IHRydWU7CisJaWVlZS0+ZW5hYmxlX3J4X2ltbV9CQSA9IDE7CisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCisJaW5pdF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKKwlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7CisJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydF9jYjsKKworCWluaXRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7CisJaWVlZS0+YmVhY29uX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaWVlZTsKKwlpZWVlLT5iZWFjb25fdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2I7CisKKyNpZmRlZiBQRl9TWU5DVEhSRUFECisJaWVlZS0+d3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FLDApOworI2Vsc2UKKwlpZWVlLT53cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUpOworI2VuZGlmCisKKwlJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c3RhcnRfaWJzc193cSxpZWVlODAyMTFfc3RhcnRfaWJzc193cSk7CisJSU5JVF9XT1JLKCZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EsIGllZWU4MDIxMV9hc3NvY2lhdGVfY29tcGxldGVfd3EpOworCUlOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl93cSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSwgaWVlZTgwMjExX2Fzc29jaWF0ZV9yZXRyeV93cSk7CisJSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSk7CisKKworCXNlbWFfaW5pdCgmaWVlZS0+d3hfc2VtLCAxKTsKKwlzZW1hX2luaXQoJmllZWUtPnNjYW5fc2VtLCAxKTsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5tZ210X3R4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5iZWFjb25fbG9jayk7CisKKwl0YXNrbGV0X2luaXQoJmllZWUtPnBzX3Rhc2ssCisJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSkgaWVlZTgwMjExX3N0YV9wcywKKwkgICAgICh1bnNpZ25lZCBsb25nKWllZWUpOworCit9CisKK3ZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlkb3duKCZpZWVlLT53eF9zZW0pOworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKwlpZihOVUxMICE9IGllZWUtPnBEb3QxMWRJbmZvKQorCXsKKwkJa2ZyZWUoaWVlZS0+cERvdDExZEluZm8pOworCQlpZWVlLT5wRG90MTFkSW5mbyA9IE5VTEw7CisJfQorI2VuZGlmCisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGllZWUtPndxKTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YXJ0IG9mIFdQQSBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogdGhpcyBpcyBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQoreworCS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3BhX3N1cHBsaWNhbnQgbG9hZHMgYW5kIGNsb3NlcyB0aGUgZHJpdmVyCisJICogaW50ZXJmYWNlLiAqLworCXByaW50aygiJXMgV1BBXG4iLHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwlpZWVlLT53cGFfZW5hYmxlZCA9IHZhbHVlOworCXJldHVybiAwOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqd3BhX2llLCBpbnQgd3BhX2llX2xlbikKK3sKKwkvKiBtYWtlIHN1cmUgV1BBIGlzIGVuYWJsZWQgKi8KKwlpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCAxKTsKKworCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Cit9CisKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjb21tYW5kLCBpbnQgcmVhc29uKQoreworCisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgorCQkvLyBzaWxlbnRseSBpZ25vcmUKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfTUxNRV9TVEFfRElTQVNTT0M6CisJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKK3sKKwl1OCAqYnVmOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAorCSAgICAocGFyYW0tPnUud3BhX2llLmxlbiAmJiBwYXJhbS0+dS53cGFfaWUuZGF0YSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW0tPnUud3BhX2llLmxlbikgeworCQlidWYgPSBrbWFsbG9jKHBhcmFtLT51LndwYV9pZS5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1jcHkoYnVmLCBwYXJhbS0+dS53cGFfaWUuZGF0YSwgcGFyYW0tPnUud3BhX2llLmxlbik7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IGJ1ZjsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IHBhcmFtLT51LndwYV9pZS5sZW47CisJfSBlbHNlIHsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShpZWVlLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFVVEhfQUxHX09QRU5fU1lTVEVNCQkJMHgxCisjZGVmaW5lIEFVVEhfQUxHX1NIQVJFRF9LRVkJCQkweDIKKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKK3sKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAorCX07CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsdWUgJiBBVVRIX0FMR19TSEFSRURfS0VZKSB7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwkJaWVlZS0+b3Blbl93ZXAgPSAwOworCQlpZWVlLT5hdXRoX21vZGUgPSAxOworCX0gZWxzZSBpZiAodmFsdWUgJiBBVVRIX0FMR19PUEVOX1NZU1RFTSl7CisJCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfT1BFTjsKKwkJaWVlZS0+b3Blbl93ZXAgPSAxOworCQlpZWVlLT5hdXRoX21vZGUgPSAwOworCX0KKwllbHNlIGlmICh2YWx1ZSAmIElXX0FVVEhfQUxHX0xFQVApeworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX0xFQVA7CisJCWllZWUtPm9wZW5fd2VwID0gMTsKKwkJaWVlZS0+YXV0aF9tb2RlID0gMjsKKwl9CisKKworCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCS8vZWxzZQorCS8vCXJldCA9IC1FT1BOT1RTVVBQOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggbmFtZSwgdTMyIHZhbHVlKQoreworCWludCByZXQ9MDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChuYW1lKSB7CisJY2FzZSBJRUVFX1BBUkFNX1dQQV9FTkFCTEVEOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcz12YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfUEFSQU1fRFJPUF9VTkVOQ1JZUFRFRDogeworCQkvKiBIQUNLOgorCQkgKgorCQkgKiB3cGFfc3VwcGxpY2FudCBjYWxscyBzZXRfd3BhX2VuYWJsZWQgd2hlbiB0aGUgZHJpdmVyCisJCSAqIGlzIGxvYWRlZCBhbmQgdW5sb2FkZWQsIHJlZ2FyZGxlc3Mgb2YgaWYgV1BBIGlzIGJlaW5nCisJCSAqIHVzZWQuICBObyBvdGhlciBjYWxscyBhcmUgbWFkZSB3aGljaCBjYW4gYmUgdXNlZCB0bworCQkgKiBkZXRlcm1pbmUgaWYgZW5jcnlwdGlvbiB3aWxsIGJlIHVzZWQgb3Igbm90IHByaW9yIHRvCisJCSAqIGFzc29jaWF0aW9uIGJlaW5nIGV4cGVjdGVkLiAgSWYgZW5jcnlwdGlvbiBpcyBub3QgYmVpbmcKKwkJICogdXNlZCwgZHJvcF91bmVuY3J5cHRlZCBpcyBzZXQgdG8gZmFsc2UsIGVsc2UgdHJ1ZSAtLSB3ZQorCQkgKiBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBDQVBfUFJJVkFDWV9PTiBiaXQgc2hvdWxkCisJCSAqIGJlIHNldC4KKwkJICovCisJCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkJLmZsYWdzID0gU0VDX0VOQUJMRUQsCisJCQkuZW5hYmxlZCA9IHZhbHVlLAorCQl9OworCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkID0gdmFsdWU7CisJCS8qIFdlIG9ubHkgY2hhbmdlIFNFQ19MRVZFTCBmb3Igb3BlbiBtb2RlLiBPdGhlcnMKKwkJICogYXJlIHNldCBieSBpcHdfd3BhX3NldF9lbmNyeXB0aW9uLgorCQkgKi8KKwkJaWYgKCF2YWx1ZSkgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQl9CisJCWVsc2UgeworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOworCQl9CisJCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJRUVFX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRDoKKwkJaWVlZS0+cHJpdmFjeV9pbnZva2VkPXZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9BVVRIX0FMR1M6CisJCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYOgorCQlpZWVlLT5pZWVlODAyXzF4PXZhbHVlOworCQlicmVhazsKKwljYXNlIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1Q6CisJCS8vIGFkZGVkIGZvciBXUEEyIG1peGVkIG1vZGUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCWllZWUtPndwYXhfdHlwZV9zZXQgPSAxOworCQlpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID0gdmFsdWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBwYXJhbTogJWRcbiIsbmFtZSk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGltcGxlbWVudGF0aW9uIGJvcnJvd2VkIGZyb20gaG9zdGFwIGRyaXZlciAqLworCitzdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICBzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW0sIGludCBwYXJhbV9sZW4pCit7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwLAorCX07CisKKwlwYXJhbS0+dS5jcnlwdC5lcnIgPSAwOworCXBhcmFtLT51LmNyeXB0LmFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTiAtIDFdID0gJ1wwJzsKKworCWlmIChwYXJhbV9sZW4gIT0KKwkgICAgKGludCkgKChjaGFyICopIHBhcmFtLT51LmNyeXB0LmtleSAtIChjaGFyICopIHBhcmFtKSArCisJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pIHsKKwkJcHJpbnRrKCJMZW4gbWlzbWF0Y2ggJWQsICVkXG4iLCBwYXJhbV9sZW4sCisJCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocGFyYW0tPnN0YV9hZGRyWzBdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzFdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzJdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzNdID09IDB4ZmYgJiYKKwkgICAgcGFyYW0tPnN0YV9hZGRyWzRdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzVdID09IDB4ZmYpIHsKKwkJaWYgKHBhcmFtLT51LmNyeXB0LmlkeCA+PSBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtwYXJhbS0+dS5jcnlwdC5pZHhdOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDApIHsKKwkJaWYgKGNyeXB0KSB7CisJCQlzZWMuZW5hYmxlZCA9IDA7CisJCQkvLyBGSVhNRSBGSVhNRQorCQkJLy9zZWMuZW5jcnlwdCA9IDA7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKKwkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJCX0KKwkJZ290byBkb25lOworCX0KKwlzZWMuZW5hYmxlZCA9IDE7CisvLyBGSVhNRSBGSVhNRQorLy8Jc2VjLmVuY3J5cHQgPSAxOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKworCS8qIElQVyBIVyBjYW5ub3QgYnVpbGQgVEtJUCBNSUMsIGhvc3QgZGVjcnlwdGlvbiBzdGlsbCBuZWVkZWQuICovCisJaWYgKCEoaWVlZS0+aG9zdF9lbmNyeXB0IHx8IGllZWUtPmhvc3RfZGVjcnlwdCkgJiYKKwkgICAgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSkKKwkJZ290byBza2lwX2hvc3RfY3J5cHQ7CisKKwlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCS8vc2V0IFdFUDQwIGZpcnN0LCBpdCB3aWxsIGJlIG1vZGlmaWVkIGFjY29yZGluZyB0byBXRVAxMDQgb3IgV0VQNDAgYXQgb3RoZXIgcGxhY2UKKwl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgiaWVlZTgwMjExX2NyeXB0X3RraXAiKTsKKwkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfSBlbHNlIGlmIChvcHMgPT0gTlVMTCAmJiBzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF9jY21wIik7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0KKwlpZiAob3BzID09IE5VTEwpIHsKKwkJcHJpbnRrKCJ1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwgcGFyYW0tPnUuY3J5cHQuYWxnKTsKKwkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEc7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyAhPSBvcHMpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CisKKwkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKworCQluZXdfY3J5cHQgPSAoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICopCisJCQlrbWFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9CisJCQkJbmV3X2NyeXB0LT5vcHMtPmluaXQocGFyYW0tPnUuY3J5cHQuaWR4KTsKKworCQlpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisJfQorCisJaWYgKHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKwkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCisJCQkJICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbiwgcGFyYW0tPnUuY3J5cHQuc2VxLAorCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKwkJcHJpbnRrKCJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworIHNraXBfaG9zdF9jcnlwdDoKKwlpZiAocGFyYW0tPnUuY3J5cHQuc2V0X3R4KSB7CisJCWllZWUtPnR4X2tleWlkeCA9IHBhcmFtLT51LmNyeXB0LmlkeDsKKwkJc2VjLmFjdGl2ZV9rZXkgPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwl9IGVsc2UKKwkJc2VjLmZsYWdzICY9IH5TRUNfQUNUSVZFX0tFWTsKKworCWlmIChwYXJhbS0+dS5jcnlwdC5hbGcgIT0gTlVMTCkgeworCQltZW1jcHkoc2VjLmtleXNbcGFyYW0tPnUuY3J5cHQuaWR4XSwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleSwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlzZWMua2V5X3NpemVzW3BhcmFtLT51LmNyeXB0LmlkeF0gPSBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwgcGFyYW0tPnUuY3J5cHQuaWR4KTsKKworCQlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMzsKKwkJfQorCX0KKyBkb25lOgorCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCisJLyogRG8gbm90IHJlc2V0IHBvcnQgaWYgY2FyZCBpcyBpbiBNYW5hZ2VkIG1vZGUgc2luY2UgcmVzZXR0aW5nIHdpbGwKKwkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCisJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKKwkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KKwkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0KGllZWUtPmRldikpIHsKKwkJcHJpbnRrKCJyZXNldF9wb3J0IGZhaWxlZFxuIik7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQ7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoCisJCQkJCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCisJCQkJCQkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCQkJdTgJYXNSc24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpkaXNhc3M7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jKSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJZGlzYXNzID0gKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MpKTsKKwlkaXNhc3MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOworCWRpc2Fzcy0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKKworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJZGlzYXNzLT5yZWFzb24gPSBhc1JzbjsKKwlyZXR1cm4gc2tiOworfQorCisKK3ZvaWQKK1NlbmREaXNhc3NvY2lhdGlvbigKKwkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCXU4KiAJCQkJCWFzU3RhLAorCQl1OAkJCQkJCWFzUnNuCispCit7CisJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLGllZWUsYXNSc24pOworCQlpZiAoc2tiKXsKKwkJCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCQkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCisJCX0KK30KKworaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKQoreworCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKKwlpbnQgcmV0PTA7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8vSUVFRV9ERUJVR19JTkZPKCJ3cGFfc3VwcGxpY2FudDogbGVuPSVkXG4iLCBwLT5sZW5ndGgpOworCisJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwYXJhbSA9IChzdHJ1Y3QgaWVlZV9wYXJhbSAqKWttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFyYW0gPT0gTlVMTCl7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKKwkJa2ZyZWUocGFyYW0pOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKKworCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9QQVJBTToKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oaWVlZSwgcGFyYW0tPnUud3BhX3BhcmFtLm5hbWUsCisJCQkJCXBhcmFtLT51LndwYV9wYXJhbS52YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX0lFOgorCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTjoKKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfZW5jcnlwdGlvbihpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX01MTUU6CisJCXJldCA9IGllZWU4MDIxMV93cGFfbWxtZShpZWVlLCBwYXJhbS0+dS5tbG1lLmNvbW1hbmQsCisJCQkJICAgcGFyYW0tPnUubWxtZS5yZWFzb25fY29kZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKCJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLHBhcmFtLT5jbWQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA9PSAwICYmIGNvcHlfdG9fdXNlcihwLT5wb2ludGVyLCBwYXJhbSwgcC0+bGVuZ3RoKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCWtmcmVlKHBhcmFtKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCWVsc2UKKwkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChpZWVlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworfQorCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfYmVhY29uKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dha2VfcXVldWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZXNldF9xdWV1ZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9pc19zaG9ydHNsb3QpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfaXNfNTRnKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3BzX3R4X2Fjayk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3htaXQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMpOworRVhQT1JUX1NZTUJPTChub3RpZnlfd3hfYXNzb2NfZXZlbnQpOworRVhQT1JUX1NZTUJPTChTZW5kRGlzYXNzb2NpYXRpb24pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZGlzYXNzb2NpYXRlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdG9wX3NjYW4pOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKTsKKy8vRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzNWMyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYwpAQCAtMCwwICsxLDYxNSBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIFNvbWUgcGllY2VzIG9mIGNvZGUgbWlnaHQgYmUgc3RvbGVuIGZyb20gaXB3MjEwMCBkcml2ZXIKKyAqIGNvcHlyaWdodCBvZiB3aG8gb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIFBTIHd4IGhhbmRsZXIgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCwgY29weXJpZ2h0IHdobworICogb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisjaW5jbHVkZSAiZG90MTFkLmgiCisjZW5kaWYKKy8qIEZJWE1FOiBhZGQgQSBmcmVxcyAqLworCitjb25zdCBsb25nIGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzW10gPSB7CisJMjQxMiwgMjQxNywgMjQyMiwgMjQyNywKKwkyNDMyLCAyNDM3LCAyNDQyLCAyNDQ3LAorCTI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsCisJMjQ3MiwgMjQ4NAorfTsKKworCitpbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IGl3X2ZyZXEgKmZ3cnEgPSAmIHdycXUtPmZyZXE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGlmIHNldHRpbmcgYnkgZnJlcSBjb252ZXJ0IHRvIGNoYW5uZWwgKi8KKwlpZiAoZndycS0+ZSA9PSAxKSB7CisJCWlmICgoZndycS0+bSA+PSAoaW50KSAyLjQxMmU4ICYmCisJCSAgICAgZndycS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkgeworCQkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOworCQkJaW50IGMgPSAwOworCisJCQl3aGlsZSAoKGMgPCAxNCkgJiYgKGYgIT0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbY10pKQorCQkJCWMrKzsKKworCQkJLyogaGFjayB0byBmYWxsIHRocm91Z2ggKi8KKwkJCWZ3cnEtPmUgPSAwOworCQkJZndycS0+bSA9IGMgKyAxOworCQl9CisJfQorCisJaWYgKGZ3cnEtPmUgPiAwIHx8IGZ3cnEtPm0gPiAxNCB8fCBmd3JxLT5tIDwgMSApeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisKKwl9ZWxzZSB7IC8qIFNldCB0aGUgY2hhbm5lbCAqLworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZiAoIShHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKVtmd3JxLT5tXSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisjZW5kaWYKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBmd3JxLT5tOworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCisJCQlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7CisJCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCQkJfQorCX0KKworCXJldCA9IDA7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworCitpbnQgaWVlZTgwMjExX3d4X2dldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApCisJCXJldHVybiAtMTsKKwkvL05NIDAuNy4wIHdpbGwgbm90IGFjY2VwdCBjaGFubmVsIGFueSBtb3JlLgorCWZ3cnEtPm0gPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbC0xXSAqIDEwMDAwMDsKKwlmd3JxLT5lID0gMTsKKy8vCWZ3cnEtPm0gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKy8vCWZ3cnEtPmUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIC0xOworCisJLyogV2Ugd2FudCBhdm9pZCB0byBnaXZlIHRvIHRoZSB1c2VyIGluY29uc2lzdGVudCBpbmZvcyovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEICYmCisJCWllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRURfU0NBTk5JTkcgJiYKKwkJaWVlZS0+d2FwX3NldCA9PSAwKQorCisJCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsCisJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0ID0gMDsKKwl1OCB6ZXJvW10gPSB7MCwwLDAsMCwwLDB9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzaG9ydCBpZnVwID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsvL2Rldi0+ZmxhZ3MgJiBJRkZfVVA7CisJc3RydWN0IHNvY2thZGRyICp0ZW1wID0gKHN0cnVjdCBzb2NrYWRkciAqKWF3cnE7CisKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8qIHVzZSBpZmNvbmZpZyBodyBldGhlciAqLworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0ZW1wLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlmdXApCisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCisJLyoganVzdCB0byBhdm9pZCB0byBnaXZlIGluY29uc2lzdGVudCBpbmZvcyBpbiB0aGUKKwkgKiBnZXQgd3ggbWV0aG9kLiBub3QgcmVhbGx5IG5lZWRlZCBvdGhlcndpc2UKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgdGVtcC0+c2FfZGF0YSwgRVRIX0FMRU4pOworCWllZWUtPndhcF9zZXQgPSBtZW1jbXAodGVtcC0+c2FfZGF0YSwgemVybyxFVEhfQUxFTikhPTA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWZ1cCkKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKyBpbnQgaWVlZTgwMjExX3d4X2dldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSx1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCit7CisJaW50IGxlbixyZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCS8qIFdlIHdhbnQgYXZvaWQgdG8gZ2l2ZSB0byB0aGUgdXNlciBpbmNvbnNpc3RlbnQgaW5mb3MqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gPT0gJ1wwJyB8fAorCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCisJCWllZWUtPnNzaWRfc2V0ID09IDApeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwl3cnF1LT5lc3NpZC5sZW5ndGggPSBsZW47CisJc3RybmNweShiLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGxlbik7CisJd3JxdS0+ZXNzaWQuZmxhZ3MgPSAxOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXUzMiB0YXJnZXRfcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWU7CisKKwlpZWVlLT5yYXRlID0gdGFyZ2V0X3JhdGUvMTAwMDAwOworCS8vRklYTUU6IHdlIG1pZ2h0IHdhbnQgdG8gbGltaXQgcmF0ZSBhbHNvIGluIG1hbmFnZW1lbnQgcHJvdG9jb2xzLgorCXJldHVybiAwOworfQorCisKKworaW50IGllZWU4MDIxMV93eF9nZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTMyIHRtcF9yYXRlOworCXRtcF9yYXRlID0gVHhDb3VudFRvRGF0YVJhdGUoaWVlZSwgaWVlZS0+c29mdG1hY19zdGF0cy5DdXJyZW50U2hvd1R4YXRlKTsKKworCXdycXUtPmJpdHJhdGUudmFsdWUgPSB0bXBfcmF0ZSAqIDUwMDAwMDsKKworCXJldHVybiAwOworfQorCisKK2ludCBpZWVlODAyMTFfd3hfc2V0X3J0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaWYgKHdycXUtPnJ0cy5kaXNhYmxlZCB8fCAhd3JxdS0+cnRzLmZpeGVkKQorCQlpZWVlLT5ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJZWxzZQorCXsKKwkJaWYgKHdycXUtPnJ0cy52YWx1ZSA8IE1JTl9SVFNfVEhSRVNIT0xEIHx8CisJCQkJd3JxdS0+cnRzLnZhbHVlID4gTUFYX1JUU19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWVlZS0+cnRzID0gd3JxdS0+cnRzLnZhbHVlOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl3cnF1LT5ydHMudmFsdWUgPSBpZWVlLT5ydHM7CisJd3JxdS0+cnRzLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KKwl3cnF1LT5ydHMuZGlzYWJsZWQgPSAod3JxdS0+cnRzLnZhbHVlID09IERFRkFVTFRfUlRTX1RIUkVTSE9MRCk7CisJcmV0dXJuIDA7Cit9CitpbnQgaWVlZTgwMjExX3d4X3NldF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmICh3cnF1LT5tb2RlID09IGllZWUtPml3X21vZGUpCisJCWdvdG8gb3V0OworCisJaWYgKHdycXUtPm1vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKworCQlpZWVlLT5kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworCX1lbHNleworCQlpZWVlLT5kZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CisJfQorCisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKXsKKwkJaWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJfWVsc2V7CisJCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUpOworCQlpZWVlLT5pd19tb2RlID0gd3JxdS0+bW9kZTsKKwkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOworCX0KKworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiAwOworfQorCit2b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCB3eF9zeW5jX3NjYW5fd3EpOworCXNob3J0IGNoYW47CisJSFRfRVhUQ0hOTF9PRkZTRVQgY2hhbl9vZmZzZXQ9MDsKKwlIVF9DSEFOTkVMX1dJRFRIIGJhbmR3aWR0aD0wOworCWludCBiNDBNID0gMDsKKwlzdGF0aWMgaW50IGNvdW50ID0gMDsKKwljaGFuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKworCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKKwkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKworCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKKworCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORzsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCWllZWUtPkluaXRpYWxHYWluSGFuZGxlcihpZWVlLT5kZXYsSUdfQmFja3VwKTsKKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgJiYgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUICYmIGllZWUtPnBIVEluZm8tPmJDdXJCVzQwTUh6KSB7CisJCWI0ME0gPSAxOworCQljaGFuX29mZnNldCA9IGllZWUtPnBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQ7CisJCWJhbmR3aWR0aCA9IChIVF9DSEFOTkVMX1dJRFRIKWllZWUtPnBIVEluZm8tPmJDdXJCVzQwTUh6OworCQlwcmludGsoIlNjYW4gaW4gNDBNLCBmb3JjZSB0byAyME0gZmlyc3Q6JWQsICVkXG4iLCBjaGFuX29mZnNldCwgYmFuZHdpZHRoKTsKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJCX0KKwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7CisJaWYgKGI0ME0pIHsKKwkJcHJpbnRrKCJTY2FuIGluIDIwTSwgYmFjayB0byA0ME1cbiIpOworCQlpZiAoY2hhbl9vZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIpCisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4gKyAyKTsKKwkJZWxzZSBpZiAoY2hhbl9vZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpCisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4gLSAyKTsKKwkJZWxzZQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuKTsKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIGJhbmR3aWR0aCwgY2hhbl9vZmZzZXQpOworCX0gZWxzZSB7CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2hhbik7CisJfQorCisJaWVlZS0+SW5pdGlhbEdhaW5IYW5kbGVyKGllZWUtPmRldixJR19SZXN0b3JlKTsKKwlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBzY2FuLgorCWlmKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCisJeworCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPSAxOworCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPSAxOworCX0KKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7CisKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJY291bnQgPSAwOworCXVwKCZpZWVlLT53eF9zZW0pOworCit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldCA9IDA7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEoaWVlZS0+cHJvdG9fc3RhcnRlZCkpeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCBpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKKwkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPnd4X3N5bmNfc2Nhbl93cSk7CisJCS8qIGludGVudGlvbmFsbHkgZm9yZ2V0IHRvIHVwIHNlbSAqLworCQlyZXR1cm4gMDsKKwl9CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCWludCByZXQ9MCxsZW47CisJc2hvcnQgcHJvdG9fc3RhcnRlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKKworCWlmICh3cnF1LT5lc3NpZC5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSl7CisJCXJldD0gLUUyQklHOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCQlyZXQ9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZihwcm90b19zdGFydGVkKQorCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlKTsKKworCisJLyogdGhpcyBpcyBqdXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUgR0VUIHd4IGNhbGxiYWNrCisJICogaGFzIGNvbnNpc3RlbiBpbmZvcy4gbm90IG5lZWRlZCBvdGhlcndpc2UKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdycXUtPmVzc2lkLmZsYWdzICYmIHdycXUtPmVzc2lkLmxlbmd0aCkgeworCQkvL2ZpcnN0IGZsdXNoIGN1cnJlbnQgbmV0d29yay5zc2lkCisJCWxlbiA9ICgod3JxdS0+ZXNzaWQubGVuZ3RoLTEpIDwgSVdfRVNTSURfTUFYX1NJWkUpID8gKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA6IElXX0VTU0lEX01BWF9TSVpFOworCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBleHRyYSwgbGVuKzEpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBsZW4rMTsKKwkJaWVlZS0+c3NpZF9zZXQgPSAxOworCX0KKwllbHNleworCQlpZWVlLT5zc2lkX3NldCA9IDA7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID0gJ1wwJzsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKHByb3RvX3N0YXJ0ZWQpCisJCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisgaW50IGllZWU4MDIxMV93eF9nZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCXdycXUtPm1vZGUgPSBpZWVlLT5pd19tb2RlOworCXJldHVybiAwOworfQorCisgaW50IGllZWU4MDIxMV93eF9zZXRfcmF3dHgoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCWludCAqcGFybXMgPSAoaW50ICopZXh0cmE7CisJaW50IGVuYWJsZSA9IChwYXJtc1swXSA+IDApOworCXNob3J0IHByZXYgPSBpZWVlLT5yYXdfdHg7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYoZW5hYmxlKQorCQlpZWVlLT5yYXdfdHggPSAxOworCWVsc2UKKwkJaWVlZS0+cmF3X3R4ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8icmF3IFRYIGlzICVzXG4iLAorCSAgICAgIGllZWUtPnJhd190eCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJeworCQlpZihwcmV2ID09IDAgJiYgaWVlZS0+cmF3X3R4KXsKKwkJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCQkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCQl9CisKKwkJaWYocHJldiAmJiBpZWVlLT5yYXdfdHggPT0gMSkKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGllZWUtPmRldik7CisJfQorCisJdXAoJmllZWUtPnd4X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KHdycXUtPm5hbWUsICI4MDIuMTEiKTsKKwlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKKwkJc3RyY2F0KHdycXUtPm5hbWUsICJiIik7CisJCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCQkJc3RyY2F0KHdycXUtPm5hbWUsICIvZyIpOworCX1lbHNlIGlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQorCQlzdHJjYXQod3JxdS0+bmFtZSwgImciKTsKKwlpZiAoaWVlZS0+bW9kZSAmIChJRUVFX05fMjRHIHwgSUVFRV9OXzVHKSkKKwkJc3RyY2F0KHdycXUtPm5hbWUsICIvbiIpOworCisJaWYoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpIHx8CisJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HKSkKKwkJc3RyY2F0KHdycXUtPm5hbWUsIiBsaW5rZWQiKTsKKwllbHNlIGlmKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9OT0xJTkspCisJCXN0cmNhdCh3cnF1LT5uYW1lLCIgbGluay4uIik7CisKKworCXJldHVybiAwOworfQorCisKKy8qIHRoaXMgaXMgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCAqLworaW50IGllZWU4MDIxMV93eF9zZXRfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+cG93ZXIuZGlzYWJsZWQpeworCQlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwkJZ290byBleGl0OworCX0KKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9USU1FT1VUKSB7CisJCS8vaWVlZS0+cHNfcGVyaW9kID0gd3JxdS0+cG93ZXIudmFsdWUgLyAxMDAwOworCQlpZWVlLT5wc190aW1lb3V0ID0gd3JxdS0+cG93ZXIudmFsdWUgLyAxMDAwOworCX0KKworCWlmICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1BFUklPRCkgeworCisJCS8vaWVlZS0+cHNfdGltZW91dCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJaWVlZS0+cHNfcGVyaW9kID0gd3JxdS0+cG93ZXIudmFsdWUgLyAxMDAwOworCQkvL3dycS0+dmFsdWUgLyAxMDI0OworCisJfQorCXN3aXRjaCAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJY2FzZSBJV19QT1dFUl9VTklDQVNUX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1Q7CisJCWJyZWFrOworCWNhc2UgSVdfUE9XRVJfTVVMVElDQVNUX1I6CisJCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX01CQ0FTVDsKKwkJYnJlYWs7CisJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfVU5JQ0FTVCB8IElFRUU4MDIxMV9QU19NQkNBU1Q7CisJCWJyZWFrOworCisJY2FzZSBJV19QT1dFUl9PTjoKKwkvLwlpZWVlLT5wcyA9IElFRUU4MDIxMV9QU19ESVNBQkxFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisKKwl9CitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0wOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCl7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKKwkJZ290byBleGl0OworCX0KKworCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKworCWlmICgod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7CisJCXdycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5wc190aW1lb3V0ICogMTAwMDsKKwl9IGVsc2UgeworLy8JCXJldCA9IC1FT1BOT1RTVVBQOworLy8JCWdvdG8gZXhpdDsKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJCXdycXUtPnBvd2VyLnZhbHVlID0gaWVlZS0+cHNfcGVyaW9kICogMTAwMDsKKy8vaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kICogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqIDEwMjQ7CisJfQorCisgICAgICAgaWYgKChpZWVlLT5wcyAmIChJRUVFODAyMTFfUFNfTUJDQVNUIHwgSUVFRTgwMjExX1BTX1VOSUNBU1QpKSA9PSAoSUVFRTgwMjExX1BTX01CQ0FTVCB8IElFRUU4MDIxMV9QU19VTklDQVNUKSkKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfQUxMX1I7CisJZWxzZSBpZiAoaWVlZS0+cHMgJiBJRUVFODAyMTFfUFNfTUJDQVNUKQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9NVUxUSUNBU1RfUjsKKwllbHNlCisJCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX1VOSUNBU1RfUjsKKworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZXNzaWQpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X2Vzc2lkKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9yYXRlKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF93YXApOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X3dhcCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfbW9kZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfbW9kZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfc2Nhbik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZnJlcSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZnJlcSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfcmF3dHgpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X25hbWUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9wb3dlcik7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93bGFuX2ZyZXF1ZW5jaWVzKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9ydHMpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X3J0cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjljMzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMCwwICsxLDkxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBGZXcgbW9kaWZpY2F0aW9ucyBmb3IgUmVhbHRlaydzIFdpLUZpIGRyaXZlcnMgYnkKKyAgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCisgIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisKKworLyoKKworCis4MDIuMTEgRGF0YSBGcmFtZQorCisKKzgwMi4xMSBmcmFtZV9jb250b3JsIGZvciBkYXRhIGZyYW1lcyAtIDIgYnl0ZXMKKyAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorYml0cyB8IDAgIHwgIDEgIHwgIDIgIHwgIDMgIHwgIDQgIHwgIDUgIHwgIDYgIHwgIDcgIHwgIDggIHwgIDkgIHwgIGEgIHwgIGIgIHwgIGMgIHwgIGQgIHwgIGUgICB8CisgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKK3ZhbCAgfCAwICB8ICAwICB8ICAwICB8ICAxICB8ICB4ICB8ICAwICB8ICAwICB8ICAwICB8ICAxICB8ICAwICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICAgfAorICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18CitkZXNjIHwgXi12ZXItXiAgfCAgXnR5cGUtXiAgfCAgXi0tLS0tc3VidHlwZS0tLS0tXiAgfCB0byAgfGZyb20gfG1vcmUgfHJldHJ5fCBwd3IgfG1vcmUgfHdlcCAgIHwKKyAgICAgfCAgICAgICAgICB8ICAgICAgICAgICB8IHg9MCBkYXRhLHg9MSBkYXRhK2FjayB8IERTICB8IERTICB8ZnJhZyB8ICAgICB8IG1nbSB8ZGF0YSB8ICAgICAgfAorICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorODAyLjExIERhdGEgRnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgLC0tLS0tLS0tLSAnY3RybCcgZXhwYW5kcyB0byA+LS0tLS0tLS0tLS0nCisgICAgICAgICAgfAorICAgICAgLC0tJy0tLSwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8CisgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIEZyYW1lICB8ICBmY3MgfAorICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfCAgICAgICAgIHwgICAgICAgICB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgfC0tLS0tLScKK1RvdGFsOiAyOCBub24tZGF0YSBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAuLSAnRnJhbWUgZGF0YScgZXhwYW5kcyB0byA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMSAgIHwgIDEgICB8ICAgIDEgICAgfCAgICAzICAgICB8ICAyICAgfCAgMC0yMzA0IHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18CitEZXNjLiB8IFNOQVAgfCBTTkFQIHwgQ29udHJvbCB8RXRoIFR1bm5lbHwgVHlwZSB8IElQICAgICAgfAorICAgICAgfCBEU0FQIHwgU1NBUCB8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgfCBQYWNrZXQgIHwKKyAgICAgIHwgMHhBQSB8IDB4QUEgfDB4MDMgKFVJKXwweDAwLTAwLUY4fCAgICAgIHwgICAgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgfAorVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgYC0tLS0uLS0tLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIC4tICdJUCBQYWNrZXQnIGV4cGFuZHMsIGlmIFdFUCBlbmFibGVkLCB0byA8LS0nCisgICAgICAgfAorICAgICAgIFYKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDQgIHwgICAwLTIyOTYgIHwgIDQgIHwKKyAgICAgIHwtLS0tLXwtLS0tLS0tLS0tLXwtLS0tLXwKK0Rlc2MuIHwgSVYgIHwgRW5jcnlwdGVkIHwgSUNWIHwKKyAgICAgIHwgICAgIHwgSVAgUGFja2V0IHwgICAgIHwKKyAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzCisKKworODAyLjMgRXRoZXJuZXQgRGF0YSBGcmFtZQorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAgNiAgIHwgICA2ICAgfCAgMiAgIHwgIFZhcmlhYmxlIHwgICA0ICB8CisgICAgICB8LS0tLS0tLXwtLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IERlc3QuIHwgU291cmNlfCBUeXBlIHwgSVAgUGFja2V0IHwgIGZjcyB8CisgICAgICB8ICBNQUMgIHwgIE1BQyAgfCAgICAgIHwgICAgICAgICAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitUb3RhbDogMTggbm9uLWRhdGEgYnl0ZXMKKworSW4gdGhlIGV2ZW50IHRoYXQgZnJhZ21lbnRhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGluY29taW5nIHBheWxvYWQgaXMgc3BsaXQgaW50bworTiBwYXJ0cyBvZiBzaXplIGllZWUtPmZ0cy4gIFRoZSBmaXJzdCBmcmFnbWVudCBjb250YWlucyB0aGUgU05BUCBoZWFkZXIgYW5kIHRoZQorcmVtYWluaW5nIHBhY2tldHMgYXJlIGp1c3QgZGF0YS4KKworSWYgZW5jcnlwdGlvbiBpcyBlbmFibGVkLCBlYWNoIGZyYWdtZW50IHBheWxvYWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IGVub3VnaCBzcGFjZQordG8gYWRkIHRoZSBwcmVmaXggYW5kIHBvc3RmaXggKElWIGFuZCBJQ1YgdG90YWxsaW5nIDggYnl0ZXMgaW4gdGhlIGNhc2Ugb2YgV0VQKQorU28gaWYgeW91IGhhdmUgMTUwMCBieXRlcyBvZiBwYXlsb2FkIHdpdGggaWVlZS0+ZnRzIHNldCB0byA1MDAgd2l0aG91dAorZW5jcnlwdGlvbiBpdCB3aWxsIHRha2UgMyBmcmFtZXMuICBXaXRoIFdFUCBpdCB3aWxsIHRha2UgNCBmcmFtZXMgYXMgdGhlCitwYXlsb2FkIG9mIGVhY2ggZnJhbWUgaXMgcmVkdWNlZCB0byA0OTIgYnl0ZXMuCisKKyogU0tCIHZpc3VhbGl6YXRpb24KKyoKKyogICwtIHNrYi0+ZGF0YQorKiB8CisqIHwgICAgRVRIRVJORVQgSEVBREVSICAgICAgICAsLTwtLSBQQVlMT0FECisqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAxNCBieXRlcyBmcm9tIHNrYi0+ZGF0YQorKiB8ICAyIGJ5dGVzIGZvciBUeXBlIC0tPiAsVC4gfCAgICAgKHNpemVvZiBldGhoZHIpCisqIHwgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8CisqIHwsLURlc3QuLS0uICwtLVNyYy4tLS0uIHwgfCB8CisqIHwgIDYgYnl0ZXN8IHwgNiBieXRlcyB8IHwgfCB8CisqIHYgICAgICAgICB8IHwgICAgICAgICB8IHwgfCB8CisqIDAgICAgICAgICB8IHYgICAgICAgMSB8IHYgfCB2ICAgICAgICAgICAyCisqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorKiAgICAgXiAgICAgfCBeICAgICAgICAgfCBeIHwKKyogICAgIHwgICAgIHwgfCAgICAgICAgIHwgfCB8CisqICAgICB8ICAgICB8IHwgICAgICAgICB8IGBUJyA8LS0tLSAyIGJ5dGVzIGZvciBUeXBlCisqICAgICB8ICAgICB8IHwgICAgICAgICB8CisqICAgICB8ICAgICB8ICctLS1TTkFQLS0nIDwtLS0tLS0tLSA2IGJ5dGVzIGZvciBTTkFQCisqICAgICB8ICAgICB8CisqICAgICBgLUlWLS0nIDwtLS0tLS0tLS0tLS0tLS0tLS0tLSA0IGJ5dGVzIGZvciBJViAoV0VQKQorKgorKiAgICAgIFNOQVAgSEVBREVSCisqCisqLworCitzdGF0aWMgdTggUDgwMl8xSF9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweGY4IH07CitzdGF0aWMgdTggUkZDMTA0Ml9PVUlbUDgwMjExX09VSV9MRU5dID0geyAweDAwLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9wdXRfc25hcCh1OCAqZGF0YSwgdTE2IGhfcHJvdG8pCit7CisJc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqc25hcDsKKwl1OCAqb3VpOworCisJc25hcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyICopZGF0YTsKKwlzbmFwLT5kc2FwID0gMHhhYTsKKwlzbmFwLT5zc2FwID0gMHhhYTsKKwlzbmFwLT5jdHJsID0gMHgwMzsKKworCWlmIChoX3Byb3RvID09IDB4ODEzNyB8fCBoX3Byb3RvID09IDB4ODBmMykKKwkJb3VpID0gUDgwMl8xSF9PVUk7CisJZWxzZQorCQlvdWkgPSBSRkMxMDQyX09VSTsKKwlzbmFwLT5vdWlbMF0gPSBvdWlbMF07CisJc25hcC0+b3VpWzFdID0gb3VpWzFdOworCXNuYXAtPm91aVsyXSA9IG91aVsyXTsKKworCSoodTE2ICopKGRhdGEgKyBTTkFQX1NJWkUpID0gaHRvbnMoaF9wcm90byk7CisKKwlyZXR1cm4gU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7Cit9CisKK2ludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKKwlpbnQgaGRyX2xlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwlpbnQgcmVzOworCisJaWYgKCEoY3J5cHQgJiYgY3J5cHQtPm9wcykpCisJeworCQlwcmludGsoIj09PT09PT09PT4lcygpLCBjcnlwdCBpcyBudWxsXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorI2lmZGVmIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfVEtJUAorCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7CisKKwlpZiAoaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgJiYKKwkgICAgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJiBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSA9PSAwKSB7CisJCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBmcmFnLT5kYXRhOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRLSVAgY291bnRlcm1lYXN1cmVzOiBkcm9wcGVkICIKKwkJCSAgICAgICAiVFggcGFja2V0IHRvICIgTUFDX0ZNVCAiXG4iLAorCQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgTUFDX0FSRyhoZWFkZXItPmFkZHIxKSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCS8qIFRvIGVuY3J5cHQsIGZyYW1lIGZvcm1hdCBpczoKKwkgKiBJViAoNCBieXRlcyksIGNsZWFyIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQKSwgSUNWICg0IGJ5dGVzKSAqLworCisJLy8gUFI6IEZJWE1FOiBDb3BpZWQgZnJvbSBob3N0YXAuIENoZWNrIGZyYWdtZW50YXRpb24vTVNEVS9NUERVIGVuY3J5cHRpb24uCisJLyogSG9zdC1iYXNlZCBJRUVFIDgwMi4xMSBmcmFnbWVudGF0aW9uIGZvciBUWCBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28KKwkgKiBjYWxsIGJvdGggTVNEVSBhbmQgTVBEVSBlbmNyeXB0aW9uIGZ1bmN0aW9ucyBmcm9tIGhlcmUuICovCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gMDsKKwlpZiAoY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCWlmIChyZXMgPT0gMCAmJiBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUpCisJCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdShmcmFnLCBoZHJfbGVuLCBjcnlwdC0+cHJpdik7CisKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5jcnlwdGlvbiBmYWlsZWQ6IGxlbj0lZC5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIGZyYWctPmxlbik7CisJCWllZWUtPmllZWVfc3RhdHMudHhfZGlzY2FyZHMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgaWVlZTgwMjExX3R4Yl9mcmVlKHN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGIpIHsKKwkvL2ludCBpOworCWlmICh1bmxpa2VseSghdHhiKSkKKwkJcmV0dXJuOworCWtmcmVlKHR4Yik7Cit9CisKK3N0cnVjdCBpZWVlODAyMTFfdHhiICppZWVlODAyMTFfYWxsb2NfdHhiKGludCBucl9mcmFncywgaW50IHR4Yl9zaXplLAorCQkJCQkgIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOworCWludCBpOworCXR4YiA9IGttYWxsb2MoCisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikgKyAoc2l6ZW9mKHU4KikgKiBucl9mcmFncyksCisJCWdmcF9tYXNrKTsKKwlpZiAoIXR4YikKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQodHhiLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpKTsKKwl0eGItPm5yX2ZyYWdzID0gbnJfZnJhZ3M7CisJdHhiLT5mcmFnX3NpemUgPSB0eGJfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXR4Yi0+ZnJhZ21lbnRzW2ldID0gZGV2X2FsbG9jX3NrYih0eGJfc2l6ZSk7CisJCWlmICh1bmxpa2VseSghdHhiLT5mcmFnbWVudHNbaV0pKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQodHhiLT5mcmFnbWVudHNbaV0tPmNiLCAwLCBzaXplb2YodHhiLT5mcmFnbWVudHNbaV0tPmNiKSk7CisJfQorCWlmICh1bmxpa2VseShpICE9IG5yX2ZyYWdzKSkgeworCQl3aGlsZSAoaSA+PSAwKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaS0tXSk7CisJCWtmcmVlKHR4Yik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdHhiOworfQorCisvLyBDbGFzc2lmeSB0aGUgdG8tYmUgc2VuZCBkYXRhIHBhY2tldAorLy8gTmVlZCB0byBhY3F1aXJlIHRoZSBzZW50IHF1ZXVlIGluZGV4Lgorc3RhdGljIGludAoraWVlZTgwMjExX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3sKKwlzdHJ1Y3QgZXRoaGRyICpldGg7CisJc3RydWN0IGlwaGRyICppcDsKKwlldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKwlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKKwkJcmV0dXJuIDA7CisKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpcCA9IGlwX2hkcihza2IpOworCXN3aXRjaCAoaXAtPnRvcyAmIDB4ZmMpIHsKKwkJY2FzZSAweDIwOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgMHg0MDoKKwkJCXJldHVybiAxOworCQljYXNlIDB4NjA6CisJCQlyZXR1cm4gMzsKKwkJY2FzZSAweDgwOgorCQkJcmV0dXJuIDQ7CisJCWNhc2UgMHhhMDoKKwkJCXJldHVybiA1OworCQljYXNlIDB4YzA6CisJCQlyZXR1cm4gNjsKKwkJY2FzZSAweGUwOgorCQkJcmV0dXJuIDc7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKyNkZWZpbmUgU05fTEVTUyhhLCBiKQkJKCgoYS1iKSYweDgwMCkhPTApCit2b2lkIGllZWU4MDIxMV90eF9xdWVyeV9hZ2dfY2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBjYl9kZXNjKiB0Y2JfZGVzYykKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCVBUWF9UU19SRUNPUkQJCQlwVHhUcyA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIqIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciopc2tiLT5kYXRhOworCisJaWYgKCFwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydHx8IXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCWlmICghSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKSkKKwkJcmV0dXJuOworCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQorCQlyZXR1cm47CisJLy9jaGVjayBwYWNrZXQgYW5kIG1vZGUgbGF0ZXIKKyNpZmRlZiBUT19ET19MSVNUCisJaWYocFRjYi0+UGFja2V0TGVuZ3RoID49IDQwOTYpCisJCXJldHVybjsKKwkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2UgZG9uJ3QgYWdncnJlZ2F0aW9uLgorCWlmKCFBZGFwdGVyLT5IYWxGdW5jLkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnSGFuZGxlcihBZGFwdGVyKSkKKwkJcmV0dXJuOworI2VuZGlmCisJaWYoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUtPmRldikpCisJeworCQlyZXR1cm47CisJfQorCWlmKHBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpCisJeworCQlpZiAoIUdldFRzKGllZWUsIChQVFNfQ09NTU9OX0lORk8qKSgmcFR4VHMpLCBoZHItPmFkZHIxLCBza2ItPnByaW9yaXR5LCBUWF9ESVIsIHRydWUpKQorCQl7CisJCQlwcmludGsoIj09PT5jYW4ndCBnZXQgVFNcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLmJWYWxpZCA9PSBmYWxzZSkKKwkJeworCQkJVHNTdGFydEFkZEJhUHJvY2VzcyhpZWVlLCBwVHhUcyk7CisJCQlnb3RvIEZPUkNFRF9BR0dfU0VUVElORzsKKwkJfQorCQllbHNlIGlmIChwVHhUcy0+YlVzaW5nQmEgPT0gZmFsc2UpCisJCXsKKwkJCWlmIChTTl9MRVNTKHBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQuQmFTdGFydFNlcUN0cmwuZmllbGQuU2VxTnVtLCAocFR4VHMtPlR4Q3VyU2VxKzEpJTQwOTYpKQorCQkJCXBUeFRzLT5iVXNpbmdCYSA9IHRydWU7CisJCQllbHNlCisJCQkJZ290byBGT1JDRURfQUdHX1NFVFRJTkc7CisJCX0KKworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQl7CisJCQl0Y2JfZGVzYy0+YkFNUERVRW5hYmxlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5hbXBkdV9mYWN0b3IgPSBwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3I7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSA9IHBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eTsKKwkJfQorCX0KK0ZPUkNFRF9BR0dfU0VUVElORzoKKwlzd2l0Y2gocEhUSW5mby0+Rm9yY2VkQU1QRFVNb2RlICkKKwl7CisJCWNhc2UgSFRfQUdHX0FVVE86CisJCQlicmVhazsKKworCQljYXNlIEhUX0FHR19GT1JDRV9FTkFCTEU6CisJCQl0Y2JfZGVzYy0+YkFNUERVRW5hYmxlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5hbXBkdV9kZW5zaXR5ID0gcEhUSW5mby0+Rm9yY2VkTVBEVURlbnNpdHk7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yID0gcEhUSW5mby0+Rm9yY2VkQU1QRFVGYWN0b3I7CisJCQlicmVhazsKKworCQljYXNlIEhUX0FHR19GT1JDRV9ESVNBQkxFOgorCQkJdGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSA9IGZhbHNlOworCQkJdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkgPSAwOworCQkJdGNiX2Rlc2MtPmFtcGR1X2ZhY3RvciA9IDA7CisJCQlicmVhazsKKworCX0KKwkJcmV0dXJuOworfQorCitleHRlcm4gdm9pZCBpZWVlODAyMTFfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGNiX2Rlc2MqIHRjYl9kZXNjKQoreworCXRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSA9IGZhbHNlOworCWlmICh0Y2JfZGVzYy0+ZGF0YV9yYXRlID09IDIpCisJey8vLy8gMU0gY2FuIG9ubHkgdXNlIExvbmcgUHJlYW1ibGUuIDExQiBzcGVjCisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJeworCQl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSB0cnVlOworCX0KKwlyZXR1cm47Cit9CitleHRlcm4Jdm9pZAoraWVlZTgwMjExX3F1ZXJ5X0hUQ2FwU2hvcnRHSShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2JfZGVzYyAqdGNiX2Rlc2MpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAkJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgCQk9IGZhbHNlOworCisJaWYoIXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0fHwhcEhUSW5mby0+YkVuYWJsZUhUKQorCQlyZXR1cm47CisKKwlpZihwSFRJbmZvLT5iRm9yY2VkU2hvcnRHSSkKKwl7CisJCXRjYl9kZXNjLT5iVXNlU2hvcnRHSSA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwlpZigocEhUSW5mby0+YkN1ckJXNDBNSHo9PXRydWUpICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopCisJCXRjYl9kZXNjLT5iVXNlU2hvcnRHSSA9IHRydWU7CisJZWxzZSBpZigocEhUSW5mby0+YkN1ckJXNDBNSHo9PWZhbHNlKSAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6KQorCQl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgPSB0cnVlOworfQorCit2b2lkIGllZWU4MDIxMV9xdWVyeV9CYW5kd2lkdGhNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBjYl9kZXNjICp0Y2JfZGVzYykKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJdGNiX2Rlc2MtPmJQYWNrZXRCVyA9IGZhbHNlOworCisJaWYoIXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0fHwhcEhUSW5mby0+YkVuYWJsZUhUKQorCQlyZXR1cm47CisKKwlpZih0Y2JfZGVzYy0+Yk11bHRpY2FzdCB8fCB0Y2JfZGVzYy0+YkJyb2FkY2FzdCkKKwkJcmV0dXJuOworCisJaWYoKHRjYl9kZXNjLT5kYXRhX3JhdGUgJiAweDgwKT09MCkgLy8gSWYgdXNpbmcgbGVnYWN5IHJhdGUsIGl0IHNoYWxsIHVzZSAyME1IeiBjaGFubmVsLgorCQlyZXR1cm47CisJLy9CYW5kV2lkdGhBdXRvU3dpdGNoIGlzIGZvciBhdXRvIHN3aXRjaCB0byAyMCBvciA0MCBpbiBsb25nIGRpc3RhbmNlCisJaWYocEhUSW5mby0+YkN1ckJXNDBNSHogJiYgcEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJiAhaWVlZS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeikKKwkJdGNiX2Rlc2MtPmJQYWNrZXRCVyA9IHRydWU7CisJcmV0dXJuOworfQorCit2b2lkIGllZWU4MDIxMV9xdWVyeV9wcm90ZWN0aW9ubW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgY2JfZGVzYyogdGNiX2Rlc2MsIHN0cnVjdCBza19idWZmKiBza2IpCit7CisJLy8gQ29tbW9uIFNldHRpbmdzCisJdGNiX2Rlc2MtPmJSVFNTVEJDCQkJPSBmYWxzZTsKKwl0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0kJCT0gZmFsc2U7IC8vIFNpbmNlIHByb3RlY3Rpb24gZnJhbWVzIGFyZSBhbHdheXMgc2VudCBieSBsZWdhY3kgcmF0ZSwgU2hvcnRHSSB3aWxsIG5ldmVyIGJlIHVzZWQuCisJdGNiX2Rlc2MtPmJDVFNFbmFibGUJCQk9IGZhbHNlOyAvLyBNb3N0IG9mIHByb3RlY3Rpb24gdXNpbmcgUlRTL0NUUworCXRjYl9kZXNjLT5SVFNTQwkJCQk9IDA7CQkvLyAyME1IejogRG9uJ3QgY2FyZTsgIDQwTUh6OiBEdXBsaWNhdGUuCisJdGNiX2Rlc2MtPmJSVFNCVwkJCT0gZmFsc2U7IC8vIFJUUyBmcmFtZSBiYW5kd2lkdGggaXMgYWx3YXlzIDIwTUh6CisKKwlpZih0Y2JfZGVzYy0+YkJyb2FkY2FzdCB8fCB0Y2JfZGVzYy0+Yk11bHRpY2FzdCkvL29ubHkgdW5pY2FzdCBmcmFtZSB3aWxsIHVzZSBydHMvY3RzCisJCXJldHVybjsKKworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihza2ItPmRhdGErMTYpKSAgLy9jaGVjayBhZGRyMyBhcyBpbmZyYXN0cnVjdHVyZSBhZGQzIGlzIERBLgorCQlyZXR1cm47CisKKwlpZiAoaWVlZS0+bW9kZSA8IElFRUVfTl8yNEcpIC8vYiwgZyBtb2RlCisJeworCQkJLy8gKDEpIFJUU19UaHJlc2hvbGQgaXMgY29tcGFyZWQgdG8gdGhlIE1QRFUsIG5vdCBNU0RVLgorCQkJLy8gKDIpIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGZyYWcgaW4gIHRoaXMgTVNEVSwgb25seSB0aGUgZmlyc3QgZnJhZyB1c2VzIHByb3RlY3Rpb24gZnJhbWUuCisJCQkvLwkJT3RoZXIgZnJhZ21lbnRzIGFyZSBwcm90ZWN0ZWQgYnkgcHJldmlvdXMgZnJhZ21lbnQuCisJCQkvLwkJU28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBsZW5ndGggb2YgZmlyc3QgZnJhZ21lbnQuCisJCWlmIChza2ItPmxlbiA+IGllZWUtPnJ0cykKKwkJeworCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJfQorCQllbHNlIGlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24pCisJCXsKKwkJCS8vIFVzZSBDVFMtdG8tU0VMRiBpbiBwcm90ZWN0aW9uIG1vZGUuCisJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQl9CisJCS8vb3RoZXJ3aXNlIHJldHVybjsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJey8vIDExbiBIaWdoIHRocm91Z2hwdXQgY2FzZS4KKwkJUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwkJd2hpbGUgKHRydWUpCisJCXsKKwkJCS8vY2hlY2sgRVJQIHByb3RlY3Rpb24KKwkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24pCisJCQl7Ly8gQ1RTLXRvLVNFTEYKKwkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUgPSB0cnVlOworCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCQkJYnJlYWs7CisJCQl9CisJCQkvL2NoZWNrIEhUIG9wIG1vZGUKKwkJCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICAmJiBwSFRJbmZvLT5iRW5hYmxlSFQpCisJCQl7CisJCQkJdTggSFRPcE1vZGUgPSBwSFRJbmZvLT5DdXJyZW50T3BNb2RlOworCQkJCWlmKChwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiAoSFRPcE1vZGUgPT0gMiB8fCBIVE9wTW9kZSA9PSAzKSkgfHwKKwkJCQkJCQkoIXBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIEhUT3BNb2RlID09IDMpICkKKwkJCQl7CisJCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07IC8vIFJhdGUgaXMgMjRNYnBzLgorCQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8vY2hlY2sgcnRzCisJCQlpZiAoc2tiLT5sZW4gPiBpZWVlLT5ydHMpCisJCQl7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsgLy8gUmF0ZSBpcyAyNE1icHMuCisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJLy90byBkbyBsaXN0OiBjaGVjayBNSU1PIHBvd2VyIHNhdmUgY29uZGl0aW9uLgorCQkJLy9jaGVjayBBTVBEVSBhZ2dyZWdhdGlvbiBmb3IgVFhPUAorCQkJaWYodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkKKwkJCXsKKwkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOyAvLyBSYXRlIGlzIDI0TWJwcy4KKwkJCQkvLyBBY2NvcmRpbmcgdG8gODE5MCBkZXNpZ24sIGZpcm13YXJlIHNlbmRzIENGLUVuZCBvbmx5IGlmIFJUUy9DVFMgaXMgZW5hYmxlZC4gSG93ZXZlciwgaXQgZGVncmFkcworCQkJCS8vIHRocm91Z2hwdXQgYXJvdW5kIDEwTSwgc28gd2UgZGlzYWJsZSBvZiB0aGlzIG1lY2hhbmlzbS4gMjAwNy4wOC4wMyBieSBFbWlseQorCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvL2NoZWNrIElPVCBhY3Rpb24KKwkJCWlmKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGKQorCQkJeworCQkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gdHJ1ZTsKKwkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgID0gCU1HTl8yNE07CisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gVG90YWxseSBubyBwcm90ZWN0aW9uIGNhc2UhIQorCQkJZ290byBOT19QUk9URUNUSU9OOworCQl9CisJCX0KKwkvLyBGb3IgdGVzdCAsIENUUyByZXBsYWNlIHdpdGggUlRTCisJaWYoIDAgKQorCXsKKwkJdGNiX2Rlc2MtPmJDVFNFbmFibGUJPSB0cnVlOworCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSAJPSB0cnVlOworCX0KKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCXRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSA9IHRydWU7CisJaWYgKGllZWUtPm1vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlnb3RvIE5PX1BST1RFQ1RJT047CisJcmV0dXJuOworTk9fUFJPVEVDVElPTjoKKwl0Y2JfZGVzYy0+YlJUU0VuYWJsZQk9IGZhbHNlOworCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gZmFsc2U7CisJdGNiX2Rlc2MtPnJ0c19yYXRlCQk9IDA7CisJdGNiX2Rlc2MtPlJUU1NDCQk9IDA7CisJdGNiX2Rlc2MtPmJSVFNCVwkJPSBmYWxzZTsKK30KKworCit2b2lkIGllZWU4MDIxMV90eHJhdGVfc2VsZWN0bW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgY2JfZGVzYyogdGNiX2Rlc2MpCit7CisjaWZkZWYgVE9fRE9fTElTVAorCWlmKCFJc0RhdGFGcmFtZShwRnJhbWUpKQorCXsKKwkJcFRjYi0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IFRSVUU7CisJCXBUY2ItPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IFRSVUU7CisJCXBUY2ItPlJBVFJJbmRleCA9IDc7CisJCXJldHVybjsKKwl9CisKKwlpZihwTWdudEluZm8tPkZvcmNlZERhdGFSYXRlIT0gMCkKKwl7CisJCXBUY2ItPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSBUUlVFOworCQlwVGNiLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSBUUlVFOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJaWYoaWVlZS0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjaykKKwkJdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSB0cnVlOworCisJaWYoaWVlZS0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlKQorCQl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gdHJ1ZTsKKwlpZighdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgfHwgIXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUpCisJeworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCXRjYl9kZXNjLT5SQVRSSW5kZXggPSAwOworCX0KK30KKwordm9pZCBpZWVlODAyMTFfcXVlcnlfc2VxbnVtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKmllZWUsIHN0cnVjdCBza19idWZmKiBza2IsIHU4KiBkc3QpCit7CisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRzdCkgfHwgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZHN0KSkKKwkJcmV0dXJuOworCWlmIChJc1FvU0RhdGFGcmFtZShza2ItPmRhdGEpKSAvL3dlIGRlYWwgcW9zIGRhdGEgb25seQorCXsKKwkJUFRYX1RTX1JFQ09SRCBwVFMgPSBOVUxMOworCQlpZiAoIUdldFRzKGllZWUsIChQVFNfQ09NTU9OX0lORk8qKSgmcFRTKSwgZHN0LCBza2ItPnByaW9yaXR5LCBUWF9ESVIsIHRydWUpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJcFRTLT5UeEN1clNlcSA9IChwVFMtPlR4Q3VyU2VxKzEpJTQwOTY7CisJfQorfQorCitpbnQgaWVlZTgwMjExX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmZyYWdfaGRyOworCWludCBpLCBieXRlc19wZXJfZnJhZywgbnJfZnJhZ3MsIGJ5dGVzX2xhc3RfZnJhZywgZnJhZ19zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmllZWUtPnN0YXRzOworCWludCBldGhlcl90eXBlID0gMCwgZW5jcnlwdDsKKwlpbnQgYnl0ZXMsIGZjLCBxb3NfY3RsID0gMCwgaGRyX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWc7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgaGVhZGVyID0geyAvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLworCQkuZHVyYXRpb25faWQgPSAwLAorCQkuc2VxX2N0bCA9IDAsCisJCS5xb3NfY3RsID0gMAorCX07CisJdTggZGVzdFtFVEhfQUxFTl0sIHNyY1tFVEhfQUxFTl07CisJaW50IHFvc19hY3RpdmVkID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZTsKKworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7CisKKwljYl9kZXNjICp0Y2JfZGVzYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGVyZSBpcyBubyBkcml2ZXIgaGFuZGxlciB0byB0YWtlIHRoZSBUWEIsIGRvbnQnIGJvdGhlcgorCSAqIGNyZWF0aW5nIGl0Li4uICovCisJaWYgKCghaWVlZS0+aGFyZF9zdGFydF94bWl0ICYmICEoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpfHwKKwkgICAoKCFpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyB4bWl0IGhhbmRsZXIuXG4iLAorCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKKwkJZ290byBzdWNjZXNzOworCX0KKworCisJaWYobGlrZWx5KGllZWUtPnJhd190eCA9PSAwKSl7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IFNOQVBfU0laRSArIHNpemVvZih1MTYpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOworCQlldGhlcl90eXBlID0gbnRvaHMoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90byk7CisKKwkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCisJCWVuY3J5cHQgPSAhKGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFICYmIGllZWUtPmllZWU4MDJfMXgpICYmCisJCQlpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wczsKKworCQlpZiAoIWVuY3J5cHQgJiYgaWVlZS0+aWVlZTgwMl8xeCAmJgorCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkICYmIGV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSB7CisJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJZ290byBzdWNjZXNzOworCQl9CisJI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKKwkJaWYgKGNyeXB0ICYmICFlbmNyeXB0ICYmIGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBTTkFQX1NJWkUgLSBzaXplb2YodTE2KSk7CisJCQlJRUVFODAyMTFfREVCVUdfRUFQKCJUWDogSUVFRSA4MDIuMTEgRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKKwkJfQorCSNlbmRpZgorCisJCS8qIFNhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKwkJbWVtY3B5KCZkZXN0LCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KCZzcmMsIHNrYi0+ZGF0YStFVEhfQUxFTiwgRVRIX0FMRU4pOworCisgICAgICAgICAgICAgICAgLyogQWR2YW5jZSB0aGUgU0tCIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAqLworICAgICAgICAgICAgICAgIHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKKworICAgICAgICAgICAgICAgIC8qIERldGVybWluZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSByZXF1aXJlZCBmb3IgVFhCIHBhY2tldHMgKi8KKyAgICAgICAgICAgICAgICBieXRlcyA9IHNrYi0+bGVuICsgU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisKKwkJaWYgKGVuY3J5cHQpCisJCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDVExfV0VQOworCQllbHNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEE7CisKKwkJLy9pZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkKKwkJaWYocW9zX2FjdGl2ZWQpCisJCQlmYyB8PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEE7CisJCWVsc2UKKwkJCWZjIHw9IElFRUU4MDIxMV9TVFlQRV9EQVRBOworCisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJCWZjIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7CisJCQkvKiBUbyBEUzogQWRkcjEgPSBCU1NJRCwgQWRkcjIgPSBTQSwKKwkJCUFkZHIzID0gREEgKi8KKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCAmc3JjLCBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgJmRlc3QsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCS8qIG5vdCBGcm9tL1RvIERTOiBBZGRyMSA9IERBLCBBZGRyMiA9IFNBLAorCQkJQWRkcjMgPSBCU1NJRCAqLworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBzcmMsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwkJfQorCisgICAgICAgICAgICAgICAgaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZjKTsKKworCQkvKiBEZXRlcm1pbmUgZnJhZ21lbnRhdGlvbiBzaXplIGJhc2VkIG9uIGRlc3RpbmF0aW9uIChtdWx0aWNhc3QKKwkJKiBhbmQgYnJvYWRjYXN0IGFyZSBub3QgZnJhZ21lbnRlZCkgKi8KKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkgfHwKKwkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSkgeworCQkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCQkJcW9zX2N0bCB8PSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLOworCQl9CisJCWVsc2UgeworCQkJZnJhZ19zaXplID0gaWVlZS0+ZnRzOy8vZGVmYXVsdDozOTIKKwkJCXFvc19jdGwgPSAwOworCQl9CisKKwkJLy9pZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLlFvU19FbmFibGUpCisJCWlmKHFvc19hY3RpdmVkKQorCQl7CisJCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTiArIDI7CisKKwkJCXNrYi0+cHJpb3JpdHkgPSBpZWVlODAyMTFfY2xhc3NpZnkoc2tiLCAmaWVlZS0+Y3VycmVudF9uZXR3b3JrKTsKKwkJCXFvc19jdGwgfD0gc2tiLT5wcmlvcml0eTsgLy9zZXQgaW4gdGhlIGllZWU4MDIxMV9jbGFzc2lmeQorCQkJaGVhZGVyLnFvc19jdGwgPSBjcHVfdG9fbGUxNihxb3NfY3RsICYgSUVFRTgwMjExX1FPU19USUQpOworCQl9IGVsc2UgeworCQkJaGRyX2xlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisJCX0KKwkJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKKwkJKiB0aGlzIHN0YWNrIGlzIHByb3ZpZGluZyB0aGUgZnVsbCA4MDIuMTEgaGVhZGVyLCBvbmUgd2lsbAorCQkqIGV2ZW50dWFsbHkgYmUgYWZmaXhlZCB0byB0aGlzIGZyYWdtZW50IC0tIHNvIHdlIG11c3QgYWNjb3VudCBmb3IKKwkJKiBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwkJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBoZHJfbGVuOworCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJKENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgfCBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTKSkKKwkJCWJ5dGVzX3Blcl9mcmFnIC09IElFRUU4MDIxMV9GQ1NfTEVOOworCisJCS8qIEVhY2ggZnJhZ21lbnQgbWF5IG5lZWQgdG8gaGF2ZSByb29tIGZvciBlbmNyeXB0aW9uZyBwcmUvcG9zdGZpeCAqLworCQlpZiAoZW5jcnlwdCkKKwkJCWJ5dGVzX3Blcl9mcmFnIC09IGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4gKworCQkJCWNyeXB0LT5vcHMtPmV4dHJhX3Bvc3RmaXhfbGVuOworCisJCS8qIE51bWJlciBvZiBmcmFnbWVudHMgaXMgdGhlIHRvdGFsIGJ5dGVzX3Blcl9mcmFnIC8KKwkJKiBwYXlsb2FkX3Blcl9mcmFnbWVudCAqLworCQlucl9mcmFncyA9IGJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYWc7CisJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzICUgYnl0ZXNfcGVyX2ZyYWc7CisJCWlmIChieXRlc19sYXN0X2ZyYWcpCisJCQlucl9mcmFncysrOworCQllbHNlCisJCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlc19wZXJfZnJhZzsKKworCQkvKiBXaGVuIHdlIGFsbG9jYXRlIHRoZSBUWEIgd2UgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgcmVzZXJ2ZQorCQkqIGFuZCBmdWxsIGZyYWdtZW50IGJ5dGVzIChieXRlc19wZXJfZnJhZyBkb2Vzbid0IGluY2x1ZGUgcHJlZml4LAorCQkqIHBvc3RmaXgsIGhlYWRlciwgRkNTLCBldGMuKSAqLworCQl0eGIgPSBpZWVlODAyMTFfYWxsb2NfdHhiKG5yX2ZyYWdzLCBmcmFnX3NpemUgKyBpZWVlLT50eF9oZWFkcm9vbSwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2VseSghdHhiKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJdHhiLT5lbmNyeXB0ZWQgPSBlbmNyeXB0OworCQl0eGItPnBheWxvYWRfc2l6ZSA9IGJ5dGVzOworCisJCS8vaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlKQorCQlpZihxb3NfYWN0aXZlZCkKKwkJeworCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOworCQl9IGVsc2UgeworCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzs7CisJCX0KKworCisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJCXNrYl9mcmFnID0gdHhiLT5mcmFnbWVudHNbaV07CisJCQl0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYl9mcmFnLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJCWlmKHFvc19hY3RpdmVkKXsKKwkJCQlza2JfZnJhZy0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5Oy8vVVAyQUMoc2tiLT5wcmlvcml0eSk7CisJCQkJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gIFVQMkFDKHNrYi0+cHJpb3JpdHkpOworCQkJfSBlbHNlIHsKKwkJCQlza2JfZnJhZy0+cHJpb3JpdHkgPSBXTUVfQUNfQks7CisJCQkJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gV01FX0FDX0JLOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiX2ZyYWcsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCQkJaWYgKGVuY3J5cHQpeworCQkJCWlmIChpZWVlLT5od3NlY19hY3RpdmUpCisJCQkJCXRjYl9kZXNjLT5iSHdTZWMgPSAxOworCQkJCWVsc2UKKwkJCQkJdGNiX2Rlc2MtPmJId1NlYyA9IDA7CisJCQkJc2tiX3Jlc2VydmUoc2tiX2ZyYWcsIGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4pOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRjYl9kZXNjLT5iSHdTZWMgPSAwOworCQkJfQorCQkJZnJhZ19oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKilza2JfcHV0KHNrYl9mcmFnLCBoZHJfbGVuKTsKKwkJCW1lbWNweShmcmFnX2hkciwgJmhlYWRlciwgaGRyX2xlbik7CisKKwkJCS8qIElmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGZyYWdtZW50LCB0aGVuIGFkZCB0aGUgTU9SRUZSQUdTCisJCQkqIGJpdCB0byB0aGUgZnJhbWUgY29udHJvbCAqLworCQkJaWYgKGkgIT0gbnJfZnJhZ3MgLSAxKSB7CisJCQkJZnJhZ19oZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KAorCQkJCQlmYyB8IElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7CisJCQkJYnl0ZXMgPSBieXRlc19wZXJfZnJhZzsKKworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgbGFzdCBmcmFnbWVudCB0YWtlcyB0aGUgcmVtYWluaW5nIGxlbmd0aCAqLworCQkJCWJ5dGVzID0gYnl0ZXNfbGFzdF9mcmFnOworCQkJfQorCQkJLy9pZihpZWVlLT5jdXJyZW50X25ldHdvcmsuUW9TX0VuYWJsZSkKKwkJCWlmKHFvc19hY3RpdmVkKQorCQkJeworCQkJCS8vIGFkZCAxIG9ubHkgaW5kaWNhdGUgdG8gY29ycmVzcG9uZGluZyBzZXEgbnVtYmVyIGNvbnRyb2wgMjAwNi83LzEyCisJCQkJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSsxXTw8NCB8IGkpOworCQkJfSBlbHNlIHsKKwkJCQlmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0IHwgaSk7CisJCQl9CisKKwkJCS8qIFB1dCBhIFNOQVAgaGVhZGVyIG9uIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCQkJaWYgKGkgPT0gMCkgeworCQkJCWllZWU4MDIxMV9wdXRfc25hcCgKKwkJCQkJc2tiX3B1dChza2JfZnJhZywgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpLAorCQkJCQlldGhlcl90eXBlKTsKKwkJCQlieXRlcyAtPSBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKwkJCX0KKworCQkJbWVtY3B5KHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgc2tiLT5kYXRhLCBieXRlcyk7CisKKwkJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLworCQkJc2tiX3B1bGwoc2tiLCBieXRlcyk7CisKKwkJCS8qIEVuY3J5cHRpb24gcm91dGluZSB3aWxsIG1vdmUgdGhlIGhlYWRlciBmb3J3YXJkIGluIG9yZGVyCisJCQkqIHRvIGluc2VydCB0aGUgSVYgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLworCQkJaWYgKGVuY3J5cHQpCisJCQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiX2ZyYWcsIGhkcl9sZW4pOworCQkJaWYgKGllZWUtPmNvbmZpZyAmCisJCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQorCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIDQpOworCQl9CisKKwkJaWYocW9zX2FjdGl2ZWQpCisJCXsKKwkJICBpZiAoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPSAwOworCQkgIGVsc2UKKwkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0rKzsKKwkJfSBlbHNlIHsKKyAgCQkgIGlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJICBlbHNlCisJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCQl9CisJfWVsc2V7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byBzdWNjZXNzOworCQl9CisKKwkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4YigxLCBza2ItPmxlbiwgR0ZQX0FUT01JQyk7CisJCWlmKCF0eGIpeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQl0eGItPmVuY3J5cHRlZCA9IDA7CisJCXR4Yi0+cGF5bG9hZF9zaXplID0gc2tiLT5sZW47CisJCW1lbWNweShza2JfcHV0KHR4Yi0+ZnJhZ21lbnRzWzBdLHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJfQorCisgc3VjY2VzczoKKy8vV0IgYWRkIHRvIGZpbGwgZGF0YSB0Y2JfZGVzYyBoZXJlLiBvbmx5IGZpcnN0IGZyYWdtZW50IGlzIGNvbnNpZGVyZWQsIG5lZWQgdG8gY2hhbmdlLCBhbmQgeW91IG1heSByZW1vdmUgdG8gb3RoZXIgcGxhY2UuCisJaWYgKHR4YikKKwl7CisJCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikodHhiLT5mcmFnbWVudHNbMF0tPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpCisJCQl0Y2JfZGVzYy0+Yk11bHRpY2FzdCA9IDE7CisJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpKQorCQkJdGNiX2Rlc2MtPmJCcm9hZGNhc3QgPSAxOworCQlpZWVlODAyMTFfdHhyYXRlX3NlbGVjdG1vZGUoaWVlZSwgdGNiX2Rlc2MpOworCQlpZiAoIHRjYl9kZXNjLT5iTXVsdGljYXN0IHx8ICB0Y2JfZGVzYy0+YkJyb2FkY2FzdCkKKwkJCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBpZWVlLT5iYXNpY19yYXRlOworCQllbHNlCisJCQkvL3RjYl9kZXNjLT5kYXRhX3JhdGUgPSBDVVJSRU5UX1JBVEUoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUsIGllZWUtPnJhdGUsIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSk7CisJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gQ1VSUkVOVF9SQVRFKGllZWUtPm1vZGUsIGllZWUtPnJhdGUsIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSk7CisJCWllZWU4MDIxMV9xdXJleV9TaG9ydFByZWFtYmxlTW9kZShpZWVlLCB0Y2JfZGVzYyk7CisJCWllZWU4MDIxMV90eF9xdWVyeV9hZ2dfY2FwKGllZWUsIHR4Yi0+ZnJhZ21lbnRzWzBdLCB0Y2JfZGVzYyk7CisJCWllZWU4MDIxMV9xdWVyeV9IVENhcFNob3J0R0koaWVlZSwgdGNiX2Rlc2MpOworCQlpZWVlODAyMTFfcXVlcnlfQmFuZHdpZHRoTW9kZShpZWVlLCB0Y2JfZGVzYyk7CisJCWllZWU4MDIxMV9xdWVyeV9wcm90ZWN0aW9ubW9kZShpZWVlLCB0Y2JfZGVzYywgdHhiLT5mcmFnbWVudHNbMF0pOworCQlpZWVlODAyMTFfcXVlcnlfc2VxbnVtKGllZWUsIHR4Yi0+ZnJhZ21lbnRzWzBdLCBoZWFkZXIuYWRkcjEpOworLy8JCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCB0eGItPmZyYWdtZW50c1swXS0+ZGF0YSwgdHhiLT5mcmFnbWVudHNbMF0tPmxlbik7CisJCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEsIHRjYl9kZXNjLCBzaXplb2YoY2JfZGVzYykpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlpZiAodHhiKSB7CisJCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKXsKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXQodHhiLCBpZWVlKTsKKwkJfWVsc2V7CisJCQlpZiAoKCppZWVlLT5oYXJkX3N0YXJ0X3htaXQpKHR4YiwgZGV2KSA9PSAwKSB7CisJCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdHhiLT5wYXlsb2FkX3NpemU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZWVlODAyMTFfdHhiX2ZyZWUodHhiKTsKKwkJfQorCX0KKworCXJldHVybiAwOworCisgZmFpbGVkOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXJldHVybiAxOworCit9CisKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4Yl9mcmVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTdmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV93eC5jCkBAIC0wLDAgKzEsODc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCitzdHJ1Y3QgbW9kZXNfdW5pdCB7CisJY2hhciAqbW9kZV9zdHJpbmc7CisJaW50IG1vZGVfc2l6ZTsKK307CitzdHJ1Y3QgbW9kZXNfdW5pdCBpZWVlODAyMTFfbW9kZXNbXSA9IHsKKwl7ImEiLDF9LAorCXsiYiIsMX0sCisJeyJnIiwxfSwKKwl7Ij8iLDF9LAorCXsiTi0yNEciLDV9LAorCXsiTi01RyIsNH0sCit9OworCisjZGVmaW5lIGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbCBpd2Vfc3RyZWFtX2FkZF9ldmVudAorCisjZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0CitzdGF0aWMgaW5saW5lIGNoYXIgKnJ0bDgxOXhfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJCSAgIGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLAorCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCisJCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8pCit7CisJY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dOworCWNoYXIgcHJvdG9fbmFtZVtJRk5BTVNJWl07CisJY2hhciAqcG5hbWUgPSBwcm90b19uYW1lOworCWNoYXIgKnA7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKwlpbnQgaSwgajsKKwl1MTYgbWF4X3JhdGUsIHJhdGU7CisJc3RhdGljIHU4CUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307CisKKwkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCisJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCwgRVRIX0FMRU4pOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisJLyogUmVtYWluaW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIHByb3ZpZGUgdGhlbSAqLworCisJLyogQWRkIHRoZSBFU1NJRCAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisvLwlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7CisJaWYgKG5ldHdvcmstPnNzaWRfbGVuID09IDApIHsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBzaXplb2YoIjxoaWRkZW4+Iik7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsICI8aGlkZGVuPiIpOworCX0gZWxzZSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluKG5ldHdvcmstPnNzaWRfbGVuLCAodTgpMzIpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKwl9CisJLyogQWRkIHRoZSBwcm90b2NvbCBuYW1lICovCisJaXdlLmNtZCA9IFNJT0NHSVdOQU1FOworCWZvcihpPTA7IGk8KHNpemVvZihpZWVlODAyMTFfbW9kZXMpL3NpemVvZihpZWVlODAyMTFfbW9kZXNbMF0pKTsgaSsrKSB7CisJCWlmKG5ldHdvcmstPm1vZGUmKDE8PGkpKSB7CisJCQlzcHJpbnRmKHBuYW1lLGllZWU4MDIxMV9tb2Rlc1tpXS5tb2RlX3N0cmluZyxpZWVlODAyMTFfbW9kZXNbaV0ubW9kZV9zaXplKTsKKwkJCXBuYW1lICs9aWVlZTgwMjExX21vZGVzW2ldLm1vZGVfc2l6ZTsKKwkJfQorCX0KKwkqcG5hbWUgPSAnXDAnOworCXNucHJpbnRmKGl3ZS51Lm5hbWUsIElGTkFNU0laLCAiSUVFRTgwMi4xMSVzIiwgcHJvdG9fbmFtZSk7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKKwkvKiBBZGQgbW9kZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmCisJICAgIChXTEFOX0NBUEFCSUxJVFlfQlNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7CisJCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJfQorCisJLyogQWRkIGZyZXF1ZW5jeS9jaGFubmVsICovCisJaXdlLmNtZCA9IFNJT0NHSVdGUkVROworLyoJaXdlLnUuZnJlcS5tID0gaWVlZTgwMjExX2ZyZXF1ZW5jeShuZXR3b3JrLT5jaGFubmVsLCBuZXR3b3JrLT5tb2RlKTsKKwlpd2UudS5mcmVxLmUgPSAzOyAqLworCWl3ZS51LmZyZXEubSA9IG5ldHdvcmstPmNoYW5uZWw7CisJaXdlLnUuZnJlcS5lID0gMDsKKwlpd2UudS5mcmVxLmkgPSAwOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwllbHNlCisJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOworCS8qIEFkZCBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMgKi8KKwltYXhfcmF0ZSA9IDA7CisJcCA9IGN1c3RvbTsKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLCAiIFJhdGVzIChNYi9zKTogIik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47ICkgeworCQlpZiAoaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbiAmJgorCQkgICAgKChuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0YpIDwKKwkJICAgICAobmV0d29yay0+cmF0ZXNbaV0gJiAweDdGKSkpCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbaisrXSAmIDB4N0Y7CisJCWVsc2UKKwkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpKytdICYgMHg3RjsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJfQorCWZvciAoOyBqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBqKyspIHsKKwkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RjsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJfQorCisJaWYgKG5ldHdvcmstPm1vZGUgPj0gSUVFRV9OXzI0RykvL2FkZCBOIHJhdGUgaGVyZTsKKwl7CisJCVBIVF9DQVBBQklMSVRZX0VMRSBodF9jYXAgPSBOVUxMOworCQlib29sIGlzNDBNID0gZmFsc2UsIGlzU2hvcnRHSSA9IGZhbHNlOworCQl1OCBtYXhfbWNzID0gMDsKKwkJaWYgKCFtZW1jbXAobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwgRVdDMTFOSFRDYXAsIDQpKQorCQkJaHRfY2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkmbmV0d29yay0+YnNzaHQuYmRIVENhcEJ1Zls0XTsKKwkJZWxzZQorCQkJaHRfY2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkmbmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZlswXTsKKwkJaXM0ME0gPSAoaHRfY2FwLT5DaGxXaWR0aCk/MTowOworCQlpc1Nob3J0R0kgPSAoaHRfY2FwLT5DaGxXaWR0aCk/CisJCQkJCQkoKGh0X2NhcC0+U2hvcnRHSTQwTWh6KT8xOjApOgorCQkJCQkJKChodF9jYXAtPlNob3J0R0kyME1oeik/MTowKTsKKworCQltYXhfbWNzID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBodF9jYXAtPk1DUywgTUNTX0ZJTFRFUl9BTEwpOworCQlyYXRlID0gTUNTX0RBVEFfUkFURVtpczQwTV1baXNTaG9ydEdJXVttYXhfbWNzJjB4N2ZdOworCQlpZiAocmF0ZSA+IG1heF9yYXRlKQorCQkJbWF4X3JhdGUgPSByYXRlOworCX0KKwlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCWl3ZS51LmJpdHJhdGUudmFsdWUgPSBtYXhfcmF0ZSAqIDUwMDAwMDsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwKKwkJCQkgICAgIElXX0VWX1BBUkFNX0xFTik7CisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJaXdlLnUuZGF0YS5sZW5ndGggPSBwIC0gY3VzdG9tOworCWlmIChpd2UudS5kYXRhLmxlbmd0aCkKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwkvKiBUT0RPOiBGaXggdGhlc2UgdmFsdWVzLi4uICovCisJaXdlLmNtZCA9IElXRVZRVUFMOworCWl3ZS51LnF1YWwucXVhbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbDsKKwlpd2UudS5xdWFsLmxldmVsID0gbmV0d29yay0+c3RhdHMucnNzaTsKKwlpd2UudS5xdWFsLm5vaXNlID0gbmV0d29yay0+c3RhdHMubm9pc2U7CisJaXdlLnUucXVhbC51cGRhdGVkID0gbmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19XRU1BU0s7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTEVWRUxfSU5WQUxJRDsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX05PSVNFKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1NJR05BTCkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfSU5WQUxJRDsKKwlpd2UudS5xdWFsLnVwZGF0ZWQgPSA3OworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7CisjaWYgKFdJUkVMRVNTX0VYVCA8IDE4KQorCWlmIChpZWVlLT53cGFfZW5hYmxlZCAmJiBuZXR3b3JrLT53cGFfaWVfbGVuKXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU4gKiAyICsgMzBdOworCS8vCXByaW50aygiV1BBIElFXG4iKTsKKwkJdTggKnAgPSBidWY7CisJCXAgKz0gc3ByaW50ZihwLCAid3BhX2llPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+d3BhX2llX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT53cGFfaWVbaV0pOworCQl9CisKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorCisJaWYgKGllZWUtPndwYV9lbmFibGVkICYmIG5ldHdvcmstPnJzbl9pZV9sZW4peworCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMF07CisKKwkJdTggKnAgPSBidWY7CisJCXAgKz0gc3ByaW50ZihwLCAicnNuX2llPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cnNuX2llX2xlbjsgaSsrKSB7CisJCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT5yc25faWVbaV0pOworCQl9CisKKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorI2Vsc2UKKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWlmIChuZXR3b3JrLT53cGFfaWVfbGVuKQorCXsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworCQltZW1jcHkoYnVmLCBuZXR3b3JrLT53cGFfaWUsIG5ldHdvcmstPndwYV9pZV9sZW4pOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPndwYV9pZV9sZW47CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJaWYgKG5ldHdvcmstPnJzbl9pZV9sZW4pCisJeworCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07CisJCW1lbWNweShidWYsIG5ldHdvcmstPnJzbl9pZSwgbmV0d29yay0+cnNuX2llX2xlbik7CisJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbmV0d29yay0+cnNuX2llX2xlbjsKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKwl9CisjZW5kaWYKKworCisJLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCisJICogZm9yIGdpdmVuIG5ldHdvcmsuICovCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKwlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAorCQkgICAgICAiIExhc3QgYmVhY29uOiAlbHVtcyBhZ28iLCAoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCSAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOworCisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNoYXIgKmV2ID0gZXh0cmE7CisvLwljaGFyICpzdG9wID0gZXYgKyBJV19TQ0FOX01BWF9EQVRBOworCWNoYXIgKnN0b3AgPSBldiArIHdycXUtPmRhdGEubGVuZ3RoOy8vSVdfU0NBTl9NQVhfREFUQTsKKwkvL2NoYXIgKnN0b3AgPSBldiArIElXX1NDQU5fTUFYX0RBVEE7CisJaW50IGkgPSAwOworCWludCBlcnIgPSAwOworCUlFRUU4MDIxMV9ERUJVR19XWCgiR2V0dGluZyBzY2FuXG4iKTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5ldHdvcmssICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKKwkJaSsrOworCQlpZigoc3RvcC1ldik8MjAwKQorCQl7CisJCQllcnIgPSAtRTJCSUc7CisJCQlicmVhazsKKwkJCQkJCQkJCQkJCX0KKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwKKwkJICAgIHRpbWVfYWZ0ZXIobmV0d29yay0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQorCQkJZXYgPSBydGw4MTl4X3RyYW5zbGF0ZV9zY2FuKGllZWUsIGV2LCBzdG9wLCBuZXR3b3JrLCBpbmZvKTsKKwkJZWxzZQorCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oCisJCQkJIk5vdCBzaG93aW5nIG5ldHdvcmsgJyVzICgiCisJCQkJTUFDX0ZNVCAiKScgZHVlIHRvIGFnZSAoJWx1bXMpLlxuIiwKKwkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJICAgICBuZXR3b3JrLT5zc2lkX2xlbiksCisJCQkJTUFDX0FSRyhuZXR3b3JrLT5ic3NpZCksCisJCQkJKGppZmZpZXMgLSBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpIC8gKEhaIC8gMTAwKSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCXVwKCZpZWVlLT53eF9zZW0pOworCXdycXUtPmRhdGEubGVuZ3RoID0gZXYgLSAgZXh0cmE7CisJd3JxdS0+ZGF0YS5mbGFncyA9IDA7CisKKwlJRUVFODAyMTFfREVCVUdfV1goImV4aXQ6ICVkIG5ldHdvcmtzIHJldHVybmVkLlxuIiwgaSk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCit7CisJc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwCisJfTsKKwlpbnQgaSwga2V5LCBrZXlfcHJvdmlkZWQsIGxlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCUlFRUU4MDIxMV9ERUJVR19XWCgiU0VUX0VOQ09ERVxuIik7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCQlrZXlfcHJvdmlkZWQgPSAxOworCX0gZWxzZSB7CisJCWtleV9wcm92aWRlZCA9IDA7CisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKwl9CisKKwlJRUVFODAyMTFfREVCVUdfV1goIktleTogJWQgWyVzXVxuIiwga2V5LCBrZXlfcHJvdmlkZWQgPworCQkJICAgInByb3ZpZGVkIiA6ICJkZWZhdWx0Iik7CisJY3J5cHQgPSAmaWVlZS0+Y3J5cHRba2V5XTsKKworCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCWlmIChrZXlfcHJvdmlkZWQgJiYgKmNyeXB0KSB7CisJCQlJRUVFODAyMTFfREVCVUdfV1goIkRpc2FibGluZyBlbmNyeXB0aW9uIG9uIGtleSAlZC5cbiIsCisJCQkJCSAgIGtleSk7CisJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCQl9IGVsc2UKKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24uXG4iKTsKKworCQkvKiBDaGVjayBhbGwgdGhlIGtleXMgdG8gc2VlIGlmIGFueSBhcmUgc3RpbGwgY29uZmlndXJlZCwKKwkJICogYW5kIGlmIG5vIGtleSBpbmRleCB3YXMgcHJvdmlkZWQsIGRlLWluaXQgdGhlbSBhbGwgKi8KKwkJZm9yIChpID0gMDsgaSA8IFdFUF9LRVlTOyBpKyspIHsKKwkJCWlmIChpZWVlLT5jcnlwdFtpXSAhPSBOVUxMKSB7CisJCQkJaWYgKGtleV9wcm92aWRlZCkKKwkJCQkJYnJlYWs7CisJCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KAorCQkJCQlpZWVlLCAmaWVlZS0+Y3J5cHRbaV0pOworCQkJfQorCQl9CisKKwkJaWYgKGkgPT0gV0VQX0tFWVMpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOworCQl9CisKKwkJZ290byBkb25lOworCX0KKworCisKKwlzZWMuZW5hYmxlZCA9IDE7CisJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOworCisJaWYgKCpjcnlwdCAhPSBOVUxMICYmICgqY3J5cHQpLT5vcHMgIT0gTlVMTCAmJgorCSAgICBzdHJjbXAoKCpjcnlwdCktPm9wcy0+bmFtZSwgIldFUCIpICE9IDApIHsKKwkJLyogY2hhbmdpbmcgdG8gdXNlIFdFUDsgZGVpbml0IHByZXZpb3VzbHkgdXNlZCBhbGdvcml0aG0KKwkJICogb24gdGhpcyBrZXkgKi8KKwkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwl9CisKKwlpZiAoKmNyeXB0ID09IE5VTEwpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7CisKKwkJLyogdGFrZSBXRVAgaW50byB1c2UgKi8KKwkJbmV3X2NyeXB0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7CisJCW5ld19jcnlwdC0+b3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKKwkJaWYgKCFuZXdfY3J5cHQtPm9wcykgeworCQkJcmVxdWVzdF9tb2R1bGUoImllZWU4MDIxMV9jcnlwdF93ZXAiKTsKKwkJCW5ld19jcnlwdC0+b3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKKwkJfQorCQlpZiAobmV3X2NyeXB0LT5vcHMgJiYgdHJ5X21vZHVsZV9nZXQobmV3X2NyeXB0LT5vcHMtPm93bmVyKSkKKwkJCW5ld19jcnlwdC0+cHJpdiA9IG5ld19jcnlwdC0+b3BzLT5pbml0KGtleSk7CisKKwkJaWYgKCFuZXdfY3J5cHQtPm9wcyB8fCAhbmV3X2NyeXB0LT5wcml2KSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJbmV3X2NyeXB0ID0gTlVMTDsKKworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBpbml0aWFsaXplIFdFUDogIgorCQkJICAgICAgICJsb2FkIG1vZHVsZSBpZWVlODAyMTFfY3J5cHRfd2VwXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCX0KKworCS8qIElmIGEgbmV3IGtleSB3YXMgcHJvdmlkZWQsIHNldCBpdCB1cCAqLworCWlmIChlcnEtPmxlbmd0aCA+IDApIHsKKwkJbGVuID0gZXJxLT5sZW5ndGggPD0gNSA/IDUgOiAxMzsKKwkJbWVtY3B5KHNlYy5rZXlzW2tleV0sIGtleWJ1ZiwgZXJxLT5sZW5ndGgpOworCQlpZiAobGVuID4gZXJxLT5sZW5ndGgpCisJCQltZW1zZXQoc2VjLmtleXNba2V5XSArIGVycS0+bGVuZ3RoLCAwLAorCQkJICAgICAgIGxlbiAtIGVycS0+bGVuZ3RoKTsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCJTZXR0aW5nIGtleSAlZCB0byAnJXMnICglZDolZCBieXRlcylcbiIsCisJCQkJICAga2V5LCBlc2NhcGVfZXNzaWQoc2VjLmtleXNba2V5XSwgbGVuKSwKKwkJCQkgICBlcnEtPmxlbmd0aCwgbGVuKTsKKwkJc2VjLmtleV9zaXplc1trZXldID0gbGVuOworCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIGxlbiwgTlVMTCwKKwkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKKwkJLyogVGhpcyBlbnN1cmVzIGEga2V5IHdpbGwgYmUgYWN0aXZhdGVkIGlmIG5vIGtleSBpcworCQkgKiBleHBsaWNpdGVseSBzZXQgKi8KKwkJaWYgKGtleSA9PSBzZWMuYWN0aXZlX2tleSkKKwkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OworCisJfSBlbHNlIHsKKwkJbGVuID0gKCpjcnlwdCktPm9wcy0+Z2V0X2tleShzZWMua2V5c1trZXldLCBXRVBfS0VZX0xFTiwKKwkJCQkJICAgICBOVUxMLCAoKmNyeXB0KS0+cHJpdik7CisJCWlmIChsZW4gPT0gMCkgeworCQkJLyogU2V0IGEgZGVmYXVsdCBrZXkgb2YgYWxsIDAgKi8KKwkJCXByaW50aygiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAorCQkJCQkgICBrZXkpOworCisJCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKKwkJCQkJICAga2V5KTsKKwkJCW1lbXNldChzZWMua2V5c1trZXldLCAwLCAxMyk7CisJCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIDEzLCBOVUxMLAorCQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOworCQkJc2VjLmtleV9zaXplc1trZXldID0gMTM7CisJCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKKwkJfQorCisJCS8qIE5vIGtleSBkYXRhIC0ganVzdCBzZXQgdGhlIGRlZmF1bHQgVFgga2V5IGluZGV4ICovCisJCWlmIChrZXlfcHJvdmlkZWQpIHsKKwkJCUlFRUU4MDIxMV9ERUJVR19XWCgKKwkJCQkiU2V0dGluZyBrZXkgJWQgdG8gZGVmYXVsdCBUeCBrZXkuXG4iLCBrZXkpOworCQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OworCQkJc2VjLmFjdGl2ZV9rZXkgPSBrZXk7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCX0KKwl9CisKKyBkb25lOgorCWllZWUtPm9wZW5fd2VwID0gIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpOworCWllZWUtPmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlzZWMuYXV0aF9tb2RlID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCXNlYy5mbGFncyB8PSBTRUNfQVVUSF9NT0RFOworCUlFRUU4MDIxMV9ERUJVR19XWCgiQXV0aDogJXNcbiIsIHNlYy5hdXRoX21vZGUgPT0gV0xBTl9BVVRIX09QRU4gPworCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKKworCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgorCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCisJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJaW50IGxlbiwga2V5OworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQ7CisKKwlJRUVFODAyMTFfREVCVUdfV1goIkdFVF9FTkNPREVcbiIpOworCisJaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXJldHVybiAtMTsKKworCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJaWYgKGtleSkgeworCQlpZiAoa2V5ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJa2V5LS07CisJfSBlbHNlCisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRba2V5XTsKKwllcnEtPmZsYWdzID0ga2V5ICsgMTsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMgPT0gTlVMTCkgeworCQllcnEtPmxlbmd0aCA9IDA7CisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlyZXR1cm4gMDsKKwl9CisJbGVuID0gY3J5cHQtPm9wcy0+Z2V0X2tleShrZXlidWYsIFNDTV9LRVlfTEVOLCBOVUxMLCBjcnlwdC0+cHJpdik7CisJZXJxLT5sZW5ndGggPSAobGVuID49IDAgPyBsZW4gOiAwKTsKKworCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisKKwlpZiAoaWVlZS0+b3Blbl93ZXApCisJCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisJZWxzZQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCisJcmV0dXJuIDA7Cit9CisjaWYgKFdJUkVMRVNTX0VYVCA+PSAxOCkKK2ludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOworCWludCBpLCBpZHg7CisJaW50IGdyb3VwX2tleSA9IDA7CisJY29uc3QgY2hhciAqYWxnLCAqbW9kdWxlOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OworCisJc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7CisJCS5mbGFncyA9IDAsCisJfTsKKwkvL3ByaW50aygiPT09PT09PmVuY29kaW5nIGZsYWc6JXgsZXh0IGZsYWc6JXgsIGV4dCBhbGc6JWRcbiIsIGVuY29kaW5nLT5mbGFncyxleHQtPmV4dF9mbGFncywgZXh0LT5hbGcpOworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCX0gZWxzZQorCQlpZHggPSBpZWVlLT50eF9rZXlpZHg7CisKKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgeworCisJCWNyeXB0ID0gJmllZWUtPmNyeXB0W2lkeF07CisKKwkJZ3JvdXBfa2V5ID0gMTsKKwl9IGVsc2UgeworCQkvKiBzb21lIENpc2NvIEFQcyB1c2UgaWR4PjAgZm9yIHVuaWNhc3QgaW4gZHluYW1pYyBXRVAgKi8KKwkJLy9wcmludGsoIm5vdCBncm91cCBrZXksIGZsYWdzOiV4LCBleHQtPmFsZzolZFxuIiwgZXh0LT5leHRfZmxhZ3MsIGV4dC0+YWxnKTsKKwkJaWYgKGlkeCAhPSAwICYmIGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisKKwkJCWNyeXB0ID0gJmllZWUtPmNyeXB0W2lkeF07CisKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEOy8vIHwgU0VDX0VOQ1JZUFQ7CisJaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8CisJICAgIGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgeworCQlpZiAoKmNyeXB0KQorCQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykKKworCQkJaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpCisKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBXRVBfS0VZUykgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkgICAgICAvLyAgc2VjLmVuY3J5cHQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQl9CisJCS8vcHJpbnRrKCJkaXNhYmxlZDogZmxhZzoleFxuIiwgZW5jb2RpbmctPmZsYWdzKTsKKwkJZ290byBkb25lOworCX0KKworCXNlYy5lbmFibGVkID0gMTsKKyAgICAvLyAgICBzZWMuZW5jcnlwdCA9IDE7CisJc3dpdGNoIChleHQtPmFsZykgeworCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCWFsZyA9ICJXRVAiOworCQltb2R1bGUgPSAiaWVlZTgwMjExX2NyeXB0X3dlcCI7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCQlhbGcgPSAiVEtJUCI7CisJCW1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfdGtpcCI7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorCQlhbGcgPSAiQ0NNUCI7CisJCW1vZHVsZSA9ICJpZWVlODAyMTFfY3J5cHRfY2NtcCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlwcmludGsoImFsZyBuYW1lOiVzXG4iLGFsZyk7CisKKwkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CisJaWYgKG9wcyA9PSBOVUxMKSB7CisJCXJlcXVlc3RfbW9kdWxlKG1vZHVsZSk7CisJCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhhbGcpOworCX0KKwlpZiAob3BzID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgZXh0LT5hbGcpOworCQlwcmludGsoIj09PT09PT09PnVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwgZXh0LT5hbGcpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMIHx8ICgqY3J5cHQpLT5vcHMgIT0gb3BzKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisKKwkJbmV3X2NyeXB0ID0ga3phbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CisJCWlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQorCQkJbmV3X2NyeXB0LT5wcml2ID0gbmV3X2NyeXB0LT5vcHMtPmluaXQoaWR4KTsKKwkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7CisJCQlrZnJlZShuZXdfY3J5cHQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisKKwl9CisKKwlpZiAoZXh0LT5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCisJICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkoZXh0LT5rZXksIGV4dC0+a2V5X2xlbiwgZXh0LT5yeF9zZXEsCisJCQkJICAgKCpjcnlwdCktPnByaXYpIDwgMCkgeworCQlJRUVFODAyMTFfREVCVUdfV1goIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKyAvL3NraXBfaG9zdF9jcnlwdDoKKwkvL3ByaW50aygic2tpcF9ob3N0X2NyeXB0OmV4dF9mbGFnczoleFxuIiwgZXh0LT5leHRfZmxhZ3MpOworCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQlpZWVlLT50eF9rZXlpZHggPSBpZHg7CisJCXNlYy5hY3RpdmVfa2V5ID0gaWR4OworCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJfQorCisJaWYgKGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfTk9ORSkgeworCQkvL21lbWNweShzZWMua2V5c1tpZHhdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKwkJc2VjLmtleV9zaXplc1tpZHhdID0gZXh0LT5rZXlfbGVuOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwgaWR4KTsKKwkJaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CisJCSAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19XRVA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisJCX0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB7CisJCSAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19US0lQOworCQkJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOworCQl9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgeworCQkgICAgICAgLy8gc2VjLmVuY29kZV9hbGdbaWR4XSA9IFNFQ19BTEdfQ0NNUDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMzsKKwkJfQorCQkvKiBEb24ndCBzZXQgc2VjIGxldmVsIGZvciBncm91cCBrZXlzLiAqLworCQlpZiAoZ3JvdXBfa2V5KQorCQkJc2VjLmZsYWdzICY9IH5TRUNfTEVWRUw7CisJfQorZG9uZToKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKworCSBpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCisJICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgeworCQlJRUVFODAyMTFfREVCVUdfV1goIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OworCWludCBpZHgsIG1heF9rZXlfbGVuOworCisJbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOworCWlmIChtYXhfa2V5X2xlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpIHsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisJfSBlbHNlCisJCWlkeCA9IGllZWUtPnR4X2tleWlkeDsKKworCWlmICghZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSAmJgorCSAgICBleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX1dFUCkKKwkJaWYgKGlkeCAhPSAwIHx8IGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOworCWVuY29kaW5nLT5mbGFncyA9IGlkeCArIDE7CisJbWVtc2V0KGV4dCwgMCwgc2l6ZW9mKCpleHQpKTsKKworCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMgPT0gTlVMTCApIHsKKwkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCWV4dC0+a2V5X2xlbiA9IDA7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJfSBlbHNlIHsKKwkJaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgPT0gMCApCisJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOworCQllbHNlIGlmIChzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIlRLSVAiKSkKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19US0lQOworCQllbHNlIGlmIChzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIkNDTVAiKSkKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19DQ01QOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXh0LT5rZXlfbGVuID0gY3J5cHQtPm9wcy0+Z2V0X2tleShleHQtPmtleSwgU0NNX0tFWV9MRU4sIE5VTEwsIGNyeXB0LT5wcml2KTsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQlpZiAoZXh0LT5rZXlfbGVuICYmCisJCSAgICAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQIHx8CisJCSAgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSkKKwkJCWV4dC0+ZXh0X2ZsYWdzIHw9IElXX0VOQ09ERV9FWFRfVFhfU0VRX1ZBTElEOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZWVlODAyMTFfd3hfc2V0X21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfbWxtZSAqbWxtZSA9IChzdHJ1Y3QgaXdfbWxtZSAqKSBleHRyYTsKKwlzd2l0Y2ggKG1sbWUtPmNtZCkgeworCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOworCQlicmVhazsKKwkgZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJICAgICAvKm5lZWQgdG8gc3VwcG9ydCB3cGEyIGhlcmUqLworCQkvL3ByaW50aygid3BhIHZlcnNpb246JXhcbiIsIGRhdGEtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJLyoKKyAqICAgICAgICAgICAgICAgICAgKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cGFfc3VwcGxpY2FudCB0byBjb250cm9sIHRoZW0gaW50ZXJuYWxseS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKwkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisJCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCS8vcHJpbnRrKCI9PT09PT0+JXMoKTpkYXRhLT52YWx1ZSBpcyAlZFxuIixfX0ZVTkNUSU9OX18sZGF0YS0+dmFsdWUpOworCS8vCWllZWUtPm9wZW5fd2VwID0gKGRhdGEtPnZhbHVlJklXX0FVVEhfQUxHX09QRU5fU1lTVEVNKT8xOjA7CisJCWlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSl7CisJCQlpZWVlLT5vcGVuX3dlcCA9IDA7CisJCQlpZWVlLT5hdXRoX21vZGUgPSAxOworCQl9CisJCWVsc2UgaWYoZGF0YS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSl7CisJCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCQlpZWVlLT5hdXRoX21vZGUgPSAwOworCQl9CisJCWVsc2UgaWYoZGF0YS0+dmFsdWUgJiBJV19BVVRIX0FMR19MRUFQKXsKKwkJCWllZWUtPm9wZW5fd2VwID0gMTsKKwkJCWllZWUtPmF1dGhfbW9kZSA9IDI7CisJCQkvL3ByaW50aygiaGFoYWhhYTpMRUFQXG4iKTsKKwkJfQorCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLy9wcmludGsoIm9wZW5fd2VwOiVkXG4iLCBpZWVlLT5vcGVuX3dlcCk7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgorCQlpZWVlLT53cGFfZW5hYmxlZCA9IChkYXRhLT52YWx1ZSk/MTowOworCQkvL3ByaW50aygiZW5hbGJlIHdwYTolZFxuIiwgaWVlZS0+d3BhX2VuYWJsZWQpOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwkJaWVlZS0+aWVlZTgwMl8xeCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorCQlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgoraW50IGllZWU4MDIxMV93eF9zZXRfZ2VuX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pCit7CisJdTggKmJ1ZjsKKworCWlmIChsZW4+TUFYX1dQQV9JRV9MRU4gfHwgKGxlbiAmJiBpZSA9PSBOVUxMKSkKKwl7CisJLy8JcHJpbnRrKCJyZXR1cm4gZXJyb3Igb3V0LCBsZW46JWRcbiIsIGxlbik7CisJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKwlpZiAobGVuKQorCXsKKwkJaWYgKGxlbiAhPSBpZVsxXSsyKQorCQl7CisJCQlwcmludGsoImxlbjolZCwgaWU6JWRcbiIsIGxlbiwgaWVbMV0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtY3B5KGJ1ZiwgaWUsIGxlbik7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IGJ1ZjsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IGxlbjsKKwl9CisJZWxzZXsKKwkJaWYgKGllZWUtPndwYV9pZSkKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorCXJldHVybiAwOworCit9CisKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9nZW5faWUpOworI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfbWxtZSk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfYXV0aCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dCk7CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dCk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X2dldF9zY2FuKTsKK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3d4X3NldF9lbmNvZGUpOworRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfd3hfZ2V0X2VuY29kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMDk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaW50ZXJuYWwuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9DUllQVE9fSU5URVJOQUxfSAorI2RlZmluZSBfQ1JZUFRPX0lOVEVSTkFMX0gKKworCisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3NvZnRpcnEuaD4KKyNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgorCisKK2V4dGVybiBlbnVtIGttX3R5cGUgY3J5cHRvX2ttX3R5cGVzW107CisKK3N0YXRpYyBpbmxpbmUgZW51bSBrbV90eXBlIGNyeXB0b19rbWFwX3R5cGUoaW50IG91dCkKK3sKKwlyZXR1cm4gY3J5cHRvX2ttX3R5cGVzWyhpbl9zb2Z0aXJxKCkgPyAyIDogMCkgKyBvdXRdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b19rbWFwKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb3V0KQoreworCXJldHVybiBrbWFwX2F0b21pYyhwYWdlLCBjcnlwdG9fa21hcF90eXBlKG91dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2t1bm1hcCh2b2lkICp2YWRkciwgaW50IG91dCkKK3sKKwlrdW5tYXBfYXRvbWljKHZhZGRyLCBjcnlwdG9fa21hcF90eXBlKG91dCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3lpZWxkKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJaWYgKCFpbl9zb2Z0aXJxKCkpCisJCWNvbmRfcmVzY2hlZCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJcmV0dXJuICh2b2lkICopJnRmbVsxXTsKK30KKworc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworCisjaWZkZWYgQ09ORklHX0tNT0QKK3ZvaWQgY3J5cHRvX2FsZ19hdXRvbG9hZChjb25zdCBjaGFyICpuYW1lKTsKK3N0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19tb2RfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGNyeXB0b19hbGdfbG9va3VwKG5hbWUpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKK2ludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreyB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCit2b2lkIF9faW5pdCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9faW5pdF9wcm9jKHZvaWQpCit7IH0KKyNlbmRpZgorCitpbnQgY3J5cHRvX2luaXRfZGlnZXN0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncyk7CitpbnQgY3J5cHRvX2luaXRfY29tcHJlc3NfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKKworaW50IGNyeXB0b19pbml0X2RpZ2VzdF9vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CitpbnQgY3J5cHRvX2luaXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK2ludCBjcnlwdG9faW5pdF9jb21wcmVzc19vcHMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisKK3ZvaWQgY3J5cHRvX2V4aXRfZGlnZXN0X29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2V4aXRfY2lwaGVyX29wcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKK3ZvaWQgY3J5cHRvX2V4aXRfY29tcHJlc3Nfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCisjZW5kaWYJLyogX0NSWVBUT19JTlRFUk5BTF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEva21hcF90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9rbWFwX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2N2JiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEva21hcF90eXBlcy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgX19LTUFQX1RZUEVTX0gKKworI2RlZmluZSBfX0tNQVBfVFlQRVNfSAorCisKK2VudW0ga21fdHlwZSB7CisJS01fQk9VTkNFX1JFQUQsCisJS01fU0tCX1NVTlJQQ19EQVRBLAorCUtNX1NLQl9EQVRBX1NPRlRJUlEsCisJS01fVVNFUjAsCisJS01fVVNFUjEsCisJS01fQkhfSVJRLAorCUtNX1NPRlRJUlEwLAorCUtNX1NPRlRJUlExLAorCUtNX1RZUEVfTlIKK307CisKKyNkZWZpbmUgX0FTTV9LTUFQX1RZUEVTX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL21pY2hhZWxfbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyNTZlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvbWljaGFlbF9taWMuYwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJCisgKgorICogTWljaGFlbCBNSUMgKElFRUUgODAyLjExaS9US0lQKSBrZXllZCBkaWdlc3QKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKKworCitzdHJ1Y3QgbWljaGFlbF9taWNfY3R4IHsKKwl1OCBwZW5kaW5nWzRdOworCXNpemVfdCBwZW5kaW5nX2xlbjsKKworCXUzMiBsLCByOworfTsKKworCitzdGF0aWMgaW5saW5lIHUzMiByb3RsKHUzMiB2YWwsIGludCBiaXRzKQoreworCXJldHVybiAodmFsIDw8IGJpdHMpIHwgKHZhbCA+PiAoMzIgLSBiaXRzKSk7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgcm90cih1MzIgdmFsLCBpbnQgYml0cykKK3sKKwlyZXR1cm4gKHZhbCA+PiBiaXRzKSB8ICh2YWwgPDwgKDMyIC0gYml0cykpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdTMyIHhzd2FwKHUzMiB2YWwpCit7CisJcmV0dXJuICgodmFsICYgMHgwMGZmMDBmZikgPDwgOCkgfCAoKHZhbCAmIDB4ZmYwMGZmMDApID4+IDgpOworfQorCisKKyNkZWZpbmUgbWljaGFlbF9ibG9jayhsLCByKQlcCitkbyB7CQkJCVwKKwlyIF49IHJvdGwobCwgMTcpOwlcCisJbCArPSByOwkJCVwKKwlyIF49IHhzd2FwKGwpOwkJXAorCWwgKz0gcjsJCQlcCisJciBePSByb3RsKGwsIDMpOwlcCisJbCArPSByOwkJCVwKKwlyIF49IHJvdHIobCwgMik7CVwKKwlsICs9IHI7CQkJXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgaW5saW5lIHUzMiBnZXRfbGUzMihjb25zdCB1OCAqcCkKK3sKKwlyZXR1cm4gcFswXSB8IChwWzFdIDw8IDgpIHwgKHBbMl0gPDwgMTYpIHwgKHBbM10gPDwgMjQpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfbGUzMih1OCAqcCwgdTMyIHYpCit7CisJcFswXSA9IHY7CisJcFsxXSA9IHYgPj4gODsKKwlwWzJdID0gdiA+PiAxNjsKKwlwWzNdID0gdiA+PiAyNDsKK30KKworCitzdGF0aWMgdm9pZCBtaWNoYWVsX2luaXQodm9pZCAqY3R4KQoreworCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisJbWN0eC0+cGVuZGluZ19sZW4gPSAwOworfQorCisKK3N0YXRpYyB2b2lkIG1pY2hhZWxfdXBkYXRlKHZvaWQgKmN0eCwgY29uc3QgdTggKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IG1pY2hhZWxfbWljX2N0eCAqbWN0eCA9IGN0eDsKKworCWlmIChtY3R4LT5wZW5kaW5nX2xlbikgeworCQlpbnQgZmxlbiA9IDQgLSBtY3R4LT5wZW5kaW5nX2xlbjsKKwkJaWYgKGZsZW4gPiBsZW4pCisJCQlmbGVuID0gbGVuOworCQltZW1jcHkoJm1jdHgtPnBlbmRpbmdbbWN0eC0+cGVuZGluZ19sZW5dLCBkYXRhLCBmbGVuKTsKKwkJbWN0eC0+cGVuZGluZ19sZW4gKz0gZmxlbjsKKwkJZGF0YSArPSBmbGVuOworCQlsZW4gLT0gZmxlbjsKKworCQlpZiAobWN0eC0+cGVuZGluZ19sZW4gPCA0KQorCQkJcmV0dXJuOworCisJCW1jdHgtPmwgXj0gZ2V0X2xlMzIobWN0eC0+cGVuZGluZyk7CisJCW1pY2hhZWxfYmxvY2sobWN0eC0+bCwgbWN0eC0+cik7CisJCW1jdHgtPnBlbmRpbmdfbGVuID0gMDsKKwl9CisKKwl3aGlsZSAobGVuID49IDQpIHsKKwkJbWN0eC0+bCBePSBnZXRfbGUzMihkYXRhKTsKKwkJbWljaGFlbF9ibG9jayhtY3R4LT5sLCBtY3R4LT5yKTsKKwkJZGF0YSArPSA0OworCQlsZW4gLT0gNDsKKwl9CisKKwlpZiAobGVuID4gMCkgeworCQltY3R4LT5wZW5kaW5nX2xlbiA9IGxlbjsKKwkJbWVtY3B5KG1jdHgtPnBlbmRpbmcsIGRhdGEsIGxlbik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG1pY2hhZWxfZmluYWwodm9pZCAqY3R4LCB1OCAqb3V0KQoreworCXN0cnVjdCBtaWNoYWVsX21pY19jdHggKm1jdHggPSBjdHg7CisJdTggKmRhdGEgPSBtY3R4LT5wZW5kaW5nOworCisJLyogTGFzdCBibG9jayBhbmQgcGFkZGluZyAoMHg1YSwgNC4uNyB4IDApICovCisJc3dpdGNoIChtY3R4LT5wZW5kaW5nX2xlbikgeworCWNhc2UgMDoKKwkJbWN0eC0+bCBePSAweDVhOworCQlicmVhazsKKwljYXNlIDE6CisJCW1jdHgtPmwgXj0gZGF0YVswXSB8IDB4NWEwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltY3R4LT5sIF49IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IDB4NWEwMDAwOworCQlicmVhazsKKwljYXNlIDM6CisJCW1jdHgtPmwgXj0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpIHwKKwkJCTB4NWEwMDAwMDA7CisJCWJyZWFrOworCX0KKwltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOworCS8qIGwgXj0gMDsgKi8KKwltaWNoYWVsX2Jsb2NrKG1jdHgtPmwsIG1jdHgtPnIpOworCisJcHV0X2xlMzIob3V0LCBtY3R4LT5sKTsKKwlwdXRfbGUzMihvdXQgKyA0LCBtY3R4LT5yKTsKK30KKworCitzdGF0aWMgaW50IG1pY2hhZWxfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJCSAgdTMyICpmbGFncykKK3sKKwlzdHJ1Y3QgbWljaGFlbF9taWNfY3R4ICptY3R4ID0gY3R4OworCWlmIChrZXlsZW4gIT0gOCkgeworCQlpZiAoZmxhZ3MpCisJCQkqZmxhZ3MgPSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1jdHgtPmwgPSBnZXRfbGUzMihrZXkpOworCW1jdHgtPnIgPSBnZXRfbGUzMihrZXkgKyA0KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgbWljaGFlbF9taWNfYWxnID0geworCS5jcmFfbmFtZQk9ICJtaWNoYWVsX21pYyIsCisJLmNyYV9mbGFncwk9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QsCisJLmNyYV9ibG9ja3NpemUJPSA4LAorCS5jcmFfY3R4c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbWljaGFlbF9taWNfY3R4KSwKKwkuY3JhX21vZHVsZQk9IFRISVNfTU9EVUxFLAorCS5jcmFfbGlzdAk9IExJU1RfSEVBRF9JTklUKG1pY2hhZWxfbWljX2FsZy5jcmFfbGlzdCksCisJLmNyYV91CQk9IHsgLmRpZ2VzdCA9IHsKKwkuZGlhX2RpZ2VzdHNpemUJPSA4LAorCS5kaWFfaW5pdAk9IG1pY2hhZWxfaW5pdCwKKwkuZGlhX3VwZGF0ZQk9IG1pY2hhZWxfdXBkYXRlLAorCS5kaWFfZmluYWwJPSBtaWNoYWVsX2ZpbmFsLAorCS5kaWFfc2V0a2V5CT0gbWljaGFlbF9zZXRrZXkgfSB9Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG1pY2hhZWxfbWljX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX2FsZygmbWljaGFlbF9taWNfYWxnKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWljaGFlbF9taWNfZXhpdCh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmbWljaGFlbF9taWNfYWxnKTsKK30KKworCittb2R1bGVfaW5pdChtaWNoYWVsX21pY19pbml0KTsKK21vZHVsZV9leGl0KG1pY2hhZWxfbWljX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1pY2hhZWwgTUlDIik7CitNT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZGE5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3Byb2MuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIFNjYXR0ZXJsaXN0IENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIFByb2NmcyBpbmZvcm1hdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisvLyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlICJydGxfY3J5cHRvLmgiCisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBjcnlwdG9fYWxnX2xpc3Q7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBjcnlwdG9fYWxnX3NlbTsKKworc3RhdGljIHZvaWQgKmNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp2OworCWxvZmZfdCBuID0gKnBvczsKKworCWRvd25fcmVhZCgmY3J5cHRvX2FsZ19zZW0pOworCWxpc3RfZm9yX2VhY2godiwgJmNyeXB0b19hbGdfbGlzdCkKKwkJaWYgKCFuLS0pCisJCQlyZXR1cm4gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY3J5cHRvX2FsZywgY3JhX2xpc3QpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdiA9IHA7CisKKwkoKnBvcykrKzsKKwl2ID0gdi0+bmV4dDsKKwlyZXR1cm4gKHYgPT0gJmNyeXB0b19hbGdfbGlzdCkgPworCQlOVUxMIDogbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgY3J5cHRvX2FsZywgY3JhX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBjX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXVwX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKK30KKworc3RhdGljIGludCBjX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSAoc3RydWN0IGNyeXB0b19hbGcgKilwOworCisJc2VxX3ByaW50ZihtLCAibmFtZSAgICAgICAgIDogJXNcbiIsIGFsZy0+Y3JhX25hbWUpOworCXNlcV9wcmludGYobSwgIm1vZHVsZSAgICAgICA6ICVzXG4iLAorCQkgICAoYWxnLT5jcmFfbW9kdWxlID8KKwkJICAgIGFsZy0+Y3JhX21vZHVsZS0+bmFtZSA6CisJCSAgICAia2VybmVsIikpOworCisJc3dpdGNoIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSB7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgorCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBjaXBoZXJcbiIpOworCQlzZXFfcHJpbnRmKG0sICJibG9ja3NpemUgICAgOiAldVxuIiwgYWxnLT5jcmFfYmxvY2tzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAibWluIGtleXNpemUgIDogJXVcbiIsCisJCQkJCWFsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemUpOworCQlzZXFfcHJpbnRmKG0sICJtYXgga2V5c2l6ZSAgOiAldVxuIiwKKwkJCQkJYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZSk7CisJCWJyZWFrOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUOgorCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiBkaWdlc3RcbiIpOworCQlzZXFfcHJpbnRmKG0sICJibG9ja3NpemUgICAgOiAldVxuIiwgYWxnLT5jcmFfYmxvY2tzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAiZGlnZXN0c2l6ZSAgIDogJXVcbiIsCisJCQkgICBhbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemUpOworCQlicmVhazsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzoKKwkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogY29tcHJlc3Npb25cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKG0sICJ0eXBlICAgICAgICAgOiB1bmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQorCisJc2VxX3B1dGMobSwgJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3J5cHRvX3NlcV9vcHMgPSB7CisJLnN0YXJ0CQk9IGNfc3RhcnQsCisJLm5leHQJCT0gY19uZXh0LAorCS5zdG9wCQk9IGNfc3RvcCwKKwkuc2hvdwkJPSBjX3Nob3cKK307CisKK3N0YXRpYyBpbnQgY3J5cHRvX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmNyeXB0b19zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jcnlwdG9fb3BzID0geworCS5vcGVuCQk9IGNyeXB0b19pbmZvX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZQorfTsKKwordm9pZCBfX2luaXQgY3J5cHRvX2luaXRfcHJvYyh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKKworCXByb2MgPSBjcmVhdGVfcHJvY19lbnRyeSgiY3J5cHRvIiwgMCwgTlVMTCk7CisJaWYgKHByb2MpCisJCXByb2MtPnByb2NfZm9wcyA9ICZwcm9jX2NyeXB0b19vcHM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGM4YmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfQkFUWVBFX0hfCisjZGVmaW5lIF9CQVRZUEVfSF8KKworI2RlZmluZSAJVE9UQUxfVFhCQV9OVU0JMTYKKyNkZWZpbmUJVE9UQUxfUlhCQV9OVU0JMTYKKworI2RlZmluZQlCQV9TRVRVUF9USU1FT1VUCTIwMAorI2RlZmluZQlCQV9JTkFDVF9USU1FT1VUCTYwMDAwCisKKyNkZWZpbmUJQkFfUE9MSUNZX0RFTEFZRUQJCTAKKyNkZWZpbmUJQkFfUE9MSUNZX0lNTUVESUFURQkxCisKKyNkZWZpbmUJQUREQkFfU1RBVFVTX1NVQ0NFU1MJCQkwCisjZGVmaW5lCUFEREJBX1NUQVRVU19SRUZVU0VECQkzNworI2RlZmluZQlBRERCQV9TVEFUVVNfSU5WQUxJRF9QQVJBTQkzOAorCisjZGVmaW5lCURFTEJBX1JFQVNPTl9RU1RBX0xFQVZJTkcJMzYKKyNkZWZpbmUJREVMQkFfUkVBU09OX0VORF9CQQkJCTM3CisjZGVmaW5lCURFTEJBX1JFQVNPTl9VTktOT1dOX0JBCTM4CisjZGVmaW5lCURFTEJBX1JFQVNPTl9USU1FT1VUCQkJMzkKKy8qICB3aGV0aGVyIG5lZWQgZGVmaW5lIEJBIEFjdGlvbiBmcmFtZXMgaGVyZT8KK3N0cnVjdCBpZWVlODAyMTFfQUREQkFfUmVxeworCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOworCXU4CWNhdGVnb3J5OworCXU4Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyovCisvL0lzIHRoaXMgbmVlZD9JIHB1dCBoZXJlIGp1c3QgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZGVmaW5lIHN0cnVjdHVyZSBCQV9SRUNPUkQgLy9XQgordHlwZWRlZiB1bmlvbiBfU0VRVUVOQ0VfQ09OVFJPTHsKKwl1MTYgU2hvcnREYXRhOworCXN0cnVjdAorCXsKKwkJdTE2CUZyYWdOdW06NDsKKwkJdTE2CVNlcU51bToxMjsKKwl9ZmllbGQ7Cit9U0VRVUVOQ0VfQ09OVFJPTCwgKlBTRVFVRU5DRV9DT05UUk9MOworCit0eXBlZGVmIHVuaW9uIF9CQV9QQVJBTV9TRVQgeworCXU4IGNoYXJEYXRhWzJdOworCXUxNiBzaG9ydERhdGE7CisJc3RydWN0IHsKKwkJdTE2IEFNU0RVX1N1cHBvcnQ6MTsKKwkJdTE2IEJBUG9saWN5OjE7CisJCXUxNiBUSUQ6NDsKKwkJdTE2IEJ1ZmZlclNpemU6MTA7CisJfSBmaWVsZDsKK30gQkFfUEFSQU1fU0VULCAqUEJBX1BBUkFNX1NFVDsKKwordHlwZWRlZiB1bmlvbiBfREVMQkFfUEFSQU1fU0VUIHsKKwl1OCBjaGFyRGF0YVsyXTsKKwl1MTYgc2hvcnREYXRhOworCXN0cnVjdCB7CisJCXUxNiBSZXNlcnZlZDoxMTsKKwkJdTE2IEluaXRpYXRvcjoxOworCQl1MTYgVElEOjQ7CisJfSBmaWVsZDsKK30gREVMQkFfUEFSQU1fU0VULCAqUERFTEJBX1BBUkFNX1NFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ09SRCB7CisJc3RydWN0IHRpbWVyX2xpc3QJCVRpbWVyOworCXU4CQkJCWJWYWxpZDsKKwl1OAkJCQlEaWFsb2dUb2tlbjsKKwlCQV9QQVJBTV9TRVQJCUJhUGFyYW1TZXQ7CisJdTE2CQkJCUJhVGltZW91dFZhbHVlOworCVNFUVVFTkNFX0NPTlRST0wJQmFTdGFydFNlcUN0cmw7Cit9IEJBX1JFQ09SRCwgKlBCQV9SRUNPUkQ7CisKKyNlbmRpZiAvL2VuZCBfQkFUWVBFX0hfCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFmNDNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCkBAIC0wLDAgKzEsNzM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgZmlsZSBpcyBjcmVhdGVkIHRvIHByb2Nlc3MgQkEgQWN0aW9uIEZyYW1lLiBBY2NvcmRpbmcgdG8gODAyLjExIHNwZWMsIHRoZXJlIGFyZSAzIEJBIGFjdGlvbiB0eXBlcyBhdCBhbGwuIEFuZCBhcyBCQSBpcworICogcmVsYXRlZCB0byBUUywgdGhpcyBwYXJ0IG5lZWQgc29tZSBzdHJ1dHVyZSBkZWZpbmVkIGluIFFPUyBzaWRlIGNvZGUuIEFsc28gVFggUlggaXMgZ29pbmcgdG8gYmUgcmVzdHVyY3R1cmVkLCBzbyBob3cgdG8gc2VuZAorICogQUREQkFSRVEgQUREQkFSU1AgYW5kIERFTEJBIHBhY2tldCBpcyBzdGlsbCBvbiBjb25zaWRlcmF0aW9uLiBUZW1wb3JhcmlseSB1c2UgTUFOQUdFIFFVRVVFIGluc3RlYWQgb2YgTm9ybWFsIFF1ZXVlLgorICogV0IgMjAwOC0wNS0yNworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaW5jbHVkZSAicnRsODE5eF9CQS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBBY3RpdmF0ZSBCQSBlbnRyeS4gQW5kIGlmIFRpbWUgaXMgbm96ZXJvLCBzdGFydCB0aW1lci4KKyAqICAgaW5wdXQ6ICBQQkFfUkVDT1JEIAkJcEJBICAvL0JBIGVudHJ5IHRvIGJlIGVuYWJsZWQKKyAqICAgCSAgICAgdTE2IAkJCVRpbWUgLy9pbmRpY2F0ZSB0aW1lIGRlbGF5LgorICogIG91dHB1dDogIG5vbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBY3RpdmF0ZUJBRW50cnkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBCQV9SRUNPUkQgcEJBLCB1MTYgVGltZSkKK3sKKwlwQkEtPmJWYWxpZCA9IHRydWU7CisJaWYoVGltZSAhPSAwKQorCQltb2RfdGltZXIoJnBCQS0+VGltZXIsIGppZmZpZXMgKyBNU0VDUyhUaW1lKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIGRlYWN0aXZhdGUgQkEgZW50cnksIGluY2x1ZGluZyBpdHMgdGltZXIuCisgKiAgIGlucHV0OiAgUEJBX1JFQ09SRCAJCXBCQSAgLy9CQSBlbnRyeSB0byBiZSBkaXNhYmxlZAorICogIG91dHB1dDogIG5vbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBEZUFjdGl2YXRlQkFFbnRyeSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBCQV9SRUNPUkQgcEJBKQoreworCXBCQS0+YlZhbGlkID0gZmFsc2U7CisJZGVsX3RpbWVyX3N5bmMoJnBCQS0+VGltZXIpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBkZWFjdGl2ZXRlIEJBIGVudHJ5IGluIFR4IFRzLCBhbmQgc2VuZCBERUxCQS4KKyAqICAgaW5wdXQ6CisgKiAgIAkgICAgIFBUWF9UU19SRUNPUkQJCXBUeFRzIC8vVHggVHMgd2hpY2ggaXMgdG8gZGVhY3RpdmF0ZSBCQSBlbnRyeS4KKyAqICBvdXRwdXQ6ICBub25lCisgKiAgbm90aWNlOiAgQXMgUFRYX1RTX1JFQ09SRCBzdHJ1Y3R1cmUgd2lsbCBiZSBkZWZpbmVkIGluIFFPUywgc28gd2FpdCB0byBiZSBtZXJnZWQuIC8vRklYTUUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggVHhUc0RlbGV0ZUJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRAlwVHhUcykKK3sKKwlQQkFfUkVDT1JECQlwQWRtaXR0ZWRCYSA9ICZwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkOyAgLy9UaGVzZSB0d28gQkEgZW50cmllcyBtdXN0IGV4aXN0IGluIFRTIHN0cnVjdHVyZQorCVBCQV9SRUNPUkQJCXBQZW5kaW5nQmEgPSAmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkOworCXU4CQkJYlNlbmRERUxCQSA9IGZhbHNlOworCisJLy8gRGVsZXRlIHBlbmRpbmcgQkEKKwlpZihwUGVuZGluZ0JhLT5iVmFsaWQpCisJeworCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwUGVuZGluZ0JhKTsKKwkJYlNlbmRERUxCQSA9IHRydWU7CisJfQorCisJLy8gRGVsZXRlIGFkbWl0dGVkIEJBCisJaWYocEFkbWl0dGVkQmEtPmJWYWxpZCkKKwl7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJhKTsKKwkJYlNlbmRERUxCQSA9IHRydWU7CisJfQorCisJcmV0dXJuIGJTZW5kREVMQkE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogZGVhY3RpdmV0ZSBCQSBlbnRyeSBpbiBUeCBUcywgYW5kIHNlbmQgREVMQkEuCisgKiAgIGlucHV0OgorICogICAJICAgICBQUlhfVFNfUkVDT1JECQlwUnhUcyAvL1J4IFRzIHdoaWNoIGlzIHRvIGRlYWN0aXZhdGUgQkEgZW50cnkuCisgKiAgb3V0cHV0OiAgbm9uZQorICogIG5vdGljZTogIEFzIFBSWF9UU19SRUNPUkQgc3RydWN0dXJlIHdpbGwgYmUgZGVmaW5lZCBpbiBRT1MsIHNvIHdhaXQgdG8gYmUgbWVyZ2VkLiAvL0ZJWE1FLCBzYW1lIHdpdGggYWJvdmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggUnhUc0RlbGV0ZUJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFJYX1RTX1JFQ09SRAlwUnhUcykKK3sKKwlQQkFfUkVDT1JECQlwQmEgPSAmcFJ4VHMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKKwl1OAkJCWJTZW5kREVMQkEgPSBmYWxzZTsKKworCWlmKHBCYS0+YlZhbGlkKQorCXsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJhKTsKKwkJYlNlbmRERUxCQSA9IHRydWU7CisJfQorCisJcmV0dXJuIGJTZW5kREVMQkE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogcmVzZXQgQkEgZW50cnkKKyAqICAgaW5wdXQ6CisgKiAgIAkgICAgIFBCQV9SRUNPUkQJCXBCQSAvL2VudHJ5IHRvIGJlIHJlc2V0CisgKiAgb3V0cHV0OiAgbm9uZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFJlc2V0QmFFbnRyeSggUEJBX1JFQ09SRCBwQkEpCit7CisJcEJBLT5iVmFsaWQJCQk9IGZhbHNlOworCXBCQS0+QmFQYXJhbVNldC5zaG9ydERhdGEJPSAwOworCXBCQS0+QmFUaW1lb3V0VmFsdWUJCT0gMDsKKwlwQkEtPkRpYWxvZ1Rva2VuCQk9IDA7CisJcEJBLT5CYVN0YXJ0U2VxQ3RybC5TaG9ydERhdGEJPSAwOworfQorLy9UaGVzZSBmdW5jdGlvbnMgbmVlZCBwb3J0aW5nIGhlcmUgb3Igbm90PworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBjb25zdHJ1Y3QgQUREQkFSRVEgYW5kIEFEREJBUlNQIGZyYW1lIGhlcmUgdG9nZXRoZXIuCisgKiAgIGlucHV0OiAgdTgqIAkJRHN0IAkvL0FEREJBIGZyYW1lJ3MgZGVzdGluYXRpb24KKyAqICAgCSAgICAgUEJBX1JFQ09SRCAJcEJBCS8vQkFfUkVDT1JEIGVudHJ5IHdoaWNoIHN0b3JlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBCQS4KKyAqICAgCSAgICAgdTE2IAkJU3RhdHVzQ29kZSAgLy9zdGF0dXMgY29kZSBpbiBSU1AgYW5kIEkgd2lsbCB1c2UgaXQgdG8gaW5kaWNhdGUgd2hldGhlciBpdCdzIFJTUCBvciBSRVEod2lsbCBJPykKKyAqICAgCSAgICAgdTgJCQl0eXBlCS8vaW5kaWNhdGUgd2hldGhlciBpdCdzIFJTUChBQ1RfQUREQkFSU1ApIG93IFJFUShBQ1RfQUREQkFSRVEpCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHNrX2J1ZmYqIAkJc2tiICAgICAvL3JldHVybiBjb25zdHJ1Y3RlZCBza2IgdG8geG1pdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX0FEREJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogRHN0LCBQQkFfUkVDT1JEIHBCQSwgdTE2IFN0YXR1c0NvZGUsIHU4IHR5cGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBCQVJlcSA9IE5VTEw7CisJdTgqIHRhZyA9IE5VTEw7CisJdTE2IHRtcCA9IDA7CisJdTE2IGxlbiA9IGllZWUtPnR4X2hlYWRyb29tICsgOTsKKwkvL2NhdGVnb3J5KDEpICsgYWN0aW9uIGZpZWxkKDEpICsgRGlhbG9nIFRva2VuKDEpICsgQkEgUGFyYW1ldGVyIFNldCgyKSArICBCQSBUaW1lb3V0IFZhbHVlKDIpICsgIEJBIFN0YXJ0IFNlcUN0cmwoMikob3IgU3RhdHVzQ29kZSgyKSkKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RSQUNFIHwgSUVFRTgwMjExX0RMX0JBLCAiPT09PT09PT0+JXMoKSwgZnJhbWUoJWQpIHNlbnRkIHRvOiJNQUNfRk1UIiwgaWVlZS0+ZGV2OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUsIE1BQ19BUkcoRHN0KSwgaWVlZS0+ZGV2KTsKKwlpZiAocEJBID09IE5VTEx8fGllZWUgPT0gTlVMTCkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicEJBKCVwKSBpcyBOVUxMIG9yIGllZWUoJXApIGlzIE5VTExcbiIsIHBCQSwgaWVlZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsgLy9uZWVkIHRvIGFkZCBzb21ldGhpbmcgb3RoZXJzPyBGSVhNRQorCWlmIChza2IgPT0gTlVMTCkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgYWxsb2Mgc2tiIGZvciBBRERCQV9SRVFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc2tiLT5kYXRhLCAwLCBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7ICAJLy9JIHdvbmRlciB3aGV0aGVyIGl0J3MgbmVjZXNzYXJ5LiBBcHBhcmVudGx5IGtlcm5lbCB3aWxsIG5vdCBkbyBpdCB3aGVuIGFsbG9jIGEgc2tiLgorCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJQkFSZXEgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYl9wdXQoc2tiLHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKworCW1lbWNweShCQVJlcS0+YWRkcjEsIERzdCwgRVRIX0FMRU4pOworCW1lbWNweShCQVJlcS0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCW1lbWNweShCQVJlcS0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJQkFSZXEtPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUKTsgLy9hY3Rpb24gZnJhbWUKKworCS8vdGFnICs9IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOyAvL21vdmUgdG8gYWN0aW9uIGZpZWxkCisJdGFnID0gKHU4Kilza2JfcHV0KHNrYiwgOSk7CisJKnRhZyArKz0gQUNUX0NBVF9CQTsKKwkqdGFnICsrPSB0eXBlOworCS8vIERpYWxvZyBUb2tlbgorCSp0YWcgKys9IHBCQS0+RGlhbG9nVG9rZW47CisKKwlpZiAoQUNUX0FEREJBUlNQID09IHR5cGUpCisJeworCQkvLyBTdGF0dXMgQ29kZQorCQlwcmludGsoIj09PT09PnRvIHNlbmQgQUREQkFSU1BcbiIpOworCQl0bXAgPSBjcHVfdG9fbGUxNihTdGF0dXNDb2RlKTsKKwkJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKKwkJdGFnICs9IDI7CisJfQorCS8vIEJBIFBhcmFtZXRlciBTZXQKKwl0bXAgPSBjcHVfdG9fbGUxNihwQkEtPkJhUGFyYW1TZXQuc2hvcnREYXRhKTsKKwltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCS8vIEJBIFRpbWVvdXQgVmFsdWUKKwl0bXAgPSBjcHVfdG9fbGUxNihwQkEtPkJhVGltZW91dFZhbHVlKTsKKwltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCisJaWYgKEFDVF9BRERCQVJFUSA9PSB0eXBlKQorCXsKKwkvLyBCQSBTdGFydCBTZXFDdHJsCisJCW1lbWNweSh0YWcsKHU4KikmKHBCQS0+QmFTdGFydFNlcUN0cmwpLCAyKTsKKwkJdGFnICs9IDI7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlyZXR1cm4gc2tiOworCS8vcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgY29uc3RydWN0IERFTEJBIGZyYW1lCisgKiAgIGlucHV0OiAgdTgqIAkJZHN0IAkvL0RFTEJBIGZyYW1lJ3MgZGVzdGluYXRpb24KKyAqICAgCSAgICAgUEJBX1JFQ09SRCAJcEJBCS8vQkFfUkVDT1JEIGVudHJ5IHdoaWNoIHN0b3JlcyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGZvciBCQQorICogICAJICAgICBUUl9TRUxFQ1QJICAgICAgICBUeFJ4U2VsZWN0ICAvL1RYIFJYIGRpcmVjdGlvbgorICogICAJICAgICB1MTYgCQlSZWFzb25Db2RlICAvL3N0YXR1cyBjb2RlLgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBza19idWZmKiAJCXNrYiAgICAgLy9yZXR1cm4gY29uc3RydWN0ZWQgc2tiIHRvIHhtaXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfREVMQkEoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsCisJdTgqCQkgICAgICAgICBkc3QsCisJUEJBX1JFQ09SRAkJIHBCQSwKKwlUUl9TRUxFQ1QJCSBUeFJ4U2VsZWN0LAorCXUxNgkJCSBSZWFzb25Db2RlCisJKQoreworCURFTEJBX1BBUkFNX1NFVAlEZWxiYVBhcmFtU2V0OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogRGVsYmEgPSBOVUxMOworCXU4KiB0YWcgPSBOVUxMOworCXUxNiB0bXAgPSAwOworCS8vbGVuID0gaGVhZCBsZW4gKyBERUxCQSBQYXJhbWV0ZXIgU2V0KDIpICsgUmVhc29uIENvZGUoMikKKwl1MTYgbGVuID0gNiArIGllZWUtPnR4X2hlYWRyb29tOworCisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RSQUNFIHwgSUVFRTgwMjExX0RMX0JBLCAiPT09PT09PT0+JXMoKSwgUmVhc29uQ29kZSglZCkgc2VudGQgdG86Ik1BQ19GTVQiXG4iLCBfX0ZVTkNUSU9OX18sIFJlYXNvbkNvZGUsIE1BQ19BUkcoZHN0KSk7CisKKwltZW1zZXQoJkRlbGJhUGFyYW1TZXQsIDAsIDIpOworCisJRGVsYmFQYXJhbVNldC5maWVsZC5Jbml0aWF0b3IJPSAoVHhSeFNlbGVjdD09VFhfRElSKT8xOjA7CisJRGVsYmFQYXJhbVNldC5maWVsZC5USUQJPSBwQkEtPkJhUGFyYW1TZXQuZmllbGQuVElEOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7IC8vbmVlZCB0byBhZGQgc29tZXRoaW5nIG90aGVycz8gRklYTUUKKwlpZiAoc2tiID09IE5VTEwpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIHNrYiBmb3IgQUREQkFfUkVRXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorLy8JbWVtc2V0KHNrYi0+ZGF0YSwgMCwgbGVuK3NpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCURlbGJhID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2JfcHV0KHNrYixzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoRGVsYmEtPmFkZHIxLCBkc3QsIEVUSF9BTEVOKTsKKwltZW1jcHkoRGVsYmEtPmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KERlbGJhLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJRGVsYmEtPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUKTsgLy9hY3Rpb24gZnJhbWUKKworCXRhZyA9ICh1OCopc2tiX3B1dChza2IsIDYpOworCisJKnRhZyArKz0gQUNUX0NBVF9CQTsKKwkqdGFnICsrPSBBQ1RfREVMQkE7CisKKwkvLyBERUxCQSBQYXJhbWV0ZXIgU2V0CisJdG1wID0gY3B1X3RvX2xlMTYoRGVsYmFQYXJhbVNldC5zaG9ydERhdGEpOworCW1lbWNweSh0YWcsICh1OCopJnRtcCwgMik7CisJdGFnICs9IDI7CisJLy8gUmVhc29uIENvZGUKKwl0bXAgPSBjcHVfdG9fbGUxNihSZWFzb25Db2RlKTsKKwltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFJBQ0UgfCBJRUVFODAyMTFfRExfQkEsICI8PT09PT0lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBza2I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogc2VuZCBBRERCQVJlcSBmcmFtZSBvdXQKKyAqICAgaW5wdXQ6ICB1OCogCQlkc3QgCS8vQUREQkFSZXEgZnJhbWUncyBkZXN0aW5hdGlvbgorICogICAJICAgICBQQkFfUkVDT1JEIAlwQkEJLy9CQV9SRUNPUkQgZW50cnkgd2hpY2ggc3RvcmVzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIEJBCisgKiAgb3V0cHV0OiAgbm9uZQorICogIG5vdGljZTogSWYgYW55IHBvc3NpYmxlLCBwbGVhc2UgaGlkZSBwQkEgaW4gaWVlZS4gQW5kIHRlbXBvcmFyaWx5IHVzZSBNYW5hZ2UgUXVldWUgYXMgc29mdG1hY19tZ210X3htaXQoKSB1c3VhbGx5IGRvZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpZWVlODAyMTFfc2VuZF9BRERCQVJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqCWRzdCwgUEJBX1JFQ09SRAlwQkEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc2tiID0gaWVlZTgwMjExX0FEREJBKGllZWUsIGRzdCwgcEJBLCAwLCBBQ1RfQUREQkFSRVEpOyAvL2NvbnN0cnVjdCBBQ1RfQUREQkFSRVEgZnJhbWVzIHNvIHNldCBzdGF0dXNjb2RlIHplcm8uCisKKwlpZiAoc2tiKQorCXsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJLy9hZGQgc3RhdGlzdGljIG5lZWRlZCBoZXJlLgorCQkvL2FuZCBza2Igd2lsbCBiZSBmcmVlZCBpbiBzb2Z0bWFjX21nbXRfeG1pdCgpLCBzbyBvbWl0IGFsbCBkZXZfa2ZyZWVfc2tiX2FueSgpIG91dHNpZGUgc29mdG1hY19tZ210X3htaXQoKQorCQkvL1dCCisJfQorCWVsc2UKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBzZW5kIEFEREJBUlNQIGZyYW1lIG91dAorICogICBpbnB1dDogIHU4KiAJCWRzdCAJLy9ERUxCQSBmcmFtZSdzIGRlc3RpbmF0aW9uCisgKiAgIAkgICAgIFBCQV9SRUNPUkQgCXBCQQkvL0JBX1JFQ09SRCBlbnRyeSB3aGljaCBzdG9yZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgQkEKKyAqICAgCSAgICAgdTE2CQlTdGF0dXNDb2RlIC8vUlNQIFN0YXR1c0NvZGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgbm90aWNlOiBJZiBhbnkgcG9zc2libGUsIHBsZWFzZSBoaWRlIHBCQSBpbiBpZWVlLiBBbmQgdGVtcG9yYXJpbHkgdXNlIE1hbmFnZSBRdWV1ZSBhcyBzb2Z0bWFjX21nbXRfeG1pdCgpIHVzdWFsbHkgZG9lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGllZWU4MDIxMV9zZW5kX0FEREJBUnNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogZHN0LCBQQkFfUkVDT1JEIHBCQSwgdTE2IFN0YXR1c0NvZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc2tiID0gaWVlZTgwMjExX0FEREJBKGllZWUsIGRzdCwgcEJBLCBTdGF0dXNDb2RlLCBBQ1RfQUREQkFSU1ApOyAvL2NvbnN0cnVjdCBBQ1RfQUREQkFSU1AgZnJhbWVzCisJaWYgKHNrYikKKwl7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCS8vc2FtZSBhYm92ZQorCX0KKwllbHNlCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworCXJldHVybjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBzZW5kIEFEREJBUlNQIGZyYW1lIG91dAorICogICBpbnB1dDogIHU4KiAJCWRzdCAJLy9ERUxCQSBmcmFtZSdzIGRlc3RpbmF0aW9uCisgKiAgIAkgICAgIFBCQV9SRUNPUkQgCXBCQQkvL0JBX1JFQ09SRCBlbnRyeSB3aGljaCBzdG9yZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgQkEKKyAqICAgCSAgICAgVFJfU0VMRUNUICAgICAgICAgIFR4UnhTZWxlY3QgLy9UWCBvciBSWAorICogICAJICAgICB1MTYJCVJlYXNvbkNvZGUgLy9ERUwgUmVhc29uQ29kZQorICogIG91dHB1dDogIG5vbmUKKyAqICBub3RpY2U6IElmIGFueSBwb3NzaWJsZSwgcGxlYXNlIGhpZGUgcEJBIGluIGllZWUuIEFuZCB0ZW1wb3JhcmlseSB1c2UgTWFuYWdlIFF1ZXVlIGFzIHNvZnRtYWNfbWdtdF94bWl0KCkgdXN1YWxseSBkb2VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBpZWVlODAyMTFfc2VuZF9ERUxCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIGRzdCwgUEJBX1JFQ09SRCBwQkEsIFRSX1NFTEVDVCBUeFJ4U2VsZWN0LCB1MTYgUmVhc29uQ29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlza2IgPSBpZWVlODAyMTFfREVMQkEoaWVlZSwgZHN0LCBwQkEsIFR4UnhTZWxlY3QsIFJlYXNvbkNvZGUpOyAvL2NvbnN0cnVjdCBBQ1RfQUREQkFSU1AgZnJhbWVzCisJaWYgKHNrYikKKwl7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCS8vc2FtZSBhYm92ZQorCX0KKwllbHNlCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwlyZXR1cm4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IFJYIEFEREJBUmVxCisgKiAgIGlucHV0OiAgc3RydWN0IHNrX2J1ZmYgKiAgIHNrYgkvL2luY29taW5nIEFEREJBUmVxIHNrYi4KKyAqICByZXR1cm46ICAwKHBhc3MpLCBvdGhlcihmYWlsKQorICogIG5vdGljZTogIEFzIHRoaXMgZnVuY3Rpb24gbmVlZCBzdXBwb3J0IG9mIFFPUywgSSBjb21tZW50IHNvbWUgY29kZSBvdXQuIEFuZCB3aGVuIHFvcyBpcyByZWFkeSwgdGhpcyBjb2RlIG5lZWQgdG8gYmUgc3VwcG9ydC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGllZWU4MDIxMV9yeF9BRERCQVJlcSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiByZXEgPSBOVUxMOworCXUxNiByYyA9IDA7CisJdTggKiBkc3QgPSBOVUxMLCAqcERpYWxvZ1Rva2VuID0gTlVMTCwgKnRhZyA9IE5VTEw7CisJUEJBX1JFQ09SRCBwQkEgPSBOVUxMOworCVBCQV9QQVJBTV9TRVQJcEJhUGFyYW1TZXQgPSBOVUxMOworCXUxNiogcEJhVGltZW91dFZhbCA9IE5VTEw7CisJUFNFUVVFTkNFX0NPTlRST0wgcEJhU3RhcnRTZXFDdHJsID0gTlVMTDsKKwlQUlhfVFNfUkVDT1JECXBUUyA9IE5VTEw7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gQkFSRVEoJWQgLyAlZClcbiIsIHNrYi0+bGVuLCAJKHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgOSkpOworCQlyZXR1cm4gLTE7CisJfQorCisJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCXJlcSA9ICggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqKSBza2ItPmRhdGE7CisJdGFnID0gKHU4KilyZXE7CisJZHN0ID0gKHU4KikoJnJlcS0+YWRkcjJbMF0pOworCXRhZyArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOyAgLy9jYXRlZ29yeSthY3Rpb24KKwlwQmFQYXJhbVNldCA9IChQQkFfUEFSQU1fU0VUKSh0YWcgKyAzKTsgICAvLytEaWFsb2dUb2tlbgorCXBCYVRpbWVvdXRWYWwgPSAodTE2KikodGFnICsgNSk7CisJcEJhU3RhcnRTZXFDdHJsID0gKFBTRVFVRU5DRV9DT05UUk9MKShyZXEgKyA3KTsKKworCXByaW50aygiPT09PT09PT09PT09PT09PT09PT0+cnggQUREQkFSRVEgZnJvbSA6Ik1BQ19GTVQiXG4iLCBNQUNfQVJHKGRzdCkpOworLy9zb21lIG90aGVyIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5IG5vdy4KKwlpZigJKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCkgfHwKKwkJKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKSkgLy98fAorCS8vCShpZWVlLT5wU3RhUW9zLT5iRW5hYmxlUnhJbW1CQSA9PSBmYWxzZSkJKQorCXsKKwkJcmMgPSBBRERCQV9TVEFUVVNfUkVGVVNFRDsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJGYWlsZWQgdG8gcmVwbHkgb24gQUREQkFfUkVRIGFzIHNvbWUgY2FwYWJpbGl0eSBpcyBub3QgcmVhZHkoJWQsICVkKVxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOworCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKKwl9CisJLy8gU2VhcmNoIGZvciByZWxhdGVkIHRyYWZmaWMgc3RyZWFtLgorCS8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgVFMsIHJlamVjdCB0aGUgQUREQkEgcmVxdWVzdC4KKwlpZigJIUdldFRzKAorCQkJaWVlZSwKKwkJCShQVFNfQ09NTU9OX0lORk8qKSgmcFRTKSwKKwkJCWRzdCwKKwkJCSh1OCkocEJhUGFyYW1TZXQtPmZpZWxkLlRJRCksCisJCQlSWF9ESVIsCisJCQl0cnVlKQkpCisJeworCQlyYyA9IEFEREJBX1NUQVRVU19SRUZVU0VEOworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGdldCBUUyBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKKwl9CisJcEJBID0gJnBUUy0+UnhBZG1pdHRlZEJBUmVjb3JkOworCS8vIFRvIERldGVybWluZSB0aGUgQUREQkEgUmVxIGNvbnRlbnQKKwkvLyBXZSBjYW4gZG8gbXVjaCBtb3JlIGNoZWNrIGhlcmUsIGluY2x1ZGluZyBCdWZmZXJTaXplLCBBTVNEVV9TdXBwb3J0LCBQb2xpY3ksIFN0YXJ0U2VxQ3RybC4uLgorCS8vIEkgd2FudCB0byBjaGVjayBTdGFydFNlcUN0cmwgdG8gbWFrZSBzdXJlIHdoZW4gd2Ugc3RhcnQgYWdncmVnYXRpb24hISEKKwkvLworCWlmKHBCYVBhcmFtU2V0LT5maWVsZC5CQVBvbGljeSA9PSBCQV9QT0xJQ1lfREVMQVlFRCkKKwl7CisJCXJjID0gQUREQkFfU1RBVFVTX0lOVkFMSURfUEFSQU07CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiQkEgUG9saWN5IGlzIG5vdCBjb3JyZWN0IGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gT25BRERCQVJlcV9GYWlsOworCX0KKwkJLy8gQWRtaXQgdGhlIEFEREJBIFJlcXVlc3QKKwkvLworCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSk7CisJcEJBLT5EaWFsb2dUb2tlbiA9ICpwRGlhbG9nVG9rZW47CisJcEJBLT5CYVBhcmFtU2V0ID0gKnBCYVBhcmFtU2V0OworCXBCQS0+QmFUaW1lb3V0VmFsdWUgPSAqcEJhVGltZW91dFZhbDsKKwlwQkEtPkJhU3RhcnRTZXFDdHJsID0gKnBCYVN0YXJ0U2VxQ3RybDsKKwkvL2ZvciBoYWxmIE4gbW9kZSB3ZSBvbmx5IGFnZ3JlZ2F0ZSAxIGZyYW1lCisJaWYgKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQnVmZmVyU2l6ZSA9IDE7CisJZWxzZQorCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7CisJQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSwgcEJBLT5CYVRpbWVvdXRWYWx1ZSk7CisJaWVlZTgwMjExX3NlbmRfQUREQkFSc3AoaWVlZSwgZHN0LCBwQkEsIEFEREJBX1NUQVRVU19TVUNDRVNTKTsKKworCS8vIEVuZCBvZiBwcm9jZWR1cmUuCisJcmV0dXJuIDA7CisKK09uQUREQkFSZXFfRmFpbDoKKwl7CisJCUJBX1JFQ09SRAlCQTsKKwkJQkEuQmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKKwkJQkEuQmFUaW1lb3V0VmFsdWUgPSAqcEJhVGltZW91dFZhbDsKKwkJQkEuRGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOworCQlCQS5CYVBhcmFtU2V0LmZpZWxkLkJBUG9saWN5ID0gQkFfUE9MSUNZX0lNTUVESUFURTsKKwkJaWVlZTgwMjExX3NlbmRfQUREQkFSc3AoaWVlZSwgZHN0LCAmQkEsIHJjKTsKKwkJcmV0dXJuIDA7IC8vd2Ugc2VuZCBSU1Agb3V0LgorCX0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246IFJYIEFEREJBUlNQCisgKiAgIGlucHV0OiAgc3RydWN0IHNrX2J1ZmYgKiAgIHNrYgkvL2luY29taW5nIEFEREJBUmVxIHNrYi4KKyAqICByZXR1cm46ICAwKHBhc3MpLCBvdGhlcihmYWlsKQorICogIG5vdGljZTogIEFzIHRoaXMgZnVuY3Rpb24gbmVlZCBzdXBwb3J0IG9mIFFPUywgSSBjb21tZW50IHNvbWUgY29kZSBvdXQuIEFuZCB3aGVuIHFvcyBpcyByZWFkeSwgdGhpcyBjb2RlIG5lZWQgdG8gYmUgc3VwcG9ydC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGllZWU4MDIxMV9yeF9BRERCQVJzcCggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiByc3AgPSBOVUxMOworCVBCQV9SRUNPUkQJCXBQZW5kaW5nQkEsIHBBZG1pdHRlZEJBOworCVBUWF9UU19SRUNPUkQJCXBUUyA9IE5VTEw7CisJdTgqIGRzdCA9IE5VTEwsICpwRGlhbG9nVG9rZW4gPSBOVUxMLCAqdGFnID0gTlVMTDsKKwl1MTYqIHBTdGF0dXNDb2RlID0gTlVMTCwgKnBCYVRpbWVvdXRWYWwgPSBOVUxMOworCVBCQV9QQVJBTV9TRVQJCXBCYVBhcmFtU2V0ID0gTlVMTDsKKwl1MTYJCQlSZWFzb25Db2RlOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KQorCXsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUlNQKCVkIC8gJWQpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyc3AgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKilza2ItPmRhdGE7CisJdGFnID0gKHU4Kilyc3A7CisJZHN0ID0gKHU4KikoJnJzcC0+YWRkcjJbMF0pOworCXRhZyArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOworCXBTdGF0dXNDb2RlID0gKHUxNiopKHRhZyArIDMpOworCXBCYVBhcmFtU2V0ID0gKFBCQV9QQVJBTV9TRVQpKHRhZyArIDUpOworCXBCYVRpbWVvdXRWYWwgPSAodTE2KikodGFnICsgNyk7CisKKwkvLyBDaGVjayB0aGUgY2FwYWJpbGl0eQorCS8vIFNpbmNlIHdlIGNhbiBhbHdheXMgcmVjZWl2ZSBBLU1QRFUsIHdlIGp1c3QgY2hlY2sgaWYgaXQgaXMgdW5kZXIgSFQgbW9kZS4KKwlpZiggICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCAgfHwKKwkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UgfHwKKwkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9PSBmYWxzZSApCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInJlamVjdCB0byBBRERCQV9SU1AgYXMgc29tZSBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQsICVkKVxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSk7CisJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKKwkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwl9CisKKworCS8vCisJLy8gU2VhcmNoIGZvciByZWxhdGVkIFRTLgorCS8vIElmIHRoZXJlIGlzIG5vIFRTIGZvdW5kLCB3ZSB3aWwgcmVqZWN0IEFEREJBIFJzcCBieSBzZW5kaW5nIERFTEJBIGZyYW1lLgorCS8vCisJaWYgKCFHZXRUcygKKwkJCWllZWUsCisJCQkoUFRTX0NPTU1PTl9JTkZPKikoJnBUUyksCisJCQlkc3QsCisJCQkodTgpKHBCYVBhcmFtU2V0LT5maWVsZC5USUQpLAorCQkJVFhfRElSLAorCQkJZmFsc2UpCSkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgZ2V0IFRTIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKKwkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwl9CisKKwlwVFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwUGVuZGluZ0JBID0gJnBUUy0+VHhQZW5kaW5nQkFSZWNvcmQ7CisJcEFkbWl0dGVkQkEgPSAmcFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQ7CisKKworCS8vCisJLy8gQ2hlY2sgaWYgcmVsYXRlZCBCQSBpcyB3YWl0aW5nIGZvciBzZXR1cC4KKwkvLyBJZiBub3QsIHJlamVjdCBieSBzZW5kaW5nIERFTEJBIGZyYW1lLgorCS8vCisJaWYoKHBBZG1pdHRlZEJBLT5iVmFsaWQ9PXRydWUpKQorCXsKKwkJLy8gU2luY2UgQkEgaXMgYWxyZWFkeSBzZXR1cCwgd2UgaWdub3JlIGFsbCBvdGhlciBBRERCQSBSZXNwb25zZS4KKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIERyb3AgYmVjYXVzZSBhbHJlYWR5IGFkbWl0IGl0ISBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYoKHBQZW5kaW5nQkEtPmJWYWxpZCA9PSBmYWxzZSkgfHwoKnBEaWFsb2dUb2tlbiAhPSBwUGVuZGluZ0JBLT5EaWFsb2dUb2tlbikpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBCQSBpbnZhbGlkLCBERUxCQSEgXG4iKTsKKwkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9VTktOT1dOX0JBOworCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OworCX0KKwllbHNlCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gQkEgaXMgYWRtaXR0ZWQhIFN0YXR1cyBjb2RlOiVYXG4iLCAqcFN0YXR1c0NvZGUpOworCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwUGVuZGluZ0JBKTsKKwl9CisKKworCWlmKCpwU3RhdHVzQ29kZSA9PSBBRERCQV9TVEFUVVNfU1VDQ0VTUykKKwl7CisJCS8vCisJCS8vIERldGVybWluZSBBRERCQSBSc3AgY29udGVudCBoZXJlLgorCQkvLyBXZSBjYW4gY29tcGFyZSB0aGUgdmFsdWUgb2YgQkEgcGFyYW1ldGVyIHNldCB0aGF0IFBlZXIgcmV0dXJuZWQgYW5kIFNlbGYgc2VudC4KKwkJLy8gSWYgaXQgaXMgT0ssIHRoZW4gYWRtaXR0ZWQuIE9yIHdlIGNhbiBzZW5kIERFTEJBIHRvIGNhbmNlbCBCQSBtZWNoYW5pc20uCisJCS8vCisJCWlmKHBCYVBhcmFtU2V0LT5maWVsZC5CQVBvbGljeSA9PSBCQV9QT0xJQ1lfREVMQVlFRCkKKwkJeworCQkJLy8gU2luY2UgdGhpcyBpcyBhIGtpbmQgb2YgQUREQkEgZmFpbGVkLCB3ZSBkZWxheSBuZXh0IEFEREJBIHByb2Nlc3MuCisJCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOworCQkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEpOworCQkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9FTkRfQkE7CisJCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OworCQl9CisKKworCQkvLworCQkvLyBBZG1pdHRlZCBjb25kaXRpb24KKwkJLy8KKwkJcEFkbWl0dGVkQkEtPkRpYWxvZ1Rva2VuID0gKnBEaWFsb2dUb2tlbjsKKwkJcEFkbWl0dGVkQkEtPkJhVGltZW91dFZhbHVlID0gKnBCYVRpbWVvdXRWYWw7CisJCXBBZG1pdHRlZEJBLT5CYVN0YXJ0U2VxQ3RybCA9IHBQZW5kaW5nQkEtPkJhU3RhcnRTZXFDdHJsOworCQlwQWRtaXR0ZWRCQS0+QmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEpOworCQlBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEsICpwQmFUaW1lb3V0VmFsKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gRGVsYXkgbmV4dCBBRERCQSBwcm9jZXNzLgorCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOworCX0KKworCS8vIEVuZCBvZiBwcm9jZWR1cmUKKwlyZXR1cm4gMDsKKworT25BRERCQVJzcF9SZWplY3Q6CisJeworCQlCQV9SRUNPUkQJQkE7CisJCUJBLkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7CisJCWllZWU4MDIxMV9zZW5kX0RFTEJBKGllZWUsIGRzdCwgJkJBLCBUWF9ESVIsIFJlYXNvbkNvZGUpOworCQlyZXR1cm4gMDsKKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiBSWCBERUxCQQorICogICBpbnB1dDogIHN0cnVjdCBza19idWZmICogICBza2IJLy9pbmNvbWluZyBBRERCQVJlcSBza2IuCisgKiAgcmV0dXJuOiAgMChwYXNzKSwgb3RoZXIoZmFpbCkKKyAqICBub3RpY2U6ICBBcyB0aGlzIGZ1bmN0aW9uIG5lZWQgc3VwcG9ydCBvZiBRT1MsIEkgY29tbWVudCBzb21lIGNvZGUgb3V0LiBBbmQgd2hlbiBxb3MgaXMgcmVhZHksIHRoaXMgY29kZSBuZWVkIHRvIGJlIHN1cHBvcnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpZWVlODAyMTFfcnhfREVMQkEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqIGRlbGJhID0gTlVMTDsKKwlQREVMQkFfUEFSQU1fU0VUCXBEZWxCYVBhcmFtU2V0ID0gTlVMTDsKKwl1MTYqCQkJcFJlYXNvbkNvZGUgPSBOVUxMOworCXU4KgkJCWRzdCA9IE5VTEw7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDYpCisJeworCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gREVMQkEoJWQgLyAlZClcbiIsIHNrYi0+bGVuLCAJKHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgNikpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9PSAwIHx8CisJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicmVjZWl2ZWQgREVMQkEgd2hpbGUgUU9TIG9yIEhUIGlzIG5vdCBzdXBwb3J0ZWQoJWQsICVkKVxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQXxJRUVFODAyMTFfRExfQkEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWRlbGJhID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiLT5kYXRhOworCWRzdCA9ICh1OCopKCZkZWxiYS0+YWRkcjJbMF0pOworCWRlbGJhICs9IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBEZWxCYVBhcmFtU2V0ID0gKFBERUxCQV9QQVJBTV9TRVQpKGRlbGJhKzIpOworCXBSZWFzb25Db2RlID0gKHUxNiopKGRlbGJhKzQpOworCisJaWYocERlbEJhUGFyYW1TZXQtPmZpZWxkLkluaXRpYXRvciA9PSAxKQorCXsKKwkJUFJYX1RTX1JFQ09SRCAJcFJ4VHM7CisKKwkJaWYoICFHZXRUcygKKwkJCQlpZWVlLAorCQkJCShQVFNfQ09NTU9OX0lORk8qKSZwUnhUcywKKwkJCQlkc3QsCisJCQkJKHU4KXBEZWxCYVBhcmFtU2V0LT5maWVsZC5USUQsCisJCQkJUlhfRElSLAorCQkJCWZhbHNlKQkpCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAgImNhbid0IGdldCBUUyBmb3IgUlhUUyBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJUnhUc0RlbGV0ZUJBKGllZWUsIHBSeFRzKTsKKwl9CisJZWxzZQorCXsKKwkJUFRYX1RTX1JFQ09SRAlwVHhUczsKKworCQlpZighR2V0VHMoCisJCQlpZWVlLAorCQkJKFBUU19DT01NT05fSU5GTyopJnBUeFRzLAorCQkJZHN0LAorCQkJKHU4KXBEZWxCYVBhcmFtU2V0LT5maWVsZC5USUQsCisJCQlUWF9ESVIsCisJCQlmYWxzZSkJKQorCQl7CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgICJjYW4ndCBnZXQgVFMgZm9yIFRYVFMgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXBUeFRzLT5iVXNpbmdCYSA9IGZhbHNlOworCQlwVHhUcy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IGZhbHNlOworCQlwVHhUcy0+YkFkZEJhUmVxRGVsYXllZCA9IGZhbHNlOworCQlkZWxfdGltZXJfc3luYygmcFR4VHMtPlRzQWRkQmFUaW1lcik7CisJCS8vUGxhdGZvcm1DYW5jZWxUaW1lcihBZGFwdGVyLCAmcFR4VHMtPlRzQWRkQmFUaW1lcik7CisJCVR4VHNEZWxldGVCQShpZWVlLCBwVHhUcyk7CisJfQorCXJldHVybiAwOworfQorCisvLworLy8gQUREQkEgaW5pdGlhdGUuIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFRYIHNpZGUuCisvLwordm9pZAorVHNJbml0QWRkQkEoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsCisJUFRYX1RTX1JFQ09SRAlwVFMsCisJdTgJCVBvbGljeSwKKwl1OAkJYk92ZXJ3cml0ZVBlbmRpbmcKKwkpCit7CisJUEJBX1JFQ09SRAkJCXBCQSA9ICZwVFMtPlR4UGVuZGluZ0JBUmVjb3JkOworCisJaWYocEJBLT5iVmFsaWQ9PXRydWUgJiYgYk92ZXJ3cml0ZVBlbmRpbmc9PWZhbHNlKQorCQlyZXR1cm47CisKKwkvLyBTZXQgcGFyYW1ldGVycyB0byAiUGVuZGluZyIgdmFyaWFibGUgc2V0CisJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJBKTsKKworCXBCQS0+RGlhbG9nVG9rZW4rKzsJCQkJCQkvLyBEaWFsb2dUb2tlbjogT25seSBrZWVwIHRoZSBsYXRlc3QgZGlhbG9nIHRva2VuCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkFNU0RVX1N1cHBvcnQgPSAwOwkvLyBEbyBub3Qgc3VwcG9ydCBBLU1TRFUgd2l0aCBBLU1QRFUgbm93ISEKKwlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQkFQb2xpY3kgPSBQb2xpY3k7CS8vIFBvbGljeTogRGVsYXllZCBvciBJbW1lZGlhdGUKKwlwQkEtPkJhUGFyYW1TZXQuZmllbGQuVElEID0gcFRTLT5Uc0NvbW1vbkluZm8uVFNwZWMuZi5UU0luZm8uZmllbGQudWNUU0lEOwkvLyBUSUQKKwkvLyBCdWZmZXJTaXplOiBUaGlzIG5lZWQgdG8gYmUgc2V0IGFjY29yZGluZyB0byBBLU1QRFUgdmVjdG9yCisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJ1ZmZlclNpemUgPSAzMjsJCS8vIEJ1ZmZlclNpemU6IFRoaXMgbmVlZCB0byBiZSBzZXQgYWNjb3JkaW5nIHRvIEEtTVBEVSB2ZWN0b3IKKwlwQkEtPkJhVGltZW91dFZhbHVlID0gMDsJCQkJCS8vIFRpbWVvdXQgdmFsdWU6IFNldCAwIHRvIGRpc2FibGUgVGltZXIKKwlwQkEtPkJhU3RhcnRTZXFDdHJsLmZpZWxkLlNlcU51bSA9IChwVFMtPlR4Q3VyU2VxICsgMykgJSA0MDk2OyAJLy8gQmxvY2sgQWNrIHdpbGwgc3RhcnQgYWZ0ZXIgMyBwYWNrZXRzIGxhdGVyLgorCisJQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSwgQkFfU0VUVVBfVElNRU9VVCk7CisKKwlpZWVlODAyMTFfc2VuZF9BRERCQVJlcShpZWVlLCBwVFMtPlRzQ29tbW9uSW5mby5BZGRyLCBwQkEpOworfQorCit2b2lkCitUc0luaXREZWxCQSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBUU19DT01NT05fSU5GTyBwVHNDb21tb25JbmZvLCBUUl9TRUxFQ1QgVHhSeFNlbGVjdCkKK3sKKworCWlmKFR4UnhTZWxlY3QgPT0gVFhfRElSKQorCXsKKwkJUFRYX1RTX1JFQ09SRAlwVHhUcyA9IChQVFhfVFNfUkVDT1JEKXBUc0NvbW1vbkluZm87CisKKwkJaWYoVHhUc0RlbGV0ZUJBKGllZWUsIHBUeFRzKSkKKwkJCWllZWU4MDIxMV9zZW5kX0RFTEJBKAorCQkJCWllZWUsCisJCQkJcFRzQ29tbW9uSW5mby0+QWRkciwKKwkJCQkocFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZC5iVmFsaWQpPygmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZCk6KCZwVHhUcy0+VHhQZW5kaW5nQkFSZWNvcmQpLAorCQkJCVR4UnhTZWxlY3QsCisJCQkJREVMQkFfUkVBU09OX0VORF9CQSk7CisJfQorCWVsc2UgaWYoVHhSeFNlbGVjdCA9PSBSWF9ESVIpCisJeworCQlQUlhfVFNfUkVDT1JECXBSeFRzID0gKFBSWF9UU19SRUNPUkQpcFRzQ29tbW9uSW5mbzsKKwkJaWYoUnhUc0RlbGV0ZUJBKGllZWUsIHBSeFRzKSkKKwkJCWllZWU4MDIxMV9zZW5kX0RFTEJBKAorCQkJCWllZWUsCisJCQkJcFRzQ29tbW9uSW5mby0+QWRkciwKKwkJCQkmcFJ4VHMtPlJ4QWRtaXR0ZWRCQVJlY29yZCwKKwkJCQlUeFJ4U2VsZWN0LAorCQkJCURFTEJBX1JFQVNPTl9FTkRfQkEJKTsKKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBCQSBzZXR1cCB0aW1lcgorICogICBpbnB1dDogIHVuc2lnbmVkIGxvbmcJIGRhdGEJCS8vYWN0dXJhbGx5IHdlIHNlbmQgVFhfVFNfUkVDT1JEIG9yIFJYX1RTX1JFQ09SRCB0byB0aGVzZSB0aW1lcgorICogIHJldHVybjogIE5VTEwKKyAqICBub3RpY2U6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQmFTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBUWF9UU19SRUNPUkQJcFR4VHMgPSAoUFRYX1RTX1JFQ09SRClkYXRhOworCisJcFR4VHMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwVHhUcy0+YkFkZEJhUmVxRGVsYXllZCA9IHRydWU7CisJcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkLmJWYWxpZCA9IGZhbHNlOworfQorCit2b2lkIFR4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVBUWF9UU19SRUNPUkQJcFR4VHMgPSAoUFRYX1RTX1JFQ09SRClkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBUeFRzLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgVHhUc1JlY29yZFtwVHhUcy0+bnVtXSk7CisJVHhUc0RlbGV0ZUJBKGllZWUsIHBUeFRzKTsKKwlpZWVlODAyMTFfc2VuZF9ERUxCQSgKKwkJaWVlZSwKKwkJcFR4VHMtPlRzQ29tbW9uSW5mby5BZGRyLAorCQkmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZCwKKwkJVFhfRElSLAorCQlERUxCQV9SRUFTT05fVElNRU9VVCk7Cit9CisKK3ZvaWQgUnhCYUluYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKWRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFJ4VHMsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBSeFRzUmVjb3JkW3BSeFRzLT5udW1dKTsKKworCVJ4VHNEZWxldGVCQShpZWVlLCBwUnhUcyk7CisJaWVlZTgwMjExX3NlbmRfREVMQkEoCisJCWllZWUsCisJCXBSeFRzLT5Uc0NvbW1vbkluZm8uQWRkciwKKwkJJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQsCisJCVJYX0RJUiwKKwkJREVMQkFfUkVBU09OX1RJTUVPVVQpOworCXJldHVybiA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlNjAzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVC5oCkBAIC0wLDAgKzEsNDgxIEBACisjaWZuZGVmIF9SVEw4MTlYVV9IVFRZUEVfSF8KKyNkZWZpbmUgX1JUTDgxOVhVX0hUVFlQRV9IXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIEhUIENhcGFiaWxpdHkgZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMsIGFzc29jaWF0aW9uIHJlcXVlc3QsCisvLwlyZWFzc29jaWF0aW9uIHJlcXVlc3QgYW5kIHByb2JlIHJlc3BvbnNlIGZyYW1lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIE9wZXJhdGlvbiBtb2RlIHZhbHVlCisvLworI2RlZmluZSBIVF9PUE1PREVfTk9fUFJPVEVDVAkJMAorI2RlZmluZSBIVF9PUE1PREVfT1BUSU9OQUwJCTEKKyNkZWZpbmUgSFRfT1BNT0RFXzQwTUhaX1BST1RFQ1QJMgorI2RlZmluZSBIVF9PUE1PREVfTUlYRUQJCQkzCisKKy8vCisvLyBNSU1PIFBvd2VyIFNhdmUgU2V0aW5ncworLy8KKyNkZWZpbmUgTUlNT19QU19TVEFUSUMJCQkJMAorI2RlZmluZSBNSU1PX1BTX0RZTkFNSUMJCQkxCisjZGVmaW5lIE1JTU9fUFNfTk9MSU1JVAkJCTMKKworCisvLworLy8JVGhlcmUgc2hvdWxkIGJlIDEyOCBiaXRzIHRvIGNvdmVyIGFsbCBvZiB0aGUgTUNTIHJhdGVzLiBIb3dldmVyLCBzaW5jZQorLy8JODE5MCBkb2VzIG5vdCBzdXBwb3J0IHRvbyBtdWNoIHJhdGVzLCBvbmUgaW50ZWdlciBpcyBxdWl0ZSBlbm91Z2guCisvLworCisjZGVmaW5lIHNIVENMbmcJNAorCisKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfQklUTUFQCQkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMlNTX0JJVE1BUAkJCQkJMHgwMDAwZmYwMAorI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzFTU18yU1NfQklUTUFQCQkJSFRfTUNTXzFTU19CSVRNQVB8SFRfTUNTXzFTU18yU1NfQklUTUFQCisKKwordHlwZWRlZiBlbnVtIF9IVF9NQ1NfUkFURXsKKwlIVF9NQ1MwICAgPSAweDAwMDAwMDAxLAorCUhUX01DUzEgICA9IDB4MDAwMDAwMDIsCisJSFRfTUNTMiAgID0gMHgwMDAwMDAwNCwKKwlIVF9NQ1MzICAgPSAweDAwMDAwMDA4LAorCUhUX01DUzQgICA9IDB4MDAwMDAwMTAsCisJSFRfTUNTNSAgID0gMHgwMDAwMDAyMCwKKwlIVF9NQ1M2ICAgPSAweDAwMDAwMDQwLAorCUhUX01DUzcgICA9IDB4MDAwMDAwODAsCisJSFRfTUNTOCAgID0gMHgwMDAwMDEwMCwKKwlIVF9NQ1M5ICAgPSAweDAwMDAwMjAwLAorCUhUX01DUzEwID0gMHgwMDAwMDQwMCwKKwlIVF9NQ1MxMSA9IDB4MDAwMDA4MDAsCisJSFRfTUNTMTIgPSAweDAwMDAxMDAwLAorCUhUX01DUzEzID0gMHgwMDAwMjAwMCwKKwlIVF9NQ1MxNCA9IDB4MDAwMDQwMDAsCisJSFRfTUNTMTUgPSAweDAwMDA4MDAwLAorCS8vIERvIG5vdCBkZWZpbmUgTUNTMzIgaGVyZSBhbHRob3VnaCA4MTkwIHN1cHBvcnQgTUNTMzIKK31IVF9NQ1NfUkFURSwqUEhUX01DU19SQVRFOworCisvLworLy8gUmVwcmVzZW50IENoYW5uZWwgV2lkdGggaW4gSFQgQ2FwYWJpbGl0aWVzCisvLwordHlwZWRlZiBlbnVtIF9IVF9DSEFOTkVMX1dJRFRIeworCUhUX0NIQU5ORUxfV0lEVEhfMjAgPSAwLAorCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgPSAxLAorfUhUX0NIQU5ORUxfV0lEVEgsICpQSFRfQ0hBTk5FTF9XSURUSDsKKworLy8KKy8vIFJlcHJlc2VudCBFeHRlbnRpb24gQ2hhbm5lbCBPZmZzZXQgaW4gSFQgQ2FwYWJpbGl0aWVzCisvLyBUaGlzIGlzIGF2YWlsYWJsZSBvbmx5IGluIDQwTWh6IG1vZGUuCisvLwordHlwZWRlZiBlbnVtIF9IVF9FWFRDSE5MX09GRlNFVHsKKwlIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQgPSAwLAorCUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSID0gMSwKKwlIVF9FWFRDSE5MX09GRlNFVF9OT19ERUYgPSAyLAorCUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSID0gMywKK31IVF9FWFRDSE5MX09GRlNFVCwgKlBIVF9FWFRDSE5MX09GRlNFVDsKKwordHlwZWRlZiBlbnVtIF9DSE5MT1B7CisJQ0hOTE9QX05PTkUgPSAwLCAvLyBObyBBY3Rpb24gbm93CisJQ0hOTE9QX1NDQU4gPSAxLCAvLyBTY2FuIGluIHByb2dyZXNzCisJQ0hOTE9QX1NXQlcgPSAyLCAvLyBCYW5kd2lkdGggc3dpdGNoaW5nIGluIHByb2dyZXNzCisJQ0hOTE9QX1NXQ0hOTCA9IDMsIC8vIFNvZnR3YXJlIENoYW5uZWwgc3dpdGNoaW5nIGluIHByb2dyZXNzCit9IENITkxPUCwgKlBDSE5MT1A7CisKKy8vIERldGVybWluZSBpZiB0aGUgQ2hhbm5lbCBPcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MKKyNkZWZpbmUgQ0hITE9QX0lOX1BST0dSRVNTKF9wSFRJbmZvKQlcCisJCSgoX3BIVEluZm8pLT5DaG5sT3AgPiBDSE5MT1BfTk9ORSkgPyBUUlVFIDogRkFMU0UKKworLyoKK3R5cGVkZWYJdW5pb24gX0hUX0NBUEFCSUxJVFl7CisJdTE2CVNob3J0RGF0YTsKKwl1OAlDaGFyRGF0YVsyXTsKKwlzdHJ1Y3QKKwl7CisJCXUxNglBZHZDb2Rpbmc6MTsKKwkJdTE2CUNobFdpZHRoOjE7CisJCXUxNglNaW1vUHdyU2F2ZToyOworCQl1MTYJR3JlZW5GaWVsZDoxOworCQl1MTYJU2hvcnRHSTIwTWh6OjE7CisJCXUxNglTaG9ydEdJNDBNaHo6MTsKKwkJdTE2CVNUQkM6MTsKKwkJdTE2CUJlYW1Gb3JtOjE7CisJCXUxNglEZWxheUJBOjE7CisJCXUxNglNYXhBTVNEVVNpemU6MTsKKwkJdTE2CURzc0NDazoxOworCQl1MTYJUFNNUDoxOworCQl1MTYJUnN2ZDozOworCX1GaWVsZDsKK31IVF9DQVBBQklMSVRZLCAqUEhUX0NBUEFCSUxJVFk7CisKK3R5cGVkZWYJdW5pb24gX0hUX0NBUEFCSUxJVFlfTUFDUEFSQXsKKwl1OAlTaG9ydERhdGE7CisJdTgJQ2hhckRhdGFbMV07CisJc3RydWN0CisJeworCQl1OAlNYXhSeEFNUERVOjI7CisJCXU4CU1QRFVEZW5zaXR5OjI7CisJCXU4CVJzdmQ6NDsKKwl9RmllbGQ7Cit9SFRfQ0FQQUJJTElUWV9NQUNQQVJBLCAqUEhUX0NBUEFCSUxJVFlfTUFDUEFSQTsKKyovCisKK3R5cGVkZWYgZW51bSBfSFRfQUNUSU9OeworCUFDVF9SRUNPTU1BTkRfV0lEVEgJCT0gMCwKKwlBQ1RfTUlNT19QV1JfU0FWRSAJCT0gMSwKKwlBQ1RfUFNNUAkJCQkJPSAyLAorCUFDVF9TRVRfUENPX1BIQVNFCQk9IDMsCisJQUNUX01JTU9fQ0hMX01FQVNVUkUJPSA0LAorCUFDVF9SRUNJUFJPQ0lUWV9DT1JSRUNUCT0gNSwKKwlBQ1RfTUlNT19DU0lfTUFUUklDUwkJPSA2LAorCUFDVF9NSU1PX05PQ09NUFJfU1RFRVIJPSA3LAorCUFDVF9NSU1PX0NPTVBSX1NURUVSCQk9IDgsCisJQUNUX0FOVEVOTkFfU0VMRUNUCQk9IDksCit9IEhUX0FDVElPTiwgKlBIVF9BQ1RJT047CisKKworLyogMjAwNy8wNi8wNyBNSCBEZWZpbmUgc3ViLWNhcnJpZXIgbW9kZSBmb3IgNDBNSFouICovCit0eXBlZGVmIGVudW0gX0hUX0JhbmR3aWR0aF80ME1IWl9TdWJfQ2FycmllcnsKKwlTQ19NT0RFX0RVUExJQ0FURSA9IDAsCisJU0NfTU9ERV9MT1dFUiA9IDEsCisJU0NfTU9ERV9VUFBFUiA9IDIsCisJU0NfTU9ERV9GVUxMNDBNSFogPSAzLAorfUhUX0JXNDBfU0NfRTsKKwordHlwZWRlZglzdHJ1Y3QgX0hUX0NBUEFCSUxJVFlfRUxFeworCisJLy9IVCBjYXBhYmlsaXR5IGluZm8KKwl1OAlBZHZDb2Rpbmc6MTsKKwl1OAlDaGxXaWR0aDoxOworCXU4CU1pbW9Qd3JTYXZlOjI7CisJdTgJR3JlZW5GaWVsZDoxOworCXU4CVNob3J0R0kyME1oejoxOworCXU4CVNob3J0R0k0ME1oejoxOworCXU4CVR4U1RCQzoxOworCXU4CVJ4U1RCQzoyOworCXU4CURlbGF5QkE6MTsKKwl1OAlNYXhBTVNEVVNpemU6MTsKKwl1OAlEc3NDQ2s6MTsKKwl1OAlQU01QOjE7CisJdTgJUnN2ZDE6MTsKKwl1OAlMU2lnVHhvcFByb3RlY3Q6MTsKKworCS8vTUFDIEhUIHBhcmFtZXRlcnMgaW5mbworCXU4CU1heFJ4QU1QRFVGYWN0b3I6MjsKKwl1OAlNUERVRGVuc2l0eTozOworCXU4CVJzdmQyOjM7CisKKwkvL1N1cHBvcnRlZCBNQ1Mgc2V0CisJdTgJTUNTWzE2XTsKKworCisJLy9FeHRlbmRlZCBIVCBDYXBhYmlsaXR5IEluZm8KKwl1MTYJRXh0SFRDYXBJbmZvOworCisJLy9UWEJGIENhcGFiaWxpdGllcworCXU4CVR4QkZDYXBbNF07CisKKwkvL0FudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllcworCXU4CUFTQ2FwOworCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBIVF9DQVBBQklMSVRZX0VMRSwgKlBIVF9DQVBBQklMSVRZX0VMRTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBIVCBJbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQgaW4gYmVhY29ucworLy8gT25seSBBUCBpcyByZXF1aXJlZCB0byBpbmNsdWRlIHRoaXMgZWxlbWVudAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX0hUX0lORk9STUFUSU9OX0VMRXsKKwl1OAlDb250cm9sQ2hsOworCisJdTgJRXh0Q2hsT2Zmc2V0OjI7CisJdTgJUmVjb21tZW1kZWRUeFdpZHRoOjE7CisJdTgJUklGUzoxOworCXU4CVBTTVBBY2Nlc3NPbmx5OjE7CisJdTgJU3J2SW50R3JhbnVsYXJpdHk6MzsKKworCXU4CU9wdE1vZGU6MjsKKwl1OAlOb25HRkRldlByZXNlbnQ6MTsKKwl1OAlSZXZkMTo1OworCXU4CVJldmQyOjg7CisKKwl1OAlSc3ZkMzo2OworCXU4CUR1YWxCZWFjb246MTsKKwl1OAlEdWFsQ1RTUHJvdGVjdDoxOworCisJdTgJU2Vjb25kYXJ5QmVhY29uOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0RnVsbDoxOworCXU4CVBjb0FjdGl2ZToxOworCXU4CVBjb1BoYXNlOjE7CisJdTgJUnN2ZDQ6NDsKKworCXU4CUJhc2ljTVNDWzE2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIEhUX0lORk9STUFUSU9OX0VMRSwgKlBIVF9JTkZPUk1BVElPTl9FTEU7CisKKy8vCisvLyBNSU1PIFBvd2VyIFNhdmUgY29udHJvbCBmaWVsZC4KKy8vIFRoaXMgaXMgYXBwZWFyIGluIE1JTU8gUG93ZXIgU2F2ZSBBY3Rpb24gRnJhbWUKKy8vCit0eXBlZGVmIHN0cnVjdCBfTUlNT1BTX0NUUkx7CisJdTgJTWltb1BzRW5hYmxlOjE7CisJdTgJTWltb1BzTW9kZToxOworCXU4CVJlc2VydmVkOjY7Cit9IE1JTU9QU19DVFJMLCAqUE1JTU9QU19DVFJMOworCit0eXBlZGVmIGVudW0gX0hUX1NQRUNfVkVSeworCUhUX1NQRUNfVkVSX0lFRUUgPSAwLAorCUhUX1NQRUNfVkVSX0VXQyA9IDEsCit9SFRfU1BFQ19WRVIsICpQSFRfU1BFQ19WRVI7CisKK3R5cGVkZWYgZW51bSBfSFRfQUdHUkVfTU9ERV9FeworCUhUX0FHR19BVVRPID0gMCwKKwlIVF9BR0dfRk9SQ0VfRU5BQkxFID0gMSwKKwlIVF9BR0dfRk9SQ0VfRElTQUJMRSA9IDIsCit9SFRfQUdHUkVfTU9ERV9FLCAqUEhUX0FHR1JFX01PREVfRTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGVzIHdoZW4gY2FyZCBpcworLy8gIGNvbmZpZ3VyZWQgYXMgbm9uLUFQIFNUQSBtb2RlLiAgKipOb3RlKiogIEN1cnJlbnRfeHh4IHNob3VsZCBiZSBzZXQKKy8vCXRvIGRlZmF1bHQgdmFsdWUgaW4gSFRJbml0aWFsaXplSFRJbmZvKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9SVF9ISUdIX1RIUk9VR0hQVVR7CisJdTgJCQkJYkVuYWJsZUhUOworCXU4CQkJCWJDdXJyZW50SFRTdXBwb3J0OworCisJdTgJCQkJYlJlZ0JXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJsaXR5CisJdTgJCQkJYkN1ckJXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJpbGl0eQorCisJdTgJCQkJYlJlZ1Nob3J0R0k0ME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgNDBNaHoKKwl1OAkJCQliQ3VyU2hvcnRHSTQwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciA0ME1IegorCisJdTgJCQkJYlJlZ1Nob3J0R0kyME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgMjBNSHoKKwl1OAkJCQliQ3VyU2hvcnRHSTIwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciAyME1IegorCisJdTgJCQkJYlJlZ1N1cHBDQ0s7CQkJCS8vIFR4IENDSyByYXRlIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VyU3VwcENDSzsJCQkJLy8gVHggQ0NLIHJhdGUgY2FwYWJpbGl0eQorCisJLy8gODAyLjExbiBzcGVjIHZlcnNpb24gZm9yICJwZWVyIgorCUhUX1NQRUNfVkVSCQkJZVBlZXJIVFNwZWNWZXI7CisKKworCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJTZWxmIgorCUhUX0NBUEFCSUxJVFlfRUxFCVNlbGZIVENhcDsJCS8vIFRoaXMgaXMgSFQgY2FwIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZSBIVCBSeCBjYXBhYmlsaXRpZXMuCisJSFRfSU5GT1JNQVRJT05fRUxFCVNlbGZIVEluZm87CQkvLyBUaGlzIGlzIEhUIGluZm8gZWxlbWVudCBzZW50IHRvIHBlZXIgU1RBLCB3aGljaCBhbHNvIGluZGljYXRlIEhUIFJ4IGNhcGFiaWxpdGllcy4KKworCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJQZWVyIgorCXU4CQkJCVBlZXJIVENhcEJ1ZlszMl07CisJdTgJCQkJUGVlckhUSW5mb0J1ZlszMl07CisKKworCS8vIEEtTVNEVSByZWxhdGVkCisJdTgJCQkJYkFNU0RVX1N1cHBvcnQ7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1MTYJCQkJbkFNU0RVX01heFNpemU7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VycmVudF9BTVNEVV9TdXBwb3J0OwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCXUxNgkJCQluQ3VycmVudF9BTVNEVV9NYXhTaXplOwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCisKKwkvLyBBTVBEVSAgcmVsYXRlZCA8MjAwNi4wOC4xMCBFbWlseT4KKwl1OAkJCQliQU1QRFVFbmFibGU7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQliQ3VycmVudEFNUERVRW5hYmxlOwkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUFNUERVX0ZhY3RvcjsJCQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUN1cnJlbnRBTVBEVUZhY3RvcjsJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlNUERVX0RlbnNpdHk7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKKwl1OAkJCQlDdXJyZW50TVBEVURlbnNpdHk7CQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCisJLy8gRm9yY2VkIEEtTVBEVSBlbmFibGUKKwlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1QRFVNb2RlOworCXU4CQkJCUZvcmNlZEFNUERVRmFjdG9yOworCXU4CQkJCUZvcmNlZE1QRFVEZW5zaXR5OworCisJLy8gRm9yY2VkIEEtTVNEVSBlbmFibGUKKwlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1TRFVNb2RlOworCXUxNgkJCQlGb3JjZWRBTVNEVU1heFNpemU7CisKKwl1OAkJCQliRm9yY2VkU2hvcnRHSTsKKworCXU4CQkJCUN1cnJlbnRPcE1vZGU7CisKKwkvLyBNSU1PIFBTIHJlbGF0ZWQKKwl1OAkJCQlTZWxmTWltb1BzOworCXU4CQkJCVBlZXJNaW1vUHM7CisKKwkvLyA0ME1IeiBDaGFubmVsIE9mZnNldCBzZXR0aW5ncy4KKwlIVF9FWFRDSE5MX09GRlNFVAlDdXJTVEFFeHRDaG5sT2Zmc2V0OworCXU4CQkJCWJDdXJUeEJXNDBNSHo7CS8vIElmIHdlIHVzZSA0MCBNSHogdG8gVHgKKwl1OAkJCQlQZWVyQmFuZHdpZHRoOworCisJLy8gRm9yIEJhbmR3aWR0aCBTd2l0Y2hpbmcKKwl1OAkJCQliU3dCd0luUHJvZ3Jlc3M7CisJQ0hOTE9QCQkJCUNobmxPcDsgLy8gc29mdHdhcmUgc3dpdGNoaW5nIGNoYW5uZWwgaW4gcHJvZ3Jlc3MuIEJ5IEJydWNlLCAyMDA4LTAyLTE1LgorCXU4CQkJCVN3QndTdGVwOworCS8vc3RydWN0IHRpbWVyX2xpc3QJCVN3QndUaW1lcjsgIC8vbW92ZWQgdG8gaWVlZTgwMjExX2RldmljZS4gYXMgdGltZXJfbGlzdCBuZWVkIGluY2x1ZGUgc29tZSBoZWFkZXIgZmlsZSBoZXJlLgorCisJLy8gRm9yIFJlYWx0ZWsgcHJvcHJpZXRhcnkgQS1NUERVIGZhY3RvciBmb3IgYWdncmVnYXRpb24KKwl1OAkJCQliUmVnUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQliQ3VycmVudFJUMlJUQWdncmVnYXRpb247CisJdTgJCQkJYkN1cnJlbnRSVDJSVExvbmdTbG90VGltZTsKKwl1OAkJCQlzelJUMlJUQWdnQnVmZmVyWzEwXTsKKworCS8vIFJ4IFJlb3JkZXIgY29udHJvbAorCXU4CQkJCWJSZWdSeFJlb3JkZXJFbmFibGU7CisJdTgJCQkJYkN1clJ4UmVvcmRlckVuYWJsZTsKKwl1OAkJCQlSeFJlb3JkZXJXaW5TaXplOworCXU4CQkJCVJ4UmVvcmRlclBlbmRpbmdUaW1lOworCXUxNgkJCQlSeFJlb3JkZXJEcm9wQ291bnRlcjsKKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisJdTgJCQkJVXNiVHhBZ2dyTnVtOworI2VuZGlmCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwl1OAkJCQlVc2JSeEZ3QWdnckVuOworCXU4CQkJCVVzYlJ4RndBZ2dyUGFnZU51bTsKKwl1OAkJCQlVc2JSeEZ3QWdnclBhY2tldE51bTsKKwl1OAkJCQlVc2JSeEZ3QWdnclRpbWVvdXQ7CisjZW5kaWYKKworCS8vIEFkZCBmb3IgQnJvYWRjb20oTGlua3N5cykgSU9ULiBKb3NlcGgKKwl1OAkJCQliSXNQZWVyQmNtOworCisJLy8gRm9yIElPVCBpc3N1ZS4KKwl1OAkJCQlJT1RQZWVyOworCXUzMgkJCQlJT1RBY3Rpb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBSVF9ISUdIX1RIUk9VR0hQVVQsICpQUlRfSElHSF9USFJPVUdIUFVUOworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIFN0YSIKKy8vIHdoZW4gY2FyZCBpcyBjb25maWd1cmVkIGFzICJBUCBtb2RlIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0hUSU5GT19TVEFfRU5UUll7CisJdTgJCQliRW5hYmxlSFQ7CisKKwl1OAkJCWJTdXBwb3J0Q2NrOworCisJdTE2CQkJQU1TRFVfTWF4U2l6ZTsKKworCXU4CQkJQU1QRFVfRmFjdG9yOworCXU4CQkJTVBEVV9EZW5zaXR5OworCisJdTgJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwl1OAkJCWJCdzQwTUh6OworCisJdTgJCQlNaW1vUHM7CisKKwl1OAkJCU1jc1JhdGVTZXRbMTZdOworCisKK31SVF9IVElORk9fU1RBX0VOVFJZLCAqUFJUX0hUSU5GT19TVEFfRU5UUlk7CisKKworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBEYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgSFQgcmVsYXRlZCB2YXJpYWJsZSBmb3IgImVhY2ggQVAiCisvLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiU1RBIG1vZGUiCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfQlNTX0hUeworCisJdTgJCQkJYmRTdXBwb3J0SFQ7CisKKwkvLyBIVCByZWxhdGVkIGVsZW1lbnRzCisJdTgJCQkJCWJkSFRDYXBCdWZbMzJdOworCXUxNgkJCQkJYmRIVENhcExlbjsKKwl1OAkJCQkJYmRIVEluZm9CdWZbMzJdOworCXUxNgkJCQkJYmRIVEluZm9MZW47CisKKwlIVF9TUEVDX1ZFUgkJCQliZEhUU3BlY1ZlcjsKKwkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKKwkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7CisKKwl1OAkJCQkJYmRSVDJSVEFnZ3JlZ2F0aW9uOworCXU4CQkJCQliZFJUMlJUTG9uZ1Nsb3RUaW1lOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQlNTX0hULCAqUEJTU19IVDsKKwordHlwZWRlZiBzdHJ1Y3QgX01JTU9fUlNTSXsKKwl1MzIJRW5hYmxlQW50ZW5uYTsKKwl1MzIJQW50ZW5uYUE7CisJdTMyIAlBbnRlbm5hQjsKKwl1MzIgCUFudGVubmFDOworCXUzMiAJQW50ZW5uYUQ7CisJdTMyCUF2ZXJhZ2U7Cit9TUlNT19SU1NJLCAqUE1JTU9fUlNTSTsKKwordHlwZWRlZiBzdHJ1Y3QgX01JTU9fRVZNeworCXUzMglFVk0xOworCXUzMiAgICBFVk0yOworfU1JTU9fRVZNLCAqUE1JTU9fRVZNOworCit0eXBlZGVmIHN0cnVjdCBfRkFMU0VfQUxBUk1fU1RBVElTVElDU3sKKwl1MzIJQ250X1Bhcml0eV9GYWlsOworCXUzMiAgICBDbnRfUmF0ZV9JbGxlZ2FsOworCXUzMglDbnRfQ3JjOF9mYWlsOworCXUzMglDbnRfYWxsOworfUZBTFNFX0FMQVJNX1NUQVRJU1RJQ1MsICpQRkFMU0VfQUxBUk1fU1RBVElTVElDUzsKKworCitleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbMTZdOworZXh0ZXJuIHU4IE1DU19GSUxURVJfMVNTWzE2XTsKKworLyogMjAwNy8wNy8xMSBNSCBNb2RpZnkgdGhlIG1hY3JvLiBCZWNhdXMgU1RBIG1heSBsaW5rIHdpdGggYSBOLUFQLiBJZiB3ZSBzZXQKKyAgIFNUQSBpbiBBL0IvRyBtb2RlIGFuZCBBUCBpcyBzdGlsbCBpbiBOIG1vZGUuIFRoZSBtYWNybyB3aWxsIGJlIHdyb25nLiBXZSBoYXZlCisgICB0byBhZGQgYSBtYWNybyB0byBqdWRnZSB3aXJlbGVzcyBtb2RlLiAqLworI2RlZmluZSBQSUNLX1JBVEUoX25MZWdhY3lSYXRlLCBfbk1jc1JhdGUpCVwKKwkJKF9uTWNzUmF0ZT09MCk/KF9uTGVnYWN5UmF0ZSYweDdmKTooX25NY3NSYXRlKQorLyogMjAwNy8wNy8xMiBNSCBXZSBvbmx5IGRlZmluZSBsZWdhY3kgYW5kIEhUIHdpcmVsZXNzIG1vZGUgbm93LiAqLworI2RlZmluZQlMRUdBQ1lfV0lSRUxFU1NfTU9ERQlJRUVFX01PREVfTUFTSworCisjZGVmaW5lIENVUlJFTlRfUkFURShXaXJlbGVzc01vZGUsIExlZ2FjeVJhdGUsIEhUUmF0ZSkJXAorCQkJCQkoKFdpcmVsZXNzTW9kZSAmIChMRUdBQ1lfV0lSRUxFU1NfTU9ERSkpIT0wKT9cCisJCQkJCQkoTGVnYWN5UmF0ZSk6XAorCQkJCQkJKFBJQ0tfUkFURShMZWdhY3lSYXRlLCBIVFJhdGUpKQorCisKKworLy8gTUNTIEJ3IDQwIHsxfjcsIDEyfjE1LDMyfQorI2RlZmluZQlSQVRFX0FEUFRfMVNTX01BU0sgCQkweEZGCisjZGVmaW5lCVJBVEVfQURQVF8yU1NfTUFTSwkJMHhGMCAvL1NraXAgTUNTOH4xMSBiZWNhdXNlIG1jczcgPiBtY3M2LCA5LCAxMCwgMTEuIDIwMDcuMDEuMTYgYnkgRW1pbHkKKyNkZWZpbmUJUkFURV9BRFBUX01DUzMyX01BU0sJCTB4MDEKKworI2RlZmluZSAJSVNfMTFOX01DU19SQVRFKHJhdGUpCQkocmF0ZSYweDgwKQorCit0eXBlZGVmIGVudW0gX0hUX0FHR1JFX1NJWkV7CisJSFRfQUdHX1NJWkVfOEsgPSAwLAorCUhUX0FHR19TSVpFXzE2SyA9IDEsCisJSFRfQUdHX1NJWkVfMzJLID0gMiwKKwlIVF9BR0dfU0laRV82NEsgPSAzLAorfUhUX0FHR1JFX1NJWkVfRSwgKlBIVF9BR0dSRV9TSVpFX0U7CisKKy8qIEluZGljYXRlIGRpZmZlcmVudCBBUCB2ZW5kb3IgZm9yIElPVCBpc3N1ZSAqLwordHlwZWRlZiBlbnVtIF9IVF9JT1RfUEVFUgoreworCUhUX0lPVF9QRUVSX1VOS05PV04gPSAwLAorCUhUX0lPVF9QRUVSX1JFQUxURUsgPSAxLAorCUhUX0lPVF9QRUVSX0JST0FEQ09NID0gMiwKKwlIVF9JT1RfUEVFUl9SQUxJTksgPSAzLAorCUhUX0lPVF9QRUVSX0FUSEVST1MgPSA0LAorCUhUX0lPVF9QRUVSX0NJU0NPPSA1LAorCUhUX0lPVF9QRUVSX01BWCA9IDYKK31IVF9JT1RfUEVFUl9FLCAqUEhUSU9UX1BFRVJfRTsKKworLy8KKy8vIElPVCBBY3Rpb24gZm9yIGRpZmZlcmVudCBBUAorLy8KK3R5cGVkZWYgZW51bSBfSFRfSU9UX0FDVElPTnsKKwlIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV80SyA9IDB4MDAwMDAwMDEsCisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfOEsgPSAweDAwMDAwMDAyLAorCUhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNCA9IDB4MDAwMDAwMDQsCisJSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1ID0gMHgwMDAwMDAwOCwKKwlIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUyA9IDB4MDAwMDAwMTAsCisJSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8gPSAweDAwMDAwMDIwLAorCUhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNID0gMHgwMDAwMDA0MCwKKwlIVF9JT1RfQUNUX0NERF9GU1lOQyA9IDB4MDAwMDAwODAsCisJSFRfSU9UX0FDVF9QVVJFX05fTU9ERSA9IDB4MDAwMDAxMDAsCisJSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEYgPSAweDAwMDAwMjAwLAorfUhUX0lPVF9BQ1RJT05fRSwgKlBIVF9JT1RfQUNUSU9OX0U7CisKKyNlbmRpZiAvL19SVEw4MTlYVV9IVFRZUEVfSF8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGViMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKQEAgLTAsMCArMSwxNDYyIEBACisKKy8vQXMgdGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgcG9ydGVkIGZyb20gV2luZG93cyBkcml2ZXIsIHNvIGxlYXZlIHRoZSBuYW1lIGxpdHRsZSBjaGFuZ2VkLiBJZiBhbnkgY29uZnVzaW9uIGNhdXNlZCwgdGVsbCBtZS4gQ3JlYXRlZCBieSBXQi4gMjAwOC4wNS4wOAorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKK3U4IE1DU19GSUxURVJfQUxMWzE2XSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwordTggTUNTX0ZJTFRFUl8xU1NbMTZdID0gezB4ZmYsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCit1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N10gPQorCXsJewl7MTMsIDI2LCAzOSwgNTIsIDc4LCAxMDQsIDExNywgMTMwLCAyNiwgNTIsIDc4ICwxMDQsIDE1NiwgMjA4LCAyMzQsIDI2MCwKKwkJCTM5LCA3OCwgMTE3LCAyMzQsIDMxMiwgMzUxLCAzOTAsIDUyLCAxMDQsIDE1NiwgMjA4LCAzMTIsIDQxNiwgNDY4LCA1MjAsCisJCQkwLCA3OCwgMTA0LCAxMzAsIDExNywgMTU2LCAxOTUsIDEwNCwgMTMwLCAxMzAsIDE1NiwgMTgyLCAxODIsIDIwOCwgMTU2LCAxOTUsCisJCQkxOTUsIDIzNCwgMjczLCAyNzMsIDMxMiwgMTMwLCAxNTYsIDE4MSwgMTU2LCAxODEsIDIwOCwgMjM0LCAyMDgsIDIzNCwgMjYwLCAyNjAsCisJCQkyODYsIDE5NSwgMjM0LCAyNzMsIDIzNCwgMjczLCAzMTIsIDM1MSwgMzEyLCAzNTEsIDM5MCwgMzkwLCA0Mjl9LAkJCS8vIExvbmcgR0ksIDIwTUh6CisJCQl7MTQsIDI5LCA0MywgNTgsIDg3LCAxMTYsIDEzMCwgMTQ0LCAyOSwgNTgsIDg3LCAxMTYsIDE3MywgMjMxLCAyNjAsIDI4OSwKKwkJCTQzLCA4NywgMTMwLCAxNzMsIDI2MCwgMzQ3LCAzOTAsIDQzMywgNTgsIDExNiwgMTczLCAyMzEsIDM0NywgNDYyLCA1MjAsIDU3OCwKKwkJCTAsIDg3LCAxMTYsIDE0NCwgMTMwLCAxNzMsIDIxNywgMTE2LCAxNDQsIDE0NCwgMTczLCAyMDIsIDIwMiwgMjMxLCAxNzMsIDIxNywKKwkJCTIxNywgMjYwLCAzMDMsIDMwMywgMzQ3LCAxNDQsIDE3MywgMjAyLCAxNzMsIDIwMiwgMjMxLCAyNjAsIDIzMSwgMjYwLCAyODksIDI4OSwKKwkJCTMxOCwgMjE3LCAyNjAsIDMwMywgMjYwLCAzMDMsIDM0NywgMzkwLCAzNDcsIDM5MCwgNDMzLCA0MzMsIDQ3N30JfSwJCS8vIFNob3J0IEdJLCAyME1IegorCQl7CXsyNywgNTQsIDgxLCAxMDgsIDE2MiwgMjE2LCAyNDMsIDI3MCwgNTQsIDEwOCwgMTYyLCAyMTYsIDMyNCwgNDMyLCA0ODYsIDU0MCwKKwkJCTgxLCAxNjIsIDI0MywgMzI0LCA0ODYsIDY0OCwgNzI5LCA4MTAsIDEwOCwgMjE2LCAzMjQsIDQzMiwgNjQ4LCA4NjQsIDk3MiwgMTA4MCwKKwkJCTEyLCAxNjIsIDIxNiwgMjcwLCAyNDMsIDMyNCwgNDA1LCAyMTYsIDI3MCwgMjcwLCAzMjQsIDM3OCwgMzc4LCA0MzIsIDMyNCwgNDA1LAorCQkJNDA1LCA0ODYsIDU2NywgNTY3LCA2NDgsIDI3MCwgMzI0LCAzNzgsIDMyNCwgMzc4LCA0MzIsIDQ4NiwgNDMyLCA0ODYsIDU0MCwgNTQwLAorCQkJNTk0LCA0MDUsIDQ4NiwgNTY3LCA0ODYsIDU2NywgNjQ4LCA3MjksIDY0OCwgNzI5LCA4MTAsIDgxMCwgODkxfSwgCS8vIExvbmcgR0ksIDQwTUh6CisJCQl7MzAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMjcwLCAzMDAsIDYwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwLCA2MDAsCisJCQk5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwLCAxMjAsIDI0MCwgMzYwLCA0ODAsIDcyMCwgOTYwLCAxMDgwLCAxMjAwLAorCQkJMTMsIDE4MCwgMjQwLCAzMDAsIDI3MCwgMzYwLCA0NTAsIDI0MCwgMzAwLCAzMDAsIDM2MCwgNDIwLCA0MjAsIDQ4MCwgMzYwLCA0NTAsCisJCQk0NTAsIDU0MCwgNjMwLCA2MzAsIDcyMCwgMzAwLCAzNjAsIDQyMCwgMzYwLCA0MjAsIDQ4MCwgNTQwLCA0ODAsIDU0MCwgNjAwLCA2MDAsCisJCQk2NjAsIDQ1MCwgNTQwLCA2MzAsIDU0MCwgNjMwLCA3MjAsIDgxMCwgNzIwLCA4MTAsIDkwMCwgOTAwLCA5OTB9CX0JLy8gU2hvcnQgR0ksIDQwTUh6CisJfTsKKworc3RhdGljIHU4IFVOS05PV05fQk9SQURDT01bM10gPSB7MHgwMCwgMHgxNCwgMHhiZn07CitzdGF0aWMgdTggTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MWEsIDB4NzB9Oworc3RhdGljIHU4IExJTktTWVNXUlQzNTBfTElOS1NZU1dSVDE1MF9CUk9BRENPTVszXSA9IHsweDAwLCAweDFkLCAweDdlfTsKK3N0YXRpYyB1OCBORVRHRUFSODM0QnYyX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MWIsIDB4MmZ9Oworc3RhdGljIHU4IEJFTEtJTkY1RDgyMzNWMV9SQUxJTktbM10gPSB7MHgwMCwgMHgxNywgMHgzZn07CS8vY29zYSAwMzIwMjAwOAorc3RhdGljIHU4IEJFTEtJTkY1RDgyMzM0VjNfUkFMSU5LWzNdID0gezB4MDAsIDB4MWMsIDB4ZGZ9Oworc3RhdGljIHU4IFBDSV9SQUxJTktbM10gPSB7MHgwMCwgMHg5MCwgMHhjY307CitzdGF0aWMgdTggRURJTUFYX1JBTElOS1szXSA9IHsweDAwLCAweDBlLCAweDJlfTsKK3N0YXRpYyB1OCBBSVJMSU5LX1JBTElOS1szXSA9IHsweDAwLCAweDE4LCAweDAyfTsKKy8vc3RhdGljIHU4IERMSU5LX0FUSEVST1NbM10gPSB7MHgwMCwgMHgxYywgMHhmMH07CitzdGF0aWMgdTggQ0lTQ09fQlJPQURDT01bM10gPSB7MHgwMCwgMHgxNywgMHg5NH07CisKKy8vIDIwMDgvMDQvMDEgTUggRm9yIENpc2NvIEcgbW9kZSBSWCBUUCBXZSBuZWVkIHRvIGNoYW5nZSBGVyBkdXJhdGlvbi4gU2hvdWQgd2UgcHV0IHRoZQorLy8gY29kZSBpbiBvdGhlciBwbGFjZT8/CisvL3N0YXRpYyB1OCBXSUZJX0NJU0NPX0dfQVBbM10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBkZWZhdWx0IHNldHRpbmdzIGluIHBIVEluZm8gc3RydWN0dXJlCisgKiAgIGlucHV0OiAgUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBUaGVzZSB2YWx1ZSBuZWVkIGJlIG1vZGlmaWVkIGlmIGFueSBjaGFuZ2VzLgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwkvL2NvbnN0IHR5cGVvZiggKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKTApLT5wSFRJbmZvICkgKl9fbXB0ciA9ICZwSFRJbmZvOworCisJLy9wcmludGsoInBIVGluZm86JXAsICZwSFRpbmZvOiVwLCBtcHRyOiVwLCAgb2Zmc2V0b2Y6JXhcbiIsIHBIVEluZm8sICZwSFRJbmZvLCBfX21wdHIsIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBwSFRJbmZvKSk7CisJLy9wcmludGsoIj09PT5pZWVlOiVwLFxuIiwgaWVlZSk7CisJLy8gU2hvcnRHSSBzdXBwb3J0CisJcEhUSW5mby0+YlJlZ1Nob3J0R0kyME1Iej0gMTsKKwlwSFRJbmZvLT5iUmVnU2hvcnRHSTQwTUh6PSAxOworCisJLy8gNDBNSHogY2hhbm5lbCBzdXBwb3J0CisJcEhUSW5mby0+YlJlZ0JXNDBNSHogPSAxOworCisJLy8gQ0NLIHJhdGUgc3VwcG9ydCBpbiA0ME1IeiBjaGFubmVsCisJaWYocEhUSW5mby0+YlJlZ0JXNDBNSHopCisJCXBIVEluZm8tPmJSZWdTdXBwQ0NLID0gMTsKKwllbHNlCisJCXBIVEluZm8tPmJSZWdTdXBwQ0NLID0gdHJ1ZTsKKworCS8vIEFNU0RVIHJlbGF0ZWQKKwlwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZSA9IDc5MzVVTDsKKwlwSFRJbmZvLT5iQU1TRFVfU3VwcG9ydCA9IDA7CisKKwkvLyBBTVBEVSByZWxhdGVkCisJcEhUSW5mby0+YkFNUERVRW5hYmxlID0gMTsKKwlwSFRJbmZvLT5BTVBEVV9GYWN0b3IgPSAyOyAvLy8vIDA6IDJuMTMoOEspLCAxOjJuMTQoMTZLKSwgMjoybjE1KDMySyksIDM6Mm4xNig2NGspCisJcEhUSW5mby0+TVBEVV9EZW5zaXR5ID0gMDsvLyAwOiBObyByZXN0cmljdGlvbiwgMTogMS84dXNlYywgMjogMS80dXNlYywgMzogMS8ydXNlYywgNDogMXVzZWMsIDU6IDJ1c2VjLCA2OiA0dXNlYywgNzo4dXNlYworCisJLy8gTUlNTyBQb3dlciBTYXZlCisJcEhUSW5mby0+U2VsZk1pbW9QcyA9IDM7Ly8gMDogU3RhdGljIE1pbW8gUHMsIDE6IER5bmFtaWMgTWltbyBQcywgMzogTm8gTGltaXRhdGlvbiwgMjogUmVzZXJ2ZWQoU2V0IHRvIDMgYXV0b21hdGljYWxseS4pCisJaWYocEhUSW5mby0+U2VsZk1pbW9QcyA9PSAyKQorCQlwSFRJbmZvLT5TZWxmTWltb1BzID0gMzsKKwkvLyA4MTkwIG9ubHkuIEFzc2lnbiByYXRlIG9wZXJhdGlvbiBtb2RlIHRvIGZpcm13YXJlCisJaWVlZS0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDA7CisJaWVlZS0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMDsKKworI2lmZGVmIAlUT19ET19MSVNUCisJLy8gODE5MCBvbmx5LiBBc3NpZ24gZHVyYXRpb24gb3BlcmF0aW9uIG1vZGUgdG8gZmlybXdhcmUKKwlwTWdudEluZm8tPmJUeEVuYWJsZUZ3Q2FsY0R1ciA9IChCT09MRUFOKXBOZGlzQ29tbW9uLT5iUmVnVHhFbmFibGVGd0NhbGNEdXI7CisjZW5kaWYKKwkvLyA4MTkwIG9ubHksIFJlYWx0ZWsgcHJvcHJpZXRhcnkgYWdncmVnYXRpb24gbW9kZQorCS8vIFNldCBNUERVRGVuc2l0eT0yLCAgIDE6IFNldCBNUERVRGVuc2l0eT0yKDMyaykgIGZvciBSZWFsdGVrIEFQIGFuZCBzZXQgTVBEVURlbnNpdHk9MCg4aykgZm9yIG90aGVycworCXBIVEluZm8tPmJSZWdSVDJSVEFnZ3JlZ2F0aW9uID0gMTsvLzA6IFNldCBNUERVRGVuc2l0eT0yLCAgIDE6IFNldCBNUERVRGVuc2l0eT0yKDMyaykgIGZvciBSZWFsdGVrIEFQIGFuZCBzZXQgTVBEVURlbnNpdHk9MCg4aykgZm9yIG90aGVycworCisJLy8gRm9yIFJ4IFJlb3JkZXIgQ29udHJvbAorCXBIVEluZm8tPmJSZWdSeFJlb3JkZXJFbmFibGUgPSAxOworCXBIVEluZm8tPlJ4UmVvcmRlcldpblNpemUgPSA2NDsKKwlwSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSA9IDMwOworCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKwlwSFRJbmZvLT5Vc2JUeEFnZ3JOdW0gPSA0OworI2VuZGlmCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlwSFRJbmZvLT5Vc2JSeEZ3QWdnckVuID0gMTsKKwlwSFRJbmZvLT5Vc2JSeEZ3QWdnclBhZ2VOdW0gPSAyNDsKKwlwSFRJbmZvLT5Vc2JSeEZ3QWdnclBhY2tldE51bSA9IDg7CisJcEhUSW5mby0+VXNiUnhGd0FnZ3JUaW1lb3V0ID0gMTY7IC8vLy91c2IgcnggRlcgYWdncmVnYXRpb24gdGltZW91dCB0aHJlc2hvbGQuSXQncyBpbiB1bml0cyBvZiA2NHVzCisjZW5kaWYKKworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHByaW50IG91dCBlYWNoIGZpZWxkIG9uIEhUIGNhcGFiaWxpdHkgSUUgbWFpbmx5IGZyb20gKEJlYWNvbi9Qcm9iZVJzcC9Bc3NvY1JlcSkKKyAqICAgaW5wdXQ6ICB1OCoJQ2FwSUUgICAgICAgLy9DYXBhYmlsaXR5IElFIHRvIGJlIHByaW50ZWQgb3V0CisgKiAgIAkgICAgIHU4KiAJVGl0bGVTdHJpbmcgLy9tYWlubHkgcHJpbnQgb3V0IGNhbGxlciBmdW5jdGlvbgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTgqIENhcElFLCB1OCogVGl0bGVTdHJpbmcgKQoreworCisJc3RhdGljIHU4CUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307CS8vIEZvciAxMW4gRVdDIGRlZmluaXRpb24sIDIwMDcuMDcuMTcsIGJ5IEVtaWx5CisJUEhUX0NBUEFCSUxJVFlfRUxFIAkJcENhcEVMRTsKKworCWlmKCFtZW1jbXAoQ2FwSUUsIEVXQzExTkhUQ2FwLCBzaXplb2YoRVdDMTFOSFRDYXApKSkKKwl7CisJCS8vRVdDIElFCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJFV0MgSUUgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcENhcEVMRSA9IChQSFRfQ0FQQUJJTElUWV9FTEUpKCZDYXBJRVs0XSk7CisJfWVsc2UKKwkJcENhcEVMRSA9IChQSFRfQ0FQQUJJTElUWV9FTEUpKCZDYXBJRVswXSk7CisKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiPExvZyBIVCBDYXBhYmlsaXR5Pi4gQ2FsbGVkIGJ5ICVzXG4iLCBUaXRsZVN0cmluZyApOworCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnRlZCBDaGFubmVsIFdpZHRoID0gJXNcbiIsIChwQ2FwRUxFLT5DaGxXaWR0aCk/IjIwTUh6IjogIjIwLzQwTUh6Iik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnQgU2hvcnQgR0kgZm9yIDIwTSA9ICVzXG4iLCAocENhcEVMRS0+U2hvcnRHSTIwTWh6KT8iWUVTIjogIk5PIik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnQgU2hvcnQgR0kgZm9yIDQwTSA9ICVzXG4iLCAocENhcEVMRS0+U2hvcnRHSTQwTWh6KT8iWUVTIjogIk5PIik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnQgVFggU1RCQyA9ICVzXG4iLCAocENhcEVMRS0+VHhTVEJDKT8iWUVTIjogIk5PIik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdE1heCBBTVNEVSBTaXplID0gJXNcbiIsIChwQ2FwRUxFLT5NYXhBTVNEVVNpemUpPyIzODM5IjogIjc5MzUiKTsKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAgIlx0U3VwcG9ydCBDQ0sgaW4gMjAvNDAgbW9kZSA9ICVzXG4iLCAocENhcEVMRS0+RHNzQ0NrKT8iWUVTIjogIk5PIik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdE1heCBBTVBEVSBGYWN0b3IgPSAlZFxuIiwgcENhcEVMRS0+TWF4UnhBTVBEVUZhY3Rvcik7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdE1QRFUgRGVuc2l0eSA9ICVkXG4iLCBwQ2FwRUxFLT5NUERVRGVuc2l0eSk7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdE1DUyBSYXRlIFNldCA9IFsleF1bJXhdWyV4XVsleF1bJXhdXG4iLCBwQ2FwRUxFLT5NQ1NbMF0sXAorCQkJCXBDYXBFTEUtPk1DU1sxXSwgcENhcEVMRS0+TUNTWzJdLCBwQ2FwRUxFLT5NQ1NbM10sIHBDYXBFTEUtPk1DU1s0XSk7CisJcmV0dXJuOworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHByaW50IG91dCBlYWNoIGZpZWxkIG9uIEhUIEluZm9ybWF0aW9uIElFIG1haW5seSBmcm9tIChCZWFjb24vUHJvYmVSc3ApCisgKiAgIGlucHV0OiAgdTgqCUluZm9JRSAgICAgICAvL0NhcGFiaWxpdHkgSUUgdG8gYmUgcHJpbnRlZCBvdXQKKyAqICAgCSAgICAgdTgqIAlUaXRsZVN0cmluZyAvL21haW5seSBwcmludCBvdXQgY2FsbGVyIGZ1bmN0aW9uCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBEcml2ZXIgc2hvdWxkIG5vdCBwcmludCBvdXQgdGhpcyBtZXNzYWdlIGJ5IGRlZmF1bHQuCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSFREZWJ1Z0hUSW5mbyh1OCoJSW5mb0lFLCB1OCogVGl0bGVTdHJpbmcpCit7CisKKwlzdGF0aWMgdTgJRVdDMTFOSFRJbmZvW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzNH07CS8vIEZvciAxMW4gRVdDIGRlZmluaXRpb24sIDIwMDcuMDcuMTcsIGJ5IEVtaWx5CisJUEhUX0lORk9STUFUSU9OX0VMRQkJcEhUSW5mb0VsZTsKKworCWlmKCFtZW1jbXAoSW5mb0lFLCBFV0MxMU5IVEluZm8sIHNpemVvZihFV0MxMU5IVEluZm8pKSkKKwl7CisJCS8vIE5vdCBFV0MgSUUKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkVXQyBJRSBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlwSFRJbmZvRWxlID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKCZJbmZvSUVbNF0pOworCX1lbHNlCisJCXBIVEluZm9FbGUgPSAoUEhUX0lORk9STUFUSU9OX0VMRSkoJkluZm9JRVswXSk7CisKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI8TG9nIEhUIEluZm9ybWF0aW9uIEVsZW1lbnQ+LiBDYWxsZWQgYnkgJXNcbiIsIFRpdGxlU3RyaW5nKTsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdFByaW1hcnkgY2hhbm5lbCA9ICVkXG4iLCBwSFRJbmZvRWxlLT5Db250cm9sQ2hsKTsKKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiXHRTZW5vbmRhcnkgY2hhbm5lbCA9Iik7CisJc3dpdGNoKHBIVEluZm9FbGUtPkV4dENobE9mZnNldCkKKwl7CisJCWNhc2UgMDoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJOb3QgUHJlc2VudFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlVwcGVyIGNoYW5uZWxcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJSZXNlcnZlZC4gRW9vcm8hISFcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJMb3dlciBDaGFubmVsXG4iKTsKKwkJCWJyZWFrOworCX0KKwlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiXHRSZWNvbW1lbmRlZCBjaGFubmVsIHdpZHRoID0gJXNcbiIsIChwSFRJbmZvRWxlLT5SZWNvbW1lbWRlZFR4V2lkdGgpPyIyME1oeiI6ICI0ME1oeiIpOworCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0T3BlcmF0aW9uIG1vZGUgZm9yIHByb3RlY3Rpb24gPSAiKTsKKwlzd2l0Y2gocEhUSW5mb0VsZS0+T3B0TW9kZSkKKwl7CisJCWNhc2UgMDoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJObyBQcm90ZWN0aW9uXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiSFQgbm9uLW1lbWJlciBwcm90ZWN0aW9uIG1vZGVcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJTdWdnZXN0IHRvIG9wZW4gcHJvdGVjdGlvblxuIik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkhUIG1peGVkIG1vZGVcbiIpOworCQkJYnJlYWs7CisJfQorCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0QmFzaWMgTUNTIFJhdGUgU2V0ID0gWyV4XVsleF1bJXhdWyV4XVsleF1cbiIsIHBIVEluZm9FbGUtPkJhc2ljTVNDWzBdLFwKKwkJCQlwSFRJbmZvRWxlLT5CYXNpY01TQ1sxXSwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbMl0sIHBIVEluZm9FbGUtPkJhc2ljTVNDWzNdLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1s0XSk7CisJcmV0dXJuOworfQorCisvKgorKglSZXR1cm46ICAgICAJdHJ1ZSBpZiBzdGF0aW9uIGluIGhhbGYgbiBtb2RlIGFuZCBBUCBzdXBwb3J0cyA0MCBidworKi8KK2Jvb2wgSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOworCVBSVF9ISUdIX1RIUk9VR0hQVVQJIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJaWYocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UgKQkvLyB3aXJlbGVzcyBpcyBuIG1vZGUKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKwllbHNlIGlmKHBIVEluZm8tPmJSZWdCVzQwTUh6ID09IGZhbHNlKQkvLyBzdGF0aW9uIHN1cHBvcnRzIDQwIGJ3CisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZighaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKSAJLy8gc3RhdGlvbiBpbiBoYWxmIG4gbW9kZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYoKChQSFRfQ0FQQUJJTElUWV9FTEUpKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpLT5DaGxXaWR0aCkgLy8gYXAgc3VwcG9ydCA0MCBidworCQlyZXRWYWx1ZSA9IHRydWU7CisJZWxzZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCisJcmV0dXJuIHJldFZhbHVlOworfQorCitib29sIElzSFRIYWxmTm1vZGVTR0koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGJvb2wgaXM0ME1IeikKK3sKKwlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwlQUlRfSElHSF9USFJPVUdIUFVUCSBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCWlmKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkJLy8gd2lyZWxlc3MgaXMgbiBtb2RlCisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZighaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKSAJLy8gc3RhdGlvbiBpbiBoYWxmIG4gbW9kZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYoaXM0ME1IeikgLy8gYXAgc3VwcG9ydCA0MCBidworCXsKKwkJaWYoKChQSFRfQ0FQQUJJTElUWV9FTEUpKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpLT5TaG9ydEdJNDBNaHopIC8vIGFwIHN1cHBvcnQgNDAgYncgc2hvcnQgR0kKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJaWYoKChQSFRfQ0FQQUJJTElUWV9FTEUpKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpLT5TaG9ydEdJMjBNaHopIC8vIGFwIHN1cHBvcnQgNDAgYncgc2hvcnQgR0kKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKK3UxNiBIVEhhbGZNY3NUb0RhdGFSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAJdTgJbk1jc1JhdGUpCit7CisKKwl1OAlpczQwTUh6OworCXU4CWlzU2hvcnRHSTsKKworCWlzNDBNSHogID0gIChJc0hUSGFsZk5tb2RlNDBCYW5kd2lkdGgoaWVlZSkpPzE6MDsKKwlpc1Nob3J0R0kgPSAoSXNIVEhhbGZObW9kZVNHSShpZWVlLCBpczQwTUh6KSk/IDE6MDsKKworCXJldHVybiBNQ1NfREFUQV9SQVRFW2lzNDBNSHpdW2lzU2hvcnRHSV1bKG5NY3NSYXRlJjB4N2YpXTsKK30KKworCit1MTYgSFRNY3NUb0RhdGFSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTggbk1jc1JhdGUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCXU4CWlzNDBNSHogPSAocEhUSW5mby0+YkN1ckJXNDBNSHopPzE6MDsKKwl1OAlpc1Nob3J0R0kgPSAocEhUSW5mby0+YkN1ckJXNDBNSHopPworCQkJCQkJKChwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6KT8xOjApOgorCQkJCQkJKChwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6KT8xOjApOworCXJldHVybiBNQ1NfREFUQV9SQVRFW2lzNDBNSHpdW2lzU2hvcnRHSV1bKG5NY3NSYXRlJjB4N2YpXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGN1cnJlbnQgZGF0YXJhdGUuCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCisgKiAgIAkgICAgIHU4IAkJCW5EYXRhUmF0ZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICB0eCByYXRlCisgKiAgbm90aWNlOiAgcXVpdGUgdW5zdXJlIGFib3V0IGhvdyB0byB1c2UgdGhpcyBmdW5jdGlvbiAvL3diCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UxNiAgVHhDb3VudFRvRGF0YVJhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCBuRGF0YVJhdGUpCit7CisJLy9QUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXUxNgkJQ0NLT0ZETVJhdGVbMTJdID0gezB4MDIgLCAweDA0ICwgMHgwYiAsIDB4MTYgLCAweDBjICwgMHgxMiAsIDB4MTggLCAweDI0ICwgMHgzMCAsIDB4NDggLCAweDYwICwgMHg2Y307CisJdTgJaXM0ME1IeiA9IDA7CisJdTgJaXNTaG9ydEdJID0gMDsKKworCWlmKG5EYXRhUmF0ZSA8IDEyKQorCXsKKwkJcmV0dXJuIENDS09GRE1SYXRlW25EYXRhUmF0ZV07CisJfQorCWVsc2UKKwl7CisJCWlmIChuRGF0YVJhdGUgPj0gMHgxMCAmJiBuRGF0YVJhdGUgPD0gMHgxZikvL2lmKG5EYXRhUmF0ZSA+IDExICYmIG5EYXRhUmF0ZSA8IDI4ICkKKwkJeworCQkJaXM0ME1IeiA9IDA7CisJCQlpc1Nob3J0R0kgPSAwOworCisJCSAgICAgIC8vIG5EYXRhUmF0ZSA9IG5EYXRhUmF0ZSAtIDEyOworCQl9CisJCWVsc2UgaWYobkRhdGFSYXRlID49MHgyMCAgJiYgbkRhdGFSYXRlIDw9IDB4MmYgKSAvLygyNywgNDQpCisJCXsKKwkJCWlzNDBNSHogPSAxOworCQkJaXNTaG9ydEdJID0gMDsKKworCQkJLy9uRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSAyODsKKwkJfQorCQllbHNlIGlmKG5EYXRhUmF0ZSA+PSAweDMwICAmJiBuRGF0YVJhdGUgPD0gMHgzZiApICAvLyg0MywgNjApCisJCXsKKwkJCWlzNDBNSHogPSAwOworCQkJaXNTaG9ydEdJID0gMTsKKworCQkJLy9uRGF0YVJhdGUgPSBuRGF0YVJhdGUgLSA0NDsKKwkJfQorCQllbHNlIGlmKG5EYXRhUmF0ZSA+PSAweDQwICAmJiBuRGF0YVJhdGUgPD0gMHg0ZiApIC8vKDU5LCA3NikKKwkJeworCQkJaXM0ME1IeiA9IDE7CisJCQlpc1Nob3J0R0kgPSAxOworCisJCQkvL25EYXRhUmF0ZSA9IG5EYXRhUmF0ZSAtIDYwOworCQl9CisJCXJldHVybiBNQ1NfREFUQV9SQVRFW2lzNDBNSHpdW2lzU2hvcnRHSV1bbkRhdGFSYXRlJjB4Zl07CisJfQorfQorCisKKworYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayogbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlpZigobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzNWMV9SQUxJTkssIDMpPT0wKSB8fAorCQkgICAgIChtZW1jbXAobmV0LT5ic3NpZCwgQkVMS0lORjVEODIzMzRWM19SQUxJTkssIDMpPT0wKSB8fAorCQkgICAgIChtZW1jbXAobmV0LT5ic3NpZCwgUENJX1JBTElOSywgMyk9PTApIHx8CisJCSAgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBFRElNQVhfUkFMSU5LLCAzKT09MCkgfHwKKwkJICAgICAobWVtY21wKG5ldC0+YnNzaWQsIEFJUkxJTktfUkFMSU5LLCAzKT09MCkgfHwKKwkJICAgICAobmV0LT5yYWxpbmtfY2FwX2V4aXN0KSkKKwkJcmV0VmFsdWUgPSB0cnVlOworCWVsc2UgaWYoKG1lbWNtcChuZXQtPmJzc2lkLCBVTktOT1dOX0JPUkFEQ09NLCAzKT09MCkgfHwKKwkJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NLCAzKT09MCl8fAorCQkgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT00sIDMpPT0wKXx8CisJCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIE5FVEdFQVI4MzRCdjJfQlJPQURDT00sIDMpPT0wKSB8fAorCQkgICAgKG5ldC0+YnJvYWRjb21fY2FwX2V4aXN0KSkKKwkJICByZXRWYWx1ZSA9IHRydWU7CisJZWxzZSBpZihuZXQtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikKKwkJcmV0VmFsdWUgPSB0cnVlOworCWVsc2UKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKworCXJldHVybiByZXRWYWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHBlZXIgSU9ULgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46CisgKiAgbm90aWNlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhUSU9UUGVlckRldGVybWluZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayogbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlpZihuZXQtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1JFQUxURUs7CisJZWxzZSBpZihuZXQtPmJyb2FkY29tX2NhcF9leGlzdCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0JST0FEQ09NOworCWVsc2UgaWYoKG1lbWNtcChuZXQtPmJzc2lkLCBVTktOT1dOX0JPUkFEQ09NLCAzKT09MCkgfHwKKwkJCShtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NLCAzKT09MCl8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBMSU5LU1lTV1JUMzUwX0xJTktTWVNXUlQxNTBfQlJPQURDT00sIDMpPT0wKXx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIE5FVEdFQVI4MzRCdjJfQlJPQURDT00sIDMpPT0wKSApCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9CUk9BRENPTTsKKwllbHNlIGlmKChtZW1jbXAobmV0LT5ic3NpZCwgQkVMS0lORjVEODIzM1YxX1JBTElOSywgMyk9PTApIHx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzM0VjNfUkFMSU5LLCAzKT09MCkgfHwKKwkJCShtZW1jbXAobmV0LT5ic3NpZCwgUENJX1JBTElOSywgMyk9PTApIHx8CisJCQkobWVtY21wKG5ldC0+YnNzaWQsIEVESU1BWF9SQUxJTkssIDMpPT0wKSB8fAorCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBBSVJMSU5LX1JBTElOSywgMyk9PTApIHx8CisJCQkgbmV0LT5yYWxpbmtfY2FwX2V4aXN0KQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfUkFMSU5LOworCWVsc2UgaWYobmV0LT5hdGhlcm9zX2NhcF9leGlzdCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0FUSEVST1M7CisJZWxzZSBpZihtZW1jbXAobmV0LT5ic3NpZCwgQ0lTQ09fQlJPQURDT00sIDMpPT0wKQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQ0lTQ087CisJZWxzZQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfVU5LTk9XTjsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU9ULCAiSm9zZXBoIGRlYnVnISEgSU9UUEVFUjogJXhcbiIsIHBIVEluZm8tPklPVFBlZXIpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ2hlY2sgd2hldGhlciBkcml2ZXIgc2hvdWxkIGRlY2xhcmUgcmVjZWl2ZWQgcmF0ZSB1cCB0byBNQ1MxMyBvbmx5IHNpbmNlIHNvbWUgY2hpcHNldCBpcyBub3QgZ29vZAorICoJICAgICBhdCByZWNlaXZpbmcgTUNTMTR+MTUgZnJhbWUgZnJvbSBzb21lIEFQLgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCAqCQkJUGVlck1hY0FkZHIKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgcmV0dXJuIDEgaWYgZHJpdmVyIHNob3VsZCBkZWNsYXJlIE1DUzEzIG9ubHkob3RoZXJ3aXNlIHJldHVybiAwKQorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTgqIFBlZXJNYWNBZGRyKQoreworCXU4IHJldCA9IDA7CisJcmV0dXJuIHJldDsKKyB9CisKKworLyoqCisqIEZ1bmN0aW9uOglIVElPVEFjdElzRGlzYWJsZU1DUzE1CisqCisqIE92ZXJ2aWV3OglDaGVjayB3aGV0aGVyIGRyaXZlciBzaG91bGQgZGVjbGFyZSBjYXBhYmlsaXR5IG9mIHJlY2V2aW5nIE1DUzE1CisqCisqIElucHV0OgorKgkJCVBBREFQVEVSCQlBZGFwdGVyLAorKgorKiBPdXRwdXQ6CQlOb25lCisqIFJldHVybjogICAgIAl0cnVlIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBNQ1MxNQorKiAyMDA4LjA0LjE1CUVtaWx5CisqLworYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DUzE1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCWJvb2wgcmV0VmFsdWUgPSBmYWxzZTsKKworI2lmZGVmIFRPRE8KKwkvLyBBcHBseSBmb3IgODE5dSBvbmx5CisjaWYgKEhBTF9DT0RFX0JBU0U9PVJUTDgxOTIpCisKKyNpZiAoREVWX0JVU19UWVBFID09IFVTQl9JTlRFUkZBQ0UpCisJLy8gQWx3YXkgZGlzYWJsZSBNQ1MxNSBieSBKZXJyeSBDaGFuZydzIHJlcXVlc3QuYnkgRW1pbHksIDIwMDguMDQuMTUKKwlyZXRWYWx1ZSA9IHRydWU7CisjZWxpZiAoREVWX0JVU19UWVBFID09IFBDSV9JTlRFUkZBQ0UpCisJLy8gRW5hYmxlIE1DUzE1IGlmIHRoZSBwZWVyIGlzIENpc2NvIEFQLiBieSBFbWlseSwgMjAwOC4wNS4xMgorLy8JaWYocEJzc0Rlc2MtPmJDaXNjb0NhcEV4aXN0KQorLy8JCXJldFZhbHVlID0gZmFsc2U7CisvLwllbHNlCisJCXJldFZhbHVlID0gZmFsc2U7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisJLy8gSmVycnkgQ2hhbmcgc3VnZ2VzdCB0aGF0IDgxOTAgMXgyIGRvZXMgbm90IG5lZWQgdG8gZGlzYWJsZSBNQ1MxNQorCisJcmV0dXJuIHJldFZhbHVlOworfQorCisvKioKKyogRnVuY3Rpb246CUhUSU9UQWN0SXNEaXNhYmxlTUNTVHdvU3BhdGlhbFN0cmVhbQorKgorKiBPdmVydmlldzoJQ2hlY2sgd2hldGhlciBkcml2ZXIgc2hvdWxkIGRlY2xhcmUgY2FwYWJpbGl0eSBvZiByZWNldmluZyBBbGwgMiBzcyBwYWNrZXRzCisqCisqIElucHV0OgorKgkJCVBBREFQVEVSCQlBZGFwdGVyLAorKgorKiBPdXRwdXQ6CQlOb25lCisqIFJldHVybjogICAgIAl0cnVlIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBhbGwgdHdvIHNwYXRpYWwgc3RyZWFtIHBhY2tldAorKiAyMDA4LjA0LjIxCUVtaWx5CisqLworYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4ICpQZWVyTWFjQWRkcikKK3sKKwlib29sIHJldFZhbHVlID0gZmFsc2U7CisKKyNpZmRlZiBUT0RPCisJLy8gQXBwbHkgZm9yIDgxOXUgb25seQorI2VuZGlmCisJcmV0dXJuIHJldFZhbHVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDaGVjayB3aGV0aGVyIGRyaXZlciBzaG91bGQgZGlzYWJsZSBFRENBIHR1cmJvIG1vZGUKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCVBlZXJNYWNBZGRyCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBFRENBIHR1cmJvIG1vZGUob3RoZXJ3aXNlIHJldHVybiAwKQorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggSFRJT1RBY3RJc0Rpc2FibGVFRENBVHVyYm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlLCB1OCogUGVlck1hY0FkZHIpCit7CisJdTgJcmV0VmFsdWUgPSBmYWxzZTsJLy8gZGVmYXVsdCBlbmFibGUgRURDQSBUdXJibyBtb2RlLgorCS8vIFNldCBzcGVjaWZpYyBFRENBIHBhcmFtZXRlciBmb3IgZGlmZmVyZW50IEFQIGluIERNIGhhbmRsZXIuCisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgT0ZETSB0byBzbmVkIE1HTlQgZnJhbWUgZm9yIGJyb2FkY29tIEFQCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrICAgLy9jdXJyZW50IG5ldHdvcmsgd2UgbGl2ZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICByZXR1cm4gMSBpZiB0cnVlCisgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBIVElPVEFjdElzTWdudFVzZUNDSzZNKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKK3sKKwl1OAlyZXRWYWx1ZSA9IDA7CisKKwkvLyAyMDA4LzAxLzI1IE1IIEp1ZGVnIGlmIHdlIG5lZWQgdG8gdXNlIE9GRE0gdG8gc25lZCBNR05UIGZyYW1lIGZvciBicm9hZGNvbSBBUC4KKwkvLyAyMDA4LzAxLzI4IE1IIFdlIG11c3QgcHJldmVudCB0aGF0IHdlIHNlbGVjdCBudWxsIGJzc2lkIHRvIGxpbmsuCisKKwlpZihuZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QpCisJeworCQlyZXRWYWx1ZSA9IDE7CisJfQorCisJcmV0dXJuIHJldFZhbHVlOworfQorCit1OCBIVElPVEFjdElzQ0NERnN5bmModTgqIFBlZXJNYWNBZGRyKQoreworCXU4CXJldFZhbHVlID0gMDsKKwlpZigJKG1lbWNtcChQZWVyTWFjQWRkciwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8CisJCShtZW1jbXAoUGVlck1hY0FkZHIsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApIHx8CisJCShtZW1jbXAoUGVlck1hY0FkZHIsIExJTktTWVNXUlQzNTBfTElOS1NZU1dSVDE1MF9CUk9BRENPTSwgMykgPT0wKSkKKwl7CisJCXJldFZhbHVlID0gMTsKKwl9CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKK3ZvaWQgSFRSZXNldElPVFNldHRpbmcoCisJUFJUX0hJR0hfVEhST1VHSFBVVAkJcEhUSW5mbworKQoreworCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1VOS05PV047Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ29uc3RydWN0IENhcGFibGlsaXR5IEVsZW1lbnQgaW4gQmVhY29uLi4uIGlmIEhURW5hYmxlIGlzIHR1cm5lZCBvbgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCogCQkJcG9zSFRDYXAgLy9wb2ludGVyIHRvIHN0b3JlIENhcGFiaWxpdHkgRWxlCisgKiAgIAkgICAgIHU4KgkJCWxlbiAvL3N0b3JlIGxlbmd0aCBvZiBDRQorICogICAJICAgICB1OAkJCQlJc0VuY3J5cHQgLy93aGV0aGVyIGVuY3J5cHQsIG5lZWRlZCBmdXJ0aGVyCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBwb3NIVENhcCBjYW4ndCBiZSBudWxsIGFuZCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlLgorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zSFRDYXAsIHU4KiBsZW4sIHU4IElzRW5jcnlwdCkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVCA9IGllZWUtPnBIVEluZm87CisJUEhUX0NBUEFCSUxJVFlfRUxFIAlwQ2FwRUxFID0gTlVMTDsKKwkvL3U4IGJJc0RlY2xhcmVNQ1MxMzsKKworCWlmICgocG9zSFRDYXAgPT0gTlVMTCkgfHwgKHBIVCA9PSBOVUxMKSkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicG9zSFRDYXAgb3IgcEhUSW5mbyBjYW4ndCBiZSBudWxsIGluIEhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoKVxuIik7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHBvc0hUQ2FwLCAwLCAqbGVuKTsKKwlpZihwSFQtPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKKwl7CisJCXU4CUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307CS8vIEZvciAxMW4gRVdDIGRlZmluaXRpb24sIDIwMDcuMDcuMTcsIGJ5IEVtaWx5CisJCW1lbWNweShwb3NIVENhcCwgRVdDMTFOSFRDYXAsIHNpemVvZihFV0MxMU5IVENhcCkpOworCQlwQ2FwRUxFID0gKFBIVF9DQVBBQklMSVRZX0VMRSkmKHBvc0hUQ2FwWzRdKTsKKwl9ZWxzZQorCXsKKwkJcENhcEVMRSA9IChQSFRfQ0FQQUJJTElUWV9FTEUpcG9zSFRDYXA7CisJfQorCisKKwkvL0hUIGNhcGFiaWxpdHkgaW5mbworCXBDYXBFTEUtPkFkdkNvZGluZyAJCT0gMDsgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgbm93ISEKKwlpZihpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJeworCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IDA7CisJfQorCWVsc2UKKwl7CisJCXBDYXBFTEUtPkNobFdpZHRoID0gKHBIVC0+YlJlZ0JXNDBNSHo/MTowKTsKKwl9CisKKy8vCXBDYXBFTEUtPkNobFdpZHRoIAkJPSAocEhULT5iUmVnQlc0ME1Iej8xOjApOworCXBDYXBFTEUtPk1pbW9Qd3JTYXZlIAkJPSBwSFQtPlNlbGZNaW1vUHM7CisJcENhcEVMRS0+R3JlZW5GaWVsZAkJPSAwOyAvLyBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBub3chIQorCXBDYXBFTEUtPlNob3J0R0kyME1oegkJPSAxOyAvLyBXZSBjYW4gcmVjZWl2ZSBTaG9ydCBHSSEhCisJcENhcEVMRS0+U2hvcnRHSTQwTWh6CQk9IDE7IC8vIFdlIGNhbiByZWNlaXZlIFNob3J0IEdJISEKKwkvL0RiZ1ByaW50KCJUWCBIVCBjYXAvaW5mbyBlbGUgQlc9JWQgU0cyMD0lZCBTRzQwPSVkXG5cciIsCisJCS8vcENhcEVMRS0+Q2hsV2lkdGgsIHBDYXBFTEUtPlNob3J0R0kyME1oeiwgcENhcEVMRS0+U2hvcnRHSTQwTWh6KTsKKwlwQ2FwRUxFLT5UeFNUQkMgCQk9IDE7CisJcENhcEVMRS0+UnhTVEJDIAkJPSAwOworCXBDYXBFTEUtPkRlbGF5QkEJCT0gMDsJLy8gRG8gbm90IHN1cHBvcnQgbm93ISEKKwlwQ2FwRUxFLT5NYXhBTVNEVVNpemUJPSAoTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkU+PTc5MzUpPzE6MDsKKwlwQ2FwRUxFLT5Ec3NDQ2sgCQk9ICgocEhULT5iUmVnQlc0ME1Ieik/KHBIVC0+YlJlZ1N1cHBDQ0s/MTowKTowKTsKKwlwQ2FwRUxFLT5QU01QCQkJPSAwOyAvLyBEbyBub3Qgc3VwcG9ydCBub3chIQorCXBDYXBFTEUtPkxTaWdUeG9wUHJvdGVjdAk9IDA7IC8vIERvIG5vdCBzdXBwb3J0IG5vdyEhCisKKworCS8vTUFDIEhUIHBhcmFtZXRlcnMgaW5mbworCS8vIFRPRE86IE5lZGQgdG8gdGFrZSBjYXJlIG9mIHRoaXMgcGFydAorCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJUWCBIVCBjYXAvaW5mbyBlbGUgQlc9JWQgTWF4QU1TRFVTaXplOiVkIERzc0NDazolZFxuIiwgcENhcEVMRS0+Q2hsV2lkdGgsIHBDYXBFTEUtPk1heEFNU0RVU2l6ZSwgcENhcEVMRS0+RHNzQ0NrKTsKKworCWlmKCBJc0VuY3J5cHQpCisJeworCQlwQ2FwRUxFLT5NUERVRGVuc2l0eSAJPSA3OyAvLyA4dXMKKwkJcENhcEVMRS0+TWF4UnhBTVBEVUZhY3RvciAJPSAyOyAvLyAyIGlzIGZvciAzMiBLIGFuZCAzIGlzIDY0SworCX0KKwllbHNlCisJeworCQlwQ2FwRUxFLT5NYXhSeEFNUERVRmFjdG9yIAk9IDM7IC8vIDIgaXMgZm9yIDMyIEsgYW5kIDMgaXMgNjRLCisJCXBDYXBFTEUtPk1QRFVEZW5zaXR5IAk9IDA7IC8vIG5vIGRlbnNpdHkKKwl9CisKKwkvL1N1cHBvcnRlZCBNQ1Mgc2V0CisJbWVtY3B5KHBDYXBFTEUtPk1DUywgaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMTYpOworCWlmKHBIVC0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1KQorCQlwQ2FwRUxFLT5NQ1NbMV0gJj0gMHg3ZjsKKworCWlmKHBIVC0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE0KQorCQlwQ2FwRUxFLT5NQ1NbMV0gJj0gMHhiZjsKKworCWlmKHBIVC0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX0FMTF8yU1MpCisJCXBDYXBFTEUtPk1DU1sxXSAmPSAweDAwOworCisJLy8gMjAwOC4wNi4xMgorCS8vIEZvciBSVEw4MTlYLCBpZiBwYWlyd2lzZWtleSA9IHdlcC90a2lwLCBhcCBpcyByYWxpbmssIHdlIHN1cHBvcnQgb25seSBNQ1MwfjcuCisJaWYoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQorCXsKKwkJaW50IGk7CisJCWZvcihpID0gMTsgaTwgMTY7IGkrKykKKwkJCXBDYXBFTEUtPk1DU1tpXSA9IDA7CisJfQorCisJLy9FeHRlbmRlZCBIVCBDYXBhYmlsaXR5IEluZm8KKwltZW1zZXQoJnBDYXBFTEUtPkV4dEhUQ2FwSW5mbywgMCwgMik7CisKKworCS8vVFhCRiBDYXBhYmlsaXRpZXMKKwltZW1zZXQocENhcEVMRS0+VHhCRkNhcCwgMCwgNCk7CisKKwkvL0FudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllcworCXBDYXBFTEUtPkFTQ2FwID0gMDsKKy8vYWRkIDIgdG8gZ2l2ZSBzcGFjZSBmb3IgZWxlbWVudCBJRCBhbmQgbGVuIHdoZW4gY29uc3RydWN0IGZyYW1lcworCWlmKHBIVC0+ZVBlZXJIVFNwZWNWZXIgPT0gSFRfU1BFQ19WRVJfRVdDKQorCQkqbGVuID0gMzAgKyAyOworCWVsc2UKKwkJKmxlbiA9IDI2ICsgMjsKKworCisKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBIHwgSUVFRTgwMjExX0RMX0hULCBwb3NIVENhcCwgKmxlbiAtMik7CisKKwkvL1ByaW50IGVhY2ggZmllbGQgaW4gZGV0YWlsLiBEcml2ZXIgc2hvdWxkIG5vdCBwcmludCBvdXQgdGhpcyBtZXNzYWdlIGJ5IGRlZmF1bHQKKy8vCUhURGVidWdIVENhcGFiaWxpdHkocG9zSFRDYXAsICh1OCopIkhUQ29uc3RydWN0Q2FwYWJpbGl0eSgpIik7CisJcmV0dXJuOworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBDb25zdHJ1Y3QgIEluZm9ybWF0aW9uIEVsZW1lbnQgaW4gQmVhY29uLi4uIGlmIEhURW5hYmxlIGlzIHR1cm5lZCBvbgorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCogCQkJcG9zSFRDYXAgLy9wb2ludGVyIHRvIHN0b3JlIEluZm9ybWF0aW9uIEVsZQorICogICAJICAgICB1OCoJCQlsZW4gICAvL3N0b3JlIGxlbiBvZgorICogICAJICAgICB1OAkJCQlJc0VuY3J5cHQgLy93aGV0aGVyIGVuY3J5cHQsIG5lZWRlZCBmdXJ0aGVyCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBwb3NIVENhcCBjYW4ndCBiZSBudWxsIGFuZCBiZSBpbml0aWFsaXplZCBiZWZvcmUuIG9ubHkgQVAgYW5kIElCU1Mgc3RhIHNob3VsZCBkbyB0aGlzCisgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhUQ29uc3RydWN0SW5mb0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwb3NIVEluZm8sIHU4KiBsZW4sIHU4IElzRW5jcnlwdCkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVCA9IGllZWUtPnBIVEluZm87CisJUEhUX0lORk9STUFUSU9OX0VMRQkJcEhUSW5mb0VsZSA9IChQSFRfSU5GT1JNQVRJT05fRUxFKXBvc0hUSW5mbzsKKwlpZiAoKHBvc0hUSW5mbyA9PSBOVUxMKSB8fCAocEhUSW5mb0VsZSA9PSBOVUxMKSkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicG9zSFRJbmZvIG9yIHBIVEluZm9FbGUgY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdEluZm9FbGVtZW50KClcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KHBvc0hUSW5mbywgMCwgKmxlbik7CisJaWYgKCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikpIC8vYXAgbW9kZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCXsKKwkJcEhUSW5mb0VsZS0+Q29udHJvbENobCAJCQk9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOworCQlwSFRJbmZvRWxlLT5FeHRDaGxPZmZzZXQgCQkJPSAoKHBIVC0+YlJlZ0JXNDBNSHogPT0gZmFsc2UpP0hUX0VYVENITkxfT0ZGU0VUX05PX0VYVDoKKwkJCQkJCQkJCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsPD02KT8KKwkJCQkJCQkJCQkJCUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSOkhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKTsKKwkJcEhUSW5mb0VsZS0+UmVjb21tZW1kZWRUeFdpZHRoCT0gcEhULT5iUmVnQlc0ME1IejsKKwkJcEhUSW5mb0VsZS0+UklGUyAJCQkJCT0gMDsKKwkJcEhUSW5mb0VsZS0+UFNNUEFjY2Vzc09ubHkJCT0gMDsKKwkJcEhUSW5mb0VsZS0+U3J2SW50R3JhbnVsYXJpdHkJCT0gMDsKKwkJcEhUSW5mb0VsZS0+T3B0TW9kZQkJCQk9IHBIVC0+Q3VycmVudE9wTW9kZTsKKwkJcEhUSW5mb0VsZS0+Tm9uR0ZEZXZQcmVzZW50CQk9IDA7CisJCXBIVEluZm9FbGUtPkR1YWxCZWFjb24JCQk9IDA7CisJCXBIVEluZm9FbGUtPlNlY29uZGFyeUJlYWNvbgkJPSAwOworCQlwSFRJbmZvRWxlLT5MU2lnVHhvcFByb3RlY3RGdWxsCQk9IDA7CisJCXBIVEluZm9FbGUtPlBjb0FjdGl2ZQkJCQk9IDA7CisJCXBIVEluZm9FbGUtPlBjb1BoYXNlCQkJCT0gMDsKKworCQltZW1zZXQocEhUSW5mb0VsZS0+QmFzaWNNU0MsIDAsIDE2KTsKKworCisJCSpsZW4gPSAyMiArIDI7IC8vc2FtZSBhYm92ZQorCisJfQorCWVsc2UKKwl7CisJCS8vU1RBIHNob3VsZCBub3QgZ2VuZXJhdGUgSGlnaCBUaHJvdWdocHV0IEluZm9ybWF0aW9uIEVsZW1lbnQKKwkJKmxlbiA9IDA7CisJfQorCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEEgfCBJRUVFODAyMTFfRExfSFQsIHBvc0hUSW5mbywgKmxlbiAtIDIpOworCS8vSFREZWJ1Z0hUSW5mbyhwb3NIVEluZm8sICJIVENvbnN0cnVjdEluZm9yRWxlbWVudCIpOworCXJldHVybjsKK30KKworLyoKKyAgKiAgQWNjb3JkaW5nIHRvIGV4cGVyaW1lbnQsIFJlYWx0ZWsgQVAgdG8gU1RBIChiYXNlZCBvbiBydGw4MTkwKSBtYXkgYWNoaWV2ZSBiZXN0IHBlcmZvcm1hbmNlCisgICogIGlmIGJvdGggU1RBIGFuZCBBUCBzZXQgbGltaXRhdGlvbiBvZiBhZ2dyZWdhdGlvbiBzaXplIHRvIDMySywgdGhhdCBpcywgc2V0IEFNUERVIGRlbnNpdHkgdG8gMgorICAqICAoUmVmOiBJRUVFIDExbiBzcGVjaWZpY2F0aW9uKS4gSG93ZXZlciwgaWYgUmVhbHRlayBTVEEgYXNzb2NpYXRlcyB0byBvdGhlciBBUCwgU1RBIHNob3VsZCBzZXQKKyAgKiAgbGltaXRhdGlvbiBvZiBhZ2dyZWdhdGlvbiBzaXplIHRvIDhLLCBvdGhlcndpc2UsIHBlcmZvcm1hbmNlIG9mIHRyYWZmaWMgc3RyZWFtIGZyb20gU1RBIHRvIEFQCisgICogIHdpbGwgYmUgbXVjaCBsZXNzIHRoYW4gdGhlIHRyYWZmaWMgc3RyZWFtIGZyb20gQVAgdG8gU1RBIGlmIGJvdGggb2YgdGhlIHN0cmVhbSBydW5zIGNvbmN1cnJlbnRseQorICAqICBhdCB0aGUgc2FtZSB0aW1lLgorICAqCisgICogIEZyYW1lIEZvcm1hdAorICAqICBFbGVtZW50IElECQlMZW5ndGgJCU9VSQkJCVR5cGUxCQlSZXNlcnZlZAorICAqICAxIGJ5dGUJCQkxIGJ5dGUJCTMgYnl0ZXMJCTEgYnl0ZQkJMSBieXRlCisgICoKKyAgKiAgT1VJIAkJPSAweDAwLCAweGUwLCAweDRjLAorICAqICBUeXBlIAk9IDB4MDIKKyAgKiAgUmVzZXJ2ZWQgCT0gMHgwMAorICAqCisgICogIDIwMDcuOC4yMSBieSBFbWlseQorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENvbnN0cnVjdCAgSW5mb3JtYXRpb24gRWxlbWVudCBpbiBCZWFjb24uLi4gaW4gUlQyUlQgY29uZGl0aW9uCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCisgKiAgIAkgICAgIHU4KiAJCQlwb3NSVDJSVEFnZyAvL3BvaW50ZXIgdG8gc3RvcmUgSW5mb3JtYXRpb24gRWxlCisgKiAgIAkgICAgIHU4KgkJCWxlbiAgIC8vc3RvcmUgbGVuCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6CisgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcG9zUlQyUlRBZ2csIHU4KiBsZW4pCit7CisJaWYgKHBvc1JUMlJUQWdnID09IE5VTEwpIHsKKwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJwb3NSVDJSVEFnZyBjYW4ndCBiZSBudWxsIGluIEhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KClcbiIpOworCQlyZXR1cm47CisJfQorCW1lbXNldChwb3NSVDJSVEFnZywgMCwgKmxlbik7CisJKnBvc1JUMlJUQWdnKysgPSAweDAwOworCSpwb3NSVDJSVEFnZysrID0gMHhlMDsKKwkqcG9zUlQyUlRBZ2crKyA9IDB4NGM7CisJKnBvc1JUMlJUQWdnKysgPSAweDAyOworCSpwb3NSVDJSVEFnZysrID0gMHgwMTsKKwkqcG9zUlQyUlRBZ2cgPSAweDEwOy8vKnBvc1JUMlJUQWdnID0gMHgwMjsKKworCWlmKGllZWUtPmJTdXBwb3J0UmVtb3RlV2FrZVVwKSB7CisJCSpwb3NSVDJSVEFnZyB8PSAweDA4Oy8vUlRfSFRfQ0FQX1VTRV9XT1c7CisJfQorCisJKmxlbiA9IDYgKyAyOworCXJldHVybjsKKyNpZmRlZiBUT0RPCisjaWYgKEhBTF9DT0RFX0JBU0UgPT0gUlRMODE5MiAmJiBERVZfQlVTX1RZUEUgPT0gVVNCX0lOVEVSRkFDRSkKKwkvKgorCS8vRW1pbHkuIElmIGl0IGlzIHJlcXVpcmVkIHRvIEFzayBSZWFsdGVrIEFQIHRvIHNlbmQgQU1QRFUgZHVyaW5nIEFFUyBtb2RlLCBlbmFibGUgdGhpcworCSAgIHNlY3Rpb24gb2YgY29kZS4KKwlpZihJU19VTkRFUl8xMU5fQUVTX01PREUoQWRhcHRlcikpCisJeworCQlwb3NSVDJSVEFnZy0+T2N0ZXRbNV0gfD1SVF9IVF9DQVBfVVNFX0FNUERVOworCX1lbHNlCisJeworCQlwb3NSVDJSVEFnZy0+T2N0ZXRbNV0gJj0gMHhmYjsKKwl9CisJKi8KKworI2Vsc2UKKwkvLyBEbyBOb3RoaW5nCisjZW5kaWYKKworCXBvc1JUMlJUQWdnLT5MZW5ndGggPSA2OworI2VuZGlmCisKKworCisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBQaWNrIHRoZSByaWdodCBSYXRlIEFkYXB0aXZlIHRhYmxlIHRvIHVzZQorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogICAJICAgICB1OCogCQkJcE9wZXJhdGVNQ1MgLy9BIHBvaW50ZXIgdG8gTUNTIHJhdGUgYml0bWFwCisgKiAgcmV0dXJuOiAgYWx3YXlzIHdlIHJldHVybiB0cnVlCisgKiAgbm90aWNlOgorICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggSFRfUGlja01DU1JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwT3BlcmF0ZU1DUykKK3sKKwl1OAkJCQkJaTsKKwlpZiAocE9wZXJhdGVNQ1MgPT0gTlVMTCkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicE9wZXJhdGVNQ1MgY2FuJ3QgYmUgbnVsbCBpbiBIVF9QaWNrTUNTUmF0ZSgpXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaChpZWVlLT5tb2RlKQorCXsKKwljYXNlIElFRUVfQToKKwljYXNlIElFRUVfQjoKKwljYXNlIElFRUVfRzoKKwkJCS8vbGVnYWN5IHJhdGUgcm91dGluZSBoYW5kbGVkIGF0IHNlbGVjdGVkcmF0ZQorCisJCQkvL25vIE1DUyByYXRlCisJCQlmb3IoaT0wO2k8PTE1O2krKyl7CisJCQkJcE9wZXJhdGVNQ1NbaV0gPSAwOworCQkJfQorCQkJYnJlYWs7CisKKwljYXNlIElFRUVfTl8yNEc6CS8vYXNzdW1lIENDSyByYXRlIG9rCisJY2FzZSBJRUVFX05fNUc6CisJCQkvLyBMZWdhY3kgcGFydCB3ZSBvbmx5IHVzZSA2LCA1LjUsMiwxIGZvciBOXzI0RyBhbmQgNiBmb3IgTl81Ry4KKwkJCS8vIExlZ2FjeSBwYXJ0IHNoYWxsIGJlIGhhbmRsZWQgYXQgU2VsZWN0UmF0ZVNldCgpLgorCisJCQkvL0hUIHBhcnQKKwkJCS8vIFRPRE86IG1heSBiZSBkaWZmZXJlbnQgaWYgd2UgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mIGFudGVubmEKKwkJCXBPcGVyYXRlTUNTWzBdICY9UkFURV9BRFBUXzFTU19NQVNLOwkvL3N1cHBvcnQgTUNTIDB+NworCQkJcE9wZXJhdGVNQ1NbMV0gJj1SQVRFX0FEUFRfMlNTX01BU0s7CisJCQlwT3BlcmF0ZU1DU1szXSAmPVJBVEVfQURQVF9NQ1MzMl9NQVNLOworCQkJYnJlYWs7CisKKwkvL3Nob3VsZCBuZXZlciByZWFjaCBoZXJlCisJZGVmYXVsdDoKKworCQkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyoJRGVzY3JpcHRpb246CisqCQlUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBoaWdoZXN0IHNwZWVkIHJhdGUgaW4gaW5wdXQgTUNTIHNldC4KKyoKKyoJL3BhcmFtIAlBZGFwdGVyCQkJUGlvbnRlciB0byBBZGFwdGVyIGVudGl0eQorKgkJCXBNQ1NSYXRlU2V0CQlQb2ludGVyIHRvIE1DUyByYXRlIGJpdG1hcAorKgkJCXBNQ1NGaWx0ZXIJCVBvaW50ZXIgdG8gTUNTIHJhdGUgZmlsdGVyCisqCisqCS9yZXR1cm4JSGlnaGVzdCBNQ1MgcmF0ZSBpbmNsdWRlZCBpbiBwTUNTUmF0ZVNldCBhbmQgZmlsdGVyZWQgYnkgcE1DU0ZpbHRlci4KKyoKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0IHRoZSBoaWdoZXN0IHNwZWVkIHJhdGUgaW4gaW5wdXQgTUNTIHNldC4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKKyAqICAgCSAgICAgdTgqIAkJCXBNQ1NSYXRlU2V0IC8vUG9pbnRlciB0byBNQ1MgcmF0ZSBiaXRtYXAKKyAqICAgCSAgICAgdTgqCQkJcE1DU0ZpbHRlciAvL1BvaW50ZXIgdG8gTUNTIHJhdGUgZmlsdGVyCisgKiAgcmV0dXJuOiAgSGlnaGVzdCBNQ1MgcmF0ZSBpbmNsdWRlZCBpbiBwTUNTUmF0ZVNldCBhbmQgZmlsdGVyZWQgYnkgcE1DU0ZpbHRlcgorICogIG5vdGljZToKKyAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3U4IEhUR2V0SGlnaGVzdE1DU1JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwTUNTUmF0ZVNldCwgdTgqIHBNQ1NGaWx0ZXIpCit7CisJdTgJCWksIGo7CisJdTgJCWJpdE1hcDsKKwl1OAkJbWNzUmF0ZSA9IDA7CisJdTgJCWF2YWlsYWJsZU1jc1JhdGVbMTZdOworCWlmIChwTUNTUmF0ZVNldCA9PSBOVUxMIHx8IHBNQ1NGaWx0ZXIgPT0gTlVMTCkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicE1DU1JhdGVTZXQgb3IgcE1DU0ZpbHRlciBjYW4ndCBiZSBudWxsIGluIEhUR2V0SGlnaGVzdE1DU1JhdGUoKVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJZm9yKGk9MDsgaTwxNjsgaSsrKQorCQlhdmFpbGFibGVNY3NSYXRlW2ldID0gcE1DU1JhdGVTZXRbaV0gJiBwTUNTRmlsdGVyW2ldOworCisJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCWlmKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZihpID09IDE2KQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJaWYoYXZhaWxhYmxlTWNzUmF0ZVtpXSAhPSAwKQorCQl7CisJCQliaXRNYXAgPSBhdmFpbGFibGVNY3NSYXRlW2ldOworCQkJZm9yKGogPSAwOyBqIDwgODsgaisrKQorCQkJeworCQkJCWlmKChiaXRNYXAlMikgIT0gMCkKKwkJCQl7CisJCQkJCWlmKEhUTWNzVG9EYXRhUmF0ZShpZWVlLCAoOCppK2opKSA+IEhUTWNzVG9EYXRhUmF0ZShpZWVlLCBtY3NSYXRlKSkKKwkJCQkJCW1jc1JhdGUgPSAoOCppK2opOworCQkJCX0KKwkJCQliaXRNYXAgPSBiaXRNYXA+PjE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIChtY3NSYXRlfDB4ODApOworfQorCisKKworLyoKKyoqCisqKjEuRmlsdGVyIG91ciBvcGVyYXRpb24gcmF0ZSBzZXQgd2l0aCBBUCdzIHJhdGUgc2V0CisqKjIuc2hhbGwgcmVmZXJlbmNlIGNoYW5uZWwgYmFuZHdpZHRoLCBTVEJDLCBBbnRlbm5hIG51bWJlcgorKiozLmdlbmVyYXRlIHJhdGUgYWRhdGl2ZSB0YWJsZSBmb3IgZmlybXdhcmUKKyoqRGF2aWQgMjAwNjA5MDYKKyoqCisqKiBccEhUU3VwcG9ydGVkQ2FwOiB0aGUgY29ubmVjdGVkIFNUQSdzIHN1cHBvcnRlZCByYXRlIENhcGFiaWxpdHkgZWxlbWVudAorKi8KK3U4IEhURmlsdGVyTUNTUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwU3VwcG9ydE1DUywgdTgqIHBPcGVyYXRlTUNTKQoreworCisJdTggaT0wOworCisJLy8gZmlsdGVyIG91dCBvcGVyYXRpb25hbCByYXRlIHNldCBub3Qgc3VwcG9ydGVkIGJ5IEFQLCB0aGUgbGVudGggb2YgaXQgaXMgMTYKKwlmb3IoaT0wO2k8PTE1O2krKyl7CisJCXBPcGVyYXRlTUNTW2ldID0gaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFtpXSZwU3VwcG9ydE1DU1tpXTsKKwl9CisKKworCS8vIFRPRE86IGFkanVzdCBvdXIgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgIGFjY29yZGluZyB0byBvdXIgY2hhbm5lbCBiYW5kd2lkdGgsIFNUQkMgYW5kIEFudGVubmEgbnVtYmVyCisKKwkvLyBUT0RPOiBmaWxsIHN1Z2dlc3RlZCByYXRlIGFkYXB0aXZlIHJhdGUgaW5kZXggYW5kIGdpdmUgZmlybXdhcmUgaW5mbyB1c2luZyBUeCBjb21tYW5kIHBhY2tldAorCS8vIHdlIGFsc28gc2hhbGwgc3VnZ2VzdGVkIHRoZSBmaXJzdCBzdGFydCByYXRlIHNldCBhY2NvcmRpbmcgdG8gb3VyIHNpbmdhbCBzdHJlbmd0aAorCUhUX1BpY2tNQ1NSYXRlKGllZWUsIHBPcGVyYXRlTUNTKTsKKworCS8vIEZvciBSVEw4MTlYLCBpZiBwYWlyd2lzZWtleSA9IHdlcC90a2lwLCB3ZSBzdXBwb3J0IG9ubHkgTUNTMH43LgorCWlmKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwkJcE9wZXJhdGVNQ1NbMV0gPSAwOworCisJLy8KKwkvLyBGb3IgUlRMODE5WCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+MTUuCisJLy8gQW5kIGFsc28sIHdlIGRvIG5vdCBrbm93IGhvdyB0byB1c2UgTUNTMzIgbm93LgorCS8vCisJZm9yKGk9MjsgaTw9MTU7IGkrKykKKwkJcE9wZXJhdGVNQ1NbaV0gPSAwOworCisJcmV0dXJuIHRydWU7Cit9Cit2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgSFRfQ0hBTk5FTF9XSURUSAlCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUCU9mZnNldCk7Cit2b2lkIEhUT25Bc3NvY1JzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCVBIVF9DQVBBQklMSVRZX0VMRQkJcFBlZXJIVENhcCA9IE5VTEw7CisJUEhUX0lORk9STUFUSU9OX0VMRQkJcFBlZXJIVEluZm8gPSBOVUxMOworCXUxNgluTWF4QU1TRFVTaXplID0gMDsKKwl1OCoJcE1jc0ZpbHRlciA9IE5VTEw7CisKKwlzdGF0aWMgdTgJCQkJRVdDMTFOSFRDYXBbXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDMzfTsJCS8vIEZvciAxMW4gRVdDIGRlZmluaXRpb24sIDIwMDcuMDcuMTcsIGJ5IEVtaWx5CisJc3RhdGljIHU4CQkJCUVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQorCisJaWYoIHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiPD09PSBIVE9uQXNzb2NSc3AoKTogSFRfRElTQUJMRVxuIik7CisJCXJldHVybjsKKwl9CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT4gSFRPbkFzc29jUnNwX3dxKCk6IEhUX0VOQUJMRVxuIik7CisvLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgcEhUSW5mby0+UGVlckhUQ2FwQnVmLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9FTEUpKTsKKy8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBzaXplb2YoSFRfSU5GT1JNQVRJT05fRUxFKSk7CisKKy8vCUhURGVidWdIVENhcGFiaWxpdHkocEhUSW5mby0+UGVlckhUQ2FwQnVmLCJIVE9uQXNzb2NSc3Bfd3EiKTsKKy8vCUhURGVidWdIVEluZm8ocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwiSFRPbkFzc29jUnNwX3dxIik7CisJLy8KKwlpZighbWVtY21wKHBIVEluZm8tPlBlZXJIVENhcEJ1ZixFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCisJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmcEhUSW5mby0+UGVlckhUQ2FwQnVmWzRdKTsKKwllbHNlCisJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpOworCisJaWYoIW1lbWNtcChwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBFV0MxMU5IVEluZm8sIHNpemVvZihFV0MxMU5IVEluZm8pKSkKKwkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSkoJnBIVEluZm8tPlBlZXJIVEluZm9CdWZbNF0pOworCWVsc2UKKwkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSkocEhUSW5mby0+UGVlckhUSW5mb0J1Zik7CisKKworCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gQ29uZmlndXJhdGlvbnM6CisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQXxJRUVFODAyMTFfRExfSFQsIHBQZWVySFRDYXAsIHNpemVvZihIVF9DQVBBQklMSVRZX0VMRSkpOworLy8JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0hULCBwUGVlckhUSW5mbywgc2l6ZW9mKEhUX0lORk9STUFUSU9OX0VMRSkpOworCS8vIENvbmZpZyBTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCBzZXR0aW5nCisJLy8KKwlIVFNldENvbm5lY3RCd01vZGUoaWVlZSwgKEhUX0NIQU5ORUxfV0lEVEgpKHBQZWVySFRDYXAtPkNobFdpZHRoKSwgKEhUX0VYVENITkxfT0ZGU0VUKShwUGVlckhUSW5mby0+RXh0Q2hsT2Zmc2V0KSk7CisKKy8vCWlmKHBIVEluZm8tPmJDdXJCVzQwTUh6ID09IHRydWUpCisJCXBIVEluZm8tPmJDdXJUeEJXNDBNSHogPSAoKHBQZWVySFRJbmZvLT5SZWNvbW1lbWRlZFR4V2lkdGggPT0gMSk/dHJ1ZTpmYWxzZSk7CisKKwkvLworCS8vIFVwZGF0ZSBzaG9ydCBHSS8gbG9uZyBHSSBzZXR0aW5nCisJLy8KKwkvLyBUT0RPOgorCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHo9CisJCSgocEhUSW5mby0+YlJlZ1Nob3J0R0kyME1Ieik/KChwUGVlckhUQ2FwLT5TaG9ydEdJMjBNaHo9PTEpP3RydWU6ZmFsc2UpOmZhbHNlKTsKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6PQorCQkoKHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHopPygocFBlZXJIVENhcC0+U2hvcnRHSTQwTWh6PT0xKT90cnVlOmZhbHNlKTpmYWxzZSk7CisKKwkvLworCS8vIENvbmZpZyBUWCBTVEJDIHNldHRpbmcKKwkvLworCS8vIFRPRE86CisKKwkvLworCS8vIENvbmZpZyBEU1NTL0NDSyAgbW9kZSBpbiA0ME1IeiBtb2RlCisJLy8KKwkvLyBUT0RPOgorCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0KKwkJKChwSFRJbmZvLT5iUmVnU3VwcENDSyk/KChwUGVlckhUQ2FwLT5Ec3NDQ2s9PTEpP3RydWU6ZmFsc2UpOmZhbHNlKTsKKworCisJLy8KKwkvLyBDb25maWcgYW5kIGNvbmZpZ3VyZSBBLU1TRFUgc2V0dGluZworCS8vCisJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IHBIVEluZm8tPmJBTVNEVV9TdXBwb3J0OworCisJbk1heEFNU0RVU2l6ZSA9IChwUGVlckhUQ2FwLT5NYXhBTVNEVVNpemU9PTApPzM4Mzk6NzkzNTsKKworCWlmKHBIVEluZm8tPm5BTVNEVV9NYXhTaXplID4gbk1heEFNU0RVU2l6ZSApCisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBuTWF4QU1TRFVTaXplOworCWVsc2UKKwkJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOworCisKKwkvLworCS8vIENvbmZpZyBBLU1QRFUgc2V0dGluZworCS8vCisJcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IHBIVEluZm8tPmJBTVBEVUVuYWJsZTsKKworCS8vIDwxPiBEZWNpZGUgQU1QRFUgRmFjdG9yCisKKwkvLyBCeSBFbWlseQorCWlmKCFwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKKwl7CisJCS8vIERlY2lkZSBBTVBEVSBGYWN0b3IgYWNjb3JkaW5nIHRvIHByb3RvY29sIGhhbmRzaGFrZQorCQlpZihwSFRJbmZvLT5BTVBEVV9GYWN0b3IgPiBwUGVlckhUQ2FwLT5NYXhSeEFNUERVRmFjdG9yKQorCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKKwkJZWxzZQorCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOworCisJfWVsc2UKKwl7CisJCS8vIFNldCBNUERVIGRlbnNpdHkgdG8gMiB0byBSZWFsdGVrIEFQLCBhbmQgc2V0IGl0IHRvIDAgZm9yIG90aGVycworCQkvLyBSZXBsYWNlIE1QRFUgZmFjdG9yIGRlY2xhcmVkIGluIG9yaWdpbmFsIGFzc29jaWF0aW9uIHJlc3BvbnNlIGZyYW1lIGZvcm1hdC4gMjAwNy4wOC4yMCBieSBFbWlseQorCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikKKwkJeworCQkJaWYoIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlICE9IEtFWV9UWVBFX05BKQorCQkJCS8vIFJlYWx0ZWsgbWF5IHNldCAzMmsgaW4gc2VjdXJpdHkgbW9kZSBhbmQgNjRrIGZvciBvdGhlcnMKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwUGVlckhUQ2FwLT5NYXhSeEFNUERVRmFjdG9yOworCQkJZWxzZQorCQkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IEhUX0FHR19TSVpFXzY0SzsKKwkJfWVsc2UKKwkJeworCQkJaWYocFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvciA8IEhUX0FHR19TSVpFXzMySykKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwUGVlckhUQ2FwLT5NYXhSeEFNUERVRmFjdG9yOworCQkJZWxzZQorCQkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IEhUX0FHR19TSVpFXzMySzsKKwkJfQorCX0KKworCS8vIDwyPiBTZXQgQU1QRFUgTWluaW11bSBNUERVIFN0YXJ0IFNwYWNpbmcKKwkvLyA4MDIuMTFuIDMuMCBzZWN0aW9uIDkuN2QuMworCWlmKHBIVEluZm8tPk1QRFVfRGVuc2l0eSA+IHBQZWVySFRDYXAtPk1QRFVEZW5zaXR5KQorCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwSFRJbmZvLT5NUERVX0RlbnNpdHk7CisJZWxzZQorCQlwSFRJbmZvLT5DdXJyZW50TVBEVURlbnNpdHkgPSBwUGVlckhUQ2FwLT5NUERVRGVuc2l0eTsKKwlpZihpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAhPSBLRVlfVFlQRV9OQSApCisJCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSAJPSA3OyAvLyA4dXMKKwkvLyBGb3JjZSBUWCBBTVNEVQorCisJLy8gTGFuaHNpbjogbWFyayBmb3IgdG1wIHRvIGF2b2lkIGRlYXV0aCBieSBhcCBmcm9tICBzMworCS8vaWYobWVtY21wKHBNZ250SW5mby0+QnNzaWQsIE5FVEdFQVI4MzRCdjJfQlJPQURDT00sIDMpPT0wKQorCWlmKDApCisJCXsKKworCQkJcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IGZhbHNlOworCQkJcEhUSW5mby0+Rm9yY2VkQU1TRFVNb2RlID0gSFRfQUdHX0ZPUkNFX0VOQUJMRTsKKwkJCXBIVEluZm8tPkZvcmNlZEFNU0RVTWF4U2l6ZSA9IDc5MzU7CisKKwkJcEhUSW5mby0+SU9UQWN0aW9uIHw9ICBIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV84SzsKKwl9CisKKwkvLyBSeCBSZW9yZGVyIFNldHRpbmcKKwlwSFRJbmZvLT5iQ3VyUnhSZW9yZGVyRW5hYmxlID0gcEhUSW5mby0+YlJlZ1J4UmVvcmRlckVuYWJsZTsKKworCS8vCisJLy8gRmlsdGVyIG91dCB1bnN1cHBvcnRlZCBIVCByYXRlIGZvciB0aGlzIEFQCisJLy8gVXBkYXRlIFJBVFIgdGFibGUKKwkvLyBUaGlzIGlzIG9ubHkgZm9yIDgxOTAgLDgxOTIgb3IgbGF0ZXIgcHJvZHVjdCB3aGljaCB1c2luZyBmaXJtd2FyZSB0byBoYW5kbGUgcmF0ZSBhZGFwdGl2ZSBtZWNoYW5pc20uCisJLy8KKworCS8vIEhhbmRsZSBSYWxpbmsgQVAgYmFkIE1DUyByYXRlIHNldCBjb25kaXRpb24uIEpvc2VwaC4KKwkvLyBUaGlzIGZpeCB0aGUgYnVnIG9mIFJhbGluayBBUC4gVGhpcyBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorCWlmKHBQZWVySFRDYXAtPk1DU1swXSA9PSAwKQorCQlwUGVlckhUQ2FwLT5NQ1NbMF0gPSAweGZmOworCisJSFRGaWx0ZXJNQ1NSYXRlKGllZWUsIHBQZWVySFRDYXAtPk1DUywgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CisKKwkvLworCS8vIENvbmZpZyBNSU1PIFBvd2VyIFNhdmUgc2V0dGluZworCS8vCisJcEhUSW5mby0+UGVlck1pbW9QcyA9IHBQZWVySFRDYXAtPk1pbW9Qd3JTYXZlOworCWlmKHBIVEluZm8tPlBlZXJNaW1vUHMgPT0gTUlNT19QU19TVEFUSUMpCisJCXBNY3NGaWx0ZXIgPSBNQ1NfRklMVEVSXzFTUzsKKwllbHNlCisJCXBNY3NGaWx0ZXIgPSBNQ1NfRklMVEVSX0FMTDsKKwkvL1dCIGFkZCBmb3IgTUNTOCBidWcKKy8vCXBNY3NGaWx0ZXIgPSBNQ1NfRklMVEVSXzFTUzsKKwlpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGUgPSBIVEdldEhpZ2hlc3RNQ1NSYXRlKGllZWUsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIHBNY3NGaWx0ZXIpOworCWllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSA9IGllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZTsKKworCS8vCisJLy8gQ29uZmlnIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuCisJLy8KKwlwSFRJbmZvLT5DdXJyZW50T3BNb2RlID0gcFBlZXJIVEluZm8tPk9wdE1vZGU7CisKKworCit9CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlQ2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgaW5pdGlhbGl6ZSBIVCBpbmZvKHN0cnVjdCBQUlRfSElHSF9USFJPVUdIUFVUKQorICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuICogICgxKSBNUEluaXRpYWxpemF0aW9uIFBoYXNlICogICgyKSBSZWNlaXZpbmcgb2YgRGVhdXRoZW50aWNhdGlvbiBmcm9tIEFQCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRPRE86IFNob3VsZCB0aGlzIGZ1bmNpdG9uIGJlIGNhbGxlZCB3aGVuIHJlY2VpdmluZyBvZiBEaXNhc3NvY2lhdGlvbj8KK3ZvaWQgSFRJbml0aWFsaXplSFRJbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwkvLworCS8vIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXNldCB3aGVuIHJlY2VpdmluZyBkZWF1dGhlbnRpY2F0aW9uIHBhY2tldAorCS8vCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKKworCS8vIDQwTUh6IGNoYW5uZWwgc3VwcG9ydAorCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7CisJcEhUSW5mby0+YkN1clR4Qlc0ME1IeiA9IGZhbHNlOworCisJLy8gU2hvcnQgR0kgc3VwcG9ydAorCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHogPSBmYWxzZTsKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6ID0gZmFsc2U7CisJcEhUSW5mby0+YkZvcmNlZFNob3J0R0kgPSBmYWxzZTsKKworCS8vIENDSyByYXRlIHN1cHBvcnQKKwkvLyBUaGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgdG8gc3VwcG9ydCBDQ0sgcmF0ZSBieSBkZWZhdWx0LgorCS8vIEl0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgInBIVEluZm8tPmJSZWdTdXBwQ0NLIiBhbmQgQVAgY2FwYWJpbGl0aWVzIG9ubHkgd2hlbiBhc3NvY2lhdGUgdG8KKwkvLyAxMU4gQlNTLgorCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0gdHJ1ZTsKKworCS8vIEFNU0RVIHJlbGF0ZWQKKwlwSFRJbmZvLT5iQ3VycmVudF9BTVNEVV9TdXBwb3J0ID0gZmFsc2U7CisJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOworCisJLy8gQU1QVUQgcmVsYXRlZAorCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPk1QRFVfRGVuc2l0eTsKKwlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwSFRJbmZvLT5BTVBEVV9GYWN0b3I7CisKKworCisJLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgcmVsYXRlZCB0byAxMW4KKwltZW1zZXQoKHZvaWQqKSgmKHBIVEluZm8tPlNlbGZIVENhcCkpLCAwLCBzaXplb2YocEhUSW5mby0+U2VsZkhUQ2FwKSk7CisJbWVtc2V0KCh2b2lkKikoJihwSFRJbmZvLT5TZWxmSFRJbmZvKSksIDAsIHNpemVvZihwSFRJbmZvLT5TZWxmSFRJbmZvKSk7CisJbWVtc2V0KCh2b2lkKikoJihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKSwgMCwgc2l6ZW9mKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpOworCW1lbXNldCgodm9pZCopKCYocEhUSW5mby0+UGVlckhUSW5mb0J1ZikpLCAwLCBzaXplb2YocEhUSW5mby0+UGVlckhUSW5mb0J1ZikpOworCisJcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gZmFsc2U7CisJcEhUSW5mby0+Q2hubE9wID0gQ0hOTE9QX05PTkU7CisKKwkvLyBTZXQgZGVmYXVsdCBJRUVFIHNwZWMgZm9yIERyYWZ0IE4KKwlwSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7CisKKwkvLyBSZWFsdGVrIHByb3ByaWV0YXJ5IGFnZ3JlZ2F0aW9uIG1vZGUKKwlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKKwlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7CisJcEhUSW5mby0+SU9UUGVlciA9IDA7CisJcEhUSW5mby0+SU9UQWN0aW9uID0gMDsKKworCS8vTUNTIHJhdGUgaW5pdGlhbGl6ZWQgaGVyZQorCXsKKwkJdTgqIFJlZ0hUU3VwcFJhdGVTZXRzID0gJihpZWVlLT5SZWdIVFN1cHBSYXRlU2V0WzBdKTsKKwkJUmVnSFRTdXBwUmF0ZVNldHNbMF0gPSAweEZGOwkvL3N1cHBvcnQgTUNTIDB+NworCQlSZWdIVFN1cHBSYXRlU2V0c1sxXSA9IDB4RkY7CS8vc3VwcG9ydCBNQ1MgOH4xNQorCQlSZWdIVFN1cHBSYXRlU2V0c1s0XSA9IDB4MDE7CS8vc3VwcG9ydCBNQ1MgMzIKKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBpbml0aWFsaXplIEJzcyBIVCBzdHJ1Y3R1cmUoc3RydWN0IFBCU1NfSFQpCisgKiAgIGlucHV0OiAgUEJTU19IVCBwQnNzSFQgLy90byBiZSBpbml0aWFsaXplZAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGluaXRpYWxpemUgbmV0d29yayBzdHJ1Y3R1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBIVEluaXRpYWxpemVCc3NEZXNjKFBCU1NfSFQgcEJzc0hUKQoreworCisJcEJzc0hULT5iZFN1cHBvcnRIVCA9IGZhbHNlOworCW1lbXNldChwQnNzSFQtPmJkSFRDYXBCdWYsIDAsIHNpemVvZihwQnNzSFQtPmJkSFRDYXBCdWYpKTsKKwlwQnNzSFQtPmJkSFRDYXBMZW4gPSAwOworCW1lbXNldChwQnNzSFQtPmJkSFRJbmZvQnVmLCAwLCBzaXplb2YocEJzc0hULT5iZEhUSW5mb0J1ZikpOworCXBCc3NIVC0+YmRIVEluZm9MZW4gPSAwOworCisJcEJzc0hULT5iZEhUU3BlY1Zlcj0gSFRfU1BFQ19WRVJfSUVFRTsKKworCXBCc3NIVC0+YmRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7CisJcEJzc0hULT5iZFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBpbml0aWFsaXplIEJzcyBIVCBzdHJ1Y3R1cmUoc3RydWN0IFBCU1NfSFQpCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgCSppZWVlCisgKiAgIAkgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAJKnBOZXR3b3JrIC8vdXN1YWxseSBjdXJyZW50IG5ldHdvcmsgd2UgYXJlIGxpdmUgaW4KKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgT05MWSBiZSBjYWxsZWQgYmVmb3JlIGFzc29jaWF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSFRSZXNldFNlbGZBbmRTYXZlUGVlclNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yaykKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUCQlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKy8vCXUxNgkJCQkJCW5NYXhBTVNEVVNpemU7CisvLwlQSFRfQ0FQQUJJTElUWV9FTEUJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmOworLy8JUEhUX0lORk9STUFUSU9OX0VMRQkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWY7CisvLwl1OCoJcE1jc0ZpbHRlcjsKKwl1OAliSU9UQWN0aW9uID0gMDsKKworCS8vCisJLy8gIFNhdmUgUGVlciBTZXR0aW5nIGJlZm9yZSBBc3NvY2lhdGlvbgorCS8vCisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJLyp1bm1hcmsgYkVuYWJsZUhUIGZsYWcgaGVyZSBpcyB0aGUgc2FtZSByZWFzb24gd2h5IHVubWFya2VkIGluIGZ1bmN0aW9uIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQuIFdCIDIwMDguMDkuMTAqLworLy8JaWYoIHBIVEluZm8tPmJFbmFibGVIVCAmJiAgcE5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKQorCWlmIChwTmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpCisJeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7CisJCXBIVEluZm8tPmVQZWVySFRTcGVjVmVyID0gcE5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyOworCisJCS8vIFNhdmUgSFRDYXAgYW5kIEhUSW5mbyBpbmZvcm1hdGlvbiBFbGVtZW50CisJCWlmKHBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID4gMCAmJiAJcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPD0gc2l6ZW9mKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpCisJCQltZW1jcHkocEhUSW5mby0+UGVlckhUQ2FwQnVmLCBwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwgcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCisJCWlmKHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA+IDAgJiYgcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuIDw9IHNpemVvZihwSFRJbmZvLT5QZWVySFRJbmZvQnVmKSkKKwkJCW1lbWNweShwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBwTmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsIHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbik7CisKKwkJLy8gQ2hlY2sgd2hldGhlciBSVCB0byBSVCBhZ2dyZWdhdGlvbiBtb2RlIGlzIGVuYWJsZWQKKwkJaWYocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCisJCXsKKwkJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbiA9IHBOZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb247CisJCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gcE5ldHdvcmstPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKKwkJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUgPSBmYWxzZTsKKwkJfQorCisJCS8vIERldGVybWluZSB0aGUgSU9UIFBlZXIgVmVuZG9yLgorCQlIVElPVFBlZXJEZXRlcm1pbmUoaWVlZSk7CisKKwkJLy8gRGVjaWRlIElPVCBBY3Rpb24KKwkJLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHBhcmFtZXRlciBvZiBwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gaXMgZGVjaWRlZAorCQlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNChpZWVlLCBwTmV0d29yay0+YnNzaWQpOworCQlpZihiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNDsKKworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShpZWVlKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTU7CisKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTVHdvU3BhdGlhbFN0cmVhbShpZWVlLCBwTmV0d29yay0+YnNzaWQpOworCQlpZihiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9BTExfMlNTOworCisKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlRURDQVR1cmJvKGllZWUsIHBOZXR3b3JrLT5ic3NpZCk7CisJCWlmKGJJT1RBY3Rpb24pCisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk87CisKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNNZ250VXNlQ0NLNk0ocE5ldHdvcmspOworCQlpZihiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNOworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzQ0NERnN5bmMocE5ldHdvcmstPmJzc2lkKTsKKwkJaWYoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0NERF9GU1lOQzsKKworCisJfQorCWVsc2UKKwl7CisJCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gZmFsc2U7CisJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbiA9IGZhbHNlOworCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7CisKKwkJcEhUSW5mby0+SU9UQWN0aW9uID0gMDsKKwl9CisKK30KKwordm9pZCBIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqIHBOZXR3b3JrKQoreworCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisvLwlQSFRfQ0FQQUJJTElUWV9FTEUJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmOworCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmOworCisJaWYocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpCisJeworCQkvLworCQkvLyBDb25maWcgY3VycmVudCBvcGVyYXRpb24gbW9kZS4KKwkJLy8KKwkJaWYocE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuICE9IDApCisJCQlwSFRJbmZvLT5DdXJyZW50T3BNb2RlID0gcFBlZXJIVEluZm8tPk9wdE1vZGU7CisKKwkJLy8KKwkJLy8gPFRPRE86IENvbmZpZyBhY2NvcmRpbmcgdG8gT0JTUyBub24tSFQgU1RBIHByZXNlbnQhIT4KKwkJLy8KKwl9Cit9CisKK3ZvaWQgSFRVc2VEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworLy8JdTgJcmVnQndPcE1vZGU7CisKKwlpZihwSFRJbmZvLT5iRW5hYmxlSFQpCisJeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7CisKKwkJcEhUSW5mby0+YkN1clN1cHBDQ0sgPSBwSFRJbmZvLT5iUmVnU3VwcENDSzsKKworCQlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IHBIVEluZm8tPmJSZWdCVzQwTUh6OworCisJCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHo9IHBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHo7CisKKwkJcEhUSW5mby0+YkN1clNob3J0R0k0ME1Iej0gcEhUSW5mby0+YlJlZ1Nob3J0R0k0ME1IejsKKworCQlwSFRJbmZvLT5iQ3VycmVudF9BTVNEVV9TdXBwb3J0ID0gcEhUSW5mby0+YkFNU0RVX1N1cHBvcnQ7CisKKwkJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOworCisJCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBwSFRJbmZvLT5iQU1QRFVFbmFibGU7CisKKwkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOworCisJCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eTsKKworCQkvLyBTZXQgQldPcE1vZGUgcmVnaXN0ZXIKKworCQkvL3VwZGF0ZSBSQVRSIGluZGV4MAorCQlIVEZpbHRlck1DU1JhdGUoaWVlZSwgaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CisJLy9mdW5jdGlvbiBiZWxvdyBpcyBub3QgaW1wbGVtZW50ZWQgYXQgYWxsLiBXQgorI2lmZGVmIFRPRE8KKwkJQWRhcHRlci0+SGFsRnVuYy5Jbml0SGFsUkFUUlRhYmxlSGFuZGxlciggQWRhcHRlciwgJnBNZ250SW5mby0+ZG90MTFPcGVyYXRpb25hbFJhdGVTZXQsIHBNZ250SW5mby0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CisjZW5kaWYKKwkJaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBNQ1NfRklMVEVSX0FMTCk7CisJCWllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSA9IGllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZTsKKworCX0KKwllbHNlCisJeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCX0KKwlyZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBjaGVjayB3aGV0aGVyIEhUIGNvbnRyb2wgZmllbGQgZXhpc3RzCisgKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgCSppZWVlCisgKiAgIAkgICAgIHU4KgkJCXBGcmFtZSAvL2NvbWluZyBza2ItPmRhdGEKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgcmV0dXJuIHRydWUgaWYgSFQgY29udHJvbCBmaWVsZCBleGlzdHMoZmFsc2Ugb3RoZXJ3aXNlKQorICogIG5vdGljZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggSFRDQ2hlY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KglwRnJhbWUpCit7CisJaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpCisJeworCQlpZiggKElzUW9TRGF0YUZyYW1lKHBGcmFtZSkgJiYgRnJhbWVfT3JkZXIocEZyYW1lKSkgPT0gMSkKKwkJeworCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkhUIENPTlRST0wgRklMRUQgRVhJU1QhIVxuIik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIHNldCBiYW5kd2lkdGggbW9kZSBpbiBwcm90b2NvbCBsYXllci4KKy8vCit2b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgSFRfQ0hBTk5FTF9XSURUSAlCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUCU9mZnNldCkKK3sKKwlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworLy8JdTMyIGZsYWdzID0gMDsKKworCWlmKHBIVEluZm8tPmJSZWdCVzQwTUh6ID09IGZhbHNlKQorCQlyZXR1cm47CisKKworCisJLy8gVG8gcmVkdWNlIGR1bW15IG9wZXJhdGlvbgorLy8JaWYoKHBIVEluZm8tPmJDdXJCVzQwTUh6PT1mYWxzZSAmJiBCYW5kd2lkdGg9PUhUX0NIQU5ORUxfV0lEVEhfMjApIHx8CisvLwkgICAocEhUSW5mby0+YkN1ckJXNDBNSHo9PXRydWUgJiYgQmFuZHdpZHRoPT1IVF9DSEFOTkVMX1dJRFRIXzIwXzQwICYmIE9mZnNldD09cEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCkpCisvLwkJcmV0dXJuOworCisvLwlzcGluX2xvY2tfaXJxc2F2ZSgmKGllZWUtPmJ3X3NwaW5sb2NrKSwgZmxhZ3MpOworCWlmKHBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcykgeworLy8JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwkvL2lmIGluIGhhbGYgTiBtb2RlLCBzZXQgdG8gMjBNIGJhbmR3aWR0aCBwbGVhc2UgMDkuMDguMjAwOCBXQi4KKwlpZihCYW5kd2lkdGg9PUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgJiYgKCFpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpKQorCSB7CisJCQkvLyBIYW5kbGUgSWxsZWdhbCBleHRlbnRpb24gY2hhbm5lbCBvZmZzZXQhIQorCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDwyICYmIE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpCisJCQlPZmZzZXQgPSBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ7CisJCWlmKE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIgfHwgT2Zmc2V0PT1IVF9FWFRDSE5MX09GRlNFVF9MT1dFUikgeworCQkJcEhUSW5mby0+YkN1ckJXNDBNSHogPSB0cnVlOworCQkJcEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCA9IE9mZnNldDsKKwkJfSBlbHNlIHsKKwkJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7CisJCQlwSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0ID0gSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUOworCQl9CisJfSBlbHNlIHsKKwkJcEhUSW5mby0+YkN1ckJXNDBNSHogPSBmYWxzZTsKKwkJcEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCA9IEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVDsKKwl9CisKKwlwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MgPSB0cnVlOworCisJLy8gVE9ETzogMjAwNy43LjEzIGJ5IEVtaWx5IFdhaXQgMjAwMG1zICBpbiBvcmRlciB0byBnYXJhbnRlZSB0aGF0IHN3aXRjaGluZworCS8vICAgYmFuZHdpZHRoIGlzIGV4ZWN1dGVkIGFmdGVyIHNjYW4gaXMgZmluaXNoZWQuIEl0IGlzIGEgdGVtcG9yYWwgc29sdXRpb24KKwkvLyAgIGJlY2F1c2Ugc29mdHdhcmUgc2hvdWxkIGdhbnJhbnRlZSB0aGUgbGFzdCBvcGVyYXRpb24gb2Ygc3dpdGNoaW5nIGJhbmR3aWR0aAorCS8vICAgaXMgZXhlY3V0ZWQgcHJvcGVybGx5LgorCUhUU2V0Q29ubmVjdEJ3TW9kZUNhbGxiYWNrKGllZWUpOworCisvLwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+Yndfc3BpbmxvY2spLCBmbGFncyk7Cit9CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlQ2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICI9PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmKHBIVEluZm8tPmJDdXJCVzQwTUh6KQorCXsKKwkJaWYocEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIpCisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKzIpOworCQllbHNlIGlmKHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbC0yKTsKKwkJZWxzZQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDAsIHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQpOworCX0gZWxzZSB7CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQlpZWVlLT5TZXRCV01vZGVIYW5kbGVyKGllZWUtPmRldiwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwl9CisKKwlwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MgPSBmYWxzZTsKK30KKworRVhQT1JUX1NZTUJPTChIVFVwZGF0ZVNlbGZBbmRQZWVyU2V0dGluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfUW9zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfUW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiMWU1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9Rb3MuaApAQCAtMCwwICsxLDU4MyBAQAorI2lmbmRlZiBfX0lOQ19RT1NfVFlQRV9ICisjZGVmaW5lIF9fSU5DX1FPU19UWVBFX0gKKworLy8jaW5jbHVkZSAiRW5kaWFuRnJlZS5oIgorI2RlZmluZSBCSVQwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEJJVDEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQklUMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBCSVQzICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEJJVDQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQklUNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBCSVQ2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEJJVDcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQklUOCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCSVQ5ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEJJVDEwICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQklUMTEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBCSVQxMiAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEJJVDEzICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQklUMTQgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBCSVQxNSAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEJJVDE2ICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQklUMTcgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOCAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE5ICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQklUMjAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMSAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIyICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgQklUMjMgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNCAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEJJVDI1ICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQklUMjYgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNyAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI4ICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQklUMjkgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEJJVDMxICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZQlNQVhfV01NRUxFX0xFTkdUSAk2NAorCisvLworLy8gUW9TIG1vZGUuCisvLyBlbnVtIDAsIDEsIDIsIDQ6IHNpbmNlIHdlIGNhbiB1c2UgdGhlIE9SKHwpIG9wZXJhdGlvbi4KKy8vCisvLyBRT1NfTU9ERSBpcyByZWRlZmluZWQgZm9yIGVudW0gY2FuJ3QgYmUgKyssIHwgdW5kZXIgQysrIGNvbXBpbGVyLCAyMDA2LjA1LjE3LCBieSByY25qa28uCisvL3R5cGVkZWYJZW51bSBfUU9TX01PREV7CisvLwlRT1NfRElTQUJMRQkJPSAwLAorLy8JUU9TX1dNTQkJCT0gMSwKKy8vCVFPU19FRENBCQkJPSAyLAorLy8JUU9TX0hDQ0EJCQk9IDQsCisvL31RT1NfTU9ERSwqUFFPU19NT0RFOworLy8KK3R5cGVkZWYgdTMyIFFPU19NT0RFLCAqUFFPU19NT0RFOworI2RlZmluZSBRT1NfRElTQUJMRQkJMAorI2RlZmluZSBRT1NfV01NCQkJMQorI2RlZmluZSBRT1NfV01NU0EJCTIKKyNkZWZpbmUgUU9TX0VEQ0EJCTQKKyNkZWZpbmUgUU9TX0hDQ0EJCTgKKyNkZWZpbmUgUU9TX1dNTV9VQVBTRAkJMTYgICAvL1dNTSBQb3dlciBTYXZlLCAyMDA2LTA2LTE0IElzYWlhaAorCisjZGVmaW5lIEFDX1BBUkFNX1NJWkUJNAorI2RlZmluZSBXTU1fUEFSQU1fRUxFX0JPRFlfTEVOCTE4CisKKy8vCisvLyBRb1MgQUNLIFBvbGljeSBGaWVsZCBWYWx1ZXMKKy8vIFJlZjogV01NIHNwZWMgMi4xLjY6IFFvUyBDb250cm9sIEZpZWxkLCBwLjEwLgorLy8KK3R5cGVkZWYJZW51bSBfQUNLX1BPTElDWXsKKwllQWNrUGxjMF9BQ0sJCT0gMHgwMCwKKwllQWNrUGxjMV9Ob0FDSwkJPSAweDAxLAorfUFDS19QT0xJQ1ksKlBBQ0tfUE9MSUNZOworCisjZGVmaW5lIFdNTV9QQVJBTV9FTEVNRU5UX1NJWkUJKDgrKDQqQUNfUEFSQU1fU0laRSkpCisKKy8vCisvLyBRb1MgQ29udHJvbCBGaWVsZAorLy8gUmVmOgorLy8JMS4gV01NIHNwZWMgMi4xLjY6IFFvUyBDb250cm9sIEZpZWxkLCBwLjkuCisvLwkyLiA4MDIuMTFlL0QxMy4wIDcuMS4zLjUsIHAuMjYuCisvLwordHlwZWRlZgl1bmlvbiBfUU9TX0NUUkxfRklFTER7CisJdTgJY2hhckRhdGFbMl07CisJdTE2CXNob3J0RGF0YTsKKworCS8vIFdNTSBzcGVjCisJc3RydWN0CisJeworCQl1OAkJVVA6MzsKKwkJdTgJCXVzUnN2ZDE6MTsKKwkJdTgJCUVPU1A6MTsKKwkJdTgJCUFja1BvbGljeToyOworCQl1OAkJdXNSc3ZkMjoxOworCQl1OAkJdWNSc3ZkQnl0ZTsKKwl9V01NOworCisJLy8gODAyLjExZTogUW9TIGRhdGEgdHlwZSBmcmFtZSBzZW50IGJ5IG5vbi1BUCBRU1RBcy4KKwlzdHJ1Y3QKKwl7CisJCXU4CQlUSUQ6NDsKKwkJdTgJCWJJc1FzaXplOjE7Ly8gMDogQklUWzg6MTVdIGlzIFRYT1AgRHVyYXRpb24gUmVxdWVzdGVkLCAxOiBCSVRbODoxNV0gaXMgUXVldWUgU2l6ZS4KKwkJdTgJCUFja1BvbGljeToyOworCQl1OAkJdXNSc3ZkOjE7CisJCXU4CQlUeG9wT3JRc2l6ZTsJLy8gKEJJVDQ9MClUWE9QIER1cmF0aW9uIFJlcXVlc3RlZCBvciAoQklUND0xKVF1ZXVlIFNpemUuCisJfUJ5U3RhOworCisJLy8gODAyLjExZTogUW9TIGRhdGEsIFFvUyBOdWxsLCBhbmQgUW9TIERhdGErQ0YtQWNrIGZyYW1lcyBzZW50IGJ5IEhDLgorCXN0cnVjdAorCXsKKwkJdTgJCVRJRDo0OworCQl1OAkJRU9TUDoxOworCQl1OAkJQWNrUG9saWN5OjI7CisJCXU4CQl1c1JzdmQ6MTsKKwkJdTgJCVBTQnVmU3RhdGU7CQkvLyBRQVAgUFMgQnVmZmVyIFN0YXRlLgorCX1CeUhjX0RhdGE7CisKKwkvLyA4MDIuMTFlOiBRb1MgKCspIENGLVBvbGwgZnJhbWVzIHNlbnQgYnkgSEMuCisJc3RydWN0CisJeworCQl1OAkJVElEOjQ7CisJCXU4CQlFT1NQOjE7CisJCXU4CQlBY2tQb2xpY3k6MjsKKwkJdTgJCXVzUnN2ZDoxOworCQl1OAkJVHhvcExpbWl0OwkJLy8gVFhPUCBMaW1pdC4KKwl9QnlIY19DRlA7CisKK31RT1NfQ1RSTF9GSUVMRCwgKlBRT1NfQ1RSTF9GSUVMRDsKKworCisvLworLy8gUW9TIEluZm8gRmllbGQKKy8vIFJlZjoKKy8vCTEuIFdNTSBzcGVjIDIuMi4xOiBXTUUgSW5mb3JtYXRpb24gRWxlbWVudCwgcC4xMS4KKy8vCTIuIDgxODUgUW9TIGNvZGU6IFFPU19JTkZPIFtkZWYuIGluIFFvU19tcC5oXQorLy8KK3R5cGVkZWYJdW5pb24gX1FPU19JTkZPX0ZJRUxEeworCXU4CWNoYXJEYXRhOworCisJc3RydWN0CisJeworCQl1OAkJdWNQYXJhbWV0ZXJTZXRDb3VudDo0OworCQl1OAkJdWNSZXNlcnZlZDo0OworCX1XTU07CisKKwlzdHJ1Y3QKKwl7CisJCS8vUmVmIFdNTV9TcGVjaWZpY2F0aW9uXzEtMS5wZGYsIDIwMDYtMDYtMTMgSXNhaWFoCisJCXU4CQl1Y0FDX1ZPX1VBUFNEOjE7CisJCXU4CQl1Y0FDX1ZJX1VBUFNEOjE7CisJCXU4CQl1Y0FDX0JFX1VBUFNEOjE7CisJCXU4CQl1Y0FDX0JLX1VBUFNEOjE7CisJCXU4CQl1Y1Jlc2VydmVkMToxOworCQl1OAkJdWNNYXhTUExlbjoyOworCQl1OAkJdWNSZXNlcnZlZDI6MTsKKworCX1CeVdtbVBzU3RhOworCisJc3RydWN0CisJeworCQkvL1JlZiBXTU1fU3BlY2lmaWNhdGlvbl8xLTEucGRmLCAyMDA2LTA2LTEzIElzYWlhaAorCQl1OAkJdWNQYXJhbWV0ZXJTZXRDb3VudDo0OworCQl1OAkJdWNSZXNlcnZlZDozOworCQl1OAkJdWNBcFVhcHNkOjE7CisJfUJ5V21tUHNBcDsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjQUMzX1VBUFNEOjE7CisJCXU4CQl1Y0FDMl9VQVBTRDoxOworCQl1OAkJdWNBQzFfVUFQU0Q6MTsKKwkJdTgJCXVjQUMwX1VBUFNEOjE7CisJCXU4CQl1Y1FBY2s6MTsKKwkJdTgJCXVjTWF4U1BMZW46MjsKKwkJdTgJCXVjTW9yZURhdGFBY2s6MTsKKwl9IEJ5MTFlU3RhOworCisJc3RydWN0CisJeworCQl1OAkJdWNQYXJhbWV0ZXJTZXRDb3VudDo0OworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y1F1ZXVlUmVxOjE7CisJCXU4CQl1Y1RYT1BSZXE6MTsKKwkJdTgJCXVjUmVzZXJ2ZWQ6MTsKKwl9IEJ5MTFlQXA7CisKKwlzdHJ1Y3QKKwl7CisJCXU4CQl1Y1Jlc2VydmVkMTo0OworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y1Jlc2VydmVkMjoyOworCQl1OAkJdWNNb3JlRGF0YUFjazoxOworCX0gQnlXbW1zYVN0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjUmVzZXJ2ZWQxOjQ7CisJCXU4CQl1Y1FBY2s6MTsKKwkJdTgJCXVjUXVldWVSZXE6MTsKKwkJdTgJCXVjVFhPUFJlcToxOworCQl1OAkJdWNSZXNlcnZlZDI6MTsKKwl9IEJ5V21tc2FBcDsKKworCXN0cnVjdAorCXsKKwkJdTgJCXVjQUMzX1VBUFNEOjE7CisJCXU4CQl1Y0FDMl9VQVBTRDoxOworCQl1OAkJdWNBQzFfVUFQU0Q6MTsKKwkJdTgJCXVjQUMwX1VBUFNEOjE7CisJCXU4CQl1Y1FBY2s6MTsKKwkJdTgJCXVjTWF4U1BMZW46MjsKKwkJdTgJCXVjTW9yZURhdGFBY2s6MTsKKwl9IEJ5QWxsU3RhOworCisJc3RydWN0CisJeworCQl1OAkJdWNQYXJhbWV0ZXJTZXRDb3VudDo0OworCQl1OAkJdWNRQWNrOjE7CisJCXU4CQl1Y1F1ZXVlUmVxOjE7CisJCXU4CQl1Y1RYT1BSZXE6MTsKKwkJdTgJCXVjQXBVYXBzZDoxOworCX0gQnlBbGxBcDsKKworfVFPU19JTkZPX0ZJRUxELCAqUFFPU19JTkZPX0ZJRUxEOworCisKKy8vCisvLyBBQ0kgdG8gQUMgY29kaW5nLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgorLy8KKy8vIEFDX0NPRElORyBpcyByZWRlZmluZWQgZm9yIGVudW0gY2FuJ3QgYmUgKyssIHwgdW5kZXIgQysrIGNvbXBpbGVyLCAyMDA2LjA1LjE3LCBieSByY25qa28uCisvL3R5cGVkZWYJZW51bSBfQUNfQ09ESU5HeworLy8JQUMwX0JFCT0gMCwJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAorLy8JQUMxX0JLCT0gMSwJCS8vIEFDSTogMHgwMQkvLyBCYWNrZ3JvdW5kCisvLwlBQzJfVkkJPSAyLAkJLy8gQUNJOiAweDEwCS8vIFZpZGVvCisvLwlBQzNfVk8JPSAzLAkJLy8gQUNJOiAweDExCS8vIFZvaWNlCisvLwlBQ19NQVggPSA0LAkJLy8gTWF4OiBkZWZpbmUgdG90YWwgbnVtYmVyOyBTaG91bGQgbm90IHRvIGJlIHVzZWQgYXMgYSByZWFsIGVudW0uCisvL31BQ19DT0RJTkcsKlBBQ19DT0RJTkc7CisvLwordHlwZWRlZiB1MzIgQUNfQ09ESU5HOworI2RlZmluZSBBQzBfQkUJMAkJLy8gQUNJOiAweDAwCS8vIEJlc3QgRWZmb3J0CisjZGVmaW5lIEFDMV9CSwkxCQkvLyBBQ0k6IDB4MDEJLy8gQmFja2dyb3VuZAorI2RlZmluZSBBQzJfVkkJMgkJLy8gQUNJOiAweDEwCS8vIFZpZGVvCisjZGVmaW5lIEFDM19WTwkzCQkvLyBBQ0k6IDB4MTEJLy8gVm9pY2UKKyNkZWZpbmUgQUNfTUFYCTQJCS8vIE1heDogZGVmaW5lIHRvdGFsIG51bWJlcjsgU2hvdWxkIG5vdCB0byBiZSB1c2VkIGFzIGEgcmVhbCBlbnVtLgorCisvLworLy8gQUNJL0FJRlNOIEZpZWxkLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgorLy8KK3R5cGVkZWYJdW5pb24gX0FDSV9BSUZTTnsKKwl1OAljaGFyRGF0YTsKKworCXN0cnVjdAorCXsKKwkJdTgJQUlGU046NDsKKwkJdTgJQUNNOjE7CisJCXU4CUFDSToyOworCQl1OAlSZXNlcnZlZDoxOworCX1mOwkvLyBGaWVsZAorfUFDSV9BSUZTTiwgKlBBQ0lfQUlGU047CisKKy8vCisvLyBFQ1dtaW4vRUNXbWF4IGZpZWxkLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgorLy8KK3R5cGVkZWYJdW5pb24gX0VDV3sKKwl1OAljaGFyRGF0YTsKKwlzdHJ1Y3QKKwl7CisJCXU4CUVDV21pbjo0OworCQl1OAlFQ1dtYXg6NDsKKwl9ZjsJLy8gRmllbGQKK31FQ1csICpQRUNXOworCisvLworLy8gQUMgUGFyYW1ldGVycyBSZWNvcmQgRm9ybWF0LgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgorLy8KK3R5cGVkZWYJdW5pb24gX0FDX1BBUkFNeworCXUzMglsb25nRGF0YTsKKwl1OAljaGFyRGF0YVs0XTsKKworCXN0cnVjdAorCXsKKwkJQUNJX0FJRlNOCUFjaUFpZnNuOworCQlFQ1cJCUVjdzsKKwkJdTE2CQlUWE9QTGltaXQ7CisJfWY7CS8vIEZpZWxkCit9QUNfUEFSQU0sICpQQUNfUEFSQU07CisKKworCisvLworLy8gUW9TIGVsZW1lbnQgc3VidHlwZQorLy8KK3R5cGVkZWYJZW51bSBfUU9TX0VMRV9TVUJUWVBFeworCVFPU0VMRV9UWVBFX0lORk8JPSAweDAwLAkJLy8gMHgwMDogSW5mb3JtYXRpb24gZWxlbWVudAorCVFPU0VMRV9UWVBFX1BBUkFNCT0gMHgwMSwJCS8vIDB4MDE6IHBhcmFtZXRlciBlbGVtZW50Cit9UU9TX0VMRV9TVUJUWVBFLCpQUU9TX0VMRV9TVUJUWVBFOworCisKKy8vCisvLyBEaXJlY3Rpb24gRmllbGQgVmFsdWVzLgorLy8gUmVmOiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE4LgorLy8KK3R5cGVkZWYJZW51bSBfRElSRUNUSU9OX1ZBTFVFeworCURJUl9VUAkJCT0gMCwJCS8vIDB4MDAJLy8gVXBMaW5rCisJRElSX0RPV04JCT0gMSwJCS8vIDB4MDEJLy8gRG93bkxpbmsKKwlESVJfRElSRUNUCQk9IDIsCQkvLyAweDEwCS8vIERpcmVjdExpbmsKKwlESVJfQklfRElSCQk9IDMsCQkvLyAweDExCS8vIEJpLURpcmVjdGlvbgorfURJUkVDVElPTl9WQUxVRSwqUERJUkVDVElPTl9WQUxVRTsKKworCisvLworLy8gVFMgSW5mbyBmaWVsZCBpbiBXTU0gVFNQRUMgRWxlbWVudC4KKy8vIFJlZjoKKy8vCTEuIFdNTSBzcGVjIDIuMi4xMTogV01FIFRTUEVDIEVsZW1lbnQsIHAuMTguCisvLwkyLiA4MTg1IFFvUyBjb2RlOiBRT1NfVFNJTkZPIFtkZWYuIGluIFFvU19tcC5oXQorLy8KK3R5cGVkZWYgdW5pb24gX1FPU19UU0lORk97CisJdTgJCWNoYXJEYXRhWzNdOworCXN0cnVjdCB7CisJCXU4CQl1Y1RyYWZmaWNUeXBlOjE7CQkJLy9XTU0gaXMgcmVzZXJ2ZWQKKwkJdTgJCXVjVFNJRDo0OworCQl1OAkJdWNEaXJlY3Rpb246MjsKKwkJdTgJCXVjQWNjZXNzUG9saWN5OjI7CS8vV01NOiBiaXQ4PTAsIGJpdDc9MQorCQl1OAkJdWNBZ2dyZWdhdGlvbjoxOwkJLy9XTU0gaXMgcmVzZXJ2ZWQKKwkJdTgJCXVjUFNCOjE7CQkJCS8vV01NU0EgaXMgQVBTRAorCQl1OAkJdWNVUDozOworCQl1OAkJdWNUU0luZm9BY2tQb2xpY3k6MjsJCS8vV01NIGlzIHJlc2VydmVkCisJCXU4CQl1Y1NjaGVkdWxlOjE7CQkJLy9XTU0gaXMgcmVzZXJ2ZWQKKwkJdTgJCXVjUmVzZXJ2ZWQ6NzsKKwl9ZmllbGQ7Cit9UU9TX1RTSU5GTywgKlBRT1NfVFNJTkZPOworCisvLworLy8gV01NIFRTUEVDIEJvZHkuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4xMTogV01FIFRTUEVDIEVsZW1lbnQsIHAuMTYuCisvLwordHlwZWRlZiB1bmlvbiBfVFNQRUNfQk9EWXsKKwl1OAkJY2hhckRhdGFbNTVdOworCisJc3RydWN0CisJeworCQlRT1NfVFNJTkZPCVRTSW5mbzsJLy91OAlUU0luZm9bM107CisJCXUxNglOb21pbmFsTVNEVXNpemU7CisJCXUxNglNYXhNU0RVc2l6ZTsKKwkJdTMyCU1pblNlcnZpY2VJdHY7CisJCXUzMglNYXhTZXJ2aWNlSXR2OworCQl1MzIJSW5hY3Rpdml0eUl0djsKKwkJdTMyCVN1c3Blbkl0djsKKwkJdTMyCVNlcnZpY2VTdGFydFRpbWU7CisJCXUzMglNaW5EYXRhUmF0ZTsKKwkJdTMyCU1lYW5EYXRhUmF0ZTsKKwkJdTMyCVBlYWtEYXRhUmF0ZTsKKwkJdTMyCU1heEJ1cnN0U2l6ZTsKKwkJdTMyCURlbGF5Qm91bmQ7CisJCXUzMglNaW5QaHlSYXRlOworCQl1MTYJU3VycGx1c0JhbmR3aWR0aEFsbG93YW5jZTsKKwkJdTE2CU1lZGl1bVRpbWU7CisJfSBmOwkvLyBGaWVsZAorfVRTUEVDX0JPRFksICpQVFNQRUNfQk9EWTsKKworCisvLworLy8gV01NIFRTUEVDIEVsZW1lbnQuCisvLyBSZWY6IFdNTSBzcGVjIDIuMi4xMTogV01FIFRTUEVDIEVsZW1lbnQsIHAuMTYuCisvLwordHlwZWRlZiBzdHJ1Y3QgX1dNTV9UU1BFQ3sKKwl1OAkJSUQ7CisJdTgJCUxlbmd0aDsKKwl1OAkJT1VJWzNdOworCXU4CQlPVUlfVHlwZTsKKwl1OAkJT1VJX1N1YlR5cGU7CisJdTgJCVZlcnNpb247CisJVFNQRUNfQk9EWQlCb2R5OworfSBXTU1fVFNQRUMsICpQV01NX1RTUEVDOworCisvLworLy8gQUNNIGltcGxlbWVudGF0aW9uIG1ldGhvZC4KKy8vIEFubmllLCAyMDA1LTEyLTEzLgorLy8KK3R5cGVkZWYJZW51bSBfQUNNX01FVEhPRHsKKwllQWNtV2F5MF9Td0FuZEh3CQk9IDAsCQkvLyBCeSBTVyBhbmQgSFcuCisJZUFjbVdheTFfSFcJCQk9IDEsCQkvLyBCeSBIVy4KKwllQWNtV2F5Ml9TVwkJCT0gMiwJCS8vIEJ5IFNXLgorfUFDTV9NRVRIT0QsKlBBQ01fTUVUSE9EOworCisKK3R5cGVkZWYgc3RydWN0IF9BQ017CisvLwl1OAkJUmVnRW5hYmxlQUNNOworCXU2NAkJVXNlZFRpbWU7CisJdTY0CQlNZWRpdW1UaW1lOworCXU4CQlId0FjbUN0bDsJLy8gVFJVRTogVXNlZFRpbWUgZXhjZWVkID0+IERvIE5PVCBVU0UgdGhpcyBBQy4gSXQgd2xsIGJlIHdyaXR0ZW4gdG8gQUNNX0NPTlRST0woMHhCRiBCSVQgMC8xLzIgaW4gODE4NUIpLgorfUFDTSwgKlBBQ007CisKK3R5cGVkZWYJdTgJCUFDX1VBUFNELCAqUEFDX1VBUFNEOworCisjZGVmaW5lCUdFVF9WT19VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQwKQorI2RlZmluZQlTRVRfVk9fVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDApCisKKyNkZWZpbmUJR0VUX1ZJX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSAmIEJJVDEpCisjZGVmaW5lCVNFVF9WSV9VQVBTRChfYXBzZCkgKChfYXBzZCkgfD0gQklUMSkKKworI2RlZmluZQlHRVRfQktfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMikKKyNkZWZpbmUJU0VUX0JLX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQyKQorCisjZGVmaW5lCUdFVF9CRV9VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQzKQorI2RlZmluZQlTRVRfQkVfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDMpCisKKworLy90eXBlZGVmIHN0cnVjdCBfVENMQVNTeworLy8gVE9ETworLy99IFRDTEFTUywgKlBUQ0xBU1M7Cit0eXBlZGVmIHVuaW9uIF9RT1NfVENMQVN7CisKKwlzdHJ1Y3QgX1RZUEVfR0VORVJBTHsKKwkJdTgJCVByaW9yaXR5OworCQl1OCAJCUNsYXNzaWZpZXJUeXBlOworCQl1OCAJCU1hc2s7CisJfSBUWVBFX0dFTkVSQUw7CisKKwlzdHJ1Y3QgX1RZUEUwX0VUSHsKKwkJdTgJCVByaW9yaXR5OworCQl1OCAJCUNsYXNzaWZpZXJUeXBlOworCQl1OCAJCU1hc2s7CisJCXU4CQlTcmNBZGRyWzZdOworCQl1OAkJRHN0QWRkcls2XTsKKwkJdTE2CQlUeXBlOworCX0gVFlQRTBfRVRIOworCisJc3RydWN0IF9UWVBFMV9JUFY0eworCQl1OAkJUHJpb3JpdHk7CisJCXU4IAkJQ2xhc3NpZmllclR5cGU7CisJCXU4IAkJTWFzazsKKwkJdTggCQlWZXJzaW9uOworCQl1OAkJU3JjSVBbNF07CisJCXU4CQlEc3RJUFs0XTsKKwkJdTE2CQlTcmNQb3J0OworCQl1MTYJCURzdFBvcnQ7CisJCXU4CQlEU0NQOworCQl1OAkJUHJvdG9jb2w7CisJCXU4CQlSZXNlcnZlZDsKKwl9IFRZUEUxX0lQVjQ7CisKKwlzdHJ1Y3QgX1RZUEUxX0lQVjZ7CisJCXU4CQlQcmlvcml0eTsKKwkJdTggCQlDbGFzc2lmaWVyVHlwZTsKKwkJdTggCQlNYXNrOworCQl1OCAJCVZlcnNpb247CisJCXU4CQlTcmNJUFsxNl07CisJCXU4CQlEc3RJUFsxNl07CisJCXUxNgkJU3JjUG9ydDsKKwkJdTE2CQlEc3RQb3J0OworCQl1OAkJRmxvd0xhYmVsWzNdOworCX0gVFlQRTFfSVBWNjsKKworCXN0cnVjdCBfVFlQRTJfODAyMVF7CisJCXU4CQlQcmlvcml0eTsKKwkJdTggCQlDbGFzc2lmaWVyVHlwZTsKKwkJdTggCQlNYXNrOworCQl1MTYJCVRhZ1R5cGU7CisJfSBUWVBFMl84MDIxUTsKK30gUU9TX1RDTEFTLCAqUFFPU19UQ0xBUzsKKworLy90eXBlZGVmIHN0cnVjdCBfV01NX1RTVFJFQU17CisvLworLy8tIFRTUEVDCisvLy0gQUMgKHdoaWNoIHRvIG1hcHBpbmcpCisvL30gV01NX1RTVFJFQU0sICpQV01NX1RTVFJFQU07Cit0eXBlZGVmIHN0cnVjdCBfUU9TX1RTVFJFQU17CisJdTgJCQlBQzsKKwlXTU1fVFNQRUMJCVRTcGVjOworCVFPU19UQ0xBUwkJVENsYXNzOworfSBRT1NfVFNUUkVBTSwgKlBRT1NfVFNUUkVBTTsKKworLy90eXBlZGVmIHN0cnVjdCBfVV9BUFNEeworLy8tIFRyaWdnZXJFbmFibGUgWzRdCisvLy0gTWF4U1BMZW5ndGgKKy8vLSBIaWdoZXN0QWNCdWZmZXJlZAorLy99IFVfQVBTRCwgKlBVX0FQU0Q7CisKKy8vam9zZXBoIFRPRE86CisvLwlVQVBTRCBmdW5jdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgMiBkYXRhIHN0cnVjdHVyZQorLy8JIlFvcyBjb250cm9sIGZpZWxkIiBhbmQgIlFvcyBpbmZvIGZpZWxkIgorLy90eXBlZGVmIHN0cnVjdCBfUU9TX1VBUFNEeworLy8JdTgJCQliVHJpZ2dlckVuYWJsZVs0XTsKKy8vCXU4IAkJCU1heFNQTGVuZ3RoOworLy8JdTgJCQlIaWdoZXN0QnVmQUM7CisvL30gUU9TX1VBUFNELCAqUFFPU19BUFNEOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgODAyLjExIE1hbmFnZW1lbnQgZnJhbWUgU3RhdHVzIENvZGUgZmllbGQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordHlwZWRlZiBzdHJ1Y3QgX09DVEVUX1NUUklOR3sKKwl1OCAgICAgICAgCSpPY3RldDsKKwl1MTYgICAgICAgICAgICAgTGVuZ3RoOworfU9DVEVUX1NUUklORywgKlBPQ1RFVF9TVFJJTkc7CisvLworLy8gU1RBIFFvUyBkYXRhLgorLy8gUmVmOiBET1QxMV9RT1MgaW4gODE4NSBjb2RlLiBbZGVmLiBpbiBRb1NfbXAuaF0KKy8vCit0eXBlZGVmIHN0cnVjdCBfU1RBX1FPU3sKKwkvL0RFQ0xBUkVfUlRfT0JKRUNUKFNUQV9RT1MpOworCXU4CQkJCVdNTUlFQnVmW01BWF9XTU1FTEVfTEVOR1RIXTsKKwl1OCoJCQkJV01NSUU7CisKKwkvLyBQYXJ0IDEuIFNlbGYgUW9TIE1vZGUuCisJUU9TX01PREUJCQlRb3NDYXBhYmlsaXR5OyAvL1FvUyBDYXBhYmlsaXR5LCAyMDA2LTA2LTE0IElzYWlhaAorCVFPU19NT0RFCQkJQ3VycmVudFFvc01vZGU7CisKKwkvLyBGb3IgV01NIFBvd2VyIFNhdmUgTW9kZSA6CisJLy8gQUNzIGFyZSB0cmlnZ2VyL2RlbGl2ZXJ5IGVuYWJsZWQgb3IgbGVnYWN5IHBvd2VyIHNhdmUgZW5hYmxlZC4gMjAwNi0wNi0xMyBJc2FpYWgKKwlBQ19VQVBTRAkJCWI0YWNfVWFwc2Q7ICAvL1ZvVWFwc2QoYml0MCksIFZpVWFwc2QoYml0MSksICBCa1VhcHNkKGJpdDIpLCBCZVVhcHNkKGJpdDMpLAorCUFDX1VBUFNECQkJQ3VycjRhY1VhcHNkOworCXU4CQkJCWJJblNlcnZpY2VQZXJpb2Q7CisJdTgJCQkJTWF4U1BMZW5ndGg7CisJaW50IAkJCQlOdW1CY25CZWZvcmVUcmlnZ2VyOworCisJLy8gUGFydCAyLiBFRENBIFBhcmFtZXRlciAocGVyQUMpCisJdTggKgkJCQlwV01NSW5mb0VsZTsKKwl1OAkJCQlXTU1QYXJhbUVsZVtXTU1fUEFSQU1fRUxFTUVOVF9TSVpFXTsKKwl1OAkJCQlXTU1QRUxlbmd0aDsKKworCS8vIDxCcnVjZV9Ob3RlPgorCS8vMiBUb0RvOiByZW1vdmUgdGhlIFFvcyBJbmZvIEZpZWxkIGFuZCByZXBsYWNlIGl0IGJ5IHRoZSBhYm92ZSBXTU0gSW5mbyBlbGVtZW50LgorCS8vIEJ5IEJydWNlLCAyMDA4LTAxLTMwLgorCS8vIFBhcnQgMi4gRURDQSBQYXJhbWV0ZXIgKHBlckFDKQorCVFPU19JTkZPX0ZJRUxECQkJUW9zSW5mb0ZpZWxkX1NUQTsgCS8vIE1haW50YWluZWQgYnkgU1RBCisJUU9TX0lORk9fRklFTEQJCQlRb3NJbmZvRmllbGRfQVA7CS8vIFJldHJpZXZlZCBmcm9tIEFQCisKKwlBQ19QQVJBTQkJCUN1ckFjUGFyYW1ldGVyc1s0XTsKKworCS8vIFBhcnQgMy4gQUNNCisJQUNNCQkJCWFjbVs0XTsKKwlBQ01fTUVUSE9ECQkJQWNtTWV0aG9kOworCisJLy8gUGFydCA0LiBQZXIgVElEIChQYXJ0IDU6IFRDTEFTUyB3aWxsIGJlIGRlc2NyaWJlZCBieSBUU3RyZWFtKQorCVFPU19UU1RSRUFNCQkJVFN0cmVhbVsxNl07CisJV01NX1RTUEVDCQkJVFNwZWM7CisKKwl1MzIJCQkJUUJzc1dpcmVsZXNzTW9kZTsKKworCS8vIE5vIEFjayBTZXR0aW5nCisJdTgJCQkJYk5vQWNrOworCisJLy8gRW5hYmxlL0Rpc2FibGUgUnggaW1tZWRpYXRlIEJBIGNhcGFiaWxpdHkuCisJdTgJCQkJYkVuYWJsZVJ4SW1tQkE7CisKK31TVEFfUU9TLCAqUFNUQV9RT1M7CisKKy8vCisvLyBCU1MgUU9TIGRhdGEuCisvLyBSZWY6IEJzc0RzY3IgaW4gODE4NSBjb2RlLiBbZGVmLiBpbiBCc3NEc2NyLmhdCisvLwordHlwZWRlZiBzdHJ1Y3QgX0JTU19RT1N7CisJUU9TX01PREUJCWJkUW9TTW9kZTsKKworCXU4CQkJYmRXTU1JRUJ1ZltNQVhfV01NRUxFX0xFTkdUSF07CisJdTgqCQliZFdNTUlFOworCisJUU9TX0VMRV9TVUJUWVBFCQlFbGVTdWJUeXBlOworCisJdTggKgkJCXBXTU1JbmZvRWxlOworCXU4ICoJCQlwV01NUGFyYW1FbGU7CisKKwlRT1NfSU5GT19GSUVMRAkJUW9zSW5mb0ZpZWxkOworCUFDX1BBUkFNCQlBY1BhcmFtZXRlcls0XTsKK31CU1NfUU9TLCAqUEJTU19RT1M7CisKKworLy8KKy8vIFJlZjogc1FvU0N0bExuZyBhbmQgUW9TQ3RsIGRlZmluaXRpb24gaW4gODE4NSBRb1MgY29kZS4KKy8vI2RlZmluZSBRb1NDdGwgICAoKAkoQWRhcHRlci0+YlJlZ1FvUykgJiYgKEFkYXB0ZXItPmRvdDExUW9TLlFvU01vZGUgJihRT1NfRURDQXxRT1NfSENDQSkpCSAgKSAgP3NRb1NDdGxMbmc6MCkKKy8vCisjZGVmaW5lIHNRb1NDdGxMbmcJCQkyCisjZGVmaW5lCVFPU19DVFJMX0xFTihfUW9zTW9kZSkJCSgoX1Fvc01vZGUgPiBRT1NfRElTQUJMRSk/IHNRb1NDdGxMbmcgOiAwKQorCisKKy8vQWRkZWQgYnkgam9zZXBoCisvL1VQIE1hcHBpbmcgdG8gQUMsIHVzaW5nIGluIE1nbnRRdWVyeV9TZXF1ZW5jZU51bWJlcigpIGFuZCBtYXliZSBmb3IgRFNDUAorLy8jZGVmaW5lIFVQMkFDKHVwKQkJCSgodXA8Myk/KCh1cD09MCk/MTowKToodXA+PjEpKQorI2RlZmluZSBJc0FDVmFsaWQoYWMpCQkJKChhYzw9NyApP3RydWU6ZmFsc2UgKQorCisjZW5kaWYgLy8gI2lmbmRlZiBfX0lOQ19RT1NfVFlQRV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYWFjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIF9UU1RZUEVfSF8KKyNkZWZpbmUgX1RTVFlQRV9IXworI2luY2x1ZGUgInJ0bDgxOXhfUW9zLmgiCisjZGVmaW5lIFRTX1NFVFVQX1RJTUVPVVQJNjAgIC8vIEluIG1pbGxpc2Vjb25kCisjZGVmaW5lIFRTX0lOQUNUX1RJTUVPVVQJNjAKKyNkZWZpbmUgVFNfQUREQkFfREVMQVkJCTYwCisKKyNkZWZpbmUgVE9UQUxfVFNfTlVNCQkxNgorI2RlZmluZSBUQ0xBU19OVU0JCTQKKworLy8gVGhpcyBkZWZpbmUgdGhlIFR4L1J4IGRpcmVjdGlvbnMKK3R5cGVkZWYgZW51bSBfVFJfU0VMRUNUIHsKKwlUWF9ESVIgPSAwLAorCVJYX0RJUiA9IDEsCit9IFRSX1NFTEVDVCwgKlBUUl9TRUxFQ1Q7CisKK3R5cGVkZWYgc3RydWN0IF9UU19DT01NT05fSU5GT3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlMaXN0OworCXN0cnVjdCB0aW1lcl9saXN0CQlTZXR1cFRpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CQlJbmFjdFRpbWVyOworCXU4CQkJCUFkZHJbNl07CisJVFNQRUNfQk9EWQkJCVRTcGVjOworCVFPU19UQ0xBUwkJCVRDbGFzc1tUQ0xBU19OVU1dOworCXU4CQkJCVRDbGFzUHJvYzsKKwl1OAkJCQlUQ2xhc051bTsKK30gVFNfQ09NTU9OX0lORk8sICpQVFNfQ09NTU9OX0lORk87CisKK3R5cGVkZWYgc3RydWN0IF9UWF9UU19SRUNPUkR7CisJVFNfQ09NTU9OX0lORk8JCVRzQ29tbW9uSW5mbzsKKwl1MTYJCQkJVHhDdXJTZXE7CisJQkFfUkVDT1JECQkJVHhQZW5kaW5nQkFSZWNvcmQ7ICAJLy8gRm9yIEJBIE9yaWdpbmF0b3IKKwlCQV9SRUNPUkQJCQlUeEFkbWl0dGVkQkFSZWNvcmQ7CS8vIEZvciBCQSBPcmlnaW5hdG9yCisvLwlRT1NfRExfUkVDT1JECQlETFJlY29yZDsKKwl1OAkJCQliQWRkQmFSZXFJblByb2dyZXNzOworCXU4CQkJCWJBZGRCYVJlcURlbGF5ZWQ7CisJdTgJCQkJYlVzaW5nQmE7CisJc3RydWN0IHRpbWVyX2xpc3QJCVRzQWRkQmFUaW1lcjsKKwl1OAkJCQludW07Cit9IFRYX1RTX1JFQ09SRCwgKlBUWF9UU19SRUNPUkQ7CisKK3R5cGVkZWYgc3RydWN0IF9SWF9UU19SRUNPUkQgeworCVRTX0NPTU1PTl9JTkZPCQlUc0NvbW1vbkluZm87CisJdTE2CQkJCVJ4SW5kaWNhdGVTZXE7CisJdTE2CQkJCVJ4VGltZW91dEluZGljYXRlU2VxOworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UGVuZGluZ1BrdExpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QJCVJ4UGt0UGVuZGluZ1RpbWVyOworCUJBX1JFQ09SRAkJCVJ4QWRtaXR0ZWRCQVJlY29yZDsJIC8vIEZvciBCQSBSZWNlcGllbnQKKwl1MTYJCQkJUnhMYXN0U2VxTnVtOworCXU4CQkJCVJ4TGFzdEZyYWdOdW07CisJdTgJCQkJbnVtOworLy8JUU9TX0RMX1JFQ09SRAkJRExSZWNvcmQ7Cit9IFJYX1RTX1JFQ09SRCwgKlBSWF9UU19SRUNPUkQ7CisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzczZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCkBAIC0wLDAgKzEsNjI4IEBACisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJydGw4MTl4X1RTLmgiCisKK3ZvaWQgVHNTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCS8vIE5vdCBpbXBsZW1lbnQgeWV0CisJLy8gVGhpcyBpcyB1c2VkIGZvciBXTU1TQSBhbmQgQUNNICwgdGhhdCB3b3VsZCBzZW5kIEFERFRTUmVxIGZyYW1lLgorfQorCit2b2lkIFRzSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvLyBOb3QgaW1wbGVtZW50IHlldAorCS8vIFRoaXMgaXMgdXNlZCBmb3IgV01NU0EgYW5kIEFDTS4KKwkvLyBUaGlzIGZ1bmN0aW9uIHdvdWxkIGJlIGNhbGwgd2hlbiBUUyBpcyBubyBUeC9SeCBmb3Igc29tZSBwZXJpb2Qgb2YgdGltZS4KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgSSBzdGlsbCBub3QgdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uLCBzbyB3YWl0IGZvciBmdXJ0aGVyIGltcGxlbWVudGF0aW9uCisgKiAgIGlucHV0OiAgdW5zaWduZWQgbG9uZwkgZGF0YQkJLy9hY3R1cmFsbHkgd2Ugc2VuZCBUWF9UU19SRUNPUkQgb3IgUlhfVFNfUkVDT1JEIHRvIHRoZXNlIHRpbWVyCisgKiAgcmV0dXJuOiAgTlVMTAorICogIG5vdGljZToKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBSeFBrdFBlbmRpbmdUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQUlhfVFNfUkVDT1JECXBSeFRzID0gKFBSWF9UU19SRUNPUkQpZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwUnhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFJ4VHNSZWNvcmRbcFJ4VHMtPm51bV0pOworCisJUFJYX1JFT1JERVJfRU5UUlkgCXBSZW9yZGVyRW50cnkgPSBOVUxMOworCisJLy91MzIgZmxhZ3MgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfcnhiICpzdGF0c19JbmRpY2F0ZUFycmF5W1JFT1JERVJfV0lOX1NJWkVdOworCXU4IGluZGV4ID0gMDsKKwlib29sIGJQa3RJbkJ1ZiA9IGZhbHNlOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7CisJLy9QbGF0Zm9ybUFjcXVpcmVTcGluTG9jayhBZGFwdGVyLCBSVF9SWF9TUElOTE9DSyk7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCI9PT09PT09PT09PT09PT09PT0+JXMoKVxuIixfX0ZVTkNUSU9OX18pOworCWlmKHBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSAhPSAweGZmZmYpCisJeworCQkvLyBJbmRpY2F0ZSB0aGUgcGVuZGluZyBwYWNrZXRzIHNlcXVlbnRpYWxseSBhY2NvcmRpbmcgdG8gU2VxTnVtIHVudGlsIG1lZXQgdGhlIGdhcC4KKwkJd2hpbGUoIWxpc3RfZW1wdHkoJnBSeFRzLT5SeFBlbmRpbmdQa3RMaXN0KSkKKwkJeworCQkJcFJlb3JkZXJFbnRyeSA9IChQUlhfUkVPUkRFUl9FTlRSWSlsaXN0X2VudHJ5KHBSeFRzLT5SeFBlbmRpbmdQa3RMaXN0LnByZXYsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KTsKKwkJCWlmKGluZGV4ID09IDApCisJCQkJcFJ4VHMtPlJ4SW5kaWNhdGVTZXEgPSBwUmVvcmRlckVudHJ5LT5TZXFOdW07CisKKwkJCWlmKCBTTl9MRVNTKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpIHx8CisJCQkJU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwUnhUcy0+UnhJbmRpY2F0ZVNlcSkJKQorCQkJeworCQkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQkJaWYoU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwUnhUcy0+UnhJbmRpY2F0ZVNlcSkpCisJCQkJCXBSeFRzLT5SeEluZGljYXRlU2VxID0gKHBSeFRzLT5SeEluZGljYXRlU2VxICsgMSkgJSA0MDk2OworCisJCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCJSeFBrdFBlbmRpbmdUaW1lb3V0KCk6IEluZGljYXRlU2VxOiAlZFxuIiwgcFJlb3JkZXJFbnRyeS0+U2VxTnVtKTsKKwkJCQlzdGF0c19JbmRpY2F0ZUFycmF5W2luZGV4XSA9IHBSZW9yZGVyRW50cnktPnByeGI7CisJCQkJaW5kZXgrKzsKKworCQkJCWxpc3RfYWRkX3RhaWwoJnBSZW9yZGVyRW50cnktPkxpc3QsICZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJQa3RJbkJ1ZiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZihpbmRleD4wKQorCXsKKwkJLy8gU2V0IFJ4VGltZW91dEluZGljYXRlU2VxIHRvIDB4ZmZmZiB0byBpbmRpY2F0ZSBubyBwZW5kaW5nIHBhY2tldHMgaW4gYnVmZmVyIG5vdy4KKwkJcFJ4VHMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOworCisJCS8vIEluZGljYXRlIHBhY2tldHMKKwkJaWYoaW5kZXggPiBSRU9SREVSX1dJTl9TSVpFKXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogUnggUmVvcmVyIGJ1ZmZlciBmdWxsISEgXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCWllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKGllZWUsIHN0YXRzX0luZGljYXRlQXJyYXksIGluZGV4KTsKKwl9CisKKwlpZihiUGt0SW5CdWYgJiYgKHBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcT09MHhmZmZmKSkKKwl7CisJCXBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IHBSeFRzLT5SeEluZGljYXRlU2VxOworCQlpZih0aW1lcl9wZW5kaW5nKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIpKQorCQkJZGVsX3RpbWVyX3N5bmMoJnBSeFRzLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJCXBSeFRzLT5SeFBrdFBlbmRpbmdUaW1lci5leHBpcmVzID0gamlmZmllcyArIGllZWUtPnBIVEluZm8tPlJ4UmVvcmRlclBlbmRpbmdUaW1lOworCQlhZGRfdGltZXIoJnBSeFRzLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBBZGQgQkEgdGltZXIgZnVuY3Rpb24KKyAqICAgaW5wdXQ6ICB1bnNpZ25lZCBsb25nCSBkYXRhCQkvL2FjdHVyYWxseSB3ZSBzZW5kIFRYX1RTX1JFQ09SRCBvciBSWF9UU19SRUNPUkQgdG8gdGhlc2UgdGltZXIKKyAqICByZXR1cm46ICBOVUxMCisgKiAgbm90aWNlOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFRzQWRkQmFQcm9jZXNzKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKKwl1OCBudW0gPSBwVHhUcy0+bnVtOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBUeFRzLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgVHhUc1JlY29yZFtudW1dKTsKKworCVRzSW5pdEFkZEJBKGllZWUsIHBUeFRzLCBCQV9QT0xJQ1lfSU1NRURJQVRFLCBmYWxzZSk7CisJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgIlRzQWRkQmFQcm9jZXNzKCk6IEFEREJBIFJlcSBpcyBzdGFydGVkISEgXG4iKTsKK30KKworCit2b2lkIFJlc2V0VHNDb21tb25JbmZvKFBUU19DT01NT05fSU5GTwlwVHNDb21tb25JbmZvKQoreworCW1lbXNldChwVHNDb21tb25JbmZvLT5BZGRyLCAwLCA2KTsKKwltZW1zZXQoJnBUc0NvbW1vbkluZm8tPlRTcGVjLCAwLCBzaXplb2YoVFNQRUNfQk9EWSkpOworCW1lbXNldCgmcFRzQ29tbW9uSW5mby0+VENsYXNzLCAwLCBzaXplb2YoUU9TX1RDTEFTKSpUQ0xBU19OVU0pOworCXBUc0NvbW1vbkluZm8tPlRDbGFzUHJvYyA9IDA7CisJcFRzQ29tbW9uSW5mby0+VENsYXNOdW0gPSAwOworfQorCit2b2lkIFJlc2V0VHhUc0VudHJ5KFBUWF9UU19SRUNPUkQgcFRTKQoreworCVJlc2V0VHNDb21tb25JbmZvKCZwVFMtPlRzQ29tbW9uSW5mbyk7CisJcFRTLT5UeEN1clNlcSA9IDA7CisJcFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CisJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gZmFsc2U7CisJcFRTLT5iVXNpbmdCYSA9IGZhbHNlOworCVJlc2V0QmFFbnRyeSgmcFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQpOyAvL0ZvciBCQSBPcmlnaW5hdG9yCisJUmVzZXRCYUVudHJ5KCZwVFMtPlR4UGVuZGluZ0JBUmVjb3JkKTsKK30KKwordm9pZCBSZXNldFJ4VHNFbnRyeShQUlhfVFNfUkVDT1JEIHBUUykKK3sKKwlSZXNldFRzQ29tbW9uSW5mbygmcFRTLT5Uc0NvbW1vbkluZm8pOworCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsgLy8gVGhpcyBpbmRpY2F0ZSB0aGUgUnhJbmRpY2F0ZVNlcSBpcyBub3QgdXNlZCBub3chIQorCXBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSAweGZmZmY7IC8vIFRoaXMgaW5kaWNhdGUgdGhlIFJ4VGltZW91dEluZGljYXRlU2VxIGlzIG5vdCB1c2VkIG5vdyEhCisJUmVzZXRCYUVudHJ5KCZwVFMtPlJ4QWRtaXR0ZWRCQVJlY29yZCk7CSAgLy8gRm9yIEJBIFJlY2VwaWVudAorfQorCit2b2lkIFRTSW5pdGlhbGl6ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlQVFhfVFNfUkVDT1JECQlwVHhUUyAgPSBpZWVlLT5UeFRzUmVjb3JkOworCVBSWF9UU19SRUNPUkQJCXBSeFRTICA9IGllZWUtPlJ4VHNSZWNvcmQ7CisJUFJYX1JFT1JERVJfRU5UUlkJcFJ4UmVvcmRlckVudHJ5ID0gaWVlZS0+UnhSZW9yZGVyRW50cnk7CisJdTgJCQkJY291bnQgPSAwOworCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICI9PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJLy8gSW5pdGlhbGl6ZSBUeCBUUyByZWxhdGVkIGluZm8uCisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlR4X1RTX0FkbWl0X0xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5UeF9UU19QZW5kaW5nX0xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRPVEFMX1RTX05VTTsgY291bnQrKykKKwl7CisJCS8vCisJCXBUeFRTLT5udW0gPSBjb3VudDsKKwkJLy8gVGhlIHRpbWVycyBmb3IgdGhlIG9wZXJhdGlvbiBvZiBUcmFmZmljIFN0cmVhbSBhbmQgQmxvY2sgQWNrLgorCQkvLyBETFMgcmVsYXRlZCB0aW1lciB3aWxsIGJlIGFkZCBoZXJlIGluIHRoZSBmdXR1cmUhIQorCQlpbml0X3RpbWVyKCZwVHhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIpOworCQlwVHhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZnVuY3Rpb24gPSBUc1NldHVwVGltZU91dDsKKworCQlpbml0X3RpbWVyKCZwVHhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIpOworCQlwVHhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZnVuY3Rpb24gPSBUc0luYWN0VGltZW91dDsKKworCQlpbml0X3RpbWVyKCZwVHhUUy0+VHNBZGRCYVRpbWVyKTsKKwkJcFR4VFMtPlRzQWRkQmFUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFR4VFM7CisJCXBUeFRTLT5Uc0FkZEJhVGltZXIuZnVuY3Rpb24gPSBUc0FkZEJhUHJvY2VzczsKKworCQlpbml0X3RpbWVyKCZwVHhUUy0+VHhQZW5kaW5nQkFSZWNvcmQuVGltZXIpOworCQlwVHhUUy0+VHhQZW5kaW5nQkFSZWNvcmQuVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOworCQlwVHhUUy0+VHhQZW5kaW5nQkFSZWNvcmQuVGltZXIuZnVuY3Rpb24gPSBCYVNldHVwVGltZU91dDsKKworCQlpbml0X3RpbWVyKCZwVHhUUy0+VHhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyKTsKKwkJcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFR4VFM7CisJCXBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZnVuY3Rpb24gPSBUeEJhSW5hY3RUaW1lb3V0OworCisJCVJlc2V0VHhUc0VudHJ5KHBUeFRTKTsKKwkJbGlzdF9hZGRfdGFpbCgmcFR4VFMtPlRzQ29tbW9uSW5mby5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCQlwVHhUUysrOworCX0KKworCS8vIEluaXRpYWxpemUgUnggVFMgcmVsYXRlZCBpbmZvLgorCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5SeF9UU19BZG1pdF9MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhfVFNfUGVuZGluZ19MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgVE9UQUxfVFNfTlVNOyBjb3VudCsrKQorCXsKKwkJcFJ4VFMtPm51bSA9IGNvdW50OworCQlJTklUX0xJU1RfSEVBRCgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QpOworCisJCWluaXRfdGltZXIoJnBSeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lcik7CisJCXBSeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7CisJCXBSeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lci5mdW5jdGlvbiA9IFRzU2V0dXBUaW1lT3V0OworCisJCWluaXRfdGltZXIoJnBSeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lcik7CisJCXBSeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7CisJCXBSeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lci5mdW5jdGlvbiA9IFRzSW5hY3RUaW1lb3V0OworCisJCWluaXRfdGltZXIoJnBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIpOworCQlwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwUnhUUzsKKwkJcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5mdW5jdGlvbiA9IFJ4QmFJbmFjdFRpbWVvdXQ7CisKKwkJaW5pdF90aW1lcigmcFJ4VFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKwkJcFJ4VFMtPlJ4UGt0UGVuZGluZ1RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwUnhUUzsKKwkJcFJ4VFMtPlJ4UGt0UGVuZGluZ1RpbWVyLmZ1bmN0aW9uID0gUnhQa3RQZW5kaW5nVGltZW91dDsKKworCQlSZXNldFJ4VHNFbnRyeShwUnhUUyk7CisJCWxpc3RfYWRkX3RhaWwoJnBSeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwkJcFJ4VFMrKzsKKwl9CisJLy8gSW5pdGlhbGl6ZSB1bnVzZWQgUnggUmVvcmRlciBMaXN0LgorCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworLy8jaWZkZWYgVE9fRE9fTElTVAorCWZvcihjb3VudCA9IDA7IGNvdW50IDwgUkVPUkRFUl9FTlRSWV9OVU07IGNvdW50KyspCisJeworCQlsaXN0X2FkZF90YWlsKCAmcFJ4UmVvcmRlckVudHJ5LT5MaXN0LCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQlpZihjb3VudCA9PSAoUkVPUkRFUl9FTlRSWV9OVU0tMSkpCisJCQlicmVhazsKKwkJcFJ4UmVvcmRlckVudHJ5ID0gJmllZWUtPlJ4UmVvcmRlckVudHJ5W2NvdW50KzFdOworCX0KKy8vI2VuZGlmCisKK30KKwordm9pZCBBZG1pdFRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgdTMyIEluYWN0VGltZSkKK3sKKwlkZWxfdGltZXJfc3luYygmcFRzQ29tbW9uSW5mby0+U2V0dXBUaW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPkluYWN0VGltZXIpOworCisJaWYoSW5hY3RUaW1lIT0wKQorCQltb2RfdGltZXIoJnBUc0NvbW1vbkluZm8tPkluYWN0VGltZXIsIGppZmZpZXMgKyBNU0VDUyhJbmFjdFRpbWUpKTsKK30KKworCitQVFNfQ09NTU9OX0lORk8gU2VhcmNoQWRtaXRUUlN0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTgqCUFkZHIsIHU4IFRJRCwgVFJfU0VMRUNUCVR4UnhTZWxlY3QpCit7CisJLy9ESVJFQ1RJT05fVkFMVUUgCWRpcjsKKwl1OCAJZGlyOworCWJvb2wJCQkJc2VhcmNoX2Rpcls0XSA9IHswLCAwLCAwLCAwfTsKKwlzdHJ1Y3QgbGlzdF9oZWFkKgkJcHNlYXJjaF9saXN0OyAvL0ZJWE1FCisJUFRTX0NPTU1PTl9JTkZPCXBSZXQgPSBOVUxMOworCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIC8vYXAgbW9kZQorCXsKKwkJaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCXsKKwkJCXNlYXJjaF9kaXJbRElSX0RPV05dID0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl09IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gCT0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl09IHRydWU7CisJCX0KKwl9CisJZWxzZSBpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJeworCQlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKKwkJCXNlYXJjaF9kaXJbRElSX1VQXSAJPSB0cnVlOworCQllbHNlCisJCQlzZWFyY2hfZGlyW0RJUl9ET1dOXSA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCWlmKFR4UnhTZWxlY3QgPT0gVFhfRElSKQorCQl7CisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gCT0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl09IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9ESVJFQ1RdPSB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJc2VhcmNoX2RpcltESVJfRE9XTl0gPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfQklfRElSXT0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0RJUkVDVF09IHRydWU7CisJCX0KKwl9CisKKwlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKKwkJcHNlYXJjaF9saXN0ID0gJmllZWUtPlR4X1RTX0FkbWl0X0xpc3Q7CisJZWxzZQorCQlwc2VhcmNoX2xpc3QgPSAmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdDsKKworCS8vZm9yKGRpciA9IERJUl9VUDsgZGlyIDw9IERJUl9CSV9ESVI7IGRpcisrKQorCWZvcihkaXIgPSAwOyBkaXIgPD0gRElSX0JJX0RJUjsgZGlyKyspCisJeworCQlpZihzZWFyY2hfZGlyW2Rpcl0gPT1mYWxzZSApCisJCQljb250aW51ZTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwUmV0LCBwc2VhcmNoX2xpc3QsIExpc3QpeworCS8vCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiQUREOiJNQUNfRk1UIiwgVElEOiVkLCBkaXI6JWRcbiIsIE1BQ19BUkcocFJldC0+QWRkciksIHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRCwgcFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNEaXJlY3Rpb24pOworCQkJaWYgKG1lbWNtcChwUmV0LT5BZGRyLCBBZGRyLCA2KSA9PSAwKQorCQkJCWlmIChwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y1RTSUQgPT0gVElEKQorCQkJCQlpZihwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y0RpcmVjdGlvbiA9PSBkaXIpCisJCQkJCXsKKwkvLwkJCQkJcHJpbnRrKCJCaW5nbyEgZ290IGl0XG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJfQorCQlpZigmcFJldC0+TGlzdCAgIT0gcHNlYXJjaF9saXN0KQorCQkJYnJlYWs7CisJfQorCisJaWYoJnBSZXQtPkxpc3QgICE9IHBzZWFyY2hfbGlzdCl7CisJCXJldHVybiBwUmV0IDsKKwl9CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBNYWtlVFNFbnRyeSgKKwkJUFRTX0NPTU1PTl9JTkZPCXBUc0NvbW1vbkluZm8sCisJCXU4KgkJQWRkciwKKwkJUFRTUEVDX0JPRFkJcFRTUEVDLAorCQlQUU9TX1RDTEFTCXBUQ0xBUywKKwkJdTgJCVRDTEFTX051bSwKKwkJdTgJCVRDTEFTX1Byb2MKKwkpCit7CisJdTgJY291bnQ7CisKKwlpZihwVHNDb21tb25JbmZvID09IE5VTEwpCisJCXJldHVybjsKKworCW1lbWNweShwVHNDb21tb25JbmZvLT5BZGRyLCBBZGRyLCA2KTsKKworCWlmKHBUU1BFQyAhPSBOVUxMKQorCQltZW1jcHkoKHU4KikoJihwVHNDb21tb25JbmZvLT5UU3BlYykpLCAodTgqKXBUU1BFQywgc2l6ZW9mKFRTUEVDX0JPRFkpKTsKKworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgVENMQVNfTnVtOyBjb3VudCsrKQorCQltZW1jcHkoKHU4KikoJihwVHNDb21tb25JbmZvLT5UQ2xhc3NbY291bnRdKSksICh1OCopcFRDTEFTLCBzaXplb2YoUU9TX1RDTEFTKSk7CisKKwlwVHNDb21tb25JbmZvLT5UQ2xhc1Byb2MgPSBUQ0xBU19Qcm9jOworCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gVENMQVNfTnVtOworfQorCisKK2Jvb2wgR2V0VHMoCisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqCWllZWUsCisJUFRTX0NPTU1PTl9JTkZPCQkJKnBwVFMsCisJdTgqCQkJCUFkZHIsCisJdTgJCQkJVElELAorCVRSX1NFTEVDVAkJCVR4UnhTZWxlY3QsICAvL1J4OjEsIFR4OjAKKwlib29sCQkJCWJBZGROZXdUcworCSkKK3sKKwl1OAlVUCA9IDA7CisJLy8KKwkvLyBXZSBkbyBub3QgYnVpbGQgYW55IFRTIGZvciBCcm9hZGNhc3Qgb3IgTXVsdGljYXN0IHN0cmVhbS4KKwkvLyBTbyByZWplY3QgdGhlc2Uga2luZHMgb2Ygc2VhcmNoIGhlcmUuCisJLy8KKwlpZihpc19icm9hZGNhc3RfZXRoZXJfYWRkcihBZGRyKSB8fCBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihBZGRyKSkKKwl7CisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiZ2V0IFRTIGZvciBCcm9hZGNhc3Qgb3IgTXVsdGljYXN0XG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9PSAwKQorCQlVUCA9IDA7CisJZWxzZQorCXsKKwkJLy8gSW4gV01NIGNhc2U6IHdlIHVzZSA0IFRJRCBvbmx5CisJCWlmICghSXNBQ1ZhbGlkKFRJRCkpCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIGluICVzKCksIFRJRCglZCkgaXMgbm90IHZhbGlkXG4iLCBfX0ZVTkNUSU9OX18sIFRJRCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlzd2l0Y2goVElEKQorCQl7CisJCWNhc2UgMDoKKwkJY2FzZSAzOgorCQkJVVAgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlVUCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJCVVQID0gNTsKKwkJCWJyZWFrOworCisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJVVAgPSA3OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkqcHBUUyA9IFNlYXJjaEFkbWl0VFJTdHJlYW0oCisJCQlpZWVlLAorCQkJQWRkciwKKwkJCVVQLAorCQkJVHhSeFNlbGVjdCk7CisJaWYoKnBwVFMgIT0gTlVMTCkKKwl7CisJCXJldHVybiB0cnVlOworCX0KKwllbHNlCisJeworCQlpZihiQWRkTmV3VHMgPT0gZmFsc2UpCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICJhZGQgbmV3IFRTIGZhaWxlZCh0aWQ6JWQpXG4iLCBVUCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLworCQkJLy8gQ3JlYXRlIGEgbmV3IFRyYWZmaWMgc3RyZWFtIGZvciBjdXJyZW50IFR4L1J4CisJCQkvLyBUaGlzIGlzIGZvciBFRENBIGFuZCBXTU0gdG8gYWRkIGEgbmV3IFRTLgorCQkJLy8gRm9yIEhDQ0Egb3IgV01NU0EsIFRTIGNhbm5vdCBiZSBhZGRtaXQgd2l0aG91dCBuZWdvdGlhdGlvbi4KKwkJCS8vCisJCQlUU1BFQ19CT0RZCVRTcGVjOworCQkJUFFPU19UU0lORk8JCXBUU0luZm8gPSAmVFNwZWMuZi5UU0luZm87CisJCQlzdHJ1Y3QgbGlzdF9oZWFkKglwVW51c2VkTGlzdCA9CisJCQkJCQkJCShUeFJ4U2VsZWN0ID09IFRYX0RJUik/CisJCQkJCQkJCSgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOgorCQkJCQkJCQkoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKworCQkJc3RydWN0IGxpc3RfaGVhZCoJcEFkZG1pdExpc3QgPQorCQkJCQkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpPworCQkJCQkJCQkoJmllZWUtPlR4X1RTX0FkbWl0X0xpc3QpOgorCQkJCQkJCQkoJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QpOworCisJCQlESVJFQ1RJT05fVkFMVUUJCURpciA9CQkoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUik/CisJCQkJCQkJCSgoVHhSeFNlbGVjdD09VFhfRElSKT9ESVJfRE9XTjpESVJfVVApOgorCQkJCQkJCQkoKFR4UnhTZWxlY3Q9PVRYX0RJUik/RElSX1VQOkRJUl9ET1dOKTsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICJ0byBhZGQgVHNcbiIpOworCQkJaWYoIWxpc3RfZW1wdHkocFVudXNlZExpc3QpKQorCQkJeworCQkJCSgqcHBUUykgPSBsaXN0X2VudHJ5KHBVbnVzZWRMaXN0LT5uZXh0LCBUU19DT01NT05fSU5GTywgTGlzdCk7CisJCQkJbGlzdF9kZWxfaW5pdCgmKCpwcFRTKS0+TGlzdCk7CisJCQkJaWYoVHhSeFNlbGVjdD09VFhfRElSKQorCQkJCXsKKwkJCQkJUFRYX1RTX1JFQ09SRCB0bXAgPSBjb250YWluZXJfb2YoKnBwVFMsIFRYX1RTX1JFQ09SRCwgVHNDb21tb25JbmZvKTsKKwkJCQkJUmVzZXRUeFRzRW50cnkodG1wKTsKKwkJCQl9CisJCQkJZWxzZXsKKwkJCQkJUFJYX1RTX1JFQ09SRCB0bXAgPSBjb250YWluZXJfb2YoKnBwVFMsIFJYX1RTX1JFQ09SRCwgVHNDb21tb25JbmZvKTsKKwkJCQkJUmVzZXRSeFRzRW50cnkodG1wKTsKKwkJCQl9CisKKwkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAidG8gaW5pdCBjdXJyZW50IFRTLCBVUDolZCwgRGlyOiVkLCBhZGRyOiJNQUNfRk1UIlxuIiwgVVAsIERpciwgTUFDX0FSRyhBZGRyKSk7CisJCQkJLy8gUHJlcGFyZSBUUyBJbmZvIHJlbGVhdGVkIGZpZWxkCisJCQkJcFRTSW5mby0+ZmllbGQudWNUcmFmZmljVHlwZSA9IDA7CQkJLy8gVHJhZmZpYyB0eXBlOiBXTU0gaXMgcmVzZXJ2ZWQgaW4gdGhpcyBmaWVsZAorCQkJCXBUU0luZm8tPmZpZWxkLnVjVFNJRCA9IFVQOwkJCS8vIFRTSUQKKwkJCQlwVFNJbmZvLT5maWVsZC51Y0RpcmVjdGlvbiA9IERpcjsJCQkvLyBEaXJlY3Rpb246IGlmIHRoZXJlIGlzIERpcmVjdExpbmssIHRoaXMgbmVlZCBhZGRpdGlvbmFsIGNvbnNpZGVyYXRpb24uCisJCQkJcFRTSW5mby0+ZmllbGQudWNBY2Nlc3NQb2xpY3kgPSAxOwkJLy8gQWNjZXNzIHBvbGljeQorCQkJCXBUU0luZm8tPmZpZWxkLnVjQWdncmVnYXRpb24gPSAwOyAJCS8vIEFnZ3JlZ2F0aW9uCisJCQkJcFRTSW5mby0+ZmllbGQudWNQU0IgPSAwOyAJCQkJLy8gQWdncmVnYXRpb24KKwkJCQlwVFNJbmZvLT5maWVsZC51Y1VQID0gVVA7CQkJCS8vIFVzZXIgcHJpb3JpdHkKKwkJCQlwVFNJbmZvLT5maWVsZC51Y1RTSW5mb0Fja1BvbGljeSA9IDA7CQkvLyBBY2sgcG9saWN5CisJCQkJcFRTSW5mby0+ZmllbGQudWNTY2hlZHVsZSA9IDA7CQkJLy8gU2NoZWR1bGUKKworCQkJCU1ha2VUU0VudHJ5KCpwcFRTLCBBZGRyLCAmVFNwZWMsIE5VTEwsIDAsIDApOworCQkJCUFkbWl0VFMoaWVlZSwgKnBwVFMsIDApOworCQkJCWxpc3RfYWRkX3RhaWwoJigoKnBwVFMpLT5MaXN0KSwgcEFkZG1pdExpc3QpOworCQkJCS8vIGlmIHRoZXJlIGlzIERpcmVjdExpbmssIHdlIG5lZWQgdG8gZG8gYWRkaXRpb25hbCBvcGVyYXRpb24gaGVyZSEhCisKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImluIGZ1bmN0aW9uICVzKCkgVGhlcmUgaXMgbm90IGVub3VnaCBUUyByZWNvcmQgdG8gYmUgdXNlZCEhIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgUmVtb3ZlVHNFbnRyeSgKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSoJaWVlZSwKKwlQVFNfQ09NTU9OX0lORk8JCQlwVHMsCisJVFJfU0VMRUNUCQkJVHhSeFNlbGVjdAorCSkKK3sKKwkvL3UzMiBmbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJZGVsX3RpbWVyX3N5bmMoJnBUcy0+U2V0dXBUaW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBUcy0+SW5hY3RUaW1lcik7CisJVHNJbml0RGVsQkEoaWVlZSwgcFRzLCBUeFJ4U2VsZWN0KTsKKworCWlmKFR4UnhTZWxlY3QgPT0gUlhfRElSKQorCXsKKy8vI2lmZGVmIFRPX0RPX0xJU1QKKwkJUFJYX1JFT1JERVJfRU5UUlkJcFJ4UmVvcmRlckVudHJ5OworCQlQUlhfVFNfUkVDT1JEIAkJcFJ4VFMgPSAoUFJYX1RTX1JFQ09SRClwVHM7CisJCWlmKHRpbWVyX3BlbmRpbmcoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcikpCisJCQlkZWxfdGltZXJfc3luYygmcFJ4VFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKKworCQl3aGlsZSghbGlzdF9lbXB0eSgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QpKQorCQl7CisJCS8vICAgICAgUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCQkJLy9wUnhSZW9yZGVyRW50cnkgPSBsaXN0X2VudHJ5KCZwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7CisJCQlwUnhSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZwUnhSZW9yZGVyRW50cnktPkxpc3QpOworCQkJeworCQkJCWludCBpID0gMDsKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqIHByeGIgPSBwUnhSZW9yZGVyRW50cnktPnByeGI7CisJCQkJaWYgKHVubGlrZWx5KCFwcnhiKSkKKwkJCQl7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCWZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCQkJZGV2X2tmcmVlX3NrYihwcnhiLT5zdWJmcmFtZXNbaV0pOworCQkJCX0KKwkJCQlrZnJlZShwcnhiKTsKKwkJCQlwcnhiID0gTlVMTDsKKwkJCX0KKwkJCWxpc3RfYWRkX3RhaWwoJnBSeFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwkJCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7CisJCX0KKworLy8jZW5kaWYKKwl9CisJZWxzZQorCXsKKwkJUFRYX1RTX1JFQ09SRCBwVHhUUyA9IChQVFhfVFNfUkVDT1JEKXBUczsKKwkJZGVsX3RpbWVyX3N5bmMoJnBUeFRTLT5Uc0FkZEJhVGltZXIpOworCX0KK30KKwordm9pZCBSZW1vdmVQZWVyVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBBZGRyKQoreworCVBUU19DT01NT05fSU5GTwlwVFMsIHBUbXBUUzsKKwlwcmludGsoIj09PT09PT09PT09PlJlbW92ZVBlZXJUUywiTUFDX0ZNVCJcbiIsIE1BQ19BUkcoQWRkcikpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlR4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkKKwl7CisJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKQorCQl7CisJCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0LCBMaXN0KQorCXsKKwkJaWYgKG1lbWNtcChwVFMtPkFkZHIsIEFkZHIsIDYpID09IDApCisJCXsKKwkJCXByaW50aygiPT09PT5yZW1vdmUgVHhfVFNfYWRtaW5fbGlzdFxuIik7CisJCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5SeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCisJeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkKKwkJeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKKwl7CisJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKQorCQl7CisJCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgUlhfRElSKTsKKwkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCit7CisJUFRTX0NPTU1PTl9JTkZPIHBUUywgcFRtcFRTOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlR4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkKKwl7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBUWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKKwl7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBUWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfUGVuZGluZ19MaXN0LCBMaXN0KQorCXsKKwkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5SeF9UU19BZG1pdF9MaXN0LCBMaXN0KQorCXsKKwkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwl9Cit9CisKK3ZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRAlwVHhUUykKK3sKKwlpZihwVHhUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9PSBmYWxzZSkKKwl7CisJCXBUeFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gdHJ1ZTsKKwkJaWYocFR4VFMtPmJBZGRCYVJlcURlbGF5ZWQpCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6IERlbGF5ZWQgU3RhcnQgQUREQkEgYWZ0ZXIgNjAgc2VjISFcbiIpOworCQkJbW9kX3RpbWVyKCZwVHhUUy0+VHNBZGRCYVRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoVFNfQUREQkFfREVMQVkpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsIlRzU3RhcnRBZGRCYVByb2Nlc3MoKTogSW1tZWRpYXRlbHkgU3RhcnQgQUREQkEgbm93ISFcbiIpOworCQkJbW9kX3RpbWVyKCZwVHhUUy0+VHNBZGRCYVRpbWVyLCBqaWZmaWVzKzEwKTsgLy9zZXQgMTAgdGlja3MKKwkJfQorCX0KKwllbHNlCisJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiJXMoKT09PkJBIHRpbWVyIGlzIGFscmVhZHkgYWRkZWRcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CitFWFBPUlRfU1lNQk9MKFJlbW92ZVBlZXJUUyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsX2NyeXB0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaApAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIFNjYXR0ZXJsaXN0IENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgorICogYW5kIE5ldHRsZSwgYnkgTmllbHMgTemwiGxlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2lmbmRlZiBfTElOVVhfQ1JZUFRPX0gKKyNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorCisjZGVmaW5lIGNyeXB0b19yZWdpc3Rlcl9hbGcgY3J5cHRvX3JlZ2lzdGVyX2FsZ19yc2wKKyNkZWZpbmUgY3J5cHRvX3VucmVnaXN0ZXJfYWxnIGNyeXB0b191bnJlZ2lzdGVyX2FsZ19yc2wKKyNkZWZpbmUgY3J5cHRvX2FsbG9jX3RmbSBjcnlwdG9fYWxsb2NfdGZtX3JzbAorI2RlZmluZSBjcnlwdG9fZnJlZV90Zm0gY3J5cHRvX2ZyZWVfdGZtX3JzbAorI2RlZmluZSBjcnlwdG9fYWxnX2F2YWlsYWJsZSBjcnlwdG9fYWxnX2F2YWlsYWJsZV9yc2wKKworLyoKKyAqIEFsZ29yaXRobSBtYXNrcyBhbmQgdHlwZXMuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUgkJMHgwMDAwMDAwMQorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfRElHRVNUCQkweDAwMDAwMDAyCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUwkweDAwMDAwMDA0CisKKy8qCisgKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCisgKi8KKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX01BU0sJCTB4MDAwMDAwZmYKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19NQVNLCQkweGZmZjAwMDAwCisKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0VDQgkJMHgwMDAwMDAwMQorI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0JDCQkweDAwMDAwMDAyCisjZGVmaW5lIENSWVBUT19URk1fTU9ERV9DRkIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NUUgkJMHgwMDAwMDAwOAorCisjZGVmaW5lIENSWVBUT19URk1fUkVRX1dFQUtfS0VZCQkweDAwMDAwMTAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX1dFQUtfS0VZCQkweDAwMTAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOICAgCTB4MDAyMDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRCAJMHgwMDQwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfQkxPQ0tfTEVOIAkweDAwODAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9GTEFHUyAJMHgwMTAwMDAwMAorCisvKgorICogTWlzY2VsbGFuZW91cyBzdHVmZi4KKyAqLworI2RlZmluZSBDUllQVE9fVU5TUEVDCQkJMAorI2RlZmluZSBDUllQVE9fTUFYX0FMR19OQU1FCQk2NAorCitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKKy8qCisgKiBBbGdvcml0aG1zOiBtb2R1bGFyIGNyeXB0byBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zLCBtYW5hZ2VkCisgKiB2aWEgY3J5cHRvX3JlZ2lzdGVyX2FsZygpIGFuZCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoKS4KKyAqLworc3RydWN0IGNpcGhlcl9hbGcgeworCXVuc2lnbmVkIGludCBjaWFfbWluX2tleXNpemU7CisJdW5zaWduZWQgaW50IGNpYV9tYXhfa2V5c2l6ZTsKKwlpbnQgKCpjaWFfc2V0a2V5KSh2b2lkICpjdHgsIGNvbnN0IHU4ICprZXksCisJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7CisJdm9pZCAoKmNpYV9lbmNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOworCXZvaWQgKCpjaWFfZGVjcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKK307CisKK3N0cnVjdCBkaWdlc3RfYWxnIHsKKwl1bnNpZ25lZCBpbnQgZGlhX2RpZ2VzdHNpemU7CisJdm9pZCAoKmRpYV9pbml0KSh2b2lkICpjdHgpOworCXZvaWQgKCpkaWFfdXBkYXRlKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKKwl2b2lkICgqZGlhX2ZpbmFsKSh2b2lkICpjdHgsIHU4ICpvdXQpOworCWludCAoKmRpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKKwkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKK307CisKK3N0cnVjdCBjb21wcmVzc19hbGcgeworCWludCAoKmNvYV9pbml0KSh2b2lkICpjdHgpOworCXZvaWQgKCpjb2FfZXhpdCkodm9pZCAqY3R4KTsKKwlpbnQgKCpjb2FfY29tcHJlc3MpKHZvaWQgKmN0eCwgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworCWludCAoKmNvYV9kZWNvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCSAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworfTsKKworI2RlZmluZSBjcmFfY2lwaGVyCWNyYV91LmNpcGhlcgorI2RlZmluZSBjcmFfZGlnZXN0CWNyYV91LmRpZ2VzdAorI2RlZmluZSBjcmFfY29tcHJlc3MJY3JhX3UuY29tcHJlc3MKKworc3RydWN0IGNyeXB0b19hbGcgeworCXN0cnVjdCBsaXN0X2hlYWQgY3JhX2xpc3Q7CisJdTMyIGNyYV9mbGFnczsKKwl1bnNpZ25lZCBpbnQgY3JhX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBpbnQgY3JhX2N0eHNpemU7CisJY29uc3QgY2hhciBjcmFfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKKworCXVuaW9uIHsKKwkJc3RydWN0IGNpcGhlcl9hbGcgY2lwaGVyOworCQlzdHJ1Y3QgZGlnZXN0X2FsZyBkaWdlc3Q7CisJCXN0cnVjdCBjb21wcmVzc19hbGcgY29tcHJlc3M7CisJfSBjcmFfdTsKKworCXN0cnVjdCBtb2R1bGUgKmNyYV9tb2R1bGU7Cit9OworCisvKgorICogQWxnb3JpdGhtIHJlZ2lzdHJhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2ludCBjcnlwdG9fcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOworaW50IGNyeXB0b191bnJlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKKworLyoKKyAqIEFsZ29yaXRobSBxdWVyeSBpbnRlcmZhY2UuCisgKi8KK2ludCBjcnlwdG9fYWxnX2F2YWlsYWJsZShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpOworCisvKgorICogVHJhbnNmb3JtczogdXNlci1pbnN0YW50aWF0ZWQgb2JqZWN0cyB3aGljaCBlbmNhcHN1bGF0ZSBhbGdvcml0aG1zCisgKiBhbmQgY29yZSBwcm9jZXNzaW5nIGxvZ2ljLiAgTWFuYWdlZCB2aWEgY3J5cHRvX2FsbG9jX3RmbSgpIGFuZAorICogY3J5cHRvX2ZyZWVfdGZtKCksIGFzIHdlbGwgYXMgdGhlIHZhcmlvdXMgaGVscGVycyBiZWxvdy4KKyAqLworc3RydWN0IGNyeXB0b190Zm07CisKK3N0cnVjdCBjaXBoZXJfdGZtIHsKKwl2b2lkICpjaXRfaXY7CisJdW5zaWduZWQgaW50IGNpdF9pdnNpemU7CisJdTMyIGNpdF9tb2RlOworCWludCAoKmNpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CisJaW50ICgqY2l0X2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CisJaW50ICgqY2l0X2VuY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKKwlpbnQgKCpjaXRfZGVjcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwlpbnQgKCpjaXRfZGVjcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOworCXZvaWQgKCpjaXRfeG9yX2Jsb2NrKSh1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKK307CisKK3N0cnVjdCBkaWdlc3RfdGZtIHsKKwl2b2lkICgqZGl0X2luaXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOworCXZvaWQgKCpkaXRfdXBkYXRlKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKKwl2b2lkICgqZGl0X2ZpbmFsKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KTsKKwl2b2lkICgqZGl0X2RpZ2VzdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7CisJaW50ICgqZGl0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKwkgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKKwl2b2lkICpkaXRfaG1hY19ibG9jazsKKyNlbmRpZgorfTsKKworc3RydWN0IGNvbXByZXNzX3RmbSB7CisJaW50ICgqY290X2NvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCisJICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworCWludCAoKmNvdF9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorCSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKK307CisKKyNkZWZpbmUgY3J0X2NpcGhlcgljcnRfdS5jaXBoZXIKKyNkZWZpbmUgY3J0X2RpZ2VzdAljcnRfdS5kaWdlc3QKKyNkZWZpbmUgY3J0X2NvbXByZXNzCWNydF91LmNvbXByZXNzCisKK3N0cnVjdCBjcnlwdG9fdGZtIHsKKworCXUzMiBjcnRfZmxhZ3M7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBjaXBoZXJfdGZtIGNpcGhlcjsKKwkJc3RydWN0IGRpZ2VzdF90Zm0gZGlnZXN0OworCQlzdHJ1Y3QgY29tcHJlc3NfdGZtIGNvbXByZXNzOworCX0gY3J0X3U7CisKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqX19jcnRfYWxnOworfTsKKworLyoKKyAqIFRyYW5zZm9ybSB1c2VyIGludGVyZmFjZS4KKyAqLworCisvKgorICogY3J5cHRvX2FsbG9jX3RmbSgpIHdpbGwgZmlyc3QgYXR0ZW1wdCB0byBsb2NhdGUgYW4gYWxyZWFkeSBsb2FkZWQgYWxnb3JpdGhtLgorICogSWYgdGhhdCBmYWlscyBhbmQgdGhlIGtlcm5lbCBzdXBwb3J0cyBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzLCBpdAorICogd2lsbCB0aGVuIGF0dGVtcHQgdG8gbG9hZCBhIG1vZHVsZSBvZiB0aGUgc2FtZSBuYW1lIG9yIGFsaWFzLiAgQSByZWZjb3VudAorICogaXMgZ3JhYmJlZCBvbiB0aGUgYWxnb3JpdGhtIHdoaWNoIGlzIHRoZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgdHJhbnNmb3JtLgorICoKKyAqIGNyeXB0b19mcmVlX3RmbSgpIGZyZWVzIHVwIHRoZSB0cmFuc2Zvcm0gYW5kIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcywKKyAqIHRoZW4gZHJvcHMgdGhlIHJlZmNvdW50IG9uIHRoZSBhc3NvY2lhdGVkIGFsZ29yaXRobS4KKyAqLworc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0Zm1fZmxhZ3MpOwordm9pZCBjcnlwdG9fZnJlZV90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CisKKy8qCisgKiBUcmFuc2Zvcm0gaGVscGVycyB3aGljaCBxdWVyeSB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0uCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX25hbWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbW9kbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKworCWlmIChhbGctPmNyYV9tb2R1bGUpCisJCXJldHVybiBhbGctPmNyYV9tb2R1bGUtPm5hbWU7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB1MzIgY3J5cHRvX3RmbV9hbGdfdHlwZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19tYXhfa2V5c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9tYXhfa2V5c2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2Jsb2Nrc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZGlnZXN0LmRpYV9kaWdlc3RzaXplOworfQorCisvKgorICogQVBJIHdyYXBwZXJzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X2luaXQodGZtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfdXBkYXRlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJdGZtLT5jcnRfZGlnZXN0LmRpdF91cGRhdGUodGZtLCBzZywgbnNnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOworCXRmbS0+Y3J0X2RpZ2VzdC5kaXRfZmluYWwodGZtLCBvdXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF9kaWdlc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKKwl0Zm0tPmNydF9kaWdlc3QuZGl0X2RpZ2VzdCh0Zm0sIHNnLCBuc2csIG91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19kaWdlc3Rfc2V0a2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CisJaWYgKHRmbS0+Y3J0X2RpZ2VzdC5kaXRfc2V0a2V5ID09IE5VTEwpCisJCXJldHVybiAtRU5PU1lTOworCXJldHVybiB0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSh0Zm0sIGtleSwga2V5bGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CisJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZW5jcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJQlVHX09OKHRmbS0+Y3J0X2NpcGhlci5jaXRfbW9kZSA9PSBDUllQVE9fVEZNX01PREVfRUNCKTsKKwlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CisJbWVtY3B5KHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIHNyYywgbGVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOworCW1lbWNweShkc3QsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKK3sKKwlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUyk7CisJcmV0dXJuIHRmbS0+Y3J0X2NvbXByZXNzLmNvdF9jb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfZGVjb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQoreworCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKKwlyZXR1cm4gdGZtLT5jcnRfY29tcHJlc3MuY290X2RlY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cit9CisKKy8qCisgKiBITUFDIHN1cHBvcnQuCisgKi8KKyNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKK3ZvaWQgY3J5cHRvX2htYWNfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbik7Cit2b2lkIGNyeXB0b19obWFjX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7Cit2b2lkIGNyeXB0b19obWFjX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqa2V5bGVuLCB1OCAqb3V0KTsKK3ZvaWQgY3J5cHRvX2htYWMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4sCisgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOworI2VuZGlmCS8qIENPTkZJR19DUllQVE9fSE1BQyAqLworCisjZW5kaWYJLyogX0xJTlVYX0NSWVBUT19IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0MDFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9zY2F0dGVyd2Fsay5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ2lwaGVyIG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogICAgICAgICAgICAgICAyMDAyIEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgorICogICAgICAgICAgICAgICAyMDA0IEplYW4tTHVjIENvb2tlIDxqbGNvb2tlQGNlcnRhaW5rZXkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSAia21hcF90eXBlcy5oIgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2NhdHRlcndhbGsuaCIKKworZW51bSBrbV90eXBlIGNyeXB0b19rbV90eXBlc1tdID0geworCUtNX1VTRVIwLAorCUtNX1VTRVIxLAorCUtNX1NPRlRJUlEwLAorCUtNX1NPRlRJUlExLAorfTsKKwordm9pZCAqc2NhdHRlcndhbGtfd2hpY2hidWYoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgdW5zaWduZWQgaW50IG5ieXRlcywgdm9pZCAqc2NyYXRjaCkKK3sKKwlpZiAobmJ5dGVzIDw9IHdhbGstPmxlbl90aGlzX3BhZ2UgJiYKKwkgICAgKCgodW5zaWduZWQgbG9uZyl3YWxrLT5kYXRhKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyBuYnl0ZXMgPD0KKwkgICAgUEFHRV9DQUNIRV9TSVpFKQorCQlyZXR1cm4gd2Fsay0+ZGF0YTsKKwllbHNlCisJCXJldHVybiBzY3JhdGNoOworfQorCitzdGF0aWMgdm9pZCBtZW1jcHlfZGlyKHZvaWQgKmJ1Ziwgdm9pZCAqc2dkYXRhLCBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KQoreworCWlmIChvdXQpCisJCW1lbWNweShzZ2RhdGEsIGJ1ZiwgbmJ5dGVzKTsKKwllbHNlCisJCW1lbWNweShidWYsIHNnZGF0YSwgbmJ5dGVzKTsKK30KKwordm9pZCBzY2F0dGVyd2Fsa19zdGFydChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCXVuc2lnbmVkIGludCByZXN0X29mX3BhZ2U7CisKKwl3YWxrLT5zZyA9IHNnOworCisJd2Fsay0+cGFnZSA9IHNnLT5wYWdlOworCXdhbGstPmxlbl90aGlzX3NlZ21lbnQgPSBzZy0+bGVuZ3RoOworCisJcmVzdF9vZl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC0gKHNnLT5vZmZzZXQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworCXdhbGstPmxlbl90aGlzX3BhZ2UgPSBtaW4oc2ctPmxlbmd0aCwgcmVzdF9vZl9wYWdlKTsKKwl3YWxrLT5vZmZzZXQgPSBzZy0+b2Zmc2V0OworfQorCit2b2lkIHNjYXR0ZXJ3YWxrX21hcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0KQoreworCXdhbGstPmRhdGEgPSBjcnlwdG9fa21hcCh3YWxrLT5wYWdlLCBvdXQpICsgd2Fsay0+b2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBzY2F0dGVyd2Fsa19wYWdlZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LAorCQkJCSB1bnNpZ25lZCBpbnQgbW9yZSkKK3sKKwkvKiB3YWxrLT5kYXRhIG1heSBiZSBwb2ludGluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbmV4dCBwYWdlOworCSAgIGhvd2V2ZXIsIHdlIGtub3cgd2UgdHJhbnNmZXJlZCBhdCBsZWFzdCBvbmUgYnl0ZS4gIFNvLAorCSAgIHdhbGstPmRhdGEgLSAxIHdpbGwgYmUgYSB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIG1hcHBlZCBwYWdlLiAqLworCisJaWYgKG91dCkKKwkJZmx1c2hfZGNhY2hlX3BhZ2Uod2Fsay0+cGFnZSk7CisKKwlpZiAobW9yZSkgeworCQl3YWxrLT5sZW5fdGhpc19zZWdtZW50IC09IHdhbGstPmxlbl90aGlzX3BhZ2U7CisKKwkJaWYgKHdhbGstPmxlbl90aGlzX3NlZ21lbnQpIHsKKwkJCXdhbGstPnBhZ2UrKzsKKwkJCXdhbGstPmxlbl90aGlzX3BhZ2UgPSBtaW4od2Fsay0+bGVuX3RoaXNfc2VnbWVudCwKKwkJCQkJCSAgKHVuc2lnbmVkKVBBR0VfQ0FDSEVfU0laRSk7CisJCQl3YWxrLT5vZmZzZXQgPSAwOworCQl9CisJCWVsc2UKKwkJCXNjYXR0ZXJ3YWxrX3N0YXJ0KHdhbGssIHNnX25leHQod2Fsay0+c2cpKTsKKwl9Cit9CisKK3ZvaWQgc2NhdHRlcndhbGtfZG9uZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBpbnQgb3V0LCBpbnQgbW9yZSkKK3sKKwljcnlwdG9fa3VubWFwKHdhbGstPmRhdGEsIG91dCk7CisJaWYgKHdhbGstPmxlbl90aGlzX3BhZ2UgPT0gMCB8fCAhbW9yZSkKKwkJc2NhdHRlcndhbGtfcGFnZWRvbmUod2Fsaywgb3V0LCBtb3JlKTsKK30KKworLyoKKyAqIERvIG5vdCBjYWxsIHRoaXMgdW5sZXNzIHRoZSB0b3RhbCBsZW5ndGggb2YgYWxsIG9mIHRoZSBmcmFnbWVudHMKKyAqIGhhcyBiZWVuIHZlcmlmaWVkIGFzIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLgorICovCitpbnQgc2NhdHRlcndhbGtfY29weWNodW5rcyh2b2lkICpidWYsIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCisJCQkgICBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KQoreworCWlmIChidWYgIT0gd2Fsay0+ZGF0YSkgeworCQl3aGlsZSAobmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZSkgeworCQkJbWVtY3B5X2RpcihidWYsIHdhbGstPmRhdGEsIHdhbGstPmxlbl90aGlzX3BhZ2UsIG91dCk7CisJCQlidWYgKz0gd2Fsay0+bGVuX3RoaXNfcGFnZTsKKwkJCW5ieXRlcyAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOworCisJCQljcnlwdG9fa3VubWFwKHdhbGstPmRhdGEsIG91dCk7CisJCQlzY2F0dGVyd2Fsa19wYWdlZG9uZSh3YWxrLCBvdXQsIDEpOworCQkJc2NhdHRlcndhbGtfbWFwKHdhbGssIG91dCk7CisJCX0KKworCQltZW1jcHlfZGlyKGJ1Ziwgd2Fsay0+ZGF0YSwgbmJ5dGVzLCBvdXQpOworCX0KKworCXdhbGstPm9mZnNldCArPSBuYnl0ZXM7CisJd2Fsay0+bGVuX3RoaXNfcGFnZSAtPSBuYnl0ZXM7CisJd2Fsay0+bGVuX3RoaXNfc2VnbWVudCAtPSBuYnl0ZXM7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3NjYXR0ZXJ3YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2NDQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvc2NhdHRlcndhbGsuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDAyIEFkYW0gSi4gUmljaHRlciA8YWRhbUB5Z2dkcmFzaWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0IEplYW4tTHVjIENvb2tlIDxqbGNvb2tlQGNlcnRhaW5rZXkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0NSWVBUT19TQ0FUVEVSV0FMS19ICisjZGVmaW5lIF9DUllQVE9fU0NBVFRFUldBTEtfSAorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisKK3N0cnVjdCBzY2F0dGVyX3dhbGsgeworCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7CisJc3RydWN0IHBhZ2UJCSpwYWdlOworCXZvaWQJCQkqZGF0YTsKKwl1bnNpZ25lZCBpbnQJCWxlbl90aGlzX3BhZ2U7CisJdW5zaWduZWQgaW50CQlsZW5fdGhpc19zZWdtZW50OworCXVuc2lnbmVkIGludAkJb2Zmc2V0OworfTsKKworLyogRGVmaW5lIHNnX25leHQgaXMgYW4gaW5saW5lIHJvdXRpbmUgbm93IGluIGNhc2Ugd2Ugd2FudCB0byBjaGFuZ2UKKyAgIHNjYXR0ZXJsaXN0IHRvIGEgbGlua2VkIGxpc3QgbGF0ZXIuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dfbmV4dChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCXJldHVybiBzZyArIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNjYXR0ZXJ3YWxrX3NhbWVidWYoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2Fsa19pbiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrX291dCwKKwkJCQkgICAgICB2b2lkICpzcmNfcCwgdm9pZCAqZHN0X3ApCit7CisJcmV0dXJuIHdhbGtfaW4tPnBhZ2UgPT0gd2Fsa19vdXQtPnBhZ2UgJiYKKwkgICAgICAgd2Fsa19pbi0+b2Zmc2V0ID09IHdhbGtfb3V0LT5vZmZzZXQgJiYKKwkgICAgICAgd2Fsa19pbi0+ZGF0YSA9PSBzcmNfcCAmJiB3YWxrX291dC0+ZGF0YSA9PSBkc3RfcDsKK30KKwordm9pZCAqc2NhdHRlcndhbGtfd2hpY2hidWYoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgdW5zaWduZWQgaW50IG5ieXRlcywgdm9pZCAqc2NyYXRjaCk7Cit2b2lkIHNjYXR0ZXJ3YWxrX3N0YXJ0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpOworaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KTsKK3ZvaWQgc2NhdHRlcndhbGtfbWFwKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQpOwordm9pZCBzY2F0dGVyd2Fsa19kb25lKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQsIGludCBtb3JlKTsKKworI2VuZGlmICAvKiBfQ1JZUFRPX1NDQVRURVJXQUxLX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTFfY3J5cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTFfY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhM2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMV9jcnlwdC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIG9uIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAqIDxqa21hbGluZUBjYy5odXQuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorICoKKyAqIEFkYXB0aW9uIHRvIGEgZ2VuZXJpYyBJRUVFIDgwMi4xMSBzdGFjayBieSBKYW1lcyBLZXRyZW5vcworICogPGprZXRyZW5vQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgaWVlZTgwMjExIGNyeXB0byBtb2R1bGUuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0NSWVBUX0gKKyNkZWZpbmUgSUVFRTgwMjExX0NSWVBUX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBpbml0IG5ldyBjcnlwdG8gY29udGV4dCAoZS5nLiwgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHNwYWNlLAorCSAqIHNlbGVjdCBJViwgZXRjLik7IHJldHVybnMgTlVMTCBvbiBmYWlsdXJlIG9yIHBvaW50ZXIgdG8gYWxsb2NhdGVkCisJICogcHJpdmF0ZSBkYXRhIG9uIHN1Y2Nlc3MgKi8KKwl2b2lkICogKCppbml0KShpbnQga2V5aWR4KTsKKworCS8qIGRlaW5pdGlhbGl6ZSBjcnlwdG8gY29udGV4dCBhbmQgZnJlZSBhbGxvY2F0ZWQgcHJpdmF0ZSBkYXRhICovCisJdm9pZCAoKmRlaW5pdCkodm9pZCAqcHJpdik7CisKKwkvKiBlbmNyeXB0L2RlY3J5cHQgcmV0dXJuIDwgMCBvbiBlcnJvciBvciA+PSAwIG9uIHN1Y2Nlc3MuIFRoZSByZXR1cm4KKwkgKiB2YWx1ZSBmcm9tIGRlY3J5cHRfbXBkdSBpcyBwYXNzZWQgYXMgdGhlIGtleWlkeCB2YWx1ZSBmb3IKKwkgKiBkZWNyeXB0X21zZHUuIHNrYiBtdXN0IGhhdmUgZW5vdWdoIGhlYWQgYW5kIHRhaWwgcm9vbSBmb3IgdGhlCisJICogZW5jcnlwdGlvbjsgaWYgbm90LCBlcnJvciB3aWxsIGJlIHJldHVybmVkOyB0aGVzZSBmdW5jdGlvbnMgYXJlCisJICogY2FsbGVkIGZvciBhbGwgTVBEVXMgKGkuZS4sIGZyYWdtZW50cykuCisJICovCisJaW50ICgqZW5jcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisJaW50ICgqZGVjcnlwdF9tcGR1KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdik7CisKKwkvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmb3IgZnVsbCBNU0RVcywgaS5lLiBmdWxsIGZyYW1lcy4KKwkgKiBUaGVzZSBjYW4gYmUgTlVMTCBpZiBmdWxsIE1TRFUgb3BlcmF0aW9ucyBhcmUgbm90IG5lZWRlZC4gKi8KKwlpbnQgKCplbmNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBoZHJfbGVuLCB2b2lkICpwcml2KTsKKwlpbnQgKCpkZWNyeXB0X21zZHUpKHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsIGludCBoZHJfbGVuLAorCQkJICAgIHZvaWQgKnByaXYpOworCisJaW50ICgqc2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKKwlpbnQgKCpnZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOworCisJLyogcHJvY2ZzIGhhbmRsZXIgZm9yIHByaW50aW5nIG91dCBrZXkgaW5mb3JtYXRpb24gYW5kIHBvc3NpYmxlCisJICogc3RhdGlzdGljcyAqLworCWNoYXIgKiAoKnByaW50X3N0YXRzKShjaGFyICpwLCB2b2lkICpwcml2KTsKKworCS8qIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIGJ5IGVuY3J5cHRpb247IGVuY3J5cHQgYnVmIGlzCisJICogYWxsb2NhdGVkIHdpdGggZXh0cmFfcHJlZml4X2xlbiBieXRlcywgY29weSBvZiBpbl9idWYsIGFuZAorCSAqIGV4dHJhX3Bvc3RmaXhfbGVuOyBlbmNyeXB0IG5lZWQgbm90IHVzZSBhbGwgdGhpcyBzcGFjZSwgYnV0CisJICogdGhlIHJlc3VsdCBtdXN0IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbmQgY29ycmVjdAorCSAqIGxlbmd0aCBtdXN0IGJlIHJldHVybmVkICovCisJaW50IGV4dHJhX3ByZWZpeF9sZW4sIGV4dHJhX3Bvc3RmaXhfbGVuOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogZGVsYXllZCBkZWxldGlvbiBsaXN0ICovCisJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHM7CisJdm9pZCAqcHJpdjsKKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitpbnQgaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpOworc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICogaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiwgaW50KTsKK3ZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwordm9pZCBpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF85M2N4Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzhjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuYwpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAgIFRoaXMgZmlsZXMgY29udGFpbnMgY2FyZCBlZXByb20gKDkzYzQ2IG9yIDkzYzU2KSBwcm9ncmFtbWluZyByb3V0aW5lcywKKyAgIG1lbW9yeSBpcyBhZGRyZXNzZWQgYnkgMTYgYml0cyB3b3Jkcy4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisgICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlci4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorICAgZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIuCisKKyAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgorICAgcHJvamVjdCBBdXRob3JzLgorKi8KKworI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiCisKK3ZvaWQgZXByb21fY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQoreworCWlmKGJpdCkKKwkJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwKKwkJCSAgICAgICAoMTw8RVBST01fQ1NfU0hJRlQpIHwgXAorCQkJICAgICAgIHJlYWRfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCkpOyAvL2VuYWJsZSBFUFJPTQorCWVsc2UKKwkJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwgcmVhZF9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01EKVwKKwkJCSAgICAgICAmfigxPDxFUFJPTV9DU19TSElGVCkpOyAvL2Rpc2FibGUgRVBST00KKworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKK30KKworCit2b2lkIGVwcm9tX2NrX2N5Y2xlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgICgxPDxFUFJPTV9DS19TSElGVCkgfCByZWFkX25pY19ieXRlX0UoZGV2LEVQUk9NX0NNRCkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgcmVhZF9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01EKSAmfiAoMTw8RVBST01fQ0tfU0hJRlQpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCXVkZWxheShFUFJPTV9ERUxBWSk7Cit9CisKKwordm9pZCBlcHJvbV93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsc2hvcnQgYml0KQoreworCWlmKGJpdCkKKwkJd3JpdGVfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCwgKDE8PEVQUk9NX1dfU0hJRlQpIHwgXAorCQkJICAgICAgIHJlYWRfbmljX2J5dGVfRShkZXYsRVBST01fQ01EKSk7CisJZWxzZQorCQl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01ELCByZWFkX25pY19ieXRlX0UoZGV2LEVQUk9NX0NNRClcCisJCQkgICAgICAgJn4oMTw8RVBST01fV19TSElGVCkpOworCisJZm9yY2VfcGNpX3Bvc3RpbmcoZGV2KTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3Nob3J0IGVwcm9tX3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBiaXQ7CisKKwliaXQ9KHJlYWRfbmljX2J5dGVfRShkZXYsIEVQUk9NX0NNRCkgJiAoMTw8RVBST01fUl9TSElGVCkgKTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYoYml0KSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYltdLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yKGk9MDsgaTxsZW47IGkrKyl7CisJCWVwcm9tX3coZGV2LCBiW2ldKTsKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwl9Cit9CisKKwordTMyIGVwcm9tX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXNob3J0IHJlYWRfY21kW109ezEsMSwwfTsKKwlzaG9ydCBhZGRyX3N0cls4XTsKKwlpbnQgaTsKKwlpbnQgYWRkcl9sZW47CisJdTMyIHJldDsKKworCXJldD0wOworICAgICAgICAvL2VuYWJsZSBFUFJPTSBwcm9ncmFtbWluZworCXdyaXRlX25pY19ieXRlX0UoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoRVBST01fQ01EX1BST0dSQU08PEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCkpOworCWZvcmNlX3BjaV9wb3N0aW5nKGRldik7CisJdWRlbGF5KEVQUk9NX0RFTEFZKTsKKworCWlmIChwcml2LT5lcHJvbXR5cGU9PUVQUk9NXzkzYzU2KXsKKwkJYWRkcl9zdHJbN109YWRkciAmIDE7CisJCWFkZHJfc3RyWzZdPWFkZHIgJiAoMTw8MSk7CisJCWFkZHJfc3RyWzVdPWFkZHIgJiAoMTw8Mik7CisJCWFkZHJfc3RyWzRdPWFkZHIgJiAoMTw8Myk7CisJCWFkZHJfc3RyWzNdPWFkZHIgJiAoMTw8NCk7CisJCWFkZHJfc3RyWzJdPWFkZHIgJiAoMTw8NSk7CisJCWFkZHJfc3RyWzFdPWFkZHIgJiAoMTw8Nik7CisJCWFkZHJfc3RyWzBdPWFkZHIgJiAoMTw8Nyk7CisJCWFkZHJfbGVuPTg7CisJfWVsc2V7CisJCWFkZHJfc3RyWzVdPWFkZHIgJiAxOworCQlhZGRyX3N0cls0XT1hZGRyICYgKDE8PDEpOworCQlhZGRyX3N0clszXT1hZGRyICYgKDE8PDIpOworCQlhZGRyX3N0clsyXT1hZGRyICYgKDE8PDMpOworCQlhZGRyX3N0clsxXT1hZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clswXT1hZGRyICYgKDE8PDUpOworCQlhZGRyX2xlbj02OworCX0KKwllcHJvbV9jcyhkZXYsIDEpOworCWVwcm9tX2NrX2N5Y2xlKGRldik7CisJZXByb21fc2VuZF9iaXRzX3N0cmluZyhkZXYsIHJlYWRfY21kLCAzKTsKKwllcHJvbV9zZW5kX2JpdHNfc3RyaW5nKGRldiwgYWRkcl9zdHIsIGFkZHJfbGVuKTsKKworCS8va2VlcCBjaGlwIHBpbiBEIHRvIGxvdyBzdGF0ZSB3aGlsZSByZWFkaW5nLgorCS8vSSdtIHVuc3VyZSBpZiBpdCBpcyBuZWNlc3NhcnksIGJ1dCBhbnl3YXkgc2hvdWxkbid0IGh1cnQKKwllcHJvbV93KGRldiwgMCk7CisKKwlmb3IoaT0wO2k8MTY7aSsrKXsKKwkJLy9lZXByb20gbmVlZHMgYSBjbGsgY3ljbGUgYmV0d2VlbiB3cml0aW5nIG9wY29kZSZhZHIKKwkJLy9hbmQgcmVhZGluZyBkYXRhLiAoZWVwcm9tIG91dHMgYSBkdW1teSAwKQorCQllcHJvbV9ja19jeWNsZShkZXYpOworCQlyZXQgfD0gKGVwcm9tX3IoZGV2KTw8KDE1LWkpKTsKKwl9CisKKwllcHJvbV9jcyhkZXYsIDApOworCWVwcm9tX2NrX2N5Y2xlKGRldik7CisKKwkvL2Rpc2FibGUgRVBST00gcHJvZ3JhbW1pbmcKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgRVBST01fQ01ELAorCQkgICAgICAgKEVQUk9NX0NNRF9OT1JNQUw8PEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCkpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF85M2N4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2FjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfOTNjeDYuaApAQCAtMCwwICsxLDQwIEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTg3IE9wZW5Tb3VyY2UgZHJpdmVyCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKwlSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorCisJV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiBzdWNoIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgorKi8KKworLypUaGlzIGZpbGVzIGNvbnRhaW5zIGNhcmQgZWVwcm9tICg5M2M0NiBvciA5M2M1NikgcHJvZ3JhbW1pbmcgcm91dGluZXMqLworLyptZW1vcnkgaXMgYWRkcmVzc2VkIGJ5IFdPUkRTKi8KKworI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorCisjZGVmaW5lIEVQUk9NX0RFTEFZIDEwCisKKyNkZWZpbmUgRVBST01fQU5BUEFSQU1fQUREUkxXT1JEIDB4ZAorI2RlZmluZSBFUFJPTV9BTkFQQVJBTV9BRERSSFdPUkQgMHhlCisKKyNkZWZpbmUgRVBST01fUkZDSElQSUQgMHg2CisjZGVmaW5lIEVQUk9NX1RYUFdfQkFTRSAweDA1CisjZGVmaW5lIEVQUk9NX1JGQ0hJUElEX1JUTDgyMjVVIDUKKyNkZWZpbmUgRVBST01fUkZfUEFSQU0gMHg0CisjZGVmaW5lIEVQUk9NX0NPTkZJRzIgMHhjCisKKyNkZWZpbmUgRVBST01fVkVSU0lPTiAweDFFCisjZGVmaW5lIE1BQ19BRFIgMHg3CisKKyNkZWZpbmUgQ0lTIDB4MTgKKworI2RlZmluZSBFUFJPTV9UWFBXMCAweDE2CisjZGVmaW5lIEVQUk9NX1RYUFcyIDB4MWIKKyNkZWZpbmUgRVBST01fVFhQVzEgMHgzZAorCisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdTMyIGFkZHIpOyAvL3JlYWRzIGEgMTYgYml0cyB3b3JkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNThkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCisgICBXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCisgICBUaGlzIGNvZGUgaXMgY3VycmVudGx5IGp1c3QgYSBwbGFjZWhvbGRlciBmb3IgbGF0ZXIgd29yayBhbmQKKyAgIGRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KKworICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisqLworCisjaWZkZWYgQ09ORklHX1JUTDgxODBfUE0KKworCisjaW5jbHVkZSAicjgxODBfaHcuaCIKKyNpbmNsdWRlICJyODE4MF9wbS5oIgorCitpbnQgcnRsODE4MF9zYXZlX3N0YXRlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCBzYXZlIHN0YXRlIGNhbGwgKHN0YXRlICV1KS5cbiIsIHN0YXRlKTsKKwlyZXR1cm4oLUVBR0FJTik7Cit9CisKKworaW50IHJ0bDgxODBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoreworCXByaW50ayhLRVJOX05PVElDRSAicjgxODAgc3VzcGVuZCBjYWxsIChzdGF0ZSAldSkuXG4iLCBzdGF0ZSk7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCisKK2ludCBydGw4MTgwX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgInI4MTgwIHJlc3VtZSBjYWxsLlxuIik7CisJcmV0dXJuKC1FQUdBSU4pOworfQorCisKK2ludCBydGw4MTgwX2VuYWJsZV93YWtlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUsIGludCBlbmFibGUpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJyODE4MCBlbmFibGUgd2FrZSBjYWxsIChzdGF0ZSAldSwgZW5hYmxlICVkKS5cbiIsCisJICAgICAgIHN0YXRlLCBlbmFibGUpOworCXJldHVybigtRUFHQUlOKTsKK30KKworCisKKyNlbmRpZiAvL0NPTkZJR19SVEw4MTgwX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE4MF9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDE4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxODBfcG0uaApAQCAtMCwwICsxLDI4IEBACisvKgorICAgICAgICBQb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KKwlXcml0dGVuIGJ5IE1hcml1c3ogTWF0dXN6ZWsuCisJVGhpcyBjb2RlIGlzIGN1cnJlbnRseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIGxhdGVyIHdvcmsgYW5kCisJZG9lcyBub3QgZG8gYW55dGhpbmcgdXNlZnVsLgorCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIuCisJQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworKi8KKworI2lmZGVmIENPTkZJR19SVEw4MTgwX1BNCisKKyNpZm5kZWYgUjgxODBfUE1fSAorI2RlZmluZSBSODE4MF9QTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCitpbnQgcnRsODE4MF9zYXZlX3N0YXRlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1MzIgc3RhdGUpOworaW50IHJ0bDgxODBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKTsKK2ludCBydGw4MTgwX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKmRldik7CitpbnQgcnRsODE4MF9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKTsKKworI2VuZGlmIC8vUjgxODBfUE1fSAorCisjZW5kaWYgLy8gQ09ORklHX1JUTDgxODBfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZmYzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxOTIgZHJpdmVyCisgIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgorCisgIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyNTYKKyAgcmFkaW8gZnJvbnRlbmQuCisKKyAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQorCisqLworCisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOTJVX2h3LmgiCisjaW5jbHVkZSAicjgxOXhVX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTl4VV9waHkuaCIKKyNpbmNsdWRlICJyODE5MF9ydGw4MjU2LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE92ZXJ2aWV3OiAgIAlzZXQgUkYgYmFuZCB3aWR0aCAoMjBNIG9yIDQwTSkKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSoJZGV2CisgKiAJCVdJUkVMRVNTX0JBTkRXSURUSF9FCUJhbmR3aWR0aAkvLzIwTSBvciA0ME0KKyAqIE91dHB1dDogICAgICBOT05FCisgKiBSZXR1cm46ICAgICAgTk9ORQorICogTm90ZToJODIyNiBzdXBwb3J0IGJvdGggMjBNICBhbmQgNDAgTUh6CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoc3RydWN0IG5ldF9kZXZpY2UqIGRldiAsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoKQkvLzIwTSBvciA0ME0KK3sKKwl1OAllUkZQYXRoOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vZm9yKGVSRlBhdGggPSBSRjkwX1BBVEhfQTsgZVJGUGF0aCA8cEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJZm9yKGVSRlBhdGggPSAwOyBlUkZQYXRoIDxSRjkwX1BBVEhfTUFYOyBlUkZQYXRoKyspCisJeworCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorCQkJCWNvbnRpbnVlOworCisJCXN3aXRjaChCYW5kd2lkdGgpCisJCXsKKwkJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKKwkJCQlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOXhVX0EgfHwgcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTl4VV9CKS8vIDgyNTYgRC1jdXQsIEUtY3V0LCB4aW9uZzogY29uc2lkZXIgaXQgbGF0ZXIhCisJCQkJeworCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBiLCBiTWFzazEyQml0cywgMHgxMDApOyAvL3BoeSBwYXJhOjFiYQorCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDJjLCBiTWFzazEyQml0cywgMHgzZDcpOworCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBlLCBiTWFzazEyQml0cywgMHgwMjEpOworCisJCQkJCS8vY29zYSBhZGQgZm9yIHNkMydzIHJlcXVlc3QgMDEvMjMvMjAwOAorCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDE0LCBiTWFzazEyQml0cywgMHg1YWIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJCQlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOXhVX0EgfHxwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOXhVX0IpLy8gODI1NiBELWN1dCwgRS1jdXQsIHhpb25nOiBjb25zaWRlciBpdCBsYXRlciEKKwkJCQl7CisJCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIDB4MGIsIGJNYXNrMTJCaXRzLCAweDMwMCk7IC8vcGh5IHBhcmE6M2JhCisJCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIDB4MmMsIGJNYXNrMTJCaXRzLCAweDNkZik7CisJCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIDB4MGUsIGJNYXNrMTJCaXRzLCAweDBhMSk7CisKKwkJCQkJLy9jb3NhIGFkZCBmb3Igc2QzJ3MgcmVxdWVzdCAwMS8yMy8yMDA4CisJCQkJCWlmKHByaXYtPmNoYW4gPT0gMyB8fCBwcml2LT5jaGFuID09IDkpIC8vSSBuZWVkIHRvIHNldCBwcml2LT5jaGFuIHdoZW5ldmVyIGN1cnJlbnQgY2hhbm5lbCBjaGFuZ2VzCisJCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDE0LCBiTWFzazEyQml0cywgMHg1OWIpOworCQkJCQllbHNlCisJCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDE0LCBiTWFzazEyQml0cywgMHg1YWIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKKwkJCQl9CisKKworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biBCYW5kd2lkdGg6ICUjWFxuIixCYW5kd2lkdGggKTsKKwkJCQlicmVhazsKKworCQl9CisJfQorCXJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE92ZXJ2aWV3OiAgICBJbnRlcmZhY2UgdG8gY29uZmlnIDgyNTYKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSoJZGV2CisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgUEhZX1JGODI1Nl9Db25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy8gSW5pdGlhbGl6ZSBnZW5lcmFsIGdsb2JhbCB2YWx1ZQorCS8vCisJLy8gVE9ETzogRXh0ZW5kIFJGX1BBVEhfQyBhbmQgUkZfUEFUSF9EIGluIHRoZSBmdXR1cmUKKwlwcml2LT5OdW1Ub3RhbFJGUGF0aCA9IFJUTDgxOVhfVE9UQUxfUkZfUEFUSDsKKwkvLyBDb25maWcgQkIgYW5kIFJGCisJcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGUoZGV2KTsKKworCXJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE92ZXJ2aWV3OiAgICBJbnRlcmZhY2UgdG8gY29uZmlnIDgyNTYKKyAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSoJZGV2CisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1MzIgCXU0UmVnVmFsdWUgPSAwOworCS8vc3RhdGljIHMxQnl0ZQkJCQlzelJhZGlvQUZpbGVbXSA9IFJUTDgxOVhfUEhZX1JBRElPX0E7CisJLy9zdGF0aWMgczFCeXRlCQkJCXN6UmFkaW9CRmlsZVtdID0gUlRMODE5WF9QSFlfUkFESU9fQjsKKwkvL3N0YXRpYyBzMUJ5dGUJCQkJc3pSYWRpb0NGaWxlW10gPSBSVEw4MTlYX1BIWV9SQURJT19DOworCS8vc3RhdGljIHMxQnl0ZQkJCQlzelJhZGlvREZpbGVbXSA9IFJUTDgxOVhfUEhZX1JBRElPX0Q7CisJdTggCWVSRlBhdGg7CisJQkJfUkVHSVNURVJfREVGSU5JVElPTl9UCSpwUGh5UmVnOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIJUmVnT2ZmU2V0VG9CZUNoZWNrID0gMHgzOworCXUzMiAJUmVnVmFsdWVUb0JlQ2hlY2sgPSAweDdmMTsKKwl1MzIJUkYzX0ZpbmFsX1ZhbHVlID0gMDsKKwl1OAlDb25zdFJldHJ5VGltZXMgPSA1LCBSZXRyeVRpbWVzID0gNTsKKwl1OCByZXQgPSAwOworCS8vMy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLzMvLyA8Mj4gSW5pdGlhbGl6ZSBSRgorCS8vMy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlmb3IoZVJGUGF0aCA9IChSRjkwX1JBRElPX1BBVEhfRSlSRjkwX1BBVEhfQTsgZVJGUGF0aCA8cHJpdi0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykKKwl7CisJCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKGRldiwgZVJGUGF0aCkpCisJCQkJY29udGludWU7CisKKwkJcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisKKwkJLy8gSm9zZXBoIHRlc3QgZm9yIHNob3J0ZW4gUkYgY29uZmlnCisJLy8JcEhhbERhdGEtPlJmUmVnMFZhbHVlW2VSRlBhdGhdID0gIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgckdsb2JhbEN0cmwsIGJNYXNrRFdvcmQpOworCisJCS8qLS0tLVN0b3JlIG9yaWdpbmFsIFJGRU5WIGNvbnRyb2wgdHlwZS0tLS0qLworCQlzd2l0Y2goZVJGUGF0aCkKKwkJeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQljYXNlIFJGOTBfUEFUSF9DOgorCQkJdTRSZWdWYWx1ZSA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZnMsIGJSRlNJX1JGRU5WKTsKKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9CIDoKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCXU0UmVnVmFsdWUgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVjw8MTYpOworCQkJYnJlYWs7CisJCX0KKworCQkvKi0tLS1TZXQgUkZfRU5WIGVuYWJsZS0tLS0qLworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmZSwgYlJGU0lfUkZFTlY8PDE2LCAweDEpOworCisJCS8qLS0tLVNldCBSRl9FTlYgb3V0cHV0IGhpZ2gtLS0tKi8KKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50Zm8sIGJSRlNJX1JGRU5WLCAweDEpOworCisJCS8qIFNldCBiaXQgbnVtYmVyIG9mIEFkZHJlc3MgYW5kIERhdGEgZm9yIFJGIHJlZ2lzdGVyICovCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgYjNXaXJlQWRkcmVzc0xlbmd0aCwgMHgwKTsgCS8vIFNldCAwIHRvIDQgYml0cyBmb3IgWi1zZXJpYWwgYW5kIHNldCAxIHRvIDYgYml0cyBmb3IgODI1OAorCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGIzV2lyZURhdGFMZW5ndGgsIDB4MCk7CS8vIFNldCAwIHRvIDEyIGJpdHMgZm9yIFotc2VyaWFsIGFuZCA4MjU4LCBhbmQgc2V0IDEgdG8gMTQgYml0cyBmb3IgPz8/CisKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpIGVSRlBhdGgsIDB4MCwgYk1hc2sxMkJpdHMsIDB4YmYpOworCisJCS8qLS0tLUNoZWNrIFJGIGJsb2NrIChmb3IgRlBHQSBwbGF0Zm9ybSBvbmx5KS0tLS0qLworCQkvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW1vdmVkIG9uIEFTSUMgLCBFbWlseSAyMDA3LjIuMgorCQlpZiAocnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKGRldiwgSFc5MF9CTE9DS19SRiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgpKQorCQl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9SRjgyNTZfQ29uZmlnKCk6Q2hlY2sgUmFkaW9bJWRdIEZhaWwhIVxuIiwgZVJGUGF0aCk7CisJCQlnb3RvIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlX0ZhaWw7CisJCX0KKworCQlSZXRyeVRpbWVzID0gQ29uc3RSZXRyeVRpbWVzOworCQlSRjNfRmluYWxfVmFsdWUgPSAwOworCQkvKi0tLS1Jbml0aWFsaXplIFJGIGZvbSBjb25uZmlndXJhdGlvbiBmaWxlLS0tLSovCisJCXN3aXRjaChlUkZQYXRoKQorCQl7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCisJCQl7CisJCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShkZXYsKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgpOworCQkJCVJGM19GaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBiTWFzazEyQml0cyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwgZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBSRjNfRmluYWxfVmFsdWUpOworCQkJCVJldHJ5VGltZXMtLTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9COgorCQkJd2hpbGUoUkYzX0ZpbmFsX1ZhbHVlIT1SZWdWYWx1ZVRvQmVDaGVjayAmJiBSZXRyeVRpbWVzIT0wKQorCQkJeworCQkJCXJldCA9IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoZGV2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKKwkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgYk1hc2sxMkJpdHMpOworCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCB2YWx1ZTogJXhcbiIsIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSZXRyeVRpbWVzLS07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQzoKKwkJCXdoaWxlKFJGM19GaW5hbF9WYWx1ZSE9UmVnVmFsdWVUb0JlQ2hlY2sgJiYgUmV0cnlUaW1lcyE9MCkKKwkJCXsKKwkJCQlyZXQgPSBydGw4MTkyX3BoeV9Db25maWdSRldpdGhIZWFkZXJGaWxlKGRldiwoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCk7CisJCQkJUkYzX0ZpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUmV0cnlUaW1lcy0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0Q6CisJCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCisJCQl7CisJCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShkZXYsKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgpOworCQkJCVJGM19GaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBiTWFzazEyQml0cyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwgZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLCBSRjNfRmluYWxfVmFsdWUpOworCQkJCVJldHJ5VGltZXMtLTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyotLS0tUmVzdG9yZSBSRkVOViBjb250cm9sIHR5cGUtLS0tKi87CisJCXN3aXRjaChlUkZQYXRoKQorCQl7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmcywgYlJGU0lfUkZFTlYsIHU0UmVnVmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0IgOgorCQljYXNlIFJGOTBfUEFUSF9EOgorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZnMsIGJSRlNJX1JGRU5WPDwxNiwgdTRSZWdWYWx1ZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmKHJldCl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKCk6UmFkaW9bJWRdIEZhaWwhISIsIGVSRlBhdGgpOworCQkJZ290byBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZV9GYWlsOworCQl9CisKKwl9CisKKwlSVF9UUkFDRShDT01QX1BIWSwgIlBIWSBJbml0aWFsaXphdGlvbiBTdWNjZXNzXG4iKSA7CisJcmV0dXJuIDsKKworcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDoKKwlSVF9UUkFDRShDT01QX0VSUiwgIlBIWSBJbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpIDsKKwlyZXR1cm4gOworfQorCisKK3ZvaWQgUEhZX1NldFJGODI1NkNDS1R4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqCWRldiwgdTgJcG93ZXJsZXZlbCkKK3sKKwl1MzIJVHhBR0M9MDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9tb2RpZmllZCBieSB2aXZpLCAyMDA4MDEwOQorCVR4QUdDID0gcG93ZXJsZXZlbDsKKworCWlmKHByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9PSBUUlVFICkgLy9jb3NhIDA1LzIyLzIwMDggZm9yIHNjYW4KKwl7CisJCWlmKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKKwkJCVR4QUdDID0gMHgyMjsKKwkJZWxzZQorCQlUeEFHQyArPSBwcml2LT5DY2tQd0VubDsKKwl9CisKKwlpZihUeEFHQyA+IDB4MjQpCisJCVR4QUdDID0gMHgyNDsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgclR4QUdDX0NDS19NY3MzMiwgYlR4QUdDUmF0ZUNDSywgVHhBR0MpOworfQorCisKK3ZvaWQgUEhZX1NldFJGODI1Nk9GRE1UeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IHBvd2VybGV2ZWwpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vSm9zZXBoIFR4UG93ZXIgZm9yIDgxOTIgdGVzdGluZworCXUzMiB3cml0ZVZhbCwgcG93ZXJCYXNlMCwgcG93ZXJCYXNlMSwgd3JpdGVWYWxfdG1wOworCXU4IGluZGV4ID0gMDsKKwl1MTYgUmVnT2Zmc2V0WzZdID0gezB4ZTAwLCAweGUwNCwgMHhlMTAsIDB4ZTE0LCAweGUxOCwgMHhlMWN9OworCXU4IGJ5dGUwLCBieXRlMSwgYnl0ZTIsIGJ5dGUzOworCisJcG93ZXJCYXNlMCA9IHBvd2VybGV2ZWwgKyBwcml2LT5UeFBvd2VyRGlmZjsJLy9PRkRNIHJhdGVzCisJcG93ZXJCYXNlMCA9IChwb3dlckJhc2UwPDwyNCkgfCAocG93ZXJCYXNlMDw8MTYpIHwocG93ZXJCYXNlMDw8OCkgfHBvd2VyQmFzZTA7CisJcG93ZXJCYXNlMSA9IHBvd2VybGV2ZWw7CQkJCQkJCS8vTUNTIHJhdGVzCisJcG93ZXJCYXNlMSA9IChwb3dlckJhc2UxPDwyNCkgfCAocG93ZXJCYXNlMTw8MTYpIHwocG93ZXJCYXNlMTw8OCkgfHBvd2VyQmFzZTE7CisKKwlmb3IoaW5kZXg9MDsgaW5kZXg8NjsgaW5kZXgrKykKKwl7CisJCXdyaXRlVmFsID0gcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaW5kZXhdICsgKChpbmRleDwyKT9wb3dlckJhc2UwOnBvd2VyQmFzZTEpOworCQlieXRlMCA9ICh1OCkod3JpdGVWYWwgJiAweDdmKTsKKwkJYnl0ZTEgPSAodTgpKCh3cml0ZVZhbCAmIDB4N2YwMCk+PjgpOworCQlieXRlMiA9ICh1OCkoKHdyaXRlVmFsICYgMHg3ZjAwMDApPj4xNik7CisJCWJ5dGUzID0gKHU4KSgod3JpdGVWYWwgJiAweDdmMDAwMDAwKT4+MjQpOworCQlpZihieXRlMCA+IDB4MjQpCS8vIE1heCBwb3dlciBpbmRleCA9IDB4MjQKKwkJCWJ5dGUwID0gMHgyNDsKKwkJaWYoYnl0ZTEgPiAweDI0KQorCQkJYnl0ZTEgPSAweDI0OworCQlpZihieXRlMiA+IDB4MjQpCisJCQlieXRlMiA9IDB4MjQ7CisJCWlmKGJ5dGUzID4gMHgyNCkKKwkJCWJ5dGUzID0gMHgyNDsKKworCQkvL2ZvciB0eCBwb3dlciB0cmFjaworCQlpZihpbmRleCA9PSAzKQorCQl7CisJCQl3cml0ZVZhbF90bXAgPSAoYnl0ZTM8PDI0KSB8IChieXRlMjw8MTYpIHwoYnl0ZTE8PDgpIHxieXRlMDsKKwkJCXByaXYtPlB3cl9UcmFjayA9IHdyaXRlVmFsX3RtcDsKKwkJfQorCisJCWlmKHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPT0gVFJVRSkgICAgIC8vQWRkIGJ5IEphY2tlbiAyMDA4LzAzLzA2CisJCXsKKwkJCS8vIEVtaWx5LCAyMDA4MDYxMy4gU2V0IGxvdyB0eCBwb3dlciBmb3IgYm90aCBNQ1MgYW5kIGxlZ2FjeSBPRkRNCisJCQl3cml0ZVZhbCA9IDB4MDMwMzAzMDM7CisJCX0KKwkJZWxzZQorCQl7CisJCQl3cml0ZVZhbCA9IChieXRlMzw8MjQpIHwgKGJ5dGUyPDwxNikgfChieXRlMTw8OCkgfGJ5dGUwOworCQl9CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSZWdPZmZzZXRbaW5kZXhdLCAweDdmN2Y3ZjdmLCB3cml0ZVZhbCk7CisJfQorCXJldHVybjsKKworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzFmNjUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuaApAQCAtMCwwICsxLDI3IEBACisvKgorICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlcgorICByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KKyAgQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBUaGlzIGZpbGVzIGNvbnRhaW5zIHByb2dyYW1taW5nIGNvZGUgZm9yIHRoZSBydGw4MjU2CisgIHJhZGlvIGZyb250ZW5kLgorCisgICpNYW55KiB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKKworKi8KKworI2lmbmRlZiBSVEw4MjI1SAorI2RlZmluZSBSVEw4MjI1SAorCisjaWZkZWYgUlRMODE5MFAKKyNkZWZpbmUgUlRMODE5WF9UT1RBTF9SRl9QQVRIIDQgLy9mb3IgOTBQCisjZWxzZQorI2RlZmluZSBSVEw4MTlYX1RPVEFMX1JGX1BBVEggMiAvL2ZvciA4MTkyVQorI2VuZGlmCitleHRlcm4gdm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCk7CitleHRlcm4gdm9pZCBQSFlfUkY4MjU2X0NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkNDS1R4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqCWRldiwgdTgJcG93ZXJsZXZlbCk7CitleHRlcm4gdm9pZCBQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggcG93ZXJsZXZlbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTI3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKQEAgLTAsMCArMSwxMjYzIEBACisvKgorICAgVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODcgT3BlblNvdXJjZSBkcml2ZXIuCisgICBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKKyAgIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE5MiBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbgorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKKworICAgV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyCisgICBwcm9qZWN0IEF1dGhvcnMuCisqLworCisjaWZuZGVmIFI4MTl4VV9ICisjZGVmaW5lIFI4MTl4VV9ICisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorLy8jaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkvL2ZvciBydG5sX2xvY2soKQorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CS8vIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJpZWVlODAyMTEuaCIKKworI2RlZmluZSBSVEw4MTkyVQorI2RlZmluZSBSVEw4MTl4VV9NT0RVTEVfTkFNRSAicnRsODE5eFUiCisvL2FkZGVkIGZvciBIVyBzZWN1cml0eSwgam9obi4wNjI5CisjZGVmaW5lIEZBTFNFIDAKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIE1BWF9LRVlfTEVOICAgICA2MQorI2RlZmluZSBLRVlfQlVGX1NJWkUgICAgNQorCisjZGVmaW5lIEJJVDAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEJJVDEgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEJJVDIgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEJJVDMgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEJJVDQgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEJJVDUgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEJJVDYgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEJJVDcgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEJJVDggICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEJJVDkgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEJJVDEwICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEJJVDExICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEJJVDEyICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEJJVDEzICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEJJVDE0ICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEJJVDE1ICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEJJVDE2ICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3ICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEJJVDE4ICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEJJVDE5ICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEJJVDIxICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEJJVDIyICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEJJVDI0ICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEJJVDI1ICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2ICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEJJVDI3ICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEJJVDI4ICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5ICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEJJVDMwICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEJJVDMxICAgICAgICAgICAweDgwMDAwMDAwCisKKy8vIFJ4IHNtb290aCBmYWN0b3IKKyNkZWZpbmUJUnhfU21vb3RoX0ZhY3RvcgkJMjAKKyNkZWZpbmUgRE1FU0coeCxhLi4uKQorI2RlZmluZSBETUVTR1coeCxhLi4uKQorI2RlZmluZSBETUVTR0UoeCxhLi4uKQorZXh0ZXJuIHUzMiBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50OworI2RlZmluZSBSVF9UUkFDRShjb21wb25lbnQsIHgsIGFyZ3MuLi4pIFwKK2RvIHsgaWYocnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCAmIGNvbXBvbmVudCkgXAorCXByaW50ayhLRVJOX0RFQlVHIFJUTDgxOXhVX01PRFVMRV9OQU1FICI6IiB4ICJcbiIgLCBcCisJICAgICAgICMjYXJncyk7XAorfXdoaWxlKDApOworCisjZGVmaW5lIENPTVBfVFJBQ0UJCQkJQklUMAkJLy8gRm9yIGZ1bmN0aW9uIGNhbGwgdHJhY2luZy4KKyNkZWZpbmUgQ09NUF9EQkcJCQkJQklUMQkJLy8gT25seSBmb3IgdGVtcG9yYXJ5IGRlYnVnIG1lc3NhZ2UuCisjZGVmaW5lIENPTVBfSU5JVAkJCQlCSVQyCQkvLyBkdXJpbmcgZHJpdmVyIGluaXRpYWxpemF0aW9uIC8gaGFsdCAvIHJlc2V0LgorCisKKyNkZWZpbmUgQ09NUF9SRUNWCQkJCUJJVDMJCS8vIFJldmVpdmUgcGFydCBkYXRhIHBhdGguCisjZGVmaW5lIENPTVBfU0VORAkJCQlCSVQ0CQkvLyBTZW5kIHBhcnQgcGF0aC4KKyNkZWZpbmUgQ09NUF9JTwkJCQkJQklUNQkJLy8gSS9PIFJlbGF0ZWQuIEFkZGVkIGJ5IEFubmllLCAyMDA2LTAzLTAyLgorI2RlZmluZSBDT01QX1BPV0VSCQkJCUJJVDYJCS8vIDgwMi4xMSBQb3dlciBTYXZlIG1vZGUgb3IgU3lzdGVtL0RldmljZSBQb3dlciBzdGF0ZSByZWxhdGVkLgorI2RlZmluZSBDT01QX0VQUk9NCQkJCUJJVDcJCS8vIDgwMi4xMSBsaW5rIHJlbGF0ZWQ6IGpvaW4vc3RhcnQgQlNTLCBsZWF2ZSBCU1MuCisjZGVmaW5lIENPTVBfU1dCVwkJCQlCSVQ4CS8vIEZvciBiYW5kd2lkdGggc3dpdGNoLgorI2RlZmluZSBDT01QX1BPV0VSX1RSQUNLSU5HCQkJQklUOQkvL0ZPUiA4MTkwIFRYIFBPV0VSIFRSQUNLSU5HCisjZGVmaW5lIENPTVBfVFVSQk8JCQkJQklUMTAJLy8gRm9yIFR1cmJvIE1vZGUgcmVsYXRlZC4gQnkgQW5uaWUsIDIwMDUtMTAtMjEuCisjZGVmaW5lIENPTVBfUU9TCQkJCUJJVDExCS8vIEZvciBRb1MuCisjZGVmaW5lIENPTVBfUkFURQkJCQlCSVQxMgkvLyBGb3IgUmF0ZSBBZGFwdGl2ZSBtZWNoYW5pc20sIDIwMDYuMDcuMDIsIGJ5IHJjbmprby4KKyNkZWZpbmUgQ09NUF9STQkJCQkJQklUMTMJLy8gRm9yIFJhZGlvIE1lYXN1cmVtZW50LgorI2RlZmluZSBDT01QX0RJRwkJCQlCSVQxNAkvLyBGb3IgRElHLCAyMDA2LjA5LjI1LCBieSByY25qa28uCisjZGVmaW5lIENPTVBfUEhZCSAJCQlCSVQxNQorI2RlZmluZSBDT01QX0NICQkJCQlCSVQxNgkvL2NoYW5uZWwgc2V0dGluZyBkZWJ1ZworI2RlZmluZSBDT01QX1RYQUdDCQkJCUJJVDE3CS8vIEZvciBUeCBwb3dlciwgMDYwOTI4LCBieSByY25qa28uCisjZGVmaW5lIENPTVBfSElQV1IJCQkJQklUMTgJLy8gRm9yIEhpZ2ggUG93ZXIgTWVjaGFuaXNtLCAwNjA5MjgsIGJ5IHJjbmprby4KKyNkZWZpbmUgQ09NUF9IQUxETQkJCQlCSVQxOQkvLyBGb3IgSFcgRHluYW1pYyBNZWNoYW5pc20sIDA2MTAxMCwgYnkgcmNuamtvLgorI2RlZmluZSBDT01QX1NFQwkJCSAgICAgICAgQklUMjAJLy8gRXZlbnQgaGFuZGxpbmcKKyNkZWZpbmUgQ09NUF9MRUQJCQkJQklUMjEJLy8gRm9yIExFRC4KKyNkZWZpbmUgQ09NUF9SRgkJCQkJQklUMjIJLy8gRm9yIFJGLgorLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCisjZGVmaW5lIENPTVBfUlhERVNDCQkJCUJJVDIzCS8vIFNob3cgUnggZGVzYyBpbmZvcm1hdGlvbiBmb3IgU0QzIGRlYnVnLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNy0xNS4KKy8vMS8vMUF0dGVudGlvbiBQbGVhc2UhISE8MTFuIG9yIDgxOTAgc3BlY2lmaWMgY29kZSBzaG91bGQgYmUgcHV0IGJlbG93IHRoaXMgbGluZT4KKy8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQorCisjZGVmaW5lIENPTVBfRklSTVdBUkUJCQkJQklUMjQJLy9mb3IgZmlybXdhcmUgZG93bmxvYWRpbmcKKyNkZWZpbmUgQ09NUF9IVAkJCQkJQklUMjUJLy8gRm9yIDgwMi4xMW4gSFQgcmVsYXRlZCBpbmZvcm1hdGlvbi4gYnkgRW1pbHkgMjAwNi04LTExCisjZGVmaW5lIENPTVBfQU1TRFUJCQkJQklUMjYJLy8gRm9yIEEtTVNEVSBEZWJ1Z2dpbmcKKworI2RlZmluZSBDT01QX1NDQU4JCQkJQklUMjcKKy8vI2RlZmluZSBDT01QX1JFU0VUCQkJCUJJVDI4CisjZGVmaW5lIENPTVBfRE9XTgkJCQlCSVQyOSAgLy9mb3Igcm0gZHJpdmVyIG1vZHVsZQorI2RlZmluZSBDT01QX1JFU0VUCQkJCUJJVDMwICAvL2ZvciBzaWxlbnQgcmVzZXQKKyNkZWZpbmUgQ09NUF9FUlIJCQkJQklUMzEgLy9mb3IgZXJyb3Igb3V0LCBhbHdheXMgb24KKworI2RlZmluZSBSVEw4MTl4X0RFQlVHCisjaWZkZWYgUlRMODE5eF9ERUJVRworI2RlZmluZSBhc3NlcnQoZXhwcikgXAorICAgICAgICBpZiAoIShleHByKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHJpbnRrKCAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwgXAorICAgICAgICAgICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7ICAgICAgICAgIFwKKyAgICAgICAgfQorLy93YiBhZGRlZCB0byBkZWJ1ZyBvdXQgZGF0YSBidWYKKy8vaWYgeW91IHdhbnQgcHJpbnQgREFUQSBidWZmZXIgcmVsYXRlZCBCQSwgcGxlYXNlIHNldCBpZWVlODAyMTFfZGVidWdfbGV2ZWwgdG8gREFUQXxCQQorI2RlZmluZSBSVF9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKSAgICAgIFwKKyAgICAgICAgZG97IGlmICgocnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCAmIChsZXZlbCkpID09IChsZXZlbCkpICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4KiBwZGF0YSA9ICh1OCopIGRhdGE7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyBSVEw4MTl4VV9NT0RVTEVfTkFNRSAiOiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8KGludCkoZGF0YWxlbik7IGkrKykgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlMnggIiwgcGRhdGFbaV0pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpKzEpJTE2ID09IDApIHByaW50aygiXG4iKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGFzc2VydChleHByKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgUlRfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZiAvKiBSVEw4MTY5X0RFQlVHICovCisKKworLy8KKy8vIFF1ZXVlIFNlbGVjdCBWYWx1ZSBpbiBUeERlc2MKKy8vCisjZGVmaW5lIFFTTFRfQksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUVNMVF9CRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBRU0xUX1ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIFFTTFRfVk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgUVNMVF9CRUFDT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUVNMVF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUVNMVF9NR05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUVNMVF9DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTMKKworI2RlZmluZSBERVNDOTBfUkFURTFNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBERVNDOTBfUkFURTJNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBERVNDOTBfUkFURTVfNU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBERVNDOTBfUkFURTExTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBERVNDOTBfUkFURTZNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBERVNDOTBfUkFURTlNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBERVNDOTBfUkFURTEyTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBERVNDOTBfUkFURTE4TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBERVNDOTBfUkFURTI0TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBERVNDOTBfUkFURTM2TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBERVNDOTBfUkFURTQ4TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSBERVNDOTBfUkFURTU0TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBERVNDOTBfUkFURU1DUzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBERVNDOTBfUkFURU1DUzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBERVNDOTBfUkFURU1DUzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBERVNDOTBfUkFURU1DUzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBERVNDOTBfUkFURU1DUzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBERVNDOTBfUkFURU1DUzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBERVNDOTBfUkFURU1DUzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBERVNDOTBfUkFURU1DUzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNworI2RlZmluZSBERVNDOTBfUkFURU1DUzggICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBERVNDOTBfUkFURU1DUzkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBERVNDOTBfUkFURU1DUzEwICAgICAgICAgICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSBERVNDOTBfUkFURU1DUzExICAgICAgICAgICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBERVNDOTBfUkFURU1DUzEyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYworI2RlZmluZSBERVNDOTBfUkFURU1DUzEzICAgICAgICAgICAgICAgICAgICAgICAgMHgwZAorI2RlZmluZSBERVNDOTBfUkFURU1DUzE0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwZQorI2RlZmluZSBERVNDOTBfUkFURU1DUzE1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwZgorI2RlZmluZSBERVNDOTBfUkFURU1DUzMyICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorCisjZGVmaW5lIFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFIFJGXzFUMlIKKworI2RlZmluZSBJRUVFODAyMTFfV0FUQ0hfRE9HX1RJTUUgICAgMjAwMAorI2RlZmluZQkJUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWAkJMTAKKy8vZm9yIHR4cG93ZXJ0cmFja2luZyBieSBhbXkKKyNkZWZpbmUgCU9GRE1fVGFibGVfTGVuZ3RoCTE5CisjZGVmaW5lCUNDS19UYWJsZV9sZW5ndGgJMTIKKworLyogZm9yIHJ0bDgxOXggKi8KK3R5cGVkZWYgc3RydWN0IF90eF9kZXNjXzgxOXhfdXNiIHsKKyAgICAgICAgLy9EV09SRCAwCisgICAgICAgIHUxNglQa3RTaXplOworICAgICAgICB1OAlPZmZzZXQ7CisgICAgICAgIHU4CVJlc2VydmVkMDozOworICAgICAgICB1OAlDbWRJbml0OjE7CisgICAgICAgIHU4CUxhc3RTZWc6MTsKKyAgICAgICAgdTgJRmlyc3RTZWc6MTsKKyAgICAgICAgdTgJTElOSVA6MTsKKyAgICAgICAgdTgJT1dOOjE7CisKKyAgICAgICAgLy9EV09SRCAxCisgICAgICAgIHU4CVR4RldJbmZvU2l6ZTsKKyAgICAgICAgdTgJUkFUaWQ6MzsKKyAgICAgICAgdTgJRElTRkI6MTsKKyAgICAgICAgdTgJVVNFUkFURToxOworICAgICAgICB1OAlNT1JFRlJBRzoxOworICAgICAgICB1OAlOb0VuYzoxOworICAgICAgICB1OAlQSUZTOjE7CisgICAgICAgIHU4CVF1ZXVlU2VsZWN0OjU7CisgICAgICAgIHU4CU5vQUNNOjE7CisgICAgICAgIHU4CVJlc2VydmVkMToyOworICAgICAgICB1OAlTZWNDQU1JRDo1OworICAgICAgICB1OAlTZWNEZXNjQXNzaWduOjE7CisgICAgICAgIHU4CVNlY1R5cGU6MjsKKworICAgICAgICAvL0RXT1JEIDIKKyAgICAgICAgdTE2CVR4QnVmZmVyU2l6ZTsKKyAgICAgICAgLy91MTYgUmVzZXJ2ZWQyOworICAgICAgICB1OAlSZXN2Rm9yUGFkZGluZ0xlbjo3OworICAgICAgICB1OAlSZXNlcnZlZDM6MTsKKyAgICAgICAgdTgJUmVzZXJ2ZWQ0OworCisgICAgICAgIC8vRFdPUkQgMywgNCwgNQorICAgICAgICB1MzIJUmVzZXJ2ZWQ1OworICAgICAgICB1MzIJUmVzZXJ2ZWQ2OworICAgICAgICB1MzIJUmVzZXJ2ZWQ3OworfXR4X2Rlc2NfODE5eF91c2IsICpwdHhfZGVzY184MTl4X3VzYjsKKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCit0eXBlZGVmIHN0cnVjdCBfdHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lIHsKKwkvL0RXT1JEIDAKKwl1MTYJUGt0U2l6ZTsKKwl1OAlPZmZzZXQ7CisJdTgJVHhGV0luZm9TaXplOworCisJLy9EV09SRCAxCisJdTgJUkFUaWQ6MzsKKwl1OAlESVNGQjoxOworCXU4CVVTRVJBVEU6MTsKKwl1OAlNT1JFRlJBRzoxOworCXU4CU5vRW5jOjE7CisJdTgJUElGUzoxOworCXU4CVF1ZXVlU2VsZWN0OjU7CisJdTgJTm9BQ006MTsKKwl1OAlSZXNlcnZlZDE6MjsKKwl1OAlTZWNDQU1JRDo1OworCXU4CVNlY0Rlc2NBc3NpZ246MTsKKwl1OAlTZWNUeXBlOjI7CisJdTgJUGFja2V0SUQ6NzsKKwl1OAlPV046MTsKK310eF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUsICpwdHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lOworI2VuZGlmCisKKworCit0eXBlZGVmIHN0cnVjdCBfdHhfZGVzY19jbWRfODE5eF91c2IgeworICAgICAgICAvL0RXT1JEIDAKKwl1MTYJUmVzZXJ2ZWQwOworCXU4CVJlc2VydmVkMTsKKwl1OAlSZXNlcnZlZDI6MzsKKwl1OAlDbWRJbml0OjE7CisJdTgJTGFzdFNlZzoxOworCXU4CUZpcnN0U2VnOjE7CisJdTgJTElOSVA6MTsKKwl1OAlPV046MTsKKworICAgICAgICAvL0RPV1JEIDEKKwkvL3UzMglSZXNlcnZlZDM7CisJdTgJVHhGV0luZm9TaXplOworCXU4CVJlc2VydmVkMzsKKwl1OAlRdWV1ZVNlbGVjdDsKKwl1OAlSZXNlcnZlZDQ7CisKKyAgICAgICAgLy9ET1dSRCAyCisJdTE2IAlUeEJ1ZmZlclNpemU7CisJdTE2CVJlc2VydmVkNTsKKworICAgICAgIC8vRFdPUkQgMyw0LDUKKwkvL3UzMglUeEJ1ZmZlckFkZHI7CisJLy91MzIJTmV4dERlc2NBZGRyZXNzOworCXUzMglSZXNlcnZlZDY7CisJdTMyCVJlc2VydmVkNzsKKwl1MzIJUmVzZXJ2ZWQ4OworfXR4X2Rlc2NfY21kXzgxOXhfdXNiLCAqcHR4X2Rlc2NfY21kXzgxOXhfdXNiOworCisKK3R5cGVkZWYgc3RydWN0IF90eF9md2luZm9fODE5eF91c2IgeworICAgICAgICAvL0RPV1JEIDAKKyAgICAgICAgdTgJCVR4UmF0ZTo3OworICAgICAgICB1OAkJQ3RzRW5hYmxlOjE7CisgICAgICAgIHU4CQlSdHNSYXRlOjc7CisgICAgICAgIHU4CQlSdHNFbmFibGU6MTsKKyAgICAgICAgdTgJCVR4SFQ6MTsKKyAgICAgICAgdTgJCVNob3J0OjE7ICAgICAgICAgICAgICAgIC8vU2hvcnQgUExDUCBmb3IgQ0NLLCBvciBzaG9ydCBHSSBmb3IgMTFuIE1DUworICAgICAgICB1OAkJVHhCYW5kd2lkdGg6MTsgICAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBIVCBNQ1MgcmF0ZSBvbmx5LgorICAgICAgICB1OAkJVHhTdWJDYXJyaWVyOjI7ICAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBsZWdhY3kgT0ZETSByYXRlIG9ubHkuCisgICAgICAgIHU4CQlTVEJDOjI7CisgICAgICAgIHU4CQlBbGxvd0FnZ3JlZ2F0aW9uOjE7CisgICAgICAgIHU4CQlSdHNIVDoxOyAgICAgICAgICAgICAgICAvL0ludGVycHJlIFJ0c1JhdGUgZmllbGQgYXMgaGlnaCB0aHJvdWdocHV0IGRhdGEgcmF0ZQorICAgICAgICB1OAkJUnRzU2hvcnQ6MTsgICAgICAgICAgICAgLy9TaG9ydCBQTENQIGZvciBDQ0ssIG9yIHNob3J0IEdJIGZvciAxMW4gTUNTCisgICAgICAgIHU4CQlSdHNCYW5kd2lkdGg6MTsgICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIEhUIE1DUyByYXRlIG9ubHkuCisgICAgICAgIHU4CQlSdHNTdWJjYXJyaWVyOjI7ICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIGxlZ2FjeSBPRkRNIHJhdGUgb25seS4KKyAgICAgICAgdTgJCVJ0c1NUQkM6MjsKKyAgICAgICAgdTgJCUVuYWJsZUNQVUR1cjoxOyAgICAgICAgIC8vRW5hYmxlIGZpcm13YXJlIHRvIHJlY2FsY3VsYXRlIGFuZCBhc3NpZ24gcGFja2V0IGR1cmF0aW9uCisKKyAgICAgICAgLy9EV09SRCAxCisgICAgICAgIHUzMgkJUnhNRjoyOworICAgICAgICB1MzIJCVJ4QU1EOjM7CisgICAgICAgIHUzMgkJVHhQZXJQa3RJbmZvRmVlZGJhY2s6MTsvLzEgaW5kaWNhdGUgVHggaW5mbyBnYXRodGVyZWQgYnkgZmlybXdhcmUgYW5kIHJldHVybmVkIGJ5IFJ4IENtZAorICAgICAgICB1MzIJCVJlc2VydmVkMToyOworICAgICAgICB1MzIJCVR4QUdDT2ZmU2V0OjQ7CisgICAgICAgIHUzMgkJVHhBR0NTaWduOjE7CisgICAgICAgIHUzMgkJVHhfSU5GT19SU1ZEOjY7CisJdTMyCQlQYWNrZXRJRDoxMzsKKyAgICAgICAgLy91MzIgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7Cit9dHhfZndpbmZvXzgxOXhfdXNiLCAqcHR4X2Z3aW5mb184MTl4X3VzYjsKKwordHlwZWRlZiBzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvIHsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1OCBvdXRfcGlwZTsKK31ydGw4MTkyX3J4X2luZm8gOworCit0eXBlZGVmIHN0cnVjdCByeF9kZXNjXzgxOXhfdXNieworCS8vRE9XUkQgMAorCXUxNiAgICAgICAgICAgICAgICAgTGVuZ3RoOjE0OworCXUxNiAgICAgICAgICAgICAgICAgQ1JDMzI6MTsKKwl1MTYgICAgICAgICAgICAgICAgIElDVjoxOworCXU4ICAgICAgICAgICAgICAgICAgUnhEcnZJbmZvU2l6ZTsKKwl1OCAgICAgICAgICAgICAgICAgIFNoaWZ0OjI7CisJdTggICAgICAgICAgICAgICAgICBQSFlTdGF0dXM6MTsKKwl1OCAgICAgICAgICAgICAgICAgIFNXRGVjOjE7CisJLy91OCAgICAgICAgICAgICAgICBMYXN0U2VnOjE7CisJLy91OCAgICAgICAgICAgICAgICBGaXJzdFNlZzoxOworCS8vdTggICAgICAgICAgICAgICAgRU9SOjE7CisJLy91OCAgICAgICAgICAgICAgICBPV046MTsKKwl1OCAgICAgICAgICAgICAgICAgIFJlc2VydmVkMTo0OworCisJLy9EV09SRCAxCisJdTMyICAgICAgICAgICAgICAgICBSZXNlcnZlZDI7CisKKwkvL0RXT1JEIDIKKwkvL3UzMiAgICAgICAgICAgICAgIFJlc2VydmVkMzsKKworCS8vRFdPUkQgMworCS8vdTMyICAgICAgICAgICAgICAgIEJ1ZmZlckFkZHJlc3M7CisKK31yeF9kZXNjXzgxOXhfdXNiLCAqcHJ4X2Rlc2NfODE5eF91c2I7CisKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgX3J4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZXsKKwkvL0RPV1JEIDAKKwl1MTYJCQlMZW5ndGg6MTQ7CisJdTE2CQkJQ1JDMzI6MTsKKwl1MTYJCQlJQ1Y6MTsKKwl1OAkJCU9mZnNldDsKKwl1OAkJCVJ4RHJ2SW5mb1NpemU7CisJLy9ET1dSRCAxCisJdTgJCQlTaGlmdDoyOworCXU4CQkJUEhZU3RhdHVzOjE7CisJdTgJCQlTV0RlYzoxOworCXU4CQkJUmVzZXJ2ZWQxOjQ7CisJdTgJCQlSZXNlcnZlZDI7CisJdTE2CQkJUmVzZXJ2ZWQzOworCS8vRFdPUkQgMgorCS8vdTRCeXRlCQlSZXNlcnZlZDM7CisJLy9EV09SRCAzCisJLy91NEJ5dGUgICAgICAgICAgIAlCdWZmZXJBZGRyZXNzOworfXJ4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSwgKnByeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWU7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgcnhfZHJ2aW5mb184MTl4X3VzYnsKKwkvL0RXT1JEIDAKKwl1MTYgICAgICAgICAgICAgICAgIFJlc2VydmVkMToxMjsKKwl1MTYgICAgICAgICAgICAgICAgIFBhcnRBZ2dyOjE7CisJdTE2ICAgICAgICAgICAgICAgICBGaXJzdEFHR1I6MTsKKwl1MTYgICAgICAgICAgICAgICAgIFJlc2VydmVkMjoyOworCisJdTggICAgICAgICAgICAgICAgICBSeFJhdGU6NzsKKwl1OCAgICAgICAgICAgICAgICAgIFJ4SFQ6MTsKKworCXU4ICAgICAgICAgICAgICAgICAgQlc6MTsKKwl1OCAgICAgICAgICAgICAgICAgIFNQTENQOjE7CisJdTggICAgICAgICAgICAgICAgICBSZXNlcnZlZDM6MjsKKwl1OCAgICAgICAgICAgICAgICAgIFBBTToxOworCXU4ICAgICAgICAgICAgICAgICAgTWNhc3Q6MTsKKwl1OCAgICAgICAgICAgICAgICAgIEJjYXN0OjE7CisJdTggICAgICAgICAgICAgICAgICBSZXNlcnZlZDQ6MTsKKworCS8vRFdPUkQgMQorCXUzMiAgICAgICAgICAgICAgICAgIFRTRkw7CisKK31yeF9kcnZpbmZvXzgxOXhfdXNiLCAqcHJ4X2RydmluZm9fODE5eF91c2I7CisKKworI2RlZmluZSBNQVhfREVWX0FERFJfU0laRQkJOCAgLyogc3VwcG9ydCB0aWxsIDY0IGJpdCBidXMgd2lkdGggT1MgKi8KKyNkZWZpbmUgTUFYX0ZJUk1XQVJFX0lORk9STUFUSU9OX1NJWkUgICAzMiAvKjIwMDYvMDQvMzAgYnkgRW1pbHkgZm9yUlRMODE5MCovCisjZGVmaW5lIE1BWF84MDJfMTFfSEVBREVSX0xFTkdUSCAgICAgICAgKDQwICsgTUFYX0ZJUk1XQVJFX0lORk9STUFUSU9OX1NJWkUpCisjZGVmaW5lIEVOQ1JZUFRJT05fTUFYX09WRVJIRUFECQkxMjgKKyNkZWZpbmUJVVNCX0hXREVTQ19IRUFERVJfTEVOCQlzaXplb2YodHhfZGVzY184MTl4X3VzYikKKyNkZWZpbmUgVFhfUEFDS0VUX1NISUZUX0JZVEVTIAkgIAkoVVNCX0hXREVTQ19IRUFERVJfTEVOICsgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikpCisjZGVmaW5lIE1BWF9GUkFHTUVOVF9DT1VOVAkJOAorI2lmZGVmIFJUTDgxOTJVCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKyNkZWZpbmUgTUFYX1RSQU5TTUlUX0JVRkZFUl9TSVpFCQkJMzIwMDAKKyNlbHNlCisjZGVmaW5lIE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRQkJCTgwMDAKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgTUFYX1RSQU5TTUlUX0JVRkZFUl9TSVpFICAJKDE2MDArKE1BWF84MDJfMTFfSEVBREVSX0xFTkdUSCtFTkNSWVBUSU9OX01BWF9PVkVSSEVBRCkqTUFYX0ZSQUdNRU5UX0NPVU5UKQorI2VuZGlmCisjaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKKyNkZWZpbmUgVFhfUEFDS0VUX0RSVkFHR1JfU1VCRlJBTUVfU0hJRlRfQllURVMgKHNpemVvZih0eF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUpICsgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikpCisjZW5kaWYKKyNkZWZpbmUgc2NyY2xuZwkJCQkJNAkJLy8gb2N0ZXRzIGZvciBjcmMzMiAoRkNTLCBJQ1YpCisKK3R5cGVkZWYgZW51bSByZl9vcHR5cGUKK3sKKwlSRl9PUF9CeV9TV18zd2lyZSA9IDAsCisJUkZfT1BfQnlfRlcsCisJUkZfT1BfTUFYCit9cmZfb3BfdHlwZTsKKy8qIDgxOTAgTG9vcGJhY2sgTW9kZSBkZWZpbml0aW9uICovCit0eXBlZGVmIGVudW0gX3J0bDgxOXhVc2JfbG9vcGJhY2t7CisJUlRMODE5eFVfTk9fTE9PUEJBQ0sgPSAwLAorCVJUTDgxOXhVX01BQ19MT09QQkFDSyA9IDEsCisJUlRMODE5eFVfRE1BX0xPT1BCQUNLID0gMiwKKwlSVEw4MTl4VV9DQ0tfTE9PUEJBQ0sgPSAzLAorfXJ0bDgxOXhVc2JfbG9vcGJhY2tfZTsKKworLyogZHVlIHRvIHJ0bDgxOTIgZmlybXdhcmUgKi8KK3R5cGVkZWYgZW51bSBfZGVzY19wYWNrZXRfdHlwZV9leworCURFU0NfUEFDS0VUX1RZUEVfSU5JVCA9IDAsCisJREVTQ19QQUNLRVRfVFlQRV9OT1JNQUwgPSAxLAorfWRlc2NfcGFja2V0X3R5cGVfZTsKKwordHlwZWRlZiBlbnVtIF9maXJtd2FyZV9zb3VyY2V7CisJRldfU09VUkNFX0lNR19GSUxFID0gMCwKKwlGV19TT1VSQ0VfSEVBREVSX0ZJTEUgPSAxLAkJLy9mcm9tIGhlYWRlciBmaWxlCit9ZmlybXdhcmVfc291cmNlX2UsICpwZmlybXdhcmVfc291cmNlX2U7CisKK3R5cGVkZWYgZW51bSBfZmlybXdhcmVfc3RhdHVzeworCUZXX1NUQVRVU18wX0lOSVQgPSAwLAorCUZXX1NUQVRVU18xX01PVkVfQk9PVF9DT0RFID0gMSwKKwlGV19TVEFUVVNfMl9NT1ZFX01BSU5fQ09ERSA9IDIsCisJRldfU1RBVFVTXzNfVFVSTk9OX0NQVSA9IDMsCisJRldfU1RBVFVTXzRfTU9WRV9EQVRBX0NPREUgPSA0LAorCUZXX1NUQVRVU181X1JFQURZID0gNSwKK31maXJtd2FyZV9zdGF0dXNfZTsKKwordHlwZWRlZiBzdHJ1Y3QgX3J0X2Zpcm1hcmVfc2VnX2NvbnRhaW5lciB7CisJdTE2CXNlZ19zaXplOworCXU4CSpzZWdfcHRyOworfWZ3X3NlZ19jb250YWluZXIsICpwZndfc2VnX2NvbnRhaW5lcjsKK3R5cGVkZWYgc3RydWN0IF9ydF9maXJtd2FyZXsKKwlmaXJtd2FyZV9zdGF0dXNfZSBmaXJtd2FyZV9zdGF0dXM7CisJdTE2ICAgICAgICAgICAgICAgY21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7CisjZGVmaW5lIFJUTDgxOTBfTUFYX0ZJUk1XQVJFX0NPREVfU0laRSAgNjQwMDAgICAvLzY0aworCXU4ICAgICAgICAgICAgICAgIGZpcm13YXJlX2J1ZltSVEw4MTkwX01BWF9GSVJNV0FSRV9DT0RFX1NJWkVdOworCXUxNiAgICAgICAgICAgICAgIGZpcm13YXJlX2J1Zl9zaXplOworfXJ0X2Zpcm13YXJlLCAqcHJ0X2Zpcm13YXJlOworCisvLytieSBhbXkgMDgwNTA3CisjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFCTkxMDAJLy8gQWRkIHRoaXMgdG8gOTEwMCBieXRlcyB0byByZWNlaXZlIEEtTVNEVSBmcm9tIFJULUFQCisKK3R5cGVkZWYgc3RydWN0IF9ydF9maXJtd2FyZV9pbmZvXzgxOXhVc2J7CisJdTgJCXN6X2luZm9bMTZdOworfXJ0X2Zpcm13YXJlX2luZm9fODE5eFVzYiwgKnBydF9maXJtd2FyZV9pbmZvXzgxOXhVc2I7CisKKy8qIEZpcm13YXJlIFF1ZXVlIExheW91dCAqLworI2RlZmluZSBOVU1fT0ZfRklSTVdBUkVfUVVFVUUJCTEwCisjZGVmaW5lIE5VTV9PRl9QQUdFU19JTl9GVwkJMHgxMDAKKworI2lmZGVmIFVTRV9PTkVfUElQRQorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRQkweDAwMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CSwkweDAwMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSQkweDBmZgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WTwkweDAwMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9IQ0NBCTAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01ECTB4MAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UCTB4MDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSElHSAkwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTgkweDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCCTB4MDAKKyNlbHNlCisKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUJMHgwMjAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJMHgwMjAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVkkJMHgwNDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JMHgwNDAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSENDQQkwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0NNRAkweDQKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVAkweDIwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hJR0gJMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ04JMHg0CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQgkweDE4CisKKyNlbmRpZgorCisjZGVmaW5lIEFQUExJRURfUkVTRVJWRURfUVVFVUVfSU5fRlcJMHg4MDAwMDAwMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQktfU0hJRlQJMHgwMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQkVfU0hJRlQJMHgwOAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfVklfU0hJRlQJMHgxMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfVk9fU0hJRlQJMHgxOAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfTUdOVF9TSElGVAkweDEwCisjZGVmaW5lIFJTVkRfRldfUVVFVUVfUEFHRV9DTURfU0hJRlQJMHgwOAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQkNOX1NISUZUCTB4MDAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1BVQl9TSElGVAkweDA4CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNkZWZpbmUgRVBST01fOTNjNDYgMAorI2RlZmluZSBFUFJPTV85M2M1NiAxCisKKyNkZWZpbmUgREVGQVVMVF9GUkFHX1RIUkVTSE9MRCAyMzQyVQorI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05JTlRFUlZBTCAweDY0VQorI2RlZmluZSBERUZBVUxUX0JFQUNPTl9FU1NJRCAiUnRsODE5eFUiCisKKyNkZWZpbmUgREVGQVVMVF9TU0lEICIiCisjZGVmaW5lIERFRkFVTFRfUkVUUllfUlRTIDcKKyNkZWZpbmUgREVGQVVMVF9SRVRSWV9EQVRBIDcKKyNkZWZpbmUgUFJJU01fSERSX1NJWkUgNjQKKworI2RlZmluZQkJUEhZX1JTU0lfU0xJRF9XSU5fTUFYCQkJCTEwMAorCisKK3R5cGVkZWYgZW51bSBfV0lSRUxFU1NfTU9ERSB7CisJV0lSRUxFU1NfTU9ERV9VTktOT1dOID0gMHgwMCwKKwlXSVJFTEVTU19NT0RFX0EgPSAweDAxLAorCVdJUkVMRVNTX01PREVfQiA9IDB4MDIsCisJV0lSRUxFU1NfTU9ERV9HID0gMHgwNCwKKwlXSVJFTEVTU19NT0RFX0FVVE8gPSAweDA4LAorCVdJUkVMRVNTX01PREVfTl8yNEcgPSAweDEwLAorCVdJUkVMRVNTX01PREVfTl81RyA9IDB4MjAKK30gV0lSRUxFU1NfTU9ERTsKKworCisjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJU0lPQ0lXRklSU1RQUklWKzMwCisKK3R5cGVkZWYgc3RydWN0IGJ1ZmZlcgoreworCXN0cnVjdCBidWZmZXIgKm5leHQ7CisJdTMyICpidWY7CisKK30gYnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBydGxfcmVnX2RlYnVneworICAgICAgICB1bnNpZ25lZCBpbnQgIGNtZDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGU7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhZGRyOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcGFnZTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKyAgICAgICAgfSBoZWFkOworICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsweGZmXTsKK31ydGxfcmVnX2RlYnVnOworCisKKworCisKKwordHlwZWRlZiBzdHJ1Y3QgX3J0Xzl4X3R4X3JhdGVfaGlzdG9yeSB7CisJdTMyICAgICAgICAgICAgIGNja1s0XTsKKwl1MzIgICAgICAgICAgICAgb2ZkbVs4XTsKKwkvLyBIVF9NQ1NbMF1bXTogQlc9MCBTRz0wCisJLy8gSFRfTUNTWzFdW106IEJXPTEgU0c9MAorCS8vIEhUX01DU1syXVtdOiBCVz0wIFNHPTEKKwkvLyBIVF9NQ1NbM11bXTogQlc9MSBTRz0xCisJdTMyICAgICAgICAgICAgIGh0X21jc1s0XVsxNl07Cit9cnRfdHhfcmFoaXNfdCwgKnBydF90eF9yYWhpc190OwordHlwZWRlZiBzdHJ1Y3QgX1JUX1NNT09USF9EQVRBXzRSRiB7CisJY2hhciAgICBlbGVtZW50c1s0XVsxMDBdOy8vYXJyYXkgdG8gc3RvcmUgdmFsdWVzCisJdTMyICAgICBpbmRleDsgICAgICAgICAgICAgICAgICAvL2luZGV4IHRvIGN1cnJlbnQgYXJyYXkgdG8gc3RvcmUKKwl1MzIgICAgIFRvdGFsTnVtOyAgICAgICAgICAgICAgIC8vbnVtIG9mIHZhbGlkIGVsZW1lbnRzCisJdTMyICAgICBUb3RhbFZhbFs0XTsgICAgICAgICAgICAvL3N1bSBvZiB2YWxpZCBlbGVtZW50cworfVJUX1NNT09USF9EQVRBXzRSRiwgKlBSVF9TTU9PVEhfREFUQV80UkY7CisKKyNkZWZpbmUgTUFYXzgxOTJVX1JYX1NJWkUJCQk4MTkyICAgIC8vIFRoaXMgbWF5YmUgY2hhbmdlZCBmb3IgRC1jdXQgbGFyZ2VyIGFnZ3JlZ2F0aW9uIHNpemUKKy8vc3RhdHMgc2VlbXMgbWVzc2VkIHVwLCBjbGVhbiBpdCBBU0FQCit0eXBlZGVmIHN0cnVjdCBTdGF0cworeworCXVuc2lnbmVkIGxvbmcgdHhyZHU7CisvLwl1bnNpZ25lZCBsb25nIHJ4cmR1OworCS8vdW5zaWduZWQgbG9uZyByeG5vbGFzdDsKKwkvL3Vuc2lnbmVkIGxvbmcgcnhub2RhdGE7CisvLwl1bnNpZ25lZCBsb25nIHJ4cmVzZXQ7CisvLwl1bnNpZ25lZCBsb25nIHJ4bm9wb2ludGVyOworCXVuc2lnbmVkIGxvbmcgcnhvazsKKwl1bnNpZ25lZCBsb25nIHJ4ZnJhbWdtZW50OworCXVuc2lnbmVkIGxvbmcgcnhjbWRwa3RbNF07CQkvLzA4LzA1LzA4IGFteSByeCBjbWQgZWxlbWVudCB0eGZlZWRiYWNrL2JjbiByZXBvcnQvY2ZnIHNldC9xdWVyeQorCXVuc2lnbmVkIGxvbmcgcnh1cmJlcnI7CisJdW5zaWduZWQgbG9uZyByeHN0YXRlcnI7CisJdW5zaWduZWQgbG9uZyByZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVs0XVszMl07CS8vMDogVG90YWwsIDE6T0ssIDI6Q1JDLCAzOklDViwgMjAwNyAwNyAwMyBjb3NhCisJdW5zaWduZWQgbG9uZyByZWNlaXZlZF9wcmVhbWJsZV9HSVsyXVszMl07CQkvLzA6IExvbmcgcHJlYW1ibGUvR0ksIDE6U2hvcnQgcHJlYW1ibGUvR0kKKwl1bnNpZ25lZCBsb25nIHJ4X0FNUERVc2l6ZV9oaXN0b2dyYW1bNV07IC8vIGxldmVsOiAoPDRLKSwgKDRLfjhLKSwgKDhLfjE2SyksICgxNkt+MzJLKSwgKDMyS342NEspCisJdW5zaWduZWQgbG9uZyByeF9BTVBEVW51bV9oaXN0b2dyYW1bNV07IC8vIGxldmVsOiAoPDUpLCAoNX4xMCksICgxMH4yMCksICgyMH40MCksICg+NDApCisJdW5zaWduZWQgbG9uZyBudW1wYWNrZXRfbWF0Y2hic3NpZDsJLy8gZGVidWcgdXNlIG9ubHkuCisJdW5zaWduZWQgbG9uZyBudW1wYWNrZXRfdG9zZWxmOwkJLy8gZGVidWcgdXNlIG9ubHkuCisJdW5zaWduZWQgbG9uZyBudW1fcHJvY2Vzc19waHlpbmZvOwkJLy8gZGVidWcgdXNlIG9ubHkuCisJdW5zaWduZWQgbG9uZyBudW1xcnlfcGh5c3RhdHVzOworCXVuc2lnbmVkIGxvbmcgbnVtcXJ5X3BoeXN0YXR1c0NDSzsKKwl1bnNpZ25lZCBsb25nIG51bXFyeV9waHlzdGF0dXNIVDsKKwl1bnNpZ25lZCBsb25nIHJlY2VpdmVkX2J3dHlwZVs1XTsgICAgICAgICAgICAgIC8vMDogMjBNLCAxOiBmdW5uNDBNLCAyOiB1cHBlcjIwTSwgMzogbG93ZXIyME0sIDQ6IGR1cGxpY2F0ZQorCXVuc2lnbmVkIGxvbmcgdHhucGVycjsKKwl1bnNpZ25lZCBsb25nIHR4bnBkcm9wOworCXVuc2lnbmVkIGxvbmcgdHhyZXN1bWVkOworLy8JdW5zaWduZWQgbG9uZyByeGVycjsKKy8vCXVuc2lnbmVkIGxvbmcgcnhvdmVyZmxvdzsKKy8vCXVuc2lnbmVkIGxvbmcgcnhpbnQ7CisJdW5zaWduZWQgbG9uZyB0eG5wb2tpbnQ7CisvLwl1bnNpZ25lZCBsb25nIHR4aHBva2ludDsKKy8vCXVuc2lnbmVkIGxvbmcgdHhocGVycjsKKy8vCXVuc2lnbmVkIGxvbmcgaW50czsKKy8vCXVuc2lnbmVkIGxvbmcgc2hpbnRzOworCXVuc2lnbmVkIGxvbmcgdHhvdmVyZmxvdzsKKy8vCXVuc2lnbmVkIGxvbmcgcnhkbWFmYWlsOworLy8JdW5zaWduZWQgbG9uZyB0eGJlYWNvbjsKKy8vCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CisJdW5zaWduZWQgbG9uZyB0eGxwb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGxwZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4bHBlcnI7CisJdW5zaWduZWQgbG9uZyB0eGJlb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGJlZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4YmVlcnI7CisJdW5zaWduZWQgbG9uZyB0eGJrb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGJrZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4YmtlcnI7CisJdW5zaWduZWQgbG9uZyB0eHZpb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eHZpZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4dmllcnI7CisJdW5zaWduZWQgbG9uZyB0eHZvb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eHZvZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4dm9lcnI7CisJdW5zaWduZWQgbG9uZyB0eGJlYWNvbm9raW50OworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25kcm9wOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CisJdW5zaWduZWQgbG9uZyB0eG1hbmFnZW9raW50OworCXVuc2lnbmVkIGxvbmcgdHhtYW5hZ2Vkcm9wOworCXVuc2lnbmVkIGxvbmcgdHhtYW5hZ2VlcnI7CisJdW5zaWduZWQgbG9uZyB0eGRhdGFwa3Q7CisJdW5zaWduZWQgbG9uZyB0eGZlZWRiYWNrOworCXVuc2lnbmVkIGxvbmcgdHhmZWVkYmFja29rOworCisJdW5zaWduZWQgbG9uZyB0eG9rdG90YWw7CisJdW5zaWduZWQgbG9uZyB0eG9rYnl0ZXN0b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR4b2tpbnBlcmlvZDsKKwl1bnNpZ25lZCBsb25nIHR4bXVsdGljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhieXRlc211bHRpY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4YnJvYWRjYXN0OworCXVuc2lnbmVkIGxvbmcgdHhieXRlc2Jyb2FkY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4dW5pY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4Ynl0ZXN1bmljYXN0OworCisJdW5zaWduZWQgbG9uZyByeG9rdG90YWw7CisJdW5zaWduZWQgbG9uZyByeGJ5dGVzdW5pY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4ZmVlZGJhY2tmYWlsOworCXVuc2lnbmVkIGxvbmcgdHhlcnJ0b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJyYnl0ZXN0b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJybXVsdGljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhlcnJicm9hZGNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGVycnVuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eHJldHJ5Y291bnQ7CisJdW5zaWduZWQgbG9uZyB0eGZlZWRiYWNrcmV0cnk7CisJdTgJICAgICAgbGFzdF9wYWNrZXRfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIHNsaWRlX3NpZ25hbF9zdHJlbmd0aFsxMDBdOworCXVuc2lnbmVkIGxvbmcgc2xpZGVfZXZtWzEwMF07CisJdW5zaWduZWQgbG9uZyBzbGlkZV9yc3NpX3RvdGFsOwkvLyBGb3IgcmVjb3JkaW5nIHNsaWRpbmcgd2luZG93J3MgUlNTSSB2YWx1ZQorCXVuc2lnbmVkIGxvbmcgc2xpZGVfZXZtX3RvdGFsOwkvLyBGb3IgcmVjb3JkaW5nIHNsaWRpbmcgd2luZG93J3MgRVZNIHZhbHVlCisJbG9uZyBzaWduYWxfc3RyZW5ndGg7IC8vIFRyYW5zZm9ybWVkLCBpbiBkYm0uIEJlYXV0aWZpZWQgc2lnbmFsIHN0cmVuZ3RoIGZvciBVSSwgbm90IGNvcnJlY3QuCisJbG9uZyBzaWduYWxfcXVhbGl0eTsKKwlsb25nIGxhc3Rfc2lnbmFsX3N0cmVuZ3RoX2lucGVyY2VudDsKKwlsb25nIHJlY3Zfc2lnbmFsX3Bvd2VyOwkvLyBDb3JyZWN0IHNtb290aGVkIHNzIGluIERibSwgb25seSB1c2VkIGluIGRyaXZlciB0byByZXBvcnQgcmVhbCBwb3dlciBub3cuCisJdTggcnhfcnNzaV9wZXJjZW50YWdlWzRdOworCXU4IHJ4X2V2bV9wZXJjZW50YWdlWzJdOworCWxvbmcgcnhTTlJkQls0XTsKKwlydF90eF9yYWhpc190IHR4cmF0ZTsKKwl1MzIgU2xpZGVfQmVhY29uX3B3ZGJbMTAwXTsgICAgIC8vY29zYSBhZGQgZm9yIGJlYWNvbiByc3NpCisJdTMyIFNsaWRlX0JlYWNvbl9Ub3RhbDsgICAgICAgICAvL2Nvc2EgYWRkIGZvciBiZWFjb24gcnNzaQorCVJUX1NNT09USF9EQVRBXzRSRiAgICAgICAgICAgICAgY2NrX2FkY19wd2RiOworCisJdTMyCUN1cnJlbnRTaG93VHhhdGU7Cit9IFN0YXRzOworCisKKy8vIEJhbmR3aWR0aCBPZmZzZXQKKyNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRQkJMAorI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIJCQkxCisjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUgkJCTIKKworLy8rYnkgYW15IDA4MDUwNworCit0eXBlZGVmIHN0cnVjdCAJQ2hubEFjY2Vzc1NldHRpbmcgeworCXUxNiBTSUZTX1RpbWVyOworCXUxNiBESUZTX1RpbWVyOworCXUxNiBTbG90VGltZVRpbWVyOworCXUxNiBFSUZTX1RpbWVyOworCXUxNiBDV21pbkluZGV4OworCXUxNiBDV21heEluZGV4OworfSpQQ0hBTk5FTF9BQ0NFU1NfU0VUVElORyxDSEFOTkVMX0FDQ0VTU19TRVRUSU5HOworCit0eXBlZGVmIHN0cnVjdCBfQkJfUkVHSVNURVJfREVGSU5JVElPTnsKKwl1MzIgcmZpbnRmczsgCQkJLy8gc2V0IHNvZnR3YXJlIGNvbnRyb2w6IC8vCQkweDg3MH4weDg3N1s4IGJ5dGVzXQorCXUzMiByZmludGZpOyAJCQkvLyByZWFkYmFjayBkYXRhOiAvLwkJMHg4ZTB+MHg4ZTdbOCBieXRlc10KKwl1MzIgcmZpbnRmbzsgCQkJLy8gb3V0cHV0IGRhdGE6IC8vCQkweDg2MH4weDg2ZiBbMTYgYnl0ZXNdCisJdTMyIHJmaW50ZmU7IAkJCS8vIG91dHB1dCBlbmFibGU6IC8vCQkweDg2MH4weDg2ZiBbMTYgYnl0ZXNdCisJdTMyIHJmM3dpcmVPZmZzZXQ7IAkJLy8gTFNTSSBkYXRhOiAvLwkJMHg4NDB+MHg4NGYgWzE2IGJ5dGVzXQorCXUzMiByZkxTU0lfU2VsZWN0OyAJCS8vIEJCIEJhbmQgU2VsZWN0OiAvLwkJMHg4Nzh+MHg4N2YgWzggYnl0ZXNdCisJdTMyIHJmVHhHYWluU3RhZ2U7CQkvLyBUeCBnYWluIHN0YWdlOiAvLwkJMHg4MGN+MHg4MGYgWzQgYnl0ZXNdCisJdTMyIHJmSFNTSVBhcmExOyAJCS8vIHdpcmUgcGFyYW1ldGVyIGNvbnRyb2wxIDogLy8JCTB4ODIwfjB4ODIzLDB4ODI4fjB4ODJiLCAweDgzMH4weDgzMywgMHg4Mzh+MHg4M2IgWzE2IGJ5dGVzXQorCXUzMiByZkhTU0lQYXJhMjsgCQkvLyB3aXJlIHBhcmFtZXRlciBjb250cm9sMiA6IC8vCQkweDgyNH4weDgyNywweDgyY34weDgyZiwgMHg4MzR+MHg4MzcsIDB4ODNjfjB4ODNmIFsxNiBieXRlc10KKwl1MzIgcmZTd2l0Y2hDb250cm9sOyAJLy9UeCBSeCBhbnRlbm5hIGNvbnRyb2wgOiAvLwkJMHg4NTh+MHg4NWYgWzE2IGJ5dGVzXQorCXUzMiByZkFHQ0NvbnRyb2wxOyAJLy9BR0MgcGFyYW1ldGVyIGNvbnRyb2wxIDogLy8JCTB4YzUwfjB4YzUzLDB4YzU4fjB4YzViLCAweGM2MH4weGM2MywgMHhjNjh+MHhjNmIgWzE2IGJ5dGVzXQorCXUzMiByZkFHQ0NvbnRyb2wyOyAJLy9BR0MgcGFyYW1ldGVyIGNvbnRyb2wyIDogLy8JCTB4YzU0fjB4YzU3LDB4YzVjfjB4YzVmLCAweGM2NH4weGM2NywgMHhjNmN+MHhjNmYgWzE2IGJ5dGVzXQorCXUzMiByZlJ4SVFJbWJhbGFuY2U7IAkvL09GRE0gUnggSVEgaW1iYWxhbmNlIG1hdHJpeCA6IC8vCQkweGMxNH4weGMxNywweGMxY34weGMxZiwgMHhjMjR+MHhjMjcsIDB4YzJjfjB4YzJmIFsxNiBieXRlc10KKwl1MzIgcmZSeEFGRTsgIAkJCS8vUnggSVEgREMgb2ZzZXQgYW5kIFJ4IGRpZ2l0YWwgZmlsdGVyLCBSeCBEQyBub3RjaCBmaWx0ZXIgOiAvLwkJMHhjMTB+MHhjMTMsMHhjMTh+MHhjMWIsIDB4YzIwfjB4YzIzLCAweGMyOH4weGMyYiBbMTYgYnl0ZXNdCisJdTMyIHJmVHhJUUltYmFsYW5jZTsgCS8vT0ZETSBUeCBJUSBpbWJhbGFuY2UgbWF0cml4IC8vCQkweGM4MH4weGM4MywweGM4OH4weGM4YiwgMHhjOTB+MHhjOTMsIDB4Yzk4fjB4YzliIFsxNiBieXRlc10KKwl1MzIgcmZUeEFGRTsgCQkJLy9UeCBJUSBEQyBPZmZzZXQgYW5kIFR4IERGSVIgdHlwZSAvLwkJMHhjODR+MHhjODcsMHhjOGN+MHhjOGYsIDB4Yzk0fjB4Yzk3LCAweGM5Y34weGM5ZiBbMTYgYnl0ZXNdCisJdTMyIHJmTFNTSVJlYWRCYWNrOyAJLy9MU1NJIFJGIHJlYWRiYWNrIGRhdGEgLy8JCTB4OGEwfjB4OGFmIFsxNiBieXRlc10KK31CQl9SRUdJU1RFUl9ERUZJTklUSU9OX1QsICpQQkJfUkVHSVNURVJfREVGSU5JVElPTl9UOworCit0eXBlZGVmIGVudW0gX1JUX1JGX1RZUEVfODE5eFV7CisgICAgICAgIFJGX1RZUEVfTUlOID0gMCwKKyAgICAgICAgUkZfODIyNSwKKyAgICAgICAgUkZfODI1NiwKKyAgICAgICAgUkZfODI1OCwKKyAgICAgICAgUkZfUFNFVURPXzExTiA9IDQsCit9UlRfUkZfVFlQRV84MTl4VSwgKlBSVF9SRl9UWVBFXzgxOXhVOworCit0eXBlZGVmIHN0cnVjdCBfcmF0ZV9hZGFwdGl2ZQoreworCXU4CQkJCXJhdGVfYWRhcHRpdmVfZGlzYWJsZWQ7CisJdTgJCQkJcmF0cl9zdGF0ZTsKKwl1MTYJCQkJcmVzZXJ2ZTsKKworCXUzMgkJCQloaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwl1MzIJCQkJaGlnaDJsb3dfcnNzaV90aHJlc2hfZm9yX3JhOworCXU4CQkJCWxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTTsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTTsKKwl1OAkJCQlsb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME07CisJdTMyCQkJCWxvd19yc3NpX3RocmVzaF9mb3JfcmEyME07CisJdTMyCQkJCXVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyCQkJCW1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyOworCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfNDBNOworCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME07CisJdTgJCQkJcGluZ19yc3NpX2VuYWJsZTsJLy9jb3NhIGFkZCBmb3IgdGVzdAorCXUzMgkJCQlwaW5nX3Jzc2lfcmF0cjsJLy9jb3NhIGFkZCBmb3IgdGVzdAorCXUzMgkJCQlwaW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYTsvL2Nvc2EgYWRkIGZvciB0ZXN0CisJdTMyCQkJCWxhc3RfcmF0cjsKKworfSByYXRlX2FkYXB0aXZlLCAqcHJhdGVfYWRhcHRpdmU7CisKKyNkZWZpbmUgVHhCQkdhaW5UYWJsZUxlbmd0aCAzNworI2RlZmluZQlDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoIDIzCisKK3R5cGVkZWYgc3RydWN0IF90eGJiZ2Fpbl9zdHJ1Y3QKK3sKKwlsb25nCXR4YmJfaXFfYW1wbGlmeWdhaW47CisJdTMyCXR4YmJnYWluX3ZhbHVlOworfSB0eGJiZ2Fpbl9zdHJ1Y3QsICpwdHhiYmdhaW5fc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCBfY2NrdHhiYmdhaW5fc3RydWN0Cit7CisJLy9UaGUgVmFsdWUgaXMgZnJvbSBhMjIgdG8gYTI5IG9uZSBCeXRlIG9uZSB0aW1lIGlzIG11Y2ggU2FmZXIKKwl1OAljY2t0eGJiX3ZhbHVlYXJyYXlbOF07Cit9IGNja3R4YmJnYWluX3N0cnVjdCwqcGNja3R4YmJnYWluX3N0cnVjdDsKKworCit0eXBlZGVmIHN0cnVjdCBfaW5pdF9nYWluCit7CisJdTgJCQkJeGFhZ2Njb3JlMTsKKwl1OAkJCQl4YmFnY2NvcmUxOworCXU4CQkJCXhjYWdjY29yZTE7CisJdTgJCQkJeGRhZ2Njb3JlMTsKKwl1OAkJCQljY2E7CisKK30gaW5pdF9nYWluLCAqcGluaXRfZ2FpbjsKKy8vYnkgYW15IDA2MDYKKwordHlwZWRlZiBzdHJ1Y3QgX3BoeV9vZmRtX3J4X3N0YXR1c19yZXBvcnRfODE5eHVzYgoreworCXU4CXRyc3dfZ2Fpbl9YWzRdOworCXU4CXB3ZGJfYWxsOworCXU4CWNmb3Nob19YWzRdOworCXU4CWNmb3RhaWxfWFs0XTsKKwl1OAlyeGV2bV9YWzJdOworCXU4CXJ4c25yX1hbNF07CisJdTgJcGRzbnJfWFsyXTsKKwl1OAljc2lfY3VycmVudF9YWzJdOworCXU4CWNzaV90YXJnZXRfWFsyXTsKKwl1OAlzaWdldm07CisJdTgJbWF4X2V4X3B3cjsKKwl1OAlzZ2lfZW47CisJdTggIHJ4c2Nfc2dpZW5fZXhmbGc7Cit9cGh5X3N0c19vZmRtXzgxOXh1c2JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3BoeV9jY2tfcnhfc3RhdHVzX3JlcG9ydF84MTl4dXNiCit7CisJLyogRm9yIENDSyByYXRlIGRlc2NyaXB0b3IuIFRoaXMgaXMgYSB1bnNpZ25lZCA4OjEgdmFyaWFibGUuIExTQiBiaXQgcHJlc2VuZAorCSAgIDAuNS4gQW5kIE1TQiA3IGJ0cyBwcmVzZW5kIGEgc2lnbmVkIHZhbHVlLiBSYW5nZSBmcm9tIC02NH4rNjMuNS4gKi8KKwl1OAlhZGNfcHdkYl9YWzRdOworCXU4CXNxX3JwdDsKKwl1OAljY2tfYWdjX3JwdDsKK31waHlfc3RzX2Nja184MTl4dXNiX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX3BoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWd7CisJdTgJCQlyZXNlcnZlZDo0OworCXU4CQkJcnhzYzoyOworCXU4CQkJc2dpX2VuOjE7CisJdTgJCQlleF9pbnRmX2ZsYWc6MTsKK31waHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnOworCit0eXBlZGVmIGVudW0gX1JUX0NVU1RPTUVSX0lECit7CisJUlRfQ0lEX0RFRkFVTFQgPSAwLAorCVJUX0NJRF84MTg3X0FMUEhBMCA9IDEsCisJUlRfQ0lEXzgxODdfU0VSQ09NTV9QUyA9IDIsCisJUlRfQ0lEXzgxODdfSFdfTEVEID0gMywKKwlSVF9DSURfODE4N19ORVRHRUFSID0gNCwKKwlSVF9DSURfV0hRTCA9IDUsCisJUlRfQ0lEXzgxOXhfQ0FNRU8gID0gNiwKKwlSVF9DSURfODE5eF9SVU5UT1AgPSA3LAorCVJUX0NJRF84MTl4X1NlbmFvID0gOCwKKwlSVF9DSURfVE9TSElCQSA9IDksCS8vIE1lcmdlIGJ5IEphY2tlbiwgMjAwOC8wMS8zMS4KKwlSVF9DSURfODE5eF9OZXRjb3JlID0gMTAsCisJUlRfQ0lEX05ldHRyb25peCA9IDExLAorCVJUX0NJRF9ETElOSyA9IDEyLAorCVJUX0NJRF9QUk9ORVQgPSAxMywKK31SVF9DVVNUT01FUl9JRCwgKlBSVF9DVVNUT01FUl9JRDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTEVEIGN1c3RvbWl6YXRpb24uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYJZW51bSBfTEVEX1NUUkFURUdZXzgxOTB7CisJU1dfTEVEX01PREUwLCAvLyBTVyBjb250cm9sIDEgTEVEIHZpYSBHUElPMC4gSXQgaXMgZGVmYXVsdCBvcHRpb24uCisJU1dfTEVEX01PREUxLCAvLyBTVyBjb250cm9sIGZvciBQQ0kgRXhwcmVzcworCVNXX0xFRF9NT0RFMiwgLy8gU1cgY29udHJvbCBmb3IgQ2FtZW8uCisJU1dfTEVEX01PREUzLCAvLyBTVyBjb250b3JsIGZvciBSdW5Ub3AuCisJU1dfTEVEX01PREU0LCAvLyBTVyBjb250cm9sIGZvciBOZXRjb3JlCisJSFdfTEVELCAvLyBIVyBjb250cm9sIDIgTEVEcywgTEVEMCBhbmQgTEVEMSAodGhlcmUgYXJlIDQgZGlmZmVyZW50IGNvbnRyb2wgbW9kZXMpCit9TEVEX1NUUkFURUdZXzgxOTAsICpQTEVEX1NUUkFURUdZXzgxOTA7CisKK3R5cGVkZWYgZW51bSBfUkVTRVRfVFlQRSB7CisJUkVTRVRfVFlQRV9OT1JFU0VUID0gMHgwMCwKKwlSRVNFVF9UWVBFX05PUk1BTCA9IDB4MDEsCisJUkVTRVRfVFlQRV9TSUxFTlQgPSAweDAyCit9IFJFU0VUX1RZUEU7CisKKy8qIFRoZSBzaW1wbGUgdHggY29tbWFuZCBPUCBjb2RlLiAqLwordHlwZWRlZiBlbnVtIF90YWdfVHhDbWRfQ29uZmlnX0luZGV4eworCVRYQ01EX1RYUkFfSElTVE9SWV9DVFJMCQkJCT0gMHhGRjkwMDAwMCwKKwlUWENNRF9SRVNFVF9UWF9QS1RfQlVGRgkJCQk9IDB4RkY5MDAwMDEsCisJVFhDTURfUkVTRVRfUlhfUEtUX0JVRkYJCQkJPSAweEZGOTAwMDAyLAorCVRYQ01EX1NFVF9UWF9EVVJBVElPTgkJCQk9IDB4RkY5MDAwMDMsCisJVFhDTURfU0VUX1JYX1JTU0kJCQkJCQk9IDB4RkY5MDAwMDQsCisJVFhDTURfU0VUX1RYX1BXUl9UUkFDS0lORwkJCT0gMHhGRjkwMDAwNSwKKwlUWENNRF9YWFhYX0NUUkwsCit9RENNRF9UWENNRF9PUDsKKwordHlwZWRlZiBzdHJ1Y3QgcjgxOTJfcHJpdgoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCS8vYWRkZWQgZm9yIG1haW50YWluIGluZm8gZnJvbSBlZXByb20KKwlzaG9ydCBlcHJvbXR5cGU7CisJdTE2IGVlcHJvbV92aWQ7CisJdTE2IGVlcHJvbV9waWQ7CisJdTggIGVlcHJvbV9DdXN0b21lcklEOworCXU4ICBlZXByb21fQ2hhbm5lbFBsYW47CisJUlRfQ1VTVE9NRVJfSUQgQ3VzdG9tZXJJRDsKKwlMRURfU1RSQVRFR1lfODE5MAlMZWRTdHJhdGVneTsKKwl1OCAgdHhxdWV1ZV90b19vdXRwaXBlbWFwWzldOworCWludCBpcnE7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMTsKKworCXNob3J0IGNhcmRfODE5MjsgLyogTzogcnRsODE5MiwgMTpydGw4MTg1IFYgQi9DLCAyOnJ0bDgxODUgViBEICovCisJdTggY2FyZF84MTkyX3ZlcnNpb247IC8qIGlmIFRDUiByZXBvcnRzIGNhcmQgViBCL0MgdGhpcyBkaXNjcmltaW5hdGVzICovCisvLwlzaG9ydCBwaHlfdmVyOyAvKiBtZWFuaW5nZnVsIGZvciBydGw4MjI1IDE6QSAyOkIgMzpDICovCisJc2hvcnQgZW5hYmxlX2dwaW8wOworCWVudW0gY2FyZF90eXBlIHtQQ0ksTUlOSVBDSSxDQVJEQlVTLFVTQn1jYXJkX3R5cGU7CisJc2hvcnQgaHdfcGxjcF9sZW47CisJc2hvcnQgcGxjcF9wcmVhbWJsZV9tb2RlOworCisJc3BpbmxvY2tfdCBpcnFfbG9jazsKKy8vCXNwaW5sb2NrX3QgaXJxX3RoX2xvY2s7CisJc3BpbmxvY2tfdCB0eF9sb2NrOworICAgICAgICBzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJLy9zcGlubG9ja190IHJmX2xvY2s7IC8vdXNlZCB0byBsb2NrIHJmIHdyaXRlIG9wZXJhdGlvbiBhZGRlZCBieSB3YgorCisJdTE2IGlycV9tYXNrOworLy8Jc2hvcnQgaXJxX2VuYWJsZWQ7CisvLwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvL2NvbW1lbnQgdGhpcyBvdXQuCisJc2hvcnQgY2hhbjsKKwlzaG9ydCBzZW5zOworCXNob3J0IG1heF9zZW5zOworCisKKwkvLwl1OCBjaHR4cHdyWzE1XTsgLy9jaGFubmVscyBmcm9tIDEgdG8gMTQsIDAgbm90IHVzZWQKKy8vCXU4IGNodHhwd3Jfb2ZkbVsxNV07IC8vY2hhbm5lbHMgZnJvbSAxIHRvIDE0LCAwIG5vdCB1c2VkCisvLwl1OCBjY2tfdHhwd3JfYmFzZTsKKy8vCXU4IG9mZG1fdHhwd3JfYmFzZTsKKy8vCXU4IGNoYWxsb3dbMTVdOyAvL2NoYW5uZWxzIGZyb20gMSB0byAxNCwgMCBub3QgdXNlZAorCXNob3J0IHVwOworCXNob3J0IGNyY21vbjsgLy9pZiAxIGFsbG93IGJhZCBjcmMgZnJhbWUgcmVjZXB0aW9uIGluIG1vbml0b3IgbW9kZQorLy8Jc2hvcnQgcHJpc21faGRyOworCisvLwlzdHJ1Y3QgdGltZXJfbGlzdCBzY2FuX3RpbWVyOworCS8qc2hvcnQgc2NhbnBlbmRpbmc7CisJc2hvcnQgc3RvcHNjYW47Ki8KKy8vCXNwaW5sb2NrX3Qgc2Nhbl9sb2NrOworLy8JdTggYWN0aXZlX3Byb2JlOworCS8vdTggYWN0aXZlX3NjYW5fbnVtOworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgcmZfc2VtOyAvL3VzZWQgdG8gbG9jayByZiB3cml0ZSBvcGVyYXRpb24gYWRkZWQgYnkgd2IsIG1vZGlmaWVkIGJ5IGRhdmlkCisvLwlzaG9ydCBod193ZXA7CisKKy8vCXNob3J0IGRpZ3BoeTsKKy8vCXNob3J0IGFudGI7CisvLwlzaG9ydCBkaXZlcnNpdHk7CisvLwl1OCBjc190cmVzaG9sZDsKKy8vCXNob3J0IHJjcl9jc2Vuc2U7CisJdTggcmZfdHlwZTsgLy8wIG1lYW5zIDFUMlIsIDEgbWVhbnMgMlQ0UgorCVJUX1JGX1RZUEVfODE5eFUgcmZfY2hpcDsKKworLy8JdTMyIGtleTBbNF07CisJc2hvcnQgKCpyZl9zZXRfc2Vucykoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzaG9ydCBzZW5zKTsKKwl1OCAoKnJmX3NldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHU4IGNoKTsKKwl2b2lkICgqcmZfY2xvc2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZl9pbml0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwkvL3Nob3J0IHJhdGU7CisJc2hvcnQgcHJvbWlzYzsKKwkvKnN0YXRzKi8KKwlzdHJ1Y3QgU3RhdHMgc3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldjsKKworCS8qUlggc3R1ZmYqLworLy8JdTMyICpyeHJpbmc7CisvLwl1MzIgKnJ4cmluZ3RhaWw7CisvLwlkbWFfYWRkcl90IHJ4cmluZ2RtYTsKKwlzdHJ1Y3QgdXJiICoqcnhfdXJiOworCXN0cnVjdCB1cmIgKipyeF9jbWRfdXJiOworI2lmZGVmIFRIT01BU19CRUFDT04KKwl1MzIgKm9sZGFkZHI7CisjZW5kaWYKKyNpZmRlZiBUSE9NQVNfVEFTS0xFVAorCWF0b21pY190IGlydF9jb3VudGVyOy8vY291bnQgZm9yIGlycV9yeF90YXNrbGV0CisjZW5kaWYKKyNpZmRlZiBKQUNLU09OX05FV19SWAorICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBwX3J4c2tiOworICAgICAgICBpbnQgICAgIHJ4X2lueDsKKyNlbmRpZgorCisvKiBtb2RpZmllZCBieSBkYXZhZCBmb3IgUnggcHJvY2VzcyAqLworICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgcnhfcXVldWU7CisgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JfcXVldWU7CisgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHFvc19hY3RpdmF0ZTsKKwlzaG9ydCAgdHhfdXJiX2luZGV4OworCWF0b21pY190IHR4X3BlbmRpbmdbMHgxMF07Ly9VQVJUX1BSSU9SSVRZKzEKKworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV9yeF90YXNrbGV0OworCXN0cnVjdCB1cmIgKnJ4dXJiX3Rhc2s7CisKKwkvLzIgVHggUmVsYXRlZCB2YXJpYWJsZXMKKwl1MTYJU2hvcnRSZXRyeUxpbWl0OworCXUxNglMb25nUmV0cnlMaW1pdDsKKwl1MzIJVHJhbnNtaXRDb25maWc7CisJdTgJUmVnQ1dpbk1pbjsJCS8vIEZvciB0dXJibyBtb2RlIENXIGFkYXB0aXZlLiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMC0yNy4KKworCXUzMiAgICAgTGFzdFJ4RGVzY1RTRkhpZ2g7CisJdTMyICAgICBMYXN0UnhEZXNjVFNGTG93OworCisKKwkvLzIgUnggUmVsYXRlZCB2YXJpYWJsZXMKKwl1MTYJRWFybHlSeFRocmVzaG9sZDsKKwl1MzIJUmVjZWl2ZUNvbmZpZzsKKwl1OAlBY21Db250cm9sOworCisJdTgJUkZQcm9nVHlwZTsKKworCXU4IHJldHJ5X2RhdGE7CisJdTggcmV0cnlfcnRzOworCXUxNiBydHM7CisKKwlzdHJ1Y3QgCUNobmxBY2Nlc3NTZXR0aW5nICBDaGFubmVsQWNjZXNzU2V0dGluZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd3E7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8vZm9yIHJ0bDgxOXhVc2IKKwl1MTYgICAgIGJhc2ljX3JhdGU7CisJdTggICAgICBzaG9ydF9wcmVhbWJsZTsKKwl1OCAgICAgIHNsb3RfdGltZTsKKwlib29sIAliRGN1dDsKKwlib29sIGJDdXJyZW50UnhBZ2dyRW5hYmxlOworCXU4IFJmX01vZGU7IC8vYWRkIGZvciBGaXJtd2FyZSBSRiAtUi9XIHN3aXRjaAorCXBydF9maXJtd2FyZQkJcEZpcm13YXJlOworCXJ0bDgxOXhVc2JfbG9vcGJhY2tfZQlMb29wYmFja01vZGU7CisJZmlybXdhcmVfc291cmNlX2UJZmlybXdhcmVfc291cmNlOworCXUxNiBFRVBST01UeFBvd2VyRGlmZjsKKwl1OCBFRVBST01UaGVybWFsTWV0ZXI7CisJdTggRUVQUk9NUHdEaWZmOworCXU4IEVFUFJPTUNyeXN0YWxDYXA7CisJdTggRUVQUk9NX0RlZl9WZXI7CisJdTggRUVQUk9NVHhQb3dlckxldmVsQ0NLOy8vIENDSyBjaGFubmVsIDF+MTQKKwl1OCBFRVBST01UeFBvd2VyTGV2ZWxDQ0tfVjFbM107CisJdTggRUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1szXTsgLy8gT0ZETSAyLjRHIGNoYW5uZWwgMX4xNAorCXU4IEVFUFJPTVR4UG93ZXJMZXZlbE9GRE01R1syNF07CS8vIE9GRE0gNUcKKworLypQSFkgcmVsYXRlZCovCisJQkJfUkVHSVNURVJfREVGSU5JVElPTl9UCVBIWVJlZ0RlZls0XTsJLy9SYWRpbyBBL0IvQy9ECisJLy8gUmVhZC93cml0ZSBhcmUgYWxsb3cgZm9yIGZvbGxvd2luZyBoYXJkd2FyZSBpbmZvcm1hdGlvbiB2YXJpYWJsZXMKKwl1MzIJTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbNl07CisJdTMyCUNDS1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0OworCXU4CVR4UG93ZXJMZXZlbENDS1sxNF07CQkJLy8gQ0NLIGNoYW5uZWwgMX4xNAorCXU4CVR4UG93ZXJMZXZlbE9GRE0yNEdbMTRdOwkJLy8gT0ZETSAyLjRHIGNoYW5uZWwgMX4xNAorCXU4CVR4UG93ZXJMZXZlbE9GRE01R1sxNF07CQkJLy8gT0ZETSA1RworCXUzMglQd3JfVHJhY2s7CisJdTgJVHhQb3dlckRpZmY7CisJdTgJQW50ZW5uYVR4UHdEaWZmWzJdOwkJCQkvLyBBbnRlbm5hIGdhaW4gb2Zmc2V0LCBpbmRleCAwIGZvciBCLCAxIGZvciBDLCBhbmQgMiBmb3IgRAorCXU4CUNyeXN0YWxDYXA7CQkJCQkJLy8gQ3J5c3RhbENhcC4KKwl1OAlUaGVybWFsTWV0ZXJbMl07CQkJCS8vIFRoZXJtYWxNZXRlciwgaW5kZXggMCBmb3IgUkZJQzAsIGFuZCAxIGZvciBSRklDMQorCisJdTgJQ2NrUHdFbmw7CisJLy8gVXNlIHRvIGNhbGN1bGF0ZSBQV0JELgorCXU4CWJDY2tIaWdoUG93ZXI7CisJbG9uZwl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCisJLy9mb3Igc2V0IGNoYW5uZWwKKwl1OAlTd0NobmxJblByb2dyZXNzOworCXU4IAlTd0NobmxTdGFnZTsKKwl1OAlTd0NobmxTdGVwOworCXU4CVNldEJXTW9kZUluUHJvZ3Jlc3M7CisJSFRfQ0hBTk5FTF9XSURUSAkJQ3VycmVudENoYW5uZWxCVzsKKwl1OCAgICAgIENoYW5uZWxQbGFuOworCS8vIDgxOTAgNDBNSHogbW9kZQorCS8vCisJdTgJbkN1cjQwTWh6UHJpbWVTQzsJLy8gQ29udHJvbCBjaGFubmVsIHN1Yi1jYXJyaWVyCisJLy8gSm9zZXBoIHRlc3QgZm9yIHNob3J0ZW4gUkYgY29uZmlndXJhdGlvbiB0aW1lLgorCS8vIFdlIHNhdmUgUkYgcmVnMCBpbiB0aGlzIHZhcmlhYmxlIHRvIHJlZHVjZSBSRiByZWFkaW5nLgorCS8vCisJdTMyCQkJCQlSZlJlZzBWYWx1ZVs0XTsKKwl1OCAJCQkJCU51bVRvdGFsUkZQYXRoOworCWJvb2wgCQkJCWJyZnBhdGhfcnhlbmFibGVbNF07CisJLy9SRiBzZXQgcmVsYXRlZAorCWJvb2wJCQkJU2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzczsKKy8vK2J5IGFteSAwODA1MDcKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaF9kb2dfdGltZXI7CisKKy8vK2J5IGFteSAwODA1MTUgZm9yIGR5bmFtaWMgbWVjaGVuaXNtCisJLy9BZGQgYnkgYW15IFR4IFBvd2VyIENvbnRyb2wgZm9yIE5lYXIvRmFyIFJhbmdlIDIwMDgvMDUvMTUKKwlib29sCWJkeW5hbWljX3R4cG93ZXI7ICAvL2JEeW5hbWljVHhQb3dlcgorCWJvb2wJYkR5bmFtaWNUeEhpZ2hQb3dlcjsgIC8vIFR4IGhpZ2ggcG93ZXIgc3RhdGUKKwlib29sCWJEeW5hbWljVHhMb3dQb3dlcjsgIC8vIFR4IGxvdyBwb3dlciBzdGF0ZQorCWJvb2wJYkxhc3REVFBGbGFnX0hpZ2g7CisJYm9vbAliTGFzdERUUEZsYWdfTG93OworCisJYm9vbAlic3RvcmVfbGFzdF9kdHBmbGFnOworCWJvb2wJYnN0YXJ0X3R4Y3RybF9ieWR0cDsgICAvL0RlZmluZSB0byBkaXNjcmltaW5hdGUgb24gSGlnaCBwb3dlciBTdGF0ZSBvciBvbiBzaXRlc3V2ZXkgdG8gY2hhbmdlIFR4IGdhaW4gaW5kZXgKKwkvL0FkZCBieSBhbXkgZm9yIFJhdGUgQWRhcHRpdmUKKwlyYXRlX2FkYXB0aXZlIHJhdGVfYWRhcHRpdmU7CisJLy9BZGQgYnkgYW15IGZvciBUWCBwb3dlciB0cmFja2luZworCS8vMjAwOC8wNS8xNSAgTWFycyBPUEVOL0NMT1NFIFRYIFBPV0VSIFRSQUNLSU5HCisgICAgICAgdHhiYmdhaW5fc3RydWN0IHR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGhdOworCXU4CQkJICAgdHhwb3dlcl9jb3VudDsvL0ZvciA2IHNlYyBkbyB0cmFja2luZyBhZ2FpbgorCWJvb2wJCQkgICBidHhwb3dlcl90cmFja2luZ0luaXQ7CisJdTgJCQkgICBPRkRNX2luZGV4OworCXU4CQkJICAgQ0NLX2luZGV4OworCS8vMjAwNy8wOS8xMCBNYXJzIEFkZCBDQ0sgVFggUG93ZXIgVHJhY2tpbmcKKwljY2t0eGJiZ2Fpbl9zdHJ1Y3QJY2NrX3R4YmJnYWluX3RhYmxlW0NDS1R4QkJHYWluVGFibGVMZW5ndGhdOworCWNja3R4YmJnYWluX3N0cnVjdAljY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoXTsKKwl1OCByZmFfdHhwb3dlcnRyYWNraW5naW5kZXg7CisJdTggcmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWw7CisJdTggcmZhX3R4cG93ZXJ0cmFja2luZ19kZWZhdWx0OworCXU4IHJmY190eHBvd2VydHJhY2tpbmdpbmRleDsKKwl1OCByZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbDsKKworCXM4IGNja19wcmVzZW50X2F0dGVudHVhdGlvbjsKKwl1OCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKKwl1OCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdDsKKwljaGFyIGNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCWJvb2wgYnR4cG93ZXJfdHJhY2tpbmc7CisJYm9vbCBiY2NrX2luX2NoMTQ7CisJYm9vbCBidHhwb3dlcmRhdGFfcmVhZGZyb21FRVBPUk07CisJdTE2IAlUU1NJXzEzZEJtOworCS8vRm9yIEJhY2t1cCBJbml0aWFsIEdhaW4KKwlpbml0X2dhaW4gaW5pdGdhaW5fYmFja3VwOworCXU4IERlZmF1bHRJbml0aWFsR2Fpbls0XTsKKwkvLyBGb3IgRURDQSBUdXJibyBtb2RlLCBBZGRlZCBieSBhbXkgMDgwNTE1LgorCWJvb2wJCWJpc19hbnlfbm9uYmVwa3RzOworCWJvb2wJCWJjdXJyZW50X3R1cmJvX0VEQ0E7CisJYm9vbAkJYmlzX2N1cl9yZGxzdGF0ZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBmc3luY190aW1lcjsKKwlib29sIGJmc3luY19wcm9jZXNzaW5nOwkvLyA1MDBtcyBGc3luYyB0aW1lciBpcyBhY3RpdmUgb3Igbm90CisJdTMyIAlyYXRlX3JlY29yZDsKKwl1MzIgCXJhdGVDb3VudERpZmZSZWNvcmQ7CisJdTMyCUNvbnRpdW5lRGlmZkNvdW50OworCWJvb2wgYnN3aXRjaF9mc3luYzsKKworCXU4CWZyYW1lc3luYzsKKwl1MzIgCWZyYW1lc3luY0MzNDsKKwl1OCAgIAlmcmFtZXN5bmNNb25pdG9yOworICAgICAgICAJLy9BZGRlZCBieSBhbXkgMDgwNTE2ICBmb3IgUlggcmVsYXRlZAorCXUxNiAJbnJ4QU1QRFVfc2l6ZTsKKwl1OCAJbnJ4QU1QRFVfYWdncl9udW07CisKKwkvL2J5IGFteSBmb3IgZ3BpbworCSBib29sIGJId1JhZGlvT2ZmOworCisJLy9ieSBhbXkgZm9yIHJlc2V0X2NvdW50CisJdTMyIHJlc2V0X2NvdW50OworCWJvb2wgYnBiY19wcmVzc2VkOworCS8vYnkgYW15IGZvciBkZWJ1ZworCXUzMiB0eHBvd2VyX2NoZWNrY250OworCXUzMiB0eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX2NudDsKKwl1OCB0aGVybWFsX3JlYWRfdmFsWzQwXTsKKwl1OCB0aGVybWFsX3JlYWRiYWNrX2luZGV4OworCXUzMiBjY2t0eHBvd2VyX2FkanVzdGNudF9ub3RfY2gxNDsKKwl1MzIgY2NrdHhwb3dlcl9hZGp1c3RjbnRfY2gxNDsKKwl1OCB0eF9md2luZm9fZm9yY2Vfc3ViY2Fycmllcm1vZGU7CisJdTggdHhfZndpbmZvX2ZvcmNlX3N1YmNhcnJpZXJ2YWw7CisJLy9ieSBhbXkgZm9yIHNpbGVudCByZXNldAorCVJFU0VUX1RZUEUJUmVzZXRQcm9ncmVzczsKKwlib29sCQliRm9yY2VkU2lsZW50UmVzZXQ7CisJYm9vbAkJYkRpc2FibGVOb3JtYWxSZXNldENoZWNrOworCXUxNgkJVHhDb3VudGVyOworCXUxNgkJUnhDb3VudGVyOworCWludAkJSXJwUGVuZGluZ0NvdW50OworCWJvb2wJCWJSZXNldEluUHJvZ3Jlc3M7CisJYm9vbAkJZm9yY2VfcmVzZXQ7CisJdTgJCUluaXRpYWxHYWluT3BlcmF0ZVR5cGU7CisKKwl1MTYJCVNpZnNUaW1lOworCisJLy9kZWZpbmUgd29yayBpdGVtIGJ5IGFteSAwODA1MjYKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgdXBkYXRlX2JlYWNvbl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHdhdGNoX2RvZ193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHR4cG93ZXJfdHJhY2tpbmdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayByZnBhdGhfY2hlY2tfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBncGlvX2NoYW5nZV9yZl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGluaXRpYWxnYWluX29wZXJhdGVfd3E7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnByaXZfd3E7Cit9cjgxOTJfcHJpdjsKKworLy8gZm9yIHJ0bDgxODcKKy8vIG5vdyBtaXJnaW5nIHRvIHJ0bDgxODdCCisvKgordHlwZWRlZiBlbnVteworCUxPV19QUklPUklUWSA9IDB4MDIsCisJTk9STV9QUklPUklUWQorCX0gcHJpb3JpdHlfdDsKKyovCisvL2ZvciBydGw4MTg3QgordHlwZWRlZiBlbnVteworCUJVTEtfUFJJT1JJVFkgPSAweDAxLAorCS8vUlNWRDAsCisJLy9SU1ZEMSwKKwlMT1dfUFJJT1JJVFksCisJTk9STV9QUklPUklUWSwKKwlWT19QUklPUklUWSwKKwlWSV9QUklPUklUWSwgLy8weDA1CisJQkVfUFJJT1JJVFksCisJQktfUFJJT1JJVFksCisJUlNWRDIsCisJUlNWRDMsCisJQkVBQ09OX1BSSU9SSVRZLCAvLzB4MEEKKwlISUdIX1BSSU9SSVRZLAorCU1BTkFHRV9QUklPUklUWSwKKwlSU1ZENCwKKwlSU1ZENSwKKwlVQVJUX1BSSU9SSVRZIC8vMHgwRgorfSBwcmlvcml0eV90OworCit0eXBlZGVmIGVudW17CisJTklDXzgxOTJVID0gMSwKKwlOSUNfODE5MFAgPSAyLAorCU5JQ184MTkyRSA9IDMsCisJfSBuaWNfdDsKKworCisjaWZkZWYgSk9ITl9IV1NFQworc3RydWN0IHNzaWRfdGhyZWFkIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgICAgIAl1OCBuYW1lW0lXX0VTU0lEX01BWF9TSVpFICsgMV07Cit9OworI2VuZGlmCisKK2Jvb2wgaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3Nob3J0IHJ0bDgxOXhVX3R4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3Nob3J0IHJ0bDgxOTJfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYqIHNrYik7CisKK3UzMiByZWFkX2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyKTsKK3ZvaWQgd3JpdGVfY2FtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIsIHUzMiBkYXRhKTsKKwordTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1OCByZWFkX25pY19ieXRlX0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwordTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UxNiByZWFkX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KSA7Cit2b2lkIHdyaXRlX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHU4IHkpOwordm9pZCB3cml0ZV9uaWNfYnl0ZV9FKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LHU4IHkpOwordm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MTYgeSk7Cit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCx1MzIgeSk7Cit2b2lkIGZvcmNlX3BjaV9wb3N0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIHJ0bDgxOTJfcnR4X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIHJ0bDgxOTJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTkyX3R4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwordm9pZCBydGw4MTkyX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBmaXhfcnhfZmlmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE4NV9zZXRfcmZfcGluc19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7CisKK3ZvaWQgcnRsODE5Ml9zZXRfYW5hcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgYSk7Cit2b2lkIHJ0bDgxODVfc2V0X2FuYXBhcmFtMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUzMiBhKTsKK3ZvaWQgcnRsODE5Ml91cGRhdGVfbXNyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHJ0bDgxOTJfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKTsKK3ZvaWQgd3JpdGVfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTggZGF0YSk7Cit2b2lkIHdyaXRlX3BoeV9jY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7Cit2b2lkIHdyaXRlX3BoeV9vZmRtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkciwgdTMyIGRhdGEpOwordm9pZCBydGw4MTg1X3R4X2FudGVubmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYW50KTsKK3ZvaWQgcnRsODE5Ml9zZXRfcnhjb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLy9zaG9ydCBjaGVja19uaWNfZW5vdWdoX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcHJpb3JpdHlfdCBwcmlvcml0eSk7CitleHRlcm4gdm9pZCBydGw4MTl4dXNiX2JlYWNvbl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHUxNiAgdHhfcmF0ZSk7CisKK3ZvaWQgRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHNldEtleShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBFbnRyeU5vLCB1OCBLZXlJbmRleCwgdTE2IEtleVR5cGUsIHU4ICpNYWNBZGRyLCB1OCBEZWZhdWx0S2V5LCB1MzIgKktleUNvbnRlbnQgKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC0wLDAgKzEsNjA4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBMaW51eCBkZXZpY2UgZHJpdmVyIGZvciBSVEw4MTkyVQorICoKKyAqIEJhc2VkIG9uIHRoZSByODE4NyBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+LCBldCBhbC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogSmVycnkgY2h1YW5nIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICovCisKKyNpZm5kZWYgQ09ORklHX0ZPUkNFX0hBUkRfRkxPQVQKK2RvdWJsZSBfX2Zsb2F0c2lkZiAoaW50IGkpIHsgcmV0dXJuIGk7IH0KK3Vuc2lnbmVkIGludCBfX2ZpeHVuc2Rmc2kgKGRvdWJsZSBkKSB7IHJldHVybiBkOyB9Citkb3VibGUgX19hZGRkZjMoZG91YmxlIGEsIGRvdWJsZSBiKSB7IHJldHVybiBhK2I7IH0KK2RvdWJsZSBfX2FkZHNmMyhmbG9hdCBhLCBmbG9hdCBiKSB7IHJldHVybiBhK2I7IH0KK2RvdWJsZSBfX3N1YmRmMyhkb3VibGUgYSwgZG91YmxlIGIpIHsgcmV0dXJuIGEtYjsgfQorZG91YmxlIF9fZXh0ZW5kc2ZkZjIoZmxvYXQgYSkge3JldHVybiBhO30KKyNlbmRpZgorCisjdW5kZWYgTE9PUF9URVNUCisjdW5kZWYgRFVNUF9SWAorI3VuZGVmIERVTVBfVFgKKyN1bmRlZiBERUJVR19UWF9ERVNDMgorI3VuZGVmIFJYX0RPTlRfUEFTU19VTAorI3VuZGVmIERFQlVHX0VQUk9NCisjdW5kZWYgREVCVUdfUlhfVkVSQk9TRQorI3VuZGVmIERVTU1ZX1JYCisjdW5kZWYgREVCVUdfWkVST19SWAorI3VuZGVmIERFQlVHX1JYX1NLQgorI3VuZGVmIERFQlVHX1RYX0ZSQUcKKyN1bmRlZiBERUJVR19SWF9GUkFHCisjdW5kZWYgREVCVUdfVFhfRklMTERFU0MKKyN1bmRlZiBERUJVR19UWAorI3VuZGVmIERFQlVHX0lSUQorI3VuZGVmIERFQlVHX1JYCisjdW5kZWYgREVCVUdfUlhBTExPQworI3VuZGVmIERFQlVHX1JFR0lTVEVSUworI3VuZGVmIERFQlVHX1JJTkcKKyN1bmRlZiBERUJVR19JUlFfVEFTS0xFVAorI3VuZGVmIERFQlVHX1RYX0FMTE9DCisjdW5kZWYgREVCVUdfVFhfREVTQworCisjZGVmaW5lIENPTkZJR19SVEw4MTkyX0lPX01BUAorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MF9ydGw4MjU2LmgiIC8qIFJUTDgyMjUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE4MF85M2N4Ni5oIiAgIC8qIENhcmQgRUVQUk9NICovCisjaW5jbHVkZSAicjgxOTJVX3d4LmgiCisjaW5jbHVkZSAicjgxOXhVX3BoeS5oIiAvL2FkZGVkIGJ5IFdCIDQuMzAuMjAwOAorI2luY2x1ZGUgInI4MTl4VV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5eFVfY21kcGt0LmgiCisjaW5jbHVkZSAicjgxOTJVX2RtLmgiCisvLyNpbmNsdWRlICJyODE5MnhVX3BoeXJlZy5oIgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorLy8gRklYTUU6IGNoZWNrIGlmIDIuNi43IGlzIG9rCisKKyNpZmRlZiBDT05GSUdfUlRMODE5Ml9QTQorI2luY2x1ZGUgInI4MTkyX3BtLmgiCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorLy9zZXQgaGVyZSB0byBvcGVuIHlvdXIgdHJhY2UgY29kZS4gLy9XQgordTMyIHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgPSBcCisJCQkvLwlDT01QX0lOSVQgICAgCXwKKy8vCQkJCUNPTVBfREJHCXwKKwkJCS8vCUNPTVBfRVBST00gICAJfAorLy8JCQkJQ09NUF9QSFkJfAorCQkJLy8JQ09NUF9SRgkJfAorLy8JCQkJQ09NUF9GSVJNV0FSRQl8CisvLwkJCQlDT01QX0NICQl8CisJCQkvLwlDT01QX1BPV0VSX1RSQUNLSU5HIHwKKy8vCQkJCUNPTVBfUkFURQl8CisJCQkvLwlDT01QX1RYQUdDCXwKKwkJLy8JCUNPTVBfVFJBQ0UJfAorCQkJCUNPTVBfRE9XTgl8CisJCS8vCQlDT01QX1JFQ1YJfAorCQkvLyAgICAgICAgICAgICAgQ09NUF9TV0JXCXwKKwkJCQlDT01QX1NFQwl8CisJLy8JCQlDT01QX1JFU0VUCXwKKwkJLy8JCUNPTVBfU0VORAl8CisJCQkvLwlDT01QX0VWRU5UUwl8CisJCQkJQ09NUF9FUlIgOyAvL2Fsd2F5cyBvcGVuIGVyciBmbGFncyBvbgorCisjZGVmaW5lIFRPVEFMX0NBTV9FTlRSWSAzMgorI2RlZmluZSBDQU1fQ09OVEVOVF9DT1VOVCA4CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBydGw4MTkyX3VzYl9pZF90YmxbXSA9IHsKKwkvKiBSZWFsdGVrICovCisJe1VTQl9ERVZJQ0UoMHgwYmRhLCAweDgxOTIpfSwKKwl7VVNCX0RFVklDRSgweDBiZGEsIDB4ODcwOSl9LAorCS8qIENvcmVnYSAqLworCXtVU0JfREVWSUNFKDB4MDdhYSwgMHgwMDQzKX0sCisJLyogQmVsa2luICovCisJe1VTQl9ERVZJQ0UoMHgwNTBkLCAweDgwNUUpfSwKKwkvKiBTaXRlY29tICovCisJe1VTQl9ERVZJQ0UoMHgwZGY2LCAweDAwMzEpfSwKKwkvKiBFbkdlbml1cyAqLworCXtVU0JfREVWSUNFKDB4MTc0MCwgMHg5MjAxKX0sCisJLyogRGxpbmsgKi8KKwl7VVNCX0RFVklDRSgweDIwMDEsIDB4MzMwMSl9LAorCS8qIFppbndlbGwgKi8KKwl7VVNCX0RFVklDRSgweDVhNTcsIDB4MDI5MCl9LAorCXt9Cit9OworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiViAxLjEiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBydGw4MTkyX3VzYl9pZF90YmwpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBkcml2ZXIgZm9yIFJlYWx0ZWsgUlRMODE5MiBVU0IgV2lGaSBjYXJkcyIpOworCitzdGF0aWMgY2hhciogaWZuYW1lID0gIndsYW4lZCI7CitzdGF0aWMgaW50IGh3d2VwID0gMTsgIC8vZGVmYXVsdCB1c2UgaHcuIHNldCAwIHRvIHVzZSBzb2Z0d2FyZSBzZWN1cml0eQorc3RhdGljIGludCBjaGFubmVscyA9IDB4M2ZmZjsKKworCisKK21vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCBTX0lSVUdPfFNfSVdVU1IgKTsKKy8vbW9kdWxlX3BhcmFtKGh3c2VxbnVtLGludCwgU19JUlVHT3xTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShod3dlcCxpbnQsIFNfSVJVR098U19JV1VTUik7Cittb2R1bGVfcGFyYW0oY2hhbm5lbHMsaW50LCBTX0lSVUdPfFNfSVdVU1IpOworCitNT0RVTEVfUEFSTV9ERVNDKGlmbmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKKy8vTU9EVUxFX1BBUk1fREVTQyhod3NlcW51bSwiIFRyeSB0byB1c2UgaGFyZHdhcmUgODAyLjExIGhlYWRlciBzZXF1ZW5jZSBudW1iZXJzLiBaZXJvPWRlZmF1bHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHd3ZXAsIiBUcnkgdG8gdXNlIGhhcmR3YXJlIHNlY3VyaXR5IHN1cHBvcnQuICIpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVscywiIENoYW5uZWwgYml0bWFzayBmb3Igc3BlY2lmaWMgbG9jYWxlcy4gTllJIik7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxOTJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE5Ml91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CisKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHJ0bDgxOTJfdXNiX2RyaXZlciA9IHsKKwkubmFtZQkJPSBSVEw4MTl4VV9NT0RVTEVfTkFNRSwJCSAgLyogRHJpdmVyIG5hbWUgICAqLworCS5pZF90YWJsZQk9IHJ0bDgxOTJfdXNiX2lkX3RibCwJCSAgLyogUENJX0lEIHRhYmxlICAqLworCS5wcm9iZQkJPSBydGw4MTkyX3VzYl9wcm9iZSwJCSAgLyogcHJvYmUgZm4gICAgICAqLworCS5kaXNjb25uZWN0CT0gcnRsODE5Ml91c2JfZGlzY29ubmVjdCwJICAvKiByZW1vdmUgZm4gICAgICovCisjaWZkZWYgQ09ORklHX1JUTDgxOTJfUE0KKwkuc3VzcGVuZAk9IHJ0bDgxOTJfc3VzcGVuZCwJCSAgLyogUE0gc3VzcGVuZCBmbiAqLworCS5yZXN1bWUJCT0gcnRsODE5Ml9yZXN1bWUsICAgICAgICAgICAgICAgICAvKiBQTSByZXN1bWUgZm4gICovCisjZWxzZQorCS5zdXNwZW5kCT0gTlVMTCwJCQkJICAvKiBQTSBzdXNwZW5kIGZuICovCisJLnJlc3VtZSAgICAgIAk9IE5VTEwsCQkJCSAgLyogUE0gcmVzdW1lIGZuICAqLworI2VuZGlmCit9OworCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCit0eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9MSVNUCit7CisJdTgJQ2hhbm5lbFszMl07CisJdTgJTGVuOworfUNIQU5ORUxfTElTVCwgKlBDSEFOTkVMX0xJU1Q7CisKK3N0YXRpYyBDSEFOTkVMX0xJU1QgQ2hhbm5lbFBsYW5bXSA9IHsKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0LDE0OSwxNTMsMTU3LDE2MSwxNjV9LDI0fSwgIAkJLy9GQ0MKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfSwxMX0sICAgICAgICAgICAgICAgICAgICAJCQkJLy9JQworCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0VUU0kKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzfSwxM30sICAgIC8vU3BhaW4uIENoYW5nZSB0byBFVFNJLgorCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTN9LDEzfSwgIAkvL0ZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LAkvL01LSwkJCQkJLy9NS0sKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sLy9NS0sxCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9LAkvL0lzcmFlbC4KKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sCQkJLy8gRm9yIDExYSAsIFRFTEVDCisJe3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sIDIyfSwgICAgLy9NSUMKKwl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0JCQkJCS8vRm9yIEdsb2JhbCBEb21haW4uIDEtMTE6YWN0aXZlIHNjYW4sIDEyLTE0IHBhc3NpdmUgc2Nhbi4gLy8rWUosIDA4MDYyNgorfTsKKworc3RhdGljIHZvaWQgcnRsODE5eF9zZXRfY2hhbm5lbF9tYXAodTggY2hhbm5lbF9wbGFuLCBzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdikKK3sKKwlpbnQgaSwgbWF4X2NoYW49LTEsIG1pbl9jaGFuPS0xOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN3aXRjaCAoY2hhbm5lbF9wbGFuKQorCXsKKwkJY2FzZSBDT1VOVFJZX0NPREVfRkNDOgorCQljYXNlIENPVU5UUllfQ09ERV9JQzoKKwkJY2FzZSBDT1VOVFJZX0NPREVfRVRTSToKKwkJY2FzZSBDT1VOVFJZX0NPREVfU1BBSU46CisJCWNhc2UgQ09VTlRSWV9DT0RFX0ZSQU5DRToKKwkJY2FzZSBDT1VOVFJZX0NPREVfTUtLOgorCQljYXNlIENPVU5UUllfQ09ERV9NS0sxOgorCQljYXNlIENPVU5UUllfQ09ERV9JU1JBRUw6CisJCWNhc2UgQ09VTlRSWV9DT0RFX1RFTEVDOgorCQljYXNlIENPVU5UUllfQ09ERV9NSUM6CisJCXsKKwkJCURvdDExZF9Jbml0KGllZWUpOworCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOworCQkJLy9hY3R1cmFsbHkgODIyNSAmIDgyNTYgcmYgY2hpcCBvbmx5IHN1cHBvcnQgQixHLDI0TiBtb2RlCisJCQlpZiAoKHByaXYtPnJmX2NoaXAgPT0gUkZfODIyNSkgfHwgKHByaXYtPnJmX2NoaXAgPT0gUkZfODI1NikpCisJCQl7CisJCQkJbWluX2NoYW4gPSAxOworCQkJCW1heF9jaGFuID0gMTQ7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJ1bmtub3duIHJmIGNoaXAsIGNhbid0IHNldCBjaGFubmVsIG1hcCBpbiBmdW5jdGlvbjolcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfQorCQkJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuICE9IDApeworCQkJCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAorCQkJCW1lbXNldChHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwLCAwLCBzaXplb2YoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCkpOworCQkJCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKKwkJCQlmb3IgKGk9MDtpPENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuO2krKykKKwkJCQl7CisJCQkJCWlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPCBtaW5fY2hhbiB8fCBDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPiBtYXhfY2hhbikKKwkJCQkJYnJlYWs7CisJCQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXBbQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldXSA9IDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTjoKKwkJeworCQkJR0VUX0RPVDExRF9JTkZPKGllZWUpLT5iRW5hYmxlZCA9IDA7Ly90aGlzIGZsYWcgZW5hYmxlZCB0byBmb2xsb3cgMTFkIGNvdW50cnkgSUUgc2V0dGluZywgb3RoZXJ3aXNlLCBpdCBzaGFsbCBmb2xsb3cgZ2xvYmFsIGRvbWFpbiBzZXR0aW5ncy4KKwkJCURvdDExZF9SZXNldChpZWVlKTsKKwkJCWllZWUtPmJHbG9iYWxEb21haW4gPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2RlZmluZSBlcU1hY0FkZHIoYSxiKSAoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQorCisjZGVmaW5lIAlyeF9oYWxfaXNfY2NrX3JhdGUoX3BkcnZpbmZvKVwKKwkJCShfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTFNIHx8XAorCQkJX3BkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEUyTSB8fFwKKwkJCV9wZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFNV81TSB8fFwKKwkJCV9wZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFMTFNKSAmJlwKKwkJCSFfcGRydmluZm8tPlJ4SFRcCisKKwordm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHVsY29tbWFuZCA9IDA7CisJLy8yMDA0LzAyLzExICBJbiBzdGF0aWMgV0VQLCBPSURfQUREX0tFWSBvciBPSURfQUREX1dFUCBhcmUgc2V0IGJlZm9yZSBTVEEgYXNzb2NpYXRlIHRvIEFQLgorCS8vIEhvd2V2ZXIsIFJlc2V0S2V5IGlzIGNhbGxlZCBvbiBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREUgYW5kIE1sbWVBc3NvY2lhdGVSZXF1ZXN0CisJLy8gSW4gdGhpcyBjb25kaXRpb24sIENhbSBjYW4gbm90IGJlIHJlc2V0IGJlY2F1c2UgdXBwZXIgbGF5ZXIgd2lsbCBub3Qgc2V0IHRoaXMgc3RhdGljIGtleSBhZ2Fpbi4KKwkvL2lmKEFkYXB0ZXItPkVuY0FsZ29yaXRobSA9PSBXRVBfRW5jcnlwdGlvbikKKwkvLyAgICAgIHJldHVybjsKKy8vZGVidWcKKwkvL0RiZ1ByaW50KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwkvL0RiZ1ByaW50KCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbCBSZXNldEFsbEVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CisJLy9EYmdQcmludCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKKwl1bGNvbW1hbmQgfD0gQklUMzF8QklUMzA7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIHVsY29tbWFuZCk7CisKK30KKworCit2b2lkIHdyaXRlX2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyLCB1MzIgZGF0YSkKK3sKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXQ0FNSSwgZGF0YSk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIEJJVDMxfEJJVDE2fChhZGRyJjB4ZmYpICk7Cit9CisKK3UzMiByZWFkX2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZGRyKQoreworCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCAweDgwMDAwMDAwfChhZGRyJjB4ZmYpICk7CisJcmV0dXJuIHJlYWRfbmljX2R3b3JkKGRldiwgMHhhOCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX2J5dGVfRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCwgdTggZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX1NFVF9SRUdTLCBSVEw4MTg3X1JFUVRfV1JJVEUsCisJCQkgICAgICAgaW5keHwweGZlMDAsIDAsICZkYXRhLCAxLCBIWiAvIDIpOworCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoIndyaXRlX25pY19ieXRlX0UgVGltZU91dCEgc3RhdHVzOiVkXG4iLCBzdGF0dXMpOworCX0KK30KKwordTggcmVhZF9uaWNfYnl0ZV9FKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmR4KQoreworCWludCBzdGF0dXM7CisJdTggZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9HRVRfUkVHUywgUlRMODE4N19SRVFUX1JFQUQsCisJCQkgICAgICAgaW5keHwweGZlMDAsIDAsICZkYXRhLCAxLCBIWiAvIDIpOworCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoInJlYWRfbmljX2J5dGVfRSBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisvL2FzIDkyVSBoYXMgZXh0ZW5kIHBhZ2UgZnJvbSA0IHRvIDE2LCBzbyBtb2RpZnkgZnVuY3Rpb25zIGJlbG93Lgordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCwgdTggZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfU0VUX1JFR1MsIFJUTDgxODdfUkVRVF9XUklURSwKKwkJCSAgICAgICAoaW5keCYweGZmKXwweGZmMDAsIChpbmR4Pj44KSYweDBmLCAmZGF0YSwgMSwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJ3cml0ZV9uaWNfYnl0ZSBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisKK30KKworCit2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmR4LCB1MTYgZGF0YSkKK3sKKworCWludCBzdGF0dXM7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9TRVRfUkVHUywgUlRMODE4N19SRVFUX1dSSVRFLAorCQkJICAgICAgIChpbmR4JjB4ZmYpfDB4ZmYwMCwgKGluZHg+PjgpJjB4MGYsICZkYXRhLCAyLCBIWiAvIDIpOworCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoIndyaXRlX25pY193b3JkIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKKwl9CisKK30KKworCit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCwgdTMyIGRhdGEpCit7CisKKwlpbnQgc3RhdHVzOworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfU0VUX1JFR1MsIFJUTDgxODdfUkVRVF9XUklURSwKKwkJCSAgICAgICAoaW5keCYweGZmKXwweGZmMDAsIChpbmR4Pj44KSYweDBmLCAmZGF0YSwgNCwgSFogLyAyKTsKKworCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoIndyaXRlX25pY19kd29yZCBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCit9CisKKworCit1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmR4KQoreworCXU4IGRhdGE7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9HRVRfUkVHUywgUlRMODE4N19SRVFUX1JFQUQsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDEsIEhaIC8gMik7CisKKwlpZiAoc3RhdHVzIDwgMCkKKwl7CisJCXByaW50aygicmVhZF9uaWNfYnl0ZSBUaW1lT3V0ISBzdGF0dXM6JWRcbiIsIHN0YXR1cyk7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKKworCit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5keCkKK3sKKwl1MTYgZGF0YTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHByaXYtPnVkZXY7CisKKwlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAorCQkJICAgICAgIFJUTDgxODdfUkVRX0dFVF9SRUdTLCBSVEw4MTg3X1JFUVRfUkVBRCwKKwkJCSAgICAgICAoaW5keCYweGZmKXwweGZmMDAsIChpbmR4Pj44KSYweDBmLCAmZGF0YSwgMiwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJyZWFkX25pY193b3JkIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKKwl9CisKKworCXJldHVybiBkYXRhOworfQorCit1MTYgcmVhZF9uaWNfd29yZF9FKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmR4KQoreworCXUxNiBkYXRhOworCWludCBzdGF0dXM7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgUlRMODE4N19SRVFfR0VUX1JFR1MsIFJUTDgxODdfUkVRVF9SRUFELAorCQkJICAgICAgIGluZHh8MHhmZTAwLCAwLCAmZGF0YSwgMiwgSFogLyAyKTsKKworCWlmIChzdGF0dXMgPCAwKQorCXsKKwkJcHJpbnRrKCJyZWFkX25pY193b3JkIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKKwl9CisKKworCXJldHVybiBkYXRhOworfQorCit1MzIgcmVhZF9uaWNfZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZHgpCit7CisJdTMyIGRhdGE7CisJaW50IHN0YXR1czsKKy8vCWludCByZXN1bHQ7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwcml2LT51ZGV2OworCisJc3RhdHVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBSVEw4MTg3X1JFUV9HRVRfUkVHUywgUlRMODE4N19SRVFUX1JFQUQsCisJCQkgICAgICAgKGluZHgmMHhmZil8MHhmZjAwLCAoaW5keD4+OCkmMHgwZiwgJmRhdGEsIDQsIEhaIC8gMik7CisvLwlpZigwICE9IHJlc3VsdCkgeworLy8JICBwcmludGsoS0VSTl9XQVJOSU5HICJyZWFkIHNpemUgb2YgZGF0YSA9ICVkXCwgZGF0ZSA9ICVkXG4iLCByZXN1bHQsIGRhdGEpOworLy8JfQorCisJaWYgKHN0YXR1cyA8IDApCisJeworCQlwcmludGsoInJlYWRfbmljX2R3b3JkIFRpbWVPdXQhIHN0YXR1czolZFxuIiwgc3RhdHVzKTsKKwl9CisKKworCisJcmV0dXJuIGRhdGE7Cit9CisKKworLy91OCByZWFkX3BoeV9jY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKTsKKy8vdTggcmVhZF9waHlfb2ZkbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIpOworLyogdGhpcyBtaWdodCBzdGlsbCBjYWxsZWQgaW4gd2hhdCB3YXMgdGhlIFBIWSBydGw4MTg1L3J0bDgxOTIgY29tbW9uIGNvZGUKKyAqIHBsYW5zIGFyZSB0byBwb3NzaWJpbHR5IHR1cm4gaXQgYWdhaW4gaW4gb25lIGNvbW1vbiBjb2RlLi4uCisgKi8KK2lubGluZSB2b2lkIGZvcmNlX3BjaV9wb3N0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTkyX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vdm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworLy92b2lkIHJ0bDgxOTJfcnFfdHhfYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK3ZvaWQgd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVBST0NGUyBTVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpydGw4MTkyX3Byb2MgPSBOVUxMOworCisKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19hcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisKKwlpbnQgbGVuID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGFyZ2V0LCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7CisKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkiJXMgIiwgdGFyZ2V0LT5zc2lkKTsKKworCQlpZih0YXJnZXQtPndwYV9pZV9sZW4+MCB8fCB0YXJnZXQtPnJzbl9pZV9sZW4+MCl7CisJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiV1BBXG4iKTsKKwkJfQorCQllbHNleworCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIm5vbl9XUEFcbiIpOworCQl9CisKKwl9CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVycyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKy8vCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWludCBsZW4gPSAwOworCWludCBpLG47CisKKwlpbnQgbWF4PTB4ZmY7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlIDAjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKKworCWZvcihuPTA7bjw9bWF4OykKKwl7CisJCS8vcHJpbnRrKCAiXG5EOiAlMng+ICIsIG4pOworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG5EOiAgJTJ4ID4gIixuKTsKKworCQlmb3IoaT0wO2k8MTYgJiYgbjw9bWF4O2krKyxuKyspCisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSIlMnggIixyZWFkX25pY19ieXRlKGRldiwweDAwMHxuKSk7CisKKwkJLy8JcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlIDEjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKKwlmb3Iobj0wO248PW1heDspCisJeworCQkvL3ByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogICUyeCA+ICIsbik7CisKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsMHgxMDB8bikpOworCisJCS8vICAgICAgcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlIDMjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKKwlmb3Iobj0wO248PW1heDspCisJeworCQkvL3ByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogICUyeCA+ICIsbik7CisKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiJTJ4ICIscmVhZF9uaWNfYnl0ZShkZXYsMHgzMDB8bikpOworCisJCS8vICAgICAgcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorCisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKKworfQorCisKKworCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfdHgoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJUWCBWSSBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggVkkgcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIFZPIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBWTyBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorCQkiVFggQkUgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIEJFIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBCSyBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggQksgcHJpb3JpdHkgZXJyb3IgaW50OiAlbHVcbiIKKwkJIlRYIE1BTkFHRSBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggTUFOQUdFIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBCRUFDT04gcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIEJFQUNPTiBwcmlvcml0eSBlcnJvciBpbnQ6ICVsdVxuIgorLy8JCSJUWCBoaWdoIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisvLwkJIlRYIGhpZ2ggcHJpb3JpdHkgZmFpbGVkIGVycm9yIGludDogJWx1XG4iCisJCSJUWCBxdWV1ZSByZXN1bWU6ICVsdVxuIgorCQkiVFggcXVldWUgc3RvcHBlZD86ICVkXG4iCisJCSJUWCBmaWZvIG92ZXJmbG93OiAlbHVcbiIKKy8vCQkiVFggYmVhY29uOiAlbHVcbiIKKwkJIlRYIFZJIHF1ZXVlOiAlZFxuIgorCQkiVFggVk8gcXVldWU6ICVkXG4iCisJCSJUWCBCRSBxdWV1ZTogJWRcbiIKKwkJIlRYIEJLIHF1ZXVlOiAlZFxuIgorLy8JCSJUWCBIVyBxdWV1ZTogJWRcbiIKKwkJIlRYIFZJIGRyb3BwZWQ6ICVsdVxuIgorCQkiVFggVk8gZHJvcHBlZDogJWx1XG4iCisJCSJUWCBCRSBkcm9wcGVkOiAlbHVcbiIKKwkJIlRYIEJLIGRyb3BwZWQ6ICVsdVxuIgorCQkiVFggdG90YWwgZGF0YSBwYWNrZXRzICVsdVxuIiwKKy8vCQkiVFggYmVhY29uIGFib3J0ZWQ6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMudHh2aW9raW50LAorCQlwcml2LT5zdGF0cy50eHZpZXJyLAorCQlwcml2LT5zdGF0cy50eHZvb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4dm9lcnIsCisJCXByaXYtPnN0YXRzLnR4YmVva2ludCwKKwkJcHJpdi0+c3RhdHMudHhiZWVyciwKKwkJcHJpdi0+c3RhdHMudHhia29raW50LAorCQlwcml2LT5zdGF0cy50eGJrZXJyLAorCQlwcml2LT5zdGF0cy50eG1hbmFnZW9raW50LAorCQlwcml2LT5zdGF0cy50eG1hbmFnZWVyciwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25va2ludCwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIsCisvLwkJcHJpdi0+c3RhdHMudHhocG9raW50LAorLy8JCXByaXYtPnN0YXRzLnR4aHBlcnIsCisJCXByaXYtPnN0YXRzLnR4cmVzdW1lZCwKKwkJbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpLAorCQlwcml2LT5zdGF0cy50eG92ZXJmbG93LAorLy8JCXByaXYtPnN0YXRzLnR4YmVhY29uLAorCQlhdG9taWNfcmVhZCgmKHByaXYtPnR4X3BlbmRpbmdbVklfUFJJT1JJVFldKSksCisJCWF0b21pY19yZWFkKCYocHJpdi0+dHhfcGVuZGluZ1tWT19QUklPUklUWV0pKSwKKwkJYXRvbWljX3JlYWQoJihwcml2LT50eF9wZW5kaW5nW0JFX1BSSU9SSVRZXSkpLAorCQlhdG9taWNfcmVhZCgmKHByaXYtPnR4X3BlbmRpbmdbQktfUFJJT1JJVFldKSksCisvLwkJcmVhZF9uaWNfYnl0ZShkZXYsIFRYRklGT0NPVU5UKSwKKwkJcHJpdi0+c3RhdHMudHh2aWRyb3AsCisJCXByaXYtPnN0YXRzLnR4dm9kcm9wLAorCQlwcml2LT5zdGF0cy50eGJlZHJvcCwKKwkJcHJpdi0+c3RhdHMudHhia2Ryb3AsCisJCXByaXYtPnN0YXRzLnR4ZGF0YXBrdAorLy8JCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyCisJCSk7CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCisKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19yeChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIlJYIHBhY2tldHM6ICVsdVxuIgorCQkiUlggdXJiIHN0YXR1cyBlcnJvcjogJWx1XG4iCisJCSJSWCBpbnZhbGlkIHVyYiBlcnJvcjogJWx1XG4iLAorCQlwcml2LT5zdGF0cy5yeG9rdG90YWwsCisJCXByaXYtPnN0YXRzLnJ4c3RhdGVyciwKKwkJcHJpdi0+c3RhdHMucnh1cmJlcnIpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KK3ZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KHZvaWQpCit7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiSW5pdGlhbGl6aW5nIHByb2MgZmlsZXN5c3RlbSIpOworCXJ0bDgxOTJfcHJvYz1jcmVhdGVfcHJvY19lbnRyeShSVEw4MTl4VV9NT0RVTEVfTkFNRSwgU19JRkRJUiwgaW5pdF9uZXQucHJvY19uZXQpOworfQorCisKK3ZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9yZW1vdmUodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeShSVEw4MTl4VV9NT0RVTEVfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworfQorCisKK3ZvaWQgcnRsODE5Ml9wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKworCWlmIChwcml2LT5kaXJfZGV2KSB7CisJLy8JcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWh3IiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy10eCIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtcngiLCBwcml2LT5kaXJfZGV2KTsKKwkvLwlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtaWVlZSIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtYXAiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycyIsIHByaXYtPmRpcl9kZXYpOworCS8vCXJlbW92ZV9wcm9jX2VudHJ5KCJjY2stcmVnaXN0ZXJzIixwcml2LT5kaXJfZGV2KTsKKwkvLwlyZW1vdmVfcHJvY19lbnRyeSgib2ZkbS1yZWdpc3RlcnMiLHByaXYtPmRpcl9kZXYpOworCQkvL3JlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgcnRsODE5Ml9wcm9jKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIndsYW4wIiwgcnRsODE5Ml9wcm9jKTsKKwkJcHJpdi0+ZGlyX2RldiA9IE5VTEw7CisJfQorfQorCisKK3ZvaWQgcnRsODE5Ml9wcm9jX2luaXRfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5kaXJfZGV2ID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLAorCQkJCQkgIFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwkJCQkJICBydGw4MTkyX3Byb2MpOworCWlmICghcHJpdi0+ZGlyX2RldikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC9ydGw4MTkyLyVzXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1yeCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX3J4LCBkZXYpOworCisJaWYgKCFlKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9zdGF0cy1yeFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy10eCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX3R4LCBkZXYpOworCisJaWYgKCFlKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtdHhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJfQorCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLWFwIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfYXAsIGRldik7CisKKwlpZiAoIWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9zdGF0cy1hcFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9CisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzLCBkZXYpOworCWlmICghZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3JlZ2lzdGVyc1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1NSVNDIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHRoaXMgaXMgb25seSBmb3IgZGVidWdnaW5nICovCit2b2lkIHByaW50X2J1ZmZlcih1MzIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1OCAqYnVmID0odTgqKWJ1ZmZlcjsKKworCXByaW50aygiQVNDSUkgQlVGRkVSIERVTVAgKGxlbjogJXgpOlxuIixsZW4pOworCisJZm9yKGk9MDtpPGxlbjtpKyspCisJCXByaW50aygiJWMiLGJ1ZltpXSk7CisKKwlwcmludGsoIlxuQklOQVJZIEJVRkZFUiBEVU1QIChsZW46ICV4KTpcbiIsbGVuKTsKKworCWZvcihpPTA7aTxsZW47aSsrKQorCQlwcmludGsoIiV4IixidWZbaV0pOworCisJcHJpbnRrKCJcbiIpOworfQorCisvL3Nob3J0IGNoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBwcmlvcml0eV90IHByaW9yaXR5KQorc2hvcnQgY2hlY2tfbmljX2Vub3VnaF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IHF1ZXVlX2luZGV4KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgdXNlZCA9IGF0b21pY19yZWFkKCZwcml2LT50eF9wZW5kaW5nW3F1ZXVlX2luZGV4XSk7CisKKwlyZXR1cm4gKHVzZWQgPCBNQVhfVFhfVVJCKTsKK30KKwordm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vcnRsODE5Ml9jb21taXQoZGV2KTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKKwkvL0RNRVNHKCJUWFRJTUVPVVQiKTsKK30KKworCisvKiB0aGlzIGlzIG9ubHkgZm9yIGRlYnVnICovCit2b2lkIGR1bXBfZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlmb3IoaT0wOyBpPDYzOyBpKyspCisJCVJUX1RSQUNFKENPTVBfRVBST00sICJFRVBST00gYWRkciAleCA6ICV4IiwgaSwgZXByb21fcmVhZChkZXYsaSkpOworfQorCisvKiB0aGlzIGlzIG9ubHkgZm9yIGRlYnVnICovCit2b2lkIHJ0bDgxOTJfZHVtcF9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKwlpbnQgbWF4PTB4MWZmOworCisJUlRfVFJBQ0UoQ09NUF9QSFksICJEdW1waW5nIE5JQyByZWdpc3RlciBtYXAiKTsKKworCWZvcihuPTA7bjw9bWF4OykKKwl7CisJCXByaW50ayggIlxuRDogJTJ4PiAiLCBuKTsKKwkJZm9yKGk9MDtpPDE2ICYmIG48PW1heDtpKyssbisrKQorCQkJcHJpbnRrKCIlMnggIixyZWFkX25pY19ieXRlKGRldixuKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUhXIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCit2b2lkIHJ0bDgxOTJfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgbW9kZSkKK3sKKwl1OCBlY21kOworCWVjbWQ9cmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCk7CisJZWNtZD1lY21kICZ+IEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9NQVNLOworCWVjbWQ9ZWNtZCB8IChtb2RlPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpOworCWVjbWQ9ZWNtZCAmfiAoMTw8RVBST01fQ1NfU0hJRlQpOworCWVjbWQ9ZWNtZCAmfiAoMTw8RVBST01fQ0tfU0hJRlQpOworCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCBlY21kKTsKK30KKworCit2b2lkIHJ0bDgxOTJfdXBkYXRlX21zcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBtc3I7CisKKwltc3IgID0gcmVhZF9uaWNfYnl0ZShkZXYsIE1TUik7CisJbXNyICY9IH4gTVNSX0xJTktfTUFTSzsKKworCS8qIGRvIG5vdCBjaGFuZ2UgaW4gbGlua19zdGF0ZSAhPSBXTEFOX0xJTktfQVNTT0NJQVRFRC4KKwkgKiBtc3IgbXVzdCBiZSB1cGRhdGVkIGlmIHRoZSBzdGF0ZSBpcyBBU1NPQ0lBVElORy4KKwkgKiB0aGlzIGlzIGludGVudGlvbmFsIGFuZCBtYWtlIHNlbnNlIGZvciBhZC1ob2MgYW5kCisJICogbWFzdGVyIChzZWUgdGhlIGNyZWF0ZSBCU1MvSUJTUyBmdW5jKQorCSAqLworCWlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpeworCisJCWlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCW1zciB8PSAoTVNSX0xJTktfTUFOQUdFRDw8TVNSX0xJTktfU0hJRlQpOworCQllbHNlIGlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCW1zciB8PSAoTVNSX0xJTktfQURIT0M8PE1TUl9MSU5LX1NISUZUKTsKKwkJZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQorCQkJbXNyIHw9IChNU1JfTElOS19NQVNURVI8PE1TUl9MSU5LX1NISUZUKTsKKworCX1lbHNlCisJCW1zciB8PSAoTVNSX0xJTktfTk9ORTw8TVNSX0xJTktfU0hJRlQpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIG1zcik7Cit9CisKK3ZvaWQgcnRsODE5Ml9zZXRfY2hhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHNob3J0IGNoKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vCXUzMiB0eDsKKwlSVF9UUkFDRShDT01QX0NILCAiPT09PT0+JXMoKT09PT1jaDolZFxuIiwgX19GVU5DVElPTl9fLCBjaCk7CisJcHJpdi0+Y2hhbj1jaDsKKworCS8qIHRoaXMgaGFjayBzaG91bGQgYXZvaWQgZnJhbWUgVFggZHVyaW5nIGNoYW5uZWwgc2V0dGluZyovCisKKworLy8JdHggPSByZWFkX25pY19kd29yZChkZXYsVFhfQ09ORik7CisvLwl0eCAmPSB+VFhfTE9PUEJBQ0tfTUFTSzsKKworI2lmbmRlZiBMT09QX1RFU1QKKy8vCXdyaXRlX25pY19kd29yZChkZXYsVFhfQ09ORiwgdHggfCggVFhfTE9PUEJBQ0tfTUFDPDxUWF9MT09QQkFDS19TSElGVCkpOworCisJLy9uZWVkIHRvIGltcGxlbWVudCByZiBzZXQgY2hhbm5lbCBoZXJlIFdCCisKKwlpZiAocHJpdi0+cmZfc2V0X2NoYW4pCisJcHJpdi0+cmZfc2V0X2NoYW4oZGV2LHByaXYtPmNoYW4pOworCW1kZWxheSgxMCk7CisvLwl3cml0ZV9uaWNfZHdvcmQoZGV2LFRYX0NPTkYsdHggfCAoVFhfTE9PUEJBQ0tfTk9ORTw8VFhfTE9PUEJBQ0tfU0hJRlQpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBydGw4MTkyX3J4X2lzcihzdHJ1Y3QgdXJiICp1cmIpOworLy9zdGF0aWMgdm9pZCBydGw4MTkyX3J4X2lzcihzdHJ1Y3QgdXJiICpyeF91cmIpOworCit1MzIgZ2V0X3J4cGFja2V0X3NoaWZ0Ynl0ZXNfODE5eHVzYihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMpCit7CisKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCWlmIChwc3RhdHMtPmJpc3J4YWdncnN1YmZyYW1lKQorCQlyZXR1cm4gKHNpemVvZihyeF9kZXNjXzgxOXhfdXNiKSArIHBzdGF0cy0+UnhEcnZJbmZvU2l6ZQorCQkJKyBwc3RhdHMtPlJ4QnVmU2hpZnQgKyA4KTsKKwllbHNlCisjZW5kaWYKKwkJcmV0dXJuIChzaXplb2YocnhfZGVzY184MTl4X3VzYikgKyBwc3RhdHMtPlJ4RHJ2SW5mb1NpemUKKwkJCQkrIHBzdGF0cy0+UnhCdWZTaGlmdCk7CisKK30KK3N0YXRpYyBpbnQgcnRsODE5Ml9yeF9pbml0aWF0ZShzdHJ1Y3QgbmV0X2RldmljZSpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCB1cmIgKmVudHJ5OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqaW5mbzsKKworCS8qIG5vbWFsIHBhY2tldCByeCBwcm9jZWR1cmUgKi8KKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+cnhfcXVldWUpIDwgTUFYX1JYX1VSQikgeworCQlza2IgPSBfX2Rldl9hbGxvY19za2IoUlhfVVJCX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIXNrYikKKwkJCWJyZWFrOworCQllbnRyeSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghZW50cnkpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKy8vCQlwcmludGsoIm5vbWFsIHBhY2tldCBJTiByZXF1ZXN0IVxuIik7CisJCXVzYl9maWxsX2J1bGtfdXJiKGVudHJ5LCBwcml2LT51ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHByaXYtPnVkZXYsIDMpLCBza2JfdGFpbF9wb2ludGVyKHNrYiksCisJCQkJICBSWF9VUkJfU0laRSwgcnRsODE5Ml9yeF9pc3IsIHNrYik7CisJCWluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKSBza2ItPmNiOworCQlpbmZvLT51cmIgPSBlbnRyeTsKKwkJaW5mby0+ZGV2ID0gZGV2OworCQlpbmZvLT5vdXRfcGlwZSA9IDM7IC8vZGVub3RlIHJ4IG5vcm1hbCBwYWNrZXQgcXVldWUKKwkJc2tiX3F1ZXVlX3RhaWwoJnByaXYtPnJ4X3F1ZXVlLCBza2IpOworCQl1c2Jfc3VibWl0X3VyYihlbnRyeSwgR0ZQX0tFUk5FTCk7CisJfQorCisJLyogY29tbWFuZCBwYWNrZXQgcnggcHJvY2VkdXJlICovCisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPnJ4X3F1ZXVlKSA8IE1BWF9SWF9VUkIgKyAzKSB7CisvLwkJcHJpbnRrKCJjb21tYW5kIHBhY2tldCBJTiByZXF1ZXN0IVxuIik7CisJCXNrYiA9IF9fZGV2X2FsbG9jX3NrYihSWF9VUkJfU0laRSAsR0ZQX0tFUk5FTCk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisJCWVudHJ5ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfQorCQl1c2JfZmlsbF9idWxrX3VyYihlbnRyeSwgcHJpdi0+dWRldiwKKwkJCQkgIHVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LCA5KSwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAorCQkJCSAgUlhfVVJCX1NJWkUsIHJ0bDgxOTJfcnhfaXNyLCBza2IpOworCQlpbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKikgc2tiLT5jYjsKKwkJaW5mby0+dXJiID0gZW50cnk7CisJCWluZm8tPmRldiA9IGRldjsKKwkJICAgaW5mby0+b3V0X3BpcGUgPSA5OyAvL2Rlbm90ZSByeCBjbWQgcGFja2V0IHF1ZXVlCisJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5yeF9xdWV1ZSwgc2tiKTsKKwkJdXNiX3N1Ym1pdF91cmIoZW50cnksIEdGUF9LRVJORUwpOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHJ0bDgxOTJfc2V0X3J4Y29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgcnhjb25mOworCisJcnhjb25mPXJlYWRfbmljX2R3b3JkKGRldixSQ1IpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQUNfRklMVEVSX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgUkNSX0FNRjsKKwlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQURGOworCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BQjsKKwlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQU07CisJLy9yeGNvbmYgPSByeGNvbmYgfCBSQ1JfQUNGOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykge0RNRVNHICgiTklDIGluIHByb21pc2MgbW9kZSIpO30KKworCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgXAorCSAgIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyl7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BQVA7CisJfSAvKmVsc2UgaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwkJcnhjb25mID0gcnhjb25mIHwgKDE8PEFDQ0VQVF9BTExNQUNfRlJBTUVfU0hJRlQpOworCQlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UlhfQ0hFQ0tfQlNTSURfU0hJRlQpOworCX0qL2Vsc2V7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BUE07CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9DQlNTSUQ7CisJfQorCisKKwlpZihwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKXsKKwkJcnhjb25mID0gcnhjb25mIHwgUkNSX0FJQ1Y7CisJCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9BUFdSTUdUOworCX0KKworCWlmKCBwcml2LT5jcmNtb24gPT0gMSAmJiBwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyeGNvbmYgPSByeGNvbmYgfCBSQ1JfQUNSQzMyOworCisKKwlyeGNvbmYgPSByeGNvbmYgJn4gUlhfRklGT19USFJFU0hPTERfTUFTSzsKKwlyeGNvbmYgPSByeGNvbmYgfCAoUlhfRklGT19USFJFU0hPTERfTk9ORTw8UlhfRklGT19USFJFU0hPTERfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiAmfiBNQVhfUlhfRE1BX01BU0s7CisJcnhjb25mID0gcnhjb25mIHwgKCh1MzIpNzw8UkNSX01YRE1BX09GRlNFVCk7CisKKy8vCXJ4Y29uZiA9IHJ4Y29uZiB8ICgxPDxSWF9BVVRPUkVTRVRQSFlfU0hJRlQpOworCXJ4Y29uZiA9IHJ4Y29uZiB8IFJDUl9PTkxZRVJMUEtUOworCisvLwlyeGNvbmYgPSByeGNvbmYgJn4gUkNSX0NTX01BU0s7CisvLwlyeGNvbmYgPSByeGNvbmYgfCAoMTw8UkNSX0NTX1NISUZUKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcnhjb25mKTsKKworCSNpZmRlZiBERUJVR19SWAorCURNRVNHKCJyeGNvbmY6ICV4ICV4IixyeGNvbmYgLHJlYWRfbmljX2R3b3JkKGRldixSQ1IpKTsKKwkjZW5kaWYKK30KKy8vd2FpdCB0byBiZSByZW1vdmVkCit2b2lkIHJ0bDgxOTJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy91OCBjbWQ7CisKKwkvL3N0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJ0bDgxOTJfcnhfaW5pdGlhdGUoZGV2KTsKKworLy8JcnRsODE5Ml9zZXRfcnhjb25mKGRldik7Cit9CisKKwordm9pZCBydGw4MTkyX3R4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworfQorCisKKwordm9pZCBydGw4MTkyX3J0eF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggY21kOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm87CisKKwljbWQ9cmVhZF9uaWNfYnl0ZShkZXYsQ01EUik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDTURSLCBjbWQgJn4gXAorCQkoQ1JfVEV8Q1JfUkUpKTsKKwlmb3JjZV9wY2lfcG9zdGluZyhkZXYpOworCW1kZWxheSgxMCk7CisKKwl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnByaXYtPnJ4X3F1ZXVlKSkpIHsKKwkJaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopIHNrYi0+Y2I7CisJCWlmICghaW5mby0+dXJiKQorCQkJY29udGludWU7CisKKwkJdXNiX2tpbGxfdXJiKGluZm8tPnVyYik7CisJCWtmcmVlX3NrYihza2IpOworCX0KKworCWlmIChza2JfcXVldWVfbGVuKCZwcml2LT5za2JfcXVldWUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNrYl9xdWV1ZSBub3QgZW1wdHlcbiIpOworCX0KKworCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+c2tiX3F1ZXVlKTsKKwlyZXR1cm47Cit9CisKKworaW50IGFsbG9jX3R4X2JlYWNvbl9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50KQoreworCXJldHVybiAwOworfQorCitpbmxpbmUgdTE2IGllZWVyYXRlMnJ0bHJhdGUoaW50IHJhdGUpCit7CisJc3dpdGNoKHJhdGUpeworCWNhc2UgMTA6CisJcmV0dXJuIDA7CisJY2FzZSAyMDoKKwlyZXR1cm4gMTsKKwljYXNlIDU1OgorCXJldHVybiAyOworCWNhc2UgMTEwOgorCXJldHVybiAzOworCWNhc2UgNjA6CisJcmV0dXJuIDQ7CisJY2FzZSA5MDoKKwlyZXR1cm4gNTsKKwljYXNlIDEyMDoKKwlyZXR1cm4gNjsKKwljYXNlIDE4MDoKKwlyZXR1cm4gNzsKKwljYXNlIDI0MDoKKwlyZXR1cm4gODsKKwljYXNlIDM2MDoKKwlyZXR1cm4gOTsKKwljYXNlIDQ4MDoKKwlyZXR1cm4gMTA7CisJY2FzZSA1NDA6CisJcmV0dXJuIDExOworCWRlZmF1bHQ6CisJcmV0dXJuIDM7CisKKwl9Cit9CitzdGF0aWMgdTE2IHJ0bF9yYXRlW10gPSB7MTAsMjAsNTUsMTEwLDYwLDkwLDEyMCwxODAsMjQwLDM2MCw0ODAsNTQwfTsKK2lubGluZSB1MTYgcnRsODE5Ml9yYXRlMnJhdGUoc2hvcnQgcmF0ZSkKK3sKKwlpZiAocmF0ZSA+MTEpIHJldHVybiAwOworCXJldHVybiBydGxfcmF0ZVtyYXRlXTsKK30KKworCisvKiBUaGUgcHJvdHlwZSBvZiByeF9pc3IgaGFzIGNoYW5nZWQgc2luY2Ugb25lIHZlcmlvbiBvZiBMaW51eCBLZXJuZWwgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcnhfaXNyKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBvdXRfcGlwZSA9IGluZm8tPm91dF9waXBlOworCWludCBlcnI7CisJaWYoIXByaXYtPnVwKQorCQlyZXR1cm47CisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzKSkgeworCQlpbmZvLT51cmIgPSBOVUxMOworCQlwcml2LT5zdGF0cy5yeHN0YXRlcnIrKzsKKwkJcHJpdi0+aWVlZTgwMjExLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJLy8JcHJpbnRrKCIlcygpOnJ4IHN0YXR1cyBlcnJcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlza2JfdW5saW5rKHNrYiwgJnByaXYtPnJ4X3F1ZXVlKTsKKwlza2JfcHV0KHNrYiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKworCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5za2JfcXVldWUsIHNrYik7CisJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihSWF9VUkJfU0laRSk7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlwcmludGsoIiVzKCk6Y2FuLHQgYWxsb2Mgc2tiXG4iLF9fRlVOQ1RJT05fXyk7CisJCS8qIFRPRE8gY2hlY2sgcnggcXVldWUgbGVuZ3RoIGFuZCByZWZpbGwgKnNvbWV3aGVyZSogKi8KKwkJcmV0dXJuOworCX0KKworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgcHJpdi0+dWRldiwKKwkJCXVzYl9yY3ZidWxrcGlwZShwcml2LT51ZGV2LCBvdXRfcGlwZSksIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwKKwkJCVJYX1VSQl9TSVpFLCBydGw4MTkyX3J4X2lzciwgc2tiKTsKKworCWluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKSBza2ItPmNiOworCWluZm8tPnVyYiA9IHVyYjsKKwlpbmZvLT5kZXYgPSBkZXY7CisJaW5mby0+b3V0X3BpcGUgPSBvdXRfcGlwZTsKKworCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCXVyYi0+Y29udGV4dCA9IHNrYjsKKwlza2JfcXVldWVfdGFpbCgmcHJpdi0+cnhfcXVldWUsIHNrYik7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZihlcnIgJiYgZXJyICE9IEVQRVJNKQorCQlwcmludGsoImNhbiBub3Qgc3VibWl0IHJ4dXJiLCBlcnIgaXMgJXgsVVJCIHN0YXR1cyBpcyAleFxuIixlcnIsdXJiLT5zdGF0dXMpOworfQorCit1MzIKK3J0bDgxOXh1c2JfcnhfY29tbWFuZF9wYWNrZXQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMKKwkpCit7CisJdTMyCXN0YXR1czsKKworCS8vUlRfVFJBQ0UoQ09NUF9SRUNWLCBEQkdfVFJBQ0UsICgiLS0tPiBSeENvbW1hbmRQYWNrZXRIYW5kbGU4MTl4VXNiKClcbiIpKTsKKworCXN0YXR1cyA9IGNtcGtfbWVzc2FnZV9oYW5kbGVfcngoZGV2LCBwc3RhdHMpOworCWlmIChzdGF0dXMpCisJeworCQlETUVTRygicnhjb21tYW5kcGFja2V0aGFuZGxlODE5eHVzYjogSXQgaXMgYSBjb21tYW5kIHBhY2tldFxuIik7CisJfQorCWVsc2UKKwl7CisJCS8vUlRfVFJBQ0UoQ09NUF9SRUNWLCBEQkdfVFJBQ0UsICgiUnhDb21tYW5kUGFja2V0SGFuZGxlODE5eFVzYjogSXQgaXMgbm90IGEgY29tbWFuZCBwYWNrZXRcbiIpKTsKKwl9CisKKwkvL1JUX1RSQUNFKENPTVBfUkVDViwgREJHX1RSQUNFLCAoIjwtLS0gUnhDb21tYW5kUGFja2V0SGFuZGxlODE5eFVzYigpXG4iKSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvL0ZJWE1FICEhCit9CisKKwordm9pZCBydGw4MTkyX2RhdGFfaGFyZF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvLyBGSVhNRSAhIQorfQorCisvKiB0aGlzIGZ1bmN0aW9uIFRYIGRhdGEgZnJhbWVzIHdoZW4gdGhlIGllZWU4MDIxMSBzdGFjayByZXF1aXJlcyB0aGlzLgorICogSXQgY2hlY2tzIGFsc28gaWYgd2UgbmVlZCB0byBzdG9wIHRoZSBpZWVlIHR4IHF1ZXVlLCBldmVudHVhbGx5IGRvIGl0CisgKi8KK3ZvaWQgcnRsODE5Ml9oYXJkX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwl1OCBxdWV1ZV9pbmRleCA9IHRjYl9kZXNjLT5xdWV1ZV9pbmRleDsKKworCS8qIHNoYWxsIG5vdCBiZSByZWZlcnJlZCBieSBjb21tYW5kIHBhY2tldCAqLworCWFzc2VydChxdWV1ZV9pbmRleCAhPSBUWENNRF9RVUVVRSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7CisvLwl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKy8vCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKKy8vCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOworCXRjYl9kZXNjLT5iVHhFbmFibGVGd0NhbGNEdXIgPSAxOworCXNrYl9wdXNoKHNrYiwgcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7CisJcmV0ID0gcnRsODE5Ml90eChkZXYsIHNrYik7CisKKwkvL3ByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfYnl0ZXMrPShza2ItPmxlbiAtIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOworCS8vcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLGZsYWdzKTsKKworLy8JcmV0dXJuIHJldDsKKwlyZXR1cm47Cit9CisKKy8qIFRoaXMgaXMgYSByb3VnaCBhdHRlbXB0IHRvIFRYIGEgZnJhbWUKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBpZWVlIDgwMjExIHN0YWNrIHRvIFRYIG1hbmFnZW1lbnQgZnJhbWVzLgorICogSWYgdGhlIHJpbmcgaXMgZnVsbCBwYWNrZXQgYXJlIGRyb3BwZWQgKGZvciBkYXRhIGZyYW1lIHRoZSBxdWV1ZQorICogaXMgc3RvcHBlZCBiZWZvcmUgdGhpcyBjYW4gaGFwcGVuKS4KKyAqLworaW50IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2Isc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwl1OCBxdWV1ZV9pbmRleCA9IHRjYl9kZXNjLT5xdWV1ZV9pbmRleDsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssZmxhZ3MpOworCisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOworCWlmKHF1ZXVlX2luZGV4ID09IFRYQ01EX1FVRVVFKSB7CisJCXNrYl9wdXNoKHNrYiwgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwkJcnRsODE5eFVfdHhfY21kKGRldiwgc2tiKTsKKwkJcmV0ID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJc2tiX3B1c2goc2tiLCBwcml2LT5pZWVlODAyMTEtPnR4X2hlYWRyb29tKTsKKwkJcmV0ID0gcnRsODE5Ml90eChkZXYsIHNrYik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3ZvaWQgcnRsODE5Ml90cnlfd2FrZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpKTsKKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCit1MTYgRHJ2QWdncl9QYWRkaW5nQWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTE2ICAgICBQYWRkaW5nTnVtID0gIDI1NiAtICgoc2tiLT5sZW4gKyBUWF9QQUNLRVRfRFJWQUdHUl9TVUJGUkFNRV9TSElGVF9CWVRFUykgJSAyNTYpOworCXJldHVybiAgKFBhZGRpbmdOdW0mMHhmZik7Cit9CisKK3U4IE1SYXRlVG9Id1JhdGU4MTkwUGNpKHU4IHJhdGUpOwordTggUXVlcnlJc1Nob3J0KHU4IFR4SFQsIHU4IFR4UmF0ZSwgY2JfZGVzYyAqdGNiX2Rlc2MpOwordTggTWFwSHdRdWV1ZVRvRmlybXdhcmVRdWV1ZSh1OCBRdWV1ZUlEKTsKK3N0cnVjdCBza19idWZmICpEcnZBZ2dyX0FnZ3JlZ2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIgKnBTZW5kTGlzdCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWNiX2Rlc2MgCSp0Y2JfZGVzYyA9IE5VTEw7CisJdTggCQlpOworCXUzMgkJVG90YWxMZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAgKmFnZ19za2I7CisJdHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lICp0eF9hZ2dfZGVzYyA9IE5VTEw7CisJdHhfZndpbmZvXzgxOXhfdXNiCSAgICAgICAqdHhfZndpbmZvID0gTlVMTDsKKworCS8vCisJLy8gTG9jYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCisJLy8KKwkvKiBmaXJzdCBza2IgaW5pdGlhbGl6YXRpb24gKi8KKwlza2IgPSBwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbMF07CisJVG90YWxMZW5ndGggPSBza2ItPmxlbjsKKworCS8qIEdldCB0aGUgdG90YWwgYWdncmVnYXRpb24gbGVuZ3RoIGluY2x1ZGluZyB0aGUgcGFkZGluZyBzcGFjZSBhbmQKKwkgKiBzdWIgZnJhbWUgaGVhZGVyLgorCSAqLworCWZvcihpID0gMTsgaSA8IHBTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXM7IGkrKykgeworCQlUb3RhbExlbmd0aCArPSBEcnZBZ2dyX1BhZGRpbmdBZGQoZGV2LCBza2IpOworCQlza2IgPSBwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbaV07CisJCVRvdGFsTGVuZ3RoICs9IChza2ItPmxlbiArIFRYX1BBQ0tFVF9EUlZBR0dSX1NVQkZSQU1FX1NISUZUX0JZVEVTKTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBza2IgdG8gY29udGFpbiB0aGUgYWdncmVnYXRlZCBwYWNrZXRzICovCisJYWdnX3NrYiA9IGRldl9hbGxvY19za2IoVG90YWxMZW5ndGggKyBpZWVlLT50eF9oZWFkcm9vbSk7CisJbWVtc2V0KGFnZ19za2ItPmRhdGEsIDAsIGFnZ19za2ItPmxlbik7CisJc2tiX3Jlc2VydmUoYWdnX3NrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisvLwlSVF9ERUJVR19EQVRBKENPTVBfU0VORCwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwkvKiByZXNlcnZlIGluZm8gZm9yIGZpcnN0IHN1YmZyYW1lIFR4IGRlc2NyaXB0b3IgdG8gYmUgc2V0IGluIHRoZSB0eCBmdW5jdGlvbiAqLworCXNrYiA9IHBTZW5kTGlzdC0+dHhfYWdnX2ZyYW1lc1swXTsKKwl0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdGNiX2Rlc2MtPmRydl9hZ2dfZW5hYmxlID0gMTsKKwl0Y2JfZGVzYy0+cGt0X3NpemUgPSBza2ItPmxlbjsKKwl0Y2JfZGVzYy0+RHJ2QWdnck51bSA9IHBTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXM7CisJcHJpbnRrKCJEcnZBZ2dOdW0gPSAlZFxuIiwgdGNiX2Rlc2MtPkRydkFnZ3JOdW0pOworLy8JUlRfREVCVUdfREFUQShDT01QX1NFTkQsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisvLwlwcmludGsoIj09PT09PT09PnNrYi0+ZGF0YSA9PT09PT0+IFxuIik7CisvLwlSVF9ERUJVR19EQVRBKENPTVBfU0VORCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJbWVtY3B5KGFnZ19za2ItPmNiLCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOworCW1lbWNweShza2JfcHV0KGFnZ19za2Isc2tiLT5sZW4pLHNrYi0+ZGF0YSxza2ItPmxlbik7CisKKwlmb3IoaSA9IDE7IGkgPCBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzOyBpKyspIHsKKwkJLyogcHVzaCB0aGUgbmV4dCBzdWIgZnJhbWUgdG8gYmUgMjU2IGJ5dGUgYWxpbmUgKi8KKwkJc2tiX3B1dChhZ2dfc2tiLERydkFnZ3JfUGFkZGluZ0FkZChkZXYsc2tiKSk7CisKKwkJLyogU3ViZnJhbWUgZHJ2IFR4IGRlc2NyaXB0b3IgYW5kIGZpcm13YXJlIGluZm8gc2V0dGluZyAqLworCQlza2IgPSBwU2VuZExpc3QtPnR4X2FnZ19mcmFtZXNbaV07CisJCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdHhfYWdnX2Rlc2MgPSAodHhfZGVzY184MTl4X3VzYl9hZ2dyX3N1YmZyYW1lICopYWdnX3NrYi0+dGFpbDsKKwkJdHhfZndpbmZvID0gKHR4X2Z3aW5mb184MTl4X3VzYiAqKShhZ2dfc2tiLT50YWlsICsgc2l6ZW9mKHR4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSkpOworCisJCW1lbXNldCh0eF9md2luZm8sMCxzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSk7CisJCS8qIERXT1JEIDAgKi8KKwkJdHhfZndpbmZvLT5UeEhUID0gKHRjYl9kZXNjLT5kYXRhX3JhdGUmMHg4MCk/MTowOworCQl0eF9md2luZm8tPlR4UmF0ZSA9IE1SYXRlVG9Id1JhdGU4MTkwUGNpKHRjYl9kZXNjLT5kYXRhX3JhdGUpOworCQl0eF9md2luZm8tPkVuYWJsZUNQVUR1ciA9IHRjYl9kZXNjLT5iVHhFbmFibGVGd0NhbGNEdXI7CisJCXR4X2Z3aW5mby0+U2hvcnQgPSBRdWVyeUlzU2hvcnQodHhfZndpbmZvLT5UeEhULCB0eF9md2luZm8tPlR4UmF0ZSwgdGNiX2Rlc2MpOworCQlpZih0Y2JfZGVzYy0+YkFNUERVRW5hYmxlKSB7Ly9BTVBEVSBlbmFibGVkCisJCQl0eF9md2luZm8tPkFsbG93QWdncmVnYXRpb24gPSAxOworCQkJLyogRFdPUkQgMSAqLworCQkJdHhfZndpbmZvLT5SeE1GID0gdGNiX2Rlc2MtPmFtcGR1X2ZhY3RvcjsKKwkJCXR4X2Z3aW5mby0+UnhBTUQgPSB0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSYweDA3Oy8vYW1wZHVkZW5zaXR5CisJCX0gZWxzZSB7CisJCQl0eF9md2luZm8tPkFsbG93QWdncmVnYXRpb24gPSAwOworCQkJLyogRFdPUkQgMSAqLworCQkJdHhfZndpbmZvLT5SeE1GID0gMDsKKwkJCXR4X2Z3aW5mby0+UnhBTUQgPSAwOworCQl9CisKKwkJLyogUHJvdGVjdGlvbiBtb2RlIHJlbGF0ZWQgKi8KKwkJdHhfZndpbmZvLT5SdHNFbmFibGUgPSAodGNiX2Rlc2MtPmJSVFNFbmFibGUpPzE6MDsKKwkJdHhfZndpbmZvLT5DdHNFbmFibGUgPSAodGNiX2Rlc2MtPmJDVFNFbmFibGUpPzE6MDsKKwkJdHhfZndpbmZvLT5SdHNTVEJDID0gKHRjYl9kZXNjLT5iUlRTU1RCQyk/MTowOworCQl0eF9md2luZm8tPlJ0c0hUID0gKHRjYl9kZXNjLT5ydHNfcmF0ZSYweDgwKT8xOjA7CisJCXR4X2Z3aW5mby0+UnRzUmF0ZSA9ICBNUmF0ZVRvSHdSYXRlODE5MFBjaSgodTgpdGNiX2Rlc2MtPnJ0c19yYXRlKTsKKwkJdHhfZndpbmZvLT5SdHNTdWJjYXJyaWVyID0gKHR4X2Z3aW5mby0+UnRzSFQ9PTApPyh0Y2JfZGVzYy0+UlRTU0MpOjA7CisJCXR4X2Z3aW5mby0+UnRzQmFuZHdpZHRoID0gKHR4X2Z3aW5mby0+UnRzSFQ9PTEpPygodGNiX2Rlc2MtPmJSVFNCVyk/MTowKTowOworCQl0eF9md2luZm8tPlJ0c1Nob3J0ID0gKHR4X2Z3aW5mby0+UnRzSFQ9PTApPyh0Y2JfZGVzYy0+YlJUU1VzZVNob3J0UHJlYW1ibGU/MTowKTpcCisJCQkJICAgICAgKHRjYl9kZXNjLT5iUlRTVXNlU2hvcnRHST8xOjApOworCisJCS8qIFNldCBCYW5kd2lkdGggYW5kIHN1Yi1jaGFubmVsIHNldHRpbmdzLiAqLworCQlpZihwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApCisJCXsKKwkJCWlmKHRjYl9kZXNjLT5iUGFja2V0QlcpIHsKKwkJCQl0eF9md2luZm8tPlR4QmFuZHdpZHRoID0gMTsKKwkJCQl0eF9md2luZm8tPlR4U3ViQ2FycmllciA9IDA7ICAgIC8vQnkgU0QzJ3MgSmVycnkgc3VnZ2VzdGlvbiwgdXNlIGR1cGxpY2F0ZWQgbW9kZQorCQkJfSBlbHNlIHsKKwkJCQl0eF9md2luZm8tPlR4QmFuZHdpZHRoID0gMDsKKwkJCQl0eF9md2luZm8tPlR4U3ViQ2FycmllciA9IHByaXYtPm5DdXI0ME1oelByaW1lU0M7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0eF9md2luZm8tPlR4QmFuZHdpZHRoID0gMDsKKwkJCXR4X2Z3aW5mby0+VHhTdWJDYXJyaWVyID0gMDsKKwkJfQorCisJCS8qIEZpbGwgVHggZGVzY3JpcHRvciAqLworCQltZW1zZXQodHhfYWdnX2Rlc2MsIDAsIHNpemVvZih0eF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUpKTsKKwkJLyogRFdPUkQgMCAqLworCQkvL3R4X2FnZ19kZXNjLT5MSU5JUCA9IDA7CisJCS8vdHhfYWdnX2Rlc2MtPkNtZEluaXQgPSAxOworCQl0eF9hZ2dfZGVzYy0+T2Zmc2V0ID0gIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpICsgODsKKwkJLyogYWxyZWFkeSByYXcgZGF0YSwgbmVlZCBub3QgdG8gc3Vic3RyYWN0IGhlYWRlciBsZW5ndGggKi8KKwkJdHhfYWdnX2Rlc2MtPlBrdFNpemUgPSBza2ItPmxlbiAmIDB4ZmZmZjsKKworCQkvKkRXT1JEIDEqLworCQl0eF9hZ2dfZGVzYy0+U2VjQ0FNSUQ9IDA7CisJCXR4X2FnZ19kZXNjLT5SQVRpZCA9IHRjYl9kZXNjLT5SQVRSSW5kZXg7CisJCXsKKwkJCS8vTVBEVU92ZXJoZWFkID0gMDsKKwkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDE7CisJCX0KKwkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDA7CisKKwkJaWYgKHRjYl9kZXNjLT5iSHdTZWMpIHsKKwkJCXN3aXRjaCAocHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSkKKwkJCXsKKwkJCQljYXNlIEtFWV9UWVBFX1dFUDQwOgorCQkJCWNhc2UgS0VZX1RZUEVfV0VQMTA0OgorCQkJCQl0eF9hZ2dfZGVzYy0+U2VjVHlwZSA9IDB4MTsKKwkJCQkJdHhfYWdnX2Rlc2MtPk5vRW5jID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBLRVlfVFlQRV9US0lQOgorCQkJCQl0eF9hZ2dfZGVzYy0+U2VjVHlwZSA9IDB4MjsKKwkJCQkJdHhfYWdnX2Rlc2MtPk5vRW5jID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBLRVlfVFlQRV9DQ01QOgorCQkJCQl0eF9hZ2dfZGVzYy0+U2VjVHlwZSA9IDB4MzsKKwkJCQkJdHhfYWdnX2Rlc2MtPk5vRW5jID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBLRVlfVFlQRV9OQToKKwkJCQkJdHhfYWdnX2Rlc2MtPlNlY1R5cGUgPSAweDA7CisJCQkJCXR4X2FnZ19kZXNjLT5Ob0VuYyA9IDE7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJdHhfYWdnX2Rlc2MtPlF1ZXVlU2VsZWN0ID0gTWFwSHdRdWV1ZVRvRmlybXdhcmVRdWV1ZSh0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOworCQl0eF9hZ2dfZGVzYy0+VHhGV0luZm9TaXplID0gIHNpemVvZih0eF9md2luZm9fODE5eF91c2IpOworCisJCXR4X2FnZ19kZXNjLT5ESVNGQiA9IHRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOworCQl0eF9hZ2dfZGVzYy0+VVNFUkFURSA9IHRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU7CisKKwkJdHhfYWdnX2Rlc2MtPk9XTiA9IDE7CisKKwkJLy9EV09SRCAyCisJCS8qIEFjY29yZGluZyB3aW5kb3dzIGRyaXZlciwgaXQgc2VlbXMgdGhhdCB0aGVyZSBubyBuZWVkIHRvIGZpbGwgdGhpcyBmaWVsZCAqLworCQkvL3R4X2FnZ19kZXNjLT5UeEJ1ZmZlclNpemU9ICh1MzIpKHNrYi0+bGVuIC0gVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKworCQkvKiB0byBmaWxsIG5leHQgcGFja2V0ICovCisJCXNrYl9wdXQoYWdnX3NrYixUWF9QQUNLRVRfRFJWQUdHUl9TVUJGUkFNRV9TSElGVF9CWVRFUyk7CisJCW1lbWNweShza2JfcHV0KGFnZ19za2Isc2tiLT5sZW4pLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgcFNlbmRMaXN0LT5ucl9kcnZfYWdnX2ZyYW1lczsgaSsrKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHBTZW5kTGlzdC0+dHhfYWdnX2ZyYW1lc1tpXSk7CisJfQorCisJcmV0dXJuIGFnZ19za2I7Cit9CisKKy8qIE5PVEU6CisJVGhpcyBmdW5jdGlvbiByZXR1cm4gYSBsaXN0IG9mIFBUQ0Igd2hpY2ggaXMgcHJvcGVyIHRvIGJlIGFnZ3JlZ2F0ZSB3aXRoIHRoZSBpbnB1dCBUQ0IuCisJSWYgbm8gcHJvcGVyIFRDQiBpcyBmb3VuZCB0byBkbyBhZ2dyZWdhdGlvbiwgU2VuZExpc3Qgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIGlucHV0IFRDQi4KKyovCit1OCBEcnZBZ2dyX0dldEFnZ3JlZ2F0aWJsZUxpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiAqcFNlbmRMaXN0KQoreworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXUxNgkJbk1heEFnZ3JOdW0gPSBwSFRJbmZvLT5Vc2JUeEFnZ3JOdW07CisJY2JfZGVzYyAJKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwl1OAkJUXVldWVJRCA9IHRjYl9kZXNjLT5xdWV1ZV9pbmRleDsKKworCWRvIHsKKwkJcFNlbmRMaXN0LT50eF9hZ2dfZnJhbWVzW3BTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXMrK10gPSBza2I7CisJCWlmKHBTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXMgPj0gbk1heEFnZ3JOdW0pIHsKKwkJCWJyZWFrOworCQl9CisKKwl9IHdoaWxlKChza2IgPSBza2JfZGVxdWV1ZSgmaWVlZS0+c2tiX2Rydl9hZ2dRW1F1ZXVlSURdKSkpOworCisJUlRfVFJBQ0UoQ09NUF9BTVNEVSwgIkRydkFnZ3JfR2V0QWdncmVnYXRpYmxlTGlzdCwgbkFnZ3JUY2JOdW0gPSAlZCBcbiIsIHBTZW5kTGlzdC0+bnJfZHJ2X2FnZ19mcmFtZXMpOworCXJldHVybiBwU2VuZExpc3QtPm5yX2Rydl9hZ2dfZnJhbWVzOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfdHhfaXNyKHN0cnVjdCB1cmIgKnR4X3VyYikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmKil0eF91cmItPmNvbnRleHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBOVUxMOworCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwl1OCAgcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisvLwlib29sIGJUb1NlbmQwQnl0ZTsKKy8vCXUxNiBCdWZMZW4gPSBza2ItPmxlbjsKKworCW1lbWNweSgmZGV2LChzdHJ1Y3QgbmV0X2RldmljZSopKHNrYi0+Y2IpLHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSopKTsKKwlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHRjYl9kZXNjLT5xdWV1ZV9pbmRleCAhPSBUWENNRF9RVUVVRSkgeworCQlpZih0eF91cmItPnN0YXR1cyA9PSAwKSB7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCS8vIEFzIGFjdCBhcyBzdGF0aW9uIG1vZGUsIGRlc3Rpb24gc2hhbGwgYmUgIHVuaWNhc3QgYWRkcmVzcy4KKwkJCS8vcHJpdi0+aWVlZTgwMjExLT5zdGF0cy50eF9ieXRlcys9KHNrYi0+bGVuIC0gcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7CisJCQkvL3ByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfcGFja2V0cysrOworCQkJcHJpdi0+c3RhdHMudHhva3RvdGFsKys7CisJCQlwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOworCQkJcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgKz0gKHNrYi0+bGVuIC0gcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJLy9wcml2LT5zdGF0cy50eG1hbmFnZWVycisrOworCQkJLyogVE9ETyAqLworCQl9CisJfQorCisJLyogZnJlZSBza2IgYW5kIHR4X3VyYiAqLworCWlmKHNrYiAhPSBOVUxMKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXVzYl9mcmVlX3VyYih0eF91cmIpOworCQlhdG9taWNfZGVjKCZwcml2LT50eF9wZW5kaW5nW3F1ZXVlX2luZGV4XSk7CisJfQorCisJeworCQkvLworCQkvLyBIYW5kbGUgSFcgQmVhY29uOgorCQkvLyBXZSBoYWQgdHJhbnNmZXIgb3VyIGJlYWNvbiBmcmFtZSB0byBob3N0IGNvbnRyb2xlciBhdCB0aGlzIG1vbWVudC4KKwkJLy8KKwkJLy8KKwkJLy8gQ2F1dGlvbjoKKwkJLy8gSGFuZGxpbmcgdGhlIHdhaXQgcXVldWUgb2YgY29tbWFuZCBwYWNrZXRzLgorCQkvLyBGb3IgVHggY29tbWFuZCBwYWNrZXRzLCB3ZSBtdXN0IG5vdCBkbyBUQ0IgZnJhZ21lbnQgYmVjYXVzZSBpdCBpcyBub3QgaGFuZGxlZCByaWdodCBub3cuCisJCS8vIFdlIG11c3QgY3V0IHRoZSBwYWNrZXRzIHRvIG1hdGNoIHRoZSBzaXplIG9mIFRYX0NNRF9QS1QgYmVmb3JlIHdlIHNlbmQgaXQuCisJCS8vCisKKwkJLyogSGFuZGxlIE1QRFUgaW4gd2FpdCBxdWV1ZS4gKi8KKwkJaWYocXVldWVfaW5kZXggIT0gQkVBQ09OX1FVRVVFKSB7CisJCQkvKiBEb24ndCBzZW5kIGRhdGEgZnJhbWUgZHVyaW5nIHNjYW5uaW5nLiovCisJCQlpZigoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSAhPSAwKSYmXAorCQkJCQkoIShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApKSkgeworCQkJCWlmKE5VTEwgIT0gKHNrYiA9IHNrYl9kZXF1ZXVlKCYocHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdKSkpKQorCQkJCQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KTsKKworCQkJCXJldHVybjsgLy9tb2RpZmllZCBieSBkYXZpZCB0byBhdm9pZCBmdXJ0aGVyIHByb2Nlc3NpbmcgQU1TRFUKKwkJCX0KKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCQkJZWxzZSBpZiAoKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSkhPSAwKSYmXAorCQkJCSghKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkpKSB7CisJCQkJLy8gVHggRHJpdmVyIEFnZ3JlZ2F0aW9uIHByb2Nlc3MKKwkJCQkvKiBUaGUgZHJpdmVyIHdpbGwgYWdncmVnYXRpb24gdGhlIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgc3RldHMKKwkJCQkgKiAxLiBjaGVjayB3aGV0aGVyIHRoZXJlJ3MgdHggaXJxIGF2YWlsYWJsZSwgZm9yIGl0J3MgYSBjb21wbGV0aW9uIHJldHVybgorCQkJCSAqICAgIGZ1bmN0aW9uLCBpdCBzaG91bGQgY29udGFpbiBlbm91Z2ggdHggaXJxOworCQkJCSAqIDIuIGNoZWNrIHBha2NldCB0eXBlOworCQkJCSAqIDMuIGludGlhbGl6ZSBzZW5kbGlzdCwgY2hlY2sgd2hldGhlciB0aGUgdG8tYmUgc2VuZCBwYWNrZXQgbm8gZ3JlYXRlciB0aGFuIDEKKwkJCQkgKiA0LiBhZ2dyZWdhdGlvbiB0aGUgcGFja2V0cywgYW5kIGZpbGwgZmlybXdhcmUgaW5mbyBhbmQgdHggZGVzYyB0byBpdCwgZXRjLgorCQkJCSAqIDUuIGNoZWNrIHdoZWh0ZXIgdGhlIHBhY2tldCBjb3VsZCBiZSBzZW50LCBvdGhlcndpc2UganVzdCBpbnNlcnQgdG8gd2FpdCBoZWFkCisJCQkJICogKi8KKwkJCQlza2IgPSBza2JfZGVxdWV1ZSgmcHJpdi0+aWVlZTgwMjExLT5za2JfZHJ2X2FnZ1FbcXVldWVfaW5kZXhdKTsKKwkJCQlpZighY2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldiwgcXVldWVfaW5kZXgpKSB7CisJCQkJCXNrYl9xdWV1ZV9oZWFkKCYocHJpdi0+aWVlZTgwMjExLT5za2JfZHJ2X2FnZ1FbcXVldWVfaW5kZXhdKSwgc2tiKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCXsKKwkJCQkJLypUT0RPKi8KKwkJCQkJLyoKKwkJCQkJdTgqIHBIZWFkZXIgPSBza2ItPmRhdGE7CisKKwkJCQkJaWYoSXNNZ250UW9zRGF0YShwSGVhZGVyKSB8fAorCQkJCQkgICAgSXNNZ250UURhdGFfQWNrKHBIZWFkZXIpIHx8CisJCQkJCSAgICBJc01nbnRRRGF0YV9Qb2xsKHBIZWFkZXIpIHx8CisJCQkJCSAgICBJc01nbnRRRGF0YV9Qb2xsX0FjayhwSGVhZGVyKQorCQkJCQkgICkKKwkJCQkJKi8KKwkJCQkJeworCQkJCQkJc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiBTZW5kTGlzdDsKKworCQkJCQkJbWVtc2V0KCZTZW5kTGlzdCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZHJ2X2FnZ190eGIpKTsKKwkJCQkJCWlmKERydkFnZ3JfR2V0QWdncmVnYXRpYmxlTGlzdChkZXYsIHNrYiwgJlNlbmRMaXN0KSA+IDEpIHsKKwkJCQkJCQlza2IgPSBEcnZBZ2dyX0FnZ3JlZ2F0aW9uKGRldiwgJlNlbmRMaXN0KTsKKworCQkJCQkJfQorCQkJCQl9CisJCQkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYpOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCit9CisKK3ZvaWQgcnRsODE5Ml9iZWFjb25fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IG1zciwgbXNybSwgbXNyMjsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwltc3IgID0gcmVhZF9uaWNfYnl0ZShkZXYsIE1TUik7CisJbXNybSA9IG1zciAmIE1TUl9MSU5LX01BU0s7CisJbXNyMiA9IG1zciAmIH5NU1JfTElOS19NQVNLOworCisJaWYoTklDXzgxOTJVID09IHByaXYtPmNhcmRfODE5MikgeworCQl1c2Jfa2lsbF91cmIocHJpdi0+cnhfdXJiW01BWF9SWF9VUkJdKTsKKwl9CisJaWYgKChtc3JtID09IChNU1JfTElOS19BREhPQzw8TVNSX0xJTktfU0hJRlQpIHx8CisJCShtc3JtID09IChNU1JfTElOS19NQVNURVI8PE1TUl9MSU5LX1NISUZUKSkpKXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIG1zcjIgfCBNU1JfTElOS19OT05FKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBNU1IsIG1zcik7CisJfQorfQorCit2b2lkIHJ0bDgxOTJfY29uZmlnX3JhdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTE2KiByYXRlX2NvbmZpZykKK3sKKwkgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCSBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldDsKKwkgdTggaT0wLCBiYXNpY19yYXRlID0gMDsKKwkgbmV0ID0gJiBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKKworCSBmb3IgKGk9MDsgaTxuZXQtPnJhdGVzX2xlbjsgaSsrKQorCSB7CisJCSBiYXNpY19yYXRlID0gbmV0LT5yYXRlc1tpXSYweDdmOworCQkgc3dpdGNoKGJhc2ljX3JhdGUpCisJCSB7CisJCQkgY2FzZSBNR05fMU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzFNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8yTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMk07CWJyZWFrOworCQkJIGNhc2UgTUdOXzVfNU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzVfNU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzExTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTFNOwlicmVhazsKKwkJCSBjYXNlIE1HTl82TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNk07CWJyZWFrOworCQkJIGNhc2UgTUdOXzlNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl85TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMTJNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xMk07CWJyZWFrOworCQkJIGNhc2UgTUdOXzE4TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMThNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8yNE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzI0TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMzZNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8zNk07CWJyZWFrOworCQkJIGNhc2UgTUdOXzQ4TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNDhNOwlicmVhazsKKwkJCSBjYXNlIE1HTl81NE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzU0TTsJYnJlYWs7CisJCSB9CisJIH0KKwkgZm9yIChpPTA7IGk8bmV0LT5yYXRlc19leF9sZW47IGkrKykKKwkgeworCQkgYmFzaWNfcmF0ZSA9IG5ldC0+cmF0ZXNfZXhbaV0mMHg3ZjsKKwkJIHN3aXRjaChiYXNpY19yYXRlKQorCQkgeworCQkJIGNhc2UgTUdOXzFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzJNOwlicmVhazsKKwkJCSBjYXNlIE1HTl81XzVNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81XzVNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xMU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzExTTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzZNOwlicmVhazsKKwkJCSBjYXNlIE1HTl85TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfOU07CWJyZWFrOworCQkJIGNhc2UgTUdOXzEyTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTJNOwlicmVhazsKKwkJCSBjYXNlIE1HTl8xOE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzE4TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fMjRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yNE07CWJyZWFrOworCQkJIGNhc2UgTUdOXzM2TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMzZNOwlicmVhazsKKwkJCSBjYXNlIE1HTl80OE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzQ4TTsJYnJlYWs7CisJCQkgY2FzZSBNR05fNTRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81NE07CWJyZWFrOworCQkgfQorCSB9Cit9CisKKworI2RlZmluZSBTSE9SVF9TTE9UX1RJTUUgOQorI2RlZmluZSBOT05fU0hPUlRfU0xPVF9USU1FIDIwCisKK3ZvaWQgcnRsODE5Ml91cGRhdGVfY2FwKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUxNiBjYXApCit7CisJdTMyIHRtcCA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0ID0gJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrOworCXByaXYtPnNob3J0X3ByZWFtYmxlID0gY2FwICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFOworCXRtcCA9IHByaXYtPmJhc2ljX3JhdGU7CisJaWYgKHByaXYtPnNob3J0X3ByZWFtYmxlKQorCQl0bXAgfD0gQlJTUl9BY2tTaG9ydFBtYjsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUlNSLCB0bXApOworCisJaWYgKG5ldC0+bW9kZSAmIChJRUVFX0d8SUVFRV9OXzI0RykpCisJeworCQl1OCBzbG90X3RpbWUgPSAwOworCQlpZiAoKGNhcCAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKSYmKCFwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUpKQorCQl7Ly9zaG9ydCBzbG90IHRpbWUKKwkJCXNsb3RfdGltZSA9IFNIT1JUX1NMT1RfVElNRTsKKwkJfQorCQllbHNlIC8vbG9uZyBzbG90IHRpbWUKKwkJCXNsb3RfdGltZSA9IE5PTl9TSE9SVF9TTE9UX1RJTUU7CisJCXByaXYtPnNsb3RfdGltZSA9IHNsb3RfdGltZTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTTE9UX1RJTUUsIHNsb3RfdGltZSk7CisJfQorCit9Cit2b2lkIHJ0bDgxOTJfbmV0X3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0OworCXUxNiBCY25UaW1lQ2ZnID0gMCwgQmNuQ1cgPSA2LCBCY25JRlMgPSAweGY7CisJdTE2IHJhdGVfY29uZmlnID0gMDsKKwluZXQgPSAmIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrOworCisJcnRsODE5Ml9jb25maWdfcmF0ZShkZXYsICZyYXRlX2NvbmZpZyk7CisJcHJpdi0+YmFzaWNfcmF0ZSA9IHJhdGVfY29uZmlnICY9IDB4MTVmOworCisJd3JpdGVfbmljX2R3b3JkKGRldixCU1NJRFIsKCh1MzIqKW5ldC0+YnNzaWQpWzBdKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsQlNTSURSKzQsKCh1MTYqKW5ldC0+YnNzaWQpWzJdKTsKKwkvL2ZvcihpPTA7aTxFVEhfQUxFTjtpKyspCisJLy8Jd3JpdGVfbmljX2J5dGUoZGV2LEJTU0lEK2ksbmV0LT5ic3NpZFtpXSk7CisKKwlydGw4MTkyX3VwZGF0ZV9tc3IoZGV2KTsKKy8vCXJ0bDgxOTJfdXBkYXRlX2NhcChkZXYsIG5ldC0+Y2FwYWJpbGl0eSk7CisJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCXsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEFUSU1XTkQsIDIpOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0RNQVRJTUUsIDEwMjMpOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0lOVEVSVkFMLCBuZXQtPmJlYWNvbl9pbnRlcnZhbCk7CisvLwl3cml0ZV9uaWNfd29yZChkZXYsIEJjbkludFRpbWUsIDEwMCk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fRFJWX0VBUkxZX0lOVCwgMSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBCQ05fRVJSX1RIUkVTSCwgMTAwKTsKKwkJQmNuVGltZUNmZyB8PSAoQmNuQ1c8PEJDTl9UQ0ZHX0NXX1NISUZUKTsKKwkvLyBUT0RPOiBCY25JRlMgbWF5IHJlcXVpcmVkIHRvIGJlIGNoYW5nZWQgb24gQVNJQworCQlCY25UaW1lQ2ZnIHw9IEJjbklGUzw8QkNOX1RDRkdfSUZTOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fVENGRywgQmNuVGltZUNmZyk7CisJfQorCisKKworfQorCisvL3RlbXBvcmFyeSBodyBiZWFjb24gaXMgbm90IHVzZWQgYW55IG1vcmUuCisvL29wZW4gaXQgd2hlbiBuZWNlc3NhcnkKK3ZvaWQgcnRsODE5eHVzYl9iZWFjb25fdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MTYgIHR4X3JhdGUpCit7CisKK30KK2lubGluZSB1OCBydGw4MTkyX0lzV2lyZWxlc3NCTW9kZSh1MTYgcmF0ZSkKK3sKKwlpZiggKChyYXRlIDw9IDExMCkgJiYgKHJhdGUgIT0gNjApICYmIChyYXRlICE9IDkwKSkgfHwgKHJhdGUgPT0gMjIwKSApCisJCXJldHVybiAxOworCWVsc2UgcmV0dXJuIDA7Cit9CisKK3UxNiBOX0RCUFNPZlJhdGUodTE2IERhdGFSYXRlKTsKKwordTE2IENvbXB1dGVUeFRpbWUoCisJdTE2CQlGcmFtZUxlbmd0aCwKKwl1MTYJCURhdGFSYXRlLAorCXU4CQliTWFuYWdlbWVudEZyYW1lLAorCXU4CQliU2hvcnRQcmVhbWJsZQorKQoreworCXUxNglGcmFtZVRpbWU7CisJdTE2CU5fREJQUzsKKwl1MTYJQ2VpbGluZzsKKworCWlmKCBydGw4MTkyX0lzV2lyZWxlc3NCTW9kZShEYXRhUmF0ZSkgKQorCXsKKwkJaWYoIGJNYW5hZ2VtZW50RnJhbWUgfHwgIWJTaG9ydFByZWFtYmxlIHx8IERhdGFSYXRlID09IDEwICkKKwkJewkvLyBsb25nIHByZWFtYmxlCisJCQlGcmFtZVRpbWUgPSAodTE2KSgxNDQrNDgrKEZyYW1lTGVuZ3RoKjgvKERhdGFSYXRlLzEwKSkpOworCQl9CisJCWVsc2UKKwkJewkvLyBTaG9ydCBwcmVhbWJsZQorCQkJRnJhbWVUaW1lID0gKHUxNikoNzIrMjQrKEZyYW1lTGVuZ3RoKjgvKERhdGFSYXRlLzEwKSkpOworCQl9CisJCWlmKCAoIEZyYW1lTGVuZ3RoKjggJSAoRGF0YVJhdGUvMTApICkgIT0gMCApIC8vR2V0IHRoZSBDZWlsbGluZworCQkJCUZyYW1lVGltZSArKzsKKwl9IGVsc2UgewkvLzgwMi4xMWcgRFNTUy1PRkRNIFBMQ1AgbGVuZ3RoIGZpZWxkIGNhbGN1bGF0aW9uLgorCQlOX0RCUFMgPSBOX0RCUFNPZlJhdGUoRGF0YVJhdGUpOworCQlDZWlsaW5nID0gKDE2ICsgOCpGcmFtZUxlbmd0aCArIDYpIC8gTl9EQlBTCisJCQkJKyAoKCgxNiArIDgqRnJhbWVMZW5ndGggKyA2KSAlIE5fREJQUykgPyAxIDogMCk7CisJCUZyYW1lVGltZSA9ICh1MTYpKDE2ICsgNCArIDQqQ2VpbGluZyArIDYpOworCX0KKwlyZXR1cm4gRnJhbWVUaW1lOworfQorCit1MTYgTl9EQlBTT2ZSYXRlKHUxNiBEYXRhUmF0ZSkKK3sKKwkgdTE2IE5fREJQUyA9IDI0OworCisJIHN3aXRjaChEYXRhUmF0ZSkKKwkgeworCSBjYXNlIDYwOgorCSAgTl9EQlBTID0gMjQ7CisJICBicmVhazsKKworCSBjYXNlIDkwOgorCSAgTl9EQlBTID0gMzY7CisJICBicmVhazsKKworCSBjYXNlIDEyMDoKKwkgIE5fREJQUyA9IDQ4OworCSAgYnJlYWs7CisKKwkgY2FzZSAxODA6CisJICBOX0RCUFMgPSA3MjsKKwkgIGJyZWFrOworCisJIGNhc2UgMjQwOgorCSAgTl9EQlBTID0gOTY7CisJICBicmVhazsKKworCSBjYXNlIDM2MDoKKwkgIE5fREJQUyA9IDE0NDsKKwkgIGJyZWFrOworCisJIGNhc2UgNDgwOgorCSAgTl9EQlBTID0gMTkyOworCSAgYnJlYWs7CisKKwkgY2FzZSA1NDA6CisJICBOX0RCUFMgPSAyMTY7CisJICBicmVhazsKKworCSBkZWZhdWx0OgorCSAgYnJlYWs7CisJIH0KKworCSByZXR1cm4gTl9EQlBTOworfQorCit2b2lkIHJ0bDgxOXhVX2NtZF9pc3Ioc3RydWN0IHVyYiAqdHhfY21kX3VyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdXNiX2ZyZWVfdXJiKHR4X2NtZF91cmIpOworfQorCit1bnNpZ25lZCBpbnQgdHhxdWV1ZTJvdXRwaXBlKHN0cnVjdCByODE5Ml9wcml2KiBwcml2LHVuc2lnbmVkIGludCB0eF9xdWV1ZSkgeworCisJaWYodHhfcXVldWUgPj0gOSkKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCIlcygpOlVua25vd24gcXVldWUgSUQhISFcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDB4MDQ7CisJfQorCXJldHVybiBwcml2LT50eHF1ZXVlX3RvX291dHBpcGVtYXBbdHhfcXVldWVdOworfQorCitzaG9ydCBydGw4MTl4VV90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy91OAkJCSp0eDsKKwlpbnQJCQlzdGF0dXM7CisJc3RydWN0IHVyYgkJKnR4X3VyYjsKKwkvL2ludAkJCXVyYl9idWZfbGVuOworCXVuc2lnbmVkIGludCAJCWlkeF9waXBlOworCXR4X2Rlc2NfY21kXzgxOXhfdXNiICpwZGVzYyA9ICh0eF9kZXNjX2NtZF84MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdTggcXVldWVfaW5kZXggPSB0Y2JfZGVzYy0+cXVldWVfaW5kZXg7CisKKwkvL3ByaW50aygiXG4gJXM6OnF1ZXVlX2luZGV4ID0gJWRcbiIsX19GVU5DVElPTl9fLCBxdWV1ZV9pbmRleCk7CisJYXRvbWljX2luYygmcHJpdi0+dHhfcGVuZGluZ1txdWV1ZV9pbmRleF0pOworCXR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKTsKKwlpZighdHhfdXJiKXsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQocGRlc2MsIDAsIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJLyogVHggZGVzY3JpcHRvciBvdWdodCB0byBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBza2ItPmNiICovCisJcGRlc2MtPkZpcnN0U2VnID0gMTsvL2JGaXJzdFNlZzsKKwlwZGVzYy0+TGFzdFNlZyA9IDE7Ly9iTGFzdFNlZzsKKwlwZGVzYy0+Q21kSW5pdCA9IHRjYl9kZXNjLT5iQ21kT3JJbml0OworCXBkZXNjLT5UeEJ1ZmZlclNpemUgPSB0Y2JfZGVzYy0+dHhidWZfc2l6ZTsKKwlwZGVzYy0+T1dOID0gMTsKKwlwZGVzYy0+TElOSVAgPSB0Y2JfZGVzYy0+Ykxhc3RJbmlQa3Q7CisKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBGaWxsIHVwIFVTQl9PVVRfQ09OVEVYVC4KKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkvLyBHZXQgaW5kZXggdG8gb3V0IHBpcGUgZnJvbSBzcGVjaWZpZWQgUXVldWVJRC4KKyNpZm5kZWYgVVNFX09ORV9QSVBFCisJaWR4X3BpcGUgPSB0eHF1ZXVlMm91dHBpcGUocHJpdixxdWV1ZV9pbmRleCk7CisjZWxzZQorCWlkeF9waXBlID0gMHgwNDsKKyNlbmRpZgorI2lmZGVmIEpPSE5fRFVNUF9UWERFU0MKKwlpbnQgaTsKKwlwcmludGsoIjxUeCBkZXNjcmlwdG9yPi0tcmF0ZSAleC0tLSIscmF0ZSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJcHJpbnRrKCIlOHggIiwgdHhbaV0pOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXVzYl9maWxsX2J1bGtfdXJiKHR4X3VyYixwcml2LT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUocHJpdi0+dWRldixpZHhfcGlwZSksIFwKKwkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4sIHJ0bDgxOTJfdHhfaXNyLCBza2IpOworCisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodHhfdXJiLCBHRlBfQVRPTUlDKTsKKworCWlmICghc3RhdHVzKXsKKwkJcmV0dXJuIDA7CisJfWVsc2V7CisJCURNRVNHRSgiRXJyb3IgVFggQ01EIFVSQiwgZXJyb3IgJWQiLAorCQkJCXN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKiBNYXBwaW5nIFNvZnR3YXJlL0hhcmR3YXJlIGRlc2NyaXB0b3IgcXVldWUgaWQgdG8gIlF1ZXVlIFNlbGVjdCBGaWVsZCIKKyAqIGluIFR4RndJbmZvIGRhdGEgc3RydWN0dXJlCisgKiAyMDA2LjEwLjMwIGJ5IEVtaWx5CisgKgorICogXHBhcmFtIFFVRVVFSUQgICAgICAgU29mdHdhcmUgUXVldWUKKyovCit1OCBNYXBId1F1ZXVlVG9GaXJtd2FyZVF1ZXVlKHU4IFF1ZXVlSUQpCit7CisJdTggUXVldWVTZWxlY3QgPSAweDA7ICAgICAgIC8vZGVmdWFsdCBzZXQgdG8KKworCXN3aXRjaChRdWV1ZUlEKSB7CisJCWNhc2UgQkVfUVVFVUU6CisJCQlRdWV1ZVNlbGVjdCA9IFFTTFRfQkU7ICAvL29yIFFTZWxlY3QgPSBwVGNiLT5wcmlvcml0eTsKKwkJCWJyZWFrOworCisJCWNhc2UgQktfUVVFVUU6CisJCQlRdWV1ZVNlbGVjdCA9IFFTTFRfQks7ICAvL29yIFFTZWxlY3QgPSBwVGNiLT5wcmlvcml0eTsKKwkJCWJyZWFrOworCisJCWNhc2UgVk9fUVVFVUU6CisJCQlRdWV1ZVNlbGVjdCA9IFFTTFRfVk87ICAvL29yIFFTZWxlY3QgPSBwVGNiLT5wcmlvcml0eTsKKwkJCWJyZWFrOworCisJCWNhc2UgVklfUVVFVUU6CisJCQlRdWV1ZVNlbGVjdCA9IFFTTFRfVkk7ICAvL29yIFFTZWxlY3QgPSBwVGNiLT5wcmlvcml0eTsKKwkJCWJyZWFrOworCQljYXNlIE1HTlRfUVVFVUU6CisJCQlRdWV1ZVNlbGVjdCA9IFFTTFRfTUdOVDsKKwkJCWJyZWFrOworCisJCWNhc2UgQkVBQ09OX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0JFQUNPTjsKKwkJCWJyZWFrOworCisJCQkvLyBUT0RPOiAyMDA2LjEwLjMwIG1hcmsgb3RoZXIgcXVldWUgc2VsZWN0aW9uIHVudGlsIHdlIHZlcmlmeSBpdCBpcyBPSworCQkJLy8gVE9ETzogUmVtb3ZlIEFzc2VydGlvbnMKKy8vI2lmIChSVEw4MTlYX0ZQR0FfVkVSICYgUlRMODE5WF9GUEdBX0dVQU5HQU5fMDcwNTAyKQorCQljYXNlIFRYQ01EX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0NNRDsKKwkJCWJyZWFrOworLy8jZW5kaWYKKwkJY2FzZSBISUdIX1FVRVVFOgorCQkJUXVldWVTZWxlY3QgPSBRU0xUX0hJR0g7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJUcmFuc21pdFRDQigpOiBJbXBvc3NpYmxlIFF1ZXVlIFNlbGVjdGlvbjogJWQgXG4iLCBRdWV1ZUlEKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gUXVldWVTZWxlY3Q7Cit9CisKK3U4IE1SYXRlVG9Id1JhdGU4MTkwUGNpKHU4IHJhdGUpCit7CisJdTggIHJldCA9IERFU0M5MF9SQVRFMU07CisKKwlzd2l0Y2gocmF0ZSkgeworCQljYXNlIE1HTl8xTTogICAgcmV0ID0gREVTQzkwX1JBVEUxTTsgICAgYnJlYWs7CisJCWNhc2UgTUdOXzJNOiAgICByZXQgPSBERVNDOTBfUkFURTJNOyAgICBicmVhazsKKwkJY2FzZSBNR05fNV81TTogIHJldCA9IERFU0M5MF9SQVRFNV81TTsgIGJyZWFrOworCQljYXNlIE1HTl8xMU06ICAgcmV0ID0gREVTQzkwX1JBVEUxMU07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzZNOiAgICByZXQgPSBERVNDOTBfUkFURTZNOyAgICBicmVhazsKKwkJY2FzZSBNR05fOU06ICAgIHJldCA9IERFU0M5MF9SQVRFOU07ICAgIGJyZWFrOworCQljYXNlIE1HTl8xMk06ICAgcmV0ID0gREVTQzkwX1JBVEUxMk07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzE4TTogICByZXQgPSBERVNDOTBfUkFURTE4TTsgICBicmVhazsKKwkJY2FzZSBNR05fMjRNOiAgIHJldCA9IERFU0M5MF9SQVRFMjRNOyAgIGJyZWFrOworCQljYXNlIE1HTl8zNk06ICAgcmV0ID0gREVTQzkwX1JBVEUzNk07ICAgYnJlYWs7CisJCWNhc2UgTUdOXzQ4TTogICByZXQgPSBERVNDOTBfUkFURTQ4TTsgICBicmVhazsKKwkJY2FzZSBNR05fNTRNOiAgIHJldCA9IERFU0M5MF9SQVRFNTRNOyAgIGJyZWFrOworCisJCS8vIEhUIHJhdGUgc2luY2UgaGVyZQorCQljYXNlIE1HTl9NQ1MwOiAgcmV0ID0gREVTQzkwX1JBVEVNQ1MwOyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzE6ICByZXQgPSBERVNDOTBfUkFURU1DUzE7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTMjogIHJldCA9IERFU0M5MF9SQVRFTUNTMjsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1MzOiAgcmV0ID0gREVTQzkwX1JBVEVNQ1MzOyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzQ6ICByZXQgPSBERVNDOTBfUkFURU1DUzQ7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTNTogIHJldCA9IERFU0M5MF9SQVRFTUNTNTsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1M2OiAgcmV0ID0gREVTQzkwX1JBVEVNQ1M2OyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzc6ICByZXQgPSBERVNDOTBfUkFURU1DUzc7ICBicmVhazsKKwkJY2FzZSBNR05fTUNTODogIHJldCA9IERFU0M5MF9SQVRFTUNTODsgIGJyZWFrOworCQljYXNlIE1HTl9NQ1M5OiAgcmV0ID0gREVTQzkwX1JBVEVNQ1M5OyAgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEwOiByZXQgPSBERVNDOTBfUkFURU1DUzEwOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTE6IHJldCA9IERFU0M5MF9SQVRFTUNTMTE7IGJyZWFrOworCQljYXNlIE1HTl9NQ1MxMjogcmV0ID0gREVTQzkwX1JBVEVNQ1MxMjsgYnJlYWs7CisJCWNhc2UgTUdOX01DUzEzOiByZXQgPSBERVNDOTBfUkFURU1DUzEzOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTQ6IHJldCA9IERFU0M5MF9SQVRFTUNTMTQ7IGJyZWFrOworCQljYXNlIE1HTl9NQ1MxNTogcmV0ID0gREVTQzkwX1JBVEVNQ1MxNTsgYnJlYWs7CisJCWNhc2UgKDB4ODB8MHgyMCk6IHJldCA9IERFU0M5MF9SQVRFTUNTMzI7IGJyZWFrOworCisJCWRlZmF1bHQ6ICAgICAgIGJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKK3U4IFF1ZXJ5SXNTaG9ydCh1OCBUeEhULCB1OCBUeFJhdGUsIGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCXU4ICAgdG1wX1Nob3J0OworCisJdG1wX1Nob3J0ID0gKFR4SFQ9PTEpPygodGNiX2Rlc2MtPmJVc2VTaG9ydEdJKT8xOjApOigodGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlKT8xOjApOworCisJaWYoVHhIVD09MSAmJiBUeFJhdGUgIT0gREVTQzkwX1JBVEVNQ1MxNSkKKwkJdG1wX1Nob3J0ID0gMDsKKworCXJldHVybiB0bXBfU2hvcnQ7Cit9CisKK3N0YXRpYyB2b2lkIHR4X3plcm9faXNyKHN0cnVjdCB1cmIgKnR4X3VyYikKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgdHggcHJvY2VkdXJlIGlzIGp1c3QgYXMgZm9sbG93aW5nLAorICogc2tiLT5jYiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24sCisgKiBwcmlvcml0eSwgbW9yZWZyYWcsIHJhdGUsICZkZXYuCisgKiAqLworc2hvcnQgcnRsODE5Ml90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdHhfZGVzY184MTl4X3VzYiAqdHhfZGVzYyA9ICh0eF9kZXNjXzgxOXhfdXNiICopc2tiLT5kYXRhOworCXR4X2Z3aW5mb184MTl4X3VzYiAqdHhfZndpbmZvID0gKHR4X2Z3aW5mb184MTl4X3VzYiAqKShza2ItPmRhdGEgKyBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcHJpdi0+dWRldjsKKwlpbnQgcGVuZDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCB1cmIgKnR4X3VyYiA9IE5VTEwsICp0eF91cmJfemVybyA9IE5VTEw7CisJLy9pbnQgdXJiX2xlbjsKKwl1bnNpZ25lZCBpbnQgaWR4X3BpcGU7CisvLwlSVF9ERUJVR19EQVRBKENPTVBfU0VORCwgdGNiX2Rlc2MsIHNpemVvZihjYl9kZXNjKSk7CisvLwlwcmludGsoIj09PT09PT09PT09PT0+ICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXBlbmQgPSBhdG9taWNfcmVhZCgmcHJpdi0+dHhfcGVuZGluZ1t0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKTsKKwkvKiB3ZSBhcmUgbG9ja2VkIGhlcmUgc28gdGhlIHR3byBhdG9taWNfcmVhZCBhbmQgaW5jIGFyZSBleGVjdXRlZAorCSAqIHdpdGhvdXQgaW50ZXJsZWF2ZXMKKwkgKiAhISEgRm9yIGRlYnVnIHB1cnBvc2UKKwkgKi8KKwlpZiggcGVuZCA+IE1BWF9UWF9VUkIpeworCQlwcmludGsoIlRvIGRpc2NhcmQgc2tiIHBhY2tldCFcbiIpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gLTE7CisJfQorCisJdHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLEdGUF9BVE9NSUMpOworCWlmKCF0eF91cmIpeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBGaWxsIFR4IGZpcm13YXJlIGluZm8gKi8KKwltZW1zZXQodHhfZndpbmZvLDAsc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYikpOworCS8qIERXT1JEIDAgKi8KKwl0eF9md2luZm8tPlR4SFQgPSAodGNiX2Rlc2MtPmRhdGFfcmF0ZSYweDgwKT8xOjA7CisJdHhfZndpbmZvLT5UeFJhdGUgPSBNUmF0ZVRvSHdSYXRlODE5MFBjaSh0Y2JfZGVzYy0+ZGF0YV9yYXRlKTsKKwl0eF9md2luZm8tPkVuYWJsZUNQVUR1ciA9IHRjYl9kZXNjLT5iVHhFbmFibGVGd0NhbGNEdXI7CisJdHhfZndpbmZvLT5TaG9ydCA9IFF1ZXJ5SXNTaG9ydCh0eF9md2luZm8tPlR4SFQsIHR4X2Z3aW5mby0+VHhSYXRlLCB0Y2JfZGVzYyk7CisJaWYodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgey8vQU1QRFUgZW5hYmxlZAorCQl0eF9md2luZm8tPkFsbG93QWdncmVnYXRpb24gPSAxOworCQkvKiBEV09SRCAxICovCisJCXR4X2Z3aW5mby0+UnhNRiA9IHRjYl9kZXNjLT5hbXBkdV9mYWN0b3I7CisJCXR4X2Z3aW5mby0+UnhBTUQgPSB0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSYweDA3Oy8vYW1wZHVkZW5zaXR5CisJfSBlbHNlIHsKKwkJdHhfZndpbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMDsKKwkJLyogRFdPUkQgMSAqLworCQl0eF9md2luZm8tPlJ4TUYgPSAwOworCQl0eF9md2luZm8tPlJ4QU1EID0gMDsKKwl9CisKKwkvKiBQcm90ZWN0aW9uIG1vZGUgcmVsYXRlZCAqLworCXR4X2Z3aW5mby0+UnRzRW5hYmxlID0gKHRjYl9kZXNjLT5iUlRTRW5hYmxlKT8xOjA7CisJdHhfZndpbmZvLT5DdHNFbmFibGUgPSAodGNiX2Rlc2MtPmJDVFNFbmFibGUpPzE6MDsKKwl0eF9md2luZm8tPlJ0c1NUQkMgPSAodGNiX2Rlc2MtPmJSVFNTVEJDKT8xOjA7CisJdHhfZndpbmZvLT5SdHNIVCA9ICh0Y2JfZGVzYy0+cnRzX3JhdGUmMHg4MCk/MTowOworCXR4X2Z3aW5mby0+UnRzUmF0ZSA9ICBNUmF0ZVRvSHdSYXRlODE5MFBjaSgodTgpdGNiX2Rlc2MtPnJ0c19yYXRlKTsKKwl0eF9md2luZm8tPlJ0c1N1YmNhcnJpZXIgPSAodHhfZndpbmZvLT5SdHNIVD09MCk/KHRjYl9kZXNjLT5SVFNTQyk6MDsKKwl0eF9md2luZm8tPlJ0c0JhbmR3aWR0aCA9ICh0eF9md2luZm8tPlJ0c0hUPT0xKT8oKHRjYl9kZXNjLT5iUlRTQlcpPzE6MCk6MDsKKwl0eF9md2luZm8tPlJ0c1Nob3J0ID0gKHR4X2Z3aW5mby0+UnRzSFQ9PTApPyh0Y2JfZGVzYy0+YlJUU1VzZVNob3J0UHJlYW1ibGU/MTowKTpcCisJCQkJKHRjYl9kZXNjLT5iUlRTVXNlU2hvcnRHST8xOjApOworCisJLyogU2V0IEJhbmR3aWR0aCBhbmQgc3ViLWNoYW5uZWwgc2V0dGluZ3MuICovCisJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKQorCXsKKwkJaWYodGNiX2Rlc2MtPmJQYWNrZXRCVykgeworCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDE7CisJCQl0eF9md2luZm8tPlR4U3ViQ2FycmllciA9IDA7ICAgIC8vQnkgU0QzJ3MgSmVycnkgc3VnZ2VzdGlvbiwgdXNlIGR1cGxpY2F0ZWQgbW9kZQorCQl9IGVsc2UgeworCQkJdHhfZndpbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCQl0eF9md2luZm8tPlR4U3ViQ2FycmllciA9IHByaXYtPm5DdXI0ME1oelByaW1lU0M7CisJCX0KKwl9IGVsc2UgeworCQl0eF9md2luZm8tPlR4QmFuZHdpZHRoID0gMDsKKwkJdHhfZndpbmZvLT5UeFN1YkNhcnJpZXIgPSAwOworCX0KKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisJaWYgKHRjYl9kZXNjLT5kcnZfYWdnX2VuYWJsZSkKKwl7CisJCXR4X2Z3aW5mby0+VHhfSU5GT19SU1ZEID0gKHRjYl9kZXNjLT5EcnZBZ2dyTnVtICYgMHgxZikgPDwgMTsKKwl9CisjZW5kaWYKKwkvKiBGaWxsIFR4IGRlc2NyaXB0b3IgKi8KKwltZW1zZXQodHhfZGVzYywgMCwgc2l6ZW9mKHR4X2Rlc2NfODE5eF91c2IpKTsKKwkvKiBEV09SRCAwICovCisJdHhfZGVzYy0+TElOSVAgPSAwOworCXR4X2Rlc2MtPkNtZEluaXQgPSAxOworCXR4X2Rlc2MtPk9mZnNldCA9ICBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKSArIDg7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCWlmICh0Y2JfZGVzYy0+ZHJ2X2FnZ19lbmFibGUpIHsKKwkJdHhfZGVzYy0+UGt0U2l6ZSA9IHRjYl9kZXNjLT5wa3Rfc2l6ZTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJdHhfZGVzYy0+UGt0U2l6ZSA9IChza2ItPmxlbiAtIFRYX1BBQ0tFVF9TSElGVF9CWVRFUykgJiAweGZmZmY7CisJfQorCisJLypEV09SRCAxKi8KKwl0eF9kZXNjLT5TZWNDQU1JRD0gMDsKKwl0eF9kZXNjLT5SQVRpZCA9IHRjYl9kZXNjLT5SQVRSSW5kZXg7CisJeworCQkvL01QRFVPdmVyaGVhZCA9IDA7CisJCXR4X2Rlc2MtPk5vRW5jID0gMTsKKwl9CisJdHhfZGVzYy0+U2VjVHlwZSA9IDB4MDsKKwkJaWYgKHRjYl9kZXNjLT5iSHdTZWMpCisJCQl7CisJCQkJc3dpdGNoIChwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlKQorCQkJCXsKKwkJCQkJY2FzZSBLRVlfVFlQRV9XRVA0MDoKKwkJCQkJY2FzZSBLRVlfVFlQRV9XRVAxMDQ6CisJCQkJCQkgdHhfZGVzYy0+U2VjVHlwZSA9IDB4MTsKKwkJCQkJCSB0eF9kZXNjLT5Ob0VuYyA9IDA7CisJCQkJCQkgYnJlYWs7CisJCQkJCWNhc2UgS0VZX1RZUEVfVEtJUDoKKwkJCQkJCSB0eF9kZXNjLT5TZWNUeXBlID0gMHgyOworCQkJCQkJIHR4X2Rlc2MtPk5vRW5jID0gMDsKKwkJCQkJCSBicmVhazsKKwkJCQkJY2FzZSBLRVlfVFlQRV9DQ01QOgorCQkJCQkJIHR4X2Rlc2MtPlNlY1R5cGUgPSAweDM7CisJCQkJCQkgdHhfZGVzYy0+Tm9FbmMgPSAwOworCQkJCQkJIGJyZWFrOworCQkJCQljYXNlIEtFWV9UWVBFX05BOgorCQkJCQkJIHR4X2Rlc2MtPlNlY1R5cGUgPSAweDA7CisJCQkJCQkgdHhfZGVzYy0+Tm9FbmMgPSAxOworCQkJCQkJIGJyZWFrOworCQkJCX0KKwkJCX0KKworCXR4X2Rlc2MtPlF1ZXVlU2VsZWN0ID0gTWFwSHdRdWV1ZVRvRmlybXdhcmVRdWV1ZSh0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOworCXR4X2Rlc2MtPlR4RldJbmZvU2l6ZSA9ICBzaXplb2YodHhfZndpbmZvXzgxOXhfdXNiKTsKKworCXR4X2Rlc2MtPkRJU0ZCID0gdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2s7CisJdHhfZGVzYy0+VVNFUkFURSA9IHRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU7CisKKwkvKiBGaWxsIGZpZWxkcyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBpbml0aWFsaXplZCBpbiBhbGwgb2YgdGhlIGRlc2NyaXB0b3JzICovCisJLy9EV09SRCAwCisJdHhfZGVzYy0+Rmlyc3RTZWcgPSAxOworCXR4X2Rlc2MtPkxhc3RTZWcgPSAxOworCXR4X2Rlc2MtPk9XTiA9IDE7CisKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCWlmICh0Y2JfZGVzYy0+ZHJ2X2FnZ19lbmFibGUpIHsKKwkJdHhfZGVzYy0+VHhCdWZmZXJTaXplID0gdGNiX2Rlc2MtPnBrdF9zaXplICsgc2l6ZW9mKHR4X2Z3aW5mb184MTl4X3VzYik7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8vRFdPUkQgMgorCQl0eF9kZXNjLT5UeEJ1ZmZlclNpemUgPSAodTMyKShza2ItPmxlbiAtIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJfQorCS8qIEdldCBpbmRleCB0byBvdXQgcGlwZSBmcm9tIHNwZWNpZmllZCBRdWV1ZUlEICovCisjaWZuZGVmIFVTRV9PTkVfUElQRQorCWlkeF9waXBlID0gdHhxdWV1ZTJvdXRwaXBlKHByaXYsdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKKyNlbHNlCisJaWR4X3BpcGUgPSAweDU7CisjZW5kaWYKKworCS8vUlRfREVCVUdfREFUQShDT01QX1NFTkQsdHhfZndpbmZvLHNpemVvZih0eF9md2luZm9fODE5eF91c2IpKTsKKwkvL1JUX0RFQlVHX0RBVEEoQ09NUF9TRU5ELHR4X2Rlc2Msc2l6ZW9mKHR4X2Rlc2NfODE5eF91c2IpKTsKKworCS8qIFRvIHN1Ym1pdCBidWxrIHVyYiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHR4X3VyYix1ZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKHVkZXYsaWR4X3BpcGUpLCBza2ItPmRhdGEsCisJCQlza2ItPmxlbiwgcnRsODE5Ml90eF9pc3IsIHNrYik7CisKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih0eF91cmIsIEdGUF9BVE9NSUMpOworCWlmICghc3RhdHVzKXsKKy8vd2UgbmVlZCB0byBzZW5kIDAgYnl0ZSBwYWNrZXQgd2hlbmV2ZXIgNTEyTiBieXRlcy82NE4oSElHTiBTUEVFRC9OT1JNQUwgU1BFRUQpIGJ5dGVzIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZC4gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGhhbHQgdG8gd2FpdCBmb3IgYW5vdGhlciBwYWNrZXQuIFdCLiAyMDA4LjA4LjI3CisJCWJvb2wgYlNlbmQwQnl0ZSA9IGZhbHNlOworCQl1OCB6ZXJvID0gMDsKKwkJaWYodWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCXsKKwkJCWlmIChza2ItPmxlbiA+IDAgJiYgc2tiLT5sZW4gJSA1MTIgPT0gMCkKKwkJCQliU2VuZDBCeXRlID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChza2ItPmxlbiA+IDAgJiYgc2tiLT5sZW4gJSA2NCA9PSAwKQorCQkJCWJTZW5kMEJ5dGUgPSB0cnVlOworCQl9CisJCWlmIChiU2VuZDBCeXRlKQorCQl7CisJCQl0eF91cmJfemVybyA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKTsKKwkJCWlmKCF0eF91cmJfemVybyl7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJjYW4ndCBhbGxvYyB1cmIgZm9yIHplcm8gYnl0ZVxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQl1c2JfZmlsbF9idWxrX3VyYih0eF91cmJfemVybyx1ZGV2LAorCQkJCQl1c2Jfc25kYnVsa3BpcGUodWRldixpZHhfcGlwZSksICZ6ZXJvLAorCQkJCQkwLCB0eF96ZXJvX2lzciwgZGV2KTsKKwkJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHR4X3VyYl96ZXJvLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChzdGF0dXMpeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFcnJvciBUWCBVUkIgZm9yIHplcm8gYnl0ZSAlZCwgZXJyb3IgJWQiLCBhdG9taWNfcmVhZCgmcHJpdi0+dHhfcGVuZGluZ1t0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSwgc3RhdHVzKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJYXRvbWljX2luYygmcHJpdi0+dHhfcGVuZGluZ1t0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKTsKKwkJcmV0dXJuIDA7CisJfWVsc2V7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiRXJyb3IgVFggVVJCICVkLCBlcnJvciAlZCIsIGF0b21pY19yZWFkKCZwcml2LT50eF9wZW5kaW5nW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pLAorCQkJCXN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3Nob3J0IHJ0bDgxOTJfdXNiX2luaXRlbmRwb2ludHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlwcml2LT5yeF91cmIgPSAoc3RydWN0IHVyYioqKSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IHVyYiopICogKE1BWF9SWF9VUkIrMSksIEdGUF9LRVJORUwpOworCisjaWZuZGVmIEpBQ0tTT05fTkVXX1JYCisJZm9yKGk9MDtpPChNQVhfUlhfVVJCKzEpO2krKyl7CisKKwkJcHJpdi0+cnhfdXJiW2ldID0gdXNiX2FsbG9jX3VyYigwLEdGUF9LRVJORUwpOworCisJCXByaXYtPnJ4X3VyYltpXS0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhSWF9VUkJfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwkJcHJpdi0+cnhfdXJiW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gUlhfVVJCX1NJWkU7CisJfQorI2VuZGlmCisKKyNpZmRlZiBUSE9NQVNfQkVBQ09OCit7CisJbG9uZyBhbGlnbiA9IDA7CisJdm9pZCAqb2xkYWRkciwgKm5ld2FkZHI7CisKKwlwcml2LT5yeF91cmJbMTZdID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlwcml2LT5vbGRhZGRyID0ga21hbGxvYygxNiwgR0ZQX0tFUk5FTCk7CisJb2xkYWRkciA9IHByaXYtPm9sZGFkZHI7CisJYWxpZ24gPSAoKGxvbmcpb2xkYWRkcikgJiAzOworCWlmIChhbGlnbikgeworCQluZXdhZGRyID0gb2xkYWRkciArIDQgLSBhbGlnbjsKKwkJcHJpdi0+cnhfdXJiWzE2XS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE2IC0gNCArIGFsaWduOworCX0gZWxzZSB7CisJCW5ld2FkZHIgPSBvbGRhZGRyOworCQlwcml2LT5yeF91cmJbMTZdLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTY7CisJfQorCXByaXYtPnJ4X3VyYlsxNl0tPnRyYW5zZmVyX2J1ZmZlciA9IG5ld2FkZHI7Cit9CisjZW5kaWYKKworCW1lbXNldChwcml2LT5yeF91cmIsIDAsIHNpemVvZihzdHJ1Y3QgdXJiKikgKiBNQVhfUlhfVVJCKTsKKwlwcml2LT5wcF9yeHNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSAqIE1BWF9SWF9VUkIsIEdGUF9LRVJORUwpOworCWlmIChwcml2LT5wcF9yeHNrYiA9PSBOVUxMKQorCQlnb3RvIGRlc3Ryb3k7CisKKwltZW1zZXQocHJpdi0+cHBfcnhza2IsIDAsIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiopICogTUFYX1JYX1VSQik7CisKKwlnb3RvIF9taWRkbGU7CisKKworZGVzdHJveToKKwlpZiAocHJpdi0+cHBfcnhza2IpIHsKKwkJa2ZyZWUocHJpdi0+cHBfcnhza2IpOworCX0KKwlpZiAocHJpdi0+cnhfdXJiKSB7CisJCWtmcmVlKHByaXYtPnJ4X3VyYik7CisJfQorCisJcHJpdi0+cHBfcnhza2IgPSBOVUxMOworCXByaXYtPnJ4X3VyYiA9IE5VTEw7CisKKwlETUVTR0UoIkVuZHBvaW50IEFsbG9jIEZhaWx1cmUiKTsKKwlyZXR1cm4gLUVOT01FTTsKKworCitfbWlkZGxlOgorCisJcHJpbnRrKCJFbmQgb2YgaW5pdGVuZHBvaW50c1xuIik7CisJcmV0dXJuIDA7CisKK30KKyNpZmRlZiBUSE9NQVNfQkVBQ09OCit2b2lkIHJ0bDgxOTJfdXNiX2RlbGV0ZWVuZHBvaW50cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPnJ4X3VyYil7CisJCWZvcihpPTA7aTwoTUFYX1JYX1VSQisxKTtpKyspeworCQkJdXNiX2tpbGxfdXJiKHByaXYtPnJ4X3VyYltpXSk7CisJCQl1c2JfZnJlZV91cmIocHJpdi0+cnhfdXJiW2ldKTsKKwkJfQorCQlrZnJlZShwcml2LT5yeF91cmIpOworCQlwcml2LT5yeF91cmIgPSBOVUxMOworCX0KKwlpZihwcml2LT5vbGRhZGRyKXsKKwkJa2ZyZWUocHJpdi0+b2xkYWRkcik7CisJCXByaXYtPm9sZGFkZHIgPSBOVUxMOworCX0KKwlpZiAocHJpdi0+cHBfcnhza2IpIHsKKwkJa2ZyZWUocHJpdi0+cHBfcnhza2IpOworCQlwcml2LT5wcF9yeHNrYiA9IDA7CisJfQorfQorI2Vsc2UKK3ZvaWQgcnRsODE5Ml91c2JfZGVsZXRlZW5kcG9pbnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisjaWZuZGVmIEpBQ0tTT05fTkVXX1JYCisKKwlpZihwcml2LT5yeF91cmIpeworCQlmb3IoaT0wO2k8KE1BWF9SWF9VUkIrMSk7aSsrKXsKKwkJCXVzYl9raWxsX3VyYihwcml2LT5yeF91cmJbaV0pOworCQkJa2ZyZWUocHJpdi0+cnhfdXJiW2ldLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiX2ZyZWVfdXJiKHByaXYtPnJ4X3VyYltpXSk7CisJCX0KKwkJa2ZyZWUocHJpdi0+cnhfdXJiKTsKKwkJcHJpdi0+cnhfdXJiID0gTlVMTDsKKworCX0KKyNlbHNlCisJaWYocHJpdi0+cnhfdXJiKXsKKwkJa2ZyZWUocHJpdi0+cnhfdXJiKTsKKwkJcHJpdi0+cnhfdXJiID0gTlVMTDsKKwl9CisJaWYocHJpdi0+b2xkYWRkcil7CisJCWtmcmVlKHByaXYtPm9sZGFkZHIpOworCQlwcml2LT5vbGRhZGRyID0gTlVMTDsKKwl9CisJaWYgKHByaXYtPnBwX3J4c2tiKSB7CisJCWtmcmVlKHByaXYtPnBwX3J4c2tiKTsKKwkJcHJpdi0+cHBfcnhza2IgPSAwOworCisJfQorCisjZW5kaWYKK30KKyNlbmRpZgorCitleHRlcm4gdm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOwordm9pZCBydGw4MTkyX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisvLwlpbnQgaTsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkvL3dyaXRlX25pY193b3JkKGRldiwgQkNOX0lOVFJfSVRWLCBuZXQtPmJlYWNvbl9pbnRlcnZhbCk7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJeworCQlydGw4MTkyX25ldF91cGRhdGUoZGV2KTsKKwkJcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShkZXYpOworCQkvL2FkZCB0aGlzIGFzIGluIHB1cmUgTiBtb2RlLCB3ZXAgZW5jcnlwdGlvbiB3aWxsIHVzZSBzb2Z0d2FyZSB3YXksIGJ1dCB0aGVyZSBpcyBubyBjaGFuY2UgdG8gc2V0IHRoaXMgYXMgd2VwIHdpbGwgbm90IHNldCBncm91cCBrZXkgaW4gd2V4dC4gV0IuMjAwOC4wNy4wOAorCQlpZiAoKEtFWV9UWVBFX1dFUDQwID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSB8fCAoS0VZX1RZUEVfV0VQMTA0ID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSkKKwkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKwl9CisJLyp1cGRhdGUgdGltaW5nIHBhcmFtcyovCisvLwlSVF9UUkFDRShDT01QX0NILCAiPT09PT09PT0+JXMoKSwgY2hhbjolZFxuIiwgX19GVU5DVElPTl9fLCBwcml2LT5jaGFuKTsKKy8vCXJ0bDgxOTJfc2V0X2NoYW4oZGV2LCBwcml2LT5jaGFuKTsKKwkgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1MzIgcmVnID0gMDsKKyAgICAgICAgICAgICAgICByZWcgPSByZWFkX25pY19kd29yZChkZXYsIFJDUik7CisgICAgICAgICAgICAgICAgaWYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPlJlY2VpdmVDb25maWcgPSByZWcgfD0gUkNSX0NCU1NJRDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5SZWNlaXZlQ29uZmlnID0gcmVnICY9IH5SQ1JfQ0JTU0lEOworICAgICAgICAgICAgICAgIHdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcmVnKTsKKyAgICAgICAgfQorCisvLwlydGw4MTkyX3NldF9yeGNvbmYoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgZGVmX3Fvc19wYXJhbWV0ZXJzID0geworICAgICAgICB7MywzLDMsM30sLyogY3dfbWluICovCisgICAgICAgIHs3LDcsNyw3fSwvKiBjd19tYXggKi8KKyAgICAgICAgezIsMiwyLDJ9LC8qIGFpZnMgKi8KKyAgICAgICAgezAsMCwwLDB9LC8qIGZsYWdzICovCisgICAgICAgIHswLDAsMCwwfSAvKiB0eF9vcF9saW1pdCAqLworfTsKKworCit2b2lkIHJ0bDgxOTJfdXBkYXRlX2JlYWNvbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQoreworICAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxOTJfcHJpdiwgdXBkYXRlX2JlYWNvbl93cS53b3JrKTsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsqIG5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisKKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpCisJCUhUVXBkYXRlU2VsZkFuZFBlZXJTZXR0aW5nKGllZWUsIG5ldCk7CisJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IG5ldC0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZTsKKwlydGw4MTkyX3VwZGF0ZV9jYXAoZGV2LCBuZXQtPmNhcGFiaWxpdHkpOworfQorLyoKKyogYmFja2dyb3VuZCBzdXBwb3J0IHRvIHJ1biBRb1MgYWN0aXZhdGUgZnVuY3Rpb25hbGl0eQorKi8KK2ludCBXRENBUEFSQV9BRERbXSA9IHtFRENBUEFSQV9CRSxFRENBUEFSQV9CSyxFRENBUEFSQV9WSSxFRENBUEFSQV9WT307Cit2b2lkIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqIHdvcmspCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHFvc19hY3RpdmF0ZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgKnFvc19wYXJhbWV0ZXJzID0gJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnM7CisJdTggbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGU7CisJLy91MzIgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzKTsKKwl1OCAgdTFiQUlGUzsKKwl1MzIgdTRiQWNQYXJhbTsKKwlpbnQgaTsKKworCWlmIChwcml2ID09IE5VTEwpCisJCXJldHVybjsKKworICAgICAgIG11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCisJCWdvdG8gc3VjY2VzczsKKwlSVF9UUkFDRShDT01QX1FPUywicW9zIGFjdGl2ZSBwcm9jZXNzIHdpdGggYXNzb2NpYXRlIHJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKKwkvKiBJdCBiZXR0ZXIgc2V0IHNsb3QgdGltZSBhdCBmaXJzdCAqLworCS8qIEZvciB3ZSBqdXN0IHN1cHBvcnQgYi9nIG1vZGUgYXQgcHJlc2VudCwgbGV0IHRoZSBzbG90IHRpbWUgYXQgOS8yMCBzZWxlY3Rpb24gKi8KKwkvKiB1cGRhdGUgdGhlIGFjIHBhcmFtZXRlciB0byByZWxhdGVkIHJlZ2lzdGVycyAqLworCWZvcihpID0gMDsgaSA8ICBRT1NfUVVFVUVfTlVNOyBpKyspIHsKKwkJLy9Nb2RlIEcvQTogc2xvdFRpbWVUaW1lciA9IDk7IE1vZGUgQjogMjAKKwkJdTFiQUlGUyA9IHFvc19wYXJhbWV0ZXJzLT5haWZzW2ldICogKChtb2RlJihJRUVFX0d8SUVFRV9OXzI0RykpID85OjIwKSArIGFTaWZzVGltZTsKKwkJdTRiQWNQYXJhbSA9ICgoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT50eF9vcF9saW1pdFtpXSkpPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpfAorCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21heFtpXSkpPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAorCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21pbltpXSkpPDwgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpfAorCQkJCSgodTMyKXUxYkFJRlMgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIHU0YkFjUGFyYW0pOworCQkvL3dyaXRlX25pY19kd29yZChkZXYsIFdEQ0FQQVJBX0FERFtpXSwgMHgwMDVlNDMzMik7CisJfQorCitzdWNjZXNzOgorICAgICAgIG11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IHJ0bDgxOTJfcW9zX2hhbmRsZV9wcm9iZV9yZXNwb25zZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKKwkJaW50IGFjdGl2ZV9uZXR3b3JrLAorCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJaW50IHJldCA9IDA7CisJdTMyIHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyk7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9SUVFRTgwMjExX0xJTktFRCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfUU9TX01BU0spIHsKKwkJaWYgKGFjdGl2ZV9uZXR3b3JrICYmCisJCQkJKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlMpKQorCQkJbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkOworCisJCWlmICgobmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID09IDEpICYmIChhY3RpdmVfbmV0d29yayA9PSAxKSAmJgorCQkJCShuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTKSAmJgorCQkJCShuZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgIT0KKwkJCQkgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQpKSB7CisJCQluZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPQorCQkJCW5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50OworCQkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKKwkJCVJUX1RSQUNFIChDT01QX1FPUywgIlFvUyBwYXJhbWV0ZXJzIGNoYW5nZSBjYWxsICIKKwkJCQkJInFvc19hY3RpdmF0ZVxuIik7CisJCX0KKwl9IGVsc2UgeworCQltZW1jcHkoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsXAorCQkgICAgICAgJmRlZl9xb3NfcGFyYW1ldGVycywgc2l6ZSk7CisKKwkJaWYgKChuZXR3b3JrLT5xb3NfZGF0YS5hY3RpdmUgPT0gMSkgJiYgKGFjdGl2ZV9uZXR3b3JrID09IDEpKSB7CisJCQlxdWV1ZV93b3JrKHByaXYtPnByaXZfd3EsICZwcml2LT5xb3NfYWN0aXZhdGUpOworCQkJUlRfVFJBQ0UoQ09NUF9RT1MsICJRb1Mgd2FzIGRpc2FibGVkIGNhbGwgcW9zX2FjdGl2YXRlIFxuIik7CisJCX0KKwkJbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gMDsKKwkJbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogaGFuZGxlIG1hbmFnZSBmcmFtZSBmcmFtZSBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCitzdGF0aWMgaW50IHJ0bDgxOTJfaGFuZGxlX2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfYmVhY29uICogYmVhY29uLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogbmV0d29yaykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlydGw4MTkyX3Fvc19oYW5kbGVfcHJvYmVfcmVzcG9uc2UocHJpdiwxLG5ldHdvcmspOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+dXBkYXRlX2JlYWNvbl93cSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworLyoKKyogaGFuZGxpbmcgdGhlIGJlYWNvbmluZyByZXNwb25zZXMuIGlmIHdlIGdldCBkaWZmZXJlbnQgUW9TIHNldHRpbmcKKyogb2ZmIHRoZSBuZXR3b3JrIGZyb20gdGhlIGFzc29jaWF0ZWQgc2V0dGluZywgYWRqdXN0IHRoZSBRb1MKKyogc2V0dGluZworKi8KK3N0YXRpYyBpbnQgcnRsODE5Ml9xb3NfYXNzb2NpYXRpb25fcmVzcChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyk7CisJaW50IHNldF9xb3NfcGFyYW0gPSAwOworCisJaWYgKChwcml2ID09IE5VTEwpIHx8IChuZXR3b3JrID09IE5VTEwpKQorCQlyZXR1cm4gcmV0OworCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPUlFRUU4MDIxMV9MSU5LRUQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSkKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pZWVlODAyMTEtPmxvY2ssIGZsYWdzKTsKKwlpZihuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTKSB7CisJCW1lbWNweSgmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1ldGVycyxcCisJCQkgJm5ldHdvcmstPnFvc19kYXRhLnBhcmFtZXRlcnMsXAorCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMpKTsKKwkJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID0gMTsKKwkJIHsKKwkJCXNldF9xb3NfcGFyYW0gPSAxOworCQkJLyogdXBkYXRlIHFvcyBwYXJhbWV0ZXIgZm9yIGN1cnJlbnQgbmV0d29yayAqLworCQkJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0gXAorCQkJCSBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwkJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtX2NvdW50ID0gXAorCQkJCSBuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweSgmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1ldGVycyxcCisJCSAgICAgICAmZGVmX3Fvc19wYXJhbWV0ZXJzLCBzaXplKTsKKwkJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID0gMDsKKwkJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKKwkJc2V0X3Fvc19wYXJhbSA9IDE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aWVlZTgwMjExLT5sb2NrLCBmbGFncyk7CisKKwlSVF9UUkFDRShDT01QX1FPUywgIiVzOiBuZXR3b3JrLT5mbGFncyA9ICVkLCVkXG4iLF9fRlVOQ1RJT05fXyxuZXR3b3JrLT5mbGFncyAscHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlKTsKKwlpZiAoc2V0X3Fvc19wYXJhbSA9PSAxKQorCQlxdWV1ZV93b3JrKHByaXYtPnByaXZfd3EsICZwcml2LT5xb3NfYWN0aXZhdGUpOworCisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcnRsODE5Ml9oYW5kbGVfYXNzb2NfcmVzcG9uc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKnJlc3AsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXJ0bDgxOTJfcW9zX2Fzc29jaWF0aW9uX3Jlc3AocHJpdiwgbmV0d29yayk7CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCisJLy8JUE9DVEVUX1NUUklORwlwb3NMZWdhY3lSYXRlLAorCS8vCXU4KgkJCXBNY3NSYXRlKQorCS8vCVBSVF9XTEFOX1NUQQlwRW50cnkpCit7CisJc3RydWN0IHI4MTkyX3ByaXYqIHByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXU4KiBwTWNzUmF0ZSA9IGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQ7CisJLy9zdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJdTMyIHJhdHJfdmFsdWUgPSAwOworCXU4IHJhdGVfaW5kZXggPSAwOworCXJ0bDgxOTJfY29uZmlnX3JhdGUoZGV2LCAodTE2KikoJnJhdHJfdmFsdWUpKTsKKwlyYXRyX3ZhbHVlIHw9ICgqKHUxNiopKHBNY3NSYXRlKSkgPDwgMTI7CisvLwlzd2l0Y2ggKG5ldC0+bW9kZSkKKwlzd2l0Y2ggKGllZWUtPm1vZGUpCisJeworCQljYXNlIElFRUVfQToKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDAwMEZGMDsKKwkJCWJyZWFrOworCQljYXNlIElFRUVfQjoKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDAwMDAwRjsKKwkJCWJyZWFrOworCQljYXNlIElFRUVfRzoKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDAwMEZGNzsKKwkJCWJyZWFrOworCQljYXNlIElFRUVfTl8yNEc6CisJCWNhc2UgSUVFRV9OXzVHOgorCQkJaWYgKGllZWUtPnBIVEluZm8tPlBlZXJNaW1vUHMgPT0gMCkgLy9NSU1PX1BTX1NUQVRJQworCQkJCXJhdHJfdmFsdWUgJj0gMHgwMDA3RjAwNzsKKwkJCWVsc2V7CisJCQkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJCQkJcmF0cl92YWx1ZSAmPSAweDAwMEZGMDA3OworCQkJCWVsc2UKKwkJCQkJcmF0cl92YWx1ZSAmPSAweDBGODFGMDA3OworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmF0cl92YWx1ZSAmPSAweDBGRkZGRkZGOworCWlmKGllZWUtPnBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgaWVlZS0+cEhUSW5mby0+YkN1clNob3J0R0k0ME1Ieil7CisJCXJhdHJfdmFsdWUgfD0gMHg4MDAwMDAwMDsKKwl9ZWxzZSBpZighaWVlZS0+cEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJiBpZWVlLT5wSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6KXsKKwkJcmF0cl92YWx1ZSB8PSAweDgwMDAwMDAwOworCX0KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCtyYXRlX2luZGV4KjQsIHJhdHJfdmFsdWUpOworCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7Cit9CisKK3N0YXRpYyB1OCBjY21wX2llWzRdID0gezB4MDAsMHg1MCwweGYyLDB4MDR9Oworc3RhdGljIHU4IGNjbXBfcnNuX2llWzRdID0gezB4MDAsIDB4MGYsIDB4YWMsIDB4MDR9OworYm9vbCBHZXRObW9kZVN1cHBvcnRCeVNlY0NmZzgxOTIoc3RydWN0IG5ldF9kZXZpY2UqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2KiBwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlpbnQgd3BhX2llX2xlbj0gaWVlZS0+d3BhX2llX2xlbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OworCWludCBlbmNyeXB0OworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCS8vd2UgdXNlIGNvbm5lY3RpbmcgQVAncyBjYXBhYmlsaXR5IGluc3RlYWQgb2Ygb25seSBzZWN1cml0eSBjb25maWcgb24gb3VyIGRyaXZlciB0byBkaXN0aW5ndWlzaCB3aGV0aGVyIGl0IHNob3VsZCB1c2UgTiBtb2RlIG9yIEcgbW9kZQorCWVuY3J5cHQgPSAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSB8fCAoaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsIldFUCIpKSk7CisKKwkvKiBzaW1wbHkganVkZ2UgICovCisJaWYoZW5jcnlwdCAmJiAod3BhX2llX2xlbiA9PSAwKSkgeworCQkvKiB3ZXAgZW5jcnlwdGlvbiwgbm8gTiBtb2RlIHNldHRpbmcgKi8KKwkJcmV0dXJuIGZhbHNlOworLy8JfSBlbHNlIGlmKCh3cGFfaWVfbGVuICE9IDApJiYobWVtY21wKCYoaWVlZS0+d3BhX2llWzE0XSksY2NtcF9pZSw0KSkpIHsKKwl9IGVsc2UgaWYoKHdwYV9pZV9sZW4gIT0gMCkpIHsKKwkJLyogcGFyc2UgcGFpcndpc2Uga2V5IHR5cGUgKi8KKwkJLy9pZigocGFpcndpc2VrZXkgPSBXRVA0MCl8fChwYWlyd2lzZWtleSA9IFdFUDEwNCl8fChwYWlyd2lzZWtleSA9IFRLSVApKQorCQlpZiAoKChpZWVlLT53cGFfaWVbMF0gPT0gMHhkZCkgJiYgKCFtZW1jbXAoJihpZWVlLT53cGFfaWVbMTRdKSxjY21wX2llLDQpKSkgfHwgKChpZWVlLT53cGFfaWVbMF0gPT0gMHgzMCkgJiYgKCFtZW1jbXAoJmllZWUtPndwYV9pZVsxMF0sY2NtcF9yc25faWUsIDQpKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitib29sIEdldEhhbGZObW9kZVN1cHBvcnRCeUFQczgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlib29sCQkJUmV2YWw7CisJc3RydWN0IHI4MTkyX3ByaXYqIHByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCisJaWYoaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID09IHRydWUpCisJCVJldmFsID0gdHJ1ZTsKKwllbHNlCisJCVJldmFsID0gIGZhbHNlOworCisJcmV0dXJuIFJldmFsOworfQorCit2b2lkIHJ0bDgxOTJfcmVmcmVzaF9zdXBwb3J0cmF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwkvL3dlIGRvbm90IGNvbnNpZGVyIHNldCBzdXBwb3J0IHJhdGUgZm9yIEFCRyBtb2RlLCBvbmx5IEhUIE1DUyByYXRlIGlzIHNldCBoZXJlLgorCWlmIChpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcgfHwgaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpCisJeworCQltZW1jcHkoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgaWVlZS0+UmVnSFRTdXBwUmF0ZVNldCwgMTYpOworCQkvL1JUX0RFQlVHX0RBVEEoQ09NUF9JTklULCBpZWVlLT5SZWdIVFN1cHBSYXRlU2V0LCAxNik7CisJCS8vUlRfREVCVUdfREFUQShDT01QX0lOSVQsIGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDE2KTsKKwl9CisJZWxzZQorCQltZW1zZXQoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOworCXJldHVybjsKK30KKwordTggcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZShzdHJ1Y3QgbmV0X2RldmljZSpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4IHJldCA9IDA7CisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCQljYXNlIFJGXzgyMjU6CisJCWNhc2UgUkZfODI1NjoKKwkJY2FzZSBSRl9QU0VVRE9fMTFOOgorCQkJcmV0ID0gKFdJUkVMRVNTX01PREVfTl8yNEd8V0lSRUxFU1NfTU9ERV9HfFdJUkVMRVNTX01PREVfQik7CisJCQlicmVhazsKKwkJY2FzZSBSRl84MjU4OgorCQkJcmV0ID0gKFdJUkVMRVNTX01PREVfQXxXSVJFTEVTU19NT0RFX05fNUcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSBXSVJFTEVTU19NT0RFX0I7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KK3ZvaWQgcnRsODE5Ml9TZXRXaXJlbGVzc01vZGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggd2lyZWxlc3NfbW9kZSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYlN1cHBvcnRNb2RlID0gcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZShkZXYpOworCisJaWYgKCh3aXJlbGVzc19tb2RlID09IFdJUkVMRVNTX01PREVfQVVUTykgfHwgKCh3aXJlbGVzc19tb2RlJmJTdXBwb3J0TW9kZSk9PTApKQorCXsKKwkJaWYoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9OXzI0RykKKwkJeworCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfTl8yNEc7CisJCX0KKwkJZWxzZSBpZihiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX05fNUcpCisJCXsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX05fNUc7CisJCX0KKwkJZWxzZSBpZigoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9BKSkKKwkJeworCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQTsKKwkJfQorCQllbHNlIGlmKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0cpKQorCQl7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9HOworCQl9CisJCWVsc2UgaWYoKGJTdXBwb3J0TW9kZSAmIFdJUkVMRVNTX01PREVfQikpCisJCXsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwkJZWxzZXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKSwgTm8gdmFsaWQgd2lyZWxlc3MgbW9kZSBzdXBwb3J0ZWQsIFN1cHBvcnRlZFdpcmVsZXNzTW9kZSgleCkhISFcbiIsIF9fRlVOQ1RJT05fXyxiU3VwcG9ydE1vZGUpOworCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQjsKKwkJfQorCX0KKyNpZmRlZiBUT19ET19MSVNUIC8vLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdvcmsgd2VsbCBhdCB0aGlzIHRpbWUsIHdlIHNob3VkIHdhaXQgZm9yIEZQR0EKKwlBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZyggcEFkYXB0ZXIsIHBIYWxEYXRhLT5DdXJyZW50V2lyZWxlc3NNb2RlLCAmcEFkYXB0ZXItPk1nbnRJbmZvLkluZm84MTg1LkNoYW5uZWxBY2Nlc3NTZXR0aW5nICk7CisjZW5kaWYKKwlwcml2LT5pZWVlODAyMTEtPm1vZGUgPSB3aXJlbGVzc19tb2RlOworCisJaWYgKCh3aXJlbGVzc19tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpIHx8ICAod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpKQorCQlwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJFbmFibGVIVCA9IDE7CisJZWxzZQorCQlwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJFbmFibGVIVCA9IDA7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ3VycmVudCBXaXJlbGVzcyBNb2RlIGlzICV4XG4iLCB3aXJlbGVzc19tb2RlKTsKKwlydGw4MTkyX3JlZnJlc2hfc3VwcG9ydHJhdGUocHJpdik7CisKK30KKy8vaW5pdCBwcml2IHZhcmlhYmxlcyBoZXJlLiBvbmx5IG5vbl96ZXJvIHZhbHVlIHNob3VsZCBiZSBpbml0aWFsaXplZCBoZXJlLgorc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfdmFyaWFibGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggaTsKKwlwcml2LT5jYXJkXzgxOTIgPSBOSUNfODE5MlU7CisJcHJpdi0+Y2hhbiA9IDE7IC8vc2V0IHRvIGNoYW5uZWwgMQorCXByaXYtPmllZWU4MDIxMS0+bW9kZSA9IFdJUkVMRVNTX01PREVfQVVUTzsgLy9TRVQgQVVUTworCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3VwPTA7CisJcHJpdi0+cmV0cnlfcnRzID0gREVGQVVMVF9SRVRSWV9SVFM7CisJcHJpdi0+cmV0cnlfZGF0YSA9IERFRkFVTFRfUkVUUllfREFUQTsKKwlwcml2LT5pZWVlODAyMTEtPnJ0cyA9IERFRkFVTFRfUlRTX1RIUkVTSE9MRDsKKwlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSAxMTA7IC8vMTEgbWJwcworCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7CisJcHJpdi0+cHJvbWlzYyA9IChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMTowOworCXByaXYtPkNja1B3RW5sID0gNjsKKwkvL2ZvciBzaWxlbnQgcmVzZXQKKwlwcml2LT5JcnBQZW5kaW5nQ291bnQgPSAxOworCXByaXYtPlJlc2V0UHJvZ3Jlc3MgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0ID0gMDsKKwlwcml2LT5iRGlzYWJsZU5vcm1hbFJlc2V0Q2hlY2sgPSBmYWxzZTsKKwlwcml2LT5mb3JjZV9yZXNldCA9IGZhbHNlOworCisJcHJpdi0+aWVlZTgwMjExLT5Gd1JXUkYgPSAwOyAJLy93ZSBkb24ndCB1c2UgRlcgcmVhZC93cml0ZSBSRiB1bnRpbCBzdGFibGUgZmlybXdhcmUgaXMgYXZhaWxhYmxlLgorCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IERFRkFVTFRfQkVBQ09OSU5URVJWQUw7CisJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfZmVhdHVyZXMgID0gSUVFRV9TT0ZUTUFDX1NDQU4gfAorCQlJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIHwgSUVFRV9TT0ZUTUFDX1BST0JFUlEgfAorCQlJRUVFX1NPRlRNQUNfUFJPQkVSUyB8IElFRUVfU09GVE1BQ19UWF9RVUVVRSB8CisJCUlFRUVfU09GVE1BQ19CRUFDT05TOy8vYWRkZWQgYnkgYW15IDA4MDYwNCAvL3wgIC8vSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKKworCXByaXYtPmllZWU4MDIxMS0+YWN0aXZlX3NjYW4gPSAxOworCXByaXYtPmllZWU4MDIxMS0+bW9kdWxhdGlvbiA9IElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiB8IElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT047CisJcHJpdi0+aWVlZTgwMjExLT5ob3N0X2VuY3J5cHQgPSAxOworCXByaXYtPmllZWU4MDIxMS0+aG9zdF9kZWNyeXB0ID0gMTsKKwlwcml2LT5pZWVlODAyMTEtPnN0YXJ0X3NlbmRfYmVhY29ucyA9IE5VTEw7Ly9ydGw4MTl4dXNiX2JlYWNvbl90eDsvLy1ieSBhbXkgMDgwNjA0CisJcHJpdi0+aWVlZTgwMjExLT5zdG9wX3NlbmRfYmVhY29ucyA9IE5VTEw7Ly9ydGw4MTkyX2JlYWNvbl9zdG9wOy8vLWJ5IGFteSAwODA2MDQKKwlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfaGFyZF9zdGFydF94bWl0ID0gcnRsODE5Ml9oYXJkX3N0YXJ0X3htaXQ7CisJcHJpdi0+aWVlZTgwMjExLT5zZXRfY2hhbiA9IHJ0bDgxOTJfc2V0X2NoYW47CisJcHJpdi0+aWVlZTgwMjExLT5saW5rX2NoYW5nZSA9IHJ0bDgxOTJfbGlua19jaGFuZ2U7CisJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ID0gcnRsODE5Ml9oYXJkX2RhdGFfeG1pdDsKKwlwcml2LT5pZWVlODAyMTEtPmRhdGFfaGFyZF9zdG9wID0gcnRsODE5Ml9kYXRhX2hhcmRfc3RvcDsKKwlwcml2LT5pZWVlODAyMTEtPmRhdGFfaGFyZF9yZXN1bWUgPSBydGw4MTkyX2RhdGFfaGFyZF9yZXN1bWU7CisJcHJpdi0+aWVlZTgwMjExLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOworCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRDsKKwlwcml2LT5pZWVlODAyMTEtPmNoZWNrX25pY19lbm91Z2hfZGVzYyA9IGNoZWNrX25pY19lbm91Z2hfZGVzYzsKKwlwcml2LT5pZWVlODAyMTEtPnR4X2hlYWRyb29tID0gVFhfUEFDS0VUX1NISUZUX0JZVEVTOworCXByaXYtPmllZWU4MDIxMS0+cW9zX3N1cHBvcnQgPSAxOworCisJLy9hZGRlZCBieSBXQgorLy8JcHJpdi0+aWVlZTgwMjExLT5Td0NobmxCeVRpbWVySGFuZGxlciA9IHJ0bDgxOTJfcGh5X1N3Q2hubDsKKwlwcml2LT5pZWVlODAyMTEtPlNldEJXTW9kZUhhbmRsZXIgPSBydGw4MTkyX1NldEJXTW9kZTsKKwlwcml2LT5pZWVlODAyMTEtPmhhbmRsZV9hc3NvY19yZXNwb25zZSA9IHJ0bDgxOTJfaGFuZGxlX2Fzc29jX3Jlc3BvbnNlOworCXByaXYtPmllZWU4MDIxMS0+aGFuZGxlX2JlYWNvbiA9IHJ0bDgxOTJfaGFuZGxlX2JlYWNvbjsKKwkvL2FkZGVkIGJ5IGRhdmlkCisJcHJpdi0+aWVlZTgwMjExLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyA9IEdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnODE5MjsKKwlwcml2LT5pZWVlODAyMTEtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIgPSBHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHM4MTl4VXNiOworCXByaXYtPmllZWU4MDIxMS0+U2V0V2lyZWxlc3NNb2RlID0gcnRsODE5Ml9TZXRXaXJlbGVzc01vZGU7CisJLy9hZGRlZCBieSBhbXkKKwlwcml2LT5pZWVlODAyMTEtPkluaXRpYWxHYWluSGFuZGxlciA9IEluaXRpYWxHYWluODE5eFVzYjsKKwlwcml2LT5jYXJkX3R5cGUgPSBVU0I7CisjaWZkZWYgVE9fRE9fTElTVAorCWlmKEFkYXB0ZXItPmJJbkhjdFRlc3QpCisJeworCQlwSGFsRGF0YS0+U2hvcnRSZXRyeUxpbWl0ID0gNzsKKwkJcEhhbERhdGEtPkxvbmdSZXRyeUxpbWl0ID0gNzsKKwl9CisjZW5kaWYKKwl7CisJCXByaXYtPlNob3J0UmV0cnlMaW1pdCA9IDB4MzA7CisJCXByaXYtPkxvbmdSZXRyeUxpbWl0ID0gMHgzMDsKKwl9CisJcHJpdi0+RWFybHlSeFRocmVzaG9sZCA9IDc7CisJcHJpdi0+ZW5hYmxlX2dwaW8wID0gMDsKKwlwcml2LT5UcmFuc21pdENvbmZpZyA9CisJLy8JVENSX0R1clByb2NNb2RlIHwJLy9mb3IgUlRMODE4NUIsIGR1cmF0aW9uIHNldHRpbmcgYnkgSFcKKwkvLz8JVENSX0RJU1JlcVFzaXplIHwKKwkJKFRDUl9NWERNQV8yMDQ4PDxUQ1JfTVhETUFfT0ZGU0VUKXwgIC8vIE1heCBETUEgQnVyc3QgU2l6ZSBwZXIgVHggRE1BIEJ1cnN0LCA3OiByZXNlcnZpZWQuCisJCShwcml2LT5TaG9ydFJldHJ5TGltaXQ8PFRDUl9TUkxfT0ZGU0VUKXwJLy8gU2hvcnQgcmV0cnkgbGltaXQKKwkJKHByaXYtPkxvbmdSZXRyeUxpbWl0PDxUQ1JfTFJMX09GRlNFVCkgfAkvLyBMb25nIHJldHJ5IGxpbWl0CisJCShmYWxzZSA/IFRDUl9TQVQ6IDApOwkvLyBGQUxTRTogSFcgcHJvdmllcyBQTENQIGxlbmd0aCBhbmQgTEVOR0VYVCwgVFVSRTogU1cgcHJvaXZlZHMgdGhlbQorI2lmZGVmIFRPX0RPX0xJU1QKKwlpZihBZGFwdGVyLT5iSW5IY3RUZXN0KQorCQlwSGFsRGF0YS0+UmVjZWl2ZUNvbmZpZwk9CXBIYWxEYXRhLT5DU01ldGhvZCB8CisJCQkJCQlSQ1JfQU1GIHwgUkNSX0FERiB8CS8vUkNSX0FBUCB8IAkvL2FjY2VwdCBtYW5hZ2VtZW50L2RhdGEKKwkJCQkJCS8vZ3VhbmdhbjIwMDcxMAorCQkJCQkJUkNSX0FDRiB8CS8vYWNjZXB0IGNvbnRyb2wgZnJhbWUgZm9yIFNXIEFQIG5lZWRzIFBTLXBvbGwsIDIwMDUuMDcuMDcsIGJ5IHJjbmprby4KKwkJCQkJCVJDUl9BQiB8IFJDUl9BTSB8IFJDUl9BUE0gfAkJLy9hY2NlcHQgQkMvTUMvVUMKKwkJCQkJCVJDUl9BSUNWIHwgUkNSX0FDUkMzMiB8IAkJLy9hY2NlcHQgSUNWL0NSQyBlcnJvciBwYWNrZXQKKwkJCQkJCSgodTMyKTc8PFJDUl9NWERNQV9PRkZTRVQpIHwgLy8gTWF4IERNQSBCdXJzdCBTaXplIHBlciBSeCBETUEgQnVyc3QsIDc6IHVubGltaXRlZC4KKwkJCQkJCShwSGFsRGF0YS0+RWFybHlSeFRocmVzaG9sZDw8UkNSX0ZJRk9fT0ZGU0VUKSB8IC8vIFJ4IEZJRk8gVGhyZXNob2xkLCA3OiBObyBSeCB0aHJlc2hvbGQuCisJCQkJCQkocEhhbERhdGEtPkVhcmx5UnhUaHJlc2hvbGQgPT0gNyA/IFJDUl9Pbmx5RXJsUGt0OjApOworCWVsc2UKKworI2VuZGlmCisJcHJpdi0+UmVjZWl2ZUNvbmZpZwk9CisJCVJDUl9BTUYgfCBSQ1JfQURGIHwJCS8vYWNjZXB0IG1hbmFnZW1lbnQvZGF0YQorCQlSQ1JfQUNGIHwJCQkvL2FjY2VwdCBjb250cm9sIGZyYW1lIGZvciBTVyBBUCBuZWVkcyBQUy1wb2xsLCAyMDA1LjA3LjA3LCBieSByY25qa28uCisJCVJDUl9BQiB8IFJDUl9BTSB8IFJDUl9BUE0gfAkvL2FjY2VwdCBCQy9NQy9VQworCQkvL1JDUl9BSUNWIHwgUkNSX0FDUkMzMiB8IAkvL2FjY2VwdCBJQ1YvQ1JDIGVycm9yIHBhY2tldAorCQkoKHUzMik3PDxSQ1JfTVhETUFfT0ZGU0VUKXwgLy8gTWF4IERNQSBCdXJzdCBTaXplIHBlciBSeCBETUEgQnVyc3QsIDc6IHVubGltaXRlZC4KKwkJKHByaXYtPkVhcmx5UnhUaHJlc2hvbGQ8PFJYX0ZJRk9fVEhSRVNIT0xEX1NISUZUKSB8IC8vIFJ4IEZJRk8gVGhyZXNob2xkLCA3OiBObyBSeCB0aHJlc2hvbGQuCisJCShwcml2LT5FYXJseVJ4VGhyZXNob2xkID09IDcgPyBSQ1JfT05MWUVSTFBLVDowKTsKKworCXByaXYtPkFjbUNvbnRyb2wgPSAwOworCXByaXYtPnBGaXJtd2FyZSA9IChydF9maXJtd2FyZSopa21hbGxvYyhzaXplb2YocnRfZmlybXdhcmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+cEZpcm13YXJlKQorCW1lbXNldChwcml2LT5wRmlybXdhcmUsIDAsIHNpemVvZihydF9maXJtd2FyZSkpOworCisJLyogcnggcmVsYXRlZCBxdWV1ZSAqLworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnJ4X3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5za2JfcXVldWUpOworCisJLyogVHggcmVsYXRlZCBxdWV1ZSAqLworCWZvcihpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFEgW2ldKTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgeworCQlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5pZWVlODAyMTEtPnNrYl9hZ2dRIFtpXSk7CisJfQorCWZvcihpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+aWVlZTgwMjExLT5za2JfZHJ2X2FnZ1EgW2ldKTsKKwl9CisJcHJpdi0+cmZfc2V0X2NoYW4gPSBydGw4MTkyX3BoeV9Td0Nobmw7Cit9CisKKy8vaW5pdCBsb2NrIGhlcmUKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X2xvY2soc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCit7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5pcnFfbG9jayk7Ly9hZGRlZCBieSB0aG9tYXMKKwkvL3NwaW5fbG9ja19pbml0KCZwcml2LT5yZl9sb2NrKTsKKwlzZW1hX2luaXQoJnByaXYtPnd4X3NlbSwxKTsKKwlzZW1hX2luaXQoJnByaXYtPnJmX3NlbSwxKTsKKwltdXRleF9pbml0KCZwcml2LT5tdXRleCk7Cit9CisKK2V4dGVybiAgdm9pZCAgICBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwordm9pZCBydGw4MTkyX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKKy8vaW5pdCB0YXNrbGV0IGFuZCB3YWl0X3F1ZXVlIGhlcmUuIG9ubHkgMi42IGFib3ZlIGtlcm5lbCBpcyBjb25zaWRlcmVkCisjZGVmaW5lIERSVl9OQU1FICJ3bGFuMCIKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKyNpZmRlZiBQRl9TWU5DVEhSRUFECisJcHJpdi0+cHJpdl93cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUsMCk7CisjZWxzZQorCXByaXYtPnByaXZfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKKyNlbmRpZgorCisJSU5JVF9XT1JLKCZwcml2LT5yZXNldF93cSwgcnRsODE5Ml9yZXN0YXJ0KTsKKworCS8vSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPndhdGNoX2RvZ193cSwgaGFsX2RtX3dhdGNoZG9nKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+d2F0Y2hfZG9nX3dxLCBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT50eHBvd2VyX3RyYWNraW5nX3dxLCAgZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKTsKKy8vCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5ncGlvX2NoYW5nZV9yZl93cSwgIGRtX2dwaW9fY2hhbmdlX3JmX2NhbGxiYWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+cmZwYXRoX2NoZWNrX3dxLCAgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT51cGRhdGVfYmVhY29uX3dxLCBydGw4MTkyX3VwZGF0ZV9iZWFjb24pOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5pbml0aWFsZ2Fpbl9vcGVyYXRlX3dxLCBJbml0aWFsR2Fpbk9wZXJhdGVXb3JrSXRlbUNhbGxCYWNrKTsKKwkvL0lOSVRfV09SSygmcHJpdi0+U3dDaG5sV29ya0l0ZW0sICBydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbSk7CisJLy9JTklUX1dPUksoJnByaXYtPlNldEJXTW9kZVdvcmtJdGVtLCAgcnRsODE5Ml9TZXRCV01vZGVXb3JrSXRlbSk7CisJSU5JVF9XT1JLKCZwcml2LT5xb3NfYWN0aXZhdGUsIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKTsKKworCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQsCisJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSlydGw4MTkyX2lycV9yeF90YXNrbGV0LAorCSAgICAgKHVuc2lnbmVkIGxvbmcpcHJpdik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfZ2V0X2VlcHJvbV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdTE2IGN1ckNSID0gMDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIj09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJY3VyQ1IgPSByZWFkX25pY193b3JkX0UoZGV2LEVQUk9NX0NNRCk7CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgInJlYWQgZnJvbSBSZWcgRVBST01fQ01EKCV4KToleFxuIiwgRVBST01fQ01ELCBjdXJDUik7CisJLy93aGV0aGVyIG5lZWQgSSBjb25zaWRlciBCSVQ1PworCXByaXYtPmVwcm9tdHlwZSA9IChjdXJDUiAmIENtZDkzNDZDUl85MzU2U0VMKSA/IEVQUk9NXzkzYzU2IDogRVBST01fOTNjNDY7CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIjw9PT09PT09PT09PSVzKCksIGVwcm9tdHlwZTolZFxuIiwgX19GVU5DVElPTl9fLCBwcml2LT5lcHJvbXR5cGUpOworfQorCisvL3VzZWQgdG8gc3dhcCBlbmRpYW4uIGFzIG50b2hsICYgaHRvbmwgYXJlIG5vdCBuZWNjZXNzYXJ5IHRvIHN3YXAgZW5kaWFuLCBzbyB1c2UgdGhpcyBpbnN0ZWFkLgorc3RhdGljIGlubGluZSB1MTYgZW5kaWFuX3N3YXAodTE2KiBkYXRhKQoreworCXUxNiB0bXAgPSAqZGF0YTsKKwkqZGF0YSA9ICh0bXAgPj4gOCkgfCAodG1wIDw8IDgpOworCXJldHVybiAqZGF0YTsKK30KK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcmVhZF9lZXByb21faW5mbyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXUxNiB3RVBST01fSUQgPSAwOworCXU4IGJNYWNfVG1wX0FkZHJbNl0gPSB7MHgwMCwgMHhlMCwgMHg0YywgMHgwMCwgMHgwMCwgMHgwMn07CisJdTggYkxvYWRfRnJvbV9FRVBPTSA9IGZhbHNlOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgdG1wVmFsdWUgPSAwOworCVJUX1RSQUNFKENPTVBfRVBST00sICI9PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXdFUFJPTV9JRCA9IGVwcm9tX3JlYWQoZGV2LCAwKTsgLy9maXJzdCByZWFkIEVFUFJPTSBJRCBvdXQ7CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIkVFUFJPTSBJRCBpcyAweCV4XG4iLCB3RVBST01fSUQpOworCisJaWYgKHdFUFJPTV9JRCAhPSBSVEw4MTkwX0VFUFJPTV9JRCkKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiRUVQUk9NIElEIGlzIGludmFsaWQoaXMgMHgleChzaG91bGQgYmUgMHgleClcbiIsIHdFUFJPTV9JRCwgUlRMODE5MF9FRVBST01fSUQpOworCX0KKwllbHNlCisJCWJMb2FkX0Zyb21fRUVQT00gPSB0cnVlOworCisJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJeworCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1ZJRD4+MSkpOworCQlwcml2LT5lZXByb21fdmlkID0gZW5kaWFuX3N3YXAoJnRtcFZhbHVlKTsKKwkJcHJpdi0+ZWVwcm9tX3BpZCA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1BJRD4+MSkpOworCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX0NoYW5uZWxQbGFuPj4xKSk7CisJCXByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiA9KCh0bXBWYWx1ZSYweGZmMDApPj44KTsKKwkJcHJpdi0+YnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNID0gdHJ1ZTsKKwkJcHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9DdXN0b21lcl9JRD4+MSkpID4+ODsKKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+ZWVwcm9tX3ZpZCA9IDA7CisJCXByaXYtPmVlcHJvbV9waWQgPSAwOworCQlwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9IFZFUlNJT05fODE5eFVfQjsKKwkJcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuID0gMDsKKwkJcHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQgPSAwOworCX0KKwlSVF9UUkFDRShDT01QX0VQUk9NLCAidmlkOjB4JTR4LCBwaWQ6MHglNHgsIEN1c3RvbUlEOjB4JTJ4LCBDaGFuUGxhbjoweCV4XG4iLCBwcml2LT5lZXByb21fdmlkLCBwcml2LT5lZXByb21fcGlkLCBwcml2LT5lZXByb21fQ3VzdG9tZXJJRCwgcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuKTsKKwkvL3NldCBjaGFubmVscGxhbiBmcm9tIGVlcHJvbQorCXByaXYtPkNoYW5uZWxQbGFuID0gcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuOworCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCXsKKwkJaW50IGk7CisJCWZvciAoaT0wOyBpPDY7IGkrPTIpCisJCXsKKwkJCXUxNiB0bXAgPSAwOworCQkJdG1wID0gZXByb21fcmVhZChkZXYsICh1MTYpKChFRVBST01fTk9ERV9BRERSRVNTX0JZVEVfMCArIGkpPj4xKSk7CisJCQkqKHUxNiopKCZkZXYtPmRldl9hZGRyW2ldKSA9IHRtcDsKKwkJfQorCX0KKwllbHNlCisJeworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYk1hY19UbXBfQWRkciwgNik7CisJCS8vc2hvdWxkIEkgc2V0IElEUjAgaGVyZT8KKwl9CisJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIk1BQyBhZGRyOiJNQUNfRk1UIlxuIiwgTUFDX0FSRyhkZXYtPmRldl9hZGRyKSk7CisJcHJpdi0+cmZfdHlwZSA9IFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFOyAvL2RlZmF1bHQgMVQyUgorCXByaXYtPnJmX2NoaXAgPSBSRl84MjU2OworCisJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09ICh1OClWRVJTSU9OXzgxOXhVX0EpCisJeworCQkvL3JlYWQgVHggcG93ZXIgZ2FpbiBvZmZzZXQgb2YgbGVnYWN5IE9GRE0gdG8gSFQgcmF0ZQorCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXByaXYtPkVFUFJPTVR4UG93ZXJEaWZmID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UG93ZXJEaWZmPj4xKSkmMHhmZjAwKSA+PiA4OworCQllbHNlCisJCQlwcml2LT5FRVBST01UeFBvd2VyRGlmZiA9IEVFUFJPTV9EZWZhdWx0X1R4UG93ZXI7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJUeFBvd2VyRGlmZjolZFxuIiwgcHJpdi0+RUVQUk9NVHhQb3dlckRpZmYpOworCQkvL3JlYWQgVGhlcm1hbE1ldGVyIGZyb20gRUVQUk9NCisJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyID0gKHU4KShlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UaGVybWFsTWV0ZXI+PjEpKSYweDAwZmYpOworCQllbHNlCisJCQlwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgPSBFRVBST01fRGVmYXVsdF9UaGVybWFsTWV0ZXI7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJUaGVybWFsTWV0ZXI6JWRcbiIsIHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlcik7CisJCS8vdml2aSwgZm9yIHR4IHBvd2VyIHRyYWNrCisJCXByaXYtPlRTU0lfMTNkQm0gPSBwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgKjEwMDsKKwkJLy9yZWFkIGFudGVubmEgdHggcG93ZXIgb2Zmc2V0IG9mIEIvQy9EIHRvIEEgZnJvbSBFRVBST00KKwkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQlwcml2LT5FRVBST01Qd0RpZmYgPSAoZXByb21fcmVhZChkZXYsIChFRVBST01fUHdEaWZmPj4xKSkmMHgwZjAwKT4+ODsKKwkJZWxzZQorCQkJcHJpdi0+RUVQUk9NUHdEaWZmID0gRUVQUk9NX0RlZmF1bHRfUHdEaWZmOworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiVHhQd0RpZmY6JWRcbiIsIHByaXYtPkVFUFJPTVB3RGlmZik7CisJCS8vIFJlYWQgQ3J5c3RhbENhcCBmcm9tIEVFUFJPTQorCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXByaXYtPkVFUFJPTUNyeXN0YWxDYXAgPSAoZXByb21fcmVhZChkZXYsIChFRVBST01fQ3J5c3RhbENhcD4+MSkpJjB4MGYpOworCQllbHNlCisJCQlwcml2LT5FRVBST01DcnlzdGFsQ2FwID0gRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcDsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIkNyeXN0YWxDYXAgPSAlZFxuIiwgcHJpdi0+RUVQUk9NQ3J5c3RhbENhcCk7CisJCS8vZ2V0IHBlci1jaGFubmVsIFR4IHBvd2VyIGxldmVsCisJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJcHJpdi0+RUVQUk9NX0RlZl9WZXIgPSAoZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X1Zlcj4+MSkpJjB4ZmYwMCk+Pjg7CisJCWVsc2UKKwkJCXByaXYtPkVFUFJPTV9EZWZfVmVyID0gMTsKKwkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIkVFUFJPTV9ERUZfVkVSOiVkXG4iLCBwcml2LT5FRVBST01fRGVmX1Zlcik7CisJCWlmIChwcml2LT5FRVBST01fRGVmX1ZlciA9PSAwKSAvL29sZCBlZXByb20gZGVmaW5pdGlvbgorCQl7CisJCQlpbnQgaTsKKwkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDSyA9IChlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFB3SW5kZXhfQ0NLPj4xKSkmMHhmZikgPj4gODsKKwkJCWVsc2UKKwkJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0sgPSAweDEwOworCQkJUlRfVFJBQ0UoQ09NUF9FUFJPTSwgIkNDSyBUeCBQb3dlciBMZXZsOiAweCUwMnhcbiIsIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDSyk7CisJCQlmb3IgKGk9MDsgaTwzOyBpKyspCisJCQl7CisJCQkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQkJeworCQkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0RytpKT4+MSk7CisJCQkJCWlmICgoKEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcraSkgJSAyKSA9PSAwKQorCQkJCQkJdG1wVmFsdWUgPSB0bXBWYWx1ZSAmIDB4MDBmZjsKKwkJCQkJZWxzZQorCQkJCQkJdG1wVmFsdWUgPSAodG1wVmFsdWUgJiAweGZmMDApID4+IDg7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJdG1wVmFsdWUgPSAweDEwOworCQkJCXByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbaV0gPSAodTgpIHRtcFZhbHVlOworCQkJCVJUX1RSQUNFKENPTVBfRVBST00sICJPRkRNIDIuNEcgVHggUG93ZXIgTGV2ZWwsIEluZGV4ICVkID0gMHglMDJ4XG4iLCBpLCBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0spOworCQkJfQorCQl9Ly9lbmQgaWYgRUVQUk9NX0RFRl9WRVIgPT0gMAorCQllbHNlIGlmIChwcml2LT5FRVBST01fRGVmX1ZlciA9PSAxKQorCQl7CisJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkKKwkJCXsKKwkJCQl0bXBWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjE+PjEpKTsKKwkJCQl0bXBWYWx1ZSA9ICh0bXBWYWx1ZSAmIDB4ZmYwMCkgPj4gODsKKwkJCX0KKwkJCWVsc2UKKwkJCQl0bXBWYWx1ZSA9IDB4MTA7CisJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tfVjFbMF0gPSAodTgpdG1wVmFsdWU7CisKKwkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X0NDS19WMSArIDIpPj4xKTsKKwkJCWVsc2UKKwkJCQl0bXBWYWx1ZSA9IDB4MTAxMDsKKwkJCSooKHUxNiopKCZwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tfVjFbMV0pKSA9IHRtcFZhbHVlOworCQkJaWYgKGJMb2FkX0Zyb21fRUVQT00pCisJCQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEdfVjE+PjEpKTsKKwkJCWVsc2UKKwkJCQl0bXBWYWx1ZSA9IDB4MTAxMDsKKwkJCSooKHUxNiopKCZwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzBdKSkgPSB0bXBWYWx1ZTsKKwkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQorCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X09GRE1fMjRHX1YxKzIpPj4xKTsKKwkJCWVsc2UKKwkJCQl0bXBWYWx1ZSA9IDB4MTA7CisJCQlwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzJdID0gKHU4KXRtcFZhbHVlOworCQl9Ly9lbmRpZiBFRVBST01fRGVmX1ZlciA9PSAxCisKKwkJLy91cGRhdGUgSEFMIHZhcmlhYmxlcworCQkvLworCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaT0wOyBpPDE0OyBpKyspCisJCQl7CisJCQkJaWYgKGk8PTMpCisJCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzBdOworCQkJCWVsc2UgaWYgKGk+PTQgJiYgaTw9OSkKKwkJCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMV07CisJCQkJZWxzZQorCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1syXTsKKwkJCX0KKworCQkJZm9yIChpPTA7IGk8MTQ7IGkrKykKKwkJCXsKKwkJCQlpZiAocHJpdi0+RUVQUk9NX0RlZl9WZXIgPT0gMCkKKwkJCQl7CisJCQkJCWlmIChpPD0zKQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1swXSArIChwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0sgLSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzFdKTsKKwkJCQkJZWxzZSBpZiAoaT49NCAmJiBpPD05KQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLOworCQkJCQllbHNlCisJCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHWzJdICsgKHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDSyAtIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMV0pOworCQkJCX0KKwkJCQllbHNlIGlmIChwcml2LT5FRVBST01fRGVmX1ZlciA9PSAxKQorCQkJCXsKKwkJCQkJaWYgKGk8PTMpCisJCQkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tfVjFbMF07CisJCQkJCWVsc2UgaWYgKGk+PTQgJiYgaTw9OSkKKwkJCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS1tpXSA9IHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS19WMVsxXTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzJdOworCQkJCX0KKwkJCX0KKwkJfS8vZW5kIHVwZGF0ZSBIQUwgdmFyaWFibGVzCisJCXByaXYtPlR4UG93ZXJEaWZmID0gcHJpdi0+RUVQUk9NUHdEaWZmOworLy8gQW50ZW5uYSBCIGdhaW4gb2Zmc2V0IHRvIGFudGVubmEgQSwgYml0MH4zCisJCXByaXYtPkFudGVubmFUeFB3RGlmZlswXSA9IChwcml2LT5FRVBST01UeFBvd2VyRGlmZiAmIDB4Zik7CisJCS8vIEFudGVubmEgQyBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDR+NworCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV0gPSAoKHByaXYtPkVFUFJPTVR4UG93ZXJEaWZmICYgMHhmMCk+PjQpOworCQkvLyBDcnlzdGFsQ2FwLCBiaXQxMn4xNQorCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKKwkJLy8gVGhlcm1hbE1ldGVyLCBiaXQwfjMgZm9yIFJGSUMxLCBiaXQ0fjcgZm9yIFJGSUMyCisJCS8vIDkyVSBkb2VzIG5vdCBlbmFibGUgVFggcG93ZXIgdHJhY2tpbmcuCisJCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlcjsKKwl9Ly9lbmQgaWYgVmVyc2lvbklEID09IFZFUlNJT05fODE5eFVfQQorCisvL2FkZGVkIGJ5IHZpdmksIGZvciBkbGluayBsZWQsIDIwMDgwNDE2CisJc3dpdGNoKHByaXYtPmVlcHJvbV9DdXN0b21lcklEKQorCXsKKwkJY2FzZSBFRVBST01fQ0lEX1JVTlRPUDoKKwkJCXByaXYtPkN1c3RvbWVySUQgPSBSVF9DSURfODE5eF9SVU5UT1A7CisJCQlicmVhazsKKworCQljYXNlIEVFUFJPTV9DSURfRExJTks6CisJCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX0RMSU5LOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaXYtPkN1c3RvbWVySUQgPSBSVF9DSURfREVGQVVMVDsKKwkJCWJyZWFrOworCisJfQorCisJc3dpdGNoKHByaXYtPkN1c3RvbWVySUQpCisJeworCQljYXNlIFJUX0NJRF84MTl4X1JVTlRPUDoKKwkJCXByaXYtPkxlZFN0cmF0ZWd5ID0gU1dfTEVEX01PREUyOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9DSURfRExJTks6CisJCQlwcml2LT5MZWRTdHJhdGVneSA9IFNXX0xFRF9NT0RFNDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcml2LT5MZWRTdHJhdGVneSA9IFNXX0xFRF9NT0RFMDsKKwkJCWJyZWFrOworCisJfQorCisKKwlpZihwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJeworCQlSVF9UUkFDRShDT01QX0VQUk9NLCAiXG4xVDJSIGNvbmZpZ1xuIik7CisJfQorCWVsc2UKKwl7CisJCVJUX1RSQUNFKENPTVBfRVBST00sICJcbjJUNFIgY29uZmlnXG4iKTsKKwl9CisKKwkvLyAyMDA4LzAxLzE2IE1IIFdlIGNhbiBvbmx5IGtub3cgUkYgdHlwZSBpbiB0aGUgZnVuY3Rpb24uIFNvIHdlIGhhdmUgdG8gaW5pdAorCS8vIERJRyBSQVRSIHRhYmxlIGFnYWluLgorCWluaXRfcmF0ZV9hZGFwdGl2ZShkZXYpOworCS8vd2UgbmVlZCBpbml0IERJRyBSQVRSIHRhYmxlIGhlcmUgYWdhaW4uCisKKwlSVF9UUkFDRShDT01QX0VQUk9NLCAiPD09PT09PT09PT09JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm47Cit9CisKK3Nob3J0IHJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNpZmRlZiBFTkFCTEVfRE9UMTFECisJaWYocHJpdi0+Q2hhbm5lbFBsYW4gPiBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTil7CisJCXByaW50aygicnRsODE4MF9pbml0OkVycm9yIGNoYW5uZWwgcGxhbiEgU2V0IHRvIGRlZmF1bHQuXG4iKTsKKwkJcHJpdi0+Q2hhbm5lbFBsYW49IDA7CisJfQorCVJUX1RSQUNFKENPTVBfSU5JVCwgIkNoYW5uZWwgcGxhbiBpcyAlZFxuIixwcml2LT5DaGFubmVsUGxhbik7CisKKwlydGw4MTl4X3NldF9jaGFubmVsX21hcChwcml2LT5DaGFubmVsUGxhbiwgcHJpdik7CisjZWxzZQorCWludCBjaCxpOworCS8vU2V0IERlZmF1bHQgQ2hhbm5lbCBQbGFuCisJaWYoIWNoYW5uZWxzKXsKKwkJRE1FU0coIk5vIGNoYW5uZWxzLCBhYm9ydGluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCWNoPWNoYW5uZWxzOworCXByaXYtPkNoYW5uZWxQbGFuPSAwOy8vaGlrYXJ1CisJIC8vIHNldCBjaGFubmVscyAxLi4xNCBhbGxvd2VkIGluIGdpdmVuIGxvY2FsZQorCWZvciAoaT0xOyBpPD0xNDsgaSsrKSB7CisJCShwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwKVtpXSA9ICh1OCkoY2ggJiAweDAxKTsKKwkJY2ggPj49IDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3Nob3J0IHJ0bDgxOTJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJbWVtc2V0KCYocHJpdi0+c3RhdHMpLDAsc2l6ZW9mKHN0cnVjdCBTdGF0cykpOworCW1lbXNldChwcml2LT50eHF1ZXVlX3RvX291dHBpcGVtYXAsMCw5KTsKKyNpZmRlZiBQSVBFMTIKKwl7CisJCWludCBpPTA7CisJCXU4IHF1ZXVldG9waXBlW109ezMsMiwxLDAsNCw4LDcsNiw1fTsKKwkJbWVtY3B5KHByaXYtPnR4cXVldWVfdG9fb3V0cGlwZW1hcCxxdWV1ZXRvcGlwZSw5KTsKKy8qCQlmb3IoaT0wO2k8OTtpKyspCisJCQlwcmludGsoIiVkICIscHJpdi0+dHhxdWV1ZV90b19vdXRwaXBlbWFwW2ldKTsKKwkJcHJpbnRrKCJcbiIpOyovCisJfQorI2Vsc2UKKwl7CisJCXU4IHF1ZXVldG9waXBlW109ezMsMiwxLDAsNCw0LDAsNCw0fTsKKwkJbWVtY3B5KHByaXYtPnR4cXVldWVfdG9fb3V0cGlwZW1hcCxxdWV1ZXRvcGlwZSw5KTsKKy8qCQlmb3IoaT0wO2k8OTtpKyspCisJCQlwcmludGsoIiVkICIscHJpdi0+dHhxdWV1ZV90b19vdXRwaXBlbWFwW2ldKTsKKwkJcHJpbnRrKCJcbiIpOyovCisJfQorI2VuZGlmCisJcnRsODE5Ml9pbml0X3ByaXZfdmFyaWFibGUoZGV2KTsKKwlydGw4MTkyX2luaXRfcHJpdl9sb2NrKHByaXYpOworCXJ0bDgxOTJfaW5pdF9wcml2X3Rhc2soZGV2KTsKKwlydGw4MTkyX2dldF9lZXByb21fc2l6ZShkZXYpOworCXJ0bDgxOTJfcmVhZF9lZXByb21faW5mbyhkZXYpOworCXJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKGRldik7CisJaW5pdF9oYWxfZG0oZGV2KTsKKwlpbml0X3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCXByaXYtPndhdGNoX2RvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXByaXYtPndhdGNoX2RvZ190aW1lci5mdW5jdGlvbiA9IHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjazsKKwlpZihydGw4MTkyX3VzYl9pbml0ZW5kcG9pbnRzKGRldikhPTApeworCQlETUVTRygiRW5kb3BvaW50cyBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLy9ydGw4MTkyX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKyNpZmRlZiBERUJVR19FUFJPTQorCWR1bXBfZXByb20oZGV2KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBhY3R1YWxseSBvbmx5IHNldCBSUlNSLCBSQVRSIGFuZCBCV19PUE1PREUgcmVnaXN0ZXJzCisgKgkgICAgIG5vdCB0byBkbyBhbGwgdGhlIGh3IGNvbmZpZyBhcyBpdHMgbmFtZSBzYXlzCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZTogIFRoaXMgcGFydCBuZWVkIHRvIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgcmF0ZSBzZXQgd2UgZmlsdGVyZWQKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfaHdjb25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1MzIgcmVnUkFUUiA9IDAsIHJlZ1JSU1IgPSAwOworCXU4IHJlZ0J3T3BNb2RlID0gMCwgcmVnVG1wID0gMDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKy8vIFNldCBSUlNSLCBSQVRSLCBhbmQgQldfT1BNT0RFIHJlZ2lzdGVycworCS8vCisJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+bW9kZSkKKwl7CisJY2FzZSBXSVJFTEVTU19NT0RFX0I6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLOworCQlyZWdSUlNSID0gUkFURV9BTExfQ0NLOworCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfQToKKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfNUcgfEJXX09QTU9ERV8yME1IWjsKKwkJcmVnUkFUUiA9IFJBVEVfQUxMX09GRE1fQUc7CisJCXJlZ1JSU1IgPSBSQVRFX0FMTF9PRkRNX0FHOworCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfRzoKKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCXJlZ1JBVFIgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHOworCQlyZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0FVVE86CisjaWZkZWYgVE9fRE9fTElTVAorCQlpZiAoQWRhcHRlci0+YkluSGN0VGVzdCkKKwkJeworCQkgICAgcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCSAgICByZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJICAgIHJlZ1JSU1IgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHOworCQl9CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCSAgICByZWdCd09wTW9kZSA9IEJXX09QTU9ERV8yME1IWjsKKwkJICAgIHJlZ1JBVFIgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfT0ZETV8xU1MgfCBSQVRFX0FMTF9PRkRNXzJTUzsKKwkJICAgIHJlZ1JSU1IgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHOworCQl9CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKKwkJLy8gSXQgc3VwcG9ydCBDQ0sgcmF0ZSBieSBkZWZhdWx0LgorCQkvLyBDQ0sgcmF0ZSB3aWxsIGJlIGZpbHRlcmVkIG91dCBvbmx5IHdoZW4gYXNzb2NpYXRlZCBBUCBkb2VzIG5vdCBzdXBwb3J0IGl0LgorCQlyZWdCd09wTW9kZSA9IEJXX09QTU9ERV8yME1IWjsKKwkJCXJlZ1JBVFIgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfT0ZETV8xU1MgfCBSQVRFX0FMTF9PRkRNXzJTUzsKKwkJCXJlZ1JSU1IgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHOworCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfTl81RzoKKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfNUc7CisJCXJlZ1JBVFIgPSBSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfT0ZETV8xU1MgfCBSQVRFX0FMTF9PRkRNXzJTUzsKKwkJcmVnUlJTUiA9IFJBVEVfQUxMX09GRE1fQUc7CisJCWJyZWFrOworCX0KKworCXdyaXRlX25pY19ieXRlKGRldiwgQldfT1BNT0RFLCByZWdCd09wTW9kZSk7CisJeworCQl1MzIgcmF0cl92YWx1ZSA9IDA7CisJCXJhdHJfdmFsdWUgPSByZWdSQVRSOworCQlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCQl7CisJCQlyYXRyX3ZhbHVlICY9IH4oUkFURV9BTExfT0ZETV8yU1MpOworCQl9CisJCXdyaXRlX25pY19kd29yZChkZXYsIFJBVFIwLCByYXRyX3ZhbHVlKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBVRldQLCAxKTsKKwl9CisJcmVnVG1wID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MzEzKTsKKwlyZWdSUlNSID0gKChyZWdUbXApIDw8IDI0KSB8IChyZWdSUlNSICYgMHgwMGZmZmZmZik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlJTUiwgcmVnUlJTUik7CisKKwkvLworCS8vIFNldCBSZXRyeSBMaW1pdCBoZXJlCisJLy8KKwl3cml0ZV9uaWNfd29yZChkZXYsIFJFVFJZX0xJTUlULAorCQkJcHJpdi0+U2hvcnRSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX1NIT1JUX1NISUZUIHwgXAorCQkJcHJpdi0+TG9uZ1JldHJ5TGltaXQgPDwgUkVUUllfTElNSVRfTE9OR19TSElGVCk7CisJLy8gU2V0IENvbnRlbnRpb24gV2luZG93IGhlcmUKKworCS8vIFNldCBUeCBBR0MKKworCS8vIFNldCBUeCBBbnRlbm5hIGluY2x1ZGluZyBGZWVkYmFjayBjb250cm9sCisKKwkvLyBTZXQgQXV0byBSYXRlIGZhbGxiYWNrIGNvbnRyb2wKKworCit9CisKKworLy9Jbml0aWFsaXplQWRhcHRlciBhbmQgUGh5Q2ZnCitib29sIHJ0bDgxOTJfYWRhcHRlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgZHdSZWdSZWFkID0gMDsKKwlib29sIGluaXRfc3RhdHVzID0gdHJ1ZTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X1NXXzN3aXJlOworCS8vZm9yIEFTSUMgcG93ZXIgb24gc2VxdWVuY2UKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZiwgMHg4MCk7CisJbWRlbGF5KDUwKTsKKwl3cml0ZV9uaWNfYnl0ZV9FKGRldiwgMHg1ZiwgMHhmMCk7CisJd3JpdGVfbmljX2J5dGVfRShkZXYsIDB4NWQsIDB4MDApOworCXdyaXRlX25pY19ieXRlX0UoZGV2LCAweDVlLCAweDgwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MTcsIDB4MzcpOworCW1kZWxheSgxMCk7CisvLyNpZmRlZiBUT19ET19MSVNUCisJcHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMF9JTklUOworCS8vY29uZmlnIENQVVJlc2V0IFJlZ2lzdGVyCisJLy9GaXJtd2FyZSBSZXNldCBvciBub3Q/CisJZHdSZWdSZWFkID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKwlpZiAocHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzBfSU5JVCkKKwkJZHdSZWdSZWFkIHw9IENQVV9HRU5fU1lTVEVNX1JFU0VUOyAvL2RvIG5vdGhpbmcgaGVyZT8KKwllbHNlIGlmIChwcml2LT5wRmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfNV9SRUFEWSkKKwkJZHdSZWdSZWFkIHw9IENQVV9HRU5fRklSTVdBUkVfUkVTRVQ7CisJZWxzZQorCQlSVF9UUkFDRShDT01QX0VSUiwgIkVSUk9SIGluICVzKCk6IHVuZGVmaW5lZCBmaXJtd2FyZSBzdGF0ZSglZClcbiIsIF9fRlVOQ1RJT05fXywgICBwcml2LT5wRmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCBkd1JlZ1JlYWQpOworCS8vbWRlbGF5KDMwKTsKKwkvL2NvbmZpZyBCQi4KKwlydGw4MTkyX0JCQ29uZmlnKGRldik7CisKKwkvL0xvb3BiYWNrIG1vZGUgb3Igbm90CisJcHJpdi0+TG9vcGJhY2tNb2RlID0gUlRMODE5eFVfTk9fTE9PUEJBQ0s7CisvLwlwcml2LT5Mb29wYmFja01vZGUgPSBSVEw4MTl4VV9NQUNfTE9PUEJBQ0s7CisKKwlkd1JlZ1JlYWQgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCWlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5eFVfTk9fTE9PUEJBQ0spCisJCWR3UmVnUmVhZCA9ICgoZHdSZWdSZWFkICYgQ1BVX0dFTl9OT19MT09QQkFDS19NU0spIHwgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQpOworCWVsc2UgaWYgKHByaXYtPkxvb3BiYWNrTW9kZSA9PSBSVEw4MTl4VV9NQUNfTE9PUEJBQ0spCisJCWR3UmVnUmVhZCB8PSBDUFVfQ0NLX0xPT1BCQUNLOworCWVsc2UKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXJpb3VzIGVycm9yIGluICVzKCk6IHdyb25nIGxvb3BiYWNrIG1vZGUgc2V0dGluZyglZClcbiIsIF9fRlVOQ1RJT05fXywgIHByaXYtPkxvb3BiYWNrTW9kZSk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCBkd1JlZ1JlYWQpOworCisJLy9hZnRlciByZXNldCBjcHUsIHdlIG5lZWQgd2FpdCBmb3IgYSBzZWNvbmRzIHRvIHdyaXRlIGluIHJlZ2lzdGVyLgorCXVkZWxheSg1MDApOworCisJLy94aW9uZyBhZGQgZm9yIG5ldyBiaXRmaWxlOnVzYiBzdXNwZW5kIHJlc2V0IHBpbiBzZXQgdG8gMS4gLy9kbyB3ZSBuZWVkPworCXdyaXRlX25pY19ieXRlX0UoZGV2LCAweDVmLCAocmVhZF9uaWNfYnl0ZV9FKGRldiwgMHg1Zil8MHgyMCkpOworCisJLy9TZXQgSGFyZHdhcmUKKwlydGw4MTkyX2h3Y29uZmlnKGRldik7CisKKwkvL3R1cm4gb24gVHgvUngKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIENNRFIsIENSX1JFfENSX1RFKTsKKworCS8vc2V0IElEUjAgaGVyZQorCXdyaXRlX25pY19kd29yZChkZXYsIE1BQzAsICgodTMyKilkZXYtPmRldl9hZGRyKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBNQUM0LCAoKHUxNiopKGRldi0+ZGV2X2FkZHIgKyA0KSlbMF0pOworCisJLy9zZXQgUkNSCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUkNSLCBwcml2LT5SZWNlaXZlQ29uZmlnKTsKKworCS8vSW5pdGlhbGl6ZSBOdW1iZXIgb2YgUmVzZXJ2ZWQgUGFnZXMgaW4gRmlybXdhcmUgUXVldWUKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUVBOMSwgIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9CS19TSElGVCB8XAorCQkJCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUgPDwgUlNWRF9GV19RVUVVRV9QQUdFX0JFX1NISUZUIHwgXAorCQkJCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVkkgPDwgUlNWRF9GV19RVUVVRV9QQUdFX1ZJX1NISUZUIHwgXAorCQkJCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8gPDxSU1ZEX0ZXX1FVRVVFX1BBR0VfVk9fU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJRUE4yLCBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9NR05UX1NISUZUIHxcCisJCQkJCQlOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQgPDwgUlNWRF9GV19RVUVVRV9QQUdFX0NNRF9TSElGVCk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlFQTjMsIEFQUExJRURfUkVTRVJWRURfUVVFVUVfSU5fRld8IFwKKwkJCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTjw8UlNWRF9GV19RVUVVRV9QQUdFX0JDTl9TSElGVAorLy8JCQkJCQl8IE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQjw8UlNWRF9GV19RVUVVRV9QQUdFX1BVQl9TSElGVAorCQkJCQkJKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCs0KjcsIChSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfQ0NLKSk7CisKKwkvL1NldCBBY2tUaW1lb3V0CisJLy8gVE9ETzogKGl0IHZhbHVlIGlzIG9ubHkgZm9yIEZQR0EgdmVyc2lvbikuIG5lZWQgdG8gYmUgY2hhbmdlZCEhMjAwNi4xMi4xOCwgYnkgRW1pbHkKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEFDS19USU1FT1VULCAweDMwKTsKKworLy8JUlRfVFJBQ0UoQ09NUF9JTklULCAiJXMoKTpwcml2LT5SZXNldFByb2dyZXNzIGlzICVkXG4iLCBfX0ZVTkNUSU9OX18scHJpdi0+UmVzZXRQcm9ncmVzcyk7CisJaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCisJcnRsODE5Ml9TZXRXaXJlbGVzc01vZGUoZGV2LCBwcml2LT5pZWVlODAyMTEtPm1vZGUpOworCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKXsKKwlDYW1SZXNldEFsbEVudHJ5KGRldik7CisJeworCQl1OCBTRUNSX3ZhbHVlID0gMHgwOworCQlTRUNSX3ZhbHVlIHw9IFNDUl9UeEVuY0VuYWJsZTsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfUnhEZWNFbmFibGU7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX05vU0tNQzsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTRUNSLCBTRUNSX3ZhbHVlKTsKKwl9CisJfQorCisJLy9CZWFjb24gcmVsYXRlZAorCXdyaXRlX25pY193b3JkKGRldiwgQVRJTVdORCwgMik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fSU5URVJWQUwsIDEwMCk7CisKKwl7CisjZGVmaW5lIERFRkFVTFRfRURDQSAweDAwNWU0MzMyCisJCWludCBpOworCQlmb3IgKGk9MDsgaTxRT1NfUVVFVUVfTlVNOyBpKyspCisJCXdyaXRlX25pY19kd29yZChkZXYsIFdEQ0FQQVJBX0FERFtpXSwgREVGQVVMVF9FRENBKTsKKwl9CisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwkvLzMgRm9yIHVzYiByeCBmaXJtd2FyZSBhZ2dyZWdhdGlvbiBjb250cm9sCisJaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCisJeworCQl1MzIgdWxWYWx1ZTsKKwkJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOworCQl1bFZhbHVlID0gKHBIVEluZm8tPlVzYlJ4RndBZ2dyRW48PDI0KSB8IChwSFRJbmZvLT5Vc2JSeEZ3QWdnclBhZ2VOdW08PDE2KSB8CisJCQkJCShwSFRJbmZvLT5Vc2JSeEZ3QWdnclBhY2tldE51bTw8OCkgfCAocEhUSW5mby0+VXNiUnhGd0FnZ3JUaW1lb3V0KTsKKwkJLyoKKwkJICogSWYgdXNiIHJ4IGZpcm13YXJlIGFnZ3JlZ2F0aW9uIGlzIGVuYWJsZWQsCisJCSAqIHdoZW4gYW55b25lIG9mIHRocmVlIHRocmVzaG9sZCBjb25kaXRpb25zIGFib3ZlIGlzIHJlYWNoZWQsCisJCSAqIGZpcm13YXJlIHdpbGwgc2VuZCBhZ2dyZWdhdGVkIHBhY2tldCB0byBkcml2ZXIuCisJCSAqLworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDFhOCwgdWxWYWx1ZSk7CisJCXByaXYtPmJDdXJyZW50UnhBZ2dyRW5hYmxlID0gdHJ1ZTsKKwl9CisjZW5kaWYKKworCXJ0bDgxOTJfcGh5X2NvbmZpZ21hYyhkZXYpOworCisJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09ICh1OCkgVkVSU0lPTl84MTl4VV9BKQorCXsKKwkJcnRsODE5Ml9waHlfZ2V0VHhQb3dlcihkZXYpOworCQlydGw4MTkyX3BoeV9zZXRUeFBvd2VyKGRldiwgcHJpdi0+Y2hhbik7CisJfQorCisJLy9GaXJtd2FyZSBkb3dubG9hZAorCWluaXRfc3RhdHVzID0gaW5pdF9maXJtd2FyZShkZXYpOworCWlmKCFpbml0X3N0YXR1cykKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCJFUlIhISEgJXMoKTogRmlybXdhcmUgZG93bmxvYWQgaXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gaW5pdF9zdGF0dXM7CisJfQorCVJUX1RSQUNFKENPTVBfSU5JVCwgIiVzKCk6YWZ0ZXIgZmlybXdhcmUgZG93bmxvYWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJLy8KKyNpZmRlZiBUT19ET19MSVNUCitpZihBZGFwdGVyLT5SZXNldFByb2dyZXNzID09IFJFU0VUX1RZUEVfTk9SRVNFVCkKKwl7CisJCWlmKHBNZ250SW5mby0+UmVnUmZPZmYgPT0gVFJVRSkKKwkJeyAvLyBVc2VyIGRpc2FibGUgUkYgdmlhIHJlZ2lzdHJ5LgorCQkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGKSwgREJHX0xPVUQsICgiSW5pdGlhbGl6ZUFkYXB0ZXI4MTl4VXNiKCk6IFR1cm4gb2ZmIFJGIGZvciBSZWdSZk9mZiAtLS0tLS0tLS0tXG4iKSk7CisJCQlNZ250QWN0U2V0X1JGX1N0YXRlKEFkYXB0ZXIsIGVSZk9mZiwgUkZfQ0hBTkdFX0JZX1NXKTsKKwkJCS8vIFRob3NlIGFjdGlvbiB3aWxsIGJlIGRpc2NhcmQgaW4gTWdudEFjdFNldF9SRl9TdGF0ZSBiZWNhdXNlIG9mZiB0aGUgc2FtZSBzdGF0ZQorCQkJZm9yKGVSRlBhdGggPSAwOyBlUkZQYXRoIDxwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykKKwkJCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIDB4NCwgMHhDMDAsIDB4MCk7CisJCX0KKwkJZWxzZSBpZihwTWdudEluZm8tPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX1BTKQorCQl7IC8vIEgvVyBvciBTL1cgUkYgT0ZGIGJlZm9yZSBzbGVlcC4KKwkJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRiksIERCR19MT1VELCAoIkluaXRpYWxpemVBZGFwdGVyODE5eFVzYigpOiBUdXJuIG9mZiBSRiBmb3IgUmZPZmZSZWFzb24oJWQpIC0tLS0tLS0tLS1cbiIsIHBNZ250SW5mby0+UmZPZmZSZWFzb24pKTsKKwkJCU1nbnRBY3RTZXRfUkZfU3RhdGUoQWRhcHRlciwgZVJmT2ZmLCBwTWdudEluZm8tPlJmT2ZmUmVhc29uKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBIYWxEYXRhLT5lUkZQb3dlclN0YXRlID0gZVJmT247CisJCQlwTWdudEluZm8tPlJmT2ZmUmVhc29uID0gMDsKKwkJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRiksIERCR19MT1VELCAoIkluaXRpYWxpemVBZGFwdGVyODE5eFVzYigpOiBSRiBpcyBvbiAtLS0tLS0tLS0tXG4iKSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYocEhhbERhdGEtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKQorCQl7CisJCQlNZ250QWN0U2V0X1JGX1N0YXRlKEFkYXB0ZXIsIGVSZk9mZiwgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbik7CisJCQkvLyBUaG9zZSBhY3Rpb24gd2lsbCBiZSBkaXNjYXJkIGluIE1nbnRBY3RTZXRfUkZfU3RhdGUgYmVjYXVzZSBvZmYgdGhlIHNhbWUgc3RhdGUKKwkJCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8cEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDQsIDB4QzAwLCAweDApOworCQl9CisJfQorI2VuZGlmCisJLy9jb25maWcgUkYuCisJaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpeworCXJ0bDgxOTJfcGh5X1JGQ29uZmlnKGRldik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiJXMoKTphZnRlciBwaHkgUkYgY29uZmlnXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKworCisJaWYocHJpdi0+aWVlZTgwMjExLT5Gd1JXUkYpCisJCS8vIFdlIGNhbiBmb3JjZSBmaXJtd2FyZSB0byBkbyBSRi1SL1cKKwkJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X0ZXOworCWVsc2UKKwkJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X1NXXzN3aXJlOworCisKKwlydGw4MTkyX3BoeV91cGRhdGVJbml0R2FpbihkZXYpOworCS8qLS1zZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPTiItLSovCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9SRk1PRCwgYkNDS0VuLCAweDEpOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJPRkRNRW4sIDB4MSk7CisKKwlpZihwcml2LT5SZXNldFByb2dyZXNzID09IFJFU0VUX1RZUEVfTk9SRVNFVCkKKwl7CisJCS8vaWYgRCBvciBDIGN1dAorCQl1OCB0bXB2YWx1ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDMwMSk7CisJCWlmKHRtcHZhbHVlID09MHgwMykKKwkJeworCQkJcHJpdi0+YkRjdXQgPSBUUlVFOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkQtY3V0XG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPmJEY3V0ID0gRkFMU0U7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQy1jdXRcbiIpOworCQl9CisJCWRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhkZXYpOworCisJCWlmKHByaXYtPmJEY3V0ID09IFRSVUUpCisJCXsKKwkJCXUzMiBpLCBUZW1wQ0NrOworCQkJdTMyIHRtcFJlZ0E9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsck9GRE0wX1hBVHhJUUltYmFsYW5jZSxiTWFza0RXb3JkKTsKKwkJLy8JdTMyIHRtcFJlZ0M9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsck9GRE0wX1hDVHhJUUltYmFsYW5jZSxiTWFza0RXb3JkKTsKKwkJCWZvcihpID0gMDsgaTxUeEJCR2FpblRhYmxlTGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYodG1wUmVnQSA9PSBwcml2LT50eGJiZ2Fpbl90YWJsZVtpXS50eGJiZ2Fpbl92YWx1ZSkKKwkJCQl7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleD0gKHU4KWk7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsPSAodTgpaTsKKwkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ19kZWZhdWx0PSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXg7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJVGVtcENDayA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tCeXRlMik7CisKKwkJCWZvcihpPTAgOyBpPENDS1R4QkJHYWluVGFibGVMZW5ndGggOyBpKyspCisJCQl7CisKKwkJCQlpZihUZW1wQ0NrID09IHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtpXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0pCisJCQkJeworCQkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdD0odTgpIGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl80ME1kZWZhdWx0PSAwOworCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U9IDA7CisJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPSBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKKworCS8vCQlwTWdudEluZm8tPmJUWFBvd2VyVHJhY2tpbmcgPSBGQUxTRTsvL1RFTVBMWSBESVNBQkxFCisJCX0KKwl9CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDg3LCAweDApOworCisKKwlyZXR1cm4gaW5pdF9zdGF0dXM7Cit9CisKKy8qIHRoaXMgY29uZmlndXJlcyByZWdpc3RlcnMgZm9yIGJlYWNvbiB0eCBhbmQgZW5hYmxlcyBpdCB2aWEKKyAqIHJ0bDgxOTJfYmVhY29uX3R4X2VuYWJsZSgpLiBydGw4MTkyX2JlYWNvbl90eF9kaXNhYmxlKCkgbWlnaHQKKyAqIGJlIHVzZWQgdG8gc3RvcCBiZWFjb24gdHJhbnNtaXNzaW9uCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTkVUIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE5Ml9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiAmcHJpdi0+aWVlZTgwMjExLT5zdGF0czsKK30KKworYm9vbAorSGFsVHhDaGVja1N0dWNrODE5eFVzYigKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisJKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgCQlSZWdUeENvdW50ZXIgPSByZWFkX25pY193b3JkKGRldiwgMHgxMjgpOworCWJvb2wJCWJTdHVjayA9IEZBTFNFOworCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6UmVnVHhDb3VudGVyIGlzICVkLFR4Q291bnRlciBpcyAlZFxuIixfX0ZVTkNUSU9OX18sUmVnVHhDb3VudGVyLHByaXYtPlR4Q291bnRlcik7CisJaWYocHJpdi0+VHhDb3VudGVyPT1SZWdUeENvdW50ZXIpCisJCWJTdHVjayA9IFRSVUU7CisKKwlwcml2LT5UeENvdW50ZXIgPSBSZWdUeENvdW50ZXI7CisKKwlyZXR1cm4gYlN0dWNrOworfQorCisvKgorKgk8QXNzdW1wdGlvbjogUlRfVFhfU1BJTkxPQ0sgaXMgYWNxdWlyZWQuPgorKglGaXJzdCBhZGRlZDogMjAwNi4xMS4xOSBieSBlbWlseQorKi8KK1JFU0VUX1RZUEUKK1R4Q2hlY2tTdHVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAkJCVF1ZXVlSUQ7CisvLwlQUlRfVENCCQkJcFRjYjsKKy8vCXU4CQkJUmVzZXRUaHJlc2hvbGQ7CisJYm9vbAkJCWJDaGVja0Z3VHhDbnQgPSBmYWxzZTsKKwkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvLworCS8vIERlY2lkZSBTdHVjaCB0aHJlc2hvbGQgYWNjb3JkaW5nIHRvIGN1cnJlbnQgcG93ZXIgc2F2ZSBtb2RlCisJLy8KKworLy8gICAgIFJUX1RSQUNFKENPTVBfUkVTRVQsICIgPT0+IFR4Q2hlY2tTdHVjaygpXG4iKTsKKy8vCSAgICAgUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworLy8JICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aWVlZTgwMjExLT5sb2NrLGZsYWdzKTsKKwkgICAgIGZvciAoUXVldWVJRCA9IDA7IFF1ZXVlSUQ8PUJFQUNPTl9RVUVVRTtRdWV1ZUlEICsrKQorCSAgICAgeworCSAgICAgCQlpZihRdWV1ZUlEID09IFRYQ01EX1FVRVVFKQorCQkgICAgICAgICBjb250aW51ZTsKKyNpZmRlZiBVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQorCQkJaWYoKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW1F1ZXVlSURdKSA9PSAwKSAmJiAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+aWVlZTgwMjExLT5za2JfYWdnUVtRdWV1ZUlEXSkgPT0gMCkgJiYgKHNrYl9xdWV1ZV9sZW4oJnByaXYtPmllZWU4MDIxMS0+c2tiX2Rydl9hZ2dRW1F1ZXVlSURdKSA9PSAwKSkKKyNlbHNlCisJCSAgICAgCWlmKChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVtRdWV1ZUlEXSkgPT0gMCkgICYmIChza2JfcXVldWVfbGVuKCZwcml2LT5pZWVlODAyMTEtPnNrYl9hZ2dRW1F1ZXVlSURdKSA9PSAwKSkKKyNlbmRpZgorCQkJIAljb250aW51ZTsKKworCSAgICAgICAgICAgICBiQ2hlY2tGd1R4Q250ID0gdHJ1ZTsKKwkgICAgIH0KKy8vCSAgICAgUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworLy8Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aWVlZTgwMjExLT5sb2NrLGZsYWdzKTsKKy8vCVJUX1RSQUNFKENPTVBfUkVTRVQsImJDaGVja0Z3VHhDbnQgaXMgJWRcbiIsYkNoZWNrRndUeENudCk7CisJaWYoYkNoZWNrRndUeENudCkKKwl7CisJCWlmKEhhbFR4Q2hlY2tTdHVjazgxOXhVc2IoZGV2KSkKKwkJeworCQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIlR4Q2hlY2tTdHVjaygpOiBGdyBpbmRpY2F0ZXMgbm8gVHggY29uZGl0aW9uISBcbiIpOworCQkJcmV0dXJuIFJFU0VUX1RZUEVfU0lMRU5UOworCQl9CisJfQorCXJldHVybiBSRVNFVF9UWVBFX05PUkVTRVQ7Cit9CisKK2Jvb2wKK0hhbFJ4Q2hlY2tTdHVjazgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MTYgCVJlZ1J4Q291bnRlciA9IHJlYWRfbmljX3dvcmQoZGV2LCAweDEzMCk7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWJvb2wgYlN0dWNrID0gRkFMU0U7CisJc3RhdGljIHU4CXJ4X2Noa19jbnQgPSAwOworCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6IFJlZ1J4Q291bnRlciBpcyAlZCxSeENvdW50ZXIgaXMgJWRcbiIsX19GVU5DVElPTl9fLFJlZ1J4Q291bnRlcixwcml2LT5SeENvdW50ZXIpOworCS8vIElmIHJzc2kgaXMgc21hbGwsIHdlIHNob3VsZCBjaGVjayByeCBmb3IgbG9uZyB0aW1lIGJlY2F1c2Ugb2YgYmFkIHJ4LgorCS8vIG9yIG1heWJlIGl0IHdpbGwgY29udGludW91cyBzaWxlbnQgcmVzZXQgZXZlcnkgMiBzZWNvbmRzLgorCXJ4X2Noa19jbnQrKzsKKwlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChSYXRlQWRhcHRpdmVUSF9IaWdoKzUpKQorCXsKKwkJcnhfY2hrX2NudCA9IDA7CS8vaGlnaCByc3NpLCBjaGVjayByeCBzdHVjayByaWdodCBub3cuCisJfQorCWVsc2UgaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IChSYXRlQWRhcHRpdmVUSF9IaWdoKzUpICYmCisJCSgocHJpdi0+Q3VycmVudENoYW5uZWxCVyE9SFRfQ0hBTk5FTF9XSURUSF8yMCYmcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYj49UmF0ZUFkYXB0aXZlVEhfTG93XzQwTSkgfHwKKwkJKHByaXYtPkN1cnJlbnRDaGFubmVsQlc9PUhUX0NIQU5ORUxfV0lEVEhfMjAmJnByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI+PVJhdGVBZGFwdGl2ZVRIX0xvd18yME0pKSApCisJeworCQlpZihyeF9jaGtfY250IDwgMikKKwkJeworCQkJcmV0dXJuIGJTdHVjazsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJ4X2Noa19jbnQgPSAwOworCQl9CisJfQorCWVsc2UgaWYoKChwcml2LT5DdXJyZW50Q2hhbm5lbEJXIT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPFJhdGVBZGFwdGl2ZVRIX0xvd180ME0pIHx8CisJCShwcml2LT5DdXJyZW50Q2hhbm5lbEJXPT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPFJhdGVBZGFwdGl2ZVRIX0xvd18yME0pKSAmJgorCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IFZlcnlMb3dSU1NJKQorCXsKKwkJaWYocnhfY2hrX2NudCA8IDQpCisJCXsKKwkJCS8vRGJnUHJpbnQoIlJTU0kgPCAlZCAmJiBSU1NJID49ICVkLCBubyBjaGVjayB0aGlzIHRpbWUgXG4iLCBSYXRlQWRhcHRpdmVUSF9Mb3csIFZlcnlMb3dSU1NJKTsKKwkJCXJldHVybiBiU3R1Y2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyeF9jaGtfY250ID0gMDsKKwkJCS8vRGJnUHJpbnQoIlJTU0kgPCAlZCAmJiBSU1NJID49ICVkLCBjaGVjayB0aGlzIHRpbWUgXG4iLCBSYXRlQWRhcHRpdmVUSF9Mb3csIFZlcnlMb3dSU1NJKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZihyeF9jaGtfY250IDwgOCkKKwkJeworCQkJLy9EYmdQcmludCgiUlNTSSA8PSAlZCwgbm8gY2hlY2sgdGhpcyB0aW1lIFxuIiwgVmVyeUxvd1JTU0kpOworCQkJcmV0dXJuIGJTdHVjazsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJ4X2Noa19jbnQgPSAwOworCQkJLy9EYmdQcmludCgiUlNTSSA8PSAlZCwgY2hlY2sgdGhpcyB0aW1lIFxuIiwgVmVyeUxvd1JTU0kpOworCQl9CisJfQorCisJaWYocHJpdi0+UnhDb3VudGVyPT1SZWdSeENvdW50ZXIpCisJCWJTdHVjayA9IFRSVUU7CisKKwlwcml2LT5SeENvdW50ZXIgPSBSZWdSeENvdW50ZXI7CisKKwlyZXR1cm4gYlN0dWNrOworfQorCitSRVNFVF9UWVBFCitSeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9pbnQgICAgICAgICAgICAgICAgICAgICBpOworCWJvb2wgICAgICAgIGJSeENoZWNrID0gRkFMU0U7CisKKy8vICAgICAgIFJUX1RSQUNFKENPTVBfUkVTRVQsIiA9PT4gUnhDaGVja1N0dWNrKClcbiIpOworCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOworCisJIGlmKHByaXYtPklycFBlbmRpbmdDb3VudCA+IDEpCisJCWJSeENoZWNrID0gVFJVRTsKKyAgICAgICAvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKKworLy8gICAgICAgUlRfVFJBQ0UoQ09NUF9SRVNFVCwiYlJ4Q2hlY2sgaXMgJWQgXG4iLGJSeENoZWNrKTsKKwlpZihiUnhDaGVjaykKKwl7CisJCWlmKEhhbFJ4Q2hlY2tTdHVjazgxOXhVc2IoZGV2KSkKKwkJeworCQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIlJ4U3R1Y2sgQ29uZGl0aW9uXG4iKTsKKwkJCXJldHVybiBSRVNFVF9UWVBFX1NJTEVOVDsKKwkJfQorCX0KKwlyZXR1cm4gUkVTRVRfVFlQRV9OT1JFU0VUOworfQorCisKKy8qKgorKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDaGVja2ZvcmhhbmcgdG8gY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgYXNrIE9TIHRvIHJlc2V0IGRyaXZlcgorKgorKglccGFyYW0gcEFkYXB0ZXIJVGhlIGFkYXB0ZXIgY29udGV4dCBmb3IgdGhpcyBtaW5pcG9ydAorKgorKglOb3RlOk5JQyB3aXRoIFVTQiBpbnRlcmZhY2Ugc2hvbHVkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB3ZSBjYW5ub3Qgc2NhbiBkZXNjcmlwdG9yCisqCXRvIGp1ZGdlIHdoZXRoZXIgdGhlcmUgaXMgdHggc3R1Y2suCisqCU5vdGU6IFRoaXMgZnVuY3Rpb24gbWF5IGJlIHJlcXVpcmVkIHRvIGJlIHJld3JpdGUgZm9yIFZpc3RhIE9TLgorKgk8PDxBc3N1bXB0aW9uOiBUeCBzcGlubG9jayBoYXMgYmVlbiBhY3F1aXJlZCA+Pj4KKyoKKyoJODE4NSBhbmQgODE4NWIgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uIFRoaXMgaXMgYWRkZWQgYnkgRW1pbHkgYXQgMjAwNi4xMS4yNAorKi8KK1JFU0VUX1RZUEUKK3J0bDgxOXhfaWZjaGVja19yZXNldG9ybm90KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCVJFU0VUX1RZUEUJVHhSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJUkVTRVRfVFlQRQlSeFJlc2V0VHlwZSA9IFJFU0VUX1RZUEVfTk9SRVNFVDsKKwlSVF9SRl9QT1dFUl9TVEFURSAJcmZTdGF0ZTsKKworCXJmU3RhdGUgPSBwcml2LT5pZWVlODAyMTEtPmVSRlBvd2VyU3RhdGU7CisKKwlUeFJlc2V0VHlwZSA9IFR4Q2hlY2tTdHVjayhkZXYpOworCWlmKCByZlN0YXRlICE9IGVSZk9mZiB8fAorCQkvKkFEQVBURVJfVEVTVF9TVEFUVVNfRkxBRyhBZGFwdGVyLCBBREFQVEVSX1NUQVRVU19GV19ET1dOTE9BRF9GQUlMVVJFKSkgJiYqLworCQkocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlICE9IElXX01PREVfQURIT0MpKQorCXsKKwkJLy8gSWYgZHJpdmVyIGlzIGluIHRoZSBzdGF0dXMgb2YgZmlybXdhcmUgZG93bmxvYWQgZmFpbHVyZSAsIGRyaXZlciBza2lwcyBSRiBpbml0aWFsaXphdGlvbiBhbmQgUkYgaXMKKwkJLy8gaW4gdHVybmVkIG9mZiBzdGF0ZS4gRHJpdmVyIHNob3VsZCBjaGVjayB3aGV0aGVyIFJ4IHN0dWNrIGFuZCBkbyBzaWxlbnQgcmVzZXQuIEFuZAorCQkvLyBpZiBkcml2ZXIgaXMgaW4gZmlybXdhcmUgZG93bmxvYWQgZmFpbHVyZSBzdGF0dXMsIGRyaXZlciBzaG91bGQgaW5pdGlhbGl6ZSBSRiBpbiB0aGUgZm9sbG93aW5nCisJCS8vIHNpbGVudCByZXNldCBwcm9jZWR1cmUgRW1pbHksIDIwMDguMDEuMjEKKworCQkvLyBEcml2ZXIgc2hvdWxkIG5vdCBjaGVjayBSWCBzdHVjayBpbiBJQlNTIG1vZGUgYmVjYXVzZSBpdCBpcyByZXF1aXJlZCB0bworCQkvLyBzZXQgQ2hlY2sgQlNTSUQgaW4gb3JkZXIgdG8gc2VuZCBiZWFjb24sIGhvd2V2ZXIsIGlmIGNoZWNrIEJTU0lEIGlzCisJCS8vIHNldCwgU1RBIGNhbm5vdCBoZWFyIGFueSBwYWNrZXQgYSBhbGwuIEVtaWx5LCAyMDA4LjA0LjEyCisJCVJ4UmVzZXRUeXBlID0gUnhDaGVja1N0dWNrKGRldik7CisJfQorCWlmKFR4UmVzZXRUeXBlPT1SRVNFVF9UWVBFX05PUk1BTCB8fCBSeFJlc2V0VHlwZT09UkVTRVRfVFlQRV9OT1JNQUwpCisJCXJldHVybiBSRVNFVF9UWVBFX05PUk1BTDsKKwllbHNlIGlmKFR4UmVzZXRUeXBlPT1SRVNFVF9UWVBFX1NJTEVOVCB8fCBSeFJlc2V0VHlwZT09UkVTRVRfVFlQRV9TSUxFTlQpeworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOnNpbGVudCByZXNldFxuIixfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CisJfQorCWVsc2UKKwkJcmV0dXJuIFJFU0VUX1RZUEVfTk9SRVNFVDsKKworfQorCit2b2lkIHJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpOworaW50IF9ydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHJ0bDgxOTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworCit2b2lkCitDYW1SZXN0b3JlQWxsRW50cnkoCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggRW50cnlJZCA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4KglNYWNBZGRyID0gcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQ7CisKKwlzdGF0aWMgdTgJQ0FNX0NPTlNUX0FERFJbNF1bNl0gPSB7CisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9LAorCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMn0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzfX07CisJc3RhdGljIHU4CUNBTV9DT05TVF9CUk9BRFtdID0KKwkJezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCisJUlRfVFJBQ0UoQ09NUF9TRUMsICJDYW1SZXN0b3JlQWxsRW50cnk6IFxuIik7CisKKworCWlmICgocHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9XRVA0MCl8fAorCSAgICAocHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9XRVAxMDQpKQorCXsKKworCQlmb3IoRW50cnlJZD0wOyBFbnRyeUlkPDQ7IEVudHJ5SWQrKykKKwkJeworCQkJeworCQkJCU1hY0FkZHIgPSBDQU1fQ09OU1RfQUREUltFbnRyeUlkXTsKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJRW50cnlJZCAsCisJCQkJCQlFbnRyeUlkLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQl9CisJCX0KKworCX0KKwllbHNlIGlmKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfVEtJUCkKKwl7CisKKwkJeworCQkJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTQsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCSh1OCopZGV2LT5kZXZfYWRkciwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwkJCWVsc2UKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJNCwKKwkJCQkJCTAsCisJCQkJCQlwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlLAorCQkJCQkJTWFjQWRkciwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwkJfQorCX0KKwllbHNlIGlmKHByaXYtPmllZWU4MDIxMS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfQ0NNUCkKKwl7CisKKwkJeworCQkJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTQsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCSh1OCopZGV2LT5kZXZfYWRkciwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwkJCWVsc2UKKwkJCQlzZXRLZXkoZGV2LAorCQkJCQkJNCwKKwkJCQkJCTAsCisJCQkJCQlwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlLAorCQkJCQkJTWFjQWRkciwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwkJfQorCX0KKworCisKKwlpZihwcml2LT5pZWVlODAyMTEtPmdyb3VwX2tleV90eXBlID09IEtFWV9UWVBFX1RLSVApCisJeworCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0JST0FEOworCQlmb3IoRW50cnlJZD0xIDsgRW50cnlJZDw0IDsgRW50cnlJZCsrKQorCQl7CisJCQl7CisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCUVudHJ5SWQsCisJCQkJCQlFbnRyeUlkLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCU1hY0FkZHIsCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJCQl9CisJCX0KKwkJaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQkJc2V0S2V5KGRldiwKKwkJCQkJCTAsCisJCQkJCQkwLAorCQkJCQkJcHJpdi0+aWVlZTgwMjExLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCUNBTV9DT05TVF9BRERSWzBdLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOworCX0KKwllbHNlIGlmKHByaXYtPmllZWU4MDIxMS0+Z3JvdXBfa2V5X3R5cGUgPT0gS0VZX1RZUEVfQ0NNUCkKKwl7CisJCU1hY0FkZHIgPSBDQU1fQ09OU1RfQlJPQUQ7CisJCWZvcihFbnRyeUlkPTE7IEVudHJ5SWQ8NCA7IEVudHJ5SWQrKykKKwkJeworCQkJeworCQkJCXNldEtleShkZXYsCisJCQkJCQlFbnRyeUlkICwKKwkJCQkJCUVudHJ5SWQsCisJCQkJCQlwcml2LT5pZWVlODAyMTEtPmdyb3VwX2tleV90eXBlLAorCQkJCQkJTWFjQWRkciwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKKwkJCX0KKwkJfQorCisJCWlmKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQorCQkJCXNldEtleShkZXYsCisJCQkJCQkwICwKKwkJCQkJCTAsCisJCQkJCQlwcml2LT5pZWVlODAyMTEtPmdyb3VwX2tleV90eXBlLAorCQkJCQkJQ0FNX0NPTlNUX0FERFJbMF0sCisJCQkJCQkwLAorCQkJCQkJTlVMTCk7CisJfQorfQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmaXggVHgvUnggc3RvcCBidWcgdGVtcG9yYXJpbHkuCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gInN5c3RlbSByZXNldCIgdG8gTklDIHdoZW4gVHggb3IgUnggaXMgc3R1Y2suCisvLyBUaGUgbWV0aG9kIGNoZWNraW5nIFR4L1J4IHN0dWNrIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IEZXLAorLy8gd2hpY2ggcmVwb3J0cyBUeCBhbmQgUnggY291bnRlciB0byByZWdpc3RlciAweDEyOCBhbmQgMHgxMzAuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordm9pZAorcnRsODE5eF9pZnNpbGVudHJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLy9PQ1RFVF9TVFJJTkcgYXNvY3BkdTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJcmVzZXRfdGltZXMgPSAwOworCWludCByZXNldF9zdGF0dXMgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCisKKwkvLyAyMDA3LjA3LjIwLiBJZiB3ZSBuZWVkIHRvIGNoZWNrIENDSyBzdG9wLCBwbGVhc2UgdW5jb21tZW50IHRoaXMgbGluZS4KKwkvL2JTdHVjayA9IEFkYXB0ZXItPkhhbEZ1bmMuQ2hlY2tIV1N0b3BIYW5kbGVyKEFkYXB0ZXIpOworCisJaWYocHJpdi0+UmVzZXRQcm9ncmVzcz09UkVTRVRfVFlQRV9OT1JFU0VUKQorCXsKK1JFU0VUX1NUQVJUOgorCisJCVJUX1RSQUNFKENPTVBfUkVTRVQsIj09PT09PT09PT5SZXNldCBwcm9ncmVzcyEhIFxuIik7CisKKwkJLy8gU2V0IHRoZSB2YXJpYWJsZSBmb3IgcmVzZXQuCisJCXByaXYtPlJlc2V0UHJvZ3Jlc3MgPSBSRVNFVF9UWVBFX1NJTEVOVDsKKy8vCQlydGw4MTkyX2Nsb3NlKGRldik7CisJCWRvd24oJnByaXYtPnd4X3NlbSk7CisJCWlmKHByaXYtPnVwID09IDApCisJCXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCIlcygpOnRoZSBkcml2ZXIgaXMgbm90IHVwISByZXR1cm5cbiIsX19GVU5DVElPTl9fKTsKKwkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJcmV0dXJuIDsKKwkJfQorCQlwcml2LT51cCA9IDA7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6PT09PT09PnN0YXJ0IHRvIGRvd24gdGhlIGRyaXZlclxuIixfX0ZVTkNUSU9OX18pOworLy8JCWlmKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisvLwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlydGw4MTkyX3J0eF9kaXNhYmxlKGRldik7CisJCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJCWRlaW5pdF9oYWxfZG0oZGV2KTsKKwkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisKKwkJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOworCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQorCQl7CisJCQlkb3duKCZpZWVlLT53eF9zZW0pOworCQkJcHJpbnRrKCJpZWVlLT5zdGF0ZSBpcyBJRUVFODAyMTFfTElOS0VEXG4iKTsKKwkJCWllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhwcml2LT5pZWVlODAyMTEpOworCQkJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCQkJaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQl1cCgmaWVlZS0+d3hfc2VtKTsKKwkJfQorCQllbHNleworCQkJcHJpbnRrKCJpZWVlLT5zdGF0ZSBpcyBOT1QgTElOS0VEXG4iKTsKKwkJCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsJCQl9CisJCXVwKCZwcml2LT53eF9zZW0pOworCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOjw9PT09PT09PT09ZG93biBwcm9jZXNzIGlzIGZpbmlzaGVkXG4iLF9fRlVOQ1RJT05fXyk7CisJLy9ydGw4MTkyX2lycV9kaXNhYmxlKGRldik7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6PT09PT09PT09PT0+c3RhcnQgdG8gdXAgdGhlIGRyaXZlclxuIixfX0ZVTkNUSU9OX18pOworCQlyZXNldF9zdGF0dXMgPSBfcnRsODE5Ml91cChkZXYpOworCisJCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6PD09PT09PT09PT09dXAgcHJvY2VzcyBpcyBmaW5pc2hlZFxuIixfX0ZVTkNUSU9OX18pOworCQlpZihyZXNldF9zdGF0dXMgPT0gLUVBR0FJTikKKwkJeworCQkJaWYocmVzZXRfdGltZXMgPCAzKQorCQkJeworCQkJCXJlc2V0X3RpbWVzKys7CisJCQkJZ290byBSRVNFVF9TVEFSVDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwiIEVSUiEhISAlcygpOiAgUmVzZXQgRmFpbGVkISFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0KKwkJaWVlZS0+aXNfc2lsZW50X3Jlc2V0ID0gMTsKKwkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKwkJaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJiBpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCXsKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKKworCQl9CisJCWVsc2UgaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJiBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCXsKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQkJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKworCQkvLwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwkJCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7CisKKwkJCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQorCQkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwkJfQorCisJCUNhbVJlc3RvcmVBbGxFbnRyeShkZXYpOworCisJCXByaXYtPlJlc2V0UHJvZ3Jlc3MgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJCXByaXYtPnJlc2V0X2NvdW50Kys7CisKKwkJcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0ID1mYWxzZTsKKwkJcHJpdi0+YlJlc2V0SW5Qcm9ncmVzcyA9IGZhbHNlOworCisJCS8vIEZvciB0ZXN0IC0tPiBmb3JjZSB3cml0ZSBVRldQLgorCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworCQlSVF9UUkFDRShDT01QX1JFU0VULCAiUmVzZXQgZmluaXNoZWQhISA9PT09PlslZF1cbiIsIHByaXYtPnJlc2V0X2NvdW50KTsKKwl9Cit9CisKK3ZvaWQgQ0FNX3JlYWRfZW50cnkoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1MzIJIAkJaUluZGV4CispCit7CisgCXUzMiB0YXJnZXRfY29tbWFuZD0wOworCSB1MzIgdGFyZ2V0X2NvbnRlbnQ9MDsKKwkgdTggZW50cnlfaT0wOworCSB1MzIgdWxTdGF0dXM7CisJczMyIGk9MTAwOworLy8JcHJpbnRrKCI9PT09PT09PnN0YXJ0IHJlYWQgQ0FNXG4iKTsKKyAJZm9yKGVudHJ5X2k9MDtlbnRyeV9pPENBTV9DT05URU5UX0NPVU5UO2VudHJ5X2krKykKKyAJeworICAgCS8vIHBvbGxpbmcgYml0LCBhbmQgTm8gV3JpdGUgZW5hYmxlLCBhbmQgYWRkcmVzcworCQl0YXJnZXRfY29tbWFuZD0gZW50cnlfaStDQU1fQ09OVEVOVF9DT1VOVCppSW5kZXg7CisJCXRhcmdldF9jb21tYW5kPSB0YXJnZXRfY29tbWFuZCB8IEJJVDMxOworCisJLy9DaGVjayBwb2xsaW5nIGJpdCBpcyBjbGVhcgorLy8JbWRlbGF5KDEpOworCQl3aGlsZSgoaS0tKT49MCkKKwkJeworCQkJdWxTdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIFJXQ0FNKTsKKwkJCWlmKHVsU3RhdHVzICYgQklUMzEpeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZWxzZXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgdGFyZ2V0X2NvbW1hbmQpOworCQlSVF9UUkFDRShDT01QX1NFQywiQ0FNX3JlYWRfZW50cnkoKTogV1JJVEUgQTA6ICV4IFxuIix0YXJnZXRfY29tbWFuZCk7CisJIC8vCXByaW50aygiQ0FNX3JlYWRfZW50cnkoKTogV1JJVEUgQTA6ICVseCBcbiIsdGFyZ2V0X2NvbW1hbmQpOworCQl0YXJnZXRfY29udGVudCA9IHJlYWRfbmljX2R3b3JkKGRldiwgUkNBTU8pOworCQlSVF9UUkFDRShDT01QX1NFQywgIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEE4OiAleCBcbiIsdGFyZ2V0X2NvbnRlbnQpOworCSAvLwlwcmludGsoIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEE4OiAlbHggXG4iLHRhcmdldF9jb250ZW50KTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCit2b2lkIHJ0bDgxOXhfdXBkYXRlX3J4Y291bnRzKAorCXN0cnVjdCByODE5Ml9wcml2ICpwcml2LAorCXUzMiogVG90YWxSeEJjbk51bSwKKwl1MzIqIFRvdGFsUnhEYXRhTnVtCispCit7CisJdTE2IAkJCVNsb3RJbmRleDsKKwl1OAkJCWk7CisKKwkqVG90YWxSeEJjbk51bSA9IDA7CisJKlRvdGFsUnhEYXRhTnVtID0gMDsKKworCVNsb3RJbmRleCA9IChwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlNsb3RJbmRleCsrKSUocHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtKTsKKwlwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlJ4QmNuTnVtW1Nsb3RJbmRleF0gPSBwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZDsKKwlwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlJ4RGF0YU51bVtTbG90SW5kZXhdID0gcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kOworCWZvciggaT0wOyBpPHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uU2xvdE51bTsgaSsrICl7CisJCSpUb3RhbFJ4QmNuTnVtICs9IHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uUnhCY25OdW1baV07CisJCSpUb3RhbFJ4RGF0YU51bSArPSBwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlJ4RGF0YU51bVtpXTsKKwl9Cit9CisKKworZXh0ZXJuCXZvaWQJcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsd2F0Y2hfZG9nX3dxKTsKKyAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJUkVTRVRfVFlQRQlSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJc3RhdGljIHU4CWNoZWNrX3Jlc2V0X2NudD0wOworCWJvb2wgYkJ1c3lUcmFmZmljID0gZmFsc2U7CisKKwlpZighcHJpdi0+dXApCisJCXJldHVybjsKKwloYWxfZG1fd2F0Y2hkb2coZGV2KTsKKworCXsvL3RvIGdldCBidXN5IHRyYWZmaWMgY29uZGl0aW9uCisJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCisJCXsKKwkJCWlmKAlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2Q+IDY2NiB8fAorCQkJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZD4gNjY2ICkgeworCQkJCWJCdXN5VHJhZmZpYyA9IHRydWU7CisJCQl9CisJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QgPSAwOworCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kID0gMDsKKwkJCWllZWUtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKKwkJfQorCX0KKwkvL2FkZGVkIGJ5IGFteSBmb3IgQVAgcm9hbWluZworCXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQl7CisJCQl1MzIJVG90YWxSeEJjbk51bSA9IDA7CisJCQl1MzIJVG90YWxSeERhdGFOdW0gPSAwOworCisJCQlydGw4MTl4X3VwZGF0ZV9yeGNvdW50cyhwcml2LCAmVG90YWxSeEJjbk51bSwgJlRvdGFsUnhEYXRhTnVtKTsKKwkJCWlmKChUb3RhbFJ4QmNuTnVtK1RvdGFsUnhEYXRhTnVtKSA9PSAwKQorCQkJeworCQkJCSNpZmRlZiBUT0RPCisJCQkJaWYocmZTdGF0ZSA9PSBlUmZPZmYpCisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCI9PT09PT09PT4lcygpXG4iLF9fRlVOQ1RJT05fXyk7CisJCQkJI2VuZGlmCisJCQkJcHJpbnRrKCI9PT0+JXMoKTogQVAgaXMgcG93ZXIgb2ZmLGNvbm5lY3QgYW5vdGhlciBvbmVcbiIsX19GVU5DVElPTl9fKTsKKwkJCS8vCURvdDExZF9SZXNldChkZXYpOworCQkJCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkc7CisJCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHByaXYtPmllZWU4MDIxMSk7CisJCQkJUmVtb3ZlUGVlclRTKHByaXYtPmllZWU4MDIxMSxwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCk7CisJCQkJcHJpdi0+aWVlZTgwMjExLT5saW5rX2NoYW5nZShkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsICZwcml2LT5pZWVlODAyMTEtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCisJCQl9CisJCX0KKwkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q9MDsKKwkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPTA7CisJfQorLy8JQ0FNX3JlYWRfZW50cnkoZGV2LDQpOworCS8vY2hlY2sgaWYgcmVzZXQgdGhlIGRyaXZlcgorCWlmKGNoZWNrX3Jlc2V0X2NudCsrID49IDMpCisJeworICAgIAkJUmVzZXRUeXBlID0gcnRsODE5eF9pZmNoZWNrX3Jlc2V0b3Jub3QoZGV2KTsKKwkJY2hlY2tfcmVzZXRfY250ID0gMzsKKwkJLy9EYmdQcmludCgiU3RhcnQgdG8gY2hlY2sgc2lsZW50IHJlc2V0XG4iKTsKKwl9CisJLy8JUlRfVFJBQ0UoQ09NUF9SRVNFVCwiJXMoKTpwcml2LT5mb3JjZV9yZXNldCBpcyAlZCxwcml2LT5SZXNldFByb2dyZXNzIGlzICVkLCBwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgaXMgJWQscHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrIGlzICVkLFJlc2V0VHlwZSBpcyAlZFxuIixfX0ZVTkNUSU9OX18scHJpdi0+Zm9yY2VfcmVzZXQscHJpdi0+UmVzZXRQcm9ncmVzcyxwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQscHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrLFJlc2V0VHlwZSk7CisJaWYoIChwcml2LT5mb3JjZV9yZXNldCkgfHwgKHByaXYtPlJlc2V0UHJvZ3Jlc3M9PVJFU0VUX1RZUEVfTk9SRVNFVCAmJgorCQkocHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0IHx8CisJCSghcHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrICYmIFJlc2V0VHlwZT09UkVTRVRfVFlQRV9TSUxFTlQpKSkpIC8vIFRoaXMgaXMgY29udHJvbCBieSBPSUQgc2V0IGluIFBvbWVsbworCXsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwiJXMoKTpwcml2LT5mb3JjZV9yZXNldCBpcyAlZCxwcml2LT5SZXNldFByb2dyZXNzIGlzICVkLCBwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgaXMgJWQscHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrIGlzICVkLFJlc2V0VHlwZSBpcyAlZFxuIixfX0ZVTkNUSU9OX18scHJpdi0+Zm9yY2VfcmVzZXQscHJpdi0+UmVzZXRQcm9ncmVzcyxwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQscHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrLFJlc2V0VHlwZSk7CisJCXJ0bDgxOXhfaWZzaWxlbnRyZXNldChkZXYpOworCX0KKwlwcml2LT5mb3JjZV9yZXNldCA9IGZhbHNlOworCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IGZhbHNlOworCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlSVF9UUkFDRShDT01QX1RSQUNFLCAiIDw9PVJ0VXNiQ2hlY2tGb3JIYW5nV29ya0l0ZW1DYWxsYmFjaygpXG4iKTsKKworfQorCit2b2lkIHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YSk7CisJLy9wcmludGsoIj09PT09PT09PT09PT09PT53YXRjaF9kb2cgIHRpbWVyXG4iKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+d2F0Y2hfZG9nX3dxLCAwKTsKKwltb2RfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lciwgamlmZmllcyArIE1TRUNTKElFRUU4MDIxMV9XQVRDSF9ET0dfVElNRSkpOworfQoraW50IF9ydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8vaW50IGk7CisJaW50IGluaXRfc3RhdHVzID0gMDsKKwlwcml2LT51cD0xOworCXByaXYtPmllZWU4MDIxMS0+aWVlZV91cD0xOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkJyaW5naW5nIHVwIGlmYWNlIik7CisJaW5pdF9zdGF0dXMgPSBydGw4MTkyX2FkYXB0ZXJfc3RhcnQoZGV2KTsKKwlpZighaW5pdF9zdGF0dXMpCisJeworCQlSVF9UUkFDRShDT01QX0VSUiwiRVJSISEhICVzKCk6IGluaXRpYWxpemF0aW9uIGlzIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXByaXYtPnVwPXByaXYtPmllZWU4MDIxMS0+aWVlZV91cCA9IDA7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICJzdGFydCBhZGFwdGVyIGZpbmlzaGVkXG4iKTsKKwlydGw4MTkyX3J4X2VuYWJsZShkZXYpOworLy8JcnRsODE5Ml90eF9lbmFibGUoZGV2KTsKKwlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCisJaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKwlpZWVlODAyMTFfcmVzZXRfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKKwl3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2soKHVuc2lnbmVkIGxvbmcpIGRldik7CisJaWYoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllbHNlCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisKK2ludCBydGw4MTkyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IHJ0bDgxOTJfdXAoZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKworaW50IHJ0bDgxOTJfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZiAocHJpdi0+dXAgPT0gMSkgcmV0dXJuIC0xOworCisJcmV0dXJuIF9ydGw4MTkyX3VwKGRldik7Cit9CisKKworaW50IHJ0bDgxOTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBydGw4MTkyX2Rvd24oZGV2KTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgcnRsODE5Ml9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCBpOworCisJaWYgKHByaXYtPnVwID09IDApIHJldHVybiAtMTsKKworCXByaXYtPnVwPTA7CisJcHJpdi0+aWVlZTgwMjExLT5pZWVlX3VwID0gMDsKKwlSVF9UUkFDRShDT01QX0RPV04sICI9PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisvKiBGSVhNRSAqLworCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlydGw4MTkyX3J0eF9kaXNhYmxlKGRldik7CisJLy9ydGw4MTkyX2lycV9kaXNhYmxlKGRldik7CisKKyAvKiBUeCByZWxhdGVkIHF1ZXVlIHJlbGVhc2UgKi8KKwlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7CisJCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFEgW2ldKTsKKwl9CisJZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgeworCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmllZWU4MDIxMS0+c2tiX2FnZ1EgW2ldKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7CisJCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+aWVlZTgwMjExLT5za2JfZHJ2X2FnZ1EgW2ldKTsKKwl9CisKKwkvL2FzIGNhbmNlbF9kZWxheWVkX3dvcmsgd2lsbCBkZWwgd29yay0+dGltZXIsIHNvIGlmIHdvcmsgaXMgbm90IGRlZmluZWRhcyBzdHJ1Y3QgZGVsYXllZF93b3JrLCBpdCB3aWxsIGNvcnJ1cHQKKy8vCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKKwlkZWluaXRfaGFsX2RtKGRldik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisKKworCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKwltZW1zZXQoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLCAwICwgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrLCBsaXN0KSk7CisJUlRfVFJBQ0UoQ09NUF9ET1dOLCAiPD09PT09PT09PT0lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCXJldHVybiAwOworfQorCisKK3ZvaWQgcnRsODE5Ml9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJlc2V0X3N0YXR1cyA9IDA7CisJLy91OCByZXNldF90aW1lcyA9IDA7CisJaWYgKHByaXYtPnVwID09IDApIHJldHVybiA7CisJcHJpdi0+dXAgPSAwOworCisJcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyKTsKKwkvL2NhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPlN3Q2hubFdvcmtJdGVtKTsKKworCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKKworCS8vcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCXJ0bDgxOTJfcnR4X2Rpc2FibGUoZGV2KTsKKwlyZXNldF9zdGF0dXMgPSBfcnRsODE5Ml91cChkZXYpOworCit9CisKKy8qCit2b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyovCit2b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHJlc2V0X3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcnRsODE5Ml9jb21taXQoZGV2KTsKKworCXVwKCZwcml2LT53eF9zZW0pOworfQorCitzdGF0aWMgdm9pZCByODE5Ml9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXNob3J0IHByb21pc2M7CisKKwkvL2Rvd24oJnByaXYtPnd4X3NlbSk7CisKKwkvKiBGSVhNRSBGSVhNRSAqLworCisJcHJvbWlzYyA9IChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMTowOworCisJaWYgKHByb21pc2MgIT0gcHJpdi0+cHJvbWlzYykKKwkvLwlydGw4MTkyX2NvbW1pdChkZXYpOworCisJcHJpdi0+cHJvbWlzYyA9IHByb21pc2M7CisKKwkvL3NjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKKwkvL3VwKCZwcml2LT53eF9zZW0pOworfQorCisKK2ludCByODE5Ml9zZXRfbWFjX2FkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICptYWMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IG1hYzsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd3EpOworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGJhc2VkIG9uIGlwdzIyMDAgZHJpdmVyICovCitpbnQgcnRsODE5Ml9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilycTsKKwlpbnQgcmV0PS0xOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXUzMiBrZXlbNF07CisJdTggYnJvYWRjYXN0X2FkZHJbNl0gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCXN0cnVjdCBpd19wb2ludCAqcCA9ICZ3cnEtPnUuZGF0YTsKKwlzdHJ1Y3QgaWVlZV9wYXJhbSAqaXB3ID0gTlVMTDsvLyhzdHJ1Y3QgaWVlZV9wYXJhbSAqKXdycS0+dS5kYXRhLnBvaW50ZXI7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisKKyAgICAgaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpeworCSAgICAgcmV0ID0gLUVJTlZBTDsKKwkgICAgIGdvdG8gb3V0OworCX0KKworICAgICBpcHcgPSAoc3RydWN0IGllZWVfcGFyYW0gKilrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7CisgICAgIGlmIChpcHcgPT0gTlVMTCl7CisJICAgICByZXQgPSAtRU5PTUVNOworCSAgICAgZ290byBvdXQ7CisgICAgIH0KKyAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGlwdywgcC0+cG9pbnRlciwgcC0+bGVuZ3RoKSkgeworCQlrZnJlZShpcHcpOworCSAgICByZXQgPSAtRUZBVUxUOworCSAgICBnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCSAgICBjYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKKwkvL3BhcnNlIGhlcmUgZm9yIEhXIHNlY3VyaXR5CisJCQlpZiAoaXB3LT5jbWQgPT0gSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04pCisJCQl7CisJCQkJaWYgKGlwdy0+dS5jcnlwdC5zZXRfdHgpCisJCQkJeworCQkJCQlpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkKKwkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKwkJCQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKKwkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJCQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKQorCQkJCQl7CisJCQkJCQlpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gMTMpCisJCQkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQkJCQllbHNlIGlmIChpcHctPnUuY3J5cHQua2V5X2xlbiA9PSA1KQorCQkJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9OQTsKKworCQkJCQlpZiAoaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUpCisJCQkJCXsKKwkJCQkJCW1lbWNweSgodTgqKWtleSwgaXB3LT51LmNyeXB0LmtleSwgMTYpOworCQkJCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKwkJCQkJLy93ZSBmaWxsIGJvdGggaW5kZXggZW50cnkgYW5kIDR0aCBlbnRyeSBmb3IgcGFpcndpc2Uga2V5IGFzIGluIElQVyBpbnRlcmZhY2UsIGFkaG9jIHdpbGwgb25seSBnZXQgaGVyZSwgc28gd2UgbmVlZCBpbmRleCBlbnRyeSBmb3IgaXRzIGRlZmF1bHQga2V5IHNlcmNoaW5nIQorCQkJCQkvL2FkZGVkIGJ5IFdCLgorCQkJCQkJc2V0S2V5KGRldiwgNCwgaXB3LT51LmNyeXB0LmlkeCwgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsICh1OCopaWVlZS0+YXBfbWFjX2FkZHIsIDAsIGtleSk7CisJCQkJCQlpZiAoaWVlZS0+YXV0aF9tb2RlICE9IDIpCisJCQkJCQlzZXRLZXkoZGV2LCBpcHctPnUuY3J5cHQuaWR4LCBpcHctPnUuY3J5cHQuaWR4LCBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSwgKHU4KilpZWVlLT5hcF9tYWNfYWRkciwgMCwga2V5KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIC8vaWYgKGlwdy0+dS5jcnlwdC5pZHgpIC8vZ3JvdXAga2V5IHVzZSBpZHggPiAwCisJCQkJeworCQkJCQltZW1jcHkoKHU4KilrZXksIGlwdy0+dS5jcnlwdC5rZXksIDE2KTsKKwkJCQkJaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApCisJCQkJCQlpZWVlLT5ncm91cF9rZXlfdHlwZT0gS0VZX1RZUEVfQ0NNUDsKKwkJCQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKKwkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJCQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKQorCQkJCQl7CisJCQkJCQlpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gMTMpCisJCQkJCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQkJCQllbHNlIGlmIChpcHctPnUuY3J5cHQua2V5X2xlbiA9PSA1KQorCQkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBLRVlfVFlQRV9OQTsKKworCQkJCQlpZiAoaWVlZS0+Z3JvdXBfa2V5X3R5cGUpCisJCQkJCXsKKwkJCQkJCQlzZXRLZXkoCWRldiwKKwkJCQkJCQkJaXB3LT51LmNyeXB0LmlkeCwKKwkJCQkJCQkJaXB3LT51LmNyeXB0LmlkeCwJCS8vS2V5SW5kZXgKKwkJCQkJCSAgICAgCQlpZWVlLT5ncm91cF9rZXlfdHlwZSwJLy9LZXlUeXBlCisJCQkJCQkgICAgICAgICAgICAJYnJvYWRjYXN0X2FkZHIsCS8vTWFjQWRkcgorCQkJCQkJCQkwLAkJLy9EZWZhdWx0S2V5CisJCQkJCQkJICAgICAgCWtleSk7CQkvL0tleUNvbnRlbnQKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNpZmRlZiBKT0hOX0hXU0VDX0RFQlVHCisJCS8vam9obidzIHRlc3QgMDcxMQorCQlwcmludGsoIkBAIHdycS0+dSBwb2ludGVyID0gIik7CisJCWZvcihpPTA7aTx3cnEtPnUuZGF0YS5sZW5ndGg7aSsrKXsKKwkJCWlmKGklMTA9PTApIHByaW50aygiXG4iKTsKKwkJCXByaW50ayggIiU4eHwiLCAoKHUzMiopd3JxLT51LmRhdGEucG9pbnRlcilbaV0gKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYgLypKT0hOX0hXU0VDX0RFQlVHKi8KKwkJcmV0ID0gaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHByaXYtPmllZWU4MDIxMSwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKwlrZnJlZShpcHcpOworCWlwdyA9IE5VTEw7CitvdXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKwordTggSHdSYXRlVG9NUmF0ZTkwKGJvb2wgYklzSFQsIHU4IHJhdGUpCit7CisJdTggIHJldF9yYXRlID0gMHhmZjsKKworCWlmKCFiSXNIVCkgeworCQlzd2l0Y2gocmF0ZSkgeworCQkJY2FzZSBERVNDOTBfUkFURTFNOiAgIHJldF9yYXRlID0gTUdOXzFNOyAgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTJNOiAgIHJldF9yYXRlID0gTUdOXzJNOyAgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTVfNU06IHJldF9yYXRlID0gTUdOXzVfNU07ICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTExTTogIHJldF9yYXRlID0gTUdOXzExTTsgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTZNOiAgIHJldF9yYXRlID0gTUdOXzZNOyAgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTlNOiAgIHJldF9yYXRlID0gTUdOXzlNOyAgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTEyTTogIHJldF9yYXRlID0gTUdOXzEyTTsgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTE4TTogIHJldF9yYXRlID0gTUdOXzE4TTsgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTI0TTogIHJldF9yYXRlID0gTUdOXzI0TTsgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTM2TTogIHJldF9yYXRlID0gTUdOXzM2TTsgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTQ4TTogIHJldF9yYXRlID0gTUdOXzQ4TTsgICAgICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURTU0TTogIHJldF9yYXRlID0gTUdOXzU0TTsgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldF9yYXRlID0gMHhmZjsKKwkJCQlSVF9UUkFDRShDT01QX1JFQ1YsICJId1JhdGVUb01SYXRlOTAoKTogTm9uIHN1cHBvcnRlZCBSYXRlIFsleF0sIGJJc0hUID0gJWQhISFcbiIsIHJhdGUsIGJJc0hUKTsKKwkJCQlicmVhazsKKwkJfQorCisJfSBlbHNlIHsKKwkJc3dpdGNoKHJhdGUpIHsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MwOiAgIHJldF9yYXRlID0gTUdOX01DUzA7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzE6ICAgcmV0X3JhdGUgPSBNR05fTUNTMTsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMjogICByZXRfcmF0ZSA9IE1HTl9NQ1MyOyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MzOiAgIHJldF9yYXRlID0gTUdOX01DUzM7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzQ6ICAgcmV0X3JhdGUgPSBNR05fTUNTNDsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTNTogICByZXRfcmF0ZSA9IE1HTl9NQ1M1OyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1M2OiAgIHJldF9yYXRlID0gTUdOX01DUzY7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzc6ICAgcmV0X3JhdGUgPSBNR05fTUNTNzsgICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTODogICByZXRfcmF0ZSA9IE1HTl9NQ1M4OyAgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1M5OiAgIHJldF9yYXRlID0gTUdOX01DUzk7ICAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzEwOiAgcmV0X3JhdGUgPSBNR05fTUNTMTA7ICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMTE6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxMTsgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMjogIHJldF9yYXRlID0gTUdOX01DUzEyOyAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzEzOiAgcmV0X3JhdGUgPSBNR05fTUNTMTM7ICAgYnJlYWs7CisJCQljYXNlIERFU0M5MF9SQVRFTUNTMTQ6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxNDsgICBicmVhazsKKwkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxNTogIHJldF9yYXRlID0gTUdOX01DUzE1OyAgIGJyZWFrOworCQkJY2FzZSBERVNDOTBfUkFURU1DUzMyOiAgcmV0X3JhdGUgPSAoMHg4MHwweDIwKTsgYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0X3JhdGUgPSAweGZmOworCQkJCVJUX1RSQUNFKENPTVBfUkVDViwgIkh3UmF0ZVRvTVJhdGU5MCgpOiBOb24gc3VwcG9ydGVkIFJhdGUgWyV4XSwgYklzSFQgPSAlZCEhIVxuIixyYXRlLCBiSXNIVCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0X3JhdGU7Cit9CisKKy8qKgorICogRnVuY3Rpb246ICAgICBVcGRhdGVSeFBrdFRpbWVTdGFtcAorICogT3ZlcnZpZXc6ICAgICBSZWNvcmVkIGRvd24gdGhlIFRTRiB0aW1lIHN0YW1wIHdoZW4gcmVjZWl2aW5nIGEgcGFja2V0CisgKgorICogSW5wdXQ6CisgKiAgICAgICBQQURBUFRFUiAgICAgICAgQWRhcHRlcgorICogICAgICAgUFJUX1JGRCAgICAgICAgIHBSZmQsCisgKgorICogT3V0cHV0OgorICogICAgICAgUFJUX1JGRCAgICAgICAgIHBSZmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUmZkLT5TdGF0dXMuVGltZVN0YW1wSGlnaCBpcyB1cGRhdGVkKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSZmQtPlN0YXR1cy5UaW1lU3RhbXBMb3cgaXMgdXBkYXRlZCkKKyAqIFJldHVybjoKKyAqICAgICAgICAgICAgICAgTm9uZQorICovCit2b2lkIFVwZGF0ZVJ4UGt0VGltZVN0YW1wODE5MCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYoc3RhdHMtPmJJc0FNUERVICYmICFzdGF0cy0+YkZpcnN0TVBEVSkgeworCQlzdGF0cy0+bWFjX3RpbWVbMF0gPSBwcml2LT5MYXN0UnhEZXNjVFNGTG93OworCQlzdGF0cy0+bWFjX3RpbWVbMV0gPSBwcml2LT5MYXN0UnhEZXNjVFNGSGlnaDsKKwl9IGVsc2UgeworCQlwcml2LT5MYXN0UnhEZXNjVFNGTG93ID0gc3RhdHMtPm1hY190aW1lWzBdOworCQlwcml2LT5MYXN0UnhEZXNjVFNGSGlnaCA9IHN0YXRzLT5tYWNfdGltZVsxXTsKKwl9Cit9CisKKy8vYnkgYW15IDA4MDYwNgorCitsb25nIHJ0bDgxOXhfdHJhbnNsYXRlX3RvZGJtKHU4IHNpZ25hbF9zdHJlbmd0aF9pbmRleAkpLy8gMC0xMDAgaW5kZXguCit7CisJbG9uZwlzaWduYWxfcG93ZXI7IC8vIGluIGRCbS4KKworCS8vIFRyYW5zbGF0ZSB0byBkQm0gKHg9MC41eS05NSkuCisJc2lnbmFsX3Bvd2VyID0gKGxvbmcpKChzaWduYWxfc3RyZW5ndGhfaW5kZXggKyAxKSA+PiAxKTsKKwlzaWduYWxfcG93ZXIgLT0gOTU7CisKKwlyZXR1cm4gc2lnbmFsX3Bvd2VyOworfQorCisKKy8qIDIwMDgvMDEvMjIgTUggV2UgY2FuIG5vdCBkZWxjYXJlIFJTU0kvRVZNIHRvdGFsIHZhbHVlIG9mIHNsaWRpbmcgd2luZG93IHRvCisgICAgYmUgYSBsb2NhbCBzdGF0aWMuIE90aGVyd2lzZSwgaXQgbWF5IGluY3JlYXNlIHdoZW4gd2UgcmV0dXJuIGZyb20gUzMvUzQuIFRoZQorICAgIHZhbHVlIHdpbGwgYmUga2VwdCBpbiBtZW1vcnkgb3IgZGlzay4gV2UgbXVzdCBkZWxjYXJlIHRoZSB2YWx1ZSBpbiBhZGFwdGVyCisgICAgYW5kIGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZCB3aGVuIHJldHVybiBmcm9tIFMzL1M0LiAqLwordm9pZCBydGw4MTkyX3Byb2Nlc3NfcGh5aW5mbyhzdHJ1Y3QgcjgxOTJfcHJpdiAqIHByaXYsdTgqIGJ1ZmZlciwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBwcmV2aW91c19zdGF0cywgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBjdXJyZW50X3N0YXRzKQoreworCWJvb2wgYmNoZWNrID0gZmFsc2U7CisJdTgJcmZwYXRoOworCXUzMgluc3BhdGlhbF9zdHJlYW0sIHRtcF92YWw7CisJLy91OAlpOworCXN0YXRpYyB1MzIgc2xpZGVfcnNzaV9pbmRleD0wLCBzbGlkZV9yc3NpX3N0YXRpc3RpY3M9MDsKKwlzdGF0aWMgdTMyIHNsaWRlX2V2bV9pbmRleD0wLCBzbGlkZV9ldm1fc3RhdGlzdGljcz0wOworCXN0YXRpYyB1MzIgbGFzdF9yc3NpPTAsIGxhc3RfZXZtPTA7CisKKwlzdGF0aWMgdTMyIHNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleD0wLCBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljcz0wOworCXN0YXRpYyB1MzIgbGFzdF9iZWFjb25fYWRjX3B3ZGI9MDsKKworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7CisJdTE2IHNjIDsKKwl1bnNpZ25lZCBpbnQgZnJhZyxzZXE7CisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopYnVmZmVyOworCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwlmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCXNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCS8vY29zYSBhZGQgMDQyOTIwMDggdG8gcmVjb3JkIHRoZSBzZXF1ZW5jZSBudW1iZXIKKwlwY3VycmVudF9zdGF0cy0+U2VxX051bSA9IHNlcTsKKwkvLworCS8vIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHRha2UgdGhlIHByZXZpb3VzIHBhY2tldCBpbnRvIGFjY291bnRpbmcKKwkvLworCWlmKCFwcHJldmlvdXNfc3RhdHMtPmJJc0FNUERVKQorCXsKKwkJLy8gaWYgcHJldmlvdXMgcGFja2V0IGlzIG5vdCBhZ2dyZWdhdGVkIHBhY2tldAorCQliY2hlY2sgPSB0cnVlOworCX1lbHNlCisJeworCX0KKworCisJaWYoc2xpZGVfcnNzaV9zdGF0aXN0aWNzKysgPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQorCXsKKwkJc2xpZGVfcnNzaV9zdGF0aXN0aWNzID0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYOworCQlsYXN0X3Jzc2kgPSBwcml2LT5zdGF0cy5zbGlkZV9zaWduYWxfc3RyZW5ndGhbc2xpZGVfcnNzaV9pbmRleF07CisJCXByaXYtPnN0YXRzLnNsaWRlX3Jzc2lfdG90YWwgLT0gbGFzdF9yc3NpOworCX0KKwlwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsICs9IHBwcmV2aW91c19zdGF0cy0+U2lnbmFsU3RyZW5ndGg7CisKKwlwcml2LT5zdGF0cy5zbGlkZV9zaWduYWxfc3RyZW5ndGhbc2xpZGVfcnNzaV9pbmRleCsrXSA9IHBwcmV2aW91c19zdGF0cy0+U2lnbmFsU3RyZW5ndGg7CisJaWYoc2xpZGVfcnNzaV9pbmRleCA+PSBQSFlfUlNTSV9TTElEX1dJTl9NQVgpCisJCXNsaWRlX3Jzc2lfaW5kZXggPSAwOworCisJLy8gPDE+IFNob3dlZCBvbiBVSSBmb3IgdXNlciwgaW4gZGJtCisJdG1wX3ZhbCA9IHByaXYtPnN0YXRzLnNsaWRlX3Jzc2lfdG90YWwvc2xpZGVfcnNzaV9zdGF0aXN0aWNzOworCXByaXYtPnN0YXRzLnNpZ25hbF9zdHJlbmd0aCA9IHJ0bDgxOXhfdHJhbnNsYXRlX3RvZGJtKCh1OCl0bXBfdmFsKTsKKwlwY3VycmVudF9zdGF0cy0+cnNzaSA9IHByaXYtPnN0YXRzLnNpZ25hbF9zdHJlbmd0aDsKKwkvLworCS8vIElmIHRoZSBwcmV2aW91cyBwYWNrZXQgZG9lcyBub3QgbWF0Y2ggdGhlIGNyaXRlcmlhLCBuZWdsZWN0IGl0CisJLy8KKwlpZighcHByZXZpb3VzX3N0YXRzLT5iUGFja2V0TWF0Y2hCU1NJRCkKKwl7CisJCWlmKCFwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSkKKwkJCXJldHVybjsKKwl9CisKKwlpZighYmNoZWNrKQorCQlyZXR1cm47CisKKworCS8vcnRsODE5MF9wcm9jZXNzX2Nja19yeHBhdGhzZWwocHJpdixwcHJldmlvdXNfc3RhdHMpOy8vb25seSBydGw4MTkwIHN1cHBvcnRlZAorCisJLy8KKwkvLyBDaGVjayBSU1NJCisJLy8KKwlwcml2LT5zdGF0cy5udW1fcHJvY2Vzc19waHlpbmZvKys7CisKKwkvKiByZWNvcmQgdGhlIGdlbmVyYWwgc2lnbmFsIHN0cmVuZ3RoIHRvIHRoZSBzbGlkaW5nIHdpbmRvdy4gKi8KKworCisJLy8gPDI+IFNob3dlZCBvbiBVSSBmb3IgZW5naW5lZXJpbmcKKwkvLyBoYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIHJzc2kgaW5mb3JtYXRpb24gZm9yIGVhY2ggcmYgcGF0aCBpbiBDQ0sKKwlpZighcHByZXZpb3VzX3N0YXRzLT5iSXNDQ0sgJiYgKHBwcmV2aW91c19zdGF0cy0+YlBhY2tldFRvU2VsZiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSkpCisJeworCQlmb3IgKHJmcGF0aCA9IFJGOTBfUEFUSF9BOyByZnBhdGggPCBwcml2LT5OdW1Ub3RhbFJGUGF0aDsgcmZwYXRoKyspCisJCXsKKwkJICAgICBpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChwcml2LT5pZWVlODAyMTEtPmRldiwgcmZwYXRoKSkKKwkJCQkgY29udGludWU7CisKKwkJCS8vRml4ZWQgYnkgSmFja2VuIDIwMDgtMDMtMjAKKwkJCWlmKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID09IDApCisJCQl7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPSBwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF07CisJCQkJLy9EYmdQcmludCgiTUlNTyBSU1NJIGluaXRpYWxpemUgXG4iKTsKKwkJCX0KKwkJCWlmKHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSAgPiBwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSkKKwkJCXsKKwkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9CisJCQkJCSggKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0pKSAvKFJ4X1Ntb290aF9GYWN0b3IpOworCQkJCXByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0gcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gICsgMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9CisJCQkJCSggKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0pKSAvKFJ4X1Ntb290aF9GYWN0b3IpOworCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9EQkcsInByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZlBhdGhdICA9ICVkIFxuIiAscHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gKTsKKwkJfQorCX0KKworCisJLy8KKwkvLyBDaGVjayBQV0RCLgorCS8vCisJUlRfVFJBQ0UoQ09NUF9SWERFU0MsICJTbW9vdGggJXMgUFdEQiA9ICVkXG4iLAorCQkJCXBwcmV2aW91c19zdGF0cy0+YklzQ0NLPyAiQ0NLIjogIk9GRE0iLAorCQkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsKTsKKworCWlmKHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbikKKwl7CisvKiByZWNvcmQgdGhlIGJlYWNvbiBwd2RiIHRvIHRoZSBzbGlkaW5nIHdpbmRvdy4gKi8KKwkJaWYoc2xpZGVfYmVhY29uX2FkY19wd2RiX3N0YXRpc3RpY3MrKyA+PSBQSFlfQmVhY29uX1JTU0lfU0xJRF9XSU5fTUFYKQorCQl7CisJCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljcyA9IFBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVg7CisJCQlsYXN0X2JlYWNvbl9hZGNfcHdkYiA9IHByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9wd2RiW3NsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleF07CisJCQlwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fVG90YWwgLT0gbGFzdF9iZWFjb25fYWRjX3B3ZGI7CisJCQkvL0RiZ1ByaW50KCJzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXggPSAlZCwgbGFzdF9iZWFjb25fYWRjX3B3ZGIgPSAlZCwgQWRhcHRlci0+UnhTdGF0cy5TbGlkZV9CZWFjb25fVG90YWwgPSAlZFxuIiwKKwkJCS8vCXNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleCwgbGFzdF9iZWFjb25fYWRjX3B3ZGIsIEFkYXB0ZXItPlJ4U3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsKTsKKwkJfQorCQlwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fVG90YWwgKz0gcHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGw7CisJCXByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9wd2RiW3NsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleF0gPSBwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbDsKKwkJLy9EYmdQcmludCgic2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4ID0gJWQsIHBQcmV2aW91c1JmZC0+U3RhdHVzLlJ4UFdEQkFsbCA9ICVkXG4iLCBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXgsIHBQcmV2aW91c1JmZC0+U3RhdHVzLlJ4UFdEQkFsbCk7CisJCXNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleCsrOworCQlpZihzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXggPj0gUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWCkKKwkJCXNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleCA9IDA7CisJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsID0gcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsL3NsaWRlX2JlYWNvbl9hZGNfcHdkYl9zdGF0aXN0aWNzOworCQlpZihwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCA+PSAzKQorCQkJcHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwgLT0gMzsKKwl9CisKKwlSVF9UUkFDRShDT01QX1JYREVTQywgIlNtb290aCAlcyBQV0RCID0gJWRcbiIsCisJCQkJcHByZXZpb3VzX3N0YXRzLT5iSXNDQ0s/ICJDQ0siOiAiT0ZETSIsCisJCQkJcHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwpOworCisKKwlpZihwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRUb1NlbGYgfHwgcHByZXZpb3VzX3N0YXRzLT5iUGFja2V0QmVhY29uIHx8IHBwcmV2aW91c19zdGF0cy0+YlRvU2VsZkJBKQorCXsKKwkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IDApCS8vIGluaXRpYWxpemUKKwkJeworCQkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9IHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsOworCQkJLy9EYmdQcmludCgiRmlyc3QgcHdkYiBpbml0aWFsaXplIFxuIik7CisJCX0KKwkJaWYocHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwgPiAodTMyKXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpCisJCXsKKwkJCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPQorCQkJCQkoICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikqKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKKwkJCQkJKHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsKSkgLyhSeF9TbW9vdGhfRmFjdG9yKTsKKwkJCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPSBwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiICsgMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPQorCQkJCQkoICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikqKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKKwkJCQkJKHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsKSkgLyhSeF9TbW9vdGhfRmFjdG9yKTsKKwkJfQorCisJfQorCisJLy8KKwkvLyBDaGVjayBFVk0KKwkvLworCS8qIHJlY29yZCB0aGUgZ2VuZXJhbCBFVk0gdG8gdGhlIHNsaWRpbmcgd2luZG93LiAqLworCWlmKHBwcmV2aW91c19zdGF0cy0+U2lnbmFsUXVhbGl0eSA9PSAwKQorCXsKKwl9CisJZWxzZQorCXsKKwkJaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmIHx8IHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSl7CisJCQlpZihzbGlkZV9ldm1fc3RhdGlzdGljcysrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCl7CisJCQkJc2xpZGVfZXZtX3N0YXRpc3RpY3MgPSBQSFlfUlNTSV9TTElEX1dJTl9NQVg7CisJCQkJbGFzdF9ldm0gPSBwcml2LT5zdGF0cy5zbGlkZV9ldm1bc2xpZGVfZXZtX2luZGV4XTsKKwkJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1fdG90YWwgLT0gbGFzdF9ldm07CisJCQl9CisKKwkJCXByaXYtPnN0YXRzLnNsaWRlX2V2bV90b3RhbCArPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFF1YWxpdHk7CisKKwkJCXByaXYtPnN0YXRzLnNsaWRlX2V2bVtzbGlkZV9ldm1faW5kZXgrK10gPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFF1YWxpdHk7CisJCQlpZihzbGlkZV9ldm1faW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQorCQkJCXNsaWRlX2V2bV9pbmRleCA9IDA7CisKKwkJCS8vIDwxPiBTaG93ZWQgb24gVUkgZm9yIHVzZXIsIGluIHBlcmNlbnRhZ2UuCisJCQl0bXBfdmFsID0gcHJpdi0+c3RhdHMuc2xpZGVfZXZtX3RvdGFsL3NsaWRlX2V2bV9zdGF0aXN0aWNzOworCQkJcHJpdi0+c3RhdHMuc2lnbmFsX3F1YWxpdHkgPSB0bXBfdmFsOworCQkJLy9jb3NhIGFkZCAxMC8xMS8yMDA3LCBTaG93ZWQgb24gVUkgZm9yIHVzZXIgaW4gV2luZG93cyBWaXN0YSwgZm9yIExpbmsgcXVhbGl0eS4KKwkJCXByaXYtPnN0YXRzLmxhc3Rfc2lnbmFsX3N0cmVuZ3RoX2lucGVyY2VudCA9IHRtcF92YWw7CisJCX0KKworCQkvLyA8Mj4gU2hvd2VkIG9uIFVJIGZvciBlbmdpbmVlcmluZworCQlpZihwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRUb1NlbGYgfHwgcHByZXZpb3VzX3N0YXRzLT5iUGFja2V0QmVhY29uIHx8IHBwcmV2aW91c19zdGF0cy0+YlRvU2VsZkJBKQorCQl7CisJCQlmb3IobnNwYXRpYWxfc3RyZWFtID0gMDsgbnNwYXRpYWxfc3RyZWFtPDIgOyBuc3BhdGlhbF9zdHJlYW0rKykgLy8gMiBzcGF0aWFsIHN0cmVhbQorCQkJeworCQkJCWlmKHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtuc3BhdGlhbF9zdHJlYW1dICE9IC0xKQorCQkJCXsKKwkJCQkJaWYocHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2VbbnNwYXRpYWxfc3RyZWFtXSA9PSAwKQkvLyBpbml0aWFsaXplCisJCQkJCXsKKwkJCQkJCXByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25zcGF0aWFsX3N0cmVhbV0gPSBwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbbnNwYXRpYWxfc3RyZWFtXTsKKwkJCQkJfQorCQkJCQlwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuc3BhdGlhbF9zdHJlYW1dID0KKwkJCQkJCSggKHByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25zcGF0aWFsX3N0cmVhbV0qIChSeF9TbW9vdGhfRmFjdG9yLTEpKSArCisJCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W25zcGF0aWFsX3N0cmVhbV0qIDEpKSAvIChSeF9TbW9vdGhfRmFjdG9yKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoKQorICoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIElucHV0OgkJY2hhcgkJYW50cG93ZXIKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJMC0xMDAgcGVyY2VudGFnZQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yNi8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB1OCBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZSgKKwljaGFyCQlhbnRwb3dlcgorCSkKK3sKKwlpZiAoKGFudHBvd2VyIDw9IC0xMDApIHx8IChhbnRwb3dlciA+PSAyMCkpCisJeworCQlyZXR1cm4JMDsKKwl9CisJZWxzZSBpZiAoYW50cG93ZXIgPj0gMCkKKwl7CisJCXJldHVybgkxMDA7CisJfQorCWVsc2UKKwl7CisJCXJldHVybgkoMTAwK2FudHBvd2VyKTsKKwl9CisKK30JLyogUXVlcnlSeFB3clBlcmNlbnRhZ2UgKi8KKworc3RhdGljIHU4CitydGw4MTl4X2V2bV9kYnRvcGVyY2VudGFnZSgKKyAgICBjaGFyIHZhbHVlCisgICAgKQoreworICAgIGNoYXIgcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSB2YWx1ZTsKKworICAgIGlmKHJldF92YWwgPj0gMCkKKyAgICAgICAgcmV0X3ZhbCA9IDA7CisgICAgaWYocmV0X3ZhbCA8PSAtMzMpCisgICAgICAgIHJldF92YWwgPSAtMzM7CisgICAgcmV0X3ZhbCA9IDAgLSByZXRfdmFsOworICAgIHJldF92YWwqPTM7CisJaWYocmV0X3ZhbCA9PSA5OSkKKwkJcmV0X3ZhbCA9IDEwMDsKKyAgICByZXR1cm4ocmV0X3ZhbCk7Cit9CisvLworLy8JRGVzY3JpcHRpb246CisvLyAJV2Ugd2FudCBnb29kLWxvb2tpbmcgZm9yIHNpZ25hbCBzdHJlbmd0aC9xdWFsaXR5CisvLwkyMDA3LzcvMTkgMDE6MDksIGJ5IGNvc2EuCisvLworbG9uZworcnRsODE5eF9zaWduYWxfc2NhbGVfbWFwcGluZygKKwlsb25nIGN1cnJzaWcKKwkpCit7CisJbG9uZyByZXRzaWc7CisKKwkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCisJaWYoY3VycnNpZyA+PSA2MSAmJiBjdXJyc2lnIDw9IDEwMCkKKwl7CisJCXJldHNpZyA9IDkwICsgKChjdXJyc2lnIC0gNjApIC8gNCk7CisJfQorCWVsc2UgaWYoY3VycnNpZyA+PSA0MSAmJiBjdXJyc2lnIDw9IDYwKQorCXsKKwkJcmV0c2lnID0gNzggKyAoKGN1cnJzaWcgLSA0MCkgLyAyKTsKKwl9CisJZWxzZSBpZihjdXJyc2lnID49IDMxICYmIGN1cnJzaWcgPD0gNDApCisJeworCQlyZXRzaWcgPSA2NiArIChjdXJyc2lnIC0gMzApOworCX0KKwllbHNlIGlmKGN1cnJzaWcgPj0gMjEgJiYgY3VycnNpZyA8PSAzMCkKKwl7CisJCXJldHNpZyA9IDU0ICsgKGN1cnJzaWcgLSAyMCk7CisJfQorCWVsc2UgaWYoY3VycnNpZyA+PSA1ICYmIGN1cnJzaWcgPD0gMjApCisJeworCQlyZXRzaWcgPSA0MiArICgoKGN1cnJzaWcgLSA1KSAqIDIpIC8gMyk7CisJfQorCWVsc2UgaWYoY3VycnNpZyA9PSA0KQorCXsKKwkJcmV0c2lnID0gMzY7CisJfQorCWVsc2UgaWYoY3VycnNpZyA9PSAzKQorCXsKKwkJcmV0c2lnID0gMjc7CisJfQorCWVsc2UgaWYoY3VycnNpZyA9PSAyKQorCXsKKwkJcmV0c2lnID0gMTg7CisJfQorCWVsc2UgaWYoY3VycnNpZyA9PSAxKQorCXsKKwkJcmV0c2lnID0gOTsKKwl9CisJZWxzZQorCXsKKwkJcmV0c2lnID0gY3VycnNpZzsKKwl9CisKKwlyZXR1cm4gcmV0c2lnOworfQorCitzdGF0aWMgdm9pZCBydGw4MTkyX3F1ZXJ5X3J4cGh5c3RhdHVzKAorCXN0cnVjdCByODE5Ml9wcml2ICogcHJpdiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICogcHN0YXRzLAorCXJ4X2RydmluZm9fODE5eF91c2IgICogcGRydmluZm8sCisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHByZWNvcmRfc3RhdHMsCisJYm9vbCBicGFja2V0X21hdGNoX2Jzc2lkLAorCWJvb2wgYnBhY2tldF90b3NlbGYsCisJYm9vbCBiUGFja2V0QmVhY29uLAorCWJvb2wgYlRvU2VsZkJBCisJKQoreworCS8vUFJUX1JGRF9TVEFUVVMJCXBSdFJmZFN0YXR1cyA9ICYocFJmZC0+U3RhdHVzKTsKKwlwaHlfc3RzX29mZG1fODE5eHVzYl90Kglwb2ZkbV9idWY7CisJcGh5X3N0c19jY2tfODE5eHVzYl90CSoJcGNja19idWY7CisJcGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZyogcHJ4c2M7CisJdTgJCQkJKnByeHBrdDsKKwl1OAkJCQlpLCBtYXhfc3BhdGlhbF9zdHJlYW0sIHRtcF9yeHNuciwgdG1wX3J4ZXZtLCByeHNjX3NnaWVuX2V4ZmxnOworCWNoYXIJCQkJcnhfcHdyWzRdLCByeF9wd3JfYWxsPTA7CisJLy9sb25nCQkJCXJ4X2F2Z19wd3IgPSAwOworCWNoYXIJCQkJcnhfc25yWCwgcnhfZXZtWDsKKwl1OAkJCQlldm0sIHB3ZGJfYWxsOworCXUzMgkJCQlSU1NJLCB0b3RhbF9yc3NpPTA7Ly8sIHRvdGFsX2V2bT0wOworLy8JbG9uZwkJCQlzaWduYWxfc3RyZW5ndGhfaW5kZXggPSAwOworCXU4CQkJCWlzX2Nja19yYXRlPTA7CisJdTgJCQkJcmZfcnhfbnVtID0gMDsKKworCisJcHJpdi0+c3RhdHMubnVtcXJ5X3BoeXN0YXR1cysrOworCisJaXNfY2NrX3JhdGUgPSByeF9oYWxfaXNfY2NrX3JhdGUocGRydmluZm8pOworCisJLy8gUmVjb3JkIGl0IGZvciBuZXh0IHBhY2tldCBwcm9jZXNzaW5nCisJbWVtc2V0KHByZWNvcmRfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKSk7CisJcHN0YXRzLT5iUGFja2V0TWF0Y2hCU1NJRCA9IHByZWNvcmRfc3RhdHMtPmJQYWNrZXRNYXRjaEJTU0lEID0gYnBhY2tldF9tYXRjaF9ic3NpZDsKKwlwc3RhdHMtPmJQYWNrZXRUb1NlbGYgPSBwcmVjb3JkX3N0YXRzLT5iUGFja2V0VG9TZWxmID0gYnBhY2tldF90b3NlbGY7CisJcHN0YXRzLT5iSXNDQ0sgPSBwcmVjb3JkX3N0YXRzLT5iSXNDQ0sgPSBpc19jY2tfcmF0ZTsvL1JYX0hBTF9JU19DQ0tfUkFURShwRHJ2SW5mbyk7CisJcHN0YXRzLT5iUGFja2V0QmVhY29uID0gcHJlY29yZF9zdGF0cy0+YlBhY2tldEJlYWNvbiA9IGJQYWNrZXRCZWFjb247CisJcHN0YXRzLT5iVG9TZWxmQkEgPSBwcmVjb3JkX3N0YXRzLT5iVG9TZWxmQkEgPSBiVG9TZWxmQkE7CisKKwlwcnhwa3QgPSAodTgqKXBkcnZpbmZvOworCisJLyogTW92ZSBwb2ludGVyIHRvIHRoZSAxNnRoIGJ5dGVzLiBQaHkgc3RhdHVzIHN0YXJ0IGFkZHJlc3MuICovCisJcHJ4cGt0ICs9IHNpemVvZihyeF9kcnZpbmZvXzgxOXhfdXNiKTsKKworCS8qIEluaXRpYWwgdGhlIGNjayBhbmQgb2ZkbSBidWZmZXIgcG9pbnRlciAqLworCXBjY2tfYnVmID0gKHBoeV9zdHNfY2NrXzgxOXh1c2JfdCAqKXByeHBrdDsKKwlwb2ZkbV9idWYgPSAocGh5X3N0c19vZmRtXzgxOXh1c2JfdCAqKXByeHBrdDsKKworCXBzdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVswXSA9IC0xOworCXBzdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOworCXByZWNvcmRfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMF0gPSAtMTsKKwlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzFdID0gLTE7CisKKwlpZihpc19jY2tfcmF0ZSkKKwl7CisJCS8vCisJCS8vICgxKUhhcmR3YXJlIGRvZXMgbm90IHByb3ZpZGUgUlNTSSBmb3IgQ0NLCisJCS8vCisKKwkJLy8KKwkJLy8gKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieSBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpCisJCS8vCisJCXU4IHJlcG9ydDsvLywgY2NrX2FnY19ycHQ7CisKKwkJcHJpdi0+c3RhdHMubnVtcXJ5X3BoeXN0YXR1c0NDSysrOworCisJCWlmKCFwcml2LT5iQ2NrSGlnaFBvd2VyKQorCQl7CisJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweGMwOworCQkJcmVwb3J0ID0gcmVwb3J0Pj42OworCQkJc3dpdGNoKHJlcG9ydCkKKwkJCXsKKwkJCQkvL0ZpeGVkIGJ5IEphY2tlbiBmcm9tIEJyeWFudCAyMDA4LTAzLTIwCisJCQkJLy9PcmlnaW5hbCB2YWx1ZSBpcyAtMzggLCAtMjYgLCAtMTQgLCAtMgorCQkJCS8vRml4ZWQgdmFsdWUgaXMgLTM1ICwgLTIzICwgLTExICwgNgorCQkJCWNhc2UgMHgzOgorCQkJCQlyeF9wd3JfYWxsID0gLTM1IC0gKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4M2UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MjoKKwkJCQkJcnhfcHdyX2FsbCA9IC0yMyAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDE6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMTEgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwOgorCQkJCQlyeF9wd3JfYWxsID0gNiAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDNlKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDYwOworCQkJcmVwb3J0ID0gcmVwb3J0Pj41OworCQkJc3dpdGNoKHJlcG9ydCkKKwkJCXsKKwkJCQljYXNlIDB4MzoKKwkJCQkJcnhfcHdyX2FsbCA9IC0zNSAtICgocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgxZik8PDEpIDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDI6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMjMgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAweDE6CisJCQkJCXJ4X3B3cl9hbGwgPSAtMTEgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwOgorCQkJCQlyeF9wd3JfYWxsID0gNiAtICgocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgxZik8PDEpIDsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlwd2RiX2FsbCA9IHJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKHJ4X3B3cl9hbGwpOworCQlwc3RhdHMtPlJ4UFdEQkFsbCA9IHByZWNvcmRfc3RhdHMtPlJ4UFdEQkFsbCA9IHB3ZGJfYWxsOworCQlwc3RhdHMtPlJlY3ZTaWduYWxQb3dlciA9IHB3ZGJfYWxsOworCisJCS8vCisJCS8vICgzKSBHZXQgU2lnbmFsIFF1YWxpdHkgKEVWTSkKKwkJLy8KKwkJLy9pZihicGFja2V0X21hdGNoX2Jzc2lkKQorCQl7CisJCQl1OAlzcTsKKworCQkJaWYocHN0YXRzLT5SeFBXREJBbGwgPiA0MCkKKwkJCXsKKwkJCQlzcSA9IDEwMDsKKwkJCX1lbHNlCisJCQl7CisJCQkJc3EgPSBwY2NrX2J1Zi0+c3FfcnB0OworCisJCQkJaWYocGNja19idWYtPnNxX3JwdCA+IDY0KQorCQkJCQlzcSA9IDA7CisJCQkJZWxzZSBpZiAocGNja19idWYtPnNxX3JwdCA8IDIwKQorCQkJCQlzcSA9IDEwMDsKKwkJCQllbHNlCisJCQkJCXNxID0gKCg2NC1zcSkgKiAxMDApIC8gNDQ7CisJCQl9CisJCQlwc3RhdHMtPlNpZ25hbFF1YWxpdHkgPSBwcmVjb3JkX3N0YXRzLT5TaWduYWxRdWFsaXR5ID0gc3E7CisJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMF0gPSBwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gc3E7CisJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSBwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzFdID0gLTE7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcHJpdi0+c3RhdHMubnVtcXJ5X3BoeXN0YXR1c0hUKys7CisJCS8vCisJCS8vICgxKUdldCBSU1NJIGZvciBIVCByYXRlCisJCS8vCisJCWZvcihpPVJGOTBfUEFUSF9BOyBpPHByaXYtPk51bVRvdGFsUkZQYXRoOyBpKyspCisJCXsKKwkJCS8vIDIwMDgvMDEvMzAgTUggd2Ugd2lsbCBqdWRnZSBSRiBSWCBwYXRoIG5vdy4KKwkJCWlmIChwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldKQorCQkJCXJmX3J4X251bSsrOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCisJCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHByaXYtPmllZWU4MDIxMS0+ZGV2LCBpKSkKKwkJCQljb250aW51ZTsKKworCQkJLy9GaXhlZCBieSBKYWNrZW4gZnJvbSBCcnlhbnQgMjAwOC0wMy0yMAorCQkJLy9PcmlnaW5hbCB2YWx1ZSBpcyAxMDYKKwkJCXJ4X3B3cltpXSA9ICgocG9mZG1fYnVmLT50cnN3X2dhaW5fWFtpXSYweDNGKSoyKSAtIDEwNjsKKworCQkJLy9HZXQgUnggc25yIHZhbHVlIGluIERCCisJCQl0bXBfcnhzbnIgPQlwb2ZkbV9idWYtPnJ4c25yX1hbaV07CisJCQlyeF9zbnJYID0gKGNoYXIpKHRtcF9yeHNucik7CisJCQkvL3J4X3NuclggPj49IDE7OworCQkJcnhfc25yWCAvPSAyOworCQkJcHJpdi0+c3RhdHMucnhTTlJkQltpXSA9IChsb25nKXJ4X3Nuclg7CisKKwkJCS8qIFRyYW5zbGF0ZSBEQk0gdG8gcGVyY2VudGFnZS4gKi8KKwkJCVJTU0kgPSBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JbaV0pOworCQkJdG90YWxfcnNzaSArPSBSU1NJOworCisJCQkvKiBSZWNvcmQgU2lnbmFsIFN0cmVuZ3RoIGZvciBuZXh0IHBhY2tldCAqLworCQkJLy9pZihicGFja2V0X21hdGNoX2Jzc2lkKQorCQkJeworCQkJCXBzdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbaV0gPSh1OCkgUlNTSTsKKwkJCQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtpXSA9KHU4KSBSU1NJOworCQkJfQorCQl9CisKKworCQkvLworCQkvLyAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5IGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkKKwkJLy8KKwkJLy9GaXhlZCBieSBKYWNrZW4gZnJvbSBCcnlhbnQgMjAwOC0wMy0yMAorCQkvL09yaWdpbmFsIHZhbHVlIGlzIDEwNgorCQlyeF9wd3JfYWxsID0gKCgocG9mZG1fYnVmLT5wd2RiX2FsbCApID4+IDEgKSYgMHg3ZikgLTEwNjsKKwkJcHdkYl9hbGwgPSBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKKworCQlwc3RhdHMtPlJ4UFdEQkFsbCA9IHByZWNvcmRfc3RhdHMtPlJ4UFdEQkFsbCA9IHB3ZGJfYWxsOworCQlwc3RhdHMtPlJ4UG93ZXIgPSBwcmVjb3JkX3N0YXRzLT5SeFBvd2VyID0gIHJ4X3B3cl9hbGw7CisKKwkJLy8KKwkJLy8gKDMpRVZNIG9mIEhUIHJhdGUKKwkJLy8KKwkJaWYocGRydmluZm8tPlJ4SFQgJiYgcGRydmluZm8tPlJ4UmF0ZT49REVTQzkwX1JBVEVNQ1M4ICYmCisJCQlwZHJ2aW5mby0+UnhSYXRlPD1ERVNDOTBfUkFURU1DUzE1KQorCQkJbWF4X3NwYXRpYWxfc3RyZWFtID0gMjsgLy9ib3RoIHNwYXRpYWwgc3RyZWFtIG1ha2Ugc2Vuc2UKKwkJZWxzZQorCQkJbWF4X3NwYXRpYWxfc3RyZWFtID0gMTsgLy9vbmx5IHNwYXRpYWwgc3RyZWFtIDEgbWFrZXMgc2Vuc2UKKworCQlmb3IoaT0wOyBpPG1heF9zcGF0aWFsX3N0cmVhbTsgaSsrKQorCQl7CisJCQl0bXBfcnhldm0gPQlwb2ZkbV9idWYtPnJ4ZXZtX1hbaV07CisJCQlyeF9ldm1YID0gKGNoYXIpKHRtcF9yeGV2bSk7CisKKwkJCS8vIERvIG5vdCB1c2Ugc2hpZnQgb3BlcmF0aW9uIGxpa2UgInJ4X2V2bVggPj49IDEiIGJlY2F1c2UgdGhlIGNvbXBpbG9yIG9mIGZyZWUgYnVpbGQgZW52aXJvbm1lbnQKKwkJCS8vIGZpbGwgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gInplcm8iIHdoZW4gZG9pbmcgc2hpZnRpbmcgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2UgYSBuZWdhdGl2ZQorCQkJLy8gdmFsdWUgdG8gcG9zaXRpdmUgb25lLCB0aGVuIHRoZSBkYm0gdmFsdWUgKHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIG5lZ2F0aXZlKSAgaXMgbm90IGNvcnJlY3QgYW55bW9yZS4KKwkJCXJ4X2V2bVggLz0gMjsJLy9kYm0KKworCQkJZXZtID0gcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UocnhfZXZtWCk7CisJCQkvL2lmKGJwYWNrZXRfbWF0Y2hfYnNzaWQpCisJCQl7CisJCQkJaWYoaT09MCkgLy8gRmlsbCB2YWx1ZSBpbiBSRkQsIEdldCB0aGUgZmlyc3Qgc3BhdGlhbCBzdHJlYW0gb25seQorCQkJCQlwc3RhdHMtPlNpZ25hbFF1YWxpdHkgPSBwcmVjb3JkX3N0YXRzLT5TaWduYWxRdWFsaXR5ID0gKHU4KShldm0gJiAweGZmKTsKKwkJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbaV0gPSBwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0gKHU4KShldm0gJiAweGZmKTsKKwkJCX0KKwkJfQorCisKKwkJLyogcmVjb3JkIHJ4IHN0YXRpc3RpY3MgZm9yIGRlYnVnICovCisJCXJ4c2Nfc2dpZW5fZXhmbGcgPSBwb2ZkbV9idWYtPnJ4c2Nfc2dpZW5fZXhmbGc7CisJCXByeHNjID0JKHBoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWcgKikmcnhzY19zZ2llbl9leGZsZzsKKwkJaWYocGRydmluZm8tPkJXKQkvLzQwTSBjaGFubmVsCisJCQlwcml2LT5zdGF0cy5yZWNlaXZlZF9id3R5cGVbMStwcnhzYy0+cnhzY10rKzsKKwkJZWxzZQkJCQkvLzIwTSBjaGFubmVsCisJCQlwcml2LT5zdGF0cy5yZWNlaXZlZF9id3R5cGVbMF0rKzsKKwl9CisKKwkvL1VJIEJTUyBMaXN0IHNpZ25hbCBzdHJlbmd0aChpbiBwZXJjZW50YWdlKSwgbWFrZSBpdCBnb29kIGxvb2tpbmcsIGZyb20gMH4xMDAuCisJLy9JdCBpcyBhc3NpZ25lZCB0byB0aGUgQlNTIExpc3QgaW4gR2V0VmFsdWVGcm9tQmVhY29uT3JQcm9iZVJzcCgpLgorCWlmKGlzX2Nja19yYXRlKQorCXsKKwkJcHN0YXRzLT5TaWduYWxTdHJlbmd0aCA9IHByZWNvcmRfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0gKHU4KShydGw4MTl4X3NpZ25hbF9zY2FsZV9tYXBwaW5nKChsb25nKXB3ZGJfYWxsKSk7Ly9QV0RCX0FMTDsKKworCX0KKwllbHNlCisJeworCQkvL3BSZmQtPlN0YXR1cy5TaWduYWxTdHJlbmd0aCA9IHBSZWNvcmRSZmQtPlN0YXR1cy5TaWduYWxTdHJlbmd0aCA9ICh1OCkoU2lnbmFsU2NhbGVNYXBwaW5nKHRvdGFsX3Jzc2kvPVJGOTBfUEFUSF9NQVgpKTsvLyh1OCkodG90YWxfcnNzaS89UkY5MF9QQVRIX01BWCk7CisJCS8vIFdlIGNhbiBqdWRnZSBSWCBwYXRoIG51bWJlciBub3cuCisJCWlmIChyZl9yeF9udW0gIT0gMCkKKwkJCXBzdGF0cy0+U2lnbmFsU3RyZW5ndGggPSBwcmVjb3JkX3N0YXRzLT5TaWduYWxTdHJlbmd0aCA9ICh1OCkocnRsODE5eF9zaWduYWxfc2NhbGVfbWFwcGluZygobG9uZykodG90YWxfcnNzaS89cmZfcnhfbnVtKSkpOworCX0KK30JLyogUXVlcnlSeFBoeVN0YXR1czgxOTBQY2kgKi8KKwordm9pZAorcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKglwc3JjX3N0YXRzLAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKglwdGFyZ2V0X3N0YXRzCispCit7CisJcHRhcmdldF9zdGF0cy0+YklzQU1QRFUgPSBwc3JjX3N0YXRzLT5iSXNBTVBEVTsKKwlwdGFyZ2V0X3N0YXRzLT5iRmlyc3RNUERVID0gcHNyY19zdGF0cy0+YkZpcnN0TVBEVTsKKwlwdGFyZ2V0X3N0YXRzLT5TZXFfTnVtID0gcHNyY19zdGF0cy0+U2VxX051bTsKK30KKworCit2b2lkIFRyYW5zbGF0ZVJ4U2lnbmFsU3R1ZmY4MTl4VXNiKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHBzdGF0cywKKwkJCQkgICByeF9kcnZpbmZvXzgxOXhfdXNiICAqcGRydmluZm8pCit7CisJLy8gVE9ETzogV2UgbXVzdCBvbmx5IGNoZWNrIHBhY2tldCBmb3IgY3VycmVudCBNQUMgYWRkcmVzcy4gTm90IGZpbmlzaAorCXJ0bDgxOTJfcnhfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PWluZm8tPmRldjsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbCBicGFja2V0X21hdGNoX2Jzc2lkLCBicGFja2V0X3Rvc2VsZjsKKwlib29sIGJQYWNrZXRCZWFjb249RkFMU0UsIGJUb1NlbGZCQT1GQUxTRTsKKwlzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAgcHJldmlvdXNfc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsvL2J5IGFteQorICAgICAgIHUxNiBmYyx0eXBlOworCisJLy8gR2V0IFNpZ25hbCBRdWFsaXR5IGZvciBvbmx5IFJYIGRhdGEgcXVldWUgKGJ1dCBub3QgY29tbWFuZCBxdWV1ZSkKKworCXU4KiB0bXBfYnVmOworCS8vdTE2IHRtcF9idWZfbGVuID0gMDsKKwl1OCAgKnByYWRkcjsKKworCS8qIEdldCBNQUMgZnJhbWUgc3RhcnQgYWRkcmVzcy4gKi8KKwl0bXBfYnVmID0gKHU4Kilza2ItPmRhdGE7Ly8gKyBnZXRfcnhwYWNrZXRfc2hpZnRieXRlc184MTl4dXNiKHBzdGF0cyk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKil0bXBfYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlwcmFkZHIgPSBoZHItPmFkZHIxOworCisJLyogQ2hlY2sgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBhY2NlcHRhYmUuICovCisJYnBhY2tldF9tYXRjaF9ic3NpZCA9ICgoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgorCQkJCQkJCShlcU1hY0FkZHIocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsICAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKT8gaGRyLT5hZGRyMSA6IChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUyApPyBoZHItPmFkZHIyIDogaGRyLT5hZGRyMykpCisJCQkJCQkJCSAmJiAoIXBzdGF0cy0+Ykh3RXJyb3IpICYmICghcHN0YXRzLT5iQ1JDKSYmICghcHN0YXRzLT5iSUNWKSk7CisJYnBhY2tldF90b3NlbGYgPSAgYnBhY2tldF9tYXRjaF9ic3NpZCAmIChlcU1hY0FkZHIocHJhZGRyLCBwcml2LT5pZWVlODAyMTEtPmRldi0+ZGV2X2FkZHIpKTsKKworCQlpZihXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKKwkJeworCQkJYlBhY2tldEJlYWNvbiA9IHRydWU7CisJCQkvL0RiZ1ByaW50KCJCZWFjb24gMiwgTWF0Y2hCU1NJRCA9ICVkLCBUb1NlbGYgPSAlZCBcbiIsIGJQYWNrZXRNYXRjaEJTU0lELCBiUGFja2V0VG9TZWxmKTsKKwkJfQorCQlpZihXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpID09IElFRUU4MDIxMV9TVFlQRV9CTE9DS0FDSykKKwkJeworCQkJaWYoKGVxTWFjQWRkcihwcmFkZHIsZGV2LT5kZXZfYWRkcikpKQorCQkJCWJUb1NlbGZCQSA9IHRydWU7CisJCQkJLy9EYmdQcmludCgiQmxvY2tBY2ssIE1hdGNoQlNTSUQgPSAlZCwgVG9TZWxmID0gJWQgXG4iLCBiUGFja2V0TWF0Y2hCU1NJRCwgYlBhY2tldFRvU2VsZik7CisJCX0KKworCisKKwlpZihicGFja2V0X21hdGNoX2Jzc2lkKQorCXsKKwkJcHJpdi0+c3RhdHMubnVtcGFja2V0X21hdGNoYnNzaWQrKzsKKwl9CisJaWYoYnBhY2tldF90b3NlbGYpeworCQlwcml2LT5zdGF0cy5udW1wYWNrZXRfdG9zZWxmKys7CisJfQorCS8vCisJLy8gUHJvY2VzcyBQSFkgaW5mb3JtYXRpb24gZm9yIHByZXZpb3VzIHBhY2tldCAoUlNTSS9QV0RCL0VWTSkKKwkvLworCS8vIEJlY2F1c2UgcGh5IGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGFzdCBwYWNrZXQgb2YgQU1QRFUgb25seSwgc28gZHJpdmVyCisJLy8gc2hvdWxkIHByb2Nlc3MgcGh5IGluZm9ybWF0aW9uIG9mIHByZXZpb3VzIHBhY2tldAorCXJ0bDgxOTJfcHJvY2Vzc19waHlpbmZvKHByaXYsIHRtcF9idWYsICZwcmV2aW91c19zdGF0cywgcHN0YXRzKTsKKwlydGw4MTkyX3F1ZXJ5X3J4cGh5c3RhdHVzKHByaXYsIHBzdGF0cywgcGRydmluZm8sICZwcmV2aW91c19zdGF0cywgYnBhY2tldF9tYXRjaF9ic3NpZCxicGFja2V0X3Rvc2VsZixiUGFja2V0QmVhY29uLGJUb1NlbGZCQSk7CisJcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKHBzdGF0cywgJnByZXZpb3VzX3N0YXRzKTsKKworfQorCisvKioKKyogRnVuY3Rpb246CVVwZGF0ZVJlY2VpdmVkUmF0ZUhpc3RvZ3JhbVN0YXRpc3RpY3MKKyogT3ZlcnZpZXc6CVJlY29yZWQgZG93biB0aGUgcmVjZWl2ZWQgZGF0YSByYXRlCisqCisqIElucHV0OgorKiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldgorKglzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cworKgorKiBPdXRwdXQ6CisqCisqCQkJKHByaXYtPnN0YXRzLlJlY2VpdmVkUmF0ZUhpc3RvZ3JhbVtdIGlzIHVwZGF0ZWQpCisqIFJldHVybjoKKyoJCU5vbmUKKyovCit2b2lkCitVcGRhdGVSZWNlaXZlZFJhdGVIaXN0b2dyYW1TdGF0aXN0aWNzODE5MCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzCisJKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgcmN2VHlwZT0xOyAgIC8vMDogVG90YWwsIDE6T0ssIDI6Q1JDLCAzOklDVgorCXUzMiByYXRlSW5kZXg7CisJdTMyIHByZWFtYmxlX2d1YXJkaW50ZXJ2YWw7ICAvLzE6IHNob3J0IHByZWFtYmxlL0dJLCAwOiBsb25nIHByZWFtYmxlL0dJCisKKworCWlmKHN0YXRzLT5iQ1JDKQorCXJjdlR5cGUgPSAyOworCWVsc2UgaWYoc3RhdHMtPmJJQ1YpCisJcmN2VHlwZSA9IDM7CisKKwlpZihzdGF0cy0+YlNob3J0UHJlYW1ibGUpCisJcHJlYW1ibGVfZ3VhcmRpbnRlcnZhbCA9IDE7Ly8gc2hvcnQKKwllbHNlCisJcHJlYW1ibGVfZ3VhcmRpbnRlcnZhbCA9IDA7Ly8gbG9uZworCisJc3dpdGNoKHN0YXRzLT5yYXRlKQorCXsKKwkJLy8KKwkJLy8gQ0NLIHJhdGUKKwkJLy8KKwkJY2FzZSBNR05fMU06ICAgIHJhdGVJbmRleCA9IDA7ICBicmVhazsKKwkJY2FzZSBNR05fMk06ICAgIHJhdGVJbmRleCA9IDE7ICBicmVhazsKKwkJY2FzZSBNR05fNV81TTogIHJhdGVJbmRleCA9IDI7ICBicmVhazsKKwkJY2FzZSBNR05fMTFNOiAgIHJhdGVJbmRleCA9IDM7ICBicmVhazsKKwkJLy8KKwkJLy8gTGVnYWN5IE9GRE0gcmF0ZQorCQkvLworCQljYXNlIE1HTl82TTogICAgcmF0ZUluZGV4ID0gNDsgIGJyZWFrOworCQljYXNlIE1HTl85TTogICAgcmF0ZUluZGV4ID0gNTsgIGJyZWFrOworCQljYXNlIE1HTl8xMk06ICAgcmF0ZUluZGV4ID0gNjsgIGJyZWFrOworCQljYXNlIE1HTl8xOE06ICAgcmF0ZUluZGV4ID0gNzsgIGJyZWFrOworCQljYXNlIE1HTl8yNE06ICAgcmF0ZUluZGV4ID0gODsgIGJyZWFrOworCQljYXNlIE1HTl8zNk06ICAgcmF0ZUluZGV4ID0gOTsgIGJyZWFrOworCQljYXNlIE1HTl80OE06ICAgcmF0ZUluZGV4ID0gMTA7IGJyZWFrOworCQljYXNlIE1HTl81NE06ICAgcmF0ZUluZGV4ID0gMTE7IGJyZWFrOworCQkvLworCQkvLyAxMW4gSGlnaCB0aHJvdWdocHV0IHJhdGUKKwkJLy8KKwkJY2FzZSBNR05fTUNTMDogIHJhdGVJbmRleCA9IDEyOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTogIHJhdGVJbmRleCA9IDEzOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMjogIHJhdGVJbmRleCA9IDE0OyBicmVhazsKKwkJY2FzZSBNR05fTUNTMzogIHJhdGVJbmRleCA9IDE1OyBicmVhazsKKwkJY2FzZSBNR05fTUNTNDogIHJhdGVJbmRleCA9IDE2OyBicmVhazsKKwkJY2FzZSBNR05fTUNTNTogIHJhdGVJbmRleCA9IDE3OyBicmVhazsKKwkJY2FzZSBNR05fTUNTNjogIHJhdGVJbmRleCA9IDE4OyBicmVhazsKKwkJY2FzZSBNR05fTUNTNzogIHJhdGVJbmRleCA9IDE5OyBicmVhazsKKwkJY2FzZSBNR05fTUNTODogIHJhdGVJbmRleCA9IDIwOyBicmVhazsKKwkJY2FzZSBNR05fTUNTOTogIHJhdGVJbmRleCA9IDIxOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTA6IHJhdGVJbmRleCA9IDIyOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTE6IHJhdGVJbmRleCA9IDIzOyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTI6IHJhdGVJbmRleCA9IDI0OyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTM6IHJhdGVJbmRleCA9IDI1OyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTQ6IHJhdGVJbmRleCA9IDI2OyBicmVhazsKKwkJY2FzZSBNR05fTUNTMTU6IHJhdGVJbmRleCA9IDI3OyBicmVhazsKKwkJZGVmYXVsdDogICAgICAgIHJhdGVJbmRleCA9IDI4OyBicmVhazsKKwl9CisgICAgcHJpdi0+c3RhdHMucmVjZWl2ZWRfcHJlYW1ibGVfR0lbcHJlYW1ibGVfZ3VhcmRpbnRlcnZhbF1bcmF0ZUluZGV4XSsrOworICAgIHByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtWzBdW3JhdGVJbmRleF0rKzsgLy90b3RhbAorICAgIHByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtW3JjdlR5cGVdW3JhdGVJbmRleF0rKzsKK30KKworCit2b2lkIHF1ZXJ5X3J4ZGVzY19zdGF0dXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqc3RhdHMsIGJvb2wgYklzUnhBZ2dyU3ViZnJhbWUpCit7CisJcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY9aW5mby0+ZGV2OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3J4X2Rlc2NfODE5eF91c2IgKmRlc2MgPSAocnhfZGVzY184MTl4X3VzYiAqKXNrYi0+ZGF0YTsKKwlyeF9kcnZpbmZvXzgxOXhfdXNiICAqZHJpdmVyX2luZm8gPSBOVUxMOworCisJLy8KKwkvL0dldCBSeCBEZXNjcmlwdG9yIEluZm9ybWF0aW9uCisJLy8KKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCWlmIChiSXNSeEFnZ3JTdWJmcmFtZSkKKwl7CisJCXJ4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSAqZGVzYyA9IChyeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUgKilza2ItPmRhdGE7CisJCXN0YXRzLT5MZW5ndGggPSBkZXNjLT5MZW5ndGggOworCQlzdGF0cy0+UnhEcnZJbmZvU2l6ZSA9IGRlc2MtPlJ4RHJ2SW5mb1NpemU7CisJCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gMDsgLy9SeEJ1ZlNoaWZ0ID0gMiBpbiBSeERlc2MsIGJ1dCB1c2IgZGlkbid0IHNoaWZ0IGJ5dGVzIGluIGZhY3QuCisJCXN0YXRzLT5iSUNWID0gZGVzYy0+SUNWOworCQlzdGF0cy0+YkNSQyA9IGRlc2MtPkNSQzMyOworCQlzdGF0cy0+Ykh3RXJyb3IgPSBzdGF0cy0+YkNSQ3xzdGF0cy0+YklDVjsKKwkJc3RhdHMtPkRlY3J5cHRlZCA9ICFkZXNjLT5TV0RlYzsvL1JUTDgxOTAgc2V0IHRoaXMgYml0IHRvIGluZGljYXRlIHRoYXQgSHcgZG9lcyBub3QgZGVjcnlwdCBwYWNrZXQKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJcnhfZGVzY184MTl4X3VzYiAqZGVzYyA9IChyeF9kZXNjXzgxOXhfdXNiICopc2tiLT5kYXRhOworCisJCXN0YXRzLT5MZW5ndGggPSBkZXNjLT5MZW5ndGg7CisJCXN0YXRzLT5SeERydkluZm9TaXplID0gZGVzYy0+UnhEcnZJbmZvU2l6ZTsKKwkJc3RhdHMtPlJ4QnVmU2hpZnQgPSAwOy8vZGVzYy0+U2hpZnQmMHgwMzsKKwkJc3RhdHMtPmJJQ1YgPSBkZXNjLT5JQ1Y7CisJCXN0YXRzLT5iQ1JDID0gZGVzYy0+Q1JDMzI7CisJCXN0YXRzLT5iSHdFcnJvciA9IHN0YXRzLT5iQ1JDfHN0YXRzLT5iSUNWOworCQkvL1JUTDgxOTAgc2V0IHRoaXMgYml0IHRvIGluZGljYXRlIHRoYXQgSHcgZG9lcyBub3QgZGVjcnlwdCBwYWNrZXQKKwkJc3RhdHMtPkRlY3J5cHRlZCA9ICFkZXNjLT5TV0RlYzsKKwl9CisKKwlpZigocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSB0cnVlKSAmJiAocHJpdi0+aWVlZTgwMjExLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9DQ01QKSkKKwl7CisJCXN0YXRzLT5iSHdFcnJvciA9IGZhbHNlOworCX0KKwllbHNlCisJeworCQlzdGF0cy0+Ykh3RXJyb3IgPSBzdGF0cy0+YkNSQ3xzdGF0cy0+YklDVjsKKwl9CisKKwlpZihzdGF0cy0+TGVuZ3RoIDwgMjQgfHwgc3RhdHMtPkxlbmd0aCA+IE1BWF84MTkyVV9SWF9TSVpFKQorCQlzdGF0cy0+Ykh3RXJyb3IgfD0gMTsKKwkvLworCS8vR2V0IERyaXZlciBJbmZvCisJLy8KKwkvLyBUT0RPOiBOZWVkIHRvIHZlcmlmeSBpdCBvbiBGR1BBIHBsYXRmb3JtCisJLy9Ecml2ZXIgaW5mbyBhcmUgd3JpdHRlbiB0byB0aGUgUnhCdWZmZXIgZm9sbG93aW5nIHJ4IGRlc2MKKwlpZiAoc3RhdHMtPlJ4RHJ2SW5mb1NpemUgIT0gMCkgeworCQlkcml2ZXJfaW5mbyA9IChyeF9kcnZpbmZvXzgxOXhfdXNiICopKHNrYi0+ZGF0YSArIHNpemVvZihyeF9kZXNjXzgxOXhfdXNiKSArIFwKKwkJCQlzdGF0cy0+UnhCdWZTaGlmdCk7CisJCS8qIHVuaXQ6IDAuNU0gKi8KKwkJLyogVE9ETyAqLworCQlpZighc3RhdHMtPmJId0Vycm9yKXsKKwkJCXU4CXJldF9yYXRlOworCQkJcmV0X3JhdGUgPSBId1JhdGVUb01SYXRlOTAoZHJpdmVyX2luZm8tPlJ4SFQsIGRyaXZlcl9pbmZvLT5SeFJhdGUpOworCQkJaWYocmV0X3JhdGUgPT0gMHhmZikKKwkJCXsKKwkJCQkvLyBBYm5vcm1hbCBDYXNlOiBSZWNlaXZlIENSQyBPSyBwYWNrZXQgd2l0aCBSeCBkZXNjcmlwdG9yIGluZGljYXRpbmcgbm9uIHN1cHBvcnRlZCByYXRlLgorCQkJCS8vIFNwZWNpYWwgRXJyb3IgSGFuZGxpbmcgaGVyZSwgMjAwOC4wNS4xNiwgYnkgRW1pbHkKKworCQkJCXN0YXRzLT5iSHdFcnJvciA9IDE7CisJCQkJc3RhdHMtPnJhdGUgPSBNR05fMU07CS8vU2V0IDFNIHJhdGUgYnkgZGVmYXVsdAorCQkJfWVsc2UKKwkJCXsKKwkJCQlzdGF0cy0+cmF0ZSA9IHJldF9yYXRlOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXN0YXRzLT5yYXRlID0gMHgwMjsKKworCQlzdGF0cy0+YlNob3J0UHJlYW1ibGUgPSBkcml2ZXJfaW5mby0+U1BMQ1A7CisKKworCQlVcGRhdGVSZWNlaXZlZFJhdGVIaXN0b2dyYW1TdGF0aXN0aWNzODE5MChkZXYsIHN0YXRzKTsKKworCQlzdGF0cy0+YklzQU1QRFUgPSAoZHJpdmVyX2luZm8tPlBhcnRBZ2dyPT0xKTsKKwkJc3RhdHMtPmJGaXJzdE1QRFUgPSAoZHJpdmVyX2luZm8tPlBhcnRBZ2dyPT0xKSAmJiAoZHJpdmVyX2luZm8tPkZpcnN0QUdHUj09MSk7CisJCXN0YXRzLT5UaW1lU3RhbXBMb3cgPSBkcml2ZXJfaW5mby0+VFNGTDsKKwkJLy8geGlvbmcgbWFzayBpdCwgMDcwNTE0CisJCS8vcFJmZC0+U3RhdHVzLlRpbWVTdGFtcEhpZ2ggPSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoQWRhcHRlciwgVFNGUis0KTsKKwkJLy8gc3RhdHMtPlRpbWVTdGFtcEhpZ2ggPSByZWFkX25pY19kd29yZChkZXYsICBUU0ZSKzQpOworCisJCVVwZGF0ZVJ4UGt0VGltZVN0YW1wODE5MChkZXYsIHN0YXRzKTsKKworCQkvLworCQkvLyBSeCBBLU1QRFUKKwkJLy8KKwkJaWYoZHJpdmVyX2luZm8tPkZpcnN0QUdHUj09MSB8fCBkcml2ZXJfaW5mby0+UGFydEFnZ3IgPT0gMSkKKwkJCVJUX1RSQUNFKENPTVBfUlhERVNDLCAiZHJpdmVyX2luZm8tPkZpcnN0QUdHUiA9ICVkLCBkcml2ZXJfaW5mby0+UGFydEFnZ3IgPSAlZFxuIiwKKwkJCQkJZHJpdmVyX2luZm8tPkZpcnN0QUdHUiwgZHJpdmVyX2luZm8tPlBhcnRBZ2dyKTsKKworCX0KKworCXNrYl9wdWxsKHNrYixzaXplb2YocnhfZGVzY184MTl4X3VzYikpOworCS8vCisJLy8gR2V0IFRvdGFsIG9mZnNldCBvZiBNUERVIEZyYW1lIEJvZHkKKwkvLworCWlmKChzdGF0cy0+UnhCdWZTaGlmdCArIHN0YXRzLT5SeERydkluZm9TaXplKSA+IDApIHsKKwkJc3RhdHMtPmJTaGlmdCA9IDE7CisJCXNrYl9wdWxsKHNrYixzdGF0cy0+UnhCdWZTaGlmdCArIHN0YXRzLT5SeERydkluZm9TaXplKTsKKwl9CisKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCS8qIGZvciB0aGUgcnggYWdncmVnYXRlZCBzdWIgZnJhbWUsIHRoZSByZWR1bmRhbnQgc3BhY2UgdHJ1ZWxseSBjb250YWluZWQgaW4gdGhlIHBhY2tldCAqLworCWlmKGJJc1J4QWdnclN1YmZyYW1lKSB7CisJCXNrYl9wdWxsKHNrYiwgOCk7CisJfQorI2VuZGlmCisJLyogZm9yIGRlYnVnIDIwMDguNS4yOSAqLworCisJLy9hZGRlZCBieSB2aXZpLCBmb3IgTVAsIDIwMDgwMTA4CisJc3RhdHMtPlJ4SXM0ME1IelBhY2tldCA9IGRyaXZlcl9pbmZvLT5CVzsKKwlpZihzdGF0cy0+UnhEcnZJbmZvU2l6ZSAhPSAwKQorCQlUcmFuc2xhdGVSeFNpZ25hbFN0dWZmODE5eFVzYihza2IsIHN0YXRzLCBkcml2ZXJfaW5mbyk7CisKK30KKwordTMyIEdldFJ4UGFja2V0U2hpZnRCeXRlczgxOXhVc2Ioc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAgKlN0YXR1cywgYm9vbCBiSXNSeEFnZ3JTdWJmcmFtZSkKK3sKKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCWlmIChiSXNSeEFnZ3JTdWJmcmFtZSkKKwkJcmV0dXJuIChzaXplb2YocnhfZGVzY184MTl4X3VzYikgKyBTdGF0dXMtPlJ4RHJ2SW5mb1NpemUKKwkJCSsgU3RhdHVzLT5SeEJ1ZlNoaWZ0ICsgOCk7CisJZWxzZQorI2VuZGlmCisJCXJldHVybiAoc2l6ZW9mKHJ4X2Rlc2NfODE5eF91c2IpICsgU3RhdHVzLT5SeERydkluZm9TaXplCisJCQkJKyBTdGF0dXMtPlJ4QnVmU2hpZnQpOworfQorCit2b2lkIHJ0bDgxOTJfcnhfbm9tYWwoc3RydWN0IHNrX2J1ZmYqIHNrYikKK3sKKwlydGw4MTkyX3J4X2luZm8gKmluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldj1pbmZvLT5kZXY7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHMgPSB7CisJCS5zaWduYWwgPSAwLAorCQkubm9pc2UgPSAtOTgsCisJCS5yYXRlID0gMCwKKwkJLy8gICAgICAubWFjX3RpbWUgPSBqaWZmaWVzLAorCQkuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5ELAorCX07CisJdTMyIHJ4X3BrdF9sZW4gPSAwOworCXN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICppZWVlODAyMTFfaGRyID0gTlVMTDsKKwlib29sIHVuaWNhc3RfcGFja2V0ID0gZmFsc2U7CisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwlzdHJ1Y3Qgc2tfYnVmZiAqYWdnX3NrYiA9IE5VTEw7CisJdTMyICBUb3RhbExlbmd0aCA9IDA7CisJdTMyICBUZW1wRFdvcmQgPSAwOworCXUzMiAgUGFja2V0TGVuZ3RoID0gMDsKKwl1MzIgIFBhY2tldE9jY3VwaWVkTGVuZHRoID0gMDsKKwl1OCAgIFRlbXBCeXRlID0gMDsKKwl1MzIgIFBhY2tldFNoaWZ0Qnl0ZXMgPSAwOworCXJ4X2Rlc2NfODE5eF91c2JfYWdncl9zdWJmcmFtZSAqUnhEZXNjciA9IE5VTEw7CisJdTggIFBhZGRpbmdCeXRlcyA9IDA7CisJLy9hZGQganVzdCBmb3IgdGVzdGluZworCXU4ICAgdGVzdGluZzsKKworI2VuZGlmCisKKwkvKiAyMCBpcyBmb3IgcHMtcG9sbCAqLworCWlmKChza2ItPmxlbiA+PSgyMCArIHNpemVvZihyeF9kZXNjXzgxOXhfdXNiKSkpICYmIChza2ItPmxlbiA8IFJYX1VSQl9TSVpFKSkgeworI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJCVRlbXBCeXRlID0gKihza2ItPmRhdGEgKyBzaXplb2YocnhfZGVzY184MTl4X3VzYikpOworI2VuZGlmCisJCS8qIGZpcnN0IHBhY2tldCBzaG91bGQgbm90IGNvbnRhaW4gUnggYWdncmVnYXRpb24gaGVhZGVyICovCisJCXF1ZXJ5X3J4ZGVzY19zdGF0dXMoc2tiLCAmc3RhdHMsIGZhbHNlKTsKKwkJLyogVE9ETyAqLworCQkvKiBoYXJkd2FyZSByZWxhdGVkIGluZm8gKi8KKyNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAorCQlpZiAoVGVtcEJ5dGUgJiBCSVQwKSB7CisJCQlhZ2dfc2tiID0gc2tiOworCQkJLy9Ub3RhbExlbmd0aCA9IGFnZ19za2ItPmxlbiAtIDQ7IC8qc0NyY0xuZyovCisJCQlUb3RhbExlbmd0aCA9IHN0YXRzLkxlbmd0aCAtIDQ7IC8qc0NyY0xuZyovCisJCQkvL1JUX1RSQUNFKENPTVBfUkVDViwgIiVzOmZpcnN0IGFnZ3JlZ2F0ZWQgcGFja2V0IUxlbmd0aD0lZFxuIixfX0ZVTkNUSU9OX18sVG90YWxMZW5ndGgpOworCQkJLyogdGhvdWdoIHRoZSBoZWFkIHBvaW50ZXIgaGFzIHBhc3NlZCB0aGlzIHBvc2l0aW9uICAqLworCQkJVGVtcERXb3JkID0gKih1MzIgKikoYWdnX3NrYi0+ZGF0YSAtIDQpOworCQkJUGFja2V0TGVuZ3RoID0gKHUxNikoVGVtcERXb3JkICYgMHgzRkZGKTsgLypzQ3JjTG5nKi8KKwkJCXNrYiA9IGRldl9hbGxvY19za2IoUGFja2V0TGVuZ3RoKTsKKwkJCW1lbWNweShza2JfcHV0KHNrYixQYWNrZXRMZW5ndGgpLGFnZ19za2ItPmRhdGEsUGFja2V0TGVuZ3RoKTsKKwkJCVBhY2tldFNoaWZ0Qnl0ZXMgPSBHZXRSeFBhY2tldFNoaWZ0Qnl0ZXM4MTl4VXNiKCZzdGF0cywgZmFsc2UpOworCQl9CisjZW5kaWYKKwkJLyogUHJvY2VzcyB0aGUgTVBEVSByZWNldmllZCAqLworCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKKworCQlyeF9wa3RfbGVuID0gc2tiLT5sZW47CisJCWllZWU4MDIxMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIgKilza2ItPmRhdGE7CisJCXVuaWNhc3RfcGFja2V0ID0gZmFsc2U7CisJCWlmKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9oZHItPmFkZHIxKSkgeworCQkJLy9UT0RPCisJCX1lbHNlIGlmKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9oZHItPmFkZHIxKSl7CisJCQkvL1RPRE8KKwkJfWVsc2UgeworCQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KKwkJCXVuaWNhc3RfcGFja2V0ID0gdHJ1ZTsKKwkJfQorCisJCWlmKCFpZWVlODAyMTFfcngocHJpdi0+aWVlZTgwMjExLHNrYiwgJnN0YXRzKSkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRzLnJ4b2t0b3RhbCsrOworCQkJaWYodW5pY2FzdF9wYWNrZXQpIHsKKwkJCQlwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCArPSByeF9wa3RfbGVuOworCQkJfQorCQl9CisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwkJdGVzdGluZyA9IDE7CisJCS8vIChQaXBlSW5kZXggPT0gMCkgJiYgKFRlbXBCeXRlICYgQklUMCkgPT4gVG90YWxMZW5ndGggPiAwLgorCQlpZiAoVG90YWxMZW5ndGggPiAwKSB7CisJCQlQYWNrZXRPY2N1cGllZExlbmR0aCA9IFBhY2tldExlbmd0aCArIChQYWNrZXRTaGlmdEJ5dGVzICsgOCk7CisJCQlpZiAoKFBhY2tldE9jY3VwaWVkTGVuZHRoICYgMHhGRikgIT0gMCkKKwkJCQlQYWNrZXRPY2N1cGllZExlbmR0aCA9IChQYWNrZXRPY2N1cGllZExlbmR0aCAmIDB4RkZGRkZGMDApICsgMjU2OworCQkJUGFja2V0T2NjdXBpZWRMZW5kdGggLT0gODsKKwkJCVRlbXBEV29yZCA9IFBhY2tldE9jY3VwaWVkTGVuZHRoIC0gUGFja2V0U2hpZnRCeXRlczsgLyotIFBhY2tldExlbmd0aCAqLworCQkJaWYgKGFnZ19za2ItPmxlbiA+IFRlbXBEV29yZCkKKwkJCQlza2JfcHVsbChhZ2dfc2tiLCBUZW1wRFdvcmQpOworCQkJZWxzZQorCQkJCWFnZ19za2ItPmxlbiA9IDA7CisKKwkJCXdoaWxlIChhZ2dfc2tiLT5sZW4+PUdldFJ4UGFja2V0U2hpZnRCeXRlczgxOXhVc2IoJnN0YXRzLCB0cnVlKSkgeworCQkJCXU4IHRtcENSQyA9IDAsIHRtcElDViA9IDA7CisJCQkJLy9SVF9UUkFDRShDT01QX1JFQ1YsIiVzOmFnZ3JlZCBwa3QsdG90YWxfbGVuID0gJWRcbiIsX19GVU5DVElPTl9fLGFnZ19za2ItPmxlbik7CisJCQkJUnhEZXNjciA9IChyeF9kZXNjXzgxOXhfdXNiX2FnZ3Jfc3ViZnJhbWUgKikoYWdnX3NrYi0+ZGF0YSk7CisJCQkJdG1wQ1JDID0gUnhEZXNjci0+Q1JDMzI7CisJCQkJdG1wSUNWID0gUnhEZXNjci0+SUNWOworCQkJCW1lbWNweShhZ2dfc2tiLT5kYXRhLCAmYWdnX3NrYi0+ZGF0YVs0NF0sIDIpOworCQkJCVJ4RGVzY3ItPkNSQzMyID0gdG1wQ1JDOworCQkJCVJ4RGVzY3ItPklDViA9IHRtcElDVjsKKworCQkJCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKSk7CisJCQkJc3RhdHMuc2lnbmFsID0gMDsKKwkJCQlzdGF0cy5ub2lzZSA9IC05ODsKKwkJCQlzdGF0cy5yYXRlID0gMDsKKwkJCQlzdGF0cy5mcmVxID0gSUVFRTgwMjExXzI0R0haX0JBTkQ7CisJCQkJcXVlcnlfcnhkZXNjX3N0YXR1cyhhZ2dfc2tiLCAmc3RhdHMsIHRydWUpOworCQkJCVBhY2tldExlbmd0aCA9IHN0YXRzLkxlbmd0aDsKKworCQkJCWlmKFBhY2tldExlbmd0aCA+IGFnZ19za2ItPmxlbikgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogUHJvY2VzcyB0aGUgTVBEVSByZWNldmllZCAqLworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoUGFja2V0TGVuZ3RoKTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsUGFja2V0TGVuZ3RoKSxhZ2dfc2tiLT5kYXRhLCBQYWNrZXRMZW5ndGgpOworCQkJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0LypzQ3JjTG5nKi8pOworCisJCQkJcnhfcGt0X2xlbiA9IHNrYi0+bGVuOworCQkJCWllZWU4MDIxMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIgKilza2ItPmRhdGE7CisJCQkJdW5pY2FzdF9wYWNrZXQgPSBmYWxzZTsKKwkJCQlpZihpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfaGRyLT5hZGRyMSkpIHsKKwkJCQkJLy9UT0RPCisJCQkJfWVsc2UgaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaWVlZTgwMjExX2hkci0+YWRkcjEpKXsKKwkJCQkJLy9UT0RPCisJCQkJfWVsc2UgeworCQkJCQkvKiB1bmljYXN0IHBhY2tldCAqLworCQkJCQl1bmljYXN0X3BhY2tldCA9IHRydWU7CisJCQkJfQorCQkJCWlmKCFpZWVlODAyMTFfcngocHJpdi0+aWVlZTgwMjExLHNrYiwgJnN0YXRzKSkgeworCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaXYtPnN0YXRzLnJ4b2t0b3RhbCsrOworCQkJCQlpZih1bmljYXN0X3BhY2tldCkgeworCQkJCQkJcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgKz0gcnhfcGt0X2xlbjsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBzaG91bGQgdHJpbSB0aGUgcGFja2V0IHdoaWNoIGhhcyBiZWVuIGNvcGllZCB0byB0YXJnZXQgc2tiICovCisJCQkJc2tiX3B1bGwoYWdnX3NrYiwgUGFja2V0TGVuZ3RoKTsKKwkJCQlQYWNrZXRTaGlmdEJ5dGVzID0gR2V0UnhQYWNrZXRTaGlmdEJ5dGVzODE5eFVzYigmc3RhdHMsIHRydWUpOworCQkJCVBhY2tldE9jY3VwaWVkTGVuZHRoID0gUGFja2V0TGVuZ3RoICsgUGFja2V0U2hpZnRCeXRlczsKKwkJCQlpZiAoKFBhY2tldE9jY3VwaWVkTGVuZHRoICYgMHhGRikgIT0gMCkgeworCQkJCQlQYWRkaW5nQnl0ZXMgPSAyNTYgLSAoUGFja2V0T2NjdXBpZWRMZW5kdGggJiAweEZGKTsKKwkJCQkJaWYgKGFnZ19za2ItPmxlbiA+IFBhZGRpbmdCeXRlcykKKwkJCQkJCXNrYl9wdWxsKGFnZ19za2IsIFBhZGRpbmdCeXRlcyk7CisJCQkJCWVsc2UKKwkJCQkJCWFnZ19za2ItPmxlbiA9IDA7CisJCQkJfQorCQkJfQorCQkJZGV2X2tmcmVlX3NrYihhZ2dfc2tiKTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIHsKKwkJcHJpdi0+c3RhdHMucnh1cmJlcnIrKzsKKwkJcHJpbnRrKCJhY3R1YWxfbGVuZ3RoOiVkXG4iLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCit9CisKK3ZvaWQKK3J0bDgxOXh1c2JfcHJvY2Vzc19yZWNlaXZlZF9wYWNrZXQoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpwc3RhdHMKKwkpCit7CisvLwlib29sIGJmcmVlcmZkPWZhbHNlLCBicXVldWVkPWZhbHNlOworCXU4KiAJZnJhbWU7CisJdTE2ICAgICBmcmFtZV9sZW49MDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisvLwl1OAkJCWluZGV4ID0gMDsKKy8vCXU4CQkJVElEID0gMDsKKwkvL3UxNgkJCXNlcW51bSA9IDA7CisJLy9QUlhfVFNfUkVDT1JECXB0cyA9IE5VTEw7CisKKwkvLyBHZXQgc2hpZnRlZCBieXRlcyBvZiBTdGFydGluZyBhZGRyZXNzIG9mIDgwMi4xMSBoZWFkZXIuIDIwMDYuMDkuMjgsIGJ5IEVtaWx5CisJLy9wb3J0aW5nIGJ5IGFteSAwODA1MDgKKwlwc3RhdHMtPnZpcnR1YWxfYWRkcmVzcyArPSBnZXRfcnhwYWNrZXRfc2hpZnRieXRlc184MTl4dXNiKHBzdGF0cyk7CisJZnJhbWUgPSBwc3RhdHMtPnZpcnR1YWxfYWRkcmVzczsKKwlmcmFtZV9sZW4gPSBwc3RhdHMtPnBhY2tldGxlbmd0aDsKKyNpZmRlZiBUT0RPCS8vIGJ5IGFteSBhYm91dCBIQ1QKKwlpZighQWRhcHRlci0+YkluSGN0VGVzdCkKKwkJQ291bnRSeEVyclN0YXRpc3RpY3MoQWRhcHRlciwgcFJmZCk7CisjZW5kaWYKKwl7CisJI2lmZGVmIEVOQUJMRV9QUyAgLy9ieSBhbXkgZm9yIGFkZGluZyBwcyBmdW5jdGlvbiBpbiBmdXR1cmUKKwkJUlRfUkZfUE9XRVJfU1RBVEUgcnRTdGF0ZTsKKwkJLy8gV2hlbiBSRiBpcyBvZmYsIHdlIHNob3VsZCBub3QgY291bnQgdGhlIHBhY2tldCBmb3IgaHcvc3cgc3luY2hyb25pemUKKwkJLy8gcmVhc29uLCBpZS4gdGhlcmUgbWF5IGJlIGEgZHVyYXRpb24gd2hpbGUgc3cgc3dpdGNoIGlzIGNoYW5nZWQgYW5kIGh3CisJCS8vIHN3aXRjaCBpcyBiZWluZyBjaGFuZ2VkLiAyMDA2LjEyLjA0LCBieSBzaGllbiBjaGFuZy4KKwkJQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIoQWRhcHRlciwgSFdfVkFSX1JGX1NUQVRFLCAodTgqICkoJnJ0U3RhdGUpKTsKKwkJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkjZW5kaWYKKwlwcml2LT5zdGF0cy5yeGZyYW1nbWVudCsrOworCisJfQorI2lmZGVmIFRPRE8KKwlSbU1vbml0b3JTaWduYWxTdHJlbmd0aChBZGFwdGVyLCBwUmZkKTsKKyNlbmRpZgorCS8qIDIwMDcvMDEvMTYgTUggQWRkIFJYIGNvbW1hbmQgcGFja2V0IGhhbmRsZSBoZXJlLiAqLworCS8qIDIwMDcvMDMvMDEgTUggV2UgaGF2ZSB0byByZWxlYXNlIFJGRCBhbmQgcmV0dXJuIGlmIHJ4IHBrdCBpcyBjbWQgcGt0LiAqLworCWlmIChydGw4MTl4dXNiX3J4X2NvbW1hbmRfcGFja2V0KGRldiwgcHN0YXRzKSkKKwl7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBTV19DUkNfQ0hFQ0sKKwlTd0NyY0NoZWNrKCk7CisjZW5kaWYKKworCit9CisKK3ZvaWQgcXVlcnlfcnhfY21kcGt0X2Rlc2Nfc3RhdHVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQoreworLy8JcnRsODE5Ml9yeF9pbmZvICppbmZvID0gKHN0cnVjdCBydGw4MTkyX3J4X2luZm8gKilza2ItPmNiOworLy8Jc3RydWN0IG5ldF9kZXZpY2UgKmRldj1pbmZvLT5kZXY7CisvLwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisJcnhfZGVzY184MTl4X3VzYiAqZGVzYyA9IChyeF9kZXNjXzgxOXhfdXNiICopc2tiLT5kYXRhOworLy8JcnhfZHJ2aW5mb184MTl4X3VzYiAgKmRyaXZlcl9pbmZvOworCisJLy8KKwkvL0dldCBSeCBEZXNjcmlwdG9yIEluZm9ybWF0aW9uCisJLy8KKwlzdGF0cy0+dmlydHVhbF9hZGRyZXNzID0gKHU4Kilza2ItPmRhdGE7CisJc3RhdHMtPkxlbmd0aCA9IGRlc2MtPkxlbmd0aDsKKwlzdGF0cy0+UnhEcnZJbmZvU2l6ZSA9IDA7CisJc3RhdHMtPlJ4QnVmU2hpZnQgPSAwOworCXN0YXRzLT5wYWNrZXRsZW5ndGggPSBzdGF0cy0+TGVuZ3RoLXNjcmNsbmc7CisJc3RhdHMtPmZyYWdsZW5ndGggPSBzdGF0cy0+cGFja2V0bGVuZ3RoOworCXN0YXRzLT5mcmFnb2Zmc2V0ID0gMDsKKwlzdGF0cy0+bnRvdGFsZnJhZyA9IDE7Cit9CisKKwordm9pZCBydGw4MTkyX3J4X2NtZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBydGw4MTkyX3J4X2luZm8gKmluZm8gPSAoc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqKXNrYi0+Y2I7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKKwkvL2ludCByZXQ7CisvLwlzdHJ1Y3QgdXJiICpyeF91cmIgPSBpbmZvLT51cmI7CisJLyogVE9ETyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHMgPSB7CisJCS5zaWduYWwgPSAwLAorCQkubm9pc2UgPSAtOTgsCisJCS5yYXRlID0gMCwKKwkJLy8gICAgICAubWFjX3RpbWUgPSBqaWZmaWVzLAorCQkuZnJlcSA9IElFRUU4MDIxMV8yNEdIWl9CQU5ELAorCX07CisKKwlpZigoc2tiLT5sZW4gPj0oMjAgKyBzaXplb2YocnhfZGVzY184MTl4X3VzYikpKSAmJiAoc2tiLT5sZW4gPCBSWF9VUkJfU0laRSkpCisJeworCisJCXF1ZXJ5X3J4X2NtZHBrdF9kZXNjX3N0YXR1cyhza2IsJnN0YXRzKTsKKwkJLy8gdGhpcyBpcyB0byBiZSBkb25lIGJ5IGFteSAwODA1MDggICAgIHByZmQtPnF1ZXVlX2lkID0gMTsKKworCisJCS8vCisJCS8vICBQcm9jZXNzIHRoZSBjb21tYW5kIHBhY2tldCByZWNlaXZlZC4KKwkJLy8KKworCQlydGw4MTl4dXNiX3Byb2Nlc3NfcmVjZWl2ZWRfcGFja2V0KGRldiwmc3RhdHMpOworCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCWVsc2UKKwkJOworCisKK30KKwordm9pZCBydGw4MTkyX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0bDgxOTJfcnhfaW5mbyAqaW5mbzsKKworCXdoaWxlIChOVUxMICE9IChza2IgPSBza2JfZGVxdWV1ZSgmcHJpdi0+c2tiX3F1ZXVlKSkpIHsKKwkJaW5mbyA9IChzdHJ1Y3QgcnRsODE5Ml9yeF9pbmZvICopc2tiLT5jYjsKKwkJc3dpdGNoIChpbmZvLT5vdXRfcGlwZSkgeworCQkvKiBOb21hbCBwYWNrZXQgcGlwZSAqLworCQkJY2FzZSAzOgorCQkJCS8vUlRfVFJBQ0UoQ09NUF9SRUNWLCAibm9ybWFsIGluLXBpcGUgaW5kZXgoJWQpXG4iLGluZm8tPm91dF9waXBlKTsKKwkJCQlwcml2LT5JcnBQZW5kaW5nQ291bnQtLTsKKwkJCQlydGw4MTkyX3J4X25vbWFsKHNrYik7CisJCQkJYnJlYWs7CisKKwkJCQkvKiBDb21tYW5kIHBhY2tldCBwaXBlICovCisJCQljYXNlIDk6CisJCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLCAiY29tbWFuZCBpbi1waXBlIGluZGV4KCVkKVxuIixcCisJCQkJCQlpbmZvLT5vdXRfcGlwZSk7CisKKwkJCQlydGw4MTkyX3J4X2NtZChza2IpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OiAvKiBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUhICovCisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmtub3duIGluLXBpcGUgaW5kZXgoJWQpXG4iLFwKKwkJCQkJCWluZm8tPm91dF9waXBlKTsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJYnJlYWs7CisKKwkJfQorCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydGw4MTkyX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuICAgICAgICAgICAgICAgPSBydGw4MTkyX29wZW4sCisJLm5kb19zdG9wICAgICAgICAgICAgICAgPSBydGw4MTkyX2Nsb3NlLAorCS5uZG9fZ2V0X3N0YXRzICAgICAgICAgID0gcnRsODE5Ml9zdGF0cywKKwkubmRvX3R4X3RpbWVvdXQgICAgICAgICA9IHR4X3RpbWVvdXQsCisJLm5kb19kb19pb2N0bCAgICAgICAgICAgPSBydGw4MTkyX2lvY3RsLAorCS5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gcjgxOTJfc2V0X211bHRpY2FzdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyAgICA9IHI4MTkyX3NldF9tYWNfYWRyLAorCS5uZG9fdmFsaWRhdGVfYWRkciAgICAgID0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1ICAgICAgICAgPSBldGhfY2hhbmdlX210dSwKKwkubmRvX3N0YXJ0X3htaXQgICAgICAgICA9IGllZWU4MDIxMV94bWl0LAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQl9TVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxOTJfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKy8vCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdj0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiT29wczogaSdtIGNvbWluZ1xuIik7CisKKwlkZXYgPSBhbGxvY19pZWVlODAyMTEoc2l6ZW9mKHN0cnVjdCByODE5Ml9wcml2KSk7CisKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZpbnRmLT5kZXYpOworCXByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXByaXYtPmllZWU4MDIxMSA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+dWRldj11ZGV2OworCisJZGV2LT5uZXRkZXZfb3BzID0gJnJ0bDgxOTJfbmV0ZGV2X29wczsKKworCSAvL0RNRVNHKCJPb3BzOiBpJ20gY29taW5nXG4iKTsKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTIKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzOworI2VuZGlmCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKKyNlbmRpZgorCWRldi0+dHlwZT1BUlBIUkRfRVRIRVI7CisKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFoqMzsJLy9tb2RpZmllZCBieSBqb2huLCAwODA1CisKKwlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBpZm5hbWUpIDwgMCl7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9vcHM6IGRldm5hbWUgYWxyZWFkeSB0YWtlbiEgVHJ5aW5nIHdsYW4lJWQuLi5cbiIpOworCQlpZm5hbWUgPSAid2xhbiVkIjsKKwkJZGV2X2FsbG9jX25hbWUoZGV2LCBpZm5hbWUpOworCX0KKworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRyaXZlciBwcm9iZSBjb21wbGV0ZWQxXG4iKTsKKwlpZihydGw4MTkyX2luaXQoZGV2KSE9MCl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiSW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlyZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJkZXYgbmFtZT09PT09PT0+ICVzXG4iLGRldi0+bmFtZSk7CisJcnRsODE5Ml9wcm9jX2luaXRfb25lKGRldik7CisKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRyaXZlciBwcm9iZSBjb21wbGV0ZWRcbiIpOworCXJldHVybiAwOworCisKK2ZhaWw6CisJZnJlZV9pZWVlODAyMTEoZGV2KTsKKworCVJUX1RSQUNFKENPTVBfRVJSLCAid2xhbiBkcml2ZXIgbG9hZCBmYWlsZWRcbiIpOworCXJldHVybiAtRU5PREVWOworCit9CisKKy8vZGV0YWNoIGFsbCB0aGUgd29yayBhbmQgdGltZXIgc3RydWN0dXJlIGRlY2xhcmVkIG9yIGluaXRpdGlhbGl6ZSBpbiByODE5MlVfaW5pdCBmdW5jdGlvbi4KK3ZvaWQgcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdikKK3sKKworCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnJlc2V0X3dxKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT53YXRjaF9kb2dfd3EpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnVwZGF0ZV9iZWFjb25fd3EpOworCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnFvc19hY3RpdmF0ZSk7CisJLy9jYW5jZWxfd29ya19zeW5jKCZwcml2LT5TZXRCV01vZGVXb3JrSXRlbSk7CisJLy9jYW5jZWxfd29ya19zeW5jKCZwcml2LT5Td0NobmxXb3JrSXRlbSk7CisKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE5Ml91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpZihkZXYpeworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJUlRfVFJBQ0UoQ09NUF9ET1dOLCAiPT09PT09PT09PT09PT53bGFuIGRyaXZlciB0byBiZSByZW1vdmVkXG4iKTsKKwkJcnRsODE5Ml9wcm9jX3JlbW92ZV9vbmUoZGV2KTsKKworCQkJcnRsODE5Ml9kb3duKGRldik7CisJCWlmIChwcml2LT5wRmlybXdhcmUpCisJCXsKKwkJCWtmcmVlKHByaXYtPnBGaXJtd2FyZSk7CisJCQlwcml2LT5wRmlybXdhcmUgPSBOVUxMOworCQl9CisJLy8JcHJpdi0+cmZfY2xvc2UoZGV2KTsKKy8vCQlydGw4MTkyX1NldFJGUG93ZXJTdGF0ZShkZXYsIGVSZk9mZik7CisJCXJ0bDgxOTJfdXNiX2RlbGV0ZWVuZHBvaW50cyhkZXYpOworCQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT5wcml2X3dxKTsKKwkJLy9ydGw4MTkyX2lycV9kaXNhYmxlKGRldik7CisJCS8vcnRsODE5Ml9yZXNldChkZXYpOworCQltZGVsYXkoMTApOworCisJfQorCWZyZWVfaWVlZTgwMjExKGRldik7CisJUlRfVFJBQ0UoQ09NUF9ET1dOLCAid2xhbiBkcml2ZXIgcmVtb3ZlZFxuIik7Cit9CisKKy8qIGZ1biB3aXRoIHRoZSBidWlsdC1pbiBpZWVlODAyMTEgc3RhY2suLi4gKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX2RlYnVnX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfZGVidWdfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b19kZWluaXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBydGw4MTkyX3VzYl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCisJcmV0ID0gaWVlZTgwMjExX2RlYnVnX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2RlYnVnX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b19pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMV9jcnlwdG9faW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCgpIGZhaWxlZCAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKSBmYWlsZWQgJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxOTIgYmFzZWQgV0xBTiBjYXJkc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDA3LTIwMDgsIFJlYWxzaWwgV2xhblxuIik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiSW5pdGlhbGl6aW5nIG1vZHVsZSIpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIldpcmVsZXNzIGV4dGVuc2lvbnMgdmVyc2lvbiAlZCIsIFdJUkVMRVNTX0VYVCk7CisJcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KCk7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmcnRsODE5Ml91c2JfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnRsODE5Ml91c2JfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmcnRsODE5Ml91c2JfZHJpdmVyKTsKKworCVJUX1RSQUNFKENPTVBfRE9XTiwgIkV4aXRpbmciKTsKKy8vCXJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKCk7Cit9CisKKwordm9pZCBydGw4MTkyX3RyeV93YWtlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwcmkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBlbm91Z2hfZGVzYzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisJZW5vdWdoX2Rlc2MgPSBjaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHByaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfbG9jayxmbGFncyk7CisKKwlpZihlbm91Z2hfZGVzYykKKwkJaWVlZTgwMjExX3dha2VfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKK30KKwordm9pZCBFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IFNFQ1JfdmFsdWUgPSAweDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilpZWVlODAyMTFfcHJpdihkZXYpOworCSBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlTRUNSX3ZhbHVlID0gU0NSX1R4RW5jRW5hYmxlIHwgU0NSX1J4RGVjRW5hYmxlOworCWlmICgoKEtFWV9UWVBFX1dFUDQwID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSB8fCAoS0VZX1RZUEVfV0VQMTA0ID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSkgJiYgKHByaXYtPmllZWU4MDIxMS0+YXV0aF9tb2RlICE9IDIpKQorCXsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfUnhVc2VESzsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhVc2VESzsKKwl9CisJZWxzZSBpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlICYgKEtFWV9UWVBFX0NDTVAgfCBLRVlfVFlQRV9US0lQKSkpCisJeworCQlTRUNSX3ZhbHVlIHw9IFNDUl9SeFVzZURLOworCQlTRUNSX3ZhbHVlIHw9IFNDUl9UeFVzZURLOworCX0KKwkvL2FkZCBIV1NlYyBhY3RpdmUgZW5hYmxlIGhlcmUuCisvL2RlZmF1bHQgdXNpbmcgaHdzZWMuIHdoZW4gcGVlciBBUCBpcyBpbiBOIG1vZGUgb25seSBhbmQgcGFpcndpc2Vfa2V5X3R5cGUgaXMgbm9uZV9hZXMod2hpY2ggSFRfSU9UX0FDVF9QVVJFX05fTU9ERSBpbmRpY2F0ZXMgaXQpLCB1c2Ugc29mdHdhcmUgc2VjdXJpdHkuIHdoZW4gcGVlciBBUCBpcyBpbiBiLGcsbiBtb2RlIG1peGVkIGFuZCBwYWlyd2lzZV9rZXlfdHlwZSBpcyBub25lX2FlcywgdXNlIGcgbW9kZSBodyBzZWN1cml0eS4gV0Igb24gMjAwOC43LjQKKworCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDE7CisKKwlpZiAoKGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiZIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSB8fCAhaHd3ZXApLy8haWVlZS0+aHdzZWNfc3VwcG9ydCkgLy9hZGQgaHdzZWNfc3VwcG9ydCBmbGFnIHRvIHRvdG9sIGNvbnRyb2wgaHdfc2VjIG9uL29mZgorCXsKKwkJaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsKKwkJU0VDUl92YWx1ZSAmPSB+U0NSX1J4RGVjRW5hYmxlOworCX0KKwlSVF9UUkFDRShDT01QX1NFQywiJXM6LCBod3NlYzolZCwgcGFpcndpc2Vfa2V5OiVkLCBTRUNSX3ZhbHVlOiV4XG4iLCBfX0ZVTkNUSU9OX18sIFwKKwkJCWllZWUtPmh3c2VjX2FjdGl2ZSwgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsIFNFQ1JfdmFsdWUpOworCXsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTRUNSLCAgU0VDUl92YWx1ZSk7Ly9TRUNSX3ZhbHVlIHwgIFNDUl9Vc2VESyApOworCX0KK30KKworCit2b2lkIHNldEtleSgJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJdTggRW50cnlObywKKwkJdTggS2V5SW5kZXgsCisJCXUxNiBLZXlUeXBlLAorCQl1OCAqTWFjQWRkciwKKwkJdTggRGVmYXVsdEtleSwKKwkJdTMyICpLZXlDb250ZW50ICkKK3sKKwl1MzIgVGFyZ2V0Q29tbWFuZCA9IDA7CisJdTMyIFRhcmdldENvbnRlbnQgPSAwOworCXUxNiB1c0NvbmZpZyA9IDA7CisJdTggaTsKKwlpZiAoRW50cnlObyA+PSBUT1RBTF9DQU1fRU5UUlkpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiY2FtIGVudHJ5IGV4Y2VlZHMgaW4gc2V0S2V5KClcbiIpOworCisJUlRfVFJBQ0UoQ09NUF9TRUMsICI9PT09PnRvIHNldEtleSgpLCBkZXY6JXAsIEVudHJ5Tm86JWQsIEtleUluZGV4OiVkLCBLZXlUeXBlOiVkLCBNYWNBZGRyIk1BQ19GTVQiXG4iLCBkZXYsRW50cnlObywgS2V5SW5kZXgsIEtleVR5cGUsIE1BQ19BUkcoTWFjQWRkcikpOworCisJaWYgKERlZmF1bHRLZXkpCisJCXVzQ29uZmlnIHw9IEJJVDE1IHwgKEtleVR5cGU8PDIpOworCWVsc2UKKwkJdXNDb25maWcgfD0gQklUMTUgfCAoS2V5VHlwZTw8MikgfCBLZXlJbmRleDsKKy8vCXVzQ29uZmlnIHw9IEJJVDE1IHwgKEtleVR5cGU8PDIpIHwgKERlZmF1bHRLZXk8PDUpIHwgS2V5SW5kZXg7CisKKworCWZvcihpPTAgOyBpPENBTV9DT05URU5UX0NPVU5UOyBpKyspeworCQlUYXJnZXRDb21tYW5kICA9IGkrQ0FNX0NPTlRFTlRfQ09VTlQqRW50cnlObzsKKwkJVGFyZ2V0Q29tbWFuZCB8PSBCSVQzMXxCSVQxNjsKKworCQlpZihpPT0wKXsvL01BQ3xDb25maWcKKwkJCVRhcmdldENvbnRlbnQgPSAodTMyKSgqKE1hY0FkZHIrMCkpIDw8IDE2fAorCQkJCQkodTMyKSgqKE1hY0FkZHIrMSkpIDw8IDI0fAorCQkJCQkodTMyKXVzQ29uZmlnOworCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXQ0FNSSwgVGFyZ2V0Q29udGVudCk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgVGFyZ2V0Q29tbWFuZCk7CisJLy8JCXByaW50aygic2V0a2V5IGNhbSA9JTh4XG4iLCByZWFkX2NhbShkZXYsIGkrNipFbnRyeU5vKSk7CisJCX0KKwkJZWxzZSBpZihpPT0xKXsvL01BQworCQkJVGFyZ2V0Q29udGVudCA9ICh1MzIpKCooTWFjQWRkcisyKSkgCSB8CisJCQkJCSh1MzIpKCooTWFjQWRkciszKSkgPDwgIDh8CisJCQkJCSh1MzIpKCooTWFjQWRkcis0KSkgPDwgMTZ8CisJCQkJCSh1MzIpKCooTWFjQWRkcis1KSkgPDwgMjQ7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXQ0FNSSwgVGFyZ2V0Q29udGVudCk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgVGFyZ2V0Q29tbWFuZCk7CisJCX0KKwkJZWxzZSB7CisJCQkvL0tleSBNYXRlcmlhbAorCQkJaWYoS2V5Q29udGVudCAhPU5VTEwpeworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksICh1MzIpKCooS2V5Q29udGVudCtpLTIpKSApOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIFRhcmdldENvbW1hbmQpOworCQl9CisJfQorCX0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIGluaXQgLyBleGl0IHN0dWJzIC0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfaW5pdChydGw4MTkyX3VzYl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChydGw4MTkyX3VzYl9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYwpAQCAtMCwwICsxLDM4OTAgQEAKKy8qKysKK0NvcHlyaWdodC1jIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitNb2R1bGUgTmFtZToKKwlyODE5MlVfZG0uYworCitBYnN0cmFjdDoKKwlIVyBkeW5hbWljIG1lY2hhbmlzbS4KKworTWFqb3IgQ2hhbmdlIEhpc3Rvcnk6CisJV2hlbiAgICAgIAlXaG8JCQkJV2hhdAorCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkyMDA4LTA1LTE0CWFteSAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB2ZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKworLS0qLworI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9kbS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorI2luY2x1ZGUgInI4MTl4VV9waHkuaCIKKyNpbmNsdWRlICJyODE5eFVfcGh5cmVnLmgiCisjaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgorI2luY2x1ZGUgInI4MTl4VV9jbWRwa3QuaCIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vCisvLyBJbmRpY2F0ZSBkaWZmZXJlbnQgQVAgdmVuZG9yIGZvciBJT1QgaXNzdWUuCisvLworc3RhdGljIHUzMiBlZGNhX3NldHRpbmdfRExbSFRfSU9UX1BFRVJfTUFYXSA9CisJCXsgMHg1ZTQzMjIsIAkweDVlNDMyMiwgCTB4NWU0MzIyLCAJMHg2MDQzMjIsIAkweGE0NGYsIAkweDVlYTQ0Zn07CitzdGF0aWMgdTMyIGVkY2Ffc2V0dGluZ19VTFtIVF9JT1RfUEVFUl9NQVhdID0KKwkJeyAweDVlNDMyMiwgCTB4YTQ0ZiwgCTB4NWU0MzIyLCAJMHg2MDQzMjIsIAkweDVlYTQ0ZiwgCTB4NWVhNDRmfTsKKworCisjZGVmaW5lIFJUS19VTF9FRENBIDB4YTQ0ZgorI2RlZmluZSBSVEtfRExfRURDQSAweDVlNDMyMgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vIERlYnVnIHZhcmlhYmxlID8KK2RpZ190CWRtX2RpZ3RhYmxlOworLy8gU3RvcmUgY3VycmVudCBzaG9mdHdhcmUgd3JpdGUgcmVnaXN0ZXIgY29udGVudCBmb3IgTUFDIFBIWS4KK3U4CQlkbV9zaGFkb3dbMTZdWzI1Nl0gPSB7ezB9fTsKKy8vIEZvciBEeW5hbWljIFJ4IFBhdGggU2VsZWN0aW9uIGJ5IFNpZ25hbCBTdHJlbmd0aAorRFJ4UGF0aFNlbAlETV9SeFBhdGhTZWxUYWJsZTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBleHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuCXZvaWQJaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitleHRlcm4gdm9pZCBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworZXh0ZXJuCXZvaWQJaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK2V4dGVybgl2b2lkCWRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGJvb2wgIGJpbmNoMTQpOworZXh0ZXJuCXZvaWQJZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJCQl1MzIJCWRtX3R5cGUsCisJCQkJCQkJCXUzMgkJZG1fdmFsdWUpOworZXh0ZXJuCXZvaWQJRE1fQ2hhbmdlRnN5bmNTZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCQkJCQlzMzIJCURNX1R5cGUsCisJCQkJCQkJCQkJCQlzMzIJCURNX1ZhbHVlKTsKK2V4dGVybgl2b2lkIGRtX2ZvcmNlX3R4X2Z3X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkJCQl1MzIJCWZvcmNlX3R5cGUsCisJCQkJCQkJCQkJdTMyCQlmb3JjZV92YWx1ZSk7CitleHRlcm4Jdm9pZAlkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZAlkbV9yZl9vcGVyYXRpb25fdGVzdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuCXZvaWQJZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK2V4dGVybgl2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4Jdm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX3NoYWRvd19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvLyBETSAtLT4gUmF0ZSBBZGFwdGl2ZQorc3RhdGljCXZvaWQJZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLy8gRE0gLS0+IEJhbmR3aWR0aCBzd2l0Y2gKK3N0YXRpYwl2b2lkCWRtX2luaXRfYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZAlkbV9iYW5kd2lkdGhfYXV0b3N3aXRjaCgJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8vIERNIC0tPiBUWCBwb3dlciBjb250cm9sCisvL3N0YXRpYwl2b2lkCWRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljCXZvaWQJZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisKKy8vc3RhdGljCXZvaWQJZG1fdHhwb3dlcl9yZXNldF9yZWNvdmVyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvLyBETSAtLT4gQkIgaW5pdCBnYWluIHJlc3RvcmUKKyNpZm5kZWYgUlRMODE5MlUKK3N0YXRpYwl2b2lkCWRtX2JiX2luaXRpYWxnYWluX3Jlc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLy8gRE0gLS0+IEJCIGluaXQgZ2FpbiBiYWNrdXAKK3N0YXRpYwl2b2lkCWRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorLy8gRE0gLS0+IER5bmFtaWMgSW5pdCBHYWluIGJ5IFJTU0kKK3N0YXRpYwl2b2lkCWRtX2RpZ19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2koc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZAlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZHJpdmVycnNzaSgJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZAlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9md2ZhbHNlX2FsYXJtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1faW5pdGlhbF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fcGRfdGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZAlkbV9jc19yYXRpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljCXZvaWQgZG1faW5pdF9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvLyBETSAtLT4gRURDQSB0dXJib2UgbW9kZSBjb250cm9sCitzdGF0aWMJdm9pZAlkbV9jaGVja19lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvLyBETSAtLT4gSFcgUkYgY29udHJvbAorc3RhdGljCXZvaWQJZG1fY2hlY2tfcmZjdHJsX2dwaW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNpZm5kZWYgUlRMODE5MFAKKy8vc3RhdGljCXZvaWQJZG1fZ3Bpb19jaGFuZ2VfcmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKy8vIERNIC0tPiBDaGVjayBQQkMKK3N0YXRpYwl2b2lkIGRtX2NoZWNrX3BiY19ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8vIERNIC0tPiBDaGVjayBjdXJyZW50IFJYIFJGIHBhdGggc3RhdGUKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIAl2b2lkIGRtX2luaXRfcnhwYXRoX3NlbGVjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkIGRtX3J4cGF0aF9zZWxfYnlyc3NpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8vIERNIC0tPiBGc3luYyBmb3IgYnJvYWRjb20gYXAKK3N0YXRpYyB2b2lkIGRtX2luaXRfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkbV9kZUluaXRfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8vQWRkZWQgYnkgdml2aSwgMjAwODA1MjIKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3R4cmF0ZWFuZHJldHJ5Y291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgb2YgVHggUG93ZXIgQ29udHJvbCBGb3IgTmVhci9GYXIgUmFuZ2UgLS0tLS0tLS0qLyAgIC8vQWRkIGJ5IEphY2tlbiAyMDA4LzAyLzE4CitzdGF0aWMJdm9pZAlkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisvLyBETSAtLT4gRm9yIHJhdGUgYWRhcHRpdmUgYW5kIERJRywgd2UgbXVzdCBzZW5kIFJTU0kgdG8gZmlybXdhcmUKK3N0YXRpYwl2b2lkIGRtX3NlbmRfcnNzaV90b2Z3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vCUhXIER5bmFtaWMgbWVjaGFuaXNtIGludGVyZmFjZS4KKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8KKy8vCURlc2NyaXB0aW9uOgorLy8JCVByZXBhcmUgU1cgcmVzb3VyY2UgZm9yIEhXIGR5bmFtaWMgbWVjaGFuaXNtLgorLy8KKy8vCUFzc3VtcHRpb246CisvLwkJVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGludm9rZWQgYXQgZHJpdmVyIGludGlhbGl6YXRpb24gb25jZS4KKy8vCisvLworZXh0ZXJuCXZvaWQKK2luaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy8gVW5kZWNvcmF0ZWQgU21vb3RoZWQgU2lnbmFsIFN0cmVuZ3RoLCBpdCBjYW4gdXRpbGl6ZWQgdG8gZHluYW1pYyBtZWNoYW5pc20uCisJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9IC0xOworCisJLy9Jbml0aWFsIFRYIFBvd2VyIENvbnRyb2wgZm9yIG5lYXIvZmFyIHJhbmdlICwgYWRkIGJ5IGFteSAyMDA4LzA1LzE1LCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorCWRtX2luaXRfZHluYW1pY190eHBvd2VyKGRldik7CisJaW5pdF9yYXRlX2FkYXB0aXZlKGRldik7CisJLy9kbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoZGV2KTsKKwlkbV9kaWdfaW5pdChkZXYpOworCWRtX2luaXRfZWRjYV90dXJibyhkZXYpOworCWRtX2luaXRfYmFuZHdpZHRoX2F1dG9zd2l0Y2goZGV2KTsKKwlkbV9pbml0X2ZzeW5jKGRldik7CisJZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKGRldik7CisJZG1faW5pdF9jdHN0b3NlbGYoZGV2KTsKKworfQkvLyBJbml0SGFsRG0KKworZXh0ZXJuIHZvaWQgZGVpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJZG1fZGVJbml0X2ZzeW5jKGRldik7CisKK30KKworCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKK3ZvaWQgZG1fQ2hlY2tSeEFnZ3JlZ2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOworCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RUeE9rQ250ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwlsYXN0UnhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJY3VyVHhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJY3VyUnhPa0NudCA9IDA7CisKKy8qCisJaWYgKHBIYWxEYXRhLT5iRm9yY2VkVXNiUnhBZ2dyKSB7CisJCWlmIChwSGFsRGF0YS0+Rm9yY2VkVXNiUnhBZ2dySW5mbyA9PSAwKSB7CisJCQlpZiAocEhhbERhdGEtPmJDdXJyZW50UnhBZ2dyRW5hYmxlKSB7CisJCQkJQWRhcHRlci0+SGFsRnVuYy5IYWxVc2JSeEFnZ3JIYW5kbGVyKEFkYXB0ZXIsIEZBTFNFKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghcEhhbERhdGEtPmJDdXJyZW50UnhBZ2dyRW5hYmxlIHx8IChwSGFsRGF0YS0+Rm9yY2VkVXNiUnhBZ2dySW5mbyAhPSBwSGFsRGF0YS0+TGFzdFVzYlJ4QWdnckluZm9TZXR0aW5nKSkgeworCQkJCUFkYXB0ZXItPkhhbEZ1bmMuSGFsVXNiUnhBZ2dySGFuZGxlcihBZGFwdGVyLCBUUlVFKTsKKwkJCX0KKwkJfQorCQlyZXR1cm47CisJfQorCisqLworCWN1clR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdCAtIGxhc3RUeE9rQ250OworCWN1clJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIGxhc3RSeE9rQ250OworCisJaWYoKGN1clR4T2tDbnQgKyBjdXJSeE9rQ250KSA8IDE1MDAwMDAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZihjdXJUeE9rQ250ID4gNCpjdXJSeE9rQ250KSB7CisJCWlmIChwcml2LT5iQ3VycmVudFJ4QWdnckVuYWJsZSkgeworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgMHgxYTgsIDApOworCQkJcHJpdi0+YkN1cnJlbnRSeEFnZ3JFbmFibGUgPSBmYWxzZTsKKwkJfQorCX1lbHNleworCQlpZiAoIXByaXYtPmJDdXJyZW50UnhBZ2dyRW5hYmxlICYmICFwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pIHsKKwkJCXUzMiB1bFZhbHVlOworCQkJdWxWYWx1ZSA9IChwSFRJbmZvLT5Vc2JSeEZ3QWdnckVuPDwyNCkgfCAocEhUSW5mby0+VXNiUnhGd0FnZ3JQYWdlTnVtPDwxNikgfAorCQkJCShwSFRJbmZvLT5Vc2JSeEZ3QWdnclBhY2tldE51bTw8OCkgfCAocEhUSW5mby0+VXNiUnhGd0FnZ3JUaW1lb3V0KTsKKwkJCS8qCisJCQkgKiBJZiB1c2IgcnggZmlybXdhcmUgYWdncmVnYXRpb24gaXMgZW5hYmxlZCwKKwkJCSAqIHdoZW4gYW55b25lIG9mIHRocmVlIHRocmVzaG9sZCBjb25kaXRpb25zIGFib3ZlIGlzIHJlYWNoZWQsCisJCQkgKiBmaXJtd2FyZSB3aWxsIHNlbmQgYWdncmVnYXRlZCBwYWNrZXQgdG8gZHJpdmVyLgorCQkJICovCisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCAweDFhOCwgdWxWYWx1ZSk7CisJCQlwcml2LT5iQ3VycmVudFJ4QWdnckVuYWJsZSA9IHRydWU7CisJCX0KKwl9CisKKwlsYXN0VHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0OworCWxhc3RSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3Q7Cit9CS8vIGRtX0NoZWNrRWRjYVR1cmJvCisjZW5kaWYKKworCisKK2V4dGVybiAgdm9pZCAgICBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvL3N0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vc3RhdGljIHU4IAlwcmV2aW91c19ic3NpZFs2XSA9ezB9OworCisJLypBZGQgYnkgYW15IDIwMDgvMDUvMTUgLHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuKi8KKwlkbV9jaGVja19yYXRlX2FkYXB0aXZlKGRldik7CisJZG1fZHluYW1pY190eHBvd2VyKGRldik7CisJZG1fY2hlY2tfdHhyYXRlYW5kcmV0cnljb3VudChkZXYpOworCWRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcoZGV2KTsKKwlkbV9jdHJsX2luaXRnYWluX2J5cnNzaShkZXYpOworCWRtX2NoZWNrX2VkY2FfdHVyYm8oZGV2KTsKKwlkbV9iYW5kd2lkdGhfYXV0b3N3aXRjaChkZXYpOworCWRtX2NoZWNrX3JmY3RybF9ncGlvKGRldik7CisJZG1fY2hlY2tfcnhfcGF0aF9zZWxlY3Rpb24oZGV2KTsKKwlkbV9jaGVja19mc3luYyhkZXYpOworCisJLy8gQWRkIGJ5IGFteSAyMDA4LTA1LTE1IHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisJZG1fY2hlY2tfcGJjX2dwaW8oZGV2KTsKKwlkbV9zZW5kX3Jzc2lfdG9mdyhkZXYpOworCWRtX2N0c3Rvc2VsZihkZXYpOworI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCisJZG1fQ2hlY2tSeEFnZ3JlZ2F0aW9uKGRldik7CisjZW5kaWYKK30JLy9IYWxEbVdhdGNoRG9nCisKKworLyoKKyAgKiBEZWNpZGUgUmF0ZSBBZGFwdGl2ZSBTZXQgYWNjb3JkaW5nIHRvIGRpc3RhbmNlIChzaWduYWwgc3RyZW5ndGgpCisgICoJMDEvMTEvMjAwOAlNSEMJCU1vZGlmeSBpbnB1dCBhcmd1bWVudHMgYW5kIFJBVFIgdGFibGUgbGV2ZWwuCisgICoJMDEvMTYvMjAwOAlNSEMJCVJGX1R5cGUgaXMgYXNzaWduZWQgaW4gUmVhZEFkYXB0ZXJJbmZvKCkuIFdlIG11c3QgY2FsbAorICAqCQkJCQkJdGhlIGZ1bmN0aW9uIGFmdGVyIG1ha2luZyBzdXJlIFJGX1R5cGUuCisgICovCitleHRlcm4gdm9pZCBpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcHJhdGVfYWRhcHRpdmUJcHJhID0gKHByYXRlX2FkYXB0aXZlKSZwcml2LT5yYXRlX2FkYXB0aXZlOworCisJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTUFYOworCXByYS0+aGlnaDJsb3dfcnNzaV90aHJlc2hfZm9yX3JhID0gUmF0ZUFkYXB0aXZlVEhfSGlnaDsKKwlwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd18yME0rNTsKKwlwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd180ME0rNTsKKworCXByYS0+aGlnaF9yc3NpX3RocmVzaF9mb3JfcmEgPSBSYXRlQWRhcHRpdmVUSF9IaWdoKzU7CisJcHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNID0gUmF0ZUFkYXB0aXZlVEhfTG93XzIwTTsKKwlwcmEtPmxvd19yc3NpX3RocmVzaF9mb3JfcmE0ME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNOworCisJaWYocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQorCQlwcmEtPnBpbmdfcnNzaV9lbmFibGUgPSAxOworCWVsc2UKKwkJcHJhLT5waW5nX3Jzc2lfZW5hYmxlID0gMDsKKwlwcmEtPnBpbmdfcnNzaV90aHJlc2hfZm9yX3JhID0gMTU7CisKKworCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUNFIpCisJeworCQkvLyAwNy8xMC8wOCBNSCBNb2RpZnkgZm9yIFJBIHNtb290aCBzY2hlbWUuCisJCS8qIDIwMDgvMDEvMTEgTUggTW9kaWZ5IDJUIFJBVFIgdGFibGUgZm9yIGRpZmZlcmVudCBSU1NJLiAwODA1MTUgcG9ydGluZyBieSBhbXkgZnJvbSB3aW5kb3dzIGNvZGUuKi8KKwkJcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDhmMGYwMDAwOworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDhmMGZmMDAwOworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDhmMGZmMDAxOworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwTQk9IAkweDhmMGZmMDA1OworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTQk9IAkweDhmMGZmMDAxOworCQlwcmEtPnBpbmdfcnNzaV9yYXRyCT0gCTB4MDAwMDAwMGQ7Ly9jb3NhIGFkZCBmb3IgdGVzdAorCX0KKwllbHNlIGlmIChwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJeworCQlwcmEtPnVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHIJCT0gCTB4MDAwZjAwMDA7CisJCXByYS0+bWlkZGxlX3Jzc2lfdGhyZXNob2xkX3JhdHIJCT0gCTB4MDAwZmYwMDA7CisJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHIJCT0gCTB4MDAwZmYwMDE7CisJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfNDBNCT0gCTB4MDAwZmYwMDU7CisJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfMjBNCT0gCTB4MDAwZmYwMDE7CisJCXByYS0+cGluZ19yc3NpX3JhdHIJPSAJMHgwMDAwMDAwZDsvL2Nvc2EgYWRkIGZvciB0ZXN0CisJfQorCit9CS8vIEluaXRSYXRlQWRhcHRpdmUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZSgpCisgKgorICogT3ZlcnZpZXc6CisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjYvMDgJYW15IAlDcmVhdGUgdmVyc2lvbiAwIHByb3RpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOworCXByYXRlX2FkYXB0aXZlCQkJcHJhID0gKHByYXRlX2FkYXB0aXZlKSZwcml2LT5yYXRlX2FkYXB0aXZlOworCXUzMgkJCQkJCWN1cnJlbnRSQVRSLCB0YXJnZXRSQVRSID0gMDsKKwl1MzIJCQkJCQlMb3dSU1NJVGhyZXNoRm9yUkEgPSAwLCBIaWdoUlNTSVRocmVzaEZvclJBID0gMDsKKwlib29sCQkJCQkJYnNob3J0X2dpX2VuYWJsZWQgPSBmYWxzZTsKKwlzdGF0aWMgdTgJCQkJCXBpbmdfcnNzaV9zdGF0ZT0wOworCisKKwlpZighcHJpdi0+dXApCisJeworCQlSVF9UUkFDRShDT01QX1JBVEUsICI8LS0tLSBkbV9jaGVja19yYXRlX2FkYXB0aXZlKCk6IGRyaXZlciBpcyBnb2luZyB0byB1bmxvYWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYocHJhLT5yYXRlX2FkYXB0aXZlX2Rpc2FibGVkKS8vdGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgaW9jdGwuCisJCXJldHVybjsKKworCS8vIFRPRE86IE9ubHkgMTFuIG1vZGUgaXMgaW1wbGVtZW50ZWQgY3VycmVudGx5LAorCWlmKCAhKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHIHx8CisJCSBwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSkKKwkJIHJldHVybjsKKworCWlmKCBwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgKQorCXsKKwkvLwlSVF9UUkFDRShDT01QX1JBVEUsICJkbV9DaGVja1JhdGVBZGFwdGl2ZSgpOiBcdCIpOworCisJCS8vCisJCS8vIENoZWNrIHdoZXRoZXIgU2hvcnQgR0kgaXMgZW5hYmxlZAorCQkvLworCQlic2hvcnRfZ2lfZW5hYmxlZCA9IChwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopIHx8CisJCQkoIXBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgcEhUSW5mby0+YkN1clNob3J0R0kyME1Ieik7CisKKworCQlwcmEtPnVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHIgPQorCQkJCShwcmEtPnVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHIgJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOworCisJCXByYS0+bWlkZGxlX3Jzc2lfdGhyZXNob2xkX3JhdHIgPQorCQkJCShwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKKworCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQl7CisJCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0gJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0ciA9CisJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME0gJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOworCQl9CisJCS8vY29zYSBhZGQgZm9yIHRlc3QKKwkJcHJhLT5waW5nX3Jzc2lfcmF0ciA9CisJCQkJKHByYS0+cGluZ19yc3NpX3JhdHIgJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOworCisJCS8qIDIwMDcvMTAvMDggTUggV2Ugc3VwcG9ydCBSQSBzbW9vdGggc2NoZW1lIG5vdy4gV2hlbiBpdCBpcyB0aGUgZmlyc3QKKwkJICAgdGltZSB0byBsaW5rIHdpdGggQVAuIFdlIHdpbGwgbm90IGNoYW5nZSB1cHBlci9sb3dlciB0aHJlc2hvbGQuIElmCisJCSAgIFNUQSBzdGF5IGluIGhpZ2ggb3IgbG93IGxldmVsLCB3ZSBtdXN0IGNoYW5nZSB0d28gZGlmZmVyZW50IHRocmVzaG9sZAorCQkgICB0byBwcmV2ZW50IGp1bXBpbmcgZnJlcXVlbnRseS4gKi8KKwkJaWYgKHByYS0+cmF0cl9zdGF0ZSA9PSBETV9SQVRSX1NUQV9ISUdIKQorCQl7CisJCQlIaWdoUlNTSVRocmVzaEZvclJBIAk9IHByYS0+aGlnaDJsb3dfcnNzaV90aHJlc2hfZm9yX3JhOworCQkJTG93UlNTSVRocmVzaEZvclJBCT0gKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCk/CisJCQkJCShwcmEtPmxvd19yc3NpX3RocmVzaF9mb3JfcmE0ME0pOihwcmEtPmxvd19yc3NpX3RocmVzaF9mb3JfcmEyME0pOworCQl9CisJCWVsc2UgaWYgKHByYS0+cmF0cl9zdGF0ZSA9PSBETV9SQVRSX1NUQV9MT1cpCisJCXsKKwkJCUhpZ2hSU1NJVGhyZXNoRm9yUkEJPSBwcmEtPmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhOworCQkJTG93UlNTSVRocmVzaEZvclJBIAk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApPworCQkJCQkocHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME0pOihwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlIaWdoUlNTSVRocmVzaEZvclJBCT0gcHJhLT5oaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApPworCQkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKKwkJfQorCisJCS8vRGJnUHJpbnQoIltETV0gVEhyZXNoIEgvTD0lZC8lZFxuXHIiLCBSQVRSLkhpZ2hSU1NJVGhyZXNoRm9yUkEsIFJBVFIuTG93UlNTSVRocmVzaEZvclJBKTsKKwkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAobG9uZylIaWdoUlNTSVRocmVzaEZvclJBKQorCQl7CisJCQkvL0RiZ1ByaW50KCJbRE1dIFJTU0k9JWQgU1RBPUhJR0hcblxyIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKKwkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0hJR0g7CisJCQl0YXJnZXRSQVRSID0gcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyOworCQl9ZWxzZSBpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChsb25nKUxvd1JTU0lUaHJlc2hGb3JSQSkKKwkJeworCQkJLy9EYmdQcmludCgiW0RNXSBSU1NJPSVkIFNUQT1NaWRkbGVcblxyIiwgcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKKwkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01JRERMRTsKKwkJCXRhcmdldFJBVFIgPSBwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyOworCQl9ZWxzZQorCQl7CisJCQkvL0RiZ1ByaW50KCJbRE1dIFJTU0k9JWQgU1RBPUxPV1xuXHIiLCBwSGFsRGF0YS0+VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpOworCQkJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTE9XOworCQkJdGFyZ2V0UkFUUiA9IHByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJCX0KKworCQkJLy9jb3NhIGFkZCBmb3IgdGVzdAorCQlpZihwcmEtPnBpbmdfcnNzaV9lbmFibGUpCisJCXsKKwkJCS8vcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMTk7CisJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgKGxvbmcpKHByYS0+cGluZ19yc3NpX3RocmVzaF9mb3JfcmErNSkpCisJCQl7CisJCQkJaWYoIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgKGxvbmcpcHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSkgfHwKKwkJCQkJcGluZ19yc3NpX3N0YXRlICkKKwkJCQl7CisJCQkJCS8vRGJnUHJpbnQoIlRlc3RSU1NJID0gJWQsIHNldCBSQVRSIHRvIDB4JXggXG4iLCBwSGFsRGF0YS0+VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIsIHBSQS0+VGVzdFJTU0lSQVRSKTsKKwkJCQkJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTE9XOworCQkJCQl0YXJnZXRSQVRSID0gcHJhLT5waW5nX3Jzc2lfcmF0cjsKKwkJCQkJcGluZ19yc3NpX3N0YXRlID0gMTsKKwkJCQl9CisJCQkJLy9lbHNlCisJCQkJLy8JRGJnUHJpbnQoIlRlc3RSU1NJIGlzIGJldHdlZW4gdGhlIHJhbmdlLiBcbiIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vRGJnUHJpbnQoIlRlc3RSU1NJIFJlY292ZXIgdG8gMHgleCBcbiIsIHRhcmdldFJBVFIpOworCQkJCXBpbmdfcnNzaV9zdGF0ZSA9IDA7CisJCQl9CisJCX0KKworCQkvLyAyMDA4LjA0LjAxCisJCS8vIEZvciBSVEw4MTlYLCBpZiBwYWlyd2lzZWtleSA9IHdlcC90a2lwLCB3ZSBzdXBwb3J0IG9ubHkgTUNTMH43LgorCQlpZihwcml2LT5pZWVlODAyMTEtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoZGV2KSkKKwkJCXRhcmdldFJBVFIgJj0gIDB4ZjAwZmZmZmY7CisKKwkJLy8KKwkJLy8gQ2hlY2sgd2hldGhlciB1cGRhdGluZyBvZiBSQVRSMCBpcyByZXF1aXJlZAorCQkvLworCQljdXJyZW50UkFUUiA9IHJlYWRfbmljX2R3b3JkKGRldiwgUkFUUjApOworCQlpZiggdGFyZ2V0UkFUUiAhPSAgY3VycmVudFJBVFIgKQorCQl7CisJCQl1MzIgcmF0cl92YWx1ZTsKKwkJCXJhdHJfdmFsdWUgPSB0YXJnZXRSQVRSOworCQkJUlRfVFJBQ0UoQ09NUF9SQVRFLCJjdXJyZW50UkFUUiA9ICV4LCB0YXJnZXRSQVRSID0gJXhcbiIsIGN1cnJlbnRSQVRSLCB0YXJnZXRSQVRSKTsKKwkJCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJCXsKKwkJCQlyYXRyX3ZhbHVlICY9IH4oUkFURV9BTExfT0ZETV8yU1MpOworCQkJfQorCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkFUUjAsIHJhdHJfdmFsdWUpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBVRldQLCAxKTsKKworCQkJcHJhLT5sYXN0X3JhdHIgPSB0YXJnZXRSQVRSOworCQl9CisKKwl9CisJZWxzZQorCXsKKwkJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTUFYOworCX0KKworfQkvLyBkbV9DaGVja1JhdGVBZGFwdGl2ZQorCisKK3N0YXRpYyB2b2lkIGRtX2luaXRfYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzIwTWh6dG80ME1oeiA9IEJXX0FVVE9fU1dJVENIX0xPV19ISUdIOworCXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF80ME1oenRvMjBNaHogPSBCV19BVVRPX1NXSVRDSF9ISUdIX0xPVzsKKwlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSBmYWxzZTsKKwlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iYXV0b3N3aXRjaF9lbmFibGUgPSBmYWxzZTsKKworfQkvLyBkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoCisKKworc3RhdGljIHZvaWQgZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwIHx8IXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJhdXRvc3dpdGNoX2VuYWJsZSl7CisJCXJldHVybjsKKwl9ZWxzZXsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID09IGZhbHNlKXsvL0lmIHNlbmQgcGFja2V0cyBpbiA0MCBNaHogaW4gMjAvNDAKKwkJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0gcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzQwTWh6dG8yME1oeikKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSB0cnVlOworCQl9ZWxzZXsvL2luIGZvcmNlIHNlbmQgcGFja2V0cyBpbiAyMCBNaHogaW4gMjAvNDAKKwkJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzIwTWh6dG80ME1oeikKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSBmYWxzZTsKKworCQl9CisJfQorfQkvLyBkbV9CYW5kd2lkdGhBdXRvU3dpdGNoCisKKy8vT0ZETSBkZWZhdWx0IGF0IDBkYiwgaW5kZXg9Ni4KK3N0YXRpYyB1MzIgT0ZETVN3aW5nVGFibGVbT0ZETV9UYWJsZV9MZW5ndGhdID0geworCTB4N2Y4MDAxZmUsCS8vIDAsICs2ZGIKKwkweDcxYzAwMWM3LAkvLyAxLCArNWRiCisJMHg2NTQwMDE5NSwJLy8gMiwgKzRkYgorCTB4NWE0MDAxNjksCS8vIDMsICszZGIKKwkweDUwODAwMTQyLAkvLyA0LCArMmRiCisJMHg0N2MwMDExZiwJLy8gNSwgKzFkYgorCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXByYXR1cmUsIGxvd2VyIGZvciBsb3cgdGVtcHJhdHVyZQorCTB4MzkwMDAwZTQsCS8vIDcsIC0xZGIKKwkweDMyYzAwMGNiLAkvLyA4LCAtMmRiCisJMHgyZDQwMDBiNSwJLy8gOSwgLTNkYgorCTB4Mjg4MDAwYTIsCS8vIDEwLCAtNGRiCisJMHgyNDAwMDA5MCwJLy8gMTEsIC01ZGIKKwkweDIwMDAwMDgwLAkvLyAxMiwgLTZkYgorCTB4MWM4MDAwNzIsCS8vIDEzLCAtN2RiCisJMHgxOTgwMDA2NiwJLy8gMTQsIC04ZGIKKwkweDI2YzAwMDViLAkvLyAxNSwgLTlkYgorCTB4MjQ0MDAwNTEsCS8vIDE2LCAtMTBkYgorCTB4MTIwMDAwNDgsCS8vIDE3LCAtMTFkYgorCTB4MTAwMDAwNDAJLy8gMTgsIC0xMmRiCit9OworCitzdGF0aWMgdTgJQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKKwl7MHgzNiwgMHgzNSwgMHgyZSwgMHgyNSwgMHgxYywgMHgxMiwgMHgwOSwgMHgwNH0sCS8vIDAsICswZGIgPT09PiBDQ0s0ME0gZGVmYXVsdAorCXsweDMwLCAweDJmLCAweDI5LCAweDIxLCAweDE5LCAweDEwLCAweDA4LCAweDAzfSwJLy8gMSwgLTFkYgorCXsweDJiLCAweDJhLCAweDI1LCAweDFlLCAweDE2LCAweDBlLCAweDA3LCAweDAzfSwJLy8gMiwgLTJkYgorCXsweDI2LCAweDI1LCAweDIxLCAweDFiLCAweDE0LCAweDBkLCAweDA2LCAweDAzfSwJLy8gMywgLTNkYgorCXsweDIyLCAweDIxLCAweDFkLCAweDE4LCAweDExLCAweDBiLCAweDA2LCAweDAyfSwJLy8gNCwgLTRkYgorCXsweDFmLCAweDFlLCAweDFhLCAweDE1LCAweDEwLCAweDBhLCAweDA1LCAweDAyfSwJLy8gNSwgLTVkYgorCXsweDFiLCAweDFhLCAweDE3LCAweDEzLCAweDBlLCAweDA5LCAweDA0LCAweDAyfSwJLy8gNiwgLTZkYiA9PT0+IENDSzIwTSBkZWZhdWx0CisJezB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LAkvLyA3LCAtN2RiCisJezB4MTYsIDB4MTUsIDB4MTIsIDB4MGYsIDB4MGIsIDB4MDcsIDB4MDQsIDB4MDF9LAkvLyA4LCAtOGRiCisJezB4MTMsIDB4MTMsIDB4MTAsIDB4MGQsIDB4MGEsIDB4MDYsIDB4MDMsIDB4MDF9LAkvLyA5LCAtOWRiCisJezB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LAkvLyAxMCwgLTEwZGIKKwl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0JLy8gMTEsIC0xMWRiCit9OworCitzdGF0aWMgdTgJQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS19UYWJsZV9sZW5ndGhdWzhdID0geworCXsweDM2LCAweDM1LCAweDJlLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMCwgKzBkYiAgPT09PiBDQ0s0ME0gZGVmYXVsdAorCXsweDMwLCAweDJmLCAweDI5LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMSwgLTFkYgorCXsweDJiLCAweDJhLCAweDI1LCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMiwgLTJkYgorCXsweDI2LCAweDI1LCAweDIxLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMywgLTNkYgorCXsweDIyLCAweDIxLCAweDFkLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNCwgLTRkYgorCXsweDFmLCAweDFlLCAweDFhLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNSwgLTVkYgorCXsweDFiLCAweDFhLCAweDE3LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNiwgLTZkYiAgPT09PiBDQ0syME0gZGVmYXVsdAorCXsweDE4LCAweDE3LCAweDE1LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNywgLTdkYgorCXsweDE2LCAweDE1LCAweDEyLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gOCwgLThkYgorCXsweDEzLCAweDEzLCAweDEwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gOSwgLTlkYgorCXsweDExLCAweDExLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMTAsIC0xMGRiCisJezB4MGYsIDB4MGYsIDB4MGQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9CS8vIDExLCAtMTFkYgorfTsKKworc3RhdGljIHZvaWQgZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVFNTSShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbAkJCQkJCWJIaWdocG93ZXJzdGF0ZSwgdml2aWZsYWcgPSBGQUxTRTsKKwlEQ01EX1RYQ01EX1QJCQl0eF9jbWQ7CisJdTgJCQkJCQlwb3dlcmxldmVsT0ZETTI0RzsKKwlpbnQJCQkJCQlpID0wLCBqID0gMCwgayA9IDA7CisJdTgJCQkJCQlSRl9UeXBlLCB0bXBfcmVwb3J0WzVdPXswLCAwLCAwLCAwLCAwfTsKKwl1MzIJCQkJCQlWYWx1ZTsKKwl1OAkJCQkJCVB3cl9GbGFnOworCXUxNgkJCQkJCUF2Z19UU1NJX01lYXMsIFRTU0lfMTNkQm0sIEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXI9MDsKKwkvL1JUX1NUQVRVUyAJCQkJcnRTdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKKwlib29sIHJ0U3RhdHVzID0gdHJ1ZTsKKwl1MzIJCQkJCQlkZWx0YT0wOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisKKwlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gZmFsc2U7CisJYkhpZ2hwb3dlcnN0YXRlID0gcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlcjsKKworCXBvd2VybGV2ZWxPRkRNMjRHID0gKHU4KShwcml2LT5Qd3JfVHJhY2s+PjI0KTsKKwlSRl9UeXBlID0gcHJpdi0+cmZfdHlwZTsKKwlWYWx1ZSA9IChSRl9UeXBlPDw4KSB8IHBvd2VybGV2ZWxPRkRNMjRHOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInBvd2VybGV2ZWxPRkRNMjRHID0gJXhcbiIsIHBvd2VybGV2ZWxPRkRNMjRHKTsKKworCWZvcihqID0gMDsgajw9MzA7IGorKykKK3sJLy9maWxsIHR4X2NtZAorCisJdHhfY21kLk9wCQk9IFRYQ01EX1NFVF9UWF9QV1JfVFJBQ0tJTkc7CisJdHhfY21kLkxlbmd0aAk9IDQ7CisJdHhfY21kLlZhbHVlCQk9IFZhbHVlOworI2lmZGVmIFJUTDgxOTJVCisJcnRTdGF0dXMgPSBTZW5kVHhDb21tYW5kUGFja2V0KGRldiwgJnR4X2NtZCwgMTIpOworCWlmIChydFN0YXR1cyA9PSBSVF9TVEFUVVNfRkFJTFVSRSkKKwl7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJTZXQgY29uZmlndXJhdGlvbiB3aXRoIHR4IGNtZCBxdWV1ZSBmYWlsIVxuIik7CisJfQorI2Vsc2UKKwljbXBrX21lc3NhZ2VfaGFuZGxlX3R4KGRldiwgKHU4KikmdHhfY21kLAorCQkJCQkJCQlERVNDX1BBQ0tFVF9UWVBFX0lOSVQsIHNpemVvZihEQ01EX1RYQ01EX1QpKTsKKyNlbmRpZgorCW1kZWxheSgxKTsKKwkvL0RiZ1ByaW50KCJoaSwgdml2aSwgc3RyYW5nZVxuIik7CisJZm9yKGkgPSAwO2kgPD0gMzA7IGkrKykKKwl7CisJCVB3cl9GbGFnID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MWJhKTsKKworCQlpZiAoUHdyX0ZsYWcgPT0gMCkKKwkJeworCQkJbWRlbGF5KDEpOworCQkJY29udGludWU7CisJCX0KKyNpZmRlZiBSVEw4MTkwUAorCQlBdmdfVFNTSV9NZWFzID0gcmVhZF9uaWNfd29yZChkZXYsIDB4MWJjKTsKKyNlbHNlCisJCUF2Z19UU1NJX01lYXMgPSByZWFkX25pY193b3JkKGRldiwgMHgxM2MpOworI2VuZGlmCisJCWlmKEF2Z19UU1NJX01lYXMgPT0gMCkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisJCQlicmVhazsKKwkJfQorCisJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQl7CisjaWZkZWYgUlRMODE5MFAKKwkJCXRtcF9yZXBvcnRba10gPSByZWFkX25pY19ieXRlKGRldiwgMHgxZDgrayk7CisjZWxzZQorCQkJaWYoayAhPTQpCisJCQkJdG1wX3JlcG9ydFtrXSA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDEzNCtrKTsKKwkJCWVsc2UKKwkJCQl0bXBfcmVwb3J0W2tdID0gcmVhZF9uaWNfYnl0ZShkZXYsIDB4MTNlKTsKKyNlbmRpZgorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlRTU0lfcmVwb3J0X3ZhbHVlID0gJWRcbiIsIHRtcF9yZXBvcnRba10pOworCQl9CisKKwkJLy9jaGVjayBpZiB0aGUgcmVwb3J0IHZhbHVlIGlzIHJpZ2h0CisJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQl7CisJCQlpZih0bXBfcmVwb3J0W2tdIDw9IDIwKQorCQkJeworCQkJCXZpdmlmbGFnID1UUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmKHZpdmlmbGFnID09VFJVRSkKKwkJeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7CisJCQl2aXZpZmxhZyA9IEZBTFNFOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIndlIGZpbHRlZCB0aGlzIGRhdGFcbiIpOworCQkJZm9yKGsgPSAwO2sgPCA1OyBrKyspCisJCQkJdG1wX3JlcG9ydFtrXSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWZvcihrID0gMDtrIDwgNTsgaysrKQorCQl7CisJCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyICs9IHRtcF9yZXBvcnRba107CisJCX0KKworCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcioxMDAvNTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgPSAlZFxuIiwgQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcik7CisJCVRTU0lfMTNkQm0gPSBwcml2LT5UU1NJXzEzZEJtOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiVFNTSV8xM2RCbSA9ICVkXG4iLCBUU1NJXzEzZEJtKTsKKworCQkvL2lmKGFicyhBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIC0gVFNTSV8xM2RCbSkgPD0gRV9GT1JfVFhfUE9XRVJfVFJBQ0spCisJCS8vIEZvciBNYWNPUy1jb21wYXRpYmxlCisJCWlmKEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgPiBUU1NJXzEzZEJtKQorCQkJZGVsdGEgPSBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIC0gVFNTSV8xM2RCbTsKKwkJZWxzZQorCQkJZGVsdGEgPSBUU1NJXzEzZEJtIC0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcjsKKworCQlpZihkZWx0YSA8PSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykKKwkJeworCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ0eCBwb3dlciB0cmFjayBpcyBkb25lXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA9ICVkXG4iLCBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7CisjaWZkZWYgUlRMODE5MFAKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwgcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA9ICVkXG4iLCBwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7CisjZW5kaWYKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9ICVkXG4iLCBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZSk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZihBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIDwgVFNTSV8xM2RCbSAtIEVfRk9SX1RYX1BPV0VSX1RSQUNLKQorCQkJeworCQkJCWlmKChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKQorI2lmZGVmIFJUTDgxOTBQCisJCQkJCSYmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA+IDApCisjZW5kaWYKKwkJCQkpCisJCQkJeworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKKwkJCQkJaWYocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KQorCQkJCQl7CisJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCX0KKyNpZmRlZiBSVEw4MTkwUAorCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKKwkJCQkJaWYocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KQorCQkJCQl7CisJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCX0KKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZigocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwgMzYpCisjaWZkZWYgUlRMODE5MFAKKwkJCQkJJiYocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwgMzYpCisjZW5kaWYKKwkJCQkJKQorCQkJCXsKKwkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7CisJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCisjaWZkZWYgUlRMODE5MFAKKwkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7CisJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworI2VuZGlmCisJCQkJfQorCQkJfQorCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UKKwkJCQk9IHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCAtIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKKworCQkJaWYocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbgorCQkJCT0gcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQgKyBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKwkJCWVsc2UKKwkJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24KKwkJCQk9IHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisKKwkJCWlmKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA+IC0xJiZwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPDIzKQorCQkJeworCQkJCWlmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCQl7CisJCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7CisJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCQl9CisJCQkJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCQl7CisJCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IEZBTFNFOworCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJfQorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA9ICVkXG4iLCBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7CisjaWZkZWYgUlRMODE5MFAKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA9ICVkXG4iLCBwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworI2VuZGlmCisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9ICVkXG4iLCBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZSk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uKTsKKworCQlpZiAocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPD0gLTEyfHxwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA+PSAyNCkKKwkJeworCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ0eCBwb3dlciB0cmFjay0tLT5saW1pdGVkXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisKKwl9CisJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxYmEsIDApOworCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gMDsKKwkJZm9yKGsgPSAwO2sgPCA1OyBrKyspCisJCQl0bXBfcmVwb3J0W2tdID0gMDsKKwkJYnJlYWs7CisJfQorfQorCQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gVFJVRTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyNkZWZpbmUgVGhlcm1hbE1ldGVyVmFsCTkKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHRtcFJlZ0EsIFRlbXBDQ2s7CisJdTggdG1wT0ZETWluZGV4LCB0bXBDQ0tpbmRleCwgdG1wQ0NLMjBNaW5kZXgsIHRtcENDSzQwTWluZGV4LCB0bXB2YWw7CisJaW50IGkgPTAsIENDS1N3aW5nTmVlZFVwZGF0ZT0wOworCisJaWYoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCkKKwl7CisJCS8vUXVlcnkgT0ZETSBkZWZhdWx0IHNldHRpbmcKKwkJdG1wUmVnQT0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCk7CisJCWZvcihpPTA7IGk8T0ZETV9UYWJsZV9MZW5ndGg7IGkrKykJLy9maW5kIHRoZSBpbmRleAorCQl7CisJCQlpZih0bXBSZWdBID09IE9GRE1Td2luZ1RhYmxlW2ldKQorCQkJeworCQkJCXByaXYtPk9GRE1faW5kZXg9ICh1OClpOworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJJbml0aWFsIHJlZzB4JXggPSAweCV4LCBPRkRNX2luZGV4PTB4JXhcbiIsCisJCQkJCXJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIHRtcFJlZ0EsIHByaXYtPk9GRE1faW5kZXgpOworCQkJfQorCQl9CisKKwkJLy9RdWVyeSBDQ0sgZGVmYXVsdCBzZXR0aW5nIEZyb20gMHhhMjIKKwkJVGVtcENDayA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tCeXRlMik7CisJCWZvcihpPTAgOyBpPENDS19UYWJsZV9sZW5ndGggOyBpKyspCisJCXsKKwkJCWlmKFRlbXBDQ2sgPT0gKHUzMilDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW2ldWzBdKQorCQkJeworCQkJCXByaXYtPkNDS19pbmRleCA9KHU4KSBpOworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJJbml0aWFsIHJlZzB4JXggPSAweCV4LCBDQ0tfaW5kZXg9MHgleFxuIiwKKwkJCQkJckNDSzBfVHhGaWx0ZXIxLCBUZW1wQ0NrLCBwcml2LT5DQ0tfaW5kZXgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IFRSVUU7CisJCS8vcEhhbERhdGEtPlRYUG93ZXJjb3VudCA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvLz09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gdGhpcyBpcyBvbmx5IGZvciB0ZXN0LCBzaG91bGQgYmUgbWFza2VkCisJLy89PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLy8gcmVhZCBhbmQgZmlsdGVyIG91dCB1bnJlYXNvbmFibGUgdmFsdWUKKwl0bXBSZWdBID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDEyLCAweDA3OCk7CS8vIDB4MTI6IFJGIFJlZ1sxMDo3XQorCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZWFkYmFjayBUaGVybWFsTWV0ZXJBID0gJWQgXG4iLCB0bXBSZWdBKTsKKwlpZih0bXBSZWdBIDwgMyB8fCB0bXBSZWdBID4gMTMpCisJCXJldHVybjsKKwlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcHJhdHVyZQorCQl0bXBSZWdBID0gMTI7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlZhbGlkIFRoZXJtYWxNZXRlckEgPSAlZCBcbiIsIHRtcFJlZ0EpOworCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgorCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgorCisJLy9HZXQgY3VycmVudCBSRi1BIHRlbXByYXR1cmUgaW5kZXgKKwlpZihwcml2LT5UaGVybWFsTWV0ZXJbMF0gPj0gKHU4KXRtcFJlZ0EpCS8vbG93ZXIgdGVtcHJhdHVyZQorCXsKKwkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSA2Kyhwcml2LT5UaGVybWFsTWV0ZXJbMF0tKHU4KXRtcFJlZ0EpOworCQl0bXBDQ0s0ME1pbmRleCA9IHRtcENDSzIwTWluZGV4IC0gNjsKKwkJaWYodG1wT0ZETWluZGV4ID49IE9GRE1fVGFibGVfTGVuZ3RoKQorCQkJdG1wT0ZETWluZGV4ID0gT0ZETV9UYWJsZV9MZW5ndGgtMTsKKwkJaWYodG1wQ0NLMjBNaW5kZXggPj0gQ0NLX1RhYmxlX2xlbmd0aCkKKwkJCXRtcENDSzIwTWluZGV4ID0gQ0NLX1RhYmxlX2xlbmd0aC0xOworCQlpZih0bXBDQ0s0ME1pbmRleCA+PSBDQ0tfVGFibGVfbGVuZ3RoKQorCQkJdG1wQ0NLNDBNaW5kZXggPSBDQ0tfVGFibGVfbGVuZ3RoLTE7CisJfQorCWVsc2UKKwl7CisJCXRtcHZhbCA9ICgodTgpdG1wUmVnQSAtIHByaXYtPlRoZXJtYWxNZXRlclswXSk7CisJCWlmKHRtcHZhbCA+PSA2KQkJCQkJCQkJLy8gaGlnaGVyIHRlbXByYXR1cmUKKwkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsJCS8vIG1heCB0byArNmRCCisJCWVsc2UKKwkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNiAtIHRtcHZhbDsKKwkJdG1wQ0NLNDBNaW5kZXggPSAwOworCX0KKwkvL0RiZ1ByaW50KCIlZGRiLCB0bXBPRkRNaW5kZXggPSAlZCwgdG1wQ0NLMjBNaW5kZXggPSAlZCwgdG1wQ0NLNDBNaW5kZXggPSAlZCIsCisJCS8vKCh1MUJ5dGUpdG1wUmVnQSAtIHBIYWxEYXRhLT5UaGVybWFsTWV0ZXJbMF0pLAorCQkvL3RtcE9GRE1pbmRleCwgdG1wQ0NLMjBNaW5kZXgsIHRtcENDSzQwTWluZGV4KTsKKwlpZihwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCS8vNDBNCisJCXRtcENDS2luZGV4ID0gdG1wQ0NLNDBNaW5kZXg7CisJZWxzZQorCQl0bXBDQ0tpbmRleCA9IHRtcENDSzIwTWluZGV4OworCisJaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJiAhcHJpdi0+YmNja19pbl9jaDE0KQorCXsKKwkJcHJpdi0+YmNja19pbl9jaDE0ID0gVFJVRTsKKwkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKKwl9CisJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKKwl7CisJCXByaXYtPmJjY2tfaW5fY2gxNCA9IEZBTFNFOworCQlDQ0tTd2luZ05lZWRVcGRhdGUgPSAxOworCX0KKworCWlmKHByaXYtPkNDS19pbmRleCAhPSB0bXBDQ0tpbmRleCkKKwl7CisJCXByaXYtPkNDS19pbmRleCA9IHRtcENDS2luZGV4OworCQlDQ0tTd2luZ05lZWRVcGRhdGUgPSAxOworCX0KKworCWlmKENDS1N3aW5nTmVlZFVwZGF0ZSkKKwl7CisJCS8vRGJnUHJpbnQoIlVwZGF0ZSBDQ0sgU3dpbmcsIENDS19pbmRleCA9ICVkXG4iLCBwSGFsRGF0YS0+Q0NLX2luZGV4KTsKKwkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwl9CisJaWYocHJpdi0+T0ZETV9pbmRleCAhPSB0bXBPRkRNaW5kZXgpCisJeworCQlwcml2LT5PRkRNX2luZGV4ID0gdG1wT0ZETWluZGV4OworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgT0ZETVN3aW5nVGFibGVbcHJpdi0+T0ZETV9pbmRleF0pOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiVXBkYXRlIE9GRE1Td2luZ1slZF0gPSAweCV4XG4iLAorCQkJcHJpdi0+T0ZETV9pbmRleCwgT0ZETVN3aW5nVGFibGVbcHJpdi0+T0ZETV9pbmRleF0pOworCX0KKwlwcml2LT50eHBvd2VyX2NvdW50ID0gMDsKK30KKworZXh0ZXJuCXZvaWQJZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsdHhwb3dlcl90cmFja2luZ193cSk7CisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworCisjaWZkZWYgUlRMODE5MFAKKwlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKGRldik7CisjZWxzZQorCWlmKHByaXYtPmJEY3V0ID09IFRSVUUpCisJCWRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RTU0koZGV2KTsKKwllbHNlCisJCWRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcihkZXYpOworI2VuZGlmCit9CisKKworc3RhdGljIHZvaWQgZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZ19UU1NJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvL0luaXRpYWwgdGhlIFR4IEJCIGluZGV4IGFuZCBtYXBwaW5nIHZhbHVlCisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJCTEyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzBdLnR4YmJnYWluX3ZhbHVlPTB4N2Y4MDAxZmU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJCTExOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzFdLnR4YmJnYWluX3ZhbHVlPTB4Nzg4MDAxZTI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJCTEwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzJdLnR4YmJnYWluX3ZhbHVlPTB4NzFjMDAxYzc7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbM10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJCTk7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbM10udHhiYmdhaW5fdmFsdWU9MHg2YjgwMDFhZTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZT0weDY1NDAwMTk1OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzVdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICA3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzVdLnR4YmJnYWluX3ZhbHVlPTB4NWZjMDAxN2Y7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNl0udHhiYmdhaW5fdmFsdWU9MHg1YTQwMDE2OTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs3XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs3XS50eGJiZ2Fpbl92YWx1ZT0weDU1NDAwMTU1OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzhdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICA0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzhdLnR4YmJnYWluX3ZhbHVlPTB4NTA4MDAxNDI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbOV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbOV0udHhiYmdhaW5fdmFsdWU9MHg0YzAwMDEzMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIDI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTBdLnR4YmJnYWluX3ZhbHVlPTB4NDdjMDAxMWY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTFdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgICAxOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzExXS50eGJiZ2Fpbl92YWx1ZT0weDQzYzAwMTBmOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzEyXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgICAgMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMl0udHhiYmdhaW5fdmFsdWU9MHg0MDAwMDEwMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxM10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAgIC0xOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzEzXS50eGJiZ2Fpbl92YWx1ZT0weDNjODAwMGYyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE0XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0yOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE0XS50eGJiZ2Fpbl92YWx1ZT0weDM5MDAwMGU0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE1XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0zOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE1XS50eGJiZ2Fpbl92YWx1ZT0weDM1YzAwMGQ3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE2XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC00OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE2XS50eGJiZ2Fpbl92YWx1ZT0weDMyYzAwMGNiOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE3XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC01OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE3XS50eGJiZ2Fpbl92YWx1ZT0weDMwMDAwMGMwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE4XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkJICAgIC02OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE4XS50eGJiZ2Fpbl92YWx1ZT0weDJkNDAwMGI1OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE5XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC03OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE5XS50eGJiZ2Fpbl92YWx1ZT0weDJhYzAwMGFiOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIwXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC04OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIwXS50eGJiZ2Fpbl92YWx1ZT0weDI4ODAwMGEyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIxXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC05OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIxXS50eGJiZ2Fpbl92YWx1ZT0weDI2MDAwMDk4OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIyXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMl0udHhiYmdhaW5fdmFsdWU9MHgyNDAwMDA5MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyM10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjNdLnR4YmJnYWluX3ZhbHVlPTB4MjIwMDAwODg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjRdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTEyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI0XS50eGJiZ2Fpbl92YWx1ZT0weDIwMDAwMDgwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI1XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xMzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNV0udHhiYmdhaW5fdmFsdWU9MHgxYTAwMDA2YzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTQ7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjZdLnR4YmJnYWluX3ZhbHVlPTB4MWM4MDAwNzI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjddLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTE1OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI3XS50eGJiZ2Fpbl92YWx1ZT0weDE4MDAwMDYwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI4XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xNjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyOF0udHhiYmdhaW5fdmFsdWU9MHgxOTgwMDA2NjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyOV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMTc7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjldLnR4YmJnYWluX3ZhbHVlPTB4MTU4MDAwNTY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTE4OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMwXS50eGJiZ2Fpbl92YWx1ZT0weDI2YzAwMDViOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMxXS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0xOTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMV0udHhiYmdhaW5fdmFsdWU9MHgxNDQwMDA1MTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMjA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzJdLnR4YmJnYWluX3ZhbHVlPTB4MjQ0MDAwNTE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTIxOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMzXS50eGJiZ2Fpbl92YWx1ZT0weDEzMDAwMDRjOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM0XS50eGJiX2lxX2FtcGxpZnlnYWluID0gCQkgICAgIC0yMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNF0udHhiYmdhaW5fdmFsdWU9MHgxMjAwMDA0ODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IAkJICAgICAtMjM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzVdLnR4YmJnYWluX3ZhbHVlPTB4MTEwMDAwNDQ7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAJCSAgICAgLTI0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM2XS50eGJiZ2Fpbl92YWx1ZT0weDEwMDAwMDQwOworCisJLy9jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gaXMgMHhBMjIgWzFdIGlzIDB4QTI0IC4uLls3XSBpcyAweEEyOQorCS8vVGhpcyBUYWJsZSBpcyBmb3IgQ0gxfkNIMTMKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwNDsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDMzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDMyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDIzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDA0OworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MmY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4Mjk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MjE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDJiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDFlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4Mjg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4Mjg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDI0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MjE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwkvL2Nja3R4YmJfdmFsdWVhcnJheVswXSBpcyAweEEyMiBbMV0gaXMgMHhBMjQgLi4uWzddIGlzIDB4QTI5CisJLy9UaGlzIFRhYmxlIGlzIGZvciBDSDE0CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDM1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MmU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDMyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MmI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4Mjk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4Mjc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDI4OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIzOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE3OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE3OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IFRSVUU7CisJcHJpdi0+dHhwb3dlcl9jb3VudCAgICAgICA9IDA7CisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gRkFMU0U7CisKK30KKworc3RhdGljIHZvaWQgZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwkvLyBUeCBQb3dlciB0cmFja2luZyBieSBUaGVyZW1hbCBNZXRlciByZXF1aXJlIEZpcm13YXJlIFIvVyAzLXdpcmUuIFRoaXMgbWVjaGFuaXNtCisJLy8gY2FuIGJlIGVuYWJsZWQgb25seSB3aGVuIEZpcm13YXJlIFIvVyAzLXdpcmUgaXMgZW5hYmxlZC4gT3RoZXJ3aXNlLCBmcmVxdWVudCByL3cKKwkvLyAzLXdpcmUgYnkgZHJpdmVyIGNhdXNlIFJGIGdvZXMgaW50byB3cm9uZyBzdGF0ZS4KKwlpZihwcml2LT5pZWVlODAyMTEtPkZ3UldSRikKKwkJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBUUlVFOworCWVsc2UKKwkJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBGQUxTRTsKKwlwcml2LT50eHBvd2VyX2NvdW50ICAgICAgID0gMDsKKwlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSBGQUxTRTsKK30KKworCit2b2lkIGRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNpZmRlZiBSVEw4MTkwUAorCWRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVFNTSShkZXYpOworI2Vsc2UKKwlpZihwcml2LT5iRGN1dCA9PSBUUlVFKQorCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RTU0koZGV2KTsKKwllbHNlCisJCWRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKGRldik7CisjZW5kaWYKK30vLyBkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nCisKKworc3RhdGljIHZvaWQgZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVFNTSShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTMyIHR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgPSAwOworCisJaWYoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQorCQlyZXR1cm47CisJZWxzZQorCXsKKwkJaWYoKHR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgJSAzMCA9PSAwKSYmKHR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgIT0gMCkpCisJCXsKKwkJCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwwKTsKKwkJfQorCQl0eF9wb3dlcl90cmFja19jb3VudGVyKys7CisJfQorCit9CisKKworc3RhdGljIHZvaWQgZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0YXRpYyB1OCAJVE1fVHJpZ2dlcj0wOworCS8vRGJnUHJpbnQoImRtX0NoZWNrVFhQb3dlclRyYWNraW5nKCkgXG4iKTsKKwlpZighcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcpCisJCXJldHVybjsKKwllbHNlCisJeworCQlpZihwcml2LT50eHBvd2VyX2NvdW50ICA8PSAyKQorCQl7CisJCQlwcml2LT50eHBvd2VyX2NvdW50Kys7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZighVE1fVHJpZ2dlcikKKwl7CisJCS8vQXR0ZW50aW9uISEgWW91IGhhdmUgdG8gd2lydGUgYWxsIDEyYml0cyBkYXRhIHRvIFJGLCBvciBpdCBtYXkgY2F1c2UgUkYgdG8gY3Jhc2gKKwkJLy9hY3R1YWxseSB3cml0ZSByZWcweDAyIGJpdDE9MCwgdGhlbiBiaXQxPTEuCisJCS8vRGJnUHJpbnQoIlRyaWdnZXIgVGhlcm1hbE1ldGVyLCB3cml0ZSBSRiByZWcweDIgPSAweDRkIHRvIDB4NGZcbiIpOworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0ZCk7CisJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgUkY5MF9QQVRIX0EsIDB4MDIsIGJNYXNrMTJCaXRzLCAweDRmKTsKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgwMiwgYk1hc2sxMkJpdHMsIDB4NGQpOworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0Zik7CisJCVRNX1RyaWdnZXIgPSAxOworCQlyZXR1cm47CisJfQorCWVsc2UKKwl7CisJCS8vRGJnUHJpbnQoIlNjaGVkdWxlIFR4UG93ZXJUcmFja2luZ1dvcmtJdGVtXG4iKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5wcml2X3dxLCZwcml2LT50eHBvd2VyX3RyYWNraW5nX3dxLDApOworCQlUTV9UcmlnZ2VyID0gMDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3N0YXRpYyB1MzIgdHhfcG93ZXJfdHJhY2tfY291bnRlciA9IDA7CisKKyNpZmRlZiAgUlRMODE5MFAKKwlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CisjZWxzZQorCWlmKHByaXYtPmJEY3V0ID09IFRSVUUpCisJCWRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RTU0koZGV2KTsKKwllbHNlCisJCWRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihkZXYpOworI2VuZGlmCisKK30JLy8gZG1fQ2hlY2tUWFBvd2VyVHJhY2tpbmcKKworCitzdGF0aWMgdm9pZCBkbV9DQ0tUeFBvd2VyQWRqdXN0X1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCAgYkluQ0gxNCkKK3sKKwl1MzIgVGVtcFZhbDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJLy9Xcml0ZSAweGEyMiAweGEyMworCVRlbXBWYWwgPSAwOworCWlmKCFiSW5DSDE0KXsKKwkJLy9Xcml0ZSAweGEyMiAweGEyMworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVswXSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpIDsKKworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIxLGJNYXNrSFdvcmQsIFRlbXBWYWwpOworCQkvL1dyaXRlIDB4YTI0IH4gMHhhMjcKKwkJVGVtcFZhbCA9IDA7CisJCVRlbXBWYWwgPSAJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdICsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVszXTw8OCkgKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdPDwxNiApKworCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdPDwyNCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsYk1hc2tEV29yZCwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjggIDB4YTI5CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs2XSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN108PDgpIDsKKworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfRGVidWdQb3J0LGJNYXNrTFdvcmQsIFRlbXBWYWwpOworCX0KKwllbHNlCisJeworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdICsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSxiTWFza0hXb3JkLCBUZW1wVmFsKTsKKwkJLy9Xcml0ZSAweGEyNCB+IDB4YTI3CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdICsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdPDw4KSArCisJCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25dLmNja3R4YmJfdmFsdWVhcnJheVs0XTw8MTYgKSsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdPDwyNCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsYk1hc2tEV29yZCwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjggIDB4YTI5CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdICsKKwkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlW3ByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCxiTWFza0xXb3JkLCBUZW1wVmFsKTsKKwl9CisKKworfQorCitzdGF0aWMgdm9pZCBkbV9DQ0tUeFBvd2VyQWRqdXN0X1RoZXJtYWxNZXRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAlib29sICBiSW5DSDE0KQoreworCXUzMiBUZW1wVmFsOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCVRlbXBWYWwgPSAwOworCWlmKCFiSW5DSDE0KQorCXsKKwkJLy9Xcml0ZSAweGEyMiAweGEyMworCQlUZW1wVmFsID0gCUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVswXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMV08PDgpIDsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjQgfiAweGEyNworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMl0gKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzNdPDw4KSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNF08PDE2ICkrCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNV08PDI0KTsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMiwgYk1hc2tEV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMiwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjggIDB4YTI5CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVs2XSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bN108PDgpIDsKKworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfRGVidWdQb3J0LCBiTWFza0xXb3JkLCBUZW1wVmFsKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBub3QgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAorCQkJckNDSzBfRGVidWdQb3J0LCBUZW1wVmFsKTsKKwl9CisJZWxzZQorCXsKKy8vCQlwcml2LT5DQ0tUeFBvd2VyQWRqdXN0Q250Tm90Q2gxNCsrOwkvL2Nvc2EgYWRkIGZvciBkZWJ1Zy4KKwkJLy9Xcml0ZSAweGEyMiAweGEyMworCQlUZW1wVmFsID0gCUNDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzBdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzFdPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAorCQkJckNDSzBfVHhGaWx0ZXIxLCBUZW1wVmFsKTsKKwkJLy9Xcml0ZSAweGEyNCB+IDB4YTI3CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCUNDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzJdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzNdPDw4KSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs0XTw8MTYgKSsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzVdPDwyNCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMiwgVGVtcFZhbCk7CisJCS8vV3JpdGUgMHhhMjggIDB4YTI5CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gCUNDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzZdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsIkNDSyBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9EZWJ1Z1BvcnQsIFRlbXBWYWwpOworCX0KK30KKworCisKK2V4dGVybiB2b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCWJvb2wgIGJpbmNoMTQKKykKK3sJLy8gZG1fQ0NLVHhQb3dlckFkanVzdAorCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworI2lmZGVmIFJUTDgxOTBQCisJZG1fQ0NLVHhQb3dlckFkanVzdF9UU1NJKGRldiwgYmluY2gxNCk7CisjZWxzZQorCWlmKHByaXYtPmJEY3V0ID09IFRSVUUpCisJCWRtX0NDS1R4UG93ZXJBZGp1c3RfVFNTSShkZXYsIGJpbmNoMTQpOworCWVsc2UKKwkJZG1fQ0NLVHhQb3dlckFkanVzdF9UaGVybWFsTWV0ZXIoZGV2LCBiaW5jaDE0KTsKKyNlbmRpZgorfQorCisKKyNpZm5kZWYgIFJUTDgxOTJVCitzdGF0aWMgdm9pZCBkbV90eHBvd2VyX3Jlc2V0X3JlY292ZXJ5KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiU3RhcnQgUmVzZXQgUmVjb3ZlcnkgPT0+XG4iKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIDB4YzgwIGlzICUwOHhcbiIscHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIFJGQV90eFBvd2VyVHJhY2tpbmdJbmRleCBpcyAleFxuIixwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeSA6IFJGIEEgSS9RIEFtcGxpZnkgR2FpbiBpcyAlbGRcbiIscHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiX2lxX2FtcGxpZnlnYWluKTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3Zlcnk6IENDSyBBdHRlbnVhdGlvbiBpcyAlZCBkQlxuIixwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24pOworCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhdLnR4YmJnYWluX3ZhbHVlKTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3Zlcnk6IEZpbGwgaW4gMHhjOTAgaXMgJTA4eFxuIixwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhdLnR4YmJnYWluX3ZhbHVlKTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3Zlcnk6IEZpbGwgaW4gUkZDX3R4UG93ZXJUcmFja2luZ0luZGV4IGlzICV4XG4iLHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5IDogUkYgQyBJL1EgQW1wbGlmeSBHYWluIGlzICVsZFxuIixwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhdLnR4YmJfaXFfYW1wbGlmeWdhaW4pOworCit9CS8vIGRtX1RYUG93ZXJSZXNldFJlY292ZXJ5CisKK2V4dGVybiB2b2lkIGRtX3Jlc3RvcmVfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIAlyZWdfcmF0ciA9IHByaXYtPnJhdGVfYWRhcHRpdmUubGFzdF9yYXRyOworCisJaWYoIXByaXYtPnVwKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9SQVRFLCAiPC0tLS0gZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZSgpOiBkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8vCisJLy8gUmVzdG9yZSBwcmV2aW91cyBzdGF0ZSBmb3IgcmF0ZSBhZGFwdGl2ZQorCS8vCisJaWYocHJpdi0+cmF0ZV9hZGFwdGl2ZS5yYXRlX2FkYXB0aXZlX2Rpc2FibGVkKQorCQlyZXR1cm47CisJLy8gVE9ETzogT25seSAxMW4gbW9kZSBpcyBpbXBsZW1lbnRlZCBjdXJyZW50bHksCisJaWYoICEocHJpdi0+aWVlZTgwMjExLT5tb2RlPT1XSVJFTEVTU19NT0RFX05fMjRHIHx8CisJCSBwcml2LT5pZWVlODAyMTEtPm1vZGU9PVdJUkVMRVNTX01PREVfTl81RykpCisJCSByZXR1cm47CisJeworCQkJLyogMjAwNy8xMS8xNSBNSCBDb3B5IGZyb20gODE5MFBDSS4gKi8KKwkJCXUzMiByYXRyX3ZhbHVlOworCQkJcmF0cl92YWx1ZSA9IHJlZ19yYXRyOworCQkJaWYocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQkvLyAxVDJSLCBTcGF0aWFsIFN0cmVhbSAyIHNob3VsZCBiZSBkaXNhYmxlZAorCQkJeworCQkJCXJhdHJfdmFsdWUgJj1+IChSQVRFX0FMTF9PRkRNXzJTUyk7CisJCQkJLy9EYmdQcmludCgiSFdfVkFSX1RBVFJfMCBmcm9tIDB4JXggPT0+IDB4JXhcbiIsICgocHU0Qnl0ZSkodmFsKSlbMF0sIHJhdHJfdmFsdWUpOworCQkJfQorCQkJLy9EYmdQcmludCgic2V0IEhXX1ZBUl9UQVRSXzAgPSAweCV4XG4iLCByYXRyX3ZhbHVlKTsKKwkJCS8vY29zYSBQbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKEFkYXB0ZXIsIFJBVFIwLCAoKHB1NEJ5dGUpKHZhbCkpWzBdKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJBVFIwLCByYXRyX3ZhbHVlKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7CisJfQorCS8vUmVzb3JlIFRYIFBvd2VyIFRyYWNraW5nIEluZGV4CisJaWYocHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ICYmIHByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKXsKKwkJZG1fdHhwb3dlcl9yZXNldF9yZWNvdmVyeShkZXYpOworCX0KKworCS8vCisJLy9SZXN0b3JlIEJCIEluaXRpYWwgR2FpbgorCS8vCisJZG1fYmJfaW5pdGlhbGdhaW5fcmVzdG9yZShkZXYpOworCit9CS8vIERNX1Jlc3RvcmVEeW5hbWljTWVjaGFuaXNtU3RhdGUKKworc3RhdGljIHZvaWQgZG1fYmJfaW5pdGlhbGdhaW5fcmVzdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYml0X21hc2sgPSAweDdmOyAvL0JpdDB+IEJpdDYKKworCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfUlNTSSkKKwkJcmV0dXJuOworCisJLy9EaXNhYmxlIEluaXRpYWwgR2FpbgorCS8vUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFVGV1AsIGJNYXNrTFdvcmQsIDB4ODAwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJYml0X21hc2sgID0gYk1hc2tCeXRlMjsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNjAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNjggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisJLy9FbmFibGUgSW5pdGlhbCBHYWluCisJLy9QSFlfU2V0QkJSZWcoQWRhcHRlciwgVUZXUCwgYk1hc2tMV29yZCwgMHgxMDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKworfQkvLyBkbV9CQkluaXRpYWxHYWluUmVzdG9yZQorCisKK2V4dGVybiB2b2lkIGRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vIEZzeW5jIHRvIGF2b2lkIHJlc2V0CisJcHJpdi0+YnN3aXRjaF9mc3luYyAgPSBmYWxzZTsKKwlwcml2LT5iZnN5bmNfcHJvY2Vzc2luZyA9IGZhbHNlOworCS8vQmFja3VwIEJCIEluaXRpYWxHYWluCisJZG1fYmJfaW5pdGlhbGdhaW5fYmFja3VwKGRldik7CisKK30JLy8gRE1fQmFja3VwRHluYW1pY01lY2hhbmlzbVN0YXRlCisKKworc3RhdGljIHZvaWQgZG1fYmJfaW5pdGlhbGdhaW5fYmFja3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBiaXRfbWFzayA9IGJNYXNrQnl0ZTA7IC8vQml0MH4gQml0NgorCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9SU1NJKQorCQlyZXR1cm47CisKKwkvL1BIWV9TZXRCQlJlZyhBZGFwdGVyLCBVRldQLCBiTWFza0xXb3JkLCAweDgwMCk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCXByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBiaXRfbWFzayk7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGJpdF9tYXNrKTsKKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgYml0X21hc2spOworCXByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBiaXRfbWFzayk7CisJYml0X21hc2sgID0gYk1hc2tCeXRlMjsKKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJDQ0swX0NDQSwgYml0X21hc2spOworCisJUlRfVFJBQ0UoQ09NUF9ESUcsICJCQkluaXRpYWxHYWluQmFja3VwIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgIkJCSW5pdGlhbEdhaW5CYWNrdXAgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM2MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsICJCQkluaXRpYWxHYWluQmFja3VwIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgIkJCSW5pdGlhbEdhaW5CYWNrdXAgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKK30gICAvLyBkbV9CQkluaXRpYWxHYWluQmFrY3VwCisKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaCgpCisgKgorICogT3ZlcnZpZXc6CisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjkvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gdm9pZCBkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkJdTMyCQlkbV90eXBlLAorCQkJCQkJCQl1MzIJCWRtX3ZhbHVlKQoreworCWlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9ISUdIKQorCXsKKwkJZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCA9IGRtX3ZhbHVlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9MT1cpCisJeworCQlkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2ggPSBkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSFBXUl9ISUdIKQorCXsKKwkJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2ggPSBkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSFBXUl9ISUdIKQorCXsKKwkJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2ggPSBkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9FTkFCTEUpCisJeworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CisJCWRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZwk9IHRydWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfRElTQUJMRSkKKwl7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZQkJPSBETV9TVEFfRElHX01BWDsKKwkJZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnCT0gZmFsc2U7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfREJHX01PREUpCisJeworCQlpZihkbV92YWx1ZSA+PSBETV9EQkdfTUFYKQorCQkJZG1fdmFsdWUgPSBETV9EQkdfT0ZGOworCQlkbV9kaWd0YWJsZS5kYmdfbW9kZQkJPSAodTgpZG1fdmFsdWU7CisJfQorCWVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfUlNTSSkKKwl7CisJCWlmKGRtX3ZhbHVlID4gMTAwKQorCQkJZG1fdmFsdWUgPSAzMDsKKwkJZG1fZGlndGFibGUucnNzaV92YWwJCQk9IChsb25nKWRtX3ZhbHVlOworCX0KKwllbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0FMR09SSVRITSkKKwl7CisJCWlmIChkbV92YWx1ZSA+PSBESUdfQUxHT19NQVgpCisJCQlkbV92YWx1ZSA9IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNOworCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtICE9ICh1OClkbV92YWx1ZSkKKwkJCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoID0gMTsKKwkJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobQk9ICh1OClkbV92YWx1ZTsKKwl9CisJZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9CQUNLT0ZGKQorCXsKKwkJaWYoZG1fdmFsdWUgPiAzMCkKKwkJCWRtX3ZhbHVlID0gMzA7CisJCWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsCQk9ICh1OClkbV92YWx1ZTsKKwl9CisJZWxzZSBpZihkbV90eXBlID09IERJR19UWVBFX1JYX0dBSU5fTUlOKQorCXsKKwkJaWYoZG1fdmFsdWUgPT0gMCkKKwkJCWRtX3ZhbHVlID0gMHgxOworCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9ICh1OClkbV92YWx1ZTsKKwl9CisJZWxzZSBpZihkbV90eXBlID09IERJR19UWVBFX1JYX0dBSU5fTUFYKQorCXsKKwkJaWYoZG1fdmFsdWUgPiAweDUwKQorCQkJZG1fdmFsdWUgPSAweDUwOworCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21heCA9ICh1OClkbV92YWx1ZTsKKwl9Cit9CS8qIERNX0NoYW5nZUR5bmFtaWNJbml0R2FpblRocmVzaCAqLworZXh0ZXJuCXZvaWQKK2RtX2NoYW5nZV9mc3luY19zZXR0aW5nKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJczMyCQlETV9UeXBlLAorCXMzMgkJRE1fVmFsdWUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKERNX1R5cGUgPT0gMCkJLy8gbW9uaXRvciAweGMzOCByZWdpc3RlcgorCXsKKwkJaWYoRE1fVmFsdWUgPiAxKQorCQkJRE1fVmFsdWUgPSAxOworCQlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gKHU4KURNX1ZhbHVlOworCQkvL0RiZ1ByaW50KCJwSGFsRGF0YS0+ZnJhbWVzeW5jTW9uaXRvciA9ICVkIiwgcEhhbERhdGEtPmZyYW1lc3luY01vbml0b3IpOworCX0KK30KKworZXh0ZXJuIHZvaWQKK2RtX2NoYW5nZV9yeHBhdGhfc2VsZWN0aW9uX3NldHRpbmcoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzMzIJCURNX1R5cGUsCisJczMyCQlETV9WYWx1ZSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcHJhdGVfYWRhcHRpdmUgCXBSQSA9IChwcmF0ZV9hZGFwdGl2ZSkmKHByaXYtPnJhdGVfYWRhcHRpdmUpOworCisKKwlpZihETV9UeXBlID09IDApCisJeworCQlpZihETV9WYWx1ZSA+IDEpCisJCQlETV9WYWx1ZSA9IDE7CisJCURNX1J4UGF0aFNlbFRhYmxlLkVuYWJsZSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDEpCisJeworCQlpZihETV9WYWx1ZSA+IDEpCisJCQlETV9WYWx1ZSA9IDE7CisJCURNX1J4UGF0aFNlbFRhYmxlLkRiZ01vZGUgPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAyKQorCXsKKwkJaWYoRE1fVmFsdWUgPiA0MCkKKwkJCURNX1ZhbHVlID0gNDA7CisJCURNX1J4UGF0aFNlbFRhYmxlLlNTX1RIX2xvdyA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDMpCisJeworCQlpZihETV9WYWx1ZSA+IDI1KQorCQkJRE1fVmFsdWUgPSAyNTsKKwkJRE1fUnhQYXRoU2VsVGFibGUuZGlmZl9USCA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDQpCisJeworCQlpZihETV9WYWx1ZSA+PSBDQ0tfUnhfVmVyc2lvbl9NQVgpCisJCQlETV9WYWx1ZSA9IENDS19SeF9WZXJzaW9uXzE7CisJCURNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2Q9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDEwKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxMDApCisJCQlETV9WYWx1ZSA9IDUwOworCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9yc3NpWzBdID0gKHU4KURNX1ZhbHVlOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMTEpCisJeworCQlpZihETV9WYWx1ZSA+IDEwMCkKKwkJCURNX1ZhbHVlID0gNTA7CisJCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbMV0gPSAodTgpRE1fVmFsdWU7CisJfQorCWVsc2UgaWYoRE1fVHlwZSA9PSAxMikKKwl7CisJCWlmKERNX1ZhbHVlID4gMTAwKQorCQkJRE1fVmFsdWUgPSA1MDsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVsyXSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDEzKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAxMDApCisJCQlETV9WYWx1ZSA9IDUwOworCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9yc3NpWzNdID0gKHU4KURNX1ZhbHVlOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMjApCisJeworCQlpZihETV9WYWx1ZSA+IDEpCisJCQlETV9WYWx1ZSA9IDE7CisJCXBSQS0+cGluZ19yc3NpX2VuYWJsZSA9ICh1OClETV9WYWx1ZTsKKwl9CisJZWxzZSBpZihETV9UeXBlID09IDIxKQorCXsKKwkJaWYoRE1fVmFsdWUgPiAzMCkKKwkJCURNX1ZhbHVlID0gMzA7CisJCXBSQS0+cGluZ19yc3NpX3RocmVzaF9mb3JfcmEgPSBETV9WYWx1ZTsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2RpZ19pbml0KCkKKyAqCisgKiBPdmVydmlldzoJU2V0IERJRyBzY2hlbWUgaW5pdCB2YWx1ZS4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8xNS8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2RpZ19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCS8qIDIwMDcvMTAvMDUgTUggRGlzYWJsZSBESUcgc2NoZW1lIG5vdy4gTm90IHRlc3RlZC4gKi8KKwlkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcJPSB0cnVlOworCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPSBESUdfQUxHT19CWV9SU1NJOworCWRtX2RpZ3RhYmxlLmRiZ19tb2RlID0gRE1fREJHX09GRjsJLy9vZmY9YnkgcmVhbCByc3NpIHZhbHVlLCBvbj1ieSBETV9EaWdUYWJsZS5Sc3NpX3ZhbCBmb3IgbmV3IGRpZworCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoID0gMDsKKworCS8qIDIwMDcvMTAvMDQgTUggRGVmaW5lIGluaXQgZ2FpbiB0aHJlc2hvbC4gKi8KKwlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CisJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUJPSBETV9TVEFfRElHX01BWDsKKwlkbV9kaWd0YWJsZS5pbml0aWFsZ2Fpbl9sb3dlcmJvdW5kX3N0YXRlID0gZmFsc2U7CisKKwlkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2ggCT0gRE1fRElHX1RIUkVTSF9MT1c7CisJZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCAJPSBETV9ESUdfVEhSRVNIX0hJR0g7CisKKwlkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoID0gRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9MT1c7CisJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2ggPSBETV9ESUdfSElHSF9QV1JfVEhSRVNIX0hJR0g7CisKKwlkbV9kaWd0YWJsZS5yc3NpX3ZhbCA9IDUwOwkvL2ZvciBuZXcgZGlnIGRlYnVnIHJzc2kgdmFsdWUKKwlkbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbCA9IERNX0RJR19CQUNLT0ZGOworCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gRE1fRElHX01BWDsKKwlpZihwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCisJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTl9OZXRjb3JlOworCWVsc2UKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSBETV9ESUdfTUlOOworCit9CS8qIGRtX2RpZ19pbml0ICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpKCkKKyAqCisgKiBPdmVydmlldzoJRHJpdmVyIG11c3QgbW9uaXRvciBSU1NJIGFuZCBub3RpZnkgZmlybXdhcmUgdG8gY2hhbmdlIGluaXRpYWwKKyAqCQkJCWdhaW4gYWNjb3JkaW5nIHRvIGRpZmZlcmVudCB0aHJlc2hvbGQuIEJCIHRlYW0gcHJvdmlkZSB0aGUKKyAqCQkJCXN1Z2dlc3RlZCBzb2x1dGlvbi4KKyAqCisgKiBJbnB1dDoJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjcvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnID09IGZhbHNlKQorCQlyZXR1cm47CisKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQorCQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9md2ZhbHNlX2FsYXJtKGRldik7CisJZWxzZSBpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX1JTU0kpCisJCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koZGV2KTsKKy8vCQk7CisJZWxzZQorCQlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZHJpdmVycnNzaSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBpOworCXN0YXRpYyB1OCAJZndfZGlnPTA7CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnID09IGZhbHNlKQorCQlyZXR1cm47CisKKwkvL0RiZ1ByaW50KCJEaWcgYnkgU3cgUnNzaSBcbiIpOworCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoKQkvLyBpZiBzd2l0aGVkIGFsZ29yaXRobSwgd2UgaGF2ZSB0byBkaXNhYmxlIEZXIERpZy4KKwkJZndfZGlnID0gMDsKKwlpZihmd19kaWcgPD0gMykJLy8gZXhlY3V0ZSBzZXZlcmFsIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGUgRlcgRGlnIGlzIGRpc2FibGVkCisJey8vIEZXIERJRyBPZmYKKwkJZm9yKGk9MDsgaTwzOyBpKyspCisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCisJCWZ3X2RpZysrOworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX09GRjsJLy9mdyBkaWcgb2ZmLgorCX0KKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUgPSBESUdfQ09OTkVDVDsKKwllbHNlCisJCWRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlID0gRElHX0RJU0NPTk5FQ1Q7CisKKwkvL0RiZ1ByaW50KCJETV9EaWdUYWJsZS5QcmVDb25uZWN0U3RhdGUgPSAlZCwgRE1fRGlnVGFibGUuQ3VyQ29ubmVjdFN0YXRlID0gJWQgXG4iLAorCQkvL0RNX0RpZ1RhYmxlLlByZUNvbm5lY3RTdGF0ZSwgRE1fRGlnVGFibGUuQ3VyQ29ubmVjdFN0YXRlKTsKKworCWlmKGRtX2RpZ3RhYmxlLmRiZ19tb2RlID09IERNX0RCR19PRkYpCisJCWRtX2RpZ3RhYmxlLnJzc2lfdmFsID0gcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKwkvL0RiZ1ByaW50KCJETV9EaWdUYWJsZS5Sc3NpX3ZhbCA9ICVkIFxuIiwgRE1fRGlnVGFibGUuUnNzaV92YWwpOworCWRtX2luaXRpYWxfZ2FpbihkZXYpOworCWRtX3BkX3RoKGRldik7CisJZG1fY3NfcmF0aW8oZGV2KTsKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkKKwkJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOworCWRtX2RpZ3RhYmxlLnByZV9jb25uZWN0X3N0YXRlID0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGU7CisKK30JLyogZG1fQ3RybEluaXRHYWluQnlSc3NpICovCisKK3N0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2Z3ZmFsc2VfYWxhcm0oCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RhdGljIHUzMiByZXNldF9jbnQgPSAwOworCXU4IGk7CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnID09IGZhbHNlKQorCQlyZXR1cm47CisKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkKKwl7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfTUFYOworCQkvLyBGdyBESUcgT24uCisJCWZvcihpPTA7IGk8MzsgaSsrKQorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCQlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CisJfQorCisJaWYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKKwkJcmV0dXJuOworCisJLy8gRm9yIHNtb290aCwgd2UgY2FuIG5vdCBjaGFuZ2UgRElHIHN0YXRlLgorCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkgJiYKKwkJKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSkKKwl7CisJCXJldHVybjsKKwl9CisJLy9EYmdQcmludCgiRGlnIGJ5IEZ3IEZhbHNlIEFsYXJtXG4iKTsKKwkvL2lmIChETV9EaWdUYWJsZS5EaWdfU3RhdGUgPT0gRE1fU1RBX0RJR19PRkYpCisJLypEYmdQcmludCgiRElHIENoZWNrXG5cciBSU1NJPSVkIExPVz0lZCBISUdIPSVkIFNUQVRFPSVkIiwKKwlwSGFsRGF0YS0+VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIsIERNX0RpZ1RhYmxlLlJzc2lMb3dUaHJlc2gsCisJRE1fRGlnVGFibGUuUnNzaUhpZ2hUaHJlc2gsIERNX0RpZ1RhYmxlLkRpZ19TdGF0ZSk7Ki8KKwkvKiAxLiBXaGVuIFJTU0kgZGVjcmVhc2UsIFdlIGhhdmUgdG8ganVkZ2UgaWYgaXQgaXMgc21hbGxlciB0aGFuIGEgdHJlc2hvbGQKKwkJICBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICovCisJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCisJeworCQkvKiAyMDA4LzAyLzA1IE1IIFdoZW4gd2UgZXhlY3V0ZSBzaWxlbnQgcmVzZXQsIHRoZSBESUcgUEhZIHBhcmFtZXRlcnMKKwkJICAgd2lsbCBiZSByZXNldCB0byBpbml0IHZhbHVlLiBXZSBtdXN0IHByZXZlbnQgdGhlIGNvbmRpdGlvbi4gKi8KKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09GRiAmJgorCQkJKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudCkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCQl9CisKKwkJLy8gSWYgRElHIGlzIG9mZiwgRElHIGhpZ2ggcG93ZXIgc3RhdGUgbXVzdCByZXNldC4KKwkJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPSBETV9TVEFfRElHX01BWDsKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19PRkY7CisKKwkJLy8gMS4xIERJRyBPZmYuCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KKworCQkvLyAxLjIgU2V0IGluaXRpYWwgZ2Fpbi4KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgMHgxNyk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIDB4MTcpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCAweDE3KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgMHgxNyk7CisKKwkJLy8gMS4zIExvd2VyIFBEX1RIIGZvciBPRkRNLgorCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQl7CisJCQkvKiAyMDA4LzAxLzExIE1IIDQwTUhaIDkwLzkyIHJlZ2lzdGVyIGFyZSBub3QgdGhlIHNhbWUuICovCisJCQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSA5MlUvOTJFIFBEX1RIIGFyZSB0aGUgc2FtZS4KKwkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQwKTsKKwkJCSNlbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MDApOworCQkJI2VuZGlmCisJCQkvKmVsc2UgaWYgKHByaXYtPmNhcmRfODE5MiA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTBQKQorCQkJCXdyaXRlX25pY19ieXRlKHBBZGFwdGVyLCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDApOworCQkJKi8KKwkJCS8vZWxzZSBpZiAocEFkYXB0ZXItPkhhcmR3YXJlVHlwZSA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTJFKQorCisKKwkJCS8vZWxzZQorCQkJCS8vUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwQWRhcHRlciwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQwKTsKKwkJfQorCQllbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisKKwkJLy8gMS40IExvd2VyIENTIHJhdGlvIGZvciBDQ0suCisJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIDB4MDgpOworCisJCS8vIDEuNSBIaWdoZXIgRURDQ0EuCisJCS8vUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIDB4MzI1KTsKKwkJcmV0dXJuOworCisJfQorCisJLyogMi4gV2hlbiBSU1NJIGluY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIGxhcmdlciB0aGFuIGEgdHJlc2hvbGQKKwkJICBhbmQgdGhlbiBleGVjdXRlIGJlbG93IHN0ZXAuICAqLworCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSApCisJeworCQl1OCByZXNldF9mbGFnID0gMDsKKworCQlpZiAoZG1fZGlndGFibGUuZGlnX3N0YXRlID09IERNX1NUQV9ESUdfT04gJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnQpKQorCQl7CisJCQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKGRldik7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQorCQkJCXJlc2V0X2ZsYWcgPSAxOworCisJCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwkJfQorCisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT047CisJCS8vRGJnUHJpbnQoIkRJRyBPTlxuXHIiKTsKKworCQkvLyAyLjEgU2V0IGluaXRpYWwgZ2Fpbi4KKwkJLy8gMjAwOC8wMi8yNiBNSCBTRDMtSmVycnkgc3VnZ2VzdCB0byBwcmV2ZW50IGRpcnR5IGVudmlyb25tZW50LgorCQlpZiAocmVzZXRfZmxhZyA9PSAxKQorCQl7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCAweDJjKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIDB4MmMpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgyYyk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCAweDJjKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIDB4MjApOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgMHgyMCk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCAweDIwKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIDB4MjApOworCQl9CisKKwkJLy8gMi4yIEhpZ2hlciBQRF9USCBmb3IgT0ZETS4KKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJeworCQkJLyogMjAwOC8wMS8xMSBNSCA0ME1IWiA5MC85MiByZWdpc3RlciBhcmUgbm90IHRoZSBzYW1lLiAqLworCQkJLy8gMjAwOC8wMi8wNSBNSCBTRDMtSmVycnkgOTJVLzkyRSBQRF9USCBhcmUgdGhlIHNhbWUuCisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDIwKTsKKwkJCSNlbmRpZgorCQkJLyoKKwkJCWVsc2UgaWYgKHByaXYtPmNhcmRfODE5MiA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTBQKQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCSovCisJCQkvL2Vsc2UgaWYgKHBBZGFwdGVyLT5IYXJkd2FyZVR5cGUgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkyRSkKKworCQkJLy9lbHNlCisJCQkJLy9QbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBBZGFwdGVyLCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQl9CisJCWVsc2UKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQ0KTsKKworCQkvLyAyLjMgSGlnaGVyIENTIHJhdGlvIGZvciBDQ0suCisJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIDB4Y2QpOworCisJCS8vIDIuNCBMb3dlciBFRENDQS4KKwkJLyogMjAwOC8wMS8xMSBNSCA5MC85MiBzZXJpZXMgYXJlIHRoZSBzYW1lLiAqLworCQkvL1BsYXRmb3JtRUZJT1dyaXRlNEJ5dGUocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCAweDM0Nik7CisKKwkJLy8gMi41IERJRyBPbi4KKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgorCisJfQorCisJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihkZXYpOworCit9CS8qIGRtX0N0cmxJbml0R2FpbkJ5UnNzaSAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKCkKKyAqCisgKiBPdmVydmlldzoKKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yOC8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2hpZ2hwd3IoCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0YXRpYyB1MzIgcmVzZXRfY250X2hpZ2hwd3IgPSAwOworCisJLy8gRm9yIHNtb290aCwgd2UgY2FuIG5vdCBjaGFuZ2UgaGlnaCBwb3dlciBESUcgc3RhdGUgaW4gdGhlIHJhbmdlLgorCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2gpICYmCisJCShwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpKQorCXsKKwkJcmV0dXJuOworCX0KKworCS8qIDMuIFdoZW4gUlNTSSA+NzUlIG9yIDw3MCUsIGl0IGlzIGEgaGlnaCBwb3dlciBpc3N1ZS4gV2UgaGF2ZSB0byBqdWRnZSBpZgorCQkgIGl0IGlzIGxhcmdlciB0aGFuIGEgdHJlc2hvbGQgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KKwkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSBNb2RpZnkgUERfVEggZm9yIGhpZ2ggcG93ZXIgaXNzdWUuCisJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpCisJeworCQlpZiAoZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPT0gRE1fU1RBX0RJR19PTiAmJgorCQkJKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudF9oaWdocHdyKSkKKwkJCXJldHVybjsKKwkJZWxzZQorCQkJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPSBETV9TVEFfRElHX09OOworCisJCS8vIDMuMSBIaWdoZXIgUERfVEggZm9yIE9GRE0gZm9yIGhpZ2ggcG93ZXIgc3RhdGUuCisJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCXsKKwkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQxKTsKKwkJCSNlbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MTApOworCQkJI2VuZGlmCisKKwkJCS8qZWxzZSBpZiAocHJpdi0+Y2FyZF84MTkyID09IEhBUkRXQVJFX1RZUEVfUlRMODE5MFApCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDEpOworCQkJKi8KKworCQl9CisJCWVsc2UKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQzKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID09IERNX1NUQV9ESUdfT0ZGJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnRfaGlnaHB3cikpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PRkY7CisKKwkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoICYmCisJCQkgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKQorCQl7CisJCQkvLyAzLjIgUmVjb3ZlciBQRF9USCBmb3IgT0ZETSBmb3Igbm9ybWFsIHBvd2VyIHJlZ2lvbi4KKwkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQl7CisJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCQkjZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgyMCk7CisJCQkJI2VuZGlmCisJCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQkJCSovCisKKwkJCX0KKwkJCWVsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7CisJCX0KKwl9CisKKwlyZXNldF9jbnRfaGlnaHB3ciA9IHByaXYtPnJlc2V0X2NvdW50OworCit9CS8qIGRtX0N0cmxJbml0R2FpbkJ5UnNzaUhpZ2hQd3IgKi8KKworCitzdGF0aWMgdm9pZCBkbV9pbml0aWFsX2dhaW4oCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXU4CQkJCQlpbml0aWFsX2dhaW49MDsKKwlzdGF0aWMgdTgJCQkJaW5pdGlhbGl6ZWQ9MCwgZm9yY2Vfd3JpdGU9MDsKKwlzdGF0aWMgdTMyCQkJcmVzZXRfY250PTA7CisKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkKKwl7CisJCWluaXRpYWxpemVkID0gMDsKKwkJcmVzZXRfY250ID0gMDsKKwl9CisKKwlpZihkbV9kaWd0YWJsZS5wcmVfY29ubmVjdF9zdGF0ZSA9PSBkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSkKKwl7CisJCWlmKGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlID09IERJR19DT05ORUNUKQorCQl7CisJCQlpZigoZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWwpID4gZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXgpCisJCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9tYXg7CisJCQllbHNlIGlmKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCsxMC1kbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbCkgPCBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbikKKwkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbjsKKwkJCWVsc2UKKwkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBkbV9kaWd0YWJsZS5yc3NpX3ZhbCsxMC1kbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbDsKKwkJfQorCQllbHNlCQkvL2N1cnJlbnQgc3RhdGUgaXMgZGlzY29ubmVjdGVkCisJCXsKKwkJCWlmKGRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9PSAwKQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXTsKKwkJCWVsc2UKKwkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWU7CisJCX0KKwl9CisJZWxzZQkvLyBkaXNjb25uZWN0ZWQgLT4gY29ubmVjdGVkIG9yIGNvbm5lY3RlZCAtPiBkaXNjb25uZWN0ZWQKKwl7CisJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXTsKKwkJZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlID0gMDsKKwl9CisJLy9EYmdQcmludCgiRE1fRGlnVGFibGUuQ3VySUdWYWx1ZSA9IDB4JXgsIERNX0RpZ1RhYmxlLlByZUlHVmFsdWUgPSAweCV4XG4iLCBETV9EaWdUYWJsZS5DdXJJR1ZhbHVlLCBETV9EaWdUYWJsZS5QcmVJR1ZhbHVlKTsKKworCS8vIGlmIHNpbGVudCByZXNldCBoYXBwZW5lZCwgd2Ugc2hvdWxkIHJld3JpdGUgdGhlIHZhbHVlcyBiYWNrCisJaWYocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQorCXsKKwkJZm9yY2Vfd3JpdGUgPSAxOworCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwl9CisKKwlpZihkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWUgIT0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxKSkKKwkJZm9yY2Vfd3JpdGUgPSAxOworCisJeworCQlpZigoZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlICE9IGRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSkKKwkJCXx8ICFpbml0aWFsaXplZCB8fCBmb3JjZV93cml0ZSkKKwkJeworCQkJaW5pdGlhbF9nYWluID0gKHU4KWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZTsKKwkJCS8vRGJnUHJpbnQoIldyaXRlIGluaXRpYWwgZ2FpbiA9IDB4JXhcbiIsIGluaXRpYWxfZ2Fpbik7CisJCQkvLyBTZXQgaW5pdGlhbCBnYWluLgorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCWRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZTsKKwkJCWluaXRpYWxpemVkID0gMTsKKwkJCWZvcmNlX3dyaXRlID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG1fcGRfdGgoCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0YXRpYyB1OAkJCQlpbml0aWFsaXplZD0wLCBmb3JjZV93cml0ZT0wOworCXN0YXRpYyB1MzIJCQlyZXNldF9jbnQgPSAwOworCisJaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYoZG1fZGlndGFibGUucHJlX2Nvbm5lY3Rfc3RhdGUgPT0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUpCisJeworCQlpZihkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9PSBESUdfQ09OTkVDVCkKKwkJeworCQkJaWYgKGRtX2RpZ3RhYmxlLnJzc2lfdmFsID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKQorCQkJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfSElHSF9QT1dFUjsKKwkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQorCQkJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfTE9XX1BPV0VSOworCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpICYmCisJCQkJCShkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2gpKQorCQkJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfTk9STUFMX1BPV0VSOworCQkJZWxzZQorCQkJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBkbV9kaWd0YWJsZS5wcmVwZF90aHN0YXRlOworCQl9CisJCWVsc2UKKwkJeworCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9MT1dfUE9XRVI7CisJCX0KKwl9CisJZWxzZQkvLyBkaXNjb25uZWN0ZWQgLT4gY29ubmVjdGVkIG9yIGNvbm5lY3RlZCAtPiBkaXNjb25uZWN0ZWQKKwl7CisJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfTE9XX1BPV0VSOworCX0KKworCS8vIGlmIHNpbGVudCByZXNldCBoYXBwZW5lZCwgd2Ugc2hvdWxkIHJld3JpdGUgdGhlIHZhbHVlcyBiYWNrCisJaWYocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQorCXsKKwkJZm9yY2Vfd3JpdGUgPSAxOworCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwl9CisKKwl7CisJCWlmKChkbV9kaWd0YWJsZS5wcmVwZF90aHN0YXRlICE9IGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUpIHx8CisJCQkoaW5pdGlhbGl6ZWQ8PTMpIHx8IGZvcmNlX3dyaXRlKQorCQl7CisJCQkvL0RiZ1ByaW50KCJXcml0ZSBQRF9USCBzdGF0ZSA9ICVkXG4iLCBETV9EaWdUYWJsZS5DdXJQRF9USFN0YXRlKTsKKwkJCWlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX0xPV19QT1dFUikKKwkJCXsKKwkJCQkvLyBMb3dlciBQRF9USCBmb3IgT0ZETS4KKwkJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCXsKKwkJCQkJLyogMjAwOC8wMS8xMSBNSCA0ME1IWiA5MC85MiByZWdpc3RlciBhcmUgbm90IHRoZSBzYW1lLiAqLworCQkJCQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSA5MlUvOTJFIFBEX1RIIGFyZSB0aGUgc2FtZS4KKwkJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0MCk7CisJCQkJCSNlbHNlCisJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgwMCk7CisJCQkJCSNlbmRpZgorCQkJCQkvKmVsc2UgaWYgKHByaXYtPmNhcmRfODE5MiA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTBQKQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDApOworCQkJCQkqLworCQkJCX0KKwkJCQllbHNlCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJCX0KKwkJCWVsc2UgaWYoZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9PSBESUdfUERfQVRfTk9STUFMX1BPV0VSKQorCQkJeworCQkJCS8vIEhpZ2hlciBQRF9USCBmb3IgT0ZETS4KKwkJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCXsKKwkJCQkJLyogMjAwOC8wMS8xMSBNSCA0ME1IWiA5MC85MiByZWdpc3RlciBhcmUgbm90IHRoZSBzYW1lLiAqLworCQkJCQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSA5MlUvOTJFIFBEX1RIIGFyZSB0aGUgc2FtZS4KKwkJCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Mik7CisJCQkJCSNlbHNlCisJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgyMCk7CisJCQkJCSNlbmRpZgorCQkJCQkvKmVsc2UgaWYgKHByaXYtPmNhcmRfODE5MiA9PSBIQVJEV0FSRV9UWVBFX1JUTDgxOTBQKQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOworCQkJCQkqLworCQkJCX0KKwkJCQllbHNlCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQ0KTsKKwkJCX0KKwkJCWVsc2UgaWYoZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9PSBESUdfUERfQVRfSElHSF9QT1dFUikKKwkJCXsKKwkJCQkvLyBIaWdoZXIgUERfVEggZm9yIE9GRE0gZm9yIGhpZ2ggcG93ZXIgc3RhdGUuCisJCQkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQl7CisJCQkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDEpOworCQkJCQkjZWxzZQorCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MTApOworCQkJCQkjZW5kaWYKKwkJCQkJLyplbHNlIGlmIChwcml2LT5jYXJkXzgxOTIgPT0gSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCkKKwkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQxKTsKKwkJCQkJKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Myk7CisJCQl9CisJCQlkbV9kaWd0YWJsZS5wcmVwZF90aHN0YXRlID0gZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZTsKKwkJCWlmKGluaXRpYWxpemVkIDw9IDMpCisJCQkJaW5pdGlhbGl6ZWQrKzsKKwkJCWZvcmNlX3dyaXRlID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljCXZvaWQgZG1fY3NfcmF0aW8oCisJc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0YXRpYyB1OAkJCQlpbml0aWFsaXplZD0wLGZvcmNlX3dyaXRlPTA7CisJc3RhdGljIHUzMgkJCXJlc2V0X2NudCA9IDA7CisKKwlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkKKwl7CisJCWluaXRpYWxpemVkID0gMDsKKwkJcmVzZXRfY250ID0gMDsKKwl9CisKKwlpZihkbV9kaWd0YWJsZS5wcmVfY29ubmVjdF9zdGF0ZSA9PSBkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSkKKwl7CisJCWlmKGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlID09IERJR19DT05ORUNUKQorCQl7CisJCQlpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCisJCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fTE9XRVI7CisJCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgKQorCQkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0hJR0hFUjsKKwkJCWVsc2UKKwkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IGRtX2RpZ3RhYmxlLnByZWNzX3JhdGlvX3N0YXRlOworCQl9CisJCWVsc2UKKwkJeworCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fTE9XRVI7CisJCX0KKwl9CisJZWxzZQkvLyBkaXNjb25uZWN0ZWQgLT4gY29ubmVjdGVkIG9yIGNvbm5lY3RlZCAtPiBkaXNjb25uZWN0ZWQKKwl7CisJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0xPV0VSOworCX0KKworCS8vIGlmIHNpbGVudCByZXNldCBoYXBwZW5lZCwgd2Ugc2hvdWxkIHJld3JpdGUgdGhlIHZhbHVlcyBiYWNrCisJaWYocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQorCXsKKwkJZm9yY2Vfd3JpdGUgPSAxOworCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwl9CisKKworCXsKKwkJaWYoKGRtX2RpZ3RhYmxlLnByZWNzX3JhdGlvX3N0YXRlICE9IGRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlKSB8fAorCQkJIWluaXRpYWxpemVkIHx8IGZvcmNlX3dyaXRlKQorCQl7CisJCQkvL0RiZ1ByaW50KCJXcml0ZSBDU19yYXRpbyBzdGF0ZSA9ICVkXG4iLCBETV9EaWdUYWJsZS5DdXJDU19yYXRpb1N0YXRlKTsKKwkJCWlmKGRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID09IERJR19DU19SQVRJT19MT1dFUikKKwkJCXsKKwkJCQkvLyBMb3dlciBDUyByYXRpbyBmb3IgQ0NLLgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIDB4MDgpOworCQkJfQorCQkJZWxzZSBpZihkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9PSBESUdfQ1NfUkFUSU9fSElHSEVSKQorCQkJeworCQkJCS8vIEhpZ2hlciBDUyByYXRpbyBmb3IgQ0NLLgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIDB4Y2QpOworCQkJfQorCQkJZG1fZGlndGFibGUucHJlY3NfcmF0aW9fc3RhdGUgPSBkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZTsKKwkJCWluaXRpYWxpemVkID0gMTsKKwkJCWZvcmNlX3dyaXRlID0gMDsKKwkJfQorCX0KK30KKworZXh0ZXJuIHZvaWQgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSBmYWxzZTsKKwlwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzID0gZmFsc2U7CisJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IGZhbHNlOworfQkvLyBkbV9pbml0X2VkY2FfdHVyYm8KKworc3RhdGljIHZvaWQgZG1fY2hlY2tfZWRjYV90dXJibygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOworCS8vUFNUQV9RT1MJCQlwU3RhUW9zID0gcE1nbnRJbmZvLT5wU3RhUW9zOworCisJLy8gS2VlcCBwYXN0IFR4L1J4IHBhY2tldCBjb3VudCBmb3IgUlQtdG8tUlQgRURDQSB0dXJiby4KKwlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCWxhc3RUeE9rQ250ID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCWxhc3RSeE9rQ250ID0gMDsKKwl1bnNpZ25lZCBsb25nCQkJCWN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcJCQkJY3VyUnhPa0NudCA9IDA7CisKKwkvLworCS8vIERvIG5vdCBiZSBUdXJibyBpZiBpdCdzIHVuZGVyIFdpRmkgY29uZmlnIGFuZCBRb3MgRW5hYmxlZCwgYmVjYXVzZSB0aGUgRURDQSBwYXJhbWV0ZXJzCisJLy8gc2hvdWxkIGZvbGxvdyB0aGUgc2V0dGluZ3MgZnJvbSBRQVAuIEJ5IEJydWNlLCAyMDA3LTEyLTA3LgorCS8vCisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQorCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7CisJLy8gV2UgZG8gbm90IHR1cm4gb24gRURDQSB0dXJibyBtb2RlIGZvciBzb21lIEFQIHRoYXQgaGFzIElPVCBpc3N1ZQorCWlmKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8pCisJCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKKworLy8JcHJpbnRrKCI9PT09PT09PT4lcygpOmJpc19hbnlfbm9uYmVwa3RzIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxwcml2LT5iaXNfYW55X25vbmJlcGt0cyk7CisJLy8gQ2hlY2sgdGhlIHN0YXR1cyBmb3IgY3VycmVudCBjb25kaXRpb24uCisJaWYoIXByaXYtPmllZWU4MDIxMS0+YmlzX2FueV9ub25iZXBrdHMpCisJeworCQljdXJUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgLSBsYXN0VHhPa0NudDsKKwkJY3VyUnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0IC0gbGFzdFJ4T2tDbnQ7CisJCS8vIEZvciBSVC1BUCwgd2UgbmVlZHMgdG8gdHVybiBpdCBvbiB3aGVuIFJ4PlR4CisJCWlmKGN1clJ4T2tDbnQgPiA0KmN1clR4T2tDbnQpCisJCXsKKwkJCS8vcHJpbnRrKCIlcygpOmN1clJ4T2tDbnQgPiA0KmN1clR4T2tDbnRcbiIpOworCQkJaWYoIXByaXYtPmJpc19jdXJfcmRsc3RhdGUgfHwgIXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EpCisJCQl7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfQkUsIGVkY2Ffc2V0dGluZ19ETFtwSFRJbmZvLT5JT1RQZWVyXSk7CisJCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IHRydWU7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCS8vcHJpbnRrKCIlcygpOmN1clJ4T2tDbnQgPCA0KmN1clR4T2tDbnRcbiIpOworCQkJaWYocHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fCAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKKwkJCXsKKwkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwgZWRjYV9zZXR0aW5nX1VMW3BIVEluZm8tPklPVFBlZXJdKTsKKwkJCQlwcml2LT5iaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7CisJCQl9CisKKwkJfQorCisJCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSB0cnVlOworCX0KKwllbHNlCisJeworCQkvLworCQkvLyBUdXJuIE9mZiBFRENBIHR1cmJvIGhlcmUuCisJCS8vIFJlc3RvcmUgb3JpZ2luYWwgRURDQSBhY2NvcmRpbmcgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIEFQLgorCQkvLworCQkgaWYocHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKKwkJeworCisJCQl7CisJCQkJdTgJCXUxYkFJRlM7CisJCQkJdTMyCQl1NGJBY1BhcmFtOworCQkJCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgKnFvc19wYXJhbWV0ZXJzID0gJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnM7CisJCQkJdTggbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+bW9kZTsKKworCQkJLy8gRm9yIEVhY2ggdGltZSB1cGRhdGluZyBFRENBIHBhcmFtZXRlciwgcmVzZXQgRURDQSB0dXJibyBtb2RlIHN0YXR1cy4KKwkJCQlkbV9pbml0X2VkY2FfdHVyYm8oZGV2KTsKKwkJCQl1MWJBSUZTID0gcW9zX3BhcmFtZXRlcnMtPmFpZnNbMF0gKiAoKG1vZGUmKElFRUVfR3xJRUVFX05fMjRHKSkgPzk6MjApICsgYVNpZnNUaW1lOworCQkJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShxb3NfcGFyYW1ldGVycy0+dHhfb3BfbGltaXRbMF0pKTw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKKwkJCQkJKCgodTMyKShxb3NfcGFyYW1ldGVycy0+Y3dfbWF4WzBdKSk8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCl8CisJCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21pblswXSkpPDwgQUNfUEFSQU1fRUNXX01JTl9PRkZTRVQpfAorCQkJCQkoKHUzMil1MWJBSUZTIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7CisJCQkvL3dyaXRlX25pY19kd29yZChkZXYsIFdEQ0FQQVJBX0FERFtpXSwgdTRiQWNQYXJhbSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfQkUsICB1NGJBY1BhcmFtKTsKKworCQkJLy8gQ2hlY2sgQUNNIGJpdC4KKwkJCS8vIElmIGl0IGlzIHNldCwgaW1tZWRpYXRlbHkgc2V0IEFDTSBjb250cm9sIGJpdCB0byBkb3duZ3JhZGluZyBBQyBmb3IgcGFzc2luZyBXTU0gdGVzdHBsYW4uIEFubmllLCAyMDA1LTEyLTEzLgorCQkJCXsKKwkJCS8vIFRPRE86ICBNb2RpZmllZCB0aGlzIHBhcnQgYW5kIHRyeSB0byBzZXQgYWNtIGNvbnRyb2wgaW4gb25seSAxIElPIHByb2Nlc3NpbmchIQorCisJCQkJCVBBQ0lfQUlGU04JcEFjaUFpZnNuID0gKFBBQ0lfQUlGU04pJihxb3NfcGFyYW1ldGVycy0+YWlmc1swXSk7CisJCQkJCXU4CQlBY21DdHJsID0gcmVhZF9uaWNfYnl0ZSggZGV2LCBBY21Id0N0cmwgKTsKKwkJCQkJaWYoIHBBY2lBaWZzbi0+Zi5BQ00gKQorCQkJCQl7IC8vIEFDTSBiaXQgaXMgMS4KKwkJCQkJCUFjbUN0cmwgfD0gQWNtSHdfQmVxRW47CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7IC8vIEFDTSBiaXQgaXMgMC4KKwkJCQkJCUFjbUN0cmwgJj0gKH5BY21Id19CZXFFbik7CisJCQkJCX0KKworCQkJCQlSVF9UUkFDRSggQ09NUF9RT1MsIlNldEh3UmVnODE5MHBjaSgpOiBbSFdfVkFSX0FDTV9DVFJMXSBXcml0ZSAweCVYXG4iLCBBY21DdHJsICkgOworCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEFjbUh3Q3RybCwgQWNtQ3RybCApOworCQkJCX0KKwkJCX0KKwkJCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSBmYWxzZTsKKwkJfQorCX0KKworCitkbV9DaGVja0VkY2FUdXJib19FWElUOgorCS8vIFNldCB2YXJpYWJsZXMgZm9yIG5leHQgdGltZS4KKwlwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzID0gZmFsc2U7CisJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKKwlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OworfQkvLyBkbV9DaGVja0VkY2FUdXJibworCitleHRlcm4gdm9pZCBETV9DVFNUb1NlbGZTZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LHUzMiBETV9UeXBlLCB1MzIgRE1fVmFsdWUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCisJaWYgKERNX1R5cGUgPT0gMCkJLy8gQ1RTIHRvIHNlbGYgZGlzYWJsZS9lbmFibGUKKwl7CisJCWlmKERNX1ZhbHVlID4gMSkKKwkJCURNX1ZhbHVlID0gMTsKKwkJcHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlID0gKGJvb2wpRE1fVmFsdWU7CisJCS8vRGJnUHJpbnQoInBNZ250SW5mby0+YkNUU1RvU2VsZkVuYWJsZSA9ICVkXG4iLCBwTWdudEluZm8tPmJDVFNUb1NlbGZFbmFibGUpOworCX0KKwllbHNlIGlmKERNX1R5cGUgPT0gMSkgLy9DVFMgdG8gc2VsZiBUaAorCXsKKwkJaWYoRE1fVmFsdWUgPj0gNTApCisJCQlETV9WYWx1ZSA9IDUwOworCQlwcml2LT5pZWVlODAyMTEtPkNUU1RvU2VsZlRIID0gKHU4KURNX1ZhbHVlOworCQkvL0RiZ1ByaW50KCJwTWdudEluZm8tPkNUU1RvU2VsZlRIID0gJWRcbiIsIHBNZ250SW5mby0+Q1RTVG9TZWxmVEgpOworCX0KK30KKworc3RhdGljIHZvaWQgZG1faW5pdF9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCisJcHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlID0gVFJVRTsKKwlwcml2LT5pZWVlODAyMTEtPkNUU1RvU2VsZlRIID0gQ1RTVG9TZWxmVEhWYWw7Cit9CisKK3N0YXRpYyB2b2lkIGRtX2N0c3Rvc2VsZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKwlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBwcml2LT5pZWVlODAyMTEtPnBIVEluZm87CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQkJbGFzdFR4T2tDbnQgPSAwOworCXN0YXRpYyB1bnNpZ25lZCBsb25nCQkJCWxhc3RSeE9rQ250ID0gMDsKKwl1bnNpZ25lZCBsb25nCQkJCQkJY3VyVHhPa0NudCA9IDA7CisJdW5zaWduZWQgbG9uZwkJCQkJCWN1clJ4T2tDbnQgPSAwOworCisJaWYocHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlICE9IFRSVUUpCisJeworCQlwSFRJbmZvLT5JT1RBY3Rpb24gJj0gfkhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOworCQlyZXR1cm47CisJfQorCS8qCisJMS4gVXBsaW5rCisJMi4gTGlua3N5czM1MC9MaW5rc3lzMzAwTgorCTMuIDw1MCBkaXNhYmxlLCA+NTUgZW5hYmxlCisJKi8KKworCWlmKHBIVEluZm8tPklPVFBlZXIgPT0gSFRfSU9UX1BFRVJfQlJPQURDT00pCisJeworCQljdXJUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgLSBsYXN0VHhPa0NudDsKKwkJY3VyUnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0IC0gbGFzdFJ4T2tDbnQ7CisJCWlmKGN1clJ4T2tDbnQgPiA0KmN1clR4T2tDbnQpCS8vZG93bmxpbmssIGRpc2FibGUgQ1RTIHRvIHNlbGYKKwkJeworCQkJcEhUSW5mby0+SU9UQWN0aW9uICY9IH5IVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRjsKKwkJCS8vRGJnUHJpbnQoImRtX0NUU1RvU2VsZigpID09PiBDVFMgdG8gc2VsZiBkaXNhYmxlZCAtLSBkb3dubGlua1xuIik7CisJCX0KKwkJZWxzZQkvL3VwbGluaworCQl7CisJCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEY7CisJCX0KKworCQlsYXN0VHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0OworCQlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fY2hlY2tfcmZjdHJsX2dwaW8oKQorICoKKyAqIE92ZXJ2aWV3OglDb3B5IDgxODdCIHRlbXBsYXRlIGZvciA5eHNlcmllcy4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8yOC8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3JmY3RybF9ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCS8vc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy8gV2FsayBhcm91bmQgZm9yIERUTSB0ZXN0LCB3ZSB3aWxsIG5vdCBlbmFibGUgSFcgLSByYWRpbyBvbi9vZmYgYmVjYXVzZSByL3cKKwkvLyBwYWdlIDEgcmVnaXN0ZXIgYmVmb3JlIExleHRyYSBidXMgaXMgZW5hYmxlZCBjYXVzZSBzeXN0ZW0gZmFpbHMgd2hlbiByZXN1bWluZworCS8vIGZyb20gUzQuIDIwMDgwMjE4LCBFbWlseQorCisJLy8gU3RvcCB0byBleGVjdXRlIHdvcmtpdGVtIHRvIHByZXZlbnQgUzMvUzQgYnVnLgorI2lmZGVmIFJUTDgxOTBQCisJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgUlRMODE5MlUKKwlyZXR1cm47CisjZW5kaWYKKyNpZmRlZiBSVEw4MTkyRQorCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EsMCk7CisjZW5kaWYKKworfQkvKiBkbV9DaGVja1JmQ3RybEdQSU8gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoZWNrX3BiY19ncGlvKCkKKyAqCisgKiBPdmVydmlldzoJQ2hlY2sgaWYgUEJDIGJ1dHRvbiBpcyBwcmVzc2VkLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI4LzIwMDgJYW15IAlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQJZG1fY2hlY2tfcGJjX2dwaW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBSVEw4MTkyVQorCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCB0bXAxYnl0ZTsKKworCisJdG1wMWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixHUEkpOworCWlmKHRtcDFieXRlID09IDB4ZmYpCisJCXJldHVybjsKKworCWlmICh0bXAxYnl0ZSZCSVQ2IHx8IHRtcDFieXRlJkJJVDApCisJeworCQkvLyBIZXJlIHdlIG9ubHkgc2V0IGJQYmNQcmVzc2VkIHRvIFRSVUUKKwkJLy8gQWZ0ZXIgdHJpZ2dlciBQQkMsIHRoZSB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byBGQUxTRQorCQlSVF9UUkFDRShDT01QX0lPLCAiQ2hlY2tQYmNHUElPIC0gUEJDIGlzIHByZXNzZWRcbiIpOworCQlwcml2LT5icGJjX3ByZXNzZWQgPSB0cnVlOworCX0KKyNlbmRpZgorCit9CisKKyNpZmRlZiBSVEw4MTkyRQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJZG1fR1BJT0NoYW5nZVJGCisgKiBPdmVydmlldzoJUENJIHdpbGwgbm90IHN1cHBvcnQgd29ya2l0ZW0gY2FsbCBiYWNrIEhXIHJhZGlvIG9uLW9mZiBjb250cm9sLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTAyLzIxLzIwMDgJTUhDCQlDcmVhdGUgVmVyc2lvbiAwLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybgl2b2lkCWRtX2dwaW9fY2hhbmdlX3JmX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsZ3Bpb19jaGFuZ2VfcmZfd3EpOworICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKKwl1OCB0bXAxYnl0ZTsKKwlSVF9SRl9QT1dFUl9TVEFURQllUmZQb3dlclN0YXRlVG9TZXQ7CisJYm9vbCBiQWN0dWFsbHlTZXQgPSBmYWxzZTsKKworCWRveworCQliQWN0dWFsbHlTZXQ9ZmFsc2U7CisKKwkJaWYoIXByaXYtPnVwKQorCQl7CisJCQlSVF9UUkFDRSgoQ09NUF9JTklUIHwgQ09NUF9QT1dFUiB8IENPTVBfUkYpLCJkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjaygpOiBDYWxsYmFjayBmdW5jdGlvbiBicmVha3Mgb3V0ISFcbiIpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gMHgxMDggR1BJTyBpbnB1dCByZWdpc3RlciBpcyByZWFkIG9ubHkKKwkJCS8vc2V0IDB4MTA4IEIxPSAxOiBSRi1PTjsgMDogUkYtT0ZGLgorCQkJdG1wMWJ5dGUgPSByZWFkX25pY19ieXRlKGRldixHUEkpOworCisJCQllUmZQb3dlclN0YXRlVG9TZXQgPSAodG1wMWJ5dGUmQklUMSkgPyAgZVJmT24gOiBlUmZPZmY7CisKKwkJCWlmKCAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPbikpCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgImdwaW9jaGFuZ2VSRiAgLSBIVyBSYWRpbyBPTlxuIik7CisKKwkJCQlwcml2LT5iSHdSYWRpb09mZiA9IGZhbHNlOworCQkJCWJBY3R1YWxseVNldCA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmICggKHByaXYtPmJId1JhZGlvT2ZmID09IGZhbHNlKSAmJiAoZVJmUG93ZXJTdGF0ZVRvU2V0ID09IGVSZk9mZikpCisJCQl7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgImdwaW9jaGFuZ2VSRiAgLSBIVyBSYWRpbyBPRkZcbiIpOworCQkJCXByaXYtPmJId1JhZGlvT2ZmID0gdHJ1ZTsKKwkJCQliQWN0dWFsbHlTZXQgPSB0cnVlOworCQkJfQorCisJCQlpZihiQWN0dWFsbHlTZXQpCisJCQl7CisJCQkJI2lmZGVmIFRPX0RPCisJCQkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZlBvd2VyU3RhdGVUb1NldCwgUkZfQ0hBTkdFX0JZX0hXKTsKKwkJCQkvL0RydklGSW5kaWNhdGVDdXJyZW50UGh5U3RhdHVzKHBBZGFwdGVyKTsKKwkJCQkjZW5kaWYKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltc2xlZXAoMjAwMCk7CisJCQl9CisKKwkJfQorCX13aGlsZShUUlVFKQorCit9CS8qIGRtX0dQSU9DaGFuZ2VSRiAqLworCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglETV9SRlBhdGhDaGVja1dvcmtJdGVtQ2FsbEJhY2soKQorICoKKyAqIE92ZXJ2aWV3OglDaGVjayBpZiBDdXJyZW50IFJGIFJYIHBhdGggaXMgZW5hYmxlZAorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTAxLzMwLzIwMDgJTUhDCQlDcmVhdGUgVmVyc2lvbiAwLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybgl2b2lkCWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYscmZwYXRoX2NoZWNrX3dxKTsKKyAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID1wcml2LT5pZWVlODAyMTEtPmRldjsKKwkvL2Jvb2wgYmFjdHVhbGx5X3NldCA9IGZhbHNlOworCXU4IHJmcGF0aCA9IDAsIGk7CisKKworCS8qIDIwMDgvMDEvMzAgTUggQWZ0ZXIgZGlzY3Vzc2luZyB3aXRoIFNEMyBKZXJyeSwgMHhjMDQvMHhkMDQgcmVnaXN0ZXIgd2lsbAorCSAgIGFsd2F5cyBiZSB0aGUgc2FtZS4gV2Ugb25seSByZWFkIDB4YzA0IG5vdy4gKi8KKwlyZnBhdGggPSByZWFkX25pY19ieXRlKGRldiwgMHhjMDQpOworCisJLy8gQ2hlY2sgQml0IDAtMywgaXQgbWVhbnMgaWYgUkYgQS1EIGlzIGVuYWJsZWQuCisJZm9yIChpID0gMDsgaSA8IFJGOTBfUEFUSF9NQVg7IGkrKykKKwl7CisJCWlmIChyZnBhdGggJiAoMHgwMTw8aSkpCisJCQlwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldID0gMTsKKwkJZWxzZQorCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDA7CisJfQorCWlmKCFETV9SeFBhdGhTZWxUYWJsZS5FbmFibGUpCisJCXJldHVybjsKKworCWRtX3J4cGF0aF9zZWxfYnlyc3NpKGRldik7Cit9CS8qIERNX1JGUGF0aENoZWNrV29ya0l0ZW1DYWxsQmFjayAqLworCitzdGF0aWMgdm9pZCBkbV9pbml0X3J4cGF0aF9zZWxlY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJdTggaTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJRE1fUnhQYXRoU2VsVGFibGUuRW5hYmxlID0gMTsJLy9kZWZhdWx0IGVuYWJsZWQKKwlETV9SeFBhdGhTZWxUYWJsZS5TU19USF9sb3cgPSBSeFBhdGhTZWxlY3Rpb25fU1NfVEhfbG93OworCURNX1J4UGF0aFNlbFRhYmxlLmRpZmZfVEggPSBSeFBhdGhTZWxlY3Rpb25fZGlmZl9USDsKKwlpZihwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCisJCURNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPSBDQ0tfUnhfVmVyc2lvbl8yOworCWVsc2UKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9IENDS19SeF9WZXJzaW9uXzE7CisJRE1fUnhQYXRoU2VsVGFibGUuRGJnTW9kZSA9IERNX0RCR19PRkY7CisJRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRiA9IDA7CisJZm9yKGk9MDsgaTw0OyBpKyspCisJeworCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9yc3NpW2ldID0gNTA7CisJCURNX1J4UGF0aFNlbFRhYmxlLmNja19wd2RiX3N0YVtpXSA9IC02NDsKKwkJRE1fUnhQYXRoU2VsVGFibGUucmZfZW5hYmxlX3Jzc2lfdGhbaV0gPSAxMDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBkbV9yeHBhdGhfc2VsX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTgJCQkJaSwgbWF4X3Jzc2lfaW5kZXg9MCwgbWluX3Jzc2lfaW5kZXg9MCwgc2VjX3Jzc2lfaW5kZXg9MCwgcmZfbnVtPTA7CisJdTgJCQkJdG1wX21heF9yc3NpPTAsIHRtcF9taW5fcnNzaT0wLCB0bXBfc2VjX3Jzc2k9MDsKKwl1OAkJCQljY2tfZGVmYXVsdF9SeD0weDI7CS8vUkYtQworCXU4CQkJCWNja19vcHRpb25hbF9SeD0weDM7Ly9SRi1ECisJbG9uZwkJCQl0bXBfY2NrX21heF9wd2RiPTAsIHRtcF9jY2tfbWluX3B3ZGI9MCwgdG1wX2Nja19zZWNfcHdkYj0wOworCXU4CQkJCWNja19yeF92ZXIyX21heF9pbmRleD0wLCBjY2tfcnhfdmVyMl9taW5faW5kZXg9MCwgY2NrX3J4X3ZlcjJfc2VjX2luZGV4PTA7CisJdTgJCQkJY3VyX3JmX3Jzc2k7CisJbG9uZwkJCQljdXJfY2NrX3B3ZGI7CisJc3RhdGljIHU4CQkJZGlzYWJsZWRfcmZfY250PTAsIGNja19SeF9QYXRoX2luaXRpYWxpemVkPTA7CisJdTgJCQkJdXBkYXRlX2Nja19yeF9wYXRoOworCisJaWYocHJpdi0+cmZfdHlwZSAhPSBSRl8yVDRSKQorCQlyZXR1cm47CisKKwlpZighY2NrX1J4X1BhdGhfaW5pdGlhbGl6ZWQpCisJeworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCA9IChyZWFkX25pY19ieXRlKGRldiwgMHhhMDcpJjB4Zik7CisJCWNja19SeF9QYXRoX2luaXRpYWxpemVkID0gMTsKKwl9CisKKwlETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGID0gMHhmOworCURNX1J4UGF0aFNlbFRhYmxlLmRpc2FibGVkUkYgJj1+IChyZWFkX25pY19ieXRlKGRldiwgMHhjMDQpKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpCisJeworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMjsJLy9wdXJlIEIgbW9kZSwgZml4ZWQgY2NrIHZlcnNpb24yCisJCS8vRGJnUHJpbnQoIlB1cmUgQiBtb2RlLCB1c2UgY2NrIHJ4IHZlcnNpb24yIFxuIik7CisJfQorCisJLy9kZWNpZGUgbWF4L3NlYy9taW4gcnNzaSBpbmRleAorCWZvciAoaT0wOyBpPFJGOTBfUEFUSF9NQVg7IGkrKykKKwl7CisJCWlmKCFETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlKQorCQkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXSA9IHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtpXTsKKworCQlpZihwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldKQorCQl7CisJCQlyZl9udW0rKzsKKwkJCWN1cl9yZl9yc3NpID0gRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXTsKKworCQkJaWYocmZfbnVtID09IDEpCS8vIGZpbmQgZmlyc3QgZW5hYmxlZCByZiBwYXRoIGFuZCB0aGUgcnNzaSB2YWx1ZXMKKwkJCXsJLy9pbml0aWFsaXplLCBzZXQgYWxsIHJzc2kgaW5kZXggdG8gdGhlIHNhbWUgb25lCisJCQkJbWF4X3Jzc2lfaW5kZXggPSBtaW5fcnNzaV9pbmRleCA9IHNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQl0bXBfbWF4X3Jzc2kgPSB0bXBfbWluX3Jzc2kgPSB0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCX0KKwkJCWVsc2UgaWYocmZfbnVtID09IDIpCisJCQl7CS8vIHdlIHBpY2sgdXAgdGhlIG1heCBpbmRleCBmaXJzdCwgYW5kIGxldCBzZWMgYW5kIG1pbiB0byBiZSB0aGUgc2FtZSBvbmUKKwkJCQlpZihjdXJfcmZfcnNzaSA+PSB0bXBfbWF4X3Jzc2kpCisJCQkJeworCQkJCQl0bXBfbWF4X3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJbWF4X3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0bXBfc2VjX3Jzc2kgPSB0bXBfbWluX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBtaW5fcnNzaV9pbmRleCA9IGk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKGN1cl9yZl9yc3NpID4gdG1wX21heF9yc3NpKQorCQkJCXsKKwkJCQkJdG1wX3NlY19yc3NpID0gdG1wX21heF9yc3NpOworCQkJCQlzZWNfcnNzaV9pbmRleCA9IG1heF9yc3NpX2luZGV4OworCQkJCQl0bXBfbWF4X3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJbWF4X3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCQllbHNlIGlmKGN1cl9yZl9yc3NpID09IHRtcF9tYXhfcnNzaSkKKwkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4CisJCQkJCXRtcF9zZWNfcnNzaSA9IGN1cl9yZl9yc3NpOworCQkJCQlzZWNfcnNzaV9pbmRleCA9IGk7CisJCQkJfQorCQkJCWVsc2UgaWYoKGN1cl9yZl9yc3NpIDwgdG1wX21heF9yc3NpKSAmJihjdXJfcmZfcnNzaSA+IHRtcF9zZWNfcnNzaSkpCisJCQkJeworCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCQllbHNlIGlmKGN1cl9yZl9yc3NpID09IHRtcF9zZWNfcnNzaSkKKwkJCQl7CisJCQkJCWlmKHRtcF9zZWNfcnNzaSA9PSB0bXBfbWluX3Jzc2kpCisJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKKwkJCQkJCXRtcF9zZWNfcnNzaSA9IGN1cl9yZl9yc3NpOworCQkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoKGN1cl9yZl9yc3NpIDwgdG1wX3NlY19yc3NpKSAmJiAoY3VyX3JmX3Jzc2kgPiB0bXBfbWluX3Jzc2kpKQorCQkJCXsKKwkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAorCQkJCX0KKwkJCQllbHNlIGlmKGN1cl9yZl9yc3NpID09IHRtcF9taW5fcnNzaSkKKwkJCQl7CisJCQkJCWlmKHRtcF9zZWNfcnNzaSA9PSB0bXBfbWluX3Jzc2kpCisJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKKwkJCQkJCXRtcF9taW5fcnNzaSA9IGN1cl9yZl9yc3NpOworCQkJCQkJbWluX3Jzc2lfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYoY3VyX3JmX3Jzc2kgPCB0bXBfbWluX3Jzc2kpCisJCQkJeworCQkJCQl0bXBfbWluX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJbWluX3Jzc2lfaW5kZXggPSBpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJmX251bSA9IDA7CisJLy8gZGVjaWRlIG1heC9zZWMvbWluIGNjayBwd2RiIGluZGV4CisJaWYoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8yKQorCXsKKwkJZm9yIChpPTA7IGk8UkY5MF9QQVRIX01BWDsgaSsrKQorCQl7CisJCQlpZihwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldKQorCQkJeworCQkJCXJmX251bSsrOworCQkJCWN1cl9jY2tfcHdkYiA9ICBETV9SeFBhdGhTZWxUYWJsZS5jY2tfcHdkYl9zdGFbaV07CisKKwkJCQlpZihyZl9udW0gPT0gMSkJLy8gZmluZCBmaXJzdCBlbmFibGVkIHJmIHBhdGggYW5kIHRoZSByc3NpIHZhbHVlcworCQkJCXsJLy9pbml0aWFsaXplLCBzZXQgYWxsIHJzc2kgaW5kZXggdG8gdGhlIHNhbWUgb25lCisJCQkJCWNja19yeF92ZXIyX21heF9pbmRleCA9IGNja19yeF92ZXIyX21pbl9pbmRleCA9IGNja19yeF92ZXIyX3NlY19pbmRleCA9IGk7CisJCQkJCXRtcF9jY2tfbWF4X3B3ZGIgPSB0bXBfY2NrX21pbl9wd2RiID0gdG1wX2Nja19zZWNfcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQl9CisJCQkJZWxzZSBpZihyZl9udW0gPT0gMikKKwkJCQl7CS8vIHdlIHBpY2sgdXAgdGhlIG1heCBpbmRleCBmaXJzdCwgYW5kIGxldCBzZWMgYW5kIG1pbiB0byBiZSB0aGUgc2FtZSBvbmUKKwkJCQkJaWYoY3VyX2Nja19wd2RiID49IHRtcF9jY2tfbWF4X3B3ZGIpCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfbWF4X3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9IHRtcF9jY2tfbWluX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBjY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKGN1cl9jY2tfcHdkYiA+IHRtcF9jY2tfbWF4X3B3ZGIpCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSB0bXBfY2NrX21heF9wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gY2NrX3J4X3ZlcjJfbWF4X2luZGV4OworCQkJCQkJdG1wX2Nja19tYXhfcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCWNja19yeF92ZXIyX21heF9pbmRleCA9IGk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZihjdXJfY2NrX3B3ZGIgPT0gdG1wX2Nja19tYXhfcHdkYikKKwkJCQkJewkvLyBsZXQgc2VjIGFuZCBtaW4gcG9pbnQgdG8gdGhlIGRpZmZlcmVudCBpbmRleAorCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCWNja19yeF92ZXIyX3NlY19pbmRleCA9IGk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZigoY3VyX2Nja19wd2RiIDwgdG1wX2Nja19tYXhfcHdkYikgJiYoY3VyX2Nja19wd2RiID4gdG1wX2Nja19zZWNfcHdkYikpCisJCQkJCXsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl9CisJCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiID09IHRtcF9jY2tfc2VjX3B3ZGIpCisJCQkJCXsKKwkJCQkJCWlmKHRtcF9jY2tfc2VjX3B3ZGIgPT0gdG1wX2Nja19taW5fcHdkYikKKwkJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKKwkJCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJCWNja19yeF92ZXIyX3NlY19pbmRleCA9IGk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYoKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfc2VjX3B3ZGIpICYmIChjdXJfY2NrX3B3ZGIgPiB0bXBfY2NrX21pbl9wd2RiKSkKKwkJCQkJeworCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAorCQkJCQl9CisJCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiID09IHRtcF9jY2tfbWluX3B3ZGIpCisJCQkJCXsKKwkJCQkJCWlmKHRtcF9jY2tfc2VjX3B3ZGIgPT0gdG1wX2Nja19taW5fcHdkYikKKwkJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKKwkJCQkJCQl0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJCWNja19yeF92ZXIyX21pbl9pbmRleCA9IGk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAorCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiIDwgdG1wX2Nja19taW5fcHdkYikKKwkJCQkJeworCQkJCQkJdG1wX2Nja19taW5fcHdkYiA9IGN1cl9jY2tfcHdkYjsKKwkJCQkJCWNja19yeF92ZXIyX21pbl9pbmRleCA9IGk7CisJCQkJCX0KKwkJCQl9CisKKwkJCX0KKwkJfQorCX0KKworCisJLy8gU2V0IENDSyBSeCBwYXRoCisJLy8gcmVnMHhBMDdbMzoyXT1jY2sgZGVmYXVsdCByeCBwYXRoLCByZWcweGEwN1sxOjBdPWNjayBvcHRpb25hbCByeCBwYXRoLgorCXVwZGF0ZV9jY2tfcnhfcGF0aCA9IDA7CisJaWYoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8yKQorCXsKKwkJY2NrX2RlZmF1bHRfUnggPSBjY2tfcnhfdmVyMl9tYXhfaW5kZXg7CisJCWNja19vcHRpb25hbF9SeCA9IGNja19yeF92ZXIyX3NlY19pbmRleDsKKwkJaWYodG1wX2Nja19tYXhfcHdkYiAhPSAtNjQpCisJCQl1cGRhdGVfY2NrX3J4X3BhdGggPSAxOworCX0KKworCWlmKHRtcF9taW5fcnNzaSA8IERNX1J4UGF0aFNlbFRhYmxlLlNTX1RIX2xvdyAmJiBkaXNhYmxlZF9yZl9jbnQgPCAyKQorCXsKKwkJaWYoKHRtcF9tYXhfcnNzaSAtIHRtcF9taW5fcnNzaSkgPj0gRE1fUnhQYXRoU2VsVGFibGUuZGlmZl9USCkKKwkJeworCQkJLy9yZWNvcmQgdGhlIGVuYWJsZWQgcnNzaSB0aHJlc2hvbGQKKwkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW21pbl9yc3NpX2luZGV4XSA9IHRtcF9tYXhfcnNzaSs1OworCQkJLy9kaXNhYmxlIHRoZSBCQiBSeCBwYXRoLCBPRkRNCisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4MTw8bWluX3Jzc2lfaW5kZXgsIDB4MCk7CS8vIDB4YzA0WzM6MF0KKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHgxPDxtaW5fcnNzaV9pbmRleCwgMHgwKTsJLy8gMHhkMDRbMzowXQorCQkJZGlzYWJsZWRfcmZfY250Kys7CisJCX0KKwkJaWYoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8xKQorCQl7CisJCQljY2tfZGVmYXVsdF9SeCA9IG1heF9yc3NpX2luZGV4OworCQkJY2NrX29wdGlvbmFsX1J4ID0gc2VjX3Jzc2lfaW5kZXg7CisJCQlpZih0bXBfbWF4X3Jzc2kpCisJCQkJdXBkYXRlX2Nja19yeF9wYXRoID0gMTsKKwkJfQorCX0KKworCWlmKHVwZGF0ZV9jY2tfcnhfcGF0aCkKKwl7CisJCURNX1J4UGF0aFNlbFRhYmxlLmNja19SeF9wYXRoID0gKGNja19kZWZhdWx0X1J4PDwyKXwoY2NrX29wdGlvbmFsX1J4KTsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0FGRVNldHRpbmcsIDB4MGYwMDAwMDAsIERNX1J4UGF0aFNlbFRhYmxlLmNja19SeF9wYXRoKTsKKwl9CisKKwlpZihETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGKQorCXsKKwkJZm9yKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJCWlmKChETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGPj5pKSAmIDB4MSkJLy9kaXNhYmxlZCByZgorCQkJeworCQkJCWlmKHRtcF9tYXhfcnNzaSA+PSBETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFtpXSkKKwkJCQl7CisJCQkJCS8vZW5hYmxlIHRoZSBCQiBSeCBwYXRoCisJCQkJCS8vRGJnUHJpbnQoIlJGLSVkIGlzIGVuYWJsZWQuIFxuIiwgMHgxPDxpKTsKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDE8PGksIDB4MSk7CS8vIDB4YzA0WzM6MF0KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweDE8PGksIDB4MSk7CS8vIDB4ZDA0WzM6MF0KKwkJCQkJRE1fUnhQYXRoU2VsVGFibGUucmZfZW5hYmxlX3Jzc2lfdGhbaV0gPSAxMDA7CisJCQkJCWRpc2FibGVkX3JmX2NudC0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKCkKKyAqCisgKiBPdmVydmlldzoJQ2FsbCBhIHdvcmtpdGVtIHRvIGNoZWNrIGN1cnJlbnQgUlhSRiBwYXRoIGFuZCBSeCBQYXRoIHNlbGVjdGlvbiBieSBSU1NJLgorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzI4LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQJZG1fY2hlY2tfcnhfcGF0aF9zZWxlY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPnJmcGF0aF9jaGVja193cSwwKTsKK30JLyogZG1fQ2hlY2tSeFJGUGF0aCAqLworCisKK3N0YXRpYyB2b2lkIGRtX2luaXRfZnN5bmMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+aWVlZTgwMjExLT5mc3luY190aW1lX2ludGVydmFsID0gNTAwOworCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAgPSAweDBmMDAwODAwOworCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcnNzaV90aHJlc2hvbGQgPSAzMDsKKyNpZmRlZiBSVEw4MTkwUAorCXByaXYtPmllZWU4MDIxMS0+YmZzeW5jX2VuYWJsZSA9IHRydWU7CisjZWxzZQorCXByaXYtPmllZWU4MDIxMS0+YmZzeW5jX2VuYWJsZSA9IGZhbHNlOworI2VuZGlmCisJcHJpdi0+aWVlZTgwMjExLT5mc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWwgPSAzOworCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ9IDEwMDsKKwlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZD0gMjAwOworCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBEZWZhdWx0X0ZzeW5jOworCXByaXYtPmZyYW1lc3luY01vbml0b3IgPSAxOwkvLyBjdXJyZW50IGRlZmF1bHQgMHhjMzggbW9uaXRvciBvbgorCisJaW5pdF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOworCXByaXYtPmZzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJcHJpdi0+ZnN5bmNfdGltZXIuZnVuY3Rpb24gPSBkbV9mc3luY190aW1lcl9jYWxsYmFjazsKK30KKworCitzdGF0aWMgdm9pZCBkbV9kZUluaXRfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKK30KKworZXh0ZXJuIHZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisJdTMyIHJhdGVfaW5kZXgsIHJhdGVfY291bnQgPSAwLCByYXRlX2NvdW50X2RpZmY9MDsKKwlib29sCQliU3dpdGNoRnJvbUNvdW50RGlmZiA9IGZhbHNlOworCWJvb2wJCWJEb3VibGVUaW1lSW50ZXJ2YWwgPSBmYWxzZTsKKworCWlmKAlwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKKwkJcHJpdi0+aWVlZTgwMjExLT5iZnN5bmNfZW5hYmxlICYmCisJCShwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfQ0REX0ZTWU5DKSkKKwl7CisJCSAvLyBDb3VudCByYXRlIDU0LCBNQ1MgWzddLCBbMTIsIDEzLCAxNCwgMTVdCisJCXUzMiByYXRlX2JpdG1hcDsKKwkJZm9yKHJhdGVfaW5kZXggPSAwOyByYXRlX2luZGV4IDw9IDI3OyByYXRlX2luZGV4KyspCisJCXsKKwkJCXJhdGVfYml0bWFwICA9IDEgPDwgcmF0ZV9pbmRleDsKKwkJCWlmKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAgJiAgcmF0ZV9iaXRtYXApCisJCQkJcmF0ZV9jb3VudCs9IHByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtWzFdW3JhdGVfaW5kZXhdOworCQl9CisKKwkJaWYocmF0ZV9jb3VudCA8IHByaXYtPnJhdGVfcmVjb3JkKQorCQkJcmF0ZV9jb3VudF9kaWZmID0gMHhmZmZmZmZmZiAtIHJhdGVfY291bnQgKyBwcml2LT5yYXRlX3JlY29yZDsKKwkJZWxzZQorCQkJcmF0ZV9jb3VudF9kaWZmID0gcmF0ZV9jb3VudCAtIHByaXYtPnJhdGVfcmVjb3JkOworCQlpZihyYXRlX2NvdW50X2RpZmYgPCBwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkKQorCQl7CisKKwkJCXUzMiBEaWZmTnVtID0gcHJpdi0+cmF0ZUNvdW50RGlmZlJlY29yZCAtIHJhdGVfY291bnRfZGlmZjsKKwkJCS8vIENvbnRpdW5lIGNvdW50CisJCQlpZihEaWZmTnVtID49IHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkKQorCQkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50Kys7CisJCQllbHNlCisJCQkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCisJCQkvLyBDb250aXVuZSBjb3VudCBvdmVyCisJCQlpZihwcml2LT5Db250aXVuZURpZmZDb3VudCA+PTIpCisJCQl7CisJCQkJYlN3aXRjaEZyb21Db3VudERpZmYgPSB0cnVlOworCQkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFN0b3AgY29udGl1bmUgY291bnQKKwkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwkJfQorCisJCS8vSWYgQ291bnQgZGlmZiA8PSBGc3luY1JhdGVDb3VudFRocmVzaG9sZAorCQlpZihyYXRlX2NvdW50X2RpZmYgPD0gcHJpdi0+aWVlZTgwMjExLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZCkKKwkJeworCQkJYlN3aXRjaEZyb21Db3VudERpZmYgPSB0cnVlOworCQkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCQl9CisJCXByaXYtPnJhdGVfcmVjb3JkID0gcmF0ZV9jb3VudDsKKwkJcHJpdi0+cmF0ZUNvdW50RGlmZlJlY29yZCA9IHJhdGVfY291bnRfZGlmZjsKKwkJUlRfVFJBQ0UoQ09NUF9IQUxETSwgInJhdGVSZWNvcmQgJWQgcmF0ZUNvdW50ICVkLCByYXRlQ291bnRkaWZmICVkIGJTd2l0Y2hGc3luYyAlZFxuIiwgcHJpdi0+cmF0ZV9yZWNvcmQsIHJhdGVfY291bnQsIHJhdGVfY291bnRfZGlmZiAsIHByaXYtPmJzd2l0Y2hfZnN5bmMpOworCQkvLyBpZiB3ZSBuZXZlciByZWNlaXZlIHRob3NlIG1jcyByYXRlIGFuZCByc3NpID4gMzAgJSB0aGVuIHN3aXRjaCBmc3luCisJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPiBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkICYmIGJTd2l0Y2hGcm9tQ291bnREaWZmKQorCQl7CisJCQliRG91YmxlVGltZUludGVydmFsID0gdHJ1ZTsKKwkJCXByaXYtPmJzd2l0Y2hfZnN5bmMgPSAhcHJpdi0+YnN3aXRjaF9mc3luYzsKKwkJCWlmKHByaXYtPmJzd2l0Y2hfZnN5bmMpCisJCQl7CisJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDAwKTsKKwkJCSNlbHNlCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LDB4QzM2LCAweDFjKTsKKwkJCSNlbmRpZgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJI2lmZGVmIFJUTDgxOTBQCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg0MCk7CisJCQkjZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NWMpOworCQkJI2VuZGlmCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzZSwgMHg5Nik7CisJCQl9CisJCX0KKwkJZWxzZSBpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcnNzaV90aHJlc2hvbGQpCisJCXsKKwkJCWlmKHByaXYtPmJzd2l0Y2hfZnN5bmMpCisJCQl7CisJCQkJcHJpdi0+YnN3aXRjaF9mc3luYyAgPSBmYWxzZTsKKwkJCSNpZmRlZiBSVEw4MTkwUAorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NDApOworCQkJI2Vsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJCSNlbmRpZgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTYpOworCQkJfQorCQl9CisJCWlmKGJEb3VibGVUaW1lSW50ZXJ2YWwpeworCQkJaWYodGltZXJfcGVuZGluZygmcHJpdi0+ZnN5bmNfdGltZXIpKQorCQkJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7CisJCQlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCpwcml2LT5pZWVlODAyMTEtPmZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbCk7CisJCQlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwkJfQorCQllbHNleworCQkJaWYodGltZXJfcGVuZGluZygmcHJpdi0+ZnN5bmNfdGltZXIpKQorCQkJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7CisJCQlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArIE1TRUNTKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CisJCQlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBMZXQgUmVnaXN0ZXIgcmV0dXJuIHRvIGRlZmF1bHQgdmFsdWU7CisJCWlmKHByaXYtPmJzd2l0Y2hfZnN5bmMpCisJCXsKKwkJCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisJCSNpZmRlZiBSVEw4MTkwUAorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHg0MCk7CisJCSNlbHNlCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJI2VuZGlmCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDk2KTsKKwkJfQorCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJI2lmZGVmIFJUTDgxOTBQCisJCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHgxNjQwNTJjZCk7CisJI2Vsc2UKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWM1MmNkKTsKKwkjZW5kaWYKKwl9CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIkNvbnRpdW5lRGlmZkNvdW50ICVkXG4iLCBwcml2LT5Db250aXVuZURpZmZDb3VudCk7CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgInJhdGVSZWNvcmQgJWQgcmF0ZUNvdW50ICVkLCByYXRlQ291bnRkaWZmICVkIGJTd2l0Y2hGc3luYyAlZFxuIiwgcHJpdi0+cmF0ZV9yZWNvcmQsIHJhdGVfY291bnQsIHJhdGVfY291bnRfZGlmZiAsIHByaXYtPmJzd2l0Y2hfZnN5bmMpOworfQorCitzdGF0aWMgdm9pZCBkbV9TdGFydEhXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWMxMmNmKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YzNiLCAweDQxKTsKK30KKworc3RhdGljIHZvaWQgZG1fRW5kU1dGc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCVJUX1RSQUNFKENPTVBfSEFMRE0sICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlkZWxfdGltZXJfc3luYygmKHByaXYtPmZzeW5jX3RpbWVyKSk7CisKKwkvLyBMZXQgUmVnaXN0ZXIgcmV0dXJuIHRvIGRlZmF1bHQgdmFsdWU7CisJaWYocHJpdi0+YnN3aXRjaF9mc3luYykKKwl7CisJCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisKKwkJI2lmZGVmIFJUTDgxOTBQCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDQwKTsKKwkJI2Vsc2UKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NWMpOworCQkjZW5kaWYKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDk2KTsKKwl9CisKKwlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisjaWZuZGVmIFJUTDgxOTBQCisJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWM1MmNkKTsKKyNlbmRpZgorCit9CisKK3N0YXRpYyB2b2lkIGRtX1N0YXJ0U1dGc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgCQkJcmF0ZUluZGV4OworCXUzMiAJCQlyYXRlQml0bWFwOworCisJUlRfVFJBQ0UoQ09NUF9IQUxETSwiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJLy8gSW5pdGlhbCByYXRlIHJlY29yZCB0byB6ZXJvLCBzdGFydCB0byByZWNvcmQuCisJcHJpdi0+cmF0ZV9yZWNvcmQgPSAwOworCS8vIEluaXRpYWwgY29udGl1bmUgZGlmZiBjb3VudCB0byB6ZXJvLCBzdGFydCB0byByZWNvcmQuCisJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCXByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgPSAwOworCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisKKwlpZihwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RykKKwl7CisJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ9IDYwMDsKKwkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQgPSAweGZmZmY7CisJfQorCWVsc2UKKwl7CisJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ9IDIwMDsKKwkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQgPSAyMDA7CisJfQorCWZvcihyYXRlSW5kZXggPSAwOyByYXRlSW5kZXggPD0gMjc7IHJhdGVJbmRleCsrKQorCXsKKwkJcmF0ZUJpdG1hcCAgPSAxIDw8IHJhdGVJbmRleDsKKwkJaWYocHJpdi0+aWVlZTgwMjExLT5mc3luY19yYXRlX2JpdG1hcCAmICByYXRlQml0bWFwKQorCQkJcHJpdi0+cmF0ZV9yZWNvcmQgKz0gcHJpdi0+c3RhdHMucmVjZWl2ZWRfcmF0ZV9oaXN0b2dyYW1bMV1bcmF0ZUluZGV4XTsKKwl9CisJaWYodGltZXJfcGVuZGluZygmcHJpdi0+ZnN5bmNfdGltZXIpKQorCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCXByaXYtPmZzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MocHJpdi0+aWVlZTgwMjExLT5mc3luY190aW1lX2ludGVydmFsKTsKKwlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKworI2lmbmRlZiBSVEw4MTkwUAorCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZCk7CisjZW5kaWYKKworfQorCitzdGF0aWMgdm9pZCBkbV9FbmRIV0ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWM1MmNkKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YzNiLCAweDQ5KTsKKworfQorCit2b2lkIGRtX2NoZWNrX2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjZGVmaW5lCVJlZ0MzOF9EZWZhdWx0CQkJCTAKKyNkZWZpbmUJUmVnQzM4X05vbkZzeW5jX090aGVyX0FQCTEKKyNkZWZpbmUJUmVnQzM4X0ZzeW5jX0FQX0JDTQkJMgorCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwkvL3UzMiAJCQlmcmFtZXN5bmNDMzQ7CisJc3RhdGljIHU4CQlyZWdfYzM4X1N0YXRlPVJlZ0MzOF9EZWZhdWx0OworCXN0YXRpYyB1MzIJcmVzZXRfY250PTA7CisKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiUlNTSSAlZCBUaW1lSW50ZXJ2YWwgJWQgTXVsdGlwbGVUaW1lSW50ZXJ2YWwgJWRcbiIsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcnNzaV90aHJlc2hvbGQsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfdGltZV9pbnRlcnZhbCwgcHJpdi0+aWVlZTgwMjExLT5mc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWwpOworCVJUX1RSQUNFKENPTVBfSEFMRE0sICJSYXRlQml0bWFwIDB4JXggRmlyc3REaWZmUmF0ZVRocmVzaG9sZCAlZCBTZWNvbmREaWZmUmF0ZVRocmVzaG9sZCAlZFxuIiwgcHJpdi0+aWVlZTgwMjExLT5mc3luY19yYXRlX2JpdG1hcCwgcHJpdi0+aWVlZTgwMjExLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZCwgcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQpOworCisJaWYoCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCAmJgorCQkocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0NERF9GU1lOQykpCisJeworCQlpZihwcml2LT5pZWVlODAyMTEtPmJmc3luY19lbmFibGUgPT0gMCkKKwkJeworCQkJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUpCisJCQl7CisJCQkJY2FzZSBEZWZhdWx0X0ZzeW5jOgorCQkJCQlkbV9TdGFydEhXRnN5bmMoZGV2KTsKKwkJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IEhXX0ZzeW5jOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNXX0ZzeW5jOgorCQkJCQlkbV9FbmRTV0ZzeW5jKGRldik7CisJCQkJCWRtX1N0YXJ0SFdGc3luYyhkZXYpOworCQkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gSFdfRnN5bmM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSFdfRnN5bmM6CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzd2l0Y2gocHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSkKKwkJCXsKKwkJCQljYXNlIERlZmF1bHRfRnN5bmM6CisJCQkJCWRtX1N0YXJ0U1dGc3luYyhkZXYpOworCQkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gU1dfRnN5bmM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSFdfRnN5bmM6CisJCQkJCWRtX0VuZEhXRnN5bmMoZGV2KTsKKwkJCQkJZG1fU3RhcnRTV0ZzeW5jKGRldik7CisJCQkJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBTV19Gc3luYzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTV19Gc3luYzoKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKworCQkJfQorCQl9CisJCWlmKHByaXYtPmZyYW1lc3luY01vbml0b3IpCisJCXsKKwkJCWlmKHJlZ19jMzhfU3RhdGUgIT0gUmVnQzM4X0ZzeW5jX0FQX0JDTSkKKwkJCXsJLy9Gb3IgYnJvYWRjb20gQVAgd2Ugd3JpdGUgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWUKKwkJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsIDB4MTUpOworCQkJCSNlbHNlCisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCAweDk1KTsKKwkJCQkjZW5kaWYKKworCQkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRnN5bmNfQVBfQkNNOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlKQorCQl7CisJCQljYXNlIEhXX0ZzeW5jOgorCQkJCWRtX0VuZEhXRnN5bmMoZGV2KTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1dfRnN5bmM6CisJCQkJZG1fRW5kU1dGc3luYyhkZXYpOworCQkJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBEZWZhdWx0X0ZzeW5jOworCQkJCWJyZWFrOworCQkJY2FzZSBEZWZhdWx0X0ZzeW5jOgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCisJCWlmKHByaXYtPmZyYW1lc3luY01vbml0b3IpCisJCXsKKwkJCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwkJCXsKKwkJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IFJlZ0MzOF9USCkKKwkJCQl7CisJCQkJCWlmKHJlZ19jMzhfU3RhdGUgIT0gUmVnQzM4X05vbkZzeW5jX090aGVyX0FQKQorCQkJCQl7CisJCQkJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywgMHgxMCk7CisJCQkJCQkjZWxzZQorCQkJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCAweDkwKTsKKwkJCQkJCSNlbmRpZgorCisJCQkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X05vbkZzeW5jX090aGVyX0FQOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSAoUmVnQzM4X1RIKzUpKQorCQkJCXsKKwkJCQkJaWYocmVnX2MzOF9TdGF0ZSkKKwkJCQkJeworCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsIHByaXYtPmZyYW1lc3luYyk7CisJCQkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0RlZmF1bHQ7CisJCQkJCQkvL0RiZ1ByaW50KCJGc3luYyBpcyBpZGxlLCByc3NpPj00MCwgd3JpdGUgMHhjMzggPSAweCV4IFxuIiwgcEhhbERhdGEtPmZyYW1lc3luYyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYocmVnX2MzOF9TdGF0ZSkKKwkJCQl7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOworCQkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0RlZmF1bHQ7CisJCQkJCS8vRGJnUHJpbnQoIkZzeW5jIGlzIGlkbGUsIG5vdCBjb25uZWN0ZWQsIHdyaXRlIDB4YzM4ID0gMHgleCBcbiIsIHBIYWxEYXRhLT5mcmFtZXN5bmMpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQorCXsKKwkJaWYocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQorCQl7CS8vQWZ0ZXIgc2lsZW50IHJlc2V0LCB0aGUgcmVnX2MzOF9TdGF0ZSB3aWxsIGJlIHJldHVybmVkIHRvIGRlZmF1bHQgdmFsdWUKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOworCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJCQkvL0RiZ1ByaW50KCJyZWdfYzM4X1N0YXRlID0gMCBmb3Igc2lsZW50IHJlc2V0LiBcbiIpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKHJlZ19jMzhfU3RhdGUpCisJCXsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOworCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJLy9EYmdQcmludCgiZnJhbWVzeW5jIG5vIG1vbml0b3IsIHdyaXRlIDB4YzM4ID0gMHgleCBcbiIsIHBIYWxEYXRhLT5mcmFtZXN5bmMpOworCQl9CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglkbV9zaGFkb3dfaW5pdCgpCisgKgorICogT3ZlcnZpZXc6CVN0b3JlIGFsbCBOSUMgTUFDL0JCIHJlZ2lzdGVyIGNvbnRlbnQuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMjkvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gdm9pZCBkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4CXBhZ2U7CisJdTE2CW9mZnNldDsKKworCWZvciAocGFnZSA9IDA7IHBhZ2UgPCA1OyBwYWdlKyspCisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMjU2OyBvZmZzZXQrKykKKwkJeworCQkJZG1fc2hhZG93W3BhZ2VdW29mZnNldF0gPSByZWFkX25pY19ieXRlKGRldiwgb2Zmc2V0K3BhZ2UqMjU2KTsKKwkJCS8vRGJnUHJpbnQoIlAtJWQvTy0lMDJ4PSUwMnhcclxuIiwgcGFnZSwgb2Zmc2V0LCBETV9TaGFkb3dbcGFnZV1bb2Zmc2V0XSk7CisJCX0KKworCWZvciAocGFnZSA9IDg7IHBhZ2UgPCAxMTsgcGFnZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDI1Njsgb2Zmc2V0KyspCisJCQlkbV9zaGFkb3dbcGFnZV1bb2Zmc2V0XSA9IHJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQrcGFnZSoyNTYpOworCisJZm9yIChwYWdlID0gMTI7IHBhZ2UgPCAxNTsgcGFnZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDI1Njsgb2Zmc2V0KyspCisJCQlkbV9zaGFkb3dbcGFnZV1bb2Zmc2V0XSA9IHJlYWRfbmljX2J5dGUoZGV2LCBvZmZzZXQrcGFnZSoyNTYpOworCit9ICAgLyogZG1fc2hhZG93X2luaXQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOglETV9EeW5hbWljVHhQb3dlcigpCisgKgorICogT3ZlcnZpZXc6CURldGVjdCBTaWduYWwgc3RyZW5ndGggdG8gY29udHJvbCBUWCBSZWdpc3RyeQorCQkJVHggUG93ZXIgQ29udHJvbCBGb3IgTmVhci9GYXIgUmFuZ2UKKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwMy8wNi8yMDA4CUphY2tlbglDcmVhdGUgVmVyc2lvbiAwLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGRtX2luaXRfZHluYW1pY190eHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJLy9Jbml0aWFsIFRYIFBvd2VyIENvbnRyb2wgZm9yIG5lYXIvZmFyIHJhbmdlICwgYWRkIGJ5IGFteSAyMDA4LzA1LzE1LCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSB0cnVlOyAgICAvL0RlZmF1bHQgdG8gZW5hYmxlIFR4IFBvd2VyIENvbnRyb2wKKwlwcml2LT5iTGFzdERUUEZsYWdfSGlnaCA9IGZhbHNlOworCXByaXYtPmJMYXN0RFRQRmxhZ19Mb3cgPSBmYWxzZTsKKwlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGRtX2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdHhoaXBvd2VyX3RocmVzaGhvbGQ9MDsKKwl1bnNpZ25lZCBpbnQgdHhsb3dwb3dlcl90aHJlc2hvbGQ9MDsKKwlpZihwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlICE9IHRydWUpCisJeworCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCS8vcHJpbnRrKCJwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay51bmtub3duX2NhcF9leGlzdCBpcyAlZCAscHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnJvYWRjb21fY2FwX2V4aXN0IGlzICVkXG4iLHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnVua25vd25fY2FwX2V4aXN0LHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJyb2FkY29tX2NhcF9leGlzdCk7CisJaWYoKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmF0aGVyb3NfY2FwX2V4aXN0ICkgJiYgKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBJRUVFX0cpKXsKKwkJdHhoaXBvd2VyX3RocmVzaGhvbGQgPSBUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfSElHSDsKKwkJdHhsb3dwb3dlcl90aHJlc2hvbGQgPSBUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfTE9XOworCX0KKwllbHNlCisJeworCQl0eGhpcG93ZXJfdGhyZXNoaG9sZCA9IFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0hJR0g7CisJCXR4bG93cG93ZXJfdGhyZXNob2xkID0gVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTE9XOworCX0KKworLy8JcHJpbnRrKCI9PT09PT09PiVzKCk6IHR4aGlwb3dlcl90aHJlc2hob2xkIGlzICVkLHR4bG93cG93ZXJfdGhyZXNob2xkIGlzICVkXG4iLF9fRlVOQ1RJT05fXyx0eGhpcG93ZXJfdGhyZXNoaG9sZCx0eGxvd3Bvd2VyX3RocmVzaG9sZCk7CisJUlRfVFJBQ0UoQ09NUF9UWEFHQywicHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9ICVsZCBcbiIgLCBwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKTsKKworCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKKwl7CisJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gdHhoaXBvd2VyX3RocmVzaGhvbGQpCisJCXsKKwkJCXByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPSB0cnVlOworCQkJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBoaWdoIHBvd2VyIHN0YXRlIGNoZWNrCisJCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgdHhsb3dwb3dlcl90aHJlc2hvbGQgJiYgcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9PSB0cnVlKQorCQkJeworCQkJCXByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPSBmYWxzZTsKKwkJCX0KKwkJCS8vIGxvdyBwb3dlciBzdGF0ZSBjaGVjaworCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IDM1KQorCQkJeworCQkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gNDApCisJCQl7CisJCQkJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy9wSGFsRGF0YS0+YlRYUG93ZXJDdHJsZm9yTmVhckZhclJhbmdlID0gIXBIYWxEYXRhLT5iVFhQb3dlckN0cmxmb3JOZWFyRmFyUmFuZ2U7CisJCXByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPSBmYWxzZTsKKwkJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7CisJfQorCisJaWYoIChwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyICE9IHByaXYtPmJMYXN0RFRQRmxhZ19IaWdoICkgfHwKKwkJKHByaXYtPmJEeW5hbWljVHhMb3dQb3dlciAhPSBwcml2LT5iTGFzdERUUEZsYWdfTG93ICkgKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9UWEFHQywiU2V0VHhQb3dlckxldmVsODE5MCgpICBjaGFubmVsID0gJWQgXG4iICwgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKyNpZiAgZGVmaW5lZChSVEw4MTkwUCkgfHwgZGVmaW5lZChSVEw4MTkyRSkKKwkJU2V0VHhQb3dlckxldmVsODE5MChBZGFwdGVyLHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCk7CisjZW5kaWYKKworI2lmZGVmIFJUTDgxOTJVCisJCXJ0bDgxOTJfcGh5X3NldFR4UG93ZXIoZGV2LHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQkvL3BIYWxEYXRhLT5iU3RhcnRUeEN0cmxCeVRQQ05GUiA9IEZBTFNFOyAgICAvL0NsZWFyIHRoIGZsYWcgb2YgU2V0IFRYIFBvd2VyIGZyb20gU2l0ZXN1cnZleQorI2VuZGlmCisJfQorCXByaXYtPmJMYXN0RFRQRmxhZ19IaWdoID0gcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlcjsKKwlwcml2LT5iTGFzdERUUEZsYWdfTG93ID0gcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyOworCit9CS8qIGRtX2R5bmFtaWNfdHhwb3dlciAqLworCisvL2FkZGVkIGJ5IHZpdmksIGZvciByZWFkIHR4IHJhdGUgYW5kIHJldHJ5Y291bnQKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3R4cmF0ZWFuZHJldHJ5Y291bnQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCS8vZm9yIDExbiB0eCByYXRlCisvLwlwcml2LT5zdGF0cy5DdXJyZW50U2hvd1R4YXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEN1cnJlbnRfVHhfUmF0ZV9SZWcpOworCWllZWUtPnNvZnRtYWNfc3RhdHMuQ3VycmVudFNob3dUeGF0ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBDdXJyZW50X1R4X1JhdGVfUmVnKTsKKwkvL3ByaW50aygiPT09PT09PT09PT09PT50eF9yYXRlX3JlZzoleFxuIiwgaWVlZS0+c29mdG1hY19zdGF0cy5DdXJyZW50U2hvd1R4YXRlKTsKKwkvL2ZvciBpbml0aWFsIHR4IHJhdGUKKy8vCXByaXYtPnN0YXRzLmxhc3RfcGFja2V0X3JhdGUgPSByZWFkX25pY19ieXRlKGRldiwgSW5pdGlhbF9UeF9SYXRlX1JlZyk7CisJaWVlZS0+c29mdG1hY19zdGF0cy5sYXN0X3BhY2tldF9yYXRlID0gcmVhZF9uaWNfYnl0ZShkZXYgLEluaXRpYWxfVHhfUmF0ZV9SZWcpOworCS8vZm9yIHR4IHR4IHJldHJ5IGNvdW50CisvLwlwcml2LT5zdGF0cy50eHJldHJ5Y291bnQgPSByZWFkX25pY19kd29yZChkZXYsIFR4X1JldHJ5X0NvdW50X1JlZyk7CisJaWVlZS0+c29mdG1hY19zdGF0cy50eHJldHJ5Y291bnQgPSByZWFkX25pY19kd29yZChkZXYsIFR4X1JldHJ5X0NvdW50X1JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX3NlbmRfcnNzaV90b2Z3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJRENNRF9UWENNRF9UCQkJdHhfY21kOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCS8vIElmIHdlIHRlc3QgY2hhcmlvdCwgd2Ugc2hvdWxkIHN0b3AgdGhlIFRYIGNvbW1hbmQgPworCS8vIEJlY2F1c2UgOTJFIHdpbGwgYWx3YXlzIHNpbGVudCByZXNldCB3aGVuIHdlIHNlbmQgdHggY29tbWFuZC4gV2UgdXNlIHJlZ2lzdGVyCisJLy8gMHgxZTAoYnl0ZSkgdG8gYm90aWZ5IGRyaXZlci4KKwl3cml0ZV9uaWNfYnl0ZShkZXYsIERSSVZFUl9SU1NJLCAodTgpcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7CisJcmV0dXJuOworCXR4X2NtZC5PcAkJPSBUWENNRF9TRVRfUlhfUlNTSTsKKwl0eF9jbWQuTGVuZ3RoCT0gNDsKKwl0eF9jbWQuVmFsdWUJCT0gcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKworCWNtcGtfbWVzc2FnZV9oYW5kbGVfdHgoZGV2LCAodTgqKSZ0eF9jbWQsCisJCQkJCQkJCURFU0NfUEFDS0VUX1RZUEVfSU5JVCwgc2l6ZW9mKERDTURfVFhDTURfVCkpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlYjU5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uaApAQCAtMCwwICsxLDI1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglDb3B5cmlnaHQoYykgMjAwNywgIFJlYWxURUsgVGVjaG5vbG9neSBJbmMuIEFsbCBSaWdodCBSZXNlcnZlZC4KKyAqCisgKiBNb2R1bGU6CQlIYWw4MTl4VXNiRE0uaAkoUlRMODE5MiAgSGVhZGVyIEggRmlsZSkKKyAqCisgKgorICogTm90ZToJCUZvciBkeW5hbWljIGNvbnRyb2wgZGVmaW5pdGlvbiBjb25zdGFudCBzdHJ1Y3R1cmUuCisgKgorICoKKyAqIEV4cG9ydDoKKyAqCisgKiBBYmJyZXY6CisgKgorICogSGlzdG9yeToKKyAqCURhdGEJCVdobwkJUmVtYXJrCisgKgkxMC8wNC8yMDA3ICBNSEMgICAgCUNyZWF0ZSBpbml0aWFsIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBoYXMgYmVlbiBpbmNsdWRlZCBhbHJlYWR5LiAgKi8KKyNpZm5kZWYJX19SODE5MlVETV9IX18KKyNkZWZpbmUgX19SODE5MlVETV9IX18KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCURNX0RJR19USFJFU0hfSElHSAkJCQkJNDAKKyNkZWZpbmUJCURNX0RJR19USFJFU0hfTE9XCQkJCQkzNQorCisjZGVmaW5lCQlETV9ESUdfSElHSF9QV1JfVEhSRVNIX0hJR0gJCTc1CisjZGVmaW5lCQlETV9ESUdfSElHSF9QV1JfVEhSRVNIX0xPVwkJNzAKKworI2RlZmluZQkJQldfQVVUT19TV0lUQ0hfSElHSF9MT1cJCQkyNQorI2RlZmluZQkJQldfQVVUT19TV0lUQ0hfTE9XX0hJR0gJCQkzMAorCisjZGVmaW5lCQlETV9jaGVja19mc3luY190aW1lX2ludGVydmFsCQkJCTUwMAorCisKKyNkZWZpbmUJCURNX0RJR19CQUNLT0ZGCQkJCTEyCisjZGVmaW5lCQlETV9ESUdfTUFYCQkJCQkweDM2CisjZGVmaW5lCQlETV9ESUdfTUlOCQkJCQkweDFjCisjZGVmaW5lCQlETV9ESUdfTUlOX05ldGNvcmUJCQkweDEyCisKKyNkZWZpbmUJCVJ4UGF0aFNlbGVjdGlvbl9TU19USF9sb3cJCTMwCisjZGVmaW5lCQlSeFBhdGhTZWxlY3Rpb25fZGlmZl9USAkJCTE4CisKKyNkZWZpbmUJCVJhdGVBZGFwdGl2ZVRIX0hpZ2gJCQk1MAorI2RlZmluZQkJUmF0ZUFkYXB0aXZlVEhfTG93XzIwTQkJMzAKKyNkZWZpbmUJCVJhdGVBZGFwdGl2ZVRIX0xvd180ME0JCTEwCisjZGVmaW5lCQlWZXJ5TG93UlNTSQkJCQkJMTUKKyNkZWZpbmUJCUNUU1RvU2VsZlRIVmFsCQkJCQkzMAorCisvL2RlZmluZWQgYnkgdml2aSwgZm9yIHR4IHBvd2VyIHRyYWNrCisjZGVmaW5lCQlFX0ZPUl9UWF9QT1dFUl9UUkFDSyAgICAgICAgICAgICAgIDMwMAorLy9EeW5hbWljIFR4IFBvd2VyIENvbnRyb2wgVGhyZXNob2xkCisjZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9ISUdICQk2OAorI2RlZmluZQkJVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTE9XCQk2MgorLy9hZGRlZCBieSBhbXkgZm9yIGF0aGVyb3MgQVAKKyNkZWZpbmUgICAgICAgICBUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfSElHSCAgICAgICAgICAgNzgKKyNkZWZpbmUgCVRYX1BPV0VSX0FUSEVST0FQX1RIUkVTSF9MT1cJCTcyCisKKy8vZGVmaW5lZCBieSB2aXZpLCBmb3Igc2hvd2luZyBvbiBVSQorI2RlZmluZSAJCUN1cnJlbnRfVHhfUmF0ZV9SZWcgICAgICAgICAweDFiOAorI2RlZmluZSAJCUluaXRpYWxfVHhfUmF0ZV9SZWcgICAgICAgICAJICAweDFiOQorI2RlZmluZSAJCVR4X1JldHJ5X0NvdW50X1JlZyAgICAgICAgIDB4MWFjCisjZGVmaW5lCQlSZWdDMzhfVEgJCQkJIDIwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIDIwMDcvMTAvMDQgTUggRGVmaW5lIHVwcGVyIGFuZCBsb3dlciB0aHJlc2hvbGQgb2YgRElHIGVuYWJsZSBvciBkaXNhYmxlLiAqLwordHlwZWRlZiBzdHJ1Y3QgX2R5bmFtaWNfaW5pdGlhbF9nYWluX3RocmVzaG9sZF8KK3sKKwl1OAkJZGlnX2VuYWJsZV9mbGFnOworCXU4CQlkaWdfYWxnb3JpdGhtOworCXU4CQlkYmdfbW9kZTsKKwl1OAkJZGlnX2FsZ29yaXRobV9zd2l0Y2g7CisKKwlsb25nCQlyc3NpX2xvd190aHJlc2g7CisJbG9uZwkJcnNzaV9oaWdoX3RocmVzaDsKKworCWxvbmcJCXJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2g7CisJbG9uZwkJcnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2g7CisKKwl1OAkJZGlnX3N0YXRlOworCXU4CQlkaWdfaGlnaHB3cl9zdGF0ZTsKKwl1OAkJY3VyX2Nvbm5lY3Rfc3RhdGU7CisJdTgJCXByZV9jb25uZWN0X3N0YXRlOworCisJdTgJCWN1cnBkX3Roc3RhdGU7CisJdTgJCXByZXBkX3Roc3RhdGU7CisJdTgJCWN1cmNzX3JhdGlvX3N0YXRlOworCXU4CQlwcmVjc19yYXRpb19zdGF0ZTsKKworCXUzMgkJcHJlX2lnX3ZhbHVlOworCXUzMgkJY3VyX2lnX3ZhbHVlOworCisJdTgJCWJhY2tvZmZfdmFsOworCXU4CQlyeF9nYWluX3JhbmdlX21heDsKKwl1OAkJcnhfZ2Fpbl9yYW5nZV9taW47CisJYm9vbAkJaW5pdGlhbGdhaW5fbG93ZXJib3VuZF9zdGF0ZTsKKworCWxvbmcJCXJzc2lfdmFsOworfWRpZ190OworCit0eXBlZGVmIGVudW0gdGFnX2R5bmFtaWNfaW5pdF9nYWluX3N0YXRlX2RlZmluaXRpb24KK3sKKwlETV9TVEFfRElHX09GRiA9IDAsCisJRE1fU1RBX0RJR19PTiwKKwlETV9TVEFfRElHX01BWAorfWRtX2RpZ19zdGFfZTsKKworCisvKiAyMDA3LzEwLzA4IE1IIERlZmluZSBSQVRSIHN0YXRlLiAqLwordHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX3JhdHJfc3RhdGVfZGVmaW5pdGlvbgoreworCURNX1JBVFJfU1RBX0hJR0ggPSAwLAorCURNX1JBVFJfU1RBX01JRERMRSA9IDEsCisJRE1fUkFUUl9TVEFfTE9XID0gMiwKKwlETV9SQVRSX1NUQV9NQVgKK31kbV9yYXRyX3N0YV9lOworCisvKiAyMDA3LzEwLzExIE1IIERlZmluZSBESUcgb3BlcmF0aW9uIHR5cGUuICovCit0eXBlZGVmIGVudW0gdGFnX2R5bmFtaWNfaW5pdF9nYWluX29wZXJhdGlvbl90eXBlX2RlZmluaXRpb24KK3sKKwlESUdfVFlQRV9USFJFU0hfSElHSAk9IDAsCisJRElHX1RZUEVfVEhSRVNIX0xPVwk9IDEsCisJRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSAk9IDIsCisJRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfTE9XCT0gMywKKwlESUdfVFlQRV9EQkdfTU9ERQkJCQk9IDQsCisJRElHX1RZUEVfUlNTSQkJCQkJCT0gNSwKKwlESUdfVFlQRV9BTEdPUklUSE0JCQkJPSA2LAorCURJR19UWVBFX0JBQ0tPRkYJCQkJCT0gNywKKwlESUdfVFlQRV9QV0RCX0ZBQ1RPUgkJCT0gOCwKKwlESUdfVFlQRV9SWF9HQUlOX01JTgkJCQk9IDksCisJRElHX1RZUEVfUlhfR0FJTl9NQVgJCQkJPSAxMCwKKwlESUdfVFlQRV9FTkFCTEUgCQk9IDIwLAorCURJR19UWVBFX0RJU0FCTEUgCQk9IDMwLAorCURJR19PUF9UWVBFX01BWAorfWRtX2RpZ19vcF9lOworCit0eXBlZGVmIGVudW0gdGFnX2RpZ19hbGdvcml0aG1fZGVmaW5pdGlvbgoreworCURJR19BTEdPX0JZX0ZBTFNFX0FMQVJNID0gMCwKKwlESUdfQUxHT19CWV9SU1NJCT0gMSwKKwlESUdfQUxHT19NQVgKK31kbV9kaWdfYWxnX2U7CisKK3R5cGVkZWYgZW51bSB0YWdfZGlnX2RiZ21vZGVfZGVmaW5pdGlvbgoreworCURJR19EQkdfT0ZGID0gMCwKKwlESUdfREJHX09OID0gMSwKKwlESUdfREJHX01BWAorfWRtX2RpZ19kYmdfZTsKKwordHlwZWRlZiBlbnVtIHRhZ19kaWdfY29ubmVjdF9kZWZpbml0aW9uCit7CisJRElHX0RJU0NPTk5FQ1QgPSAwLAorCURJR19DT05ORUNUID0gMSwKKwlESUdfQ09OTkVDVF9NQVgKK31kbV9kaWdfY29ubmVjdF9lOworCit0eXBlZGVmIGVudW0gdGFnX2RpZ19wYWNrZXRkZXRlY3Rpb25fdGhyZXNob2xkX2RlZmluaXRpb24KK3sKKwlESUdfUERfQVRfTE9XX1BPV0VSID0gMCwKKwlESUdfUERfQVRfTk9STUFMX1BPV0VSID0gMSwKKwlESUdfUERfQVRfSElHSF9QT1dFUiA9IDIsCisJRElHX1BEX01BWAorfWRtX2RpZ19wZF90aF9lOworCit0eXBlZGVmIGVudW0gdGFnX2RpZ19jY2tfY3NfcmF0aW9fc3RhdGVfZGVmaW5pdGlvbgoreworCURJR19DU19SQVRJT19MT1dFUiA9IDAsCisJRElHX0NTX1JBVElPX0hJR0hFUiA9IDEsCisJRElHX0NTX01BWAorfWRtX2RpZ19jc19yYXRpb19lOwordHlwZWRlZiBzdHJ1Y3QgX0R5bmFtaWNfUnhfUGF0aF9TZWxlY3Rpb25fCit7CisJdTgJCUVuYWJsZTsKKwl1OAkJRGJnTW9kZTsKKwl1OAkJY2NrX21ldGhvZDsKKwl1OAkJY2NrX1J4X3BhdGg7CisKKwl1OAkJU1NfVEhfbG93OworCXU4CQlkaWZmX1RIOworCXU4CQlkaXNhYmxlZFJGOworCXU4CQlyZXNlcnZlZDsKKworCXU4CQlyZl9yc3NpWzRdOworCXU4CQlyZl9lbmFibGVfcnNzaV90aFs0XTsKKwlsb25nCQljY2tfcHdkYl9zdGFbNF07Cit9RFJ4UGF0aFNlbDsKKwordHlwZWRlZiBlbnVtIHRhZ19DQ0tfUnhfUGF0aF9NZXRob2RfRGVmaW5pdGlvbgoreworCUNDS19SeF9WZXJzaW9uXzEgPSAwLAorCUNDS19SeF9WZXJzaW9uXzI9IDEsCisJQ0NLX1J4X1ZlcnNpb25fTUFYCit9RE1fQ0NLX1J4X1BhdGhfTWV0aG9kOworCit0eXBlZGVmIGVudW0gdGFnX0RNX0RiZ01vZGVfRGVmaW5pdGlvbgoreworCURNX0RCR19PRkYgPSAwLAorCURNX0RCR19PTiA9IDEsCisJRE1fREJHX01BWAorfURNX0RCR19FOworCit0eXBlZGVmIHN0cnVjdCB0YWdfVHhfQ29uZmlnX0NtZF9Gb3JtYXQKK3sKKwl1MzIJT3A7CQkJCQkJCQkJCS8qIENvbW1hbmQgcGFja2V0IHR5cGUuICovCisJdTMyCUxlbmd0aDsJCQkJCQkJCQkvKiBDb21tYW5kIHBhY2tldCBsZW5ndGguICovCisJdTMyCVZhbHVlOworfURDTURfVFhDTURfVCwgKlBEQ01EX1RYQ01EX1Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybglkaWdfdAlkbV9kaWd0YWJsZTsKK2V4dGVybgl1OAkJZG1fc2hhZG93WzE2XVsyNTZdOworZXh0ZXJuIERSeFBhdGhTZWwgICAgICBETV9SeFBhdGhTZWxUYWJsZTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiAgdm9pZCAgICBpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiAgdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitleHRlcm4gdm9pZCBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2V4dGVybiAgdm9pZCAgICBpbml0X3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gIHZvaWQgICAgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiAgdm9pZCAgICBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCXUzMiBkbV90eXBlLCB1MzIgZG1fdmFsdWUpOworZXh0ZXJuICB2b2lkICAgIGRtX2ZvcmNlX3R4X2Z3X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldix1MzIgZm9yY2VfdHlwZSwgdTMyIGZvcmNlX3ZhbHVlKTsKK2V4dGVybiAgdm9pZCAgICBkbV9pbml0X2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiAgdm9pZCAgICBkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworZXh0ZXJuICB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4Jdm9pZAlkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldixib29sICBiaW5jaDE0KTsKK2V4dGVybiAgdm9pZCAgICBkbV9zaGFkb3dfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNlbmRpZgkvKl9fUjgxOTJVRE1fSF9fICovCisKKworLyogRW5kIG9mIHI4MTkyVV9kbS5oICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODlhYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9ody5oCkBAIC0wLDAgKzEsNDExIEBACisvKgorCVRoaXMgaXMgcGFydCBvZiBydGw4MTg3IE9wZW5Tb3VyY2UgZHJpdmVyLgorCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisJUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKKworCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCisJb2ZmaWNpYWwgUmVhbHRlayBkcml2ZXIuCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbgorCWZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcworCTIxMDAgR1BMIGRyaXZlci4KKworCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMKKwlhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KKyovCisKKy8qIE1hcml1c3ogTWF0dXN6ZWsgYWRkZWQgZnVsbCByZWdpc3RlcnMgZGVmaW5pdGlvbiB3aXRoIFJlYWx0ZWsncyBuYW1lICovCisKKy8qIHRoaXMgZmlsZSBjb250YWlucyByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIHJ0bDgxODcgTUFDIGNvbnRyb2xsZXIgKi8KKyNpZm5kZWYgUjgxOTJfSFcKKyNkZWZpbmUgUjgxOTJfSFcKKwordHlwZWRlZiBlbnVtIF9WRVJTSU9OXzgxOXhVeworCVZFUlNJT05fODE5eFVfQSwgLy8gQS1jdXQKKwlWRVJTSU9OXzgxOXhVX0IsIC8vIEItY3V0CisJVkVSU0lPTl84MTl4VV9DLC8vIEMtY3V0Cit9VkVSU0lPTl84MTl4VSwqUFZFUlNJT05fODE5eFU7CisvL2FkZGVkIGZvciBkaWZmZXJlbnQgUkYgdHlwZQordHlwZWRlZiBlbnVtIF9SVF9SRl9UWVBFX0RFRgoreworCVJGXzFUMlIgPSAwLAorCVJGXzJUNFIsCisKKwlSRl84MTlYX01BWF9UWVBFCit9UlRfUkZfVFlQRV9ERUY7CisKKwordHlwZWRlZiBlbnVtIF9CYXNlQmFuZF9Db25maWdfVHlwZXsKKwlCYXNlQmFuZF9Db25maWdfUEhZX1JFRyA9IDAsCQkJLy9SYWRpbyBQYXRoIEEKKwlCYXNlQmFuZF9Db25maWdfQUdDX1RBQiA9IDEsCQkJLy9SYWRpbyBQYXRoIEIKK31CYXNlQmFuZF9Db25maWdfVHlwZSwgKlBCYXNlQmFuZF9Db25maWdfVHlwZTsKKyNkZWZpbmUJUlRMODE4N19SRVFUX1JFQUQJMHhjMAorI2RlZmluZQlSVEw4MTg3X1JFUVRfV1JJVEUJMHg0MAorI2RlZmluZQlSVEw4MTg3X1JFUV9HRVRfUkVHUwkweDA1CisjZGVmaW5lCVJUTDgxODdfUkVRX1NFVF9SRUdTCTB4MDUKKworI2RlZmluZSBNQVhfVFhfVVJCIDUKKyNkZWZpbmUgTUFYX1JYX1VSQiAxNgorCisjZGVmaW5lIFI4MTgwX01BWF9SRVRSWSAyNTUKKy8vI2RlZmluZSBNQVhfUlhfTk9STUFMX1VSQiAzCisvLyNkZWZpbmUgTUFYX1JYX0NPTU1BTkRfVVJCIDIKKyNkZWZpbmUgUlhfVVJCX1NJWkUgOTEwMAorCisjZGVmaW5lIEJCX0FOVEFUVEVOX0NIQU4xNAkweDBjCisjZGVmaW5lIEJCX0FOVEVOTkFfQiAweDQwCisKKyNkZWZpbmUgQkJfSE9TVF9CQU5HICgxPDwzMCkKKyNkZWZpbmUgQkJfSE9TVF9CQU5HX0VOICgxPDwyKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfQ0xLICgxPDwxKQorI2RlZmluZSBCQl9IT1NUX0JBTkdfUlcgKDE8PDMpCisjZGVmaW5lIEJCX0hPU1RfQkFOR19EQVRBCSAxCisKKy8vI2lmIChSVEw4MTlYX0ZQR0FfVkVSICYgUlRMODE5WF9GUEdBX1ZJVklfMDcwOTIwKQorI2RlZmluZSBBRlIJCQkweDAxMAorI2RlZmluZSBBRlJfQ2FyZEJFbgkJKDE8PDApCisjZGVmaW5lIEFGUl9DTEtSVU5fU0VMCQkoMTw8MSkKKyNkZWZpbmUgQUZSX0Z1bmNSZWdFbgkJKDE8PDIpCisjZGVmaW5lIFJUTDgxOTBfRUVQUk9NX0lECTB4ODEyOQorI2RlZmluZSBFRVBST01fVklECQkweDAyCisjZGVmaW5lIEVFUFJPTV9QSUQJCTB4MDQKKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAJMHgwQworCisjZGVmaW5lIEVFUFJPTV9UeFBvd2VyRGlmZgkweDFGCisjZGVmaW5lIEVFUFJPTV9UaGVybWFsTWV0ZXIJMHgyMAorI2RlZmluZSBFRVBST01fUHdEaWZmCQkweDIxCS8vMHgyMQorI2RlZmluZSBFRVBST01fQ3J5c3RhbENhcAkweDIyCS8vMHgyMgorCisjZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfQ0NLCTB4MjMJLy8weDIzCisjZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcJMHgyNAkvLzB4MjR+MHgyNgorI2RlZmluZSBFRVBST01fVHhQd0luZGV4X0NDS19WMQkJMHgyOQkvLzB4Mjl+MHgyQgorI2RlZmluZSBFRVBST01fVHhQd0luZGV4X09GRE1fMjRHX1YxCTB4MkMJLy8weDJDfjB4MkUKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9WZXIJCTB4MjcJLy8weDI3CisKKyNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlckRpZmYJCTB4MAorI2RlZmluZSBFRVBST01fRGVmYXVsdF9UaGVybWFsTWV0ZXIJCTB4NworI2RlZmluZSBFRVBST01fRGVmYXVsdF9Qd0RpZmYJCQkweDQKKyNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcAkJMHg1CisjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1R4UG93ZXIJCQkweDEwMTAKKyNkZWZpbmUgRUVQUk9NX0N1c3RvbWVyX0lECQkJMHg3QgkvLzB4N0I6Q3VzdG9tZXJJRAorI2RlZmluZSBFRVBST01fQ2hhbm5lbFBsYW4JCQkweDE2CS8vMHg3QworI2RlZmluZSBFRVBST01fSUNfVkVSCQkJCTB4N2QJLy8weDdECisjZGVmaW5lIEVFUFJPTV9DUkMJCQkJMHg3ZQkvLzB4N0V+MHg3RgorCisjZGVmaW5lIEVFUFJPTV9DSURfREVGQVVMVAkJCTB4MAorI2RlZmluZSBFRVBST01fQ0lEX0NBTUVPCQkJCTB4MQorI2RlZmluZSBFRVBST01fQ0lEX1JVTlRPUAkJCQkweDIKKyNkZWZpbmUgRUVQUk9NX0NJRF9TZW5hbwkJCQkweDMKKyNkZWZpbmUgRUVQUk9NX0NJRF9UT1NISUJBCQkJCTB4NAkvLyBUb3NoaWJhIHNldHRpbmcsIE1lcmdlIGJ5IEphY2tlbiwgMjAwOC8wMS8zMQorI2RlZmluZSBFRVBST01fQ0lEX05ldENvcmUJCQkJMHg1CisjZGVmaW5lIEVFUFJPTV9DSURfTmV0dHJvbml4CQkJMHg2CisjZGVmaW5lIEVFUFJPTV9DSURfUHJvbmV0CQkJCTB4NworI2RlZmluZSBFRVBST01fQ0lEX0RMSU5LCQkJCTB4OAorCisjZGVmaW5lIEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUCTE2CisjZGVmaW5lIEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUCQkxMgorI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVAkJOAorI2RlZmluZSBBQ19QQVJBTV9BSUZTX09GRlNFVAkJMAorCisvLyNlbmRpZgorZW51bSBfUlRMODE5MlVzYl9IVyB7CisKKwlQQ0lGCQkJPSAweDAwOSwgLy8gUENJIEZ1bmN0aW9uIFJlZ2lzdGVyIDB4MDAwOWh+MHgwMDBiaAorI2RlZmluZQlCQl9HTE9CQUxfUkVTRVRfQklUCTB4MQorCUJCX0dMT0JBTF9SRVNFVAkJPSAweDAyMCwgLy8gQmFzZWJhbmRHbG9iYWwgUmVzZXQgUmVnaXN0ZXIKKwlCU1NJRFIJCQk9IDB4MDJFLCAvLyBCU1NJRCBSZWdpc3RlcgorCUNNRFIJCQk9IDB4MDM3LCAvLyBDb21tYW5kIHJlZ2lzdGVyCisjZGVmaW5lIENSX1JTVAkJCTB4MTAKKyNkZWZpbmUgQ1JfUkUJCQkweDA4CisjZGVmaW5lIENSX1RFCQkJMHgwNAorI2RlZmluZSBDUl9NdWxSVwkJMHgwMQorCVNJRlMJCQk9IDB4MDNFLCAvLyBTSUZTIHJlZ2lzdGVyCisJVENSCQkJPSAweDA0MCwgLy8gVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorCisjZGVmaW5lIFRDUl9NWERNQV8yMDQ4IAkJNworI2RlZmluZSBUQ1JfTFJMX09GRlNFVAkJMAorI2RlZmluZSBUQ1JfU1JMX09GRlNFVAkJOAorI2RlZmluZSBUQ1JfTVhETUFfT0ZGU0VUCTIxCisjZGVmaW5lIFRDUl9TQVQJCQlCSVQyNAkJLy8gRW5hYmxlIFJhdGUgZGVwZWRlbnQgYWNrIHRpbWVvdXQgdGltZXIKKwlSQ1IJCQk9IDB4MDQ0LCAvLyBSZWNlaXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyNkZWZpbmUgTUFDX0ZJTFRFUl9NQVNLICgoMTw8MCkgfCAoMTw8MSkgfCAoMTw8MikgfCAoMTw8MykgfCAoMTw8NSkgfCBcCisJCSgxPDwxMikgfCAoMTw8MTgpIHwgKDE8PDE5KSB8ICgxPDwyMCkgfCAoMTw8MjEpIHwgKDE8PDIyKSB8ICgxPDwyMykpCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX01BU0sgKCgxPDwxMykgfCAoMTw8MTQpIHwgKDE8PDE1KSkKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfU0hJRlQgMTMKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfMTI4IDMKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfMjU2IDQKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfNTEyIDUKKyNkZWZpbmUgUlhfRklGT19USFJFU0hPTERfMTAyNCA2CisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNIT0xEX05PTkUgNworI2RlZmluZSBNQVhfUlhfRE1BX01BU0sgKCgxPDw4KSB8ICgxPDw5KSB8ICgxPDwxMCkpCisjZGVmaW5lIFJDUl9NWERNQV9PRkZTRVQJOAorI2RlZmluZSBSQ1JfRklGT19PRkZTRVQJCTEzCisjZGVmaW5lIFJDUl9PTkxZRVJMUEtUCQlCSVQzMQkJCS8vIEVhcmx5IFJlY2VpdmluZyBiYXNlZCBvbiBQYWNrZXQgU2l6ZS4KKyNkZWZpbmUgUkNSX0VOQ1MyCQlCSVQzMAkJCS8vIEVuYWJsZSBDYXJyaWVyIFNlbnNlIERldGVjdGlvbiBNZXRob2QgMgorI2RlZmluZSBSQ1JfRU5DUzEJCUJJVDI5CQkJLy8gRW5hYmxlIENhcnJpZXIgU2Vuc2UgRGV0ZWN0aW9uIE1ldGhvZCAxCisjZGVmaW5lIFJDUl9FTk1CSUQJCUJJVDI3CQkJLy8gRW5hYmxlIE11bHRpcGxlIEJzc0lkLgorI2RlZmluZSBSQ1JfQUNLVFhCVwkJKEJJVDI0fEJJVDI1KQkJLy8gVFhCVyBTZXR0aW5nIG9mIEFDSyBmcmFtZXMKKyNkZWZpbmUgUkNSX0NCU1NJRAkJQklUMjMJCQkvLyBBY2NlcHQgQlNTSUQgbWF0Y2ggcGFja2V0CisjZGVmaW5lIFJDUl9BUFdSTUdUCQlCSVQyMgkJCS8vIEFjY2VwdCBwb3dlciBtYW5hZ2VtZW50IHBhY2tldAorI2RlZmluZQlSQ1JfQUREMwkJQklUMjEJCQkvLyBBY2NlcHQgYWRkcmVzcyAzIG1hdGNoIHBhY2tldAorI2RlZmluZSBSQ1JfQU1GCQkJQklUMjAJCQkvLyBBY2NlcHQgbWFuYWdlbWVudCB0eXBlIGZyYW1lCisjZGVmaW5lIFJDUl9BQ0YJCQlCSVQxOQkJCS8vIEFjY2VwdCBjb250cm9sIHR5cGUgZnJhbWUKKyNkZWZpbmUgUkNSX0FERgkJCUJJVDE4CQkJLy8gQWNjZXB0IGRhdGEgdHlwZSBmcmFtZQorI2RlZmluZSBSQ1JfUlhGVEgJCUJJVDEzCQkJLy8gUnggRklGTyBUaHJlc2hvbGQKKyNkZWZpbmUgUkNSX0FJQ1YJCUJJVDEyCQkJLy8gQWNjZXB0IElDViBlcnJvciBwYWNrZXQKKyNkZWZpbmUJUkNSX0FDUkMzMgkJQklUNQkJCS8vIEFjY2VwdCBDUkMzMiBlcnJvciBwYWNrZXQKKyNkZWZpbmUJUkNSX0FCCQkJQklUMwkJCS8vIEFjY2VwdCBicm9hZGNhc3QgcGFja2V0CisjZGVmaW5lCVJDUl9BTQkJCUJJVDIJCQkvLyBBY2NlcHQgbXVsdGljYXN0IHBhY2tldAorI2RlZmluZQlSQ1JfQVBNCQkJQklUMQkJCS8vIEFjY2VwdCBwaHlzaWNhbCBtYXRjaCBwYWNrZXQKKyNkZWZpbmUJUkNSX0FBUAkJCUJJVDAJCQkvLyBBY2NlcHQgYWxsIHVuaWNhc3QgcGFja2V0CisJU0xPVF9USU1FCQk9IDB4MDQ5LCAvLyBTbG90IFRpbWUgUmVnaXN0ZXIKKwlBQ0tfVElNRU9VVAkJPSAweDA0YywgLy8gQWNrIFRpbWVvdXQgUmVnaXN0ZXIKKwlQSUZTX1RJTUUJCT0gMHgwNGQsIC8vIFBJRlMgdGltZQorCVVTVElNRQkJCT0gMHgwNGUsIC8vIE1pY3Jvc2Vjb25kIFR1bmluZyBSZWdpc3RlciwgU2V0cyB0aGUgbWljcm9zZWNvbmQgdGltZSB1bml0IHVzZWQgYnkgTUFDIGNsb2NrLgorCUVEQ0FQQVJBX0JFCQk9IDB4MDUwLCAvLyBFRENBIFBhcmFtZXRlciBvZiBBQyBCRQorCUVEQ0FQQVJBX0JLCQk9IDB4MDU0LCAvLyBFRENBIFBhcmFtZXRlciBvZiBBQyBCSworCUVEQ0FQQVJBX1ZPCQk9IDB4MDU4LCAvLyBFRENBIFBhcmFtZXRlciBvZiBBQyBWTworCUVEQ0FQQVJBX1ZJCQk9IDB4MDVDLCAvLyBFRENBIFBhcmFtZXRlciBvZiBBQyBWSQorCVJGUEMJCQk9IDB4MDVGLCAvLyBSeCBGSUZPIFBhY2tldCBDb3VudAorCUNXUlIJCQk9IDB4MDYwLCAvLyBDb250ZW50aW9uIFdpbmRvdyBSZXBvcnQgUmVnaXN0ZXIKKwlCQ05fVENGRwkJPSAweDA2MiwgLy8gQmVhY29uIFRpbWUgQ29uZmlndXJhdGlvbgorI2RlZmluZSBCQ05fVENGR19DV19TSElGVAkJOAorI2RlZmluZSBCQ05fVENGR19JRlMJCQkwCisJQkNOX0lOVEVSVkFMCQk9IDB4MDcwLCAvLyBCZWFjb24gSW50ZXJ2YWwgKFRVKQorCUFUSU1XTkQJCQk9IDB4MDcyLCAvLyBBVElNIFdpbmRvdyBTaXplIChUVSkKKwlCQ05fRFJWX0VBUkxZX0lOVAk9IDB4MDc0LCAvLyBEcml2ZXIgRWFybHkgSW50ZXJydXB0IFRpbWUgKFRVKS4gVGltZSB0byBzZW5kIGludGVycnVwdCB0byBub3RpZnkgdG8gY2hhbmdlIGJlYWNvbiBjb250ZW50IGJlZm9yZSBUQlRUCisJQkNOX0RNQVRJTUUJCT0gMHgwNzYsIC8vIEJlYWNvbiBETUEgYW5kIEFUSU0gaW50ZXJydXB0IHRpbWUgKFVTKS4gSW5kaWNhdGVzIHRoZSB0aW1lIGJlZm9yZSBUQlRUIHRvIHBlcmZvcm0gYmVhY29uIHF1ZXVlIERNQQorCUJDTl9FUlJfVEhSRVNICQk9IDB4MDc4LCAvLyBCZWFjb24gRXJyb3IgVGhyZXNob2xkCisJUldDQU0JCQk9IDB4MEEwLCAvL0lOIDgxOTAgRGF0YSBTaGVldCBpcyBjYWxsZWQgQ0FNY21kCisJV0NBTUkJCQk9IDB4MEE0LCAvLyBTb2Z0d2FyZSB3cml0ZSBDQU0gaW5wdXQgY29udGVudAorCVJDQU1PCQkJPSAweDBBOCwgLy8gU29mdHdhcmUgcmVhZC93cml0ZSBDQU0gY29uZmlnCisJU0VDUgkJCT0gMHgwQjAsIC8vU2VjdXJpdHkgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorI2RlZmluZQlTQ1JfVHhVc2VESwkJQklUMAkJCS8vRm9yY2UgVHggVXNlIERlZmF1bHQgS2V5CisjZGVmaW5lIFNDUl9SeFVzZURLCQlCSVQxCQkJLy9Gb3JjZSBSeCBVc2UgRGVmYXVsdCBLZXkKKyNkZWZpbmUgU0NSX1R4RW5jRW5hYmxlCQlCSVQyCQkJLy9FbmFibGUgVHggRW5jcnlwdGlvbgorI2RlZmluZSBTQ1JfUnhEZWNFbmFibGUJCUJJVDMJCQkvL0VuYWJsZSBSeCBEZWNyeXB0aW9uCisjZGVmaW5lIFNDUl9TS0J5QTIJCUJJVDQJCQkvL1NlYXJjaCBrRVkgQlkgQTIKKyNkZWZpbmUgU0NSX05vU0tNQwkJQklUNQkJCS8vTm8gS2V5IFNlYXJjaCBmb3IgTXVsdGljYXN0CisjZGVmaW5lIFNDUl9Vc2VESwkJMHgwMQorI2RlZmluZSBTQ1JfVHhTZWNFbmFibGUJCTB4MDIKKyNkZWZpbmUgU0NSX1J4U2VjRW5hYmxlCQkweDA0CisJVFBQb2xsCQkJPSAweDBmZCwgLy8gVHJhbnNtaXQgcHJpb3JpdHkgcG9sbGluZyByZWdpc3RlcgorCVBTUgkJCT0gMHgwZmYsIC8vIFBhZ2UgU2VsZWN0IFJlZ2lzdGVyCisjZGVmaW5lIENQVV9DQ0tfTE9PUEJBQ0sJMHgwMDAzMDAwMAorI2RlZmluZSBDUFVfR0VOX1NZU1RFTV9SRVNFVAkweDAwMDAwMDAxCisjZGVmaW5lIENQVV9HRU5fRklSTVdBUkVfUkVTRVQJMHgwMDAwMDAwOAorI2RlZmluZSBDUFVfR0VOX0JPT1RfUkRZCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ1BVX0dFTl9GSVJNX1JEWQkweDAwMDAwMDIwCisjZGVmaW5lIENQVV9HRU5fUFVUX0NPREVfT0sJMHgwMDAwMDA4MAorI2RlZmluZSBDUFVfR0VOX0JCX1JTVAkJMHgwMDAwMDEwMAorI2RlZmluZSBDUFVfR0VOX1BXUl9TVEJfQ1BVCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BVX0dFTl9OT19MT09QQkFDS19NU0sJMHhGRkY4RkZGRgkJLy8gU2V0IGJpdDE4LDE3LDE2IHRvIDAuIFNldCBiaXQxOQorI2RlZmluZSBDUFVfR0VOX05PX0xPT1BCQUNLX1NFVAkweDAwMDgwMDAwCQkvLyBTZXQgQklUMTkgdG8gMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxOTAgQ1BVIEdlbmVyYWwgUmVnaXN0ZXIJCShvZmZzZXQgMHgxMDAsIDQgYnl0ZSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZQlDUFVfQ0NLX0xPT1BCQUNLCTB4MDAwMzAwMDAKKyNkZWZpbmUJQ1BVX0dFTl9TWVNURU1fUkVTRVQJMHgwMDAwMDAwMQorI2RlZmluZQlDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUCTB4MDAwMDAwMDgKKyNkZWZpbmUJQ1BVX0dFTl9CT09UX1JEWQkweDAwMDAwMDEwCisjZGVmaW5lCUNQVV9HRU5fRklSTV9SRFkJMHgwMDAwMDAyMAorI2RlZmluZQlDUFVfR0VOX1BVVF9DT0RFX09LCTB4MDAwMDAwODAKKyNkZWZpbmUJQ1BVX0dFTl9CQl9SU1QJCTB4MDAwMDAxMDAKKyNkZWZpbmUJQ1BVX0dFTl9QV1JfU1RCX0NQVQkweDAwMDAwMDA0CisjZGVmaW5lIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLCTB4RkZGOEZGRkYgLy8gU2V0IGJpdDE4LDE3LDE2IHRvIDAuIFNldCBiaXQxOQorI2RlZmluZSBDUFVfR0VOX05PX0xPT1BCQUNLX1NFVAkweDAwMDgwMDAwIC8vIFNldCBCSVQxOSB0byAxCisJQ1BVX0dFTgkJCT0gMHgxMDAsIC8vIENQVSBSZXNldCBSZWdpc3RlcgorCUxFRDFDZmcJCQk9CQkweDE1NCwvLyBMRUQxIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwlMRUQwQ2ZnCQkJPQkJMHgxNTUsLy8gTEVEMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisKKwlBY21BdmcJCQk9IDB4MTcwLCAvLyBBQ00gQXZlcmFnZSBQZXJpb2QgUmVnaXN0ZXIKKwlBY21Id0N0cmwJCT0gMHgxNzEsIC8vIEFDTSBIYXJkd2FyZSBDb250cm9sIFJlZ2lzdGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLy8KKy8vLy8gICAgICAgODE5MCBBY21Id0N0cmwgYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvZmZzZXQgMHgxNzEsIDEgYnl0ZSkKKy8vLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2RlZmluZSBBY21Id19Id0VuICAgICAgICAgICAgICBCSVQwCisjZGVmaW5lIEFjbUh3X0JlcUVuICAgICAgICAgICAgIEJJVDEKKyNkZWZpbmUgQWNtSHdfVmlxRW4gICAgICAgICAgICAgQklUMgorI2RlZmluZSBBY21Id19Wb3FFbiAgICAgICAgICAgICBCSVQzCisjZGVmaW5lIEFjbUh3X0JlcVN0YXR1cyAgICAgICAgIEJJVDQKKyNkZWZpbmUgQWNtSHdfVmlxU3RhdHVzICAgICAgICAgQklUNQorI2RlZmluZSBBY21Id19Wb3FTdGF0dXMgICAgICAgICBCSVQ2CisKKwlBY21Gd0N0cmwJCT0gMHgxNzIsIC8vIEFDTSBGaXJtd2FyZSBDb250cm9sIFJlZ2lzdGVyCisJQUVTXzExTl9GSVgJCT0gMHgxNzMsCisJVk9BZG1UaW1lCQk9IDB4MTc0LCAvLyBWTyBRdWV1ZSBBZG1pdHRlZCBUaW1lIFJlZ2lzdGVyCisJVklBZG1UaW1lCQk9IDB4MTc4LCAvLyBWSSBRdWV1ZSBBZG1pdHRlZCBUaW1lIFJlZ2lzdGVyCisJQkVBZG1UaW1lCQk9IDB4MTdDLCAvLyBCRSBRdWV1ZSBBZG1pdHRlZCBUaW1lIFJlZ2lzdGVyCisJUlFQTjEJCQk9IDB4MTgwLCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciAsIFZvIFZpLCBCZSwgQmsKKwlSUVBOMgkJCT0gMHgxODQsIC8vIFJlc2VydmVkIFF1ZXVlIFBhZ2UgTnVtYmVyLCBIQ0NBLCBDbWQsIE1nbnQsIEhpZ2gKKwlSUVBOMwkJCT0gMHgxODgsIC8vIFJlc2VydmVkIFF1ZXVlIFBhZ2UgTnVtYmVyLCBCY24sIFB1YmxpYywKKy8vCVFQUlIJCQk9IDB4MUUwLCAvLyBRdWV1ZSBQYWdlIFJlcG9ydCBwZXIgVElECisJUVBOUgkJCT0gMHgxRDAsIC8vMHgxRjAsIC8vIFF1ZXVlIFBhY2tldCBOdW1iZXIgcmVwb3J0IHBlciBUSUQKKwlCUURBCQkJPSAweDIwMCwgLy8gQmVhY29uIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCUhRREEJCQk9IDB4MjA0LCAvLyBIaWdoIFByaW9yaXR5IFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCUNRREEJCQk9IDB4MjA4LCAvLyBDb21tYW5kIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCU1RREEJCQk9IDB4MjBDLCAvLyBNYW5hZ2VtZW50IFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCUhDQ0FRREEJCQk9IDB4MjEwLCAvLyBIQ0NBIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCVZPUURBCQkJPSAweDIxNCwgLy8gVk8gUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCisJVklRREEJCQk9IDB4MjE4LCAvLyBWSSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKKwlCRVFEQQkJCT0gMHgyMUMsIC8vIEJFIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcworCUJLUURBCQkJPSAweDIyMCwgLy8gQksgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCisJUkNRREEJCQk9IDB4MjI0LCAvLyBSZWNlaXZlIGNvbW1hbmQgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCisJUkRRREEJCQk9IDB4MjI4LCAvLyBSZWNlaXZlIFF1ZXVlIERlc2NyaXB0b3IgU3RhcnQgQWRkcmVzcworCisJTUFSMAkJCT0gMHgyNDAsIC8vIE11bHRpY2FzdCBmaWx0ZXIuCisJTUFSNAkJCT0gMHgyNDQsCisKKwlDQ1hfUEVSSU9ECQk9IDB4MjUwLCAvLyBDQ1ggTWVhc3VyZW1lbnQgUGVyaW9kIFJlZ2lzdGVyLCBpbiB1bml0IG9mIFRVLgorCUNMTV9SRVNVTFQJCT0gMHgyNTEsIC8vIENDQSBCdXN5IGZyYWN0aW9uIHJlZ2lzdGVyLgorCU5ITV9QRVJJT0QJCT0gMHgyNTIsIC8vIE5ITSBNZWFzdXJlbWVudCBQZXJpb2QgcmVnaXN0ZXIsIGluIHVuaXQgb2YgVFUuCisKKwlOSE1fVEhSRVNIT0xEMAkJPSAweDI1MywgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDAuCisJTkhNX1RIUkVTSE9MRDEJCT0gMHgyNTQsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQxLgorCU5ITV9USFJFU0hPTEQyCQk9IDB4MjU1LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50Mi4KKwlOSE1fVEhSRVNIT0xEMwkJPSAweDI1NiwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDMuCisJTkhNX1RIUkVTSE9MRDQJCT0gMHgyNTcsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQ0LgorCU5ITV9USFJFU0hPTEQ1CQk9IDB4MjU4LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50NS4KKwlOSE1fVEhSRVNIT0xENgkJPSAweDI1OSwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDYKKworCU1DVFJMCQkJPSAweDI1QSwgLy8gTWVhc3VyZW1lbnQgQ29udHJvbAorCisJTkhNX1JQSV9DT1VOVEVSMAk9IDB4MjY0LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXIwLCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIDwgTkhNX1RIUkVTSE9MRDAuCisJTkhNX1JQSV9DT1VOVEVSMQk9IDB4MjY1LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXIxLCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xEMCwgTkhNX1RIUkVTSE9MRDFdLgorCU5ITV9SUElfQ09VTlRFUjIJPSAweDI2NiwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyMiwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDEsIE5ITV9USFJFU0hPTEQyXS4KKwlOSE1fUlBJX0NPVU5URVIzCT0gMHgyNjcsIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjMsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQyLCBOSE1fVEhSRVNIT0xEM10uCisJTkhNX1JQSV9DT1VOVEVSNAk9IDB4MjY4LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXI0LCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xEMywgTkhNX1RIUkVTSE9MRDRdLgorCU5ITV9SUElfQ09VTlRFUjUJPSAweDI2OSwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyNSwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDQsIE5ITV9USFJFU0hPTEQ1XS4KKwlOSE1fUlBJX0NPVU5URVI2CT0gMHgyNkEsIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjYsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQ1LCBOSE1fVEhSRVNIT0xENl0uCisJTkhNX1JQSV9DT1VOVEVSNwk9IDB4MjZCLCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXI3LCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xENiwgTkhNX1RIUkVTSE9MRDddLgorI2RlZmluZQlCV19PUE1PREVfMTFKCQkJQklUMAorI2RlZmluZQlCV19PUE1PREVfNUcJCQlCSVQxCisjZGVmaW5lCUJXX09QTU9ERV8yME1IWgkJCUJJVDIKKwlCV19PUE1PREUJCT0gMHgzMDAsIC8vIEJhbmR3aWR0aCBvcGVyYXRpb24gbW9kZQorCU1TUgkJCT0gMHgzMDMsIC8vIE1lZGlhIFN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBNU1JfTElOS19NQVNLICAgICAgKCgxPDwwKXwoMTw8MSkpCisjZGVmaW5lIE1TUl9MSU5LX01BTkFHRUQgICAyCisjZGVmaW5lIE1TUl9MSU5LX05PTkUgICAgICAwCisjZGVmaW5lIE1TUl9MSU5LX1NISUZUICAgICAwCisjZGVmaW5lIE1TUl9MSU5LX0FESE9DICAgICAxCisjZGVmaW5lIE1TUl9MSU5LX01BU1RFUiAgICAzCisjZGVmaW5lIE1TUl9MSU5LX0VORURDQQkgICAoMTw8NCkKKwlSRVRSWV9MSU1JVAkJPSAweDMwNCwgLy8gUmV0cnkgTGltaXQgWzE1OjhdLXNob3J0LCBbNzowXS1sb25nCisjZGVmaW5lIFJFVFJZX0xJTUlUX1NIT1JUX1NISUZUIDgKKyNkZWZpbmUgUkVUUllfTElNSVRfTE9OR19TSElGVCAwCisJVFNGUgkJCT0gMHgzMDgsCisJUlJTUgkJCT0gMHgzMTAsIC8vIFJlc3BvbnNlIFJhdGUgU2V0CisjZGVmaW5lIFJSU1JfUlNDX09GRlNFVAkJCTIxCisjZGVmaW5lIFJSU1JfU0hPUlRfT0ZGU0VUCQkJMjMKKyNkZWZpbmUgUlJTUl9SU0NfRFVQTElDQVRFCQkJMHg2MDAwMDAKKyNkZWZpbmUgUlJTUl9SU0NfTE9XU1VCQ0hOTAkJMHg0MDAwMDAKKyNkZWZpbmUgUlJTUl9SU0NfVVBTVUJDSEFOTAkJMHgyMDAwMDAKKyNkZWZpbmUgUlJTUl9TSE9SVAkJCQkJMHg4MDAwMDAKKyNkZWZpbmUgUlJTUl8xTQkJCQkJCUJJVDAKKyNkZWZpbmUgUlJTUl8yTQkJCQkJCUJJVDEKKyNkZWZpbmUgUlJTUl81XzVNCQkJCQlCSVQyCisjZGVmaW5lIFJSU1JfMTFNCQkJCQlCSVQzCisjZGVmaW5lIFJSU1JfNk0JCQkJCQlCSVQ0CisjZGVmaW5lIFJSU1JfOU0JCQkJCQlCSVQ1CisjZGVmaW5lIFJSU1JfMTJNCQkJCQlCSVQ2CisjZGVmaW5lIFJSU1JfMThNCQkJCQlCSVQ3CisjZGVmaW5lIFJSU1JfMjRNCQkJCQlCSVQ4CisjZGVmaW5lIFJSU1JfMzZNCQkJCQlCSVQ5CisjZGVmaW5lIFJSU1JfNDhNCQkJCQlCSVQxMAorI2RlZmluZSBSUlNSXzU0TQkJCQkJQklUMTEKKyNkZWZpbmUgUlJTUl9NQ1MwCQkJCQlCSVQxMgorI2RlZmluZSBSUlNSX01DUzEJCQkJCUJJVDEzCisjZGVmaW5lIFJSU1JfTUNTMgkJCQkJQklUMTQKKyNkZWZpbmUgUlJTUl9NQ1MzCQkJCQlCSVQxNQorI2RlZmluZSBSUlNSX01DUzQJCQkJCUJJVDE2CisjZGVmaW5lIFJSU1JfTUNTNQkJCQkJQklUMTcKKyNkZWZpbmUgUlJTUl9NQ1M2CQkJCQlCSVQxOAorI2RlZmluZSBSUlNSX01DUzcJCQkJCUJJVDE5CisjZGVmaW5lIEJSU1JfQWNrU2hvcnRQbWIJCQlCSVQyMwkJLy8gQ0NLIEFDSzogdXNlIFNob3J0IFByZWFtYmxlIG9yIG5vdC4KKwlSQVRSMAkJCT0gMHgzMjAsIC8vIFJhdGUgQWRhcHRpdmUgVGFibGUgcmVnaXN0ZXIxCisJVUZXUAkJCT0gMHgzMTgsCisJRFJJVkVSX1JTU0kJCT0gMHgzMmMsCQkJCQkvLyBEcml2ZXIgdGVsbCBGaXJtd2FyZSBjdXJyZW50IFJTU0kKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgODE5MCBSYXRlIEFkYXB0aXZlIFRhYmxlIFJlZ2lzdGVyCShvZmZzZXQgMHgzMjAsIDQgYnl0ZSkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy9DQ0sKKyNkZWZpbmUJUkFUUl8xTQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUJUkFUUl8yTQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUJUkFUUl81NU0JCTB4MDAwMDAwMDQKKyNkZWZpbmUJUkFUUl8xMU0JCTB4MDAwMDAwMDgKKy8vT0ZETQorI2RlZmluZQlSQVRSXzZNCQkJMHgwMDAwMDAxMAorI2RlZmluZQlSQVRSXzlNCQkJMHgwMDAwMDAyMAorI2RlZmluZQlSQVRSXzEyTQkJMHgwMDAwMDA0MAorI2RlZmluZQlSQVRSXzE4TQkJMHgwMDAwMDA4MAorI2RlZmluZQlSQVRSXzI0TQkJMHgwMDAwMDEwMAorI2RlZmluZQlSQVRSXzM2TQkJMHgwMDAwMDIwMAorI2RlZmluZQlSQVRSXzQ4TQkJMHgwMDAwMDQwMAorI2RlZmluZQlSQVRSXzU0TQkJMHgwMDAwMDgwMAorLy9NQ1MgMSBTcGF0aWFsIFN0cmVhbQorI2RlZmluZQlSQVRSX01DUzAJCTB4MDAwMDEwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxCQkweDAwMDAyMDAwCisjZGVmaW5lCVJBVFJfTUNTMgkJMHgwMDAwNDAwMAorI2RlZmluZQlSQVRSX01DUzMJCTB4MDAwMDgwMDAKKyNkZWZpbmUJUkFUUl9NQ1M0CQkweDAwMDEwMDAwCisjZGVmaW5lCVJBVFJfTUNTNQkJMHgwMDAyMDAwMAorI2RlZmluZQlSQVRSX01DUzYJCTB4MDAwNDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1M3CQkweDAwMDgwMDAwCisvL01DUyAyIFNwYXRpYWwgU3RyZWFtCisjZGVmaW5lCVJBVFJfTUNTOAkJMHgwMDEwMDAwMAorI2RlZmluZQlSQVRSX01DUzkJCTB4MDAyMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMAkJMHgwMDQwMDAwMAorI2RlZmluZQlSQVRSX01DUzExCQkweDAwODAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTIJCTB4MDEwMDAwMDAKKyNkZWZpbmUJUkFUUl9NQ1MxMwkJMHgwMjAwMDAwMAorI2RlZmluZQlSQVRSX01DUzE0CQkweDA0MDAwMDAwCisjZGVmaW5lCVJBVFJfTUNTMTUJCTB4MDgwMDAwMDAKKy8vIEFMTCBDQ0sgUmF0ZQorI2RlZmluZSBSQVRFX0FMTF9DQ0sJCVJBVFJfMU18UkFUUl8yTXxSQVRSXzU1TXxSQVRSXzExTQorI2RlZmluZSBSQVRFX0FMTF9PRkRNX0FHCVJBVFJfNk18UkFUUl85TXxSQVRSXzEyTXxSQVRSXzE4TXxSQVRSXzI0TVwKKwkJCQkJCQl8UkFUUl8zNk18UkFUUl80OE18UkFUUl81NE0KKyNkZWZpbmUgUkFURV9BTExfT0ZETV8xU1MJUkFUUl9NQ1MwfFJBVFJfTUNTMXxSQVRSX01DUzJ8UkFUUl9NQ1MzIHwgXAorCQkJCQkJCVJBVFJfTUNTNHxSQVRSX01DUzV8UkFUUl9NQ1M2fFJBVFJfTUNTNworI2RlZmluZSBSQVRFX0FMTF9PRkRNXzJTUwlSQVRSX01DUzh8UkFUUl9NQ1M5CXxSQVRSX01DUzEwfFJBVFJfTUNTMTF8IFwKKwkJCQkJCQlSQVRSX01DUzEyfFJBVFJfTUNTMTN8UkFUUl9NQ1MxNHxSQVRSX01DUzE1CisKKwlNQ1NfVFhBR0MJCT0gMHgzNDAsIC8vIE1DUyBBR0MKKwlDQ0tfVFhBR0MJCT0gMHgzNDgsIC8vIENDSyBBR0MKKy8vCUlTUgkJCT0gMHgzNTAsIC8vIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKKy8vCUlNUgkJCT0gMHgzNTQsIC8vIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCisvLwlJTVJfUE9MTAkJPSAweDM2MCwKKwlNYWNCbGtDdHJsCQk9IDB4NDAzLCAvLyBNYWMgYmxvY2sgb24vb2ZmIGNvbnRyb2wgcmVnaXN0ZXIKKworCUVQUk9NX0NNRCAJCT0gMHhmZTU4LAorI2RlZmluZSBDbWQ5MzQ2Q1JfOTM1NlNFTAkoMTw8NCkKKyNkZWZpbmUgRVBST01fQ01EX1JFU0VSVkVEX01BU0sgKDE8PDUpCisjZGVmaW5lIEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9TSElGVCA2CisjZGVmaW5lIEVQUk9NX0NNRF9PUEVSQVRJTkdfTU9ERV9NQVNLICgoMTw8Nyl8KDE8PDYpKQorI2RlZmluZSBFUFJPTV9DTURfQ09ORklHIDB4MworI2RlZmluZSBFUFJPTV9DTURfTk9STUFMIDAKKyNkZWZpbmUgRVBST01fQ01EX0xPQUQgMQorI2RlZmluZSBFUFJPTV9DTURfUFJPR1JBTSAyCisjZGVmaW5lIEVQUk9NX0NTX1NISUZUIDMKKyNkZWZpbmUgRVBST01fQ0tfU0hJRlQgMgorI2RlZmluZSBFUFJPTV9XX1NISUZUIDEKKyNkZWZpbmUgRVBST01fUl9TSElGVCAwCisJTUFDMCAJCQk9IDB4MDAwLAorCU1BQzEgCQkJPSAweDAwMSwKKwlNQUMyIAkJCT0gMHgwMDIsCisJTUFDMyAJCQk9IDB4MDAzLAorCU1BQzQgCQkJPSAweDAwNCwKKwlNQUM1IAkJCT0gMHgwMDUsCisKK307CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgIDgxOHhCIEFuYVBhcm0gJiBBbmFQYXJtMiBSZWdpc3RlcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyNkZWZpbmUgQU5BUEFSTV9BU0lDX09OICAgIDB4NDUwOTA2NTgKKy8vI2RlZmluZSBBTkFQQVJNMl9BU0lDX09OICAgMHg3MjdmM2Y1MgorI2RlZmluZSBHUEkgMHgxMDgKKyNkZWZpbmUgR1BPIDB4MTA5CisjZGVmaW5lIEdQRSAweDEwYQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkNWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYwpAQCAtMCwwICsxLDEyMjggQEAKKy8qCisgICBUaGlzIGZpbGUgY29udGFpbnMgd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzLgorCisgICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KKyAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorCisgICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0CisgICBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIuCisKKyAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KKyAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KKworICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgorCisgICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKKyAgIHByb2plY3QgQXV0aG9ycy4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJyODE5MlUuaCIKKyNpbmNsdWRlICJyODE5MlVfaHcuaCIKKworI2lmZGVmIEVOQUJMRV9ET1QxMUQKKyNpbmNsdWRlICJkb3QxMWQuaCIKKyNlbmRpZgorCisjZGVmaW5lIFJBVEVfQ09VTlQgMTIKK3UzMiBydGw4MTgwX3JhdGVzW10gPSB7MTAwMDAwMCwyMDAwMDAwLDU1MDAwMDAsMTEwMDAwMDAsCisJNjAwMDAwMCw5MDAwMDAwLDEyMDAwMDAwLDE4MDAwMDAwLDI0MDAwMDAwLDM2MDAwMDAwLDQ4MDAwMDAwLDU0MDAwMDAwfTsKKworCisjaWZuZGVmIEVORVRET1dOCisjZGVmaW5lIEVORVRET1dOIDEKKyNlbmRpZgorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfZnJlcShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdj1pZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfbW9kZShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworfQorCisKKworc3RhdGljIGludCByODE5Ml93eF9nZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfcmF0ZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKK30KKworCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9yYXRlKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3J0cyhwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9ydHMocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9wb3dlcihwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKK30KKworI2lmZGVmIEpPSE5fSU9DVEwKK3UxNiByZWFkX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcik7Cit2b2lkIHdyaXRlX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MTYgZGF0YSk7Cit1MzIgam9obl9yZWFkX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyKTsKK3ZvaWQgX3dyaXRlX3J0bDgyMjUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MTYgZGF0YSk7CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfcmVhZF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggYWRkcjsKKwl1MTYgZGF0YTE7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisKKwlnZXRfdXNlcihhZGRyLCh1OCopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwlkYXRhMSA9IHJlYWRfcnRsODIyNShkZXYsIGFkZHIpOworCXdycXUtPmRhdGEubGVuZ3RoID0gZGF0YTE7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3dyaXRlX3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBhZGRyOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWdldF91c2VyKGFkZHIsICh1OCopd3JxdS0+ZGF0YS5wb2ludGVyKTsKKwl3cml0ZV9ydGw4MjI1KGRldiwgYWRkciwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKwordm9pZCBydGw4MTg3X3dyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHUzMiBkYXRhKTsKK3U4IHJ0bDgxODdfcmVhZF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1OCBhZHIsIHUzMiBkYXRhKTsKKworc3RhdGljIGludCByODE5Ml93eF9yZWFkX2JiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggZGF0YWJiOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWRhdGFiYiA9IHJ0bDgxODdfcmVhZF9waHkoZGV2LCAodTgpd3JxdS0+ZGF0YS5sZW5ndGgsIDB4MDAwMDAwMDApOworCXdycXUtPmRhdGEubGVuZ3RoID0gZGF0YWJiOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRsODE4N193cml0ZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRyLCB1MzIgZGF0YSk7CitzdGF0aWMgaW50IHI4MTkyX3d4X3dyaXRlX2JiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTggZGF0YWJiOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWdldF91c2VyKGRhdGFiYiwgKHU4Kil3cnF1LT5kYXRhLnBvaW50ZXIpOworCXJ0bDgxODdfd3JpdGVfcGh5KGRldiwgd3JxdS0+ZGF0YS5sZW5ndGgsIGRhdGFiYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfd3JpdGVfbmljYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBhZGRyOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWdldF91c2VyKGFkZHIsICh1MzIqKXdycXUtPmRhdGEucG9pbnRlcik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBhZGRyLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorc3RhdGljIGludCByODE5Ml93eF9yZWFkX25pY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MzIgYWRkcjsKKwl1MTYgZGF0YTE7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJZ2V0X3VzZXIoYWRkciwodTMyKil3cnF1LT5kYXRhLnBvaW50ZXIpOworCWRhdGExID0gcmVhZF9uaWNfYnl0ZShkZXYsIGFkZHIpOworCXdycXUtPmRhdGEubGVuZ3RoID0gZGF0YTE7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfYXBfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7CisJaW50IG5hbWVfbGVuOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCS8vY291bnQgdGhlIGxlbmd0aCBvZiBpbnB1dCBzc2lkCisJZm9yKG5hbWVfbGVuPTAgOyAoKGNoYXIqKXdycXUtPmRhdGEucG9pbnRlcilbbmFtZV9sZW5dIT0nXDAnIDsgbmFtZV9sZW4rKyk7CisKKwkvL3NlYXJjaCBmb3IgdGhlIGNvcnJlc3BvZGluZyBpbmZvIHdoaWNoIGlzIHJlY2VpdmVkCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCAodGFyZ2V0LT5zc2lkX2xlbiA9PSBuYW1lX2xlbikgJiYKKwkJICAgICAoc3RybmNtcCh0YXJnZXQtPnNzaWQsIChjaGFyKil3cnF1LT5kYXRhLnBvaW50ZXIsIG5hbWVfbGVuKT09MCkpeworCQkJaWYodGFyZ2V0LT53cGFfaWVfbGVuPjAgfHwgdGFyZ2V0LT5yc25faWVfbGVuPjAgKQorCQkJCS8vc2V0IGZsYWdzPTEgdG8gaW5kaWNhdGUgdGhpcyBhcCBpcyBXUEEKKwkJCQl3cnF1LT5kYXRhLmZsYWdzID0gMTsKKwkJCWVsc2Ugd3JxdS0+ZGF0YS5mbGFncyA9IDA7CisKKworCQlicmVhazsKKwkJfQorCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworfQorCisKKworI2VuZGlmCitzdGF0aWMgaW50IHI4MTkyX3d4X2ZvcmNlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcmludGsoIiVzKCk6IGZvcmNlIHJlc2V0ICEgZXh0cmEgaXMgJWRcbiIsX19GVU5DVElPTl9fLCAqZXh0cmEpOworCXByaXYtPmZvcmNlX3Jlc2V0ID0gKmV4dHJhOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworCit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfcmF3dHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfcmF3dHgocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfY3JjbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJc2hvcnQgcHJldiA9IHByaXYtPmNyY21vbjsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZihlbmFibGUpCisJCXByaXYtPmNyY21vbj0xOworCWVsc2UKKwkJcHJpdi0+Y3JjbW9uPTA7CisKKwlETUVTRygiYmFkIENSQyBpbiBtb25pdG9yIG1vZGUgYXJlICVzIiwKKwkgICAgICBwcml2LT5jcmNtb24gPyAiYWNjZXB0ZWQiIDogInJlamVjdGVkIik7CisKKwlpZihwcmV2ICE9IHByaXYtPmNyY21vbiAmJiBwcml2LT51cCl7CisJCS8vcnRsODE4MF9kb3duKGRldik7CisJCS8vcnRsODE4MF91cChkZXYpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaW50IHJldDsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9tb2RlKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7CisKKwlydGw4MTkyX3NldF9yeGNvbmYoZGV2KTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCAgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEKK3sKKwkvKiBJbmZvcm1hdGl2ZSBzdHVmZiAodG8gY2hvb3NlIGJldHdlZW4gZGlmZmVyZW50IGludGVyZmFjZSkgKi8KKwlfX3UzMiAgICAgICAgICAgdGhyb3VnaHB1dDsgICAgIC8qIFRvIGdpdmUgYW4gaWRlYS4uLiAqLworCS8qIEluIHRoZW9yeSB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUgbWF4aW11bSBiZW5jaG1hcmtlZAorCSAqIFRDUC9JUCB0aHJvdWdocHV0LCBiZWNhdXNlIHdpdGggbW9zdCBvZiB0aGVzZSBkZXZpY2VzIHRoZQorCSAqIGJpdCByYXRlIGlzIG1lYW5pbmdsZXNzIChvdmVyaGVhZCBhbiBjbykgdG8gZXN0aW1hdGUgaG93CisJICogZmFzdCB0aGUgY29ubmVjdGlvbiB3aWxsIGdvIGFuZCBwaWNrIHRoZSBmYXN0ZXN0IG9uZS4KKwkgKiBJIHN1Z2dlc3QgcGVvcGxlIHRvIHBsYXkgd2l0aCBOZXRwZXJmIG9yIGFueSBiZW5jaG1hcmsuLi4KKwkgKi8KKworCS8qIE5XSUQgKG9yIGRvbWFpbiBpZCkgKi8KKwlfX3UzMiAgICAgICAgICAgbWluX253aWQ7ICAgICAgIC8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKwlfX3UzMiAgICAgICAgICAgbWF4X253aWQ7ICAgICAgIC8qIE1heGltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKworCS8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KKwlfX3UxNiAgICAgICAgICAgb2xkX251bV9jaGFubmVsczsKKwlfX3U4ICAgICAgICAgICAgb2xkX251bV9mcmVxdWVuY3k7CisKKwkvKiBTY2FuIGNhcGFiaWxpdGllcyAqLworCV9fdTggICAgICAgICAgICBzY2FuX2NhcGE7Cit9Oworc3RhdGljIGludCBydGw4MTgwX3d4X2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKwlzdHJ1Y3QgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEqIHRtcCA9IChzdHJ1Y3QgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEqKXJhbmdlOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1MTYgdmFsOworCWludCBpOworCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2YoKnJhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKKworCS8qIExldCdzIHRyeSB0byBrZWVwIHRoaXMgc3RydWN0IGluIHRoZSBzYW1lIG9yZGVyIGFzIGluCisJICogbGludXgvaW5jbHVkZS93aXJlbGVzcy5oCisJICovCisKKwkvKiBUT0RPOiBTZWUgd2hhdCB2YWx1ZXMgd2UgY2FuIHNldCwgYW5kIHJlbW92ZSB0aGUgb25lcyB3ZSBjYW4ndAorCSAqIHNldCwgb3IgZmlsbCB0aGVtIHdpdGggc29tZSBkZWZhdWx0IGRhdGEuCisJICovCisKKwkvKiB+NSBNYi9zIHJlYWwgKDgwMi4xMWIpICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSA1ICogMTAwMCAqIDEwMDA7CisKKwkvLyBUT0RPOiBOb3QgdXNlZCBpbiA4MDIuMTFiPworLy8JcmFuZ2UtPm1pbl9ud2lkOwkvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCisJLy8gVE9ETzogTm90IHVzZWQgaW4gODAyLjExYj8KKy8vCXJhbmdlLT5tYXhfbndpZDsJLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCisJLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworLy8JcmFuZ2UtPm9sZF9udW1fY2hhbm5lbHM7CisvLwlyYW5nZS0+b2xkX251bV9mcmVxdWVuY3k7CisvLwlyYW5nZS0+b2xkX2ZyZXFbNl07IC8qIEZpbGxlciB0byBrZWVwICJ2ZXJzaW9uIiBhdCB0aGUgc2FtZSBvZmZzZXQgKi8KKwlpZihwcml2LT5yZl9zZXRfc2VucyAhPSBOVUxMKQorCQlyYW5nZS0+c2Vuc2l0aXZpdHkgPSBwcml2LT5tYXhfc2VuczsJLyogc2lnbmFsIGxldmVsIHRocmVzaG9sZCByYW5nZSAqLworCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJLyogVE9ETzogRmluZCByZWFsIG1heCBSU1NJIGFuZCBzdGljayBoZXJlICovCisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAtOTg7CisJcmFuZ2UtPm1heF9xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA5MjsgLyogPiA4JSBtaXNzZWQgYmVhY29ucyBpcyAnYmFkJyAqLworCS8qIFRPRE86IEZpbmQgcmVhbCAnZ29vZCcgdG8gJ2JhZCcgdGhyZXNob2wgdmFsdWUgZm9yIFJTU0kgKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBSQVRFX0NPVU5UOworCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQgJiYgaSA8IElXX01BWF9CSVRSQVRFUzsgaSsrKSB7CisJCXJhbmdlLT5iaXRyYXRlW2ldID0gcnRsODE4MF9yYXRlc1tpXTsKKwl9CisKKwlyYW5nZS0+bWluX2ZyYWcgPSBNSU5fRlJBR19USFJFU0hPTEQ7CisJcmFuZ2UtPm1heF9mcmFnID0gTUFYX0ZSQUdfVEhSRVNIT0xEOworCisJcmFuZ2UtPm1pbl9wbXA9MDsKKwlyYW5nZS0+bWF4X3BtcCA9IDUwMDAwMDA7CisJcmFuZ2UtPm1pbl9wbXQgPSAwOworCXJhbmdlLT5tYXhfcG10ID0gNjU1MzUqMTAwMDsKKwlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8IElXX1BPV0VSX0FMTF9SOworCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gMTY7CisKKy8vCXJhbmdlLT5yZXRyeV9jYXBhOwkvKiBXaGF0IHJldHJ5IG9wdGlvbnMgYXJlIHN1cHBvcnRlZCAqLworLy8JcmFuZ2UtPnJldHJ5X2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGltaXQgKi8KKy8vCXJhbmdlLT5yX3RpbWVfZmxhZ3M7CS8qIEhvdyB0byBkZWNvZGUgbWF4L21pbiByZXRyeSBsaWZlICovCisvLwlyYW5nZS0+bWluX3JldHJ5OwkvKiBNaW5pbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWF4X3JldHJ5OwkvKiBNYXhpbWFsIG51bWJlciBvZiByZXRyaWVzICovCisvLwlyYW5nZS0+bWluX3JfdGltZTsJLyogTWluaW1hbCByZXRyeSBsaWZldGltZSAqLworLy8JcmFuZ2UtPm1heF9yX3RpbWU7CS8qIE1heGltYWwgcmV0cnkgbGlmZXRpbWUgKi8KKworCisJZm9yIChpID0gMCwgdmFsID0gMDsgaSA8IDE0OyBpKyspIHsKKworCQkvLyBJbmNsdWRlIG9ubHkgbGVnYWwgZnJlcXVlbmNpZXMgZm9yIHNvbWUgY291bnRyaWVzCisjaWZkZWYgRU5BQkxFX0RPVDExRAorCQlpZiAoKEdFVF9ET1QxMURfSU5GTyhwcml2LT5pZWVlODAyMTEpLT5jaGFubmVsX21hcClbaSsxXSkgeworI2Vsc2UKKwkJaWYgKChwcml2LT5pZWVlODAyMTEtPmNoYW5uZWxfbWFwKVtpKzFdKSB7CisjZW5kaWYKKwkJCXJhbmdlLT5mcmVxW3ZhbF0uaSA9IGkgKyAxOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5tID0gaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbaV0gKiAxMDAwMDA7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLmUgPSAxOworCQkJdmFsKys7CisJCX0gZWxzZSB7CisJCQkvLyBGSVhNRTogZG8gd2UgbmVlZCB0byBzZXQgYW55dGhpbmcgZm9yIGNoYW5uZWxzCisJCQkvLyB3ZSBkb24ndCB1c2UgPworCQl9CisKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCWJyZWFrOworCX0KKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IHZhbDsKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gdmFsOworI2lmIFdJUkVMRVNTX0VYVCA+IDE3CisJcmFuZ2UtPmVuY19jYXBhID0gSVdfRU5DX0NBUEFfV1BBfElXX0VOQ19DQVBBX1dQQTJ8CisJCQkgIElXX0VOQ19DQVBBX0NJUEhFUl9US0lQfElXX0VOQ19DQVBBX0NJUEhFUl9DQ01QOworI2VuZGlmCisJdG1wLT5zY2FuX2NhcGEgPSAweDAxOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJaW50IHJldCA9IDA7CisKKwlpZighcHJpdi0+dXApIHJldHVybiAtRU5FVERPV047CisKKwlpZiAocHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPT0gdHJ1ZSkKKwkJcmV0dXJuIC1FQUdBSU47CisJaWYgKHdycXUtPmRhdGEuZmxhZ3MgJiBJV19TQ0FOX1RISVNfRVNTSUQpCisJeworCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEqIHJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEqKWI7CisJCWlmIChyZXEtPmVzc2lkX2xlbikKKwkJeworCQkJLy9wcmludGsoIj09KiomKiYqJioqPT09PnNjYW4gc2V0IHNzaWQ6JXNcbiIsIHJlcS0+ZXNzaWQpOworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gcmVxLT5lc3NpZF9sZW47CisJCQltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHJlcS0+ZXNzaWQsIHJlcS0+ZXNzaWRfbGVuKTsKKwkJCS8vcHJpbnRrKCI9PT09PT5uZXR3b3JrIHNzaWQ6JXNcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkKTsKKwkJfQorCX0KKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKXsKKwkJcHJpdi0+aWVlZTgwMjExLT5zY2FubmluZyA9IDA7CisJCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKHByaXYtPmllZWU4MDIxMSk7CisJCXJldCA9IDA7CisJfQorCWVsc2UKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYoIXByaXYtPnVwKSByZXR1cm4gLUVORVRET1dOOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9nZXRfc2Nhbihwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludCByZXQ7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZXNzaWQocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCisKKworc3RhdGljIGludCByODE5Ml93eF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IGllZWU4MDIxMV93eF9nZXRfZXNzaWQocHJpdi0+aWVlZTgwMjExLCBhLCB3cnF1LCBiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9mcmVxKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9uYW1lKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCisJCXByaXYtPmllZWU4MDIxMS0+ZnRzID0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIHsKKwkJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBNSU5fRlJBR19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPmZyYWcudmFsdWUgPiBNQVhfRlJBR19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IHdycXUtPmZyYWcudmFsdWUgJiB+MHgxOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPmllZWU4MDIxMS0+ZnRzOworCXdycXUtPmZyYWcuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPmZyYWcuZGlzYWJsZWQgPSAod3JxdS0+ZnJhZy52YWx1ZSA9PSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8gICAgICAgIHN0cnVjdCBzb2NrYWRkciAqdGVtcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhd3JxOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3dhcChwcml2LT5pZWVlODAyMTEsaW5mbyxhd3JxLGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfd2FwKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKKwlpbnQgcmV0OworCisJLy91MzIgVGFyZ2V0Q29udGVudDsKKwl1MzIgaHdrZXlbNF09ezAsMCwwLDB9OworCXU4IG1hc2s9MHhmZjsKKwl1MzIga2V5X2lkeD0wOworCS8vdTggYnJvYWRjYXN0X2FkZHJbNl0gPXsJMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCXU4IHplcm9fYWRkcls0XVs2XSA9ewl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCQkJCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMX0sCisJCQkJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyfSwKKwkJCQl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDN9IH07CisJaW50IGk7CisKKyAgICAgICBpZighcHJpdi0+dXApIHJldHVybiAtRU5FVERPV047CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJUlRfVFJBQ0UoQ09NUF9TRUMsICJTZXR0aW5nIFNXIHdlcCBrZXkiKTsKKwlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGtleSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCisKKwkvL3NvbWV0aW1lcywgdGhlIGxlbmd0aCBpcyB6ZXJvIHdoaWxlIHdlIGRvIG5vdCB0eXBlIGtleSB2YWx1ZQorCWlmKHdycXUtPmVuY29kaW5nLmxlbmd0aCE9MCl7CisKKwkJZm9yKGk9MCA7IGk8NCA7IGkrKyl7CisJCQlod2tleVtpXSB8PSAga2V5WzQqaSswXSZtYXNrOworCQkJaWYoaT09MSYmKDQqaSsxKT09d3JxdS0+ZW5jb2RpbmcubGVuZ3RoKSBtYXNrPTB4MDA7CisJCQlpZihpPT0zJiYoNCppKzEpPT13cnF1LT5lbmNvZGluZy5sZW5ndGgpIG1hc2s9MHgwMDsKKwkJCWh3a2V5W2ldIHw9IChrZXlbNCppKzFdJm1hc2spPDw4OworCQkJaHdrZXlbaV0gfD0gKGtleVs0KmkrMl0mbWFzayk8PDE2OworCQkJaHdrZXlbaV0gfD0gKGtleVs0KmkrM10mbWFzayk8PDI0OworCQl9CisKKwkJI2RlZmluZSBDT05GX1dFUDQwICAweDQKKwkJI2RlZmluZSBDT05GX1dFUDEwNCAweDE0CisKKwkJc3dpdGNoKHdycXUtPmVuY29kaW5nLmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKXsKKwkJCWNhc2UgMDoga2V5X2lkeCA9IGllZWUtPnR4X2tleWlkeDsgYnJlYWs7CisJCQljYXNlIDE6CWtleV9pZHggPSAwOyBicmVhazsKKwkJCWNhc2UgMjoJa2V5X2lkeCA9IDE7IGJyZWFrOworCQkJY2FzZSAzOglrZXlfaWR4ID0gMjsgYnJlYWs7CisJCQljYXNlIDQ6CWtleV9pZHgJPSAzOyBicmVhazsKKwkJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisKKwkJaWYod3JxdS0+ZW5jb2RpbmcubGVuZ3RoPT0weDUpeworCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisJCQlFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihkZXYpOworCisJCQlzZXRLZXkoIGRldiwKKwkJCQlrZXlfaWR4LCAgICAgICAgICAgICAgICAvL0VudHJ5Tm8KKwkJCQlrZXlfaWR4LCAgICAgICAgICAgICAgICAvL0tleUluZGV4CisJCQkJS0VZX1RZUEVfV0VQNDAsICAgICAgICAgLy9LZXlUeXBlCisJCQkJemVyb19hZGRyW2tleV9pZHhdLAorCQkJCTAsICAgICAgICAgICAgICAgICAgICAgIC8vRGVmYXVsdEtleQorCQkJCWh3a2V5KTsgICAgICAgICAgICAgICAgIC8vS2V5Q29udGVudAorCisJCX0KKworCQllbHNlIGlmKHdycXUtPmVuY29kaW5nLmxlbmd0aD09MHhkKXsKKwkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDEwNDsKKwkJCQlFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihkZXYpOworCisJCQlzZXRLZXkoIGRldiwKKwkJCQlrZXlfaWR4LCAgICAgICAgICAgICAgICAvL0VudHJ5Tm8KKwkJCQlrZXlfaWR4LCAgICAgICAgICAgICAgICAvL0tleUluZGV4CisJCQkJS0VZX1RZUEVfV0VQMTA0LCAgICAgICAgLy9LZXlUeXBlCisJCQkJemVyb19hZGRyW2tleV9pZHhdLAorCQkJCTAsICAgICAgICAgICAgICAgICAgICAgIC8vRGVmYXVsdEtleQorCQkJCWh3a2V5KTsgICAgICAgICAgICAgICAgIC8vS2V5Q29udGVudAorCisJCX0KKwkJZWxzZSBwcmludGsoIndyb25nIHR5cGUgaW4gV0VQLCBub3QgV0VQNDAgYW5kIFdFUDEwNFxuIik7CisKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3NjYW5fdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphYSwgdW5pb24KKyBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpwKXsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgKnBhcm1zPShpbnQqKXA7CisJaW50IG1vZGU9cGFybXNbMF07CisKKwlwcml2LT5pZWVlODAyMTEtPmFjdGl2ZV9zY2FuID0gbW9kZTsKKworCXJldHVybiAxOworfQorCisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSB8fAorCSAgICB3cnF1LT5yZXRyeS5kaXNhYmxlZCl7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCEod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYod3JxdS0+cmV0cnkudmFsdWUgPiBSODE4MF9NQVhfUkVUUlkpeworCQllcnI9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXByaXYtPnJldHJ5X3J0cyA9IHdycXUtPnJldHJ5LnZhbHVlOworCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3IgUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCisJfWVsc2UgeworCQlwcml2LT5yZXRyeV9kYXRhID0gd3JxdS0+cmV0cnkudmFsdWU7CisJCURNRVNHKCJTZXR0aW5nIHJldHJ5IGZvciBub24gUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOworCX0KKworCS8qIEZJWE1FICEKKwkgKiBXZSBtaWdodCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgdGhlIFRYIGNvbmZpZyByZWdpc3RlcgorCSAqIG9yIHRvIHJlc3RhcnQganVzdCB0aGUgKFIpVFggcHJvY2Vzcy4KKwkgKiBJJ20gdW5zdXJlIGlmIHdob2xlIHJlc2V0IGlzIHJlYWxseSBuZWVkZWQKKwkgKi8KKworCXJ0bDgxOTJfY29tbWl0KGRldik7CisJLyoKKwlpZihwcml2LT51cCl7CisJCXJ0bDgxODBfcnR4X2Rpc2FibGUoZGV2KTsKKwkJcnRsODE4MF9yeF9lbmFibGUoZGV2KTsKKwkJcnRsODE4MF90eF9lbmFibGUoZGV2KTsKKworCX0KKwkqLworZXhpdDoKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworCXdycXUtPnJldHJ5LmRpc2FibGVkID0gMDsgLyogY2FuJ3QgYmUgZGlzYWJsZWQgKi8KKworCWlmICgod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9UWVBFKSA9PQorCSAgICBJV19SRVRSWV9MSUZFVElNRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9NQVgpIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJd3JxdS0+cmV0cnkudmFsdWUgPSBwcml2LT5yZXRyeV9ydHM7CisJfSBlbHNlIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01JTjsKKwkJd3JxdS0+cmV0cnkudmFsdWUgPSBwcml2LT5yZXRyeV9kYXRhOworCX0KKwkvL3ByaW50aygicmV0dXJuaW5nICVkIix3cnF1LT5yZXRyeS52YWx1ZSk7CisKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJaWYocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KKwl3cnF1LT5zZW5zLnZhbHVlID0gcHJpdi0+c2VuczsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCXNob3J0IGVyciA9IDA7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwkvL0RNRVNHKCJhdHRlbXB0IHRvIHNldCBzZW5zaXZpdHkgdG8gJWRkYiIsd3JxdS0+c2Vucy52YWx1ZSk7CisJaWYocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkgeworCQllcnI9IC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KKwkJZ290byBleGl0OworCX0KKwlpZihwcml2LT5yZl9zZXRfc2VucyhkZXYsIHdycXUtPnNlbnMudmFsdWUpID09IDApCisJCXByaXYtPnNlbnMgPSB3cnF1LT5zZW5zLnZhbHVlOworCWVsc2UKKwkJZXJyPSAtRUlOVkFMOworCitleGl0OgorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIGVycjsKK30KKworI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCisvL2h3IHNlY3VyaXR5IG5lZWQgdG8gcmVvcmdhbml6ZWQuCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9lbmNfZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ9MDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7CisJLy9wcmludGsoIj09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dChwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXsKKwkJdTggYnJvYWRjYXN0X2FkZHJbNl0gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OworCQl1OCB6ZXJvWzZdID0gezB9OworCQl1MzIga2V5WzRdID0gezB9OworCQlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJCXU4IGlkeCA9IDAsIGFsZyA9IDAsIGdyb3VwID0gMDsKKwkJaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8CisJCWV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfTk9ORSkgLy9ub25lIGlzIG5vdCBhbGxvd2VkIHRvIHVzZSBod3NlYyBXQiAyMDA4LjA3LjAxCisJCQlnb3RvIGVuZF9od19zZWM7CisKKwkJYWxnID0gIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApP0tFWV9UWVBFX0NDTVA6ZXh0LT5hbGc7IC8vIGFzIElXX0VOQ09ERV9BTEdfQ0NNUCBpcyBkZWZpbmVkIHRvIGJlIDMgYW5kIEtFWV9UWVBFX0NDTVAgaXMgZGVmaW5lZCB0byA0OworCQlpZHggPSBlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7CisJCWlmIChpZHgpCisJCQlpZHggLS07CisJCWdyb3VwID0gZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWTsKKworCQlpZiAoKCFncm91cCkgfHwgKElXX01PREVfQURIT0MgPT0gaWVlZS0+aXdfbW9kZSkgfHwgKGFsZyA9PSAgS0VZX1RZUEVfV0VQNDApKQorCQl7CisJCQlpZiAoKGV4dC0+a2V5X2xlbiA9PSAxMykgJiYgKGFsZyA9PSBLRVlfVFlQRV9XRVA0MCkgKQorCQkJCWFsZyA9IEtFWV9UWVBFX1dFUDEwNDsKKwkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gYWxnOworCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKwkJfQorCQltZW1jcHkoKHU4KilrZXksIGV4dC0+a2V5LCAxNik7IC8vd2Ugb25seSBnZXQgMTYgYnl0ZXMga2V5LndoeT8gV0IgMjAwOC43LjEKKworCQlpZiAoKGFsZyAmIEtFWV9UWVBFX1dFUDQwKSAmJiAoaWVlZS0+YXV0aF9tb2RlICE9MikgKQorCQl7CisKKwkJCXNldEtleSggZGV2LAorCQkJCQlpZHgsLy9FbnRyeU5vCisJCQkJCWlkeCwgLy9LZXlJbmRleAorCQkJCQlhbGcsICAvL0tleVR5cGUKKwkJCQkJemVybywgLy9NYWNBZGRyCisJCQkJCTAsICAgICAgICAgICAgICAvL0RlZmF1bHRLZXkKKwkJCQkJa2V5KTsgICAgICAgICAgIC8vS2V5Q29udGVudAorCQl9CisJCWVsc2UgaWYgKGdyb3VwKQorCQl7CisJCQlpZWVlLT5ncm91cF9rZXlfdHlwZSA9IGFsZzsKKwkJCXNldEtleSggZGV2LAorCQkJCQlpZHgsLy9FbnRyeU5vCisJCQkJCWlkeCwgLy9LZXlJbmRleAorCQkJCQlhbGcsICAvL0tleVR5cGUKKwkJCQkJYnJvYWRjYXN0X2FkZHIsIC8vTWFjQWRkcgorCQkJCQkwLCAgICAgICAgICAgICAgLy9EZWZhdWx0S2V5CisJCQkJCWtleSk7ICAgICAgICAgICAvL0tleUNvbnRlbnQKKwkJfQorCQllbHNlIC8vcGFpcndpc2Uga2V5CisJCXsKKwkJCXNldEtleSggZGV2LAorCQkJCQk0LC8vRW50cnlObworCQkJCQlpZHgsIC8vS2V5SW5kZXgKKwkJCQkJYWxnLCAgLy9LZXlUeXBlCisJCQkJCSh1OCopaWVlZS0+YXBfbWFjX2FkZHIsIC8vTWFjQWRkcgorCQkJCQkwLCAgICAgICAgICAgICAgLy9EZWZhdWx0S2V5CisJCQkJCWtleSk7ICAgICAgICAgICAvL0tleUNvbnRlbnQKKwkJfQorCisKKwl9CisKK2VuZF9od19zZWM6CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJCXVuaW9uIGl3cmVxX2RhdGEgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ9MDsKKwkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfYXV0aChwcml2LT5pZWVlODAyMTEsIGluZm8sICYoZGF0YS0+cGFyYW0pLCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW50IHJldD0wOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbWxtZShwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQl1bmlvbiBpd3JlcV9kYXRhICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwkgICAvL3ByaW50aygiPT09PT4lcygpLCBsZW46JWRcbiIsIF9fRlVOQ1RJT05fXywgZGF0YS0+bGVuZ3RoKTsKKwlpbnQgcmV0PTA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcmV0ID0gaWVlZTgwMjExX3d4X3NldF9nZW5faWUocHJpdi0+aWVlZTgwMjExLCBleHRyYSwgZGF0YS0+ZGF0YS5sZW5ndGgpOworCXVwKCZwcml2LT53eF9zZW0pOworCS8vcHJpbnRrKCI8PT09PT09JXMoKSwgcmV0OiVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJcmV0dXJuIHJldDsKKworCit9CisKK3N0YXRpYyBpbnQgZHVtbXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsY2hhciAqYikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGl3X2hhbmRsZXIgcjgxOTJfd3hfaGFuZGxlcnNbXSA9Cit7CisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCisJcjgxOTJfd3hfZ2V0X25hbWUsICAgCSAgLyogU0lPQ0dJV05BTUUgKi8KKwlkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdOV0lEICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLworCXI4MTkyX3d4X3NldF9mcmVxLCAgICAgICAgLyogU0lPQ1NJV0ZSRVEgKi8KKwlyODE5Ml93eF9nZXRfZnJlcSwgICAgICAgIC8qIFNJT0NHSVdGUkVRICovCisJcjgxOTJfd3hfc2V0X21vZGUsICAgICAgICAvKiBTSU9DU0lXTU9ERSAqLworCXI4MTkyX3d4X2dldF9tb2RlLCAgICAgICAgLyogU0lPQ0dJV01PREUgKi8KKwlyODE5Ml93eF9zZXRfc2VucywgICAgICAgIC8qIFNJT0NTSVdTRU5TICovCisJcjgxOTJfd3hfZ2V0X3NlbnMsICAgICAgICAvKiBTSU9DR0lXU0VOUyAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCisJcnRsODE4MF93eF9nZXRfcmFuZ2UsCSAgLyogU0lPQ0dJV1JBTkdFICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1BSSVYgKi8KKwlOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTVEFUUyAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NUQVRTICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1BZICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DV0lXVEhSU1BZICovCisJcjgxOTJfd3hfc2V0X3dhcCwgICAgICAJICAvKiBTSU9DU0lXQVAgKi8KKwlyODE5Ml93eF9nZXRfd2FwLCAgICAgICAgIC8qIFNJT0NHSVdBUCAqLworI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCisJcjgxOTJfd3hfc2V0X21sbWUsICAgICAgICAgICAgICAgICAgICAgLyogTUxNRS0tICovCisjZWxzZQorCSBOVUxMLAorI2VuZGlmCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQTElTVCAtLSBkZXByaWNhdGVkICovCisJcjgxOTJfd3hfc2V0X3NjYW4sICAgICAgICAvKiBTSU9DU0lXU0NBTiAqLworCXI4MTkyX3d4X2dldF9zY2FuLCAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KKwlyODE5Ml93eF9zZXRfZXNzaWQsICAgICAgIC8qIFNJT0NTSVdFU1NJRCAqLworCXI4MTkyX3d4X2dldF9lc3NpZCwgICAgICAgLyogU0lPQ0dJV0VTU0lEICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTklDS04gKi8KKwlkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworCU5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworCXI4MTkyX3d4X3NldF9yYXRlLCAgICAgICAgLyogU0lPQ1NJV1JBVEUgKi8KKwlyODE5Ml93eF9nZXRfcmF0ZSwgICAgICAgIC8qIFNJT0NHSVdSQVRFICovCisJcjgxOTJfd3hfc2V0X3J0cywgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KKwlyODE5Ml93eF9nZXRfcnRzLCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JUUyAqLworCXI4MTkyX3d4X3NldF9mcmFnLCAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKwlyODE5Ml93eF9nZXRfZnJhZywgICAgICAgIC8qIFNJT0NHSVdGUkFHICovCisJZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVFhQT1cgKi8KKwlkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworCXI4MTkyX3d4X3NldF9yZXRyeSwgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCisJcjgxOTJfd3hfZ2V0X3JldHJ5LCAgICAgICAvKiBTSU9DR0lXUkVUUlkgKi8KKwlyODE5Ml93eF9zZXRfZW5jLCAgICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKwlyODE5Ml93eF9nZXRfZW5jLCAgICAgICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KKwlyODE5Ml93eF9zZXRfcG93ZXIsICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE9XRVIgKi8KKwlyODE5Ml93eF9nZXRfcG93ZXIsICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXUE9XRVIgKi8KKwlOVUxMLAkJCS8qLS0taG9sZS0tLSovCisJTlVMTCwgCQkJLyotLS1ob2xlLS0tKi8KKwlyODE5Ml93eF9zZXRfZ2VuX2llLC8vTlVMTCwgCQkJLyogU0lPQ1NJV0dFTklFICovCisJTlVMTCwgCQkJLyogU0lPQ1NJV0dFTklFICovCisKKyNpZiAoV0lSRUxFU1NfRVhUID49IDE4KQorCXI4MTkyX3d4X3NldF9hdXRoLC8vTlVMTCwgCQkJLyogU0lPQ1NJV0FVVEggKi8KKwlOVUxMLC8vcjgxOTJfd3hfZ2V0X2F1dGgsLy9OVUxMLCAJCQkvKiBTSU9DU0lXQVVUSCAqLworCXI4MTkyX3d4X3NldF9lbmNfZXh0LCAJCQkvKiBTSU9DU0lXRU5DT0RFRVhUICovCisJTlVMTCwvL3I4MTkyX3d4X2dldF9lbmNfZXh0LC8vTlVMTCwgCQkJLyogU0lPQ1NJV0VOQ09ERUVYVCAqLworI2Vsc2UKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorI2VuZGlmCisJTlVMTCwgCQkJLyogU0lPQ1NJV1BNS1NBICovCisJTlVMTCwgCQkJIC8qLS0taG9sZS0tLSovCisKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgcjgxOTJfcHJpdmF0ZV9hcmdzW10gPSB7CisKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJiYWRjcmMiCisJfSwKKworCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImFjdGl2ZXNjYW4iCisKKwl9LAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgyLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInJhd3R4IgorCX0KKyNpZmRlZiBKT0hOX0lPQ1RMCisJLAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgzLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInJlYWRSRiIKKwl9CisJLAorCXsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHg0LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgIndyaXRlUkYiCisJfQorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJyZWFkQkIiCisJfQorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NiwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJ3cml0ZUJCIgorCX0KKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDcsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicmVhZG5pY2IiCisJfQorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4OCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJ3cml0ZW5pY2IiCisJfQorCSwKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4OSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJhcGluZm8iCisJfQorCisjZW5kaWYKKwksCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDMsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZm9yY2VyZXNldCIKKworCX0KKworfTsKKworCitzdGF0aWMgaXdfaGFuZGxlciByODE5Ml9wcml2YXRlX2hhbmRsZXJbXSA9IHsKKy8vCXI4MTkyX3d4X3NldF9tb25pdG9yLCAgLyogU0lPQ0lXRklSU1RQUklWICovCisJcjgxOTJfd3hfc2V0X2NyY21vbiwgICAvKlNJT0NJV1NFQ09ORFBSSVYqLworLy8JcjgxOTJfd3hfc2V0X2ZvcmNlYXNzb2NpYXRlLAorLy8JcjgxOTJfd3hfc2V0X2JlYWNvbmludGVydmFsLAorLy8JcjgxOTJfd3hfc2V0X21vbml0b3JfdHlwZSwKKwlyODE5Ml93eF9zZXRfc2Nhbl90eXBlLAorCXI4MTkyX3d4X3NldF9yYXd0eCwKKyNpZmRlZiBKT0hOX0lPQ1RMCisJcjgxOTJfd3hfcmVhZF9yZWdzLAorCXI4MTkyX3d4X3dyaXRlX3JlZ3MsCisJcjgxOTJfd3hfcmVhZF9iYiwKKwlyODE5Ml93eF93cml0ZV9iYiwKKwlyODE5Ml93eF9yZWFkX25pY2IsCisJcjgxOTJfd3hfd3JpdGVfbmljYiwKKwlyODE5Ml93eF9nZXRfYXBfc3RhdHVzLAorI2VuZGlmCisJLy9yODE5Ml93eF9udWxsLAorCXI4MTkyX3d4X2ZvcmNlX3Jlc2V0LAorfTsKKworLy8jaWYgV0lSRUxFU1NfRVhUID49IDE3CitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOworCXN0cnVjdCBpd19zdGF0aXN0aWNzKiB3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCWludCB0bXBfbGV2ZWwgPSAwOworCWludCB0bXBfcXVhbCA9IDA7CisJaW50IHRtcF9ub2lzZSA9IDA7CisJaWYoaWVlZS0+c3RhdGUgPCBJRUVFODAyMTFfTElOS0VEKQorCXsKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSAwOworCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSAwOworCQl3c3RhdHMtPnF1YWwubm9pc2UgPSAwOworCQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKKwkJcmV0dXJuIHdzdGF0czsKKwl9CisKKyAgICAgICB0bXBfbGV2ZWwgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLnJzc2k7CisJdG1wX3F1YWwgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLnNpZ25hbDsKKwl0bXBfbm9pc2UgPSAoJmllZWUtPmN1cnJlbnRfbmV0d29yayktPnN0YXRzLm5vaXNlOworCS8vcHJpbnRrKCJsZXZlbDolZCwgcXVhbDolZCwgbm9pc2U6JWRcbiIsIHRtcF9sZXZlbCwgdG1wX3F1YWwsIHRtcF9ub2lzZSk7CisKKwl3c3RhdHMtPnF1YWwubGV2ZWwgPSB0bXBfbGV2ZWw7CisJd3N0YXRzLT5xdWFsLnF1YWwgPSB0bXBfcXVhbDsKKwl3c3RhdHMtPnF1YWwubm9pc2UgPSB0bXBfbm9pc2U7CisJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEfCBJV19RVUFMX0RCTTsKKwlyZXR1cm4gd3N0YXRzOworfQorLy8jZW5kaWYKKworCitzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgIHI4MTkyX3d4X2hhbmRsZXJzX2RlZj17CisJLnN0YW5kYXJkID0gcjgxOTJfd3hfaGFuZGxlcnMsCisJLm51bV9zdGFuZGFyZCA9IHNpemVvZihyODE5Ml93eF9oYW5kbGVycykgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnByaXZhdGUgPSByODE5Ml9wcml2YXRlX2hhbmRsZXIsCisJLm51bV9wcml2YXRlID0gc2l6ZW9mKHI4MTkyX3ByaXZhdGVfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YocjgxOTJfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKyNpZiBXSVJFTEVTU19FWFQgPj0gMTcKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzLAorI2VuZGlmCisJLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopcjgxOTJfcHJpdmF0ZV9hcmdzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY3YTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisJVGhpcyBpcyBwYXJ0IG9mIHJ0bDgxODAgT3BlblNvdXJjZSBkcml2ZXIgLSB2IDAuMworCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisKKwlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgorCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uCisJUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCisKKwlXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHN1Y2ggcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlciBwcm9qZWN0IEF1dGhvcnMuCisqLworCisvKiB0aGlzIGZpbGUgKHdpbGwpIGNvbnRhaW5zIHdpcmVsZXNzIGV4dGVuc2lvbiBoYW5kbGVycyovCisKKyNpZm5kZWYgUjgxODBfV1hfSAorI2RlZmluZSBSODE4MF9XWF9ICisvLyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorLy8jaW5jbHVkZSAiaWVlZTgwMjExLmgiCitleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIHI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKKy8qIEVuYWJsZSAgdGhlIHJ0bDgxOXhfY29yZS5jIHRvIHNoYXJlIHRoaXMgZnVuY3Rpb24sIGRhdmlkIDIwMDguOS4yMiAqLworZXh0ZXJuIHN0cnVjdCBpd19zdGF0aXN0aWNzICpyODE5Ml9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVEdlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2I2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX0hUR2VuLmgKQEAgLTAsMCArMSwxMyBAQAorLy8KKy8vIElPVCBBY3Rpb24gZm9yIGRpZmZlcmVudCBBUAorLy8KK3R5cGVkZWYgZW51bSBfSFRfSU9UX0FDVElPTnsKKwlIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV80SyA9IDB4MDAwMDAwMDEsCisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfOEsgPSAweDAwMDAwMDAyLAorCUhUX0lPVF9BQ1RfREVDTEFSRV9NQ1MxMyA9IDB4MDAwMDAwMDQsCisJSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8gPSAweDAwMDAwMDA4LAorCUhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNID0gMHgwMDAwMDAxMCwKKwlIVF9JT1RfQUNUX0NERF9GU1lOQyA9IDB4MDAwMDAwMjAsCisJSFRfSU9UX0FDVF9QVVJFX05fTU9ERSA9IDB4MDAwMDAwNDAsCit9SFRfSU9UX0FDVElPTl9FLCAqUEhUX0lPVF9BQ1RJT05fRTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9IVFR5cGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNThiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfSFRUeXBlLmgKQEAgLTAsMCArMSwzOTEgQEAKKyNpZm5kZWYgX1I4MTlYVV9IVFRZUEVfSF8KKyNkZWZpbmUgX1I4MTlYVV9IVFRZUEVfSF8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIEhUIENhcGFiaWxpdHkgZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMsIGFzc29jaWF0aW9uIHJlcXVlc3QsCisvLwlyZWFzc29jaWF0aW9uIHJlcXVlc3QgYW5kIHByb2JlIHJlc3BvbnNlIGZyYW1lcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIE9wZXJhdGlvbiBtb2RlIHZhbHVlCisvLworI2RlZmluZSBIVF9PUE1PREVfTk9fUFJPVEVDVAkJMAorI2RlZmluZSBIVF9PUE1PREVfT1BUSU9OQUwJCTEKKyNkZWZpbmUgSFRfT1BNT0RFXzQwTUhaX1BST1RFQ1QJMgorI2RlZmluZSBIVF9PUE1PREVfTUlYRUQJCQkzCisKKy8vCisvLyBNSU1PIFBvd2VyIFNhdmUgU2V0aW5ncworLy8KKyNkZWZpbmUgTUlNT19QU19TVEFUSUMJCQkJMAorI2RlZmluZSBNSU1PX1BTX0RZTkFNSUMJCQkxCisjZGVmaW5lIE1JTU9fUFNfTk9MSU1JVAkJCTMKKworCisvLworLy8JVGhlcmUgc2hvdWxkIGJlIDEyOCBiaXRzIHRvIGNvdmVyIGFsbCBvZiB0aGUgTUNTIHJhdGVzLiBIb3dldmVyLCBzaW5jZQorLy8JODE5MCBkb2VzIG5vdCBzdXBwb3J0IHRvbyBtdWNoIHJhdGVzLCBvbmUgaW50ZWdlciBpcyBxdWl0ZSBlbm91Z2guCisvLworCisjZGVmaW5lIHNIVENMbmcJNAorCisKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfQklUTUFQCQkJCQkweDAwMDAwMGZmCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMlNTX0JJVE1BUAkJCQkJMHgwMDAwZmYwMAorI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzFTU18yU1NfQklUTUFQCQkJSFRfTUNTXzFTU19CSVRNQVB8SFRfTUNTXzFTU18yU1NfQklUTUFQCisKKwordHlwZWRlZiBlbnVtIF9IVF9NQ1NfUkFURXsKKwlIVF9NQ1MwICAgPSAweDAwMDAwMDAxLAorCUhUX01DUzEgICA9IDB4MDAwMDAwMDIsCisJSFRfTUNTMiAgID0gMHgwMDAwMDAwNCwKKwlIVF9NQ1MzICAgPSAweDAwMDAwMDA4LAorCUhUX01DUzQgICA9IDB4MDAwMDAwMTAsCisJSFRfTUNTNSAgID0gMHgwMDAwMDAyMCwKKwlIVF9NQ1M2ICAgPSAweDAwMDAwMDQwLAorCUhUX01DUzcgICA9IDB4MDAwMDAwODAsCisJSFRfTUNTOCAgID0gMHgwMDAwMDEwMCwKKwlIVF9NQ1M5ICAgPSAweDAwMDAwMjAwLAorCUhUX01DUzEwID0gMHgwMDAwMDQwMCwKKwlIVF9NQ1MxMSA9IDB4MDAwMDA4MDAsCisJSFRfTUNTMTIgPSAweDAwMDAxMDAwLAorCUhUX01DUzEzID0gMHgwMDAwMjAwMCwKKwlIVF9NQ1MxNCA9IDB4MDAwMDQwMDAsCisJSFRfTUNTMTUgPSAweDAwMDA4MDAwLAorCS8vIERvIG5vdCBkZWZpbmUgTUNTMzIgaGVyZSBhbHRob3VnaCA4MTkwIHN1cHBvcnQgTUNTMzIKK31IVF9NQ1NfUkFURSwqUEhUX01DU19SQVRFOworCisvLworLy8gUmVwcmVzZW50IENoYW5uZWwgV2lkdGggaW4gSFQgQ2FwYWJpbGl0aWVzCisvLwordHlwZWRlZiBlbnVtIF9IVF9DSEFOTkVMX1dJRFRIeworCUhUX0NIQU5ORUxfV0lEVEhfMjAgPSAwLAorCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgPSAxLAorfUhUX0NIQU5ORUxfV0lEVEgsICpQSFRfQ0hBTk5FTF9XSURUSDsKKworLy8KKy8vIFJlcHJlc2VudCBFeHRlbnRpb24gQ2hhbm5lbCBPZmZzZXQgaW4gSFQgQ2FwYWJpbGl0aWVzCisvLyBUaGlzIGlzIGF2YWlsYWJsZSBvbmx5IGluIDQwTWh6IG1vZGUuCisvLwordHlwZWRlZiBlbnVtIF9IVF9FWFRDSE5MX09GRlNFVHsKKwlIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQgPSAwLAorCUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSID0gMSwKKwlIVF9FWFRDSE5MX09GRlNFVF9OT19ERUYgPSAyLAorCUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSID0gMywKK31IVF9FWFRDSE5MX09GRlNFVCwgKlBIVF9FWFRDSE5MX09GRlNFVDsKKwordHlwZWRlZiBlbnVtIF9DSE5MT1B7CisJQ0hOTE9QX05PTkUgPSAwLCAvLyBObyBBY3Rpb24gbm93CisJQ0hOTE9QX1NDQU4gPSAxLCAvLyBTY2FuIGluIHByb2dyZXNzCisJQ0hOTE9QX1NXQlcgPSAyLCAvLyBCYW5kd2lkdGggc3dpdGNoaW5nIGluIHByb2dyZXNzCisJQ0hOTE9QX1NXQ0hOTCA9IDMsIC8vIFNvZnR3YXJlIENoYW5uZWwgc3dpdGNoaW5nIGluIHByb2dyZXNzCit9IENITkxPUCwgKlBDSE5MT1A7CisKKy8vIERldGVybWluZSBpZiB0aGUgQ2hhbm5lbCBPcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MKKyNkZWZpbmUgQ0hITE9QX0lOX1BST0dSRVNTKF9wSFRJbmZvKQlcCisJCSgoX3BIVEluZm8pLT5DaG5sT3AgPiBDSE5MT1BfTk9ORSkgPyBUUlVFIDogRkFMU0UKKworCit0eXBlZGVmIGVudW0gX0hUX0FDVElPTnsKKwlBQ1RfUkVDT01NQU5EX1dJRFRICQk9IDAsCisJQUNUX01JTU9fUFdSX1NBVkUgCQk9IDEsCisJQUNUX1BTTVAJCQkJCT0gMiwKKwlBQ1RfU0VUX1BDT19QSEFTRQkJPSAzLAorCUFDVF9NSU1PX0NITF9NRUFTVVJFCT0gNCwKKwlBQ1RfUkVDSVBST0NJVFlfQ09SUkVDVAk9IDUsCisJQUNUX01JTU9fQ1NJX01BVFJJQ1MJCT0gNiwKKwlBQ1RfTUlNT19OT0NPTVBSX1NURUVSCT0gNywKKwlBQ1RfTUlNT19DT01QUl9TVEVFUgkJPSA4LAorCUFDVF9BTlRFTk5BX1NFTEVDVAkJPSA5LAorfSBIVF9BQ1RJT04sICpQSFRfQUNUSU9OOworCisKKy8qIDIwMDcvMDYvMDcgTUggRGVmaW5lIHN1Yi1jYXJyaWVyIG1vZGUgZm9yIDQwTUhaLiAqLwordHlwZWRlZiBlbnVtIF9IVF9CYW5kd2lkdGhfNDBNSFpfU3ViX0NhcnJpZXJ7CisJU0NfTU9ERV9EVVBMSUNBVEUgPSAwLAorCVNDX01PREVfTE9XRVIgPSAxLAorCVNDX01PREVfVVBQRVIgPSAyLAorCVNDX01PREVfRlVMTDQwTUhaID0gMywKK31IVF9CVzQwX1NDX0U7CisKK3R5cGVkZWYJc3RydWN0IF9IVF9DQVBBQklMSVRZX0VMRXsKKworCS8vSFQgY2FwYWJpbGl0eSBpbmZvCisJdTgJQWR2Q29kaW5nOjE7CisJdTgJQ2hsV2lkdGg6MTsKKwl1OAlNaW1vUHdyU2F2ZToyOworCXU4CUdyZWVuRmllbGQ6MTsKKwl1OAlTaG9ydEdJMjBNaHo6MTsKKwl1OAlTaG9ydEdJNDBNaHo6MTsKKwl1OAlUeFNUQkM6MTsKKwl1OAlSeFNUQkM6MjsKKwl1OAlEZWxheUJBOjE7CisJdTgJTWF4QU1TRFVTaXplOjE7CisJdTgJRHNzQ0NrOjE7CisJdTgJUFNNUDoxOworCXU4CVJzdmQxOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0OjE7CisKKwkvL01BQyBIVCBwYXJhbWV0ZXJzIGluZm8KKwl1OAlNYXhSeEFNUERVRmFjdG9yOjI7CisJdTgJTVBEVURlbnNpdHk6MzsKKwl1OAlSc3ZkMjozOworCisJLy9TdXBwb3J0ZWQgTUNTIHNldAorCXU4CU1DU1sxNl07CisKKworCS8vRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCisJdTE2CUV4dEhUQ2FwSW5mbzsKKworCS8vVFhCRiBDYXBhYmlsaXRpZXMKKwl1OAlUeEJGQ2FwWzRdOworCisJLy9BbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMKKwl1OAlBU0NhcDsKKworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpIEhUX0NBUEFCSUxJVFlfRUxFLCAqUEhUX0NBUEFCSUxJVFlfRUxFOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhlIEhUIEluZm9ybWF0aW9uIGVsZW1lbnQgaXMgcHJlc2VudCBpbiBiZWFjb25zCisvLyBPbmx5IEFQIGlzIHJlcXVpcmVkIHRvIGluY2x1ZGUgdGhpcyBlbGVtZW50CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfSFRfSU5GT1JNQVRJT05fRUxFeworCXU4CUNvbnRyb2xDaGw7CisKKwl1OAlFeHRDaGxPZmZzZXQ6MjsKKwl1OAlSZWNvbW1lbWRlZFR4V2lkdGg6MTsKKwl1OAlSSUZTOjE7CisJdTgJUFNNUEFjY2Vzc09ubHk6MTsKKwl1OAlTcnZJbnRHcmFudWxhcml0eTozOworCisJdTgJT3B0TW9kZToyOworCXU4CU5vbkdGRGV2UHJlc2VudDoxOworCXU4CVJldmQxOjU7CisJdTgJUmV2ZDI6ODsKKworCXU4CVJzdmQzOjY7CisJdTgJRHVhbEJlYWNvbjoxOworCXU4CUR1YWxDVFNQcm90ZWN0OjE7CisKKwl1OAlTZWNvbmRhcnlCZWFjb246MTsKKwl1OAlMU2lnVHhvcFByb3RlY3RGdWxsOjE7CisJdTgJUGNvQWN0aXZlOjE7CisJdTgJUGNvUGhhc2U6MTsKKwl1OAlSc3ZkNDo0OworCisJdTgJQmFzaWNNU0NbMTZdOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpIEhUX0lORk9STUFUSU9OX0VMRSwgKlBIVF9JTkZPUk1BVElPTl9FTEU7CisKKy8vCisvLyBNSU1PIFBvd2VyIFNhdmUgY29udHJvbCBmaWVsZC4KKy8vIFRoaXMgaXMgYXBwZWFyIGluIE1JTU8gUG93ZXIgU2F2ZSBBY3Rpb24gRnJhbWUKKy8vCit0eXBlZGVmIHN0cnVjdCBfTUlNT1BTX0NUUkx7CisJdTgJTWltb1BzRW5hYmxlOjE7CisJdTgJTWltb1BzTW9kZToxOworCXU4CVJlc2VydmVkOjY7Cit9IE1JTU9QU19DVFJMLCAqUE1JTU9QU19DVFJMOworCit0eXBlZGVmIGVudW0gX0hUX1NQRUNfVkVSeworCUhUX1NQRUNfVkVSX0lFRUUgPSAwLAorCUhUX1NQRUNfVkVSX0VXQyA9IDEsCit9SFRfU1BFQ19WRVIsICpQSFRfU1BFQ19WRVI7CisKK3R5cGVkZWYgZW51bSBfSFRfQUdHUkVfTU9ERV9FeworCUhUX0FHR19BVVRPID0gMCwKKwlIVF9BR0dfRk9SQ0VfRU5BQkxFID0gMSwKKwlIVF9BR0dfRk9SQ0VfRElTQUJMRSA9IDIsCit9SFRfQUdHUkVfTU9ERV9FLCAqUEhUX0FHR1JFX01PREVfRTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGVzIHdoZW4gY2FyZCBpcworLy8gIGNvbmZpZ3VyZWQgYXMgbm9uLUFQIFNUQSBtb2RlLiAgKipOb3RlKiogIEN1cnJlbnRfeHh4IHNob3VsZCBiZSBzZXQKKy8vCXRvIGRlZmF1bHQgdmFsdWUgaW4gSFRJbml0aWFsaXplSFRJbmZvKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9SVF9ISUdIX1RIUk9VR0hQVVR7CisvLwlERUNMQVJFX1JUX09CSkVDVChfUlRfSElHSF9USFJPVUdIUFVUKTsKKwl1OAkJCQliRW5hYmxlSFQ7CisJdTgJCQkJYkN1cnJlbnRIVFN1cHBvcnQ7CisKKwl1OAkJCQliUmVnQlc0ME1IejsJCQkJLy8gVHggNDBNSHogY2hhbm5lbCBjYXBhYmxpdHkKKwl1OAkJCQliQ3VyQlc0ME1IejsJCQkJLy8gVHggNDBNSHogY2hhbm5lbCBjYXBhYmlsaXR5CisKKwl1OAkJCQliUmVnU2hvcnRHSTQwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciA0ME1oegorCXU4CQkJCWJDdXJTaG9ydEdJNDBNSHo7CQkJLy8gVHggU2hvcnQgR0kgZm9yIDQwTUh6CisKKwl1OAkJCQliUmVnU2hvcnRHSTIwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciAyME1IegorCXU4CQkJCWJDdXJTaG9ydEdJMjBNSHo7CQkJLy8gVHggU2hvcnQgR0kgZm9yIDIwTUh6CisKKwl1OAkJCQliUmVnU3VwcENDSzsJCQkJLy8gVHggQ0NLIHJhdGUgY2FwYWJpbGl0eQorCXU4CQkJCWJDdXJTdXBwQ0NLOwkJCQkvLyBUeCBDQ0sgcmF0ZSBjYXBhYmlsaXR5CisKKwkvLyA4MDIuMTFuIHNwZWMgdmVyc2lvbiBmb3IgInBlZXIiCisJSFRfU1BFQ19WRVIJCQllUGVlckhUU3BlY1ZlcjsKKworCisJLy8gSFQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgIlNlbGYiCisJSFRfQ0FQQUJJTElUWV9FTEUJU2VsZkhUQ2FwOwkJCQkJLy8gVGhpcyBpcyBIVCBjYXAgZWxlbWVudCBzZW50IHRvIHBlZXIgU1RBLCB3aGljaCBhbHNvIGluZGljYXRlIEhUIFJ4IGNhcGFiaWxpdGllcy4KKwlIVF9JTkZPUk1BVElPTl9FTEUJU2VsZkhUSW5mbzsJCQkJCS8vIFRoaXMgaXMgSFQgaW5mbyBlbGVtZW50IHNlbnQgdG8gcGVlciBTVEEsIHdoaWNoIGFsc28gaW5kaWNhdGUgSFQgUnggY2FwYWJpbGl0aWVzLgorCisJLy8gSFQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgIlBlZXIiCisJdTgJCQkJUGVlckhUQ2FwQnVmWzMyXTsKKwl1OAkJCQlQZWVySFRJbmZvQnVmWzMyXTsKKworCisJLy8gQS1NU0RVIHJlbGF0ZWQKKwl1OAkJCQliQU1TRFVfU3VwcG9ydDsJCQkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCXUxNgkJCQluQU1TRFVfTWF4U2l6ZTsJCQkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQorCXU4CQkJCWJDdXJyZW50X0FNU0RVX1N1cHBvcnQ7CS8vIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5CisJdTE2CQkJCW5DdXJyZW50X0FNU0RVX01heFNpemU7CS8vIFRoaXMgaW5kaWNhdGVzIFR4IEEtTVNEVSBjYXBhYmlsaXR5CisKKworCS8vIEFNUERVICByZWxhdGVkIDwyMDA2LjA4LjEwIEVtaWx5PgorCXU4CQkJCWJBTVBEVUVuYWJsZTsJCQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCWJDdXJyZW50QU1QRFVFbmFibGU7CQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJQU1QRFVfRmFjdG9yOwkJCQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisJdTgJCQkJQ3VycmVudEFNUERVRmFjdG9yOwkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCU1QRFVfRGVuc2l0eTsJCQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQorCXU4CQkJCUN1cnJlbnRNUERVRGVuc2l0eTsJCQkvLyBUaGlzIGluZGljYXRlIFR4IEEtTVBEVSBjYXBhYmlsaXR5CisKKwkvLyBGb3JjZWQgQS1NUERVIGVuYWJsZQorCUhUX0FHR1JFX01PREVfRQlGb3JjZWRBTVBEVU1vZGU7CisJdTgJCQkJRm9yY2VkQU1QRFVGYWN0b3I7CisJdTgJCQkJRm9yY2VkTVBEVURlbnNpdHk7CisKKwkvLyBGb3JjZWQgQS1NU0RVIGVuYWJsZQorCUhUX0FHR1JFX01PREVfRQlGb3JjZWRBTVNEVU1vZGU7CisJdTE2CQkJCUZvcmNlZEFNU0RVTWF4U2l6ZTsKKworCXU4CQkJCWJGb3JjZWRTaG9ydEdJOworCisJdTgJCQkJQ3VycmVudE9wTW9kZTsKKworCS8vIE1JTU8gUFMgcmVsYXRlZAorCXU4CQkJCVNlbGZNaW1vUHM7CisJdTgJCQkJUGVlck1pbW9QczsKKworCS8vIDQwTUh6IENoYW5uZWwgT2Zmc2V0IHNldHRpbmdzLgorCUhUX0VYVENITkxfT0ZGU0VUCUN1clNUQUV4dENobmxPZmZzZXQ7CisJdTgJCQkJYkN1clR4Qlc0ME1IejsJLy8gSWYgd2UgdXNlIDQwIE1IeiB0byBUeAorCXU4CQkJCVBlZXJCYW5kd2lkdGg7CisKKwkvLyBGb3IgQmFuZHdpZHRoIFN3aXRjaGluZworCXU4CQkJCWJTd0J3SW5Qcm9ncmVzczsKKwlDSE5MT1AJCQkJQ2hubE9wOyAvLyBzb2Z0d2FyZSBzd2l0Y2hpbmcgY2hhbm5lbCBpbiBwcm9ncmVzcy4gQnkgQnJ1Y2UsIDIwMDgtMDItMTUuCisJdTgJCQkJU3dCd1N0ZXA7CisJLy9SVF9USU1FUgkJCVN3QndUaW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJU3dCd1RpbWVyOworCisJLy8gRm9yIFJlYWx0ZWsgcHJvcHJpZXRhcnkgQS1NUERVIGZhY3RvciBmb3IgYWdncmVnYXRpb24KKwl1OAkJCQliUmVnUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQliQ3VycmVudFJUMlJUQWdncmVnYXRpb247CisJdTgJCQkJYkN1cnJlbnRSVDJSVExvbmdTbG90VGltZTsKKwl1OAkJCQlzelJUMlJUQWdnQnVmZmVyWzEwXTsKKworCS8vIFJ4IFJlb3JkZXIgY29udHJvbAorCXU4CQkJCWJSZWdSeFJlb3JkZXJFbmFibGU7CisJdTgJCQkJYkN1clJ4UmVvcmRlckVuYWJsZTsKKwl1OAkJCQlSeFJlb3JkZXJXaW5TaXplOworCXU4CQkJCVJ4UmVvcmRlclBlbmRpbmdUaW1lOworCXUxNgkJCQlSeFJlb3JkZXJEcm9wQ291bnRlcjsKKworI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCisJdTgJCQkJVXNiVHhBZ2dyTnVtOworI2VuZGlmCisjaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKKwl1OAkJCQlVc2JSeEZ3QWdnckVuOworCXU4CQkJCVVzYlJ4RndBZ2dyUGFnZU51bTsKKwl1OAkJCQlVc2JSeEZ3QWdnclBhY2tldE51bTsKKwl1OAkJCQlVc2JSeEZ3QWdnclRpbWVvdXQ7CisjZW5kaWYKKworCS8vIEFkZCBmb3IgQnJvYWRjb20oTGlua3N5cykgSU9ULiBKb3NlcGgKKwl1OAkJCQliSXNQZWVyQmNtOworCisJLy8gRm9yIElPVCBpc3N1ZS4KKwl1MzIJCQkJCUlPVEFjdGlvbjsKK31SVF9ISUdIX1RIUk9VR0hQVVQsICpQUlRfSElHSF9USFJPVUdIUFVUOworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIFN0YSIKKy8vIHdoZW4gY2FyZCBpcyBjb25maWd1cmVkIGFzICJBUCBtb2RlIgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX1JUX0hUSU5GT19TVEFfRU5UUll7CisJdTgJCQliRW5hYmxlSFQ7CisKKwl1OAkJCWJTdXBwb3J0Q2NrOworCisJdTE2CQkJQU1TRFVfTWF4U2l6ZTsKKworCXU4CQkJQU1QRFVfRmFjdG9yOworCXU4CQkJTVBEVV9EZW5zaXR5OworCisJdTgJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwl1OAkJCWJCdzQwTUh6OworCisJdTgJCQlNaW1vUHM7CisKKwl1OAkJCU1jc1JhdGVTZXRbMTZdOworCisKK31SVF9IVElORk9fU1RBX0VOVFJZLCAqUFJUX0hUSU5GT19TVEFfRU5UUlk7CisKKworCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSBEYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgSFQgcmVsYXRlZCB2YXJpYWJsZSBmb3IgImVhY2ggQVAiCisvLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiU1RBIG1vZGUiCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfQlNTX0hUeworCisJdTgJCQkJYmRTdXBwb3J0SFQ7CisKKwkvLyBIVCByZWxhdGVkIGVsZW1lbnRzCisJdTgJCQkJCWJkSFRDYXBCdWZbMzJdOworCXUxNgkJCQkJYmRIVENhcExlbjsKKwl1OAkJCQkJYmRIVEluZm9CdWZbMzJdOworCXUxNgkJCQkJYmRIVEluZm9MZW47CisKKwlIVF9TUEVDX1ZFUgkJCQliZEhUU3BlY1ZlcjsKKwkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKKwkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7CisKKwl1OAkJCQkJYmRSVDJSVEFnZ3JlZ2F0aW9uOworCXU4CQkJCQliZFJUMlJUTG9uZ1Nsb3RUaW1lOworfUJTU19IVCwgKlBCU1NfSFQ7CisKK3R5cGVkZWYgc3RydWN0IF9NSU1PX1JTU0l7CisJdTMyCUVuYWJsZUFudGVubmE7CisJdTMyCUFudGVubmFBOworCXUzMiAJQW50ZW5uYUI7CisJdTMyIAlBbnRlbm5hQzsKKwl1MzIgCUFudGVubmFEOworCXUzMglBdmVyYWdlOworfU1JTU9fUlNTSSwgKlBNSU1PX1JTU0k7CisKK3R5cGVkZWYgc3RydWN0IF9NSU1PX0VWTXsKKwl1MzIJRVZNMTsKKwl1MzIgICAgRVZNMjsKK31NSU1PX0VWTSwgKlBNSU1PX0VWTTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZBTFNFX0FMQVJNX1NUQVRJU1RJQ1N7CisJdTMyCUNudF9QYXJpdHlfRmFpbDsKKwl1MzIgICAgQ250X1JhdGVfSWxsZWdhbDsKKwl1MzIJQ250X0NyYzhfZmFpbDsKKwl1MzIJQ250X2FsbDsKK31GQUxTRV9BTEFSTV9TVEFUSVNUSUNTLCAqUEZBTFNFX0FMQVJNX1NUQVRJU1RJQ1M7CisKKworCisjZW5kaWYgLy9fX0lOQ19IVFRZUEVfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE5YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9jbWRwa3QuYwpAQCAtMCwwICsxLDc5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIChjKSBDb3B5cmlnaHQgMjAwOCwgUmVhbFRFSyBUZWNobm9sb2dpZXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgTW9kdWxlOglyODE5eHVzYl9jbWRwa3QuYwkoUlRMODE5MCBUWC9SWCBjb21tYW5kIHBhY2tldCBoYW5kbGVyIFNvdXJjZSBDIEZpbGUpCisKKyBOb3RlOiAgICAgIFRoZSBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIFRYIGFuZCBSWCBjb21tYW5kIHBhY2tldC4KKwkJCTEuIFRYIDogU2VuZCBzZXQgYW5kIHF1ZXJ5IGNvbmZpZ3VyYXRpb24gY29tbWFuZCBwYWNrZXQuCisJCQkyLiBSWCA6IFJlY2VpdmUgdHggZmVlZGJhY2ssIGJlYWNvbiBzdGF0ZSwgcXVlcnkgY29uZmlndXJhdGlvbgorCQkJCWNvbW1hbmQgcGFja2V0LgorCisgRnVuY3Rpb246CisKKyBFeHBvcnQ6CisKKyBBYmJyZXY6CisKKyBIaXN0b3J5OgorCURhdGEJCVdobwkJUmVtYXJrCisKKwkwNS8wNi8yMDA4ICBhbXkgICAgCUNyZWF0ZSBpbml0aWFsIHZlcnNpb24gcG9ydGluZyBmcm9tIHdpbmRvd3MgZHJpdmVyLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOXhVX2NtZHBrdC5oIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVidWcgY29uc3RhbnQqLworI2RlZmluZQkJQ01QS19ERUJPVU5DRV9DTlQJCQkxCisvKiAyMDA3LzEwLzI0IE1IIEFkZCBmb3IgcHJpbnRpbmcgYSByYW5nZSBvZiBkYXRhLiAqLworI2RlZmluZQkJQ01QS19QUklOVChBZGRyZXNzKVwKK3tcCisJdW5zaWduZWQgY2hhcglpO1wKKwl1MzIJdGVtcFsxMF07XAorCVwKKwltZW1jcHkodGVtcCwgQWRkcmVzcywgNDApO1wKKwlmb3IgKGkgPSAwOyBpIDw0MDsgaSs9NClcCisJCXByaW50aygiXHJcbiAlMDh4IiwgdGVtcFtpXSk7XAorfVwKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9ucy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3J0X3N0YXR1cworU2VuZFR4Q29tbWFuZFBhY2tldCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXZvaWQqIAkJCXBEYXRhLAorCXUzMgkJCQlEYXRhTGVuCisJKQoreworCXJ0X3N0YXR1cwlydFN0YXR1cyA9IFJUX1NUQVRVU19TVUNDRVNTOworCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmCSAgICAqc2tiOworCWNiX2Rlc2MJCSAgICAqdGNiX2Rlc2M7CisJdW5zaWduZWQgY2hhcgkgICAgKnB0cl9idWY7CisJLy9ib29sCWJMYXN0SW5pdFBhY2tldCA9IGZhbHNlOworCisJLy9QbGF0Zm9ybUFjcXVpcmVTcGluTG9jayhBZGFwdGVyLCBSVF9UWF9TUElOTE9DSyk7CisKKwkvL0dldCBUQ0IgYW5kIGxvY2FsIGJ1ZmZlciBmcm9tIGNvbW1vbiBwb29sLiAoSXQgaXMgc2hhcmVkIGJ5IENtZFEsIE1nbnRRLCBhbmQgVVNCIGNvYWxlc2NlIERhdGFRKQorCXNrYiAgPSBkZXZfYWxsb2Nfc2tiKFVTQl9IV0RFU0NfSEVBREVSX0xFTiArIERhdGFMZW4gKyA0KTsKKwltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksJmRldixzaXplb2YoZGV2KSk7CisJdGNiX2Rlc2MgPSAoY2JfZGVzYyopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gVFhDTURfUVVFVUU7CisJdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBERVNDX1BBQ0tFVF9UWVBFX05PUk1BTDsKKwl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSAwOworCXNrYl9yZXNlcnZlKHNrYiwgVVNCX0hXREVTQ19IRUFERVJfTEVOKTsKKwlwdHJfYnVmID0gc2tiX3B1dChza2IsIERhdGFMZW4pOworCW1lbXNldChwdHJfYnVmLDAsRGF0YUxlbik7CisJbWVtY3B5KHB0cl9idWYscERhdGEsRGF0YUxlbik7CisJdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpRGF0YUxlbjsKKworCWlmKCFwcml2LT5pZWVlODAyMTEtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KXx8CisJCQkoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpfHxcCisJCQkocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSApIHsKKwkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsIj09PT09PT09PT09PT09PT09PT1OVUxMIHBhY2tldD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IHR4IGZ1bGwhXG4iKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLCBza2IpOworCQl9IGVsc2UgeworCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsZGV2KTsKKwkJfQorCisJLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhBZGFwdGVyLCBSVF9UWF9TUElOTE9DSyk7CisJcmV0dXJuIHJ0U3RhdHVzOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJY21wa19tZXNzYWdlX2hhbmRsZV90eCgpCisgKgorICogT3ZlcnZpZXc6CURyaXZlciBpbnRlcm5hbCBtb2R1bGUgY2FuIGNhbGwgdGhlIEFQSSB0byBzZW5kIG1lc3NhZ2UgdG8KKyAqCQkJCWZpcm13YXJlIHNpZGUuIEZvciBleGFtcGxlLCB5b3UgY2FuIHNlbmQgYSBkZWJ1ZyBjb21tYW5kIHBhY2tldC4KKyAqCQkJCU9yIHlvdSBjYW4gc2VuZCBhIHJlcXVlc3QgZm9yIEZXIHRvIG1vZGlmeSBSTFg0MTgxIExCVVMgSFcgYmFuay4KKyAqCQkJCU90aGVyd2lzZSwgeW91IGNhbiBjaGFuZ2UgTUFDL1BIVC9SRiByZWdpc3RlciBieSBmaXJtd2FyZSBhdAorICoJCQkJcnVuIHRpbWUuIFdlIGRvIG5vdCBzdXBwb3J0IG1lc3NhZ2UgbW9yZSB0aGFuIG9uZSBzZWdtZW50IG5vdy4KKyAqCisgKiBJbnB1dDoJCU5PTkUKKyAqCisgKiBPdXRwdXQ6CQlOT05FCisgKgorICogUmV0dXJuOgkJTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqCVdoZW4JCVdobwkJUmVtYXJrCisgKgkwNS8wNi8yMDA4CWFteQkJcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgZXh0ZXJuCXJ0X3N0YXR1cwljbXBrX21lc3NhZ2VfaGFuZGxlX3R4KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCWNvZGV2aXJ0dWFsYWRkcmVzcywKKwl1MzIJcGFja2V0dHlwZSwKKwl1MzIJYnVmZmVyX2xlbikKK3sKKworCWJvb2wgCSAgICBydF9zdGF0dXMgPSB0cnVlOworI2lmZGVmIFJUTDgxOTJVCisJcmV0dXJuIHJ0X3N0YXR1czsKKyNlbHNlCisJc3RydWN0IHI4MTkyX3ByaXYgICAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2CQkgICAgZnJhZ190aHJlc2hvbGQ7CisJdTE2CQkgICAgZnJhZ19sZW5ndGgsIGZyYWdfb2Zmc2V0ID0gMDsKKwkvL3UxNgkJICAgIHRvdGFsX3NpemU7CisJLy9pbnQJCSAgICBpOworCisJcnRfZmlybXdhcmUJICAgICpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJc3RydWN0IHNrX2J1ZmYJICAgICpza2I7CisJdW5zaWduZWQgY2hhcgkgICAgKnNlZ19wdHI7CisJY2JfZGVzYwkJICAgICp0Y2JfZGVzYzsKKwl1OCAgICAgICAgICAgICAgICAgIGJMYXN0SW5pUGt0OworCisJZmlybXdhcmVfaW5pdF9wYXJhbShkZXYpOworCS8vRnJhZ21lbnRhdGlvbiBtaWdodCBiZSByZXF1aXJlZAorCWZyYWdfdGhyZXNob2xkID0gcGZpcm13YXJlLT5jbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKKwlkbyB7CisJCWlmKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKKwkJCWZyYWdfbGVuZ3RoID0gZnJhZ190aHJlc2hvbGQgOworCQkJYkxhc3RJbmlQa3QgPSAwOworCisJCX0gZWxzZSB7CisJCQlmcmFnX2xlbmd0aCA9IGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldDsKKwkJCWJMYXN0SW5pUGt0ID0gMTsKKworCQl9CisKKwkJLyogQWxsb2NhdGUgc2tiIGJ1ZmZlciB0byBjb250YWluIGZpcm13YXJlIGluZm8gYW5kIHR4IGRlc2NyaXB0b3IgaW5mbworCQkgKiBhZGQgNCB0byBhdm9pZCBwYWNrZXQgYXBwZW5kaW5nIG92ZXJmbG93LgorCQkgKiAqLworCQkjaWZkZWYgUlRMODE5MlUKKwkJc2tiICA9IGRldl9hbGxvY19za2IoVVNCX0hXREVTQ19IRUFERVJfTEVOICsgZnJhZ19sZW5ndGggKyA0KTsKKwkJI2Vsc2UKKwkJc2tiICA9IGRldl9hbGxvY19za2IoZnJhZ19sZW5ndGggKyA0KTsKKwkJI2VuZGlmCisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKKwkJdGNiX2Rlc2MgPSAoY2JfZGVzYyopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOworCQl0Y2JfZGVzYy0+YkNtZE9ySW5pdCA9IHBhY2tldHR5cGU7CisJCXRjYl9kZXNjLT5iTGFzdEluaVBrdCA9IGJMYXN0SW5pUGt0OworCisJCSNpZmRlZiBSVEw4MTkyVQorCQlza2JfcmVzZXJ2ZShza2IsIFVTQl9IV0RFU0NfSEVBREVSX0xFTik7CisJCSNlbmRpZgorCisJCXNlZ19wdHIgPSBza2JfcHV0KHNrYiwgYnVmZmVyX2xlbik7CisJCS8qCisJCSAqIFRyYW5zZm9ybSBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorCQkgKiBhbmQgcGVuZGluZyAgemVybworCQkgKi8KKwkJbWVtY3B5KHNlZ19wdHIsY29kZXZpcnR1YWxhZGRyZXNzLGJ1ZmZlcl9sZW4pOworCQl0Y2JfZGVzYy0+dHhidWZfc2l6ZT0gKHUxNilidWZmZXJfbGVuOworCisKKwkJaWYoIXByaXYtPmllZWU4MDIxMS0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjKGRldix0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHwKKwkJCSghc2tiX3F1ZXVlX2VtcHR5KCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdKSl8fFwKKwkJCShwcml2LT5pZWVlODAyMTEtPnF1ZXVlX3N0b3ApICkgeworCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+IHR4IGZ1bGwhXG4iKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLCBza2IpOworCQl9IGVsc2UgeworCQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsZGV2KTsKKwkJfQorCisJCWNvZGV2aXJ0dWFsYWRkcmVzcyArPSBmcmFnX2xlbmd0aDsKKwkJZnJhZ19vZmZzZXQgKz0gZnJhZ19sZW5ndGg7CisKKwl9d2hpbGUoZnJhZ19vZmZzZXQgPCBidWZmZXJfbGVuKTsKKworCXJldHVybiBydF9zdGF0dXM7CisKKworI2VuZGlmCit9CS8qIENNUEtfTWVzc2FnZV9IYW5kbGVfVHggKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfY291bnR0eHN0YXRpc3RpYygpCisgKgorICogT3ZlcnZpZXc6CisgKgorICogSW5wdXQ6ICAgICAgIFBBREFQVEVSIAlwQWRhcHRlcgkJLQkuCisgKgkJCQlDTVBLX1RYRkJfVCAqcHNUeF9GQgktCS4KKyAqCisgKiBPdXRwdXQ6ICAgICAgTk9ORQorICoKKyAqIFJldHVybjogICAgICBOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICogIFdoZW4JCVdobwkJUmVtYXJrCisgKiAgMDUvMTIvMjAwOAlhbXkgCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAorY21wa19jb3VudF90eHN0YXRpc3RpYygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCWNtcGtfdHhmYl90CSpwc3R4X2ZiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKyNpZmRlZiBFTkFCTEVfUFMKKwlSVF9SRl9QT1dFUl9TVEFURQlydFN0YXRlOworCisJcEFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKHBBZGFwdGVyLCBIV19WQVJfUkZfU1RBVEUsIChwdTFCeXRlKSgmcnRTdGF0ZSkpOworCisJLy8gV2hlbiBSRiBpcyBvZmYsIHdlIHNob3VsZCBub3QgY291bnQgdGhlIHBhY2tldCBmb3IgaHcvc3cgc3luY2hyb25pemUKKwkvLyByZWFzb24sIGllLiB0aGVyZSBtYXkgYmUgYSBkdXJhdGlvbiB3aGlsZSBzdyBzd2l0Y2ggaXMgY2hhbmdlZCBhbmQgaHcKKwkvLyBzd2l0Y2ggaXMgYmVpbmcgY2hhbmdlZC4gMjAwNi4xMi4wNCwgYnkgc2hpZW4gY2hhbmcuCisJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQorCXsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisjaWZkZWYgVE9ETworCWlmKHBBZGFwdGVyLT5iSW5IY3RUZXN0KQorCQlyZXR1cm47CisjZW5kaWYKKwkvKiBXZSBjYW4gbm90IGtub3cgdGhlIHBhY2tldCBsZW5ndGggYW5kIHRyYW5zbWl0IHR5cGU6IGJyb2FkY2FzdCBvciB1bmkKKwkgICBvciBtdWx0aWNhc3QuIFNvIHRoZSByZWxhdGl2ZSBzdGF0aXN0aWNzIG11c3QgYmUgY29sbGVjdGVkIGluIHR4CisJICAgZmVlZGJhY2sgaW5mby4gKi8KKwlpZiAocHN0eF9mYi0+dG9rKQorCXsKKwkJcHJpdi0+c3RhdHMudHhmZWVkYmFja29rKys7CisJCXByaXYtPnN0YXRzLnR4b2t0b3RhbCsrOworCQlwcml2LT5zdGF0cy50eG9rYnl0ZXN0b3RhbCArPSBwc3R4X2ZiLT5wa3RfbGVuZ3RoOworCQlwcml2LT5zdGF0cy50eG9raW5wZXJpb2QrKzsKKworCQkvKiBXZSBjYW4gbm90IG1ha2Ugc3VyZSBicm9hZGNhc3QvbXVsdGljYXN0IG9yIHVuaWNhc3QgbW9kZS4gKi8KKwkJaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4bXVsdGljYXN0Kys7CisJCQlwcml2LT5zdGF0cy50eGJ5dGVzbXVsdGljYXN0ICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisJCX0KKwkJZWxzZSBpZiAocHN0eF9mYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0JST0FEQ0FTVCkKKwkJeworCQkJcHJpdi0+c3RhdHMudHhicm9hZGNhc3QrKzsKKwkJCXByaXYtPnN0YXRzLnR4Ynl0ZXNicm9hZGNhc3QgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaXYtPnN0YXRzLnR4dW5pY2FzdCsrOworCQkJcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJfQorCX0KKwllbHNlCisJeworCQlwcml2LT5zdGF0cy50eGZlZWRiYWNrZmFpbCsrOworCQlwcml2LT5zdGF0cy50eGVycnRvdGFsKys7CisJCXByaXYtPnN0YXRzLnR4ZXJyYnl0ZXN0b3RhbCArPSBwc3R4X2ZiLT5wa3RfbGVuZ3RoOworCisJCS8qIFdlIGNhbiBub3QgbWFrZSBzdXJlIGJyb2FkY2FzdC9tdWx0aWNhc3Qgb3IgdW5pY2FzdCBtb2RlLiAqLworCQlpZiAocHN0eF9mYi0+cGt0X3R5cGUgPT0gUEFDS0VUX01VTFRJQ0FTVCkKKwkJeworCQkJcHJpdi0+c3RhdHMudHhlcnJtdWx0aWNhc3QrKzsKKwkJfQorCQllbHNlIGlmIChwc3R4X2ZiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUKQorCQl7CisJCQlwcml2LT5zdGF0cy50eGVycmJyb2FkY2FzdCsrOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpdi0+c3RhdHMudHhlcnJ1bmljYXN0Kys7CisJCX0KKwl9CisKKwlwcml2LT5zdGF0cy50eHJldHJ5Y291bnQgKz0gcHN0eF9mYi0+cmV0cnlfY250OworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tyZXRyeSArPSBwc3R4X2ZiLT5yZXRyeV9jbnQ7CisKK30JLyogY21wa19Db3VudFR4U3RhdGlzdGljICovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogICAgY21wa19oYW5kbGVfdHhfZmVlZGJhY2soKQorICoKKyAqIE92ZXJ2aWV3OglUaGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGV4dHJhY3QgdGhlIG1lc3NhZ2UgaW5zaWRlIFRYCisgKgkJCQlmZWVkYmNrIG1lc3NhZ2UgZnJvbSBmaXJtd2FyZS4gSXQgd2lsbCBjb250YWluIGRlZGljYXRlZCBpbmZvIGluCisgKgkJCQl3cy0wNi0wMDYzLXJ0bDgxOTAtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi4gUGxlYXNlCisgKgkJCQlyZWZlciB0byBjaGFwdGVyICJUWCBGZWVkYmFjayBFbGVtZW50Ii4gV2UgaGF2ZSB0byByZWFkIDIwIGJ5dGVzCisgKgkJCQlpbiB0aGUgY29tbWFuZCBwYWNrZXQuCisgKgorICogSW5wdXQ6ICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICogICAgZGV2CisgKgkJCQl1OCAJKglwbXNnCQktCU1zZyBQdHIgb2YgdGhlIGNvbW1hbmQgcGFja2V0LgorICoKKyAqIE91dHB1dDogICAgICBOT05FCisgKgorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKiAgV2hlbgkJV2hvCQlSZW1hcmsKKyAqICAwNS8wOC8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCitjbXBrX2hhbmRsZV90eF9mZWVkYmFjaygKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4CSoJcG1zZykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJY21wa190eGZiX3QJCXJ4X3R4X2ZiOwkvKiAqLworCisJcHJpdi0+c3RhdHMudHhmZWVkYmFjaysrOworCisJLyogMC4gRGlzcGxheSByZWNlaXZlZCBtZXNzYWdlLiAqLworCS8vY21wa19EaXNwbGF5X01lc3NhZ2UoQ01QS19SWF9UWF9GQl9TSVpFLCBwTXNnKTsKKworCS8qIDEuIEV4dHJhY3QgVFggZmVlZGJhY2sgaW5mbyBmcm9tIFJGRCB0byB0ZW1wIHN0cnVjdHVyZSBidWZmZXIuICovCisJLyogSXQgc2VlbXMgdGhhdCBGVyB1c2UgYmlnIGVuZGlhbihNSVBTKSBhbmQgRFJWIHVzZSBsaXR0bGUgZW5kaWFuIGluCisJICAgd2luZG93cyBPUy4gU28gd2UgaGF2ZSB0byByZWFkIHRoZSBjb250ZW50IGJ5dGUgYnkgYnl0ZSBvciB0cmFuc2ZlcgorCSAgIGVuZGlhbiB0eXBlIGJlZm9yZSBjb3B5IHRoZSBtZXNzYWdlIGNvcHkuICovCisJLyogMjAwNy8wNy8wNSBNSCBVc2UgcG9pbnRlciB0byB0cmFuc2ZlciBzdHJ1Y3R1cmUgbWVtb3J5LiAqLworCS8vbWVtY3B5KChVSU5UOCAqKSZyeF90eF9mYiwgcE1zZywgc2l6ZW9mKENNUEtfVFhGQl9UKSk7CisJbWVtY3B5KCh1OCopJnJ4X3R4X2ZiLCBwbXNnLCBzaXplb2YoY21wa190eGZiX3QpKTsKKwkvKiAyLiBVc2UgdHggZmVlZGJhY2sgaW5mbyB0byBjb3VudCBUWCBzdGF0aXN0aWNzLiAqLworCWNtcGtfY291bnRfdHhzdGF0aXN0aWMoZGV2LCAmcnhfdHhfZmIpOworCS8qIDIwMDcvMDEvMTcgTUggQ29tbWVudCBwcmV2aW91cyBtZXRob2QgZm9yIFRYIHN0YXRpc3RpYyBmdW5jdGlvbi4gKi8KKwkvKiBDb2xsZWN0IGluZm8gVFggZmVlZGJhY2sgcGFja2V0IHRvIGZpbGwgVENCLiAqLworCS8qIFdlIGNhbiBub3Qga25vdyB0aGUgcGFja2V0IGxlbmd0aCBhbmQgdHJhbnNtaXQgdHlwZTogYnJvYWRjYXN0IG9yIHVuaQorCSAgIG9yIG11bHRpY2FzdC4gKi8KKwkvL0NvdW50VHhTdGF0aXN0aWNzKCBwQWRhcHRlciwgJnRjYiApOworCit9CS8qIGNtcGtfSGFuZGxlX1R4X0ZlZWRiYWNrICovCisKK3ZvaWQKK2NtZHBrdF9iZWFjb250aW1lcmludGVycnVwdF84MTl4dXNiKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTE2IHR4X3JhdGU7CisJeworCQkvLworCQkvLyAwNzAxMTcsIHJjbmprbzogODdCIGhhdmUgdG8gUy9XIGJlYWNvbiBmb3IgRFRNIGVuY3J5cHRpb25fY21uLgorCQkvLworCQlpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfQSAgfHwKKwkJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHIHx8CisJCQkocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHICAmJiAoIXByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+YkN1clN1cHBDQ0spKSkKKwkJeworCQkJdHhfcmF0ZSA9IDYwOworCQkJRE1FU0coInNlbmQgYmVhY29uIGZyYW1lICB0eCByYXRlIGlzIDZNYnBtXG4iKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXR4X3JhdGUgPTEwOworCQkJRE1FU0coInNlbmQgYmVhY29uIGZyYW1lICB0eCByYXRlIGlzIDFNYnBtXG4iKTsKKwkJfQorCisJCXJ0bDgxOXh1c2JfYmVhY29uX3R4KGRldix0eF9yYXRlKTsgLy8gSFcgQmVhY29uCisKKwl9CisKK30KKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoKQorICoKKyAqIE92ZXJ2aWV3OiAgICBUaGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGV4dHJhY3QgdGhlIG1lc3NhZ2UgZnJvbQorICoJCQkJZmlybXdhcmUuIEl0IHdpbGwgY29udGFpbiBkZWRpY2F0ZWQgaW5mbyBpbgorICoJCQkJd3MtMDctMDA2My12MDYtcnRsODE5eC1jb21tYW5kLXBhY2tldC1zcGVjaWZpY2F0aW9uLTA3MDMxNS5kb2MuCisgKiAJCQkJUGxlYXNlIHJlZmVyIHRvIGNoYXB0ZXIgIkludGVycnVwdCBTdGF0dXMgRWxlbWVudCIuCisgKgorICogSW5wdXQ6ICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgKgkJCXU4KglwbXNnCQktCU1lc3NhZ2UgUG9pbnRlciBvZiB0aGUgY29tbWFuZCBwYWNrZXQuCisgKgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqCisgKiBSZXR1cm46ICAgICAgTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqICBXaGVuCQkJV2hvCQkJUmVtYXJrCisgKiAgMDUvMTIvMjAwOAlhbXkJCUFkZCB0aGlzIGZvciBydGw4MTkyIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQKK2NtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OCoJcG1zZykKK3sKKwljbXBrX2ludHJfc3RhX3QJCXJ4X2ludHJfc3RhdHVzOwkvKiAqLworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCURNRVNHKCItLS0+IGNtcGtfSGFuZGxlX0ludGVycnVwdF9TdGF0dXMoKVxuIik7CisKKwkvKiAwLiBEaXNwbGF5IHJlY2VpdmVkIG1lc3NhZ2UuICovCisJLy9jbXBrX0Rpc3BsYXlfTWVzc2FnZShDTVBLX1JYX0JFQUNPTl9TVEFURV9TSVpFLCBwTXNnKTsKKworCS8qIDEuIEV4dHJhY3QgVFggZmVlZGJhY2sgaW5mbyBmcm9tIFJGRCB0byB0ZW1wIHN0cnVjdHVyZSBidWZmZXIuICovCisJLyogSXQgc2VlbXMgdGhhdCBGVyB1c2UgYmlnIGVuZGlhbihNSVBTKSBhbmQgRFJWIHVzZSBsaXR0bGUgZW5kaWFuIGluCisJICAgd2luZG93cyBPUy4gU28gd2UgaGF2ZSB0byByZWFkIHRoZSBjb250ZW50IGJ5dGUgYnkgYnl0ZSBvciB0cmFuc2ZlcgorCSAgIGVuZGlhbiB0eXBlIGJlZm9yZSBjb3B5IHRoZSBtZXNzYWdlIGNvcHkuICovCisJLy9yeF9iY25fc3RhdGUuRWxlbWVudF9JRCAJPSBwTXNnWzBdOworCS8vcnhfYmNuX3N0YXRlLkxlbmd0aCAJCT0gcE1zZ1sxXTsKKwlyeF9pbnRyX3N0YXR1cy5sZW5ndGggPSBwbXNnWzFdOworCWlmIChyeF9pbnRyX3N0YXR1cy5sZW5ndGggIT0gKHNpemVvZihjbXBrX2ludHJfc3RhX3QpIC0gMikpCisJeworCQlETUVTRygiY21wa19IYW5kbGVfSW50ZXJydXB0X1N0YXR1czogd3JvbmcgbGVuZ3RoIVxuIik7CisJCXJldHVybjsKKwl9CisKKworCS8vIFN0YXRpc3RpY3Mgb2YgYmVhY29uIGZvciBhZC1ob2MgbW9kZS4KKwlpZigJcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJeworCQkvLzIgbWF5YmUgbmVlZCBlbmRpYW4gdHJhbnNmb3JtPworCQlyeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzID0gKigodTMyICopKHBtc2cgKyA0KSk7CisJCS8vcnhfaW50cl9zdGF0dXMuSW50ZXJydXB0U3RhdHVzID0gTjJINEJZVEUoKigoVUlOVDMyICopKHBNc2cgKyA0KSkpOworCisJCURNRVNHKCJpbnRlcnJ1cHQgc3RhdHVzID0gMHgleFxuIiwgcnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyk7CisKKwkJaWYgKHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMgJiBJU1JfVHhCY25PaykKKwkJeworCQkJcHJpdi0+aWVlZTgwMjExLT5iaWJzc2Nvb3JkaW5hdG9yID0gdHJ1ZTsKKwkJCXByaXYtPnN0YXRzLnR4YmVhY29ub2tpbnQrKzsKKwkJfQorCQllbHNlIGlmIChyeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzICYgSVNSX1R4QmNuRXJyKQorCQl7CisJCQlwcml2LT5pZWVlODAyMTEtPmJpYnNzY29vcmRpbmF0b3IgPSBmYWxzZTsKKwkJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyKys7CisJCX0KKworCQlpZiAocnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyAmIElTUl9CY25UaW1lckludHIpCisJCXsKKwkJCWNtZHBrdF9iZWFjb250aW1lcmludGVycnVwdF84MTl4dXNiKGRldik7CisJCX0KKworCX0KKworCSAvLyBPdGhlciBpbmZvcm1hdGlvbnMgaW4gaW50ZXJydXB0IHN0YXR1cyB3ZSBuZWVkPworCisKKwlETUVTRygiPC0tLS0gY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cygpXG4iKTsKKworfQkvKiBjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246ICAgIGNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeCgpCisgKgorICogT3ZlcnZpZXc6ICAgIFRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZXh0cmFjdCB0aGUgbWVzc2FnZSBmcm9tCisgKgkJCQlmaXJtd2FyZS4gSXQgd2lsbCBjb250YWluIGRlZGljYXRlZCBpbmZvIGluCisgKgkJCQl3cy0wNi0wMDYzLXJ0bDgxOTAtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi4gUGxlYXNlCisgKgkJCQlyZWZlciB0byBjaGFwdGVyICJCZWFjb24gU3RhdGUgRWxlbWVudCIuCisgKgorICogSW5wdXQ6ICAgICAgIHU4ICogIHBtc2cJLQlNZXNzYWdlIFBvaW50ZXIgb2YgdGhlIGNvbW1hbmQgcGFja2V0LgorICoKKyAqIE91dHB1dDogICAgICBOT05FCisgKgorICogUmV0dXJuOiAgICAgIE5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKiAgV2hlbgkJV2hvCQlSZW1hcmsKKyAqICAwNS8xMi8yMDA4CWFteQkJQ3JlYXRlIFZlcnNpb24gMCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwl2b2lkCitjbXBrX2hhbmRsZV9xdWVyeV9jb25maWdfcngoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1OCoJICAgcG1zZykKK3sKKwljbXBrX3F1ZXJ5X2NmZ190CXJ4X3F1ZXJ5X2NmZzsJLyogKi8KKworCS8qIDAuIERpc3BsYXkgcmVjZWl2ZWQgbWVzc2FnZS4gKi8KKwkvL2NtcGtfRGlzcGxheV9NZXNzYWdlKENNUEtfUlhfQkVBQ09OX1NUQVRFX1NJWkUsIHBNc2cpOworCisJLyogMS4gRXh0cmFjdCBUWCBmZWVkYmFjayBpbmZvIGZyb20gUkZEIHRvIHRlbXAgc3RydWN0dXJlIGJ1ZmZlci4gKi8KKwkvKiBJdCBzZWVtcyB0aGF0IEZXIHVzZSBiaWcgZW5kaWFuKE1JUFMpIGFuZCBEUlYgdXNlIGxpdHRsZSBlbmRpYW4gaW4KKwkgICB3aW5kb3dzIE9TLiBTbyB3ZSBoYXZlIHRvIHJlYWQgdGhlIGNvbnRlbnQgYnl0ZSBieSBieXRlIG9yIHRyYW5zZmVyCisJICAgZW5kaWFuIHR5cGUgYmVmb3JlIGNvcHkgdGhlIG1lc3NhZ2UgY29weS4gKi8KKwkvL3J4X3F1ZXJ5X2NmZy5FbGVtZW50X0lEIAk9IHBNc2dbMF07CisJLy9yeF9xdWVyeV9jZmcuTGVuZ3RoIAkJPSBwTXNnWzFdOworCXJ4X3F1ZXJ5X2NmZy5jZmdfYWN0aW9uIAk9IChwbXNnWzRdICYgMHg4MDAwMDAwMCk+PjMxOworCXJ4X3F1ZXJ5X2NmZy5jZmdfdHlwZSAJCT0gKHBtc2dbNF0gJiAweDYwKSA+PiA1OworCXJ4X3F1ZXJ5X2NmZy5jZmdfc2l6ZSAJCT0gKHBtc2dbNF0gJiAweDE4KSA+PiAzOworCXJ4X3F1ZXJ5X2NmZy5jZmdfcGFnZSAJCT0gKHBtc2dbNl0gJiAweDBGKSA+PiAwOworCXJ4X3F1ZXJ5X2NmZy5jZmdfb2Zmc2V0IAkJPSBwbXNnWzddOworCXJ4X3F1ZXJ5X2NmZy52YWx1ZSAJCQk9IChwbXNnWzhdIDw8IDI0KSB8IChwbXNnWzldIDw8IDE2KSB8CisJCQkJCQkJCSAgKHBtc2dbMTBdIDw8IDgpIHwgKHBtc2dbMTFdIDw8IDApOworCXJ4X3F1ZXJ5X2NmZy5tYXNrIAkJCT0gKHBtc2dbMTJdIDw8IDI0KSB8IChwbXNnWzEzXSA8PCAxNikgfAorCQkJCQkJCQkgIChwbXNnWzE0XSA8PCA4KSB8IChwbXNnWzE1XSA8PCAwKTsKKworfQkvKiBjbXBrX0hhbmRsZV9RdWVyeV9Db25maWdfUnggKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJY21wa19jb3VudF90eF9zdGF0dXMoKQorICoKKyAqIE92ZXJ2aWV3OglDb3VudCBhZ2dyZWdhdGVkIHR4IHN0YXR1cyBmcm9tIGZpcm13YXIgb2Ygb25lIHR5cGUgcnggY29tbWFuZAorICoJCQkJcGFja2V0IGVsZW1lbnQgaWQgPSBSWF9UWF9TVEFUVVMuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMTIvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAljbXBrX2NvdW50X3R4X3N0YXR1cygJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkJCWNtcGtfdHhfc3RhdHVzX3QgCSpwc3R4X3N0YXR1cykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKyNpZmRlZiBFTkFCTEVfUFMKKworCVJUX1JGX1BPV0VSX1NUQVRFCXJ0c3RhdGU7CisKKwlwQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwgKHB1MUJ5dGUpKCZydFN0YXRlKSk7CisKKwkvLyBXaGVuIFJGIGlzIG9mZiwgd2Ugc2hvdWxkIG5vdCBjb3VudCB0aGUgcGFja2V0IGZvciBody9zdyBzeW5jaHJvbml6ZQorCS8vIHJlYXNvbiwgaWUuIHRoZXJlIG1heSBiZSBhIGR1cmF0aW9uIHdoaWxlIHN3IHN3aXRjaCBpcyBjaGFuZ2VkIGFuZCBodworCS8vIHN3aXRjaCBpcyBiZWluZyBjaGFuZ2VkLiAyMDA2LjEyLjA0LCBieSBzaGllbiBjaGFuZy4KKwlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpCisJeworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrb2sJKz0gcHN0eF9zdGF0dXMtPnR4b2s7CisJcHJpdi0+c3RhdHMudHhva3RvdGFsCQkrPSBwc3R4X3N0YXR1cy0+dHhvazsKKworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tmYWlsCSs9IHBzdHhfc3RhdHVzLT50eGZhaWw7CisJcHJpdi0+c3RhdHMudHhlcnJ0b3RhbAkJKz0gcHN0eF9zdGF0dXMtPnR4ZmFpbDsKKworCXByaXYtPnN0YXRzLnR4cmV0cnljb3VudAkJKz0gcHN0eF9zdGF0dXMtPnR4cmV0cnk7CisJcHJpdi0+c3RhdHMudHhmZWVkYmFja3JldHJ5CSs9IHBzdHhfc3RhdHVzLT50eHJldHJ5OworCisJLy9wQWRhcHRlci0+VHhTdGF0cy5OdW1UeE9rQnl0ZXNUb3RhbCArPSBwc1R4X0ZCLT5wa3RfbGVuZ3RoOworCS8vcEFkYXB0ZXItPlR4U3RhdHMuTnVtVHhFcnJCeXRlc1RvdGFsICs9IHBzVHhfRkItPnBrdF9sZW5ndGg7CisJLy9wQWRhcHRlci0+TWdudEluZm8uTGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kKys7CisKKwlwcml2LT5zdGF0cy50eG11bHRpY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhtY29rOworCXByaXYtPnN0YXRzLnR4YnJvYWRjYXN0CSs9IHBzdHhfc3RhdHVzLT50eGJjb2s7CisJcHJpdi0+c3RhdHMudHh1bmljYXN0CQkrPSBwc3R4X3N0YXR1cy0+dHh1Y29rOworCisJcHJpdi0+c3RhdHMudHhlcnJtdWx0aWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4bWNmYWlsOworCXByaXYtPnN0YXRzLnR4ZXJyYnJvYWRjYXN0CSs9IHBzdHhfc3RhdHVzLT50eGJjZmFpbDsKKwlwcml2LT5zdGF0cy50eGVycnVuaWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4dWNmYWlsOworCisJcHJpdi0+c3RhdHMudHhieXRlc211bHRpY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhtY2xlbmd0aDsKKwlwcml2LT5zdGF0cy50eGJ5dGVzYnJvYWRjYXN0CSs9IHBzdHhfc3RhdHVzLT50eGJjbGVuZ3RoOworCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0CQkrPSBwc3R4X3N0YXR1cy0+dHh1Y2xlbmd0aDsKKworCXByaXYtPnN0YXRzLmxhc3RfcGFja2V0X3JhdGUJCT0gcHN0eF9zdGF0dXMtPnJhdGU7Cit9CS8qIGNtcGtfQ291bnRUeFN0YXR1cyAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWNtcGtfaGFuZGxlX3R4X3N0YXR1cygpCisgKgorICogT3ZlcnZpZXc6CUZpcm13YXJlIGFkZCBhIG5ldyB0eCBmZWVkYmFjayBzdGF0dXMgdG8gcmVkdWNlIHJ4IGNvbW1hbmQKKyAqCQkJCXBhY2tldCBidWZmZXIgb3BlcmF0aW9uIGxvYWQuCisgKgorICogSW5wdXQ6CQlOT05FCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDUvMTIvMjAwOAlhbXkJCUNyZWF0ZSBWZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAorY21wa19oYW5kbGVfdHhfc3RhdHVzKAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgqCSAgIHBtc2cpCit7CisJY21wa190eF9zdGF0dXNfdAlyeF90eF9zdHM7CS8qICovCisKKwltZW1jcHkoKHZvaWQqKSZyeF90eF9zdHMsICh2b2lkKilwbXNnLCBzaXplb2YoY21wa190eF9zdGF0dXNfdCkpOworCS8qIDIuIFVzZSB0eCBmZWVkYmFjayBpbmZvIHRvIGNvdW50IFRYIHN0YXRpc3RpY3MuICovCisJY21wa19jb3VudF90eF9zdGF0dXMoZGV2LCAmcnhfdHhfc3RzKTsKKworfQkvKiBjbXBrX0hhbmRsZV9UeF9TdGF0dXMgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjoJY21wa19oYW5kbGVfdHhfcmF0ZV9oaXN0b3J5KCkKKyAqCisgKiBPdmVydmlldzoJRmlybXdhcmUgYWRkIGEgbmV3IHR4IHJhdGUgaGlzdG9yeQorICoKKyAqIElucHV0OgkJTk9ORQorICoKKyAqIE91dHB1dDoJCU5PTkUKKyAqCisgKiBSZXR1cm46CQlOT05FCisgKgorICogUmV2aXNlZCBIaXN0b3J5OgorICoJV2hlbgkJV2hvCQlSZW1hcmsKKyAqCTA1LzEyLzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCXZvaWQKK2NtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXU4KgkgICBwbXNnKQoreworCWNtcGtfdHhfcmFoaXNfdAkqcHR4cmF0ZTsKKy8vCVJUX1JGX1BPV0VSX1NUQVRFCXJ0U3RhdGU7CisJdTgJCQkJaSwgajsKKwl1MTYJCQkJbGVuZ3RoID0gc2l6ZW9mKGNtcGtfdHhfcmFoaXNfdCk7CisJdTMyCQkJCSpwdGVtcDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKworI2lmZGVmIEVOQUJMRV9QUworCXBBZGFwdGVyLT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihwQWRhcHRlciwgSFdfVkFSX1JGX1NUQVRFLCAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKKworCS8vIFdoZW4gUkYgaXMgb2ZmLCB3ZSBzaG91bGQgbm90IGNvdW50IHRoZSBwYWNrZXQgZm9yIGh3L3N3IHN5bmNocm9uaXplCisJLy8gcmVhc29uLCBpZS4gdGhlcmUgbWF5IGJlIGEgZHVyYXRpb24gd2hpbGUgc3cgc3dpdGNoIGlzIGNoYW5nZWQgYW5kIGh3CisJLy8gc3dpdGNoIGlzIGJlaW5nIGNoYW5nZWQuIDIwMDYuMTIuMDQsIGJ5IHNoaWVuIGNoYW5nLgorCWlmIChydFN0YXRlID09IGVSZk9mZikKKwl7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCXB0ZW1wID0gKHUzMiAqKXBtc2c7CisKKwkvLworCS8vIERvIGVuZGlhbiB0cmFuc2ZlciB0byB3b3JkIGFsaWdubWVudCgxNiBiaXRzKSBmb3Igd2luZG93cyBzeXN0ZW0uCisJLy8gWW91IG11c3QgZG8gZGlmZmVyZW50IGVuZGlhbiB0cmFuc2ZlciBmb3IgbGludXggYW5kIE1BQyBPUworCS8vCisJZm9yIChpID0gMDsgaSA8IChsZW5ndGgvNCk7IGkrKykKKwl7CisJCXUxNgkgdGVtcDEsIHRlbXAyOworCisJCXRlbXAxID0gcHRlbXBbaV0mMHgwMDAwRkZGRjsKKwkJdGVtcDIgPSBwdGVtcFtpXT4+MTY7CisJCXB0ZW1wW2ldID0gKHRlbXAxPDwxNil8dGVtcDI7CisJfQorCisJcHR4cmF0ZSA9IChjbXBrX3R4X3JhaGlzX3QgKilwbXNnOworCisJaWYgKHB0eHJhdGUgPT0gTlVMTCApCisJeworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJeworCQkvLyBDb2xsZWN0IENDSyByYXRlIHBhY2tldCBudW0KKwkJaWYgKGkgPCA0KQorCQkJcHJpdi0+c3RhdHMudHhyYXRlLmNja1tpXSArPSBwdHhyYXRlLT5jY2tbaV07CisKKwkJLy8gQ29sbGVjdCBPRkRNIHJhdGUgcGFja2V0IG51bQorCQlpZiAoaTwgOCkKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5vZmRtW2ldICs9IHB0eHJhdGUtPm9mZG1baV07CisKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5odF9tY3Nbal1baV0gKz0gcHR4cmF0ZS0+aHRfbWNzW2pdW2ldOworCX0KKworfQkvKiBjbXBrX0hhbmRsZV9UeF9SYXRlX0hpc3RvcnkgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbjogICAgY21wa19tZXNzYWdlX2hhbmRsZV9yeCgpCisgKgorICogT3ZlcnZpZXc6ICAgIEluIHRoZSBmdW5jdGlvbiwgd2Ugd2lsbCBjYXB0dXJlIGRpZmZlcmVudCBSWCBjb21tYW5kIHBhY2tldAorICoJCQkJaW5mby4gRXZlcnkgUlggY29tbWFuZCBwYWNrZXQgZWxlbWVudCBoYXMgZGlmZmVyZW50IG1lc3NhZ2UKKyAqCQkJCWxlbmd0aCBhbmQgbWVhbmluZyBpbiBjb250ZW50LiBXZSBvbmx5IHN1cHBvcnQgdGhyZWUgdHlwZSBvZiBSWAorICoJCQkJY29tbWFuZCBwYWNrZXQgbm93LiBQbGVhc2UgcmVmZXIgdG8gZG9jdW1lbnQKKyAqCQkJCXdzLTA2LTAwNjMtcnRsODE5MC1jb21tYW5kLXBhY2tldC1zcGVjaWZpY2F0aW9uLgorICoKKyAqIElucHV0OiAgICAgICBOT05FCisgKgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqCisgKiBSZXR1cm46ICAgICAgTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqICBXaGVuCQlXaG8JCVJlbWFyaworICogIDA1LzA2LzIwMDgJYW15CQlDcmVhdGUgVmVyc2lvbiAwIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGNvZGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuCXUzMgorY21wa19tZXNzYWdlX2hhbmRsZV9yeCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnBzdGF0cykKK3sKKy8vCXUzMgkJCWRlYnVnX2xldmVsID0gREJHX0xPVUQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWludAkJCXRvdGFsX2xlbmd0aDsKKwl1OAkJCWNtZF9sZW5ndGgsIGV4ZV9jbnQgPSAwOworCXU4CQkJZWxlbWVudF9pZDsKKwl1OAkJCSpwY21kX2J1ZmY7CisKKwkvKiAwLiBDaGVjayBpbnB0IGFyZ3VtZW50cy4gSWYgaXMgaXMgYSBjb21tYW5kIHF1ZXVlIG1lc3NhZ2Ugb3IgcG9pbnRlciBpcworCSAgICAgIG51bGwuICovCisJaWYgKC8qKHByZmQtPnF1ZXVlX2lkICE9IENNUEtfUlhfUVVFVUVfSUQpIHx8ICovKHBzdGF0cz09IE5VTEwpKQorCXsKKwkJLyogUHJpbnQgZXJyb3IgbWVzc2FnZS4gKi8KKwkJLypSVF9UUkFDRShDT01QX1NFTkQsIERlYnVnTGV2ZWwsCisJCQkJKCJcblxyW0NNUEtdLS0+RXJyIHF1ZXVlIGlkIG9yIHBvaW50ZXIiKSk7Ki8KKwkJcmV0dXJuIDA7CS8qIFRoaXMgaXMgbm90IGEgY29tbWFuZCBwYWNrZXQuICovCisJfQorCisJLyogMS4gUmVhZCByZWNlaXZlZCBjb21tYW5kIHBhY2tldCBtZXNzYWdlIGxlbmd0aCBmcm9tIFJGRC4gKi8KKwl0b3RhbF9sZW5ndGggPSBwc3RhdHMtPkxlbmd0aDsKKworCS8qIDIuIFJlYWQgdmlydHVhbCBhZGRyZXNzIGZyb20gUkZELiAqLworCXBjbWRfYnVmZiA9IHBzdGF0cy0+dmlydHVhbF9hZGRyZXNzOworCisJLyogMy4gUmVhZCBjb21tYW5kIHBha2NldCBlbGVtZW50IGlkIGFuZCBsZW5ndGguICovCisJZWxlbWVudF9pZCA9IHBjbWRfYnVmZlswXTsKKwkvKlJUX1RSQUNFKENPTVBfU0VORCwgRGVidWdMZXZlbCwKKwkJCSgiXG5ccltDTVBLXS0tPmVsZW1lbnQgSUQ9JWQgTGVuPSVkIiwgZWxlbWVudF9pZCwgdG90YWxfbGVuZ3RoKSk7Ki8KKworCS8qIDQuIENoZWNrIGV2ZXJ5IHJlY2VpdmVkIGNvbW1hbmQgcGFja2V0IGNvbmVudCBhY2NvcmRpbmcgdG8gZGlmZmVyZW50CisJICAgICAgZWxlbWVudCB0eXBlLiBCZWNhdXNlIEZXIG1heSBhZ2dyZWdhdGUgUlggY29tbWFuZCBwYWNrZXQgdG8gbWluaW1pemUKKwkgICAgICB0cmFuc21pdCB0aW1lIGJldHdlZW4gRFJWIGFuZCBGVy4qLworCS8vIEFkZCBhIGNvdW50ZXIgdG8gcHJldmVudCB0byBsb2NrZWQgaW4gdGhlIGxvb3AgdG9vIGxvbmcKKwl3aGlsZSAodG90YWxfbGVuZ3RoID4gMCB8fCBleGVfY250KysgPjEwMCkKKwl7CisJCS8qIDIwMDcvMDEvMTcgTUggV2Ugc3VwcG9ydCBhZ2dyZWdhdGlvbiBvZiBkaWZmZXJlbnQgY21kIGluIHRoZSBzYW1lIHBhY2tldC4gKi8KKwkJZWxlbWVudF9pZCA9IHBjbWRfYnVmZlswXTsKKworCQlzd2l0Y2goZWxlbWVudF9pZCkKKwkJeworCQkJY2FzZSBSWF9UWF9GRUVEQkFDSzoKKwkJCQljbXBrX2hhbmRsZV90eF9mZWVkYmFjayAoZGV2LCBwY21kX2J1ZmYpOworCQkJCWNtZF9sZW5ndGggPSBDTVBLX1JYX1RYX0ZCX1NJWkU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUlhfSU5URVJSVVBUX1NUQVRVUzoKKwkJCQljbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKGRldiwgcGNtZF9idWZmKTsKKwkJCQljbWRfbGVuZ3RoID0gc2l6ZW9mKGNtcGtfaW50cl9zdGFfdCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQk9USF9RVUVSWV9DT05GSUc6CisJCQkJY21wa19oYW5kbGVfcXVlcnlfY29uZmlnX3J4KGRldiwgcGNtZF9idWZmKTsKKwkJCQljbWRfbGVuZ3RoID0gQ01QS19CT1RIX1FVRVJZX0NPTkZJR19TSVpFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJYX1RYX1NUQVRVUzoKKwkJCQljbXBrX2hhbmRsZV90eF9zdGF0dXMoZGV2LCBwY21kX2J1ZmYpOworCQkJCWNtZF9sZW5ndGggPSBDTVBLX1JYX1RYX1NUU19TSVpFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJYX1RYX1BFUl9QS1RfRkVFREJBQ0s6CisJCQkJLy8gWW91IG11c3QgYXQgbGVhc2UgYWRkIGEgc3dpdGNoIGNhc2UgZWxlbWVudCBoZXJlLAorCQkJCS8vIE90aGVyd2lzZSwgd2Ugd2lsbCBqdW1wIHRvIGRlZmF1bHQgY2FzZS4KKwkJCQkvL0RiZ1ByaW50KCJDQ1ggVGVzdFxyXG4iKTsKKwkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJYX1RYX1JBVEVfSElTVE9SWToKKwkJCQkvL0RiZ1ByaW50KCIgcnggdHggcmF0ZSBoaXN0b3J5XHJcbiIpOworCQkJCWNtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeShkZXYsIHBjbWRfYnVmZik7CisJCQkJY21kX2xlbmd0aCA9IENNUEtfVFhfUkFISVNfU0laRTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6dW5rbm93IENNRCBFbGVtZW50XG4iKTsKKwkJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLworCQl9CisJCS8vIDIwMDcvMDEvMjIgTUggRGlzcGxheSByZWNlaXZlZCByeCBjb21tYW5kIHBhY2tldCBpbmZvLgorCQkvL2NtcGtfRGlzcGxheV9NZXNzYWdlKGNtZF9sZW5ndGgsIHBjbWRfYnVmZik7CisKKwkJLy8gMjAwNy8wMS8yMiBNSCBBZGQgdG8gZGlzcGxheSB0eCBzdGF0aXN0aWMuCisJCS8vY21wa19EaXNwbGF5VHhTdGF0aXN0aWMocEFkYXB0ZXIpOworCisJCS8qIDIwMDcvMDMvMDkgTUggQ29sbGVjdCBzaWRkZXJlbnQgY21kIGVsZW1lbnQgcGt0IG51bS4gKi8KKwkJcHJpdi0+c3RhdHMucnhjbWRwa3RbZWxlbWVudF9pZF0rKzsKKworCQl0b3RhbF9sZW5ndGggLT0gY21kX2xlbmd0aDsKKwkJcGNtZF9idWZmICAgICs9IGNtZF9sZW5ndGg7CisJfQkvKiB3aGlsZSAodG90YWxfbGVuZ3RoID4gMCkgKi8KKwlyZXR1cm4JMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLworCit9CS8qIENNUEtfTWVzc2FnZV9IYW5kbGVfUnggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfY21kcGt0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODU1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2NtZHBrdC5oCkBAIC0wLDAgKzEsMjA3IEBACisjaWZuZGVmIFI4MTlYVVNCX0NNRFBLVF9ICisjZGVmaW5lIFI4MTlYVVNCX0NNRFBLVF9ICisvKiBEaWZmZXJlbnQgY29tbWFuZCBwYWNrZXQgaGF2ZSBkZWRpY2F0ZWQgbWVzc2FnZSBsZW5ndGggYW5kIGRlZmluaXRpb24uICovCisjZGVmaW5lCQlDTVBLX1JYX1RYX0ZCX1NJWkUJCQkJCXNpemVvZihjbXBrX3R4ZmJfdCkJCS8vMjAKKyNkZWZpbmUJCUNNUEtfVFhfU0VUX0NPTkZJR19TSVpFCQkJCXNpemVvZihjbXBrX3NldF9jZmdfdCkJLy8xNgorI2RlZmluZQkJQ01QS19CT1RIX1FVRVJZX0NPTkZJR19TSVpFCQkJc2l6ZW9mKGNtcGtfc2V0X2NmZ190KQkvLzE2CisjZGVmaW5lCQlDTVBLX1JYX1RYX1NUU19TSVpFCQkJCQlzaXplb2YoY21wa190eF9zdGF0dXNfdCkvLworI2RlZmluZQkJQ01QS19SWF9EQkdfTVNHX1NJWkUJCQlzaXplb2YoY21wa19yeF9kYmdpbmZvX3QpLy8KKyNkZWZpbmUJCUNNUEtfVFhfUkFISVNfU0laRQkJCXNpemVvZihjbXBrX3R4X3JhaGlzX3QpCisKKy8qIDIwMDgvMDUvMDggYW15IEZvciBVU0IgY29uc3RhbnQuICovCisjZGVmaW5lIElTUl9UeEJjbk9rCQkJCQlCSVQyNwkJCS8vIFRyYW5zbWl0IEJlYWNvbiBPSworI2RlZmluZSBJU1JfVHhCY25FcnIJCQkJQklUMjYJCQkvLyBUcmFuc21pdCBCZWFjb24gRXJyb3IKKyNkZWZpbmUgSVNSX0JjblRpbWVySW50cgkJCUJJVDEzCQkJLy8gQmVhY29uIFRpbWVyIEludGVycnVwdAorCisKKy8qIERlZmluZSBlbGVtZW50IElEIG9mIGNvbW1hbmQgcGFja2V0LiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIERlZmluZSBkaWZmZXJlbnQgY29tbWFuZCBwYWNrZXQgc3RydWN0dXJlLiAqLworLyogMS4gUlggc2lkZTogVFggZmVlZGJhY2sgcGFja2V0LiAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnX2NtZF9wa3RfdHhfZmVlZGJhY2sKK3sKKwkvLyBEV09SRCAwCisJdTgJZWxlbWVudF9pZDsJCQkvKiBDb21tYW5kIHBhY2tldCB0eXBlLiAqLworCXU4CWxlbmd0aDsJCQkJLyogQ29tbWFuZCBwYWNrZXQgbGVuZ3RoLiAqLworCS8qIDIwMDcvMDcvMDUgTUggQ2hhbmdlIHR4IGZlZWRiYWNrIGluZm8gZmllbGQuICovCisJLyotLS0tLS1UWCBGZWVkYmFjayBJbmZvIEZpZWxkICovCisJdTgJVElEOjQ7CQkJCS8qICovCisJdTgJZmFpbF9yZWFzb246MzsJCS8qICovCisJdTgJdG9rOjE7CQkJCS8qIFRyYW5zbWl0IG9rLiAqLworCXU4CXJlc2VydmUxOjQ7CQkJLyogKi8KKwl1OAlwa3RfdHlwZToyOwkJLyogKi8KKwl1OAliYW5kd2lkdGg6MTsJCS8qICovCisJdTgJcW9zX3BrdDoxOwkJCS8qICovCisKKwkvLyBEV09SRCAxCisJdTgJcmVzZXJ2ZTI7CQkJLyogKi8KKwkvKi0tLS0tLVRYIEZlZWRiYWNrIEluZm8gRmllbGQgKi8KKwl1OAlyZXRyeV9jbnQ7CQkJLyogKi8KKwl1MTYJcGt0X2lkOwkJCQkvKiAqLworCisJLy8gRFdPUkQgMworCXUxNglzZXFfbnVtOwkJCS8qICovCisJdTgJc19yYXRlOwkJCQkvKiBTdGFydCByYXRlLiAqLworCXU4CWZfcmF0ZTsJCQkJLyogRmluYWwgcmF0ZS4gKi8KKworCS8vIERXT1JEIDQKKwl1OAlzX3J0c19yYXRlOwkJCS8qICovCisJdTgJZl9ydHNfcmF0ZTsJCQkvKiAqLworCXUxNglwa3RfbGVuZ3RoOwkJCS8qICovCisKKwkvLyBEV09SRCA1CisJdTE2CXJlc2VydmUzOwkJCS8qICovCisJdTE2CWR1cmF0aW9uOwkJCS8qICovCit9Y21wa190eGZiX3Q7CisKKy8qIDIuIFJYIHNpZGU6IEludGVycnVwdCBzdGF0dXMgcGFja2V0LiBJdCBpbmNsdWRlcyBCZWFjb24gU3RhdGUsCisJICBCZWFjb24gVGltZXIgSW50ZXJydXB0IGFuZCBvdGhlciB1c2VmdWwgaW5mb3JtYXRpb25zIGluIE1BQyBJU1IgUmVnLiAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnX2NtZF9wa3RfaW50ZXJydXB0X3N0YXR1cworeworCXU4CWVsZW1lbnRfaWQ7CQkJLyogQ29tbWFuZCBwYWNrZXQgdHlwZS4gKi8KKwl1OAlsZW5ndGg7CQkJCS8qIENvbW1hbmQgcGFja2V0IGxlbmd0aC4gKi8KKwl1MTYJcmVzZXJ2ZTsKKwl1MzIJaW50ZXJydXB0X3N0YXR1czsJCQkJLyogSW50ZXJydXB0IFN0YXR1cy4gKi8KK31jbXBrX2ludHJfc3RhX3Q7CisKKworLyogMy4gVFggc2lkZTogU2V0IGNvbmZpZ3VyYXRpb24gcGFja2V0LiAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnX2NtZF9wa3Rfc2V0X2NvbmZpZ3VyYXRpb24KK3sKKwl1OAllbGVtZW50X2lkOwkJCS8qIENvbW1hbmQgcGFja2V0IHR5cGUuICovCisJdTgJbGVuZ3RoOwkJCQkvKiBDb21tYW5kIHBhY2tldCBsZW5ndGguICovCisJdTE2CXJlc2VydmUxOwkJCS8qICovCisJdTggCWNmZ19yZXNlcnZlMTozOworCXU4CWNmZ19zaXplOjI7CQkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ190eXBlOjI7CQkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLworCXU4CWNmZ19hY3Rpb246MTsJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KKwl1OAljZmdfcmVzZXJ2ZTI7CQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCisJdTgJY2ZnX3BhZ2U6NDsJCQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCisJdTgJY2ZnX3Jlc2VydmUzOjQ7CQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCisJdTgJY2ZnX29mZnNldDsJCQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCisJdTMyCXZhbHVlOwkJCQkvKiAqLworCXUzMgltYXNrOwkJCQkvKiAqLworfWNtcGtfc2V0X2NmZ190OworCisvKiA0LiBCb3RoIHNpZGUgOiBUWC9SWCBxdWVyeSBjb25maWd1cmF0b24gcGFja2V0LiBUaGUgcXVlcnkgc3RydWN0dXJlIGlzIHRoZQorICAgICAgc2FtZSBhcyBzZXQgY29uZmlndXJhdGlvbi4gKi8KKyNkZWZpbmUJCWNtcGtfcXVlcnlfY2ZnX3QJY21wa19zZXRfY2ZnX3QKKworLyogNS4gTXVsdGkgcGFja2V0IGZlZWRiYWNrIHN0YXR1cy4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ190eF9zdGF0c19mZWVkYmFjayAvLyBQSiBxdWljayByeGNtZCAwOTA0MjAwNworeworCS8vIEZvciBlbmRpYW4gdHJhbnNmZXIgLS0+IERyaXZlciB3aWxsIG5vdCB0aGUgc2FtZSBhcyBmaXJtd2FyZSBzdHJ1Y3R1cmUuCisJLy8gRFcgMAorCXUxNglyZXNlcnZlMTsKKwl1OCAJbGVuZ3RoOwkJCQkvLyBDb21tYW5kIHBhY2tldCBsZW5ndGgKKwl1OCAJZWxlbWVudF9pZDsJCQkvLyBDb21tYW5kIHBhY2tldCB0eXBlCisKKwkvLyBEVyAxCisJdTE2CXR4ZmFpbDsJCQkJLy8gVHggRmFpbCBjb3VudAorCXUxNiAJdHhvazsJCQkJLy8gVHggb2sgY291bnQKKworCS8vIERXIDIKKwl1MTYJdHhtY29rOyAgCQkJLy8gdHggbXVsdGljYXN0CisJdTE2IAl0eHJldHJ5OwkJCS8vIFR4IFJldHJ5IGNvdW50CisKKwkvLyBEVyAzCisJdTE2ICB0eHVjb2s7CQkJCS8vIHR4IHVuaWNhc3QKKwl1MTYJdHhiY29rOyAgCQkJLy8gdHggYnJvYWRjYXN0CisKKwkvLyBEVyA0CisJdTE2CXR4YmNmYWlsOwkJCS8vCisJdTE2CXR4bWNmYWlsOwkJCS8vCisKKwkvLyBEVyA1CisJdTE2CXJlc2VydmUyOwkJCS8vCisJdTE2CXR4dWNmYWlsOwkJCS8vCisKKwkvLyBEVyA2LTgKKwl1MzIJdHhtY2xlbmd0aDsKKwl1MzIJdHhiY2xlbmd0aDsKKwl1MzIJdHh1Y2xlbmd0aDsKKworCS8vIERXIDkKKwl1MTYJcmVzZXJ2ZTNfMjM7CisJdTgJcmVzZXJ2ZTNfMTsKKwl1OAlyYXRlOworfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNtcGtfdHhfc3RhdHVzX3Q7CisKKy8qIDYuIERlYnVnIGZlZWRiYWNrIG1lc3NhZ2UuICovCisvKiAyMDA3LzEwLzIzIE1IIERlZmluZSBSWCBkZWJ1ZyBtZXNzYWdlICAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnX3J4X2RlYnVnX21lc3NhZ2VfZmVlZGJhY2sKK3sKKwkvLyBGb3IgZW5kaWFuIHRyYW5zZmVyIC0tPiBmb3IgZHJpdmVyCisJLy8gRFcgMAorCXUxNglyZXNlcnZlMTsKKwl1OCAJbGVuZ3RoOwkJCQkvLyBDb21tYW5kIHBhY2tldCBsZW5ndGgKKwl1OCAJZWxlbWVudF9pZDsJCQkvLyBDb21tYW5kIHBhY2tldCB0eXBlCisKKwkvLyBEVyAxLT8/CisJLy8gVmFyaWFibGUgZGVidWcgbWVzc2FnZS4KKworfWNtcGtfcnhfZGJnaW5mb190OworCisvKiAyMDA4LzAzLzIwIE1IIERlZmluZSB0cmFuc21pdCByYXRlIGhpc3RvcnkuIEZvciBiaWcgZW5kaWFuIGZvcm1hdC4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ190eF9yYXRlX2hpc3RvcnkKK3sKKwkvLyBGb3IgZW5kaWFuIHRyYW5zZmVyIC0tPiBmb3IgZHJpdmVyCisJLy8gRFcgMAorCXU4IAllbGVtZW50X2lkOwkJCS8vIENvbW1hbmQgcGFja2V0IHR5cGUKKwl1OCAJbGVuZ3RoOwkJCQkvLyBDb21tYW5kIHBhY2tldCBsZW5ndGgKKwl1MTYJcmVzZXJ2ZWQxOworCisJLy8gRFcgMS0yCUNDSyByYXRlIGNvdW50ZXIKKwl1MTYgCWNja1s0XTsKKworCS8vIERXIDMtNgorCXUxNiAJb2ZkbVs4XTsKKworCS8vIERXIDctMTQKKwkvL1VJTlQxNglNQ1NfQlcwX1NHMFsxNl07CisKKwkvLyBEVyAxNS0yMgorCS8vVUlOVDE2CU1DU19CVzFfU0cwWzE2XTsKKworCS8vIERXIDIzLTMwCisJLy9VSU5UMTYJTUNTX0JXMF9TRzFbMTZdOworCisJLy8gRFcgMzEtMzgKKwkvL1VJTlQxNglNQ1NfQlcxX1NHMVsxNl07CisKKwkvLyBEVyA3LTE0CUJXPTAgU0c9MAorCS8vIERXIDE1LTIyCUJXPTEgU0c9MAorCS8vIERXIDIzLTMwCUJXPTAgU0c9MQorCS8vIERXIDMxLTM4CUJXPTEgU0c9MQorCXUxNglodF9tY3NbNF1bMTZdOworCit9X19hdHRyaWJ1dGVfXygocGFja2VkKSkgY21wa190eF9yYWhpc190OworCit0eXBlZGVmIGVudW0gdGFnX2NvbW1hbmRfcGFja2V0X2RpcmVjdG9yaWVzCit7CisgICAgUlhfVFhfRkVFREJBQ0sgPSAwLAorICAgIFJYX0lOVEVSUlVQVF9TVEFUVVMJCT0gMSwKKyAgICBUWF9TRVRfQ09ORklHCQkJCT0gMiwKKyAgICBCT1RIX1FVRVJZX0NPTkZJRwkJCT0gMywKKyAgICBSWF9UWF9TVEFUVVMJCQkJPSA0LAorICAgIFJYX0RCR0lORk9fRkVFREJBQ0sJCT0gNSwKKyAgICBSWF9UWF9QRVJfUEtUX0ZFRURCQUNLCQk9IDYsCisgICAgUlhfVFhfUkFURV9ISVNUT1JZCQk9IDcsCisgICAgUlhfQ01EX0VMRV9NQVgKK31jbXBrX2VsZW1lbnRfZTsKKwordHlwZWRlZiBlbnVtIF9ydF9zdGF0dXN7CisJUlRfU1RBVFVTX1NVQ0NFU1MsCisJUlRfU1RBVFVTX0ZBSUxVUkUsCisJUlRfU1RBVFVTX1BFTkRJTkcsCisJUlRfU1RBVFVTX1JFU09VUkNFCit9cnRfc3RhdHVzLCpwcnRfc3RhdHVzOworCitleHRlcm4gcnRfc3RhdHVzIGNtcGtfbWVzc2FnZV9oYW5kbGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgqIGNvZGV2aXJ0dWFsYWRkcmVzcywgdTMyIHBhY2tldHR5cGUsIHUzMiBidWZmZXJfbGVuKTsKKworZXh0ZXJuICB1MzIgY21wa19tZXNzYWdlX2hhbmRsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICogcHN0YXRzKTsKK2V4dGVybiBydF9zdGF0dXMgU2VuZFR4Q29tbWFuZFBhY2tldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCogcERhdGEsIHUzMiBEYXRhTGVuKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2MyZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCkBAIC0wLDAgKzEsNDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByb2NlZHVyZTogICAgSW5pdCBib290IGNvZGUvZmlybXdhcmUgY29kZS9kYXRhIHNlc3Npb24KKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgaW50aWFsaXplIGZpcm13YXJlLiBJZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIAkJcHJvY2VzcywgdGhlIHJvdXRpbmUgc2hhbGwgdGVybWluYXRlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gZmFpbC4KKyAqCQlOSUMgZHJpdmVyIHNob3VsZCBjYWxsIE5kaXNPcGVuRmlsZSBvbmx5IGZyb20gTWluaXBvcnRJbml0aWFsaXplLgorICoKKyAqIEFyZ3VtZW50czogICBUaGUgcG9pbnRlciBvZiB0aGUgYWRhcHRlcgorCisgKiBSZXR1cm5zOgorICogICAgICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUgLSB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc2hvdWxkIGJlIHRlcm1pbmF0ZWQKKyAqICAgICAgICBORElTX1NUQVRVU19TVUNDRVNTIC0gaWYgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzdWNjZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgInI4MTkyVS5oIgorI2luY2x1ZGUgInI4MTkyVV9ody5oIgorI2luY2x1ZGUgInI4MTl4VV9maXJtd2FyZV9pbWcuaCIKKyNpbmNsdWRlICJyODE5eFVfZmlybXdhcmUuaCIKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgordm9pZCBmaXJtd2FyZV9pbml0X3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgCSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlydF9maXJtd2FyZQkJKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKKworCXBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQgPSBHRVRfQ09NTUFORF9QQUNLRVRfRlJBR19USFJFU0hPTEQoTUFYX1RSQU5TTUlUX0JVRkZFUl9TSVpFKTsKK30KKworLyoKKyAqIHNlZ21lbnQgdGhlIGltZyBhbmQgdXNlIHRoZSBwdHIgYW5kIGxlbmd0aCB0byByZW1lbWJlciBpbmZvIG9uIGVhY2ggc2VnbWVudAorICoKKyAqLworYm9vbCBmd19kb3dubG9hZF9jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpjb2RlX3ZpcnR1YWxfYWRkcmVzcywgdTMyIGJ1ZmZlcl9sZW4pCit7CisJc3RydWN0IHI4MTkyX3ByaXYgICAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJYm9vbCAJCSAgICBydF9zdGF0dXMgPSB0cnVlOworCXUxNgkJICAgIGZyYWdfdGhyZXNob2xkOworCXUxNgkJICAgIGZyYWdfbGVuZ3RoLCBmcmFnX29mZnNldCA9IDA7CisJLy91MTYJCSAgICB0b3RhbF9zaXplOworCWludAkJICAgIGk7CisKKwlydF9maXJtd2FyZQkgICAgKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKKwl1bnNpZ25lZCBjaGFyCSAgICAqc2VnX3B0cjsKKwljYl9kZXNjCQkgICAgKnRjYl9kZXNjOworCXU4ICAgICAgICAgICAgICAgICAgYkxhc3RJbmlQa3Q7CisKKwlmaXJtd2FyZV9pbml0X3BhcmFtKGRldik7CisJLy9GcmFnbWVudGF0aW9uIG1pZ2h0IGJlIHJlcXVpcmVkCisJZnJhZ190aHJlc2hvbGQgPSBwZmlybXdhcmUtPmNtZHBhY2tldF9mcmFnX3RocmVzb2xkOworCWRvIHsKKwkJaWYoKGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldCkgPiBmcmFnX3RocmVzaG9sZCkgeworCQkJZnJhZ19sZW5ndGggPSBmcmFnX3RocmVzaG9sZCA7CisJCQliTGFzdEluaVBrdCA9IDA7CisKKwkJfSBlbHNlIHsKKwkJCWZyYWdfbGVuZ3RoID0gYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0OworCQkJYkxhc3RJbmlQa3QgPSAxOworCisJCX0KKworCQkvKiBBbGxvY2F0ZSBza2IgYnVmZmVyIHRvIGNvbnRhaW4gZmlybXdhcmUgaW5mbyBhbmQgdHggZGVzY3JpcHRvciBpbmZvCisJCSAqIGFkZCA0IHRvIGF2b2lkIHBhY2tldCBhcHBlbmRpbmcgb3ZlcmZsb3cuCisJCSAqICovCisJCSNpZmRlZiBSVEw4MTkyVQorCQlza2IgID0gZGV2X2FsbG9jX3NrYihVU0JfSFdERVNDX0hFQURFUl9MRU4gKyBmcmFnX2xlbmd0aCArIDQpOworCQkjZWxzZQorCQlza2IgID0gZGV2X2FsbG9jX3NrYihmcmFnX2xlbmd0aCArIDQpOworCQkjZW5kaWYKKwkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCZkZXYsc2l6ZW9mKGRldikpOworCQl0Y2JfZGVzYyA9IChjYl9kZXNjKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gVFhDTURfUVVFVUU7CisJCXRjYl9kZXNjLT5iQ21kT3JJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9JTklUOworCQl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaVBrdDsKKworCQkjaWZkZWYgUlRMODE5MlUKKwkJc2tiX3Jlc2VydmUoc2tiLCBVU0JfSFdERVNDX0hFQURFUl9MRU4pOworCQkjZW5kaWYKKwkJc2VnX3B0ciA9IHNrYi0+ZGF0YTsKKwkJLyoKKwkJICogVHJhbnNmb3JtIGZyb20gbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuCisJCSAqIGFuZCBwZW5kaW5nICB6ZXJvCisJCSAqLworCQlmb3IoaT0wIDsgaSA8IGZyYWdfbGVuZ3RoOyBpKz00KSB7CisJCQkqc2VnX3B0cisrID0gKChpKzApPGZyYWdfbGVuZ3RoKT9jb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzNdOjA7CisJCQkqc2VnX3B0cisrID0gKChpKzEpPGZyYWdfbGVuZ3RoKT9jb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzJdOjA7CisJCQkqc2VnX3B0cisrID0gKChpKzIpPGZyYWdfbGVuZ3RoKT9jb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzFdOjA7CisJCQkqc2VnX3B0cisrID0gKChpKzMpPGZyYWdfbGVuZ3RoKT9jb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzBdOjA7CisJCX0KKwkJdGNiX2Rlc2MtPnR4YnVmX3NpemU9ICh1MTYpaTsKKwkJc2tiX3B1dChza2IsIGkpOworCisJCWlmKCFwcml2LT5pZWVlODAyMTEtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KXx8CisJCQkoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpfHxcCisJCQkocHJpdi0+aWVlZTgwMjExLT5xdWV1ZV9zdG9wKSApIHsKKwkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7CisJCX0KKworCQljb2RlX3ZpcnR1YWxfYWRkcmVzcyArPSBmcmFnX2xlbmd0aDsKKwkJZnJhZ19vZmZzZXQgKz0gZnJhZ19sZW5ndGg7CisKKwl9d2hpbGUoZnJhZ19vZmZzZXQgPCBidWZmZXJfbGVuKTsKKworCXJldHVybiBydF9zdGF0dXM7CisKK30KKworYm9vbAorZndTZW5kTnVsbFBhY2tldCgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXUzMgkJCUxlbmd0aAorKQoreworCWJvb2wJcnRTdGF0dXMgPSB0cnVlOworCXN0cnVjdCByODE5Ml9wcml2ICAgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmCSAgICAqc2tiOworCWNiX2Rlc2MJCSAgICAqdGNiX2Rlc2M7CisJdW5zaWduZWQgY2hhcgkgICAgKnB0cl9idWY7CisJYm9vbAliTGFzdEluaXRQYWNrZXQgPSBmYWxzZTsKKworCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworCisJLy9HZXQgVENCIGFuZCBsb2NhbCBidWZmZXIgZnJvbSBjb21tb24gcG9vbC4gKEl0IGlzIHNoYXJlZCBieSBDbWRRLCBNZ250USwgYW5kIFVTQiBjb2FsZXNjZSBEYXRhUSkKKwlza2IgID0gZGV2X2FsbG9jX3NrYihMZW5ndGgrIDQpOworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwmZGV2LHNpemVvZihkZXYpKTsKKwl0Y2JfZGVzYyA9IChjYl9kZXNjKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBUWENNRF9RVUVVRTsKKwl0Y2JfZGVzYy0+YkNtZE9ySW5pdCA9IERFU0NfUEFDS0VUX1RZUEVfSU5JVDsKKwl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaXRQYWNrZXQ7CisJcHRyX2J1ZiA9IHNrYl9wdXQoc2tiLCBMZW5ndGgpOworCW1lbXNldChwdHJfYnVmLDAsTGVuZ3RoKTsKKwl0Y2JfZGVzYy0+dHhidWZfc2l6ZT0gKHUxNilMZW5ndGg7CisKKwlpZighcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LHRjYl9kZXNjLT5xdWV1ZV9pbmRleCl8fAorCQkJKCFza2JfcXVldWVfZW1wdHkoJnByaXYtPmllZWU4MDIxMS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pKXx8XAorCQkJKHByaXYtPmllZWU4MDIxMS0+cXVldWVfc3RvcCkgKSB7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCI9PT09PT09PT09PT09PT09PT09TlVMTCBwYWNrZXQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CisJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLGRldik7CisJCX0KKworCS8vUGxhdGZvcm1SZWxlYXNlU3BpbkxvY2soQWRhcHRlciwgUlRfVFhfU1BJTkxPQ0spOworCXJldHVybiBydFN0YXR1czsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcm9jZWR1cmU6ICAgIENoZWNrIHdoZXRoZXIgbWFpbiBjb2RlIGlzIGRvd25sb2FkIE9LLiBJZiBPSywgdHVybiBvbiBDUFUKKy8vCisvLyBEZXNjcmlwdGlvbjogICBDUFUgcmVnaXN0ZXIgbG9jYXRlcyBpbiBkaWZmZXJlbnQgcGFnZSBhZ2FpbnN0IGdlbmVyYWwgcmVnaXN0ZXIuCisvLwkJCSAgICBTd2l0Y2ggdG8gQ1BVIHJlZ2lzdGVyIGluIHRoZSBiZWdpbiBhbmQgc3dpdGNoIGJhY2sgYmVmb3JlIHJldHVybgorLy8KKy8vCisvLyBBcmd1bWVudHM6ICAgVGhlIHBvaW50ZXIgb2YgdGhlIGFkYXB0ZXIKKy8vCisvLyBSZXR1cm5zOgorLy8gICAgICAgIE5ESVNfU1RBVFVTX0ZBSUxVUkUgLSB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc2hvdWxkIGJlIHRlcm1pbmF0ZWQKKy8vICAgICAgICBORElTX1NUQVRVU19TVUNDRVNTIC0gaWYgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyBzdWNjZXNzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitib29sIENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYm9vbAkJcnRfc3RhdHVzID0gdHJ1ZTsKKwlpbnQJCWNoZWNrX3B1dGNvZGVPS190aW1lID0gMjAwMDAwLCBjaGVja19ib290T2tfdGltZSA9IDIwMDAwMDsKKwl1MzIJCUNQVV9zdGF0dXMgPSAwOworCisJLyogQ2hlY2sgd2hldGhlciBwdXQgY29kZSBPSyAqLworCWRvIHsKKwkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisKKwkJaWYoQ1BVX3N0YXR1cyZDUFVfR0VOX1BVVF9DT0RFX09LKQorCQkJYnJlYWs7CisKKwl9d2hpbGUoY2hlY2tfcHV0Y29kZU9LX3RpbWUtLSk7CisKKwlpZighKENQVV9zdGF0dXMmQ1BVX0dFTl9QVVRfQ09ERV9PSykpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJEb3dubG9hZCBGaXJtd2FyZTogUHV0IGNvZGUgZmFpbCFcbiIpOworCQlnb3RvIENQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJEb3dubG9hZCBGaXJtd2FyZTogUHV0IGNvZGUgb2shXG4iKTsKKwl9CisKKwkvKiBUdXJuIE9uIENQVSAqLworCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1BVX0dFTiwgKHU4KSgoQ1BVX3N0YXR1c3xDUFVfR0VOX1BXUl9TVEJfQ1BVKSYweGZmKSk7CisJbWRlbGF5KDEwMDApOworCisJLyogQ2hlY2sgd2hldGhlciBDUFUgYm9vdCBPSyAqLworCWRvIHsKKwkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisKKwkJaWYoQ1BVX3N0YXR1cyZDUFVfR0VOX0JPT1RfUkRZKQorCQkJYnJlYWs7CisJfXdoaWxlKGNoZWNrX2Jvb3RPa190aW1lLS0pOworCisJaWYoIShDUFVfc3RhdHVzJkNQVV9HRU5fQk9PVF9SRFkpKSB7CisJCWdvdG8gQ1BVQ2hlY2tNYWluQ29kZU9LQW5kVHVybk9uQ1BVX0ZhaWw7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkRvd25sb2FkIEZpcm13YXJlOiBCb290IHJlYWR5IVxuIik7CisJfQorCisJcmV0dXJuIHJ0X3N0YXR1czsKKworQ1BVQ2hlY2tNYWluQ29kZU9LQW5kVHVybk9uQ1BVX0ZhaWw6CisJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlydF9zdGF0dXMgPSBGQUxTRTsKKwlyZXR1cm4gcnRfc3RhdHVzOworfQorCitib29sIENQVWNoZWNrX2Zpcm13YXJlX3JlYWR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlib29sCQlydF9zdGF0dXMgPSB0cnVlOworCWludAkJY2hlY2tfdGltZSA9IDIwMDAwMDsKKwl1MzIJCUNQVV9zdGF0dXMgPSAwOworCisJLyogQ2hlY2sgRmlybXdhcmUgUmVhZHkgKi8KKwlkbyB7CisJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCisJCWlmKENQVV9zdGF0dXMmQ1BVX0dFTl9GSVJNX1JEWSkKKwkJCWJyZWFrOworCisJfXdoaWxlKGNoZWNrX3RpbWUtLSk7CisKKwlpZighKENQVV9zdGF0dXMmQ1BVX0dFTl9GSVJNX1JEWSkpCisJCWdvdG8gQ1BVQ2hlY2tGaXJtd2FyZVJlYWR5X0ZhaWw7CisJZWxzZQorCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRG93bmxvYWQgRmlybXdhcmU6IEZpcm13YXJlIHJlYWR5IVxuIik7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCitDUFVDaGVja0Zpcm13YXJlUmVhZHlfRmFpbDoKKwlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXJ0X3N0YXR1cyA9IGZhbHNlOworCXJldHVybiBydF9zdGF0dXM7CisKK30KKworYm9vbCBpbml0X2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgCSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlib29sCQkJcnRfc3RhdHVzID0gVFJVRTsKKworCXU4CQkJKmZpcm13YXJlX2ltZ19idWZbM10gPSB7ICZydGw4MTkwX2Z3Ym9vdF9hcnJheVswXSwKKwkJCQkJCQkgJnJ0bDgxOTBfZndtYWluX2FycmF5WzBdLAorCQkJCQkJCSAmcnRsODE5MF9md2RhdGFfYXJyYXlbMF19OworCisJdTMyCQkJZmlybXdhcmVfaW1nX2xlblszXSA9IHsgc2l6ZW9mKHJ0bDgxOTBfZndib290X2FycmF5KSwKKwkJCQkJCQlzaXplb2YocnRsODE5MF9md21haW5fYXJyYXkpLAorCQkJCQkJCXNpemVvZihydGw4MTkwX2Z3ZGF0YV9hcnJheSl9OworCXUzMgkJCWZpbGVfbGVuZ3RoID0gMDsKKwl1OAkJCSptYXBwZWRfZmlsZSA9IE5VTEw7CisJdTMyCQkJaW5pdF9zdGVwID0gMDsKKwlvcHRfcnN0X3R5cGVfZQlyc3Rfb3B0ID0gT1BUX1NZU1RFTV9SRVNFVDsKKwlmaXJtd2FyZV9pbml0X3N0ZXBfZSAJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7CisKKwlydF9maXJtd2FyZQkJKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgCSpmd19lbnRyeTsKKwljb25zdCBjaGFyICpmd19uYW1lWzNdID0geyAiUlRMODE5MlUvYm9vdC5pbWciLAorCQkJICAgIlJUTDgxOTJVL21haW4uaW1nIiwKKwkJCSAgICJSVEw4MTkyVS9kYXRhLmltZyJ9OworCWludCByYzsKKworCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICIgUGxhdGZvcm1Jbml0RmlybXdhcmUoKT09PlxuIik7CisKKwlpZiAocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzBfSU5JVCApIHsKKwkJLyogaXQgaXMgY2FsbGVkIGJ5IHJlc2V0ICovCisJCXJzdF9vcHQgPSBPUFRfU1lTVEVNX1JFU0VUOworCQlzdGFydGluZ19zdGF0ZSA9IEZXX0lOSVRfU1RFUDBfQk9PVDsKKwkJLy8gVE9ETzogc3lzdGVtIHJlc2V0CisKKwl9ZWxzZSBpZihwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfNV9SRUFEWSkgeworCQkvKiBpdCBpcyBjYWxsZWQgYnkgSW5pdGlhbGl6ZSAqLworCQlyc3Rfb3B0ID0gT1BUX0ZJUk1XQVJFX1JFU0VUOworCQlzdGFydGluZ19zdGF0ZSA9IEZXX0lOSVRfU1RFUDJfREFUQTsKKwl9ZWxzZSB7CisJCSBSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiUGxhdGZvcm1Jbml0RmlybXdhcmU6IHVuZGVmaW5lZCBmaXJtd2FyZSBzdGF0ZVxuIik7CisJfQorCisJLyoKKwkgKiBEb3dubG9hZCBib290LCBtYWluLCBhbmQgZGF0YSBpbWFnZSBmb3IgU3lzdGVtIHJlc2V0LgorCSAqIERvd25sb2FkIGRhdGEgaW1hZ2UgZm9yIGZpcm13YXJlIHJlc2V0YQorCSAqLworCXByaXYtPmZpcm13YXJlX3NvdXJjZSA9IEZXX1NPVVJDRV9JTUdfRklMRTsKKwlmb3IoaW5pdF9zdGVwID0gc3RhcnRpbmdfc3RhdGU7IGluaXRfc3RlcCA8PSBGV19JTklUX1NURVAyX0RBVEE7IGluaXRfc3RlcCsrKSB7CisJCS8qCisJCSAqIE9wZW4gSW1hZ2UgZmlsZSwgYW5kIG1hcCBmaWxlIHRvIGNvbnRpbmVvdXMgbWVtb3J5IGlmIG9wZW4gZmlsZSBzdWNjZXNzLgorCQkgKiBvciByZWFkIGltYWdlIGZpbGUgZnJvbSBhcnJheS4gRGVmYXVsdCBsb2FkIGZyb20gSU1HIGZpbGUKKwkJICovCisJCWlmKHJzdF9vcHQgPT0gT1BUX1NZU1RFTV9SRVNFVCkgeworCQkJc3dpdGNoKHByaXYtPmZpcm13YXJlX3NvdXJjZSkgeworCQkJCWNhc2UgRldfU09VUkNFX0lNR19GSUxFOgorCQkJCQlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBmd19uYW1lW2luaXRfc3RlcF0sJnByaXYtPnVkZXYtPmRldik7CisJCQkJCWlmKHJjIDwgMCApIHsKKwkJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAicmVxdWVzdCBmaXJtd2FyZSBmYWlsIVxuIik7CisJCQkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CisJCQkJCX0KKworCQkJCQlpZihmd19lbnRyeS0+c2l6ZSA+IHNpemVvZihwZmlybXdhcmUtPmZpcm13YXJlX2J1ZikpIHsKKwkJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiaW1nIGZpbGUgc2l6ZSBleGNlZWQgdGhlIGNvbnRhaW5lciBidWZmZXIgZmFpbCFcbiIpOworCQkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCQl9CisKKwkJCQkJaWYoaW5pdF9zdGVwICE9IEZXX0lOSVRfU1RFUDFfTUFJTikgeworCQkJCQkJbWVtY3B5KHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmLGZ3X2VudHJ5LT5kYXRhLGZ3X2VudHJ5LT5zaXplKTsKKwkJCQkJCW1hcHBlZF9maWxlID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWY7CisJCQkJCQlmaWxlX2xlbmd0aCA9IGZ3X2VudHJ5LT5zaXplOworCQkJCQl9IGVsc2UgeworCQkJCQkjaWZkZWYgUlRMODE5MFAKKwkJCQkJCW1lbWNweShwZmlybXdhcmUtPmZpcm13YXJlX2J1Zixmd19lbnRyeS0+ZGF0YSxmd19lbnRyeS0+c2l6ZSk7CisJCQkJCQltYXBwZWRfZmlsZSA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmOworCQkJCQkJZmlsZV9sZW5ndGggPSBmd19lbnRyeS0+c2l6ZTsKKwkJCQkJI2Vsc2UKKwkJCQkJCW1lbXNldChwZmlybXdhcmUtPmZpcm13YXJlX2J1ZiwwLDEyOCk7CisJCQkJCQltZW1jcHkoJnBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmWzEyOF0sZndfZW50cnktPmRhdGEsZndfZW50cnktPnNpemUpOworCQkJCQkJbWFwcGVkX2ZpbGUgPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1ZjsKKwkJCQkJCWZpbGVfbGVuZ3RoID0gZndfZW50cnktPnNpemUgKyAxMjg7CisJCQkJCSNlbmRpZgorCQkJCQl9CisJCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemUgPSBmaWxlX2xlbmd0aDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIEZXX1NPVVJDRV9IRUFERVJfRklMRToKKwkJCQkJbWFwcGVkX2ZpbGUgPSAgZmlybXdhcmVfaW1nX2J1Zltpbml0X3N0ZXBdOworCQkJCQlmaWxlX2xlbmd0aCAgPSBmaXJtd2FyZV9pbWdfbGVuW2luaXRfc3RlcF07CisJCQkJCWlmKGluaXRfc3RlcCA9PSBGV19JTklUX1NURVAyX0RBVEEpIHsKKwkJCQkJCW1lbWNweShwZmlybXdhcmUtPmZpcm13YXJlX2J1ZiwgbWFwcGVkX2ZpbGUsIGZpbGVfbGVuZ3RoKTsKKwkJCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemUgPSBmaWxlX2xlbmd0aDsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCisKKwkJfWVsc2UgaWYocnN0X29wdCA9PSBPUFRfRklSTVdBUkVfUkVTRVQgKSB7CisJCQkvKiB3ZSBvbmx5IG5lZWQgdG8gZG93bmxvYWQgZGF0YS5pbWcgaGVyZSAqLworCQkJbWFwcGVkX2ZpbGUgPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1ZjsKKwkJCWZpbGVfbGVuZ3RoID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWZfc2l6ZTsKKwkJfQorCisJCS8qIERvd25sb2FkIGltYWdlIGZpbGUgKi8KKwkJLyogVGhlIGZpcm13YXJlIGRvd25sb2FkIHByb2Nlc3MgaXMganVzdCBhcyBmb2xsb3dpbmcsCisJCSAqIDEuIHRoYXQgaXMgZWFjaCBwYWNrZXQgd2lsbCBiZSBzZWdtZW50ZWQgYW5kIGluc2VydGVkIHRvIHRoZSB3YWl0IHF1ZXVlLgorCQkgKiAyLiBlYWNoIHBhY2tldCBzZWdtZW50IHdpbGwgYmUgcHV0IGluIHRoZSBza2JfYnVmZiBwYWNrZXQuCisJCSAqIDMuIGVhY2ggc2tiX2J1ZmYgcGFja2V0IGRhdGEgY29udGVudCB3aWxsIGFscmVhZHkgaW5jbHVkZSB0aGUgZmlybXdhcmUgaW5mbworCQkgKiAgIGFuZCBUeCBkZXNjcmlwdG9yIGluZm8KKwkJICogKi8KKwkJcnRfc3RhdHVzID0gZndfZG93bmxvYWRfY29kZShkZXYsbWFwcGVkX2ZpbGUsZmlsZV9sZW5ndGgpOworCQlpZihyc3Rfb3B0ID09IE9QVF9TWVNURU1fUkVTRVQpIHsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQl9CisKKwkJaWYocnRfc3RhdHVzICE9IFRSVUUpIHsKKwkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJfQorCisJCXN3aXRjaChpbml0X3N0ZXApIHsKKwkJCWNhc2UgRldfSU5JVF9TVEVQMF9CT09UOgorCQkJCS8qIERvd25sb2FkIGJvb3QKKwkJCQkgKiBpbml0aWFsaXplIGNvbW1hbmQgZGVzY3JpcHRvci4KKwkJCQkgKiB3aWxsIHNldCBwb2xsaW5nIGJpdCB3aGVuIGZpcm13YXJlIGNvZGUgaXMgYWxzbyBjb25maWd1cmVkCisJCQkJICovCisJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMV9NT1ZFX0JPT1RfQ09ERTsKKyNpZmRlZiBSVEw4MTkwUAorCQkJCS8vIFRvIGluaXRpYWxpemUgSU1FTSwgQ1BVIG1vdmUgY29kZSAgZnJvbSAweDgwMDAwMDgwLCBoZW5jZSwgd2Ugc2VuZCAweDgwIGJ5dGUgcGFja2V0CisJCQkJcnRfc3RhdHVzID0gZndTZW5kTnVsbFBhY2tldChkZXYsIFJUTDgxOTBfQ1BVX1NUQVJUX09GRlNFVCk7CisJCQkJaWYocnRfc3RhdHVzICE9IHRydWUpCisJCQkJeworCQkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJmd1NlbmROdWxsUGFja2V0KCkgZmFpbCAhIFxuIik7CisJCQkJCWdvdG8gIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CisJCQkJfQorI2VuZGlmCisJCQkJLy9tZGVsYXkoMTAwMCk7CisJCQkJLyoKKwkJCQkgKiBUbyBpbml0aWFsaXplIElNRU0sIENQVSBtb3ZlIGNvZGUgIGZyb20gMHg4MDAwMDA4MCwKKwkJCQkgKiBoZW5jZSwgd2Ugc2VuZCAweDgwIGJ5dGUgcGFja2V0CisJCQkJICovCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRldfSU5JVF9TVEVQMV9NQUlOOgorCQkJCS8qIERvd25sb2FkIGZpcm13YXJlIGNvZGUuIFdhaXQgdW50aWwgQm9vdCBSZWFkeSBhbmQgVHVybiBvbiBDUFUgKi8KKwkJCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU18yX01PVkVfTUFJTl9DT0RFOworCisJCQkJLyogQ2hlY2sgUHV0IENvZGUgT0sgYW5kIFR1cm4gT24gQ1BVICovCisJCQkJcnRfc3RhdHVzID0gQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub25DUFUoZGV2KTsKKwkJCQlpZihydF9zdGF0dXMgIT0gVFJVRSkgeworCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIkNQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVIGZhaWwhXG4iKTsKKwkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCX0KKworCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzNfVFVSTk9OX0NQVTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGV19JTklUX1NURVAyX0RBVEE6CisJCQkJLyogZG93bmxvYWQgaW5pdGlhbCBkYXRhIGNvZGUgKi8KKwkJCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU180X01PVkVfREFUQV9DT0RFOworCQkJCW1kZWxheSgxKTsKKworCQkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX2Zpcm13YXJlX3JlYWR5KGRldik7CisJCQkJaWYocnRfc3RhdHVzICE9IFRSVUUpIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDUFVjaGVja19maXJtd2FyZV9yZWFkeSBmYWlsKCVkKSFcbiIscnRfc3RhdHVzKTsKKwkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOworCQkJCX0KKworCQkJCS8qIHdhaXQgdW50aWwgZGF0YSBjb2RlIGlzIGluaXRpYWxpemVkIHJlYWR5LiovCisJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfNV9SRUFEWTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJGaXJtd2FyZSBEb3dubG9hZCBTdWNjZXNzXG4iKTsKKwkvL2Fzc2VydChwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfNV9SRUFEWSwgKCJGaXJtd2FyZSBEb3dubG9hZCBGYWlsXG4iKSk7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCitkb3dubG9hZF9maXJtd2FyZV9mYWlsOgorCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcnRfc3RhdHVzID0gRkFMU0U7CisJcmV0dXJuIHJ0X3N0YXR1czsKKworfQorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGJjZWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuaApAQCAtMCwwICsxLDI3IEBACisjaWZuZGVmIF9fSU5DX0ZJUk1XQVJFX0gKKyNkZWZpbmUgX19JTkNfRklSTVdBUkVfSAorCisjZGVmaW5lIFJUTDgxOTBfQ1BVX1NUQVJUX09GRlNFVAkweDgwCisvKiBUT0RPOiB0aGlzIGRlZmluaXRpb24gaXMgVEJEICovCisvLyNkZWZpbmUgVVNCX0hXREVTQ19IRUFERVJfTEVOCTAKKworLyogSXQgc2hvdWxkIGJlIGRvdWJsZSB3b3JkIGFsaWdubWVudCAqLworLy8jaWYgREVWX0JVU19UWVBFPT1QQ0lfSU5URVJGQUNFCisvLyNkZWZpbmUgR0VUX0NPTU1BTkRfUEFDS0VUX0ZSQUdfVEhSRVNIT0xEKHYpCTQqKHYvNCkgLSA4CisvLyNlbHNlCisjZGVmaW5lIEdFVF9DT01NQU5EX1BBQ0tFVF9GUkFHX1RIUkVTSE9MRCh2KQkoNCoodi80KSAtIDggLSBVU0JfSFdERVNDX0hFQURFUl9MRU4pCisvLyNlbmRpZgorCit0eXBlZGVmIGVudW0gX2Zpcm13YXJlX2luaXRfc3RlcHsKKwlGV19JTklUX1NURVAwX0JPT1QgPSAwLAorCUZXX0lOSVRfU1RFUDFfTUFJTiA9IDEsCisJRldfSU5JVF9TVEVQMl9EQVRBID0gMiwKK31maXJtd2FyZV9pbml0X3N0ZXBfZTsKKwordHlwZWRlZiBlbnVtIF9vcHRfcnN0X3R5cGV7CisJT1BUX1NZU1RFTV9SRVNFVCA9IDAsCisJT1BUX0ZJUk1XQVJFX1JFU0VUID0gMSwKK31vcHRfcnN0X3R5cGVfZTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YjY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlX2ltZy5jCkBAIC0wLDAgKzEsMzQ0NyBAQAorLypDcmVhdGVkIG9uICAyMDA4LyA3LzE2LCAgNTozMSovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordTggcnRsODE5MF9md2Jvb3RfYXJyYXlbXSA9IHsKKzB4MTAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHhiZiwweGMwLDB4MjUsMHgwOCwweDAwLDB4MDgsCisweDNjLDB4MDksMHhiMCwweDAzLDB4YWQsMHgyOCwweDAwLDB4MjAsMHg0MCwweDgwLDB4NjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDBhLDB4ZDAsMHgwMCwweDQwLDB4OGEsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA4LDB4ODAsMHgwMSwKKzB4MjUsMHgwOCwweGIwLDB4NTAsMHgyNCwweDA5LDB4MDAsMHgwMSwweDNjLDB4MDEsMHg3ZiwweGZmLDB4MzQsMHgyMSwweGZmLDB4ZmYsCisweDAxLDB4MDEsMHg1MCwweDI0LDB4MDAsMHgwOSwweDQ4LDB4NDAsMHgzNSwweDI5LDB4MDAsMHgwMSwweDAxLDB4MmEsMHgxMCwweDJiLAorMHgxNCwweDQwLDB4ZmYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDAwLDB4MDAsMHgyNSwweDRhLDB4MDAsMHgwMCwKKzB4NGMsMHg4YSwweDAwLDB4MDAsMHg0YywweDg5LDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwOCwweDgwLDB4MDEsCisweDI1LDB4MDgsMHhiMCwweDUwLDB4M2MsMHgwMSwweDgwLDB4MDAsMHgwMSwweDIxLDB4NDgsMHgyNSwweDNjLDB4MGEsMHhiZiwweGMwLAorMHgyNSwweDRhLDB4MDAsMHg3YywweDNjLDB4MGIsMHhiMCwweDAzLDB4YWQsMHg2YSwweDAwLDB4MjAsMHhhZCwweDAwLDB4MDAsMHgwMCwKKzB4MjEsMHgwOCwweDAwLDB4MDQsMHgwMSwweDA5LDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGY4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDgsMHg4MCwweDAxLDB4MjUsMHgwOCwweDdmLDB4ZmYsMHgyNCwweDA5LDB4MDAsMHgwMSwweDNjLDB4MDEsMHg3ZiwweGZmLAorMHgzNCwweDIxLDB4ZmYsMHhmZiwweDAxLDB4MDEsMHg1MCwweDI0LDB4MDAsMHgwOSwweDQ4LDB4NDAsMHgzNSwweDI5LDB4MDAsMHgwMSwKKzB4MDEsMHgyYSwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDEsCisweDI1LDB4NGEsMHgwMCwweDAwLDB4M2MsMHgwMSwweDdmLDB4ZmYsMHgzNCwweDIxLDB4ZmYsMHhmZiwweDAxLDB4NDEsMHg1MCwweDI0LAorMHgzYywweDA5LDB4MDAsMHgwMSwweDM1LDB4MjksMHg3ZiwweGZmLDB4NGMsMHg4YSwweDIwLDB4MDAsMHg0YywweDg5LDB4MjgsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwOCwweDA0LDB4MTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHg4OCwweGEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDA4LDB4YmYsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwYSwweGJmLDB4YzAsMHgyNSwweDRhLDB4MDEsMHgyMCwweDNjLDB4MGIsMHhiMCwweDAzLDB4YWQsMHg2YSwweDAwLDB4MjAsCisweDNjLDB4MDgsMHhiMCwweDAzLDB4OGQsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM1LDB4MjksMHgwMCwweDEwLAorMHhhZCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwOCwweDgwLDB4MDAsMHgyNSwweDA4LDB4NGIsMHg4NCwKKzB4MDEsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCx9OworCit1OCBydGw4MTkwX2Z3bWFpbl9hcnJheVtdID0geworMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDQwLDB4MDQsMHg2OCwweDAwLDB4NDAsMHgwNSwweDcwLDB4MDAsMHg0MCwweDA2LDB4NDAsMHgwMCwweDBjLDB4MDAsMHgxMiwweDk0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MWEsMHg2OCwweDAwLDB4MzMsMHg1YiwweDAwLDB4M2MsMHgxNywweDYwLDB4MDAsMHgwOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDFiLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHg1YiwweGQwLDB4MjQsCisweDQwLDB4MWEsMHg3MCwweDAwLDB4MDMsMHg0MCwweDAwLDB4MDgsMHg0MiwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweGZmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHg4YywweDQzLDB4MDAsMHgwMCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDAwLDB4ZDAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MjEsMHgyNywweDg1LDB4OGIsMHg2MCwweDAwLDB4ODUsMHgxOCwweDIxLAorMHgyNCwweDg0LDB4MDAsMHgwMSwweDI4LDB4ODIsMHgwMCwweDBhLDB4MTQsMHg0MCwweGZmLDB4ZmMsMHhhMCwweDYwLDB4MDAsMHgwMCwKKzB4MjcsMHg4MiwweDhiLDB4NmEsMHgyNCwweDA0LDB4MDAsMHgwNiwweDI0LDB4ODQsMHhmZiwweGZmLDB4YTQsMHg0MCwweDAwLDB4MDAsCisweDA0LDB4ODEsMHhmZiwweGZkLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgyNCwweDAyLDB4MDAsMHgwMywweGEzLDB4ODIsMHg4YiwweDYwLAorMHgyNCwweDAyLDB4MDksMHhjNCwweDI0LDB4MDMsMHgwMSwweDAwLDB4YTcsMHg4MiwweDhiLDB4NzYsMHgyNCwweDAyLDB4MDQsMHgwMCwKKzB4YWYsMHg4MywweDhiLDB4NzgsMHhhZiwweDgyLDB4OGIsMHg3YywweDI0LDB4MDMsMHgwMCwweDBhLDB4MjQsMHgwMiwweDAwLDB4MDQsCisweDI0LDB4MDUsMHgwMCwweDAyLDB4MjQsMHgwNCwweDAwLDB4MDEsMHhhMywweDgzLDB4OGIsMHg2MiwweGEzLDB4ODIsMHg4YiwweDY4LAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMiwweDAwLDB4YTMsMHg4NCwweDhiLDB4NjYsMHhhMywweDg1LDB4OGIsMHg2OSwKKzB4YTcsMHg4MiwweDhiLDB4NmEsMHhhNywweDgzLDB4OGIsMHg2YywweGEzLDB4ODQsMHg4YiwweDYxLDB4YTMsMHg4MCwweDhiLDB4NjMsCisweGEzLDB4ODAsMHg4YiwweDY0LDB4YTMsMHg4MCwweDhiLDB4NjUsMHhhMywweDg1LDB4OGIsMHg2NywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4MDEsMHg4NCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHhhYywweDYyLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4YiwweDg4LDB4MDAsMHgwMCwweDEwLDB4MjEsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4MDAsMHgwMiwweDE2LDB4MDAsMHgwMCwweDAyLDB4MTYsMHgwMywweDI4LDB4NDMsMHgwMCwweDAzLAorMHhhYywweDgwLDB4ZmYsMHhmYywweGEwLDB4ODAsMHgwMCwweDAwLDB4MTQsMHg2MCwweGZmLDB4ZjksMHgyNCwweDg0LDB4MDAsMHgwYywKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDAxLDB4YzgsMHgzYywweDA4LDB4YjAsMHgwMywweGFjLDB4NjIsMHgwMCwweDAwLAorMHgzNSwweDA4LDB4MDAsMHg3MCwweDhkLDB4MDIsMHgwMCwweDAwLDB4MDAsMHhhMCwweDQ4LDB4MjEsMHgwMCwweDA0LDB4MjYsMHgwMCwKKzB4MDAsMHgwMiwweDJhLDB4NDMsMHgwMCwweDA2LDB4MzYsMHgwMCwweDAwLDB4MDcsMHgzZSwweDAwLDB4MDAsMHgwMiwweDEyLDB4MDMsCisweDI5LDB4MjMsMHgwMCwweDAzLDB4MDAsMHgwNCwweDU2LDB4MDMsMHgwMCwweDA2LDB4MzYsMHgwMywweDAwLDB4MDcsMHgzZSwweDAzLAorMHgzMCwweDQ4LDB4MDAsMHgwMSwweDEwLDB4NjAsMHgwMCwweDExLDB4MzAsMHhhNSwweDAwLDB4MDcsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MDAsMHg0OSwweDEwLDB4MjMsMHgwMCwweDQ1LDB4MTAsMHgwNywweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4NjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhMiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgyMSwweDQzLAorMHgxMSwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDcsMHgyMCwweDBiLDB4MTUsMHgyMCwweDAwLDB4MDYsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDEsMHgyMCwweGE0LDB4NDQsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHgyMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgwOCwweDAwLDB4MDAsMHg5NiwweDM0LDB4NDIsMHgwMSwweDI0LDB4M2MsMHgwMiwweGIwLDB4MDUsMHgwOCwweDAwLDB4MDAsMHg5NiwKKzB4MzQsMHg0MiwweDAxLDB4MjIsMHgxNSwweDIwLDB4MDAsMHg1NCwweDI0LDB4MDIsMHgwMCwweDAxLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDc0LDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHg4YiwweDg0LAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDcwLDB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg2YiwweDAwLDB4MDgsMHgxMSwweDYwLDB4MDAsMHgxOCwweDAwLDB4MDksMHgyOCwweDQwLDB4MDAsMHgwMCwweDQwLDB4MjEsCisweDI3LDB4ODUsMHg4YiwweDgwLDB4OGMsMHhhMywweDAwLDB4MDAsMHg4YywweGEyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDYyLDB4MzgsMHgyMywweDAwLDB4NDMsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4M2QsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWMsMHhhNywweDAwLDB4MDAsMHgyNSwweDAyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDQ2LDB4MDMsCisweDI5LDB4MDMsMHgwMCwweDAzLDB4MTQsMHg2MCwweGZmLDB4ZjMsMHgyNCwweGE1LDB4MDAsMHgwYywweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzNCwweDYzLDB4MDAsMHg3MCwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRiLDB4MTAsMHgyMywKKzB4YTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDA5LDB4MjgsMHg0MCwweDAwLDB4YTksMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4YiwweDg4LDB4MDAsMHgwYSwweDIwLDB4MGIsMHgwMCwweDQzLDB4MTgsMHgyMSwweDEwLDB4YzAsMHgwMCwweDA1LAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDgwLDB4NjIsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDMsCisweDAwLDB4YTksMHgxMCwweDIxLDB4MjQsMHgwNywweDAwLDB4MDEsMHgwMCwweGE5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgzMCwweDgwLAorMHgyNywweDgyLDB4OGIsMHg4OCwweGEwLDB4NjcsMHgwMCwweDAxLDB4MDAsMHhjMiwweDM4LDB4MjEsMHg4MCwweGUzLDB4MDAsMHgwMSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4MywweDhiLDB4ODAsCisweDAwLDB4YzMsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDIxLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDI3LDB4ODUsMHg4YiwweDg0LDB4MjcsMHg4MiwweDhiLDB4ODAsMHgwMCwweGM1LDB4MjgsMHgyMSwKKzB4MDAsMHhjMiwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwweDhjLDB4YTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NjQsMHgxOCwweDJhLDB4MTQsMHg2MCwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhMCwweGUyLDB4MDAsMHgwMCwweGEwLDB4ZTAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDAwLDB4YjksMHhhYywweGEwLDB4MDAsMHgwMCwweDExLDB4MjIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4N2MsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhZiwweDgzLDB4OGIsMHg5YywweDA4LDB4MDAsMHgwMCwweGE5LDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAwLDB4NzgsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWYsMHg4MywweDhiLDB4OTAsCisweDA4LDB4MDAsMHgwMCwweGE5LDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgwNCwweDE4LDB4M2MsMHgwNSwweGIwLDB4MDMsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4MzQsMHhhNSwweDAwLDB4NzAsMHg4YywweGEyLDB4MDAsMHgwMCwweDkwLDB4ODQsMHgwMCwweDA4LDB4M2MsMHgwNiwweGIwLDB4MDMsCisweDAwLDB4MDIsMHgxNiwweDAwLDB4MmMsMHg4MywweDAwLDB4MDMsMHgzNCwweGM2LDB4MDAsMHg3MiwweDI0LDB4MDcsMHgwMCwweDAxLAorMHgxMCwweDYwLDB4MDAsMHgxMSwweDAwLDB4MDIsMHgyZiwweGMyLDB4OTAsMHhjMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgyMSwKKzB4MDAsMHgwMiwweDE2LDB4MDAsMHgxMCwweGE3LDB4MDAsMHgwOSwweDAwLDB4MDIsMHgxNiwweDAzLDB4MTQsMHg4MCwweDAwLDB4MGMsCisweDMwLDB4NDMsMHgwMCwweDAzLDB4ODMsMHg4MiwweDhiLDB4ODgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDFlLDB4MDMsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAwLDB4NzIsMHhhMCwweDQzLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDUsMHgwMCwweDA1LDB4MTAsMHg4NywweDAwLDB4MDQsMHgzMCwweDQzLDB4MDAsMHgwNiwweDkzLDB4ODIsMHg4YiwweGEwLAorMHgwOCwweDAwLDB4MDEsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODMsMHg4MiwweDhiLDB4OTQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDEwLDB4NDAsMHgwOCwweDAwLDB4MDEsMHgyMSwweDAwLDB4NDUsMHgxMCwweDIxLDB4MTAsMHg4MCwweDAwLDB4MDUsCisweDAwLDB4MDAsMHgxOCwweDIxLDB4MjQsMHg2MywweDAwLDB4MDEsMHgwMCwweDY0LDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGZkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4MDQsMHhlYywweDNjLDB4MDQsMHhiMCwweDAyLDB4MzQsMHg2MywweDAwLDB4MjAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMSwweGFmLDB4ODQsMHg4YiwweGIwLAorMHhhMywweDgyLDB4OGIsMHhjMCwweGE3LDB4ODAsMHg4YiwweGI0LDB4YTcsMHg4MCwweDhiLDB4YjYsMHhhZiwweDgwLDB4OGIsMHhiOCwKKzB4YWYsMHg4MCwweDhiLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MDUsMHgyYywweDNjLDB4MDQsMHhiMCwweDAzLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDM0LDB4ODQsMHgwMCwweGFjLDB4ODAsMHhhMiwweDAwLDB4MTUsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZjAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGFjLDB4ODIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDEwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDIwLAorMHgyNCwweDYzLDB4MDUsMHg2NCwweDI3LDB4YmQsMHhmZiwweGUwLDB4YWMsMHg0MywweDAwLDB4MDAsMHhhZiwweGIxLDB4MDAsMHgxNCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxOCwweDhmLDB4OTAsMHg4YiwweGIwLDB4MGMsMHgwMCwweDAyLDB4OWEsCisweDAwLDB4ODAsMHg4OCwweDIxLDB4MTQsMHg0MCwweDAwLDB4MmEsMHgzYywweDAyLDB4MDAsMHg4MCwweDE2LDB4MjAsMHgwMCwweDAyLAorMHgzNCwweDQyLDB4MDIsMHgwMSwweDI0LDB4MDIsMHgwMiwweDAxLDB4YWUsMHgwMiwweDAwLDB4MDAsMHg5NywweDg0LDB4OGIsMHhiNCwKKzB4OTcsMHg4MiwweDhiLDB4YjYsMHgzYywweDAzLDB4YjAsMHgwMiwweDAwLDB4ODMsMHgyMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDQsCisweGE3LDB4ODIsMHg4YiwweGI2LDB4YTQsMHg4MiwweDAwLDB4MDAsMHg4ZiwweDg0LDB4OGIsMHhiOCwweDhmLDB4ODIsMHg4YiwweGIwLAorMHg5MywweDg1LDB4OGIsMHg2MiwweDI0LDB4ODQsMHgwMCwweDAxLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgyNCwweDAzLDB4OGYsMHhmZiwKKzB4M2MsMHgwNywweGIwLDB4MDYsMHgzYywweDA2LDB4YjAsMHgwMywweDAwLDB4NDMsMHgxMCwweDI0LDB4MDAsMHg4NSwweDI4LDB4MmEsCisweDM0LDB4ZTcsMHg4MCwweDE4LDB4YWYsMHg4MiwweDhiLDB4YjAsMHhhZiwweDg0LDB4OGIsMHhiOCwweDEwLDB4YTAsMHgwMCwweDA4LAorMHgzNCwweGM2LDB4MDEsMHgwOCwweDhmLDB4ODMsMHg4YiwweGJjLDB4OGYsMHg4NCwweDhiLDB4N2MsMHg4YywweGMyLDB4MDAsMHgwMCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyYiwweDE0LDB4NDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4ZTIsMHgwMCwweDAwLDB4M2MsMHgwMywweDBmLDB4MDAsMHgzYywweDA0LDB4MDQsMHgwMCwweDAwLDB4NDMsMHgxMCwweDI0LAorMHgxMCwweDQ0LDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA0LDB4OTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHhiZiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsCisweDI3LDB4YmQsMHhmZiwweGQ4LDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMCwweDI0LDB4NjMsMHgwNiwweDUwLAorMHhhZiwweGIwLDB4MDAsMHgxMCwweDM0LDB4NDIsMHgwMCwweDIwLDB4OGYsMHg5MCwweDhiLDB4YjAsMHhhYywweDQzLDB4MDAsMHgwMCwKKzB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiZiwweDAwLDB4MjAsCisweDAwLDB4ODAsMHg4OCwweDIxLDB4MDAsMHhhMCwweDkwLDB4MjEsMHgwYywweDAwLDB4MDIsMHg5YSwweDAwLDB4YzAsMHg5OCwweDIxLAorMHgyNCwweDA3LDB4OGYsMHhmZiwweDE0LDB4NDAsMHgwMCwweDE5LDB4MjYsMHgwMywweDAwLDB4MDQsMHgyNCwweDAyLDB4MGUsMHgwMywKKzB4YWUsMHgwMiwweDAwLDB4MDAsMHgwMCwweDY3LDB4ODAsMHgyNCwweDI2LDB4MDIsMHgwMCwweDA0LDB4YWUsMHgxMSwweDAwLDB4MDAsCisweDAwLDB4NDcsMHg4MCwweDI0LDB4OTcsMHg4NiwweDhiLDB4YjQsMHgyNiwweDAzLDB4MDAsMHgwNCwweGFlLDB4MTIsMHgwMCwweDAwLAorMHgwMCwweDY3LDB4ODAsMHgyNCwweGFlLDB4MTMsMHgwMCwweDAwLDB4OGYsMHg4NCwweDhiLDB4YjAsMHgzYywweDAyLDB4YjAsMHgwMiwKKzB4OTcsMHg4NSwweDhiLDB4YjYsMHgwMCwweGMyLDB4MzAsMHgyMSwweDhmLDB4ODIsMHg4YiwweGI4LDB4MjQsMHg4NCwweDAwLDB4MTAsCisweDI0LDB4YTUsMHgwMCwweDEwLDB4MDAsMHg4NywweDIwLDB4MjQsMHgyNCwweDQyLDB4MDAsMHgwMSwweGE3LDB4ODUsMHg4YiwweGI2LAorMHhhZiwweDg0LDB4OGIsMHhiMCwweGFmLDB4ODIsMHg4YiwweGI4LDB4YTQsMHhjNSwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgyMCwKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsMHg5NCwweDgyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4ZTAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDgyLDB4MDAsMHgwMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmYywweDAwLDB4ODIsMHgyOCwweDIxLDB4OGMsMHhhNCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHgwMCwweDcwLDB4OGMsMHhhNiwweDAwLDB4MDgsMHgwMCwweDgyLDB4MTAsMHgyMSwweDJjLDB4NDMsMHgwMCwweDA2LAorMHgxMCwweDYwLDB4MDAsMHgwOSwweDNjLDB4MDMsMHg4MCwweDAxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNCwweDYzLDB4MDEsMHhlOCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YWYsMHg4NiwweDgwLDB4MTQsMHg4ZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LDB4OGMsMHhhNCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTcsMHhiMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDEsMHhkZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDI0LDB4YWEsCisweDAwLDB4YzAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDAxLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDQsMHgwMCwweDAwLDB4OGYsMHg4MiwweDgwLDB4MTgsMHgzYywweDAzLDB4MDAsMHgwZiwKKzB4MzQsMHg2MywweDQyLDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4ODIsMHgyMCwweDJiLDB4MTAsMHg4MCwweDAwLDB4MDksCisweDI0LDB4MDMsMHgwMCwweDA1LDB4OGYsMHg4MiwweDgzLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLAorMHhhZiwweDgyLDB4ODMsMHgzMCwweDEwLDB4NDMsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDhjLDB4NjMsMHgwMSwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGEzLDB4ODIsMHg4MCwweDExLDB4YWYsMHg4MCwweDgzLDB4MzAsMHhhZiwweDgzLDB4ODAsMHgxOCwweDA4LDB4MDAsMHgwMSwweGZiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODQsMHgwMCwweGZmLDB4MTQsMHg4MCwweDAwLDB4MmYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweDgwLDB4MTQsMHhhMywweDg1LDB4ODMsMHg2MywweDEwLDB4NDAsMHgwMCwweDJiLDB4MmMsMHhhMiwweDAwLDB4MDQsCisweDE0LDB4NDAsMHgwMCwweDA2LDB4MDAsMHgwNSwweDEwLDB4NDAsMHgyNCwweGEyLDB4ZmYsMHhmYywweDJjLDB4NDIsMHgwMCwweDA4LAorMHgxMCwweDQwLDB4MDAsMHgwOSwweDI0LDB4YTIsMHhmZiwweGYwLDB4MDAsMHgwNSwweDEwLDB4NDAsMHgyNywweDg0LDB4ODMsMHg2YywKKzB4MDAsMHg0NCwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg2MywweDAwLDB4MDEsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTQsMHg0MywweDAwLDB4MDAsMHgyYywweDQyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDBhLAorMHgwMCwweDA1LDB4MTAsMHg0MCwweDI0LDB4YTIsMHhmZiwweGUwLDB4MmMsMHg0MiwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHgwNiwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgyNCwweGEyLDB4ZmYsMHhkMCwweDJjLDB4NDIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4MDksCisweDI0LDB4YTIsMHhmZiwweGMwLDB4MDAsMHgwNSwweDEwLDB4NDAsMHgyNywweDg0LDB4ODMsMHg2YywweDAwLDB4NDQsMHgxMCwweDIxLAorMHg5NCwweDQzLDB4ZmYsMHhmOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg2MywweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YTQsMHg0MywweGZmLDB4ZjgsMHgyYywweDQyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDA3LDB4MDAsMHgwNSwweDEwLDB4NDAsCisweDI3LDB4ODQsMHg4MywweDZjLDB4MDAsMHg0NCwweDEwLDB4MjEsMHg5NCwweDQzLDB4ZmYsMHhmOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDYzLDB4MDAsMHgwMSwweGE0LDB4NDMsMHhmZiwweGY4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4NiwweDhiLDB4YjAsMHg4ZiwweDgyLDB4ODAsMHgxNCwweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsCisweDEwLDB4NDAsMHgwMCwweDJhLDB4MDAsMHhjMCwweDM4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwNywweDI0LDB4MDMsMHhmZiwweDljLAorMHhhMywweDgyLDB4ODMsMHg2YiwweGEzLDB4ODMsMHg4MywweDZhLDB4MjcsMHg4YSwweDgzLDB4NjgsMHgwMCwweDAwLDB4MjAsMHgyMSwKKzB4MjQsMHgwOSwweDhmLDB4ZmYsMHgwMCwweDA0LDB4MTAsMHg4MCwweDAwLDB4NGEsMHgyOCwweDIxLDB4OGMsMHhhMiwweDAwLDB4MDAsCisweDI0LDB4ZTMsMHgwMCwweDA0LDB4MjQsMHg4OCwweDAwLDB4MDEsMHhhYywweGUyLDB4MDAsMHgwMCwweDEwLDB4ODAsMHgwMCwweDAyLAorMHgwMCwweDY5LDB4MzgsMHgyNCwweGFjLDB4YTAsMHgwMCwweDAwLDB4MzEsMHgwNCwweDAwLDB4ZmYsMHgyYywweDgyLDB4MDAsMHgyNywKKzB4MTQsMHg0MCwweGZmLDB4ZjUsMHgwMCwweDA0LDB4MTAsMHg4MCwweDk3LDB4ODMsMHg4YiwweGI2LDB4OTcsMHg4NSwweDhiLDB4YjQsCisweDNjLDB4MDIsMHhiMCwweDAyLDB4MjQsMHg2MywweDAwLDB4OWMsMHgwMCwweGEyLDB4MjgsMHgyMSwweDNjLDB4MDQsMHhiMCwweDA2LAorMHhhNywweDgzLDB4OGIsMHhiNiwweDM0LDB4ODQsMHg4MCwweDE4LDB4YTQsMHhhMywweDAwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDhmLDB4ZmYsMHgyNCwweGM2LDB4MDAsMHg5YywweDNjLDB4MDMsMHgwZiwweDAwLDB4MDAsMHhjMiwweDMwLDB4MjQsCisweDAwLDB4YTMsMHgyOCwweDI0LDB4M2MsMHgwMiwweDA0LDB4MDAsMHhhZiwweDg2LDB4OGIsMHhiMCwweDEwLDB4YTIsMHgwMCwweDAzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNCwweDk4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LDB4OGYsMHg4NiwweDhiLDB4YjAsCisweDI3LDB4YmQsMHhmZiwweGM4LDB4MjQsMHgwMiwweDAwLDB4MDgsMHgyNCwweDAzLDB4MDAsMHgyMCwweGFmLDB4YmYsMHgwMCwweDMwLAorMHhhMywweGEyLDB4MDAsMHgxMywweGEzLDB4YTMsMHgwMCwweDEyLDB4YTcsMHhhNCwweDAwLDB4MTAsMHgwMCwweGMwLDB4MjgsMHgyMSwKKzB4MjcsMHhhOSwweDAwLDB4MTAsMHgwMCwweDAwLDB4MzgsMHgyMSwweDI0LDB4MDgsMHg4ZiwweGZmLDB4MDAsMHgwNywweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgyNCwweGUzLDB4MDAsMHgwMSwweDMwLDB4NjcsMHgwMCwweGZmLAorMHgyNCwweGEyLDB4MDAsMHgwNCwweDJjLDB4ZTMsMHgwMCwweDA4LDB4YWMsMHhhNCwweDAwLDB4MDAsMHgxNCwweDYwLDB4ZmYsMHhmNywKKzB4MDAsMHg0OCwweDI4LDB4MjQsMHg5NywweDgzLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LDB4M2MsMHgwMiwweGIwLDB4MDIsCisweDI0LDB4NjMsMHgwMCwweDIwLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGI2LAorMHgzNCwweDg0LDB4ODAsMHgxOCwweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwKKzB4MjQsMHhjNiwweDAwLDB4MjAsMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHgzMCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsCisweDNjLDB4MDIsMHgwNCwweDAwLDB4YWYsMHg4NiwweDhiLDB4YjAsMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDQsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgzOCwweDkzLDB4ODIsMHg4YiwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDExLDB4MjQsMHgwNiwweDAwLDB4MDEsMHg4ZiwweDgyLDB4OGIsMHhiOCwweDNjLDB4MDUsMHhiMCwweDA2LAorMHgzYywweDA0LDB4YjAsMHgwMywweDM0LDB4YTUsMHg4MCwweDE4LDB4MzQsMHg4NCwweDAxLDB4MDgsMHgxNCwweDQwLDB4MDAsMHgwOSwKKzB4MDAsMHgwMCwweDMwLDB4MjEsMHg5NywweDgyLDB4OGIsMHhiNCwweDhjLDB4ODQsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDIsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YWYsMHg4NCwweDhiLDB4YmMsMHhhNywweDgwLDB4OGIsMHhiNiwweGFjLDB4NDAsMHgwMCwweDAwLAorMHhhYywweDQwLDB4MDAsMHgwNCwweDhjLDB4YTIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweGMwLDB4MTAsMHgyMSwKKzB4OGYsMHg4NiwweDhiLDB4YjAsMHg4ZiwweDgyLDB4OGIsMHhiOCwweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTAsCisweDAwLDB4YzAsMHg0MCwweDIxLDB4MTQsMHg0MCwweDAwLDB4MGEsMHgwMCwweDQwLDB4NTAsMHgyMSwweDAwLDB4MDAsMHgzOCwweDIxLAorMHgyNywweDg5LDB4ODMsMHgzOCwweDI0LDB4ZTIsMHgwMCwweDAxLDB4MDAsMHgwNywweDE4LDB4ODAsMHgzMCwweDQ3LDB4MDAsMHhmZiwKKzB4MDAsMHg2OSwweDE4LDB4MjEsMHgyYywweGUyLDB4MDAsMHgwYSwweDE0LDB4NDAsMHhmZiwweGZhLDB4YWMsMHg2MCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHgwMCwweDgwLDB4MTAsMHg4MiwweDAwLDB4NmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk3LDB4ODIsMHg4MywweDNlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLDB4YTcsMHg4MiwweDgzLDB4M2UsMHg5MCwweGEzLDB4MDAsMHgxNSwKKzB4OTcsMHg4MiwweDgzLDB4NDAsMHgwMCwweDAzLDB4MWUsMHgwMCwweDAwLDB4MDMsMHgxZSwweDAzLDB4MDAsMHg0MywweDEwLDB4MjEsCisweGE3LDB4ODIsMHg4MywweDQwLDB4OGMsMHhhNCwweDAwLDB4MjAsMHgzYywweDAyLDB4MDAsMHg2MCwweDNjLDB4MDMsMHgwMCwweDIwLAorMHgwMCwweDgyLDB4MjAsMHgyNCwweDEwLDB4ODMsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDgwLDB4MDAsMHg0NywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NywweDgyLDB4ODMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsCisweGE3LDB4ODIsMHg4MywweDQ0LDB4ODQsMHhhMywweDAwLDB4MDYsMHg4ZiwweDgyLDB4ODMsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGFmLDB4ODIsMHg4MywweDU0LDB4MjUsMHg0MiwweDAwLDB4MDEsMHgyOCwweDQzLDB4MjcsMHgxMCwKKzB4YWYsMHg4MiwweDhiLDB4YjgsMHgxMCwweDYwLDB4MDAsMHgwOSwweDI0LDB4MDIsMHgwMCwweDA0LDB4OTMsMHg4MywweDgwLDB4MTEsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHg2MiwweDAwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwNCwweDhmLDB4YmYsMHgwMCwweDEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgyNCwweDAzLDB4MDAsMHgyOCwKKzB4YTMsMHg4MywweDgzLDB4M2EsMHhhMywweDgyLDB4ODMsMHgzYiwweDkwLDB4YTIsMHgwMCwweDE4LDB4OTMsMHg4MywweDgzLDB4NjMsCisweDAwLDB4MDAsMHgzOCwweDIxLDB4MDAsMHgwMiwweDE2LDB4MDAsMHgwMCwweDAyLDB4MTYsMHgwMywweGE3LDB4ODIsMHg4MywweDRlLAorMHhhMywweDgzLDB4ODMsMHg1YywweDI3LDB4ODksMHg4MywweDM4LDB4MjQsMHgwNSwweDhmLDB4ZmYsMHgwMCwweDA3LDB4MTAsMHg4MCwKKzB4MDAsMHg0OSwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDI0LDB4ZTMsMHgwMCwweDAxLDB4MzAsMHg2NywweDAwLDB4ZmYsCisweDI1LDB4MDIsMHgwMCwweDA0LDB4MmMsMHhlMywweDAwLDB4MGEsMHhhZCwweDA0LDB4MDAsMHgwMCwweDE0LDB4NjAsMHhmZiwweGY3LAorMHgwMCwweDQ1LDB4NDAsMHgyNCwweDk3LDB4ODMsMHg4YiwweGI2LDB4OTcsMHg4NSwweDhiLDB4YjQsMHgzYywweDAyLDB4YjAsMHgwMiwKKzB4MjQsMHg2MywweDAwLDB4MjgsMHgwMCwweGEyLDB4MjgsMHgyMSwweDNjLDB4MDQsMHhiMCwweDA2LDB4YTcsMHg4MywweDhiLDB4YjYsCisweDM0LDB4ODQsMHg4MCwweDE4LDB4YTQsMHhhMywweDAwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwMCwweDI0LDB4MDIsMHg4ZiwweGZmLAorMHgyNCwweGM2LDB4MDAsMHgyOCwweDNjLDB4MDMsMHgwZiwweDAwLDB4MDAsMHhjMiwweDMwLDB4MjQsMHgwMCwweGEzLDB4MjgsMHgyNCwKKzB4M2MsMHgwMiwweDA0LDB4MDAsMHhhZiwweDg2LDB4OGIsMHhiMCwweDEwLDB4YTIsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNCwweDk4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDIsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhMywweDgwLDB4ODAsMHgxMSwweDA4LDB4MDAsMHgwMiwweGU3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NywweDgyLDB4ODMsMHg0NiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwweGE3LDB4ODIsMHg4MywweDQ2LDB4ODQsMHhhMywweDAwLDB4MDYsCisweDhmLDB4ODIsMHg4MywweDU4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGFmLDB4ODIsMHg4MywweDU4LAorMHgwOCwweDAwLDB4MDIsMHhkZiwweDI1LDB4NDIsMHgwMCwweDAxLDB4OTcsMHg4MiwweDgzLDB4NDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDgyLDB4ODMsMHg0MiwweDg0LDB4YTMsMHgwMCwweDA2LDB4OGYsMHg4MiwweDgzLDB4NTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDgyLDB4ODMsMHg1MCwweDA4LDB4MDAsMHgwMiwweGRmLAorMHgyNSwweDQyLDB4MDAsMHgwMSwweDk3LDB4ODIsMHg4MywweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwKKzB4YTcsMHg4MiwweDgzLDB4M2MsMHgwOCwweDAwLDB4MDIsMHhjNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDAsCisweGFmLDB4YmYsMHgwMCwweDI4LDB4OGMsMHhhMywweDAwLDB4MjAsMHg4ZiwweDhhLDB4OGIsMHhiMCwweDNjLDB4MDIsMHgwMCwweDEwLAorMHgwMCwweDYyLDB4MTAsMHgyNCwweDAwLDB4YTAsMHgzOCwweDIxLDB4MDEsMHg0MCwweDQ4LDB4MjEsMHgxMCwweDQwLDB4MDAsMHgzZCwKKzB4MDAsMHg4MCwweDI4LDB4MjEsMHg4YywweGU0LDB4MDAsMHgxYywweDM0LDB4YTUsMHgxMiwweDA2LDB4YWYsMHhhNSwweDAwLDB4MTAsCisweDhjLDB4ODIsMHgwMCwweDA4LDB4MDAsMHgwMywweDFjLDB4NDIsMHgzMCwweDYzLDB4MDAsMHgzMCwweDAwLDB4MDIsMHgxMywweDAyLAorMHgzMCwweDQyLDB4MDAsMHg0MCwweDAwLDB4NDMsMHgxMCwweDI1LDB4OTAsMHhlNiwweDAwLDB4MTAsMHg5MCwweGU0LDB4MDAsMHgxMywKKzB4OTQsMHhlOCwweDAwLDB4MGMsMHg5NCwweGUzLDB4MDAsMHgxYSwweDAwLDB4MDIsMHgxNiwweDAwLDB4OTAsMHhlNywweDAwLDB4MTIsCisweDAwLDB4YTIsMHgyOCwweDI1LDB4MjQsMHgwMiwweDEyLDB4MzQsMHhhNywweGEyLDB4MDAsMHgxYywweDI0LDB4MDIsMHg1NiwweDc4LAorMHhhZiwweGE1LDB4MDAsMHgxMCwweGEzLDB4YTYsMHgwMCwweDE4LDB4YTMsMHhhNywweDAwLDB4MWYsMHhhNywweGEzLDB4MDAsMHgxYSwKKzB4YTMsMHhhNCwweDAwLDB4MTksMHhhNywweGE4LDB4MDAsMHgyMCwweGE3LDB4YTIsMHgwMCwweDIyLDB4MDAsMHgwMCwweDI4LDB4MjEsCisweDI3LDB4YTcsMHgwMCwweDEwLDB4MjQsMHgwNiwweDhmLDB4ZmYsMHgwMCwweDA1LDB4MTAsMHg4MCwweDAwLDB4NDcsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDI0LDB4YTMsMHgwMCwweDAxLDB4MzAsMHg2NSwweDAwLDB4ZmYsMHgyNSwweDIyLDB4MDAsMHgwNCwKKzB4MmMsMHhhMywweDAwLDB4MDUsMHhhZCwweDI0LDB4MDAsMHgwMCwweDE0LDB4NjAsMHhmZiwweGY3LDB4MDAsMHg0NiwweDQ4LDB4MjQsCisweDk3LDB4ODMsMHg4YiwweGI2LDB4OTcsMHg4NSwweDhiLDB4YjQsMHgzYywweDAyLDB4YjAsMHgwMiwweDI0LDB4NjMsMHgwMCwweDE0LAorMHgwMCwweGEyLDB4MjgsMHgyMSwweDNjLDB4MDQsMHhiMCwweDA2LDB4YTcsMHg4MywweDhiLDB4YjYsMHgzNCwweDg0LDB4ODAsMHgxOCwKKzB4YTQsMHhhMywweDAwLDB4MDAsMHg4YywweDg1LDB4MDAsMHgwMCwweDI0LDB4MDIsMHg4ZiwweGZmLDB4MjUsMHg0NiwweDAwLDB4MTQsCisweDNjLDB4MDMsMHgwZiwweDAwLDB4MDAsMHhjMiwweDUwLDB4MjQsMHgwMCwweGEzLDB4MjgsMHgyNCwweDNjLDB4MDIsMHgwNCwweDAwLAorMHhhZiwweDhhLDB4OGIsMHhiMCwweDEwLDB4YTIsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDQsMHg5OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgyOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDMwLDB4M2MsMHgwNSwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGM4LAorMHgwMCwweDA0LDB4MjIsMHgwMCwweDM0LDB4YTUsMHgwMCwweDIwLDB4MjQsMHg0MiwweDBlLDB4MDQsMHgzYywweDAzLDB4YjAsMHgwMCwKKzB4YWYsMHhiNSwweDAwLDB4MjQsMHhhZiwweGI0LDB4MDAsMHgyMCwweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMCwweDAwLDB4MTAsCisweGFmLDB4YmYsMHgwMCwweDMwLDB4MDAsMHg4MywweDgwLDB4MjEsMHhhZiwweGI3LDB4MDAsMHgyYywweGFmLDB4YjYsMHgwMCwweDI4LAorMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjEsMHgwMCwweDE0LDB4YWMsMHhhMiwweDAwLDB4MDAsMHg4ZSwweDA5LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDkwLDB4MjEsMHgyNiwweDEwLDB4MDAsMHgwOCwweDAwLDB4MDksMHhhNiwweDAyLDB4MTIsMHg4MCwweDAwLDB4MTMsCisweDAwLDB4MDAsMHhhOCwweDIxLDB4MjQsMHgxMywweDAwLDB4MDIsMHgzYywweDE2LDB4MDAsMHhmZiwweDNjLDB4MTcsMHhmZiwweDAwLAorMHg4ZSwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOSwweDEyLDB4MDIsMHgyNCwweDQyLDB4MDAsMHgwMiwKKzB4MzEsMHgyNSwweDAwLDB4ZmYsMHgxMCwweGIzLDB4MDAsMHg3NiwweDMwLDB4NTEsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDEwLDB4YTIsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDUxLDB4MTAsMHgyMSwweDMwLDB4NTIsMHhmZiwweGZmLAorMHgwMiwweDU0LDB4MTgsMHgyYiwweDE0LDB4NjAsMHhmZiwweGYyLDB4MDIsMHgxMSwweDgwLDB4MjEsMHgxMiwweGEwLDB4MDAsMHgwYSwKKzB4M2MsMHgwMiwweGIwLDB4MDYsMHgzNCwweDQyLDB4ODAsMHgxOCwweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweDBmLDB4MDAsCisweDNjLDB4MDIsMHgwNCwweDAwLDB4MDAsMHg2NCwweDE4LDB4MjQsMHgxMCwweDYyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDQsMHg5OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MzAsMHg3YiwweGI2LDB4MDEsMHg3YywKKzB4N2IsMHhiNCwweDAxLDB4M2MsMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDM4LDB4OGUsMHgwOSwweDAwLDB4MDQsMHgyNCwweDE1LDB4MDAsMHgwMSwweDhlLDB4MDYsMHgwMCwweDBjLAorMHgwMCwweDA5LDB4MTEsMHg0MiwweDAwLDB4MDksMHgxOCwweGMyLDB4MzAsMHg0OCwweDAwLDB4MDMsMHgwMCwweDA5LDB4MTQsMHgwMiwKKzB4MzAsMHg2YywweDAwLDB4MDMsMHgwMCwweDA5LDB4MjYsMHgwMiwweDExLDB4MTUsMHgwMCwweDQ1LDB4MzAsMHg0MywweDAwLDB4MGYsCisweDI5LDB4MDIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4MTMsMHgwMCwweDBmLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4MDcsMHgyMiwweDAyLDB4MzAsMHg4NCwweGZmLDB4MDAsMHgzYywweDAzLDB4MDAsMHhmZiwKKzB4MDAsMHgwNywweDJlLDB4MDIsMHgwMCwweDA3LDB4MTIsMHgwMCwweDAwLDB4NDMsMHgxMCwweDI0LDB4MDAsMHhhNCwweDI4LDB4MjUsCisweDAwLDB4YTIsMHgyOCwweDI1LDB4MDAsMHgwNywweDFlLDB4MDAsMHgwMCwweGEzLDB4MjgsMHgyNSwweDBjLDB4MDAsMHgwMSwweDk0LAorMHgwMSwweDIwLDB4MjAsMHgyMSwweDA4LDB4MDAsMHgwMywweGE3LDB4MDIsMHg1MSwweDEwLDB4MjEsMHgxMSwweDk1LDB4MDAsMHgwZiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDg4LDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4YiwweDYwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ3LDB4MDAsMHgxOCwweDA4LDB4MDAsMHgwMywweGNlLAorMHgwMCwweDA3LDB4MjIsMHgwMiwweDAwLDB4MDQsMHgxMCwweDQwLDB4MjcsMHg4MywweDhiLDB4NjgsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTQsMHg0NywweDAwLDB4MDIsMHgwOCwweDAwLDB4MDMsMHhjZSwweDAwLDB4MDcsMHgyMiwweDAyLDB4MjcsMHg4MiwweDhiLDB4NjAsCisweDAwLDB4ODIsMHgxMCwweDIxLDB4OTAsMHg0NywweDAwLDB4MDAsMHgwOCwweDAwLDB4MDMsMHhjZSwweDAwLDB4MDcsMHgyMiwweDAyLAorMHgxNSwweDAwLDB4ZmYsMHhkYywweDAwLDB4MDAsMHgzOCwweDIxLDB4MTAsMHg3NSwweDAwLDB4MDUsMHgwMCwweDgwLDB4MzgsMHgyMSwKKzB4MDAsMHg2NSwweDE4LDB4MjYsMHgyNCwweDgyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgzOCwweDIxLDB4MDAsMHg0MywweDM4LDB4MGEsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTEsMHg4MiwweDAwLDB4MGUsMHgzYywweDAyLDB4YjAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMSwweDgyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgwMCwweGUyLDB4MTAsMHgyMSwKKzB4OGMsMHg0NywweDAwLDB4MDAsMHgwOCwweDAwLDB4MDMsMHhjZSwweDAwLDB4MDcsMHgyMiwweDAyLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDAwLDB4ZTIsMHgxMCwweDIxLDB4OTQsMHg0MywweDAwLDB4MDAsMHgwOCwweDAwLDB4MDMsMHhjZCwweDMwLDB4NjcsMHhmZiwweGZmLAorMHgwMCwweGUyLDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4Y2QsMHgzMCwweDY3LDB4MDAsMHhmZiwKKzB4MzAsMHg2MiwweDAwLDB4MDMsMHgwMCwweDAyLDB4MTIsMHgwMCwweDExLDB4OTUsMHgwMCwweDA3LDB4MDAsMHg0NCwweDM4LDB4MjEsCisweDExLDB4OTMsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDMsMHhmZiwweDNjLDB4MDIsMHhiMCwweDBhLAorMHgwOCwweDAwLDB4MDQsMHgwNCwweDNjLDB4MDIsMHhiMCwweDBhLDB4MDgsMHgwMCwweDA0LDB4MDgsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4OGUsMHgwOSwweDAwLDB4MDQsMHg4ZSwweDAyLDB4MDAsMHgwOCwweDhlLDB4MDMsMHgwMCwweDBjLDB4MDAsMHgwOSwweDQxLDB4NDIsCisweDAwLDB4MDIsMHgyMiwweDAyLDB4MDAsMHgwMywweDNhLDB4MDIsMHgzMCwweDg0LDB4ZmYsMHgwMCwweDMwLDB4ZTcsMHhmZiwweDAwLAorMHgwMCwweDAyLDB4NWUsMHgwMiwweDAwLDB4MDIsMHgzMiwweDAwLDB4MDAsMHgwMywweDU2LDB4MDIsMHgwMCwweDAzLDB4MmEsMHgwMCwKKzB4MDEsMHg2NCwweDU4LDB4MjUsMHgwMCwweGQ2LDB4MzAsMHgyNCwweDAxLDB4NDcsMHg1MCwweDI1LDB4MDAsMHgwMiwweDE2LDB4MDAsCisweDAwLDB4YjYsMHgyOCwweDI0LDB4MDAsMHgwMywweDFlLDB4MDAsMHgwMSwweDY2LDB4NTgsMHgyNSwweDAxLDB4NDUsMHg1MCwweDI1LAorMHgwMCwweDU3LDB4MTAsMHgyNCwweDAwLDB4NzcsMHgxOCwweDI0LDB4MDEsMHg2MiwweDM4LDB4MjUsMHgwMSwweDQzLDB4MzAsMHgyNSwKKzB4MDAsMHgwOSwweDEwLDB4YzIsMHgwMCwweDA5LDB4MWMsMHgwMiwweDMxLDB4MDgsMHgwMCwweDAzLDB4MzAsMHg0YywweDAwLDB4MDMsCisweDMwLDB4NjMsMHgwMCwweDBmLDB4MDAsMHgwOSwweDI2LDB4MDIsMHgwMCwweGUwLDB4NTgsMHgyMSwweDE1LDB4MDAsMHgwMCwweDI4LAorMHgwMCwweGMwLDB4NTAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHg2MiwweDAwLDB4MDYsMHgwMCwweDgwLDB4MjgsMHgyMSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNCwweDYyLDB4ZmYsMHg2OSwweDAyLDB4NTEsMHgxMCwweDIxLDB4MjQsMHg4NSwweDAxLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTEsMHg4MiwweDAwLDB4MTUsMHgyNCwweDAyLDB4MDAsMHgwMiwweDExLDB4ODIsMHgwMCwweDBhLAorMHgzYywweDAzLDB4YjAsMHgwMywweDAwLDB4YTMsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDBhLDB4MjAsMHgyNywKKzB4MDEsMHg2YSwweDI4LDB4MjQsMHgwMCwweDQ0LDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgwMywweGE3LDB4MDIsMHg1MSwweDEwLDB4MjEsMHgwMCwweGEzLDB4MTgsMHgyMSwweDk0LDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDBhLDB4MjAsMHgyNywweDAxLDB4NmEsMHgyOCwweDI0LDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwKKzB4YTQsMHg2MiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDMsMHhhNywweDAyLDB4NTEsMHgxMCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDAwLDB4YTMsMHgxOCwweDIxLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDBhLDB4MjAsMHgyNywweDAxLDB4NmEsMHgyOCwweDI0LAorMHgwMCwweDQ0LDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4MDgsMHgwMCwweDAzLDB4YTYsMHhhMCwweDYyLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMSwweDAyLDB4MDAsMHgyMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTUsMHgxMywweGZmLDB4NDIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHg4MiwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4ODgsMHgwMCwweDBiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg4YiwweDYwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgzLDB4MjAsMHgyMSwKKzB4OGMsMHg4MiwweDAwLDB4MTgsMHgwMCwweDA2LDB4MTgsMHgyNywweDAwLDB4ZTYsMHgyOCwweDI0LDB4MDAsMHg0MywweDEwLDB4MjQsCisweDAwLDB4NDUsMHgxMCwweDI1LDB4MDgsMHgwMCwweDAzLDB4YTYsMHhhYywweDgyLDB4MDAsMHgxOCwweDI3LDB4ODMsMHg4YiwweDY4LAorMHgwMCwweDA0LDB4MjAsMHg0MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDIsMHgwMCwweDA2LDB4MTgsMHgyNywKKzB4MDAsMHhlNiwweDI4LDB4MjQsMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4MDgsMHgwMCwweDAzLDB4YTYsCisweGE0LDB4ODIsMHgwMCwweDAyLDB4MjcsMHg4MywweDhiLDB4NjAsMHgwMCwweDgzLDB4MTgsMHgyMSwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDA2LDB4MjAsMHgyNywweDA4LDB4MDAsMHgwNCwweDVjLDB4MDAsMHhlNiwweDI4LDB4MjQsMHgzMCwweDYyLDB4MDAsMHgwNywKKzB4MDAsMHgwMiwweDEyLDB4MDAsMHgxMSwweDg4LDB4MDAsMHgwZiwweDAwLDB4NDQsMHgxMCwweDIxLDB4MTEsMHg5MywweDAwLDB4MDcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MGEsMHgwMCwweDQzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDA2LDB4MjAsMHgyNywweDA4LDB4MDAsMHgwNCwweDQ5LDB4MDAsMHhlNiwweDI4LDB4MjQsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHg0MywweDE4LDB4MjEsMHg5NCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgyMCwweDI3LDB4MDgsMHgwMCwweDA0LDB4NTIsCisweDAwLDB4ZTYsMHgyOCwweDI0LDB4M2MsMHgwMywweGIwLDB4MGEsMHgwOCwweDAwLDB4MDQsMHg3ZiwweDAwLDB4NDMsMHgxOCwweDIxLAorMHg5NywweDg1LDB4OGIsMHhiNCwweDNjLDB4MDcsMHhiMCwweDAyLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MDAsMHhhNywweDI4LDB4MjEsMHgzNCwweDg0LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgxMiwweDYwLDB4MjQsMHgwMywweGZmLDB4ODAsCisweGFjLDB4ODIsMHgwMCwweDAwLDB4YTAsMHhhMywweDAwLDB4MDcsMHg5NywweDgyLDB4OGIsMHhiNiwweDk3LDB4ODUsMHg4YiwweGI0LAorMHgzYywweDA2LDB4YjAsMHgwNiwweDMwLDB4NDIsMHhmZiwweGY4LDB4MjQsMHg0MiwweDAwLDB4MTAsMHgwMCwweGEyLDB4MTAsMHgyMSwKKzB4MzAsMHg0MiwweDBmLDB4ZmYsMHgyNCwweDQ0LDB4MDAsMHgwOCwweDMwLDB4ODQsMHgwZiwweGZmLDB4MDAsMHgwNSwweDI4LDB4YzIsCisweDNjLDB4MDMsMHgwMCwweDQwLDB4MDAsMHhhMywweDI4LDB4MjUsMHgwMCwweDg3LDB4MjAsMHgyMSwweDM0LDB4YzYsMHg4MCwweDE4LAorMHhhYywweGM1LDB4MDAsMHgwMCwweGFmLDB4ODQsMHg4YiwweGIwLDB4YTcsMHg4MiwweDhiLDB4YjQsMHhhNywweDgwLDB4OGIsMHhiNiwKKzB4YWYsMHg4MCwweDhiLDB4YjgsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNSwweDAwLDB4ZmYsCisweDMwLDB4ODQsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweGUwLDB4NDgsMHgyMSwweDMwLDB4YzYsMHgwMCwweGZmLAorMHg4ZiwweGE3LDB4MDAsMHgxMCwweDEwLDB4ODIsMHgwMCwweDA3LDB4MDAsMHhhMCwweDQwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTAsMHg4MiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4YTgsMHgwMSwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAwLDB4MDcsMHgyMCwweDI3LAorMHgwMSwweDI3LDB4MjgsMHgyNCwweDEwLDB4YzIsMHgwMCwweDE0LDB4MDEsMHgwMywweDE4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhjMiwweDAwLDB4MDksMHgwMCwweDA3LDB4NTAsMHgyNywweDNjLDB4MDMsMHhiMCwweDAzLDB4MDEsMHgwMywweDE4LDB4MjEsCisweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LAorMHgwOCwweDAwLDB4MDQsMHhlMywweGFjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgwMSwweDAzLDB4MTgsMHgyMSwKKzB4OTQsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTQsMHg2MiwweDAwLDB4MDAsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDQ0LDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4YTAsMHg2MiwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDg0LDB4MDAsMHgwNywweDAwLDB4MDQsMHgyMiwweDAwLDB4MzAsMHhhNSwweDAwLDB4ZmYsCisweDAwLDB4ODUsMHgyOCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MGEsMHgwMCwweGEyLDB4NDAsMHgyMSwweDMwLDB4YzYsMHgwMCwweGZmLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDhmLDB4YTQsMHgwMCwweDEwLDB4MTAsMHhjMiwweDAwLDB4MTQsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MDAsMHgwNCwweDUwLDB4MjcsMHgxMCwweGMyLDB4MDAsMHgwOSwweDAwLDB4ZTQsMHg0OCwweDI0LDB4M2MsMHgwMywweGIwLDB4MGEsCisweDAwLDB4YTMsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LAorMHgwMCwweDQ5LDB4MTAsMHgyNSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHhhMywweDE4LDB4MjEsMHg5NCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YSwweDEwLDB4MjQsCisweDAwLDB4NDksMHgxMCwweDI1LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNCwweDYyLDB4MDAsMHgwMCwweDkxLDB4MDIsMHgwMCwweDAwLAorMHgwMCwweDA0LDB4MTgsMHgyNywweDAwLDB4ZTQsMHgyMCwweDI0LDB4MDAsMHg0MywweDEwLDB4MjQsMHgwMCwweDQ0LDB4MTAsMHgyNSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDAyLDB4MDAsMHgwMCwweDMwLDB4YTksMHgwMCwweGZmLDB4MjcsMHg4MywweDhiLDB4NjAsCisweDMwLDB4ODUsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweDA3LDB4NTAsMHgyNywweDAwLDB4YzcsMHg0MCwweDI0LAorMHgxMSwweDIyLDB4MDAsMHgxNywweDAwLDB4YTMsMHgxOCwweDIxLDB4MDAsMHgwNSwweDIwLDB4NDAsMHgyNywweDgyLDB4OGIsMHg2MCwKKzB4MDAsMHgwNSwweDI4LDB4ODAsMHgyNywweDgzLDB4OGIsMHg2OCwweDAwLDB4ODMsMHg1MCwweDIxLDB4MDAsMHhhMiwweDIwLDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MDAsMHgwNywweDQwLDB4MjcsMHgxMSwweDIyLDB4MDAsMHgwNywweDAwLDB4YzcsMHgyOCwweDI0LAorMHg4YywweDgyLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDgyLDB4MDAsMHgxOCwweDk1LDB4NDIsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDgsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwweGE1LDB4NDIsMHgwMCwweDAyLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YSwweDEwLDB4MjQsMHgwMCwweDQ4LDB4MTAsMHgyNSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgzMiwweDAyLDB4MzAsMHhjNiwweGZmLDB4MDAsCisweDAwLDB4MDQsMHgxNiwweDAyLDB4MDAsMHgwNCwweDFhLDB4MDAsMHgzYywweDA1LDB4MDAsMHhmZiwweDAwLDB4NjUsMHgxOCwweDI0LAorMHgwMCwweDQ2LDB4MTAsMHgyNSwweDAwLDB4NDMsMHgxMCwweDI1LDB4MDAsMHgwNCwweDI2LDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHg0NCwweDEwLDB4MjUsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTgsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDE0LDB4ZTQsMHgzYywweDA0LDB4YjAsMHgwMywweGFmLDB4YmYsMHgwMCwweDE0LAorMHhhYywweDYyLDB4MDAsMHgwMCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MzQsMHg4NCwweDAwLDB4MmMsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4YTcsMHg4MCwweGJiLDB4ZjAsMHgwMCwweDAzLDB4MTIsMHgwMiwweDAwLDB4MDMsMHgyZCwweDAyLDB4MzAsMHg0MiwweDBmLDB4ZmYsCisweGEzLDB4ODMsMHhiYiwweGY4LDB4YTcsMHg4NSwweGJiLDB4ZmMsMHhhNywweDgyLDB4YmIsMHhmYSwweGE3LDB4ODAsMHhiYiwweGYyLAorMHhhNywweDgwLDB4YmIsMHhmNCwweGE3LDB4ODAsMHhiYiwweGY2LDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDUsMHgwMCwKKzB4M2MsMHgwNSwweDA4LDB4MDAsMHgwMCwweDQ1LDB4MjgsMHgyNSwweDI0LDB4MDQsMHgwNSwweDAwLDB4MGMsMHgwMCwweDA2LDB4YzEsCisweDAwLDB4NDAsMHg4MCwweDIxLDB4M2MsMHgwMiwweGY3LDB4ZmYsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAyLDB4MDIsMHg4MCwweDI0LAorMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDA1LDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwOCwweDM0LDB4NjMsMHgwMSwweDE4LDB4OGMsMHg0NSwweDAwLDB4MDAsCisweDhjLDB4NjQsMHgwMCwweDAwLDB4M2MsMHgwMiwweDAwLDB4MGYsMHgzYywweDAzLDB4MDAsMHg0YywweDMwLDB4ODQsMHgwMiwweDAwLAorMHgzNCwweDYzLDB4NGIsMHg0MCwweGFmLDB4ODUsMHhiYywweDAwLDB4MTAsMHg4MCwweDAwLDB4MDYsMHgzNCwweDQyLDB4NDIsMHg0MCwKKzB4YWYsMHg4MywweGJjLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4YWYsMHg4MiwweGJjLDB4MDQsMHgwOCwweDAwLDB4MDUsMHg2OSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4YzgsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDE1LDB4YzAsMHgzMCwweDg0LDB4MDAsMHhmZiwweGFmLDB4YmYsMHgwMCwweDMwLDB4YWYsMHhiNywweDAwLDB4MmMsCisweGFmLDB4YjYsMHgwMCwweDI4LDB4YWYsMHhiNSwweDAwLDB4MjQsMHhhZiwweGI0LDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLAorMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4MTAsMHg4MCwweDAwLDB4MWMsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YmYsMHgwMCwweDMwLDB4N2IsMHhiNiwweDAxLDB4N2MsMHg3YiwweGI0LDB4MDEsMHgzYywweDdiLDB4YjIsMHgwMCwweGZjLAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzgsMHhhNywweDgwLDB4YmIsMHhmMCwKKzB4YTcsMHg4MCwweGJiLDB4ZjIsMHhhNywweDgwLDB4YmIsMHhmNCwweGE3LDB4ODAsMHhiYiwweGY2LDB4MGMsMHgwMCwweDA2LDB4Y2UsCisweDI0LDB4MDQsMHgwNSwweDAwLDB4M2MsMHgwNSwweDA4LDB4MDAsMHgwMCwweDQ1LDB4MjgsMHgyNSwweDI0LDB4MDQsMHgwNSwweDAwLAorMHgwYywweDAwLDB4MDYsMHhjMSwweDAwLDB4NDAsMHg4MCwweDIxLDB4M2MsMHgwNSwweGY3LDB4ZmYsMHgzNCwweGE1LDB4ZmYsMHhmZiwKKzB4MDIsMHgwNSwweDI4LDB4MjQsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNSwweDAwLDB4MDgsMHgwMCwweDA1LDB4ODQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDUsMHhhMCwweDI0LDB4MDQsMHgwNSwweGE0LAorMHgwYywweDAwLDB4MDYsMHhjZSwweDAwLDB4MDIsMHhiYywweDAyLDB4MjQsMHgwNCwweDA1LDB4YTgsMHgwMCwweDAyLDB4YjQsMHgwMiwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgzMCwweDU1LDB4ZmYsMHhmZiwweDAwLDB4NDAsMHg4MCwweDIxLDB4OTcsMHg4NCwweGJiLDB4ZjAsCisweDk3LDB4ODIsMHhiYiwweGYyLDB4OTcsMHg4MywweGJiLDB4ZjYsMHgwMiwweGU0LDB4MjAsMHgyMywweDAyLDB4YTIsMHgxMCwweDIzLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweDk3LDB4ODIsMHhiYiwweGY0LDB4MzIsMHgxNCwweGZmLDB4ZmYsMHgwMiwweDgzLDB4MTgsMHgyMywKKzB4MDIsMHhjMiwweDEwLDB4MjMsMHgwMCwweDgyLDB4MjAsMHgyMSwweDkzLDB4ODIsMHhiYiwweGY4LDB4MDAsMHg4MywweDIwLDB4MjEsCisweDMwLDB4ODQsMHhmZiwweGZmLDB4MDAsMHg4MiwweDEwLDB4MmIsMHgxNCwweDQwLDB4MDAsMHhhYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NywweDgyLDB4YmIsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDEwLDB4MmIsMHgxNCwweDQwLDB4MDAsMHg3ZiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NywweDgyLDB4YmIsMHhmYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0NCwweDEwLDB4MmIsCisweDEwLDB4NDAsMHgwMCwweDNhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwNCwweDUwLAorMHgzMCwweDUxLDB4MDAsMHg3ZiwweDAwLDB4NDAsMHg4MCwweDIxLDB4MmUsMHgyMiwweDAwLDB4MzIsMHgxMCwweDQwLDB4MDAsMHgxMywKKzB4MjQsMHgwMiwweDAwLDB4MjAsMHgxMiwweDIyLDB4MDAsMHgxNywweDI0LDB4MDIsMHhmZiwweDgwLDB4MDIsMHgwMiwweDEwLDB4MjQsCisweDI2LDB4MzEsMHgwMCwweDAxLDB4MDAsMHg1MSwweDgwLDB4MjUsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLAorMHgyNCwweDA0LDB4MDQsMHg1MCwweDAyLDB4MDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDQsMHg1OCwKKzB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNCwweDYwLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDI0LDB4MDQsMHgwNCwweDY4LDB4MGMsMHgwMCwweDA2LDB4YzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweGE3LDB4OTcsMHhiYiwweGYwLAorMHhhNywweDk1LDB4YmIsMHhmMiwweGE3LDB4OTYsMHhiYiwweGY0LDB4YTcsMHg5NCwweGJiLDB4ZjYsMHgwOCwweDAwLDB4MDUsMHg4NCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDA4LDB4M2MsMHgwNCwweDAwLDB4YzAsCisweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDAyLDB4MTUsMHg4MiwweDI0LDB4MDMsMHgwMCwweDAzLAorMHgxMCwweDQzLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwKKzB4MDAsMHhhMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MjgsMHgyNSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MDgsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwMCwweDQwLDB4OTAsMHgyMSwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHg5MCwweDI0LDB4MDIsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwKKzB4MjQsMHgwNCwweDAyLDB4MmMsMHgwOCwweDAwLDB4MDUsMHhjYiwweDI0LDB4MDIsMHhmZiwweDgwLDB4MGMsMHgwMCwweDA2LDB4Y2UsCisweDI0LDB4MDQsMHgwNCwweDUwLDB4MzAsMHg1MSwweDAwLDB4N2YsMHgyNCwweDAyLDB4MDAsMHgyMCwweDE2LDB4MjIsMHhmZiwweGRiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgzNCwweDUyLDB4NDAsMHgwMCwKKzB4MDIsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MGMsMHgwMCwweDA2LDB4Y2UsCisweDI0LDB4MDQsMHgwMiwweDU4LDB4MjQsMHgwNCwweDAyLDB4NWMsMHgwYywweDAwLDB4MDYsMHhjZSwweDAwLDB4MDIsMHg5ZSwweDAyLAorMHgzMCwweDQzLDB4MDAsMHhmZiwweDAwLDB4MTMsMHgxMiwweDAwLDB4MDAsMHg0MywweDEwLDB4MjUsMHgyYywweDQzLDB4MDAsMHgwNCwKKzB4MTQsMHg2MCwweDAwLDB4MWQsMHgyYywweDQyLDB4MDAsMHgxMSwweDEwLDB4NDAsMHgwMCwweDBiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhmZiwweGZmLDB4MzQsMHg0MiwweDNmLDB4ZmYsMHgwMiwweDQyLDB4OTAsMHgyNCwweDAyLDB4NDAsMHgyOCwweDIxLAorMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGMxLDB4MzYsMHg1MiwweDgwLDB4MDAsMHgwMiwweDQwLDB4MjgsMHgyMSwKKzB4MDgsMHgwMCwweDA1LDB4ZDksMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4MDgsCisweDNjLDB4MDQsMHgwMCwweGMwLDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNCwweDAwLDB4MDIsMHgxNSwweDgyLAorMHgyNCwweDAzLDB4MDAsMHgwMiwweDE0LDB4NDMsMHhmZiwweGVlLDB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwKKzB4MDAsMHhhMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MjgsMHgyNSwweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MDgsCisweDA4LDB4MDAsMHgwNiwweDE1LDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDA4LAorMHgwMCwweDQwLDB4MjgsMHgyMSwweDAwLDB4MDIsMHgxNSwweDgyLDB4MzAsMHg0MiwweDAwLDB4MDMsMHgyNCwweDAzLDB4MDAsMHgwMywKKzB4MTQsMHg0MywweGZmLDB4ZGYsMHgzYywweDAyLDB4ZmYsMHgzZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDAsMHhhMiwweDEwLDB4MjQsCisweDNjLDB4MDMsMHgwMCwweDgwLDB4MDgsMHgwMCwweDA2LDB4MmEsMHgwMCwweDQzLDB4MjgsMHgyNSwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDQsMHg1MCwweDMwLDB4NTEsMHgwMCwweDdmLDB4MDAsMHg0MCwweDgwLDB4MjEsMHgyZSwweDIyLDB4MDAsMHgzMiwKKzB4MTAsMHg0MCwweGZmLDB4OWEsMHgyNCwweDAyLDB4MDAsMHgyMCwweDEyLDB4MjIsMHgwMCwweDA0LDB4MjQsMHgwMiwweGZmLDB4ODAsCisweDAyLDB4MDIsMHgxMCwweDI0LDB4MDgsMHgwMCwweDA1LDB4Y2QsMHgyNiwweDMxLDB4MDAsMHgwMiwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgyNCwweDA0LDB4MDIsMHgwOCwweDNjLDB4MDQsMHgwMCwweGMwLDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNCwKKzB4MDAsMHgwMiwweDE1LDB4ODIsMHgyNCwweDAzLDB4MDAsMHgwMywweDEwLDB4NDMsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgyOCwweDI1LAorMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwMiwweDA4LDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgyYywKKzB4MDAsMHg0MCwweDkwLDB4MjEsMHgzYywweDAyLDB4ZmYsMHhmZiwweDM0LDB4NDIsMHgzZiwweGZmLDB4MDIsMHg0MiwweDkwLDB4MjQsCisweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDIsMHgyYywweDA4LDB4MDAsMHgwNiwweDQ0LAorMHgyNCwweDAyLDB4ZmYsMHg4MCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA0LDB4NTAsMHgwMCwweDQwLDB4ODAsMHgyMSwKKzB4MzAsMHg1MSwweDAwLDB4N2YsMHgyNCwweDAyLDB4MDAsMHgyMCwweDEyLDB4MjIsMHgwMCwweDFkLDB4MmUsMHgyMiwweDAwLDB4MjEsCisweDE0LDB4NDAsMHhmZiwweDcyLDB4MjQsMHgwMiwweGZmLDB4ODAsMHgwMiwweDAyLDB4MTAsMHgyNCwweDI2LDB4MzEsMHhmZiwweGZmLAorMHgwMCwweDUxLDB4ODAsMHgyNSwweDI0LDB4MDQsMHgwNCwweDUwLDB4MGMsMHgwMCwweDA2LDB4YzEsMHgwMiwweDAwLDB4MjgsMHgyMSwKKzB4MjQsMHgwNCwweDA0LDB4NTgsMHgwYywweDAwLDB4MDYsMHhjMSwweDAyLDB4MDAsMHgyOCwweDIxLDB4MjQsMHgwNCwweDA0LDB4NjAsCisweDBjLDB4MDAsMHgwNiwweGMxLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGMxLAorMHgyNCwweDA0LDB4MDQsMHg2OCwweDI0LDB4MDIsMHgwMCwweDIwLDB4MTYsMHgyMiwweGZmLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDIsMHgyYywweDAwLDB4NDAsMHg5MCwweDIxLDB4M2MsMHgwMiwweGZmLDB4ZmYsCisweDM0LDB4NDIsMHgzZiwweGZmLDB4MDIsMHg0MiwweDEwLDB4MjQsMHgwOCwweDAwLDB4MDYsMHgxYiwweDM0LDB4NTIsMHg4MCwweDAwLAorMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MzQsMHg1MiwweDQwLDB4MDAsMHgwMiwweDQwLDB4MjgsMHgyMSwKKzB4MGMsMHgwMCwweDA2LDB4YzEsMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDAyLDB4NTgsCisweDI0LDB4MDQsMHgwMiwweDVjLDB4MGMsMHgwMCwweDA2LDB4Y2UsMHgwMCwweDAyLDB4OWUsMHgwMiwweDMwLDB4NDMsMHgwMCwweGZmLAorMHgwMCwweDEzLDB4MTIsMHgwMCwweDAwLDB4NDMsMHgxMCwweDI1LDB4MmMsMHg0MywweDAwLDB4MDQsMHgxNCwweDYwLDB4MDAsMHgyMCwKKzB4MmMsMHg0MiwweDAwLDB4MTEsMHgxMCwweDQwLDB4MDAsMHgwZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4ZmYsCisweDM0LDB4NDIsMHgzZiwweGZmLDB4MDIsMHg0MiwweDkwLDB4MjQsMHgwMiwweDQwLDB4MjgsMHgyMSwweDI0LDB4MDQsMHgwMiwweDJjLAorMHgwYywweDAwLDB4MDYsMHhjMSwweDM2LDB4NTIsMHg4MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwKKzB4MjQsMHgwNCwweDAyLDB4MmMsMHgwOCwweDAwLDB4MDYsMHg2OCwweDJlLDB4MjIsMHgwMCwweDIxLDB4MGMsMHgwMCwweDA2LDB4Y2UsCisweDI0LDB4MDQsMHgwMiwweDA4LDB4M2MsMHgwNCwweDAwLDB4YzAsMHgwMCwweDQwLDB4MjgsMHgyMSwweDAwLDB4NDQsMHgxMCwweDI0LAorMHgwMCwweDAyLDB4MTUsMHg4MiwweDI0LDB4MDMsMHgwMCwweDAyLDB4MTQsMHg0MywweGZmLDB4ZWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0NCwweDI4LDB4MjUsCisweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDAyLDB4MDgsMHgwOCwweDAwLDB4MDYsMHg5OCwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgwYywweDAwLDB4MDYsMHhjZSwweDI0LDB4MDQsMHgwMiwweDA4LDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDAyLDB4MTUsMHg4MiwKKzB4MzAsMHg0MiwweDAwLDB4MDMsMHgyNCwweDAzLDB4MDAsMHgwMywweDE0LDB4NDMsMHhmZiwweGRjLDB4M2MsMHgwMywweDAwLDB4ODAsCisweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMCwweGEyLDB4MTAsMHgyNCwweDA4LDB4MDAsMHgwNiwweGIwLAorMHgwMCwweDQzLDB4MjgsMHgyNSwweDMwLDB4ODMsMHgwMCwweDAzLDB4MDAsMHgwNCwweDIwLDB4NDAsMHgwMCwweDgzLDB4MjAsMHgyMywKKzB4M2MsMHgwMiwweGIwLDB4MGEsMHgwMCwweDgyLDB4MjAsMHgyMSwweGFjLDB4ODUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDI0LDB4NjMsMHgwMCwweDAxLDB4MmMsMHg2MiwweDAwLDB4MGEsMHgxNCwweDQwLDB4ZmYsMHhmZSwweDI0LDB4NjMsMHgwMCwweDAxLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI0LDB4NjMsMHhmZiwweGZmLDB4MzAsMHg4NiwweDAwLDB4MDMsMHgwMCwweDA0LDB4MjgsMHg0MCwKKzB4M2MsMHgwMywweGIwLDB4MGEsMHgwMCwweGE2LDB4MTAsMHgyMywweDAwLDB4NDMsMHgxMCwweDIxLDB4MjQsMHgwNCwweGZmLDB4ZmYsCisweGFjLDB4NDQsMHgxMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsMHgyNCwweDYzLDB4MDAsMHgwMSwweDJjLDB4NjIsMHgwMCwweDBhLAorMHgxNCwweDQwLDB4ZmYsMHhmZSwweDI0LDB4NjMsMHgwMCwweDAxLDB4MjQsMHg2MywweGZmLDB4ZmYsMHgwMCwweGE2LDB4MTgsMHgyMywKKzB4M2MsMHgwMiwweGIwLDB4MGEsMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI0LDB4NDIsMHgxYiwweDg0LAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDM0LDB4YTUsMHgwMCwweDIwLDB4M2MsMHgwNiwweGIwLDB4MDMsMHhhYywweGEyLDB4MDAsMHgwMCwKKzB4MzQsMHhjNiwweDAxLDB4MDQsMHhhMCwweDgzLDB4MDAsMHg0OCwweGEwLDB4ODAsMHgwMCwweDA0LDB4YTAsMHg4MCwweDAwLDB4MDUsCisweGEwLDB4ODAsMHgwMCwweDA2LDB4YTAsMHg4MCwweDAwLDB4MDcsMHhhMCwweDgwLDB4MDAsMHgwOCwweGEwLDB4ODAsMHgwMCwweDA5LAorMHhhMCwweDgwLDB4MDAsMHgwYSwweGEwLDB4ODAsMHgwMCwweDExLDB4YTAsMHg4MCwweDAwLDB4MTMsMHhhMCwweDgwLDB4MDAsMHg0OSwKKzB4OTQsMHhjMiwweDAwLDB4MDAsMHhhYywweDgwLDB4MDAsMHgwMCwweGEwLDB4ODAsMHgwMCwweDRlLDB4MDAsMHgwMiwweDE0LDB4MDAsCisweDAwLDB4MDIsMHgxNCwweDAzLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgzMCwweDQyLDB4ZmYsMHgwMCwweGE0LDB4ODIsMHgwMCwweDQ0LAorMHhhNCwweDgzLDB4MDAsMHg0NiwweGFjLDB4ODAsMHgwMCwweDI0LDB4YWMsMHg4MCwweDAwLDB4MjgsMHhhYywweDgwLDB4MDAsMHgyYywKKzB4YWMsMHg4MCwweDAwLDB4MzAsMHhhYywweDgwLDB4MDAsMHgzNCwweGFjLDB4ODAsMHgwMCwweDM4LDB4YWMsMHg4MCwweDAwLDB4M2MsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4NDAsMHg4NCwweDgzLDB4MDAsMHgwYywweDNjLDB4MDcsMHhiMCwweDAzLAorMHgzNCwweGU3LDB4MDAsMHgyMCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MjcsMHg4MywweDhmLDB4ZjQsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDgsMHgwMCwweDE4LDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI0LDB4NDIsMHgxYywweDE4LDB4YWMsMHhlMiwweDAwLDB4MDAsMHg4ZCwweDAzLDB4MDAsMHgwOCwweDgwLDB4ODIsMHgwMCwweDEzLAorMHgwMCwweDA1LDB4MmMsMHgwMCwweDAwLDB4MDMsMHgxZSwweDAyLDB4MDAsMHgwMiwweDEyLDB4MDAsMHgzMCwweDYzLDB4MDAsMHg3ZSwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDY1LDB4MTgsMHgyMSwweDNjLDB4MDIsMHhjMCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwNCwweDAwLDB4MjQsMHg2MywweDAwLDB4MDEsMHgzYywweDA3LDB4YjAsMHgwNSwweDNjLDB4MDgsMHhiMCwweDA1LAorMHgzNCwweGE1LDB4MDQsMHgyMCwweGFjLDB4YTMsMHgwMCwweDAwLDB4MDAsMHhjMiwweDMwLDB4MjEsMHgzNCwweGU3LDB4MDQsMHgyNCwKKzB4MzUsMHgwOCwweDAyLDB4MjgsMHgyNCwweDAyLDB4MDAsMHgwMSwweDI0LDB4MDMsMHgwMCwweDIwLDB4YWMsMHhlNiwweDAwLDB4MDAsCisweGFjLDB4ODIsMHgwMCwweDNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDAzLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGE4LAorMHgwMCwweDA3LDB4NjAsMHg4MCwweDI3LDB4ODIsMHhiMywweGYwLDB4YWYsMHhiZSwweDAwLDB4NTAsMHhhZiwweGI3LDB4MDAsMHg0YywKKzB4YWYsMHhiNSwweDAwLDB4NDQsMHhhZiwweGI0LDB4MDAsMHg0MCwweGFmLDB4YmYsMHgwMCwweDU0LDB4YWYsMHhiNiwweDAwLDB4NDgsCisweGFmLDB4YjMsMHgwMCwweDNjLDB4YWYsMHhiMiwweDAwLDB4MzgsMHhhZiwweGIxLDB4MDAsMHgzNCwweGFmLDB4YjAsMHgwMCwweDMwLAorMHgwMSwweDgyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHhlMCwweDcwLDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4OTQsMHg3MywweDAwLDB4MTQsMHgzYywweDA3LDB4YjAsMHgwMywweDM0LDB4ZTcsMHgwMCwweDIwLDB4MjQsMHg0MiwweDFjLDB4YWMsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4YWMsMHhlMiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDEsMHgyOCwweDkwLDB4NjcsMHgwMCwweDAwLAorMHgwMCwweDEzLDB4YTgsMHhjMCwweDAyLDB4YjMsMHgxOCwweDIxLDB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDA1LDB4MmMsMHgwMCwweDAwLDB4MDcsMHgzZSwweDAwLDB4MjgsMHhjMiwweDAwLDB4MDMsCisweDAwLDB4YzAsMHhhMCwweDIxLDB4MDAsMHg4MCwweDc4LDB4MjEsMHgwMCwweDA1LDB4YmMsMHgwMywweDhjLDB4NjgsMHgwMCwweDE4LAorMHgwMiwweGEwLDB4NTgsMHgyMSwweDEwLDB4NDAsMHgwMSwweDgxLDB4MDAsMHgwNywweGY2LDB4MDMsMHgwMCwweGRlLDB4MTAsMHgwNywKKzB4MzAsMHg1ZSwweDAwLDB4MDEsMHgwMSwweDczLDB4MTAsMHgyMSwweDI3LDB4ODMsMHg4ZiwweGY4LDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4ODAsMHg0ZCwweDAwLDB4MDYsMHg4ZCwweDAzLDB4MDAsMHgwMCwweDhkLDB4MDIsMHgwMCwweDA0LAorMHg4ZCwweDBhLDB4MDAsMHgwOCwweDhkLDB4MDMsMHgwMCwweDBjLDB4YWYsMHhhMiwweDAwLDB4MjAsMHgxMSwweGEwLDB4MDEsMHg3MSwKKzB4YWYsMHhhMywweDAwLDB4MTgsMHgyNywweDgyLDB4YjMsMHhmMCwweDAxLDB4ODIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg4MywweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDA0LAorMHgxNCwweDYwLDB4MDAsMHgxMiwweDAwLDB4MDAsMHhiMCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHg0NiwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgyYSwweDg0LDB4MDAsMHgwNCwweDEwLDB4ODAsMHgwMSwweDU2LDB4MzAsMHg2NSwweDAwLDB4MDEsCisweDkxLDB4ZTIsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDgyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MjgsMHgyMSwweDE0LDB4YTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgxMywweGMwLDB4MDAsMHgwMywKKzB4MzgsMHhmNiwweDAwLDB4MDEsMHgyNCwweDA3LDB4MDAsMHgwMSwweDM4LDB4ZjYsMHgwMCwweDAxLDB4MDEsMHg3MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgzMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweGMzLDB4NDgsMHgyMSwweDkxLDB4MjUsMHgwMCwweDAwLAorMHg4ZiwweGE0LDB4MDAsMHgyMCwweDJjLDB4YTMsMHgwMCwweDA0LDB4MDAsMHgwNCwweDExLDB4YzMsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDAsMHgwMywweGIwLDB4MGIsMHgxMiwweGMwLDB4MDAsMHhkOCwweGFmLDB4YTIsMHgwMCwweDI0LDB4OTMsMHg5MCwweGJiLDB4ZGEsCisweDAwLDB4MGEsMHgxNiwweDQyLDB4MzAsMHg1MiwweDAwLDB4M2YsMHgyZSwweDA2LDB4MDAsMHgwYywweDEwLDB4YzAsMHgwMCwweGMwLAorMHgwMCwweGEwLDB4MjAsMHgyMSwweDJjLDB4YTIsMHgwMCwweDEwLDB4MTQsMHg0MCwweDAwLDB4MDQsMHgwMCwweDkwLDB4MTAsMHgyYiwKKzB4MzAsMHhhMiwweDAwLDB4MDcsMHgyNCwweDQ0LDB4MDAsMHgwNCwweDAwLDB4OTAsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4MGIsCisweDAxLDB4NzMsMHgxMCwweDIxLDB4MjcsMHg4NSwweGJiLDB4MGMsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4NTAsMHgxMCwweDIxLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDkwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4MTgsMHgyYiwKKzB4MTQsMHg2MCwweGZmLDB4ZmEsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAxLDB4NzMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4ZiwweGY4LDB4MDAsMHg0MywweDEwLDB4MjEsMHgzMSwweGE0LDB4MDAsMHgwMSwweDEwLDB4ODAsMHgwMCwweGE1LAorMHhhMCwweDUwLDB4MDAsMHgwNywweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4M2MsMHgwMywweDgwLDB4MDAsMHhhMSwweGUyLDB4MDAsMHg0ZSwweGFjLDB4ODMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsCisweDNjLDB4MDIsMHgwMCwweGYwLDB4M2MsMHgwMywweDQwLDB4ZjAsMHgzNCwweDQyLDB4ZjAsMHgwMCwweDM0LDB4NjMsMHhmMCwweDAwLAorMHgyNCwweDE3LDB4MDAsMHgwZSwweDI0LDB4MTMsMHgwMSwweDA2LDB4YWMsMHg4MiwweDAwLDB4MDAsMHhhYywweDgzLDB4MDAsMHgwMCwKKzB4MjcsMHg4MiwweGIzLDB4ZjAsMHgwMSwweDgyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MDEsCisweGFmLDB4YTUsMHgwMCwweDFjLDB4OTAsMHg2MiwweDAwLDB4MTYsMHgwMCwweDEzLDB4YTgsMHhjMCwweDMyLDB4NTEsMHgwMCwweDAyLAorMHgzNCwweDQyLDB4MDAsMHgwNCwweGEwLDB4NjIsMHgwMCwweDE2LDB4OGYsMHhhMywweDAwLDB4MjAsMHg4ZiwweGE0LDB4MDAsMHgxOCwKKzB4MDAsMHgwMywweDEzLDB4NDMsMHgwMCwweDA0LDB4MWEsMHgwMiwweDMwLDB4NDcsMHgwMCwweDAxLDB4MTIsMHgyMCwweDAwLDB4MDQsCisweDMwLDB4NjQsMHgwNywweGZmLDB4MmUsMHgwMywweDAwLDB4MDQsMHgzMiwweDQyLDB4MDAsMHgzMywweDAwLDB4NDMsMHg5MCwweDBiLAorMHg4ZiwweGE1LDB4MDAsMHgyNCwweDhmLDB4YTYsMHgwMCwweDFjLDB4MDAsMHgxMiwweDEwLDB4NDAsMHgwMCwweDA1LDB4MTksMHhjMCwKKzB4MDAsMHg0NywweDEwLDB4MjEsMHgwMCwweDA2LDB4MmEsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgxMCwweDMyLDB4MDAsCisweDAwLDB4MDQsMHgyNCwweDgwLDB4MDIsMHg2NSwweDI4LDB4MjEsMHgwMCwweGE0LDB4MjgsMHgyMSwweDAwLDB4NDYsMHgxMCwweDIxLAorMHgwMCwweDE3LDB4MWMsMHgwMCwweDNjLDB4MDQsMHhjMCwweDAwLDB4MDAsMHg0MywweDMwLDB4MjEsMHgxNiwweDgwLDB4MDAsMHgyOSwKKzB4MDAsMHhhNCwweDI4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwNCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDUsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDQsMHgwNCwweDM0LDB4ODQsMHgwMiwweDI4LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGFjLDB4NjUsMHgwMCwweDAwLDB4YTAsMHg4MiwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwOSwKKzB4MzQsMHg0MiwweDAxLDB4NDYsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDkxLDB4ZTMsMHgwMCwweDA5LDB4MzAsMHg4NiwweDAwLDB4MDEsCisweDAyLDB4ODMsMHgxOCwweDI2LDB4MDAsMHgwMywweDMwLDB4MGIsMHgxNCwweGMwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgyOCwweDIxLAorMHgxMywweGMwLDB4MDAsMHgwMywweDAyLDB4YjMsMHgxMCwweDIxLDB4MjQsMHgwNSwweDAwLDB4MDEsMHgwMiwweGIzLDB4MTAsMHgyMSwKKzB4MjcsMHg4MywweDhmLDB4ZjgsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODQsMHg0OCwweDAwLDB4MDQsCisweDAwLDB4YTAsMHgzMCwweDIxLDB4MDAsMHhlMCwweDIwLDB4MjEsMHgwMiwweDgwLDB4MjgsMHgyMSwweDAyLDB4YzAsMHgzOCwweDIxLAorMHgwYywweDAwLDB4MDAsMHg3MiwweGFmLDB4YTgsMHgwMCwweDEwLDB4N2IsMHhiZSwweDAyLDB4YmMsMHg3YiwweGI2LDB4MDIsMHg3YywKKzB4N2IsMHhiNCwweDAyLDB4M2MsMHg3YiwweGIyLDB4MDEsMHhmYywweDdiLDB4YjAsMHgwMSwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDU4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDgyLDB4MDAsMHgzZCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEyLDB4ODIsMHgwMCwweDMxLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTIsMHg4MiwweDAwLDB4MjUsMHgzYywweDAyLDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDEwLDB4MTIsMHg4MiwweDAwLDB4MTksCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MTEsMHgxMiwweDgyLDB4MDAsMHgwZCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgxMiwweDE2LDB4ODIsMHhmZiwweGQxLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzYywweDAzLDB4YjAsMHgwNSwKKzB4MzQsMHg0MiwweDA0LDB4MjAsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDI0LDB4YWMsMHg0NiwweDAwLDB4MDAsCisweDM0LDB4ODQsMHgwMiwweDI4LDB4YWMsMHg2NSwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDcsMHhlMiwweDI0LDB4MDIsMHgwMCwweDIwLAorMHgzNCwweDQyLDB4MDQsMHg0MCwweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHhhYywweDQ2LDB4MDAsMHgwMCwKKzB4MzQsMHg2MywweDA0LDB4NDQsMHgzNCwweDg0LDB4MDIsMHgyOCwweDI0LDB4MDIsMHgwMCwweDQwLDB4MDgsMHgwMCwweDA3LDB4ZTIsCisweGFjLDB4NjUsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA0LDB4MjgsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LAorMHhhYywweDQ2LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDJjLDB4MzQsMHg4NCwweDAyLDB4MjgsMHgyNCwweDAyLDB4ZmYsMHg4MCwKKzB4MDgsMHgwMCwweDA3LDB4ZTIsMHhhYywweDY1LDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwNCwweDE4LDB4M2MsMHgwMywweGIwLDB4MDUsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDQsMHgxYywweDM0LDB4ODQsMHgwMiwweDI4LAorMHgyNCwweDAyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgwNywweGUyLDB4YWMsMHg2NSwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDQsMHgxMCwKKzB4M2MsMHgwMywweGIwLDB4MDUsMHgzYywweDA0LDB4YjAsMHgwNSwweGFjLDB4NDYsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4MTQsCisweDM0LDB4ODQsMHgwMiwweDI4LDB4MjQsMHgwMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MDcsMHhlMiwweGFjLDB4NjUsMHgwMCwweDAwLAorMHgzNCwweDQyLDB4MDQsMHgwOCwweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHhhYywweDQ2LDB4MDAsMHgwMCwKKzB4MzQsMHg2MywweDA0LDB4MGMsMHgzNCwweDg0LDB4MDIsMHgyOCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MDgsMHgwMCwweDA3LDB4ZTIsCisweGFjLDB4NjUsMHgwMCwweDAwLDB4MjQsMHgxNywweDAwLDB4MTQsMHgwOCwweDAwLDB4MDcsMHhiNCwweDI0LDB4MTMsMHgwMSwweDAyLAorMHgzMCwweGEyLDB4MDAsMHgwNywweDI0LDB4NDQsMHgwMCwweDBjLDB4MDAsMHg5MCwweDE4LDB4MmIsMHgxMCwweDYwLDB4MDAsMHgwYywKKzB4MjYsMHgwMiwweDAwLDB4MDQsMHgyNywweDg1LDB4YmIsMHgwYywweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHg1MCwweDEwLDB4MjEsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4OTAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHgxOCwweDJiLAorMHgxNCwweDYwLDB4ZmYsMHhmYSwweDAwLDB4MTAsMHgxMCwweDQwLDB4MmUsMHgwNiwweDAwLDB4MGMsMHgyNiwweDAyLDB4MDAsMHgwNCwKKzB4MDgsMHgwMCwweDA3LDB4OWUsMHgwMCwweDQ2LDB4ODAsMHgwYSwweDI3LDB4ODIsMHhiMywweGYwLDB4MDEsMHg4MiwweDIwLDB4MjEsCisweDhjLDB4ODcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweGUyLDB4MDAsMHgxOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MTAsMHgwMCwweGMyLDB4MTAsMHgyMSwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkwLDB4ZTMsMHgwMCwweDE2LDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgwMCwweGMyLDB4MTAsMHgyMSwweDM0LDB4NjMsMHgwMCwweDIwLAorMHg5MCwweDUwLDB4MDAsMHgwNywweGEwLDB4ZTMsMHgwMCwweDE2LDB4OGMsMHg4NCwweDAwLDB4MDAsMHgwMCwweDBhLDB4MWUsMHg0MiwKKzB4MjQsMHgwNiwweDAwLDB4MDEsMHg5MCwweDgyLDB4MDAsMHgxNiwweDMwLDB4NzEsMHgwMCwweDAyLDB4MzAsMHg3MiwweDAwLDB4M2YsCisweDMwLDB4NDIsMHgwMCwweGZiLDB4MjQsMHgxNywweDAwLDB4MTgsMHgyNCwweDEzLDB4MDEsMHgwMywweDI0LDB4MTUsMHgwOCwweDE4LAorMHhhZiwweGE2LDB4MDAsMHgxYywweDA4LDB4MDAsMHgwNywweGJlLDB4YTAsMHg4MiwweDAwLDB4MTYsMHg4ZCwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHgwYSwweDFjLDB4NDIsMHgzMCwweDQyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDE1LDB4MzAsMHg3MiwweDAwLDB4M2YsCisweDgxLDB4MjIsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxMSwweDMwLDB4NzIsMHgwMCwweDNlLAorMHgyNywweDgzLDB4OTAsMHgwOCwweDAwLDB4YzMsMHgxOCwweDIxLDB4ODAsMHg2NCwweDAwLDB4MDAsMHgyNywweDgzLDB4YjUsMHg2OCwKKzB4MDAsMHgwNCwweDExLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwNSwweDkwLDB4NDMsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjQsMHgxOCwweDI0LDB4MzAsMHg2MywweDAwLDB4MDEsMHgwMiwweDQzLDB4OTAsMHgyNSwKKzB4MjcsMHg4NSwweGIzLDB4ZjAsMHgwMSwweDg1LDB4MjgsMHgyMSwweDhjLDB4YTYsMHgwMCwweDAwLDB4MDEsMHg3MywweDEwLDB4MjEsCisweDI3LDB4ODMsMHg5MCwweDAwLDB4OTAsMHhjNCwweDAwLDB4MTYsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgzMCwweDg0LDB4MDAsMHhkZiwweDkwLDB4NTAsMHgwMCwweDAwLDB4YTAsMHhjNCwweDAwLDB4MTYsMHg4MCwweGM2LDB4MDAsMHgxMiwKKzB4OGMsMHhhMywweDAwLDB4MDAsMHgyZCwweGM0LDB4MDAsMHgwMiwweGFmLDB4YTYsMHgwMCwweDFjLDB4OTAsMHg2MiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmIsMHgxNCwweDgwLDB4MDAsMHgwNiwweGEwLDB4NjIsMHgwMCwweDE2LAorMHgyNCwweDAyLDB4MDAsMHgwNiwweDExLDB4YzIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxNSwweGMyLDB4ZmYsMHgwZSwKKzB4MzIsMHg1MSwweDAwLDB4MDIsMHgzMiwweDUxLDB4MDAsMHgwMiwweDJlLDB4MDIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MGYsCisweDAwLDB4MTEsMHgxOCwweDJiLDB4MzIsMHgwMiwweDAwLDB4MGYsMHgzNCwweDQyLDB4MDAsMHgxMCwweDAwLDB4MDMsMHgxOSwweDAwLAorMHgwMCwweDQzLDB4MTgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4YjgsMHhhMCwweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDIwLDB4MjEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwMiwweDA1LDB4YWYsMHhhZiwweDAwLDB4MjgsCisweDhmLDB4YWYsMHgwMCwweDI4LDB4MDgsMHgwMCwweDA3LDB4YmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwOCwweGI5LAorMHgzMiwweDAzLDB4MDAsMHhmZiwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4NDIsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwZiwweDE0LDB4NDAsMHhmZSwweGFhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkxLDB4ZTIsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDgyLDB4MTAsMHgyNiwweDA4LDB4MDAsMHgwNywweDc1LAorMHgwMCwweDAyLDB4MjgsMHgwYiwweDA4LDB4MDAsMHgwNywweDdiLDB4MDAsMHgwMCwweGIwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgxMCwKKzB4MTAsMHhjMiwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgxMSwweDEwLDB4YzIsMHhmZSwweDdkLDB4MDAsMHgwNywweDE3LDB4ODMsCisweDI0LDB4MDIsMHgwMCwweDEyLDB4MTQsMHhjMiwweGZlLDB4N2IsMHgwMCwweDA3LDB4MTcsMHg0MywweDA4LDB4MDAsMHgwNywweDU1LAorMHgzMCwweDVlLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgwNywweDU1LDB4MDAsMHgwNywweGY3LDB4YzIsMHgwMCwweDA0LDB4MTAsMHg0MCwKKzB4MjcsMHg4MywweDgwLDB4MWMsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4ODAsMHg0MCwweDIxLDB4OTQsMHg0NCwweDAwLDB4MDAsCisweDJkLDB4MDcsMHgwMCwweDA0LDB4MjQsMHhjMiwweDAwLDB4MDMsMHgwMCwweDQ3LDB4MzAsMHgwYSwweDAwLDB4ODYsMHgwMCwweDE4LAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MjMsMHg3YywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgyZCwweDA2LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgyMCwweDEyLDB4MDAsMHgwNCwweDIyLDB4NDIsCisweDI0LDB4ODQsMHgwMCwweDAxLDB4MjQsMHg4MywweDAwLDB4YzAsMHgxMCwweGUwLDB4MDAsMHgwYiwweDI0LDB4ODIsMHgwMCwweDYwLAorMHgwMCwweDQwLDB4MjAsMHgyMSwweDAwLDB4NjUsMHgyMCwweDBhLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDEsMHgwMCwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MDAsMHg0NCwweDIwLDB4MDQsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg4MCwweDEwLDB4MjEsMHgyNCwweDg1LDB4MDAsMHgyOCwweDI0LDB4ODMsMHgwMCwweDI0LAorMHgzMSwweDAyLDB4MDAsMHgwOCwweDE0LDB4YzAsMHhmZiwweGY0LDB4MjQsMHg4NCwweDAwLDB4MTQsMHgwMCwweDYwLDB4MjAsMHgyMSwKKzB4MDgsMHgwMCwweDA4LDB4ZjYsMHgwMCwweGEyLDB4MjAsMHgwYiwweDI3LDB4YmQsMHhmZiwweGUwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4YWYsMHhiMCwweDAwLDB4MTAsMHgyNCwweDQyLDB4MjQsMHgxOCwweDAwLDB4ODAsMHg4MCwweDIxLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDNjLDB4MDQsMHhiMCwweDAzLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwKKzB4YWYsMHhiZiwweDAwLDB4MWMsMHg4MywweGIxLDB4MDAsMHgzMywweDgzLDB4YTgsMHgwMCwweDM3LDB4MzQsMHg4NCwweDAxLDB4MTAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MmUsMHgwMiwweDAwLDB4MTAsMHgwMCwweGUwLDB4OTAsMHgyMSwweDhjLDB4ODcsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwYywweDJlLDB4MDIsMHgwMCwweDBjLDB4M2MsMHgwMiwweDAwLDB4MGYsMHgzNCwweDQyLDB4ZjAsMHgwMCwKKzB4MDAsMHhlMiwweDEwLDB4MjQsMHgxNCwweDQwLDB4MDAsMHgzNywweDMyLDB4MDIsMHgwMCwweDA4LDB4MzIsMHgwMiwweDAwLDB4MDcsCisweDI3LDB4ODMsMHg4MCwweGNjLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZSwweDAyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDAzLDB4MDIsMHgwMCwweDIwLDB4MjEsMHgzMiwweDAyLDB4MDAsMHgwZiwKKzB4MjQsMHg0NCwweDAwLDB4MGMsMHgwMCwweDg3LDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4MDcsCisweDJjLDB4ODIsMHgwMCwweDBjLDB4MDAsMHgwNCwweDEwLDB4ODAsMHgyNywweDgzLDB4YjQsMHg0MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg4MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwNSwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMSwweDAwLDB4MDAsMHg4MiwweDEwLDB4MjEsCisweDI0LDB4NDQsMHgwMCwweDA0LDB4MTUsMHgwMCwweDAwLDB4MDIsMHgyNCwweDA2LDB4MDAsMHgyMCwweDI0LDB4MDYsMHgwMCwweDBlLAorMHgwYywweDAwLDB4MDgsMHhkZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDMwLDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDAsMHg5MCwweDQzLDB4MDAsMHgwMCwweDJlLDB4MDQsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MTAsCisweDI0LDB4MDUsMHgwMCwweDBhLDB4MDAsMHg0NCwweDI4LDB4MGEsMHgzMCwweDYzLDB4MDAsMHgwMSwweDE0LDB4NjAsMHgwMCwweDAyLAorMHgwMCwweDA1LDB4MTAsMHg0MCwweDAwLDB4YTAsMHgxMCwweDIxLDB4MzAsMHg0NSwweDAwLDB4ZmYsMHgwMCwweGM1LDB4MTAsMHgyMSwKKzB4MjQsMHg0NiwweDAwLDB4NDYsMHgwMiwweDI2LDB4MTgsMHgwNCwweGE2LDB4NDMsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MWMsCisweDhmLDB4YjIsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMCwweGMwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgyMCwweDEwLDB4NDAsMHhmZiwweGNmLDB4MmUsMHgwMiwweDAwLDB4MGMsMHgzMiwweDAyLDB4MDAsMHgwNywKKzB4MjcsMHg4MywweDgwLDB4YzQsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLDB4MDgsMHgwMCwweDA5LDB4MjQsCisweDAyLDB4MDQsMHg4MCwweDIzLDB4MjcsMHhiZCwweGZmLDB4YjgsMHgwMCwweDA1LDB4MzgsMHg4MCwweDI3LDB4ODIsMHhiMywweGYwLAorMHhhZiwweGJlLDB4MDAsMHg0MCwweGFmLDB4YjYsMHgwMCwweDM4LDB4YWYsMHhiMywweDAwLDB4MmMsMHhhZiwweGJmLDB4MDAsMHg0NCwKKzB4YWYsMHhiNywweDAwLDB4M2MsMHhhZiwweGI1LDB4MDAsMHgzNCwweGFmLDB4YjQsMHgwMCwweDMwLDB4YWYsMHhiMiwweDAwLDB4MjgsCisweGFmLDB4YjEsMHgwMCwweDI0LDB4YWYsMHhiMCwweDAwLDB4MjAsMHgwMCwweGUyLDB4MzgsMHgyMSwweDhjLDB4ZTYsMHgwMCwweDAwLAorMHhhZiwweGE1LDB4MDAsMHg0YywweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDMsMHgzNCwweGE1LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDI1LDB4NzQsMHgyNCwweDAzLDB4MDAsMHgwMSwweGFjLDB4YTIsMHgwMCwweDAwLDB4YTAsMHhjMywweDAwLDB4MTIsCisweDhjLDB4ZTUsMHgwMCwweDAwLDB4OTQsMHhjMywweDAwLDB4MDYsMHg5MCwweGEyLDB4MDAsMHgxNiwweGE0LDB4YzMsMHgwMCwweDE0LAorMHgyNywweDgzLDB4OGYsMHhmMCwweDM0LDB4NDIsMHgwMCwweDA4LDB4YTAsMHhhMiwweDAwLDB4MTYsMHg4YywweGU4LDB4MDAsMHgwMCwKKzB4YWYsMHhhNCwweDAwLDB4NDgsMHgyNywweDgyLDB4OGYsMHhmNCwweDk1LDB4MTEsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MTEsMHg5OCwweGMwLDB4MDIsMHg3MSwweDIwLDB4MjEsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODIsMHgxMCwweDIxLAorMHg4YywweDUyLDB4MDAsMHgxOCwweDAwLDB4ODMsMHgxOCwweDIxLDB4ODQsMHg3NSwweDAwLDB4MDYsMHg4ZSwweDQ1LDB4MDAsMHgwOCwKKzB4OGUsMHg0NiwweDAwLDB4MDQsMHg4ZSwweDQ3LDB4MDAsMHgwNCwweDAwLDB4MDUsMHgxYywweDgyLDB4MDAsMHgwNiwweDMxLDB4NDIsCisweDI3LDB4ODIsMHg5MCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweGM2LDB4MDAsMHgwMSwweDAwLDB4ODIsMHgyMCwweDIxLAorMHhhNSwweDE1LDB4MDAsMHgxYSwweDAwLDB4MDUsMHgxNCwweDQyLDB4YWYsMHhhMywweDAwLDB4MTgsMHhhZiwweGE2LDB4MDAsMHgxYywKKzB4MzAsMHhlNywweDAwLDB4MTAsMHgzMCwweDU2LDB4MDAsMHgwMSwweDgwLDB4OTcsMHgwMCwweDA2LDB4MTQsMHhlMCwweDAwLDB4NDcsCisweDAwLDB4MDUsMHhmNywweGMyLDB4ODAsMHg4MiwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDQ0LAorMHgwMiwweDcxLDB4MTAsMHgyMSwweDkzLDB4OTAsMHhiYiwweGQ5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZSwweDAyLDB4MDAsMHgwYywKKzB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAwLDB4MTYsMHgxMCwweDQwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMSwweDAwLDB4MDIsMHgwMiwweDEwLDB4MjEsMHgyNCwweDQ0LDB4MDAsMHgwNCwweDAyLDB4NzEsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDgwLDB4ODAsMHgyMSwKKzB4YTAsMHg0NCwweDAwLDB4MDMsMHhhMCwweDQ0LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgyMCwweDIxLDB4MDIsMHhjMCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwOCwweGRmLDB4MDIsMHhhMCwweDMwLDB4MjEsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAwLDB4MDMsMHg4OCwweDgwLAorMHgwMCwweDQwLDB4YTAsMHgyMSwweDI3LDB4ODIsMHg5MCwweDEwLDB4MDIsMHgyMiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwKKzB4MjYsMHhlMywweDAwLDB4MDIsMHgwMCwweDAzLDB4MTcsMHhjMiwweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNCwweDI1LDB4YzIsCisweDAwLDB4MDMsMHgxOCwweDQzLDB4MzAsMHg4NCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MTgsMHg0MCwweDAzLDB4YzQsMHgyMCwweDI0LAorMHgxNCwweDgwLDB4MDAsMHgxNSwweDAyLDB4NDMsMHgzOCwweDIxLDB4M2MsMHgwOCwweGIwLDB4MDMsMHgzNSwweDA4LDB4MDAsMHgyOCwKKzB4OGQsMHgwMywweDAwLDB4MDAsMHg4ZiwweGE2LDB4MDAsMHg0YywweDhmLDB4YTQsMHgwMCwweDQ4LDB4MjcsMHg4MiwweDhmLDB4ZjgsCisweDAyLDB4MjIsMHgxMCwweDIxLDB4MjQsMHg2MywweDAwLDB4MDEsMHgwMiwweGEwLDB4MjgsMHgyMSwweGE0LDB4NTQsMHgwMCwweDA0LAorMHgwMCwweGMwLDB4MzgsMHgyMSwweDBjLDB4MDAsMHgwNywweDJiLDB4YWQsMHgwMywweDAwLDB4MDAsMHg3YiwweGJlLDB4MDIsMHgzYywKKzB4N2IsMHhiNiwweDAxLDB4ZmMsMHg3YiwweGI0LDB4MDEsMHhiYywweDdiLDB4YjIsMHgwMSwweDdjLDB4N2IsMHhiMCwweDAxLDB4M2MsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDgsMHg4ZiwweGEyLDB4MDAsMHgxYywweDhmLDB4YTYsMHgwMCwweDE4LAorMHgwMiwweDAwLDB4MjAsMHgyMSwweDAyLDB4YzAsMHgyOCwweDIxLDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHgwNiwKKzB4YWYsMHhhMCwweDAwLDB4MTQsMHgwOCwweDAwLDB4MDksMHhjMiwweDAyLDB4ODIsMHhhMCwweDIxLDB4MDIsMHg3MSwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NTAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MDksMHhhZSwweGEwLDB4NTAsMHgwMCwweDAzLDB4MjcsMHhiZCwweGZmLDB4YjgsMHhhZiwweGIxLDB4MDAsMHgyNCwKKzB4OGYsMHhiMSwweDAwLDB4NWMsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4NDIsMHgyNywweDk4LDB4YWYsMHhiZSwweDAwLDB4NDAsMHhhZiwweGI3LDB4MDAsMHgzYywweGFmLDB4YjYsMHgwMCwweDM4LAorMHhhZiwweGI1LDB4MDAsMHgzNCwweGFmLDB4YjQsMHgwMCwweDMwLDB4YWYsMHhhNSwweDAwLDB4NGMsMHg4ZiwweGI1LDB4MDAsMHg1OCwKKzB4YWYsMHhiZiwweDAwLDB4NDQsMHhhZiwweGIzLDB4MDAsMHgyYywweGFmLDB4YjIsMHgwMCwweDI4LDB4YWYsMHhiMCwweDAwLDB4MjAsCisweDAwLDB4ZTAsMHhiMCwweDIxLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDgwLDB4ZjAsMHgyMSwweDAwLDB4MDAsMHhiOCwweDIxLAorMHgxNiwweDIwLDB4MDAsMHgyYiwweDAwLDB4MDAsMHhhMCwweDIxLDB4MjcsMHg4NSwweGIzLDB4ZjAsMHgwMCwweDA3LDB4MTAsMHg4MCwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg4YywweDUzLDB4MDAsMHgwMCwweDAwLDB4MTUsMHgxOCwweDgwLDB4MDAsMHg2NSwweDE4LDB4MjEsCisweDkyLDB4NjIsMHgwMCwweDE2LDB4OGMsMHg3MiwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDJkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4NDIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMywKKzB4MTQsMHg0MCwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDE4LDB4MDIsMHgyMCwweDEwLDB4MjEsMHg4YywweDgyLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgxNCwweDAyLDB4MjAsMHgxMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MGYsMHgzYywweDAzLDB4YjAsMHgwOSwweDNjLDB4MDUsMHhiMCwweDA1LDB4MzQsMHg2MywweDAxLDB4NDQsCisweDM0LDB4YTUsMHgwMiwweDUyLDB4OTQsMHg2NiwweDAwLDB4MDAsMHg5MCwweGEyLDB4MDAsMHgwMCwweDhmLDB4YTMsMHgwMCwweDRjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgxMCwweDA2LDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweDQwLDB4MDAsMHgwNCwKKzB4MzAsMHhjNiwweGZmLDB4ZmYsMHgyYywweGMyLDB4MDAsMHg0MSwweDEwLDB4NDAsMHgwMCwweDA5LDB4MjQsMHgwNSwweDAwLDB4MTQsCisweDAyLDB4MjAsMHgxMCwweDIxLDB4N2IsMHhiZSwweDAyLDB4M2MsMHg3YiwweGI2LDB4MDEsMHhmYywweDdiLDB4YjQsMHgwMSwweGJjLAorMHg3YiwweGIyLDB4MDEsMHg3YywweDdiLDB4YjAsMHgwMSwweDNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg0OCwKKzB4MGMsMHgwMCwweDA3LDB4MDYsMHgyNCwweDA2LDB4MDEsMHgwNywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDBhLDB4MjgsCisweGEzLDB4YzIsMHgwMCwweDExLDB4MTAsMHhjMCwweDAwLDB4MWMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweDE3LAorMHgwMCwweGMwLDB4ODgsMHgyMSwweDk2LDB4NTQsMHgwMCwweDFhLDB4MDIsMHhhMCwweGI4LDB4MjEsMHgxMiwweDIwLDB4ZmYsMHhlZCwKKzB4MDIsMHgyMCwweDEwLDB4MjEsMHgyNywweDgzLDB4YjMsMHhmMCwweDAwLDB4MTcsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDhjLDB4NDQsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHgyOCwweDgwLDB4ODYsMHgwMCwweDEyLAorMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgyYywweDAwLDB4MDAsMHgwNSwweDJjLDB4MDMsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4OGYsMHhhNiwweDAwLDB4NGMsMHgwMiwweGUwLDB4MzgsMHgyMSwweDAzLDB4YzAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDA3LDB4MmIsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBhLDB4MjgsMHhhZiwweGQxLDB4MDAsMHg0MCwweDk2LDB4NzQsMHgwMCwweDFhLAorMHgwOCwweDAwLDB4MGEsMHgzYiwweDAyLDB4YzAsMHhiOCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwOCwKKzB4OGMsMHg1MCwweDAwLDB4MDAsMHgwMiwweDYwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDExLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDMwLDB4NDIsMHgwMCwweGZmLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDExLAorMHhhZiwweGEyLDB4MDAsMHgxOCwweDhmLDB4YTQsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDgwLDB4MDAsMHhlZCwKKzB4MzAsMHg1MCwweDAwLDB4ZmYsMHgxMiwweDAwLDB4MDAsMHgxOCwweDI0LDB4MTEsMHgwMCwweDAxLDB4OTYsMHg2MywweDAwLDB4MTQsCisweDk2LDB4NDQsMHgwMCwweDE0LDB4MjcsMHg4NSwweDhmLDB4ZjAsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDUsMHgxMCwweDIxLDB4MDAsMHgwNCwweDE4LDB4YzAsMHg4YywweDQ2LDB4MDAsMHgwOCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjUsMHgxOCwweDIxLDB4MDAsMHgwNiwweDE3LDB4MDIsCisweDI0LDB4MDQsMHgwMCwweGZmLDB4OGMsMHg2MywweDAwLDB4MDgsMHgxMCwweDQ0LDB4MDAsMHhkNiwweDAwLDB4MDMsMHgxNywweDAyLAorMHgxMCwweDQ0LDB4MDAsMHhkNSwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2NiwweDE4LDB4MmIsMHgyNCwweDExLDB4MDAsMHgwMiwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweDQzLDB4ODgsMHgwYSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHgyMiwweDAwLDB4NWEsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTYsMHgyMiwweGZmLDB4YmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4NDksMHgwMCwweDE0LAorMHgyNywweDgyLDB4OGYsMHhmNCwweDAyLDB4YTAsMHhiOCwweDIxLDB4MDAsMHgwOSwweDUwLDB4YzAsMHgwMSwweDQ5LDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDQwLDB4ODAsMHgwMSwweDAyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg2MiwweDAwLDB4MGMsMHg4YywweDYyLDB4MDAsMHgwNCwweDAwLDB4MDUsMHgyNCwweDQyLAorMHgwMCwweDA1LDB4MWMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDEwLDB4MzAsMHg2NiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHg0MSwKKzB4MzAsMHg4NywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgwOCwweDAxLDB4MDIsMHgxMCwweDIxLDB4ODAsMHg0NCwweDAwLDB4MDAsCisweDI3LDB4ODIsMHhiNSwweDY4LDB4MDAsMHgwNCwweDE5LDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyMywweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDY0LDB4MTgsMHgyMywweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHg5MCwweDQ1LDB4MDAsMHgwNSwKKzB4MjcsMHg4NCwweGI0LDB4OTAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDkwLDB4NjMsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4MmIsCisweDJjLDB4NjQsMHgwMCwweDBjLDB4MTQsMHg4MCwweDAwLDB4MDQsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAwLDB4MDYsMHgxMSwweDAwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDI0LDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhMCwweDIyLDB4MDAsMHhiOSwKKzB4MTQsMHg4MCwweDAwLDB4MDYsMHgwMCwweDYwLDB4MjgsMHgyMSwweDAwLDB4MDcsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMSwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHgyNCwweDQ1LDB4MDAsMHgwNCwweDAxLDB4NDksMHgxMCwweDIxLAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweGEwLDB4MTgsMHgyMSwKKzB4YTAsMHg0NSwweDAwLDB4MDMsMHhhMCwweDQ1LDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDA4LDB4MTIsMHgwMiwweDAwLDB4MGIsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHg2MCwweDI4LDB4MjEsMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDhkLAorMHhhZiwweGEyLDB4MDAsMHgxMCwweDMwLDB4NTQsMHhmZiwweGZmLDB4OTIsMHg0MiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgwMiwweDEwLDB4MjUsMHgwOCwweDAwLDB4MGEsMHgzYiwweGEyLDB4NDIsMHgwMCwweDE2LDB4MDAsMHg2MCwweDI4LDB4MjEsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDFmLDB4M2UsMHhhZiwweGEwLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgwYSwweGJlLAorMHgzMCwweDU0LDB4ZmYsMHhmZiwweDA4LDB4MDAsMHgwYSwweGE2LDB4MDAsMHg2MCwweDEwLDB4MjEsMHgxNCwweDgwLDB4ZmYsMHhmZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LDB4MTEsMHgwMCwweDAwLDB4NjIsMHgxMCwweDIxLDB4MDgsMHgwMCwweDBhLDB4YTYsCisweDI0LDB4NDIsMHgwMCwweDA0LDB4MjcsMHg4MiwweDkwLDB4MDAsMHgwMSwweDAyLDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MGEsMHhiNiwweGEwLDB4NDMsMHgwMCwweDAzLDB4OTYsMHg2OSwweDAwLDB4MTQsMHgwMiwweGMwLDB4YjgsMHgyMSwKKzB4MjQsMHgwYiwweDAwLDB4MDEsMHgwMCwweDA5LDB4MTAsMHhjMCwweDAwLDB4NDksMHgxOCwweDIxLDB4MDAsMHgwMywweDQwLDB4ODAsCisweDAwLDB4NDAsMHg1MCwweDIxLDB4MjcsMHg4MiwweDhmLDB4ZjQsMHgwMSwweDAyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg2MiwweDAwLDB4MGMsMHg4YywweDYyLDB4MDAsMHgwNCwKKzB4MDAsMHgwNSwweDI0LDB4NDIsMHgwMCwweDA1LDB4MWMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDEwLDB4MzAsMHg2NiwweDAwLDB4MDEsCisweDEwLDB4NDAsMHgwMCwweDBkLDB4MzAsMHg4NywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgwOCwweDAxLDB4MDIsMHgxMCwweDIxLAorMHg4MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1OCwweDIxLDB4MDAsMHgwMywweDExLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweGI1LDB4NjAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YTAsMHg0MCwweDAwLDB4MDQsMHgxMSwweDYwLDB4MDAsMHg0ZiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMSwweDQ5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgyMCwweDgwLDB4MjcsMHg4NSwweDkwLDB4MDAsMHgwMCwweDg1LDB4MTAsMHgyMSwKKzB4ODAsMHg0MywweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDQyLDB4MDEsMHg0OSwweDEwLDB4MjEsCisweDI3LDB4ODIsMHg5MCwweDA4LDB4MDAsMHg4MiwweDEwLDB4MjEsMHg4MCwweDQ0LDB4MDAsMHgwMCwweDI3LDB4ODIsMHhiNSwweDY4LAorMHgwMCwweDA0LDB4MTksMHgwMCwweDAwLDB4NjQsMHgxOCwweDIzLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY0LDB4MTgsMHgyMywKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDkwLDB4NDUsMHgwMCwweDA1LDB4MjcsMHg4NCwweGI0LDB4OTAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4OTAsMHg2MywweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHgyYywweDJjLDB4NjQsMHgwMCwweDBjLAorMHgxNCwweDgwLDB4MDAsMHgwNCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MDAsMHgwNiwweDExLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyMSwKKzB4MjQsMHg0MiwweDAwLDB4MjQsMHgzYywweDAxLDB4YjAsMHgwMywweGEwLDB4MjIsMHgwMCwweGI5LDB4MTQsMHg4MCwweDAwLDB4MDYsCisweDAwLDB4NjAsMHgyOCwweDIxLDB4MDAsMHgwNywweDEwLDB4NDAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMSwweDAwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDI0LDB4NDUsMHgwMCwweDA0LDB4MDEsMHg0OSwweDEwLDB4MjEsMHgyNywweDgzLDB4OTAsMHgwMCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4YTAsMHgxOCwweDIxLDB4YTAsMHg0NSwweDAwLDB4MDMsCisweGEwLDB4NDUsMHgwMCwweDAwLDB4OGYsMHhhNCwweDAwLDB4MTgsMHgyNCwweDAyLDB4MDAsMHgwOCwweDEwLDB4ODIsMHgwMCwweDBjLAorMHgwMCwweDYwLDB4MjgsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDIsMHg2MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHg4ZCwKKzB4YWYsMHhhMiwweDAwLDB4MTAsMHg4ZiwweGEzLDB4MDAsMHgxOCwweDMwLDB4NTQsMHhmZiwweGZmLDB4OTIsMHg2MiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjUsMHgwOCwweDAwLDB4MGEsMHgzYiwweGEyLDB4NjIsMHgwMCwweDE2LAorMHgwMiwweDYwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDNlLDB4YWYsMHhhMCwweDAwLDB4MTAsMHgwOCwweDAwLDB4MGIsMHgyZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGIsMHgxNSwweDAwLDB4NjAsMHgxMCwweDIxLDB4MTQsMHg4MCwweGZmLDB4ZmQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDExLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDA4LDB4MDAsMHgwYiwweDE1LAorMHgyNCwweDQyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDBiLDB4MjUsMHhhMCwweDQzLDB4MDAsMHgwMywweDI3LDB4ODUsMHg5MCwweDAwLDB4MDgsMHgwMCwweDBiLDB4NDEsCisweDAxLDB4NDksMHgxMCwweDIxLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDYyLDB4MTgsMHgyNiwweDA4LDB4MDAsMHgwYSwweDc2LAorMHgwMCwweGMyLDB4MzAsMHgyNiwweDEyLDB4MDAsMHhmZiwweDJkLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MGEsMHg3YiwKKzB4MjQsMHgxMSwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDAsCisweDI0LDB4NDIsMHgyZCwweDQ0LDB4MzQsMHg2MywweDAwLDB4MjAsMHgzYywweDA1LDB4YjAsMHgwNSwweGFmLDB4YjMsMHgwMCwweDI0LAorMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiZiwweDAwLDB4MjgsMHhhZiwweGIwLDB4MDAsMHgxOCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDIsMHg0MiwweDkwLDB4YTIsMHgwMCwweDAwLDB4MDAsMHg4MCwweDkwLDB4MjEsCisweDI0LDB4MTEsMHgwMCwweDEwLDB4MzAsMHg1MywweDAwLDB4ZmYsMHgyNCwweDAyLDB4MDAsMHgxMCwweDEyLDB4MjIsMHgwMCwweGNmLAorMHgwMCwweDAwLDB4MTgsMHgyMSwweDI0LDB4MDIsMHgwMCwweDExLDB4MTIsMHgyMiwweDAwLDB4YzEsMHgyNCwweDAyLDB4MDAsMHgxMiwKKzB4MTIsMHgyMiwweDAwLDB4YjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweGFkLDB4YWUsMHg0MywweDAwLDB4NDAsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAyLDB4MmMsMHg4YywweDQ0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHgwMCwweDAyLAorMHgzNCwweDYzLDB4MDAsMHhmZiwweDAwLDB4ODMsMHg4MCwweDI0LDB4MDAsMHgxMCwweDE0LDB4NDMsMHgxMCwweDQwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZSwweDQyLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4OTIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4MywweDhiLDB4NjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjIsMHgwMCwweDAyLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDMyLDB4MTAsMHgwMCwweGZmLDB4MDAsMHgxMCwweDExLDB4YzMsMHgxNCwweDQwLDB4MDAsMHg4NiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgxNSwweDAyLDB4MDAsMHgxMCwweDIxLDB4MjYsMHgyMiwweDAwLDB4MDEsCisweDMwLDB4NTEsMHgwMCwweGZmLDB4MmUsMHgyMywweDAwLDB4MTMsMHgxNCwweDYwLDB4ZmYsMHhkYiwweDI0LDB4MDMsMHgwMCwweDAyLAorMHgxMiwweDYzLDB4MDAsMHg3MywweDI0LDB4MDIsMHgwMCwweDA1LDB4MmEsMHg2MiwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHg1OCwKKzB4MjQsMHgwMiwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4NjIsMHgwMCwweDRiLDB4MDIsMHg0MCwweDIwLDB4MjEsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAyLDB4MmMsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDcwLDB4MDAsMHhmZiwweDEyLDB4MDAsMHgwMCwweDA2LDB4MDIsMHgwMCwweDEwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgyOCwKKzB4N2IsMHhiMiwweDAxLDB4M2MsMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzAsCisweDkyLDB4NDYsMHgwMCwweDA0LDB4OGUsMHg0MywweDAwLDB4MjQsMHgyNCwweDAyLDB4MDAsMHgwNywweDAyLDB4NDAsMHgyMCwweDIxLAorMHgwMCwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDcsMHgwMCwweDA2LDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlNiwKKzB4YWYsMHhhMywweDAwLDB4MTQsMHhhZSwweDQyLDB4MDAsMHgyNCwweDNjLDB4MDIsMHhiMCwweDA1LDB4OGMsMHg0MiwweDAyLDB4MmMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg1MCwweDAwLDB4ZmYsMHgxNiwweDAwLDB4ZmYsMHhlYywweDAyLDB4MDAsMHgxMCwweDIxLAorMHg5MiwweDQ2LDB4MDAsMHgwNSwweDhlLDB4NDMsMHgwMCwweDI4LDB4MjQsMHgwMiwweDAwLDB4MDUsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MjQsMHgwNSwweDAwLDB4MDEsMHgyNCwweDA3LDB4MDAsMHgwNCwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZTYsCisweGFmLDB4YTMsMHgwMCwweDE0LDB4YWUsMHg0MiwweDAwLDB4MjgsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMiwweDJjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NTAsMHgwMCwweGZmLDB4MTYsMHgwMCwweGZmLDB4ZGMsMHgwMiwweDAwLDB4MTAsMHgyMSwKKzB4OTIsMHg0NiwweDAwLDB4MDYsMHg4ZSwweDQzLDB4MDAsMHgyYywweDI0LDB4MDIsMHgwMCwweDAzLDB4MDIsMHg0MCwweDIwLDB4MjEsCisweDI0LDB4MDUsMHgwMCwweDAyLDB4MDAsMHgwMCwweDM4LDB4MjEsMHhhZiwweGEyLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGU2LAorMHhhZiwweGEzLDB4MDAsMHgxNCwweGFlLDB4NDIsMHgwMCwweDJjLDB4M2MsMHgwMiwweGIwLDB4MDUsMHg4YywweDQyLDB4MDIsMHgyYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDUwLDB4MDAsMHhmZiwweDE2LDB4MDAsMHhmZiwweGNjLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDkyLDB4NDYsMHgwMCwweDA3LDB4OGUsMHg0MywweDAwLDB4MzAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDAyLDB4NDAsMHgyMCwweDIxLAorMHgyNCwweDA1LDB4MDAsMHgwMywweDI0LDB4MDcsMHgwMCwweDAxLDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlNiwKKzB4YWYsMHhhMywweDAwLDB4MTQsMHhhZSwweDQyLDB4MDAsMHgzMCwweDNjLDB4MDIsMHhiMCwweDA1LDB4OGMsMHg0MiwweDAyLDB4MmMsCisweDA4LDB4MDAsMHgwYiwweDk3LDB4MzAsMHg0MiwweDAwLDB4ZmYsMHg5MiwweDQ2LDB4MDAsMHgwNCwweDhlLDB4NDMsMHgwMCwweDI0LAorMHgyNCwweDAyLDB4MDAsMHgwNywweDAwLDB4MDAsMHgyOCwweDIxLDB4MjQsMHgwNywweDAwLDB4MDYsMHhhZiwweGEyLDB4MDAsMHgxMCwKKzB4MGMsMHgwMCwweDA5LDB4ZTYsMHhhZiwweGEzLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgwYiwweDkwLDB4YWUsMHg0MiwweDAwLDB4MjQsCisweDEyLDB4NjIsMHgwMCwweDBkLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwOCwweDE2LDB4NjIsMHhmZiwweGE4LAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDkyLDB4NDYsMHgwMCwweDA3LDB4OGUsMHg0MiwweDAwLDB4MzAsMHgyNCwweDA1LDB4MDAsMHgwMywKKzB4MjQsMHgwNywweDAwLDB4MDEsMHhhZiwweGEzLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGU2LDB4YWYsMHhhMiwweDAwLDB4MTQsCisweDA4LDB4MDAsMHgwYiwweDkwLDB4YWUsMHg0MiwweDAwLDB4MzAsMHg5MiwweDQ2LDB4MDAsMHgwNiwweDhlLDB4NDMsMHgwMCwweDJjLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAyLDB4MDAsMHgwMCwweDM4LDB4MjEsMHhhZiwweGEyLDB4MDAsMHgxMCwKKzB4MGMsMHgwMCwweDA5LDB4ZTYsMHhhZiwweGEzLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgwYiwweDkwLDB4YWUsMHg0MiwweDAwLDB4MmMsCisweDkyLDB4NDYsMHgwMCwweDA1LDB4OGUsMHg0MywweDAwLDB4MjgsMHgwMiwweDQwLDB4MjAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAxLAorMHgyNCwweDA3LDB4MDAsMHgwNCwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZTYsMHhhZiwweGEzLDB4MDAsMHgxNCwKKzB4MDgsMHgwMCwweDBiLDB4OTAsMHhhZSwweDQyLDB4MDAsMHgyOCwweDBjLDB4MDAsMHgwMSwweDU5LDB4MjQsMHgwNCwweDAwLDB4MDEsCisweDA4LDB4MDAsMHgwYiwweDgxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg0LDB4YjQsMHgzMCwweGFlLDB4NDAsMHgwMCwweDM0LAorMHg5NCwweDg1LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgxYiwweDg0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MywweDgzLDB4OGIsMHg2MSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYyLDB4MDAsMHgwMiwweDEwLDB4NDAsMHhmZiwweDY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwMSwweDU5LDB4MDAsMHgwMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MGIsMHg3OSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwOSwweDVkLDB4MDIsMHgyMCwweDI4LDB4MjEsMHgwOCwweDAwLDB4MGIsMHg2ZCwKKzB4M2MsMHgwMiwweGIwLDB4MDUsMHg4ZSwweDQyLDB4MDAsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4NGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4NDIsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxOCwweDJiLDB4MDgsMHgwMCwweDBiLDB4NmEsMHhhZSwweDQzLDB4MDAsMHgzYywKKzB4OGUsMHg0MiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDNkLDB4MjQsMHgwMiwweDAwLDB4MTIsCisweDhmLDB4ODIsMHhiNCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDQyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MTgsMHgyYiwweDA4LDB4MDAsMHgwYiwweDZhLDB4YWUsMHg0MywweDAwLDB4MzgsMHg4ZSwweDQyLDB4MDAsMHgzNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHgzMCwweDI0LDB4MDIsMHgwMCwweDExLDB4OGYsMHg4MiwweGI0LDB4MzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg0MiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxOCwweDJiLAorMHgwOCwweDAwLDB4MGIsMHg2YSwweGFlLDB4NDMsMHgwMCwweDM0LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgzMCwweGY4LDB4M2MsMHgwOCwweGIwLDB4MDMsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNSwweDA4LDB4MDEsMHgwMCwweGFmLDB4YmYsMHgwMCwweDE4LAorMHhhZiwweGIwLDB4MDAsMHgxMCwweDkxLDB4MDMsMHgwMCwweDAwLDB4MDAsMHhhMCwweDQ4LDB4MjEsMHgyNCwweDExLDB4MDAsMHgwYSwKKzB4MmMsMHhhNSwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgxMCwweDAwLDB4NDUsMHg4OCwweDBhLDB4MzAsMHg2MywweDAwLDB4MDEsCisweDAwLDB4YzAsMHgyOCwweDIxLDB4MTQsMHg2MCwweDAwLDB4MDIsMHgwMCwweDExLDB4NDAsMHg0MCwweDAyLDB4MjAsMHg0MCwweDIxLAorMHg4NCwweDgzLDB4MDAsMHgwYywweDMxLDB4MTEsMHgwMCwweGZmLDB4MDEsMHgyMCwweDIwLDB4MjEsMHgwMCwweDAzLDB4MTAsMHhjMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg4ZiwweGY4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDg0LDB4NDMsMHgwMCwweDA0LDB4MjQsMHgwNiwweDAwLDB4MGUsMHgxMCwweGUwLDB4MDAsMHgwNiwweDAyLDB4MjMsMHg4MCwweDIxLAorMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjAsMHgwYywweDAwLDB4MDgsMHhkZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMSwweDE4LDB4MjEsCisweDA4LDB4MDAsMHgwYywweDYwLDB4MDAsMHg2MiwweDgwLDB4MjEsMHgyNywweGJkLDB4ZmYsMHhkMCwweGFmLDB4YmYsMHgwMCwweDI4LAorMHhhZiwweGI0LDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGI1LDB4MDAsMHgyNCwKKzB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDg0LDB4ODIsMHgwMCwweDBjLDB4M2MsMHgwNiwweGIwLDB4MDMsCisweDM0LDB4YzYsMHgwMCwweDIwLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgyNywweDgyLDB4OGYsMHhmNCwweDAwLDB4NjIsMHgxMCwweDIxLDB4OGMsMHg1NSwweDAwLDB4MTgsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MjQsMHg0MiwweDMxLDB4YTgsMHhhYywweGMyLDB4MDAsMHgwMCwweDhlLDB4YjAsMHgwMCwweDA4LDB4MjcsMHg4MiwweDhmLDB4ZjgsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4OTAsMHg3MSwweDAwLDB4MDcsMHgwMCwweDEwLDB4ODYsMHg0MywweDMyLDB4MTAsMHgwMCwweDAxLAorMHgwMCwweGEwLDB4MzgsMHgyMSwweDAyLDB4MDAsMHgzMCwweDIxLDB4MDAsMHhhMCwweDk4LDB4MjEsMHgwMiwweDIwLDB4MjgsMHgyMSwKKzB4MGMsMHgwMCwweDBjLDB4M2UsMHgwMCwweDgwLDB4OTAsMHgyMSwweDAyLDB4MjAsMHgyMCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDI0LDB4MDYsMHgwMCwweDE0LDB4MGMsMHgwMCwweDA4LDB4ZGYsMHgwMCwweDQwLDB4YTAsMHgyMSwweDg2LDB4NDMsMHgwMCwweDBjLAorMHgzYywweDA5LDB4YjAsMHgwOSwweDNjLDB4MDgsMHhiMCwweDA5LDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODAsMHg0MywweDAwLDB4MDYsCisweDNjLDB4MDcsMHhiMCwweDA5LDB4M2MsMHgwNSwweGIwLDB4MDksMHgyOCwweDYyLDB4MDAsMHgwMCwweDI0LDB4NjQsMHgwMCwweDAzLAorMHgwMCwweDgyLDB4MTgsMHgwYiwweDAwLDB4MDMsMHgxOCwweDgzLDB4M2MsMHgwMiwweGIwLDB4MDksMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MzQsMHg0MiwweDAxLDB4MDIsMHgzNSwweDI5LDB4MDEsMHgxMCwweDM1LDB4MDgsMHgwMSwweDE0LDB4MzQsMHhlNywweDAxLDB4MjAsCisweDM0LDB4YTUsMHgwMSwweDI0LDB4YTQsMHg1NCwweDAwLDB4MDAsMHgxMiwweDYwLDB4MDAsMHgxMSwweDAyLDB4YTMsMHhhOCwweDIxLAorMHg4ZSwweGEyLDB4MDAsMHgwYywweDhlLDB4YTMsMHgwMCwweDA4LDB4MDAsMHgwMiwweDE0LDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMiwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhZCwweDIyLDB4MDAsMHgwMCwweDhlLDB4YTMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDMsMHgxYywweDAyLDB4YTUsMHgwMywweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgyOCwweDdiLDB4YjQsMHgwMSwweDNjLAorMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgzMCwKKzB4OGUsMHhhMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFkLDB4MjIsMHgwMCwweDAwLDB4OGUsMHhhNCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTUsMHgwNCwweDAwLDB4MDAsMHg3YSwweGEyLDB4MDAsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MWMsMHgwMCwweDAwLDB4MDIsMHgxNCwweDAyLDB4MDAsMHg2MiwweDE4LDB4MjEsMHhhYywweGUzLDB4MDAsMHgwMCwKKzB4OGUsMHhhMiwweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNCwweDAyLDB4MDgsMHgwMCwweDBjLDB4YjIsCisweGE0LDB4YTIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTAsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhZiwweGJmLDB4MDAsMHgxYywweGFmLDB4YjEsMHgwMCwweDE0LDB4ODQsMHg4MiwweDAwLDB4MGMsMHgwMCwweDgwLDB4OTAsMHgyMSwKKzB4M2MsMHgwNSwweGIwLDB4MDMsMHgwMCwweDAyLDB4MjAsMHhjMCwweDAwLDB4ODIsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsCisweDI3LDB4ODIsMHg4ZiwweGY0LDB4MDAsMHg4MiwweDEwLDB4MjEsMHg4YywweDUxLDB4MDAsMHgxOCwweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzNCwweGE1LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgzMywweDI0LDB4MjcsMHg4MywweDhmLDB4ZjgsMHhhYywweGEyLDB4MDAsMHgwMCwKKzB4MDAsMHg4MywweDIwLDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywweDkwLDB4ODYsMHgwMCwweDA3LDB4MzQsMHg0MiwweDAxLDB4MDAsCisweDhlLDB4MjMsMHgwMCwweDA4LDB4OTAsMHg0NCwweDAwLDB4MDAsMHgyYywweGM1LDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDEwLAorMHgyNCwweDEwLDB4MDAsMHgwYSwweDAwLDB4NDUsMHg4MCwweDBhLDB4MDAsMHgwMywweDFlLDB4NDMsMHgzMCwweDg0LDB4MDAsMHgwMSwKKzB4MzAsMHg2NSwweDAwLDB4MDEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDAwLDB4YzAsMHgyMCwweDIxLDB4MjQsMHgwNiwweDAwLDB4MjAsMHgwYywweDAwLDB4MDgsMHhkZiwweDMwLDB4NTAsMHgwMCwweGZmLAorMHg4NiwweDQ0LDB4MDAsMHgwYywweDI3LDB4ODUsMHg5MCwweDAwLDB4M2MsMHgwNiwweGIwLDB4MDksMHgwMCwweDA0LDB4MTgsMHhjMCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjUsMHgxOCwweDIxLDB4ODAsMHg2NCwweDAwLDB4MDYsCisweDAwLDB4NTAsMHgxMCwweDIxLDB4MzQsMHhjNiwweDAxLDB4MDIsMHgyNCwweDg1LDB4MDAsMHgwMywweDI4LDB4ODMsMHgwMCwweDAwLAorMHgwMCwweGEzLDB4MjAsMHgwYiwweDAwLDB4MDQsMHgyMCwweDgzLDB4MDAsMHgwNCwweDIwLDB4ODAsMHhhNCwweGMyLDB4MDAsMHgwMCwKKzB4MDIsMHgyNCwweDIwLDB4MjEsMHg4YywweDgzLDB4MDAsMHgwNCwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4MTAsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4NiwweDAwLDB4MDgsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMSwweDE0LAorMHhhNCwweDQ2LDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDBjLDB4OGMsMHg4MiwweDAwLDB4MDgsMHgzYywweDA2LDB4YjAsMHgwOSwKKzB4MDAsMHgwNSwweDJjLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMiwweDAwLDB4YTIsMHgyOCwweDIxLDB4MzQsMHhjNiwweDAxLDB4MjAsCisweGFjLDB4YzUsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MGMsMHgzYywweDA1LDB4YjAsMHgwOSwweDM0LDB4YTUsMHgwMSwweDI0LAorMHgwMCwweDAzLDB4MWMsMHgwMiwweGE0LDB4YTMsMHgwMCwweDAwLDB4OTIsMHg0MiwweDAwLDB4MGEsMHgzYywweDAzLDB4YjAsMHgwOSwKKzB4MzQsMHg2MywweDAxLDB4MzAsMHgwMCwweDAyLDB4MTMsMHgwMCwweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsCisweGE0LDB4NjIsMHgwMCwweDAwLDB4ODYsMHg0NCwweDAwLDB4MGMsMHgyNywweDgzLDB4OTAsMHgwOCwweDhmLDB4YmYsMHgwMCwweDFjLAorMHgwMCwweDA0LDB4MTAsMHhjMCwweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTQsMHg0NCwweDAwLDB4MDIsMHg4ZiwweGIyLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLDB4M2MsMHgwNSwweGIwLDB4MDksCisweDM0LDB4YTUsMHgwMSwweDMyLDB4YTQsMHhhNCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDAsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4MzQsMHg0MiwweDAwLDB4MjAsMHgwMCwweGEwLDB4ODAsMHgyMSwweDI0LDB4NjMsMHgzNCwweGIwLDB4MDAsMHgwNSwweDJjLDB4NDMsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiZiwweDAwLDB4MTgsMHhhYywweDQzLDB4MDAsMHgwMCwweDEwLDB4YTAsMHgwMCwweDA1LAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDhjLDB4ODIsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHhiNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMiwweDEwLDB4MDAsMHhmZiwweDEyLDB4MDAsMHgwMCwweDRjLDB4MDAsMHgwMCwweDEwLDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDA4LDB4MTIsMHgwMiwweDAwLDB4YTMsMHgyYSwweDAyLDB4MDAsMHgwOSwweDEwLDB4NDAsMHgwMCwweDg5LAorMHgyNCwweDAyLDB4MDAsMHg0MCwweDI0LDB4MDQsMHgwMCwweDAyLDB4MTIsMHgwNCwweDAwLDB4NzksMHgyYSwweDAyLDB4MDAsMHgwMywKKzB4MTAsMHg0MCwweDAwLDB4NjksMHgyNCwweDAyLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHgwMiwweDAwLDB4NWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLAorMHhhMiwweDIwLDB4MDAsMHg0ZSwweGFjLDB4NDMsMHgwMCwweDAwLDB4ODIsMHgyNCwweDAwLDB4MTEsMHg5MiwweDI3LDB4MDAsMHgxMSwKKzB4MTAsMHg4MCwweDAwLDB4NGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4MjYsMHgwMCwweDBhLDB4MjQsMHgwMiwweDAwLDB4MTIsCisweDEwLDB4NDYsMHgwMCwweDA5LDB4MzAsMHhjMiwweDAwLDB4ZmYsMHgyNywweDgzLDB4YjMsMHhmMCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NCwweDgzLDB4MDAsMHgxNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNiwweDIzLDB4MDAsMHgwYywweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAwLDB4NDAsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwMywweGEyLDB4MjMsMHgwMCwweDEwLAorMHgxNCwweDYwLDB4MDAsMHgyYiwweDMwLDB4NjUsMHgwMCwweDAxLDB4MzAsMHhjMiwweDAwLDB4ZmYsMHgyNywweDgzLDB4YjMsMHhmMCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4ODIsMHgyMywweDAwLDB4MTIsCisweDkwLDB4ODIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTEsMHg0MiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgyNiwweDAwLDB4MTQsMHg4MCwweDAwLDB4MTgsMHhhMiwweDIzLDB4MDAsMHgxMiwKKzB4MDAsMHgwNywweDE2LDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4OTYsMHgyMywweDAwLDB4MGMsCisweDI3LDB4ODQsMHg5MCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDgwLDB4NDUsMHgwMCwweDA2LDB4MDAsMHgwMywweDFhLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMCwKKzB4MDAsMHg2NSwweDE4LDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyMSwweDkwLDB4NjQsMHgwMCwweDAwLDB4OTAsMHg2MiwweDAwLDB4MDQsCisweGEyLDB4MjAsMHgwMCwweDE1LDB4YTMsMHg4MCwweDhiLDB4YzQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDhmLDB4YmYsMHgwMCwweDE4LAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgwYywweDAwLDB4MGMsMHhjOSwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHg5MiwweDI3LDB4MDAsMHgxMSwweDA4LDB4MDAsMHgwZCwweDc5LDB4MDAsMHgwNywweDE2LDB4MDAsCisweDBjLDB4MDAsMHgwYywweDZhLDB4MDIsMHgyMCwweDIwLDB4MjEsMHg4NiwweDIzLDB4MDAsMHgwYywweDI3LDB4ODQsMHg4ZiwweGY4LAorMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MjAsMHgyMSwKKzB4OTAsMHg4NSwweDAwLDB4MDcsMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YTIsMHgyNSwweDAwLDB4MTMsCisweDkwLDB4ODMsMHgwMCwweDA3LDB4MDgsMHgwMCwweDBkLDB4OTEsMHhhMCwweDQzLDB4MDAsMHgwMiwweDkyLDB4MjYsMHgwMCwweDBhLAorMHgwOCwweDAwLDB4MGQsMHg1YSwweDMwLDB4YzIsMHgwMCwweGZmLDB4OGUsMHgyMiwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg1MCwweDAwLDB4MDcsMHhhMiwweDIwLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDA3LDB4YTIsMHgyMiwweDAwLDB4MGEsCisweDkyLDB4MjIsMHgwMCwweDI3LDB4YWUsMHgyMCwweDAwLDB4MjQsMHgwOCwweDAwLDB4MGQsMHg0ZCwweGEyLDB4MjIsMHgwMCwweDA0LAorMHgwOCwweDAwLDB4MGQsMHhhYiwweDI0LDB4MDIsMHgwMCwweDA2LDB4MTYsMHgwMiwweGZmLDB4OWIsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4OGUsMHgyMywweDAwLDB4MmMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDA3LDB4YTIsMHgyNCwweDAwLDB4MDgsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4YTIsMHgyMiwweDAwLDB4MGEsMHg5MiwweDIyLDB4MDAsMHgyZiwweGFlLDB4MjAsMHgwMCwweDJjLAorMHgwOCwweDAwLDB4MGQsMHg0ZCwweGEyLDB4MjIsMHgwMCwweDA2LDB4MDgsMHgwMCwweDBkLDB4YmEsMHhhMiwweDIwLDB4MDAsMHgwYSwKKzB4OGUsMHgyMiwweDAwLDB4MjgsMHgyNCwweDAzLDB4MDAsMHgwMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4MTAsMHg0NCwweDAwLDB4MDcsCisweGEyLDB4MjMsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDUsMHhhMiwweDIyLDB4MDAsMHgwYSwweDkyLDB4MjIsMHgwMCwweDJiLAorMHhhZSwweDIwLDB4MDAsMHgyOCwweDA4LDB4MDAsMHgwZCwweDRkLDB4YTIsMHgyMiwweDAwLDB4MDUsMHgwOCwweDAwLDB4MGQsMHhjNiwKKzB4MjQsMHgwMiwweDAwLDB4MDQsMHgxMiwweDAyLDB4MDAsMHgxMiwweDJhLDB4MDIsMHgwMCwweDQxLDB4MTAsMHg0MCwweDAwLDB4MDksCisweDI0LDB4MDIsMHgwMCwweDgwLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxNiwweDAyLDB4ZmYsMHg3YiwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgxMiwweGEyLDB4MjIsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGQsMHg0ZCwKKzB4YWUsMHgyMCwweDAwLDB4M2MsMHgxNiwweDAyLDB4ZmYsMHg3NCwweDNjLDB4MDIsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MTAsCisweGEyLDB4MjIsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGQsMHg0ZCwweGFlLDB4MjAsMHgwMCwweDM0LAorMHgyNCwweDAyLDB4MDAsMHgxMSwweGEyLDB4MjIsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGQsMHg0ZCwKKzB4YWUsMHgyMCwweDAwLDB4MzgsMHg4ZSwweDI0LDB4MDAsMHgzMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDEsCisweDEwLDB4ODMsMHgwMCwweDA3LDB4YTIsMHgyMiwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMiwweGEyLDB4MjIsMHgwMCwweDBhLAorMHg5MiwweDIyLDB4MDAsMHgzMywweGFlLDB4MjAsMHgwMCwweDMwLDB4MDgsMHgwMCwweDBkLDB4NGQsMHhhMiwweDIyLDB4MDAsMHgwNywKKzB4MDgsMHgwMCwweDBkLDB4ZWMsMHhhMiwweDI0LDB4MDAsMHgwYSwweDhmLDB4ODQsMHhiNCwweDMwLDB4YWUsMHgyMCwweDAwLDB4MzQsCisweDk0LDB4ODUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDFiLDB4ODQsMHgzMiwweDEwLDB4MDAsMHhmZiwweDA4LDB4MDAsMHgwZCwweDNlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4MzcsMHhlNCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHhhYywweDYyLDB4MDAsMHgwMCwweDgwLDB4YTIsMHgwMCwweDE1LDB4M2MsMHgwNiwweGIwLDB4MDUsCisweDEwLDB4NDAsMHgwMCwweDBhLDB4MzQsMHhjNiwweDAyLDB4NTQsMHg4MywweDgzLDB4OGIsMHhjNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhYywweDgzLDB4MDAsMHgyNCwweDhjLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTcsMHg0MiwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODIsMHgwMCwweDI4LDB4OGMsMHg4MiwweDAwLDB4MmMsCisweDNjLDB4MDYsMHhiMCwweDA1LDB4MzQsMHhjNiwweDA0LDB4NTAsMHgwMCwweDAyLDB4MTgsMHg0MywweDMwLDB4NjMsMHgwMCwweDAxLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDMwLDB4NDUsMHgwMCwweDAxLDB4YWMsMHg4MywweDAwLDB4MjgsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHg4NSwweDAwLDB4MjQsMHg5MCwweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsCisweDMwLDB4NDMsMHgwMCwweDAyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHhhYywweDgzLDB4MDAsMHgyOCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhYywweDgyLDB4MDAsMHgyNCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkOCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MzgsMHg3NCwweGFjLDB4NjIsMHgwMCwweDAwLDB4YWYsMHhiMSwweDAwLDB4MWMsCisweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMCwweDAwLDB4MTgsMHg5MCwweGE2LDB4MDAsMHgwYSwweDI3LDB4ODMsMHhiMywweGYwLAorMHgwMCwweGEwLDB4ODgsMHgyMSwweDAwLDB4MDYsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDUwLDB4MDAsMHgwMCwKKzB4ODAsMHhhNSwweDAwLDB4MTEsMHg5MiwweDAzLDB4MDAsMHgxMiwweDEwLDB4YTAsMHgwMCwweDA0LDB4YTIsMHgyMCwweDAwLDB4MTUsCisweDI0LDB4MDIsMHgwMCwweDEyLDB4MTAsMHhjMiwweDAwLDB4ZGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgyLDB4MjIsMHgwMCwweDEyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDY3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMiwweDIwLDB4MDAsMHgxMiwKKzB4YTIsMHgwMCwweDAwLDB4MTksMHg4NiwweDIzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgxMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhMCwweDQwLDB4MDAsMHgwMCwweDkyLDB4MDMsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHhkZiwKKzB4YTIsMHgwMywweDAwLDB4MTYsMHg4MiwweDAyLDB4MDAsMHgxMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MjAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgyMywweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDQ1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4MjAsMHgwMCwweDA0LDB4OTIsMHgwOCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTUsMHgwMCwweDAwLDB4MWUsMHgyNCwweDAyLDB4MDAsMHgwMSwweDkyLDB4MDcsMHgwMCwweDBhLDB4YTIsMHgwMiwweDAwLDB4MTcsCisweDkyLDB4MDIsMHgwMCwweDE2LDB4MzAsMHhlMywweDAwLDB4ZmYsMHgzMCwweDQyLDB4MDAsMHhlNCwweDEwLDB4NjAsMHgwMCwweDAzLAorMHhhMiwweDAyLDB4MDAsMHgxNiwweDM0LDB4NDIsMHgwMCwweDAxLDB4YTIsMHgwMiwweDAwLDB4MTYsMHgxMSwweDAwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDAyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MDIsCisweGEyLDB4MDIsMHgwMCwweDE2LDB4OTIsMHgwMiwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNiwweDAyLDB4MDAsMHgxNCwKKzB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDk2LDB4MDIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NjgsMHhhNiwweDAyLDB4MDAsMHgxNCwweDkyLDB4MDcsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4ZTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGUsMHg1NCwKKzB4YTIsMHgwMCwweDAwLDB4MTcsMHg5NiwweDA0LDB4MDAsMHgwMCwweDk2LDB4MDUsMHgwMCwweDA2LDB4MjcsMHg4NiwweDhmLDB4ZjAsCisweDAwLDB4MDQsMHgxOCwweGMwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDA1LDB4MTAsMHhjMCwweDAwLDB4NDUsMHgxMCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4OGMsMHg2NiwweDAwLDB4MDgsMHg4YywweDQ1LDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MDAsMHhjMywweDIwLDB4MjQsCisweDEwLDB4ODAsMHgwMCwweDA4LDB4MDAsMHhhMywweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgxOCwweDIxLAorMHgxMCwweDgwLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHhhNiwweDE4LDB4MmIsMHgwOCwweDAwLDB4MGUsMHg1NCwKKzB4YTIsMHgwMywweDAwLDB4MTcsMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4YTYsMHgxOCwweDJiLDB4MDgsMHgwMCwweDBlLDB4ODgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4NjIsMHgwMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4NjIsMHhmZiwweGI4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGUsMHg0ZSwKKzB4YTIsMHgyMCwweDAwLDB4MDcsMHgwOCwweDAwLDB4MGUsMHg0ZSwweGEyLDB4MjAsMHgwMCwweDA2LDB4MDgsMHgwMCwweDBlLDB4NGUsCisweGEyLDB4MjAsMHgwMCwweDA1LDB4ODIsMHgyMiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDY5LAorMHgyYywweDYyLDB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweDQ5LDB4M2MsMHgwMiwweGIwLDB4MDksMHg5MiwweDI1LDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE2LDB4MDAsMHhmZiwweDJjLDB4YzIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4M2IsCisweDJjLDB4YzIsMHgwMCwweDEwLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDAwLDB4YzIsMHgxMCwweDA0LDB4MDAsMHgwMiwweDEwLDB4MjcsMHgwMCwweDYyLDB4MTgsMHgyNCwKKzB4YTAsMHg4MywweDAwLDB4MDAsMHg4NiwweDIzLDB4MDAsMHgwYywweDk2LDB4MjYsMHgwMCwweDBjLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDI4LDB4ODAsMHgyNywweDgzLDB4OGYsMHhmNCwweDAwLDB4YTMsMHgxOCwweDIxLAorMHg4YywweDY0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHgxOCwweDI0LDB4MDcsMHgwMCwweDAxLDB4OTMsMHg4MiwweDhiLDB4NjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHgwYSwweDI0LDB4MDUsMHgwMCwweDI0LAorMHgwMCwweDA2LDB4MmMsMHgwMCwweDAwLDB4MDUsMHgyYywweDAzLDB4MGMsMHgwMCwweDFiLDB4ODQsMHgwMiwweDAwLDB4MjAsMHgyMSwKKzB4OTIsMHgwMiwweDAwLDB4MTYsMHhhMiwweDAwLDB4MDAsMHgxMiwweDMwLDB4NDIsMHgwMCwweGU3LDB4MDgsMHgwMCwweDBlLDB4NDUsCisweGEyLDB4MDIsMHgwMCwweDE2LDB4ZjAsMHhjNSwweDAwLDB4MDYsMHgwMCwweDAwLDB4MjgsMHgxMiwweDI3LDB4ODIsMHg4ZiwweGYwLAorMHgwMCwweGEyLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwMSwweDRiLDB4M2MsMHgwNCwweDAwLDB4ODAsMHg5NiwweDI2LDB4MDAsMHgwYywKKzB4MDgsMHgwMCwweDBlLDB4YzUsMHgwMCwweDA2LDB4MmMsMHgwMCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MDgsCisweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHhhMywweDE4LDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDkwLDB4NjUsMHgwMCwweDA1LAorMHg5MywweDgyLDB4ODAsMHgxMCwweDAwLDB4MDAsMHgzMCwweDIxLDB4MGMsMHgwMCwweDIxLDB4ZjUsMHhhZiwweGEyLDB4MDAsMHgxMCwKKzB4OTYsMHgyNiwweDAwLDB4MGMsMHgwOCwweDAwLDB4MGUsMHhiZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4Y2QsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweDBmLAorMHgyNCwweDAyLDB4MDAsMHg4MCwweDA4LDB4MDAsMHgwZSwweGFlLDB4MDAsMHhhMiwweDEwLDB4MDcsMHg4NiwweDI2LDB4MDAsMHgwYywKKzB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHg3MiwweDM0LDB4NjMsMHgwMSwweDc4LDB4OTQsMHg0NywweDAwLDB4MDAsCisweDhjLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwNiwweDEwLDB4YzAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDNjLDB4MDQsMHhiMCwweDA5LAorMHhhZSwweDI1LDB4MDAsMHgxYywweDM0LDB4ODQsMHgwMSwweDdjLDB4MjcsMHg4MywweDhmLDB4ZjQsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4OGMsMHg4NSwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LDB4YWUsMHgyNSwweDAwLDB4MjAsCisweGE2LDB4MjcsMHgwMCwweDE4LDB4OGMsMHg2NiwweDAwLDB4MDgsMHgwMiwweDIwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwZiwweDE1LAorMHgwMCwweDAwLDB4MjgsMHgyMSwweDg2LDB4MjUsMHgwMCwweDE4LDB4OGUsMHgyNiwweDAwLDB4MWMsMHg4ZSwweDI3LDB4MDAsMHgyMCwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWMsMHg4NiwweGFmLDB4YTIsMHgwMCwweDEwLDB4MDgsMHgwMCwweDBlLDB4NDUsCisweGEyLDB4MDIsMHgwMCwweDEyLDB4OTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGUsMHg0NSwweGEyLDB4MjIsMHgwMCwweDA5LAorMHhhMiwweDIwLDB4MDAsMHgxMSwweDgwLDB4ODIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMywKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhkMCwweGFjLDB4NDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NDUsCisweGEwLDB4ODAsMHgwMCwweDUwLDB4OTQsMHg4YSwweDAwLDB4MGMsMHgyNCwweDAzLDB4MDAsMHgyNCwweDAwLDB4ODAsMHg3MCwweDIxLAorMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAzLDB4MjQsMHg0MiwweDNjLDB4NTQsMHhmMSwweDQzLDB4MDAsMHgwNiwKKzB4MzQsMHg4NCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MTgsMHgxMiwweDAwLDB4YTAsMHg2OCwweDIxLDB4YWMsMHg4MiwweDAwLDB4MDAsCisweDI3LDB4ODUsMHg5MCwweDAwLDB4MjcsMHg4MiwweDhmLDB4ZmYsMHgyNywweGJkLDB4ZmYsMHhmOCwweDAwLDB4NjIsMHg2MCwweDIxLAorMHgwMCwweDY1LDB4NTgsMHgyMSwweDAwLDB4MDAsMHhjMCwweDIxLDB4MTEsMHhhMCwweDAwLDB4Y2MsMHgwMCwweDAwLDB4NzgsMHgyMSwKKzB4MDAsMHgwYSwweDFjLDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMywweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHg5MSwweDg3LDB4MDAsMHgwMCwweDgwLDB4NDgsMHgwMCwweDA0LAorMHgwMywweGEwLDB4NjAsMHgyMSwweDAwLDB4MGEsMHgxYywweDAwLDB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4NDgsMHg4MCwweDI3LDB4ODMsMHg4ZiwweGY0LDB4YTMsMHhhNywweDAwLDB4MDAsCisweDAxLDB4MjMsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MTgsMHgyNSwweDAyLDB4ZmYsMHhmZiwweDAwLDB4NDgsMHg0MCwweDBiLAorMHg4YywweDgzLDB4MDAsMHgwNCwweDJkLDB4MDUsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MDYsMHgzMCwweDYzLDB4MDAsMHgwOCwKKzB4MTQsMHg2MCwweDAwLDB4MzUsMHgwMCwweDQ1LDB4NDAsMHgwYSwweDkzLDB4YTcsMHgwMCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MDgsCisweDAxLDB4MjIsMHgxMCwweDIxLDB4MzAsMHhlMywweDAwLDB4ZjAsMHgzOCwweDYzLDB4MDAsMHg1MCwweDMwLDB4ZTUsMHgwMCwweGZmLAorMHgwMCwweDA1LDB4MjAsMHgyYiwweDAwLDB4MDMsMHgxOCwweDJiLDB4MDAsMHg2NCwweDE4LDB4MjQsMHg5MCwweDQ5LDB4MDAsMHgwMCwKKzB4MTAsMHg2MCwweDAwLDB4MTYsMHgzMCwweGU0LDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDA0LDB4MTAsMHhhMiwweDAwLDB4OWQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHhhMCwweDAwLDB4M2EsMHgyYywweGEyLDB4MDAsMHgwYywweDEwLDB4NDAsMHgwMCwweDAyLAorMHgyNCwweDg0LDB4MDAsMHgwYywweDAwLDB4ZTAsMHgyMCwweDIxLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHgwMCwweDA0LDB4MTAsMHg0MCwKKzB4MjcsMHg4MywweGJiLDB4MGMsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg0NywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHhlMywweDAwLDB4MGMsMHhhMywweGE3LDB4MDAsMHgwMCwweDEwLDB4NjAsMHgwMCwweDAyLAorMHgyNCwweGUyLDB4MDAsMHgwNCwweDAwLDB4ZTAsMHgxMCwweDIxLDB4YTMsMHhhMiwweDAwLDB4MDAsMHg5MSwweDY1LDB4MDAsMHgwMCwKKzB4OTEsMHg4MiwweDAwLDB4MDAsMHgzMCwweGEzLDB4MDAsMHhmZiwweDAwLDB4NjIsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4MGUsCisweDJjLDB4NjIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MDMsMHgwMCwweDYwLDB4MjAsMHgyMSwweDMwLDB4YTIsMHgwMCwweDBmLAorMHgyNCwweDQ0LDB4MDAsMHgwYywweDAwLDB4MDQsMHgxMCwweDQwLDB4MDAsMHg0NCwweDIwLDB4MjEsMHgyNywweDgzLDB4YmIsMHgwYywKKzB4MDAsMHg4MywweDE4LDB4MjEsMHg5MCwweDYyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDksMHgxMSwweDAwLDB4YTEsMHg4NSwweDAwLDB4MDAsMHg5MywweGEyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgwOCwweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ5LDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDI3LDB4ODMsMHhiNCwweDk4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDkwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweDgzLDB4MDAsMHgwYywweDE0LDB4NjAsMHgwMCwweDA2LAorMHgwMCwweDgwLDB4MTAsMHgyMSwweDAwLDB4MTgsMHgxMCwweDQwLDB4MDAsMHg0ZiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwKKzB4MDAsMHg4MiwweDEwLDB4MjEsMHgyNCwweDQyLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgwZiwweDc2LDB4YTEsMHg4MiwweDAwLDB4MDAsCisweDhmLDB4OGQsMHg4MSwweDVjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweGE4LDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHhmZiwweGQxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMCwweDA2LDB4NzQsMHg4MiwKKzB4MzAsMHhlMiwweDAwLDB4ZmYsMHgyYywweDQyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHhlMCwweDEwLDB4MjEsCisweDMwLDB4ZTIsMHgwMCwweDBmLDB4MjQsMHg0MiwweDAwLDB4MGMsMHgzMCwweDQ0LDB4MDAsMHhmZiwweGEzLDB4YTIsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwYywweDEwLDB4ODIsMHgwMCwweDBkLDB4MDAsMHgwOSwweDExLDB4MDAsMHgwMCwweDQ5LDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDA0LDB4MTgsMHg0MCwweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHg2NCwweDE4LDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgyNywweDg0LDB4YjQsMHg5OCwweDAwLDB4NDQsMHgxMCwweDIxLAorMHg5MCwweDQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTMsMHhhNywweDAwLDB4MDAsMHgwMCwweDBhLDB4MWMsMHgwMCwKKzB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4ZiwweGY0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweDgzLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MTAsMHgxNCwweDYwLDB4MDAsMHgzMywKKzB4MDAsMHgwNiwweDE0LDB4NDIsMHgwMCwweDA5LDB4MTEsMHgwMCwweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIzLDB4MjcsMHg4MywweGI1LDB4NjgsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg5MCwweDQ0LDB4MDAsMHgwNCwweDkwLDB4NDMsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY0LDB4YzAsMHgyNCwKKzB4OTMsMHhhNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4ZTIsMHgwMCwweDBmLDB4MTAsMHg0MCwweDAwLDB4MGYsCisweDMxLDB4Y2YsMHgwMCwweDAxLDB4MDAsMHgwYSwweDFjLDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMywweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4NCwweDhmLDB4ZjAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4ODQsMHg0MywweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LDB4NjMsMHgwNiwweDQxLDB4MTQsMHg2MCwweDAwLDB4MDQsCisweDMwLDB4ZTIsMHgwMCwweGZmLDB4MjQsMHgwNywweDAwLDB4MGYsMHhhMywweGE3LDB4MDAsMHgwMCwweDMwLDB4ZTIsMHgwMCwweGZmLAorMHgyYywweDQyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDA2LDB4MDAsMHhlMCwweDEwLDB4MjEsMHgwMCwweDE4LDB4MTAsMHg0MCwKKzB4MDAsMHg0ZiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwweDAwLDB4NDcsMHgxMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDQsCisweGEzLDB4YTIsMHgwMCwweDAwLDB4MDAsMHg0MCwweDM4LDB4MjEsMHgwMSwweGE4LDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgyNCwweGE0LDB4MDAsMHgwMSwweDMwLDB4ODUsMHhmZiwweGZmLDB4MDAsMHhhMywweDE4LDB4MmIsMHgxNCwweDYwLDB4ZmYsMHhhZCwKKzB4MzAsMHhlMiwweDAwLDB4ZmYsMHgwOCwweDAwLDB4MGYsMHg2MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBmLDB4YzQsCisweDMwLDB4NTgsMHgwMCwweDAxLDB4ODEsMHhjMiwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHhmZiwweDczLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZiwweDUxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBhLDB4MWMsMHgwMCwKKzB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4ODAsMHg0OCwweDAwLDB4MDUsMHg5MSwweDY3LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZiwweDMxLAorMHgwMywweGEwLDB4NTgsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDNmLDB4ZjQsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4YzAsCisweGFmLDB4YjcsMHgwMCwweDM0LDB4YWYsMHhiNiwweDAwLDB4MzAsMHhhZiwweGI1LDB4MDAsMHgyYywweGFmLDB4YjQsMHgwMCwweDI4LAorMHhhZiwweGIzLDB4MDAsMHgyNCwweGFmLDB4YjIsMHgwMCwweDIwLDB4YWYsMHhiZiwweDAwLDB4M2MsMHhhZiwweGJlLDB4MDAsMHgzOCwKKzB4YWYsMHhiMSwweDAwLDB4MWMsMHhhZiwweGIwLDB4MDAsMHgxOCwweDg0LDB4ODIsMHgwMCwweDBjLDB4MjcsMHg5MywweDhmLDB4ZjQsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDczLDB4MTAsMHgyMSwweDhjLDB4NWUsMHgwMCwweDE4LDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDQwLDB4MGMsMHhhYywweGEyLDB4MDAsMHgwMCwweDhmLDB4ZDAsMHgwMCwweDA4LDB4MjcsMHg5NSwweDkwLDB4MDAsCisweDAwLDB4NzUsMHgxOCwweDIxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMiwweDAwLDB4MzAsMHgyMSwweDkwLDB4NzEsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MGYsMHgxNSwweDAwLDB4ODAsMHhiMCwweDIxLDB4MDAsMHg0MCwweDkwLDB4MjEsMHgwMCwweDEwLDB4MTQsMHg0MiwKKzB4MzAsMHg1NCwweDAwLDB4MDEsMHgwMiwweDQwLDB4MjAsMHgyMSwweDAwLDB4MTAsMHgxNCwweDgyLDB4MDIsMHg4MCwweDI4LDB4MjEsCisweDEyLDB4NTEsMHgwMCwweDIzLDB4MDAsMHgxMCwweGJmLDB4YzIsMHg4NiwweGMzLDB4MDAsMHgwYywweDMwLDB4NTAsMHgwMCwweDAxLAorMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDU1LDB4MTAsMHgyMSwKKzB4YTAsMHg1MiwweDAwLDB4MDAsMHg4NiwweGMzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDUzLDB4MzAsMHgyMSwweDhjLDB4YzcsMHgwMCwweDE4LAorMHgyNywweDgzLDB4OGYsMHhmMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHhlMywweDAwLDB4MDQsMHg4NCwweDQ2LDB4MDAsMHgwNiwKKzB4MDAsMHgwMywweDE5LDB4NDIsMHgwYywweDAwLDB4MDgsMHhkZiwweDMwLDB4NzMsMHgwMCwweDAxLDB4MDAsMHg0MCwweDg4LDB4MjEsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MDIsMHg4MCwweDI4LDB4MjEsMHgxNiwweGUwLDB4MDAsMHgxMCwweDAyLDB4MDAsMHgzMCwweDIxLAorMHg4NiwweGMyLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgyNywweDgyLDB4OGYsMHhmOCwweDAwLDB4NjIsMHgxOCwweDIxLDB4YTQsMHg3MSwweDAwLDB4MDQsCisweDdiLDB4YmUsMHgwMSwweGZjLDB4N2IsMHhiNiwweDAxLDB4YmMsMHg3YiwweGI0LDB4MDEsMHg3YywweDdiLDB4YjIsMHgwMSwweDNjLAorMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDAsMHg4NiwweGMzLDB4MDAsMHgwYywKKzB4YWYsMHhiMywweDAwLDB4MTAsMHhhZiwweGEwLDB4MDAsMHgxNCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1NSwweDEwLDB4MjEsMHg4MCwweDQ3LDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweGU3LDB4MDAsMHgwMiwweDAwLDB4MDcsMHgxNywweGMyLDB4MDAsMHhlMiwweDM4LDB4MjEsMHgwMCwweDA3LDB4MzgsMHg0MywKKzB4MDAsMHgwNywweDM4LDB4NDAsMHgwYywweDAwLDB4MDksMHgwNiwweDAzLDB4YzcsMHgzOCwweDIxLDB4MDgsMHgwMCwweDEwLDB4NDQsCisweDAyLDB4MjIsMHg4OCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg0MSwweDk0LDB4YWYsMHhiMiwweDAwLDB4MjAsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4YWYsMHhiZiwweDAwLDB4MjgsMHhhZiwweGIzLDB4MDAsMHgyNCwweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiMCwweDAwLDB4MTgsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4OTAsMHg4MywweDAwLDB4MGEsMHgzNCwweDQyLDB4MDEsMHgwNCwweDk0LDB4NDUsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDI3LDB4ODIsMHhiMywweGYwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgzMCwweGE2LDB4ZmYsMHhmZiwKKzB4OGMsMHg3MSwweDAwLDB4MDAsMHg4MCwweDg1LDB4MDAsMHgxMiwweDMwLDB4YzksMHgwMCwweGZmLDB4MDAsMHgwNiwweDMyLDB4MDIsCisweGE0LDB4ODYsMHgwMCwweDQ0LDB4YTQsMHg4OSwweDAwLDB4NDYsMHg4MiwweDIyLDB4MDAsMHgxMiwweDAwLDB4ODAsMHg5MCwweDIxLAorMHgxMCwweGEwLDB4MDAsMHgxYiwweGEwLDB4ODAsMHgwMCwweDE1LDB4MDAsMHhjNSwweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHgxNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMiwweDIwLDB4MDAsMHgxOSwweDg0LDB4ODMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDEwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGEwLDB4NDAsMHgwMCwweDAwLDB4YTAsMHg4MCwweDAwLDB4MTIsMHg5MiwweDIyLDB4MDAsMHgxNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhkZiwweGEyLDB4MjIsMHgwMCwweDE2LDB4OGYsMHhiZiwweDAwLDB4MjgsCisweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDMwLAorMHgwYywweDAwLDB4MGYsMHhmZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEwLDB4OTMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjgsMHg0MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4MDEsMHg3NiwweDAwLDB4MDAsMHgyOCwweDIxLDB4OTQsMHg4NywweDAwLDB4MGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhlMCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTQsMHgwMCwweDAwLDB4MDIsMHgxNCwweDAzLAorMHgwMCwweDA3LDB4MjQsMHgwMCwweDAwLDB4MDQsMHgyNCwweDAzLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4MDAsMHgwNCwweDI4LDB4YzAsMHgwMCwweGE0LDB4MjgsMHgyMSwweDI3LDB4ODIsMHg5MCwweDEwLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgyNywweDgyLDB4OGYsMHhmOCwweDAwLDB4YTIsMHgxMCwweDIxLAorMHg4YywweDY4LDB4MDAsMHgwMCwweDgwLDB4NDQsMHgwMCwweDA2LDB4MjcsMHg4MiwweDkwLDB4MDAsMHgwMCwweDA4LDB4MWQsMHgwMiwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgzOCwweDg0LDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MDEsMHgyNCwweDMwLDB4MGIsCisweDgwLDB4YWEsMHgwMCwweDA0LDB4ODAsMHhhOSwweDAwLDB4MDUsMHgxMCwweDYwLDB4MDAsMHgwMiwweDAwLDB4MDgsMHgxNCwweDAyLAorMHgzMCwweDQ2LDB4MDAsMHgwZiwweDE1LDB4MjAsMHgwMCwweDI4LDB4MDEsMHg0OSwweDEwLDB4MjEsMHgxNSwweDQwLDB4MDAsMHgxMSwKKzB4MzAsMHhlMywweGZmLDB4ZmYsMHg5MiwweDQ1LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhOCwweDAwLDB4ZmYsCisweDJkLDB4MDIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAxLDB4NDYsMHgyZCwweDAyLDB4MDAsMHgxMCwweDNjLDB4MDQsMHhiMCwweDA1LAorMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMSwweDAyLDB4MTAsMHgwNCwKKzB4MDAsMHg2MiwweDE4LDB4MjUsMHhhMCwweDgzLDB4MDAsMHgwMCwweDk2LDB4NDcsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4ZTMsMHhmZiwweGZmLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDI3LDB4ODQsMHg5MCwweDAwLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIxLDB4ODAsMHg0NSwweDAwLDB4MDYsMHgwMCwweDAzLDB4MWEsMHgwMCwKKzB4M2MsMHgwNCwweGIwLDB4MDAsMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4NjQsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDAsCisweDgyLDB4NDMsMHgwMCwweDEwLDB4MDAsMHgwMiwweDE0LDB4MDAsMHgxNCwweDYwLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgzYywweDAzLAorMHgzMCwweGUyLDB4MDAsMHgwNCwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDEsMHg0OSwweDEwLDB4MjEsMHgzNCwweGUyLDB4MDgsMHgwMCwKKzB4YTQsMHg4MiwweDAwLDB4MDAsMHgwMSwweDQ5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDE2LDB4MDMsCisweDAwLDB4NDYsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgyLDB4NDIsMHgwMCwweDEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4NiwweDQzLDB4MDAsMHgwYywKKzB4MjUsMHg0NCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhMCwweDQ0LDB4MDAsMHgwNCwweDkyLDB4MjMsMHgwMCwweDE2LAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDMwLDB4NjMsMHgwMCwweGZiLDB4MDgsMHgwMCwweDEwLDB4OTgsMHhhMiwweDIzLDB4MDAsMHgxNiwKKzB4ODYsMHg0MywweDAwLDB4MGMsMHgyNSwweDI0LDB4MDAsMHgwMSwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGEwLDB4NDQsMHgwMCwweDA1LAorMHg4NiwweDQ1LDB4MDAsMHgwYywweDBjLDB4MDAsMHgxZiwweDA4LDB4MDIsMHgyMCwweDIwLDB4MjEsMHgxMCwweDQwLDB4MDAsMHg1YSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDQ1LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNiwweDAwLDB4ZmYsCisweDJjLDB4YzIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4NGMsMHgyYywweGMyLDB4MDAsMHgxMCwweDNjLDB4MDQsMHhiMCwweDA1LAorMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweGMyLDB4MTAsMHgwNCwKKzB4MDAsMHgwMiwweDEwLDB4MjcsMHgwMCwweDYyLDB4MTgsMHgyNCwweGEwLDB4ODMsMHgwMCwweDAwLDB4OTIsMHg0NSwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNSwweDAwLDB4ZmYsMHgxNCwweGEwLDB4MDAsMHgzMywweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMiwweDQwLDB4MDAsMHgwNCwweDkyLDB4MjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwYywKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMiwweDIyLDB4MDAsMHgxNywweDkyLDB4MjIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDIyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxMCwweDkzLAorMHhhNiwweDIyLDB4MDAsMHgxNCwweDk2LDB4MjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEwLDB4OTMsMHhhNiwweDIyLDB4MDAsMHgxNCwKKzB4OTIsMHgyMiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxMSwweDIyLDB4YTIsMHgyMCwweDAwLDB4MTcsMHg5NiwweDI0LDB4MDAsMHgwMCwweDk2LDB4MjUsMHgwMCwweDA2LAorMHgyNywweDg2LDB4OGYsMHhmMCwweDAwLDB4MDQsMHgxOCwweGMwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDA1LDB4MTAsMHhjMCwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDYsMHgxMCwweDIxLDB4OGMsMHg2NSwweDAwLDB4MDgsMHg4YywweDQ0LDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLAorMHgwMCwweGEzLDB4MzAsMHgyNCwweDEwLDB4YzAsMHgwMCwweDA4LDB4MDAsMHg4MywweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHg4NSwweDE4LDB4MmIsCisweDA4LDB4MDAsMHgxMSwweDIyLDB4YTIsMHgyMywweDAwLDB4MTcsMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4ODUsMHgxOCwweDJiLAorMHgwOCwweDAwLDB4MTEsMHg0NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweDAwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGNhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxMSwweDFkLDB4YTIsMHg0MCwweDAwLDB4MDcsMHgwOCwweDAwLDB4MTEsMHgxZCwweGEyLDB4NDAsMHgwMCwweDA2LAorMHgwOCwweDAwLDB4MTEsMHgxZCwweGEyLDB4NDAsMHgwMCwweDA1LDB4MTQsMHg0MCwweGZmLDB4YmUsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4ODAsCisweDA4LDB4MDAsMHgxMSwweDE0LDB4MDAsMHhhMiwweDEwLDB4MDcsMHgwYywweDAwLDB4MTAsMHgwMywweDAyLDB4NDAsMHgyMCwweDIxLAorMHgwOCwweDAwLDB4MTAsMHg5MywweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHhhNiwweDAwLDB4ZmYsMHgyYywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDk5LDB4MmMsMHhjMiwweDAwLDB4MTAsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwMCwweGMyLDB4MTAsMHgwNCwweDAwLDB4MDIsMHgxMCwweDI3LDB4MDAsMHg2MiwweDE4LDB4MjQsMHhhMCwweDgzLDB4MDAsMHgwMCwKKzB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLDB4MTQsMHhhMCwweDAwLDB4ODAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHg0MCwweDAwLDB4MDQsMHg4NiwweDQzLDB4MDAsMHgwYywweDI3LDB4OTMsMHg4ZiwweGY0LAorMHg5NiwweDQ3LDB4MDAsMHgwYywweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MjgsMHg4MCwKKzB4MDAsMHhiMywweDE4LDB4MjEsMHg4YywweDY0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHg2NCwweDAwLDB4MDAsMHgzMCwweDIxLAorMHgwMCwweDA3LDB4MWMsMHgwMCwweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDUzLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LDB4OTMsMHg4MiwweDhiLDB4NjEsCisweDhjLDB4NjQsMHgwMCwweDA0LDB4MzAsMHg0MiwweDAwLDB4MDEsMHgwMCwweDA0LDB4MjEsMHg0MiwweDE0LDB4NDAsMHgwMCwweDRkLAorMHgzMCwweDkwLDB4MDAsMHgwMSwweDAwLDB4MDcsMHgyYywweDAwLDB4MDAsMHgwNSwweDJjLDB4MDMsMHgwYywweDAwLDB4MWIsMHg4NCwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHg5NiwweDI2LDB4MDAsMHgwNiwweDEyLDB4MDAsMHgwMCwweDE0LDB4MzAsMHhjNSwweGZmLDB4ZmYsCisweDAyLDB4NjAsMHg5MCwweDIxLDB4MDAsMHgwNSwweDEwLDB4YzAsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDUyLDB4MTgsMHgyMSwweDkyLDB4MjIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYiwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHg4YywweDYzLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg2MiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDExLDB4NDIsMHgwYywweDAwLDB4MWIsMHg4NCwweDMwLDB4NTAsMHgwMCwweDAxLAorMHg5NiwweDI2LDB4MDAsMHgwNiwweDE2LDB4MDAsMHhmZiwweGVmLDB4MzAsMHhjNSwweGZmLDB4ZmYsMHg5MiwweDIyLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHgyMiwweDAwLDB4MTcsCisweDkyLDB4MjIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhNiwweDI2LDB4MDAsMHgxNCwweDkyLDB4MjIsMHgwMCwweDE2LDB4MDgsMHgwMCwweDEwLDB4OTIsMHgzMCwweDQyLDB4MDAsMHhjMywKKzB4OTYsMHgyMiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTEsMHhiOSwweGE2LDB4MjIsMHgwMCwweDE0LDB4OTIsMHgyMiwweDAwLDB4MGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMSwweGI0LAorMHhhMiwweDIwLDB4MDAsMHgxNywweDk2LDB4MjQsMHgwMCwweDAwLDB4MzAsMHhjNSwweGZmLDB4ZmYsMHgwMCwweDA1LDB4MTgsMHhjMCwKKzB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDAwLDB4NjUsMHgxOCwweDIxLDB4MjcsMHg4NCwweDhmLDB4ZjAsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDhjLDB4NDUsMHgwMCwweDA4LAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDA4LDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweGEyLDB4MzgsMHgyNCwKKzB4MTAsMHhlMCwweDAwLDB4MDgsMHgwMCwweDgyLDB4MTAsMHgyNCwweDEwLDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDEwLDB4ZTAsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweDg1LDB4MTgsMHgyYiwweDA4LDB4MDAsMHgxMSwweGI0LAorMHhhMiwweDIzLDB4MDAsMHgxNywweDEwLDB4NDAsMHhmZiwweGZkLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTEsMHhkOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA1LDB4MDAsMHgyNCwweGYwLDB4ZTUsMHgwMCwweDA2LDB4MDAsMHgwMCwweDI4LDB4MTIsCisweDI3LDB4ODIsMHg4ZiwweGYwLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgwYywweDAwLDB4MDEsMHg0YiwweDAwLDB4MDAsMHgyMCwweDIxLAorMHg5NiwweDQ3LDB4MDAsMHgwYywweDA4LDB4MDAsMHgxMSwweDk2LDB4MDAsMHgwNywweDJjLDB4MDAsMHgyNywweDgzLDB4OTAsMHgwMCwKKzB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgxOCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDAsCisweDkwLDB4NjUsMHgwMCwweDA1LDB4OTMsMHg4MiwweDgwLDB4MTAsMHgyNCwweDA3LDB4MDAsMHgwMSwweDBjLDB4MDAsMHgyMSwweGY1LAorMHhhZiwweGEyLDB4MDAsMHgxMCwweDk2LDB4NDcsMHgwMCwweDBjLDB4MDgsMHgwMCwweDExLDB4ODksMHgwMCwweDA3LDB4MWMsMHgwMCwKKzB4MTAsMHhhMiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweDdkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTEsMHg3YSwweGEyLDB4NDAsMHgwMCwweDA3LAorMHgwOCwweDAwLDB4MTEsMHg3YSwweGEyLDB4NDAsMHgwMCwweDA2LDB4MDgsMHgwMCwweDExLDB4N2EsMHhhMiwweDQwLDB4MDAsMHgwNSwKKzB4MTQsMHg0MCwweGZmLDB4NzEsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsCisweDMwLDB4YTUsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4ODAsMHgwOCwweDAwLDB4MTEsMHg3MSwweDAwLDB4YTIsMHgxMCwweDA3LAorMHgxNCwweDQwLDB4ZmUsMHhjMywweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwKKzB4MzAsMHhhNSwweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHg4MCwweDA4LDB4MDAsMHgxMCwweGNjLDB4MDAsMHhhMiwweDEwLDB4MDcsCisweDg0LDB4ODMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg4ZiwweGY0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ3LDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweGU2LDB4MDAsMHgwOCwweDBjLDB4MDAsMHgwZiwweDE1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMCwweDAwLDB4MzAsMHgyMSwweDAwLDB4MDAsMHgzOCwweDIxLAorMHgwYywweDAwLDB4MWMsMHg4NiwweGFmLDB4YTIsMHgwMCwweDEwLDB4MDAsMHgwMiwweDFlLDB4MDAsMHgxNCwweDYwLDB4ZmUsMHg2YiwKKzB4YTIsMHgyMiwweDAwLDB4MTIsMHg5MiwweDQzLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg2MCwweDAwLDB4NDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHg0MCwweDAwLDB4MDQsMHg5MiwweDI4LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNSwweDAwLDB4MDAsMHgxOSwweDI0LDB4MDIsMHgwMCwweDAxLDB4OTIsMHgyNywweDAwLDB4MGEsMHhhMiwweDIyLDB4MDAsMHgxNywKKzB4OTIsMHgyMiwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDk2LDB4MjIsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNiwweDIyLDB4MDAsMHgxNCwweDkyLDB4MjIsMHgwMCwweDE2LAorMHgzMCwweGUzLDB4MDAsMHhmZiwweDMwLDB4NDIsMHgwMCwweGMwLDB4MTAsMHg2MCwweDAwLDB4MDMsMHhhMiwweDIyLDB4MDAsMHgxNiwKKzB4MzQsMHg0MiwweDAwLDB4MDEsMHhhMiwweDIyLDB4MDAsMHgxNiwweDExLDB4MDAsMHhmZSwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkyLDB4MjIsMHgwMCwweDE2LDB4MDgsMHgwMCwweDEwLDB4OTIsMHgzNCwweDQyLDB4MDAsMHgwMiwweDk2LDB4MjIsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTIsMHgzYiwweGE2LDB4MjIsMHgwMCwweDE0LDB4OTIsMHgyNywweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHhlMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMiwweDM0LDB4YTIsMHgyMCwweDAwLDB4MTcsCisweDk2LDB4MjQsMHgwMCwweDAwLDB4OTYsMHgyNSwweDAwLDB4MDYsMHgyNywweDg2LDB4OGYsMHhmMCwweDAwLDB4MDQsMHgxOCwweGMwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDAwLDB4MDUsMHgxMCwweGMwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NiwweDE4LDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDYsMHgxMCwweDIxLDB4OGMsMHg2NSwweDAwLDB4MDgsCisweDhjLDB4NDQsMHgwMCwweDA4LDB4M2MsMHgwMywweDgwLDB4MDAsMHgwMCwweGEzLDB4MzAsMHgyNCwweDEwLDB4YzAsMHgwMCwweDA4LAorMHgwMCwweDgzLDB4MTAsMHgyNCwweDEwLDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwMiwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweDg1LDB4MTgsMHgyYiwweDA4LDB4MDAsMHgxMiwweDM0LDB4YTIsMHgyMywweDAwLDB4MTcsCisweDEwLDB4NDAsMHhmZiwweGZkLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTIsMHg2MywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDYyLDB4MDAsMHgwOSwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg2MiwweDAwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHg2MiwweGZmLDB4YmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMiwweDJlLDB4YTIsMHg0MCwweDAwLDB4MDcsCisweDA4LDB4MDAsMHgxMiwweDJlLDB4YTIsMHg0MCwweDAwLDB4MDYsMHgwOCwweDAwLDB4MTIsMHgyZSwweGEyLDB4NDAsMHgwMCwweDA1LAorMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4ODIsMHgzMCwweDI0LDB4MTAsMHhjMCwweDAwLDB4MDgsMHgwMCwweGEyLDB4MTgsMHgyNCwKKzB4MTAsMHg2MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MTAsMHgyMSwweDEwLDB4YzAsMHgwMCwweDAyLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDAwLDB4YTQsMHgxMCwweDJiLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHhmZiwweGZkLAorMHgwMCwweGE0LDB4MTAsMHgyYiwweDA4LDB4MDAsMHgxMiwweDdlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgyLDB4ZmYsMHhmZiwKKzB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDI3LDB4ODQsMHg5MCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4ODAsMHg2NiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MTIsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAwLAorMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4NDUsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzMCwweDgyLDB4MDAsMHg3YywweDMwLDB4ODQsMHhmZiwweDAwLDB4YWYsMHhiZiwweDAwLDB4MWMsCisweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDQxLAorMHgwMCwweDA0LDB4MjIsMHgwMywweDI0LDB4MDIsMHgwMCwweDA0LDB4M2MsMHgxMCwweGIwLDB4MDMsMHg4ZSwweDEwLDB4MDAsMHgwMCwKKzB4MTAsMHg4MiwweDAwLDB4MzIsMHgyNCwweDAyLDB4MDAsMHgwOCwweDEwLDB4ODIsMHgwMCwweDAzLDB4MzIsMHgwMiwweDAwLDB4MjAsCisweDA4LDB4MDAsMHgxMiwweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxNywweDNjLDB4MDIsMHhiMCwweDA2LAorMHgzNCwweDQyLDB4ODAsMHgyNCwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDY3LDB4MDAsMHhmZiwKKzB4MTAsMHhlMCwweDAwLDB4MjMsMHgwMCwweDAwLDB4ODgsMHgyMSwweDhmLDB4ODUsMHg4ZiwweGQwLDB4MDAsMHg0MCwweDMwLDB4MjEsCisweDk0LDB4YTIsMHgwMCwweDA4LDB4OGMsMHhjMywweDAwLDB4MDAsMHgyNiwweDMxLDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAyLAorMHgzMCwweDQyLDB4MDEsMHhmZiwweDM0LDB4NjMsMHgwMSwweDAwLDB4MDIsMHgyNywweDIwLDB4MmEsMHhhNCwweGEyLDB4MDAsMHgwOCwKKzB4MTQsMHg4MCwweGZmLDB4ZjcsMHhhYywweGMzLDB4MDAsMHgwMCwweDg0LDB4YTMsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDMwLDB4YWMsMHg0MywweDAwLDB4MDAsMHgyNywweDkyLDB4YjMsMHhmMCwweDI0LDB4MTEsMHgwMCwweDEyLAorMHg4ZSwweDQ0LDB4MDAsMHgwMCwweDI2LDB4MzEsMHhmZiwweGZmLDB4OTAsMHg4MiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4MDMsMHgyNiwweDUyLDB4MDAsMHgwNCwweDBjLDB4MDAsMHgyMCwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA2LDB4MjEsMHhmZiwweGY3LDB4MjQsMHgwMiwweGZmLDB4ZGYsMHgwMiwweDAyLDB4ODAsMHgyNCwweDNjLDB4MDEsMHhiMCwweDAzLAorMHgwYywweDAwLDB4MTMsMHgxOCwweGFjLDB4MzAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEyLDB4YTQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4NSwweDhmLDB4ZDAsMHgwOCwweDAwLDB4MTIsMHhiYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweGZmLDB4OTUsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MDIsMHgwMiwweDgwLDB4MjQsMHgzNCwweDYzLDB4MDAsMHgzMCwweDNjLDB4MDEsMHhiMCwweDAzLAorMHhhYywweDMwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMiwweGUxLDB4YWMsMHg2MCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTIsMHhhNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDUwLDB4MDgsMHgwMCwweDEyLDB4YTQsCisweGFjLDB4NDYsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGIsMHg4NCwweDNjLDB4MGIsMHhiMCwweDAzLAorMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDgsMHg4MCwweDAxLDB4MjUsMHgwOCwweDAwLDB4MDAsMHgzYywweDA5LDB4ODAsMHgwMSwKKzB4MjUsMHgyOSwweDAzLDB4MWMsMHgxMSwweDA5LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsCisweDI1LDB4NGEsMHg0YiwweGFjLDB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDgsMHhiMCwweDA2LAorMHgzNSwweDA4LDB4ODAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA5LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMSwweDI5LDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMSwweDAwLDB4MDEsCisweDE1LDB4MjEsMHhmZiwweGYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDBhLDB4ODAsMHgwMCwweDI1LDB4NGEsMHg0YiwweGU4LAorMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHg4YywweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGMsMHgxNCwweDNjLDB4MGIsMHhiMCwweDAzLAorMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjQsMHg2MywweDAzLDB4MWMsMHgzYywweDA0LDB4YjAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFjLDB4NDUsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgyNCwweDg0LDB4MDAsMHgwNCwweDAwLDB4NDMsMHgwOCwweDJhLAorMHgxNCwweDIwLDB4ZmYsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGMsMHg2MCwweDNjLDB4MGIsMHhiMCwweDAzLDB4YWQsMHg2YSwweDAwLDB4MjAsCisweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweDAzLDB4MjAsMHgzYywweDAzLDB4ODAsMHgwMSwweDI0LDB4NjMsMHgzZiwweDE0LAorMHhhYywweDQwLDB4MDAsMHgwMCwweGFjLDB4NDAsMHgwMCwweDA0LDB4YWMsMHg0MCwweDAwLDB4MDgsMHhhYywweDQwLDB4MDAsMHgwYywKKzB4MjQsMHg0MiwweDAwLDB4MTAsMHgwMCwweDQzLDB4MDgsMHgyYSwweDE0LDB4MjAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRjLDB4YTAsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLAorMHgzYywweDFjLDB4ODAsMHgwMSwweDI3LDB4OWMsMHg3ZiwweGYwLDB4MjcsMHg5ZCwweDhiLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjcsMHg5ZCwweDhmLDB4YjgsMHgzYywweDBhLDB4ODAsMHgwMCwweDI1LDB4NGEsMHg0YywweGM0LDB4M2MsMHgwYiwweGIwLDB4MDMsCisweGFkLDB4NmEsMHgwMCwweDIwLDB4NDAsMHg4MCwweDY4LDB4MDAsMHg0MCwweDA4LDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzNSwweDA4LDB4ZmYsMHgwMSwweDQwLDB4ODgsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTUsMHg2NSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDg0LDB4ZjgsMHgwMCwweDMwLDB4ODcsMHgwMCwweDAzLDB4MDAsMHgwNCwweDMwLDB4NDAsCisweDAwLDB4YzcsMHgyMCwweDIzLDB4M2MsMHgwMiwweGIwLDB4MGEsMHgyNywweGJkLDB4ZmYsMHhlMCwweDI0LDB4MDMsMHhmZiwweGZmLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWMsMHg4MywweDEwLDB4MDAsMHhhZiwweGJmLDB4MDAsMHgxOCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgwMCwweGEwLDB4ODgsMHgyMSwweDI0LDB4MDMsMHgwMCwweDAxLDB4OGMsMHg4MiwweDEwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MywweGZmLDB4ZmQsMHgwMCwweGM3LDB4MTAsMHgyMywweDNjLDB4MDMsMHhiMCwweDBhLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NTAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4OTUsMHgwMiwweDIwLDB4MjAsMHgyMSwKKzB4MDIsMHgxMSwweDgwLDB4MjQsMHgwMCwweDUwLDB4ODAsMHgwNiwweDAyLDB4MDAsMHgxMCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MTgsCisweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwweDI3LDB4YmQsMHhmZiwweGQ4LAorMHhhZiwweGIyLDB4MDAsMHgxOCwweDAwLDB4YTAsMHg5MCwweDIxLDB4MjQsMHgwNSwweGZmLDB4ZmYsMHhhZiwweGIzLDB4MDAsMHgxYywKKzB4YWYsMHhiZiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhjMCwweDk4LDB4MjEsCisweDEyLDB4NDUsMHgwMCwweDIzLDB4MjQsMHg4NCwweGY4LDB4MDAsMHgzMCwweDgzLDB4MDAsMHgwMywweDAwLDB4MDQsMHgxMCwweDQwLAorMHgwMCwweDQwLDB4ODgsMHgyMSwweDAwLDB4NjAsMHgyMCwweDIxLDB4MDAsMHg0MywweDEwLDB4MjMsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhYywweDQ1LDB4MTAsMHgwMCwweDAwLDB4NDAsMHgxOCwweDIxLDB4MjQsMHgwNSwweDAwLDB4MDEsCisweDhjLDB4NjIsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQ1LDB4ZmYsMHhmZCwweDNjLDB4MDIsMHhiMCwweDBhLAorMHgwMiwweDI0LDB4ODgsMHgyMywweDAyLDB4MjIsMHg4OCwweDIxLDB4OGUsMHgzMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg5NSwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDEyLDB4MTgsMHgyNywweDAyLDB4MDMsMHg4MCwweDI0LDB4MDAsMHg1MywweDEwLDB4MDQsCisweDAyLDB4MDIsMHg4MCwweDI1LDB4YWUsMHgzMCwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHgwMSwweDhlLDB4MjIsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDMsMHhmZiwweGZkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgyMCwKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDMwLDB4ODIsMHgwMCwweDAzLDB4MDAsMHgwNCwweDE4LDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyMywweDNjLDB4MDQsMHhiMCwweDBhLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweGFjLDB4NjYsMHgwMCwweDAwLDB4MjQsMHgwNCwweDAwLDB4MDEsMHg4YywweDYyLDB4MTAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQ0LDB4ZmYsMHhmZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEzLDB4ODMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsMHgwMCwweDY0LDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg2MywweDAwLDB4MDEsMHgyYywweDYyLDB4MDAsMHgyMCwKKzB4MTQsMHg0MCwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg2MCwweDEwLDB4MjEsCisweDI3LDB4YmQsMHhmZiwweGUwLDB4M2MsMHgwMywweGIwLDB4MDUsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LAorMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDFjLDB4MDAsMHg4MCwweDkwLDB4MjEsMHgwMCwweGEwLDB4ODAsMHgyMSwKKzB4MDAsMHhjMCwweDg4LDB4MjEsMHgzNCwweDYzLDB4MDIsMHgyZSwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweGZmLDB4ZmMsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHgwMCwweGMwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHhjMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMywweDNjLDB4MDIsMHhjMCwweDAwLDB4MDAsMHgxMCwweDFjLDB4MDAsCisweDM0LDB4NDIsMHgwNCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzYywweDA1LDB4YjAsMHgwNSwweDI0LDB4NjMsMHgxNiwweDA5LAorMHgwMiwweDIyLDB4MTAsMHgyMSwweDM0LDB4ODQsMHgwNCwweDIwLDB4MzQsMHhhNSwweDA0LDB4MjQsMHgzYywweDA2LDB4YjAsMHgwNSwKKzB4YWMsMHg4MywweDAwLDB4MDAsMHgyNCwweDA3LDB4MDAsMHgwMSwweGFjLDB4YTIsMHgwMCwweDAwLDB4MzQsMHhjNiwweDAyLDB4MjgsCisweDI0LDB4MDIsMHgwMCwweDIwLDB4YWUsMHg0NywweDAwLDB4M2MsMHgyNCwweDA0LDB4MDgsMHgyNCwweGEwLDB4YzIsMHgwMCwweDAwLAorMHgzYywweDA1LDB4MDAsMHhjMCwweGEyLDB4NDcsMHgwMCwweDExLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwKKzB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHhjMCwweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDhmLDB4YmYsMHgwMCwweDFjLDB4OGYsMHhiMiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgyMCwweDI0LDB4MDIsMHgwMCwweDA2LDB4YWMsMHg4MiwweDAwLDB4MGMsMHhhMCwweDgwLDB4MDAsMHg1MCwKKzB4YWMsMHg4MCwweDAwLDB4MDAsMHhhYywweDgwLDB4MDAsMHgwNCwweGFjLDB4ODAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4MTQsCisweGFjLDB4ODAsMHgwMCwweDE4LDB4YWMsMHg4MCwweDAwLDB4MWMsMHhhNCwweDgwLDB4MDAsMHgyMCwweGFjLDB4ODAsMHgwMCwweDI0LAorMHhhYywweDgwLDB4MDAsMHgyOCwweGFjLDB4ODAsMHgwMCwweDJjLDB4YTAsMHg4MCwweDAwLDB4MzAsMHhhMCwweDgwLDB4MDAsMHgzMSwKKzB4YWMsMHg4MCwweDAwLDB4MzQsMHhhYywweDgwLDB4MDAsMHgzOCwweGEwLDB4ODAsMHgwMCwweDNjLDB4YWMsMHg4MiwweDAwLDB4MTAsCisweGEwLDB4ODAsMHgwMCwweDQ0LDB4YWMsMHg4MCwweDAwLDB4NDgsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODAsMHgwMCwweDRjLAorMHgzYywweDA0LDB4YjAsMHgwNiwweDM0LDB4ODQsMHg4MCwweDAwLDB4OGMsMHg4MywweDAwLDB4MDAsMHgzYywweDAyLDB4MTIsMHgwMCwKKzB4M2MsMHgwNSwweGIwLDB4MDMsMHgwMCwweDYyLDB4MTgsMHgyNSwweDM0LDB4YTUsMHgwMCwweDhiLDB4MjQsMHgwMiwweGZmLDB4ODAsCisweGFjLDB4ODMsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMCwweGEyLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAzLAorMHgzNCwweDg0LDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDIyLDB4M2MsMHgwNSwweGIwLDB4MDEsMHgzYywweDA2LDB4NDUsMHg2NywKKzB4M2MsMHgwYSwweGIwLDB4MDksMHhhMCwweDgyLDB4MDAsMHgwMCwweDM0LDB4YTUsMHgwMCwweDA0LDB4MzQsMHhjNiwweDg5LDB4YWEsCisweDM1LDB4NGEsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAxLDB4MjMsMHgzYywweDBiLDB4YjAsMHgwOSwweDNjLDB4MDcsMHgwMSwweDIzLAorMHgzYywweDBjLDB4YjAsMHgwOSwweDNjLDB4MDEsMHhiMCwweDAxLDB4YWMsMHgyMCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhlMCwKKzB4YWMsMHhhMCwweDAwLDB4MDAsMHgzNSwweDZiLDB4MDAsMHgwOCwweDNjLDB4MDEsMHhiMCwweDA5LDB4YWMsMHgyNiwweDAwLDB4MDAsCisweDM0LDB4ZTcsMHg0NSwweDY2LDB4YTUsMHg0MiwweDAwLDB4MDAsMHgzNSwweDhjLDB4MDAsMHgwYywweDI0LDB4MDIsMHhjZCwweGVmLAorMHgzYywweDBkLDB4YjAsMHgwOSwweDNjLDB4MDgsMHhjZCwweGVmLDB4M2MsMHgwZSwweGIwLDB4MDksMHhhZCwweDY3LDB4MDAsMHgwMCwKKzB4YWYsMHhiNywweDAwLDB4MWMsMHhhNSwweDgyLDB4MDAsMHgwMCwweGFmLDB4YjYsMHgwMCwweDE4LDB4YWYsMHhiNSwweDAwLDB4MTQsCisweGFmLDB4YjQsMHgwMCwweDEwLDB4YWYsMHhiMywweDAwLDB4MGMsMHhhZiwweGIyLDB4MDAsMHgwOCwweGFmLDB4YjEsMHgwMCwweDA0LAorMHhhZiwweGIwLDB4MDAsMHgwMCwweDM1LDB4YWQsMHgwMCwweDEwLDB4MzUsMHgwOCwweDAxLDB4MjIsMHgzNSwweGNlLDB4MDAsMHgxNCwKKzB4MjQsMHgwMiwweDg5LDB4YWIsMHgzYywweDBmLDB4YjAsMHgwOSwweDNjLDB4MDksMHg4OSwweGFiLDB4M2MsMHgxMCwweGIwLDB4MDksCisweDNjLDB4MTEsMHhiMCwweDA5LDB4M2MsMHgxMiwweGIwLDB4MDksMHgzYywweDEzLDB4YjAsMHgwOSwweDNjLDB4MTQsMHhiMCwweDA5LAorMHgzYywweDE1LDB4YjAsMHgwOSwweDNjLDB4MTYsMHhiMCwweDA5LDB4M2MsMHgxNywweGIwLDB4MDksMHhhZCwweGE4LDB4MDAsMHgwMCwKKzB4MjQsMHgwMywweGZmLDB4ZmYsMHhhNSwweGMyLDB4MDAsMHgwMCwweDM1LDB4ZWYsMHgwMCwweDE4LDB4MzUsMHgyOSwweGNkLDB4ZWUsCisweDM2LDB4MTAsMHgwMCwweDFjLDB4MzYsMHgzMSwweDAwLDB4MjAsMHgzNiwweDUyLDB4MDAsMHgyNCwweDM2LDB4NzMsMHgwMCwweDI4LAorMHgzNiwweDk0LDB4MDAsMHgyYywweDM2LDB4YjUsMHgwMCwweDMwLDB4MzYsMHhkNiwweDAwLDB4MzQsMHgzNiwweGY3LDB4MDAsMHgzOCwKKzB4MjQsMHgwMiwweDQ1LDB4NjcsMHhhZCwweGU5LDB4MDAsMHgwMCwweGE2LDB4MDIsMHgwMCwweDAwLDB4YWUsMHgyMywweDAwLDB4MDAsCisweDhmLDB4YjAsMHgwMCwweDAwLDB4YTYsMHg0MywweDAwLDB4MDAsMHg4ZiwweGIxLDB4MDAsMHgwNCwweGFlLDB4NjMsMHgwMCwweDAwLAorMHg4ZiwweGIyLDB4MDAsMHgwOCwweGE2LDB4ODMsMHgwMCwweDAwLDB4OGYsMHhiMywweDAwLDB4MGMsMHhhZSwweGEzLDB4MDAsMHgwMCwKKzB4OGYsMHhiNCwweDAwLDB4MTAsMHhhNiwweGMzLDB4MDAsMHgwMCwweDhmLDB4YjUsMHgwMCwweDE0LDB4YWUsMHhlMywweDAwLDB4MDAsCisweDdiLDB4YjYsMHgwMCwweGZjLDB4M2MsMHgxOCwweGIwLDB4MDksMHgzNywweDE4LDB4MDAsMHgzYywweGE3LDB4MDMsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NTEsMHgzOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MzQsCisweDM0LDB4MDIsMHhmZiwweGZmLDB4MDAsMHg0MywweDEwLDB4MmEsMHgxNCwweDQwLDB4MDEsMHgwYiwweDAwLDB4ODAsMHgzMCwweDIxLAorMHg4YywweDg0LDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHg4MiwweDAwLDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHhjMiwweDAwLDB4MmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDQ3LDB4MjQsMHgwMiwweDAwLDB4MDYsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDA0LDB4NTAsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDE0LDB4NDAsMHgwMCwweGU0LDB4YWMsMHhjMiwweDAwLDB4MmMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHg4MiwweDAwLDB4ZTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg4MiwweDAwLDB4ZDEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhjNywweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ZTIsMHgwMCwweGM3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4YzIsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwOSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgzYywweDAzLDB4YjAsMHgwOSwweDM0LDB4NjMsMHgwMSwweDYwLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4MDAsMHgwNSwweGFjLDB4YzIsMHgwMCwweDE0LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGFjLDB4YzIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMwLDB4MDAsMHgxNCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhkMCwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA0LDB4NjEsMHgwMCwweDE2LDB4M2MsMHgwMywweGIwLDB4MDUsMHgzNCwweDYzLDB4MDIsMHgyZSwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4MTAsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MzQsMHg0MiwweDAyLDB4NDIsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg2MCwweDAwLDB4MGIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHhjMiwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4ODAsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MGUsMHgyNCwweDAzLDB4MDAsMHgwMSwKKzB4YWMsMHhjMiwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweGEwLDB4YzMsMHgwMCwweDUwLDB4ODAsMHhjMiwweDAwLDB4MzEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGEsMHgzYywweDAyLDB4YjAsMHgwNiwweDM0LDB4NDIsMHg4MCwweDE4LAorMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhmMCwweDAwLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyNCwKKzB4MTAsMHg2MiwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwOSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhjMiwweDAwLDB4MDAsCisweDhjLDB4YzIsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDYwLDB4MDAsMHgwOSwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyYywKKzB4OGMsMHg0MywweDAwLDB4MDAsMHgzYywweDA0LDB4MDAsMHgwMiwweDAwLDB4NjQsMHgxOCwweDI0LDB4MTQsMHg2MCwweGZmLDB4ZjIsCisweDI0LDB4MDIsMHgwMCwweDEwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDIsMHgwMSwweDkwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDgwLDB4MTAsMHg0MCwweDAwLDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHhjMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFjLDB4YzMsMHgwMCwweDEwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDkwLDB4NDIsMHgwMiwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwZiwweGFjLDB4YzIsMHgwMCwweDBjLAorMHg5MCwweGMzLDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDBkLDB4M2MsMHgwMSwweGIwLDB4MDMsMHgwOCwweDAwLDB4MTQsMHhhNiwKKzB4YTAsMHgyMywweDAyLDB4MDEsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMSwweDgwLDB4OTAsMHg0NCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDFlLDB4MDAsMHgwMCwweDAzLDB4MWUsMHgwMywweDEwLDB4NjAsMHgwMCwweDE1LAorMHhhMCwweGM0LDB4MDAsMHg0NCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHg2MiwweDAwLDB4MGIsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHg2MiwweDAwLDB4MDMsMHgyNCwweDAzLDB4MDAsMHgwZCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4YzIsMHgwMCwweDBjLDB4YWMsMHhjMywweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHgwNCwweGFjLDB4YzIsMHgwMCwweDEwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YzMsMHgwMCwweDBjLDB4MjQsMHgwMiwweDAwLDB4MGQsMHhhYywweGMyLDB4MDAsMHgwMCwKKzB4MjQsMHgwMywweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwNiwweGFjLDB4YzMsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4YzIsMHgwMCwweDBjLDB4OGMsMHhjMywweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4NjIsMHgwMCwweDA2LAorMHgxMCwweDQwLDB4MDAsMHgyZSwweDAwLDB4MDMsMHgxMCwweDgwLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNCwweDYzLDB4MDIsMHgwMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGUyLDB4MDAsMHgwNiwweDI0LDB4MDIsMHgwMCwweDAzLAorMHg4YywweGEyLDB4MDIsMHhiYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDYsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHhhYywweGMyLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4YzIsMHgwMCwweDM4LDB4MzQsMHg2MywweDgwLDB4MjQsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDEwLDB4NDAsMHgwMCwweDA1LDB4YWMsMHhjMiwweDAwLDB4MTgsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4YWMsMHhjMiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTQsMHhmYSwweGFjLDB4YzAsMHgwMCwweDE4LDB4MDgsMHgwMCwweDE0LDB4ZmEsCisweGFjLDB4YzAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgyNCwweDAzLDB4MDAsMHgwYiwweGFjLDB4YzIsMHgwMCwweDM4LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YzMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGUyLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwYywweGFjLDB4YzIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE0LDB4ZmIsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MDgsMHgwMCwweDE1LDB4MTIsMHgyNCwweDAyLDB4MDAsMHgwMywweGFjLDB4YzAsMHgwMCwweDM4LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YzAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGUyLDB4MDAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHg4MCwweGMyLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDgsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4YWMsMHhjMiwweDAwLDB4MDAsMHg5MywweDgyLDB4ODYsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4ZmYsMHhkNiwweDI0LDB4MDIsMHgwMCwweDA1LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGMwLDB4MDAsMHgzOCwKKzB4MDgsMHgwMCwweDE1LDB4MjIsMHhhYywweGMwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA2LDB4MzQsMHg0MiwweDgwLDB4MTgsCisweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweGYwLDB4MDAsMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4NjQsMHgxOCwweDI0LAorMHgxMCwweDYyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDA5LDB4MDgsMHgwMCwweDE1LDB4MjYsMHhhYywweGMyLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDUsMHgwOCwweDAwLDB4MTUsMHgxOCwweGFjLDB4YzIsMHgwMCwweDM4LDB4ODAsMHhjMiwweDAwLDB4MzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4MzcsMHgyNCwweDAyLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxNCwweGE2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDg0LDB4YzIsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4ZmYsMHg2NiwKKzB4MjQsMHgwMiwweDAwLDB4MDYsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJlLDB4OTAsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDYzLDB4MDAsMHhmZiwweDAwLDB4NjAsMHgxMCwweDIxLAorMHgxNCwweDQwLDB4ZmYsMHgyNCwweGE0LDB4YzMsMHgwMCwweDIwLDB4MDgsMHgwMCwweDE0LDB4YTYsMHgyNCwweDAyLDB4MDAsMHgwNiwKKzB4OGMsMHhjMiwweDAwLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDU3LDB4MjQsMHgwMiwweDAwLDB4MDUsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4MmMsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDEwLDB4NDAsMHhmZiwweDE0LDB4YWMsMHhjMiwweDAwLDB4MWMsMHgwOCwweDAwLDB4MTQsMHhhNiwKKzB4MjQsMHgwMiwweDAwLDB4MDUsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDIsMHgxNywweDQyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4ZmYsMHg0NywweDI0LDB4MDIsMHgwMCwweDA2LAorMHgwOCwweDAwLDB4MTQsMHg1YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MGEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHg4MiwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkOCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MjcsMHg5MCwweDg2LDB4NDgsCisweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIyLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyYiwweGU4LAorMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4OTAsMHg4ZiwweGQwLDB4NDgsMHgwMiwweDAwLDB4MDAsMHgwYywweDAwLDB4MTMsMHhlYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTgsMHg0ZSwweDAyLDB4MDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDAwLDB4MzQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4ZjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDY4LAorMHgwYywweDAwLDB4MjcsMHhjMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4NCwweDgwLDB4MTAsMHgwYywweDAwLDB4MjEsMHg5YSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODksMHgwOCwweDBjLDB4MDAsMHgwNiwweGUxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwMSwweDNiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwweDBjLDB4MDAsMHgxMywweGQ1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg4OSwweDNjLDB4YWYsMHg4MiwweDg0LDB4NTAsMHgwYywweDAwLDB4MDAsMHg2MSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMSwweDA4LDB4M2MsMHgwNCwweGIwLDB4MDksCisweDNjLDB4MDUsMHhiMCwweDA5LDB4OGMsMHg2NiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDEsMHg2OCwweDI0LDB4MDIsMHhjOCwweDgwLAorMHgzNCwweGE1LDB4MDEsMHg0MCwweDI0LDB4MDMsMHgwMCwweDBhLDB4YTQsMHg4MiwweDAwLDB4MDAsMHhhNCwweGEzLDB4MDAsMHgwMCwKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHg4YywweDgyLDB4MDAsMHgwMCwweDhmLDB4ODcsMHg4NCwweDEwLDB4YWYsMHg4NiwweDg0LDB4MDgsCisweDM0LDB4NDIsMHgwMCwweDIwLDB4YWMsMHg4MiwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDU4LAorMHg4YywweDQzLDB4MDAsMHgwMCwweDJjLDB4ZTQsMHgwMCwweDExLDB4MzQsMHg2MywweDAxLDB4MDAsMHhhYywweDQzLDB4MDAsMHgwMCwKKzB4MTAsMHg4MCwweGZmLDB4ZmEsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MDAsMHgwNywweDEwLDB4ODAsCisweDI0LDB4NjMsMHgwMiwweDE4LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDgwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4NjgsMHgwYywweDAwLDB4MjYsMHhlNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwweDI3LDB4ODUsMHg4NiwweDQ4LDB4MGMsMHgwMCwweDE0LDB4NGUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDAsMHgwNywweDNjLDB4MDMsMHhiMCwweDA2LAorMHg5MCwweDQ0LDB4MDAsMHgwMCwweDM0LDB4NjMsMHg4MCwweDE4LDB4OGMsMHg2NSwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAwLDB4ZWMsMHgzYywweDAzLDB4YjAsMHgwMywweDMwLDB4ODYsMHgwMCwweGZmLDB4YTAsMHg0NiwweDAwLDB4MDAsCisweDAwLDB4MDUsMHgyZiwweDAyLDB4MzQsMHg2MywweDAwLDB4ZWQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweDJjLAorMHhhMCwweDY1LDB4MDAsMHgwMCwweGEzLDB4ODAsMHg4MSwweDU4LDB4OTMsMHg4MywweDgxLDB4ZjEsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHg2MiwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODcsMHg4NCwweDEwLDB4OGYsMHg4MiwweDg0LDB4NDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHg0NCwweDA4LDB4MDAsMHgxNSwweDliLAorMHgzYywweDAyLDB4YjAsMHgwMywweDhmLDB4ODcsMHg4NCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweGUyLDB4ZmYsMHhmYywKKzB4MmMsMHg0MiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgwYSwweDNjLDB4MDMsMHhiMCwweDA2LDB4OTMsMHg4MiwweDg2LDB4M2MsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDcsMHgzNCwweDYzLDB4ODAsMHgxOCwweDI3LDB4ODQsMHg4NCwweDY4LAorMHgwYywweDAwLDB4MjcsMHg3NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NywweDg0LDB4MTAsMHgzYywweDAzLDB4YjAsMHgwNiwKKzB4MzQsMHg2MywweDgwLDB4MTgsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4MDIsCisweDEwLDB4NDAsMHhmZiwweGU2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YmMsMHgxMCwweDhmLDB4ODQsMHhiYywweDE4LAorMHgzYywweDA1LDB4YjAsMHgwMSwweDAwLDB4NDUsMHgxMCwweDIxLDB4YWMsMHg0NCwweDAwLDB4MDAsMHg4ZiwweDgzLDB4YmMsMHgxMCwKKzB4OGYsMHg4MiwweGJjLDB4MTQsMHgwMCwweDY1LDB4MTgsMHgyMSwweDA4LDB4MDAsMHgxNSwweGM3LDB4YWMsMHg2MiwweDAwLDB4MDQsCisweDE0LDB4YTAsMHhmZiwweGQ0LDB4M2MsMHgwMiwweGIwLDB4MDMsMHg5MywweDgzLDB4ODEsMHg1OCwweDM0LDB4NDIsMHgwMCwweGVlLAorMHgyNCwweDYzLDB4MDAsMHgwMSwweDMwLDB4NjQsMHgwMCwweGZmLDB4MmMsMHg4NCwweDAwLDB4ZjEsMHhhMCwweDQzLDB4MDAsMHgwMCwKKzB4YTMsMHg4MywweDgxLDB4NTgsMHgxNCwweDgwLDB4ZmYsMHhjYywweDAwLDB4MDAsMHgwMCwweDAwLDB4YWYsMHg4NiwweDg0LDB4MjQsCisweGEzLDB4ODYsMHg4NiwweDIzLDB4MDgsMHgwMCwweDE1LDB4YzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDY4LAorMHgwYywweDAwLDB4MjksMHg2ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTMsMHg4MiwweDg0LDB4NDEsMHg4ZiwweDgyLDB4ODQsMHg0NCwKKzB4YWYsMHg4MCwweDg0LDB4MTAsMHgyNCwweDQyLDB4MDAsMHgwMSwweGFmLDB4ODIsMHg4NCwweDQ0LDB4MDgsMHgwMCwweDE1LDB4OWEsCisweDAwLDB4MDAsMHgzOCwweDIxLDB4MjcsMHg4NCwweDg2LDB4NDgsMHgwYywweDAwLDB4MTksMHgxOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDE0LDB4NDAsMHgwMCwweDA1LDB4M2MsMHgwMywweGIwLDB4MDUsMHhhZiwweDgwLDB4ODQsMHgxMCwKKzB4YWYsMHg4MCwweDg0LDB4MTQsMHgwOCwweDAwLDB4MTUsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4NTAsCisweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZiwweGFmLDB4ODIsMHg4NCwweDNjLAorMHgxNCwweDQwLDB4MDAsMHgyMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4OGYsMHg4NCwweDg0LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg4MiwweDAwLDB4MjAsMHgzYywweDAzLDB4YjAsMHgwOSwweDM0LDB4NjMsMHgwMSwweDYwLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHgyNCwweDE0LDB4NDAsMHgwMCwweDE1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg4MiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwNywweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMSwweGFmLDB4ODIsMHg4NCwweDE0LDB4YWYsMHg4NywweDg0LDB4MTAsCisweDA4LDB4MDAsMHgxNSwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJlLAorMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDYzLDB4MDAsMHhmZiwKKzB4MDAsMHg2MCwweDEwLDB4MjEsMHhhNywweDgzLDB4ODQsMHgzMCwweDE0LDB4NDAsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YWYsMHg4MiwweDg0LDB4MTQsMHhhZiwweDgwLDB4ODQsMHgxMCwweDA4LDB4MDAsMHgxNSwweGM2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4MmMsMHg4YywweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZiwweGFmLDB4ODIsMHg4NCwweDJjLDB4MTQsMHg0MCwweGZmLDB4ZjUsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDE2LDB4MWEsMHgzYywweDAzLDB4YjAsMHgwOSwweDI3LDB4ODQsMHg4NiwweDQ4LAorMHgwYywweDAwLDB4MWEsMHhkZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODMsMHg4MiwweDg0LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweGZmLDB4ZWMsMHgyNCwweDAyLDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDA0LDB4NTAsCisweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZiwweGFmLDB4ODIsMHg4NCwweDNjLAorMHgxNCwweDQwLDB4ZmYsMHhlNCwweDI0LDB4MDIsMHgwMCwweDAyLDB4OGYsMHg4NCwweDg0LDB4MTgsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHg4MiwweDAwLDB4MTIsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDcsMHgwMCwweDA0LDB4MDgsMHgwMCwweDE2LDB4MjYsMHgyNCwweDAyLDB4MDAsMHgwMiwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwMSwKKzB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwweGE3LDB4ODMsMHg4NCwweDMwLDB4MTQsMHg0MCwweGZmLDB4ZjQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE2LDB4MzUsMHgyNCwweDAyLDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDA1LAorMHgzNCwweDYzLDB4MDIsMHgyYywweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZiwKKzB4YWYsMHg4MiwweDg0LDB4MmMsMHgxNCwweDQwLDB4ZmYsMHhmNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE2LDB4NTYsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MjcsMHg4NCwweDg5LDB4MDgsMHgwYywweDAwLDB4MGIsMHg1MSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZiwweDgzLDB4ODQsMHgxNCwweGFmLDB4ODIsMHg4NCwweDJjLDB4MzgsMHg2NCwweDAwLDB4MDIsMHgwMCwweDA0LDB4MTgsMHgwYSwKKzB4YWYsMHg4MywweDg0LDB4MTQsMHgxNCwweDQwLDB4ZmYsMHhhZCwweDI0LDB4MDcsMHgwMCwweDA1LDB4OGYsMHg4MiwweDg5LDB4NDgsCisweGFmLDB4ODAsMHg4NCwweDEwLDB4MTAsMHg0MCwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDAsMHgwMSwweGFmLDB4ODQsMHg4NCwweDE4LAorMHg5MywweDgyLDB4ODksMHg1NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweGZmLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDAsMHgwOCwweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweDIwLDB4MDAsCisweDAwLDB4NjQsMHgxOCwweDI0LDB4MTAsMHg2MCwweGZmLDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDAsMHhhMCwweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweDgwLDB4MDAsMHhhZiwweDgwLDB4ODksMHgzMCwKKzB4MjQsMHg2MywweDAwLDB4MDEsMHhhYywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDEsMHhiMCwweDA1LDB4YWMsMHgyNCwweDAwLDB4MDgsCisweGFmLDB4ODAsMHg4OSwweDJjLDB4YWYsMHg4MCwweDg5LDB4MzQsMHhhZiwweDgwLDB4ODksMHgzOCwweGFmLDB4ODAsMHg4OSwweDQ0LAorMHhhZiwweDgwLDB4ODksMHgzYywweDA4LDB4MDAsMHgxNSwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MywweDgyLDB4ODQsMHg2MCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMiwweDI0LDB4MDIsMHgwMCwweDIwLDB4YWYsMHg4MiwweDg0LDB4MmMsCisweDhmLDB4ODUsMHg4NCwweDJjLDB4MjcsMHg4NCwweDg5LDB4MDgsMHgwYywweDAwLDB4MGQsMHgyYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MWUsMHgwMCwweGEzLDB4ODIsMHg4NCwweDQwLDB4YWYsMHg4MCwweDg0LDB4MmMsMHgxMCwweDYwLDB4ZmYsMHg4ZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJlLDB4OTAsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDYzLDB4MDAsMHhmZiwweDAwLDB4NjAsMHgxMCwweDIxLAorMHhhNywweDgzLDB4ODQsMHgzMCwweDEwLDB4NDAsMHgwMCwweDA0LDB4MjQsMHgwNCwweDAwLDB4MDIsMHhhZiwweDg0LDB4ODQsMHgxOCwKKzB4MDgsMHgwMCwweDE2LDB4MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDI3LDB4MjQsMHgwNywweDAwLDB4MDYsCisweDI3LDB4ODQsMHg4NCwweDEwLDB4MjcsMHg4NSwweDg5LDB4MDgsMHgwYywweDAwLDB4MGQsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZiwweDgyLDB4ODQsMHgzNCwweGFmLDB4ODAsMHg4NCwweDNjLDB4MTQsMHg0MCwweDAwLDB4MTksMHgwMCwweDQwLDB4MTgsMHgyMSwKKzB4OGYsMHg4MiwweDg0LDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDE1LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDhmLDB4ODMsMHg4NCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDYyLDB4MDAsMHgwYiwweDNjLDB4MDIsMHg0MCwweDAwLAorMHg4ZiwweDgzLDB4ODQsMHgxNCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHg2MiwweDAwLDB4MDIsMHgyNCwweDA3LDB4MDAsMHgwMywKKzB4MjQsMHgwNywweDAwLDB4MDYsMHhhZiwweDg3LDB4ODQsMHgxMCwweDI0LDB4MDQsMHgwMCwweDAzLDB4YWYsMHg4NCwweDg0LDB4MTgsCisweDA4LDB4MDAsMHgxNSwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDAsMHgxNCwweDNjLDB4MDEsMHhiMCwweDA1LAorMHhhYywweDIyLDB4MDAsMHgwMCwweGFmLDB4ODAsMHg4NCwweDEwLDB4MDgsMHgwMCwweDE2LDB4Y2YsMHgyNCwweDA0LDB4MDAsMHgwMywKKzB4MTAsMHg2MCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDEwLDB4MjcsMHg4NSwweDg5LDB4MDgsCisweDBjLDB4MDAsMHgwZSwweDFkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDgzLDB4ODQsMHgxNCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMywweDgwLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDE4LDB4MTAsMHg2MiwweDAwLDB4MDIsMHgyNCwweDA3LDB4MDAsMHgwMywKKzB4MjQsMHgwNywweDAwLDB4MDQsMHhhZiwweDg3LDB4ODQsMHgxMCwweGFmLDB4ODAsMHg4NCwweDM0LDB4MDgsMHgwMCwweDE1LDB4YzYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4ODMsMHg4MiwweDg0LDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4OSwweDA4LDB4MGMsMHgwMCwweDEwLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweDg0LDB4MTQsMHhhMywweDgwLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDEwLDB4YWYsMHg4MCwweDg0LDB4MTgsCisweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweGFmLDB4ODIsMHg4NCwweDE0LAorMHhhZiwweDgwLDB4ODQsMHgzOCwweDA4LDB4MDAsMHgxNSwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHgxMCwKKzB4MjcsMHg4NSwweDg5LDB4MDgsMHgwYywweDAwLDB4MGUsMHgxZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweDg0LDB4MTQsCisweGEzLDB4ODAsMHg4NCwweDQwLDB4YWYsMHg4MCwweDg0LDB4MTAsMHhhZiwweDgwLDB4ODQsMHgxOCwweDE0LDB4NDAsMHhmZSwweGMyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4YWYsMHg4MiwweDg0LDB4MTQsMHgwOCwweDAwLDB4MTUsMHhjNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODksMHgwOCwweDBjLDB4MDAsMHgxMCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxNiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg2OCwweDBjLDB4MDAsMHgyYSwweDk2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNSwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MjQsMHg2NiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MjcsMHg1NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE4LDB4NDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4NjgsMHgwYywweDAwLDB4MjcsMHg2NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MywweDgzLDB4YmMsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg2MCwweDAwLDB4MmIsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDgsMHg4YywweDQ0LDB4MDAsMHgwMCwweDhmLDB4ODMsMHhiYywweDAwLDB4OGYsMHg4MiwweGJjLDB4MDQsCisweDAwLDB4ODMsMHgxOCwweDIzLDB4MDAsMHg0MywweDEwLDB4MmIsMHgxMCwweDQwLDB4MDAsMHgyMywweDNjLDB4MDIsMHhiMCwweDAzLAorMHgyNCwweDA0LDB4MDUsMHhhMCwweDM0LDB4NDIsMHgwMSwweDE4LDB4OGMsMHg0MiwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhjZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA0LDB4MDUsMHhhNCwweDBjLDB4MDAsMHgwNiwweGNlLDB4MDAsMHgwMiwweDg0LDB4MDIsCisweDMwLDB4NTEsMHhmZiwweGZmLDB4MjQsMHgwNCwweDA1LDB4YTgsMHgwMCwweDAyLDB4OTQsMHgwMiwweDBjLDB4MDAsMHgwNiwweGNlLAorMHgzYSwweDEwLDB4ZmYsMHhmZiwweDNhLDB4MzEsMHhmZiwweGZmLDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgyZSwweDEwLDB4MDAsMHgwMSwKKzB4MmUsMHgzMSwweDAwLDB4MDEsMHgzYSwweDUyLDB4ZmYsMHhmZiwweDAyLDB4MTEsMHg4MCwweDI1LDB4MmUsMHg1MiwweDAwLDB4MDEsCisweDM4LDB4NDIsMHhmZiwweGZmLDB4MDIsMHgxMiwweDgwLDB4MjUsMHgyYywweDQyLDB4MDAsMHgwMSwweDAyLDB4MDIsMHg4MCwweDI1LAorMHgxNiwweDAwLDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwMCwweDAyLDB4MDAsMHgwMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MDUsMHg3MCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YWYsMHg4MywweGJjLDB4MDAsMHgwYywweDAwLDB4MDEsMHhlYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhZiwweDgwLDB4ODQsMHgxMCwweGFmLDB4ODAsMHg4NCwweDQ0LDB4MDgsMHgwMCwweDE1LDB4OWEsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4MjcsMHg5MCwweGIzLDB4ZjAsMHgyNCwweDExLDB4MDAsMHgxMiwweDhlLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkwLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MjAsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjYsMHgzMSwweGZmLDB4ZmYsMHgwNiwweDIxLDB4ZmYsMHhmNiwKKzB4MjYsMHgxMCwweDAwLDB4MDQsMHhhZiwweDgwLDB4ODQsMHgxMCwweDA4LDB4MDAsMHgxNSwweGM3LDB4MDAsMHgwMCwweDM4LDB4MjEsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDgsMHg4YywweDQ0LDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4NCwweDA4LAorMHgwMCwweDA0LDB4MTksMHhjMiwweDAwLDB4MDIsMHgxMSwweGMyLDB4MTAsMHg2MiwweGZmLDB4ZjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwMiwweDkwLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgxMiwweGIwLDB4MDUsCisweGFmLDB4ODQsMHg4NCwweDA4LDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTEsMHg0MCwweDAwLDB4NDMsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDk5LDB4MDAsMHgwMCwweDAwLDB4ODgsMHgyMSwKKzB4MzYsMHg1MiwweDAyLDB4MmMsMHgyNywweDkwLDB4YjMsMHhmMCwweDhlLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkwLDB4ODMsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYyLDB4MDAsMHgwMywweDEwLDB4NDAsMHgwMCwweDA2LAorMHgzMCwweDYyLDB4MDAsMHgxYywweDE0LDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg1LDB4ODQsMHgwOCwKKzB4MGMsMHgwMCwweDFlLDB4YjIsMHgwMiwweDYwLDB4MzAsMHgyMSwweDhlLDB4NDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweGZmLDB4MTQsMHg0MCwweGZmLDB4ZDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LDB4MzEsMHgwMCwweDAxLAorMHgyYSwweDIyLDB4MDAsMHgxMywweDE0LDB4NDAsMHhmZiwweGVjLDB4MjYsMHgxMCwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTcsMHg1ZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg0LDB4ODQsMHgxYywweDI3LDB4ODUsMHg4OSwweDA4LDB4MGMsMHgwMCwweDE3LDB4ZDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MywweDg0LDB4MWMsMHgyNCwweDAyLDB4MDAsMHgwNCwweDE0LDB4NjIsMHhmZSwweGEyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDI3LDB4MjQsMHgwNywweDAwLDB4MDUsMHgyNywweDg0LDB4ODksMHgwOCwKKzB4MGMsMHgwMCwweDI0LDB4OGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDcsMHgwMCwweDA1LDB4YWYsMHg4NywweDg0LDB4MTAsCisweDA4LDB4MDAsMHgxNSwweGM3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4ODksMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgwZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4NCwweGI0LDB4MzAsMHhhZiwweDgwLDB4ODksMHgzYywKKzB4OTQsMHg4NSwweDAwLDB4MTQsMHgwYywweDAwLDB4MWIsMHg4NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4MiwweDhiLDB4NjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MDEsMHg1OSwweDAwLDB4MDAsMHgyMCwweDIxLDB4OGYsMHg4NCwweGI0LDB4MzAsMHgwYywweDAwLDB4MjAsMHhkMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTcsMHg1ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4OTAsCisweDI3LDB4YmQsMHhmZiwweGU4LDB4MDAsMHg4MCwweDE4LDB4MjEsMHgzNCwweDQyLDB4MDAsMHgwMSwweDI3LDB4ODQsMHg4OSwweDA4LAorMHgxMCwweDYyLDB4MDAsMHgwNSwweGFmLDB4YmYsMHgwMCwweDEwLDB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgwNiwweGUxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4ODQsMHg4NiwweDQ4LDB4MGMsMHgwMCwweDE4LDB4NGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODQsMHg4NCwweDEwLAorMHgwYywweDAwLDB4MTMsMHhkNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE3LDB4YmEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweDg5LDB4NDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDhmLDB4ODIsMHg4NCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg2MCwweDEwLDB4MjEsMHgyNywweGJkLDB4ZmYsMHhlMCwKKzB4M2MsMHgwNiwweGIwLDB4MDMsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MzQsMHhjNiwweDAwLDB4NWYsCisweGFmLDB4YmYsMHgwMCwweDE4LDB4OTAsMHhjMywweDAwLDB4MDAsMHgzYywweDA3LDB4YjAsMHgwMywweDM0LDB4ZTcsMHgwMCwweDVkLAorMHgzNCwweDYzLDB4MDAsMHgwMSwweDNjLDB4MDksMHhiMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMCwweGMzLDB4MDAsMHgwMCwKKzB4MDAsMHg4MCwweDgwLDB4MjEsMHhhMCwweGUyLDB4MDAsMHgwMCwweDAwLDB4YTAsMHg4OCwweDIxLDB4MzUsMHgyOSwweDAwLDB4NWUsCisweDAwLDB4ZTAsMHg0MCwweDIxLDB4MjQsMHgwNCwweDAwLDB4MDEsMHg5MSwweDIyLDB4MDAsMHgwMCwweDkxLDB4MDMsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4ODMsMHgwMCwweDAzLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4ZmYsMHhmYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwNCwweDEyLDB4MDIsMHgwMCwweDJjLDB4MjQsMHgwNSwweDBmLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDA2LDB4MTIsMHgwMiwweDAwLDB4MDgsMHgyNCwweDA1LDB4MDAsMHgwZiwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDIsMHgwMCwweGEwLDB4NTAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwweDI0LDB4MDQsMHgwYywweDA0LDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDBmLDB4MjQsMHgwNCwweDBkLDB4MDQsMHgyNCwweDA1LDB4MDAsMHgwZiwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwOCwweDgwLDB4MjQsMHgwNSwweDFlLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MGYsMHgyNCwweDA0LDB4MDgsMHg4YywweDI0LDB4MDUsMHgwZiwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDBmLDB4MjQsMHgwNCwweDA4LDB4MjQsMHgzYywweDA1LDB4MDAsMHgzMCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwOCwweDJjLDB4M2MsMHgwNSwweDAwLDB4MzAsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4MjQsMHgwNiwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDgsMHgzNCwweDNjLDB4MDUsMHgwMCwweDMwLDB4MGMsMHgwMCwweDEzLDB4NWIsCisweDI0LDB4MDYsMHgwMCwweDAyLDB4MjQsMHgwNCwweDA4LDB4M2MsMHgzYywweDA1LDB4MDAsMHgzMCwweDBjLDB4MDAsMHgxMywweDViLAorMHgyNCwweDA2LDB4MDAsMHgwMiwweDA4LDB4MDAsMHgxNywweGY0LDB4M2MsMHgwMiwweGIwLDB4MDMsMHgyNCwweDA0LDB4MDgsMHg4YywKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwOCwweDgwLDB4MjQsMHgwNSwweDFlLDB4MDAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MGMsMHgwNCwweDI0LDB4MDUsMHgwMCwweDBmLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDA0LDB4MjQsMHgwNCwweDBkLDB4MDQsMHgyNCwweDA1LDB4MDAsMHgwZiwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwOCwweDI0LDB4M2MsMHgwNSwweDAwLDB4MzAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNiwweDAwLDB4MDMsMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHgwMCwweDMwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHgzMCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMiwweDNjLDB4MDUsMHgwMCwweDMwLDB4MjQsMHgwNiwweDAwLDB4MDMsCisweDBjLDB4MDAsMHgxMywweDViLDB4MjQsMHgwNCwweDA4LDB4M2MsMHgwMiwweDIwLDB4MjAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDE0LAorMHgwYywweDAwLDB4MTMsMHhhMCwweDI0LDB4MDYsMHgwMSwweDA3LDB4MDgsMHgwMCwweDE3LDB4ZjQsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHg3MywweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODAsMHg4MSwweDU5LAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDgyLDB4ODEsMHg1OSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDAwLDB4ODAsMHg3MCwweDIxLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NjEsMHgzOCwweDNjLDB4MDQsMHhiMCwweDAzLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDM0LDB4ODQsMHgwMCwweDMwLDB4YWQsMHhjMCwweDAyLDB4YmMsMHhhZCwweGMwLDB4MDIsMHhiOCwKKzB4OGMsMHg4MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHhmZiwweGE1LDB4YzAsMHgwMCwweDBhLDB4MDAsMHgwMCwweDMwLDB4MjEsCisweGE3LDB4ODIsMHg4ZiwweGUwLDB4MjcsMHg4OCwweDhmLDB4ZjAsMHhhNSwweGMzLDB4MDAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDA4LAorMHgzMCwweGMyLDB4ZmYsMHhmZiwweDAwLDB4MDIsMHgyMCwweGMwLDB4MjQsMHhjMywweDAwLDB4MDEsMHgwMCwweDgyLDB4MTAsMHgyMSwKKzB4MDAsMHg2MCwweDMwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDMwLDB4NjMsMHhmZiwweGZmLDB4MDAsMHg0OCwweDEwLDB4MjEsCisweDAwLDB4ODcsMHgyMCwweDIxLDB4MjgsMHhjNSwweDAwLDB4ZmYsMHhhYywweDgzLDB4MDAsMHgwMCwweDE0LDB4YTAsMHhmZiwweGY0LAorMHhhNCwweDQzLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDA4LDB4MzQsMHgwMywweGZmLDB4ZmYsMHgyNSwweGM0LDB4MDAsMHgwYywKKzB4MjQsMHgwYSwweDAwLDB4MDIsMHgzNCwweDQyLDB4MDcsMHhmOCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YTcsMHg4MywweGIzLDB4Y2MsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4YWYsMHg4NCwweGIzLDB4ZjAsMHgzNCwweGM2LDB4MDAsMHg2NCwweGEwLDB4OGEsMHgwMCwweDE4LAorMHg5NCwweGM1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiMywweGYwLDB4MjUsMHhjNCwweDAwLDB4MzAsMHgyNCwweDA4LDB4MDAsMHgwMywKKzB4M2MsMHgwMywweGIwLDB4MDMsMHhhMCwweDQ1LDB4MDAsMHgyMSwweDM0LDB4NjMsMHgwMCwweDY2LDB4YWYsMHg4NCwweGIzLDB4ZjQsCisweGEwLDB4ODgsMHgwMCwweDE4LDB4OTQsMHg2NSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjMsMHhmNCwweDI1LDB4YzQsMHgwMCwweDU0LAorMHgyNSwweGM3LDB4MDAsMHg3OCwweGEwLDB4NDUsMHgwMCwweDIxLDB4YWYsMHg4NCwweGIzLDB4ZjgsMHhhMCwweDg4LDB4MDAsMHgxOCwKKzB4OTQsMHg2NSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjMsMHhmOCwweDI1LDB4YzgsMHgwMCwweDljLDB4MjQsMHgwOSwweDAwLDB4MDEsCisweGEwLDB4NDUsMHgwMCwweDIxLDB4YWYsMHg4NywweGIzLDB4ZmMsMHhhMCwweGVhLDB4MDAsMHgxOCwweDk0LDB4YzQsMHgwMCwweDAwLAorMHg4ZiwweDgyLDB4YjMsMHhmYywweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NjIsMHhhMCwweDQ0LDB4MDAsMHgyMSwKKzB4YWYsMHg4OCwweGI0LDB4MDAsMHhhMSwweDA5LDB4MDAsMHgxOCwweDk0LDB4NjUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4MDAsCisweDI1LDB4YzQsMHgwMCwweGMwLDB4M2MsMHgwNiwweGIwLDB4MDMsMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODQsMHhiNCwweDA0LAorMHhhMCwweDg5LDB4MDAsMHgxOCwweDk0LDB4NjUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4MDQsMHgyNSwweGM0LDB4MDAsMHhlNCwKKzB4MzQsMHhjNiwweDAwLDB4NjAsMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODQsMHhiNCwweDA4LDB4YTAsMHg4MCwweDAwLDB4MTgsCisweDk0LDB4YzUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4MDgsMHgyNSwweGMzLDB4MDEsMHgwOCwweDI1LDB4YzcsMHgwMSwweDJjLAorMHhhMCwweDQ1LDB4MDAsMHgyMSwweGFmLDB4ODMsMHhiNCwweDBjLDB4YTAsMHg2MCwweDAwLDB4MTgsMHg5NCwweGM4LDB4MDAsMHgwMCwKKzB4OGYsMHg4MiwweGI0LDB4MGMsMHgyNSwweGM0LDB4MDEsMHg1MCwweDI1LDB4YzUsMHgwMSwweDc0LDB4YTAsMHg0OCwweDAwLDB4MjEsCisweDI1LDB4YzYsMHgwMSwweDk4LDB4MjUsMHhjOSwweDAxLDB4YmMsMHgyNSwweGNhLDB4MDEsMHhlMCwweDI1LDB4Y2IsMHgwMiwweDA0LAorMHgyNSwweGNjLDB4MDIsMHgyOCwweDI1LDB4Y2QsMHgwMiwweDRjLDB4MjQsMHgwMiwweDAwLDB4MTAsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4YWYsMHg4NywweGI0LDB4MTAsMHgzNCwweDYzLDB4MDAsMHgzOCwweGEwLDB4ZTAsMHgwMCwweDE4LDB4YWYsMHg4NCwweGI0LDB4MTQsCisweGEwLDB4ODAsMHgwMCwweDE4LDB4YWYsMHg4NSwweGI0LDB4MTgsMHhhMCwweGEwLDB4MDAsMHgxOCwweGFmLDB4ODYsMHhiNCwweDFjLAorMHhhMCwweGMwLDB4MDAsMHgxOCwweGFmLDB4ODksMHhiNCwweDIwLDB4YTEsMHgyMCwweDAwLDB4MTgsMHhhZiwweDhhLDB4YjQsMHgyNCwKKzB4YTEsMHg0MCwweDAwLDB4MTgsMHhhZiwweDhiLDB4YjQsMHgyOCwweGExLDB4NjAsMHgwMCwweDE4LDB4YWYsMHg4YywweGI0LDB4MmMsCisweGExLDB4ODAsMHgwMCwweDE4LDB4YWYsMHg4ZCwweGI0LDB4MzAsMHhhMSwweGEyLDB4MDAsMHgxOCwweDk0LDB4NjQsMHgwMCwweDAwLAorMHg4ZiwweDgyLDB4YjQsMHgzMCwweDI1LDB4YzUsMHgwMiwweDcwLDB4M2MsMHgwMywweGIwLDB4MDMsMHhhMCwweDQ0LDB4MDAsMHgyMSwKKzB4MjQsMHgwMiwweDAwLDB4MTEsMHhhZiwweDg1LDB4YjQsMHgzNCwweDM0LDB4NjMsMHgwMCwweDZlLDB4YTAsMHhhMiwweDAwLDB4MTgsCisweDk0LDB4NjQsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4MzQsMHgyNSwweGM1LDB4MDIsMHg5NCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHhhMCwweDQ0LDB4MDAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDEyLDB4YWYsMHg4NSwweGI0LDB4MzgsMHgzNCwweDYzLDB4MDAsMHg2YywKKzB4YTAsMHhhMiwweDAwLDB4MTgsMHg5NCwweDY0LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDM4LDB4MjQsMHgwNSwweGZmLDB4ZmYsCisweDI0LDB4MDcsMHgwMCwweDAxLDB4YTAsMHg0NCwweDAwLDB4MjEsMHgyNCwweDA2LDB4MDAsMHgxMiwweDI3LDB4ODQsMHhiMywweGYwLAorMHg4YywweDgyLDB4MDAsMHgwMCwweDI0LDB4YzYsMHhmZiwweGZmLDB4YTAsMHg0MCwweDAwLDB4MDQsMHg4YywweDgzLDB4MDAsMHgwMCwKKzB4YTQsMHg0NSwweDAwLDB4MDAsMHhhNCwweDQ1LDB4MDAsMHgwMiwweGEwLDB4NjAsMHgwMCwweDBhLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweGE0LDB4NjUsMHgwMCwweDA2LDB4YTQsMHg2NSwweDAwLDB4MDgsMHhhMCwweDQwLDB4MDAsMHgxMCwweDhjLDB4ODMsMHgwMCwweDAwLAorMHhhNCwweDQ1LDB4MDAsMHgwYywweGE0LDB4NDUsMHgwMCwweDBlLDB4YTAsMHg2MCwweDAwLDB4MTIsMHg4YywweDgyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMCwweDQwLDB4MDAsMHgxNiwweDhjLDB4ODMsMHgwMCwweDAwLDB4YTQsMHg0NSwweDAwLDB4MTQsCisweGEwLDB4NjcsMHgwMCwweDE3LDB4OGMsMHg4MiwweDAwLDB4MDAsMHgyNCwweDg0LDB4MDAsMHgwNCwweGEwLDB4NDAsMHgwMCwweDIwLAorMHgwNCwweGMxLDB4ZmYsMHhlNywweGFjLDB4NDAsMHgwMCwweDFjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDY0LDB4MDAsCisweDAwLDB4MDUsMHgyOCwweDQwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweGE2LDB4MjgsMHgyMSwweDJjLDB4ZTIsMHgwMCwweDEwLAorMHgxNCwweDgwLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgxOCwweDIxLDB4MTAsMHg0MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHhlMCwweDE4LDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MjAsCisweDEwLDB4ZTIsMHgwMCwweDA2LDB4MmMsMHhlNCwweDAwLDB4MTAsMHgyNCwweGEyLDB4MDAsMHgwMSwweDEwLDB4ODAsMHhmZiwweGY5LAorMHgwMCwweDAyLDB4MTEsMHgwMCwweDA4LDB4MDAsMHgxOSwweDBkLDB4MDAsMHg0NywweDE4LDB4MjEsMHgwOCwweDAwLDB4MTksMHgwZCwKKzB4MjQsMHhhMywweDAwLDB4NTAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4YzgsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDY0LDB4NjQsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YmYsMHgwMCwweDM0LAorMHhhZiwweGJlLDB4MDAsMHgzMCwweGFmLDB4YjcsMHgwMCwweDJjLDB4YWYsMHhiNiwweDAwLDB4MjgsMHhhZiwweGI1LDB4MDAsMHgyNCwKKzB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4OGMsMHg4NiwweDAyLDB4YmMsMHgwMCwweDgwLDB4OTAsMHgyMSwweDE0LDB4YzAsMHgwMSwweDY2LAorMHgwMCwweGMwLDB4MzgsMHgyMSwweDg0LDB4ODIsMHgwMCwweDA4LDB4M2MsMHgwMywweGIwLDB4MDYsMHg5NCwweDg0LDB4MDAsMHgwOCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDAwLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDI0LDB4ODQsMHgwMCwweDAyLDB4MzAsMHg4NCwweDAxLDB4ZmYsMHgzMCwweGIxLDB4ZmYsMHhmZiwweDAwLDB4MDMsMHg0NCwweDAyLAorMHhhNiwweDQ0LDB4MDAsMHgwOCwweDE0LDB4ZTAsMHgwMCwweDA4LDB4M2MsMHgwMywweGIwLDB4MDYsMHgzNCwweDYzLDB4ODAsMHgyNCwKKzB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMSwweDAwLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDhlLDB4NDYsMHgwMiwweGJjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweGMwLDB4MDEsMHg0YywweDAwLDB4MTEsMHg5OCwweGMwLAorMHgwMCwweDExLDB4M2EsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAwLDB4MDAsMHhlNCwweDIwLDB4MjEsMHg4YywweDgzLDB4MDAsMHgwYywKKzB4MDAsMHgxMSwweDk4LDB4YzAsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4MDMsMHgxYiwweDgyLDB4MzAsMHg2MywweDAwLDB4MWYsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg5ZSwweDhmLDB4ZjQsMHgwMCwweDVlLDB4MTAsMHgyMSwweDAwLDB4NjAsMHgzMCwweDIxLAorMHhhYywweDQ0LDB4MDAsMHgxOCwweGFlLDB4NDMsMHgwMiwweGJjLDB4MTQsMHhjMCwweDAwLDB4MTAsMHgzYywweDAyLDB4YjAsMHgwMCwKKzB4MDAsMHgwOCwweDEwLDB4YzAsMHgwMCwweDQ4LDB4MTAsMHgyMSwweDI3LDB4ODQsMHg4ZiwweGYwLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDQsMHgxMCwweDIxLDB4OTQsMHg0NSwweDAwLDB4MDAsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDI0LDB4MDIsMHhmZiwweGZmLDB4YTQsMHg2MiwweDAwLDB4MDIsMHhhNCwweDY4LDB4MDAsMHgwNCwKKzB4YWUsMHg1MSwweDAyLDB4YjgsMHhhNiwweDQ1LDB4MDAsMHgwYSwweDNjLDB4MDIsMHhiMCwweDAwLDB4MDAsMHhlMiwweDQwLDB4MjEsCisweDhkLDB4MTYsMHgwMCwweDAwLDB4OGQsMHgxNCwweDAwLDB4MDQsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgzOCwweDgwLAorMHgwMCwweDE0LDB4MWEsMHgwMiwweDI3LDB4ODQsMHg5MCwweDAwLDB4MzAsMHg2MywweDAwLDB4MWYsMHgyNCwweDAyLDB4MDAsMHgxMCwKKzB4MDAsMHhlNCwweDIwLDB4MjEsMHhhNiwweDQzLDB4MDAsMHgwNiwweDhkLDB4MTAsMHgwMCwweDA4LDB4YTAsMHg4MiwweDAwLDB4MDYsCisweDg2LDB4NDUsMHgwMCwweDA2LDB4MDAsMHhmZSwweDEwLDB4MjEsMHgyNCwweDAzLDB4MDAsMHgxMywweDEwLDB4YTMsMHgwMSwweDE1LAorMHhhYywweDQ4LDB4MDAsMHgxOCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAxLDB4MDAsMHhhNiwweDQwLDB4MDAsMHgwMiwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHg5MCwweDY0LDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0NSwweDAwLDB4MDAsCisweDAwLDB4MTAsMHgxYiwweGMyLDB4MjcsMHg4MiwweDhmLDB4ZjAsMHgwMCwweDA0LDB4MjAsMHg4MiwweDAwLDB4ZTIsMHgxMCwweDIxLAorMHgzMCwweDYzLDB4MDAsMHgwMSwweGFjLDB4NDUsMHgwMCwweDA4LDB4MTAsMHg2MCwweDAwLDB4ZWMsMHgzMCwweDk3LDB4MDAsMHgwMSwKKzB4MDAsMHgxMCwweDE2LDB4ODIsMHgzMCwweDQ2LDB4MDAsMHgwMSwweDAwLDB4MTAsMHgxMiwweDAyLDB4MDAsMHgxMCwweDE5LDB4YzIsCisweDAwLDB4MTAsMHgyNiwweDAyLDB4MDAsMHgxMCwweDJlLDB4NDIsMHgzMCwweDQ3LDB4MDAsMHg3ZiwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgzMCwweDc1LDB4MDAsMHgwMSwweDMwLDB4ODQsMHgwMCwweDAxLDB4MTAsMHhjMiwweDAwLDB4ZDksMHgzMCwweGEzLDB4MDAsMHgwMSwKKzB4MGMsMHgwMCwweDE5LDB4MDAsMHgwMCwweDYwLDB4MjgsMHgyMSwweDAyLDB4NzEsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDJjLDB4NDYsMHgwMCwweDU0LDB4MjcsMHg4NSwweDkwLDB4MDAsMHgyNywweDg0LDB4OGYsMHhmOCwweDAwLDB4MDYsMHgxMCwweDBhLAorMHgwMCwweDY1LDB4MjgsMHgyMSwweDI2LDB4YTYsMHgwMCwweDAyLDB4MDAsMHg2NCwweDE4LDB4MjEsMHhhMCwweGEyLDB4MDAsMHgwMiwKKzB4YTAsMHg2NiwweDAwLDB4MDYsMHhhMCwweDYyLDB4MDAsMHgwNywweGEwLDB4YTIsMHgwMCwweDAxLDB4MDIsMHg3MSwweDIwLDB4MjEsCisweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg5ZSwweDYwLDB4MjEsMHg4ZCwweDg1LDB4MDAsMHgxOCwweDAwLDB4MTAsMHgxNSwweGMyLAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDhjLDB4YTMsMHgwMCwweDBjLDB4YTYsMHg0MiwweDAwLDB4MDAsMHgyNywweDgyLDB4OTAsMHgxMCwKKzB4MDAsMHg4MiwweDUwLDB4MjEsMHhhNiwweDU2LDB4MDAsMHgwNCwweDhkLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMywweDE5LDB4NDIsCisweDNjLDB4MDIsMHhmZiwweGVmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgzMCwweDYzLDB4MDAsMHgwMSwweDAwLDB4YTIsMHg0OCwweDI0LAorMHgwMCwweDAzLDB4MWQsMHgwMCwweDAxLDB4MjMsMHg0OCwweDI1LDB4MDAsMHgwOSwweDE1LDB4MDIsMHgyNiwweGM1LDB4MDAsMHgxMCwKKzB4MDAsMHgxNCwweDE5LDB4ODIsMHgwMCwweDE0LDB4MjUsMHg4MiwweDAwLDB4MTAsMHgzNCwweDAyLDB4MDAsMHgxMCwweDNjLDB4NDIsCisweDAwLDB4MTAsMHg0NCwweDgyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgzMCwweGI1LDB4ZmYsMHhmZiwweDMwLDB4Y2UsMHgwMCwweDAxLAorMHgzMCwweGU1LDB4MDAsMHgwMSwweDMwLDB4NmQsMHgwMCwweDAxLDB4MzAsMHg4YiwweDAwLDB4MDMsMHgzMiwweDk0LDB4MDAsMHgwNywKKzB4MzEsMHgwNiwweDAwLDB4MDEsMHhhZCwweDQ5LDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBiLDB4MzIsMHgwNywweDAwLDB4N2YsCisweDhkLDB4ODQsMHgwMCwweDE4LDB4M2MsMHgwMywweGZmLDB4ZjAsMHgzNCwweDYzLDB4ZmYsMHhmZiwweDhjLDB4ODIsMHgwMCwweDBjLAorMHgwMSwweDIzLDB4MTgsMHgyNCwweDAwLDB4MDIsMHgxMywweDgyLDB4MzAsMHg0MiwweDAwLDB4MGYsMHgwMCwweDAyLDB4MTQsMHgwMCwKKzB4MDAsMHg2MiwweDE4LDB4MjUsMHhhZCwweDQzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhjMiwweDAwLDB4OTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTUsMHhhMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4NjAsMHgwMCwweDgxLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDk2LDB4NDIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwNCwKKzB4YTYsMHg0MiwweDAwLDB4MDQsMHgwYywweDAwLDB4MTksMHgwMCwweDAxLDB4YzAsMHgyMCwweDIxLDB4MDIsMHg3MSwweDE4LDB4MjEsCisweDAwLDB4MDMsMHgzOCwweDgwLDB4MmMsMHg0NSwweDAwLDB4NTQsMHgyNywweDg0LDB4OTAsMHgwMCwweDAwLDB4ZTQsMHgyMCwweDIxLAorMHgwMCwweDA1LDB4MTAsMHgwYSwweGEwLDB4ODIsMHgwMCwweDAwLDB4YTAsMHg4MCwweDAwLDB4MDQsMHhhMCwweDgwLDB4MDAsMHgwNSwKKzB4OTYsMHg0NSwweDAwLDB4MDQsMHgyNywweDgyLDB4OGYsMHhmMCwweDAwLDB4ZTIsMHgxMCwweDIxLDB4YTQsMHg0NSwweDAwLDB4MDYsCisweDAwLDB4ZmUsMHgxOCwweDIxLDB4OTIsMHg0NSwweDAwLDB4MDEsMHg4YywweDY2LDB4MDAsMHgxOCwweDI3LDB4ODIsMHg5MCwweDEwLAorMHgwMCwweGUyLDB4MTAsMHgyMSwweGEwLDB4NDAsMHgwMCwweDAwLDB4YTAsMHg4NSwweDAwLDB4MDcsMHg5NCwweGMzLDB4MDAsMHgxMCwKKzB4MjQsMHgwMiwweDAwLDB4MDQsMHgzMCwweDYzLDB4MDAsMHgwZiwweDEwLDB4NjIsMHgwMCwweDVlLDB4MjQsMHhjNiwweDAwLDB4MTAsCisweDk0LDB4YzMsMHgwMCwweDE2LDB4MjcsMHg4NSwweDkwLDB4MDgsMHgwMCwweGU1LDB4MTAsMHgyMSwweGE0LDB4NDMsMHgwMCwweDAyLAorMHg5NCwweGMyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHg0YywKKzB4MDIsMHg3MSwweDIwLDB4MjEsMHg5NCwweGMyLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweGE0LDB4MzAsMHg0MiwweDAwLDB4ZmYsCisweDEwLDB4NDMsMHgwMCwweDQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NCwweGMyLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDg4LAorMHgzMCwweDQyLDB4MDAsMHg4OCwweDEwLDB4NDMsMHgwMCwweDNjLDB4MDIsMHg3MSwweDE4LDB4MjEsMHgyNywweDg0LDB4OTAsMHgxMCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwNCwweDAwLDB4ODAsCisweDAwLDB4NDQsMHgxMCwweDI1LDB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweGEwLDB4NTQsMHgwMCwweDAwLDB4OTIsMHg0MywweDAyLDB4YmYsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAwLDB4YzMsMHhhMCwweDQzLDB4MDAsMHgwMCwweDhlLDB4NGIsMHgwMiwweGJjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDExLDB4NjAsMHgwMCwweDFjLDB4MzIsMHhhMiwweDAwLDB4ZmYsMHgwMCwweDE1LDB4MWEsMHgwMiwweDMwLDB4NjQsMHhmZiwweGZmLAorMHgzOCwweDQyLDB4MDAsMHgwMCwweDI0LDB4NjUsMHgwMCwweDAxLDB4MDAsMHg4MiwweDI4LDB4MGEsMHgwMiwweDIwLDB4MzAsMHgyMSwKKzB4MTAsMHhhMCwweDAwLDB4MTIsMHgwMCwweDAwLDB4MzgsMHgyMSwweDAyLDB4NzEsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg4ZiwweGYwLDB4MDAsMHg0MywweDIwLDB4MjEsMHgyNCwweGE5LDB4ZmYsMHhmZiwweDNjLDB4MGEsMHhiMCwweDA4LAorMHgyNCwweDBjLDB4ZmYsMHhmZiwweDAwLDB4MDYsMHgxMCwweGMwLDB4MDAsMHg0YSwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwKKzB4MjQsMHhlOCwweDAwLDB4MDEsMHgxMCwweGU5LDB4MDAsMHgwZiwweDMwLDB4NjMsMHgwMCwweGZmLDB4MzEsMHgwNywweGZmLDB4ZmYsCisweDAwLDB4ZTUsMHgxMCwweDJiLDB4MTQsMHg0MCwweGZmLDB4ZjcsMHgwMCwweDYwLDB4MzAsMHgyMSwweDI1LDB4NjIsMHhmZiwweGZmLAorMHhhZSwweDQyLDB4MDIsMHhiYywweDdiLDB4YmUsMHgwMSwweGJjLDB4N2IsMHhiNiwweDAxLDB4N2MsMHg3YiwweGI0LDB4MDEsMHgzYywKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDM4LDB4YTQsMHg4NiwweDAwLDB4MDQsMHhhNCwweDhjLDB4MDAsMHgwMiwweGFlLDB4NTEsMHgwMiwweGI4LAorMHgwOCwweDAwLDB4MWEsMHgyZiwweGE2LDB4NDMsMHgwMCwweDBhLDB4OTQsMHhjMiwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4NjAsMHgxMCwweDQwLDB4ZmYsMHhjMSwweDAyLDB4NzEsMHgxOCwweDIxLDB4MDIsMHg3MSwweDIwLDB4MjEsCisweDI3LDB4ODIsMHg5MCwweDEwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDhjLDB4ODMsMHgwMCwweDAwLAorMHgzYywweDAyLDB4ZmYsMHg3ZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDAsMHg2MiwweDE4LDB4MjQsMHgwOCwweDAwLDB4MWEsMHgwZSwKKzB4YWMsMHg4MywweDAwLDB4MDAsMHgyNywweDg1LDB4OTAsMHgwOCwweDAwLDB4ZTUsMHgxMCwweDIxLDB4MDgsMHgwMCwweDE5LDB4ZjgsCisweGE0LDB4NDAsMHgwMCwweDAyLDB4MTEsMHg2MiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4NjIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4ZmYsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTYsMHg0MiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTksMHhkOCwKKzB4MjQsMHg0MiwweDAwLDB4MGMsMHg5NiwweDQyLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxOSwweGQ4LDB4MjQsMHg0MiwweDAwLDB4MDgsCisweDE2LDB4ZTYsMHhmZiwweDcwLDB4M2MsMHgwMiwweGZmLDB4ZmIsMHg4ZCwweDgzLDB4MDAsMHgxOCwweDM0LDB4NDIsMHhmZiwweGZmLAorMHgwMiwweDAyLDB4MTAsMHgyNCwweGFjLDB4NjIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDE5LDB4ZDEsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4MTYsMHhlNiwweGZmLDB4MjcsMHgzYywweDAyLDB4ZmIsMHhmZiwweDM0LDB4NDIsMHhmZiwweGZmLDB4MDIsMHgwMiwweDEwLDB4MjQsCisweGFkLDB4MDIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDE5LDB4OTAsMHgwMCwweDAwLDB4MzAsMHgyMSwweDkzLDB4ODgsMHhiYiwweDA0LAorMHgwMCwweDEwLDB4MWUsMHg0MiwweDAwLDB4MTAsMHgyNiwweDgyLDB4MjcsMHg4MiwweDhmLDB4ZjgsMHgyZCwweDA1LDB4MDAsMHgwYywKKzB4MDAsMHhlMiwweDQ4LDB4MjEsMHgzMCwweDYzLDB4MDAsMHgwMSwweDMwLDB4ODYsMHgwMCwweDAxLDB4MTQsMHhhMCwweDAwLDB4MDYsCisweDAxLDB4MDAsMHgzOCwweDIxLDB4MDAsMHgwMywweDEwLDB4NDAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMSwweDAwLAorMHgwMSwweDAyLDB4MTAsMHgyMSwweDI0LDB4NDcsMHgwMCwweDA0LDB4MDIsMHg3MSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MjcsMHg4NCwweDkwLDB4MDAsMHgyNywweDgzLDB4OGYsMHhmOCwweDAwLDB4NDQsMHgyMCwweDIxLDB4MDAsMHg0MywweDEwLDB4MjEsCisweGExLDB4MjcsMHgwMCwweDA3LDB4YTAsMHg0MCwweDAwLDB4MDYsMHhhMCwweDgwLDB4MDAsMHgwMiwweDA4LDB4MDAsMHgxOSwweDlmLAorMHhhMCwweDgwLDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTYsMHg0MiwweDAwLDB4MDIsMHgwYywweDAwLDB4MDEsMHhjNCwKKzB4MDEsMHgwMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MWEsMHgzNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg5ZSwweDhmLDB4ZjQsCisweDA4LDB4MDAsMHgxOSwweDUyLDB4MDAsMHgxMSwweDNhLDB4MDAsMHg5NCwweDkxLDB4MDAsMHgwYSwweDA4LDB4MDAsMHgxOSwweDM5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTksMHhmZiwweGZmLDB4MDAsMHgwOSwweDE4LDB4YzAsMHgwMCwweDY5LDB4MTgsMHgyMSwKKzB4M2MsMHgwNiwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI0LDB4NDIsMHg2YSwweDU0LDB4MDAsMHgwMywweDE4LDB4ODAsCisweDM0LDB4YzYsMHgwMCwweDIwLDB4MjcsMHg4NSwweDkwLDB4MDAsMHhhYywweGMyLDB4MDAsMHgwMCwweDAwLDB4NjUsMHgxOCwweDIxLAorMHg4MCwweDYyLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MzIsMHgyNCwweDg4LDB4MDAsMHgwNiwKKzB4OTAsMHg4MiwweDAwLDB4MTYsMHgwMCwweDgwLDB4NDAsMHgyMSwweDM0LDB4NDIsMHgwMCwweDAyLDB4MzAsMHg0MywweDAwLDB4MDEsCisweDE0LDB4NjAsMHgwMCwweDAyLDB4YTAsMHg4MiwweDAwLDB4MTYsMHhhMCwweDgwLDB4MDAsMHgxNywweDk1LDB4MDMsMHgwMCwweDAyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjksMHgwMCwweDIyLDB4M2MsMHgwMiwweDM0LDB4MzQsMHg5MSwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNiwweDAwLDB4MDMsMHgyMCwweGMwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGExLDB4MDIsMHgwMCwweDA0LDB4YTUsMHgwOSwweDAwLDB4MDIsMHgwMywweGUwLDB4MDAsMHgwOCwweGE1LDB4MDksMHgwMCwweDAwLAorMHgwMCwweDgzLDB4MjAsMHgyMSwweDI3LDB4ODcsMHg4ZiwweGYwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDg3LDB4MjAsMHgyMSwKKzB4OTQsMHg4MywweDAwLDB4MDQsMHgzYywweDAyLDB4YjAsMHgwOCwweDNjLDB4MDYsMHhiMCwweDAzLDB4MDAsMHgwMywweDI4LDB4YzAsCisweDAwLDB4YTMsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweGEyLDB4MjgsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAxLAorMHgyNCwweDQyLDB4ODIsMHhlNCwweDAwLDB4NjcsMHgxOCwweDIxLDB4MzQsMHhjNiwweDAwLDB4MjAsMHhhYywweGMyLDB4MDAsMHgwMCwKKzB4YTQsMHg2OSwweDAwLDB4MDAsMHhhNCwweDg5LDB4MDAsMHgwMiwweGFjLDB4YTksMHgwMCwweDAwLDB4OTEsMHgwMiwweDAwLDB4MDQsCisweGE1LDB4MDksMHgwMCwweDAyLDB4MjQsMHg0MiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweGExLDB4MDIsMHgwMCwweDA0LAorMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweGIwLDB4MzQsMHg0MiwweDM0LDB4MzQsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHg5MCwweDgyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MDEsCisweDMwLDB4NDMsMHgwMCwweDAyLDB4MTQsMHg2MCwweGZmLDB4ZDEsMHhhMCwweDgyLDB4MDAsMHgxNiwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MWEsMHhhYiwweGEwLDB4ODIsMHgwMCwweDE3LDB4MjcsMHhiZCwweGZmLDB4ZTgsMHhhZiwweGJmLDB4MDAsMHgxMCwKKzB4MDAsMHg4MCwweDM4LDB4MjEsMHg4NCwweDg0LDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDNjLDB4MGEsMHhiMCwweDA2LDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NmIsMHg3OCwweDNjLDB4MGIsMHhiMCwweDA4LAorMHgyNywweDg5LDB4OGYsMHhmMCwweDM0LDB4MGMsMHhmZiwweGZmLDB4MzUsMHg0YSwweDgwLDB4MjAsMHgxMCwweDgwLDB4MDAsMHgzMCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHg5NywweDgyLDB4OGYsMHhlMCwweDk0LDB4ZTYsMHgwMiwweGJhLDB4MDAsMHgwMiwweDE4LDB4YzAsCisweDAwLDB4NmIsMHgyOCwweDIxLDB4YWMsMHhhNiwweDAwLDB4MDAsMHg4YywweGU0LDB4MDIsMHhiOCwweDAwLDB4NjIsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4MDQsMHgxMCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0OSwweDEwLDB4MjEsMHg5NCwweDQ4LDB4MDAsMHgwNCwweDAwLDB4NjksMHgxOCwweDIxLDB4YTQsMHg2NiwweDAwLDB4MDAsCisweDAwLDB4MDgsMHgyOCwweGMwLDB4MDAsMHhhYiwweDEwLDB4MjEsMHhhYywweDRjLDB4MDAsMHgwMCwweDhjLDB4ZTQsMHgwMiwweGI4LAorMHgyNywweDgyLDB4OGYsMHhmNCwweDAwLDB4YTgsMHgyOCwweDIxLDB4MDAsMHgwNCwweDE4LDB4YzAsMHgwMCwweDY0LDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDhjLDB4NDYsMHgwMCwweDE4LDB4MjcsMHg4NCwweDkwLDB4MDAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4OGMsMHhjMiwweDAwLDB4MDAsMHg4MCwweDY3LDB4MDAsMHgwNiwweDAwLDB4MDUsMHgyOCwweDgwLAorMHgzMCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NDcsMHgxMCwweDIxLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTgsMHgyYiwKKzB4MDAsMHgwMiwweDEyLDB4MDIsMHgwMCwweDQzLDB4MTAsMHgyMSwweDNjLDB4MDQsMHgwMCwweDA0LDB4MDAsMHhhOSwweDI4LDB4MjEsCisweDAwLDB4NDQsMHgxMCwweDI1LDB4YTQsMHhhYywweDAwLDB4MDAsMHhhZCwweDQyLDB4MDAsMHgwMCwweGE3LDB4ODgsMHg4ZiwweGUwLAorMHg4ZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwKKzB4ODQsMHhlMywweDAwLDB4MDYsMHgyNywweDgyLDB4YjMsMHhmMCwweDk0LDB4ZTUsMHgwMiwweGJhLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MDAsMHgwYywweDAwLDB4MWEsMHg5NSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MWIsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHg4OCwweDAwLDB4MDAsMHgwMCwweDgwLDB4NTgsMHgyMSwKKzB4MjcsMHg4YSwweDhmLDB4ZjAsMHgwMCwweDA4LDB4MTgsMHhjMCwweDAwLDB4NjgsMHgxOCwweDIxLDB4M2MsMHgwNCwweGIwLDB4MDMsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDZhLDB4MTgsMHgyMSwweDM0LDB4ODQsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4NmMsMHg5OCwweDMwLDB4YTUsMHhmZiwweGZmLDB4YWMsMHg4MiwweDAwLDB4MDAsMHg5NCwweDY3LDB4MDAsMHgwMiwKKzB4MTEsMHgwNSwweDAwLDB4MzUsMHgyNCwweDA0LDB4MDAsMHgwMSwweDkxLDB4NjYsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4ODYsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4MTAsMHgwMCwweGMwLDB4NDgsMHgyMSwweDNjLDB4MGQsMHhiMCwweDAzLAorMHgwMSwweDQwLDB4NjAsMHgyMSwweDM1LDB4YWQsMHgwMCwweDIwLDB4MTAsMHhlNSwweDAwLDB4MGQsMHgyNCwweDg0LDB4MDAsMHgwMSwKKzB4MDAsMHgwNywweDEwLDB4YzAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDEsMHgyMCwweDMwLDB4MjEsCisweDAwLDB4NGEsMHgxMCwweDIxLDB4MDAsMHg4NiwweDE4LDB4MmEsMHgwMCwweGUwLDB4NDAsMHgyMSwweDk0LDB4NDcsMHgwMCwweDAyLAorMHgxNCwweDYwLDB4ZmYsMHhmNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MTAsMHgyMSwKKzB4MDAsMHgwOCwweDIwLDB4YzAsMHgwMCwweDg4LDB4MjAsMHgyMSwweDI0LDB4YzIsMHhmZiwweGZmLDB4MDAsMHgwNCwweDIwLDB4ODAsCisweGExLDB4NjIsMHgwMCwweDA0LDB4MDAsMHg4YywweDIwLDB4MjEsMHg5NCwweDgzLDB4MDAsMHgwNCwweDAwLDB4MDcsMHgxMCwweGMwLAorMHgwMCwweDQ3LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0YywweDEwLDB4MjEsMHgwMCwweDAzLDB4MjgsMHhjMCwKKzB4OTQsMHg0NiwweDAwLDB4MDIsMHgwMCwweGEzLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2YywweDE4LDB4MjEsCisweGE0LDB4NjYsMHgwMCwweDAwLDB4YTQsMHg4NiwweDAwLDB4MDIsMHg5NSwweDY0LDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDA4LAorMHgzYywweDAyLDB4ODAsMHgwMSwweDAwLDB4YTMsMHgyOCwweDIxLDB4MjQsMHg0MiwweDgyLDB4ZTQsMHhhZCwweGEyLDB4MDAsMHgwMCwKKzB4MTAsMHg4NywweDAwLDB4MDMsMHhhYywweGE2LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDA4LDB4MDAsMHgxYiwweDY2LDB4YTUsMHg2OCwweDAwLDB4MDIsMHg5MSwweDYyLDB4MDAsMHgwNCwweGE1LDB4NjcsMHgwMCwweDAwLAorMHgyNCwweDQyLDB4ZmYsMHhmZiwweDMwLDB4NDMsMHgwMCwweGZmLDB4MTQsMHg2MCwweDAwLDB4MDMsMHhhMSwweDYyLDB4MDAsMHgwNCwKKzB4MjQsMHgwMiwweGZmLDB4ZmYsMHhhNSwweDYyLDB4MDAsMHgwMiwweDkxLDB4NjUsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NSwweDY2LDB4MDAsMHgwMCwweDM0LDB4MDIsMHhmZiwweGZmLAorMHgxNCwweGMyLDB4ZmYsMHhlZCwweDNjLDB4MDMsMHhiMCwweDAzLDB4OTUsMHg2NCwweDAwLDB4MDIsMHgzYywweDAyLDB4ZWUsMHhlZSwKKzB4MDAsMHhhMiwweDEwLDB4MjUsMHgzNCwweDYzLDB4MDAsMHhiYywweGFjLDB4NjIsMHgwMCwweDAwLDB4MTAsMHg4NiwweGZmLDB4ZTYsCisweGExLDB4NjAsMHgwMCwweDA0LDB4MjQsMHgwMiwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MWIsMHg2NiwweGE1LDB4NjIsMHgwMCwweDAyLAorMHgwMCwweDA1LDB4NDAsMHhjMCwweDAxLDB4MDUsMHgzMCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZDgsMHgwMCwweDA2LDB4MzAsMHg4MCwKKzB4MjcsMHg4MiwweDhmLDB4ZjQsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiZiwweDAwLDB4MjAsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMCwweDAwLDB4MTAsMHgwMCwweGMyLDB4MTAsMHgyMSwweDhjLDB4NDcsMHgwMCwweDE4LAorMHgwMCwweGEwLDB4OTAsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDMsMHgzNCwweGE1LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDZlLDB4MTAsMHhhYywweGEyLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHhjMywweDMwLDB4MjEsCisweDhjLDB4ZTIsMHgwMCwweDAwLDB4ODAsMHhjNSwweDAwLDB4MDYsMHgwMCwweDgwLDB4ODgsMHgyMSwweDMwLDB4NDIsMHhmZiwweGZmLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDMwLDB4NDMsMHgwMCwweGZmLDB4MTAsMHg2MCwweDAwLDB4MDIsMHgwMCwweDAyLDB4MTIsMHgwMiwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHgzMCwweDUzLDB4MDAsMHhmZiwweDAxLDB4MTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4MCwweDQ0LDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDgwLDB4MDAsMHg0YiwweDI2LDB4MjQsMHgwMCwweDA2LDB4MzIsMHg1MCwweGZmLDB4ZmYsMHgwMiwweDIwLDB4MjAsMHgyMSwKKzB4MGMsMHgwMCwweDFiLDB4MjYsMHgwMiwweDAwLDB4MjgsMHgyMSwweDkyLDB4MjIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDJlLDB4M2MsMHgwMywweGIwLDB4MDgsMHgzYywweDA5LDB4ODAsMHgwMSwweDI3LDB4ODgsMHg4ZiwweGYwLAorMHhhNiwweDMyLDB4MDAsMHgwYywweDAwLDB4MTAsMHgyMCwweGMwLDB4MDAsMHg5MCwweDIwLDB4MjEsMHgwMCwweDA0LDB4MjAsMHg4MCwKKzB4MDAsMHg4OCwweDIwLDB4MjEsMHg5NCwweDgyLDB4MDAsMHgwNCwweDNjLDB4MDMsMHhiMCwweDA4LDB4M2MsMHgwNywweGIwLDB4MDMsCisweDAwLDB4MDIsMHgyOCwweGMwLDB4MDAsMHhhMiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDgsMHgxMCwweDIxLAorMHgwMCwweGEzLDB4MjgsMHgyMSwweDI1LDB4MjYsMHg4MiwweGU0LDB4MzQsMHgwMywweGZmLDB4ZmYsMHgzNCwweGU3LDB4MDAsMHgyMCwKKzB4YWMsMHhlNiwweDAwLDB4MDAsMHhhNCwweDgzLDB4MDAsMHgwMiwweGE0LDB4NDMsMHgwMCwweDAwLDB4YWMsMHhhMywweDAwLDB4MDAsCisweDkyLDB4MjIsMHgwMCwweDEwLDB4OTIsMHgyMywweDAwLDB4MGEsMHhhNiwweDMyLDB4MDAsMHgwZSwweDAyLDB4NjIsMHgxMCwweDIxLAorMHgxNCwweDYwLDB4MDAsMHgwNSwweGEyLDB4MjIsMHgwMCwweDEwLDB4OTIsMHgyMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmUsMHhhMiwweDIyLDB4MDAsMHgxNiwweDkyLDB4MjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDIyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZCwweGEyLDB4MjIsMHgwMCwweDE2LDB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIyLDB4MDAsMHhmYywKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LDB4OTYsMHgyMiwweDAwLDB4MGUsCisweDI3LDB4ODgsMHg4ZiwweGYwLDB4MDAsMHgwMiwweDIwLDB4YzAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLAorMHgwMCwweDg4LDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDA0LDB4M2MsMHgwNiwweGIwLDB4MDMsMHgzYywweDA5LDB4ODAsMHgwMSwKKzB4MDAsMHgwMiwweDI4LDB4YzAsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHhhMywweDI4LDB4MjEsCisweDAwLDB4NDgsMHgxMCwweDIxLDB4MzQsMHhjNiwweDAwLDB4MjAsMHgyNSwweDIzLDB4ODIsMHhlNCwweGFjLDB4YzMsMHgwMCwweDAwLAorMHhhNCwweDUwLDB4MDAsMHgwMCwweGFjLDB4YjAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFiLDB4YjUsMHhhNCwweDkwLDB4MDAsMHgwMiwKKzB4MDgsMHgwMCwweDFiLDB4YWMsMHgzMiwweDUwLDB4ZmYsMHhmZiwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI0LDB4NDIsMHg2ZiwweGQ4LDB4MzQsMHg2MywweDAwLDB4MjAsMHhhYywweDYyLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMCwweDA0LAorMHg5NywweGFhLDB4MDAsMHgxMiwweDAwLDB4ODAsMHg2MCwweDIxLDB4MzAsMHhhOCwweGZmLDB4ZmYsMHgwMCwweDRhLDB4MjAsMHgyMywKKzB4MzQsMHgwOSwweGZmLDB4ZmYsMHgzMCwweGNmLDB4ZmYsMHhmZiwweDMwLDB4ZWUsMHhmZiwweGZmLDB4MTEsMHgwOSwweDAwLDB4NzMsCisweGExLDB4ODQsMHgwMCwweDA0LDB4MDAsMHgwZSwweGMwLDB4YzAsMHgwMCwweDA4LDB4MTAsMHhjMCwweDAwLDB4NDgsMHgxMCwweDIxLAorMHgwMywweDBlLDB4MjAsMHgyMSwweDI3LDB4OGQsMHg4ZiwweGYwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MDAsMHg0ZCwweDEwLDB4MjEsMHgwMCwweDhkLDB4MjAsMHgyMSwweDk0LDB4ODYsMHgwMCwweDAyLDB4OTQsMHg0MywweDAwLDB4MDQsCisweDNjLDB4MTksMHg4MCwweDAxLDB4YTQsMHg0NiwweDAwLDB4MDIsMHgwMCwweDAzLDB4MjgsMHhjMCwweDAwLDB4YTMsMHgxOCwweDIxLAorMHg5NCwweDg3LDB4MDAsMHgwMiwweDNjLDB4MDIsMHhiMCwweDA4LDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweGEyLDB4MjgsMHgyMSwKKzB4MDAsMHg2ZCwweDE4LDB4MjEsMHgyNywweDIyLDB4ODIsMHhlNCwweDNjLDB4MDEsMHhiMCwweDAzLDB4YWMsMHgyMiwweDAwLDB4MjAsCisweGE0LDB4NjYsMHgwMCwweDAwLDB4MTAsMHhlOSwweDAwLDB4NTcsMHhhYywweGE2LDB4MDAsMHgwMCwweDAxLDB4ZTAsMHgzMCwweDIxLAorMHgxMSwweDQwLDB4MDAsMHgxZCwweDAwLDB4MDAsMHg0OCwweDIxLDB4MDEsMHg0MCwweDM4LDB4MjEsMHgyNywweDhiLDB4OGYsMHhmNCwKKzB4MjcsMHg4YSwweDkwLDB4MDAsMHgwMCwweDA2LDB4NDAsMHhjMCwweDAxLDB4MDYsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NmIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsMHgwMCwweDZhLDB4MTgsMHgyMSwweDgwLDB4NjUsMHgwMCwweDA2LAorMHg4YywweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDQ1LDB4MTAsMHgyMSwKKzB4MzAsMHg0NCwweDAwLDB4ZmYsMHgwMCwweDAyLDB4MTIsMHgwMiwweDAxLDB4MjIsMHgxOCwweDIxLDB4MjQsMHg2MiwweDAwLDB4MDEsCisweDE0LDB4ODAsMHgwMCwweDAyLDB4MzAsMHg0OSwweDAwLDB4ZmYsMHgzMCwweDY5LDB4MDAsMHhmZiwweDAxLDB4MDYsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NGQsMHgxMCwweDIxLDB4MjQsMHhlNywweGZmLDB4ZmYsMHg5NCwweDQ2LDB4MDAsMHgwMiwKKzB4MTQsMHhlMCwweGZmLDB4ZTksMHgwMCwweDA2LDB4NDAsMHhjMCwweDkxLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDIwLDB4M2MsMHgwNiwweGIwLDB4MDMsMHhhNSwweDhmLDB4MDAsMHgwYywweDAzLDB4MGUsMHgyMCwweDIxLAorMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4OGQsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDQsMHgzYywweDAzLDB4YjAsMHgwOCwKKzB4M2MsMHgwNywweGIwLDB4MDMsMHgwMCwweDAyLDB4MjgsMHhjMCwweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NGQsMHgxMCwweDIxLDB4MDAsMHhhMywweDI4LDB4MjEsMHgyNywweDI2LDB4ODIsMHhlNCwweDM0LDB4MDMsMHhmZiwweGZmLAorMHgzNCwweGU3LDB4MDAsMHgyMCwweGFjLDB4ZTYsMHgwMCwweDAwLDB4YTQsMHg4MywweDAwLDB4MDIsMHhhNCwweDQzLDB4MDAsMHgwMCwKKzB4YWMsMHhhMywweDAwLDB4MDAsMHg5MSwweDgyLDB4MDAsMHgxMCwweDkxLDB4ODMsMHgwMCwweDA0LDB4YTUsMHg4ZSwweDAwLDB4MGUsCisweDAxLDB4MjIsMHgxMCwweDIxLDB4MTQsMHg2MCwweDAwLDB4MDUsMHhhMSwweDgyLDB4MDAsMHgxMCwweDkxLDB4ODIsMHgwMCwweDE2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZkLDB4YTEsMHg4MiwweDAwLDB4MTYsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NSwweDgyLDB4MDAsMHgwZSwweDNjLDB4MDMsMHhiMCwweDA4LDB4MDAsMHgwMiwweDIwLDB4YzAsCisweDAwLDB4ODIsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDhkLDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDA0LAorMHgzNCwweGM2LDB4MDAsMHgyMCwweDI3LDB4MjcsMHg4MiwweGU0LDB4MDAsMHgwMiwweDI4LDB4YzAsMHgwMCwweGEyLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweGEzLDB4MjgsMHgyMSwweDAwLDB4NGQsMHgxMCwweDIxLDB4YWMsMHhjNywweDAwLDB4MDAsCisweGE0LDB4OGYsMHgwMCwweDAyLDB4YTQsMHg0ZiwweDAwLDB4MDAsMHhhYywweGFmLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxYywweDQ0LAorMHgwMywweDBlLDB4MjAsMHgyMSwweDA4LDB4MDAsMHgxYywweDFmLDB4YTUsMHg4OCwweDAwLDB4MDIsMHgwMCwweDBlLDB4YzAsMHhjMCwKKzB4MDMsMHgwZSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4OGQsMHg4ZiwweGYwLDB4MDAsMHg0ZCwweDEwLDB4MjEsCisweDk0LDB4NDMsMHgwMCwweDAyLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHgxNCwweDgwLDB4MDAsMHgwNSwweGE1LDB4ODMsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4ZmYsMHhmZiwweDNjLDB4MTksMHg4MCwweDAxLDB4MDgsMHgwMCwweDFjLDB4MWYsMHhhNSwweDgyLDB4MDAsMHgwMiwKKzB4MDgsMHgwMCwweDFjLDB4MWYsMHgzYywweDE5LDB4ODAsMHgwMSwweDNjLDB4MDgsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweDc4LDB4MzUsMHgwOCwweDAwLDB4MjAsMHgyNCwweDQyLDB4NzIsMHgxOCwweGFmLDB4YjIsMHgwMCwweDY4LAorMHhhZiwweGIxLDB4MDAsMHg2NCwweGFmLDB4YjAsMHgwMCwweDYwLDB4YWQsMHgwMiwweDAwLDB4MDAsMHhhZiwweGJmLDB4MDAsMHg4NCwKKzB4YWYsMHhiZSwweDAwLDB4ODAsMHhhZiwweGI3LDB4MDAsMHg3YywweGFmLDB4YjYsMHgwMCwweDc4LDB4YWYsMHhiNSwweDAwLDB4NzQsCisweGFmLDB4YjQsMHgwMCwweDcwLDB4YWYsMHhiMywweDAwLDB4NmMsMHhhZiwweGE0LDB4MDAsMHg4OCwweDkwLDB4ODMsMHgwMCwweDBhLAorMHgyNywweDgyLDB4YjMsMHhmMCwweGFmLDB4YTYsMHgwMCwweDkwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4OGMsMHg2MywweDAwLDB4MDAsMHhhZiwweGE3LDB4MDAsMHg5NCwweDI3LDB4ODYsMHg4ZiwweGY0LDB4YWYsMHhhMywweDAwLDB4MWMsCisweDk0LDB4NjMsMHgwMCwweDE0LDB4MzAsMHhiMSwweGZmLDB4ZmYsMHgyNCwweDA4LDB4MDAsMHgwMSwweDAwLDB4MDMsMHgyMCwweGMwLAorMHhhZiwweGEzLDB4MDAsMHgxOCwweDAwLDB4ODMsMHgxOCwweDIxLDB4YWYsMHhhNCwweDAwLDB4NTQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMCwweDY0LDB4MjAsMHgyMSwweDgwLDB4ODIsMHgwMCwweDA2LDB4MDAsMHg2NiwweDE4LDB4MjEsCisweDhjLDB4NjYsMHgwMCwweDE4LDB4MjQsMHg0MiwweDAwLDB4MDIsMHgwMCwweDAyLDB4MWYsMHhjMiwweDhjLDB4YzQsMHgwMCwweDA4LAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLDB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweDA0LDB4MmYsMHhjMiwKKzB4MDAsMHgwNCwweDFjLDB4ODIsMHgwMCwweGMyLDB4MzgsMHgyMSwweDAwLDB4MDQsMHgyNCwweDQyLDB4OGYsMHhhMiwweDAwLDB4MWMsCisweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg4NCwweDAwLDB4MDEsMHhhZiwweGE1LDB4MDAsMHgzYywweGFmLDB4YTMsMHgwMCwweDM0LAorMHhhZiwweGE0LDB4MDAsMHgzOCwweGFmLDB4YTAsMHgwMCwweDQwLDB4YWYsMHhhMCwweDAwLDB4NDQsMHhhZiwweGEwLDB4MDAsMHg1MCwKKzB4YWYsMHhhOCwweDAwLDB4MjAsMHg4MCwweDQyLDB4MDAsMHgxMiwweDhmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhhMiwweDAwLDB4MjgsCisweDhjLDB4ZDAsMHgwMCwweDBjLDB4MTQsMHhhMCwweDAxLDB4ZTQsMHgwMCwweDYwLDB4MzAsMHgyMSwweDAwLDB4MTAsMHgxMCwweDgyLAorMHgzMCwweDQ1LDB4MDAsMHgwNywweDEwLDB4YTAsMHgwMCwweDExLDB4YWYsMHhhMCwweDAwLDB4MzAsMHg4ZiwweGE0LDB4MDAsMHg5OCwKKzB4MjcsMHg4MiwweDgwLDB4MWMsMHgwMCwweDA0LDB4MTgsMHg0MCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MjQsMHhhMiwweDAwLDB4MDYsCisweDhmLDB4YTUsMHgwMCwweDIwLDB4OTQsMHg2NCwweDAwLDB4MDAsMHgwMCwweDQ1LDB4MTAsMHgwNCwweDAwLDB4NDQsMHgwMCwweDFhLAorMHgxNCwweDgwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MGQsMHgwMCwweDAwLDB4MTAsMHgxMiwKKzB4MjQsMHg0MiwweDAwLDB4MjAsMHgzMCwweDQyLDB4ZmYsMHhmYywweGFmLDB4YTIsMHgwMCwweDMwLDB4OGYsMHhhMywweDAwLDB4MTgsCisweDhmLDB4YTQsMHgwMCwweDI4LDB4MzQsMHgwMiwweGZmLDB4ZmYsMHhhZiwweGEwLDB4MDAsMHgyYywweGFmLDB4YTIsMHgwMCwweDQ4LAorMHhhZiwweGEzLDB4MDAsMHg0YywweDAwLDB4NjAsMHhmMCwweDIxLDB4MDAsMHgwMCwweGI4LDB4MjEsMHgxOCwweDgwLDB4MDAsMHg0OCwKKzB4YWYsMHhhMCwweDAwLDB4MjQsMHgwMCwweDExLDB4ODksMHgwMiwweGFmLDB4YjEsMHgwMCwweDU4LDB4MDAsMHg4MCwweGE4LDB4MjEsCisweDAwLDB4MTIsMHgxMCwweGMwLDB4MDAsMHg1MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4ODAsMHg4MCwweDI3LDB4ODUsMHg4ZiwweGYwLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDAwLDB4NDAsMHhhMCwweDIxLDB4MDIsMHgwNSwweDEwLDB4MjEsMHg5NCwweDU2LDB4MDAsMHgwMiwKKzB4MGMsMHgwMCwweDEyLDB4ODcsMHgwMCwweDAwLDB4MjgsMHgyMSwweDkwLDB4NDIsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDgsCisweDMwLDB4NDIsMHgwMCwweDBjLDB4MTAsMHg0MywweDAxLDB4OWUsMHgyNCwweDA0LDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxMCwweDgyLDB4MDEsMHg3YywweDNjLDB4MDIsMHhiMCwweDAzLDB4OGYsMHhhNiwweDAwLDB4ODgsMHgzNCwweDQyLDB4MDEsMHgwNCwKKzB4ODQsMHhjNSwweDAwLDB4MGMsMHgwMiwweDkyLDB4MTgsMHgyMSwweDk0LDB4NDYsMHgwMCwweDAwLDB4MDAsMHgwNSwweDIwLDB4YzAsCisweDAwLDB4ODUsMHgyMCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgyNywweDgyLDB4OTAsMHgwMCwweDI3LDB4ODUsMHg4ZiwweGY4LAorMHgwMCwweDY1LDB4MjgsMHgyMSwweDAwLDB4NjIsMHgxOCwweDIxLDB4ODAsMHg3MSwweDAwLDB4MDUsMHg4MCwweDczLDB4MDAsMHgwNCwKKzB4OGYsMHhhMywweDAwLDB4ODgsMHgzMCwweGQwLDB4ZmYsMHhmZiwweDAwLDB4MTAsMHgzYSwweDAzLDB4MzIsMHgwOCwweDAwLDB4ZmYsCisweDI3LDB4ODIsMHg5MCwweDEwLDB4MDAsMHgwNCwweDIwLDB4ODAsMHg4MCwweGE2LDB4MDAsMHgwNiwweDAwLDB4ODIsMHgyMCwweDIxLAorMHhhNCwweDY3LDB4MDAsMHg0NCwweGE0LDB4NjgsMHgwMCwweDQ2LDB4OGMsMHg4NCwweDAwLDB4MDAsMHgzOCwweGM2LDB4MDAsMHgwMCwKKzB4MDEsMHgwMCwweDgwLDB4MjEsMHgwMCwweDA0LDB4MTUsMHgwMiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4MDMsCisweDAwLDB4ZTYsMHg4MCwweDBhLDB4MDAsMHgwNCwweDE0LDB4MDIsMHgzMCwweDUwLDB4MDAsMHgwZiwweDEyLDB4MjAsMHgwMSwweDUwLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDAyLDB4NzEsMHgxMCwweDIxLDB4MDAsMHg1MCwweDEwLDB4MmEsMHgxNCwweDQwLDB4MDAsMHhlZCwKKzB4MDIsMHg5MiwweDEwLDB4MjEsMHg5MywweDgyLDB4OGIsMHg2MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsCisweDE0LDB4NDAsMHgwMCwweGUwLDB4MDIsMHg5MiwweDI4LDB4MjEsMHgyNiwweGUyLDB4MDAsMHgwMSwweDMwLDB4NTcsMHhmZiwweGZmLAorMHgwMiwweDQwLDB4ZjAsMHgyMSwweDI2LDB4YjUsMHhmZiwweGZmLDB4MTYsMHhhMCwweGZmLDB4YmQsMHgwMiwweGMwLDB4OTAsMHgyMSwKKzB4MTYsMHhlMCwweDAwLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTMsMHgwMCwweDk4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJjLDB4NjIsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4MmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDI0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4ODAsMHgwMCwweDJhLDB4MjQsMHgwMywweDAwLDB4MDEsMHg4ZiwweGE1LDB4MDAsMHgxYywKKzB4MjcsMHg4NCwweDhmLDB4ZjQsMHg5NCwweGIyLDB4MDAsMHgxNCwweGEwLDB4YTMsMHgwMCwweDEyLDB4OGYsMHhhNiwweDAwLDB4M2MsCisweDAwLDB4MTIsMHgxMCwweGMwLDB4MDAsMHg1MiwweDEwLDB4MjEsMHgwMCwweDAyLDB4ODAsMHg4MCwweDI3LDB4ODIsMHg5MCwweDAwLAorMHgwMiwweDAyLDB4MTAsMHgyMSwweDgwLDB4NDMsMHgwMCwweDA2LDB4MDIsMHgwNCwweDIwLDB4MjEsMHg4YywweDg1LDB4MDAsMHgxOCwKKzB4MjQsMHg2MywweDAwLDB4MDIsMHgwMCwweDAzLDB4MTcsMHhjMiwweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4NDMsCisweDAwLDB4MDMsMHgxOCwweDQwLDB4MTQsMHhjMCwweDAwLDB4MGUsMHgwMCwweGEzLDB4MzgsMHgyMSwweDI3LDB4ODIsMHg4ZiwweGYwLAorMHgwMiwweDAyLDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDA2LDB4OGYsMHhhOCwweDAwLDB4MWMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4YTUsMHgwMywweDAwLDB4MWEsMHg3YiwweGJlLDB4MDQsMHgzYywweDdiLDB4YjYsMHgwMywweGZjLDB4N2IsMHhiNCwweDAzLDB4YmMsCisweDdiLDB4YjIsMHgwMywweDdjLDB4N2IsMHhiMCwweDAzLDB4M2MsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDg4LAorMHg4ZiwweGE0LDB4MDAsMHg5OCwweDhmLDB4YTUsMHgwMCwweDM4LDB4OGYsMHhhNiwweDAwLDB4MzQsMHhhZiwweGEwLDB4MDAsMHgxMCwKKzB4MGMsMHgwMCwweDA5LDB4MDYsMHhhZiwweGEwLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgxZCwweDRiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YTMsMHgwMCwweDQ0LDB4OTMsMHg4MiwweDgxLDB4NTksMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDYxLAorMHgzMCwweDY5LDB4MDAsMHgwMywweDhmLDB4YTQsMHgwMCwweDI0LDB4OGYsMHhhNSwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg4NSwweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHg4ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhNiwweDAwLDB4MWMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHhjNCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODMsMHgwMCwweGZmLAorMHgwMCwweGEzLDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDg3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGE4LDB4MDAsMHgyNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDAwLDB4MDAsMHg4MywweDAwLDB4NjUsMHgxMCwweDIzLDB4MDAsMHhhOCwweDE4LDB4MjMsCisweDAwLDB4NjIsMHgxMCwweDJhLDB4MTQsMHg0MCwweDAwLDB4N2QsMHgzMCwweDYzLDB4MDAsMHhmZiwweDAwLDB4ODUsMHgxMCwweDIzLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweGFmLDB4YTIsMHgwMCwweDUwLDB4OGYsMHhhMiwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4NzMsMHgwMCwweDAwLDB4YTgsMHgyMSwweDI3LDB4OGMsMHg4ZiwweGYwLDB4M2MsMHgwYiwweDgwLDB4ZmYsCisweDI0LDB4MTAsMHgwMCwweDA0LDB4MjcsMHg5MSwweDhmLDB4ZjQsMHgzNSwweDZiLDB4ZmYsMHhmZiwweDNjLDB4MGQsMHg3ZiwweDAwLAorMHgyNywweDhlLDB4OTAsMHgwMCwweDAxLDB4ODAsMHg3OCwweDIxLDB4MDAsMHgxMiwweDMwLDB4YzAsMHgwMCwweGQyLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDRjLDB4MTAsMHgyMSwweDk0LDB4NDIsMHgwMCwweDA2LDB4OGYsMHhhMywweDAwLDB4MmMsCisweDhmLDB4YTQsMHgwMCwweDMwLDB4YWYsMHhhMiwweDAwLDB4NDQsMHg4ZiwweGE1LDB4MDAsMHg0NCwweDMwLDB4NDksMHgwMCwweDAzLAorMHgwMiwweDA5LDB4MTAsMHgyMywweDMwLDB4NDIsMHgwMCwweDAzLDB4MDAsMHhhMiwweDEwLDB4MjEsMHg4ZiwweGE4LDB4MDAsMHgzMCwKKzB4MjQsMHg0MiwweDAwLDB4MDQsMHgzMCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NjQsMHgzOCwweDIxLDB4MDEsMHgwMiwweDI4LDB4MjMsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHg0OCwweDEwLDB4MmIsMHgxMCwweDQwLDB4MDAsMHg1MiwweDAwLDB4MDAsMHgyMCwweDIxLAorMHgzMCwweGU3LDB4ZmYsMHhmZiwweDMwLDB4YTQsMHhmZiwweGZmLDB4YWYsMHhhNywweDAwLDB4MmMsMHgwMCwweGQyLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDUxLDB4MTgsMHgyMSwweDhjLDB4NjUsMHgwMCwweDE4LDB4MDAsMHgwNCwweDI1LDB4NDAsCisweDAwLDB4OGQsMHgyMCwweDI0LDB4OGMsMHhhOCwweDAwLDB4MDQsMHgwMCwweDRlLDB4MTgsMHgyMSwweDAwLDB4NGYsMHg1MCwweDIxLAorMHgwMSwweDBiLDB4NDAsMHgyNCwweDAxLDB4MDQsMHg0MCwweDI1LDB4YWMsMHhhOCwweDAwLDB4MDQsMHg4ZiwweGE0LDB4MDAsMHg5OCwKKzB4OGYsMHhhMiwweDAwLDB4NTAsMHgyNiwweGI1LDB4MDAsMHgwMSwweGEwLDB4NjQsMHgwMCwweDAwLDB4OGMsMHhhNCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHg4MSwweDAwLDB4MGMsMHgwMiwweGEyLDB4MzAsMHgyYSwweDgwLDB4NjIsMHgwMCwweDA2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAyLDB4MDAsMHgwMiwweDFmLDB4YzIsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4NDMsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAwLDB4YTIsMHgzOCwweDIxLDB4OGYsMHhhNSwweDAwLDB4NDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTQsMHhlNSwweDAwLDB4MDAsMHg5NSwweDUyLDB4MDAsMHgwMiwweDE0LDB4YzAsMHhmZiwweGM3LAorMHgwMCwweDEyLDB4MzAsMHhjMCwweDhmLDB4YTQsMHgwMCwweDI0LDB4OGYsMHhhNSwweDAwLDB4NTAsMHg4ZiwweGE2LDB4MDAsMHgxYywKKzB4OGYsMHhhMywweDAwLDB4MmMsMHgwMCwweDg1LDB4ODAsMHgyMSwweGEwLDB4ZDAsMHgwMCwweDEyLDB4MDAsMHgwOSwweDEwLDB4MjMsCisweDMwLDB4NDIsMHgwMCwweDAzLDB4OGYsMHhhOCwweDAwLDB4ODgsMHgwMCwweDYyLDB4MTAsMHgyMywweGE0LDB4YzIsMHgwMCwweDFhLAorMHg4NSwweDAzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OGYsMHhmNCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDEwLAorMHgxNCwweDYwLDB4ZmYsMHg3NCwweDAyLDB4MDAsMHgxMCwweDIxLDB4OGYsMHhhMywweDAwLDB4NTQsMHg4ZiwweGE0LDB4MDAsMHgxOCwKKzB4OGYsMHhhNSwweDAwLDB4MjQsMHgwMCwweDY0LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDgsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgzMCwweDIxLAorMHgwOCwweDAwLDB4MWQsMHg1MSwweDAyLDB4MDAsMHgxMCwweDIxLDB4OTMsMHg4MiwweDgwLDB4MTAsMHgwMCwweDAwLDB4MjgsMHgyMSwKKzB4MDAsMHgwMCwweDM4LDB4MjEsMHgwYywweDAwLDB4MjEsMHhmNSwweGFmLDB4YTIsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFkLDB4NTEsCisweDAyLDB4MDAsMHgxMCwweDIxLDB4MzAsMHg2MywweGZmLDB4ZmYsMHgwOCwweDAwLDB4MWQsMHhhMywweGFmLDB4YTMsMHgwMCwweDJjLAorMHg4ZiwweGE4LDB4MDAsMHg0NCwweDA4LDB4MDAsMHgxZCwweGM1LDB4MzEsMHgwOSwweDAwLDB4MDMsMHgwOCwweDAwLDB4MWQsMHg3ZSwKKzB4YWYsMHhhMywweDAwLDB4NTAsMHg4ZiwweGE2LDB4MDAsMHg0NCwweGFmLDB4YTAsMHgwMCwweDUwLDB4MDgsMHgwMCwweDFkLDB4YzUsCisweDMwLDB4YzksMHgwMCwweDAzLDB4OGYsMHhhNSwweDAwLDB4NDgsMHg4ZiwweGE2LDB4MDAsMHg0YywweDhmLDB4YTQsMHgwMCwweDFjLAorMHgwMywweGMwLDB4MzgsMHgyMSwweDBjLDB4MDAsMHgxYiwweGY2LDB4YWYsMHhiNywweDAwLDB4MTAsMHgwOCwweDAwLDB4MWQsMHgyZSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA1LDB4MjgsMHg4MCwweDI3LDB4ODIsMHg4ZiwweGYwLDB4MDAsMHhhMiwweDI4LDB4MjEsCisweDAwLDB4MDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDAxLDB4NGIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxZCwweDI3LAorMHgyNiwweGUyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHg4MCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDAsMHg4ZiwweGE0LDB4MDAsMHgxYywKKzB4MDIsMHgwMywweDE4LDB4MjEsMHgyNiwweDMxLDB4MDAsMHgwMSwweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDFmLDB4MDgsCisweGEwLDB4NzEsMHgwMCwweDA1LDB4MTQsMHg0MCwweGZmLDB4MTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE2LDB4ZTAsMHgwMCwweDRkLAorMHgwMywweGMwLDB4MzgsMHgyMSwweDhmLDB4YTQsMHgwMCwweDI0LDB4OGYsMHhhNSwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MjQsMHg4NCwweDAwLDB4MDEsMHhhZiwweGIyLDB4MDAsMHg0OCwweGFmLDB4YjYsMHgwMCwweDRjLDB4MDIsMHhjMCwweGYwLDB4MjEsCisweDEwLDB4YTIsMHgwMCwweDQxLDB4YWYsMHhhNCwweDAwLDB4MjQsMHgyNywweDgyLDB4OGYsMHhmMCwweDAyLDB4MDIsMHgxMCwweDIxLAorMHg5NCwweDQyLDB4MDAsMHgwNiwweDhmLDB4YTQsMHgwMCwweDMwLDB4YWYsMHhhMCwweDAwLDB4MjAsMHhhZiwweGEyLDB4MDAsMHg0NCwKKzB4MzAsMHg0OSwweDAwLDB4MDMsMHg4ZiwweGE4LDB4MDAsMHg0NCwweDAwLDB4MDksMHgxMCwweDIzLDB4MzAsMHg0MiwweDAwLDB4MDMsCisweDAxLDB4MDIsMHgxMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgzMCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NDQsMHgxOCwweDJiLAorMHgxMCwweDYwLDB4MDAsMHgyYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhNSwweDAwLDB4MmMsMHgwMCwweDgyLDB4MTAsMHgyMywKKzB4MDAsMHhhNCwweDE4LDB4MjEsMHgzMCwweDYzLDB4ZmYsMHhmZiwweDMwLDB4NDQsMHhmZiwweGZmLDB4YWYsMHhhMywweDAwLDB4MmMsCisweDAyLDB4OTIsMHgyOCwweDIxLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgyNywweDgyLDB4OGYsMHhmNCwweDAwLDB4YTIsMHgxMCwweDIxLAorMHg4YywweDQ2LDB4MDAsMHgxOCwweDNjLDB4MDMsMHg4MCwweGZmLDB4M2MsMHgwMiwweDdmLDB4MDAsMHg4YywweGM4LDB4MDAsMHgwNCwKKzB4MDAsMHgwNCwweDI1LDB4NDAsMHgzNCwweDYzLDB4ZmYsMHhmZiwweDAwLDB4ODIsMHgyMCwweDI0LDB4MDEsMHgwMywweDQwLDB4MjQsCisweDAxLDB4MDQsMHg0MCwweDI1LDB4YWMsMHhjOCwweDAwLDB4MDQsMHg4ZiwweGE4LDB4MDAsMHg5OCwweDI3LDB4ODIsMHg5MCwweDAwLAorMHgwMCwweGEyLDB4MTAsMHgyMSwweGEwLDB4NDgsMHgwMCwweDAwLDB4OGMsMHhjNCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwNCwweDI3LDB4YzIsMHgxMCwweDgwLDB4ZmUsMHhkYiwweGFmLDB4YTQsMHgwMCwweDNjLDB4ODAsMHg0MiwweDAwLDB4MDYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgwMCwweDAyLDB4MWYsMHhjMiwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg0MywweDAwLDB4MDIsMHgxMCwweDQwLDB4MDAsMHhjMiwweDM4LDB4MjEsMHg4ZiwweGEyLDB4MDAsMHg0MCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNCwweGUyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxZCwweDJhLDB4MjYsMHhiNSwweGZmLDB4ZmYsCisweDhmLDB4YTYsMHgwMCwweDJjLDB4MDAsMHgwMCwweDIwLDB4MjEsMHgwMCwweGMyLDB4MTAsMHgyMSwweDMwLDB4NDIsMHhmZiwweGZmLAorMHgwOCwweDAwLDB4MWUsMHgzOCwweGFmLDB4YTIsMHgwMCwweDJjLDB4OGYsMHhhNiwweDAwLDB4MWMsMHgwOCwweDAwLDB4MWUsMHgyMiwKKzB4YTQsMHhkMiwweDAwLDB4MTQsMHg4ZiwweGE1LDB4MDAsMHg0OCwweDhmLDB4YTYsMHgwMCwweDRjLDB4OGYsMHhhNCwweDAwLDB4MWMsCisweDBjLDB4MDAsMHgxYiwweGY2LDB4YWYsMHhiNywweDAwLDB4MTAsMHgwOCwweDAwLDB4MWUsMHgxOSwweDAwLDB4MDAsMHhiOCwweDIxLAorMHgwYywweDAwLDB4MTIsMHg4NywweDAwLDB4MDAsMHgyOCwweDIxLDB4MDAsMHg0MCwweDE4LDB4MjEsMHg5NCwweDQyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDgsMHgwMCwweGE0LDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFkLDB4MWUsCisweDAyLDB4NzEsMHgxMCwweDIxLDB4MDIsMHg5MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4ODAsMHg4MCwweDI3LDB4ODIsMHg4ZiwweGY0LAorMHgwMiwweDAyLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDgzLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgxMCwweDEwLDB4NjAsMHgwMCwweDA5LDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDkzLDB4ODIsMHg4YiwweDYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHhmZSwweGEyLAorMHgzYywweDA0LDB4MDAsMHg4MCwweDI3LDB4ODUsMHg4ZiwweGYwLDB4MDgsMHgwMCwweDFlLDB4MDksMHgwMiwweDA1LDB4MjgsMHgyMSwKKzB4MjcsMHg4MywweDkwLDB4MDgsMHgyNywweDgyLDB4OTAsMHgwMCwweDAyLDB4MDMsMHgxOCwweDIxLDB4MDIsMHgwMiwweDEwLDB4MjEsCisweDkwLDB4NjQsMHgwMCwweDAwLDB4OTAsMHg0NSwweDAwLDB4MDUsMHg5MywweDgzLDB4ODAsMHgxMCwweDAwLDB4MDAsMHgzOCwweDIxLAorMHgwYywweDAwLDB4MjEsMHhmNSwweGFmLDB4YTMsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFlLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMiwweDAyLDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDAyLDB4OGYsMHhhNiwweDAwLDB4NTgsCisweDAwLDB4MDMsMHgxOSwweDAyLDB4MDAsMHg2NiwweDE4LDB4MjMsMHgzMCwweDYzLDB4MGYsMHhmZiwweDI4LDB4NjIsMHgwMCwweDIwLAorMHgxMCwweDQwLDB4MDAsMHgwNiwweDI4LDB4NjIsMHgwMCwweDQwLDB4OGYsMHhhOCwweDAwLDB4OTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg2OCwweDEwLDB4MDYsMHgwOCwweDAwLDB4MWMsMHhmNywweDMwLDB4NDQsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhNCwweDAwLDB4OTQsMHgwOCwweDAwLDB4MWUsMHhhMSwweDAwLDB4NjQsMHgxMCwweDA2LAorMHgwOCwweDAwLDB4MWMsMHhmNywweDAwLDB4MDAsMHgyMCwweDIxLDB4OGYsMHhhNCwweDAwLDB4OTgsMHg4ZiwweGE1LDB4MDAsMHgzOCwKKzB4YWYsMHhhMCwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHgwNiwweGFmLDB4YTgsMHgwMCwweDE0LDB4MzAsMHg0MiwweGZmLDB4ZmYsCisweDA4LDB4MDAsMHgxYywweGM3LDB4YWYsMHhhMiwweDAwLDB4NDAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAwLAorMHgyNywweGJkLDB4ZmYsMHhlMCwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweDdhLDB4YzgsMHhhZiwweGIxLDB4MDAsMHgxNCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxOCwweGFjLDB4NDMsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MGEsCisweDAwLDB4ODAsMHg4MCwweDIxLDB4MTQsMHg0MCwweDAwLDB4NDUsMHgwMCwweDAwLDB4ODgsMHgyMSwweDkyLDB4MDIsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDIwLDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDAyLDB4MDAsMHgxNiwweDkyLDB4MDUsMHgwMCwweDBhLDB4MzAsMHg0MiwweDAwLDB4ZmMsCisweDEwLDB4YTAsMHgwMCwweDAzLDB4YTIsMHgwMiwweDAwLDB4MTYsMHgzNCwweDQyLDB4MDAsMHgwMSwweGEyLDB4MDIsMHgwMCwweDE2LAorMHg5MiwweDA0LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg4MywweDAwLDB4ZmYsMHgxMCwweDYwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDAyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MDIsCisweGEyLDB4MDIsMHgwMCwweDE2LDB4MTAsMHg2MCwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4YTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4MDIsMHgwMCwweDAwLDB4YTIsMHgwMCwweDAwLDB4MTcsMHhhNiwweDAyLDB4MDAsMHgxNCwKKzB4OGYsMHhiZiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsCisweDE0LDB4ODAsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDEsMHg5NiwweDAzLDB4MDAsMHgwNiwweGEyLDB4MDIsMHgwMCwweDE3LAorMHgwOCwweDAwLDB4MWUsMHhkYywweGE2LDB4MDMsMHgwMCwweDE0LDB4OTYsMHgwNCwweDAwLDB4MDAsMHg5NiwweDA1LDB4MDAsMHgwNiwKKzB4MjcsMHg4NiwweDhmLDB4ZjAsMHgwMCwweDA0LDB4MTAsMHhjMCwweDAwLDB4MDUsMHgxOCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsCisweDAwLDB4NjUsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjYsMHgxOCwweDIxLAorMHgwMCwweDQ2LDB4MTAsMHgyMSwweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDgsMHgwYywweDAwLDB4MTIsMHg3OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQzLDB4MDAsMHhmZiwweDEwLDB4NjAsMHgwMCwweDA0LDB4YTIsMHgwMiwweDAwLDB4MTcsCisweDk2LDB4MDIsMHgwMCwweDA2LDB4MDgsMHgwMCwweDFlLDB4ZGMsMHhhNiwweDAyLDB4MDAsMHgxNCwweDk2LDB4MDIsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MWUsMHhkYywweGE2LDB4MDIsMHgwMCwweDE0LDB4OTYsMHgwNSwweDAwLDB4MDAsMHgwYywweDAwLDB4MWYsMHgwOCwKKzB4MDIsMHgwMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MWUsMHhjMywweDAyLDB4MjIsMHg4OCwweDIxLDB4OTQsMHg4NSwweDAwLDB4MDYsCisweDBjLDB4MDAsMHgxZiwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MWUsMHhiZiwweDAwLDB4NDAsMHg4OCwweDIxLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4N2MsMHgyMCwKKzB4MjcsMHhiZCwweGZmLDB4ZjAsMHhhYywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDEwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4N2MsMHg0NCwweGFjLDB4NjIsMHgwMCwweDAwLDB4OTAsMHg4OSwweDAwLDB4MGEsMHgwMCwweDgwLDB4MzAsMHgyMSwKKzB4MTEsMHgyMCwweDAwLDB4MDUsMHgwMCwweGEwLDB4NTAsMHgyMSwweDkwLDB4ODIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDFiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweGM3LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweGUwLDB4MDAsMHgxYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjOCwweDAwLDB4MDAsMHgyNywweDgzLDB4OGYsMHhmMCwKKzB4OTMsMHg4NSwweDhiLDB4NjAsMHgwMCwweDA4LDB4MTAsMHhjMCwweDAwLDB4NDgsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDgsMHgwMCwweGU1LDB4MjgsMHgyYiwweDEwLDB4YTAsMHgwMCwweDA2LAorMHgwMSwweDQ0LDB4MTgsMHgyMywweDhmLDB4ODIsMHg4YiwweDc4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyYiwKKzB4MTAsMHg0MCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDEwLDB4YTQsMHhjOCwweDAwLDB4MTQsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg2MCwweDEwLDB4MjEsMHgxMSwweDIwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NCwweGMyLDB4MDAsMHgwNiwweDI0LDB4MDMsMHgwMCwweDA4LDB4MDgsMHgwMCwweDFmLDB4MzQsMHhhNCwweGMyLDB4MDAsMHgxNCwKKzB4MDgsMHgwMCwweDFmLDB4MzQsMHgwMCwweDAwLDB4MTgsMHgyMSwweDI3LDB4YmQsMHhmZiwweGM4LDB4YWYsMHhiNSwweDAwLDB4MmMsCisweGFmLDB4YjQsMHgwMCwweDI4LDB4YWYsMHhiMywweDAwLDB4MjQsMHhhZiwweGIwLDB4MDAsMHgxOCwweGFmLDB4YmYsMHgwMCwweDMwLAorMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YjEsMHgwMCwweDFjLDB4OTQsMHg5MSwweDAwLDB4MDYsMHgwMCwweDgwLDB4YTAsMHgyMSwKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwMywweDAwLDB4MTEsMHhhOCwweGMwLDB4MzQsMHg4NCwweDAwLDB4MjAsCisweDI0LDB4NDIsMHg3YywweGY4LDB4MDIsMHhiMSwweDQ4LDB4MjEsMHhhYywweDgyLDB4MDAsMHgwMCwweDAwLDB4MDksMHg0OCwweDgwLAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDI3LDB4ODIsMHg5MCwweDAwLDB4YTIsMHg4MywweDAwLDB4MTIsMHgwMSwweDIyLDB4MTAsMHgyMSwKKzB4MjcsMHg4NCwweDhmLDB4ZjQsMHgwMSwweDI0LDB4MjAsMHgyMSwweDgwLDB4NDgsMHgwMCwweDA2LDB4OGMsMHg4YSwweDAwLDB4MTgsCisweDI3LDB4ODMsMHg5MCwweDEwLDB4MDEsMHgyMywweDQ4LDB4MjEsMHg4ZCwweDI0LDB4MDAsMHgwMCwweDI1LDB4MDgsMHgwMCwweDAyLAorMHg4ZCwweDQyLDB4MDAsMHgwMCwweDhkLDB4NDksMHgwMCwweDA0LDB4MDAsMHgwOCwweDE3LDB4YzIsMHg4ZCwweDQzLDB4MDAsMHgwOCwKKzB4MDEsMHgwMiwweDQwLDB4MjEsMHgwMCwweDA0LDB4MjUsMHhjMiwweDAwLDB4MDgsMHg0MCwweDQzLDB4MzAsMHg4NCwweDAwLDB4MDEsCisweDAwLDB4MDMsMHgxZiwweGMyLDB4MDAsMHgwOCwweDQwLDB4NDAsMHgwMCwweGUwLDB4ODAsMHgyMSwweDAwLDB4NjQsMHgxOCwweDI0LAorMHgwMCwweDA5LDB4NDksMHg0MiwweDAxLDB4NDgsMHgxMCwweDIxLDB4MDAsMHhhMCwweDk4LDB4MjEsMHgwMCwweGEwLDB4MjAsMHgyMSwKKzB4MDAsMHg0MCwweDM4LDB4MjEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDE0LDB4NjAsMHgwMCwweDE5LDB4MzEsMHgyOSwweDAwLDB4MDEsCisweDk0LDB4NDIsMHgwMCwweDAwLDB4MDIsMHhiMSwweDg4LDB4MjEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDAwLDB4MTEsMHg4OCwweDgwLAorMHgyNywweDkwLDB4OGYsMHhmMCwweDAyLDB4MzAsMHg4MCwweDIxLDB4OTYsMHgwMywweDAwLDB4MDYsMHgzMCwweDUyLDB4ZmYsMHhmZiwKKzB4MDIsMHg2MCwweDIwLDB4MjEsMHgwMCwweDYwLDB4MzAsMHgyMSwweGE2LDB4ODMsMHgwMCwweDFhLDB4MjcsMHg4MiwweDhmLDB4ZjgsCisweDBjLDB4MDAsMHgwOCwweGRmLDB4MDIsMHgyMiwweDg4LDB4MjEsMHgwMCwweDUyLDB4MTAsMHgyMSwweDk2LDB4MDMsMHgwMCwweDA2LAorMHhhNiwweDIyLDB4MDAsMHgwNCwweDhmLDB4YmYsMHgwMCwweDMwLDB4N2IsMHhiNCwweDAxLDB4N2MsMHg3YiwweGIyLDB4MDEsMHgzYywKKzB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzgsCisweGFmLDB4YTksMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MDYsMHhhZiwweGEwLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgxZiwweDcyLAorMHgwMiwweGIxLDB4ODgsMHgyMSwweDI3LDB4YmQsMHhmZiwweGMwLDB4YWYsMHhiZSwweDAwLDB4MzgsMHhhZiwweGI3LDB4MDAsMHgzNCwKKzB4YWYsMHhiNiwweDAwLDB4MzAsMHhhZiwweGI1LDB4MDAsMHgyYywweGFmLDB4YjMsMHgwMCwweDI0LDB4YWYsMHhiMSwweDAwLDB4MWMsCisweGFmLDB4YmYsMHgwMCwweDNjLDB4YWYsMHhiNCwweDAwLDB4MjgsMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YjAsMHgwMCwweDE4LAorMHg5NCwweDkwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHhiMCwweDAzLDB4MzUsMHgwOCwweDAwLDB4MjAsMHgwMCwweDEwLDB4MTAsMHhjMCwKKzB4MDAsMHg1MCwweDE4LDB4MjEsMHgwMCwweDQwLDB4ODgsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHgwMywweDQ4LDB4ODAsCisweDI0LDB4NDIsMHg3ZSwweDM0LDB4MDAsMHg4MCwweDk4LDB4MjEsMHgyNywweDg0LDB4OTAsMHgwMCwweDAxLDB4MjQsMHgyMCwweDIxLAorMHg5MywweGI3LDB4MDAsMHg1MywweGFkLDB4MDIsMHgwMCwweDAwLDB4ODAsMHg4MywweDAwLDB4MDYsMHgyNywweDgyLDB4OGYsMHhmNCwKKzB4MDEsMHgyMiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgxOCwweDI0LDB4NjMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsCisweDhjLDB4ODgsMHgwMCwweDA4LDB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg0MywweDAwLDB4MDMsMHgxOCwweDQwLAorMHhhZiwweGE3LDB4MDAsMHg0YywweDJjLDB4YTIsMHgwMCwweDEwLDB4MDAsMHhhMCwweGE4LDB4MjEsMHgwMCwweDgzLDB4NTAsMHgyMSwKKzB4MDAsMHgwOCwweDQ3LDB4YzIsMHgwMCwweGMwLDB4NTgsMHgyMSwweDAwLDB4MDAsMHhiMCwweDIxLDB4OGMsMHg5MiwweDAwLDB4MGMsCisweDE0LDB4NDAsMHgwMCwweDEzLDB4MDAsMHgwMCwweGYwLDB4MjEsMHg5MiwweDY3LDB4MDAsMHgwNCwweDI0LDB4MTQsMHgwMCwweDAxLAorMHgxMiwweDg3LDB4MDAsMHgxMCwweDAyLDB4MzAsMHgxMCwweDIxLDB4MjcsMHg4MywweDkwLDB4MDgsMHgwMSwweDIzLDB4MTgsMHgyMSwKKzB4ODAsMHg2NCwweDAwLDB4MDAsMHgyNywweDgzLDB4YjUsMHg2MCwweDAwLDB4MDQsMHgxMSwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg5MCwweDQ0LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg4MCwweDAwLDB4MjMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgzMCwweDEwLDB4MjEsMHgwMCwweDAyLDB4ODAsMHg4MCwweDI0LDB4MDQsMHgwMCwweDAxLDB4MjcsMHg4MywweDkwLDB4MTAsCisweGEyLDB4NjQsMHgwMCwweDEyLDB4MDIsMHgwMywweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MTUsMHhjMiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MDEsMHgwMiwweDEwLDB4MjQsMHgxNCwweDQwLDB4MDAsMHgwZSwKKzB4MDIsMHhhMCwweDIwLDB4MjEsMHgyNywweDgyLDB4OGYsMHhmMCwweDAyLDB4MDIsMHgxMCwweDIxLDB4OTQsMHg0MywweDAwLDB4MDYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTYsMHg2MywweDAwLDB4MWEsMHg5NCwweDQyLDB4MDAsMHgwNiwweDdiLDB4YmUsMHgwMSwweGZjLAorMHg3YiwweGI2LDB4MDEsMHhiYywweDdiLDB4YjQsMHgwMSwweDdjLDB4N2IsMHhiMiwweDAxLDB4M2MsMHg3YiwweGIwLDB4MDAsMHhmYywKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg0MCwweDhmLDB4YTUsMHgwMCwweDRjLDB4MDEsMHg2MCwweDMwLDB4MjEsCisweDAxLDB4NDAsMHgzOCwweDIxLDB4YWYsMHhhMCwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHgwNiwweGFmLDB4YTAsMHgwMCwweDE0LAorMHgwOCwweDAwLDB4MWYsMHhkOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4MywweDkwLDB4MTAsMHgwMSwweDIzLDB4MTgsMHgyMSwKKzB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNSwweGMyLDB4MzAsMHg0MiwweDAwLDB4MDEsCisweDAxLDB4MDIsMHgxMCwweDI0LDB4MTQsMHg0MCwweDAwLDB4YWYsMHgwMCwweGEwLDB4MjAsMHgyMSwweDMyLDB4NGYsMHgwMCwweDAzLAorMHgwMCwweDEyLDB4MTAsMHg4MiwweDI1LDB4ZTMsMHgwMCwweDBkLDB4MzAsMHg0NSwweDAwLDB4MDcsMHgwMCwweDc0LDB4NzgsMHgwNCwKKzB4MTAsMHhhMCwweDAwLDB4MGUsMHgwMCwweDAwLDB4OTAsMHgyMSwweDI3LDB4ODIsMHg4MCwweDFjLDB4MDAsMHgxNSwweDE4LDB4NDAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4OTQsMHg2NCwweDAwLDB4MDAsMHgyNCwweGEyLDB4MDAsMHgwNiwweDAwLDB4NTQsMHgxMCwweDA0LAorMHgwMCwweDQ0LDB4MDAsMHgxYSwweDE0LDB4ODAsMHgwMCwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwZCwKKzB4MDAsMHgwMCwweDEwLDB4MTIsMHgyNCwweDQyLDB4MDAsMHgyMCwweDMwLDB4NTIsMHhmZiwweGZjLDB4MDIsMHgzMCwweDEwLDB4MjEsCisweDI3LDB4ODMsMHg5MCwweDAwLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODMsMHgwMCwweGZmLDB4MmMsMHg2MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwNCwKKzB4MmMsMHg2MiwweDAwLDB4MTksMHgzMCwweDgyLDB4MDAsMHgwZiwweDI0LDB4NDMsMHgwMCwweDBjLDB4MmMsMHg2MiwweDAwLDB4MTksCisweDEwLDB4NDAsMHgwMCwweDE5LDB4MjQsMHgwZSwweDAwLDB4MjAsMHgyNCwweDYyLDB4ZmYsMHhlOSwweDJjLDB4NDIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4MDAsMHgxNSwweDI0LDB4MGUsMHgwMCwweDEwLDB4MjQsMHg2MiwweGZmLDB4ZWIsMHgyYywweDQyLDB4MDAsMHgwMiwKKzB4MTQsMHg0MCwweDAwLDB4MTEsMHgyNCwweDBlLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDE0LDB4MTAsMHg2MiwweDAwLDB4MGUsCisweDI0LDB4MGUsMHgwMCwweDAyLDB4MjQsMHg2MiwweGZmLDB4ZWYsMHgyYywweDQyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDBhLAorMHgyNCwweDBlLDB4MDAsMHgxMCwweDI0LDB4NjIsMHhmZiwweGYxLDB4MmMsMHg0MiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgwNiwKKzB4MjQsMHgwZSwweDAwLDB4MDgsMHgyNCwweDYyLDB4ZmYsMHhmMywweDJjLDB4NDIsMHgwMCwweDAyLDB4MjQsMHgwZSwweDAwLDB4MDQsCisweDI0LDB4MDMsMHgwMCwweDAyLDB4MDAsMHg2MiwweDcwLDB4MGEsMHgzMCwweGUyLDB4MDAsMHhmZiwweDAwLDB4MDAsMHg0OCwweDIxLAorMHgwMCwweDAwLDB4NjgsMHgyMSwweDEwLDB4NDAsMHgwMCwweDZkLDB4MDAsMHgwMCwweDU4LDB4MjEsMHgzYywweDE0LDB4ODAsMHhmZiwKKzB4MjcsMHg5OSwweDhmLDB4ZjAsMHgwMSwweGYyLDB4YzAsMHgyMywweDM2LDB4OTQsMHhmZiwweGZmLDB4MDEsMHhjOSwweDEwLDB4MmEsCisweDE0LDB4NDAsMHgwMCwweDY0LDB4MjQsMHgwMywweDAwLDB4MDQsMHgwMCwweDEwLDB4MjgsMHhjMCwweDAwLDB4YjAsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NTksMHgxMCwweDIxLDB4OTQsMHg1NiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzIsMHhjYywweDAwLDB4MDMsMHgwMCwweDZjLDB4MTAsMHgyMywweDMwLDB4NDIsMHgwMCwweDAzLDB4MDIsMHhjMiwweDEwLDB4MjEsCisweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg1MSwweGZmLDB4ZmYsMHgwMiwweDMyLDB4MTgsMHgyYiwweDEwLDB4NjAsMHgwMCwweDRkLAorMHgwMSwweGYxLDB4MTAsMHgyMywweDAyLDB4NTEsMHgxMCwweDIzLDB4MDEsMHg3OCwweDE4LDB4MmIsMHgxMCwweDYwLDB4MDAsMHgzNCwKKzB4MzAsMHg0NCwweGZmLDB4ZmYsMHgyOSwweDIyLDB4MDAsMHg0MCwweDEwLDB4NDAsMHgwMCwweDMxLDB4MDEsMHg3MiwweDE4LDB4MjEsCisweDI1LDB4MjIsMHgwMCwweDAxLDB4MDAsMHgwMiwweDE2LDB4MDAsMHgwMCwweDAyLDB4NGUsMHgwMywweDAwLDB4YjAsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MzAsMHg4MCwweDI3LDB4ODIsMHg4ZiwweGY0LDB4MzAsMHg2YiwweGZmLDB4ZmYsMHgwMCwweGMyLDB4MTgsMHgyMSwKKzB4OGMsMHg2NywweDAwLDB4MTgsMHgwMCwweDA0LDB4MjUsMHg0MCwweDNjLDB4MDMsMHg3ZiwweDAwLDB4OGMsMHhlMiwweDAwLDB4MDQsCisweDAwLDB4ODMsMHgyMCwweDI0LDB4MjcsMHg4MywweDkwLDB4MDAsMHgwMCwweDU0LDB4MTAsMHgyNCwweDAwLDB4YzMsMHgyOCwweDIxLAorMHgwMCwweDQ0LDB4MTAsMHgyNSwweGFjLDB4ZTIsMHgwMCwweDA0LDB4MTYsMHhlMCwweDAwLDB4MDIsMHhhMCwweGI1LDB4MDAsMHgwMCwKKzB4YTAsMHhiNSwweDAwLDB4MDMsMHgyNywweDg0LDB4OTAsMHgxMCwweDAwLDB4YzQsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsCisweDhjLDB4ZTgsMHgwMCwweDA4LDB4MDAsMHgwMiwweDE1LDB4YzIsMHgwMCwweDA4LDB4NDcsMHhjMiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgwMSwweDAyLDB4MTAsMHgyNCwweDEwLDB4NDAsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweGEyLDB4MDAsMHgwNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMiwweDAwLDB4MDIsMHgxZiwweGMyLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDQzLDB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweGUyLDB4NTAsMHgyMSwweGE1LDB4NWUsMHgwMCwweDAwLAorMHg5MiwweDYyLDB4MDAsMHgwNCwweDI1LDB4YWQsMHgwMCwweDAxLDB4MjcsMHg4NCwweDhmLDB4ZjAsMHgwMCwweGM0LDB4MTgsMHgyMSwKKzB4MDEsMHhhMiwweDEwLDB4MmEsMHg5NCwweDcwLDB4MDAsMHgwMiwweDE0LDB4NDAsMHhmZiwweGI4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDk2LDB4NjMsMHgwMCwweDE0LDB4MDAsMHgwYywweDEwLDB4MjMsMHhhMiwweDY5LDB4MDAsMHgxMiwweDMwLDB4NDIsMHgwMCwweDAzLAorMHgwMSwweDYyLDB4MTAsMHgyMywweDAwLDB4MDMsMHg4MCwweGMwLDB4OGYsMHhhNSwweDAwLDB4NGMsMHgzMCwweDRiLDB4ZmYsMHhmZiwKKzB4MDIsMHgwMywweDgwLDB4MjEsMHgyNywweDgyLDB4OGYsMHhmOCwweDAwLDB4MTAsMHg4MCwweDgwLDB4YTYsMHg2YiwweDAwLDB4MWEsCisweDAyLDB4YTAsMHgyMCwweDIxLDB4MDEsMHg2MCwweDMwLDB4MjEsMHgwMSwweDYwLDB4ODgsMHgyMSwweDBjLDB4MDAsMHgwOCwweGRmLAorMHgwMiwweDAyLDB4ODAsMHgyMSwweDAwLDB4NWUsMHgxMCwweDIxLDB4YTYsMHgwMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MWYsMHhkZiwKKzB4MDIsMHgyMCwweDEwLDB4MjEsMHgwMSwweDYyLDB4MTAsMHgyYiwweDEwLDB4NDAsMHhmZiwweGU5LDB4MDAsMHgwMCwweDIwLDB4MjEsCisweDI5LDB4MjIsMHgwMCwweDQwLDB4MTAsMHg0MCwweGZmLDB4ZTYsMHgwMSwweDcxLDB4MTgsMHgyMSwweDA4LDB4MDAsMHgyMCwweDU1LAorMHgyNSwweDIyLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgyMCwweDg0LDB4MzIsMHhjYywweDAwLDB4MDMsMHgwOCwweDAwLDB4MjAsMHg4NCwKKzB4MDAsMHgwMCwweDYwLDB4MjEsMHg4ZiwweGE1LDB4MDAsMHg0YywweDAxLDB4NDAsMHgzOCwweDIxLDB4YWYsMHhhMCwweDAwLDB4MTAsCisweDBjLDB4MDAsMHgwOSwweDA2LDB4YWYsMHhiNCwweDAwLDB4MTQsMHg5MiwweDY3LDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxZiwweGY3LAorMHgzMCwweDVlLDB4ZmYsMHhmZiwweDMwLDB4ODQsMHhmZiwweGZmLDB4MDAsMHgwNCwweDMwLDB4YzAsMHgwMCwweGM0LDB4MjAsMHgyMSwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgyNywweDgyLDB4OGYsMHhmMCwweDNjLDB4MDMsMHhiMCwweDA4LDB4MzAsMHhhNSwweGZmLDB4ZmYsCisweDAwLDB4ODIsMHgyMCwweDIxLDB4MDAsMHhjMywweDMwLDB4MjEsMHhhYywweGM1LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhNCwweDg1LDB4MDAsMHgwMCwweDMwLDB4ODQsMHhmZiwweGZmLDB4MDAsMHgwNCwweDMwLDB4YzAsMHgwMCwweGM0LDB4MzAsMHgyMSwKKzB4MjcsMHg4OCwweDhmLDB4ZjAsMHgwMCwweDA2LDB4MzAsMHg4MCwweDAwLDB4YzgsMHgzMCwweDIxLDB4OTQsMHhjMywweDAwLDB4MDQsCisweDNjLDB4MDIsMHhiMCwweDA4LDB4M2MsMHgwNywweGIwLDB4MDMsMHgwMCwweDAzLDB4MjAsMHhjMCwweDAwLDB4ODMsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4ODIsMHgyMCwweDIxLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzMCwweGE1LDB4ZmYsMHhmZiwKKzB4MDAsMHg2OCwweDE4LDB4MjEsMHgzNCwweGU3LDB4MDAsMHgyMCwweDI0LDB4NDIsMHg4MiwweGU0LDB4YWMsMHhlMiwweDAwLDB4MDAsCisweGE0LDB4YzUsMHgwMCwweDAyLDB4YTQsMHg2NSwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODUsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4ODMsMHg0MCwKKzB4YWMsMHg0MywweDAwLDB4MDAsMHg5MCwweDgyLDB4MDAsMHgxMCwweDNjLDB4MDgsMHhiMCwweDAzLDB4M2MsMHgwOSwweGIwLDB4MDYsCisweDI3LDB4ODcsMHg4ZiwweGYwLDB4M2MsMHgwZCwweGIwLDB4MDgsMHgzNCwweDBlLDB4ZmYsMHhmZiwweDM1LDB4MDgsMHgwMCwweDYyLAorMHgwMCwweDgwLDB4MzAsMHgyMSwweDI0LDB4MGMsMHhmZiwweGZmLDB4MTAsMHg0MCwweDAwLDB4MmMsMHgzNSwweDI5LDB4ODAsMHgyMCwKKzB4OTcsMHg4MiwweDhmLDB4ZTAsMHg5NCwweDg1LDB4MDAsMHgwYywweDNjLDB4MGIsMHhiMCwweDAzLDB4MDAsMHgwMiwweDE4LDB4YzAsCisweDAwLDB4NjIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweGE0LDB4NDUsMHgwMCwweDAwLAorMHg5NCwweDg0LDB4MDAsMHgwZSwweDAwLDB4NmQsMHgxOCwweDIxLDB4YWMsMHg2NSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MTAsMHhjMCwKKzB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDcsMHgxMCwweDIxLDB4OTQsMHg0NSwweDAwLDB4MDQsCisweDNjLDB4MGEsMHg3NywweDc3LDB4MzUsMHg2YiwweDAwLDB4YjQsMHgwMCwweDA1LDB4MTAsMHhjMCwweDAwLDB4NDUsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjcsMHgxOCwweDIxLDB4MDAsMHg0ZCwweDEwLDB4MjEsMHhhYywweDRlLDB4MDAsMHgwMCwKKzB4YTQsMHg2ZSwweDAwLDB4MDAsMHg5NSwweDA0LDB4MDAsMHgwMCwweDkwLDB4YzMsMHgwMCwweDEwLDB4MjQsMHgwMiwweDAwLDB4ZmYsCisweDAwLDB4NDQsMHgxMCwweDIzLDB4MDAsMHg0MywweDEwLDB4MmEsMHhhNywweDg1LDB4OGYsMHhlMCwweDEwLDB4NDAsMHgwMCwweDA0LAorMHgzNSwweDRhLDB4ODgsMHg4OCwweGFkLDB4NmEsMHgwMCwweDAwLDB4OTAsMHhjMywweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg2MywweDAwLDB4ZmYsMHgzYywweDAyLDB4MDAsMHg0MCwweDAwLDB4NjIsMHgxOCwweDI1LDB4YWQsMHgyMywweDAwLDB4MDAsCisweGE0LDB4Y2MsMHgwMCwweDBlLDB4YTQsMHhjYywweDAwLDB4MGMsMHhhMCwweGMwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODQsMHhmZiwweGZmLDB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4MjcsMHg4OSwweDhmLDB4ZjAsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDksMHgxMCwweDIxLDB4OTcsMHg4MywweDhmLDB4ZTAsCisweDk0LDB4NGEsMHgwMCwweDA0LDB4M2MsMHgwMiwweGIwLDB4MDgsMHgwMCwweDAzLDB4MzgsMHhjMCwweDAwLDB4MGEsMHg0MCwweGMwLAorMHgwMCwweGUzLDB4MTgsMHgyMSwweDAxLDB4MGEsMHgyOCwweDIxLDB4MDAsMHhlMiwweDM4LDB4MjEsMHgwMSwweDAyLDB4NDAsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDA1LDB4MjgsMHg4MCwweDNjLDB4MDYsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsCisweDAwLDB4YTksMHgyOCwweDIxLDB4MDAsMHg2OSwweDE4LDB4MjEsMHgzNCwweGM2LDB4MDAsMHgyMCwweDM0LDB4MDksMHhmZiwweGZmLAorMHgyNCwweDQyLDB4ODQsMHgzNCwweGFjLDB4YzIsMHgwMCwweDAwLDB4YTQsMHg2NCwweDAwLDB4MDAsMHhhYywweGU0LDB4MDAsMHgwMCwKKzB4YTQsMHhhOSwweDAwLDB4MDAsMHhhZCwweDA5LDB4MDAsMHgwMCwweGE3LDB4OGEsMHg4ZiwweGUwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwweDM0LDB4NjMsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4ODQsMHhiNCwweDNjLDB4MDQsMHhiMCwweDAzLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDEsMHgxMCwKKzB4OGMsMHg4MiwweDAwLDB4MDAsMHg5NywweDgzLDB4ODEsMHg2MCwweDMwLDB4NDIsMHhmZiwweGZmLDB4MTAsMHg2MiwweDAwLDB4MTYsCisweDI0LDB4MGEsMHgwMCwweDAxLDB4YTcsMHg4MiwweDgxLDB4NjAsMHhhZiwweDgwLDB4YjQsMHg0MCwweDAwLDB4NDAsMHgyOCwweDIxLAorMHgyNCwweDA2LDB4MDAsMHgwMSwweDI3LDB4ODQsMHhiNCwweDQ0LDB4MjUsMHg0MywweGZmLDB4ZmYsMHgwMCwweDY2LDB4MTAsMHgwNCwKKzB4MDAsMHhhMiwweDEwLDB4MjQsMHgxNCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MywweGZmLDB4ZmMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NiwweDEwLDB4MDQsMHgwMCwweGEyLDB4MTAsMHgyNCwweDM4LDB4NDIsMHgwMCwweDAwLAorMHgwMSwweDQyLDB4MTgsMHgwYSwweDI1LDB4NGEsMHgwMCwweDAxLDB4MmQsMHg0MiwweDAwLDB4MTQsMHhhYywweDgzLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweGZmLDB4ZjEsMHgyNCwweDg0LDB4MDAsMHgwNCwweDNjLDB4MGIsMHhiMCwweDAzLDB4MDAsMHgwMCwweDUwLDB4MjEsCisweDNjLDB4MGMsMHg4MCwweDAwLDB4MjcsMHg4OSwweGI0LDB4OTAsMHgzNSwweDZiLDB4MDEsMHgyMCwweDhkLDB4NjgsMHgwMCwweDAwLAorMHg4ZCwweDIzLDB4MDAsMHgwNCwweDAxLDB4MGMsMHgxMCwweDI0LDB4MDAsMHgwMiwweDE3LDB4YzIsMHgxMSwweDAzLDB4MDAsMHgzNywKKzB4YTEsMHgyMiwweDAwLDB4ZGMsMHhhMSwweDIwLDB4MDAsMHhkNSwweGExLDB4MjAsMHgwMCwweGQ2LDB4MDEsMHgyMCwweDMwLDB4MjEsCisweDAwLDB4MDAsMHgzOCwweDIxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMSwweDIwLDB4MjAsMHgyMSwweDAwLDB4YTgsMHgxMCwweDA2LAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4ZTAsMHgwMCwweDEwLDB4YTAsMHg4MiwweDAwLDB4MGEsMHg5MCwweDgyLDB4MDAsMHgwNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgzMSwweDI0LDB4YTIsMHhmZiwweGZmLDB4YTAsMHg4MiwweDAwLDB4MDgsCisweDkwLDB4ODIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweDgzLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4NDAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHg0NiwweDEwLDB4MjEsMHhhMCwweDQ1LDB4MDAsMHgwOSwweDkwLDB4ODIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweGUwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhMCwweGM1LDB4MDAsMHhkNSwweDI0LDB4MDcsMHgwMCwweDAxLDB4YTAsMHg4NSwweDAwLDB4MDgsMHhhMCwweGM1LDB4MDAsMHhkNiwKKzB4MjQsMHhhNSwweDAwLDB4MDEsMHgyYywweGEyLDB4MDAsMHgxYywweDE0LDB4NDAsMHhmZiwweGUwLDB4MjQsMHg4NCwweDAwLDB4MDMsCisweDkwLDB4YzQsMHgwMCwweGQ1LDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMCwweGE0LDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDBiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YzAsMHgxOCwweDIxLDB4YTAsMHg2NCwweDAwLDB4MDgsMHg5MCwweGMyLDB4MDAsMHhkNSwKKzB4MjQsMHhhNSwweDAwLDB4MDEsMHhhMCwweDYyLDB4MDAsMHgwOSwweDkwLDB4YzQsMHgwMCwweGQ1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4YTQsMHgxMCwweDJiLDB4MTQsMHg0MCwweGZmLDB4ZjgsMHgyNCwweDYzLDB4MDAsMHgwMywweDI1LDB4NGEsMHgwMCwweDAxLAorMHgyZCwweDQyLDB4MDAsMHgwOCwweGFkLDB4MjgsMHgwMCwweDA0LDB4MjUsMHg2YiwweDAwLDB4MDQsMHgxNCwweDQwLDB4ZmYsMHhiZiwKKzB4MjUsMHgyOSwweDAwLDB4ZWMsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MDUsCisweDA4LDB4MDAsMHgyMSwweDY4LDB4YTAsMHg4MiwweDAwLDB4MDgsMHg5NywweDg1LDB4OGIsMHg2YSwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMSwweDI3LDB4YmQsMHhmZiwweGU4LDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4ODYsMHg2OCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MzAsMHg5MCwweDAwLDB4ZmYsCisweDAwLDB4MDUsMHgyOCwweDQyLDB4MDAsMHgwMCwweDQ4LDB4MjEsMHgyNywweDhmLDB4YjQsMHg5NCwweDAwLDB4MDAsMHg1MCwweDIxLAorMHgwMCwweDAwLDB4NTgsMHgyMSwweDI3LDB4OTgsMHhiNSwweDc0LDB4MjcsMHg5OSwweGI1LDB4NzAsMHgyNywweDhlLDB4YjUsMHg2ZSwKKzB4MjcsMHg4YywweGI0LDB4OTgsMHgyNywweDhkLDB4YjQsMHhmMCwweDI3LDB4ODgsMHhiNSwweDY4LDB4MDAsMHgwYSwweDE4LDB4ODAsCisweDAxLDB4NmYsMHgxMCwweDIxLDB4YWMsMHg0MCwweDAwLDB4MDAsMHhhYywweDQ1LDB4MDAsMHg1OCwweDAwLDB4NmUsMHgyMCwweDIxLAorMHgwMCwweDc4LDB4MTAsMHgyMSwweGExLDB4MDAsMHhmZiwweGZjLDB4YWQsMHgwMCwweDAwLDB4MDAsMHhhMSwweDAwLDB4MDAsMHgwNCwKKzB4YTEsMHgwMCwweDAwLDB4MDUsMHhhZCwweDAwLDB4ZmYsMHhmOCwweDAwLDB4NzksMHgxOCwweDIxLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDI0LDB4YzYsMHhmZiwweGZmLDB4YTAsMHg4MCwweDAwLDB4MDAsMHhhNCwweDYwLDB4MDAsMHgwMCwweGFjLDB4NDAsMHgwMCwweDAwLAorMHgyNCwweDYzLDB4MDAsMHgwMiwweDI0LDB4NDIsMHgwMCwweDA0LDB4MDQsMHhjMSwweGZmLDB4ZjksMHgyNCwweDg0LDB4MDAsMHgwMSwKKzB4MDAsMHgwYSwweDEwLDB4ODAsMHgwMCwweDRkLDB4MjAsMHgyMSwweDAwLDB4MDAsMHgzMCwweDIxLDB4MDAsMHg0YywweDE4LDB4MjEsCisweDI3LDB4ODcsMHg4MSwweDY0LDB4OGMsMHhlMiwweDAwLDB4MDAsMHgyNCwweGU3LDB4MDAsMHgwNCwweGFjLDB4ODIsMHgwMCwweDAwLAorMHhhMCwweDY2LDB4MDAsMHgwMCwweGEwLDB4NjYsMHgwMCwweDAxLDB4MjQsMHhjNiwweDAwLDB4MDEsMHgyOCwweGMyLDB4MDAsMHgxYywKKzB4YTAsMHg2MCwweDAwLDB4MDIsMHgyNCwweDg0LDB4MDAsMHgwNCwweDE0LDB4NDAsMHhmZiwweGY2LDB4MjQsMHg2MywweDAwLDB4MDMsCisweDI1LDB4MjksMHgwMCwweDAxLDB4MjksMHgyMiwweDAwLDB4MDgsMHgyNSwweDRhLDB4MDAsMHgzYiwweDI1LDB4MDgsMHgwMCwweGVjLAorMHgxNCwweDQwLDB4ZmYsMHhkNiwweDI1LDB4NmIsMHgwMCwweGVjLDB4YTcsMHg4MCwweDgxLDB4NjAsMHgwMCwweDAwLDB4NDgsMHgyMSwKKzB4MjcsMHg4MywweGI0LDB4NDAsMHhhYywweDY5LDB4MDAsMHgwMCwweDI1LDB4MjksMHgwMCwweDAxLDB4MjksMHgyMiwweDAwLDB4MGMsCisweDE0LDB4NDAsMHhmZiwweGZjLDB4MjQsMHg2MywweDAwLDB4MDQsMHgwYywweDAwLDB4MjEsMHgyZCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZSwweDA0LDB4MDAsMHgxNCwweDI3LDB4ODMsMHhiNCwweDkwLDB4MjQsMHgwOSwweDAwLDB4MDcsMHgxMCwweDgwLDB4MDAsMHgwYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDYyLDB4MDAsMHhkNSwweDI1LDB4MjksMHhmZiwweGZmLDB4YTAsMHg2MiwweDAwLDB4MDAsCisweDA1LDB4MjEsMHhmZiwweGZhLDB4MjQsMHg2MywweDAwLDB4ZWMsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LDB4OTAsMHg2MiwweDAwLDB4ZDYsMHgwOCwweDAwLDB4MjEsMHhlYiwKKzB4MjUsMHgyOSwweGZmLDB4ZmYsMHgzMCwweDg0LDB4MDAsMHhmZiwweDAwLDB4MDQsMHgxMSwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHhiNCwweDkwLAorMHgwMCwweDQzLDB4NjAsMHgyMSwweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweDg0LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDg3LDB4ZDQsMHgzMCwweGM2LDB4MDAsMHhmZiwweDkzLDB4YTksMHgwMCwweDEzLDB4MzAsMHhhNSwweDAwLDB4ZmYsCisweDMwLDB4ZTcsMHgwMCwweGZmLDB4YWMsMHg4MiwweDAwLDB4MDAsMHgxMCwweGMwLDB4MDAsMHhlYiwweDI1LDB4OGYsMHgwMCwweGQwLAorMHg5MSwweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweGZmLDB4ZmMsMHgyYywweDQzLDB4MDAsMHgxOCwKKzB4MTAsMHg2MCwweDAwLDB4Y2YsMHgzYywweDAzLDB4ODAsMHgwMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjQsMHg2MywweDAyLDB4NWMsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4MjIsMHgwMCwweDJkLDB4MTAsMHg0MCwweDAwLDB4MTQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweDAwLDB4MGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MDksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweGZmLDB4ZDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWQsMHg4MiwweDAwLDB4ZDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweGZmLDB4ZTAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4MDAsMHgwMSwweDEwLDB4YTAsMHgwMCwweDBmLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLAorMHgyNCwweDQyLDB4ZmYsMHhlOCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwKKzB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4MDAsMHgwMiwweDEwLDB4YTAsMHhmZiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ZTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweGEyLDB4ZmYsMHhmNCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4ZWYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywweDI0LDB4NDIsMHhmZiwweGY4LDB4MmQsMHgyMiwweDAwLDB4MTksCisweDE0LDB4NDAsMHhmZiwweGRlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhlYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGQ2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4ZTQsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4MjMsMHgyNCwweDQyLDB4ZmYsMHhmMCwweDJkLDB4MjIsMHgwMCwweDFiLAorMHgxMCwweDQwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDE0LDB4YTIsMHhmZiwweGNlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLAorMHgyNCwweDQyLDB4ZmYsMHhmNCwweDJkLDB4MjIsMHgwMCwweDFlLDB4MTAsMHg0MCwweGZmLDB4ZTMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweGZmLDB4Y2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YzksCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4ZDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDM0LAorMHgyNCwweDAyLDB4MDAsMHgwMywweDJkLDB4MjIsMHgwMCwweDIzLDB4MTAsMHg0MCwweGZmLDB4ZDcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweGZmLDB4YWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YmQsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4ZGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHg5ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIyLDB4MjUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmQsMHgyMiwweDAwLDB4MjUsMHgxMCwweDQwLDB4ZmYsMHhjOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4YTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDk3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHg4MCwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweDIzLDB4MjQsMHg0MiwweGZmLDB4ZmMsCisweDJkLDB4MjIsMHgwMCwweDE2LDB4MTQsMHg0MCwweDAwLDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4OGQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg5YiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4YTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHgyMywweDI0LDB4NDIsMHhmZiwweGZhLAorMHgxMCwweGEwLDB4ZmYsMHg5NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg4MCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDhlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMiwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgxNywweDE0LDB4NDAsMHhmZiwweDllLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDk3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgxOSwKKzB4MTAsMHg0MCwweGZmLDB4ZTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweDg0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweGEyLDB4ZmYsMHg3YywweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4ODksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIyLDB4MjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweGI0LDB4MmQsMHgyMiwweDAwLDB4MWIsCisweDJkLDB4MjIsMHgwMCwweDFlLDB4MTAsMHg0MCwweGZmLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweDczLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NWQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg2YiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4ODgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIyLDB4MjUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4MjIsMHgwMCwweDIzLAorMHgxNCwweDQwLDB4ZmYsMHhmMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIyLDB4NGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIyLDB4NGMsMHgyZCwweDIyLDB4MDAsMHgyNSwweDA4LDB4MDAsMHgyMiwweDg1LDB4MmQsMHgyMiwweDAwLDB4MjcsCisweDEwLDB4YTAsMHhmZiwweDVlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDQ4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4NTYsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHhhMiwweGZmLDB4NjMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDkxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4MjIsMHgwMCwweDI3LDB4MTQsMHg0MCwweGZmLDB4OGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDNlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4MjIsMHgwMCwweDI5LDB4MTQsMHg0MCwweGZmLDB4ODksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIyLDB4MmIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkxLDB4ODYsMHgwMCwweDAwLDB4OTEsMHg4MywweDAwLDB4ZDQsCisweDI1LDB4OGQsMHgwMCwweDVjLDB4MzAsMHhjNCwweDAwLDB4ZmYsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4NDQsMHgxMCwweDIxLAorMHgwMCwweDA0LDB4NTAsMHg4MCwweDAxLDB4ODIsMHg1OCwweDIxLDB4MDEsMHg4YSwweDQwLDB4MjEsMHgyNSwweDc4LDB4MDAsMHgwOCwKKzB4MTAsMHg2MCwweDAwLDB4MzcsMHgyNSwweDBlLDB4MDAsMHg2MCwweDJjLDB4YTIsMHgwMCwweDAzLDB4MTQsMHg0MCwweDAwLDB4MjUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4ZGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDFlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODcsMHg4MSwweDY0LDB4MDEsMHg0NywweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZCwweDAzLDB4MDAsMHg2MCwweDkxLDB4NjIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDAsMHgzMCwweDIxLDB4YTEsMHg4MiwweDAwLDB4MDAsMHgzMCwweGMyLDB4MDAsMHhmZiwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ3LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTgsMHg0MiwKKzB4YWQsMHhhMywweDAwLDB4MDAsMHg5MSwweDg0LDB4MDAsMHgwMCwweDhkLDB4YzUsMHgwMCwweDAwLDB4MDAsMHgwNCwweDIwLDB4ODAsCisweDAwLDB4ODcsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsMHgwMCwweDA1LDB4MjgsMHg0MCwweDAwLDB4OGMsMHgyMCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4YTMsMHgxMCwweDJiLDB4MDAsMHg2MiwweDI4LDB4MGEsMHhhYywweDg1LDB4MDAsMHg2MCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDgwLDB4MDAsMHhkNCwweDI3LDB4ODcsMHg4MSwweDY0LDB4MDgsMHgwMCwweDIzLDB4MGUsCisweGExLDB4ODAsMHgwMCwweGRkLDB4MjcsMHg4MiwweDgxLDB4ZDQsMHg4ZCwweDgzLDB4MDAsMHhkOCwweDAwLDB4ODIsMHgxMCwweDIxLAorMHg5MCwweDQ0LDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDAsMHg2NCwweDIwLDB4MmIsMHgxNCwweDgwLDB4ZmYsMHgwZCwKKzB4YWQsMHg4MywweDAwLDB4ZDgsMHg4ZCwweDAyLDB4MDAsMHg2MCwweGExLDB4ODAsMHgwMCwweGQ0LDB4MDAsMHgwMiwweDFmLDB4YzIsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4NDMsMHgwMywweGUwLDB4MDAsMHgwOCwweGFkLDB4ODIsMHgwMCwweDVjLAorMHgxMCwweGUwLDB4MDAsMHgxYSwweDI0LDB4ODMsMHhmZiwweGZjLDB4MmMsMHg2MiwweDAwLDB4MTgsMHgxMCwweDQwLDB4MDEsMHgxOCwKKzB4MDAsMHgwMywweDEwLDB4ODAsMHgzYywweDAzLDB4ODAsMHgwMSwweDI0LDB4NjMsMHgwMiwweGJjLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZCwweDIyLDB4MDAsMHgyZCwweDEwLDB4NDAsMHgwMCwweDVmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHg1YSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHgwMCwweDU0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4NTEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHhmZiwweGQwLDB4YWQsMHg4MiwweDAwLDB4ZDAsMHg4ZCwweGUzLDB4MDAsMHgwMCwKKzB4OGQsMHhhMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YWQsMHhhMiwweDAwLDB4MDAsCisweGFkLDB4ZTAsMHgwMCwweDAwLDB4OGQsMHhhMywweDAwLDB4MDAsMHg4ZCwweGM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDgzLDB4MTAsMHgyYSwweDEwLDB4NDAsMHgwMCwweDIyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MywweDA1LDB4MDAsMHgwMSwKKzB4OTEsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDUsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGExLDB4ODUsMHgwMCwweDAwLDB4YTEsMHg4MiwweDAwLDB4ZDQsMHgwMywweGUwLDB4MDAsMHgwOCwweGFkLDB4ODAsMHgwMCwweGQ4LAorMHg5MSwweDgyLDB4MDAsMHhkZCwweDI0LDB4MDMsMHgwMCwweDAxLDB4MTAsMHg0MywweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTEsMHg4MywweDAwLDB4ZDQsMHhhZCwweDgwLDB4MDAsMHhkOCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTEsMHg4MywweDAwLDB4ZGQsCisweDAwLDB4MDQsMHgxNywweGMyLDB4MDAsMHg4MiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg0MywweGFkLDB4YTIsMHgwMCwweDAwLAorMHg5MSwweDgzLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg4MSwweDY0LDB4OGQsMHhjNSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHg4YywweDY0LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgyOCwweDQwLDB4MDAsMHgwNCwweDE4LDB4ODAsCisweDAwLDB4YTMsMHgxMCwweDJiLDB4MDAsMHg2MiwweDI4LDB4MGEsMHgwOCwweDAwLDB4MjMsMHgyMCwweGFkLDB4YzUsMHgwMCwweDAwLAorMHg5NywweDgyLDB4OGIsMHg2YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2MiwweDEwLDB4MmEsMHgxMCwweDQwLDB4ZmUsMHhiOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MSwweDgyLDB4MDAsMHhkZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MTUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTEsMHg4MywweDAwLDB4MDAsMHgyNywweDgyLDB4ODEsMHg2NCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHg2YywweDE4LDB4MjEsMHhhYywweDY0LDB4MDAsMHg2MCwKKzB4OTMsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDUsMHgxMCwweDgwLDB4MDEsMHg4MiwweDEwLDB4MjEsCisweDI0LDB4NGUsMHgwMCwweDYwLDB4YTEsMHg4NSwweDAwLDB4MDAsMHg4ZCwweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MWYsMHhjMiwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4NDMsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWQsMHhhMiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHg5MiwweGExLDB4ODAsMHgwMCwweGRkLDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweGZmLDB4ZTAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMywweDRlLAorMHgyNCwweDQyLDB4MDAsMHgwMSwweDEwLDB4YTAsMHgwMCwweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4YTcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNCwweGEyLDB4ZmYsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweGZmLDB4ZTgsMHg4ZCwweDgyLDB4MDAsMHhkMCwKKzB4MDgsMHgwMCwweDIzLDB4NGUsMHgyNCwweDQyLDB4MDAsMHgwMiwweDEwLDB4YTAsMHhmZiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4ZTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweGEyLDB4ZmYsMHg5NiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4ZjEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGY4LDB4MmQsMHgyMiwweDAwLDB4MTksCisweDE0LDB4NDAsMHhmZiwweGUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhlYywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4ODYsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIzLDB4NGUsMHgyNCwweDQyLDB4ZmYsMHhmMCwweDJkLDB4MjIsMHgwMCwweDFiLAorMHgxMCwweDQwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhjOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDE0LDB4YTIsMHhmZiwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMywweDRlLAorMHgyNCwweDQyLDB4ZmYsMHhmNCwweDJkLDB4MjIsMHgwMCwweDFlLDB4MTAsMHg0MCwweGZmLDB4ZTMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweGZmLDB4Y2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NmIsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4ZDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweGFhLAorMHgyNCwweDAyLDB4MDAsMHgwMywweDJkLDB4MjIsMHgwMCwweDIzLDB4MTAsMHg0MCwweGZmLDB4ZDcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweGZmLDB4YjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NWYsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4ZGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHg1NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4OWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmQsMHgyMiwweDAwLDB4MjUsMHgxMCwweDQwLDB4ZmYsMHhjOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4YTIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDk5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHhmNCwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMywweDRlLDB4MjQsMHg0MiwweGZmLDB4ZmMsCisweDJkLDB4MjIsMHgwMCwweDE2LDB4MTQsMHg0MCwweDAwLDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4OGYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHgzZCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4YTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjMsMHg0ZSwweDI0LDB4NDIsMHhmZiwweGZhLAorMHgxMCwweGEwLDB4ZmYsMHg5NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg4MiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweGJjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgxNywweDE0LDB4NDAsMHhmZiwweDllLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNCwweDBiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDIyLDB4MDAsMHgxOSwKKzB4MTAsMHg0MCwweGZmLDB4ZTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweDg0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweGEyLDB4ZmYsMHgxZSwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4ODksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIzLDB4OWIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNCwweDI4LDB4MmQsMHgyMiwweDAwLDB4MWIsCisweDJkLDB4MjIsMHgwMCwweDFlLDB4MTAsMHg0MCwweGZmLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweDczLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NWYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4ODgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4OWIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4MjIsMHgwMCwweDIzLAorMHgxNCwweDQwLDB4ZmYsMHhmMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIzLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIzLDB4YzAsMHgyZCwweDIyLDB4MDAsMHgyNSwweDA4LDB4MDAsMHgyMywweGY5LDB4MmQsMHgyMiwweDAwLDB4MjcsCisweDEwLDB4YTAsMHhmZiwweDVlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDRhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZlLDB4ZjgsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHhhMiwweGZmLDB4NjMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4MjIsMHgwMCwweDI3LDB4MTQsMHg0MCwweGZmLDB4OGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweGIyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4MjIsMHgwMCwweDI5LDB4MTQsMHg0MCwweGZmLDB4ODksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIzLDB4YTEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGU4LDB4M2MsMHgwMiwweGIwLDB4MDMsCisweGFmLDB4YmYsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHgzNCwweDQyLDB4MDEsMHgxOCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHg4YywweDUwLDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwMSwweDJjLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgzMiwweDA1LDB4MDAsMHgwMSwKKzB4YTMsMHg4MiwweDgwLDB4MTAsMHgxNCwweGEwLDB4MDAsMHgxNCwweDMwLDB4NDQsMHgwMCwweGZmLDB4MzIsMHgwMiwweDAxLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMiwweDAyLDB4MDgsMHgwMCwweDEwLDB4NDAsMHgwMCwweDAyLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEzLDB4ODIsMHhiYywweDA4LDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgwNSwweDM5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI2LDB4MDIsMHhmZiwweDAwLDB4YTMsMHg4MCwweGJjLDB4MDgsMHgzYywweDAxLDB4YjAsMHgwMywweGFjLDB4MjIsMHgwMSwweDE4LAorMHgwOCwweDAwLDB4MjQsMHg3NywweDMyLDB4MDIsMHgwOCwweDAwLDB4MGMsMHgwMCwweDIxLDB4OWEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjYsMHgwMiwweGZmLDB4ZmYsMHgzYywweDAxLDB4YjAsMHgwMywweGFjLDB4MjIsMHgwMSwweDE4LDB4MDgsMHgwMCwweDI0LDB4NzQsCisweDMyLDB4MDIsMHgwMSwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweGQwLAorMHhhZiwweGJmLDB4MDAsMHgxOCwweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwMiwweDAwLDB4NDAsMHgyNCwweDA3LDB4MGYsMHhmZiwKKzB4MDAsMHgwMywweDMzLDB4MDIsMHgwMCwweDAzLDB4MmQsMHgwMiwweDAwLDB4MDMsMHg0MywweDAyLDB4MzAsMHg2OSwweDBmLDB4ZmYsCisweDAwLDB4NjIsMHgxOCwweDI0LDB4MzAsMHhhNSwweDAwLDB4MDMsMHgzMCwweGM2LDB4MDAsMHhmZiwweDEwLDB4NjAsMHgwMCwweDA4LAorMHgzMSwweDA4LDB4MDAsMHhmZiwweDAxLDB4MDAsMHgzMCwweDIxLDB4MGMsMHgwMCwweDI1LDB4MzgsMHhhZiwweGE5LDB4MDAsMHgxMCwKKzB4OGYsMHhiZiwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsCisweDBjLDB4MDAsMHgyNSwweDhhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweGQ0LAorMHgwOCwweDAwLDB4MjQsMHhhMCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4YzAsMHhhZiwweGI2LDB4MDAsMHgzMCwKKzB4YWYsMHhiMywweDAwLDB4MjQsMHhhZiwweGIxLDB4MDAsMHgxYywweGFmLDB4YjAsMHgwMCwweDE4LDB4YWYsMHhiZiwweDAwLDB4M2MsCisweGFmLDB4YmUsMHgwMCwweDM4LDB4YWYsMHhiNywweDAwLDB4MzQsMHhhZiwweGI1LDB4MDAsMHgyYywweGFmLDB4YjQsMHgwMCwweDI4LAorMHhhZiwweGIyLDB4MDAsMHgyMCwweDBjLDB4MDAsMHgxNywweGM4LDB4MDAsMHg4MCwweDgwLDB4MjEsMHgwMCwweDAwLDB4YjAsMHgyMSwKKzB4MDAsMHgwMCwweDg4LDB4MjEsMHgxMCwweDQwLDB4MDAsMHgxMiwweDAwLDB4MDAsMHg5OCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgyNCwweDA1LDB4MDAsMHgwMSwweDM0LDB4NDIsMHgwMCwweGJjLAorMHgzNCwweDYzLDB4MDAsMHhiYiwweDM0LDB4ODQsMHgwMCwweGJhLDB4YTQsMHg0MCwweDAwLDB4MDAsMHhhMCwweDY1LDB4MDAsMHgwMCwKKzB4YTAsMHg4NSwweDAwLDB4MDAsMHg3YiwweGJlLDB4MDEsMHhmYywweDdiLDB4YjYsMHgwMSwweGJjLDB4N2IsMHhiNCwweDAxLDB4N2MsCisweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDQwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDQ3LDB4OTAsMHg0NCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MWEsMHgwMiwKKzB4M2MsMHgxNSwweGZkLDB4ZmYsMHgzMCwweDg0LDB4MDAsMHhmZiwweGEwLDB4NTAsMHgwMCwweDAwLDB4MzAsMHg3NCwweDAwLDB4MGYsCisweGFmLDB4YTQsMHgwMCwweDEwLDB4MDAsMHgwMCwweDkwLDB4MjEsMHgzYywweDE3LDB4MDIsMHgwMCwweDM2LDB4YjUsMHhmZiwweGZmLAorMHgzYywweDFlLDB4YjAsMHgwMywweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA0LDB4MDAsMHgwMCwweDU3LDB4MTAsMHgyNSwKKzB4MDAsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhjMSwweDI0LDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MjEsCisweDBjLDB4MDAsMHgyNiwweDUyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNiwweDAzLDB4MDAsMHgwMSwweDMwLDB4NzAsMHgwMCwweGZmLAorMHgxMCwweDQwLDB4MDAsMHg0NywweDJlLDB4MDMsMHgwMCwweDAyLDB4MTQsMHg2MCwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4Y2UsMHgyNCwweDA0LDB4MDQsMHgwMCwweDAwLDB4NTUsMHgxMCwweDI0LDB4MDAsMHg0MCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwNiwweGMxLDB4MjQsMHgwNCwweDA0LDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4ODIsMHgwMCwweDM4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEyLDB4ODAsMHgwMCwweDM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMiwweDIyLDB4MDAsMHg2MCwKKzB4MzIsMHgyMywweDBjLDB4MDAsMHgwMCwweDAzLDB4MWEsMHgwMiwweDNjLDB4MDUsMHgwMCwweDYwLDB4MDAsMHgwMiwweDExLDB4NDIsCisweDAyLDB4MjUsMHgyMCwweDI0LDB4MDAsMHg0MywweDEwLDB4MjUsMHgzYywweDAzLDB4MDQsMHgwMCwweDAyLDB4MjMsMHgyOCwweDI0LAorMHgwMCwweDA0LDB4MjQsMHg0MiwweDAwLDB4NDQsMHgxMCwweDI1LDB4MDAsMHgwNSwweDJkLDB4MDIsMHgwMCwweDQ1LDB4ODgsMHgyNSwKKzB4MTIsMHgyMCwweDAwLDB4MDUsMHgyNiwweDQyLDB4MDAsMHgwMSwweDI2LDB4YzIsMHgwMCwweDAxLDB4MzAsMHg1NiwweDAwLDB4ZmYsCisweDAyLDB4NzEsMHg5OCwweDIxLDB4MjYsMHg0MiwweDAwLDB4MDEsMHgwMiwweDVlLDB4MjAsMHgyMSwweDMwLDB4NTIsMHgwMCwweGZmLAorMHgyZSwweDQzLDB4MDAsMHgwNSwweGEwLDB4OTEsMHgwMCwweGQ4LDB4MTQsMHg2MCwweGZmLDB4Y2UsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4OGYsMHhhNSwweDAwLDB4MTAsMHgzNCwweDQyLDB4MDEsMHg0NywweGEwLDB4NDUsMHgwMCwweDAwLDB4MTIsMHg2MCwweDAwLDB4MGUsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MTIsMHhjMCwweDAwLDB4MGQsMHgzNCwweDQyLDB4MDAsMHhiYywweDAwLDB4MTMsMHgxMCwweDQwLAorMHgwMCwweDUzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweGMwLDB4MDAsMHg1MywweDEwLDB4MjEsMHgwMCwweDAyLDB4OTgsMHg4MCwKKzB4MDIsMHg3NiwweDAwLDB4MWIsMHgxNiwweGMwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNywweDAwLDB4MGQsCisweDAwLDB4MDAsMHg5OCwweDEyLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhiYywweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDA0LDB4YjAsMHgwMywweGE0LDB4NTMsMHgwMCwweDAwLDB4MzQsMHg2MywweDAwLDB4YmIsMHgzNCwweDg0LDB4MDAsMHhiYSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMCwweDYwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNCwweGM1LDB4YTAsMHg4MiwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNiwweGNlLDB4MjQsMHgwNCwweDA0LDB4ZmMsMHgwOCwweDAwLDB4MjQsMHhmMywweDAwLDB4NDAsMHg4OCwweDIxLAorMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweGJjLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgzYywweDA1LDB4YjAsMHgwMywKKzB4YTQsMHg2MCwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHhiYiwweDM0LDB4YTUsMHgwMCwweGJhLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDI0LDB4MDMsMHgwMCwweDAxLDB4YTAsMHg4MiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjQsMHhjNSwweGEwLDB4YTMsMHgwMCwweDAwLAorMHgyNywweGJkLDB4ZmYsMHhkOCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MzAsMHhkMCwweDAwLDB4ZmYsMHgyZSwweDAyLDB4MDAsMHgyZSwKKzB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMywweDAwLDB4MWMsCisweDMwLDB4YjEsMHgwMCwweGZmLDB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMCwweDgwLDB4OTAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDIwLAorMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyOCwKKzB4MmUsMHgxMywweDAwLDB4MTAsMHgyNCwweDA1LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgxMywweGEwLDB4MjQsMHgwNiwweDAxLDB4MDcsCisweDEyLDB4NjAsMHgwMCwweDM4LDB4MDIsMHgwMCwweDMwLDB4MjEsMHg4ZiwweGEyLDB4MDAsMHgzOCwweDMwLDB4YzMsMHgwMCwweDNmLAorMHgzYywweDA0LDB4YjAsMHgwOSwweDAwLDB4MDIsMHgxNCwweDAwLDB4MDAsMHg0MywweDMwLDB4MjUsMHgzNCwweDg0LDB4MDEsMHg2MCwKKzB4OTAsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweGZkLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEyLDB4MjIsMHgwMCwweDJhLDB4MmEsMHgyMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgyNCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMiwweDIyLDB4MDAsMHgyMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTIsMHgyMiwweDAwLDB4MTksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTYsMHg2MCwweGZmLDB4ZTIsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MjIsMHgwMCwweDEzLDB4MmEsMHgyMiwweDAwLDB4MDIsCisweDE0LDB4NDAsMHgwMCwweDBkLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMiwweDIyLDB4MDAsMHgwOSwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNiwweDIyLDB4ZmYsMHhkYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwNCwweDA4LDB4NGMsMHgyNCwweDA1LDB4ZmYsMHhmZiwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgzYywweDA2LDB4MGMsMHhiOCwweDA4LDB4MDAsMHgyNSwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyNSwweDZiLDB4MjQsMHgwNCwweDA4LDB4NDgsMHgxNiwweDIwLDB4ZmYsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjUsMHg2YiwweDI0LDB4MDQsMHgwOCwweDQwLDB4MDgsMHgwMCwweDI1LDB4NmIsMHgyNCwweDA0LDB4MDgsMHg0NCwKKzB4MjQsMHgwNCwweDA4LDB4NGMsMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDUsMHhmZiwweGZmLDB4MDgsMHgwMCwweDI1LDB4NjAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI1LDB4NzksMHgyNCwweDA0LDB4MDgsMHg0OCwweDE2LDB4MjAsMHhmZiwweGUwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNSwweDc5LDB4MjQsMHgwNCwweDA4LDB4NDAsMHgwOCwweDAwLDB4MjUsMHg3OSwKKzB4MjQsMHgwNCwweDA4LDB4NDQsMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgyNSwweGNhLDB4MDIsMHgyMCwweDI4LDB4MjEsCisweDA4LDB4MDAsMHgyNSwweDRlLDB4MDAsMHg0MCwweDMwLDB4MjEsMHgyNywweGJkLDB4ZmYsMHhkOCwweDJjLDB4YzIsMHgwMCwweDJlLAorMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgyMCwKKzB4YWYsMHhiMywweDAwLDB4MWMsMHgwMCwweGMwLDB4ODAsMHgyMSwweDMwLDB4YjEsMHgwMCwweGZmLDB4MDAsMHg4MCwweDkwLDB4MjEsCisweDE0LDB4NDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDE4LDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgyMCwweDdiLDB4YjIsMHgwMCwweGZjLAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAwLDB4NjAsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyOCwKKzB4MmUsMHgxMywweDAwLDB4MTAsMHgyNCwweDA1LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgxMywweGEwLDB4MjQsMHgwNiwweDAxLDB4MDcsCisweDEyLDB4NjAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDMwLDB4MjEsMHgzYywweDAzLDB4YjAsMHgwOSwweDM0LDB4NjMsMHgwMSwweDYwLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4ZmQsMHgzMCwweGM1LDB4MDAsMHgzZiwKKzB4MGMsMHgwMCwweDI2LDB4MDcsMHgwMiwweDIwLDB4MjAsMHgyMSwweDE2LDB4NjAsMHgwMCwweDBhLDB4MDAsMHg0MCwweDgwLDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHgyMiwweDAwLDB4MTUsMHgyYSwweDIyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDBmLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEyLDB4MjIsMHgwMCwweDBiLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMiwweDIyLDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjUsMHg5NiwweDAyLDB4MDAsMHgxOCwweDIxLDB4MjQsMHgwNCwweDA4LDB4NGMsCisweDI0LDB4MDUsMHhmZiwweGZmLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgzYywweDA2LDB4MGMsMHhiOCwweDA4LDB4MDAsMHgyNSwweDk2LAorMHgwMiwweDAwLDB4MTgsMHgyMSwweDA4LDB4MDAsMHgyNSwweGI4LDB4MjQsMHgwNCwweDA4LDB4NDgsMHgxNiwweDIwLDB4ZmYsMHhmNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjUsMHhiOCwweDI0LDB4MDQsMHgwOCwweDQwLDB4MDgsMHgwMCwweDI1LDB4YjgsCisweDI0LDB4MDQsMHgwOCwweDQ0LDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MjUsMHhjYSwweDAyLDB4MjAsMHgyOCwweDIxLAorMHgwOCwweDAwLDB4MjUsMHhhMiwweDAwLDB4NDAsMHgzMCwweDIxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgyYywweGMyLDB4MDAsMHgxZiwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwweDAwLDB4YzAsMHg4MCwweDIxLDB4MTQsMHg0MCwweDAwLDB4MWQsCisweDMwLDB4YTUsMHgwMCwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4MDAsMHgxOCwweDI4LDB4YTIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4MDAsMHgxMiwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4MGUsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTAsMHhhMiwweDAwLDB4MDcsMHgyNCwweDA0LDB4MDgsMHg0YywweDI2LDB4MTAsMHhmZiwweGUyLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LAorMHgyNCwweDA1LDB4ZmYsMHhmZiwweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNiwweDBkLDB4ZjgsMHgwOCwweDAwLDB4MjUsMHhkYiwKKzB4MjYsMHgxMCwweGZmLDB4ZTIsMHgwOCwweDAwLDB4MjUsMHhlMCwweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTQsMHhhMCwweGZmLDB4ZjIsCisweDI0LDB4MDQsMHgwOCwweDQwLDB4MDgsMHgwMCwweDI1LDB4ZTEsMHgyNCwweDA1LDB4ZmYsMHhmZiwweDA4LDB4MDAsMHgyNSwweGUwLAorMHgyNCwweDA0LDB4MDgsMHg0NCwweDJjLDB4YzIsMHgwMCwweDEwLDB4MTQsMHg0MCwweGZmLDB4ZWMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweDAwLDB4MTQsMHgyOCwweGEyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDBlLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHgwMCwweDBhLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4MDAsMHgwMywweDI0LDB4MDQsMHgwOCwweDRjLAorMHgwOCwweDAwLDB4MjUsMHhkYiwweDI2LDB4MTAsMHhmZiwweGYxLDB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwYywweDAwLDB4MTMsMHg1YiwKKzB4M2MsMHgwNiwweDBkLDB4YjgsMHgwOCwweDAwLDB4MjUsMHhkYiwweDI2LDB4MTAsMHhmZiwweGYxLDB4MDgsMHgwMCwweDI1LDB4ZmEsCisweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTQsMHhhMCwweGZmLDB4ZjYsMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweGZiLAorMHgyNCwweDA1LDB4ZmYsMHhmZiwweDA4LDB4MDAsMHgyNSwweGZhLDB4MjQsMHgwNCwweDA4LDB4NDQsMHgyNywweGJkLDB4ZmYsMHhlOCwKKzB4MzAsMHg4NCwweDAwLDB4ZmYsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4ODIsMHgwMCwweDM5LDB4YWYsMHhiZiwweDAwLDB4MTAsCisweDI4LDB4ODIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweDgyLDB4MDAsMHgxNywweDAwLDB4YTAsMHgzMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweDgyLDB4MDAsMHgwNSwKKzB4MjQsMHgwNCwweDA4LDB4M2MsMHg4ZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4MGMsMHgwMCwweDEzLDB4NWIsMHgzYywweDA1LDB4M2YsMHgwMCwweDI0LDB4MDQsMHgwOCwweDNjLAorMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDViLDB4MDAsMHgwMCwweDMwLDB4MjEsMHgyNCwweDA0LDB4MDgsMHgzYywKKzB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAxLDB4MjQsMHgwNCwweDA4LDB4YWMsCisweDBjLDB4MDAsMHgxMywweDNkLDB4MjQsMHgwNSwweDBmLDB4ZmYsMHgwOCwweDAwLDB4MjYsMHgxNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDA0LDB4MDgsMHgzNCwweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNSwweDNmLDB4MDAsMHgyNCwweDA0LDB4MDgsMHgzNCwKKzB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1YiwweDAwLDB4MDAsMHgzMCwweDIxLDB4MjQsMHgwNCwweDA4LDB4MzQsCisweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwweDA4LDB4MDAsMHgyNiwweDI0LAorMHgyNCwweDA0LDB4MDgsMHhhOCwweDE0LDB4ODAsMHhmZiwweGRmLDB4MDAsMHhhMCwweDMwLDB4MjEsMHgyNCwweDA0LDB4MDgsMHgyNCwKKzB4MGMsMHgwMCwweDEzLDB4NWIsMHgzYywweDA1LDB4M2YsMHgwMCwweDI0LDB4MDQsMHgwOCwweDI0LDB4M2MsMHgwNSwweDgwLDB4MDAsCisweDBjLDB4MDAsMHgxMywweDViLDB4MDAsMHgwMCwweDMwLDB4MjEsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHg4MCwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1YiwweDI0LDB4MDYsMHgwMCwweDAxLDB4MDgsMHgwMCwweDI2LDB4MjQsMHgyNCwweDA0LDB4MDgsMHhhMCwKKzB4MDAsMHhhMCwweDMwLDB4MjEsMHgyNCwweDA0LDB4MDgsMHgyYywweDBjLDB4MDAsMHgxMywweDViLDB4M2MsMHgwNSwweDNmLDB4MDAsCisweDI0LDB4MDQsMHgwOCwweDJjLDB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1YiwweDAwLDB4MDAsMHgzMCwweDIxLAorMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHg4MCwweDAwLDB4MGMsMHgwMCwweDEzLDB4NWIsMHgyNCwweDA2LDB4MDAsMHgwMSwKKzB4MDgsMHgwMCwweDI2LDB4MjQsMHgyNCwweDA0LDB4MDgsMHhhNCwweDNjLDB4MDUsMHgwMCwweDE0LDB4M2MsMHgwMiwweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwNCwweDIwLDB4M2MsMHgwNiwweGMwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LAorMHgzNCwweGE1LDB4MTcsMHgwOSwweGFjLDB4NDUsMHgwMCwweDAwLDB4MzQsMHhjNiwweDA1LDB4MDcsMHgzNCwweDYzLDB4MDQsMHgyNCwKKzB4MzQsMHg4NCwweDAyLDB4MjgsMHgzYywweDA3LDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDIwLDB4YWMsMHg2NiwweDAwLDB4MDAsCisweDM0LDB4ZTcsMHgwNCwweDUwLDB4YTAsMHg4MiwweDAwLDB4MDAsMHg5MCwweGUyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMywweDEwLDB4NDAsMHhmZiwweGZjLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MywweDg1LDB4ODEsMHhmMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTQsMHhhMiwweDAwLDB4NTEsCisweDAwLDB4ODAsMHg0MCwweDIxLDB4OGMsMHg4OSwweDAwLDB4MDQsMHgzYywweDAzLDB4YjAsMHgwMSwweDAxLDB4MjMsMHgzMCwweDIxLAorMHg4YywweGMyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDgsMHgxMCwweDQ1LDB4MDAsMHg1OSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NCwweGMyLDB4MDAsMHgzOCwweDI0LDB4MDMsMHgwMCwweGI0LDB4MzAsMHg0NCwweDAwLDB4ZmYsCisweDEwLDB4ODMsMHgwMCwweDYxLDB4MjQsMHgwMiwweDAwLDB4YzQsMHgxMCwweDgyLDB4MDAsMHg1NCwweDI0LDB4MDIsMHgwMCwweDk0LAorMHgxMCwweDgyLDB4MDAsMHg0NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0NywweGZmLDB4ZmYsMHgzMCwweGUzLDB4NDAsMHhmZiwweDI0LDB4MDIsMHg0MCwweDg4LDB4MTQsMHg2MiwweDAwLDB4MzksCisweDMwLDB4ZTMsMHgwMywweDAwLDB4MjQsMHgwMiwweDAzLDB4MDAsMHgxMCwweDYyLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NCwweGMyLDB4MDAsMHg1NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0NywweGZmLDB4ZmYsMHgzMCwweGUyLDB4MDAsMHg4MCwKKzB4MTQsMHg0MCwweDAwLDB4MzAsMHgzYywweDAyLDB4YjAsMHgwMSwweDAxLDB4MjIsMHgzMCwweDIxLDB4OTQsMHhjMywweDAwLDB4NjAsCisweDI0LDB4MDIsMHgwMCwweDA4LDB4MTQsMHg0MywweDAwLDB4M2IsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4YzIsMHgwMCwweDYyLAorMHgyNCwweDAzLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgzOSwweDAyLDB4MTAsMHhlMywweDAwLDB4MTUsMHgyNCwweDAyLDB4MDAsMHgwNiwKKzB4MTQsMHhlMiwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4MDUsMHgwMSwweGFjLDB4OTQsMHhjNCwweDAwLDB4NjYsCisweDI3LDB4ODIsMHg4OSwweDU4LDB4MDAsMHgwNSwweDI4LDB4ODAsMHgzMCwweDg3LDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgyOCwweDIxLAorMHgwMCwweDA3LDB4MWEsMHgwMCwweDhjLDB4YTQsMHgwMCwweDAwLDB4MDAsMHgwNywweDEyLDB4MDIsMHgwMCwweDQzLDB4MTAsMHgyNSwKKzB4MjQsMHg0MiwweDAwLDB4NWUsMHgyNCwweDAzLDB4YzAsMHgwMCwweDMwLDB4NDcsMHhmZiwweGZmLDB4MDAsMHg4MywweDIwLDB4MjQsCisweDAwLDB4ODcsMHgyMCwweDI1LDB4YWMsMHhhNCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjYsMHhjZCwweGFkLDB4MDcsMHgwMCwweDEwLAorMHg4ZCwweDA1LDB4MDEsMHhhYywweDk0LDB4YzQsMHgwMCwweDY0LDB4MjcsMHg4MiwweDg5LDB4NTgsMHgwMCwweDA1LDB4MjgsMHg4MCwKKzB4MzAsMHg4NywweGZmLDB4ZmYsMHgwMCwweGEyLDB4MjgsMHgyMSwweDAwLDB4MDcsMHgxYSwweDAwLDB4OGMsMHhhNCwweDAwLDB4MDAsCisweDAwLDB4MDcsMHgxMiwweDAyLDB4MDAsMHg0MywweDEwLDB4MjUsMHgyNCwweDQyLDB4MDAsMHgzNiwweDNjLDB4MDMsMHhmZiwweGZmLAorMHgzMCwweDQ3LDB4ZmYsMHhmZiwweDAwLDB4ODMsMHgyMCwweDI0LDB4MDAsMHg4NywweDIwLDB4MjUsMHhhYywweGE0LDB4MDAsMHgwMCwKKzB4YWQsMHgwNywweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4NTAsCisweDA4LDB4MDAsMHgyNiwweDhiLDB4MzAsMHg0NywweGZmLDB4ZmYsMHg4ZCwweDA0LDB4MDEsMHhhYywweDI3LDB4ODMsMHg4OSwweDU4LAorMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ZmYsMHhmZiwKKzB4MDAsMHg0MywweDEwLDB4MjQsMHgzNCwweDQyLDB4MDAsMHgyZSwweGFjLDB4ODIsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MmUsCisweGFkLDB4MDMsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4MDQsMHgwMSwweGFjLAorMHgyNywweDgzLDB4ODksMHg1OCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MywweDIwLDB4MjEsMHg4YywweDgyLDB4MDAsMHgwMCwKKzB4M2MsMHgwMywweGZmLDB4ZmYsMHgwMCwweDQzLDB4MTAsMHgyNCwweDM0LDB4NDIsMHgwMCwweDBlLDB4MjQsMHgwMywweDAwLDB4MGUsCisweDA4LDB4MDAsMHgyNiwweGNjLDB4YWMsMHg4MiwweDAwLDB4MDAsMHg4ZCwweDA0LDB4MDEsMHhhYywweDI3LDB4ODMsMHg4OSwweDU4LAorMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ZmYsMHhmZiwKKzB4MDAsMHg0MywweDEwLDB4MjQsMHgzNCwweDQyLDB4MDAsMHgxNCwweDI0LDB4MDMsMHgwMCwweDE0LDB4MDgsMHgwMCwweDI2LDB4Y2MsCisweGFjLDB4ODIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YzYsMHgwMCwweGZmLAorMHgwMCwweDA2LDB4NDgsMHg0MCwweDAxLDB4MjYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDhiLDB4YmMsMHgyMCwKKzB4MjcsMHg4MywweGJjLDB4MjYsMHgwMCwweDRiLDB4NDAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLDB4OTQsMHg0NywweDAwLDB4MDAsCisweDMwLDB4YTIsMHgzZiwweGZmLDB4MTAsMHhlMiwweDAwLDB4MjksMHgzMCwweDhhLDB4ZmYsMHhmZiwweDk1LDB4MDIsMHgwMCwweDAyLAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxMSwweDgyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweDQzLDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDI2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0YiwweDMwLDB4MjEsCisweDk0LDB4YzQsMHgwMCwweDAyLDB4MjcsMHg4MywweGJjLDB4MjYsMHgyNywweDg1LDB4YmMsMHgyNCwweDAwLDB4NDUsMHgyOCwweDIxLAorMHgzMCwweDg0LDB4ZmYsMHhkZiwweDAwLDB4NDMsMHgxMCwweDIxLDB4YTQsMHhjNCwweDAwLDB4MDIsMHhhNCwweDQwLDB4MDAsMHgwMCwKKzB4YTQsMHhhMCwweDAwLDB4MDAsMHg5NCwweGMzLDB4MDAsMHgwMiwweDNjLDB4MDQsMHhiMCwweDAxLDB4MDEsMHg0NCwweDIwLDB4MjEsCisweDMwLDB4NjMsMHhmZiwweGJmLDB4YTQsMHhjMywweDAwLDB4MDIsMHhhMCwweGMwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDA0LAorMHgyNCwweDAzLDB4ZjAsMHhmZiwweDAwLDB4NDMsMHgxMCwweDI0LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweDgyLDB4MDAsMHgwNCwKKzB4MjQsMHgwMiwweGMwLDB4MDAsMHg5MSwweDA0LDB4MDAsMHgwMSwweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0NywweDI4LDB4MjUsCisweDNjLDB4MDMsMHhiMCwweDAxLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxNCwweDgyLDB4ZmYsMHhlMiwweDAxLDB4NDMsMHgxOCwweDIxLAorMHhhYywweDY1LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNiwweGZhLDB4MDEsMHgyNiwweDEwLDB4MjEsMHgwOCwweDAwLDB4MjYsMHhmYSwKKzB4MDEsMHgyNiwweDEwLDB4MjEsMHg5MywweDgzLDB4ODEsMHhmMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTQsMHg2MiwweDAwLDB4MGQsCisweDNjLDB4MDIsMHhiMCwweDAxLDB4OGMsMHg4NCwweDAwLDB4MDQsMHgzYywweDA2LDB4YjAsMHgwOSwweDAwLDB4ODIsMHgyMCwweDIxLAorMHg4YywweDg1LDB4MDAsMHgwOCwweDhjLDB4ODMsMHgwMCwweDA0LDB4M2MsMHgwMiwweDAxLDB4MDAsMHgzNCwweGM2LDB4MDEsMHgwMCwKKzB4MDAsMHg2MiwweDE4LDB4MjQsMHgxNCwweDYwLDB4MDAsMHgwNSwweDMwLDB4YTUsMHgyMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDYsCisweGEwLDB4YzIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDA5LAorMHgxMCwweGEwLDB4ZmYsMHhmYywweDM0LDB4NjMsMHgwMSwweDAwLDB4MjQsMHgwMiwweDAwLDB4MGUsMHgwOCwweDAwLDB4MjcsMHgyZCwKKzB4YTAsMHg2MiwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMSwweDMwLDB4YTUsMHhmZiwweGZmLDB4MDAsMHhhMiwweDI4LDB4MjEsCisweDhjLDB4YTMsMHgwMCwweDAwLDB4M2MsMHgwMiwweDEwLDB4MDAsMHgwMCwweDgwLDB4MzAsMHgyMSwweDAwLDB4NjIsMHgxOCwweDI0LAorMHg4YywweGEyLDB4MDAsMHgwNCwweDEwLDB4NjAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4ODAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4MTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4YzIsMHgwMSwweGE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4NDQsMHgwMCwweDAxLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg0MCwweDAwLDB4ODMsMHgxMCwweDBhLAorMHg5MywweDgzLDB4ODEsMHhmMCwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMywKKzB4MjQsMHg2MywweGZmLDB4ZmYsMHhhYywweGM0LDB4MDEsMHhhOCwweGEzLDB4ODMsMHg4MSwweGYwLDB4OGMsMHhjNCwweDAxLDB4YWMsCisweDhjLDB4YzIsMHgwMSwweGE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyNiwweDAwLDB4MDIsMHgxMCwweDJiLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHg3MywKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTMsMHg4MCwweDgxLDB4ZjEsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEzLDB4ODIsMHg4MSwweGYxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhhOCwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NjIsMHgwMCwweGZmLDB4MDAsMHgwMywweDJlLDB4MDIsMHgwMCwweDAyLDB4MzksMHg4MCwweDJjLDB4YTIsMHgwMCwweDAyLAorMHgwMCwweDAzLDB4MzQsMHgwMiwweDEwLDB4NDAsMHgwMCwweDA1LDB4MDAsMHgwMywweDFhLDB4MDIsMHhhNCwweDg3LDB4MDEsMHhkOCwKKzB4YTAsMHg4NSwweDAxLDB4ZDQsMHhhMCwweDg2LDB4MDEsMHhkNSwweGEwLDB4ODMsMHgwMSwweGQ2LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDQsMHgzYywweDA1LDB4YjAsMHgwMSwweDAwLDB4ODAsMHg1MCwweDIxLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDUsMHgwMCwweDAzLDB4MWEsMHgwMiwKKzB4MzAsMHg2OSwweDAwLDB4MGYsMHgxMSwweDIyLDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDA3LDB4MTEsMHgyMiwweDAwLDB4MDksCisweDI0LDB4MDIsMHgwMCwweDBhLDB4MTEsMHgyMiwweDAwLDB4MDcsMHgyNCwweDAyLDB4MDAsMHgwYiwweDExLDB4MjIsMHgwMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDkzLDB4ODMsMHg4MSwweGYwLDB4M2MsMHgwNCwweGIwLDB4MDYsMHgxMCwweDYyLDB4MDAsMHgwMywKKzB4MzQsMHg4NCwweDgwLDB4MTgsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4MDIsMHgxNCwweDQwLDB4ZmYsMHhmYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDQzLDB4MDEsMHhhOCwweDI3LDB4ODIsMHg4OSwweDU4LDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDZhLDB4MjAsMHgyMSwKKzB4OGMsMHg4NywweDAwLDB4YTgsMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjgsMHgwMCwweDAwLDB4MDAsMHhlNSwweDI4LDB4MjEsCisweDhjLDB4YTksMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgyNywweDgzLDB4OGEsMHg1OCwweDAxLDB4MjIsMHgxMCwweDI0LAorMHgwMCwweDQ4LDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDAwLDB4OGQsMHg0NCwweDAxLDB4YTgsMHgwMCwweDA3LDB4MzAsMHhjMiwKKzB4M2MsMHgwMiwweDAwLDB4ODAsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4MDAsMHgwNiwweDMyLDB4MDAsCisweDhjLDB4YTksMHgwMCwweDA0LDB4MDAsMHhjMiwweDMwLDB4MjUsMHg4YywweDgyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHg4MCwweDAwLAorMHgwMSwweDIyLDB4MTAsMHgyNSwweDAwLDB4NDMsMHgxMCwweDI1LDB4YWMsMHhhMiwweDAwLDB4MDQsMHhhZiwweDg3LDB4YmMsMHgxMCwKKzB4OGMsMHhhMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODIsMHhiYywweDE4LDB4OGMsMHhhMywweDAwLDB4MDQsCisweDNjLDB4MDEsMHhiMCwweDA3LDB4YWMsMHgyNiwweDgwLDB4MTgsMHg4ZCwweDQyLDB4MDEsMHhhOCwweGFmLDB4ODMsMHhiYywweDE0LAorMHg5MywweDg1LDB4ODEsMHhmMCwweDI0LDB4NDQsMHgwMCwweDAxLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg0MCwKKzB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MjQsMHhhNSwweGZmLDB4ZmYsCisweDAwLDB4ODIsMHgyMCwweDIzLDB4YWQsMHg0NCwweDAxLDB4YTgsMHhhMywweDg1LDB4ODEsMHhmMCwweDA4LDB4MDAsMHgyNywweDg5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgyNCwweDQyLDB4OWYsMHgwNCwKKzB4MzQsMHhhNSwweDAwLDB4MjAsMHhhYywweGEyLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MjAsCisweGFjLDB4ODIsMHgwMCwweDY0LDB4M2MsMHgwMiwweDgwLDB4MDEsMHhhYywweDgzLDB4MDAsMHg2MCwweDAwLDB4ODAsMHgzOCwweDIxLAorMHhhYywweDgwLDB4MDAsMHgwMCwweGFjLDB4ODAsMHgwMCwweDA0LDB4YWMsMHg4MCwweDAwLDB4MDgsMHhhYywweDgwLDB4MDAsMHg0YywKKzB4YWMsMHg4MCwweDAwLDB4NTAsMHhhYywweDgwLDB4MDAsMHg1NCwweGFjLDB4ODAsMHgwMCwweDBjLDB4YWMsMHg4MCwweDAwLDB4NTgsCisweGEwLDB4ODAsMHgwMCwweDVjLDB4MjQsMHg4MywweDAwLDB4NjgsMHgyNCwweDQyLDB4YTAsMHgxNCwweDI0LDB4MDQsMHgwMCwweDBmLAorMHgyNCwweDg0LDB4ZmYsMHhmZiwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDQsMHg4MSwweGZmLDB4ZmQsMHgyNCwweDYzLDB4MDAsMHgwNCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhhOCwweGFjLDB4ZTAsMHgwMSwweGE4LDB4YWMsMHhlMCwweDAxLDB4YWMsCisweGFjLDB4ZTAsMHgwMSwweGIwLDB4YWMsMHhlMCwweDAxLDB4YjQsMHhhMCwweGUwLDB4MDEsMHhiOCwweGEwLDB4ZTAsMHgwMSwweGI5LAorMHhhMCwweGUwLDB4MDEsMHhiYSwweGEwLDB4ZTAsMHgwMSwweGMwLDB4YTAsMHhlMCwweDAxLDB4YzEsMHhhYywweGUwLDB4MDEsMHhjNCwKKzB4YWMsMHhlMCwweDAxLDB4YzgsMHhhYywweGUwLDB4MDEsMHhjYywweGFjLDB4ZTAsMHgwMSwweGQwLDB4OGMsMHg0NCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweGEwLDB4ZmMsMHgzMCwweDgzLDB4MDAsMHhmZiwweDAwLDB4MDMsMHgxOSwweDgwLAorMHhhNCwweGUzLDB4MDEsMHhkOCwweGFjLDB4ZTIsMHgwMCwweDc4LDB4M2MsMHgwMywweDgwLDB4MDEsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MjQsMHg2MywweGEyLDB4ODgsMHgyNCwweDQyLDB4YTEsMHhmNCwweGFjLDB4ZTMsMHgwMCwweDg4LDB4YWMsMHhlMiwweDAwLDB4OTgsCisweDNjLDB4MDMsMHg4MCwweDAxLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgwMCwweDA0LDB4MmUsMHgwMywweDAwLDB4MDQsMHgzNCwweDAzLAorMHgyNCwweDYzLDB4YTMsMHgzMCwweDAwLDB4MDQsMHgyMiwweDAzLDB4MjQsMHg0MiwweGE0LDB4NzQsMHhhYywweGUzLDB4MDAsMHhhMCwKKzB4YWMsMHhlMiwweDAwLDB4YTQsMHhhMCwweGU1LDB4MDEsMHhkNCwweGEwLDB4ZTYsMHgwMSwweGQ1LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGEwLDB4ZTQsMHgwMSwweGQ2LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwweDM0LDB4NjMsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4YTAsMHgxNCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweDgwLDB4MDEsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMCwweDJjLDB4YWMsMHg0MywweDAwLDB4MDAsCisweDhjLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxMSwweDAwLDB4ODAsMHgyOCwweDIxLAorMHg4YywweDgyLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHg4NCwweDAwLDB4MTAsMHg4YywweGEzLDB4MDAsMHgxNCwweDhjLDB4YTIsMHgwMCwweDA0LDB4MDAsMHg4MywweDIwLDB4MjEsCisweDAwLDB4NDQsMHgxMCwweDIxLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTgsMHgyYiwweDAwLDB4MDIsMHgxMiwweDAyLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMiwweDAwLDB4MzAsMHg0MiwweDNmLDB4ZmYsMHhhYywweGEyLDB4MDAsMHgwNCwKKzB4YWMsMHhhMCwweDAwLDB4MDAsMHhhYywweGEwLDB4MDAsMHg0YywweGFjLDB4YTAsMHgwMCwweDUwLDB4YWMsMHhhMCwweDAwLDB4NTQsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhhMCwweDAwLDB4MGMsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHhhMCwweGE4LDB4YWMsMHg2MiwweDAwLDB4MDAsMHg4YywweDg2LDB4MDAsMHgwNCwKKzB4M2MsMHgwMiwweGIwLDB4MDEsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4YzIsMHgxMCwweDIxLDB4OGMsMHg0NSwweDAwLDB4MDAsCisweGFjLDB4ODMsMHgwMCwweDRjLDB4MDAsMHgwNSwweDE0LDB4MDIsMHgzMCwweGEzLDB4M2YsMHhmZiwweDMwLDB4NDIsMHgwMCwweGZmLAorMHhhYywweDgzLDB4MDAsMHgxMCwweGFjLDB4ODIsMHgwMCwweDE0LDB4OGMsMHg4MywweDAwLDB4MTQsMHhhYywweDg1LDB4MDAsMHg0MCwKKzB4MDAsMHhjMywweDMwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODYsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMCwweGZjLAorMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg0YywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYSwweDAwLDB4ODAsMHg4MCwweDIxLDB4YWUsMHgwMCwweDAwLDB4MDAsCisweGFlLDB4MDAsMHgwMCwweDRjLDB4YWUsMHgwMCwweDAwLDB4NTAsMHhhZSwweDAwLDB4MDAsMHg1NCwweGFlLDB4MDAsMHgwMCwweDBjLAorMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwKKzB4MGMsMHgwMCwweDI4LDB4MmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweDRjLDB4YWUsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLAorMHgyNCwweDYzLDB4YTEsMHg2MCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwKKzB4OGMsMHg4MiwweDAwLDB4NGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDE2LDB4MDAsMHg4MCwweDgwLDB4MjEsCisweDhlLDB4MDMsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDEsMHg4ZSwweDA0LDB4MDAsMHg0NCwweDAwLDB4NjIsMHgxOCwweDIxLAorMHg5MCwweDY1LDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YWUsMHgwMiwweDAwLDB4NTAsMHgzMCwweGEzLDB4MDAsMHhmZiwKKzB4MDAsMHgwMywweDEwLDB4ODIsMHgwMCwweDA0LDB4MjMsMHgwMiwweDMwLDB4ODQsMHgwMCwweDBmLDB4MzAsMHg0MiwweDAwLDB4MDMsCisweDAwLDB4MDMsMHgxOSwweDAyLDB4YWUsMHgwNCwweDAwLDB4MzQsMHhhZSwweDAyLDB4MDAsMHgyYywweGFlLDB4MDMsMHgwMCwweDMwLAorMHhhMiwweDA1LDB4MDAsMHg0OCwweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjgsMHgyYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI4LDB4NjQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDI3LDB4YmQsMHhmZiwweGU4LAorMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMSwweGY0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwKKzB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTYsCisweDAwLDB4ODAsMHg4MCwweDIxLDB4OTIsMHgwMywweDAwLDB4NDQsMHg4ZSwweDAyLDB4MDAsMHg0MCwweDgzLDB4ODUsMHg4YiwweGM0LAorMHg5MiwweDA0LDB4MDAsMHg0MSwweDMwLDB4NjMsMHgwMCwweDAxLDB4MDAsMHgwMiwweDE2LDB4MDIsMHhhZSwweDA0LDB4MDAsMHgxNCwKKzB4MDAsMHgwMCwweDMwLDB4MjEsMHhhZSwweDAyLDB4MDAsMHgxOCwweDEwLDB4YTAsMHgwMCwweDA0LDB4YWUsMHgwMywweDAwLDB4M2MsCisweDEwLDB4NjAsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgyNCwweDA2LDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMywweDg2LDB4OGIsMHhjNCwweDhmLDB4YmYsMHgwMCwweDE0LDB4YWUsMHgwMiwweDAwLDB4NTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyOCwweDU4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyOCwweDg5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLAorMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGEyLDB4ODgsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDFiLDB4MDAsMHg4MCwweDgwLDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywweDhjLDB4NDIsMHgwMCwweDAwLAorMHg5MiwweDA0LDB4MDAsMHg0NCwweDhlLDB4MDMsMHgwMCwweDQwLDB4ODMsMHg4NiwweDhiLDB4YzQsMHg5MiwweDA1LDB4MDAsMHg0MSwKKzB4MzAsMHg0MiwweDA4LDB4MDAsMHgzMCwweDg0LDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxMiwweGMyLDB4MDAsMHgwMywweDFlLDB4MDIsCisweDAwLDB4ODIsMHgyMCwweDI1LDB4YWUsMHgwNSwweDAwLDB4MTQsMHgwMCwweDAwLDB4MzgsMHgyMSwweGFlLDB4MDMsMHgwMCwweDE4LAorMHgxMCwweGMwLDB4MDAsMHgwNCwweGFlLDB4MDQsMHgwMCwweDNjLDB4MTAsMHg4MCwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MjQsMHgwNywweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwweGEzLDB4ODcsMHg4YiwweGM0LDB4OGYsMHhiZiwweDAwLDB4MTQsCisweGFlLDB4MDIsMHgwMCwweDU0LDB4OGYsMHhiMCwweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LAorMHgwYywweDAwLDB4MjgsMHg1OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI4LDB4YWUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDI3LDB4YmQsMHhmZiwweGU4LDB4MzQsMHg0MiwweDAwLDB4MjAsCisweDI0LDB4NjMsMHhhMywweDMwLDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwweGFjLDB4NDMsMHgwMCwweDAwLAorMHg4YywweDgyLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4NDIsMHgwMCwweDgwLDB4ODAsMHgyMSwKKzB4OGUsMHgwNCwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDAsMHg0NCwweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwOCwweGIwLDB4MDEsCisweDM0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHg4OCwweDIwLDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyNSwweGFjLDB4ODMsMHgwMCwweDA0LAorMHg4ZSwweDAyLDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMSwweGFjLDB4MjcsMHg4OSwweDg5LDB4NTgsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4OGMsMHg0NSwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjksMHgxOCwweDIxLDB4YWMsMHg2NSwweDAwLDB4MDAsCisweDhlLDB4MDIsMHgwMCwweDA0LDB4OGUsMHgwMywweDAxLDB4YWMsMHgyNywweDg3LDB4OGEsMHg1OCwweDAwLDB4NDgsMHgxMCwweDIxLAorMHg4YywweDQ1LDB4MDAsMHgwNCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2NywweDE4LDB4MjEsMHhhYywweDY1LDB4MDAsMHgwMCwKKzB4OGUsMHgwMiwweDAxLDB4YWMsMHg4ZSwweDA2LDB4MDAsMHgwNCwweDAyLDB4MDAsMHgyMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDcsMHgzOCwweDIxLDB4OTQsMHhlMywweDAwLDB4MDIsMHgwMCwweDQ5LDB4MTAsMHgyMSwweDkwLDB4NDUsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MWEsMHgwMCwweDAwLDB4YzgsMHgzMCwweDIxLDB4MDAsMHhhMywweDI4LDB4MjUsMHgwYywweDAwLDB4MjYsMHg2OSwKKzB4YTQsMHhjNSwweDAwLDB4MmUsMHg4ZSwweDAzLDB4MDEsMHhhYywweDhlLDB4MDcsMHgwMCwweDA0LDB4M2MsMHgwNiwweGIwLDB4MDMsCisweDI0LDB4NjUsMHgwMCwweDAxLDB4MjgsMHhhNCwweDAwLDB4MDAsMHgyNCwweDYyLDB4MDAsMHg0MCwweDAwLDB4YTQsMHgxMCwweDBhLAorMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweGEyLDB4MjgsMHgyMywKKzB4MDAsMHg3MCwweDE4LDB4MjEsMHhhZSwweDA1LDB4MDEsMHhhYywweGFjLDB4NjcsMHgwMCwweGE4LDB4MzQsMHhjNiwweDAwLDB4MzAsCisweDhjLDB4YzMsMHgwMCwweDAwLDB4OTMsMHg4MiwweDgxLDB4ZjAsMHgwMiwweDAwLDB4MjAsMHgyMSwweDI0LDB4NjMsMHgwMCwweDAxLAorMHgyNCwweDQyLDB4MDAsMHgwMSwweGFjLDB4YzMsMHgwMCwweDAwLDB4YTMsMHg4MiwweDgxLDB4ZjAsMHgwYywweDAwLDB4MjgsMHgwYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4MGMsMHgwMCwweDI4LDB4YTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweGQ4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwKKzB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YTQsMHg3NCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDQyLAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDhlLDB4MDQsMHgwMCwweDA0LDB4OGUsMHgwMywweDAwLDB4NDQsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4M2MsMHgwOCwweGIwLDB4MDEsMHgzNCwweDQyLDB4MDAsMHgxMCwweDAwLDB4ODgsMHgyMCwweDIxLDB4MDAsMHg2MiwweDE4LDB4MjUsCisweGFjLDB4ODMsMHgwMCwweDA0LDB4OGUsMHgwMiwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDEsMHhhYywweDI3LDB4ODksMHg4OSwweDU4LAorMHgwMCwweDQ4LDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY5LDB4MTgsMHgyMSwKKzB4YWMsMHg2NSwweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMSwweGFjLDB4MjcsMHg4NywweDhhLDB4NTgsCisweDAwLDB4NDgsMHgxMCwweDIxLDB4OGMsMHg0NSwweDAwLDB4MDQsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjcsMHgxOCwweDIxLAorMHhhYywweDY1LDB4MDAsMHgwMCwweDhlLDB4MDIsMHgwMSwweGFjLDB4OGUsMHgwNiwweDAwLDB4MDQsMHgwMiwweDAwLDB4MjAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MzgsMHgyMSwweDk0LDB4ZTMsMHgwMCwweDAyLDB4MDAsMHg0OSwweDEwLDB4MjEsCisweDkwLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgwMywweDFhLDB4MDAsMHgwMCwweGM4LDB4MzAsMHgyMSwweDAwLDB4YTMsMHgyOCwweDI1LAorMHgwYywweDAwLDB4MjYsMHg2OSwweGE0LDB4YzUsMHgwMCwweDJlLDB4OGUsMHgwMywweDAxLDB4YWMsMHg4ZSwweDA3LDB4MDAsMHgwNCwKKzB4M2MsMHgwNiwweGIwLDB4MDMsMHgyNCwweDY1LDB4MDAsMHgwMSwweDI4LDB4YTQsMHgwMCwweDAwLDB4MjQsMHg2MiwweDAwLDB4NDAsCisweDAwLDB4YTQsMHgxMCwweDBhLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweGEyLDB4MjgsMHgyMywweDAwLDB4NzAsMHgxOCwweDIxLDB4YWUsMHgwNSwweDAxLDB4YWMsMHhhYywweDY3LDB4MDAsMHhhOCwKKzB4MzQsMHhjNiwweDAwLDB4MzAsMHg4YywweGMzLDB4MDAsMHgwMCwweDkzLDB4ODIsMHg4MSwweGYwLDB4MDIsMHgwMCwweDIwLDB4MjEsCisweDI0LDB4NjMsMHgwMCwweDAxLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhYywweGMzLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4MSwweGYwLAorMHgwYywweDAwLDB4MjgsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyOCwweGEyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyOSwweDI5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLAorMHgyNywweGJkLDB4ZmYsMHhkOCwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGE1LDB4YjgsMHhhZiwweGIyLDB4MDAsMHgxOCwKKzB4YWMsMHg0MywweDAwLDB4MDAsMHgzYywweDEyLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLDB4YWYsMHhiNCwweDAwLDB4MjAsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDI0LAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDI0LDB4NTQsMHhhMCwweDE0LDB4MDAsMHgwMCwweDg4LDB4MjEsMHgzYywweDEzLDB4YjAsMHgwMSwKKzB4MzYsMHg1MiwweDAwLDB4ZWYsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMCwweDA2LDB4OTAsMHg0MywweDAwLDB4MDAsCisweDhlLDB4MDQsMHgwMCwweDA0LDB4OTIsMHgwMiwweDAxLDB4YmIsMHgzMCwweDY5LDB4MDAsMHhmZiwweDAwLDB4MDQsMHg0MiwweDAyLAorMHgxMCwweDQwLDB4MDAsMHgxZSwweDAwLDB4MDAsMHgzOCwweDIxLDB4OGUsMHgwMywweDAxLDB4YTgsMHgzYywweDA2LDB4MjgsMHgzOCwKKzB4MzQsMHhjNiwweDAwLDB4MjAsMHgyNCwweDY0LDB4MDAsMHgzZCwweDI4LDB4ODIsMHgwMCwweDAwLDB4MjQsMHg2MywweDAwLDB4N2MsCisweDAwLDB4ODIsMHgxOCwweDBhLDB4MDAsMHgwMywweDE5LDB4ODMsMHgwMCwweDAzLDB4MTksMHg4MCwweDAwLDB4ODMsMHgyMCwweDIzLAorMHgwMCwweDA0LDB4MTAsMHg4MCwweDAwLDB4NTAsMHgxMCwweDIxLDB4OGMsMHg0NSwweDAwLDB4YTgsMHhhZSwweDA0LDB4MDEsMHhhYywKKzB4YWUsMHgwNCwweDAxLDB4YTgsMHgwMCwweGIzLDB4MTgsMHgyMSwweGFlLDB4MDUsMHgwMCwweDA0LDB4YWMsMHg2NiwweDAwLDB4MDAsCisweDhlLDB4MDIsMHgwMCwweDA0LDB4M2MsMHgwMywweDgwLDB4MDAsMHgzNCwweDYzLDB4NGUsMHgwMCwweDAwLDB4NTMsMHgxMCwweDIxLAorMHhhYywweDQzLDB4MDAsMHgwNCwweGEyLDB4MDAsMHgwMSwweGJiLDB4OTMsMHg4MywweDgxLDB4ZjcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHg2MiwweDAwLDB4MDEsMHhhMywweDgyLDB4ODEsMHhmNywweGEyLDB4NDMsMHgwMCwweDAwLDB4MDEsMHgyOCwweDEwLDB4MjMsCisweDI0LDB4NDQsMHgwMCwweDQwLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg3ZiwweDAwLDB4ODMsMHgxMCwweDBhLAorMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MjQsMHg4NCwweGZmLDB4ZmYsMHgxMCwweDQ0LDB4MDAsMHg2YiwKKzB4M2MsMHgwMiwweGIwLDB4MDEsMHg4ZSwweDAzLDB4MDAsMHgwNCwweDNjLDB4MDQsMHg3YywweDAwLDB4MDAsMHg2MiwweDE4LDB4MjEsCisweDhjLDB4NjUsMHgwMCwweDA0LDB4MzQsMHg4NCwweDAwLDB4ZjAsMHgwMCwweDAwLDB4MzAsMHgyMSwweGFlLDB4MDUsMHgwMCwweDQ0LAorMHgwMCwweGE0LDB4MjAsMHgyNCwweDhjLDB4NjMsMHgwMCwweDAwLDB4MTAsMHg4MCwweDAwLDB4NmIsMHgzYywweDAyLDB4ZmYsMHhmZiwKKzB4M2MsMHgwOSwweGIwLDB4MDMsMHgzYywweDA1LDB4N2MsMHgwMCwweDM1LDB4MjksMHgwMCwweDk5LDB4M2MsMHgwYSwweGIwLDB4MDEsCisweDI0LDB4MDgsMHgwMCwweDQwLDB4MzQsMHhhNSwweDAwLDB4ZjAsMHgzYywweDBiLDB4ZmYsMHhmZiwweDNjLDB4MGMsMHgyOCwweDM4LAorMHgxNiwweDIwLDB4MDAsMHgwNiwweDI0LDB4ZTcsMHgwMCwweDAxLDB4OTMsMHg4MiwweDgxLDB4ZjYsMHgyNCwweDExLDB4MDAsMHgwMSwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhMSwweDIyLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4MSwweGY2LDB4OGUsMHgwMiwweDAwLDB4MDQsCisweDI0LDB4MDYsMHgwMCwweDAxLDB4MjQsMHg0MiwweDAxLDB4MDAsMHgzMCwweDQyLDB4M2YsMHhmZiwweGFlLDB4MDIsMHgwMCwweDA0LAorMHgwMCwweDRhLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZSwweDAzLDB4MDAsMHg0NCwKKzB4MDAsMHg2NSwweDIwLDB4MjQsMHg4YywweDQzLDB4MDAsMHgwMCwweDEwLDB4ZTgsMHgwMCwweDJkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4ODAsMHhmZiwweGViLDB4MDAsMHg2YiwweDEwLDB4MjQsMHgxNCwweDRjLDB4ZmYsMHhlOSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxMCwweGMyLDB4MDAsMHgzMCwweDNjLDB4MDMsMHhiMCwweDA5LDB4OGUsMHgwMiwweDAwLDB4NDQsMHg4ZSwweDA0LDB4MDAsMHg2MCwKKzB4MDAsMHgwMiwweDFlLDB4NDIsMHgwMCwweDAyLDB4MTIsMHgwMiwweDMwLDB4NDIsMHgwMCwweDBmLDB4MzAsMHg2MywweDAwLDB4MDEsCisweGFlLDB4MDIsMHgwMCwweDAwLDB4MTAsMHg0NCwweDAwLDB4MWEsMHhhZSwweDAzLDB4MDAsMHg1OCwweDhlLDB4MDIsMHgwMCwweDY0LAorMHg4ZSwweDA0LDB4MDAsMHg1OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg4MiwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWUsMHgwMCwweDAwLDB4NGMsMHhhZSwweDAwLDB4MDAsMHg1MCwweGFlLDB4MDAsMHgwMCwweDU0LDB4YWUsMHgwMCwweDAwLDB4MGMsCisweDhlLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTAsMHg4MCwweDAwLDB4NTAsMHgxMCwweDIxLAorMHg4YywweDQyLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg1NCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0MCwweGY4LDB4MDksMHgwMiwweDAwLDB4MjAsMHgyMSwweDhlLDB4MDQsMHgwMCwweDU4LDB4OGUsMHgwMywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YWUsMHgwMywweDAwLDB4NjAsMHgwOCwweDAwLDB4MjksMHg4MSwweGFlLDB4MDQsMHgwMCwweDY0LAorMHg4ZSwweDAyLDB4MDAsMHg2NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg2MiwweGZmLDB4ZTUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4N2EsMHgwMiwweDBkLDB4N2MsMHg4ZiwweGJmLDB4MDAsMHgyNCwweDhmLDB4YjQsMHgwMCwweDIwLDB4N2IsMHhiMiwweDAwLDB4ZmMsCisweDdiLDB4YjAsMHgwMCwweGJjLDB4MDAsMHg0MywweDEwLDB4MjYsMHgwMCwweDAyLDB4MTAsMHgyYiwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgyOCwweDhlLDB4MDQsMHgwMCwweDA0LDB4MzQsMHg2MywweDAwLDB4MDYsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwNCwweDQyLDB4MDIsMHgwMCwweDQ4LDB4MTAsMHgyMywweDI0LDB4NDQsMHgwMCwweDQwLDB4MjgsMHg4MywweDAwLDB4MDAsCisweDI0LDB4NDIsMHgwMCwweDdmLDB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLAorMHgwMCwweDgyLDB4MjAsMHgyMywweDE0LDB4ODYsMHhmZiwweGM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZSwweDAzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweDYyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MGQsCisweDEwLDB4NjIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MmEsMHgwNCwweGEyLDB4MDIsMHgwMCwweDVjLAorMHgwOCwweDAwLDB4MmEsMHgwNCwweGEyLDB4MDAsMHgwMCwweDVjLDB4MDAsMHg2MiwweDEwLDB4MjQsMHgzYywweDAzLDB4MjgsMHgzOCwKKzB4MTQsMHg0MywweGZmLDB4OTMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgyOSwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAxLDB4MDAsMHhhMiwweDQwLDB4MjEsMHgwMCwweGEwLDB4NDgsMHgyMSwweDhkLDB4MDUsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4YzAsMHgwMCwweDAwLDB4MDksMHgzOCwweGMyLDB4MDAsMHhhMiwweDI4LDB4MjQsMHgyNCwweGMyLDB4ZmYsMHhmZiwKKzB4MDAsMHgwNywweDNhLDB4MDAsMHgzYywweDBhLDB4YjAsMHgwNiwweDNjLDB4MDMsMHgwMCwweDgwLDB4MDAsMHhhNiwweDI4LDB4MjUsCisweDJjLDB4NDIsMHgxZiwweGZmLDB4MDAsMHhlMywweDM4LDB4MjUsMHgzNSwweDRhLDB4ODAsMHgxOCwweDEwLDB4NDAsMHgwMCwweDBlLAorMHhhZCwweDA1LDB4MDAsMHgwMCwweGFmLDB4ODksMHhiYywweDEwLDB4OGQsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YWYsMHg4MiwweGJjLDB4MTgsMHg4ZCwweDAzLDB4MDAsMHgwNCwweGFkLDB4NDcsMHgwMCwweDAwLDB4YWYsMHg4MywweGJjLDB4MTQsCisweGFjLDB4ODAsMHgwMSwweGQwLDB4YWMsMHg4MCwweDAxLDB4YzQsMHhhMCwweDgwLDB4MDEsMHhjMCwweGEwLDB4ODAsMHgwMSwweGMxLAorMHhhYywweDgwLDB4MDEsMHhjOCwweGFjLDB4ODAsMHgwMSwweGNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTgsMHhhZiwweGJmLDB4MDAsMHgxMCwweDhjLDB4ODMsMHgwMSwweGM0LDB4MDAsMHg4MCwweDM4LDB4MjEsCisweDkwLDB4ODQsMHgwMSwweGMwLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY3LDB4MTgsMHgyMSwweDhjLDB4NjUsMHgwMCwweGE4LAorMHgzYywweDAyLDB4YjAsMHgwMSwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHhhMiwweDEwLDB4MjEsMHg4YywweDQyLDB4MDAsMHgwMCwKKzB4MTAsMHg4MywweDAwLDB4MTgsMHgwMCwweDAyLDB4MTQsMHgwMiwweDhjLDB4ZTksMHgwMSwweGNjLDB4OGMsMHhlYSwweDAxLDB4YzgsCisweDMwLDB4NDYsMHgwMCwweGZmLDB4MDEsMHgyYSwweDE4LDB4MjEsMHgzMCwweDY0LDB4MDAsMHhmZiwweDAwLDB4MDMsMHgxYSwweDAyLAorMHgyNCwweDYyLDB4MDAsMHgwMSwweDE0LDB4ODAsMHgwMCwweDAyLDB4MzAsMHg0OCwweDAwLDB4ZmYsMHgzMCwweDY4LDB4MDAsMHhmZiwKKzB4OTAsMHhlMiwweDAxLDB4YzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgxMCwweDIzLDB4MDAsMHgwMiwweDEyLDB4MDAsCisweDAwLDB4NDksMHgxMCwweDIxLDB4MDAsMHg0YSwweDEwLDB4MjEsMHgwMCwweDQ2LDB4MzAsMHgyMywweDBjLDB4MDAsMHgyYSwweDJjLAorMHgwMCwweGUwLDB4MjAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MTgsMHg4YywweGU2LDB4MDEsMHhjOCwweDA4LDB4MDAsMHgyYSwweDZiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGU4LDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDhjLDB4ODIsMHgwMSwweGM0LAorMHg5MCwweDg3LDB4MDEsMHhjMSwweDAwLDB4ODAsMHg4MCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OGMsMHg0OCwweDAwLDB4YTgsMHgzYywweDAyLDB4YjAsMHgwMSwweDAwLDB4MDcsMHgzYSwweDAwLDB4MDEsMHgwMiwweDEwLDB4MjEsCisweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHhlNSwweDM4LDB4MjEsMHgwMCwweGU2LDB4MzgsMHgyMSwweDAwLDB4MDMsMHgxYywweDAyLAorMHgzMCwweDYzLDB4MDAsMHhmZiwweDAwLDB4ZTMsMHgzOCwweDIzLDB4MDEsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MmEsMHgyYywKKzB4MDAsMHhlMCwweDMwLDB4MjEsMHg4ZSwweDAyLDB4MDEsMHhhOCwweDhmLDB4YmYsMHgwMCwweDE0LDB4MjQsMHg0NCwweDAwLDB4MDEsCisweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsMHgwMCwweDgzLDB4MTAsMHgwYSwweDAwLDB4MDIsMHgxMSwweDgzLAorMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4ODIsMHgyMCwweDIzLDB4YWUsMHgwNCwweDAxLDB4YTgsMHg4ZiwweGIwLDB4MDAsMHgxMCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsCisweDI3LDB4YmQsMHhmZiwweGU4LDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4YWEsMHg1OCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhZiwweGJmLDB4MDAsMHgxNCwweGFjLDB4NDMsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAxLDB4ZDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4NmEsMHgwMCwweDgwLDB4ODAsMHgyMSwweDkwLDB4ODIsMHgwMSwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDgzLDB4MDEsMHhhOCwweDhjLDB4ODIsMHgwMSwweGFjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjIsMHgwMCwweDIyLDB4MDAsMHgwMCwweDI4LDB4MjEsMHg5MywweDgyLDB4ODEsMHhmMSwKKzB4MDAsMHgwMywweDMwLDB4ODAsMHgwMCwweGM0LDB4MTgsMHgyMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4OGMsMHg2NywweDAwLDB4YTgsCisweDEwLDB4NDQsMHgwMCwweDIwLDB4M2MsMHgwNCwweGIwLDB4MDEsMHhhZiwweDg3LDB4YmMsMHgxMCwweDAwLDB4ZTQsMHgyMCwweDIxLAorMHg4YywweDg2LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgxOCwweGMyLDB4M2MsMHgwMiwweDAwLDB4ODAsMHhhZiwweDg2LDB4YmMsMHgxOCwKKzB4OGMsMHg4NiwweDAwLDB4MDQsMHgwMCwweDAzLDB4MWEsMHgwMCwweDNjLDB4MDUsMHhiMCwweDA2LDB4MDAsMHg2MiwweDE4LDB4MjUsCisweDM0LDB4YTUsMHg4MCwweDE4LDB4YWMsMHhhMywweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDEsMHhhOCwweDhlLDB4MDksMHgwMSwweGFjLAorMHhhZiwweDg2LDB4YmMsMHgxNCwweDI0LDB4NDQsMHgwMCwweDAxLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg0MCwKKzB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjMsCisweDAwLDB4ODAsMHgzMCwweDIxLDB4YWUsMHgwNCwweDAxLDB4YTgsMHgwMCwweGM5LDB4MTAsMHgyNiwweDAwLDB4MDIsMHgyOCwweDJiLAorMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhhMCwweDEwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MTgsMHg5MywweDgyLDB4ODEsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg0MiwweDAwLDB4MDIsCisweDE0LDB4NDAsMHhmZiwweGY3LDB4MDAsMHgwMCwweDI4LDB4MjEsMHgzYywweDA1LDB4YjAsMHgwMSwweDAwLDB4ZTUsMHgyOCwweDIxLAorMHgyNywweDgzLDB4ODksMHg1OCwweDAwLDB4YzMsMHgxOCwweDIxLDB4OGMsMHhhNiwweDAwLDB4MDAsMHg4YywweDY0LDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweGMwLDB4MDAsMHgwMCwweGMyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgxMCwweDI1LDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDhlLDB4MDMsMHgwMSwweGE4LDB4MjcsMHg4NCwweDhhLDB4NTgsMHg4YywweGE2LDB4MDAsMHgwNCwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMywweDgwLDB4MDAsMHgwMCwweDA3LDB4MjAsMHhjMiwKKzB4MDAsMHhjMiwweDEwLDB4MjUsMHgwMCwweDQzLDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDA0LDB4YWYsMHg4NywweGJjLDB4MTAsCisweDhjLDB4YTYsMHgwMCwweDAwLDB4M2MsMHgwMiwweDAwLDB4ODAsMHgwMCwweDA0LDB4MjIsMHgwMCwweDNjLDB4MDMsMHhiMCwweDA2LAorMHhhZiwweDg2LDB4YmMsMHgxOCwweDAwLDB4ODIsMHgyMCwweDI1LDB4MzQsMHg2MywweDgwLDB4MTgsMHg4YywweGE2LDB4MDAsMHgwNCwKKzB4YWMsMHg2NCwweDAwLDB4MDAsMHg4ZSwweDAyLDB4MDEsMHhhOCwweGFmLDB4ODYsMHhiYywweDE0LDB4MjQsMHg0NCwweDAwLDB4MDEsCisweDI4LDB4ODMsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4NDAsMHgwMCwweDgzLDB4MTAsMHgwYSwweDkzLDB4ODMsMHg4MSwweGYwLAorMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjMsMHgyNCwweDYzLDB4ZmYsMHhmZiwKKzB4YWUsMHgwNCwweDAxLDB4YTgsMHhhMywweDgzLDB4ODEsMHhmMCwweDhlLDB4MDQsMHgwMSwweGFjLDB4OGUsMHgwMiwweDAxLDB4YTgsCisweDA4LDB4MDAsMHgyYSwweGNiLDB4MDAsMHg0NCwweDEwLDB4MjYsMHgwYywweDAwLDB4MmEsMHg0YywweDAwLDB4MDAsMHgwMCwweDAwLAorMHg3YSwweDAyLDB4MGQsMHg3YywweDA4LDB4MDAsMHgyYSwweGNiLDB4MDAsMHg0MywweDEwLDB4MjYsMHg4YywweDg2LDB4MDEsMHhhOCwKKzB4OGMsMHg4OSwweDAxLDB4YWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YzksMHgwMCwweGI0LDB4MDAsMHhjMCwweDY4LDB4MjEsCisweDAwLDB4MDYsMHgxMCwweDgwLDB4MjcsMHg4MywweDg5LDB4NTgsMHgwMCwweDQzLDB4MTgsMHgyMSwweDAwLDB4NDQsMHgxMCwweDIxLAorMHg4YywweDQ3LDB4MDAsMHhhOCwweDk0LDB4NjUsMHgwMCwweDAyLDB4M2MsMHgwMiwweGIwLDB4MDEsMHgwMCwweGUyLDB4MTAsMHgyMSwKKzB4MzAsMHhhNSwweDNmLDB4ZmYsMHhhNCwweDQ1LDB4MDAsMHgyYywweDkwLDB4OGEsMHgwMSwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDExLDB4NDAsMHgwMCwweDBjLDB4MDAsMHgwNywweDMyLDB4MDIsMHg4YywweDgzLDB4MDEsMHhjNCwweDkwLDB4ODUsMHgwMSwweGMxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjQsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4YTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMiwweDEyLDB4MDIsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDMwLDB4NDIsMHgwMCwweDNmLDB4MTQsMHhjMiwweGZmLDB4ZGUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDEsMHgwMCwweGU0LDB4NDAsMHgyMSwweDhkLDB4MDYsMHgwMCwweDAwLAorMHgwMCwweDBkLDB4MjgsMHg4MCwweDAwLDB4MDYsMHgxNCwweDAyLDB4MzAsMHg0YiwweDAwLDB4ZmYsMHgwMCwweGViLDB4NzAsMHgyMSwKKzB4MDEsMHhjNCwweDIwLDB4MjEsMHg5MCwweDgzLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg4OSwweDU4LDB4MDAsMHhhMiwweDI4LDB4MjEsCisweDhjLDB4YTQsMHgwMCwweDAwLDB4MDAsMHgwMywweDE4LDB4ODIsMHgzMCwweDYzLDB4MDAsMHgwMywweDJjLDB4NjIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4MDAsMHg2NiwweDMwLDB4OGMsMHgzZiwweGZmLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDYyLDB4MDAsMHg2MSwKKzB4MmQsMHg4MiwweDA4LDB4MDAsMHgxNSwweDQwLDB4MDAsMHgzNiwweDAxLDB4NmMsMHgxMCwweDIxLDB4MDEsMHg2YywweDE4LDB4MjEsCisweDMwLDB4NjIsMHgwMCwweGZmLDB4MDAsMHgwMiwweDEwLDB4MmIsMHgwMCwweDAzLDB4MWEsMHgwMiwweDNjLDB4MDQsMHhiMCwweDAxLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4ZTQsMHgyMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMiwweDAzLDB4MDEsMHhjMSwKKzB4YTAsMHg4MiwweDAwLDB4MDgsMHg4ZSwweDA2LDB4MDEsMHhhOCwweDNjLDB4MDMsMHhiMCwweDAwLDB4MzQsMHg2MywweGZmLDB4ZjQsCisweDI0LDB4YzUsMHgwMCwweDAxLDB4MjgsMHhhNCwweDAwLDB4MDAsMHgyNCwweGMyLDB4MDAsMHg0MCwweDAwLDB4YTQsMHgxMCwweDBhLAorMHgwMSwweGMzLDB4MTgsMHgyMSwweGE0LDB4NmMsMHgwMCwweDAwLDB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwKKzB4OTIsMHgwNCwweDAxLDB4YzAsMHgwMCwweGEyLDB4MzgsMHgyMywweDNjLDB4MDMsMHhiMCwweDAzLDB4YWUsMHgwYiwweDAxLDB4Y2MsCisweGFlLDB4MGMsMHgwMSwweGM4LDB4YWUsMHgwNiwweDAxLDB4YzQsMHhhZSwweDA3LDB4MDEsMHhhOCwweDM0LDB4NjMsMHgwMSwweDA4LAorMHg5MiwweDA1LDB4MDEsMHhkNiwweDhjLDB4NjYsMHgwMCwweDAwLDB4MjQsMHg4NCwweDAwLDB4MDEsMHgzMCwweDgyLDB4MDAsMHhmZiwKKzB4MDAsMHg0NSwweDEwLDB4MmIsMHhhZSwweDA2LDB4MDEsMHhkMCwweDEwLDB4NDAsMHgwMCwweDA3LDB4YTIsMHgwNCwweDAxLDB4YzAsCisweDkyLDB4MDIsMHgwMSwweGQ1LDB4OTIsMHgwMywweDAxLDB4YzEsMHgyNCwweDQyLDB4ZmYsMHhmYywweDAwLDB4NjIsMHgxOCwweDJhLAorMHgxNCwweDYwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MmEsMHg0YywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZSwweDA5LDB4MDEsMHhhYywweDhlLDB4MDYsMHgwMSwweGE4LDB4MDgsMHgwMCwweDJhLDB4Y2IsCisweDAwLDB4YzksMHgxMCwweDI2LDB4OGUsMHgwOSwweDAxLDB4YWMsMHgwOCwweDAwLDB4MmEsMHhjYSwweDAwLDB4ZTAsMHgzMCwweDIxLAorMHgzMCwweDQzLDB4MDAsMHhmZiwweDkyLDB4MDcsMHgwMSwweGMxLDB4MDAsMHgwMiwweDEyLDB4MDIsMHgzMCwweDQ0LDB4MDAsMHhmZiwKKzB4MzgsMHg2MywweDAwLDB4MDAsMHgyNCwweDQ2LDB4MDAsMHgwMSwweDkyLDB4MDUsMHgwMSwweGQ1LDB4MDAsMHg4MywweDMwLDB4MGEsCisweDAwLDB4YzcsMHgxOCwweDIxLDB4MDAsMHhhMywweDEwLDB4MmEsMHgxNCwweDQwLDB4ZmYsMHhlYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweGEyLDB4ZmYsMHhmYywweDAwLDB4NjIsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4MDcsMHgwMSwweDgwLDB4MjgsMHgyMSwKKzB4OTIsMHgwMywweDAxLDB4ZDYsMHgyNSwweDQyLDB4MDAsMHgwMSwweDAwLDB4NDMsMHgxMCwweDJhLDB4MTQsMHg0MCwweDAwLDB4MDcsCisweDI1LDB4YTQsMHgwMCwweDAxLDB4MDEsMHg4MCwweDI4LDB4MjEsMHgwMSwweDYwLDB4MzAsMHgyMSwweDBjLDB4MDAsMHgyYSwweDc0LAorMHgwMiwweDAwLDB4MjAsMHgyMSwweDA4LDB4MDAsMHgyYiwweDZkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOCwweDgzLDB4MDAsMHgwMCwKKzB4MjUsMHhhMiwweDAwLDB4NDAsMHgwMCwweDgzLDB4MTAsMHgwYSwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsCisweDAwLDB4ODIsMHgyMCwweDIzLDB4MDAsMHhjNywweDE4LDB4MjEsMHgyNSwweDQyLDB4MDAsMHgwMSwweDAwLDB4ODAsMHgzMCwweDIxLAorMHhhMiwweDAzLDB4MDEsMHhjMSwweGFlLDB4MGIsMHgwMSwweGNjLDB4YWUsMHgwYywweDAxLDB4YzgsMHgwOCwweDAwLDB4MmEsMHhjOSwKKzB4YTIsMHgwMiwweDAxLDB4YzAsMHgxNCwweDQwLDB4ZmYsMHg5ZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTUsMHg0MCwweDAwLDB4MTQsCisweDI0LDB4MDIsMHhjMCwweDAwLDB4MDAsMHhjMiwweDEwLDB4MjQsMHgwMCwweDRjLDB4MTAsMHgyNSwweGFkLDB4MDIsMHgwMCwweDAwLAorMHhhZiwweDg3LDB4YmMsMHgxMCwweDhkLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwNywweDE4LDB4YzIsMHgzYywweDAyLDB4MDAsMHg4MCwKKzB4MDAsMHgwMywweDFhLDB4MDAsMHgzYywweDA0LDB4YjAsMHgwNiwweGFmLDB4ODUsMHhiYywweDE4LDB4MDAsMHg2MiwweDE4LDB4MjUsCisweDM0LDB4ODQsMHg4MCwweDE4LDB4OGQsMHgwNSwweDAwLDB4MDQsMHhhYywweDgzLDB4MDAsMHgwMCwweDhlLDB4MDIsMHgwMSwweGE4LAorMHg4ZSwweDA5LDB4MDEsMHhhYywweGFmLDB4ODUsMHhiYywweDE0LDB4MDgsMHgwMCwweDJhLDB4YzIsMHgyNCwweDQ0LDB4MDAsMHgwMSwKKzB4MDEsMHg2YywweDEwLDB4MjEsMHgzMCwweDQ1LDB4MDAsMHhmZiwweDkyLDB4MDQsMHgwMSwweGMxLDB4MDAsMHgwMiwweDEyLDB4MDIsCisweDMwLDB4NDYsMHgwMCwweGZmLDB4MzgsMHhhNSwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwweDkyLDB4MDMsMHgwMSwweGQ1LAorMHgwMCwweGM1LDB4MTAsMHgwYSwweDAwLDB4ODIsMHgyMCwweDIxLDB4MDAsMHg2NCwweDE4LDB4MmEsMHgxMCwweDYwLDB4ZmYsMHhjYSwKKzB4MDEsMHg4MCwweDI4LDB4MjEsMHgwOCwweDAwLDB4MmIsMHg2YiwweDAyLDB4MDAsMHgyMCwweDIxLDB4OTAsMHg4NywweDAxLDB4YzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhlMCwweGZmLDB4MDYsMHgwMCwweDAwLDB4MjgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDEsMHgwOCwweDk0LDB4ODMsMHgwMSwweGQ4LDB4OGMsMHg4OCwweDAxLDB4ZDAsMHg4YywweDQ1LDB4MDAsMHgwMCwKKzB4MDEsMHgwMywweDE4LDB4MjEsMHgwMCwweGEzLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDBiLDB4MmMsMHhlMiwweDAwLDB4MDIsCisweDAwLDB4YTgsMHgxMCwweDJiLDB4MTAsMHg0MCwweGZlLDB4ZjksMHgwMCwweGM5LDB4MTAsMHgyNiwweDNjLDB4MDIsMHg4MCwweDAwLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHg0MywweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmUsMHhmMywKKzB4MDAsMHhjOSwweDEwLDB4MjYsMHgyYywweGUyLDB4MDAsMHgwMiwweDEwLDB4NDAsMHhmZiwweDkwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTQsMHhlMiwweGZlLDB4ZWQsMHgwMCwweGM5LDB4MTAsMHgyNiwweDNjLDB4MDMsMHhiMCwweDA2LAorMHgzNCwweDYzLDB4ODAsMHgxOCwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTcsMHgwMiwKKzB4MTQsMHg0MCwweGZlLDB4ZTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyYiwweDZiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwNiwweGIwLDB4MDcsMHgzYywweDAyLDB4ODAsMHgwMSwweDM0LDB4YzYsMHgwMCwweDE4LAorMHgzNCwweDg0LDB4MDAsMHgyMCwweDI0LDB4NDIsMHhhZiwweGEwLDB4MjQsMHgwMywweGZmLDB4ODMsMHhhYywweDgyLDB4MDAsMHgwMCwKKzB4YTAsMHhjMywweDAwLDB4MDAsMHg5MCwweGM0LDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGY4LDB4M2MsMHgwMywweGIwLDB4MDcsCisweDI0LDB4MDIsMHhmZiwweDgyLDB4YTMsMHhhNCwweDAwLDB4MDAsMHhhMCwweDYyLDB4MDAsMHgwMCwweDkwLDB4NjQsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwNywweDM0LDB4NDIsMHgwMCwweDA4LDB4YTMsMHhhNCwweDAwLDB4MDEsMHhhMCwweDQwLDB4MDAsMHgwMCwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMywweDNjLDB4MDUsMHhiMCwweDA3LDB4YTMsMHhhMywweDAwLDB4MDAsCisweGEwLDB4YzIsMHgwMCwweDAwLDB4OTAsMHhjNCwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgxMCwweDI0LDB4MDIsMHgwMCwweDA2LAorMHgzYywweDAzLDB4YjAsMHgwNywweGEzLDB4YTQsMHgwMCwweDAwLDB4MzQsMHg2MywweDAwLDB4MzgsMHhhMCwweGEyLDB4MDAsMHgwMCwKKzB4OTAsMHg2NCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNywweDM0LDB4NDIsMHgwMCwweDIwLDB4YTMsMHhhNCwweDAwLDB4MDAsCisweGEwLDB4YTAsMHgwMCwweDAwLDB4OTAsMHhhMywweDAwLDB4MDAsMHhhZiwweDgyLDB4YmYsMHgyMCwweGEzLDB4YTMsMHgwMCwweDAwLAorMHhhMCwweDQwLDB4MDAsMHgwMCwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgwOCwKK307CisKK3U4IHJ0bDgxOTBfZndkYXRhX2FycmF5W10gPXsKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA4LDB4MDAsCisweDAyLDB4ZTksMHgwMSwweDc0LDB4MDIsMHhhYiwweDAxLDB4YzcsMHgwMSwweDU1LDB4MDAsMHhlNCwweDAwLDB4YWIsMHgwMCwweDcyLAorMHgwMCwweDU1LDB4MDAsMHg0YywweDAwLDB4NGMsMHgwMCwweDRjLDB4MDAsMHg0YywweDAwLDB4NGMsMHgwMiwweDc2LDB4MDEsMHgzYiwKKzB4MDAsMHhkMiwweDAwLDB4OWUsMHgwMCwweDY5LDB4MDAsMHg0ZiwweDAwLDB4NDYsMHgwMCwweDNmLDB4MDEsMHgzYiwweDAwLDB4OWUsCisweDAwLDB4NjksMHgwMCwweDRmLDB4MDAsMHgzNSwweDAwLDB4MjcsMHgwMCwweDIzLDB4MDAsMHgyMCwweDAxLDB4MmYsMHgwMCwweDk4LAorMHgwMCwweDY1LDB4MDAsMHg0YywweDAwLDB4MzMsMHgwMCwweDI2LDB4MDAsMHgyMiwweDAwLDB4MWUsMHgwMCwweDk4LDB4MDAsMHg0YywKKzB4MDAsMHgzMywweDAwLDB4MjYsMHgwMCwweDE5LDB4MDAsMHgxMywweDAwLDB4MTEsMHgwMCwweDBmLDB4MDIsMHgzOSwweDAxLDB4MWMsCisweDAwLDB4YmQsMHgwMCwweDhlLDB4MDAsMHg1ZiwweDAwLDB4NDcsMHgwMCwweDNmLDB4MDAsMHgzOSwweDAxLDB4MWMsMHgwMCwweDhlLAorMHgwMCwweDVmLDB4MDAsMHg0NywweDAwLDB4MmYsMHgwMCwweDIzLDB4MDAsMHgyMCwweDAwLDB4MWMsMHgwMSwweDExLDB4MDAsMHg4OSwKKzB4MDAsMHg1YiwweDAwLDB4NDQsMHgwMCwweDJlLDB4MDAsMHgyMiwweDAwLDB4MWUsMHgwMCwweDFiLDB4MDAsMHg4OSwweDAwLDB4NDQsCisweDAwLDB4MmUsMHgwMCwweDIyLDB4MDAsMHgxNywweDAwLDB4MTEsMHgwMCwweDBmLDB4MDAsMHgwZSwweDAyLDB4YWIsMHgwMiwweGFiLAorMHgwMiwweDY2LDB4MDIsMHg2NiwweDA3LDB4MDYsMHgwNiwweDA2LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwNCwweDA2LDB4MDcsMHgwOCwKKzB4MDksMHgwYSwweDBiLDB4MGIsMHg0OSwweDZlLDB4NzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDU0LDB4NGMsCisweDQyLDB4NGQsMHg0ZiwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1NCwweDRjLDB4NDIsMHg0YywweDVmLDB4NjQsMHg2MSwweDc0LAorMHg2MSwweDAwLDB4NTQsMHg0YywweDQyLDB4NTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MSwweDY0LDB4NDUsMHg0YywKKzB4NWYsMHg2NCwweDYxLDB4NzQsMHg2MSwweDAwLDB4NDEsMHg2NCwweDQ1LDB4NTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDQ1LDB4NzgsMHg2MywweDQzLDB4NmYsMHg2NCwweDY1LDB4MzYsMHgwMCwweDAwLDB4NDUsMHg3OCwweDYzLDB4NDMsMHg2ZiwweDY0LAorMHg2NSwweDM3LDB4MDAsMHgwMCwweDUzLDB4NzksMHg3MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDIsMHg3MCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUyLDB4NDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHg0MywweDcwLDB4NTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRmLDB4NzYsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAxLDB4MGIsMHg1MywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MmMsCisweDAwLDB4MDAsMHgwMCwweDU4LDB4MDAsMHgwMCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHg0OCwweDAwLDB4MDAsMHgwMCwweDYwLAorMHgwMCwweDAwLDB4MDAsMHg5MCwweDAwLDB4MDAsMHgwMCwweGMwLDB4MDAsMHgwMCwweDAxLDB4MjAsMHgwMCwweDAwLDB4MDEsMHg4MCwKKzB4MDAsMHgwMCwweDAxLDB4YjAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDY4LDB4MDAsMHgwMCwweDAwLDB4OWMsCisweDAwLDB4MDAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAxLDB4MzgsMHgwMCwweDAwLDB4MDEsMHhhMCwweDAwLDB4MDAsMHgwMSwweGQ0LAorMHgwMCwweDAwLDB4MDIsMHgwOCwweDAwLDB4MDAsMHgwMCwweDY4LDB4MDAsMHgwMCwweDAwLDB4ZDAsMHgwMCwweDAwLDB4MDEsMHgzOCwKKzB4MDAsMHgwMCwweDAxLDB4YTAsMHgwMCwweDAwLDB4MDIsMHg2ZiwweDAwLDB4MDAsMHgwMywweDQwLDB4MDAsMHgwMCwweDAzLDB4YTgsCisweDAwLDB4MDAsMHgwNCwweDEwLDB4MDEsMHgwMSwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIsMHgwMiwweDAzLDB4MDMsMHgwNCwweDA0LAorMHgwMSwweDAxLDB4MDIsMHgwMiwweDAzLDB4MDMsMHgwNCwweDA0LDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwNywweDc0LDB4ODAsMHgwMCwweDA3LDB4ODgsCisweDgwLDB4MDAsMHgwNywweDg4LDB4ODAsMHgwMCwweDA3LDB4NzgsMHg4MCwweDAwLDB4MDcsMHg3OCwweDgwLDB4MDAsMHgwNywweDljLAorMHg4MCwweDAwLDB4NTMsMHhjNCwweDgwLDB4MDAsMHg1NCwweDI0LDB4ODAsMHgwMCwweDU0LDB4MzgsMHg4MCwweDAwLDB4NTQsMHg1YywKKzB4ODAsMHgwMCwweDU0LDB4NjgsMHg4MCwweDAwLDB4NTQsMHhhOCwweDgwLDB4MDAsMHg1NiwweGE4LDB4ODAsMHgwMCwweDU3LDB4ZWMsCisweDgwLDB4MDAsMHg1OCwweDE0LDB4ODAsMHgwMCwweDU5LDB4MGMsMHg4MCwweDAwLDB4NTksMHhjNCwweDgwLDB4MDAsMHg1YSwweDZjLAorMHg4MCwweDAwLDB4NWEsMHhlMCwweDgwLDB4MDAsMHg1YiwweGVjLDB4ODAsMHgwMCwweDVjLDB4MjQsMHg4MCwweDAwLDB4NWMsMHgzOCwKKzB4ODAsMHgwMCwweDVjLDB4NGMsMHg4MCwweDAwLDB4NWQsMHg0MCwweDgwLDB4MDAsMHg1ZCwweDgwLDB4ODAsMHgwMCwweDVlLDB4MzQsCisweDgwLDB4MDAsMHg1ZSwweDVjLDB4ODAsMHgwMCwweDU2LDB4NjgsMHg4MCwweDAwLDB4NWUsMHg3OCwweDgwLDB4MDAsMHg4OCwweGY4LAorMHg4MCwweDAwLDB4ODgsMHhmOCwweDgwLDB4MDAsMHg4OCwweGY4LDB4ODAsMHgwMCwweDg5LDB4MmMsMHg4MCwweDAwLDB4ODksMHg2YywKKzB4ODAsMHgwMCwweDg5LDB4YTQsMHg4MCwweDAwLDB4ODksMHhkNCwweDgwLDB4MDAsMHg4YSwweDEwLDB4ODAsMHgwMCwweDhhLDB4NTAsCisweDgwLDB4MDAsMHg4YSwweGI4LDB4ODAsMHgwMCwweDhhLDB4Y2MsMHg4MCwweDAwLDB4OGIsMHgwOCwweDgwLDB4MDAsMHg4YiwweDEwLAorMHg4MCwweDAwLDB4OGIsMHg0YywweDgwLDB4MDAsMHg4YiwweDYwLDB4ODAsMHgwMCwweDhiLDB4NjgsMHg4MCwweDAwLDB4OGIsMHg3MCwKKzB4ODAsMHgwMCwweDhiLDB4NzAsMHg4MCwweDAwLDB4OGIsMHg3MCwweDgwLDB4MDAsMHg4YiwweDcwLDB4ODAsMHgwMCwweDhhLDB4OTAsCisweDgwLDB4MDAsMHg4YiwweGEwLDB4ODAsMHgwMCwweDhiLDB4YjQsMHg4MCwweDAwLDB4ODgsMHg1NCwweDgwLDB4MDAsMHg4ZSwweGM4LAorMHg4MCwweDAwLDB4OGUsMHhjOCwweDgwLDB4MDAsMHg4ZSwweGM4LDB4ODAsMHgwMCwweDhlLDB4ZmMsMHg4MCwweDAwLDB4OGYsMHgzYywKKzB4ODAsMHgwMCwweDhmLDB4NzQsMHg4MCwweDAwLDB4OGYsMHhhNCwweDgwLDB4MDAsMHg4ZiwweGUwLDB4ODAsMHgwMCwweDkwLDB4MjAsCisweDgwLDB4MDAsMHg5MCwweDg4LDB4ODAsMHgwMCwweDkwLDB4OWMsMHg4MCwweDAwLDB4OTAsMHhkOCwweDgwLDB4MDAsMHg5MCwweGUwLAorMHg4MCwweDAwLDB4OTEsMHgxYywweDgwLDB4MDAsMHg5MSwweDMwLDB4ODAsMHgwMCwweDkxLDB4MzgsMHg4MCwweDAwLDB4OTEsMHg0MCwKKzB4ODAsMHgwMCwweDkxLDB4NDAsMHg4MCwweDAwLDB4OTEsMHg0MCwweDgwLDB4MDAsMHg5MSwweDQwLDB4ODAsMHgwMCwweDkwLDB4NjAsCisweDgwLDB4MDAsMHg5MSwweDcwLDB4ODAsMHgwMCwweDkxLDB4ODQsMHg4MCwweDAwLDB4OGQsMHgwMCx9OworCit1MzIgUnRsODE5MlVzYlBIWV9SRUdBcnJheVtdID0geworMHgwLCB9OworCit1MzIgUnRsODE5MlVzYlBIWV9SRUdfMVQyUkFycmF5W10gPSB7CisweDgwMCwweDAwMDAwMDAwLAorMHg4MDQsMHgwMDAwMDAwMSwKKzB4ODA4LDB4MDAwMGZjMDAsCisweDgwYywweDAwMDAwMDFjLAorMHg4MTAsMHg4MDEwMTBhYSwKKzB4ODE0LDB4MDA4NTE0ZDAsCisweDgxOCwweDAwMDAwMDQwLAorMHg4MWMsMHgwMDAwMDAwMCwKKzB4ODIwLDB4MDAwMDAwMDQsCisweDgyNCwweDAwNjkwMDAwLAorMHg4MjgsMHgwMDAwMDAwNCwKKzB4ODJjLDB4MDBlOTAwMDAsCisweDgzMCwweDAwMDAwMDA0LAorMHg4MzQsMHgwMDY5MDAwMCwKKzB4ODM4LDB4MDAwMDAwMDQsCisweDgzYywweDAwZTkwMDAwLAorMHg4NDAsMHgwMDAwMDAwMCwKKzB4ODQ0LDB4MDAwMDAwMDAsCisweDg0OCwweDAwMDAwMDAwLAorMHg4NGMsMHgwMDAwMDAwMCwKKzB4ODUwLDB4MDAwMDAwMDAsCisweDg1NCwweDAwMDAwMDAwLAorMHg4NTgsMHg2NWE5NjVhOSwKKzB4ODVjLDB4NjVhOTY1YTksCisweDg2MCwweDAwMWYwMDEwLAorMHg4NjQsMHgwMDdmMDAxMCwKKzB4ODY4LDB4MDAxZjAwMTAsCisweDg2YywweDAwN2YwMDEwLAorMHg4NzAsMHgwZjEwMGY3MCwKKzB4ODc0LDB4MGYxMDBmNzAsCisweDg3OCwweDAwMDAwMDAwLAorMHg4N2MsMHgwMDAwMDAwMCwKKzB4ODgwLDB4Njg3MGUzNmMsCisweDg4NCwweGUzNTczNjAwLAorMHg4ODgsMHg0MjYwYzM0MCwKKzB4ODhjLDB4MDAwMGZmMDAsCisweDg5MCwweDAwMDAwMDAwLAorMHg4OTQsMHhmZmZmZmZmZSwKKzB4ODk4LDB4NGM0MjM4MmYsCisweDg5YywweDAwNjU2MDU2LAorMHg4YjAsMHgwMDAwMDAwMCwKKzB4OGUwLDB4MDAwMDAwMDAsCisweDhlNCwweDAwMDAwMDAwLAorMHg5MDAsMHgwMDAwMDAwMCwKKzB4OTA0LDB4MDAwMDAwMjMsCisweDkwOCwweDAwMDAwMDAwLAorMHg5MGMsMHgzMTEyMTMxMSwKKzB4YTAwLDB4MDBkMGM3ZDgsCisweGEwNCwweDgxMWYwMDA4LAorMHhhMDgsMHg4MGNkODMwMCwKKzB4YTBjLDB4MmU2Mjc0MGYsCisweGExMCwweDk1MDA5Yjc4LAorMHhhMTQsMHgxMTE0NTAwOCwKKzB4YTE4LDB4MDA4ODExMTcsCisweGExYywweDg5MTQwZmEwLAorMHhhMjAsMHgxYTFiMDAwMCwKKzB4YTI0LDB4MDkwZTEzMTcsCisweGEyOCwweDAwMDAwMjA0LAorMHhhMmMsMHgwMDAwMDAwMCwKKzB4YzAwLDB4MDAwMDAwNDAsCisweGMwNCwweDAwMDA1NDMzLAorMHhjMDgsMHgwMDAwMDBlNCwKKzB4YzBjLDB4NmM2YzZjNmMsCisweGMxMCwweDA4ODAwMDAwLAorMHhjMTQsMHg0MDAwMDEwMCwKKzB4YzE4LDB4MDgwMDAwMDAsCisweGMxYywweDQwMDAwMTAwLAorMHhjMjAsMHgwODAwMDAwMCwKKzB4YzI0LDB4NDAwMDAxMDAsCisweGMyOCwweDA4MDAwMDAwLAorMHhjMmMsMHg0MDAwMDEwMCwKKzB4YzMwLDB4NmRlOWFjNDQsCisweGMzNCwweDQ2NWM1MmNkLAorMHhjMzgsMHg0OTdmNTk5NCwKKzB4YzNjLDB4MGE5Njk3NjQsCisweGM0MCwweDFmN2M0MDNmLAorMHhjNDQsMHgwMDAxMDBiNywKKzB4YzQ4LDB4ZWMwMjAwMDAsCisweGM0YywweDAwMDAwMzAwLAorMHhjNTAsMHg2OTU0MzQyMCwKKzB4YzU0LDB4NDMzYzAwOTQsCisweGM1OCwweDY5NTQzNDIwLAorMHhjNWMsMHg0MzNjMDA5NCwKKzB4YzYwLDB4Njk1NDM0MjAsCisweGM2NCwweDQzM2MwMDk0LAorMHhjNjgsMHg2OTU0MzQyMCwKKzB4YzZjLDB4NDMzYzAwOTQsCisweGM3MCwweDJjN2YwMDBkLAorMHhjNzQsMHgwMTg2MTc1YiwKKzB4Yzc4LDB4MDAwMDAwMWYsCisweGM3YywweDAwYjkxNjEyLAorMHhjODAsMHg0MDAwMDEwMCwKKzB4Yzg0LDB4MjAwMDAwMDAsCisweGM4OCwweDQwMDAwMTAwLAorMHhjOGMsMHgyMDIwMDAwMCwKKzB4YzkwLDB4NDAwMDAxMDAsCisweGM5NCwweDAwMDAwMDAwLAorMHhjOTgsMHg0MDAwMDEwMCwKKzB4YzljLDB4MDAwMDAwMDAsCisweGNhMCwweDAwNDkyNDkyLAorMHhjYTQsMHgwMDAwMDAwMCwKKzB4Y2E4LDB4MDAwMDAwMDAsCisweGNhYywweDAwMDAwMDAwLAorMHhjYjAsMHgwMDAwMDAwMCwKKzB4Y2I0LDB4MDAwMDAwMDAsCisweGNiOCwweDAwMDAwMDAwLAorMHhjYmMsMHgwMDQ5MjQ5MiwKKzB4Y2MwLDB4MDAwMDAwMDAsCisweGNjNCwweDAwMDAwMDAwLAorMHhjYzgsMHgwMDAwMDAwMCwKKzB4Y2NjLDB4MDAwMDAwMDAsCisweGNkMCwweDAwMDAwMDAwLAorMHhjZDQsMHgwMDAwMDAwMCwKKzB4Y2Q4LDB4NjRiMjI0MjcsCisweGNkYywweDAwNzY2OTMyLAorMHhjZTAsMHgwMDIyMjIyMiwKKzB4ZDAwLDB4MDAwMDA3NTAsCisweGQwNCwweDAwMDAwNDAzLAorMHhkMDgsMHgwMDAwOTA3ZiwKKzB4ZDBjLDB4MDAwMDAwMDEsCisweGQxMCwweGEwNjMzMzMzLAorMHhkMTQsMHgzMzMzM2M2MywKKzB4ZDE4LDB4NmE4ZjViNmIsCisweGQxYywweDAwMDAwMDAwLAorMHhkMjAsMHgwMDAwMDAwMCwKKzB4ZDI0LDB4MDAwMDAwMDAsCisweGQyOCwweDAwMDAwMDAwLAorMHhkMmMsMHhjYzk3OTk3NSwKKzB4ZDMwLDB4MDAwMDAwMDAsCisweGQzNCwweDAwMDAwMDAwLAorMHhkMzgsMHgwMDAwMDAwMCwKKzB4ZDNjLDB4MDAwMjcyOTMsCisweGQ0MCwweDAwMDAwMDAwLAorMHhkNDQsMHgwMDAwMDAwMCwKKzB4ZDQ4LDB4MDAwMDAwMDAsCisweGQ0YywweDAwMDAwMDAwLAorMHhkNTAsMHg2NDM3MTQwYSwKKzB4ZDU0LDB4MDI0ZGJkMDIsCisweGQ1OCwweDAwMDAwMDAwLAorMHhkNWMsMHgwNDAzMjA2NCwKKzB4ZTAwLDB4MTYxYTFhMWEsCisweGUwNCwweDEyMTIxNDE2LAorMHhlMDgsMHgwMDAwMTgwMCwKKzB4ZTBjLDB4MDAwMDAwMDAsCisweGUxMCwweDE2MWExYTFhLAorMHhlMTQsMHgxMjEyMTQxNiwKKzB4ZTE4LDB4MTYxYTFhMWEsCisweGUxYywweDEyMTIxNDE2LAorfTsKKwordTMyIFJ0bDgxOTJVc2JSYWRpb0FfQXJyYXlbXSA9IHsKKzB4MDE5LDB4MDAwMDAwMDMsCisweDAwMCwweDAwMDAwMGJmLAorMHgwMDEsMHgwMDAwMGVlMCwKKzB4MDAyLDB4MDAwMDAwNGMsCisweDAwMywweDAwMDAwN2YxLAorMHgwMDQsMHgwMDAwMDk3NSwKKzB4MDA1LDB4MDAwMDBjNTgsCisweDAwNiwweDAwMDAwYWU2LAorMHgwMDcsMHgwMDAwMDBjYSwKKzB4MDA4LDB4MDAwMDBlMWMsCisweDAwOSwweDAwMDAwN2YwLAorMHgwMGEsMHgwMDAwMDlkMCwKKzB4MDBiLDB4MDAwMDAxYmEsCisweDAwYywweDAwMDAwMjQwLAorMHgwMGUsMHgwMDAwMDAyMCwKKzB4MDBmLDB4MDAwMDA5OTAsCisweDAxMiwweDAwMDAwODA2LAorMHgwMTQsMHgwMDAwMDVhYiwKKzB4MDE1LDB4MDAwMDBmODAsCisweDAxNiwweDAwMDAwMDIwLAorMHgwMTcsMHgwMDAwMDU5NywKKzB4MDE4LDB4MDAwMDA1MGEsCisweDAxYSwweDAwMDAwZjgwLAorMHgwMWIsMHgwMDAwMGY1ZSwKKzB4MDFjLDB4MDAwMDAwMDgsCisweDAxZCwweDAwMDAwNjA3LAorMHgwMWUsMHgwMDAwMDZjYywKKzB4MDFmLDB4MDAwMDAwMDAsCisweDAyMCwweDAwMDAwMWE1LAorMHgwMWYsMHgwMDAwMDAwMSwKKzB4MDIwLDB4MDAwMDAxNjUsCisweDAxZiwweDAwMDAwMDAyLAorMHgwMjAsMHgwMDAwMDBjNiwKKzB4MDFmLDB4MDAwMDAwMDMsCisweDAyMCwweDAwMDAwMDg2LAorMHgwMWYsMHgwMDAwMDAwNCwKKzB4MDIwLDB4MDAwMDAwNDYsCisweDAxZiwweDAwMDAwMDA1LAorMHgwMjAsMHgwMDAwMDFlNiwKKzB4MDFmLDB4MDAwMDAwMDYsCisweDAyMCwweDAwMDAwMWE2LAorMHgwMWYsMHgwMDAwMDAwNywKKzB4MDIwLDB4MDAwMDAxNjYsCisweDAxZiwweDAwMDAwMDA4LAorMHgwMjAsMHgwMDAwMDBjNywKKzB4MDFmLDB4MDAwMDAwMDksCisweDAyMCwweDAwMDAwMDg3LAorMHgwMWYsMHgwMDAwMDAwYSwKKzB4MDIwLDB4MDAwMDAwZjcsCisweDAxZiwweDAwMDAwMDBiLAorMHgwMjAsMHgwMDAwMDBkNywKKzB4MDFmLDB4MDAwMDAwMGMsCisweDAyMCwweDAwMDAwMGI3LAorMHgwMWYsMHgwMDAwMDAwZCwKKzB4MDIwLDB4MDAwMDAwOTcsCisweDAxZiwweDAwMDAwMDBlLAorMHgwMjAsMHgwMDAwMDA3NywKKzB4MDFmLDB4MDAwMDAwMGYsCisweDAyMCwweDAwMDAwMDU3LAorMHgwMWYsMHgwMDAwMDAxMCwKKzB4MDIwLDB4MDAwMDAwMzcsCisweDAxZiwweDAwMDAwMDExLAorMHgwMjAsMHgwMDAwMDBmYiwKKzB4MDFmLDB4MDAwMDAwMTIsCisweDAyMCwweDAwMDAwMGRiLAorMHgwMWYsMHgwMDAwMDAxMywKKzB4MDIwLDB4MDAwMDAwYmIsCisweDAxZiwweDAwMDAwMDE0LAorMHgwMjAsMHgwMDAwMDBmZiwKKzB4MDFmLDB4MDAwMDAwMTUsCisweDAyMCwweDAwMDAwMGUzLAorMHgwMWYsMHgwMDAwMDAxNiwKKzB4MDIwLDB4MDAwMDAwYzMsCisweDAxZiwweDAwMDAwMDE3LAorMHgwMjAsMHgwMDAwMDBhMywKKzB4MDFmLDB4MDAwMDAwMTgsCisweDAyMCwweDAwMDAwMDgzLAorMHgwMWYsMHgwMDAwMDAxOSwKKzB4MDIwLDB4MDAwMDAwNjMsCisweDAxZiwweDAwMDAwMDFhLAorMHgwMjAsMHgwMDAwMDA0MywKKzB4MDFmLDB4MDAwMDAwMWIsCisweDAyMCwweDAwMDAwMDIzLAorMHgwMWYsMHgwMDAwMDAxYywKKzB4MDIwLDB4MDAwMDAwMDMsCisweDAxZiwweDAwMDAwMDFkLAorMHgwMjAsMHgwMDAwMDFlMywKKzB4MDFmLDB4MDAwMDAwMWUsCisweDAyMCwweDAwMDAwMWMzLAorMHgwMWYsMHgwMDAwMDAxZiwKKzB4MDIwLDB4MDAwMDAxYTMsCisweDAxZiwweDAwMDAwMDIwLAorMHgwMjAsMHgwMDAwMDE4MywKKzB4MDFmLDB4MDAwMDAwMjEsCisweDAyMCwweDAwMDAwMTYzLAorMHgwMWYsMHgwMDAwMDAyMiwKKzB4MDIwLDB4MDAwMDAxNDMsCisweDAxZiwweDAwMDAwMDIzLAorMHgwMjAsMHgwMDAwMDEyMywKKzB4MDFmLDB4MDAwMDAwMjQsCisweDAyMCwweDAwMDAwMTAzLAorMHgwMjMsMHgwMDAwMDIwMywKKzB4MDI0LDB4MDAwMDAyMDAsCisweDAwYiwweDAwMDAwMWJhLAorMHgwMmMsMHgwMDAwMDNkNywKKzB4MDJkLDB4MDAwMDBmZjAsCisweDAwMCwweDAwMDAwMDM3LAorMHgwMDQsMHgwMDAwMDE2MCwKKzB4MDA3LDB4MDAwMDAwODAsCisweDAwMiwweDAwMDAwODhkLAorMHgwZmUsMHgwMDAwMDAwMCwKKzB4MGZlLDB4MDAwMDAwMDAsCisweDAxNiwweDAwMDAwMjAwLAorMHgwMTYsMHgwMDAwMDM4MCwKKzB4MDE2LDB4MDAwMDAwMjAsCisweDAxNiwweDAwMDAwMWEwLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDBkLDB4MDAwMDAwMWYsCisweDAwZCwweDAwMDAwYzlmLAorMHgwMDIsMHgwMDAwMDA0ZCwKKzB4MDAwLDB4MDAwMDBjYmYsCisweDAwNCwweDAwMDAwOTc1LAorMHgwMDcsMHgwMDAwMDcwMCwKK307CisKK3UzMiBSdGw4MTkyVXNiUmFkaW9CX0FycmF5W10gPSB7CisweDAxOSwweDAwMDAwMDAzLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDAxLDB4MDAwMDA2ZTAsCisweDAwMiwweDAwMDAwMDRjLAorMHgwMDMsMHgwMDAwMDdmMSwKKzB4MDA0LDB4MDAwMDA5NzUsCisweDAwNSwweDAwMDAwYzU4LAorMHgwMDYsMHgwMDAwMGFlNiwKKzB4MDA3LDB4MDAwMDAwY2EsCisweDAwOCwweDAwMDAwZTFjLAorMHgwMDAsMHgwMDAwMDBiNywKKzB4MDBhLDB4MDAwMDA4NTAsCisweDAwMCwweDAwMDAwMGJmLAorMHgwMGIsMHgwMDAwMDFiYSwKKzB4MDBjLDB4MDAwMDAyNDAsCisweDAwZSwweDAwMDAwMDIwLAorMHgwMTUsMHgwMDAwMGY4MCwKKzB4MDE2LDB4MDAwMDAwMjAsCisweDAxNywweDAwMDAwNTk3LAorMHgwMTgsMHgwMDAwMDUwYSwKKzB4MDFhLDB4MDAwMDBlMDAsCisweDAxYiwweDAwMDAwZjVlLAorMHgwMWQsMHgwMDAwMDYwNywKKzB4MDFlLDB4MDAwMDA2Y2MsCisweDAwYiwweDAwMDAwMWJhLAorMHgwMjMsMHgwMDAwMDIwMywKKzB4MDI0LDB4MDAwMDAyMDAsCisweDAwMCwweDAwMDAwMDM3LAorMHgwMDQsMHgwMDAwMDE2MCwKKzB4MDE2LDB4MDAwMDAyMDAsCisweDAxNiwweDAwMDAwMzgwLAorMHgwMTYsMHgwMDAwMDAyMCwKKzB4MDE2LDB4MDAwMDAxYTAsCisweDAwZCwweDAwMDAwY2NjLAorMHgwMDAsMHgwMDAwMDBiZiwKKzB4MDAyLDB4MDAwMDAwNGQsCisweDAwMCwweDAwMDAwY2JmLAorMHgwMDQsMHgwMDAwMDk3NSwKKzB4MDA3LDB4MDAwMDA3MDAsCit9OworCit1MzIgUnRsODE5MlVzYlJhZGlvQ19BcnJheVtdID0geworMHgwLCB9OworCit1MzIgUnRsODE5MlVzYlJhZGlvRF9BcnJheVtdID0geworMHgwLCB9OworCit1MzIgUnRsODE5MlVzYk1BQ1BIWV9BcnJheVtdID0geworMHgwM2MsMHhmZmZmMDAwMCwweDAwMDAwZjBmLAorMHgzNDAsMHhmZmZmZmZmZiwweDE2MWExYTFhLAorMHgzNDQsMHhmZmZmZmZmZiwweDEyMTIxNDE2LAorMHgzNDgsMHgwMDAwZmZmZiwweDAwMDAxODE4LAorMHgxMmMsMHhmZmZmZmZmZiwweDA0MDAwODAyLAorMHgzMTgsMHgwMDAwMGZmZiwweDAwMDAwMTAwLAorfTsKKwordTMyIFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXlfUEdbXSA9IHsKKzB4MDNjLDB4ZmZmZjAwMDAsMHgwMDAwMGYwZiwKKzB4ZTAwLDB4ZmZmZmZmZmYsMHgwNjA5MDkwOSwKKzB4ZTA0LDB4ZmZmZmZmZmYsMHgwMDAzMDMwNiwKKzB4ZTA4LDB4MDAwMGZmMDAsMHgwMDAwMDAwMCwKKzB4ZTEwLDB4ZmZmZmZmZmYsMHgwYTBjMGQwZiwKKzB4ZTE0LDB4ZmZmZmZmZmYsMHgwNjA3MDgwOSwKKzB4ZTE4LDB4ZmZmZmZmZmYsMHgwYTBjMGQwZiwKKzB4ZTFjLDB4ZmZmZmZmZmYsMHgwNjA3MDgwOSwKKzB4MTJjLDB4ZmZmZmZmZmYsMHgwNDAwMDgwMiwKKzB4MzE4LDB4MDAwMDBmZmYsMHgwMDAwMDgwMCwKK307CisKK3UzMiBSdGw4MTkyVXNiQUdDVEFCX0FycmF5W10gPSB7CisweGM3OCwweDdkMDAwMDAxLAorMHhjNzgsMHg3ZDAxMDAwMSwKKzB4Yzc4LDB4N2QwMjAwMDEsCisweGM3OCwweDdkMDMwMDAxLAorMHhjNzgsMHg3ZDA0MDAwMSwKKzB4Yzc4LDB4N2QwNTAwMDEsCisweGM3OCwweDdjMDYwMDAxLAorMHhjNzgsMHg3YjA3MDAwMSwKKzB4Yzc4LDB4N2EwODAwMDEsCisweGM3OCwweDc5MDkwMDAxLAorMHhjNzgsMHg3ODBhMDAwMSwKKzB4Yzc4LDB4NzcwYjAwMDEsCisweGM3OCwweDc2MGMwMDAxLAorMHhjNzgsMHg3NTBkMDAwMSwKKzB4Yzc4LDB4NzQwZTAwMDEsCisweGM3OCwweDczMGYwMDAxLAorMHhjNzgsMHg3MjEwMDAwMSwKKzB4Yzc4LDB4NzExMTAwMDEsCisweGM3OCwweDcwMTIwMDAxLAorMHhjNzgsMHg2ZjEzMDAwMSwKKzB4Yzc4LDB4NmUxNDAwMDEsCisweGM3OCwweDZkMTUwMDAxLAorMHhjNzgsMHg2YzE2MDAwMSwKKzB4Yzc4LDB4NmIxNzAwMDEsCisweGM3OCwweDZhMTgwMDAxLAorMHhjNzgsMHg2OTE5MDAwMSwKKzB4Yzc4LDB4NjgxYTAwMDEsCisweGM3OCwweDY3MWIwMDAxLAorMHhjNzgsMHg2NjFjMDAwMSwKKzB4Yzc4LDB4NjUxZDAwMDEsCisweGM3OCwweDY0MWUwMDAxLAorMHhjNzgsMHg0OTFmMDAwMSwKKzB4Yzc4LDB4NDgyMDAwMDEsCisweGM3OCwweDQ3MjEwMDAxLAorMHhjNzgsMHg0NjIyMDAwMSwKKzB4Yzc4LDB4NDUyMzAwMDEsCisweGM3OCwweDQ0MjQwMDAxLAorMHhjNzgsMHg0MzI1MDAwMSwKKzB4Yzc4LDB4MjgyNjAwMDEsCisweGM3OCwweDI3MjcwMDAxLAorMHhjNzgsMHgyNjI4MDAwMSwKKzB4Yzc4LDB4MjUyOTAwMDEsCisweGM3OCwweDI0MmEwMDAxLAorMHhjNzgsMHgyMzJiMDAwMSwKKzB4Yzc4LDB4MjIyYzAwMDEsCisweGM3OCwweDIxMmQwMDAxLAorMHhjNzgsMHgyMDJlMDAwMSwKKzB4Yzc4LDB4MGEyZjAwMDEsCisweGM3OCwweDA4MzAwMDAxLAorMHhjNzgsMHgwNjMxMDAwMSwKKzB4Yzc4LDB4MDUzMjAwMDEsCisweGM3OCwweDA0MzMwMDAxLAorMHhjNzgsMHgwMzM0MDAwMSwKKzB4Yzc4LDB4MDIzNTAwMDEsCisweGM3OCwweDAxMzYwMDAxLAorMHhjNzgsMHgwMDM3MDAwMSwKKzB4Yzc4LDB4MDAzODAwMDEsCisweGM3OCwweDAwMzkwMDAxLAorMHhjNzgsMHgwMDNhMDAwMSwKKzB4Yzc4LDB4MDAzYjAwMDEsCisweGM3OCwweDAwM2MwMDAxLAorMHhjNzgsMHgwMDNkMDAwMSwKKzB4Yzc4LDB4MDAzZTAwMDEsCisweGM3OCwweDAwM2YwMDAxLAorMHhjNzgsMHg3ZDQwMDAwMSwKKzB4Yzc4LDB4N2Q0MTAwMDEsCisweGM3OCwweDdkNDIwMDAxLAorMHhjNzgsMHg3ZDQzMDAwMSwKKzB4Yzc4LDB4N2Q0NDAwMDEsCisweGM3OCwweDdkNDUwMDAxLAorMHhjNzgsMHg3YzQ2MDAwMSwKKzB4Yzc4LDB4N2I0NzAwMDEsCisweGM3OCwweDdhNDgwMDAxLAorMHhjNzgsMHg3OTQ5MDAwMSwKKzB4Yzc4LDB4Nzg0YTAwMDEsCisweGM3OCwweDc3NGIwMDAxLAorMHhjNzgsMHg3NjRjMDAwMSwKKzB4Yzc4LDB4NzU0ZDAwMDEsCisweGM3OCwweDc0NGUwMDAxLAorMHhjNzgsMHg3MzRmMDAwMSwKKzB4Yzc4LDB4NzI1MDAwMDEsCisweGM3OCwweDcxNTEwMDAxLAorMHhjNzgsMHg3MDUyMDAwMSwKKzB4Yzc4LDB4NmY1MzAwMDEsCisweGM3OCwweDZlNTQwMDAxLAorMHhjNzgsMHg2ZDU1MDAwMSwKKzB4Yzc4LDB4NmM1NjAwMDEsCisweGM3OCwweDZiNTcwMDAxLAorMHhjNzgsMHg2YTU4MDAwMSwKKzB4Yzc4LDB4Njk1OTAwMDEsCisweGM3OCwweDY4NWEwMDAxLAorMHhjNzgsMHg2NzViMDAwMSwKKzB4Yzc4LDB4NjY1YzAwMDEsCisweGM3OCwweDY1NWQwMDAxLAorMHhjNzgsMHg2NDVlMDAwMSwKKzB4Yzc4LDB4NDk1ZjAwMDEsCisweGM3OCwweDQ4NjAwMDAxLAorMHhjNzgsMHg0NzYxMDAwMSwKKzB4Yzc4LDB4NDY2MjAwMDEsCisweGM3OCwweDQ1NjMwMDAxLAorMHhjNzgsMHg0NDY0MDAwMSwKKzB4Yzc4LDB4NDM2NTAwMDEsCisweGM3OCwweDI4NjYwMDAxLAorMHhjNzgsMHgyNzY3MDAwMSwKKzB4Yzc4LDB4MjY2ODAwMDEsCisweGM3OCwweDI1NjkwMDAxLAorMHhjNzgsMHgyNDZhMDAwMSwKKzB4Yzc4LDB4MjM2YjAwMDEsCisweGM3OCwweDIyNmMwMDAxLAorMHhjNzgsMHgyMTZkMDAwMSwKKzB4Yzc4LDB4MjA2ZTAwMDEsCisweGM3OCwweDBhNmYwMDAxLAorMHhjNzgsMHgwODcwMDAwMSwKKzB4Yzc4LDB4MDY3MTAwMDEsCisweGM3OCwweDA1NzIwMDAxLAorMHhjNzgsMHgwNDczMDAwMSwKKzB4Yzc4LDB4MDM3NDAwMDEsCisweGM3OCwweDAyNzUwMDAxLAorMHhjNzgsMHgwMTc2MDAwMSwKKzB4Yzc4LDB4MDA3NzAwMDEsCisweGM3OCwweDAwNzgwMDAxLAorMHhjNzgsMHgwMDc5MDAwMSwKKzB4Yzc4LDB4MDA3YTAwMDEsCisweGM3OCwweDAwN2IwMDAxLAorMHhjNzgsMHgwMDdjMDAwMSwKKzB4Yzc4LDB4MDA3ZDAwMDEsCisweGM3OCwweDAwN2UwMDAxLAorMHhjNzgsMHgwMDdmMDAwMSwKKzB4Yzc4LDB4MmUwMDAwMWUsCisweGM3OCwweDJlMDEwMDFlLAorMHhjNzgsMHgyZTAyMDAxZSwKKzB4Yzc4LDB4MmUwMzAwMWUsCisweGM3OCwweDJlMDQwMDFlLAorMHhjNzgsMHgyZTA1MDAxZSwKKzB4Yzc4LDB4MzAwNjAwMWUsCisweGM3OCwweDM0MDcwMDFlLAorMHhjNzgsMHgzOTA4MDAxZSwKKzB4Yzc4LDB4M2MwOTAwMWUsCisweGM3OCwweDNmMGEwMDFlLAorMHhjNzgsMHg0MjBiMDAxZSwKKzB4Yzc4LDB4NDQwYzAwMWUsCisweGM3OCwweDQ1MGQwMDFlLAorMHhjNzgsMHg0NjBlMDAxZSwKKzB4Yzc4LDB4NDYwZjAwMWUsCisweGM3OCwweDQ3MTAwMDFlLAorMHhjNzgsMHg0ODExMDAxZSwKKzB4Yzc4LDB4NDkxMjAwMWUsCisweGM3OCwweDRhMTMwMDFlLAorMHhjNzgsMHg0YjE0MDAxZSwKKzB4Yzc4LDB4NGIxNTAwMWUsCisweGM3OCwweDRjMTYwMDFlLAorMHhjNzgsMHg0ZDE3MDAxZSwKKzB4Yzc4LDB4NGUxODAwMWUsCisweGM3OCwweDRmMTkwMDFlLAorMHhjNzgsMHg0ZjFhMDAxZSwKKzB4Yzc4LDB4NTAxYjAwMWUsCisweGM3OCwweDUxMWMwMDFlLAorMHhjNzgsMHg1MjFkMDAxZSwKKzB4Yzc4LDB4NTIxZTAwMWUsCisweGM3OCwweDUzMWYwMDFlLAorMHhjNzgsMHg1MzIwMDAxZSwKKzB4Yzc4LDB4NTQyMTAwMWUsCisweGM3OCwweDU1MjIwMDFlLAorMHhjNzgsMHg1NTIzMDAxZSwKKzB4Yzc4LDB4NTYyNDAwMWUsCisweGM3OCwweDU3MjUwMDFlLAorMHhjNzgsMHg1NzI2MDAxZSwKKzB4Yzc4LDB4NTgyNzAwMWUsCisweGM3OCwweDU4MjgwMDFlLAorMHhjNzgsMHg1OTI5MDAxZSwKKzB4Yzc4LDB4NTkyYTAwMWUsCisweGM3OCwweDVhMmIwMDFlLAorMHhjNzgsMHg1YjJjMDAxZSwKKzB4Yzc4LDB4NWMyZDAwMWUsCisweGM3OCwweDVjMmUwMDFlLAorMHhjNzgsMHg1ZDJmMDAxZSwKKzB4Yzc4LDB4NWUzMDAwMWUsCisweGM3OCwweDVmMzEwMDFlLAorMHhjNzgsMHg2MDMyMDAxZSwKKzB4Yzc4LDB4NjAzMzAwMWUsCisweGM3OCwweDYxMzQwMDFlLAorMHhjNzgsMHg2MjM1MDAxZSwKKzB4Yzc4LDB4NjMzNjAwMWUsCisweGM3OCwweDY0MzcwMDFlLAorMHhjNzgsMHg2NDM4MDAxZSwKKzB4Yzc4LDB4NjUzOTAwMWUsCisweGM3OCwweDY2M2EwMDFlLAorMHhjNzgsMHg2NzNiMDAxZSwKKzB4Yzc4LDB4NjczYzAwMWUsCisweGM3OCwweDY4M2QwMDFlLAorMHhjNzgsMHg2OTNlMDAxZSwKKzB4Yzc4LDB4NmEzZjAwMWUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZV9pbWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkOTUxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmVfaW1nLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBJTUdfSAorI2RlZmluZSBJTUdfSAorCisjZGVmaW5lIEJPT1RfQVJSX0xFTiAzNDQKKyNkZWZpbmUgTUFJTl9BUlJfTEVOIDQ1MTM2CisjZGVmaW5lIERBVEFfQVJSX0xFTiA3OTYKKyNkZWZpbmUgTUFDUEhZX0FycmF5X1BHTGVuZ3RoIDMwCisjZGVmaW5lIFBIWV9SRUdfMVQyUkFycmF5TGVuZ3RoIDI5NgorI2RlZmluZSBBR0NUQUJfQXJyYXlMZW5ndGggMzg0CisjZGVmaW5lIE1BQ1BIWV9BcnJheUxlbmd0aCAxOAorCisjZGVmaW5lIFJhZGlvQV9BcnJheUxlbmd0aCAyNDYKKyNkZWZpbmUgUmFkaW9CX0FycmF5TGVuZ3RoIDc4CisjZGVmaW5lIFJhZGlvQ19BcnJheUxlbmd0aCAxCisjZGVmaW5lIFJhZGlvRF9BcnJheUxlbmd0aCAxCisjZGVmaW5lIFBIWV9SRUdBcnJheUxlbmd0aCAxCisKKworZXh0ZXJuIHU4IHJ0bDgxOTBfZndib290X2FycmF5W0JPT1RfQVJSX0xFTl07CitleHRlcm4gdTggcnRsODE5MF9md21haW5fYXJyYXlbTUFJTl9BUlJfTEVOXTsKK2V4dGVybiB1OCBydGw4MTkwX2Z3ZGF0YV9hcnJheVtEQVRBX0FSUl9MRU5dOworCitleHRlcm4gdTMyIFJ0bDgxOTJVc2JQSFlfUkVHQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYlBIWV9SRUdfMVQyUkFycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JSYWRpb0FfQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYlJhZGlvQl9BcnJheVtdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiUmFkaW9DX0FycmF5W107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JSYWRpb0RfQXJyYXlbXTsKK2V4dGVybiB1MzIgUnRsODE5MlVzYk1BQ1BIWV9BcnJheVtdOworZXh0ZXJuIHUzMiBSdGw4MTkyVXNiTUFDUEhZX0FycmF5X1BHW107CitleHRlcm4gdTMyIFJ0bDgxOTJVc2JBR0NUQUJfQXJyYXlbXTsKKworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhZGFlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKQEAgLTAsMCArMSwxNzc3IEBACisjaW5jbHVkZSAicjgxOTJVLmgiCisjaW5jbHVkZSAicjgxOTJVX2h3LmgiCisjaW5jbHVkZSAicjgxOXhVX3BoeS5oIgorI2luY2x1ZGUgInI4MTl4VV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5MF9ydGw4MjU2LmgiCisjaW5jbHVkZSAicjgxOTJVX2RtLmgiCisjaW5jbHVkZSAicjgxOXhVX2Zpcm13YXJlX2ltZy5oIgorCisjaWZkZWYgRU5BQkxFX0RPVDExRAorI2luY2x1ZGUgImRvdDExZC5oIgorI2VuZGlmCitzdGF0aWMgdTMyIFJGX0NIQU5ORUxfVEFCTEVfWkVCUkFbXSA9IHsKKwkwLAorCTB4MDg1YywgLy8yNDEyIDEKKwkweDA4ZGMsIC8vMjQxNyAyCisJMHgwOTVjLCAvLzI0MjIgMworCTB4MDlkYywgLy8yNDI3IDQKKwkweDBhNWMsIC8vMjQzMiA1CisJMHgwYWRjLCAvLzI0MzcgNgorCTB4MGI1YywgLy8yNDQyIDcKKwkweDBiZGMsIC8vMjQ0NyA4CisJMHgwYzVjLCAvLzI0NTIgOQorCTB4MGNkYywgLy8yNDU3IDEwCisJMHgwZDVjLCAvLzI0NjIgMTEKKwkweDBkZGMsIC8vMjQ2NyAxMgorCTB4MGU1YywgLy8yNDcyIDEzCisJMHgwZjcyLCAvLzI0ODQKK307CisKKworI2RlZmluZSBydGw4MTlYUEhZX1JFR18xVDJSQXJyYXkgUnRsODE5MlVzYlBIWV9SRUdfMVQyUkFycmF5CisjZGVmaW5lIHJ0bDgxOVhNQUNQSFlfQXJyYXlfUEcgUnRsODE5MlVzYk1BQ1BIWV9BcnJheV9QRworI2RlZmluZSBydGw4MTlYTUFDUEhZX0FycmF5IFJ0bDgxOTJVc2JNQUNQSFlfQXJyYXkKKyNkZWZpbmUgcnRsODE5WFJhZGlvQV9BcnJheSAgUnRsODE5MlVzYlJhZGlvQV9BcnJheQorI2RlZmluZSBydGw4MTlYUmFkaW9CX0FycmF5IFJ0bDgxOTJVc2JSYWRpb0JfQXJyYXkKKyNkZWZpbmUgcnRsODE5WFJhZGlvQ19BcnJheSBSdGw4MTkyVXNiUmFkaW9DX0FycmF5CisjZGVmaW5lIHJ0bDgxOVhSYWRpb0RfQXJyYXkgUnRsODE5MlVzYlJhZGlvRF9BcnJheQorI2RlZmluZSBydGw4MTlYQUdDVEFCX0FycmF5IFJ0bDgxOTJVc2JBR0NUQUJfQXJyYXkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZCBCQiBwYXJhbWV0ZXJzIGZyb20gSGVhZGVyIGZpbGUgd2UgZ2VuLAorICoJICAgICBhbmQgZG8gcmVnaXN0ZXIgcmVhZC93cml0ZQorICogICBpbnB1dDogIHUzMglkd0JpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSBtb2RpZmllZAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICB1MzIJcmV0dXJuIHRoZSBzaGlmdCBiaXQgYml0IHBvc2l0aW9uIG9mIHRoZSBtYXNrCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQodTMyIGR3Qml0TWFzaykKK3sKKwl1MzIgaTsKKwlmb3IgKGk9MDsgaTw9MzE7IGkrKykKKwl7CisJCWlmICgoKGR3Qml0TWFzaz4+aSkmMHgxKSA9PSAxKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gY2hlY2sgZGlmZmVyZW50IFJGIHR5cGUgdG8gZXhlY3V0ZSBsZWdhbCBqdWRnZW1lbnQuIElmIFJGIFBhdGggaXMgaWxsZWdhbCwgd2Ugd2lsbCByZXR1cm4gZmFsc2UuCisgKiAgIGlucHV0OiAgbm9uZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICAwKGlsbGVnYWwsIGZhbHNlKSwgMShsZWdhbCx0cnVlKQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBlUkZQYXRoKQoreworCXU4IHJldCA9IDE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUNFIpCisJCXJldCA9IDA7CisJZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCXsKKwkJaWYgKGVSRlBhdGggPT0gUkY5MF9QQVRIX0EgfHwgZVJGUGF0aCA9PSBSRjkwX1BBVEhfQikKKwkJCXJldCA9IDE7CisJCWVsc2UgaWYgKGVSRlBhdGggPT0gUkY5MF9QQVRIX0MgfHwgZVJGUGF0aCA9PSBSRjkwX1BBVEhfRCkKKwkJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgc3BlY2lmaWMgYml0cyB0byBCQiByZWdpc3RlcgorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgICAgICAgICAgdTMyCWR3UmVnQWRkciAgLy90YXJnZXQgYWRkciB0byBiZSBtb2RpZmllZAorICogICAgICAgICAgIHUzMglkd0JpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSBtb2RpZmllZAorICogICAgICAgICAgIHUzMglkd0RhdGEgICAgIC8vdmFsdWUgdG8gYmUgd3JpdGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfc2V0QkJyZWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTMyIGR3UmVnQWRkciwgdTMyIGR3Qml0TWFzaywgdTMyIGR3RGF0YSkKK3sKKworCXUzMiBPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdCwgTmV3VmFsdWU7CisKKwlpZihkd0JpdE1hc2shPSBiTWFza0RXb3JkKQorCXsvL2lmIG5vdCAiZG91YmxlIHdvcmQiIHdyaXRlCisJCU9yaWdpbmFsVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIGR3UmVnQWRkcik7CisJCUJpdFNoaWZ0ID0gcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdChkd0JpdE1hc2spOworCQlOZXdWYWx1ZSA9ICgoKE9yaWdpbmFsVmFsdWUpICYgKH5kd0JpdE1hc2spKSB8IChkd0RhdGEgPDwgQml0U2hpZnQpKTsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgZHdSZWdBZGRyLCBOZXdWYWx1ZSk7CisJfWVsc2UKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgZHdSZWdBZGRyLCBkd0RhdGEpOworCXJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHNwZWNpZmljIGJpdHMgZnJvbSBCQiByZWdpc3RlcgorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgICAgICAgICAgdTMyCWR3UmVnQWRkciAgLy90YXJnZXQgYWRkciB0byBiZSByZWFkYmFjaworICogICAgICAgICAgIHUzMglkd0JpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSByZWFkYmFjaworICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICB1MzIJRGF0YQkvL3RoZSByZWFkYmFjayByZWdpc3RlciB2YWx1ZQorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgcnRsODE5Ml9RdWVyeUJCUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBkd1JlZ0FkZHIsIHUzMiBkd0JpdE1hc2spCit7CisJdTMyIFJldCA9IDAsIE9yaWdpbmFsVmFsdWUsIEJpdFNoaWZ0OworCisJT3JpZ2luYWxWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKGRldiwgZHdSZWdBZGRyKTsKKwlCaXRTaGlmdCA9IHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoZHdCaXRNYXNrKTsKKwlSZXQgPShPcmlnaW5hbFZhbHVlICYgZHdCaXRNYXNrKSA+PiBCaXRTaGlmdDsKKworCXJldHVybiAoUmV0KTsKK30KK3N0YXRpYyAgdTMyIHBoeV9Gd1JGU2VyaWFsUmVhZCggc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgICAgICAgZVJGUGF0aCwgdTMyIE9mZnNldCAgKTsKKworc3RhdGljIHZvaWQgcGh5X0Z3UkZTZXJpYWxXcml0ZSggc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgICAgICAgZVJGUGF0aCwgdTMyICBPZmZzZXQsIHUzMiAgRGF0YSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgcmVnaXN0ZXIgZnJvbSBSRiBjaGlwCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICAgCSAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCAvL3JhZGlvIHBhdGggb2YgQS9CL0MvRAorICogICAgICAgICAgIHUzMglPZmZzZXQgICAgIC8vdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICB1MzIgCXJlYWRiYWNrIHZhbHVlCisgKiAgbm90aWNlOiAgVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIHNlcmlhbCBvcGVyYXRpb25zOigxKSBTb2Z0d2FyZSBzZXJpYWwgd3JpdGUuKDIpSGFyZHdhcmUgTFNTSS1Mb3cgU3BlZWQgU2VyaWFsIEludGVyZmFjZS4oMylIYXJkd2FyZSBIU1NJLUhpZ2ggc3BlZWQgc2VyaWFsIHdyaXRlLiBEcml2ZXIgaGVyZSBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKS0tLW5lZWQgbW9yZSBzcGVjIGZvciB0aGlzIGluZm9ybWF0aW9uLgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyIHJldCA9IDA7CisJdTMyIE5ld09mZnNldCA9IDA7CisJQkJfUkVHSVNURVJfREVGSU5JVElPTl9UKiBwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2ssIGJMU1NJUmVhZEJhY2tEYXRhLCAwKTsKKwkvL21ha2Ugc3VyZSBSRiByZWdpc3RlciBvZmZzZXQgaXMgY29ycmVjdAorCU9mZnNldCAmPSAweDNmOworCisJLy9zd2l0Y2ggcGFnZSBmb3IgODI1NiBSRiBJQworCWlmIChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpCisJeworCQlpZiAoT2Zmc2V0ID49IDMxKQorCQl7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDE0MDsKKwkJCS8vU3dpdGNoIHRvIFJlZ19Nb2RlMiBmb3IgUmVnIDMxLTQ1CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdPDwxNikgKTsKKwkJCS8vbW9kaWZ5IG9mZnNldAorCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0zMDsKKwkJfQorCQllbHNlIGlmIChPZmZzZXQgPj0gMTYpCisJCXsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTAwOworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gKH4weDQwKTsKKwkJCS8vU3dpdGNoIHRvIFJlZ19Nb2RlIDEgZm9yIFJlZzE2LTMwCisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdPDwxNikgKTsKKworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMTU7CisJCX0KKwkJZWxzZQorCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0OworCX0KKwllbHNlCisJeworCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIHRvIGJlIDgyNTZcbiIpOworCQlOZXdPZmZzZXQgPSBPZmZzZXQ7CisJfQorCS8vcHV0IGRlc2lyZWQgcmVhZCBhZGRyIHRvIExTU0kgY29udHJvbCBSZWdpc3RlcgorCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgYkxTU0lSZWFkQWRkcmVzcywgTmV3T2Zmc2V0KTsKKwkvL0lzc3VlIGEgcG9zZWRnZSB0cmlnZ2VyCisJLy8KKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsICBiTFNTSVJlYWRFZGdlLCAweDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgIGJMU1NJUmVhZEVkZ2UsIDB4MSk7CisKKworCS8vIFRPRE86IHdlIHNob3VsZCBub3QgZGVsYXkgc3VjaCBhICBsb25nIHRpbWUuIEFzayBoZWxwIGZyb20gU0QzCisJbXNsZWVwKDEpOworCisJcmV0ID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2ssIGJMU1NJUmVhZEJhY2tEYXRhKTsKKworCisJLy8gU3dpdGNoIGJhY2sgdG8gUmVnX01vZGUwOworCWlmKHByaXYtPnJmX2NoaXAgPT0gUkZfODI1NikKKwl7CisJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9IDB4ZWJmOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoCisJCQlkZXYsCisJCQlwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LAorCQkJYk1hc2tEV29yZCwKKwkJCShwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA8PCAxNikpOworCX0KKworCXJldHVybiByZXQ7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gd3JpdGUgZGF0YSB0byBSRiByZWdpc3RlcgorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgIAkgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGggLy9yYWRpbyBwYXRoIG9mIEEvQi9DL0QKKyAqICAgICAgICAgICB1MzIJT2Zmc2V0ICAgICAvL3RhcmdldCBhZGRyZXNzIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgICAgICB1MzIJRGF0YQkvL1RoZSBuZXcgcmVnaXN0ZXIgZGF0YSB0byBiZSB3cml0dGVuCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBGb3IgUkY4MjU2IG9ubHkuCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKlJlZyBNb2RlCVJlZ0NUTFsxXQlSZWdDVExbMF0JCU5vdGUKKyAqCQkoUmVnMDBbMTJdKQkoUmVnMDBbMTBdKQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICpSZWdfTW9kZTAJMAkJeAkJCVJlZyAwIH4xNSgweDAgfiAweGYpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICpSZWdfTW9kZTEJMQkJMAkJCVJlZyAxNiB+MzAoMHgxIH4gMHhmKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJlZ19Nb2RlMgkxCQkxCQkJUmVnIDMxIH4gNDUoMHgxIH4gMHhmKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCwgdTMyIERhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBEYXRhQW5kQWRkciA9IDAsIE5ld09mZnNldCA9IDA7CisJQkJfUkVHSVNURVJfREVGSU5JVElPTl9UCSpwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKKworCU9mZnNldCAmPSAweDNmOworCS8vc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX2xvY2ssIGZsYWdzKTsKKy8vCWRvd24oJnByaXYtPnJmX3NlbSk7CisJaWYgKHByaXYtPnJmX2NoaXAgPT0gUkZfODI1NikKKwl7CisKKwkJaWYgKE9mZnNldCA+PSAzMSkKKwkJeworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gfD0gMHgxNDA7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIDw8IDE2KSk7CisJCQlOZXdPZmZzZXQgPSBPZmZzZXQgLSAzMDsKKwkJfQorCQllbHNlIGlmIChPZmZzZXQgPj0gMTYpCisJCXsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTAwOworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gKH4weDQwKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCAocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF08PDE2KSk7CisJCQlOZXdPZmZzZXQgPSBPZmZzZXQgLSAxNTsKKwkJfQorCQllbHNlCisJCQlOZXdPZmZzZXQgPSBPZmZzZXQ7CisJfQorCWVsc2UKKwl7CisJCVJUX1RSQUNFKChDT01QX1BIWXxDT01QX0VSUiksICJjaGVjayBSRiB0eXBlIGhlcmUsIG5lZWQgdG8gYmUgODI1NlxuIik7CisJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9CisKKwkvLyBQdXQgd3JpdGUgYWRkciBpbiBbNTowXSAgYW5kIHdyaXRlIGRhdGEgaW4gWzMxOjE2XQorCURhdGFBbmRBZGRyID0gKERhdGE8PDE2KSB8IChOZXdPZmZzZXQmMHgzZik7CisKKwkvLyBXcml0ZSBPcGVyYXRpb24KKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwgYk1hc2tEV29yZCwgRGF0YUFuZEFkZHIpOworCisKKwlpZihPZmZzZXQ9PTB4MCkKKwkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gPSBEYXRhOworCisJLy8gU3dpdGNoIGJhY2sgdG8gUmVnX01vZGUwOworCWlmKHByaXYtPnJmX2NoaXAgPT0gUkZfODI1NikKKwl7CisJCWlmKE9mZnNldCAhPSAwKQorCQl7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSAmPSAweGViZjsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoCisJCQkJZGV2LAorCQkJCXBQaHlSZWctPnJmM3dpcmVPZmZzZXQsCisJCQkJYk1hc2tEV29yZCwKKwkJCQkocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gPDwgMTYpKTsKKwkJfQorCX0KKwkvL3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX2xvY2ssIGZsYWdzKTsKKy8vCXVwKCZwcml2LT5yZl9zZW0pOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IHNwZWNpZmljIGJpdHMgdG8gUkYgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAJICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoIC8vcmFkaW8gcGF0aCBvZiBBL0IvQy9ECisgKiAgICAgICAgICAgdTMyCVJlZ0FkZHIgIC8vdGFyZ2V0IGFkZHIgdG8gYmUgbW9kaWZpZWQKKyAqICAgICAgICAgICB1MzIJQml0TWFzayAgLy90YWdldCBiaXQgcG9zIGluIHRoZSBhZGRyIHRvIGJlIG1vZGlmaWVkCisgKiAgICAgICAgICAgdTMyCURhdGEgICAgIC8vdmFsdWUgdG8gYmUgd3JpdGUKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgbm9uZQorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X1NldFJGUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaywgdTMyIERhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCXUzMiBPcmlnaW5hbF9WYWx1ZSwgQml0U2hpZnQsIE5ld19WYWx1ZTsKKy8vCXU4CXRpbWUgPSAwOworCisJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoZGV2LCBlUkZQYXRoKSkKKwkJcmV0dXJuOworCisJaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpCisJeworCQlpZiAoQml0TWFzayAhPSBiTWFzazEyQml0cykgLy8gUkYgZGF0YSBpcyAxMiBiaXRzIG9ubHkKKwkJeworCQkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfRndSRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKKwkJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCQlOZXdfVmFsdWUgPSAoKE9yaWdpbmFsX1ZhbHVlKSAmICh+Qml0TWFzaykpIHwgKERhdGE8PCBCaXRTaGlmdCk7CisKKwkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBOZXdfVmFsdWUpOworCQl9ZWxzZQorCQkJcGh5X0Z3UkZTZXJpYWxXcml0ZShkZXYsIGVSRlBhdGgsIFJlZ0FkZHIsIERhdGEpOworCisJCXVkZWxheSgyMDApOworCisJfQorCWVsc2UKKwl7CisJCWlmIChCaXRNYXNrICE9IGJNYXNrMTJCaXRzKSAvLyBSRiBkYXRhIGlzIDEyIGJpdHMgb25seQorCQl7CisJCQlPcmlnaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1JGU2VyaWFsUmVhZChkZXYsIGVSRlBhdGgsIFJlZ0FkZHIpOworCQkJQml0U2hpZnQgPSAgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKKwkJCU5ld19WYWx1ZSA9ICgoKE9yaWdpbmFsX1ZhbHVlKSAmICh+Qml0TWFzaykpIHwgKERhdGE8PCBCaXRTaGlmdCkpOworCisJCQlydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKGRldiwgZVJGUGF0aCwgUmVnQWRkciwgTmV3X1ZhbHVlKTsKKwkJfWVsc2UKKwkJCXJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkcyBzcGVjaWZpYyBiaXRzIGZyb20gUkYgcmVnaXN0ZXIKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogICAgICAgICAgIHUzMglSZWdBZGRyICAvL3RhcmdldCBhZGRyIHRvIGJlIHJlYWRiYWNrCisgKiAgICAgICAgICAgdTMyCUJpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSByZWFkYmFjaworICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICB1MzIJRGF0YQkvL3RoZSByZWFkYmFjayByZWdpc3RlciB2YWx1ZQorICogIG5vdGljZToKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spCit7CisJdTMyIE9yaWdpbmFsX1ZhbHVlLCBSZWFkYmFja19WYWx1ZSwgQml0U2hpZnQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisKKwlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorCQlyZXR1cm4gMDsKKwlpZiAocHJpdi0+UmZfTW9kZSA9PSBSRl9PUF9CeV9GVykKKwl7CisJCU9yaWdpbmFsX1ZhbHVlID0gcGh5X0Z3UkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CisJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7CisJCXVkZWxheSgyMDApOworCQlyZXR1cm4gKFJlYWRiYWNrX1ZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJT3JpZ2luYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKKwkJQml0U2hpZnQgPSAgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKKwkJUmVhZGJhY2tfVmFsdWUgPSAoT3JpZ2luYWxfVmFsdWUgJiBCaXRNYXNrKSA+PiBCaXRTaGlmdDsKKwkJcmV0dXJuIChSZWFkYmFja19WYWx1ZSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFdlIHN1cHBvcnQgZmlybXdhcmUgdG8gZXhlY3V0ZSBSRi1SL1cuCisgKiAgIGlucHV0OiAgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMJdTMyCitwaHlfRndSRlNlcmlhbFJlYWQoCisJc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwlSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoLAorCXUzMgkJCQlPZmZzZXQJKQoreworCXUzMgkJcmV0VmFsdWUgPSAwOworCXUzMgkJRGF0YSA9IDA7CisJdTgJCXRpbWUgPSAwOworCS8vRGJnUHJpbnQoIkZXIFJGIENUUkxcblxyIik7CisJLyogMjAwNy8xMS8wMiBNSCBGaXJtd2FyZSBSRiBXcml0ZSBjb250cm9sLiBCeSBGcmFuY2lzJyBzdWdnZXN0aW9uLCB3ZSBjYW4KKwkgICBub3QgZXhlY3V0ZSB0aGUgc2NoZW1lIGluIHRoZSBpbml0aWFsIHN0ZXAuIE90aGVyd2lzZSwgUkYtUi9XIHdpbGwgd2FzdGUKKwkgICBtdWNoIHRpbWUuIFRoaXMgaXMgb25seSBmb3Igc2l0ZSBzdXJ2ZXkuICovCisJLy8gMS4gUmVhZCBvcGVyYXRpb24gbmVlZCBub3QgaW5zZXJ0IGRhdGEuIGJpdCAwLTExCisJLy9EYXRhICY9IGJNYXNrMTJCaXRzOworCS8vIDIuIFdyaXRlIFJGIHJlZ2lzdGVyIGFkZHJlc3MuIEJpdCAxMi0xOQorCURhdGEgfD0gKChPZmZzZXQmMHhGRik8PDEyKTsKKwkvLyAzLiBXcml0ZSBSRiBwYXRoLiAgYml0IDIwLTIxCisJRGF0YSB8PSAoKGVSRlBhdGgmMHgzKTw8MjApOworCS8vIDQuIFNldCBSRiByZWFkIGluZGljYXRvci4gYml0IDIyPTAKKwkvL0RhdGEgfD0gMHgwMDAwMDsKKwkvLyA1LiBUcmlnZ2VyIEZ3IHRvIG9wZXJhdGUgdGhlIGNvbW1hbmQuIGJpdCAzMQorCURhdGEgfD0gMHg4MDAwMDAwMDsKKwkvLyA2LiBXZSBjYW4gbm90IGV4ZWN1dGUgcmVhZCBvcGVyYXRpb24gaWYgYml0IDMxIGlzIDEuCisJd2hpbGUgKHJlYWRfbmljX2R3b3JkKGRldiwgUVBOUikmMHg4MDAwMDAwMCkKKwl7CisJCS8vIElmIEZXIGNhbiBub3QgZmluaXNoIFJGLVIvVyBmb3IgbW9yZSB0aGFuID8/IHRpbWVzLiBXZSBtdXN0IHJlc2V0IEZXLgorCQlpZiAodGltZSsrIDwgMTAwKQorCQl7CisJCQkvL0RiZ1ByaW50KCJGVyBub3QgZmluaXNoIFJGLVIgVGltZT0lZFxuXHIiLCB0aW1lKTsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCS8vIDcuIEV4ZWN1dGUgcmVhZCBvcGVyYXRpb24uCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUVBOUiwgRGF0YSk7CisJLy8gOC4gQ2hlY2sgaWYgZmlybWF3cmUgc2VuZCBiYWNrIFJGIGNvbnRlbnQuCisJd2hpbGUgKHJlYWRfbmljX2R3b3JkKGRldiwgUVBOUikmMHg4MDAwMDAwMCkKKwl7CisJCS8vIElmIEZXIGNhbiBub3QgZmluaXNoIFJGLVIvVyBmb3IgbW9yZSB0aGFuID8/IHRpbWVzLiBXZSBtdXN0IHJlc2V0IEZXLgorCQlpZiAodGltZSsrIDwgMTAwKQorCQl7CisJCQkvL0RiZ1ByaW50KCJGVyBub3QgZmluaXNoIFJGLVcgVGltZT0lZFxuXHIiLCB0aW1lKTsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuCSgwKTsKKwl9CisJcmV0VmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIFJGX0RBVEEpOworCisJcmV0dXJuCShyZXRWYWx1ZSk7CisKK30JLyogcGh5X0Z3UkZTZXJpYWxSZWFkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBXZSBzdXBwb3J0IGZpcm13YXJlIHRvIGV4ZWN1dGUgUkYtUi9XLgorICogICBpbnB1dDogIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3BoeV9Gd1JGU2VyaWFsV3JpdGUoCisJCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCVJGOTBfUkFESU9fUEFUSF9FCWVSRlBhdGgsCisJCXUzMgkJCQlPZmZzZXQsCisJCXUzMgkJCQlEYXRhCSkKK3sKKwl1OAl0aW1lID0gMDsKKworCS8vRGJnUHJpbnQoIk4gRlcgUkYgQ1RSTCBSRi0lZCBPRiUwMnggREFUQT0lMDN4XG5cciIsIGVSRlBhdGgsIE9mZnNldCwgRGF0YSk7CisJLyogMjAwNy8xMS8wMiBNSCBGaXJtd2FyZSBSRiBXcml0ZSBjb250cm9sLiBCeSBGcmFuY2lzJyBzdWdnZXN0aW9uLCB3ZSBjYW4KKwkgICBub3QgZXhlY3V0ZSB0aGUgc2NoZW1lIGluIHRoZSBpbml0aWFsIHN0ZXAuIE90aGVyd2lzZSwgUkYtUi9XIHdpbGwgd2FzdGUKKwkgICBtdWNoIHRpbWUuIFRoaXMgaXMgb25seSBmb3Igc2l0ZSBzdXJ2ZXkuICovCisKKwkvLyAxLiBTZXQgZHJpdmVyIHdyaXRlIGJpdCBhbmQgMTIgYml0IGRhdGEuIGJpdCAwLTExCisJLy9EYXRhICY9IGJNYXNrMTJCaXRzOwkvLyBEb25lIGJ5IHVwZXIgbGF5ZXIuCisJLy8gMi4gV3JpdGUgUkYgcmVnaXN0ZXIgYWRkcmVzcy4gYml0IDEyLTE5CisJRGF0YSB8PSAoKE9mZnNldCYweEZGKTw8MTIpOworCS8vIDMuIFdyaXRlIFJGIHBhdGguICBiaXQgMjAtMjEKKwlEYXRhIHw9ICgoZVJGUGF0aCYweDMpPDwyMCk7CisJLy8gNC4gU2V0IFJGIHdyaXRlIGluZGljYXRvci4gYml0IDIyPTEKKwlEYXRhIHw9IDB4NDAwMDAwOworCS8vIDUuIFRyaWdnZXIgRncgdG8gb3BlcmF0ZSB0aGUgY29tbWFuZC4gYml0IDMxPTEKKwlEYXRhIHw9IDB4ODAwMDAwMDA7CisKKwkvLyA2LiBXcml0ZSBvcGVyYXRpb24uIFdlIGNhbiBub3Qgd3JpdGUgaWYgYml0IDMxIGlzIDEuCisJd2hpbGUgKHJlYWRfbmljX2R3b3JkKGRldiwgUVBOUikmMHg4MDAwMDAwMCkKKwl7CisJCS8vIElmIEZXIGNhbiBub3QgZmluaXNoIFJGLVIvVyBmb3IgbW9yZSB0aGFuID8/IHRpbWVzLiBXZSBtdXN0IHJlc2V0IEZXLgorCQlpZiAodGltZSsrIDwgMTAwKQorCQl7CisJCQkvL0RiZ1ByaW50KCJGVyBub3QgZmluaXNoIFJGLVcgVGltZT0lZFxuXHIiLCB0aW1lKTsKKwkJCXVkZWxheSgxMCk7CisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCS8vIDcuIE5vIG1hdHRlciBjaGVjayBiaXQuIFdlIGFsd2F5cyBmb3JjZSB0aGUgd3JpdGUuIEJlY2F1c2UgRlcgd2lsbAorCS8vICAgIG5vdCBhY2NlcHQgdGhlIGNvbW1hbmQuCisJd3JpdGVfbmljX2R3b3JkKGRldiwgUVBOUiwgRGF0YSk7CisJLyogMjAwNy8xMS8wMiBNSCBBY29vcmRpbmcgdG8gdGVzdCwgd2UgbXVzdCBkZWxheSAyMHVzIHRvIHdhaXQgZmlybXdhcmUKKwkgICB0byBmaW5pc2ggUkYgd3JpdGUgb3BlcmF0aW9uLiAqLworCS8qIDIwMDgvMDEvMTcgTUggV2Ugc3VwcG9ydCBkZWxheSBpbiBmaXJtd2FyZSBzaWRlIG5vdy4gKi8KKwkvL2RlbGF5X3VzKDIwKTsKKworfQkvKiBwaHlfRndSRlNlcmlhbFdyaXRlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZCBCQiBwYXJhbWV0ZXJzIGZyb20gSGVhZGVyIGZpbGUgd2UgZ2VuLAorICoJICAgICBhbmQgZG8gcmVnaXN0ZXIgcmVhZC93cml0ZQorICogICBpbnB1dDogIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgQkIgcGFyYW1ldGVycyBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKKyAqICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X2NvbmZpZ21hYyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXUzMiBkd0FycmF5TGVuID0gMCwgaTsKKwl1MzIqIHBkd0FycmF5ID0gTlVMTDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihwcml2LT5idHhwb3dlcmRhdGFfcmVhZGZyb21FRVBPUk0pCisJeworCQlSVF9UUkFDRShDT01QX1BIWSwgIlJ0bDgxOVhNQUNQSFlfQXJyYXlfUEdcbiIpOworCQlkd0FycmF5TGVuID0gTUFDUEhZX0FycmF5X1BHTGVuZ3RoOworCQlwZHdBcnJheSA9IHJ0bDgxOVhNQUNQSFlfQXJyYXlfUEc7CisKKwl9CisJZWxzZQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9QSFksICJSdGw4MTlYTUFDUEhZX0FycmF5XG4iKTsKKwkJZHdBcnJheUxlbiA9IE1BQ1BIWV9BcnJheUxlbmd0aDsKKwkJcGR3QXJyYXkgPSBydGw4MTlYTUFDUEhZX0FycmF5OworCX0KKwlmb3IoaSA9IDA7IGk8ZHdBcnJheUxlbjsgaT1pKzMpeworCQlpZihwZHdBcnJheVtpXSA9PSAweDMxOCkKKwkJeworCQkJcGR3QXJyYXlbaSsyXSA9IDB4MDAwMDA4MDA7CisJCQkvL0RiZ1ByaW50KCJwdHJBcnJheVtpXSwgcHRyQXJyYXlbaSsxXSwgcHRyQXJyYXlbaSsyXSA9ICV4LCAleCwgJXhcbiIsCisJCQkvLwlwdHJBcnJheVtpXSwgcHRyQXJyYXlbaSsxXSwgcHRyQXJyYXlbaSsyXSk7CisJCX0KKworCQlSVF9UUkFDRShDT01QX0RCRywgIlRoZSBSdGw4MTkwTUFDUEhZX0FycmF5WzBdIGlzICV4IFJ0bDgxOTBNQUNQSFlfQXJyYXlbMV0gaXMgJXggUnRsODE5ME1BQ1BIWV9BcnJheVsyXSBpcyAleFxuIiwKKwkJCQlwZHdBcnJheVtpXSwgcGR3QXJyYXlbaSsxXSwgcGR3QXJyYXlbaSsyXSk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwZHdBcnJheVtpXSwgcGR3QXJyYXlbaSsxXSwgcGR3QXJyYXlbaSsyXSk7CisJfQorCXJldHVybjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBkbyBkaXJ0eSB3b3JrCisgKiAgIGlucHV0OiAgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBCQiBwYXJhbWV0ZXJzIG1heSBjaGFuZ2UgYWxsIHRoZSB0aW1lLCBzbyBwbGVhc2UgbWFrZQorICogICAgICAgICAgIHN1cmUgaXQgaGFzIGJlZW4gc3luY2VkIHdpdGggdGhlIG5ld2VzdC4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBydGw4MTkyX3BoeUNvbmZpZ0JCKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHU4IENvbmZpZ1R5cGUpCit7CisJdTMyIGk7CisKKyNpZmRlZiBUT19ET19MSVNUCisJdTMyICpydGw4MTkyUGh5UmVnQXJyYXlUYWJsZSA9IE5VTEwsICpydGw4MTkyQWdjVGFiQXJyYXlUYWJsZSA9IE5VTEw7CisJaWYoQWRhcHRlci0+YkluSGN0VGVzdCkKKwl7CisJCVBIWV9SRUdBcnJheUxlbiA9IFBIWV9SRUdBcnJheUxlbmd0aERUTTsKKwkJQUdDVEFCX0FycmF5TGVuID0gQUdDVEFCX0FycmF5TGVuZ3RoRFRNOworCQlSdGw4MTkwUEhZX1JFR0FycmF5X1RhYmxlID0gUnRsODE5WFBIWV9SRUdBcnJheURUTTsKKwkJUnRsODE5MEFHQ1RBQl9BcnJheV9UYWJsZSA9IFJ0bDgxOVhBR0NUQUJfQXJyYXlEVE07CisJfQorI2VuZGlmCisJaWYgKENvbmZpZ1R5cGUgPT0gQmFzZUJhbmRfQ29uZmlnX1BIWV9SRUcpCisJeworCQlmb3IgKGk9MDsgaTxQSFlfUkVHXzFUMlJBcnJheUxlbmd0aDsgaSs9MikKKwkJeworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheVtpXSwgYk1hc2tEV29yZCwgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W2krMV0pOworCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJpOiAleCwgVGhlIFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMF0gaXMgJXggUnRsODE5eFVzYlBIWV9SRUdBcnJheVsxXSBpcyAleCBcbiIsaSwgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W2ldLCBydGw4MTlYUEhZX1JFR18xVDJSQXJyYXlbaSsxXSk7CisJCX0KKwl9CisJZWxzZSBpZiAoQ29uZmlnVHlwZSA9PSBCYXNlQmFuZF9Db25maWdfQUdDX1RBQikKKwl7CisJCWZvciAoaT0wOyBpPEFHQ1RBQl9BcnJheUxlbmd0aDsgaSs9MikKKwkJeworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJ0bDgxOVhBR0NUQUJfQXJyYXlbaV0sIGJNYXNrRFdvcmQsIHJ0bDgxOVhBR0NUQUJfQXJyYXlbaSsxXSk7CisJCQlSVF9UUkFDRShDT01QX0RCRywgImk6JXgsIFRoZSBydGw4MTlYQUdDVEFCX0FycmF5WzBdIGlzICV4IHJ0bDgxOVhBR0NUQUJfQXJyYXlbMV0gaXMgJXggXG4iLGksIHJ0bDgxOVhBR0NUQUJfQXJyYXlbaV0sIHJ0bDgxOVhBR0NUQUJfQXJyYXlbaSsxXSk7CisJCX0KKwl9CisJcmV0dXJuOworCisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgUmVnaXN0ZXIgZGVmaW5pdGlvbiBvZmZzZXQgZm9yIFJhZGlvIFBhdGgKKyAqCSAgICAgQS9CL0MvRAorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBJbml0aWFsaXphdGlvbiB2YWx1ZSBoZXJlIGlzIGNvbnN0YW50IGFuZCBpdCBzaG91bGQgbmV2ZXIgYmUgY2hhbmdlZAorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX0luaXRCQlJGUmVnRGVmKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8gUkYgSW50ZXJmYWNlIFNvd3J0d2FyZSBDb250cm9sCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOyAvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzAKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7IC8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3MCAoMTYtYml0IGZvciAweDg3MikKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50ZnMgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1c7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODc0CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3NCAoMTYtYml0IGZvciAweDg3NikKKworCS8vIFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsgLy8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEUwCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZpID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVJCOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFMCAoMTYtYml0IGZvciAweDhFMikKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEU0CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZpID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVJCOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFNCAoMTYtYml0IGZvciAweDhFNikKKworCS8vIFJGIEludGVyZmFjZSBPdXRwdXQgKGFuZCBFbmFibGUpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZmludGZvID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7IC8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2MAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOyAvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50Zm8gPSByRlBHQTBfWENfUkZJbnRlcmZhY2VPRTsvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjgKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmaW50Zm8gPSByRlBHQTBfWERfUkZJbnRlcmZhY2VPRTsvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NkMKKworCS8vIFJGIEludGVyZmFjZSAoT3V0cHV0IGFuZCkgIEVuYWJsZQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmZSA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOyAvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjAgKDE2LWJpdCBmb3IgMHg4NjIpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZlID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7IC8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2NCAoMTYtYml0IGZvciAweDg2NikKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50ZmUgPSByRlBHQTBfWENfUkZJbnRlcmZhY2VPRTsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NkEgKDE2LWJpdCBmb3IgMHg4NkEpCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZlID0gckZQR0EwX1hEX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODZDICgxNi1iaXQgZm9yIDB4ODZFKQorCisJLy9BZGRyIG9mIExTU0kuIFdpcnRlIFJGIHJlZ2lzdGVyIGJ5IGRyaXZlcgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyOyAvL0xTU0kgUGFyYW1ldGVyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hDX0xTU0lQYXJhbWV0ZXI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hEX0xTU0lQYXJhbWV0ZXI7CisKKwkvLyBSRiBwYXJhbWV0ZXIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOyAgLy9CQiBCYW5kIFNlbGVjdAorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWENEX1JGUGFyYW1ldGVyOworCisJLy8gVHggQUdDIEdhaW4gU3RhZ2UgKHNhbWUgZm9yIGFsbCBwYXRoLiBTaG91bGQgd2UgcmVtb3ZlIHRoaXM/KQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsgLy9UeCBnYWluIHN0YWdlCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOyAvL1R4IGdhaW4gc3RhZ2UKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7IC8vVHggZ2FpbiBzdGFnZQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsgLy9UeCBnYWluIHN0YWdlCisKKwkvLyBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0xCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMTsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMQorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZIU1NJUGFyYTEgPSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjE7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YRF9IU1NJUGFyYW1ldGVyMTsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKKworCS8vIFRyYW5jZWl2ZXIgQX5EIEhTU0kgUGFyYW1ldGVyLTIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZIU1NJUGFyYTIgPSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjI7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIyCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQ19IU1NJUGFyYW1ldGVyMjsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIyOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMQorCisJLy8gUkYgc3dpdGNoIENvbnRyb2wKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsgLy9UUi9BbnQgc3dpdGNoIGNvbnRyb2wKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKKworCS8vIEFHQyBjb250cm9sIDEKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEFBR0NDb3JlMTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEJBR0NDb3JlMTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWENBR0NDb3JlMTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWERBR0NDb3JlMTsKKworCS8vIEFHQyBjb250cm9sIDIKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEJBR0NDb3JlMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWENBR0NDb3JlMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKKworCS8vIFJYIEFGRSBjb250cm9sIDEKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEJSeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hDUnhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YRFJ4SVFJbWJhbGFuY2U7CisKKwkvLyBSWCBBRkUgY29udHJvbCAxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlJ4QUZFID0gck9GRE0wX1hBUnhBRkU7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlJ4QUZFID0gck9GRE0wX1hCUnhBRkU7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlJ4QUZFID0gck9GRE0wX1hDUnhBRkU7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlJ4QUZFID0gck9GRE0wX1hEUnhBRkU7CisKKwkvLyBUeCBBRkUgY29udHJvbCAxCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFUeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWERUeElRSW1iYWxhbmNlOworCisJLy8gVHggQUZFIGNvbnRyb2wgMgorCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZUeEFGRSA9IHJPRkRNMF9YQVR4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZUeEFGRSA9IHJPRkRNMF9YQ1R4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZUeEFGRSA9IHJPRkRNMF9YRFR4QUZFOworCisJLy8gVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQV9MU1NJUmVhZEJhY2s7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQl9MU1NJUmVhZEJhY2s7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQ19MU1NJUmVhZEJhY2s7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YRF9MU1NJUmVhZEJhY2s7CisKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGlzIHRvIHdyaXRlIHJlZ2lzdGVyIGFuZCB0aGVuIHJlYWRiYWNrIHRvIG1ha2Ugc3VyZSB3aGV0aGVyIEJCIGFuZCBSRiBpcyBPSworICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgIAkgICAgIEhXOTBfQkxPQ0tfRSBDaGVja0Jsb2NrCisgKiAgIAkgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGggIC8vb25seSB1c2VkIHdoZW4gY2hlY2tibG9jayBpcyBIVzkwX0JMT0NLX1JGCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIHJldHVybiB3aGV0aGVyIEJCIGFuZCBSRiBpcyBvaygwOk9LOyAxOkZhaWwpCisgKiAgbm90aWNlOiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgQVNJQworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIEhXOTBfQkxPQ0tfRSBDaGVja0Jsb2NrLCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoKQoreworLy8Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworLy8JQkJfUkVHSVNURVJfREVGSU5JVElPTl9UICpwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKKwl1OCByZXQgPSAwOworCXUzMiBpLCBDaGVja1RpbWVzID0gNCwgZHdSZWdSZWFkID0gMDsKKwl1MzIgV3JpdGVBZGRyWzRdOworCXUzMiBXcml0ZURhdGFbXSA9IHsweGZmZmZmMDI3LCAweGFhNTVhMDJmLCAweDAwMDAwMDI3LCAweDU1YWE1MDJmfTsKKwkvLyBJbml0aWFsaXplIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0IHRvIGJlIGNoZWNrZWQKKwlXcml0ZUFkZHJbSFc5MF9CTE9DS19NQUNdID0gMHgxMDA7CisJV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUEhZMF0gPSAweDkwMDsKKwlXcml0ZUFkZHJbSFc5MF9CTE9DS19QSFkxXSA9IDB4ODAwOworCVdyaXRlQWRkcltIVzkwX0JMT0NLX1JGXSA9IDB4MzsKKwlSVF9UUkFDRShDT01QX1BIWSwgIj09PT09PT0+JXMoKSwgQ2hlY2tCbG9jazolZFxuIiwgX19GVU5DVElPTl9fLCBDaGVja0Jsb2NrKTsKKwlmb3IoaT0wIDsgaSA8IENoZWNrVGltZXMgOyBpKyspCisJeworCisJCS8vCisJCS8vIFdyaXRlIERhdGEgdG8gcmVnaXN0ZXIgYW5kIHJlYWRiYWNrCisJCS8vCisJCXN3aXRjaChDaGVja0Jsb2NrKQorCQl7CisJCWNhc2UgSFc5MF9CTE9DS19NQUM6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9DaGVja0JCUkZPSygpOiBOZXZlciBXcml0ZSAweDEwMCBoZXJlISIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVzkwX0JMT0NLX1BIWTA6CisJCWNhc2UgSFc5MF9CTE9DS19QSFkxOgorCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV3JpdGVBZGRyW0NoZWNrQmxvY2tdLCBXcml0ZURhdGFbaV0pOworCQkJZHdSZWdSZWFkID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBXcml0ZUFkZHJbQ2hlY2tCbG9ja10pOworCQkJYnJlYWs7CisKKwkJY2FzZSBIVzkwX0JMT0NLX1JGOgorCQkJV3JpdGVEYXRhW2ldICY9IDB4ZmZmOworCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBlUkZQYXRoLCBXcml0ZUFkZHJbSFc5MF9CTE9DS19SRl0sIGJNYXNrMTJCaXRzLCBXcml0ZURhdGFbaV0pOworCQkJLy8gVE9ETzogd2Ugc2hvdWxkIG5vdCBkZWxheSBmb3Igc3VjaCBhIGxvbmcgdGltZS4gQXNrIFNEMworCQkJbXNsZWVwKDEpOworCQkJZHdSZWdSZWFkID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIGVSRlBhdGgsIFdyaXRlQWRkcltIVzkwX0JMT0NLX1JGXSwgYk1hc2sxMkJpdHMpOworCQkJbXNsZWVwKDEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCisKKwkJLy8KKwkJLy8gQ2hlY2sgd2hldGhlciByZWFkYmFjayBkYXRhIGlzIGNvcnJlY3QKKwkJLy8KKwkJaWYoZHdSZWdSZWFkICE9IFdyaXRlRGF0YVtpXSkKKwkJeworCQkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwgIj09PT0+ZXJyb3I9PT09PWR3UmVnUmVhZDogJXgsIFdyaXRlRGF0YTogJXggXG4iLCBkd1JlZ1JlYWQsIFdyaXRlRGF0YVtpXSk7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgQkImUkYKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgbm90aWNlOiAgSW5pdGlhbGl6YXRpb24gdmFsdWUgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCisgKiAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX0JCX0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCBiUmVnVmFsdWUgPSAwLCBlQ2hlY2tJdGVtID0gMCwgcnRTdGF0dXMgPSAwOworCXUzMiBkd1JlZ1ZhbHVlID0gMDsKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLzwxPkluaXRpYWxpemUgQmFzZUJhbmQKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qLS1zZXQgQkIgR2xvYmFsIFJlc2V0LS0qLworCWJSZWdWYWx1ZSA9IHJlYWRfbmljX2J5dGUoZGV2LCBCQl9HTE9CQUxfUkVTRVQpOworCXdyaXRlX25pY19ieXRlKGRldiwgQkJfR0xPQkFMX1JFU0VULChiUmVnVmFsdWV8QkJfR0xPQkFMX1JFU0VUX0JJVCkpOworCW1kZWxheSg1MCk7CisJLyotLS1zZXQgQkIgcmVzZXQgQWN0aXZlLS0tKi8KKwlkd1JlZ1ZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCAoZHdSZWdWYWx1ZSYofkNQVV9HRU5fQkJfUlNUKSkpOworCisJLyotLS0tQ2tlY2sgRlBHQVBIWTAgYW5kIFBIWTEgYm9hcmQgaXMgT0stLS0tKi8KKwkvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW1vdmVkIG9uIEFTSUMgLCBFbWlseSAyMDA3LjIuMgorCWZvcihlQ2hlY2tJdGVtPShIVzkwX0JMT0NLX0UpSFc5MF9CTE9DS19QSFkwOyBlQ2hlY2tJdGVtPD1IVzkwX0JMT0NLX1BIWTE7IGVDaGVja0l0ZW0rKykKKwl7CisJCXJ0U3RhdHVzICA9IHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihkZXYsIChIVzkwX0JMT0NLX0UpZUNoZWNrSXRlbSwgKFJGOTBfUkFESU9fUEFUSF9FKTApOyAvL2Rvbid0IGNhcmUgUkYgcGF0aAorCQlpZihydFN0YXR1cyAhPSAwKQorCQl7CisJCQlSVF9UUkFDRSgoQ09NUF9FUlIgfCBDT01QX1BIWSksICJQSFlfUkY4MjU2X0NvbmZpZygpOkNoZWNrIFBIWSVkIEZhaWwhIVxuIiwgZUNoZWNrSXRlbS0xKTsKKwkJCXJldHVybiA7CisJCX0KKwl9CisJLyotLS0tIFNldCBDQ0sgYW5kIE9GRE0gQmxvY2sgIk9GRiItLS0tKi8KKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiQ0NLRW58Yk9GRE1FbiwgMHgwKTsKKwkvKi0tLS1CQiBSZWdpc3RlciBJbml0aWxhemF0aW9uLS0tLSovCisJLy89PW09PT5TZXQgUEhZIFJFRyBGcm9tIEhlYWRlcjw9PW09PQorCXJ0bDgxOTJfcGh5Q29uZmlnQkIoZGV2LCBCYXNlQmFuZF9Db25maWdfUEhZX1JFRyk7CisKKwkvKi0tLS1TZXQgQkIgcmVzZXQgZGUtQWN0aXZlLS0tLSovCisJZHdSZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgKGR3UmVnVmFsdWV8Q1BVX0dFTl9CQl9SU1QpKTsKKworCS8qLS0tLUJCIEFHQyB0YWJsZSBJbml0aWFsaXphdGlvbi0tLS0qLworCS8vPT1tPT0+U2V0IFBIWSBSRUcgRnJvbSBIZWFkZXI8PT1tPT0KKwlydGw4MTkyX3BoeUNvbmZpZ0JCKGRldiwgQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIpOworCisJLyotLS0tRW5hYmxlIFhTVEFMIC0tLS0qLworCXdyaXRlX25pY19ieXRlX0UoZGV2LCAweDVlLCAweDAwKTsKKwlpZiAocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gKHU4KVZFUlNJT05fODE5eFVfQSkKKwl7CisJCS8vQW50ZW5uYSBnYWluIG9mZnNldCBmcm9tIEIvQy9EIHRvIEEKKwkJZHdSZWdWYWx1ZSA9IChwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV08PDQgfCBwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0pOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1R4R2FpblN0YWdlLCAoYlhCVHhBR0N8YlhDVHhBR0MpLCBkd1JlZ1ZhbHVlKTsKKworCQkvL1hTVEFMTENhcAorCQlkd1JlZ1ZhbHVlID0gcHJpdi0+Q3J5c3RhbENhcCAmIDB4ZjsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCBiWHRhbENhcCwgZHdSZWdWYWx1ZSk7CisJfQorCisJLy8gQ2hlY2sgaWYgdGhlIENDSyBIaWdoUG93ZXIgaXMgdHVybmVkIE9OLgorCS8vIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgUFdEQi4KKwlwcml2LT5iQ2NrSGlnaFBvd2VyID0gKHU4KShydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsIDB4MjAwKSk7CisJcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBCQiZSRgorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICBub3RpY2U6ICBJbml0aWFsaXphdGlvbiB2YWx1ZSBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKKyAqICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfQkJDb25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlydGw4MTkyX0luaXRCQlJGUmVnRGVmKGRldik7CisJLy9jb25maWcgQkImUkYuIEFzIGhhcmRDb2RlIGJhc2VkIGluaXRpYWxpemF0aW9uIGhhcyBub3QgYmVlbiB3ZWxsCisJLy9pbXBsZW1lbnRlZCwgc28gdXNlIGZpbGUgZmlyc3QuRklYTUU6c2hvdWxkIGltcGxlbWVudCBpdCBmb3IgaGFyZGNvZGU/CisJcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoZGV2KTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIG9idGFpbnMgdGhlIGluaXRpYWxpemF0aW9uIHZhbHVlIG9mIFR4IHBvd2VyIExldmVsIG9mZnNldAorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9waHlfZ2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX1JhdGUxOF8wNik7CisJcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMV0gPQorCQlyZWFkX25pY19kd29yZChkZXYsIHJUeEFHQ19SYXRlNTRfMjQpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzJdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMDNfTWNzMDApOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzNdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMDdfTWNzMDQpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzRdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMTFfTWNzMDgpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzVdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMTVfTWNzMTIpOworCisJLy8gcmVhZCByeCBpbml0aWFsIGdhaW4KKwlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF0gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEpOworCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsxXSA9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSk7CisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzJdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxKTsKKwlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bM10gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRlZmF1bHQgaW5pdGlhbCBnYWluIChjNTA9MHgleCwgYzU4PTB4JXgsIGM2MD0weCV4LCBjNjg9MHgleCkgXG4iLAorCQlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF0sIHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsxXSwKKwkJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzJdLCBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bM10pOworCisJLy8gcmVhZCBmcmFtZXN5bmMKKwlwcml2LT5mcmFtZXN5bmMgPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzKTsKKwlwcml2LT5mcmFtZXN5bmNDMzQgPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEZWZhdWx0IGZyYW1lc3luYyAoMHgleCkgPSAweCV4IFxuIiwKKwkJck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOworCisJLy8gcmVhZCBTSUZTIChzYXZlIHRoZSB2YWx1ZSByZWFkIGZvbWUgTUFDUEhZX1JFRy50eHQpCisJcHJpdi0+U2lmc1RpbWUgPSByZWFkX25pY193b3JkKGRldiwgU0lGUyk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIG9idGFpbnMgdGhlIGluaXRpYWxpemF0aW9uIHZhbHVlIG9mIFR4IHBvd2VyIExldmVsIG9mZnNldAorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9waHlfc2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAlwb3dlcmxldmVsID0gcHJpdi0+VHhQb3dlckxldmVsQ0NLW2NoYW5uZWwtMV07CisJdTgJcG93ZXJsZXZlbE9GRE0yNEcgPSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHW2NoYW5uZWwtMV07CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRl84MjU2OgorCQlQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihkZXYsIHBvd2VybGV2ZWwpOyAvL25lZWQgZnVydGhlciBpbXBsZW1lbnQKKwkJUEhZX1NldFJGODI1Nk9GRE1UeFBvd2VyKGRldiwgcG93ZXJsZXZlbE9GRE0yNEcpOworCQlicmVhazsKKwlkZWZhdWx0OgorLy8JY2FzZSBSRl84MjI1OgorLy8JY2FzZSBSRl84MjU4OgorCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiZXJyb3IgUkYgY2hpcElEKDgyMjUgb3IgODI1OCkgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gY2hlY2sgUmYgY2hpcCB0byBkbyBSRiBjb25maWcKKyAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBvbmx5IDgyNTYgaXMgc3VwcG9ydGVkCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfcGh5X1JGQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJc3dpdGNoKHByaXYtPnJmX2NoaXApCisJeworCQljYXNlIFJGXzgyNTY6CisJCQlQSFlfUkY4MjU2X0NvbmZpZyhkZXYpOworCQkJYnJlYWs7CisJLy8JY2FzZSBSRl84MjI1OgorCS8vCWNhc2UgUkZfODI1ODoKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiZXJyb3IgY2hpcCBpZFxuIik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB1cGRhdGUgSW5pdGlhbCBnYWluCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgQXMgV2luZG93cyBoYXMgbm90IGltcGxlbWVudGVkIHRoaXMsIHdhaXQgZm9yIGNvbXBsZW1lbnQKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnRsODE5Ml9waHlfdXBkYXRlSW5pdEdhaW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgUkYgcGFyYW1ldGVycyBmcm9tIGdlbmVyYWwgaGVhZCBmaWxlLCBhbmQgZG8gUkYgMy13aXJlCisgKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgcmV0dXJuIGNvZGUgc2hvdyBpZiBSRiBjb25maWd1cmF0aW9uIGlzIHN1Y2Nlc3NmdWwoMDpwYXNzLCAxOmZhaWwpCisgKiAgICBOb3RlOiAgRGVsYXkgbWF5IGJlIHJlcXVpcmVkIGZvciBSRiBjb25maWd1cmF0aW9uCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBydGw4MTkyX3BoeV9Db25maWdSRldpdGhIZWFkZXJGaWxlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIFJGOTBfUkFESU9fUEFUSF9FCWVSRlBhdGgpCit7CisKKwlpbnQgaTsKKwkvL3UzMiogcFJGQXJyYXk7CisJdTggcmV0ID0gMDsKKworCXN3aXRjaChlUkZQYXRoKXsKKwkJY2FzZSBSRjkwX1BBVEhfQToKKwkJCWZvcihpID0gMDtpPFJhZGlvQV9BcnJheUxlbmd0aDsgaT1pKzIpeworCisJCQkJaWYocnRsODE5WFJhZGlvQV9BcnJheVtpXSA9PSAweGZlKXsKKwkJCQkJCW1kZWxheSgxMDApOworCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwgcnRsODE5WFJhZGlvQV9BcnJheVtpXSwgYk1hc2sxMkJpdHMsIHJ0bDgxOVhSYWRpb0FfQXJyYXlbaSsxXSk7CisJCQkJbWRlbGF5KDEpOworCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQjoKKwkJCWZvcihpID0gMDtpPFJhZGlvQl9BcnJheUxlbmd0aDsgaT1pKzIpeworCisJCQkJaWYocnRsODE5WFJhZGlvQl9BcnJheVtpXSA9PSAweGZlKXsKKwkJCQkJCW1kZWxheSgxMDApOworCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwgcnRsODE5WFJhZGlvQl9BcnJheVtpXSwgYk1hc2sxMkJpdHMsIHJ0bDgxOVhSYWRpb0JfQXJyYXlbaSsxXSk7CisJCQkJbWRlbGF5KDEpOworCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfQzoKKwkJCWZvcihpID0gMDtpPFJhZGlvQ19BcnJheUxlbmd0aDsgaT1pKzIpeworCisJCQkJaWYocnRsODE5WFJhZGlvQ19BcnJheVtpXSA9PSAweGZlKXsKKwkJCQkJCW1kZWxheSgxMDApOworCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwgcnRsODE5WFJhZGlvQ19BcnJheVtpXSwgYk1hc2sxMkJpdHMsIHJ0bDgxOVhSYWRpb0NfQXJyYXlbaSsxXSk7CisJCQkJbWRlbGF5KDEpOworCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCWZvcihpID0gMDtpPFJhZGlvRF9BcnJheUxlbmd0aDsgaT1pKzIpeworCisJCQkJaWYocnRsODE5WFJhZGlvRF9BcnJheVtpXSA9PSAweGZlKXsKKwkJCQkJCW1kZWxheSgxMDApOworCQkJCQkJY29udGludWU7CisJCQkJfQorCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwgcnRsODE5WFJhZGlvRF9BcnJheVtpXSwgYk1hc2sxMkJpdHMsIHJ0bDgxOVhSYWRpb0RfQXJyYXlbaSsxXSk7CisJCQkJbWRlbGF5KDEpOworCisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7OworCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgVHggUG93ZXIgb2YgdGhlIGNoYW5uZWwKKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIHU4IAkJY2hhbm5lbAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgICBOb3RlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX1NldFR4UG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OAlwb3dlcmxldmVsID0gcHJpdi0+VHhQb3dlckxldmVsQ0NLW2NoYW5uZWwtMV07CisJdTgJcG93ZXJsZXZlbE9GRE0yNEcgPSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHW2NoYW5uZWwtMV07CisKKwlzd2l0Y2gocHJpdi0+cmZfY2hpcCkKKwl7CisJY2FzZSBSRl84MjI1OgorI2lmZGVmIFRPX0RPX0xJU1QKKwkJUEhZX1NldFJGODIyNUNja1R4UG93ZXIoQWRhcHRlciwgcG93ZXJsZXZlbCk7CisJCVBIWV9TZXRSRjgyMjVPZmRtVHhQb3dlcihBZGFwdGVyLCBwb3dlcmxldmVsT0ZETTI0Ryk7CisjZW5kaWYKKwkJYnJlYWs7CisKKwljYXNlIFJGXzgyNTY6CisJCVBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKGRldiwgcG93ZXJsZXZlbCk7CisJCVBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihkZXYsIHBvd2VybGV2ZWxPRkRNMjRHKTsKKwkJYnJlYWs7CisKKwljYXNlIFJGXzgyNTg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCAidW5rbm93biByZiBjaGlwIElEIGluIHJ0bDgxOTJfU2V0VHhQb3dlckxldmVsKClcbiIpOworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgUkYgc3RhdGUgb24gb3Igb2ZmCisgKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgorICogICAJICAgICBSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlICAvL1Bvd2VyIFN0YXRlIHRvIHNldAorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgICBOb3RlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBydGw4MTkyX1NldFJGUG93ZXJTdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlKQoreworCWJvb2wJCQkJYlJlc3VsdCA9IHRydWU7CisvLwl1OAkJCQkJZVJGUGF0aDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlpZihlUkZQb3dlclN0YXRlID09IHByaXYtPmllZWU4MDIxMS0+ZVJGUG93ZXJTdGF0ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYocHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9PSB0cnVlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gdHJ1ZTsKKworCXN3aXRjaChwcml2LT5yZl9jaGlwKQorCXsKKwkJY2FzZSBSRl84MjU2OgorCQlzd2l0Y2goIGVSRlBvd2VyU3RhdGUgKQorCQl7CisJCQljYXNlIGVSZk9uOgorCS8vUkYtQSwgUkYtQgorCQkJCQkvL2VuYWJsZSBSRi1DaGlwIEEvQgorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIEJJVDQsIDB4MSk7CS8vIDB4ODYwWzRdCisJCQkJCS8vYW5hbG9nIHRvIGRpZ2l0YWwgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweDMwMCwgMHgzKTsvLyAweDg4Y1s5OjhdCisJCQkJCS8vZGlnaXRhbCB0byBhbmFsb2cgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDE4LCAweDMpOyAvLyAweDg4MFs0OjNdCisJCQkJCS8vcnggYW50ZW5uYSBvbgorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4MywgMHgzKTsvLyAweGMwNFsxOjBdCisJCQkJCS8vcnggYW50ZW5uYSBvbgorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX1RSeFBhdGhFbmFibGUsIDB4MywgMHgzKTsvLyAweGQwNFsxOjBdCisJCQkJCS8vYW5hbG9nIHRvIGRpZ2l0YWwgcGFydDIgb24KKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDYwLCAweDMpOyAvLyAweDg4MFs2OjVdCisKKwkJCQlicmVhazsKKworCQkJY2FzZSBlUmZTbGVlcDoKKworCQkJCWJyZWFrOworCisJCQljYXNlIGVSZk9mZjoKKwkJCQkJLy9SRi1BLCBSRi1CCisJCQkJCS8vZGlzYWJsZSBSRi1DaGlwIEEvQgorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIEJJVDQsIDB4MCk7CS8vIDB4ODYwWzRdCisJCQkJCS8vYW5hbG9nIHRvIGRpZ2l0YWwgb2ZmLCBmb3IgcG93ZXIgc2F2ZQorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIDB4ZjAwLCAweDApOy8vIDB4ODhjWzExOjhdCisJCQkJCS8vZGlnaXRhbCB0byBhbmFsb2cgb2ZmLCBmb3IgcG93ZXIgc2F2ZQorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MTgsIDB4MCk7IC8vIDB4ODgwWzQ6M10KKwkJCQkJLy9yeCBhbnRlbm5hIG9mZgorCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4ZiwgMHgwKTsvLyAweGMwNFszOjBdCisJCQkJCS8vcnggYW50ZW5uYSBvZmYKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweGYsIDB4MCk7Ly8gMHhkMDRbMzowXQorCQkJCQkvL2FuYWxvZyB0byBkaWdpdGFsIHBhcnQyIG9mZiwgZm9yIHBvd2VyIHNhdmUKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDYwLCAweDApOyAvLyAweDg4MFs2OjVdCisKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQliUmVzdWx0ID0gZmFsc2U7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRSRlBvd2VyU3RhdGU4MTl4VXNiKCk6IHVua25vdyBzdGF0ZSB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOworCQkJCWJyZWFrOworCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiTm90IHN1cHBvcnQgcmZfY2hpcCgleClcbiIsIHByaXYtPnJmX2NoaXApOworCQkJYnJlYWs7CisJfQorI2lmZGVmIFRPX0RPX0xJU1QKKwlpZihiUmVzdWx0KQorCXsKKwkJLy8gVXBkYXRlIGN1cnJlbnQgUkYgc3RhdGUgdmFyaWFibGUuCisJCXBIYWxEYXRhLT5lUkZQb3dlclN0YXRlID0gZVJGUG93ZXJTdGF0ZTsKKwkJc3dpdGNoKHBIYWxEYXRhLT5SRkNoaXBJRCApCisJCXsKKwkJCWNhc2UgUkZfODI1NjoKKwkJc3dpdGNoKHBIYWxEYXRhLT5lUkZQb3dlclN0YXRlKQorCQkJCXsKKwkJCQljYXNlIGVSZk9mZjoKKwkJCQkJLy8KKwkJCQkJLy9JZiBSZiBvZmYgcmVhc29uIGlzIGZyb20gSVBTLCBMZWQgc2hvdWxkIGJsaW5rIHdpdGggbm8gbGluaywgYnkgTWFkZGVzdCAwNzEwMTUKKwkJCQkJLy8KKwkJCQkJaWYocE1nbnRJbmZvLT5SZk9mZlJlYXNvbj09UkZfQ0hBTkdFX0JZX0lQUyApCisJCQkJCXsKKwkJCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlcixMRURfQ1RMX05PX0xJTkspOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJLy8gVHVybiBvZmYgTEVEIGlmIFJGIGlzIG5vdCBPTi4KKwkJCQkJCUFkYXB0ZXItPkhhbEZ1bmMuTGVkQ29udHJvbEhhbmRsZXIoQWRhcHRlciwgTEVEX0NUTF9QT1dFUl9PRkYpOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBlUmZPbjoKKwkJCQkJLy8gVHVybiBvbiBSRiB3ZSBhcmUgc3RpbGwgbGlua2VkLCB3aGljaCBtaWdodCBoYXBwZW4gd2hlbgorCQkJCQkvLyB3ZSBxdWlja2x5IHR1cm4gb2ZmIGFuZCBvbiBIVyBSRi4gMjAwNi4wNS4xMiwgYnkgcmNuamtvLgorCQkJCQlpZiggcE1nbnRJbmZvLT5iTWVkaWFDb25uZWN0ID09IFRSVUUgKQorCQkJCQl7CisJCQkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsIExFRF9DVExfTElOSyk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvLyBUdXJuIG9mZiBMRUQgaWYgUkYgaXMgbm90IE9OLgorCQkJCQkJQWRhcHRlci0+SGFsRnVuYy5MZWRDb250cm9sSGFuZGxlcihBZGFwdGVyLCBMRURfQ1RMX05PX0xJTkspOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJLy8gZG8gbm90aGluZy4KKwkJCQkJYnJlYWs7CisJCQkJfS8vIFN3aXRjaCBSRiBzdGF0ZQorCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgREJHX0xPVUQsICgiU2V0UkZQb3dlclN0YXRlODE5MCgpOiBVbmtub3duIFJGIHR5cGVcbiIpKTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwl9CisjZW5kaWYKKwlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gZmFsc2U7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNldCBjb21tYW5kIHRhYmxlIHZhcmlhYmxlKHN0cnVjdCBTd0NobmxDbWQpLgorICogICBpbnB1dDogIFN3Q2hubENtZCoJCUNtZFRhYmxlIAkvL3RhYmxlIHRvIGJlIHNldC4KKyAqICAgCSAgICAgdTMyCQlDbWRUYWJsZUlkeCAJLy92YXJpYWJsZSBpbmRleCBpbiB0YWJsZSB0byBiZSBzZXQKKyAqICAgCSAgICAgdTMyCQlDbWRUYWJsZVN6CS8vdGFibGUgc2l6ZS4KKyAqICAgCSAgICAgU3dDaG5sQ21kSUQJQ21kSUQJCS8vY29tbWFuZCBJRCB0byBzZXQuCisgKgkgICAgIHUzMgkJUGFyYTEKKyAqCSAgICAgdTMyCQlQYXJhMgorICoJICAgICB1MzIJCW1zRGVsYXkKKyAqICBvdXRwdXQ6CisgKiAgcmV0dXJuOiAgdHJ1ZSBpZiBmaW5pc2hlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKiAgICBOb3RlOgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoCisJU3dDaG5sQ21kKgkJQ21kVGFibGUsCisJdTMyCQkJQ21kVGFibGVJZHgsCisJdTMyCQkJQ21kVGFibGVTeiwKKwlTd0NobmxDbWRJRAkJQ21kSUQsCisJdTMyCQkJUGFyYTEsCisJdTMyCQkJUGFyYTIsCisJdTMyCQkJbXNEZWxheQorCSkKK3sKKwlTd0NobmxDbWQqIHBDbWQ7CisKKwlpZihDbWRUYWJsZSA9PSBOVUxMKQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJwaHlfU2V0U3dDaG5sQ21kQXJyYXkoKTogQ21kVGFibGUgY2Fubm90IGJlIE5VTEwuXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZihDbWRUYWJsZUlkeCA+PSBDbWRUYWJsZVN6KQorCXsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJwaHlfU2V0U3dDaG5sQ21kQXJyYXkoKTogQWNjZXNzIGludmFsaWQgaW5kZXgsIHBsZWFzZSBjaGVjayBzaXplIG9mIHRoZSB0YWJsZSwgQ21kVGFibGVJZHg6JWQsIENtZFRhYmxlU3o6JWRcbiIsCisJCQkJQ21kVGFibGVJZHgsIENtZFRhYmxlU3opOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcENtZCA9IENtZFRhYmxlICsgQ21kVGFibGVJZHg7CisJcENtZC0+Q21kSUQgPSBDbWRJRDsKKwlwQ21kLT5QYXJhMSA9IFBhcmExOworCXBDbWQtPlBhcmEyID0gUGFyYTI7CisJcENtZC0+bXNEZWxheSA9IG1zRGVsYXk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNldCBjaGFubmVsIHN0ZXAgYnkgc3RlcAorICogICBpbnB1dDogIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyAqICAgCSAgICAgdTggCQljaGFubmVsCisgKiAgIAkgICAgIHU4KiAJCXN0YWdlIC8vMyBzdGFnZXMKKyAqICAgCSAgICAgdTgqIAkJc3RlcCAgLy8KKyAqICAgCSAgICAgdTMyKiAJCWRlbGF5IC8vd2hldGhlciBuZWVkIHRvIGRlbGF5CisgKiAgb3V0cHV0OiAgc3RvcmUgbmV3IHN0YWdlLCBzdGVwIGFuZCBkZWxheSBmb3IgbmV4dCBzdGVwKGNvbWJpbmUgd2l0aCBmdW5jdGlvbiBhYm92ZSkKKyAqICByZXR1cm46ICB0cnVlIGlmIGZpbmlzaGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqICAgIE5vdGU6ICBXYWl0IGZvciBzaW1wbGVyIGZ1bmN0aW9uIHRvIHJlcGxhY2UgaXQgLy93YgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsLCB1OCogc3RhZ2UsIHU4KiBzdGVwLCB1MzIqIGRlbGF5KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKy8vCVBDSEFOTkVMX0FDQ0VTU19TRVRUSU5HCXBDaG5sQWNjZXNzU2V0dGluZzsKKwlTd0NobmxDbWQJCQkJUHJlQ29tbW9uQ21kW01BWF9QUkVDTURfQ05UXTsKKwl1MzIJCQkJCVByZUNvbW1vbkNtZENudDsKKwlTd0NobmxDbWQJCQkJUG9zdENvbW1vbkNtZFtNQVhfUE9TVENNRF9DTlRdOworCXUzMgkJCQkJUG9zdENvbW1vbkNtZENudDsKKwlTd0NobmxDbWQJCQkJUmZEZXBlbmRDbWRbTUFYX1JGREVQRU5EQ01EX0NOVF07CisJdTMyCQkJCQlSZkRlcGVuZENtZENudDsKKwlTd0NobmxDbWQJCQkJKkN1cnJlbnRDbWQgPSBOVUxMOworCS8vUkY5MF9SQURJT19QQVRIX0UJCWVSRlBhdGg7CisJdTgJCWVSRlBhdGg7CisvLwl1MzIJCVJmUmV0VmFsOworLy8JdTgJCVJldHJ5Q250OworCisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT0+JXMoKT09PT1zdGFnZTolZCwgc3RlcDolZCwgY2hhbm5lbDolZFxuIiwgX19GVU5DVElPTl9fLCAqc3RhZ2UsICpzdGVwLCBjaGFubmVsKTsKKy8vCVJUX0FTU0VSVChJc0xlZ2FsQ2hhbm5lbChBZGFwdGVyLCBjaGFubmVsKSwgKCJpbGxlZ2FsIGNoYW5uZWw6ICVkXG4iLCBjaGFubmVsKSk7CisjaWZkZWYgRU5BQkxFX0RPVDExRAorCWlmICghSXNMZWdhbENoYW5uZWwocHJpdi0+aWVlZTgwMjExLCBjaGFubmVsKSkKKwl7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PT09PT09PT09PT5zZXQgdG8gaWxsZWdhbCBjaGFubmVsOiVkXG4iLCBjaGFubmVsKTsKKwkJcmV0dXJuIHRydWU7IC8vcmV0dXJuIHRydWUgdG8gdGVsbCB1cHBlciBjYWxsZXIgZnVuY3Rpb24gdGhpcyBjaGFubmVsIHNldHRpbmcgaXMgZmluaXNoZWQhIE9yIGl0IHdpbGwgaW4gd2hpbGUgbG9vcC4KKwl9CisjZW5kaWYKKy8vRklYTUU6bmVlZCB0byBjaGVjayB3aGV0aGVyIGNoYW5uZWwgaXMgbGVnYWwgb3Igbm90IGhlcmUuV0IKKworCisJLy9mb3IoZVJGUGF0aCA9IFJGOTBfUEFUSF9BOyBlUkZQYXRoIDxwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykKKy8vCWZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8UkY5MF9QQVRIX01BWDsgZVJGUGF0aCsrKQorLy8JeworLy8JCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKGRldiwgZVJGUGF0aCkpCisvLwkJCWNvbnRpbnVlOworCQkvLyA8MT4gRmlsbCB1cCBwcmUgY29tbW9uIGNvbW1hbmQuCisJCVByZUNvbW1vbkNtZENudCA9IDA7CisJCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFByZUNvbW1vbkNtZCwgUHJlQ29tbW9uQ21kQ250KyssIE1BWF9QUkVDTURfQ05ULAorCQkJCQlDbWRJRF9TZXRUeFBvd2VyTGV2ZWwsIDAsIDAsIDApOworCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShQcmVDb21tb25DbWQsIFByZUNvbW1vbkNtZENudCsrLCBNQVhfUFJFQ01EX0NOVCwKKwkJCQkJQ21kSURfRW5kLCAwLCAwLCAwKTsKKworCQkvLyA8Mj4gRmlsbCB1cCBwb3N0IGNvbW1vbiBjb21tYW5kLgorCQlQb3N0Q29tbW9uQ21kQ250ID0gMDsKKworCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShQb3N0Q29tbW9uQ21kLCBQb3N0Q29tbW9uQ21kQ250KyssIE1BWF9QT1NUQ01EX0NOVCwKKwkJCQkJQ21kSURfRW5kLCAwLCAwLCAwKTsKKworCQkvLyA8Mz4gRmlsbCB1cCBSRiBkZXBlbmRlbnQgY29tbWFuZC4KKwkJUmZEZXBlbmRDbWRDbnQgPSAwOworCQlzd2l0Y2goIHByaXYtPnJmX2NoaXAgKQorCQl7CisJCWNhc2UgUkZfODIyNToKKwkJCWlmICghKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSkKKwkJCXsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgODIyNTogJWRcbiIsIGNoYW5uZWwpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQkJQ21kSURfUkZfV3JpdGVSZWcsIHJaZWJyYTFfQ2hhbm5lbCwgUkZfQ0hBTk5FTF9UQUJMRV9aRUJSQVtjaGFubmVsXSwgMTApOworCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQkJQ21kSURfRW5kLCAwLCAwLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfODI1NjoKKwkJCS8vIFRFU1QhISBUaGlzIGlzIG5vdCB0aGUgdGFibGUgZm9yIDgyNTYhIQorCQkJaWYgKCEoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpKQorCQkJeworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiaWxsZWdhbCBjaGFubmVsIGZvciBaZWJyYSA4MjU2OiAlZFxuIiwgY2hhbm5lbCk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShSZkRlcGVuZENtZCwgUmZEZXBlbmRDbWRDbnQrKywgTUFYX1JGREVQRU5EQ01EX0NOVCwKKwkJCQlDbWRJRF9SRl9Xcml0ZVJlZywgclplYnJhMV9DaGFubmVsLCBjaGFubmVsLCAxMCk7CisJCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShSZkRlcGVuZENtZCwgUmZEZXBlbmRDbWRDbnQrKywgTUFYX1JGREVQRU5EQ01EX0NOVCwKKwkJCUNtZElEX0VuZCwgMCwgMCwgMCk7CisJCQlicmVhazsKKworCQljYXNlIFJGXzgyNTg6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmtub3duIFJGQ2hpcElEOiAlZFxuIiwgcHJpdi0+cmZfY2hpcCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKworCQlkb3sKKwkJCXN3aXRjaCgqc3RhZ2UpCisJCQl7CisJCQljYXNlIDA6CisJCQkJQ3VycmVudENtZD0mUHJlQ29tbW9uQ21kWypzdGVwXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlDdXJyZW50Q21kPSZSZkRlcGVuZENtZFsqc3RlcF07CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJQ3VycmVudENtZD0mUG9zdENvbW1vbkNtZFsqc3RlcF07CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmKEN1cnJlbnRDbWQtPkNtZElEPT1DbWRJRF9FbmQpCisJCQl7CisJCQkJaWYoKCpzdGFnZSk9PTIpCisJCQkJeworCQkJCQkoKmRlbGF5KT1DdXJyZW50Q21kLT5tc0RlbGF5OworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJKCpzdGFnZSkrKzsKKwkJCQkJKCpzdGVwKT0wOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCXN3aXRjaChDdXJyZW50Q21kLT5DbWRJRCkKKwkJCXsKKwkJCWNhc2UgQ21kSURfU2V0VHhQb3dlckxldmVsOgorCQkJCWlmKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09ICh1OClWRVJTSU9OXzgxOXhVX0EpIC8veGlvbmc6IGNvbnNpZGVyIGl0IGxhdGVyIQorCQkJCQlydGw4MTkyX1NldFR4UG93ZXJMZXZlbChkZXYsY2hhbm5lbCk7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1dyaXRlUG9ydFVsb25nOgorCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEN1cnJlbnRDbWQtPlBhcmExLCBDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1dyaXRlUG9ydFVzaG9ydDoKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEN1cnJlbnRDbWQtPlBhcmExLCAodTE2KUN1cnJlbnRDbWQtPlBhcmEyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ21kSURfV3JpdGVQb3J0VWNoYXI6CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBDdXJyZW50Q21kLT5QYXJhMSwgKHU4KUN1cnJlbnRDbWQtPlBhcmEyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ21kSURfUkZfV3JpdGVSZWc6CisJCQkJZm9yKGVSRlBhdGggPSAwOyBlUkZQYXRoIDwgUkY5MF9QQVRIX01BWDsgZVJGUGF0aCsrKQorCQkJCXsKKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBDdXJyZW50Q21kLT5QYXJhMSwgYlplYnJhMV9DaGFubmVsTnVtLCBDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX13aGlsZSh0cnVlKTsKKy8vCX0vKmZvcihOdW1iZXIgb2YgUkYgcGF0aHMpKi8KKworCSgqZGVsYXkpPUN1cnJlbnRDbWQtPm1zRGVsYXk7CisJKCpzdGVwKSsrOworCXJldHVybiBmYWxzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gZG9lcyBhY3R1cmFsbHkgc2V0IGNoYW5uZWwgd29yaworICogICBpbnB1dDogIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyAqICAgCSAgICAgdTggCQljaGFubmVsCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vaW4KKyAqICAgIE5vdGU6ICBXZSBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3BoeV9GaW5pc2hTd0NobmxOb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJdTMyCWRlbGF5ID0gMDsKKworCXdoaWxlKCFydGw4MTkyX3BoeV9Td0NobmxTdGVwQnlTdGVwKGRldixjaGFubmVsLCZwcml2LT5Td0NobmxTdGFnZSwmcHJpdi0+U3dDaG5sU3RlcCwmZGVsYXkpKQorCXsKKwkvLwlpZihkZWxheT4wKQorCS8vCQltc2xlZXAoZGVsYXkpOy8vb3IgbWRlbGF5PyBuZWVkIGZ1cnRoZXIgY29uc2lkZXJhdGlvbgorCQlpZighcHJpdi0+dXApCisJCQlicmVhazsKKwl9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgQ2FsbGJhY2sgcm91dGluZSBvZiB0aGUgd29yayBpdGVtIGZvciBzd2l0Y2ggY2hhbm5lbC4KKyAqICAgaW5wdXQ6CisgKgorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub2luCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfU3dDaG5sX1dvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisKKwlSVF9UUkFDRShDT01QX0NILCAiPT0+IFN3Q2hubENhbGxiYWNrODE5eFVzYldvcmtJdGVtKCksIGNoYW46JWRcbiIsIHByaXYtPmNoYW4pOworCisKKwlydGw4MTkyX3BoeV9GaW5pc2hTd0NobmxOb3coZGV2ICwgcHJpdi0+Y2hhbik7CisKKwlSVF9UUkFDRShDT01QX0NILCAiPD09IFN3Q2hubENhbGxiYWNrODE5eFVzYldvcmtJdGVtKClcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzY2hlZHVsZWQgYWN0dXJhbCB3b3JraXRlbSB0byBzZXQgY2hhbm5lbAorICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2CisgKiAgIAkgICAgIHU4CQljaGFubmVsIC8vY2hhbm5lbCB0byBzZXQKKyAqICBvdXRwdXQ6ICBub25lCisgKiAgcmV0dXJuOiAgcmV0dXJuIGNvZGUgc2hvdyBpZiB3b3JraXRlbSBpcyBzY2hlZHVsZWQoMTpwYXNzLCAwOmZhaWwpCisgKiAgICBOb3RlOiAgRGVsYXkgbWF5IGJlIHJlcXVpcmVkIGZvciBSRiBjb25maWd1cmF0aW9uCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1OCBydGw4MTkyX3BoeV9Td0Nobmwoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT09PiVzKCksIFN3Q2hubEluUHJvZ3Jlc3M6JWRcbiIsIF9fRlVOQ1RJT05fXywgcHJpdi0+U3dDaG5sSW5Qcm9ncmVzcyk7CisJaWYoIXByaXYtPnVwKQorCQlyZXR1cm4gZmFsc2U7CisJaWYocHJpdi0+U3dDaG5sSW5Qcm9ncmVzcykKKwkJcmV0dXJuIGZhbHNlOworCisvLwlpZihwSGFsRGF0YS0+U2V0QldNb2RlSW5Qcm9ncmVzcykKKy8vCQlyZXR1cm47CitpZiAoMCkgLy90byB0ZXN0IGN1cnJlbnQgY2hhbm5lbCBmcm9tIFJGIHJlZyAweDcuCit7CisJdTgJCWVSRlBhdGg7CisJZm9yKGVSRlBhdGggPSAwOyBlUkZQYXRoIDwgMjsgZVJGUGF0aCsrKXsKKwlwcmludGsoIj09PT0+c2V0IGNoYW5uZWw6JXhcbiIscnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDcsIGJaZWJyYTFfQ2hhbm5lbE51bSkpOworCXVkZWxheSgxMCk7CisJfQorfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlzd2l0Y2gocHJpdi0+aWVlZTgwMjExLT5tb2RlKQorCXsKKwljYXNlIFdJUkVMRVNTX01PREVfQToKKwljYXNlIFdJUkVMRVNTX01PREVfTl81RzoKKwkJaWYgKGNoYW5uZWw8PTE0KXsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiV0lSRUxFU1NfTU9ERV9BIGJ1dCBjaGFubmVsPD0xNCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9COgorCQlpZiAoY2hhbm5lbD4xNCl7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIldJUkVMRVNTX01PREVfQiBidXQgY2hhbm5lbD4xNCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9HOgorCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKKwkJaWYgKGNoYW5uZWw+MTQpeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0cgYnV0IGNoYW5uZWw+MTQiKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlicmVhazsKKwl9CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcHJpdi0+U3dDaG5sSW5Qcm9ncmVzcyA9IHRydWU7CisJaWYoY2hhbm5lbCA9PSAwKQorCQljaGFubmVsID0gMTsKKworCXByaXYtPmNoYW49Y2hhbm5lbDsKKworCXByaXYtPlN3Q2hubFN0YWdlPTA7CisJcHJpdi0+U3dDaG5sU3RlcD0wOworLy8Jc2NoZWR1bGVfd29yaygmKHByaXYtPlN3Q2hubFdvcmtJdGVtKSk7CisvLwlydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShkZXYpOworCWlmKHByaXYtPnVwKSB7CisvLwkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCYocHJpdi0+U3dDaG5sV29ya0l0ZW0pKTsKKwlydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShkZXYpOworCX0KKworCXByaXYtPlN3Q2hubEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpmdW5jdGlvbjogIENhbGxiYWNrIHJvdXRpbmUgb2YgdGhlIHdvcmsgaXRlbSBmb3Igc2V0IGJhbmR3aWR0aCBtb2RlLgorICogICBpbnB1dDogIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKyAqICAgCSAgICAgSFRfQ0hBTk5FTF9XSURUSAlCYW5kd2lkdGggIC8vMjBNIG9yIDQwTQorICogICAJICAgICBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQgCSAgIC8vVXBwZXIsIExvd2VyLCBvciBEb24ndCBjYXJlCisgKiAgb3V0cHV0OiAgbm9uZQorICogIHJldHVybjogIG5vbmUKKyAqICAgIE5vdGU6ICBJIGRvdWJ0IHdoZXRoZXIgU2V0QldNb2RlSW5Qcm9ncmVzcyBmbGFnIGlzIG5lY2Vzc2FyeSBhcyB3ZSBjYW4KKyAqICAgIAkgICAgIHRlc3Qgd2hldGhlciBjdXJyZW50IHdvcmsgaW4gdGhlIHF1ZXVlIG9yIG5vdC4vL2RvIEk/CisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKwl1OCByZWdCd09wTW9kZTsKKworCVJUX1RSQUNFKENPTVBfU1dCVywgIj09PnJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oKSAgU3dpdGNoIHRvICVzIGJhbmR3aWR0aFxuIiwgXAorCQkJCQlwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjA/IjIwTUh6IjoiNDBNSHoiKQorCisKKwlpZihwcml2LT5yZl9jaGlwID09IFJGX1BTRVVET18xMU4pCisJeworCQlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCS8vPDE+U2V0IE1BQyByZWdpc3RlcgorCXJlZ0J3T3BNb2RlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSk7CisKKwlzd2l0Y2gocHJpdi0+Q3VycmVudENoYW5uZWxCVykKKwl7CisJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKKwkJCXJlZ0J3T3BNb2RlIHw9IEJXX09QTU9ERV8yME1IWjsKKwkJICAgICAgIC8vIDIwMDcvMDIvMDcgTWFyayBieSBFbWlseSBiZWNhc3VlIHdlIGhhdmUgbm90IHZlcmlmeSB3aGV0aGVyIHRoaXMgcmVnaXN0ZXIgd29ya3MKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgQldfT1BNT0RFLCByZWdCd09wTW9kZSk7CisJCQlicmVhazsKKworCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCQlyZWdCd09wTW9kZSAmPSB+QldfT1BNT0RFXzIwTUhaOworCQkJLy8gMjAwNy8wMi8wNyBNYXJrIGJ5IEVtaWx5IGJlY2FzdWUgd2UgaGF2ZSBub3QgdmVyaWZ5IHdoZXRoZXIgdGhpcyByZWdpc3RlciB3b3JrcworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBCV19PUE1PREUsIHJlZ0J3T3BNb2RlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldENoYW5uZWxCYW5kd2lkdGg4MTl4VXNiKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIscHJpdi0+Q3VycmVudENoYW5uZWxCVyk7CisJCQlicmVhazsKKwl9CisKKwkvLzwyPlNldCBQSFkgcmVsYXRlZCByZWdpc3RlcgorCXN3aXRjaChwcml2LT5DdXJyZW50Q2hhbm5lbEJXKQorCXsKKwkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgorCQkJLy8gQWRkIGJ5IFZpdmkgMjAwNzExMTkKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJSRk1PRCwgMHgwKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTFfUkZNT0QsIGJSRk1PRCwgMHgwKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgwMDEwMDAwMCwgMSk7CisKKwkJCS8vIENvcnJlY3QgdGhlIHR4IHBvd2VyIGZvciBDQ0sgcmF0ZSBpbiAyME0uIFN1Z2dlc3QgYnkgWU4sIDIwMDcxMjA3CisJCQlwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbl8yME1kZWZhdWx0ICsgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisKKwkJCWlmKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA+IDIyKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbj0gMjI7CisJCQlpZihwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb248IDApCisJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gMDsKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIjIwTSwgcEhhbERhdGEtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uKTsKKworCQkJaWYocHJpdi0+Y2hhbiA9PSAxNCAmJiAhcHJpdi0+YmNja19pbl9jaDE0KQorCQkJeworCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7CisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCQkJfQorCQkJZWxzZSBpZihwcml2LT5jaGFuICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCXsKKwkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQl9CisJCQllbHNlCisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCisJCQlicmVhazsKKwkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgorCQkJLy8gQWRkIGJ5IFZpdmkgMjAwNzExMTkKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJSRk1PRCwgMHgxKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTFfUkZNT0QsIGJSRk1PRCwgMHgxKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9TeXN0ZW0sIGJDQ0tTaWRlQmFuZCwgKHByaXYtPm5DdXI0ME1oelByaW1lU0M+PjEpKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgwMDEwMDAwMCwgMCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0xX0xTVEYsIDB4QzAwLCBwcml2LT5uQ3VyNDBNaHpQcmltZVNDKTsKKwkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9CisJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQgKyBwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKworCQkJaWYocHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID4gMjIpCisJCQkJcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gMjI7CisJCQlpZihwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb24gPCAwKQorCQkJCXByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA9IDA7CisKKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIjQwTSwgcEhhbERhdGEtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uKTsKKwkJCWlmKHByaXYtPmNoYW4gPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCXsKKwkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOworCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYscHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCX0KKwkJCWVsc2UgaWYocHJpdi0+Y2hhbiE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKKwkJCXsKKwkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBmYWxzZTsKKwkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQl9CisJCQllbHNlCisJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldixwcml2LT5iY2NrX2luX2NoMTQpOworCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0Q2hhbm5lbEJhbmR3aWR0aDgxOXhVc2IoKTogdW5rbm93biBCYW5kd2lkdGg6ICUjWFxuIiAscHJpdi0+Q3VycmVudENoYW5uZWxCVyk7CisJCQlicmVhazsKKworCX0KKwkvL1NraXAgb3ZlciBzZXR0aW5nIG9mIEotbW9kZSBpbiBCQiByZWdpc3RlciBoZXJlLiBEZWZhdWx0IHZhbHVlIGlzICJOb25lIEogbW9kZSIuIEVtaWx5IDIwMDcwMzE1CisKKwkvLzwzPlNldCBSRiByZWxhdGVkIHJlZ2lzdGVyCisJc3dpdGNoKCBwcml2LT5yZl9jaGlwICkKKwl7CisJCWNhc2UgUkZfODIyNToKKyNpZmRlZiBUT19ET19MSVNUCisJCQlQSFlfU2V0UkY4MjI1QmFuZHdpZHRoKEFkYXB0ZXIsIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsKKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJY2FzZSBSRl84MjU2OgorCQkJUEhZX1NldFJGODI1NkJhbmR3aWR0aChkZXYsIHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRl84MjU4OgorCQkJLy8gUEhZX1NldFJGODI1OEJhbmR3aWR0aCgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRl9QU0VVRE9fMTFOOgorCQkJLy8gRG8gTm90aGluZworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5rbm93biBSRkNoaXBJRDogJWRcbiIsIHByaXYtPnJmX2NoaXApOworCQkJYnJlYWs7CisJfQorCXByaXYtPlNldEJXTW9kZUluUHJvZ3Jlc3M9IGZhbHNlOworCisJUlRfVFJBQ0UoQ09NUF9TV0JXLCAiPD09U2V0QldNb2RlODE5eFVzYigpLCAlZCIsIGF0b21pY19yZWFkKCYocHJpdi0+aWVlZTgwMjExLT5hdG1fc3didykpICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBiYW5kd2l0aCBzd2l0Y2ggd29yay4KKyAqICAgaW5wdXQ6ICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2CisgKiAgIAkgICAgIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoICAvLzIwTSBvciA0ME0KKyAqICAgCSAgICAgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0IAkgICAvL1VwcGVyLCBMb3dlciwgb3IgRG9uJ3QgY2FyZQorICogIG91dHB1dDogIG5vbmUKKyAqICByZXR1cm46ICBub25lCisgKiAgICBOb3RlOiAgSSBkb3VidCB3aGV0aGVyIFNldEJXTW9kZUluUHJvZ3Jlc3MgZmxhZyBpcyBuZWNlc3NhcnkgYXMgd2UgY2FuCisgKiAgICAJICAgICB0ZXN0IHdoZXRoZXIgY3VycmVudCB3b3JrIGluIHRoZSBxdWV1ZSBvciBub3QuLy9kbyBJPworICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX1NldEJXTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKKworCWlmKHByaXYtPlNldEJXTW9kZUluUHJvZ3Jlc3MpCisJCXJldHVybjsKKwlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzPSB0cnVlOworCisJcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9IEJhbmR3aWR0aDsKKworCWlmKE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpCisJCXByaXYtPm5DdXI0ME1oelByaW1lU0MgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVI7CisJZWxzZSBpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSKQorCQlwcml2LT5uQ3VyNDBNaHpQcmltZVNDID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOworCWVsc2UKKwkJcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7CisKKwkvL3F1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwgJihwcml2LT5TZXRCV01vZGVXb3JrSXRlbSkpOworCS8vCXNjaGVkdWxlX3dvcmsoJihwcml2LT5TZXRCV01vZGVXb3JrSXRlbSkpOworCXJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oZGV2KTsKKworfQorCit2b2lkIEluaXRpYWxHYWluODE5eFVzYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAl1OCBPcGVyYXRpb24pCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOworCisJcHJpdi0+SW5pdGlhbEdhaW5PcGVyYXRlVHlwZSA9IE9wZXJhdGlvbjsKKworCWlmKHByaXYtPnVwKQorCXsKKwkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPmluaXRpYWxnYWluX29wZXJhdGVfd3EsMCk7CisJfQorfQorCitleHRlcm4gdm9pZCBJbml0aWFsR2Fpbk9wZXJhdGVXb3JrSXRlbUNhbGxCYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7CisgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsaW5pdGlhbGdhaW5fb3BlcmF0ZV93cSk7CisgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmllZWU4MDIxMS0+ZGV2OworI2RlZmluZSBTQ0FOX1JYX0lOSVRJQUxfR0FJTgkweDE3CisjZGVmaW5lIFBPV0VSX0RFVEVDVElPTl9USAkweDA4CisJdTMyCUJpdE1hc2s7CisJdTgJaW5pdGlhbF9nYWluOworCXU4CU9wZXJhdGlvbjsKKworCU9wZXJhdGlvbiA9IHByaXYtPkluaXRpYWxHYWluT3BlcmF0ZVR5cGU7CisKKwlzd2l0Y2goT3BlcmF0aW9uKQorCXsKKwkJY2FzZSBJR19CYWNrdXA6CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJJR19CYWNrdXAsIGJhY2t1cCB0aGUgaW5pdGlhbCBnYWluLlxuIik7CisJCQlpbml0aWFsX2dhaW4gPSBTQ0FOX1JYX0lOSVRJQUxfR0FJTjsvL3ByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXTsvLworCQkJQml0TWFzayA9IGJNYXNrQnl0ZTA7CisJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQorCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBGVyBESUcgT0ZGCisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgQml0TWFzayk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgQml0TWFzayk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgQml0TWFzayk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgQml0TWFzayk7CisJCQlCaXRNYXNrICA9IGJNYXNrQnl0ZTI7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhCQk9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9DQ0EsIEJpdE1hc2spOworCisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gaW5pdGlhbCBnYWluID0gMHgleCBcbiIsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiAweGEwYSA9IDB4JXggXG4iLCBQT1dFUl9ERVRFQ1RJT05fVEgpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGEwYSwgUE9XRVJfREVURUNUSU9OX1RIKTsKKwkJCWJyZWFrOworCQljYXNlIElHX1Jlc3RvcmU6CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJJR19SZXN0b3JlLCByZXN0b3JlIHRoZSBpbml0aWFsIGdhaW4uXG4iKTsKKwkJCUJpdE1hc2sgPSAweDdmOyAvL0JpdDB+IEJpdDYKKwkJCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCisJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIEZXIERJRyBPRkYKKworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIEJpdE1hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwkJCUJpdE1hc2sgID0gYk1hc2tCeXRlMjsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9DQ0EsIEJpdE1hc2ssICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTAgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM1OCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzYwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNjggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGEwYSBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKworI2lmZGVmIFJUTDgxOTBQCisJCQlTZXRUeFBvd2VyTGV2ZWw4MTkwKEFkYXB0ZXIscHJpdi0+Q3VycmVudENoYW5uZWwpOworI2VuZGlmCisjaWZkZWYgUlRMODE5MkUKKwkJCVNldFR4UG93ZXJMZXZlbDgxOTAoQWRhcHRlcixwcml2LT5DdXJyZW50Q2hhbm5lbCk7CisjZW5kaWYKKy8vI2lmZGVmIFJUTDgxOTJVCisJCQlydGw4MTkyX3BoeV9zZXRUeFBvd2VyKGRldixwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKy8vI2VuZGlmCisKKwkJCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCisJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CS8vIEZXIERJRyBPTgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJVbmtub3duIElHIE9wZXJhdGlvbi4gXG4iKTsKKwkJCWJyZWFrOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzYmM1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmgKQEAgLTAsMCArMSw5MCBAQAorI2lmbmRlZiBfUjgxOVhVX1BIWV9ICisjZGVmaW5lIF9SODE5WFVfUEhZX0gKKworLyogQ2hhbm5lbCBzd2l0Y2g6VGhlIHNpemUgb2YgY29tbWFuZCB0YWJsZXMgZm9yIHN3aXRjaCBjaGFubmVsKi8KKyNkZWZpbmUgTUFYX1BSRUNNRF9DTlQgMTYKKyNkZWZpbmUgTUFYX1JGREVQRU5EQ01EX0NOVCAxNgorI2RlZmluZSBNQVhfUE9TVENNRF9DTlQgMTYKKwordHlwZWRlZiBlbnVtIF9Td0NobmxDbWRJRHsKKwlDbWRJRF9FbmQsCisJQ21kSURfU2V0VHhQb3dlckxldmVsLAorCUNtZElEX0JCUmVnV3JpdGUxMCwKKwlDbWRJRF9Xcml0ZVBvcnRVbG9uZywKKwlDbWRJRF9Xcml0ZVBvcnRVc2hvcnQsCisJQ21kSURfV3JpdGVQb3J0VWNoYXIsCisJQ21kSURfUkZfV3JpdGVSZWcsCit9U3dDaG5sQ21kSUQ7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogMS4gU3dpdGNoIGNoYW5uZWwgcmVsYXRlZCAqLwordHlwZWRlZiBzdHJ1Y3QgX1N3Q2hubENtZHsKKwlTd0NobmxDbWRJRAlDbWRJRDsKKwl1MzIJCQlQYXJhMTsKKwl1MzIJCQlQYXJhMjsKKwl1MzIJCQltc0RlbGF5OworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTd0NobmxDbWQ7CisKK2V4dGVybiB1MzIgcnRsODE5WE1BQ1BIWV9BcnJheV9QR1tdOworZXh0ZXJuIHUzMiBydGw4MTlYUEhZX1JFR18xVDJSQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WEFHQ1RBQl9BcnJheVtdOworZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9BX0FycmF5W107CitleHRlcm4gdTMyIHJ0bDgxOVhSYWRpb0JfQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WFJhZGlvQ19BcnJheVtdOworZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9EX0FycmF5W107CisKK3R5cGVkZWYgZW51bSBfSFc5MF9CTE9DS3sKKwlIVzkwX0JMT0NLX01BQyA9IDAsCisJSFc5MF9CTE9DS19QSFkwID0gMSwKKwlIVzkwX0JMT0NLX1BIWTEgPSAyLAorCUhXOTBfQkxPQ0tfUkYgPSAzLAorCUhXOTBfQkxPQ0tfTUFYSU1VTSA9IDQsIC8vIE5ldmVyIHVzZSB0aGlzCit9SFc5MF9CTE9DS19FLCAqUEhXOTBfQkxPQ0tfRTsKKwordHlwZWRlZiBlbnVtIF9SRjkwX1JBRElPX1BBVEh7CisJUkY5MF9QQVRIX0EgPSAwLAkJCS8vUmFkaW8gUGF0aCBBCisJUkY5MF9QQVRIX0IgPSAxLAkJCS8vUmFkaW8gUGF0aCBCCisJUkY5MF9QQVRIX0MgPSAyLAkJCS8vUmFkaW8gUGF0aCBDCisJUkY5MF9QQVRIX0QgPSAzLAkJCS8vUmFkaW8gUGF0aCBECisJUkY5MF9QQVRIX01BWAkJCQkvL01heCBSRiBudW1iZXIgOTIgc3VwcG9ydAorfVJGOTBfUkFESU9fUEFUSF9FLCAqUFJGOTBfUkFESU9fUEFUSF9FOworCisjZGVmaW5lIGJNYXNrQnl0ZTAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiTWFza0J5dGUxICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiTWFza0J5dGUyICAgICAgICAgICAgICAgIDB4ZmYwMDAwCisjZGVmaW5lIGJNYXNrQnl0ZTMgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBiTWFza0hXb3JkICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgYk1hc2tMV29yZCAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIGJNYXNrRFdvcmQgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorCisvL2V4dGVybiB1MzIgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdCh1MzIgZHdCaXRNYXNrKTsKK2V4dGVybiB1OCBydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdTMyIGVSRlBhdGgpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9zZXRCQnJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrLCB1MzIgZHdEYXRhKTsKK2V4dGVybiB1MzIgcnRsODE5Ml9RdWVyeUJCUmVnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHUzMiBkd1JlZ0FkZHIsIHUzMiBkd0JpdE1hc2spOworLy9leHRlcm4gdTMyIHJ0bDgxOTJfcGh5X1JGU2VyaWFsUmVhZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgT2Zmc2V0KTsKKy8vZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgT2Zmc2V0LCB1MzIgRGF0YSk7CitleHRlcm4gdm9pZCBydGw4MTkyX3BoeV9TZXRSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKTsKK2V4dGVybiB1MzIgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfY29uZmlnbWFjKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlDb25maWdCQihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBDb25maWdUeXBlKTsKKy8vZXh0ZXJuIHZvaWQgcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB1OCBydGw4MTkyX3BoeV9jaGVja0JCQW5kUkYoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgSFc5MF9CTE9DS19FIENoZWNrQmxvY2ssIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgpOworLy9leHRlcm4gdm9pZCBydGw4MTkyX0JCX0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfQkJDb25maWcoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdm9pZCBydGw4MTkyX3BoeV9nZXRUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfc2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBjaGFubmVsKTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfcGh5X1JGQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfdXBkYXRlSW5pdEdhaW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gdTggcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBSRjkwX1JBRElPX1BBVEhfRQllUkZQYXRoKTsKKworZXh0ZXJuIHU4IHJ0bDgxOTJfcGh5X1N3Q2hubChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCB1OCBjaGFubmVsKTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfU2V0QldNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gYm9vbCBydGw4MTkyX1NldFJGUG93ZXJTdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlKTsKKy8vYWRkZWQgYnkgYW15CitleHRlcm4gdm9pZCBJbml0aWFsR2FpbjgxOXhVc2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJdTggT3BlcmF0aW9uKTsKKworZXh0ZXJuIHZvaWQgSW5pdGlhbEdhaW5PcGVyYXRlV29ya0l0ZW1DYWxsQmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5cmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeXJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjBiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeXJlZy5oCkBAIC0wLDAgKzEsODcxIEBACisjaWZuZGVmIF9SODE5WFVfUEhZUkVHX0gKKyNkZWZpbmUgX1I4MTlYVV9QSFlSRUdfSAorCisKKyNkZWZpbmUgICBSRl9EQVRBCQkJCTB4MWQ0CQkJCQkvLyBGVyB3aWxsIHdyaXRlIFJGIGRhdGEgaW4gdGhlIHJlZ2lzdGVyLgorCisvL1JlZ2lzdGVyICAgLy9kdXBsaWNhdGUgcmVnaXN0ZXIgZHVlIHRvIGNvbm5lY3Rpb246IFJGX01vZGUsIFRSeFJOLCBOdW1PZiBMLVNURgorLy9wYWdlIDEKKyNkZWZpbmUgclBNQUNfUmVzZXQgICAgICAgICAgICAgICAJCTB4MTAwCisjZGVmaW5lIHJQTUFDX1R4U3RhcnQgICAgICAgICAgICAgCQkweDEwNAorI2RlZmluZSByUE1BQ19UeExlZ2FjeVNJRyAgICAgICAgIAkJMHgxMDgKKyNkZWZpbmUgclBNQUNfVHhIVFNJRzEgICAgICAgICAgICAJCTB4MTBjCisjZGVmaW5lIHJQTUFDX1R4SFRTSUcyICAgICAgICAgICAgCQkweDExMAorI2RlZmluZSByUE1BQ19QSFlEZWJ1ZyAgICAgICAgICAgIAkJMHgxMTQKKyNkZWZpbmUgclBNQUNfVHhQYWNrZXROdW0gICAgICAgICAJCTB4MTE4CisjZGVmaW5lIHJQTUFDX1R4SWRsZSAgICAgICAgICAgICAgCQkweDExYworI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjAgICAgICAgCTB4MTIwCisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyMSAgICAgICAJMHgxMjQKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIyICAgICAgIAkweDEyOAorI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjMgICAgICAgCTB4MTJjCisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyNCAgICAgICAJMHgxMzAKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXI1ICAgICAgIAkweDEzNAorI2RlZmluZSByUE1BQ19UeERhdGFUeXBlICAgICAgICAgIAkJMHgxMzgKKyNkZWZpbmUgclBNQUNfVHhSYW5kb21TZWVkICAgICAgCQkweDEzYworI2RlZmluZSByUE1BQ19DQ0tQTENQUHJlYW1ibGUgIAkJMHgxNDAKKyNkZWZpbmUgclBNQUNfQ0NLUExDUEhlYWRlciAgICAgCQkweDE0NAorI2RlZmluZSByUE1BQ19DQ0tDUkMxNiAgICAgICAgICAgIAkJMHgxNDgKKyNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDMzJPSyAgCQkweDE3MAorI2RlZmluZSByUE1BQ19PRkRNUnhDUkMzMkVyICAgCQkweDE3NAorI2RlZmluZSByUE1BQ19PRkRNUnhQYXJpdHlFciAgICAJCTB4MTc4CisjZGVmaW5lIHJQTUFDX09GRE1SeENSQzhFciAgICAgCQkweDE3YworI2RlZmluZSByUE1BQ19DQ0tDUnhSQzE2RXIgICAgICAgCQkweDE4MAorI2RlZmluZSByUE1BQ19DQ0tDUnhSQzMyRXIgICAgICAgCQkweDE4NAorI2RlZmluZSByUE1BQ19DQ0tDUnhSQzMyT0sgICAgICAJCTB4MTg4CisjZGVmaW5lIHJQTUFDX1R4U3RhdHVzICAgICAgICAgICAgCQkweDE4YworCisvL3BhZ2U4CisjZGVmaW5lIHJGUEdBMF9SRk1PRCAgICAgICAgICAgICAgCQkweDgwMCAgLy9SRiBtb2RlICYgQ0NLIFR4U0MKKyNkZWZpbmUgckZQR0EwX1R4SW5mbyAgICAgICAgICAgICAJCTB4ODA0CisjZGVmaW5lIHJGUEdBMF9QU0RGdW5jdGlvbiAgICAgICAgCQkweDgwOAorI2RlZmluZSByRlBHQTBfVHhHYWluU3RhZ2UgICAgICAgIAkJMHg4MGMKKyNkZWZpbmUgckZQR0EwX1JGVGltaW5nMSAgICAgICAgICAJCTB4ODEwCisjZGVmaW5lIHJGUEdBMF9SRlRpbWluZzIgICAgICAgICAgCQkweDgxNAorLy8jZGVmaW5lIHJGUEdBMF9YQ19SRlRpbWluZyAgICAgICAgCQkweDgxOAorLy8jZGVmaW5lIHJGUEdBMF9YRF9SRlRpbWluZyAgICAgICAgCQkweDgxYworI2RlZmluZSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjEgIAkweDgyMAorI2RlZmluZSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIgIAkweDgyNAorI2RlZmluZSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjEgIAkweDgyOAorI2RlZmluZSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjIgIAkweDgyYworI2RlZmluZSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjEgIAkweDgzMAorI2RlZmluZSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjIgIAkweDgzNAorI2RlZmluZSByRlBHQTBfWERfSFNTSVBhcmFtZXRlcjEgIAkweDgzOAorI2RlZmluZSByRlBHQTBfWERfSFNTSVBhcmFtZXRlcjIgIAkweDgzYworI2RlZmluZSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlciAgIAkweDg0MAorI2RlZmluZSByRlBHQTBfWEJfTFNTSVBhcmFtZXRlciAgIAkweDg0NAorI2RlZmluZSByRlBHQTBfWENfTFNTSVBhcmFtZXRlciAgIAkweDg0OAorI2RlZmluZSByRlBHQTBfWERfTFNTSVBhcmFtZXRlciAgIAkweDg0YworI2RlZmluZSByRlBHQTBfUkZXYWtlVXBQYXJhbWV0ZXIgIAkweDg1MAorI2RlZmluZSByRlBHQTBfUkZTbGVlcFVwUGFyYW1ldGVyIAkweDg1NAorI2RlZmluZSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2wgIAkweDg1OAorI2RlZmluZSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wgIAkweDg1YworI2RlZmluZSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSAgIAkweDg2MAorI2RlZmluZSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRSAgIAkweDg2NAorI2RlZmluZSByRlBHQTBfWENfUkZJbnRlcmZhY2VPRSAgIAkweDg2OAorI2RlZmluZSByRlBHQTBfWERfUkZJbnRlcmZhY2VPRSAgIAkweDg2YworI2RlZmluZSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1cgIAkweDg3MAorI2RlZmluZSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1cgIAkweDg3NAorI2RlZmluZSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyICAgIAkweDg3OAorI2RlZmluZSByRlBHQTBfWENEX1JGUGFyYW1ldGVyICAgIAkweDg3YworI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSAgIAkweDg4MAorI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiAgIAkweDg4NAorI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMyAgIAkweDg4OAorI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCAgIAkweDg4YworI2RlZmluZSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrICAgIAkweDhhMAorI2RlZmluZSByRlBHQTBfWEJfTFNTSVJlYWRCYWNrICAgIAkweDhhNAorI2RlZmluZSByRlBHQTBfWENfTFNTSVJlYWRCYWNrICAgIAkweDhhOAorI2RlZmluZSByRlBHQTBfWERfTFNTSVJlYWRCYWNrICAgIAkweDhhYworI2RlZmluZSByRlBHQTBfUFNEUmVwb3J0ICAgICAgICAgIAkJMHg4YjQKKyNkZWZpbmUgckZQR0EwX1hBQl9SRkludGVyZmFjZVJCICAJMHg4ZTAKKyNkZWZpbmUgckZQR0EwX1hDRF9SRkludGVyZmFjZVJCICAJMHg4ZTQKKworLy9wYWdlIDkKKyNkZWZpbmUgckZQR0ExX1JGTU9EICAgICAgICAgICAgICAJCTB4OTAwICAvL1JGIG1vZGUgJiBPRkRNIFR4U0MKKyNkZWZpbmUgckZQR0ExX1R4QmxvY2sgICAgICAgICAgICAJCTB4OTA0CisjZGVmaW5lIHJGUEdBMV9EZWJ1Z1NlbGVjdCAgICAgICAgCQkweDkwOAorI2RlZmluZSByRlBHQTFfVHhJbmZvICAgICAgICAgICAgIAkJMHg5MGMKKworLy9wYWdlIGEKKyNkZWZpbmUgckNDSzBfU3lzdGVtICAgICAgICAgICAgICAJCTB4YTAwCisjZGVmaW5lIHJDQ0swX0FGRVNldHRpbmcgICAgICAgICAgCQkweGEwNAorI2RlZmluZSByQ0NLMF9DQ0EgICAgICAgICAgICAgICAgIAkJCTB4YTA4CisjZGVmaW5lIHJDQ0swX1J4QUdDMSAgICAgICAgICAgICAgCQkweGEwYyAgLy9BR0MgZGVmYXVsdCB2YWx1ZSwgc2F0dXJhdGlvbiBsZXZlbAorI2RlZmluZSByQ0NLMF9SeEFHQzIgICAgICAgICAgICAgIAkJMHhhMTAgIC8vQUdDICYgREFHQworI2RlZmluZSByQ0NLMF9SeEhQICAgICAgICAgICAgICAgIAkJMHhhMTQKKyNkZWZpbmUgckNDSzBfRFNQUGFyYW1ldGVyMSAgICAgICAJMHhhMTggIC8vVGltaW5nIHJlY292ZXJ5ICYgQ2hhbm5lbCBlc3RpbWF0aW9uIHRocmVzaG9sZAorI2RlZmluZSByQ0NLMF9EU1BQYXJhbWV0ZXIyICAgICAgIAkweGExYyAgLy9TUSB0aHJlc2hvbGQKKyNkZWZpbmUgckNDSzBfVHhGaWx0ZXIxICAgICAgICAgICAJCTB4YTIwCisjZGVmaW5lIHJDQ0swX1R4RmlsdGVyMiAgICAgICAgICAgCQkweGEyNAorI2RlZmluZSByQ0NLMF9EZWJ1Z1BvcnQgICAgICAgICAgIAkJMHhhMjggIC8vZGVidWcgcG9ydCBhbmQgVHggZmlsdGVyMworI2RlZmluZSByQ0NLMF9GYWxzZUFsYXJtUmVwb3J0ICAgIAkweGEyYyAgLy8weGEyZAorI2RlZmluZSByQ0NLMF9UUlNTSVJlcG9ydCAgICAgICAgIAkJMHhhNTAKKyNkZWZpbmUgckNDSzBfUnhSZXBvcnQgICAgICAgICAgICAJCTB4YTU0ICAvLzB4YTU3CisjZGVmaW5lIHJDQ0swX0ZBQ291bnRlckxvd2VyICAgICAgCTB4YTVjICAvLzB4YTViCisjZGVmaW5lIHJDQ0swX0ZBQ291bnRlclVwcGVyICAgICAgCTB4YTU4ICAvLzB4YTVjCisKKy8vcGFnZSBjCisjZGVmaW5lIHJPRkRNMF9MU1RGICAgICAgICAgICAgICAgCQkweGMwMAorI2RlZmluZSByT0ZETTBfVFJ4UGF0aEVuYWJsZSAgICAgIAkweGMwNAorI2RlZmluZSByT0ZETTBfVFJNdXhQYXIgICAgICAgICAgIAkJMHhjMDgKKyNkZWZpbmUgck9GRE0wX1RSU1dJc29sYXRpb24gICAgICAJCTB4YzBjCisjZGVmaW5lIHJPRkRNMF9YQVJ4QUZFICAgICAgICAgICAgCQkweGMxMCAgLy9SeElRIERDIG9mZnNldCwgUnggZGlnaXRhbCBmaWx0ZXIsIERDIG5vdGNoIGZpbHRlcgorI2RlZmluZSByT0ZETTBfWEFSeElRSW1iYWxhbmNlICAgIAkweGMxNCAgLy9SeElRIGltYmxhbmNlIG1hdHJpeAorI2RlZmluZSByT0ZETTBfWEJSeEFGRSAgICAgICAgICAgIAkJMHhjMTgKKyNkZWZpbmUgck9GRE0wX1hCUnhJUUltYmFsYW5jZSAgICAJMHhjMWMKKyNkZWZpbmUgck9GRE0wX1hDUnhBRkUgICAgICAgICAgICAJCTB4YzIwCisjZGVmaW5lIHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2UgICAgCTB4YzI0CisjZGVmaW5lIHJPRkRNMF9YRFJ4QUZFICAgICAgICAgICAgCQkweGMyOAorI2RlZmluZSByT0ZETTBfWERSeElRSW1iYWxhbmNlICAgIAkweGMyYworI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjEgICAgICAgIAkJMHhjMzAgIC8vUEQsQlcgJiBTQkQKKyNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3IyICAgICAgICAJCTB4YzM0ICAvL1NCRCAmIEZhbWUgU3luYy4KKyNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3IzICAgICAgICAJCTB4YzM4ICAvL0ZyYW1lIFN5bmMuCisjZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yNCAgICAgICAgCQkweGMzYyAgLy9QRCwgU0JELCBGcmFtZSBTeW5jICYgU2hvcnQtR0kKKyNkZWZpbmUgck9GRE0wX1J4RFNQICAgICAgICAgICAgICAJCTB4YzQwICAvL1J4IFN5bmMgUGF0aAorI2RlZmluZSByT0ZETTBfQ0ZPYW5kREFHQyAgICAgICAgIAkweGM0NCAgLy9DRk8gJiBEQUdDCisjZGVmaW5lIHJPRkRNMF9DQ0FEcm9wVGhyZXNob2xkICAgCTB4YzQ4IC8vQ0NBIERyb3AgdGhyZXNob2xkCisjZGVmaW5lIHJPRkRNMF9FQ0NBVGhyZXNob2xkICAgICAgCTB4YzRjIC8vIGVuZXJneSBDQ0EKKyNkZWZpbmUgck9GRE0wX1hBQUdDQ29yZTEgICAgICAgICAJMHhjNTAKKyNkZWZpbmUgck9GRE0wX1hBQUdDQ29yZTIgICAgICAgICAJMHhjNTQKKyNkZWZpbmUgck9GRE0wX1hCQUdDQ29yZTEgICAgICAgICAJMHhjNTgKKyNkZWZpbmUgck9GRE0wX1hCQUdDQ29yZTIgICAgICAgICAJMHhjNWMKKyNkZWZpbmUgck9GRE0wX1hDQUdDQ29yZTEgICAgICAgICAJMHhjNjAKKyNkZWZpbmUgck9GRE0wX1hDQUdDQ29yZTIgICAgICAgICAJMHhjNjQKKyNkZWZpbmUgck9GRE0wX1hEQUdDQ29yZTEgICAgICAgICAJMHhjNjgKKyNkZWZpbmUgck9GRE0wX1hEQUdDQ29yZTIgICAgICAgICAJMHhjNmMKKyNkZWZpbmUgck9GRE0wX0FHQ1BhcmFtZXRlcjEgICAgICAJMHhjNzAKKyNkZWZpbmUgck9GRE0wX0FHQ1BhcmFtZXRlcjIgICAgICAJMHhjNzQKKyNkZWZpbmUgck9GRE0wX0FHQ1JTU0lUYWJsZSAgICAgICAJMHhjNzgKKyNkZWZpbmUgck9GRE0wX0hUU1RGQUdDICAgICAgICAgICAJCTB4YzdjCisjZGVmaW5lIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UgICAJMHhjODAKKyNkZWZpbmUgck9GRE0wX1hBVHhBRkUgICAgICAgICAgICAJCTB4Yzg0CisjZGVmaW5lIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UgICAgCTB4Yzg4CisjZGVmaW5lIHJPRkRNMF9YQlR4QUZFICAgICAgICAgICAgCQkweGM4YworI2RlZmluZSByT0ZETTBfWENUeElRSW1iYWxhbmNlICAgIAkweGM5MAorI2RlZmluZSByT0ZETTBfWENUeEFGRSAgICAgICAgICAgIAkJMHhjOTQKKyNkZWZpbmUgck9GRE0wX1hEVHhJUUltYmFsYW5jZSAgICAJMHhjOTgKKyNkZWZpbmUgck9GRE0wX1hEVHhBRkUgICAgICAgICAgICAJCTB4YzljCisjZGVmaW5lIHJPRkRNMF9SeEhQUGFyYW1ldGVyICAgICAgCTB4Y2UwCisjZGVmaW5lIHJPRkRNMF9UeFBzZXVkb05vaXNlV2d0ICAgCTB4Y2U0CisjZGVmaW5lIHJPRkRNMF9GcmFtZVN5bmMgICAgICAgICAgCQkweGNmMAorI2RlZmluZSByT0ZETTBfREZTUmVwb3J0ICAgICAgICAgIAkJMHhjZjQKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmYxICAgICAgICAgICAJCTB4Y2E0CisjZGVmaW5lIHJPRkRNMF9UeENvZWZmMiAgICAgICAgICAgCQkweGNhOAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjMgICAgICAgICAgIAkJMHhjYWMKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmY0ICAgICAgICAgICAJCTB4Y2IwCisjZGVmaW5lIHJPRkRNMF9UeENvZWZmNSAgICAgICAgICAgCQkweGNiNAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjYgICAgICAgICAgIAkJMHhjYjgKKworCisvL3BhZ2UgZAorI2RlZmluZSByT0ZETTFfTFNURiAgICAgICAgICAgICAgIAkJMHhkMDAKKyNkZWZpbmUgck9GRE0xX1RSeFBhdGhFbmFibGUgICAgICAJMHhkMDQKKyNkZWZpbmUgck9GRE0xX0NGTyAgICAgICAgICAgICAgICAJCTB4ZDA4CisjZGVmaW5lIHJPRkRNMV9DU0kxICAgICAgICAgICAgICAgCQkweGQxMAorI2RlZmluZSByT0ZETTFfU0JEICAgICAgICAgICAgICAgIAkJMHhkMTQKKyNkZWZpbmUgck9GRE0xX0NTSTIgICAgICAgICAgICAgICAJCTB4ZDE4CisjZGVmaW5lIHJPRkRNMV9DRk9UcmFja2luZyAgICAgICAgCQkweGQyYworI2RlZmluZSByT0ZETTFfVFJ4TWVzYXVyZTEgICAgICAgIAkweGQzNAorI2RlZmluZSByT0ZETTFfSW50ZkRldCAgICAgICAgICAgIAkJMHhkM2MKKyNkZWZpbmUgck9GRE0xX1BzZXVkb05vaXNlU3RhdGVBQiAweGQ1MAorI2RlZmluZSByT0ZETTFfUHNldWRvTm9pc2VTdGF0ZUNEIDB4ZDU0CisjZGVmaW5lIHJPRkRNMV9SeFBzZXVkb05vaXNlV2d0ICAgMHhkNTgKKyNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjEgICAgICAgICAJCTB4ZGEwICAvL2NjYSwgcGFyaXR5IGZhaWwKKyNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjIgICAgICAgICAJCTB4ZGE0ICAvL3JhdGUgaWxsZWdhbCwgY3JjOCBmYWlsCisjZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIzICAgICAgICAgCQkweGRhOCAgLy9NQ1Mgbm90IHN1cHBvcnQKKyNkZWZpbmUgck9GRE1fU2hvcnRDRk9BQiAgICAgICAgICAJCTB4ZGFjCisjZGVmaW5lIHJPRkRNX1Nob3J0Q0ZPQ0QgICAgICAgICAgCQkweGRiMAorI2RlZmluZSByT0ZETV9Mb25nQ0ZPQUIgICAgICAgICAgIAkJMHhkYjQKKyNkZWZpbmUgck9GRE1fTG9uZ0NGT0NEICAgICAgICAgICAJCTB4ZGI4CisjZGVmaW5lIHJPRkRNX1RhaWxDRk9BQiAgICAgICAgICAgCQkweGRiYworI2RlZmluZSByT0ZETV9UYWlsQ0ZPQ0QgICAgICAgICAgIAkJMHhkYzAKKyNkZWZpbmUgck9GRE1fUFdNZWFzdXJlMSAgICAgICAgICAJMHhkYzQKKyNkZWZpbmUgck9GRE1fUFdNZWFzdXJlMiAgICAgICAgICAJMHhkYzgKKyNkZWZpbmUgck9GRE1fQldSZXBvcnQgICAgICAgICAgICAJCTB4ZGNjCisjZGVmaW5lIHJPRkRNX0FHQ1JlcG9ydCAgICAgICAgICAgCQkweGRkMAorI2RlZmluZSByT0ZETV9SeFNOUiAgICAgICAgICAgICAgIAkJMHhkZDQKKyNkZWZpbmUgck9GRE1fUnhFVk1DU0kgICAgICAgICAgICAJCTB4ZGQ4CisjZGVmaW5lIHJPRkRNX1NJR1JlcG9ydCAgICAgICAgICAgCQkweGRkYworCisvL3BhZ2UgZQorI2RlZmluZSByVHhBR0NfUmF0ZTE4XzA2CQkJMHhlMDAKKyNkZWZpbmUgclR4QUdDX1JhdGU1NF8yNAkJCTB4ZTA0CisjZGVmaW5lIHJUeEFHQ19DQ0tfTWNzMzIJCQkweGUwOAorI2RlZmluZSByVHhBR0NfTWNzMDNfTWNzMDAJCQkweGUxMAorI2RlZmluZSByVHhBR0NfTWNzMDdfTWNzMDQJCQkweGUxNAorI2RlZmluZSByVHhBR0NfTWNzMTFfTWNzMDgJCQkweGUxOAorI2RlZmluZSByVHhBR0NfTWNzMTVfTWNzMTIJCQkweGUxYworCisKKy8vUkYKKy8vWmVicmExCisjZGVmaW5lIHJaZWJyYTFfSFNTSUVuYWJsZSAgICAgICAgICAgIAkweDAKKyNkZWZpbmUgclplYnJhMV9UUnhFbmFibGUxICAgICAgICAgICAgCTB4MQorI2RlZmluZSByWmVicmExX1RSeEVuYWJsZTIgICAgICAgICAgIAkweDIKKyNkZWZpbmUgclplYnJhMV9BR0MgICAgICAgICAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgclplYnJhMV9DaGFyZ2VQdW1wICAgICAgICAgICAgCTB4NQorI2RlZmluZSByWmVicmExX0NoYW5uZWwgICAgICAgICAgICAgICAJCTB4NworI2RlZmluZSByWmVicmExX1R4R2FpbiAgICAgICAgICAgICAgIAkJMHg4CisjZGVmaW5lIHJaZWJyYTFfVHhMUEYgICAgICAgICAgICAgICAgIAkJMHg5CisjZGVmaW5lIHJaZWJyYTFfUnhMUEYgICAgICAgICAgICAgICAgIAkJMHhiCisjZGVmaW5lIHJaZWJyYTFfUnhIUEZDb3JuZXIgICAgICAgICAgIAkweGMKKworLy9aZWJyYTQKKyNkZWZpbmUgckdsb2JhbEN0cmwgICAgICAgICAgICAgICAgICAgCQkwCisjZGVmaW5lIHJSVEw4MjU2X1R4TFBGICAgICAgICAgICAgICAgIAkJMTkKKyNkZWZpbmUgclJUTDgyNTZfUnhMUEYgICAgICAgICAgICAgICAgCQkxMQorCisvL1JUTDgyNTgKKyNkZWZpbmUgclJUTDgyNThfVHhMUEYgICAgICAgICAgICAgICAgCQkweDExCisjZGVmaW5lIHJSVEw4MjU4X1J4TFBGICAgICAgICAgICAgICAgIAkJMHgxMworI2RlZmluZSByUlRMODI1OF9SU1NJTFBGICAgICAgICAgICAgICAJMHhhCisKKy8vQml0IE1hc2sKKy8vcGFnZS0xCisjZGVmaW5lIGJCQlJlc2V0QiAgICAgICAgICAgICAgICAgCQkJMHgxMDAKKyNkZWZpbmUgYkdsb2JhbFJlc2V0QiAgICAgICAgICAgICAJCTB4MjAwCisjZGVmaW5lIGJPRkRNVHhTdGFydCAgICAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgYkNDS1R4U3RhcnQgICAgICAgICAgICAgICAJCQkweDgKKyNkZWZpbmUgYkNSQzMyRGVidWcgICAgICAgICAgICAgICAJCTB4MTAwCisjZGVmaW5lIGJQTUFDTG9vcGJhY2sgICAgICAgICAgICAgCQkweDEwCisjZGVmaW5lIGJUeExTSUcgICAgICAgICAgICAgICAgICAgCQkJMHhmZmZmZmYKKyNkZWZpbmUgYk9GRE1UeFJhdGUgICAgICAgICAgICAgICAJCTB4ZgorI2RlZmluZSBiT0ZETVR4UmVzZXJ2ZWQgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiT0ZETVR4TGVuZ3RoICAgICAgICAgICAgIAkJMHgxZmZlMAorI2RlZmluZSBiT0ZETVR4UGFyaXR5ICAgICAgICAgICAgIAkJMHgyMDAwMAorI2RlZmluZSBiVHhIVFNJRzEgICAgICAgICAgICAgICAgIAkJCTB4ZmZmZmZmCisjZGVmaW5lIGJUeEhUTUNTUmF0ZSAgICAgICAgICAgICAgCQkweDdmCisjZGVmaW5lIGJUeEhUQlcgICAgICAgICAgICAgICAgICAgCQkJMHg4MAorI2RlZmluZSBiVHhIVExlbmd0aCAgICAgICAgICAgICAgIAkJMHhmZmZmMDAKKyNkZWZpbmUgYlR4SFRTSUcyICAgICAgICAgICAgICAgICAJCQkweGZmZmZmZgorI2RlZmluZSBiVHhIVFNtb290aGluZyAgICAgICAgICAgIAkJMHgxCisjZGVmaW5lIGJUeEhUU291bmRpbmcgICAgICAgICAgICAgCQkweDIKKyNkZWZpbmUgYlR4SFRSZXNlcnZlZCAgICAgICAgICAgICAJCTB4NAorI2RlZmluZSBiVHhIVEFnZ3JlYXRpb24gICAgICAgICAgIAkJMHg4CisjZGVmaW5lIGJUeEhUU1RCQyAgICAgICAgICAgICAgICAgCQkJMHgzMAorI2RlZmluZSBiVHhIVEFkdmFuY2VDb2RpbmcgICAgICAgIAkJMHg0MAorI2RlZmluZSBiVHhIVFNob3J0R0kgICAgICAgICAgICAgIAkJMHg4MAorI2RlZmluZSBiVHhIVE51bWJlckhUX0xURiAgICAgICAgIAkJMHgzMDAKKyNkZWZpbmUgYlR4SFRDUkM4ICAgICAgICAgICAgICAgICAJCQkweDNmYzAwCisjZGVmaW5lIGJDb3VudGVyUmVzZXQgICAgICAgICAgICAgCQkweDEwMDAwCisjZGVmaW5lIGJOdW1PZk9GRE1UeCAgICAgICAgICAgICAgCQkweGZmZmYKKyNkZWZpbmUgYk51bU9mQ0NLVHggICAgICAgICAgICAgICAJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgYlR4SWRsZUludGVydmFsICAgICAgICAgICAJCQkweGZmZmYKKyNkZWZpbmUgYk9GRE1TZXJ2aWNlICAgICAgICAgICAgICAJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgYlR4TUFDSGVhZGVyICAgICAgICAgICAgICAJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgYlR4RGF0YUluaXQgICAgICAgICAgICAgICAJCQkweGZmCisjZGVmaW5lIGJUeEhUTW9kZSAgICAgICAgICAgICAgICAgCQkweDEwMAorI2RlZmluZSBiVHhEYXRhVHlwZSAgICAgICAgICAgICAgIAkJMHgzMDAwMAorI2RlZmluZSBiVHhSYW5kb21TZWVkICAgICAgICAgICAgIAkJMHhmZmZmZmZmZgorI2RlZmluZSBiQ0NLVHhQcmVhbWJsZSAgICAgICAgICAgCQkweDEKKyNkZWZpbmUgYkNDS1R4U0ZEICAgICAgICAgICAgICAgICAJCQkweGZmZmYwMDAwCisjZGVmaW5lIGJDQ0tUeFNJRyAgICAgICAgICAgICAgICAgCQkJMHhmZgorI2RlZmluZSBiQ0NLVHhTZXJ2aWNlICAgICAgICAgICAgIAkJMHhmZjAwCisjZGVmaW5lIGJDQ0tMZW5ndGhFeHQgICAgICAgICAgICAgCQkweDgwMDAKKyNkZWZpbmUgYkNDS1R4TGVuZ3RoICAgICAgICAgICAgICAJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgYkNDS1R4Q1JDMTYgICAgICAgICAgICAgICAJCTB4ZmZmZgorI2RlZmluZSBiQ0NLVHhTdGF0dXMgICAgICAgICAgICAgIAkJMHgxCisjZGVmaW5lIGJPRkRNVHhTdGF0dXMgICAgICAgICAgICAgCQkweDIKKworLy9wYWdlLTgKKyNkZWZpbmUgYlJGTU9EICAgICAgICAgICAgICAgICAgICAJCQkweDEKKyNkZWZpbmUgYkphcGFuTW9kZSAgICAgICAgICAgICAgICAJCTB4MgorI2RlZmluZSBiQ0NLVHhTQyAgICAgICAgICAgICAgICAgIAkJCTB4MzAKKyNkZWZpbmUgYkNDS0VuICAgICAgICAgICAgICAgICAgICAJCQkweDEwMDAwMDAKKyNkZWZpbmUgYk9GRE1FbiAgICAgICAgICAgICAgICAgICAJCQkweDIwMDAwMDAKKyNkZWZpbmUgYk9GRE1SeEFEQ1BoYXNlICAgICAgICAgICAJCTB4MTAwMDAKKyNkZWZpbmUgYk9GRE1UeERBQ1BoYXNlICAgICAgICAgICAJCTB4NDAwMDAKKyNkZWZpbmUgYlhBVHhBR0MgICAgICAgICAgICAgICAgICAJCQkweDNmCisjZGVmaW5lIGJYQlR4QUdDICAgICAgICAgICAgICAgICAgCQkJMHhmMDAKKyNkZWZpbmUgYlhDVHhBR0MgICAgICAgICAgICAgICAgICAJCQkweGYwMDAKKyNkZWZpbmUgYlhEVHhBR0MgICAgICAgICAgICAgICAgICAJCQkweGYwMDAwCisjZGVmaW5lIGJQQVN0YXJ0ICAgICAgICAgICAgICAgICAgCQkJMHhmMDAwMDAwMAorI2RlZmluZSBiVFJTdGFydCAgICAgICAgICAgICAgICAgIAkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgYlJGU3RhcnQgICAgICAgICAgICAgICAgICAJCQkweDAwMDBmMDAwCisjZGVmaW5lIGJCQlN0YXJ0ICAgICAgICAgICAgICAgICAgCQkJMHgwMDAwMDBmMAorI2RlZmluZSBiQkJDQ0tTdGFydCAgICAgICAgICAgICAgIAkJMHgwMDAwMDAwZgorI2RlZmluZSBiUEFFbmQgICAgICAgICAgICAgICAgICAgIAkJCTB4ZiAgICAgICAgICAvL1JlZzB4ODE0CisjZGVmaW5lIGJUUkVuZCAgICAgICAgICAgICAgICAgICAgCQkJMHgwZjAwMDAwMAorI2RlZmluZSBiUkZFbmQgICAgICAgICAgICAgICAgICAgIAkJCTB4MDAwZjAwMDAKKyNkZWZpbmUgYkNDQU1hc2sgICAgICAgICAgICAgICAgICAJCQkweDAwMDAwMGYwICAgLy9UMlIKKyNkZWZpbmUgYlIyUkNDQU1hc2sgICAgICAgICAgICAgICAJCTB4MDAwMDBmMDAKKyNkZWZpbmUgYkhTU0lfUjJURGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwMDAKKyNkZWZpbmUgYkhTU0lfVDJSRGVsYXkgICAgICAgICAgICAJCTB4ZjgwMDAwCisjZGVmaW5lIGJDb250VHhIU1NJICAgICAgICAgICAgICAgCQkweDQwMCAgICAgLy9jaGFuZSBnYWluIGF0IGNvbnRpbnVlIFR4CisjZGVmaW5lIGJJR0Zyb21DQ0sgICAgICAgICAgICAgICAgCQkweDIwMAorI2RlZmluZSBiQUdDQWRkcmVzcyAgICAgICAgICAgICAgIAkJMHgzZgorI2RlZmluZSBiUnhIUFR4ICAgICAgICAgICAgICAgICAgIAkJCTB4NzAwMAorI2RlZmluZSBiUnhIUFQyUiAgICAgICAgICAgICAgICAgIAkJCTB4MzgwMDAKKyNkZWZpbmUgYlJ4SFBDQ0tJbmkgICAgICAgICAgICAgICAJCTB4YzAwMDAKKyNkZWZpbmUgYkFHQ1R4Q29kZSAgICAgICAgICAgICAgICAJCTB4YzAwMDAwCisjZGVmaW5lIGJBR0NSeENvZGUgICAgICAgICAgICAgICAgCQkweDMwMDAwMAorI2RlZmluZSBiM1dpcmVEYXRhTGVuZ3RoICAgICAgICAgIAkJMHg4MDAKKyNkZWZpbmUgYjNXaXJlQWRkcmVzc0xlbmd0aCAgICAgICAJCTB4NDAwCisjZGVmaW5lIGIzV2lyZVJGUG93ZXJEb3duICAgICAgICAgCQkweDEKKy8vI2RlZmluZSBiSFdTSVNlbGVjdCAgICAgICAgICAgICAgIAkJMHg4CisjZGVmaW5lIGI1R1BBUEVQb2xhcml0eSAgICAgICAgICAgCQkweDQwMDAwMDAwCisjZGVmaW5lIGIyR1BBUEVQb2xhcml0eSAgICAgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJSRlNXX1R4RGVmYXVsdEFudCAgICAgICAgCQkweDMKKyNkZWZpbmUgYlJGU1dfVHhPcHRpb25BbnQgICAgICAgICAJCTB4MzAKKyNkZWZpbmUgYlJGU1dfUnhEZWZhdWx0QW50ICAgICAgICAJCTB4MzAwCisjZGVmaW5lIGJSRlNXX1J4T3B0aW9uQW50ICAgICAgICAgCQkweDMwMDAKKyNkZWZpbmUgYlJGU0lfM1dpcmVEYXRhICAgICAgICAgICAJCTB4MQorI2RlZmluZSBiUkZTSV8zV2lyZUNsb2NrICAgICAgICAgIAkJMHgyCisjZGVmaW5lIGJSRlNJXzNXaXJlTG9hZCAgICAgICAgICAgCQkweDQKKyNkZWZpbmUgYlJGU0lfM1dpcmVSVyAgICAgICAgICAgICAJCTB4OAorI2RlZmluZSBiUkZTSV8zV2lyZSAgICAgICAgICAgICAgIAkJCTB4ZiAgLy8zLXdpcmUgdG90YWwgY29udHJvbAorI2RlZmluZSBiUkZTSV9SRkVOViAgICAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiUkZTSV9UUlNXICAgICAgICAgICAgICAgIAkJMHgyMAorI2RlZmluZSBiUkZTSV9UUlNXQiAgICAgICAgICAgICAgIAkJMHg0MAorI2RlZmluZSBiUkZTSV9BTlRTVyAgICAgICAgICAgICAgIAkJMHgxMDAKKyNkZWZpbmUgYlJGU0lfQU5UU1dCICAgICAgICAgICAgICAJCTB4MjAwCisjZGVmaW5lIGJSRlNJX1BBUEUgICAgICAgICAgICAgICAgCQkJMHg0MDAKKyNkZWZpbmUgYlJGU0lfUEFQRTVHICAgICAgICAgICAgICAJCTB4ODAwCisjZGVmaW5lIGJCYW5kU2VsZWN0ICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJIVFNJRzJfR0kgICAgICAgICAgICAgICAgCQkJMHg4MAorI2RlZmluZSBiSFRTSUcyX1Ntb290aGluZyAgICAgICAgIAkJMHgwMQorI2RlZmluZSBiSFRTSUcyX1NvdW5kaW5nICAgICAgICAgIAkJMHgwMgorI2RlZmluZSBiSFRTSUcyX0FnZ3JlYXRvbiAgICAgICAgIAkJMHgwOAorI2RlZmluZSBiSFRTSUcyX1NUQkMgICAgICAgICAgICAgIAkJMHgzMAorI2RlZmluZSBiSFRTSUcyX0FkdkNvZGluZyAgICAgICAgIAkJMHg0MAorI2RlZmluZSBiSFRTSUcyX051bU9mSFRMVEYgICAgICAgIAkweDMwMAorI2RlZmluZSBiSFRTSUcyX0NSQzggICAgICAgICAgICAgIAkJMHgzZmMKKyNkZWZpbmUgYkhUU0lHMV9NQ1MgICAgICAgICAgICAgICAJCTB4N2YKKyNkZWZpbmUgYkhUU0lHMV9CYW5kV2lkdGggICAgICAgICAJCTB4ODAKKyNkZWZpbmUgYkhUU0lHMV9IVExlbmd0aCAgICAgICAgICAJCTB4ZmZmZgorI2RlZmluZSBiTFNJR19SYXRlICAgICAgICAgICAgICAgIAkJCTB4ZgorI2RlZmluZSBiTFNJR19SZXNlcnZlZCAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiTFNJR19MZW5ndGggICAgICAgICAgICAgIAkJMHgxZmZmZQorI2RlZmluZSBiTFNJR19QYXJpdHkgICAgICAgICAgICAgIAkJCTB4MjAKKyNkZWZpbmUgYkNDS1J4UGhhc2UgICAgICAgICAgICAgICAJCTB4NAorI2RlZmluZSBiTFNTSVJlYWRBZGRyZXNzICAgICAgICAgIAkJMHgzZjAwMDAwMCAgIC8vTFNTSSAiUmVhZCIgQWRkcmVzcworI2RlZmluZSBiTFNTSVJlYWRFZGdlICAgICAgICAgICAgIAkJMHg4MDAwMDAwMCAgIC8vTFNTSSAiUmVhZCIgZWRnZSBzaWduYWwKKyNkZWZpbmUgYkxTU0lSZWFkQmFja0RhdGEgICAgICAgICAJCTB4ZmZmCisjZGVmaW5lIGJMU1NJUmVhZE9LRmxhZyAgICAgICAgICAgCQkweDEwMDAKKyNkZWZpbmUgYkNDS1NhbXBsZVJhdGUgICAgICAgICAgICAJCTB4OCAgICAgICAvLzA6IDQ0TUh6LCAxOjg4TUh6CisKKyNkZWZpbmUgYlJlZ3VsYXRvcjBTdGFuZGJ5ICAgICAgICAJCTB4MQorI2RlZmluZSBiUmVndWxhdG9yUExMU3RhbmRieSAgICAgIAkJMHgyCisjZGVmaW5lIGJSZWd1bGF0b3IxU3RhbmRieSAgICAgICAgCQkweDQKKyNkZWZpbmUgYlBMTFBvd2VyVXAgICAgICAgICAgICAgICAJCTB4OAorI2RlZmluZSBiRFBMTFBvd2VyVXAgICAgICAgICAgICAgIAkJMHgxMAorI2RlZmluZSBiREExMFBvd2VyVXAgICAgICAgICAgICAgIAkJMHgyMAorI2RlZmluZSBiQUQ3UG93ZXJVcCAgICAgICAgICAgICAgIAkJMHgyMDAKKyNkZWZpbmUgYkRBNlBvd2VyVXAgICAgICAgICAgICAgICAJCTB4MjAwMAorI2RlZmluZSBiWHRhbFBvd2VyVXAgICAgICAgICAgICAgIAkJMHg0MDAwCisjZGVmaW5lIGI0ME1EQ2xrUG93ZXJVUCAgICAgICAgICAgCQkweDgwMDAKKyNkZWZpbmUgYkRBNkRlYnVnTW9kZSAgICAgICAgICAgICAJCTB4MjAwMDAKKyNkZWZpbmUgYkRBNlN3aW5nICAgICAgICAgICAgICAgICAJCQkweDM4MDAwMAorI2RlZmluZSBiQURDbGtQaGFzZSAgICAgICAgICAgICAgIAkJMHg0MDAwMDAwCisjZGVmaW5lIGI4ME1DbGtEZWxheSAgICAgICAgICAgICAgCQkweDE4MDAwMDAwCisjZGVmaW5lIGJBRkVXYXRjaERvZ0VuYWJsZSAgICAgICAgCQkweDIwMDAwMDAwCisjZGVmaW5lIGJYdGFsQ2FwICAgICAgICAgICAgICAgIAkJCTB4MGYwMDAwMDAKKyNkZWZpbmUgYkludERpZkNsa0VuYWJsZSAgICAgICAgICAJCTB4NDAwCisjZGVmaW5lIGJFeHRTaWdDbGtFbmFibGUgICAgICAgICAJCTB4ODAwCisjZGVmaW5lIGJCYW5kZ2FwTWJpYXNQb3dlclVwICAgICAgCTB4MTAwMDAKKyNkZWZpbmUgYkFEMTFTSEdhaW4gICAgICAgICAgICAgICAJCTB4YzAwMDAKKyNkZWZpbmUgYkFEMTFJbnB1dFJhbmdlICAgICAgICAgICAJCTB4NzAwMDAwCisjZGVmaW5lIGJBRDExT1BDdXJyZW50ICAgICAgICAgICAgCQkweDM4MDAwMDAKKyNkZWZpbmUgYklQYXRoTG9vcGJhY2sgICAgICAgICAgICAJCTB4NDAwMDAwMAorI2RlZmluZSBiUVBhdGhMb29wYmFjayAgICAgICAgICAgIAkJMHg4MDAwMDAwCisjZGVmaW5lIGJBRkVMb29wYmFjayAgICAgICAgICAgICAgCQkweDEwMDAwMDAwCisjZGVmaW5lIGJEQTEwU3dpbmcgICAgICAgICAgICAgICAgCQkweDdlMAorI2RlZmluZSBiREExMFJldmVyc2UgICAgICAgICAgICAgIAkJMHg4MDAKKyNkZWZpbmUgYkRBQ2xrU291cmNlICAgICAgICAgICAgICAJCTB4MTAwMAorI2RlZmluZSBiQUQ3SW5wdXRSYW5nZSAgICAgICAgICAgIAkJMHg2MDAwCisjZGVmaW5lIGJBRDdHYWluICAgICAgICAgICAgICAgICAgCQkJMHgzODAwMAorI2RlZmluZSBiQUQ3T3V0cHV0Q01Nb2RlICAgICAgICAgIAkJMHg0MDAwMAorI2RlZmluZSBiQUQ3SW5wdXRDTU1vZGUgICAgICAgICAgIAkJMHgzODAwMDAKKyNkZWZpbmUgYkFEN0N1cnJlbnQgICAgICAgICAgICAgICAJCQkweGMwMDAwMAorI2RlZmluZSBiUmVndWxhdG9yQWRqdXN0ICAgICAgICAgIAkJMHg3MDAwMDAwCisjZGVmaW5lIGJBRDExUG93ZXJVcEF0VHggICAgICAgICAgCQkweDEKKyNkZWZpbmUgYkRBMTBQU0F0VHggICAgICAgICAgICAgICAJCTB4MTAKKyNkZWZpbmUgYkFEMTFQb3dlclVwQXRSeCAgICAgICAgICAJCTB4MTAwCisjZGVmaW5lIGJEQTEwUFNBdFJ4ICAgICAgICAgICAgICAgCQkweDEwMDAKKworI2RlZmluZSBiQ0NLUnhBR0NGb3JtYXQgICAgICAgICAgIAkJMHgyMDAKKworI2RlZmluZSBiUFNERkZUU2FtcGxlcFBvaW50ICAgICAgIAkJMHhjMDAwCisjZGVmaW5lIGJQU0RBdmVyYWdlTnVtICAgICAgICAgICAgCQkweDMwMDAKKyNkZWZpbmUgYklRUGF0aENvbnRyb2wgICAgICAgICAgICAJCTB4YzAwCisjZGVmaW5lIGJQU0RGcmVxICAgICAgICAgICAgICAgICAgCQkJMHgzZmYKKyNkZWZpbmUgYlBTREFudGVubmFQYXRoICAgICAgICAgICAJCTB4MzAKKyNkZWZpbmUgYlBTRElRU3dpdGNoICAgICAgICAgICAgICAJCTB4NDAKKyNkZWZpbmUgYlBTRFJ4VHJpZ2dlciAgICAgICAgICAgICAJCTB4NDAwMDAwCisjZGVmaW5lIGJQU0RUeFRyaWdnZXIgICAgICAgICAgICAgCQkweDgwMDAwMDAwCisjZGVmaW5lIGJQU0RTaW5lVG9uZVNjYWxlICAgICAgICAJCTB4N2YwMDAwMDAKKyNkZWZpbmUgYlBTRFJlcG9ydCAgICAgICAgICAgICAgICAJCQkweGZmZmYKKworLy9wYWdlLTkKKyNkZWZpbmUgYk9GRE1UeFNDICAgICAgICAgICAgICAgICAJCTB4MzAwMDAwMDAKKyNkZWZpbmUgYkNDS1R4T24gICAgICAgICAgICAgICAgICAJCQkweDEKKyNkZWZpbmUgYk9GRE1UeE9uICAgICAgICAgICAgICAgICAJCTB4MgorI2RlZmluZSBiRGVidWdQYWdlICAgICAgICAgICAgICAgIAkJMHhmZmYgIC8vcmVzZXQgZGVidWcgcGFnZSBhbmQgYWxzbyBIV29yZCwgTFdvcmQKKyNkZWZpbmUgYkRlYnVnSXRlbSAgICAgICAgICAgICAgICAJCTB4ZmYgICAvL3Jlc2V0IGRlYnVnIHBhZ2UgYW5kIExXb3JkCisjZGVmaW5lIGJBbnRMICAgICAgICAgICAgICAJCQkweDEwCisjZGVmaW5lIGJBbnROb25IVCAgICAgICAgICAgCQkJCTB4MTAwCisjZGVmaW5lIGJBbnRIVDEgICAgICAgICAgICAgICAJCQkweDEwMDAKKyNkZWZpbmUgYkFudEhUMiAgICAgICAgICAgICAgICAgICAJCQkweDEwMDAwCisjZGVmaW5lIGJBbnRIVDFTMSAgICAgICAgICAgICAgICAgCQkJMHgxMDAwMDAKKyNkZWZpbmUgYkFudE5vbkhUUzEgICAgICAgICAgICAgICAJCTB4MTAwMDAwMAorCisvL3BhZ2UtYQorI2RlZmluZSBiQ0NLQkJNb2RlICAgICAgICAgICAgICAgIAkJMHgzCisjZGVmaW5lIGJDQ0tUeFBvd2VyU2F2aW5nICAgICAgICAgCQkweDgwCisjZGVmaW5lIGJDQ0tSeFBvd2VyU2F2aW5nICAgICAgICAgCQkweDQwCisjZGVmaW5lIGJDQ0tTaWRlQmFuZCAgICAgICAgICAgICAgCQkweDEwCisjZGVmaW5lIGJDQ0tTY3JhbWJsZSAgICAgICAgICAgICAgCQkweDgKKyNkZWZpbmUgYkNDS0FudERpdmVyc2l0eSAgICAJCQkweDgwMDAKKyNkZWZpbmUgYkNDS0NhcnJpZXJSZWNvdmVyeSAgIAkJMHg0MDAwCisjZGVmaW5lIGJDQ0tUeFJhdGUgICAgICAgICAgIAkJCTB4MzAwMAorI2RlZmluZSBiQ0NLRENDYW5jZWwgICAgICAgICAgICAgCQkweDA4MDAKKyNkZWZpbmUgYkNDS0lTSUNhbmNlbCAgICAgICAgICAgICAJCTB4MDQwMAorI2RlZmluZSBiQ0NLTWF0Y2hGaWx0ZXIgICAgICAgICAgIAkJMHgwMjAwCisjZGVmaW5lIGJDQ0tFcXVhbGl6ZXIgICAgICAgICAgICAgCQkweDAxMDAKKyNkZWZpbmUgYkNDS1ByZWFtYmxlRGV0ZWN0ICAgICAgIAkJMHg4MDAwMDAKKyNkZWZpbmUgYkNDS0Zhc3RGYWxzZUNDQSAgICAgICAgICAJCTB4NDAwMDAwCisjZGVmaW5lIGJDQ0tDaEVzdFN0YXJ0ICAgICAgICAgICAgCQkweDMwMDAwMAorI2RlZmluZSBiQ0NLQ0NBQ291bnQgICAgICAgICAgICAgIAkJMHgwODAwMDAKKyNkZWZpbmUgYkNDS2NzX2xpbSAgICAgICAgICAgICAgICAJCQkweDA3MDAwMAorI2RlZmluZSBiQ0NLQmlzdE1vZGUgICAgICAgICAgICAgIAkJMHg4MDAwMDAwMAorI2RlZmluZSBiQ0NLQ0NBTWFzayAgICAgICAgICAgICAJCTB4NDAwMDAwMDAKKyNkZWZpbmUgYkNDS1R4REFDUGhhc2UgICAgICAgICAJCTB4NAorI2RlZmluZSBiQ0NLUnhBRENQaGFzZSAgICAgICAgIAkJMHgyMDAwMDAwMCAgIC8vcl9yeF9jbGsKKyNkZWZpbmUgYkNDS3JfY3BfbW9kZTAgICAgICAgICAJCTB4MDEwMAorI2RlZmluZSBiQ0NLVHhEQ09mZnNldCAgICAgICAgICAgCQkweGYwCisjZGVmaW5lIGJDQ0tSeERDT2Zmc2V0ICAgICAgICAgICAJCTB4ZgorI2RlZmluZSBiQ0NLQ0NBTW9kZSAgICAgICAgICAgICAgCQkweGMwMDAKKyNkZWZpbmUgYkNDS0ZhbHNlQ1NfbGltICAgICAgICAgICAJCTB4M2YwMAorI2RlZmluZSBiQ0NLQ1NfcmF0aW8gICAgICAgICAgICAgIAkJMHhjMDAwMDAKKyNkZWZpbmUgYkNDS0NvcmdCaXRfc2VsICAgICAgICAgICAJCTB4MzAwMDAwCisjZGVmaW5lIGJDQ0tQRF9saW0gICAgICAgICAgICAgICAgCQkJMHgwZjAwMDAKKyNkZWZpbmUgYkNDS05ld0NDQSAgICAgICAgICAgICAgICAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4SFBvZklHICAgICAgICAgICAgICAJCTB4ODAwMAorI2RlZmluZSBiQ0NLUnhJRyAgICAgICAgICAgICAgICAgIAkJCTB4N2YwMAorI2RlZmluZSBiQ0NLTE5BUG9sYXJpdHkgICAgICAgICAgIAkJMHg4MDAwMDAKKyNkZWZpbmUgYkNDS1J4MXN0R2FpbiAgICAgICAgICAgICAJCTB4N2YwMDAwCisjZGVmaW5lIGJDQ0tSRkV4dGVuZCAgICAgICAgICAgICAgCQkweDIwMDAwMDAwIC8vQ0NLIFJ4IElpbml0YWwgZ2FpbiBwb2xhcml0eQorI2RlZmluZSBiQ0NLUnhBR0NTYXRMZXZlbCAgICAgICAgCQkweDFmMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEFHQ1NhdENvdW50ICAgICAgIAkJMHhlMAorI2RlZmluZSBiQ0NLUnhSRlNldHRsZSAgICAgICAgICAgIAkJMHgxZiAgICAgICAvL0FHQ3NhbXBfZGx5CisjZGVmaW5lIGJDQ0tGaXhlZFJ4QUdDICAgICAgICAgICAJCTB4ODAwMAorLy8jZGVmaW5lIGJDQ0tSeEFHQ0Zvcm1hdCAgICAgICAgIAkJMHg0MDAwICAgLy9yZW1vdmUgdG8gSFNTSSByZWdpc3RlciAweDgyNAorI2RlZmluZSBiQ0NLQW50ZW5uYVBvbGFyaXR5ICAgICAgCQkweDIwMDAKKyNkZWZpbmUgYkNDS1R4RmlsdGVyVHlwZSAgICAgICAgICAJCTB4MGMwMAorI2RlZmluZSBiQ0NLUnhBR0NSZXBvcnRUeXBlICAgCQkweDAzMDAKKyNkZWZpbmUgYkNDS1J4REFHQ0VuICAgICAgICAgICAgICAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4REFHQ1BlcmlvZCAgICAgICAgCQkweDIwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeERBR0NTYXRMZXZlbCAgICAgCQkweDFmMDAwMDAwCisjZGVmaW5lIGJDQ0tUaW1pbmdSZWNvdmVyeSAgICAgICAJCTB4ODAwMDAwCisjZGVmaW5lIGJDQ0tUeEMwICAgICAgICAgICAgICAgICAgCQkJMHgzZjAwMDAKKyNkZWZpbmUgYkNDS1R4QzEgICAgICAgICAgICAgICAgICAJCQkweDNmMDAwMDAwCisjZGVmaW5lIGJDQ0tUeEMyICAgICAgICAgICAgICAgICAgCQkJMHgzZgorI2RlZmluZSBiQ0NLVHhDMyAgICAgICAgICAgICAgICAgIAkJCTB4M2YwMAorI2RlZmluZSBiQ0NLVHhDNCAgICAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwCisjZGVmaW5lIGJDQ0tUeEM1ICAgICAgICAgICAgICAgICAgCQkJMHgzZjAwMDAwMAorI2RlZmluZSBiQ0NLVHhDNiAgICAgICAgICAgICAgICAgIAkJCTB4M2YKKyNkZWZpbmUgYkNDS1R4QzcgICAgICAgICAgICAgICAgICAJCQkweDNmMDAKKyNkZWZpbmUgYkNDS0RlYnVnUG9ydCAgICAgICAgICAgICAJCTB4ZmYwMDAwCisjZGVmaW5lIGJDQ0tEQUNEZWJ1ZyAgICAgICAgICAgICAgCQkweDBmMDAwMDAwCisjZGVmaW5lIGJDQ0tGYWxzZUFsYXJtRW5hYmxlICAgICAgCQkweDgwMDAKKyNkZWZpbmUgYkNDS0ZhbHNlQWxhcm1SZWFkICAgICAgICAJCTB4NDAwMAorI2RlZmluZSBiQ0NLVFJTU0kgICAgICAgICAgICAgICAgIAkJCTB4N2YKKyNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0ICAgICAgICAgICAJCTB4ZmUKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X0FudFNlbCAgICAgICAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X01GT2ZmICAgICAgICAJCTB4NDAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UnhSZXBvcnRfU1FMb3NzICAgICAJMHgyMDAwMDAwMAorI2RlZmluZSBiQ0NLUnhSZXBvcnRfUGt0bG9zcyAgICAgIAkJMHgxMDAwMDAwMAorI2RlZmluZSBiQ0NLUnhSZXBvcnRfTG9ja2VkYml0ICAgIAkweDA4MDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9SYXRlRXJyb3IgICAgCTB4MDQwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X1J4UmF0ZSAgICAgICAJCTB4MDMwMDAwMDAKKyNkZWZpbmUgYkNDS1J4RkFDb3VudGVyTG93ZXIgICAgICAJMHhmZgorI2RlZmluZSBiQ0NLUnhGQUNvdW50ZXJVcHBlciAgICAgIAkweGZmMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEhQQUdDU3RhcnQgICAgICAgICAgCQkweGUwMDAKKyNkZWZpbmUgYkNDS1J4SFBBR0NGaW5hbCAgICAgICAgICAJCTB4MWMwMAorCisjZGVmaW5lIGJDQ0tSeEZhbHNlQWxhcm1FbmFibGUgICAgCTB4ODAwMAorI2RlZmluZSBiQ0NLRkFDb3VudGVyRnJlZXplICAgICAgIAkJMHg0MDAwCisKKyNkZWZpbmUgYkNDS1R4UGF0aFNlbCAgICAgICAgICAgICAJCTB4MTAwMDAwMDAKKyNkZWZpbmUgYkNDS0RlZmF1bHRSeFBhdGggICAgICAgICAJCTB4YzAwMDAwMAorI2RlZmluZSBiQ0NLT3B0aW9uUnhQYXRoICAgICAgICAgIAkJMHgzMDAwMDAwCisKKy8vcGFnZSBjCisjZGVmaW5lIGJOdW1PZlNURiAgICAgICAgICAgICAgICAJCQkweDMKKyNkZWZpbmUgYlNoaWZ0X0wgICAgICAgICAgICAgICAgIAkJCTB4YzAKKyNkZWZpbmUgYkdJX1RIICAgICAgICAgICAgICAgICAgIAkJCTB4YworI2RlZmluZSBiUnhQYXRoQSAgICAgICAgICAgICAgICAgCQkJMHgxCisjZGVmaW5lIGJSeFBhdGhCICAgICAgICAgICAgICAgICAJCQkweDIKKyNkZWZpbmUgYlJ4UGF0aEMgICAgICAgICAgICAgICAgIAkJCTB4NAorI2RlZmluZSBiUnhQYXRoRCAgICAgICAgICAgICAgICAgCQkJMHg4CisjZGVmaW5lIGJUeFBhdGhBICAgICAgICAgICAgICAgICAJCQkweDEKKyNkZWZpbmUgYlR4UGF0aEIgICAgICAgICAgICAgICAgIAkJCTB4MgorI2RlZmluZSBiVHhQYXRoQyAgICAgICAgICAgICAgICAgCQkJMHg0CisjZGVmaW5lIGJUeFBhdGhEICAgICAgICAgICAgICAgICAJCQkweDgKKyNkZWZpbmUgYlRSU1NJRnJlcSAgICAgICAgICAgICAgIAkJCTB4MjAwCisjZGVmaW5lIGJBRENCYWNrb2ZmICAgICAgICAgICAgICAJCQkweDMwMDAKKyNkZWZpbmUgYkRGSVJCYWNrb2ZmICAgICAgICAgICAgIAkJCTB4YzAwMAorI2RlZmluZSBiVFJTU0lMYXRjaFBoYXNlICAgICAgICAgCQkweDEwMDAwCisjZGVmaW5lIGJSeElEQ09mZnNldCAgICAgICAgICAgICAJCQkweGZmCisjZGVmaW5lIGJSeFFEQ09mZnNldCAgICAgICAgICAgICAJCQkweGZmMDAKKyNkZWZpbmUgYlJ4REZJUk1vZGUgICAgICAgICAgICAgIAkJMHgxODAwMDAwCisjZGVmaW5lIGJSeERDTkZUeXBlICAgICAgICAgICAgICAJCTB4ZTAwMDAwMAorI2RlZmluZSBiUlhJUUltYl9BICAgICAgICAgICAgICAgCQkJMHgzZmYKKyNkZWZpbmUgYlJYSVFJbWJfQiAgICAgICAgICAgICAgIAkJCTB4ZmMwMAorI2RlZmluZSBiUlhJUUltYl9DICAgICAgICAgICAgICAgCQkJMHgzZjAwMDAKKyNkZWZpbmUgYlJYSVFJbWJfRCAgICAgICAgICAgICAgIAkJCTB4ZmZjMDAwMDAKKyNkZWZpbmUgYkRDX2RjX05vdGNoICAgICAgICAgICAgIAkJMHg2MDAwMAorI2RlZmluZSBiUnhOQklOb3RjaCAgICAgICAgICAgICAgCQkJMHgxZjAwMDAwMAorI2RlZmluZSBiUERfVEggICAgICAgICAgICAgICAgICAgCQkJMHhmCisjZGVmaW5lIGJQRF9USF9PcHQyICAgICAgICAgICAgICAJCTB4YzAwMAorI2RlZmluZSBiUFdFRF9USCAgICAgICAgICAgICAgICAgCQkJMHg3MDAKKyNkZWZpbmUgYklmTUZfV2luX0wgICAgICAgICAgICAgIAkJCTB4ODAwCisjZGVmaW5lIGJQRF9PcHRpb24gICAgICAgICAgICAgICAJCQkweDEwMDAKKyNkZWZpbmUgYk1GX1dpbl9MICAgICAgICAgICAgICAgIAkJCTB4ZTAwMAorI2RlZmluZSBiQldfU2VhcmNoX0wgICAgICAgICAgICAgCQkweDMwMDAwCisjZGVmaW5lIGJ3aW5fZW5oX0wgICAgICAgICAgICAgICAJCQkweGMwMDAwCisjZGVmaW5lIGJCV19USCAgICAgICAgICAgICAgICAgICAJCQkweDcwMDAwMAorI2RlZmluZSBiRURfVEgyICAgICAgICAgICAgICAgICAgCQkJMHgzODAwMDAwCisjZGVmaW5lIGJCV19vcHRpb24gICAgICAgICAgICAgICAJCQkweDQwMDAwMDAKKyNkZWZpbmUgYlJhdGlvX1RIICAgICAgICAgICAgICAgIAkJCTB4MTgwMDAwMDAKKyNkZWZpbmUgYldpbmRvd19MICAgICAgICAgICAgICAgIAkJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgYlNCRF9PcHRpb24gICAgICAgICAgICAgIAkJCTB4MQorI2RlZmluZSBiRnJhbWVfVEggICAgICAgICAgICAgICAgCQkJMHgxYworI2RlZmluZSBiRlNfT3B0aW9uICAgICAgICAgICAgICAgCQkJMHg2MAorI2RlZmluZSBiRENfU2xvcGVfY2hlY2sgICAgICAgICAgCQkweDgwCisjZGVmaW5lIGJGR3VhcmRfQ291bnRlcl9EQ19MICAgICAJCTB4ZTAwCisjZGVmaW5lIGJGcmFtZV9XZWlnaHRfU2hvcnQgICAgICAJCTB4NzAwMAorI2RlZmluZSBiU3ViX1R1bmUgICAgICAgICAgICAgICAgCQkJMHhlMDAwMDAKKyNkZWZpbmUgYkZyYW1lX0RDX0xlbmd0aCAgICAgICAgIAkJMHhlMDAwMDAwCisjZGVmaW5lIGJTQkRfc3RhcnRfb2Zmc2V0ICAgICAgICAJCTB4MzAwMDAwMDAKKyNkZWZpbmUgYkZyYW1lX1RIXzIgICAgICAgICAgICAgIAkJMHg3CisjZGVmaW5lIGJGcmFtZV9HSTJfVEggICAgICAgICAgICAJCTB4MzgKKyNkZWZpbmUgYkdJMl9TeW5jX2VuICAgICAgICAgICAgIAkJMHg0MAorI2RlZmluZSBiU2FyY2hfU2hvcnRfRWFybHkgICAgICAgCQkweDMwMAorI2RlZmluZSBiU2FyY2hfU2hvcnRfTGF0ZSAgICAgICAgCQkweGMwMAorI2RlZmluZSBiU2FyY2hfR0kyX0xhdGUgICAgICAgICAgCQkweDcwMDAwCisjZGVmaW5lIGJDRk9BbnRTdW0gICAgICAgICAgICAgICAJCTB4MQorI2RlZmluZSBiQ0ZPQWNjICAgICAgICAgICAgICAgICAgCQkJMHgyCisjZGVmaW5lIGJDRk9TdGFydE9mZnNldCAgICAgICAgICAJCTB4YworI2RlZmluZSBiQ0ZPTG9va0JhY2sgICAgICAgICAgICAgCQkweDcwCisjZGVmaW5lIGJDRk9TdW1XZWlnaHQgICAgICAgICAgICAJCTB4ODAKKyNkZWZpbmUgYkRBR0NFbmFibGUgICAgICAgICAgICAgIAkJCTB4MTAwMDAKKyNkZWZpbmUgYlRYSVFJbWJfQSAgICAgICAgICAgICAgIAkJCTB4M2ZmCisjZGVmaW5lIGJUWElRSW1iX0IgICAgICAgICAgICAgICAJCQkweGZjMDAKKyNkZWZpbmUgYlRYSVFJbWJfQyAgICAgICAgICAgICAgIAkJCTB4M2YwMDAwCisjZGVmaW5lIGJUWElRSW1iX0QgICAgICAgICAgICAgICAJCQkweGZmYzAwMDAwCisjZGVmaW5lIGJUeElEQ09mZnNldCAgICAgICAgICAgICAJCQkweGZmCisjZGVmaW5lIGJUeFFEQ09mZnNldCAgICAgICAgICAgICAJCQkweGZmMDAKKyNkZWZpbmUgYlR4REZJUk1vZGUgICAgICAgICAgICAgIAkJMHgxMDAwMAorI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZU9uICAgICAgICAgCQkweDQwMDAwMDAKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfQSAgICAgICAgIAkJMHhmZgorI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9CICAgICAgICAgCQkweGZmMDAKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfQyAgICAgICAgIAkJMHhmZjAwMDAKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfRCAgICAgICAgIAkJMHhmZjAwMDAwMAorI2RlZmluZSBiQ0NBRHJvcE9wdGlvbiAgICAgICAgICAgCQkweDIwMDAwCisjZGVmaW5lIGJDQ0FEcm9wVGhyZXMgICAgICAgICAgICAJCTB4ZmZmMDAwMDAKKyNkZWZpbmUgYkVEQ0NBX0ggICAgICAgICAgICAgICAgIAkJCTB4ZgorI2RlZmluZSBiRURDQ0FfTCAgICAgICAgICAgICAgICAgCQkJMHhmMAorI2RlZmluZSBiTGFtYmRhX0VEICAgICAgICAgICAgICAgMHgzMDAKKyNkZWZpbmUgYlJ4SW5pdGlhbEdhaW4gICAgICAgICAgIDB4N2YKKyNkZWZpbmUgYlJ4QW50RGl2RW4gICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgYlJ4QUdDQWRkcmVzc0ZvckxOQSAgICAgIDB4N2YwMAorI2RlZmluZSBiUnhIaWdoUG93ZXJGbG93ICAgICAgICAgMHg4MDAwCisjZGVmaW5lIGJSeEFHQ0ZyZWV6ZVRocmVzICAgICAgICAweGMwMDAwCisjZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMSAgICAgICAweDMwMDAwMAorI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzIgICAgICAgMHhjMDAwMDAKKyNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MzICAgICAgIDB4MzAwMDAwMAorI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzAgICAgICAgMHhjMDAwMDAwCisjZGVmaW5lIGJSeFJzc2lfQ21wX0VuICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIGJSeFF1aWNrQUdDRW4gICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIGJSeEFHQ0ZyZWV6ZVRocmVzTW9kZSAgICAweDQwMDAwMDAwCisjZGVmaW5lIGJSeE92ZXJGbG93Q2hlY2tUeXBlICAgICAweDgwMDAwMDAwCisjZGVmaW5lIGJSeEFHQ1NoaWZ0ICAgICAgICAgICAgICAweDdmCisjZGVmaW5lIGJUUlNXX1RyaV9Pbmx5ICAgICAgICAgICAweDgwCisjZGVmaW5lIGJQb3dlclRocmVzICAgICAgICAgICAgICAweDMwMAorI2RlZmluZSBiUnhBR0NFbiAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJSeEFHQ1RvZ2V0aGVyRW4gICAgICAgICAweDIKKyNkZWZpbmUgYlJ4QUdDTWluICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBiUnhIUF9JbmkgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lIGJSeEhQX1RSTE5BICAgICAgICAgICAgICAweDcwCisjZGVmaW5lIGJSeEhQX1JTU0kgICAgICAgICAgICAgICAweDcwMAorI2RlZmluZSBiUnhIUF9CQlAxICAgICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIGJSeEhQX0JCUDIgICAgICAgICAgICAgICAweDcwMDAwCisjZGVmaW5lIGJSeEhQX0JCUDMgICAgICAgICAgICAgICAweDcwMDAwMAorI2RlZmluZSBiUlNTSV9IICAgICAgICAgICAgICAgICAgMHg3ZjAwMDAgICAgIC8vdGhlIHRocmVzaG9sZCBmb3IgaGlnaCBwb3dlcgorI2RlZmluZSBiUlNTSV9HZW4gICAgICAgICAgICAgICAgMHg3ZjAwMDAwMCAgIC8vdGhlIHRocmVzaG9sZCBmb3IgYW50IGRpdmVyc2l0eQorI2RlZmluZSBiUnhTZXR0bGVfVFJTVyAgICAgICAgICAgMHg3CisjZGVmaW5lIGJSeFNldHRsZV9MTkEgICAgICAgICAgICAweDM4CisjZGVmaW5lIGJSeFNldHRsZV9SU1NJICAgICAgICAgICAweDFjMAorI2RlZmluZSBiUnhTZXR0bGVfQkJQICAgICAgICAgICAgMHhlMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX1J4SFAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBiUnhTZXR0bGVfQW50U1dfUlNTSSAgICAgMHgzODAwMAorI2RlZmluZSBiUnhTZXR0bGVfQW50U1cgICAgICAgICAgMHhjMDAwMAorI2RlZmluZSBiUnhQcm9jZXNzVGltZV9EQUdDICAgICAgMHgzMDAwMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX0hTU0kgICAgICAgICAgIDB4NDAwMDAwCisjZGVmaW5lIGJSeFByb2Nlc3NUaW1lX0JCUFBXICAgICAweDgwMDAwMAorI2RlZmluZSBiUnhBbnRlbm5hUG93ZXJTaGlmdCAgICAgMHgzMDAwMDAwCisjZGVmaW5lIGJSU1NJVGFibGVTZWxlY3QgICAgICAgICAweGMwMDAwMDAKKyNkZWZpbmUgYlJ4SFBfRmluYWwgICAgICAgICAgICAgIDB4NzAwMDAwMAorI2RlZmluZSBiUnhIVFNldHRsZV9CQlAgICAgICAgICAgMHg3CisjZGVmaW5lIGJSeEhUU2V0dGxlX0hTU0kgICAgICAgICAweDgKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfUnhIUCAgICAgICAgIDB4NzAKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfQkJQUFcgICAgICAgIDB4ODAKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfSWRsZSAgICAgICAgIDB4MzAwCisjZGVmaW5lIGJSeEhUU2V0dGxlX1Jlc2VydmVkICAgICAweDFjMDAKKyNkZWZpbmUgYlJ4SFRSeEhQRW4gICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBiUnhIVEFHQ0ZyZWV6ZVRocmVzICAgICAgMHgzMDAwMAorI2RlZmluZSBiUnhIVEFHQ1RvZ2V0aGVyRW4gICAgICAgMHg0MDAwMAorI2RlZmluZSBiUnhIVEFHQ01pbiAgICAgICAgICAgICAgMHg4MDAwMAorI2RlZmluZSBiUnhIVEFHQ0VuICAgICAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgYlJ4SFREQUdDRW4gICAgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIGJSeEhUUnhIUF9CQlAgICAgICAgICAgICAweDFjMDAwMDAKKyNkZWZpbmUgYlJ4SFRSeEhQX0ZpbmFsICAgICAgICAgIDB4ZTAwMDAwMDAKKyNkZWZpbmUgYlJ4UFdSYXRpb1RIICAgICAgICAgICAgIDB4MworI2RlZmluZSBiUnhQV1JhdGlvRW4gICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJSeE1GSG9sZCAgICAgICAgICAgICAgICAweDM4MDAKKyNkZWZpbmUgYlJ4UERfRGVsYXlfVEgxICAgICAgICAgIDB4MzgKKyNkZWZpbmUgYlJ4UERfRGVsYXlfVEgyICAgICAgICAgIDB4MWMwCisjZGVmaW5lIGJSeFBEX0RDX0NPVU5UX01BWCAgICAgICAweDYwMAorLy8jZGVmaW5lIGJSeE1GX0hvbGQgICAgICAgICAgICAgICAweDM4MDAKKyNkZWZpbmUgYlJ4UERfRGVsYXlfVEggICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBiUnhQcm9jZXNzX0RlbGF5ICAgICAgICAgMHhmMDAwMAorI2RlZmluZSBiUnhTZWFyY2hyYW5nZV9HSTJfRWFybHkgMHg3MDAwMDAKKyNkZWZpbmUgYlJ4RnJhbWVfR3VhcmRfQ291bnRlcl9MIDB4MzgwMDAwMAorI2RlZmluZSBiUnhTR0lfR3VhcmRfTCAgICAgICAgICAgMHhjMDAwMDAwCisjZGVmaW5lIGJSeFNHSV9TZWFyY2hfTCAgICAgICAgICAweDMwMDAwMDAwCisjZGVmaW5lIGJSeFNHSV9USCAgICAgICAgICAgICAgICAweGMwMDAwMDAwCisjZGVmaW5lIGJERlNDbnQwICAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJERlNDbnQxICAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYkRGU0ZsYWcgICAgICAgICAgICAgICAgIDB4ZjAwMDAKKworI2RlZmluZSBiTUZXZWlnaHRTdW0gICAgICAgICAgICAgMHgzMDAwMDAKKyNkZWZpbmUgYk1pbklkeFRIICAgICAgICAgICAgICAgIDB4N2YwMDAwMDAKKworI2RlZmluZSBiREFGb3JtYXQgICAgICAgICAgICAgICAgMHg0MDAwMAorCisjZGVmaW5lIGJUeENoRW11RW5hYmxlICAgICAgICAgICAweDAxMDAwMDAwCisKKyNkZWZpbmUgYlRSU1dJc29sYXRpb25fQSAgICAgICAgIDB4N2YKKyNkZWZpbmUgYlRSU1dJc29sYXRpb25fQiAgICAgICAgIDB4N2YwMAorI2RlZmluZSBiVFJTV0lzb2xhdGlvbl9DICAgICAgICAgMHg3ZjAwMDAKKyNkZWZpbmUgYlRSU1dJc29sYXRpb25fRCAgICAgICAgIDB4N2YwMDAwMDAKKworI2RlZmluZSBiRXh0TE5BR2FpbiAgICAgICAgICAgICAgMHg3YzAwCisKKy8vcGFnZSBkCisjZGVmaW5lIGJTVEJDRW4gICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgYkFudGVubmFNYXBwaW5nICAgICAgICAgIDB4MTAKKyNkZWZpbmUgYk5zcyAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgYkNGT0FudFN1bUQgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIGJQSFlDb3VudGVyUmVzZXQgICAgICAgICAweDgwMDAwMDAKKyNkZWZpbmUgYkNGT1JlcG9ydEdldCAgICAgICAgICAgIDB4NDAwMDAwMAorI2RlZmluZSBiT0ZETUNvbnRpbnVlVHggICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBiT0ZETVNpbmdsZUNhcnJpZXIgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBiT0ZETVNpbmdsZVRvbmUgICAgICAgICAgMHg0MDAwMDAwMAorLy8jZGVmaW5lIGJSeFBhdGgxICAgICAgICAgICAgICAgICAweDAxCisvLyNkZWZpbmUgYlJ4UGF0aDIgICAgICAgICAgICAgICAgIDB4MDIKKy8vI2RlZmluZSBiUnhQYXRoMyAgICAgICAgICAgICAgICAgMHgwNAorLy8jZGVmaW5lIGJSeFBhdGg0ICAgICAgICAgICAgICAgICAweDA4CisvLyNkZWZpbmUgYlR4UGF0aDEgICAgICAgICAgICAgICAgIDB4MTAKKy8vI2RlZmluZSBiVHhQYXRoMiAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBiSFREZXRlY3QgICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgYkNGT0VuICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgYkNGT1ZhbHVlICAgICAgICAgICAgICAgIDB4ZmZmMDAwMDAKKyNkZWZpbmUgYlNpZ1RvbmVfUmUgICAgICAgICAgICAgIDB4M2YKKyNkZWZpbmUgYlNpZ1RvbmVfSW0gICAgICAgICAgICAgIDB4N2YwMAorI2RlZmluZSBiQ291bnRlcl9DQ0EgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIGJDb3VudGVyX1Bhcml0eUZhaWwgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJDb3VudGVyX1JhdGVJbGxlZ2FsICAgICAweGZmZmYKKyNkZWZpbmUgYkNvdW50ZXJfQ1JDOEZhaWwgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgYkNvdW50ZXJfTUNTTm9TdXBwb3J0ICAgIDB4ZmZmZgorI2RlZmluZSBiQ291bnRlcl9GYXN0U3luYyAgICAgICAgMHhmZmZmCisjZGVmaW5lIGJTaG9ydENGTyAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBiU2hvcnRDRk9UTGVuZ3RoICAgICAgICAgMTIgICAvL3RvdGFsCisjZGVmaW5lIGJTaG9ydENGT0ZMZW5ndGggICAgICAgICAxMSAgIC8vZnJhY3Rpb24KKyNkZWZpbmUgYkxvbmdDRk8gICAgICAgICAgICAgICAgIDB4N2ZmCisjZGVmaW5lIGJMb25nQ0ZPVExlbmd0aCAgICAgICAgICAxMQorI2RlZmluZSBiTG9uZ0NGT0ZMZW5ndGggICAgICAgICAgMTEKKyNkZWZpbmUgYlRhaWxDRk8gICAgICAgICAgICAgICAgIDB4MWZmZgorI2RlZmluZSBiVGFpbENGT1RMZW5ndGggICAgICAgICAgMTMKKyNkZWZpbmUgYlRhaWxDRk9GTGVuZ3RoICAgICAgICAgIDEyCisKKyNkZWZpbmUgYm1heF9lbl9wd2RCICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiQ0NfcG93ZXJfZEIgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBibm9pc2VfcHdkQiAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIGJQb3dlck1lYXNUTGVuZ3RoICAgICAgICAxMAorI2RlZmluZSBiUG93ZXJNZWFzRkxlbmd0aCAgICAgICAgMworI2RlZmluZSBiUnhfSFRfQlcgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJSeFNDICAgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgYlJ4X0hUICAgICAgICAgICAgICAgICAgIDB4OAorCisjZGVmaW5lIGJOQl9pbnRmX2RldF9vbiAgICAgICAgICAweDEKKyNkZWZpbmUgYkludGZfd2luX2xlbl9jZmcgICAgICAgIDB4MzAKKyNkZWZpbmUgYk5CX0ludGZfVEhfY2ZnICAgICAgICAgIDB4MWMwCisKKyNkZWZpbmUgYlJGR2FpbiAgICAgICAgICAgICAgICAgIDB4M2YKKyNkZWZpbmUgYlRhYmxlU2VsICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgYlRSU1cgICAgICAgICAgICAgICAgICAgIDB4ODAKKworI2RlZmluZSBiUnhTTlJfQSAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiUnhTTlJfQiAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJSeFNOUl9DICAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiUnhTTlJfRCAgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBiU05SRVZNVExlbmd0aCAgICAgICAgICAgOAorI2RlZmluZSBiU05SRVZNRkxlbmd0aCAgICAgICAgICAgMQorCisjZGVmaW5lIGJDU0kxc3QgICAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJDU0kybmQgICAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYlJ4RVZNMXN0ICAgICAgICAgICAgICAgIDB4ZmYwMDAwCisjZGVmaW5lIGJSeEVWTTJuZCAgICAgICAgICAgICAgICAweGZmMDAwMDAwCisKKyNkZWZpbmUgYlNJR0VWTSAgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYlBXREIgICAgICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiU0dJRU4gICAgICAgICAgICAgICAgICAgMHgxMDAwMAorCisjZGVmaW5lIGJTRmFjdG9yUUFNMSAgICAgICAgICAgICAweGYKKyNkZWZpbmUgYlNGYWN0b3JRQU0yICAgICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgYlNGYWN0b3JRQU0zICAgICAgICAgICAgIDB4ZjAwCisjZGVmaW5lIGJTRmFjdG9yUUFNNCAgICAgICAgICAgICAweGYwMDAKKyNkZWZpbmUgYlNGYWN0b3JRQU01ICAgICAgICAgICAgIDB4ZjAwMDAKKyNkZWZpbmUgYlNGYWN0b3JRQU02ICAgICAgICAgICAgIDB4ZjAwMDAKKyNkZWZpbmUgYlNGYWN0b3JRQU03ICAgICAgICAgICAgIDB4ZjAwMDAwCisjZGVmaW5lIGJTRmFjdG9yUUFNOCAgICAgICAgICAgICAweGYwMDAwMDAKKyNkZWZpbmUgYlNGYWN0b3JRQU05ICAgICAgICAgICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgYkNTSVNjaGVtZSAgICAgICAgICAgICAgIDB4MTAwMDAwCisKKyNkZWZpbmUgYk5vaXNlTHZsVG9wU2V0ICAgICAgICAgIDB4MworI2RlZmluZSBiQ2hTbW9vdGggICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJDaFNtb290aENmZzEgICAgICAgICAgICAweDM4CisjZGVmaW5lIGJDaFNtb290aENmZzIgICAgICAgICAgICAweDFjMAorI2RlZmluZSBiQ2hTbW9vdGhDZmczICAgICAgICAgICAgMHhlMDAKKyNkZWZpbmUgYkNoU21vb3RoQ2ZnNCAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBiTVJDTW9kZSAgICAgICAgICAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUgYlRIRVZNQ2ZnICAgICAgICAgICAgICAgIDB4NzAwMDAwMAorCisjZGVmaW5lIGJMb29wRml0VHlwZSAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYlVwZENGTyAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgYlVwZENGT09mZkRhdGEgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgYkFkdlVwZENGTyAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIGJBZHZUaW1lQ3RybCAgICAgICAgICAgICAweDgwMAorI2RlZmluZSBiVXBkQ2xrbyAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIGJGQyAgICAgICAgICAgICAgICAgICAgICAweDYwMDAKKyNkZWZpbmUgYlRyYWNraW5nTW9kZSAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBiUGhDbXBFbmFibGUgICAgICAgICAgICAgMHgxMDAwMAorI2RlZmluZSBiVXBkQ2xrb0xURiAgICAgICAgICAgICAgMHgyMDAwMAorI2RlZmluZSBiQ29tQ2hDRk8gICAgICAgICAgICAgICAgMHg0MDAwMAorI2RlZmluZSBiQ1NJRXN0aU1vZGUgICAgICAgICAgICAgMHg4MDAwMAorI2RlZmluZSBiQWR2VXBkRXF6ICAgICAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgYlVDaENmZyAgICAgICAgICAgICAgICAgIDB4NzAwMDAwMAorI2RlZmluZSBiVXBkRXF6ICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwCisKKy8vcGFnZSBlCisjZGVmaW5lIGJUeEFHQ1JhdGUxOF8wNgkJCTB4N2Y3ZjdmN2YKKyNkZWZpbmUgYlR4QUdDUmF0ZTU0XzI0CQkJMHg3ZjdmN2Y3ZgorI2RlZmluZSBiVHhBR0NSYXRlTUNTMzIJCTB4N2YKKyNkZWZpbmUgYlR4QUdDUmF0ZUNDSwkJCTB4N2YwMAorI2RlZmluZSBiVHhBR0NSYXRlTUNTM19NQ1MwCTB4N2Y3ZjdmN2YKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzdfTUNTNAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1MxMV9NQ1M4CTB4N2Y3ZjdmN2YKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzE1X01DUzEyCTB4N2Y3ZjdmN2YKKworCisvL1J4IFBzZWR1byBub2lzZQorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZU9uICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9BICAgICAgICAgMHhmZgorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9CICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJSeFBlc3Vkb05vaXNlX0MgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9EICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9BICAgICAgMHhmZmZmCisjZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0IgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0MgICAgICAweGZmZmYKKyNkZWZpbmUgYlBlc3Vkb05vaXNlU3RhdGVfRCAgICAgIDB4ZmZmZjAwMDAKKworLy9SRgorLy9aZWJyYTEKKyNkZWZpbmUgYlplYnJhMV9IU1NJRW5hYmxlICAgICAgICAweDgKKyNkZWZpbmUgYlplYnJhMV9UUnhDb250cm9sICAgICAgICAweGMwMAorI2RlZmluZSBiWmVicmExX1RSeEdhaW5TZXR0aW5nICAgIDB4MDdmCisjZGVmaW5lIGJaZWJyYTFfUnhDb3JuZXIgICAgICAgICAgMHhjMDAKKyNkZWZpbmUgYlplYnJhMV9UeENoYXJnZVB1bXAgICAgICAweDM4CisjZGVmaW5lIGJaZWJyYTFfUnhDaGFyZ2VQdW1wICAgICAgMHg3CisjZGVmaW5lIGJaZWJyYTFfQ2hhbm5lbE51bSAgICAgICAgMHhmODAKKyNkZWZpbmUgYlplYnJhMV9UeExQRkJXICAgICAgICAgICAweDQwMAorI2RlZmluZSBiWmVicmExX1J4TFBGQlcgICAgICAgICAgIDB4NjAwCisKKy8vWmVicmE0CisjZGVmaW5lIGJSVEw4MjU2UmVnTW9kZUN0cmwxICAgICAgMHgxMDAKKyNkZWZpbmUgYlJUTDgyNTZSZWdNb2RlQ3RybDAgICAgICAweDQwCisjZGVmaW5lIGJSVEw4MjU2X1R4TFBGQlcgICAgICAgICAgMHgxOAorI2RlZmluZSBiUlRMODI1Nl9SeExQRkJXICAgICAgICAgIDB4NjAwCisKKy8vUlRMODI1OAorI2RlZmluZSBiUlRMODI1OF9UeExQRkJXICAgICAgICAgIDB4YworI2RlZmluZSBiUlRMODI1OF9SeExQRkJXICAgICAgICAgIDB4YzAwCisjZGVmaW5lIGJSVEw4MjU4X1JTU0lMUEZCVyAgICAgICAgMHhjMAorCisvL2J5dGUgZW5kYWJsZSBmb3Igc2Jfd3JpdGUKKyNkZWZpbmUgYkJ5dGUwICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYkJ5dGUxICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgYkJ5dGUyICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgYkJ5dGUzICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgYldvcmQwICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgYldvcmQxICAgICAgICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgYkRXb3JkICAgICAgICAgICAgICAgICAgICAweGYKKworLy9mb3IgUHV0UmVnc2V0dGluZyAmIEdldFJlZ1NldHRpbmcgQml0TWFzaworI2RlZmluZSBiTWFza0J5dGUwICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYk1hc2tCeXRlMSAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYk1hc2tCeXRlMiAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiTWFza0J5dGUzICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYk1hc2tIV29yZCAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJNYXNrTFdvcmQgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBiTWFza0RXb3JkICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworLy9mb3IgUHV0UkZSZWdzZXR0aW5nICYgR2V0UkZSZWdTZXR0aW5nIEJpdE1hc2sKKyNkZWZpbmUgYk1hc2sxMkJpdHMgICAgICAgICAgICAgICAweGZmZgorCisjZGVmaW5lIGJFbmFibGUgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJEaXNhYmxlICAgICAgICAgICAgICAgICAgMHgwCisKKyNkZWZpbmUgTGVmdEFudGVubmEgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUmlnaHRBbnRlbm5hICAgICAgICAgICAgICAweDEKKworI2RlZmluZSB0Q2hlY2tUeFN0YXR1cyAgICAgICAgICAgIDUwMCAgIC8vNTAwbXMKKyNkZWZpbmUgdFVwZGF0ZVJ4Q291bnRlciAgICAgICAgICAxMDAgICAvLzEwMG1zCisKKyNkZWZpbmUgcmF0ZUNDSyAgICAgMAorI2RlZmluZSByYXRlT0ZETSAgICAxCisjZGVmaW5lIHJhdGVIVCAgICAgIDIKKworLy9kZWZpbmUgUmVnaXN0ZXItRW5kCisjZGVmaW5lIGJQTUFDX0VuZCAgICAgICAgICAgICAgICAgMHgxZmYKKyNkZWZpbmUgYkZQR0FQSFkwX0VuZCAgICAgICAgICAgICAweDhmZgorI2RlZmluZSBiRlBHQVBIWTFfRW5kICAgICAgICAgICAgIDB4OWZmCisjZGVmaW5lIGJDQ0tQSFkwX0VuZCAgICAgICAgICAgICAgMHhhZmYKKyNkZWZpbmUgYk9GRE1QSFkwX0VuZCAgICAgICAgICAgICAweGNmZgorI2RlZmluZSBiT0ZETVBIWTFfRW5kICAgICAgICAgICAgIDB4ZGZmCisKKy8vZGVmaW5lIG1heCBkZWJ1ZyBpdGVtIGluIGVhY2ggZGVidWcgcGFnZQorLy8jZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMCAgICAgICAgMHg5CisvLyNkZWZpbmUgYk1heEl0ZW1fRlBHQV9QSFkxICAgICAgICAweDMKKy8vI2RlZmluZSBiTWF4SXRlbV9QSFlfMTFCICAgICAgICAgIDB4MTYKKy8vI2RlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTAgICAgICAgIDB4MjkKKy8vI2RlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTEgICAgICAgIDB4MAorCisjZGVmaW5lIGJQTUFDQ29udHJvbCAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIGJXTUFDQ29udHJvbCAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIGJXTklDQ29udHJvbCAgICAgICAgICAgICAgMHgyCisKKyNkZWZpbmUgUGF0aEEgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgUGF0aEIgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUGF0aEMgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgUGF0aEQgICAgICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZQlyUlRMODI1NlJ4TWl4ZXJQb2xlCQkweGIKKyNkZWZpbmUgCWJaZWJyYVJ4TWl4ZXJQb2xlCQkweDYKKyNkZWZpbmUgCXJSVEw4MjU2VHhCQk9QQmlhcyAgICAgICAgMHg5CisjZGVmaW5lIAliUlRMODI1NlR4QkJPUEJpYXMgICAgICAgMHg0MDAKKyNkZWZpbmUgCXJSVEw4MjU2VHhCQkJXICAgICAgICAgICAgIDE5CisjZGVmaW5lIAliUlRMODI1NlR4QkJCVyAgICAgICAgICAgIAkweDE4CisKKyNlbmRpZgkvL19fSU5DX0hBTDgxOTBQQ0lQSFlSRUdfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdjNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorY29uZmlnIFNBTVNVTkdfTEFQVE9QCisJdHJpc3RhdGUgIlNhbXN1bmcgTGFwdG9wIGRyaXZlciIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFJGS0lMTCAmJiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFICYmIFg4NgorCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBkcml2ZXIgZm9yIHRoZSBOMTI4IFNhbXN1bmcgTGFwdG9wCisJICBwcm92aWRpbmcgY29udHJvbCBvdmVyIHRoZSBXaXJlbGVzcyBMRUQgYW5kIHRoZSBMQ0QgYmFja2xpZ2h0CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZQorCSAgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhbXN1bmctbGFwdG9wLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmY0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX1NBTVNVTkdfTEFQVE9QKQkrPSBzYW1zdW5nLWxhcHRvcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTZkNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2Ftc3VuZy1sYXB0b3AvVE9ETwpAQCAtMCwwICsxLDUgQEAKK1RPRE86CisJLSByZXZpZXcgZnJvbSBvdGhlciBkZXZlbG9wZXJzCisJLSBmaWd1cmUgb3V0IEFDUEkgdmlkZW8gaXNzdWVzCisKK1BsZWFzZSBzZW5kIHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jIGIvZHJpdmVycy9zdGFnaW5nL3NhbXN1bmctbGFwdG9wL3NhbXN1bmctbGFwdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3NzEzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zYW1zdW5nLWxhcHRvcC9zYW1zdW5nLWxhcHRvcC5jCkBAIC0wLDAgKzEsNTQyIEBACisvKgorICogU2Ftc3VuZyBOMTMwIExhcHRvcCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVna2hAc3VzZS5kZSkKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb3ZlbGwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZmtpbGwuaD4KKworLyoKKyAqIFRoaXMgZHJpdmVyIGlzIG5lZWRlZCBiZWNhdXNlIGEgbnVtYmVyIG9mIFNhbXN1bmcgbGFwdG9wcyBkbyBub3QgaG9vaworICogdGhlaXIgY29udHJvbCBzZXR0aW5ncyB0aHJvdWdoIEFDUEkuICBTbyB3ZSBoYXZlIHRvIHBva2UgYXJvdW5kIGluIHRoZQorICogQklPUyB0byBkbyB0aGluZ3MgbGlrZSBicmlnaHRuZXNzIHZhbHVlcywgYW5kICJzcGVjaWFsIiBrZXkgY29udHJvbHMuCisgKi8KKworLyoKKyAqIFdlIGhhdmUgMCAtIDggYXMgdmFsaWQgYnJpZ2h0bmVzcyBsZXZlbHMuICBUaGUgc3BlY3Mgc2F5IHRoYXQgbGV2ZWwgMCBzaG91bGQKKyAqIGJlIHJlc2VydmVkIGJ5IHRoZSBCSU9TICh3aGljaCByZWFsbHkgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UpLCB3ZSB0ZWxsCisgKiB1c2Vyc3BhY2UgdGhhdCB0aGUgdmFsdWUgaXMgMCAtIDcgYW5kIHRoZW4ganVzdCB0ZWxsIHRoZSBoYXJkd2FyZSAxIC0gOAorICovCisjZGVmaW5lIE1BWF9CUklHSFQJMHgwNworCisvKiBCcmlnaHRuZXNzIGlzIDAgLSA4LCBhcyBkZXNjcmliZWQgYWJvdmUuICBWYWx1ZSAwIGlzIGZvciB0aGUgQklPUyB0byB1c2UgKi8KKyNkZWZpbmUgR0VUX0JSSUdIVE5FU1MJCQkweDAwCisjZGVmaW5lIFNFVF9CUklHSFRORVNTCQkJMHgwMQorCisvKiBmaXJzdCBieXRlOgorICogMHgwMCAtIHdpcmVsZXNzIGlzIG9mZgorICogMHgwMSAtIHdpcmVsZXNzIGlzIG9uCisgKiBzZWNvbmQgYnl0ZToKKyAqIDB4MDIgLSAzRyBpcyBvZmYKKyAqIDB4MDMgLSAzRyBpcyBvbgorICogVE9ETywgdmVyaWZ5IDNHIGlzIGNvcnJlY3QsIHRoYXQgZG9lc24ndCBzZWVtIHJpZ2h0Li4uCisgKi8KKyNkZWZpbmUgR0VUX1dJUkVMRVNTX0JVVFRPTgkJMHgwMgorI2RlZmluZSBTRVRfV0lSRUxFU1NfQlVUVE9OCQkweDAzCisKKy8qIDAgaXMgb2ZmLCAxIGlzIG9uICovCisjZGVmaW5lIEdFVF9CQUNLTElHSFQJCQkweDA0CisjZGVmaW5lIFNFVF9CQUNLTElHSFQJCQkweDA1CisKKy8qCisgKiAweDgwIG9yIDB4MDAgLSBubyBhY3Rpb24KKyAqIDB4ODEgLSByZWNvdmVyeSBrZXkgcHJlc3NlZAorICovCisjZGVmaW5lIEdFVF9SRUNPVkVSWV9NRVRIT0QJCTB4MDYKKyNkZWZpbmUgU0VUX1JFQ09WRVJZX01FVEhPRAkJMHgwNworCisvKiAwIGlzIGxvdywgMSBpcyBoaWdoICovCisjZGVmaW5lIEdFVF9QRVJGT1JNQU5DRV9MRVZFTAkJMHgwOAorI2RlZmluZSBTRVRfUEVSRk9STUFOQ0VfTEVWRUwJCTB4MDkKKworLyoKKyAqIFRlbGwgdGhlIEJJT1MgdGhhdCBMaW51eCBpcyBydW5uaW5nIG9uIHRoaXMgbWFjaGluZS4KKyAqIDgxIGlzIG9uLCA4MCBpcyBvZmYKKyAqLworI2RlZmluZSBTRVRfTElOVVgJCQkweDBhCisKKworI2RlZmluZSBNQUlOX0ZVTkNUSU9OCQkJMHg0YzQ5CisKKyNkZWZpbmUgU0FCSV9IRUFERVJfUE9SVAkJMHgwMAorI2RlZmluZSBTQUJJX0hFQURFUl9SRV9NRU0JCTB4MDIKKyNkZWZpbmUgU0FCSV9IRUFERVJfSUZBQ0VGVU5DCQkweDAzCisjZGVmaW5lIFNBQklfSEVBREVSX0VOX01FTQkJMHgwNAorI2RlZmluZSBTQUJJX0hFQURFUl9EQVRBX09GRlNFVAkJMHgwNQorI2RlZmluZSBTQUJJX0hFQURFUl9EQVRBX1NFR01FTlQJMHgwNworCisjZGVmaW5lIFNBQklfSUZBQ0VfTUFJTgkJCTB4MDAKKyNkZWZpbmUgU0FCSV9JRkFDRV9TVUIJCQkweDAyCisjZGVmaW5lIFNBQklfSUZBQ0VfQ09NUExFVEUJCTB4MDQKKyNkZWZpbmUgU0FCSV9JRkFDRV9EQVRBCQkJMHgwNQorCisvKiBTdHJ1Y3R1cmUgdG8gZ2V0IGRhdGEgYmFjayB0byB0aGUgY2FsbGluZyBmdW5jdGlvbiAqLworc3RydWN0IHNhYmlfcmV0dmFsIHsKKwl1OCByZXR2YWxbMjBdOworfTsKKworc3RhdGljIHZvaWQgX19pb21lbSAqc2FiaTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNhYmlfaWZhY2U7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpmMDAwMF9zZWdtZW50Oworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiYWNrbGlnaHRfZGV2aWNlOworc3RhdGljIHN0cnVjdCBtdXRleCBzYWJpX211dGV4Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNkZXY7CitzdGF0aWMgc3RydWN0IHJma2lsbCAqcmZrOworCitzdGF0aWMgaW50IGZvcmNlOworbW9kdWxlX3BhcmFtKGZvcmNlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJEaXNhYmxlIHRoZSBETUkgY2hlY2sgYW5kIGZvcmNlcyB0aGUgZHJpdmVyIHRvIGJlIGxvYWRlZCIpOworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKKworc3RhdGljIGludCBzYWJpX2dldF9jb21tYW5kKHU4IGNvbW1hbmQsIHN0cnVjdCBzYWJpX3JldHZhbCAqc3JldHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl1MTYgcG9ydCA9IHJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9QT1JUKTsKKworCW11dGV4X2xvY2soJnNhYmlfbXV0ZXgpOworCisJLyogZW5hYmxlIG1lbW9yeSB0byBiZSBhYmxlIHRvIHdyaXRlIHRvIGl0ICovCisJb3V0YihyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfRU5fTUVNKSwgcG9ydCk7CisKKwkvKiB3cml0ZSBvdXQgdGhlIGNvbW1hbmQgKi8KKwl3cml0ZXcoTUFJTl9GVU5DVElPTiwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfTUFJTik7CisJd3JpdGV3KGNvbW1hbmQsIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX1NVQik7CisJd3JpdGViKDAsIHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0NPTVBMRVRFKTsKKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9JRkFDRUZVTkMpLCBwb3J0KTsKKworCS8qIHdyaXRlIHByb3RlY3QgbWVtb3J5IHRvIG1ha2UgaXQgc2FmZSAqLworCW91dGIocmVhZGIoc2FiaSArIFNBQklfSEVBREVSX1JFX01FTSksIHBvcnQpOworCisJLyogc2VlIGlmIHRoZSBjb21tYW5kIGFjdHVhbGx5IHN1Y2NlZWRlZCAqLworCWlmIChyZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9DT01QTEVURSkgPT0gMHhhYSAmJgorCSAgICByZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBKSAhPSAweGZmKSB7CisJCS8qCisJCSAqIEl0IGRpZCEKKwkJICogU2F2ZSBvZmYgdGhlIGRhdGEgaW50byBhIHN0cnVjdHVyZSBzbyB0aGUgY2FsbGVyIHVzZSBpdC4KKwkJICogUmlnaHQgbm93IHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgNCBieXRlcywKKwkJICogSSBzdXBwb3NlIHRoZXJlIGFyZSBjb21tYW5kcyB0aGF0IG5lZWQgbW9yZSwgYnV0IEkgZG9uJ3QKKwkJICoga25vdyBhYm91dCB0aGVtLgorCQkgKi8KKwkJc3JldHZhbC0+cmV0dmFsWzBdID0gcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSk7CisJCXNyZXR2YWwtPnJldHZhbFsxXSA9IHJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0RBVEEgKyAxKTsKKwkJc3JldHZhbC0+cmV0dmFsWzJdID0gcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfREFUQSArIDIpOworCQlzcmV0dmFsLT5yZXR2YWxbM10gPSByZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBICsgMyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBzbyByZXBvcnQgaXQgYW5kIGVycm9yIG91dCAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIlNBQkkgY29tbWFuZCAweCUwMnggZmFpbGVkIHdpdGggY29tcGxldGlvbiBmbGFnIDB4JTAyeCBhbmQgb3V0cHV0IDB4JTAyeFxuIiwKKwkJY29tbWFuZCwgcmVhZGIoc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpLAorCQlyZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBKSk7CisJcmV0dmFsID0gLUVJTlZBTDsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZzYWJpX211dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworCit9CisKK3N0YXRpYyBpbnQgc2FiaV9zZXRfY29tbWFuZCh1OCBjb21tYW5kLCB1OCBkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCXUxNiBwb3J0ID0gcmVhZHcoc2FiaSArIFNBQklfSEVBREVSX1BPUlQpOworCisJbXV0ZXhfbG9jaygmc2FiaV9tdXRleCk7CisKKwkvKiBlbmFibGUgbWVtb3J5IHRvIGJlIGFibGUgdG8gd3JpdGUgdG8gaXQgKi8KKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9FTl9NRU0pLCBwb3J0KTsKKworCS8qIHdyaXRlIG91dCB0aGUgY29tbWFuZCAqLworCXdyaXRldyhNQUlOX0ZVTkNUSU9OLCBzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9NQUlOKTsKKwl3cml0ZXcoY29tbWFuZCwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfU1VCKTsKKwl3cml0ZWIoMCwgc2FiaV9pZmFjZSArIFNBQklfSUZBQ0VfQ09NUExFVEUpOworCXdyaXRlYihkYXRhLCBzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBKTsKKwlvdXRiKHJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9JRkFDRUZVTkMpLCBwb3J0KTsKKworCS8qIHdyaXRlIHByb3RlY3QgbWVtb3J5IHRvIG1ha2UgaXQgc2FmZSAqLworCW91dGIocmVhZGIoc2FiaSArIFNBQklfSEVBREVSX1JFX01FTSksIHBvcnQpOworCisJLyogc2VlIGlmIHRoZSBjb21tYW5kIGFjdHVhbGx5IHN1Y2NlZWRlZCAqLworCWlmIChyZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9DT01QTEVURSkgPT0gMHhhYSAmJgorCSAgICByZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9EQVRBKSAhPSAweGZmKSB7CisJCS8qIGl0IGRpZCEgKi8KKwkJZ290byBleGl0OworCX0KKworCS8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIHNvIHJlcG9ydCBpdCBhbmQgZXJyb3Igb3V0ICovCisJcHJpbnRrKEtFUk5fV0FSTklORyAiU0FCSSBjb21tYW5kIDB4JTAyeCBmYWlsZWQgd2l0aCBjb21wbGV0aW9uIGZsYWcgMHglMDJ4IGFuZCBvdXRwdXQgMHglMDJ4XG4iLAorCQljb21tYW5kLCByZWFkYihzYWJpX2lmYWNlICsgU0FCSV9JRkFDRV9DT01QTEVURSksCisJCXJlYWRiKHNhYmlfaWZhY2UgKyBTQUJJX0lGQUNFX0RBVEEpKTsKKwlyZXR2YWwgPSAtRUlOVkFMOworZXhpdDoKKwltdXRleF91bmxvY2soJnNhYmlfbXV0ZXgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYmFja2xpZ2h0KHZvaWQpCit7CisJc3RydWN0IHNhYmlfcmV0dmFsIHNyZXR2YWw7CisKKwlzYWJpX2dldF9jb21tYW5kKEdFVF9CQUNLTElHSFQsICZzcmV0dmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0ID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7CisKKwlzYWJpX3NldF9jb21tYW5kKFNFVF9CQUNLTElHSFQsIDApOworCXByaW50ayhLRVJOX0RFQlVHICJiYWNrbGlnaHQgc2hvdWxkIGJlIG9mZlxuIik7CisKKwlzYWJpX2dldF9jb21tYW5kKEdFVF9CQUNLTElHSFQsICZzcmV0dmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYmFja2xpZ2h0ID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7CisKKwltc2xlZXAoMTAwMCk7CisKKwlzYWJpX3NldF9jb21tYW5kKFNFVF9CQUNLTElHSFQsIDEpOworCXByaW50ayhLRVJOX0RFQlVHICJiYWNrbGlnaHQgc2hvdWxkIGJlIG9uXG4iKTsKKworCXNhYmlfZ2V0X2NvbW1hbmQoR0VUX0JBQ0tMSUdIVCwgJnNyZXR2YWwpOworCXByaW50ayhLRVJOX0RFQlVHICJiYWNrbGlnaHQgPSAweCUwMnhcbiIsIHNyZXR2YWwucmV0dmFsWzBdKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF93aXJlbGVzcyh2b2lkKQoreworCXN0cnVjdCBzYWJpX3JldHZhbCBzcmV0dmFsOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfV0lSRUxFU1NfQlVUVE9OLCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworCisJc2FiaV9zZXRfY29tbWFuZChTRVRfV0lSRUxFU1NfQlVUVE9OLCAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid2lyZWxlc3MgbGVkIHNob3VsZCBiZSBvZmZcbiIpOworCisJc2FiaV9nZXRfY29tbWFuZChHRVRfV0lSRUxFU1NfQlVUVE9OLCAmc3JldHZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndpcmVsZXNzIGxlZCA9IDB4JTAyeFxuIiwgc3JldHZhbC5yZXR2YWxbMF0pOworCisJbXNsZWVwKDEwMDApOworCisJc2FiaV9zZXRfY29tbWFuZChTRVRfV0lSRUxFU1NfQlVUVE9OLCAxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid2lyZWxlc3MgbGVkIHNob3VsZCBiZSBvblxuIik7CisKKwlzYWJpX2dldF9jb21tYW5kKEdFVF9XSVJFTEVTU19CVVRUT04sICZzcmV0dmFsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid2lyZWxlc3MgbGVkID0gMHglMDJ4XG4iLCBzcmV0dmFsLnJldHZhbFswXSk7Cit9CisKK3N0YXRpYyB1OCByZWFkX2JyaWdodG5lc3Modm9pZCkKK3sKKwlzdHJ1Y3Qgc2FiaV9yZXR2YWwgc3JldHZhbDsKKwlpbnQgdXNlcl9icmlnaHRuZXNzID0gMDsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc2FiaV9nZXRfY29tbWFuZChHRVRfQlJJR0hUTkVTUywgJnNyZXR2YWwpOworCWlmICghcmV0dmFsKQorCQl1c2VyX2JyaWdodG5lc3MgPSBzcmV0dmFsLnJldHZhbFswXTsKKwkJaWYgKHVzZXJfYnJpZ2h0bmVzcyAhPSAwKQorCQkJLS11c2VyX2JyaWdodG5lc3M7CisJcmV0dXJuIHVzZXJfYnJpZ2h0bmVzczsKK30KKworc3RhdGljIHZvaWQgc2V0X2JyaWdodG5lc3ModTggdXNlcl9icmlnaHRuZXNzKQoreworCXNhYmlfc2V0X2NvbW1hbmQoU0VUX0JSSUdIVE5FU1MsIHVzZXJfYnJpZ2h0bmVzcyArIDEpOworfQorCitzdGF0aWMgaW50IGdldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gKGludClyZWFkX2JyaWdodG5lc3MoKTsKK30KKworc3RhdGljIGludCB1cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzZXRfYnJpZ2h0bmVzcyhiZC0+cHJvcHMuYnJpZ2h0bmVzcyk7CisKKwlpZiAoYmQtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspCisJCXNhYmlfc2V0X2NvbW1hbmQoU0VUX0JBQ0tMSUdIVCwgMSk7CisJZWxzZQorCQlzYWJpX3NldF9jb21tYW5kKFNFVF9CQUNLTElHSFQsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgYmFja2xpZ2h0X29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MJPSBnZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IHVwZGF0ZV9zdGF0dXMsCit9OworCitzdGF0aWMgaW50IHJma2lsbF9zZXQodm9pZCAqZGF0YSwgYm9vbCBibG9ja2VkKQoreworCS8qIERvIHNvbWV0aGluZyB3aXRoIGJsb2NrZWQuLi4qLworCS8qCisJICogYmxvY2tlZCA9PSBmYWxzZSBpcyBvbgorCSAqIGJsb2NrZWQgPT0gdHJ1ZSBpcyBvZmYKKwkgKi8KKwlpZiAoYmxvY2tlZCkKKwkJc2FiaV9zZXRfY29tbWFuZChTRVRfV0lSRUxFU1NfQlVUVE9OLCAwKTsKKwllbHNlCisJCXNhYmlfc2V0X2NvbW1hbmQoU0VUX1dJUkVMRVNTX0JVVFRPTiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCByZmtpbGxfb3BzIHJma2lsbF9vcHMgPSB7CisJLnNldF9ibG9jayA9IHJma2lsbF9zZXQsCit9OworCitzdGF0aWMgaW50IGluaXRfd2lyZWxlc3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2RldikKK3sKKwlpbnQgcmV0dmFsOworCisJcmZrID0gcmZraWxsX2FsbG9jKCJzYW1zdW5nLXdpZmkiLCAmc2Rldi0+ZGV2LCBSRktJTExfVFlQRV9XTEFOLAorCQkJICAgJnJma2lsbF9vcHMsIE5VTEwpOworCWlmICghcmZrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IHJma2lsbF9yZWdpc3RlcihyZmspOworCWlmIChyZXR2YWwpIHsKKwkJcmZraWxsX2Rlc3Ryb3kocmZrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfd2lyZWxlc3Modm9pZCkKK3sKKwlyZmtpbGxfdW5yZWdpc3RlcihyZmspOworCXJma2lsbF9kZXN0cm95KHJmayk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9zaWxlbnRfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNhYmlfcmV0dmFsIHNyZXR2YWw7CisJaW50IHJldHZhbDsKKworCS8qIFJlYWQgdGhlIHN0YXRlICovCisJcmV0dmFsID0gc2FiaV9nZXRfY29tbWFuZChHRVRfUEVSRk9STUFOQ0VfTEVWRUwsICZzcmV0dmFsKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogVGhlIGxvZ2ljIGlzIGJhY2t3YXJkcywgeWVhaCwgbG90cyBvZiBmdW4uLi4gKi8KKwlpZiAoc3JldHZhbC5yZXR2YWxbMF0gPT0gMCkKKwkJcmV0dmFsID0gMTsKKwllbHNlCisJCXJldHZhbCA9IDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJldHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9zaWxlbnRfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KQoreworCWNoYXIgdmFsdWU7CisKKwlpZiAoY291bnQgPj0gMSkgeworCQl2YWx1ZSA9IGJ1ZlswXTsKKwkJaWYgKCh2YWx1ZSA9PSAnMCcpIHx8ICh2YWx1ZSA9PSAnbicpIHx8ICh2YWx1ZSA9PSAnTicpKSB7CisJCQkvKiBUdXJuIHNwZWVkIHVwICovCisJCQlzYWJpX3NldF9jb21tYW5kKFNFVF9QRVJGT1JNQU5DRV9MRVZFTCwgMHgwMSk7CisJCX0gZWxzZSBpZiAoKHZhbHVlID09ICcxJykgfHwgKHZhbHVlID09ICd5JykgfHwgKHZhbHVlID09ICdZJykpIHsKKwkJCS8qIFR1cm4gc3BlZWQgZG93biAqLworCQkJc2FiaV9zZXRfY29tbWFuZChTRVRfUEVSRk9STUFOQ0VfTEVWRUwsIDB4MDApOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKHNpbGVudCwgU19JV1VHTyB8IFNfSVJVR08sCisJCSAgIGdldF9zaWxlbnRfc3RhdGUsIHNldF9zaWxlbnRfc3RhdGUpOworCisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV9jaGVja19jYihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiBmb3VuZCBsYXB0b3AgbW9kZWwgJyVzJ1xuIiwKKwkJaWQtPmlkZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgc2Ftc3VuZ19kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJOMTI4IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJTQU1TVU5HIEVMRUNUUk9OSUNTIENPLiwgTFRELiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJOMTI4IiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJOMTI4IiksCisJCX0sCisJCS5jYWxsYmFjayA9IGRtaV9jaGVja19jYiwKKwl9LAorCXsKKwkJLmlkZW50ID0gIk4xMzAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNBTVNVTkcgRUxFQ1RST05JQ1MgQ08uLCBMVEQuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk4xMzAiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk4xMzAiKSwKKwkJfSwKKwkJLmNhbGxiYWNrID0gZG1pX2NoZWNrX2NiLAorCX0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBzYW1zdW5nX2RtaV90YWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNhbXN1bmdfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzYWJpX3JldHZhbCBzcmV0dmFsOworCWNvbnN0IGNoYXIgKnRlc3RTdHIgPSAiU0VDTElOVVgiOworCXZvaWQgX19pb21lbSAqbWVtY2hlY2s7CisJdW5zaWduZWQgaW50IGlmYWNlUDsKKwlpbnQgcFN0cjsKKwlpbnQgbG9jYTsKKwlpbnQgcmV0dmFsOworCisJbXV0ZXhfaW5pdCgmc2FiaV9tdXRleCk7CisKKwlpZiAoIWZvcmNlICYmICFkbWlfY2hlY2tfc3lzdGVtKHNhbXN1bmdfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmMDAwMF9zZWdtZW50ID0gaW9yZW1hcCgweGYwMDAwLCAweGZmZmYpOworCWlmICghZjAwMDBfc2VnbWVudCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IG1hcCB0aGUgc2VnbWVudCBhdCAweGYwMDAwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVHJ5IHRvIGZpbmQgdGhlIHNpZ25hdHVyZSAiU0VDTElOVVgiIGluIG1lbW9yeSB0byBmaW5kIHRoZSBoZWFkZXIgKi8KKwlwU3RyID0gMDsKKwltZW1jaGVjayA9IGYwMDAwX3NlZ21lbnQ7CisJZm9yIChsb2NhID0gMDsgbG9jYSA8IDB4ZmZmZjsgbG9jYSsrKSB7CisJCWNoYXIgdGVtcCA9IHJlYWRiKG1lbWNoZWNrICsgbG9jYSk7CisKKwkJaWYgKHRlbXAgPT0gdGVzdFN0cltwU3RyXSkgeworCQkJaWYgKHBTdHIgPT0gc3RybGVuKHRlc3RTdHIpLTEpCisJCQkJYnJlYWs7CisJCQkrK3BTdHI7CisJCX0gZWxzZSB7CisJCQlwU3RyID0gMDsKKwkJfQorCX0KKwlpZiAobG9jYSA9PSAweGZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUaGlzIGNvbXB1dGVyIGRvZXMgbm90IHN1cHBvcnQgU0FCSVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fc2lnbmF0dXJlOworCQl9CisKKwkvKiBwb2ludCB0byB0aGUgU01JIHBvcnQgTnVtYmVyICovCisJbG9jYSArPSAxOworCXNhYmkgPSAobWVtY2hlY2sgKyBsb2NhKTsKKworCWlmIChkZWJ1ZykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiVGhpcyBjb21wdXRlciBzdXBwb3J0cyBTQUJJPT0leFxuIiwKKwkJCWxvY2EgKyAweGYwMDAwIC0gNik7CisJCXByaW50ayhLRVJOX0RFQlVHICJTQUJJIGhlYWRlcjpcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiIFNNSSBQb3J0IE51bWJlciA9IDB4JTA0eFxuIiwKKwkJCXJlYWR3KHNhYmkgKyBTQUJJX0hFQURFUl9QT1JUKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU01JIEludGVyZmFjZSBGdW5jdGlvbiA9IDB4JTAyeFxuIiwKKwkJCXJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9JRkFDRUZVTkMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBTTUkgZW5hYmxlIG1lbW9yeSBidWZmZXIgPSAweCUwMnhcbiIsCisJCQlyZWFkYihzYWJpICsgU0FCSV9IRUFERVJfRU5fTUVNKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU01JIHJlc3RvcmUgbWVtb3J5IGJ1ZmZlciA9IDB4JTAyeFxuIiwKKwkJCXJlYWRiKHNhYmkgKyBTQUJJX0hFQURFUl9SRV9NRU0pKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBTQUJJIGRhdGEgb2Zmc2V0ID0gMHglMDR4XG4iLAorCQkJcmVhZHcoc2FiaSArIFNBQklfSEVBREVSX0RBVEFfT0ZGU0VUKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgU0FCSSBkYXRhIHNlZ21lbnQgPSAweCUwNHhcbiIsCisJCQlyZWFkdyhzYWJpICsgU0FCSV9IRUFERVJfREFUQV9TRUdNRU5UKSk7CisJfQorCisJLyogR2V0IGEgcG9pbnRlciB0byB0aGUgU0FCSSBJbnRlcmZhY2UgKi8KKwlpZmFjZVAgPSAocmVhZHcoc2FiaSArIFNBQklfSEVBREVSX0RBVEFfU0VHTUVOVCkgJiAweDBmZmZmKSA8PCA0OworCWlmYWNlUCArPSByZWFkdyhzYWJpICsgU0FCSV9IRUFERVJfREFUQV9PRkZTRVQpICYgMHgwZmZmZjsKKwlzYWJpX2lmYWNlID0gaW9yZW1hcChpZmFjZVAsIDE2KTsKKwlpZiAoIXNhYmlfaWZhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZW1hcCAleFxuIiwgaWZhY2VQKTsKKwkJZ290byBleGl0OworCX0KKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlmYWNlUCA9IDB4JTA4eFxuIiwgaWZhY2VQKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNhYmlfaWZhY2UgPSAlcFxuIiwgc2FiaV9pZmFjZSk7CisKKwkJdGVzdF9iYWNrbGlnaHQoKTsKKwkJdGVzdF93aXJlbGVzcygpOworCisJCXJldHZhbCA9IHNhYmlfZ2V0X2NvbW1hbmQoR0VUX0JSSUdIVE5FU1MsICZzcmV0dmFsKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJyaWdodG5lc3MgPSAweCUwMnhcbiIsIHNyZXR2YWwucmV0dmFsWzBdKTsKKwl9CisKKwkvKiBUdXJuIG9uICJMaW51eCIgbW9kZSBpbiB0aGUgQklPUyAqLworCXJldHZhbCA9IHNhYmlfc2V0X2NvbW1hbmQoU0VUX0xJTlVYLCAweDgxKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiBLQlVJTERfTU9ETkFNRSAiOiBMaW51eCBtb2RlIHdhcyBub3Qgc2V0IVxuIik7CisJCWdvdG8gZXJyb3Jfbm9fcGxhdGZvcm07CisJfQorCisJLyoga25vY2sgdXAgYSBwbGF0Zm9ybSBkZXZpY2UgdG8gaGFuZyBzdHVmZiBvZmYgb2YgKi8KKwlzZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgic2Ftc3VuZyIsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHNkZXYpKQorCQlnb3RvIGVycm9yX25vX3BsYXRmb3JtOworCisJLyogY3JlYXRlIGEgYmFja2xpZ2h0IGRldmljZSB0byB0YWxrIHRvIHRoaXMgb25lICovCisJYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInNhbXN1bmciLCAmc2Rldi0+ZGV2LAorCQkJCQkJICAgICBOVUxMLCAmYmFja2xpZ2h0X29wcyk7CisJaWYgKElTX0VSUihiYWNrbGlnaHRfZGV2aWNlKSkKKwkJZ290byBlcnJvcl9ub19iYWNrbGlnaHQ7CisKKwliYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IE1BWF9CUklHSFQ7CisJYmFja2xpZ2h0X2RldmljZS0+cHJvcHMuYnJpZ2h0bmVzcyA9IHJlYWRfYnJpZ2h0bmVzcygpOworCWJhY2tsaWdodF9kZXZpY2UtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiYWNrbGlnaHRfZGV2aWNlKTsKKworCXJldHZhbCA9IGluaXRfd2lyZWxlc3Moc2Rldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl9ub19yZms7CisKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNkZXYtPmRldiwgJmRldl9hdHRyX3NpbGVudCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl9maWxlX2NyZWF0ZTsKKworZXhpdDoKKwlyZXR1cm4gMDsKKworZXJyb3JfZmlsZV9jcmVhdGU6CisJZGVzdHJveV93aXJlbGVzcygpOworCitlcnJvcl9ub19yZms6CisJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGJhY2tsaWdodF9kZXZpY2UpOworCitlcnJvcl9ub19iYWNrbGlnaHQ6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2Rldik7CisKK2Vycm9yX25vX3BsYXRmb3JtOgorCWlvdW5tYXAoc2FiaV9pZmFjZSk7CisKK2Vycm9yX25vX3NpZ25hdHVyZToKKwlpb3VubWFwKGYwMDAwX3NlZ21lbnQpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Ftc3VuZ19leGl0KHZvaWQpCit7CisJLyogVHVybiBvZmYgIkxpbnV4IiBtb2RlIGluIHRoZSBCSU9TICovCisJc2FiaV9zZXRfY29tbWFuZChTRVRfTElOVVgsIDB4ODApOworCisJZGV2aWNlX3JlbW92ZV9maWxlKCZzZGV2LT5kZXYsICZkZXZfYXR0cl9zaWxlbnQpOworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiYWNrbGlnaHRfZGV2aWNlKTsKKwlkZXN0cm95X3dpcmVsZXNzKCk7CisJaW91bm1hcChzYWJpX2lmYWNlKTsKKwlpb3VubWFwKGYwMDAwX3NlZ21lbnQpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNkZXYpOworfQorCittb2R1bGVfaW5pdChzYW1zdW5nX2luaXQpOworbW9kdWxlX2V4aXQoc2Ftc3VuZ19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBCYWNrbGlnaHQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VwL3NlcF9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCmluZGV4IGY4OTBhMTYuLmU3YmM5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jCkBAIC0yNzMsNyArMjczLDggQEAKIAkJCQkJCXZvaWQgKnZpcnRfYWRkcmVzcykKIHsKIAlkbWFfYWRkcl90IHBhID0gc2VwLT5zaGFyZWRfYnVzICsgKHZpcnRfYWRkcmVzcyAtIHNlcC0+c2hhcmVkX2FkZHIpOwotCWVkYmcoInNlcDogdmlydCB0byBidXMgYiAlMDhsbHggdiAlcFxuIiwgcGEsIHZpcnRfYWRkcmVzcyk7CisJZWRiZygic2VwOiB2aXJ0IHRvIGJ1cyBiICUwOGxseCB2ICVwXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXBhLCB2aXJ0X2FkZHJlc3MpOwogCXJldHVybiBwYTsKIH0KIApAQCAtMTc4OCw2ICsxNzg5LDcgQEAKIAlmaXJzdF90YWJsZV9kYXRhLnBoeXNpY2FsX2FkZHJlc3MgPSAweGZmZmZmZmZmOwogCiAJLyogZmluZCB0aGUgZnJlZSBzdHJ1Y3R1cmUgZm9yIGZsb3cgZGF0YSAqLworCWVycm9yID0gLUVJTlZBTDsKIAlmbG93X2NvbnRleHRfcHRyID0gc2VwX2ZpbmRfZmxvd19jb250ZXh0KHNlcCwgU0VQX0ZSRUVfRkxPV19JRCk7CiAJaWYgKGZsb3dfY29udGV4dF9wdHIgPT0gTlVMTCkKIAkJZ290byBlbmRfZnVuY3Rpb247CkBAIC0yNDQ3LDcgKzI0NDksNyBAQAogI2VuZGlmCiAKIC8qCi0gIEZ1bmN0aW9uIHRoYXQgaXMgYWN0aXZhZWQgb24gdGhlIHN1Y2Nlc2Z1bCBwcm9iZSBvZiB0aGUgU0VQIGRldmljZQorICBGdW5jdGlvbiB0aGF0IGlzIGFjdGl2YXRlZCBvbiB0aGUgc3VjY2Vzc2Z1bCBwcm9iZSBvZiB0aGUgU0VQIGRldmljZQogKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IHNlcF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYwppbmRleCA1MmFmNDRjLi4wNjBlOWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCkBAIC05MjksNyArOTI5LDcgQEAKIAlkYmcoX19GSUxFX18gInF0X3NldHVhcnQgY29tcGxldGVkLlxuIik7CiAKIAkvKgotCSAqIFB1dCB0aGlzIGhlcmUgdG8gbWFrZSBpdCByZXNwb25zaXZlIHRvIHN0dHkgYW5kIGRlZmF1bHMgc2V0IGJ5CisJICogUHV0IHRoaXMgaGVyZSB0byBtYWtlIGl0IHJlc3BvbnNpdmUgdG8gc3R0eSBhbmQgZGVmYXVsdHMgc2V0IGJ5CiAJICogdGhlIHR0eSBsYXllcgogCSAqLwogCS8qIEZJWE1FOiBpcyB0aGlzIG5lZWRlZD8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwppbmRleCBlNjdhMTMwLi41YjE5MWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCkBAIC0zNTQsNyArMzU0LDYgQEAKIAkubmRvX2dldF9zdGF0cwkJPSBzbGljX2dldF9zdGF0cywKIAkubmRvX3NldF9tdWx0aWNhc3RfbGlzdAk9IHNsaWNfbWNhc3Rfc2V0X2xpc3QsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfaGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwppbmRleCA2ZTkxZmMyLi5lZjQzNzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9oY2QuYwpAQCAtNTYsNyArNTYsNyBAQAogc3RhdGljIGludCB2aGNpX2dldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAidmhjaV9oY2QiOwotc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX2Rlc2NbXSA9ICJVU0IvSVAgVmlydHVhbCBIb3N0IENvbnRvcm9sbGVyIjsKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjW10gPSAiVVNCL0lQIFZpcnR1YWwgSG9zdCBDb250cm9sbGVyIjsKIAogc3RydWN0IHZoY2lfaGNkICp0aGVfY29udHJvbGxlcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9UT0RPCmluZGV4IGFkYzVmY2EuLjIyMDFmZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL1RPRE8KQEAgLTExLDcgKzExLDcgQEAKIHN1aXRhYmlsaXR5IG9mIGEgRE1BIGNvbnRyb2xsZXIgYmFzZWQgb24gaXQncyBzdXBwb3J0ZWQgbW9kZXMgb2Ygb3BlcmF0aW9uLCBhcwogb3Bwb3NlZCB0byB0aGUgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc21zIGZvciBtYXN0ZXIgYW5kIHNsYXZlIHdpbmRvd3M6CiAKLQlzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfcmVxdWVzdF9kbWEoc3RydWN0IGRldmljZSAqZGV2KTsKKwlzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfZG1hX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2KTsKIAogQXMgb3Bwb3NlZCB0bzoKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCmluZGV4IGUxMzllYWUuLjFjZjNlOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKQEAgLTE1LDcgKzE1LDYgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC01NCw5ICs1Myw2IEBACiAJCQkgKiBPbmx5IG9uZSBWTUUgaW50ZXJydXB0IGNhbiBiZQogCQkJICogZ2VuZXJhdGVkIGF0IGEgdGltZSwgcHJvdmlkZSBsb2NraW5nCiAJCQkgKi8KLXN0cnVjdCBtdXRleCB2bWVfaXJxOyAgIC8qIExvY2tpbmcgZm9yIFZNRSBpcnEgY2FsbGJhY2sgY29uZmlndXJhdGlvbiAqLwotCi0KIAogc3RhdGljIGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfY2E5MWN4NDIiOwogCkBAIC0xNTgsMjMgKzE1NCwxMyBAQAogc3RhdGljIHUzMiBjYTkxY3g0Ml9WSVJRX2lycWhhbmRsZXIoaW50IHN0YXQpCiB7CiAJaW50IHZlYywgaSwgc2VydmljZWQgPSAwOwotCXZvaWQgKCpjYWxsKShpbnQsIGludCwgdm9pZCAqKTsKLQl2b2lkICpwcml2X2RhdGE7CiAKIAlmb3IgKGkgPSA3OyBpID4gMDsgaS0tKSB7CiAJCWlmIChzdGF0ICYgKDEgPDwgaSkpIHsKIAkJCXZlYyA9IGlvcmVhZDMyKGNhOTFjeDQyX2JyaWRnZS0+YmFzZSArCiAJCQkJQ0E5MUNYNDJfVl9TVEFUSURbaV0pICYgMHhmZjsKIAotCQkJY2FsbCA9IGNhOTFjeDQyX2JyaWRnZS0+aXJxW2kgLSAxXS5jYWxsYmFja1t2ZWNdLmZ1bmM7Ci0JCQlwcml2X2RhdGEgPQotCQkJY2E5MWN4NDJfYnJpZGdlLT5pcnFbaSAtIDFdLmNhbGxiYWNrW3ZlY10ucHJpdl9kYXRhOwotCi0JCQlpZiAoY2FsbCAhPSBOVUxMKQotCQkJCWNhbGwoaSwgdmVjLCBwcml2X2RhdGEpOwotCQkJZWxzZQotCQkJCXByaW50aygiU3B1cmlsb3VzIFZNRSBpbnRlcnJ1cHQsIGxldmVsOiV4LCAiCi0JCQkJCSJ2ZWN0b3I6JXhcbiIsIGksIHZlYyk7CisJCQl2bWVfaXJxX2hhbmRsZXIoY2E5MWN4NDJfYnJpZGdlLCBpLCB2ZWMpOwogCiAJCQlzZXJ2aWNlZCB8PSAoMSA8PCBpKTsKIAkJfQpAQCAtMjM1LDYgKzIyMSw4IEBACiAJLyogSW5pdGlhbGlzZSBsaXN0IGZvciBWTUUgYnVzIGVycm9ycyAqLwogCUlOSVRfTElTVF9IRUFEKCYoYnJpZGdlLT52bWVfZXJyb3JzKSk7CiAKKwltdXRleF9pbml0KCYoYnJpZGdlLT5pcnFfbXR4KSk7CisKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgZnJvbSBQQ0kgdG8gVk1FICovCiAJaW93cml0ZTMyKDAsIGJyaWRnZS0+YmFzZSArIFZJTlRfRU4pOwogCkBAIC0yODIsNjYgKzI3MCwzMSBAQAogLyoKICAqIFNldCB1cCBhbiBWTUUgaW50ZXJydXB0CiAgKi8KLWludCBjYTkxY3g0Ml9yZXF1ZXN0X2lycShpbnQgbGV2ZWwsIGludCBzdGF0aWQsCi0Jdm9pZCAoKmNhbGxiYWNrKShpbnQgbGV2ZWwsIGludCB2ZWN0b3IsIHZvaWQgKnByaXZfZGF0YSksCi0Jdm9pZCAqcHJpdl9kYXRhKQordm9pZCBjYTkxY3g0Ml9pcnFfc2V0KGludCBsZXZlbCwgaW50IHN0YXRlLCBpbnQgc3luYykKKwogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXUzMiB0bXA7CiAKLQltdXRleF9sb2NrKCYodm1lX2lycSkpOwotCi0JaWYgKGNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jKSB7Ci0JCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKLQkJcHJpbnRrKCJWTUUgSW50ZXJydXB0IGFscmVhZHkgdGFrZW5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCi0JY2E5MWN4NDJfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudCsrOwotCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5wcml2X2RhdGEgPSBwcml2X2RhdGE7Ci0JY2E5MWN4NDJfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBjYWxsYmFjazsKLQogCS8qIEVuYWJsZSBJUlEgbGV2ZWwgKi8KIAl0bXAgPSBpb3JlYWQzMihjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKLQl0bXAgfD0gQ0E5MUNYNDJfTElOVF9WSVJRW2xldmVsXTsKKworCWlmIChzdGF0ZSA9PSAwKQorCQl0bXAgJj0gfkNBOTFDWDQyX0xJTlRfVklSUVtsZXZlbF07CisJZWxzZQorCQl0bXAgfD0gQ0E5MUNYNDJfTElOVF9WSVJRW2xldmVsXTsKKwogCWlvd3JpdGUzMih0bXAsIGNhOTFjeDQyX2JyaWRnZS0+YmFzZSArIExJTlRfRU4pOwogCi0JbXV0ZXhfdW5sb2NrKCYodm1lX2lycSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGcmVlIFZNRSBpbnRlcnJ1cHQKLSAqLwotdm9pZCBjYTkxY3g0Ml9mcmVlX2lycShpbnQgbGV2ZWwsIGludCBzdGF0aWQpCi17Ci0JdTMyIHRtcDsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQotCW11dGV4X2xvY2soJih2bWVfaXJxKSk7Ci0KLQljYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNvdW50LS07Ci0KLQkvKiBEaXNhYmxlIElSUSBsZXZlbCBpZiBubyBtb3JlIGludGVycnVwdHMgYXR0YWNoZWQgYXQgdGhpcyBsZXZlbCovCi0JaWYgKGNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQgPT0gMCkgewotCQl0bXAgPSBpb3JlYWQzMihjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKLQkJdG1wICY9IH5DQTkxQ1g0Ml9MSU5UX1ZJUlFbbGV2ZWxdOwotCQlpb3dyaXRlMzIodG1wLCBjYTkxY3g0Ml9icmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKLQorCWlmICgoc3RhdGUgPT0gMCkgJiYgKHN5bmMgIT0gMCkpIHsKIAkJcGRldiA9IGNvbnRhaW5lcl9vZihjYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCwgc3RydWN0IHBjaV9kZXYsCiAJCQlkZXYpOwogCiAJCXN5bmNocm9uaXplX2lycShwZGV2LT5pcnEpOwogCX0KLQotCWNhOTFjeDQyX2JyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gTlVMTDsKLQljYTkxY3g0Ml9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gTlVMTDsKLQotCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKIH0KIAotaW50IGNhOTFjeDQyX2dlbmVyYXRlX2lycShpbnQgbGV2ZWwsIGludCBzdGF0aWQpCitpbnQgY2E5MWN4NDJfaXJxX2dlbmVyYXRlKGludCBsZXZlbCwgaW50IHN0YXRpZCkKIHsKIAl1MzIgdG1wOwogCkBAIC0xMDY1LDcgKzEwMTgsNiBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYV9xdWV1ZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaWFja19xdWV1ZSk7CiAJbXV0ZXhfaW5pdCgmKHZtZV9pbnQpKTsKLQltdXRleF9pbml0KCYodm1lX2lycSkpOwogCW11dGV4X2luaXQoJih2bWVfcm13KSk7CiAKIAljYTkxY3g0Ml9icmlkZ2UtPnBhcmVudCA9ICYocGRldi0+ZGV2KTsKQEAgLTExODIsOSArMTEzNCw4IEBACiAJY2E5MWN4NDJfYnJpZGdlLT5kbWFfbGlzdF9leGVjID0gY2E5MWN4NDJfZG1hX2xpc3RfZXhlYzsKIAljYTkxY3g0Ml9icmlkZ2UtPmRtYV9saXN0X2VtcHR5ID0gY2E5MWN4NDJfZG1hX2xpc3RfZW1wdHk7CiAjZW5kaWYKLQljYTkxY3g0Ml9icmlkZ2UtPnJlcXVlc3RfaXJxID0gY2E5MWN4NDJfcmVxdWVzdF9pcnE7Ci0JY2E5MWN4NDJfYnJpZGdlLT5mcmVlX2lycSA9IGNhOTFjeDQyX2ZyZWVfaXJxOwotCWNhOTFjeDQyX2JyaWRnZS0+Z2VuZXJhdGVfaXJxID0gY2E5MWN4NDJfZ2VuZXJhdGVfaXJxOworCWNhOTFjeDQyX2JyaWRnZS0+aXJxX3NldCA9IGNhOTFjeDQyX2lycV9zZXQ7CisJY2E5MWN4NDJfYnJpZGdlLT5pcnFfZ2VuZXJhdGUgPSBjYTkxY3g0Ml9pcnFfZ2VuZXJhdGU7CiAjaWYgMAogCWNhOTFjeDQyX2JyaWRnZS0+bG1fc2V0ID0gY2E5MWN4NDJfbG1fc2V0OwogCWNhOTFjeDQyX2JyaWRnZS0+bG1fZ2V0ID0gY2E5MWN4NDJfbG1fZ2V0OwpAQCAtMTIyMCw3ICsxMTcxLDkgQEAKIAl2bWVfdW5yZWdpc3Rlcl9icmlkZ2UoY2E5MWN4NDJfYnJpZGdlKTsKIGVycl9yZWc6CiAJY2E5MWN4NDJfY3Jjc3JfZXhpdChwZGV2KTsKKyNpZiAwCiBlcnJfY3Jjc3I6CisjZW5kaWYKIGVycl9sbToKIAkvKiByZXNvdXJjZXMgYXJlIHN0b3JlZCBpbiBsaW5rIGxpc3QgKi8KIAlsaXN0X2Zvcl9lYWNoKHBvcywgJihjYTkxY3g0Ml9icmlkZ2UtPmxtX3Jlc291cmNlcykpIHsKQEAgLTEyNzUsNyArMTIyOCw2IEBACiAJc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqc2xhdmVfaW1hZ2U7CiAJc3RydWN0IHZtZV9kbWFfcmVzb3VyY2UgKmRtYV9jdHJscjsKIAlzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbTsKLQlpbnQgaTsKIAogCS8qIFR1cm4gb2ZmIEludHMgKi8KIAlpb3dyaXRlMzIoMCwgY2E5MWN4NDJfYnJpZGdlLT5iYXNlICsgTElOVF9FTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCAwMGZlMDgwLi44OWE3ZGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKQEAgLTEzLDcgKzEzLDYgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC03OCw4ICs3Nyw2IEBACiAJCQkJICogT25seSBvbmUgVk1FIGludGVycnVwdCBjYW4gYmUKIAkJCQkgKiBnZW5lcmF0ZWQgYXQgYSB0aW1lLCBwcm92aWRlIGxvY2tpbmcKIAkJCQkgKi8KLXN0cnVjdCBtdXRleCB2bWVfaXJxOwkvKiBMb2NraW5nIGZvciBWTUUgaXJxIGNhbGxiYWNrIGNvbmZpZ3VyYXRpb24gKi8KLQogCiBzdGF0aWMgY2hhciBkcml2ZXJfbmFtZVtdID0gInZtZV90c2kxNDgiOwogCkBAIC0yNDAsNyArMjM3LDYgQEAKICAqLwogc3RhdGljIHUzMiB0c2kxNDhfSUFDS19pcnFoYW5kbGVyKHZvaWQpCiB7Ci0JcHJpbnRrKCJ0c2kxNDhfSUFDS19pcnFoYW5kbGVyXG4iKTsKIAl3YWtlX3VwKCZpYWNrX3F1ZXVlKTsKIAogCXJldHVybiBUU0kxNDhfTENTUl9JTlRDX0lBQ0tDOwpAQCAtMjUyLDggKzI0OCw2IEBACiBzdGF0aWMgdTMyIHRzaTE0OF9WSVJRX2lycWhhbmRsZXIodTMyIHN0YXQpCiB7CiAJaW50IHZlYywgaSwgc2VydmljZWQgPSAwOwotCXZvaWQgKCpjYWxsKShpbnQsIGludCwgdm9pZCAqKTsKLQl2b2lkICpwcml2X2RhdGE7CiAKIAlmb3IgKGkgPSA3OyBpID4gMDsgaS0tKSB7CiAJCWlmIChzdGF0ICYgKDEgPDwgaSkpIHsKQEAgLTI2NiwxNSArMjYwLDcgQEAKIAkJCXZlYyA9IGlvcmVhZDgodHNpMTQ4X2JyaWRnZS0+YmFzZSArCiAJCQkJVFNJMTQ4X0xDU1JfVklBQ0tbaV0gKyAzKTsKIAotCQkJY2FsbCA9IHRzaTE0OF9icmlkZ2UtPmlycVtpIC0gMV0uY2FsbGJhY2tbdmVjXS5mdW5jOwotCQkJcHJpdl9kYXRhID0KLQkJCQl0c2kxNDhfYnJpZGdlLT5pcnFbaS0xXS5jYWxsYmFja1t2ZWNdLnByaXZfZGF0YTsKLQotCQkJaWYgKGNhbGwgIT0gTlVMTCkKLQkJCQljYWxsKGksIHZlYywgcHJpdl9kYXRhKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoIlNwdXJpbG91cyBWTUUgaW50ZXJydXB0LCBsZXZlbDoleCwgIgotCQkJCQkidmVjdG9yOiV4XG4iLCBpLCB2ZWMpOworCQkJdm1lX2lycV9oYW5kbGVyKHRzaTE0OF9icmlkZ2UsIGksIHZlYyk7CiAKIAkJCXNlcnZpY2VkIHw9ICgxIDw8IGkpOwogCQl9CkBAIC0zNTQsNiArMzQwLDggQEAKIAkvKiBJbml0aWFsaXNlIGxpc3QgZm9yIFZNRSBidXMgZXJyb3JzICovCiAJSU5JVF9MSVNUX0hFQUQoJihicmlkZ2UtPnZtZV9lcnJvcnMpKTsKIAorCW11dGV4X2luaXQoJihicmlkZ2UtPmlycV9tdHgpKTsKKwogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwKIAkJCSAgICAgdHNpMTQ4X2lycWhhbmRsZXIsCiAJCQkgICAgIElSUUZfU0hBUkVELApAQCAtNDMzLDU1ICs0MjEsMTUgQEAKIH0KIAogLyoKLSAqIFNldCB1cCBhbiBWTUUgaW50ZXJydXB0CisgKiBDb25maWd1cmUgVk1FIGludGVycnVwdAogICovCi1pbnQgdHNpMTQ4X3JlcXVlc3RfaXJxKGludCBsZXZlbCwgaW50IHN0YXRpZCwKLQl2b2lkICgqY2FsbGJhY2spKGludCBsZXZlbCwgaW50IHZlY3Rvciwgdm9pZCAqcHJpdl9kYXRhKSwKLSAgICAgICAgdm9pZCAqcHJpdl9kYXRhKQordm9pZCB0c2kxNDhfaXJxX3NldChpbnQgbGV2ZWwsIGludCBzdGF0ZSwgaW50IHN5bmMpCiB7Ci0JdTMyIHRtcDsKLQotCW11dGV4X2xvY2soJih2bWVfaXJxKSk7Ci0KLQlpZih0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMpIHsKLQkJbXV0ZXhfdW5sb2NrKCYodm1lX2lycSkpOwotCQlwcmludGsoIlZNRSBJbnRlcnJ1cHQgYWxyZWFkeSB0YWtlblxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0KLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudCsrOwotCXRzaTE0OF9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gcHJpdl9kYXRhOwotCXRzaTE0OF9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0uZnVuYyA9IGNhbGxiYWNrOwotCi0JLyogRW5hYmxlIElSUSBsZXZlbCAqLwotCXRtcCA9IGlvcmVhZDMyYmUodHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVPKTsKLQl0bXAgfD0gVFNJMTQ4X0xDU1JfSU5URU9fSVJRRU9bbGV2ZWwgLSAxXTsKLQlpb3dyaXRlMzJiZSh0bXAsIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTyk7Ci0KLQl0bXAgPSBpb3JlYWQzMmJlKHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7Ci0JdG1wIHw9IFRTSTE0OF9MQ1NSX0lOVEVOX0lSUUVOW2xldmVsIC0gMV07Ci0JaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwotCi0JbXV0ZXhfdW5sb2NrKCYodm1lX2lycSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGcmVlIFZNRSBpbnRlcnJ1cHQKLSAqLwotdm9pZCB0c2kxNDhfZnJlZV9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkKQotewotCXUzMiB0bXA7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdTMyIHRtcDsKIAotCW11dGV4X2xvY2soJih2bWVfaXJxKSk7Ci0KLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudC0tOwotCi0JLyogRGlzYWJsZSBJUlEgbGV2ZWwgaWYgbm8gbW9yZSBpbnRlcnJ1cHRzIGF0dGFjaGVkIGF0IHRoaXMgbGV2ZWwqLwotCWlmICh0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudCA9PSAwKSB7CisJLyogV2UgbmVlZCB0byBkbyB0aGUgb3JkZXJpbmcgZGlmZmVyZW50bHkgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgKi8KKwlpZiAoc3RhdGUgPT0gMCkgewogCQl0bXAgPSBpb3JlYWQzMmJlKHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTik7CiAJCXRtcCAmPSB+VFNJMTQ4X0xDU1JfSU5URU5fSVJRRU5bbGV2ZWwgLSAxXTsKIAkJaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwpAQCAtNDkwLDIyICs0MzgsMjggQEAKIAkJdG1wICY9IH5UU0kxNDhfTENTUl9JTlRFT19JUlFFT1tsZXZlbCAtIDFdOwogCQlpb3dyaXRlMzJiZSh0bXAsIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRFTyk7CiAKLQkJcGRldiA9IGNvbnRhaW5lcl9vZih0c2kxNDhfYnJpZGdlLT5wYXJlbnQsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOworCQlpZiAoc3luYyAhPSAwKSB7CisJCQlwZGV2ID0gY29udGFpbmVyX29mKHRzaTE0OF9icmlkZ2UtPnBhcmVudCwKKwkJCQlzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKIAotCQlzeW5jaHJvbml6ZV9pcnEocGRldi0+aXJxKTsKKwkJCXN5bmNocm9uaXplX2lycShwZGV2LT5pcnEpOworCQl9CisJfSBlbHNlIHsKKwkJdG1wID0gaW9yZWFkMzJiZSh0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOworCQl0bXAgfD0gVFNJMTQ4X0xDU1JfSU5URU9fSVJRRU9bbGV2ZWwgLSAxXTsKKwkJaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOworCisJCXRtcCA9IGlvcmVhZDMyYmUodHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKKwkJdG1wIHw9IFRTSTE0OF9MQ1NSX0lOVEVOX0lSUUVOW2xldmVsIC0gMV07CisJCWlvd3JpdGUzMmJlKHRtcCwgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEVOKTsKIAl9Ci0KLQl0c2kxNDhfYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBOVUxMOwotCXRzaTE0OF9icmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gTlVMTDsKLQotCW11dGV4X3VubG9jaygmKHZtZV9pcnEpKTsKIH0KIAogLyoKICAqIEdlbmVyYXRlIGEgVk1FIGJ1cyBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCBsZXZlbCAmIHZlY3Rvci4gV2FpdCBmb3IKICAqIGludGVycnVwdCB0byBiZSBhY2tlZC4KICAqLwotaW50IHRzaTE0OF9nZW5lcmF0ZV9pcnEoaW50IGxldmVsLCBpbnQgc3RhdGlkKQoraW50IHRzaTE0OF9pcnFfZ2VuZXJhdGUoaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXUzMiB0bXA7CiAKQEAgLTg5MSw3ICs4NDUsNyBAQAogCQlpbWFnZS0+cGNpX3Jlc291cmNlLnN0YXJ0KTsKIAogCS8qIElmIHRoZSBleGlzdGluZyBzaXplIGlzIE9LLCByZXR1cm4gKi8KLQlpZiAoZXhpc3Rpbmdfc2l6ZSA9PSAoc2l6ZSAtIDEpKQorCWlmICgoc2l6ZSAhPSAwKSAmJiAoZXhpc3Rpbmdfc2l6ZSA9PSAoc2l6ZSAtIDEpKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZXhpc3Rpbmdfc2l6ZSAhPSAwKSB7CkBAIC05MDMsNiArODU3LDExIEBACiAJCW1lbXNldCgmKGltYWdlLT5wY2lfcmVzb3VyY2UpLCAwLCBzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJfQogCisJLyogRXhpdCBoZXJlIGlmIHNpemUgaXMgemVybyAqLworCWlmIChzaXplID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCiAJaWYgKGltYWdlLT5wY2lfcmVzb3VyY2UubmFtZSA9PSBOVUxMKSB7CiAJCWltYWdlLT5wY2lfcmVzb3VyY2UubmFtZSA9IGttYWxsb2MoVk1FTkFNU0laKzMsIEdGUF9LRVJORUwpOwogCQlpZiAoaW1hZ2UtPnBjaV9yZXNvdXJjZS5uYW1lID09IE5VTEwpIHsKQEAgLTk4MSwxMiArOTQwLDEzIEBACiAKIAkvKiBWZXJpZnkgaW5wdXQgZGF0YSAqLwogCWlmICh2bWVfYmFzZSAmIDB4RkZGRikgewotCQlwcmludGsoIkludmFsaWQgVk1FIFdpbmRvdyBhbGlnbm1lbnRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgVk1FIFdpbmRvdyBhbGlnbm1lbnRcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl93aW5kb3c7CiAJfQotCWlmIChzaXplIDwgMHgxMDAwMCkgewotCQlwcmludGsoIkludmFsaWQgVk1FIFdpbmRvdyBzaXplXG4iKTsKKworCWlmICgoc2l6ZSA9PSAwKSAmJiAoZW5hYmxlZCAhPSAwKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNpemUgbXVzdCBiZSBub24temVybyBmb3IgZW5hYmxlZCB3aW5kb3dzXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfd2luZG93OwogCX0KQEAgLTk5NCwyNiArOTU0LDMxIEBACiAJc3Bpbl9sb2NrKCYoaW1hZ2UtPmxvY2spKTsKIAogCS8qIExldCdzIGFsbG9jYXRlIHRoZSByZXNvdXJjZSBoZXJlIHJhdGhlciB0aGFuIGZ1cnRoZXIgdXAgdGhlIHN0YWNrIGFzCi0JICogaXQgYXZvaWRzIHB1c2hpbmcgbG9hZHMgb2YgYnVzIGRlcGVuZGFudCBzdHVmZiB1cCB0aGUgc3RhY2sKKwkgKiBpdCBhdm9pZHMgcHVzaGluZyBsb2FkcyBvZiBidXMgZGVwZW5kYW50IHN0dWZmIHVwIHRoZSBzdGFjay4gSWYgc2l6ZQorCSAqIGlzIHplcm8sIGFueSBleGlzdGluZyByZXNvdXJjZSB3aWxsIGJlIGZyZWVkLgogCSAqLwogCXJldHZhbCA9IHRzaTE0OF9hbGxvY19yZXNvdXJjZShpbWFnZSwgc2l6ZSk7CiAJaWYgKHJldHZhbCkgewogCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzb3VyY2UgIgotCQkJIm5hbWVcbiIpOwotCQlyZXR2YWwgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCSJyZXNvdXJjZVxuIik7CiAJCWdvdG8gZXJyX3JlczsKIAl9CiAKLQlwY2lfYmFzZSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpaW1hZ2UtPnBjaV9yZXNvdXJjZS5zdGFydDsKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXBjaV9iYXNlID0gMDsKKwkJcGNpX2JvdW5kID0gMDsKKwkJdm1lX29mZnNldCA9IDA7CisJfSBlbHNlIHsKKwkJcGNpX2Jhc2UgPSAodW5zaWduZWQgbG9uZyBsb25nKWltYWdlLT5wY2lfcmVzb3VyY2Uuc3RhcnQ7CiAKLQotCS8qCi0JICogQm91bmQgYWRkcmVzcyBpcyBhIHZhbGlkIGFkZHJlc3MgZm9yIHRoZSB3aW5kb3csIGFkanVzdAotCSAqIGFjY29yZGluZyB0byB3aW5kb3cgZ3JhbnVsYXJpdHkuCi0JICovCi0JcGNpX2JvdW5kID0gcGNpX2Jhc2UgKyAoc2l6ZSAtIDB4MTAwMDApOwotCXZtZV9vZmZzZXQgPSB2bWVfYmFzZSAtIHBjaV9iYXNlOworCQkvKgorCQkgKiBCb3VuZCBhZGRyZXNzIGlzIGEgdmFsaWQgYWRkcmVzcyBmb3IgdGhlIHdpbmRvdywgYWRqdXN0CisJCSAqIGFjY29yZGluZyB0byB3aW5kb3cgZ3JhbnVsYXJpdHkuCisJCSAqLworCQlwY2lfYm91bmQgPSBwY2lfYmFzZSArIChzaXplIC0gMHgxMDAwMCk7CisJCXZtZV9vZmZzZXQgPSB2bWVfYmFzZSAtIHBjaV9iYXNlOworCX0KIAogCS8qIENvbnZlcnQgNjQtYml0IHZhcmlhYmxlcyB0byAyeCAzMi1iaXQgdmFyaWFibGVzICovCiAJcmVnX3NwbGl0KHBjaV9iYXNlLCAmcGNpX2Jhc2VfaGlnaCwgJnBjaV9iYXNlX2xvdyk7CkBAIC0xMDIyLDE5ICs5ODcsMTkgQEAKIAogCWlmIChwY2lfYmFzZV9sb3cgJiAweEZGRkYpIHsKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoIkludmFsaWQgUENJIGJhc2UgYWxpZ25tZW50XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIFBDSSBiYXNlIGFsaWdubWVudFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2dyYW47CiAJfQogCWlmIChwY2lfYm91bmRfbG93ICYgMHhGRkZGKSB7CiAJCXNwaW5fdW5sb2NrKCYoaW1hZ2UtPmxvY2spKTsKLQkJcHJpbnRrKCJJbnZhbGlkIFBDSSBib3VuZCBhbGlnbm1lbnRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgUENJIGJvdW5kIGFsaWdubWVudFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2dyYW47CiAJfQogCWlmICh2bWVfb2Zmc2V0X2xvdyAmIDB4RkZGRikgewogCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7Ci0JCXByaW50aygiSW52YWxpZCBWTUUgT2Zmc2V0IGFsaWdubWVudFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBWTUUgT2Zmc2V0IGFsaWdubWVudFxuIik7CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2dyYW47CiAJfQpAQCAtMTA5NCw3ICsxMDU5LDggQEAKIAkJdGVtcF9jdGwgfD0gVFNJMTQ4X0xDU1JfT1RBVF9UTV8yZVNTVDsKIAl9CiAJaWYgKGN5Y2xlICYgVk1FXzJlU1NUQikgewotCQlwcmludGsoIkN1cnJlbnRseSBub3Qgc2V0dGluZyBCcm9hZGNhc3QgU2VsZWN0IFJlZ2lzdGVyc1xuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkN1cnJlbnRseSBub3Qgc2V0dGluZyBCcm9hZGNhc3QgU2VsZWN0ICIKKwkJCSJSZWdpc3RlcnNcbiIpOwogCQl0ZW1wX2N0bCAmPSB+VFNJMTQ4X0xDU1JfT1RBVF9UTV9NOwogCQl0ZW1wX2N0bCB8PSBUU0kxNDhfTENTUl9PVEFUX1RNXzJlU1NUQjsKIAl9CkBAIC0xMTEwLDcgKzEwNzYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlzcGluX3VubG9jaygmKGltYWdlLT5sb2NrKSk7Ci0JCXByaW50aygiSW52YWxpZCBkYXRhIHdpZHRoXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGRhdGEgd2lkdGhcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9kd2lkdGg7CiAJfQpAQCAtMTE0Nyw3ICsxMTEzLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc3Bpbl91bmxvY2soJihpbWFnZS0+bG9jaykpOwotCQlwcmludGsoIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBhZGRyZXNzIHNwYWNlXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnJfYXNwYWNlOwogCQlicmVhazsKQEAgLTIxNTQsNyArMjEyMCw3IEBACiAJaW93cml0ZTMyYmUodG1wLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwogCiAJaW93cml0ZTMyYmUoVFNJMTQ4X0xDU1JfSU5UQ19MTUNbbW9uaXRvcl0sCi0JCSB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOworCQkgdHNpMTQ4X2JyaWRnZS0+YmFzZSArIFRTSTE0OF9MQ1NSX0lOVEMpOwogCiAJLyogRGV0YWNoIGNhbGxiYWNrICovCiAJbG1fY2FsbGJhY2tbbW9uaXRvcl0gPSBOVUxMOwpAQCAtMjMzNCw3ICsyMzAwLDYgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFfcXVldWVbMV0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlhY2tfcXVldWUpOwogCW11dGV4X2luaXQoJih2bWVfaW50KSk7Ci0JbXV0ZXhfaW5pdCgmKHZtZV9pcnEpKTsKIAltdXRleF9pbml0KCYodm1lX3JtdykpOwogCiAJdHNpMTQ4X2JyaWRnZS0+cGFyZW50ID0gJihwZGV2LT5kZXYpOwpAQCAtMjQ4Miw5ICsyNDQ3LDggQEAKIAl0c2kxNDhfYnJpZGdlLT5kbWFfbGlzdF9hZGQgPSB0c2kxNDhfZG1hX2xpc3RfYWRkOwogCXRzaTE0OF9icmlkZ2UtPmRtYV9saXN0X2V4ZWMgPSB0c2kxNDhfZG1hX2xpc3RfZXhlYzsKIAl0c2kxNDhfYnJpZGdlLT5kbWFfbGlzdF9lbXB0eSA9IHRzaTE0OF9kbWFfbGlzdF9lbXB0eTsKLQl0c2kxNDhfYnJpZGdlLT5yZXF1ZXN0X2lycSA9IHRzaTE0OF9yZXF1ZXN0X2lycTsKLQl0c2kxNDhfYnJpZGdlLT5mcmVlX2lycSA9IHRzaTE0OF9mcmVlX2lycTsKLQl0c2kxNDhfYnJpZGdlLT5nZW5lcmF0ZV9pcnEgPSB0c2kxNDhfZ2VuZXJhdGVfaXJxOworCXRzaTE0OF9icmlkZ2UtPmlycV9zZXQgPSB0c2kxNDhfaXJxX3NldDsKKwl0c2kxNDhfYnJpZGdlLT5pcnFfZ2VuZXJhdGUgPSB0c2kxNDhfaXJxX2dlbmVyYXRlOwogCXRzaTE0OF9icmlkZ2UtPmxtX3NldCA9IHRzaTE0OF9sbV9zZXQ7CiAJdHNpMTQ4X2JyaWRnZS0+bG1fZ2V0ID0gdHNpMTQ4X2xtX2dldDsKIAl0c2kxNDhfYnJpZGdlLT5sbV9hdHRhY2ggPSB0c2kxNDhfbG1fYXR0YWNoOwpAQCAtMjYxNywxMyArMjU4MSw2IEBACiAJfQogCiAJLyoKLQkgKiAgRGlzYWJsZSBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMuCi0JICovCi0JaW93cml0ZTMyYmUoMHgwLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU8pOwotCWlvd3JpdGUzMmJlKDB4RkZGRkZGRkYsIHRzaTE0OF9icmlkZ2UtPmJhc2UgKyBUU0kxNDhfTENTUl9JTlRDKTsKLQlpb3dyaXRlMzJiZSgweEZGRkZGRkZGLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwotCi0JLyoKIAkgKiAgTWFwIGFsbCBJbnRlcnJ1cHRzIHRvIFBDSSBJTlRBCiAJICovCiAJaW93cml0ZTMyYmUoMHgwLCB0c2kxNDhfYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5UTTEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwppbmRleCA3ODkxMjg4Li5lMjI4OTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC02MjUsNyArNjI0LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsIGludCBjdXJfc2xvdCkKIHsKIAlpbnQgaSwgZXJyOwotCWNoYXIgbmFtZVs4XTsKKwljaGFyIG5hbWVbMTJdOwogCiAJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBicmlkZ2UgZGV2aWNlICovCiAJaWYgKHZtZV91c2VyX2JyaWRnZSAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYwppbmRleCA0NzdhMWFkLi45OTRmZGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKQEAgLTEzLDcgKzEzLDYgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC02NDQsNyArNjQzLDcgQEAKICAqIFJlcXVlc3QgYSBETUEgY29udHJvbGxlciB3aXRoIHNwZWNpZmljIGF0dHJpYnV0ZXMsIHJldHVybiBzb21lIHVuaXF1ZQogICogaWRlbnRpZmllci4KICAqLwotc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX3JlcXVlc3RfZG1hKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkbWFfcG9zID0gTlVMTDsKQEAgLTcwNSw3ICs3MDQsNyBAQAogZXJyX2J1czoKIAlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0wodm1lX3JlcXVlc3RfZG1hKTsKK0VYUE9SVF9TWU1CT0wodm1lX2RtYV9yZXF1ZXN0KTsKIAogLyoKICAqIFN0YXJ0IG5ldyBsaXN0CkBAIC04ODAsNyArODc5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKG11dGV4X3RyeWxvY2soJihsaXN0LT5tdHgpKSkgeworCWlmICghbXV0ZXhfdHJ5bG9jaygmKGxpc3QtPm10eCkpKSB7CiAJCXByaW50aygiTGluayBMaXN0IGFscmVhZHkgc3VibWl0dGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTIzLDcgKzkyMiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChtdXRleF90cnlsb2NrKCYobGlzdC0+bXR4KSkpIHsKKwlpZiAoIW11dGV4X3RyeWxvY2soJihsaXN0LT5tdHgpKSkgewogCQlwcmludGsoIkxpbmsgTGlzdCBpbiB1c2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05NTYsNyArOTU1LDcgQEAKIAogCWN0cmxyID0gbGlzdF9lbnRyeShyZXNvdXJjZS0+ZW50cnksIHN0cnVjdCB2bWVfZG1hX3Jlc291cmNlLCBsaXN0KTsKIAotCWlmIChtdXRleF90cnlsb2NrKCYoY3RybHItPm10eCkpKSB7CisJaWYgKCFtdXRleF90cnlsb2NrKCYoY3RybHItPm10eCkpKSB7CiAJCXByaW50aygiUmVzb3VyY2UgYnVzeSwgY2FuJ3QgZnJlZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtOTc1LDcgKzk3NCwyMyBAQAogfQogRVhQT1JUX1NZTUJPTCh2bWVfZG1hX2ZyZWUpOwogCi1pbnQgdm1lX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkLAordm9pZCB2bWVfaXJxX2hhbmRsZXIoc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZSwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQoreworCXZvaWQgKCpjYWxsKShpbnQsIGludCwgdm9pZCAqKTsKKwl2b2lkICpwcml2X2RhdGE7CisKKwljYWxsID0gYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmM7CisJcHJpdl9kYXRhID0gYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLnByaXZfZGF0YTsKKworCWlmIChjYWxsICE9IE5VTEwpCisJCWNhbGwobGV2ZWwsIHN0YXRpZCwgcHJpdl9kYXRhKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNwdXJpbG91cyBWTUUgaW50ZXJydXB0LCBsZXZlbDoleCwgIgorCQkJInZlY3RvcjoleFxuIiwgbGV2ZWwsIHN0YXRpZCk7Cit9CitFWFBPUlRfU1lNQk9MKHZtZV9pcnFfaGFuZGxlcik7CisKK2ludCB2bWVfaXJxX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQsCiAJdm9pZCAoKmNhbGxiYWNrKShpbnQgbGV2ZWwsIGludCB2ZWN0b3IsIHZvaWQgKnByaXZfZGF0YSksCiAJdm9pZCAqcHJpdl9kYXRhKQogewpAQCAtOTg4LDIwICsxMDAzLDM3IEBACiAJfQogCiAJaWYoKGxldmVsIDwgMSkgfHwgKGxldmVsID4gNykpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW52YWxpZCBpbnRlcnJ1cHQgbGV2ZWxcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IGxldmVsXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGJyaWRnZS0+cmVxdWVzdF9pcnEgPT0gTlVMTCkgewotCQlwcmludGsoIlJlZ2lzdGVyaW5nIGludGVycnVwdHMgbm90IHN1cHBvcnRlZFxuIik7CisJaWYgKGJyaWRnZS0+aXJxX3NldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ29uZmlndXJpbmcgaW50ZXJydXB0cyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIGJyaWRnZS0+cmVxdWVzdF9pcnEobGV2ZWwsIHN0YXRpZCwgY2FsbGJhY2ssIHByaXZfZGF0YSk7CisJbXV0ZXhfbG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCisJaWYgKGJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jKSB7CisJCW11dGV4X3VubG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWTUUgSW50ZXJydXB0IGFscmVhZHkgdGFrZW5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQrKzsKKwlicmlkZ2UtPmlycVtsZXZlbCAtIDFdLmNhbGxiYWNrW3N0YXRpZF0ucHJpdl9kYXRhID0gcHJpdl9kYXRhOworCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5mdW5jID0gY2FsbGJhY2s7CisKKwkvKiBFbmFibGUgSVJRIGxldmVsICovCisJYnJpZGdlLT5pcnFfc2V0KGxldmVsLCAxLCAxKTsKKworCW11dGV4X3VubG9jaygmKGJyaWRnZS0+aXJxX210eCkpOworCisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHZtZV9yZXF1ZXN0X2lycSk7CitFWFBPUlRfU1lNQk9MKHZtZV9pcnFfcmVxdWVzdCk7CiAKLXZvaWQgdm1lX2ZyZWVfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQordm9pZCB2bWVfaXJxX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKIApAQCAtMTAxMiwyMCArMTA0NCwzMSBAQAogCX0KIAogCWlmKChsZXZlbCA8IDEpIHx8IChsZXZlbCA+IDcpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkludmFsaWQgaW50ZXJydXB0IGxldmVsXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBsZXZlbFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYnJpZGdlLT5mcmVlX2lycSA9PSBOVUxMKSB7Ci0JCXByaW50aygiRnJlZWluZyBpbnRlcnJ1cHRzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWlmIChicmlkZ2UtPmlycV9zZXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvbmZpZ3VyaW5nIGludGVycnVwdHMgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlicmlkZ2UtPmZyZWVfaXJxKGxldmVsLCBzdGF0aWQpOworCW11dGV4X2xvY2soJihicmlkZ2UtPmlycV9tdHgpKTsKKworCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY291bnQtLTsKKworCS8qIERpc2FibGUgSVJRIGxldmVsIGlmIG5vIG1vcmUgaW50ZXJydXB0cyBhdHRhY2hlZCBhdCB0aGlzIGxldmVsKi8KKwlpZiAoYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jb3VudCA9PSAwKQorCQlicmlkZ2UtPmlycV9zZXQobGV2ZWwsIDAsIDEpOworCisJYnJpZGdlLT5pcnFbbGV2ZWwgLSAxXS5jYWxsYmFja1tzdGF0aWRdLmZ1bmMgPSBOVUxMOworCWJyaWRnZS0+aXJxW2xldmVsIC0gMV0uY2FsbGJhY2tbc3RhdGlkXS5wcml2X2RhdGEgPSBOVUxMOworCisJbXV0ZXhfdW5sb2NrKCYoYnJpZGdlLT5pcnFfbXR4KSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHZtZV9mcmVlX2lycSk7CitFWFBPUlRfU1lNQk9MKHZtZV9pcnFfZnJlZSk7CiAKLWludCB2bWVfZ2VuZXJhdGVfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQoraW50IHZtZV9pcnFfZ2VuZXJhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKIApAQCAtMTA0MCwxNCArMTA4MywxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoYnJpZGdlLT5nZW5lcmF0ZV9pcnEgPT0gTlVMTCkgeworCWlmIChicmlkZ2UtPmlycV9nZW5lcmF0ZSA9PSBOVUxMKSB7CiAJCXByaW50aygiSW50ZXJydXB0IGdlbmVyYXRpb24gbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBicmlkZ2UtPmdlbmVyYXRlX2lycShsZXZlbCwgc3RhdGlkKTsKKwlyZXR1cm4gYnJpZGdlLT5pcnFfZ2VuZXJhdGUobGV2ZWwsIHN0YXRpZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHZtZV9nZW5lcmF0ZV9pcnEpOworRVhQT1JUX1NZTUJPTCh2bWVfaXJxX2dlbmVyYXRlKTsKIAogLyoKICAqIFJlcXVlc3QgdGhlIGxvY2F0aW9uIG1vbml0b3IsIHJldHVybiByZXNvdXJjZSBvciBOVUxMCkBAIC0xMTQ4LDcgKzExOTEsNyBAQAogCiAJLyogWFhYIENoZWNrIHBhcmFtZXRlcnMgKi8KIAotCXJldHVybiBsbS0+cGFyZW50LT5sbV9zZXQobG0sIGxtX2Jhc2UsIGFzcGFjZSwgY3ljbGUpOworCXJldHVybiBicmlkZ2UtPmxtX3NldChsbSwgbG1fYmFzZSwgYXNwYWNlLCBjeWNsZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZtZV9sbV9zZXQpOwogCkBAIC0xMjI4LDE2ICsxMjcxLDE4IEBACiAKIAlsbSA9IGxpc3RfZW50cnkocmVzb3VyY2UtPmVudHJ5LCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKIAotCWlmIChtdXRleF90cnlsb2NrKCYobG0tPm10eCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUmVzb3VyY2UgYnVzeSwgY2FuJ3QgZnJlZVxuIik7Ci0JCXJldHVybjsKLQl9CisJbXV0ZXhfbG9jaygmKGxtLT5tdHgpKTsKIAotCS8qIFhYWCBDaGVjayB0byBzZWUgdGhhdCB0aGVyZSBhcmVuJ3QgYW55IGNhbGxiYWNrcyBzdGlsbCBhdHRhY2hlZCAqLworCS8qIFhYWAorCSAqIENoZWNrIHRvIHNlZSB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgY2FsbGJhY2tzIHN0aWxsIGF0dGFjaGVkLCBpZgorCSAqIHRoZXJlIGFyZSB3ZSBzaG91bGQgcHJvYmFibHkgYmUgZGV0YWNoaW5nIHRoZW0hCisJICovCiAKIAlsbS0+bG9ja2VkID0gMDsKIAogCW11dGV4X3VubG9jaygmKGxtLT5tdHgpKTsKKworCWtmcmVlKHJlc291cmNlKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2xtX2ZyZWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaAppbmRleCA2MjA2ZTkxLi45N2RjMjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmgKQEAgLTEyMyw3ICsxMjMsNyBAQAogCXVuc2lnbmVkIGludCwgbG9mZl90KTsKIHZvaWQgdm1lX21hc3Rlcl9mcmVlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiAKLXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9yZXF1ZXN0X2RtYShzdHJ1Y3QgZGV2aWNlICopOworc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX2RtYV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKik7CiBzdHJ1Y3Qgdm1lX2RtYV9saXN0ICp2bWVfbmV3X2RtYV9saXN0KHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiBzdHJ1Y3Qgdm1lX2RtYV9hdHRyICp2bWVfZG1hX3BhdHRlcm5fYXR0cmlidXRlKHUzMiwgdm1lX3BhdHRlcm5fdCk7CiBzdHJ1Y3Qgdm1lX2RtYV9hdHRyICp2bWVfZG1hX3BjaV9hdHRyaWJ1dGUoZG1hX2FkZHJfdCk7CkBAIC0xMzYsMTAgKzEzNiwxMCBAQAogaW50IHZtZV9kbWFfbGlzdF9mcmVlKHN0cnVjdCB2bWVfZG1hX2xpc3QgKik7CiBpbnQgdm1lX2RtYV9mcmVlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiAKLWludCB2bWVfcmVxdWVzdF9pcnEoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCwKK2ludCB2bWVfaXJxX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCwKIAl2b2lkICgqY2FsbGJhY2spKGludCwgaW50LCB2b2lkICopLCB2b2lkICopOwotdm9pZCB2bWVfZnJlZV9pcnEoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7Ci1pbnQgdm1lX2dlbmVyYXRlX2lycShzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50KTsKK3ZvaWQgdm1lX2lycV9mcmVlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOworaW50IHZtZV9pcnFfZ2VuZXJhdGUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7CiAKIHN0cnVjdCB2bWVfcmVzb3VyY2UgKiB2bWVfbG1fcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICopOwogaW50IHZtZV9sbV9jb3VudChzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYXBpLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2FwaS50eHQKaW5kZXggNTkxZWJhNS4uYTVjMWIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYXBpLnR4dAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9hcGkudHh0CkBAIC03Nyw3ICs3Nyw3IEBACiAJc3RydWN0IHZtZV9yZXNvdXJjZSAqIHZtZV9zbGF2ZV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKTsKIAotCXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9yZXF1ZXN0X2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBGb3Igc2xhdmUgd2luZG93cyB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBzcGxpdCBpbnRvIHRob3NlIG9mIHR5cGUgJ3ZtZV9hZGRyZXNzX3QnCiBhbmQgJ3ZtZV9jeWNsZV90Jy4gTWFzdGVyIHdpbmRvd3MgYWRkIGEgZnVydGhlciBzZXQgb2YgYXR0cmlidXRlcyAndm1lX2N5Y2xlX3QnLgpAQCAtMjkwLDEwICsyOTAsMTAgQEAKIGNhbGxiYWNrIGZ1bmN0aW9uLiBBIHZvaWQgcG9pbnRlciBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHRoZSB2YWx1ZSBvZiB3aGljaCBpcwogcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgdGhlIHVzZSBvZiB0aGlzIHBvaW50ZXIgaXMgdXNlciB1bmRlZmluZWQ6CiAKLQlpbnQgdm1lX3JlcXVlc3RfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkLAorCWludCB2bWVfaXJxX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQsCiAJCXZvaWQgKCpjYWxsYmFjaykoaW50LCBpbnQsIHZvaWQgKiksIHZvaWQgKnByaXYpOwogCi0Jdm9pZCB2bWVfZnJlZV9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpOworCXZvaWQgdm1lX2lycV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKTsKIAogVGhlIGNhbGxiYWNrIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3MuIENhcmUgbXVzdCBiZSB0YWtlbiBpbiB3cml0aW5nIGEgY2FsbGJhY2sKIGZ1bmN0aW9uLCBjYWxsYmFjayBmdW5jdGlvbnMgcnVuIGluIGludGVycnVwdCBjb250ZXh0OgpAQCAtMzA3LDcgKzMwNyw3IEBACiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgVk1FIGludGVycnVwdCBhdCBhIGdpdmVuIFZNRQogbGV2ZWwgYW5kIFZNRSBzdGF0dXMgSUQ6CiAKLQlpbnQgdm1lX2dlbmVyYXRlX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCk7CisJaW50IHZtZV9pcnFfZ2VuZXJhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpOwogCiAKIExvY2F0aW9uIG1vbml0b3JzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCmluZGV4IGU0M2NjMTkuLjg1MWZhOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCkBAIC0xMjAsNiArMTIwLDggQEAKIAogCS8qIEludGVycnVwdCBjYWxsYmFja3MgKi8KIAlzdHJ1Y3Qgdm1lX2lycSBpcnFbN107CisJLyogTG9ja2luZyBmb3IgVk1FIGlycSBjYWxsYmFjayBjb25maWd1cmF0aW9uICovCisJc3RydWN0IG11dGV4IGlycV9tdHg7CiAKIAkvKiBTbGF2ZSBGdW5jdGlvbnMgKi8KIAlpbnQgKCpzbGF2ZV9nZXQpIChzdHJ1Y3Qgdm1lX3NsYXZlX3Jlc291cmNlICosIGludCAqLApAQCAtMTQ5LDkgKzE1MSw4IEBACiAJaW50ICgqZG1hX2xpc3RfZW1wdHkpIChzdHJ1Y3Qgdm1lX2RtYV9saXN0ICopOwogCiAJLyogSW50ZXJydXB0IEZ1bmN0aW9ucyAqLwotCWludCAoKnJlcXVlc3RfaXJxKSAoaW50LCBpbnQsIHZvaWQgKCpjYmFjaykoaW50LCBpbnQsIHZvaWQqKSwgdm9pZCAqKTsKLQl2b2lkICgqZnJlZV9pcnEpIChpbnQsIGludCk7Ci0JaW50ICgqZ2VuZXJhdGVfaXJxKSAoaW50LCBpbnQpOworCXZvaWQgKCppcnFfc2V0KSAoaW50LCBpbnQsIGludCk7CisJaW50ICgqaXJxX2dlbmVyYXRlKSAoaW50LCBpbnQpOwogCiAJLyogTG9jYXRpb24gbW9uaXRvciBmdW5jdGlvbnMgKi8KIAlpbnQgKCpsbV9zZXQpIChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZywKQEAgLTE3NSw2ICsxNzYsOCBAQAogI2VuZGlmCiB9OwogCit2b2lkIHZtZV9pcnFfaGFuZGxlcihzdHJ1Y3Qgdm1lX2JyaWRnZSAqLCBpbnQsIGludCk7CisKIGludCB2bWVfcmVnaXN0ZXJfYnJpZGdlIChzdHJ1Y3Qgdm1lX2JyaWRnZSAqKTsKIHZvaWQgdm1lX3VucmVnaXN0ZXJfYnJpZGdlIChzdHJ1Y3Qgdm1lX2JyaWRnZSAqKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlLmgKaW5kZXggZmE3ZjBmYy4uY2RlNDRkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZS5oCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KQEAgLTc5LDcgKzc4LDYgQEAKIC8vIGRldmljZSBzcGVjaWZpYwogLy8KIAotI2luY2x1ZGUgImtjb21wYXQuaCIKICNpbmNsdWRlICJkZXZpY2VfY2ZnLmgiCiAjaW5jbHVkZSAidHR5cGUuaCIKICNpbmNsdWRlICI4MDIxMWhkci5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCmluZGV4IDUzNDUwYjQuLjBkYjhkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgaWYoem9uZXR5cGUhPXBEZXZpY2UtPmFieUVFUFJPTVtFRVBfT0ZTX1pPTkVUWVBFXSkKICAgICAgIHByaW50aygiem9uZXR5cGUgaW4gZmlsZVslMDJ4XSBtaXNtYXRjaCB3aXRoIGluIEVFUFJPTVslMDJ4XVxuIix6b25ldHlwZSxwRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV0pOwogICAgZWxzZQotICAgICAgcHJpbnRrKCJSZWFkIFpvbmV0eXBlIGZpbGUgc3VjZXNzLHVzZSBkZWZhdWx0IHpvbmV0eXBlIHNldHRpbmdbJTAyeF1cbiIsem9uZXR5cGUpOworICAgICAgcHJpbnRrKCJSZWFkIFpvbmV0eXBlIGZpbGUgc3VjY2Vzcyx1c2UgZGVmYXVsdCB6b25ldHlwZSBzZXR0aW5nWyUwMnhdXG4iLHpvbmV0eXBlKTsKICB9CiAgCX0KICAgZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jCmluZGV4IGZjOWNiZTAuLmQ5YTVmZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY3RsLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCSBlbHNlIGlmKHpvbmV0eXBlID09IDB4MDIpIHsgLy9FdXJvcGUKICAgICAgICAgICAgICBzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9FdXJvcGU7CiAJIH0KLQkgZWxzZSB7IC8vVW5rbm93IFpvbmVUeXBlCisJIGVsc2UgeyAvL1Vua25vd24gWm9uZVR5cGUKIAkgICAgICAgIHByaW50aygiRXJyb3I6Wm9uZVR5cGVbJXhdIFVua25vd24gPz8/XG4iLHpvbmV0eXBlKTsKIAkgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogCQlicmVhazsKQEAgLTY5Miw3ICs2OTIsNyBAQAogICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CiAgICB9CiAgICAjZW5kaWYKLSAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAgICAgICAgICAgLy9pcyBzdWNlc3NmdWwgcGVlciB0byB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ/CisgICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjY2Vzc2Z1bCBwZWVyIHRvIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD8KIH0KIAogICAgICAgICAvL3ByaW50aygiZ2V0IHByaXZhdGUgd3BhX3N1cHBsaWNhbnQgYW5ub3VuY2UgV1BBIFNNXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjYzNGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKgotICogRmlsZToga2NvbXBhdC5oCi0gKgotICogUHVycG9zZTogZGVmaW5lIGtlcm5lbCBjb21wYXRpYmlsaXR5IGhlYWRlcgotICoKLSAqIEF1dGhvcjogTHluZG9uIENoZW4KLSAqCi0gKiBEYXRlOiBBcHIgOCwgMjAwMgotICoKLSAqLwotCi0jaWZuZGVmIF9LQ09NUEFUX0gKLSNkZWZpbmUgX0tDT01QQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0jaWZuZGVmIEhBVkVfTkVUREVWX1BSSVYKLSNkZWZpbmUgbmV0ZGV2X3ByaXYoZGV2KSAoZGV2LT5wcml2KQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuaAppbmRleCA2OWUwNGY3Li4yYWEyYjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmgKQEAgLTMyNSwxMCArMzI1LDEwIEBACiAgICAjaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgICAgICAvL1R4IGNvdW50OgogICAgIFVMT05HIFR4Tm9SZXRyeU9rQ291bnQ7ICAgICAgICAgLy9zdWNjZXNzIHR4IG5vIHJldHJ5ICEKLSAgICBVTE9ORyBUeFJldHJ5T2tDb3VudDsgICAgICAgICAgICAgIC8vc3VjZXNzIHR4IGJ1dCByZXRyeSAhCisgICAgVUxPTkcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2Nlc3MgdHggYnV0IHJldHJ5ICEKICAgICBVTE9ORyBUeEZhaWxDb3VudDsgICAgICAgICAgICAgICAgICAgICAgLy9mYWlsIHR4ID8KICAgICAgIC8vUnggY291bnQ6Ci0gICAgVUxPTkcgUnhPa0NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VjZXNzIHJ4ICEKKyAgICBVTE9ORyBSeE9rQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdWNjZXNzIHJ4ICEKICAgICBVTE9ORyBSeEZjc0VyckNudDsgICAgICAgICAgICAgICAgICAgIC8vZmFpbCByeCA/CiAgICAgICAvL3N0YXRpc3RpYwogICAgIFVMT05HIFNpZ25hbFN0cmVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguaAppbmRleCAxN2JkMWIxLi41ZGE4MTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguaApAQCAtMzUsMTcgKzM1LDEwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgQ2xhc3NlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIEMgZGVjbGFyYXRpb25zIGZvciBDKysgKi8KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAvKgogVk9JRCB2R2VuZXJhdGVNQUNIZWFkZXIoCiAgICAgSU4gUFNEZXZpY2UgcERldmljZSwKQEAgLTExMSwxNCArMTA0LDQgQEAKIENNRF9TVEFUVVMgY3NNZ210X3htaXQoUFNEZXZpY2UgcERldmljZSwgUFNUeE1nbXRQYWNrZXQgcFBhY2tldCk7CiBDTURfU1RBVFVTIGNzQmVhY29uX3htaXQoUFNEZXZpY2UgcERldmljZSwgUFNUeE1nbXRQYWNrZXQgcFBhY2tldCk7CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBleHRlcm4gIkMiIHsgKi8KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLQotCiAjZW5kaWYgLy8gX19SWFRYX0hfXwotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93Y21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYwppbmRleCBkODFmNWI3Li5jOWVhYmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3djbWQuYwpAQCAtNDgsNyArNDgsNiBAQAogI2luY2x1ZGUgIndtZ3IuaCIKICNpbmNsdWRlICJwb3dlci5oIgogI2luY2x1ZGUgIndjdGwuaCIKLSNpbmNsdWRlICJjYXJkLmgiCiAjaW5jbHVkZSAiYmFzZWJhbmQuaCIKICNpbmNsdWRlICJyeHR4LmgiCiAjaW5jbHVkZSAicmYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYS5jCmluZGV4IGY5MmQzM2YuLjVkYTY3MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGEuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIGlmIChwUlNOLT5sZW4gPj0gMTIpIC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKQogICAgICAgICB7CiAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id1BLQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSk6ICVsZFxuIiwgcFJTTi0+d1BLQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKSk7CisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndQS0NvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpOiAlenVcbiIsIHBSU04tPndQS0NvdW50LCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSkpOwogICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBSU04tPndQS0NvdW50KSAmJiAoaiA8IHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKS9zaXplb2YoQllURSkpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTIraSo0KzQpIHsgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpK1BLUyg0KmkpCiAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNtcChwUlNOLT5QS1NMaXN0W2ldLmFieU9VSSwgYWJ5T1VJMDAsIDQpKQpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICAvLyBvdmVybGF5IElFX1JTTl9BdXRoIHN0cnVjdHVyZSBpbnRvIGNvcnJlY3QgcGxhY2UKICAgICAgICAgICAgIHBJRV9SU05fQXV0aCA9IChQV0xBTl9JRV9SU05fQVVUSCkgcFJTTi0+UEtTTGlzdFttXS5hYnlPVUk7CiAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id0F1dGhDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpOiAlbGRcbiIsCisgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIndBdXRoQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKTogJXp1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpKTsKICAgICAgICAgICAgIGZvcihpID0gMDsgKGkgPCBwSUVfUlNOX0F1dGgtPndBdXRoQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSkvc2l6ZW9mKEJZVEUpKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYocFJTTi0+bGVuID49IDE0KzQrKG0raSkqNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqbSkrQUtDKDIpK0FLUyg0KmkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cm91dGUuYwppbmRleCBhYjk5MTYxLi4xZDAyMDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dyb3V0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3JvdXRlLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgIH0KIAogICAgIGlmIChwRGV2aWNlLT5iRW5hYmxlSG9zdFdFUCkgewotICAgICAgICBpZiAodU5vZGVJbmRleCA+PSAwKSB7CisJaWYgKHVOb2RlSW5kZXggPCBNQVhfTk9ERV9OVU0gKyAxKSB7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXkgPSAmU1RlbXBLZXk7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmJ5Q2lwaGVyU3VpdGUgPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmJ5Q2lwaGVyU3VpdGU7CiAgICAgICAgICAgICBwVHJhbnNtaXRLZXktPmR3S2V5SW5kZXggPSBwTWdtdC0+c05vZGVEQlRhYmxlW3VOb2RlSW5kZXhdLmR3S2V5SW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmMKaW5kZXggODIwYTdiOC4uN2RjMDFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgImNvbnRyb2wuaCIKICNpbmNsdWRlICJkYXRhcmF0ZS5oIgogI2luY2x1ZGUgInJuZGlzLmgiCi0jaW5jbHVkZSAiY29udHJvbC5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87CkBAIC0xMDQxLDcgKzEwNDAsNyBAQAogICAgaWYocERldmljZS0+Y29uZmlnX2ZpbGUuWm9uZVR5cGUgIT1wRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV0pCiAgICAgICBwcmludGsoInpvbmV0eXBlIGluIGZpbGVbJTAyeF0gbWlzbWF0Y2ggd2l0aCBpbiBFRVBST01bJTAyeF1cbiIscERldmljZS0+Y29uZmlnX2ZpbGUuWm9uZVR5cGUscERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdKTsKICAgIGVsc2UKLSAgICAgIHByaW50aygiUmVhZCBab25ldHlwZSBmaWxlIHN1Y2Vzcyx1c2UgZGVmYXVsdCB6b25ldHlwZSBzZXR0aW5nWyUwMnhdXG4iLHBEZXZpY2UtPmNvbmZpZ19maWxlLlpvbmVUeXBlKTsKKyAgICAgIHByaW50aygiUmVhZCBab25ldHlwZSBmaWxlIHN1Y2Nlc3MsdXNlIGRlZmF1bHQgem9uZXR5cGUgc2V0dGluZ1slMDJ4XVxuIixwRGV2aWNlLT5jb25maWdfZmlsZS5ab25lVHlwZSk7CiAgfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5jCmluZGV4IGU0OTc5NmYuLmY3MTM2YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2hhbm5lbC5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKgogICogRmlsZTogY2hhbm5lbC5jCiAgKgotICogUHVycG9zZTogQ2hhbm5lbCBudW1iZXIgbWFwaW5nCisgKiBQdXJwb3NlOiBDaGFubmVsIG51bWJlciBtYXBwaW5nCiAgKgogICogQXV0aG9yOiBMdWNhcyBMaW4KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kZXZpY2UuaAppbmRleCBiMDJjYTJkLi44YjU0MWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RldmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZGV2aWNlLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgpAQCAtODgsNyArODcsNiBAQAogLy8gZGV2aWNlIHNwZWNpZmljCiAvLwogCi0jaW5jbHVkZSAia2NvbXBhdC5oIgogI2luY2x1ZGUgImRldmljZV9jZmcuaCIKICNpbmNsdWRlICJ0dHlwZS5oIgogI2luY2x1ZGUgIjgwMjExaGRyLmgiCkBAIC0xMDMsNyArMTAxLDcgQEAKICNpbmNsdWRlICJjYXJkLmgiCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFZOVF9VU0JfVkVORE9SX0lEICAgICAgICAgICAgICAgICAgICAgMHgxNjBBCisjZGVmaW5lIFZOVF9VU0JfVkVORE9SX0lEICAgICAgICAgICAgICAgICAgICAgMHgxNjBhCiAjZGVmaW5lIFZOVF9VU0JfUFJPRFVDVF9JRCAgICAgICAgICAgICAgICAgICAgMHgzMTg0CiAKICNkZWZpbmUgTUFDX01BWF9DT05URVhUX1JFRyAgICAgKDI1NisxMjgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMKaW5kZXggNTJkYWEzYi4uNTg1YjZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYwpAQCAtODAxLDcgKzgwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocEJ1ZmZlcltpaV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRG93bmxvYWQgZmlybXdhcmUuLi4lZCAlbGRcbiIsIGlpLCBzaXplb2YoYWJ5RmlybXdhcmUpKTsKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iRG93bmxvYWQgZmlybXdhcmUuLi4lZCAlenVcbiIsIGlpLCBzaXplb2YoYWJ5RmlybXdhcmUpKTsKICAgICAgICAgICAgIGlmIChOZGlzU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHBCdWZmZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ob3N0YXAuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaG9zdGFwLmMKaW5kZXggMGM4MjY3YS4uMTA3OGQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9ob3N0YXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2hvc3RhcC5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSAiYmFzZWJhbmQuaCIKICNpbmNsdWRlICJ3cGFjdGwuaCIKICNpbmNsdWRlICJrZXkuaCIKLSNpbmNsdWRlICJtYWMuaCIKICNpbmNsdWRlICJkYXRhcmF0ZS5oIgogCiAjZGVmaW5lIFZJQVdHRVRfSE9TVEFQRF9NQVhfQlVGX1NJWkUgMTAyNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jCmluZGV4IGQ5NDEzMWYuLjZmMzMwMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvY3RsLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCSBlbHNlIGlmKHpvbmV0eXBlID09IDB4MDIpIHsgLy9FdXJvcGUKICAgICAgICAgICAgICBzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9FdXJvcGU7CiAJIH0KLQkgZWxzZSB7IC8vVW5rbm93IFpvbmVUeXBlCisJIGVsc2UgeyAvL1Vua25vd24gWm9uZVR5cGUKIAkgICAgICAgIHByaW50aygiRXJyb3I6Wm9uZVR5cGVbJXhdIFVua25vd24gPz8/XG4iLHpvbmV0eXBlKTsKIAkgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwogCQlicmVhazsKQEAgLTY3OSw3ICs2NzksNyBAQAogICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CiAgICB9CiAgICAjZW5kaWYKLSAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAgICAgICAgICAgLy9pcyBzdWNlc3NmdWwgcGVlciB0byB3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ/CisgICAgICAgICBwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gVFJVRTsgICAgICAgICAgIC8vaXMgc3VjY2Vzc2Z1bCBwZWVyIHRvIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD8KIH0KIAogICAgICAgICAvL3ByaW50aygiZ2V0IHByaXZhdGUgd3BhX3N1cHBsaWNhbnQgYW5ub3VuY2UgV1BBIFNNXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaXdjdGwuYwppbmRleCBhYThkMWEyLi5iN2M2YTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2l3Y3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pd2N0bC5jCkBAIC0xNzI0LDcgKzE3MjQsNyBAQAogCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKIAkJLy9wRGV2aWNlLT5iV1BBREVWVXAgPSAhISB3cnEtPnZhbHVlOwogCQkvL2lmKHBEZXZpY2UtPmJXUEFERVZVcD09VFJVRSkKLQkJICAvLyBwcmludGsoIml3Y3RsX3Npd2F1dGg6c2V0IFdQQURFViB0byBlbmFibGUgc3VjZXNzZnVsKioqKioqKlxuIik7CisJCSAgLy8gcHJpbnRrKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gZW5hYmxlIHN1Y2Nlc3NmdWwqKioqKioqXG4iKTsKIAkJLy9lbHNlCiAJCSAvLyAgcHJpbnRrKCJpd2N0bF9zaXdhdXRoOnNldCBXUEFERVYgdG8gZW5hYmxlIGZhaWw/Pz8/P1xuIik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9rY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2tjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmNjM0Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2tjb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDMgVklBIE5ldHdvcmtpbmcsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqCi0gKiBGaWxlOiBrY29tcGF0LmgKLSAqCi0gKiBQdXJwb3NlOiBkZWZpbmUga2VybmVsIGNvbXBhdGliaWxpdHkgaGVhZGVyCi0gKgotICogQXV0aG9yOiBMeW5kb24gQ2hlbgotICoKLSAqIERhdGU6IEFwciA4LCAyMDAyCi0gKgotICovCi0KLSNpZm5kZWYgX0tDT01QQVRfSAotI2RlZmluZSBfS0NPTVBBVF9ICi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpZm5kZWYgSEFWRV9ORVRERVZfUFJJVgotI2RlZmluZSBuZXRkZXZfcHJpdihkZXYpIChkZXYtPnByaXYpCi0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwppbmRleCAwNTE4NjExLi5lZjE3YzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCkBAIC02NCwxMSArNjQsOSBAQAogI2luY2x1ZGUgImlvY3RsLmgiCiAjaW5jbHVkZSAiaXdjdGwuaCIKICNpbmNsdWRlICJkcGMuaCIKLSNpbmNsdWRlICJpb2NtZC5oIgogI2luY2x1ZGUgImRhdGFyYXRlLmgiCiAjaW5jbHVkZSAicmYuaCIKICNpbmNsdWRlICJmaXJtd2FyZS5oIgotI2luY2x1ZGUgIm1hYy5oIgogI2luY2x1ZGUgInJuZGlzLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogI2luY2x1ZGUgImNoYW5uZWwuaCIKQEAgLTgwOSwxMiArODA3LDYgQEAKICAgICAgICAga2ZyZWUocERldmljZSk7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KLQkvLzIwMDgtMDYyMy0wMjxSZW1hcms+YnkgTWlrZUxpdQotICAgICAgICAvLzIwMDctMDgyMS0wMTxBZGQ+YnkgTWlrZUxpdQotICAgICAgIC8vI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkKLSAgCS8vdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwRGV2aWNlKTsKLQkvL1NFVF9ORVRERVZfREVWKG5ldGRldiwgJmludGYtPmRldik7Ci0gICAgICAgLy8jZW5kaWYKIAogLy8yMDA4LTA3LTIxLTAxPEFkZD5ieSBNaWtlTGl1CiAvL3JlZ2lzdGVyIHdwYWRldgpAQCAtMTU0NSw3ICsxNTM3LDcgQEAKICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAotLy9yZXR1cm4gLS0tPi0xOmZhaWw7ICA+PTA6c3VjZXNzZnVsCisvL3JldHVybiAtLS0+LTE6ZmFpbDsgID49MDpzdWNjZXNzZnVsCiBzdGF0aWMgaW50IFJlYWRfY29uZmlnX2ZpbGUoUFNEZXZpY2UgcERldmljZSkgewogICBpbnQgcmVzdWx0PTA7CiAgIFVDSEFSICAgICAgdG1wYnVmZmVyWzEwMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9taWIuaAppbmRleCBiODA2YjRkLi5hYzk5NmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21pYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWliLmgKQEAgLTM1NywxMCArMzU3LDEwIEBACiAgICAjaWZkZWYgQ2FsY3VfTGlua1F1YWwKICAgICAgICAvL1R4IGNvdW50OgogICAgIFVMT05HIFR4Tm9SZXRyeU9rQ291bnQ7ICAgICAgICAgLy9zdWNjZXNzIHR4IG5vIHJldHJ5ICEKLSAgICBVTE9ORyBUeFJldHJ5T2tDb3VudDsgICAgICAgICAgICAgIC8vc3VjZXNzIHR4IGJ1dCByZXRyeSAhCisgICAgVUxPTkcgVHhSZXRyeU9rQ291bnQ7ICAgICAgICAgICAgICAvL3N1Y2Nlc3MgdHggYnV0IHJldHJ5ICEKICAgICBVTE9ORyBUeEZhaWxDb3VudDsgICAgICAgICAgICAgICAgICAgICAgLy9mYWlsIHR4ID8KICAgICAgIC8vUnggY291bnQ6Ci0gICAgVUxPTkcgUnhPa0NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VjZXNzIHJ4ICEKKyAgICBVTE9ORyBSeE9rQ250OyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zdWNjZXNzIHJ4ICEKICAgICBVTE9ORyBSeEZjc0VyckNudDsgICAgICAgICAgICAgICAgICAgIC8vZmFpbCByeCA/CiAgICAgICAvL3N0YXRpc3RpYwogICAgIFVMT05HIFNpZ25hbFN0cmVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwppbmRleCA5NGRkZjhiLi5kOWZhMzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwpAQCAtMzE1Myw3ICszMTUzLDcgQEAKICAgICB9CiAKICAgICBpZiAocERldmljZS0+YkVuYWJsZUhvc3RXRVApIHsKLSAgICAgICAgaWYgKHVOb2RlSW5kZXggPj0gMCkgeworICAgICAgICBpZiAodU5vZGVJbmRleCA8IE1BWF9OT0RFX05VTSArIDEpIHsKICAgICAgICAgICAgIHBUcmFuc21pdEtleSA9ICZTVGVtcEtleTsKICAgICAgICAgICAgIHBUcmFuc21pdEtleS0+YnlDaXBoZXJTdWl0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uYnlDaXBoZXJTdWl0ZTsKICAgICAgICAgICAgIHBUcmFuc21pdEtleS0+ZHdLZXlJbmRleCA9IHBNZ210LT5zTm9kZURCVGFibGVbdU5vZGVJbmRleF0uZHdLZXlJbmRleDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKaW5kZXggNjkxMjM0NC4uNTFiMmRjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93Y21kLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKICNpbmNsdWRlICJ3bWdyLmgiCiAjaW5jbHVkZSAicG93ZXIuaCIKICNpbmNsdWRlICJ3Y3RsLmgiCi0jaW5jbHVkZSAiY2FyZC5oIgogI2luY2x1ZGUgImJhc2ViYW5kLmgiCiAjaW5jbHVkZSAiY29udHJvbC5oIgogI2luY2x1ZGUgInJ4dHguaCIKQEAgLTEzMzIsNyArMTMzMSw3IEBACiAgICAgfQogCiAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAvL2lzIHdhcF9zdXBwbGljYW50IHJ1bm5pbmcgc3VjZXNzZnVsIE9SIG9ubHkgb3BlbiAmJiBzaGFyZWtleSBtb2RlIQorICAvL2lzIHdhcF9zdXBwbGljYW50IHJ1bm5pbmcgc3VjY2Vzc2Z1bCBPUiBvbmx5IG9wZW4gJiYgc2hhcmVrZXkgbW9kZSEKICAgI2lmIDEKICAgaWYoKChwRGV2aWNlLT5iTGlua1Bhc3MgPT1UUlVFKSYmKHBNZ210LT5lQXV0aGVuTW9kZSA8IFdNQUNfQVVUSF9XUEEpKSB8fCAgLy9vcGVuICYmIHNoYXJla2V5IGxpbmtpbmcKICAgICAgIChwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID09IFRSVUUpKSB7ICAgLy93cGEgbGlua2luZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhLmMKaW5kZXggZjkyZDMzZi4uNWRhNjcxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgaWYgKHBSU04tPmxlbiA+PSAxMikgLy9vdWkxKDQpK3ZlcigyKStHS1MoNCkrUEtTQ250KDIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3UEtDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKTogJWxkXG4iLCBwUlNOLT53UEtDb3VudCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpKTsKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id1BLQ291bnQ6ICVkLCBzaXplb2YocEJTU0xpc3QtPmFieVBLVHlwZSk6ICV6dVxuIiwgcFJTTi0+d1BLQ291bnQsIHNpemVvZihwQlNTTGlzdC0+YWJ5UEtUeXBlKSk7CiAgICAgICAgICAgICBmb3IoaSA9IDA7IChpIDwgcFJTTi0+d1BLQ291bnQpICYmIChqIDwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlQS1R5cGUpL3NpemVvZihCWVRFKSk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmKHBSU04tPmxlbiA+PSAxMitpKjQrNCkgeyAvL291aTEoNCkrdmVyKDIpK0dLUyg0KStQS1NDbnQoMikrUEtTKDQqaSkKICAgICAgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKHBSU04tPlBLU0xpc3RbaV0uYWJ5T1VJLCBhYnlPVUkwMCwgNCkpCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgICAgIC8vIG92ZXJsYXkgSUVfUlNOX0F1dGggc3RydWN0dXJlIGludG8gY29ycmVjdCBwbGFjZQogICAgICAgICAgICAgcElFX1JTTl9BdXRoID0gKFBXTEFOX0lFX1JTTl9BVVRIKSBwUlNOLT5QS1NMaXN0W21dLmFieU9VSTsKICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJ3QXV0aENvdW50OiAlZCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSk6ICVsZFxuIiwKKyAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8id0F1dGhDb3VudDogJWQsIHNpemVvZihwQlNTTGlzdC0+YWJ5QXV0aFR5cGUpOiAlenVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJRV9SU05fQXV0aC0+d0F1dGhDb3VudCwgc2l6ZW9mKHBCU1NMaXN0LT5hYnlBdXRoVHlwZSkpOwogICAgICAgICAgICAgZm9yKGkgPSAwOyAoaSA8IHBJRV9SU05fQXV0aC0+d0F1dGhDb3VudCkgJiYgKGogPCBzaXplb2YocEJTU0xpc3QtPmFieUF1dGhUeXBlKS9zaXplb2YoQllURSkpOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZihwUlNOLT5sZW4gPj0gMTQrNCsobStpKSo0KSB7IC8vb3VpMSg0KSt2ZXIoMikrR0tTKDQpK1BLU0NudCgyKStQS1MoNCptKStBS0MoMikrQUtTKDQqaSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDUzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIFdMQUdTNDlfSDIKKwl0cmlzdGF0ZSAiQWdlcmUgU3lzdGVtcyBIRVJNRVMgSUkgV2lyZWxlc3MgUEMgQ2FyZCBNb2RlbCAwMTEwIgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBXSVJFTEVTU19FWFQgJiYgUENNQ0lBCisJc2VsZWN0IFdFWFRfU1BZCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciB3aXJlbGVzcyBjYXJkcyB1c2luZyBBZ2VyZSdzIEhFUk1FUyBJSSBjaGlwc2V0CisJICB3aGljaCBhcmUgaWRlbnRpZmllZCB3aXRoIE1hbnVmYWN0dXJlIElEOiAwMTU2LDAwMDMKKwkgIFRoZSBzb2Z0d2FyZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2Ygd2xfbGttXzcyMl9hYmcudGFyLmd6CisJICBmcm9tIHRoZSBBZ2VyZSBTeXN0ZW1zIHdlYnNpdGUsIGFkZGFwdGVkIGZvciBVYnVudHUgOS4wNC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkMGE4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL01ha2VmaWxlCkBAIC0wLDAgKzEsODEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHdsYWdzNDlfaDJfY3Mua28gYW5kIHdsYWdzNDlfaDI1X2NzLmtvCisjCisjIERlZmF1bHQgYnVpbGQgZm9yIEhlcm1lcy1JSSBiYXNlIGNhcmRzIChwb3NzaWJseSBpZGVudGlmaWVkIHdpdGgKKyMgIm1hbmZpZDogMHgwMTU2LCAweDAwMDMiIGluICJwY2NhcmRjdGwgaWRlbnQiIG91dHB1dCksIGNvbW1lbnQKKyMgLURIRVJNRVMyNSBiZWxvdworIworIyBJZiB5b3Ugd2FudCB0byBidWlsZCBmb3IgSGVybWVzLUlJLjUgYmFzZSBjYXJkcyAocG9zc2libHkgaWRlbnRpZmllZCB3aXRoCisjICJtYW5maWQ6IDB4MDE1NiwgMHgwMDA0IiBpbiAicGNjYXJkY3RsIGlkZW50IiBvdXRwdXQpLCB1bmNvbW1lbnQKKyMgLURIRVJNRVMyNSBiZWxvdworIworIyAgSWYgeW91IHdhbnQgdG8gYnVpbGQgQVAgc3VwcG9ydCAodW50ZXN0ZWQpLCBjb21tZW50IG91dCAtRFNUQV9PTkxZCisKK0lOU1RBTExESVIgOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2tlcm5lbC9kcml2ZXJzL25ldC93aXJlbGVzcworRVhUUkFfQ0ZMQUdTICs9IC1JJChLRVJORUxESVIpL2luY2x1ZGUKK0VYVFJBX0NGTEFHUyArPSAtSSQoc3JjKSBcCisJCS1EQlVTX1BDTUNJQSBcCisJCS1EVVNFX1dQQSBcCisJCS1EVVNFX1dFWFQgXAorCQktRFNUQV9PTkxZIFwKKwkJLURXVkxBTl80OSBcCisjCQktREhFUk1FUzI1IFwKKyMJCS1EREJHIFwKKyMJCS1EREJHX0xWTD01IFwKKyMJCS1EVVNFX1VJTCBcCisjCQktRFVTRV9QUk9GSUxFIFwKKworaWZlcSAoJChmaW5kc3RyaW5nIEhFUk1FUzI1LCQoRVhUUkFfQ0ZMQUdTKSksKQorV0xOQU1FIDo9IHdsYWdzNDlfaDJfY3MKKyQoV0xOQU1FKS15IDo9IHN0YV9oMi5vCitpZmVxICgkKGZpbmRzdHJpbmcgU1RBX09OTFksJChFWFRSQV9DRkxBR1MpKSwpCiskKFdMTkFNRSkteSArPSBhcF9oMi5vCitlbmRpZgorZWxzZQorV0xOQU1FPXdsYWdzNDlfaDI1X2NzCiskKFdMTkFNRSkteSA6PSBzdGFfaDI1Lm8KK2lmZXEgKCQoZmluZHN0cmluZyBTVEFfT05MWSwkKEVYVFJBX0NGTEFHUykpLCkKKyQoV0xOQU1FKS15ICs9IGFwX2gyNS5vCitlbmRpZgorZW5kaWYKKworIyBJZiBLRVJORUxSRUxFQVNFIGlzIGRlZmluZWQsIHdlJ3ZlIGJlZW4gaW52b2tlZCBmcm9tIHRoZQorIyBrZXJuZWwgYnVpbGQgc3lzdGVtIGFuZCBjYW4gdXNlIGl0cyBsYW5ndWFnZS4KK2lmbmVxICgkKEtFUk5FTFJFTEVBU0UpLCkKKworb2JqLW0JCSs9ICQoV0xOQU1FKS5vCisKKyQoV0xOQU1FKS15ICs9CXdsX3Byb2ZpbGUubyBcCisJCXdsX3dleHQubyBcCisJCXdsX3ByaXYubyBcCisJCXdsX21haW4ubyBcCisJCXdsX2VuYy5vIFwKKwkJd2xfdXRpbC5vIFwKKwkJd2xfbmV0ZGV2Lm8gXAorCQl3bF9jcy5vIFwKKwkJbW1kLm8gXAorCQloY2YubyBcCisJCWRoZi5vCisKKyQoV0xOQU1FKS0kKENPTkZJR19TWVNGUykJKz0gd2xfc3lzZnMubworCisjIE90aGVyd2lzZSB3ZSB3ZXJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHRoZSBjb21tYW5kCisjIGxpbmU7IGludm9rZSB0aGUga2VybmVsIGJ1aWxkIHN5c3RlbS4KK2Vsc2UKKwlLRVJORUxESVIgPz0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkCisJUFdEIDo9ICQoc2hlbGwgcHdkKQorCitkZWZhdWx0OgorCSQoTUFLRSkgLUMgJChLRVJORUxESVIpIE09JChQV0QpIG1vZHVsZXMKK2VuZGlmCisKK2NsZWFuOgorCXJtIC1mciAqLm8gKi5rbyAqLm1vZC5jICoubW9kLm8gLiouKi5jbWQgTW9kdWxlLnN5bXZlcnMgXAorCQlNb2R1bGUubWFya2VycyBtb2R1bGVzLm9yZGVyIC50bXBfdmVyc2lvbnMKKworaW5zdGFsbDogZGVmYXVsdAorCS1ybW1vZCAkKFdMTkFNRSkKKwlpbnN0YWxsIC1kICQoSU5TVEFMTERJUikKKwlpbnN0YWxsIC1tIDA2NDQgLW8gcm9vdCAtZyByb290ICQoV0xOQU1FKS5rbyAkKElOU1RBTExESVIpCisJL3NiaW4vZGVwbW9kIC1hcQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9SRUFETUUudWJ1bnR1IGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLnVidW50dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JlYWVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLnVidW50dQpAQCAtMCwwICsxLDE4MCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1dMQU4gZHJpdmVyIGZvciBjYXJkcyB1c2luZyB0aGUgSEVSTUVTIElJIGFuZCBIRVJNRVMgSUkuNSBjaGlwc2V0CisKK0hFUk1FUyBJSSBDYXJkCisKK1BDTUNJQSBJbmZvOiAiQWdlcmUgU3lzdGVtcyIgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIKKyAgICAgICAgICAgICBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDAzCisKK0hFUk1FUyBJSS41IENhcmQKKworUENNQ0lBIEluZm86ICJMaW5rc3lzIiAiV0NGNTRHX1dpcmVsZXNzLUdfQ29tcGFjdEZsYXNoX0NhcmQiCisgICAgICAgICAgICAgTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwNAorCitCYXNlZCBvbiBBZ2VyZSBTeXN0ZW1zIExpbnV4IExLTSBXaXJlbGVzcyBEcml2ZXIgU291cmNlIENvZGUsCitWZXJzaW9uIDcuMjI7IGNvbXBsaWVzIHdpdGggT3BlbiBTb3VyY2UgQlNEIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitERVNDUklQVElPTgorCitUaGUgc29mdHdhcmUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHdsX2xrbV83MjJfYWJnLnRhci5neiBmcm9tIHRoZQorQWdlcmUgU3lzdGVtcyB3ZWJzaXRlLCBhZGRhcHRlZCBmb3IgVWJ1bnR1IDkuMDQuCisKK01vZGlmaWVkIGZvciBrZXJuZWwgMi42IGJ5IEhlbmsgZGUgR3Jvb3QgPHBlMWRubkBhbXNhdC5vcmc+CitCYXNlZCBvbiA3LjE4IHZlcnNpb24gYnkgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+ICRSZXZpc2lvbjogMzkgJAorCitJTlNUQUxMQVRJT04KKworVW5wYWNrIGluIGEgbmV3IGRpcmVjdG9yeS4KKworT3BlbiBhIHRlcm1pbmFsIHNjcmVlbi4KKworQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGRpcmVjdG9yeQorCitUeXBlIGNvbW1hbmQKKworbWFrZQorCithbmQgd2FpdCB1bnRpbCBpdCBpcyBmaW5zaGVkLiBOb3cgeW91IGhhdmUgYnVpbGQgdGhlIG1vZHVsZQord2xhZ3M0OV9oMl9jczsgdGhpcyBtb2R1bGUgaXMgbWVhbnQgZm9yIGEgSEVSTUVTIElJIGNhcmQuCisKK1RoZSBkcml2ZXIgaXMgdGVzdGVkIHdpdGggYSBUaG9tc29uIFNwZWVkVG91Y2ggMTEwIFdpcmVsZXNzIFBDIENhcmQuCitGb3IgdGhlIHRlc3QgU3RhdGlvbiBtb2RlIHdhcyB1c2VkIHdpdGggV0VQLiBUaGUgZHJpdmVyIGlzIHN1cHBvc2VkCit0byBzdXBwb3J0IFdBUCBhbmQgYXMgYWNjZXNzcG9pbnQgdGhhdCBpcyBOT1QgdGVzdGVkLgorCitJZiB5b3UgaGF2ZSBhIGNhcmQgdXNpbmcgdGhlIEhFUk1FUyBJSS41IGNoaXAgeW91IGhhdmUgdG8gbWFrZQorY2hhbmdlcyB0byB0aGUgTWFrZWZpbGUgYW5kIHVuY29tbWVudCAtREhFUk1FUzI1LiBUaGlzIHdpbGwgYnVpbGQKK2RyaXZlciB3bGFnczQ5X2gyNV9jcy4KKworTm90ZTogWW91IGNhbiBkZXRlbWluZSB0aGUgdHlwZSB3aXRoIGNvbW1hbmQgInBjY2FyZGN0cmwgaW5mbyIKKyAgICAgICAgTUFOSUZJRDogMDE1NiwwMDAyID0gSEVSTUVTIC0gbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICAgICAgICBNQU5JRklEOiAwMTU2LDAwMDMgPSBIRVJNRVMgSUkgICAoV2lyZWxlc3MgQikKKyAgICAgICAgTUFOSUZJRDogMDE1NiwwMDA0ID0gSEVSTUVTIElJLjUgKFdpcmVsZXNzIEIvRykKKworQWZ0ZXIgc3VjY2VzZnVsbCBjb21waWxlIHR5cGUgY29tbWFuZAorCitzdWRvIG1ha2UgaW5zdGFsbAorCit0byBpbnN0YWxsIHRoZSBtb2R1bGUuCisKK05vdyB0aGUgY2FyZCBzaG91bGQgYmUgcmVjb2duaXplZC4gSXQgc2hvdWxkIGJlIGFibGUgdG8gY29uZmlndXJlCithbmQgdXNlIHRoZSBjYXJkIHdpdGggTmV0d29ya01hbmFnZXIuIFdwYV9zdXBwbGljYW50IGFsc28gd29ya3MsIGFzIGRvZXMKK21hbnVhbCBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBpd2NvbmZpZy9pd2xpc3QgcHJvZ3JhbXMuCisKK05vdGU6IEkgb25seSB0ZXN0ZWQgU3RhdGlvbiBtb2RlIHdpdGggV0VQIGJ1dCBpZiBJIGRpZG4ndCBicmVhayBhbnl0aGluZworV1BBIGFuZCBBUCBtb2RlIHNob3VsZCBhbHNvIHdvcms7IG5vdGUgaG93ZXZlciB0aGF0IFdQQSB3YXMgZXhwZXJpbWVudGFsCitpbiB0aGUgb3JpZ2luYWwgQWdlcmUgZHJpdmVyIQorCitOb3RlOiB0byBjb21waWxlIGFzIEFQIGNoYW5nZSB0aGUgbWFrZWZpbGUgYW5kIHJlbW92ZSB0aGUgbGluZQorLURTVEFfT05MWSBcCisKKyhvciBjb21tZW50IGl0LCBidXQgaW4gdGhhdCBjYXNlIG1ha2Ugc3VyZSB0byBtb3ZlIGl0IGFmdGVyIGFsbCB0aGUKKyBmbGFncyB5b3Ugd2FudCB0byB1c2UpCisKK0NIQU5HRVMKKworVGhlIEhDRiBmdW5jdGlvbnMgdG8gY29udHJvbCB0aGUgY2FyZCBhcmUgdmlydHVhbGx5IHVuY2hhbmdlZCwgdGhlIG9ubHkKK2NoYW5nZXMgYXJlIG1lYW50IHRvIGZpeCBjb21waWxlciB3YXJuaW5ncy4gVGhlIG9ubHkgcmVhbCBjaGFuZ2UgaXMgaW4KK0hDRl9XQUlUX1dISUxFIHdoaWNoIG5vdyBoYXMgYSB1ZGVsYXkoMikgYWRkZWQgdG8gZ2l2ZSBhIHNtYWxsIGRlbGF5LgorCitUaGUgbGludXggZHJpdmVyIGZpbGVzICh3bF94eHh4LmMpIGFyZSBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKKy0gQWRkYXB0YXRpb25zIG9mIEFuZHJleSBCb3J6ZW5rb3YgYXBwbGllZCB0byA3LjIyIHNvdXJjZQorLSBBbHRlcmF0aW9ucyB0byBhdm9pZCBtb3N0IEhDRl9BU1NFUlRzCistLSBTd2l0Y2hpbmcgaW50ZXJydXB0cyBvZmYgYW5kIG9uIGluIHRoZSBIQ0YKKy0tIEJ1Z2ZpeGVzLCB0aGluZ3MgdGhhdCB3ZXJlIGFwYXJlbnRseSB3cm9uZyBsaWtlIHJlcG9ydGluZyBsaW5rIHN0YXR1cworICAgY2hhbmdlIHdoaWNoIGNoZWNrZWQgYSB2YXJpYWJsZSB0aGF0IHdhcyBub3QgY2hhbmdlZCBpbiBIQ0YgYW55bW9yZS4KKy0tIFVzZWQgb24gV0VQIGJ1dCBzZXR0aW5nIGtleXMgdmlhIFNJT0NTSVdFTkNPREVFWFQgd2FzIG5vdCBzdXBwb3J0ZWQKKy0tIFJlY292ZXJ5IGFjdGlvbnMgYWRkZWQKKworVGhlIG1ham9yIHByb2JsZW0gd2FzIHRoZSBvcmRlciBpbiB3aGljaCBjYWxscyBjYW4gYmUgbWFkZS4gVGhlIG9yaWdpbmFsCitsb29rcyBsaWtlIGEgdHJhZGl0b25hbCBVTklYIGRyaXZlci4gVG8gY2FsbCBhbiAiaW9jdGwiIGZ1bmN0aW9uIHlvdQoraGF2ZSB0byAib3BlbiIgdGhlIGRldmljZSBmaXJzdCB0byBnZXQgYSBoYW5kbGUgYW5kIGFmdGVyICJjbG9zZSIgbm8KKyJpb2N0bCIgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhbnltb3JlLiBXaXRoIHRoZSAyLjYgZHJpdmVyIHRoaXMgYWxsCitjaGFuZ2VkOyB0aGUgZm9ybWVyIGlvY3RsIGZ1bmN0aW9ucyBhcmUgbm93IGNhbGxlZCBiZWZvcmUgIm9wZW4iIGFuZAorYWZ0ZXIgImNsb3NlIiwgd2hpY2ggd2FzIG5vdCBleHBlY3RlZC4gT25lIG9mIHRoZSBwcm9ibGVtcyB3YXMgZW5hYmxlLworZGlzYWJsZSBvZiBpbnRlcnJ1cHRzIGluIHRoZSBIQ0YuIEludGVycnVwdCBoYW5kbGluZyBzdGFydHMgYXQgIm9wZW4iCitzbyBpZiBhIGZvcm1lciAiaW9jdGwiIHJvdXRpbmdlIGlzIGNhbGxlZCBiZWZvcmUgIm9wZW4iIG9yIGFmdGVyICJjbG9zZSIKK3RoZW4gbm90aGluZyBzaG91bGQgYmUgZG9uZSB3aXRoIGludGVycnVwdCBzd2l0Y2hpbmcgaW4gdGhlIEhDRi4gT25jZQordGhpcyB3YXMgc29sdmVkIG1vc3QgSENGX0FTU0VSVFMgd2VudCBhd2F5LgorCitUaGUgbGFzdCBwb2ludCwgcmVjb3ZlcnkgYWN0aW9ucyBhZGRlZCwgbmVlZHMgc29tZSBjbGFyaWZpY2F0aW9uLgorU3RhcnRpbmcgdGhlIGNhcmQgd29ya3MgbW9zdCBvZiB0aGUgdGltZSwgYnV0IHVuZm9ydHVuYXRlbHkgbm90IGFsd2F5cy4KK0F0IGEgZmV3IHRpbWVzIHJlY292ZXJ5IGNvZGUgd2FzIGFkZGVkOyB3aGVuIHRoZSBjYXJkIHN0YXJ0cyB0bworbWlzYmVoYXZlIG9yIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIEhDRiBhbmQgdGhlIGNhcmQgaXMKK291dCBvZiBzeW5jIGFuZCB0aGUgSENGIGVudGVycyBERUZVTkNUIG1vZGUgZXZlcnl0aGluZyBpcyByZXNldCBhbmQKK3JlaW5pdGlhbGl6ZWQuIE5vdGUsIGhjZi5jIGNvbnRhaW5zIGEgbG90IG9mIGRvY3VtZW50YXRpb24uIEl0IHRha2VzCitzb21lIHRpbWUgYnV0IHNsb3dseSBzb21lIHRoaW5ncyBiZWNvbWUgY2xlYXIuIEFsc28gc29tZSB1bnJlc29sdmVkCitpc3N1ZXMgYXJlIG1lbnRpb25lZCBpbiBoY2YuYywgc28gdGhlcmUgYXJlIHN0aWxsIHVua25vd24gYnVncy4KKworVGhlIGNhcmQgcHJvYmxlbXMgYXJlIGFsbW9zdCBpbiBhbGwgY2FzZXMgd2hlbiBzdGFydGluZyB1cCBhbmQgYmVmb3JlCit0aGUgZmlyc3QgYXNzb2NpYXRpb24gd2l0aCBhbiBBUCwgb25jZSB0aGUgY2FyZCBpcyBpbiBvcGVyYXRpb24gaXQKK3NlZW1zIHRvIHN0YXkgdGhhdCB3YXk7IHdoZW4gZGVidWdnaW5nIG5vIEhDRl9BU1NFUlRTIGFwcGVhciBhbnltb3JlLgorTm90ZTogc29tZSBIQ0ZfQVNTRVJUUyBzdGlsbCBhcHBlYXIsIGluIGEgbnVtYmVyIG9mIGNhc2VzIGl0IGlzIGEgcmVhbAorZXJyb3IsIGZvciBleGFtcGxlIGF0IGNhcmQgcmVtb3ZhbCB0aGUgbWlzc2luZyBjYXJkIGlzIGRldGVjdGVkLgorCitMSUNFTlNFCisKK1RoZSBBZ2VyZSBTeXN0ZW1zIGxpY2Vuc2UgYXBwbGllcy4gVGhpcyBpcyB3aHkgSSBpbmNsdWRlIHRoZSBvcmlnaW5hbAorUkVBRE1FLndsYWdzNDkuIFRoZSBpbnN0cnVjdGlvbnMgaW4gdGhhdCBmaWxlIGFyZSBib2d1cyBub3cuIEkgYWxzbworaW5jbHVkZSB0aGUgbWFuIHBhZ2UuIEV2ZW50aG91Z2ggc2V0dGluZyBwYXJhbWV0ZXJzIG9uIHRoZSBtb2R1bGUKK2RvZXMgbm90IHdvcmsgYW55bW9yZSBidXQgaXQgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlCitzZXR0aW5ncy4KKworSSBoYXZlIG5vdCBoYXZlIHBlcnNvbmFsIGNvbnRhY3Qgd2l0aCBBZ2VyZSwgYnV0IG90aGVycyBoYXZlLiBBZ2VyZQorYWdyZWVkIHRvIG1ha2UgdGhlaXIgc29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSBCU0QgbGljZW5jZS4KK1RoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSA3LjIyIHZlcnNpb24uCisKK1RoZSBmb2xsb3dpbmcgd2FzIG1haWxlZCBieSBBZ2VyZSB0byBBbmRyZXkgQm9yemVua292IGFib3V0IHRoaXM6CisKKyAgICAtLS0gQmVnaW4gTWVzc2FnZSAtLS0KKworICAgICAgICAqIEZyb206IFRKIDx0akB4eHh4eHh4eHh4eD4KKyAgICAgICAgKiBEYXRlOiBNb24sIDA1IEZlYiAyMDA3IDE5OjI4OjU5ICswMDAwCisKKyAgICBIaSBBbmRyZXksCisKKyAgICBJJ3ZlIGdvdCBzb21lIGdvb2QgbmV3cyBmb3IgeW91L3VzL3RoZSB3b3JsZCBvZiBIZXJtZXMgOikKKworICAgIEkgZ290IGEgcmVwbHkgZnJvbSB0aGUgbGVnYWwgcmVwcmVzZW50YXRpdmUgYXQgQWdlcmUgY29uZmlybWluZyB0aGF0CisgICAgdGhlaXIgc291cmNlLWNvZGUgaXMgQlNEIGxpY2Vuc2VkLCBhbmQgSSd2ZSBpbmNsdWRlZCB0aGUgY29udGVudHMgb2YgdGhlCisgICAgZW1haWwgaGVyZS4KKworICAgIEkgaG9wZSB0aGlzIHJlLWFzc3VyZXMgeW91IHNvIHRoYXQgeW91ciBleGNlbGxlbnQgd29yayBvbiB0aGUgZHJpdmVycworICAgIGNhbiBiZSBtYWRlIHdpZGVseSBhdmFpbGFibGUgZm9yIG90aGVyIGhhY2tlcnMgdG8gd29yayB3aXRoLgorCisgICAgUmVnYXJkcywKKworICAgIFRKLgorCisgICAgLS0tLS0tLS0tCisgICAgT24gTW9uLCAyMDA3LTAyLTA1IGF0IDEzOjU0IC0wNTAwLCBQYXRoYXJlLCBWaXJlbiBNIChWaXJlbikgd3JvdGU6CisKKworICAgICJJIHdvdWxkIGxpa2UgdG8gY29uZmlybSB0aGF0IHRoZSB0d28gZHJpdmVyczsgTGludXggTEtNIFdpcmVsZXNzIERyaXZlcgorICAgIFNvdXJjZSBDb2RlLCBWZXJzaW9uIDcuMTggYW5kIExpbnV4IExLTSBXaXJlbGVzcyBEcml2ZXIgU291cmNlIENvZGUsCisgICAgVmVyc2lvbiA3LjIyIGNvbXBseSB3aXRoIE9wZW4gU291cmNlIEJTRCBMaWNlbnNlLiBUaGVyZWZvcmUgdGhlIHNvdXJjZQorICAgIGNvZGUgY2FuIGJlIGRpc3RyaWJ1dGVkIGluIHVubW9kaWZpZWQgb3IgbW9kaWZpZWQgZm9ybSBjb25zaXN0ZW50IHdpdGgKKyAgICB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UuCisKKyAgICBUaGUgTGludXggZHJpdmVyIGFyY2hpdGVjdHVyZSB3YXMgYmFzZWQgb24gdHdvIG1vZHVsZXMsIHRoZSBNU0YgKE1vZHVsZQorICAgIHNwZWNpZmljIGZ1bmN0aW9ucykgYW5kIHRoZSBIQ0YgKEhhcmR3YXJlIENvbnRyb2wgRnVuY3Rpb25zKS4gSW5jbHVkZWQKKyAgICBpbiB0aGUgSENGIGlzIHJ1bi10aW1lIGZpcm13YXJlIChiaW5hcnkgZm9ybWF0KSB3aGljaCBpcyBkb3dubG9hZGVkIGludG8KKyAgICB0aGUgUkFNIG9mIHRoZSBIZXJtZXMgMS8yLzIuNSBXTUFDLgorCisgICAgVGhpcyBoZXggY29kZWQgZmlybXdhcmUgaXMgbm90IGJhc2VkIG9uIGFueSBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBhbmQKKyAgICBoZW5jZSBpdCBpcyBub3Qgc3ViamVjdCB0byBhbnkgT3BlbiBTb3VyY2UgTGljZW5zZS4gVGhlIGZpcm13YXJlIHdhcworICAgIGRldmVsb3BlZCBieSBBZ2VyZSBhbmQgcnVucyBvbiB0aGUgRElTQyBwcm9jZXNzb3IgZW1iZWRkZWQgd2l0aGluIHRoZQorICAgIEhlcm1lcyAxLzIvMi41IFdpcmVsZXNzIE1BQyBkZXZpY2VzLgorCisgICAgSG9wZSB0aGlzIGhlbHBzLgorCisgICAgU2luY2VyZWx5LAorCisgICAgVmlyZW4gUGF0aGFyZQorICAgIEludGVsbGVjdHVhbCBQcm9wZXJ0eSBMaWNlbnNpbmcgTWFuYWdlcgorICAgIEFnZXJlIgorCisKKworICAgIC0tLSBFbmQgTWVzc2FnZSAtLS0KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLndsYWdzNDkgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9SRUFETUUud2xhZ3M0OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg2ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvUkVBRE1FLndsYWdzNDkKQEAgLTAsMCArMSw2NDEgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQWdlcmUgU3lzdGVtcyBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnVseSAyMDA0CitSZWFkbWUgZm9yIExpbnV4IERyaXZlciBTb3VyY2UgZm9yIFdhdmVsYW4gICAgICAgICAgICAgICAgICAgVmVyc2lvbjogNy4yMi1hYmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHRleHQgZmlsZSBpbmNsdWRlcyB1cGRhdGUgaW5mb3JtYXRpb24sIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMsCitsaW1pdGF0aW9ucyB0byB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBwcm9kdWN0LCBhbmQgc3VnZ2VzdGlvbnMgdG8gc29sdmUKK2tub3duIGlzc3VlcyBvciBwcm9ibGVtcy4KKworCitUQUJMRSBPRiBDT05URU5UUy4KKworMS4gIERFU0NSSVBUSU9OCisyLiAgU1lTVEVNIFJFUVVJUkVNRU5UUworMy4gIE5FVyBJTiBUSElTIFJFTEVBU0UKKzQuICBJTlNUQUxMQVRJT04gTk9URVMKKzUuICBURUNITklDQUwgQ09OU1RSQUlOVFMKKzYuICBLTk9XTiBJU1NVRVMKKzcuICBURUNITklDQUwgU1VQUE9SVAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzEuICBERVNDUklQVElPTgorCisgICAgV2l0aCB0aGlzIHBhY2thZ2UsIHlvdSBjYW4gYnVpbGQgYW5kIGluc3RhbGwgYSBXaXJlbGVzcyBkcml2ZXIgZm9yIGEKKyAgICBzcGVjaWZpYyBMaW51eCBrZXJuZWwuCisKKyAgICBUaGUgZHJpdmVyIGluIHRoaXMgcGFja2FnZSBzdXBwb3J0cyB0aGUgbmV0d29yayBpbnRlcmZhY2UgY2FyZHMgYmFzZWQgb246CisgICAgIC0gV0w2MDAxMCwgYS5rLmEuIEhlcm1lcy1JSQorICAgICAtIFdMNjAwNDAsIGEuay5hLiBIZXJtZXMtSUkuNQorCisgICAgQWx0aG91Z2ggZGVyaXZlZCBmcm9tIHRoZSBIZXJtZXMtSS9JSSBMaW51eCBkcml2ZXIsIHRoaXMgcmVsZWFzZSBPTkxZCisgICAgU3VwcG9ydHMgSGVybWVzLUlJL0lJLjUgY2hpcHNldHMuICBIZXJtZXMtSSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorCisgICAgVGhlIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIGEgY29tcHJlc3NlZCBzb3VyY2UgZmlsZSBhcmNoaXZlOgorICAgICAtIHdsX2xrbV83XzIyX2FiZy50YXIuZ3oKKworICAgIEJlY2F1c2UgdGhpcyByZWxlYXNlIHN1cHBvcnRzIG1vcmUgdGhhbiBvbmUgSGVybWVzIENQVSBhbmQgYnVzCisgICAgYXJjaGl0ZWN0dXJlLCBhIG5hbWluZyBjb252ZW50aW9uIGlzIHVzZWQgZm9yIHRoZSByZXN1bHRpbmcgYmluYXJpZXMgdGhhdAorICAgIGNhbiBiZSBidWlsdCBmcm9tIHRoaXMgc291cmNlIGNvZGUuIERyaXZlciBiaW5hcmllcyBhcmUgbmFtZWQgYXMgZm9sbG93czoKKworICAgIHdsYWdzNDlfPGhlcm1lc190eXBlPl88YnVzX2FyY2g+Lm8KKworICAgIHdoZXJlICd3bGFnczQ5JyBkZW5vdGVzIGFuIEFnZXJlIFdhdmVMYW4gTGludXggYnVpbGQsCisKKyAgICA8aGVybWVzX3R5cGU+IGlzOiAnaDInIGZvciBIZXJtZXMtSUksICdoMjUnIGZvciBIZXJtZXMtSUkuNQorCisgICAgPGJ1c19hcmNoPiBpczogJ2NzJyBmb3IgQ2FyZCBTZXJ2aWNlcyAoUENNQ0lBLCBDb21wYWN0IEZsYXNoKSwgUENJIGZvcgorICAgIFBDSSBvciBNaW5pUENJLgorCisgICAgRm9yIGV4YW1wbGUsIGEgZHJpdmVyIGJ1aWx0IGZvciBIZXJtZXMtSUkgQ2FyZCBTZXJ2aWNlcyAoUENNQ0lBL0NvbXBhY3QKKyAgICBGbGFzaCkgaXMgbmFtZWQgd2xhZ3M0OV9oMl9jcy5vLCB3aGVyZWFzIGEgZHJpdmVyIGJ1aWx0IGZvciBIZXJtZXMtSUkKKyAgICBNaW5pUENJIGlzIG5hbWVkIHdsYWdzNDlfaDJfcGNpLm8uCisgICAgVGhlIGZvbGxvd2luZyBzb2Z0d2FyZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uOgorCisgICAgR2VuZXJhbCBpbmZvcm1hdGlvbjoKKyAgICAqIFJFQURNRS53bGFnczQ5ICAgICAgICAgICAgICBUaGlzIGZpbGUKKyAgICAqIExJQ0VOU0Uud2xhZ3M0OSAgICAgICAgICAgICBMaWNlbnNlCisgICAgKiB3bGFnczQ5Lm1rICAgICAgICAgICAgICAgICAgVG9wIGxldmVsIE1ha2VmaWxlCisgICAgKiBCdWlsZCAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0IHRvIGJ1aWxkIGRyaXZlcgorICAgICogSW5zdGFsbCAgICAgICAgICAgICAgICAgICAgIFNjcmlwdCB0byBpbnN0YWxsIGRyaXZlcgorCisgICAgRHJpdmVyIHNvdXJjZToKKyAgICAqIHdpcmVsZXNzLyAgICAgICAgICAgICAgICAgICBNU0Ygc291cmNlCisgICAgKiBoY2YvICAgICAgICAgICAgICAgICAgICAgICAgSENGIGFuZCBGL1cgc291cmNlCisgICAgKiB3aXJlbGVzcy93bGFnczQ5X2NzLm1rICAgICAgRHJpdmVyIE1ha2VmaWxlLCBQQyBDYXJkCisgICAgKiB3aXJlbGVzcy93bGFnczQ5X3BjaS5tayAgICAgRHJpdmVyIE1ha2VmaWxlLCBQQ0kKKyAgICAqIGluY2x1ZGUvaGNmL2RlYnVnLmggICAgICAgICBEcml2ZXIgZGVidWcgc3VwcG9ydAorICAgICogaW5jbHVkZS9oY2YvaGNmY2ZnLmggICAgICAgIEhlYWRlciB0byBjb25maWd1cmUgSENGCisgICAgKiBpbmNsdWRlL3dpcmVsZXNzLyouaCAgICAgICAgRHJpdmVyIHNvdXJjZSBoZWFkZXJzCisKKyAgICBEcml2ZXIgb25saW5lIG1hbnVhbCBwYWdlOgorICAgICogbWFuL3dsYWdzNDkuNCAgICAgICAgICAgICAgIERyaXZlciBtYW51YWwgcGFnZQorCisgICAgUENNQ0lBIGNvbmZpZ3VyYXRpb24gdXBkYXRlOgorICAgICogZXRjL3dsYWdzNDkuY29uZiAgICAgICAgICAgIEFkZC1vbiBjb25maWcgZmlsZQorICAgICogZXRjL3dsYWdzNDkubWsgICAgICAgICAgICAgIGNvbmZpZyB1cGRhdGUgTWFrZWZpbGUKKyAgICAqIGV0Yy93bGFnczQ5LnBhdGNoICAgICAgICAgICBjb25maWcgdXBkYXRlIHBhdGNoIGZpbGUKKworICAgIFRoZSBkcml2ZXIgaXMgYnVpbGQgdXAgb2YgMiBtb2R1bGVzOgorICAgICAtIGEgaGlnaGVyIG1vZHVsZSBjYWxsZWQgTW9kdWxlIFNwZWNpZmljIEZ1bmN0aW9ucyAoTVNGKSwgd2hpY2ggY29udGFpbnMKKyAgICAgICB0aGUgZnVuY3Rpb25zIG9mIHRoZSBkcml2ZXIgdGhhdCBhcmUgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlIGFuZAorICAgICAgIE9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWMuCisgICAgIC0gYSBsb3dlciBtb2R1bGUgY2FsbGVkIEhhcmR3YXJlIENvbnRyb2wgRnVuY3Rpb25zIChIQ0YpLCB3aGljaCBjb250YWlucworICAgICAgIHRoZSBmdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHRvIHRoZSBOZXR3b3JrIEludGVyZmFjZSBDYXJkIChOSUMpLiAgVGhlIEhDRgorICAgICAgIHByb3ZpZGVzIGZvciBhbGwgV2F2ZUxBTiBOSUMgdHlwZXMgb25lIHN0YW5kYXJkIGludGVyZmFjZSB0byB0aGUgTVNGLgorICAgICAgIFRoaXMgSS9GIGlzIGNhbGxlZCB0aGUgV2lyZWxlc3MgQ29ubmVjdGlvbiBJbnRlcmZhY2UgKFdDSSkgYW5kIGlzIHRoZQorICAgICAgIHN1YmplY3Qgb2YgYSBzZXBlcmF0ZSBkb2N1bWVudCAoMDI1NzI2KS4KKworICAgIFRoZSBIQ0YgZGlyZWN0b3J5IGNvbnRhaW5zIGZpcm13YXJlIGltYWdlcyB0byBhbGxvdyB0aGUgY2FyZCB0byBvcGVyYXRlIGluCisgICAgZWl0aGVyIHN0YXRpb24gKFNUQSkgb3IgQWNjZXNzIFBvaW50IChBUCkgbW9kZS4gSW4gdGhlIGJ1aWxkIHByb2Nlc3MsIHRoZQorICAgIGZpbGVzIGZ3X2gyLmMgYW5kIGZ3X2gyNS5jIGFyZSB1c2VkIGZvciBIZXJtZXMtSUkgYW5kIEhlcm1lcy1JSS41CisgICAgcmVzcGVjdGl2ZWx5LiBUaGUgZmlybXdhcmUgaW1hZ2VzIGluIHRoaXMgcmVsZWFzZSBhcmUgaWRlbnRpZmllZCBhczoKKwkgLSBISUkgU3RhdGlvbiBGL1c6ICAgICAgZndfaDIuYy5zdGEKKwkgLSBISUkuNSBTdGF0aW9uIEYvVzogICAgZndfaDI1LmMuc3RhCisJIC0gSElJIEFjY2VzUG9pbnQgRi9XOiAgIGZ3X2gyLmMuYXAKKwkgLSBISUkuNSBBY2Nlc1BvaW50IEYvVzogZndfaDI1LmMuYXAKKwlUbyBidWlsZCBhIFNUQSBvciBBUCBtb2RlIGRyaXZlciwgdGhlIHN1ZmZpeCAuc3RhIG9yIC5hcCBtdXN0IGJlIHJlbW92ZWQuCisJVGhlIGZpbGVzIGFzIGRpc3RyaWJ1dGVkIGJ5IHRoaXMgcmVsZWFzZSBidWlsZCBTVEEgZHJpdmVycyBieSBkZWZhdWx0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIuICBTWVNURU0gUkVRVUlSRU1FTlRTCisKKzIuMSBPcGVyYXRpbmcgU3lzdGVtCisKKyAgICBUaGlzIHNvZnR3YXJlIGNhbiBiZSBjb21waWxlZCBhbmQgaW5zdGFsbGVkIHdpdGggTGludXgga2VybmVsIHZlcnNpb25zCisgICAgMi40LnguIEFsdGhvdWdoIHRoaXMgZHJpdmVyIHNob3VsZCBjb21waWxlIGZvciBvdGhlciBDUFVzIGFzIHdlbGwsIGFzIG9mCisgICAgdGhlIGRhdGUgb2YgdGhpcyByZWxlYXNlLCBubyBDUFUgYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHg4NiBoYXZlIGJlZW4KKyAgICB2ZXJpZmllZC4KKworICAgIHdsX2xrbV83XzIyX2FiZyBpcyB0ZXN0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIExpbnV4IERpc3RyaWJ1dGlvbnM6CisgICAgKiBSZWQgSGF0IHZlcnNpb24gOS4wCisgICAgKiBTdXNlICAgIHZlcnNpb24gOS4wCisKKyAgICBJZiB5b3UncmUgYnVpbGRpbmcgZm9yIFBDIENhcmQgb3IgQ29tcGFjdCBGbGFzaCwgeW91IG5lZWQgdGhlIENhcmQgU2VydmljZXMKKyAgICBmcm9tIERhdmlkIEhpbmRzLgorCisgICAgd2xfbGttXzdfMjJfYWJnIGlzIHRlc3RlZCB3aXRoOgorICAgICogcGNtY2lhLWNzLTMuMi43LnRhci5negorCisyLjIgRnJlZSBEaXNrIFNwYWNlCisKKyAgICBUbyBjb21waWxlIHRoZSBzb2Z0d2FyZSB5b3UgbmVlZCB0byBoYXZlIHRoZSBmdWxsIHNldCBvZiBMaW51eCBrZXJuZWwKKyAgICBzb3VyY2UgZmlsZXMgaW5zdGFsbGVkLCBhcyB3ZWxsIGFzIGEgc2FuZSBidWlsZCBlbnZpcm9ubWVudCB3aGljaCBpbmNsdWRlcworICAgIGFsbCB0b29scyBuZWNlc3NhcnkgZm9yIGNvbXBpbGluZyBhbmQgbGlua2luZyBjb2RlLiBEZXBlbmRpbmcgb24gdGhlIGV4YWN0CisgICAgdmVyc2lvbiBvZiB0aGUga2VybmVsLCB5b3UgbmVlZCBhcHByb3hpbWF0ZWx5IDE1MCBNQiBvZiBmcmVlIGRpc2sgc3BhY2UuCisgICAgT25jZSBjb21waWxlZCwgdGhlIGRyaXZlciB1c2VzIGFib3V0IDE1MC0yMDAgS0IuICBQbGVhc2Ugbm90ZSwgdGhpcyBzaXplIGlzCisgICAgYXBwcm94aW1hdGUgYW5kIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB3aGljaCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgaXMgYnVpbHQuCisgICAgSW4gYWRkaXRpb24sIGFkZGluZyBkZWJ1ZyB0cmFjaW5nIHN1cHBvcnQgaW5jcmVhc2VzIHRoaXMgc2l6ZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiszLiAgTkVXIElOIFRISVMgUkVMRUFTRQorCitWZXJzaW9uIDcuMjIgYWJnIC0gSnVseSAyOCwgMjAwNAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzQuICBJTlNUQUxMQVRJT04gTk9URVMKKworICAgIFRoZSBkcml2ZXIgZmlsZXMgZm9yIHRoZSBMaW51eCBkcml2ZXIgYXJlIG5vdCAicmVhZHkiIGZvciBkaXJlY3QKKyAgICBpbnN0YWxsYXRpb24gb250byBhbnkgTGludXggY29tcHV0ZXIuICBUbyBidWlsZCBhbmQgaW5zdGFsbCB0aGUgZHJpdmVyIHlvdQorICAgIG5lZWQgc29tZSBleHBlcnRpc2Ugb24gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0gaW4gZ2VuZXJhbCBhbmQgdGhlIHR5cGUKKyAgICBhbmQgdmVyc2lvbiBpbnN0YWxsZWQgb2YgdGhlIGtlcm5lbCBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlci4gIFdpdGggdGhpcworICAgIGtub3dsZWRnZSB5b3UgY2FuIHVzZSB0aGUgZHJpdmVyIHNvdXJjZSBmaWxlcyBwcm92aWRlZCB0byBidWlsZCB5b3VyIG93bgorICAgIExpbnV4IGRyaXZlciBmb3IgeW91ciBzcGVjaWZpYyBjb21wdXRlciBhbmQga2VybmVsLgorCis0LjEgQmVmb3JlIHlvdSBzdGFydAorCisgICAgMSkgRGV0ZXJtaW5lIHRoZSB0eXBlIGFuZCB2ZXJzaW9uIG9mIHRoZSBMaW51eCBrZXJuZWwgb2YgeW91ciBjb21wdXRlciBhbmQKKyAgICBjaGVjayB3aGV0aGVyIGl0IG1lZXRzIHRoZSBzeXN0ZW0gcmVxdWlyZW1lbnRzIGxpc3RlZCBpbiBzZWN0aW9uIDIgb2YgdGhpcworICAgIFJFQURNRS4KKworICAgIDIpIElmIHlvdSdyZSBidWlsZGluZyBmb3IgUEMgQ2FyZCBvciBDb21wYWN0IEZsYXNoLCByZWFkIHRoZSBMaW51eAorICAgIFBDTUNJQS1IT1dUTyBieSBEYXZpZCBIaW5kcy4gVGhpcyBkb2N1bWVudCBpcyBwcm9iYWJseSBwcm92aWRlZCBvbiB0aGUKKyAgICBDRC1ST00gb2YgeW91ciBMaW51eCBkaXN0cmlidXRpb24uIFlvdSBjYW4gZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uCisgICAgZnJvbToKKworICAgICAgICBodHRwOi8vcGNtY2lhLWNzLnNvdXJjZWZvcmdlLm5ldAorCisgICBQbGVhc2UgcmVhZCB0aGUgc2VjdGlvbiB0aXRsZWQgIlByZXJlcXVpc2l0ZXMgYW5kIGtlcm5lbCBzZXR1cCIgb2YgdGhlCisgICBQQ01DSUEtSE9XVE8uCisKKzQuMiBCdWlsZCB0aGUgZHJpdmVyIGZvciBQQyBDYXJkIC8gQ29tcGFjdCBGbGFzaAorCisgICAgMSkgT2J0YWluIGEgY29weSBvZiB0aGUgTGludXggUENNQ0lBIHBhY2thZ2UgZnJvbSBhIENELVJPTSBvZiB5b3VyIExpbnV4CisgICAgZGlzdHJpYnV0aW9uIG9yIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbi4KKyAgICBGb3IgeW91ciBjb252ZW5pZW5jZSwgdGhlIEFnZXJlIFN5c3RlbXMgV2lyZWxlc3MgQ0QtUk9NIGNvbnRhaW5zIGEgY29weSBvZgorICAgIHRoZSBQQ01DSUEgcGFja2FnZSBpbiBzdWItZGlyZWN0b3J5OiBYdHJhcy9MaW51eC9QQ01DSUEKKworICAgIDIpIFRvIHVucGFjayB0aGUgTGludXggUENNQ0lBIHBhY2thZ2UsIGNvcHkgaXQgdG8gdGhlIGN1cnJlbnQgd29ya2luZworICAgIGRpcmVjdG9yeSBhbmQgdHlwZToKKyAgICAgICAlIHRhciB4enZmIHBjbWNpYS1jcy14Lnkuei50YXIuZ3oKKyAgICAgICAlIG12IHBjbWNpYS1jcy14LnkueiBwY21jaWEtY3MKKworICAgIE5vdGU6IElmIHlvdSB1c2UgdGhlIGFyY2hpdmUgc3VwcGxpZWQgb24gdGhlIENEUk9NLCB1c2UgYXJjaGl2ZSBuYW1lCisgICAgInBjM18yXzEudGd6IiBpbnN0ZWFkIG9mICJwY21jaWEtY3MtMy4yLjcudGFyLmd6Ii4KKworICAgIE5vdGU6IGV2ZW4gdGhvdWdoIFBDTUNJQSBjb2RlIGV4aXN0cyBpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlLCB0aGUgUENNQ0lBCisgICAgQ2FyZCBTZXJ2aWNlcyBwYWNrYWdlIG5lZWRzIHRvIGJlIHVucGFja2VkIGxvY2FsbHkgdG8gYnVpbGQgZHJpdmVycyBiYXNlZAorICAgIG9uIGl0LgorCisgICAgMykgRXh0cmFjdCB0aGUgd2xhZ3M0OSBkaXN0cmlidXRpb24gYXJjaGl2ZSBvbiB0b3Agb2YgdGhlIExpbnV4IFBDTUNJQQorICAgIHBhY2thZ2UuCisgICAgICAgJSBjZCBwY21jaWEtY3MKKyAgICAgICAlIHRhciB4enZmIC4uL3dsX2xrbV83XzIyX2FiZy50YXIuZ3oKKworICAgIDQpIFRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBkcml2ZXIsIGZvbGxvdyB0aGUgcHJvY2VkdXJlIGJlbG93OgorICAgICAgICUgLi9Db25maWd1cmUKKworICAgIEFuc3dlciB0aGUgcHJlc2VudGVkIHF1ZXN0aW9ucy4gVXN1YWxseSB0aGUgZGVmYXVsdCBhbnN3ZXJzIGFyZSBPSyBhbmQKKyAgICBwcmVzc2luZyAiRW50ZXIiIGlzIGVub3VnaC4KKyAgICBPbiBuZXdlciBSZWRIYXQgc3lzdGVtcywgaG93ZXZlciwgeW91IHNob3VsZCBzcGVjaWZ5ICIvdXNyL3NyYy9saW51eC0yLjQiCisgICAgYXMgdGhlIExpbnV4IHNvdXJjZSBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAiL3Vzci9zcmMvbGludXgiLgorCisgICAgRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY29uZmlndXJhdGlvbiwgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcsCisgICAgc2VlIHRoZSBQQ01DSUEtSE9XVE8uCisKKyAgICBUbyBidWlsZCB0aGUgZGVmYXVsdCBkcml2ZXJzLCB3aGljaCBzdXBwb3J0IEhlcm1lcy1JSSBpbiBzdGF0aW9uIG1vZGUsIHJ1bgorICAgIHRoZSBCdWlsZCBzY3JpcHQ6CisgICAgICAgJSAuL0J1aWxkCisKKyAgICBUaGlzIHNjcmlwdCBkZXRlcm1pbmVzIHdoZXRoZXIgeW91ciBzeXN0ZW0gdXNlcyBpbi1rZXJuZWwgUENNQ0lBIGFuZCBlaXRoZXIKKyAgICBidWlsZHMgdGhlIGZ1bGwgUENNQ0lBIHBhY2thZ2Ugb3IganVzdCB0aGUgZHJpdmVyLgorCisgICAgQmVmb3JlIGluc3RhbGxpbmcgdGhlIGRyaXZlciB3aXRoIHRoZSBJbnN0YWxsIHNjcmlwdCwgeW91IG11c3QgYmVjb21lCisgICAgJ3Jvb3QnOgorICAgICAgICUgc3UKKyAgICAgICAuLgorICAgICAgICUgLi9JbnN0YWxsCisKKyAgICBUaGlzIHNjcmlwdCBkZXRlcm1pbmVzIHdoZXRoZXIgeW91ciBzeXN0ZW0gdXNlcyBpbi1rZXJuZWwgUENNQ0lBIGFuZCBlaXRoZXIKKyAgICBpbnN0YWxscyB0aGUgZnVsbCBQQ01DSUEgcGFja2FnZSBvciBqdXN0IHRoZSBkcml2ZXIuCisKKyAgICA1KSBJZiBpdCBiZWNvbWVzIG5lY2Vzc2FyeSB0byBjbGVhbiB0aGUgYnVpbGQsIGlzc3VlIHRoZSBmb2xsb3dpbmcKKyAgICBjb21tYW5kczoKKyAgICAgICAlIG1ha2UgY2xlYW4KKyAgICAgICAlIG1ha2UgLUMgbGliIGNsZWFuCisKKzQuMyBCdWlsZCB0aGUgZHJpdmVyIGZvciBQQ0kKKworICAgIDEpIEV4dHJhY3QgdGhlIHdsYWdzNDkgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgJSB0YXIgeHp2ZiB3bF9sa21fN18yMi50YXIuZ3oKKworICAgIE5vdGU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gdW5wYWNrIHRoZSBkcml2ZXIgc291cmNlIGludG8gYSBQQ01DSUEgYnVpbGQKKyAgICBkaXJlY3RvcnkuCisKKyAgICAyKSBUbyBidWlsZCB0aGUgUENJIGRyaXZlcjoKKyAgICAgICAlIG1ha2UgLWYgd2xhZ3M0OS5tayB3bGFnczQ5X2gyX3BjaQorICAgICAgIG9yCisgICAgICAgJSBtYWtlIC1mIHdsYWdzNDkubWsgd2xhZ3M0OV9oMjVfcGNpCisKKyAgICAzKSBJbnN0YWxsIHRoZSBkcml2ZXIuCisgICAgICAgJSBpbnNtb2QgLi93aXJlbGVzcy93bGFnczQ5X2gyNS5vCisKKyAgICA0KSBJZiBpdCBiZWNvbWVzIG5lY2Vzc2FyeSB0byBjbGVhbiB0aGUgYnVpbGQuCisgICAgICAgJSBtYWtlIC1mIHdsYWdzNDkubWsgcGNpX2NsZWFuCisKKzQuNCBDb25maWd1cmUgeW91ciBXaXJlbGVzcyBQQyBDYXJkCisKKyAgICBUaGVyZSBhcmUgMyB3YXlzIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyCisgICAgLSBtb2R1bGUgcGFyYW1ldGVycyAoL2V0Yy9wY21jaWEvY29uZmlnLm9wdHMpCisgICAgLSB3aXJlbGVzcyBleHRlbnNpb24gKC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMpCisgICAgLSBBZ2VyZSBjb25maWd1cmF0aW9uIGZpbGUgKC9ldGMvYWdlcmUvaXdjb25maWctZXRoIykKKworCis0LjQuMSBDb25maWd1cmUgdGhyb3VnaCAvZXRjL3BjbWNpYS9jb25maWcub3B0cworCisgICAgVG8gdXNlIHRoaXMgbWV0aG9kLCBtYWtlIHN1cmUgdGhhdCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzIGZpbGUgaXMgZWl0aGVyCisgICAgYWJzZW50IG9yIGNvbnRhaW5zIGJsYW5rIHBhcmFtZXRlciB2YWx1ZXMgYXMgc2hvd24gYmVsb3cuCisKKyAgICAqLCosKiwwMDo2MDoxRDoqfCosKiwqLDAwOjAyOjJEOiopCisgICAgICAgIElORk89IiIKKyAgICAgICAgRVNTSUQ9IiIKKyAgICAgICAgTU9ERT0iIgorICAgICAgICBLRVk9IiIKKyAgICA7OworCisgICAgMSkgVG8gY29uZmlndXJlIHRoZSBXaXJlbGVzcyBQQyBDYXJkLCBwbGVhc2UgcmVmZXIgdG86CisgICAgICAgKiBUaGUgb25saW5lIG1hbnVhbCBwYWdlICh3bGFnczQ5LjQpCisgICAgICAgICAlIG1hbiB3bGFnczQ5CisgICAgICAgKiBUaGUgbmV0d29yayBhZGFwdGVyIHNlY3Rpb25zIG9mIHRoZSBQQ01DSUEgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgICUgbW9yZSBQQ01DSUEtSE9XVE8KKworICAgIDIpIFVzZSBhbiBlZGl0b3IgdG8gY29uZmlndXJlIHRoZSBtb2R1bGUgcGFyYW1ldGVyczoKKyAgICAgICAjIHZpIC9ldGMvcGNtY2lhL2NvbmZpZy5vcHRzCisKKyAgICAgICBhKSBUbyBjb25uZWN0IHlvdXIgY29tcHV0ZXIgdG8gYSB3aXJlbGVzcyBpbmZyYXN0cnVjdHVyZSB0aGF0IGluY2x1ZGVzCisgICAgICAgYWNjZXNzIHBvaW50cyBzdWNoIGFzIHRoZSBBUC0xMDAwIG9yIEFQLTUwMCwgeW91IG5lZWQgdG8gaWRlbnRpZnkgdGhlCisgICAgICAgbmV0d29yayBuYW1lIG9mIHRoZSB3aXJlbGVzcyBpbmZyYXN0cnVjdHVyZS4KKworICAgICAgIEZvciBleGFtcGxlIGlmIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgdXNlcyB0aGUgbmV0d29yayBuYW1lICJNeSBOZXR3b3JrIiwKKyAgICAgICBlZGl0IHRoZSBjb25maWcub3B0cyBmaWxlIHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKworICAgICAgIG1vZHVsZSAiPGRyaXZlcl9uYW1lPiIgb3B0cyAibmV0d29ya19uYW1lPU15XCBOZXR3b3JrIgorCisgICAgICAgTm90aWNlIHRoYXQgdGhlIHNwYWNlIGNoYXJhY3RlciBuZWVkcyB0byBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2guCisKKyAgICAgICBiKSBUbyBjb25uZWN0IHlvdXIgY29tcHV0ZXIgdG8gYSBSZXNpZGVudGlhbCBHYXRld2F5IFJHLTEwMDAsIHlvdSBuZWVkCisgICAgICAgdG8ga25vdyB0aGUgUkcgSUQgKD1uZXR3b3JrX25hbWUpIGFuZCB0aGUgZW5jcnlwdGlvbiBrZXkuICBZb3UgY2FuIGZpbmQKKyAgICAgICB0aGUgUkcgSUQgb24gYSBzbWFsbCBsYWJlbCBvbiB0aGUgcmVhciBvZiB0aGUgdW5pdC4KKworICAgICAgIEZvciBleGFtcGxlIGlmIHlvdXIgUkctMTAwMCBoYXMgSUQgMjI1Y2NmIGFuZCB5b3UgZGlkIG5vdCBjaGFuZ2UgdGhlCisgICAgICAgZW5jcnlwdGlvbiBrZXkgeWV0LCBlZGl0IHRoZSBjb25maWcub3B0cyBmaWxlIHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKworICAgICAgIG1vZHVsZSAiPGRyaXZlcl9uYW1lPiIgb3B0cyAibmV0d29ya19uYW1lPVwiMjI1Y2NmXCIga2V5XzE9XCIyNWNjZlwiCisgICAgICAgZW5hYmxlX2VuY3J5cHRpb249WSIKKworICAgICAgIElmIHlvdSBjaGFuZ2VkIHlvdXIgZW5jcnlwdGlvbiBrZXksIHlvdSBzaG91bGQgc3BlY2lmeSB0aGlzIGtleSBhcyBrZXlfMQorICAgICAgIG9uIHRoZSBwYXJhbWV0ZXIgbGluZS4KKworICAgICAgIGMpIFRvIGNvbm5lY3QgeW91ciBjb21wdXRlciB0byBhIHBlZXItdG8tcGVlciBuZXR3b3JrLCBpbiBhbiBlbnZpcm9ubWVudAorICAgICAgIHdpdGhvdXQgYWNjZXNzIHBvaW50cywgdGhlIElCU1MgbW9kZSBpcyByZWNvbW1lbmRlZC4KKworICAgICAgIEZvciBleGFtcGxlIHRvIGNvbm5lY3QgdG8gYSBwZWVyLXRvLXBlZXIgbmV0d29yayBjYWxsZWQgIk15IE5ldHdvcmsiLAorICAgICAgIGVudGVyIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNvbmZpZy5vcHRzIGZpbGU6CisKKyAgICAgICBtb2R1bGUgIjxkcml2ZXJfbmFtZT4iIG9wdHMgImNyZWF0ZV9pYnNzPVkgbmV0d29ya19uYW1lPU15XCBOZXR3b3JrIgorCisgICAgICAgZCkgT3B0aW9uYWxseSB5b3UgY2FuIGFsc28gaW5jbHVkZSBhICJTdGF0aW9uIE5hbWUiIHZhbHVlIHRoYXQgY2FuIGJlCisgICAgICAgdXNlZCB0byBpbmRlbnRpZnkgeW91ciBjb21wdXRlciBvbiB0aGUgd2lyZWxlc3MgbmV0d29yay4KKworICAgICAgIEZvciBleGFtcGxlIGlmIHlvdSB3aXNoIHRvIG5hbWUgeW91ciBjb21wdXRlciAiV2F2ZTEiIHdoZW4gY29ubmVjdGluZyBpdAorICAgICAgIHRvIGEgd2lyZWxlc3MgaW5mcmFzdHJ1Y3R1cmUsICBlZGl0IHRoZSBjb25maWcub3B0cyBmaWxlIHRvIGluY2x1ZGUgdGhlCisgICAgICAgZm9sbG93aW5nOgorCisgICAgICAgbW9kdWxlICI8ZHJpdmVyX25hbWU+IiBvcHRzICJuZXR3b3JrX25hbWU9T2NlYW4gc3RhdGlvbl9uYW1lPVdhdmUxIgorCisgICAgICAgZSkgVG8gY29ubmVjdCB5b3VyIGNvbXB1dGVyIHRvIGFuIEFkLUhvYyB3b3JrZ3JvdXAgb2Ygd2lyZWxlc3MKKyAgICAgICBjb21wdXRlcnMsIGVudGVyIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGNvbmZpZy5vcHRzIGZpbGU6CisKKyAgICAgICBtb2R1bGUgIjxkcml2ZXJfbmFtZT4iIG9wdHMgInBvcnRfdHlwZT0zIgorCisgICAgICAgTm90ZSB0aGF0IHRoZSAiQWQtSG9jIERlbW8gTW9kZSIgaXMgbm90IHRoZSByZWNvbW1lbmRlZCBtb2RlIGZvciBhCisgICAgICAgcGVlci10by1wZWVyIG5ldHdvcmsuICBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGlzICBub24taW50ZXJvcGVyYWJsZSBtb2RlCisgICAgICAgaXMgb25seSBleHBsYWluZWQgaGVyZSBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgKGUuZy4gcmVzZWFyY2gsIG9yCisgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIC8gcHJldmlvdXMgV2F2ZUxBTi9JRUVFIHByb2R1Y3RzKS4KKworICAgICAgIFRoZSBJQlNTIG1vZGUgZGVzY3JpYmVkIGluIGMpIGlzIHRoZSBwcmVmZXJyZWQgYW5kIGludGVyb3BlcmFibGUgbW9kZQorICAgICAgIGZvciBjcmVhdGluZyBhIHBlZXItdG8tcGVlciBuZXR3b3JrLgorCisgICAgMykgVXNlIGFuIGVkaXRvciB0byBtb2RpZnkgdGhlIG5ldHdvcmsgb3B0aW9ucyBmb3IgeW91ciBhZGFwdGVyLgorICAgICAgICMgdmkgL2V0Yy9wY21jaWEvbmV0d29yay5vcHRzCisKKyAgICAgICBUaGUgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGNvcnJlY3QgZm9yIHRoZSBjb25uZWN0ZWQgbmV0d29yay4gQ2hlY2sgd2l0aAorICAgICAgIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgZm9yIHRoZSBjb3JyZWN0IG5ldHdvcmsgaW5mb3JtYXRpb24uICBSZWZlciB0bworICAgICAgIHRoZSBQQ01DSUEtSE9XVE8gZm9yIG1vcmUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgICAgIEZvciBleGFtcGxlOgorICAgICAgICAgICAgKiwqLCosKikKKyAgICAgICAgICAgICAgICBJRl9QT1JUPSIiCisgICAgICAgICAgICAgICAgQk9PVFA9Im4iCisgICAgICAgICAgICAgICAgSVBBRERSPSIxMC4wLjAuNSIKKyAgICAgICAgICAgICAgICBORVRNQVNLPSIyNTUuMjU1LjI1NS4wIgorICAgICAgICAgICAgICAgIE5FVFdPUks9IjEwLjAuMC4wIgorICAgICAgICAgICAgICAgIEJST0FEQ0FTVD0iMTAuMC4wLjI1NSIKKyAgICAgICAgICAgICAgICBHQVRFV0FZPSIxMC4wLjAuMSIKKyAgICAgICAgICAgICAgICBET01BSU49ImRvbWFpbi5vcmciCisgICAgICAgICAgICAgICAgRE5TXzE9ImRuczEuZG9tYWluLm9yZyIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgUmVkSGF0IGFuZCBTdXNlIGRvIG5vdCB1c2UgdGhlIG5ldHdvcmsub3B0cyB0byBjb25maWd1cmUgdGhlIGRyaXZlci4KKyAgICAgICBJbnN0ZWFkIFJlZEhhdCB1c2VzIGEgR1VJLWJhc2VkIHRvb2wgY2FsbGVkICduZWF0JyAoJ25ldC5jZmcnIGluIG9sZGVyCisgICAgICAgdmVyc2lvbnMpIGFuZCBTdVNFIExpbnV4IHVzZXMgJ1lhU1QnLiBUaGVzZSB0b29scyBjcmVhdGVzIHNjcmlwdHMsIGxpa2UKKyAgICAgICBpZmNmZy1ldGgwLCBpbiB0aGUgZGlyZWN0b3J5IC9ldGMvc3lzY29uZmlnL25ldHdvcmstc2NyaXB0cy4gVXNpbmcgdGhlCisgICAgICAgZGVmYXVsdCBHTk9NRSBtZW51LCB5b3UgY2FuIHN0YXJ0IG5ldGNmZyBmcm9tOiBQcm9ncmFtcy0+U3lzdGVtLT5OZXR3b3JrCisgICAgICAgQ29uZmlndXJhdGlvbi4KKworICAgIDQpIFJlc3RhcnQgdGhlIFBDTUNJQSBzZXJ2aWNlcy4KKyAgICAgICAjIC9ldGMvcmMuZC9yYy5wY21jaWEgcmVzdGFydAorICAgICAgICAgb3IKKyAgICAgICAjIC9ldGMvcmMuZC9pbml0LmQvcGNtY2lhIHJlc3RhcnQKKworCisgICAgRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBhYm91dCB0aGUgdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kCisgICAgZGVmaW5pdGlvbnMsIHBsZWFzZSBjb25zdWx0IHRoZSBXaXJlbGVzcyBkb2N1bWVudGF0aW9uLgorCis0LjQuMiBDb25maWd1cmUgdGhyb3VnaCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzCisKKyAgICBUaGlzIGRyaXZlciBoYXMgc3VwcG9ydCBmb3IgdGhlICJXaXJlbGVzcyBFeHRlbnNpb25zIi4gIFRoaXMgaW50ZXJmYWNlCisgICAgYWxsb3dzIHRoZSAiV2lyZWxlc3MgVG9vbHMiIHRvIGdldCBzdGF0aXN0aWNzIGZyb20gdGhlIGRyaXZlciBhbmQgYWxsb3dzIHRvCisgICAgY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkcml2ZXIgb24gdGhlIGZseS4KKworICAgIFRoZSBsYXRlc3QgdmVyc2lvbnMgb2YgdGhlIFBDTUNJQSBwYWNrYWdlIGNvbnRhaW4gc2NyaXB0cyB0aGF0IHVzZSB0aGUKKyAgICB3aXJlbGVzcyBleHRlbnNpb24gdG8gY29uZmlndXJlIHRoZSBkcml2ZXIgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlCisgICAgY29uZmlndXJhdGlvbiB0aHJvdWdoIG1vZHVsZSBwYXJhbWV0ZXJzIGFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDQuNC4xLgorICAgIFJlYWQgdGhlIC9ldGMvcGNtY2lhL3dpcmVsZXNzLm9wdHMgZmlsZSBmb3IgdGhlIHRoZW9yeSBvZiBvcGVyYXRpb24uICBXaGVuCisgICAgdGhlIGRyaXZlciBpcyBjb25maWd1cmVkLCBnbyB0byBzZWN0aW9uIDQuNC4xIHN0ZXAgMyB0byBjb25maWd1cmUgdGhlCisgICAgbmV0d29yayBwYXJhbWV0ZXJzLgorCisgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgV0VCIHBhZ2VzOgorICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvTGludXguV2lyZWxlc3MuRXh0ZW5zaW9ucy5odG1sCisgICAgaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC9Ub29scy5odG1sCisKKzQuNC4zIENvbmZpZ3VyZSB0aHJvdWdoIC9ldGMvYWdlcmUvaXdjb25maWctZXRoIworCisgICAgSW4gYWRkaXRpb24gdG8gdXNpbmcgZWl0aGVyIHRoZSBtb2R1bGUgb3B0aW9ucyBvciB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucworICAgIG1ldGhvZHMgdG8gY29uZmlndXJlIGEgd2lyZWxlc3MgZGV2aWNlLCB0aGlzIHZlcnNpb24gb2YgdGhlIHNvZnR3YXJlIGFsc28KKyAgICBzdXBwb3J0cyBhbiBBZ2VyZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4gVGhpcyB3YXMgZG9uZSBiZWNhdXNlOgorICAgICogTW9kdWxlIG9wdGlvbnMgY29uZmlndXJlcyBtdWx0aXBsZSBkZXZpY2VzIHRoZSBzYW1lLgorICAgICogV2lyZWxlc3MgZXh0ZW5zaW9ucyBwYXJhbWV0ZXJzIGRvIG5vdCBjb3ZlciBhbGwgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zCisgICAgICBpbiB0aGUgZHJpdmVyLgorCisgICAgRm9yIGVhY2ggd2lyZWxlc3MgZXRoZXJuZXQgZGV2aWNlIChpZGVudGlmaWVkIGJ5IGV0aDxuPiwgd2hlcmUgbiBpcyBhCisgICAgcG9zaXRpdmUgaW50ZWdlciksIGEgZmlsZSAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aDxuPiBjYW4gYmUgY3JlYXRlZCB3aGljaAorICAgIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgd2lyZWxlc3MgZGV2aWNlLiBGb3IgZXhhbXBsZSwgdGhlCisgICAgZmlsZSAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aDEgaXMgdGhlIGNvbmZpZyBmaWxlIGZvciBldGgxLiBUaGlzIGZpbGUgc2hvdWxkCisgICAgY29udGFpbiBLZXkvVmFsdWUgcGFpcnMgaW4gdGhlIGZvcm1hdDoKKworICAgIDxLZXk+PTxWYWx1ZT4KKworICAgIHdoZXJlIDxLZXk+IGlzIHRoZSBwYXJhbWV0ZXIgdG8gY29uZmlndXJlIGFuZCA8VmFsdWU+IGlzIHRoZSB2YWx1ZSB0bworICAgIGFzc2lnbiBpdC4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb25maWcgZmlsZSAvZXRjL2FnZXJlL2l3Y29uZmlnLWV0aDEKKyAgICBkZXNjcmliZWQgYWJvdmUgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKKworICAgIERlc2lyZWRTU0lEPXNvbWVfbmV0d29yaworICAgIEVuYWJsZUVuY3J5cHRpb249WQorICAgIEtleTE9bmV0MDEKKyAgICBUeEtleT0xCisKKyAgICB0aGlzIGNvbmZpZ3VyZXMgZXRoMSB0byBhc3NvY2lhdGUgdG8gdGhlIEVTU0lEICdzb21lX25ldHdvcmsnIHdpdGgKKyAgICBlbmNyeXB0aW9uIG9uLCB3aGVyZSB0aGUgdGhlIGZpcnN0IGVuY3J5cHRpb24ga2V5IGlzICduZXQwMScgYW5kIHRoZSBrZXkgdG8KKyAgICB1c2UgZm9yIGVuY3J5cHRpb24gaXMgS2V5IDEuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIG9uIEFnZXJlIGhhcmR3YXJlIHdoaWNoIHVzZXMgdGhpcyBkcml2ZXIuIEZvcgorICAgIG90aGVyIHdpcmVsZXNzIGRyaXZlcnMsIG9yIG5vbi13aXJlbGVzcyBkZXZpY2VzLCB0aGlzIGZpbGUgY2FuIGJlIHByZXNlbnQsCisgICAgYnV0IGhhcyBubyBlZmZlY3QuCisKKyAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIG1hbiBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29uZmlndXJhdGlvbgorICAgIGZpbGUgYW5kIHRoZSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldC4KKworCis0LjUgQ29uZmlndXJpbmcgeW91ciBXaXJlbGVzcyBQQ0kgY2FyZAorCisgICAgTm90ZSB0aGF0IHRoZSBhYm92ZSBtZXRob2Qgb2YgY29uZmlndXJpbmcgdGhlIGNhcmQgdXNpbmcKKyAgICAvZXRjL3BjbWNpYS9jb25maWcub3B0cyBpcyBvbmx5IHZhbGlkIGZvciBQQ01DSUEvQ0YgY2FyZHMuIEZvciBbbWluaV1QQ0kKKyAgICBhbmQgQ2FyZEJ1cyBjYXJkcywgcmVmZXIgdG8geW91ciBzeXN0ZW0ncyBkb2N1bWVudGF0aW9uIG9uIG1vZHVsZXMuY29uZiB0bworICAgIGxvYWQgdGhlIGRyaXZlciB3aXRoIHRoZSBwcm9wZXIgb3B0aW9ucyBmb3IgYSBnaXZlbiB3aXJlbGVzcyBldGhlcm5ldAorICAgIGludGVyZmFjZS4gSW4gYWRkaXRpb24sIG5ldHdvcmsgY29uZmlndXJhdGlvbiB0b29scyBsaWtlICduZXRjZmcnLCAnbmVhdCcsCisgICAgb3IgJ1lhU1QnIChzZWUgU2VjdGlvbiA0LjQuMSwgU3RlcCAzKSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIG1pbmlQQ0kKKyAgICBjYXJkLiBMYXN0bHksIHRoZSBBZ2VyZSBjb25maWd1cmF0aW9uIGZpbGUgZGVzY3JpYmVkIGluIFNlY3Rpb24gNC40LjMgbWF5CisgICAgYWxzbyBiZSB1c2VkIGZvciBbbWluaV1QQ0kgYW5kIENhcmRCdXMgZGV2aWNlcy4KKworNC42IFRyb3VibGVzaG9vdGluZworCisgICAgV2hlbiB0aGUgV2lyZWxlc3MgUEMgQ2FyZCBpcyBpbnNlcnRlZCwgdGhlIGNhcmQgbWFuYWdlciBlbWl0IGJlZXBzIGluCisgICAgZGlmZmVyZW50IHRvbmVzIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24KKyAgICBzdGVwcy4KKyAgICAgIGEpIFR3byBoaWdoIGJlZXBzCisgICAgICAgICAtIFRoZSBjYXJkIHdhcyBpZGVudGlmaWVkIGFuZCBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgIGIpIE9uZSBoaWdoIGJlZXAgZm9sbG93ZWQgYnkgYSBsb3cgYmVlcAorICAgICAgICAgLSBUaGUgY2FyZCB3YXMgaWRlbnRpZmllZCwgYnV0IGNvdWxkIG5vdCBiZSBjb25maWd1cmVkLgorICAgICAgICAgLSBFeGFtaW5lIHRoZSBzeXN0ZW0gbG9nIChkbWVzZykgZm9yIFBDTUNJQSBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2VzLgorICAgICAgYykgT25lIGxvdyBiZWVwCisgICAgICAgICAtIFRoZSBjYXJkIGNvdWxkIG5vdCBiZSBpZGVudGlmaWVkLgorICAgICAgICAgLSBFeGVjdXRlICJjYXJkY3RsIGlkZW50IiB0byBkaXNwbGF5IHRoZSBhZGFwdGVyIFBuUCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgVmVyaWZ5IHRoZSBQblAgaW5mb3JtYXRpb24gbWF0Y2hlcyBhbiBlbnRyeSBpbiB0aGUgUENNQ0lBCisgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSAoL2V0Yy9wY21jaWEvY29uZmlnKS4KKyAgICAgICAgIC0gRXhhbWluZSB0aGUgc3lzdGVtIGxvZyAoZG1lc2cpIGZvciBQQ01DSUEgZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlcy4KKworICAgIFRoZSBXaXJlbGVzcyBQQyBDYXJkIGhhcyB0d28gTEVEcyB0aGF0IGluZGljYXRlIHRoZSBzdGF0ZSBvZiB0aGUgYWRhcHRlcgorICAgIGFuZCBuZXR3b3JrLgorICAgICAgKiBQb3dlciBMRUQgKHRvd2FyZCB0aGUgbWlkZGxlIG9mIHRoZSBhZGFwdGVyKQorICAgIAktIFRoaXMgTEVEIGluZGljYXRlcyBwb3dlciBoYXMgYmVlbiBhcHBsaWVkLCBhbmQgdGhlIGNhcmQgaXMKKyAgICAJICBmdW5jdGlvbmFsLiBJbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUgd2l0aCBDYXJkIFBvd2VyIE1hbmFnZW1lbnQKKyAgICAJICBkaXNhYmxlZCwgaXQgaXMgc3RlYWR5LW9uLiBXaXRoIENhcmQgUG93ZXIgTWFuYWdlbWVudCBlbmFibGVkLCBpdAorICAgIAkgIGJsaW5rcyByYXBpZGx5IChzZXZlcmFsIHRpbWVzIHBlciBzZWNvbmQpLgorICAgICAgKiBUcmFuc21pdC9SZWNlaXZlIExFRCAoY2xvc2VyIHRvIHRoZSBlZGdlIG9mIHRoZSBhZGFwdGVyKQorICAgICAgICAtIFRoaXMgTEVEIGZsYXNoZXMgd2hlbiBpdCBkZXRlY3RzIHRyYW5zbWl0IG9yIHJlY2VpdmUgcGFja2V0cy4KKworICAgICAgKiBCb3RoIExFRHMgYmxpbmsgYXQgdGhlIHNhbWUgdGltZSBldmVyeSAxMCBzZWNvbmRzLgorICAgIAktIFRoZSBhZGFwdGVyIHdhcyB1bmFibGUgdG8gbWFrZSBjb250YWN0IHdpdGggdGhlIG5hbWVkIHdpcmVsZXNzCisgICAgCSAgbmV0d29yay4gVmVyaWZ5IHRoZSBuZXR3b3JrX25hbWUsIGluIHRoZSBjb25maWcub3B0cyBmaWxlIG1hdGNoZXMgdGhlCisgICAgCSAgbmV0d29yayBuYW1lIG9mIHRoZSBhY2Nlc3MgcG9pbnQuCisgICAgICAqIExFRHMgaW5kaWNhdGUgbm9ybWFsIG9wZXJhdGlvbiB3aXRoIHRoZSBQb3dlciBMRUQKKyAgICAJc3RlYWR5LW9uIG9yIGJsaW5raW5nIHJhcGlkbHkgYW5kIFRyYW5zbWl0L1JlY2VpdmUgTEVEIGZsYXNoaW5nLCBidXQgbm8KKyAgICAJdHJhZmZpYy4KKyAgICAJLSBJZiB0aGUgbmV0d29yayBpcyBvcGVyYXRpbmcgaW4gbm9ybWFsIG1vZGUgKGllLiAgcG9ydF90eXBlID0gMCBvciBub3QKKyAgICAJICBzcGVjaWZpZWQpLCBhbmQgYSBuZXR3b3JrX25hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLCB2ZXJpZnkgdGhlCisgICAgCSAgd29ya3N0YXRpb24gbmV0d29yayBwYXJhbWV0ZXJzIChpZmNvbmZpZywgcm91dGUsIGV0Yy4pIGFyZSBjb3JyZWN0CisgICAgCSAgZm9yIHRoZSB3aXJlbGVzcyBuZXR3b3JrLgorICAgIAktIElmIHRoZSBuZXR3b3JrIGlzIG9wZXJhdGluZyBpbiBBZC1Ib2MgKHBlZXItdG8tcGVlcikgbW9kZSAoaWUuCisgICAgCSAgcG9ydF90eXBlID0gMyksIHRoZSBhZGFwdGVyIG5lZWRzIGFub3RoZXIgd29ya3N0YXRpb24vYWRhcHRlciB0bworICAgIAkgIGNvbW11bmljYXRlIHdpdGguICBWZXJpZnkgdGhlIG5ldHdvcmsgcGFyYW1ldGVycyBvbiBib3RoIG9mIHRoZQorICAgIAkgIHdvcmtzdGF0aW9ucyAoaWZjb25maWcsIHJvdXRlLCBldGMuKSBhcmUgY29ycmVjdC4KKworICAgIFJlZmVyIHRvIHRoZSBvbmxpbmUgbWFudWFsIHBhZ2UgZm9yIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiwgZmVhdHVyZSBhbmQKKyAgICBzdXBwb3J0IGluZm9ybWF0aW9uLgorICAgICAgICUgbWFuIHdsYWdzNDkKKyAgICAgICAgIG9yCisgICAgICAgJSBtYW4gNCB3bGFnczQ5CisgICAgICAgICBvcgorICAgICAgICUgbnJvZmYgLW1hbiB3bGFnczQ5LjQgfCBtb3JlCisKKzQuNyBJZGVudGlmeWluZyB0aGUgc29mdHdhcmUKKworICAgIFRoaXMgc2VjdGlvbiBleHBsYWlucyBob3cgdG8gaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgdGhpcyBzb2Z0d2FyZSBvbmNlIGl0CisgICAgaXMgdW5wYWNrZWQgb3IgaW5zdGFsbGVkLgorCisgICAgVGhlIExpbnV4IERyaXZlciBTb3VyY2UvTGlicmFyeSBkaXN0cmlidXRpb24gY29uc2lzdCBvZiB0d28gbWFpbgorICAgIGNvbXBvbmVudHMsIHRoZSBkcml2ZXIgc291cmNlIGFuZCB0aGUgSENGIG1vZHVsZS4KKworICAgICogVG8gcXVpY2tseSBpZGVudGlmeSB0aGUgdmVyc2lvbiBvZiB0aGUgc291cmNlLCB0eXBlOgorICAgICAgJSBncmVwIERSVi4qVkVSU0lPTiBpbmNsdWRlL3dpcmVsZXNzL3dsX3ZlcnNpb24uaAorICAgICAgI2RlZmluZSBEUlZfTUFKT1JfVkVSU0lPTiAgIDcKKyAgICAgICNkZWZpbmUgRFJWX01JTk9SX1ZFUlNJT04gICAyMgorCisgICAgKiBUbyBpZGVudGlmeSB0aGUgcmV2aXNpb24gb2YgdGhlIEhDRiBsaWJyYXJ5IGNvbnRhaW5lZCBpbiB0aGUgZHJpdmVyLAorICAgICAgdHlwZToKKyAgICAgICUgZ3JlcCBIQ0YuUmV2aXNpb24gaGNmL2hjZi5jCisgICAgICAjZGVmaW5lIEhDRl9WRVJTSU9OICBURVhUKCAiSENGJFJldmlzaW9uOiAxLjggJCIgKQorCisgICAgVG8gaWRlbnRpZnkgYSBjb21waWxlZCB3bGFnczQ5IGRyaXZlciwgZ28gdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZHJpdmVyCisgICAgaXMgbG9jYXRlZC4gQ2FyZCBTZXJ2aWNlcyBkcml2ZXJzICh3bGFnczQ5X2gyX2NzLm8gYW5kIHdsYWdzNDlfaDI1X2NzLm8pCisgICAgYXJlIGxvY2F0ZWQgaW46CisgICAgL2xpYi9tb2R1bGVzLzxrZXJuZWwtdmVyc2lvbj4vcGNtY2lhCisKKyAgICBQQ0kgZHJpdmVycyAod2xhZ3M0OV9oMi5vKSBhcmUgbG9jYXRlZCBpbjoKKyAgICAvbGliL21vZHVsZXMvPGtlcm5lbC12ZXJzaW9uPi9rZXJuZWwvZHJpdmVycy9uZXQKKworICAgICogVG8gcmV0cmlldmUgdGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGRyaXZlciwgdHlwZToKKyAgICAgICUgc3RyaW5ncyA8ZHJpdmVyX25hbWU+Lm8gfCBncmVwIEFnZXJlCisgICAgICA8ZHJpdmVyX25hbWU+IHY3LjIyLWFiZy1CZXRhIGZvciBQQ01DSUEKKyAgICAgIDxkcml2ZXJfbmFtZT4gdjcuMjItYWJnLUJldGEgZm9yIFBDSQorCisgICAgKiBMaWtld2lzZSwgdG8gcmV0cmlldmUgdGhlIHJldmlzaW9uIG9mIHRoZSBIQ0YgdXNlZCB0byBjb21waWxlIHRoZSBkcml2ZXIsCisgICAgICB0eXBlOgorICAgICAgJSBzdHJpbmdzIDxkcml2ZXJfbmFtZT4ubyB8IGdyZXAgUmV2aXNpb24KKyAgICAgIEhDRiRSZXZpc2lvbjogNS4xNQorCisgICAgQXQgc3RhcnR1cCB0aGUgd2xhZ3M0OSBkcml2ZXIgcmVwb3J0cyBpdHMgdmVyc2lvbiBpbiB0aGUgc3lzdGVtIGxvZyBmaWxlCisgICAgKC92YXIvbG9nL21lc3NhZ2VzKS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis1LiAgVEVDSE5JQ0FMIENPTlNUUkFJTlRTCisKKyAgICBBdCB0aGUgdGltZSBvZiByZWxlYXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgYXJlCisgICAgaWRlbnRpZmllZDoKKworNS4xIFVzaW5nIHRoZSBJU0EgYWRhcHRlcgorCisgICAgRGVzY3JpcHRpb246IFRvIGFsbG93IG9wZXJhdGlvbiBpbiBkZXNrdG9wIGNvbXB1dGVycyBBZ2VyZSBhbHNvIHByb3ZpZGVzIGFuCisgICAgb3B0aW9uYWwgSVNBIGJ1cyB0byBQQyBDYXJkIGFkYXB0ZXIgKGFsc28gcmVmZXJyZWQgdG8gYXMgInN3YXBib3giKS4KKworICAgIFRoaXMgSVNBIEFkYXB0ZXIgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIHR3byBkaWZmZXJlbnQgSS9PIEFkZHJlc3MgdmFsdWVzOgorICAgICAgKiAzRTIgKGZhY3Rvcnktc2V0IGRlZmF1bHQpCisgICAgICAqIDNFMAorCisgICAgSW1wYWN0OiBCeSBkZWZhdWx0IHRoZSBpODIzNjUgbW9kdWxlIG9mIHRoZSBMaW51eCBwY21jaWEgcGFja2FnZSBvbmx5CisgICAgcHJvYmVzIGF0IDNFMC4KKworICAgIEFjdGlvbnM6CisgICAgMSkgUmVhZCB0aGUgbWFudWFsIHBhZ2Ugb24gdGhlIHByb2Jpbmcgb2YgdGhlIGk4MjM2NSBtb2R1bGUsIGJ5IHR5cGluZyB0aGUKKyAgICBjb21tYW5kOgorICAgICAgICBtYW4gaTgyMzY1CisKKyAgICAyKSBBcHBseSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmcgb3B0aW9uczoKKyAgICAgICBhKSBDaGFuZ2UgdGhlIEkvTyBhZGRyZXNzIHN0cmFwcGluZyBvZiB0aGUgSVNBIGFkYXB0ZXIgYnkgcmVwbGFjaW5nIHRoZQorICAgICAgICAgIGp1bXBlciBvbiB0aGUgSVNBIGFkYXB0ZXIuICBUaGUgY29ycmVjdCBqdW1wZXIgc2V0dGluZyBpcyBwaWN0dXJlZCBpbgorICAgICAgICAgIHRoZSBlbGVjdHJvbmljICJXaXJlbGVzcyBJU0EgQWRhcHRlciwgR2V0dGluZyBTdGFydGVkIEd1aWRlIiBwcm92aWRlZAorICAgICAgICAgIG9uIHRoZSBXaXJlbGVzcyBTb2Z0d2FyZSBDRC1ST00uIFRoaXMgZ3VpZGUgaXMgcHJvdmlkZWQgaW4gQWRvYmUncworICAgICAgICAgIEFjcm9iYXQgUERGIGZvcm1hdC4KKworICAgICAgIGIpIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9hZCB0aGUgaTgyMzY1IG1vZHVsZSB3aXRoIHRoZQorICAgICAgICAgICJleHRyYV9zb2NrZXRzIiBwYXJhbWV0ZXIgc2V0IHRvIDEuCisKKyAgICAgICAgICBPbiBhIFJlZEhhdCA1LnggdGhydSA3LngsIHN5c3RlbSwgcHV0IHRoaXMgaW4gdGhlIGZpbGUKKyAgICAgICAgICAiL2V0Yy9zeXNjb25maWcvcGNtY2lhIjoKKyAgICAgICAgICAgICBQQ01DSUE9eWVzCisgICAgICAgICAgICAgUENJQz1pODIzNjUKKyAgICAgICAgICAgICBQQ0lDX09QVFM9ImV4dHJhX3NvY2tldHM9MSIKKyAgICAgICAgICAgICBDT1JFX09QVFM9CisgICAgICAgICAgICAgQ0FSRE1HUl9PUFRTPQorCisgICAgICAgICAgRm9yIG90aGVyIExpbnV4IGRpc3RyaWJ1dGlvbnMsIHlvdSBhcmUgYWR2aXNlZCB0byBjb25zdWx0IHRoZQorICAgICAgICAgICJQQ01DSUEtSE9XVE8iIG5vdGVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCBjaGFuZ2luZyB0aGUgSS9PIEFkZHJlc3MKKyAgICAgICAgICBwcm9iaW5nLgorCis1LjIgVXNpbmcgdGhlIFBDSSBBZGFwdGVyCisKKyAgICBEZXNjcmlwdGlvbjogVG8gYWxsb3cgb3BlcmF0aW9uIGluIGRlc2t0b3AgY29tcHV0ZXJzIEFnZXJlIGFsc28gcHJvdmlkZXMgYW4KKyAgICBvcHRpb25hbCBQQ0kgYnVzIHRvIFBDIENhcmQgYWRhcHRlciAoYWxzbyByZWZlcnJlZCB0byBhcyAic3dhcGJveCIpLgorCisgICAgRm9yIGNvcnJlY3QgaW50ZXJydXB0IGFzc2lnbm1lbnQsIHRoZSBzeXN0ZW0gc2hvdWxkIHN1cHBvcnQgUENJQklPUyAyLjIuCisgICAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFBDTUNJQSBwYWNrYWdlIHZlcnNpb24gMy4yLjcgb3IgaGlnaGVyLgorCisgICAgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgaW50ZXJydXB0IHJvdXRpbmcgbWV0aG9kIG9mIHRoZSBQQ0kKKyAgICBBZGFwdGVyJ3MgVEkgQ2FyZEJ1cyBDb250cm9sbGVyIGlzIGluY29ycmVjdC4KKworICAgIEFjdGlvbnM6CisgICAgMSkgUmVhZCB0aGUgbWFudWFsIHBhZ2Ugb24gdGhlICJPcHRpb25zIHNwZWNpZmljIGZvciBUSSBDYXJkQnVzCisgICAgQ29udHJvbGxlcnMiIG9mIHRoZSBpODIzNjUgbW9kdWxlLCBieSB0eXBpbmcgdGhlIGNvbW1hbmQ6CisgICAgICAgIG1hbiBpODIzNjUKKworICAgIDIpIExvYWQgdGhlIGk4MjM2NSBtb2R1bGUgd2l0aCB0aGUgImlycV9tb2RlIiBwYXJhbWV0ZXIgc2V0IHRvIDAuCisgICAgICAgT24gYSBSZWRIYXQgNS54IHRocnUgNy54IHN5c3RlbSwgcHV0IHRoaXMgaW4gdGhlIGZpbGUKKyAgICAgICAiL2V0Yy9zeXNjb25maWcvcGNtY2lhIjoKKyAgICAgICAgICAgUENNQ0lBPXllcworICAgICAgICAgICBQQ0lDPWk4MjM2NQorICAgICAgICAgICBQQ0lDX09QVFM9ImlycV9tb2RlPTAiCisgICAgICAgICAgIENPUkVfT1BUUz0KKyAgICAgICAgICAgQ0FSRE1HUl9PUFRTPQorCisgICBGb3IgdGhlIGxvY2F0aW9uIG9mIHRoZSBQQ01DSUEgc2NyaXB0cyBvbiBvdGhlciBMaW51eCBkaXN0cmlidXRpb25zLCB5b3UKKyAgIGFyZSBhZHZpc2VkIHRvIGNvbnN1bHQgdGhlICJQQ01DSUEtSE9XVE8iLCAiTm90ZXMgYWJvdXQgc3BlY2lmaWMgTGludXgKKyAgIGRpc3RyaWJ1dGlvbnMiLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzYuICBLTk9XTiBJU1NVRVMKKworICAgIFRoaXMgaXMgdGhlIGN1cnJlbnQgbGlzdCBvZiBrbm93biBpc3N1ZXMgZm9yIHRoaXMgcmVsZWFzZSwgYW5kIHdpbGwgYmUKKyAgICBhZGRyZXNzZWQgaW4gdGhlIG5lYXIgZnV0dXJlOgorCisgICAgMS4gVGhpcyBkcml2ZXIgcmVsZWFzZSBjb250YWlucyBhIHZlcnNpb24gb2YgSGVybWVzLUlJLjUgZmlybXdhcmUgd2hpY2gKKyAgICBSRVFVSVJFUyBjYWxpYnJhdGVkIGNhcmRzLiBJZiB0aGVyZSBpcyBubyBjYWxpYnJhdGlvbiBkYXRhIHByZXNlbnQgaW4gdGhlCisgICAgUERBIG9mIHRoZSBoYXJkd2FyZSwgdGhlIGZpcm13YXJlIGRvZXMgbm90IG9wZXJhdGUuCisKKyAgICAyLiBXRFMgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICAzLiBETUEgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICA0LiBXUEEgaXMgbm90IHlldCBzdXBwb3J0ZWQuCisKKyAgICA1LiAzMi1iaXRzIEkvTyBpcyBub3QgeWV0IHN1cHBvcnRlZC4KKworICAgIDYuIFRoZSBjdXJyZW50IEJ1aWxkIHNjcmlwdCBhbHNvIGJ1aWxkcyB0aGUgUENJIGRyaXZlcnMuCisKKyAgICA3LiBUaGUgY3VycmVudCBJbnN0YWxsIHNjcmlwdCBhbHNvIGNvcGllcyB0aGUgUENJIGRyaXZlcnMgdG8gdGhlIGxpYgorICAgIGRpcmVjdG9yeS4KKworCTguIElmIEYvVyBmaWxlcyBhcmUgcmVxdWlyZWQgZnJvbSBvdXRzaWRlIHRoaXMgcmVsZWFzZSwgdGhlIGVudHJ5IHBvaW50cworCWluc2lkZSB0aGVzZSBGL1cgZmlsZXMgaGF2ZSB0byBiZSByZW5hbWVkIGZyb20gImFwIiBhbmQgInN0YXRpb24iIHRvCisJImZ3X2ltYWdlIiBhbmQgdGhleSBoYXZlIHRvIGJlIHJlbmFtZWQgdG8gZndfaDIuYyBhbmQgZndfaDI1LmMgZm9yCisJSGVybWVzLUlJIGFuZCBIZXJtZXMtSUkuNS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis3LiAgVEVDSE5JQ0FMIFNVUFBPUlQKKworNy4xIEZpbmRpbmcgSW5mb3JtYXRpb24KKworICAgIE9uIHRoZSBBZ2VyZSBTeXN0ZW1zIFdlYiBTaXRlIHlvdSBjYW4gZmluZCB0aGUgbW9zdCByZWNlbnQgZGV2aWNlIGRyaXZlcnMsCisgICAgc29mdHdhcmUgdXBkYXRlcyBhbmQgdXNlciBkb2N1bWVudGF0aW9uLgorCisgICAgV29ybGQgV2lkZSBXZWI6ICAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisKKzcuMiBDb250YWN0IFRlY2huaWNhbCBTdXBwb3J0CisKKyAgICBJZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zIHdoZW4gaW5zdGFsbGluZyBvciB1c2luZyB0aGlzIHByb2R1Y3QsIG9yIHdvdWxkCisgICAgbGlrZSBpbmZvcm1hdGlvbiBhYm91dCBvdXIgb3RoZXIgIldpcmVsZXNzIiBwcm9kdWN0cywgcGxlYXNlIGNvbnRhY3QgeW91cgorICAgIGxvY2FsIEF1dGhvcml6ZWQgIldpcmVsZXNzIiBSZXNlbGxlciBvciBBZ2VyZSBTeXN0ZW1zIHNhbGVzIG9mZmljZS4KKworICAgIEFkZHJlc3NlcyBhbmQgdGVsZXBob25lIG51bWJlcnMgb2YgdGhlIEFnZXJlIFN5c3RlbXMgc2FsZXMgb2ZmaWNlcyBhcmUKKyAgICBsaXN0ZWQgb24gb3VyIEFnZXJlIFN5c3RlbXMgd2ViIHNpdGUuCisKKyAgICBXaGVuIGNvbnRhY3RpbmcgVGVjaG5pY2FsIFN1cHBvcnQsIHBsZWFzZSB1c2UgdGhlIFByb2JsZW0gUmVwb3J0IEZvcm0gYW5kCisgICAgc2VuZCBpdCB0byB1cyBieSBGYXggb3IgRS1NYWlsLiAgVGhlIFByb2JsZW0gUmVwb3J0IEZvcm0gJ1JFUE9SVC5UWFQnCisgICAgKFBsYWluIHRleHQgZm9ybWF0KSBpcyBpbmNsdWRlZCBvbiB0aGUgZGlzay4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbgorICAgIGRvd25sb2FkIHRoZSBQcm9ibGVtIFJlcG9ydCBGb3JtIGZyb20gdGhlIEFnZXJlIFN5c3RlbXMgd2ViIHNpdGUuCisKKyAgICBJbmNsdWRlIFByb2R1Y3QgTmFtZSwgU2VyaWFsIE51bWJlciBhbmQgc29mdHdhcmUgdmVyc2lvbiBudW1iZXIgd2l0aCBlYWNoCisgICAgcmVxdWVzdCB0byBoZWxwIHRoZSBTdXBwb3J0IEdyb3VwIGhlbHBpbmcgeW91LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEZJTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWE0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9UT0RPCkBAIC0wLDAgKzEsMzMgQEAKK0ZpcnN0IG9mIGFsbCwgdGhlIGJlc3QgdGhpbmcgd291bGQgYmUgdGhhdCB0aGlzIGRyaXZlciBiZWNvbWVzIG9ic29sdGUgYnkKK2FkZGluZyBzdXBwb3J0IGZvciBIZXJtZXMgSUkgYW5kIEhlcm1lcyBJSS41IGNhcmRzIHRvIHRoZSBleGlzdGluZyBvcmlub2NvCitkcml2ZXIuIFRoZSBvcmlub2NvIGRyaXZlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBIZXJtZXMgSSBiYXNlZCBjYXJkcy4KK1NpbmNlIHRoaXMgd2lsbCBub3QgaGFwcGVuIGJ5IG1hZ2ljIGFuZCBoYXMgbm90IGhhcHBlbmQgdW50aWwgbm93IHRoaXMKK2RyaXZlciBwcm92aWRlcyBhIHN0b3AtZ2FwIHNvbHV0aW9uIGZvciB0aGVzZSB0eXBlIG9mIGNhcmRzLgorCitIYXZpbmcgc2FpZCB0aGF0LCB0aGUgZm9sbG93aW5nIHdpc2hsaXN0IGNvbWVzIHRvIG1pbmQgdG8gbWFrZSB0aGUgZHJpdmVyCitzdWl0YWJsZSBhcyBmdWxseSBzdXBwb3J0ZWQga2VybmVsIGRyaXZlci4gRmVlbCBmcmVlIHRvIGV4cGFuZC9lbmhhbmNlIHRoZQorbGlzdC4KKworVE9ETzoKKwktIHZlcmlmeSBhZ2FpbnN0IGEgSGVybWVzIElJLjUgY2FyZAorCS0gdmVyaWZ5IHdpdGggV1BBIGVuY3JpcHRpb24gKGJvdGggd2l0aCBIMiBhbmQgSDIuNSBjYXJkcykKKwktIHNvbWV0aW1lcyB0aGUgY2FyZCBkb2VzIG5vdCBpbml0aWFsaXplIGNvcnJlY3RseSwgcmV0cnkgbWVjaGFuaXNtcworCSAgYXJlIGJ1aWxkIGluIHRvIGNhdGNoIG1vc3QgY2FzZXMgYnV0IG5vdCBhbGwKKwktIG9uY2UgdGhlIGRyaXZlciBydW5zIGl0IGlzIHZlcnkgc3RhYmxlLCBidXQgSSBoYXZlIHRoZSBpbXByZXNzaW9uCisJICBzb21lIHRoZSBjcml0dGljYWwgc2VjdGlvbnMgdGFrZSB0byBsb25nCisJLSB0aGUgZHJpdmVyIGlzIHNwbGl0IGludG8gYSBIZXJtZXMgSUkgYW5kIGEgSGVybWVzIElJLjUgcGFydCwgaXQKKwkgIHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJvdGggd2l0aCBvbmUgbW9kdWxlIGluc3RlYWQgb2YgdHdvCisJLSByZXZpZXcgYnkgdGhlIHdpcmVsZXNzIGRldmVsb3BlciBjb21tdW5pdHkKKwktIHZlcmlmeSB0aGUgY29kZSBhZ2FpbnN0IHRoZSBjb2Rpbmcgc3RhbmRhcmRzIGZvciBhIHByb3BwZXIgbGludXgKKwkgIGRyaXZlcgorCS0gcmVzb2x2ZSBsaWNlbnNlIGlzc3VlcyAoPykKKworRE9ORToKKwktIHZlcmlmaWVkIGFnYWluc3QgYSBIZXJtZXMgSUkgY2FyZCAoVGhvbXNvbiBTcGVlZHRvdWNoIDExMCBQQ01DSUEKKwkgIGNhcmQpCisJLSB2ZXJpZmllZCB3aXRoIFdFUCBlbmNyaXB0aW9uCisKK1BsZWFzZSBzZW5kIGFueSBwYXRjaGVzIG9yIGNvbXBsYWludHMgYWJvdXQgdGhpcyBkcml2ZXIgdG8gR3JlZworS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZCBDYzogSGVuayBkZSBHcm9vdCA8cGUxZG5uQGFtc2F0Lm9yZz4KK0Rvbid0IGJvdGhlciB0aGUgdXBzdHJlYW0gd2lyZWxlc3Mga2VybmVsIGRldmVsb3BlcnMgYWJvdXQgaXQsIHRoZXkKK3dhbnQgbm90aGluZyB0byBkbyB3aXRoIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvV0FSTklORy50eHQgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9XQVJOSU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEyOTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvV0FSTklORy50eHQKQEAgLTAsMCArMSwzIEBACitUaGVzZSBzb3VyY2VzIGFyZSBzaGFyZWQgd2l0aCB0aGUgd2xhZ3M0OV9oMjUgZHJpdmVyLiBTb21lIGZpbGVzIGFyZSBldmVuCitleGNsdXNpdmVseSB1c2VkIGJ5IHRoYXQgZHJpdmVyLiBEbyBub3QgZGVsZXRlIHRoZW0gaGVyZSB3aXRob3V0IGxvb2tpbmcKK2F0IHRoYXQgb3RoZXIgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvYXBfaDIuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxMjNkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyLmMKQEAgLTAsMCArMSwzMzM3IEBACisvKgorICogRmlsZToJYXBfaDI0LjIzNgorICoKKyAqIEFic3RyYWN0OglUaGlzIGZpbGUgY29udGFpbnMgbWVtb3J5IGltYWdlICdmd19pbWFnZScuCisgKgorICogQ29udGVudHM6CVRvdGFsIHNpemUgb2YgdGhlIG1lbW9yeSBpbWFnZTogNTEwMTAgYnl0ZXMuCisgKgkJVG90YWwgbnVtYmVyIG9mIGJsb2NrczogNCBibG9ja3MuCisgKgkJQmxvY2sgIDEgOiBsb2FkIGFkZHJlc3MgMDAwMDAwNjAsIDMyNiBieXRlcy4KKyAqCQlCbG9jayAgMiA6IGxvYWQgYWRkcmVzcyAwMDAwMEMxNiwgNjQyNCBieXRlcy4KKyAqCQlCbG9jayAgMyA6IGxvYWQgYWRkcmVzcyAwMDFFMjUyRSwgNDQ0IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0MzgxNiBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMiAodmFyaWFudCAyKSB2ZXJzaW9uIDIuMzYKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgOCAodmFyaWFudCAyKSA6IDIgLSA0CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDQpIDogNiAtIDcKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNSkgOiA2IC0gNworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA2KSA6IDYgLSA3CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAyICh2YXJpYW50IDIpIDogMSAtIDIKKyAqCisgKiBHZW5lcmF0ZWQ6CWJ5IGc6XGZ3XGZ1cHUzLmV4ZSB2ZXJzaW9uIDQuMjYKKyAqCisgKiBDb21tYW5kbGluZToJZzpcZndcZnVwdTMuZXhlIC9mPTQgL249ZndfaW1hZ2UgL2k9dDIwMjM2MDAuaGV4CisgKi8KKworCisjaW5jbHVkZSAiaGNmY2ZnLmgiCQkJCS8vIHRvIGdldCBoY2ZfMTYgZXRjIGRlZmluZWQgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBzZXR0aW5ncyB3aGljaCBpbmx1ZW5jZSBtZGQuaCBvciBkaGYuaAorI2luY2x1ZGUgIm1kZC5oIiAgIAkJCQkvL3RvIGdldCBDT01QX0lEX1NUQSBldGMgZGVmaW5lZAorI2luY2x1ZGUgImRoZi5oIiAgIAkJCQkvL3VzZWQgdG8gYmUgImZoZm1lbS5oIiwgdG8gZ2V0IG1lbWJsb2NrLHBsdWdyZWNvcmQsCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8xX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQywgMHgwRCwgMHgwMCwgMHgwMCwKKwkgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwNywgMHgwMiwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgxMCwgMHgyNywgMHgxMCwgMHgyNywKKwkgMHgxNCwgMHgwMCwgMHhEMCwgMHgwNywgMHhEMCwgMHgwNywgMHgxMCwgMHgyNywgMHgyRiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgyNywgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwOSwgMHgyQiwgMHgwOSwgMHgyQiwgMHgwOSwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RSwgMHgwMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzFfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMl9kYXRhW10gPSB7CisJIDB4OUIsIDB4QTcsIDB4MDAsIDB4MEEsIDB4MTAsIDB4MDEsIDB4NjgsIDB4QTQsIDB4QjAsIDB4MDEsIDB4ODQsIDB4MDEsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsCisJIDB4NDQsIDB4NDQsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzIsIDB4MzMsIDB4OTAsIDB4MDAsCisJIDB4NzgsIDB4MDQsIDB4QUUsIDB4RTQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisJIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QzYsIDB4ODQsIDB4RjgsIDB4OTksIDB4RUUsCisJIDB4OEQsIDB4RjYsIDB4MEQsIDB4RkYsIDB4QkQsIDB4RDYsIDB4QjEsIDB4REUsIDB4NTQsIDB4OTEsIDB4NTAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4QTksIDB4Q0UsCisJIDB4N0QsIDB4NTYsIDB4MTksIDB4RTcsIDB4NjIsIDB4QjUsIDB4RTYsIDB4NEQsIDB4OUEsIDB4RUMsIDB4NDUsIDB4OEYsIDB4OUQsIDB4MUYsIDB4NDAsIDB4ODksCisJIDB4ODcsIDB4RkEsIDB4MTUsIDB4RUYsIDB4RUIsIDB4QjIsIDB4QzksIDB4OEUsIDB4MEIsIDB4RkIsIDB4RUMsIDB4NDEsIDB4NjcsIDB4QjMsIDB4RkQsIDB4NUYsCisJIDB4RUEsIDB4NDUsIDB4QkYsIDB4MjMsIDB4RjcsIDB4NTMsIDB4OTYsIDB4RTQsIDB4NUIsIDB4OUIsIDB4QzIsIDB4NzUsIDB4MUMsIDB4RTEsIDB4QUUsIDB4M0QsCisJIDB4NkEsIDB4NEMsIDB4NUEsIDB4NkMsIDB4NDEsIDB4N0UsIDB4MDIsIDB4RjUsIDB4NEYsIDB4ODMsIDB4NUMsIDB4NjgsIDB4RjQsIDB4NTEsIDB4MzQsIDB4RDEsCisJIDB4MDgsIDB4RjksIDB4OTMsIDB4RTIsIDB4NzMsIDB4QUIsIDB4NTMsIDB4NjIsIDB4M0YsIDB4MkEsIDB4MEMsIDB4MDgsIDB4NTIsIDB4OTUsIDB4NjUsIDB4NDYsCisJIDB4NUUsIDB4OUQsIDB4MjgsIDB4MzAsIDB4QTEsIDB4MzcsIDB4MEYsIDB4MEEsIDB4QjUsIDB4MkYsIDB4MDksIDB4MEUsIDB4MzYsIDB4MjQsIDB4OUIsIDB4MUIsCisJIDB4M0QsIDB4REYsIDB4MjYsIDB4Q0QsIDB4NjksIDB4NEUsIDB4Q0QsIDB4N0YsIDB4OUYsIDB4RUEsIDB4MUIsIDB4MTIsIDB4OUUsIDB4MUQsIDB4NzQsIDB4NTgsCisJIDB4MkUsIDB4MzQsIDB4MkQsIDB4MzYsIDB4QjIsIDB4REMsIDB4RUUsIDB4QjQsIDB4RkIsIDB4NUIsIDB4RjYsIDB4QTQsIDB4NEQsIDB4NzYsIDB4NjEsIDB4QjcsCisJIDB4Q0UsIDB4N0QsIDB4N0IsIDB4NTIsIDB4M0UsIDB4REQsIDB4NzEsIDB4NUUsIDB4OTcsIDB4MTMsIDB4RjUsIDB4QTYsIDB4NjgsIDB4QjksIDB4MDAsIDB4MDAsCisJIDB4MkMsIDB4QzEsIDB4NjAsIDB4NDAsIDB4MUYsIDB4RTMsIDB4QzgsIDB4NzksIDB4RUQsIDB4QjYsIDB4QkUsIDB4RDQsIDB4NDYsIDB4OEQsIDB4RDksIDB4NjcsCisJIDB4NEIsIDB4NzIsIDB4REUsIDB4OTQsIDB4RDQsIDB4OTgsIDB4RTgsIDB4QjAsIDB4NEEsIDB4ODUsIDB4NkIsIDB4QkIsIDB4MkEsIDB4QzUsIDB4RTUsIDB4NEYsCisJIDB4MTYsIDB4RUQsIDB4QzUsIDB4ODYsIDB4RDcsIDB4OUEsIDB4NTUsIDB4NjYsIDB4OTQsIDB4MTEsIDB4Q0YsIDB4OEEsIDB4MTAsIDB4RTksIDB4MDYsIDB4MDQsCisJIDB4ODEsIDB4RkUsIDB4RjAsIDB4QTAsIDB4NDQsIDB4NzgsIDB4QkEsIDB4MjUsIDB4RTMsIDB4NEIsIDB4RjMsIDB4QTIsIDB4RkUsIDB4NUQsIDB4QzAsIDB4ODAsCisJIDB4OEEsIDB4MDUsIDB4QUQsIDB4M0YsIDB4QkMsIDB4MjEsIDB4NDgsIDB4NzAsIDB4MDQsIDB4RjEsIDB4REYsIDB4NjMsIDB4QzEsIDB4NzcsIDB4NzUsIDB4QUYsCisJIDB4NjMsIDB4NDIsIDB4MzAsIDB4MjAsIDB4MUEsIDB4RTUsIDB4MEUsIDB4RkQsIDB4NkQsIDB4QkYsIDB4NEMsIDB4ODEsIDB4MTQsIDB4MTgsIDB4MzUsIDB4MjYsCisJIDB4MkYsIDB4QzMsIDB4RTEsIDB4QkUsIDB4QTIsIDB4MzUsIDB4Q0MsIDB4ODgsIDB4MzksIDB4MkUsIDB4NTcsIDB4OTMsIDB4RjIsIDB4NTUsIDB4ODIsIDB4RkMsCisJIDB4NDcsIDB4N0EsIDB4QUMsIDB4QzgsIDB4RTcsIDB4QkEsIDB4MkIsIDB4MzIsIDB4OTUsIDB4RTYsIDB4QTAsIDB4QzAsIDB4OTgsIDB4MTksIDB4RDEsIDB4OUUsCisJIDB4N0YsIDB4QTMsIDB4NjYsIDB4NDQsIDB4N0UsIDB4NTQsIDB4QUIsIDB4M0IsIDB4ODMsIDB4MEIsIDB4Q0EsIDB4OEMsIDB4MjksIDB4QzcsIDB4RDMsIDB4NkIsCisJIDB4M0MsIDB4MjgsIDB4NzksIDB4QTcsIDB4RTIsIDB4QkMsIDB4MUQsIDB4MTYsIDB4NzYsIDB4QUQsIDB4M0IsIDB4REIsIDB4NTYsIDB4NjQsIDB4NEUsIDB4NzQsCisJIDB4MUUsIDB4MTQsIDB4REIsIDB4OTIsIDB4MEEsIDB4MEMsIDB4NkMsIDB4NDgsIDB4RTQsIDB4QjgsIDB4NUQsIDB4OUYsIDB4NkUsIDB4QkQsIDB4RUYsIDB4NDMsCisJIDB4QTYsIDB4QzQsIDB4QTgsIDB4MzksIDB4QTQsIDB4MzEsIDB4MzcsIDB4RDMsIDB4OEIsIDB4RjIsIDB4MzIsIDB4RDUsIDB4NDMsIDB4OEIsIDB4NTksIDB4NkUsCisJIDB4QjcsIDB4REEsIDB4OEMsIDB4MDEsIDB4NjQsIDB4QjEsIDB4RDIsIDB4OUMsIDB4RTAsIDB4NDksIDB4QjQsIDB4RDgsIDB4RkEsIDB4QUMsIDB4MDcsIDB4RjMsCisJIDB4MjUsIDB4Q0YsIDB4QUYsIDB4Q0EsIDB4OEUsIDB4RjQsIDB4RTksIDB4NDcsIDB4MTgsIDB4MTAsIDB4RDUsIDB4NkYsIDB4ODgsIDB4RjAsIDB4NkYsIDB4NEEsCisJIDB4NzIsIDB4NUMsIDB4MjQsIDB4MzgsIDB4RjEsIDB4NTcsIDB4QzcsIDB4NzMsIDB4NTEsIDB4OTcsIDB4MjMsIDB4Q0IsIDB4N0MsIDB4QTEsIDB4OUMsIDB4RTgsCisJIDB4MjEsIDB4M0UsIDB4REQsIDB4OTYsIDB4REMsIDB4NjEsIDB4ODYsIDB4MEQsIDB4ODUsIDB4MEYsIDB4OTAsIDB4RTAsIDB4NDIsIDB4N0MsIDB4QzQsIDB4NzEsCisJIDB4QUEsIDB4Q0MsIDB4RDgsIDB4OTAsIDB4MDUsIDB4MDYsIDB4MDEsIDB4RjcsIDB4MTIsIDB4MUMsIDB4QTMsIDB4QzIsIDB4NUYsIDB4NkEsIDB4RjksIDB4QUUsCisJIDB4RDAsIDB4NjksIDB4OTEsIDB4MTcsIDB4NTgsIDB4OTksIDB4MjcsIDB4M0EsIDB4QjksIDB4MjcsIDB4MzgsIDB4RDksIDB4MTMsIDB4RUIsIDB4QjMsIDB4MkIsCisJIDB4MzMsIDB4MjIsIDB4QkIsIDB4RDIsIDB4NzAsIDB4QTksIDB4ODksIDB4MDcsIDB4QTcsIDB4MzMsIDB4QjYsIDB4MkQsIDB4MjIsIDB4M0MsIDB4OTIsIDB4MTUsCisJIDB4MjAsIDB4QzksIDB4NDksIDB4ODcsIDB4RkYsIDB4QUEsIDB4NzgsIDB4NTAsIDB4N0EsIDB4QTUsIDB4OEYsIDB4MDMsIDB4RjgsIDB4NTksIDB4ODAsIDB4MDksCisJIDB4MTcsIDB4MUEsIDB4REEsIDB4NjUsIDB4MzEsIDB4RDcsIDB4QzYsIDB4ODQsIDB4QjgsIDB4RDAsIDB4QzMsIDB4ODIsIDB4QjAsIDB4MjksIDB4NzcsIDB4NUEsCisJIDB4MTEsIDB4MUUsIDB4Q0IsIDB4N0IsIDB4RkMsIDB4QTgsIDB4RDYsIDB4NkQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzMsCisJIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4M0EsIDB4MDAsIDB4M0IsCisJIDB4MDAsIDB4M0MsIDB4MDAsIDB4M0QsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0YsIDB4MDAsIDB4M0YsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MEEsIDB4MDIsIDB4MTQsCisJIDB4MDUsIDB4MzIsIDB4MEIsIDB4MzcsIDB4MDgsIDB4NTAsIDB4MEIsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4M0YsIDB4MDAsCisJIDB4MEMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MEYsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsIDB4MTAsCisJIDB4OUUsIDB4MTAsIDB4NTYsIDB4MTAsIDB4OTgsIDB4MTAsIDB4NUMsIDB4MTAsIDB4OTIsIDB4MTAsIDB4NjIsIDB4MTAsIDB4OEMsIDB4MTAsIDB4NjgsIDB4MTAsCisJIDB4ODYsIDB4MTAsIDB4NkUsIDB4MTAsIDB4ODAsIDB4MTAsIDB4NzQsIDB4MTAsIDB4N0EsIDB4MTAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjIsCisJIDB4MDAsIDB4MDQsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjYsIDB4MDAsIDB4MDQsIDB4MDksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkEsCisJIDB4MDAsIDB4MDQsIDB4MEEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkUsIDB4MDAsIDB4MDQsIDB4MEIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjQsCisJIDB4MDQsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjgsIDB4MDQsIDB4MDQsIDB4MEQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MkMsCisJIDB4MDQsIDB4MDQsIDB4MEUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MDQsIDB4MEYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzQsCisJIDB4MDgsIDB4MDQsIDB4MTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzgsIDB4MDgsIDB4MDQsIDB4MTEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4M0MsCisJIDB4MDgsIDB4MDQsIDB4MTIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4NDAsIDB4MDgsIDB4MDQsIDB4MTMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjQsCisJIDB4MEMsIDB4MEIsIDB4MTQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjgsIDB4MEMsIDB4MEIsIDB4MTUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NkMsCisJIDB4MEMsIDB4MEIsIDB4MTYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzAsIDB4MEMsIDB4MEIsIDB4MTcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzQsCisJIDB4MEMsIDB4MEIsIDB4MTgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzgsIDB4MEMsIDB4MEIsIDB4MTksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4N0MsCisJIDB4MEMsIDB4MEIsIDB4MUEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODAsIDB4MEMsIDB4MEIsIDB4MUIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODQsCisJIDB4MEMsIDB4MEIsIDB4MUMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODgsIDB4MEMsIDB4MEIsIDB4MUQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4OEMsCisJIDB4MEMsIDB4MEIsIDB4MUUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTUsIDB4MTcsIDB4MDQsIDB4MUYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTksCisJIDB4MTcsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OUQsIDB4MTcsIDB4MDQsIDB4MjEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4QTEsCisJIDB4MTcsIDB4MDQsIDB4MjIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4QTUsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MTAsIDB4RTAsIDB4MTAsIDB4MDAsIDB4MTEsCisJIDB4MjAsIDB4MTEsIDB4NzgsIDB4MTEsIDB4QzgsIDB4MTAsIDB4RTgsIDB4MTAsIDB4MDgsIDB4MTEsIDB4MjgsIDB4MTEsIDB4ODAsIDB4MTEsIDB4RDAsIDB4MTAsCisJIDB4RjAsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MzAsIDB4MTEsIDB4ODgsIDB4MTEsIDB4RDgsIDB4MTAsIDB4RjgsIDB4MTAsIDB4MTgsIDB4MTEsIDB4MzgsIDB4MTEsCisJIDB4OTAsIDB4MTEsIDB4NDAsIDB4MTEsIDB4NDgsIDB4MTEsIDB4NTAsIDB4MTEsIDB4NTgsIDB4MTEsIDB4NjAsIDB4MTEsIDB4NjgsIDB4MTEsIDB4NzAsIDB4MTEsCisJIDB4OTgsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RUIsIDB4QkEsIDB4RUIsCisJIDB4REYsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsCisJIDB4NTcsIDB4RUIsIDB4OTAsIDB4RjEsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4RDYsIDB4RUQsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4MkYsIDB4RUUsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4QTQsIDB4RUQsIDB4QkUsIDB4RUQsCisJIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4N0YsIDB4RjQsIDB4MTksIDB4RUMsCisJIDB4MkMsIDB4RUMsIDB4REMsIDB4RUMsIDB4RTAsIDB4RUMsIDB4NTcsIDB4RUIsIDB4NTcsIDB4RUIsIDB4OEYsIDB4RUQsIDB4ODQsIDB4RTMsIDB4NTksIDB4RTMsCisJIDB4RDcsIDB4RTMsIDB4MjgsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RUIsIDB4RjYsIDB4RUIsIDB4NzIsIDB4RjAsIDB4NzIsIDB4RjAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RkMsIDB4ODksIDB4RUUsIDB4NDUsIDB4RjAsIDB4NUEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjksIDB4RkYsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4Q0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4QjYsIDB4MUYsCisJIDB4MDYsIDB4MDAsIDB4RjAsIDB4RkYsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4RjYsIDB4RkYsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NkMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjQsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NkEsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4RjUsIDB4RkYsIDB4ODksIDB4RUUsIDB4NEUsIDB4RjAsIDB4QTgsIDB4MUYsIDB4MDIsIDB4MDAsIDB4RTAsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4RUUsIDB4MjEsIDB4MDIsIDB4MDAsIDB4RTEsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RjAsIDB4MjEsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RjIsIDB4MjEsIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RUEsIDB4MjEsCisJIDB4MDIsIDB4MDAsIDB4MDMsIDB4RkMsIDB4ODksIDB4RUUsIDB4RTUsIDB4RUYsIDB4N0MsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MDQsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OTksIDB4RUUsIDB4QkUsIDB4MUYsIDB4MjIsIDB4MDAsIDB4MDYsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4QTYsIDB4MUYsIDB4MDIsIDB4MDAsCisJIDB4MDcsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MDIsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4ODksIDB4RUUsIDB4RjcsIDB4RUYsCisJIDB4MEMsIDB4MjAsIDB4MjIsIDB4MDAsIDB4QjEsIDB4RkMsIDB4ODksIDB4RUUsIDB4NTgsIDB4RjIsIDB4MkMsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkMsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MzIsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjUsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4M0MsIDB4MjAsCisJIDB4MDIsIDB4MDAsIDB4MjYsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4M0UsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjcsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NDAsIDB4MjAsIDB4MDIsIDB4MDAsIDB4QjIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OTksIDB4RUUsIDB4NTAsIDB4MjEsIDB4MjIsIDB4MDAsCisJIDB4QzEsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4OTgsIDB4MjEsIDB4MjAsIDB4MDAsIDB4QjAsIDB4RkMsIDB4NjksIDB4RUUsIDB4NUQsIDB4RjIsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RkMsIDB4NjksIDB4RUUsIDB4NjgsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QzgsIDB4RkMsCisJIDB4NjksIDB4RUUsIDB4NjMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QjQsIDB4RkMsIDB4NjksIDB4RUUsIDB4OUIsIDB4RjIsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4QjYsIDB4RkMsIDB4NjksIDB4RUUsIDB4NEUsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RkMsIDB4NjksIDB4RUUsCisJIDB4OTAsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RkMsIDB4NjksIDB4RUUsIDB4RUQsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QjUsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4RTYsIDB4MjEsIDB4MDIsIDB4MDAsIDB4QjksIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4RTgsIDB4MjEsIDB4MDIsIDB4MDAsIDB4OTAsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4RUMsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MjMsIDB4RkMsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MzgsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjksIDB4RkMsIDB4NDgsIDB4RUYsIDB4RjUsIDB4RUUsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4QzIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NzQsIDB4MjEsIDB4MDIsIDB4MDAsIDB4MzIsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MzMsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NjIsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4MTAsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4QUUsIDB4MUYsIDB4MDIsIDB4MDAsIDB4MTEsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4NDYsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NEMsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTMsIDB4RkMsCisJIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NTIsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTQsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NTgsIDB4MjAsCisJIDB4MDYsIDB4MDAsIDB4MTUsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NUUsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTYsIDB4RkMsIDB4ODksIDB4RUUsCisJIDB4OUYsIDB4RUUsIDB4NjQsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MTcsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MkUsIDB4MjAsIDB4MDIsIDB4MDAsCisJIDB4ODMsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4NkUsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OTcsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4NkMsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OTgsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTksIDB4RkMsCisJIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDIsIDB4MDIsIDB4MDAsIDB4OUEsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDQsCisJIDB4MDIsIDB4MDAsIDB4OUIsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDYsIDB4MDIsIDB4MDAsIDB4OUMsIDB4RkMsIDB4MzEsIDB4RjAsCisJIDB4MUYsIDB4RjAsIDB4RTQsIDB4MDgsIDB4MDIsIDB4MDAsIDB4OUQsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTQsIDB4MEEsIDB4MDIsIDB4MDAsCisJIDB4MTgsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4MzAsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjIsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsCisJIDB4MzYsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkMsIDB4ODksIDB4RUUsIDB4OUYsIDB4RUUsIDB4M0EsIDB4MjAsIDB4MDIsIDB4MDAsIDB4QzAsIDB4RkMsCisJIDB4NjksIDB4RUUsIDB4NjEsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4OUUsIDB4RkMsIDB4ODksIDB4RUUsIDB4MTcsIDB4RjAsIDB4NzAsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4OUYsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QTAsIDB4RkMsIDB4MzEsIDB4RjAsCisJIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDIsIDB4MDIsIDB4MDAsIDB4QTEsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDQsIDB4MDIsIDB4MDAsCisJIDB4QTIsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MDYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsCisJIDB4RTYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4QTQsIDB4RkMsIDB4MzEsIDB4RjAsIDB4MUYsIDB4RjAsIDB4RTYsIDB4MEEsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkQsCisJIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NTMsIDB4RjUsIDB4MDgsIDB4MDAsIDB4MjEsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NTcsIDB4RjUsCisJIDB4MEEsIDB4MDAsIDB4MjIsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NUMsIDB4RjUsIDB4MTYsIDB4MDAsIDB4MjMsIDB4RkQsIDB4QkEsIDB4RUUsCisJIDB4NzMsIDB4RUUsIDB4NjcsIDB4RjUsIDB4MEEsIDB4MDAsIDB4MTAsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4MzQsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4NDUsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4Q0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NDcsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsCisJIDB4MzgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDgsIDB4RkQsIDB4OUUsIDB4RUYsIDB4NzMsIDB4RUUsIDB4NjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDksIDB4RkQsCisJIDB4OUUsIDB4RUYsIDB4NzMsIDB4RUUsIDB4NjIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEEsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4NTgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4NEIsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4NUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEQsIDB4RkQsIDB4QkEsIDB4RUUsCisJIDB4NzMsIDB4RUUsIDB4NkMsIDB4RjUsIDB4MDQsIDB4MDAsIDB4NEYsIDB4RkQsIDB4QjIsIDB4RUYsIDB4NzMsIDB4RUUsIDB4ODAsIDB4MjEsIDB4MDIsIDB4MDAsCisJIDB4QzAsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NkUsIDB4RjUsIDB4MDIsIDB4MDAsIDB4QzIsIDB4RkQsIDB4QTgsIDB4RUYsIDB4NzMsIDB4RUUsCisJIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QzMsIDB4RkQsIDB4QkEsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NkYsIDB4RjUsIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkQsCisJIDB4QjIsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NzgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkQsIDB4RDgsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4OTEsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4ODYsIDB4MUIsIDB4MDIsIDB4MDAsIDB4OTMsIDB4RkQsIDB4ODksIDB4RUUsCisJIDB4NzMsIDB4RUUsIDB4OEMsIDB4MUIsIDB4MDIsIDB4MDAsIDB4QzEsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4Q0EsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4QzYsIDB4RkQsIDB4RTcsIDB4RUUsIDB4NzMsIDB4RUUsIDB4OEUsIDB4MjEsIDB4MEEsIDB4MDAsIDB4ODksIDB4RkQsIDB4NUYsIDB4RUYsIDB4NzMsIDB4RUUsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RkQsIDB4RDcsIDB4RUUsIDB4NzMsIDB4RUUsIDB4QzAsIDB4MjEsIDB4MjQsIDB4MDAsIDB4NDYsIDB4RkQsCisJIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4N0EsIDB4MDEsIDB4MDYsIDB4MDAsIDB4ODYsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4QjYsIDB4MUYsCisJIDB4MDYsIDB4MDAsIDB4ODcsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4QjgsIDB4MjEsIDB4MDYsIDB4MDAsIDB4OEIsIDB4RkQsIDB4N0EsIDB4RjMsCisJIDB4NzMsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4OEUsIDB4RkQsIDB4ODksIDB4RUUsIDB4NzMsIDB4RUUsIDB4QjgsIDB4MTIsIDB4MDIsIDB4MDAsCisJIDB4ODAsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4ODEsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsCisJIDB4MUMsIDB4MDIsIDB4MDIsIDB4MDAsIDB4ODIsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDQsIDB4MDIsIDB4MDAsIDB4ODMsIDB4RkQsCisJIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDYsIDB4MDIsIDB4MDAsIDB4ODQsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MDgsCisJIDB4MDIsIDB4MDAsIDB4ODUsIDB4RkQsIDB4QkMsIDB4RUYsIDB4NzMsIDB4RUUsIDB4MUMsIDB4MEEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjEsIDB4NDYsIDB4MDAsCisJIDB4MkQsIDB4RUUsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDMsIDB4OEEsIDB4RUEsIDB4MUYsIDB4MDAsIDB4MzYsIDB4MDEsIDB4Q0EsIDB4MDAsIDB4OTYsIDB4MDEsCisJIDB4Q0UsIDB4MDAsIDB4RkMsIDB4MDAsIDB4NzgsIDB4MDEsIDB4REEsIDB4MUUsIDB4MUEsIDB4MDEsIDB4ODYsIDB4MUIsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4Q0UsIDB4MTIsIDB4MDAsIDB4MDAsIDB4RDIsIDB4MTQsIDB4MTQsIDB4MDEsIDB4MDMsIDB4MDAsIDB4QUUsIDB4MDAsIDB4RTQsIDB4MDAsIDB4M0MsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NzcsIDB4QjQsIDB4RUEsIDB4QjMsIDB4MjYsIDB4QjUsIDB4MkYsIDB4QjUsIDB4RkIsIDB4QjMsIDB4QTQsIDB4QjQsIDB4NjksIDB4QjQsIDB4RTcsIDB4QzUsCisJIDB4NEEsIDB4QzUsIDB4RTcsIDB4QzUsIDB4QkUsIDB4QzUsIDB4NTQsIDB4QzUsIDB4NDgsIDB4QzUsIDB4MDYsIDB4QzYsIDB4MTcsIDB4QzYsIDB4MTcsIDB4QzYsCisJIDB4MTcsIDB4QzYsIDB4MjAsIDB4QzYsIDB4M0IsIDB4QzYsIDB4OTgsIDB4QzYsIDB4QjQsIDB4QzYsIDB4QkYsIDB4QzUsIDB4RDIsIDB4QzUsIDB4QTYsIDB4QzUsCisJIDB4MTAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsCisJIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4MDAsCisJIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsCisJIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4RjMsIDB4MDIsIDB4QUQsIDB4MDMsIDB4NjAsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDcsIDB4MDYsIDB4MDgsIDB4MDcsCisJIDB4MEEsIDB4MDgsIDB4MTYsIDB4MDksIDB4NDQsIDB4MEEsIDB4MDQsIDB4MEIsIDB4NDAsIDB4MEMsIDB4ODAsIDB4MEQsIDB4MDAsIDB4MEUsIDB4ODQsIDB4MEYsCisJIDB4MDEsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MTQsIDB4NDAsIDB4MjAsIDB4MzIsIDB4MjEsIDB4MzIsIDB4MjIsIDB4MDQsIDB4MjMsIDB4MDEsIDB4MjQsCisJIDB4MEYsIDB4MjUsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MjksIDB4MDAsIDB4MkEsIDB4MDEsIDB4MkIsIDB4MDYsIDB4MkMsCisJIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4RDYsIDB4M0EsIDB4MDAsIDB4M0IsIDB4MDAsIDB4M0MsIDB4MTQsIDB4M0QsIDB4N0YsIDB4M0UsIDB4MDAsIDB4M0YsCisJIDB4NjgsIDB4NDAsIDB4NzUsIDB4NDEsIDB4MDcsIDB4NDIsIDB4MDcsIDB4NDMsIDB4MDAsIDB4NDUsIDB4M0IsIDB4NEEsIDB4MDAsIDB4NEIsIDB4MDAsIDB4NEMsCisJIDB4MEYsIDB4NEQsIDB4MDIsIDB4NzUsIDB4MDAsIDB4NzYsIDB4ODAsIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDksIDB4MDEsIDB4MDksIDB4MDEsIDB4MEEsIDB4MDEsCisJIDB4MEEsIDB4MDEsIDB4MEIsIDB4MDEsIDB4MEIsIDB4MDEsIDB4MEMsIDB4MDEsIDB4MEMsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEUsIDB4MDEsCisJIDB4MEUsIDB4MDEsIDB4MEYsIDB4MDEsIDB4MEYsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTIsIDB4MDEsCisJIDB4MTIsIDB4MDEsIDB4MTMsIDB4MDEsIDB4MTMsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTYsIDB4MDEsCisJIDB4MTYsIDB4MDEsIDB4MTcsIDB4MDEsIDB4MTcsIDB4MDEsIDB4MTgsIDB4MDEsIDB4MTgsIDB4MDEsIDB4MTksIDB4MDEsIDB4MTksIDB4MDEsIDB4NEQsIDB4MDEsCisJIDB4NEQsIDB4MDEsIDB4NEUsIDB4MDEsIDB4NEUsIDB4MDEsIDB4NEYsIDB4MDEsIDB4NEYsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTEsIDB4MDEsCisJIDB4NTEsIDB4MDEsIDB4NTIsIDB4MDEsIDB4NTIsIDB4MDEsIDB4NTMsIDB4MDEsIDB4NTMsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NjUsIDB4MDEsCisJIDB4NjUsIDB4MDEsIDB4NjYsIDB4MDEsIDB4NjYsIDB4MDEsIDB4NjcsIDB4MDEsIDB4NjcsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjksIDB4MDEsCisJIDB4NjksIDB4MDEsIDB4NkEsIDB4MDEsIDB4NkEsIDB4MDEsIDB4NkIsIDB4MDEsIDB4NkIsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkQsIDB4MDEsCisJIDB4NkQsIDB4MDEsIDB4NkUsIDB4MDEsIDB4NkUsIDB4MDEsIDB4NkYsIDB4MDEsIDB4NkYsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzEsIDB4MDEsCisJIDB4NzEsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzMsIDB4MDEsIDB4NzMsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzUsIDB4MDEsCisJIDB4NzUsIDB4MDEsIDB4NzYsIDB4MDEsIDB4NzYsIDB4MDEsIDB4NzcsIDB4MDEsIDB4NzcsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzksIDB4MDEsCisJIDB4NzksIDB4MDEsIDB4N0EsIDB4MDEsIDB4N0EsIDB4MDEsIDB4N0IsIDB4MDEsIDB4N0IsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0QsIDB4MDEsCisJIDB4N0QsIDB4MDEsIDB4N0UsIDB4MDEsIDB4N0UsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsCisJIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsCisJIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsCisJIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUQsIDB4NDcsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsCisJIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4MzMsIDB4NDgsCisJIDB4NzgsIDB4NDksIDB4NzgsIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksCisJIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0MsIDB4NDksIDB4MzIsIDB4MDAsIDB4NDYsIDB4MDAsCisJIDB4NUEsIDB4MDAsIDB4NkUsIDB4MDAsIDB4ODIsIDB4MDAsIDB4OTYsIDB4MDAsIDB4QUEsIDB4MDAsIDB4QkUsIDB4MDAsIDB4RDIsIDB4MDAsIDB4RTYsIDB4MDAsCisJIDB4RkEsIDB4MDAsIDB4MEUsIDB4MDEsIDB4MjIsIDB4MDEsIDB4NTIsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsCisJIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsCisJIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsCisJIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsCisJIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4NjksIDB4NzIsIDB4NzMsIDB4NzQsIDB4MjAsCisJIDB4NTcsIDB4NjEsIDB4NzYsIDB4NjUsIDB4NEMsIDB4NDEsIDB4NEUsIDB4MjAsIDB4NDksIDB4NDksIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsCisJIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4REQsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MTUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MUUsIDB4MUYsIDB4OEUsIDB4MjEsCisJIDB4MDAsIDB4MjMsIDB4REEsIDB4MjIsIDB4MDQsIDB4MjMsIDB4QzAsIDB4MjEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzQsIDB4MjMsIDB4MDAsIDB4MDAsCisJIDB4NTAsIDB4MjEsIDB4OEUsIDB4MjEsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MUYsIDB4OEUsIDB4MjEsIDB4MDAsIDB4MjMsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjMsIDB4QzAsIDB4MjEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzQsIDB4MjMsIDB4MDAsIDB4MDAsIDB4OEUsIDB4MjEsIDB4M0MsIDB4MjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDYsIDB4MDcsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4ODAsCisJIDB4MDAsIDB4NjAsIDB4MUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4ODEsIDB4MDAsIDB4NjAsIDB4MUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8yX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzNfZGF0YVtdID0geworCSAweDNGLCAweDQxLCAweEE1LCAweDRDLCAweDUwLCAweDM3LCAweDA0LCAweDAwLCAweDAxLCAweEI5LCAweDQxLCAweDVGLCAweEI1LCAweDYwLCAweDU1LCAweEUwLAorCSAweDBDLCAweDYwLCAweDEwLCAweDYyLCAweEEyLCAweEQzLCAweDAxLCAweDYwLCAweDAxLCAweDY1LCAweEQ0LCAweDgwLCAweDVBLCAweEQxLCAweDBGLCAweDAyLAorCSAweDVBLCAweEQzLCAweDNFLCAweDYwLCAweDAwLCAweDY2LCAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweEVBLCAweDYwLCAweDg4LCAweDYxLCAweDY0LCAweDQ0LAorCSAweEM4LCAweDg0LCAweDBDLCAweDYzLCAweEFBLCAweDQ2LCAweDU4LCAweEQwLCAweEFBLCAweDQ2LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDA4LCAweDYwLAorCSAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDYxLCAweDAyLAorCSAweDYwLCAweDAyLCAweDI2LCAweDYwLCAweDZBLCAweDYxLCAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDI2LCAweDYwLAorCSAweEIyLCAweDdDLCAweEQxLCAweDgwLCAweEExLCAweEQyLCAweDI1LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LAorCSAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLAorCSAweEJELCAweEQxLCAweEVDLCAweDE4LCAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLAorCSAweDY3LCAweDQ0LCAweEMwLCAweDg0LCAweEUwLCAweDg1LCAweDJDLCAweDQ0LCAweEQ0LCAweDgwLCAweDYzLCAweDQxLCAweDAxLCAweDA2LCAweDY1LCAweDQ0LAorCSAweEM4LCAweDgzLCAweEFBLCAweDQ2LCAweDU5LCAweEQxLCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZDLCAweDFGLCAweEFBLCAweDQ2LCAweDJCLCAweDQxLAorCSAweEQ1LCAweDAxLCAweDI2LCAweDYwLCAweEIyLCAweDYxLCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDI2LCAweDYwLCAweEVBLCAweDdDLCAweEQxLCAweDgwLAorCSAweEExLCAweEQyLCAweDI3LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LCAweDQwLCAweDRBLAorCSAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLCAweEVDLCAweDE4LAorCSAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDA0LCAweEEzLCAweEEzLCAweEQxLAorCSAweDVBLCAweDg4LCAweDJDLCAweDQzLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA2LCAweDY0LCAweDQzLCAweENGLCAweDgzLCAweEFBLCAweDQ2LAorCSAweDYwLCAweEZFLCAweDI4LCAweEQxLCAweDVFLCAweDg4LCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZCLCAweDFGLCAweDIwLCAweEZFLCAweEFBLCAweDQ2LAorCSAweEQzLCAweDAxLCAweEI4LCAweEZFLCAweEI5LCAweEZFLCAweEJBLCAweEZFLCAweEJCLCAweEZFLCAweEJELCAweEZFLCAweEJGLCAweEZFLCAweDIxLCAweDYwLAorCSAweDgwLCAweDYyLCAweEEyLCAweEQzLCAweDEyLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA1LCAweDAwLCAweDBCLCAweDYwLCAweEVBLCAweDYyLAorCSAweDAwLCAweDY0LCAweDVBLCAweERCLCAweEZFLCAweDFGLCAweEEyLCAweDYwLCAweDQ5LCAweDc4LCAweEZGLCAweEZGLCAweEYxLCAweEZGLCAweDk0LCAweDQ4LAorCSAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweDk4LCAweDQ4LCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweEEwLCAweDQ4LAorCSAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEYxLCAweEZGLCAweEYyLCAweDRELCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweEY2LCAweDRELAorCSAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweEZFLCAweDRELCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweDg2LCAweEZELCAweEI2LCAweDFGLAorCSAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDEwLCAweEZELCAweDM0LCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDE0LCAweEZELCAweDdFLCAweDIxLAorCSAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDIwLCAweEZBLCAweEZBLCAweDFELCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIxLCAweEZBLCAweERFLCAweDFELAorCSAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIyLCAweEZBLCAweDE2LCAweDFFLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIzLCAweEZBLCAweENBLCAweDFDLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDI0LCAweEZBLCAweEJFLCAweDFFLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDI1LCAweEZBLCAweERFLCAweDFDLAorCSAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDI2LCAweEZBLCAweEM0LCAweDFDLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfM19kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV80X2RhdGFbXSA9IHsKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgwQiwgMHg3OCwgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgxMSwgMHg3OCwgMHhDNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNSwgMHg2MCwgMHg2MSwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0NCwgMHhGRiwgMHgyMCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhBNiwgMHg2MCwgMHgyMywgMHg3OCwgMHgwOCwgMHhFMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHg4MSwgMHg3OCwgMHg0QywgMHg0RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHgxOCwgMHg3OCwgMHg0QywgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhFMiwgMHg4NCwgMHhGRiwgMHgyMiwgMHg1OCwgMHg4MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNywgMHg2MCwgMHhDNCwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFNCwgMHhFMiwgMHhBQywgMHg2MCwgMHgzMSwgMHg3OCwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHg3NiwgMHg3OCwgMHg2NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHg4QywgMHg3OCwgMHhBNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHg3MiwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMiwgMHg2MCwgMHhEMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMiwgMHg2MCwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHg5MCwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNCwgMHg2MCwgMHg3MywgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg2MCwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4MywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHhCMiwgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMCwgMHg2MCwgMHgyOSwgMHg3OCwgMHg0MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHg2MCwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRCwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNSwgMHg2MCwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMCwgMHg2MCwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg0MCwgMHhGRiwgMHg0MywgMHhGRiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDNiwgMHg2MCwgMHg2NiwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMCwgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDNywgMHg2MCwgMHgyNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFNSwgMHg2MCwgMHgwRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHgyNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFMywgMHg2MCwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHhBMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHgyOCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4NywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHg0NywgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg4NywgMHhGMywgMHg4OCwgMHhGMywgMHhEQywgMHg4MSwgMHgwMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMCwgMHhGQSwgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywKKwkgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHg4NywgMHhGMywgMHg4OCwgMHhGNSwgMHhEQywgMHg4MSwKKwkgMHg4MCwgMHg2NywgMHg0MCwgMHg0QSwgMHgxNCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwMSwgMHg3QywgMHgwNywgMHgxOCwgMHgyQSwgMHg0MywgMHgwMiwgMHhGQywKKwkgMHg1RiwgMHg4QSwgMHg4RSwgMHhGOCwgMHg3MCwgMHhGOCwgMHgwMCwgMHhGNCwgMHhGOCwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGNSwKKwkgMHgwNiwgMHg2NCwgMHg2NiwgMHg0MywgMHgwMCwgMHg3QywgMHg2MywgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDQywgMHg4NCwKKwkgMHg2NiwgMHg0MywgMHhEQiwgMHg4MywgMHhGOCwgMHgwMiwgMHgxNCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwOSwgMHg2MCwgMHgyQiwgMHg3QywgMHg4OSwgMHhGMywKKwkgMHgwNiwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwMSwgMHg2MywgMHg3MiwgMHhGOCwgMHgwMCwgMHhGQywgMHg2MywgMHg0NywgMHgwNiwgMHhGQSwgMHg3MiwgMHhGOCwKKwkgMHg4RSwgMHhGOCwgMHhERiwgMHg4MywgMHg2NiwgMHg0NCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBNiwgMHhGNSwgMHgwMiwgMHg4OSwgMHhGMywgMHgwNiwgMHg2MSwKKwkgMHg2MCwgMHg0NiwgMHgwMywgMHg3QywgMHg3MywgMHhGOCwgMHg2NiwgMHg0NCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBNiwgMHhGQiwgMHgwMiwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwQSwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHg2MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwMiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgxQywgMHhFMCwgMHg0MCwgMHhFQywgMHgwMCwgMHhFRCwKKwkgMHgwMiwgMHhFRSwgMHg4MCwgMHg2MCwgMHg1OCwgMHhFQywgMHg4MCwgMHg2MCwgMHgwMCwgMHhFRCwgMHg4MCwgMHg2MCwgMHg4MiwgMHhFRSwgMHhDMCwgMHg2MCwKKwkgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMCwgMHhGMywgMHgyOCwgMHhGQiwKKwkgMHg0MCwgMHg0NCwgMHhBNCwgMHg2MCwgMHg1RCwgMHg3QywgMHgyMCwgMHhGOSwgMHhBNSwgMHg2MCwgMHg0OCwgMHg3QywgMHgyMSwgMHhGOSwgMHhBNywgMHg2MCwKKwkgMHgzMCwgMHg3QywgMHgyMiwgMHhGOSwgMHhCMCwgMHg2MCwgMHhDRCwgMHg3QywgMHgyMywgMHhGOSwgMHhCNSwgMHg2MCwgMHg2QywgMHg3QywgMHgyNCwgMHhGOSwKKwkgMHhDMCwgMHg2MCwgMHg4OCwgMHg3QywgMHgyNSwgMHhGOSwgMHhDNiwgMHg2MCwgMHhFMCwgMHg3QywgMHgyNiwgMHhGOSwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwKKwkgMHgyOCwgMHhFOCwgMHg0NCwgMHg2MCwgMHgwMiwgMHhFNiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MiwgMHgxMCwgMHg2MCwgMHgwNCwgMHhFNiwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHg0NywgMHgwMiwKKwkgMHg0NiwgMHgwMiwgMHhEQiwgMHg4MywgMHhGQSwgMHg2MCwgMHgyNywgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgxQSwgMHgxOCwgMHhDMywgMHg4MywKKwkgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhEQiwgMHg4MywgMHhEMywgMHg4MywgMHhEMywgMHg4NiwgMHg2NCwgMHg0MSwgMHhDRCwgMHg4MSwKKwkgMHhBNiwgMHhEMSwgMHhEQSwgMHg4NiwgMHgxQywgMHg2MCwgMHg2OCwgMHg2NSwgMHgwMCwgMHg2MCwgMHg3MiwgMHg2MywgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwKKwkgMHg5MCwgMHg4NCwgMHhGRiwgMHgyNywgMHgwMiwgMHgwMCwgMHhBMiwgMHhEOSwgMHgwMSwgMHgwMCwgMHhGOCwgMHgxRiwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwKKwkgMHhFRiwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGQSwgMHg2MCwgMHgyOCwgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwgMHgwQiwgMHgxOCwKKwkgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhCRiwgMHhEMywgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHgwRSwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGRCwgMHg2MCwgMHgwQywgMHg2NSwgMHg1QiwgMHhEMywKKwkgMHhCRiwgMHhEMSwgMHgwRCwgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGNywgMHhBMCwgMHhGQywgMHhBMCwgMHgwQSwgMHgwNSwgMHgwMSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgyMSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgzRiwgMHg0MywgMHgzRiwgMHg0MywgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhCNywgMHg4NCwKKwkgMHg0MCwgMHg1RiwgMHgwMCwgMHg2MCwgMHgzMCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg1MCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg3OSwgMHhFMiwgMHgwMCwgMHg2MCwKKwkgMHg5MCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhEMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhGMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhCMCwgMHhFMiwgMHgyNiwgMHg2NCwKKwkgMHgzNSwgMHhGQiwgMHgwMSwgMHg2MCwgMHgzMCwgMHg2NCwgMHgwQSwgMHhBNCwgMHgzOCwgMHhGQiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MCwgMHhGOCwgMHg2NCwKKwkgMHgwQSwgMHhBNCwgMHgzOSwgMHhGQiwgMHgzNSwgMHhGMSwgMHgwQSwgMHg2NCwgMHhDNCwgMHg4NCwgMHgzNiwgMHhGQiwgMHhDMCwgMHg4NCwgMHgwQSwgMHhBNCwKKwkgMHgzNywgMHhGQiwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwgMHg5OSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwgMHg1QywgMHg0MSwgMHg1QywgMHg0NiwKKwkgMHg1QywgMHg0NywgMHgwMCwgMHhFMSwgMHhBNywgMHg2MCwgMHg5QiwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg4NywgMHhGRiwKKwkgMHg5NywgMHhGRiwgMHgwQywgMHg2MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1QSwgMHgwNiwgMHhBNCwgMHg0MCwgMHg1QiwgMHg1QywgMHg1RSwgMHg1QywgMHg1MSwKKwkgMHgxRiwgMHg2MCwgMHhBQSwgMHg2MiwgMHhBMiwgMHhEMywgMHg2NSwgMHhGQiwgMHgyMSwgMHg2MCwgMHhFQywgMHg2MSwgMHgyNywgMHg3QywgMHhBMSwgMHhEOSwKKwkgMHgyNSwgMHg2MCwgMHgyRSwgMHg2MywgMHg3RiwgMHhBMywgMHhFMywgMHg4NywgMHgwMCwgMHg3RiwgMHg4QSwgMHhGQiwgMHgwMiwgMHg2MCwgMHg4MCwgMHg2NiwKKwkgMHgyMiwgMHg2MCwgMHgyMiwgMHg2NCwgMHg3NywgMHg2MCwgMHg3NywgMHg2MywgMHgwMCwgMHhGQSwgMHgwMSwgMHhGQywgMHgwMCwgMHhGMCwgMHgwMSwgMHhGMCwKKwkgMHhEMCwgMHg4MCwgMHhEMywgMHg4MCwgMHgxRSwgMHgwMiwgMHgxRCwgMHgwMiwgMHgwNiwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwgMHhBQSwgMHg0NiwKKwkgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGMCwgMHgyQSwgMHg0MSwgMHg1MCwgMHg2NSwgMHhEMywgMHg4MCwgMHhDRCwgMHg4NCwKKwkgMHgxMywgMHgwMywgMHgwQSwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwKKwkgMHgwMCwgMHhGMCwgMHg2NSwgMHg0MSwgMHhDOCwgMHg2NSwgMHhEMywgMHg4MCwgMHhDRCwgMHg4NCwgMHgwNiwgMHgwMywgMHgxMiwgMHg2MCwgMHg3RiwgMHg2NCwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHg2NSwgMHgwMiwgMHg2MCwgMHg3RiwgMHg2NCwgMHg2NSwgMHg0MywgMHg4NywgMHhGRCwgMHgxQiwgMHg2MCwgMHg3MiwgMHg2MiwKKwkgMHhBMiwgMHhERCwgMHgwNywgMHg2MSwgMHhDNSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhENCwgMHg4NCwgMHg4QiwgMHhGQiwgMHhEQywgMHg4NCwgMHg4OSwgMHhGQiwKKwkgMHgwQywgMHhBNCwgMHg4OCwgMHhGQiwgMHgxQiwgMHg2MCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEQiwgMHhBMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4QiwgMHhGMSwgMHg4QSwgMHhGMywgMHg3QywgMHg2MywKKwkgMHg4RCwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMSwgMHhGQywgMHhEQywgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGQSwgMHhGQSwgMHgwNCwgMHg4RSwgMHhGQiwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RiwgMHgwMSwgMHhGQSwgMHg4QiwgMHhGMywgMHg4QSwgMHhGMSwKKwkgMHhEQywgMHg4NCwgMHhEMCwgMHg4NCwgMHg4QywgMHhGQiwgMHgwMywgMHg2MCwgMHgyNiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg2NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyRSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4NywgMHhGRiwgMHg4QywgMHhGMywgMHg5NCwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MywgMHhGRiwgMHg2NiwgMHhGRiwKKwkgMHg2NSwgMHhGRiwgMHg2NCwgMHhGRiwgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHg0OSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1MiwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg1QiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2NSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2QywgMHg2MCwgMHgwMiwgMHhFMSwgMHg3NiwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg0MSwgMHg2MCwgMHgwMiwgMHhFMSwgMHgwNCwgMHg2NSwgMHgyMSwgMHg2MCwgMHg3RSwgMHg2NCwgMHg0NCwgMHhEMywgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwQywgMHg2NCwgMHhBNSwgMHhEQiwgMHhBMywgMHg2MCwgMHhFRCwgMHg2NCwKKwkgMHg4MCwgMHhGQiwgMHgyRCwgMHhGRiwgMHgwQSwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwKKwkgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMiwgMHgwQSwgMHg2MSwgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCMywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCOCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwKKwkgMHhGRiwgMHhGRiwgMHhFQiwgMHgwMiwgMHhFQiwgMHg2MCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHg1MCwgMHg2MCwKKwkgMHgwMywgMHhFQSwgMHg1MSwgMHg2MCwgMHgxMywgMHhFQSwgMHg1MiwgMHg2MCwgMHgzMCwgMHhFQSwgMHg1MywgMHg2MCwgMHg0MCwgMHhFQSwgMHg1NCwgMHg2MCwKKwkgMHg1MiwgMHhFQSwgMHg1NSwgMHg2MCwgMHg2RCwgMHhFQSwgMHg1NiwgMHg2MCwgMHg3MSwgMHhFQSwgMHg1NywgMHg2MCwgMHg4QiwgMHhFQSwgMHg1OCwgMHg2MCwKKwkgMHg0NywgMHhFQSwgMHg1OSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1QSwgMHg2MCwgMHhCMiwgMHhFQSwgMHg1QiwgMHg2MCwgMHhDMSwgMHhFQSwgMHg1QywgMHg2MCwKKwkgMHhENywgMHhFQSwgMHg1RCwgMHg2MCwgMHhFQiwgMHhFQSwgMHg1RSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1MCwgMHg2MCwgMHgzNiwgMHhFQiwgMHg1MSwgMHg2MCwKKwkgMHgzNywgMHhFQiwgMHg1MiwgMHg2MCwgMHgyMCwgMHhFQiwgMHg1MywgMHg2MCwgMHhFNCwgMHhFQiwgMHg1NCwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1NSwgMHg2MCwKKwkgMHg1OCwgMHhFQiwgMHg1NiwgMHg2MCwgMHg0OCwgMHhFQiwgMHg1NywgMHg2MCwgMHhEMCwgMHhFQiwgMHg1OCwgMHg2MCwgMHhDMywgMHhFQiwgMHg1OSwgMHg2MCwKKwkgMHhGQywgMHhFQiwgMHg1QSwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1QiwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1QywgMHg2MCwgMHhDMCwgMHhFQiwgMHg1RCwgMHg2MCwKKwkgMHhEMCwgMHhFQiwgMHg1RSwgMHg2MCwgMHg5MSwgMHhFQiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHhFMCwgMHg2MCwgMHgwMiwgMHhFQSwgMHhFMCwgMHg2MCwKKwkgMHgwMywgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBQiwgMHg0OCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwKKwkgMHhGQywgMHgwMSwgMHgwMCwgMHhFQiwgMHgwMywgMHg2MCwgMHgwMiwgMHg2MiwgMHg2MiwgMHg0NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgwOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgxOCwgMHg2NCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg5NCwgMHg4NCwgMHhBMCwgMHg1MCwKKwkgMHgxRCwgMHg2MCwgMHgxOSwgMHhFMiwgMHgyNCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgwNCwgMHhGQiwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHhGQiwKKwkgMHgxMCwgMHg2MCwgMHgxMCwgMHg3NSwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHgyMywgMHg2MCwgMHg1QywgMHg2MywgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMCwgMHhERCwgMHgyNCwgMHg2MCwgMHg3QywgMHg2MywgMHgyMywgMHg2MCwKKwkgMHg1MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgyMywgMHg2MCwgMHg1NCwgMHg2MywgMHgzMCwgMHg0NCwgMHhBMywgMHhEQiwgMHgyMywgMHg2MCwgMHg1NiwgMHg2MywKKwkgMHgzMSwgMHg0NCwgMHhBMywgMHhEQiwgMHgyMywgMHg2MCwgMHg1OCwgMHg2MywgMHgzMiwgMHg0NCwgMHhBMywgMHhEQiwgMHgyMywgMHg2MCwgMHg1QSwgMHg2MywKKwkgMHgzMywgMHg0NCwgMHhBMywgMHhEQiwgMHg4MSwgMHhGRiwgMHg5MSwgMHhGRiwgMHg1OCwgMHg1MSwgMHg0OCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg5MiwgMHhGRiwKKwkgMHg1OCwgMHg1MSwgMHg0NCwgMHgwMCwgMHg4MywgMHhGRiwgMHg5MywgMHhGRiwgMHg1OCwgMHg1MSwgMHg0MCwgMHgwMCwgMHg4NCwgMHhGRiwgMHg5NCwgMHhGRiwKKwkgMHg1OCwgMHg1MSwgMHgzQywgMHgwMCwgMHg4NSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg1OCwgMHg1MSwgMHgzOCwgMHgwMCwgMHg4NiwgMHhGRiwgMHg5NiwgMHhGRiwKKwkgMHg1OCwgMHg1MSwgMHgzNCwgMHgwMCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHg1OCwgMHg1MSwgMHgzMCwgMHgwMCwgMHg4MCwgMHhGRiwgMHg5MCwgMHhGRiwKKwkgMHg5OSwgMHhGRiwgMHgyMywgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgzMCwgMHg0NCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEQiwgMHgzMSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRCwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhFMywgMHg2MCwgMHg1MCwgMHg2NCwgMHgwQSwgMHhGQiwKKwkgMHg0MCwgMHgyMSwgMHhGRSwgMHgwMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3OCwgMHgwMSwgMHhGRiwgMHhGRiwgMHg0MiwgMHg1MCwgMHg0MCwgMHg1MywKKwkgMHgyMywgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgzMywgMHg0NCwgMHgzMiwgMHg0MiwgMHhBMiwgMHhEQiwKKwkgMHhEQSwgMHg4MiwgMHhBMiwgMHhERCwgMHhEQSwgMHg4MywgMHg2NSwgMHg0NCwgMHhCRCwgMHhEQiwgMHg2MSwgMHg0NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHhCRCwgMHhEOSwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHg5OSwgMHhGRiwgMHhBNCwgMHg0QywgMHhCRCwgMHhEQiwgMHhBNSwgMHg0QywKKwkgMHhCRCwgMHhEQiwgMHhBMCwgMHg0QywgMHhCRCwgMHhEQiwgMHhBMSwgMHg0QywgMHhCRCwgMHhEQiwgMHg5OCwgMHhGRiwgMHgyMywgMHg2MCwgMHg1MiwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHgyMywgMHg2MCwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MCwgMHgyMywgMHg2MCwgMHg1OCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MiwgMHgyMywgMHg2MCwgMHg1QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MywKKwkgMHgzMSwgMHg0MSwgMHgyMywgMHg2MCwgMHg1NiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1MSwgMHgyMywgMHg2MCwgMHg1MCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwKKwkgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwKKwkgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwgMHgwOCwgMHhFMSwgMHhBNSwgMHg2MCwgMHg1RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHg4MCwgMHgzRSwgMHg5RiwgMHhGRSwgMHgwMywgMHgwNCwgMHhBNiwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHhGRSwgMHg0MCwgMHgwNSwKKwkgMHhFMCwgMHhGRSwgMHg1QiwgMHgwNSwgMHhFMSwgMHhGRSwgMHhGMiwgMHgwNCwgMHgyOSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhFRiwgMHgwMSwgMHg3MiwgMHg0NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg5NSwgMHhGMywgMHhFOCwgMHg4NSwgMHhGRiwgMHhCNywKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NSwgMHg3MywgMHg0NCwgMHhENCwgMHg4NCwgMHgxMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHgwNCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwKKwkgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhEMiwgMHhGNCwKKwkgMHgyNSwgMHg2MCwgMHgxNiwgMHg3QywgMHg2MywgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHhCRSwgMHgwMSwKKwkgMHgyMSwgMHg0NiwgMHg1RSwgMHg2MiwgMHg5QSwgMHhGRiwgMHgwNywgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgyNSwgMHgxMCwgMHgwMCwKKwkgMHhBMiwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg2MiwgMHg2MiwgMHgwMSwgMHg1RCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg0NCwgMHhGRiwgMHgwNiwgMHgyNSwgMHgwNCwgMHgwMCwgMHgwRSwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg5RSwgMHgwMSwKKwkgMHg2MiwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHgwQSwgMHhFMSwgMHg5OSwgMHgwMSwgMHhDOCwgMHg3NCwgMHhDRCwgMHhFMiwgMHgyOSwgMHg0NCwKKwkgMHgwOCwgMHhCQywgMHg0MCwgMHg0OSwgMHgwNSwgMHhFMSwgMHgyNSwgMHg2MCwgMHgxOCwgMHg2MywgMHhBMywgMHhEMywgMHhEMiwgMHhGMywgMHgwNiwgMHgxOCwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHg0OCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwKKwkgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHgwNiwgMHg2MSwgMHhDRCwgMHg4MSwgMHgwNCwgMHgyNSwKKwkgMHgzMCwgMHgwMCwgMHg4NywgMHg0QywgMHhGQiwgMHgwMiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHgxNSwgMHg2MCwgMHg2RiwgMHg2QiwKKwkgMHhGMywgMHg2MCwgMHhBMCwgMHg2NCwgMHgwNCwgMHgyNSwgMHgyNSwgMHgwMCwgMHg4MCwgMHg0QywgMHgzMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg0NCwgMHhGRiwKKwkgMHgwNCwgMHgyNSwgMHgxRiwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyNSwgMHg0NCwgMHgzNywgMHgzNiwgMHhCNCwgMHg4NCwgMHg2RSwgMHgzNiwKKwkgMHhCNCwgMHg4NCwgMHg4MCwgMHg0RSwgMHgyNCwgMHg0MSwgMHgwNCwgMHgyNSwgMHgxNCwgMHgwMCwgMHg2MSwgMHg0QywgMHg2NCwgMHhBMSwgMHg2MSwgMHg1NCwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNSwgMHgwRCwgMHgwMCwgMHg2NywgMHg0RSwgMHgwNywgMHg2NCwgMHgxQywgMHhGQiwgMHgwMCwgMHhFMSwKKwkgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg1MywgMHgwMSwgMHgzMywgMHhGMywgMHhGRCwgMHgxMSwgMHhGQywgMHgxOCwgMHg0MCwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwQSwgMHgwMCwgMHhDNCwgMHhFMiwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2NywgMHg0QywKKwkgMHgwMiwgMHgwMCwgMHg0MSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2MiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhFMiwgMHhGRSwgMHg3MiwgMHg1MiwgMHg1QywgMHg0OSwKKwkgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHgzQiwgMHgwMSwgMHgwOCwgMHhFMSwgMHgzOSwgMHgwMSwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwKKwkgMHgwMCwgMHg2MCwgMHg0NiwgMHg3NCwgMHhDRCwgMHhFMiwgMHgwNCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHhFMSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwKKwkgMHgwQiwgMHgwMCwgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHg2MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwNCwgMHgwMCwKKwkgMHg0MiwgMHg2MCwgMHgwOSwgMHhFMCwgMHg4MCwgMHg2MCwgMHgxQywgMHhFMCwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg0MywgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHg4MywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgzRiwgMHg0NCwgMHgwMiwgMHgyNywgMHg4NCwgMHgwMCwgMHgyMCwgMHgyQiwKKwkgMHhGRiwgMHgwMSwgMHg4MCwgMHhFMSwgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHg2MSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwRCwgMHgwMCwgMHgwNSwgMHg2MywKKwkgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MywgMHhGRiwgMHhGRiwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MywKKwkgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCMSwgMHhDRCwgMHg4MSwgMHhFMSwgMHg4NSwgMHgxRSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHg0NCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwgMHhCRSwgMHg2MSwKKwkgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHhBMiwgMHhEMywgMHg0NSwgMHhEMSwgMHg0NywgMHhCQywgMHhFMCwgMHg4NCwgMHg2MiwgMHg0NSwgMHg2NCwgMHg1RiwKKwkgMHhFOCwgMHg4MywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHhDRCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHgwNCwgMHhFMSwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgzNiwgMHgwMCwgMHgwMywgMHg2MCwgMHg4MCwgMHg3QywgMHhBMywgMHg4MywKKwkgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MywgMHhCQiwgMHhCMywgMHg4MywgMHg5NSwgMHg2MCwgMHg4MCwgMHhFNywgMHhBNywgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMywgMHg4MywgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0MSwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHg2MywgMHg0NywgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMCwgMHgzQSwKKwkgMHhDQywgMHg4NCwgMHgwMiwgMHgwMCwgMHgwNywgMHgzQSwgMHhEQywgMHg4NCwgMHhGRiwgMHhCNCwgMHhBNSwgMHhEQiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwKKwkgMHg0NywgMHg2NSwgMHgyMSwgMHg2MCwgMHg3MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhCNCwgMHg4NSwgMHhCNCwgMHg4MywgMHg4MCwgMHhFMSwgMHg5NSwgMHg2MCwKKwkgMHg4MCwgMHhFNywgMHhBNywgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHhDRCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg4MywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHhBNiwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg4MywgMHhGMywgMHg4MCwgMHhFMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwKKwkgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgxRCwgMHg2MCwgMHhERSwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0RiwgMHgwMCwgMHgxRCwgMHg2MCwgMHhGQSwgMHg2NCwKKwkgMHg1OCwgMHg0RiwgMHg0QiwgMHgwMCwgMHgxRSwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1OCwgMHg0RiwgMHg0NywgMHgwMCwgMHgxRSwgMHg2MCwgMHgzMiwgMHg2NCwKKwkgMHg1OCwgMHg0RiwgMHg0MywgMHgwMCwgMHgxRSwgMHg2MCwgMHg0RSwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzRiwgMHgwMCwgMHgxRSwgMHg2MCwgMHg2QSwgMHg2NCwKKwkgMHg1OCwgMHg0RiwgMHgzQiwgMHgwMCwgMHgxRSwgMHg2MCwgMHg4NiwgMHg2NCwgMHg1OCwgMHg0RiwgMHgzNywgMHgwMCwgMHgwMSwgMHg2OCwgMHhGRiwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzRiwgMHg0NCwgMHgyMCwgMHgyNywgMHgwMCwgMHgwMCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHgwOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgxOCwgMHg2NCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg5NCwgMHg4NCwgMHhBMCwgMHg1MCwgMHgxRCwgMHg2MCwKKwkgMHgxOSwgMHhFMiwgMHhDNCwgMHhFMiwgMHgwMCwgMHg2MywgMHg4MiwgMHhGRCwgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHhCRiwgMHhGRSwgMHhDNCwgMHhFMiwKKwkgMHg0MSwgMHhGRiwgMHhFMCwgMHhGRSwgMHhFMSwgMHhGRSwgMHhFMiwgMHhGRSwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NiwgMHhGRiwgMHg4NCwgMHhGMywKKwkgMHg2MiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyRCwgMHhGRiwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgwOCwgMHhFMSwgMHg4OCwgMHg2MCwKKwkgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBNSwgMHg2MCwgMHg1RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MCwgMHhFQywgMHg2MywgMHg0QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg0MCwgMHhFQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHhEMywgMHg4MCwgMHg3QywgMHg2MCwgMHg0OCwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhCMCwgMHg4QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHg0OCwgMHhFMiwgMHgwMSwgMHg3MCwgMHhBRSwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwgMHg2NCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwKKwkgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwgMHgwMCwgMHhCQywgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywKKwkgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg1QywgMHg0RCwgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHg2QywgMHg0MCwgMHg0NCwgMHhFMiwgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwKKwkgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywKKwkgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwKKwkgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHhGMywgMHgwOCwgMHgyOSwKKwkgMHgwQSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNywgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMiwgMHhGQiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywKKwkgMHhGNywgMHhCNCwgMHg0MCwgMHg0NywgMHg0MywgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHhFNSwgMHhGRSwgMHgxMywgMHgwNSwKKwkgMHgyNywgMHg0NCwgMHgxMCwgMHgyNiwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNCwgMHgwMiwgMHhFMSwgMHgwNiwgMHgwMCwgMHgzRSwgMHhFMSwKKwkgMHgzMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwQSwgMHhCRiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwKKwkgMHhBRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBOCwgMHg2MCwgMHgwOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwOCwgMHgyNiwKKwkgMHhGRiwgMHhGRiwgMHhCRiwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGMywgMHgzMiwgMHhGMSwgMHgwMCwgMHg2MywgMHg2NCwgMHg0MCwKKwkgMHgwMywgMHgyMiwgMHgzRCwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhFMiwgMHg4NCwgMHhFMSwgMHg3MCwgMHg0MSwKKwkgMHhBRCwgMHg4MCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhFRCwgMHgxMiwgMHgwMywgMHgwMywgMHhCRiwgMHg2MCwgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgzMiwgMHhGRCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhERiwgMHgwMSwgMHgwMCwgMHg2MywKKwkgMHgzMiwgMHhGRCwgMHg2QywgMHg0MCwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgyNywgMHg0MSwgMHg0NCwgMHg0OCwgMHgyMCwgMHhCOSwKKwkgMHgwMSwgMHhCNCwgMHhGNywgMHhCMSwgMHgwQSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyNywgMHgwNywgMHgwMCwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHg0NiwgMHhGQiwgMHhCRCwgMHhEQiwgMHhBMywgMHhEQiwgMHhDQiwgMHgwQSwgMHg0MSwgMHg0NywgMHgzRiwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgwNCwgMHgwMCwgMHhGNiwgMHhGRSwgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHhGMCwgMHhGRSwgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhFNSwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhBQywgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNCwgMHhGRSwgMHgwQSwgMHgwNCwgMHgxRCwgMHhGRiwgMHgwMCwgMHhFQiwKKwkgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHg0MywgMHhGRiwgMHhFNiwgMHhGRSwgMHgwMywgMHgwNSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHg2MCwgMHg0NiwKKwkgMHgwRiwgMHhGMCwgMHg0MCwgMHg0MiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHhBQiwgMHg2MCwgMHgwMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgxMywgMHhGMiwgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NywgMHgyQSwgMHhGMiwKKwkgMHg0MCwgMHg0NSwgMHg0MCwgMHg0OCwgMHgwNCwgMHgyQiwgMHgxNywgMHgwMCwgMHgxNiwgMHhGMiwgMHgxRCwgMHhGMiwgMHg0MCwgMHg0MywgMHgwRiwgMHhGMiwKKwkgMHg0MCwgMHg0NCwgMHgyNSwgMHg1RSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHg0MCwgMHg0NSwgMHgwRiwgMHg2NCwgMHgxNCwgMHhGMCwgMHgzNSwgMHhGMiwKKwkgMHhBMCwgMHg4MiwgMHgwRiwgMHhCNCwgMHhDQSwgMHg4NSwgMHhENCwgMHg4MCwgMHgxMCwgMHhGMiwgMHgwMSwgMHgwMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwKKwkgMHg0MCwgMHhCQywgMHg0MCwgMHg0NywgMHgxMywgMHgwMCwgMHgxNywgMHhGMiwgMHgyQywgMHhGMCwgMHg0MCwgMHg0MywgMHgxQiwgMHhGMiwgMHgxRCwgMHhGQSwKKwkgMHg0MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhBQiwgMHhGQywgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwKKwkgMHgwMiwgMHgwMCwgMHgxMSwgMHhGMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0NywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHhGRiwgMHhGRiwgMHhBRiwgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg0NiwgMHgyQywgMHhGMCwgMHgyNywgMHg0NCwgMHhERiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgxMywgMHgwMCwgMHgyQSwgMHhGMCwgMHgwMSwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNCwgMHg2NSwgMHgyNywgMHg0NCwgMHgzNCwgMHg4NywgMHgzNiwgMHhGMywgMHhCNCwgMHhGRiwgMHg2MCwgMHg1QiwKKwkgMHg0RCwgMHhFMiwgMHgwNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHgyQiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MSwgMHgzRSwgMHgwNiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMiwgMHg0NiwgMHgwMSwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhCRiwgMHg2MCwKKwkgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCNSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMywgMHgwMCwKKwkgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHhDNCwgMHhFMiwgMHgwOCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhGMCwgMHhGRSwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHg2MSwgMHg0NSwgMHhENCwgMHg5RSwgMHgyMSwgMHg0NiwgMHgxNiwgMHhGQSwKKwkgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHg5NSwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHg5NSwgMHhGOSwgMHgyNSwgMHhGQSwgMHg5NiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwKKwkgMHgyOCwgMHhGQSwgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHgyOSwgMHhGQSwgMHgyRCwgMHg0NCwgMHgwNCwgMHgyQSwKKwkgMHgwNiwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBOSwgMHg2MCwgMHhDOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NCwgMHhGQywKKwkgMHgxRiwgMHg2MCwgMHg5QSwgMHg2NSwgMHhBNSwgMHhEMSwgMHgyOCwgMHg0NCwgMHgwOCwgMHgyQSwgMHg1MSwgMHgwMCwgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwKKwkgMHg0RSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg0QiwgMHgwMCwgMHgzMiwgMHhGMiwgMHgyRiwgMHhGMCwgMHg1MCwgMHhGRSwgMHgwMSwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MSwgMHg4RiwgMHhGMywgMHgzMSwgMHgwMCwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMiwgMHgzMCwgMHhGMCwgMHgzNCwgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHgzMSwgMHhGMCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NywgMHgzNCwgMHgwQywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhGRiwgMHhGRiwgMHgzMSwgMHgxOCwgMHg2MCwgMHg0MywgMHg1MCwgMHhGRSwKKwkgMHg2NiwgMHg0MSwgMHgzMiwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwgMHg2MSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHgwNCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMCwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgwQywgMHgwMCwgMHhGMiwgMHg2MSwgMHg0NiwgMHgxQSwgMHgxOCwgMHhFOCwgMHgwMSwgMHgwNiwgMHhGMCwgMHg4RiwgMHhGMywKKwkgMHg2MSwgMHg0NiwgMHgwMiwgMHg2MSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxMiwgMHgwMCwgMHhGQywgMHhBMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwRSwKKwkgMHg2MSwgMHg0NCwgMHgxNCwgMHhGQSwgMHgxMSwgMHhGQywgMHgwQiwgMHgwMCwgMHgyQywgMHhGMiwgMHgyRiwgMHhGQSwgMHgyRCwgMHhGMiwgMHgzMCwgMHhGQSwKKwkgMHgyRSwgMHhGMiwgMHgzMSwgMHhGQSwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwgMHgyMCwgMHgwMCwgMHgyNiwgMHg0MywKKwkgMHg4NCwgMHhCQiwgMHhGQywgMHhCMywgMHgyMSwgMHg0NiwgMHgwMSwgMHg1RCwgMHgwRiwgMHhGQywgMHg1QywgMHg0NiwgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwKKwkgMHgwNSwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHg1MCwgMHhGRSwgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgxMiwgMHgwMCwKKwkgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHg2MCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyQywgMHhGMCwgMHgyRCwgMHhGMCwKKwkgMHhEMywgMHg4MCwgMHgyRSwgMHhGMCwgMHhEMSwgMHg4MCwgMHhEMCwgMHg4MCwgMHgyNywgMHg0NCwgMHgwOSwgMHgwQywgMHgwMywgMHgwMCwgMHgyNywgMHg0NCwKKwkgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhCOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhENCwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHgwRCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHgxQywgMHhGMiwgMHg2MiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwKKwkgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwKKwkgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0NCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyQiwKKwkgMHgwNSwgMHgwMCwgMHgzMCwgMHhGMywgMHgyNCwgMHg0NSwgMHhENCwgMHg4NCwgMHhDQSwgMHg2NSwgMHhENCwgMHg4MywgMHhENCwgMHg2NCwgMHgxQSwgMHgwMCwKKwkgMHgwRiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHg3MCwgMHg2MywgMHgxQywgMHhGMiwgMHhDQSwgMHg2NSwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwKKwkgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwKKwkgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0NCwgMHgyQiwgMHhGMiwgMHhDNCwgMHg4NSwKKwkgMHhENCwgMHg4MywgMHhDNCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyRiwgMHhGMCwgMHhCMCwgMHhGMCwgMHhCMSwgMHhGMiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg4NCwgMHg0QywgMHg4NSwgMHg0QywgMHg4MSwgMHg0QywgMHhBMSwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwKKwkgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwKKwkgMHhCQywgMHhGRiwgMHhDNCwgMHhFMiwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHg4OSwgMHhGRiwgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwKKwkgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHgwNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg0NywgMHhBOCwgMHg2MCwgMHg4OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNywgMHg2MCwgMHg4RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0MCwgMHhCNCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg5QiwgMHgwMSwgMHgyOCwgMHg0NCwgMHhENCwgMHgzNiwgMHgwMywgMHgwMCwKKwkgMHhBQSwgMHg2MCwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHhGQiwgMHhCNCwgMHg0MCwgMHg0NywgMHgyMSwgMHg2MCwKKwkgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHhGQiwgMHgxQywgMHg0MiwKKwkgMHgyMiwgMHg0NiwgMHgyQSwgMHhGMCwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHhDQywgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg0MiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwKKwkgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHhDMiwgMHgwMCwgMHgwNCwgMHgyQiwgMHhDMCwgMHgwMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHgwMSwgMHgwMCwgMHgwNywgMHhGNCwgMHg0NywgMHhGMiwgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwKKwkgMHg4MCwgMHhGRiwgMHhDNCwgMHg2MCwgMHg3OCwgMHg0NCwgMHgwMiwgMHhBNCwgMHhBMiwgMHhEQiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwKKwkgMHg4OCwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgyMiwgMHg0NiwgMHgyMiwgMHhGMiwKKwkgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywKKwkgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHgyMiwgMHg0NiwgMHgzQSwgMHhGQSwKKwkgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4NSwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwKKwkgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHhERSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwKKwkgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwKKwkgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwKKwkgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwKKwkgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwKKwkgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwKKwkgMHgwQywgMHhGMCwgMHgwNCwgMHgwMiwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2NCwgMHgyMiwgMHg0NiwgMHgwMywgMHhGQSwgMHg2MCwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwgMHhGQywgMHhBMSwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHgwMCwgMHhGMCwKKwkgMHgwNCwgMHg2MywgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgwMywgMHhGQywgMHgwMiwgMHgwMCwgMHgyMiwgMHg0NiwKKwkgMHgxQSwgMHhGQSwgMHgzNSwgMHhGMiwgMHgwNCwgMHhGOCwgMHhEQywgMHg4NCwgMHgzNSwgMHhGQSwgMHgxNCwgMHhGMiwgMHgwRiwgMHhCNSwgMHgwRiwgMHhCNCwKKwkgMHhDQywgMHg4NCwgMHg5NCwgMHg4MCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgwMSwgMHgwMiwgMHg5NCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHg5NSwgMHhGQywgMHgwNiwgMHgwMCwgMHhDNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgyNywgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHg0OCwgMHhFMiwKKwkgMHhBOCwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHg2OCwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgzMiwgMHg0NCwgMHgwMCwgMHgyNywgMHgwMywgMHgwMCwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzQywgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHgxMywgMHhGMCwgMHhBNCwgMHg4NCwgMHhCNCwgMHhCQywgMHg0MCwgMHg0OCwgMHg2MiwgMHhGMSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHg2MCwgMHg0NSwgMHhEMCwgMHg4MCwgMHg3MCwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwKKwkgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0RSwgMHhBMCwgMHg2MywgMHgwQSwgMHg2NCwKKwkgMHg2NSwgMHg0MCwgMHgwQSwgMHgzNiwgMHgwMywgMHgwMCwgMHgzOCwgMHg2MSwgMHgxNCwgMHg2NCwgMHhFQiwgMHg4MywgMHg0MCwgMHg0NSwgMHg0MywgMHg0NCwKKwkgMHgwMiwgMHg2MCwgMHg1RSwgMHg2NSwgMHgyQSwgMHhGMiwgMHgyQiwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgyRSwgMHg0NSwKKwkgMHhENCwgMHg4NSwgMHhDNSwgMHg4NCwgMHgwNSwgMHgwMCwgMHgxQiwgMHhGMCwgMHhDNSwgMHg4NCwgMHhDMCwgMHg4NCwgMHgyRSwgMHg0NSwgMHhDNCwgMHg4NCwKKwkgMHg2MCwgMHg0MywgMHgyOCwgMHg0NCwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg1NiwgMHg2MiwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg1QywgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhBMSwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwKKwkgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwKKwkgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NywgMHgzNiwgMHhGMywgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2MCwgMHg1QiwgMHg0RCwgMHhFMiwgMHhBOCwgMHg2MCwKKwkgMHg4MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNiwgMHg0MywgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwgMHgyQSwgMHg0NCwKKwkgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHg5NSwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHg2NCwgMHg0NCwgMHg5NSwgMHhGOSwgMHgyNSwgMHhGQSwgMHg5NiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwgMHgyOCwgMHhGQSwKKwkgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHgyOSwgMHhGQSwgMHgyRCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwRSwgMHgwMCwKKwkgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgzMCwgMHhGMSwgMHg1MCwgMHgwMCwgMHhGQywgMHhCMywgMHgzMiwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHhDQiwgMHhGRSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwRiwgMHhGQywgMHgwNSwgMHhGRiwgMHgzMCwgMHhGMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwKKwkgMHgyRCwgMHgwMCwgMHhGQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgyRCwgMHg0NCwgMHgxMCwgMHgyQSwgMHgyNCwgMHgwMCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzQSwKKwkgMHgyMSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwKKwkgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHgxMiwgMHg2MCwgMHhDMCwgMHg2MywgMHgxRCwgMHhGMCwgMHhDMCwgMHg2NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEMSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEQiwgMHhBOCwgMHg2MCwKKwkgMHg4OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwKKwkgMHhBNCwgMHgzQSwgMHgwNCwgMHgwMCwgMHgzOSwgMHhGMSwgMHgyNSwgMHg0NCwgMHgwQSwgMHgzNiwgMHgzOCwgMHhGMSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHgyOCwgMHg0MCwgMHhFNCwgMHgzNiwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHhBNywgMHg2MCwgMHg4RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNywgMHg0NCwKKwkgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhFQSwgMHgwMSwKKwkgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwgMHgwOSwgMHgwMCwgMHhCQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgzQywgMHg0NiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwKKwkgMHhDMCwgMHhGRSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGRCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGNCwgMHgwMSwgMHhGMywgMHgwQSwgMHg3QywgMHg1MCwgMHg2RCwgMHhFMiwKKwkgMHhGMCwgMHgwMSwgMHg3MiwgMHg0NSwgMHhEQywgMHg4NCwgMHg5NSwgMHhGQiwgMHgxMSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg5NiwgMHhGMywgMHgwNiwgMHgwNCwKKwkgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHhBNywgMHg2MCwgMHhBNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgxMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxNiwgMHg2MCwgMHhCQSwgMHg2MywgMHhCRCwgMHhEMywgMHg3MiwgMHg0NSwKKwkgMHg0NCwgMHg4QSwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwKKwkgMHhERCwgMHg4MSwgMHhCRCwgMHhEMywgMHg5NSwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwKKwkgMHhDNCwgMHg4NCwgMHg2MCwgMHg1NSwgMHgyQSwgMHg1MiwgMHg5NSwgMHhGQiwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHg5NiwgMHhGMSwKKwkgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhDNCwgMHg4NCwgMHg5NiwgMHhGQiwgMHgwMiwgMHgyNCwKKwkgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHg5NywgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg5NywgMHhGQiwgMHhBOCwgMHg2MCwKKwkgMHgwQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHgwMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNSwgMHgwOSwgMHgwMCwgMHgwNCwgMHgyNSwKKwkgMHgwMywgMHgwMCwgMHg0NywgMHhGRiwgMHgzMiwgMHg3NCwgMHhBNSwgMHgwMSwgMHhDNCwgMHhFMiwgMHhBRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0QywgMHg0RSwgMHg0NywgMHhGRiwgMHgzMiwgMHg3NCwgMHhDRCwgMHhFMiwgMHhBQywgMHg2MCwgMHg4RiwgMHg3OCwgMHgwMCwgMHg2MSwgMHgxMCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg0RCwKKwkgMHgyNiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgwQywgMHgwMCwgMHgzRSwgMHg0NiwgMHgwOSwgMHhGMiwgMHgxRSwgMHg0MSwgMHgwMywgMHgxQiwgMHhBRSwgMHg2MCwKKwkgMHhDQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg1RSwgMHhGRCwgMHhGQiwgMHgyMSwgMHg0NCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHg0MSwgMHg1RCwKKwkgMHgyMSwgMHg0NiwgMHgwMCwgMHhGMiwgMHg0NiwgMHg0NSwgMHg4NywgMHhGQywgMHg0QywgMHhFMiwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwKKwkgMHgwRSwgMHhFMSwgMHgwMywgMHhFMSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMCwgMHgwMCwgMHgyMSwgMHg2OSwgMHhCNiwgMHhGRiwgMHhBMSwgMHhGRiwKKwkgMHg2QywgMHg1RSwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHg2MCwgMHg1QywgMHgyMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2OCwgMHg0MywgMHgyNiwgMHhGQywKKwkgMHgyMiwgMHg2OSwgMHg2NCwgMHg0NCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg1RiwgMHg2MCwgMHg0MywgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwgMHgzQSwgMHg2OSwgMHgxRCwgMHhGQywgMHgyRSwgMHg0NCwgMHgzNiwgMHhGMSwgMHgxQywgMHhGQSwgMHhDMywgMHg5NCwKKwkgMHhDRCwgMHhFMiwgMHgyRSwgMHg0NCwgMHgxNCwgMHgzNiwgMHgxMiwgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRiwgMHgwMCwgMHg2MywgMHg0NSwgMHhFMywgMHg4MywKKwkgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhGRiwgMHhGRiwgMHgzNywgMHgzNiwgMHgwNSwgMHgwMCwgMHg2RSwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHhBRSwgMHg2MCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywKKwkgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNywgMHhDRiwgMHg4MywgMHgxQiwgMHhGQywgMHgwMSwgMHg2NCwgMHg0RiwgMHhGQiwgMHhBMSwgMHhGRiwgMHgxQywgMHhGMiwKKwkgMHgyOSwgMHg0MSwgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHg2OCwgMHg1RiwgMHgyNywgMHhGQSwgMHg2QywgMHg0MCwgMHgwMywgMHgxNSwKKwkgMHhBRSwgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHg5OSwgMHhGMSwgMHhGQywgMHhBMywKKwkgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwNCwgMHhBRSwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHg0QywgMHgwMCwgMHg5QSwgMHhGRiwgMHgyMywgMHg0MywgMHgxOCwgMHg2MSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhDQiwgMHg4MywgMHgyQSwgMHhGQSwKKwkgMHg0MCwgMHg0OCwgMHg0MCwgMHgyNywgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgwNiwgMHhBMSwgMHg4OCwgMHhCMCwKKwkgMHg4OCwgMHgzNiwgMHhEOSwgMHg4MSwgMHg2MiwgMHg0NSwgMHgyMywgMHg0NCwgMHg1NCwgMHg5NCwgMHgyOCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwMCwgMHg2NCwKKwkgMHgzRiwgMHhGQSwgMHhDOSwgMHg4MSwgMHg2NSwgMHg0MiwgMHg3QSwgMHhEQywgMHgwMCwgMHhCOSwgMHhGRCwgMHgxQywgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwKKwkgMHgxMCwgMHg2MiwgMHgxNCwgMHgwMiwgMHgwNSwgMHgxRCwgMHgxMiwgMHgxRSwgMHgwQywgMHgwMCwgMHgwMCwgMHhGNCwgMHg3QywgMHg2MSwgMHgwMiwgMHg2MiwKKwkgMHg3QSwgMHhEQywgMHg2MywgMHg0MCwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgwOCwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2MiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHg4MSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHhBMSwgMHhGRiwgMHg0NywgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwKKwkgMHg4NCwgMHhCQywgMHgwMSwgMHgxNSwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0NiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMSwKKwkgMHgwMSwgMHgwMCwgMHhGRCwgMHgxRiwgMHhBRSwgMHg2MCwgMHg2MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5QSwgMHhGRiwgMHg1NCwgMHg2MywgMHgxMiwgMHg2NCwKKwkgMHg0MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwRiwgMHhGQSwgMHhBMSwgMHhGRiwgMHhDQiwgMHhGMSwgMHgxMiwgMHg2MSwgMHg1MCwgMHhGRSwgMHg4QywgMHg0NCwKKwkgMHhDQywgMHhGMCwgMHhCRCwgMHhEQSwgMHg0MCwgMHg0OCwgMHgwNCwgMHgyNiwgMHg0MCwgMHgwMCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwKKwkgMHgzMCwgMHhGQiwgMHg2QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHgyNCwgMHgwMCwgMHhEMCwgMHg4MCwgMHhBMSwgMHhGRiwKKwkgMHg4QywgMHg0NCwgMHg2QywgMHg1QywgMHhGMiwgMHhGRSwgMHhCRCwgMHhEQSwgMHhDRCwgMHhGMywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEOCwKKwkgMHgyRCwgMHg0NCwgMHgxNSwgMHgwQywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg0MiwgMHgwQywgMHhCMiwgMHgwOCwgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0RCwgMHg0RCwgMHgwMCwgMHgwMywgMHgwQSwgMHhBRSwgMHg2MCwgMHhGOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHhCQywgMHg0MCwgMHg0RCwgMHgyOCwgMHg0NSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHgyNCwgMHg4OCwgMHg0MiwgMHgwMCwgMHgzMCwgMHhCQywKKwkgMHg0MCwgMHg0RCwgMHgzRiwgMHgwMCwgMHgyMCwgMHhCOSwgMHg1QywgMHg4RSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEQywgMHg5QywKKwkgMHg2QywgMHg0NCwgMHhGMiwgMHhGRSwgMHhCRCwgMHhEQSwgMHgwOCwgMHgyOCwgMHg0NCwgMHg0RSwgMHhEQywgMHg4NCwgMHgyRSwgMHg1QywgMHhCMCwgMHg4NCwKKwkgMHhFRiwgMHhCMSwgMHgwOCwgMHgyNCwgMHg0MCwgMHhCOSwgMHg0MSwgMHg0NiwgMHgyQywgMHgwMCwgMHg4QywgMHg0NCwgMHgwNCwgMHg2MSwgMHhCRCwgMHhEQSwKKwkgMHg1MCwgMHhGRSwgMHg4MCwgMHgyNywgMHgwMCwgMHg2NCwgMHgzMCwgMHhGQiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHg4QywgMHg0NCwKKwkgMHhCRCwgMHhEQSwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NSwgMHg4QywgMHg0NCwgMHhDRCwgMHhGMSwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHgyOCwgMHg0NCwKKwkgMHgwMywgMHgwQywgMHhBMCwgMHgyQSwgMHgwQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwNCwgMHgwMCwKKwkgMHhENCwgMHgzQSwgMHgwOCwgMHgwMCwgMHgyNywgMHg0MCwgMHg0MCwgMHgyNiwgMHgzMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHg0NiwgMHg0RSwKKwkgMHgzNSwgMHg4RCwgMHg1RiwgMHgwMCwgMHg0MCwgMHgyNiwgMHhGOSwgMHgwMSwgMHgzMCwgMHg2NSwgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywKKwkgMHhGNCwgMHgwMSwgMHgwMCwgMHhFMSwgMHgyMywgMHg0MywgMHhFOCwgMHhBMywgMHg2QSwgMHg2MiwgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0NCwKKwkgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwgMHg4OCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHg3MCwgMHg2MiwgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg0MCwgMHgyQiwgMHgxMywgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhEQywKKwkgMHgwNCwgMHhFNiwgMHg3QSwgMHhEQywgMHgzQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhGQywgMHhBMywgMHgyNSwgMHhGRiwgMHgzRiwgMHhGQywgMHgwNCwgMHhBMywgMHhCMCwgMHhGRiwKKwkgMHgwMSwgMHgwMCwgMHgzRiwgMHhGQywgMHhDRiwgMHg4MywgMHhERiwgMHg4MywgMHgwNCwgMHgwMiwgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwKKwkgMHgxRiwgMHgwMCwgMHgyNywgMHgwMywgMHhDQiwgMHg4MywgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwRSwgMHhBMywgMHhBNywgMHg4NCwgMHhGMiwgMHhBMywKKwkgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHgwMywgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwKKwkgMHgwQSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBNywgMHg4NCwgMHg3QSwgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHhGOSwgMHgxRCwKKwkgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhGNiwgMHgwMywgMHhGRiwgMHhCMSwgMHgwQywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwKKwkgMHhBMSwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2QywgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMCwgMHhFNiwgMHg3QywgMHg0NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwgMHg4MywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg0NiwgMHg0NSwgMHhBMSwgMHhGRiwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHgwQSwgMHg2NCwgMHg2MCwgMHg1NCwgMHg0NywgMHhGRiwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwgMHg2QSwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgwMSwgMHgxNSwgMHgyOSwgMHgwMCwgMHg2QywgMHg0MCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyNiwgMHgxNSwgMHgwMCwgMHgzMSwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzQSwgMHgwRiwgMHgwMCwgMHgyRCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwQywgMHgwMCwKKwkgMHgyQiwgMHg0NCwgMHhBQywgMHg4MCwgMHgyOCwgMHg0MCwgMHhCNCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMywgMHgzMCwgMHhGQiwgMHgwNCwgMHgwMCwKKwkgMHgyQiwgMHg1MCwgMHhBOCwgMHg2MCwgMHg5MiwgMHg3OCwgMHgwNCwgMHhFMSwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMSwgMHgyNiwgMHg0NCwKKwkgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwgMHg4NCwgMHhCQywgMHgyRCwgMHg0MCwgMHgwQywgMHgyMiwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHgyMywgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBQiwgMHg2MCwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgzNywgMHhGMywgMHgyQiwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyOCwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHg1MCwgMHhBMCwgMHg0QywgMHgyMCwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzNSwgMHhGMSwgMHg3NCwgMHg0NCwgMHhDMCwgMHg5NCwKKwkgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxOCwgMHgwMCwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHhCNCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgzNiwgMHgxMSwgMHgwMCwgMHgyNiwgMHg0MywgMHhGRCwgMHhCMywgMHgwNCwgMHhCQiwgMHg0MywgMHg0NiwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgyOCwgMHg0NywgMHg0MCwgMHhCRiwgMHg0MCwgMHg0OCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHgwMCwgMHg2NCwKKwkgMHgzMCwgMHhGQiwgMHgwNSwgMHhGRiwgMHhDNiwgMHgwMSwgMHgyNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhBNywgMHg2MCwgMHg4RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxOCwgMHgwMCwKKwkgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwRSwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhGOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg1QywgMHg0MSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgwMiwgMHgwMCwgMHgyOSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgxMSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhGMSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyMSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg2QywgMHg0MCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgzMiwgMHg3NCwgMHg0MCwgMHg2MywKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2OCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHhBNywgMHg2QSwgMHgyMiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHg2MCwgMHhDOSwgMHg2MywgMHgwMSwgMHgxMSwgMHgwMiwgMHgwMCwgMHg2QywgMHg0MCwgMHhGQywgMHgxRiwgMHg2QywgMHg0MCwgMHhCNSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHhCQywgMHhGRiwgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHgwMywgMHgwQSwgMHhBNywgMHg2MCwgMHg5QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHg0RiwgMHhGQiwgMHgyNywgMHg0NCwKKwkgMHgwNiwgMHgyMiwgMHgwNiwgMHgwMCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHhFMiwKKwkgMHgyNywgMHg2NCwgMHgzQSwgMHhEQiwgMHhCMywgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg1NCwgMHg2MiwgMHgyMiwgMHg0NiwKKwkgMHhBMiwgMHhEMCwgMHgxNiwgMHg2MywgMHg3QywgMHg0MSwgMHg0NCwgMHg0OCwgMHg4MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzNiwKKwkgMHgwNCwgMHg2MSwgMHg0MSwgMHg0RSwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwRSwgMHg2MywgMHgxMiwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgyNCwgMHg0NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0MCwgMHg4MCwgMHg0RSwgMHg3QSwgMHhENCwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxRCwKKwkgMHg3OCwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg2QSwgMHg0MCwgMHg3MCwgMHg2MiwgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwgMHg4OCwgMHgzNiwKKwkgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhBMiwgMHhEMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg0NiwgMHgwMCwgMHgyMywgMHg0MywKKwkgMHhDRiwgMHg4MywgMHhERiwgMHg4MywgMHgwMiwgMHgwMywgMHg1NSwgMHgwMywgMHgwNCwgMHgwMCwgMHgwMywgMHhGMCwgMHgwNCwgMHhGNCwgMHg2NCwgMHg0MiwKKwkgMHgzNywgMHgwMCwgMHgyRSwgMHg0MCwgMHgwNCwgMHgyQSwgMHgyMSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgwMiwgMHhGRSwgMHgxMCwgMHgyNSwgMHg0MiwgMHhGRSwKKwkgMHg3MiwgMHg0NSwgMHg2NSwgMHg0QywgMHg5NSwgMHhGMywgMHgwMywgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg4NCwgMHg5NSwgMHhGQiwgMHhBMSwgMHhGRiwKKwkgMHg4MCwgMHg0QywgMHg5NiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHg5NiwgMHhGQiwgMHg4MCwgMHg0QywgMHg5NywgMHhGMywgMHgwMiwgMHgwNCwKKwkgMHhEQywgMHg4NCwgMHg5NywgMHhGQiwgMHg4MCwgMHg0QywgMHg1QywgMHg0RSwgMHhGOCwgMHhBMywgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwKKwkgMHhGRiwgMHhCMSwgMHhGOCwgMHhBMSwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MiwgMHgwOSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwKKwkgMHhDOCwgMHg4MiwgMHhGRiwgMHhCMSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhCMSwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwKKwkgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgxNywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwgMHhEQSwgMHg4MiwKKwkgMHhBMiwgMHhEMiwgMHhBMSwgMHhGRiwgMHgwOSwgMHg3NCwgMHg4MCwgMHg0RCwgMHgwRSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwKKwkgMHgyMywgMHg0MywgMHhBMSwgMHhGRiwgMHhBMCwgMHhEMiwgMHhGRSwgMHhBMSwgMHhDQiwgMHg4MywgMHg4MCwgMHg0RSwgMHhBRiwgMHg4MywgMHgwMiwgMHgxRCwKKwkgMHgwMiwgMHgwMywgMHhFRCwgMHgwMSwgMHhFMywgMHgwMSwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg5QywgMHg0RSwKKwkgMHg5QywgMHg0QywgMHhBMSwgMHhGRiwgMHhEQSwgMHg4MywgMHg2NiwgMHg0NCwgMHgyMiwgMHg0NiwgMHgwQywgMHhGQSwgMHgwQiwgMHhGQywgMHg4NywgMHg0RiwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwgMHg4OSwgMHhGRiwKKwkgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHgzNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwNiwgMHhFMSwKKwkgMHg0NywgMHhGRiwgMHhBOCwgMHg2MCwgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MywgMHhGRiwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgyOCwgMHhGMywgMHg0NywgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNywgMHgzNywgMHg0QiwgMHgwMCwKKwkgMHgwNSwgMHgzQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHgwQSwgMHg4MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgyQSwgMHhGMywKKwkgMHg0NywgMHhGRiwgMHgzRiwgMHhGMCwgMHgwMSwgMHgxQiwgMHgwMSwgMHg2NCwgMHg2MCwgMHg1NiwgMHhBRCwgMHhFMiwgMHhCNSwgMHhGRiwgMHg2QywgMHg0MCwKKwkgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwgMHgxMiwgMHg2MiwgMHg2NCwgMHg0MywgMHgwMSwgMHhFMSwgMHgwMywgMHg2NCwKKwkgMHhFMiwgMHhEMCwgMHhDOSwgMHg4MSwgMHg2NCwgMHg0QywgMHhDQywgMHg4NCwgMHhEQSwgMHg4MiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2QiwKKwkgMHg5QSwgMHhGRiwgMHhDQSwgMHg4MiwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3QSwgMHhEMCwgMHhBMSwgMHhGRiwKKwkgMHg2NCwgMHg0QywgMHhGQywgMHgxQywgMHhGOCwgMHgxRCwgMHgwMCwgMHhCOSwgMHgwNiwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwKKwkgMHg1QSwgMHhEMiwgMHhBMSwgMHhGRiwgMHg2MCwgMHg0RCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwOCwgMHgwMCwgMHgyOCwgMHhGMywgMHhBNSwgMHg2MCwKKwkgMHhDNCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQiwgMHgwMiwgMHgwMCwgMHg4MCwgMHg0QywgMHhGRSwgMHgwMSwgMHhBMSwgMHhGRiwgMHg4NywgMHg0RSwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg2NywgMHg0QywgMHhGRiwgMHhGRiwgMHhCQywgMHhGRiwgMHgwMCwgMHhFMSwKKwkgMHhENSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHg2MCwgMHg0MSwgMHhCNSwgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHgyOSwgMHhGNSwgMHgzRiwgMHhGMCwgMHgyNCwgMHhGMiwgMHg0NCwgMHg0MywgMHg0MCwgMHg0NCwgMHgwMCwgMHhGNCwgMHhGMywgMHg2MCwKKwkgMHhBMCwgMHg2NSwgMHgxMCwgMHg2MiwgMHg1QSwgMHhEMiwgMHhEOSwgMHg4MSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQiwgMHgwMiwgMHg2MSwgMHg0NSwKKwkgMHgyNCwgMHg0NCwgMHhENCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBNSwgMHg0OCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhDNCwgMHg5RCwgMHgwRCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyNCwgMHg0NCwgMHhDMCwgMHg4MywgMHhCQiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgwMSwgMHhFMSwKKwkgMHgwMCwgMHhGNCwgMHg2QywgMHg2MSwgMHgxMCwgMHg2MiwgMHgwNSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwKKwkgMHgwNCwgMHg2MiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHgxQSwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwKKwkgMHgyNCwgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0NCwgMHgwMiwgMHgwMywgMHg2QywgMHg0NSwgMHhGMywgMHgwMSwgMHgwMywgMHgxNSwgMHgwMSwgMHg2NCwKKwkgMHgwNSwgMHhGQSwgMHgxNSwgMHgwMCwgMHg2QywgMHg0NSwgMHhFRCwgMHgwMSwgMHgyMywgMHg0NCwgMHhDOCwgMHg4NCwgMHg0MCwgMHg0MywgMHgwMiwgMHgwMywKKwkgMHg2QywgMHg0NSwgMHhFNywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMSwgMHgxNSwgMHgwMSwgMHg2NCwgMHg2QywgMHg0NSwgMHgwNSwgMHhGQiwgMHhFMiwgMHhEMiwKKwkgMHhEQSwgMHg4MiwgMHhDOSwgMHg4MSwgMHg2MCwgMHg0QywgMHhERCwgMHgxQywgMHhENywgMHgwMywgMHhCQywgMHhGRiwgMHhEQSwgMHgwMSwgMHgwMCwgMHhFMSwKKwkgMHhENSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHg0MywgMHhGRiwgMHhBRCwgMHg0RiwKKwkgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgwMSwgMHhFMSwgMHgwMSwgMHg2MCwgMHg2OSwgMHg2QiwgMHhBNSwgMHg2MCwgMHhDNCwgMHg2NCwKKwkgMHg2MCwgMHg0QywgMHhCQiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0QywKKwkgMHhGQywgMHgwMSwgMHgyOSwgMHhGMywgMHgyQSwgMHhGMSwgMHgwNywgMHhCNSwgMHgwNCwgMHhFMSwgMHg2NSwgMHg0MSwgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwKKwkgMHg5NSwgMHg4MSwgMHhBMSwgMHg1RCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGOSwgMHgwMSwgMHgwMCwgMHhFMSwgMHgzMCwgMHg0MCwgMHgwMiwgMHgzNiwKKwkgMHhBMSwgMHhGRiwgMHg4MywgMHhGRiwgMHg4RCwgMHhGRiwgMHg1QywgMHg0NCwgMHg1QywgMHg0MywgMHg1QywgMHg0MiwgMHg1QywgMHg0MSwgMHg1QywgMHg0MCwKKwkgMHhBQywgMHhGRiwgMHhBRCwgMHhGRiwgMHhFNywgMHhFMSwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MSwgMHg3RiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgyNiwgMHgwMiwgMHg5OCwgMHhGRSwgMHgxQSwgMHgwNSwgMHgxQiwgMHg2MCwKKwkgMHhCOCwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwKKwkgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgwQSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGNiwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywgMHgwMywgMHgwNSwKKwkgMHg0NSwgMHg0MCwgMHgwMCwgMHg2NywgMHhEOCwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwQSwgMHg3RSwgMHgwNCwgMHhGQiwgMHg2MSwgMHg1NSwKKwkgMHg0QSwgMHgwMCwgMHgyOCwgMHhGQiwgMHgwMSwgMHhGMywgMHgyOSwgMHhGQiwgMHg0NCwgMHg0NiwgMHg0MCwgMHg0NSwgMHgxMCwgMHg2MSwgMHg3RSwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgzMSwgMHgwMiwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywgMHgwMywgMHg2MywgMHgyQSwgMHgwMiwgMHgyNiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgyNCwgMHgwMCwgMHg5OCwgMHhGRSwKKwkgMHgxOSwgMHgwNSwgMHgxQiwgMHg2MCwgMHhCOCwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwKKwkgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywKKwkgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwKKwkgMHgwRSwgMHhGQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGNiwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywKKwkgMHgwNSwgMHgwNSwgMHg0NSwgMHg0MCwgMHhEOCwgMHhGRSwgMHgwMCwgMHg2NywgMHhEMCwgMHhGRSwgMHhEOSwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwKKwkgMHgwQiwgMHg3RSwgMHgwNCwgMHhGQiwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwgMHg4MCwgMHhCQywKKwkgMHgwOCwgMHgyOCwgMHhBMywgMHhEQiwgMHg2MSwgMHg1NSwgMHg2MywgMHgwMCwgMHgwNCwgMHhCNSwgMHg4MiwgMHhCNSwgMHgyNSwgMHgwMiwgMHgwNCwgMHgwMywKKwkgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHhBMywgMHhEMywgMHg5OSwgMHhGRSwgMHgwNCwgMHgwNCwgMHgwMiwgMHhCQywgMHhGRSwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHg1NiwgMHgwMCwgMHhCQywgMHhGMywgMHgyMCwgMHg0MCwgMHg4MCwgMHgyNiwgMHg1MiwgMHgwMCwgMHhBMywgMHhEMywgMHhGRiwgMHhBMCwKKwkgMHhGOCwgMHhCNCwgMHgwMiwgMHgwMiwgMHhBMywgMHhEQiwgMHgxQywgMHgwMCwgMHgwNCwgMHhCQywgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgwOCwgMHhCMCwKKwkgMHgwMSwgMHg2NCwgMHgwOCwgMHgyNCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhGQiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhEMCwgMHhGRSwKKwkgMHgzRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgzQywgMHgwMCwgMHg0MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMiwgMHhGOCwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHgwOCwgMHhCNSwgMHgwNywgMHg3QywgMHgwMSwgMHgwMiwgMHhCQywgMHhGOSwgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwKKwkgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCNSwgMHgwNywgMHhCNSwgMHgwOCwgMHgyOCwgMHhDNCwgMHgwMiwKKwkgMHg5OSwgMHhGRSwgMHgyNiwgMHgwNSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyMywgMHgwMCwgMHgyMCwgMHgyQSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgyQSwKKwkgMHgxRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgwOSwgMHgwMCwgMHhBOCwgMHhGRiwgMHgyMCwgMHg0NCwgMHg5OSwgMHhGRSwgMHgwMiwgMHgwNSwKKwkgMHg4MCwgMHgyQSwgMHgwMywgMHgwMCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgxMywgMHgwMCwgMHgwMCwgMHhGMSwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwQSwgMHgzNiwgMHgyOSwgMHgwMSwgMHgwQiwgMHgzNiwgMHg1QSwgMHgwMSwgMHgyOCwgMHhGQiwKKwkgMHgwMSwgMHhGMSwgMHgyOSwgMHhGOSwgMHgwMiwgMHhGMSwgMHgyQSwgMHhGOSwgMHgwMywgMHhGMSwgMHgyQiwgMHhGOSwgMHhEMCwgMHhGRSwgMHhBRSwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHgzRSwgMHg3NSwgMHg0NCwgMHgwMiwgMHhCMCwgMHgwMSwgMHhCMCwgMHgyOCwgMHgwMiwgMHhEQywgMHgwMiwKKwkgMHgwNCwgMHhCMCwgMHgwOCwgMHhCMCwgMHgwQiwgMHgwMiwgMHgyMCwgMHgwMiwgMHg0MCwgMHgyNiwgMHhBNywgMHhGRiwgMHg4QywgMHhGRiwgMHg3NSwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgwMSwgMHgwMCwgMHhBQiwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFQSwgMHgwMSwgMHgwQSwgMHhGMywgMHhBQSwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg2MCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwgMHhDMCwgMHg2MCwKKwkgMHgwMCwgMHg3QywgMHhBMCwgMHg4NCwgMHg4MCwgMHgzQiwgMHgwMiwgMHgwMCwgMHhDMCwgMHg2NywgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHg2NywgMHgwQSwgMHhGQiwgMHhENSwgMHgwMSwgMHhENCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEMSwgMHgwMSwgMHg3OSwgMHg2MywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHgxRiwgMHhBOSwgMHhGRiwgMHg3NywgMHg0NCwgMHg2MCwgMHg1NywgMHgxMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg0MCwgMHg0QSwKKwkgMHgwMSwgMHgyQSwgMHgxQywgMHgwMCwgMHgyNCwgMHg0NCwgMHhBQywgMHg4NiwgMHgwOCwgMHhGMiwgMHgxOCwgMHgwMywgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NSwKKwkgMHhENCwgMHg4MCwgMHgwRSwgMHhGMiwgMHgwMiwgMHgwMywgMHhBNSwgMHhENSwgMHgwNCwgMHgwMCwgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHgwOSwgMHhGNCwKKwkgMHhEMSwgMHhGRSwgMHg0NiwgMHg0NCwgMHgwQiwgMHgxOCwgMHg2NiwgMHg0NCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NywgMHgyMCwgMHhCRiwgMHgzQiwgMHg0MiwKKwkgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwgMHgwMSwgMHg3NSwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHgyQSwgMHg0NCwgMHgwOCwgMHgyQSwKKwkgMHgxOCwgMHgwMCwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHg1QywgMHg0MywgMHgxNCwgMHgwMywgMHgxQiwgMHg2MCwgMHhCOCwgMHg2MiwgMHhBMiwgMHhENSwKKwkgMHgwMSwgMHgwMCwgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwgMHgwRCwgMHgxOCwgMHgwOCwgMHhCMCwgMHgxOCwgMHhBQywgMHhGQSwgMHgwMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgxMSwgMHhGRCwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgwNiwgMHgyMiwgMHgyRCwgMHgwMCwgMHgyMiwgMHg0NCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHgyOCwgMHgwMywgMHgxMCwgMHhCMCwgMHgwMSwgMHhCQywgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyMiwgMHgwMCwgMHgwRSwgMHhGQSwKKwkgMHhEMSwgMHhGRSwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg4MCwgMHgwMCwgMHg0NiwgMHg0MiwgMHgxOSwgMHgwMiwKKwkgMHgyMiwgMHg0NywgMHg0MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMiwgMHg2NiwgMHg0MywgMHgwMCwgMHhBOCwKKwkgMHgwRSwgMHhGMiwgMHgwOCwgMHgwMiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHhFNCwgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwMiwgMHg3NSwgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHhEQywgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwNCwgMHg3NSwgMHgyQSwgMHg0NCwgMHg4MCwgMHgyQSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg0NCwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgxNSwgMHgwMywKKwkgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg1NiwgMHgwMCwKKwkgMHg0NiwgMHg0MSwgMHgwQiwgMHgwMiwgMHgyMSwgMHg0NywgMHgxMCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwKKwkgMHg2NiwgMHg0MywgMHgwOCwgMHhGRCwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHg4MCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgxMCwgMHhCMCwgMHgyMCwgMHg0NCwKKwkgMHgxNSwgMHgwMywgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwKKwkgMHg4MCwgMHhCMCwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHg0MCwgMHhCQywgMHg3RiwgMHhCNCwgMHgwNCwgMHhCMCwgMHhBMywgMHhEQiwgMHgwMywgMHgwMywKKwkgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhCMSwgMHg2MCwgMHg5MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFOCwgMHhGRSwgMHgxNCwgMHgwNSwgMHhFQSwgMHhGRSwgMHgyNCwgMHgwNSwgMHhFOSwgMHhGRSwgMHgxQywgMHgwNSwgMHhFNywgMHhGRSwKKwkgMHgwOSwgMHgwNSwgMHg0NywgMHhGRiwgMHgyMCwgMHg0NCwgMHgwRiwgMHgyMiwgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg0MCwgMHg0MCwgMHgwRiwgMHgyMiwKKwkgMHhCOCwgMHhGRSwgMHhFQywgMHgwMSwgMHgyMywgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhFOCwgMHgwMiwgMHg2RSwgMHgwMSwgMHgyNCwgMHg0MSwKKwkgMHgwMCwgMHhCOSwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NSwgMHg0NSwgMHg0NywgMHhFMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgwRiwgMHgwMCwgMHhERSwgMHgwMiwKKwkgMHg1QywgMHg0QSwgMHg0NiwgMHg0NCwgMHg1MCwgMHgwMSwgMHgyMiwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHgwOCwgMHgyNCwgMHg4MSwgMHgwMSwKKwkgMHhENSwgMHgwMSwgMHgyMSwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhBNiwgMHgwMywgMHhEMCwgMHgwMSwgMHgyNywgMHhEMywgMHgwMywgMHgwMCwKKwkgMHgxMCwgMHhCMCwgMHgwOSwgMHhGMiwgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwOCwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwQywgMHhGMywgMHgyNCwgMHg4NiwgMHgyNCwgMHg0NiwgMHg2MCwgMHg0MCwKKwkgMHhGQiwgMHgzQiwgMHgwNywgMHgwMCwgMHg4MCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgyMywgMHg0NiwgMHgwMywgMHg0QywgMHg0NiwgMHg2MSwgMHgzQSwgMHg2NSwKKwkgMHgwQywgMHgwMCwgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwKKwkgMHgzOSwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHg0NSwgMHgwMCwgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwKKwkgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRSwgMHhGQiwgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwKKwkgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHhBQywgMHhGRiwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRiwgMHgwRiwgMHhGMywKKwkgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgyNCwgMHg4NiwgMHgwRCwgMHhGMywgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwKKwkgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwgMHgxNiwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHgyMiwgMHgwMCwgMHgwNCwgMHgwNSwKKwkgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRiwgMHhGQiwgMHgyRSwgMHhGNSwKKwkgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHg4RCwgMHhGRiwgMHhBRCwgMHhGRiwgMHhCMSwgMHg2MCwKKwkgMHhDMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwgMHg4QSwgMHhGMSwgMHg4QiwgMHhGMSwgMHhEMCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNywgMHgwNCwKKwkgMHgwMSwgMHgwNiwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHhBMCwgMHg4NSwgMHg5NCwgMHg4MCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgyNiwgMHg0MSwgMHg0NiwgMHg2MywgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwgMHhENSwgMHg4MSwKKwkgMHgwMCwgMHhGMiwgMHgwNSwgMHgwNCwgMHgwNCwgMHg2MywgMHg2MCwgMHg0NiwgMHhGNywgMHgxQiwgMHg0MiwgMHhGRSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0NCwKKwkgMHhDNSwgMHg4MSwgMHg2MywgMHg0NSwgMHhDNSwgMHg4MSwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHgwMSwgMHhGMiwgMHhGMCwgMHg4NSwgMHhGMCwgMHg4MCwKKwkgMHg2NSwgMHg0NCwgMHhGOCwgMHg4NSwgMHhGRiwgMHhGRiwgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNywgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwKKwkgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwgMHgwOCwgMHhGRSwgMHgxNywgMHgwMCwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwKKwkgMHgwMCwgMHhCNCwgMHgxMiwgMHgwNiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgwNiwgMHgwMywgMHgyQSwgMHg0MywgMHhCMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhCOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QSwKKwkgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywKKwkgMHgyQSwgMHg0MywgMHhCMywgMHg2MCwgMHg1OCwgMHg0RSwgMHhCOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHgwRCwgMHgwMCwgMHgxQiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNiwgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwKKwkgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGMywKKwkgMHg3QywgMHg2MywgMHgwMCwgMHhCRSwgMHg0MCwgMHg0NSwgMHgxQSwgMHgwMywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NCwgMHhEQywgMHg4NSwgMHg4NCwgMHhBMSwKKwkgMHgwMCwgMHhGMiwgMHgwNiwgMHgwNiwgMHgwMSwgMHhGQywgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhGNywgMHgwMiwgMHg0MCwgMHg0NSwgMHgwRSwgMHgwMCwKKwkgMHg4QywgMHhGMywgMHgwMCwgMHg2MywgMHhENCwgMHg4NCwgMHg4QywgMHhGQiwgMHg4MCwgMHg2MCwgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHhGMCwKKwkgMHgwMCwgMHhGQywgMHhEMywgMHg4MCwgMHg4RCwgMHhGOSwgMHgwMiwgMHgwMiwgMHg4RSwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHgyNSwgMHg0NiwgMHgwNSwgMHhGQSwgMHgwNiwgMHhGQSwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHgwMiwgMHhGQywgMHhCMCwgMHg4NCwKKwkgMHgzQSwgMHg3RSwgMHgwMSwgMHhGQSwgMHgxMiwgMHg2NCwgMHgwMywgMHhGQSwgMHgwMCwgMHhGMCwgMHgwNCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgwQywgMHg2MSwKKwkgMHgxMCwgMHg2MywgMHg1OSwgMHhEQSwgMHhGRSwgMHgxRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwKKwkgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwKKwkgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhCRSwgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwKKwkgMHhBMywgMHhEQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwgMHgwMCwgMHhBOCwgMHgwNywgMHg0QiwgMHgwQywgMHgwMywgMHg1OCwgMHg0RiwgMHgzMywgMHgwMCwKKwkgMHgwQiwgMHg0NywgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NSwgMHgyNywgMHg0NCwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMiwgMHgwRiwgMHhGQSwKKwkgMHg1OCwgMHg0RiwgMHhEMywgMHgwMSwgMHg3MCwgMHgwMCwgMHgyNSwgMHg0MywgMHhFMywgMHg4NCwgMHg3QywgMHg0MSwgMHgwMiwgMHgwNCwgMHhFOCwgMHg4MSwKKwkgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhBMywgMHhEMiwgMHgwMCwgMHg3QywgMHg0MCwgMHg0NSwgMHhCRiwgMHhEOCwgMHhBMywgMHhEOCwgMHhCRSwgMHhEOCwKKwkgMHgyNywgMHg0MiwgMHg1QSwgMHhEMywgMHgyNSwgMHg1QywgMHg2MCwgMHg0MSwgMHgwMiwgMHgxQiwgMHgyNywgMHhEOSwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwKKwkgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNywgMHg0MywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0NiwKKwkgMHgwOSwgMHhGMiwgMHgwOCwgMHhGQywgMHgwMCwgMHhBOCwgMHhERCwgMHg4MSwgMHhGQSwgMHgwMiwgMHhCRiwgMHhEMSwgMHg2NiwgMHg0NCwgMHhCRSwgMHhEQiwKKwkgMHhDMSwgMHg4NCwgMHhCRiwgMHhEQiwgMHg0OCwgMHgwMCwgMHgyNSwgMHg0NiwgMHhFNCwgMHg2MywgMHgwOCwgMHhGMiwgMHg4OSwgMHhGMiwgMHgxRSwgMHgxOCwKKwkgMHg0MCwgMHg0NywgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgwMiwgMHgwNSwgMHhFOCwgMHg4MywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NiwgMHhCRiwgMHhEMiwKKwkgMHg2MSwgMHg1QywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwgMHgyNSwgMHg0NiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NiwgMHgwOCwgMHgyNCwKKwkgMHhCRSwgMHhEQSwgMHgwMiwgMHgxQiwgMHhBMywgMHhEOCwgMHgwMiwgMHgwMCwgMHg2MCwgMHg0NiwgMHg4OSwgMHhGQSwgMHgwMCwgMHhCOSwgMHg2MSwgMHg0NiwKKwkgMHgwOCwgMHgyOCwgMHgwQSwgMHhGQSwgMHgyNSwgMHg0NiwgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywgMHg4OCwgMHhGQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MSwgMHgyOCwgMHg2NSwgMHgyNSwgMHg0MywgMHg4RSwgMHhGMywgMHhBRiwgMHg4MywgMHgwMCwgMHhCRSwgMHgxOCwgMHgwMywgMHgwMiwgMHgwMywKKwkgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHg4RCwgMHhGRCwgMHg2MywgMHg0NiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHgwMCwgMHhGMiwgMHgwNywgMHgwMiwKKwkgMHg4RSwgMHhGNSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHhERSwgMHg2MCwgMHhBRiwgMHg2NCwgMHgwOSwgMHhGQiwgMHgwOCwgMHgwMCwgMHg2NiwgMHg0MywKKwkgMHgwMCwgMHhCRSwgMHhERCwgMHg4MSwgMHhGMSwgMHgwMiwgMHg4QywgMHhGMSwgMHg4RSwgMHhGRCwgMHhDMSwgMHg4NCwgMHg4QywgMHhGQiwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NSwgMHgyOSwgMHg0MywgMHhGQywgMHhBMywgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMywgMHg2MSwgMHgwRSwgMHg2NSwgMHgxQiwgMHg2MCwgMHhEOCwgMHg2MywgMHg0MywgMHg0OSwKKwkgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHgwNCwgMHgwMiwgMHhGOSwgMHgwMiwgMHhCMSwgMHg2MCwgMHhDMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHhFNiwgMHgwMSwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHhFMywgMHgwNSwgMHhGNiwgMHhBMywgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMSwgMHg0NCwgMHg0NywgMHg0NCwgMHg0OCwgMHg0NCwgMHg0NSwgMHgxQywgMHg2MCwgMHgxNiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg0OCwgMHhGRSwgMHg4RCwgMHhGNSwgMHg4QywgMHhGMywgMHgwRCwgMHgxOCwgMHhDQywgMHg4NCwgMHg4QywgMHhGQiwgMHg4MCwgMHg2MCwKKwkgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGMCwgMHgwMCwgMHhGQSwgMHhEMCwgMHg4MCwgMHg4RCwgMHhGOSwgMHgwMiwgMHgwMiwKKwkgMHg4RSwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MywgMHgwRCwgMHg2NSwgMHgwMCwgMHg2MSwKKwkgMHg0MSwgMHg0OCwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHhBQywgMHg4NiwgMHgwMCwgMHg2MSwgMHgwOSwgMHgwMywgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwKKwkgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwgMHhGNiwgMHgwMSwgMHg2MSwgMHg0NCwKKwkgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg2NSwgMHg0NCwgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHhDQywgMHg4NSwgMHg1QSwgMHg4NywgMHhFOSwgMHgwMiwKKwkgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHhEQSwgMHg1QSwgMHg4NywgMHg4OCwgMHhGMywgMHg4NywgMHhGMSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHgxRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwKKwkgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NCwgMHhDQywgMHg5QywKKwkgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMiwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwKKwkgMHg4OCwgMHhGMywgMHg4NywgMHhGMSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwOSwgMHgwMywgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwKKwkgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwgMHhGNiwgMHgwMSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NCwKKwkgMHhDQywgMHg5QywgMHg2MSwgMHg0NCwgMHhFQiwgMHgwMiwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwKKwkgMHgwNiwgMHg2MCwgMHg0MCwgMHg2NSwgMHg4RCwgMHhGMywgMHgwMSwgMHg2MSwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwMywgMHgwMywgMHhENSwgMHg4MCwKKwkgMHhERCwgMHg4MSwgMHhGQSwgMHgwNCwgMHhDRCwgMHg4NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHgyOCwgMHg0NSwgMHhDNCwgMHg4NCwgMHg1QSwgMHhEQSwKKwkgMHhEQSwgMHg4MSwgMHg4QywgMHhGMSwgMHg1OSwgMHhEOCwgMHgxQiwgMHg2MCwgMHg4NiwgMHg2NCwgMHgxOCwgMHg2MywgMHhBMCwgMHhEMSwgMHgwNiwgMHhBNCwKKwkgMHg1OSwgMHhEOCwgMHhGQywgMHgxRiwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQSwgMHg1OSwgMHhEQSwgMHgwMSwgMHg2MCwgMHgxQywgMHg2NCwgMHgwQSwgMHg2MywKKwkgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHg3RSwgMHhGMSwgMHg1OSwgMHhEOCwgMHg0NSwgMHgwMSwgMHgwNywgMHg0QiwgMHhCNCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHg1OCwgMHg0RiwgMHgyMSwgMHgwMCwgMHgzQywgMHgwMSwgMHgwNywgMHg0QiwKKwkgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHgyNywgMHg0NCwgMHgwMCwgMHhCRSwgMHgwOCwgMHhGMCwKKwkgMHgxNSwgMHgwMywgMHg2NCwgMHg0MiwgMHg0QSwgMHhEMywgMHgwOSwgMHhGMiwgMHhEQywgMHg4MywgMHhBMiwgMHhERCwgMHgyNSwgMHg0MywgMHgwOSwgMHhGQywKKwkgMHg2MywgMHg0NiwgMHgyNywgMHg0MywgMHgwQSwgMHhGQywgMHgwOSwgMHhGQSwgMHgwOCwgMHhGOCwgMHgwMCwgMHhBOCwgMHg2NiwgMHg0MywgMHgwMywgMHgwMiwKKwkgMHg2NCwgMHg0NCwgMHg1OCwgMHhERCwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHgxQywgMHgwMSwgMHgyNywgMHg0MywKKwkgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwKKwkgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwKKwkgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwgMHgwNCwgMHgwMCwgMHgwOSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwKKwkgMHgyOCwgMHhFMiwgMHg0MCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwgMHg0MCwgMHg0MiwgMHhCNSwgMHg2MCwKKwkgMHhBMiwgMHg2NCwgMHg0MCwgMHg0MCwgMHg5RCwgMHhGMywgMHg2NiwgMHhGQiwgMHgwRiwgMHg2MCwgMHg5QSwgMHg2MywgMHhBQSwgMHhGMywgMHhCRCwgMHhEQiwKKwkgMHgwMCwgMHg2MCwgMHg5QSwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHg1QywgMHg0OSwKKwkgMHgwQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHg1QywgMHg1QywgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHg4OSwgMHhGRiwKKwkgMHgwMywgMHg2MCwgMHhGRiwgMHg3MywgMHg4OCwgMHhGRiwgMHhCNSwgMHg2MCwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRSwgMHgwNywgMHgwNSwKKwkgMHhBMywgMHhGRSwgMHgwNywgMHgwNSwgMHhBMSwgMHhGRSwgMHg1MCwgMHgwNSwgMHg2MCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgxMCwgMHgwMCwgMHgyMCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMSwgMHgxMiwgMHg2MCwgMHhDQywgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwKKwkgMHhBMCwgMHg0QywgMHg1OSwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHg0MCwgMHg2MCwgMHgwQiwgMHg2NSwgMHgyQiwgMHg0NCwgMHgwMCwgMHg2MywgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgwMiwgMHgyNCwgMHg5NCwgMHg4NCwgMHhGMywgMHg4MywgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGOCwgMHgwMiwgMHhERiwgMHg4MywgMHgyRiwgMHg1OCwKKwkgMHg0MCwgMHg0QiwgMHgwMCwgMHg2MiwgMHgwMSwgMHg2NCwgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxQSwgMHgwMywgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwKKwkgMHgxNSwgMHgwMywgMHg2MSwgMHg0NCwgMHgxMSwgMHg2MSwgMHhFMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwMSwgMHgwMCwgMHhFMCwgMHg4NCwKKwkgMHhGMiwgMHg4MiwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwgMHhDNiwgMHg4MiwgMHgwMiwgMHgyOCwgMHhENiwgMHg4MiwgMHhFMiwgMHg4MCwgMHhDRCwgMHg4MSwKKwkgMHgwMiwgMHgyOCwgMHgwMSwgMHhCQywgMHhGNCwgMHgwMiwgMHgwMSwgMHgyQSwgMHhDNiwgMHg4MiwgMHgwMywgMHgwMCwgMHhFOSwgMHg4MSwgMHhGMiwgMHg4MiwKKwkgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHgxMCwgMHg2MSwgMHgwNCwgMHgwMywgMHhGMCwgMHg4NCwgMHhDRCwgMHg4MSwKKwkgMHhGRCwgMHgwNCwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhBOCwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHg2MCwgMHg0MCwgMHgwNCwgMHgzQSwgMHgyRCwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHgxQiwgMHg2MCwKKwkgMHg4OCwgMHg2MywgMHhBMywgMHhEMywgMHg0NiwgMHg0MywgMHhBQywgMHg4NiwgMHgzQywgMHg0NSwgMHgyMywgMHgwMywgMHhENCwgMHg4MCwgMHgwNywgMHhGMiwKKwkgMHgwMiwgMHgwMiwgMHgwOSwgMHhGMiwgMHhGOCwgMHgwMSwgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGNSwgMHgwMiwgMHg2MCwgMHg0MywgMHg4MCwgMHg2NywKKwkgMHhCMCwgMHg4MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NSwgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMiwgMHg2MCwgMHg0MCwKKwkgMHhGMCwgMHgzNywgMHgwNSwgMHgwMCwgMHg5MCwgMHhGMywgMHhENCwgMHg4MCwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMiwgMHg5MCwgMHhGQiwgMHg2MywgMHg0NCwKKwkgMHhEQSwgMHgwMSwgMHgyMywgMHg0NiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHhGRiwgMHhGRiwgMHg4OSwgMHgwMiwgMHg2QSwgMHhGMywgMHg2QiwgMHhGMywKKwkgMHgwMiwgMHhBOCwgMHgwMiwgMHhBOCwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg2QywgMHhGQiwgMHg2QSwgMHhGQiwgMHg2QiwgMHhGQiwgMHgwMCwgMHg2NCwKKwkgMHg2RCwgMHhGQiwgMHhDQSwgMHhGRSwgMHg5NywgMHgwMCwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg2QiwgMHhGQiwgMHhDQSwgMHhGRSwgMHgwMSwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgzNSwgMHgwMywKKwkgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg4QSwgMHgwMCwgMHgyRSwgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyQywgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywKKwkgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg2MywgMHgwMiwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwKKwkgMHg4MCwgMHhCMCwgMHgwOSwgMHhGMiwgMHg1QywgMHgwMywgMHhBQywgMHg4NiwgMHhDQSwgMHgwMSwgMHg2QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHg1MCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRiwgMHgwMywgMHg3NywgMHhGMSwgMHgwNywgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHgwMywgMHgwMiwgMHhBQywgMHg4NiwKKwkgMHgwNywgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg3NywgMHhGQiwgMHhFQywgMHgwMSwgMHg0NiwgMHg1QywgMHgzRiwgMHgwMCwKKwkgMHgxQiwgMHg2MCwgMHhBNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMSwgMHgwMywgMHgzNywgMHgwMiwKKwkgMHg2QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwQiwgMHgwMywgMHgyQSwgMHhGMCwgMHgyMCwgMHg2NywgMHgwOSwgMHhGMiwgMHhCMCwgMHg4MywKKwkgMHgwMCwgMHhBOCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMywgMHgyQSwgMHhGQywgMHgwMSwgMHgwMCwgMHg2QywgMHhGQiwgMHgyMCwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHg2QywgMHhGQiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgxMiwgMHgwMywKKwkgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMywgMHg3NywgMHhGMSwgMHgwNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHgwMywgMHgwMiwgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwgMHhGQSwgMHgwMiwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwKKwkgMHg3NywgMHhGQiwgMHhFNywgMHgwMSwgMHgwMCwgMHg2NCwgMHg3NywgMHhGQiwgMHhCNSwgMHg2MCwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHhGQiwgMHg0NiwgMHg1QywgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgwNywgMHhGMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg3NywgMHhGOSwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0OCwgMHhGQiwgMHhCOCwgMHg2MCwgMHgyRCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg4OCwgMHhGMywgMHgwNywgMHgwMiwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhCRCwgMHg2MCwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhCOCwgMHhGMywgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwKKwkgMHgwMywgMHgzQSwgMHgwMCwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MywgMHg0MCwgMHg0NywgMHg1MCwgMHgzNiwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2MywKKwkgMHg0OCwgMHhGRCwgMHg0QSwgMHhGMywgMHgzNSwgMHhGQSwgMHgxMCwgMHhBNCwgMHg0QSwgMHhGQiwgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgxNiwgMHhGQSwKKwkgMHgwRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwKKwkgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhCQiwgMHhGQiwgMHgwNywgMHhGMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhCQiwgMHhGMywgMHhCQSwgMHhGQiwgMHg2MCwgMHg0MSwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwKKwkgMHgwMSwgMHhGMiwgMHhGQywgMHhBNSwgMHgwMCwgMHg3RiwgMHhENCwgMHg4NCwgMHgyNywgMHg0NSwgMHgzQywgMHg0NiwgMHgxQSwgMHhGQSwgMHgyMiwgMHg2MywKKwkgMHg3QiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMywgMHgyQiwgMHgxQywgMHg2MywgMHgyQSwgMHhGQSwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwKKwkgMHgxNCwgMHg2MywgMHg0MywgMHg0QywgMHgwMCwgMHg3QywgMHgyMiwgMHhGOCwgMHg2NCwgMHg0MSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHgzNiwgMHhGMiwgMHg2MywgMHg0NiwgMHhGRiwgMHhCNCwgMHgyMiwgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg4RSwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHg4OSwgMHgwMCwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwgMHhBMCwgMHhEMiwgMHhBQSwgMHg2MCwKKwkgMHhBQSwgMHg2NSwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwQSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwKKwkgMHgwNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHg3RiwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwMSwgMHg2MSwgMHg2MiwgMHg0MywKKwkgMHg0NiwgMHg0MywgMHgzQywgMHg0NiwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwKKwkgMHg0NSwgMHgwMCwgMHg2MCwgMHg0NSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHhDRCwgMHg4MSwgMHgzQywgMHg0NiwgMHgxNCwgMHgwMiwgMHg2NCwgMHg0NCwKKwkgMHg4OCwgMHgzQSwgMHgxMSwgMHgwMCwgMHg4RSwgMHgzQiwgMHgwRiwgMHgwMCwgMHg2NSwgMHg0NCwgMHgwMSwgMHgyNiwgMHg1RSwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgyRCwgMHgwMCwgMHhBMywgMHg0NiwgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHg1MywgMHgwMCwgMHgzQSwgMHgwMCwgMHhBMywgMHg0NiwgMHg2NSwgMHg0NCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywKKwkgMHgyQywgMHgwMCwgMHgxNywgMHgwMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgzNiwgMHhGMiwgMHg2NiwgMHg0MywgMHhGRiwgMHhCNCwKKwkgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg2MCwgMHg0NywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHg2MywgMHg0NiwgMHgzNywgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHgxMCwgMHgyNywgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgxNSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgzQywgMHg0NiwgMHgwMiwgMHg2NSwgMHhCQywgMHg2MCwgMHg1OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2MywgMHg0MiwKKwkgMHg1QSwgMHhEMCwgMHgzQywgMHg0NiwgMHgwQSwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwgMHgwNywgMHgwMCwgMHg3NywgMHgzNywgMHgxRCwgMHgwMCwKKwkgMHg3OCwgMHgzNywgMHgxQiwgMHgwMCwgMHg4RSwgMHgzNywgMHgxOSwgMHgwMCwgMHhGMSwgMHgwMSwgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg4MCwgMHg2NywKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgzRSwgMHhGMCwgMHgwOCwgMHhBNCwgMHg2MCwgMHg0MSwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHg2MSwgMHg0NCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgzRiwgMHhGQSwgMHgzQywgMHg0NiwgMHgyQywgMHhGMiwgMHgyNywgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgzMiwgMHhGMiwgMHhCNSwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg1MywgMHgwMCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgzRiwgMHhGMiwgMHgwOSwgMHgwNiwgMHgyQywgMHg0NSwgMHhDNCwgMHg4NCwgMHhEMCwgMHg4MCwgMHg0MCwgMHg0QSwgMHg0MCwgMHgwNiwKKwkgMHg2MCwgMHg0MywgMHg2NCwgMHg0NCwgMHg1NCwgMHg4OCwgMHgxOCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgxRiwgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhCQiwgMHhGMywgMHgwMCwgMHhCQywgMHg2MCwgMHg0NywgMHhFQywgMHhBMCwgMHgzMywgMHgwMywgMHgzMiwgMHgwNywgMHgyQywgMHg0NCwgMHhDNCwgMHg4MSwKKwkgMHgwMiwgMHg2MCwgMHgxQywgMHg2NSwgMHg0NSwgMHg0QSwgMHhENSwgMHg4MCwgMHgyQywgMHg0NSwgMHgyQSwgMHgwNiwgMHgyNywgMHg0MCwgMHgwNCwgMHgyNywKKwkgMHgzMCwgMHgwMCwgMHgyQSwgMHg0MywgMHhENywgMHg4NSwgMHg0NSwgMHg0OCwgMHhCNiwgMHhGMSwgMHgwRiwgMHhGMiwgMHhEMywgMHg4MCwgMHgwMSwgMHg2NSwKKwkgMHgwMSwgMHgwNywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgwRiwgMHhGQSwgMHgwMCwgMHg2MywgMHgzRiwgMHhGMiwgMHgyOCwgMHg0NSwgMHg2MCwgMHg0MSwKKwkgMHhENCwgMHg4NCwgMHhERiwgMHg4MywgMHhGQywgMHgwNywgMHgxNCwgMHhGQywgMHg2MSwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwOSwgMHgzQSwKKwkgMHgwNiwgMHgwMCwgMHgyOCwgMHg0NCwgMHg0OCwgMHg4OCwgMHgyQSwgMHg0NCwgMHhDOCwgMHg4MywgMHg0MywgMHg0QSwgMHhFNSwgMHgwMSwgMHgxNywgMHhGQSwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNywgMHg0NSwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyOCwgMHg0MywgMHgxNiwgMHhGQywgMHgwRCwgMHgwMCwKKwkgMHgzRiwgMHhGMiwgMHgyQywgMHg0NSwgMHhCNiwgMHhGMSwgMHhDNCwgMHg4MSwgMHhEMSwgMHg4MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMSwgMHhCQywKKwkgMHgwRiwgMHhGQSwgMHgzRiwgMHhGMiwgMHgxNywgMHhGQSwgMHgwMSwgMHg2NCwgMHgxNCwgMHhGQSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHgwRSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhCQiwgMHhGQiwKKwkgMHg2MiwgMHhGMSwgMHg2MCwgMHg0MywgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhDMCwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwKKwkgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0NCwgMHg4NiwKKwkgMHgyQSwgMHhGMiwgMHgwNywgMHhGMCwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHgxMiwgMHgwMCwKKwkgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHg1NSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg1MCwgMHgwMCwKKwkgMHgxNywgMHhGMiwgMHgyMiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwKKwkgMHg0NywgMHgwMywgMHg0NiwgMHgwMywgMHgzQywgMHg0NiwgMHgyQSwgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0NSwKKwkgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwQSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHgyNywgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHgyQSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyNCwgMHg2NSwKKwkgMHg0NSwgMHg0QywgMHgyRSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyOCwgMHg2NSwgMHg0NSwgMHg0QywKKwkgMHgwNywgMHhGMCwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwMywgMHgwMywgMHg2MywgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwMSwgMHgwMCwgMHgzRCwgMHhGMSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhCMCwgMHgzRSwgMHhGMiwgMHgxOSwgMHgwMywgMHg2MCwgMHg0NywKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwMywgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgxQiwgMHg2MCwKKwkgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwgMHhCNSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCQiwgMHhGMSwgMHgyQywgMHg0NSwgMHg2NCwgMHg0MywgMHgxNywgMHhGMiwgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwKKwkgMHgwNCwgMHgwRCwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RSwgMHhCQiwgMHhGQiwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgyQiwgMHhGMCwgMHgxQiwgMHhGQSwKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNywgMHgzNCwgMHgwMCwgMHgxNiwgMHhGMiwgMHgwRiwgMHhGMCwgMHhBQywgMHg4NCwgMHgyQywgMHg0NSwgMHgyOSwgMHgwMywKKwkgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwKKwkgMHg2NCwgMHg0NSwgMHgwRiwgMHhGMCwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwKKwkgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHgwRiwgMHhGQSwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgxRCwgMHhGQSwgMHhERSwgMHg2NSwgMHhDNCwgMHg4NSwgMHgyNiwgMHg0MSwgMHhFMSwgMHg4MSwKKwkgMHhDNSwgMHg4NCwgMHgyQiwgMHhGQSwgMHgxQiwgMHhGMCwgMHhERSwgMHg2NCwgMHhDMCwgMHg4NSwgMHgyNiwgMHg0NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwKKwkgMHgxMCwgMHhGQSwgMHgyNiwgMHg0NCwgMHgyQywgMHhGMCwgMHgwQSwgMHhBNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMCwgMHg2NCwgMHgxMSwgMHhGQSwKKwkgMHhCQiwgMHhGMywgMHgxMywgMHhGQSwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHgzRSwgMHhGMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2NCwgMHg0MSwKKwkgMHgwMSwgMHhCMSwgMHgwMSwgMHg2MywgMHgxRCwgMHgwMiwgMHg2MCwgMHg0MSwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhCMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMSwgMHg2MywgMHg2MSwgMHg0MCwgMHhGRiwgMHgyMiwKKwkgMHgwNCwgMHgwMCwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMCwgMHhERCwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgwMywgMHgwMCwgMHhCQSwgMHg2MCwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMiwgMHhGMiwgMHg0NiwgMHg0MywgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg4QiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwQywgMHgwMCwgMHhCQSwgMHg2MCwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHhCQSwgMHg2MCwgMHg0QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMiwgMHgwMCwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzQiwgMHgwMCwgMHg4OCwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwKKwkgMHgzNywgMHhGMCwgMHgwOCwgMHgwMywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMiwgMHgwMCwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHgzNywgMHhGQSwgMHgyNCwgMHgwMCwgMHgzRCwgMHhGMywgMHgwMSwgMHg2MSwgMHg2MCwgMHg0MywgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwKKwkgMHhFOSwgMHg4MSwgMHhBMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg5MSwgMHg4NCwgMHgzNywgMHhGQSwgMHgxNywgMHgwMCwgMHg0NywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwKKwkgMHg0NiwgMHhGMiwgMHgxNiwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NiwgMHhGQSwgMHg0NSwgMHhGMiwgMHgwOCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NSwgMHhGQSwKKwkgMHgwNSwgMHgwNCwgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgzNywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwKKwkgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDNCwgMHg2MCwgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwKKwkgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDNCwgMHg2MCwgMHg3RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHg4OCwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywKKwkgMHgzQywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwKKwkgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywKKwkgMHhBMywgMHg0NiwgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHhBMywgMHg0NiwgMHg0NiwgMHhGMiwKKwkgMHg0NSwgMHhGMCwgMHhBMywgMHg0NiwgMHgzQywgMHhGQSwgMHgzRCwgMHhGOCwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4QSwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzNSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwKKwkgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHhERSwgMHg4MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywKKwkgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwKKwkgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwKKwkgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwKKwkgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCRCwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHhGQiwgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg4OCwgMHhGMywgMHgxNywgMHgwMywgMHhEMCwgMHg4MCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg2RCwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg2QSwgMHgwMCwgMHg0NywgMHhGMSwKKwkgMHgwNywgMHhGMCwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwMywgMHgxMiwgMHhCQiwgMHg2MCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwQSwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgzRSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywgMHgwNywgMHhCMCwgMHgwMCwgMHgzQSwgMHgwMSwgMHgwMCwgMHhBNiwgMHgwMCwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHg0RSwgMHgwMCwgMHgwMiwgMHgzNiwgMHg0RiwgMHgwMCwgMHgwMywgMHgzNiwgMHgyRCwgMHgwMCwgMHgwNCwgMHgzNiwKKwkgMHgzRSwgMHgwMCwgMHg1MiwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwNSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwKKwkgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwKKwkgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywKKwkgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHgxRCwgMHgwMCwgMHg0QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0QywgMHhGQiwKKwkgMHhBQiwgMHhGMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMiwgMHgxQywgMHg2MCwgMHgwQywgMHg2MiwgMHgwRiwgMHg2MCwKKwkgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhDMywgMHgwMSwgMHg0QywgMHhGMywKKwkgMHg2NiwgMHg0MSwgMHhEQywgMHg4NCwgMHg0QywgMHhGQiwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhGNSwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg4QywgMHhGQSwKKwkgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHgwOCwgMHgxOCwgMHhFNCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwKKwkgMHhGQiwgMHgwNCwgMHgwMSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwQywgMHhGNCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHhFNCwgMHgwMiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHg2MSwgMHg0NiwKKwkgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgyOSwgMHgwMywgMHhFMCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwKKwkgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwKKwkgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywKKwkgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHgwMSwgMHhBMiwgMHgwMSwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHhBOCwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwMSwgMHgwMCwgMHhBNSwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwKKwkgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwKKwkgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywKKwkgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRSwgMHhGMiwgMHg2MCwgMHg0NSwKKwkgMHg2MCwgMHg0NywgMHgwNywgMHhCMCwgMHgwMCwgMHgzQSwgMHgwMSwgMHgwMCwgMHhBMywgMHgwMCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwQiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgxNCwgMHgwMCwgMHgwMywgMHgzNiwgMHg0NywgMHgwMCwgMHgwNCwgMHgzNiwgMHg1RSwgMHgwMCwgMHgwNSwgMHgzNiwKKwkgMHgwRSwgMHgwMCwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwKKwkgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QywgMHhGRCwKKwkgMHgxQywgMHg2MCwgMHgwQywgMHg2MiwgMHgwRiwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg0QywgMHhGMywKKwkgMHgwMiwgMHhCMCwgMHg2MSwgMHg0NiwgMHhDQywgMHg4NCwgMHgwNSwgMHgwMywgMHgwNCwgMHgyOCwgMHg0QywgMHhGQiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RSwKKwkgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCQywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgyOSwgMHgwMCwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwKKwkgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHgzQywgMHg0NiwgMHg0QywgMHhGRCwgMHg1MSwgMHgwMCwgMHg1MCwgMHgwMCwKKwkgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHgwMCwgMHgwMiwgMHgzNiwgMHgxMiwgMHgwMCwgMHg0OSwgMHgwMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHg0MiwgMHgwMiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzOSwgMHgwMCwgMHgzOCwgMHgwMCwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHhGMSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHhFQiwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHg2NCwgMHgzQiwgMHhEQiwgMHhDQSwgMHhGRSwgMHg0NywgMHhGMSwgMHgwMSwgMHg2NSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNywgMHgwOCwgMHgwMCwKKwkgMHgyQywgMHhGMiwgMHg2NCwgMHg0NSwgMHgwMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMSwgMHgwMCwgMHhFQywgMHgwMCwKKwkgMHgxNCwgMHhGMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxRCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgwNSwgMHg2NCwgMHgzQiwgMHhEQiwgMHg2NSwgMHg0NCwKKwkgMHhDQywgMHg4NSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhERSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwKKwkgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwKKwkgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhBRiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgyQSwgMHhGMCwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwQywgMHgzQSwgMHgwMSwgMHgwMCwgMHhBNSwgMHgwMCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhERSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg2MSwgMHg0MCwgMHgwOCwgMHgzNiwgMHgwMSwgMHgwMCwgMHg4OCwgMHgwMCwKKwkgMHgxNCwgMHhGMiwgMHgxQywgMHg2NSwgMHg2MCwgMHg0MSwgMHgwMCwgMHg2MywgMHhDRCwgMHg4MSwgMHhDNywgMHg4MywgMHhGRCwgMHgwMiwgMHgzRiwgMHhGMCwKKwkgMHgyQywgMHhGMiwgMHhDMywgMHg4MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyOSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhEQywgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhFMiwgMHg2NCwgMHhBMCwgMHhEMywgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg1MiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhEQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhFMCwgMHg2NCwgMHhBMCwgMHhEMywgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxNSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHhCNCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwgMHgyNCwgMHgwMywgMHgxMiwgMHgwMywgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhFOCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhFNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHg1RiwgMHg2NCwKKwkgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgxQiwgMHg2MCwgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywKKwkgMHhDRSwgMHhGRSwgMHhCNSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg2NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGNCwKKwkgMHgwNiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgzQywgMHg0NiwgMHgxMCwgMHgwMywgMHgxMCwgMHhCMCwgMHgyQSwgMHhGMiwgMHgwRCwgMHgwMywgMHgwRSwgMHhGMiwKKwkgMHgwQywgMHhCMCwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgyMCwgMHhCQywgMHgwMiwgMHgwMywgMHhGRSwgMHg3RiwgMHgwRSwgMHhGQSwgMHgyMywgMHhGMCwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhDQywgMHgwMSwgMHgwRiwgMHhGMCwgMHgxNSwgMHhGMiwgMHg2NCwgMHg0MSwgMHgwMSwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHhCMSwgMHhGMSwgMHgwOSwgMHgwMCwgMHgwMywgMHg2NSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgwNiwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhCMCwgMHhGMSwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHg2NCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgxNSwgMHhGQSwKKwkgMHgzQiwgMHgwNywgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgwRSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgwOCwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHgwOCwgMHhGMCwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwNywgMHhGMiwgMHg0NiwgMHg0MywgMHg4OCwgMHhGMSwKKwkgMHgwNiwgMHgwMywgMHg2MCwgMHg0NiwgMHg4NiwgMHhGNCwgMHhEMCwgMHg4MCwgMHg4MCwgMHhCQiwgMHgwMSwgMHgwMywgMHgwNiwgMHhGQywgMHgyMywgMHg0NiwKKwkgMHgzRSwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMSwgMHhCMCwgMHg0MywgMHg1QywgMHhGQywgMHhGQywgMHgwQiwgMHgwMywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHhBNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhCNSwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhFOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhFQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwKKwkgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwNywgMHhGMCwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg3RiwgMHg2NSwgMHhBNCwgMHg5RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0MCwgMHgwMSwKKwkgMHhCRSwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgwMSwgMHg2MywgMHhDNCwgMHhCNCwKKwkgMHgzMSwgMHhGQiwgMHgzMiwgMHhGRCwgMHhCRSwgMHg2MCwgMHgxQywgMHg2MiwgMHg0MiwgMHg0MCwgMHhBMCwgMHg0QywgMHg0MCwgMHhCQywgMHg3RCwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBMCwgMHhGRSwgMHgxQSwgMHhGRiwgMHgxQiwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwOCwgMHhGMCwgMHgwNywgMHhGMCwgMHhEMCwgMHg4MCwKKwkgMHgxQiwgMHg2MCwgMHhBNiwgMHg2MiwgMHgxNCwgMHgwMiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MywgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwgMHgwRiwgMHgwMywKKwkgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgyMywgMHhGQywgMHgxQiwgMHg2MCwgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgzQywgMHg0NiwKKwkgMHgwNiwgMHg2NCwgMHhBMSwgMHhGRiwgMHg0OSwgMHhGQiwgMHg4MywgMHgzRSwgMHgzMSwgMHhGMywgMHg4NywgMHg2MCwgMHg4MCwgMHg2MSwgMHgxRCwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHgwMSwgMHg2NCwKKwkgMHg0NywgMHhGQiwgMHgyMSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg3MSwgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHg0MCwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCRSwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgyQSwgMHgxQiwgMHgwMCwgMHhEMSwgMHg5MSwgMHg4RCwgMHhFMiwgMHg0MSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgyMSwgMHg2MCwKKwkgMHhBMCwgMHg2MywgMHhGRCwgMHhCNCwgMHgzMSwgMHhGQiwgMHhBMywgMHhEMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2MywgMHg2MCwgMHg1QywgMHgwRCwgMHhGMiwgMHg0NywgMHhGRCwgMHhGRiwgMHhCNSwgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwKKwkgMHgxRiwgMHgwMywgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHgwRCwgMHhGQSwgMHgxQiwgMHgwMCwgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg0MiwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGNywgMHhCNCwgMHgzMSwgMHhGQiwgMHgxMiwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwOSwgMHgwMCwKKwkgMHg0MywgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwgMHgzMSwgMHhGQiwgMHhCRCwgMHg2MCwgMHhFQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0NCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhERiwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHgwMCwKKwkgMHgyQSwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHg0MCwgMHg0MCwgMHhCQSwgMHg2MCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMiwgMHg2MCwgMHhDQywgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwgMHgwNCwgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywKKwkgMHhCRSwgMHg2MCwgMHhGNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgyOSwgMHgwMCwgMHg5RCwgMHhGRSwgMHgyNywgMHgwNCwgMHgyNiwgMHgwQSwgMHg5RiwgMHhGRSwgMHgyNCwgMHgwNSwgMHg4NSwgMHhGRiwKKwkgMHgyMCwgMHg0NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxQywgMHgwMCwgMHgzOCwgMHg2OSwKKwkgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxQSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHhFRSwgMHg2NCwgMHg4MiwgMHhGQiwgMHhGRiwgMHhGRiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHg4MywgMHhGQiwgMHgwNCwgMHg2NCwKKwkgMHg4NCwgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgxMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHg2NiwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHg3NSwgMHhGMSwgMHhDOSwgMHhGRSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgzRCwgMHgwMCwKKwkgMHg0OSwgMHhGMywgMHgzQywgMHg0NiwgMHgzMywgMHgxOCwgMHhDQywgMHg4NCwgMHg0OSwgMHhGQiwgMHgzMCwgMHgwMiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwKKwkgMHg0MCwgMHg0MiwgMHhGQywgMHhGQywgMHgwMCwgMHg2NCwgMHg1QywgMHg1QywgMHgzMiwgMHhGQiwgMHg4MiwgMHhGRiwgMHg1QywgMHg0NywgMHg4NCwgMHhGRiwKKwkgMHg2MiwgMHhGRiwgMHgxRiwgMHg2MCwgMHgwQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwKKwkgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMiwgMHgwNywgMHhGMCwgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHgwNywgMHgwMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHgxQiwgMHg2MCwgMHhENCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRSwgMHhGRSwgMHgwNiwgMHgwMCwgMHg2NiwgMHhGMywKKwkgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywKKwkgMHhBRCwgMHg0OSwgMHgyMCwgMHhCNSwgMHgwOCwgMHhCMSwgMHgyMywgMHgwMywgMHhFMSwgMHg4MSwgMHgxMCwgMHhCNSwgMHg5NSwgMHg4MSwgMHg2MCwgMHg0MSwKKwkgMHgxOCwgMHgwMiwgMHgxMiwgMHg2MCwgMHhDQSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBNCwgMHhEQiwgMHgxNywgMHgwMiwKKwkgMHgwQSwgMHg2NCwgMHhBNCwgMHhEQiwgMHg2MSwgMHg0NCwgMHgwNywgMHhCNCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMiwgMHgwOCwgMHhCMSwgMHhFMSwgMHg4MSwKKwkgMHg5NSwgMHg4MSwgMHhBMywgMHhEMywgMHgwQywgMHgwMywgMHgwOCwgMHhBQywgMHgwMSwgMHhCQywgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgxMywgMHhGRiwKKwkgMHgwNiwgMHgwMCwgMHgxMCwgMHhBQywgMHhBMywgMHhEQiwgMHgxMiwgMHg2MCwgMHhDQSwgMHg2MywgMHgwQSwgMHg3QywgMHhBMywgMHhEOSwgMHhCNSwgMHg2MCwKKwkgMHhBRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHhGMywgMHg0NSwgMHhGMSwgMHgwNSwgMHgxQiwgMHg2NCwgMHg0NCwgMHgwMywgMHgxQiwgMHgwRiwgMHg2MCwKKwkgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHg0NSwgMHhGQiwgMHgwMCwgMHg2MywgMHg0NiwgMHhGRCwgMHg2MCwgMHg0MSwgMHgyNSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgyNywgMHg0NCwgMHhFRiwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMCwgMHhCOSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwMSwgMHgxMiwgMHgxOSwgMHgwMywKKwkgMHhCRiwgMHg2MCwgMHg0RCwgMHg2MiwgMHg4NCwgMHhGRiwgMHg0MiwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHgxRiwgMHgwQSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHgxOSwgMHgwQSwKKwkgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGNywgMHgxMiwgMHg0NSwgMHhGMywgMHgyNywgMHgwMiwgMHgwMywgMHgxOCwgMHhDQywgMHg4NCwgMHg0NSwgMHhGQiwKKwkgMHhGMSwgMHgwMiwgMHgwNiwgMHgwQSwgMHhBMCwgMHg0QywgMHhGQiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBNywgMHg2MCwgMHhERiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHgyQSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHgzMiwgMHhGMSwgMHgxMiwgMHgwMywKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwRiwgMHgwMCwgMHhBNywgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxQywgMHhCQywKKwkgMHhERiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhGMSwgMHgwMSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMCwgMHg0QywgMHgzMCwgMHhCQywKKwkgMHhGMywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHgyOCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHg5NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxNiwgMHgwMCwgMHg0NiwgMHhGQiwgMHgxNCwgMHgxOCwgMHhCRiwgMHg2MCwKKwkgMHg5QiwgMHg2NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGNywgMHhCNCwgMHhBMCwgMHg1MSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHg0NiwgMHhGMywgMHhDQSwgMHgwQSwgMHhEQywgMHgwMiwKKwkgMHhDQywgMHg4NCwgMHg0NiwgMHhGQiwgMHhGNSwgMHgwMiwgMHg4NCwgMHhGRiwgMHhCRiwgMHg2MCwgMHhBRCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwKKwkgMHgyNywgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg0NywgMHhCQiwgMHhFMSwgMHgwNCwgMHgwMCwgMHgzQSwgMHhFMSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhCQiwgMHhFMSwgMHhBNywgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHhFMiwgMHgyRCwgMHhGMywgMHgyQywgMHhGMywgMHgwMCwgMHhCRCwKKwkgMHhDQywgMHg4NCwgMHgwOCwgMHgwMywgMHgyQywgMHhGQiwgMHgwNiwgMHgwMiwgMHg2NSwgMHg0NCwgMHgyQywgMHhGQiwgMHg4QSwgMHhGRiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhEMiwgMHhGMywgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0NCwgMHgwMCwgMHg2MCwgMHg0MywgMHgwNCwgMHhCMCwKKwkgMHgwMiwgMHhCMCwgMHgwOCwgMHgyNCwgMHgxNiwgMHgwMiwgMHgyOSwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhDQywgMHg4MSwgMHgwRSwgMHgwMywKKwkgMHg0MSwgMHg0OSwgMHgzNywgMHgwMiwgMHg2MywgMHg0MCwgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHhGNywgMHhCMywgMHgyNSwgMHg2MCwgMHgxQywgMHg3QywKKwkgMHhBNCwgMHhEMSwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHg0NCwgMHg0OSwgMHgyQiwgMHgwMCwgMHg2MywgMHg0MCwgMHgwMiwgMHgyQSwKKwkgMHgxNCwgMHgwMCwgMHgyNSwgMHg2MCwgMHgxRSwgMHg2NCwgMHhBMCwgMHhEMywgMHgyNSwgMHg2MCwgMHgxQSwgMHg3QywgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwKKwkgMHgyNSwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHhEMywgMHgyNSwgMHg2MCwgMHgxQywgMHg3QywgMHhBNCwgMHhEQiwgMHgwQywgMHhCQiwgMHhGRCwgMHhCMywKKwkgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RCwgMHgxNCwgMHgwMCwgMHgyNSwgMHg2MCwgMHgyMiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHgyNSwgMHg2MCwgMHgxQSwgMHg3QywgMHgwRSwgMHgxOCwgMHhBNCwgMHhEQiwgMHg0MCwgMHg0OSwgMHgyNSwgMHg2MCwgMHgyNCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHgyNSwgMHg2MCwgMHgxQywgMHg3QywgMHhBNCwgMHhEQiwgMHgwOCwgMHhCQiwgMHhGQiwgMHhCMywgMHhBRCwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwKKwkgMHhBMCwgMHg1RCwgMHhEMiwgMHhGRCwgMHgwMSwgMHg2MCwgMHgwQywgMHg2MSwgMHhBMSwgMHhEMywgMHg2MSwgMHg0MywgMHgxNywgMHgxOCwgMHg1OCwgMHhEMywKKwkgMHg2MiwgMHg0MSwgMHgwMywgMHgxOCwgMHhDQywgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHgwMCwgMHg0OSwgMHhEMywgMHhBMywgMHhEQiwgMHgwNiwgMHhBMSwKKwkgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHg2MCwgMHg0NSwgMHhBNSwgMHhEMywgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhBNSwgMHhEQiwgMHg2NCwgMHg0NCwKKwkgMHgwNiwgMHgzNiwgMHhDRCwgMHhGRSwgMHgwNywgMHgzNiwgMHhENiwgMHhGRSwgMHhFNSwgMHgwMSwgMHgyMywgMHg0NiwgMHhCNSwgMHg2MCwgMHhBRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0NiwgMHg0MywgMHgxQywgMHg2MCwgMHgwQSwgMHg2MSwgMHhBMSwgMHhEMywgMHg1OSwgMHhEMSwgMHgwNiwgMHgxQiwgMHg1OSwgMHhEMywKKwkgMHg1OSwgMHhEMSwgMHgwMywgMHgxQiwgMHg1OSwgMHhEMywgMHg1OSwgMHhEMSwgMHhGMCwgMHgxOCwgMHgwMCwgMHg2MywgMHg0OSwgMHhERCwgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgzNiwgMHgxMSwgMHgwMCwgMHgwMywgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMSwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwNSwgMHgzQSwgMHhFQSwgMHgwMSwKKwkgMHhBNCwgMHhEMywgMHg1QSwgMHhEMywgMHg5QywgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFNCwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwQywgMHg2MSwKKwkgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHhERiwgMHgwMSwgMHhDMCwgMHg2MCwgMHg0RiwgMHg2NCwgMHg0MCwgMHg0NSwgMHgyMiwgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHgwQywgMHg2NiwgMHhBNiwgMHhEMywgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhDOSwgMHg4MSwgMHg2MCwgMHg0NSwgMHgwMCwgMHhCQiwKKwkgMHhBMSwgMHhEQiwgMHhCRSwgMHhEMywgMHgwOSwgMHgwMywgMHhENCwgMHg4NCwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwRSwKKwkgMHhBMywgMHhEMSwgMHg2MywgMHg0NiwgMHg2NCwgMHg0MywgMHhGMiwgMHgwMSwgMHg5QywgMHg4NCwgMHhEQywgMHg4NSwgMHg0OSwgMHhERCwgMHg2MSwgMHg0NCwKKwkgMHgwMCwgMHhCQiwgMHhBNiwgMHhEQiwgMHgwMiwgMHgwMywgMHg2NSwgMHg0NCwgMHhCRSwgMHhEQiwgMHhCQywgMHgwMSwgMHhDMCwgMHg2MCwgMHgyQSwgMHg2NCwKKwkgMHg0MCwgMHg0NSwgMHgwMSwgMHg2MCwgMHgwQywgMHg2NiwgMHhBNiwgMHhEMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwRiwgMHgxOCwgMHgwMiwgMHgwMywKKwkgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwgMHg1OCwgMHhEMywgMHhBNCwgMHhEMywgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MywgMHhBNCwgMHhERCwgMHgwNSwgMHgxOCwKKwkgMHg1OCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDNCwgMHg4MywgMHhBMiwgMHhERCwgMHhDQSwgMHg4NCwgMHhBNiwgMHhEQiwgMHgyNSwgMHg1OCwgMHg2NCwgMHg0MSwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNiwgMHgwMiwgMHg0MCwgMHhGRiwgMHg0MiwgMHhGRiwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwKKwkgMHg0NSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4OCwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyMSwgMHhFMSwgMHg1QywgMHg0MCwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwgMHgzOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NCwgMHgzRSwgMHhGQiwgMHgwMSwgMHhBMCwgMHg0QywKKwkgMHgzRCwgMHg0NiwgMHgyQSwgMHhGMiwgMHg0NiwgMHg0RCwgMHgxMCwgMHgyNSwgMHgwRSwgMHgwMCwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NiwgMHg0MCwKKwkgMHgwRiwgMHhGMiwgMHgwMSwgMHgyOSwgMHgwMiwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwQSwgMHhCQywgMHhBMiwgMHhEQSwgMHgwOCwgMHgyNSwgMHhFOSwgMHgwMSwKKwkgMHhDQiwgMHhGRSwgMHg1QywgMHg1RCwgMHhFNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgwMywgMHgyQiwgMHgyMSwgMHgwMCwgMHg4OSwgMHhGMywgMHgwNiwgMHg2MSwKKwkgMHg2MCwgMHg0MywgMHg2NiwgMHg0NSwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzMCwgMHhGMCwKKwkgMHgwRiwgMHgwMiwgMHg2MywgMHg0NiwgMHgwNCwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwOSwgMHgwMiwgMHg2MywgMHg0NiwKKwkgMHgwMywgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGRSwgMHgwNiwgMHgwMCwKKwkgMHhDRCwgMHg4MSwgMHgwMiwgMHhBMywgMHhFNywgMHgwMiwgMHg4OCwgMHhGMSwgMHgwOCwgMHhGRSwgMHg2NCwgMHg0MywgMHgyNiwgMHgwMywgMHgzMSwgMHhGMiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwNywgMHhGQywgMHgzRiwgMHhGMiwgMHgwOSwgMHg2MCwKKwkgMHhCMCwgMHg2NSwgMHhENCwgMHg4MCwgMHgyQSwgMHhGMiwgMHhBMSwgMHgwNSwgMHgwOCwgMHgyNSwgMHg5MywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwKKwkgMHgyQywgMHg2MSwgMHg0MCwgMHg0QiwgMHhBMSwgMHhEQiwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMiwgMHg4OCwgMHhGMSwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwKKwkgMHgyMCwgMHgyQiwgMHgxMiwgMHgwMCwgMHhEMywgMHg4MCwgMHgyQywgMHhGMCwgMHg5MCwgMHgwMywgMHgwNywgMHhGNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHg4OCwgMHhGNSwgMHhCNiwgMHhGNCwgMHgyRCwgMHg0NiwgMHgwNCwgMHg2NCwgMHgwNCwgMHhCMywgMHgyMiwgMHhGQSwgMHgwNCwgMHgwMywgMHhDMiwgMHg2MCwKKwkgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHhFMCwgMHgwMCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgwQywgMHg2MCwgMHgzQSwgMHg2NCwgMHg0NCwgMHhEMywKKwkgMHg1QSwgMHhEMSwgMHgwMywgMHgxQiwgMHhDMiwgMHg2MCwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0MCwKKwkgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywKKwkgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0NCwgMHhEOCwgMHg4NCwKKwkgMHgwOCwgMHgyNSwgMHg3OCwgMHgwMCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQiwgMHgzRiwgMHhGMiwgMHgwNCwgMHg2NSwgMHhDNCwgMHg4MywgMHgwQSwgMHhFMSwgMHhCMywgMHhGRiwgMHg5QSwgMHhGRiwKKwkgMHhDQiwgMHg4MywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgwRSwgMHhBMywgMHhBQiwgMHg4NCwgMHhGMiwgMHhBMywgMHhBMSwgMHhGRiwKKwkgMHgwOCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHgwMiwgMHg2MiwgMHhDOSwgMHg4MSwgMHhBQiwgMHg4NCwgMHhBMSwgMHhGRiwgMHgwMSwgMHgwMCwKKwkgMHhBMiwgMHhEQywgMHg3QSwgMHhENCwgMHhGRCwgMHgxQywgMHhBMiwgMHhEQywgMHgwOCwgMHgyNSwgMHg1NCwgMHgwMCwgMHhGMiwgMHgxRCwgMHg3QywgMHhBOCwKKwkgMHhEOSwgMHg4MSwgMHhFRiwgMHgwMywgMHhGRiwgMHhCMSwgMHgwOSwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHg1QSwgMHhEMiwKKwkgMHg4OSwgMHhGRiwgMHg4MCwgMHg0RiwgMHg2RiwgMHg0NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgzRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHgzRiwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwQSwgMHg2NCwgMHhCMCwgMHg4NCwgMHgxOCwgMHgxNCwKKwkgMHhGNywgMHhCNCwgMHhBMiwgMHhEQSwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwQywgMHgwMCwgMHhEMSwgMHhGNSwgMHhEMCwgMHhGNCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwKKwkgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwgMHhDMCwgMHg2MCwgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxOCwgMHgwMCwgMHhEMSwgMHhGNSwKKwkgMHhCNywgMHhGMCwgMHgyQSwgMHg0NCwgMHhBNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgyNiwgMHgxMCwgMHgwMCwgMHgyRCwgMHg0NiwgMHg2NCwgMHg0NCwKKwkgMHgzQSwgMHhGMCwgMHhCQywgMHhGMCwgMHg2NCwgMHg1RiwgMHgzRCwgMHhGMCwgMHgwNywgMHhGNCwgMHhEMCwgMHhGNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhBMywKKwkgMHg1QiwgMHhEOCwgMHg2NSwgMHg1QywgMHg1QiwgMHhEOCwgMHg1QiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgwMSwgMHgwMCwgMHgyRCwgMHg0NiwgMHhDMCwgMHg2MCwKKwkgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MywgMHhGRiwgMHg0MCwgMHhGRiwgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHgyRCwgMHg0NiwKKwkgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywgMHgyRCwgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwgMHhEMSwgMHhGNSwKKwkgMHhEMCwgMHhGNCwgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwKKwkgMHgyRCwgMHg0NiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzRCwgMHg0NiwKKwkgMHgwOCwgMHgyNSwgMHhFMCwgMHgwMSwgMHgwRiwgMHhGMiwgMHg0MCwgMHhGRiwgMHgwMiwgMHhCQywgMHhBMiwgMHhEQSwgMHhDMCwgMHg2MCwgMHhCMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgwNCwgMHg2NCwgMHgyMiwgMHhGQSwgMHg4NywgMHhGNCwKKwkgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzQiwgMHhGMiwgMHhFNywgMHgwMywgMHg2MCwgMHg0NywgMHhDMCwgMHhCNywgMHgwMiwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMCwgMHhBOCwgMHg0MCwgMHg0QSwgMHgxNiwgMHgwMywgMHhFMCwgMHg4MSwgMHg2MSwgMHg0MywKKwkgMHg0MiwgMHhGRSwgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0QSwgMHhFMSwgMHg4NCwgMHhFMCwgMHg4NCwgMHgyRCwgMHg0NiwKKwkgMHgwNywgMHhGNCwgMHhFMCwgMHg4MSwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NywgMHgwQywgMHg2MCwgMHg3QSwgMHg2MywgMHhBMCwgMHg4NCwgMHg0NywgMHg5QywKKwkgMHgxMCwgMHgwMywgMHg3QywgMHg0NCwgMHhBMCwgMHg2MywgMHgxMSwgMHgwMCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MywgMHg0NiwgMHgzNywgMHhGMCwKKwkgMHg2NiwgMHg0NCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHgwMCwgMHg2MCwgMHg5MCwgMHg2MywKKwkgMHgwNCwgMHgwMCwgMHgyRCwgMHg0NiwgMHhDMiwgMHg2MCwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NiwgMHhDRSwgMHhGQiwgMHhDRiwgMHhGOSwKKwkgMHhEMCwgMHhGRCwgMHgwNywgMHhGMiwgMHhEMSwgMHhGQiwgMHg2MCwgMHg0NiwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHg1QSwgMHhEOSwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgzRiwgMHgyMiwgMHgwNSwgMHgwMCwgMHg5MCwgMHg4NCwKKwkgMHgzNywgMHhGQSwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyMSwgMHgwMCwgMHhBRCwgMHg0NiwgMHgwQSwgMHhBMywgMHgzRCwgMHhGMiwgMHhBRCwgMHg0NiwKKwkgMHhBMywgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQywgMHhGMiwgMHhBRCwgMHg0NiwgMHgwMiwgMHgwMywgMHgxNiwgMHgwNywgMHgxNCwgMHgwNCwKKwkgMHg1QiwgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQiwgMHhGMiwgMHgwMywgMHgwMywgMHhBRCwgMHg0NiwgMHgwRSwgMHgwNywgMHgwQywgMHgwNCwKKwkgMHgzQSwgMHhGMCwgMHhBRCwgMHg0NiwgMHg1QiwgMHhEMCwgMHg2NCwgMHg1RiwgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgxOCwgMHgwNywgMHgwNCwgMHgwMywKKwkgMHhEMCwgMHg4NCwgMHgxMCwgMHhBNCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwNywgMHg3RiwgMHgwMSwgMHgwMSwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwKKwkgMHhDMiwgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg1MywgMHgwMSwgMHgyRCwgMHg0NiwKKwkgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDMywgMHg2MCwgMHgzMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg0NSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwRiwgMHg2NCwgMHhDMSwgMHg2MCwKKwkgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGNCwgMHg2NiwgMHg0MSwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMiwgMHg0MCwgMHg0MiwgMHgwNSwgMHhGMiwKKwkgMHg0MCwgMHg0MywgMHg0MCwgMHg0NCwgMHg2MSwgMHg0NiwgMHgzQywgMHhGMiwgMHgzRCwgMHhGMiwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MSwgMHgwRCwgMHg2MCwKKwkgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHhDRiwgMHhGMSwgMHhDRSwgMHhGNSwgMHg0NCwgMHg0QywgMHgyQywgMHg1QywgMHhFOSwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNCwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4NCwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgwRCwgMHg2MCwgMHgyRSwgMHg2MSwKKwkgMHgwNSwgMHg2NCwgMHhEMCwgMHhGNCwgMHhEMSwgMHhGNSwgMHhGRSwgMHhBMywgMHg1QiwgMHhEMCwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOSwgMHhGQywgMHgwMiwKKwkgMHhEMCwgMHhGMywgMHhEMSwgMHhGNSwgMHg2MCwgMHg0MiwgMHgyMCwgMHg0NCwgMHhBMiwgMHhEQSwgMHgyMSwgMHg0NCwgMHg1QSwgMHhEQSwgMHgyMiwgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHgyMywgMHg0NCwgMHg1QSwgMHhEQSwgMHgyNCwgMHg0NCwgMHg1QSwgMHhEQSwgMHg2MSwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwKKwkgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHhEMCwgMHhGMywgMHhEMSwgMHhGNSwgMHhBMCwgMHhEMiwgMHg1QSwgMHhEMCwKKwkgMHg0MCwgMHg0MCwgMHg0NCwgMHg0MSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MiwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHhCQSwgMHhGMCwgMHgzQiwgMHhGMiwgMHg0NCwgMHg0NCwgMHg2NSwgMHg1RiwgMHg0MCwgMHg4NSwgMHhDRiwgMHhGNCwgMHhDRSwgMHhGNSwgMHg0MywgMHg0QywKKwkgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMCwgMHg0NCwKKwkgMHg0MCwgMHg4MCwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwKKwkgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhCRCwgMHhEMiwKKwkgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHg0MCwgMHg4NCwgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNSwgMHg0NCwgMHg0MCwgMHg4NSwgMHg2MSwgMHg0NiwgMHgzQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhDRSwgMHhGNSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyMCwgMHg1QywgMHg0MCwgMHg4MCwgMHgyMCwgMHg0NCwgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMCwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMSwgMHg1QywgMHg0MCwgMHg4MSwgMHgyMSwgMHg0NCwKKwkgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NywgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyMiwgMHg1QywgMHg0MCwgMHg4MiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHgyMiwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMywgMHg1QywgMHg0MCwgMHg4MywgMHgyMywgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHgyMywgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNCwgMHg1QywgMHg0MCwgMHg4NCwKKwkgMHgyNCwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyNSwgMHg1QywgMHg0MCwgMHg4NSwgMHgyNSwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNSwgMHg0NywgMHhFRiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyQywgMHg0MywgMHhBMywgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDQiwgMHhGMywgMHg1QSwgMHhEMywgMHg0MCwgMHg0OCwKKwkgMHg1QSwgMHhEMywgMHg0MCwgMHg0OSwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHg0NCwgMHg0RCwgMHg0NSwgMHhGMiwgMHg0NiwgMHhGMiwKKwkgMHg0MCwgMHg0NywgMHg0MCwgMHg0NiwgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHgyRCwgMHg1QywgMHhFOSwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyQSwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4QSwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgyNiwgMHg0NCwgMHg0MCwgMHhGQSwKKwkgMHgyNywgMHg0NCwgMHg0MSwgMHhGQSwgMHgyOCwgMHg0NCwgMHg0MiwgMHhGQSwgMHgyOSwgMHg0NCwgMHg0MywgMHhGQSwgMHgyQSwgMHg0NCwgMHg0NCwgMHhGQSwKKwkgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg3QywgMHg0NCwgMHg0RCwKKwkgMHgyRCwgMHg0MiwgMHhBMiwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0NiwgMHg0NCwgMHg0NywgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0OCwKKwkgMHg1QSwgMHhEMCwgMHg0NCwgMHg0OSwgMHg0NywgMHhGMiwgMHg0NCwgMHg0QSwgMHg0MCwgMHg4QiwgMHg2MCwgMHg1QywgMHg2NCwgMHg0NywgMHhFMCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHhGRiwgMHhCNCwgMHgyMCwgMHhCQywgMHg3RiwgMHhCNCwgMHhFMSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg2MywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyOSwgMHg0NCwKKwkgMHg0MCwgMHg4OSwgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwgMHg0MCwgMHg4QSwKKwkgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQiwgMHg0NCwgMHg0MCwgMHg4QiwgMHhCRCwgMHhEMiwKKwkgMHgyQiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNiwgMHg1QywgMHg0MCwgMHg4NiwgMHgyNiwgMHg0NCwgMHhFNCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyNiwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyNywgMHg1QywgMHg0MCwgMHg4NywgMHgyNywgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NywgMHhFNywgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyNywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOCwgMHg1QywgMHg0MCwgMHg4OCwgMHgyOCwgMHg0NCwgMHhFOCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOSwgMHg1QywKKwkgMHg0MCwgMHg4OSwgMHgyOSwgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQSwgMHg1QywgMHg0MCwgMHg4QSwgMHgyQSwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NywKKwkgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQiwgMHg1QywgMHg0MCwgMHg4QiwgMHgyQiwgMHg0NCwKKwkgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQiwgMHg0NywgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgzOCwgMHhGMCwgMHgyQiwgMHg0NCwgMHg5MCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MiwgMHhGRiwgMHg0MCwgMHhGRiwgMHhERCwgMHhGRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwKKwkgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgwMiwgMHg2MCwgMHhFRSwgMHg2MywgMHg2NSwgMHhGMywgMHg4MiwgMHhGRCwgMHg0MCwgMHg3RiwgMHg4MywgMHhGQiwgMHgwNSwgMHg2NCwgMHg4NCwgMHhGQiwKKwkgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHhDNSwgMHg2MCwgMHg2RCwgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMiwgMHgwMCwgMHhDNSwgMHg2MCwKKwkgMHg2RCwgMHg2NCwgMHg4NSwgMHhGQiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHhFRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwKKwkgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwKKwkgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgxQywgMHg2MCwgMHg2OCwgMHg2MywgMHgxQywgMHg2MCwKKwkgMHhEQywgMHg2NSwgMHhERiwgMHhGRSwgMHg4MCwgMHhFMSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHgwMiwgMHgxQywgMHg2MCwgMHhEQywgMHg2MywKKwkgMHgxRCwgMHg2MCwgMHhERSwgMHg2NSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwKKwkgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNSwgMHgwMiwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMCwgMHgwMCwKKwkgMHgwMSwgMHg2OCwgMHhGRiwgMHg2QSwgMHhCRiwgMHhGRSwgMHhDNiwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwKKwkgMHhBRCwgMHgwMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzOCwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHhBNSwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwKKwkgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg5QywgMHgwMSwgMHgwMCwgMHg2NSwgMHhGMSwgMHhERCwgMHhGRSwKKwkgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHg4MiwgMHhGQiwgMHg4MywgMHhGOSwgMHgwNSwgMHg2NCwgMHg4NCwgMHhGQiwgMHhERiwgMHhGRSwKKwkgMHgxOSwgMHhGRiwgMHg4MywgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywKKwkgMHhDMywgMHg4NSwgMHg4MCwgMHhFMSwgMHhERiwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGNiwgMHgwMiwgMHhCRiwgMHhGRSwgMHg2RSwgMHgwMCwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwKKwkgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwKKwkgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwKKwkgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHg1MCwgMHgwMCwgMHg4MCwgMHhFMSwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2NCwgMHg0OCwgMHg5MiwgMHg2QSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MCwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgzRiwgMHgwMCwgMHg4MCwgMHhFMSwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2OCwgMHhBNywgMHg2QSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0MCwgMHgzNiwgMHgwMCwKKwkgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg4MCwgMHhFMSwgMHg2NCwgMHg0NiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMSwgMHg2OSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg1RSwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMiwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwgMHgxQywgMHhGMiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzQSwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg1RiwgMHgyNywgMHhGQSwgMHgxQiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg0MywgMHg0NSwgMHhCRSwgMHhENSwKKwkgMHhBNCwgMHhEMiwgMHg1QSwgMHg4NiwgMHhFRiwgMHhBMCwgMHgxMSwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2MCwgMHg0MSwgMHgxQywgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHg4MCwgMHhFMSwgMHhCRCwgMHhEMywgMHgyNiwgMHg0MiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2MCwgMHg0OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHhDRCwgMHg4MSwgMHhBMiwgMHhEQSwgMHg1QSwgMHg4NiwgMHhGNCwgMHgwMiwgMHgyNSwgMHg0MywgMHgyMSwgMHhFMSwgMHgwMCwgMHg2NCwKKwkgMHhCRiwgMHhEQiwgMHgyMCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNywgMHgwMCwgMHgwNywgMHhCNCwgMHgwNCwgMHgzNiwgMHhDMywgMHhGRSwgMHgwNiwgMHgzNiwKKwkgMHhDQywgMHhGRSwgMHgwNywgMHgzNiwgMHhENSwgMHhGRSwgMHgyMCwgMHg0NCwgMHhEOCwgMHhCNCwgMHg0MCwgMHg0MCwgMHgyMCwgMHg0NCwgMHg0MCwgMHgyQSwKKwkgMHgwNywgMHgwMCwgMHg5RiwgMHhGRSwgMHgxRSwgMHgwNSwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHg4NSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHhFNiwgMHg2MywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgxNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwKKwkgMHgxMywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwMiwgMHg2MSwgMHgwRiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNCwgMHg2MSwKKwkgMHgwQiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNiwgMHg2MSwgMHgwNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNywgMHg2MSwKKwkgMHgwMywgMHgxQiwgMHhDMCwgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwgMHgyMCwgMHg0NCwgMHgwNywgMHhCNSwKKwkgMHhENCwgMHg4NSwgMHgzNSwgMHg4MCwgMHgyNCwgMHg0NSwgMHgxQywgMHg2MCwgMHgyMiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MCwgMHhFMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHg0MCwgMHg0NCwgMHgxMCwgMHgyNywgMHgxMCwgMHgwMCwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MCwKKwkgMHgwOCwgMHgyQiwgMHhBNCwgMHg4NCwgMHhBMCwgMHg1NywgMHhGRiwgMHhGRiwgMHg2NCwgMHg0OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwKKwkgMHhGRCwgMHgwMSwgMHgwMCwgMHg3RiwgMHhBMywgMHhEQiwgMHhBMSwgMHgwMSwgMHg4MCwgMHhFMSwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyQiwgMHgxMSwgMHgwMCwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHgyNCwgMHg0MCwgMHgwNywgMHgyNywgMHgwMiwgMHgwMCwgMHg1MCwgMHhFQywgMHgwMCwgMHgwMCwKKwkgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyNCwgMHg0MCwgMHgyMCwgMHgyQiwgMHg0MCwgMHhFQywgMHgwRiwgMHgwMCwKKwkgMHgxNSwgMHg2MCwgMHgyMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyNywgMHg4MCwgMHhCQywgMHhBMywgMHhEMywgMHhBMCwgMHg1NywgMHg2MCwgMHg0OCwKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg3NSwgMHgwMSwKKwkgMHhBMiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMSwgMHgwMiwgMHhBMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHg1QywgMHg0NiwgMHg1QywgMHg0OSwgMHg1QywgMHg0MCwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhFMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMywgMHhFMSwgMHhBMywgMHhGRiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMiwgMHgwMCwgMHg3NSwgMHhGMywgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxRSwgMHgwMCwKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHhCNCwgMHg3NSwgMHhGQiwgMHgwOSwgMHgwMiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMSwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOCwgMHgwMCwgMHhBOSwgMHhGRSwgMHhFNCwgMHgwNSwKKwkgMHhBQiwgMHhGRSwgMHgwNywgMHgwNSwgMHhBOCwgMHhGRSwgMHhENCwgMHgwNSwgMHhBQSwgMHhGRSwgMHhENSwgMHgwNSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4NSwgMHgzRSwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwKKwkgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NSwgMHhENCwgMHg4MCwgMHgwRiwgMHhGMCwgMHhGOSwgMHgwMywgMHg2NCwgMHg0NCwKKwkgMHg3MCwgMHhCMCwgMHg3MCwgMHgyQSwgMHgxNCwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhBMiwgMHhGRiwgMHg4RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwKKwkgMHg4RiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgwMiwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwgMHgwOSwgMHhGNCwgMHgwRiwgMHhGMiwgMHgwMiwgMHgxOCwgMHg2NSwgMHg0NiwgMHhFMywgMHgxQiwKKwkgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHhDQiwgMHgwMSwgMHhBMiwgMHhGRiwgMHg4RiwgMHhGMywgMHg0NiwgMHg0NiwgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwKKwkgMHg4RiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgwRiwgMHhGMCwgMHhBMywgMHhGQywgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNiwKKwkgMHgyMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwgMHgwMSwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQiwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNiwgMHgzRiwgMHgwMCwgMHgyQSwgMHhGMiwgMHg2MCwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQiwgMHg2NiwgMHg2MywgMHhCRSwgMHhEMiwgMHg2OSwgMHhGMSwgMHhBMywgMHhEMiwgMHhEMCwgMHg4MCwgMHg2OCwgMHhGMSwgMHgxOCwgMHgwMiwKKwkgMHhCRiwgMHhEMiwgMHhEMCwgMHg4MCwgMHg2NywgMHhGMSwgMHgxNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMiwgMHg5OCwgMHhGMSwKKwkgMHgxRiwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQiwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDOCwgMHg2MCwgMHg2RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHg0QSwgMHgwMCwgMHgyMCwgMHg2MCwKKwkgMHg2QywgMHg2MywgMHhCRiwgMHhEMywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4MSwgMHhEQiwgMHg4MywgMHgzRCwgMHgwMywgMHhCRiwgMHhEMywgMHhBMywgMHhEMywKKwkgMHg0MCwgMHg0OCwgMHhCRSwgMHhEMywgMHg0MCwgMHg0QSwgMHgyRSwgMHhGMCwgMHg0MCwgMHg0QywgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgwOCwgMHgwMiwKKwkgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyQywgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyQiwgMHgwMywKKwkgMHgzMSwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwKKwkgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMywgMHgzNCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHgzMywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgzOCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwKKwkgMHhEMCwgMHg4MCwgMHgzNiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHhGQSwgMHhBMSwKKwkgMHgwNiwgMHhBMywgMHhCNywgMHgwMywgMHhDMywgMHgwMSwgMHgwNywgMHg2MCwgMHgwMCwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQiwgMHg2MCwgMHhDOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgwRiwgMHhGMCwgMHg2MCwgMHg0NSwgMHhBNCwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwQywgMHhCNCwgMHgwNCwgMHgzNiwKKwkgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwNiwgMHgwMCwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDOSwgMHg2MCwgMHg0MiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHhGMiwgMHg1MCwgMHhGMSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RSwgMHhEMCwgMHg4NCwgMHgxRiwgMHhBNCwgMHgwNiwgMHgwRSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNywgMHgwMCwgMHhDMiwgMHhBNCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhGOCwgMHhCRiwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHhGMCwKKwkgMHg2NSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyMiwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgzNywgMHhCNCwgMHgyNiwgMHg0NiwgMHgxOSwgMHgwMiwgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGRSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHhDOSwgMHg2MCwgMHgxQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgzQSwgMHhGMywgMHgwMSwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgxMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwKKwkgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQSwgMHhGMiwgMHgyOCwgMHg0MSwgMHg0MCwgMHhBOCwgMHgwMSwgMHhCMSwgMHgwMiwgMHgwMiwgMHg1RiwgMHgwMiwKKwkgMHg4OSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGMCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwKKwkgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywKKwkgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwRiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgyNSwgMHgwMCwgMHgxMCwgMHgyQiwKKwkgMHgyNiwgMHgwMCwgMHgyMCwgMHg2MCwgMHg2QywgMHg2MywgMHhCRiwgMHhEMywgMHgyQywgMHhGMCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0MSwgMHgwRCwgMHgwMywKKwkgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMywgMHgyRCwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyRSwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywKKwkgMHgyQywgMHhGMCwgMHhEMCwgMHg4MCwgMHhGQSwgMHhBMSwgMHgxMCwgMHgwQywgMHhGMywgMHgwMiwgMHg1MCwgMHhGRSwgMHg2MCwgMHg2MCwgMHgwMSwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgxRCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRSwgMHhGMCwgMHgwMSwgMHg2NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwQywgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyQSwgMHgwMCwgMHgwMCwgMHhDQiwgMHg2MCwKKwkgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHhGQSwgMHgwMSwgMHgyQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgyMCwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxRCwgMHgwMCwgMHgwMywgMHg2NywgMHhBMCwgMHg4NCwgMHgwMCwgMHgzNywKKwkgMHg2NCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNywgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNywgMHg1OCwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMywgMHgzNywgMHgwRCwgMHgwMCwgMHhCRCwgMHhEMiwgMHg2NywgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwgMHg2OCwgMHhGMSwgMHgwNywgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMiwgMHg2OSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhDQiwgMHg2MCwKKwkgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgzMSwgMHgwMCwgMHg4OSwgMHhGMywKKwkgMHgwNiwgMHg2MSwgMHg2MCwgMHg0MywgMHg2NiwgMHg0NSwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgzMCwgMHhGMCwgMHgwRiwgMHgwMiwgMHg2MywgMHg0NiwgMHgwNCwgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwOSwgMHgwMiwKKwkgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwgMHg2NSwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGRSwKKwkgMHgwNiwgMHgwMCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBMywgMHhFNywgMHgwMiwgMHg4OCwgMHhGMSwgMHgwOCwgMHhGRSwgMHg2NCwgMHg0MywgMHgwMywgMHgwMywKKwkgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHg0MywgMHgyMywgMHg0NiwgMHgwNiwgMHhGMCwgMHgyNiwgMHg0NiwgMHgwNywgMHg2NywKKwkgMHhBMCwgMHg4NCwgMHgyMywgMHhGQSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgyQiwgMHgwMCwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHgxQiwgMHgzMSwgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywKKwkgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwKKwkgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg0MywgMHg0MywKKwkgMHgwNywgMHhGQywgMHg0MywgMHg0MywgMHgwMiwgMHhGRSwgMHgxRCwgMHhGMCwgMHgxMiwgMHg2MCwgMHhDMCwgMHg2MiwgMHhDMCwgMHg2NCwgMHhDMCwgMHg4NCwKKwkgMHhBMiwgMHhEMSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg2MywgMHg0NSwgMHgyQSwgMHhGMiwgMHgzNSwgMHhGMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgyQiwgMHgwQywgMHgwMCwKKwkgMHgyMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDQiwgMHg2MCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0NCwgMHg0QywKKwkgMHgwRiwgMHgyNiwgMHgxOSwgMHgwMCwgMHgwMCwgMHhCQywgMHg0MCwgMHg0NSwgMHgwQiwgMHgwMywgMHgwMCwgMHg2NCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHhBMiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyQSwgMHhGMCwgMHgyQywgMHg0NCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwNiwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NiwKKwkgMHhDQSwgMHg2MCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMiwgMHhGQSwgMHhBMiwgMHhGRiwgMHgxNiwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNiwgMHhEQywgMHg5QywgMHg5MywgMHhGMywgMHgyQSwgMHhGMiwgMHhEQywgMHg4MywgMHg5MywgMHhGRCwgMHgwNiwgMHhGNCwKKwkgMHgwMSwgMHhGOCwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxOCwgMHgwMCwgMHg2NCwgMHg0NCwgMHgwMCwgMHg2NSwgMHhGRiwgMHhCNCwKKwkgMHhGQywgMHhBNCwgMHgwNiwgMHhGMCwgMHgwMywgMHgwMywgMHg2NCwgMHg0NiwgMHgwQywgMHgwRCwgMHgwMiwgMHg2NSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhENCwgMHg4NCwgMHgwMSwgMHhGQSwgMHg2NiwgMHg0NCwgMHgyNiwgMHg0NiwgMHgwNiwgMHhGQSwgMHgwNiwgMHhGNCwgMHgwMCwgMHhGMiwgMHg4MCwgMHhGQywKKwkgMHg0MCwgMHg0NSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQywgMHg0NCwKKwkgMHgwRiwgMHgyNiwgMHgxMCwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NCwgMHgxRSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHg2RiwgMHgwMCwgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgyMiwgMHhGQSwKKwkgMHhBMywgMHg0NiwgMHg2QywgMHgwMiwgMHgyQSwgMHhGMCwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMiwgMHhBMywgMHg0NiwgMHgwMCwgMHhCQywgMHgwMCwgMHhGMiwKKwkgMHgwMSwgMHgwMiwgMHg2NCwgMHgwMCwgMHg0NCwgMHg0QywgMHgzRiwgMHhGMCwgMHg2MCwgMHg0MywgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgwOSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgzRiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHg1NywgMHgwNywgMHg4MCwgMHhGQywKKwkgMHgxQiwgMHhGMiwgMHgwNiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgxQiwgMHhGMCwgMHgwNiwgMHhGMCwgMHhDMSwgMHg4MSwKKwkgMHgwNiwgMHhGQSwgMHgwNSwgMHhGQSwgMHg5QiwgMHhGQSwgMHg2NSwgMHg0NCwgMHgzRiwgMHhGQSwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGQywgMHg2MywgMHg0NiwKKwkgMHgwMSwgMHhGMiwgMHgxMCwgMHg2MSwgMHhGMiwgMHhBNCwgMHgwMSwgMHhGQSwgMHhDOCwgMHg4MywgMHgwMiwgMHg2NCwgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOCwKKwkgMHhGRCwgMHgxRiwgMHgwNiwgMHg0NSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwKKwkgMHg3MCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwKKwkgMHg4MCwgMHhGQywgMHgwNSwgMHhGQSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwKKwkgMHgyQywgMHg0NCwgMHgwNCwgMHgyNywgMHgxNiwgMHgwMCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHg5RSwgMHhGQywgMHg2MCwgMHg0NiwgMHg0NiwgMHg0NiwKKwkgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgyQywgMHg0MywgMHgyQSwgMHhGQywgMHgwNiwgMHhGNCwKKwkgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwKKwkgMHgxRCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMCwKKwkgMHg5RSwgMHhGQywgMHgwMCwgMHg2MywgMHgzMywgMHg4NSwgMHhBMywgMHg0NiwgMHgwRCwgMHgwMywgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgwRiwgMHg2NSwKKwkgMHhBNCwgMHg4NSwgMHhENCwgMHg4NCwgMHgyMiwgMHhGQSwgMHhBMywgMHg0NiwgMHhBMiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHhDQiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg4OCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg1MCwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHg0RCwgMHgwMCwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhCNCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg0MiwgMHgwNiwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNSwgMHg2NSwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHgwMCwgMHg2NCwgMHhFOSwgMHg4MSwgMHhEOCwgMHg4NCwgMHhGRCwgMHgwMiwKKwkgMHhDOCwgMHg4NCwgMHg2MCwgMHg0MywgMHg0NCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNSwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhCNCwgMHhENCwgMHg4MCwgMHg2NCwgMHg0NCwgMHgwNiwgMHgwNiwgMHgwNywgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgxOSwgMHgwMCwgMHgwMCwgMHg2MSwgMHgyNywgMHhGMCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg2MSwgMHg0MywgMHg0NSwgMHhEMywKKwkgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhEQiwgMHg4MywgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwKKwkgMHhGMywgMHgwMiwgMHhDQiwgMHg4MywgMHg2MywgMHg0MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwNywgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGQSwgMHgyNiwgMHg0NiwgMHhBRiwgMHg4NCwgMHhFOCwgMHg4MSwgMHgwNSwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwKKwkgMHhDRCwgMHg4MSwgMHhFMCwgMHg4NCwgMHhGRCwgMHgwMiwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHgzMiwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHg1QywgMHgwMCwgMHgwMSwgMHgyQiwgMHgyRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyQywgMHgwMCwKKwkgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGNiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhFRSwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwKKwkgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywKKwkgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwNywgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwRiwgMHhCNCwgMHhEQywgMHg4NSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwgMHhGMiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwKKwkgMHgxMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwgMHgxMSwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDQywgMHg2MCwgMHgwNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNywgMHg2MCwgMHgzMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg1OCwgMHg2MywgMHg2MCwgMHg0NywgMHgwMSwgMHgyNywgMHg2NCwgMHg2MywgMHgyNSwgMHg2MCwgMHgyNiwgMHg2MiwKKwkgMHg2MSwgMHg1QywgMHhBMiwgMHhEOSwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHhGOCwgMHg4MywgMHhGQSwgMHg4MiwgMHhGOCwgMHhBNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHg1RSwgMHg2MywgMHgwNCwgMHgwMywgMHg2NCwgMHg2MywKKwkgMHgwMywgMHhCMCwgMHgwMiwgMHgzQSwgMHg2QywgMHg2MywgMHgzRiwgMHhGMiwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwKKwkgMHhCRCwgMHhEMCwgMHhBNiwgMHg0NiwgMHgwNywgMHhGOCwgMHg4NiwgMHhGQSwgMHg4NSwgMHhGOCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgyNSwgMHg2MCwKKwkgMHgyNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgyQywgMHhGMCwKKwkgMHgzMSwgMHg0MCwgMHgyMCwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgyMSwgMHgwMCwgMHgwOCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHg3RSwgMHhGMSwgMHhDQywgMHg2MCwgMHhDRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQywgMHg2MCwgMHhGRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHgxMiwgMHgwMCwgMHgzRiwgMHhGMCwgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwQSwgMHgwMCwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwKKwkgMHg0MCwgMHgyNywgMHgwNiwgMHgwMCwgMHhDRCwgMHg4MSwgMHhERCwgMHg4MSwgMHgwMywgMHgwMywgMHgwMiwgMHgwMywgMHgwMSwgMHg2MSwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgxOCwgMHgzQSwgMHgwMywgMHgwMCwgMHhDRCwgMHg2MCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMiwKKwkgMHg4OCwgMHhGMSwgMHg2NiwgMHg0NSwgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMywgMHgwMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHhEQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNywgMHgwMCwgMHhERCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhDQiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhEOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwNiwgMHg2NSwgMHhENCwgMHg4MCwgMHg2MCwgMHg0MywgMHg1MiwgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHg0QSwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHgwMCwgMHg2NCwgMHgwQiwgMHhGMCwgMHg0NiwgMHgwMiwgMHg2NCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGOCwgMHg3RiwgMHgwOCwgMHgwMiwgMHgwQywgMHhGMCwKKwkgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHgyMCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwQiwgMHgwMCwgMHhENCwgMHg4MCwKKwkgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NCwgMHgxMSwgMHgwMiwgMHgwQywgMHhGMCwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHg0MCwgMHg2NywKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2NSwgMHg0NCwgMHg4OCwgMHgzQSwgMHgyQywgMHgwMCwgMHg3NywgMHgzNywgMHgwMywgMHgwMCwgMHg3OCwgMHgzNywKKwkgMHgwMSwgMHgwMCwgMHg4RSwgMHgzNywgMHgwMCwgMHg2MSwgMHgyNSwgMHgwMCwgMHhENCwgMHg4MCwgMHgwOCwgMHg2NSwgMHgyMiwgMHgwMiwgMHhENywgMHg4MCwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwQywgMHhGMCwgMHgxRCwgMHgwNCwgMHhEMCwgMHg4MCwgMHgwRCwgMHhGMCwgMHgxQSwgMHgwMiwgMHgyNiwgMHg0NiwKKwkgMHgxNCwgMHhGMiwgMHgwMSwgMHg2MywgMHgwMiwgMHhBOCwgMHg2NCwgMHg0NywgMHgxNCwgMHgwMywgMHg3RiwgMHhCNCwgMHhGRCwgMHhBMCwgMHgwNiwgMHgwMywKKwkgMHgxMCwgMHgwNywgMHgyMywgMHhGMCwgMHg2MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2QSwgMHgwMCwgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwgMHhFNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMiwgMHgwMCwgMHg5OCwgMHhGMSwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg3QywgMHgwMCwgMHhERCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg0NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0OCwgMHgzNiwgMHg3MywgMHgwMCwKKwkgMHhDRCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHgzNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwQywgMHgyNiwgMHg2OSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg2NiwgMHgwMCwgMHhCMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg4MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QiwgMHgwMCwgMHgwMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhENCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhGMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NCwgMHgwMCwgMHgyMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhENCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0RCwgMHgwMCwgMHhDMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhEQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0NiwgMHgwMCwgMHhBMCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhEQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHgwMCwKKwkgMHg0MCwgMHgzQSwgMHgwRCwgMHgwMCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzOCwgMHgwMCwgMHg2MCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwNSwgMHgwMCwgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHgzMywgMHgwMCwKKwkgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgxOSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwRiwgMHgwMCwgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGMiwKKwkgMHgxMCwgMHhCRCwgMHhCNCwgMHg5QywgMHgzRiwgMHhGMiwgMHgyMywgMHhGOCwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywKKwkgMHgwOCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwQywgMHgwMCwgMHg2NiwgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMywgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDQiwgMHg2MCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNCwgMHhGMiwgMHgwMCwgMHg3QywgMHgzRSwgMHhGOCwgMHhDQywgMHg4NCwgMHhDQywgMHg4NCwgMHgxOSwgMHgwMywgMHg2MCwgMHgwMiwgMHgxMSwgMHhGMiwKKwkgMHgwNywgMHhGQSwgMHhBQywgMHhGMywgMHgxOSwgMHhGQSwgMHhDRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHhGMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHg3OSwgMHgwMCwgMHhBMiwgMHhGRiwKKwkgMHg0NiwgMHg0NSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMywgMHg3RSwgMHg2MywKKwkgMHg0NiwgMHg0QiwgMHgyNSwgMHg0NiwgMHhBMywgMHhEMCwgMHgyQiwgMHg0NiwgMHhBMywgMHhEOCwgMHhGQiwgMHgxRiwgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywKKwkgMHg4OCwgMHhGQywgMHgwNSwgMHgxOCwgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMCwgMHgxMCwgMHg2NywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgwOCwgMHhGRSwKKwkgMHgyQiwgMHg0NiwgMHg0NiwgMHg0NiwgMHgyNSwgMHg0NiwgMHhDRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg4RSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4OCwgMHhGMywgMHgwMCwgMHhBOCwgMHgwNywgMHhGQSwgMHgwRiwgMHgwMywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgwRSwgMHgwMCwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgyNiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhDMSwgMHhGRSwgMHgzMSwgMHgwMywgMHhEMiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhEMiwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgxOCwgMHgwMCwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxNSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHgwMywgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGMiwgMHgxMCwgMHhCRCwKKwkgMHhCNCwgMHg5QywgMHgzRiwgMHhGMiwgMHgyMywgMHhGOCwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHhGMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg4MiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NywKKwkgMHgwMiwgMHhCRiwgMHgyQSwgMHhGQSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgzMiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMywgMHhGMiwgMHgyRCwgMHhGQSwKKwkgMHgzNCwgMHhGMiwgMHgyRSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzMCwgMHhGMiwgMHgzMywgMHhGQSwgMHgzMSwgMHhGMiwgMHgzNCwgMHhGQSwKKwkgMHg2NywgMHhGMywgMHgyRiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMCwgMHhGQSwgMHg2OSwgMHhGMywgMHgzMSwgMHhGQSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhEMCwgMHg2MCwgMHg3QiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg2MiwgMHg2MywgMHgyMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRSwgMHg2MywgMHgxRiwgMHg2MCwgMHg2QywgMHg2MSwKKwkgMHgyMCwgMHg2MCwgMHgwQywgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxRiwgMHg2MCwgMHg4RSwgMHg2MywgMHgyMCwgMHg2MCwKKwkgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5MCwgMHg2MywgMHgyMCwgMHg2MCwgMHgzMCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5QSwgMHg2MywgMHgyMCwgMHg2MCwgMHgzQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg5QywgMHg2MywgMHgyMCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5RSwgMHg2MywgMHgyMCwgMHg2MCwKKwkgMHgzRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHhBMCwgMHg2MywgMHgyMCwgMHg2MCwgMHg0MCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MywgMHgyMCwgMHg2MCwgMHgzMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg5NCwgMHg2MywgMHgyMCwgMHg2MCwgMHgzNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHg5NiwgMHg2MywgMHgyMCwgMHg2MCwKKwkgMHgzNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhEQiwgMHgxRiwgMHg2MCwgMHhCNiwgMHg2MywgMHhCRCwgMHhEMSwgMHhDQiwgMHhGOSwgMHg2NywgMHhGOSwKKwkgMHhCRCwgMHhEMSwgMHhDQywgMHhGOSwgMHg2OCwgMHhGOSwgMHhBMywgMHhEMSwgMHhDRCwgMHhGOSwgMHg2OSwgMHhGOSwgMHgwMSwgMHg2NCwgMHg2QiwgMHhGQiwKKwkgMHgxRiwgMHg2MCwgMHhBOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhDNCwgMHhGQiwgMHgwMCwgMHg2MywgMHg0QSwgMHhGRCwgMHg1QSwgMHhGRCwgMHg2QywgMHhGRCwKKwkgMHg2RCwgMHhGRCwgMHgyMSwgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHg2MCwgMHhFNywgMHg2NSwKKwkgMHgzMiwgMHg0MSwgMHhBNSwgMHg4MSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgwQiwgMHgwMCwgMHgwOCwgMHg2NSwgMHhCNSwgMHg4MSwKKwkgMHgxRiwgMHg2MCwgMHg5NiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NSwKKwkgMHhCNSwgMHg4MSwgMHg0MSwgMHg1MiwgMHg4OCwgMHhGNSwgMHgzMiwgMHg0NCwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgyMSwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwKKwkgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMiwgMHg3QywgMHhGRiwgMHhBMCwgMHhGRCwgMHhBMCwKKwkgMHgwNSwgMHgwNiwgMHgwMywgMHgwMywgMHhGRSwgMHhBMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMiwgMHgzNiwgMHhGOCwgMHgwRSwgMHhGMCwgMHgwRiwgMHg2MCwKKwkgMHhBMiwgMHg2NSwgMHgyMCwgMHg2MCwgMHgzOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgwMywgMHhBOCwgMHgxMSwgMHgwNiwKKwkgMHg1RiwgMHhGMSwgMHgwNiwgMHgwMiwgMHg2NCwgMHg0NCwgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2NCwgMHg0NCwgMHhEMywgMHgwRCwgMHgwMCwKKwkgMHg2NCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwQSwgMHg2NCwgMHg0NCwgMHhEMywgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwgMHg0NCwgMHhEMywKKwkgMHgwNCwgMHgwMCwgMHhFOCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwRSwgMHhGQSwgMHgxRiwgMHg2MCwgMHg5RSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCNSwgMHg2NCwgMHg0MSwgMHgwMCwgMHhCOSwgMHhENCwgMHg4NCwgMHgwOCwgMHgyOCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgxMCwgMHg2MCwgMHgwQywgMHg2NSwKKwkgMHgwRCwgMHgwMywgMHgxMSwgMHg2MCwgMHhGOCwgMHg2MywgMHhDNSwgMHhGMywgMHhBMywgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhDNSwgMHhGOSwgMHg2NSwgMHhGOSwgMHhDNSwgMHhGMywgMHgwMSwgMHg2MSwKKwkgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHg5QSwgMHhGMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwOCwgMHgwMywgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwKKwkgMHgwMiwgMHgwMCwgMHhERiwgMHg4MywgMHhGQSwgMHgwMSwgMHhDNSwgMHhGRCwgMHg2NSwgMHhGRCwgMHgwQSwgMHg2NCwgMHgyNSwgMHg2MCwgMHgxRSwgMHg2MywKKwkgMHhBMywgMHhEQiwgMHgwMSwgMHg2NCwgMHgyNSwgMHg2MCwgMHgyMCwgMHg2MywgMHhBMywgMHhEQiwgMHhCNiwgMHhGMSwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwMSwgMHgwNiwgMHgwNiwgMHg2NCwgMHhCMCwgMHhGQiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHg2MCwgMHgwNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwOCwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwKKwkgMHgyRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMCwgMHg0NCwgMHgwMSwgMHg2NSwgMHgzNCwgMHg4MCwgMHgxRiwgMHg2MCwgMHhBNiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhDMywgMHhGQiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHgxQSwgMHg2MSwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHgwRSwgMHg2MSwgMHgwQywgMHgwMCwgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHhFQSwgMHg2MCwgMHhGNiwgMHg2MSwgMHgwMiwgMHgwMCwgMHhFQSwgMHg2MCwgMHhFQSwgMHg2MSwKKwkgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHg3OCwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwKKwkgMHgwMCwgMHg2NiwgMHhDNCwgMHhGMywgMHg2MCwgMHg0MSwgMHgwMCwgMHhBOCwgMHhGQSwgMHhBMSwgMHgwMSwgMHgwMywgMHhBMSwgMHhEQiwgMHgwMSwgMHg2MCwKKwkgMHg3QSwgMHg2MywgMHgxNiwgMHg2MCwgMHhDNCwgMHg2MSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhBMSwgMHhEQiwgMHhCRCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHg1OSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHg1OSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHg3NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgxNiwgMHg2MCwgMHhDMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHg5QywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NSwgMHhGMSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwOCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhCMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhFQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0RSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxMywgMHgxQiwgMHgxRiwgMHg2MCwgMHhBRSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhDNywgMHhGQiwgMHgxRiwgMHg2MCwgMHgxRSwgMHg2NSwgMHgxRiwgMHg2MCwgMHhCQywgMHg2MSwgMHgxRiwgMHg2MCwgMHgxQywgMHg2NCwKKwkgMHgyMCwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhBNSwgMHhEOSwgMHhEQSwgMHg4NSwgMHhGQiwgMHgxRiwgMHhEMCwgMHg2MCwgMHg2MiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHg0MCwgMHg2MywgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhDNCwgMHg4NSwgMHhDNywgMHg4MywgMHhGRSwgMHhBNSwKKwkgMHg4OSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDNCwgMHg4NCwgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MSwgMHhCRCwgMHhEMSwgMHgwMywgMHhGOCwKKwkgMHhCRCwgMHhEMSwgMHgwNCwgMHhGOCwgMHhBMywgMHhEMSwgMHgwNSwgMHhGOCwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHgwNiwgMHhGQSwKKwkgMHg1RiwgMHhGMywgMHg2MCwgMHhGQiwgMHg3MywgMHhGMCwgMHg2MywgMHhGOSwgMHg2NiwgMHg0MywgMHgyMSwgMHg2MCwgMHgyQywgMHg2MiwgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHhBMiwgMHhEMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHg4MCwgMHhCRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MywgMHg0NCwgMHg2MywgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwKKwkgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg1RiwgMHhGMywgMHg2MCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg1RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHg2MywgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg2MSwgMHhGQiwgMHg2RiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhDNSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhEOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg0RSwgMHhERiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwKKwkgMHgwRiwgMHg0RSwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RiwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg0RSwgMHhEQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg0RSwgMHhEQiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0MiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhENywgMHgwMSwgMHg0RSwgMHhGMywgMHg3RSwgMHhGNSwgMHg2MCwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwQSwgMHgwMCwKKwkgMHg4OSwgMHhGMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NCwgMHhDMCwgMHg4NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwKKwkgMHg3RSwgMHhGNSwgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg0RSwgMHhGMywgMHg2NiwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhGRiwgMHgyMiwgMHgzNywgMHgwMCwKKwkgMHhEMSwgMHg2MCwgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg2QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg2QSwgMHhGMywKKwkgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHg0RSwgMHhGMywgMHgwRiwgMHgwMywgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHg5RiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHhCMywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwNiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg0NCwgMHgwMSwgMHhCNSwgMHg1NCwgMHg4MCwgMHhEQSwgMHhGRSwgMHhCRSwgMHhGRSwgMHg4OCwgMHhGMSwKKwkgMHgwMiwgMHg2NCwgMHg4NywgMHhGMywgMHhDMCwgMHg4MywgMHg0MCwgMHg0OCwgMHg3NiwgMHhGRCwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHg0QywgMHg4OCwgMHg3NiwgMHhGMywgMHgwMiwgMHg2NSwgMHhDNCwgMHg4MywgMHhGNSwgMHgwMiwgMHhBMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHgxNCwgMHg2MCwgMHhEMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MywgMHgxMiwgMHg2MCwgMHhDQywgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwKKwkgMHhGRSwgMHgxRiwgMHg3RSwgMHhGMSwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2MSwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgzOSwgMHgwMCwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhBMCwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhBNiwgMHg2MSwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhBQywgMHg2MSwgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2MSwgMHhEMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwKKwkgMHhDNSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEMywgMHgwRSwgMHg1NywgMHgyNCwgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywKKwkgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQiwgMHgwMywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgxMywgMHgwMCwgMHgxMiwgMHgwMiwgMHhGMCwgMHgzNywKKwkgMHgwOSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwKKwkgMHhDQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwgMHhEOSwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEMywKKwkgMHgwRSwgMHg1NywgMHgxOSwgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQiwgMHgwMywgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwNywgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwgMHhFNCwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhCMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwKKwkgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHhDRCwgMHhGMywKKwkgMHgzMSwgMHhGQSwgMHg2NywgMHhGMywgMHgzMiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMywgMHhGQSwgMHg2OSwgMHhGMywgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHgwNiwgMHg2MywgMHgzRiwgMHhGQywgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwNywgMHhGMiwKKwkgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQywgMHgwMywgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhEMywgMHg2MCwgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHg2MCwgMHhCQSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHhGRiwgMHhBMCwgMHgwMCwgMHhBMCwgMHgxMywgMHgwMiwgMHhGRiwgMHhBMCwKKwkgMHgwNCwgMHgwMywgMHgwOCwgMHgwMywgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg1NSwgMHhGQiwgMHhEMSwgMHg2MCwKKwkgMHhFMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwRiwgMHgwMCwgMHg1NSwgMHhGRCwgMHhEMSwgMHg2MCwKKwkgMHhFMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwRSwgMHg2MywgMHgwMSwgMHhBNCwgMHgwQSwgMHhGQSwKKwkgMHgwQiwgMHhGQywgMHg0MywgMHg1OSwgMHhENCwgMHg2MCwgMHg5MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwKKwkgMHgwRCwgMHg2MywgMHgwMSwgMHhBNCwgMHgwQSwgMHhGQSwgMHgwQiwgMHhGQywgMHg0MywgMHg1OSwgMHhENCwgMHg2MCwgMHg5MywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4OCwgMHhGNSwgMHgwMCwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhBMCwgMHgyRSwgMHhGMCwgMHgzNywgMHgwMywgMHg2NiwgMHg0MSwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHg4OCwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwKKwkgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg4NywgMHhGMSwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhEQSwgMHg4MSwgMHhEMCwgMHg4MCwgMHhEQywgMHg5QywgMHgwNSwgMHgwNSwgMHhBMSwgMHhEMywgMHg0QSwgMHhEOSwgMHhBMCwgMHhERCwKKwkgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHhEMywgMHg2MCwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MiwgMHgxOCwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2NCwgMHgwNCwgMHhBNSwgMHhBMCwgMHhEMSwgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHg2NCwgMHg0MCwgMHhFMCwgMHgyMiwgMHgxRiwgMHhCNCwgMHg2NCwgMHg0MCwgMHhGOCwgMHgyMiwgMHgwNywgMHhCNCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwNCwKKwkgMHhEMCwgMHg4NCwgMHhEMCwgMHg4MCwgMHhGQywgMHgwMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwKKwkgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwKKwkgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwKKwkgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2NiwgMHg0MSwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHg4OCwgMHhGMSwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwKKwkgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwKKwkgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwKKwkgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHhEMywgMHg2MCwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGMSwgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwKKwkgMHhEMCwgMHg4NCwgMHhGQiwgMHgwMSwgMHhFMCwgMHg4MywgMHg4OCwgMHhGMywgMHgwMiwgMHhBMywgMHg0MywgMHg5MywgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwKKwkgMHg1NiwgMHhGRCwgMHgzNywgMHgwMywgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg2NiwgMHg0NSwKKwkgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHg4NSwgMHhGMiwgMHg2NSwgMHg0NiwgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwKKwkgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHgzMiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHgzMywgMHhGQSwgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGRiwgMHg2NywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHg2NSwgMHg0NiwgMHgwMiwgMHg2MywgMHgwMCwgMHg3RSwgMHgxMywgMHhGQSwgMHgzRiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHg4OCwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHg2NiwgMHg0MSwgMHgwMCwgMHhGNCwgMHgwNSwgMHg2NCwgMHgwOSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHg1NiwgMHhGMywgMHhBMywgMHhGRiwgMHg2MCwgMHg0MywgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg1NiwgMHhGMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg1OCwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg1NiwgMHhGMywgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwKKwkgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwKKwkgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2NiwgMHg0MSwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHg4OCwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwKKwkgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyQywgMHhGMiwgMHgyRCwgMHhGMCwgMHhBRSwgMHhGMiwKKwkgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwMywgMHhGQSwgMHgwNCwgMHhGOCwgMHg1NSwgMHhGMywgMHg4NSwgMHhGQSwgMHhGRiwgMHhBMCwgMHg2NSwgMHg0NiwKKwkgMHgwMywgMHgwMywgMHhENCwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGMywgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgxQiwgMHhGQSwKKwkgMHg2NSwgMHg0NiwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NCwgMHhDNCwgMHg4NSwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwgMHgwMCwgMHg2NCwgMHg4MCwgMHg2MywKKwkgMHhDNywgMHg4NSwgMHg5NCwgMHg4NCwgMHg1OSwgMHhEQiwgMHhGQywgMHgxRiwgMHgwMCwgMHg2MCwgMHg4OCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHg4MCwgMHg3RiwgMHgxMCwgMHg3RSwgMHgwQywgMHhGQSwgMHgxQSwgMHg2NSwKKwkgMHg4MCwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgwRiwgMHg0RSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRSwgMHg0RiwgMHhENCwgMHg2MCwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyMywgMHhGMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMywgMHgwMywgMHhENCwgMHg2MCwgMHg1MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhBMCwgMHgwMCwgMHhBMCwgMHgwQywgMHgwMywgMHgwMywgMHgwMywgMHhEMywgMHg2MCwgMHhDQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwKKwkgMHgyNiwgMHg0NiwgMHhGRiwgMHhBMCwgMHg4NywgMHhGNCwgMHgxMCwgMHgwMiwgMHhENCwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRCwgMHhBMCwgMHgwMiwgMHgwMywgMHgwNCwgMHgwMywgMHgwNiwgMHgwMCwgMHhENCwgMHg2MCwgMHgwQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg2MCwgMHgxNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwKKwkgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywKKwkgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwKKwkgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhEMSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwKKwkgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywKKwkgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwKKwkgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzMiwgMHg0NCwgMHgwOCwgMHhCMCwgMHg4NywgMHhGNCwKKwkgMHgwMywgMHgwMiwgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwKKwkgMHgyNiwgMHg0NiwgMHgwOCwgMHhCMCwgMHgwNywgMHhGMiwgMHgwMywgMHgwMiwgMHhEMSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHgxQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NCwgMHhDNCwgMHg4NSwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwgMHgwMCwgMHg2NCwKKwkgMHg4MCwgMHg2MywgMHhDNywgMHg4NSwgMHg5NCwgMHg4NCwgMHg1OSwgMHhEQiwgMHhGQywgMHgxRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MSwKKwkgMHg3RSwgMHg2NSwgMHgxOCwgMHg2MywgMHg1QiwgMHhEMiwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwgMHgxOCwgMHgwMiwKKwkgMHhGOSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MywgMHgwRSwgMHg2NSwgMHg1QiwgMHhEMiwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwKKwkgMHhENywgMHg4MCwgMHgwRSwgMHgwMiwgMHhGOSwgMHgwMiwgMHgyNiwgMHg0NiwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwKKwkgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHg1NywgMHgwMCwKKwkgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwKKwkgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwKKwkgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwKKwkgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwKKwkgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NCwgMHgwQSwgMHhGQSwKKwkgMHgwRiwgMHg2NCwgMHgwQiwgMHhGQSwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg1OCwgMHgyNiwgMHg0NiwgMHgyQywgMHhGMiwKKwkgMHhBMSwgMHhEQiwgMHgyRCwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyRSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHhGRiwgMHhBMCwgMHgwMCwgMHhBMCwgMHgwNiwgMHgwMiwKKwkgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwOSwgMHgwMywgMHhEMywgMHg2MCwgMHhDQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHg4QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwgMHg2NiwgMHg0MywKKwkgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEMywgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwKKwkgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQywgMHg3QywgMHgyQSwgMHhGMiwgMHhBNCwgMHhEQiwgMHgyMiwgMHg2MCwKKwkgMHgyQSwgMHg2MywgMHhGRiwgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg3QywgMHhBMywgMHhEQiwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgwMywgMHgwMCwgMHgwMiwgMHg2MSwgMHgwMCwgMHg2MCwgMHgzMCwgMHg3QywgMHg0MSwgMHg0NywgMHgyQSwgMHhGOCwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwKKwkgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwKKwkgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwgMHg2NywgMHhGMywgMHgzMiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMywgMHhGQSwgMHg2OSwgMHhGMywgMHgzNCwgMHhGQSwKKwkgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg3QywgMHgzRSwgMHhGOCwgMHgxQywgMHhGMCwgMHgxMywgMHhGOCwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhEOSwgMHg2MCwgMHhBMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0QiwKKwkgMHhBQiwgMHg0NiwgMHgwNiwgMHhGMiwgMHhBQiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhEOSwgMHg2MCwKKwkgMHhBMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg2MCwgMHgyQywgMHg2MywgMHgwOSwgMHhGMiwgMHhCRCwgMHhEQiwgMHg0MywgMHg0NCwgMHgxMCwgMHhCMCwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2MywgMHgwRCwgMHgwMywgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhGRSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNiwgMHgwMCwgMHhEQSwgMHg2MCwgMHgwMiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwMCwgMHg2MywgMHhBQiwgMHg0NiwgMHgwNiwgMHhGMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHg2MywgMHg0NSwgMHhCNCwgMHg4NCwgMHgwNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgwQSwgMHhGMCwgMHg1NiwgMHhGOSwgMHgyNCwgMHg0MywgMHhCRCwgMHhEOSwKKwkgMHg0MywgMHg0NCwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgxMCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQiwgMHgwOSwgMHhGQywgMHgyNywgMHg0NCwgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwMywgMHhENSwgMHg2MCwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MywgMHgwQiwgMHhGMCwKKwkgMHhBMCwgMHhEOSwgMHhCRCwgMHhEOSwgMHgwQywgMHhGMCwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEOSwgMHgwRCwgMHhGMCwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEOSwKKwkgMHg0MywgMHg0NCwgMHgxQywgMHg2NSwgMHgyRCwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHgwNCwgMHhBNSwgMHhDNSwgMHg4MSwKKwkgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhDRiwgMHg4MywKKwkgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwgMHg2MCwgMHhGQiwgMHhCOCwgMHhGMywgMHgyQiwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwKKwkgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg1RiwgMHhGMywgMHg2MCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg1RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHhCOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg2MSwgMHhGQiwgMHg2RiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHhENiwgMHg2MCwgMHg4MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2NSwgMHgyRCwgMHg2MSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHgwNCwgMHhBNSwgMHhDNSwgMHg4MSwgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywKKwkgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhDRiwgMHg4MywgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHhGQiwgMHhCOCwgMHhGMywgMHgyQiwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg1RiwgMHhGMywgMHg2MCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywKKwkgMHgwMiwgMHgwMiwgMHg1RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhCOCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg2MSwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwKKwkgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwKKwkgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwKKwkgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHgxNiwgMHg2NSwgMHgyNywgMHg0MCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHgxQywgMHg2NSwKKwkgMHhGNiwgMHhBNCwgMHgwMSwgMHgwMCwgMHhGQywgMHhBNCwgMHgyNCwgMHg0MywgMHgyMiwgMHg2MCwgMHg4MiwgMHg2MSwgMHg1RCwgMHg5MSwgMHg1MSwgMHg5MCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwgMHg2MCwgMHg0MSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwKKwkgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywKKwkgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgyMiwgMHg2MCwgMHgyOCwgMHg3QywgMHgwMywgMHgxRSwKKwkgMHg2MCwgMHhGRSwgMHhCRCwgMHhERiwgMHgyMCwgMHhGRSwgMHgyMiwgMHg2MCwgMHgyQywgMHg2NCwgMHg1MywgMHg5MywgMHhBNCwgMHhERCwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgxRiwgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMCwgMHhEMywgMHgwMCwgMHg2MywgMHgwMCwgMHhCOCwgMHgwQSwgMHhGQywgMHgwMywgMHgwMiwKKwkgMHhENywgMHg2MCwgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNywgMHg0MCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwRSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgyNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwMCwgMHgzNiwgMHgyMywgMHgwMCwgMHhFMCwgMHhBMCwKKwkgMHhEQSwgMHg4NSwgMHgyMCwgMHgwNywgMHgxRiwgMHg2MCwgMHgxRSwgMHg2MywgMHhBMywgMHhEMSwgMHg2NSwgMHg0MiwgMHhEMSwgMHg4MCwgMHgxRiwgMHg2MCwKKwkgMHgyMCwgMHg2MywgMHgxOCwgMHgwMiwgMHg1MCwgMHhGRSwgMHg2MSwgMHg0MCwgMHhGRSwgMHgyMiwgMHgwOCwgMHgwMCwgMHg2MiwgMHg0NSwgMHhCRCwgMHhEMywKKwkgMHhBNSwgMHhEMCwgMHhEQSwgMHg4MiwgMHhEMCwgMHg4MCwgMHhDOSwgMHg4MSwgMHhGNiwgMHgwQywgMHgwQywgMHgwMCwgMHg2MSwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgzMywgMHgwMCwgMHg2MiwgMHg0NSwgMHhBMywgMHhEMywgMHhBNSwgMHhEMCwgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwgMHhGRiwgMHgyNiwgMHgwMiwgMHgwMCwKKwkgMHhERSwgMHg4MiwgMHgyQSwgMHgwMCwgMHgwQywgMHg2MywgMHgwQSwgMHhGQywgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwQiwgMHhGQSwgMHgwMSwgMHg3RSwKKwkgMHgwQywgMHhGQSwgMHgyNiwgMHg0NiwgMHgwOCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwgMHg0MCwgMHg1OCwgMHgwNywgMHhGOCwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhEQSwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgyMSwgMHg2MCwgMHhFMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEOCwgMHg2MCwKKwkgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHhENywgMHgwMSwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwQywgMHgyMCwgMHgwRCwgMHgwMCwgMHhEOCwgMHg2MCwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgyOCwgMHg0NiwgMHgyQSwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MCwgMHhGRSwgMHg4MiwgMHg2NCwgMHhBMSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgxNSwgMHgwMCwgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwKKwkgMHgwNCwgMHhBMSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhERiwKKwkgMHgyQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg3RiwgMHg2MCwgMHhDRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHgyNywgMHg0MCwgMHgwMiwgMHgzQSwgMHg0MCwgMHgwMCwgMHg2MCwgMHg0MywgMHhGNiwgMHhBMywgMHgwMCwgMHg2MCwgMHgxQiwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHhERCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywKKwkgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwKKwkgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgzRiwgMHgwMCwgMHg2MCwgMHg0MywgMHhGQywgMHhBMywgMHgwMCwgMHg2MCwgMHgxNSwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHhERCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywKKwkgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwKKwkgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwOCwgMHgyNCwgMHhENywgMHgwMCwKKwkgMHg2MCwgMHhGRSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGQSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNSwgMHg1MCwgMHgwMSwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHg0QSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHg1MCwgMHgzQSwgMHg0NCwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwKKwkgMHgzRSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHgyMCwgMHgwMSwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHgxQSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxNCwgMHgwMSwgMHg2MCwgMHg1QywgMHgwMCwgMHgzNiwgMHgzMCwgMHgwMCwgMHgwMCwgMHg2NCwgMHhEOCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgyQiwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywgMHhERCwgMHg4MSwgMHhEOCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgyNCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywKKwkgMHhERCwgMHg4MSwgMHhEOCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxRCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGRCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxOSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyMCwgMHhGRSwgMHgyMSwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHgyMSwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgyMCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgyNiwKKwkgMHgwOSwgMHgwMCwgMHhENywgMHg2MCwgMHgwNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg3QywgMHgwNSwgMHgwMCwgMHgwNCwgMHg3QywgMHgwMywgMHgwMCwKKwkgMHgyMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMiwgMHg3QywgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMSwgMHhEOSwgMHgyMSwgMHg2MCwgMHhFNCwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGOCwgMHg2MSwgMHhBMSwgMHhEMywgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwMSwgMHgyNiwgMHgwRCwgMHgwMCwgMHhENywgMHg2MCwKKwkgMHgwNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg3QywgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyMiwgMHgwMywgMHgwMCwgMHhENywgMHg2MCwKKwkgMHgwNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMSwgMHg3QywgMHgyMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEOSwKKwkgMHgyMSwgMHg2MCwgMHhFNiwgMHg2MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwKKwkgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNywgMHgwMCwgMHhENywgMHg2MCwgMHgwNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg3QywgMHgwMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgyMCwgMHg3QywgMHgyMSwgMHg2MCwgMHhGMiwgMHg2MSwKKwkgMHhBMSwgMHhEOSwgMHgyMSwgMHg2MCwgMHhGQywgMHg2MSwgMHhBMSwgMHhEMSwgMHgyMSwgMHg2MCwgMHhGNCwgMHg2MSwgMHhBMSwgMHhEOSwgMHgyMSwgMHg2MCwKKwkgMHhGMiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgyMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhCMCwgMHg4NCwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHhCQywKKwkgMHhBQiwgMHg0NiwgMHgzNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgyMSwgMHg2MCwgMHhFRSwgMHg2MSwgMHhBMSwgMHhEMywgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHhCQywgMHg4OCwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHgzNiwgMHhGQSwgMHhGRiwgMHhGRiwgMHg2MSwgMHg0NiwgMHg1MCwgMHgwMCwgMHgyMSwgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHgwMywgMHgwMiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHgwMiwgMHhBNSwgMHg2NCwgMHg0NCwgMHhENCwgMHg5QywKKwkgMHgyMiwgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyMiwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhERiwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHgwMSwgMHg2NSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwMCwgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMiwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgwNCwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHgwNCwgMHgzNiwgMHgxMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyMCwgMHg2NSwgMHg2NSwgMHg1QywgMHgyMiwgMHg2MCwKKwkgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMiwgMHgyMiwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMiwgMHg2MCwKKwkgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBQiwgMHg0NiwgMHg4MiwgMHhGMCwgMHhDMCwgMHg2NywgMHhCNCwgMHg4NCwKKwkgMHhBQiwgMHg0NiwgMHgwQiwgMHhGQSwgMHgxRiwgMHg2MCwgMHhBMCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgyMiwgMHg2MCwgMHhENCwgMHg3QywgMHgwNCwgMHgxQiwKKwkgMHhGRiwgMHg2MCwgMHhGRiwgMHg2MywgMHhBNCwgMHhERCwgMHgyOSwgMHgwMCwgMHgyMywgMHg2MCwgMHgzQywgMHg2MywgMHhBNCwgMHhERCwgMHhEQiwgMHg4MywKKwkgMHg2MCwgMHhGRSwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2MCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgxRCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhDMywgMHhGMywKKwkgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMSwgMHg2MCwgMHg3OCwgMHg2NCwgMHgwNiwgMHg2MSwgMHg1OCwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHhGRSwgMHhCRCwgMHhEOSwgMHgyMCwgMHhGRSwgMHhDRCwgMHg4MSwgMHg2MSwgMHg0MCwgMHgwOCwgMHgyOCwgMHhGNywgMHgwMSwgMHhCNywgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NywgMHg2MCwgMHhGRSwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgyMCwgMHhGRSwgMHgxRiwgMHg2MCwgMHg5QywgMHg2NCwKKwkgMHhBMCwgMHhEMSwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEOSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyMiwgMHg2MCwgMHhEMiwgMHg2NCwgMHg0MCwgMHg0OCwKKwkgMHgxOCwgMHg2MSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgyQiwgMHg0NiwgMHg1NiwgMHhGMSwgMHgxNiwgMHg2MCwgMHhBQywgMHg2MSwgMHgxQiwgMHhGOCwKKwkgMHhBMSwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHgwNiwgMHhGMiwgMHgwQywgMHgwMywgMHgxMCwgMHhCQywgMHgwNiwgMHhGQSwKKwkgMHg4NywgMHhGMywgMHgwMCwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4NCwgMHgwNywgMHgwNywKKwkgMHhBMiwgMHhEQiwgMHgwNSwgMHgwMCwgMHgxMCwgMHhCNSwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhENCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgwNywgMHhGMiwKKwkgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMywgMHgyNiwgMHg0NiwKKwkgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHg0QywgMHgwMCwgMHgyNiwgMHg0NiwgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgxQSwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMiwgMHg2NCwgMHgzRiwgMHhGQSwKKwkgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwOSwgMHg2NCwgMHgwOSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0MywgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwKKwkgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQiwgMHg0NiwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHgwNiwgMHhGQSwgMHhBQiwgMHg0NiwgMHhBQiwgMHg0NiwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHgwMiwgMHhGMCwgMHg3MiwgMHhGMSwgMHhBMCwgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMiwgMHhGQSwgMHhBQiwgMHg0NiwgMHgwMSwgMHgwNiwgMHg3MiwgMHhGQiwKKwkgMHgyNywgMHg0MSwgMHgwMSwgMHhCMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgyQiwgMHg0NiwgMHgwQiwgMHg1OCwgMHgwMSwgMHg2NSwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgyQiwgMHg0NiwgMHgwQiwgMHg1OCwgMHgxNiwgMHg2MCwgMHhBMiwgMHg2NCwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwQiwgMHhGQSwgMHgwMSwgMHg3RSwKKwkgMHgwQywgMHhGQSwgMHgwQSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgwOCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwKKwkgMHg0MCwgMHg1OCwgMHgwNywgMHhGOCwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhGRiwgMHg2MCwgMHhGRCwgMHg2NSwKKwkgMHgzOCwgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBNCwgMHg4MywgMHgwNiwgMHhGQywgMHgwMiwgMHhCMCwgMHgyNiwgMHg0NiwgMHgxQywgMHgwMywKKwkgMHgzOCwgMHg0MywgMHg4NywgMHhGMSwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhEQSwgMHg4MSwgMHhEMCwgMHg4MCwgMHhEQywgMHg5QywKKwkgMHgwNSwgMHgwNSwgMHhBMSwgMHhEMywgMHg0QSwgMHhEOSwgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwKKwkgMHgyQywgMHhGMiwgMHhBMSwgMHhEQiwgMHgyRCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgyRSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgwMywgMHg2NSwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg0MCwgMHg0NywgMHgwNywgMHhGMiwgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwKKwkgMHgxQiwgMHgwMiwgMHgyNywgMHg0MywgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwKKwkgMHhBMSwgMHhEMSwgMHgxMSwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHhDOSwgMHg4MSwgMHhDOCwgMHg4NSwgMHhENSwgMHg4MCwKKwkgMHhBNSwgMHhEMywgMHgwOCwgMHgyOCwgMHhBMSwgMHhEQiwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBMiwgMHhEQiwgMHgwQywgMHgwMCwgMHgyNywgMHg0NCwgMHg0MCwgMHg1OCwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHg4NywgMHhGNCwgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwKKwkgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHg4OCwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0NywgMHgwNywgMHhGMiwKKwkgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHhFRCwgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHgyNywgMHg0MywKKwkgMHg4NywgMHhGMSwgMHgxNCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhEQSwgMHg4MSwgMHhEMCwgMHg4MCwgMHhEQywgMHg5QywgMHgwNSwgMHgwNSwKKwkgMHhBMSwgMHhEMywgMHg0QSwgMHhEOSwgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHgwNywgMHg1OCwgMHgwMywgMHg2NSwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg4NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwKKwkgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHg2NywgMHhGMywgMHgzMiwgMHhGQSwgMHg2OCwgMHhGMywgMHgzMywgMHhGQSwgMHg2OSwgMHhGMywgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMiwgMHg2MywgMHgzRiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwKKwkgMHgyQywgMHhGMiwgMHhBMSwgMHhEQiwgMHgyRCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgyRSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgwNiwgMHg2MywKKwkgMHgwNywgMHhGMiwgMHg4OCwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRCwgMHgwMiwgMHg0MywgMHg1OSwgMHgwMiwgMHg2NSwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHhGNCwKKwkgMHgwNiwgMHg2NCwgMHgwOSwgMHhGQSwgMHgxNSwgMHgwMCwgMHgwNywgMHhGMiwgMHg2NiwgMHg0NSwgMHg2MCwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2NSwgMHg0NiwKKwkgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMiwgMHgwNywgMHg2MywgMHg0MywgMHg1OSwgMHgwMSwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHhBMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwNywgMHg2NCwgMHgwOSwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHg4OCwgMHhGMywgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHhEQiwgMHg2MCwgMHhCMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQiwgMHg2MCwKKwkgMHg0RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1QSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg3MiwgMHhGMywKKwkgMHg4OCwgMHhGNSwgMHhEQywgMHg4MSwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwgMHhDRCwgMHg4MSwgMHgwNiwgMHhGMiwgMHhFRCwgMHgwMywKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHhGNywgMHgwMSwgMHgwQywgMHhBQywgMHgwNiwgMHhGQSwgMHg0NiwgMHg0OSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMCwgMHgwMywgMHgyNSwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHhBQiwgMHhGQywgMHg2NiwgMHg0NSwgMHgyOSwgMHg0NCwgMHgwNywgMHhGQSwgMHgyOSwgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHg4NSwgMHhGMiwKKwkgMHg2NSwgMHg0NiwgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHgzMiwgMHhGQSwgMHhDQywgMHhGMywKKwkgMHgzMCwgMHhGQSwgMHgzMywgMHhGQSwgMHhDRCwgMHhGMywgMHgzMSwgMHhGQSwgMHgzNCwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgxOCwgMHg2NywKKwkgMHgwRSwgMHhGQSwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwRSwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwMCwgMHg3RSwgMHgxMywgMHhGQSwgMHgwMiwgMHg2MywKKwkgMHgzRiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHg2NiwgMHg0MSwgMHgwMCwgMHhGNCwgMHgyNSwgMHg2MCwgMHgyOCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHg5RSwgMHgwMSwgMHg5MiwgMHgwMSwKKwkgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwKKwkgMHhBMSwgMHhEMSwgMHgwNCwgMHgwMywgMHhEMywgMHg4MCwgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHgwOSwgMHgwMCwgMHhBMSwgMHhERCwgMHgxNCwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhEOSwgMHg4NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NSwKKwkgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHg2MCwgMHgwMSwgMHg3QywgMHhBMCwgMHg5QywgMHgwNiwgMHhGOCwgMHg2NSwgMHg0NiwgMHg3MSwgMHhGMywKKwkgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg4MCwgMHgyQiwgMHg3MSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEQiwgMHg2MCwgMHhGNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3MSwgMHhGMywKKwkgMHg3MiwgMHhGMywgMHgwMCwgMHhBOCwgMHg2MCwgMHg4OCwgMHg1MCwgMHgwMywgMHhFMCwgMHg4MywgMHg2QywgMHgwMywgMHhDQiwgMHg4MywgMHg4OCwgMHhGMywKKwkgMHg3MywgMHhGMSwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0NywgMHg2NCwgMHg0NSwgMHgyNywgMHg0NiwgMHg3MiwgMHhGNCwgMHgxMiwgMHhGMiwgMHg0MCwgMHgxOCwKKwkgMHhENCwgMHg4MCwgMHgwMiwgMHg2NCwgMHgzRCwgMHgwNywgMHgyMywgMHhGQSwgMHgyQSwgMHhGMiwgMHgwRSwgMHhGMiwgMHgwQywgMHhCMCwgMHgwMiwgMHhGMCwKKwkgMHgwRCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhFNiwgMHgwMSwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywKKwkgMHgwOCwgMHgwMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwgMHhEQywgMHg4NCwKKwkgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMywgMHhGRiwgMHhDRSwgMHhGRSwgMHg5OCwgMHhGMSwgMHgxRSwgMHg2MCwKKwkgMHhFQywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCQywgMHgwMSwKKwkgMHgyNywgMHg0NCwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0NywgMHhCOCwgMHgxRiwgMHgyOCwgMHg0MywgMHhDQiwgMHg4MywgMHg4OCwgMHhGMywgMHgxQSwgMHgwRSwKKwkgMHgwMiwgMHhBNCwgMHg0MCwgMHg0QywgMHg0MywgMHg0OCwgMHgyQywgMHg0NiwgMHgxRSwgMHhGMiwgMHg3MywgMHhGMSwgMHhBQywgMHg4NiwgMHgxMiwgMHhGMiwKKwkgMHgwQywgMHgwMywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwNywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NiwgMHg5RSwgMHhGQywgMHgyQywgMHg0NCwgMHgwMiwgMHhBNCwgMHgyOCwgMHg0MywKKwkgMHg0MCwgMHg0QywgMHhFOCwgMHgxRiwgMHg3RCwgMHgwMSwgMHgwMSwgMHg2MywgMHg2NiwgMHhGMywgMHhBQywgMHhGMywgMHgwMCwgMHhCRCwgMHhBQywgMHg4MSwKKwkgMHgwNiwgMHgwMywgMHgwNSwgMHgwMywgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg1QiwgMHhGRCwKKwkgMHgzRSwgMHg2MywgMHgxNiwgMHg2MCwgMHg2MCwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg3MSwgMHhGQiwgMHg3MiwgMHhGQiwKKwkgMHgxNiwgMHg2MCwgMHhBOCwgMHg2NSwgMHgwMCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHgxQiwgMHhGMiwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NSwgMHg1QiwgMHhGMSwKKwkgMHhFMCwgMHg4NCwgMHg3MywgMHhGMSwgMHhDMCwgMHg4NCwgMHhDMCwgMHg4NCwgMHgxMiwgMHhGQSwgMHgyQywgMHhGMiwgMHg3MSwgMHhGMywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgzNiwgMHgwMCwgMHgwMCwgMHhBOCwgMHgxRiwgMHg2MCwgMHg4RSwgMHg2MiwgMHhBMiwgMHhEMywgMHgzNywgMHgwMywgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgzNCwgMHgwMywgMHhERSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2MSwgMHhBMiwgMHhGRiwgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMCwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwRCwgMHgwMCwgMHg5MiwgMHhGMywKKwkgMHg5MCwgMHhGMywgMHhEQywgMHg4MywgMHhEMSwgMHg4MCwgMHg5MiwgMHhGRCwgMHgwQywgMHgwMywgMHg4QywgMHhGMywgMHhDQywgMHg4MywgMHhEOCwgMHhBMCwKKwkgMHg5MCwgMHhGRCwgMHgwNywgMHgwNCwgMHhENCwgMHhGRSwgMHgwNSwgMHgwMCwgMHhEMSwgMHg4MCwgMHg5MywgMHhGMywgMHgwMiwgMHgwMywgMHhEQywgMHg4NCwKKwkgMHg5MywgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMywgMHhGRiwgMHhEQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwNiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHg0QywgMHgwMCwgMHg4MCwgMHg2NywKKwkgMHhCNCwgMHg4MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHgwQywgMHhCMCwgMHhBMiwgMHhGRiwgMHgxNywgMHgwMywgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwRCwgMHgwMCwgMHg5MCwgMHhGMywgMHg5MiwgMHhGMywgMHhDQywgMHg4MywgMHhEMSwgMHg4MCwgMHg5MCwgMHhGRCwKKwkgMHgwQywgMHgwMywgMHg4QywgMHhGMywgMHhEQywgMHg4MywgMHhEOCwgMHhBMCwgMHg5MiwgMHhGRCwgMHgwNywgMHgwNCwgMHhENCwgMHhGRSwgMHgwNSwgMHgwMCwKKwkgMHhEMSwgMHg4MCwgMHg5MywgMHhGMywgMHgwMiwgMHgwMywgMHhEQywgMHg4NCwgMHg5MywgMHhGQiwgMHgwNywgMHhGMCwgMHgwQSwgMHhGMiwgMHhBMywgMHhGRiwKKwkgMHg2NCwgMHg0NSwgMHgzMCwgMHgxQiwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwMiwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2MSwKKwkgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwKKwkgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMSwgMHg2MSwgMHg0NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNywgMHgwMCwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MSwgMHgyQSwgMHhGMiwgMHgzRSwgMHhGMiwgMHgwQywgMHhCMCwKKwkgMHgwMSwgMHhCMCwgMHgwNSwgMHgwMywgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MSwgMHgwMiwgMHgwMiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MSwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhEQywgMHg2MCwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHgyQiwgMHhGMiwgMHgyQSwgMHhGMiwKKwkgMHg2MCwgMHg0MSwgMHg0NCwgMHg0OSwgMHg2MCwgMHg0NSwgMHhBNCwgMHgzQSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0MCwgMHhDMCwgMHgzQiwgMHg3QiwgMHgwMCwKKwkgMHhBOSwgMHg0NiwgMHgwNiwgMHhGMiwgMHhBOSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyNiwgMHg3NSwgMHgwMCwgMHgyMCwgMHhCQywgMHhBOSwgMHg0NiwKKwkgMHgwNiwgMHhGQSwgMHhBOSwgMHg0NiwgMHhBOSwgMHg0NiwgMHgwNiwgMHhGMCwgMHhBOSwgMHg0NiwgMHg2NSwgMHg0MCwgMHgxMCwgMHgyQiwgMHg2RSwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgzNiwgMHgwMCwgMHg2NSwgMHg0MCwgMHhBNCwgMHgzQSwgMHg2NSwgMHgwMCwgMHgyOSwgMHg0NSwgMHg2NSwgMHg0NiwKKwkgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNCwgMHgwMiwgMHg3OCwgMHgwMCwgMHhERSwgMHg2MCwgMHg1MSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgwMCwgMHhBOCwgMHgyMCwgMHg2NywgMHgwMiwgMHgwMywgMHhCMCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgwRSwgMHhGMiwgMHgwMiwgMHhGMCwgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwOCwgMHgwMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwgMHhEQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgzRSwgMHhGMiwgMHhBMywgMHhGRiwgMHgwMSwgMHhCMCwKKwkgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MSwgMHgwMiwgMHgwMiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgxNywgMHgwMCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhERiwgMHg2NSwgMHhBNCwgMHg5RSwgMHhBOSwgMHg0NiwgMHgwNiwgMHhGQSwgMHhBOSwgMHg0NiwKKwkgMHhBMiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBOCwgMHg2MiwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyOSwgMHg0NCwgMHg1QSwgMHhEQiwgMHg3MSwgMHhGMywKKwkgMHhDMSwgMHhGRSwgMHhENCwgMHhGRSwgMHg4NywgMHhGMSwgMHhBMywgMHhGRiwgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwgMHgwMSwgMHgwNywgMHg3MSwgMHhGQiwKKwkgMHhBOSwgMHg0NiwgMHg3MiwgMHhGMiwgMHhBOSwgMHg0NiwgMHg2NSwgMHgxOCwgMHhBOSwgMHg0NiwgMHgwMiwgMHhGMCwgMHhBOSwgMHg0NiwgMHgwRiwgMHg2MCwKKwkgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwKKwkgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHhCMSwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHg2MCwgMHg2OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwKKwkgMHhGQSwgMHgwMSwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBOSwgMHg0NiwgMHgwNiwgMHhGQSwgMHhBOSwgMHg0NiwgMHg2NSwgMHg0MSwKKwkgMHg3MSwgMHhGMywgMHgyOSwgMHg0NSwgMHhDQywgMHg4NCwgMHg4MCwgMHgyQiwgMHg3MSwgMHhGQiwgMHg2NSwgMHg0NiwgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgzNywgMHgwMiwgMHg2MSwgMHg0MCwgMHhBNCwgMHgzQSwgMHhFNSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MSwgMHgwMywgMHgwMiwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg2NywgMHhGMSwgMHgzMiwgMHhGOCwKKwkgMHg2OCwgMHhGMSwgMHgzMywgMHhGOCwgMHg2OSwgMHhGMSwgMHgzNCwgMHhGOCwgMHhBOSwgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHg4NSwgMHhGMCwKKwkgMHhBOSwgMHg0NiwgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGOCwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGRiwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgyOSwgMHg0NCwgMHgwNywgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwKKwkgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgzNywgMHgwMCwgMHg4MCwgMHg2NywgMHhCNCwgMHg4MywgMHgyQSwgMHhGMiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NSwgMHgwQywgMHhCMCwKKwkgMHgwOSwgMHhGMCwgMHgwRCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg5RCwgMHgxOCwgMHg2NCwgMHg0NiwgMHgzRSwgMHhGMiwKKwkgMHhBMiwgMHhGRiwgMHgwMSwgMHhCMCwgMHgxQiwgMHg2MCwgMHhBMCwgMHg2MSwgMHgwMiwgMHgwMiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MSwgMHgwMiwgMHhGMiwKKwkgMHgwRSwgMHhGMCwgMHhENCwgMHg4MCwgMHgwOSwgMHhGNCwgMHgwNiwgMHgwMiwgMHg5MCwgMHhGMywgMHg2NCwgMHg0MCwgMHhGMCwgMHgzNywgMHgwMiwgMHgwMCwKKwkgMHhEQywgMHg4NCwgMHg5MCwgMHhGQiwgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHhGMSwgMHgwMiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhERCwgMHgwOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHhBOSwgMHg0NiwgMHgwMiwgMHhGMCwgMHhBOSwgMHg0NiwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwKKwkgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwKKwkgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMywgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHg0NSwgMHgzRiwgMHhGMiwgMHgwNSwgMHg0OCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0MSwKKwkgMHg2NiwgMHg0NCwgMHgwQiwgMHgwMywgMHgwRSwgMHhBMSwgMHgwMCwgMHhGMiwgMHg0MiwgMHhGRSwgMHhBQywgMHg4NiwgMHgwMSwgMHhGMiwgMHgxRiwgMHgwMywKKwkgMHg3RiwgMHhCNSwgMHhENSwgMHg4MSwgMHg2NiwgMHg0NCwgMHhGNywgMHgwNywgMHgyNSwgMHg0NiwgMHgwNSwgMHhGMCwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGQSwKKwkgMHhEMCwgMHg4MCwgMHg2NCwgMHg0MywgMHgxMywgMHgwMywgMHg2MCwgMHg0NiwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwKKwkgMHgwMCwgMHhGMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg0NCwgMHg0NSwgMHhBMiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgwOCwgMHg0NSwgMHgyNSwgMHg0NiwgMHgwMSwgMHg2NCwgMHgwMiwgMHhGQSwgMHgwMiwgMHhGRSwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgwNywgMHhGMCwgMHgxMCwgMHhCMCwgMHgxMCwgMHhBQywgMHgzQiwgMHgwMywgMHgyMywgMHhGQSwgMHg4MCwgMHg2NywKKwkgMHhCMCwgMHg4MSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHg2MSwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg0NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHgwMiwgMHhGMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2MSwKKwkgMHhBMSwgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFMSwgMHg4MiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwKKwkgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxNiwgMHg2MCwgMHg2MiwgMHg2NSwgMHg0NiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHhGMiwgMHgyNSwgMHg0NiwgMHhFMSwgMHg4MSwgMHg1QiwgMHhGMSwgMHg3MywgMHhGMSwgMHhDMSwgMHg4MSwKKwkgMHhDMSwgMHg4MSwgMHg5MiwgMHhGQSwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhEMSwgMHg4MCwgMHgwRSwgMHhGMiwKKwkgMHgwNSwgMHgwMiwgMHg5MCwgMHhGMywgMHgyMCwgMHhCMCwgMHhDQywgMHg4NCwgMHgwMSwgMHgwMiwgMHg5MCwgMHhGQiwgMHhBMywgMHhGRiwgMHg0OCwgMHhGRSwKKwkgMHgwNywgMHgwMCwgMHgwRSwgMHhGMiwgMHgwOCwgMHhGRSwgMHhGMCwgMHg3RiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHg1NywgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg4MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHg4OCwgMHhGMSwgMHgwNywgMHhGOCwgMHg2NywgMHg0NCwKKwkgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhFMSwgMHg2MCwgMHg5RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhFMCwgMHg2MCwgMHgwRCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhCMiwgMHg2MywgMHg2NSwgMHg0NCwKKwkgMHhCRCwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHhFNiwgMHg2MCwgMHg1QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg2NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NywgMHhGNSwKKwkgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg2NywgMHhGMSwgMHgzMiwgMHhGOCwKKwkgMHg2OCwgMHhGMSwgMHgzMywgMHhGOCwgMHg2OSwgMHhGMSwgMHgzNCwgMHhGOCwgMHgxRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2NCwKKwkgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQywgMHgzMiwgMHg0MCwgMHgxMCwgMHgyNiwgMHgxMCwgMHhCQywgMHgyMywgMHg2MCwgMHg0QywgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHg5MCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxRiwgMHg2MCwgMHgxRSwgMHg2NCwgMHgwMiwgMHgxOCwgMHgxRiwgMHg2MCwKKwkgMHg0MCwgMHg2NCwgMHgyMiwgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwgMHhCRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwKKwkgMHhDNiwgMHg2MSwgMHgyMCwgMHg2MCwgMHgzMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMiwgMHg2MCwgMHg4MiwgMHg2NSwgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwKKwkgMHgwMiwgMHgwNSwgMHg2NywgMHg0NCwgMHg5OSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgyMSwgMHg2MCwgMHhFQywgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHgyMSwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHhBNSwgMHhEMSwgMHgyMSwgMHg2MCwKKwkgMHhFMiwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHgyMSwgMHg2MCwgMHhDMCwgMHg2MSwgMHhERCwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMSwgMHhEQiwKKwkgMHgwNiwgMHhBMSwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMSwgMHg2MCwgMHhFMiwgMHg2MiwgMHg2MCwgMHg0MCwgMHhGRCwgMHhBMCwKKwkgMHhBMiwgMHhEMywgMHg3NCwgMHgwMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHhGMiwgMHg2MywgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMSwgMHg2MCwgMHhFNCwgMHg2MiwgMHhGRSwgMHhBMCwKKwkgMHhBMiwgMHhEMywgMHg1NCwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwKKwkgMHg1OSwgMHhERCwgMHhENSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHgyMSwgMHg2MCwgMHhFNiwgMHg2MiwgMHhGRiwgMHhBMCwgMHhBMiwgMHhEMywgMHgyMSwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwKKwkgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwKKwkgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwKKwkgMHgwNCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHhENSwgMHg4MywgMHhFQiwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyMSwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg1OSwgMHhEOSwgMHgyMSwgMHg2MCwgMHhDMCwgMHg2NSwKKwkgMHhENSwgMHg4NCwgMHhERCwgMHg3RiwgMHhBNSwgMHhEQiwgMHg2NSwgMHg0NCwgMHgyMiwgMHg2MCwgMHhBQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwKKwkgMHhDOCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg1NywgMHhGNSwgMHhDQiwgMHhGMywgMHhDQywgMHhGMSwgMHgwMCwgMHg2MywgMHhDMCwgMHg4NywgMHhDRCwgMHhGMSwKKwkgMHg1QSwgMHhGRCwgMHhDMCwgMHg4NSwgMHg2NSwgMHg0NywgMHhDNCwgMHg4NCwgMHgwNywgMHhCNSwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxNiwgMHg2MCwKKwkgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwKKwkgMHgxNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1NywgMHhGNSwgMHgwMCwgMHg2NCwgMHg5NSwgMHhGQiwgMHg5NiwgMHhGQiwgMHg5NywgMHhGQiwKKwkgMHg3NSwgMHhGQiwgMHg2NiwgMHhGMywgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhDNywgMHhGMywKKwkgMHhFRCwgMHhFMiwgMHhDQywgMHg4NCwgMHg1QSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFMCwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGMSwgMHgyMywgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyMiwgMHg2MCwgMHhBQSwgMHg2NSwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhBOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NywgMHhGNSwgMHgwMCwgMHhGNCwgMHg2NiwgMHhGMSwgMHgwNiwgMHhGOCwKKwkgMHgyMywgMHg2MCwgMHg0QywgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwgMHgyMiwgMHg2MCwgMHhBMiwgMHg2NCwgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NywgMHhGNSwgMHgzRiwgMHhGQywKKwkgMHg1QSwgMHhGMywgMHhDNywgMHhGMSwgMHhBQywgMHg4MywgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMiwgMHg2QywgMHhGQiwgMHg2NCwgMHg0MywgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRiwgMHg4MywgMHg3MywgMHhGMywgMHg1QSwgMHhGRCwgMHhEQywgMHg4NCwgMHg3MywgMHhGQiwKKwkgMHg1QywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHg1QywgMHhGQiwgMHgwMywgMHgwMywgMHhFMSwgMHg2MCwgMHgwQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHg2NCwgMHg1QywgMHhGQiwgMHhBMiwgMHg0QywgMHgyMCwgMHgyNywgMHhGOCwgMHgwMSwgMHg0NiwgMHg2MCwgMHg1MCwgMHg2NSwgMHg3MiwgMHg0NCwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwNCwgMHg1RCwgMHhGQiwgMHg0MCwgMHg0OCwgMHg5NSwgMHhGMywgMHg1RSwgMHhGQiwgMHg0MCwgMHg0QSwKKwkgMHg5NiwgMHhGMywgMHg5NywgMHhGMywgMHg0MCwgMHg0QywgMHg2MCwgMHg0MSwgMHg2NiwgMHhGMSwgMHg0MCwgMHg2MywgMHhBRCwgMHg4MCwgMHhGMCwgMHhBMywKKwkgMHgwOSwgMHgwMiwgMHgzQywgMHgwMywgMHgyQywgMHg0MSwgMHgyQSwgMHg0NCwgMHg0MCwgMHg0QywgMHgyOCwgMHg0NCwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHhGNCwgMHgwMSwgMHhEMSwgMHg4MCwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNCwgMHgxMCwgMHhBMywgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhBNSwgMHg4MCwgMHhDRiwgMHg4MywgMHgwOCwgMHgwMiwgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwgMHg3MCwgMHg4QSwgMHgyQywgMHg0NCwKKwkgMHg3MCwgMHg4QywgMHhGMSwgMHg4MSwgMHhGNSwgMHgwMSwgMHhFNywgMHhBMywgMHg2NCwgMHg0NCwgMHgwMCwgMHhBMCwgMHgwMCwgMHg2MiwgMHgwMiwgMHgwMiwKKwkgMHgwMCwgMHg2MSwgMHgxQywgMHgwMCwgMHhFMCwgMHg4NCwgMHhERSwgMHg4MiwgMHhGRCwgMHgwNCwgMHg0MiwgMHhGRSwgMHhGOCwgMHg4NCwgMHg2MiwgMHg0NSwKKwkgMHhDNywgMHg4MywgMHg2MCwgMHg0NSwgMHgwMiwgMHhGRSwgMHhENSwgMHg4NCwgMHgwMiwgMHgwNSwgMHgwMSwgMHgwNSwgMHg2MSwgMHg0NCwgMHhDRiwgMHg4MywKKwkgMHg2MCwgMHg0MSwgMHgwOCwgMHgwMywgMHgyOCwgMHg0NCwgMHg2MCwgMHg4OCwgMHgyQSwgMHg0NCwgMHg3MCwgMHg4QSwgMHgyQywgMHg0NCwgMHg3MCwgMHg4QywKKwkgMHhGMSwgMHg4MSwgMHhGMSwgMHgwMSwgMHhDRSwgMHg4MiwgMHhFOSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhGMSwgMHg4MSwgMHg2MSwgMHg0NCwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMywgMHg3MywgMHg0MCwgMHg1RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHg1RSwgMHhGMywgMHgzRiwgMHhCNSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhCNCwgMHg4NCwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwKKwkgMHg2NCwgMHg0NCwgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHg2MSwgMHg0NCwgMHhENCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywgMHg2MCwgMHg1MywgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg3NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHgwMSwgMHhCNCwgMHg3NSwgMHhGQiwgMHgxRiwgMHg2MCwgMHgxNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhFNiwgMHg2MCwgMHhBMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgxQywgMHgwMCwKKwkgMHg2MCwgMHg0MywgMHgwMCwgMHgzNiwgMHgxQywgMHgwMCwgMHhFMCwgMHhBMCwgMHhEQSwgMHg4NSwgMHgxNiwgMHgwNywgMHgxRiwgMHg2MCwgMHgxRSwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHhDQiwgMHg4MywgMHgwRiwgMHgwMiwgMHgwNywgMHgwRSwgMHg1OSwgMHhEMywgMHhBNSwgMHhEMCwKKwkgMHhEQSwgMHg4NSwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHhGOSwgMHgxRiwgMHgxMywgMHgxRSwgMHhBNSwgMHhEMCwgMHg1OSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwgMHhGRiwgMHgyMiwgMHgwRCwgMHgwMCwgMHhFMSwgMHg2MCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg5MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgxRiwgMHg2MCwgMHg0MCwgMHg2NCwKKwkgMHgwMiwgMHgwMCwgMHgxRiwgMHg2MCwgMHgxRSwgMHg2NCwgMHgyMiwgMHg2MCwgMHhCRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwKKwkgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwKKwkgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg2NywgMHhGMSwgMHgzMiwgMHhGOCwgMHg2OCwgMHhGMSwgMHgzMywgMHhGOCwgMHg2OSwgMHhGMSwKKwkgMHgzNCwgMHhGOCwgMHg1MCwgMHg2MywgMHgyQSwgMHhGQywgMHhBQywgMHhGMywgMHgxOSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHg4OCwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHg2NiwgMHhGMSwgMHgwNiwgMHhGOCwgMHgyMywgMHg2MCwgMHg0QywgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwKKwkgMHgyMiwgMHg2MCwgMHhDNiwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg2MCwgMHhCRSwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhFMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwKKwkgMHgxMSwgMHgwMCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMCwgMHg2NCwgMHg5NSwgMHhGQiwgMHg5NiwgMHhGQiwgMHg5NywgMHhGQiwgMHg3NSwgMHhGQiwKKwkgMHg2NiwgMHhGMywgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhDNywgMHhGMywgMHhFRCwgMHhFMiwKKwkgMHhDQywgMHg4NCwgMHg1QSwgMHhGQiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg3MywgMHhGQiwgMHg3NSwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgzRSwgMHg2MywgMHgxNiwgMHg2MCwgMHg2MCwgMHg2MSwgMHg1OSwgMHhEMSwgMHg2MSwgMHg0NiwgMHgwOCwgMHgxQiwgMHhGQywgMHgxRiwgMHgyMiwgMHg2MCwKKwkgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NSwgMHgwMCwgMHg2MSwgMHgxNywgMHgwMCwgMHgxNiwgMHg2MCwgMHhBMiwgMHg2MSwKKwkgMHg0OSwgMHhEMSwgMHhDQiwgMHg4MywgMHhGRCwgMHgxOCwgMHg2MywgMHg0MSwgMHgwNCwgMHhBMSwgMHg2MSwgMHg0NSwgMHg2NiwgMHg0MywgMHgyMiwgMHg2MCwKKwkgMHhERSwgMHg2NCwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERiwgMHg4MywgMHhBMCwgMHhEOSwgMHhDRCwgMHg4MSwgMHgyMCwgMHhGRSwKKwkgMHhGOCwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxNiwgMHg2MCwgMHg2MiwgMHg3QywgMHhEMCwgMHg4MSwgMHg1QSwgMHhGMywgMHhDNywgMHhGMSwgMHgyMiwgMHg2MCwKKwkgMHhEQywgMHg2MywgMHgwMCwgMHhBMCwgMHg2NCwgMHg1RiwgMHhCRCwgMHhEQiwgMHgxQiwgMHg2MCwgMHg5NCwgMHg2NiwgMHhBNiwgMHhEMSwgMHgwMiwgMHgwMiwKKwkgMHgwMSwgMHgxOCwgMHgwMSwgMHhCOSwgMHg2MSwgMHg0NCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEQiwgMHhGQywgMHhBMywgMHg2NSwgMHg0NCwgMHgwMywgMHhBNCwKKwkgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHhDRCwgMHg4MSwgMHgyOCwgMHhEMywgMHg1QSwgMHg4OCwgMHhEQywgMHg4MywgMHgzOSwgMHgxOCwgMHhGQiwgMHgwMywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwKKwkgMHgwNywgMHgwMCwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwKKwkgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEOCwgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwKKwkgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhERCwgMHg4MSwgMHhBMSwgMHhEQSwgMHhGRiwgMHhCNCwgMHgwMCwgMHg3RiwgMHgxNSwgMHgwMywgMHhEQiwgMHg4MywKKwkgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwQiwgMHgwMCwgMHgyMCwgMHhGRSwgMHg2MCwgMHg0NSwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERiwgMHg4MywKKwkgMHhERCwgMHg4MSwgMHhDQywgMHg4NCwgMHhBMSwgMHhEOCwgMHhFQywgMHgwMiwgMHgyMCwgMHhGRSwgMHhDMywgMHgwMSwgMHgyMywgMHg2MCwgMHg0RSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRCwgMHhBMSwgMHhGRiwgMHhCMSwgMHhDMSwgMHg4MywgMHhBMiwgMHhERCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NywgMHg1QywKKwkgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHhBMSwgMHhEMywgMHhBNSwgMHhEOSwgMHgxMiwgMHgxOCwgMHg2MCwgMHg0MywgMHgyMywgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBNSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhBMCwgMHhERCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhEQywgMHg4NCwgMHhDRiwgMHg4MywgMHhFMywgMHg4MywKKwkgMHg1OSwgMHhEMSwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEOSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhGOSwgMHgxRiwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwRCwgMHgwMCwgMHgxMiwgMHg2MCwgMHhCOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg1MCwgMHhGMywKKwkgMHgyMywgMHg2MCwgMHgzOSwgMHg2MywgMHg2MCwgMHhGRSwgMHhBMywgMHhEOSwgMHhERiwgMHg4MywgMHg2MCwgMHg0NywgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyNSwgMHgwMCwgMHg0NSwgMHg0OCwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHgwMywgMHhGMiwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMCwgMHg2MCwgMHg0OCwgMHg2MSwgMHgyOCwgMHg0NCwgMHg1OSwgMHhEQSwgMHgwMywgMHg2NCwgMHgzOCwgMHg0MywKKwkgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgzOSwgMHg0NCwgMHg1OSwgMHhEQSwgMHgwNiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHg1MSwgMHgwMCwgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHg2OCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0OSwgMHgwMywgMHhGMiwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0NiwgMHg0QSwKKwkgMHgzOCwgMHg0NCwgMHg1NCwgMHg5NCwgMHgwMywgMHg2NCwgMHgwMSwgMHgwMiwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2MywgMHg0QSwgMHg2MSwgMHgzOCwgMHg0NiwKKwkgMHhCRCwgMHhEMCwgMHhDQywgMHg4NCwgMHgyQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhEQSwgMHg4MSwgMHgzOCwgMHg0MywKKwkgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgwNSwgMHg2MywgMHgyOCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgyNSwgMHhGQSwKKwkgMHgwNywgMHgwMiwgMHgwMywgMHg2NCwgMHgzOSwgMHg0MywgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgwOCwgMHg2MywKKwkgMHgyMiwgMHg2MCwgMHgyOCwgMHg3QywgMHgyOCwgMHg0NCwgMHgwMywgMHhBOCwgMHhBNCwgMHhEMywgMHgwRiwgMHgwMywgMHhFOCwgMHg4NSwgMHhDNywgMHg4NSwKKwkgMHg2MCwgMHg0MywgMHhGRSwgMHhBMywgMHgyMiwgMHg2MCwgMHgyQSwgMHg2NCwgMHg1OCwgMHhEMSwgMHhEOSwgMHg4MSwgMHhBMSwgMHhEOCwgMHg3RSwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MSwgMHhGOCwgMHgxRiwgMHg2NSwgMHg0MywgMHgyQSwgMHg0NiwgMHgyMywgMHhGQywgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHgxQywgMHgwMCwgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNCwgMHgwMywgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgyOCwgMHg0NCwgMHg1QSwgMHhEQSwKKwkgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwKKwkgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgzRSwgMHgwMCwgMHg3QywgMHhGMywgMHg2NywgMHg0MywgMHhEQywgMHg4NCwgMHhDQywgMHg4NCwgMHgzOSwgMHgwMywKKwkgMHg2MCwgMHg0NiwgMHgwQSwgMHgwMiwgMHg3QywgMHhGRCwgMHgwMCwgMHg2MCwgMHg0NiwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg3QywgMHhGQiwgMHgyRSwgMHgwMywgMHg0NiwgMHg0QiwgMHgxRSwgMHg2MCwgMHhEOCwgMHg2MSwgMHgxOCwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNCwgMHhGQSwgMHg0QSwgMHg2NSwgMHhBMiwgMHhGRiwgMHgyQywgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHg1OSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHhGNywgMHgxRiwgMHgxMiwgMHg2MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyQiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhBNiwgMHhGRSwgMHgwMCwgMHg2NCwKKwkgMHg3QywgMHhGQiwgMHhBMywgMHhGRiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGRSwgMHhCOCwgMHgwNSwgMHhBNywgMHhGRSwKKwkgMHgwQSwgMHgwNSwgMHhBNSwgMHhGRSwgMHgwMywgMHgwNCwgMHhFMywgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRSwgMHhGMiwgMHgwNCwKKwkgMHhFNCwgMHg2MCwgMHg2OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NSwgMHgxNywgMHg2MCwgMHg1MiwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywgMHg3RSwgMHhGMSwgMHg2MCwgMHg0NywgMHgwNywgMHhCNCwgMHg0RSwgMHhGQiwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywKKwkgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg5RCwgMHg4NCwgMHhBMSwgMHg4MCwgMHhBMCwgMHg4MywgMHgxQSwgMHgwMywgMHg3RSwgMHhGRCwKKwkgMHgwRiwgMHg2MCwgMHhGNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg3RSwgMHhGMSwgMHgzMSwgMHg0NCwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwOSwgMHgwMCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMSwgMHg3QywKKwkgMHhCQywgMHhGOSwgMHg0OSwgMHhGMywgMHgwMSwgMHg2MywgMHg2MCwgMHg0MCwgMHhGRiwgMHgyNiwgMHg0OSwgMHhGRCwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFMywgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhCNiwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHg2QiwgMHhGQiwgMHgzMSwgMHg0NCwgMHhGRSwgMHhCNCwKKwkgMHg0MCwgMHg1MSwgMHgwRCwgMHg2NCwgMHgwNSwgMHhGQiwgMHgzRiwgMHgwMCwgMHgyOCwgMHhGMywgMHg3RSwgMHhGMSwgMHg2MCwgMHg0NywgMHg2NCwgMHg0MSwKKwkgMHgwNywgMHhCMSwgMHgwNywgMHhCNCwgMHgwOCwgMHgyNCwgMHg2NywgMHg0QywgMHg0RSwgMHhGQiwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwKKwkgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhBMSwgMHg4MCwgMHhCMSwgMHg4MywgMHgyRSwgMHgwMiwgMHg3RSwgMHhGRCwgMHgxRiwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhDNSwgMHhGQiwgMHg2NSwgMHhGQiwgMHg3RSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NSwgMHhBNCwgMHg4MCwgMHg3RSwgMHhGQiwKKwkgMHgxNywgMHgwMiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwKKwkgMHgzMSwgMHg0NCwgMHgwMSwgMHhCQywgMHg0MCwgMHg1MSwgMHhFRCwgMHhFMiwgMHgwRiwgMHg0RSwgMHhDRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwMSwgMHg2NSwgMHhFMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMCwKKwkgMHgwRiwgMHg2MCwgMHhENiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHhFNSwgMHg2MCwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHhGRSwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHhGNSwKKwkgMHgyNywgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyOCwgMHgwMiwgMHgxNCwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhEQSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhENSwgMHg4MCwgMHhBMSwgMHhEMSwgMHgwNCwgMHgwMywgMHhEMywgMHg4MCwKKwkgMHhEOSwgMHg4MSwgMHhGQSwgMHgwMiwgMHgwOSwgMHgwMCwgMHhBMSwgMHhERCwgMHgxNCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhEOSwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg0QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NSwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHg2MCwKKwkgMHgwMSwgMHg3QywgMHhBMCwgMHg5QywgMHgwNiwgMHhGOCwgMHg2NSwgMHg0NiwgMHg3MSwgMHhGMywgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhDQywgMHg4NCwgMHg4MCwgMHgyQiwgMHg3MSwgMHhGQiwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBQiwgMHgwMSwKKwkgMHgyRSwgMHhGNSwgMHgyNSwgMHg2MCwgMHgyOCwgMHg2MSwgMHgyOCwgMHhGMCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEOSwgMHgyNywgMHhGMiwgMHgxMiwgMHg2MCwKKwkgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywKKwkgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwKKwkgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgxMywgMHgwMiwgMHg2MywgMHg0NiwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhCMCwgMHgwOCwgMHhCQywgMHgwRCwgMHgwMywgMHgwNiwgMHhGQSwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg2QSwgMHgwMSwgMHg3RSwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MSwgMHgwNywgMHhCMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHg2NywgMHg0QywKKwkgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwgMHgxRiwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhDNSwgMHhGQiwgMHg2NSwgMHhGQiwgMHgxRiwgMHg2MCwgMHhCNiwgMHg2MywgMHhCRCwgMHhEMSwgMHhDQiwgMHhGOSwKKwkgMHg2NywgMHhGOSwgMHhCRCwgMHhEMSwgMHhDQywgMHhGOSwgMHg2OCwgMHhGOSwgMHhBMywgMHhEMSwgMHhDRCwgMHhGOSwgMHg2OSwgMHhGOSwgMHgwMSwgMHg2NCwKKwkgMHg2QiwgMHhGQiwgMHgzMSwgMHg0NCwgMHgyMSwgMHhCQywgMHg0MCwgMHg1MSwgMHgyMCwgMHg0NCwgMHgwMSwgMHg2NSwgMHgzNCwgMHg4MCwgMHgwMSwgMHg2NCwKKwkgMHg1MSwgMHhGQiwgMHgyMSwgMHg2MCwgMHg1MCwgMHg2NCwgMHg1MiwgMHhGQiwgMHgwRiwgMHg0RSwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHg2MywgMHg0NiwgMHg0MywgMHg0NywKKwkgMHgxRSwgMHhGMiwgMHg3MiwgMHhGMiwgMHgwMiwgMHgxQiwgMHgwMSwgMHgxQiwgMHgwQywgMHgwMCwgMHg2MCwgMHg0NiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NiwgMHg3MiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGNCwgMHgxQiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHg2MCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg1QiwgMHgwMywgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHg0OCwgMHgwMCwgMHhGRiwgMHgzNywgMHgzRCwgMHgwMCwKKwkgMHhGRCwgMHgzNywgMHgzNSwgMHgwMCwgMHgxOCwgMHgzNywgMHgyOSwgMHgwMCwgMHhGRSwgMHgzNywgMHgyQywgMHgwMCwgMHhGOCwgMHgzNywgMHgwQSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHg0NiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhENiwgMHgwMSwgMHgwNiwgMHhCNCwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHhDNiwgMHgwMSwgMHhEQiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQywgMHgwMywgMHgyMywgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHhFMiwgMHgxQiwgMHgwMiwgMHgyNiwgMHhFMCwgMHgxOCwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg5MCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNSwgMHgwMSwgMHhBQywgMHhGRSwgMHgwOSwgMHgwNSwKKwkgMHhBRCwgMHhGRSwgMHgxMCwgMHgwNSwgMHhBRSwgMHhGRSwgMHg5RiwgMHgwNSwgMHhBRiwgMHhGRSwgMHgzQSwgMHgwNSwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhGNCwgMHgwMSwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2NSwgMHgwMywgMHg2MSwgMHgwNywgMHgwMCwgMHhBMiwgMHhERCwgMHg1OCwgMHg0RiwKKwkgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgwMCwgMHg2MywgMHhBNSwgMHhEMSwgMHg1QSwgMHhEMywKKwkgMHhEQSwgMHg4NSwgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHhGMiwgMHgwMiwgMHhGOCwgMHgwMiwgMHhFMCwgMHgwMSwgMHgwRiwgMHg2MCwgMHhDQywgMHg2MiwKKwkgMHgwRiwgMHg2MCwgMHhGMiwgMHg2NSwgMHhFNSwgMHg2MCwgMHg0RSwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMywgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHg1QSwgMHhERCwgMHhGOSwgMHgwMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg1QSwgMHhERCwgMHhGQiwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2NCwgMHg0MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgwNiwgMHg2MSwgMHgwOCwgMHgwMywgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHhGOSwgMHgwMiwgMHgwRiwgMHg2MCwgMHhGNCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwNywgMHg2MSwKKwkgMHgxOSwgMHgwMywgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMywgMHhDRCwgMHg4MSwgMHhFOCwgMHg4NCwgMHhFMywgMHgwMywKKwkgMHgwMiwgMHgwNSwgMHhFMSwgMHgwMywgMHhGOSwgMHgwMSwgMHg3OCwgMHhGQiwgMHg3QSwgMHhGRCwgMHg2MSwgMHg1QywgMHhBMywgMHhEMywgMHg3OSwgMHhGOSwKKwkgMHgwMywgMHgxOCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3QSwgMHhGMywgMHg3OSwgMHhGMSwgMHg2MCwgMHg0MywgMHg3OCwgMHhGMywKKwkgMHg2NCwgMHg0MSwgMHhFQSwgMHgwMSwgMHgyMSwgMHg0MywgMHgwRiwgMHg2MCwgMHhGNCwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMywKKwkgMHgwMywgMHgwMiwgMHhDNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhCRCwgMHhEMSwgMHg0MywgMHg0MSwgMHhGNSwgMHgwMywKKwkgMHhFNSwgMHg2MCwgMHg1MywgMHg2NCwgMHg2NCwgMHg1OCwgMHg0MCwgMHg0RiwgMHgyQSwgMHhGMCwgMHg4MywgMHg2MCwgMHhGRiwgMHg2NSwgMHg2NCwgMHg0NywKKwkgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgxNywgMHgwMCwgMHgwMywgMHgyNiwgMHgwMywgMHhBQywgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHg2NCwgMHg0MSwgMHhDQiwgMHhGMywKKwkgMHgyRiwgMHhGQSwgMHg2MCwgMHg0MywgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgzMiwgMHhGQywgMHgzMywgMHhGQSwKKwkgMHgzNCwgMHhGOCwgMHgxOSwgMHgwMCwgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwKKwkgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHgzNiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzNywgMHhGMiwgMHgzMywgMHhGQSwgMHgzOCwgMHhGMiwKKwkgMHgzNCwgMHhGQSwgMHhDQiwgMHhGMywgMHgyRiwgMHhGQSwgMHgzNiwgMHhGQSwgMHhDQywgMHhGMywgMHgzMCwgMHhGQSwgMHgzNywgMHhGQSwgMHhDRCwgMHhGMywKKwkgMHgzMSwgMHhGQSwgMHgzOCwgMHhGQSwgMHg2NCwgMHg0MSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgyOSwgMHgwMCwgMHgyNiwgMHg0NiwgMHgwNCwgMHg2MywgMHgwMywgMHhGQywgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwKKwkgMHgwNiwgMHhGQSwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHg1OSwgMHhGNSwgMHgxQSwgMHgwMiwKKwkgMHgzOSwgMHhGMiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMCwgMHg2MCwgMHg4MSwgMHg2NywgMHgwRCwgMHhGQSwgMHg3QywgMHg2NCwKKwkgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwgMHg0MiwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRiwgMHhGQSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgyNiwgMHhGMiwgMHgyNywgMHhGMCwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHhGNCwgMHgxRiwgMHhGQSwgMHg2NCwgMHg0NywgMHgyMCwgMHhGQSwgMHg2MSwgMHg0NCwgMHgyMSwgMHhGQSwgMHgwMSwgMHg2NywgMHgwRCwgMHhGQSwKKwkgMHgxMCwgMHg2MSwgMHgxRiwgMHg2MCwgMHg2QywgMHg2NCwgMHgxRSwgMHg2MywgMHg1OCwgMHhEMSwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwKKwkgMHg5QiwgMHhGMSwgMHhCOCwgMHhGMSwgMHg2NCwgMHg1RSwgMHg2NCwgMHg1RiwgMHg0NCwgMHg2MywgMHhCRCwgMHhEQSwgMHgxRiwgMHg2MCwgMHg2NiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwOSwgMHhCQywgMHg0QSwgMHhEMywgMHg2MCwgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHg2NCwgMHgwMiwgMHgzNiwgMHgwMSwgMHg2NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwKKwkgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywgMHhCRCwgMHhEQSwgMHhCNSwgMHhGMywgMHhCNiwgMHhGMSwgMHg2MCwgMHg0NywgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywKKwkgMHhDMywgMHhGMSwgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NCwgMHhCRCwgMHhEQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgyMywgMHhGMCwgMHgzQiwgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgxMCwgMHhCQywgMHgzRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MCwgMHg1QywgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHg1OSwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGNSwgMHhBQywgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwOCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg4MCwgMHg3RSwgMHhGOCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHg4OCwgMHhGMSwgMHgwNywgMHhGOCwgMHgwMSwgMHg2MCwgMHg2MCwgMHg2NywgMHgyQywgMHhGQSwgMHgxRCwgMHg2MCwgMHgwMCwgMHg2NywgMHgyRCwgMHhGQSwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NywgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHgzMiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwKKwkgMHgzMywgMHhGOCwgMHhDRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwMCwgMHg2MywgMHgzQiwgMHhGQywgMHgzRCwgMHhGQywgMHgwMSwgMHg2NCwKKwkgMHgzQSwgMHhGQSwgMHg2NiwgMHg2NCwgMHgzOSwgMHhGQSwgMHgzQywgMHhGQywgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NCwgMHgwMCwgMHhGNCwgMHgwMiwgMHhGQSwKKwkgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHg1QSwgMHhEQSwgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQSwgMHg4MiwgMHg3RiwgMHgyNCwgMHg3RSwgMHgwOCwgMHhGQSwgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGNSwgMHgzRCwgMHhGMiwgMHgzQywgMHhGMiwgMHhDQywgMHg4MywgMHgwMCwgMHhBOCwKKwkgMHgwMywgMHgwMywgMHgwOCwgMHgyOCwgMHgzRCwgMHhGQywgMHg0NSwgMHgwMCwgMHgzRCwgMHhGQSwgMHgzQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHgwMCwgMHg2MywKKwkgMHgwMCwgMHhGNCwgMHgwNywgMHhGQywgMHgwMSwgMHhCMCwgMHgwQiwgMHhGQSwgMHgxQSwgMHgwMywgMHgxRiwgMHhGOCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwKKwkgMHhEQSwgMHg2MiwgMHgxOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgxRiwgMHhGMiwgMHgxRSwgMHhGMCwgMHg1OSwgMHhGNSwgMHgwMCwgMHhBOCwgMHgzQiwgMHhGOCwgMHhEMCwgMHg4MCwgMHgwNiwgMHgwMywKKwkgMHgwNSwgMHgwMywgMHgwNCwgMHg2MCwgMHg1QywgMHg2MywgMHgwRiwgMHg2NCwgMHgzQSwgMHhGQSwgMHgzOSwgMHhGQywgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NCwKKwkgMHgwNiwgMHhGQSwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGNSwgMHgwMCwgMHhGNCwgMHg4MSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwNiwgMHhGQSwgMHgzMiwgMHg0NywgMHgwNCwgMHhCQywgMHgwNywgMHhGQSwgMHhCOCwgMHhGMSwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwKKwkgMHgwOSwgMHhGQSwgMHg1OSwgMHhGNSwgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgzOSwgMHhGMiwgMHgzRiwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhFMSwgMHg2MCwgMHgwRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NSwgMHgwRSwgMHhGMiwgMHgwRiwgMHhGMCwgMHgxMCwgMHhGMCwKKwkgMHg2NCwgMHg0MSwgMHgwMSwgMHhBOCwgMHg1OSwgMHhGNSwgMHgwOSwgMHgwMiwgMHhBRCwgMHg4MywgMHg2NCwgMHg0NCwgMHhBQywgMHg4NCwgMHgwOCwgMHgyNCwKKwkgMHgwQSwgMHg2MywgMHgzQywgMHhGQywgMHgzRCwgMHhGQywgMHgxQSwgMHgwMiwgMHgyRCwgMHgwMCwgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgzQywgMHhGQSwgMHgyOSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgwQSwgMHg2NCwgMHgzQywgMHhGQSwgMHgwMSwgMHg2NCwgMHgzQSwgMHhGQSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHg2NCwgMHgxRiwgMHhGQSwgMHgxRSwgMHhGQSwgMHgxRSwgMHgwMCwgMHgwMiwgMHgzQSwgMHgxRSwgMHgwMCwgMHg2NCwgMHg0NCwKKwkgMHhBRCwgMHg4MywgMHhBQywgMHg4NCwgMHgwMiwgMHgwMywgMHgzQywgMHhGQywgMHgzRCwgMHhGQywgMHgxNSwgMHgwMywgMHgzQSwgMHhGQSwgMHhGOCwgMHg2NSwKKwkgMHg1MiwgMHg2MywgMHg2NCwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgxMiwgMHhBMywgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMiwgMHgwMCwKKwkgMHhDNywgMHg4MywgMHhDNywgMHg4MywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMSwgMHgwMCwgMHhDNywgMHg4MywgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNiwKKwkgMHhDNywgMHg4MywgMHgzOSwgMHhGQywgMHgwMCwgMHg2NCwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzQiwgMHhGMCwgMHgzQSwgMHhGMiwgMHg2NSwgMHg0NiwKKwkgMHgwNiwgMHhGMiwgMHg0MCwgMHg0NywgMHgxRCwgMHgxOCwgMHgzMiwgMHg0NywgMHgwNywgMHhGQSwgMHgyNCwgMHg3RSwgMHg4MiwgMHg3RiwgMHgwOCwgMHhGQSwKKwkgMHgwMSwgMHg2MCwgMHgwMSwgMHg2MywgMHhCOCwgMHhGMywgMHgwQSwgMHhGQywgMHgwMCwgMHg3RiwgMHgwOSwgMHhGQSwgMHgyNywgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwRiwgMHgwMCwgMHgxRiwgMHhGOCwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgxRSwgMHhGMCwgMHg1OSwgMHhGNSwgMHgzQiwgMHhGOCwgMHg2NSwgMHg0NiwKKwkgMHgyNywgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgxMywgMHgwMCwgMHg2RSwgMHg2MSwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwKKwkgMHgwMCwgMHg2MCwgMHgwRSwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhFRSwgMHg2MywgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2MSwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MSwgMHhGOSwgMHgxRiwKKwkgMHgyNywgMHg0MCwgMHgwNCwgMHgyNiwgMHgxQiwgMHgwMCwgMHg0NiwgMHg0QiwgMHgxQiwgMHg2MCwgMHg4OCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwRSwgMHgwMywgMHg4OSwgMHhGMCwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NSwgMHg0NCwgMHhBQywgMHg4NiwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMCwgMHgyQiwgMHg0NiwgMHg4MiwgMHhGQywgMHgwMCwgMHhGNCwgMHg4MiwgMHhGQywgMHgwMCwgMHhGNCwgMHgyNywgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgxQSwgMHgwMCwgMHg0NiwgMHg0QiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRSwgMHgwMywgMHg4OSwgMHhGMCwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NCwgMHhBQywgMHg4NiwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHhFNywgMHg2MCwgMHg1OCwgMHg0RCwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2NSwgMHg0NiwKKwkgMHgwMiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg4MiwgMHhGQywgMHgwMSwgMHg2NCwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MSwgMHgwMiwgMHg2NCwKKwkgMHg3QSwgMHg2MywgMHg1OCwgMHhEMCwgMHhBQiwgMHg0NiwgMHhBMCwgMHhEOCwgMHhBQiwgMHg0NiwgMHhGQiwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHhGNCwKKwkgMHhDRCwgMHg4MSwgMHhBQiwgMHg0NiwgMHgwMCwgMHhGNCwgMHhGMywgMHgwMiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyQSwgMHg2MSwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1OCwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwKKwkgMHg2NywgMHg0NCwgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgzMiwgMHhGQSwgMHgzMywgMHhGQSwgMHgzNCwgMHhGQSwgMHgxMiwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHg4OCwgMHhGMSwgMHgwRSwgMHhGQSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgxMSwgMHg2MCwgMHhEOCwgMHg2MywKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNiwgMHg2MiwgMHhFQSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHhFNCwgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhCRCwgMHhEQiwgMHgwOCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHgwQSwgMHg2MiwgMHhFQSwgMHg2MCwgMHgxMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhGQywgMHg2MiwgMHhFOSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgyNSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OCwgMHhGNSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHhBQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg1OSwgMHgxOCwgMHg1OCwgMHhGNSwgMHg0MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg1MiwgMHhGMywgMHgwMCwgMHhGNCwKKwkgMHg2MCwgMHg0MywgMHhCRCwgMHhEMSwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NywgMHhBNSwgMHhEQSwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFOSwgMHg4MSwKKwkgMHg2MiwgMHg0NCwgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHg1OCwgMHg4QiwgMHgyMSwgMHg2MCwKKwkgMHg4RSwgMHg2MywgMHhBMywgMHhEMSwgMHgyQiwgMHg0NCwgMHhDOCwgMHg4NCwgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MSwgMHg0NSwgMHgwMywgMHhBMSwKKwkgMHhFOSwgMHg4MSwgMHg0MSwgMHg0QywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyQiwgMHhEMiwgMHgyQiwgMHg0MywKKwkgMHg2MCwgMHg0NywgMHgwMSwgMHg3RSwgMHg1MiwgMHhGMSwgMHhBMywgMHhEQSwgMHhBNCwgMHhEMywgMHhDQiwgMHg4MywgMHg0NCwgMHg4QiwgMHhGOCwgMHg4NCwKKwkgMHgyQywgMHg0MSwgMHgwQywgMHgwNCwgMHhCRSwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhCRSwgMHhEQSwgMHgwMCwgMHg3RSwgMHhBMywgMHhEMiwKKwkgMHg2MCwgMHg0NSwgMHgwMCwgMHg3RiwgMHhCNCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQSwgMHhGNCwgMHgwMiwgMHg1OCwgMHhGNSwgMHgyQiwgMHg0NCwKKwkgMHgwNCwgMHhBNCwgMHgzRiwgMHhGQSwgMHg2NSwgMHhGMywgMHg2NCwgMHhGQiwgMHgxNiwgMHg2MCwgMHhDRSwgMHg2MSwgMHgwMSwgMHg2NCwgMHg1MiwgMHhGMSwKKwkgMHhBMSwgMHhEQiwgMHg2NSwgMHhGQiwgMHhBNCwgMHhEMywgMHgwNCwgMHg2NSwgMHg1MSwgMHhGMywgMHgwMSwgMHgxOCwgMHgwQywgMHg2NSwgMHhGMywgMHhCNCwKKwkgMHhCNCwgMHg4NCwgMHg1MSwgMHhGQiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMywgMHg2NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywKKwkgMHgwRiwgMHhCNCwgMHg2NSwgMHhGQiwgMHgwMSwgMHgwMywgMHgwRiwgMHgwMCwgMHhFOSwgMHg2MCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MSwgMHhGMSwKKwkgMHg2NSwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHhGOCwgMHgwMSwgMHhGMywgMHhBMCwgMHgwNCwgMHhBNCwgMHgwMSwgMHgwNCwgMHhGMSwgMHhBNCwKKwkgMHgxMCwgMHgzNiwgMHhGMiwgMHgwMSwgMHg2NSwgMHhGQiwgMHg2NSwgMHhGMywgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMSwgMHhEMSwgMHhDQywgMHg4NCwKKwkgMHgwMSwgMHg2MSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhFMSwgMHg4MSwgMHhDQywgMHg4NCwgMHhGQiwgMHgwMSwgMHhBMSwgMHg4NCwgMHg1MSwgMHhGMSwKKwkgMHhFNywgMHgwMywgMHgxNiwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEQiwgMHgwMCwgMHgwMCwgMHg2NSwgMHhGMywgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHg5QSwgMHhGMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhENywgMHgwMywgMHgzMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOCwgMHg2MCwKKwkgMHg5NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHhGMSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOCwgMHg2MCwgMHhDOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1OCwgMHhGNSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0RiwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFOCwgMHg2MCwgMHhGMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHgzMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhBNiwgMHhGMSwgMHgxMSwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhEOSwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwKKwkgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhBNywgMHhGMSwgMHgxMSwgMHg2MCwKKwkgMHhFOCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxQywgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQiwgMHgxQywgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhFNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOSwgMHg2MCwgMHgyMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGMSwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwMywgMHgwMCwgMHhFOCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwQSwgMHgwMCwgMHg2NCwKKwkgMHg0RiwgMHhGQiwgMHhBOCwgMHhGMSwgMHgxMSwgMHg2MCwgMHhFOCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOSwgMHg2MCwgMHg0OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwKKwkgMHgxMSwgMHg2MCwgMHhFNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhFNCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHg2MCwgMHhGNywgMHg2NCwgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg0RiwgMHhGMywgMHhEQiwgMHgwQSwgMHgwMCwgMHhBMCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMywgMHg0RiwgMHhGQiwgMHhENiwgMHgwMSwKKwkgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhFOCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHg1MSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMywgMHhCNCwgMHg1MSwgMHhGQiwgMHgxNiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgyNSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwRSwgMHgwNCwgMHgzMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFOSwgMHg2MCwgMHg4RSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHhGMSwgMHg2NSwgMHhGOSwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFOSwgMHg2MCwgMHhCNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhFQSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0NCwgMHgwMSwgMHhCNSwgMHg1NCwgMHg4MCwgMHgzMSwgMHg0NCwgMHhERSwgMHhCNCwgMHg0MCwgMHg1MSwKKwkgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgzRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwgMHgxMCwgMHg2MiwgMHgxMSwgMHg2MCwKKwkgMHhEOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwKKwkgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHg3QSwgMHg2MSwgMHgxNiwgMHg2MCwKKwkgMHhDNCwgMHg2MywgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgyMSwgMHg2MCwgMHgzMiwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwNCwgMHhBMSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgxMCwgMHgwMCwgMHgwMSwgMHg2MCwgMHg3QSwgMHg2MSwKKwkgMHgxNiwgMHg2MCwgMHhDNCwgMHg2MywgMHhBMSwgMHhEMywgMHgwMCwgMHg2NiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgxNiwgMHg2MCwgMHhDMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFMiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg1RiwgMHhGQiwgMHhBQywgMHg4NSwgMHg2MCwgMHg0MSwgMHgyMCwgMHgwMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwOCwgMHg2NCwgMHhFOSwgMHg4MSwKKwkgMHhDQywgMHg4NCwgMHgwMiwgMHgyNCwgMHhERiwgMHg4MywgMHhGQiwgMHgwMiwgMHgyMSwgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMCwgMHhERCwgMHg2NSwgMHg0MSwKKwkgMHgyMSwgMHg2MCwgMHg5MCwgMHg2MywgMHgwRiwgMHg2MCwgMHhDMCwgMHg2NCwgMHhFOSwgMHg4MSwgMHg1OCwgMHhEMSwgMHhGRCwgMHgwNCwgMHhBMywgMHhEOSwKKwkgMHgwQiwgMHgwMywgMHg1OCwgMHhEMSwgMHhFOSwgMHg4MSwgMHg2MCwgMHg0NSwgMHhGQywgMHgwNCwgMHhBMywgMHhEMSwgMHg2NCwgMHg0NywgMHhCMCwgMHg4NCwKKwkgMHhCRCwgMHhEQiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NCwgMHhGMCwgMHgwMiwgMHgyMCwgMHg2MCwgMHgzOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhBOCwgMHgwMSwgMHg2MCwgMHg3MCwgMHg2MiwgMHgwNiwgMHgwMiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMywgMHgwMiwgMHg2NCwgMHg2MCwgMHg0MSwgMHgyMSwgMHg2MCwgMHg4RSwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHhGRiwgMHhCNSwKKwkgMHg4MCwgMHhCRiwgMHhDRCwgMHg4MSwgMHg2NSwgMHg1QywgMHgwRiwgMHgwMywgMHg4MCwgMHhCRiwgMHhCRCwgMHhEQiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgwMywgMHg2MCwgMHg0NSwgMHhDRCwgMHg4MSwgMHhBMywgMHhEMywgMHgwOCwgMHgwMywgMHg4MCwgMHhCRiwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg4MCwgMHhCQywgMHg2MCwgMHg0NywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MSwgMHgyMSwgMHg2MCwKKwkgMHg5MCwgMHg2MywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywKKwkgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMiwgMHg2NSwgMHg0NCwKKwkgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwKKwkgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwKKwkgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg1MCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwKKwkgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg2MiwgMHhGQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgxOCwgMHgwMCwgMHgzRiwgMHhGMiwgMHg0NywgMHg2NSwgMHhDNCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGQSwKKwkgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgxQiwgMHg2MCwgMHhEQSwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwQywgMHg2MywgMHgxMiwgMHg2MCwKKwkgMHhCNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg1MywgMHhGQiwgMHg1NCwgMHhGQiwgMHgxMiwgMHg2MCwgMHhCQSwgMHg2MywKKwkgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHg2MCwgMHhCRSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MywKKwkgMHhGMCwgMHhBMCwgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhERCwgMHgxMiwgMHg2MCwKKwkgMHhDMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhBMiwgMHhERCwgMHg1QSwgMHhEMywgMHhBMiwgMHhERCwgMHhDMCwgMHg4MSwgMHg2MSwgMHg0NCwgMHgwMiwgMHgyNCwKKwkgMHhGRiwgMHhGRiwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg1QSwgMHhEMywgMHhFOSwgMHg4MSwgMHhFOCwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4NSwgMHhENCwgMHg4NSwgMHhDNSwgMHg4MywgMHhBMiwgMHhERCwgMHgxMiwgMHg2MCwKKwkgMHhCOCwgMHg2MiwgMHg2MywgMHg0NywgMHgwMCwgMHg3RiwgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMywgMHhFMSwgMHhBMywgMHhGRiwKKwkgMHgxQiwgMHg2MCwgMHg1QSwgMHg2MywgMHgxNywgMHhGRCwgMHhBRSwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywKKwkgMHgwMSwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCMSwgMHhGRSwgMHgwNSwgMHgwNSwgMHhCMCwgMHhGRSwgMHgwNiwgMHgwNSwgMHhCMiwgMHhGRSwKKwkgMHhCMywgMHhGRSwgMHgyMiwgMHgwMCwgMHhGMCwgMHg2MCwgMHhGQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywgMHgyOSwgMHhGMSwgMHg0MCwgMHg0NCwKKwkgMHg0NCwgMHg0NSwgMHgyQSwgMHhGMSwgMHgyQiwgMHhGMSwgMHg0NCwgMHg0NiwgMHg0NCwgMHg0NywgMHgzRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHgxNiwgMHg2MCwKKwkgMHhEMiwgMHg2NCwgMHg0NCwgMHhENywgMHg1OCwgMHg0MywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgxMiwgMHg2MCwgMHhDOCwgMHg3QywgMHhBNCwgMHhEMywKKwkgMHg2MSwgMHg0MywgMHgwNCwgMHhCNCwgMHgyNCwgMHg0NCwgMHgwMiwgMHgwMywgMHgxMywgMHhGRiwgMHgwNiwgMHgwMCwgMHgzRiwgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwNCwgMHhGQiwgMHgxMCwgMHg3NSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NiwgMHgzRSwgMHhCNCwgMHhGRSwKKwkgMHgwOSwgMHgwNSwgMHhCNSwgMHhGRSwgMHgwMiwgMHgyNCwgMHg4MCwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNywgMHhGRSwgMHgwNSwgMHgwNSwKKwkgMHhCNiwgMHhGRSwgMHhGMiwgMHgwMSwgMHhGMSwgMHg2MCwgMHgzNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NCwgMHgwMCwgMHg3RiwgMHhGNCwgMHhBMCwKKwkgMHg2MCwgMHg0NSwgMHgwNSwgMHgwNSwgMHgxNywgMHg2MCwgMHg1RSwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFNCwgMHgwMSwKKwkgMHhFMywgMHgwMSwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMCwgMHgwMiwKKwkgMHgxMCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MSwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNCwgMHgwMCwKKwkgMHgxMCwgMHhFMCwgMHg0NiwgMHg2MCwgMHgwOSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgyNywgMHhGMSwgMHgwMCwgMHg2NiwgMHgyMCwgMHg3OCwgMHg0MiwgMHhGRSwKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwKKwkgMHgxQywgMHgwMiwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywgMHhBMywgMHhEMywgMHgwNywgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwgMHgwNCwgMHgwMywKKwkgMHgwMywgMHgwMiwgMHhCQywgMHhGOSwgMHgwMCwgMHg2NywgMHgxMSwgMHgwMCwgMHgwMCwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhCNCwgMHgwMSwKKwkgMHgzNiwgMHg0NywgMHhGRiwgMHgyMywgMHgwNCwgMHgwMCwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg3RiwgMHg2NywgMHgwNiwgMHgwMCwgMHgwNCwgMHg3QywKKwkgMHhCQywgMHhGOSwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OCwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgzMSwgMHgwMiwgMHgxMiwgMHg2MCwgMHhDOCwgMHg2MywKKwkgMHhBMywgMHhEMywgMHgwMSwgMHg3QywgMHgyMCwgMHhCNSwgMHgwQywgMHhCNSwgMHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHhCQywgMHhGOSwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGMSwgMHgyMCwgMHg0NCwKKwkgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgxQiwgMHgwMCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHg1QywgMHg1RSwgMHg4MiwgMHhGRiwgMHgyNiwgMHg0NCwKKwkgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHg1QywgMHg0MSwgMHg4NywgMHhGRiwgMHg2MiwgMHhGRiwgMHgwMCwgMHg2MywgMHgxQiwgMHg2MCwgMHhDNCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNCwgMHgwMywgMHgwOSwgMHhGMiwgMHgwRiwgMHhGQywgMHhBQywgMHg4NiwKKwkgMHhGQiwgMHgwMSwgMHgxQywgMHg2MCwgMHgwNCwgMHg2MiwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHgwOCwgMHhGMCwgMHg2MCwgMHg0NywgMHgwMywgMHhCNCwgMHgwMywgMHhBQywgMHg3RiwgMHg2NywKKwkgMHgwMywgMHg2MSwgMHgwOCwgMHgwMiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyQiwgMHg0OSwgMHgwMCwgMHgyNSwgMHg0NCwKKwkgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NSwgMHhFQywgMHg2MCwgMHgzNiwgMHg2NCwgMHhDNCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhDMCwgMHhGRSwgMHgzRCwgMHgwMCwKKwkgMHhDMSwgMHhGRSwgMHgzQiwgMHgwMCwgMHhDMiwgMHhGRSwgMHgzOSwgMHgwMCwgMHhDMywgMHhGRSwgMHgzNywgMHgwMCwgMHhDNCwgMHhGRSwgMHgzNSwgMHgwMCwKKwkgMHhDNSwgMHhGRSwgMHgzMywgMHgwMCwgMHhDNiwgMHhGRSwgMHgzMSwgMHgwMCwgMHhDNywgMHhGRSwgMHgyRiwgMHgwMCwgMHhDOCwgMHhGRSwgMHgyRCwgMHgwMCwKKwkgMHhDOSwgMHhGRSwgMHgyQiwgMHgwMCwgMHhDQSwgMHhGRSwgMHgyOSwgMHgwMCwgMHhDQiwgMHhGRSwgMHgyNywgMHgwMCwgMHhDQywgMHhGRSwgMHgyNSwgMHgwMCwKKwkgMHhDRCwgMHhGRSwgMHgyMywgMHgwMCwgMHhDRSwgMHhGRSwgMHgyMSwgMHgwMCwgMHhDRiwgMHhGRSwgMHgxRiwgMHgwMCwgMHhEMCwgMHhGRSwgMHgxRCwgMHgwMCwKKwkgMHhEMSwgMHhGRSwgMHgxQiwgMHgwMCwgMHhEMiwgMHhGRSwgMHgxOSwgMHgwMCwgMHhEMywgMHhGRSwgMHgxNywgMHgwMCwgMHhENCwgMHhGRSwgMHgxNSwgMHgwMCwKKwkgMHhENSwgMHhGRSwgMHgxMywgMHgwMCwgMHhENiwgMHhGRSwgMHgxMSwgMHgwMCwgMHhENywgMHhGRSwgMHgwRiwgMHgwMCwgMHhEOCwgMHhGRSwgMHgwRCwgMHgwMCwKKwkgMHhEOSwgMHhGRSwgMHgwQiwgMHgwMCwgMHhEQSwgMHhGRSwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRSwgMHgwNywgMHgwMCwgMHhEQywgMHhGRSwgMHgwNSwgMHgwMCwKKwkgMHhERCwgMHhGRSwgMHgwMywgMHgwMCwgMHhERSwgMHhGRSwgMHgwMSwgMHgwMCwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHg5RiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5QSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg5NywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5NCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg5MiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg5MCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHgwNiwgMHhGQiwgMHg4RiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4RCwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4QiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4QSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHg4NywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRSwKKwkgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MywgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHg4MiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MSwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg1QywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1NSwgMHgwMCwgMHgwNSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwNSwgMHhGRCwgMHgzMCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzMSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgzOCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzOSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzQywgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgzRCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgzRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2MSwgMHg2MSwgMHg0NCwKKwkgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwKKwkgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwgMHgwNywgMHgzNiwgMHg4NywgMHhGRiwgMHgyMCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyMiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyMywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyNiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOCwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyOSwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyQSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyQywgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRCwgMHg0NCwgMHhCRCwgMHhEQiwKKwkgMHgyRSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyRiwgMHg0NCwgMHhCRCwgMHhEQiwgMHhERCwgMHg4MSwgMHgwOCwgMHgzQSwgMHhEMCwgMHgwMSwgMHg1NCwgMHgwMCwKKwkgMHgyNywgMHg0MCwgMHgxMCwgMHgyNiwgMHgzMCwgMHgwMCwgMHgyNiwgMHg0NCwgMHgwMSwgMHgzNiwgMHgyRCwgMHgwMCwgMHgwMiwgMHgzNiwgMHg4MiwgMHhGRiwKKwkgMHgwMywgMHgzNiwgMHg4MywgMHhGRiwgMHgwNCwgMHgzNiwgMHg4NCwgMHhGRiwgMHgwNSwgMHgzNiwgMHg4NSwgMHhGRiwgMHgwNiwgMHgzNiwgMHg4NiwgMHhGRiwKKwkgMHgyNSwgMHg0NCwgMHgwMCwgMHgzNiwgMHg0NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHg0NCwgMHg0MSwgMHgwMiwgMHgzNiwgMHg0NCwgMHg0MiwgMHgwMywgMHgzNiwKKwkgMHg0NCwgMHg0MywgMHgwNCwgMHgzNiwgMHg0NCwgMHg0NCwgMHgwNSwgMHgzNiwgMHg0NCwgMHg0NSwgMHgwNiwgMHgzNiwgMHg0NCwgMHg0NiwgMHgwNywgMHgzNiwKKwkgMHg0NCwgMHg0NywgMHgwOCwgMHgzNiwgMHg0NCwgMHg0OCwgMHgwOSwgMHgzNiwgMHg0NCwgMHg0OSwgMHgwQSwgMHgzNiwgMHg0NCwgMHg0QSwgMHgwQiwgMHgzNiwKKwkgMHg0NCwgMHg0QiwgMHgwQywgMHgzNiwgMHg0NCwgMHg0QywgMHgwRCwgMHgzNiwgMHg0NCwgMHg0RCwgMHgwRSwgMHgzNiwgMHg0NCwgMHg0RSwgMHgwRiwgMHgzNiwKKwkgMHg0NCwgMHg0RiwgMHg4NywgMHhGRiwgMHgyMSwgMHgwMCwgMHgyNSwgMHg0NCwgMHgxMCwgMHgzNiwgMHg0NCwgMHg1MCwgMHgxMSwgMHgzNiwgMHg0NCwgMHg1MSwKKwkgMHgxMiwgMHgzNiwgMHg0NCwgMHg1MiwgMHgxMywgMHgzNiwgMHg0NCwgMHg1MywgMHgxNCwgMHgzNiwgMHg0NCwgMHg1NCwgMHgxNSwgMHgzNiwgMHg0NCwgMHg1NSwKKwkgMHgxNiwgMHgzNiwgMHg0NCwgMHg1NiwgMHgxNywgMHgzNiwgMHg0NCwgMHg1NywgMHgxOCwgMHgzNiwgMHg0NCwgMHg1OCwgMHgxOSwgMHgzNiwgMHg0NCwgMHg1OSwKKwkgMHgxQSwgMHgzNiwgMHg0NCwgMHg1QSwgMHgxQiwgMHgzNiwgMHg0NCwgMHg1QiwgMHgxQywgMHgzNiwgMHg0NCwgMHg1QywgMHgxRCwgMHgzNiwgMHg0NCwgMHg1RCwKKwkgMHgxRSwgMHgzNiwgMHg0NCwgMHg1RSwgMHgxRiwgMHgzNiwgMHg0NCwgMHg1RiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwKKwkgMHhCMywgMHg2MCwgMHg1OCwgMHg0RiwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2MSwgMHg3RiwgMHg2NywgMHgwQiwgMHgwMiwgMHgwMCwgMHhGMCwKKwkgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEOSwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgxMSwgMHgwMiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2MiwgMHgxQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwKKwkgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHhFRCwgMHg2MCwgMHhCOSwgMHg2NCwgMHg4MCwgMHhGQiwgMHgyRCwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMywgMHgwNSwgMHhGQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MSwgMHgwRiwgMHgwMiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2MiwgMHgxQywgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2MywgMHg1QSwgMHhERCwgMHhFRCwgMHg2MCwgMHhEMywgMHg2NCwgMHg4MCwgMHhGQiwgMHgyRCwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHgwMiwgMHg2MSwgMHgzNCwgMHgwMiwgMHgyNSwgMHg0NSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyQSwgMHgzNSwgMHgwMCwKKwkgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgyOSwgMHgwMCwgMHgyMSwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5QSwgMHhGMywgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgyNSwgMHg0NSwgMHgxQiwgMHg2MCwKKwkgMHg1MiwgMHg2MywgMHgwMSwgMHg2MSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhENCwgMHg4MCwgMHhCRCwgMHhEMywgMHhCRCwgMHhENSwgMHhDRCwgMHg4MSwKKwkgMHgwMiwgMHgwMywgMHgxNSwgMHgwMywgMHhGNywgMHgwMSwgMHhBMiwgMHhGRiwgMHhBNiwgMHhEMywgMHg0MCwgMHg0QywgMHgwMCwgMHhBOCwgMHg2NywgMHg0MywKKwkgMHgwQywgMHgwMiwgMHhBMiwgMHhERCwgMHg0MiwgMHg0OCwgMHg2NCwgMHg0MSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHgyOCwgMHhEQiwgMHgwMiwgMHgwMywgMHgyQywgMHg1OCwgMHhBMywgMHhGRiwgMHgwQywgMHg2MSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MSwKKwkgMHg3RiwgMHg2NywgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHhENCwgMHg4MCwKKwkgMHg3RiwgMHg2NywgMHgwNiwgMHg2MywgMHhGOCwgMHgwMiwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyNiwgMHhGNSwgMHgwMSwgMHgyMSwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5QSwgMHhGMywgMHgxNiwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxNiwgMHg2MCwgMHhEMCwgMHg2MSwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhGRSwgMHhFNSwgMHgwMSwgMHhDNiwgMHhGRSwgMHhFMywgMHgwMSwgMHg3RSwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHgyNCwgMHg0NSwgMHhBNCwgMHg4MCwgMHgwMiwgMHg2MSwgMHgzRiwgMHgwMiwgMHgyNSwgMHg0NSwgMHhGOCwgMHgyQiwgMHgzQiwgMHgwMCwKKwkgMHgyRSwgMHhGNSwgMHg2NywgMHg0NCwgMHhENCwgMHg4MCwgMHgxNywgMHg2MCwgMHg2QSwgMHg2MywgMHgzOSwgMHgwMywgMHg2NCwgMHg2MSwgMHgyNCwgMHg0NCwKKwkgMHgwMSwgMHgyNywgMHgyOSwgMHgwMCwgMHhBMywgMHhGQywgMHhBNCwgMHhGOCwgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwKKwkgMHgwOCwgMHgyNCwgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwKKwkgMHhGRSwgMHhBMCwgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgxNCwgMHgwMiwgMHgxMywgMHgwMiwgMHgwNCwgMHhBMywgMHhCRSwgMHhEMywKKwkgMHhCRCwgMHhEMSwgMHgwRiwgMHgxOCwgMHhENCwgMHg4MCwgMHgwRCwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwKKwkgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFMSwgMHg4MSwgMHhDQiwgMHg4MywgMHg0NiwgMHg2NSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0QSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgwQSwgMHgwMCwgMHhCRCwgMHhEMywgMHhCRSwgMHhEMSwgMHhENCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwOCwgMHgyNCwKKwkgMHg2NCwgMHg1OCwgMHgwOCwgMHhBMywgMHhGOCwgMHgwMiwgMHgwNCwgMHg2MSwgMHg3RiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHg2NywgMHg0NCwgMHgyNCwgMHhGQSwgMHg2MiwgMHg0MSwgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MywgMHhFQSwgMHg2MCwKKwkgMHg4OCwgMHg2NCwgMHg2NSwgMHg0NiwgMHg1OCwgMHhEMCwgMHgyRSwgMHhGNSwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg0QiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEQywgMHg4NCwgMHgyMywgMHhGQSwgMHhCRiwgMHhEMSwKKwkgMHg0QSwgMHg2NSwgMHg2NCwgMHg0MywgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHhBMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwNiwgMHgyNSwgMHhGQSwgMHgyMywgMHhGMiwKKwkgMHhERiwgMHhEMSwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgwQiwgMHgwNiwgMHhCRiwgMHhEMSwgMHg2NCwgMHg0MSwgMHhENSwgMHg4MCwgMHg2NCwgMHg0MywKKwkgMHgwMSwgMHgwNiwgMHg2NSwgMHg0MSwgMHg0QSwgMHg2NSwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQywgMHhGMywgMHgwMiwgMHg2MywgMHgyMywgMHhGQywgMHgwNywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0QiwgMHhEMywgMHhCRiwgMHhEMywgMHg2MCwgMHg0MSwgMHhDOSwgMHg4MywgMHhFOSwgMHg4MSwgMHhERCwgMHg4MSwKKwkgMHhBMywgMHhGQSwgMHhFMCwgMHg4MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NywgMHgwMiwgMHgyNCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NywgMHg0MCwgMHg0QiwKKwkgMHhDOSwgMHg4MSwgMHg0QSwgMHg2NSwgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNiwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywKKwkgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywgMHg2MCwgMHg0NywgMHgyNSwgMHhGQSwgMHgwMCwgMHg3RSwgMHg2MCwgMHg0NywKKwkgMHgwMSwgMHgyNiwgMHhEQywgMHg4NCwgMHg2MCwgMHg0MSwgMHhFOCwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwgMHhBQiwgMHgwMSwgMHhGQywgMHhBMywKKwkgMHhBMywgMHhEMSwgMHg0QywgMHg2NSwgMHhBNCwgMHhEMywgMHhEQSwgMHg4MywgMHgwMCwgMHg3RiwgMHgyNSwgMHhGQSwgMHg2MCwgMHg0MSwgMHgwMSwgMHgyNiwKKwkgMHhERCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhEOCwgMHg4NCwgMHgyMywgMHhGQSwgMHg5RCwgMHgwMSwgMHgyMywgMHhGMiwgMHgxMiwgMHg2MCwgMHhCOCwgMHg2NSwKKwkgMHg2MCwgMHg0MSwgMHgxMiwgMHg2MCwgMHg1NCwgMHg2MywgMHhBMywgMHhEQiwgMHhGRiwgMHhBMSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwKKwkgMHg1QiwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGRiwgMHhBMSwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMywKKwkgMHhGNSwgMHgwMSwgMHgyRSwgMHhGNSwgMHgwMCwgMHg2MCwgMHgyRiwgMHg2NSwgMHgyNSwgMHhGMiwgMHgwMCwgMHg2MywgMHhDQywgMHg4NCwgMHgwMywgMHhBMywKKwkgMHhGRCwgMHgwNSwgMHg0QSwgMHg2NCwgMHhENywgMHg4MCwgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHgyRiwgMHgwNSwgMHhBMSwgMHhERCwgMHhFMywgMHg4MywKKwkgMHhGRSwgMHhBMywgMHg1OCwgMHhEMCwgMHg3RSwgMHhBOCwgMHg1OSwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwKKwkgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHgyRSwgMHhGNSwgMHgxMSwgMHg2MCwgMHhGMCwgMHg2NCwgMHgyNSwgMHhGMCwgMHhBMCwgMHhEMywgMHhEMywgMHg4MCwKKwkgMHgwMSwgMHhCMCwgMHgwNCwgMHgwMywgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgwMSwgMHgwMCwgMHhBMiwgMHhERCwgMHgxMSwgMHg2MCwKKwkgMHhGOCwgMHg2MywgMHgxMCwgMHg2MCwgMHgwQSwgMHg2NSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2NSwgMHgwNywgMHg2NCwgMHg2NCwgMHg0MSwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwNiwgMHgwMywgMHhGQiwgMHgwMiwKKwkgMHgyNSwgMHhGMiwgMHgwMiwgMHhBMywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhFQywgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxMiwgMHg2MCwgMHg1NCwgMHg2MSwgMHhBMSwgMHhEMywgMHgyMywgMHhGQSwgMHhFMCwgMHg4MywgMHg0QSwgMHg2NSwgMHgwNCwgMHgwMiwgMHgwMiwgMHg2MywKKwkgMHgyMywgMHhGQywgMHhBNSwgMHhGQywgMHgwOSwgMHgwMCwgMHhEQiwgMHg4MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHg2MCwKKwkgMHhGMCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHgwMiwgMHhBNCwgMHhGRSwgMHhBMCwgMHgyMywgMHhGQSwgMHgxQiwgMHgwMywgMHhGQSwgMHhBNCwKKwkgMHhGRCwgMHhBNCwgMHgwMSwgMHhBMSwgMHhGRCwgMHgwNywgMHg2MSwgMHg0MywgMHgyMywgMHhGMiwgMHgyNSwgMHhGQywgMHhFMCwgMHg4MywgMHgwMiwgMHhBMywKKwkgMHgxMSwgMHg2MCwgMHhGMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHg0QSwgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgyNSwgMHhGMiwgMHgyMywgMHhGMiwgMHgwMSwgMHhCMCwgMHhDQywgMHg4NCwgMHgwNCwgMHgwMiwKKwkgMHgyMywgMHhGQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QiwKKwkgMHg2NSwgMHg0MiwgMHg4MCwgMHg2NCwgMHhENCwgMHg4NSwgMHgyQiwgMHg0MSwgMHgwMCwgMHhBMSwgMHg1NSwgMHg4QiwgMHgwRCwgMHgwMywgMHgwMiwgMHgwNCwKKwkgMHg2NSwgMHg0MSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhDQSwgMHg4NCwgMHg1OCwgMHhEMCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEOSwKKwkgMHhGQywgMHgwMiwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhFQywgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMywKKwkgMHgwMiwgMHg3QywgMHhBMCwgMHhEMywgMHgyMywgMHhGOCwgMHhEQywgMHg4NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHgwMSwgMHg2NCwgMHg5RCwgMHhGRSwgMHgwMiwgMHgyOCwgMHgwMiwgMHg2NCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMiwgMHg3QywgMHgyMywgMHhGOCwgMHgwMSwgMHhCNCwKKwkgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHg2NCwgMHg0NCwgMHg3QywgMHg1RiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHg4OSwgMHhGMSwgMHg2NiwgMHg0MSwgMHhDMCwgMHg4NiwKKwkgMHhBNSwgMHhEMiwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNywgMHgwMSwgMHg2MywgMHgxNCwgMHgzNywgMHgwMiwgMHg2MywKKwkgMHgzNywgMHgzNywgMHgwNiwgMHg2MywgMHg2RSwgMHgzNywgMHgwQiwgMHg2MywgMHgyNSwgMHhGQywgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHg4OCwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFOCwgMHg4NywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgwMywgMHhCNCwgMHgyNSwgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHhGMCwgMHgyMSwgMHg2MCwgMHg3QywgMHg2NSwKKwkgMHgyMywgMHhGMiwgMHhBNSwgMHhEOSwgMHgwMiwgMHhBOCwgMHg2NCwgMHg0NCwgMHgwNywgMHgwMiwgMHgwMCwgMHhCQywgMHhGMiwgMHhBNCwgMHgwNCwgMHgwMywKKwkgMHgwMywgMHgwNywgMHgxRiwgMHg2MCwgMHhBQSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MywKKwkgMHgyMCwgMHg2MCwgMHgwQSwgMHg2MSwgMHg0OCwgMHg2NCwgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyNSwgMHhGMCwgMHgyMCwgMHg2NCwKKwkgMHhEMCwgMHg4MSwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNywgMHgyNSwgMHhGQSwgMHgwRiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwRSwgMHg2MywgMHhDMywgMHg4MywKKwkgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhDRCwgMHg4MSwgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgwNCwgMHgwMywKKwkgMHgwMCwgMHg2NCwgMHhDOSwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwKKwkgMHgyNSwgMHhGMCwgMHgwMSwgMHg2MCwgMHg3MCwgMHg2MywgMHhBMywgMHhEOSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywKKwkgMHhBNSwgMHhGMCwgMHhBMywgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg1RSwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwKKwkgMHg4OSwgMHhGMSwgMHg2NiwgMHg0MywgMHhDMCwgMHg4NiwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQSwgMHg2MywgMHg0NiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHhBMywgMHhBMywgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg1RSwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NywKKwkgMHg3QywgMHg1RiwgMHg4OSwgMHhGMSwgMHg2NiwgMHg0MSwgMHhDMCwgMHg4NiwgMHg2NSwgMHg0NCwgMHhBMCwgMHhEMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGQSwKKwkgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwgMHgwMiwgMHhBOCwKKwkgMHgwMCwgMHg2NywgMHgwMiwgMHgwMiwgMHgyRCwgMHhGOSwgMHgyQywgMHhGOSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhBOCwgMHg2MSwKKwkgMHgyMywgMHhGMiwgMHgyNSwgMHhGMiwgMHgwMiwgMHhBOCwgMHgwMCwgMHhBOCwgMHgwOSwgMHgwMiwgMHgwNywgMHgwMywgMHhEMCwgMHhBMCwgMHgzMCwgMHg2NSwKKwkgMHgwMywgMHgwNCwgMHhBNywgMHhBMCwgMHg1OSwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MSwgMHgwQSwgMHgwMCwgMHgyNSwgMHg2MCwgMHgyQywgMHg2MSwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHgwMCwKKwkgMHgyNSwgMHg2MCwgMHgyQywgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNiwgMHg2MSwgMHg0MSwgMHg1NiwgMHhDNywgMHhGRSwgMHhFQiwgMHg2MCwKKwkgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHg0NiwgMHg0NSwgMHgwMiwgMHhGMCwKKwkgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHg2NiwgMHg1QywgMHgyNSwgMHg0NiwgMHg1NiwgMHgwMiwKKwkgMHg3MCwgMHgyNywgMHg1NCwgMHgwMCwgMHgxMiwgMHg2NCwgMHgwMywgMHhGQSwgMHgwNCwgMHhGOCwgMHgwRSwgMHhGMiwgMHg4NywgMHhGQywgMHg4RCwgMHhGQywKKwkgMHg4RSwgMHhGQywgMHhEQSwgMHg4MiwgMHgxNiwgMHg2MSwgMHgwMCwgMHg2MywgMHhDOSwgMHg4MSwgMHg1QSwgMHhEQywgMHhGRCwgMHgwMiwgMHg2MCwgMHg0MCwKKwkgMHhGMCwgMHgzQiwgMHgxNiwgMHgwMCwgMHgzMiwgMHg0NCwgMHg4RiwgMHhGMywgMHgwMSwgMHhCMCwgMHhGNiwgMHhBMCwgMHgwOCwgMHgyNCwgMHgyQywgMHgwNSwKKwkgMHhEQywgMHg4MywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHg4RiwgMHhGRCwgMHgyQiwgMHhGRiwgMHhGRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHg0RiwgMHgwMCwKKwkgMHg5MCwgMHhGMywgMHgwQSwgMHg2NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4MywgMHgxNywgMHgwNSwgMHg5MCwgMHhGRCwgMHg5OCwgMHhGRSwgMHgwNCwgMHgwNCwKKwkgMHgwMCwgMHg3RiwgMHgwOCwgMHg3RSwgMHgwRSwgMHhGQSwgMHgzQiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCOCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHgwRSwgMHhGMiwgMHgyQiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNywgMHhGRSwKKwkgMHhGRCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgzMiwgMHgwMCwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgwRCwgMHgwNCwgMHgxQiwgMHg2MCwgMHhEMCwgMHg2NCwgMHgyQiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHgyMSwgMHgwMCwgMHg0NiwgMHg0NSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwKKwkgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwKKwkgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywgMHgwNSwgMHhGQSwgMHhCNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhGRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg0QSwgMHhEQiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhCRSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgwRCwgMHgwMCwgMHgxQiwgMHg2MCwKKwkgMHhCMiwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHgxOCwgMHgwMCwgMHgxQiwgMHg2MCwgMHhDQSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwKKwkgMHgwMywgMHgwMCwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgwQiwgMHgxOCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgxMSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHg5MCwgMHhGMywKKwkgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHg5MCwgMHhGQiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGQiwgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwKKwkgMHhBMiwgMHhGRiwgMHg5MywgMHhGMywgMHg4RiwgMHhGMywgMHhDQywgMHg4MCwgMHhGQSwgMHhBMCwgMHgwMSwgMHgxNCwgMHgxRSwgMHgwNSwgMHhCMywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgxOCwgMHgwMywgMHhGMCwgMHg2NywgMHgwRSwgMHhGQSwgMHgxQiwgMHg2MCwKKwkgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGNiwgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHg5MywgMHhGMywgMHg4RiwgMHhGMywgMHhDQywgMHg4MywKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHgxNSwgMHg5MywgMHhGRCwgMHg4RiwgMHhGQiwgMHhENCwgMHhGRSwgMHg5MiwgMHhGMywgMHg5MCwgMHhGMywgMHgwMCwgMHhBOCwKKwkgMHg5MSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyNywgMHgwNSwgMHhCMywgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgyMSwgMHgwMywgMHgwMCwgMHg2MywgMHg5MiwgMHhGMywgMHgwRSwgMHhGQywgMHhDQywgMHg4NCwgMHhGRiwgMHgzQSwKKwkgMHg5MiwgMHhGQiwgMHg5OCwgMHhGRSwgMHgwMywgMHgwNCwgMHgwOCwgMHhCQiwgMHgwRSwgMHhGQywgMHgzQiwgMHhGRiwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwKKwkgMHgxQiwgMHg2MCwgMHhCOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGNywgMHg2NCwgMHgzQSwgMHg0MiwgMHg0QSwgMHhEQiwgMHg5MCwgMHhGMywgMHgwRSwgMHhGMiwgMHhEQywgMHg4MywgMHgwOCwgMHhCMCwKKwkgMHg5MCwgMHhGRCwgMHgwOCwgMHgyOCwgMHhGNywgMHhGRSwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCOSwgMHhGRSwgMHgxMywgMHhGRiwgMHgyNCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHhBMiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgwOSwgMHhGNCwKKwkgMHgwRSwgMHhGMiwgMHgwNSwgMHgxOCwgMHgwOCwgMHhCQywgMHgwRSwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHgwMSwgMHgwMCwgMHhEOCwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHgyNSwgMHg0NiwgMHgzRSwgMHhGMiwgMHgwMCwgMHhGNCwgMHgwOCwgMHhGMCwgMHgyNSwgMHg0NiwgMHgwNiwgMHhCNCwgMHhGRiwgMHg3RiwKKwkgMHgxMCwgMHhCQywgMHgwNiwgMHgyNiwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgzRSwgMHhGMiwgMHgzRiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgwOCwgMHgyQSwKKwkgMHg2NCwgMHg0NywgMHgzRiwgMHhGQSwgMHg2MCwgMHg0NSwgMHgxRiwgMHg2MCwgMHg2MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhBMywgMHhGQywgMHhBQiwgMHhGQywKKwkgMHg5MSwgMHhGQywgMHhENCwgMHg4MCwgMHhFMCwgMHg2MCwgMHhDMSwgMHg2NSwgMHhBNSwgMHg4MCwgMHgwMSwgMHgwNCwgMHgwNywgMHgwMywgMHgyMywgMHhGMCwKKwkgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhGMiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGNCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwNCwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg5OCwgMHhGMSwKKwkgMHgxRSwgMHg2MCwgMHhGQywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg0NiwgMHgwMCwgMHgzRSwgMHhGMCwKKwkgMHg4OSwgMHhGMSwgMHg2NCwgMHg0NywgMHgwNywgMHhCNCwgMHgwNywgMHgzNiwgMHgzQiwgMHgwMCwgMHgwNCwgMHgwMywgMHhDQywgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhDMCwgMHg4MywgMHgyRCwgMHgwMCwgMHgyQywgMHhGMiwgMHg4OCwgMHhGMSwgMHgwMSwgMHhCMCwgMHg2NCwgMHg0MywgMHgzNSwgMHgwMiwgMHgyRSwgMHhGMiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyRSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyQywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwKKwkgMHg2MywgMHg0NiwgMHgwNiwgMHhGMCwgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NCwgMHgwQywgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgyNiwgMHgwNCwgMHgwMCwKKwkgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwNywgMHhGQywgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwgMHgxMCwgMHgxQiwKKwkgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDOCwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHgwRiwgMHgwMCwKKwkgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxQiwgMHg2MCwgMHhBQywgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwRSwgMHhGMiwgMHhDRSwgMHhGRSwgMHgxMCwgMHhBQywgMHgwRSwgMHhGQSwgMHhFQiwgMHg2MCwKKwkgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQiwgMHg4NCwgMHhDOSwgMHg4MywgMHhGRiwgMHhGRiwgMHgwOCwgMHgwNCwgMHg1OCwgMHhEMSwgMHhBNSwgMHhEOCwKKwkgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHhGMCwgMHgyMSwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEOSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwKKwkgMHg3RiwgMHhGOSwgMHgwQywgMHg2MCwgMHgzOCwgMHg2MiwgMHg0MCwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHgwNCwgMHg2NSwgMHgwQywgMHg2MCwgMHgzOCwgMHg2MSwgMHg0OCwgMHg2NCwgMHgzRSwgMHg2MywgMHg3QywgMHhBOCwKKwkgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHhGOSwgMHgxRiwgMHgyMSwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwRCwgMHg2MCwgMHgxQywgMHg2NSwgMHgwMiwgMHhGRSwgMHg2NCwgMHg0NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NywKKwkgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHgzRSwgMHhGQiwgMHg2MCwgMHg0MiwgMHg2MSwgMHg0NCwKKwkgMHgwMywgMHhBMiwgMHg2MCwgMHhGRSwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg0NCwgMHgwQywgMHg2MCwgMHgzQSwgMHg2NSwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg0MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHg3RiwgMHhGOSwgMHgwMCwgMHg2NCwKKwkgMHg0MCwgMHg0MSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhBNiwgMHgwMCwgMHg0QSwgMHg2NCwgMHhBMCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0MiwKKwkgMHg4MCwgMHgyQiwgMHgwNCwgMHgwMCwgMHhGRiwgMHhCNCwgMHg0MCwgMHg0MiwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0MSwgMHg4OCwgMHhGMywgMHg0NiwgMHg0QiwKKwkgMHg4NywgMHhGMywgMHg2MCwgMHg0NiwgMHhFMCwgMHg4MywgMHhBQiwgMHg0NiwgMHgyNiwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NSwgMHhGOCwgMHhBQiwgMHg0NiwKKwkgMHgyNywgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NiwgMHhGOCwgMHhBQiwgMHg0NiwgMHgyOCwgMHhGMCwgMHhBQiwgMHg0NiwgMHg1NywgMHhGOCwgMHg2NiwgMHg0NCwKKwkgMHgwMiwgMHhBNiwgMHhGMSwgMHgxRiwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhBQiwgMHg0NiwgMHgwQywgMHg2MCwgMHg3QSwgMHg2NSwKKwkgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwKKwkgMHg1MiwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwKKwkgMHhBQiwgMHg0NiwgMHhGMCwgMHhBMSwgMHg2RSwgMHg2NCwgMHgwRSwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwKKwkgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwQywgMHg2MCwgMHhEQywgMHg2NSwgMHhDNCwgMHg4MSwKKwkgMHg2MCwgMHg0NSwgMHhDOSwgMHg4MSwgMHg2MiwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMSwgMHg0NCwKKwkgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHhBQiwgMHg0NiwgMHhGOCwgMHhBMSwgMHhBRSwgMHg2NCwgMHgwNiwgMHg2MywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwKKwkgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHg2NSwgMHg0NCwgMHgwQywgMHg2MCwgMHhGQywgMHg2NSwgMHhDNCwgMHg4MSwgMHhDOSwgMHg4MSwgMHg2QSwgMHg2NCwKKwkgMHgwNiwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyMiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwKKwkgMHhDNCwgMHg4NCwgMHgwQywgMHg2MCwgMHhDMiwgMHg2NSwgMHhDNCwgMHg4MSwgMHg3MiwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHhBQiwgMHg0NiwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGQSwgMHhBMSwgMHg4OCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHgzNywgMHhGMCwgMHgyMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHgyMiwgMHg0NCwKKwkgMHgzRCwgMHhGQiwgMHg2MCwgMHg0MSwgMHgwMiwgMHhGRSwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHhGOCwgMHg4NCwgMHgzQywgMHhGQiwgMHgwQywgMHg2MCwKKwkgMHhCRSwgMHg2MywgMHg4OCwgMHhGRiwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHgzQiwgMHhGRCwgMHg2NCwgMHg0NywKKwkgMHg4MCwgMHhCRiwgMHg2MCwgMHg1QywgMHgyMiwgMHg0MywgMHg4MCwgMHg2MSwgMHg4OCwgMHhGRiwgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwKKwkgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwgMHhCMSwgMHg4NCwgMHgzNywgMHhGQSwgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4MywKKwkgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwgMHgwMiwgMHhBNiwgMHgzNywgMHhGMCwgMHg2NiwgMHg0NCwgMHhCMSwgMHg5QywgMHgzNywgMHhGOCwgMHgwMiwgMHhBNiwKKwkgMHhGQSwgMHgxRiwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHhGMiwgMHgyNSwgMHhGMCwKKwkgMHgwMiwgMHhBOCwgMHgwMCwgMHg2NywgMHgyNCwgMHgwMiwgMHgzRCwgMHhGMSwgMHg2NCwgMHg0NCwgMHgwMywgMHhCNCwgMHg0MCwgMHg0MiwgMHhEMCwgMHg4MCwKKwkgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHhCNywgMHhGNCwgMHg4MCwgMHg2MSwgMHgwMiwgMHgwMiwgMHhFMywgMHg4MywgMHhFQiwgMHg4MywKKwkgMHgyMiwgMHg0NCwgMHg4OCwgMHhGRiwgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHg4RCwgMHhGRiwgMHg2MSwgMHg0NywgMHgzMSwgMHg5MSwKKwkgMHg5RCwgMHg4NSwgMHhBNywgMHg4MywgMHgzNywgMHhGQywgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4MywgMHhFMywgMHg4MywgMHg2NiwgMHg0NCwKKwkgMHgwMiwgMHhBNiwgMHhCNywgMHhGMiwgMHg2NiwgMHg0NCwgMHhBNSwgMHg4MSwgMHhCNywgMHhGQSwgMHgwMiwgMHhBNiwgMHhGQSwgMHgxRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHg2NCwgMHgyMywgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNCwgMHhGQSwgMHgwNCwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHg2MiwgMHg0MSwgMHgwQywgMHg2MCwgMHhDMiwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHgyQiwgMHg0MywKKwkgMHgwMCwgMHg3QywgMHg1OSwgMHhEOCwgMHg0RiwgMHg4QiwgMHgwNiwgMHhBNCwgMHhGNiwgMHgwMiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwgMHg3RiwgMHhGOSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0RSwgMHgwMCwgMHgyNywgMHhGMiwKKwkgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgyQSwgMHgwMCwgMHg0MywgMHg0QiwKKwkgMHhBQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg4MCwgMHg2MCwgMHgzMCwgMHg3QywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0RSwgMHg2MSwgMHg2RSwgMHg2NCwKKwkgMHgwRSwgMHg2MywgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHg4OCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwgMHg5OCwgMHg2NCwgMHgwNCwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHhEOSwgMHg4MSwgMHhBRSwgMHg2NCwgMHgwRSwgMHg2MywKKwkgMHhBQiwgMHg0NiwgMHg1OSwgMHhEMCwgMHhBQiwgMHg0NiwgMHg1OCwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMSwKKwkgMHg3RiwgMHhGOSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgzMSwgMHgwMCwgMHgyNywgMHhGMiwgMHgxMiwgMHg2MCwgMHhDRSwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwKKwkgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHg4OCwgMHhGMywgMHgwOCwgMHhGRSwKKwkgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMSwgMHgwMywgMHgwRCwgMHgwMCwgMHg0MywgMHg0QiwgMHhBQiwgMHg0NiwgMHgzNywgMHhGMiwgMHg4MCwgMHg2MCwKKwkgMHgzMCwgMHg2MSwgMHg5RCwgMHg4NSwgMHhBNCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhBQiwgMHg0NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg2MSwgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NywgMHgyMCwgMHg2MSwgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRSwgMHhGMiwgMHhBQywgMHhGMSwgMHgwOCwgMHhCMCwKKwkgMHgxOSwgMHhGOCwgMHg0QSwgMHgwMiwgMHgwNywgMHgyMywgMHgyQiwgMHgwMCwgMHg2MCwgMHg0NywgMHgwNywgMHhCNCwgMHg4OSwgMHhGMSwgMHhDQywgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHg0MCwgMHg4QSwgMHhBQSwgMHg0NiwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMCwgMHgwNSwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwKKwkgMHgyQywgMHhGQywgMHgyRCwgMHhGOCwgMHgyRSwgMHhGQSwgMHhDQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhDQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhDRCwgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHg0NiwgMHg0QSwgMHgwMCwgMHhGNCwgMHgwMiwgMHhGMiwgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwKKwkgMHgzMiwgMHhGQywgMHgzMywgMHhGOCwgMHgzNCwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwNSwgMHhGMiwgMHgwNiwgMHhGMCwgMHgwNywgMHhGMiwgMHg2MCwgMHg0MywKKwkgMHhBQSwgMHg0NiwgMHgzNiwgMHhGQywgMHgzNywgMHhGOCwgMHgzOCwgMHhGQSwgMHgwMywgMHg2MCwgMHgwOCwgMHg2NCwgMHgxQywgMHgwMCwgMHg2NywgMHhGMSwKKwkgMHgyRiwgMHhGOCwgMHg2OCwgMHhGMSwgMHgzMCwgMHhGOCwgMHg2OSwgMHhGMSwgMHgzMSwgMHhGOCwgMHg0NiwgMHg0QSwgMHgwMCwgMHhGNCwgMHgwMiwgMHhGMiwKKwkgMHgwMywgMHhGMCwgMHgwNCwgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgyQywgMHhGQywgMHgyRCwgMHhGOCwgMHgyRSwgMHhGQSwgMHhBQSwgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwNiwgMHhGMCwgMHgwNywgMHhGMiwgMHg2MCwgMHg0MywgMHhBQSwgMHg0NiwgMHgzMiwgMHhGQywgMHgzMywgMHhGOCwgMHgzNCwgMHhGQSwKKwkgMHgwMiwgMHg2MCwgMHgwOCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgyQSwgMHhGQSwgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwgMHg1OSwgMHgwMCwgMHhGRiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwKKwkgMHgwNCwgMHg2NSwgMHgwNCwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxMiwgMHgwMCwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwQywgMHg2NCwgMHhBNSwgMHhEQiwKKwkgMHgwRCwgMHgwMCwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwNiwgMHg2NCwgMHhBNSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNCwgMHg2NSwgMHgwOCwgMHg2NCwgMHhBNSwgMHhEQiwgMHhGNCwgMHg2MCwgMHhEOSwgMHg2NCwKKwkgMHg4MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGMywgMHg2NSwgMHhGQiwKKwkgMHg4MywgMHhGQiwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHg4MiwgMHhGQiwgMHgwNywgMHg2NCwgMHg4NCwgMHhGQiwgMHhGNCwgMHg2MCwgMHhEOSwgMHg2NCwKKwkgMHg4MCwgMHhGQiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxOSwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBRiwgMHg2MCwgMHhGRCwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGNCwgMHg2MCwgMHhDNiwgMHg2MywKKwkgMHg4MCwgMHhGRCwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHhFQiwgMHg2MCwgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNywgMHg2MCwgMHg5QiwgMHg2MywKKwkgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgxQiwgMHg2MCwgMHhFMCwgMHg2MywgMHgxQiwgMHg2MCwKKwkgMHhCMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGOSwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBNywgMHgwMSwgMHgwMCwgMHgzNiwgMHhBOCwgMHgwMSwgMHgwMSwgMHgzNiwKKwkgMHhBQiwgMHgwMSwgMHgwMiwgMHgzNiwgMHhBRSwgMHgwMSwgMHgwMywgMHgzNiwgMHhCNSwgMHgwMSwgMHgwNCwgMHgzNiwgMHhEMSwgMHgwMSwgMHgwNSwgMHgzNiwKKwkgMHhDRiwgMHgwMSwgMHgwNiwgMHgzNiwgMHhGMSwgMHgwMSwgMHgwNywgMHgzNiwgMHhDQiwgMHgwMSwgMHgwOCwgMHgzNiwgMHhCNywgMHgwMSwgMHgwOSwgMHgzNiwKKwkgMHgwQywgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwQywgMHgzNiwgMHgxNywgMHgwMCwgMHgwRCwgMHgzNiwKKwkgMHgwRCwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxRSwgMHgwMCwgMHgwRiwgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHgwMCwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgzMiwgMHg0NSwgMHhCNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg2MCwgMHhDMSwgMHg2MywKKwkgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwNSwgMHgwMCwgMHg5MCwgMHg2MCwgMHgwMCwgMHhFOCwgMHhBRiwgMHg2MCwgMHhGRCwgMHg2MywKKwkgMHgwNCwgMHgwMCwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwgMHhCMCwgMHg2MCwgMHhBQiwgMHg2MywgMHgyOCwgMHhFOCwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg5MSwgMHg2MCwKKwkgMHgwMCwgMHhFOCwgMHgyOCwgMHhFOCwgMHhEOSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgzMiwgMHg0NSwgMHhBNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHg5OSwgMHhGRiwKKwkgMHhBNSwgMHg0RiwgMHhGRiwgMHhCNCwgMHgwNywgMHhGQiwgMHg5OCwgMHhGRiwgMHhBNywgMHg2MCwgMHg5QiwgMHg2MywgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwKKwkgMHhBMCwgMHhERCwgMHg2MiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MiwgMHg2RiwgMHg2RiwgMHg3NCwgMHg2MywgMHg2RiwKKwkgMHg2NCwgMHg2NSwgMHgyMCwgMHgyMSwgMHgyMSwgMHgyMCwgMHgyMCwgMHgwMCwgMHg1MywgMHg1NCwgMHg0MSwgMHgyRiwgMHg0MSwgMHg1MCwgMHgyMCwgMHg0NiwKKwkgMHg3NSwgMHg2RSwgMHg2MywgMHgyNywgMHg3MywgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwOCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwNSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwKKwkgMHgzNiwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzQiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgxNywgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHg0QSwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0QSwgMHgwMCwgMHgxRSwgMHgwMCwgMHgwQywgMHgwMCwgMHgwOCwgMHgwMCwKKwkgMHg1NywgMHgwMCwgMHg0RCwgMHgwMCwgMHg1NywgMHgwMCwgMHgyQiwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHg1RCwgMHgwMCwgMHg1MywgMHgwMCwKKwkgMHg1RCwgMHgwMCwgMHgzMSwgMHgwMCwgMHgxRiwgMHgwMCwgMHgwOCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzRfZGF0YSAqLworCitzdGF0aWMgY29uc3QgQ0ZHX0lERU5USVRZX1NUUkNUIGZ3X2ltYWdlX2luZm9pZGVudGl0eVtdID0geworCXsKKwkJc2l6ZW9mKCBDRkdfSURFTlRJVFlfU1RSQ1QgKSAvIHNpemVvZihoY2ZfMTYpIC0gMSwKKwkJQ0ZHX0ZXX0lERU5USVRZLAorCQlDT01QX0lEX0ZXX0FQLAorCQkyLAkJCQkJCQkvL1ZhcmlhbnQKKwkJMiwJCQkJCQkJLy9NYWpvcgorCQkzNgkJCQkJCQkvL01pbm9yCisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAgfQkJLy9lbmRzZW50aW5lbAorfTsKKworc3RhdGljIGNvbnN0IENGR19QUk9HX1NUUkNUIGZ3X2ltYWdlX2NvZGVbXSA9IHsKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MDE0NiwJCS8vIHNpemVvZihmd19pbWFnZV8xX2RhdGEpLAorCQkweDAwMDAwMDYwLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8xX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgxOTE4LAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzJfZGF0YSksCisJCTB4MDAwMDBDMTYsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzJfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxYmMsCQkvLyBzaXplb2YoZndfaW1hZ2VfM19kYXRhKSwKKwkJMHgwMDFFMjUyRSwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfM19kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4YWIyOCwJCS8vIHNpemVvZihmd19pbWFnZV80X2RhdGEpLAorCQkweDAwMUY0MDAwLAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV80X2RhdGEKKwl9LAorCXsKKwkJNSwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1NUT1AsCQkJCS8vIG1vZGUKKwkJMDAwMCwKKyAJMHgwMDBGMTI5NywJCQkJCS8vIFN0YXJ0IGV4ZWN1dGlvbiBhZGRyZXNzCisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAwMDAwLCAwMDAwLCAwMDAwMDAwMH0KK307CisKK3N0YXRpYyBjb25zdCBDRkdfUkFOR0UyMF9TVFJDVCBmd19pbWFnZV9pbmZvY29tcGF0W10gPSB7CisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfRldfU1VQX1JBTkdFLAorCQlDT01QX1JPTEVfU1VQTCwKKwkJQ09NUF9JRF9BUEYsCisJCXsKKwkJCXsgMiwgMiwgNCB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19NRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfTUZJLAorCQl7CisJCQl7IDQsIDYsIDcgfSwgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJCXsgNSwgNiwgNyB9LCAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQkJeyA2LCA2LCA3IH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQSwKKwkJQ09NUF9ST0xFX0FDVCwKKwkJQ09NUF9JRF9DRkksCisJCXsKKwkJCXsgMiwgMSwgMiB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7IDAwMDAsIDAwMDAsIDAwMDAsIDAwMDAsIHsgeyAwMDAwLCAwMDAwLCAwMDAwIH0gfSB9CQkJLy9lbmRzZW50aW5lbAorfTsKKworbWVtaW1hZ2UgZndfaW1hZ2UgPSB7CisJIkZVUFU3RDM3ZGhmd2NpXDAwMUMiLAkJCS8vc2lnbmF0dXJlLCA8Zm9ybWF0IG51bWJlcj4sIEMvQmluIHR5cGUKKwkoQ0ZHX1BST0dfU1RSQ1QgKikgZndfaW1hZ2VfY29kZSwKKwkweDAwMEYxMjk3LAorCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHBkYXBsdWcKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwcmlwbHVnCisJKENGR19SQU5HRTIwX1NUUkNUICopIGZ3X2ltYWdlX2luZm9jb21wYXQsCisJKENGR19JREVOVElUWV9TVFJDVCAqKSBmd19pbWFnZV9pbmZvaWRlbnRpdHksCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2FwX2gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDkxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9hcF9oMjUuYwpAQCAtMCwwICsxLDQwOTQgQEAKKy8qCisgKiBGaWxlOglhcF9oNTQuMTI0CisgKgorICogQWJzdHJhY3Q6CVRoaXMgZmlsZSBjb250YWlucyBtZW1vcnkgaW1hZ2UgJ2Z3X2ltYWdlJy4KKyAqCisgKiBDb250ZW50czoJVG90YWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGltYWdlOiA2MzE0NiBieXRlcy4KKyAqCQlUb3RhbCBudW1iZXIgb2YgYmxvY2tzOiA0IGJsb2Nrcy4KKyAqCQlCbG9jayAgMSA6IGxvYWQgYWRkcmVzcyAwMDAwMDA2MCwgMzI4IGJ5dGVzLgorICoJCUJsb2NrICAyIDogbG9hZCBhZGRyZXNzIDAwMDAwQzE2LCA5MjY2IGJ5dGVzLgorICoJCUJsb2NrICAzIDogbG9hZCBhZGRyZXNzIDAwMUUzMDQ4LCA2NDc2IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0NzA3NiBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMiAodmFyaWFudCAzKSB2ZXJzaW9uIDEuMjQKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgOCAodmFyaWFudCA0KSA6IDEgLSAxCisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDcpIDogMyAtIDMKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgOCkgOiAxIC0gMQorICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMiAodmFyaWFudCA0KSA6IDEgLSAyCisgKgorICogR2VuZXJhdGVkOglieSBnOlxmd1xmdXB1My5leGUgdmVyc2lvbiA0LjI2CisgKgorICogQ29tbWFuZGxpbmU6CWc6XGZ3XGZ1cHUzLmV4ZSAvZj00IC9uPWZ3X2ltYWdlIC9pPXQzMDEyNDAwLmhleAorICovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkJCQkvLyB0byBnZXQgaGNmXzE2IGV0YyBkZWZpbmVkIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2V0dGluZ3Mgd2hpY2ggaW5sdWVuY2UgbWRkLmggb3IgZGhmLmgKKyNpbmNsdWRlICJtZGQuaCIgICAJCQkJLy90byBnZXQgQ09NUF9JRF9TVEEgZXRjIGRlZmluZWQKKyNpbmNsdWRlICJkaGYuaCIgICAJCQkJLy91c2VkIHRvIGJlICJmaGZtZW0uaCIsIHRvIGdldCBtZW1ibG9jayxwbHVncmVjb3JkLAorCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMV9kYXRhW10gPSB7CisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4MEMsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MEQsIDB4RDYsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsCisJIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MTAsIDB4MjcsIDB4MTQsIDB4MDAsCisJIDB4RDAsIDB4MDcsIDB4RDAsIDB4MDcsIDB4MTAsIDB4MjcsIDB4MkYsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MzIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDksIDB4MkIsIDB4MDksIDB4MkIsIDB4MDksIDB4RkYsIDB4MEYsCisJIDB4RjAsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzIsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8xX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzJfZGF0YVtdID0geworCSAweDdDLCAweEE0LCAweDAwLCAweDE2LCAweDA4LCAweDQwLCAweDBGLCAweEQyLCAweEUxLCAweDI4LCAweEE1LCAweDdDLCAweDUwLCAweDMwLCAweEYxLCAweDg0LAorCSAweDQ0LCAweDA4LCAweEFCLCAweEFFLCAweEE1LCAweEI4LCAweEZDLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLAorCSAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweEM2LCAweDg0LCAweEY4LAorCSAweDk5LCAweEVFLCAweDhELCAweEY2LCAweDBELCAweEZGLCAweEJELCAweEQ2LCAweEIxLCAweERFLCAweDU0LCAweDkxLCAweDUwLCAweDYwLCAweDAzLCAweDAyLAorCSAweEE5LCAweENFLCAweDdELCAweDU2LCAweDE5LCAweEU3LCAweDYyLCAweEI1LCAweEU2LCAweDRELCAweDlBLCAweEVDLCAweDQ1LCAweDhGLCAweDlELCAweDFGLAorCSAweDQwLCAweDg5LCAweDg3LCAweEZBLCAweDE1LCAweEVGLCAweEVCLCAweEIyLCAweEM5LCAweDhFLCAweDBCLCAweEZCLCAweEVDLCAweDQxLCAweDY3LCAweEIzLAorCSAweEZELCAweDVGLCAweEVBLCAweDQ1LCAweEJGLCAweDIzLCAweEY3LCAweDUzLCAweDk2LCAweEU0LCAweDVCLCAweDlCLCAweEMyLCAweDc1LCAweDFDLCAweEUxLAorCSAweEFFLCAweDNELCAweDZBLCAweDRDLCAweDVBLCAweDZDLCAweDQxLCAweDdFLCAweDAyLCAweEY1LCAweDRGLCAweDgzLCAweDVDLCAweDY4LCAweEY0LCAweDUxLAorCSAweDM0LCAweEQxLCAweDA4LCAweEY5LCAweDkzLCAweEUyLCAweDczLCAweEFCLCAweDUzLCAweDYyLCAweDNGLCAweDJBLCAweDBDLCAweDA4LCAweDUyLCAweDk1LAorCSAweDY1LCAweDQ2LCAweDVFLCAweDlELCAweDI4LCAweDMwLCAweEExLCAweDM3LCAweDBGLCAweDBBLCAweEI1LCAweDJGLCAweDA5LCAweDBFLCAweDM2LCAweDI0LAorCSAweDlCLCAweDFCLCAweDNELCAweERGLCAweDI2LCAweENELCAweDY5LCAweDRFLCAweENELCAweDdGLCAweDlGLCAweEVBLCAweDFCLCAweDEyLCAweDlFLCAweDFELAorCSAweDc0LCAweDU4LCAweDJFLCAweDM0LCAweDJELCAweDM2LCAweEIyLCAweERDLCAweEVFLCAweEI0LCAweEZCLCAweDVCLCAweEY2LCAweEE0LCAweDRELCAweDc2LAorCSAweDYxLCAweEI3LCAweENFLCAweDdELCAweDdCLCAweDUyLCAweDNFLCAweERELCAweDcxLCAweDVFLCAweDk3LCAweDEzLCAweEY1LCAweEE2LCAweDY4LCAweEI5LAorCSAweDAwLCAweDAwLCAweDJDLCAweEMxLCAweDYwLCAweDQwLCAweDFGLCAweEUzLCAweEM4LCAweDc5LCAweEVELCAweEI2LCAweEJFLCAweEQ0LCAweDQ2LCAweDhELAorCSAweEQ5LCAweDY3LCAweDRCLCAweDcyLCAweERFLCAweDk0LCAweEQ0LCAweDk4LCAweEU4LCAweEIwLCAweDRBLCAweDg1LCAweDZCLCAweEJCLCAweDJBLCAweEM1LAorCSAweEU1LCAweDRGLCAweDE2LCAweEVELCAweEM1LCAweDg2LCAweEQ3LCAweDlBLCAweDU1LCAweDY2LCAweDk0LCAweDExLCAweENGLCAweDhBLCAweDEwLCAweEU5LAorCSAweDA2LCAweDA0LCAweDgxLCAweEZFLCAweEYwLCAweEEwLCAweDQ0LCAweDc4LCAweEJBLCAweDI1LCAweEUzLCAweDRCLCAweEYzLCAweEEyLCAweEZFLCAweDVELAorCSAweEMwLCAweDgwLCAweDhBLCAweDA1LCAweEFELCAweDNGLCAweEJDLCAweDIxLCAweDQ4LCAweDcwLCAweDA0LCAweEYxLCAweERGLCAweDYzLCAweEMxLCAweDc3LAorCSAweDc1LCAweEFGLCAweDYzLCAweDQyLCAweDMwLCAweDIwLCAweDFBLCAweEU1LCAweDBFLCAweEZELCAweDZELCAweEJGLCAweDRDLCAweDgxLCAweDE0LCAweDE4LAorCSAweDM1LCAweDI2LCAweDJGLCAweEMzLCAweEUxLCAweEJFLCAweEEyLCAweDM1LCAweENDLCAweDg4LCAweDM5LCAweDJFLCAweDU3LCAweDkzLCAweEYyLCAweDU1LAorCSAweDgyLCAweEZDLCAweDQ3LCAweDdBLCAweEFDLCAweEM4LCAweEU3LCAweEJBLCAweDJCLCAweDMyLCAweDk1LCAweEU2LCAweEEwLCAweEMwLCAweDk4LCAweDE5LAorCSAweEQxLCAweDlFLCAweDdGLCAweEEzLCAweDY2LCAweDQ0LCAweDdFLCAweDU0LCAweEFCLCAweDNCLCAweDgzLCAweDBCLCAweENBLCAweDhDLCAweDI5LCAweEM3LAorCSAweEQzLCAweDZCLCAweDNDLCAweDI4LCAweDc5LCAweEE3LCAweEUyLCAweEJDLCAweDFELCAweDE2LCAweDc2LCAweEFELCAweDNCLCAweERCLCAweDU2LCAweDY0LAorCSAweDRFLCAweDc0LCAweDFFLCAweDE0LCAweERCLCAweDkyLCAweDBBLCAweDBDLCAweDZDLCAweDQ4LCAweEU0LCAweEI4LCAweDVELCAweDlGLCAweDZFLCAweEJELAorCSAweEVGLCAweDQzLCAweEE2LCAweEM0LCAweEE4LCAweDM5LCAweEE0LCAweDMxLCAweDM3LCAweEQzLCAweDhCLCAweEYyLCAweDMyLCAweEQ1LCAweDQzLCAweDhCLAorCSAweDU5LCAweDZFLCAweEI3LCAweERBLCAweDhDLCAweDAxLCAweDY0LCAweEIxLCAweEQyLCAweDlDLCAweEUwLCAweDQ5LCAweEI0LCAweEQ4LCAweEZBLCAweEFDLAorCSAweDA3LCAweEYzLCAweDI1LCAweENGLCAweEFGLCAweENBLCAweDhFLCAweEY0LCAweEU5LCAweDQ3LCAweDE4LCAweDEwLCAweEQ1LCAweDZGLCAweDg4LCAweEYwLAorCSAweDZGLCAweDRBLCAweDcyLCAweDVDLCAweDI0LCAweDM4LCAweEYxLCAweDU3LCAweEM3LCAweDczLCAweDUxLCAweDk3LCAweDIzLCAweENCLCAweDdDLCAweEExLAorCSAweDlDLCAweEU4LCAweDIxLCAweDNFLCAweERELCAweDk2LCAweERDLCAweDYxLCAweDg2LCAweDBELCAweDg1LCAweDBGLCAweDkwLCAweEUwLCAweDQyLCAweDdDLAorCSAweEM0LCAweDcxLCAweEFBLCAweENDLCAweEQ4LCAweDkwLCAweDA1LCAweDA2LCAweDAxLCAweEY3LCAweDEyLCAweDFDLCAweEEzLCAweEMyLCAweDVGLCAweDZBLAorCSAweEY5LCAweEFFLCAweEQwLCAweDY5LCAweDkxLCAweDE3LCAweDU4LCAweDk5LCAweDI3LCAweDNBLCAweEI5LCAweDI3LCAweDM4LCAweEQ5LCAweDEzLCAweEVCLAorCSAweEIzLCAweDJCLCAweDMzLCAweDIyLCAweEJCLCAweEQyLCAweDcwLCAweEE5LCAweDg5LCAweDA3LCAweEE3LCAweDMzLCAweEI2LCAweDJELCAweDIyLCAweDNDLAorCSAweDkyLCAweDE1LCAweDIwLCAweEM5LCAweDQ5LCAweDg3LCAweEZGLCAweEFBLCAweDc4LCAweDUwLCAweDdBLCAweEE1LCAweDhGLCAweDAzLCAweEY4LCAweDU5LAorCSAweDgwLCAweDA5LCAweDE3LCAweDFBLCAweERBLCAweDY1LCAweDMxLCAweEQ3LCAweEM2LCAweDg0LCAweEI4LCAweEQwLCAweEMzLCAweDgyLCAweEIwLCAweDI5LAorCSAweDc3LCAweDVBLCAweDExLCAweDFFLCAweENCLCAweDdCLCAweEZDLCAweEE4LCAweEQ2LCAweDZELCAweDNBLCAweDJDLCAweDAwLCAweDMwLCAweDAwLCAweDMxLAorCSAweDAwLCAweDMzLCAweDAwLCAweDM0LCAweDAwLCAweDM1LCAweDAwLCAweDM2LCAweDAwLCAweDM3LCAweDAwLCAweDM4LCAweDAwLCAweDM4LCAweDAwLCAweDNBLAorCSAweDAwLCAweDNCLCAweDAwLCAweDNDLCAweDAwLCAweDNELCAweDAwLCAweDNFLCAweDAwLCAweDNGLCAweDAwLCAweDNGLCAweDU5LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU5LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweDIxLCAweDEwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDIwLCAweDAzLCAweEUwLCAweDAxLCAweDQwLCAweDAxLCAweDIwLCAweDAzLCAweEUwLCAweDAxLAorCSAweDQwLCAweDAxLCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDBBLCAweDAyLCAweDE0LCAweDA1LCAweDMyLCAweDBCLCAweDM3LAorCSAweDA4LCAweDUwLCAweDBCLCAweDZFLCAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweDBCLCAweDAwLCAweDE2LCAweDAwLCAweDBDLCAweDAwLCAweDEyLCAweDAwLAorCSAweDE4LCAweDAwLCAweDI0LCAweDAwLCAweDMwLCAweDAwLCAweDQ4LCAweDAwLCAweDYwLCAweDAwLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDM5LCAweDAwLCAweDM5LCAweDAwLCAweDIwLCAweDAwLCAweDM5LCAweDAwLAorCSAweDM5LCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEE0LCAweDEwLCAweEYyLCAweDEwLCAweEFBLCAweDEwLCAweEVDLCAweDEwLCAweEIwLCAweDEwLCAweEU2LCAweDEwLCAweEI2LCAweDEwLAorCSAweEUwLCAweDEwLCAweEJDLCAweDEwLCAweERBLCAweDEwLCAweEMyLCAweDEwLCAweEQ0LCAweDEwLCAweEM4LCAweDEwLCAweENFLCAweDEwLCAweDA3LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE2LCAweDIyLCAweDAwLCAweDA0LCAweDA4LCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDI2LCAweDAwLCAweDA0LCAweDA5LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE2LCAweDJBLCAweDAwLCAweDA0LCAweDBBLCAweDAxLCAweDAwLCAweDAwLCAweDE2LCAweDJFLCAweDAwLCAweDA0LCAweDBCLCAweDAxLAorCSAweDAwLCAweDAwLCAweDEwLCAweDI0LCAweDA0LCAweDA0LCAweDBDLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDI4LCAweDA0LCAweDA0LCAweDBELCAweDAxLAorCSAweDAwLCAweDAwLCAweDEwLCAweDJDLCAweDA0LCAweDA0LCAweDBFLCAweDAxLCAweDAwLCAweDAwLCAweDEwLCAweDMwLCAweDA0LCAweDA0LCAweDBGLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE0LCAweDM0LCAweDA4LCAweDg0LCAweDEwLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDM4LCAweDA4LCAweDg0LCAweDExLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE0LCAweDNDLCAweDA4LCAweDg0LCAweDEyLCAweDAxLCAweDAwLCAweDAwLCAweDE0LCAweDQwLCAweDA4LCAweDg0LCAweDEzLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDY0LCAweDBDLCAweDhCLCAweDE0LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDY4LCAweDBDLCAweDhCLCAweDE1LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDZDLCAweDBDLCAweDhCLCAweDE2LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDcwLCAweDBDLCAweDhCLCAweDE3LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDc0LCAweDBDLCAweDhCLCAweDE4LCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDc4LCAweDBDLCAweDhCLCAweDE5LCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDdDLCAweDBDLCAweDhCLCAweDFBLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDgwLCAweDBDLCAweDhCLCAweDFCLCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDg0LCAweDBDLCAweDhCLCAweDFDLCAweDAxLCAweDAwLCAweDAwLCAweDE3LCAweDg4LCAweDBDLCAweDhCLCAweDFELCAweDAxLAorCSAweDAwLCAweDAwLCAweDE3LCAweDhDLCAweDBDLCAweDhCLCAweDFFLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDk1LCAweDE3LCAweDA0LCAweDFGLCAweDAxLAorCSAweDAwLCAweDAwLCAweDBFLCAweDk5LCAweDE3LCAweDA0LCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweDlELCAweDE3LCAweDA0LCAweDIxLCAweDAxLAorCSAweDAwLCAweDAwLCAweDBFLCAweEExLCAweDE3LCAweDA0LCAweDIyLCAweDAxLCAweDAwLCAweDAwLCAweDBFLCAweEE1LCAweDAwLCAweDAwLCAweDE0LCAweDExLAorCSAweDM0LCAweDExLCAweDU0LCAweDExLCAweDc0LCAweDExLCAweENDLCAweDExLCAweDFDLCAweDExLCAweDNDLCAweDExLCAweDVDLCAweDExLCAweDdDLCAweDExLAorCSAweEQ0LCAweDExLCAweDI0LCAweDExLCAweDQ0LCAweDExLCAweDY0LCAweDExLCAweDg0LCAweDExLCAweERDLCAweDExLCAweDJDLCAweDExLCAweDRDLCAweDExLAorCSAweDZDLCAweDExLCAweDhDLCAweDExLCAweEU0LCAweDExLCAweDk0LCAweDExLCAweDlDLCAweDExLCAweEE0LCAweDExLCAweEFDLCAweDExLCAweEI0LCAweDExLAorCSAweEJDLCAweDExLCAweEM0LCAweDExLCAweEVDLCAweDExLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLAorCSAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDFFLCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCSAweDE3LCAweDE3LCAweDE3LCAweDE3LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDExLCAweDExLCAweDExLCAweDExLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDBFLCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE2LCAweDE2LCAweDE2LCAweDE2LAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLAorCSAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDBBLCAweDBBLCAweDBBLAorCSAweDBBLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDBBLCAweDBBLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LAorCSAweDE0LCAweDE0LCAweDE0LCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDE0LCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLAorCSAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDdGLCAweDlELCAweDlELCAweEExLCAweEFBLCAweDEwLCAweDEwLAorCSAweDlELCAweDlELCAweDA4LCAweDAyLCAweDA2LCAweDAwLCAweEE1LCAweEE1LCAweEFBLCAweEFBLCAweDE3LCAweDE3LCAweEEyLCAweEEyLCAweDE1LCAweDA1LAorCSAweDA3LCAweDAwLCAweEFBLCAweEFBLCAweEI0LCAweEI0LCAweDFDLCAweDFDLCAweEE3LCAweEE3LCAweDFDLCAweDBBLCAweDA4LCAweDAwLCAweEI3LCAweEI3LAorCSAweEMxLCAweEMxLCAweDA5LCAweDA5LCAweEI0LCAweEI0LCAweDI5LCAweDE3LCAweDA4LCAweDAwLCAweEJELCAweEJELCAweEM3LCAweEM3LCAweDBGLCAweDBGLAorCSAweEJBLCAweEJBLCAweDJGLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDE3LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEU0LCAweEYwLCAweEZELCAweEYwLCAweDFGLCAweEYxLCAweDYwLCAweEY2LCAweDlCLCAweEYwLCAweDc5LCAweEY2LCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweENDLCAweEY3LCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDE1LCAweEYzLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDY2LCAweEYzLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweEUzLCAweEYyLCAweEZFLCAweEYyLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweDlCLCAweEYwLAorCSAweEI0LCAweDFDLCAweDU5LCAweEYxLCAweDZDLCAweEYxLCAweDFDLCAweEYyLCAweDIwLCAweEYyLCAweDlCLCAweEYwLCAweDlCLCAweEYwLCAweENGLCAweEYyLAorCSAweDY0LCAweEU2LCAweDNFLCAweEU2LCAweDkyLCAweEU2LCAweEUxLCAweEU2LCAweEE5LCAweEU3LCAweENGLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDEyLCAweEYxLCAweDM1LCAweEYxLCAweDVELCAweEY2LCAweDVELCAweEY2LCAweDZELCAweEY2LCAweDg2LCAweEY2LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEZDLCAweEMwLCAweEYzLCAweEYyLCAweEY1LCAweDVBLCAweDAwLCAweDAyLCAweDAwLCAweEY5LCAweEZGLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweENBLCAweDAwLCAweDAyLCAweDAwLCAweEY3LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEIwLCAweDI2LAorCSAweDA2LCAweDAwLCAweEYwLCAweEZGLCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweEY2LCAweEZGLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDZDLCAweDAwLCAweDAyLCAweDAwLCAweEY0LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDY4LCAweDAxLCAweDAyLCAweDAwLAorCSAweEY1LCAweEZGLCAweEMwLCAweEYzLCAweEZCLCAweEY1LCAweEEyLCAweDI2LCAweDAyLCAweDAwLCAweEVELCAweEZGLCAweEMwLCAweEYzLCAweDBELCAweEY2LAorCSAweDlFLCAweDJCLCAweDAyLCAweDAwLCAweEVDLCAweEZGLCAweEMwLCAweEYzLCAweDNCLCAweEY2LCAweEEwLCAweDJCLCAweDAyLCAweDAwLCAweEVCLCAweEZGLAorCSAweEMwLCAweEYzLCAweDQxLCAweEY2LCAweEEyLCAweDJCLCAweDAyLCAweDAwLCAweEVFLCAweEZGLCAweEMwLCAweEYzLCAweDQ3LCAweEY2LCAweEQ2LCAweDJCLAorCSAweDAyLCAweDAwLCAweERBLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEQwLCAweDEzLCAweDBDLCAweDAwLCAweEVBLCAweEZGLCAweEMwLCAweEYzLAorCSAweEFBLCAweEYzLCAweEVDLCAweDJCLCAweDA2LCAweDAwLCAweEU5LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEYyLCAweDJCLCAweDAyLCAweDAwLAorCSAweEU4LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEY0LCAweDJCLCAweDAyLCAweDAwLCAweEU3LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweEY2LCAweDJCLCAweDAyLCAweDAwLCAweEU2LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEY4LCAweDJCLCAweDAyLCAweDAwLCAweEU1LCAweEZGLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEZBLCAweDJCLCAweDEwLCAweDAwLCAweEU0LCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDBBLCAweDJDLAorCSAweDE4LCAweDAwLCAweERCLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDIyLCAweDJDLCAweDAyLCAweDAwLCAweERDLCAweEZGLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDI0LCAweDJDLCAweDAyLCAweDAwLCAweEUxLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEM2LCAweDJDLCAweDAyLCAweDAwLAorCSAweEUwLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEM0LCAweDJDLCAweDAyLCAweDAwLCAweEUzLCAweEZGLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweEE4LCAweDJDLCAweDAyLCAweDAwLCAweEUyLCAweEZGLCAweDBFLCAweEY0LCAweEFBLCAweEYzLCAweDdFLCAweDJDLCAweDI0LCAweDAwLCAweDAzLCAweEZDLAorCSAweEMwLCAweEYzLCAweDNBLCAweEY1LCAweDkyLCAweDJCLCAweDAyLCAweDAwLCAweDA0LCAweEZDLCAweEMwLCAweEYzLCAweEQwLCAweEYzLCAweEJBLCAweDI2LAorCSAweDIyLCAweDAwLCAweDA2LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEEwLCAweDI2LCAweDAyLCAweDAwLCAweDA3LCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweEZFLCAweDI2LCAweDAyLCAweDAwLCAweDBFLCAweEZDLCAweEMwLCAweEYzLCAweDYzLCAweEY1LCAweDA4LCAweDI3LCAweDIyLCAweDAwLAorCSAweEIxLCAweEZDLCAweEMwLCAweEYzLCAweDg4LCAweEY4LCAweDJBLCAweDI4LCAweDAyLCAweDAwLCAweDIwLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDJFLCAweDI3LCAweDAyLCAweDAwLCAweDI1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNBLCAweDI3LCAweDAyLCAweDAwLCAweDI2LCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNDLCAweDI3LCAweDAyLCAweDAwLCAweDI3LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNFLCAweDI3LAorCSAweDAyLCAweDAwLCAweEIyLCAweEZDLCAweEMwLCAweEYzLCAweEQwLCAweEYzLCAweDRFLCAweDI4LCAweDIyLCAweDAwLCAweEMxLCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDU2LCAweDJDLCAweDIwLCAweDAwLCAweEIwLCAweEZDLCAweEEwLCAweEYzLCAweDhDLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEM0LCAweEZDLCAweEEwLCAweEYzLCAweDU0LCAweEY2LCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEM4LCAweEZDLCAweEEwLCAweEYzLCAweDUyLCAweEY2LAorCSAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEI0LCAweEZDLCAweEEwLCAweEYzLCAweEMwLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEZDLAorCSAweEEwLCAweEYzLCAweDZBLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweEZDLCAweEEwLCAweEYzLCAweEFDLCAweEY5LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEI4LCAweEZDLCAweEEwLCAweEYzLCAweDAyLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweEZDLCAweEEwLCAweEYzLAorCSAweDNCLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweEZDLCAweEEwLCAweEYzLCAweEMzLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweEJFLCAweEZDLCAweEEwLCAweEYzLCAweEVGLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJGLCAweEZDLCAweEEwLCAweEYzLCAweDNDLCAweEZCLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEEyLCAweDBGLCAweDEwLCAweDAwLCAweEI1LCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEE0LCAweDJDLCAweDAyLCAweDAwLCAweEI5LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEE2LCAweDJDLAorCSAweDAyLCAweDAwLCAweDkwLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEFBLCAweDJDLCAweDAyLCAweDAwLCAweDg4LCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDc4LCAweDJCLCAweDA0LCAweDAwLCAweDg5LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDdDLCAweDJCLCAweDA0LCAweDAwLAorCSAweEM1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweDIzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDM0LCAweDI3LCAweDA0LCAweDAwLCAweDJBLCAweEZDLCAweEMwLCAweEYzLCAweDJDLCAweEY0LCAweEI2LCAweDI2LCAweDAyLCAweDAwLCAweEM3LCAweEZELAorCSAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEE2LCAweDJCLCAweDBBLCAweDAwLCAweDI5LCAweEZDLCAweDdGLCAweEY0LCAweDQzLCAweEY0LCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEMyLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDg2LCAweDJCLCAweDA4LCAweDAwLCAweDMyLCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDVDLCAweDAxLCAweDAyLCAweDAwLCAweDMzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDVFLCAweDAxLCAweDAyLCAweDAwLAorCSAweDM1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDhFLCAweDJCLCAweDAyLCAweDAwLCAweEM3LCAweEZDLCAweEMwLCAweEYzLCAweEVCLCAweEY1LAorCSAweDkwLCAweDJCLCAweDAyLCAweDAwLCAweDEwLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweEE4LCAweDI2LCAweDAyLCAweDAwLCAweDExLCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDQ0LCAweDI3LCAweDA2LCAweDAwLCAweDEyLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDRBLCAweDI3LAorCSAweDA2LCAweDAwLCAweDEzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDUwLCAweDI3LCAweDA2LCAweDAwLCAweDE0LCAweEZDLCAweEMwLCAweEYzLAorCSAweEQ2LCAweEYzLCAweDU2LCAweDI3LCAweDA2LCAweDAwLCAweDE1LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDVDLCAweDI3LCAweDA2LCAweDAwLAorCSAweDE2LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDYyLCAweDI3LCAweDA2LCAweDAwLCAweDE3LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDJBLCAweDI3LCAweDAyLCAweDAwLCAweDgzLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDZDLCAweDAxLCAweDAyLCAweDAwLCAweDk3LCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDZBLCAweDAxLCAweDAyLCAweDAwLCAweDk4LCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDAwLAorCSAweDAyLCAweDAwLCAweDk5LCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDAyLCAweDAyLCAweDAwLCAweDlBLCAweEZDLCAweEQ3LCAweEY1LAorCSAweEM1LCAweEY1LCAweEVDLCAweDA0LCAweDAyLCAweDAwLCAweDlCLCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDA2LCAweDAyLCAweDAwLAorCSAweDlDLCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LCAweEVDLCAweDA4LCAweDAyLCAweDAwLCAweDlELCAweEZDLCAweEQ3LCAweEY1LCAweEM1LCAweEY1LAorCSAweEVDLCAweDBBLCAweDAyLCAweDAwLCAweDE4LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDJDLCAweDI3LCAweDAyLCAweDAwLCAweDIyLCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDMyLCAweDI3LCAweDAyLCAweDAwLCAweDI0LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDM4LCAweDI3LAorCSAweDAyLCAweDAwLCAweEMwLCAweEZDLCAweEEwLCAweEYzLCAweDUwLCAweEY2LCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDlFLCAweEZDLCAweEMwLCAweEYzLAorCSAweDgzLCAweEY1LCAweDZFLCAweDAxLCAweDA0LCAweDAwLCAweDlGLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDNFLCAweDJDLCAweDA0LCAweDAwLAorCSAweEEwLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDQyLCAweDJDLCAweDA0LCAweDAwLCAweEExLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLAorCSAweDQ2LCAweDJDLCAweDA0LCAweDAwLCAweEEyLCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDRBLCAweDJDLCAweDA0LCAweDAwLCAweEEzLCAweEZDLAorCSAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDRFLCAweDJDLCAweDA0LCAweDAwLCAweEE0LCAweEZDLCAweEMwLCAweEYzLCAweEQ2LCAweEYzLCAweDUyLCAweDJDLAorCSAweDA0LCAweDAwLCAweDIwLCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweEQ1LCAweEZCLCAweDA4LCAweDAwLCAweDIxLCAweEZELCAweEYxLCAweEYzLAorCSAweEFBLCAweEYzLCAweEQ5LCAweEZCLCAweDBBLCAweDAwLCAweDIyLCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweERFLCAweEZCLCAweDE2LCAweDAwLAorCSAweDIzLCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweEU5LCAweEZCLCAweDBBLCAweDAwLCAweDQ1LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLAorCSAweENBLCAweDAwLCAweDAyLCAweDAwLCAweDQ3LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDM2LCAweDAxLCAweDAyLCAweDAwLCAweDQ4LCAweEZELAorCSAweEQ0LCAweEY0LCAweEFBLCAweEYzLCAweDVDLCAweDAxLCAweDAyLCAweDAwLCAweDQ5LCAweEZELCAweEQ0LCAweEY0LCAweEFBLCAweEYzLCAweDVFLCAweDAxLAorCSAweDAyLCAweDAwLCAweDRBLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDU2LCAweDAxLCAweDAyLCAweDAwLCAweDRCLCAweEZELCAweEMwLCAweEYzLAorCSAweEFBLCAweEYzLCAweDU4LCAweDAxLCAweDAyLCAweDAwLCAweDRELCAweEZELCAweEYxLCAweEYzLCAweEFBLCAweEYzLCAweEVFLCAweEZCLCAweDA4LCAweDAwLAorCSAweDRGLCAweEZELCAweEU4LCAweEY0LCAweEFBLCAweEYzLCAweDk2LCAweDJCLCAweDAyLCAweDAwLCAweEMyLCAweEZELCAweERFLCAweEY0LCAweEFBLCAweEYzLAorCSAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDQwLCAweEZELCAweEU5LCAweEYzLCAweEFBLCAweEYzLCAweDc4LCAweDAxLCAweDAyLCAweDAwLCAweDI0LCAweEZELAorCSAweDAxLCAweEY1LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDkxLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweENDLCAweDFFLAorCSAweDAyLCAweDAwLCAweDkzLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEQyLCAweDFFLCAweDAyLCAweDAwLCAweDhGLCAweEZELCAweDBFLCAweEY1LAorCSAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweEMxLCAweEZELCAweDkyLCAweEY2LCAweEFBLCAweEYzLCAweEM4LCAweDAwLCAweDAyLCAweDAwLAorCSAweEM2LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDIwLCAweDMwLCAweDA0LCAweDAwLCAweDI1LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLAorCSAweDYyLCAweDAxLCAweDAyLCAweDAwLCAweDg5LCAweEZELCAweDk2LCAweEY0LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEZELAorCSAweDBFLCAweEY0LCAweEFBLCAweEYzLCAweDdFLCAweDJDLCAweDI0LCAweDAwLCAweDQ2LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweDdBLCAweDAxLAorCSAweDA2LCAweDAwLCAweDg2LCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLCAweEIwLCAweDI2LCAweDA2LCAweDAwLCAweDg3LCAweEZELCAweEMwLCAweEYzLAorCSAweEFBLCAweEYzLCAweDc2LCAweDJDLCAweDA2LCAweDAwLCAweDhCLCAweEZELCAweDk2LCAweEY5LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAorCSAweDhCLCAweEZELCAweDk2LCAweEY5LCAweEFBLCAweEYzLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDhFLCAweEZELCAweEMwLCAweEYzLCAweEFBLCAweEYzLAorCSAweEVFLCAweDE0LCAweDAyLCAweDAwLCAweDgwLCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDAwLCAweDAyLCAweDAwLCAweDgxLCAweEZELAorCSAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDAyLCAweDAyLCAweDAwLCAweDgyLCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDA0LAorCSAweDAyLCAweDAwLCAweDgzLCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDA2LCAweDAyLCAweDAwLCAweDg0LCAweEZELCAweEVGLCAweEY0LAorCSAweEFBLCAweEYzLCAweDIyLCAweDA4LCAweDAyLCAweDAwLCAweDg1LCAweEZELCAweEVGLCAweEY0LCAweEFBLCAweEYzLCAweDIyLCAweDBBLCAweDAyLCAweDAwLAorCSAweDAwLCAweEYxLCAweDQ2LCAweDAwLCAweDY0LCAweEYzLCAweEY2LCAweDAwLCAweDAwLCAweDAzLCAweDhFLCAweEY3LCAweDFGLCAweDAwLCAweDM0LCAweDAxLAorCSAweEM4LCAweDAwLCAweDk2LCAweDAxLCAweENDLCAweDAwLCAweEZBLCAweDAwLCAweDc4LCAweDAxLCAweEQyLCAweDI1LCAweDE4LCAweDAxLCAweENDLCAweDFFLAorCSAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDE1LCAweDAwLCAweDAwLCAweDA2LCAweDE3LCAweDEyLCAweDAxLCAweDAzLCAweDAwLCAweEFFLCAweDAwLAorCSAweEVDLCAweDAwLCAweDQ0LCAweDAwLCAweERDLCAweDBGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFDLCAweDA5LCAweDA4LCAweDI0LCAweDI4LCAweDA2LAorCSAweDBDLCAweDE4LCAweDA4LCAweDMwLCAweDE0LCAweDBDLCAweDA4LCAweDM2LCAweDEwLCAweDEyLCAweEExLCAweEI2LCAweDE0LCAweEI2LCAweDUwLCAweEI3LAorCSAweDU5LCAweEI3LCAweDI1LCAweEI2LCAweENFLCAweEI2LCAweDkzLCAweEI2LCAweDE1LCAweDFDLCAweEQwLCAweDFBLCAweDE1LCAweDFDLCAweDhCLCAweDFCLAorCSAweEVFLCAweDFBLCAweENCLCAweDFBLCAweEQyLCAweDFCLCAweEYxLCAweDFCLCAweDA2LCAweDFDLCAweDQ4LCAweDFDLCAweDc0LCAweDFDLCAweDc0LCAweDFCLAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LAorCSAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIyLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDIzLCAweDQ2LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LAorCSAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFDLCAweDQ3LCAweDFELCAweDQ3LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LAorCSAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LCAweDlBLCAweDQ4LCAweERBLCAweDQ4LCAweDFBLCAweDQ4LCAweDVBLCAweDQ4LAorCSAweDlBLCAweDQ4LCAweDMzLCAweDQ4LCAweDc4LCAweDQ5LCAweDc4LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LCAweDc5LCAweDQ5LAorCSAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdBLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdCLCAweDQ5LCAweDdDLCAweDQ5LAorCSAweEQ4LCAweDAzLCAweERDLCAweDAzLCAweEUwLCAweDAzLCAweEU0LCAweDAzLCAweEYwLCAweDAzLCAweEY0LCAweDAzLCAweEY4LCAweDAzLCAweDBBLCAweDA0LAorCSAweDBFLCAweDA0LCAweDEyLCAweDA0LCAweDE2LCAweDA0LCAweDBDLCAweDA0LCAweDEwLCAweDA0LCAweDE0LCAweDA0LCAweDE4LCAweDA0LCAweDFDLCAweDA0LAorCSAweDIwLCAweDA0LCAweDI0LCAweDA0LCAweDI4LCAweDA0LCAweDRDLCAweDA0LCAweDUwLCAweDA0LCAweDU0LCAweDA0LCAweDU4LCAweDA0LCAweDVDLCAweDA0LAorCSAweDYwLCAweDA0LCAweDY0LCAweDA0LCAweDY4LCAweDA0LCAweDZDLCAweDA0LCAweDcwLCAweDA0LCAweDc0LCAweDA0LCAweDdELCAweDA0LCAweDgxLCAweDA0LAorCSAweDg1LCAweDA0LCAweDg5LCAweDA0LCAweDhELCAweDA0LCAweDEwLCAweDAwLCAweDhFLCAweDE5LCAweEFDLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDgwLCAweDNDLCAweDBDLCAweDAwLCAweDAwLCAweEZGLCAweDNGLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweEQzLCAweDIyLCAweDQ0LCAweDA0LAorCSAweDlDLCAweDAyLCAweENCLCAweDU0LCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAzLAorCSAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDUwLCAweDIwLCAweDAwLCAweDgwLCAweEJGLCAweDFGLCAweEE2LCAweDI4LCAweDAwLCAweDBCLCAweDAyLAorCSAweDYwLCAweDg0LCAweDRDLCAweDAwLCAweDAyLCAweDAwLCAweDRCLCAweDFDLCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDIwLCAweDBCLCAweDM0LCAweDA0LAorCSAweEZELCAweDM0LCAweDM0LCAweDAwLCAweDM4LCAweDA0LCAweEZELCAweDM0LCAweDM0LCAweDAwLCAweDNDLCAweDA0LCAweDAxLCAweDAwLCAweDEwLCAweDAwLAorCSAweDAwLCAweDA4LCAweDAwLCAweDUyLCAweDE0LCAweDAwLCAweDA0LCAweDA4LCAweDBFLCAweDMyLCAweDAwLCAweEE2LCAweDEwLCAweDA4LCAweEM0LCAweDAzLAorCSAweDUwLCAweDYwLCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDEwLCAweDBDLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDE0LCAweDBDLAorCSAweDAwLCAweDAwLCAweDAwLCAweDQxLCAweDIwLCAweDBDLCAweEIwLCAweDAwLCAweEIwLCAweEI4LCAweDI0LCAweDBDLCAweDAwLCAweDAwLCAweEFCLCAweDA1LAorCSAweDJDLCAweDBDLCAweDgwLCAweDA1LCAweDAwLCAweEZGLCAweDMwLCAweDBDLCAweDAwLCAweDAwLCAweEIwLCAweDA0LCAweDM0LCAweDBDLCAweDAzLCAweDAwLAorCSAweDAwLCAweEU4LCAweDQ0LCAweDBDLCAweDA0LCAweDAwLCAweEZGLCAweDBGLCAweDAwLCAweDEwLCAweDJFLCAweDAwLCAweDBDLCAweEUzLCAweDQ0LCAweDA0LAorCSAweDAwLCAweDAwLCAweDAxLCAweDA0LCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAxLCAweDA0LCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDgwLCAweDAzLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLAorCSAweDdGLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQ4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLAorCSAweDcxLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDVFLCAweDQwLCAweDAxLCAweDAwLCAweDE4LCAweDAwLCAweDM2LCAweEMwLCAweEU4LCAweDBFLAorCSAweDFDLCAweDAwLCAweDc4LCAweEM4LCAweEE1LCAweDQwLCAweDI0LCAweDAwLCAweDlFLCAweEIwLCAweEI5LCAweDk1LCAweDA4LCAweDA4LCAweDAwLCAweEVBLAorCSAweDQwLCAweDAxLCAweDBDLCAweDA4LCAweDAwLCAweEVBLCAweDAwLCAweDAwLCAweDFDLCAweDA4LCAweDAwLCAweDAwLCAweDQyLCAweDA3LCAweDIwLCAweDA4LAorCSAweDdCLCAweDAwLCAweEQ0LCAweDA5LCAweDJDLCAweDA0LCAweDE0LCAweDAwLCAweDUwLCAweDE0LCAweDMwLCAweDA0LCAweDI4LCAweDBGLCAweDI4LCAweDdGLAorCSAweDE4LCAweDA4LCAweDIwLCAweDAwLCAweEZDLCAweDAxLCAweDA0LCAweDEwLCAweDY5LCAweDAwLCAweEZELCAweEMzLCAweDA4LCAweDEwLCAweDY5LCAweDAwLAorCSAweEZELCAweEMzLCAweDA4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDBDLAorCSAweDAwLCAweDAwLCAweDdGLCAweDAwLCAweDA0LCAweDA0LCAweDA4LCAweDQ4LCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDVFLCAweDQ4LCAweDAwLCAweDAwLAorCSAweDA0LCAweDA0LCAweDA4LCAweDQwLCAweDAyLCAweDAwLCAweDAwLCAweDBDLCAweDcxLCAweDAwLCAweDMwLCAweDUwLCAweDAwLCAweDAwLCAweDVFLCAweDQ4LAorCSAweDAxLCAweDAwLCAweDE4LCAweDAwLCAweDNBLCAweEMwLCAweEU4LCAweDA0LCAweDFDLCAweDAwLCAweDc4LCAweEQwLCAweEE1LCAweDQwLCAweDI0LCAweDAwLAorCSAweDlFLCAweEIwLCAweEI5LCAweDg1LCAweDJDLCAweDA0LCAweDE0LCAweDAwLCAweDUwLCAweDE0LCAweDMwLCAweDA0LCAweDI4LCAweDBGLCAweDI4LCAweDdGLAorCSAweDA4LCAweDA4LCAweDAwLCAweEVBLCAweDQwLCAweDAxLCAweDBDLCAweDA4LCAweDAwLCAweEVBLCAweDAwLCAweDAwLCAweDFDLCAweDA4LCAweDAwLCAweDAwLAorCSAweDQyLCAweDA3LCAweDIwLCAweDA4LCAweDdCLCAweDAwLCAweEQ0LCAweDA5LCAweDE4LCAweDA4LCAweEYwLCAweDNGLCAweEZDLCAweDAxLCAweDA0LCAweDEwLAorCSAweDY5LCAweDAwLCAweERELCAweENELCAweDA4LCAweDEwLCAweDY5LCAweDAwLCAweERELCAweENELCAweDA4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDQ4LCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDQwLCAweDA0LAorCSAweDQxLCAweDA0LCAweDEwLCAweDA0LCAweEQ2LCAweDA4LCAweDU2LCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDE4LCAweDA0LAorCSAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweEMyLCAweDAwLCAweEQ2LCAweDA4LAorCSAweDI0LCAweDA0LCAweEQ2LCAweDA4LCAweEMwLCAweDAwLCAweDI4LCAweDA0LCAweEMyLCAweDA4LCAweEMyLCAweDI4LCAweDA4LCAweDA0LCAweDQwLCAweDAxLAorCSAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDEwLCAweDA0LCAweDU2LCAweDBBLCAweDU2LCAweDBBLCAweDE0LCAweDA0LAorCSAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDE4LCAweDA0LCAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLAorCSAweDIwLCAweDA0LCAweDQyLCAweDAyLCAweDU2LCAweDBBLCAweDI0LCAweDA0LCAweDU2LCAweDBBLCAweDQwLCAweDAyLCAweDI4LCAweDA0LCAweDQyLCAweDBBLAorCSAweDQyLCAweDJBLCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LCAweDQwLCAweDA0LCAweDQxLCAweDA0LCAweDEwLCAweDA0LAorCSAweENFLCAweDA4LCAweDRFLCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDRFLCAweDBBLCAweDE4LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLAorCSAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweEMyLCAweDAwLCAweENFLCAweDA4LCAweDI0LCAweDA0LCAweENFLCAweDA4LAorCSAweEMwLCAweDAwLCAweDI4LCAweDA0LCAweEMyLCAweDA4LCAweEMyLCAweDI4LCAweDA4LCAweDA0LCAweDQwLCAweDAxLCAweDQxLCAweDAxLCAweDBDLCAweDA0LAorCSAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDEwLCAweDA0LCAweDRFLCAweDBBLCAweDRFLCAweDBBLCAweDE0LCAweDA0LCAweDQyLCAweDAyLCAweDRFLCAweDBBLAorCSAweDE4LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLCAweDFDLCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDIwLCAweDA0LCAweDQyLCAweDAyLAorCSAweDRFLCAweDBBLCAweDI0LCAweDA0LCAweDRFLCAweDBBLCAweDQwLCAweDAyLCAweDI4LCAweDA0LCAweDQyLCAweDBBLCAweDQyLCAweDJBLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAzLCAweDAwLAorCSAweDA1LCAweDAwLCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LAorCSAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE2LCAweEEwLCAweDE3LCAweEEwLCAweDE3LCAweEEwLCAweDE3LAorCSAweEEwLCAweDE4LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LCAweEZGLCAweDA2LAorCSAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDVELCAweDAwLCAweDUyLCAweDAwLAorCSAweDQ4LCAweDAwLCAweDQwLCAweDAwLCAweDM4LCAweDAwLCAweDMxLCAweDAwLCAweDJDLCAweDAwLCAweDI3LCAweDAwLCAweDIzLCAweDAwLCAweDFGLCAweDAwLAorCSAweDAwLCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDY1LCAweDAwLCAweDVELCAweDAwLCAweDUyLCAweDAwLCAweDQ4LCAweDAwLAorCSAweDQwLCAweDAwLCAweDM4LCAweDAwLCAweDMxLCAweDAwLCAweDJDLCAweDAwLCAweDI3LCAweDAwLCAweDIzLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLAorCSAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLAorCSAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LCAweDY5LCAweDY1LCAweDY0LCAweDIwLAorCSAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLCAweDY0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDE0LCAweDAwLCAweDAzLCAweDAwLCAweDE1LCAweDAwLCAweDZFLCAweDZGLCAweDZFLCAweDJELCAweDczLCAweDcwLCAweDY1LCAweDYzLCAweDY5LCAweDY2LAorCSAweDY5LCAweDY1LCAweDY0LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDY0LCAweDAwLAorCSAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDQ1LCAweDUyLCAweDRELCAweDQ1LCAweDUzLCAweDIwLCAweDMyLCAweDAwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLAorCSAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2LCAweDY5LCAweDcyLCAweDczLCAweDc0LCAweDIwLCAweDU3LCAweDYxLAorCSAweDc2LCAweDY1LCAweDRDLCAweDQxLCAweDRFLCAweDIwLCAweDQ5LCAweDQ5LCAweDIwLCAweDUzLCAweDUzLCAweDQ5LCAweDQ0LCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCSAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweDBGLCAweDAwLCAweDUwLCAweDAxLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDE0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDMwLCAweDAwLCAweEZGLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLAorCSAweDBBLCAweDAwLCAweDBBLCAweDAwLCAweDBCLCAweDAwLCAweDBCLCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDBBLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDAyLCAweDA0LCAweDBCLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDgyLCAweDg0LAorCSAweDhCLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAxLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDIwLCAweDAwLCAweDFCLCAweDAwLCAweDE3LCAweDAwLCAweDExLCAweDAwLCAweDEwLCAweDAwLCAweDBCLCAweDAwLAorCSAweDBCLCAweDAwLCAweDA5LCAweDAwLCAweDE3LCAweDAwLCAweDE0LCAweDAwLCAweDEwLCAweDAwLCAweDBELCAweDAwLCAweDBCLCAweDAwLCAweDA5LCAweDAwLAorCSAweDA4LCAweDAwLCAweDA3LCAweDAwLCAweDBELCAweDAwLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweDA4LCAweDAwLCAweDA1LCAweDAwLCAweDA1LCAweDAwLAorCSAweEQ4LCAweDBDLCAweEMwLCAweDA4LCAweDkwLCAweDBELCAweDYwLCAweDA5LCAweDQ4LCAweDBFLCAweDMwLCAweDBBLCAweDI0LCAweDBGLCAweDE4LCAweDBCLAorCSAweDBCLCAweDZFLCAweDBCLCAweDM3LCAweDAyLCAweDE0LCAweDAxLCAweDBBLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLAorCSAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLCAweEZGLCAweDBGLCAweEYwLCAweDBGLAorCSAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweERELCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDAxLCAweDAwLAorCSAweDAwLCAweDUwLCAweEYyLCAweDA1LCAweDAyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAyLCAweDAwLCAweDUwLCAweEYyLCAweDA0LCAweDAyLCAweDAwLAorCSAweDAwLCAweDUwLCAweEYyLCAweDAwLCAweDAwLCAweDUwLCAweEYyLCAweDAxLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDA0LCAweDAwLCAweDE1LCAweDAwLCAweDAyLCAweDAwLAorCSAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDEwLCAweDAwLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDAyLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLAorCSAweDE1LCAweDAwLCAweDIwLCAweDAwLCAweDExLCAweDAwLCAweDIwLCAweDAwLCAweDE2LCAweDI2LCAweEUyLCAweDJCLCAweEVBLCAweDJELCAweEM0LCAweDJELAorCSAweEVFLCAweDJELCAweDdFLCAweDJDLCAweDFFLCAweDJFLCAweDIyLCAweDJFLCAweEZGLCAweEZGLCAweDJDLCAweDJFLCAweDAwLCAweDAwLCAweDRFLCAweDI4LAorCSAweEQ4LCAweDJCLCAweDIyLCAweDJFLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDE2LCAweDI2LCAweEUyLCAweDJCLCAweEVBLCAweDJELCAweEZGLCAweEZGLAorCSAweEVFLCAweDJELCAweDdFLCAweDJDLCAweDFFLCAweDJFLCAweDIyLCAweDJFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweEZGLCAweEZGLCAweDJDLCAweDJFLCAweDAwLCAweDAwLCAweEUyLCAweDJCLCAweDM0LCAweDJFLCAweDIyLCAweDJFLCAweDAwLCAweDAwLCAweDAwLCAweDA1LAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDA2LCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDJBLCAweDAwLCAweDAwLCAweDA4LCAweDMyLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDgwLCAweDAwLCAweDYwLCAweDFELCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDgxLAorCSAweDAwLCAweDYwLCAweDFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLAorCSAweDAwLCAweDAwLCAweERELCAweDAwLCAweEZGLCAweEZGLCAweDk3LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCSAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDE5LCAweDBBLCAweDA5LCAweDQ2LCAweDFDLCAweDYwLCAweDE4LCAweDAwLCAweDE5LCAweDFELCAweDA5LCAweDQyLAorCSAweDFDLCAweDYwLAorCit9OyAgLyogZndfaW1hZ2VfMl9kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8zX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHg2MCwgMHg0NiwgMHg3NCwgMHhDRCwgMHhFMiwgMHgwNCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHhFMSwgMHg4MiwgMHhGMywgMHgyMSwgMHg2MCwKKwkgMHhDRSwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMiwgMHgwMCwgMHgyMSwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwRiwgMHg2MCwgMHhFOCwgMHg2NCwKKwkgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHgzRiwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOCwgMHg2MCwKKwkgMHgyMiwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwMywgMHgwMCwgMHgxOCwgMHg2MCwKKwkgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOSwgMHhGRSwgMHgwMSwgMHhDNCwgMHhFMiwgMHg0MywgMHg2NCwgMHgzQSwgMHhEQiwgMHg4MiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgzRiwgMHg0NCwgMHhGRiwgMHgwMSwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOCwgMHg2MCwKKwkgMHgyMCwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHhDNCwgMHhFMiwgMHgwMCwgMHg2MywgMHg4MSwgMHhGRCwgMHgzMiwgMHg3QiwKKwkgMHg0RCwgMHhFMiwgMHhCRiwgMHhGRSwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHhFMCwgMHhGRSwgMHhFMSwgMHhGRSwgMHhFMiwgMHhGRSwgMHg0MywgMHhGRiwKKwkgMHg0NCwgMHhGRiwgMHg0NiwgMHhGRiwgMHg4MywgMHhGMywgMHg2MiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyRCwgMHhGRiwgMHgwNywgMHgzNiwKKwkgMHhENSwgMHhGRSwgMHgwOCwgMHhFMSwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMywgMHg2MCwgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MSwgMHhBOSwgMHg5QywKKwkgMHg2MCwgMHg0NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMSwgMHgwOSwgMHg2MCwgMHhCNCwgMHg2MSwKKwkgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNywgMHgyNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwRSwgMHgzQSwgMHgwRCwgMHgwMCwgMHgwMSwgMHg3QywgMHgxMCwgMHg2MCwKKwkgMHhGMiwgMHhGOSwgMHg0NCwgMHg2MCwgMHgwOCwgMHg3QywgMHgxMCwgMHg2MCwgMHhDNCwgMHhGOSwgMHgxMiwgMHg2MCwgMHhFNSwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHhCMCwgMHg2MSwgMHhCMSwgMHg5QywgMHgyNiwgMHgwMCwgMHgwMCwgMHg3QywgMHgxMCwgMHg2MCwgMHhGMiwgMHhGOSwgMHg0MCwgMHg2MCwgMHgwOCwgMHg3QywKKwkgMHgxMCwgMHg2MCwgMHhDNCwgMHhGOSwgMHgxMiwgMHg2MCwgMHhFNSwgMHhGMSwgMHgwMiwgMHg2MCwgMHg5MCwgMHg2MSwgMHhCMSwgMHg5QywgMHgwOSwgMHg2MCwKKwkgMHg2NywgMHg2NSwgMHhGRiwgMHhCNCwgMHhDNCwgMHg4NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MSwgMHgxMiwgMHgwMCwgMHhGRiwgMHhCNCwKKwkgMHhFRCwgMHhBMCwgMHgyNSwgMHg2MCwgMHhDQywgMHg2MSwgMHgwNCwgMHgwNCwgMHhFMiwgMHhBMCwgMHhEOSwgMHg4MSwgMHgwMSwgMHgwNCwgMHhEOSwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHgwMiwgMHg2MCwgMHg1MCwgMHg2MSwgMHgxRiwgMHg2MCwgMHhGNiwgMHg2NSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhCMSwgMHg5QywKKwkgMHhDOCwgMHg4MSwgMHg2MSwgMHg0NywgMHgwMCwgMHg3RSwgMHhFOSwgMHg4MSwgMHgwNywgMHg2MCwgMHhGMCwgMHg2NSwgMHhBNSwgMHg4MSwgMHgwQiwgMHhCOSwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHhCNSwgMHg4NSwgMHgwNCwgMHg2MCwgMHg0NCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHhDOCwgMHg2MSwgMHg2MSwgMHg1NCwgMHhDRCwgMHhFMiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgyRSwgMHgwMCwgMHhDQywgMHg4NCwgMHhFMCwgMHg4NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHhFNywgMHgxRiwgMHg2MCwgMHg4NiwgMHg2NCwgMHgxQSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhBMiwgMHg2NCwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhCRSwgMHg2NCwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHhEQSwgMHg2NCwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3NSwgMHg2NCwgMHgwNiwgMHg2MSwgMHg2MSwgMHg0OCwKKwkgMHg2MCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyMSwgMHg2MCwKKwkgMHhFQywgMHg3QywgMHgwNywgMHg2MCwgMHhFOSwgMHhGOSwgMHgyMSwgMHg2MCwgMHg3NCwgMHg2MywgMHgxNCwgMHg2MSwgMHgyMSwgMHgwMCwgMHgxMSwgMHg2MCwKKwkgMHg2MiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhFRCwgMHhBMCwgMHg2NCwgMHg0MSwgMHgwNCwgMHgwNCwgMHhFMiwgMHhBMCwgMHhEOSwgMHg4MSwgMHgwMSwgMHgwNCwKKwkgMHhEOSwgMHg4MSwgMHhBMSwgMHhEMSwgMHgxMCwgMHg2MCwgMHg5MSwgMHhGMywgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHhGRiwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhBNCwgMHg4NCwgMHgzNCwgMHg5NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHg2NCwgMHg0MSwgMHhBNSwgMHg4MSwgMHhGRiwgMHhCNCwgMHgzNCwgMHg5NCwKKwkgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwgMHg1OCwgMHg3QywgMHgwNywgMHg2MCwgMHhFOSwgMHhGOSwgMHgyMSwgMHg2MCwgMHgwMiwgMHg2MywgMHgxMywgMHg2MSwKKwkgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHg2MCwgMHhFOSwgMHhGMywgMHgzMSwgMHg0MCwgMHg4MCwgMHgyNiwKKwkgMHgzNiwgMHhBNCwgMHgwNywgMHg2MCwgMHhFOSwgMHhGQiwgMHg2MCwgMHg0MywgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4MiwgMHhGMywgMHgyMiwgMHg2MCwgMHhDNCwgMHg2MSwgMHgwMCwgMHg3QywgMHg3RSwgMHg2MywgMHg1OSwgMHhEOSwgMHhGRSwgMHgxRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMywgMHgwMCwgMHgyMywgMHg2MCwgMHg0NiwgMHg2NSwgMHgxNSwgMHgwMCwgMHhGRiwgMHhCNCwgMHhGOSwgMHhBMCwKKwkgMHgyMywgMHg2MCwgMHg2OCwgMHg2NSwgMHgwMSwgMHg3QywgMHgwRCwgMHgwNCwgMHhFRCwgMHhBMCwgMHgyMywgMHg2MCwgMHg4QSwgMHg2NSwgMHgxMSwgMHg3QywKKwkgMHgwOCwgMHgwNCwgMHhFMiwgMHhBMCwgMHgyMywgMHg2MCwgMHhBQywgMHg2NSwgMHgyMSwgMHg3QywgMHgwMywgMHgwNCwgMHgyMywgMHg2MCwgMHhDRSwgMHg2NSwKKwkgMHgzMSwgMHg3QywgMHg2NCwgMHg1RiwgMHg2NCwgMHhGQiwgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHhGMCwgMHhBMCwgMHgyMiwgMHg2MCwgMHhDNCwgMHg2MSwKKwkgMHgwOCwgMHgwNiwgMHg0MCwgMHg1NCwgMHg1OCwgMHg1MywgMHgwOCwgMHhGRiwgMHhBMiwgMHg2MCwgMHhFNywgMHg2NCwgMHg0MywgMHhGQiwgMHgwOCwgMHhGRiwKKwkgMHhGRiwgMHgwMSwgMHg2MCwgMHg0MywgMHg2MCwgMHg0NiwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBNSwgMHhEMywgMHhEQSwgMHg4NSwgMHg1OSwgMHhEOSwKKwkgMHg1OSwgMHhEQiwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGQiwgMHgxRiwgMHgwQywgMHg2MywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBNSwgMHhEMywKKwkgMHhEQSwgMHg4NSwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGNywgMHgxRiwgMHg2NiwgMHg0NCwgMHgwRSwgMHg2MywKKwkgMHg1MywgMHg5MywgMHg2MCwgMHg0MCwgMHgxMCwgMHgzNiwgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHg0OCwgMHhEMywgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhEQiwgMHhGQiwgMHgxRiwgMHgxMiwgMHg2MCwgMHhCQywgMHhGMSwgMHg2NCwgMHhGMywgMHg2NCwgMHg0MywgMHhEQiwgMHg4MSwKKwkgMHgyNSwgMHg2MCwgMHg1QSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNywgMHgxMiwgMHgwMCwgMHgxMSwgMHgzNywgMHgxNywgMHgwMCwgMHgyMSwgMHgzNywKKwkgMHgxRCwgMHgwMCwgMHgzMSwgMHgzNywgMHgyMiwgMHgwMCwgMHhBMywgMHhEMSwgMHgxMiwgMHg2MCwgMHhCNywgMHhGNSwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwKKwkgMHgxMiwgMHg2MCwgMHhCNiwgMHhGQiwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhBRCwgMHhGMSwgMHgxRCwgMHgwMCwgMHhBMSwgMHhEMywKKwkgMHgxMiwgMHg2MCwgMHhCOCwgMHhGNSwgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhBRSwgMHhGMSwgMHgxNiwgMHgwMCwgMHhBMSwgMHhEMywgMHgxMiwgMHg2MCwKKwkgMHhCOSwgMHhGNSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhBRiwgMHhGMSwgMHgwRSwgMHgwMCwgMHg1OSwgMHhEMywgMHgxMiwgMHg2MCwKKwkgMHhCQSwgMHhGNSwgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhCMCwgMHhGMSwgMHgwNywgMHgwMCwgMHg1OSwgMHhEMywgMHgxMiwgMHg2MCwgMHhCQiwgMHhGNSwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgxMiwgMHg2MCwgMHhCMSwgMHhGMSwgMHgxMiwgMHg2MCwgMHhCNSwgMHhGQiwgMHgxMiwgMHg2MCwgMHhCMiwgMHhGOSwKKwkgMHg2NiwgMHg0MiwgMHhGQywgMHhBMiwgMHhBMiwgMHhEMywgMHgyNCwgMHg2MCwgMHg0OCwgMHg2MywgMHhDQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhDQywgMHg4MSwKKwkgMHg2MywgMHg0NSwgMHhBNiwgMHhEMywgMHhEQSwgMHg4MiwgMHhGRiwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhEQSwgMHg4NiwgMHhDRCwgMHg4MSwgMHhGNSwgMHgwMSwgMHgwMCwgMHhCOSwgMHhBNiwgMHhEMywgMHgwQiwgMHgwMywgMHg1QSwgMHhEMSwKKwkgMHhEQSwgMHg4NiwgMHhGRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg1QywgMHg5MCwgMHhCRCwgMHhEOSwgMHhGRCwgMHgwMiwgMHhDRCwgMHg4MSwKKwkgMHg2NiwgMHg0MiwgMHhGMiwgMHgwMiwgMHg1QSwgMHhEMywgMHgyNCwgMHg2MCwgMHg4NiwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEQiwgMHhGRCwgMHgwMiwKKwkgMHg2NCwgMHhGMywgMHgxNSwgMHg2MCwgMHhERCwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwKKwkgMHgwNiwgMHgwMCwgMHgxMywgMHg2NCwgMHhBRCwgMHhGQiwgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwgMHgzNywgMHhGQiwgMHgwOSwgMHgwMCwgMHgwOCwgMHg2NCwKKwkgMHhBRCwgMHhGQiwgMHg4MiwgMHhGMywgMHgwMSwgMHg2MCwgMHg2NywgMHg3QywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1QiwgMHg3QywgMHgzNywgMHhGOSwKKwkgMHgxMywgMHg2MCwgMHg1QiwgMHhGMSwgMHg2NCwgMHhGMywgMHgxNSwgMHg2MCwgMHhEMiwgMHhGOSwgMHgxNSwgMHg2MCwgMHhENiwgMHhGOSwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgwQSwgMHgwMCwgMHhGRiwgMHhCNSwgMHgxMCwgMHg2MCwgMHhBOCwgMHg2MywgMHg2NSwgMHg0MSwgMHhDRCwgMHg4MSwgMHgwNiwgMHhBMywKKwkgMHhGRCwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgwRiwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgxMSwgMHg2MCwKKwkgMHgxNCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwOCwgMHhBMSwgMHhGQiwgMHgwMiwgMHhGQywgMHhBMSwgMHhBMSwgMHhEMywKKwkgMHgxNSwgMHg2MCwgMHhEMiwgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwNywgMHgxNSwgMHg2MCwgMHhEMiwgMHhGQiwKKwkgMHgxNSwgMHg2MCwgMHhENiwgMHhGQiwgMHgyNSwgMHg2MCwgMHg3QSwgMHg2MywgMHgyNCwgMHg2MCwgMHgwOCwgMHg2NSwgMHgxMiwgMHg2MCwgMHhCNiwgMHhGMSwKKwkgMHgyMywgMHg2MCwgMHhGMCwgMHg2MSwgMHgyNSwgMHg2MCwgMHg2OCwgMHg2NCwgMHg0MCwgMHg0RiwgMHgwNCwgMHg2NCwgMHhDMywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHg4MiwgMHg2MywgMHgxMiwgMHg2MCwgMHhCNSwgMHhGMSwgMHgyNCwgMHg2MCwgMHg0OCwgMHg2NSwKKwkgMHgyNSwgMHg2MCwgMHg2NiwgMHg2NCwgMHg0MCwgMHg0RiwgMHgwOCwgMHg2NCwgMHhDMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHhGMywgMHgwOCwgMHg3QywgMHgzOCwgMHhGOSwgMHgyNCwgMHg2MCwgMHhFMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwRSwgMHgwMCwKKwkgMHgwMSwgMHgzNywgMHgwNiwgMHgwMCwgMHgxMSwgMHgzNywgMHgwMywgMHgwMCwgMHgyMSwgMHgzQiwgMHgxRSwgMHhBMSwgMHgxRSwgMHhBMSwgMHgxRSwgMHhBMSwKKwkgMHgxQywgMHg2MywgMHgyNCwgMHg2MCwgMHhDMiwgMHg2NCwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxMiwgMHg2MCwgMHhCMiwgMHhGMywKKwkgMHgwMCwgMHg3QywgMHg2MCwgMHg0NSwgMHg3MCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOSwKKwkgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MSwKKwkgMHhCMSwgMHg5QywgMHg2MCwgMHg0NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOCwgMHg2MCwgMHg1MCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0NCwgMHhEMywgMHg4MCwgMHg3QywgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhCMCwgMHg4QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MiwgMHg0NywgMHg4MCwgMHhCRiwKKwkgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg3QywgMHhCRCwgMHhEMywgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg0QSwgMHhCRCwgMHhEMywKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5MCwgMHg4QSwgMHhCRCwgMHhEMywgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5MCwgMHg4QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHhDRCwgMHg4MSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHhFQiwgMHgwMiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2MiwgMHg0QSwgMHgwMiwgMHg2NCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHhGRCwgMHgwMiwgMHg3QywgMHg0OSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OCwgMHg1QywgMHg3QywgMHg0OSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2OCwgMHg0NCwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MiwgMHhGRiwKKwkgMHg0MCwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHgzMywgMHgwMCwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxQiwgMHgwMCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhERCwgMHhGRSwgMHgxOCwgMHg2MCwgMHgwNywgMHhGMSwKKwkgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg2NCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHgxOSwgMHg2MSwgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgwMiwgMHg0MywgMHg0NSwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxMSwgMHgwMCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwKKwkgMHgwNCwgMHhCQywgMHhBMCwgMHg1RSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg3MSwgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwNCwgMHhBQywKKwkgMHhBMCwgMHg1RSwgMHgwRiwgMHg2MCwgMHhBMCwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMSwgMHhGRiwgMHhERCwgMHhGRSwgMHgxRSwgMHgwMCwgMHg0MywgMHg0NSwKKwkgMHgyMCwgMHg0NCwgMHg2MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwgMHgwNCwgMHhCQywgMHhBMCwgMHg1RSwgMHhERCwgMHhGRSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg3MSwgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgwNCwgMHhBQywgMHhBMCwgMHg1RSwgMHgwMCwgMHg2MCwKKwkgMHhDOCwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMSwgMHhGRiwgMHgwQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3MSwgMHg3QywgMHgxMCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHgzQywgMHg2MywgMHgxRSwgMHg2MSwKKwkgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxNCwgMHg3MSwgMHg4RCwgMHhFMiwgMHhBMSwgMHhGRiwKKwkgMHgzMSwgMHg0NCwgMHg0MCwgMHgyNiwgMHgwMiwgMHgwMCwgMHg4MCwgMHgyNiwgMHgxNywgMHgwMCwgMHgyMSwgMHg2MCwgMHhFQywgMHg2MywgMHgwNywgMHg2MCwKKwkgMHhFOSwgMHhGRCwgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0NCwgMHg0MCwgMHgyQSwKKwkgMHgxNCwgMHgwMCwgMHgzMSwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg1MSwgMHhBRSwgMHg0QywgMHgxMCwgMHgyNiwgMHgwRSwgMHgwMCwgMHgwNywgMHg2MCwKKwkgMHhFQSwgMHhGQiwgMHgzMSwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg1MSwgMHgyMiwgMHg2MCwgMHgyMiwgMHg2MywgMHgwNywgMHg2MCwgMHhFOSwgMHhGRCwKKwkgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHhGMCwgMHg2MywgMHgwMywgMHg2MSwKKwkgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MiwgMHgxOSwgMHg2MCwgMHg4RiwgMHg3QywKKwkgMHgwMCwgMHg2MCwgMHhBQywgMHg2NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MCwgMHhFMSwgMHhCRiwgMHhGRSwKKwkgMHhBMSwgMHg0RiwgMHg3MCwgMHhCNCwgMHg1MCwgMHgzNiwgMHhBRiwgMHgwMCwgMHgyMCwgMHgzNiwgMHgwMywgMHgwMCwgMHgxOCwgMHg2MCwgMHgyNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHhBMSwgMHgwMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgzOCwgMHg2OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgyQSwgMHg5OSwgMHgwMCwgMHgxMywgMHg2MCwgMHgwOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgwMCwgMHgzNiwKKwkgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwgMHg2NCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg5QywgMHg0NywgMHgwMCwgMHg0MywgMHg0NSwKKwkgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHgxOCwgMHg2MCwgMHgyMiwgMHhGMywgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgwMSwgMHgwMCwKKwkgMHhBMCwgMHg1MCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgyOSwgMHgwMCwgMHhBRSwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RSwgMHhERCwgMHhGRSwKKwkgMHhBQywgMHg0RiwgMHgxMCwgMHhCQywgMHhBMCwgMHg1QywgMHhGRiwgMHhGRiwgMHgxMCwgMHhBQywgMHhBMCwgMHg1QywgMHgwMCwgMHg2MCwgMHhDOCwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3MSwgMHg3QywKKwkgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhDOCwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHg0MCwgMHhFMSwgMHg0MCwgMHgyOSwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg2NCwgMHhGMSwgMHg4MiwgMHhGOSwKKwkgMHgwNSwgMHg3QywgMHg4MywgMHhGOSwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxOCwgMHg2MCwgMHgwNywgMHhGMSwgMHhBRCwgMHg0RiwKKwkgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg2NCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHhCRiwgMHhGRSwgMHg0NSwgMHgwMCwgMHgxOCwgMHg2MCwgMHgwNywgMHhGMSwKKwkgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg2NCwgMHhGMSwgMHgwMiwgMHhCMSwgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0MCwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyNywgMHhDOCwgMHg2NCwgMHg4MSwgMHhGQiwgMHg4MiwgMHhGOSwKKwkgMHgwNSwgMHg2NCwgMHg4MywgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywgMHhDMywgMHg4NSwgMHg4MCwgMHhFMSwgMHhERiwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0OCwgMHg2MCwgMHg0NywgMHg4MCwgMHhCQywgMHgwMCwgMHg3RiwgMHg2MCwgMHg0QSwgMHhENywgMHg4MCwgMHhBMSwgMHhGRiwgMHhGNiwgMHgwMiwKKwkgMHhCRiwgMHhGRSwgMHgxMSwgMHgwMCwgMHg0MywgMHg0NSwgMHhBNCwgMHhEMSwgMHhEQSwgMHg4MywgMHgwRCwgMHgxOCwgMHg2NCwgMHg0NCwgMHgwMCwgMHg2MSwKKwkgMHhGQSwgMHhBNCwgMHhERCwgMHg4MSwgMHhGRCwgMHgwMiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRSwKKwkgMHgwMiwgMHgwMCwgMHhGMSwgMHhGRSwgMHgwMSwgMHgwMCwgMHgyNSwgMHg0MywgMHgyMSwgMHhFMSwgMHgwMCwgMHg2NCwgMHhCRiwgMHhEQiwgMHgyMCwgMHg0NCwKKwkgMHgyMCwgMHgyQSwgMHgwNywgMHgwMCwgMHgwNywgMHhCNCwgMHgwNCwgMHgzNiwgMHhDMywgMHhGRSwgMHgwNiwgMHgzNiwgMHhDQywgMHhGRSwgMHgwNywgMHgzNiwKKwkgMHhENSwgMHhGRSwgMHgyMCwgMHg0NCwgMHhEOCwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxRiwgMHg2MCwgMHgyQywgMHg2MywgMHhCRCwgMHhEMywgMHgwMywgMHg2MSwKKwkgMHgwRiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNCwgMHg2MSwgMHgwQiwgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNiwgMHg2MSwKKwkgMHgwNywgMHgxQiwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgwNywgMHg2MSwgMHgwMywgMHgxQiwgMHhDMywgMHg2MCwgMHg1MywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwgMHgyMCwgMHg0NCwgMHgwNywgMHhCNSwgMHhENCwgMHg4NSwgMHgzNSwgMHg4MCwgMHgyNCwgMHg0NSwgMHgxRiwgMHg2MCwKKwkgMHg2QywgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHg0MCwgMHg0NCwgMHgxMCwgMHgyNywgMHgxOSwgMHgwMCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgwNiwgMHgwMCwgMHgyNCwgMHg0NywgMHgwOCwgMHgyQiwgMHgxMywgMHgwMCwgMHgwNywgMHhCNCwgMHgwMSwgMHgzNiwgMHgxMSwgMHgwMCwgMHhGRiwgMHg2MCwKKwkgMHg3RiwgMHg2NSwgMHgxNSwgMHg2MCwgMHhBMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyQiwgMHhBNCwgMHg4NCwgMHhBMCwgMHg1NywgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0OSwgMHhGRiwgMHhGRiwgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMCwgMHg3RiwgMHhBMywgMHhEQiwgMHhBQiwgMHgwMSwKKwkgMHg2NCwgMHg0MiwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRCwgMHhEOSwgMHhBMywgMHhEQiwgMHhBMywgMHgwMSwKKwkgMHg0MywgMHg0NSwgMHgyMCwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHg0MCwgMHg0NCwKKwkgMHgxMCwgMHgyQiwgMHgxNiwgMHgwMCwgMHhCRSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgxNSwgMHg2MCwgMHg4MCwgMHhFNywgMHgyNCwgMHg0MCwgMHgwNywgMHgyNywKKwkgMHgwNCwgMHgwMCwgMHhBQywgMHg0RiwgMHgxMCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1QywgMHg2NCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHgyNCwgMHg0MCwgMHgyMCwgMHgyNywgMHgxRCwgMHgwMCwgMHhBQywgMHg0RiwgMHhFRiwgMHhCNCwgMHhBMCwgMHg1QywgMHgxOSwgMHgwMCwKKwkgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgwNiwgMHgwMCwgMHgyNCwgMHg0NywgMHgwOCwgMHgyQiwgMHgxMywgMHgwMCwgMHgwNywgMHhCNCwgMHgwMSwgMHgzNiwKKwkgMHgxMSwgMHgwMCwgMHgxNSwgMHg2MCwgMHgyMiwgMHg2NCwgMHgyNCwgMHg0MCwgMHgwOCwgMHgyNywgMHg4MCwgMHhCQywgMHg3QywgMHg0OCwgMHhCRSwgMHhEMywKKwkgMHhBMCwgMHg1NywgMHg2MCwgMHg0OCwgMHg2NCwgMHg0NCwgMHg4MCwgMHhCQywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2OSwgMHgwMSwgMHgwMSwgMHg2MSwgMHgxQSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MywgMHgwMSwKKwkgMHgyOCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwgMHg5QSwgMHgwMCwgMHhGRiwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHgyNywgMHgwMCwgMHgwQywgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgyMywgMHgwMCwKKwkgMHgyOSwgMHhGMSwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHg1QSwgMHhEOSwgMHgxQywgMHg2MCwgMHhEMCwgMHg2NCwgMHg3RiwgMHhGQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg2MCwgMHgyMiwgMHg2MywgMHgwOSwgMHg2MSwgMHgxQSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg3NywgMHgwMCwgMHhEMywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhEMywgMHhGQiwKKwkgMHgwNiwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHgxRCwgMHg2MCwgMHg0RiwgMHg2NCwgMHg3RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHhGMywgMHgxMSwgMHg2MCwgMHhGOSwgMHg2NSwgMHg2MCwgMHg1QywgMHgzRiwgMHg0MCwKKwkgMHgwMiwgMHgyQiwgMHgxMywgMHgwMCwgMHgwMCwgMHgzNywgMHgxMSwgMHgwMCwgMHgwMSwgMHgzQiwgMHg1NSwgMHgwMCwgMHgxMSwgMHg2MCwgMHgxOSwgMHg2MywKKwkgMHhGRiwgMHhCNywgMHg2MCwgMHg1QywgMHhBMywgMHhEMywgMHgwOCwgMHhBMywgMHgwMCwgMHg3RSwgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywKKwkgMHhGOSwgMHgwMiwgMHg0OSwgMHgwMCwgMHhGNCwgMHhBMywgMHhBMywgMHhEMywgMHgwNSwgMHgwMCwgMHgwMCwgMHhCQywgMHhGMiwgMHhBNCwgMHg0MywgMHgwMywKKwkgMHg0MiwgMHgwNywgMHg2NCwgMHg0NCwgMHg2NCwgMHhGQiwgMHg4MiwgMHhGQiwgMHhDOCwgMHg2NCwgMHg4MSwgMHhGQiwgMHgwNywgMHg2NCwgMHg4MywgMHhGQiwKKwkgMHgxRCwgMHg2MCwgMHg0RiwgMHg2NCwgMHg3RiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhERiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxOSwgMHhGRiwgMHhGMCwgMHg2MCwKKwkgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg5OCwgMHg3MSwgMHg4RCwgMHhFMiwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwKKwkgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGQiwgMHgwMSwgMHg4OCwgMHhFMiwgMHhCQSwgMHg2MCwgMHhEMCwgMHg2NCwgMHgwMywgMHhGQiwgMHg4RCwgMHhGRiwKKwkgMHgxNSwgMHgwMCwgMHg4RCwgMHhGRiwgMHhCMSwgMHg2MCwgMHhFRCwgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwKKwkgMHgxRCwgMHg2MCwgMHgzQywgMHg2MywgMHg3RiwgMHhGRCwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg2MCwgMHg3QywgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHgyOSwgMHhGNSwgMHgxRiwgMHg2MCwKKwkgMHgyNiwgMHg2MywgMHgxRSwgMHg2MCwgMHhGOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHgwMSwgMHgwMCwgMHgzNiwKKwkgMHg2NywgMHgwMSwgMHgwMSwgMHgzNiwgMHg2OSwgMHgwMSwgMHgwMiwgMHgzNiwgMHg3RiwgMHgwMSwgMHgwMywgMHgzNiwgMHg4OSwgMHgwMSwgMHgwNCwgMHgzNiwKKwkgMHhDMSwgMHgwMSwgMHgwNSwgMHgzNiwgMHhCRiwgMHgwMSwgMHgwNiwgMHgzNiwgMHhGMSwgMHgwMSwgMHgwNywgMHgzNiwgMHhCQiwgMHgwMSwgMHgwOCwgMHgzNiwKKwkgMHg4QSwgMHgwMSwgMHgwOSwgMHgzNiwgMHgwQywgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzNiwgMHgwRSwgMHgwMCwgMHgwQywgMHgzNiwKKwkgMHgxNywgMHgwMCwgMHgwRCwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxRCwgMHgwMCwgMHgwRiwgMHgzNiwgMHg0MSwgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgzMiwgMHg0NSwgMHhCNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCMiwgMHg2MCwgMHhEMCwgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywKKwkgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHgwMiwgMHgyQiwgMHgxNSwgMHgwMCwgMHg4OCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg5OCwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGQiwgMHgwMSwgMHg4OCwgMHhFMiwgMHhCQSwgMHg2MCwKKwkgMHhEMCwgMHg2NCwgMHgwMywgMHhGQiwgMHg4RCwgMHhGRiwgMHgxMSwgMHgwMCwgMHg4RCwgMHhGRiwgMHg5MCwgMHg2MCwgMHgwMCwgMHhFOCwgMHhCMSwgMHg2MCwKKwkgMHhFRCwgMHg2MywgMHgwNCwgMHgwMCwgMHg5MSwgMHg2MCwgMHgwMCwgMHhFOCwgMHhCMiwgMHg2MCwgMHhCNiwgMHg2MywgMHgyQSwgMHhFOCwgMHgwNiwgMHg2MCwKKwkgMHgwQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwgMHhEMiwgMHhGQiwgMHhBRCwgMHg0RiwgMHhGRCwgMHhCNCwgMHhBMCwgMHg1RCwgMHhEMCwgMHg2MCwKKwkgMHgwMCwgMHhFOCwgMHgyQSwgMHhFOCwgMHhEOSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgzMiwgMHg0NSwgMHhBNCwgMHg4NSwgMHg0NSwgMHg1MiwgMHg5OSwgMHhGRiwKKwkgMHhBNSwgMHg0RiwgMHhGRiwgMHhCNCwgMHgwNywgMHhGQiwgMHg5OCwgMHhGRiwgMHhBNCwgMHg2MCwgMHg3QywgMHg2MywgMHgwNiwgMHg2MCwgMHgwQiwgMHhGRCwKKwkgMHg2MiwgMHhGRiwgMHgwMCwgMHg2NywgMHgyMywgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwKKwkgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwKKwkgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwgMHgwOCwgMHhFMSwgMHhBMywgMHg2MCwKKwkgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBOCwgMHhFMiwgMHgwMSwgMHg3MCwgMHhBRCwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwgMHg2NCwgMHg1NCwKKwkgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwgMHgwMCwgMHhCQywKKwkgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwKKwkgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg1QywgMHg0NCwKKwkgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHhBNCwgMHhFMiwgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwKKwkgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwKKwkgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwKKwkgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhFMSwgMHgzMCwgMHg0MCwgMHgwMiwgMHgzNiwgMHhBMSwgMHhGRiwgMHg4MywgMHhGRiwgMHg4RCwgMHhGRiwgMHg1QywgMHg0NCwgMHg1QywgMHg0MywKKwkgMHg1QywgMHg0MiwgMHg1QywgMHg0MSwgMHg1QywgMHg0MCwgMHhBQywgMHhGRiwgMHhBRCwgMHhGRiwgMHhFNywgMHhFMSwgMHhCMywgMHg2MCwgMHhCRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMywgMHgwMiwgMHgyOCwgMHhFMiwgMHg0MCwgMHhGRiwgMHhBMSwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhDMSwgMHg2MCwgMHg2QiwgMHg2NCwgMHg0MCwgMHg0MiwgMHhCNywgMHg2MCwgMHhBMiwgMHg2NCwgMHg0MCwgMHg0MCwgMHg5QywgMHhGMywKKwkgMHg2NSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MywgMHhBOSwgMHhGMywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2MCwgMHg5QSwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHg1QywgMHg0OSwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHg1QywgMHg1QywKKwkgMHgwMSwgMHg2MCwgMHgzOSwgMHhFMiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg3QSwgMHg4OSwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHg3MywgMHg4OCwgMHhGRiwKKwkgMHhCNywgMHg2MCwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNiwgMHgwMiwgMHg0MCwgMHhGRiwKKwkgMHg0MiwgMHhGRiwgMHg0MywgMHhGRiwgMHg0NCwgMHhGRiwgMHg0NSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg4OCwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyMSwgMHhFMSwKKwkgMHg1QywgMHg0MCwgMHhDMywgMHg2MCwgMHg1MywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwKKwkgMHgwMSwgMHgwMiwgMHhBMSwgMHhGRiwgMHg4NiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg1QywgMHg0NiwgMHg1QywgMHg0OSwgMHg1QywgMHg0MCwgMHhFMSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgxMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhERCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHhFMSwKKwkgMHhBMywgMHhGRiwgMHhDQSwgMHg2MCwgMHg3RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHhFMSwgMHhBMywgMHhGRiwgMHgxRSwgMHg2MCwgMHg5RSwgMHg2MywKKwkgMHgxNywgMHhGRCwgMHhBRSwgMHhGRiwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGMywgMHg4NywgMHhGMywgMHhEQywgMHg4MSwKKwkgMHgwMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMCwgMHhGQSwgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwKKwkgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHg4NiwgMHhGMywgMHg4NywgMHhGNSwgMHhEQywgMHg4MSwgMHg4MCwgMHg2NywgMHg0MCwgMHg0QSwgMHgwNSwgMHgxOCwKKwkgMHgyQSwgMHg0MywgMHgwMiwgMHhGQywgMHg1RiwgMHg4QSwgMHgwMCwgMHhGNCwgMHhGQSwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGMywKKwkgMHgwNiwgMHg2MSwgMHgwMCwgMHg3QywgMHg2MCwgMHg0NiwgMHhGRSwgMHg2MywgMHhBMywgMHhEOCwgMHhGRSwgMHgxRiwgMHhDRCwgMHg4MSwgMHg2NiwgMHg0NCwKKwkgMHhEOCwgMHg4NCwgMHhGOCwgMHgwMiwgMHgwOSwgMHg2MCwgMHgyQiwgMHg3QywgMHg4OCwgMHhGMywgMHgwNiwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwMSwgMHg2MywKKwkgMHg3NiwgMHhGOCwgMHgwMCwgMHhGQywgMHg2MywgMHg0NywgMHgwNiwgMHhGQSwgMHg3NiwgMHhGOCwgMHgwMywgMHg2NCwgMHg3NywgMHhGQSwgMHhERiwgMHg4MywKKwkgMHg2NiwgMHg0NCwgMHhDRCwgMHg4MSwgMHgwMiwgMHhBNiwgMHhGNCwgMHgwMiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4QSwgMHhGMSwgMHg4OSwgMHhGMywKKwkgMHg3QywgMHg2MywgMHg4QywgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMSwgMHhGQywgMHhEQywgMHg4NCwgMHhEMCwgMHg4MCwgMHgwMCwgMHhGQSwgMHhGQSwgMHgwNCwKKwkgMHg4RCwgMHhGQiwgMHg2MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHg2MywgMHg0NCwgMHg4MCwgMHg3RiwgMHgwMSwgMHhGQSwgMHg4QSwgMHhGMywKKwkgMHg4OSwgMHhGMSwgMHhEQywgMHg4NCwgMHhEMCwgMHg4NCwgMHg4QiwgMHhGQiwgMHgwMywgMHg2MCwgMHgyNiwgMHg2MSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyRSwgMHhGQiwgMHg4MiwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4NywgMHhGRiwgMHg4QiwgMHhGMywKKwkgMHg5MywgMHhGQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MCwgMHg2MywgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NiwgMHhGRiwgMHg2NSwgMHhGRiwgMHg2NCwgMHhGRiwKKwkgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHg0OSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1MiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg1QywgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHg2NSwgMHg2MCwgMHgwMiwgMHhFMSwgMHg2QiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg3NiwgMHg2MCwgMHgwMiwgMHhFMSwgMHg0MSwgMHg2MCwgMHgwMiwgMHhFMSwKKwkgMHgwNCwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5RiwgMHhGQiwgMHgxRiwgMHg2MCwgMHg2NCwgMHg2NCwgMHg3RiwgMHhGQiwgMHgyRCwgMHhGRiwgMHgwQSwgMHg2MSwKKwkgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMCwgMHg2NywKKwkgMHgwRSwgMHhGQSwgMHgxRiwgMHg2MCwgMHgwQSwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5MywgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFQSwgMHgwMiwgMHgwOSwgMHg2MSwKKwkgMHg0MSwgMHg0QiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwKKwkgMHhGRSwgMHg2NCwgMHgwRiwgMHg2MCwgMHg5MywgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhGRiwgMHhGRiwgMHhFQywgMHgwMiwgMHgxRSwgMHg2MCwgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwgMHg1MCwgMHg2MCwgMHgwMywgMHhFQSwgMHg1MSwgMHg2MCwgMHgxMywgMHhFQSwgMHg1MiwgMHg2MCwgMHgzMCwgMHhFQSwKKwkgMHg1MywgMHg2MCwgMHg0MCwgMHhFQSwgMHg1NCwgMHg2MCwgMHg1MiwgMHhFQSwgMHg1NSwgMHg2MCwgMHg2RCwgMHhFQSwgMHg1NiwgMHg2MCwgMHg3MSwgMHhFQSwKKwkgMHg1NywgMHg2MCwgMHg4QiwgMHhFQSwgMHg1OCwgMHg2MCwgMHg0NywgMHhFQSwgMHg1OSwgMHg2MCwgMHhBMCwgMHhFQSwgMHg1QSwgMHg2MCwgMHhCMiwgMHhFQSwKKwkgMHg1QiwgMHg2MCwgMHhDMSwgMHhFQSwgMHg1QywgMHg2MCwgMHhENywgMHhFQSwgMHg1RCwgMHg2MCwgMHhFQiwgMHhFQSwgMHg1RSwgMHg2MCwgMHhBMCwgMHhFQSwKKwkgMHg1MCwgMHg2MCwgMHgzNiwgMHhFQiwgMHg1MSwgMHg2MCwgMHgzNywgMHhFQiwgMHg1MiwgMHg2MCwgMHgyMCwgMHhFQiwgMHg1MywgMHg2MCwgMHhFNCwgMHhFQiwKKwkgMHg1NCwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1NSwgMHg2MCwgMHg1OCwgMHhFQiwgMHg1NiwgMHg2MCwgMHg0OCwgMHhFQiwgMHg1NywgMHg2MCwgMHhEMCwgMHhFQiwKKwkgMHg1OCwgMHg2MCwgMHhDMywgMHhFQiwgMHg1OSwgMHg2MCwgMHhGQywgMHhFQiwgMHg1QSwgMHg2MCwgMHgzNCwgMHhFQiwgMHg1QiwgMHg2MCwgMHg1OCwgMHhFQiwKKwkgMHg1QywgMHg2MCwgMHhDMCwgMHhFQiwgMHg1RCwgMHg2MCwgMHhEMCwgMHhFQiwgMHg1RSwgMHg2MCwgMHg5MSwgMHhFQiwgMHgwMCwgMHhFQSwgMHgwMCwgMHhFQiwKKwkgMHhFMCwgMHg2MCwgMHgwMiwgMHhFQSwgMHhFMCwgMHg2MCwgMHgwMywgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhBQiwgMHg0OCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHhFQiwgMHgwMywgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHhEQiwKKwkgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHgyNCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgwNCwgMHhGQiwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwNSwgMHhGQiwgMHgxMCwgMHg2MCwKKwkgMHgxMCwgMHg3NSwgMHhGMCwgMHg2MCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHg0MCwgMHgwMCwgMHgwNSwgMHg2MCwKKwkgMHhGOSwgMHhGMSwgMHg0MiwgMHg2MCwgMHgwOCwgMHg2NCwgMHgwOSwgMHg2MCwgMHgxOSwgMHg2MywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg0MiwgMHg2MCwgMHgwOSwgMHg2NCwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2MywgMHgxOCwgMHg2MCwgMHgyMiwgMHhGQiwgMHgwNCwgMHg2MCwgMHgwMCwgMHhCQywKKwkgMHgxOCwgMHg2MCwgMHgxRSwgMHhGQiwgMHgxOCwgMHg2MCwgMHgxRCwgMHhGRCwgMHgxRCwgMHg2MCwgMHgxOSwgMHg2MywgMHgxOCwgMHg2MCwgMHgyMSwgMHhGRCwKKwkgMHg4MCwgMHg2MCwgMHgxQywgMHg2NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHg2MCwgMHg2MCwgMHgxQywgMHg2NCwgMHgxOCwgMHg2MCwKKwkgMHgyMywgMHhGQiwgMHgxOCwgMHg2MCwgMHgxRiwgMHhGQiwgMHgxOCwgMHg2MCwgMHgyMiwgMHhGMywgMHhBMCwgMHg1MCwgMHhBMCwgMHg1MCwgMHgwQiwgMHg2MCwKKwkgMHhGOCwgMHg2MywgMHhBMywgMHhEMSwgMHgzMCwgMHg2MCwgMHgzOCwgMHg2MSwgMHhBMSwgMHhEMywgMHhGOCwgMHhBMywgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHgwNiwgMHhBMywgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHhGRSwgMHhBMywKKwkgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMSwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5MCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwKKwkgMHg1OCwgMHhFQywgMHg4MCwgMHg2MCwgMHgwMCwgMHhFRCwgMHg4MCwgMHg2MCwgMHg4MCwgMHhFRSwgMHg0MCwgMHhFQywgMHgwMCwgMHhFRCwgMHgwMCwgMHhFRSwKKwkgMHhDMCwgMHg2MCwgMHg1OSwgMHhFQywgMHhDMCwgMHg2MCwgMHgwNywgMHhFRCwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHhBRCwgMHg0RiwgMHhGQSwgMHhCNCwKKwkgMHhBMCwgMHg1RCwgMHgwMCwgMHhGMywgMHgyOCwgMHhGQiwgMHg0MCwgMHg0NCwgMHhBMiwgMHg2MCwgMHhFOCwgMHg3QywgMHgyMCwgMHhGOSwgMHgxRCwgMHg2MCwKKwkgMHhEMCwgMHg3QywgMHgyMSwgMHhGOSwgMHgxRCwgMHg2MCwgMHhFNiwgMHg3QywgMHgyMiwgMHhGOSwgMHgxRSwgMHg2MCwgMHg0NCwgMHg3QywgMHgyMywgMHhGOSwKKwkgMHgxRSwgMHg2MCwgMHg1NSwgMHg3QywgMHgyNCwgMHhGOSwgMHgxRSwgMHg2MCwgMHg3RiwgMHg3QywgMHgyNSwgMHhGOSwgMHgxRSwgMHg2MCwgMHg5MCwgMHg3QywKKwkgMHgyNiwgMHhGOSwgMHhEMCwgMHg2MCwgMHgwMCwgMHhFOCwgMHgyOCwgMHhFOCwgMHg0NCwgMHg2MCwgMHgwMSwgMHhFNiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg1MiwKKwkgMHgxMCwgMHg2MCwgMHgwNCwgMHhFNiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhGRCwgMHg2MCwgMHgwQywgMHg2NSwgMHg1QiwgMHhEMywgMHhCRiwgMHhEMSwKKwkgMHgwQywgMHgxOCwgMHhDMywgMHg4MywgMHhENCwgMHg4MCwgMHhDMywgMHg4MywgMHhGOSwgMHgwMiwgMHhGQSwgMHhBMywgMHhBMywgMHhEMywgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhGOSwgMHhBMCwgMHhGQywgMHhBMCwgMHgwOSwgMHgwNSwgMHgwMCwgMHgwNSwgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzRiwgMHg0MywKKwkgMHgyMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhDMCwgMHg2MCwgMHg4RiwgMHhFRSwgMHgwOCwgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgxOCwgMHhGQiwgMHgzRiwgMHg0MywgMHgxMSwgMHg2MCwgMHgxMCwgMHhFNiwgMHhCNywgMHg4NCwgMHg0MCwgMHg1RiwgMHgzMCwgMHg2MCwKKwkgMHgyMCwgMHg2MywgMHgzRiwgMHg0MCwgMHgyMCwgMHgyNywgMHgwNiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhGMCwgMHg2NCwgMHgwMywgMHgwMCwgMHgwRiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHgzMCwgMHhFMiwKKwkgMHgwMCwgMHg2MCwgMHg1MCwgMHhFMiwgMHgwMCwgMHg2MCwgMHg3OSwgMHhFMiwgMHgwMCwgMHg2MCwgMHg5MCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhEMCwgMHhFMiwKKwkgMHgwMSwgMHg2MCwgMHhGMCwgMHhFMiwgMHgwMSwgMHg2MCwgMHhCMCwgMHhFMiwgMHgxMywgMHg2NCwgMHhBRCwgMHhGQiwgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwKKwkgMHgzNywgMHhGQiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHgzNiwgMHhGQiwgMHgwOSwgMHg2MCwgMHgyQSwgMHg2NCwgMHg5OCwgMHhGQiwgMHg4MiwgMHhGRiwKKwkgMHg5MiwgMHhGRiwgMHg1QywgMHg0MSwgMHg1QywgMHg0NiwgMHg1QywgMHg0NywgMHgwMCwgMHhFMSwgMHhBNCwgMHg2MCwgMHg3QywgMHg2MywgMHgwQywgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHhBMCwgMHhERCwgMHg4NywgMHhGRiwgMHg5NywgMHhGRiwgMHgwQywgMHg2MCwgMHgwMiwgMHg2NCwgMHg0MCwgMHg1QSwgMHgwNiwgMHhBNCwKKwkgMHg0MCwgMHg1QiwgMHg1QywgMHg1RSwgMHgxMywgMHg2MCwgMHg1MiwgMHhGMywgMHg2NCwgMHhGQiwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyMiwgMHgwMywgMHgwMCwKKwkgMHg4MCwgMHg2MCwgMHgzNywgMHg3QywgMHgwMiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgyNywgMHg3QywgMHgxNiwgMHg2MCwgMHg1NSwgMHhGOSwgMHgwMCwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHg4OSwgMHhGQiwgMHgwMiwgMHg2MCwgMHg4MCwgMHg2NiwgMHgyMiwgMHg2MCwgMHgyMiwgMHg2NCwgMHg3NywgMHg2MCwgMHg3NywgMHg2MywKKwkgMHgwMCwgMHhGQSwgMHgwMSwgMHhGQywgMHgwMCwgMHhGMCwgMHgwMSwgMHhGMCwgMHhEMCwgMHg4MCwgMHhEMywgMHg4MCwgMHgxRSwgMHgwMiwgMHgxRCwgMHgwMiwKKwkgMHgwNiwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGMCwKKwkgMHgyQSwgMHg0MSwgMHg1MCwgMHg2NSwgMHhEMywgMHg4MCwgMHhDRCwgMHg4NCwgMHgxMywgMHgwMywgMHgwQSwgMHg2MCwgMHg4MCwgMHg2NSwgMHg0NSwgMHg0QSwKKwkgMHhBQSwgMHg0NiwgMHgwMCwgMHhGQywgMHgwMSwgMHhGQSwgMHhBQSwgMHg0NiwgMHgwMCwgMHhGMCwgMHg2NSwgMHg0MSwgMHhDOCwgMHg2NSwgMHhEMywgMHg4MCwKKwkgMHhDRCwgMHg4NCwgMHgwNiwgMHgwMywgMHgxMiwgMHg2MCwgMHg3RiwgMHg2NCwgMHgwMywgMHgwMCwgMHgxMCwgMHg2NSwgMHgwMiwgMHg2MCwgMHg3RiwgMHg2NCwKKwkgMHg2NSwgMHg0MywgMHg4NiwgMHhGRCwgMHgwRiwgMHg2MCwgMHg1QiwgMHhGRCwgMHgwNywgMHg2MSwgMHhDNSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhENCwgMHg4NCwKKwkgMHg4QSwgMHhGQiwgMHhEQywgMHg4NCwgMHg4OCwgMHhGQiwgMHgwQywgMHhBNCwgMHg4NywgMHhGQiwgMHgwRiwgMHg2MCwgMHg1QywgMHhGQiwgMHgxRSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOCwgMHg2MCwgMHgyMCwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHgwMCwgMHg2NCwKKwkgMHgwQSwgMHg2MCwgMHg3RSwgMHhGQiwgMHgxRSwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg1MSwgMHgzRiwgMHg0MSwgMHhBNSwgMHg0QywKKwkgMHg1MCwgMHgzNywgMHgwQiwgMHgwMCwgMHgwMSwgMHhCOSwgMHg0MSwgMHg1RiwgMHhCNSwgMHg2MCwgMHg1NSwgMHhFMCwgMHgwNSwgMHg2MCwgMHhGOSwgMHhGMSwKKwkgMHhDMCwgMHg2NywgMHg5MCwgMHg4NCwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNiwgMHhBMCwgMHg1MCwgMHgwNiwgMHg2MCwgMHgwOCwgMHhGMywgMHgwMSwgMHg2MCwKKwkgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHgwMiwgMHg3QywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHgxMCwgMHgwMiwgMHg1QSwgMHhEMSwKKwkgMHg1QSwgMHhEMywgMHgzRSwgMHg2MCwgMHgwMCwgMHg2NiwgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHhGNywgMHg2MCwgMHg4QywgMHg2MSwgMHg2NCwgMHg0NCwKKwkgMHhDOCwgMHg4NCwgMHgwQywgMHg2MywgMHhBQSwgMHg0NiwgMHg1OCwgMHhEMCwgMHhBQSwgMHg0NiwgMHg1OSwgMHhEOCwgMHhGQiwgMHgxRiwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhGQSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHgwMiwgMHhBOCwgMHhENCwgMHg4MCwgMHgwNywgMHgwMiwKKwkgMHgwNiwgMHgwMiwgMHg0OSwgMHg2MCwgMHg0QywgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHg0MSwgMHg0QiwgMHgwMywgMHgwMCwgMHgyNCwgMHg2MCwKKwkgMHg4NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0MSwgMHg0OSwgMHg2MCwgMHg5NCwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNSwgMHgwNSwKKwkgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwKKwkgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwKKwkgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHg2NywgMHg0NCwgMHhDMCwgMHg4NCwgMHhFMCwgMHg4NSwgMHgyQywgMHg0NCwKKwkgMHhENCwgMHg4MCwgMHg2MywgMHg0MSwgMHgwMSwgMHgwNiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4MywgMHhBQSwgMHg0NiwgMHg1OSwgMHhEMSwgMHgyNywgMHhEOCwKKwkgMHg1QSwgMHg4NywgMHhGQywgMHgxRiwgMHhBQSwgMHg0NiwgMHgyQiwgMHg0MSwgMHhENSwgMHgwMSwgMHg0OSwgMHg2MCwgMHg5NCwgMHg2MSwgMHg0MSwgMHg0QiwKKwkgMHgyQiwgMHg0MSwgMHg0OSwgMHg2MCwgMHg5NCwgMHg3QywgMHhEMSwgMHg4MCwgMHhBMSwgMHhEMiwgMHgyNywgMHgwNSwgMHg1OSwgMHhEMCwgMHg2MCwgMHg0NSwKKwkgMHg1OSwgMHhEMiwgMHg0NCwgMHg0NywgMHhFMCwgMHg4NywgMHg0MCwgMHg0QSwgMHg1OSwgMHhEMiwgMHg1OSwgMHg4QiwgMHg0MCwgMHg0QywgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHhFQywgMHgxOCwgMHhENCwgMHg4MCwgMHhFQSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywKKwkgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHgwNCwgMHhBMywgMHhBMywgMHhEMSwgMHg1QSwgMHg4OCwgMHgyQywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNiwgMHg2NCwgMHg0MywgMHhDRiwgMHg4MywgMHhBQSwgMHg0NiwgMHg2MCwgMHhGRSwgMHgyOCwgMHhEMSwgMHg1RSwgMHg4OCwgMHgyNywgMHhEOCwKKwkgMHg1QSwgMHg4NywgMHhGQiwgMHgxRiwgMHgyMCwgMHhGRSwgMHhBQSwgMHg0NiwgMHhEMywgMHgwMSwgMHhGQSwgMHg2MCwgMHgzOSwgMHg2NSwgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhCRSwgMHhEMSwgMHgwNywgMHg2MCwgMHhFRCwgMHhGOSwgMHgwNywgMHg2MCwKKwkgMHhFRCwgMHhGMywgMHgyMCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgwNywgMHg2MCwgMHhFQywgMHhGOSwKKwkgMHgwNywgMHg2MCwgMHhFQiwgMHhGOSwgMHgxMiwgMHgwMCwgMHgwNCwgMHhCMCwgMHgxMCwgMHg2MCwgMHg1NSwgMHhGMywgMHgwRSwgMHgwMywgMHgwMiwgMHhCQywKKwkgMHhBMiwgMHhEQiwgMHgwNywgMHg2MCwgMHhGNSwgMHhGQiwgMHgxMCwgMHg2MCwgMHhFOCwgMHhGMywgMHgxMCwgMHg2MCwgMHhBQywgMHhGMywgMHgwMiwgMHhCRCwKKwkgMHgwMiwgMHhCQywgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgxMCwgMHg2MCwgMHhFOCwgMHhGQiwgMHgwNywgMHg2MCwgMHhFRCwgMHhGMywgMHgzMSwgMHg0MSwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHg0MCwgMHhCOSwgMHg0MCwgMHgyNiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg4MCwgMHhCOSwKKwkgMHg0MSwgMHg1MSwgMHhGQSwgMHg2MCwgMHgzQSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwKKwkgMHgyMywgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QiwgMHhEMywgMHhGOCwgMHg2MCwgMHgzRiwgMHg2NSwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHgxMCwgMHg2MCwgMHhGNywgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMCwgMHg2MCwgMHhGQSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwgMHhGQSwgMHg2MSwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg1OSwgMHhEMywKKwkgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwMCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwKKwkgMHgwMywgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwNiwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgwOSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgwRiwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywgMHhGOCwgMHg2MCwgMHgzRiwgMHg2NSwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgxMiwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgxNSwgMHhGMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyMiwgMHg2MCwKKwkgMHgzMCwgMHg2MSwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhBMSwgMHhEMywKKwkgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHg1OSwgMHhEMywgMHhFMCwgMHg5QywgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHgxMSwgMHg2MCwgMHgxQiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgxRSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgyMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgxMSwgMHg2MCwgMHgyNCwgMHhGMywgMHhFMCwgMHg5QywKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxMSwgMHg2MCwgMHgyNywgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgyQSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBNCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg2QSwgMHg2MywKKwkgMHgyMiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgyMSwgMHg2MCwgMHhFQSwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxMSwgMHg2MCwKKwkgMHgzMywgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwKKwkgMHgxMSwgMHg2MCwgMHgzNywgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHgzOSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg0MCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwKKwkgMHg0MiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg0RSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg1MiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg1NCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwKKwkgMHg1QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywgMHhBMiwgMHhEQiwgMHgxMSwgMHg2MCwgMHg1RCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxOCwgMHhBQywKKwkgMHhBMiwgMHhEQiwgMHhGQSwgMHg2MCwgMHgyQywgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMywKKwkgMHg2MywgMHg0NSwgMHgyMywgMHg2MCwgMHhGMCwgMHg2MywgMHgwNiwgMHg2MSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwRiwgMHhCNCwKKwkgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRiwgMHhCNCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNiwgMHgwMiwgMHhGQSwgMHg2MCwgMHgzMCwgMHg2NSwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhCRCwgMHhEMywgMHg2MywgMHg0NiwgMHgyNCwgMHg2MCwKKwkgMHg4OCwgMHg2MywgMHgxMiwgMHg2MCwgMHg1MywgMHhGQiwgMHhEQSwgMHg4NSwgMHhCRCwgMHhEQiwgMHgwRSwgMHg2MSwgMHhBNiwgMHhEMSwgMHhEQSwgMHg4NiwKKwkgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHhBNSwgMHhEQiwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGNSwgMHgwMiwgMHhGQSwgMHg2MCwgMHgzMSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHgwMywKKwkgMHhCRCwgMHhEMywgMHgxMiwgMHg2MCwgMHg3MSwgMHhGQiwgMHg1QSwgMHg4MSwgMHgxMiwgMHg2MCwgMHg4MCwgMHhGQiwgMHg1QSwgMHg4MiwgMHgxMiwgMHg2MCwKKwkgMHg4RiwgMHhGQiwgMHg1QSwgMHg4MywgMHgxMiwgMHg2MCwgMHg5RSwgMHhGQiwgMHg1QSwgMHg4NCwgMHgwRSwgMHg2MSwgMHhCRCwgMHhEMSwgMHhCRCwgMHhENSwKKwkgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHgyMSwgMHhEQiwgMHg1QSwgMHg4MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHgyMiwgMHhEQiwgMHg1QSwgMHg4MiwKKwkgMHg2NiwgMHg0NCwgMHhGRiwgMHhCNCwgMHgyMywgMHhEQiwgMHg1QSwgMHg4MywgMHg2NiwgMHg0NywgMHhGRiwgMHhCNCwgMHgyNCwgMHhEQiwgMHhDRCwgMHg4MSwKKwkgMHg1QSwgMHg4NCwgMHhFQywgMHgwMiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHgwMywgMHg2MywgMHg0NSwgMHgyNSwgMHg2MCwgMHg1QSwgMHg2MywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhCRCwgMHhEOSwgMHgwMiwgMHg2MSwKKwkgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RSwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhDRCwgMHg4MSwKKwkgMHhCRCwgMHhEQiwgMHhGNiwgMHgwMiwgMHhGQSwgMHg2MCwgMHgyRSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxRiwgMHgwMywgMHg2MywgMHg0NiwgMHhGQywgMHhBMywgMHhBMywgMHhEMywgMHgyNCwgMHg2MCwgMHgwOCwgMHg2MywgMHhDQywgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhDQywgMHg4MSwgMHgwMCwgMHgzNiwgMHgwRCwgMHgwMCwgMHg2MywgMHg0NSwgMHhBNiwgMHhEMywgMHg1QSwgMHhEMSwgMHhEQSwgMHg4NiwgMHhGRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHg1QywgMHg5MCwgMHhCRCwgMHhEOSwgMHhGRCwgMHgwMiwgMHhDRCwgMHg4MSwgMHg2NiwgMHg0MiwgMHhGNCwgMHgwMiwKKwkgMHg2NiwgMHg0MiwgMHg1QSwgMHhEMywgMHgyNCwgMHg2MCwgMHg0OCwgMHg2NSwgMHhCRCwgMHhEQiwgMHhENywgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMiwKKwkgMHgyNSwgMHg2MCwgMHg2RSwgMHg2MSwgMHhGQSwgMHg2MCwgMHg0NiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgyRiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgzRSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHgzRiwgMHg2NSwgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwgMHg0MCwgMHg2NSwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhEOSwgMHg4MSwgMHhGQSwgMHg2MCwKKwkgMHgzQiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhBMSwgMHhERCwgMHhGQSwgMHg2MCwKKwkgMHg0OCwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywgMHhCRCwgMHhEMywgMHgyNSwgMHg2MCwKKwkgMHhDQSwgMHg2MSwgMHgwRSwgMHhCNCwgMHhCRCwgMHhEMSwgMHhBMSwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRSwgMHhCNCwgMHhBMywgMHhEMSwgMHg1OSwgMHhEQiwKKwkgMHg2NCwgMHg0NCwgMHgwRSwgMHhCNCwgMHg1OSwgMHhEQiwgMHg2NCwgMHg0NywgMHgwRSwgMHhCNCwgMHg1OSwgMHhEQiwgMHhGQSwgMHg2MCwgMHgyOSwgMHg2NSwKKwkgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgwNCwgMHhBMywgMHhBMywgMHhEMywgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgxMCwgMHg2MCwgMHgyOSwgMHhGQiwgMHhGQSwgMHg2MCwgMHgyQSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzOSwgMHgwMywgMHgwNCwgMHhBMywgMHhCRCwgMHhEMSwgMHgxMCwgMHg2MCwgMHhDRCwgMHhGMywgMHg2NCwgMHg0MSwKKwkgMHg2NCwgMHg1RSwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0NywgMHg1QSwgMHhEMywgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHhFMywgMHhGMywgMHhGRiwgMHg2MCwgMHhDMCwgMHhCNSwgMHg2MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwNSwgMHgwMCwgMHhFOSwgMHg4NywgMHgzRiwgMHhCNCwKKwkgMHhCNCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHgwMCwgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHhEQywgMHhGMSwgMHhFMSwgMHg4MCwKKwkgMHhGOSwgMHg4MSwgMHhFMSwgMHg4MCwgMHhGOSwgMHg4NCwgMHhGRiwgMHg2MCwgMHg4MCwgMHhCNCwgMHhDMCwgMHg5QywgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwKKwkgMHhERiwgMHhGMSwgMHhGRiwgMHhGRiwgMHhDMCwgMHg5QywgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwgMHhFNiwgMHhGMSwgMHgwMSwgMHg3RSwgMHg2MCwgMHg0NywKKwkgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NCwgMHhGRSwgMHg2MCwgMHgwMCwgMHhCNSwgMHhDMSwgMHg4NCwgMHgwMSwgMHg2MCwgMHhGRiwgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhEQiwgMHg4MywgMHgxMSwgMHg2MCwgMHg2MiwgMHhGRCwgMHhGQSwgMHg2MCwgMHgyQiwgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHgxMCwgMHg2MCwgMHhEMCwgMHhGQiwgMHhBMywgMHhEMywKKwkgMHgxMCwgMHg2MCwgMHg5NCwgMHhGQiwgMHhGQSwgMHg2MCwgMHgzQywgMHg2NSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxRiwgMHgwMywgMHhBMywgMHhEMywgMHhGQywgMHg2MCwgMHhGQywgMHg2NSwgMHhBNCwgMHg4NCwgMHg2MCwgMHg1QywgMHgwMCwgMHg3RSwgMHhDMCwgMHg2MCwKKwkgMHgwMCwgMHhBMCwgMHg2MCwgMHg0MywgMHgwNywgMHgwNCwgMHgxMCwgMHg2MCwgMHhENCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHhCNCwKKwkgMHgzQywgMHg5NCwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2MCwgMHgzMCwgMHg2MSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDMCwgMHhBMCwgMHg2MCwgMHg0NywKKwkgMHgwNywgMHgwNCwgMHg2MCwgMHg0MywgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwgMHhGRiwgMHhCNCwgMHgzQywgMHg5NCwgMHhBMSwgMHhEQiwKKwkgMHhCOCwgMHhGRSwgMHhCOSwgMHhGRSwgMHhCQSwgMHhGRSwgMHhCQiwgMHhGRSwgMHhCRCwgMHhGRSwgMHhCRiwgMHhGRSwgMHgxNSwgMHg2MCwgMHhDQiwgMHhGMywKKwkgMHgxMiwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNCwgMHgwMCwgMHgwQiwgMHg2MCwgMHhFQSwgMHg2MiwgMHg1QSwgMHhERiwgMHhGRSwgMHgxRiwKKwkgMHgxRiwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwNiwgMHg2MywgMHhCRSwgMHhEMywgMHhCRCwgMHhEMSwgMHgwNywgMHgxOCwKKwkgMHhENCwgMHg4MCwgMHgwNSwgMHgxOCwgMHgwMywgMHgwMywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhGNywgMHgwMSwgMHhEQiwgMHg4MywgMHgwMCwgMHhCQywKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRCwgMHhCMCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgxMCwgMHhGRCwgMHgzMiwgMHgwMSwKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHhGRCwgMHg5NCwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHg0MSwgMHhGQSwgMHg0NiwgMHgyMywKKwkgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0MiwgMHhGQSwgMHg2OCwgMHgyMywgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0MywgMHhGQSwgMHg4QSwgMHgyMywKKwkgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0NCwgMHhGQSwgMHhBQywgMHgyMywgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg0NSwgMHhGQSwgMHhDRSwgMHgyMywKKwkgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyNSwgMHhGRCwgMHg2MiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzNfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfNF9kYXRhW10gPSB7CisJIDB4NkMsIDB4NDAsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4RkYsIDB4MzMsIDB4RjMsIDB4MzIsIDB4MTEsIDB4MzEsIDB4MTgsIDB4NDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MUMsIDB4MDAsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsIDB4MjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjMsIDB4MDAsCisJIDB4NDEsIDB4RkYsIDB4QTMsIDB4NjAsIDB4MzQsIDB4NzgsIDB4RTIsIDB4RkUsIDB4NDAsIDB4NDksIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4MUQsIDB4MDAsCisJIDB4NDQsIDB4RkYsIDB4MUIsIDB4MDksIDB4MjksIDB4NDQsIDB4MTAsIDB4MkEsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MTAsIDB4NjUsIDB4MEIsIDB4MDAsCisJIDB4QTQsIDB4NjAsIDB4NDksIDB4NzgsIDB4QTQsIDB4RTIsIDB4MjksIDB4NDQsIDB4MjAsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MjAsIDB4QUMsIDB4RUMsIDB4MDEsCisJIDB4QTQsIDB4NjAsIDB4NDksIDB4NzgsIDB4NDYsIDB4RkYsIDB4QjQsIDB4ODQsIDB4NDAsIDB4NDksIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4QTQsIDB4NjAsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsCisJIDB4QUEsIDB4NjAsIDB4RjQsIDB4NzgsIDB4NEMsIDB4NEUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4RkIsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4ODQsIDB4RkYsIDB4MjIsIDB4NTgsIDB4ODIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTQsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4MjksIDB4RkEsIDB4MDEsIDB4RTQsIDB4RTIsIDB4QUEsIDB4NjAsIDB4QjAsIDB4NzgsIDB4OTQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4NjAsIDB4MzUsIDB4NzgsIDB4NjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4OTcsIDB4NzgsIDB4QUMsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4MjksIDB4RTIsIDB4MDEsIDB4QUEsIDB4NjAsIDB4RjMsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjQsIDB4NjAsIDB4RUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4OEIsIDB4NzgsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4NDMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjYsIDB4NjAsIDB4OUQsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODMsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4QjQsIDB4NjAsIDB4QjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NjksIDB4NzgsIDB4NDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4NjAsIDB4RTAsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4M0QsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QkYsIDB4NjAsIDB4QjgsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QjcsIDB4NjAsIDB4OTYsIDB4NzgsIDB4OTgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODMsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzMsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4NDAsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4MUMsIDB4NjAsIDB4MjgsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4QzMsIDB4NjAsIDB4NTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsCisJIDB4Q0EsIDB4NjAsIDB4NzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTgsIDB4NjAsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODUsIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4MjQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RTYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4NDQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4ODQsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4MjgsIDB4RTIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4NDQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4NDUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4NDYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4ODcsIDB4NjQsIDB4ODAsIDB4MjksIDB4MDksIDB4RkIsIDB4NDcsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NDMsIDB4RjcsIDB4QTcsIDB4RkYsIDB4NDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QTIsIDB4NjAsIDB4MDAsIDB4NzgsIDB4NDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MkUsIDB4NjAsIDB4NTQsIDB4NjMsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RkQsIDB4MkYsIDB4NjAsIDB4NzQsIDB4NjMsIDB4MTcsIDB4NjAsIDB4MjUsIDB4RkQsCisJIDB4MzAsIDB4NDQsIDB4MTcsIDB4NjAsIDB4MjYsIDB4RkIsIDB4MzEsIDB4NDQsIDB4MTcsIDB4NjAsIDB4MjcsIDB4RkIsIDB4MzIsIDB4NDQsIDB4MTcsIDB4NjAsCisJIDB4MjgsIDB4RkIsIDB4MzMsIDB4NDQsIDB4MTcsIDB4NjAsIDB4MjksIDB4RkIsIDB4ODEsIDB4RkYsIDB4OTEsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDQsIDB4MDAsCisJIDB4ODIsIDB4RkYsIDB4OTIsIDB4RkYsIDB4NTgsIDB4NTEsIDB4NDAsIDB4MDAsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4NTgsIDB4NTEsIDB4M0MsIDB4MDAsCisJIDB4ODQsIDB4RkYsIDB4OTQsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzgsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OTUsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzQsIDB4MDAsCisJIDB4ODYsIDB4RkYsIDB4OTYsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MzAsIDB4MDAsIDB4ODcsIDB4RkYsIDB4OTcsIDB4RkYsIDB4NTgsIDB4NTEsIDB4MkMsIDB4MDAsCisJIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4OTksIDB4RkYsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RjEsIDB4MzAsIDB4NDQsIDB4NjQsIDB4NDMsIDB4QkQsIDB4REIsCisJIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4RUUsIDB4NjAsIDB4NDgsIDB4NjQsCisJIDB4MEEsIDB4RkIsIDB4NDAsIDB4MjEsIDB4RkUsIDB4MDEsIDB4NzAsIDB4MDAsIDB4NDIsIDB4NTAsIDB4NDAsIDB4NTMsIDB4MTcsIDB4NjAsIDB4MjUsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MzMsIDB4NDQsIDB4MzIsIDB4NDIsIDB4QTIsIDB4REIsIDB4REEsIDB4ODIsIDB4QTIsIDB4REQsIDB4REEsIDB4ODMsCisJIDB4NjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4NjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4QkQsIDB4RDksIDB4MzAsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4OTksIDB4RkYsIDB4QTQsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTUsIDB4NEMsIDB4QkQsIDB4REIsIDB4QTAsIDB4NEMsIDB4QkQsIDB4REIsCisJIDB4QTEsIDB4NEMsIDB4QkQsIDB4REIsIDB4OTgsIDB4RkYsIDB4MTcsIDB4NjAsIDB4MjUsIDB4RkQsIDB4MTcsIDB4NjAsIDB4MjYsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NTAsIDB4MTcsIDB4NjAsIDB4MjgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTIsIDB4MTcsIDB4NjAsIDB4MjksIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NTMsIDB4MzEsIDB4NDEsIDB4MTcsIDB4NjAsIDB4MjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTEsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MTcsIDB4NjAsIDB4MjQsIDB4RkQsIDB4NjEsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NjAsIDB4NzYsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4MzMsIDB4NUMsIDB4MDIsIDB4QTQsIDB4QkQsIDB4REIsIDB4RkUsIDB4QjQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODUsIDB4NDcsIDB4RDksCisJIDB4MzQsIDB4NDQsIDB4NUIsIDB4REIsIDB4NDQsIDB4RjMsIDB4NUIsIDB4REIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsIDB4RkYsIDB4MDEsCisJIDB4ODIsIDB4RTEsIDB4ODAsIDB4RkYsIDB4OTAsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODcsIDB4M0UsIDB4NDEsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDMsIDB4RTEsIDB4MjEsIDB4NDYsIDB4NjYsIDB4NDUsIDB4MDAsIDB4RjQsIDB4MkUsIDB4NDQsIDB4MDksIDB4RkEsIDB4NkEsIDB4NjEsCisJIDB4N0YsIDB4NjAsIDB4RkUsIDB4NjMsIDB4QTEsIDB4RkYsIDB4OUEsIDB4RkYsIDB4MDUsIDB4MTEsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsCisJIDB4MTcsIDB4MTgsIDB4N0EsIDB4NjEsIDB4MDIsIDB4MjUsIDB4MDQsIDB4MDAsIDB4NkMsIDB4NDQsIDB4N0EsIDB4REEsIDB4RkIsIDB4MUMsIDB4RjYsIDB4MTEsCisJIDB4RDksIDB4ODEsIDB4NDEsIDB4RkYsIDB4MDIsIDB4MUMsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4NDEsIDB4RkYsIDB4QzksIDB4ODEsIDB4Q0IsIDB4ODMsCisJIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MDIsIDB4MUMsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4Q0IsIDB4ODMsCisJIDB4MDIsIDB4NzQsIDB4MDIsIDB4NjAsIDB4MDQsIDB4RTEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NUQsIDB4OTMsIDB4QjUsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4NDAsIDB4NDYsIDB4NjUsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RkEsIDB4M0YsIDB4RkMsCisJIDB4NjMsIDB4NDcsIDB4MEEsIDB4NjMsIDB4MEYsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDgsIDB4RkEsIDB4Q0IsIDB4RkUsIDB4MTgsIDB4RTEsIDB4NDQsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4RTIsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTMsIDB4NjAsIDB4OTksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTAsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QTMsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4RkUsIDB4MDcsIDB4MDUsIDB4OUYsIDB4RkUsCisJIDB4MDMsIDB4MDQsIDB4MTgsIDB4NjAsIDB4MjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4QTksIDB4MDEsIDB4RDMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjQsIDB4MTUsIDB4MDAsIDB4MjksIDB4NDQsIDB4MDgsIDB4MjYsIDB4RTEsIDB4MDEsIDB4NzIsIDB4NDQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4OTQsIDB4RjMsIDB4RTgsIDB4ODUsIDB4RkYsIDB4QjcsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODUsIDB4NzMsIDB4NDQsIDB4RDQsIDB4ODQsIDB4MTAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MzcsIDB4MDQsIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MTgsIDB4NjAsIDB4MUMsIDB4RjMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsCisJIDB4QTQsIDB4NTIsIDB4NUEsIDB4RDMsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NTAsIDB4QTQsIDB4NTAsIDB4QkMsIDB4RjMsIDB4RDIsIDB4RjEsIDB4MDEsIDB4QTgsCisJIDB4MDcsIDB4QTgsIDB4MEEsIDB4MDMsIDB4MDksIDB4MDMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDksIDB4MDAsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4QUQsIDB4NEYsIDB4RkEsIDB4QjQsIDB4QTAsIDB4NUQsIDB4QUUsIDB4NEYsCisJIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUUsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTEsIDB4MDAsIDB4MEMsIDB4NjAsIDB4MDAsIDB4NjIsCisJIDB4MDAsIDB4NjAsIDB4NzEsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QjEsIDB4NjUsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4ODgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4RTEsIDB4NjIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDgsIDB4RTEsIDB4QkQsIDB4RkUsCisJIDB4OTcsIDB4MDEsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4NUMsIDB4NjIsIDB4MDMsIDB4RTEsIDB4NDQsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OUEsIDB4RkYsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4NjIsIDB4NjIsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4QTEsIDB4RkYsCisJIDB4NUEsIDB4REMsIDB4MTIsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4OTcsIDB4MDAsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MjksIDB4NDQsCisJIDB4MDgsIDB4QkMsIDB4NDAsIDB4NDksIDB4NDQsIDB4RkYsIDB4MDUsIDB4RTEsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4MjgsIDB4NDAsCisJIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MjksIDB4NDQsIDB4RkYsIDB4NjAsCisJIDB4RUYsIDB4NjUsIDB4MjQsIDB4ODksIDB4NDAsIDB4MjcsIDB4M0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjksIDB4NDAsIDB4ODAsIDB4MjcsIDB4MEIsIDB4MDAsCisJIDB4MDcsIDB4NjEsIDB4QTEsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MjUsIDB4NjEsIDB4MDAsIDB4ODcsIDB4NEMsIDB4RkIsIDB4MDIsIDB4RjMsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4ODAsIDB4NEMsIDB4MDcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4OUMsIDB4NEMsIDB4OUMsIDB4NEMsIDB4OUMsIDB4NEQsIDB4MDUsIDB4NjAsCisJIDB4Q0YsIDB4NjQsIDB4ODAsIDB4NEMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4MDAsCisJIDB4MTUsIDB4NjAsIDB4NkYsIDB4NkIsIDB4MDQsIDB4MjUsIDB4NEEsIDB4MDAsIDB4MzAsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RkYsIDB4MDQsIDB4MjUsCisJIDB4NDUsIDB4MDAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjUsIDB4NDQsIDB4QjQsIDB4ODQsIDB4ODAsIDB4NEUsIDB4MkQsIDB4NDEsIDB4MDQsIDB4MjUsCisJIDB4M0QsIDB4MDAsIDB4NjEsIDB4NEMsIDB4MDAsIDB4NjAsIDB4OEEsIDB4NjUsIDB4QzUsIDB4ODEsIDB4NjEsIDB4NTQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjUsIDB4MzQsIDB4MDAsIDB4NjcsIDB4NEUsIDB4MDcsIDB4NjQsIDB4MUMsIDB4RkIsIDB4MDAsIDB4RTEsIDB4MDIsIDB4NjAsIDB4MDUsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MEEsIDB4MDAsIDB4MUMsIDB4NjUsIDB4MjgsIDB4NDAsCisJIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjUsIDB4MjMsIDB4NDQsIDB4QzQsIDB4ODQsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MjMsIDB4NDQsIDB4MUMsIDB4QTQsIDB4MjksIDB4NDAsIDB4MjAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MEYsIDB4NkIsIDB4M0MsIDB4NDYsCisJIDB4OTgsIDB4RjAsIDB4MjMsIDB4NDQsIDB4QzQsIDB4ODQsIDB4MDYsIDB4NzQsIDB4MjUsIDB4NUMsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4ODAsIDB4NEMsIDB4OUMsIDB4NEMsIDB4NDQsIDB4RkYsIDB4MTgsIDB4RTEsIDB4MEEsIDB4NjQsIDB4MUUsIDB4NzQsCisJIDB4MDIsIDB4NjAsIDB4MDUsIDB4RTEsIDB4NDAsIDB4NDAsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4QzQsIDB4RTIsIDB4MjcsIDB4NDQsCisJIDB4MjAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjcsIDB4NEMsIDB4QjAsIDB4NjAsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NDEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NjIsIDB4RkYsIDB4MDgsIDB4RTEsIDB4RTIsIDB4RkUsIDB4NzIsIDB4NTIsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4ODAsIDB4M0UsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4MjgsIDB4NDAsIDB4MDgsIDB4MjcsIDB4NjYsIDB4MDEsIDB4M0MsIDB4NDYsCisJIDB4OEIsIDB4RkYsIDB4ODQsIDB4NjAsIDB4MDAsIDB4RTQsIDB4MEYsIDB4NjAsIDB4OTIsIDB4NjQsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4MTAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4MTgsIDB4NzEsIDB4MjAsIDB4NzIsIDB4MDAsIDB4RjIsIDB4NjAsIDB4NTMsCisJIDB4MjAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4ODgsIDB4NzUsIDB4MDAsIDB4RTEsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NTAsIDB4NzUsIDB4NDQsIDB4MTIsIDB4NzEsCisJIDB4NkUsIDB4NzIsIDB4ODEsIDB4NzUsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsIDB4QTMsIDB4NjAsIDB4QjUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjMsCisJIDB4MDgsIDB4MjksIDB4MEEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MjIsIDB4MDcsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzIsIDB4RkIsIDB4MjcsIDB4NDQsCisJIDB4MTAsIDB4QkMsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NDMsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4RTUsIDB4RkUsCisJIDB4MjcsIDB4MDUsIDB4OUYsIDB4RkUsIDB4MTIsIDB4MDUsIDB4MzEsIDB4NDEsIDB4NDAsIDB4MkEsIDB4MEYsIDB4MDAsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RjEsCisJIDB4QUUsIDB4NEMsIDB4OTAsIDB4ODAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsIDB4N0YsIDB4QjEsIDB4MDcsIDB4NjAsIDB4RUEsIDB4RkIsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MkEsIDB4ODAsIDB4QjksIDB4NDEsIDB4NTEsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MjcsIDB4NDQsIDB4MTAsIDB4MjYsIDB4MTMsIDB4MDAsCisJIDB4OUYsIDB4RkUsIDB4MDIsIDB4MDQsIDB4NDAsIDB4RTEsIDB4MDYsIDB4MDAsIDB4N0MsIDB4RTEsIDB4MzEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4MEEsIDB4RkQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4QUYsIDB4NjAsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QUEsIDB4NjAsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4MjYsIDB4RkYsIDB4RkYsIDB4QzAsIDB4NjAsIDB4RUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDgsIDB4RjMsIDB4MzIsIDB4RjEsIDB4MDAsIDB4NjMsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjYsIDB4MDMsIDB4MDAsIDB4QTUsIDB4NjAsCisJIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjEsIDB4MDEsIDB4Q0QsIDB4RTIsIDB4ODQsIDB4RTEsIDB4NzAsIDB4NDEsCisJIDB4QUQsIDB4ODAsIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4RUEsIDB4MTIsIDB4MDMsIDB4MDMsIDB4QzEsIDB4NjAsIDB4M0IsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MzIsIDB4RkQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4REMsIDB4MDEsIDB4M0MsIDB4NDYsCisJIDB4M0UsIDB4RjIsIDB4MkEsIDB4RjAsIDB4MjcsIDB4NDEsIDB4NDQsIDB4NDgsIDB4MjAsIDB4QjksIDB4MDEsIDB4QjQsIDB4RjcsIDB4QjEsIDB4MEEsIDB4MDMsCisJIDB4NjQsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MDcsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RUUsIDB4NjMsIDB4MDAsIDB4NjQsIDB4NDUsIDB4RkIsIDB4NDYsIDB4RkIsCisJIDB4QkQsIDB4REIsIDB4QTMsIDB4REIsIDB4Q0IsIDB4MEEsIDB4Q0EsIDB4MTEsIDB4NDEsIDB4NDcsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MjksIDB4NDcsIDB4MjAsIDB4QkYsCisJIDB4NDAsIDB4NDksIDB4MDUsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MkEsIDB4RTgsIDB4M0MsIDB4NDYsIDB4MDAsIDB4NjMsIDB4MzIsIDB4RkQsCisJIDB4NDMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NzYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MEUsIDB4MDAsIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDksIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4QTksIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4RjIsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4OUMsCisJIDB4M0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4QTQsIDB4ODQsIDB4MzAsIDB4ODksIDB4MTUsIDB4NjAsIDB4RDksIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RjIsIDB4MzksIDB4RjEsIDB4RTAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsCisJIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsCisJIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODEsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4OEMsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MTAsIDB4MDAsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4MTQsIDB4MDAsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4MDAsIDB4RTEsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsCisJIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RTUsIDB4RkUsIDB4MDMsIDB4MDQsIDB4QUEsIDB4NjAsIDB4QzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDcsIDB4MjIsIDB4NDMsIDB4RkYsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4MEIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MDEsIDB4NjAsIDB4MEEsIDB4RTEsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsCisJIDB4MTMsIDB4RjIsIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MkEsIDB4RjIsIDB4NDAsIDB4NDUsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MkIsIDB4MTMsIDB4MDAsCisJIDB4MTYsIDB4RjIsIDB4MUQsIDB4RjIsIDB4NDAsIDB4NDMsIDB4MEYsIDB4RjIsIDB4NDAsIDB4NEQsIDB4MEYsIDB4NjQsIDB4MTQsIDB4RjAsIDB4MzUsIDB4RjIsCisJIDB4QTAsIDB4ODIsIDB4MEYsIDB4QjQsIDB4Q0EsIDB4ODUsIDB4RDQsIDB4ODAsIDB4MTAsIDB4RjIsIDB4MDEsIDB4MDIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsCisJIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MTMsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MkMsIDB4RjAsIDB4NDAsIDB4NDMsIDB4MUIsIDB4RjIsIDB4MUQsIDB4RkEsCisJIDB4NDAsIDB4NEQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUIsIDB4RkMsIDB4MDUsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsCisJIDB4MDIsIDB4MDAsIDB4MTEsIDB4RjIsIDB4MkIsIDB4RkEsIDB4MjcsIDB4NDQsIDB4QkYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4RjAsIDB4RkUsIDB4QUYsIDB4NjAsCisJIDB4ODUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4NDYsIDB4MkMsIDB4RjAsIDB4MjcsIDB4NDQsIDB4REYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MkEsIDB4RjAsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4QTQsIDB4M0EsCisJIDB4MDQsIDB4NjUsIDB4MjcsIDB4NDQsIDB4MzQsIDB4ODcsIDB4MzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4MDQsIDB4NjQsCisJIDB4M0EsIDB4REIsIDB4NjksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MDYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjIsIDB4NDYsCisJIDB4MDEsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4QzEsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4QzQsIDB4M0EsCisJIDB4MEMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4RTIsIDB4MDUsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4MkEsIDB4RTgsIDB4M0MsIDB4NDYsIDB4QTUsIDB4NjAsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4NjcsIDB4NEMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4MDcsIDB4NjAsIDB4RUMsIDB4RjEsIDB4MUYsIDB4RjIsCisJIDB4MkEsIDB4RTgsIDB4QjAsIDB4ODEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTQsIDB4MDAsIDB4NjEsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsCisJIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4NjQsIDB4NEMsIDB4NDAsIDB4NDMsCisJIDB4MTgsIDB4MDAsIDB4MjksIDB4NDcsIDB4ODAsIDB4QjcsIDB4MzQsIDB4OTQsIDB4NjAsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjEsIDB4NDcsCisJIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsCisJIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsCisJIDB4NjAsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsCisJIDB4QzQsIDB4RTIsIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsIDB4MjQsIDB4RkEsIDB4OTQsIDB4RjMsCisJIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsIDB4OTQsIDB4RjksIDB4MjUsIDB4RkEsCisJIDB4OTUsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4MjgsIDB4RkEsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4OTYsIDB4RkIsIDB4MjksIDB4RkEsIDB4MjQsIDB4NDQsIDB4MDQsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsCisJIDB4QTcsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkMsIDB4MTMsIDB4NjAsIDB4NEEsIDB4RjEsIDB4MjgsIDB4NDQsIDB4MDgsIDB4MkEsCisJIDB4NTEsIDB4MDAsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4NEIsIDB4MDAsIDB4MzIsIDB4RjIsCisJIDB4MkYsIDB4RjAsIDB4NTAsIDB4RkUsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjEsIDB4OEUsIDB4RjMsIDB4MzEsIDB4MDAsIDB4RDAsIDB4ODAsCisJIDB4MzMsIDB4RjIsIDB4MzAsIDB4RjAsIDB4MzQsIDB4RjIsIDB4RDAsIDB4ODAsIDB4MzEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDcsCisJIDB4MzQsIDB4MEMsIDB4RkYsIDB4QjQsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4MzEsIDB4MTgsIDB4NjAsIDB4NDMsIDB4NTAsIDB4RkUsIDB4NjYsIDB4NDEsIDB4MzIsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjEsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjEsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzQsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEMsIDB4MDAsIDB4RjIsIDB4NjEsIDB4NDYsIDB4MUEsIDB4MTgsCisJIDB4RTgsIDB4MDEsIDB4MDYsIDB4RjAsIDB4OEUsIDB4RjMsIDB4NjEsIDB4NDYsIDB4MDIsIDB4NjEsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTIsIDB4MDAsCisJIDB4RkMsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsIDB4NjEsIDB4NDQsIDB4MTQsIDB4RkEsIDB4MTEsIDB4RkMsIDB4MEIsIDB4MDAsIDB4MkMsIDB4RjIsCisJIDB4MkYsIDB4RkEsIDB4MkQsIDB4RjIsIDB4MzAsIDB4RkEsIDB4MkUsIDB4RjIsIDB4MzEsIDB4RkEsIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsCisJIDB4NDAsIDB4NDYsIDB4MUUsIDB4MDAsIDB4MjYsIDB4NDMsIDB4ODQsIDB4QkIsIDB4RkMsIDB4QjMsIDB4MjEsIDB4NDYsIDB4MDEsIDB4NUQsIDB4MEYsIDB4RkMsCisJIDB4NUMsIDB4NDYsIDB4MDUsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4NTAsIDB4RkUsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsCisJIDB4MTIsIDB4MDAsIDB4MkYsIDB4RjIsIDB4MzAsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MzEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkMsIDB4RjAsCisJIDB4MkQsIDB4RjAsIDB4RDMsIDB4ODAsIDB4MkUsIDB4RjAsIDB4RDEsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MjcsIDB4NDQsIDB4MDksIDB4MEMsIDB4MDMsIDB4MDAsCisJIDB4MjcsIDB4NDQsIDB4MDYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4QjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4RDQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MEQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsIDB4MUMsIDB4RjIsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsCisJIDB4MDAsIDB4NjMsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MzAsIDB4RjMsIDB4MkQsIDB4NDUsCisJIDB4RDQsIDB4ODQsIDB4Q0EsIDB4NjUsIDB4RDQsIDB4ODMsIDB4RDQsIDB4NjQsIDB4MzUsIDB4MDAsIDB4MEYsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjEsIDB4NDYsCisJIDB4MjksIDB4NDAsIDB4NDAsIDB4MjcsIDB4MTUsIDB4MDAsIDB4ODAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4Q0EsIDB4NjUsIDB4MDEsIDB4MDAsIDB4NkEsIDB4NjUsCisJIDB4MUMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsCisJIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MTcsIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsIDB4MTMsIDB4MDAsCisJIDB4MUMsIDB4RjIsIDB4MUUsIDB4NjUsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MzYsIDB4MUUsIDB4NjQsIDB4MEYsIDB4MzYsIDB4MTYsIDB4NjQsIDB4MEEsIDB4MzYsCisJIDB4MTIsIDB4NjQsIDB4MEUsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MDksIDB4MzYsIDB4MEUsIDB4NjQsIDB4MEQsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDgsIDB4MzYsCisJIDB4MEEsIDB4NjQsIDB4MEMsIDB4MzYsIDB4MEEsIDB4NjQsIDB4NDAsIDB4NEQsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MkIsIDB4RjIsIDB4QzQsIDB4ODUsCisJIDB4RDQsIDB4ODMsIDB4QzQsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MkYsIDB4RjAsIDB4QjAsIDB4RjAsIDB4QjEsIDB4RjIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsCisJIDB4Q0QsIDB4RTIsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OUEsIDB4RkYsIDB4ODQsIDB4NEMsIDB4MTIsIDB4NzQsCisJIDB4ODUsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODEsIDB4NEMsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4MzUsIDB4RkIsIDB4QjEsIDB4NjAsCisJIDB4NDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MjcsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsCisJIDB4RkUsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTUsIDB4NjAsIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MkUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzYsIDB4QzEsIDB4RkUsIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsCisJIDB4MEIsIDB4MDAsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsCisJIDB4QzAsIDB4RkUsIDB4QTYsIDB4NjAsIDB4REQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4RDQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4QTgsIDB4NjAsCisJIDB4NUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4RTIsIDB4MjcsIDB4NDQsIDB4RkIsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MUMsIDB4NDIsIDB4MjIsIDB4NDYsCisJIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MzQsIDB4RkIsIDB4MkEsIDB4RjAsIDB4RjcsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTIsIDB4REEsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4QzQsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsCisJIDB4M0YsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDUsIDB4MDAsIDB4QkEsIDB4MDAsIDB4MDQsIDB4MkIsIDB4QjgsIDB4MDAsCisJIDB4ODcsIDB4RjUsIDB4MDEsIDB4MDAsIDB4MDcsIDB4RjQsIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4MEMsIDB4NjAsCisJIDB4RkUsIDB4NjIsIDB4ODAsIDB4RkYsIDB4QzgsIDB4NjAsIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4QTIsIDB4REIsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4RkYsIDB4ODcsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDEsCisJIDB4NjQsIDB4NDcsIDB4NjAsIDB4NUYsIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4MjIsIDB4NDYsIDB4M0EsIDB4RkEsCisJIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4ODAsIDB4MDAsCisJIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjQsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsCisJIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4NUUsIDB4RDEsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsCisJIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsCisJIDB4NUEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4M0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsCisJIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsCisJIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsCisJIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsCisJIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsCisJIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsCisJIDB4MEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0YsIDB4QjQsIDB4MEMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjQsCisJIDB4MjIsIDB4NDYsIDB4MDMsIDB4RkEsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4MDAsIDB4RjAsIDB4MDQsIDB4NjMsIDB4NjQsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsCisJIDB4MDMsIDB4RkMsIDB4MDIsIDB4MDAsIDB4MjIsIDB4NDYsIDB4MUEsIDB4RkEsIDB4MzUsIDB4RjIsIDB4MDQsIDB4RjgsIDB4REMsIDB4ODQsIDB4MzUsIDB4RkEsCisJIDB4MTQsIDB4RjIsIDB4MEYsIDB4QjUsIDB4MEYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4OTQsIDB4ODAsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MkEsIDB4RjIsCisJIDB4MDEsIDB4MDIsIDB4OTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4OTUsIDB4RkMsIDB4MDYsIDB4MDAsIDB4QzQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4MjcsIDB4NDQsCisJIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsIDB4QTgsIDB4RTIsIDB4QTUsIDB4NjAsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4NDQsIDB4MDQsIDB4MjYsCisJIDB4MDUsIDB4MDAsIDB4NjgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MzIsIDB4NDQsIDB4MDAsIDB4MjcsIDB4MDMsIDB4MDAsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NDIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MjcsIDB4NDgsIDB4MDAsIDB4MUYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4M0MsIDB4MDAsIDB4ODAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsCisJIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4MDUsIDB4MDAsIDB4M0YsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MDAsIDB4NjMsIDB4MUUsIDB4RjIsIDB4MzksIDB4RjEsCisJIDB4QzAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsCisJIDB4M0MsIDB4OTQsIDB4QjAsIDB4ODQsIDB4NjAsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsCisJIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4MzIsIDB4MDAsCisJIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4Q0IsIDB4MDEsIDB4QkYsIDB4MDEsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4OUYsIDB4RjIsIDB4MUUsIDB4RjIsIDB4MzksIDB4RjEsCisJIDB4QzAsIDB4NjAsIDB4RkYsIDB4QjUsIDB4MEEsIDB4MTgsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsCisJIDB4M0MsIDB4OTQsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4NjUsIDB4NjEsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDksIDB4NkIsIDB4NjAsIDB4NEMsCisJIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsCisJIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTQsIDB4ODQsIDB4QjQsIDB4QkMsIDB4MUUsIDB4RjAsCisJIDB4NDAsIDB4NDgsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MTcsIDB4MDAsIDB4MUMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzYsCisJIDB4MDYsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDgsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDksIDB4MDAsIDB4NzAsIDB4N0MsCisJIDB4QTAsIDB4NjMsIDB4MEYsIDB4MDAsIDB4MzgsIDB4N0MsIDB4NTAsIDB4NjMsIDB4MEMsIDB4MDAsIDB4MTUsIDB4N0MsIDB4MUUsIDB4NjMsIDB4MDksIDB4MDAsCisJIDB4MEIsIDB4N0MsIDB4MEYsIDB4NjMsIDB4MDYsIDB4MDAsIDB4OUMsIDB4RjQsIDB4RkYsIDB4NjUsIDB4NjMsIDB4NDcsIDB4QTQsIDB4OUMsIDB4QTcsIDB4ODQsCisJIDB4MjMsIDB4MDAsIDB4NDAsIDB4NDUsIDB4NDMsIDB4NEQsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDMsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4NkEsIDB4NjUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4Q0EsIDB4NjUsIDB4MUYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4NDAsIDB4MjcsIDB4MEUsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4RTAsIDB4ODUsIDB4MTIsIDB4MDAsIDB4MkIsIDB4RjIsIDB4MTEsIDB4RjAsIDB4QzAsIDB4ODQsIDB4RDAsIDB4ODQsIDB4QzQsIDB4ODMsIDB4MTEsIDB4MDAsCisJIDB4MUUsIDB4NjQsIDB4QzQsIDB4ODQsIDB4NjAsIDB4NDUsIDB4MDgsIDB4MDAsIDB4NDAsIDB4NDUsIDB4RkYsIDB4NjAsIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDMsCisJIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4M0MsIDB4NjUsIDB4OTEsIDB4RjQsIDB4MUIsIDB4RjAsIDB4QzMsIDB4ODQsIDB4QzQsIDB4ODQsCisJIDB4QzAsIDB4ODMsIDB4MjgsIDB4NDQsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsIDB4OUEsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4NTYsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4NDcsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDcsIDB4MzYsIDB4RjMsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4QTUsIDB4NjAsIDB4QzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MEIsIDB4MDAsCisJIDB4MDcsIDB4QjQsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MjksIDB4NDQsIDB4QkYsIDB4NjAsIDB4RkYsIDB4QjcsIDB4ODAsIDB4QkYsCisJIDB4NDAsIDB4NDksIDB4ODAsIDB4NjcsIDB4MDUsIDB4MDAsIDB4M0YsIDB4NjAsIDB4RkYsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MDAsIDB4NjQsCisJIDB4MTIsIDB4NjAsIDB4RDMsIDB4RjEsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RDgsIDB4RjksIDB4MzksIDB4RjEsIDB4MTIsIDB4NjAsIDB4QkYsIDB4RjEsCisJIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4MUYsIDB4QjQsIDB4NTQsIDB4OTQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsIDB4MDcsIDB4NjAsIDB4RUIsIDB4RjEsIDB4QjQsIDB4ODQsCisJIDB4QjAsIDB4OEMsIDB4MjIsIDB4NjAsIDB4QzYsIDB4N0MsIDB4NjAsIDB4NDcsIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NDAsIDB4RDMsCisJIDB4NUEsIDB4RDEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MDUsIDB4NjAsIDB4NjksIDB4NkIsIDB4NjAsIDB4NEMsIDB4QjUsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4N0MsIDB4NDQsIDB4MjksIDB4NDAsIDB4ODAsIDB4MkIsIDB4NjcsIDB4NDQsIDB4NjAsIDB4NEMsIDB4NDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4M0MsIDB4NDQsIDB4NjAsIDB4NDYsIDB4NDAsIDB4NDIsCisJIDB4MTMsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjEsCisJIDB4QTQsIDB4ODQsIDB4QzQsIDB4QkMsIDB4NDAsIDB4NDgsIDB4NjQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MjYsIDB4MEEsIDB4MDAsCisJIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MEIsIDB4NjMsIDB4NkUsIDB4NjQsIDB4MDgsIDB4MDAsIDB4MTUsIDB4NjMsCisJIDB4MzcsIDB4NjQsIDB4MDUsIDB4MDAsIDB4MzgsIDB4NjMsIDB4MTQsIDB4NjQsIDB4MDIsIDB4MDAsIDB4NzAsIDB4NjMsIDB4MEEsIDB4NjQsIDB4NDMsIDB4NEQsCisJIDB4NDAsIDB4NDUsIDB4MDAsIDB4RTEsIDB4RjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MUUsIDB4NjQsIDB4MUIsIDB4RjAsIDB4MTEsIDB4RjAsIDB4QzAsIDB4ODQsCisJIDB4QzAsIDB4ODQsIDB4NjAsIDB4NDMsIDB4MjgsIDB4NDQsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsIDB4ODMsIDB4NEMsCisJIDB4OUEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4MzUsIDB4RkIsIDB4QjEsIDB4NjAsIDB4NDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsCisJIDB4MDgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTUsIDB4NjAsIDB4MUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsCisJIDB4MUQsIDB4RkYsIDB4MjYsIDB4NDQsIDB4MDIsIDB4QkMsIDB4NDAsIDB4NDYsIDB4MjcsIDB4NDQsIDB4MDcsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MzAsIDB4RjEsIDB4NTIsIDB4MDAsIDB4RkMsIDB4QjMsIDB4MzIsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4Q0IsIDB4RkUsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NDQsIDB4MDQsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MEYsIDB4RkMsIDB4MDUsIDB4RkYsIDB4MzAsIDB4RjEsIDB4MjcsIDB4NDQsIDB4MDUsIDB4MjIsCisJIDB4MkMsIDB4MDAsIDB4RkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjQsIDB4NDQsIDB4MTAsIDB4MkEsIDB4MjMsIDB4MDAsIDB4MjgsIDB4NDAsIDB4RDQsIDB4M0EsCisJIDB4MjAsIDB4MDAsIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsCisJIDB4NjQsIDB4NDQsIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsCisJIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4MUQsIDB4RjAsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsIDB4MEEsIDB4NjAsIDB4N0IsIDB4RjEsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4QTUsIDB4NjAsIDB4Q0QsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4RkQsIDB4QjQsCisJIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4MDUsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsIDB4QTQsIDB4M0EsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDIsIDB4N0MsIDB4MjUsIDB4NDQsIDB4MEEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjAsIDB4M0EsIDB4N0MsCisJIDB4MzEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDAsIDB4N0MsIDB4MkIsIDB4NDQsIDB4RDAsIDB4ODAsIDB4NzAsIDB4NDUsIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDQsCisJIDB4QzQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjQsIDB4MDAsIDB4QjQsIDB4MjgsIDB4NDAsIDB4RTQsIDB4MzYsIDB4MDAsIDB4QjQsIDB4NjAsIDB4NTAsCisJIDB4MDgsIDB4MjgsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjksIDB4NkQsIDB4RTIsIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsCisJIDB4MDUsIDB4MjIsIDB4MDksIDB4MDAsIDB4QkEsIDB4QjQsIDB4NDAsIDB4NDcsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDcsCisJIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsIDB4RjQsIDB4MDEsIDB4RjMsIDB4MEEsIDB4N0MsIDB4NTAsIDB4NkQsIDB4RTIsIDB4RjAsIDB4MDEsCisJIDB4NzIsIDB4NDUsIDB4REMsIDB4ODQsIDB4OTQsIDB4RkIsIDB4MTEsIDB4NjQsIDB4M0EsIDB4REIsIDB4OTUsIDB4RjMsIDB4MDYsIDB4MDQsIDB4REMsIDB4ODQsCisJIDB4OTUsIDB4RkIsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4QTQsIDB4NjAsIDB4ODcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjEsIDB4MTIsIDB4NjQsIDB4M0EsIDB4REIsIDB4MTgsIDB4NjAsIDB4RUUsIDB4NjMsIDB4QkQsIDB4RDMsIDB4NzIsIDB4NDUsIDB4NDQsIDB4OEEsCisJIDB4MDIsIDB4MjgsIDB4MDMsIDB4MDAsIDB4RTQsIDB4RTIsIDB4REQsIDB4ODEsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTQsIDB4RTIsCisJIDB4REQsIDB4ODEsIDB4QkQsIDB4RDMsIDB4OTQsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksCisJIDB4QzQsIDB4ODQsIDB4NjAsIDB4NTUsIDB4MkEsIDB4NTIsIDB4RTQsIDB4RTIsIDB4OTQsIDB4RkIsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsCisJIDB4OTUsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4MDAsIDB4NjEsIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QzQsIDB4ODQsIDB4OTUsIDB4RkIsCisJIDB4MDIsIDB4MjQsIDB4MDEsIDB4QjksIDB4QkQsIDB4RDMsIDB4OTYsIDB4RjEsIDB4NjEsIDB4NDUsIDB4QzAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4OTYsIDB4RkIsCisJIDB4QTUsIDB4NjAsIDB4NzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUMsIDB4MDEsIDB4NDcsIDB4RkYsIDB4NDQsIDB4RkYsIDB4QzgsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4QUEsIDB4NjAsIDB4RkUsIDB4NzgsIDB4MDAsIDB4NjEsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NDQsIDB4MjYsIDB4NDQsCisJIDB4MDIsIDB4MjYsIDB4MEMsIDB4MDAsIDB4M0UsIDB4NDYsIDB4MDksIDB4RjIsIDB4MUUsIDB4NDEsIDB4MDMsIDB4MUIsIDB4QUMsIDB4NjAsIDB4MTQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NUUsIDB4RkQsIDB4RkIsIDB4MjEsIDB4NDQsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDEsIDB4NUQsIDB4MjEsIDB4NDYsCisJIDB4MDAsIDB4NjQsIDB4MzEsIDB4RkEsIDB4MDAsIDB4RjIsIDB4NDYsIDB4NDUsIDB4ODcsIDB4RkMsIDB4QUMsIDB4RTIsIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsCisJIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjEsIDB4MDAsIDB4MTksIDB4RjMsIDB4MDEsIDB4NjAsIDB4MUUsIDB4RTEsIDB4MUQsIDB4MTgsIDB4ODAsIDB4NjQsCisJIDB4NDAsIDB4NDksIDB4MDAsIDB4RTEsIDB4MTksIDB4RkYsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NUEsIDB4REEsIDB4MkMsIDB4RkEsIDB4NUEsIDB4REEsCisJIDB4NUEsIDB4REEsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4NzIsIDB4NDQsIDB4MjQsIDB4RkEsIDB4OTQsIDB4RjMsCisJIDB4MjUsIDB4RkEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsCisJIDB4N0MsIDB4NEIsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4M0YsIDB4NjAsCisJIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4MkUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDEsIDB4MDAsIDB4MDEsIDB4M0EsIDB4QzksIDB4MDAsCisJIDB4ODgsIDB4RkYsIDB4NDAsIDB4NjcsIDB4MjksIDB4NDUsIDB4MzQsIDB4ODksIDB4MDQsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsCisJIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4NDAsIDB4NDUsIDB4MUMsIDB4RkEsIDB4NjUsIDB4NDQsIDB4MjksIDB4NDEsCisJIDB4RjksIDB4ODEsIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODMsIDB4MUQsIDB4RkMsCisJIDB4MUIsIDB4RkMsIDB4OTgsIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsIDB4MEEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDksIDB4N0MsIDB4RDMsIDB4ODAsIDB4OUEsIDB4RkYsIDB4MDMsIDB4MDcsIDB4QUMsIDB4NjAsIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEYsIDB4QUMsIDB4MUYsIDB4NjAsIDB4NTAsIDB4NjUsIDB4NDQsIDB4RDMsIDB4MTIsIDB4NjUsIDB4NDUsIDB4NDYsCisJIDB4NjAsIDB4NDcsIDB4NDAsIDB4N0YsIDB4MjcsIDB4RkEsIDB4OEYsIDB4RkMsIDB4MTgsIDB4NjEsIDB4Q0IsIDB4RjEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4REMsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MjEsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QUMsIDB4NjAsIDB4MjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzgsIDB4NjAsCisJIDB4MEIsIDB4N0QsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NkIsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QUEsIDB4NzQsIDB4Q0QsIDB4RTIsCisJIDB4MDIsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MDUsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjUsIDB4NzYsIDB4MDAsIDB4NkMsIDB4NDQsIDB4MEEsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDUsIDB4MDAsCisJIDB4MzcsIDB4MzYsIDB4MDMsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDEsIDB4MDAsIDB4NkMsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MzIsIDB4NzQsIDB4QTEsIDB4RkYsCisJIDB4MUMsIDB4RkEsIDB4NDAsIDB4NEUsIDB4OEMsIDB4NDQsIDB4NjAsIDB4NDMsIDB4MUQsIDB4RkEsIDB4MDEsIDB4RTEsIDB4MjAsIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4MkUsIDB4NDQsIDB4MTQsIDB4MzYsIDB4MTIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MEYsIDB4MDAsIDB4NjMsIDB4NDUsIDB4RTMsIDB4ODMsIDB4RTMsIDB4ODMsCisJIDB4QzcsIDB4ODMsIDB4RTMsIDB4ODMsIDB4QzcsIDB4ODMsIDB4RkYsIDB4RkYsIDB4MzcsIDB4MzYsIDB4MDUsIDB4MDAsIDB4NkUsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4QUMsIDB4NjAsIDB4MUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RkYsIDB4RkYsCisJIDB4ODAsIDB4MjcsIDB4Q0YsIDB4ODMsIDB4MUIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NEYsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDEsIDB4RjksIDB4ODEsCisJIDB4NTIsIDB4NEEsIDB4NzEsIDB4ODksIDB4MkUsIDB4NDQsIDB4MjcsIDB4RkEsIDB4OTgsIDB4RjEsIDB4RkMsIDB4QTMsIDB4RDMsIDB4ODAsIDB4NDMsIDB4NDMsCisJIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NTQsIDB4NjMsIDB4MTIsIDB4NjQsIDB4NDAsIDB4NDYsCisJIDB4OEYsIDB4RkMsIDB4MTgsIDB4NjEsIDB4Q0IsIDB4RjEsIDB4NTAsIDB4RkUsIDB4NkMsIDB4NDAsIDB4OUUsIDB4MTUsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsCisJIDB4ODAsIDB4RTEsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MEYsIDB4MDAsIDB4MjksIDB4NDQsCisJIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4QjUsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MzUsIDB4RTEsIDB4QUMsIDB4RTIsIDB4QUEsIDB4NjAsCisJIDB4OTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsCisJIDB4QTIsIDB4REIsIDB4MjEsIDB4NjQsIDB4M0EsIDB4REIsIDB4RDIsIDB4MDEsIDB4MjUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MkEsIDB4NjQsIDB4M0EsIDB4REIsIDB4NUMsIDB4NDEsIDB4QzgsIDB4MDEsIDB4MjksIDB4NjQsIDB4M0EsIDB4REIsCisJIDB4ODgsIDB4NjAsIDB4ODUsIDB4NzEsIDB4OEQsIDB4RTIsIDB4QTIsIDB4RkMsIDB4MzIsIDB4NDAsIDB4MDEsIDB4MkEsIDB4QTgsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4MUEsIDB4RTEsIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4RUMsIDB4NDQsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NDgsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsCisJIDB4N0UsIDB4MzYsIDB4MDQsIDB4QTIsIDB4RkMsIDB4MUMsIDB4MDMsIDB4MUQsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MkUsIDB4MDAsIDB4MDMsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4NzAsIDB4NjIsIDB4QTEsIDB4RkYsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4NzIsIDB4NjIsIDB4QTEsIDB4RkYsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkUsIDB4NjEsCisJIDB4QTEsIDB4RkYsIDB4MDUsIDB4MUQsIDB4MTIsIDB4MUUsIDB4MEMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4N0MsIDB4NjEsIDB4MDIsIDB4NjIsIDB4N0EsIDB4REMsCisJIDB4NjMsIDB4NDAsIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MDgsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsCisJIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4OTgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDAsCisJIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsIDB4N0MsIDB4NDQsIDB4MzMsIDB4RkIsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsIDB4ODQsIDB4QkMsIDB4MDEsIDB4MTUsCisJIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDYsIDB4NkMsIDB4NDAsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsIDB4QTEsIDB4RkYsCisJIDB4N0YsIDB4NjAsIDB4N0YsIDB4N0MsIDB4NkMsIDB4NDQsIDB4QTAsIDB4ODQsIDB4MTUsIDB4QTcsIDB4MTUsIDB4QTQsIDB4MjEsIDB4NDYsIDB4MjYsIDB4RkEsCisJIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDQsCisJIDB4MUEsIDB4RkEsIDB4MDksIDB4MDAsIDB4NjUsIDB4NDQsIDB4MEYsIDB4QjQsIDB4MDYsIDB4QTgsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDgsIDB4MjgsCisJIDB4N0MsIDB4NDUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksIDB4MjcsIDB4RjAsIDB4NjUsIDB4NDQsIDB4NjQsIDB4NUUsIDB4MjcsIDB4RkEsIDB4ODEsIDB4RTEsCisJIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MEYsIDB4MDAsIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsCisJIDB4MzMsIDB4RkIsIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsCisJIDB4RkMsIDB4MTEsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MjEsIDB4NDYsIDB4QjUsIDB4RkYsIDB4QkMsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MjYsIDB4NDMsIDB4MkEsIDB4NDQsIDB4NzIsIDB4NDUsCisJIDB4MjQsIDB4RkEsIDB4OTQsIDB4RjMsIDB4MDYsIDB4MDQsIDB4RTQsIDB4RTIsIDB4REMsIDB4OUMsIDB4MjksIDB4NDAsIDB4MDEsIDB4MjYsIDB4NjQsIDB4NDQsCisJIDB4OTQsIDB4RjksIDB4MjUsIDB4RkEsIDB4OTUsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4MjgsIDB4RkEsIDB4OTYsIDB4RjMsCisJIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsIDB4MjksIDB4RkEsIDB4QUEsIDB4NjAsIDB4MUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4MTIsIDB4NjEsIDB4OEMsIDB4NDQsIDB4Q0MsIDB4RjAsIDB4MkEsIDB4RkEsIDB4NDAsIDB4NDgsIDB4MDQsIDB4MjYsIDB4NDMsIDB4MDAsIDB4QTEsIDB4RkYsCisJIDB4OEMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MzAsIDB4RkIsIDB4NkMsIDB4NDQsIDB4MkMsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4MjYsIDB4MDAsCisJIDB4RDAsIDB4ODAsIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4NkMsIDB4NUMsIDB4MDAsIDB4RTEsIDB4RjIsIDB4RkUsIDB4MkQsIDB4RkEsIDB4Q0QsIDB4RjMsCisJIDB4RDQsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjgsIDB4MjQsIDB4NDQsIDB4MTYsIDB4MEMsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDcsIDB4MDAsCisJIDB4MjgsIDB4NDIsIDB4MEMsIDB4QjIsIDB4MDgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QkMsIDB4NDAsIDB4NDQsIDB4NUMsIDB4MDAsIDB4MDQsIDB4MEEsCisJIDB4QTEsIDB4RkYsIDB4QUMsIDB4NjAsIDB4MTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4QkMsIDB4NDAsIDB4NDQsIDB4MjgsIDB4NDUsIDB4QkYsIDB4NjAsCisJIDB4RkYsIDB4NjQsIDB4MjQsIDB4ODgsIDB4NTAsIDB4MDAsIDB4MzAsIDB4QkMsIDB4NDAsIDB4NDQsIDB4NEQsIDB4MDAsIDB4MjAsIDB4QjksIDB4NUMsIDB4OEUsCisJIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4MkQsIDB4RkEsIDB4REMsIDB4OUMsIDB4NkMsIDB4NDQsIDB4MDAsIDB4RTEsIDB4RjIsIDB4RkUsIDB4MkUsIDB4RkEsCisJIDB4MDgsIDB4MjgsIDB4NDQsIDB4NEUsIDB4REMsIDB4ODQsIDB4MkUsIDB4NUMsIDB4QjAsIDB4ODQsIDB4RUYsIDB4QjEsIDB4MDgsIDB4MjQsIDB4NDAsIDB4QjksCisJIDB4NDEsIDB4NDYsIDB4MzksIDB4MDAsIDB4MjMsIDB4NDEsIDB4MTMsIDB4NjQsIDB4NTEsIDB4OTAsIDB4NTYsIDB4NjMsIDB4MDMsIDB4MDQsIDB4QUMsIDB4NjAsCisJIDB4MEEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEMsIDB4NDQsIDB4MDQsIDB4NjEsIDB4MkIsIDB4RkEsIDB4NTAsIDB4RkUsIDB4ODAsIDB4MjcsIDB4MDAsIDB4NjQsCisJIDB4MzAsIDB4RkIsIDB4OEMsIDB4NDQsIDB4MkMsIDB4RkEsIDB4RDAsIDB4ODAsIDB4OEMsIDB4NDQsIDB4MkQsIDB4RkEsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjUsCisJIDB4OEMsIDB4NDQsIDB4Q0QsIDB4RjEsIDB4MkUsIDB4RkEsIDB4RDAsIDB4ODAsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MEMsIDB4QTAsIDB4MkEsIDB4MEEsIDB4MDAsCisJIDB4MTEsIDB4MDAsIDB4MTAsIDB4NjUsIDB4NjAsIDB4NDAsIDB4QzQsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDQsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjcsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MzAsIDB4NjUsIDB4MDAsIDB4NjQsIDB4M0YsIDB4RkEsIDB4NDYsIDB4NEUsIDB4MzUsIDB4ODQsIDB4NjYsIDB4MDAsIDB4NDAsIDB4MjYsCisJIDB4RjksIDB4MDEsIDB4MzAsIDB4NjUsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MDQsIDB4NjEsIDB4RjMsIDB4MDEsIDB4QTEsIDB4RkYsCisJIDB4QUIsIDB4NjAsIDB4RTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MjMsIDB4NDMsIDB4RTgsIDB4QTMsIDB4ODAsIDB4MjcsCisJIDB4RjYsIDB4MDEsIDB4MjAsIDB4RTYsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUIsIDB4MjgsIDB4NDQsIDB4MDMsIDB4MkIsIDB4MDUsIDB4MDAsIDB4NkEsIDB4NjIsCisJIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NzAsIDB4NjIsCisJIDB4N0EsIDB4REMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MEQsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4REMsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NUMsCisJIDB4NUEsIDB4RDgsIDB4RTQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4RjgsIDB4QTMsIDB4MjUsIDB4RkYsCisJIDB4QjAsIDB4RkYsIDB4M0YsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4MTAsIDB4NjEsIDB4NTcsIDB4OTAsIDB4NkMsIDB4NjEsIDB4QTEsIDB4RkYsCisJIDB4MDksIDB4MDcsIDB4MDIsIDB4MUQsIDB4MkEsIDB4MUUsIDB4MjEsIDB4MDAsIDB4Q0IsIDB4ODMsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RDksIDB4ODEsCisJIDB4MjQsIDB4MUUsIDB4MUIsIDB4MDAsIDB4Q0IsIDB4ODMsIDB4MEUsIDB4QTMsIDB4QTcsIDB4ODQsIDB4RjIsIDB4QTMsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsCisJIDB4MDUsIDB4MUQsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsCisJIDB4QTcsIDB4ODQsIDB4N0EsIDB4NjEsIDB4N0EsIDB4REMsIDB4RkUsIDB4MUMsIDB4RjksIDB4MUQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RjYsIDB4MDMsCisJIDB4RkYsIDB4QjEsIDB4MEIsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjYsIDB4RkYsCisJIDB4QjcsIDB4RkYsIDB4NkMsIDB4NDQsIDB4NUEsIDB4REEsIDB4Q0QsIDB4ODEsIDB4NjQsIDB4NDAsIDB4NDYsIDB4NDUsIDB4MjgsIDB4NDQsIDB4NDAsIDB4MkIsCisJIDB4MEUsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MEIsIDB4MDAsIDB4MDEsIDB4QTIsIDB4NjIsIDB4NDQsIDB4NDYsIDB4NDUsIDB4MjEsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4OUEsIDB4RkYsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4N0EsIDB4REMsIDB4OTgsIDB4RkYsCisJIDB4MDAsIDB4RTYsIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MjUsIDB4NDQsIDB4MDYsIDB4RkEsCisJIDB4QTEsIDB4RkYsIDB4OEMsIDB4NDQsIDB4QTEsIDB4RkYsIDB4NDcsIDB4RkYsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4NjksIDB4RTIsIDB4MjUsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4NjEsIDB4NDUsIDB4RDQsIDB4OUUsIDB4MjEsIDB4NDYsIDB4MTYsIDB4RkEsIDB4MjUsIDB4NDUsIDB4ODYsIDB4RjgsIDB4RkYsIDB4RkYsCisJIDB4NkEsIDB4NDQsIDB4NDAsIDB4MkIsIDB4MDMsIDB4MTUsIDB4QUYsIDB4NjAsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsCisJIDB4MDQsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDQsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDUsIDB4NzYsIDB4QUQsIDB4RTIsIDB4NDEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4NkMsIDB4NDUsCisJIDB4QTEsIDB4RkYsIDB4NjUsIDB4NDEsIDB4N0YsIDB4NjAsIDB4N0YsIDB4N0MsIDB4NkMsIDB4NDQsIDB4QTAsIDB4ODQsIDB4MTUsIDB4QTcsIDB4MTUsIDB4QTQsCisJIDB4MjEsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjIsIDB4NDYsIDB4MTAsIDB4RkEsIDB4MjEsIDB4NDYsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDcsIDB4MDAsCisJIDB4QjYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NkMsIDB4NDQsIDB4MUEsIDB4RkEsIDB4MDksIDB4MDAsIDB4NjUsIDB4NDQsCisJIDB4MEYsIDB4QjQsIDB4MDYsIDB4QTgsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MDgsIDB4MjgsIDB4N0MsIDB4NDUsIDB4MjksIDB4NDQsIDB4MzQsIDB4ODksCisJIDB4MjcsIDB4RjAsIDB4NjUsIDB4NDcsIDB4MUYsIDB4QjEsIDB4MzQsIDB4OTcsIDB4NjQsIDB4NUUsIDB4MDcsIDB4NjAsIDB4RjUsIDB4RjEsIDB4MjksIDB4NDAsCisJIDB4NDAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MTAsIDB4NjAsIDB4MDAsIDB4QkMsIDB4MjcsIDB4RkEsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4MDAsIDB4NjQsIDB4MzMsIDB4RkIsIDB4QTgsIDB4RTIsIDB4MDUsIDB4RTEsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MjYsIDB4Q0UsIDB4MDAsCisJIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjgsIDB4NDAsIDB4NTAsIDB4M0EsIDB4QzgsIDB4MDAsIDB4MjQsIDB4NDQsIDB4MjAsIDB4MkEsCisJIDB4QzUsIDB4MDAsIDB4MkIsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MjgsIDB4NDAsIDB4QjQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MzAsIDB4RkIsCisJIDB4QkQsIDB4MDAsIDB4MjgsIDB4NDQsIDB4QkYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4NDAsIDB4NDgsIDB4MkIsIDB4NTAsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4MUMsIDB4RjIsIDB4QzQsIDB4RTIsIDB4NDAsIDB4NDUsIDB4MjgsIDB4NDAsIDB4QzQsIDB4MzYsCisJIDB4OUQsIDB4MDAsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4NDksIDB4MDAsIDB4MkIsIDB4NjAsIDB4QkUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzYsCisJIDB4MjAsIDB4MDAsIDB4MEYsIDB4MzYsIDB4MUIsIDB4MDAsIDB4MEEsIDB4MzYsIDB4MTYsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsCisJIDB4MEMsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MDgsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MTUsIDB4MDAsIDB4MDIsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MTIsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEYsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MEMsIDB4MDAsCisJIDB4MDgsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsIDB4MEEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MEMsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4MDMsIDB4MDAsIDB4MEUsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NjAsIDB4ODIsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MEMsIDB4MzYsCisJIDB4MTksIDB4MDAsIDB4MDgsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MEQsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDksIDB4MzYsIDB4MEQsIDB4MDAsIDB4MEUsIDB4MzYsCisJIDB4MDksIDB4MDAsIDB4MEEsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEYsIDB4MzYsIDB4MDEsIDB4MDAsIDB4M0EsIDB4MDAsIDB4MDIsIDB4QTMsIDB4MzgsIDB4MDAsCisJIDB4MDQsIDB4QTMsIDB4MzYsIDB4MDAsIDB4MDYsIDB4QTMsIDB4MzQsIDB4MDAsIDB4MDgsIDB4QTMsIDB4MzIsIDB4MDAsIDB4MEEsIDB4QTMsIDB4MzAsIDB4MDAsCisJIDB4MEMsIDB4QTMsIDB4MkUsIDB4MDAsIDB4MEUsIDB4QTMsIDB4MkMsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MkIsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4MjUsIDB4NDQsCisJIDB4MEEsIDB4MzYsIDB4MEMsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDcsIDB4MDAsIDB4MzcsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QTMsIDB4RDMsIDB4MDksIDB4MDAsCisJIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDYsIDB4MDAsIDB4MDQsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MDYsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDUsIDB4MEEsIDB4MzYsIDB4MEQsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4M0EsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MTUsIDB4NjQsIDB4NkUsIDB4M0EsIDB4MDksIDB4MDAsIDB4ODQsIDB4N0YsIDB4NDAsIDB4NDUsIDB4MEIsIDB4NjQsCisJIDB4MDUsIDB4MDAsIDB4MjksIDB4NDQsIDB4N0YsIDB4NjAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDksIDB4NzAsIDB4NjQsIDB4NDAsIDB4NEQsIDB4MDIsIDB4MDAsCisJIDB4NDAsIDB4NDUsIDB4MEEsIDB4MDAsIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjMsIDB4MEEsIDB4MzYsIDB4MDYsIDB4MDAsIDB4MTQsIDB4MzYsIDB4MDIsIDB4QTMsCisJIDB4MzcsIDB4MzYsIDB4MDQsIDB4QTMsIDB4NkUsIDB4MzYsIDB4MDYsIDB4QTMsIDB4MjgsIDB4QTMsIDB4QTMsIDB4RDEsIDB4RDgsIDB4QTMsIDB4MTUsIDB4NjAsCisJIDB4RDgsIDB4RjksIDB4MzksIDB4RjEsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4MUYsIDB4QjQsCisJIDB4NTQsIDB4OTQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4NjAsIDB4NDcsCisJIDB4QjQsIDB4ODUsIDB4MjksIDB4NDQsIDB4QzAsIDB4NjAsIDB4MDAsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MUYsIDB4RkEsIDB4QjUsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4QUQsIDB4RjMsIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4RkYsIDB4NjAsCisJIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4QTUsIDB4NjAsIDB4RDYsIDB4NzgsIDB4MDQsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4QzQsIDB4RTIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4MjksIDB4NDQsIDB4MjQsIDB4ODksIDB4QUQsIDB4RjMsIDB4QzQsIDB4RTIsCisJIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsIDB4RTAsIDB4OTQsIDB4MjYsIDB4NDQsIDB4ODQsIDB4QkMsIDB4MjQsIDB4NDAsCisJIDB4MEMsIDB4MjIsIDB4RkQsIDB4QjQsIDB4NDAsIDB4NDYsIDB4MjMsIDB4NjQsIDB4M0EsIDB4REIsIDB4QUMsIDB4NjAsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDAsIDB4MjYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RjgsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDYsIDB4NjQsIDB4MzEsIDB4RkIsIDB4QzAsIDB4RkUsCisJIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4MDEsIDB4NjAsCisJIDB4MTgsIDB4RTEsIDB4MDEsIDB4MTEsIDB4MEYsIDB4MDAsIDB4MjksIDB4NDQsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDksIDB4MDEsIDB4NjQsIDB4MzMsIDB4RkIsCisJIDB4QjYsIDB4RkYsIDB4MDAsIDB4RTEsIDB4MDEsIDB4NjAsIDB4MUEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkMsIDB4NDAsIDB4RkMsIDB4MTEsCisJIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsCisJIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MzcsIDB4RjMsIDB4MkIsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjgsIDB4NjUsIDB4NDQsCisJIDB4NjAsIDB4NTAsIDB4QTAsIDB4NEMsIDB4MjAsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MDAsIDB4NjAsIDB4MkUsIDB4N0MsIDB4NzQsIDB4NDQsCisJIDB4QzAsIDB4OTQsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MEMsIDB4QjQsCisJIDB4MDQsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MjYsIDB4NDMsIDB4RkQsIDB4QjMsIDB4MDQsIDB4QkIsIDB4NDMsIDB4NDYsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MjgsIDB4NDcsIDB4NDAsIDB4QkYsIDB4NDAsIDB4NDgsIDB4MEEsIDB4QkIsIDB4MEYsIDB4RkMsIDB4NTAsIDB4NEIsIDB4NjcsIDB4NTAsIDB4MDAsIDB4NjQsCisJIDB4MzAsIDB4RkIsIDB4MDUsIDB4RkYsIDB4QUMsIDB4NjAsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NjQsIDB4M0EsIDB4REIsIDB4MjgsIDB4NDQsCisJIDB4MDQsIDB4MkEsIDB4MDMsIDB4MDAsIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUQsIDB4RkYsIDB4QTgsIDB4RTIsIDB4MjYsIDB4NDAsCisJIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RjAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4QTQsIDB4NjAsIDB4NkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEEsIDB4QTQsIDB4NjAsIDB4N0MsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsCisJIDB4NEYsIDB4RkIsIDB4RTEsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NTQsIDB4NjIsIDB4MjIsIDB4NDYsIDB4QTIsIDB4RDAsCisJIDB4MTYsIDB4NjMsIDB4N0MsIDB4NDEsIDB4NDQsIDB4NDgsIDB4ODAsIDB4MzYsIDB4MDQsIDB4NjEsIDB4MjgsIDB4NDAsIDB4NTAsIDB4MzYsIDB4MDQsIDB4NjEsCisJIDB4NDEsIDB4NEUsIDB4MjgsIDB4NDQsIDB4QTQsIDB4MzYsIDB4MEUsIDB4NjMsIDB4MEEsIDB4NjAsIDB4N0MsIDB4RjEsIDB4MkQsIDB4NDQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4OUEsIDB4RkYsIDB4QTEsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4Q0QsIDB4RTIsIDB4NTQsIDB4NjIsIDB4QTIsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NkEsIDB4NDAsIDB4ODAsIDB4NEUsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUQsCisJIDB4QjIsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4MjgsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MDYsIDB4MDAsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4NzAsIDB4NjIsIDB4MjgsIDB4NDQsIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTYsIDB4MDAsIDB4NzIsIDB4NjIsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDIsCisJIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEMsIDB4MjAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjYsIDB4MjYsIDB4NEQsIDB4MDAsCisJIDB4MjYsIDB4MjcsIDB4NEIsIDB4MDAsIDB4MjMsIDB4NDMsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MUQsIDB4MkUsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4RjAsCisJIDB4MDQsIDB4RjQsIDB4NjQsIDB4NDIsIDB4M0QsIDB4MDAsIDB4MkUsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MjcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MDIsIDB4RkUsCisJIDB4MTAsIDB4MjUsIDB4NDIsIDB4RkUsIDB4MTIsIDB4NzQsIDB4NzIsIDB4NDUsIDB4NjUsIDB4NEMsIDB4OTQsIDB4RjMsIDB4MDMsIDB4MDQsIDB4RTQsIDB4RTIsCisJIDB4REMsIDB4ODQsIDB4OTQsIDB4RkIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OTUsIDB4RjMsIDB4MDIsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4OTUsIDB4RkIsIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4OTYsIDB4RjMsIDB4MDIsIDB4MDQsIDB4REMsIDB4ODQsIDB4OTYsIDB4RkIsCisJIDB4ODAsIDB4NEMsIDB4MTIsIDB4NzQsIDB4NUMsIDB4NEUsIDB4RjgsIDB4QTMsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsIDB4RkYsIDB4QjEsCisJIDB4RjgsIDB4QTEsIDB4MDYsIDB4QTQsIDB4NjAsIDB4NDIsIDB4MEEsIDB4MDAsIDB4NEUsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4QzgsIDB4ODIsIDB4RkYsIDB4QjEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4QjEsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsCisJIDB4RkQsIDB4MUMsIDB4RjksIDB4MUQsIDB4RkYsIDB4QjEsIDB4MUIsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4REEsIDB4ODIsCisJIDB4QTIsIDB4RDIsIDB4QTEsIDB4RkYsIDB4MDksIDB4NzQsIDB4NjAsIDB4NEQsIDB4MTIsIDB4MDAsIDB4MDMsIDB4RjIsIDB4OUEsIDB4RjIsIDB4MDQsIDB4RjQsCisJIDB4MjMsIDB4NDMsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4QTAsIDB4RDIsIDB4RkUsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4NjAsIDB4NEUsIDB4QUYsIDB4ODMsCisJIDB4MDMsIDB4MUQsIDB4MDUsIDB4MDMsIDB4MTIsIDB4NzQsIDB4RUIsIDB4MDEsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4REYsIDB4MDEsIDB4MTIsIDB4NzQsCisJIDB4REEsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MEMsIDB4RkEsIDB4MjIsIDB4RjIsIDB4MEIsIDB4RkMsIDB4MjgsIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MUEsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjYsIDB4MjYsIDB4MEYsIDB4MDAsIDB4MjYsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjIsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsCisJIDB4MTIsIDB4NzQsIDB4N0EsIDB4RDQsIDB4MTIsIDB4NzQsIDB4MDcsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTIsIDB4NzQsIDB4OUMsIDB4NEUsIDB4MTIsIDB4NzQsCisJIDB4OUMsIDB4NEMsIDB4MTIsIDB4NzQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RkYsIDB4QTEsIDB4RkYsIDB4QjEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MDAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MTgsIDB4RTEsIDB4NzgsIDB4NDQsIDB4MDIsIDB4QTQsIDB4MzUsIDB4RkIsIDB4Q0MsIDB4MDAsIDB4MjksIDB4NDQsCisJIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDksIDB4MzQsIDB4NjQsIDB4M0EsIDB4REIsIDB4NDQsIDB4RTEsIDB4QTUsIDB4NjAsIDB4QjIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NkIsIDB4QkMsIDB4RkYsIDB4MTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MTUsIDB4RkIsIDB4NzgsIDB4NUMsIDB4MDcsIDB4MDAsCisJIDB4NzgsIDB4NUMsIDB4MkYsIDB4MDAsIDB4NjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4OTgsIDB4RkYsIDB4ODAsIDB4M0UsIDB4ODAsIDB4NjAsCisJIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4NDAsIDB4NjAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NDgsIDB4NjAsCisJIDB4NUUsIDB4NjUsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDEsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4N0MsIDB4NDUsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDgsIDB4NjAsIDB4MDgsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsCisJIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTIsIDB4NzQsIDB4NkEsIDB4NDAsIDB4ODcsIDB4NEYsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDgsIDB4MDAsIDB4MEEsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsCisJIDB4MDksIDB4MDAsIDB4MDMsIDB4NjQsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4ODcsIDB4NEYsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4N0MsIDB4NDQsIDB4MDEsIDB4MDgsIDB4MDEsIDB4MDAsIDB4NjcsIDB4NDQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEMsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsCisJIDB4MTIsIDB4NzQsIDB4ODcsIDB4NEQsIDB4MTIsIDB4NzQsIDB4MDQsIDB4MjEsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4RkYsIDB4MkEsIDB4MEQsIDB4MDAsIDB4MEMsIDB4MDAsIDB4QkMsIDB4RkYsIDB4NjEsIDB4RkYsIDB4NzgsIDB4NUMsIDB4NTcsIDB4MDEsCisJIDB4NzgsIDB4NUMsIDB4N0YsIDB4MDEsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsCisJIDB4NkEsIDB4NDQsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NzQsIDB4QzQsIDB4RTIsIDB4MDQsIDB4RTEsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDUsIDB4MDAsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4MTQsIDB4NzQsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NzQsIDB4QzQsIDB4RTIsCisJIDB4MDQsIDB4RTEsIDB4QkMsIDB4RkYsIDB4QjUsIDB4RkYsIDB4NDcsIDB4RkYsIDB4QjYsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4QzgsIDB4NjAsCisJIDB4MDksIDB4N0QsIDB4N0MsIDB4NEIsIDB4MjksIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4MjksIDB4NDAsIDB4MTAsIDB4MjYsIDB4NkQsIDB4MDAsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsCisJIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4NDAsIDB4NjAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4NDgsIDB4NjAsIDB4NUUsIDB4NjUsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4ODAsIDB4NjAsIDB4MDEsIDB4RTAsIDB4RDUsIDB4NjAsCisJIDB4ODQsIDB4RTcsIDB4ODIsIDB4RjMsIDB4N0MsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MDIsIDB4NjUsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4MDAsIDB4NjAsIDB4N0YsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NDgsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4ODQsIDB4NjAsIDB4MDQsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4NDAsIDB4NjAsIDB4MDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4NjUsIDB4NEEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsCisJIDB4RkUsIDB4MDEsIDB4OEMsIDB4NjAsIDB4NDgsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkEsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTYsIDB4RkUsIDB4MDEsCisJIDB4OTUsIDB4NjAsIDB4ODQsIDB4RTcsIDB4MDEsIDB4NjAsIDB4MDgsIDB4RTEsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RTIsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsCisJIDB4MDQsIDB4MDAsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QzIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RDAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4QUQsIDB4RjMsIDB4QzQsIDB4RTIsIDB4ODksIDB4RkYsIDB4NjAsIDB4NTQsIDB4ODgsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4RTAsIDB4OTQsIDB4MzUsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NDMsIDB4RkYsIDB4MDEsIDB4NjAsIDB4MDAsIDB4RTEsIDB4MjgsIDB4RjMsIDB4NDcsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDcsIDB4MzcsIDB4NjYsIDB4MDAsCisJIDB4MDUsIDB4M0IsIDB4MDQsIDB4MDAsIDB4RkYsIDB4MEEsIDB4ODAsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsCisJIDB4QUQsIDB4NEYsIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MjksIDB4RjUsIDB4MkEsIDB4RjMsIDB4NDcsIDB4RkYsCisJIDB4M0YsIDB4RjAsIDB4MDEsIDB4MUIsIDB4MDEsIDB4NjQsIDB4NjAsIDB4NTYsIDB4QUQsIDB4RTIsIDB4QjUsIDB4RkYsIDB4NkMsIDB4NDAsIDB4NDAsIDB4RTEsCisJIDB4QTEsIDB4RkYsIDB4MDAsIDB4RjQsIDB4NkUsIDB4NjEsIDB4MTIsIDB4NjIsIDB4NjQsIDB4NDMsIDB4MDEsIDB4RTEsIDB4MDMsIDB4NjQsIDB4RTIsIDB4RDAsCisJIDB4QzksIDB4ODEsIDB4NjQsIDB4NEMsIDB4Q0MsIDB4ODQsIDB4REEsIDB4ODIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NkIsIDB4OUEsIDB4RkYsCisJIDB4Q0EsIDB4ODIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4N0EsIDB4RDAsIDB4QTEsIDB4RkYsIDB4NjQsIDB4NEMsCisJIDB4RkMsIDB4MUMsIDB4RjgsIDB4MUQsIDB4MDAsIDB4QjksIDB4MDYsIDB4MUUsIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4REEsIDB4ODIsIDB4NUEsIDB4RDIsCisJIDB4QTEsIDB4RkYsIDB4NjAsIDB4NEQsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTAsIDB4MDAsIDB4MjgsIDB4RjMsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjUsCisJIDB4NjAsIDB4NDAsIDB4MEUsIDB4M0IsIDB4MEEsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QkMsIDB4RDIsIDB4RkIsIDB4QUQsIDB4NEYsCisJIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4ODUsIDB4NEMsIDB4RkUsIDB4MDEsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsCisJIDB4RDIsIDB4RkIsIDB4QTEsIDB4RkYsIDB4ODcsIDB4NEUsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4ODcsIDB4NEMsIDB4NjcsIDB4NEMsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4MDAsIDB4RTEsIDB4RDUsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsCisJIDB4NjAsIDB4NDEsIDB4QjUsIDB4RkYsIDB4QjcsIDB4RkYsIDB4QjQsIDB4RkYsIDB4MjksIDB4RjUsIDB4M0YsIDB4RjAsIDB4MjQsIDB4RjIsIDB4NDQsIDB4NDMsCisJIDB4NDAsIDB4NEQsIDB4MDAsIDB4RjQsIDB4RjMsIDB4NjAsIDB4QTAsIDB4NjUsIDB4MTAsIDB4NjIsIDB4NUEsIDB4RDIsIDB4RDksIDB4ODEsIDB4RDQsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4RkIsIDB4MDIsIDB4NjEsIDB4NDUsIDB4MkQsIDB4NDQsIDB4RDQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RkQsIDB4QTUsIDB4NDgsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QzQsIDB4OUQsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NkIsIDB4MkQsIDB4NDQsIDB4QzAsIDB4ODMsCisJIDB4QkIsIDB4RkYsIDB4MjksIDB4RjUsIDB4MDEsIDB4RTEsIDB4MDAsIDB4RjQsIDB4NkMsIDB4NjEsIDB4MTAsIDB4NjIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDQsIDB4NjIsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MTAsIDB4MUEsIDB4MDAsCisJIDB4MjYsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4MkQsIDB4NDQsIDB4QzgsIDB4ODQsIDB4NDAsIDB4NEQsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsCisJIDB4RjMsIDB4MDEsIDB4MDMsIDB4MTUsIDB4MDEsIDB4NjQsIDB4MDUsIDB4RkEsIDB4MTUsIDB4MDAsIDB4NkMsIDB4NDUsIDB4RUQsIDB4MDEsIDB4MjMsIDB4NDQsCisJIDB4QzgsIDB4ODQsIDB4NDAsIDB4NDMsIDB4MDIsIDB4MDMsIDB4NkMsIDB4NDUsIDB4RTcsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4NjQsCisJIDB4NkMsIDB4NDUsIDB4MDUsIDB4RkIsIDB4RTIsIDB4RDIsIDB4REEsIDB4ODIsIDB4QzksIDB4ODEsIDB4NjAsIDB4NEMsIDB4REQsIDB4MUMsIDB4RDcsIDB4MDMsCisJIDB4QkMsIDB4RkYsIDB4REEsIDB4MDEsIDB4MDAsIDB4RTEsIDB4RDUsIDB4RkUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RTEsIDB4QTEsIDB4RkYsCisJIDB4NjcsIDB4NEMsIDB4NDMsIDB4RkYsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QkMsIDB4RDIsIDB4RkIsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4MDEsIDB4RTEsIDB4MDEsIDB4NjAsIDB4NjksIDB4NkIsIDB4QTUsIDB4NjAsIDB4QzQsIDB4NjQsIDB4NjAsIDB4NEMsCisJIDB4QkIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NEMsIDB4RkMsIDB4MDEsCisJIDB4MjksIDB4RjMsIDB4MkEsIDB4RjEsIDB4MDcsIDB4QjUsIDB4MDQsIDB4RTEsIDB4NjUsIDB4NDEsIDB4NjQsIDB4NTQsIDB4Q0QsIDB4RTIsIDB4OTUsIDB4ODEsCisJIDB4QTEsIDB4NUQsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjksIDB4MDEsIDB4MTAsIDB4NjEsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjMsIDB4MjUsIDB4MDIsIDB4OTgsIDB4RkUsIDB4MTksIDB4MDUsIDB4MEYsIDB4NjAsIDB4N0YsIDB4RjUsIDB4MEUsIDB4RjIsCisJIDB4MTUsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsIDB4MEEsIDB4MDIsCisJIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsCisJIDB4MjgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsCisJIDB4MEYsIDB4QjQsIDB4RjcsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDMsIDB4MDUsIDB4NDUsIDB4NDAsIDB4MDAsIDB4NjcsIDB4RDgsIDB4RkUsCisJIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEEsIDB4N0UsIDB4MDQsIDB4RkIsIDB4NjEsIDB4NTUsIDB4NDgsIDB4MDAsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjMsCisJIDB4MjksIDB4RkIsIDB4NDQsIDB4NDYsIDB4NDAsIDB4NDUsIDB4MTAsIDB4NjEsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4N0YsIDB4NjcsCisJIDB4MDIsIDB4NjMsIDB4MzAsIDB4MDIsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDMsIDB4NjMsCisJIDB4MjksIDB4MDIsIDB4MjYsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MjMsIDB4MDAsIDB4OTgsIDB4RkUsIDB4MTgsIDB4MDUsIDB4MEYsIDB4NjAsIDB4N0YsIDB4RjUsCisJIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4MDIsIDB4MTgsIDB4MDksIDB4RjQsIDB4RkIsIDB4MDEsIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDgsIDB4N0UsCisJIDB4MEEsIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTEsIDB4RkIsIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsCisJIDB4QTIsIDB4REIsIDB4MDgsIDB4QjksIDB4MTAsIDB4N0UsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MDksIDB4MDAsIDB4MjAsIDB4NDQsIDB4REMsIDB4ODUsCisJIDB4MEYsIDB4QjQsIDB4RjcsIDB4QTAsIDB4N0YsIDB4NjcsIDB4MDcsIDB4NjMsIDB4MDUsIDB4MDUsIDB4NDUsIDB4NDAsIDB4RDgsIDB4RkUsIDB4MDAsIDB4NjcsCisJIDB4RDAsIDB4RkUsIDB4RDksIDB4RkUsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MEIsIDB4N0UsIDB4MDQsIDB4RkIsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QkMsIDB4MDgsIDB4MjgsIDB4QTIsIDB4REIsIDB4NjEsIDB4NTUsIDB4NjYsIDB4MDAsIDB4MDQsIDB4QjUsCisJIDB4ODIsIDB4QjUsIDB4MjUsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4QTMsIDB4RDMsIDB4OTksIDB4RkUsCisJIDB4MDQsIDB4MDQsIDB4MDIsIDB4QkMsIDB4RkUsIDB4QjQsIDB4QTMsIDB4REIsIDB4NTksIDB4MDAsIDB4QkMsIDB4RjMsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MjYsCisJIDB4NTUsIDB4MDAsIDB4QTMsIDB4RDMsIDB4RkYsIDB4QTAsIDB4RjgsIDB4QjQsIDB4MDIsIDB4MDIsIDB4QTMsIDB4REIsIDB4MUMsIDB4MDAsIDB4MDQsIDB4QkMsCisJIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4MjQsIDB4MDIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MjAsIDB4NDQsCisJIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4RDAsIDB4RkUsIDB4NDIsIDB4MDAsIDB4QkYsIDB4QjQsIDB4QTMsIDB4REIsIDB4M0YsIDB4MDAsIDB4NDAsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDIsIDB4RjgsIDB4QjQsIDB4QTMsIDB4REIsIDB4MDgsIDB4QjUsIDB4MDcsIDB4N0MsIDB4MDEsIDB4MDIsIDB4QkMsIDB4RjksCisJIDB4MjAsIDB4NDQsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4MTQsIDB4NjAsIDB4RkMsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjUsCisJIDB4MDcsIDB4QjUsIDB4MDgsIDB4MjgsIDB4QzQsIDB4MDIsIDB4OTksIDB4RkUsIDB4MjksIDB4MDUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MjYsIDB4MDAsCisJIDB4MjAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4REYsIDB4QjQsIDB4NDAsIDB4NDAsIDB4NkEsIDB4MDAsIDB4NDAsIDB4MkEsIDB4MUYsIDB4MDAsIDB4QkYsIDB4QjQsCisJIDB4NDAsIDB4NDAsIDB4MDksIDB4MDAsIDB4QTgsIDB4RkYsIDB4MjAsIDB4NDQsIDB4OTksIDB4RkUsIDB4MDIsIDB4MDUsIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4NDAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4NjQsIDB4NDQsIDB4RTAsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MEEsIDB4MzYsIDB4MjksIDB4MDEsIDB4MEIsIDB4MzYsIDB4NTksIDB4MDEsIDB4MjgsIDB4RkIsIDB4MDEsIDB4RjEsIDB4MjksIDB4RjksCisJIDB4MDIsIDB4RjEsIDB4MkEsIDB4RjksIDB4MDMsIDB4RjEsIDB4MkIsIDB4RjksIDB4RDAsIDB4RkUsIDB4QUUsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4M0UsIDB4NzUsIDB4NDQsIDB4MDIsIDB4QjAsIDB4MDEsIDB4QjAsIDB4NEEsIDB4MDIsIDB4REMsIDB4MDIsIDB4MDQsIDB4QjAsIDB4MDgsIDB4QjAsCisJIDB4MEIsIDB4MDIsIDB4MjAsIDB4MDIsIDB4NDAsIDB4MjYsIDB4QTcsIDB4RkYsIDB4OEMsIDB4RkYsIDB4NzUsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDEsIDB4MDAsCisJIDB4QUIsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RUEsIDB4MDEsIDB4MEEsIDB4RjMsIDB4QUEsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4MDIsIDB4MDAsIDB4MzgsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4QTAsIDB4ODQsCisJIDB4ODAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4QzAsIDB4NjcsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MEEsIDB4RkIsCisJIDB4RDUsIDB4MDEsIDB4RDQsIDB4MDEsIDB4MEIsIDB4RjEsIDB4QUIsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RkYsIDB4MjcsIDB4MUYsIDB4MDAsIDB4MjAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4MUEsIDB4MDAsIDB4MTksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsIDB4MDQsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4MEEsIDB4NjQsIDB4Q0MsIDB4ODQsIDB4MTksIDB4RkIsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NzUsIDB4NjQsIDB4NDAsIDB4MDMsIDB4MjIsCisJIDB4MEQsIDB4MDAsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDcsIDB4MDAsIDB4RDksIDB4RkUsCisJIDB4ODEsIDB4NjAsIDB4MEIsIDB4NjQsIDB4MjgsIDB4RkIsIDB4MkMsIDB4NDQsIDB4MjksIDB4RkIsIDB4RDAsIDB4RkUsIDB4QUYsIDB4MDEsIDB4QTksIDB4RkYsCisJIDB4NzcsIDB4NDQsIDB4NjAsIDB4NTcsIDB4NDAsIDB4NEEsIDB4MDEsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDgsIDB4RjIsCisJIDB4MUMsIDB4MDMsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MEUsIDB4RjIsIDB4MDIsIDB4MDMsIDB4QTUsIDB4RDUsIDB4MDQsIDB4MDAsCisJIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MDksIDB4RjQsIDB4RDEsIDB4RkUsIDB4NDYsIDB4NDQsIDB4MEYsIDB4MTgsIDB4M0YsIDB4RjIsIDB4NDgsIDB4NjUsCisJIDB4QzQsIDB4ODQsIDB4MTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4MTAsIDB4RkIsIDB4NjYsIDB4NDcsIDB4MjAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsCisJIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4NDEsIDB4NzUsIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MDgsIDB4MkEsIDB4MTcsIDB4MDAsCisJIDB4MjMsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NUMsIDB4NDMsIDB4MTMsIDB4MDMsIDB4MEYsIDB4NjAsIDB4N0YsIDB4RjUsIDB4MDEsIDB4MDAsIDB4MDksIDB4RjQsCisJIDB4MEUsIDB4RjIsIDB4MEQsIDB4MTgsIDB4MDgsIDB4QjAsIDB4MTgsIDB4QUMsIDB4RkEsIDB4MDMsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDMsIDB4MTEsIDB4RkQsCisJIDB4NDYsIDB4NDMsIDB4MjMsIDB4NDcsIDB4ODAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjgsIDB4NzUsIDB4MkEsIDB4NDQsCisJIDB4MDYsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MjIsIDB4NDQsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4MjgsIDB4MDMsIDB4MTAsIDB4QjAsCisJIDB4MDEsIDB4QkMsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDIsIDB4MjIsIDB4MDAsIDB4MEUsIDB4RkEsIDB4RDEsIDB4RkUsIDB4MUUsIDB4NjAsCisJIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4ODAsIDB4MDAsIDB4NDYsIDB4NDIsIDB4MTksIDB4MDIsIDB4MjIsIDB4NDcsIDB4NDAsIDB4QkYsCisJIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MjMsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QTgsIDB4MEUsIDB4RjIsIDB4MDgsIDB4MDIsCisJIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4RTQsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDIsIDB4NzUsIDB4MDcsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MDQsIDB4MkEsIDB4REMsIDB4MDEsIDB4MTIsIDB4RkQsIDB4MTAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4MDQsIDB4NzUsIDB4MkEsIDB4NDQsCisJIDB4ODAsIDB4MkEsIDB4MTksIDB4MDAsIDB4MjEsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MTUsIDB4MDMsIDB4MDEsIDB4QkMsIDB4MEUsIDB4RkEsCisJIDB4RDEsIDB4RkUsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4NTYsIDB4MDAsIDB4NDYsIDB4NDEsIDB4MEIsIDB4MDIsCisJIDB4MjEsIDB4NDcsIDB4MTAsIDB4QkYsIDB4M0IsIDB4NDIsIDB4MDQsIDB4QTIsIDB4QTIsIDB4REIsIDB4MEUsIDB4RjIsIDB4NjYsIDB4NDMsIDB4MDgsIDB4RkQsCisJIDB4MTAsIDB4QkMsIDB4MEUsIDB4RkEsIDB4ODAsIDB4NzUsIDB4MkEsIDB4NDQsIDB4MTAsIDB4QjAsIDB4MjAsIDB4NDQsIDB4MTUsIDB4MDMsIDB4N0YsIDB4QjQsCisJIDB4NDAsIDB4NDAsIDB4MTQsIDB4NjAsIDB4RkMsIDB4NjMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MjAsIDB4QjAsIDB4ODAsIDB4QjAsIDB4MDksIDB4MDMsCisJIDB4MDgsIDB4MDMsIDB4NDAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4MDQsIDB4QjAsIDB4QTMsIDB4REIsIDB4MDMsIDB4MDMsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsCisJIDB4NDAsIDB4NDAsIDB4QjMsIDB4NjAsIDB4OEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTgsIDB4RkUsCisJIDB4MTQsIDB4MDUsIDB4RUEsIDB4RkUsIDB4MjQsIDB4MDUsIDB4RTksIDB4RkUsIDB4MUMsIDB4MDUsIDB4RTcsIDB4RkUsIDB4MDksIDB4MDUsIDB4NDcsIDB4RkYsCisJIDB4MjAsIDB4NDQsIDB4MEYsIDB4MjIsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4NDAsIDB4NDAsIDB4MEYsIDB4MjIsIDB4QjgsIDB4RkUsIDB4RUMsIDB4MDEsCisJIDB4MjMsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4RTgsIDB4MDIsIDB4NkYsIDB4MDEsIDB4MjQsIDB4NDEsIDB4MDAsIDB4QjksIDB4MUYsIDB4NjAsCisJIDB4MDQsIDB4NjUsIDB4NDUsIDB4NDcsIDB4RTEsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MEYsIDB4MDAsIDB4REUsIDB4MDIsIDB4NUMsIDB4NEEsIDB4NDYsIDB4NDQsCisJIDB4NEQsIDB4MDEsIDB4MjIsIDB4NDEsIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4MDgsIDB4MjQsIDB4ODEsIDB4MDEsIDB4RDUsIDB4MDEsIDB4MjEsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4NUMsIDB4NEEsIDB4QTYsIDB4MDMsIDB4RDAsIDB4MDEsIDB4MjcsIDB4RDMsIDB4MDMsIDB4MDAsIDB4MTAsIDB4QjAsIDB4MDksIDB4RjIsCisJIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4RjMsCisJIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsIDB4MEMsIDB4RjMsIDB4MjQsIDB4ODYsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsCisJIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsCisJIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4NDQsIDB4MDAsIDB4MDcsIDB4MDIsCisJIDB4NTgsIDB4NEYsIDB4NTAsIDB4MDAsIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsCisJIDB4MDAsIDB4QkYsIDB4MEUsIDB4RkIsIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsCisJIDB4QUMsIDB4RkYsIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MEYsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkUsIDB4NjUsCisJIDB4MjQsIDB4ODYsIDB4MEQsIDB4RjMsIDB4MjQsIDB4NDYsIDB4NjAsIDB4NDAsIDB4RkIsIDB4M0IsIDB4MDcsIDB4MDAsIDB4ODAsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4MjMsIDB4NDYsIDB4MDMsIDB4NEMsIDB4NDYsIDB4NjEsIDB4M0EsIDB4NjUsIDB4MEMsIDB4MDAsIDB4MkUsIDB4RjMsIDB4NDAsIDB4NDUsIDB4RjgsIDB4MkIsCisJIDB4MDIsIDB4MDAsIDB4NDAsIDB4NDUsIDB4MDMsIDB4MDAsIDB4NTgsIDB4NEYsIDB4MTYsIDB4MDAsIDB4MDcsIDB4MDIsIDB4NTgsIDB4NEYsIDB4MjIsIDB4MDAsCisJIDB4MDQsIDB4MDUsIDB4NjYsIDB4NTAsIDB4NjUsIDB4NTIsIDB4NjEsIDB4NTEsIDB4MDksIDB4MDAsIDB4MjYsIDB4NDcsIDB4MDAsIDB4QkYsIDB4MEYsIDB4RkIsCisJIDB4MkUsIDB4RjUsIDB4MDUsIDB4RjAsIDB4ODAsIDB4NjAsIDB4NjQsIDB4NTAsIDB4MDAsIDB4NzIsIDB4N0UsIDB4NzEsIDB4OEQsIDB4RkYsIDB4QUQsIDB4RkYsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4ODksIDB4RjEsIDB4OEEsIDB4RjEsIDB4RDAsIDB4ODAsIDB4RDAsIDB4ODAsCisJIDB4MDcsIDB4MDQsIDB4MDEsIDB4MDYsIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODUsIDB4OTQsIDB4ODAsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MjYsIDB4NDEsIDB4NDYsIDB4NjMsIDB4MDEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QjUsCisJIDB4RDUsIDB4ODEsIDB4MDAsIDB4RjIsIDB4MDUsIDB4MDQsIDB4MDQsIDB4NjMsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MUIsIDB4NDIsIDB4RkUsIDB4MEQsIDB4MDAsCisJIDB4NjEsIDB4NDQsIDB4QzUsIDB4ODEsIDB4NjMsIDB4NDUsIDB4QzUsIDB4ODEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4MDEsIDB4RjIsIDB4RjAsIDB4ODUsCisJIDB4RjAsIDB4ODAsIDB4NjUsIDB4NDQsIDB4RjgsIDB4ODUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsCisJIDB4MEYsIDB4NjAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDcsIDB4MDMsIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsCisJIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4MTcsIDB4MDAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsCisJIDB4MDAsIDB4QjQsIDB4MTIsIDB4MDYsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDYsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEEsCisJIDB4NDIsIDB4QTEsIDB4MDMsIDB4MDAsIDB4NDEsIDB4NEEsIDB4N0MsIDB4QTEsIDB4MEUsIDB4QTEsIDB4QTIsIDB4RkYsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QzEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4MkEsIDB4NDMsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4RkUsIDB4MEMsIDB4MDAsIDB4MEYsIDB4NjAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MEUsIDB4RjIsIDB4MDYsIDB4MDMsCisJIDB4MDAsIDB4QTgsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDEsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4OEMsIDB4RjMsIDB4N0MsIDB4NjMsIDB4MDAsIDB4QkUsIDB4NDAsIDB4NDUsIDB4MUEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NjUsIDB4NDQsCisJIDB4REMsIDB4ODUsIDB4ODQsIDB4QTEsIDB4MDAsIDB4RjIsIDB4MDYsIDB4MDYsIDB4MDEsIDB4RkMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4RjcsIDB4MDIsCisJIDB4NDAsIDB4NDUsIDB4MEUsIDB4MDAsIDB4OEIsIDB4RjMsIDB4MDAsIDB4NjMsIDB4RDQsIDB4ODQsIDB4OEIsIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsCisJIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkMsIDB4RDMsIDB4ODAsIDB4OEMsIDB4RjksIDB4MDIsIDB4MDIsIDB4OEQsIDB4RjksIDB4MDgsIDB4RkUsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RkEsIDB4MDYsIDB4RkEsIDB4MDEsIDB4RjAsIDB4MDMsIDB4NjcsCisJIDB4MDIsIDB4RkMsIDB4QjAsIDB4ODQsIDB4M0EsIDB4N0UsIDB4MDEsIDB4RkEsIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDQsIDB4RjgsCisJIDB4MDAsIDB4NjQsIDB4MEMsIDB4NjEsIDB4MTAsIDB4NjMsIDB4NTksIDB4REEsIDB4RkUsIDB4MUYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDMsCisJIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsCisJIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkUsIDB4RDIsIDB4MjUsIDB4NDYsIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsCisJIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4RkEsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDQsIDB4MDAsIDB4QTgsIDB4MDcsIDB4NEIsIDB4MEMsIDB4MDMsCisJIDB4NTgsIDB4NEYsIDB4MzMsIDB4MDAsIDB4MEIsIDB4NDcsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjUsIDB4MjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4MDEsIDB4MDIsIDB4MEYsIDB4RkEsIDB4NTgsIDB4NEYsIDB4RDMsIDB4MDEsIDB4NzAsIDB4MDAsIDB4MjUsIDB4NDMsIDB4RTMsIDB4ODQsIDB4N0MsIDB4NDEsCisJIDB4MDIsIDB4MDQsIDB4RTgsIDB4ODEsIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QTMsIDB4RDIsIDB4MDAsIDB4N0MsIDB4NDAsIDB4NDUsIDB4QkYsIDB4RDgsCisJIDB4QTMsIDB4RDgsIDB4QkUsIDB4RDgsIDB4MjcsIDB4NDIsIDB4NUEsIDB4RDMsIDB4MjUsIDB4NUMsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MUIsIDB4MjcsIDB4RDksCisJIDB4MDUsIDB4MDAsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MDksIDB4RkEsIDB4MjUsIDB4NDQsIDB4MjcsIDB4NDMsCisJIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDYsIDB4MDksIDB4RjIsIDB4MDgsIDB4RkMsIDB4MDAsIDB4QTgsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDIsIDB4QkYsIDB4RDEsCisJIDB4NjYsIDB4NDQsIDB4QkUsIDB4REIsIDB4QzEsIDB4ODQsIDB4QkYsIDB4REIsIDB4NDgsIDB4MDAsIDB4MjUsIDB4NDYsIDB4RUMsIDB4NjMsIDB4MDgsIDB4RjIsCisJIDB4ODksIDB4RjIsIDB4MUUsIDB4MTgsIDB4NDAsIDB4NDcsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODUsIDB4MDIsIDB4MDUsIDB4RTgsIDB4ODMsIDB4MDAsIDB4NjUsCisJIDB4NjUsIDB4NDYsIDB4QkYsIDB4RDIsIDB4NjEsIDB4NUMsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjUsIDB4NDYsIDB4MEEsIDB4RjIsIDB4MDAsIDB4QjksCisJIDB4NjUsIDB4NDYsIDB4MDgsIDB4MjQsIDB4QkUsIDB4REEsIDB4MDIsIDB4MUIsIDB4QTMsIDB4RDgsIDB4MDIsIDB4MDAsIDB4NjAsIDB4NDYsIDB4ODksIDB4RkEsCisJIDB4MDAsIDB4QjksIDB4NjEsIDB4NDYsIDB4MDgsIDB4MjgsIDB4MEEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjEsIDB4MjgsIDB4NjUsIDB4MjUsIDB4NDMsIDB4OEQsIDB4RjMsIDB4QUYsIDB4ODMsIDB4MDAsIDB4QkUsCisJIDB4MTgsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDAsIDB4RkMsIDB4MDEsIDB4MDAsIDB4OEMsIDB4RkQsIDB4NjMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsCisJIDB4MDAsIDB4RjIsIDB4MDcsIDB4MDIsIDB4OEQsIDB4RjUsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4REUsIDB4NjAsIDB4QUYsIDB4NjQsIDB4MDksIDB4RkIsCisJIDB4MDgsIDB4MDAsIDB4NjYsIDB4NDMsIDB4MDAsIDB4QkUsIDB4REQsIDB4ODEsIDB4RjEsIDB4MDIsIDB4OEIsIDB4RjEsIDB4OEQsIDB4RkQsIDB4QzEsIDB4ODQsCisJIDB4OEIsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDUsIDB4MjksIDB4NDMsIDB4RkMsIDB4QTMsIDB4NjYsIDB4NDQsCisJIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDMsIDB4NjEsIDB4MEUsIDB4NjUsIDB4MUYsIDB4NjAsCisJIDB4MUUsIDB4NjMsIDB4NDMsIDB4NDksIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4MDIsIDB4RjksIDB4MDIsCisJIDB4QjMsIDB4NjAsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MjYsIDB4RTYsIDB4MDEsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4RTMsIDB4MDUsCisJIDB4RjYsIDB4QTMsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDEsIDB4NDQsIDB4NDcsIDB4NDQsIDB4NDgsIDB4NDQsIDB4NDUsIDB4MUYsIDB4NjAsIDB4NjAsIDB4NjQsCisJIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4OEMsIDB4RjUsIDB4OEIsIDB4RjMsIDB4MEQsIDB4MTgsIDB4Q0MsIDB4ODQsCisJIDB4OEIsIDB4RkIsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RjAsIDB4MDAsIDB4RkEsIDB4RDAsIDB4ODAsCisJIDB4OEMsIDB4RjksIDB4MDIsIDB4MDIsIDB4OEQsIDB4RjksIDB4MDgsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjMsCisJIDB4MEQsIDB4NjUsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NDgsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4NjEsIDB4MDksIDB4MDMsCisJIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsCisJIDB4RjYsIDB4MDEsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4Q0MsIDB4ODUsCisJIDB4NUEsIDB4ODcsIDB4RTksIDB4MDIsIDB4MDAsIDB4NjQsIDB4MjcsIDB4REEsIDB4NUEsIDB4REEsIDB4NUEsIDB4ODcsIDB4ODcsIDB4RjMsIDB4ODYsIDB4RjEsCisJIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsCisJIDB4MDQsIDB4MDMsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsIDB4NjUsIDB4NDYsCisJIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsIDB4RkYsIDB4RkYsIDB4RjAsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsCisJIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4ODcsIDB4RjMsIDB4ODYsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjEsCisJIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsIDB4MDksIDB4MDMsIDB4MDAsIDB4RjIsIDB4MDksIDB4RjAsIDB4QUMsIDB4ODYsCisJIDB4MDAsIDB4RjIsIDB4REQsIDB4ODEsIDB4RkMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RjYsIDB4MDEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTUsCisJIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsIDB4Q0MsIDB4OUMsIDB4NjEsIDB4NDQsIDB4RUIsIDB4MDIsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4NUEsIDB4ODcsCisJIDB4MjgsIDB4NDUsIDB4NDUsIDB4ODgsIDB4MDYsIDB4NjAsIDB4NDAsIDB4NjUsIDB4OEMsIDB4RjMsIDB4MDEsIDB4NjEsIDB4QUMsIDB4ODYsIDB4MDAsIDB4RjIsCisJIDB4MDMsIDB4MDMsIDB4RDUsIDB4ODAsIDB4REQsIDB4ODEsIDB4RkEsIDB4MDQsIDB4Q0QsIDB4ODQsIDB4MjUsIDB4NDYsIDB4MjcsIDB4REEsIDB4MjgsIDB4NDUsCisJIDB4QzQsIDB4ODQsIDB4NUEsIDB4REEsIDB4REEsIDB4ODEsIDB4OEIsIDB4RjEsIDB4NTksIDB4RDgsIDB4MUUsIDB4NjAsIDB4Q0MsIDB4NjQsIDB4MTgsIDB4NjMsCisJIDB4QTAsIDB4RDEsIDB4MDYsIDB4QTQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MUYsIDB4MDAsIDB4NjQsIDB4NTksIDB4REEsIDB4NTksIDB4REEsIDB4MDEsIDB4NjAsCisJIDB4MUEsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4N0QsIDB4RjEsIDB4NTksIDB4RDgsIDB4NDUsIDB4MDEsCisJIDB4MDcsIDB4NEIsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MjEsIDB4MDAsCisJIDB4M0MsIDB4MDEsIDB4MDcsIDB4NEIsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NDcsIDB4MjcsIDB4NDQsCisJIDB4MDAsIDB4QkUsIDB4MDgsIDB4RjAsIDB4MTUsIDB4MDMsIDB4NjQsIDB4NDIsIDB4NEEsIDB4RDMsIDB4MDksIDB4RjIsIDB4REMsIDB4ODMsIDB4QTIsIDB4REQsCisJIDB4MjUsIDB4NDMsIDB4MDksIDB4RkMsIDB4NjMsIDB4NDYsIDB4MjcsIDB4NDMsIDB4MEEsIDB4RkMsIDB4MDksIDB4RkEsIDB4MDgsIDB4RjgsIDB4MDAsIDB4QTgsCisJIDB4NjYsIDB4NDMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4NDQsIDB4NTgsIDB4REQsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDYsIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsCisJIDB4MUMsIDB4MDEsIDB4MjcsIDB4NDMsIDB4RTMsIDB4ODEsIDB4RTksIDB4ODEsIDB4MDMsIDB4MDUsIDB4MTYsIDB4MDMsIDB4MDAsIDB4NjEsIDB4MDEsIDB4MDAsCisJIDB4RUMsIDB4NjMsIDB4NjEsIDB4NDYsIDB4QkYsIDB4RDIsIDB4MjcsIDB4NDUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NDYsCisJIDB4ODgsIDB4RjgsIDB4MDQsIDB4MUIsIDB4MjUsIDB4NDQsIDB4NjEsIDB4NDYsIDB4QkUsIDB4REEsIDB4MDQsIDB4MDAsIDB4MDksIDB4RkEsIDB4NjAsIDB4NDYsCisJIDB4MjUsIDB4NDQsIDB4MEEsIDB4RkEsIDB4NjEsIDB4NDYsIDB4QTMsIDB4REEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkUsIDB4MDcsIDB4MDUsCisJIDB4QTMsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTEsIDB4RkUsIDB4NDYsIDB4MDUsIDB4NjAsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEYsIDB4MDAsIDB4MjAsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4RkEsIDB4MDEsIDB4MEEsIDB4NjAsIDB4ODAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkIsIDB4QjQsIDB4QTIsIDB4REIsIDB4QTAsIDB4NEMsCisJIDB4NTksIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTAsIDB4NEMsIDB4N0QsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODMsIDB4M0UsIDB4NDAsIDB4NjAsIDB4MEIsIDB4NjUsIDB4MkIsIDB4NDQsIDB4MDAsIDB4NjMsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MDIsIDB4MjQsCisJIDB4OTQsIDB4ODQsIDB4RjMsIDB4ODMsIDB4Q0QsIDB4ODEsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDIsIDB4REYsIDB4ODMsIDB4MkYsIDB4NTgsIDB4NDAsIDB4NEIsCisJIDB4MDAsIDB4NjIsIDB4MDEsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MUEsIDB4MDMsIDB4RDQsIDB4ODAsIDB4RTAsIDB4ODQsIDB4MTUsIDB4MDMsCisJIDB4NjEsIDB4NDQsIDB4MTEsIDB4NjEsIDB4RTAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4RkQsIDB4MDQsIDB4MDEsIDB4MDAsIDB4RTAsIDB4ODQsIDB4RjIsIDB4ODIsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsIDB4QzYsIDB4ODIsIDB4MDIsIDB4MjgsIDB4RDYsIDB4ODIsIDB4RTIsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4MjgsCisJIDB4MDEsIDB4QkMsIDB4RjQsIDB4MDIsIDB4MDEsIDB4MkEsIDB4QzYsIDB4ODIsIDB4MDMsIDB4MDAsIDB4RTksIDB4ODEsIDB4RjIsIDB4ODIsIDB4NjEsIDB4NDQsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEMsIDB4NjAsIDB4NkUsIDB4RjMsIDB4NUEsIDB4RDEsIDB4NjAsIDB4NDAsCisJIDB4MDQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NEEsIDB4REIsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjMsIDB4QTMsIDB4RDMsIDB4NDYsIDB4NDMsCisJIDB4QUMsIDB4ODYsIDB4M0MsIDB4NDUsIDB4MjIsIDB4MDMsIDB4RDQsIDB4ODAsIDB4MDcsIDB4RjIsIDB4MDIsIDB4MDIsIDB4MDksIDB4RjIsIDB4RjgsIDB4MDEsCisJIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RjUsIDB4MDIsIDB4NjAsIDB4NDMsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDksIDB4NjAsCisJIDB4MDgsIDB4NjUsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjIsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MDUsIDB4MDAsIDB4OEYsIDB4RjMsIDB4RDQsIDB4ODAsCisJIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4OEYsIDB4RkIsIDB4NjMsIDB4NDQsIDB4REIsIDB4MDEsIDB4MjMsIDB4NDYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4OTQsIDB4MDIsIDB4NjksIDB4RjMsIDB4NkEsIDB4RjMsIDB4MDIsIDB4QTgsIDB4MDIsIDB4QTgsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsCisJIDB4NkIsIDB4RkIsIDB4NjksIDB4RkIsIDB4NkEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NkMsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4OTIsIDB4MDAsIDB4MDMsIDB4MDIsCisJIDB4MDAsIDB4NjQsIDB4NkEsIDB4RkIsIDB4Q0EsIDB4RkUsIDB4MDEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MEYsIDB4NjAsIDB4NkEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MzUsIDB4MDMsIDB4MkMsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4ODYsIDB4MDAsCisJIDB4MkUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsCisJIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsCisJIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NUYsIDB4MDIsIDB4NjYsIDB4NDUsCisJIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4ODAsIDB4QjAsIDB4MDksIDB4RjIsIDB4NTgsIDB4MDMsIDB4QUMsIDB4ODYsIDB4Q0EsIDB4MDEsCisJIDB4NkEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4NEMsIDB4MDIsIDB4MEYsIDB4NjAsIDB4NzMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEYsIDB4MDMsIDB4NzYsIDB4RjEsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsCisJIDB4MDMsIDB4MDIsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NzYsIDB4RkIsIDB4RUQsIDB4MDEsCisJIDB4NDYsIDB4NUMsIDB4M0MsIDB4MDAsIDB4MEYsIDB4NjAsIDB4NzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDEsIDB4MDMsCisJIDB4MzUsIDB4MDIsIDB4NkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDEsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDIsIDB4MEYsIDB4NjAsIDB4NkQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEIsIDB4MDMsIDB4MkEsIDB4RjAsIDB4MjAsIDB4NjcsIDB4MDksIDB4RjIsIDB4QjAsIDB4ODMsCisJIDB4MDAsIDB4QTgsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsIDB4MkEsIDB4RkMsIDB4MDEsIDB4MDAsIDB4NkIsIDB4RkIsIDB4MUYsIDB4MDAsIDB4MDAsIDB4NjQsCisJIDB4NkIsIDB4RkIsIDB4MEYsIDB4NjAsIDB4NjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MTIsIDB4MDMsIDB4MkEsIDB4RjAsCisJIDB4MDgsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDMsIDB4NzYsIDB4RjEsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4MDksIDB4RjIsIDB4MDMsIDB4MDIsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NzYsIDB4RkIsCisJIDB4RTgsIDB4MDEsIDB4MDAsIDB4NjQsIDB4NzYsIDB4RkIsIDB4QjcsIDB4NjAsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4RkIsCisJIDB4NDYsIDB4NUMsIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjMsIDB4MEQsIDB4RjIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4MDcsIDB4RjAsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NzYsIDB4RjksIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjQsIDB4NDgsIDB4RkIsCisJIDB4QkEsIDB4NjAsIDB4MDMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4MjMsIDB4RjAsCisJIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4QkYsIDB4NjAsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjMsCisJIDB4NDAsIDB4NDcsIDB4NTAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NDgsIDB4RkQsIDB4NEEsIDB4RjMsIDB4MzUsIDB4RkEsIDB4MTAsIDB4QTQsCisJIDB4NEEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MTYsIDB4RkEsIDB4MEYsIDB4RkEsIDB4MDcsIDB4RjAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDMsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTEsIDB4RjIsIDB4QkEsIDB4RkIsIDB4NjMsIDB4NDYsCisJIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4RkMsIDB4QTUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4MjcsIDB4NDUsIDB4M0MsIDB4NDYsCisJIDB4MUEsIDB4RkEsIDB4MjIsIDB4NjMsIDB4N0IsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTQsIDB4ODQsIDB4MDMsIDB4MkIsIDB4MUMsIDB4NjMsIDB4MkEsIDB4RkEsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTMsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MTQsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MTgsIDB4RkMsCisJIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsIDB4NjQsIDB4NDEsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4M0EsIDB4RjIsIDB4NjMsIDB4NDYsCisJIDB4RkYsIDB4QjQsIDB4MjIsIDB4RkEsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4OTIsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEMsIDB4QjAsCisJIDB4MDgsIDB4M0EsIDB4OEQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4OEEsIDB4MDAsIDB4MDMsIDB4RjIsIDB4MDAsIDB4RjQsIDB4QTAsIDB4RDIsCisJIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4NUEsIDB4RDAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MEEsIDB4MDIsIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4RDAsIDB4MDYsIDB4MDIsIDB4RDAsIDB4ODAsIDB4RjgsIDB4N0YsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDEsIDB4NjEsCisJIDB4NjIsIDB4NDMsIDB4NDYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MjIsIDB4MjYsIDB4NDksIDB4MDAsIDB4NjAsIDB4NDUsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4Q0QsIDB4ODEsIDB4M0MsIDB4NDYsIDB4MTgsIDB4MDIsCisJIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MTUsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDAsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4NUYsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MzEsIDB4MDAsIDB4QTMsIDB4NDYsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4M0UsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MDAsIDB4N0MsIDB4MjIsIDB4RjgsIDB4QTMsIDB4NDYsIDB4NEYsIDB4MDAsCisJIDB4QTMsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MDEsIDB4MjYsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MDEsIDB4MDAsCisJIDB4MUQsIDB4MDAsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MkIsIDB4MDAsIDB4MTcsIDB4MDAsIDB4ODcsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4M0EsIDB4RjIsIDB4NjYsIDB4NDMsIDB4RkYsIDB4QjQsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4NjAsIDB4NDcsCisJIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4NjMsIDB4NDYsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDMsIDB4MDAsIDB4MTAsIDB4MjcsCisJIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MDIsIDB4NjUsCisJIDB4QkUsIDB4NjAsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4NjMsIDB4NDIsIDB4NUEsIDB4RDAsIDB4M0MsIDB4NDYsIDB4MDksIDB4MDIsCisJIDB4NjQsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MUEsIDB4MDAsIDB4NzgsIDB4MzcsIDB4MTgsIDB4MDAsIDB4OEUsIDB4MzcsCisJIDB4MTYsIDB4MDAsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsCisJIDB4M0UsIDB4RjAsIDB4MDgsIDB4QTQsIDB4NjAsIDB4NDEsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MkIsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDQsIDB4M0YsIDB4RkEsIDB4M0MsIDB4NDYsCisJIDB4MkMsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MzIsIDB4RjIsIDB4QjQsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4NDcsIDB4MDAsCisJIDB4MDksIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4M0YsIDB4RjIsIDB4MDksIDB4MDYsIDB4MkMsIDB4NDUsIDB4QzQsIDB4ODQsIDB4RDAsIDB4ODAsCisJIDB4NDAsIDB4NEEsIDB4MzQsIDB4MDYsIDB4NjAsIDB4NDMsIDB4NjQsIDB4NDQsIDB4NTQsIDB4ODgsIDB4MTcsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MTMsIDB4NjAsCisJIDB4NEIsIDB4RjMsIDB4QkIsIDB4RjMsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NDcsIDB4RUMsIDB4QTAsIDB4MjgsIDB4MDMsIDB4MjcsIDB4MDcsIDB4MkMsIDB4NDQsCisJIDB4QzQsIDB4ODEsIDB4MDIsIDB4NjAsIDB4MUMsIDB4NjUsIDB4NDUsIDB4NEEsIDB4RDUsIDB4ODAsIDB4MkMsIDB4NDUsIDB4MUYsIDB4MDYsIDB4MjcsIDB4NDAsCisJIDB4MDQsIDB4MjcsIDB4MjUsIDB4MDAsIDB4MkEsIDB4NDMsIDB4RDcsIDB4ODUsIDB4NDUsIDB4NDgsIDB4QjUsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RDMsIDB4ODAsCisJIDB4MDEsIDB4NjUsIDB4MDEsIDB4MDcsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODQsIDB4MEYsIDB4RkEsIDB4MDAsIDB4NjMsIDB4M0YsIDB4RjIsIDB4MjgsIDB4NDUsCisJIDB4NjAsIDB4NDEsIDB4RDQsIDB4ODQsIDB4REYsIDB4ODMsIDB4RkMsIDB4MDcsIDB4MTQsIDB4RkMsIDB4MTcsIDB4RkEsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MjcsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MjgsIDB4NDMsIDB4MTYsIDB4RkMsIDB4MEQsIDB4MDAsIDB4M0YsIDB4RjIsIDB4MkMsIDB4NDUsCisJIDB4QjUsIDB4RjEsIDB4QzQsIDB4ODEsIDB4RDEsIDB4ODAsIDB4MEYsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDEsIDB4QkMsIDB4MEYsIDB4RkEsIDB4M0YsIDB4RjIsCisJIDB4MTcsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTQsIDB4RkEsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4NkYsIDB4MDAsCisJIDB4NjQsIDB4RjEsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsCisJIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjAsIDB4MTUsIDB4NjAsIDB4REUsIDB4RjMsIDB4NjMsIDB4NDYsCisJIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MjAsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDgsIDB4MDAsCisJIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDYsIDB4NjEsIDB4NkUsIDB4NjMsIDB4MDgsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MTQsIDB4NjMsIDB4MDUsIDB4MDAsCisJIDB4MDAsIDB4NjEsIDB4MEEsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjEsIDB4MzcsIDB4NjMsIDB4MDAsIDB4NjQsIDB4MjUsIDB4NjAsIDB4QTIsIDB4NjUsCisJIDB4NDUsIDB4RDEsIDB4RDUsIDB4ODEsIDB4MTUsIDB4NjAsIDB4REEsIDB4RjksIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjUsIDB4NDUsIDB4RDEsIDB4MUMsIDB4RkMsCisJIDB4QjAsIDB4ODQsIDB4MUUsIDB4RkEsIDB4M0MsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MUUsIDB4NjAsCisJIDB4MEIsIDB4NjMsIDB4MjcsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4NjEsIDB4MTYsIDB4NjAsIDB4MEYsIDB4NjMsIDB4MjEsIDB4MDAsCisJIDB4NDAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4MEMsIDB4NjEsIDB4MTIsIDB4NjAsIDB4MEEsIDB4NjMsIDB4MUIsIDB4MDAsIDB4ODAsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4MEUsIDB4NjEsIDB4MEUsIDB4NjAsIDB4MEUsIDB4NjMsIDB4MTUsIDB4MDAsIDB4MDEsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTAsIDB4NjEsIDB4MEUsIDB4NjAsCisJIDB4MDksIDB4NjMsIDB4MEYsIDB4MDAsIDB4MDIsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTIsIDB4NjEsIDB4MEEsIDB4NjAsIDB4MEQsIDB4NjMsIDB4MDksIDB4MDAsCisJIDB4MDQsIDB4MkIsIDB4MDQsIDB4MDAsIDB4MTQsIDB4NjEsIDB4MEEsIDB4NjAsIDB4MDgsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MTYsIDB4NjEsIDB4MEEsIDB4NjAsCisJIDB4MEMsIDB4NjMsIDB4MUUsIDB4RjAsIDB4NDAsIDB4NjcsIDB4MjUsIDB4NjAsIDB4QTIsIDB4NjUsIDB4NDUsIDB4RDEsIDB4RDUsIDB4ODEsIDB4MTUsIDB4NjAsCisJIDB4REEsIDB4RjksIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjUsIDB4NDUsIDB4RDEsIDB4MUMsIDB4RkMsIDB4QjAsIDB4ODQsIDB4MUUsIDB4RkEsIDB4QUEsIDB4RjIsCisJIDB4MTUsIDB4NjAsIDB4QzIsIDB4RjMsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4NDQsIDB4NDQsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4MkMsIDB4NjAsIDB4MjYsIDB4NjEsIDB4MDAsIDB4N0YsCisJIDB4NjAsIDB4NDUsIDB4NDUsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MDAsIDB4N0YsIDB4NEIsIDB4RkIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4N0UsCisJIDB4QkIsIDB4RkIsIDB4NjIsIDB4RjEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4QzAsIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjQsIDB4NDQsCisJIDB4MEEsIDB4MzYsIDB4NzAsIDB4NjQsIDB4MTQsIDB4MzYsIDB4MzgsIDB4NjQsIDB4MzcsIDB4MzYsIDB4MTUsIDB4NjQsIDB4NkUsIDB4MzYsIDB4MEIsIDB4NjQsCisJIDB4NDQsIDB4ODYsIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NDAsIDB4M0IsIDB4MDEsIDB4MDAsCisJIDB4MTIsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4NDQsIDB4MDAsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4M0YsIDB4MDAsIDB4MTcsIDB4RjIsIDB4MjIsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QTgsCisJIDB4MDEsIDB4QTgsIDB4MzYsIDB4MDMsIDB4MzUsIDB4MDMsIDB4M0MsIDB4NDYsIDB4MkEsIDB4RjAsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4NjAsIDB4NDUsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MUQsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MjcsIDB4MTgsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MEIsIDB4MDAsCisJIDB4NjUsIDB4NDQsIDB4MkEsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjQsIDB4NjEsIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsCisJIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsIDB4MTUsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MzIsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MkMsIDB4NjEsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsIDB4MEEsIDB4MDAsIDB4NjUsIDB4NDQsIDB4MkUsIDB4NjEsCisJIDB4NjAsIDB4NDAsIDB4MDMsIDB4MkIsIDB4MjgsIDB4NjEsIDB4OEYsIDB4QjAsIDB4ODgsIDB4MzYsIDB4MDIsIDB4QTEsIDB4NDEsIDB4NEMsIDB4OTgsIDB4RkEsCisJIDB4QkIsIDB4NjAsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4QUEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RjMsIDB4MjQsIDB4NDYsCisJIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDIsIDB4MDAsIDB4NjEsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTIsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MTAsIDB4MjYsIDB4MzQsIDB4MDAsIDB4MkMsIDB4NDUsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODEsIDB4NjQsIDB4NDUsIDB4MTYsIDB4QTEsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsCisJIDB4MDEsIDB4QTQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDYsIDB4QTQsIDB4MUIsIDB4RkEsIDB4QkIsIDB4RjMsCisJIDB4MjUsIDB4NjAsIDB4ODIsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEIsIDB4MzcsIDB4MDAsIDB4NjMsIDB4MEYsIDB4MzcsIDB4MDIsIDB4NjMsIDB4MEEsIDB4MzcsCisJIDB4MDQsIDB4NjMsIDB4MEUsIDB4MzcsIDB4MDYsIDB4NjMsIDB4MDksIDB4MzcsIDB4MDgsIDB4NjMsIDB4MEQsIDB4MzcsIDB4MEEsIDB4NjMsIDB4MDgsIDB4MzcsCisJIDB4MEMsIDB4NjMsIDB4MEMsIDB4MzcsIDB4MEUsIDB4NjMsIDB4MjgsIDB4QTMsIDB4NDcsIDB4RDEsIDB4RDgsIDB4QTMsIDB4RDcsIDB4ODMsIDB4MTUsIDB4NjAsCisJIDB4RDksIDB4RjksIDB4NDcsIDB4RDEsIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4MUYsIDB4RkEsIDB4NTYsIDB4MDAsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4ODAsIDB4MzYsIDB4MTcsIDB4MDAsIDB4NTAsIDB4MzYsIDB4MTUsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MzYsCisJIDB4MTEsIDB4MDAsIDB4QTAsIDB4MzYsIDB4MEYsIDB4MDAsIDB4QjAsIDB4MzYsIDB4MEQsIDB4MDAsIDB4QzAsIDB4MzYsIDB4MEIsIDB4MDAsIDB4QkIsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsIDB4MDYsIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjEsCisJIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDAsIDB4NjEsIDB4QkIsIDB4RjMsIDB4MjUsIDB4NjAsIDB4N0EsIDB4NjUsIDB4NjAsIDB4NDAsIDB4MEEsIDB4MzcsCisJIDB4MDAsIDB4NjMsIDB4MTQsIDB4MzcsIDB4MDIsIDB4NjMsIDB4MzcsIDB4MzcsIDB4MDQsIDB4NjMsIDB4NkUsIDB4MzcsIDB4MDYsIDB4NjMsIDB4MjgsIDB4QTMsCisJIDB4NDcsIDB4RDEsIDB4RDgsIDB4QTMsIDB4RDcsIDB4ODMsIDB4MTUsIDB4NjAsIDB4RDksIDB4RjksIDB4NDcsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4ODQsCisJIDB4MUYsIDB4RkEsIDB4QkIsIDB4RjEsIDB4MkMsIDB4NDUsIDB4NjQsIDB4NDMsIDB4MTcsIDB4RjIsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsCisJIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4NjMsIDB4NDQsIDB4ODAsIDB4N0UsIDB4QkIsIDB4RkIsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MkIsIDB4RjAsCisJIDB4MUIsIDB4RkEsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjcsIDB4NDcsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MkUsIDB4MDAsIDB4MTYsIDB4RjIsIDB4MEYsIDB4RjAsIDB4QUMsIDB4ODQsIDB4MkMsIDB4NDUsCisJIDB4MjksIDB4MDMsIDB4NEIsIDB4RjEsIDB4QzQsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjMsIDB4NDAsIDB4MzcsIDB4MzcsCisJIDB4RTEsIDB4ODEsIDB4NjQsIDB4NDUsIDB4MEYsIDB4RjAsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUUsIDB4ODIsCisJIDB4RkMsIDB4QTIsIDB4MEEsIDB4MDMsIDB4NjMsIDB4NDAsIDB4NkUsIDB4M0IsIDB4MDYsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDQsIDB4MEQsIDB4ODAsIDB4NjcsCisJIDB4QjAsIDB4ODQsIDB4MEYsIDB4RkEsIDB4NjEsIDB4NDQsIDB4REMsIDB4ODQsIDB4MUQsIDB4RkEsIDB4REUsIDB4NjUsIDB4QzQsIDB4ODUsIDB4MjYsIDB4NDEsCisJIDB4RTEsIDB4ODEsIDB4QzUsIDB4ODQsIDB4MkIsIDB4RkEsIDB4MUIsIDB4RjAsIDB4REUsIDB4NjQsIDB4QzAsIDB4ODUsIDB4MjYsIDB4NDQsIDB4RTAsIDB4ODQsCisJIDB4QzQsIDB4ODQsIDB4MTAsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MkMsIDB4RjAsIDB4MEEsIDB4QTQsIDB4NjYsIDB4NDUsIDB4MjQsIDB4NDYsIDB4OTIsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4OUYsIDB4RjAsIDB4NjEsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4NjUsIDB4NDAsIDB4ODAsIDB4MjcsIDB4QTAsIDB4QTQsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDAsIDB4NjQsIDB4MTEsIDB4RkEsIDB4QkIsIDB4RjMsIDB4MTMsIDB4RkEsIDB4N0MsIDB4NDQsIDB4MUQsIDB4RkEsCisJIDB4RkYsIDB4RkYsIDB4MEQsIDB4RjIsIDB4M0UsIDB4RjAsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDEsIDB4MDEsIDB4QjEsIDB4MDEsIDB4NjMsCisJIDB4MTcsIDB4MDIsIDB4NjAsIDB4NDEsIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4NjAsIDB4RjcsIDB4RkQsIDB4MTYsIDB4NjAsIDB4MkIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4MDEsIDB4NjMsIDB4NjEsIDB4NDAsCisJIDB4RkYsIDB4MjIsIDB4MDQsIDB4MDAsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4NjAsIDB4RjgsIDB4RkQsCisJIDB4QkQsIDB4NjAsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDMsIDB4MDAsCisJIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4NDYsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MjIsIDB4MjYsIDB4MDksIDB4MDAsCisJIDB4MDEsIDB4MjYsIDB4MEEsIDB4MDAsIDB4MDQsIDB4MjYsIDB4NEIsIDB4MDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4MDAsIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4NjAsIDB4RjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjcsIDB4M0QsIDB4MDAsIDB4MTAsIDB4MjcsIDB4MDMsIDB4MDAsCisJIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4M0MsIDB4RjEsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjIsIDB4MDAsIDB4N0MsCisJIDB4NDAsIDB4NDMsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MjEsIDB4MDAsIDB4QTMsIDB4NDYsIDB4NEIsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4NEEsIDB4RjIsIDB4MDgsIDB4MDQsIDB4REMsIDB4ODQsIDB4NEEsIDB4RkEsIDB4NDksIDB4RjIsCisJIDB4MDQsIDB4MDQsIDB4REMsIDB4ODQsIDB4NDksIDB4RkEsIDB4MDEsIDB4MDQsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsCisJIDB4MDAsIDB4N0MsIDB4MDEsIDB4MDIsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDcsIDB4MjAsIDB4QkYsIDB4QTMsIDB4NDYsIDB4M0EsIDB4RjgsCisJIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsIDB4MEYsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4QTMsIDB4NDYsIDB4NzYsIDB4NjEsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4QTMsIDB4NDYsCisJIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MkEsIDB4RjIsIDB4QTMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4NDgsIDB4MDAsIDB4ODcsIDB4RjMsCisJIDB4NjYsIDB4NUMsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjAsIDB4MDgsIDB4MDMsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MTIsIDB4MDAsIDB4RkYsIDB4NjAsCisJIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MjQsIDB4MDAsIDB4M0QsIDB4RjMsIDB4MDEsIDB4NjEsIDB4NjAsIDB4NDMsIDB4Q0YsIDB4ODMsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4RTksIDB4ODEsIDB4QTEsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4OTEsIDB4ODQsIDB4M0IsIDB4RkEsCisJIDB4MTcsIDB4MDAsIDB4NEIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjQsCisJIDB4REMsIDB4ODQsIDB4NEIsIDB4RkEsIDB4NEEsIDB4RjIsIDB4MTYsIDB4MDQsIDB4REMsIDB4ODQsIDB4NEEsIDB4RkEsIDB4NDksIDB4RjIsIDB4MDgsIDB4MDQsCisJIDB4REMsIDB4ODQsIDB4NDksIDB4RkEsIDB4MDUsIDB4MDQsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4M0IsIDB4RkEsCisJIDB4MEMsIDB4NjAsIDB4RkUsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzcsIDB4NjAsIDB4Q0YsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsIDB4MDYsIDB4NjAsIDB4MTcsIDB4RTEsIDB4NzcsIDB4NDAsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4NjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MDYsIDB4NjAsIDB4ODAsIDB4RkIsIDB4MEMsIDB4NjAsCisJIDB4RkUsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzgsIDB4NjAsIDB4NDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODQsIDB4RkYsIDB4MDAsIDB4N0MsIDB4MDYsIDB4NjAsIDB4ODAsIDB4RjMsIDB4QTIsIDB4RDksIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4MDAsCisJIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjQsIDB4ODcsIDB4RjMsIDB4NjYsIDB4NUMsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4N0MsIDB4MDcsIDB4MDMsIDB4NjYsIDB4NDMsIDB4M0MsIDB4NDYsIDB4MjIsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MDEsIDB4MDAsIDB4M0MsIDB4RjEsIDB4NEIsIDB4RjAsIDB4NjQsIDB4NDEsIDB4NjQsIDB4NDcsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUYsCisJIDB4MjAsIDB4QkMsIDB4ODAsIDB4MjYsIDB4ODAsIDB4QUMsIDB4NjAsIDB4NDcsIDB4QTMsIDB4NDYsIDB4M0EsIDB4RkEsIDB4NjQsIDB4NDQsIDB4MjAsIDB4N0YsCisJIDB4MzQsIDB4OTQsIDB4M0IsIDB4RkEsIDB4QTMsIDB4NDYsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjAsIDB4QTMsIDB4NDYsIDB4M0MsIDB4RkEsIDB4M0QsIDB4RjgsCisJIDB4ODAsIDB4NjAsIDB4MTAsIDB4RTAsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MEYsIDB4NjQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4QkQsIDB4NjAsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjcsIDB4MzEsIDB4MDAsIDB4MkEsIDB4RjIsIDB4MDAsIDB4NjAsIDB4N0MsIDB4NjIsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MjQsIDB4MDAsIDB4QTIsIDB4RDMsIDB4MDAsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDMsIDB4NUUsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NUYsIDB4REMsIDB4ODQsIDB4RjEsIDB4ODEsIDB4QzAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4ODAsIDB4MkEsCisJIDB4MDIsIDB4MDAsIDB4N0YsIDB4QTQsIDB4REMsIDB4ODQsIDB4RkYsIDB4M0IsIDB4MDMsIDB4MDAsIDB4NjAsIDB4NDcsIDB4REMsIDB4ODcsIDB4MDEsIDB4NjEsCisJIDB4QzAsIDB4ODAsIDB4MDAsIDB4MzYsIDB4REMsIDB4ODQsIDB4NEUsIDB4REIsIDB4NjAsIDB4RkUsIDB4NUEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QzEsIDB4ODQsCisJIDB4RjAsIDB4MjIsIDB4MTAsIDB4QTQsIDB4RjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4M0UsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsIDB4NUEsIDB4RDEsIDB4M0EsIDB4RkEsIDB4M0IsIDB4RjgsIDB4NzQsIDB4NjIsIDB4QTIsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDEsIDB4NUEsIDB4RDEsCisJIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsCisJIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUEsIDB4MDgsIDB4NjAsIDB4MDAsIDB4RUEsIDB4NjUsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUEsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUEsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUEsIDB4MDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4QkEsIDB4NjAsCisJIDB4RjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4NjAsIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4RkMsIDB4RkIsIDB4MDcsIDB4RjAsCisJIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4ODcsIDB4RjMsIDB4MEUsIDB4MDMsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NDcsIDB4RjEsCisJIDB4MDcsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MTIsIDB4QkUsIDB4NjAsIDB4NDYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkMsIDB4MEEsIDB4QkUsIDB4NjAsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjAsIDB4ODcsIDB4RjMsIDB4MTAsIDB4RjAsCisJIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4M0QsIDB4MDMsIDB4NjYsIDB4NDMsIDB4NjUsIDB4NDYsIDB4RkYsIDB4NjcsIDB4MjAsIDB4ODUsIDB4NjQsIDB4NUYsCisJIDB4NDAsIDB4NDQsIDB4MTUsIDB4RjAsIDB4MjUsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTUsIDB4RkEsIDB4NDAsIDB4NDUsCisJIDB4MTQsIDB4RjAsIDB4MjQsIDB4NDQsIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTQsIDB4RkEsIDB4NjAsIDB4NUMsIDB4MkYsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsCisJIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsIDB4MjUsIDB4NUMsIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsIDB4NjQsIDB4NDEsCisJIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsIDB4MEUsIDB4RkEsIDB4NjMsIDB4NDYsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4MTcsIDB4RjIsIDB4NjMsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MkUsIDB4MDAsCisJIDB4MDEsIDB4MzYsIDB4MUUsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MjUsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MTAsIDB4RjIsIDB4MTEsIDB4RkEsIDB4MTIsIDB4RjIsCisJIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4MTIsIDB4RkEsIDB4OTcsIDB4RkEsIDB4NDYsIDB4NDQsIDB4NjMsIDB4NDYsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDQsIDB4MDAsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4OTYsIDB4RkMsIDB4NjMsIDB4NDYsIDB4NDMsIDB4MDAsCisJIDB4NjQsIDB4NDYsIDB4MTYsIDB4RjIsIDB4MDAsIDB4NjEsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTQsIDB4OTcsIDB4RkEsIDB4MTYsIDB4RkEsIDB4NjMsIDB4NDYsCisJIDB4M0EsIDB4MDAsIDB4NjQsIDB4NDYsIDB4MDAsIDB4NjEsIDB4OTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MzUsIDB4MDAsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsCisJIDB4NjQsIDB4NDYsIDB4MTYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTQsIDB4MTYsIDB4RkEsIDB4OTMsIDB4RjQsIDB4MTIsIDB4RjIsCisJIDB4MjAsIDB4MjgsIDB4RkYsIDB4QTMsIDB4MTMsIDB4RkMsIDB4NjEsIDB4NDYsIDB4NjMsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MjQsIDB4MDAsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDAsIDB4RkYsIDB4MzYsIDB4MUQsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MTIsIDB4RjIsIDB4OTMsIDB4RjQsIDB4NjEsIDB4NDYsIDB4MjAsIDB4MjgsIDB4MTYsIDB4MDAsIDB4NDQsIDB4NDQsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NUMsIDB4NjUsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDYsIDB4MDAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsCisJIDB4MDEsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MDcsIDB4MDAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4QkUsIDB4NjAsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsCisJIDB4NjQsIDB4NDYsIDB4MTcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjcsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MzYsIDB4MDcsIDB4MDAsCisJIDB4MDEsIDB4MzYsIDB4MUMsIDB4MDAsIDB4MDIsIDB4MzYsIDB4MjQsIDB4MDAsIDB4MDMsIDB4MzYsIDB4NDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4RjksIDB4RjEsIDB4MTYsIDB4RjIsIDB4NDMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4NjAsIDB4MjQsIDB4NjEsIDB4MDksIDB4MDMsIDB4QTEsIDB4RDEsCisJIDB4MkMsIDB4NjAsIDB4MjIsIDB4NjMsIDB4QzAsIDB4ODQsIDB4MTYsIDB4RkEsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4MTMsIDB4RkEsIDB4MzksIDB4MDAsCisJIDB4OTYsIDB4RkMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsIDB4NDQsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4MTEsIDB4RjMsIDB4OTYsIDB4RkMsIDB4MTMsIDB4RkEsIDB4MjksIDB4MDAsCisJIDB4NjMsIDB4NDYsIDB4MkIsIDB4NjAsIDB4RjQsIDB4NjMsIDB4QTMsIDB4RDMsIDB4MTUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MDcsIDB4RjAsCisJIDB4MEMsIDB4MDMsIDB4NjYsIDB4NDEsIDB4NDQsIDB4NDQsIDB4NjQsIDB4NDYsIDB4MTIsIDB4RjIsIDB4NjEsIDB4NDYsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MTksIDB4MDAsIDB4NjYsIDB4NDMsIDB4MjQsIDB4NDYsIDB4QzEsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsIDB4OTAsIDB4RkEsIDB4NjAsIDB4NUYsIDB4MTIsIDB4RkEsCisJIDB4MDQsIDB4MDAsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4MDAsIDB4MjQsIDB4NDMsIDB4MDIsIDB4NjQsIDB4MTcsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4Q0EsIDB4RkUsIDB4NDcsIDB4RjEsIDB4MDEsIDB4NjUsIDB4MzIsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDgsIDB4MDAsIDB4MkMsIDB4RjIsIDB4NjQsIDB4NDUsCisJIDB4MDIsIDB4MjIsIDB4MDQsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDEsIDB4MDAsIDB4N0IsIDB4MDAsIDB4MTQsIDB4RjIsIDB4NjUsIDB4NDAsCisJIDB4MDEsIDB4MjYsIDB4MEMsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4NjQsIDB4M0IsIDB4REIsIDB4NjUsIDB4NDQsIDB4Q0MsIDB4ODUsIDB4MjUsIDB4NjAsCisJIDB4RDYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4NTAsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MkEsIDB4RjAsCisJIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDEsIDB4MDAsIDB4NDYsIDB4MDAsCisJIDB4NjEsIDB4NDUsIDB4NjAsIDB4NDMsIDB4MjUsIDB4NjAsIDB4RDYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4NjMsIDB4NDAsIDB4MDgsIDB4MzYsIDB4MDEsIDB4MDAsIDB4M0EsIDB4MDAsIDB4MTQsIDB4RjIsIDB4MUMsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjMsCisJIDB4Q0QsIDB4ODEsIDB4QzcsIDB4ODMsIDB4RkQsIDB4MDIsIDB4M0YsIDB4RjAsIDB4MkMsIDB4RjIsIDB4QzMsIDB4ODMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsCisJIDB4MEQsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjUsIDB4NjAsCisJIDB4REEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDIsIDB4NzgsIDB4NjMsIDB4NDUsIDB4MjAsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RDIsIDB4NjQsCisJIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjUsIDB4NjAsIDB4RDgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RDIsIDB4NzgsIDB4NjMsIDB4NDUsIDB4MTUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsIDB4MDAsIDB4QTgsIDB4MDEsIDB4QTgsIDB4MEUsIDB4MDMsCisJIDB4MDcsIDB4MDMsIDB4MjUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDYsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4REUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDQsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4NUYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OEQsIDB4RkIsIDB4M0MsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NUMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4Q0UsIDB4RkUsIDB4QjcsIDB4NjAsIDB4RTIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MkUsIDB4RjMsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4MDIsIDB4QTgsIDB4M0MsIDB4NDYsIDB4MTAsIDB4MDMsCisJIDB4MTAsIDB4QjAsIDB4MkEsIDB4RjIsIDB4MEQsIDB4MDMsIDB4MEUsIDB4RjIsIDB4MEMsIDB4QjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MjAsIDB4QkMsCisJIDB4MDIsIDB4MDMsIDB4RkUsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MjMsIDB4RjAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4Q0UsIDB4MDEsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NTAsIDB4QTgsIDB4MDIsIDB4N0MsIDB4MTAsIDB4MDMsIDB4MEYsIDB4RjAsIDB4MTUsIDB4RjIsIDB4NjQsIDB4NDEsCisJIDB4MDEsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QUYsIDB4RjEsIDB4MDksIDB4MDAsIDB4MDMsIDB4NjUsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsCisJIDB4MDYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4QUUsIDB4RjEsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4NjQsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsCisJIDB4MTUsIDB4RkEsIDB4MzgsIDB4MDcsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MDcsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDQsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MkEsIDB4RjAsIDB4MDgsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MDgsIDB4RjAsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDcsIDB4RjIsIDB4NDYsIDB4NDMsIDB4ODcsIDB4RjEsIDB4MDYsIDB4MDMsCisJIDB4NjAsIDB4NDYsIDB4ODYsIDB4RjQsIDB4RDAsIDB4ODAsIDB4ODAsIDB4QkIsIDB4MDEsIDB4MDMsIDB4MDYsIDB4RkMsIDB4MjMsIDB4NDYsIDB4M0UsIDB4RjIsCisJIDB4MDAsIDB4NjMsIDB4MDEsIDB4QjAsIDB4NDMsIDB4NUMsIDB4RkMsIDB4RkMsIDB4MEEsIDB4MDMsIDB4MUUsIDB4NjAsIDB4RUMsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QjcsIDB4NjAsCisJIDB4RTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MjUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjUsIDB4NjAsIDB4RTIsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4MjcsIDB4NDQsIDB4RjcsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MjMsIDB4RjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RjAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjIsIDB4N0YsIDB4NjUsIDB4QTQsIDB4OUUsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4NUUsIDB4MDEsCisJIDB4QzAsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4MDEsIDB4NjMsIDB4QzQsIDB4QjQsCisJIDB4MzEsIDB4RkIsIDB4MzIsIDB4RkQsIDB4QkYsIDB4NjAsIDB4RUIsIDB4NjIsIDB4NDIsIDB4NDAsIDB4QTAsIDB4NEMsIDB4NDAsIDB4QkMsIDB4N0QsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QTAsIDB4RkUsIDB4MUEsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjQsIDB4MDgsIDB4RjAsIDB4MDcsIDB4RjAsIDB4RDAsIDB4ODAsCisJIDB4MUUsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MTMsIDB4MDIsIDB4QTIsIDB4RDMsIDB4MDEsIDB4NjMsIDB4QUMsIDB4ODYsIDB4MDcsIDB4RjIsIDB4MEUsIDB4MDMsCisJIDB4RDAsIDB4ODAsIDB4MDksIDB4RjIsIDB4RkEsIDB4MDIsIDB4MjMsIDB4RkMsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OEQsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4M0MsIDB4NDYsIDB4MDYsIDB4NjQsCisJIDB4QTEsIDB4RkYsIDB4NDksIDB4RkIsIDB4ODMsIDB4M0UsIDB4MzEsIDB4RjMsIDB4ODcsIDB4NjAsIDB4ODAsIDB4NjEsIDB4MUQsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MEYsIDB4MDAsIDB4RkUsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4NjQsIDB4NDksIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDcsIDB4RkIsCisJIDB4MDAsIDB4NzEsIDB4MDUsIDB4NjQsIDB4NjQsIDB4NUYsIDB4MEQsIDB4RkEsIDB4NDAsIDB4NjQsIDB4M0IsIDB4REIsIDB4QzAsIDB4NjAsIDB4MzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MkEsIDB4MTcsIDB4MDAsIDB4RDEsIDB4OTEsIDB4OEQsIDB4RTIsIDB4NDEsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsCisJIDB4MkMsIDB4NjAsIDB4NUUsIDB4NjMsIDB4RkQsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QTMsIDB4RDMsIDB4MDIsIDB4NjMsIDB4NjAsIDB4NUMsIDB4MEQsIDB4RjIsCisJIDB4NDcsIDB4RkQsIDB4RkYsIDB4QjUsIDB4NjAsIDB4NDcsIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MUYsIDB4MDMsIDB4NjAsIDB4NDcsIDB4QjQsIDB4ODQsCisJIDB4MEQsIDB4RkEsIDB4MUIsIDB4MDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NDIsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RjcsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MTIsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDksIDB4MDAsIDB4NDMsIDB4NjQsIDB4M0IsIDB4REIsIDB4MzEsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RUYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4QkYsIDB4NjAsIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDQsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4MzEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REYsIDB4QjQsIDB4MzEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MkEsIDB4NjQsIDB4M0IsIDB4REIsIDB4QjcsIDB4NjAsCisJIDB4QTIsIDB4NjQsIDB4NDAsIDB4NDAsIDB4QkQsIDB4NjAsIDB4N0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjAsIDB4ODAsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4QjUsIDB4MDQsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDMsIDB4QzAsIDB4NjAsIDB4QjgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjAsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MjgsIDB4MDAsIDB4OUQsIDB4RkUsIDB4MjYsIDB4MDQsCisJIDB4MjUsIDB4MEEsIDB4OUYsIDB4RkUsIDB4MjMsIDB4MDUsIDB4ODUsIDB4RkYsIDB4MjAsIDB4NDQsIDB4ODQsIDB4RkYsIDB4NDAsIDB4MjYsIDB4MUUsIDB4MDAsCisJIDB4M0YsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUIsIDB4MDAsIDB4MzgsIDB4NjksIDB4RkYsIDB4RkYsIDB4NjgsIDB4NDQsIDB4MDEsIDB4MTYsIDB4RkQsIDB4MDEsCisJIDB4MDEsIDB4MkEsIDB4MTQsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDksIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsCisJIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4MDIsIDB4NjAsIDB4RUUsIDB4NjQsIDB4ODEsIDB4RkIsIDB4RkYsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4ODIsIDB4RkIsIDB4MDQsIDB4NjQsIDB4ODMsIDB4RkIsIDB4REYsIDB4RkUsIDB4MTksIDB4RkYsIDB4MTAsIDB4NjQsIDB4M0IsIDB4REIsCisJIDB4NjUsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4NzQsIDB4RjEsIDB4QzksIDB4RkUsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4M0IsIDB4MDAsIDB4NDksIDB4RjMsIDB4M0MsIDB4NDYsIDB4MzEsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDksIDB4RkIsCisJIDB4MkUsIDB4MDIsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4RkMsIDB4RkMsIDB4MDAsIDB4NjQsIDB4NUMsIDB4NUMsIDB4MzIsIDB4RkIsCisJIDB4ODIsIDB4RkYsIDB4NUMsIDB4NDcsIDB4ODQsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MTMsIDB4NjAsIDB4MDEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsCisJIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4MkEsIDB4RjIsIDB4MDcsIDB4RjAsIDB4MEMsIDB4QjQsIDB4MDgsIDB4M0EsIDB4MDcsIDB4MDAsCisJIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4MDYsIDB4RjAsIDB4RkYsIDB4NjAsIDB4REYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MjMsIDB4RjAsCisJIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OEQsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0UsIDB4RkUsIDB4MDYsIDB4MDAsCisJIDB4NjUsIDB4RjMsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4OTMsIDB4MTQsIDB4NjAsIDB4RkMsIDB4NjMsCisJIDB4QTMsIDB4RDMsIDB4QUQsIDB4NDksIDB4MjAsIDB4QjUsIDB4MDgsIDB4QjEsIDB4MjIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4MTAsIDB4QjUsIDB4OTUsIDB4ODEsCisJIDB4NjAsIDB4NDEsIDB4MTgsIDB4MDIsIDB4MTQsIDB4NjAsIDB4RkUsIDB4N0MsIDB4QTQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTQsIDB4REIsCisJIDB4MTYsIDB4MDIsIDB4MEEsIDB4NjQsIDB4QTQsIDB4REIsIDB4NjEsIDB4NDQsIDB4MDcsIDB4QjQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDIsIDB4MDgsIDB4QjEsCisJIDB4RTEsIDB4ODEsIDB4OTUsIDB4ODEsIDB4QTMsIDB4RDMsIDB4MEIsIDB4MDMsIDB4MDgsIDB4QUMsIDB4MDEsIDB4QkMsIDB4QTMsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MTMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MTAsIDB4QUMsIDB4QTMsIDB4REIsIDB4MEEsIDB4N0MsIDB4MEEsIDB4NjAsIDB4N0YsIDB4RjksIDB4QjcsIDB4NjAsCisJIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4RjMsIDB4NDUsIDB4RjEsIDB4MDQsIDB4MUIsIDB4NjQsIDB4NDQsIDB4MDIsIDB4MUIsIDB4MDcsIDB4NjAsCisJIDB4RjcsIDB4RjMsIDB4NDUsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NDYsIDB4RkQsIDB4NjAsIDB4NDEsIDB4MjUsIDB4NjQsIDB4M0IsIDB4REIsIDB4MjcsIDB4NDQsCisJIDB4RUYsIDB4QjQsIDB4NDAsIDB4NDcsIDB4MDAsIDB4QjksIDB4NzEsIDB4NDAsIDB4ODAsIDB4MjcsIDB4MDEsIDB4MTIsIDB4MTksIDB4MDMsIDB4QzEsIDB4NjAsCisJIDB4MEMsIDB4NjIsIDB4ODQsIDB4RkYsIDB4NDIsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4MUYsIDB4MEEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MTksIDB4MEEsIDB4NzEsIDB4NDAsCisJIDB4ODAsIDB4MjcsIDB4RjcsIDB4MTIsIDB4NDUsIDB4RjMsIDB4MjcsIDB4MDIsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4NDUsIDB4RkIsIDB4RjEsIDB4MDIsCisJIDB4MDYsIDB4MEEsIDB4QTAsIDB4NEMsIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTQsIDB4NjAsIDB4RDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkYsCisJIDB4QzAsIDB4NjAsIDB4RUEsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsCisJIDB4QUYsIDB4NjAsIDB4N0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0MsIDB4NDQsIDB4QUMsIDB4ODAsIDB4MzIsIDB4RjEsIDB4MTIsIDB4MDMsIDB4NjQsIDB4NDAsCisJIDB4MDcsIDB4MjIsIDB4MEYsIDB4MDAsIDB4QTQsIDB4NjAsIDB4QjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MUMsIDB4QkMsIDB4REYsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4RjEsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MjgsIDB4NjQsIDB4M0EsIDB4REIsIDB4QTAsIDB4NEMsIDB4MzAsIDB4QkMsIDB4RjMsIDB4QjQsCisJIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODEsIDB4M0UsIDB4MjgsIDB4NjQsIDB4M0IsIDB4REIsIDB4MDcsIDB4NjAsIDB4RjgsIDB4RjMsCisJIDB4MzIsIDB4NDAsIDB4MDIsIDB4MjcsIDB4MTYsIDB4MDAsIDB4NDYsIDB4RkIsIDB4MTQsIDB4MTgsIDB4QzEsIDB4NjAsIDB4NTksIDB4NjQsIDB4ODQsIDB4RkYsCisJIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MTUsIDB4QkMsIDB4RjcsIDB4QjQsIDB4QTAsIDB4NTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODEsIDB4M0UsIDB4NzAsIDB4NDQsIDB4QUMsIDB4ODAsIDB4NDYsIDB4RjMsIDB4Q0IsIDB4MEEsIDB4REQsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4NDYsIDB4RkIsCisJIDB4RjUsIDB4MDIsIDB4ODQsIDB4RkYsIDB4QzEsIDB4NjAsIDB4NkIsIDB4NjQsIDB4NDAsIDB4NDIsIDB4ODIsIDB4RkYsIDB4MjcsIDB4NDQsIDB4MDgsIDB4QkMsCisJIDB4NDAsIDB4NDcsIDB4RjksIDB4RTEsIDB4MDQsIDB4MDAsIDB4NzgsIDB4RTEsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MjYsIDB4RjksIDB4RTEsIDB4QTQsIDB4NjAsCisJIDB4QUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RkIsIDB4RjEsIDB4NjAsIDB4NDUsIDB4MkMsIDB4NjAsIDB4MEEsIDB4NjEsIDB4QzUsIDB4ODMsCisJIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4NjYsIDB4NDUsIDB4MjQsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDUsCisJIDB4RDUsIDB4ODEsIDB4NjEsIDB4NDUsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MDgsIDB4MDQsIDB4RTMsIDB4ODMsIDB4NjMsIDB4NDUsCisJIDB4QzUsIDB4ODEsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MDIsIDB4NjUsIDB4MDMsIDB4MDcsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjUsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4NjUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDMsIDB4NjQsIDB4NDYsIDB4OEYsIDB4RjAsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MTIsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsCisJIDB4NDAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MTAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEUsIDB4NjQsCisJIDB4MEUsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MDgsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MTAsIDB4NjQsIDB4MDksIDB4MDIsIDB4RTksIDB4MDEsIDB4RTEsIDB4ODEsCisJIDB4QTUsIDB4ODAsIDB4MDMsIDB4MDUsIDB4QzgsIDB4ODQsIDB4MDMsIDB4MDIsIDB4RTMsIDB4MDEsIDB4RkYsIDB4NjEsIDB4MDIsIDB4MDAsIDB4MTIsIDB4RkEsCisJIDB4OTEsIDB4RkEsIDB4NjMsIDB4NDYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4OEYsIDB4RjAsIDB4MTIsIDB4RjIsIDB4OTEsIDB4RjIsIDB4NjAsIDB4NDAsCisJIDB4MEEsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MEUsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MTAsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsIDB4MDgsIDB4NjEsCisJIDB4QTUsIDB4ODAsIDB4MTAsIDB4N0UsIDB4MTEsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MDQsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MTIsIDB4N0UsIDB4MEMsIDB4MDIsCisJIDB4RUUsIDB4MDEsIDB4MjAsIDB4NjEsIDB4QTUsIDB4ODAsIDB4MEMsIDB4N0UsIDB4MDcsIDB4MDIsIDB4RTksIDB4MDEsIDB4RTksIDB4ODEsIDB4QTUsIDB4ODAsCisJIDB4MDUsIDB4MDUsIDB4RDgsIDB4ODQsIDB4MDEsIDB4MDIsIDB4RTMsIDB4MDEsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4RTIsIDB4MkQsIDB4RjMsIDB4MkMsIDB4RjMsIDB4MDAsIDB4QkQsIDB4Q0MsIDB4ODQsIDB4MDgsIDB4MDMsIDB4MkMsIDB4RkIsIDB4MDYsIDB4MDIsCisJIDB4NjUsIDB4NDQsIDB4MkMsIDB4RkIsIDB4OEEsIDB4RkYsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4NDQsIDB4RkIsIDB4MjgsIDB4NjAsIDB4NzIsIDB4NjUsIDB4MjgsIDB4NjAsIDB4NzAsIDB4NjEsIDB4QTUsIDB4RDMsIDB4QTEsIDB4RDMsCisJIDB4MTEsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4REIsIDB4MEUsIDB4MDIsIDB4QTUsIDB4RDMsIDB4QTEsIDB4REIsIDB4MTQsIDB4NjAsIDB4M0IsIDB4RjMsCisJIDB4MTQsIDB4NjAsIDB4M0EsIDB4RjEsIDB4QTIsIDB4REIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4OEEsIDB4RkYsIDB4MjAsIDB4NjAsCisJIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4RDIsIDB4RjMsIDB4MzEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4M0QsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDQsIDB4QjAsCisJIDB4MDIsIDB4QjAsIDB4MDgsIDB4MjQsIDB4MTYsIDB4MDIsIDB4MTAsIDB4QjAsIDB4MjksIDB4NDQsIDB4MzQsIDB4MDIsIDB4MDAsIDB4QTgsIDB4Q0MsIDB4ODEsCisJIDB4MEQsIDB4MDMsIDB4NDEsIDB4NDksIDB4MkYsIDB4MDIsIDB4NjMsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDgsIDB4MDAsIDB4RjcsIDB4QjMsIDB4MTgsIDB4NjAsCisJIDB4MEEsIDB4RjEsIDB4QUQsIDB4NEYsIDB4RkQsIDB4QjQsIDB4QTAsIDB4NUQsIDB4NDQsIDB4NDksIDB4MjQsIDB4MDAsIDB4NjMsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MTAsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MEIsIDB4RjMsIDB4MTgsIDB4NjAsIDB4MDksIDB4RkIsIDB4NDAsIDB4NDksIDB4MTgsIDB4NjAsIDB4MEMsIDB4RjMsCisJIDB4MTgsIDB4NjAsIDB4MEEsIDB4RkIsIDB4MEMsIDB4QkIsIDB4RkQsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsCisJIDB4MTEsIDB4MDAsIDB4MTgsIDB4NjAsIDB4MEQsIDB4RjMsIDB4MzAsIDB4NjAsIDB4MTIsIDB4N0MsIDB4MEMsIDB4MTgsIDB4QTQsIDB4REIsIDB4NDAsIDB4NDksCisJIDB4MTgsIDB4NjAsIDB4MEUsIDB4RjMsIDB4MTgsIDB4NjAsIDB4MEEsIDB4RkIsIDB4MDgsIDB4QkIsIDB4RkIsIDB4QjMsIDB4QUQsIDB4NEYsIDB4MDIsIDB4QkMsCisJIDB4MDAsIDB4N0YsIDB4QTAsIDB4NUQsIDB4RDIsIDB4RkQsIDB4MDAsIDB4NjAsIDB4ODUsIDB4RjMsIDB4NjIsIDB4NDMsIDB4MTcsIDB4MTgsIDB4NTgsIDB4RDMsCisJIDB4NjIsIDB4NDEsIDB4MDMsIDB4MTgsIDB4Q0MsIDB4ODQsIDB4QTEsIDB4REIsIDB4MTEsIDB4MDAsIDB4NDksIDB4RDMsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTEsCisJIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4NjAsIDB4NDUsIDB4QTUsIDB4RDMsIDB4NTksIDB4RDEsIDB4QjAsIDB4ODQsIDB4QTUsIDB4REIsIDB4NjQsIDB4NDQsCisJIDB4MDYsIDB4MzYsIDB4Q0QsIDB4RkUsIDB4MDcsIDB4MzYsIDB4RDYsIDB4RkUsIDB4RTYsIDB4MDEsIDB4MjMsIDB4NDYsIDB4QjcsIDB4NjAsIDB4QUUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDMsIDB4MUYsIDB4NjAsIDB4NDQsIDB4NjEsIDB4QTEsIDB4RDMsIDB4NTksIDB4RDEsIDB4MDYsIDB4MUIsIDB4NTksIDB4RDMsCisJIDB4NTksIDB4RDEsIDB4MDMsIDB4MUIsIDB4NTksIDB4RDMsIDB4NTksIDB4RDEsIDB4RjAsIDB4MTgsIDB4MDAsIDB4NjMsIDB4NDksIDB4REQsIDB4NjAsIDB4NDAsCisJIDB4MDIsIDB4MzYsIDB4MTEsIDB4MDAsIDB4MDMsIDB4MzYsIDB4MzIsIDB4MDAsIDB4MDEsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MDUsIDB4M0EsIDB4RUEsIDB4MDEsCisJIDB4QTQsIDB4RDMsIDB4NUEsIDB4RDMsIDB4OUMsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTQsIDB4MDEsIDB4MDEsIDB4NjAsIDB4MEEsIDB4NjEsCisJIDB4MDAsIDB4NjQsIDB4QTEsIDB4REIsIDB4REYsIDB4MDEsIDB4QzIsIDB4NjAsIDB4OEYsIDB4NjQsIDB4NDAsIDB4NDUsIDB4MjIsIDB4MDAsIDB4MDEsIDB4NjAsCisJIDB4MEEsIDB4NjYsIDB4QTYsIDB4RDMsIDB4MDQsIDB4QTEsIDB4NjAsIDB4NDMsIDB4QTEsIDB4RDMsIDB4QzksIDB4ODEsIDB4NjAsIDB4NDUsIDB4MDAsIDB4QkIsCisJIDB4QTEsIDB4REIsIDB4QkUsIDB4RDMsIDB4MDksIDB4MDMsIDB4RDQsIDB4ODQsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MEUsCisJIDB4QTMsIDB4RDEsIDB4NjMsIDB4NDYsIDB4NjQsIDB4NDMsIDB4RjIsIDB4MDEsIDB4OUMsIDB4ODQsIDB4REMsIDB4ODUsIDB4NDksIDB4REQsIDB4NjEsIDB4NDQsCisJIDB4MDAsIDB4QkIsIDB4QTYsIDB4REIsIDB4MDIsIDB4MDMsIDB4NjUsIDB4NDQsIDB4QkUsIDB4REIsIDB4QkMsIDB4MDEsIDB4QzIsIDB4NjAsIDB4NkEsIDB4NjQsCisJIDB4NDAsIDB4NDUsIDB4MDEsIDB4NjAsIDB4MEEsIDB4NjYsIDB4QTYsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MEYsIDB4MTgsIDB4MDIsIDB4MDMsCisJIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4NTgsIDB4RDMsIDB4QTQsIDB4RDMsIDB4NjAsIDB4NDUsIDB4MDAsIDB4NjMsIDB4QTQsIDB4REQsIDB4MDUsIDB4MTgsCisJIDB4NTgsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODMsIDB4QTIsIDB4REQsIDB4Q0EsIDB4ODQsIDB4QTYsIDB4REIsIDB4MjUsIDB4NTgsIDB4NjQsIDB4NDEsCisJIDB4MDQsIDB4NjAsIDB4NDAsIDB4NjIsIDB4MUEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NTAsIDB4MDAsIDB4MjgsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NEQsIDB4MDAsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MTUsIDB4NjAsIDB4RDUsIDB4RkIsIDB4NjQsIDB4RjEsIDB4MjQsIDB4NjAsIDB4ODgsIDB4NjMsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MjcsIDB4M0MsIDB4QTMsIDB4MjksIDB4NDAsIDB4NDAsIDB4MkIsIDB4MUUsIDB4QTMsIDB4QkQsIDB4RDEsIDB4NjMsIDB4NDUsIDB4NDQsIDB4NEUsCisJIDB4MEUsIDB4NjEsIDB4QkQsIDB4RDEsIDB4Q0QsIDB4ODEsIDB4RDAsIDB4ODAsIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDQsIDB4Q0IsIDB4ODMsIDB4MTUsIDB4NjAsCisJIDB4RDgsIDB4RjMsIDB4MzksIDB4RjEsIDB4RDcsIDB4ODMsIDB4RUIsIDB4ODMsIDB4MkUsIDB4NDEsIDB4NUQsIDB4OTMsIDB4REYsIDB4ODMsIDB4MTUsIDB4NjAsCisJIDB4RDQsIDB4RkQsIDB4MTUsIDB4NjAsIDB4RDMsIDB4RkIsIDB4NTMsIDB4OTMsIDB4REYsIDB4ODAsIDB4MTAsIDB4MDMsIDB4MzgsIDB4RjMsIDB4Q0YsIDB4ODMsCisJIDB4MDgsIDB4MDMsIDB4REYsIDB4ODMsIDB4MEIsIDB4MDIsIDB4REYsIDB4ODMsIDB4REMsIDB4ODQsIDB4RjAsIDB4QTAsIDB4MzgsIDB4RkIsIDB4MDYsIDB4MDMsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4MzgsIDB4RkIsIDB4MDIsIDB4MDMsIDB4MDAsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MzgsIDB4RkIsCisJIDB4RTMsIDB4ODAsIDB4RkIsIDB4ODMsIDB4QzMsIDB4ODMsIDB4NjMsIDB4NDQsIDB4RkMsIDB4QTAsIDB4MDIsIDB4MEUsIDB4MDgsIDB4MDcsIDB4MDgsIDB4MDAsCisJIDB4MDQsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MEQsIDB4RkMsIDB4NjQsIDB4RkYsIDB4N0YsIDB4NjAsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDQsIDB4NjMsCisJIDB4MzksIDB4RkQsIDB4MTUsIDB4NjAsIDB4RDcsIDB4RkQsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RjMsIDB4NDAsIDB4NEUsCisJIDB4NjAsIDB4NDYsIDB4MkYsIDB4REIsIDB4NDQsIDB4NDQsIDB4QTEsIDB4RDMsIDB4RDksIDB4ODEsIDB4NDgsIDB4OTQsIDB4MjQsIDB4NUMsIDB4RDAsIDB4OUMsCisJIDB4NjYsIDB4NDIsIDB4MDQsIDB4MDYsIDB4RDIsIDB4OUMsIDB4MkYsIDB4RDksIDB4NjQsIDB4NDYsIDB4MjQsIDB4NDQsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4QTMsIDB4REIsIDB4RkYsIDB4QjQsIDB4NjAsIDB4NUMsIDB4NjYsIDB4NDQsIDB4MjIsIDB4QTQsIDB4RDAsIDB4ODQsIDB4RTAsIDB4QTAsIDB4MDIsIDB4MEQsCisJIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDQsIDB4MUYsIDB4NjQsIDB4QTIsIDB4RDMsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NUUsIDB4NjAsIDB4NDcsCisJIDB4MkYsIDB4RDEsIDB4MjgsIDB4QTMsIDB4QTMsIDB4RDksIDB4RDgsIDB4QTMsIDB4MkUsIDB4NDIsIDB4NEUsIDB4OEUsIDB4QkQsIDB4REIsIDB4REIsIDB4MDIsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4RkYsIDB4MzksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODQsIDB4M0UsIDB4RkIsIDB4MDEsCisJIDB4M0QsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4NDAsIDB4RkYsIDB4NDQsIDB4RkYsIDB4RjQsIDB4MDEsIDB4QTAsIDB4NEMsCisJIDB4M0QsIDB4NDYsIDB4MkEsIDB4RjIsIDB4NDYsIDB4NEQsIDB4MTAsIDB4MjUsIDB4MTIsIDB4MDAsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4MkQsIDB4NDYsCisJIDB4MEYsIDB4RjIsIDB4MDEsIDB4MjksIDB4MDYsIDB4MDAsIDB4MkEsIDB4RjAsIDB4NDAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDgsIDB4QkMsCisJIDB4MDIsIDB4QkMsIDB4MEYsIDB4RkEsIDB4MDgsIDB4MjUsIDB4REUsIDB4MDEsIDB4Q0IsIDB4RkUsIDB4NUMsIDB4NUQsIDB4REMsIDB4MDEsIDB4NDQsIDB4RkYsCisJIDB4MDMsIDB4MkIsIDB4MjEsIDB4MDAsIDB4ODgsIDB4RjMsIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDUsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MEYsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDksIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTMsIDB4RTcsIDB4MDIsIDB4ODcsIDB4RjEsCisJIDB4MDgsIDB4RkUsIDB4NjQsIDB4NDMsIDB4MjYsIDB4MDMsIDB4MzEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsCisJIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MDcsIDB4RkMsIDB4M0YsIDB4RjIsIDB4MDksIDB4NjAsIDB4QjAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4MkEsIDB4RjIsIDB4OUQsIDB4MDUsCisJIDB4MDgsIDB4MjUsIDB4ODgsIDB4MDEsIDB4NUMsIDB4NEIsIDB4MEMsIDB4NjAsIDB4RUMsIDB4NjEsIDB4QTEsIDB4REYsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsCisJIDB4ODcsIDB4RjEsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsIDB4QjcsIDB4MDAsIDB4RDMsIDB4ODAsIDB4MkMsIDB4RjAsIDB4OEQsIDB4MDMsCisJIDB4MDcsIDB4RjQsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4ODcsIDB4RjUsIDB4QkEsIDB4RjQsIDB4MkQsIDB4NDYsIDB4MDQsIDB4NjQsIDB4MDQsIDB4QjMsCisJIDB4MjIsIDB4RjAsIDB4MDQsIDB4MDMsIDB4QzUsIDB4NjAsIDB4QkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4MDAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4OUMsCisJIDB4M0IsIDB4RjIsIDB4MjIsIDB4RjgsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsCisJIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTcsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsCisJIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsIDB4RTAsIDB4ODEsIDB4M0IsIDB4RjAsCisJIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsIDB4N0MsIDB4NDQsIDB4MDAsIDB4NjAsCisJIDB4QjIsIDB4NjMsIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjQsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MDYsIDB4MDAsCisJIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4MDAsIDB4NjAsIDB4QTIsIDB4NjMsIDB4NDMsIDB4NEMsIDB4MDgsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QzUsIDB4NjAsCisJIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4QzUsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkIsIDB4Q0YsIDB4RjksCisJIDB4RDAsIDB4RkQsIDB4QUQsIDB4NDYsIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsCisJIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsIDB4MTUsIDB4MDcsIDB4RUUsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0EsIDB4RjIsCisJIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsIDB4MEQsIDB4MDcsIDB4RTYsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsIDB4MDUsIDB4MDcsIDB4REUsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDcsCisJIDB4Q0YsIDB4RjMsIDB4Q0UsIDB4RjUsIDB4RkUsIDB4QTQsIDB4MEYsIDB4NjAsIDB4QzAsIDB4NjEsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MkQsIDB4NDYsIDB4OEIsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEYsIDB4NjAsIDB4QjIsIDB4NjQsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4MTgsIDB4NzEsIDB4MjAsIDB4NzIsIDB4NjAsIDB4NTMsCisJIDB4ODgsIDB4NzUsIDB4MDAsIDB4RjIsIDB4MDksIDB4RTEsIDB4NjAsIDB4NTAsIDB4MTIsIDB4NzEsIDB4NkUsIDB4NzIsIDB4ODMsIDB4NzUsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjUsIDB4MUYsIDB4MDAsIDB4NDAsIDB4RkYsIDB4MDIsIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NzUsIDB4NDAsCisJIDB4MDMsIDB4MkEsIDB4MDMsIDB4MDAsIDB4ODAsIDB4NzUsIDB4MEEsIDB4NjQsIDB4MEIsIDB4MDAsIDB4ODAsIDB4NzUsIDB4MUIsIDB4RjMsIDB4OEIsIDB4RkYsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4OTgsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4QzMsIDB4NjAsCisJIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsCisJIDB4ODgsIDB4RkYsIDB4QzUsIDB4NjAsIDB4OTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjAsIDB4MjIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsCisJIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODUsCisJIDB4MEQsIDB4NjAsIDB4MDIsIDB4NjQsIDB4NDQsIDB4RDMsIDB4NUEsIDB4RDEsIDB4MDMsIDB4MUIsIDB4QzUsIDB4NjAsIDB4QjAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTQsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDQsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTYsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDAsIDB4MEQsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjQsIDB4NDcsIDB4RTgsIDB4N0YsIDB4NUEsIDB4RDEsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUEsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsCisJIDB4NjQsIDB4NDQsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUMsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsCisJIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RUUsIDB4N0YsIDB4NUEsIDB4RDEsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RUYsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4NjUsIDB4NDQsIDB4RDgsIDB4ODQsIDB4MDgsIDB4MjUsIDB4QjksIDB4MDAsIDB4NjAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4ODAsIDB4NjAsCisJIDB4MDAsIDB4RUIsIDB4QTAsIDB4NjAsIDB4MDAsIDB4RUIsIDB4RDEsIDB4NjAsIDB4MDAsIDB4RUIsIDB4M0YsIDB4RjIsIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDMsCisJIDB4RkMsIDB4QTQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDMsIDB4MDAsIDB4MDgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDgsIDB4QTMsIDB4RjgsIDB4QTMsCisJIDB4M0YsIDB4RkEsIDB4MEEsIDB4RTEsIDB4QjMsIDB4RkYsIDB4OUEsIDB4RkYsIDB4Q0IsIDB4ODMsIDB4MDAsIDB4RjQsIDB4MTAsIDB4NjIsIDB4NkMsIDB4NjEsCisJIDB4MEUsIDB4QTMsIDB4QUIsIDB4ODQsIDB4RjIsIDB4QTMsIDB4QTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4NkMsIDB4MTgsCisJIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0EsIDB4RDQsIDB4RkQsIDB4MUMsIDB4QTIsIDB4REMsCisJIDB4MDgsIDB4MjUsIDB4OEMsIDB4MDAsIDB4RjIsIDB4MUQsIDB4NDEsIDB4NDQsIDB4N0MsIDB4QTgsIDB4RDksIDB4ODEsIDB4RUUsIDB4MDMsIDB4RkYsIDB4QjEsCisJIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MjUsIDB4ODAsIDB4MDAsIDB4NDAsIDB4RkYsIDB4NDIsIDB4NDIsCisJIDB4NDYsIDB4NDMsIDB4MDYsIDB4MUUsIDB4MDQsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjIsIDB4NDIsIDB4NDIsIDB4NDYsIDB4NDMsIDB4MDEsIDB4QTIsCisJIDB4NjMsIDB4NDUsIDB4MDEsIDB4QTIsIDB4NjIsIDB4NDMsIDB4NDYsIDB4NEMsIDB4QzYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4RTEsIDB4OUEsIDB4RkYsIDB4MjQsIDB4NDEsIDB4MDIsIDB4QTEsIDB4NjUsIDB4NDMsIDB4MDgsIDB4QTMsIDB4MjMsIDB4NDYsIDB4MjIsIDB4NDIsCisJIDB4N0UsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MDAsIDB4RjQsIDB4ODEsIDB4RjIsIDB4MzcsIDB4MTgsIDB4MDIsIDB4NjIsIDB4QzksIDB4ODEsIDB4QUIsIDB4ODQsCisJIDB4MDMsIDB4MDAsIDB4QTIsIDB4REMsIDB4N0UsIDB4MzYsIDB4RjYsIDB4MDEsIDB4N0EsIDB4RDQsIDB4RkYsIDB4RkYsIDB4RkEsIDB4MUMsIDB4QTIsIDB4REMsCisJIDB4RjEsIDB4MUQsIDB4RDksIDB4ODEsIDB4RkYsIDB4QjEsIDB4MEIsIDB4MUUsIDB4NjIsIDB4NDAsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MDIsIDB4NjIsIDB4NUEsIDB4RDIsIDB4ODksIDB4RkYsIDB4ODAsIDB4NEYsIDB4NkYsIDB4NDQsIDB4QTIsIDB4REEsIDB4ODgsIDB4RkYsIDB4OTgsIDB4RkYsCisJIDB4M0QsIDB4NDYsIDB4MEYsIDB4RjAsIDB4MEEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MTgsIDB4MTQsIDB4RjcsIDB4QjQsIDB4QTIsIDB4REEsIDB4MDYsIDB4NjAsCisJIDB4NzYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEMsIDB4MDAsIDB4RDEsIDB4RjUsIDB4RDAsIDB4RjQsIDB4MEMsIDB4NjAsCisJIDB4RUMsIDB4NjEsIDB4NTksIDB4RDEsIDB4M0IsIDB4RjgsIDB4MDUsIDB4NjQsIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4QTIsIDB4REEsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MUUsIDB4MDAsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MkEsIDB4NDQsIDB4QTQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4MkYsIDB4MjYsIDB4MTYsIDB4MDAsIDB4MkQsIDB4NDYsIDB4NjQsIDB4NDQsIDB4M0EsIDB4RjAsIDB4QkMsIDB4RjAsIDB4NjQsIDB4NUYsCisJIDB4M0QsIDB4RjAsIDB4MDcsIDB4RjQsIDB4RDAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTMsIDB4NUIsIDB4RDgsIDB4NjUsIDB4NUMsIDB4NUIsIDB4RDgsCisJIDB4NUIsIDB4REEsIDB4MkQsIDB4NDYsIDB4Q0UsIDB4RjMsIDB4M0MsIDB4RkEsIDB4Q0YsIDB4RjMsIDB4M0QsIDB4RkEsIDB4MkEsIDB4NDQsIDB4MjMsIDB4RkEsCisJIDB4MDEsIDB4MDAsIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDMsIDB4RkYsCisJIDB4NDAsIDB4RkYsIDB4QjAsIDB4RkYsIDB4QjEsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RUMsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MkQsIDB4NDYsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEEsIDB4MDAsIDB4RDEsIDB4RjUsIDB4RDAsIDB4RjQsIDB4NTksIDB4RDEsIDB4M0IsIDB4RjgsIDB4MDUsIDB4NjQsCisJIDB4NTksIDB4RDEsIDB4Q0MsIDB4ODQsIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsIDB4MkQsIDB4NDYsIDB4QzMsIDB4NjAsIDB4NTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OTgsIDB4RkYsIDB4MDksIDB4RTEsIDB4QTEsIDB4RkYsIDB4M0QsIDB4NDYsIDB4MDgsIDB4MjUsIDB4RTAsIDB4MDEsIDB4MEYsIDB4RjIsIDB4NDAsIDB4RkYsCisJIDB4MDIsIDB4QkMsIDB4QTIsIDB4REEsIDB4QzMsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4MjIsIDB4RkEsIDB4MDAsIDB4NjMsCisJIDB4M0IsIDB4RjIsIDB4MDYsIDB4NjAsIDB4NzYsIDB4RkQsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjcsIDB4MDIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsCisJIDB4RjAsIDB4ODQsIDB4MDAsIDB4QTgsIDB4NDAsIDB4NEEsIDB4MTYsIDB4MDMsIDB4RTAsIDB4ODEsIDB4NjEsIDB4NDMsIDB4NDIsIDB4RkUsIDB4MDAsIDB4NjQsCisJIDB4RjAsIDB4ODQsIDB4RkUsIDB4MUYsIDB4NDAsIDB4NEEsIDB4RTEsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MkQsIDB4NDYsIDB4MDcsIDB4RjQsIDB4RTAsIDB4ODEsCisJIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDcsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjMsIDB4QTAsIDB4ODQsIDB4NDcsIDB4OUMsIDB4MTAsIDB4MDMsIDB4N0MsIDB4NDQsCisJIDB4QTgsIDB4NjMsIDB4MEYsIDB4MDAsIDB4MDcsIDB4RjQsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4ODAsIDB4MkIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4MDAsIDB4NjAsIDB4OTgsIDB4NjMsIDB4MDIsIDB4MDAsIDB4MkQsIDB4NDYsCisJIDB4QkYsIDB4MDEsIDB4MkQsIDB4NDYsIDB4Q0UsIDB4RkIsIDB4Q0YsIDB4RjksIDB4RDAsIDB4RkQsIDB4MDcsIDB4RjIsIDB4RDEsIDB4RkIsIDB4NjAsIDB4NDYsCisJIDB4M0IsIDB4RjAsIDB4MkEsIDB4NDQsIDB4MDYsIDB4NjAsIDB4NzcsIDB4RjksIDB4NUMsIDB4NEIsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4M0YsIDB4MjIsCisJIDB4MDUsIDB4MDAsIDB4OTAsIDB4ODQsIDB4M0IsIDB4RkEsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NEIsIDB4MjEsIDB4MDAsIDB4QUQsIDB4NDYsIDB4MEEsIDB4QTMsCisJIDB4M0QsIDB4RjIsIDB4QUQsIDB4NDYsIDB4QTMsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0MsIDB4RjIsIDB4QUQsIDB4NDYsIDB4MDIsIDB4MDMsCisJIDB4MTYsIDB4MDcsIDB4MTQsIDB4MDQsIDB4NUIsIDB4RDAsIDB4QUQsIDB4NDYsIDB4RDAsIDB4ODAsIDB4M0IsIDB4RjIsIDB4MDMsIDB4MDMsIDB4QUQsIDB4NDYsCisJIDB4MEUsIDB4MDcsIDB4MEMsIDB4MDQsIDB4M0EsIDB4RjAsIDB4QUQsIDB4NDYsIDB4NUIsIDB4RDAsIDB4NjQsIDB4NUYsIDB4RDAsIDB4ODAsIDB4MkIsIDB4NDQsCisJIDB4MTcsIDB4MDcsIDB4MDQsIDB4MDMsIDB4RDAsIDB4ODQsIDB4MTAsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MTIsIDB4MDcsIDB4ODksIDB4MDEsIDB4MDEsIDB4NjQsCisJIDB4MDYsIDB4NjAsIDB4NzYsIDB4RkIsIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsCisJIDB4QTIsIDB4REIsIDB4QzYsIDB4NjAsIDB4NzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NUUsIDB4MDEsCisJIDB4MkQsIDB4NDYsIDB4MEMsIDB4NjAsIDB4RkMsIDB4NjIsIDB4ODAsIDB4RkYsIDB4NzgsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTIsIDB4REIsIDB4QzYsIDB4NjAsCisJIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkYsIDB4MkQsIDB4NDYsIDB4MDgsIDB4MjUsIDB4NTAsIDB4MDEsIDB4MDAsIDB4NjAsIDB4MEYsIDB4NjQsCisJIDB4QzQsIDB4NjAsIDB4REIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkQsIDB4NDYsIDB4M0IsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4MjMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDgsIDB4NjEsIDB4MkQsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4NjIsIDB4NTYsIDB4OTIsIDB4NUEsIDB4RDAsCisJIDB4MkMsIDB4NDYsIDB4NjQsIDB4NDcsIDB4NjMsIDB4NDAsIDB4N0YsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjMsIDB4NDYsIDB4NEMsCisJIDB4NjAsIDB4RkUsIDB4REUsIDB4RDgsIDB4N0YsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjMsIDB4NDYsIDB4NEMsIDB4REUsIDB4REEsCisJIDB4RkUsIDB4QTEsIDB4MjAsIDB4RkUsIDB4RTgsIDB4MDIsIDB4NjMsIDB4NDEsIDB4RkQsIDB4QTEsIDB4NDYsIDB4NEMsIDB4MDEsIDB4RjIsIDB4MkQsIDB4NDYsCisJIDB4NjEsIDB4NUUsIDB4MTYsIDB4RkEsIDB4MkMsIDB4NDQsIDB4MDYsIDB4RkEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjQsIDB4NjYsIDB4NDEsCisJIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjIsIDB4NDAsIDB4NDIsIDB4MDUsIDB4RjIsIDB4NDAsIDB4NDMsIDB4NDAsIDB4NDQsIDB4NjEsIDB4NDYsIDB4M0MsIDB4RjIsCisJIDB4M0QsIDB4RjIsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDEsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4MDAsIDB4NjEsIDB4Q0YsIDB4RjEsIDB4Q0UsIDB4RjUsCisJIDB4NDQsIDB4NEMsIDB4MkMsIDB4NUMsIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsCisJIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsIDB4NDAsIDB4ODMsIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsCisJIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4ODQsIDB4REQsIDB4ODEsCisJIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsIDB4MEMsIDB4NjAsIDB4RUUsIDB4NjEsIDB4MDUsIDB4NjQsIDB4RDAsIDB4RjQsIDB4RDEsIDB4RjUsIDB4RkUsIDB4QTMsCisJIDB4NUIsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDksIDB4RkMsIDB4MDIsIDB4RDAsIDB4RjMsIDB4RDEsIDB4RjUsIDB4NjAsIDB4NDIsIDB4MjAsIDB4NDQsCisJIDB4QTIsIDB4REEsIDB4MjEsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjIsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjMsIDB4NDQsIDB4NUEsIDB4REEsIDB4MjQsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4NjEsIDB4NDYsIDB4MDYsIDB4NjAsIDB4N0UsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDEsIDB4RDAsIDB4RjMsCisJIDB4RDEsIDB4RjUsIDB4QTAsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDEsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDIsCisJIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDMsIDB4NjEsIDB4NDYsIDB4QkEsIDB4RjAsIDB4M0IsIDB4RjIsIDB4NDQsIDB4NDQsIDB4NjUsIDB4NUYsIDB4NDAsIDB4ODUsCisJIDB4Q0YsIDB4RjQsIDB4Q0UsIDB4RjUsIDB4NDMsIDB4NEMsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjAsIDB4NDQsIDB4NDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjEsIDB4NDQsIDB4NDAsIDB4ODEsIDB4QkQsIDB4RDIsIDB4MjEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjIsIDB4NDQsIDB4NDAsIDB4ODIsIDB4QkQsIDB4RDIsIDB4MjIsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjMsIDB4NDQsCisJIDB4NDAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjMsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjQsIDB4NDQsIDB4NDAsIDB4ODQsCisJIDB4QkQsIDB4RDIsIDB4MjQsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjUsIDB4NDQsIDB4NDAsIDB4ODUsIDB4NjEsIDB4NDYsCisJIDB4M0EsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4RTEsIDB4N0YsIDB4NUEsIDB4RDAsCisJIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDQsIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4NjQsIDB4NDcsIDB4Q0UsIDB4RjUsIDB4QkQsIDB4RDIsIDB4MjUsIDB4NUMsCisJIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjAsIDB4NUMsIDB4NDAsIDB4ODAsIDB4MjAsIDB4NDQsIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjAsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUIsIDB4QkQsIDB4RDIsIDB4MjAsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjEsIDB4NUMsIDB4NDAsIDB4ODEsIDB4MjEsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjEsIDB4NDcsIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjIsIDB4NUMsIDB4NDAsIDB4ODIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUIsCisJIDB4MjIsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjIsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjMsIDB4NUMsIDB4NDAsIDB4ODMsCisJIDB4MjMsIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjMsIDB4NDQsIDB4RTgsIDB4ODAsCisJIDB4RjgsIDB4ODQsIDB4MjQsIDB4NUMsIDB4NDAsIDB4ODQsIDB4MjQsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDcsIDB4RUQsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjQsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjUsIDB4NUMsIDB4NDAsIDB4ODUsIDB4MjUsIDB4NDQsIDB4RUUsIDB4N0YsCisJIDB4QTAsIDB4NUIsIDB4MjUsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MkMsIDB4NDMsIDB4QTMsIDB4RDIsIDB4MjUsIDB4NUMsIDB4OTAsIDB4ODEsCisJIDB4RTksIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUIsIDB4MDYsIDB4NjAsIDB4N0UsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4RjMsCisJIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDMsIDB4NDAsIDB4NDksIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjAsIDB4NzgsIDB4N0MsIDB4NDQsIDB4NEQsCisJIDB4NDksIDB4RjIsIDB4NEEsIDB4RjIsIDB4NDAsIDB4NDcsIDB4NDAsIDB4NDYsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MkQsIDB4NUMsCisJIDB4RTksIDB4ODAsIDB4MDAsIDB4NjQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4REIsIDB4ODMsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4RjIsIDB4QTMsIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsIDB4QzAsIDB4OUMsIDB4NDEsIDB4OEEsIDB4REQsIDB4ODEsIDB4MDgsIDB4MkEsIDB4QTcsIDB4MDEsCisJIDB4MjYsIDB4NDQsIDB4NDQsIDB4RkEsIDB4MjcsIDB4NDQsIDB4NDUsIDB4RkEsIDB4MjgsIDB4NDQsIDB4NDYsIDB4RkEsIDB4MjksIDB4NDQsIDB4NDcsIDB4RkEsCisJIDB4MkEsIDB4NDQsIDB4NDgsIDB4RkEsIDB4MDYsIDB4NjAsIDB4N0YsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4ODgsIDB4N0MsCisJIDB4NDQsIDB4NEQsIDB4MkQsIDB4NDIsIDB4QTIsIDB4RDIsIDB4NUEsIDB4RDAsIDB4NDAsIDB4NDYsIDB4NDQsIDB4NDcsIDB4NUEsIDB4RDIsIDB4NUEsIDB4RDAsCisJIDB4NDAsIDB4NDgsIDB4NUEsIDB4RDAsIDB4NDQsIDB4NDksIDB4NEIsIDB4RjIsIDB4NDQsIDB4NEEsIDB4NDAsIDB4OEIsIDB4NjAsIDB4NUMsIDB4NjQsIDB4NDcsCisJIDB4RTAsIDB4N0YsIDB4QTAsIDB4NUEsIDB4RkYsIDB4QjQsIDB4MjAsIDB4QkMsIDB4N0YsIDB4QjQsIDB4RTEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4NjQsIDB4NDQsCisJIDB4RTIsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDAsIDB4NjAsIDB4NzgsIDB4NjMsIDB4MEQsIDB4NjAsIDB4NzIsIDB4NjUsIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsCisJIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjYsIDB4NDQsIDB4NDAsIDB4ODYsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4OUMsCisJIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MjcsIDB4NDQsIDB4NDAsIDB4ODcsIDB4QkQsIDB4RDIsIDB4MjcsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsCisJIDB4OTAsIDB4OUMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4ODgsIDB4QkQsIDB4RDIsIDB4MjgsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsCisJIDB4MjksIDB4NDQsIDB4NDAsIDB4ODksIDB4QkQsIDB4RDIsIDB4MjksIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkEsIDB4NDQsCisJIDB4NDAsIDB4OEEsIDB4QkQsIDB4RDIsIDB4MkEsIDB4NUMsIDB4OTAsIDB4OUMsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDEsIDB4NjQsIDB4NDcsIDB4OTAsIDB4OUMsIDB4MkIsIDB4NDQsIDB4NDAsIDB4OEIsCisJIDB4QkQsIDB4RDIsIDB4MkIsIDB4NUMsIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjYsIDB4NUMsIDB4NDAsIDB4ODYsIDB4MjYsIDB4NDQsCisJIDB4RTQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjYsIDB4NDcsIDB4RTUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4QkQsIDB4RDIsIDB4MjYsIDB4NUMsIDB4OTAsIDB4ODQsCisJIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjcsIDB4NUMsIDB4NDAsIDB4ODcsIDB4MjcsIDB4NDQsIDB4RTYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDcsCisJIDB4RTcsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjcsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MjgsIDB4NUMsIDB4NDAsIDB4ODgsIDB4MjgsIDB4NDQsCisJIDB4RTgsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDcsIDB4RTksIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjgsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsCisJIDB4MjksIDB4NUMsIDB4NDAsIDB4ODksIDB4MjksIDB4NDQsIDB4RUEsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MjksIDB4NDcsIDB4RUIsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MjksIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkEsIDB4NUMsIDB4NDAsIDB4OEEsIDB4MkEsIDB4NDQsIDB4RUMsIDB4N0YsIDB4QTAsIDB4NUEsCisJIDB4MkEsIDB4NDcsIDB4RUQsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkEsIDB4NDQsIDB4RTgsIDB4ODAsIDB4RjgsIDB4ODQsIDB4MkIsIDB4NUMsIDB4NDAsIDB4OEIsCisJIDB4MkIsIDB4NDQsIDB4RUUsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MkIsIDB4NDcsIDB4RUYsIDB4N0YsIDB4QTAsIDB4NUEsIDB4M0MsIDB4RjAsIDB4MkIsIDB4NDQsCisJIDB4OTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTMsIDB4N0YsIDB4QTAsIDB4NUEsIDB4MDYsIDB4NjAsIDB4N0YsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4MDAsIDB4RjAsIDB4ODQsIDB4NjAsIDB4MDAsIDB4RTMsIDB4MDQsIDB4NzEsIDB4NjQsIDB4NTAsIDB4MDEsIDB4MkEsIDB4MDQsIDB4NzEsCisJIDB4NUMsIDB4NjEsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDksIDB4RkQsIDB4MUYsIDB4M0QsIDB4RjIsIDB4NjAsIDB4NDMsIDB4NjAsIDB4NDcsCisJIDB4NUIsIDB4REIsIDB4M0MsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsCisJIDB4NUIsIDB4REIsIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4NUIsIDB4REIsIDB4ODEsIDB4NjAsIDB4MTgsIDB4RTMsIDB4NjUsIDB4NDMsCisJIDB4RTMsIDB4ODQsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NTAsIDB4N0YsIDB4NjQsIDB4MjMsIDB4OTQsIDB4NjAsIDB4NTEsIDB4N0MsIDB4NzIsCisJIDB4MDQsIDB4NzUsIDB4MEMsIDB4NjAsIDB4MTYsIDB4NjEsIDB4MTYsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4MkEsIDB4RjIsIDB4ODcsIDB4NjAsCisJIDB4OEYsIDB4NjUsIDB4QTQsIDB4ODcsIDB4NDAsIDB4QkYsIDB4NTksIDB4REIsIDB4NTYsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4NjIsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MzUsIDB4RjIsIDB4MEYsIDB4NjUsCisJIDB4QTQsIDB4OUMsIDB4NTksIDB4RDksIDB4MDYsIDB4NjMsIDB4NTksIDB4REYsIDB4RkUsIDB4MUYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4MDMsIDB4MkIsIDB4MDUsIDB4MDAsIDB4NkEsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NjUsIDB4NDAsCisJIDB4OEYsIDB4QjAsIDB4ODgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MzksIDB4RjAsIDB4NTksIDB4RDksIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEMsIDB4NjAsCisJIDB4MTYsIDB4NjEsIDB4QTMsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4NTksIDB4REYsIDB4NTksIDB4REYsIDB4QTAsIDB4NEMsIDB4MDQsIDB4QkMsIDB4RkYsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MjMsIDB4NDQsIDB4MDEsIDB4QTcsCisJIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MzgsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4MDEsIDB4NzYsIDB4RkYsIDB4RkYsCisJIDB4NzYsIDB4NDQsIDB4MDEsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NzYsIDB4ODAsIDB4NjAsCisJIDB4MTgsIDB4NzAsIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4ODAsIDB4NjAsIDB4MTAsIDB4NzMsIDB4MDIsIDB4NzYsCisJIDB4NzYsIDB4NDQsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDIsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDIsIDB4RkYsIDB4M0MsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4QkMsIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MTIsIDB4NzEsIDB4ODAsIDB4NjAsIDB4NkUsIDB4NzIsCisJIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTMsIDB4MDQsIDB4NzYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4M0MsIDB4NDYsIDB4MDcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDMsIDB4QTMsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzcsIDB4NDAsCisJIDB4OEIsIDB4RkYsIDB4QTAsIDB4NEMsIDB4MDQsIDB4RTEsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MDQsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsCisJIDB4NDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NzYsIDB4RkYsIDB4RkYsIDB4NzYsIDB4NDQsIDB4MjAsIDB4M0EsIDB4RkQsIDB4MDEsIDB4NDAsIDB4NzYsCisJIDB4NDIsIDB4RkYsIDB4QTAsIDB4NDgsIDB4MDAsIDB4N0YsIDB4QTAsIDB4NTEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4ODgsIDB4RkYsIDB4QTAsIDB4NEMsCisJIDB4RkIsIDB4QjQsIDB4QTAsIDB4NTEsIDB4MDYsIDB4NjAsIDB4MUYsIDB4RTEsIDB4MTYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjgsIDB4QTQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4QTAsIDB4NDgsCisJIDB4MDgsIDB4MjYsIDB4MDcsIDB4MDAsIDB4QTAsIDB4NEMsIDB4MDQsIDB4RTEsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0YsCisJIDB4QTAsIDB4NTEsIDB4NDIsIDB4RkYsIDB4MjYsIDB4NDYsIDB4OEIsIDB4RkYsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NzUsIDB4M0MsIDB4RjIsIDB4NDAsIDB4NzYsCisJIDB4MTQsIDB4MUIsIDB4MjYsIDB4NDYsIDB4M0IsIDB4RjIsIDB4MEMsIDB4NjAsIDB4QkMsIDB4NjMsIDB4NjAsIDB4NDcsIDB4QzAsIDB4QjQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NDMsIDB4OTMsIDB4RTMsIDB4OUMsIDB4NjQsIDB4NDcsIDB4ODAsIDB4N0MsIDB4NjQsIDB4NUYsIDB4NjAsIDB4NTAsCisJIDB4N0YsIDB4NjQsIDB4MjMsIDB4OTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTEsIDB4MDcsIDB4MDAsIDB4MDEsIDB4QTcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NTAsCisJIDB4ODAsIDB4NjAsIDB4NDAsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4MDEsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4RDUsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MEMsIDB4NjAsIDB4MjIsIDB4NjEsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4NTksIDB4REYsCisJIDB4NTksIDB4REYsIDB4ODAsIDB4NjAsIDB4MTgsIDB4NzAsIDB4ODAsIDB4NjAsIDB4MjQsIDB4NzEsIDB4ODAsIDB4NjAsIDB4N0MsIDB4NzIsIDB4ODAsIDB4NjAsCisJIDB4MTAsIDB4NzMsIDB4MDIsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsCisJIDB4QjgsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4NjAsIDB4NTAsIDB4ODAsIDB4NjAsIDB4MTIsIDB4NzEsIDB4M0YsIDB4RjIsIDB4ODAsIDB4NjAsIDB4NkUsIDB4NzIsIDB4NjAsIDB4NDcsIDB4ODAsIDB4QkYsCisJIDB4NjAsIDB4NTMsIDB4MDQsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsCisJIDB4QTAsIDB4MDEsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4MDgsIDB4NzYsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjEsCisJIDB4RkMsIDB4MDEsIDB4MDQsIDB4MjUsIDB4OTYsIDB4MDEsIDB4NzYsIDB4NUMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NzYsIDB4NDMsIDB4RkYsIDB4ODgsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsCisJIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4MDAsIDB4NzQsIDB4RjMsIDB4MzEsIDB4NDAsCisJIDB4MDEsIDB4MkEsIDB4MUMsIDB4MDAsIDB4REMsIDB4ODQsIDB4MDEsIDB4QjQsIDB4NzQsIDB4RkIsIDB4MDgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4MDAsIDB4MDgsIDB4NjAsIDB4MTgsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4MDAsIDB4QTksIDB4RkUsIDB4RTYsIDB4MDUsCisJIDB4QUIsIDB4RkUsIDB4MDcsIDB4MDUsIDB4QTgsIDB4RkUsIDB4RDcsIDB4MDUsIDB4QUEsIDB4RkUsIDB4RDgsIDB4MDUsIDB4QTEsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4ODUsIDB4M0UsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsIDB4Q0EsIDB4NjAsCisJIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDUsIDB4RDQsIDB4ODAsIDB4MEYsIDB4RjAsIDB4RjksIDB4MDMsIDB4NjQsIDB4NDQsIDB4NzAsIDB4QjAsCisJIDB4NzAsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4MDgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsCisJIDB4QTIsIDB4REIsIDB4QTIsIDB4RkYsIDB4OEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4OEUsIDB4RkIsIDB4MDEsIDB4MDcsCisJIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsCisJIDB4NjYsIDB4NDUsIDB4MDksIDB4RjQsIDB4MEYsIDB4RjIsIDB4MDIsIDB4MTgsIDB4NjUsIDB4NDYsIDB4RTQsIDB4MUIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDYsCisJIDB4Q0QsIDB4MDEsIDB4QTIsIDB4RkYsIDB4OEUsIDB4RjMsIDB4NDYsIDB4NDYsIDB4Q0MsIDB4ODQsIDB4RkUsIDB4QTAsIDB4OEUsIDB4RkIsIDB4MDEsIDB4MDcsCisJIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MEYsIDB4RjAsIDB4QTMsIDB4RkMsIDB4NjQsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MTcsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RjAsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MDcsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4Q0UsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4RjAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDQsIDB4MDgsIDB4MjYsIDB4MzQsIDB4MDAsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkIsIDB4NjYsIDB4NjMsCisJIDB4QkUsIDB4RDIsIDB4NjgsIDB4RjEsIDB4QTMsIDB4RDIsIDB4RDAsIDB4ODAsIDB4NjcsIDB4RjEsIDB4MEQsIDB4MDIsIDB4QkYsIDB4RDIsIDB4RDAsIDB4ODAsCisJIDB4NjYsIDB4RjEsIDB4MDksIDB4MDIsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4MjUsIDB4NjAsIDB4RkMsIDB4NjQsIDB4RTUsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MzIsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDcsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDQsIDB4MDAsIDB4MDIsIDB4MkEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4Q0UsIDB4NjAsIDB4NDQsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QjAsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4Q0IsIDB4NjAsIDB4OUQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsCisJIDB4MDEsIDB4MkEsIDB4NEEsIDB4MDAsIDB4MjcsIDB4NjAsIDB4NkEsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MDAsIDB4NjUsIDB4QjQsIDB4ODEsIDB4REIsIDB4ODMsCisJIDB4M0QsIDB4MDMsIDB4QkYsIDB4RDMsIDB4QTMsIDB4RDMsIDB4NDAsIDB4NDgsIDB4QkUsIDB4RDMsIDB4NDAsIDB4NEEsIDB4MkUsIDB4RjAsIDB4NDAsIDB4NEMsCisJIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkMsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MkIsIDB4MDMsIDB4MzEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MDgsIDB4MDIsCisJIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MUUsIDB4MDMsCisJIDB4MzQsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzMsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzIsIDB4RjAsCisJIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MzgsIDB4RjAsIDB4MkMsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4MzcsIDB4RjAsIDB4MDgsIDB4MDIsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODAsIDB4MzYsIDB4RjAsIDB4MDQsIDB4MDIsIDB4MjgsIDB4NDQsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4RkEsIDB4QTEsIDB4MDYsIDB4QTMsIDB4QjcsIDB4MDMsIDB4QzMsIDB4MDEsIDB4MDcsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4Q0UsIDB4NjAsIDB4NDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MEYsIDB4RjAsIDB4NjAsIDB4NDUsIDB4QTQsIDB4MzYsCisJIDB4MDgsIDB4MDAsIDB4MEMsIDB4QjQsIDB4MDQsIDB4MzYsIDB4MDIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDYsIDB4MDAsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4RjIsIDB4NTAsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0UsCisJIDB4RDAsIDB4ODQsIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4MDcsIDB4MDAsIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsCisJIDB4QzAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MEYsIDB4RjAsIDB4NjUsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTcsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsCisJIDB4MTQsIDB4MDAsIDB4MDcsIDB4RjQsIDB4M0EsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MzcsIDB4QjQsIDB4MjYsIDB4NDYsIDB4MEUsIDB4MDIsIDB4MkMsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RjYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NjQsIDB4NDAsIDB4NjAsIDB4MjYsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4NjAsIDB4MEQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4M0EsIDB4RjMsIDB4MDEsIDB4MjUsIDB4NjAsCisJIDB4RUEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4M0IsIDB4MDcsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4MDgsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MDYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RkEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsCisJIDB4OTcsIDB4RjEsIDB4MkEsIDB4RjIsIDB4MjgsIDB4NDEsIDB4NDAsIDB4QTgsIDB4MDEsIDB4QjEsIDB4MDIsIDB4MDIsIDB4NDMsIDB4MDIsIDB4NkQsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEYsIDB4MDAsIDB4MjUsIDB4NjAsIDB4RTgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsCisJIDB4OTcsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsIDB4MjUsIDB4NjAsIDB4RUUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjgsIDB4MDAsIDB4MzIsIDB4NDQsCisJIDB4MDIsIDB4MjYsIDB4MjUsIDB4MDAsIDB4MTAsIDB4MkIsIDB4MjYsIDB4MDAsIDB4MjcsIDB4NjAsIDB4NkEsIDB4NjMsIDB4QkYsIDB4RDMsIDB4MkMsIDB4RjAsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDEsIDB4MEQsIDB4MDMsIDB4NTAsIDB4RkUsIDB4QkQsIDB4RDMsIDB4MkQsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsCisJIDB4MkUsIDB4RjAsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDMsIDB4MkMsIDB4RjAsIDB4RDAsIDB4ODAsIDB4RkEsIDB4QTEsIDB4MTAsIDB4MEMsIDB4RjMsIDB4MDIsCisJIDB4NTAsIDB4RkUsIDB4NjAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkQsIDB4RjAsIDB4MUQsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MkUsIDB4RjAsCisJIDB4MDEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MEMsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MkEsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4NjAsIDB4RUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4RkEsIDB4MDEsCisJIDB4MkEsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MjAsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MUQsIDB4MDAsCisJIDB4MDMsIDB4NjcsIDB4QTAsIDB4ODQsIDB4MDAsIDB4MzcsIDB4NjQsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MzcsIDB4NUUsIDB4NjMsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MzcsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDMsIDB4MzcsIDB4MEQsIDB4MDAsIDB4QkQsIDB4RDIsIDB4NjYsIDB4RjEsIDB4QkQsIDB4RDIsCisJIDB4RDAsIDB4ODAsIDB4NjcsIDB4RjEsIDB4MDcsIDB4MDIsIDB4RDAsIDB4ODAsIDB4QkQsIDB4RDIsIDB4NjgsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4ODcsIDB4RjQsIDB4NjAsIDB4NDAsCisJIDB4MDMsIDB4MkIsIDB4MzEsIDB4MDAsIDB4ODgsIDB4RjMsIDB4MDYsIDB4NjEsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDUsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MzAsIDB4RjAsIDB4MEYsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDQsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MkYsIDB4RjAsIDB4MDksIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4NjUsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4RkYsIDB4RkYsIDB4NDgsIDB4RkUsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4MDIsIDB4QTMsIDB4RTcsIDB4MDIsIDB4ODcsIDB4RjEsCisJIDB4MDgsIDB4RkUsIDB4NjQsIDB4NDMsIDB4MDMsIDB4MDMsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDMsIDB4NDMsIDB4MjMsIDB4NDYsCisJIDB4MDYsIDB4RjAsIDB4MjYsIDB4NDYsIDB4MDcsIDB4NjcsIDB4QTAsIDB4ODQsIDB4MjMsIDB4RkEsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MkIsIDB4MDAsCisJIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4MUIsIDB4MzEsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MzEsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MzAsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4NDMsIDB4NDMsIDB4MDcsIDB4RkMsIDB4NDMsIDB4NDMsIDB4MUQsIDB4RjAsIDB4QzAsIDB4NjQsIDB4QzAsIDB4ODQsCisJIDB4MEEsIDB4NjAsIDB4N0IsIDB4RjEsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4QzAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4NjMsIDB4NDUsIDB4MkEsIDB4RjIsIDB4MzUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MDgsIDB4MkIsCisJIDB4MEMsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDYsIDB4MDIsIDB4Q0UsIDB4NjAsCisJIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4NjAsIDB4RUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4MjYsIDB4NDYsCisJIDB4NDQsIDB4NEMsIDB4MEYsIDB4MjYsIDB4MTksIDB4MDAsIDB4MDAsIDB4QkMsIDB4NDAsIDB4NDUsIDB4MEIsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MjMsIDB4NDYsCisJIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjAsIDB4MkMsIDB4NDQsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RkEsCisJIDB4MjYsIDB4NDYsIDB4Q0QsIDB4NjAsIDB4QTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDIsIDB4RkEsIDB4QTIsIDB4RkYsIDB4MTYsIDB4RjAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MjYsIDB4REMsIDB4OUMsIDB4OTIsIDB4RjMsIDB4MkEsIDB4RjIsIDB4REMsIDB4ODMsIDB4OTIsIDB4RkQsCisJIDB4MDYsIDB4RjQsIDB4MDEsIDB4RjgsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MTgsIDB4MDAsIDB4NjQsIDB4NDQsIDB4MDAsIDB4NjUsCisJIDB4RkYsIDB4QjQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4RjAsIDB4MDMsIDB4MDMsIDB4NjQsIDB4NDYsIDB4MEMsIDB4MEQsIDB4MDIsIDB4NjUsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NjAsIDB4NDYsIDB4RjksIDB4MDEsIDB4MDEsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODQsIDB4MDEsIDB4RkEsIDB4NjYsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDYsIDB4RkEsIDB4MDYsIDB4RjQsIDB4MDAsIDB4RjIsCisJIDB4ODAsIDB4RkMsIDB4NDAsIDB4NDUsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MkMsIDB4NDQsIDB4MEYsIDB4MjYsIDB4MEYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjYsIDB4RkEsIDB4MjYsIDB4NDQsIDB4MjIsIDB4RkEsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QTMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4NjAsIDB4NDUsIDB4REMsIDB4ODQsIDB4RDQsIDB4ODAsIDB4MjYsIDB4RkEsCisJIDB4QTMsIDB4NDYsIDB4NkIsIDB4MDIsIDB4MkEsIDB4RjAsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4QTMsIDB4NDYsIDB4MDAsIDB4QkMsIDB4MDAsIDB4RjIsCisJIDB4MDEsIDB4MDIsIDB4NjMsIDB4MDAsIDB4NDQsIDB4NEMsIDB4M0YsIDB4RjAsIDB4NjAsIDB4NDMsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjQsIDB4MDksIDB4NjAsCisJIDB4MDAsIDB4NjUsIDB4M0YsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QzAsIDB4ODQsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDUsIDB4NTYsIDB4MDcsIDB4ODAsIDB4RkMsCisJIDB4MUIsIDB4RjIsIDB4MDYsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjQsIDB4MUIsIDB4RjAsIDB4MDYsIDB4RjAsIDB4QzEsIDB4ODEsCisJIDB4MDYsIDB4RkEsIDB4MDUsIDB4RkEsIDB4OUIsIDB4RkEsIDB4NjUsIDB4NDQsIDB4M0YsIDB4RkEsIDB4NjQsIDB4NDYsIDB4MDAsIDB4RkMsIDB4NjMsIDB4NDYsCisJIDB4MDEsIDB4RjIsIDB4MTAsIDB4NjEsIDB4RjIsIDB4QTQsIDB4MDEsIDB4RkEsIDB4QzgsIDB4ODMsIDB4MDIsIDB4NjQsIDB4NTksIDB4RDAsIDB4NTgsIDB4RDgsCisJIDB4RkQsIDB4MUYsIDB4MDYsIDB4NDUsIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsCisJIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsCisJIDB4MDUsIDB4RkEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkMsIDB4NDQsCisJIDB4MDQsIDB4MjcsIDB4MTYsIDB4MDAsIDB4MjMsIDB4NDYsIDB4MjIsIDB4RjIsIDB4QTIsIDB4RkMsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NDYsIDB4M0YsIDB4RjIsCisJIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDcsIDB4MDgsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MkMsIDB4NDMsIDB4MkEsIDB4RkMsIDB4MDYsIDB4RjQsIDB4MDAsIDB4NjQsCisJIDB4MDAsIDB4RkEsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MUQsIDB4MDAsCisJIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4NDYsIDB4MjIsIDB4RjAsIDB4QTIsIDB4RkMsCisJIDB4MDAsIDB4NjMsIDB4MzMsIDB4ODUsIDB4QTMsIDB4NDYsIDB4MEQsIDB4MDMsIDB4QTMsIDB4NDYsIDB4MjYsIDB4RjIsIDB4MEYsIDB4NjUsIDB4QTQsIDB4ODUsCisJIDB4RDQsIDB4ODQsIDB4MjYsIDB4RkEsIDB4QTMsIDB4NDYsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QTMsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0UsIDB4NjAsIDB4MzgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4MzIsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MjQsIDB4MDAsIDB4MDEsIDB4MkIsIDB4MTMsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTAsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RTgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4MjUsIDB4NjAsIDB4RUUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MEYsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RTYsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MUIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDUsCisJIDB4MjUsIDB4NjAsIDB4RUMsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDcsIDB4RjQsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MEYsIDB4QjQsIDB4REMsIDB4ODUsIDB4MjUsIDB4NjAsIDB4RUEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsCisJIDB4RDMsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4M0IsIDB4MDcsIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RjgsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDgsIDB4MDAsIDB4MDIsIDB4M0IsIDB4MDYsIDB4MDAsCisJIDB4MjUsIDB4NjAsIDB4RkEsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4MDcsIDB4RjIsIDB4MjYsIDB4RjAsCisJIDB4NDEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4RkYsIDB4NjcsIDB4MjAsIDB4ODgsIDB4NjQsIDB4NUYsIDB4NDAsIDB4NEEsIDB4MTUsIDB4RjAsIDB4MjgsIDB4NDQsCisJIDB4RDAsIDB4ODQsIDB4MDMsIDB4QTQsIDB4MDMsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODcsIDB4QzAsIDB4QkYsIDB4QzAsIDB4ODQsIDB4MTUsIDB4RkEsIDB4NDAsIDB4NDgsIDB4MTQsIDB4RjAsIDB4MkEsIDB4NDQsIDB4RDAsIDB4ODQsCisJIDB4MUYsIDB4QTQsIDB4MDYsIDB4MEUsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MDcsIDB4MDAsCisJIDB4QzIsIDB4QTQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODcsIDB4RjgsIDB4QkYsIDB4QzAsIDB4ODQsCisJIDB4MTQsIDB4RkEsIDB4MkIsIDB4NjAsIDB4RUMsIDB4NjMsIDB4QkQsIDB4REIsIDB4NjAsIDB4NUMsIDB4MkYsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDUsCisJIDB4MDIsIDB4MjgsIDB4NjQsIDB4NDUsIDB4MjgsIDB4NUMsIDB4QkQsIDB4RDksIDB4OEIsIDB4NjcsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDEsIDB4MDIsIDB4MjQsCisJIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODQsIDB4ODAsIDB4NjUsIDB4QzQsIDB4ODcsIDB4MDEsIDB4MDUsIDB4MDAsIDB4NjQsIDB4RkYsIDB4QjQsIDB4MEUsIDB4RkEsCisJIDB4QTMsIDB4REIsIDB4MjYsIDB4NDYsIDB4Q0UsIDB4NjAsIDB4N0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4Q0EsIDB4NjAsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4NTgsIDB4NjMsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjcsCisJIDB4NjQsIDB4NjMsIDB4NjEsIDB4NUMsIDB4MTgsIDB4NjAsIDB4MEYsIDB4RjksIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsCisJIDB4QkQsIDB4RDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4RjgsIDB4ODMsIDB4RkEsIDB4ODIsIDB4RjgsIDB4QTYsIDB4NDYsIDB4MDIsIDB4QjAsIDB4NUUsIDB4NjMsCisJIDB4MDQsIDB4MDMsIDB4NjQsIDB4NjMsIDB4MDMsIDB4QjAsIDB4MDIsIDB4M0EsIDB4NkMsIDB4NjMsIDB4M0YsIDB4RjIsIDB4QkQsIDB4RDAsIDB4QkQsIDB4RDAsCisJIDB4NjQsIDB4NDUsIDB4NjQsIDB4NDEsIDB4QkQsIDB4RDAsIDB4QTYsIDB4NDYsIDB4MDcsIDB4RjgsIDB4ODYsIDB4RkEsIDB4ODUsIDB4RjgsIDB4NjAsIDB4NDcsCisJIDB4MDgsIDB4RkEsIDB4MTgsIDB4NjAsIDB4MEYsIDB4RjEsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsCisJIDB4MkMsIDB4RjAsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDksIDB4MDAsIDB4NjAsIDB4NDAsIDB4QTQsIDB4MzYsIDB4MjEsIDB4MDAsIDB4MDgsIDB4MjYsCisJIDB4MDcsIDB4MDAsIDB4N0QsIDB4RjEsIDB4Q0YsIDB4NjAsIDB4NDcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTIsIDB4MDAsIDB4M0YsIDB4RjAsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NDEsCisJIDB4NjAsIDB4NDAsIDB4NDAsIDB4MjcsIDB4MDYsIDB4MDAsIDB4Q0QsIDB4ODEsIDB4REQsIDB4ODEsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDEsIDB4NjEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NjAsIDB4NDAsIDB4MTgsIDB4M0EsIDB4MDMsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4NjYsIDB4NDUsIDB4RDAsIDB4ODAsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDMsIDB4MDMsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OTAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsCisJIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4QTQsIDB4M0EsIDB4MDcsIDB4MDAsIDB4REYsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0UsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4NTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4M0YsIDB4RjIsIDB4MDYsIDB4NjUsIDB4RDQsIDB4ODAsIDB4NjAsIDB4NDMsIDB4NUIsIDB4MDQsCisJIDB4MDAsIDB4RjQsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjUsIDB4MDksIDB4RjIsIDB4MEEsIDB4RjAsIDB4RDQsIDB4ODAsIDB4MDMsIDB4NjQsIDB4NTMsIDB4MDIsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RjAsIDB4NEYsIDB4MDIsIDB4NjQsIDB4NDUsIDB4RDQsIDB4ODAsIDB4RjgsIDB4N0YsIDB4MDgsIDB4MDIsCisJIDB4MEMsIDB4RjAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsIDB4MjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MEIsIDB4MDAsCisJIDB4RDQsIDB4ODAsIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4MTEsIDB4MDIsIDB4MEMsIDB4RjAsIDB4MjYsIDB4NDYsIDB4NjQsIDB4NDUsIDB4MjMsIDB4RjAsCisJIDB4NDAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NjUsIDB4NDQsIDB4ODgsIDB4M0EsIDB4MzUsIDB4MDAsIDB4NzcsIDB4MzcsIDB4MDMsIDB4MDAsCisJIDB4NzgsIDB4MzcsIDB4MDEsIDB4MDAsIDB4OEUsIDB4MzcsIDB4MDAsIDB4NjEsIDB4MkUsIDB4MDAsIDB4RDQsIDB4ODAsIDB4MDgsIDB4NjUsIDB4MkIsIDB4MDIsCisJIDB4RDcsIDB4ODAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MEMsIDB4RjAsIDB4MjYsIDB4MDQsIDB4RDAsIDB4ODAsIDB4MEQsIDB4RjAsIDB4MjMsIDB4MDIsCisJIDB4MjYsIDB4NDYsIDB4MTQsIDB4RjIsIDB4MDEsIDB4NjMsIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDcsIDB4MUQsIDB4MDMsIDB4N0YsIDB4QjQsIDB4RkQsIDB4QTAsCisJIDB4MDYsIDB4MDMsIDB4MTksIDB4MDcsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NjcsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NkIsIDB4MDAsIDB4MjYsIDB4NDYsCisJIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsCisJIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4RTgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4NjEsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDksIDB4MDAsIDB4MjUsIDB4NjAsCisJIDB4RkUsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4REYsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NDgsIDB4MzYsCisJIDB4ODgsIDB4MDAsIDB4Q0YsIDB4NjAsIDB4RDYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MEMsIDB4MjYsIDB4N0YsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4N0MsIDB4MDAsIDB4QjAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDQsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4NUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NzEsIDB4MDAsIDB4MDAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDcsIDB4NjAsIDB4NTgsIDB4NEYsCisJIDB4Q0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NkEsIDB4MDAsIDB4MjAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RDcsIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0EsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4MDAsIDB4QzAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4REMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NUMsIDB4MDAsIDB4QTAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTUsIDB4MDAsCisJIDB4NDAsIDB4M0EsIDB4MEQsIDB4MDAsIDB4RTMsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NEUsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4NTAsIDB4M0EsIDB4MDUsIDB4MDAsIDB4RUQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4MDAsIDB4Q0YsIDB4NjAsCisJIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MkEsIDB4RjIsCisJIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4Q0YsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDMsCisJIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MjYsIDB4NDYsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MkYsIDB4MjYsCisJIDB4MjAsIDB4MDAsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MTgsIDB4MzYsIDB4MDksIDB4MDAsCisJIDB4MDQsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4MEMsIDB4MDAsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsCisJIDB4MEEsIDB4MDMsIDB4MjYsIDB4NDYsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0UsIDB4NjAsIDB4MzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4RjIsIDB4MDAsIDB4N0MsCisJIDB4M0UsIDB4RjgsIDB4Q0MsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MTgsIDB4MDMsIDB4NUMsIDB4MDIsIDB4MTEsIDB4RjIsIDB4MDcsIDB4RkEsIDB4QUIsIDB4RjMsCisJIDB4MTksIDB4RkEsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsCisJIDB4RjIsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4OEQsIDB4MDAsIDB4QTIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDMsIDB4N0UsIDB4NjMsIDB4NDYsIDB4NEIsIDB4MjUsIDB4NDYsIDB4QTMsIDB4RDAsCisJIDB4MkIsIDB4NDYsIDB4QTMsIDB4RDgsIDB4RkIsIDB4MUYsIDB4ODksIDB4RkMsIDB4OEEsIDB4RkMsIDB4ODgsIDB4RkMsIDB4MDUsIDB4MTgsIDB4NjQsIDB4NDYsCisJIDB4MDEsIDB4RjAsIDB4MTAsIDB4NjcsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MDgsIDB4RkUsIDB4MkIsIDB4NDYsIDB4NDYsIDB4NDYsIDB4MjUsIDB4NDYsCisJIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4NDMsIDB4RjMsIDB4ODcsIDB4RjMsIDB4MDAsIDB4QTgsCisJIDB4MDcsIDB4RkEsIDB4MEUsIDB4MDMsIDB4MUUsIDB4NjAsIDB4REEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MEQsIDB4MDAsCisJIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjQsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4QzEsIDB4RkUsCisJIDB4NDgsIDB4MDMsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MDcsIDB4MDAsIDB4NjAsIDB4NDAsCisJIDB4NDgsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RDIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4RDIsIDB4RkIsIDB4MjYsIDB4NDYsIDB4MkEsIDB4RjIsCisJIDB4M0IsIDB4RjAsIDB4NjAsIDB4NDAsIDB4NDAsIDB4MkIsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NjQsIDB4NDAsIDB4MjAsIDB4MkIsCisJIDB4MDEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RDAsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjIsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4QjQsCisJIDB4RkYsIDB4RkYsIDB4RjgsIDB4MDMsIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjQsIDB4QkIsIDB4RjAsIDB4MjYsIDB4NDYsIDB4QTQsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDAsIDB4MkYsIDB4MjYsIDB4MDcsIDB4MDAsIDB4QzksIDB4NjAsIDB4NTgsIDB4NEYsIDB4Q0YsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsCisJIDB4MTgsIDB4MzYsIDB4MDksIDB4MDAsIDB4MDQsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4Q0YsIDB4NjAsIDB4QzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjgsIDB4RkUsIDB4RjEsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NEEsIDB4REIsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4Q0YsIDB4NjAsIDB4QzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjIsIDB4ODIsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODcsIDB4MDIsIDB4QkYsIDB4MkEsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MzIsIDB4RjIsIDB4MkMsIDB4RkEsCisJIDB4MzMsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzQsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MzIsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MzMsIDB4RkEsCisJIDB4MzEsIDB4RjIsIDB4MzQsIDB4RkEsIDB4NjYsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzAsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzEsIDB4RkEsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4NjAsIDB4NTksIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjYsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4RjMsIDB4MTIsIDB4NjAsIDB4MkMsIDB4NjMsIDB4RjcsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDYsIDB4MDAsIDB4NjQsIDB4QjEsIDB4RkIsCisJIDB4QjEsIDB4RjMsIDB4QjEsIDB4RkIsIDB4MDEsIDB4QTQsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4MkEsIDB4QTMsIDB4RkIsIDB4MDEsCisJIDB4NjMsIDB4NDYsIDB4MTAsIDB4NjAsIDB4QTYsIDB4NjMsIDB4MEUsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsIDB4MDEsIDB4NjQsCisJIDB4NjQsIDB4NDAsIDB4N0YsIDB4MzYsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4REIsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MDQsIDB4QTMsCisJIDB4RjQsIDB4MDIsIDB4MTEsIDB4NjAsIDB4MTYsIDB4NjMsIDB4MUMsIDB4NjEsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsCisJIDB4N0YsIDB4MzYsIDB4MDAsIDB4NjQsIDB4QTMsIDB4REIsIDB4REIsIDB4ODMsIDB4QTMsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsIDB4RjQsIDB4MDIsCisJIDB4MjAsIDB4RkUsIDB4MTMsIDB4NjAsIDB4N0YsIDB4RjMsIDB4MTMsIDB4NjAsIDB4MkQsIDB4RkIsIDB4MUUsIDB4NjMsIDB4MjYsIDB4NjAsIDB4NjQsIDB4NjEsCisJIDB4MjcsIDB4NjAsIDB4MDgsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MTMsIDB4NjAsIDB4OTUsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NDMsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTYsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NDQsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUMsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NEEsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUQsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NEIsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUUsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NEMsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OUYsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NEQsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTcsIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTgsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NDYsIDB4RkIsIDB4MTMsIDB4NjAsIDB4OTksIDB4RjMsIDB4MTMsIDB4NjAsCisJIDB4NDcsIDB4RkIsIDB4MjYsIDB4NjAsIDB4QjAsIDB4NjMsIDB4QkQsIDB4RDEsIDB4Q0IsIDB4RjksIDB4NjYsIDB4RjksIDB4QkQsIDB4RDEsIDB4Q0MsIDB4RjksCisJIDB4NjcsIDB4RjksIDB4QTMsIDB4RDEsIDB4Q0QsIDB4RjksIDB4NjgsIDB4RjksIDB4MDEsIDB4NjQsIDB4NkEsIDB4RkIsIDB4MTMsIDB4NjAsIDB4NTEsIDB4RjMsCisJIDB4QzQsIDB4RkIsIDB4MDAsIDB4NjMsIDB4NEEsIDB4RkQsIDB4NUEsIDB4RkQsIDB4NkIsIDB4RkQsIDB4NkMsIDB4RkQsIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjMsCisJIDB4MTUsIDB4NjAsIDB4Q0IsIDB4RjEsIDB4RkYsIDB4NjAsIDB4RTcsIDB4NjUsIDB4MzIsIDB4NDEsIDB4QTUsIDB4ODEsIDB4RkYsIDB4QTAsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4MDMsIDB4MDYsIDB4MDAsIDB4MTMsIDB4NjAsIDB4NDcsIDB4RjMsIDB4MDgsIDB4QjksIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MTAsIDB4QjksCisJIDB4NDEsIDB4NTIsIDB4ODcsIDB4RjUsIDB4MzIsIDB4NDQsIDB4MTAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDMsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjMsCisJIDB4MDYsIDB4RjAsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsCisJIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjMsIDB4MjIsIDB4N0MsIDB4RkYsIDB4QTAsIDB4RkQsIDB4QTAsIDB4MDUsIDB4MDYsIDB4MDMsIDB4MDMsIDB4RkUsIDB4QTAsCisJIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDIsIDB4M0EsIDB4RjgsIDB4MTMsIDB4NjAsIDB4NEMsIDB4RjEsIDB4MjAsIDB4NDQsIDB4MjAsIDB4QjUsIDB4NjQsIDB4NDEsCisJIDB4MDAsIDB4QjksIDB4RDQsIDB4ODQsIDB4MDgsIDB4MjgsIDB4MjAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MTUsIDB4NjAsIDB4Q0IsIDB4RjMsIDB4MzAsIDB4NjAsCisJIDB4MEUsIDB4NjMsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDIsIDB4QjUsIDB4RjAsIDB4ODQsIDB4RjAsIDB4ODQsIDB4MDMsIDB4QjQsCisJIDB4NjUsIDB4NUMsIDB4QTMsIDB4RDksIDB4MDIsIDB4QTgsIDB4MTgsIDB4NjAsIDB4MDgsIDB4RkIsIDB4MTUsIDB4MDIsIDB4MDAsIDB4NjAsIDB4QzgsIDB4NjQsCisJIDB4MTgsIDB4NjAsIDB4MDksIDB4RkIsIDB4MTgsIDB4NjAsIDB4MEQsIDB4RkIsIDB4MDcsIDB4NjAsIDB4RDAsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MEEsIDB4RkIsCisJIDB4MTgsIDB4NjAsIDB4MEUsIDB4RkIsIDB4MDEsIDB4NjAsIDB4OTAsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MEIsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NjQsIDB4NjQsCisJIDB4MTgsIDB4NjAsIDB4MEMsIDB4RkIsIDB4MDYsIDB4MDAsIDB4NjQsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MEIsIDB4RkIsIDB4NjQsIDB4NjQsIDB4MTgsIDB4NjAsCisJIDB4MEMsIDB4RkIsIDB4QjEsIDB4RjEsIDB4MTAsIDB4NjAsIDB4QTAsIDB4NjMsIDB4MkYsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MTIsIDB4MDAsCisJIDB4Q0MsIDB4ODQsIDB4MDYsIDB4QTMsIDB4RkQsIDB4MDIsIDB4QTMsIDB4RDMsIDB4MTAsIDB4NjAsIDB4QTYsIDB4NjMsIDB4MjUsIDB4MUIsIDB4MTAsIDB4NjAsCisJIDB4RjgsIDB4NjUsIDB4QTMsIDB4RDMsIDB4MDYsIDB4QTMsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MUIsIDB4RkIsIDB4MDQsIDB4MUQsIDB4MDAsIDB4RjgsIDB4QTMsCisJIDB4QTMsIDB4RDMsIDB4MTgsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MTQsIDB4NjMsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4QTMsIDB4RDEsIDB4MDgsIDB4QTMsCisJIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4RkEsIDB4MDQsIDB4MEYsIDB4MDAsIDB4RkEsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MTEsIDB4NjAsCisJIDB4MTYsIDB4NjMsIDB4MEEsIDB4MUIsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MUIsIDB4RkIsIDB4MDQsIDB4MDQsIDB4MDAsCisJIDB4RjYsIDB4QTMsIDB4QTMsIDB4RDMsIDB4QzUsIDB4RkIsIDB4NjQsIDB4RkIsIDB4MjcsIDB4NjAsIDB4MzQsIDB4NjQsIDB4MjYsIDB4NjAsIDB4OTAsIDB4NjMsCisJIDB4QTAsIDB4RDEsIDB4QTMsIDB4RDksIDB4NjQsIDB4NDEsIDB4NTgsIDB4RDEsIDB4NUIsIDB4RDksIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDMsIDB4MDAsIDB4RDEsIDB4NjAsIDB4RTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4OTEsIDB4RkEsIDB4NjEsIDB4NDQsIDB4RUYsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsIDB4MTUsIDB4NjAsIDB4QkMsIDB4RjMsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4MDgsIDB4MDAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDYsIDB4MDAsIDB4MEYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjUsCisJIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4MDAsIDB4MTEsIDB4RjgsIDB4NjQsIDB4NDQsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTIsIDB4RkEsCisJIDB4MTUsIDB4NjAsIDB4QkQsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjUsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QzYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjUsIDB4RjEsIDB4MDksIDB4NjAsCisJIDB4MkEsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDMsIDB4NjQsIDB4MDEsIDB4MDYsIDB4MDYsIDB4NjQsIDB4QUUsIDB4RkIsIDB4NDYsIDB4NDgsIDB4QzMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDUsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTQsIDB4NjAsIDB4MDAsIDB4NjYsIDB4MTEsIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RjQsIDB4NjYsIDB4MEMsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RTgsIDB4NjYsCisJIDB4MDcsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MTMsIDB4NjAsIDB4REMsIDB4NjYsIDB4MDIsIDB4MDAsIDB4MTMsIDB4NjAsIDB4RDAsIDB4NjYsCisJIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTAsIDB4NjAsIDB4NUYsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MjEsIDB4NjAsCisJIDB4MkYsIDB4NjMsIDB4QTMsIDB4REIsIDB4MjEsIDB4NjAsIDB4QTcsIDB4NjMsIDB4QTMsIDB4REIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTAsIDB4NjAsCisJIDB4NUUsIDB4RkIsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MjAsIDB4NjAsIDB4QkYsIDB4NjMsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4QTYsIDB4RDMsCisJIDB4REEsIDB4ODYsIDB4NjAsIDB4NDMsIDB4MUYsIDB4QjMsIDB4NjMsIDB4NUMsIDB4MUYsIDB4NjAsIDB4MDAsIDB4QjQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4QjAsIDB4ODUsIDB4MTAsIDB4NjAsIDB4OTUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkMsIDB4NjAsIDB4MDAsIDB4QjQsIDB4QjQsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4RDEsIDB4RkIsIDB4MjEsIDB4NjAsIDB4Q0EsIDB4NjMsIDB4QTMsIDB4RDMsIDB4QTYsIDB4RDEsIDB4REUsIDB4ODYsCisJIDB4ODAsIDB4NjAsIDB4N0YsIDB4QjUsIDB4NjQsIDB4NDQsIDB4RTgsIDB4ODQsIDB4N0YsIDB4NjAsIDB4ODAsIDB4QjQsIDB4QjQsIDB4ODQsIDB4QTMsIDB4REIsCisJIDB4NjAsIDB4RkUsIDB4QTYsIDB4RDMsIDB4REUsIDB4ODYsIDB4MTAsIDB4NjAsIDB4NjIsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RDIsIDB4NjAsIDB4NUUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsCisJIDB4OUQsIDB4RjksIDB4MEMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MDEsIDB4NjUsIDB4MzQsIDB4ODAsCisJIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDIsIDB4NjAsIDB4ODIsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsCisJIDB4OUQsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDIsIDB4NjAsIDB4OTcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDQsIDB4MDAsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NkEsIDB4MDAsIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4MDUsIDB4MDAsCisJIDB4MTAsIDB4NjAsIDB4NDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDQsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NEUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MUIsIDB4MTMsIDB4NjAsIDB4NTQsIDB4RjMsIDB4QzcsIDB4RkIsIDB4MjYsIDB4NjAsCisJIDB4MTYsIDB4NjUsIDB4MjYsIDB4NjAsIDB4QjgsIDB4NjEsIDB4MjYsIDB4NjAsIDB4MTQsIDB4NjQsIDB4MjAsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDksCisJIDB4QTUsIDB4RDksIDB4REEsIDB4ODUsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjIsIDB4RkIsIDB4RDMsIDB4NjAsCisJIDB4M0MsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MzYsIDB4NDAsIDB4MDgsIDB4M0EsIDB4NDEsIDB4MDAsIDB4RTcsIDB4NjAsIDB4QzUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NjAsIDB4M0UsIDB4NjMsIDB4NjAsIDB4NDEsIDB4MDAsIDB4NjIsIDB4Q0QsIDB4ODEsIDB4MDQsIDB4QTIsIDB4RkQsIDB4MDIsCisJIDB4MkMsIDB4NjAsIDB4M0UsIDB4NjEsIDB4RkMsIDB4QTIsIDB4NjIsIDB4NDUsIDB4QzUsIDB4ODEsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODUsCisJIDB4QzcsIDB4ODMsIDB4RkUsIDB4QTUsIDB4ODgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QzQsIDB4ODQsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4QkQsIDB4RDEsCisJIDB4MDMsIDB4RjgsIDB4QkQsIDB4RDEsIDB4MDQsIDB4RjgsIDB4QTMsIDB4RDEsIDB4MDUsIDB4RjgsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0UsCisJIDB4MDYsIDB4RkEsIDB4NjQsIDB4RjMsIDB4NjEsIDB4NDMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDEsIDB4MEYsIDB4RjgsCisJIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsIDB4NjYsIDB4NUMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjMsIDB4MDYsIDB4RjAsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4ODAsIDB4QkYsIDB4QjAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QzUsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsCisJIDB4RDIsIDB4NjAsIDB4QjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsCisJIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjIsIDB4RkIsIDB4RDIsIDB4NjAsIDB4QjUsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4NDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4MEYsIDB4NEUsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REYsIDB4NjAsCisJIDB4NTgsIDB4NEYsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4OUEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MEYsIDB4NEUsIDB4REQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsCisJIDB4RDUsIDB4MDEsIDB4NEUsIDB4RjMsIDB4N0QsIDB4RjUsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MEEsIDB4MDAsIDB4ODgsIDB4RjEsIDB4Q0MsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzAsIDB4ODYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4N0QsIDB4RjUsIDB4MDcsIDB4MDAsCisJIDB4MDgsIDB4NjAsIDB4MjQsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NEUsIDB4RjMsCisJIDB4NjYsIDB4NDAsIDB4RkYsIDB4MjIsIDB4MDUsIDB4MDAsIDB4RkYsIDB4MjIsIDB4MzksIDB4MDAsIDB4RDQsIDB4NjAsIDB4MEMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4NjQsIDB4NjksIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzEsIDB4RkUsIDB4NjksIDB4RjMsIDB4MDAsIDB4NjUsIDB4RDQsIDB4ODAsIDB4NEUsIDB4RjMsCisJIDB4MEUsIDB4MDMsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsIDB4N0MsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTYsIDB4RkIsIDB4RDMsIDB4NjAsIDB4OEYsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RDMsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsIDB4RDMsIDB4RkIsIDB4MUYsIDB4NjAsIDB4M0EsIDB4NjIsIDB4MDYsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MjAsIDB4NDQsIDB4MDEsIDB4QjUsIDB4NTQsIDB4ODAsIDB4REEsIDB4RkUsIDB4QkUsIDB4RkUsIDB4ODcsIDB4RjEsIDB4MDIsIDB4NjQsCisJIDB4ODYsIDB4RjMsIDB4QzAsIDB4ODMsIDB4NDAsIDB4NDgsIDB4NzUsIDB4RkQsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjgsIDB4NDQsIDB4NEMsIDB4ODgsIDB4NzUsIDB4RjMsIDB4MDIsIDB4NjUsIDB4QzQsIDB4ODMsIDB4RjUsIDB4MDIsIDB4MUUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTcsIDB4NjAsIDB4MDYsIDB4NjQsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RkIsIDB4NEEsIDB4REYsIDB4MDEsIDB4NjAsCisJIDB4RkUsIDB4NjMsIDB4MTUsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MDAsIDB4NjQsIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4N0QsIDB4RjEsIDB4MUUsIDB4NjAsCisJIDB4RTAsIDB4NjEsIDB4NjQsIDB4NDAsIDB4RkYsIDB4MjYsIDB4MzgsIDB4MDAsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjEsCisJIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RUMsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjEsCisJIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MEYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUUsIDB4NjAsIDB4REEsIDB4NjEsIDB4RDQsIDB4NjAsIDB4NTgsIDB4NEUsIDB4M0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTUsIDB4RkIsIDB4NUEsIDB4REIsIDB4QzUsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsCisJIDB4MEUsIDB4NTcsIDB4MjMsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsIDB4MTAsIDB4QjAsIDB4MEEsIDB4MDMsIDB4MDAsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MTMsIDB4MDAsIDB4MTIsIDB4MDIsIDB4RjAsIDB4MzcsIDB4MDksIDB4MDAsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4OEYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsIDB4REEsIDB4MDIsCisJIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTEsIDB4RDMsIDB4MEUsIDB4NTcsIDB4MTgsIDB4MDAsIDB4MEUsIDB4RjIsIDB4NDQsIDB4NEMsIDB4ODAsIDB4QjAsCisJIDB4MTAsIDB4QjAsIDB4MEEsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDIsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsCisJIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDQsIDB4QUMsIDB4ODYsIDB4MDksIDB4RjAsIDB4RTUsIDB4MDIsCisJIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NUEsIDB4REIsIDB4QjAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsCisJIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsCisJIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjYsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjgsIDB4RjMsCisJIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDYsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4M0UsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MDMsIDB4NjAsIDB4NDYsCisJIDB4MDYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4RDYsIDB4NjAsIDB4NDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RDcsIDB4NjAsIDB4OTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsCisJIDB4MTMsIDB4MDIsIDB4RkYsIDB4QTAsIDB4MDQsIDB4MDMsIDB4MDgsIDB4MDMsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsCisJIDB4NTUsIDB4RkIsIDB4RDQsIDB4NjAsIDB4QkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MkEsIDB4MEYsIDB4MDAsCisJIDB4NTUsIDB4RkQsIDB4RDQsIDB4NjAsIDB4QkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MEUsIDB4NjMsCisJIDB4MDEsIDB4QTQsIDB4MEEsIDB4RkEsIDB4MEIsIDB4RkMsIDB4NDMsIDB4NTksIDB4RDcsIDB4NjAsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MEQsIDB4NjMsIDB4MDEsIDB4QTQsIDB4MEEsIDB4RkEsIDB4MEIsIDB4RkMsIDB4NDMsIDB4NTksIDB4RDcsIDB4NjAsCisJIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODcsIDB4RjUsIDB4MDAsIDB4RjIsIDB4MjYsIDB4NDYsIDB4MDAsIDB4QTAsIDB4MkUsIDB4RjAsIDB4MzcsIDB4MDMsCisJIDB4NjYsIDB4NDEsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODcsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsCisJIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsCisJIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsCisJIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4ODYsIDB4RjEsCisJIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsCisJIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4RDYsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4NjAsCisJIDB4ODEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjIsIDB4MTgsIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MDQsIDB4QTUsIDB4QTAsIDB4RDEsIDB4NzIsIDB4NDQsCisJIDB4RkYsIDB4QjQsIDB4NjQsIDB4NDAsIDB4RTAsIDB4MjIsIDB4MUYsIDB4QjQsIDB4NjQsIDB4NDAsIDB4RjgsIDB4MjIsIDB4MDcsIDB4QjQsIDB4MDIsIDB4MDAsCisJIDB4MDMsIDB4MDQsIDB4RDAsIDB4ODQsIDB4RDAsIDB4ODAsIDB4RkMsIDB4MDEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsCisJIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsCisJIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsCisJIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsCisJIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsCisJIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4ODcsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RkMsIDB4MUIsIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsCisJIDB4ODAsIDB4RjAsIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsCisJIDB4MDAsIDB4RjIsIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4RDYsIDB4NjAsIDB4MDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QjUsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RjEsIDB4NzIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDQsIDB4RDAsIDB4ODQsIDB4RkIsIDB4MDEsIDB4RTAsIDB4ODMsIDB4ODcsIDB4RjMsIDB4MDIsIDB4QTMsIDB4NDMsIDB4OTMsIDB4NjYsIDB4NDQsCisJIDB4MDAsIDB4QTgsIDB4NTYsIDB4RkQsIDB4M0EsIDB4MDMsIDB4MDAsIDB4NjQsIDB4MkIsIDB4RkEsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsCisJIDB4QUUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzIsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzMsIDB4RkEsIDB4Q0QsIDB4RjMsCisJIDB4MzEsIDB4RkEsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4RkYsIDB4NjcsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDEsIDB4NDMsIDB4NDksCisJIDB4MjksIDB4NDYsIDB4OTIsIDB4RjAsIDB4MkMsIDB4NjAsIDB4MjYsIDB4NjMsIDB4NDcsIDB4RDMsIDB4NjEsIDB4NDYsIDB4MDIsIDB4NjMsIDB4MDAsIDB4N0UsCisJIDB4MTMsIDB4RkEsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4NjYsIDB4NDEsIDB4MDAsIDB4RjQsCisJIDB4MDUsIDB4NjQsIDB4MDksIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjEsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4NTYsIDB4RjMsIDB4QTMsIDB4RkYsIDB4NjAsIDB4NDMsCisJIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NTgsIDB4MDMsIDB4NjUsCisJIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTYsIDB4RjMsIDB4MjYsIDB4NDYsIDB4NjAsIDB4NDMsIDB4NjYsIDB4NDEsCisJIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsCisJIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsCisJIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjYsIDB4NDEsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDAsIDB4N0YsIDB4ODcsIDB4RjEsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjQsIDB4NDMsIDB4MTEsIDB4MTgsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkMsIDB4MUIsCisJIDB4NjYsIDB4NDQsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjAsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NjUsIDB4NDMsIDB4ODAsIDB4RjAsCisJIDB4MDEsIDB4RkEsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4MEIsIDB4MDAsIDB4NjQsIDB4NDYsIDB4NjIsIDB4NDMsIDB4MDAsIDB4RjIsCisJIDB4QTMsIDB4REIsIDB4NjAsIDB4NDYsIDB4ODAsIDB4RjAsIDB4ODEsIDB4RkMsIDB4ODAsIDB4RkMsIDB4NjQsIDB4NDYsIDB4ODAsIDB4RjgsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjIsIDB4MkQsIDB4RjAsIDB4QUUsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsCisJIDB4NTUsIDB4RjMsIDB4ODUsIDB4RkEsIDB4RkYsIDB4QTAsIDB4NjUsIDB4NDYsIDB4MDMsIDB4MDMsIDB4RDcsIDB4NjAsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4OTQsIDB4RjMsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MUYsIDB4RkEsIDB4NjUsIDB4NDYsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QzQsIDB4ODUsCisJIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4ODAsIDB4NjMsIDB4QzcsIDB4ODUsIDB4OTQsIDB4ODQsIDB4NTksIDB4REIsIDB4RkMsIDB4MUYsCisJIDB4MDAsIDB4NjAsIDB4ODgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsCisJIDB4ODAsIDB4N0YsIDB4MTAsIDB4N0UsIDB4MEMsIDB4RkEsIDB4MUEsIDB4NjUsIDB4ODAsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MEYsIDB4NEUsCisJIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4RDcsIDB4NjAsIDB4ODAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MjMsIDB4RjAsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDMsIDB4MDMsIDB4RDcsIDB4NjAsCisJIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MEMsIDB4MDMsIDB4MDMsIDB4MDMsCisJIDB4RDYsIDB4NjAsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsIDB4MjYsIDB4NDYsIDB4RkYsIDB4QTAsIDB4ODcsIDB4RjQsIDB4MTAsIDB4MDIsCisJIDB4RDcsIDB4NjAsIDB4QUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RkQsIDB4QTAsIDB4MDIsIDB4MDMsCisJIDB4MDQsIDB4MDMsIDB4MDYsIDB4MDAsIDB4RDYsIDB4NjAsIDB4RTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4RjEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsCisJIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsCisJIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsCisJIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsCisJIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDQsIDB4NjAsIDB4QTQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsCisJIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksCisJIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsCisJIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsCisJIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MzIsIDB4NDQsCisJIDB4MDgsIDB4QjAsIDB4ODcsIDB4RjQsIDB4MDMsIDB4MDIsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4MTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDQsIDB4MjYsIDB4NDYsIDB4MDgsIDB4QjAsIDB4MDcsIDB4RjIsIDB4MDMsIDB4MDIsIDB4RDQsIDB4NjAsIDB4QUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4MUYsIDB4RjIsIDB4MjYsIDB4NDYsIDB4QkEsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QzQsIDB4ODUsIDB4MDEsIDB4NjAsCisJIDB4RkUsIDB4NjEsIDB4MDAsIDB4NjQsIDB4ODAsIDB4NjMsIDB4QzcsIDB4ODUsIDB4OTQsIDB4ODQsIDB4NTksIDB4REIsIDB4RkMsIDB4MUYsIDB4MDAsIDB4RjQsCisJIDB4MDEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4N0UsIDB4NjUsIDB4MTgsIDB4NjMsIDB4NUIsIDB4RDIsIDB4NTksIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RDcsIDB4ODAsIDB4MTgsIDB4MDIsIDB4RjksIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjMsIDB4MEUsIDB4NjUsIDB4NUIsIDB4RDIsIDB4NTksIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MEUsIDB4MDIsIDB4RjksIDB4MDIsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEIsIDB4RkEsIDB4NTYsIDB4MDAsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsCisJIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsCisJIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsCisJIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsCisJIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsCisJIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjQsCisJIDB4MEEsIDB4RkEsIDB4MEYsIDB4NjQsIDB4MEIsIDB4RkEsIDB4NDAsIDB4NTksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTgsIDB4MjYsIDB4NDYsCisJIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsCisJIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MEEsIDB4RjIsIDB4MDksIDB4RjIsIDB4RkYsIDB4QTAsIDB4MDAsIDB4QTAsIDB4MDYsIDB4MDIsCisJIDB4RkYsIDB4QTAsIDB4MDcsIDB4MDMsIDB4MDksIDB4MDMsIDB4RDYsIDB4NjAsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDYsIDB4NjAsIDB4NjgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RDcsIDB4NjAsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDcsIDB4RjQsIDB4MDYsIDB4RjIsIDB4NjYsIDB4NDMsCisJIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4RDYsIDB4NjAsIDB4MTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4N0UsIDB4MDYsIDB4RkEsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsCisJIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsIDB4MEIsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4N0MsIDB4MkEsIDB4RjIsIDB4MEMsIDB4NjAsIDB4NzAsIDB4RkIsCisJIDB4RkYsIDB4QjQsIDB4MTYsIDB4NjAsIDB4ODMsIDB4RkIsIDB4NjAsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MDAsIDB4NjAsCisJIDB4MzAsIDB4N0MsIDB4NDEsIDB4NDcsIDB4MkEsIDB4RjgsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjYsIDB4RjMsCisJIDB4MzIsIDB4RkEsIDB4NjcsIDB4RjMsIDB4MzMsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4N0MsCisJIDB4M0UsIDB4RjgsIDB4MUMsIDB4RjAsIDB4MTMsIDB4RjgsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4REMsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NEIsIDB4MDEsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QUIsIDB4NDYsIDB4MDYsIDB4RjIsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4QjAsIDB4RkYsIDB4RkYsCisJIDB4MDMsIDB4MDIsIDB4REMsIDB4NjAsIDB4NTUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsIDB4MTYsIDB4NjAsIDB4ODQsIDB4RkIsIDB4NUEsIDB4ODQsCisJIDB4MDAsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDIsIDB4QkIsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjcsIDB4MDQsIDB4QkIsIDB4QUIsIDB4NDYsCisJIDB4NzgsIDB4RkMsIDB4QUIsIDB4NDYsIDB4RkYsIDB4RkYsIDB4MTAsIDB4QjAsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MEMsIDB4MDMsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDQsIDB4RkUsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MzIsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MDYsIDB4MDAsCisJIDB4REMsIDB4NjAsIDB4QjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDAsIDB4NjMsIDB4QUIsIDB4NDYsIDB4MDYsIDB4RjAsCisJIDB4N0YsIDB4NjAsIDB4RkYsIDB4NjQsIDB4QTAsIDB4ODQsIDB4NjMsIDB4NDUsIDB4QjQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MEEsIDB4RjAsCisJIDB4NTYsIDB4RjksIDB4MjQsIDB4RDksIDB4NUEsIDB4ODQsIDB4MDEsIDB4NjMsIDB4MzIsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkIsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjEsIDB4NjMsIDB4NDQsCisJIDB4MjAsIDB4QkMsIDB4RkIsIDB4NjAsIDB4RkYsIDB4QjcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsIDB4NjAsIDB4NDMsCisJIDB4MDksIDB4RkMsIDB4MjcsIDB4NDQsIDB4RkUsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RDgsIDB4NjAsIDB4QzgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTgsIDB4NjAsIDB4RDYsIDB4NjQsIDB4MjQsIDB4NDMsIDB4MEIsIDB4RjAsIDB4QTAsIDB4RDksIDB4QkQsIDB4RDksIDB4MEMsIDB4RjAsIDB4NTgsIDB4RDksCisJIDB4QkQsIDB4RDksIDB4MEQsIDB4RjAsIDB4NTgsIDB4RDksIDB4QkQsIDB4RDksIDB4NDMsIDB4NDQsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjIsIDB4M0YsIDB4RjIsCisJIDB4NDEsIDB4NEIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjYsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUIsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsCisJIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RjYsIDB4QTMsIDB4MDAsIDB4NjAsIDB4MUIsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsCisJIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MzAsIDB4NjAsIDB4MjAsIDB4NjEsCisJIDB4QTEsIDB4RDEsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NkUsIDB4NjMsIDB4NjAsIDB4NDUsIDB4MkEsIDB4NDQsIDB4NjAsIDB4RkIsIDB4QTMsIDB4RDUsCisJIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTksIDB4RDEsIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsCisJIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsIDB4MEYsIDB4RkEsIDB4NjEsIDB4RkIsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsCisJIDB4NjYsIDB4NUMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDksIDB4NjAsIDB4MjgsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjIsIDB4M0YsIDB4RjIsIDB4NDEsIDB4NEIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkMsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MTUsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEEsIDB4NjAsIDB4RkUsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4NDMsIDB4RkMsIDB4QTMsIDB4MDAsIDB4NjAsCisJIDB4MTUsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MzIsIDB4NjUsIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NEMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QkIsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDMsIDB4NjAsIDB4NDEsIDB4RjAsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJIDB4MjAsIDB4RkUsIDB4MzAsIDB4NjAsIDB4MjAsIDB4NjEsIDB4QTEsIDB4RDEsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NkUsIDB4NjMsIDB4NjAsIDB4NDUsCisJIDB4MkEsIDB4NDQsIDB4NjAsIDB4RkIsIDB4QTMsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4RDUsIDB4NjUsIDB4NDAsIDB4MDEsIDB4MjcsCisJIDB4NTksIDB4RDEsIDB4NjYsIDB4NDEsIDB4QTAsIDB4ODQsIDB4MjQsIDB4OTQsIDB4MkIsIDB4NDYsIDB4MEYsIDB4RkEsIDB4NjEsIDB4RkIsIDB4MTYsIDB4NjQsCisJIDB4MTIsIDB4RkEsIDB4MDEsIDB4NjQsIDB4MTEsIDB4RkEsIDB4NjYsIDB4NUMsIDB4QzEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4OTMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4NDYsIDB4MEYsIDB4RjIsIDB4MTIsIDB4NjMsIDB4N0MsIDB4MTgsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjIsIDB4MDEsIDB4NjUsIDB4NDEsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4MEYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RkYsIDB4MjIsCisJIDB4MDAsIDB4NjUsIDB4NzgsIDB4RjIsIDB4RkYsIDB4RkYsIDB4QjQsIDB4ODQsIDB4NzgsIDB4RkEsIDB4QUIsIDB4NDYsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RjIsIDB4MDAsIDB4RjQsIDB4MTYsIDB4NjUsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MUMsIDB4NjUsIDB4RjYsIDB4QTQsCisJIDB4MDEsIDB4MDAsIDB4RkMsIDB4QTQsIDB4MjQsIDB4NDMsIDB4MkQsIDB4NjAsIDB4NUUsIDB4NjEsIDB4NUQsIDB4OTEsIDB4NTEsIDB4OTAsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MjgsIDB4NjAsIDB4NDEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsCisJIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsCisJIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MkQsIDB4NjAsIDB4MDQsIDB4N0MsIDB4MDMsIDB4MUUsIDB4NjAsIDB4RkUsCisJIDB4QkQsIDB4REYsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4MDgsIDB4NjQsIDB4NTMsIDB4OTMsIDB4QTQsIDB4REQsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsCisJIDB4MTMsIDB4NjAsIDB4NDQsIDB4RjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4QjgsIDB4MEEsIDB4RkMsIDB4MDMsIDB4MDIsIDB4RDksIDB4NjAsIDB4Q0YsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEIsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4M0EsIDB4MjUsIDB4MDAsIDB4NjAsIDB4NDEsIDB4MDAsIDB4MzYsIDB4MjIsIDB4MDAsIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsIDB4MUYsIDB4MDcsCisJIDB4MTMsIDB4NjAsIDB4MEIsIDB4RjEsIDB4NjUsIDB4NDIsIDB4RDEsIDB4ODAsIDB4MjYsIDB4NjAsIDB4MTgsIDB4NjMsIDB4MTgsIDB4MDIsIDB4NTAsIDB4RkUsCisJIDB4NjEsIDB4NDAsIDB4RkUsIDB4MjIsIDB4MDgsIDB4MDAsIDB4NjIsIDB4NDUsIDB4QkQsIDB4RDMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODIsIDB4RDAsIDB4ODAsCisJIDB4QzksIDB4ODEsIDB4RjYsIDB4MEMsIDB4MEMsIDB4MDAsIDB4NjEsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MzEsIDB4MDAsIDB4NjIsIDB4NDUsIDB4QTMsIDB4RDMsCisJIDB4QTUsIDB4RDAsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjYsIDB4MDIsIDB4MDAsIDB4REUsIDB4ODIsIDB4MjgsIDB4MDAsIDB4MEMsIDB4NjMsCisJIDB4MEEsIDB4RkMsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MEIsIDB4RkEsIDB4MDEsIDB4N0UsIDB4MEMsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDgsIDB4NjQsCisJIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4NDAsIDB4NTgsIDB4MDcsIDB4RjgsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4REMsIDB4NjAsIDB4RDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MTYsIDB4NjAsIDB4NTAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MjIsIDB4QjAsCisJIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4REIsIDB4NjAsIDB4QjEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjMsIDB4RDksIDB4MDEsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MEMsIDB4MjAsIDB4MDMsIDB4MDAsIDB4REIsIDB4NjAsIDB4QjEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NTYsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NTcsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NTgsIDB4RkIsCisJIDB4MTYsIDB4NjAsIDB4NUEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NUIsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4MTYsIDB4NjAsIDB4NUQsIDB4RkIsCisJIDB4MTgsIDB4NjAsIDB4MTcsIDB4RkIsIDB4MkIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4N0YsIDB4NjAsIDB4Q0YsIDB4NjUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MEIsIDB4RjIsIDB4MjcsIDB4NDAsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4Q0UsIDB4ODEsIDB4MjAsIDB4RkUsIDB4MzAsIDB4NjAsIDB4MjgsIDB4NjQsIDB4NDAsIDB4NEEsIDB4REEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MTgsIDB4NjAsIDB4MTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MTgsIDB4MTgsIDB4NjAsIDB4MTksIDB4RjMsCisJIDB4MTgsIDB4NjAsIDB4MUEsIDB4RjUsIDB4NjAsIDB4NDEsIDB4MzAsIDB4NjAsIDB4MkUsIDB4NjIsIDB4QTIsIDB4REYsIDB4MkEsIDB4RDEsIDB4REEsIDB4ODUsCisJIDB4NjQsIDB4NDQsIDB4MDEsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDIsIDB4NzUsIDB4MDAsIDB4NDUsIDB4NEEsIDB4N0MsIDB4NDQsIDB4NjAsIDB4RkUsCisJIDB4QTEsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4MjAsIDB4RkUsIDB4MDEsIDB4MDMsIDB4RTMsIDB4MDEsIDB4MzAsIDB4NjAsIDB4MkUsIDB4NjIsCisJIDB4QTIsIDB4REYsIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NUMsIDB4NDEsIDB4OTQsIDB4ODEsIDB4QTAsIDB4MjAsIDB4RkUsCisJIDB4MkQsIDB4MDQsIDB4MDEsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MTcsIDB4RkIsIDB4QzEsIDB4ODQsIDB4ODQsIDB4QTQsIDB4MTgsIDB4NjAsIDB4MTksIDB4RkIsCisJIDB4MDAsIDB4RjIsIDB4MTgsIDB4NjAsIDB4MUEsIDB4RkIsIDB4MTgsIDB4NjAsIDB4MTgsIDB4RkQsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjMsIDB4Q0QsIDB4ODUsCisJIDB4NjQsIDB4NDQsIDB4RDgsIDB4ODEsIDB4Q0QsIDB4ODQsIDB4NEMsIDB4OTEsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4QTUsIDB4RDIsIDB4REUsIDB4ODUsCisJIDB4N0YsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4NUQsIDB4OTMsIDB4QTMsIDB4REIsIDB4NUQsIDB4OTMsIDB4QTUsIDB4RDIsCisJIDB4RjYsIDB4MUYsIDB4NUQsIDB4OTMsIDB4MjAsIDB4RkUsIDB4REYsIDB4ODMsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4RTAsIDB4ODcsIDB4NjAsIDB4NDYsIDB4MTgsIDB4NjAsIDB4MTgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4RkUsIDB4Q0QsIDB4ODEsCisJIDB4MjAsIDB4RkUsIDB4MkEsIDB4NDQsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REIsIDB4NjAsCisJIDB4NUMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjAsIDB4MTcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MTgsIDB4MTgsIDB4NjAsIDB4MTksIDB4RjMsCisJIDB4MTgsIDB4NjAsIDB4MUEsIDB4RjUsIDB4NjAsIDB4NDEsIDB4MzAsIDB4NjAsIDB4MkUsIDB4NjIsIDB4QTIsIDB4REYsIDB4NjYsIDB4NUMsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjIsIDB4NjQsIDB4NDYsIDB4NTgsIDB4OTAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDIsIDB4NjEsIDB4NDQsIDB4MEIsIDB4QTUsIDB4MDQsIDB4MDAsCisJIDB4NjEsIDB4NDQsIDB4RkMsIDB4QTQsIDB4OEIsIDB4N0MsIDB4QzAsIDB4ODUsIDB4REQsIDB4ODEsIDB4NjYsIDB4NDQsIDB4MTgsIDB4NjAsIDB4MUEsIDB4RkIsCisJIDB4MjYsIDB4NDYsIDB4MUIsIDB4RjAsIDB4MTgsIDB4NjAsIDB4MUEsIDB4RjUsIDB4NjQsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RDcsIDB4MDYsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4RkYsIDB4QjQsIDB4NDEsIDB4OTQsCisJIDB4ODEsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDQsIDB4MDAsIDB4RjQsIDB4ODQsIDB4QTQsIDB4NjAsIDB4NDEsIDB4NjIsIDB4MDEsIDB4NjAsIDB4RkUsCisJIDB4NUQsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkEsIDB4QTQsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MjAsIDB4MDIsIDB4MDAsIDB4RkYsIDB4QTEsIDB4NjEsIDB4MDEsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QzksIDB4ODEsIDB4NUEsIDB4MDEsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4RkQsIDB4QTEsIDB4NTMsIDB4MDEsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsCisJIDB4NjQsIDB4NDAsIDB4RjIsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkMsIDB4QTEsIDB4REEsIDB4NjAsIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkIsIDB4QTEsIDB4REEsIDB4NjAsIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RkEsIDB4QTEsIDB4REEsIDB4NjAsIDB4MDEsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDQsIDB4MDAsIDB4RjksIDB4QTEsIDB4REEsIDB4NjAsCisJIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NUMsIDB4MDAsIDB4MzYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4NUEsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MjUsIDB4MDAsIDB4NUQsIDB4RDIsCisJIDB4REQsIDB4ODEsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4NUIsIDB4RkIsIDB4NjQsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MUYsIDB4MDAsIDB4NUQsIDB4RDIsIDB4REQsIDB4ODEsIDB4REIsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MTYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MTksIDB4MDAsIDB4NUQsIDB4RDAsIDB4MTYsIDB4NjAsIDB4NUQsIDB4RjksCisJIDB4NUQsIDB4RDAsIDB4MkMsIDB4NjAsIDB4QkIsIDB4NjIsIDB4QTIsIDB4RDksIDB4RDksIDB4NjAsIDB4RjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NUEsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MTYsIDB4NjAsCisJIDB4NUIsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NUMsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MTYsIDB4NjAsIDB4NUQsIDB4RkIsIDB4RDksIDB4NjAsIDB4RjksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjAsIDB4NUUsIDB4RkIsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDMsIDB4MDIsIDB4MDEsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDIsIDB4NjQsIDB4MDIsIDB4QTUsIDB4NjQsIDB4NDQsCisJIDB4RDQsIDB4OUMsIDB4MTYsIDB4NjAsIDB4NUYsIDB4RjksIDB4MkMsIDB4NjAsIDB4QzAsIDB4NjIsIDB4QTIsIDB4REYsIDB4NUQsIDB4RDAsIDB4MDAsIDB4NjUsCisJIDB4NjQsIDB4NDAsIDB4MDAsIDB4M0EsIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4NTAsIDB4M0EsIDB4MDEsIDB4NjUsCisJIDB4NUQsIDB4RDAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4RjIsIDB4M0EsIDB4MDEsIDB4NjUsIDB4NUQsIDB4RDAsIDB4NjUsIDB4NDAsIDB4MDAsIDB4M0EsCisJIDB4MTcsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDAsIDB4MzYsIDB4MDEsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MDIsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MzYsIDB4MDQsIDB4NjUsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MzYsIDB4MTAsIDB4NjUsIDB4NjQsIDB4NDAsCisJIDB4MDUsIDB4MzYsIDB4MjAsIDB4NjUsIDB4NjUsIDB4NUMsIDB4MTYsIDB4NjAsIDB4NjAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MTYsIDB4NjAsIDB4NUUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QTQsIDB4QTIsIDB4REIsIDB4RDAsIDB4MDIsIDB4MTYsIDB4NjAsIDB4NjAsIDB4RjMsCisJIDB4MTYsIDB4NjAsIDB4NUYsIDB4RjEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MTYsIDB4NjAsIDB4NTAsIDB4RjEsIDB4MTYsIDB4NjAsCisJIDB4NUEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDksIDB4MDAsCisJIDB4MjAsIDB4MjYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MjYsIDB4MDksIDB4MDAsIDB4RDksIDB4NjAsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4N0MsCisJIDB4MDUsIDB4MDAsIDB4MDQsIDB4N0MsIDB4MDMsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDIsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTYsIDB4RjksCisJIDB4MTYsIDB4NjAsIDB4NTEsIDB4RjEsIDB4MTYsIDB4NjAsIDB4NUIsIDB4RjMsIDB4MkMsIDB4NjAsIDB4QUMsIDB4NjIsIDB4QTAsIDB4ODQsIDB4QTIsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MEQsIDB4MDAsIDB4RDksIDB4NjAsCisJIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4N0MsIDB4MDksIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjIsIDB4MDMsIDB4MDAsIDB4RDksIDB4NjAsCisJIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MDEsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTcsIDB4RjksIDB4MTYsIDB4NjAsCisJIDB4NTIsIDB4RjEsIDB4MTYsIDB4NjAsIDB4NUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsIDB4MDIsIDB4MjYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MjYsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4MjYsIDB4MDcsIDB4MDAsIDB4RDksIDB4NjAsIDB4QzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4N0MsIDB4MDMsIDB4MDAsCisJIDB4MDQsIDB4N0MsIDB4MDEsIDB4MDAsIDB4MjAsIDB4N0MsIDB4MTYsIDB4NjAsIDB4NTgsIDB4RjksIDB4MTYsIDB4NjAsIDB4NUQsIDB4RjEsIDB4MTYsIDB4NjAsCisJIDB4NTksIDB4RjksIDB4MTYsIDB4NjAsIDB4NTgsIDB4RjMsIDB4MTYsIDB4NjAsIDB4NTcsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QjAsIDB4ODQsIDB4MTMsIDB4NjAsCisJIDB4NDUsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4QkMsIDB4QUIsIDB4NDYsIDB4M0EsIDB4RkEsIDB4QUIsIDB4NDYsCisJIDB4MTYsIDB4NjAsIDB4NTYsIDB4RjMsIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MjIsIDB4QkMsCisJIDB4ODcsIDB4RjEsIDB4NjYsIDB4NDEsIDB4NjQsIDB4NDYsIDB4M0EsIDB4RkEsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDYsIDB4QUIsIDB4NDYsIDB4ODIsIDB4RjAsCisJIDB4QzAsIDB4NjcsIDB4QjQsIDB4ODQsIDB4QUIsIDB4NDYsIDB4MEIsIDB4RkEsIDB4MTMsIDB4NjAsIDB4NEQsIDB4RjEsIDB4MkQsIDB4NjAsIDB4QkUsIDB4N0MsCisJIDB4MDQsIDB4MUIsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4QTQsIDB4REQsIDB4MjYsIDB4MDAsIDB4MkUsIDB4NjAsIDB4MzQsIDB4NjMsIDB4QTQsIDB4REQsCisJIDB4REIsIDB4ODMsIDB4NjAsIDB4RkUsIDB4MDAsIDB4NjQsIDB4QkQsIDB4REIsIDB4NjAsIDB4NjQsIDB4QkQsIDB4REIsIDB4MUQsIDB4NjQsIDB4QkQsIDB4REIsCisJIDB4QzMsIDB4RjMsIDB4QkQsIDB4REIsIDB4MjAsIDB4RkUsIDB4MDEsIDB4NjAsIDB4NzgsIDB4NjQsIDB4MDYsIDB4NjEsIDB4NTgsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4MjAsIDB4RkUsIDB4Q0QsIDB4ODEsIDB4NjEsIDB4NDAsIDB4MDgsIDB4MjgsIDB4RjcsIDB4MDEsIDB4QjYsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDcsIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4QkQsIDB4REIsIDB4MjAsIDB4RkUsIDB4MTMsIDB4NjAsIDB4NEIsIDB4RjEsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4MjAsIDB4RkUsIDB4MkQsIDB4NjAsIDB4QkMsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTgsIDB4NjEsIDB4MjYsIDB4NDYsCisJIDB4MDAsIDB4RjQsIDB4RkYsIDB4NjAsIDB4RjIsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4M0YsIDB4RkMsIDB4MkIsIDB4NDYsIDB4NTYsIDB4RjEsIDB4MUYsIDB4RjgsIDB4MEMsIDB4NjAsIDB4NzAsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QTAsIDB4ODAsIDB4MDYsIDB4RjIsIDB4MEIsIDB4MDMsIDB4MTAsIDB4QkMsIDB4MDYsIDB4RkEsIDB4ODYsIDB4RjMsIDB4MDAsIDB4NjAsIDB4NzAsIDB4RjMsCisJIDB4NjAsIDB4NDUsIDB4RDQsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDcsIDB4MDcsIDB4QTIsIDB4REIsIDB4MDUsIDB4MDAsIDB4MTAsIDB4QjUsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDMsIDB4RDQsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MTEsIDB4MDMsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4NTAsIDB4MDAsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MTksIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MDIsIDB4NjQsIDB4M0YsIDB4RkEsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDksIDB4NjQsIDB4MDksIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NDMsIDB4MEIsIDB4NjAsCisJIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsCisJIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsIDB4MTcsIDB4NjAsCisJIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsIDB4QUIsIDB4NDYsCisJIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QkMsIDB4MDYsIDB4RkEsIDB4NzgsIDB4RjIsIDB4MTUsIDB4NjAsIDB4REMsIDB4RjMsIDB4NjAsIDB4NDUsCisJIDB4QTQsIDB4ODQsIDB4MTUsIDB4NjAsIDB4REMsIDB4RkIsIDB4QUIsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjQsIDB4MDIsIDB4RjAsCisJIDB4NzEsIDB4RjEsIDB4QTAsIDB4ODQsIDB4RDAsIDB4ODAsIDB4MDIsIDB4RkEsIDB4QUIsIDB4NDYsIDB4MDEsIDB4MDYsIDB4NzEsIDB4RkIsIDB4MjcsIDB4NDEsCisJIDB4MDEsIDB4QjEsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MkIsIDB4NDYsIDB4MEIsIDB4NTgsIDB4MDEsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkIsIDB4NDYsIDB4MEIsIDB4NTgsIDB4MTgsIDB4NjAsIDB4RDYsIDB4NjQsIDB4NDAsIDB4NTksCisJIDB4MDIsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MDksIDB4RkEsIDB4MEIsIDB4RkEsIDB4MDEsIDB4N0UsIDB4MEMsIDB4RkEsCisJIDB4MEEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDgsIDB4NjQsIDB4M0YsIDB4RkEsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4NDAsIDB4NTgsCisJIDB4MDcsIDB4RjgsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4RkYsIDB4NjAsIDB4RkQsIDB4NjUsIDB4MzgsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODMsIDB4MDYsIDB4RkMsIDB4MDIsIDB4QjAsIDB4MjYsIDB4NDYsIDB4MUMsIDB4MDMsIDB4MzgsIDB4NDMsIDB4ODYsIDB4RjEsCisJIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsCisJIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsCisJIDB4MkQsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsCisJIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDcsIDB4MDcsIDB4RjIsCisJIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDIsIDB4MjcsIDB4NDMsCisJIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MTEsIDB4MDMsIDB4RDMsIDB4ODAsCisJIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4QzksIDB4ODEsIDB4QzgsIDB4ODUsIDB4RDUsIDB4ODAsIDB4QTUsIDB4RDMsIDB4MDgsIDB4MjgsIDB4QTEsIDB4REIsCisJIDB4MTcsIDB4NjAsIDB4MDQsIDB4NjIsIDB4NjUsIDB4NDQsIDB4QTIsIDB4REIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4MEMsIDB4MDAsIDB4MjcsIDB4NDQsIDB4NDAsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDMsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjQsIDB4NjYsIDB4NDEsCisJIDB4NjMsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDAsIDB4RjAsIDB4ODEsIDB4RjAsIDB4MDIsIDB4MTgsIDB4NjQsIDB4NDYsIDB4ODEsIDB4RjgsIDB4MDcsIDB4MUIsCisJIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDksIDB4MDIsIDB4MDAsIDB4NjUsIDB4NDYsCisJIDB4MDAsIDB4RjgsIDB4ODcsIDB4RjMsIDB4NjMsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RDQsIDB4ODAsIDB4MDEsIDB4MTgsCisJIDB4RkEsIDB4MDQsIDB4ODAsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MDAsIDB4RkEsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4MDYsIDB4RkEsCisJIDB4NjEsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDcsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDYsIDB4MDYsIDB4RjAsCisJIDB4RkYsIDB4NjAsIDB4RUQsIDB4NjQsIDB4QTAsIDB4ODQsIDB4MDYsIDB4RkEsIDB4MjcsIDB4NDMsIDB4ODYsIDB4RjEsIDB4MTcsIDB4NjAsIDB4MDIsIDB4NjEsCisJIDB4QTEsIDB4RDMsIDB4REEsIDB4ODEsIDB4RDAsIDB4ODAsIDB4REMsIDB4OUMsIDB4MDUsIDB4MDUsIDB4QTEsIDB4RDMsIDB4NEEsIDB4RDksIDB4QTAsIDB4REQsCisJIDB4REEsIDB4OUMsIDB4QTEsIDB4RDksIDB4MDcsIDB4NTgsIDB4MDMsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NTEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjcsIDB4NDMsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjMsCisJIDB4MkYsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4NjYsIDB4RjMsIDB4MzIsIDB4RkEsIDB4NjcsIDB4RjMsCisJIDB4MzMsIDB4RkEsIDB4NjgsIDB4RjMsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MDAsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDQsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsCisJIDB4M0UsIDB4RkEsIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4MkMsIDB4RjIsIDB4QTEsIDB4REIsIDB4MkQsIDB4RjIsIDB4NDEsIDB4NTgsIDB4NTksIDB4REIsCisJIDB4MkUsIDB4RjIsIDB4NTksIDB4REIsIDB4MDYsIDB4NjMsIDB4MDcsIDB4RjIsIDB4ODcsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MEQsIDB4MDIsIDB4NDMsIDB4NTksIDB4MDIsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsCisJIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDYsIDB4NjQsIDB4MDksIDB4RkEsIDB4MTUsIDB4MDAsIDB4MDcsIDB4RjIsIDB4NjYsIDB4NDUsCisJIDB4NjAsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDIsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MUQsIDB4MDIsIDB4MDcsIDB4NjMsIDB4NDMsIDB4NTksCisJIDB4MDEsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4QTAsIDB4NjQsIDB4MkEsIDB4RkEsCisJIDB4MDAsIDB4RjQsIDB4MDcsIDB4NjQsIDB4MDksIDB4RkEsIDB4MjYsIDB4NDYsIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4REUsIDB4NjAsIDB4NjYsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjksIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUYsIDB4RkIsIDB4REUsIDB4NjAsCisJIDB4MDUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4NTksIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NzEsIDB4RjMsIDB4ODcsIDB4RjUsCisJIDB4REMsIDB4ODEsIDB4NjYsIDB4NDMsIDB4MDIsIDB4QTMsIDB4NjMsIDB4NDYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4RjIsIDB4RUUsIDB4MDMsIDB4NjAsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4RjcsIDB4MDEsIDB4MEMsIDB4QUMsIDB4MDYsIDB4RkEsIDB4NDYsIDB4NDksIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjEsIDB4QjUsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTEsIDB4MDMsIDB4MTgsIDB4NjAsIDB4MTMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MUIsCisJIDB4MDAsIDB4NjAsIDB4QTAsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4QUIsIDB4RkMsIDB4NjYsIDB4NDUsCisJIDB4MjksIDB4NDQsIDB4MDcsIDB4RkEsIDB4MjksIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MkMsIDB4RkEsCisJIDB4MkQsIDB4RjgsIDB4QUUsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzIsIDB4RkEsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4MzMsIDB4RkEsCisJIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzQsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4MTgsIDB4NjcsIDB4MEUsIDB4RkEsIDB4NjYsIDB4NDEsCisJIDB4MjksIDB4NDYsIDB4OTIsIDB4RjAsIDB4MkMsIDB4NjAsIDB4MjYsIDB4NjMsIDB4NDcsIDB4RDMsIDB4NjEsIDB4NDYsIDB4MDAsIDB4N0UsIDB4MTMsIDB4RkEsCisJIDB4MDIsIDB4NjMsIDB4M0YsIDB4RkMsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4NjYsIDB4NDEsIDB4MDAsIDB4RjQsIDB4MTgsIDB4NjAsIDB4MTIsIDB4RjMsCisJIDB4MDksIDB4RkEsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjEsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4QTAsIDB4MDEsIDB4OTUsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MUUsIDB4RkIsIDB4NUEsIDB4REIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDMsIDB4MEIsIDB4NjAsCisJIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsIDB4MDQsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsCisJIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDAsIDB4QTEsIDB4REQsIDB4RDksIDB4ODQsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RkIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4NjAsIDB4MDEsIDB4N0MsIDB4QTAsIDB4OUMsCisJIDB4MDYsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NzAsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsCisJIDB4NzAsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzAsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTksIDB4RkIsIDB4REUsIDB4NjAsIDB4QTgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NzAsIDB4RjMsIDB4NzEsIDB4RjMsIDB4MDAsIDB4QTgsIDB4NjAsIDB4ODgsIDB4NDMsIDB4MDMsIDB4RTAsIDB4ODMsIDB4NUYsIDB4MDMsIDB4Q0IsIDB4ODMsCisJIDB4ODcsIDB4RjMsIDB4NzIsIDB4RjEsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NDcsIDB4NjQsIDB4NDUsIDB4MjcsIDB4NDYsIDB4NzYsIDB4RjQsIDB4MTIsIDB4RjIsCisJIDB4MzMsIDB4MTgsIDB4RDQsIDB4ODAsIDB4MDIsIDB4NjQsIDB4MzAsIDB4MDcsIDB4MjMsIDB4RkEsIDB4MkEsIDB4RjIsIDB4MEUsIDB4RjIsIDB4MEMsIDB4QjAsCisJIDB4MDIsIDB4RjAsIDB4MEMsIDB4MDIsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4RTcsIDB4MDEsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsCisJIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4REMsIDB4ODQsCisJIDB4OEYsIDB4RkIsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4Q0UsIDB4RkUsIDB4MjUsIDB4NjAsIDB4RTQsIDB4NjQsIDB4RTUsIDB4NjAsCisJIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsIDB4QzksIDB4MDEsIDB4MjcsIDB4NDQsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NDcsIDB4QzUsIDB4MUYsCisJIDB4MjgsIDB4NDMsIDB4Q0IsIDB4ODMsIDB4ODcsIDB4RjMsIDB4MUEsIDB4MEUsIDB4MDIsIDB4QTQsIDB4NDAsIDB4NEMsIDB4NDMsIDB4NDgsIDB4MkMsIDB4NDYsCisJIDB4MjIsIDB4RjIsIDB4NzIsIDB4RjEsIDB4QUMsIDB4ODYsIDB4MTIsIDB4RjIsIDB4MEMsIDB4MDMsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDksIDB4MDcsCisJIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkMsIDB4NDYsCisJIDB4QTIsIDB4RkMsIDB4MkMsIDB4NDQsIDB4MDIsIDB4QTQsIDB4MjgsIDB4NDMsIDB4NDAsIDB4NEMsIDB4RTgsIDB4MUYsIDB4OEIsIDB4MDEsIDB4MDEsIDB4NjMsCisJIDB4NjUsIDB4RjMsIDB4QUIsIDB4RjMsIDB4MDAsIDB4QkQsIDB4QUMsIDB4ODEsIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsIDB4QjcsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4QzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDMsIDB4NUIsIDB4RkQsIDB4M0UsIDB4NjMsIDB4MTgsIDB4NjAsIDB4OTQsIDB4NjEsIDB4MDAsIDB4NjQsCisJIDB4NTksIDB4REIsIDB4RkUsIDB4MUYsIDB4NzAsIDB4RkIsIDB4NzEsIDB4RkIsIDB4MTgsIDB4NjAsIDB4REMsIDB4NjUsIDB4QTUsIDB4REYsIDB4NUEsIDB4REYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4NzAsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDMsIDB4MDIsCisJIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4NjYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MUYsIDB4RjIsIDB4NjUsIDB4NDYsCisJIDB4NjQsIDB4NDUsIDB4NUIsIDB4RjEsIDB4RTAsIDB4ODQsIDB4NzIsIDB4RjEsIDB4QzAsIDB4ODQsIDB4QzAsIDB4ODQsIDB4MTIsIDB4RkEsIDB4MkMsIDB4RjIsCisJIDB4NzAsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MzQsIDB4MDAsIDB4MDAsIDB4QTgsIDB4MTMsIDB4NjAsIDB4NDMsIDB4RjMsIDB4MzYsIDB4MDMsCisJIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDMsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4QTIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MEQsIDB4MDAsCisJIDB4OTEsIDB4RjMsIDB4OEYsIDB4RjMsIDB4REMsIDB4ODMsIDB4RDEsIDB4ODAsIDB4OTEsIDB4RkQsIDB4MEMsIDB4MDMsIDB4OEIsIDB4RjMsIDB4Q0MsIDB4ODMsCisJIDB4RDgsIDB4QTAsIDB4OEYsIDB4RkQsIDB4MDcsIDB4MDQsIDB4RDQsIDB4RkUsIDB4MDUsIDB4MDAsIDB4RDEsIDB4ODAsIDB4OTIsIDB4RjMsIDB4MDIsIDB4MDMsCisJIDB4REMsIDB4ODQsIDB4OTIsIDB4RkIsIDB4MUUsIDB4NjAsIDB4REEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjUsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTMsIDB4RkYsIDB4REYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NjEsIDB4NDYsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsIDB4NEIsIDB4MDAsIDB4ODAsIDB4NjcsCisJIDB4QjQsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MkEsIDB4RjIsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4MEMsIDB4QjAsIDB4QTIsIDB4RkYsIDB4MTcsIDB4MDMsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsIDB4NjAsIDB4NDAsCisJIDB4RjAsIDB4MzcsIDB4MEQsIDB4MDAsIDB4OEYsIDB4RjMsIDB4OTEsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4RDEsIDB4ODAsIDB4OEYsIDB4RkQsIDB4MEMsIDB4MDMsCisJIDB4OEIsIDB4RjMsIDB4REMsIDB4ODMsIDB4RDgsIDB4QTAsIDB4OTEsIDB4RkQsIDB4MDcsIDB4MDQsIDB4RDQsIDB4RkUsIDB4MDUsIDB4MDAsIDB4RDEsIDB4ODAsCisJIDB4OTIsIDB4RjMsIDB4MDIsIDB4MDMsIDB4REMsIDB4ODQsIDB4OTIsIDB4RkIsIDB4MDcsIDB4RjAsIDB4MEEsIDB4RjIsIDB4QTMsIDB4RkYsIDB4NjQsIDB4NDUsCisJIDB4MkYsIDB4MUIsIDB4NjYsIDB4NDEsIDB4NjUsIDB4NDYsIDB4MDIsIDB4RjAsIDB4NjEsIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsCisJIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDEsIDB4NjEsIDB4NDQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MTYsIDB4MDAsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjEsIDB4MkEsIDB4RjIsIDB4M0UsIDB4RjIsIDB4MEMsIDB4QjAsIDB4MDEsIDB4QjAsCisJIDB4MDUsIDB4MDMsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsCisJIDB4REYsIDB4NjAsIDB4MkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDcsIDB4RjAsIDB4MkIsIDB4RjIsIDB4MkEsIDB4RjIsIDB4NjAsIDB4NDEsIDB4NDQsIDB4NDksCisJIDB4NjAsIDB4NDUsIDB4QTQsIDB4M0EsIDB4MEQsIDB4MDAsIDB4NjEsIDB4NDAsIDB4QzAsIDB4M0IsIDB4NzksIDB4MDAsIDB4QTksIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4QTksIDB4NDYsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4NzMsIDB4MDAsIDB4MjAsIDB4QkMsIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsCisJIDB4QTksIDB4NDYsIDB4MDYsIDB4RjAsIDB4QTksIDB4NDYsIDB4NjUsIDB4NDAsIDB4MTAsIDB4MkIsIDB4NkMsIDB4MDAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MzUsIDB4MDAsIDB4NjUsIDB4NDAsIDB4QTQsIDB4M0EsIDB4NjMsIDB4MDAsIDB4MjksIDB4NDUsIDB4NjUsIDB4NDYsIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDIsIDB4NzYsIDB4MDAsIDB4RTAsIDB4NjAsIDB4RUEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDksIDB4RjIsCisJIDB4MkEsIDB4RjAsIDB4MDAsIDB4QTgsIDB4MjAsIDB4NjcsIDB4MDIsIDB4MDMsIDB4QjAsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MEUsIDB4RjIsIDB4MDIsIDB4RjAsCisJIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4MDgsIDB4MDAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsCisJIDB4MDIsIDB4MDIsIDB4REMsIDB4ODQsIDB4OEYsIDB4RkIsIDB4M0UsIDB4RjIsIDB4QTMsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsCisJIDB4MDIsIDB4MDIsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MTYsIDB4MDAsIDB4MTAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4REYsIDB4NjUsIDB4QTQsIDB4OUUsIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsIDB4QTIsIDB4RkYsIDB4MDQsIDB4NjQsIDB4MEMsIDB4NjAsCisJIDB4NkUsIDB4RkIsIDB4MjksIDB4NDQsIDB4NUEsIDB4REIsIDB4NzAsIDB4RjMsIDB4QzEsIDB4RkUsIDB4RDQsIDB4RkUsIDB4ODYsIDB4RjEsIDB4QTMsIDB4RkYsCisJIDB4RDAsIDB4ODAsIDB4REMsIDB4ODQsIDB4MDEsIDB4MDcsIDB4NzAsIDB4RkIsIDB4QTksIDB4NDYsIDB4NzYsIDB4RjIsIDB4QTksIDB4NDYsIDB4NjQsIDB4MTgsCisJIDB4QTksIDB4NDYsIDB4MDIsIDB4RjAsIDB4QTksIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsCisJIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4QjEsIDB4ODQsIDB4QTIsIDB4REIsIDB4RTEsIDB4NjAsCisJIDB4MDEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4RkEsIDB4MDEsIDB4RkYsIDB4NjAsIDB4RUYsIDB4NjQsIDB4QTAsIDB4ODQsCisJIDB4QTksIDB4NDYsIDB4MDYsIDB4RkEsIDB4QTksIDB4NDYsIDB4NjUsIDB4NDEsIDB4NzAsIDB4RjMsIDB4MjksIDB4NDUsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsCisJIDB4NzAsIDB4RkIsIDB4NjUsIDB4NDYsIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MzYsIDB4MDIsIDB4NjEsIDB4NDAsCisJIDB4QTQsIDB4M0EsIDB4RTUsIDB4MDEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4ODMsIDB4MDMsIDB4MDIsIDB4NjAsIDB4NDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjYsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzMsIDB4RjgsIDB4NjgsIDB4RjEsIDB4MzQsIDB4RjgsCisJIDB4QTksIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4ODUsIDB4RjAsIDB4QTksIDB4NDYsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RjgsIDB4QUUsIDB4RjgsCisJIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsIDB4RkYsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4M0YsIDB4RkEsIDB4MjksIDB4NDQsCisJIDB4MDcsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MzUsIDB4MDAsIDB4ODAsIDB4NjcsIDB4QjQsIDB4ODMsIDB4MkEsIDB4RjIsCisJIDB4MDksIDB4NjAsIDB4MDgsIDB4NjUsIDB4MEMsIDB4QjAsIDB4MDksIDB4RjAsIDB4MEMsIDB4MDIsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4OUYsIDB4MTgsCisJIDB4NjQsIDB4NDYsIDB4M0UsIDB4RjIsIDB4QTIsIDB4RkYsIDB4MDEsIDB4QjAsIDB4MUUsIDB4NjAsIDB4RTYsIDB4NjEsIDB4MDIsIDB4MDIsIDB4MUUsIDB4NjAsCisJIDB4Q0UsIDB4NjEsIDB4MDIsIDB4RjIsIDB4MEUsIDB4RjAsIDB4RDQsIDB4ODAsIDB4MDksIDB4RjQsIDB4MDYsIDB4MDIsIDB4OEYsIDB4RjMsIDB4NjQsIDB4NDAsCisJIDB4RjAsIDB4MzcsIDB4MDIsIDB4MDAsIDB4REMsIDB4ODQsIDB4OEYsIDB4RkIsIDB4NjYsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4MDIsCisJIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NUEsIDB4REQsIDB4MDgsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4QTMsIDB4RkYsIDB4QTksIDB4NDYsIDB4MDIsIDB4RjAsIDB4QTksIDB4NDYsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsIDB4QTEsIDB4ODQsCisJIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDMsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDYsIDB4NDUsIDB4M0YsIDB4RjIsIDB4MDUsIDB4NDgsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDEsIDB4NjYsIDB4NDQsIDB4MEIsIDB4MDMsIDB4MEUsIDB4QTEsIDB4MDAsIDB4RjIsIDB4NDIsIDB4RkUsIDB4QUMsIDB4ODYsIDB4MDEsIDB4RjIsCisJIDB4MUYsIDB4MDMsIDB4N0YsIDB4QjUsIDB4RDUsIDB4ODEsIDB4NjYsIDB4NDQsIDB4RjcsIDB4MDcsIDB4MjUsIDB4NDYsIDB4MDUsIDB4RjAsIDB4MDYsIDB4RkEsCisJIDB4MDUsIDB4RkEsIDB4RDAsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MTMsIDB4MDMsIDB4NjAsIDB4NDYsIDB4MDEsIDB4RjAsIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODQsCisJIDB4MDEsIDB4RkEsIDB4MDAsIDB4RjAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4RkEsIDB4NDQsIDB4NDUsIDB4QTIsIDB4RkYsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsCisJIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTMsIDB4RkYsIDB4MDgsIDB4NDUsIDB4MjUsIDB4NDYsIDB4MDEsIDB4NjQsIDB4MDIsIDB4RkEsIDB4MDIsIDB4RkUsCisJIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MDcsIDB4RjAsIDB4MTAsIDB4QjAsIDB4MTAsIDB4QUMsIDB4M0EsIDB4MDMsIDB4MjMsIDB4RkEsCisJIDB4ODAsIDB4NjcsIDB4QjAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4NjQsIDB4NDYsIDB4MDIsIDB4RjAsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjEsCisJIDB4QTEsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTEsIDB4ODIsIDB4MDcsIDB4QjQsIDB4MDEsIDB4NjEsCisJIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4MTgsIDB4NjAsIDB4OTYsIDB4NjUsIDB4NDYsIDB4RDEsIDB4RkYsIDB4RkYsCisJIDB4QjEsIDB4ODQsIDB4QTIsIDB4REIsIDB4OUYsIDB4RjIsIDB4MjUsIDB4NDYsIDB4RTEsIDB4ODEsIDB4NUIsIDB4RjEsIDB4NzIsIDB4RjEsIDB4QzEsIDB4ODEsCisJIDB4QzEsIDB4ODEsIDB4OTIsIDB4RkEsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjEsIDB4RDEsIDB4ODAsIDB4MEUsIDB4RjIsCisJIDB4MDUsIDB4MDIsIDB4OEYsIDB4RjMsIDB4MjAsIDB4QjAsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4MDIsIDB4OEYsIDB4RkIsIDB4QTMsIDB4RkYsIDB4NDgsIDB4RkUsCisJIDB4MDcsIDB4MDAsIDB4MEUsIDB4RjIsIDB4MDgsIDB4RkUsIDB4RjAsIDB4N0YsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDAsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjAsIDB4QzUsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4NTcsIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4ODAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4QUIsIDB4RjEsIDB4MTksIDB4RjgsCisJIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDAsIDB4NjAsIDB4ODAsIDB4NjQsIDB4MEUsIDB4RkEsIDB4ODcsIDB4RjEsIDB4MDcsIDB4RjgsIDB4NjcsIDB4NDQsCisJIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4RTQsIDB4NjAsIDB4NjUsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MjUsIDB4RkIsIDB4RTIsIDB4NjAsCisJIDB4QTAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkIsIDB4RkIsIDB4MTgsIDB4NjAsIDB4RTYsIDB4NjMsIDB4NjUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MTAsIDB4NjAsCisJIDB4NTgsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjQsIDB4QkQsIDB4REIsIDB4MDYsIDB4NjQsIDB4QTMsIDB4REIsIDB4RTksIDB4NjAsIDB4QjIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTksIDB4NjAsIDB4NTgsIDB4NEQsIDB4QkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjYsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzMsIDB4RjgsCisJIDB4NjgsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MTMsIDB4NjAsIDB4NDUsIDB4RjEsIDB4MDEsIDB4NjQsIDB4NjQsIDB4NDAsIDB4RkUsIDB4MjYsIDB4MTAsIDB4QkMsCisJIDB4MzIsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MTAsIDB4QkMsIDB4MjAsIDB4QkMsIDB4MDQsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QjQsIDB4ODQsCisJIDB4MTcsIDB4NjAsIDB4MjIsIDB4RkIsIDB4MTMsIDB4NjAsIDB4NDQsIDB4RjEsIDB4MjYsIDB4NjAsIDB4MTYsIDB4NjQsIDB4MDIsIDB4MTgsIDB4MjYsIDB4NjAsCisJIDB4MzgsIDB4NjQsIDB4MTYsIDB4NjAsIDB4QkYsIDB4RkIsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RkIsIDB4MkMsIDB4NjAsIDB4ODQsIDB4NjEsIDB4MTMsIDB4NjAsCisJIDB4OTcsIDB4RjMsIDB4MkQsIDB4NjAsIDB4NUUsIDB4NjUsIDB4RkUsIDB4QTQsIDB4RTAsIDB4ODQsIDB4MDIsIDB4MDUsIDB4NjcsIDB4NDQsIDB4MjEsIDB4MDAsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4MTYsIDB4NjAsIDB4NTUsIDB4RjMsIDB4QTUsIDB4RDEsIDB4REEsIDB4ODUsIDB4QTAsIDB4ODMsIDB4MTYsIDB4NjAsCisJIDB4NTEsIDB4RkQsIDB4QTUsIDB4RDEsIDB4MkMsIDB4NjAsIDB4QTAsIDB4NjIsIDB4QTAsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkMsIDB4NjAsIDB4ODQsIDB4NjEsCisJIDB4NTAsIDB4NjAsIDB4MDAsIDB4N0MsIDB4MDAsIDB4NjAsIDB4RjIsIDB4NjUsIDB4RTIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTYsIDB4NjAsIDB4NTMsIDB4RjEsIDB4NTksIDB4RDksIDB4MkMsIDB4NjAsIDB4N0UsIDB4NjUsIDB4RDUsIDB4ODQsIDB4REQsIDB4N0YsIDB4QTUsIDB4REIsCisJIDB4NjUsIDB4NDQsIDB4MTYsIDB4NjAsIDB4QzQsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RDQsIDB4RkIsIDB4NzksIDB4MDAsIDB4MTYsIDB4NjAsIDB4NTQsIDB4RjMsCisJIDB4MkMsIDB4NjAsIDB4QTAsIDB4NjIsIDB4RkQsIDB4QTAsIDB4QTIsIDB4RDMsIDB4RUUsIDB4MDMsIDB4NjAsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4NjMsIDB4MEIsIDB4MDAsIDB4MDQsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjMsIDB4MDcsIDB4MDAsIDB4MTAsIDB4MkEsIDB4MDIsIDB4MDAsCisJIDB4MDQsIDB4NjMsIDB4MDMsIDB4MDAsIDB4MjAsIDB4MkEsIDB4MDEsIDB4MDAsIDB4MDUsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksCisJIDB4NTksIDB4REQsIDB4MTYsIDB4NjAsIDB4NTQsIDB4RjMsIDB4MTYsIDB4NjAsIDB4NTEsIDB4RjMsIDB4RkUsIDB4QTAsIDB4NDAsIDB4NEMsIDB4RDMsIDB4MDMsCisJIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsIDB4NDEsIDB4NEEsIDB4MkMsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjMsCisJIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDMsIDB4MDAsIDB4MDEsIDB4NjMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDIsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkMsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDUsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsCisJIDB4NTksIDB4RDksIDB4NTksIDB4REQsIDB4MkEsIDB4NDQsIDB4NTEsIDB4OTMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTAsIDB4REQsIDB4MTYsIDB4NjAsCisJIDB4NTQsIDB4RjMsIDB4MTYsIDB4NjAsIDB4NTIsIDB4RjMsIDB4RkYsIDB4QTAsIDB4NDAsIDB4NEMsIDB4OUQsIDB4MDMsIDB4NTksIDB4REYsIDB4NDEsIDB4NEEsCisJIDB4MkMsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4MkMsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDEsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4MkMsIDB4NDAsIDB4MDQsIDB4MkEsIDB4MDUsIDB4MDAsIDB4MDIsIDB4NjMsIDB4NjMsIDB4NDcsIDB4QjQsIDB4ODMsIDB4NTksIDB4RDksIDB4NTksIDB4REQsCisJIDB4MkEsIDB4NDQsIDB4NTEsIDB4OTMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsIDB4QTAsIDB4REQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsCisJIDB4Q0IsIDB4RjMsIDB4Q0MsIDB4RjEsIDB4MDAsIDB4NjMsIDB4QzAsIDB4ODcsIDB4Q0QsIDB4RjEsIDB4NUEsIDB4RkQsIDB4QzAsIDB4ODUsIDB4NjUsIDB4NDcsCisJIDB4QzQsIDB4ODQsIDB4MDcsIDB4QjUsIDB4MTgsIDB4NjAsIDB4RTIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4RTIsIDB4NjAsIDB4QTksIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDgsIDB4NjAsIDB4MTIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NTcsIDB4RjUsIDB4MDAsIDB4NjQsIDB4OTQsIDB4RkIsCisJIDB4OTUsIDB4RkIsIDB4OTYsIDB4RkIsIDB4NzQsIDB4RkIsIDB4NjUsIDB4RjMsIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4OTMsIDB4QzcsIDB4RjMsIDB4RUQsIDB4RTIsIDB4Q0MsIDB4ODQsIDB4NUEsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MTMsIDB4RkIsIDB4RTIsIDB4NjAsIDB4QzcsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsCisJIDB4MjQsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsCisJIDB4NjcsIDB4NDQsIDB4MTYsIDB4NjAsIDB4QzEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RDEsIDB4RkIsIDB4MTYsIDB4NjAsIDB4RjYsIDB4RjksIDB4MkQsIDB4NjAsCisJIDB4ODYsIDB4NjUsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDUsIDB4MDAsIDB4RkYsIDB4NjAsIDB4RkYsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzUsIDB4RkQsIDB4MDgsIDB4MDAsIDB4MkUsIDB4NjAsCisJIDB4MUUsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzUsIDB4RkQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RkYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4NkUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MTgsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsCisJIDB4MDAsIDB4RjQsIDB4NjUsIDB4RjEsIDB4MDYsIDB4RjgsIDB4MTcsIDB4NjAsIDB4MjIsIDB4RjMsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjEsIDB4RkIsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4NjAsIDB4NDQsIDB4QTQsIDB4ODQsIDB4NjAsIDB4NDcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsCisJIDB4MDcsIDB4RkEsIDB4MkQsIDB4NjAsIDB4N0UsIDB4NjQsIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTcsIDB4RjUsIDB4M0YsIDB4RkMsIDB4NUEsIDB4RjMsIDB4QzcsIDB4RjEsIDB4QUMsIDB4ODMsCisJIDB4MDEsIDB4NjQsIDB4MDIsIDB4MDIsIDB4NkIsIDB4RkIsIDB4NjQsIDB4NDMsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4Q0YsIDB4ODMsCisJIDB4NzIsIDB4RjMsIDB4NUEsIDB4RkQsIDB4REMsIDB4ODQsIDB4NzIsIDB4RkIsIDB4NUMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4NUMsIDB4RkIsCisJIDB4MDMsIDB4MDMsIDB4RTMsIDB4NjAsIDB4QkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjQsIDB4NUMsIDB4RkIsIDB4QTIsIDB4NEMsIDB4MjAsIDB4MjcsCisJIDB4RjgsIDB4MDEsIDB4NDYsIDB4NjAsIDB4NTAsIDB4NjUsIDB4NzIsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDQsIDB4NUQsIDB4RkIsCisJIDB4NDAsIDB4NDgsIDB4OTQsIDB4RjMsIDB4NUUsIDB4RkIsIDB4NDAsIDB4NEEsIDB4OTUsIDB4RjMsIDB4OTYsIDB4RjMsIDB4NDAsIDB4NEMsIDB4NjAsIDB4NDEsCisJIDB4NjUsIDB4RjEsIDB4NDAsIDB4NjMsIDB4QUQsIDB4ODAsIDB4RjAsIDB4QTMsIDB4MDksIDB4MDIsIDB4M0MsIDB4MDMsIDB4MkMsIDB4NDEsIDB4MkEsIDB4NDQsCisJIDB4NDAsIDB4NEMsIDB4MjgsIDB4NDQsIDB4NDAsIDB4NEEsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDgsIDB4RjQsIDB4MDEsIDB4RDEsIDB4ODAsIDB4MDEsIDB4MDIsCisJIDB4MzEsIDB4MDQsIDB4MTAsIDB4QTMsIDB4ODAsIDB4NjAsIDB4MDAsIDB4NjUsIDB4QTUsIDB4ODAsIDB4Q0YsIDB4ODMsIDB4MDgsIDB4MDIsIDB4MjgsIDB4NDQsCisJIDB4NjAsIDB4ODgsIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjUsIDB4MDEsIDB4RTcsIDB4QTMsCisJIDB4NjQsIDB4NDQsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjIsIDB4MDIsIDB4MDIsIDB4MDAsIDB4NjEsIDB4MUMsIDB4MDAsIDB4RTAsIDB4ODQsIDB4REUsIDB4ODIsCisJIDB4RkQsIDB4MDQsIDB4NDIsIDB4RkUsIDB4RjgsIDB4ODQsIDB4NjIsIDB4NDUsIDB4QzcsIDB4ODMsIDB4NjAsIDB4NDUsIDB4MDIsIDB4RkUsIDB4RDUsIDB4ODQsCisJIDB4MDIsIDB4MDUsIDB4MDEsIDB4MDUsIDB4NjEsIDB4NDQsIDB4Q0YsIDB4ODMsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MDMsIDB4MjgsIDB4NDQsIDB4NjAsIDB4ODgsCisJIDB4MkEsIDB4NDQsIDB4NzAsIDB4OEEsIDB4MkMsIDB4NDQsIDB4NzAsIDB4OEMsIDB4RjEsIDB4ODEsIDB4RjEsIDB4MDEsIDB4Q0UsIDB4ODIsIDB4RTksIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4RjEsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDAsIDB4QTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDMsIDB4NzMsIDB4NDAsIDB4NUQsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDcsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4NUUsIDB4RjMsIDB4M0YsIDB4QjUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QjQsIDB4ODQsIDB4NjEsIDB4NDUsIDB4RDQsIDB4ODQsIDB4QzAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODEsIDB4NjQsIDB4NDQsIDB4NzMsIDB4NDUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODUsIDB4NjEsIDB4NDQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MDMsIDB4NjAsIDB4NTMsIDB4RDQsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4NzQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDEsIDB4QjQsIDB4NzQsIDB4RkIsIDB4MTMsIDB4NjAsIDB4MDYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4MDAsIDB4MzYsIDB4MDAsIDB4M0IsIDB4QTIsIDB4REIsIDB4RTksIDB4NjAsIDB4RkIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDksIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4M0EsIDB4MUMsIDB4MDAsIDB4NjAsIDB4NDMsIDB4MDAsIDB4MzYsIDB4MUMsIDB4MDAsIDB4RTAsIDB4QTAsIDB4REEsIDB4ODUsCisJIDB4MTYsIDB4MDcsIDB4MjYsIDB4NjAsIDB4MTYsIDB4NjEsIDB4QTEsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RDMsIDB4ODAsIDB4Q0IsIDB4ODMsIDB4MEYsIDB4MDIsCisJIDB4MDcsIDB4MEUsIDB4NTksIDB4RDMsIDB4QTUsIDB4RDAsIDB4REEsIDB4ODUsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDIsIDB4RjksIDB4MUYsCisJIDB4MTIsIDB4MUUsIDB4QTUsIDB4RDAsIDB4NTksIDB4RDMsIDB4RkYsIDB4RkYsIDB4OTAsIDB4ODAsIDB4RkYsIDB4MjIsIDB4MEMsIDB4MDAsIDB4RTQsIDB4NjAsCisJIDB4NjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4NDQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDMsIDB4MDAsCisJIDB4MjYsIDB4NjAsIDB4MzgsIDB4NjQsIDB4MDIsIDB4MDAsIDB4MjYsIDB4NjAsIDB4MTYsIDB4NjQsIDB4MTYsIDB4NjAsIDB4Q0YsIDB4RkIsIDB4MjYsIDB4NDYsCisJIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsCisJIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NjYsIDB4RjEsIDB4MzIsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzMsIDB4RjgsCisJIDB4NjgsIDB4RjEsIDB4MzQsIDB4RjgsIDB4MDAsIDB4NjUsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4REMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjEsIDB4NDQsCisJIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4NTAsIDB4NjMsIDB4MkEsIDB4RkMsIDB4QUIsIDB4RjMsIDB4MTksIDB4RkEsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsCisJIDB4ODcsIDB4RjMsIDB4MDcsIDB4RkEsIDB4MDAsIDB4RjQsIDB4NjUsIDB4RjEsIDB4MDYsIDB4RjgsIDB4MTcsIDB4NjAsIDB4MjIsIDB4RjMsIDB4MTUsIDB4NjAsCisJIDB4REQsIDB4RjEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4QjcsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MDQsIDB4QkMsIDB4NjAsIDB4NDcsIDB4MDcsIDB4RkEsCisJIDB4MkQsIDB4NjAsIDB4QTYsIDB4NjUsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4RTcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjMsIDB4MkUsIDB4NjAsCisJIDB4MUUsIDB4NjMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NjcsIDB4NDMsIDB4MTYsIDB4NjAsIDB4RDUsIDB4RkQsIDB4MkQsIDB4NjAsIDB4OUUsIDB4NjQsCisJIDB4NDAsIDB4NDgsIDB4MTAsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkMsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzEsIDB4RkUsIDB4MjAsIDB4NDQsIDB4ODAsIDB4MjYsIDB4MTEsIDB4MDAsCisJIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjQsIDB4OTQsIDB4RkIsIDB4OTUsIDB4RkIsIDB4OTYsIDB4RkIsIDB4NzQsIDB4RkIsIDB4NjUsIDB4RjMsCisJIDB4MDAsIDB4NzUsIDB4MDAsIDB4NzIsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4OTMsIDB4QzcsIDB4RjMsIDB4RUQsIDB4RTIsIDB4Q0MsIDB4ODQsCisJIDB4NUEsIDB4RkIsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTIsIDB4RkIsCisJIDB4NUEsIDB4REIsIDB4MDAsIDB4NjQsIDB4NzIsIDB4RkIsIDB4NzQsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4NjMsIDB4MTgsIDB4NjAsCisJIDB4OTQsIDB4NjEsIDB4NTksIDB4RDEsIDB4NjEsIDB4NDYsIDB4MDcsIDB4MUIsIDB4RkMsIDB4MUYsIDB4MkQsIDB4NjAsIDB4QzgsIDB4NjIsIDB4QTIsIDB4REYsCisJIDB4MDEsIDB4NjUsIDB4MDAsIDB4NjEsIDB4MTYsIDB4MDAsIDB4MTgsIDB4NjAsIDB4RDYsIDB4NjEsIDB4NDksIDB4RDEsIDB4Q0IsIDB4ODMsIDB4RkQsIDB4MTgsCisJIDB4NjMsIDB4NDEsIDB4MDQsIDB4QTEsIDB4NjEsIDB4NDUsIDB4NjYsIDB4NDMsIDB4MkQsIDB4NjAsIDB4QzgsIDB4NjQsIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsCisJIDB4QkQsIDB4RDEsIDB4QTAsIDB4RDksIDB4Q0QsIDB4ODEsIDB4MjAsIDB4RkUsIDB4RjksIDB4MDIsIDB4NjYsIDB4NDQsIDB4MTgsIDB4NjAsIDB4OTYsIDB4N0MsCisJIDB4RDAsIDB4ODEsIDB4NUEsIDB4RjMsIDB4QzcsIDB4RjEsIDB4MkQsIDB4NjAsIDB4QzYsIDB4NjMsIDB4MDAsIDB4QTAsIDB4NjQsIDB4NUYsIDB4QkQsIDB4REIsCisJIDB4MEYsIDB4NjAsIDB4NkQsIDB4RjEsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MTgsIDB4MDEsIDB4QjksIDB4NjEsIDB4NDQsIDB4NjAsIDB4RkUsIDB4QTMsIDB4REIsCisJIDB4RkMsIDB4QTMsIDB4NjUsIDB4NDQsIDB4MDMsIDB4QTQsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTcsIDB4NjAsCisJIDB4MjMsIDB4RkIsIDB4Q0QsIDB4ODEsIDB4MjgsIDB4RDMsIDB4NUEsIDB4ODgsIDB4REMsIDB4ODMsIDB4MzEsIDB4MTgsIDB4RkIsIDB4MDMsIDB4NjEsIDB4NDAsCisJIDB4N0YsIDB4M0EsIDB4MDYsIDB4MDAsIDB4MTcsIDB4NjAsIDB4MjMsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsIDB4NUQsIDB4RDgsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MDgsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MTcsIDB4NjAsCisJIDB4MjMsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4MDAsIDB4RjQsIDB4NjAsIDB4RkUsIDB4QkYsIDB4RDMsIDB4NUQsIDB4REEsCisJIDB4RkYsIDB4QjQsIDB4MDAsIDB4N0YsIDB4MTIsIDB4MDMsIDB4REYsIDB4ODMsIDB4NjEsIDB4NDAsIDB4N0YsIDB4M0EsIDB4MEEsIDB4MDAsIDB4MjAsIDB4RkUsCisJIDB4NjAsIDB4NDUsIDB4MTcsIDB4NjAsIDB4MjMsIDB4RjMsIDB4MDMsIDB4NjEsIDB4N0MsIDB4QTQsIDB4QTIsIDB4REIsIDB4NjUsIDB4NDQsIDB4MDAsIDB4RjQsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NUQsIDB4RDgsIDB4RUYsIDB4MDIsIDB4MjAsIDB4RkUsIDB4Q0IsIDB4MDEsIDB4MTcsIDB4NjAsCisJIDB4MjMsIDB4RjEsIDB4RkQsIDB4QTEsIDB4RkYsIDB4QjEsIDB4QzEsIDB4ODMsIDB4QTIsIDB4REQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjcsIDB4NUMsCisJIDB4MTQsIDB4NjAsIDB4MjYsIDB4NjEsIDB4QTEsIDB4RDMsIDB4QTUsIDB4RDksIDB4MTAsIDB4MTgsIDB4NjAsIDB4NDMsIDB4MkQsIDB4NjAsIDB4RUUsIDB4NjQsCisJIDB4QTUsIDB4REIsIDB4NjAsIDB4RkUsIDB4QTAsIDB4REQsIDB4MjAsIDB4RkUsIDB4REMsIDB4ODQsIDB4Q0YsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NTksIDB4RDEsCisJIDB4REMsIDB4ODQsIDB4NjAsIDB4RkUsIDB4QTAsIDB4RDksIDB4MjAsIDB4RkUsIDB4RkEsIDB4MUYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4REMsIDB4RjEsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDIsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDQsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MkEsIDB4RUYsIDB4QjQsIDB4MTUsIDB4NjAsIDB4REQsIDB4RkIsIDB4MDcsIDB4QjQsIDB4NjAsIDB4RkUsCisJIDB4MTcsIDB4NjAsIDB4MTAsIDB4RkIsIDB4MjAsIDB4RkUsIDB4MDcsIDB4N0MsIDB4MTUsIDB4NjAsIDB4REMsIDB4RjksIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjAsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MEEsIDB4MDAsIDB4MEEsIDB4NjAsIDB4NzcsIDB4RjEsIDB4NTAsIDB4RjMsIDB4MkUsIDB4NjAsIDB4MzEsIDB4NjMsCisJIDB4NjAsIDB4RkUsIDB4QkQsIDB4RDksIDB4NjAsIDB4NDcsIDB4QTMsIDB4REIsIDB4MjAsIDB4RkUsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsCisJIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MjQsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MUMsIDB4MDMsIDB4RjIsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MDAsIDB4NjAsIDB4NDgsIDB4NjEsCisJIDB4MjgsIDB4NDQsIDB4NTksIDB4REEsIDB4MDMsIDB4NjQsIDB4MzgsIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsCisJIDB4MzksIDB4NDQsIDB4NTksIDB4REEsIDB4MDYsIDB4NjQsIDB4MjMsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4NEYsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4NjgsIDB4NjEsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NDcsIDB4MDMsIDB4RjIsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MjQsIDB4RkEsCisJIDB4MDIsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDYsIDB4NEEsIDB4MzgsIDB4NDQsIDB4NTQsIDB4OTQsIDB4MDMsIDB4NjQsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDAsCisJIDB4MDYsIDB4NjMsIDB4NEEsIDB4NjEsIDB4MzgsIDB4NDYsIDB4QkQsIDB4RDAsIDB4Q0MsIDB4ODQsIDB4MkEsIDB4NDYsIDB4NTksIDB4RDgsIDB4RkEsIDB4MDIsCisJIDB4MDYsIDB4MDAsIDB4REEsIDB4ODEsIDB4MzgsIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MDUsIDB4NjMsCisJIDB4MjgsIDB4NDQsIDB4MDIsIDB4QTgsIDB4MjUsIDB4RkEsIDB4MDcsIDB4MDIsIDB4MDMsIDB4NjQsIDB4MzksIDB4NDMsIDB4QkQsIDB4RDEsIDB4Q0MsIDB4ODQsCisJIDB4NTksIDB4RDgsIDB4RkMsIDB4MDIsIDB4MDgsIDB4NjMsIDB4MjgsIDB4NDQsIDB4MDMsIDB4QTgsIDB4MTYsIDB4NjAsIDB4ODIsIDB4RjMsIDB4MEYsIDB4MDMsCisJIDB4RTgsIDB4ODUsIDB4QzcsIDB4ODUsIDB4NjAsIDB4NDMsIDB4RkUsIDB4QTMsIDB4MkQsIDB4NjAsIDB4MDYsIDB4NjQsIDB4NTgsIDB4RDEsIDB4RDksIDB4ODEsCisJIDB4QTEsIDB4RDgsIDB4N0UsIDB4MkEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4RjgsIDB4MUYsIDB4NjUsIDB4NDMsIDB4MkEsIDB4NDYsCisJIDB4MjMsIDB4RkMsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDUsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsCisJIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDgsIDB4MjQsIDB4QzYsIDB4RkUsCisJIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4OTcsIDB4RjEsIDB4QTAsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4ODAsIDB4QzQsIDB4ODQsIDB4MEMsIDB4MDMsCisJIDB4MDgsIDB4MDUsIDB4REMsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MDUsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDIsIDB4MjQsIDB4QzYsIDB4RkUsIDB4REQsIDB4OTgsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsIDB4QTIsIDB4REIsIDB4REQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MzIsIDB4NDAsCisJIDB4NDAsIDB4MjYsIDB4M0MsIDB4MDAsIDB4N0IsIDB4RjMsIDB4NjcsIDB4NDMsIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4MzcsIDB4MDMsIDB4NjAsIDB4NDYsCisJIDB4MEEsIDB4MDIsIDB4N0IsIDB4RkQsIDB4MDAsIDB4NjAsIDB4NDYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4N0IsIDB4RkIsIDB4MkMsIDB4MDMsIDB4NDYsIDB4NEIsIDB4MjUsIDB4NjAsIDB4RDAsIDB4NjEsIDB4MTgsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MjQsIDB4RkEsIDB4NEEsIDB4NjUsIDB4QTIsIDB4RkYsIDB4MkMsIDB4NjMsIDB4NTksIDB4RDEsIDB4QTIsIDB4REYsCisJIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjcsIDB4MUYsIDB4MTIsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsCisJIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MkIsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4QTYsIDB4RkUsIDB4MDAsIDB4NjQsIDB4N0IsIDB4RkIsIDB4QTMsIDB4RkYsIDB4Q0EsIDB4NjAsCisJIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTYsIDB4RkUsIDB4QkEsIDB4MDUsIDB4QTcsIDB4RkUsIDB4MEEsIDB4MDUsIDB4QTUsIDB4RkUsIDB4MDMsIDB4MDQsCisJIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTQsIDB4RkUsIDB4RjIsIDB4MDQsIDB4RTcsIDB4NjAsIDB4MUYsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MzYsIDB4NDUsIDB4MTksIDB4NjAsIDB4ODYsIDB4NjQsIDB4NDQsIDB4RDcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4N0QsIDB4RjEsCisJIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsCisJIDB4OUQsIDB4ODQsIDB4QTEsIDB4ODAsIDB4QTAsIDB4ODMsIDB4MTUsIDB4MDMsIDB4N0QsIDB4RkQsIDB4MDgsIDB4NjAsIDB4MjQsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MzEsIDB4NDQsIDB4REUsIDB4QjQsIDB4NDAsIDB4NTEsIDB4MDEsIDB4N0MsCisJIDB4QkMsIDB4RjksIDB4NDksIDB4RjMsIDB4MDEsIDB4NjMsIDB4NjAsIDB4NDAsIDB4RkYsIDB4MjYsIDB4NDksIDB4RkQsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NjAsIDB4QjAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4QkQsIDB4RDEsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDIsIDB4NkEsIDB4RkIsIDB4MzEsIDB4NDQsIDB4RkUsIDB4QjQsCisJIDB4NDAsIDB4NTEsIDB4MEQsIDB4NjQsIDB4MDUsIDB4RkIsIDB4MUEsIDB4MDAsIDB4MjgsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTMsIDB4NjAsIDB4NTIsIDB4RjMsCisJIDB4QzUsIDB4RkIsIDB4NjQsIDB4RkIsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4NDYsIDB4NUUsCisJIDB4MzEsIDB4NDQsIDB4MjEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4RUQsIDB4RTIsIDB4MEYsIDB4NEUsIDB4RDAsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QTgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NEYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NjAsIDB4NzQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDcsIDB4RkUsIDB4Q0EsIDB4NjAsCisJIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkUsIDB4RjUsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsCisJIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsCisJIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsCisJIDB4NjEsIDB4NDYsIDB4MjYsIDB4MDIsIDB4MEIsIDB4NjAsIDB4ODIsIDB4RjMsIDB4REEsIDB4ODEsIDB4NjAsIDB4NDUsIDB4RDUsIDB4ODAsIDB4QTEsIDB4RDEsCisJIDB4MDQsIDB4MDMsIDB4RDMsIDB4ODAsIDB4RDksIDB4ODEsIDB4RkEsIDB4MDIsIDB4MDgsIDB4MDAsIDB4QTEsIDB4REQsIDB4RDksIDB4ODQsIDB4MEIsIDB4NjAsCisJIDB4ODIsIDB4RkIsIDB4NEEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4REMsIDB4ODQsIDB4QTIsIDB4REIsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsCisJIDB4RkYsIDB4NjAsIDB4MDEsIDB4N0MsIDB4QTAsIDB4OUMsIDB4MDYsIDB4RjgsIDB4NjUsIDB4NDYsIDB4NzAsIDB4RjMsIDB4NjAsIDB4NDAsIDB4MTAsIDB4MkEsCisJIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4ODAsIDB4MkIsIDB4NzAsIDB4RkIsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4QUQsIDB4MDEsIDB4MkUsIDB4RjUsIDB4MjgsIDB4RjAsIDB4MTgsIDB4NjAsIDB4MTIsIDB4RjksIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsCisJIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsCisJIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsCisJIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MTIsIDB4MDIsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4MDIsIDB4QjAsCisJIDB4MDgsIDB4QkMsIDB4MEMsIDB4MDMsIDB4MDYsIDB4RkEsIDB4RTcsIDB4NjAsIDB4NTgsIDB4NEUsIDB4ODEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MUUsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4NkYsIDB4MDEsIDB4MDEsIDB4NjQsCisJIDB4NTEsIDB4RkIsIDB4MjgsIDB4NjAsIDB4NEUsIDB4NjQsIDB4NTIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QzMsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MTUsIDB4MTgsCisJIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTcsIDB4NjAsCisJIDB4M0QsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4RkYsIDB4NjAsCisJIDB4ODAsIDB4NjUsIDB4QTEsIDB4RDMsIDB4RkYsIDB4RkYsIDB4QTQsIDB4ODAsIDB4NTksIDB4RDMsIDB4MDUsIDB4MDIsIDB4MDQsIDB4MUIsIDB4NTksIDB4RDMsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4MUIsIDB4MTUsIDB4MDAsIDB4MTAsIDB4NjAsIDB4MkEsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjAsCisJIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MjAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RTcsIDB4NjAsIDB4NjAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MTYsIDB4RkIsIDB4RDIsIDB4NjAsIDB4QjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4NjMsIDB4NDYsIDB4NDMsIDB4NDcsIDB4MjIsIDB4RjIsIDB4NzYsIDB4RjIsIDB4MDIsIDB4MUIsIDB4MDEsIDB4MUIsCisJIDB4MEMsIDB4MDAsIDB4NjAsIDB4NDYsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjcsIDB4NDYsIDB4NzYsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RjQsIDB4MUIsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RTcsIDB4NjAsCisJIDB4OUYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkEsIDB4RkIsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MjEsIDB4RkIsIDB4NUEsIDB4REIsIDB4MTAsIDB4NjAsIDB4NDIsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4N0QsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MDIsIDB4QTEsIDB4ODAsIDB4QjEsIDB4ODMsIDB4MTYsIDB4MDIsIDB4Q0YsIDB4ODUsIDB4QTcsIDB4ODAsCisJIDB4N0QsIDB4RkQsIDB4MEIsIDB4MDIsIDB4MDEsIDB4NjUsIDB4RTUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QTYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDQsCisJIDB4REYsIDB4QjQsIDB4NDAsIDB4NTEsIDB4RDAsIDB4NjAsIDB4RDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MjEsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsCisJIDB4N0QsIDB4RjEsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4NEUsIDB4RkIsIDB4MDEsIDB4NjEsIDB4MDMsIDB4MDMsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MDIsIDB4OUQsIDB4ODQsIDB4QTEsIDB4ODAsIDB4QTAsIDB4ODMsIDB4MTMsIDB4MDMsIDB4N0QsIDB4RkQsIDB4MDgsIDB4NjAsIDB4MjQsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MDIsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4N0QsIDB4RjEsIDB4MzEsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4RkYsIDB4MjYsIDB4MDMsIDB4MDAsIDB4MjEsIDB4QkMsIDB4NDAsIDB4NTEsIDB4MDMsIDB4MDAsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTYsIDB4NjAsIDB4OEUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEUsIDB4NTcsIDB4MzIsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MUIsIDB4MDAsIDB4NDUsIDB4NDgsCisJIDB4MDAsIDB4NjAsIDB4MDYsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4OUYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTMsIDB4MDMsIDB4MDIsIDB4NjQsCisJIDB4MjMsIDB4RkEsIDB4RjIsIDB4NjAsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REEsIDB4MjgsIDB4NDQsIDB4NUEsIDB4REEsIDB4RkYsIDB4RkYsIDB4MUYsIDB4NjAsCisJIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MzcsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjAsIDB4NzksIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDYsIDB4MEUsIDB4RjIsIDB4NTksIDB4MDMsIDB4NjAsIDB4NDAsIDB4RjAsIDB4MzcsIDB4NDYsIDB4MDAsIDB4RkYsIDB4MzcsIDB4M0IsIDB4MDAsCisJIDB4RkQsIDB4MzcsIDB4MzMsIDB4MDAsIDB4MTgsIDB4MzcsIDB4MjcsIDB4MDAsIDB4RkUsIDB4MzcsIDB4MkEsIDB4MDAsIDB4RjgsIDB4MzcsIDB4MEEsIDB4MDAsCisJIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjIsIDB4NDYsIDB4RDEsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RDgsIDB4MDEsIDB4MDYsIDB4QjQsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RjgsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4RjksIDB4RkUsIDB4QzksIDB4MDEsIDB4REUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NkMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsCisJIDB4RTEsIDB4NjAsIDB4NTgsIDB4NEYsIDB4MzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QkYsIDB4MDMsIDB4MjMsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDQsIDB4MjYsCisJIDB4RTMsIDB4MUIsIDB4MDIsIDB4MjYsIDB4RTEsIDB4MTgsIDB4QTIsIDB4RkYsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsCisJIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsIDB4OEYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MjAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTgsIDB4MDEsIDB4QUMsIDB4RkUsIDB4MDksIDB4MDUsIDB4QUQsIDB4RkUsIDB4MEYsIDB4MDUsCisJIDB4QUUsIDB4RkUsIDB4QTIsIDB4MDUsIDB4QUYsIDB4RkUsIDB4MzcsIDB4MDUsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsCisJIDB4MTEsIDB4RjEsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4RjUsIDB4MDEsIDB4MTAsIDB4NjAsCisJIDB4NTYsIDB4NjUsIDB4MDMsIDB4NjEsIDB4MDcsIDB4MDAsIDB4QTIsIDB4REQsIDB4NTgsIDB4NEYsIDB4NjQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QjksCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4MDAsIDB4NjMsIDB4QTUsIDB4RDEsIDB4NUEsIDB4RDMsIDB4REEsIDB4ODUsIDB4MDAsIDB4QTgsIDB4Q0QsIDB4ODEsCisJIDB4RjIsIDB4MDIsIDB4RjgsIDB4MDIsIDB4RTEsIDB4MDEsIDB4MTAsIDB4NjAsIDB4MjAsIDB4NjIsIDB4MTAsIDB4NjAsIDB4NDYsIDB4NjUsIDB4RTgsIDB4NjAsCisJIDB4QTksIDB4NjMsIDB4NUEsIDB4REYsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDMsIDB4NUEsIDB4REYsIDB4NUEsIDB4REYsIDB4NUEsIDB4REQsCisJIDB4RjksIDB4MDEsIDB4MTAsIDB4NjAsIDB4NTQsIDB4NjUsIDB4NUEsIDB4REYsIDB4RDYsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4NUEsIDB4REQsCisJIDB4RkIsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MjQsIDB4NjQsIDB4NDAsIDB4NDEsIDB4MTAsIDB4NjAsIDB4MjIsIDB4NjMsCisJIDB4QTMsIDB4RDEsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDYsIDB4NjEsIDB4MDgsIDB4MDMsIDB4QkQsIDB4REIsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsCisJIDB4QjAsIDB4ODQsIDB4Q0QsIDB4ODEsIDB4QTMsIDB4REIsIDB4MDYsIDB4QTMsIDB4RjksIDB4MDIsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjMsIDB4QTMsIDB4RDEsCisJIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MDcsIDB4NjEsIDB4MTksIDB4MDMsIDB4QkQsIDB4REIsIDB4NjQsIDB4NDQsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTMsCisJIDB4Q0QsIDB4ODEsIDB4RTgsIDB4ODQsIDB4RTMsIDB4MDMsIDB4MDIsIDB4MDUsIDB4RTEsIDB4MDMsIDB4RjksIDB4MDEsIDB4NzcsIDB4RkIsIDB4NzksIDB4RkQsCisJIDB4NjEsIDB4NUMsIDB4QTMsIDB4RDMsIDB4NzgsIDB4RjksIDB4MDMsIDB4MTgsIDB4NTgsIDB4NEYsIDB4NjAsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NzksIDB4RjMsCisJIDB4NzgsIDB4RjEsIDB4NjAsIDB4NDMsIDB4NzcsIDB4RjMsIDB4NjQsIDB4NDEsIDB4RUEsIDB4MDEsIDB4MjEsIDB4NDMsIDB4MTAsIDB4NjAsIDB4NDgsIDB4NjUsCisJIDB4RDcsIDB4ODAsIDB4QkQsIDB4RDEsIDB4QkQsIDB4RDMsIDB4MDMsIDB4MDIsIDB4Q0EsIDB4NjAsIDB4N0UsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTAsIDB4ODQsCisJIDB4QkQsIDB4RDEsIDB4NDMsIDB4NDEsIDB4RjUsIDB4MDMsIDB4RTgsIDB4NjAsIDB4QUUsIDB4NjQsIDB4NjQsIDB4NTgsIDB4NDAsIDB4NEYsIDB4MkEsIDB4RjAsCisJIDB4ODMsIDB4NjAsIDB4RkYsIDB4NjUsIDB4NjQsIDB4NDcsIDB4MDMsIDB4MkIsIDB4MDEsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MDMsIDB4MjYsIDB4MDMsIDB4QUMsCisJIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsCisJIDB4MkUsIDB4RkEsIDB4NjQsIDB4NDEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4NjAsIDB4NDMsIDB4Q0MsIDB4RjMsIDB4MzAsIDB4RkEsIDB4Q0QsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RkEsIDB4MzQsIDB4RjgsIDB4MTksIDB4MDAsIDB4NjAsIDB4NDcsIDB4QTQsIDB4ODQsIDB4MkEsIDB4RkEsCisJIDB4MkYsIDB4RjIsIDB4MkMsIDB4RkEsIDB4MzAsIDB4RjIsIDB4MkQsIDB4RkEsIDB4MzEsIDB4RjIsIDB4MkUsIDB4RkEsIDB4MzYsIDB4RjIsIDB4MzIsIDB4RkEsCisJIDB4MzcsIDB4RjIsIDB4MzMsIDB4RkEsIDB4MzgsIDB4RjIsIDB4MzQsIDB4RkEsIDB4Q0IsIDB4RjMsIDB4MkYsIDB4RkEsIDB4MzYsIDB4RkEsIDB4Q0MsIDB4RjMsCisJIDB4MzAsIDB4RkEsIDB4MzcsIDB4RkEsIDB4Q0QsIDB4RjMsIDB4MzEsIDB4RkEsIDB4MzgsIDB4RkEsIDB4NjQsIDB4NDEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsCisJIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4ODAsIDB4MkIsIDB4MjgsIDB4MDAsIDB4MjYsIDB4NDYsIDB4MDQsIDB4NjMsCisJIDB4MDMsIDB4RkMsIDB4MDAsIDB4RjQsIDB4MEQsIDB4RjIsIDB4MDYsIDB4RkEsIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4QTAsIDB4NTksIDB4RjUsIDB4MTksIDB4MDIsIDB4MzksIDB4RjIsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjAsCisJIDB4ODEsIDB4NjcsIDB4MEQsIDB4RkEsIDB4N0MsIDB4NjQsIDB4MDEsIDB4RkEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MUUsIDB4NjAsCisJIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4M0YsIDB4RjAsCisJIDB4NDIsIDB4NjQsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4M0YsIDB4RkEsIDB4MUMsIDB4RjIsIDB4MTMsIDB4RkEsIDB4MjYsIDB4RjIsCisJIDB4MjcsIDB4RjAsIDB4NjAsIDB4NDcsIDB4MDAsIDB4RjQsIDB4MUYsIDB4RkEsIDB4NjQsIDB4NDcsIDB4MjAsIDB4RkEsIDB4NjEsIDB4NDQsIDB4MjEsIDB4RkEsCisJIDB4MDEsIDB4NjcsIDB4MEQsIDB4RkEsIDB4MTAsIDB4NjEsIDB4MjYsIDB4NjAsIDB4NjQsIDB4NjQsIDB4MUUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4Q0QsIDB4ODEsCisJIDB4QkQsIDB4RDgsIDB4RkMsIDB4MDIsIDB4OUEsIDB4RjEsIDB4QjcsIDB4RjEsIDB4NjQsIDB4NUUsIDB4NjQsIDB4NUYsIDB4NDQsIDB4NjMsIDB4QkQsIDB4REEsCisJIDB4MTMsIDB4NjAsIDB4MkYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4MDksIDB4QkMsIDB4NEEsIDB4RDMsCisJIDB4NjAsIDB4NDUsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MDMsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MDEsIDB4NjQsIDB4QjQsIDB4ODQsIDB4MDYsIDB4QTIsCisJIDB4QTIsIDB4RDEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDcsIDB4QkQsIDB4REEsIDB4QjQsIDB4RjMsIDB4QjUsIDB4RjEsIDB4NjAsIDB4NDcsIDB4QkQsIDB4REEsCisJIDB4NjQsIDB4NDcsIDB4QzMsIDB4RjEsIDB4QkQsIDB4REEsIDB4NjQsIDB4NDQsIDB4QkQsIDB4REEsIDB4MjYsIDB4NDYsIDB4MDAsIDB4NjQsIDB4MjMsIDB4RjAsCisJIDB4M0IsIDB4RjAsIDB4NjQsIDB4NDAsIDB4MTAsIDB4MkEsIDB4MDYsIDB4MDAsIDB4QzAsIDB4NjcsIDB4QTAsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MTAsIDB4QkMsIDB4M0UsIDB4RkEsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4MjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QzgsIDB4RkUsIDB4MDAsIDB4NjYsIDB4NDYsIDB4NDYsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4NjAsIDB4NUMsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4NTksIDB4RkIsIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4QUIsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsIDB4MDgsIDB4NjQsIDB4MkEsIDB4RkEsIDB4ODAsIDB4N0UsIDB4RjgsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4ODcsIDB4RjEsIDB4MDcsIDB4RjgsIDB4MDEsIDB4NjAsIDB4NjAsIDB4NjcsIDB4MkMsIDB4RkEsIDB4MUQsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MkQsIDB4RkEsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4MzIsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsCisJIDB4MzMsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4MzQsIDB4RjgsIDB4MDAsIDB4NjMsIDB4M0IsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MDEsIDB4NjQsCisJIDB4M0EsIDB4RkEsIDB4NjYsIDB4NjQsIDB4MzksIDB4RkEsIDB4M0MsIDB4RkMsIDB4QUEsIDB4NjAsIDB4QUEsIDB4NjQsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RkEsCisJIDB4MDAsIDB4NjAsIDB4MDMsIDB4NjQsIDB4NUEsIDB4REEsIDB4MUQsIDB4NjAsIDB4NjAsIDB4NjQsIDB4NUEsIDB4REEsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4NUEsIDB4REEsIDB4ODEsIDB4N0YsIDB4MTgsIDB4N0UsIDB4MDgsIDB4RkEsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjQsIDB4MEEsIDB4RkEsIDB4MDAsIDB4NjQsCisJIDB4MEUsIDB4RkEsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4M0QsIDB4RjIsIDB4M0MsIDB4RjIsIDB4Q0MsIDB4ODMsIDB4MDAsIDB4QTgsCisJIDB4MDMsIDB4MDMsIDB4MDgsIDB4MjgsIDB4M0QsIDB4RkMsIDB4NDIsIDB4MDAsIDB4M0QsIDB4RkEsIDB4M0EsIDB4RjIsIDB4M0IsIDB4RjAsIDB4MDAsIDB4NjMsCisJIDB4MDAsIDB4RjQsIDB4MDcsIDB4RkMsIDB4MDEsIDB4QjAsIDB4MEIsIDB4RkEsIDB4MTksIDB4MDMsIDB4MUYsIDB4RjgsIDB4RkYsIDB4RkYsIDB4MTgsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MUYsIDB4RjIsIDB4MUUsIDB4RjAsIDB4NTksIDB4RjUsIDB4MDAsIDB4QTgsIDB4M0IsIDB4RjgsIDB4RDAsIDB4ODAsIDB4MDYsIDB4MDMsIDB4MDUsIDB4MDMsCisJIDB4MDQsIDB4NjAsIDB4NUMsIDB4NjMsIDB4MEYsIDB4NjQsIDB4M0EsIDB4RkEsIDB4MzksIDB4RkMsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MDYsIDB4RkEsCisJIDB4RUEsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NDksIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTksIDB4RjUsIDB4MDAsIDB4RjQsIDB4ODEsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDYsIDB4RkEsIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4QjcsIDB4RjEsIDB4MDAsIDB4N0YsIDB4NjQsIDB4NUUsIDB4MDksIDB4RkEsIDB4NTksIDB4RjUsCisJIDB4MDAsIDB4NjQsIDB4MTUsIDB4RkEsIDB4MzksIDB4RjIsIDB4M0YsIDB4RkEsIDB4MUUsIDB4NjAsIDB4Q0UsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RTMsIDB4NjAsIDB4QzAsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDUsIDB4MEUsIDB4RjIsIDB4MEYsIDB4RjAsIDB4MTAsIDB4RjAsIDB4NjQsIDB4NDEsIDB4MDEsIDB4QTgsIDB4NTksIDB4RjUsCisJIDB4MDksIDB4MDIsIDB4QUQsIDB4ODMsIDB4NjQsIDB4NDQsIDB4QUMsIDB4ODQsIDB4MDgsIDB4MjQsIDB4MEEsIDB4NjMsIDB4M0MsIDB4RkMsIDB4M0QsIDB4RkMsCisJIDB4MUEsIDB4MDIsIDB4MkQsIDB4MDAsIDB4MDMsIDB4M0EsIDB4MDMsIDB4MDAsIDB4MDAsIDB4NjQsIDB4M0MsIDB4RkEsIDB4MjksIDB4MDAsIDB4MDQsIDB4M0EsCisJIDB4MDksIDB4MDAsIDB4MEEsIDB4NjQsIDB4M0MsIDB4RkEsIDB4MDEsIDB4NjQsIDB4M0EsIDB4RkEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4NjQsIDB4MUYsIDB4RkEsCisJIDB4MUUsIDB4RkEsIDB4MUUsIDB4MDAsIDB4MDIsIDB4M0EsIDB4MUUsIDB4MDAsIDB4NjQsIDB4NDQsIDB4QUQsIDB4ODMsIDB4QUMsIDB4ODQsIDB4MDIsIDB4MDMsCisJIDB4M0MsIDB4RkMsIDB4M0QsIDB4RkMsIDB4MTUsIDB4MDMsIDB4M0EsIDB4RkEsIDB4RjgsIDB4NjUsIDB4NTIsIDB4NjMsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsCisJIDB4MEQsIDB4MDAsIDB4MTIsIDB4QTMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsIDB4MDIsIDB4MDAsIDB4QzcsIDB4ODMsIDB4QzcsIDB4ODMsIDB4NjQsIDB4NDAsCisJIDB4MDgsIDB4MkEsIDB4MDEsIDB4MDAsIDB4QzcsIDB4ODMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjYsIDB4QzcsIDB4ODMsIDB4MzksIDB4RkMsIDB4MDAsIDB4NjQsCisJIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0IsIDB4RjAsIDB4M0EsIDB4RjIsIDB4NjUsIDB4NDYsIDB4MDYsIDB4RjIsIDB4NDAsIDB4NDcsIDB4MUMsIDB4MTgsCisJIDB4MzIsIDB4NDcsIDB4MDcsIDB4RkEsIDB4MTgsIDB4N0UsIDB4ODEsIDB4N0YsIDB4MDgsIDB4RkEsIDB4MDEsIDB4NjAsIDB4MDEsIDB4NjMsIDB4QjcsIDB4RjMsCisJIDB4MEEsIDB4RkMsIDB4MDAsIDB4N0YsIDB4MDksIDB4RkEsIDB4MjcsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MEUsIDB4MDAsIDB4MUYsIDB4RjgsIDB4MTgsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MUUsIDB4RjAsIDB4NTksIDB4RjUsIDB4M0IsIDB4RjgsIDB4NjUsIDB4NDYsIDB4MjcsIDB4NDAsIDB4MDIsIDB4MjYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsCisJIDB4MTMsIDB4MDAsIDB4NkUsIDB4NjEsIDB4RkYsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MDAsIDB4NjAsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsCisJIDB4RkQsIDB4MUYsIDB4MDEsIDB4NjAsIDB4RUUsIDB4NjMsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4N0UsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjEsIDB4RjksIDB4MUYsIDB4MjcsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MUEsIDB4MDAsIDB4NDYsIDB4NEIsCisJIDB4MEYsIDB4NjAsIDB4NjcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4MDMsIDB4ODksIDB4RjAsIDB4RUIsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjUsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4RUIsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MkIsIDB4NDYsIDB4ODIsIDB4RkMsIDB4MDAsIDB4RjQsIDB4ODIsIDB4RkMsCisJIDB4MDAsIDB4RjQsIDB4MjcsIDB4NDAsIDB4MDgsIDB4MjYsIDB4MTksIDB4MDAsIDB4NDYsIDB4NEIsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4QTgsIDB4NjAsIDB4NDYsIDB4MEUsIDB4MDMsIDB4ODksIDB4RjAsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjUsIDB4NDQsIDB4QUMsIDB4ODYsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDMsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MDAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4MDAsIDB4NjUsIDB4NDYsIDB4MDIsIDB4RkEsIDB4MDAsIDB4RjQsIDB4ODIsIDB4RkMsIDB4MDEsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjEsIDB4MDIsIDB4NjQsIDB4N0EsIDB4NjMsIDB4NTgsIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTAsIDB4RDgsIDB4QUIsIDB4NDYsIDB4RkIsIDB4MUYsCisJIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4Q0QsIDB4ODEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4RjQsIDB4RjMsIDB4MDIsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MkEsIDB4NjEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NjYsIDB4NDQsIDB4NTgsIDB4RkIsCisJIDB4MDQsIDB4NjQsIDB4MDMsIDB4RkEsIDB4NjcsIDB4NDQsIDB4MkMsIDB4RkEsIDB4MkQsIDB4RkEsIDB4MkUsIDB4RkEsIDB4MzIsIDB4RkEsIDB4MzMsIDB4RkEsCisJIDB4MzQsIDB4RkEsIDB4MTIsIDB4NjAsIDB4ODAsIDB4NjQsIDB4ODcsIDB4RjEsIDB4MEUsIDB4RkEsIDB4MDcsIDB4RjgsIDB4MDAsIDB4NjQsIDB4M0UsIDB4RkEsCisJIDB4MEEsIDB4NjAsIDB4MDcsIDB4RkIsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4NUMsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDQsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4MDYsIDB4NjQsIDB4NUEsIDB4REIsIDB4RUQsIDB4NjAsIDB4RDksIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkQsIDB4RkIsIDB4MDAsIDB4NjQsIDB4MEEsIDB4NjAsCisJIDB4MEQsIDB4RkIsIDB4MDYsIDB4QTIsIDB4MTAsIDB4NjAsIDB4NjAsIDB4NjQsIDB4QTIsIDB4REIsIDB4MDgsIDB4NjQsIDB4NUEsIDB4REIsIDB4MDYsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RUQsIDB4NjAsIDB4RTIsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MkYsIDB4RkIsIDB4RUQsIDB4NjAsIDB4QkUsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MjgsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RUQsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NTgsIDB4RjUsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsIDB4MzEsIDB4RjgsIDB4QUIsIDB4RjEsCisJIDB4MTksIDB4RjgsIDB4NTgsIDB4RjUsIDB4NDAsIDB4NjQsIDB4MkEsIDB4RkEsIDB4NjQsIDB4RjMsIDB4NjMsIDB4RkIsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsCisJIDB4MDAsIDB4NjAsIDB4MTAsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MDMsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MDMsIDB4MDAsCisJIDB4RUMsIDB4NjAsIDB4Q0IsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4QzAsIDB4RjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QkMsIDB4RjMsIDB4M0YsIDB4NDAsIDB4MDEsIDB4MjcsIDB4MDgsIDB4MDAsCisJIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsCisJIDB4MEYsIDB4QjQsIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4MkQsIDB4NjAsIDB4OTQsIDB4NjQsCisJIDB4MDAsIDB4RjQsIDB4NDAsIDB4NDgsIDB4MjgsIDB4NjAsIDB4NEUsIDB4NjQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MjgsIDB4NjAsCisJIDB4MkMsIDB4NjQsIDB4MjgsIDB4REIsIDB4MDQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4M0YsIDB4RkMsIDB4MDEsIDB4NjQsIDB4NTIsIDB4RjEsIDB4MEMsIDB4NjAsIDB4ODEsIDB4RkIsIDB4NjQsIDB4RkIsCisJIDB4QTQsIDB4RDMsIDB4MDQsIDB4NjUsIDB4NTEsIDB4RjMsIDB4MDEsIDB4MTgsIDB4MEMsIDB4NjUsIDB4RjMsIDB4QjQsIDB4QjQsIDB4ODQsIDB4NTEsIDB4RkIsCisJIDB4MEQsIDB4MDAsIDB4RUQsIDB4NjAsIDB4NzAsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTEsIDB4RjEsIDB4NjQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RjMsIDB4QTAsCisJIDB4MDQsIDB4QTQsIDB4MDEsIDB4MDQsIDB4RjEsIDB4QTQsIDB4MTAsIDB4MzYsIDB4RjQsIDB4MDEsIDB4NjQsIDB4RkIsIDB4NjQsIDB4RjMsIDB4MTUsIDB4NjAsCisJIDB4QzMsIDB4RjEsIDB4Q0MsIDB4ODQsIDB4MDEsIDB4NjEsIDB4MDgsIDB4MjQsIDB4MDMsIDB4MDAsIDB4RTEsIDB4ODEsIDB4Q0MsIDB4ODQsIDB4RkIsIDB4MDEsCisJIDB4QTEsIDB4ODQsIDB4NTEsIDB4RjEsIDB4RUEsIDB4MDMsIDB4MEMsIDB4NjAsIDB4ODEsIDB4RkIsIDB4OUQsIDB4RkUsIDB4M0QsIDB4MDUsIDB4QkEsIDB4RkUsCisJIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4RDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsIDB4OUQsIDB4RjksIDB4MDgsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsCisJIDB4RjUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTgsIDB4NjAsIDB4MDcsIDB4RjEsIDB4QUQsIDB4NEYsCisJIDB4MDAsIDB4N0YsIDB4RkEsIDB4QjQsIDB4NjQsIDB4NDEsIDB4NjQsIDB4RjEsIDB4MDIsIDB4QjEsIDB4MDQsIDB4NjUsIDB4MDIsIDB4MDIsIDB4NjQsIDB4NDAsCisJIDB4MDEsIDB4MkIsIDB4MDEsIDB4NjUsIDB4QjQsIDB4ODQsIDB4QTAsIDB4NUQsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsCisJIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4Q0QsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjQsIDB4RjEsIDB4MEYsIDB4NjAsIDB4OUQsIDB4RjksIDB4MEUsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsCisJIDB4MkQsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsCisJIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsCisJIDB4QTIsIDB4REIsIDB4NTgsIDB4RjUsIDB4MUUsIDB4NjAsIDB4RDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NEYsIDB4RkIsIDB4MDAsIDB4NjAsIDB4MDEsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsIDB4NTEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4QzEsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4QTUsIDB4RjEsIDB4MEEsIDB4NjAsIDB4MDksIDB4RjksCisJIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4QTYsIDB4RjEsIDB4MEEsIDB4NjAsIDB4MEYsIDB4RjksIDB4MUYsIDB4NjAsIDB4NDgsIDB4NjIsIDB4QTIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RkQsIDB4MUIsCisJIDB4MTQsIDB4NjAsIDB4MUEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsIDB4N0EsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NEYsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4NjQsIDB4NDAsCisJIDB4RkYsIDB4MjYsIDB4MEIsIDB4MDAsIDB4NTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4ODAsIDB4QjAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDMsIDB4RUQsIDB4NjAsCisJIDB4NkEsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RUIsIDB4NjAsIDB4QjQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MEEsIDB4MDAsIDB4NjQsIDB4NEYsIDB4RkIsCisJIDB4QTcsIDB4RjEsIDB4MEEsIDB4NjAsIDB4MEYsIDB4RjksIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUMsIDB4NjAsCisJIDB4QTUsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MTQsIDB4NjAsIDB4MUEsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDIsIDB4NjQsCisJIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsCisJIDB4MDQsIDB4NjQsIDB4QTAsIDB4ODAsIDB4OUMsIDB4ODQsIDB4MEIsIDB4MDMsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4MTQsIDB4NjAsIDB4MUEsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkYsIDB4NjAsCisJIDB4RjcsIDB4NjQsIDB4QTAsIDB4ODQsIDB4QTIsIDB4REIsIDB4NEYsIDB4RjMsIDB4REUsIDB4MEEsIDB4MDAsIDB4QTAsIDB4MDAsIDB4NjQsIDB4MDIsIDB4MDMsCisJIDB4NEYsIDB4RkIsIDB4RDksIDB4MDEsIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4MTUsIDB4NjAsIDB4QzEsIDB4RjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4QUIsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4QzIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QkQsIDB4RjMsIDB4MEYsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsCisJIDB4RUUsIDB4NjAsIDB4NTgsIDB4NEUsIDB4MjYsIDB4NzgsIDB4RkYsIDB4RkYsIDB4NTgsIDB4RjUsIDB4MkQsIDB4NjAsIDB4OTQsIDB4NjQsIDB4MDAsIDB4RjQsCisJIDB4NDAsIDB4NDgsIDB4MjgsIDB4NjAsIDB4NEUsIDB4NjQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MDIsIDB4MDAsIDB4MjgsIDB4NjAsIDB4MkMsIDB4NjQsCisJIDB4MjgsIDB4REIsIDB4MDQsIDB4NjEsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RTQsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTcsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NTgsIDB4RjUsIDB4M0YsIDB4RkMsIDB4NTEsIDB4RjMsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjMsIDB4MDIsIDB4MDAsIDB4MjAsIDB4QkMsIDB4MDQsIDB4MDAsCisJIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjIsIDB4NDAsIDB4QkMsIDB4MDQsIDB4QkMsIDB4ODAsIDB4QkMsIDB4NTEsIDB4RkIsIDB4MTEsIDB4NjAsIDB4MTYsIDB4NjQsCisJIDB4MDgsIDB4NjAsIDB4NDYsIDB4RkIsIDB4MDYsIDB4NjQsIDB4MDgsIDB4NjAsIDB4NEQsIDB4RkIsIDB4MTUsIDB4NjAsIDB4QzYsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4MDcsIDB4QjQsIDB4QTIsIDB4REIsIDB4NTEsIDB4RjMsIDB4MDgsIDB4NjAsIDB4NDYsIDB4RjEsIDB4NjAsIDB4NDAsIDB4MjAsIDB4MjYsIDB4MDMsIDB4MDAsCisJIDB4MDEsIDB4MjYsIDB4MzIsIDB4MDAsIDB4NDUsIDB4MDAsIDB4MDgsIDB4NjAsIDB4NEQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4REQsIDB4QTAsIDB4MDEsIDB4QTQsCisJIDB4NTcsIDB4MDMsIDB4QTIsIDB4REIsIDB4MkIsIDB4NjAsIDB4ODgsIDB4NjEsIDB4RTAsIDB4QTAsIDB4RjAsIDB4QTAsIDB4MDUsIDB4MDUsIDB4MDEsIDB4MDUsCisJIDB4MDUsIDB4MDAsIDB4MDIsIDB4QTEsIDB4RjAsIDB4QTQsIDB4MDIsIDB4MDAsIDB4MDQsIDB4QTEsIDB4RTAsIDB4QTQsIDB4QTEsIDB4RDEsIDB4MDEsIDB4NjEsCisJIDB4REMsIDB4ODQsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RTEsIDB4ODEsIDB4RkIsIDB4MDEsIDB4QTEsIDB4ODAsIDB4MTAsIDB4NjAsCisJIDB4OUEsIDB4NjQsIDB4MDEsIDB4MDIsIDB4RTAsIDB4MDEsIDB4QTAsIDB4RDMsIDB4MTEsIDB4NjAsIDB4MEUsIDB4NjMsIDB4RkEsIDB4QTQsIDB4Q0MsIDB4ODQsCisJIDB4MDgsIDB4QTMsIDB4RkQsIDB4MDIsIDB4QjEsIDB4RjEsIDB4QTMsIDB4RDMsIDB4MDEsIDB4MTgsIDB4RDUsIDB4MTgsIDB4RkUsIDB4QTMsIDB4QTMsIDB4RDMsCisJIDB4NjQsIDB4RkIsIDB4RUIsIDB4NjAsIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4NjQsIDB4NDEsIDB4QTEsIDB4RDMsCisJIDB4RDUsIDB4ODAsIDB4MDAsIDB4QjgsIDB4MjUsIDB4MDcsIDB4MDIsIDB4MDIsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4NjEsIDB4NDQsIDB4MDgsIDB4NjAsCisJIDB4NDYsIDB4RkIsIDB4MDEsIDB4NjQsIDB4QTEsIDB4REIsIDB4NDksIDB4RDMsIDB4NjQsIDB4RkIsIDB4RUIsIDB4NjAsIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4NjQsIDB4NDEsIDB4QTEsIDB4RDMsIDB4RDUsIDB4ODAsIDB4MDQsIDB4QjAsIDB4MTEsIDB4MDcsIDB4MDIsIDB4MDIsCisJIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4NjEsIDB4NDQsIDB4MDgsIDB4NjAsIDB4NDYsIDB4RkIsIDB4NDksIDB4RDMsIDB4NjQsIDB4RkIsIDB4RUIsIDB4NjAsCisJIDB4Q0QsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4NDYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4QTQsIDB4QTIsIDB4REIsIDB4OUEsIDB4MDEsCisJIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsCisJIDB4NTEsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTMsIDB4QjQsIDB4NTEsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0YsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QjQsCisJIDB4QTIsIDB4REIsIDB4MTAsIDB4NjAsIDB4MzYsIDB4NjIsIDB4MDAsIDB4NjQsIDB4QTIsIDB4REIsIDB4REUsIDB4RkUsIDB4MEEsIDB4MDQsIDB4NDAsIDB4NjAsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUQsIDB4NjAsIDB4ODEsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4RjEsIDB4NjQsIDB4RjksIDB4MEYsIDB4NjAsIDB4OUQsIDB4RjksIDB4MEUsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsCisJIDB4MkQsIDB4RkYsIDB4MjAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUQsIDB4NjAsIDB4QTMsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QkUsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4NDAsIDB4NjAsIDB4MDAsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDgsIDB4NjAsIDB4MTEsIDB4RjEsIDB4MTAsIDB4NjAsIDB4MDAsIDB4NjQsIDB4QjAsIDB4ODQsCisJIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjAsIDB4MEUsIDB4NjQsCisJIDB4MEYsIDB4NjAsIDB4QTUsIDB4RkIsIDB4MDMsIDB4NjQsIDB4NEEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MDQsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NTEsIDB4RkIsCisJIDB4MDAsIDB4NjQsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RkIsIDB4NUEsIDB4REIsIDB4QkUsIDB4RkUsIDB4MDAsIDB4NjAsIDB4MzAsIDB4NjQsIDB4MDgsIDB4NjAsCisJIDB4MUMsIDB4RkIsIDB4RUIsIDB4NjAsIDB4NTgsIDB4NjQsIDB4NUEsIDB4REIsIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkYsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsIDB4Q0YsIDB4RkUsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDgsIDB4NjAsIDB4MUIsIDB4RjEsIDB4MDAsIDB4NjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REIsCisJIDB4Q0YsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MzEsIDB4NDAsIDB4MjAsIDB4MkEsIDB4MzUsIDB4MDAsIDB4M0YsIDB4RjIsIDB4NDcsIDB4NjUsCisJIDB4QzQsIDB4ODQsIDB4RTgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4MjQsIDB4RkEsIDB4NjQsIDB4RjMsIDB4MDEsIDB4NjAsCisJIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MDEsIDB4MjMsIDB4MTQsIDB4MDAsIDB4MTEsIDB4NjAsIDB4MTQsIDB4NjEsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsCisJIDB4QTEsIDB4RDEsIDB4RDUsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MEIsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4MDQsIDB4QTEsCisJIDB4QTEsIDB4RDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4MDEsIDB4NjQsCisJIDB4MDAsIDB4RjQsIDB4MDgsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTAsIDB4RkIsCisJIDB4MjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RkEsIDB4RkUsIDB4MDAsIDB4NjYsCisJIDB4NDYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjYsIDB4NDYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUYsIDB4RkIsIDB4QUMsIDB4ODUsCisJIDB4NjAsIDB4NDEsIDB4MkUsIDB4NjAsIDB4MjIsIDB4NjMsIDB4MTYsIDB4NjAsIDB4QzYsIDB4RkQsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4RkQsIDB4MTYsIDB4NjAsCisJIDB4RDYsIDB4RkQsIDB4MTYsIDB4NjAsIDB4RTAsIDB4RkQsIDB4NUMsIDB4MDMsIDB4NjEsIDB4NUMsIDB4MDAsIDB4NjMsIDB4RTksIDB4ODEsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsIDB4RkIsIDB4MDIsIDB4MDgsIDB4NjQsIDB4NTMsIDB4OTAsIDB4NjQsIDB4NDEsIDB4MDMsIDB4MDQsIDB4MDEsIDB4NjAsCisJIDB4MDgsIDB4NjMsIDB4MEMsIDB4MDAsIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MTAsIDB4NjQsIDB4RTksIDB4ODEsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MjQsCisJIDB4REYsIDB4ODMsIDB4MDgsIDB4MzYsIDB4MDMsIDB4MDAsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4RkYsIDB4RjcsIDB4MDIsIDB4MTUsIDB4NjAsIDB4RUMsIDB4RkQsCisJIDB4NDMsIDB4NDgsIDB4NjUsIDB4NDEsIDB4MkIsIDB4NjAsIDB4REEsIDB4NjMsIDB4MjgsIDB4NDQsIDB4RkYsIDB4QjUsIDB4MTAsIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4RTksIDB4ODEsIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4QTMsIDB4RDksIDB4MEMsIDB4MDMsIDB4NTgsIDB4RDEsIDB4RTksIDB4ODEsIDB4NDAsIDB4NEEsCisJIDB4RkMsIDB4MDQsIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDcsIDB4QjAsIDB4ODQsIDB4QkQsIDB4REIsIDB4NjUsIDB4NDQsIDB4QzgsIDB4ODUsIDB4MkEsIDB4NDQsCisJIDB4RUYsIDB4MDIsIDB4MjgsIDB4NDMsIDB4MDgsIDB4M0EsIDB4MjQsIDB4MDAsIDB4NjAsIDB4NDUsIDB4MDQsIDB4NjQsIDB4MzIsIDB4NjAsIDB4MDAsIDB4NjMsCisJIDB4NDEsIDB4NDgsIDB4RTksIDB4ODEsIDB4Q0MsIDB4ODQsIDB4MDIsIDB4MjQsIDB4REYsIDB4ODMsIDB4RkIsIDB4MDIsIDB4NjMsIDB4NDAsIDB4MDAsIDB4MzYsCisJIDB4MTcsIDB4MDAsIDB4MTcsIDB4NjAsIDB4MTEsIDB4RkQsIDB4MkUsIDB4NjAsIDB4MjQsIDB4NjMsIDB4NjUsIDB4NDQsIDB4MjgsIDB4NDEsIDB4RTksIDB4ODEsCisJIDB4NTgsIDB4RDEsIDB4RkQsIDB4MDQsIDB4QTMsIDB4RDksIDB4MTUsIDB4MDMsIDB4NTgsIDB4RDEsIDB4RTksIDB4ODEsIDB4NjAsIDB4NDUsIDB4RkMsIDB4MDQsCisJIDB4QTMsIDB4RDEsIDB4NjQsIDB4NDcsIDB4QjAsIDB4ODQsIDB4QkQsIDB4REIsIDB4MDAsIDB4QjksIDB4NjUsIDB4NDQsIDB4RjAsIDB4MDIsIDB4MDksIDB4MDAsCisJIDB4NjcsIDB4NDMsIDB4MTYsIDB4NjAsIDB4QzYsIDB4RkQsIDB4MTYsIDB4NjAsIDB4Q0MsIDB4RkQsIDB4MTYsIDB4NjAsIDB4RDYsIDB4RkQsIDB4MTYsIDB4NjAsCisJIDB4RTAsIDB4RkQsIDB4MjAsIDB4NDAsIDB4MTAsIDB4MjcsIDB4MEQsIDB4MDAsIDB4MkIsIDB4NjAsIDB4RTIsIDB4NjEsIDB4MTUsIDB4NjAsIDB4RUMsIDB4RjMsCisJIDB4QTEsIDB4REIsIDB4RkYsIDB4QjQsIDB4Q0MsIDB4ODQsIDB4QTgsIDB4ODMsIDB4MkIsIDB4NjAsIDB4RDgsIDB4NjQsIDB4NTgsIDB4RDEsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MkIsIDB4NjAsIDB4RTQsIDB4NjMsIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjMsIDB4MDgsIDB4NjEsIDB4NjAsIDB4RkUsIDB4QTMsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4MjAsIDB4RkUsIDB4MDAsIDB4QTgsIDB4RTgsIDB4ODQsIDB4MEYsIDB4MDMsIDB4NjAsIDB4RkUsIDB4MDIsIDB4MjgsIDB4RjYsIDB4MDEsCisJIDB4ODAsIDB4NjIsIDB4QjIsIDB4OUMsIDB4QkQsIDB4RDksIDB4NjIsIDB4RjksIDB4Q0QsIDB4ODEsIDB4MDAsIDB4MzYsIDB4MDEsIDB4MDAsIDB4RUUsIDB4MDEsCisJIDB4MkUsIDB4NjAsIDB4MjQsIDB4NjMsIDB4MDgsIDB4NjEsIDB4RUEsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MkIsIDB4NjAsIDB4N0MsIDB4NjMsCisJIDB4NjUsIDB4NDAsIDB4RkYsIDB4MzYsIDB4MDIsIDB4QTMsIDB4QTMsIDB4RDMsIDB4RkYsIDB4RkYsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4NDAsIDB4MjYsIDB4N0YsIDB4QjQsIDB4MjAsIDB4MjYsIDB4M0YsIDB4QjQsIDB4NjAsIDB4NDUsIDB4ODAsIDB4NjMsIDB4RUYsIDB4NjAsCisJIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4REYsIDB4RkIsIDB4NDAsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTAsIDB4RkIsIDB4MjAsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTEsIDB4RkIsIDB4MTAsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4RTIsIDB4RkIsIDB4MDgsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4RTMsIDB4RkIsIDB4MDQsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTQsIDB4RkIsCisJIDB4MDIsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTUsIDB4RkIsIDB4MDEsIDB4NjMsCisJIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4MzMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTYsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4QkUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MEYsIDB4QjQsIDB4NjAsIDB4NDUsIDB4MDgsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsCisJIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTcsIDB4RkIsIDB4MDQsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUUsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsIDB4RTgsIDB4RkIsIDB4MDIsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MTUsIDB4NjAsIDB4RTksIDB4RkIsIDB4MDEsIDB4NjMsIDB4RUYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NUUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MTUsIDB4NjAsCisJIDB4RUEsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NUMsIDB4QTcsIDB4ODQsIDB4RUIsIDB4ODMsIDB4MTQsIDB4MDIsIDB4MDEsIDB4MDMsCisJIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MEEsIDB4NjQsCisJIDB4MDgsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MTAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MjAsIDB4MzYsIDB4MDksIDB4NjQsIDB4NDAsIDB4MzYsIDB4MDksIDB4NjQsCisJIDB4ODAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MTEsIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsIDB4MEIsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MEYsIDB4NjQsCisJIDB4MDQsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDgsIDB4MzYsIDB4MEUsIDB4NjQsIDB4MTAsIDB4MzYsIDB4MDksIDB4NjQsIDB4MjAsIDB4MzYsIDB4MEQsIDB4NjQsCisJIDB4NDAsIDB4MzYsIDB4MDgsIDB4NjQsIDB4ODAsIDB4MzYsIDB4MEMsIDB4NjQsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NUMsIDB4QTcsIDB4ODQsCisJIDB4RUIsIDB4ODMsIDB4MEMsIDB4MDIsIDB4MDEsIDB4MDMsIDB4RkIsIDB4MDEsIDB4NjQsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MEEsIDB4NjQsIDB4MDIsIDB4MzYsCisJIDB4MTQsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MzcsIDB4NjQsIDB4MDgsIDB4MzYsIDB4NkUsIDB4NjQsIDB4MDksIDB4MDAsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MzYsCisJIDB4MEEsIDB4NjQsIDB4MDIsIDB4MzYsIDB4MTQsIDB4NjQsIDB4MDQsIDB4MzYsIDB4MzcsIDB4NjQsIDB4MDgsIDB4MzYsIDB4NkUsIDB4NjQsIDB4MkQsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NjAsIDB4RkUsIDB4ODEsIDB4QTEsIDB4N0YsIDB4QTEsIDB4MDIsIDB4MDYsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4NUQsIDB4RDIsCisJIDB4Q0YsIDB4ODMsIDB4RDQsIDB4ODAsIDB4MjUsIDB4MDMsIDB4MTYsIDB4MDMsIDB4Q0YsIDB4ODMsIDB4NjEsIDB4NDQsIDB4ODAsIDB4QTAsIDB4MjAsIDB4MDMsCisJIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4NUQsIDB4RDIsIDB4Q0YsIDB4ODMsIDB4ODEsIDB4QTEsIDB4MTksIDB4MDMsIDB4MDUsIDB4MDcsCisJIDB4N0YsIDB4QTEsIDB4Q0MsIDB4ODQsIDB4REQsIDB4ODEsIDB4RTYsIDB4MDMsIDB4RjcsIDB4MDEsIDB4MDAsIDB4RjQsIDB4MDAsIDB4QjgsIDB4MDQsIDB4NjEsCisJIDB4RTYsIDB4MDMsIDB4RjIsIDB4MDEsIDB4MkMsIDB4NDMsIDB4NUQsIDB4RDAsIDB4REUsIDB4RDksIDB4NjQsIDB4NDQsIDB4NUQsIDB4RDAsIDB4REUsIDB4RDksCisJIDB4Q0MsIDB4ODQsIDB4ODEsIDB4QTEsIDB4MDUsIDB4MDMsIDB4N0YsIDB4QTEsIDB4RjksIDB4MDQsIDB4MDAsIDB4RjQsIDB4MDMsIDB4NjEsIDB4RjYsIDB4MDEsCisJIDB4MjAsIDB4RkUsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTYsIDB4NjQsIDB4MkIsIDB4MDAsIDB4MDIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjQsIDB4MjcsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTIsIDB4NjQsIDB4MjMsIDB4MDAsIDB4MDgsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUYsIDB4MDAsIDB4MTAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4NjQsIDB4MUIsIDB4MDAsIDB4MjAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MEMsIDB4NjQsIDB4MTcsIDB4MDAsIDB4NDAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjQsIDB4MTMsIDB4MDAsIDB4ODAsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsIDB4MEYsIDB4MDAsIDB4MDEsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDYsIDB4NjQsIDB4MEIsIDB4MDAsIDB4MDIsIDB4M0IsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MDcsIDB4MDAsIDB4MDQsIDB4M0IsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsIDB4MDMsIDB4MDAsIDB4MDgsIDB4M0IsCisJIDB4RkYsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MzYsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjEsIDB4MkMsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjEsIDB4MjgsIDB4MDAsIDB4MjQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjEsIDB4MjQsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDYsIDB4NjEsIDB4MjAsIDB4MDAsIDB4MTIsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjEsIDB4MUMsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEEsIDB4NjEsIDB4MTgsIDB4MDAsIDB4MDksIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MEMsIDB4NjEsIDB4MTQsIDB4MDAsIDB4MDYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MEUsIDB4NjEsIDB4MTAsIDB4MDAsIDB4NkUsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjEsIDB4MEMsIDB4MDAsIDB4MzcsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTIsIDB4NjEsIDB4MDgsIDB4MDAsIDB4MTQsIDB4M0EsCisJIDB4MDIsIDB4MDAsIDB4MTQsIDB4NjEsIDB4MDQsIDB4MDAsIDB4MEEsIDB4M0EsIDB4RkYsIDB4RkYsIDB4MTYsIDB4NjEsIDB4MDAsIDB4MDAsIDB4NjUsIDB4NDAsCisJIDB4MDEsIDB4M0EsIDB4MTMsIDB4MDAsIDB4NjYsIDB4NDUsIDB4MkIsIDB4NDYsIDB4OTIsIDB4RkEsIDB4NjUsIDB4NDYsIDB4MjYsIDB4RjIsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDEsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsIDB4NjEsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RDQsIDB4ODQsIDB4NjYsIDB4NDEsIDB4MkIsIDB4NDYsCisJIDB4MEUsIDB4RjIsIDB4NjAsIDB4NDUsIDB4NjUsIDB4NUUsIDB4MEUsIDB4RkEsIDB4NjEsIDB4NDYsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4Q0QsIDB4ODEsCisJIDB4N0YsIDB4QjQsIDB4MDIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MkUsIDB4MDAsIDB4MDQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4NjQsCisJIDB4MkEsIDB4MDAsIDB4MEIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4NjQsIDB4MjYsIDB4MDAsIDB4MTYsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4NjQsCisJIDB4MjIsIDB4MDAsIDB4MEMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MTAsIDB4NjQsIDB4MUUsIDB4MDAsIDB4MTIsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MjAsIDB4NjQsCisJIDB4MUEsIDB4MDAsIDB4MTgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4NDAsIDB4NjQsIDB4MTYsIDB4MDAsIDB4MjQsIDB4M0EsIDB4MDIsIDB4MDAsIDB4ODAsIDB4NjQsCisJIDB4MTIsIDB4MDAsIDB4MzAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDEsIDB4N0YsIDB4MEUsIDB4MDAsIDB4NDgsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDIsIDB4N0YsCisJIDB4MEEsIDB4MDAsIDB4NjAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDQsIDB4N0YsIDB4MDYsIDB4MDAsIDB4NkMsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDgsIDB4N0YsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MjAsIDB4RkUsIDB4MkEsIDB4NDUsIDB4MzQsIDB4OEEsIDB4NjAsIDB4RkUsIDB4NjEsIDB4NDAsCisJIDB4MDAsIDB4MzYsIDB4MDIsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QzMsIDB4MDEsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NTMsIDB4RkIsIDB4NTQsIDB4RkIsCisJIDB4MDAsIDB4NjAsIDB4MEMsIDB4NjMsIDB4MTQsIDB4NjAsIDB4RUMsIDB4NjIsIDB4MDAsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkUsIDB4MUYsIDB4MDIsIDB4NjQsCisJIDB4MEEsIDB4NjAsIDB4NzgsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjAsIDB4N0EsIDB4RjMsIDB4MDAsIDB4NjMsIDB4RjAsIDB4QTAsCisJIDB4MDEsIDB4QTQsIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4REQsIDB4MEEsIDB4NjAsIDB4N0IsIDB4RjEsCisJIDB4QTIsIDB4REQsIDB4NUEsIDB4RDMsIDB4QTIsIDB4REQsIDB4QzAsIDB4ODEsIDB4NjEsIDB4NDQsIDB4MDIsIDB4MjQsIDB4RkYsIDB4RkYsIDB4RTksIDB4ODEsCisJIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4RTksIDB4ODEsIDB4NUEsIDB4RDMsIDB4RTksIDB4ODEsIDB4RTgsIDB4ODMsIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODMsCisJIDB4RUIsIDB4ODMsIDB4RUIsIDB4ODUsIDB4RDQsIDB4ODUsIDB4QzUsIDB4ODMsIDB4QTIsIDB4REQsIDB4NjMsIDB4NDcsIDB4MDAsIDB4N0YsIDB4MEEsIDB4NjAsCisJIDB4NzcsIDB4RkIsIDB4MkUsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjcsIDB4MDEsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QjEsIDB4RkUsCisJIDB4MDUsIDB4MDUsIDB4QjAsIDB4RkUsIDB4MDYsIDB4MDUsIDB4QjIsIDB4RkUsIDB4QjMsIDB4RkUsIDB4MjEsIDB4MDAsIDB4RjcsIDB4NjAsIDB4MzgsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MjgsIDB4RjMsIDB4MjksIDB4RjEsIDB4NDAsIDB4NDQsIDB4NDQsIDB4NDUsIDB4MkEsIDB4RjEsIDB4MkIsIDB4RjEsIDB4NDQsIDB4NDYsCisJIDB4NDQsIDB4NDcsIDB4M0YsIDB4QjQsIDB4RTAsIDB4ODUsIDB4MTksIDB4NjAsIDB4MDYsIDB4NjQsIDB4NDQsIDB4RDcsIDB4NTgsIDB4NDMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDUsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsIDB4NjEsIDB4NDMsIDB4MDQsIDB4QjQsIDB4MjQsIDB4NDQsIDB4MDIsIDB4MDMsIDB4MTMsIDB4RkYsCisJIDB4MDYsIDB4MDAsIDB4M0YsIDB4QjQsIDB4QjQsIDB4ODQsIDB4RkYsIDB4MjcsIDB4MDUsIDB4RkQsIDB4MDQsIDB4RkIsIDB4MTAsIDB4NzUsIDB4QTEsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4ODYsIDB4M0UsIDB4QjQsIDB4RkUsIDB4MDksIDB4MDUsIDB4QjUsIDB4RkUsIDB4MDIsIDB4MjQsIDB4N0YsIDB4RjcsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4QjcsIDB4RkUsIDB4MDUsIDB4MDUsIDB4QjYsIDB4RkUsIDB4RjIsIDB4MDEsIDB4RjcsIDB4NjAsIDB4NzMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MzYsIDB4NDQsIDB4MDAsIDB4N0YsIDB4RUUsIDB4QTAsIDB4NjAsIDB4NDUsIDB4MDUsIDB4MDUsIDB4MTksIDB4NjAsIDB4OTgsIDB4NjQsIDB4NDQsIDB4RDcsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4RTMsIDB4MDEsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDAsIDB4MDIsIDB4NjQsIDB4NDAsIDB4NTAsIDB4NjEsIDB4RkYsCisJIDB4M0YsIDB4NDAsIDB4NDAsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4RTAsIDB4NDYsIDB4NjAsIDB4MDksIDB4RTAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4RjEsCisJIDB4MDAsIDB4NjYsIDB4MjAsIDB4NzgsIDB4NDIsIDB4RkUsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsCisJIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTksIDB4MDIsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsIDB4MDcsIDB4N0MsIDB4MjAsIDB4QjUsCisJIDB4MEMsIDB4QjUsIDB4MDQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsIDB4MEYsIDB4MDAsIDB4MDAsIDB4NjEsIDB4NDEsIDB4NTYsCisJIDB4QzcsIDB4RkUsIDB4QjUsIDB4MDEsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsCisJIDB4MDQsIDB4MDAsIDB4MjAsIDB4NDQsIDB4ODAsIDB4QkMsIDB4NDAsIDB4NDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsCisJIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MzEsIDB4MDIsIDB4MEEsIDB4NjAsIDB4N0UsIDB4RjMsCisJIDB4MDEsIDB4N0MsIDB4MjAsIDB4QjUsIDB4MEMsIDB4QjUsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4QkMsIDB4RjksIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4N0QsIDB4RjEsIDB4MjAsIDB4NDQsIDB4NjQsIDB4NDAsCisJIDB4RkYsIDB4MjYsIDB4MUMsIDB4MDAsIDB4N0YsIDB4QjQsIDB4NDAsIDB4NDAsIDB4NUMsIDB4NUUsIDB4ODIsIDB4RkYsIDB4MjYsIDB4NDQsIDB4RkQsIDB4QjQsCisJIDB4NDAsIDB4NDYsIDB4NUMsIDB4NDEsIDB4ODcsIDB4RkYsIDB4NjIsIDB4RkYsIDB4MEYsIDB4NjAsIDB4ODUsIDB4RjMsIDB4RkYsIDB4RkYsIDB4MDAsIDB4QTgsCisJIDB4NjAsIDB4NDYsIDB4MDQsIDB4MDMsIDB4MDksIDB4RjIsIDB4OEYsIDB4RkMsIDB4QUMsIDB4ODYsIDB4RkIsIDB4MDEsIDB4RDMsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4RkUsIDB4QjQsIDB4RDMsIDB4RkIsIDB4MDYsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MkQsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDEsIDB4RjIsIDB4MDgsIDB4RjAsIDB4NjAsIDB4NDcsIDB4MDMsIDB4QjQsIDB4MDMsIDB4QUMsIDB4N0YsIDB4NjcsCisJIDB4MDMsIDB4NjEsIDB4MDgsIDB4MDIsIDB4MUYsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjQsIDB4NDAsIDB4MDEsIDB4MkIsIDB4NDksIDB4MDAsIDB4MjUsIDB4NDQsCisJIDB4MUYsIDB4QjQsIDB4RTAsIDB4ODUsIDB4RjEsIDB4NjAsIDB4NzYsIDB4NjQsIDB4QzQsIDB4OTgsIDB4RkYsIDB4RkYsIDB4QzAsIDB4RkUsIDB4M0QsIDB4MDAsCisJIDB4QzEsIDB4RkUsIDB4M0IsIDB4MDAsIDB4QzIsIDB4RkUsIDB4MzksIDB4MDAsIDB4QzMsIDB4RkUsIDB4MzcsIDB4MDAsIDB4QzQsIDB4RkUsIDB4MzUsIDB4MDAsCisJIDB4QzUsIDB4RkUsIDB4MzMsIDB4MDAsIDB4QzYsIDB4RkUsIDB4MzEsIDB4MDAsIDB4QzcsIDB4RkUsIDB4MkYsIDB4MDAsIDB4QzgsIDB4RkUsIDB4MkQsIDB4MDAsCisJIDB4QzksIDB4RkUsIDB4MkIsIDB4MDAsIDB4Q0EsIDB4RkUsIDB4MjksIDB4MDAsIDB4Q0IsIDB4RkUsIDB4MjcsIDB4MDAsIDB4Q0MsIDB4RkUsIDB4MjUsIDB4MDAsCisJIDB4Q0QsIDB4RkUsIDB4MjMsIDB4MDAsIDB4Q0UsIDB4RkUsIDB4MjEsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4MUYsIDB4MDAsIDB4RDAsIDB4RkUsIDB4MUQsIDB4MDAsCisJIDB4RDEsIDB4RkUsIDB4MUIsIDB4MDAsIDB4RDIsIDB4RkUsIDB4MTksIDB4MDAsIDB4RDMsIDB4RkUsIDB4MTcsIDB4MDAsIDB4RDQsIDB4RkUsIDB4MTUsIDB4MDAsCisJIDB4RDUsIDB4RkUsIDB4MTMsIDB4MDAsIDB4RDYsIDB4RkUsIDB4MTEsIDB4MDAsIDB4RDcsIDB4RkUsIDB4MEYsIDB4MDAsIDB4RDgsIDB4RkUsIDB4MEQsIDB4MDAsCisJIDB4RDksIDB4RkUsIDB4MEIsIDB4MDAsIDB4REEsIDB4RkUsIDB4MDksIDB4MDAsIDB4REIsIDB4RkUsIDB4MDcsIDB4MDAsIDB4REMsIDB4RkUsIDB4MDUsIDB4MDAsCisJIDB4REQsIDB4RkUsIDB4MDMsIDB4MDAsIDB4REUsIDB4RkUsIDB4MDEsIDB4MDAsIDB4REYsIDB4RkUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjQsIDB4OUYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUQsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OUIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OUEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTksIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTgsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4OTcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTUsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OTIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OTAsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4MDYsIDB4RkIsIDB4OEYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEUsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEQsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4OEIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4OEEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODksIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODgsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4RkYsIDB4RkYsIDB4ODcsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODYsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODUsIDB4RkUsCisJIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODQsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODMsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsCisJIDB4ODIsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODEsIDB4RkUsIDB4RjAsIDB4ODQsIDB4RkYsIDB4RkYsIDB4ODAsIDB4RkUsIDB4RjAsIDB4ODQsCisJIDB4MDUsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NUMsIDB4NUMsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjQsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NTUsIDB4MDAsIDB4MDUsIDB4NjAsIDB4MDAsIDB4NjMsIDB4MDUsIDB4RkQsIDB4MzAsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MzgsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MzksIDB4NDQsIDB4QkQsIDB4REIsIDB4M0EsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0IsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0MsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4M0QsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0UsIDB4NDQsIDB4QkQsIDB4REIsIDB4M0YsIDB4NDQsIDB4QkQsIDB4REIsIDB4MDIsIDB4NjEsIDB4NjEsIDB4NDQsCisJIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsCisJIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsIDB4MDcsIDB4MzYsIDB4ODcsIDB4RkYsIDB4MjAsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjEsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjQsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjUsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MjYsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjcsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjgsIDB4NDQsIDB4QkQsIDB4REIsIDB4MjksIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkEsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkIsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkMsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkQsIDB4NDQsIDB4QkQsIDB4REIsCisJIDB4MkUsIDB4NDQsIDB4QkQsIDB4REIsIDB4MkYsIDB4NDQsIDB4QkQsIDB4REIsIDB4REQsIDB4ODEsIDB4MDgsIDB4M0EsIDB4RDAsIDB4MDEsIDB4NTQsIDB4MDAsCisJIDB4MjcsIDB4NDAsIDB4MTAsIDB4MjYsIDB4MzAsIDB4MDAsIDB4MjYsIDB4NDQsIDB4MDEsIDB4MzYsIDB4MkQsIDB4MDAsIDB4MDIsIDB4MzYsIDB4ODIsIDB4RkYsCisJIDB4MDMsIDB4MzYsIDB4ODMsIDB4RkYsIDB4MDQsIDB4MzYsIDB4ODQsIDB4RkYsIDB4MDUsIDB4MzYsIDB4ODUsIDB4RkYsIDB4MDYsIDB4MzYsIDB4ODYsIDB4RkYsCisJIDB4MjUsIDB4NDQsIDB4MDAsIDB4MzYsIDB4NDQsIDB4NDAsIDB4MDEsIDB4MzYsIDB4NDQsIDB4NDEsIDB4MDIsIDB4MzYsIDB4NDQsIDB4NDIsIDB4MDMsIDB4MzYsCisJIDB4NDQsIDB4NDMsIDB4MDQsIDB4MzYsIDB4NDQsIDB4NDQsIDB4MDUsIDB4MzYsIDB4NDQsIDB4NDUsIDB4MDYsIDB4MzYsIDB4NDQsIDB4NDYsIDB4MDcsIDB4MzYsCisJIDB4NDQsIDB4NDcsIDB4MDgsIDB4MzYsIDB4NDQsIDB4NDgsIDB4MDksIDB4MzYsIDB4NDQsIDB4NDksIDB4MEEsIDB4MzYsIDB4NDQsIDB4NEEsIDB4MEIsIDB4MzYsCisJIDB4NDQsIDB4NEIsIDB4MEMsIDB4MzYsIDB4NDQsIDB4NEMsIDB4MEQsIDB4MzYsIDB4NDQsIDB4NEQsIDB4MEUsIDB4MzYsIDB4NDQsIDB4NEUsIDB4MEYsIDB4MzYsCisJIDB4NDQsIDB4NEYsIDB4ODcsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MjUsIDB4NDQsIDB4MTAsIDB4MzYsIDB4NDQsIDB4NTAsIDB4MTEsIDB4MzYsIDB4NDQsIDB4NTEsCisJIDB4MTIsIDB4MzYsIDB4NDQsIDB4NTIsIDB4MTMsIDB4MzYsIDB4NDQsIDB4NTMsIDB4MTQsIDB4MzYsIDB4NDQsIDB4NTQsIDB4MTUsIDB4MzYsIDB4NDQsIDB4NTUsCisJIDB4MTYsIDB4MzYsIDB4NDQsIDB4NTYsIDB4MTcsIDB4MzYsIDB4NDQsIDB4NTcsIDB4MTgsIDB4MzYsIDB4NDQsIDB4NTgsIDB4MTksIDB4MzYsIDB4NDQsIDB4NTksCisJIDB4MUEsIDB4MzYsIDB4NDQsIDB4NUEsIDB4MUIsIDB4MzYsIDB4NDQsIDB4NUIsIDB4MUMsIDB4MzYsIDB4NDQsIDB4NUMsIDB4MUQsIDB4MzYsIDB4NDQsIDB4NUQsCisJIDB4MUUsIDB4MzYsIDB4NDQsIDB4NUUsIDB4MUYsIDB4MzYsIDB4NDQsIDB4NUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4NDYsCisJIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NEIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDMsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MEEsIDB4MDIsIDB4MDAsIDB4RjAsCisJIDB4MDQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NUEsIDB4RDksIDB4MEEsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsCisJIDB4MDIsIDB4NjEsIDB4MTIsIDB4MDIsIDB4MTQsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsCisJIDB4RjIsIDB4NjAsIDB4RjcsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MkEsIDB4RjMsCisJIDB4MDUsIDB4RkIsIDB4MkIsIDB4RjMsIDB4MDYsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MEUsIDB4MDIsIDB4MTYsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OUYsIDB4RkIsCisJIDB4MDAsIDB4NjAsIDB4NTAsIDB4NjMsIDB4NUEsIDB4REQsIDB4RjMsIDB4NjAsIDB4MTIsIDB4NjQsIDB4N0YsIDB4RkIsIDB4MkQsIDB4RkYsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4N0YsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsCisJIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4MzUsIDB4MDIsIDB4MjUsIDB4NDUsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsCisJIDB4MzQsIDB4MDMsIDB4RjEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDQsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDMsIDB4MjgsIDB4MDAsIDB4MTUsIDB4NjAsCisJIDB4QzMsIDB4RjEsIDB4OTksIDB4RjMsIDB4MTksIDB4NjAsIDB4MDAsIDB4NjEsIDB4QTAsIDB4ODQsIDB4QTEsIDB4REIsIDB4MjUsIDB4NDUsIDB4MUUsIDB4NjAsCisJIDB4OTYsIDB4NjMsIDB4MDEsIDB4NjEsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDEsIDB4RDQsIDB4ODAsIDB4QkQsIDB4RDMsIDB4QkQsIDB4RDUsIDB4Q0QsIDB4ODEsCisJIDB4MDIsIDB4MDMsIDB4MTUsIDB4MDMsIDB4RjcsIDB4MDEsIDB4QTIsIDB4RkYsIDB4QTYsIDB4RDMsIDB4NDAsIDB4NEMsIDB4MDAsIDB4QTgsIDB4NjcsIDB4NDMsCisJIDB4MEMsIDB4MDIsIDB4QTIsIDB4REQsIDB4NDIsIDB4NDgsIDB4NjQsIDB4NDEsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QTIsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4NjYsIDB4NDQsIDB4MjgsIDB4REIsIDB4MDIsIDB4MDMsIDB4MkMsIDB4NTgsIDB4QTMsIDB4RkYsIDB4MEMsIDB4NjEsIDB4MDMsIDB4MDAsIDB4MDQsIDB4NjEsCisJIDB4N0YsIDB4NjcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RjEsIDB4NjAsIDB4MDIsIDB4NjQsIDB4RDQsIDB4ODAsCisJIDB4N0YsIDB4NjcsIDB4MDYsIDB4NjMsIDB4RjgsIDB4MDIsIDB4MzEsIDB4NDAsIDB4MjEsIDB4MkEsIDB4RjUsIDB4MDEsIDB4MDEsIDB4NjQsIDB4MEMsIDB4NjAsCisJIDB4ODIsIDB4RkIsIDB4RkYsIDB4RkYsIDB4QzQsIDB4RkUsIDB4RUUsIDB4MDEsIDB4QzYsIDB4RkUsIDB4RUMsIDB4MDEsIDB4N0UsIDB4NjAsIDB4QzAsIDB4NjQsCisJIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4MDIsIDB4NjEsIDB4M0YsIDB4MDIsIDB4MjUsIDB4NDUsIDB4RjgsIDB4MkIsIDB4M0IsIDB4MDAsIDB4MkUsIDB4RjUsCisJIDB4NjcsIDB4NDQsIDB4RDQsIDB4ODAsIDB4MTksIDB4NjAsIDB4QUEsIDB4NjMsIDB4MzksIDB4MDMsIDB4N0UsIDB4NjEsIDB4MjQsIDB4NDQsIDB4MDEsIDB4MjcsCisJIDB4MjksIDB4MDAsIDB4QTMsIDB4RkMsIDB4QTQsIDB4RjgsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsCisJIDB4NjQsIDB4NTgsIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsIDB4MDgsIDB4NjAsIDB4MDAsIDB4NjMsIDB4QkQsIDB4RDMsIDB4QTMsIDB4RDEsIDB4RkUsIDB4QTAsCisJIDB4RkEsIDB4NjAsIDB4MDAsIDB4NjQsIDB4RDAsIDB4ODAsIDB4MTQsIDB4MDIsIDB4MTMsIDB4MDIsIDB4MDQsIDB4QTMsIDB4QkUsIDB4RDMsIDB4QkQsIDB4RDEsCisJIDB4MEYsIDB4MTgsIDB4RDQsIDB4ODAsIDB4MEQsIDB4MTgsIDB4MDMsIDB4MDMsIDB4QzMsIDB4ODMsIDB4QzMsIDB4ODMsIDB4RjcsIDB4MDEsIDB4NjQsIDB4NDEsCisJIDB4REQsIDB4ODEsIDB4RTEsIDB4ODEsIDB4Q0IsIDB4ODMsIDB4NDYsIDB4NjUsIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4NjcsIDB4MEEsIDB4MDAsIDB4QkQsIDB4RDMsIDB4QkUsIDB4RDEsIDB4RDQsIDB4ODAsIDB4Q0QsIDB4ODEsIDB4MDgsIDB4MjQsIDB4NjQsIDB4NTgsCisJIDB4MDgsIDB4QTMsIDB4RjgsIDB4MDIsIDB4MDQsIDB4NjEsIDB4N0YsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEYsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4NjcsIDB4NDQsIDB4MjQsIDB4RkEsIDB4NjIsIDB4NDEsIDB4M0UsIDB4NjAsIDB4MDAsIDB4NjUsIDB4MUEsIDB4NjMsIDB4RjcsIDB4NjAsIDB4OEMsIDB4NjQsCisJIDB4NjUsIDB4NDYsIDB4NTgsIDB4RDAsIDB4MkUsIDB4RjUsIDB4NTksIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NEIsIDB4RDMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4REMsIDB4ODQsIDB4MjMsIDB4RkEsIDB4QkYsIDB4RDEsIDB4NEEsIDB4NjUsCisJIDB4NjQsIDB4NDMsIDB4RjgsIDB4NjAsIDB4NTgsIDB4NEYsIDB4N0EsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4RTAsIDB4QTAsIDB4MjAsIDB4NjQsIDB4MDEsIDB4MDYsIDB4MjUsIDB4RkEsIDB4MjMsIDB4RjIsIDB4REYsIDB4RDEsCisJIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODUsIDB4MEIsIDB4MDYsIDB4QkYsIDB4RDEsIDB4NjQsIDB4NDEsIDB4RDUsIDB4ODAsIDB4NjQsIDB4NDMsIDB4MDEsIDB4MDYsCisJIDB4NjUsIDB4NDEsIDB4NEEsIDB4NjUsIDB4RjQsIDB4NjAsIDB4NTgsIDB4NEYsIDB4QkQsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4QkMsIDB4RjMsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsIDB4MDcsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NEIsIDB4RDMsIDB4QkYsIDB4RDMsIDB4NjAsIDB4NDEsIDB4QzksIDB4ODMsIDB4RTksIDB4ODEsIDB4REQsIDB4ODEsIDB4QTMsIDB4RkEsCisJIDB4RTAsIDB4ODEsIDB4M0MsIDB4NjAsIDB4MDAsIDB4NjcsIDB4MDIsIDB4MjQsIDB4MDIsIDB4QTQsIDB4NjAsIDB4NDcsIDB4NDAsIDB4NEIsIDB4QzksIDB4ODEsCisJIDB4NEEsIDB4NjUsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjYsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsCisJIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4NjAsIDB4NDcsIDB4MjUsIDB4RkEsIDB4MDAsIDB4N0UsIDB4NjAsIDB4NDcsIDB4MDEsIDB4MjYsCisJIDB4REMsIDB4ODQsIDB4NjAsIDB4NDEsIDB4RTgsIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4QUIsIDB4MDEsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDEsCisJIDB4NEMsIDB4NjUsIDB4QTQsIDB4RDMsIDB4REEsIDB4ODMsIDB4MDAsIDB4N0YsIDB4MjUsIDB4RkEsIDB4NjAsIDB4NDEsIDB4MDEsIDB4MjYsIDB4REQsIDB4ODEsCisJIDB4RTksIDB4ODQsIDB4RDgsIDB4ODQsIDB4MjMsIDB4RkEsIDB4OUQsIDB4MDEsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTgsIDB4RjgsIDB4QTAsCisJIDB4MEYsIDB4MDIsIDB4RUMsIDB4QTAsIDB4MEQsIDB4MDQsIDB4MEMsIDB4MDcsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RjEsIDB4RkYsIDB4RkYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDQsIDB4MDcsIDB4MTUsIDB4NjAsIDB4RDIsIDB4RkIsIDB4MTUsIDB4NjAsIDB4RDYsIDB4RkIsIDB4MTMsIDB4NjAsIDB4NUIsIDB4RkIsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MTQsIDB4NjAsIDB4RUUsIDB4NjUsIDB4NjAsIDB4NDEsIDB4MTQsIDB4NjAsCisJIDB4OEEsIDB4NjMsIDB4QTMsIDB4REIsIDB4RkYsIDB4QTEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsIDB4N0UsIDB4QTgsIDB4NUIsIDB4RDksIDB4MDIsIDB4MDIsCisJIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RkYsIDB4QTEsIDB4RDcsIDB4ODAsIDB4MDIsIDB4MDMsIDB4MDEsIDB4MDMsIDB4RjUsIDB4MDEsIDB4MkUsIDB4RjUsCisJIDB4MDAsIDB4NjAsIDB4MkYsIDB4NjUsIDB4MjUsIDB4RjIsIDB4MDAsIDB4NjMsIDB4Q0MsIDB4ODQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4MDUsIDB4NEEsIDB4NjQsCisJIDB4RDcsIDB4ODAsIDB4MTQsIDB4NjAsIDB4MjYsIDB4NjEsIDB4MTgsIDB4MDUsIDB4QTEsIDB4REQsIDB4RTMsIDB4ODMsIDB4RkUsIDB4QTMsIDB4NTgsIDB4RDAsCisJIDB4N0UsIDB4QTgsIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MDAsIDB4NjMsIDB4NTksIDB4REQsCisJIDB4MkUsIDB4RjUsIDB4MjUsIDB4RjAsIDB4MEEsIDB4NjAsIDB4MTMsIDB4RjMsIDB4RDMsIDB4ODAsIDB4MDEsIDB4QjAsIDB4MDQsIDB4MDMsIDB4MDEsIDB4QTQsCisJIDB4MDMsIDB4MDMsIDB4QTIsIDB4REIsIDB4MDEsIDB4MDAsIDB4QTIsIDB4REQsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTQsIDB4NjAsCisJIDB4OEEsIDB4NjEsIDB4QTEsIDB4RDMsIDB4MjMsIDB4RkEsIDB4RTAsIDB4ODMsIDB4NEEsIDB4NjUsIDB4MDQsIDB4MDIsIDB4MDIsIDB4NjMsIDB4MjMsIDB4RkMsCisJIDB4QTUsIDB4RkMsIDB4MDksIDB4MDAsIDB4REIsIDB4ODMsIDB4NTksIDB4RDEsIDB4QTUsIDB4RDgsIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MEEsIDB4NjAsIDB4MTMsIDB4RjMsCisJIDB4MDAsIDB4NjEsIDB4MDIsIDB4QTQsIDB4RkUsIDB4QTAsIDB4MjMsIDB4RkEsIDB4MUIsIDB4MDMsIDB4RkEsIDB4QTQsIDB4RkQsIDB4QTQsIDB4MDEsIDB4QTEsCisJIDB4RkQsIDB4MDcsIDB4NjEsIDB4NDMsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RkMsIDB4RTAsIDB4ODMsIDB4MDIsIDB4QTMsIDB4MTQsIDB4NjAsIDB4MjYsIDB4NjEsCisJIDB4MDAsIDB4NjAsIDB4NEEsIDB4NjQsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4N0UsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsCisJIDB4RjksIDB4MUYsIDB4MjUsIDB4RjIsIDB4MjMsIDB4RjIsIDB4MDEsIDB4QjAsIDB4Q0MsIDB4ODQsIDB4MDQsIDB4MDIsIDB4MjMsIDB4RkEsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDEsIDB4NEIsIDB4NjUsIDB4NDIsIDB4ODAsIDB4NjQsCisJIDB4RDQsIDB4ODUsIDB4MkIsIDB4NDEsIDB4MDAsIDB4QTEsIDB4NTUsIDB4OEIsIDB4MEQsIDB4MDMsIDB4MDIsIDB4MDQsIDB4NjUsIDB4NDEsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4NjQsIDB4NDAsIDB4NEIsIDB4Q0EsIDB4ODQsIDB4NTgsIDB4RDAsIDB4QzksIDB4ODEsIDB4QkQsIDB4RDksIDB4RkMsIDB4MDIsIDB4MDAsIDB4RjQsCisJIDB4MDQsIDB4NjUsIDB4RUMsIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTMsIDB4RDMsIDB4MDIsIDB4N0MsIDB4QTAsIDB4RDMsCisJIDB4MjMsIDB4RjgsIDB4REMsIDB4ODQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MDEsIDB4NjQsIDB4OUQsIDB4RkUsIDB4MDIsIDB4MjgsIDB4MDIsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDIsIDB4N0MsIDB4MjMsIDB4RjgsIDB4MDEsIDB4NjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4NjQsIDB4NDQsIDB4N0MsIDB4NUYsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsCisJIDB4ODgsIDB4RjEsIDB4NjYsIDB4NDEsIDB4QzAsIDB4ODYsIDB4QTUsIDB4RDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsIDB4ODgsIDB4RkYsIDB4NzUsIDB4NDQsIDB4OEQsIDB4RkYsIDB4RTgsIDB4ODcsIDB4RTgsIDB4ODQsCisJIDB4RTgsIDB4ODQsIDB4MDMsIDB4QjQsIDB4MjUsIDB4RkEsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDUsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4NTIsIDB4NjMsIDB4OTYsIDB4RjMsIDB4NEIsIDB4REEsIDB4OTUsIDB4RjMsIDB4NEIsIDB4REEsIDB4OTQsIDB4RjMsIDB4NEIsIDB4REEsIDB4NjAsIDB4NDEsCisJIDB4ODgsIDB4RkYsIDB4NzIsIDB4NUMsIDB4ODksIDB4RkYsIDB4NEEsIDB4RDgsIDB4QTIsIDB4NDgsIDB4MjAsIDB4MjMsIDB4MEUsIDB4MDAsIDB4NjQsIDB4NDAsCisJIDB4ODAsIDB4MjcsIDB4MTUsIDB4MDAsIDB4REMsIDB4ODQsIDB4QkQsIDB4REEsIDB4QkQsIDB4RDIsIDB4MTEsIDB4MDQsIDB4REMsIDB4ODQsIDB4QTIsIDB4REEsCisJIDB4QTMsIDB4RDIsIDB4MEQsIDB4MDQsIDB4REMsIDB4ODQsIDB4QTMsIDB4REEsIDB4MEEsIDB4MDAsIDB4NTIsIDB4NjMsIDB4OTYsIDB4RjMsIDB4NEIsIDB4REEsCisJIDB4OTUsIDB4RjMsIDB4NEIsIDB4REEsIDB4OTQsIDB4RjMsIDB4NEIsIDB4REEsIDB4NTQsIDB4OTAsIDB4NEMsIDB4NjMsIDB4RTAsIDB4MDIsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjAsIDB4MjMsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QzksIDB4RjksIDB4MDIsIDB4QTgsIDB4NjQsIDB4NDQsCisJIDB4MUYsIDB4MDIsIDB4M0YsIDB4NDAsIDB4MDIsIDB4MkIsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MzcsIDB4MTQsIDB4MDAsIDB4MDEsIDB4M0IsIDB4MTgsIDB4MDAsCisJIDB4MTEsIDB4NjAsIDB4RjksIDB4NjUsIDB4MTEsIDB4NjAsIDB4MTksIDB4NjMsIDB4RkYsIDB4QjcsIDB4NjAsIDB4NUMsIDB4QTMsIDB4RDMsIDB4MDgsIDB4QTMsCisJIDB4MDAsIDB4N0UsIDB4RDAsIDB4ODAsIDB4RDcsIDB4ODAsIDB4MDMsIDB4MDMsIDB4RjksIDB4MDIsIDB4N0YsIDB4NjcsIDB4MEEsIDB4MDAsIDB4RjQsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4MDQsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RjIsIDB4QTQsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDcsIDB4MTMsIDB4NjAsIDB4NTIsIDB4RjksCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjAsIDB4NjMsIDB4MjcsIDB4NjAsIDB4MDYsIDB4NjEsIDB4NDgsIDB4NjQsIDB4NTgsIDB4RDAsCisJIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjUsIDB4RjAsIDB4MjAsIDB4NjQsIDB4RDAsIDB4ODEsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDcsIDB4MjUsIDB4RkEsCisJIDB4MEYsIDB4MDAsIDB4MjcsIDB4NjAsIDB4MEEsIDB4NjMsIDB4QzMsIDB4ODMsIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4Q0YsIDB4ODMsIDB4QTMsIDB4RDMsCisJIDB4Q0QsIDB4ODEsIDB4MDAsIDB4N0YsIDB4QkQsIDB4REIsIDB4MDQsIDB4MDMsIDB4MDAsIDB4NjQsIDB4QzksIDB4ODEsIDB4QkQsIDB4REIsIDB4RkQsIDB4MDIsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDEsIDB4NjAsIDB4NkUsIDB4NjMsIDB4N0YsIDB4NjcsCisJIDB4M0EsIDB4MTgsIDB4QTMsIDB4RDksIDB4MjYsIDB4RjAsIDB4N0YsIDB4NjcsIDB4MzYsIDB4MTgsIDB4NUIsIDB4RDksIDB4MTMsIDB4NjAsIDB4MEEsIDB4RjMsCisJIDB4MjUsIDB4RjAsIDB4NjAsIDB4NDAsIDB4MDMsIDB4M0EsIDB4MkUsIDB4MDAsIDB4ODYsIDB4RjMsIDB4ODcsIDB4RjMsIDB4NjAsIDB4NDMsIDB4RTMsIDB4ODMsCisJIDB4NjAsIDB4NDYsIDB4MEYsIDB4RjgsIDB4MzAsIDB4NjEsIDB4OTQsIDB4RkEsIDB4MDEsIDB4NjEsIDB4OTEsIDB4RkEsIDB4MTYsIDB4NjQsIDB4MTIsIDB4RkEsCisJIDB4NjAsIDB4NDAsIDB4MTAsIDB4MzYsIDB4MDUsIDB4MDAsIDB4MTIsIDB4MzYsIDB4MDgsIDB4MDAsIDB4MEMsIDB4MzYsIDB4MEIsIDB4MDAsIDB4MEYsIDB4MDAsCisJIDB4NDAsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MEEsIDB4NjQsIDB4MTEsIDB4MDIsIDB4RjMsIDB4MDEsIDB4MTAsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MEUsIDB4NjQsCisJIDB4MEMsIDB4MDIsIDB4RUUsIDB4MDEsIDB4MDgsIDB4NjEsIDB4QTEsIDB4ODAsIDB4MTAsIDB4NjQsIDB4MDcsIDB4MDIsIDB4RTksIDB4MDEsIDB4RTEsIDB4ODEsCisJIDB4QTEsIDB4ODAsIDB4MDUsIDB4MDUsIDB4QzgsIDB4ODQsIDB4MDEsIDB4MDIsIDB4RTMsIDB4MDEsIDB4MTIsIDB4RkEsIDB4OTEsIDB4RkEsIDB4NjYsIDB4NDQsCisJIDB4MDIsIDB4QTYsIDB4RDcsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsIDB4QTUsIDB4RjAsIDB4QTMsIDB4RDEsCisJIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUUsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4ODgsIDB4RjEsIDB4NjYsIDB4NDMsCisJIDB4QzAsIDB4ODYsIDB4NjUsIDB4NDQsIDB4QTEsIDB4REEsIDB4NjMsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkMsIDB4QTMsCisJIDB4QTMsIDB4RDEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NUUsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDUsIDB4NjQsIDB4NDcsIDB4N0MsIDB4NUYsIDB4ODgsIDB4RjEsCisJIDB4NjYsIDB4NDEsIDB4QzAsIDB4ODYsIDB4NjUsIDB4NDQsIDB4QTAsIDB4RDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RkEsIDB4MDIsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4QzgsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MDIsIDB4MDIsIDB4MkQsIDB4RjksCisJIDB4MkMsIDB4RjksIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjIsIDB4MDIsIDB4QTgsIDB4MDAsIDB4QTgsIDB4MEEsIDB4MDIsCisJIDB4MDcsIDB4MDMsIDB4RDAsIDB4QTAsIDB4MzAsIDB4NjUsIDB4MDMsIDB4MDQsIDB4QTcsIDB4QTAsIDB4NTksIDB4NjUsIDB4MDEsIDB4MDYsIDB4NjUsIDB4NDQsCisJIDB4MTMsIDB4NjAsIDB4NTEsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4Q0YsIDB4RkIsCisJIDB4RkYsIDB4RkYsIDB4MDgsIDB4MkEsIDB4MjUsIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RTksIDB4QjQsIDB4NjAsIDB4NDQsCisJIDB4MTUsIDB4NjAsIDB4Q0YsIDB4RjEsIDB4RkYsIDB4RkYsIDB4NjQsIDB4NDAsIDB4MDEsIDB4MjYsIDB4MDIsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDIsIDB4MkEsCisJIDB4MDQsIDB4QkMsIDB4NjQsIDB4NDAsIDB4MDQsIDB4MjYsIDB4MDgsIDB4MDAsIDB4MTUsIDB4NjAsIDB4REQsIDB4RkIsIDB4MTMsIDB4NjQsIDB4QUQsIDB4RkIsCisJIDB4MDEsIDB4NjAsIDB4NjcsIDB4NjQsIDB4MzcsIDB4RkIsIDB4MEMsIDB4MDAsIDB4MTAsIDB4QkMsIDB4MTUsIDB4NjAsIDB4REQsIDB4RkIsIDB4MDgsIDB4NjQsCisJIDB4QUQsIDB4RkIsIDB4ODIsIDB4RjMsIDB4MDEsIDB4NjAsIDB4NjcsIDB4N0MsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjcsIDB4NUIsIDB4N0MsIDB4MzcsIDB4RjksCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4RDAsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4RDEsIDB4RkIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjUsIDB4RjIsCisJIDB4MTUsIDB4NjAsIDB4RUIsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MEYsIDB4MjIsIDB4NDEsIDB4NzUsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDQsIDB4NjEsIDB4MDYsIDB4MDAsIDB4MDEsIDB4NjQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NjQsIDB4MTgsIDB4NjAsIDB4MTMsIDB4RkIsIDB4MDYsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NzgsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsIDB4MDgsIDB4NjEsCisJIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsIDB4MDQsIDB4MDAsCisJIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDMsIDB4MDAsIDB4MDQsIDB4N0MsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4NzgsIDB4NjAsIDB4QzAsIDB4NjQsIDB4MjQsIDB4NDUsIDB4QTQsIDB4ODAsIDB4N0YsIDB4NjcsIDB4MDIsIDB4NjEsIDB4MTAsIDB4MDIsCisJIDB4MEEsIDB4NjEsIDB4NDEsIDB4NTYsIDB4QzcsIDB4RkUsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MzYsIDB4NDcsIDB4RkYsIDB4MjMsCisJIDB4MDQsIDB4MDAsIDB4MDAsIDB4N0YsIDB4NjAsIDB4NDEsIDB4N0YsIDB4NjcsIDB4MDMsIDB4MDAsIDB4MDEsIDB4N0MsIDB4QkMsIDB4RjksIDB4MDAsIDB4NjcsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDIsIDB4NjMsIDB4NjQsIDB4RjMsIDB4MjMsIDB4RkMsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MjMsIDB4MTcsIDB4MDAsCisJIDB4MDEsIDB4NjAsIDB4RkYsIDB4NjUsIDB4QTQsIDB4ODQsIDB4MTEsIDB4NjAsIDB4MTQsIDB4NjEsIDB4MTEsIDB4NjAsIDB4RjQsIDB4NjUsIDB4QTEsIDB4RDEsCisJIDB4RDUsIDB4ODAsIDB4RDAsIDB4ODAsIDB4MEIsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDgsIDB4QTEsIDB4RjksIDB4MDEsIDB4MDQsIDB4QTEsIDB4QTEsIDB4RDMsCisJIDB4MDEsIDB4NjAsIDB4MDAsIDB4NjUsIDB4NjAsIDB4NDcsIDB4RkYsIDB4QjQsIDB4QjQsIDB4ODQsIDB4MDEsIDB4MDAsIDB4RkYsIDB4NjQsIDB4MjUsIDB4RkEsCisJIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4NDYsIDB4NDUsIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsCisJIDB4RDAsIDB4ODAsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjIsIDB4NjYsIDB4NUMsIDB4MjUsIDB4NDYsIDB4NTYsIDB4MDIsIDB4NzAsIDB4MjcsIDB4NTQsIDB4MDAsCisJIDB4MTIsIDB4NjQsIDB4MDMsIDB4RkEsIDB4MDQsIDB4RjgsIDB4MEUsIDB4RjIsIDB4ODcsIDB4RkMsIDB4OEQsIDB4RkMsIDB4OEUsIDB4RkMsIDB4REEsIDB4ODIsCisJIDB4MTYsIDB4NjEsIDB4MDAsIDB4NjMsIDB4QzksIDB4ODEsIDB4NUEsIDB4REMsIDB4RkQsIDB4MDIsIDB4NjAsIDB4NDAsIDB4RjAsIDB4M0IsIDB4MTYsIDB4MDAsCisJIDB4MzIsIDB4NDQsIDB4OEUsIDB4RjMsIDB4MDEsIDB4QjAsIDB4RjYsIDB4QTAsIDB4MDgsIDB4MjQsIDB4MkMsIDB4MDUsIDB4REMsIDB4ODMsIDB4RjAsIDB4NjcsCisJIDB4MEUsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsCisJIDB4OEUsIDB4RkQsIDB4MkIsIDB4RkYsIDB4RkUsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4NEYsIDB4MDAsIDB4OEYsIDB4RjMsIDB4MDksIDB4NjUsCisJIDB4RDQsIDB4ODAsIDB4REMsIDB4ODMsIDB4MTcsIDB4MDUsIDB4OEYsIDB4RkQsIDB4OTgsIDB4RkUsIDB4MDQsIDB4MDQsIDB4MDAsIDB4N0YsIDB4MDgsIDB4N0UsCisJIDB4MEUsIDB4RkEsIDB4M0IsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4MEUsIDB4RjIsIDB4MkIsIDB4RkYsIDB4NjAsIDB4NDAsIDB4MDgsIDB4MjYsIDB4RjcsIDB4RkUsIDB4RkQsIDB4NjQsIDB4M0IsIDB4NDIsCisJIDB4NEEsIDB4REIsIDB4MzIsIDB4MDAsIDB4OEIsIDB4RjMsIDB4RkYsIDB4RkYsIDB4RDgsIDB4QTAsIDB4RkYsIDB4RkYsIDB4MEQsIDB4MDQsIDB4MUYsIDB4NjAsCisJIDB4MTYsIDB4NjQsIDB4MkIsIDB4REIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsCisJIDB4RkMsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4MjEsIDB4MDAsIDB4NDYsIDB4NDUsIDB4MDAsIDB4NjQsIDB4MkIsIDB4REIsIDB4MjUsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MDAsIDB4RjQsIDB4MDEsIDB4RjAsCisJIDB4MEEsIDB4MTgsIDB4NzAsIDB4NjcsIDB4QTAsIDB4ODAsIDB4RjAsIDB4NjcsIDB4MDYsIDB4MDMsIDB4QzAsIDB4ODQsIDB4MDEsIDB4RkEsIDB4MjUsIDB4NDYsCisJIDB4MjUsIDB4NDQsIDB4ODAsIDB4RkMsIDB4MDUsIDB4RkEsIDB4QjYsIDB4NjAsIDB4NTgsIDB4NEUsIDB4NzIsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4RkYsIDB4NjQsIDB4M0IsIDB4NDIsIDB4NEEsIDB4REIsIDB4RDQsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MkQsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MUYsIDB4NjAsIDB4MDQsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MEQsIDB4MDAsIDB4MUUsIDB4NjAsIDB4RjgsIDB4NjQsIDB4NDAsIDB4NDcsCisJIDB4NTgsIDB4NEYsIDB4MTgsIDB4MDAsIDB4MUYsIDB4NjAsIDB4MTAsIDB4NjQsIDB4NDAsIDB4NDcsIDB4NTgsIDB4NEYsIDB4MDMsIDB4MDAsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MEIsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsCisJIDB4MUYsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsIDB4RjIsIDB4MDEsCisJIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RDUsIDB4MEUsIDB4RjIsIDB4MTQsIDB4MTgsIDB4NjAsIDB4NDAsIDB4MDEsIDB4MkEsIDB4MTEsIDB4MDAsCisJIDB4MDIsIDB4RjAsIDB4MDksIDB4NjAsIDB4MDgsIDB4NjQsIDB4RDAsIDB4ODAsIDB4QTIsIDB4RkYsIDB4OEYsIDB4RjMsIDB4MDIsIDB4MDIsIDB4Q0MsIDB4ODQsCisJIDB4OEYsIDB4RkIsIDB4MUYsIDB4NjAsIDB4MjYsIDB4NjQsIDB4NDAsIDB4NEIsIDB4RjYsIDB4NjAsIDB4NTgsIDB4NEQsIDB4QjMsIDB4NzgsIDB4RkYsIDB4RkYsCisJIDB4RTksIDB4MDEsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4QTIsIDB4RkYsIDB4OTIsIDB4RjMsCisJIDB4OEUsIDB4RjMsIDB4Q0MsIDB4ODAsIDB4RkEsIDB4QTAsIDB4MDEsIDB4MTQsIDB4MUQsIDB4MDUsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MTcsIDB4MDMsIDB4RjAsIDB4NjcsIDB4MEUsIDB4RkEsIDB4MUYsIDB4NjAsIDB4MEEsIDB4NjQsIDB4MEYsIDB4NjAsCisJIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjYsIDB4NjQsCisJIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsIDB4OTIsIDB4RjMsIDB4OEUsIDB4RjMsIDB4Q0MsIDB4ODMsIDB4REMsIDB4ODQsIDB4MDEsIDB4MTUsIDB4OTIsIDB4RkQsCisJIDB4OEUsIDB4RkIsIDB4RDQsIDB4RkUsIDB4OTEsIDB4RjMsIDB4OEYsIDB4RjMsIDB4MDAsIDB4QTgsIDB4OTAsIDB4RjEsIDB4MDMsIDB4MDIsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MjYsIDB4MDUsIDB4QjUsIDB4NjAsIDB4NTgsIDB4NEQsIDB4NzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QTIsIDB4RkYsIDB4MjAsIDB4MDMsCisJIDB4MDAsIDB4NjMsIDB4OTEsIDB4RjMsIDB4MEUsIDB4RkMsIDB4Q0MsIDB4ODQsIDB4RkYsIDB4M0EsIDB4OTEsIDB4RkIsIDB4OTgsIDB4RkUsIDB4MDMsIDB4MDQsCisJIDB4MDgsIDB4QkIsIDB4MEUsIDB4RkMsIDB4M0IsIDB4RkYsIDB4MUUsIDB4NjAsIDB4RkUsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsCisJIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4RjcsIDB4NjQsIDB4M0EsIDB4NDIsIDB4NEEsIDB4REIsCisJIDB4OEYsIDB4RjMsIDB4MEUsIDB4RjIsIDB4REMsIDB4ODMsIDB4MDgsIDB4QjAsIDB4OEYsIDB4RkQsIDB4MDgsIDB4MjgsIDB4RjcsIDB4RkUsIDB4RDQsIDB4RkUsCisJIDB4QTMsIDB4RkYsIDB4RjAsIDB4NjAsIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4QjksIDB4RkUsIDB4MTMsIDB4RkYsIDB4MjQsIDB4NDAsIDB4ODAsIDB4MkIsCisJIDB4MEIsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MjUsIDB4NDYsIDB4MDksIDB4RjQsIDB4MEUsIDB4RjIsIDB4MDUsIDB4MTgsIDB4MDgsIDB4QkMsIDB4MEUsIDB4RkEsCisJIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4MDEsIDB4MDAsIDB4RDgsIDB4RkUsIDB4QTMsIDB4RkYsIDB4MjUsIDB4NDYsIDB4M0UsIDB4RjIsIDB4MDAsIDB4RjQsCisJIDB4MDgsIDB4RjAsIDB4MjUsIDB4NDYsIDB4MDYsIDB4QjQsIDB4RkYsIDB4N0YsIDB4MTAsIDB4QkMsIDB4MDYsIDB4MjYsIDB4RkQsIDB4N0YsIDB4MEUsIDB4RkEsCisJIDB4M0UsIDB4RjIsIDB4M0YsIDB4RjIsIDB4NjAsIDB4NDEsIDB4MDgsIDB4MkEsIDB4NjQsIDB4NDcsIDB4M0YsIDB4RkEsIDB4NjAsIDB4NDUsIDB4MTMsIDB4NjAsCisJIDB4MkQsIDB4RjMsIDB4QTMsIDB4RkMsIDB4QUIsIDB4RkMsIDB4OTEsIDB4RkMsIDB4RDQsIDB4ODAsIDB4MzgsIDB4NjAsIDB4QzEsIDB4NjUsIDB4QTUsIDB4ODAsCisJIDB4MDEsIDB4MDQsIDB4MDcsIDB4MDMsIDB4MjMsIDB4RjAsIDB4MDgsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4RjgsIDB4NjAsIDB4NTcsIDB4NzgsCisJIDB4RkYsIDB4RkYsIDB4RkIsIDB4NjAsIDB4NTgsIDB4NEYsIDB4NzUsIDB4NzgsIDB4RkYsIDB4RkYsIDB4MEIsIDB4MDQsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsCisJIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MjUsIDB4NjAsIDB4RjQsIDB4NjQsIDB4RTUsIDB4NjAsIDB4NzgsIDB4NDEsIDB4QzcsIDB4NzgsIDB4OTcsIDB4RjEsCisJIDB4NDYsIDB4MDAsIDB4M0UsIDB4RjAsIDB4ODgsIDB4RjEsIDB4NjQsIDB4NDcsIDB4MDcsIDB4QjQsIDB4MDcsIDB4MzYsIDB4M0IsIDB4MDAsIDB4MDQsIDB4MDMsCisJIDB4Q0MsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzAsIDB4ODMsIDB4MkQsIDB4MDAsIDB4MkMsIDB4RjIsIDB4ODcsIDB4RjEsIDB4MDEsIDB4QjAsIDB4NjQsIDB4NDMsCisJIDB4MzUsIDB4MDIsIDB4MkUsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsCisJIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MkUsIDB4RjAsIDB4NjMsIDB4NDYsCisJIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkQsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsCisJIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MkMsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsCisJIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsCisJIDB4MDksIDB4MDAsIDB4NjYsIDB4NDUsIDB4NjMsIDB4NDYsIDB4MDYsIDB4RjAsIDB4NjUsIDB4NDYsIDB4NjQsIDB4NDQsIDB4MEMsIDB4MjYsIDB4MDIsIDB4MDAsCisJIDB4MDIsIDB4MjYsIDB4MDQsIDB4MDAsIDB4MjMsIDB4RjAsIDB4MDQsIDB4NjQsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4MDcsIDB4RkMsIDB4MjMsIDB4RjIsCisJIDB4RkYsIDB4RkYsIDB4MEYsIDB4MUIsIDB4MUUsIDB4NjAsIDB4RTAsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsCisJIDB4MDIsIDB4NjQsIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4QzgsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsCisJIDB4MEUsIDB4MDAsIDB4MUUsIDB4NjAsIDB4RjIsIDB4NjQsIDB4MEYsIDB4NjAsIDB4OTMsIDB4RkIsIDB4NjYsIDB4NDQsIDB4NUEsIDB4REIsIDB4MDIsIDB4NjQsCisJIDB4NUEsIDB4REIsIDB4RkYsIDB4RkYsIDB4MkIsIDB4RkYsIDB4MEUsIDB4RjIsIDB4Q0UsIDB4RkUsIDB4MTAsIDB4QUMsIDB4MEUsIDB4RkEsIDB4RjAsIDB4NjAsCisJIDB4QzcsIDB4NzgsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4ODQsIDB4QzksIDB4ODMsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDQsIDB4NTgsIDB4RDEsIDB4QTUsIDB4RDgsCisJIDB4REEsIDB4ODUsIDB4ODAsIDB4M0EsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RjQsIDB4MDQsIDB4NjUsIDB4RjgsIDB4MUYsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MjUsIDB4RjAsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjksIDB4MTEsIDB4MDAsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NjIsIDB4NDAsIDB4NjMsIDB4NUEsIDB4REYsCisJIDB4RkUsIDB4MUYsIDB4MDQsIDB4NjUsIDB4MEQsIDB4NjAsIDB4MDAsIDB4NjEsIDB4NDgsIDB4NjQsIDB4M0UsIDB4NjMsIDB4N0MsIDB4QTgsIDB4NTgsIDB4RDAsCisJIDB4NTksIDB4RDksIDB4MDIsIDB4MDIsIDB4MDAsIDB4RjQsIDB4MDIsIDB4NjQsIDB4RjksIDB4MUYsIDB4MTQsIDB4NjAsIDB4MTUsIDB4RjEsIDB4MEMsIDB4NjAsCisJIDB4REMsIDB4NjUsIDB4MDIsIDB4RkUsIDB4NjQsIDB4NDQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODcsIDB4NjAsIDB4NDEsIDB4NjQsIDB4NDQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4M0UsIDB4RkIsIDB4NjAsIDB4NDIsIDB4NjEsIDB4NDQsIDB4MDMsIDB4QTIsIDB4NjAsIDB4RkUsCisJIDB4QTIsIDB4REIsIDB4MjAsIDB4RkUsIDB4NjQsIDB4NDQsIDB4MEQsIDB4NjAsIDB4MDIsIDB4NjUsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODQsIDB4NDAsIDB4RkIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4NUMsIDB4NDEsIDB4MjUsIDB4RjIsIDB4RkYsIDB4RkYsIDB4NDAsIDB4NDIsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsCisJIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDEsIDB4ODcsIDB4RjMsIDB4NDYsIDB4NEIsIDB4ODYsIDB4RjMsIDB4NjAsIDB4NDYsIDB4RTAsIDB4ODMsIDB4QUIsIDB4NDYsCisJIDB4MjYsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTksIDB4RjgsIDB4QUIsIDB4NDYsIDB4MjcsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUEsIDB4RjgsIDB4QUIsIDB4NDYsCisJIDB4MjgsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUIsIDB4RjgsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsCisJIDB4NjAsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsIDB4M0EsIDB4NjUsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NTIsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksCisJIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsCisJIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4MEMsIDB4NjAsIDB4OUMsIDB4NjUsIDB4QzQsIDB4ODEsIDB4NjAsIDB4NDUsIDB4QzksIDB4ODEsIDB4NjIsIDB4NjQsIDB4MDYsIDB4NjMsCisJIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjgsIDB4QTEsCisJIDB4QjYsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4NjUsIDB4NDQsIDB4MEMsIDB4NjAsCisJIDB4QkMsIDB4NjUsIDB4QzQsIDB4ODEsIDB4QzksIDB4ODEsIDB4NkEsIDB4NjQsIDB4MDYsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsCisJIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4ODIsIDB4NjUsIDB4QzQsIDB4ODEsCisJIDB4NzIsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MDYsIDB4MDAsIDB4RkEsIDB4QTEsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsIDB4M0IsIDB4RjAsCisJIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsIDB4RjgsIDB4ODQsCisJIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0UsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsIDB4MDYsIDB4QTMsCisJIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsIDB4ODAsIDB4NjEsCisJIDB4ODgsIDB4RkYsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4QjEsIDB4ODQsCisJIDB4M0IsIDB4RkEsIDB4ODYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4M0IsIDB4RjAsCisJIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4M0IsIDB4RjgsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjQsIDB4MDIsIDB4M0QsIDB4RjEsCisJIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsIDB4RDAsIDB4ODAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QkIsIDB4RjQsCisJIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsIDB4RUIsIDB4ODMsIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsIDB4RTEsIDB4ODEsCisJIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4M0IsIDB4RkMsIDB4ODYsIDB4RjMsCisJIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4QkIsIDB4RjIsIDB4NjYsIDB4NDQsIDB4QTUsIDB4ODEsCisJIDB4QkIsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MTEsIDB4NjQsIDB4MjMsIDB4RkEsCisJIDB4MjUsIDB4NDQsIDB4MjQsIDB4RkEsIDB4MDQsIDB4NjQsIDB4NDAsIDB4NEIsIDB4NjIsIDB4NDEsIDB4MEMsIDB4NjAsIDB4ODIsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4NTgsIDB4RDEsIDB4NTksIDB4RDgsIDB4RkQsIDB4MUYsIDB4MkIsIDB4NDMsIDB4MDAsIDB4N0MsIDB4NTksIDB4RDgsIDB4NEYsIDB4OEIsIDB4MDYsIDB4QTQsCisJIDB4RjYsIDB4MDIsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MkEsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsCisJIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEUsIDB4NjEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsCisJIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsCisJIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsIDB4QTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsCisJIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4RDksIDB4ODEsIDB4QjYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsCisJIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsCisJIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsCisJIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsCisJIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsCisJIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsCisJIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsCisJIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MDAsIDB4NjQsIDB4NDAsIDB4NDEsIDB4NEEsIDB4NjQsIDB4QTAsIDB4RDIsIDB4RkYsIDB4RkYsCisJIDB4NDAsIDB4NDIsIDB4ODAsIDB4MkIsIDB4MDQsIDB4MDAsIDB4RkYsIDB4QjQsIDB4NDAsIDB4NDIsIDB4MDEsIDB4NjQsIDB4NDAsIDB4NDEsIDB4ODcsIDB4RjMsCisJIDB4NDYsIDB4NEIsIDB4ODYsIDB4RjMsIDB4NjAsIDB4NDYsIDB4RTAsIDB4ODMsIDB4QUIsIDB4NDYsIDB4MzIsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NTksIDB4RjgsCisJIDB4QUIsIDB4NDYsIDB4MzMsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUEsIDB4RjgsIDB4QUIsIDB4NDYsIDB4MzQsIDB4RjAsIDB4QUIsIDB4NDYsIDB4NUIsIDB4RjgsCisJIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4RjEsIDB4MUYsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsIDB4QUIsIDB4NDYsIDB4MEMsIDB4NjAsCisJIDB4M0EsIDB4NjUsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODQsIDB4QzQsIDB4ODEsCisJIDB4QzksIDB4ODEsIDB4NEEsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsCisJIDB4MDgsIDB4MDAsIDB4QUIsIDB4NDYsIDB4RjAsIDB4QTEsIDB4NzYsIDB4NjQsIDB4MEUsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4QUIsIDB4NDYsIDB4MjIsIDB4NDQsIDB4RkYsIDB4QjQsIDB4RTAsIDB4ODQsIDB4RTAsIDB4ODUsIDB4QzQsIDB4ODQsIDB4MEMsIDB4NjAsIDB4ODIsIDB4NjUsCisJIDB4QzQsIDB4ODEsIDB4NUEsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTgsIDB4RDAsIDB4NTksIDB4RDksIDB4RkQsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MjEsIDB4NDQsCisJIDB4MDEsIDB4MkEsIDB4MDYsIDB4MDAsIDB4RkEsIDB4QTEsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4NTksIDB4RDEsIDB4NTgsIDB4RDgsIDB4RkQsIDB4MUYsCisJIDB4M0IsIDB4RjAsIDB4MjEsIDB4NDQsIDB4MDEsIDB4MkEsIDB4MTMsIDB4MDAsIDB4MjIsIDB4NDQsIDB4M0QsIDB4RkIsIDB4NjAsIDB4NDEsIDB4MDIsIDB4RkUsCisJIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4RjgsIDB4ODQsIDB4M0MsIDB4RkIsIDB4MEMsIDB4NjAsIDB4N0UsIDB4NjMsIDB4ODgsIDB4RkYsIDB4Q0QsIDB4ODEsCisJIDB4MDYsIDB4QTMsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4M0IsIDB4RkQsIDB4NjQsIDB4NDcsIDB4ODAsIDB4QkYsIDB4NjAsIDB4NUMsIDB4MjIsIDB4NDMsCisJIDB4ODAsIDB4NjEsIDB4ODgsIDB4RkYsIDB4Q0YsIDB4ODMsIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsCisJIDB4QjEsIDB4ODQsIDB4M0IsIDB4RkEsIDB4ODYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsCisJIDB4M0IsIDB4RjAsIDB4NjYsIDB4NDQsIDB4QjEsIDB4OUMsIDB4M0IsIDB4RjgsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsCisJIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjMsIDB4RjIsIDB4MjUsIDB4RjAsIDB4MDIsIDB4QTgsIDB4MDAsIDB4NjcsIDB4MjQsIDB4MDIsCisJIDB4M0QsIDB4RjEsIDB4NjQsIDB4NDQsIDB4MDMsIDB4QjQsIDB4NDAsIDB4NDIsIDB4RDAsIDB4ODAsIDB4ODcsIDB4RjMsIDB4RkYsIDB4RkYsIDB4NjAsIDB4NDYsCisJIDB4QkIsIDB4RjQsIDB4ODAsIDB4NjEsIDB4MDIsIDB4MDIsIDB4RTMsIDB4ODMsIDB4RUIsIDB4ODMsIDB4MjIsIDB4NDQsIDB4ODgsIDB4RkYsIDB4Q0MsIDB4ODQsCisJIDB4RTEsIDB4ODEsIDB4RkQsIDB4MEQsIDB4OEQsIDB4RkYsIDB4NjEsIDB4NDcsIDB4MzEsIDB4OTEsIDB4OUQsIDB4ODUsIDB4QTcsIDB4ODMsIDB4M0IsIDB4RkMsCisJIDB4ODYsIDB4RjMsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4ODMsIDB4RTMsIDB4ODMsIDB4NjYsIDB4NDQsIDB4MDIsIDB4QTYsIDB4QkIsIDB4RjIsIDB4NjYsIDB4NDQsCisJIDB4QTUsIDB4ODEsIDB4QkIsIDB4RkEsIDB4MDIsIDB4QTYsIDB4RkEsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsCisJIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsCisJIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsCisJIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsCisJIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsCisJIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MjEsIDB4MDAsIDB4NDMsIDB4NEIsCisJIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsIDB4MzAsIDB4N0MsIDB4QjAsIDB4ODQsIDB4QTIsIDB4REEsIDB4NEUsIDB4NjEsIDB4NzYsIDB4NjQsCisJIDB4MEUsIDB4NjMsIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4OTAsIDB4NjQsIDB4MDQsIDB4NjMsCisJIDB4QUIsIDB4NDYsIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4QTAsIDB4NjQsIDB4MDQsIDB4NjMsIDB4QUIsIDB4NDYsCisJIDB4NTksIDB4RDAsIDB4QUIsIDB4NDYsIDB4NTgsIDB4RDgsIDB4RkIsIDB4MUYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsCisJIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4MjcsIDB4RjIsIDB4MTUsIDB4NjAsIDB4MDIsIDB4NjUsIDB4NjAsIDB4NDcsCisJIDB4MDAsIDB4N0YsIDB4RTAsIDB4ODQsIDB4NDQsIDB4RDMsIDB4NjYsIDB4NDEsIDB4NjAsIDB4NDYsIDB4NjAsIDB4NDMsIDB4MDUsIDB4RjIsIDB4MTYsIDB4MTgsCisJIDB4NjEsIDB4NDYsIDB4MjcsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDQsIDB4RjIsIDB4MEMsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjYsIDB4RjAsCisJIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsIDB4MDMsIDB4RjIsIDB4MDYsIDB4MDIsIDB4NjEsIDB4NDYsIDB4MjUsIDB4RjAsIDB4NjMsIDB4NDYsIDB4RDAsIDB4ODAsCisJIDB4RkYsIDB4RkYsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RjQsIDB4RkYsIDB4RkYsIDB4NjMsIDB4NDYsIDB4RTgsIDB4MUIsIDB4ODcsIDB4RjMsIDB4MDgsIDB4RkUsCisJIDB4NjAsIDB4NDMsIDB4NjEsIDB4NDYsIDB4MDEsIDB4MDMsIDB4MEQsIDB4MDAsIDB4NDMsIDB4NEIsIDB4QUIsIDB4NDYsIDB4M0IsIDB4RjIsIDB4ODAsIDB4NjAsCisJIDB4MzAsIDB4NjEsIDB4OUQsIDB4ODUsIDB4QTQsIDB4ODQsIDB4QTIsIDB4REEsIDB4QUIsIDB4NDYsIDB4MDAsIDB4NjcsIDB4MDAsIDB4NjEsIDB4MjMsIDB4NTgsCisJIDB4RkYsIDB4RkYsIDB4MDEsIDB4NjcsIDB4MjAsIDB4NjEsIDB4MjMsIDB4NTgsIDB4RkYsIDB4RkYsIDB4M0UsIDB4RjIsIDB4QUIsIDB4RjEsIDB4MDgsIDB4QjAsCisJIDB4MTksIDB4RjgsIDB4NEEsIDB4MDIsIDB4MDcsIDB4MjMsIDB4MkIsIDB4MDAsIDB4NjAsIDB4NDcsIDB4MDcsIDB4QjQsIDB4ODgsIDB4RjEsIDB4Q0MsIDB4ODQsCisJIDB4RTAsIDB4ODQsIDB4NDAsIDB4OEEsIDB4QUEsIDB4NDYsIDB4MDMsIDB4RjIsIDB4MDQsIDB4RjAsIDB4MDUsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsCisJIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4Q0IsIDB4RjEsIDB4MkYsIDB4RjgsIDB4Q0MsIDB4RjEsIDB4MzAsIDB4RjgsIDB4Q0QsIDB4RjEsCisJIDB4MzEsIDB4RjgsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RjIsIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsCisJIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsIDB4QUEsIDB4NDYsIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjAsIDB4MDcsIDB4RjIsIDB4NjAsIDB4NDMsCisJIDB4QUEsIDB4NDYsIDB4MzYsIDB4RkMsIDB4MzcsIDB4RjgsIDB4MzgsIDB4RkEsIDB4MDMsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MUMsIDB4MDAsIDB4NjYsIDB4RjEsCisJIDB4MkYsIDB4RjgsIDB4NjcsIDB4RjEsIDB4MzAsIDB4RjgsIDB4NjgsIDB4RjEsIDB4MzEsIDB4RjgsIDB4NDYsIDB4NEEsIDB4MDAsIDB4RjQsIDB4MDIsIDB4RjIsCisJIDB4MDMsIDB4RjAsIDB4MDQsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MkMsIDB4RkMsIDB4MkQsIDB4RjgsIDB4MkUsIDB4RkEsIDB4QUEsIDB4NDYsCisJIDB4MDUsIDB4RjIsIDB4MDYsIDB4RjAsIDB4MDcsIDB4RjIsIDB4NjAsIDB4NDMsIDB4QUEsIDB4NDYsIDB4MzIsIDB4RkMsIDB4MzMsIDB4RjgsIDB4MzQsIDB4RkEsCisJIDB4MDIsIDB4NjAsIDB4MDgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MkEsIDB4RkEsIDB4MDIsIDB4RkUsIDB4MkYsIDB4NTgsIDB4RkYsIDB4RkYsIDB4NDIsIDB4NkYsCisJIDB4NkYsIDB4NzQsIDB4NjMsIDB4NkYsIDB4NjQsIDB4NjUsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MDAsIDB4NTMsIDB4NTQsIDB4NDEsIDB4MkYsCisJIDB4NDEsIDB4NTAsIDB4MjAsIDB4NDYsIDB4NzUsIDB4NkUsIDB4NjMsIDB4MjcsIDB4NzMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV80X2RhdGEgKi8KKworc3RhdGljIGNvbnN0IENGR19JREVOVElUWV9TVFJDVCBmd19pbWFnZV9pbmZvaWRlbnRpdHlbXSA9IHsKKwl7CisJCXNpemVvZiggQ0ZHX0lERU5USVRZX1NUUkNUICkgLyBzaXplb2YoaGNmXzE2KSAtIDEsCisJCUNGR19GV19JREVOVElUWSwKKwkJQ09NUF9JRF9GV19BUCwKKwkJMywJCQkJCQkJLy9WYXJpYW50CisJCTEsCQkJCQkJCS8vTWFqb3IKKwkJMjQJCQkJCQkJLy9NaW5vcgorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwIH0JCS8vZW5kc2VudGluZWwKK307CisKK3N0YXRpYyBjb25zdCBDRkdfUFJPR19TVFJDVCBmd19pbWFnZV9jb2RlW10gPSB7CisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxNDgsCQkvLyBzaXplb2YoZndfaW1hZ2VfMV9kYXRhKSwKKwkJMHgwMDAwMDA2MCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMV9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MjQzMiwJCS8vIHNpemVvZihmd19pbWFnZV8yX2RhdGEpLAorCQkweDAwMDAwQzE2LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8yX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgxOTRjLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzNfZGF0YSksCisJCTB4MDAxRTMwNDgsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzNfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweGI3ZTQsCQkvLyBzaXplb2YoZndfaW1hZ2VfNF9kYXRhKSwKKwkJMHgwMDFGNDAwMCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfNF9kYXRhCisJfSwKKwl7CisJCTUsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19TVE9QLAkJCQkvLyBtb2RlCisJCTAwMDAsCisgCTB4MDAwRjIxMDEsCQkJCQkvLyBTdGFydCBleGVjdXRpb24gYWRkcmVzcworCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1JBTkdFMjBfU1RSQ1QgZndfaW1hZ2VfaW5mb2NvbXBhdFtdID0geworCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0ZXX1NVUF9SQU5HRSwKKwkJQ09NUF9ST0xFX1NVUEwsCisJCUNPTVBfSURfQVBGLAorCQl7CisJCQl7IDQsIDEsIDEgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX01GSSwKKwkJeworCQkJeyA3LCAzLCAzIH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDgsIDEsIDEgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX0NGSSwKKwkJeworCQkJeyA0LCAxLCAyIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgeyB7IDAwMDAsIDAwMDAsIDAwMDAgfSB9IH0JCQkvL2VuZHNlbnRpbmVsCit9OworCittZW1pbWFnZSBmd19pbWFnZSA9IHsKKwkiRlVQVTdEMzdkaGZ3Y2lcMDAxQyIsCQkJLy9zaWduYXR1cmUsIDxmb3JtYXQgbnVtYmVyPiwgQy9CaW4gdHlwZQorCShDRkdfUFJPR19TVFJDVCAqKSBmd19pbWFnZV9jb2RlLAorCTB4MDAwRjIxMDEsCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcGRhcGx1ZworCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHByaXBsdWcKKwkoQ0ZHX1JBTkdFMjBfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2NvbXBhdCwKKwkoQ0ZHX0lERU5USVRZX1NUUkNUICopIGZ3X2ltYWdlX2luZm9pZGVudGl0eSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTJlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kZWJ1Zy5oCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIGFuZCBtYWNyb3MgZm9yIGRlYnVnZ2luZy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9ERUJVR19ICisjZGVmaW5lIF9ERUJVR19ICisKKworCisKKy8qIFR1cm4gb24gZGVidWdnaW5nIGhlcmUgaWYgbm90IGRvbmUgd2l0aCBhIHByZXByb2Nlc3NvciBkZWZpbmUgKi8KKyNpZm5kZWYgREJHCisjZGVmaW5lIERCRyAwCisjZWxzZQorI3VuZGVmCURCRworI2RlZmluZSBEQkcgMQorI2VuZGlmIC8vREJHCisKKworCisKKyNpZiBEQkcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTZXQgdGhlIGxldmVsIG9mIGRlYnVnZ2luZyBpZiBub3QgZG9uZSB3aXRoIGEgcHJlcHJvY2Vzc29yIGRlZmluZS4gU2VlCisgICB3bF9tYWluLmMsIGluaXRfbW9kdWxlKCkgZm9yIGhvdyB0aGUgZGVidWcgbGV2ZWwgdHJhbnNsYXRlcyBpbnRvIHRoZQorICAgdGhlIHR5cGVzIG9mIG1lc3NhZ2VzIGRpc3BsYXllZCAqLworI2lmbmRlZiBEQkdfTFZMCisjZGVmaW5lIERCR19MVkwgNQkJCS8qIHlpZWxkcyBub3RoaW5nIHZpYSBpbml0X21vZHVsZSwKKwkJCQkJCQkgICBvcmlnaW5hbCB2YWx1ZSBvZiA1IHlpZWxkcyBEQkdfVFJBQ0VfT04gYW5kIERCR19WRVJCT1NFX09OICovCisjZW5kaWYgIC8vIERCR19MVkwKKworCisjZGVmaW5lIERCR19FUlJPUl9PTiAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgREJHX1dBUk5JTkdfT04gICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBEQkdfTk9USUNFX09OICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIERCR19UUkFDRV9PTiAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgREJHX1ZFUkJPU0VfT04gICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBEQkdfUEFSQU1fT04gICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIERCR19CUkVBS19PTiAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgREJHX1JYX09OICAgICAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBEQkdfVFhfT04gICAgICAgICAgIDB4MDAwMDAyMDBMCisjZGVmaW5lIERCR19EU19PTiAgICAgICAgICAgMHgwMDAwMDQwMEwKKworI2RlZmluZSBEQkdfREVGQVVMVFMgICAgICAgIChEQkdfRVJST1JfT04gfCBEQkdfV0FSTklOR19PTiB8IERCR19CUkVBS19PTikKKworI2RlZmluZSBEQkdfRkxBR1MoQSkgICAgICAgIChBKS0+RGVidWdGbGFnCisjZGVmaW5lIERCR19OQU1FKEEpICAgICAgICAgKEEpLT5kYmdOYW1lCisjZGVmaW5lIERCR19MRVZFTChBKSAgICAgICAgKEEpLT5kYmdMZXZlbAorCisKKyNpZm5kZWYgUFJJTlRLCisjICAgZGVmaW5lIFBSSU5USyhTLi4uKSAgICAgcHJpbnRrKFMpCisjZW5kaWYgLy8gUFJJTlRLCisKKworI2lmbmRlZiBEQkdfUFJJTlQKKyMgICBkZWZpbmUgREJHX1BSSU5UKFMuLi4pICBQUklOVEsoS0VSTl9ERUJVRyBTKQorI2VuZGlmIC8vIERCR19QUklOVAorCisKKyNpZm5kZWYgREJHX1BSSU5UQworIyAgIGRlZmluZSBEQkdfUFJJTlRDKFMuLi4pIFBSSU5USyhTKQorI2VuZGlmIC8vIERCR19QUklOVEMKKworCisjaWZuZGVmIERCR19UUkFQCisjICAgZGVmaW5lIERCR19UUkFQICAgICAgICAge30KKyNlbmRpZiAvLyBEQkdfVFJBUAorCisKKyNkZWZpbmUgX0VOVEVSX1NUUiAgICAgICAgICAiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiIKKyNkZWZpbmUgX0xFQVZFX1NUUiAgICAgICAgICAiPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCIKKworCisjZGVmaW5lIF9EQkdfRU5URVIoQSkgICAgICAgREJHX1BSSU5UKCIlczolLipzOiVzXG4iLERCR19OQU1FKEEpLCsrREJHX0xFVkVMKEEpLF9FTlRFUl9TVFIsX19GVU5DX18pCisjZGVmaW5lIF9EQkdfTEVBVkUoQSkgICAgICAgREJHX1BSSU5UKCIlczolLipzOiVzXG4iLERCR19OQU1FKEEpLERCR19MRVZFTChBKS0tLF9MRUFWRV9TVFIsX19GVU5DX18pCisKKworI2RlZmluZSBEQkdfRlVOQyhGKSAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpfX0ZVTkNfXyA9IEY7CisKKyNkZWZpbmUgREJHX0VOVEVSKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgX0RCR19FTlRFUihBKTt9CisKKyNkZWZpbmUgREJHX0xFQVZFKEEpICAgICAgICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgX0RCR19MRUFWRShBKTt9CisKKyNkZWZpbmUgREJHX1BBUkFNKEEsTixGLFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUEFSQU1fT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCR19QUklOVCgiICAlcyAtLSAiRiJcbiIsTixTKTt9CisKKworI2RlZmluZSBEQkdfRVJST1IoQSxTLi4uKSAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOkVSUk9SOiVzICIsREJHX05BTUUoQSksX19GVU5DX18pO0RCR19QUklOVEMoUyk7REJHX1RSQVA7fX0KKworCisjZGVmaW5lIERCR19XQVJOSU5HKEEsUy4uLikge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7REJHX1BSSU5UKCIlczpXQVJOSU5HOiVzICIsREJHX05BTUUoQSksX19GVU5DX18pO0RCR19QUklOVEMoUyk7fX0KKworCisjZGVmaW5lIERCR19OT1RJQ0UoQSxTLi4uKSAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfTk9USUNFX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOk5PVElDRTolcyAiLERCR19OQU1FKEEpLF9fRlVOQ19fKTtEQkdfUFJJTlRDKFMpO319CisKKworI2RlZmluZSBEQkdfVFJBQ0UoQSxTLi4uKSAgIGRvIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoIiVzOiVzICIsREJHX05BTUUoQSksX19GVU5DX18pO0RCR19QUklOVEMoUyk7fX0gd2hpbGUgKDApCisKKworI2RlZmluZSBEQkdfUlgoQSxTLi4uKSAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1JYX09OKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtEQkdfUFJJTlQoUyk7fX0KKworCisjZGVmaW5lIERCR19UWChBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfVFhfT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorCisjZGVmaW5lIERCR19EUyhBLFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfRFNfT04pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVChTKTt9fQorCisKKyNkZWZpbmUgREJHX0FTU0VSVChDKSAgICAgICB7aWYgKCEoQykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RCR19QUklOVCgiQVNTRVJUKCVzKSAtLSAlcyMlZCAoJXMpXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQyxfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNfXyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHX1RSQVA7fX0KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgICAgICAgICpkYmdOYW1lOworICAgIGludCAgICAgICAgICAgICBkYmdMZXZlbDsKKyAgICB1bnNpZ25lZCBsb25nICAgRGVidWdGbGFnOworfSBkYmdfaW5mb190OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2Vsc2UgLy8gREJHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEQkdfREVGTgorI2RlZmluZSBEQkdfVFJBUAorI2RlZmluZSBEQkdfRlVOQyhGKQorI2RlZmluZSBEQkdfUFJJTlQoUy4uLikKKyNkZWZpbmUgREJHX0VOVEVSKEEpCisjZGVmaW5lIERCR19MRUFWRShBKQorI2RlZmluZSBEQkdfUEFSQU0oQSxOLEYsUy4uLikKKyNkZWZpbmUgREJHX0VSUk9SKEEsUy4uLikKKyNkZWZpbmUgREJHX1dBUk5JTkcoQSxTLi4uKQorI2RlZmluZSBEQkdfTk9USUNFKEEsUy4uLikKKyNkZWZpbmUgREJHX1RSQUNFKEEsUy4uLikKKyNkZWZpbmUgREJHX1JYKEEsUy4uLikKKyNkZWZpbmUgREJHX1RYKEEsUy4uLikKKyNkZWZpbmUgREJHX0RTKEEsUy4uLikKKyNkZWZpbmUgREJHX0FTU0VSVChDKQorCisjZW5kaWYgLy8gREJHCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworI2VuZGlmIC8vIF9ERUJVR19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmNTgzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5jCkBAIC0wLDAgKzEsMzkwIEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUgICA6CURIRi5DCisqCisqIERBVEUJOgkkRGF0ZTogMjAwNC8wNy8xOSAwODoxNjoxNCAkICAgJFJldmlzaW9uOiAxLjIgJAorKiBPcmlnaW5hbAk6CTIwMDQvMDUvMjggMTQ6MDU6MzQgICAgUmV2aXNpb246IDEuMzYgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNS8xMSAwNjoyMjo1NyAgICBSZXZpc2lvbjogMS4zMiAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMTUgMDk6MjQ6NDIgICAgUmV2aXNpb246IDEuMjggICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjI3ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMjUgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4yMSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS4xOSAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMy8wMiAwOToyNzoxMSAgICBSZXZpc2lvbjogMS4xNyAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsCToJMjAwNC8wMi8yNCAxMzowMDoyOCAgICBSZXZpc2lvbjogMS4xNSAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsCToJMjAwNC8wMi8xOSAxMDo1NzoyOCAgICBSZXZpc2lvbjogMS4xNCAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqIE9yaWdpbmFsCToJMjAwMy8xMS8yNyAwOTowMDowOSAgICBSZXZpc2lvbjogMS4zICAgICAgVGFnOiB0MjAwMjEyMTZfMDEKKyoKKyogQVVUSE9SIDoJSm9obiBNZWVydGVucworKgkJCU5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgorKgorKiBERVNDICAgOglnZW5lcmljIGZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIGRvd25sb2FkIG9mIE5JQyBmaXJtd2FyZQorKgkJCUxvY2FsIFN1cHBvcnQgUm91dGluZXMgZm9yIGFib3ZlIHByb2NlZHVyZXMKKyoKKyoJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAorKgorKgorKglESEYgaXMgKGludGVuZGVkIHRvIGJlKSBwbGF0Zm9ybS1pbmRlcGVuZGVudC4KKyoJREhGIGlzIGEgbW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygcm91dGluZXMgdG8gZG93bmxvYWQgZmlybXdhcmUKKyoJaW1hZ2VzICh0aGUgbmFtZXMgcHJpbWFyeSwgc3RhdGlvbiwgYWNjZXNzIHBvaW50LCBzZWNvbmRhcnkgYW5kIHRlcnRpYXJ5CisqCWFyZSB1c2VkIG9yIGhhdmUgYmVlbiB1c2VkKSB0byB2b2xhdGlsZSBvciBub252b2xhdGlsZSBtZW1vcnkKKyoJaW4gV2F2ZUxBTi9JRUVFIE5JQ3MuIFRvIGFjaGlldmUgdGhpcyBESEYgbWFrZXMgdXNlIG9mIHRoZSBXYXZlTEFOL0lFRUUKKyoJV0NJIGFzIGltcGxlbWVudGVkIGJ5IHRoZSBIQ0YtbW9kdWxlLgorKgorKglEb3dubG9hZCB0byBub24tdm9sYXRpbGUgbWVtb3J5IGlzIHVzZWQgdG8gdXBkYXRlIGEgV2F2ZUxBTi9JRUVFIE5JQyB0byBuZXcKKyoJZmlybXdhcmUuIE5vcm1hbGx5IHRoaXMgd2lsbCBiZSBhbiB1cGdyYWRlIHRvIG5ld2VyIGZpcm13YXJlLCBhbHRob3VnaAorKglkb3duZ3JhZGluZyB0byBvbGRlciBmaXJtd2FyZSBpcyBwb3NzaWJsZSB0b28uCisqCisqIE5vdGU6IHJlbGF0aXZlIHRvIEFzc2VydHMsIHRoZSBmb2xsb3dpbmcgY2FuIGJlIG9ic2VydmVkOgorKglTaW5jZSB0aGUgSUZCIGlzIG5vdCBrbm93biBpbnNpZGUgdGhlIHJvdXRpbmUsIHRoZSBtYWNybyBIQ0ZBU1NFUlQgaXMgcmVwbGFjZWQgd2l0aCBNTURBU1NFUlQuCisqCUFsc28gdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGluIHRoZSBhc3NlcnQgaXMgcmFpc2VkIGJ5IEZJTEVfTkFNRV9PRkZTRVQgKDEwMDAwKSB0byBkaXNjcmltaW5hdGUgdGhlCisqCURIRiBBc3NlcnRzIGZyb20gSENGIGFuZCBNTUQgYXNzZXJ0cy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKiBTT0ZUV0FSRSBMSUNFTlNFCisqCisqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorKgorKiBDT1BZUklHSFQgqSAxOTk5IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaGNmLmgiCisjaW5jbHVkZSAiaGNmZGVmLmgiCisjaW5jbHVkZSAiZGhmLmgiCisjaW5jbHVkZSAibW1kLmgiCisKKy8vdG8gZGlzdGluZ3Vpc2ggTU1EIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyN1bmRlZglGSUxFX05BTUVfT0ZGU0VUCisjZGVmaW5lIEZJTEVfTkFNRV9PRkZTRVQgTU1EX0ZJTEVfTkFNRV9PRkZTRVQKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBEZWZpbmVzLCBkYXRhIHN0cnVjdHVyZXMsIGFuZCBnbG9iYWwgdmFyaWFibGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQKK2NoYXIgc2lnbmF0dXJlWzE0XSA9ICJGVVBVN0QzN2RoZndjaSI7CisKKy8vVGhlIGJpbmFyeSBkb3dubG9hZCBmdW5jdGlvbiAicmVsb2NhdGVzIiB0aGUgaW1hZ2UgdXNpbmcgY29uc3RydWN0aW9ucyBsaWtlOgorLy8JZnctPmlkZW50aXR5ID0gKENGR19JREVOVElUWV9TVFJDVCBGQVIgKikoKGNoYXIgRkFSICopZnctPmlkZW50aXR5ICsgKGhjZl8zMilmdyApOworLy91bmRlciBzb21lIG9mIHRoZSBtZW1vcnkgbW9kZWxzIHVuZGVyIE1TVkMgMS41MiB0aGVzZSBjb25zdHJ1Y3Rpb25zIGRlZ3JhZGUgdG8gMTYtYml0cyBwb2ludGVyIGFyaXRobWV0aWMuCisvL2Z3LT5pZGVudGl0eSBpcyBsaW1pdGVkLCBzdWNoIHRoYXQgYWRkaW5nIGl0IHRvIGZ3LCBkb2VzIG5vdCBuZWVkIHRvIGNhcnJ5IG92ZXIgZnJvbSBvZmZzZXQgdG8gc2VnbWVudC4KKy8vSG93ZXZlciB0aGUgc2VnbWVudCBpcyBub3Qgc2V0IGF0IGFsbC4KKy8vQXMgYSB3b3JrYXJvdW5kIHRoZSBQU0VVRE9fQ0hBUlAgbWFjcm8gaXMgaW50cm9kdWNlZCB3aGljaCBpcyBhIGNoYXIgcG9pbnRlciBleGNlcHQgZm9yIE1TVkMgMS41MiwgaW4KKy8vd2hpY2ggY2FzZSB3ZSBrbm93IHRoYXQgYSAzMi1iaXQgcXVhbnRpdHkgaXMgYWRlcXVhdGUgYXMgYSBwb2ludGVyLgorLy9Ob3RlIHRoYXQgb3RoZXIgcGxhdGZvcm1zIG1heSBleHBlcmllbmNlIGNvbXBhcmFibGUgcHJvYmxlbXMgd2hlbiB1c2luZyB0aGUgYmluYXJ5IGRvd25sb2FkIGZlYXR1cmUuCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPT0gIDgwMAkJCQkvLyBWaXN1YWwgQysrIDEuNQorI2RlZmluZSBQU0VVRE9fQ0hBUlAgaGNmXzMyCisjZWxzZQorI2RlZmluZSBQU0VVRE9fQ0hBUlAgaGNmXzgqCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIExUVi1yZWNvcmRzIHJldHJpZXZlZCBmcm9tIHRoZSBOSUMgdG86CisgKgktIGRldGVybWluZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gTklDIGFuZCBpbWFnZQorICoJLSAoKHNldHVwIHRoZSBidWZmZXIgc2l6ZSBkeW5hbWljYWxseSBmb3Igbm9uLXZvbGF0aWxlIGRvd25sb2FkIChzZWUgbm90ZSBiZWxvdykgKSkKKyAqCS0gc3VwcGx5IHBsdWdnaW5nIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgUERBIChILUkgb25seSkKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vIGZvciBVU0IvSDEgd2UgbmVlZGVkIGEgc21hbGxlciB2YWx1ZSB0aGFuIHRoZSBDRkdfRExfQlVGX1NUUkNUIHJlcG9ydGVkIDgxOTIKKy8vIGZvciB0aGUgdGltZSBiZWluZyBpdCBzZWVtcyBzaW1wbGVyIHRvIGFsd2F5cyB1c2UgMjAwMCBmb3IgVVNCL0gxIGFzIHdlbGwgYXMgYWxsIG90aGVyIGNhc2VzIHJhdGhlciB0aGFuCisvLyB1c2luZyB0aGUgImZpeGVkIGFueXdheSIgQ0ZHX0RMX0JVRl9TVFJDVC4KKyNkZWZpbmUgRExfU0laRSAyMDAwCisKKy8vQ0ZHX0lERU5USVRZX1NUUkNUICAgCXByaV9pZGVudGl0eQk9IHsgTE9GKENGR19JREVOVElUWV9TVFJDVCksIENGR19QUklfSURFTlRJVFkgfTsKK0NGR19TVVBfUkFOR0VfU1RSQ1QgCW1maV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX01GSV9TVVBfUkFOR0UgfTsKK0NGR19TVVBfUkFOR0VfU1RSQ1QgCWNmaV9zdXAgICAgICAgIAk9IHsgTE9GKENGR19TVVBfUkFOR0VfU1RSQ1QpLCBDRkdfTklDX0NGSV9TVVBfUkFOR0UgfTsKKy8qIE5vdGU6IGNvdWxkIGJlIHVzZWQgcmF0aGVyIHRoYW4gdGhlIGFib3ZlIGV4cGxhaW5lZCBhbmQgZGVmaW5lZCBETF9TSVpFIGlmIG5lZWQgYXJpc2VzCisgKiBDRkdfRExfQlVGX1NUUkNUICAgIAlkbF9idWYgICAgICAgICAJPSB7IExPRihDRkdfRExfQlVGX1NUUkNUKSwgQ0ZHX0RMX0JVRiB9OworKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQXJyYXkgbHR2X2luZm8gc3RvcmVzIE5JQyBpbmZvcm1hdGlvbiAoaW4gdGhlIGZvcm0gb2YgTFRWLXJlY29yZHMpCisgKiBuZWVkZWQgZm9yIGRvd25sb2FkLiBBIE5VTEwgcmVjb3JkIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBhcnJheS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVGhlIExUVl9JTkZPX1NUUlVDVCBpcyBuZWVkZWQgdG8gc2F2ZSB0aGUgc2l6ZXMgb2YgdGhlIHN0cnVjdHMsIGJlY2F1c2UgYWZ0ZXIgYSBHRVRfSU5GTygpCisgKiB0aGUgbGVuIGZpZWxkIGlzIGNoYW5nZWQgdG8gdGhlIHJlYWwgbGVuIG9mIHRoZSBSSUQgYnkgdGhlIGNhbGxlZCByb3V0aW5lLgorICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGlmIHRoZSBESEYgdXNlZCB3aXRob3V0IHJlbG9hZGluZyB0aGUgZHJpdmVyL3V0aWxpdHkuCisgKi8KKworTFRWX0lORk9fU1RSVUNUIGx0dl9pbmZvW10gPSB7CisJeyAoTFRWUCkmbWZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCisJeyAoTFRWUCkmY2ZpX3N1cCwJCQlMT0YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkgfSAsCisJeyAoTFRWUCkgTlVMTCwgCQkJCTAgfQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQUk9UT1RZUEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50CQkJCWNoZWNrX2NvbXBfZncoIG1lbWltYWdlICpmdyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyouU1VCTU9EVUxFCQlpbnQgY2hlY2tfY29tcF9mdyggbWVtaW1hZ2UgKmZ3ICkKKyouUFVSUE9TRQkJQ2hlY2tzIGNvbXBhdGliaWxpdHkgb2YgQ0ZJIGFuZCBNRkksIE5JQyBhcyBzdXBwbGllciwgc3RhdGlvbi9BUCBmaXJtd2FyZSBpbWFnZSBhcyBzdXBwbGllci4KKyoKKyouQVJHVU1FTlRTCisqICAgZncgICAgICAgICAJRi9XIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKKyoKKyouUkVUVVJOUworKiAgIEhGQ19TVUNDRVNTICAgICAgCS0gZmlybXdhcmUgT0sKKyogICBESEZfRVJSX0lOQ09NUF9GVworKgorKi5ERVNDUklQVElPTgorKiAgIFRoaXMgZnVuY3Rpb24gdXNlcyBjb21wYXRpYmlsaXR5IGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiB0aGF0IGhhcyBiZWVuCisqICAgcmV0cmlldmVkIGZyb20gdGhlIGNhcmQgd2hpY2ggaXMgY3VycmVudGx5IGluc2VydGVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlCisqICAgc3RhdGlvbiBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGlzIGNvbXBhdGlibGUuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludAorY2hlY2tfY29tcF9mdyggbWVtaW1hZ2UgKmZ3ICkKK3sKK0NGR19SQU5HRTIwX1NUUkNUICAJCSpwOworaW50ICAgCQkJCQlyYyA9IEhDRl9TVUNDRVNTOworQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqCWk7CisKKwlzd2l0Y2goIGZ3LT5pZGVudGl0eS0+dHlwICkgeworCSAgY2FzZSBDRkdfRldfSURFTlRJVFk6CQkJCS8vU3RhdGlvbiBGL1cKKwkgIGNhc2UgQ09NUF9JRF9GV19BUF9GQUtFOgkJCS8vOz9pcyB0aGlzIHVzZWZ1bCAodXNlZCB0byBiZTogIENGR19BUF9JREVOVElUWSkKKwkJYnJlYWs7CisJICBkZWZhdWx0OgorCQlNTURBU1NFUlQoIERPX0FTU0VSVCwgZnctPmlkZW50aXR5LT50eXAgKSAJLy91bmtub3duL3Vuc3VwcG9ydGVkIGZpcm13YXJlX3R5cGU6CisJCXJjID0gREhGX0VSUl9JTkNPTVBfRlc7CisJCXJldHVybiByYzsgLyogOz8gaG93IHVzZWZ1bCBpcyB0aGlzIGFueXdheSwKKwkJCQkJKiAgdGlsbCB0aGF0IGlzIHNvcnRlZCBvdXQgbWlnaHQgYXMgd2VsbCB2aW9sYXRlIG15IG93biBzaW5nbGUgZXhpdCBwcmluY2lwbGUKKwkJCQkJKi8KKwl9CisJcCA9IGZ3LT5jb21wYXQ7CisJaSA9IE5VTEw7CisJd2hpbGUoIHAtPmxlbiAmJiBpID09IE5VTEwgKSB7CQkJCQkvLyBjaGVjayB0aGUgTUZJIHJhbmdlcworCQlpZiAoIHAtPnR5cCAgPT0gQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQSApIHsKKwkJCWkgPSBtbWRfY2hlY2tfY29tcCggKHZvaWQqKXAsICZtZmlfc3VwICk7CisJCX0KKwkJcCsrOworCX0KKwlNTURBU1NFUlQoIGksIDAgKQkvL01GSTogTklDIFN1cHBsaWVyIG5vdCBjb21wYXRpYmxlIHdpdGggRi9XIGltYWdlIEFjdG9yCisJaWYgKCBpICkgeworCQlwID0gZnctPmNvbXBhdDsKKwkJaSA9IE5VTEw7CisJCXdoaWxlICggcC0+bGVuICYmIGkgPT0gTlVMTCApIHsJCQkvLyBjaGVjayB0aGUgQ0ZJIHJhbmdlcworCQkJaWYgKCBwLT50eXAgID09IENGR19DRklfQUNUX1JBTkdFU19TVEEgKSB7CisJCQkJIGkgPSBtbWRfY2hlY2tfY29tcCggKHZvaWQqKXAsICZjZmlfc3VwICk7CisJCQl9CisJCQlwKys7CisJCX0KKwkJTU1EQVNTRVJUKCBpLCAwICkJLy9DRkk6IE5JQyBTdXBwbGllciBub3QgY29tcGF0aWJsZSB3aXRoIEYvVyBpbWFnZSBBY3RvcgorCX0KKwlpZiAoIGkgPT0gTlVMTCApIHsKKwkJcmMgPSBESEZfRVJSX0lOQ09NUF9GVzsKKwl9CisJcmV0dXJuIHJjOworfSAvLyBjaGVja19jb21wX2Z3CisKKworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEV4cG9ydGVkIGZ1bmN0aW9ucworICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRSAJCWludCBkaGZfZG93bmxvYWRfYmluYXJ5KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKQorKi5QVVJQT1NFCQlEb3dubG9hZHMgYSBjb21wbGV0ZSAocHJpbWFyeSwgc3RhdGlvbiwgb3IgYWNjZXNzIHBvaW50KSBmaXJtd2FyZSBpbWFnZSB0byB0aGUgTklDLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqICAgZncgICAgICAgICAJRi9XIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKKyoKKyouUkVUVVJOUworKiAgIEhDRl9TVUNDRVNTICAgICAgICAgCS0gZG93bmxvYWQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyogICBESEZfRVJSX0lOQ09NUF9GVwkJLSBmaXJtd2FyZSBub3QgY29tcGF0aWJsZQorKgorKi5ERVNDUklQVElPTgorKiAgIEluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcworKiAgIENvbm5lY3QgdG8gdGhlIERIRgorKiAgIENoZWNrIHRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBpbWFnZSAoRm9yIHByaW1hcnkgZmlybXdhcmUgaW1hZ2VzIGl0IGlzIGNoZWNrZWQgZmlyc3QKKyogCXdoZXRoZXIgZG93bmxvYWQgaXMgbmVjZXNzYXJ5KS4KKyogICBJZiBldmVyeXRoaW5nJ3MgZG93bmxvYWQgdGhlIGZpcm13YXJlLgorKiAgIERpc2Nvbm5lY3QgZnJvbSB0aGUgREhGLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRToKKwlNTURBU1NFUlQgaXMgdW5hY2NlcHRhYmxlIGJlY2F1c2Ugc29tZSBkcml2ZXJzIGNhbGwgZGhmX2Rvd25sb2FkX2JpbmFyeSBiZWZvcmUgaGNmX2Nvbm5lY3QKKworKiBUaGUgb2xkIGNvbW1lbnQgd2FzOgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2RoZl9kb3dubG9hZF9iaW5hcnkoIG1lbWltYWdlICpmdyApCit7CitpbnQgCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK0NGR19QUk9HX1NUUkNUIAkqcDsKK2ludAkJCQlpOworCisJLy92YWxpZGF0ZSB0aGUgaW1hZ2UKKwlmb3IgKCBpID0gMDsgaSA8IHNpemVvZihzaWduYXR1cmUpICYmIGZ3LT5zaWduYXR1cmVbaV0gPT0gc2lnbmF0dXJlW2ldOyBpKysgKSAvKk5PUCovOworCWlmICggaSAhPSBzaXplb2Yoc2lnbmF0dXJlKSAJCXx8CisJCSBmdy0+c2lnbmF0dXJlW2ldICE9IDB4MDEgICAJfHwKKwkJIC8vdGVzdCBmb3IgTGl0dGxlL0JpZyBFbmRpYW4gQmluYXJ5IGZsYWcKKwkJIGZ3LT5zaWduYXR1cmVbaSsxXSAhPSAoIC8qSENGX0JJR19FTkRJQU4gPyAnQicgOiAqLyAnTCcgKSApIHJjID0gREhGX0VSUl9JTkNPTVBfRlc7CisJZWxzZSB7CQkJCQkvL0xpdHRsZSBFbmRpYW4gQmluYXJ5IGZvcm1hdAorCQlmdy0+Y29kZXAgICAgPSAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopKChQU0VVRE9fQ0hBUlApZnctPmNvZGVwICsgKGhjZl8zMilmdyApOworCQlmdy0+aWRlbnRpdHkgPSAoQ0ZHX0lERU5USVRZX1NUUkNUIEZBUiAqKSgoUFNFVURPX0NIQVJQKWZ3LT5pZGVudGl0eSArIChoY2ZfMzIpZncgKTsKKwkJZnctPmNvbXBhdCAgID0gKENGR19SQU5HRTIwX1NUUkNUIEZBUiAqKSgoUFNFVURPX0NIQVJQKWZ3LT5jb21wYXQgKyAoaGNmXzMyKWZ3ICk7CisJCWZvciAoIGkgPSAwOyBmdy0+cFtpXTsgaSsrICkgZnctPnBbaV0gPSAoKFBTRVVET19DSEFSUClmdy0+cFtpXSArIChoY2ZfMzIpZncgKTsKKwkJcCA9IGZ3LT5jb2RlcDsKKwkJd2hpbGUgKCBwLT5sZW4gKSB7CisJCQlwLT5ob3N0X2FkZHIgPSAoUFNFVURPX0NIQVJQKXAtPmhvc3RfYWRkciArIChoY2ZfMzIpZnc7CisJCQlwKys7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfSAgIC8vIGRoZl9kb3dubG9hZF9iaW5hcnkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUgCQlpbnQgZGhmX2Rvd25sb2FkX2Z3KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKQorKi5QVVJQT1NFCQlEb3dubG9hZHMgYSBjb21wbGV0ZSAocHJpbWFyeSBvciB0ZXJ0aWFyeSkgZmlybXdhcmUgaW1hZ2UgdG8gdGhlIE5JQy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKiAgIGZ3ICAgICAJCUYvVyBpbWFnZSB0byBiZSBkb3dubG9hZGVkCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MgICAgICAgIAktIGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisqCUhDRl9FUlJfTk9fTklDICAgICAJLSBubyBOSUMgcHJlc2VudAorKglESEZfRVJSX0lOQ09NUF9GVyAJLSBmaXJtd2FyZSBub3QgY29tcGF0aWJsZQorKgorKi5ERVNDUklQVElPTgorKiAtIGNoZWNrIHRoZSBzaWduYXR1cmUgb2YgdGhlIGltYWdlCisqIC0gZ2V0IHRoZSBjb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbXBvbmVudHMgb24gdGhlIE5JQworKgkgIC0gUHJpbWFyeSBGaXJtd2FyZSBJZGVudGl0eQorKgkgIC0JTW9kZW0gLSBGaXJtd2FyZSBJL0YKKyoJICAtCUNvbnRyb2xsZXIgLSBGaXJtd2FyZSBJL0YKKyohISAtIGlmIG5lY2Vzc2FyeSAoIGkuZS4gSC1JKSBnZXQgdGhlIFBEQSBjb250ZW50cyBmcm9tIHRoZSBOSUMKKyogLSBjaGVjayB0aGUgY29tcGF0aWJpbGl0eSBvZiB0aGUgTUZJIGFuZCBDRkkgb2YgdGhlIE5JQyB3aXRoIHRoZSBGL1cgaW1hZ2UKKyoJTm90ZTogdGhlIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgaXMgb25seSByZWxldmFudCBmb3IgdGhlICJydW5uaW5nIiBIQ0YgYW5kIGlzIGFscmVhZHkgdmVyaWZpZWQgaW4KKyoJaGNmX2Nvbm5lY3QKKyohISAtCWlmIG5lY2Vzc2FyeSAoIGkuZS4gSC1JKQorKiEhCSAgLQl2ZXJpZnkgdGhlIHN1bWNoZWNrIG9mIHRoZSBQREEKKyohIQkgIC0JcGx1ZyB0aGUgaW1hZ2UgKGJhc2VkIG9uIHRoZSBQREEgYW5kIHRoZSBkZWZhdWx0IHBsdWcgcmVjb3JkcykKKyogLSBsb29wIG92ZXIgYWxsIHRoZSBkb3dubG9hZCBMVFZzIGluIHRoZSBpbWFnZSB3aGljaCBjb25zaXN0cyBvZiBhIHNlcXVlbmNlIG9mCisqCSAgLSBDRkdfUFJPR19WT0xBVElMRS9DRkdfUFJPR19OT05fVk9MQVRJTEUKKyoJICAtIDEgb3IgbW9yZSBzZXF1ZW5jZXMgb2YgQ0ZHX1BST0dfQUREUiwgQ0ZHX1BST0dfREFUQSwuLi4uLENGR19QUk9HX0RBVEEKKyoJICAtCUNGR19QUk9HX1NUT1AKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyogVGhlIG9sZCBjb21tZW50IHdhczoKKyoJLy8gRG93bmxvYWQgcHJpbWFyeSBmaXJtd2FyZSBpZiBuZWNlc3NhcnkgYW5kIGFsbG93ZWQuIFRoaXMgaXMgZG9uZSBzaWxlbnRseSAod2l0aG91dCB0ZWxsaW5nCisqCS8vIHRoZSB1c2VyKSBhbmQgb25seSBpZiB0aGUgZmlybXdhcmUgaW4gdGhlIGRvd25sb2FkIGltYWdlIGlzIG5ld2VyIHRoYW4gdGhlIGZpcm13YXJlIGluIHRoZQorKgkvLyBjYXJkLiAgSW4gTWFqb3IgdmVyc2lvbiA0IG9mIHRoZSBwcmltYXJ5IGZpcm13YXJlIGZ1bmN0aW9ucyBvZiBIZXJtZXMgYW5kIFNoYXJrIHdlcmUKKyoJLy8gY29tYmluZWQuIFByaW9yIHRvIHRoYXQgdHdvIHNlcGFyYXRlIHZlcnNpb25zIGV4aXN0ZWQuIFdlIG9ubHkgaGF2ZSB0byBkb3dubG9hZCBwcmltYXJ5CisqCS8vIGZpcm13YXJlIGlmIG1ham9yIHZlcnNpb24gb2YgcHJpbWFyeSBmaXJtd2FyZSBpbiB0aGUgTklDIDwgNC4KKyoJLy8JCWRvd25sb2FkID0gcHJpX2lkZW50aXR5LnZlcnNpb25fbWFqb3IgPCA0OworKgkvLwkJaWYgKCBkb3dubG9hZCApIHsKKyoJLy8JCQlyYyA9IGNoZWNrX2NvbXBfcHJpbWFyeSggZncgKTsKKyoJLy8JCX0KKyogSXQgaXMgbXkgdW5kZXJzdGFuZGluZyB0aGF0IFByaSBWYXJpYW50IDEgbXVzdCBiZSB1cGRhdGVkIGJ5IFByaSBWYXJpYW50IDIuIFRoZSB0ZXN0IG9uCisqIG1ham9yIHZlcnNpb24gPCA0IHNob3VsZCBhbW91bnQgdG8gdGhlIHNhbWUgcmVzdWx0IGJ1dCBiZSAicHJpbmNpcGFsbHkiIGxlc3MgY29ycmVjdAorKiBJbiBkZWxpYmVyYXRpb24gd2l0aCB0aGUgQXJjaGl0ZWN0dXJlIHRlYW0sIGl0IHdhcyBkZWNpZGVkIHRoYXQgdGhpcyB1cGdyYWRlIGZvciBvbGQgSC1JCisqIE5JQ3MsIGlzIGFuIGFzcGVjdCB3aGljaCBiZWxvbmdzIG9uIHRoZSBXU1UgbGV2ZWwgbm90IG9uIHRoZSBESEYgbGV2ZWwKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitkaGZfZG93bmxvYWRfZncoIHZvaWQgKmlmYnAsIG1lbWltYWdlICpmdyApCit7CitpbnQgCQkJCXJjID0gSENGX1NVQ0NFU1M7CitMVFZfSU5GT19TVFJVQ1RfUFRSIHBwID0gbHR2X2luZm87CitDRkdfUFJPR19TVFJDVCAJCSpwID0gZnctPmNvZGVwOworTFRWUCAJCQkJbHR2cDsKK2ludAkJCQkJaTsKKworCU1NREFTU0VSVCggZncgIT0gTlVMTCwgMCApCisJLy92YWxpZGF0ZSB0aGUgaW1hZ2UKKwlmb3IgKCBpID0gMDsgaSA8IHNpemVvZihzaWduYXR1cmUpICYmIGZ3LT5zaWduYXR1cmVbaV0gPT0gc2lnbmF0dXJlW2ldOyBpKysgKSAvKk5PUCovOworCWlmICggaSAhPSBzaXplb2Yoc2lnbmF0dXJlKSAJCXx8CisJCSBmdy0+c2lnbmF0dXJlW2ldICE9IDB4MDEJCXx8CisJCSAvL2NoZWNrIGZvciBiaW5hcnkgaW1hZ2UKKwkJICggZnctPnNpZ25hdHVyZVtpKzFdICE9ICdDJyAmJiBmdy0+c2lnbmF0dXJlW2krMV0gIT0gKCAvKkhDRl9CSUdfRU5ESUFOID8gJ0InIDogKi8gJ0wnICkgKSApCisJCSByYyA9IERIRl9FUlJfSU5DT01QX0ZXOworCisvLwlSZXRyaWV2ZSBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBkb3dubG9hZCBmcm9tIHRoZSBOSUMKKwl3aGlsZSAoICggcmMgPT0gSENGX1NVQ0NFU1MgKSAmJiAoICggbHR2cCA9IHBwLT5sdHZwKSAhPSBOVUxMICkgKSB7CisJCWx0dnAtPmxlbiA9IHBwKystPmxlbjsJLy8gU2V0IGxlbiB0byBvcmlnaW5hbCBsZW4uIFRoaXMgbGVuIGlzIGNoYW5nZWQgdG8gcmVhbCBsZW4gYnkgR0VUX0lORk8oKQorCQlyYyA9IEdFVF9JTkZPKCBsdHZwICk7CisJCU1NREFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKKwkJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgbHR2cC0+dHlwICkKKwkJTU1EQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgbHR2cC0+bGVuICkKKwl9CisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHJjID0gY2hlY2tfY29tcF9mdyggZncgKTsKKwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQl3aGlsZSAoIHJjID09IEhDRl9TVUNDRVNTICYmIHAtPmxlbiApIHsKKwkJCXJjID0gUFVUX0lORk8oIHAgKTsKKwkJCXArKzsKKwkJfQorCX0KKwlNTURBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJcmV0dXJuIHJjOworfSAgIC8vIGRoZl9kb3dubG9hZF9mdworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGhmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3MWYzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZi5oCkBAIC0wLDAgKzEsMjI2IEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorI2lmbmRlZiBESEZfSAorI2RlZmluZSBESEZfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRSAgIDoJREhGLkgKKyoKKyogREFURQk6CSREYXRlOiAyMDA0LzA3LzE5IDA4OjE2OjE0ICQgICAkUmV2aXNpb246IDEuMiAkCisqIE9yaWdpbmFsCToJMjAwNC8wNS8xNyAwNzozMzoxMyAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzA1LzExIDA2OjAzOjE0ICAgIFJldmlzaW9uOiAxLjI0ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS4yMiAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbAk6CTIwMDQvMDQvMDkgMTQ6MzU6NTIgICAgUmV2aXNpb246IDEuMjEgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsCToJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS4xOCAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjE1ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAzLzA0IDExOjAzOjM4ICAgIFJldmlzaW9uOiAxLjEzICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAyLzI1IDE0OjE0OjM3ICAgIFJldmlzaW9uOiAxLjExICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWwJOgkyMDA0LzAyLzI0IDEzOjAwOjI4ICAgIFJldmlzaW9uOiAxLjEwICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWwJOgkyMDA0LzAyLzE5IDEwOjU3OjI4ICAgIFJldmlzaW9uOiAxLjggICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgOglKb2huIE1lZXJ0ZW5zCisqCQkJTmljbyBWYWxzdGVyCisqCisqIFNQRUNJRklDQVRJT046IC4uLi4uLi4uLgorKgorKiBERVNDICAgOglzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHVuaXQgREhGLgorKgorKgkJCUN1c3RvbWl6YWJsZSB2aWEgSENGQ0ZHLkgsIHdoaWNoIGlzIGluY2x1ZGVkIGluZGlyZWN0bHkgdmlhIEhDRi5ICisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk5IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBfV0lOMzJfV0NFCisjaW5jbHVkZSA8d2luZGVmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImhjZi5oIiAgIAkJIAkvLyBpbmNsdWRlcyBIQ0ZDRkcuSCB0b28KKworI2lmZGVmIERIRl9VSUwKKyNkZWZpbmUgR0VUX0lORk8oIHBwICkgIHVpbF9nZXRfaW5mbyggKExUVlApcHAgKQorI2RlZmluZSBQVVRfSU5GTyggcHAgKSAgdWlsX3B1dF9pbmZvKCAoTFRWUClwcCApCisjZWxzZQorI2RlZmluZSBHRVRfSU5GTyggcHAgKSAgaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUClwcCApCisjZGVmaW5lIFBVVF9JTkZPKCBwcCApICBoY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKXBwICkKKyNlbmRpZgorCisKKy8qLS0tLSBEZWZpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ09ERU1BU0sJCQkJMHgwMDAwRkZGRkwgICAgCS8vIENvZGVtYXNrIGZvciBwbHVnIHJlY29yZHMKKworLyotLS0tIEVycm9yIG51bWJlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIERIRl9FUlJfSU5DT01QX0ZXCQkweDQwCS8vSW1hZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBOSUMKKworLyotLS0tIFR5cGUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8qIG5lZWRlZCBieSBkaGZfd3JhcC5jCisvLwordHlwZWRlZiBzdHJ1Y3QgeworCUxUVlAgCWx0dnA7CisJaGNmXzE2CWxlbjsKK30gTFRWX0lORk9fU1RSVUNUICwgKkxUVl9JTkZPX1NUUlVDVF9QVFI7CisKKworLyoKKyAqIFR5cGU6IAlwbHVncmVjb3JkCisgKgorICogQWJzdHJhY3Q6IFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBQbHVnIERhdGEgUmVjb3JkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBvdmVybGF5IHRoZSBwbHVnIHJlY29yZHMgaW4gdGhlIGZpcm13YXJlIG1lbW9yeSBpbWFnZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJaGNmXzMyCWNvZGU7ICAgICAgCS8vIENvZGUgdG8gcGx1ZworCWhjZl8zMglhZGRyOyAgICAgIAkvLyBBZGRyZXNzIHdpdGhpbiB0aGUgbWVtb3J5IGltYWdlIHRvIHBsdWcgaXQgaW4KKwloY2ZfMzIJbGVuOyAgICAgICAJLy8gVGhlICMgb2YgYnl0ZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSB0byBzdG9yZSBpdAorfSBwbHVncmVjb3JkOworCisvKgorICogVHlwZTogCXN0cmluZ3JlY29yZAorICoKKyAqIEFic3RyYWN0OiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgRmlybXdhcmUgZGVidWcvYXNzZXJ0IHN0cmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnZXQgYXNzZXJ0IGFuZCBkZWJ1ZyBvdXRwdXRzIGluIHRoZSBkcml2ZXIgYW5kL29yIHV0aWxpdHkgdG8gYmUKKyAqIGFibGUgdG8gZ2V0IG1vcmUgdmlzYWJpbGl0eSBvZiB0aGUgRlcuCisgKi8KKworI2RlZmluZSBNQVhfREVCVUdTVFJJTkdTIAkJMTAyNAorI2RlZmluZSBNQVhfREVCVUdTVFJJTkdfTEVOIAkgIDgyCisKK3R5cGVkZWYgc3RydWN0IHsKKwloY2ZfMzIJaWQ7CisJY2hhciAJc3RyW01BWF9ERUJVR1NUUklOR19MRU5dOworfSBzdHJpbmdyZWNvcmQ7CisKKy8qCisgKiBUeXBlOiAJZXhwb3J0cmVjb3JkCisgKgorICogQWJzdHJhY3Q6IFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBGaXJtd2FyZSBleHBvcnQgb2YgYSB2YXJpYWJsZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBnZXQgdGhlIGFkZHJlc3MgYW5kIG5hbWUgb2YgYSBGVyB2YXJpYWJsZS4KKyAqLworCisjZGVmaW5lIE1BWF9ERUJVR0VYUE9SVFMgCQkyMDQ4CisjZGVmaW5lIE1BWF9ERUJVR0VYUE9SVF9MRU4gCSAgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWhjZl8zMglpZDsKKwljaGFyIAlzdHJbTUFYX0RFQlVHRVhQT1JUX0xFTl07Cit9IGV4cG9ydHJlY29yZDsKKworLy8gT2Zmc2V0cyBpbiBtZW1pbWFnZSBhcnJheSBwW10KKyNkZWZpbmUgRldTVFJJTkdTX0ZVTkNUSU9OCQkwCisjZGVmaW5lIEZXRVhQT1JUU19GVU5DVElPTgkJMQorCisvKgorICogVHlwZTogbWVtaW1hZ2UKKyAqCisgKiBBYnN0cmFjdDogVGhlICJyb290IiBkZXNjcmlwdGlvbiBvZiBhIGNvbXBsZXRlIG1lbW9yeSBpbWFnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gZW50aXJlIG1lbW9yeSBpbWFnZS4gVGhlIGltYWdlIGlzIGJ1aWx0IHVwIG9mIHNldmVyYWwKKyAqIHNlZ21lbnRzLiBUaGVzZSBzZWdtZW50cyBuZWVkIG5vdCBiZSBjb250aWd1b3VzIGFyZWFzIGluIG1lbW9yeSwgaW4gb3RoZXIgd29yZHMKKyAqIHRoZSBpbWFnZSBtYXkgY29udGFpbiAnaG9sZXMnLgorICoKKyAqIFRoZSAnY29kZXAnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBzZWdtZW50X2Rlc2NyaXB0b3Igc3RydWN0dXJlcy4KKyAqIFRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHNlZ21lbnRfZGVzY3JpcHRvciBvZiB3aGljaCBhbGwgZmllbGRzIGFyZSB6ZXJvLgorICogVGhlICdleGVjdXRpb24nIGZpZWxkIGlzIGEgMzItYml0IGFkZHJlc3MgcmVwcmVzZW50aW5nIHRoZSBleGVjdXRpb24gYWRkcmVzcworICoJb2YgdGhlIGZpcm13YXJlIHdpdGhpbiB0aGUgbWVtb3J5IGltYWdlLiBUaGlzIGFkZHJlc3MgaXMgemVybyBpbiBjYXNlIG9mIG5vbi12b2xhdGlsZQorICoJbWVtb3J5IGRvd25sb2FkLgorICogVGhlICdjb21wYXQnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBUT0RPCisgKiAJVGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgaW5kaWNhdGVkIGJ5IGEgcGx1ZyByZWNvcmQgb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqIFRoZSAnaWRlbnRpdHknIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBUT0RPCisgKiAJVGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgaW5kaWNhdGVkIGJ5IGEgcGx1ZyByZWNvcmQgb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqIFRoZSBIZXJtZXMtSSBzcGVjaWZpYyAncGRhcGx1ZycgZmllbGQgcG9pbnRzIHRvIGFuIGFycmF5IG9mIFByb2R1Y3Rpb24gRGF0YSBQbHVnIHJlY29yZCBzdHJ1Y3R1cmVzLgorICogCVRoZSBlbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBhIHBsdWcgcmVjb3JkIG9mIHdoaWNoIGFsbCBmaWVsZHMgYXJlIHplcm8uCisgKiBUaGUgSGVybWVzLUkgc3BlY2lmaWMgJ3ByaXBsdWcnIGZpZWxkIHBvaW50cyB0byBhbiBhcnJheSBvZiBQcmltYXJ5IEluZm9ybWF0aW9uIFBsdWcgcmVjb3JkIHN0cnVjdHVyZXMuCisgKiAJVGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgaW5kaWNhdGVkIGJ5IGEgcGx1ZyByZWNvcmQgb2Ygd2hpY2ggYWxsIGZpZWxkcyBhcmUgemVyby4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIJCQkJCXNpZ25hdHVyZVsxNCsxKzFdOwkvLyBzaWduYXR1cmUgKHNlZSBESEYuQykgKyBDL0xFLUJpbi9CRS1CaW4tZmxhZyArIGZvcm1hdCB2ZXJzaW9uCisJQ0ZHX1BST0dfU1RSQ1QgRkFSCQkqY29kZXA7CQkJCS8vCisJaGNmXzMyICAgICAgICAgICAJIAlleGVjdXRpb247ICAgIAkJLy8gRXhlY3V0aW9uIGFkZHJlc3Mgb2YgdGhlIGZpcm13YXJlCisJdm9pZCBGQVIgCQkgICAgICAJKnBsYWNlX2hvbGRlcl8xOworCXZvaWQgRkFSICAJCSAgICAgCSpwbGFjZV9ob2xkZXJfMjsKKwlDRkdfUkFOR0UyMF9TVFJDVCBGQVIgIAkqY29tcGF0OyAgICAgIAkJLy8gUG9pbnRlciB0byB0aGUgY29tcGF0aWJpbGl0eSBpbmZvIHJlY29yZHMKKwlDRkdfSURFTlRJVFlfU1RSQ1QgRkFSIAkqaWRlbnRpdHk7ICAgIAkJLy8gUG9pbnRlciB0byB0aGUgaWRlbnRpdHkgaW5mbyByZWNvcmRzCisJdm9pZCBGQVIJCQkJKnBbMl07CQkJCS8qIChVcCB0byA5KSBwb2ludGVycyBmb3IgKGZ1dHVyZSkgZXhwYW5zaW9uCisJCQkJCQkJCQkJCQkgKiBjdXJyZW50bHkgaW4gdXNlOgorCQkJCQkJCQkJCQkJICogIC0gRi9XIHByaW50ZiBpbmZvcm1hdGlvbgorCQkJCQkJCQkJCQkJICovCit9IG1lbWltYWdlOworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIERIRiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitFWFRFUk5fQyBpbnQgZGhmX2Rvd25sb2FkX2Z3KCB2b2lkICppZmJwLCBtZW1pbWFnZSAqZncgKTsJLy8JaWZicCwgaWdub3JlZCB3aGVuIHVzaW5nIHRoZSBVSUwKK0VYVEVSTl9DIGludCBkaGZfZG93bmxvYWRfYmluYXJ5KCBtZW1pbWFnZSAqZncgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogRnVuY3Rpb25zIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9mIHRoZSBESEYgbW9kdWxlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLy8gZGVmaW5lZCBpbiBESEYuQzsgc2VlIHRoZXJlIGZvciBjb21tZW50cworRVhURVJOX0MgaGNmXzE2ICpmaW5kX3JlY29yZF9pbl9wZGEoIGhjZl8xNiAqcGRhcCwgaGNmXzE2IGNvZGUgKTsKKworI2VuZGlmICAvLyBESEZfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGZjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RoZmNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzI2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kaGZjZmcuaApAQCAtMCwwICsxLDE1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyBESEYgY29uZmlndXJhdGlvbiBpbmZvLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgREhGQ0ZHX0gKKyNkZWZpbmUgREhGQ0ZHX0gKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZpbGUgREhGQ0ZHLkgKKyAqCisgKiBDb250ZW50czogI2RlZmluZXMgZm9yIHRoZSBESEYgbW9kdWxlCisgKgorICogQ29tbWVudHM6CisgKiAgIFNvbWUgY29tYmluYXRpb25zIG9mIHRoZSAjZGVmaW5lcyBpbiB0aGlzIGZpbGUgYXJlIGlsbGVnYWwgKGFzIG5vdGVkIGJlbG93KS4KKyAqICAgSWYgYW4gaWxsZWdhbCBjb21iaW5hdGlvbnMgb2YgI2RlZmluZXMgaXMgc3BlY2lmaWVkIGEgY29tcGlsZSBlcnJvciBpcworICogICBnZW5lcmF0ZWQuIFNlZSBkb2N1bWVudCBESEZVRy5ET0MgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQXV0aG9yOiBKb2huIE1lZXJ0ZW5zCisgKiBEYXRlOiAgIDExLTAxLTIwMDAKKyAqCisgKiBDaGFuZ2UgaGlzdG9yeToKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvLyBEZWZpbmUgREhGX1dDSSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIFdDSSB0byBhY2Nlc3MgdGhlIE9SaU5PQ08gY2FyZC4KKy8vIERlZmluZSBESEZfVUlMIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgVUlMIHRvIGFjY2VzcyB0aGUgT1JpTk9DTyBjYXJkLgorLy8gWW91IG11c3QgZGVmaW5lIGVpdGhlciBESEZfV0NJIG9yIERIRl9VSUwuIElmIG5laXRoZXIgb2YgdGhlIHR3byBpcyBkZWZpbmVkCisvLyBvciBib3RoIGEgY29tcGlsZSBlcnJvciBpcyBnZW5lcmF0ZWQuCisjZGVmaW5lIERIRl9XQ0kKKy8vISEhI2RlZmluZSBESEZfVUlMCisKKy8vIERlZmluZSBESEZfQklHX0VORElBTiBpZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBiaWcgZW5kaWFuIHBsYXRmb3JtLgorLy8gRGVmaW5lIERIRl9MSVRUTEVfRU5ESUFOIGlmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxpdHRsZSBlbmRpYW4gcGxhdGZvcm0uCisvLyBZb3UgbXVzdCBkZWZpbmUgZWl0aGVyIERIRl9CSUdfRU5ESUFOIG9yIERIRl9MSVRUTEVfRU5ESUFOLiBJZiBuZWl0aGVyIG9mCisvLyB0aGUgdHdvIGlzIGRlZmluZWQgb3IgYm90aCBhIGNvbXBpbGUgZXJyb3IgaXMgZ2VuZXJhdGVkLgorI2lmZGVmIFVTRV9CSUdfRU5ESUFOCisjZGVmaW5lIERIRl9CSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBESEZfTElUVExFX0VORElBTgorI2VuZGlmICAvKiBVU0VfQklHX0VORElBTiAqLworCisvLyBEZWZpbmUgREhGX1dJTiBpZiB5b3UgYXJlIHdvcmtpbmcgb24gV2luZG93cyBwbGF0Zm9ybS4KKy8vIERlZmluZSBESEZfRE9TIGlmIHlvdSBhcmUgd29ya2luZyBvbiBET1MuCisvLyBZb3UgbXVzdCBkZWZpbmUgZWl0aGVyIERIRl9XSU4gb3IgREhGX0RPUy4gSWYgbmVpdGhlciBvZgorLy8gdGhlIHR3byBpcyBkZWZpbmVkIG9yIGJvdGggYSBjb21waWxlIGVycm9yIGlzIGdlbmVyYXRlZC4KKy8vISEhI2RlZmluZSBESEZfV0lOCisvLyEhISNkZWZpbmUgREhGX0RPUworCisvLyBEZWZpbmUgaWYgeW91IHdhbnQgdGhlIERIRiB0byB1c2Vycy4gTm90IGRlZmluaW5nIERIRl9HRVRfUkVTX01TRworLy8gbGVhZHMgdG8gYSBkZWNyZWFzZSBpbiBjb2RlIHNpemUgYXMgbWVzc2FnZSBzdHJpbmdzIGFyZSBub3QgaW5jbHVkZWQuCisvLyEhISNkZWZpbmUgREhGX0dFVF9SRVNfTVNHCisKKy8vIExpbnV4IGRyaXZlciBzcGVjaWZpYworLy8gUHJldmVudCBpbmNsdXNpb24gb2Ygc3RkbGliLmggYW5kIHN0cmluZy5oCisjZGVmaW5lIF9JTkNfU1RETElCCisjZGVmaW5lIF9JTkNfU1RSSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIERTRiAjZGVmaW5lcyBpZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQKKy8vIHRoZSByZWxhdGVkIERTRi1mdW5jdGlvbi4gRnVuY3Rpb24gZHNmX2NhbGxiYWNrIG11c3QgYWxsd2F5cyBiZSBpbXBsZW1lbnRlZC4KKy8vIFNlZSBmaWxlIERIRi5IIGZvciBwcm90b3R5cGVzIG9mIHRoZSBmdW5jdGlvbnMuCisKKy8vIERlZmluZSBEU0ZfQUxMT0MgaWYgeW91IHdhbnQgdG8gbWFuYWdlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZS1hbGxvY2F0aW9uCisvLyBmb3IgdGhlIERIRi4gSWYgRFNGX0FMTE9DIGlzIGRlZmluZWQgeW91IG11c3QgaW1wbGVtZW50IGRzZl9hbGxvYyBhbmQgZHNmX2ZyZWUuCisvLyEhISNkZWZpbmUgRFNGX0FMTE9DCisKKy8vIERlZmluZSBEU0ZfQ09ORklSTSBpZiB5b3Ugd2FudCB0aGUgREhGIHRvIGFzayB0aGUgdXNlciBmb3IgY29uZmlybWF0aW9uIGluIGEKKy8vIG51bWJlciBvZiBzaXR1YXRpb25zLiBJZiBEU0ZfQ09ORklSTSBpcyBkZWZpbmVkIHlvdSBtdXN0IGltcGxlbWVudCBkc2ZfY29uZmlybS4KKy8vIE5vdCBkZWZpbmluZyBEU0ZfQ09ORklSTSBsZWFkcyB0byBhIGRlY3JlYXNlIGluIGNvZGUgc2l6ZSBhcyBjb25maXJtYXRpb24KKy8vIHN0cmluZ3MgYXJlIG5vdCBpbmNsdWRlZC4KKy8vISEhI2RlZmluZSBEU0ZfQ09ORklSTQorCisvLyBEZWZpbmUgRFNGX0RFQlVHX01FU1NBR0UgaWYgeW91IHdhbnQgZGVidWcgbWVzc2FnZXMgYWRkZWQgdG8geW91ciBvdXRwdXQuCisvLyBJZiB5b3UgZGVmaW5lIERTRl9ERUJVR19NRVNTQUdFIHRoZW4geW91IG11c3QgaW1wbGVtZW50IGZ1bmN0aW9uCisvLyBkc2ZfZGVidWdfbWVzc2FnZS4KKy8vI2RlZmluZSBEU0ZfREVCVUdfTUVTU0FHRQorCisvLyBEZWZpbmUgRFNGX0FTU0VSVCBpZiB5b3Ugd2FudCBhc3NlcnRzIHRvIGJlIGFjdGl2YXRlZC4KKy8vIElmIHlvdSBkZWZpbmUgRFNGX0FTU0VSVCB0aGVuIHlvdSBtdXN0IGltcGxlbWVudCBmdW5jdGlvbiBkc2ZfYXNzZXJ0LgorLy8jZGVmaW5lIERCRyAxCisvLyNkZWZpbmUgRFNGX0FTU0VSVAorCisvLyBEZWZpbmUgRFNGX0RCV0lOIGlmIHlvdSB3YW50IGFzc2VydHMgYW5kIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIHNlbmQgdG8gYSBkZWJ1ZworLy8gd2luZG93IGxpa2UgU09GVElDRSBvciBEZWJ1Z1ZpZXcgZnJvbSBTeXNJbnRlcm5hbHMuCisvLyEhISNkZWZpbmUgRFNGX0RCV0lOCisvLyEhISBOb3QgaW1wbGVtZW50ZWQgeWV0IQorCisvLyBEZWZpbmUgRFNGX1ZPTEFUSUxFX09OTFkgaWYgeW91IG9ubHkgd2FudHMgdG8gdXNlIHZhbGF0aWxlIGZ1bmN0aW9ucworLy8gVGhpcyBpcyBhIHR5cGljYWwgc2V0dGluZyBmb3IgYSBBUCBhbmQgYSBkcml2ZXIuCisjZGVmaW5lIERTRl9WT0xBVElMRV9PTkxZCisKKy8vIERlZmluZSBEU0ZfSEVSTUVTSUkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBESEYgZm9yIHRoZSBIZXJtZXMtSUkKKyNpZmRlZiBIRVJNRVMyCisjZGVmaW5lIERTRl9IRVJNRVNJSQorI2Vsc2UKKyN1bmRlZiBEU0ZfSEVSTUVTSUkKKyNlbmRpZiAvLyBIRVJNRVMyCisKKy8vIERlZmluZSBEU0ZfQklOQVJZX0ZJTEUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBESEYgaW4gY29tYmluYXRpb24gd2l0aAorLy8gcmVhZGluZyB0aGUgRmlybXdhcmUgZnJvbSBhIHNlcGFyYXRlIGJpbmFyeSBmaWxlLgorLy8hISEjZGVmaW5lIERTRl9CSU5BUllfRklMRQorCisjZW5kaWYgLy8gREhGQ0ZHX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzOWY1MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jCkBAIC0wLDAgKzEsNDg4MSBAQAorLy8gICB2aW06dHc9MTEwOnRzPTQ6CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUgICA6CUhDRi5DCisqCisqIERBVEUgICAgOgkkRGF0ZTogMjAwNC8wOC8wNSAxMTo0NzoxMCAkICAgJFJldmlzaW9uOiAxLjEwICQKKyogT3JpZ2luYWw6CTIwMDQvMDYvMDIgMTA6MjI6MjIgICAgUmV2aXNpb246IDEuODUgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOgkyMDA0LzA0LzE1IDA5OjI0OjQxICAgIFJldmlzaW9uOiAxLjYzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOgkyMDA0LzA0LzEzIDE0OjIyOjQ0ICAgIFJldmlzaW9uOiAxLjYyICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDoJMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6CTIwMDQvMDMvMTAgMTU6Mzk6MjcgICAgUmV2aXNpb246IDEuNTUgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbDoJMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS41MyAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsOgkyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjUwICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6CTIwMDQvMDIvMjQgMTM6MDA6MjcgICAgUmV2aXNpb246IDEuNDMgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbDoJMjAwNC8wMi8xOSAxMDo1NzoyNSAgICBSZXZpc2lvbjogMS4zOSAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqCisqIEFVVEhPUiA6CU5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLgorKgorKiBERVNDUklQVElPTiA6CUhDRiBSb3V0aW5lcyBmb3IgSGVybWVzLUlJIChjYWxsYWJsZSB2aWEgdGhlIFdpcmVsZXNzIENvbm5lY3Rpb24gSS9GIG9yIFdDSSkKKyoJCQkJTG9jYWwgU3VwcG9ydCBSb3V0aW5lcyBmb3IgYWJvdmUgcHJvY2VkdXJlcworKgorKgkJCUN1c3RvbWl6YWJsZSB2aWEgSENGQ0ZHLkgsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IEhDRi5ICisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEltcGxlbWVudGF0aW9uIE5vdGVzCisqKgorKiAtCWEgbGVhZGluZyBtYXJrZXIgb2YgLy8hIGlzIHVzZWQuIFRoZSBwdXJwb3NlIG9mIHN1Y2ggYSBzZXF1ZW5jZSBpcyB0byBoZWxwIHRvIHVuZGVyc3RhbmQgdGhlIGZsb3cKKyoJQW4gZXhhbXBsZSBpczoJLy8hcmMgPSBIQ0ZfU1VDQ0VTUzsKKyoJaWYgdGhpcyBpcyBzdXBlcmZsdW91cyBiZWNhdXNlIHJjIGlzIGFscmVhZHkgZ3VhcmFudGVlZCB0byBiZSAwIGJ1dCBpdCBzaG93cyB0byB0aGUgKG1haW50ZW5hbmNlKQorKglwcm9ncmFtbWVyIGl0IGlzIGFuIGludGVudGlvbmFsIG9taXNzaW9uIGF0IHRoZSBwbGFjZSB3aGVyZSBzb21lb25lIGNvdWxkIGNvbnNpZGVyIGl0IG1vc3QgYXBwcm9wcmlhdGUgYXQKKyoJZmlyc3QgZ2xhbmNlCisqIC0JdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CisqCXlvdXIgbW9kZWwgYW5kIGhvdyB5b3UgZGVmaW5lIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBhdCBpbnRlcnJ1cHQgdGltZQorKiAtCXJlbWVtYmVyIHRoYXQgc2lnbiBleHRlbnNpb24gb24gMzIgYml0IHBsYXRmb3JtcyBtYXkgY2F1c2UgcHJvYmxlbXMgdW5sZXNzIGNvZGUgaXMgY2FyZWZ1bGx5IGNvbnN0cnVjdGVkLAorKgllLmcuIHVzZSAiKGhjZl8xNil+Zm9vIiByYXRoZXIgdGhhbiAifmZvbyIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImhjZi5oIgkJCQkvLyBIQ0YgYW5kIE1TRiBjb21tb24gaW5jbHVkZSBmaWxlCisjaW5jbHVkZSAiaGNmZGVmLmgiCQkJCS8vIEhDRiBzcGVjaWZpYyBpbmNsdWRlIGZpbGUKKyNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQorCisjaWYgISBkZWZpbmVkIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHMsbSkgICAoKHVuc2lnbmVkIGludCkmKCgocyAqKTApLT5tKSkKKyNlbmRpZiAvLyBvZmZzZXRvZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFBST1RPVFlQRVMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50CQkJY21kX2V4ZSggSUZCUCBpZmJwLCBoY2ZfMTYgY21kX2NvZGUsIGhjZl8xNiBwYXJfMCApOworSENGX1NUQVRJQyBpbnQJCQlpbml0KCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgaW50CQkJcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICk7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICk7CisjZW5kaWYgLy8gSENGX0VYVF9NQgorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKK0hDRl9TVEFUSUMgdm9pZAkJCWNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBNICk7Cit2b2lkIAkJCQkJY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7Cit2b2lkIAkJCQkJY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7CitIQ0ZfU1RBVElDIGludAkJCWNoZWNrX21pYyggSUZCUCBpZmJwICk7CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKK0hDRl9TVEFUSUMgdm9pZAkJCWNhbGlicmF0ZSggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGludAkJCWNtZF9jbXBsKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgaGNmXzE2CQlnZXRfZmlkKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgdm9pZAkJCWlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKKyNpZiBIQ0ZfRE1BCitIQ0ZfU1RBVElDIERFU0NfU1RSQ1QqCWdldF9mcmFtZV9sc3QoSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyk7CisjZW5kaWYgLy8gSENGX0RNQQorSENGX1NUQVRJQyB2b2lkCQkJZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CS8vY2hhciosIGJ5dGUgY291bnQgKHVzdWFsbHkgZXZlbikKKyNpZiBIQ0ZfRE1BCitIQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApOworI2VuZGlmIC8vIEhDRl9ETUEKK0hDRl9TVEFUSUMgdm9pZAkJCXB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApOworSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApOworSENGX1NUQVRJQyBpbnQJCQlzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKTsKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgorc3RhdGljIGludCBmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCk7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKKworSENGX1NUQVRJQyBpbnQJCQlkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKTsKKyNpZiAoSENGX0VOQ0FQKSAmIEhDRl9FTkMKK0hDRl9TVEFUSUMgaGNmXzgJCWhjZl9lbmNhcCggd2NpX2J1ZnAgdHlwZSApOworI2VuZGlmIC8vIEhDRl9FTkNBUAorSENGX1NUQVRJQyBoY2ZfOAkJbnVsbF9hZGRyWzRdID0geyAwLCAwLCAwLCAwIH07CisjaWYgISBkZWZpbmVkIElOX1BPUlRfV09SRAkJCS8vcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorZXh0ZXJuIEZJTEUgKmxvZ19maWxlOworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCWluX3BvcnRfd29yZCggKGhjZl9pbykocG9ydCkgKQorCitzdGF0aWMgaGNmXzE2IGluX3BvcnRfd29yZCggaGNmX2lvIHBvcnQgKSB7CitoY2ZfMTYgaSA9IChoY2ZfMTYpX2lucHcoIHBvcnQgKTsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuUiAlMi4yeCAlNC40eCIsIChwb3J0KSYweEZGLCBpKTsKKwl9CisJcmV0dXJuIGk7Cit9IC8vIGluX3BvcnRfd29yZAorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCW91dF9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQorCitzdGF0aWMgdm9pZCBvdXRfcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCwgaGNmXzE2IHZhbHVlICkgeworCV9vdXRwdyggcG9ydCwgdmFsdWUgKTsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuVyAlMi4wMnggJTQuMDR4IiwgKHBvcnQpJjB4RkYsIHZhbHVlICk7CisJfQorfQorCit2b2lkIElOX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogZHN0LCBpbnQgbikJeworCWludCBpID0gMDsKKwloY2ZfMTYgRkFSICogcDsKKwlpZiAoIGxvZ19maWxlICkgeworCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxucmVhZCBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IHRvIGFkZHIgJWxwIiwKKwkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRiwgZHN0KTsKKwl9CisJd2hpbGUgKCBuLS0gKSB7CisJCXAgPSAoaGNmXzE2IEZBUiAqKWRzdDsKKwkJKnArKyA9IChoY2ZfMTYpX2lucHcoIHBydCApOworCQkqcCAgID0gKGhjZl8xNilfaW5wdyggcHJ0ICk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiVzJTA4bHggIiwgaSsrICUgMHgwOCA/ICIgIiA6ICJcbiIsICpkc3QpOworCQl9CisJCWRzdCsrOworCX0KK30gLy8gSU5fUE9SVF9TVFJJTkdfMzIKKwordm9pZCBJTl9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBkc3QsIGludCBuKSB7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCisJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKWRzdDsJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKKwlpbnQgaSA9IDA7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzE2IGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCisJCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCApOworCX0KKwl3aGlsZSAoIG4tLSApIHsKKwkJKnAgPShoY2ZfMTYpX2lucHcoIHBydCk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlpZiAoIGkrKyAlIDB4MTAgKSB7CisJCQkJZnByaW50ZiggbG9nX2ZpbGUsICIlMDR4ICIsICpwKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50ZiggbG9nX2ZpbGUsICJcbiUwNHggIiwgKnApOworCQkJfQorCQl9CisJCXArKzsKKwl9Cit9IC8vIElOX1BPUlRfU1RSSU5HXzhfMTYKKwordm9pZCBPVVRfUE9SVF9TVFJJTkdfMzIoIGhjZl9pbyBwcnQsIGhjZl8zMiBGQVIgKiBzcmMsIGludCBuKQl7CisJaW50IGkgPSAwOworCWhjZl8xNiBGQVIgKiBwOworCWlmICggbG9nX2ZpbGUgKSB7CisJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IiwKKwkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7CisJfQorCXdoaWxlICggbi0tICkgeworCQlwID0gKGhjZl8xNiBGQVIgKilzcmM7CisJCV9vdXRwdyggcHJ0LCAqcCsrICk7CisJCV9vdXRwdyggcHJ0LCAqcCAgICk7CisJCWlmICggbG9nX2ZpbGUgKSB7CisJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiVzJTA4bHggIiwgaSsrICUgMHgwOCA/ICIgIiA6ICJcbiIsICpzcmMpOworCQl9CisJCXNyYysrOworCX0KK30gLy8gT1VUX1BPUlRfU1RSSU5HXzMyCisKK3ZvaWQgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGhjZl9pbyBwcnQsIGhjZl84IEZBUiAqIHNyYywgaW50IG4pCXsJLy9hbHNvIGhhbmRsZXMgYnl0ZSBhbGlnbm1lbnQgcHJvYmxlbXMKKwloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopc3JjOwkJCQkJCQkJLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKKwlpbnQgaSA9IDA7CisJaWYgKCBsb2dfZmlsZSApIHsKKwkJZnByaW50ZiggbG9nX2ZpbGUsICJcbndyaXRlIHN0cmluZ18xNiBsZW5ndGggJTA0eCAoJTA0ZCkgYXQgcG9ydCAlMDR4IiwgbiwgbiwgKGhjZl8xNilwcnQpOworCX0KKwl3aGlsZSAoIG4tLSApIHsKKwkJKHZvaWQpX291dHB3KCBwcnQsICpwKTsKKwkJaWYgKCBsb2dfZmlsZSApIHsKKwkJCWlmICggaSsrICUgMHgxMCApIHsKKwkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIiUwNHggIiwgKnApOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKCBsb2dfZmlsZSwgIlxuJTA0eCAiLCAqcCk7CisJCQl9CisJCX0KKwkJcCsrOworCX0KK30gLy8gT1VUX1BPUlRfU1RSSU5HXzhfMTYKKworI2VuZGlmIC8vIElOX1BPUlRfV09SRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBIQ0ZfQVNTRVJUCitJRkJQIEJBU0VEIGFzc2VydF9pZmJwID0gTlVMTDsJCQkvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworI2lmIEhDRl9FTkNBUAorLyogU05BUCBoZWFkZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gRXRoZXJuZXQtSUkgZnJhbWVzICovCitIQ0ZfU1RBVElDICBoY2ZfOCBCQVNFRCBzbmFwX2hlYWRlcltdID0geyAweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLAkvLzUgYnl0ZXMgc2lnbmF0dXJlICsKKwkJCQkJCQkJCQkgIDAgfTsJCQkJCQkJLy8xIGJ5dGUgcHJvdG9jb2wgaWRlbnRpZmllcgorI2VuZGlmIC8vIEhDRl9FTkNBUAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorSENGX1NUQVRJQyBoY2ZfOCBCQVNFRCBtaWNfcGFkWzhdID0geyAweDVBLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CQkvL01JQyBwYWRkaW5nIG9mIG1lc3NhZ2UKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAorQ0ZHX0lERU5USVRZX1NUUkNUIEJBU0VEIGNmZ19kcnZfaWRlbnRpdHkgPSB7CisJc2l6ZW9mKGNmZ19kcnZfaWRlbnRpdHkpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECisJQ0ZHX0RSVl9JREVOVElUWSwJCQkvLyAoMHgwODI2KQorCU1TRl9DT01QT05FTlRfSUQsCisJTVNGX0NPTVBPTkVOVF9WQVIsCisJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIsCisJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIKK30gOworCitDRkdfUkFOR0VTX1NUUkNUIEJBU0VEIGNmZ19kcnZfc3VwX3JhbmdlID0geworCXNpemVvZihjZmdfZHJ2X3N1cF9yYW5nZSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX1NVUF9SQU5HRSwJCQkvLyAoMHgwODI3KQorCisJQ09NUF9ST0xFX1NVUEwsCisJQ09NUF9JRF9EVUksCisJe3sJRFVJX0NPTVBBVF9WQVIsCisJCURVSV9DT01QQVRfQk9ULAorCQlEVUlfQ09NUEFUX1RPUAorCX19Cit9IDsKKworc3RydWN0IENGR19SQU5HRTNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSA9IHsKKwlzaXplb2YoY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSkvc2l6ZW9mKGhjZl8xNikgLSAxLAkvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJLAkJLy8gKDB4MDgyOCkKKworCUNPTVBfUk9MRV9BQ1QsCisJQ09NUF9JRF9QUkksCisJeworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9QUklfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9QUklfVkFSXzIgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7CTMsCQkJCQkJCQkJLy92YXJfcmVjWzJdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0KKwl9Cit9IDsKKworCitzdHJ1Y3QgQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhID0geworCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsCQkvLyAoMHgwODI5KQorCisJQ09NUF9ST0xFX0FDVCwKKwlDT01QX0lEX1NUQSwKKwl7CisjaWYgZGVmaW5lZCBIQ0ZfU1RBX1ZBUl8xCisJIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzEKKyNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzIKKwkgewkyLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX1NUQV9WQVJfMgorLy8gRm9yIE5hdGl2ZV9VU0IgKE5vdCB1c2VkISkKKyNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzMKKwkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX1NUQV9WQVJfMworLy8gV2FycAorI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfNAorCSB7CTQsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9CisjZWxzZQorCSB7IDAsIDAsIDAgfQorI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzQKKwl9Cit9IDsKKworCitzdHJ1Y3QgQ0ZHX1JBTkdFNl9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpID0geworCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19IU0ksCQkvLyAoMHgwODJBKQorCUNPTVBfUk9MRV9BQ1QsCisJQ09NUF9JRF9IU0ksCisJeworI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfMAkJCQkJLy8gQ29udHJvbGxlZCBkZXBsb3ltZW50CisJIHsJMCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0hTSV9WQVJfMAorCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzEgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzIgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworCSB7IDAsIDAsIDAgfSwgCQkJCQkJCS8vIEhDRl9IU0lfVkFSXzMgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfNAkJCQkJLy8gSGVybWVzLUlJIGFsbCB0eXBlcworCSB7CTQsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfSwKKyNlbHNlCisJIHsgMCwgMCwgMCB9LAorI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzQKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzUJCQkJCS8vIFdBUlAgSGVybWVzLTIuNQorCSB7CTUsCQkJCQkJCQkJLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkgfQorI2Vsc2UKKwkgeyAwLCAwLCAwIH0KKyNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl81CisJfQorfSA7CisKKworQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmID0geworCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19BUEYsCQkvLyAoMHgwODJCKQorCisJQ09NUF9ST0xFX0FDVCwKKwlDT01QX0lEX0FQRiwKKwl7CisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8xCQkJCS8vKEZha2UpIEhlcm1lcy1JCisJIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0sCisjZWxzZQorCSB7IDAsIDAsIDAgfSwKKyNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl8xCisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8yCQkJCS8vSGVybWVzLUlJCisJIHsJMiwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0FQRl9WQVJfMgorI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfMwkJCQkJCS8vIE5hdGl2ZV9VU0IKKwkgewkzLAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCisJCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfM19UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCSB9LAorI2Vsc2UKKwkgeyAwLCAwLCAwIH0sCisjZW5kaWYgLy8gSENGX0FQRl9WQVJfMworI2lmIGRlZmluZWQgSENGX0FQRl9WQVJfNAkJCQkJCS8vIFdBUlAgSGVybWVzIDIuNQorCSB7CTQsCQkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKKwkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJIH0KKyNlbHNlCisJIHsgMCwgMCwgMCB9CisjZW5kaWYgLy8gSENGX0FQRl9WQVJfNAorCX0KK30gOworI2RlZmluZSBIQ0ZfVkVSU0lPTiAgVEVYVCggIkhDRiRSZXZpc2lvbjogMS4xMCAkIiApCisKK3N0YXRpYyBzdHJ1Y3QgLypDRkdfSENGX09QVF9TVFJDVCovIHsKKwloY2ZfMTYJbGVuOwkJCQkJLy9sZW5ndGggb2YgY2ZnX2hjZl9vcHQgc3RydWN0CisJaGNmXzE2CXR5cDsJCQkJCS8vdHlwZSAweDA4MkMKKwloY2ZfMTYJIHYwOwkJCQkJCS8vb2Zmc2V0IEhDRl9WRVJTSU9OCisJaGNmXzE2CSB2MTsJCQkJCQkvLyBNU0ZfQ09NUE9ORU5UX0lECisJaGNmXzE2CSB2MjsJCQkJCQkvLyBIQ0ZfQUxJR04KKwloY2ZfMTYJIHYzOwkJCQkJCS8vIEhDRl9BU1NFUlQKKwloY2ZfMTYJIHY0OwkJCQkJCS8vIEhDRl9CSUdfRU5ESUFOCisJaGNmXzE2CSB2NTsJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYgKi8KKwloY2ZfMTYJIHY2OwkJCQkJCS8vIEhDRl9ETUEKKwloY2ZfMTYJIHY3OwkJCQkJCS8vIEhDRl9FTkNBUAorCWhjZl8xNgkgdjg7CQkJCQkJLy8gSENGX0VYVAorCWhjZl8xNgkgdjk7CQkJCQkJLy8gSENGX0lOVF9PTgorCWhjZl8xNgl2MTA7CQkJCQkJLy8gSENGX0lPCisJaGNmXzE2CXYxMTsJCQkJCQkvLyBIQ0ZfTEVHQUNZCisJaGNmXzE2CXYxMjsJCQkJCQkvLyBIQ0ZfTUFYX0xUVgorCWhjZl8xNgl2MTM7CQkJCQkJLy8gSENGX1BST1RfVElNRQorCWhjZl8xNgl2MTQ7CQkJCQkJLy8gSENGX1NMRUVQCisJaGNmXzE2CXYxNTsJCQkJCQkvLyBIQ0ZfVEFMTElFUworCWhjZl8xNgl2MTY7CQkJCQkJLy8gSENGX1RZUEUKKwloY2ZfMTYJdjE3OwkJCQkJCS8vIEhDRl9OSUNfVEFMX0NOVAorCWhjZl8xNgl2MTg7CQkJCQkJLy8gSENGX0hDRl9UQUxfQ05UCisJaGNmXzE2CXYxOTsJCQkJCQkvLyBvZmZzZXQgdGFsbGllcworCVRDSEFSCXZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKK30gQkFTRUQgY2ZnX2hjZl9vcHQgPSB7CisJc2l6ZW9mKGNmZ19oY2Zfb3B0KS9zaXplb2YoaGNmXzE2KSAtMSwKKwlDRkdfSENGX09QVCwJCQkJLy8gKDB4MDgyQykKKwkoIHNpemVvZihjZmdfaGNmX29wdCkgLSBzaXplb2YoSENGX1ZFUlNJT04pIC0gNCApL3NpemVvZihoY2ZfMTYpLAorI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAorCU1TRl9DT01QT05FTlRfSUQsCisjZWxzZQorCTAsCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorCUhDRl9BTElHTiwKKwlIQ0ZfQVNTRVJULAorCUhDRl9CSUdfRU5ESUFOLAorCTAsCQkJCQkJCQkJLy8gLyogSENGX0RMViB8IEhDRl9ETE5WKi8sCisJSENGX0RNQSwKKwlIQ0ZfRU5DQVAsCisJSENGX0VYVCwKKwlIQ0ZfSU5UX09OLAorCUhDRl9JTywKKwlIQ0ZfTEVHQUNZLAorCUhDRl9NQVhfTFRWLAorCUhDRl9QUk9UX1RJTUUsCisJSENGX1NMRUVQLAorCUhDRl9UQUxMSUVTLAorCUhDRl9UWVBFLAorI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisJSENGX05JQ19UQUxfQ05ULAorCUhDRl9IQ0ZfVEFMX0NOVCwKKwlvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9UYWxseUxlbiApLAorI2Vsc2UKKwkwLCAwLCAwLAorI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQyAvIEhDRl9UQUxMSUVTX0hDRgorCUhDRl9WRVJTSU9OCit9OyAvLyBjZmdfaGNmX29wdAorI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKworI2lmIGRlZmluZWQgSENGX1RBTExJRVNfRVhUUkEKKwlyZXBsYWNlZCBieSBIQ0ZfRVhUX1RBTExJRVNfRlcgOworI2VuZGlmIC8vIEhDRl9UQUxMSUVTX0VYVFJBCisKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKK0hDRl9TVEFUSUMgTFRWX1NUUkNUIEJBU0VEIGNmZ19udWxsID0geyAxLCBDRkdfTlVMTCwgezB9IH07CisjZW5kaWYgLy8gSENGX0VYVF9NQgorSENGX1NUQVRJQyBoY2ZfMTYqIEJBU0VEIHh4eHhbIF0gPSB7CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorCSZjZmdfbnVsbC5sZW4sCQkJCQkJCS8vQ0ZHX05VTEwJCQkJCQkweDA4MjAKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisJJmNmZ19kcnZfaWRlbnRpdHkubGVuLAkJCQkJLy9DRkdfRFJWX0lERU5USVRZICAgICAgICAgICAgICAweDA4MjYKKwkmY2ZnX2Rydl9zdXBfcmFuZ2UubGVuLAkJCQkJLy9DRkdfRFJWX1NVUF9SQU5HRSAgICAgICAgICAgICAweDA4MjcKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfUFJJICAgICAgICAweDA4MjgKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX3N0YS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfU1RBCQkweDA4MjkKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaS5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfSFNJCQkweDA4MkEKKwkmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZi5sZW4sCQkJLy9DRkdfRFJWX0FDVF9SQU5HRVNfQVBGCQkweDA4MkIKKwkmY2ZnX2hjZl9vcHQubGVuLAkJCQkJCS8vQ0ZHX0hDRl9PUFQJCQkJCTB4MDgyQworCU5VTEwsCQkJCQkJCQkJLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIJMHhGRDAyCisJTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKwlOVUxMCQkJCQkJCQkJLy9lbmRzZW50aW5lbAorICB9OworI2RlZmluZSB4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQJKHNpemVvZih4eHh4KS9zaXplb2YoeHh4eFswXSkgLSAzKQorCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRCAvIEhDRl9FWFRfTUIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiBUIE8gUCAgIEwgRSBWIEUgTCAgIEggQyBGICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKKyouUFVSUE9TRQkJQ2hhbmdlcyB0aGUgcnVuLXRpbWUgQ2FyZCBiZWhhdmlvci4KKyoJCQkJUGVyZm9ybXMgTWlzY2VsbGFudW91cyBhY3Rpb25zLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJCQkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWFjdGlvbgkJCQkJbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIGNoYW5nZQorKgkgLSBIQ0ZfQUNUX0NDWF9PRkYJCWRpc2FibGUgQ0tJUAorKgkgLSBIQ0ZfQUNUX0NDWF9PTgkJZW5hYmxlIENLSVAKKyoJIC0gSENGX0FDVF9JTlRfRk9SQ0VfT04JZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCisqCSAtIEhDRl9BQ1RfSU5UX09GRgkJZGlzYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBieSBXYXZlTEFOIE5JQworKgkgLSBIQ0ZfQUNUX0lOVF9PTgkJY29tcGVuc2F0ZSAxIEhDRl9BQ1RfSU5UX09GRiwgZW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGlmIGJhbGFuY2UgcmVhY2hlZAorKgkgLSBIQ0ZfQUNUX1BSU19TQ0FOCQlIZXJtZXMgUHJvYmUgUmVzcG9ucyBTY2FuIChGMTAyKSBjb21tYW5kCisqCSAtIEhDRl9BQ1RfUlhfQUNLCQlhY2tub3dsZWRnZSBub24tRE1BIHJlY2VpdmVyIHRvIEhlcm1lcworKgkgLSBIQ0ZfQUNUX1NDQU4JCQlIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kIChub24tV0FSUCBvbmx5KQorKgkgLSBIQ0ZfQUNUX1NMRUVQCQlERFMgU2xlZXAgcmVxdWVzdAorKgkgLSBIQ0ZfQUNUX1RBTExJRVMJCUhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApIGNvbW1hbmQKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUwkJCQlhbGwgKGluY2x1ZGluZyBpbnZhbGlkKQorKglIQ0ZfSU5UX1BFTkRJTkcJCQlIQ0ZfQUNUX0lOVF9PRkYsIGludGVycnVwdCBwZW5kaW5nCisqCUhDRl9FUlJfTk9fTklDCQkJSENGX0FDVF9JTlRfT0ZGLCBOSUMgcHJlc2VuY2UgY2hlY2sgZmFpbHMKKyoKKyouQ09ORElUSU9OUworKiBFeGNlcHQgZm9yIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiBvciBIQ0ZfQUNUX0lOVF9PRkYgYXMgcGFyYW1ldGVyIG9yIGhjZl9jb25uZWN0IHdpdGggYW4gSS9PCisqIGFkZHJlc3MgKGkuZS4gbm90IEhDRl9ESVNDT05ORUNUKSwgYWxsIGhjZi1mdW5jdGlvbiBjYWxscyBNVVNUIGJlIHByZWNlZWRlZCBieSBhIGNhbGwgb2YgaGNmX2FjdGlvbiB3aXRoCisqIEhDRl9BQ1RfSU5UX09GRiBhcyBwYXJhbWV0ZXIuCisqIE5vdGUgdGhhdCBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKyogd2FzIGNhbGxlZC4KKyoKKyouREVTQ1JJUFRJT04KKyogaGNmX2FjdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1vZGUgY2hhbmdpbmcgYWN0aW9uLWNvZGUgcGFpcnMgdGhhdCBhcmUgYW50b255bXMKKyoJIC0gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KKyoJIC0gSENGX0FDVF9JTlRfW0ZPUkNFX11PTiAvIEhDRl9BQ1RfSU5UX09GRgorKgorKiBBZGRpdGlvbmFsbHkgaGNmX2FjdGlvbiBjYW4gc3RhcnQgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGluIHRoZSBOSUM6CisqCSAtIEhDRl9BQ1RfUFJTX1NDQU4KKyoJIC0gSENGX0FDVF9SWF9BQ0sKKyoJIC0gSENGX0FDVF9TQ0FOCisqCSAtIEhDRl9BQ1RfU0xFRVAKKyoJIC0gSENGX0FDVF9UQUxMSUVTCisqCisqIG8gSENGX0FDVF9JTlRfT0ZGOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRGlzYWJsZWQuCisqIFRoaXMgY29tbWFuZCwgYW5kIHRoZSBhc3NvY2lhdGVkIFtGb3JjZV0gRW5hYmxlIE5JQyBpbnRlcnJ1cHRzIGNvbW1hbmQsIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0lOVF9PTgorKiBjb21waWxlIHRpbWUgb3B0aW9uIGlzIG5vdCBzZXQgYXQgMHgwMDAwLgorKgorKiBvIEhDRl9BQ1RfSU5UX09OOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KKyogRW5hYmxlIE5JQyBJbnRlcnJ1cHRzLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgorKgorKiBvIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOiBGb3JjZSBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCisqIFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLCByZWdhcmRsZXNzIG9mZiB0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBEaXNhYmxlIE5JQyBJbnRlcnJ1cHQgY2FsbHMuCisqCisqIFRoZSBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIG9mIGludGVycnVwdHMgYXJlIGFudG9ueW1zLgorKiBUaGVzZSBhY3Rpb25zIG11c3QgYmUgYmFsYW5jZWQuCisqIEZvciBlYWNoICJkaXNhYmxlIGludGVycnVwdHMiIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyAiZW5hYmxlIGludGVycnVwdHMiLgorKiBUaGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdyB3aXRob3V0IGludGVydmVuaW5nIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbgorKiBvdGhlciB3b3JkcywgdGhlIGRpc2FibGUgaW50ZXJydXB0cyBtYXkgYmUgbmVzdGVkLgorKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGF0IHRoZSBmaXJzdCBjYWxsIHdpdGggSENGX0FDVF9JTlRfT0ZGLgorKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIHJlLWVuYWJsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGNhbGxzIHdpdGggSENGX0FDVF9JTlRfT04gbWF0Y2hlcyB0aGUKKyogbnVtYmVyIG9mIGNhbGxzIHdpdGggSU5UX09GRi4KKyoKKyogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBtb3JlIEVuYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscyB0aGFuIERpc2FibGUgTklDIEludGVycnVwdHMgY2FsbHMuCisqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgaW5pdGlhbGx5IChpLmUuIGFmdGVyIGhjZl9jb25uZWN0KSBkaXNhYmxlZC4KKyogQW4gTVNGIGJhc2VkIG9uIGEgaW50ZXJydXB0IHN0cmF0ZWd5IG11c3QgY2FsbCBoY2ZfYWN0aW9uIHdpdGggSU5UX09OIGluIGl0cyBpbml0aWFsaXphdGlvbiBsb2dpYy4KKyoKKyohCVRoZSBJTlRfT0ZGL0lOVF9PTiBob3VzZWtlZXBpbmcgaXMgaW5pdGlhbGl6ZWQgYXQgMHgwMDAwIGJ5IGhjZl9jb25uZWN0LCBjYXVzaW5nIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgorKgltZWNoYW5pc20gdG8gYmUgZGlzYWJsZWQgYXQgZmlyc3QuIFRoaXMgc3VpdHMgTVNGIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcG9sbGluZyBzdHJhdGVneS4KKyoKKyogbyBIQ0ZfQUNUX0NDWF9PRkYgLyBIQ0ZfQUNUX0NDWF9PTgorKiEhIFRoaXMgY2FuIHVzZSBzb21lIG1vcmUgZXhwbGFuYXRpb247PworKiBEaXNhYmxlcyBhbmQgRW5hYmxlcyBzdXBwb3J0IGluIHRoZSBIQ0YgcnVudGltZSBjb2RlIGZvciB0aGUgQ0NYIGZlYXR1cmUuIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgYWN0aW9uCisqIGNvZGVzIGlzIHVzZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgdXNlIGNlYXNlLgorKgorKiBvIEhDRl9BQ1RfU0xFRVA6IEluaXRpYXRlcyB0aGUgRGlzY29ubmVjdGVkIERlZXBTbGVlcCBwcm9jZXNzCisqIFRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0REUyBjb21waWxlIHRpbWUgb3B0aW9uIGlzIHNldC4gSXQgdHJpZ2dlcnMgdGhlIEYvVyB0byBzdGFydCB0aGUKKyogc2xlZXAgaGFuZHNoYWtpbmcuIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgSG9zdCBpbml0aWF0ZXMgYSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIChERFMpIG9yIHRoZSBGL1cgaW5pdGlhdGVzCisqIGEgQ29ubmVjdGVkIERlZXBTbGVlcCAoQ0RTKSwgdGhlIEhvc3QtRi9XIHNsZWVwIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGlzCisqIGVuYWJsZWQgKGJ5IG1lYW5zIG9mIHRoZSBiYWxhbmNpbmcgSENGX0FDVF9JTlRfT04pLCBpLmUuIGF0IHRoYXQgbW9tZW50IHRoZSBGL1cgcmVhbGx5IGdvZXMgaW50byBzbGVlcCBtb2RlLgorKiBUaGUgRi9XIGlzIHdva2VudXAgYnkgdGhlIEhDRiB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGFyZSBkaXNhYmxlZCwgaS5lLiBhdCB0aGUgZmlyc3QgSENGX0FDVF9JTlRfT0ZGCisqIGFmdGVyIGdvaW5nIGludG8gc2xlZXAuCisqCisqIFRoZSBmb2xsb3dpbmcgTWlzY2VsbGFudW91cyBhY3Rpb25zIGFyZSBkZWZpbmVkOgorKgorKiBvIEhDRl9BQ1RfUlhfQUNLOiBSZWNlaXZlciBBY2tub3dsZWRnZW1lbnQgKG5vbi1ETUEsIG5vbi1VU0IgbW9kZSBvbmx5KQorKiBBY2tpbmcgdGhlIHJlY2VpdmVyLCBmcmVlcyB0aGUgTklDIG1lbW9yeSB1c2VkIHRvIGhvbGQgdGhlIFJ4IGZyYW1lIGFuZCBhbGxvd3MgdGhlIEYvVyB0bworKiByZXBvcnQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbmV4dCBSeCBmcmFtZS4KKyogSWYgdGhlIE1TRiBkb2VzIG5vdCBuZWVkIGFjY2VzcyAoYW55IGxvbmdlcikgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGUuZy4gYmVjYXVzZSBpdCBpcyByZWplY3RlZCBiYXNlZCBvbiB0aGUKKyogbG9vayBhaGVhZCBvciBjb3BpZWQgdG8gYW5vdGhlciBidWZmZXIsIHRoZSByZWNlaXZlciBtYXkgYmUgYWNrZWQuIEFja2luZyBlYXJsaWVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUKKyogcG90ZW50aWFsIG9mIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UuCisqIElmIHRoZSBNU0YgZG9lcyBub3QgZXhwbGl0bHkgYWNrIHRlIHJlY2VpdmVyLCB0aGUgYWNraW5nIGlzIGRvbmUgaW1wbGljaXRseSBpZjoKKyogLSB0aGUgcmVjZWl2ZWQgZnJhbWUgZml0cyBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIsIGJ5IHRoZSBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZQorKiAtIGlmIG5vdCBpbiB0aGUgYWJvdmUgc3RlcCwgYnkgaGNmX3Jjdl9tc2cgKGFzc3VtaW5nIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCkKKyogLSBpZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpbXBsaWNpdCBhY2tzIG5vciBhbiBleHBsaWNpdCBhY2sgYnkgdGhlIE1TRiwgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBhZnRlcgorKgl0aGUgaGNmX3NlcnZpY2VfbmljIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lLgorKiBOb3RlOiBJZiBhbiBSeCBmcmFtZSBpcyBhbHJlYWR5IGFja2VkLCBhbiBleHBsaWNpdCBBQ0sgYnkgdGhlIE1TRiBhY3RzIGFzIGEgTm9PcGVyYXRpb24uCisqCisqIG8gSENGX0FDVF9UQUxMSUVTOiBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZAorKiBUaGlzIGNvbW1hbmQgaXMgb25seSBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCisqIFRoZSBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZCByZXF1ZXN0cyB0aGUgRi9XIHRvIHByb3ZpZGUgaXRzIGN1cnJlbnQgc2V0IG9mIHRhbGxpZXMuCisqIFNlZSBhbHNvIGhjZl9nZXRfaW5mbyB3aXRoIENGR19UQUxMSUVTIGFzIHBhcmFtZXRlci4KKyoKKyogbyBIQ0ZfQUNUX1BSU19TQ0FOOiBJbnF1aXJlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kCisqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKyogVGhlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCisqIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KKyoKKyogbyBIQ0ZfQUNUX1NDQU46IElucXVpcmUgU2NhbiBjb21tYW5kCisqIFRoaXMgY29tbWFuZCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSElJIEYvVyAoaS5lLiBwcmUtV0FSUCkgYW5kIGl0IGlzIG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKyogVGhlIElucXVpcmUgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCisqIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KKyoKKyogQXNzZXJ0IGZhaWxzIGlmCisqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KKyogLSBhbiBpbnZhbGlkIGNvZGUgaXMgc3BlY2lmaWVkIGluIHBhcmFtZXRlciBhY3Rpb24uCisqIC0gSENGX0FDVF9JTlRfT04gY29tbWFuZHMgb3V0bnVtYmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYgY29tbWFuZHMuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCisqCW11bHRpLXRocmVhZGluZworKgorKiAtIFNpbmNlIHRoZSBIQ0YgZG9lcyBub3QgbWFpbnRhaW4gc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSBGL1cgZW5hYmxlZCBzdGF0ZSwgaXQgaXMgbm90IGFzc2VydGVkCisqCXdoZXRoZXIgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIG9yIEhDRl9BQ1RfVEFMTElFUyBhcmUgb25seSB1c2VkIHdoaWxlIEYvVyBpcyBlbmFibGVkLgorKgorKi5ESUFHUkFNCisqIDA6IFRoZSBhc3NlcnQgZW1iZWRkZWQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBhIE1TRiBsb2dpYworKglhdCB0YXNrLWxldmVsIGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IHNoaWVsZGluZyB3aXRoIEhDRl9BQ1RfT04vX09GRi4gSG93ZXZlciB0aGUgSENGX0FDVF9JTlRfT0ZGCisqCWFjdGlvbiBpdHNlbGYgY2FuIHBlciBkZWZpbml0aW9uIG5vdCBiZSBwcm90ZWN0ZWQgdGhpcyB3YXkuIEJhc2VkIG9uIGNvZGUgaW5zcGVjdGlvbiwgaXQgY2FuIGJlIGNvbmNsdWRlZCwKKyoJdGhhdCB0aGVyZSBpcyBubyByZS1lbnRyYW5jeSBQUk9CTEVNIGluIHRoaXMgcGFydGljdWxhciBmbG93LiBJdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSB0cm91YmxlIHRvCisqCWV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoaXMgY29uZGl0aW9uIChhbHRob3VnaCB0aGVyZSB3YXMgYSByZXBvcnQgb2YgYW4gTVNGIHdoaWNoIHJhbiBpbnRvIHRoaXMgYXNzZXJ0LgorKiAyOklGQl9JbnRPZmZDbnQgaXMgdXNlZCB0byBiYWxhbmNlIHRoZSBJTlRfT0ZGIGFuZCBJTlRfT04gY2FsbHMuICBEaXNhYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkKKyoJd3JpdGluZyBhIHplcm8gdG8gdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4gIEluIGEgc2hhcmVkIGludGVycnVwdCBlbnZpcm9ubWVudCAoZS5nLiB0aGUgbWluaS1QQ0kgTkRJUworKglkcml2ZXIpIGl0IGlzIGNvbnNpZGVyZWQgbW9yZSBjb3JyZWN0IHRvIHJldHVybiB0aGUgc3RhdHVzIEhDRl9JTlRfUEVORElORyBpZiBhbmQgb25seSBpZiwgdGhlIGN1cnJlbnQKKyoJaW52b2NhdGlvbiBvZiBoY2Zfc2VydmljZV9uaWMgaXMgKGFwcGFyZW50bHkpIGNhbGxlZCBpbiB0aGUgSVNSIHdoZW4gdGhlIElTUiB3YXMgYWN0aXZhdGVkIGFzIHJlc3VsdCBvZiBhCisqCWNoYW5nZSBpbiBIUkVHX0VWX1NUQVQgbWF0Y2hpbmcgYSBiaXQgaW4gSFJFR19JTlRfRU4sIGkuZS4gbm90IGlmIGludm9rZWQgYXMgcmVzdWx0IG9mIGFub3RoZXIgZGV2aWNlCisqCWdlbmVyYXRpbmcgYW4gaW50ZXJydXB0IG9uIHRoZSBzaGFyZWQgaW50ZXJydXB0IGxpbmUuCisqCU5vdGUgMTogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIGFkdmVyc2UgY29uZGl0aW9ucyBvbiBjZXJ0YWluIHBsYXRmb3JtcyB0aGUgd3JpdGluZyBvZgorKglIUkVHX0lOVF9FTiBjYW4gYXBwYXJlbnRseSBmYWlsLCB0aGVyZWZvciBpdCBpcyBwYXJhbW91bnQgdGhhdCBIUkVHX0lOVF9FTiBpcyB3cml0dGVuIGFnYWluIHdpdGggMCBmb3IKKyoJZWFjaCBhbmQgZXZlcnkgY2FsbCB0byBIQ0ZfQUNUX0lOVF9PRkYuCisqCU5vdGUgMjogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIEgvVyAmIFMvVyBhcmNoaXRlY3R1cmVzIHRoaXMgbG9naWMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMKKyoJbm8gTklDIGF0IGFsbC4gVG8gY2F0ZXIgZm9yIHRoaXMsIHRoZSB2YWx1ZSBvZiBIUkVHX0lOVF9FTiBpcyB2YWxpZGF0ZWQuIElmIHRoZSB1bnVzZWQgYml0IDB4MDEwMCBpcyBzZXQsCisqCWl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgbm8gTklDLgorKglOb3RlIDM6IER1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcywgc29tZSB2ZXJzaW9ucyBvZiB0aGUgRi9XIHJlc2V0IEhSRUdfU1dfMCwgaGVuY2UgY2hlY2tpbmcgdGhpcworKglyZWdpc3RlciBmb3IgSENGX01BR0lDICh0aGUgY2xhc3NpY2FsIE5JQyBwcmVzZW5jZSB0ZXN0KSB3aGVuIEhDRl9BQ1RfSU5UX09GRiBpcyBjYWxsZWQgZHVlIHRvIGFub3RoZXIKKyoJY2FyZCBpbnRlcnJ1cHRpbmcgdmlhIGEgc2hhcmVkIElSUSBkdXJpbmcgYSBkb3dubG9hZCwgZmFpbHMuCisqNDoJVGhlIGNvbnN0cnVjdGlvbiAiaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCApIiBpcyBvcHRpbWFsIChpbiB0aGUgc2Vuc2Ugb2Ygc2hvcnRlc3QvcXVpY2tlc3QKKyoJcGF0aCBpbiBlcnJvciBmcmVlIGZsb3dzKSBidXQgTk9UIGZhaWwgc2FmZSBpbiBjYXNlIG9mIHRvbyBtYW55IElOVF9PTiBpbnZvY2F0aW9ucyBjb21wYXJlZCB0byBJTlRfT0ZGKS4KKyoJRW5hYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkgd3JpdGluZyB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLgorKgkgLSBJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSwgdGhlIGludGVycnVwdHMgc3RheSBkaXNhYmxlZC4KKyoJIC0gVW5kZXIgIm5vcm1hbCIgY29uZGl0aW9ucywgdGhlIEhDRiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gSW5mbyBFdmVudHMsIFJ4IEV2ZW50cyBhbmQgTm90aWZ5IEV2ZW50cy4KKyoJIC0gV2hlbiB0aGUgSENGIGlzIG91dCBvZiBUeC9Ob3RpZnkgcmVzb3VyY2VzLCB0aGUgSENGIGlzIGFsc28gaW50ZXJlc3RlZCBpbiBBbGxvYyBFdmVudHMuCisqCSAtIHZpYSBIQ0ZfRVhULCB0aGUgTVNGIHByb2dyYW1tZXIgY2FuIGFsc28gcmVxdWVzdCBIUkVHX0VWX1RJQ0sgYW5kL29yIEhSRUdfRVZfVFhfRVhDIGludGVycnVwdHMuCisqCUZvciBETUEgb3BlcmF0aW9uLCB0aGUgRE1BIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGFsbG9jIGV2ZW50cy4gVGhlIERNQSBlbmdpbmUgd2lsbCBnZW5lcmF0ZSBhICdUeERtYURvbmUnCisqCWV2ZW50IGFzIHNvb24gYXMgaXQgaGFzIHB1bXBlZCBhIGZyYW1lIGZyb20gaG9zdCByYW0gaW50byBOSUMtUkFNIChub3RlIHRoYXQgdGhlIGZyYW1lIGRvZXMgbm90IGhhdmUgdG8gYmUKKyoJdHJhbnNtaXR0ZWQgdGhlbiksIGFuZCBhICdSeERtYURvbmUnIGV2ZW50IGFzIHNvb24gYXMgYSByZWNlaXZlZCBmcmFtZSBoYXMgYmVlbiBwdW1wZWQgZnJvbSBOSUMtUkFNIGludG8KKyoJaG9zdCByYW0uICBOb3RlIHRoYXQgdGhlICdhbGxvYycgZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudC1tYXNrLCBiZWNhdXNlIHRoZSBETUEgZW5naW5lIHdpbGwKKyoJcmVhY3QgdG8gYW5kIGFja25vd2xlZGdlIHRoaXMgZXZlbnQuCisqNjoJYWNrIHRoZSAib2xkIiBSeC1ldmVudC4gU2VlICJSeCBCdWZmZXIgZnJlZSBzdHJhdGVneSIgaW4gaGNmX3NlcnZpY2VfbmljIGFib3ZlIGZvciBtb3JlIGV4cGxhbmF0aW9uLgorKglJRkJfUnhGSUQgYW5kIElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgdG8gYnJpbmcgYm90aCB0aGUgaW50ZXJuYWwgSENGIGhvdXNlIGtlZXBpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbgorKglzdXBwbGllZCB0byB0aGUgTVNGIGluIHRoZSBzdGF0ZSAibm8gZnJhbWUgcmVjZWl2ZWQiLgorKjg6CVRoZSBIQ0ZfQUNUX1NDQU4sIEhDRl9BQ1RfUFJTX1NDQU4gYW5kIEhDRl9BQ1RfVEFMTElFUyBhY3Rpdml0eSBhcmUgbWVyZ2VkIGJ5ICJjbGV2ZXIiIGFsZ2VicmFpYworKgltYW5pcHVsYXRpb25zIG9mIHRoZSBSSUQtdmFsdWVzIGFuZCBhY3Rpb24gY29kZXMsIHNvIGZvcmVnb2luZyByb2J1c3RuZXNzIGFnYWluc3QgbWlncmF0aW9uIHByb2JsZW1zIGZvcgorKgllYXNlIG9mIGltcGxlbWVudGF0aW9uLiBUaGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kCisqCUhDRl9BQ1RfVEFMTElFUyBldGMgYXJlIGNoZWNrZWQgYnkgdGhlICIjaWYiIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGUgYm9keSBvZiB0aGlzIHJvdXRpbmUsIHJlc3VsdGluZworKglpbjogZXJyICJtYWludGVuYW5jZSIgZHVyaW5nIGNvbXBpbGF0aW9uIGlmIHRoZSBhc3N1bXB0aW9ucyBhcmUgbm8gbG9uZ2VyIG1ldC4gVGhlIHdyaXRpbmcgb2YgSFJFR19QQVJBTV8xCisqCXdpdGggMHgzRkZGIGluIGNhc2Ugb2YgYW4gUFJTIHNjYW4sIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgbGFjayBvZiBzcGVjaWZpY2F0aW9uLCBoZW5jZSBkaWZmZXJlbnQKKyoJaW1wbGVtZW50YXRpb24gaW4gRi9XIGFuZCBIb3N0LgorKglXaGVuIHRoZXJlIGlzIG5vIE5JQyBSQU0gYXZhaWxhYmxlLCBzb21lIHZlcnNpb25zIG9mIHRoZSBIZXJtZXMgRi9XIGRvIHJlcG9ydCAweDdGMDAgYXMgZXJyb3IgaW4gdGhlCisqCVJlc3VsdCBmaWVsZCBvZiB0aGUgU3RhdHVzIHJlZ2lzdGVyIGFuZCBzb21lIEYvVyB2ZXJzaW9ucyBkb24ndC4gVG8gbWFzayB0aGlzIGRpZmZlcmVuY2UgdG8gdGhlIE1TRiBhbGwKKyoJcmV0dXJuIGNvZGVzIG9mIHRoZSBIZXJtZXMgYXJlIGlnbm9yZWQgKCJiZXN0IiBhbmQgIm1vc3Qgc2ltcGxlIiBzb2x1dGlvbiB0byB0aGVzZSB0eXBlcyBvZiBhbmFsb21pZXMgd2l0aAorKglhbiBhY2NlcHRhYmxlIGxvc3MgZHVlIHRvIGlnbm9yaW5nIGFsbCBlcnJvciBzaXR1YXRpb25zIGFzIHdlbGwpLgorKglUaGUgIk5vIGlucXVpcmUgc3BhY2UiIGlzIHJlcG9ydGVkIHZpYSB0aGUgSGVybWVzIHRhbGxpZXMuCisqMzA6IGRvIG5vdCBIQ0ZBU1NFUlQoIHJjLCByYyApIHNpbmNlIHJjID09IEhDRl9JTlRfUEVORElORyBpcyBubyBlcnJvcgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorI2lmIENGR19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9TQ0FOCitlcnI6ICJtYWludGVuYW5jZSIgYXBwYXJlbnRseSBpbnZpb2xhdGVkIHRoZSB1bmRlcmx5aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlc2UgbWFjcm9zCisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisjaWYgQ0ZHX1BSU19TQ0FOICE9IENGR19UQUxMSUVTIC0gSENGX0FDVF9UQUxMSUVTICsgSENGX0FDVF9QUlNfU0NBTgorZXJyOiAibWFpbnRlbmFuY2UiIGFwcGFyZW50bHkgaW52aW9sYXRlZCB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIGFib3V0IHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIG1hY3JvcworI2VuZGlmCitpbnQKK2hjZl9hY3Rpb24oIElGQlAgaWZicCwgaGNmXzE2IGFjdGlvbiApCit7CitpbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKKworCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKKyNpZiBIQ0ZfSU5UX09OCisJSENGTE9HRU5UUlkoIGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiA/IEhDRl9UUkFDRV9BQ1RJT05fS0xVREdFIDogSENGX1RSQUNFX0FDVElPTiwgYWN0aW9uICkJCQkJCQkJCQkJCQkJCS8qIDAgKi8KKyNpZiAoSENGX1NMRUVQKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUgfHwgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiwKKwkJCSAgIE1FUkdFXzIoIGFjdGlvbiwgaWZicC0+SUZCX0ludE9mZkNudCApICkKKyNlbHNlCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgYWN0aW9uICkKKyNlbmRpZiAvLyBIQ0ZfU0xFRVAKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGIHx8CisJCQkgICBhY3Rpb24gPT0gSENGX0FDVF9JTlRfT0ZGIHx8IGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiwgIGFjdGlvbiApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250IDw9IDE2IHx8IGlmYnAtPklGQl9JbnRPZmZDbnQgPj0gMHhGRkZFLAorCQkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKQkvL25lc3RpbmcgbW9yZSB0aGFuIDE2IGRlZXAgc2VlbXMgdW5yZWFzb25hYmxlCisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisJc3dpdGNoIChhY3Rpb24pIHsKKyNpZiBIQ0ZfSU5UX09OCitoY2ZfMTYJaTsKKwkgIGNhc2UgSENGX0FDVF9JTlRfT0ZGOgkJCQkJCS8vIERpc2FibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKyNpZiBIQ0ZfU0xFRVAKKwkJaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSApIHsJLy8gV2FrZVVwIHRlc3QJOz90aWUgdGhpcyB0byB0aGUgIm5ldyIgc3VwZXItTGlua1N0YXQKKwkJCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsJCQkJCQkvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKKwkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQKKwkJCU9QVyhIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOwkJLy8gc2V0IHdha2V1cCBiaXQgdG8gY291bnRlcmFjdCB0aGUgY2xlYXJpbmcgYnkgRi9XCisJCQkvLyA4MDAgdXMgbGF0ZW5jeSBiZWZvcmUgRlcgc3dpdGNoZXMgdG8gaGlnaCBwb3dlcgorCQkJTVNGX1dBSVQoODAwKTsJCQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCisvL09PUgkJaWYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRFNfT09SICkgeyAvLyBPdXRPZlJhbmdlCisvLwkJCQlwcmludGsoICI8NT5BQ1RfSU5UX09GRjogRGVlcHNsZWVwIHBoYXNlIHRlcm1pbmF0ZWQsIGVuYWJsZSBhbmQgZ28gdG8gQXdhaXRDb25uZWN0aW9uXG4iICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisvLwkJCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRU5BQkxFICk7CisvLwkJCX0KKy8vCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfiggQ0ZHX0xJTktfU1RBVF9EU19JUiB8IENGR19MSU5LX1NUQVRfRFNfT09SKTsJLy9jbGVhciBJUi9PT1Igc3RhdGUKKwkJfQorI2VuZGlmIC8vIEhDRl9TTEVFUAorLyoyKi8JaWZicC0+SUZCX0ludE9mZkNudCsrOworLy8hICAgICByYyA9IDA7CisJCWkgPSBJUFcoIEhSRUdfSU5UX0VOICk7CisJCU9QVyggSFJFR19JTlRfRU4sIDAgKTsKKwkJaWYgKCBpICYgMHgxMDAwICkgeworCQkJcmMgPSBIQ0ZfRVJSX05PX05JQzsKKwkJfSBlbHNlIHsKKwkJCWlmICggaSAmIElQVyggSFJFR19FVl9TVEFUICkgKSB7CisJCQkJcmMgPSBIQ0ZfSU5UX1BFTkRJTkc7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkgIGNhc2UgSENGX0FDVF9JTlRfRk9SQ0VfT046CQkJCS8vIEVuZm9yY2UgRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCisJCWlmYnAtPklGQl9JbnRPZmZDbnQgPSAwOworCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX0lOVF9PTgorCisJICBjYXNlIEhDRl9BQ1RfSU5UX09OOgkJCQkJCS8vIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorLyo0Ki8JaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCAmJiBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCApIHsKKwkJCQkJCQkJCQkJCS8vZGV0ZXJtaW5lIEludGVycnVwdCBFdmVudCBtYXNrCisjaWYgSENGX0RNQQorCQkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7CisJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEIHwgSFJFR19FVl9UWF9FWFQ7CS8vbWFzayB3aGVuIERNQSBhY3RpdmUKKwkJCX0gZWxzZQorI2VuZGlmIC8vIEhDRl9ETUEKKwkJCXsKKwkJCQlpID0gSFJFR19FVl9JTkZPIHwgSFJFR19FVl9SWCB8IEhSRUdfRVZfVFhfRVhUOwkJCQkJCS8vbWFzayB3aGVuIERNQSBub3QgYWN0aXZlCisJCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CisJCQkJCWkgfD0gSFJFR19FVl9BTExPQzsJCQkJCQkJCQkJCQkvL21hc2sgd2hlbiBubyBUeEZJRCBhdmFpbGFibGUKKwkJCQl9CisJCQl9CisjaWYgSENGX1NMRUVQCisJCQlpZiAoICggSVBXKEhSRUdfRVZfU1RBVCkgJiAoIGkgfCBIUkVHX0VWX1NMRUVQX1JFUSApICkgPT0gSFJFR19FVl9TTEVFUF9SRVEgKSB7CisJCQkJLy8gZmlybXdhcmUgaW5kaWNhdGVzIGl0IHdvdWxkIGxpa2UgdG8gZ28gaW50byBzbGVlcCBtb2R1cworCQkJCS8vIG9ubHkgYWNrbm93bGVkZ2UgdGhpcyByZXF1ZXN0IGlmIG5vIG90aGVyIGV2ZW50cyB0aGF0IGNhbiBjYXVzZSBhbiBpbnRlcnJ1cHQgYXJlIHBlbmRpbmcKKwkJCQlpZmJwLT5JRkJfSW50T2ZmQ250LS07CQkJLy9iZWNvbWVzIDB4RkZGRQorICAgICAgICAgICAgCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1RJQ0sgKTsKKwkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfVElDSyB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOworCQkJfSBlbHNlCisjZW5kaWYgLy8gSENGX1NMRUVQCisJCQl7CisgICAgICAgICAgICAJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfU0xFRVBfUkVRICk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisJICBjYXNlIEhDRl9BQ1RfU0xFRVA6CQkJCQkJLy8gRERTIFNsZWVwIHJlcXVlc3QKKwkJaGNmX2NudGwoIGlmYnAsIEhDRl9DTlRMX0RJU0FCTEUgKTsKKwkJY21kX2V4ZSggaWZicCwgSENNRF9TTEVFUCwgMCApOworCQlicmVhazsKKy8vIAkgIGNhc2UgSENGX0FDVF9XQUtFVVA6CQkJCQkJLy8gRERTIFdha2V1cCByZXF1ZXN0CisvLyAJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCA9PSAweEZGRkUsIGlmYnAtPklGQl9JbnRPZmZDbnQgKQorLy8gCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKKy8vIAkJT1BXKCBIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOworLy8gCQlNU0ZfV0FJVCg4MDApOwkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgorLy8gCQlyYyA9IGhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfSU5UX09GRiApOwkvKmJvZ3VzLCBJRkJfSW50T2ZmQ250ID09IDB4RkZGRiwgc28gaWYgeW91IGNhcmVmdWxseSBsb29rCisvLyAJCQkJCQkJCQkJCQkJICphdCB0aGUgI2lmIEhDRl9ERFMgc3RhdGVtZW50cywgSENGX0FDVF9JTlRfT0ZGIGlzIGVtcHR5CisvLyAJCQkJCQkJCQkJCQkJICpmb3IgRERTLiAiTXVjaCIgYmV0dGVyIHdvdWxkIGJlIHRvIG1lcmdlIHRoZSBmbG93cyBmb3IKKy8vIAkJCQkJCQkJCQkJCQkgKkREUyBhbmQgREVFUF9TTEVFUAorLy8gCQkJCQkJCQkJCQkJCSAqLworLy8gCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfRERTCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJICBjYXNlIEhDRl9BQ1RfQ0NYX09OOgkJCQkJCS8vIGVuYWJsZSBDS0lQCisJICBjYXNlIEhDRl9BQ1RfQ0NYX09GRjoJCQkJCQkvLyBkaXNhYmxlIENLSVAKKwkJaWZicC0+SUZCX0NLSVBTdGF0ID0gYWN0aW9uOworCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKKworCSAgY2FzZSBIQ0ZfQUNUX1JYX0FDSzoJCQkJCQkvL1JlY2VpdmVyIEFDSworLyo2Ki8JaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7CisJCQlEQVdBX0FDSyggSFJFR19FVl9SWCApOworCQl9CisJCWlmYnAtPklGQl9SeEZJRCA9IGlmYnAtPklGQl9SeExlbiA9IDA7CisJCWJyZWFrOworCisvKjgqLyBjYXNlCUhDRl9BQ1RfUFJTX1NDQU46CQkJCQkvLyBIZXJtZXMgUFJTIFNjYW4gKEYxMDIpCisJCU9QVyggSFJFR19QQVJBTV8xLCAweDNGRkYgKTsKKwkJCS8vRmFsbCB0aHJvdWdoIGluIEhDRl9BQ1RfVEFMTElFUworCSAgY2FzZSBIQ0ZfQUNUX1RBTExJRVM6CQkJCQkJLy8gSGVybWVzIElucXVpcmUgVGFsbGllcyAoRjEwMCkKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorCSAgY2FzZSBIQ0ZfQUNUX1NDQU46CQkJCQkJLy8gSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisJCS8qISEgdGhlIGFzc3VtcHRpb25zIGFib3V0IG51bWVyaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ0ZHX1RBTExJRVMgZXRjIGFuZCBIQ0ZfQUNUX1RBTExJRVMgZXRjCisJCSAqICAgYXJlIGNoZWNrZWQgYnkgI2lmIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGlzIHJvdXRpbmUgcmVzdWx0aW5nIGluOiBlcnIgIm1haW50ZW5hbmNlIgkqLworCQljbWRfZXhlKCBpZmJwLCBIQ01EX0lOUVVJUkUsIGFjdGlvbiAtIEhDRl9BQ1RfVEFMTElFUyArIENGR19UQUxMSUVTICk7CisJCWJyZWFrOworCisJICBkZWZhdWx0OgorCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgYWN0aW9uICkKKwkJYnJlYWs7CisJfQorCS8vISBkbyBub3QgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCQkJLyogMzAqLworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9BQ1RJT04gKQorCXJldHVybiByYzsKK30gLy8gaGNmX2FjdGlvbgorI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKKyouUFVSUE9TRQkJQ29ubmVjdCBvciBkaXNjb25uZWN0IGEgc3BlY2lmaWMgcG9ydCB0byBhIHNwZWNpZmljIG5ldHdvcmsuCisqISEgIDs/Pz8/Pz8/Pz8/Pz8/Pz8/IGNvbnRpbnVlIG5lZWRzIG1vcmUgZXhwbGFuYXRpb24KKyoJCQkJcmVjb3ZlcnMgYnkgbWVhbnMgb2YgImNvbnRpbnVlIiB3aGVuIHRoZSBjb25uZWN0IHByb2NlcyBpbiBDQ1ggbW9kZSBmYWlscworKgkJCQlFbmFibGVzIG9yIGRpc2FibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBOSUMuCisqCQkJCUFjdGl2YXRlcyBzdGF0aWMgTklDIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcG9ydCBhdCBjb25uZWN0LgorKgkJCQlBY3RpdmF0ZXMgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBwb3J0cyBhdCBlbmFibGUuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJY21kCQkJMHgwMDFGOglIZXJtZXMgY29tbWFuZCAoZGlzYWJsZSwgZW5hYmxlLCBjb25uZWN0LCBkaXNjb25uZWN0LCBjb250aW51ZSkKKyoJCQkJCUhDRl9DTlRMX0VOQUJMRQkJRW5hYmxlCisqCQkJCQlIQ0ZfQ05UTF9ESVNBQkxFICAgIERpc2FibGUKKyoJCQkJCUhDRl9DTlRMX0NPTlRJTlVFCUNvbnRpbnVlCisqCQkJCQlIQ0ZfQ05UTF9DT05ORUNUICAgIENvbm5lY3QKKyoJCQkJCUhDRl9DTlRMX0RJU0NPTk5FQ1QgRGlzY29ubmVjdAorKgkJCQkweDAxMDA6IGNvbW1hbmQgcXVhbGlmaWVyIChjb250aW51ZSkKKyoJCQkJCUhDTURfUkVUUlkJCQlyZXRyeSBmbGFnCisqCQkJCTB4MDcwMDogIHBvcnQgbnVtYmVyIChjb25uZWN0L2Rpc2Nvbm5lY3QpCisqCQkJCQlIQ0ZfUE9SVF8wICAgICAgICAgIE1BQyBQb3J0IDAKKyoJCQkJCUhDRl9QT1JUXzEgICAgICAgICAgTUFDIFBvcnQgMQorKgkJCQkJSENGX1BPUlRfMiAgICAgICAgICBNQUMgUG9ydCAyCisqCQkJCQlIQ0ZfUE9SVF8zICAgICAgICAgIE1BQyBQb3J0IDMKKyoJCQkJCUhDRl9QT1JUXzQgICAgICAgICAgTUFDIFBvcnQgNAorKgkJCQkJSENGX1BPUlRfNSAgICAgICAgICBNQUMgUG9ydCA1CisqCQkJCQlIQ0ZfUE9SVF82ICAgICAgICAgIE1BQyBQb3J0IDYKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKiEhCXZpYSBjbWRfZXhlCisqCUhDRl9FUlJfTk9fTklDCisqCUhDRl9FUlJfREVGVU5DVF8uLi4KKyoJSENGX0VSUl9USU1FX09VVAorKgorKi5ERVNDUklQVElPTgorKiBUaGUgcGFyYW1ldGVyIGNtZCBjb250YWlucyBhIG51bWJlciBvZiBzdWJmaWVsZHMuCisqIFRoZSBhY3R1YWwgdmFsdWUgZm9yIGNtZCBpcyBjcmVhdGVkIGJ5IGxvZ2ljYWwgb3ItaW5nIHRoZSBhcHByb3ByaWF0ZSBtbmVtb25pY3MgZm9yIHRoZSBzdWJmaWVsZHMuCisqIFRoZSBmaWVsZCAweDAwMUYgY29udGFpbnMgdGhlIGNvbW1hbmQgY29kZQorKiAgLSBIQ0ZfQ05UTF9FTkFCTEUKKyogIC0gSENGX0NOVExfRElTQUJMRQorKiAgLSBIQ0ZfQ05UTF9DT05ORUNUCisqICAtIEhDRl9DTlRMX0RJU0NPTk5FQ1QKKyogIC0gSENGX0NOVExfQ09OVElOVUUKKyoKKyogRm9yIEhDRl9DTlRMX0NPTlRJTlVFLCB0aGUgZmllbGQgMHgwMTAwIGNvbnRhaW5zIHRoZSByZXRyeSBmbGFnIEhDTURfUkVUUlkuCisqIEZvciBIQ0ZfQ05UTF9DT05ORUNUIGFuZCBIQ0ZfQ05UTF9ESVNDT05ORUNULCB0aGUgZmllbGQgMHgwNzAwIGNvbnRhaW5zIHRoZSBwb3J0IG51bWJlciBhcyBIQ0ZfUE9SVF8jLgorKiBGb3IgU3RhdGlvbiBhcyB3ZWxsIGFzIEFjY2Vzc1BvaW50IEYvVywgTUFDIFBvcnQgMCBpcyB0aGUgIm5vcm1hbCIgY29tbXVuaWNhdGlvbiBjaGFubmVsLgorKiBGb3IgQWNjZXNzUG9pbnQgRi9XLCBNQUMgUG9ydCAxIHRocm91Z2ggNiBjb250cm9sIHRoZSBXRFMgbGlua3MuCisqCisqIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBuYW1lcyBIQ0ZfQ05UTF9ESVNBQkxFIGFuZCBIQ0ZfQ05UTF9FTkFCTEUsIGhjZl9jbnRsIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgTklDCisqIEludGVycnVwdHMgbW9kZS4KKyoKKyogVGhlIENvbm5lY3QgaXMgdXNlZCBieSB0aGUgTVNGIHRvIGJyaW5nIGEgcGFydGljdWxhciBwb3J0IGluIGFuIGluYWN0aXZlIHN0YXRlIGFzIGZhciBhcyBkYXRhIHRyYW5zbWlzc2lvbgorKiBhbmQgcmVjZXB0aW9uIGFyZSBjb25jZXJuZWQuCisqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgZGlzY29ubmVjdGVkOgorKiAtIHRoZSBGL1cgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCisqIC0gdGhlIEYvVyBpZ25vcmVzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKyogLSBhbGwgZnJhbWVzIChSZWNlaXZlIGFzIHdlbGwgYXMgcGVuZGluZyBUcmFuc21pdCkgZm9yIHRoYXQgcG9ydCBvbiB0aGUgTklDIGFyZSBkaXNjYXJkZWQuCisqCisqIFdoZW4gdGhlIE5JQyBpcyBkaXNhYmxlZCwgYWJvdmUgbGlzdCBhcHBsaWVzIHRvIGFsbCBwb3J0cywgaS5lLiB0aGUgcmVzdWx0IGlzIGxpa2UgYWxsIHBvcnRzIGFyZQorKiBkaXNjb25uZWN0ZWQuCisqCisqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgY29ubmVjdGVkOgorKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBvcnQuCisqIC0gZW5hYmxlcyB0aGUgcmVjZWl2ZXIgZm9yIHRoYXQgcG9ydC4KKyogLSBhY2NlcHRzIHNlbmQgY29tbWFuZHMgZm9yIHRoYXQgcG9ydC4KKyoKKyogRW5hYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKyogLSB0aGUgRi9XIGVmZmVjdHVhdGVzIHRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzLgorKglUaGUgRi9XIG9ubHkgdXBkYXRlcyBpdHMgc3RhdGljIGNvbmZpZ3VyYXRpb24gYXQgYSB0cmFuc2l0aW9uIGZyb20gZGlzYWJsZWQgdG8gZW5hYmxlZCBvciBmcm9tCisqCWRpc2Nvbm5lY3RlZCB0byBjb25uZWN0ZWQuCisqCUluIG9yZGVyIHRvIGVuZm9yY2UgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uLCB0aGUgTVNGIG11c3QgYXNzdXJlIHRoYXQgc3VjaCBhIHRyYW5zaXRpb24gdGFrZXMgcGxhY2UuCisqCUR1ZSB0byBzdWNoIGEgZGlzYWJsZS9lbmFibGUgb3IgZGlzY29ubmVjdC9jb25uZWN0IHNlcXVlbmNlLCBSeC9UeCBmcmFtZXMgbWF5IGJlIGxvc3QsIGluIG90aGVyIHdvcmRzLAorKgljb25maWd1cmF0aW9uIG1heSBpbXBhY3QgY29tbXVuaWNhdGlvbi4KKyogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZW5hYmxlZC4KKyogTm90ZSB0aGF0IHRoZSBFbmFibGUgRnVuY3Rpb24gYnkgaXRzZWxmIG9ubHkgZW5hYmxlcyBkYXRhIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uLCBpdAorKiBkb2VzIG5vdCBlbmFibGUgdGhlIEludGVycnVwdCBHZW5lcmF0aW9uIG1lY2hhbmlzbS4gVGhpcyBpcyBkb25lIGJ5IGhjZl9hY3Rpb24uCisqCisqIERpc2FibGluZyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgorKiEhICA7Pz8/Pz9pcyB0aGUgZm9sbG93aW5nIHN0YXRlbWVudCByZWFsbHkgdHJ1ZQorKiAtIGl0IGFjdHMgYXMgYSBkaXNjb25uZWN0IG9uIGFsbCBwb3J0cy4KKyogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZGlzYWJsZWQuCisqCisqIEZvciBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZCBvbiB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV90eC9yeF9nZXQgc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy4KKyoKKyogQWx0aG91Z2ggdGhlIEVuYWJsZS9EaXNhYmxlIGFuZCBDb25uZWN0L0Rpc2Nvbm5lY3QgYXJlIGFudG9ueW1zLCB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGVpciBzZXF1ZW5jaW5nLAorKiBpbiBvdGhlciB3b3JkcywgdGhleSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGFyYml0cmFyeSBzZXF1ZW5jZSB3aXRob3V0IGJlaW5nIHBhaXJlZCBvciBiYWxhbmNlZC4KKyogRWFjaCB0aW1lIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgY2FsbGVkLCB0aGUgZWZmZWN0cyBvZiB0aGUgcHJlY2VkaW5nIGNhbGxzIGNlYXNlLgorKgorKiBBc3NlcnQgZmFpbHMgaWYKKyogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZC4KKyogLSBBIGNvbW1hbmQgb3RoZXIgdGhhbiBDb250aW51ZSwgRW5hYmxlLCBEaXNhYmxlLCBDb25uZWN0IG9yIERpc2Nvbm5lY3QgaXMgZ2l2ZW4uCisqIC0gQW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiB0aGUgc3ViZmllbGRzIGlzIGdpdmVuIG9yIGEgYml0IG91dHNpZGUgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbi4KKyogLSBhbnkgcmV0dXJuIGNvZGUgYmVzaWRlcyBIQ0ZfU1VDQ0VTUy4KKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGEgaGNmX2Z1bmN0aW9uIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCisqCW11bHRpLXRocmVhZGluZworKgorKi5ESUFHUkFNCisqCWhjZl9jbnRsIHRha2VzIHN1Y2Nlc3NpdmVseSB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisqMjoJSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlIFByaW1hcnkgb3IgU3RhdGlvbiBTdXBwbGllciBpbiB0aGUgSGVybWVzLAorKgloY2ZfY250bCgpIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBIQ0ZfRVJSX05PX05JQzs/IGFzIHN0YXR1cy4KKyo4Ogl3aGVuIHRoZSBwb3J0IGlzIGRpc2FibGVkLCB0aGUgRE1BIGVuZ2luZSBuZWVkcyB0byBiZSBkZS1hY3RpdmF0ZWQsIHNvIHRoZSBob3N0IGNhbiBzYWZlbHkgcmVjbGFpbSB0eAorKglwYWNrZXRzIGZyb20gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4uCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2ZfY250bCggSUZCUCBpZmJwLCBoY2ZfMTYgY21kICkKK3sKK2ludAlyYyA9IEhDRl9FUlJfSU5DT01QX0ZXOworI2lmIEhDRl9BU1NFUlQKK3sJaW50IHggPSBjbWQgJiBIQ01EX0NNRF9DT0RFOworCWlmICggeCA9PSBIQ0ZfQ05UTF9DT05USU5VRSApIHggJj0gfkhDTURfUkVUUlk7CisJZWxzZSBpZiAoICh4ID09IEhDTURfRElTQUJMRSB8fCB4ID09IEhDTURfRU5BQkxFKSAmJiBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgKSB7CisJCXggJj0gfkhGU19UWF9DTlRMX1BPUlQ7CisJfQorCUhDRkFTU0VSVCggeD09SENGX0NOVExfRU5BQkxFICB8fCB4PT1IQ0ZfQ05UTF9ESVNBQkxFICAgIHx8IEhDRl9DTlRMX0NPTlRJTlVFIHx8CisJCQkgICB4PT1IQ0ZfQ05UTF9DT05ORUNUIHx8IHg9PUhDRl9DTlRMX0RJU0NPTk5FQ1QsIGNtZCApCit9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworLy8gCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGNtZCApCisvLyAjZW5kaWYgLy8gSENGX0REUworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ05UTCwgY21kICkKKwlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICkgewkJCQkJCQkJCQkJCQkJCQkgLyoyKi8KKy8qNiovCXJjID0gY21kX2V4ZSggaWZicCwgY21kLCAwICk7CisjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisJCWlmYnAtPklGQl9UaWNrQ250ID0gMDsJCQkJLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCisjZW5kaWYgLy8gSENGX0REUworCX0KKyNpZiBIQ0ZfRE1BCisJLy8hcmxhdiA6IG5vdGUgdGhhdCB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkLCByZWdhcmRsZXNzIG9mIHRoZSBERUZVTkNUIGJpdCBpbiBJRkJfQ2FyZFN0YXQuCisJLy8gVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZSBNU0Ygc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBpdHMgRE1BIHJlc291cmNlcyBiYWNrIGZyb20gdGhlIEhDRiwKKwkvLyBldmVuIGlmIHRoZSBoYXJkd2FyZSBpcyBkaXNmdW5jdGlvbmFsLiBQcmFjdGljYWwgZXhhbXBsZSB1bmRlciBXaW5kb3dzIDogc3VycHJpc2UgcmVtb3ZhbC4KKwlpZiAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApIHsKKwkJaGNmX2lvIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlOworCQlERVNDX1NUUkNUICpwOworCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9ESVNBQkxFIHx8IGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7CisJCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX1JFU0VUKTsJCQkJCQkvKjgqLworCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gfkRNQV9FTkFCTEVEOworCQl9CisJCWlmICggY21kID09IEhDRl9DTlRMX0VOQUJMRSApIHsKKwkJCU9VVF9QT1JUX0RXT1JEKCAoaW9fcG9ydCArIEhSRUdfRE1BX0NUUkwpLCBETUFfQ1RSTFNUQVRfR08pOworCQkJLyogOz8gYnkgcmV3cml0aW5nIGhjZl9kbWFfcnhfcHV0IHlvdSBjYW4gcHJvYmFibHkganVzdCBjYWxsIGhjZl9kbWFfcnhfcHV0KCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKQorCQkJICogYXMgYWRkaXRpb25hbCBiZW5lZmljaWFyeSBzaWRlIGVmZmVjdCwgdGhlIFNPUCBhbmQgRU9QIGJpdHMgd2lsbCBhbHNvIGJlIGNsZWFyZWQKKwkJCSAqLworCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gRE1BX0VOQUJMRUQ7CisJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKKwkJCS8vIG1ha2UgdGhlIGVudGlyZSByeCBkZXNjcmlwdG9yIGNoYWluIERNQS1vd25lZCwgc28gdGhlIERNQSBlbmdpbmUgY2FuIChyZS0pdXNlIGl0LgorCQkJaWYgKCAoIHAgPSBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSAhPSBOVUxMICkgeyAgIC8vOz8gVGhpbmsgdGhpcyBvdmVyIGFnYWluIGluIHRoZSBsaWdodCBvZiB0aGUgbmV3IGNoYWluaW5nIHN0cmF0ZWd5CisJCQkJaWYgKCAxICkgCXsgLy9iZWdpbiBhbHRlcm5hdGl2ZQorCQkJCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKKwkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLCBETUFfUlggKTsKKwkJCQkJaWYgKCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSB7CisJCQkJCQlwdXRfZnJhbWVfbHN0KCBpZmJwLCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0tPm5leHRfZGVzY19hZGRyLCBETUFfUlggKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlICggcCApIHsKKwkJCQkJCS8vcC0+YnVmX2NudGwuY250bF9zdGF0IHw9IERFU0NfRE1BX09XTkVEOworCQkJCQkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKKwkJCQkJCXAgPSBwLT5uZXh0X2Rlc2NfYWRkcjsKKwkJCQkJfQorCQkJCQkvLyBhIHJ4IGNoYWluIGlzIGF2YWlsYWJsZSBzbyBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKKwkJCQkJcCA9IGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXTsKKwkJCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19SWERNQV9QVFIzMiksIHAtPmRlc2NfcGh5c19hZGRyKTsKKwkJCQl9ICAvL2VuZCBhbHRlcm5hdGl2ZQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8vIEhDRl9ETUEKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0NOVEwgKQorCXJldHVybiByYzsKK30gLy8gaGNmX2NudGwKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9jb25uZWN0KCBJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICkKKyouUFVSUE9TRQkJR3JhbnRzIGFjY2VzcyByaWdodCBmb3IgdGhlIEhDRiB0byB0aGUgSUZCLgorKgkJCQlJbml0aWFsaXplcyBDYXJkIGFuZCBIQ0YgaG91c2VrZWVwaW5nLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJKG5lYXIpIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglpb19iYXNlCQlub24tVVNCOiBJL08gQmFzZSBhZGRyZXNzIG9mIHRoZSBOSUMgKGNvbm5lY3QpCisqCQkJCW5vbi1VU0I6IEhDRl9ESVNDT05ORUNUCisqCQkJCVVTQjoJIEhDRl9DT05ORUNULCBIQ0ZfRElTQ09OTkVDVAorKgorKi5SRVRVUk5TCisqCUhDRl9TVUNDRVNTCisqCUhDRl9FUlJfSU5DT01QX1BSSQorKglIQ0ZfRVJSX0lOQ09NUF9GVworKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQorKiEhCUhDRl9FUlJfTk9fTklDIHJlYWxseSByZXR1cm5lZCA7PworKglIQ0ZfRVJSX05PX05JQworKglIQ0ZfRVJSX1RJTUVfT1VUCisqCisqCU1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2s6CisqCUlGQl9JT0Jhc2UJCQkJZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKKyoJSUZCX0lPUmFuZ2UJCQkJSFJFR19JT19SQU5HRSAoMHg0MC8weDgwKQorKglJRkJfVmVyc2lvbgkJCQl2ZXJzaW9uIG9mIHRoZSBJRkIgbGF5b3V0CisqCUlGQl9GV0lkZW50aXR5CQkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIGlkZW50aXR5IG9mIHRoZQorKgkJCQkJCQkicnVubmluZyIgRi9XLCBpLmUuIHRlcnRpYXJ5IEYvVyB1bmRlciBub3JtYWwgY29uZGl0aW9ucworKglJRkJfRldTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZgorKgkJCQkJCQl0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyoJSUZCX0hTSVN1cAkJCQlDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIEhXL1NXIEkvRiByYW5nZSBvZiB0aGUgTklDCisqCUlGQl9QUklJZGVudGl0eQkJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSWRlbnRpdHkgb2YgdGhlIFByaW1hcnkgRi9XCisqCUlGQl9QUklTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZiB0aGUgUHJpbWFyeSBGL1cKKyoJYWxsIG90aGVyCQkJCWFsbCBNU0YgYWNjZXNzaWJsZSBmaWVsZHMsIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWVkIGFib3ZlLCBhcmUgemVyby1maWxsZWQKKyoKKyouQ09ORElUSU9OUworKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBhc3N1cmUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBJL08gQmFzZSBhZGRyZXNzLgorKgorKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKyogd2FzIGNhbGxlZC4KKyoKKyouREVTQ1JJUFRJT04KKyogaGNmX2Nvbm5lY3QgcGFzc2VzIHRoZSBNU0YtZGVmaW5lZCBsb2NhdGlvbiBvZiB0aGUgSUZCIHRvIHRoZSBIQ0YgYW5kIGdyYW50cyBvciByZXZva2VzIGFjY2VzcyByaWdodCBmb3IgdGhlCisqIEhDRiB0byB0aGUgSUZCLiBSZXZva2luZyBpcyBkb25lIGJ5IHNwZWNpZnlpbmcgSENGX0RJU0NPTk5FQ1QgcmF0aGVyIHRoYW4gYW4gSS9PIGFkZHJlc3MgZm9yIHRoZSBwYXJhbWV0ZXIKKyogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKKyogaW4gImRpc2Nvbm5lY3QiIG1vZGUuIENsYWxsaW5nIGhjZl9jb25uZWN0IGluICJjb25uZWN0Ii8iZGlzY29ubmVjdCIgbW9kZSBjYW4gbm90IGJlIG5lc3RlZC4KKyogVGhlIElGQiBhZGRyZXNzIG11c3QgYmUgdXNlZCBhcyBhIGhhbmRsZSB3aXRoIGFsbCBzdWJzZXF1ZW50IEhDRi1mdW5jdGlvbiBjYWxscyBhbmQgdGhlIEhDRiB1c2VzIHRoZSBJRkIKKyogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCisqCisqIE5vdGUgdGhhdCBub3Qgb25seSB0aGUgTVNGIGFjY2Vzc2libGUgZmllbGRzIGFyZSBjbGVhcmVkLCBidXQgYWxzbyBhbGwgaW50ZXJuYWwgaG91c2VrZWVwaW5nCisqIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgorKiBUaGlzIGltcGxpZXMgdGhhdCBhbGwgc2V0dGluZ3Mgd2hpY2ggYXJlIGRvbmUgdmlhIGhjZl9hY3Rpb24gYW5kIGhjZl9wdXRfaW5mbyAoZS5nLiBDRkdfTUJfQVNTRVJULCBDRkdfUkVHX01CLAorKiBDRkdfUkVHX0lORk9fTE9HKSBtdXN0IGJlIGRvbmUgYWdhaW4uIFRoZSBvbmx5IGZpZWxkIHdoaWNoIGlzIG5vdCBjbGVhcmVkLCBpcyBJRkJfTVNGU3VwLgorKgorKiBJZiBIQ0ZfSU5UX09OIGlzIHNlbGVjdGVkIGFzIGNvbXBpbGUgb3B0aW9uLCBOSUMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaXMgbm90IHByb3Blcmx5IGFsaWduZWQgKCByZWYgY2hhcHRlciBIQ0ZfQUxJR04gaW4gNC4xLjEpCisqIC0gSS9PIEJhc2UgQWRkcmVzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAweDQwIChub3RlOiAweDAwMDAgaXMgZXhwbGljaXRseSBhbGxvd2VkKS4KKyoKKyouRElBR1JBTQorKgorKjA6CVRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcworKglzb21lIGF0dGVudGlvbiBhYm91dCB3aGF0IHRvIHVzZSBhcyAiSS9PIiBhZGRyZXNzIHdoZW4gZm9yIHdoaWNoIHB1cnBvc2UuCisqMjoKKyoyYTogUmVzZXQgSC1JSSBieSB0b2dnbGluZyByZXNldCBiaXQgaW4gSU8tcmVnaXN0ZXIgb24gYW5kIG9mZi4KKyoJVGhlIEhDRl9UWVBFX1BSRUxPQURFRCBjYXRlcnMgZm9yIHRoZSBET1MgZW52aXJvbm1lbnQgd2hlcmUgSC1JSSBpcyBsb2FkZWQgYnkgYSBzZXBhcmF0ZSBwcm9ncmFtIHRvCisqCW92ZXJjb21lIHRoZSA2NGsgc2l6ZSBsaW1pdCBwb3NlZCBvbiBET1MgZHJpdmVycy4KKyoJVGhlIG1hY3JvIE9QVyBpcyBub3QgeWV0IHVzZWFibGUgYmVjYXVzZSB0aGUgSUZCX0lPQmFzZSBmaWVsZCBpcyBub3Qgc2V0LgorKglOb3RlIDE6IGhvcGVmdWxseSB0aGUgY2xlYXJpbmcgYW5kIGluaXRpYWxpemluZyBvZiB0aGUgSUZCIChzZWUgYmVsb3cpIGFjdHMgYXMgYSBkZWxheSB3aGljaCBtZWV0cyB0aGUKKyoJc3BlY2lmaWNhdGlvbiBmb3IgUy9XIHJlc2V0CisqCU5vdGUgMjogaXQgdHVybnMgb3V0IHRoYXQgb24gc29tZSBIL1cgY29uc3RlbGxhdGlvbnMsIHRoZSBjbG9jayB0byBhY2Nlc3MgdGhlIEVFUHJvbSBpcyBub3QgbG93ZXJlZAorKgl0byBhbiBhcHByb3ByaWF0ZSBmcmVxdWVuY3kgYnkgSFJFR19JT19TUkVTRVQuIEJ5IGdpdmluZyBhbiBIQ01EX0lOSSBmaXJzdCwgdGhpcyBwcm9ibGVtIGlzIHdvcmtlZCBhcm91bmQuCisqMmI6IEV4cGVyaW1lbnRhbGx5IGl0IGlzIGRldGVybWluZWQgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgRi9XIHZlcnNpb25zIHRoYXQgd2FpdGluZyBmb3IgdGhlIGZvciBDbWQgYml0IGluCisqCUV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCisqNDoJY2xlYXIgYW5kIGluaXRpYWxpemUgdGhlIElGQgorKglUaGUgSENGIGhvdXNlIGtlZXBpbmcgaW5mbyBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgemVybyBpcyB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCB2YWx1ZSBmb3IgYXMgbXVjaCBhcworKglmZWFzaWJsZSBJRkItaXRlbXMuCisqCVRoZSByZWFkYWJsZSBmaWVsZHMgbWVudGlvbmVkIGluIHRoZSBkZXNjcmlwdGlvbiBzZWN0aW9uIGFuZCBzb21lIEhDRiBzcGVjaWZpYyBmaWVsZHMgYXJlIGdpdmVuIHRoZWlyCisqCWFjdHVhbCB2YWx1ZS4KKyoJSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgYmVzdCBndWVzcyBiZWZvcmUgY2FsaWJyYXRpb24KKyoJSGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gIm5vIGludGVycnVwdCBnZW5lcmF0aW9uIiAoaW1wbGljaXRseSBhY2hpZXZlZCBieSB0aGUgemVyby1maWxsaW5nKS4KKyo2OglSZWdpc3RlciBjb21waWxlLXRpbWUgbGlua2VkIE1TRiBSb3V0aW5lIGFuZCBzZXQgZGVmYXVsdCBmaWx0ZXIgbGV2ZWwKKyoJY2FzdCBuZWVkZWQgdG8gZ2V0IGFyb3VuZCB0aGUgIm5lYXIiIHByb2JsZW0gaW4gRE9TIENPTSBtb2RlbAorKgllciBDMjQ0Njogbm8gY29udmVyc2lvbiBmcm9tIHZvaWQgKF9fbmVhciBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQorKgkJCQkJCQl0byAgIHZvaWQgKF9fZmFyICBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQorKjg6CUlmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKKyoJYmxvY2tlZCBjbWQgcGlwZSBsaW5lLiAgVG8gdW5ibG9jayB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIGRvbmU6CisqCSAtIEFjayBldmVyeXRoaW5nCisqCSAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgorKgkgLSBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKKyoJVGhlIHR3byB3YWl0cyBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUgSENGX1dBSVRfV0hJTEUgdG8gb3B0aW1pemUgbWVtb3J5IHNpemUuIElmIGVpdGhlciBvZiB0aGVzZSB3YWl0cworKglmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCisqCW5leHQgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgdGhlIEhDRiB0byBnbyBpbnRvIERFRlVOQ1QgbW9kZQorKjEwOglBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5IGJsb2NrZWQpIGNtZCBwaXBlIGxpbmUKKyoJTm90ZSAxOiBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kIHZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgKFNlbmQpIENtZCBldmVudCBpcworKglwZW5kaW5nIG9uIG5vbi1pbml0aWFsIGNhbGxzCisqCU5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KKyoJSGVybWVzIEluaXRpYWxpemUKKyoxMjoJT25seSBILUlJIE5FRURTIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kLiBEdWUgdG8gdGhlIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIEgtSSBhbmQgSC1JSQorKglJbml0aWFsaXplIGNvbW1hbmQsIGluaXQoKSBkb2VzIG5vdCAoYW5kIGNhbiBub3QsIHNpbmNlIGl0IGlzIGNhbGxlZCBlLmcuIGFmdGVyIGEgZG93bmxvYWQpIGV4ZWN1dGUgdGhlCisqCUhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIEV4ZWN1dGluZyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZCBmb3IgSC1JIHdvdWxkIG5vdCBoYXJtIGJ1dCBub3QgZG8KKyoJYW55dGhpbmcgdXNlZnVsIGVpdGhlciwgc28gaXQgaXMgc2tpcHBlZC4KKyoJVGhlIHJldHVybiBzdGF0dXMgb2YgY21kX2V4ZSBpcyBpZ25vcmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgY21kX2V4ZSBmYWlscywgaW5pdCBmYWlscyB0b28KKyoxNDoJdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQorKgl0aGUgY2FsbCB0byBpbml0IGFuZCBpdHMgc3Vic2VxdWVudCBjYWxsIG9mIGNtZF9leGUgd2lsbCByZXR1cm4gSENGX0VSUl9OT19OSUMgaWYgYXBwcm9wcmlhdGUuIFRoaXMgc3RhdHVzCisqCWlzIChiYWRseSkgbmVlZGVkIGJ5IHNvbWUgbGVnYWN5IGNvbWJpbmF0aW9uIG9mIE5UNCBhbmQgY2FyZCBzZXJ2aWNlcyB3aGljaCBkbyBub3QgeWllbGQgYW4gSS9PIGFkZHJlc3MgaW4KKyoJdGltZS4KKyoKKyouTk9USUNFCisqCU9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgTlVMTC1wb2ludGVyIGlzIG5vdCBhIGJpdC1wYXR0ZXJuIG9mIGFsbCB6ZXJvcywgdGhlIHplcm8tZmlsbGluZyBvZiB0aGUgSUZCIHJlc3VsdHMKKyoJaW4gYW4gaW5jb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHBvaW50ZXJzLgorKglUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1haWxCb3ggbWFuaXB1bGF0aW9uIGluIHB1dF9tYl9pbmZvIHByb3RlY3RzIGFnYWluc3QgdGhlIGFic2VuY2Ugb2YgYSBNYWlsQm94CisqCWJhc2VkIG9uIElGQl9NQlNpemUsIElGQl9NQldwIGFuZCBpZmJwLT5JRkJfTUJScC4gVGhpcyBoYXMgcmFtaWZpY2F0aW9ucyBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisqCU1haWxCb3ggdmlhIGhjZl9wdXRfaW5mbyB3aXRoIHRoZSBDRkdfUkVHX01CIHR5cGUsIGJ1dCBpdCBwcmV2ZW50cyBkZXBlbmRlbmN5IG9uIHRoZSAiTlVMTC0ibmVzcyBvZgorKglJRkJfTUJwLgorKgorKi5OT1RJQ0UKKyoJVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoZW4gYXNzZXJ0aW5nIGFuZCBsb2dnaW5nIGhjZl9jb25uZWN0LCBlLmcuCisqCSAtIEFzc2VydGluZyBvbiByZS1lbnRyYW5jeSBvZiBoY2ZfY29ubmVjdCBieSBtZWFucyBvZgorKgkgIkhDRkFTU0VSVCggKGlmYnAtPklGQl9Bc3NlcnRUcmFjZSAmIEhDRl9BU1NFUlRfQ09OTkVDVCkgPT0gMCwgMCApIiBpcyBub3QgdXNlZnVsIGJlY2F1c2UgSUZCIGNvbnRlbnRzCisqCSBhcmUgdW5kZWZpbmVkCisqCSAtIEFzc2VydGluZyBiZWZvcmUgdGhlIElGQiBpcyBjbGVhcmVkIHdpbGwgY2F1c2UgbWRkX2Fzc2VydCgpIHRvIGludGVycHJldCB0aGUgZ2FyYmFnZSBpbiBJRkJfQXNzZXJ0UnRuCisqCSBhcyBhIHJvdXRpbmUgYWRkcmVzcworKglUaGVyZWZvcmUgSENGVFJBQ0Ugbm9yIEhDRkxPR0VOVFJZIGlzIGNhbGxlZCBieSBoY2ZfY29ubmVjdC4KKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2hjZl9jb25uZWN0KCBJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICkKK3sKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfaW8JCWlvX2FkZHI7CitoY2ZfMzIJCXByb3RfY250OworaGNmXzgJCSpxOworTFRWX1NUUkNUCXg7CisjaWYgSENGX0FTU0VSVAorCWhjZl8xNiB4YSA9IGlmYnAtPklGQl9GV0lkZW50aXR5LnR5cDsKKwkvKiBpcyBhc3N1bWVkIHRvIGNhdXNlIGFuIGFzc2VydCBsYXRlciBvbiBpZiBoY2ZfY29ubmVjdCBpcyBjYWxsZWQgd2l0aG91dCBpbnRlcnZlbmluZyBoY2ZfZGlzY29ubmVjdC4KKwkgKiB4YSA9PSBDRkdfRldfSURFTlRJVFkgaW4gc3Vic2VxdWVudCBjYWxscyB3aXRob3V0IHByZWNlZGluZyBoY2ZfZGlzY29ubmVjdCwKKwkgKiB4YSA9PSAwIGluIHN1YnNlcXVlbnQgY2FsbHMgd2l0aCBwcmVjZWRpbmcgaGNmX2Rpc2Nvbm5lY3QsCisJICogeGEgPT0gImdhcmJhZ2UiIChhbnkgdmFsdWUgZXhjZXB0IENGR19GV19JREVOVElUWSBpcyBhY2NlcHRhYmxlKSBpbiB0aGUgaW5pdGlhbCBjYWxsCisJICovCisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisJaWYgKCBpb19iYXNlID09IEhDRl9ESVNDT05ORUNUICkgewkJCQkJLy9kaXNjb25uZWN0CisJCWlvX2FkZHIgPSBpZmJwLT5JRkJfSU9CYXNlOworCQlPUFcoIEhSRUdfSU5UX0VOLCAwICk7CQkvLzs/d29ya2Fyb3VuZCBhZ2FpbnN0IGR5aW5nIEYvVyBvbiBzdWJzZXF1ZW50IGhjZl9jb25uZWN0IGNhbGxzCisJfSBlbHNlIHsJCQkJCQkJCQkJCS8vY29ubmVjdAkJCQkJCQkJLyogMCAqLworCQlpb19hZGRyID0gaW9fYmFzZTsKKwl9CisKKyNpZiAwIC8vOz8gaWYgYSBzdWJzZXF1ZW50IGhjZl9jb25uZWN0IGlzIHByZWNlZWRlZCBieSBhbiBoY2ZfZGlzY29ubmVjdCB0aGUgd2FrZXVwIGlzIG5vdCBuZWVkZWQgISEKKyNpZiBIQ0ZfU0xFRVAKKyAgICBPVVRfUE9SVF9XT1JEKCAuLi4uLitIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOyAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQorCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgorCW5vdGUgdGhhdCBNU0ZfV0FJVCB1c2VzIG5vdCB5ZXQgZGVmaW5lZCEhISEgSUZCX0lPQmFzZSBhbmQgSUZCX1RpY2tJbmkgKHZpYSBQUk9UX0NOVF9JTkkpCisJc28gYmUgY2FyZWZ1bGwgaWYgdGhpcyBjb2RlIGlzIHJlc3RvcmVkCisjZW5kaWYgLy8gSENGX1NMRUVQCisjZW5kaWYgLy8gMAorCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkvL3N3aXRjaCBjbG9jayBiYWNrIGZvciBTRUVQUk9NIGFjY2VzcyAgISEhCisJT1VUX1BPUlRfV09SRCggaW9fYWRkciArIEhSRUdfQ01ELCBIQ01EX0lOSSApOyAgCSAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKKwlwcm90X2NudCA9IElOSV9USUNLX0lOSTsKKwlIQ0ZfV0FJVF9XSElMRSggKElOX1BPUlRfV09SRCggaW9fYWRkciArICBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKKwlPVVRfUE9SVF9XT1JEKCAoaW9fYWRkciArIEhSRUdfSU8pLCBIUkVHX0lPX1NSRVNFVCApOwkvL09QVyBub3QgeWV0IHVzZWFibGUJCQkJCS8qIDJhKi8KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwlmb3IgKCBxID0gKGhjZl84KikoJmlmYnAtPklGQl9NYWdpYyk7IHEgPiAoaGNmXzgqKWlmYnA7ICotLXEgPSAwICkgLypOT1AqLzsJCQkJCQkvKiA0ICovCisJaWZicC0+SUZCX01hZ2ljCQk9IEhDRl9NQUdJQzsKKwlpZmJwLT5JRkJfVmVyc2lvbgk9IElGQl9WRVJTSU9OOworI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRCAvL2EgbmV3IElGQiBkZW1vbnN0cmF0ZXMgaG93IGRpcnR5IHRoZSBzb2x1dGlvbiBpcworCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUXSA9IE5VTEw7CQkvL0lGQl9QUklJZGVudGl0eSBwbGFjZWhvbGRlcgkweEZEMDIKKwl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVCsxXSA9IE5VTEw7CS8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlcgkJMHhGRDAzCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisJaWZicC0+SUZCX1RhbGx5TGVuID0gMSArIDIgKiAoSENGX05JQ19UQUxfQ05UICsgSENGX0hDRl9UQUxfQ05UKTsJLy9jb252ZXJ0ICMgb2YgVGFsbGllcyB0byBMIHZhbHVlIGZvciBMVFYKKwlpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsJCQkvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKwlpZmJwLT5JRkJfSU9CYXNlCT0gaW9fYWRkcjsJCQkJLy9zZXQgSU9fQmFzZSBhc2FwLCBzbyBhc3NlcnRzIHZpYSBIUkVHX1NXXzIgZG9uJ3QgaGFybQorCWlmYnAtPklGQl9JT1JhbmdlCT0gSFJFR19JT19SQU5HRTsKKwlpZmJwLT5JRkJfQ250bE9wdAk9IFVTRV8xNkJJVDsKKyNpZiBIQ0ZfQVNTRVJUCisJYXNzZXJ0X2lmYnAgPSBpZmJwOworCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAxOworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKwlpZiAoIGlvX2Jhc2UgIT0gSENGX0RJU0NPTk5FQ1QgKSB7CisJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSAoTVNGX0FTU0VSVF9SVE5QKW1zZl9hc3NlcnQ7CQkJCQkJCQkJCQkvKiA2ICovCisJfQorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CCQkJCS8vYnVpbGQgdGhlIHN0cnVjdHVyZSB0byBwYXNzIHRoZSBhc3NlcnQgaW5mbyB0byBoY2ZfcHV0X2luZm8KKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QubGVuID0gc2l6ZW9mKGlmYnAtPklGQl9Bc3NlcnRTdHJjdCkvc2l6ZW9mKGhjZl8xNikgLSAxOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC50eXAgPSBDRkdfTUJfSU5GTzsKKwlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuYmFzZV90eXAgPSBDRkdfTUJfQVNTRVJUOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2NudCA9IDE7CisJaWZicC0+SUZCX0Fzc2VydFN0cmN0LmZyYWdfYnVmWzBdLmZyYWdfbGVuID0KKwkJKCBvZmZzZXRvZihJRkJfU1RSQ1QsIElGQl9Bc3NlcnRMdmwpIC0gb2Zmc2V0b2YoSUZCX1NUUkNULCBJRkJfQXNzZXJ0TGluZSkgKSAvIHNpemVvZihoY2ZfMTYpOworCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAmaWZicC0+SUZCX0Fzc2VydExpbmU7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9NQgorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKwlJRl9QUk9UX1RJTUUoIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkk7ICkKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCisJLy8hISBObyBhc3NlcnRzIGJlZm9yZSBSZXNldC1iaXQgaW4gSFJFR19JTyBpcyBjbGVhcmVkCisJT1BXKCBIUkVHX0lPLCAweDAwMDAgKTsJCQkJCQkvL09QVyB1c2VhYmxlCQkJCQkJCQkJCS8qIDJiKi8KKwlIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQ01EKSA9PSAwICk7CisJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCkgKSApCisJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ICkgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaTsgKQorI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAorCS8vISEgTm8gYXNzZXJ0cyBiZWZvcmUgUmVzZXQtYml0IGluIEhSRUdfSU8gaXMgY2xlYXJlZAorCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjAgKQkpIC8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKKwlIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApCQkvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCisJSENGQVNTRVJUKCAoKGhjZl8zMikodm9pZCopaWZicCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKSh2b2lkKilpZmJwICkKKwlIQ0ZBU1NFUlQoIChpb19hZGRyICYgMHgwMDNGKSA9PSAwLCBpb19hZGRyICkKKwkJCQkJCQkJCQkJCS8vaWYgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyCisJaWYgKElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApIHsJCQkJCQkJCQkJCQkJCQkJLyogOCAqLworCQkJCQkJCQkJCQkJLy8uICBBY2sgYWxsIHRvIHVuYmxvY2sgYSAocG9zc2libHkpIGJsb2NrZWQgY21kIHBpcGUgbGluZQorCQlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKKwkJCQkJCQkJCQkJCS8vLiAgV2FpdCBmb3IgQnVzeSBiaXQgZHJvcCAgaW4gQ21kIHJlZ2lzdGVyCisJCQkJCQkJCQkJCQkvLy4gIFdhaXQgZm9yIENtZCAgYml0IHJhaXNlIGluIEV2ICByZWdpc3RlcgorCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfQ01EICkgJiBIQ01EX0JVU1kgKSAmJiAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsKKwkJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCkgKSApIC8qIGlmIHByb3RfY250ID09IDAsIGNtZF9leGUgd2lsbCBmYWlsLCBjYXVzaW5nIERFRlVOQ1QgKi8KKwl9CisJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7CisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkJCQkJCQkJCQkJCQkJLyoxMiovCisJKHZvaWQpY21kX2V4ZSggaWZicCwgSENNRF9JTkksIDAgKTsKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKK2lmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKKwkJcmMgPSBpbml0KCBpZmJwICk7CQkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLworCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQkJeC5sZW4gPSAyOworCQkJeC50eXAgPSBDRkdfTklDX0JVU19UWVBFOworCQkJKHZvaWQpaGNmX2dldF9pbmZvKCBpZmJwLCAmeCApOworCQkJaWZicC0+SUZCX0J1c1R5cGUgPSB4LnZhbFswXTsKKwkJCS8vQ0ZHX05JQ19CVVNfVFlQRSBub3Qgc3VwcG9ydGVkIC0+IGRlZmF1bHQgMzIgYml0cy9ETUEsIE1TRiBoYXMgdG8gb3ZlcnJ1bGUgdmlhIENGR19DTlRMX09QVAorCQkJaWYgKCB4LmxlbiA9PSAwIHx8IHgudmFsWzBdID09IDB4MDAwMiB8fCB4LnZhbFswXSA9PSAweDAwMDMgKSB7CisjaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCisJCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV8xNkJJVDsJCQkvL3Jlc2V0IFVTRV8xNkJJVAorI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKKyNpZiBIQ0ZfRE1BCisJCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gVVNFX0RNQTsJCQkJLy9TRVQgRE1BCisjZWxzZQorCQkJCWlmYnAtPklGQl9JT1JhbmdlID0gMHg0MCAvKmkucy5vLiBIUkVHX0lPX1JBTkdFKi87CisjZW5kaWYgLy8gSENGX0RNQQorCQkJfQorCQl9CisJfSBlbHNlIEhDRkFTU0VSVCggICggaWZicC0+SUZCX01hZ2ljIF49IEhDRl9NQUdJQyApID09IDAsIGlmYnAtPklGQl9NYWdpYyApIC8qTk9QKi87CisJLyogb2YgYWJvdmUgSENGQVNTRVJUIG9ubHkgdGhlIHNpZGUgZWZmZWN0IGlzIG5lZWRlZCwgTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15ICovCisJaWZicC0+SUZCX0lPQmFzZSA9IGlvX2Jhc2U7CQkJCQkJCQkJCQkJCQkJCQkJLyogMCovCisJcmV0dXJuIHJjOworfSAvLyBoY2ZfY29ubmVjdAorCisjaWYgSENGX0RNQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGdW5jdGlvbiBnZXRfZnJhbWVfbHN0CisqICAtIHJlc29sdmUgdGhlICJsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciIgcHJvYmxlbXMgd2hlbiBhIGRlc2NyaXB0b3IgbGlzdCBpcyByZWNsYWltZWQgYnkgdGhlIE1TRi4KKyoKKyogVGhlIEZyYW1lTGlzdCB0byBiZSByZWNsYWltZWQgYXMgd2VsbCBhcyB0aGUgRGVzY3JpcHRvckxpc3QgYWx3YXlzIHN0YXJ0IGluIElGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10KKyogYW5kIHRoaXMgaXMgYWx3YXlzIHRoZSAiY3VycmVudCIgREVMV0EgRGVzY3JpcHRvci4KKyoKKyogSWYgYSBGcmFtZUxpc3QgaXMgYXZhaWxhYmxlLCB0aGUgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QgdG8gdHVybmVkIGludG8gYSBuZXcgREVMV0EgRGVzY3JpcHRvcjoKKyogIC0gYSBjb3B5IGlzIG1hZGUgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0IGludG8gdGhlIGN1cnJlbnQKKyoJIERFTFdBIERlc2NyaXB0b3IKKyogIC0gdGhlIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgaXMgZGV0YWNoZWQgZnJvbSB0aGUgY29weSBieSBzZXR0aW5nIHRoZSBuZXh0X2Rlc2NfYWRkciBhdCBOVUxMCisqICAtIHRoZSBETUEgY29udHJvbCBiaXRzIG9mIHRoZSBjb3B5IGFyZSBjbGVhcmVkIHRvIGRvIG5vdCBjb25mdXNlIHRoZSBNU0YKKyogIC0gdGhlIGNvcHkgb2YgdGhlIGxhc3QgZGVzY3JpcHRvciAoaS5lLiB0aGUgIm9sZCIgREVMV0EgRGVzY3JpcHRvcikgaXMgY2hhaW5lZCB0byB0aGUgcHJldiBEZXNjcmlwdG9yCisqCSBvZiB0aGUgRnJhbWVMaXN0LCB0aHVzIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgbGFzdCBEZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QuCisqICAtIElGQl9GaXJzdERlc2MgaXMgY2hhbmdlZCB0byB0aGUgYWRkcmVzcyBvZiB0aGF0IHJlcGxhY2VkIChvcmlnaW5hbCkgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QsCisqCSBpLmUuIHRoZSAibmV3IiBERUxXQSBEZXNjcmlwdG9yLgorKgorKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgY29weSBvZiB0aGF0IGxhc3QgaG9zdC1vd25lZCBkZXNjcmlwdG9yLCBzbyB0aGUgTVNGIHdpbGwgZ2V0IGEgY29weSBvZiB0aGUgZGVzY3JpcHRvci4KKyogT24gdG9wIG9mIHRoYXQsIGl0IGFkanVzdHMgRE1BIHJlbGF0ZWQgZmllbGRzIGluIHRoZSBJRkIgc3RydWN0dXJlLgorCS8vIHBlcmZvcm0gYSBjb3B5aW5nLXNjaGVtZSB0byBjaXJjdW12ZW50IHRoZSAnbGFzdCBob3N0IG93bmVkIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJlY2xhaW1lZCcgbGltaXRhdGlvbiBpbXBvc2VkIGJ5IEgyLjUncyBETUEgaGFyZHdhcmUgZGVzaWduCisJLy8gYSAncmVjbGFpbSBkZXNjcmlwdG9yJyBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBIQ0Y6CisqCisqIFJldHVybnM6IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdAorKgorIDg6IEJlIGNhcmVmdWwgb25jZSB5b3Ugc3RhcnQgcmUtb3JkZXJpbmcgdGhlIHN0ZXBzIGluIHRoZSBjb3B5IHByb2Nlc3MsIHRoYXQgaXQgc3RpbGwgd29ya3MgZm9yIGNhc2VzCisqIAlvZiBGcmFtZUxpc3RzIG9mIDEsIDIgYW5kIG1vcmUgdGhhbiAyIGRlc2NyaXB0b3JzCisqCisqIElucHV0IHBhcmFtZXRlcnM6CisqIHR4X3J4X2ZsYWcgICAgICA6IHNwZWNpZmllcyAndHJhbnNtaXQnIG9yICdyZWNlaXZlJyBkZXNjcmlwdG9yLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBERVNDX1NUUkNUKgorZ2V0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyApCit7CisKK0RFU0NfU1RSQ1QgKmhlYWQgPSBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddOworREVTQ19TVFJDVCAqY29weSwgKnAsICpwcmV2OworCisJSENGQVNTRVJUKCB0eF9yeF9mbGFnID09IERNQV9SWCB8fCB0eF9yeF9mbGFnID09IERNQV9UWCwgdHhfcnhfZmxhZyApCisJCQkJCQkJCS8vaWYgRnJhbWVMaXN0CisJaWYgKCBoZWFkICkgeworCQkJCQkJCQkvLy4gIHNlYXJjaCBmb3IgbGFzdCBkZXNjcmlwdG9yIG9mIGZpcnN0IEZyYW1lTGlzdAorCQlwID0gcHJldiA9IGhlYWQ7CisJCXdoaWxlICggKCBwLT5CVUZfU0laRSAmIERFU0NfRU9QICkgPT0gMCAmJiBwLT5uZXh0X2Rlc2NfYWRkciApIHsKKwkJCWlmICggKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgPT0gMCApIHsJLy9jbGVhciBjb250cm9sIGJpdHMgd2hlbiBkaXNhYmxlZAorCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKKwkJCX0KKwkJCXByZXYgPSBwOworCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOworCQl9CisJCQkJCQkJCS8vLiAgaWYgRE1BIGVuYWJsZWQKKwkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIERNQV9FTkFCTEVEICkgeworCQkJCQkJCQkvLy4gIC4gIGlmIGxhc3QgZGVzY3JpcHRvciBvZiBGcmFtZUxpc3QgaXMgRE1BIG93bmVkCisJCQkJCQkJCS8vLiAgLiAgb3IgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IKKwkJCWlmICggcC0+QlVGX0NOVCAmIERFU0NfRE1BX09XTkVEIHx8IGhlYWQtPm5leHRfZGVzY19hZGRyID09IE5VTEwgKSB7CisJCQkJCQkJCS8vLiAgLiAgLiAgcmVmdXNlIHRvIHJldHVybiBGcmFtZUxpc3QgdG8gY2FsbGVyCisJCQkJaGVhZCA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJCQkJCQkJCS8vaWYgcmV0dXJuYWJsZSBGcmFtZUxpc3QgZm91bmQKKwlpZiAoIGhlYWQgKSB7CisJCQkJCQkJCS8vLiAgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IgKGltcGxpZXMgRE1BIGRpc2FibGVkKQorIAkJaWYgKCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgeworCQkJCQkJCQkvLy4gIC4gIGNsZWFyIERlc2NyaXB0b3JMaXN0CisJCQkvKjs/aWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0qLyBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gTlVMTDsKKwkJCQkJCQkJLy8uICBlbHNlCisJCX0gZWxzZSB7CisJCQkJCQkJCS8vLiAgLiAgc3RyaXAgaGFyZHdhcmUtcmVsYXRlZCBiaXRzIGZyb20gbGFzdCBkZXNjcmlwdG9yCisJCQkJCQkJCS8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CisJCQljb3B5ID0gaGVhZDsKKwkgCQloZWFkID0gaGVhZC0+bmV4dF9kZXNjX2FkZHI7CisJCQkJCQkJCS8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKKwkJCWNvcHktPmJ1Zl9waHlzX2FkZHIgPSBwLT5idWZfcGh5c19hZGRyOworCQkJY29weS0+YnVmX2FkZHIgPSBwLT5idWZfYWRkcjsKKwkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRU9QIGFuZCBwb3NzaWJseSBERVNDX1NPUAorCQkJY29weS0+QlVGX0NOVCA9IHAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECisjaWYgKEhDRl9FWFQpICYgSENGX0RFU0NfU1RSQ1RfRVhUCisJCQljb3B5LT5ERVNDX01TRlN1cCA9IHAtPkRFU0NfTVNGU3VwOworI2VuZGlmIC8vIEhDRl9ERVNDX1NUUkNUX0VYVAorCQkJCQkJCQkvLy4gIC4gIHR1cm4gaW50byBhIERFTFdBIERlc2NyaXB0b3IKKwkJCXAtPmJ1Zl9hZGRyID0gTlVMTDsKKwkJCQkJCQkJLy8uICAuICBjaGFpbiBjb3B5IHRvIHByZXYJCQkJCQkJCQkJCS8qIDgqLworCQkJcHJldi0+bmV4dF9kZXNjX2FkZHIgPSBjb3B5OworCQkJCQkJCQkvLy4gIC4gIGRldGFjaCByZW1haW5kZXIgb2YgdGhlIERlc2NyaXB0b3JMaXN0IGZyb20gRnJhbWVMaXN0CisJCQljb3B5LT5uZXh0X2Rlc2NfYWRkciA9IE5VTEw7CisJCQljb3B5LT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMHhERUFEMDAwMDsgLy8hIGp1c3QgdG8gYmUgbmljZSwgbm90IHJlYWxseSBuZWVkZWQKKwkJCQkJCQkJLy8uICAuICBzYXZlIHRoZSBuZXcgc3RhcnQgKGkuZS4gREVMV0EgRGVzY3JpcHRvcikgaW4gSUZCX0ZpcnN0RGVzYworCQkJaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IHA7CisJCX0KKwkJCQkJCQkJLy8uICBzdHJpcCBERVNDX1NPUCBmcm9tIGZpcnN0IGRlc2NyaXB0b3IKKwkJaGVhZC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsKKwkJLy9oZWFkLT5CVUZfQ05UICY9IERFU0NfQ05UX01BU0s7ICBnZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECisJCWhlYWQtPm5leHRfZGVzY19waHlzX2FkZHIgPSAweERFQUQwMDAwOyAvLyEganVzdCB0byBiZSBuaWNlLCBub3QgcmVhbGx5IG5lZWRlZAorCX0KKwkJCQkJCQkJLy9yZXR1cm4gdGhlIGp1c3QgZGV0YWNoZWQgRnJhbWVMaXN0IChpZiBhbnkpCisJcmV0dXJuIGhlYWQ7Cit9IC8vIGdldF9mcmFtZV9sc3QKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZ1bmN0aW9uIHB1dF9mcmFtZV9sc3QKKyoKKyogVGhpcyBmdW5jdGlvbgorKgorKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKyoKKyogSW5wdXQgcGFyYW1ldGVyczoKKyogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCisqCisqIFRoZSBmb2xsb3dpbmcgbGlzdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggaGNmX2RtYV90eC9yeF9wdXQsIGluIG9yZGVyIHRvIGdldCB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCisqIEFzc2VydCBmYWlscyBpZgorKiAtCURNQSBpcyBub3QgZW5hYmxlZAorKiAtCWRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCisqIC0JYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyogLQlhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKyogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKyogLQl0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKyogLQlhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKyogLQlQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCisKKyouTk9USUNFCisqIFRoZSBhc3NlcnRzIG1hcmtlZCB3aXRoICpzYyogYXJlIHJlYWxseSBzYW5pdHkgY2hlY2tzIGZvciB0aGUgSENGLCB0aGV5IGNhbiAoc3VwcG9zZWRseSkgbm90IGJlIGluZmx1ZW5jZWQKKyogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgorCisJCS8vIFRoZSBNU0YgaXMgcmVxdWlyZWQgdG8gc3VwcGx5IHRoZSBIQ0Ygd2l0aCBhIHNpbmdsZSBkZXNjcmlwdG9yIGZvciBNU0YgdHggcmVjbGFpbSBwdXJwb3Nlcy4KKwkJLy8gVGhpcyAncmVjbGFpbSBkZXNjcmlwdG9yJyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgZmFjdCB0aGF0IGl0cyBidWZfYWRkciBmaWVsZCBpcyB6ZXJvLgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSogQWx0aG91Z2ggbm90IHJlcXVpcmVkIGZyb20gYSBoYXJkd2FyZSBwZXJzcGVjdGl2ZToKKwkqIC0gbWFrZSBlYWNoIGRlc2NyaXB0b3IgaW4gdGhpcyByeC1jaGFpbiBETUEtb3duZWQuCisJKiAtIEFsc28gc2V0IHRoZSBjb3VudCB0byB6ZXJvLiBFT1AgYW5kIFNPUCBiaXRzIGFyZSBhbHNvIGNsZWFyZWQuCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyB2b2lkCitwdXRfZnJhbWVfbHN0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBpbnQgdHhfcnhfZmxhZyApCit7CisJREVTQ19TVFJDVAkqcCA9IGRlc2NwOworCWhjZl8xNiBwb3J0OworCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KSAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECisJSENGQVNTRVJUKCB0eF9yeF9mbGFnID09IERNQV9SWCB8fCB0eF9yeF9mbGFnID09IERNQV9UWCwgdHhfcnhfZmxhZyApCisJSENGQVNTRVJUKCBwICwgMCApCisKKwl3aGlsZSAoIHAgKSB7CisJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQorCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKQorCQlIQ0ZBU1NFUlQoIChwLT5CVUZfU0laRSAmIH5ERVNDX0NOVF9NQVNLKSA9PSAwLCBwLT5CVUZfU0laRSApCisJCXAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CQkJCQkvLyEhdGhpcyBTSE9VTEQgYmUgc3VwZXJmbHVvdXMgaW4gY2FzZSBvZiBjb3JyZWN0IE1TRgorCQlwLT5CVUZfQ05UICY9IHR4X3J4X2ZsYWcgPT0gRE1BX1JYID8gMCA6IERFU0NfQ05UX01BU0s7CS8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCisJCXAtPkJVRl9DTlQgfD0gREVTQ19ETUFfT1dORUQ7CisJCWlmICggcC0+bmV4dF9kZXNjX2FkZHIgKSB7CisvLwkJCUhDRkFTU0VSVCggcC0+YnVmX2FkZHIgJiYgcC0+YnVmX3BoeXNfYWRkciAgJiYgcC0+QlVGX1NJWkUgJiYgKy8tIHAtPkJVRl9TSVpFLCAuLi4gKQorCQkJSENGQVNTRVJUKCBwLT5uZXh0X2Rlc2NfYWRkci0+ZGVzY19waHlzX2FkZHIsIChoY2ZfMzIpcC0+bmV4dF9kZXNjX2FkZHIgKQorCQkJcC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkcjsKKwkJfSBlbHNlIHsJCQkJCQkJCQkvLworCQkJcC0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IDA7CisJCQlpZiAoIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CQkJLy8gREVMV0EgRGVzY3JpcHRvcgorCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApCS8vc2luZ2xldG9uIERlc2NyaXB0b3JMaXN0CisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID09IE5VTEwsIChoY2ZfMzIpaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSkKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSkKKwkJCQlkZXNjcC0+QlVGX0NOVCA9IDA7IC8vJj0gfkRFU0NfRE1BX09XTkVEOworCQkJCWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKKy8vIHBhcnQgb2YgYWx0ZXJuYXRpdmUgaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9IGRlc2NwOworCQkJCQkJCQkJCQkJCS8vIGlmICJyZWN5Y2xpbmciIGEgRnJhbWVMaXN0CisJCQkJCQkJCQkJCQkJLy8gKGUuZy4gY2FsbGVkIGZyb20gaGNmX2NudGwoIEhDRl9DTlRMX0VOQUJMRSApCisJCQkJCQkJCQkJCQkJLy8gLiAgcHJlcGFyZSBmb3IgYWN0aXZhdGlvbiBETUEgY29udHJvbGxlcgorLy8gcGFydCBvZiBhbHRlcm5hdGl2ZSBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsKKwkJCX0gZWxzZSB7CQkJCQkJCQkvL2EgInJlYWwiIEZyYW1lTGlzdCwgaGFuZCBpdCBvdmVyIHRvIHRoZSBETUEgZW5naW5lCisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddLCAoaGNmXzMyKWRlc2NwICkKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCisJCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyID09IE5VTEwsCisJCQkJCQkgICAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIpCisvLwkJCQlwLT5idWZfY250bC5jbnRsX3N0YXQgfD0gREVTQ19ETUFfT1dORUQ7CisJCQkJaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLT5uZXh0X2Rlc2NfYWRkciA9IGRlc2NwOworCQkJCWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IGRlc2NwLT5kZXNjX3BoeXNfYWRkcjsKKwkJCQlwb3J0ID0gSFJFR19SWERNQV9QVFIzMjsKKwkJCQlpZiAoIHR4X3J4X2ZsYWcgKSB7CisJCQkJCXAtPkJVRl9TSVpFIHw9IERFU0NfRU9QOwkvLyBwIHBvaW50cyBhdCB0aGUgbGFzdCBkZXNjcmlwdG9yIGluIHRoZSBjYWxsZXItc3VwcGxpZWQgZGVzY3JpcHRvciBjaGFpbgorCQkJCQlkZXNjcC0+QlVGX1NJWkUgfD0gREVTQ19TT1A7CisJCQkJCXBvcnQgPSBIUkVHX1RYRE1BX1BUUjMyOworCQkJCX0KKwkJCQlPVVRfUE9SVF9EV09SRCggKGlmYnAtPklGQl9JT0Jhc2UgKyBwb3J0KSwgZGVzY3AtPmRlc2NfcGh5c19hZGRyICk7CisJCQl9CisJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPSBwOworCQl9CisJCXAgPSBwLT5uZXh0X2Rlc2NfYWRkcjsKKwl9Cit9IC8vIHB1dF9mcmFtZV9sc3QKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJREVTQ19TVFJDVCogaGNmX2RtYV9yeF9nZXQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCWRlY2Fwc3VsYXRlIGEgbWVzc2FnZSBhbmQgcHJvdmlkZXMgdGhhdCBtZXNzYWdlIHRvIHRoZSBNU0YuCisqCQkJCXJlY2xhaW0gYWxsIGRlc2NyaXB0b3JzIGluIHRoZSByeCBkZXNjcmlwdG9yIGNoYWluLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJcG9pbnRlciB0byBhIEZyYW1lTGlzdAorKgorKi5ERVNDUklQVElPTgorKiBoY2ZfZG1hX3J4X2dldCBpcyBpbnRlbmRlZCB0byAgcmV0dXJuIGEgcmVjZWl2ZWQgZnJhbWUgd2hlbiBzdWNoIGEgZnJhbWUgaXMgZGVwb3NpdGVkIGluIEhvc3QgbWVtb3J5IGJ5IHRoZQorKiBETUEgZW5naW5lLiBJbiBhZGRpdGlvbiBoY2ZfZG1hX3J4X2dldCBjYW4gYmUgdXNlZCB0byByZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbgorKiB3aGVuIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCBlLmcuIGFzIHBhcnQgb2YgYSBkcml2ZXIgdW5sb2FkaW5nIHN0cmF0ZWd5LgorKiBoY2ZfZG1hX3J4X2dldCBtdXN0IGJlIGNhbGxlZCByZXBlYXRlZGx5IGJ5IHRoZSBNU0Ygd2hlbiBoY2Zfc2VydmljZV9uaWMgc2lnbmFscyBhdmFpbGFiaWxpdHkgb2YgYSByeCBmcmFtZQorKiB0aHJvdWdoIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgb2YgSUZCX0RtYVBhY2tldHMuIFRoZSBjYWxsaW5nIG11c3Qgc3RvcCB3aGVuIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLCBhdAorKiB3aGljaCB0aW1lIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgaXMgYWxzbyBjbGVhcmVkIGJ5IHRoZSBIQ0YgdG8gYXJtIHRoZSBtZWNoYW5pc20gZm9yIHRoZSBuZXh0IGZyYW1lCisqIHJlY2VwdGlvbi4KKyogUmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBETUEgRW5naW5lIGlzIGN1cnJlbnRseSBlbmFibGVkIChhcyBjb250cm9sbGVkIHZpYSBoY2ZfY250bCksIGlmIHRoZSBETUEgY29udHJvbGxlcgorKiBkZXBvc2l0ZWQgYW4gUngtZnJhbWUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGlzIGZyYW1lIGlzIGRldGFjaGVkIGZyb20gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LAorKiB0cmFuc2Zvcm1lZCBpbnRvIGEgRnJhbWVMaXN0IChpLmUuICB1cGRhdGluZyB0aGUgaG91c2VrZWVwaW5nIGZpZWxkcyBpbiB0aGUgZGVzY3JpcHRvcnMpIGFuZCByZXR1cm5lZCB0byB0aGUKKyogY2FsbGVyLgorKiBJZiBubyBzdWNoIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3J4X2dldCBkZXBlbmRzIG9uIHRoZQorKiBzdGF0dXMgb2YgdGhlIERNQSBFbmdpbmUuCisqIElmIHRoZSBETUEgRW5naW5lIGlzIGVuYWJsZWQsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgorKiBJZiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgdGhlIGZvbGxvd2luZyBzdHJhdGVneSBpcyB1c2VkOgorKiAtIHRoZSBjb21wbGV0ZSBSeC1EZXNjcmlwdG9yTGlzdCBpcyByZXR1cm5lZC4gVGhlIERFTFdBIERlc2NyaXB0b3IgaXMgbm90IHBhcnQgb2YgdGhlIFJ4LURlc2NyaXB0b3JMaXN0LgorKiAtIElmIHRoZXJlIGlzIG5vIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyByZXR1cm5lZC4KKyogLSBJZiB0aGVyZSBpcyBubyBERUxXQSBEZXNjcmlwdG9yLCBhIE5VTEwgcG9pbnRlciBpcyByZXR1cm5lZC4KKyoKKyogSWYgdGhlIE1TRiBwZXJmb3JtcyBhbiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIFJ4LURlc2NyaXB0b3JMaXN0IGFzIGRlc2NyaWJlZCBhYm92ZSwKKyogdGhlIGVuYWJsZSBjb21tYW5kIHdpbGwgcmVzZXQgYWxsIGhvdXNlIGtlZXBpbmcgaW5mb3JtYXRpb24sIGkuZS4gYWxyZWFkeSByZWNlaXZlZCBidXQgbm90IHlldCBieSB0aGUgTVNGCisqIHJldHJpZXZlZCBmcmFtZXMgYXJlIGxvc3QgYW5kIHRoZSBuZXh0IGZyYW1lIHdpbGwgYmUgcmVjZWl2ZWQgc3RhcnRpbmcgd2l0aCB0aGUgb2xkZXN0IGRlc2NyaXB0b3IuCisqCisqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBkZWNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgorKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKyogSWYgYXBwcm9wcmlhdGUsIGRlY2Fwc3VsYXRpb24gaXMgZG9uZSBieSBtb3Zpbmcgc29tZSBkYXRhIGluc2lkZSB0aGUgYnVmZmVycyBhbmQgdXBkYXRpbmcgdGhlIGRlc2NyaXB0b3JzCisqIGFjY29yZGluZ2x5LgorKiEhIDs/Pz8/P3doZXJlIGRpZCBJIGRlc2NyaWJlIHdoeSBhIHNpbXBsZSBtYW5pcHVsYXRpb24gd2l0aCB0aGUgY291bnQgdmFsdWVzIGRvZXMgbm90IHN1ZmZpY2U/CisqCisqLkRJQUdSQU0KKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0RFU0NfU1RSQ1QqCitoY2ZfZG1hX3J4X2dldCAoSUZCUCBpZmJwKQoreworREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CisKKwlkZXNjcCA9IGdldF9mcmFtZV9sc3QoIGlmYnAsIERNQV9SWCApOworCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKKworCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCisjaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKKwlpZiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorICAgIHsKK2ludCBpOworREVTQ19TVFJDVCAqcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkcjsJLy9wb2ludGVyIHRvIDJuZCBkZXNjcmlwdG9yIG9mIGZyYW1lCisJCUhDRkFTU0VSVChwLCAwKQorCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgKG1heWJlKSBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KKwkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCisJCWkgPSAqKHdjaV9yZWNvcmRwKSZkZXNjcC0+YnVmX2FkZHJbSEZTX1NUQVRdICYgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApOworCQlpZiAoIGkgPT0gSEZTX1NUQVRfVFVOTkVMIHx8CisJCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CisJCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCisJCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPT0gKHAtPmJ1Zl9hZGRyWzVdICsgKHAtPmJ1Zl9hZGRyWzRdPDw4KSArIDIqNiArIDIgLSA4KSwgcC0+QlVGX0NOVCApCisJCQkvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24KKwkJCUhDRkFTU0VSVChwLT5CVUZfU0laRSA+PTgsIHAtPkJVRl9TSVpFKQorCQkJLy8gbW92ZSBTQVsyOjVdIGluIHRoZSBzZWNvbmQgYnVmZmVyIHRvIHJlcGxhY2UgcGFydCBvZiB0aGUgU05BUCBoZWFkZXIKKwkJCWZvciAoIGk9MzsgaSA+PSAwOyBpLS0pIHAtPmJ1Zl9hZGRyW2krOF0gPSBwLT5idWZfYWRkcltpXTsKKwkJCS8vIGNvcHkgREFbMDo1XSwgU0FbMDoxXSBmcm9tIGZpcnN0IGJ1ZmZlciB0byBzZWNvbmQgYnVmZmVyCisJCQlmb3IgKCBpPTA7IGk8ODsgaSsrKSBwLT5idWZfYWRkcltpXSA9IGRlc2NwLT5idWZfYWRkcltIRlNfQUREUl9ERVNUICsgaV07CisJCQkvLyBtYWtlIGZpcnN0IGJ1ZmZlciBzaG9ydGVyIGluIGNvdW50CisJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19BRERSX0RFU1Q7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0VOQworCWlmICggZGVzY3AgPT0gTlVMTCApIGlmYnAtPklGQl9EbWFQYWNrZXRzICY9IChoY2ZfMTYpfkhSRUdfRVZfUkRNQUQ7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVCApCisJcmV0dXJuIGRlc2NwOworfSAvLyBoY2ZfZG1hX3J4X2dldAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQl2b2lkIGhjZl9kbWFfcnhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwICkKKyouUFVSUE9TRQkJc3VwcGx5IGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCisqCQkJCXN1cHBseSB0aGUgUngtREVMV0EgZGVzY3JpcHRvci4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglkZXNjcAkJYWRkcmVzcyBvZiBhIERlc2NyaXB0b3JMaXN0CisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCisqIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBlbmNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgorKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKyogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0YWludHMgYXBwbHkgdG8gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9yIGFuZCB0aGUgYnVmZmVycyBhc3NvY2lhdGVkCisqIHdpdGggdGhlIGZpcnN0IDIgZGVzY3JpcHRvcnMuIEluZGVwZW5kZW50IG9mIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUsIHRoZSBDT1VOVCBmaWVsZHMgYXJlIGlnbm9yZWQuCisqIEEgc3BlY2lhbCBjYXNlIGlzIHRoZSBzdXBwbHlpbmcgb2YgdGhlIERFTFdBIGRlc2NyaXB0b3IsIHdoaWNoIG11c3QgYmUgc3VwcGxpZWQgYXMgdGhlIGZpcnN0IGRlc2NyaXB0b3IuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkIHdoaWxlIHJlcXVpcmVkIGJ5IHBhcmFtZXRlciBhY3Rpb24uCisqIC0gaW4gY2FzZSBkZWNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YgaXMgc2VsZWN0ZWQ6CisqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIHRoZSBleGFjdCBzaXplIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgUnhGUyB1cCB0byB0aGUgODAyLjMgRGVzdEFkZHIKKyoJCWZpZWxkICg9PSAyOSB3b3JkcykuCisqCSAgLQlUaGUgRnJhbWVMaXN0IGRvZXMgbm90IGNvbnNpc3RzIG9mIGF0IGxlYXN0IDIgRGVzY3JpcHRvcnMuCisqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgbWluaW11bSBzaXplIG9mIDggYnl0ZXMuCisqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAorKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKyogLSBETUEgaXMgbm90IGVuYWJsZWQKKyogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAorKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisqIC0gYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCisqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCisqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCisqIC0gYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCisqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCisqCisqLkRJQUdSQU0KKyoKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCit7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9SWF9QVVQsIDB4REEwMSApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVF9JTlQKKworCXB1dF9mcmFtZV9sc3QoIGlmYnAsIGRlc2NwLCBETUFfUlggKTsKKyNpZiBIQ0ZfQVNTRVJUICYmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKKwlpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKKwkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPT0gSENGX0RNQV9SWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICkgLy8gZmlyc3QgZGVzY3JpcHRvciBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZXNjcmlwdG9yCisJCS8vIFRoZSBzZWNvbmQgREIgaXMgZm9yIFNOQVAgYW5kIHBheWxvYWQgcHVycG9zZXMuIEl0IHNob3VsZCBiZSBhIG1pbmltdW0gb2YgMTIgYnl0ZXMgaW4gc2l6ZS4KKwkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFID49IDEyLCBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9TSVpFICkKKwl9CisjZW5kaWYgLy8gSENGQVNTRVJUIC8gSENGX0VOQworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfUFVUICkKK30gLy8gaGNmX2RtYV9yeF9wdXQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJREVTQ19TVFJDVCogaGNmX2RtYV90eF9nZXQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCURNQSBtb2RlOiByZWNsYWltcyBhbmQgZGVjYXBzdWxhdGVzIHBhY2tldHMgaW4gdGhlIHR4IGRlc2NyaXB0b3IgY2hhaW4gaWY6CisqCQkJCSAtIEEgVHggcGFja2V0IGhhcyBiZWVuIGNvcGllZCBmcm9tIGhvc3QtUkFNIGludG8gTklDLVJBTSBieSB0aGUgRE1BIGVuZ2luZQorKgkJCQkgLSBUaGUgSGVybWVzL0RNQWVuZ2luZSBoYXZlIGJlZW4gZGlzYWJsZWQKKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCXBvaW50ZXIgdG8gYSByZWNsYWltZWQgVHggcGFja2V0LgorKgorKi5ERVNDUklQVElPTgorKiBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZDoKKyogV2hlbiBhIG5vbi1lbXB0eSBwb29sIG9mIFR4IGRlc2NyaXB0b3JzIGV4aXN0cyAoY3JlYXRlZCBieSBtZWFucyBvZiBoY2ZfZG1hX3B1dF90eCksIHRoZSBNU0YKKyogaXMgc3VwcG9zZWQgdG8gZW1wdHkgdGhhdCBwb29sIGJ5IG1lYW5zIG9mIGhjZl9kbWFfdHhfZ2V0IGNhbGxzIGFmdGVyIHRoZSBkaXNhYmxlIGluIGFuCisqIGRpc2FibGUvZW5hYmxlIHNlcXVlbmNlLgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0RFU0NfU1RSQ1QqCitoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKK3sKK0RFU0NfU1RSQ1QgKmRlc2NwOwkvLyBwb2ludGVyIHRvIHN0YXJ0IG9mIEZyYW1lTGlzdAorCisJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfVFggKTsKKwlpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApICAvLyFiZSBhd2FyZSBvZiB0aGUgbWlzc2luZyBjdXJseSBicmFja2V0CisJCQkJCQkJCQkJCS8vc2tpcCBkZWNhcHN1bGF0aW9uIGF0IGNvbmZpbmVkIGRlc2NyaXB0b3IKKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCWlmICggKCBkZXNjcC0+QlVGX0NOVCA9PSBIRlNfVFlQRSApCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorCQkJIHx8ICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0RBVCApCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisJCSkgeyAvLyBwZXJmb3JtIGRlY2Fwc3VsYXRpb24gaWYgbmVlZGVkCisJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgLT0gSENGX0RBU0FfU0laRTsKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVCAJCSArPSBIQ0ZfREFTQV9TSVpFOworCQl9CisjZW5kaWYgLy8gSENGX0VOQworCWlmICggZGVzY3AgPT0gTlVMTCApIHsgIC8vOz9jb3VsZCBiZSBpbnRlZ3JhdGVkIGludG8gZ2V0X2ZyYW1lX2xzdAorCQlpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1RETUFEOworCX0KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1RYX0dFVCApCisJcmV0dXJuIGRlc2NwOworfSAvLyBoY2ZfZG1hX3R4X2dldAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQl2b2lkIGhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCisqLlBVUlBPU0UJCXB1dHMgYSBwYWNrZXQgaW4gdGhlIFR4IERNQSBxdWV1ZSBpbiBob3N0IHJhbSBhbmQga2lja3Mgb2ZmIHRoZSBUeERtYSBlbmdpbmUuCisqCQkJCXN1cHBseSB0aGUgVHgtREVMV0EgZGVzY3JpcHRvci4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglkZXNjcAkJYWRkcmVzcyBvZiBUeCBEZXNjcmlwdG9yIENoYWluIChpLmUuIGEgc2luZ2xlIFR4IGZyYW1lKQorKgl0eF9jbnRsCQlpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKyogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCisqCisqIFJlZ2FyZGxlc3Mgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQsIHRoZSBkZXNjcmlwdG9yIGxpc3QgY3JlYXRlZCB0byBkZXNjcmliZSB0aGUgZnJhbWUgdG8gYmUKKyogdHJhbnNtaXR0ZWQsIG11c3Qgc3VwcGx5IHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIsIHByZWNlZGluZyB0aGUgYWN0dWFsIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLgorKiBCYXNpY2FsbHksIHRoaXMgb25seSBzdXBwbGllcyB3b3JraW5nIHN0b3JhZ2UgdG8gdGhlIEhDRiB3aGljaCBwYXNzZXMgdGhpcyBvbiB0byB0aGUgRE1BIGVuZ2luZS4KKyogQXMgYSBjb25zZXF1ZW5jZSB0aGUgY29udGVudHMgb2YgdGhpcyBzcGFjZSBkbyBub3QgbWF0dGVyLgorKiBOZXZlcnRoZWxlc3MgQlVGX0NOVCBtdXN0IHRha2UgaW4gYWNjb3VudCB0aGlzIHN0b3JhZ2UuCisqIFRoaXMgd29ya2luZyBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyIG1heSBub3QgYmUgZnJhZ21lbnRlZCwgdGhlIGZpcnN0IGJ1ZmZlciBtdXN0IGJlCisqIHN1ZmZpY2llbnRseSBsYXJnZSB0byBjb250YWluIGF0IGxlYXN0IHRoZSA4MDIuMTEgaGVhZGVyLCBpLmUuIEhGU19BRERSX0RFU1QgKDI5IHdvcmRzIG9yIDB4M0EgYnl0ZXMpLgorKiBUaGlzIHdheSwgdGhlIEhDRiBjYW4gc2ltcGx5LCByZWdhcmRsZXNzIHdoZXRoZXIgb3Igbm90IHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgd3JpdGUgdGhlIHBhcmFtZXRlcgorKiB0eF9jbnRsIGF0IG9mZnNldCAweDM2IChIRlNfVFhfQ05UTCkgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KKyogTm90ZSB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBwYXJ0IG9yIGFsbCBvZiB0aGUgYWN0dWFsIGZyYW1lIHJlcHJlc2VudGVkIGJ5IHRoZSBmaXJzdCBkZXNjcmlwdG9yIGFzIGxvbmcKKyogYXMgdGhlIHJlcXVpcmVtZW50IGZvciBzdG9yYWdlIGZvciB0aGUgODAyLjExIGhlYWRlciBpcyBtZXQsIGkuZS4gdGhlIDgwMi4zIGZyYW1lIHN0YXJ0cyBhdCBvZmZzZXQKKyogSEZTX0FERFJfREVTVC4KKyogRXhjZXB0IGZvciB0aGUgQXNzZXJ0IG9uIHRoZSAxc3QgYnVmZmVyIGluIGNhc2Ugb2YgRW5jYXBzdWFsdGlvbiwgdGhlIFNJWkUgZmllbGRzIGFyZSBpZ25vcmVkLgorKgorKiBJbiBjYXNlIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUgaXMgY29tcGlsZWQgaW4sIHRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgorKiBvIFRoZSBCVUZfQ05UIG9mIHRoZSBmaXJzdCBidWZmZXIgY2hhbmdlcyBmcm9tIGEgbWluaW11bSBvZiAweDNBIGJ5dGVzIHRvIGV4YWN0bHkgMHgzQSwgaS5lLiB0aGUgd29ya3NwYWNlCisqCXRvIHN0b3JlIHRoZSA4MDIuMTEgaGVhZGVyCisqIG8gVGhlIEJVRl9TSVpFIG9mIHRoZSBmaXJzdCBidWZmZXIgaXMgYXQgbGVhc3QgdGhlIHNwYWNlIG5lZWRlZCB0byBzdG9yZSB0aGUKKyoJLSA4MDIuMTEgaGVhZGVyICgyOSB3b3JkcykKKyoJLSA4MDIuMyBoZWFkZXIsIGkuZS4gMTIgYnl0ZXMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgMiBieXRlcyBsZW5ndGggZmllbGQKKyoJLSA2IGJ5dGVzIFNOQVAtaGVhZGVyCisqICAgVGhpcyByZXN1bHRzIGluIDM5IHdvcmRzIG9yIDB4NEUgYnl0ZXMgb3IgSEZTX1RZUEUuCisqICAgTm90ZSB0aGF0IGlmIHRoZSBCVUZfU0laRSBpcyBsYXJnZXIgdGhhbiAweDRFLCB0aGlzIHN1cnBsdXMgaXMgbm90IHVzZWQuCisqIG8gVGhlIGFjdHVhbCBmcmFtZSBiZWdpbnMgaW4gdGhlIDJuZCBkZXNjcmlwdG9yICh3aGljaCBpcyBhbHJlYWR5IGltcGxpZWQgYnkgdGhlIEJVRl9DTlQgPT0gMHgzQSByZXF1aXJlbWVudCkgYW5kIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBjb250YWlucyBhdCBsZWFzdCB0aGUgODAyLjMgaGVhZGVyLCBpLmUuIHRoZSAxNCBieXRlcyByZXByZXNlbnRpbmcgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgbGVuZ3RoL3R5cGUgZmllbGQKKyoKKyogICBXaGVuIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGVzIChpLmUuIGxlbmd0aC90eXBlIGZpZWxkIDw9IDE1MDApLCAgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byBkZXNjcmlwdG9ycworKiAgIG9yIGJ1ZmZlcnMuCisqCisqICAgV2hlbiB0aGUgSENGIGFjdHVhbGx5IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA+IDE1MDApLCBpdCBzdWNjZXNzaXZlbHkgd3JpdGVzLCBzdGFydGluZyBhdAorKiAgIG9mZnNldCBIRlNfQUREUl9ERVNUICgweDNBKSBpbiB0aGUgZmlyc3QgYnVmZmVyOgorKiAgICAgLSB0aGUgODAyLjMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiwgY29waWVkIGZyb20gdGhlIGJlZ2luIG9mIHRoZSBzZWNvbmQgYnVmZmVyCisqICAgICAtIHRoZSBmcmFtZSBsZW5ndGgsIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbmRpdmlkdWFsIGZyYWdtZW50cywgY29ycmVjdGVkIGZvciB0aGUgU05BUAorKiAgIAloZWFkZXIgbGVuZ3RoIGFuZCBUeXBlIGZpZWxkIGFuZCBpZ25vcmluZyB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIExlbmd0aCBmaWVsZAorKiAJICAtIHRoZSBhcHByb3ByaWF0ZSBzbmFwIGhlYWRlciAoVHVubmVsIG9yIDEwNDIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgZmllbGQpLgorKgorKiAJIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5OgorKiAJICAtIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGNvdW50IGlzIGNoYW5nZWQgZnJvbSAweDNBIHRvIDB4NEUgKEhGU19UWVBFKSwgd2hpY2ggbWF0Y2hlcyAweDNBICsgMTIgKyAyICsgNgorKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciBjb3VudCBpcyBkZWNyZWFzZWQgYnkgMTIsIGJlaW5nIHRoZSBtb3ZlZCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCisqIAkgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIChwaHlzaWNhbCkgYnVmZmVyIGFkZHJlc3MgaXMgaW5jcmVhc2VkIGJ5IDEyLgorKgorKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCisqIHVuZG9uZS4KKyoKKyogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycworKiBJbiBjYXNlIG9mIGVuY2Fwc3VsYXRpb24sIEJVRl9TSVpFIG9mIHRoZSAxc3QgZGVzY3JpcHRvciBpcyBhc3NlcnRlZCB0byBiZSBhdCBsZWFzdCBIRlNfVFlQRSAoMHg0RSksIHNvIGl0IGlzIE5PVCB0ZXN0ZWQuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSB0eF9jbnRsIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgorKiAtIGluIGNhc2UgZW5jYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgorKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgorKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHRoZSAoc3BhY2UgZm9yKSB0aGUgODAyLjExIGhlYWRlciAoPT0gMjggd29yZHMpCisqCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgc2l6ZSB0byBhZGRpdGlvbmFsbHkgYWNjb21vZGF0ZSB0aGUgODAyLjMgaGVhZGVyIGFuZCB0aGUKKyoJCVNOQVAgaGVhZGVyIG9mIHRoZSBmcmFtZSBhZnRlciBlbmNhcHN1bGF0aW9uICg9PSAzOSB3b3JkcykuCisqCSAgLQlUaGUgc2Vjb25kIGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBhdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlL2xlbmd0aCcgKD09MTQgYnl0ZXMgb3IgNyB3b3JkcykKKyohISBUaGUgMm5kIHBhcnQgb2YgdGhlIGxpc3Qgb2YgYXNzZXJ0cyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggcHV0X2ZyYW1lX2xzdCwgaW4gb3JkZXIgdG8gZ2V0CisqISEgdGhlbSBpbiB0aGUgV0NJLXNwZWMgISEhIQorKiAtIERNQSBpcyBub3QgZW5hYmxlZAorKiAtIGRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCisqIC0gYSBkZXNjcmlwdG9yIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyogLSBhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKyogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKyogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgdGhlIGZpcnN0IERlc2NyaXB0b3Igc3VwcGxpZWQKKyogLSBhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKyohISAtIFBvc3NpYmx5IG1vcmUgY2hlY2tzIGNvdWxkIGJlIGFkZGVkICEhISEhISEhISEhISEKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqCisqMToJV3JpdGUgdHhfY250bCBwYXJhbWV0ZXIgdG8gSEZTX1RYX0NOVEwgZmllbGQgaW50byB0aGUgSGVybWVzLXNwZWNpZmljIGhlYWRlciBpbiBidWZmZXIgMQorKjQ6CWRldGVybWluZSB3aGV0aGVyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkIGFuZCB3cml0ZSB0aGUgdHlwZSAodHVubmVsIG9yIDEwNDIpIGFscmVhZHkgYXQgdGhlIGFwcHJvcHJpYXRlCisqCW9mZnNldCBpbiB0aGUgMXN0IGJ1ZmZlcgorKjY6CUJ1aWxkIHRoZSBlbmNhcHN1YWx0aW9uIGVudmVsb3BwZSBpbiB0aGUgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSAxc3QgYnVmZmVyCisqCS0gQ29weSBEQS9TQSBmaWVsZHMgZnJvbSB0aGUgMm5kIGJ1ZmZlcgorKiAgIC0gQ2FsY3VsYXRlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSAoc25hcC1oZWFkZXIgKyB0eXBlLWZpZWxkICsgdGhlIGxlbmd0aCBvZiBhbGwgYnVmZmVyIGZyYWdtZW50cworKiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA4MDIuMyBmcmFtZSAoaS5lIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0KSwgYnV0IG5vdCB0aGUgRGVzdGluYXRpb25BZGRyZXNzLAorKiAgICAgU291cmNlQWRkcmVzcyBhbmQgbGVuZ2h0LWZpZWxkKQorKiAgICAgQXNzZXJ0IHRoZSBtZXNzYWdlIGxlbmd0aAorKgkgIFdyaXRlIGxlbmd0aC4gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGluIEJFIGZvcm1hdCwgaGVuY2Ugb24gTEUgcGxhdGZvcm1zIHRoZSBsZW5ndGggbXVzdCBiZSBjb252ZXJ0ZWQKKyoJICA7PyBUSElTIElTIE5PVCBXSEFUIENVUlJFTlRMWSBJUyBJTVBMRU1FTlRFRAorKgktIFdyaXRlIHNuYXAgaGVhZGVyLiBOb3RlIHRoYXQgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgc25hcCBoZWFkZXIgaXMgTk9UIGNvcGllZCwgdGhhdCBieXRlIGlzIGFscmVhZHkgaW4KKyoJICBwbGFjZSBhcyByZXN1bHQgb2YgdGhlIGNhbGwgdG8gaGNmX2VuY2FwLgorKglOb3RlIHRoYXQgdGhlcmUgYXJlIG1hbnkgd2F5cyB0byBza2luIGEgY2F0LiBUbyBleHByZXNzIHRoZSBvZmZzZXRzIGluIHRoZSAxc3QgYnVmZmVyIHdoaWxlIHdyaXRpbmcKKyoJdGhlIHNuYXAgaGVhZGVyLCBIRlNfVFlQRSBpcyBjaG9vc2VuIGFzIGEgcmVmZXJlbmNlIHBvaW50IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGdyYXNwIHRoYXQgdGhlIHNuYXAgaGVhZGVyCisqCWFuZCBlbmNhcHN1YWx0aW9uIHR5cGUgYXJlIGF0IGxlYXN0IHJlbGF0aXZlIGluIHRoZSByaWdodC4KKyo4Ogltb2RpZnkgMXN0IGRlc2NyaXB0b3IgdG8gcmVmbGVjdCBtb3ZlZCBwYXJ0IG9mIHRoZSA4MDIuMyBoZWFkZXIgKyBTbmFwLWhlYWRlcgorKgltb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyIChEQS9TQQorKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KKyoJU2V0IFNPUCBiaXQgb24gZmlyc3QgZGVzY3JpcHRvci4gU2V0IEVPUCBiaXQgb24gbGFzdCBkZXNjcmlwdG9yLgorKjEyOiBFaXRoZXIgYXBwZW5kIHRoZSBjdXJyZW50IGZyYW1lIHRvIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IgbGlzdCBvcgorKjE0OiBjcmVhdGUgYSBsaXN0IGJlZ2lubmluZyB3aXRoIHRoZSBjdXJyZW50IGZyYW1lCisqMTY6IHJlbWVtYmVyIHRoZSBuZXcgZW5kIG9mIHRoZSBsaXN0CisqMjA6IGhhbmQgdGhlIGZyYW1lIG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2hjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCit7CitERVNDX1NUUkNUCSpwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOworaW50CQkJaTsKKworI2lmIEhDRl9BU1NFUlQKKwlpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7CisJSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApCisjZW5kaWYgLy8gSENGX0FTU0VSVAorCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVCwgMHhEQTAzICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggKCBpZmJwLT5JRkJfQ250bE9wdCAmIChVU0VfRE1BfERNQV9FTkFCTEVEKSApID09IChVU0VfRE1BfERNQV9FTkFCTEVEKSwgaWZicC0+SUZCX0NudGxPcHQpCisKKwlpZiAoIGRlc2NwLT5idWZfYWRkciApIHsKKwkJKihoY2ZfMTYqKShkZXNjcC0+YnVmX2FkZHIgKyBIRlNfVFhfQ05UTCkgPSB0eF9jbnRsOwkJCQkJCQkJCQkJLyoxKi8KKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICkJCQkJCQkJCQkvL2F0IGxlYXN0IDIgZGVzY3JpcG9ycworCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfQ05UID09IEhGU19BRERSX0RFU1QsIGRlc2NwLT5CVUZfQ05UICkJLy9leGFjdCBsZW5ndGggcmVxdWlyZWQgZm9yIDFzdCBidWZmZXIKKwkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPj0gSENGX0RNQV9UWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApCS8vbWluaW1hbCBzdG9yYWdlIGZvciBlbmNhcHN1bGF0aW9uCisJCUhDRkFTU0VSVCggcC0+QlVGX0NOVCA+PSAxNCwgcC0+QlVGX0NOVCApOwkJCQkJLy9hdCBsZWFzdCBEQSwgU0EgYW5kICd0eXBlJyBpbiAybmQgYnVmZmVyCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJCS8qIGlmIHdlIGFyZSBkb2luZyBQUEsgKy8tIENNSUMsIG9yIHdlIGFyZSBzZW5kaW5nIGEgRERQIGZyYW1lICovCisJCWlmICggKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT04gKSB8fAorCQkJICggKCBwLT5CVUZfQ05UID49IDIwICkJCSAmJiAoIGlmYnAtPklGQl9DS0lQU3RhdCA9PSBIQ0ZfQUNUX0NDWF9PRkYgKSAmJgorCQkJICggcC0+YnVmX2FkZHJbMTJdID09IDB4QUEgKSAmJiAoIHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBICkgJiYKKwkJCSAoIHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzICkgJiYgKCBwLT5idWZfYWRkclsxNV0gPT0gMHgwMCApICYmCisJCQkgKCBwLT5idWZfYWRkclsxNl0gPT0gMHg0MCApICYmICggcC0+YnVmX2FkZHJbMTddID09IDB4OTYgKSAmJgorCQkJICggcC0+YnVmX2FkZHJbMThdID09IDB4MDAgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwICkpKQorCQl7CisJCQkvKiBjb3B5IHRoZSBEQS9TQSB0byB0aGUgZmlyc3QgYnVmZmVyICovCisJCQlmb3IgKCBpID0gMDsgaSA8IEhDRl9EQVNBX1NJWkU7IGkrKyApIHsKKwkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gcC0+YnVmX2FkZHJbaV07CisJCQl9CisJCQkvKiBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc2Vjb25kIGZyYWdtZW50IG9ubHkgKi8KKwkJCWkgPSAwOworCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApOworCQkJaSAtPSBIQ0ZfREFTQV9TSVpFIDsKKwkJCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBmaWVsZCB0byBiaWcgZW5kaWFuLCB1c2luZyB0aGUgZW5kaWFuIGZyaWVuZGx5IG1hY3JvcyAqLworCQkJaSA9IENOVl9TSE9SVF9UT19CSUcoaSk7CQkvLyEhIHRoaXMgY29udmVydHMgT05MWSBvbiBMRSBwbGF0Zm9ybXMsIGhvdyBkb2VzIHRoYXQgcmVsYXRlIHRvIHRoZSBub24tQ0NYIGNvZGUKKwkJCSooaGNmXzE2KikoJmRlc2NwLT5idWZfYWRkcltIRlNfTEVOXSkgPSAoaGNmXzE2KWk7CisJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19EQVQ7CisJCQkvLyBtb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgJ0RhL1NhJyBmaWVsZHMKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkciArPSBIQ0ZfREFTQV9TSVpFOworCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfQ05UCQkgLT0gSENGX0RBU0FfU0laRTsKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisJCXsKKwkJCWRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSA9IGhjZl9lbmNhcCgmZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSk7CQkvKjQqLworCQkJaWYgKCBkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUtMV0gIT0gRU5DX05PTkUgKSB7CisJCQkJZm9yICggaT0wOyBpIDwgSENGX0RBU0FfU0laRTsgaSsrICkgewkJCQkJCQkJCQkJCQkJLyo2Ki8KKwkJCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbaV07CisJCQkJfQorCQkJCWkgPSBzaXplb2Yoc25hcF9oZWFkZXIpICsgMiAtICggMio2ICsgMiApOworCQkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CisJCQkJKihoY2ZfMTYqKSgmZGVzY3AtPmJ1Zl9hZGRyW0hGU19MRU5dKSA9IENOVl9FTkRfU0hPUlQoaSk7CS8vISEgdGhpcyBjb252ZXJ0cyBvbiBBTEwgcGxhdGZvcm1zLCBob3cgZG9lcyB0aGF0IHJlbGF0ZSB0byB0aGUgQ0NYIGNvZGUKKwkJCQlmb3IgKCBpPTA7IGkgPCBzaXplb2Yoc25hcF9oZWFkZXIpIC0gMTsgaSsrKSB7CisJCQkJCWRlc2NwLT5idWZfYWRkcltIRlNfVFlQRSAtIHNpemVvZihzbmFwX2hlYWRlcikgKyBpXSA9IHNuYXBfaGVhZGVyW2ldOworCQkJCX0KKwkJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19UWVBFOwkJCQkJCQkJCQkJCQkJCQkJLyo4Ki8KKwkJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIJKz0gSENGX0RBU0FfU0laRTsKKwkJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQJCQktPSBIQ0ZfREFTQV9TSVpFOworCQkJfQorCQl9CisjZW5kaWYgLy8gSENGX0VOQworICAgIH0KKwlwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1RYICk7CisJSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9QVVQgKQorfSAvLyBoY2ZfZG1hX3R4X3B1dAorCisjZW5kaWYgLy8gSENGX0RNQQorCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaGNmXzggaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKKyouUFVSUE9TRQkJdGVzdCB3aGV0aGVyIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KKyoKKyouQVJHVU1FTlRTCisqCXR5cGUJCShGYXIpIHBvaW50ZXIgdG8gdGhlIChCaWcgRW5kaWFuKSBUeXBlL0xlbmd0aCBmaWVsZCBpbiB0aGUgbWVzc2FnZQorKgorKi5SRVRVUk5TCisqCUVOQ19OT05FCQlsZW4vdHlwZSBpcyAibGVuIiAoIChCSUdfRU5ESUFOKXR5cGUgPD0gMTUwMCApCisqCUVOQ19UVU5ORUwJCWxlbi90eXBlIGlzICJ0eXBlIiBhbmQgMHg4MEYzIG9yIDB4ODEzNworKglFTkNfMTA0MgkJbGVuL3R5cGUgaXMgInR5cGUiIGJ1dCBub3QgMHg4MEYzIG9yIDB4ODEzNworKgorKi5DT05ESVRJT05TCisqCU5JQyBJbnRlcnJ1cHRzCWQuYworKgorKi5ERVNDUklQVElPTgorKiBUeXBlIG11c3QgcG9pbnQgdG8gdGhlIExlbi9UeXBlIGZpZWxkIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHRoZSAyLWJ5dGUgZmllbGQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIDYgYnl0ZQorKiBEZXN0aW5hdGlvbiBBZGRyZXNzIGFuZCA2IGJ5dGUgU291cmNlIEFkZHJlc3MuICBUaGUgMiBzdWNjZXNzaXZlIGJ5dGVzIGFkZHJlc3NlZCBieSB0eXBlIGFyZSBpbnRlcnByZXRlZCBhcworKiBhIEJpZyBFbmRpYW4gdmFsdWUuICBJZiB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNTAwLCB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIDgwMi4zCisqIGZvcm1hdC4gIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIEV0aGVybmV0LUlJIGZvcm1hdC4gIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgTGVuL1R5cCwKKyogQnJpZGdlIFR1bm5lbCBvciBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLgorKgorKi5ESUFHUkFNCisqCisqICAxOglwcmVzdW1lIDgwMi4zLCBoZW5jZSBwcmVzZXQgcmV0dXJuIHZhbHVlIGF0IEVOQ19OT05FCisqICAyOgljb252ZXJ0IHR5cGUgZnJvbSAibmV0d29yayIgRW5kaWFuIGZvcm1hdCB0byBuYXRpdmUgRW5kaWFuCisqICA0Ogl0aGUgbGl0bXVzIHRlc3QgdG8gZGlzdGluZ3Vpc2ggdHlwZSBhbmQgbGVuLgorKglUaGUgaGFyZCBjb2RlICJtYWdpYyIgdmFsdWUgb2YgMTUwMCBpcyBpbnRlbnRpb25hbCBhbmQgc2hvdWxkIE5PVCBiZSByZXBsYWNlZCBieSBhIG1uZW1vbmljIGJlY2F1c2UgaXQgaXMKKyoJbm90IHJlbGF0ZWQgYXQgYWxsIHRvIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUgc3VwcG9ydGVkICBieSB0aGUgSGVybWVzLgorKiAgNjoJY2hlY2sgdHlwZSBhZ2FpbnN0OgorKgkJMHg4MEYzCS8vQXBwbGVUYWxrIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQUFSUCkKKyoJCTB4ODEzNwkvL0lQWAorKgl0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZW5jYXBzdWxhdGlvbgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBIQ0ZfRU5DQVAJLy9pLmUgSENGX0VOQyBvciBIQ0ZfRU5DX1NVUAorI2lmICEgKCAoSENGX0VOQ0FQKSAmIEhDRl9FTkNfU1VQICkKK0hDRl9TVEFUSUMKKyNlbmRpZiAvLyBIQ0ZfRU5DQVAKK2hjZl84CitoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQoreworCitoY2ZfOAlyYyA9IEVOQ19OT05FOwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KK2hjZl8xNgl0ID0gKGhjZl8xNikoKnR5cGU8PDgpICsgKih0eXBlKzEpOwkJCQkJCQkJCQkJCQkJCQkvKiAyICovCisKKwlpZiAoIHQgPiAxNTAwICkgewkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDQgKi8KKwkJaWYgKCB0ID09IDB4ODEzNyB8fCB0ID09IDB4ODBGMyApIHsKKwkJCXJjID0gRU5DX1RVTk5FTDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogNiAqLworCQl9IGVsc2UgeworCQkJcmMgPSBFTkNfMTA0MjsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9lbmNhcAorI2VuZGlmIC8vIEhDRl9FTkNBUAorI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfZ2V0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKyouUFVSUE9TRQkJT2J0YWlucyB0cmFuc2llbnQgYW5kIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBDYXJkIGFuZCBmcm9tIHRoZSBIQ0YuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJbHR2cAkJYWRkcmVzcyBvZiBMZW5ndGhUeXBlVmFsdWUgc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ3aGF0IiBhbmQgdGhlICJob3cgbXVjaCIgb2YgdGhlCisqCQkJCWluZm9ybWF0aW9uIHRvIGJlIGNvbGxlY3RlZCBmcm9tIHRoZSBIQ0Ygb3IgZnJvbSB0aGUgSGVybWVzCisqCisqLlJFVFVSTlMKKyoJSENGX0VSUl9MRU4JCQlUaGUgcHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwKKyoJSENGX1NVQ0NFU1MJCQlTdWNjZXNzCisqISEJdmlhIGNtZF9leGUgKCB0eXBlID49IENGR19SSURfRldfTUlOICkKKyoJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyByZXRyaWV2YWwKKyoJSENGX0VSUl9USU1FX09VVAlFeHBlY3RlZCBIZXJtZXMgZXZlbnQgZGlkIG5vdCBvY2N1cmUgaW4gZXhwZWN0ZWQgdGltZQorKiEhCXZpYSBjbWRfZXhlIGFuZCBzZXR1cF9iYXAgKHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKQorKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCUhDRiBpcyBpbiBkZWZ1bmN0IG1vZGUgKGJpdHMgMHg3RiByZWZsZWN0IGNhdXNlKQorKgorKi5ERVNDUklQVElPTgorKiBUaGUgVC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBSSUQgd2FudGVkLiBUaGUgUklECisqIGluZm9ybWF0aW9uIGlkZW50aWZpZWQgYnkgdGhlIFQtZmllbGQgaXMgY29waWVkIGludG8gdGhlIFYtZmllbGQuCisqIE9uIGVudHJ5LCB0aGUgTC1maWVsZCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgYWxzbyBjYWxsZWQgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiLiBUaGUgTC12YWx1ZQorKiBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgVC1maWVsZCwgYnV0IG5vdCB0aGUgc2l6ZSBvZiB0aGUgTC1maWVsZCBpdHNlbGYuCisqIE9uIHJldHVybiwgdGhlIEwtZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygd29yZHMgYWN0dWFsbHkgY29udGFpbmVkIGJ5IHRoZSBUeXBlIGFuZCBWYWx1ZSBmaWVsZHMuCisqIEFzIHRoZSBzaXplIG9mIHRoZSBUeXBlIGZpZWxkIGluIHRoZSBMVFYtcmVjb3JkIGlzIGluY2x1ZGVkIGluIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIiBvZiB0aGUgcmVjb3JkLCB0aGUKKyogVi1maWVsZCBjYW4gY29udGFpbiBhdCBtb3N0ICJJbml0aWFsIERhdGFMZW5ndGgiIC0gMSB3b3JkcyBvZiBkYXRhLgorKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUgY29tcGxldGUgSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2Ygd29yZHMgaW5kaWNhdGVkIGJ5IHRoZQorKiAiSW5pdGlhbCBEYXRhTGVuZ3RoIiB3ZXJlIGNvcGllZC4gIFRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIiBhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24KKyogSW5mb3JtYXRpb24gYmxvY2tzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudCBGL1cgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0CisqIG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuCisqIElmIHRoZSBzaXplIG9mIFZhbHVlIGZpZWxkIG9mIHRoZSBSSUQgZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgLTEsIGFzIG11Y2ggZGF0YQorKiBhcyBmaXRzIGlzIGNvcGllZCwgYW5kIGFuIGVycm9yIHN0YXR1cyBvZiBIQ0ZfRVJSX0xFTiBpcyByZXR1cm5lZC4KKyoKKyogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gZGV0ZWN0IGNhcmQgcmVtb3ZhbCBhbmQgcmUtaW5zZXJ0aW9uIGFuZCBub3QgY2FsbCB0aGUgSENGIHdoZW4gdGhlCisqIE5JQyBpcyBhYnNlbnQuIFRoZSBNU0YgY2Fubm90LCBob3dldmVyLCB0aW1lbHkgZGV0ZWN0IGEgQ2FyZCByZW1vdmFsIGlmIHRoZSBDYXJkIGlzIHJlbW92ZWQgd2hpbGUKKyogaGNmX2dldF9pbmZvIGlzIGluIHByb2dyZXNzLiAgVGhlcmVmb3JlLCB0aGUgSENGIHBlcmZvcm1zIGl0cyBvd24gY2hlY2sgb24gQ2FyZCBwcmVzZW5jZSBhZnRlciB0aGUgcmVhZAorKiBvcGVyYXRpb24gb2YgdGhlIE5JQyBkYXRhLiAgSWYgdGhlIENhcmQgaXMgbm90IHByZXNlbnQgb3IgcmVtb3ZlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBoY2ZfZ2V0X2luZm8sCisqIEhDRl9FUlJfTk9fTklDIGlzIHJldHVybmVkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgRGF0YSBCdWZmZXIgaXMgdW5wcmVkaWN0YWJsZS4gVGhpcyBjaGVjayBpcyBub3QgcGVyZm9ybWVkCisqIGluIGNhc2Ugb2YgdGhlICJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzIGxpa2UgQ0ZHX1RBTExJRVMuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCisqCWFnYWluc3QgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgorKiAtIGx0dnAgaXMgYSBOVUxMIHBvaW50ZXIuCisqIC0gbGVuZ3RoIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGF0IGVudHJ5IGlzIDAgb3IgMSBvciBoYXMgYW4gZXhjZXNzaXZlIHZhbHVlIChpLmUuIGV4Y2VlZHMgSENGX01BWF9MVFYpLgorKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZC4KKyoKKyouRElBR1JBTQorKglIY2ZfZ2V0X21iX2luZm8gY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBibG9jayBpbiB0aGUgTWFpbEJveCB0byBQQyBSQU0uIElmIGxlbiBpcworKglsZXNzIHRoYW4gdGhlIHNpemUgb2YgdGhlIE1haWxCb3ggSW5mbyBibG9jaywgb25seSBhcyBtdWNoIGFzIGZpdHMgaW4gdGhlIFBDIFJBTSBidWZmZXIgaXMgY29waWVkLiBBZnRlcgorKgl0aGUgY29weWluZyB0aGUgTWFpbEJveCBSZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCBNYWlsQm94IEluZm8gYmxvY2ssIGhlbmNlIHRoZQorKglyZW1haW5kZXIgb2YgYW4gIm92ZXJzaXplZCIgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGxvc3QuIFRoZSB0cnVuY2F0aW9uIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2sgaXMgTk9UCisqCXJlZmxlY3RlZCBpbiB0aGUgcmV0dXJuIHN0YXR1cy4gTm90ZSB0aGF0IGhjZl9nZXRfaW5mbyBndWFyYW50ZWVzIHRoZSBsZW5ndGggb2YgdGhlIFBDIFJBTSBidWZmZXIgbWVldHMKKyoJdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIGF0IGxlYXN0IDIsIHNvIG5vIFBDIFJBTSBidWZmZXIgb3ZlcnJ1bi4KKyoKKyoJQ2FsbGluZyBoY2ZfZ2V0X21iX2luZm8gd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IEluZm8gYmxvY2sgYXZhaWxhYmxlIG9yIHdoZW4gdGhlcmUgaXMgbm8gTWFpbEJveCBhdCBhbGwsCisqCXJlc3VsdHMgaW4gYSAiTlVMTCIgTWFpbEJveCBJbmZvIGJsb2NrLgorKgorKjEyOglzZWUgTk9USUNFCisqMTc6IFRoZSByZXR1cm4gc3RhdHVzIG9mIGNtZF93YWl0IGFuZCB0aGUgZmlyc3QgaGNmaW9faW5fc3RyaW5nIGNhbiBiZSBpZ25vcmVkLCBiZWNhdXNlIHdoZW4gb25lIGZhaWxzLCB0aGUKKyoJb3RoZXIgZmFpbHMgdmlhIHRoZSBJRkJfRGVmdW5jdFN0YXQgbWVjaGFuaXNtCisqMjA6ICJIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApIiBpcyBub3Qgc3VpdGFibGUgYmVjYXVzZSB0aGlzIHdpbGwgYWx3YXlzIHRyaWdnZXIgYXMgc2lkZSBlZmZlY3Qgb2YKKyoJdGhlIEhDRkFTU0VSVCBpbiBoY2ZfcHV0X2luZm8gd2hpY2ggY2FsbHMgaGNmX2dldF9pbmZvIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB0aGUgUklEIGV4aXN0cyBhdCBhbGwuCisKKyouTk9USUNFCisqCisqCSJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzOgorKglDRkdfTUJfSU5GTywgQ0ZHX1RBTExJRVMsIENGR19EUlZfSURFTlRJVFksIENGR19EUlZfU1VQX1JBTkdFLCBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJLAorKglDRkdfRFJWX0FDVF9SQU5HRVNfU1RBLCBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJCisqCU5vdGUgdGhlIEhDRl9FUlJfTEVOIGlzIE5PVCBhZGVxdWF0ZWx5IHNldCwgd2hlbiBMID49IDIgYnV0IGxlc3MgdGhhbiBuZWVkZWQKKyoKKyoJUmVtYXJrczogVHJhbnNmZXJzIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyoJQ2FyZCBhbmQgZnJvbSB0aGUgSENGIHRvIHRoZSBNU0YuCisqCVRoZSBleGFjdCBsYXlvdXQgb2YgdGhlIHByb3ZpZGVkIGRhdGEgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIGFjdGlvbiBjb2RlLiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUKKyoJY29tcGxldGUgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiBieXRlcyBpbmRpY2F0ZWQgYnkgbGVuIGlzIGNvcGllZC4gIExlbgorKglhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gYmxvY2tzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQKKyoJSGVybWVzIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydCBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLiBJdCBpcyBhIGNvbnNjaW91cworKglkZWNpc2lvbiB0aGF0IHVudXNlZCBwYXJ0cyBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBhcmUgbm90IGNsZWFyZWQuCisqCisqCVJlbWFya3M6IFRoZSBvbmx5IGVycm9yIGFnYWluc3Qgd2hpY2ggaXMgcHJvdGVjdGVkIGlzIHRoZSAiUmVhZCBlcnJvciIgYXMgcmVzdWx0IG9mIENhcmQgcmVtb3ZhbC4gT25seSB0aGUKKyoJbGFzdCBoY2ZfaW9fc3RyaW5nIG5lZWQgdG8gYmUgcHJvdGVjdGVkIGJlY2F1c2UgaWYgdGhlIGZpcnN0IGZhaWxzIHRoZSBzZWNvbmQgd2lsbCBmYWlsIGFzIHdlbGwuIENoZWNraW5nCisqCWZvciBjbWRfZXhlIGVycm9ycyBpcyBzdXBwb3NlZCBzdXBlcmZsdW91cyBiZWNhdXNlIHByb2JsZW1zIGluIGNtZF9leGUgYXJlIGFscmVhZHkgY2F1Z2h0IG9yIHdpbGwgYmUKKyoJY2F1Z2h0IGJ5IGhjZl9lbmFibGUuCisqCisqCUNGR19NQl9JTkZPOiBjb3B5IHRoZSBvbGRlc3QgTWFpbEJveCBJbmZvIEJsb2NrIG9yIHRoZSAibnVsbCIgYmxvY2sgaWYgbm9uZSBhdmFpbGFibGUuCisqCisqCVRoZSBtZWNoYW5pc20gdG8gSENGX0FTU0VSVCBvbiBpbnZhbGlkIHR5cC1jb2RlcyBpbiB0aGUgTFRWIHJlY29yZCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OgorKgkgIC0gZHVyaW5nIHRoZSBwc2V1ZG8tYXN5bmNocm9ub3VzIEhlcm1lcyBjb21tYW5kcyAoZGlhZ25vc2UsIGRvd25sb2FkKQlvbmx5IENGR19NQl9JTkZPIGlzIGFjY2VwdGFibGUKKyoJICAtCXNvbWUgY29kZXMgKGUuZy4gQ0ZHX1RBTExJRVMpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKKyoJCWFyZSB2YWxpZAorKgkgIC0gYWxsIG90aGVyIGNvZGVzIGluIHRoZSByYW5nZSAweEZDMDAgdGhyb3VnaCAweEZGRkYgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiAgVGhlIEhlcm1lcyByZXR1cm5zIGFuCisqCQlMVFYgcmVjb3JkIHdpdGggYSB6ZXJvIHZhbHVlIGluIHRoZSBMLWZpZWxkIGZvciBhbGwgVHlwLWNvZGVzIGl0IGRvZXMgbm90IHJlY29nbml6ZS4gVGhpcyBpcworKgkJZGVmaW5lZCBhbmQgaW50ZW5kZWQgYmVoYXZpb3IsIHNvIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2ggb24gdGhpcyBwaGVub21lbmEuCisqCSAgLQlhbGwgcmVtYWluaW5nIGNvZGVzIGFyZSBpbnZhbGlkIGFuZCBjYXVzZSBhbiBBU1NFUlQuCisqCisqLkNPTkRJVElPTlMKKyogSW4gY2FzZSBvZiBVU0IsIEhDRl9NQVhfTVNHIDs/VVNFRDs/IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIGhjZl9nZXRfaW5mby4KKyoKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQKK2hjZl9nZXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQoreworCitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOworaGNmXzE2CQlsZW4gPSBsdHZwLT5sZW47CitoY2ZfMTYJCXR5cGUgPSBsdHZwLT50eXA7Cit3Y2lfcmVjb3JkcAlwID0gJmx0dnAtPmxlbjsJCS8vZGVzdGluYXRpb24gd29yZCBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQoraGNmXzE2CQkqcSA9IE5VTEw7CQkJCS8qIHNvdXJjZSB3b3JkIHBvaW50ZXIgIE5vdGUhISBET1MgQ09NIGNhbid0IGNvcGUgd2l0aCBGQVIKKwkJCQkJCQkJCSAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQorCQkJCQkJCQkJICovCitpbnQJCQlpOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9HRVRfSU5GTywgbHR2cC0+dHlwICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggbHR2cCwgMCApCisJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGx0dnAtPnR5cCwgbHR2cC0+bGVuICkgKQorCisJbHR2cC0+bGVuID0gMDsJCQkJCQkJCS8vZGVmYXVsdCB0bzogTm8gSW5mbyBBdmFpbGFibGUKKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQiAvL2ZpbHRlciBvdXQgYWxsIHNwZWNpYWxzCisJZm9yICggaSA9IDA7ICggcSA9IHh4eHhbaV0gKSAhPSBOVUxMICYmIHFbMV0gIT0gdHlwZTsgaSsrICkgLypOT1AqLzsKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lEIC8gSENGX0VYVF9NQgorI2lmIEhDRl9UQUxMSUVTCisJaWYgKCB0eXBlID09IENGR19UQUxMSUVTICkgewkJCQkJCQkJCQkJCQkvKjMqLworCQkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1RBTExJRVMgKTsKKwkJcSA9IChoY2ZfMTYqKSZpZmJwLT5JRkJfVGFsbHlMZW47CisJfQorI2VuZGlmIC8vIEhDRl9UQUxMSUVTCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorCWlmICggdHlwZSA9PSBDRkdfTUJfSU5GTyApIHsKKwkJaWYgKCBpZmJwLT5JRkJfTUJJbmZvTGVuICkgeworCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CisJCQkJaWZicC0+SUZCX01CUnAgPSAwOyAvLzs/UHJvYmFibHkgc3VwZXJmbHVvdXMKKwkJCX0KKwkJCXEgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CisJCQlpZmJwLT5JRkJfTUJScCArPSAqcSArIDE7CS8vdXBkYXRlIHJlYWQgcG9pbnRlcgorCQkJaWYgKCBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXSA9PSAweEZGRkYgKSB7CisJCQkJaWZicC0+SUZCX01CUnAgPSAwOworCQkJfQorCQkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOworCQl9CisJfQorI2VuZGlmIC8vIEhDRl9FWFRfTUIKKwlpZiAoIHEgIT0gTlVMTCApIHsJCQkJCQkvL2Egc3BlY2lhbCBvciBDRkdfVEFMTElFUyBvciBDRkdfTUJfSU5GTworCQlpID0gbWluKCBsZW4sICpxICkgKyAxOwkJCQkvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQorCQl3aGlsZSAoIGktLSApIHsKKwkJCSpwKysgPSAqcTsKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKKwkJCWlmICggcSA+ICZpZmJwLT5JRkJfVGFsbHlUeXAgJiYgdHlwZSA9PSBDRkdfVEFMTElFUyApIHsKKwkJCQkqcSA9IDA7CisJCQl9CisjZW5kaWYgLy8gSENGX1RBTExJRVNfUkVTRVQKKwkJCXErKzsKKwkJfQorCX0gZWxzZSB7CQkJCQkJCQkvLyBub3QgYSBzcGVjaWFsIG5vciBDRkdfVEFMTElFUyBub3IgQ0ZHX01CX0lORk8KKwkJaWYgKCB0eXBlID09IENGR19DTlRMX09QVCApIHsJCQkJCQkJCQkJLy9yZWFkIGJhY2sgZWZmZWN0aXZlIG9wdGlvbnMKKwkJCWx0dnAtPmxlbiA9IDI7CisJCQlsdHZwLT52YWxbMF0gPSBpZmJwLT5JRkJfQ250bE9wdDsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX05JQ19BQ0NFU1MKKwkJfSBlbHNlIGlmICggdHlwZSA9PSBDRkdfUFJPRF9EQVRBICkgeyAgLy9vbmx5IG5lZWRlZCBmb3Igc29tZSB0ZXN0IHRvb2wgb24gdG9wIG9mIEgtSUkgTkRJUyBkcml2ZXIKK2hjZl9pbwkJaW9fcG9ydDsKK3djaV9idWZwCXB0OwkJCQkJLy9wb2ludGVyIHdpdGggdGhlICJyaWdodCIgdHlwZSwganVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUID4+IDcpICk7CisJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikoUExVR19EQVRBX09GRlNFVCAmIDB4N0UpICk7CisJCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfQVVYX0RBVEE7CQkvL3RvIHByZXZlbnQgc2lkZSBlZmZlY3RzIG9mIHRoZSBNU0YtZGVmaW5lZCBtYWNybworCQkJcCA9IGx0dnAtPnZhbDsJCQkJCS8vZGVzdGluYXRpb24gY2hhciBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQorCQkJaWYgKCAoIGkgPSBsZW4gLSAxICkgPiAwICkgeworCQkJCXB0ID0gKHdjaV9idWZwKXA7CS8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQkJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIHB0LCBpICk7IC8vc3BhY2UgdXNlZCBieSBUOiAtMQorCQkJfQorCQl9IGVsc2UgaWYgKCB0eXBlID09IENGR19DTURfSENGICkgeworI2RlZmluZSBQICgoQ0ZHX0NNRF9IQ0ZfU1RSQ1QgRkFSICopbHR2cCkKKwkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKKwkJCWlmICggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MgKSB7CisJCQkJSENGQVNTRVJUKCBQLT5tb2RlIDwgaWZicC0+SUZCX0lPQmFzZSwgUC0+bW9kZSApCQkvL0NoZWNrIFJlZ2lzdGVyIHNwYWNlCisJCQkJbHR2cC0+bGVuID0gbWluKCBsZW4sIDQgKTsJCQkJCQkJCS8vUkVTVE9SRSBsdHYgbGVuZ3RoCisJCQkJUC0+YWRkX2luZm8gPSBJUFcoIFAtPm1vZGUgKTsKKwkJCX0KKyN1bmRlZiBQCisjZW5kaWYgLy8gSENGX0VYVF9OSUNfQUNDRVNTCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENGR19GV19QUklOVEYpIHsKKyAgICAgICAgICAgcmMgPSBmd19wcmludGYoaWZicCwgKENGR19GV19QUklOVEZfU1RSQ1QqKWx0dnApOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisJCX0gZWxzZSBpZiAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKSB7CisvLzs/IGJ5IHVzaW5nIEhDTURfQlVTWSBvcHRpb24gd2hlbiBjYWxsaW5nIGNtZF9leGUsIHVzaW5nIGEgZ2V0X2ZyYWcgd2l0aCBsZW5ndGggMCBqdXN0IHRvIHNldCB1cCB0aGUKKy8vOz8gQkFQIGFuZCBjYWxsaW5nIGNtZF9jbXBsLCB5b3UgY291bGQgbWVyZ2UgdGhlIDIgQnVzeSB3YWl0cy4gV2hldGhlciB0aGlzIHJlYWxseSBoZWxwcyAoYW5kIHdoYXQKKy8vOz8gd291bGQgYmUgdGhlIG9wdGltYWwgc2VxdWVuY2UgaW4gY21kX2V4ZSBhbmQgZ2V0X2ZyYWcpIHdvdWxkIGhhdmUgdG8gYmUgTUVBU1VSRUQKKy8qMTcqLwkJaWYgKCAoIHJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BQ0NFU1MsIHR5cGUgKSApID09IEhDRl9TVUNDRVNTICYmCisJCQkJICggcmMgPSBzZXR1cF9iYXAoIGlmYnAsIHR5cGUsIDAsIElPX0lOICkgKSA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZsdHZwLT5sZW4sIDIqbGVuKzIgQkVfUEFSKDIpICk7CisJCQkJaWYgKCBJUFcoIEhSRUdfU1RBVCApID09IDB4RkZGRiApIHsJCQkJCS8vTklDIHJlbW92YWwgdGVzdAorCQkJCQlsdHZwLT5sZW4gPSAwOworCQkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApCisJCQkJfQorCQkJfQorLyoxMiovCX0gZWxzZSBIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApIC8qTk9QKi87IC8vTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15CisJfQorCWlmICggbGVuIDwgbHR2cC0+bGVuICkgeworCQlsdHZwLT5sZW4gPSBsZW47CisJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlyYyA9IEhDRl9FUlJfTEVOOworCQl9CisJfQorCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MgfHwgKCByYyA9PSBIQ0ZfRVJSX0xFTiAmJiBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiAxPDxIQ0ZfVFJBQ0VfUFVUX0lORk8gKSwKKwkJCSAgIE1FUkdFXzIoIHR5cGUsIHJjICkgKQkJCQkJCQkJCQkJCQkJCQkvKjIwKi8KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfR0VUX0lORk8gKQorCXJldHVybiByYzsKK30gLy8gaGNmX2dldF9pbmZvCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCWludCBoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKKyouUFVSUE9TRQkJVHJhbnNmZXJzIG9wZXJhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgQ2FyZCBhbmQgdG8gdGhlIEhDRi4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglsdHZwCQlzcGVjaWZpZXMgdGhlIFJJRCAoYXMgZGVmaW5lZCBieSBIZXJtZXMgSS9GKSBvciBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKiEhCXZpYSBjbWRfZXhlCisqCUhDRl9FUlJfTk9fTklDIAkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCisqCUhDRl9FUlJfVElNRV9PVVQJRXhwZWN0ZWQgRi9XIGV2ZW50IGRpZCBub3Qgb2NjdXIgaW4gdGltZQorKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uCisqISEJdmlhIGRvd25sb2FkCQkJCUNGR19ETE5WX1NUQVJUIDw9IHR5cGUgPD0gQ0ZHX0RMX1NUT1AKKyohIQl2aWEgcHV0X2luZm8JCQkJQ0ZHX1JJRF9DRkdfTUlOIDw9IHR5cGUgPD0gQ0ZHX1JJRF9DRkdfTUFYCisqISEJdmlhIHB1dF9mcmFnCisqCisqLkRFU0NSSVBUSU9OCisqIFRoZSBMLWZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIChwcm92aWRlZCBieSB0aGUgTVNGIGluIHBhcmFtZXRlciBsdHZwKSBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyogVGhlIEwtdmFsdWUgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQuCisqIFRoZSBULSBmaWVsZCBzcGVjaWZpZXMgdGhlIFJJRCBwbGFjZWQgaW4gdGhlIFYtZmllbGQgYnkgdGhlIE1TRi4KKyoKKyogTm90IGFsbCBDRkctY29kZXMgY2FuIGJlIHVzZWQgZm9yIGhjZl9wdXRfaW5mby4gIFRoZSBmb2xsb3dpbmcgQ0ZHLWNvZGVzIGFyZSB2YWxpZCBmb3IgaGNmX3B1dF9pbmZvOgorKiBvIE9uZSBvZiB0aGUgQ0ZHLWNvZGVzIGluIHRoZSBncm91cCAiTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyIKKyogQ2hhbmdlcyBtYWRlIGJ5IGhjZl9wdXRfaW5mbyB0byBDRkdfY29kZXMgaW4gdGhpcyBncm91cCB3aWxsIG5vdCBhZmZlY3QgdGhlIEYvVworKiBhbmQgSENGIGJlaGF2aW9yIHVudGlsIGhjZl9jbnRsX3BvcnQoIEhDRl9QT1JUX0VOQUJMRSkgaXMgY2FsbGVkLgorKiBvIE9uZSBvZiB0aGUgQ0ZHLWNvZGVzIGluIHRoZSBncm91cCAiTmV0d29yayBQYXJhbWV0ZXJzLCBEeW5hbWljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMiCisqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIHdpbGwgYWZmZWN0IHRoZSBGL1cgYW5kIEhDRiBiZWhhdmlvciBpbW1lZGlhdGVseS4KKyogbyBDRkdfUFJPRy4KKyogVGhpcyBjb2RlIGlzIHVzZWQgdG8gaW5pdGlhdGUgYW5kIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyB0byBkb3dubG9hZCBkYXRhIGVpdGhlciB0bworKiB2b2xhdGlsZSBvciB0byBub24tdm9sYXRpbGUgUkFNIG9uIHRoZSBOSUMgYXMgd2VsbCBhcyBmb3IgdGhlIGFjdHVhbCBkb3dubG9hZC4KKyogbyBDRkctY29kZXMgcmVsYXRlZCB0byB0aGUgSENGIGJlaGF2aW9yLgorKiBUaGUgcmVsYXRlZCBDRkctY29kZXMgYXJlOgorKiAgLSBDRkdfUkVHX01CCisqICAtIENGR19SRUdfQVNTRVJUX1JUTlAKKyogIC0gQ0ZHX1JFR19JTkZPX0xPRworKiAgLSBDRkdfQ01EX05JQworKiAgLSBDRkdfQ01EX0RPTkdMRQorKiAgLSBDRkdfQ01EX0hDRgorKiAgLSBDRkdfTk9USUZZCisqCisqIEFsbCBMVFYtcmVjb3JkcyAidW5rbm93biIgdG8gdGhlIEhDRiBhcmUgZm9yd2FyZGVkIHRvIHRoZSBGL1cuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgorKiAtIGhjZl9wdXRfaW5mbyB3YXMgY2FsbGVkIHdpdGhvdXQgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdAorKiAtIHR5cGUgZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgaXMgaW52YWxpZCwgaS5lLiBuZWl0aGVyIEhDRiBub3IgRi9XIGNhbiBoYW5kbGUgdGhlIHZhbHVlLgorKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyBsZXNzIHRoYW4gMSBvciBleGNlZWRzIE1BWF9MVFZfU0laRS4KKyogLSByZWdpc3RlcmluZyBhIE1haWxCb3ggd2l0aCBzaXplIGxlc3MgdGhhbiA2MCBvciBhIG5vbi1hbGlnbmVkIGJ1ZmZlciBhZGRyZXNzIGlzIHVzZWQuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0CisqCU5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyoJUmVtYXJrczogIEluIGNhc2Ugb2YgSGVybWVzIENvbmZpZ3VyYXRpb24gTFRWcywgdGhlIGNvZGVzIGZvciB0aGUgdHlwZSBhcmUgImNsZXZlcmx5IiBjaG9zZW4gdG8gYmUKKyoJaWRlbnRpY2FsIHRvIHRoZSBSSUQuIEhlcm1lcyBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZSBpbnRvIHRoZQorKglDYXJkLgorKglJbiBjYXNlIG9mIEhDRiBDb25maWd1cmF0aW9uIExUVnMsIHRoZSB0eXBlIHZhbHVlcyBhcmUgY2hvc2VuIGluIGEgcmFuZ2Ugd2hpY2ggZG9lcyBub3Qgb3ZlcmxhcCB0aGUKKyoJUklELXJhbmdlLgorKgorKjIwOgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKK3sKK2ludCByYyA9IEhDRl9TVUNDRVNTOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9QVVRfSU5GTywgbHR2cC0+dHlwICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggbHR2cCwgMCApCisJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIGx0dnAtPmxlbiApCisKKwkJCQkJCQkJCQkJLy9hbGwgY29kZXMgYmV0d2VlbiAweEZBMDAgYW5kIDB4RkNGRiBhcmUgcGFzc2VkIHRvIEhlcm1lcworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyB7CWhjZl8xNiBpOworCWhjZl8zMiBGQVIgKiBrZXlfcDsKKworCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSB8fCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgKSB7CisJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfTUFQUEVEX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKKwkJaSA9IFRYX0tFWTsJCS8vaS5lLiBUeEtleUluZGljYXRvciA9PSAxLCBLZXlJRCA9PSAwCisJCWlmICggbHR2cC0+dHlwID09IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSApIHsKKwkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CisJCQlpID0gQ05WX0xJVFRMRV9UT19TSE9SVCgoKENGR19BRERfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dGtpcF9rZXlfaWRfaW5mbyk7CisJCX0KKwkJaWYgKCBpICYgVFhfS0VZICkgewkvKiBUeEtleUluZGljYXRvciA9PSAxCisJCQkJCQkJICAgKGVpdGhlciByZWFsbHkgc2V0IGJ5IE1TRiBpbiBjYXNlIG9mIERFRkFVTFQgb3IgZmFrZWQgYnkgSENGIGluIGNhc2Ugb2YgTUFQUEVEICkgKi8KKwkJCWlmYnAtPklGQl9NSUNUeENudGwgPSAoaGNmXzE2KSggSEZTX1RYX0NOVExfTUlDIHwgKGkgJiBLRVlfSUQgKTw8OCApOworCQkJaWZicC0+SUZCX01JQ1R4S2V5WzBdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSgga2V5X3AgKTsKKwkJCWlmYnAtPklGQl9NSUNUeEtleVsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCsxKSApOworCQl9CisJCWkgPSAoIGkgJiBLRVlfSUQgKSAqIDI7CisJCWlmYnAtPklGQl9NSUNSeEtleVtpXSAgID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzIpICk7CisJCWlmYnAtPklGQl9NSUNSeEtleVtpKzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzMpICk7CisJfQorI2RlZmluZSBQICgoQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApCisJaWYgKCAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSApCXx8CisJCSAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKKwkJICAgKCAoaWZicC0+SUZCX01JQ1R4Q250bCA+PiA4KSAmIEtFWV9JRCApID09IENOVl9TSE9SVF9UT19MSVRUTEUoUC0+dGtpcF9rZXlfaWQgKQorCQkgKQorCQkpIHsgaWZicC0+SUZCX01JQ1R4Q250bCA9IDA7IH0JCS8vZGlzYWJsZSBNSUMtZW5naW5lCisjdW5kZWYgUAorIH0KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworCWlmICggbHR2cC0+dHlwID09IENGR19QUk9HICkgeworCQlyYyA9IGRvd25sb2FkKCBpZmJwLCAoQ0ZHX1BST0dfU1RSQ1QgRkFSICopbHR2cCApOworCX0gZWxzZSBzd2l0Y2ggKGx0dnAtPnR5cCkgeworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgorCSAgY2FzZSBDRkdfUkVHX0FTU0VSVF9SVE5QOgkJCQkJCQkJCQkJLy9SZWdpc3RlciBNU0YgUm91dGluZXMKKyNkZWZpbmUgUCAoKENGR19SRUdfQVNTRVJUX1JUTlBfU1RSQ1QgRkFSICopbHR2cCkKKwkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IFAtPnJ0bnA7CisvLwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IFAtPmx2bDsJCS8vVE9ETyBub3QgeWV0IHN1cHBvcnRlZCBzbyBkZWZhdWx0IGlzIHNldCBpbiBoY2ZfY29ubmVjdAorCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSENGX0FTU0VSVCwgMHhDQUYxICkgKQkvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCisjdW5kZWYgUAorCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCisJICBjYXNlIENGR19SRUdfSU5GT19MT0c6CQkJCQkJCQkJCQkvL1JlZ2lzdGVyIExvZyBmaWx0ZXIKKwkJaWZicC0+SUZCX1JJRExvZ3AgPSAoKENGR19SSURfTE9HX1NUUkNUIEZBUiopbHR2cCktPnJlY29yZHA7CisJCWJyZWFrOworI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKwkgIGNhc2UgQ0ZHX0NOVExfT1BUOgkJCQkJCQkJCQkJCS8vb3ZlcnJ1bGUgb3B0aW9uCisJCUhDRkFTU0VSVCggKCBsdHZwLT52YWxbMF0gJiB+KFVTRV9ETUEgfCBVU0VfMTZCSVQpICkgPT0gMCwgbHR2cC0+dmFsWzBdICkKKwkJaWYgKCAoIGx0dnAtPnZhbFswXSAmIFVTRV9ETUEgKSA9PSAwICkgaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV9ETUE7CisJCWlmYnAtPklGQl9DbnRsT3B0IHw9ICBsdHZwLT52YWxbMF0gJiBVU0VfMTZCSVQ7CisJCWJyZWFrOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKwkgIGNhc2UgQ0ZHX1JFR19NQjoJCQkJCQkJCQkJCQkJLy9SZWdpc3RlciBNYWlsQm94CisjZGVmaW5lIFAgKChDRkdfUkVHX01CX1NUUkNUIEZBUiAqKWx0dnApCisJCUhDRkFTU0VSVCggKCAoaGNmXzMyKVAtPm1iX2FkZHIgJiAweDAwMDEgKSA9PSAwLCAoaGNmXzMyKVAtPm1iX2FkZHIgKQorCQlIQ0ZBU1NFUlQoIChQKS0+bWJfc2l6ZSA+PSA2MCwgKFApLT5tYl9zaXplICkKKwkJaWZicC0+SUZCX01CcCA9IFAtPm1iX2FkZHI7CisJCS8qIGlmIG5vIE1CIHByZXNlbnQsIHNpemUgbXVzdCBiZSAwIGZvciA7P3RoZSBvbGQ7PyBwdXRfaW5mb19tYiB0byB3b3JrIGNvcnJlY3RseSAqLworCQlpZmJwLT5JRkJfTUJTaXplID0gaWZicC0+SUZCX01CcCA9PSBOVUxMID8gMCA6IFAtPm1iX3NpemU7CisJCWlmYnAtPklGQl9NQldwID0gaWZicC0+SUZCX01CUnAJPSAwOworCQlpZmJwLT5JRkJfTUJwWzBdID0gMDsJCQkJCQkJCQkJCS8vZmxhZyB0aGUgTWFpbEJveCBhcyBlbXB0eQorCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gMDsKKwkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplID49IDYwIHx8IGlmYnAtPklGQl9NQnAgPT0gTlVMTCwgaWZicC0+SUZCX01CU2l6ZSApCisjdW5kZWYgUAorCQlicmVhazsKKwkgIGNhc2UgQ0ZHX01CX0lORk86CQkJCQkJCQkJCQkJCS8vc3RvcmUgTWFpbEJveEluZm9CbG9jaworCQlyYyA9IHB1dF9pbmZvX21iKCBpZmJwLCAoQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICopbHR2cCApOworCQlicmVhazsKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX05JQ19BQ0NFU1MKKwkgIGNhc2UgQ0ZHX0NNRF9OSUM6CisjZGVmaW5lIFAgKChDRkdfQ01EX05JQ19TVFJDVCBGQVIgKilsdHZwKQorCQlPUFcoIEhSRUdfUEFSQU1fMiwgUC0+cGFybTIgKTsKKwkJT1BXKCBIUkVHX1BBUkFNXzEsIFAtPnBhcm0xICk7CisJCXJjID0gY21kX2V4ZSggaWZicCwgUC0+Y21kLCBQLT5wYXJtMCApOworCQlQLT5oY2Zfc3RhdCA9IChoY2ZfMTYpcmM7CisJCVAtPnN0YXQgPSBJUFcoIEhSRUdfU1RBVCApOworCQlQLT5yZXNwMCA9IElQVyggSFJFR19SRVNQXzAgKTsKKwkJUC0+cmVzcDEgPSBJUFcoIEhSRUdfUkVTUF8xICk7CisJCVAtPnJlc3AyID0gSVBXKCBIUkVHX1JFU1BfMiApOworCQlQLT5pZmJfZXJyX2NtZCA9IGlmYnAtPklGQl9FcnJDbWQ7CisJCVAtPmlmYl9lcnJfcXVhbGlmaWVyID0gaWZicC0+SUZCX0VyclF1YWxpZmllcjsKKyN1bmRlZiBQCisJCWJyZWFrOworCSAgY2FzZSBDRkdfQ01EX0hDRjoKKyNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCisJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKKwkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKKwkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQorCQkJT1BXKCBQLT5tb2RlLCBQLT5hZGRfaW5mbyk7CisJCX0KKyN1bmRlZiBQCisJCWJyZWFrOworI2VuZGlmIC8vIEhDRl9FWFRfTklDX0FDQ0VTUworCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9QUklOVEYKKyAgICAgIGNhc2UgQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT046CisgICAgICAgIGlmYnAtPklGQl9Gd1BmQnVmZiA9ICooQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QqKWx0dnA7CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCisKKwkgIGRlZmF1bHQ6CQkJCQkJLy9wYXNzIGV2ZXJ5dGhpbmcgdW5rbm93biBhYm92ZSB0aGUgIkZJRCIgcmFuZ2UgdG8gdGhlIEhlcm1lcyBvciBEb25nbGUKKwkJcmMgPSBwdXRfaW5mbyggaWZicCwgbHR2cCApOworCX0KKwkvL0RPIE5PVCAhISEgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQkJCQkJCQkJCQkJCS8qIDIwICovCisJSENGTE9HRVhJVCggSENGX1RSQUNFX1BVVF9JTkZPICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9wdXRfaW5mbworCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX3Jjdl9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIHVuc2lnbmVkIGludCBvZmZzZXQgKQorKi5QVVJQT1NFCQlBbGw6IGRlY2Fwc3VsYXRlIGEgbWVzc2FnZS4KKyoJCQkJcHJlLUhlcm1lc0lJLjU6IHZlcmlmeSBNSUMuCisqCQkJCW5vbi1VU0IsIG5vbi1ETUEgbW9kZTogVHJhbnNmZXIgYSBtZXNzYWdlIGZyb20gdGhlIE5JQyB0byB0aGUgSG9zdCBhbmQgYWNrbm93bGVkZ2UgcmVjZXB0aW9uLgorKgkJCQlVU0I6IFRyYW5zZm9ybSBhIG1lc3NhZ2UgZnJvbSBwcm9wcmlldGFyeSBVU0IgZm9ybWF0IHRvIDgwMi4zIGZvcm1hdAorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWRlc2NwCQlQb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yIExpc3QgbG9jYXRpb24uCisqCW9mZnNldAkJVVNCOiBub3QgdXNlZAorKgkJCQlub24tVVNCOiBzcGVjaWZpZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSB0byBiZSBvYnRhaW5lZCAoMCBjb3JyZXNwb25kcyB3aXRoIERlc3RBZGRyIGZpZWxkCisqCQkJCW9mIGZyYW1lKS4KKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUwkJCU5vIFNTTiBlcnJvciAoIG9yIEhDRl9FUlJfTUlDIGFscmVhZHkgcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQorKglIQ0ZfRVJSX01JQwkJCW1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAoIEhDRl9TVUNDRVNTIGlzIHJlcG9ydGVkIGlmIEhDRl9FUlJfTUlDIGlzIGFscmVhZHkKKyoJCQkJCQlyZXBvcnRlZCBieSBoY2Zfc2VydmljZV9uaWMpCisqIAlIQ0ZfRVJSX05PX05JQwkJTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCisqIAlIQ0ZfRVJSX0RFRlVOQ1QuLi4KKyoKKyouREVTQ1JJUFRJT04KKyogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjYW4gYmUgZXhlY3V0ZWQgYnkgdGhlIE1TRiB0byBvYnRhaW4gdGhlIERhdGEgSW5mbyBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgdGhhdAorKiBpcyByZXBvcnRlZCB0byBiZSBhdmFpbGFibGUgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uLgorKgorKiBUaGUgUmVjZWl2ZSBNZXNzYWdlIEZ1bmN0aW9uIGNvcGllcyB0aGUgbWVzc2FnZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgQ2FyZCBtZW1vcnkgaW50byBhIGJ1ZmZlciBzdHJ1Y3R1cmUKKyogcHJvdmlkZWQgYnkgdGhlIE1TRi4KKyogT25seSBkYXRhIG9mIHRoZSBtZXNzYWdlIGluZGljYXRlZCBieSB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gY2FuIGJlIG9idGFpbmVkLgorKiBFeGVjdXRpb24gb2YgdGhlIFNlcnZpY2UgTklDIGZ1bmN0aW9uIG1heSByZXN1bHQgaW4gdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5ldyBtZXNzYWdlLCBidXQgaXQgZGVmaW5pdGVseQorKiBtYWtlcyB0aGUgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgcHJlY2VkaW5nIFNlcnZpY2UgTklDIGZ1bmN0aW9uLCB1bmF2YWlsYWJsZS4KKyoKKyogaW4gbm9uLVVTQi9ub24tRE1BIG1vZGUsIGhjZl9yY3ZfbXNnIHN0YXJ0cyB0aGUgY29weSBwcm9jZXNzIGF0IHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQgcmVxdWVzdGVkIGJ5IHRoZQorKiBwYXJhbWV0ZXIgb2Zmc2V0LCByZWxhdGl2ZSB0byBIRlNfQUREUl9ERVNULCBlLmcgb2Zmc2V0IDAgc3RhcnRzIGNvcHlpbmcgZnJvbSB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgdGhlCisqIHZlcnkgYmVnaW4gb2YgdGhlIDgwMi4zIGZyYW1lIG1lc3NhZ2UuIE9mZnNldCBtdXN0IGVpdGhlciBsYXkgd2l0aGluIHRoZSBwYXJ0IG9mIHRoZSA4MDIuMyBmcmFtZSBhcyBzdG9yZWQKKyogYnkgaGNmX3NlcnZpY2VfbmljIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yIGJlIGp1c3QgYmVoaW5kIGl0LCBpLmUuIHRoZSBmaXJzdCBieXRlIG5vdCB5ZXQgcmVhZC4KKyogV2hlbiBvZmZzZXQgaXMgd2l0aGluIGxvb2thaGVhZCwgZGF0YSBpcyBjb3BpZWQgZnJvbSBsb29rYWhlYWQuCisqIFdoZW4gb2Zmc2V0IGlzIGJleW9uZCBsb29rYWhlYWQsIGRhdGEgaXMgcmVhZCBkaXJlY3RseSBmcm9tIFJ4RlMgaW4gTklDIHdpdGggZGlzcmVnYXJkIG9mIHRoZSBhY3R1YWwgdmFsdWUKKyogb2Ygb2Zmc2V0CisqCisqLk5PVElDRToKKyogbyBhdCBlbnRyeTogbG9vayBhaGVhZCBidWZmZXIgYXMgcGFzc2VkIHdpdGggaGNmX3NlcnZpY2VfbmljIGlzIHN0aWxsIGFjY2Vzc2libGUgYW5kIHVuY2hhbmdlZAorKiBvIGF0IGV4aXQ6IFJlY2VpdmUgRnJhbWUgaW4gTklDIG1lbW9yeSBpcyByZWxlYXNlZAorKgorKiBEZXNjcmlwdGlvbjoKKyogU3RhcnRpbmcgYXQgdGhlIGJ5dGUgaW5kaWNhdGVkIGJ5IHRoZSBPZmZzZXQgdmFsdWUsIHRoZSBieXRlcyBhcmUgY29waWVkIGZyb20gdGhlIERhdGEgSW5mbworKiBQYXJ0IG9mIHRoZSBjdXJyZW50IFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIHRvIHRoZSBIb3N0IG1lbW9yeSBkYXRhIGJ1ZmZlciBzdHJ1Y3R1cmUKKyogaWRlbnRpZmllZCBieSBkZXNjcC4KKyogVGhlIG1heGltdW0gdmFsdWUgZm9yIE9mZnNldCBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgdGhlIDgwMi4zIGZyYW1lIHJlYWQgaW50byB0aGUKKyogbG9vayBhaGVhZCBidWZmZXIgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciBzaXplIG1pbnVzCisqIENvbnRyb2wgYW5kIDgwMi4xMSBmaWVsZHMpCisqIElmIE9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gdmFsdWUsIGNvcHlpbmcgc3RhcnRzIGZyb20gdGhlIGxvb2sgYWhlYWQgYnVmZmVyIHRpbGwgdGhlCisqIGVuZCBvZiB0aGF0IGJ1ZmZlciBpcyByZWFjaGVkCisqIFRoZW4gKG9yIGlmIHRoZSBtYXhpbXVtIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgT2Zmc2V0KSwgdGhlCisqIG1lc3NhZ2UgaXMgZGlyZWN0bHkgY29waWVkIGZyb20gTklDIG1lbW9yeSB0byBIb3N0IG1lbW9yeS4KKyogSWYgYW4gaW52YWxpZCAoaS5lLiB0b28gbGFyZ2UpIG9mZnNldCBpcyBzcGVjaWZpZWQsIGFuIGFzc2VydCBjYXRjaGVzIGJ1dCB0aGUgYnVmZmVyIGNvbnRlbnRzIGFyZQorKiB1bmRlZmluZWQuCisqIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyOgorKiBvIHRoZSBlbmQgb2YgdGhlIDgwMi4zIGZyYW1lIGlzIHJlYWNoZWQKKyogbyB0aGUgRGVzY3JpcHRvciB3aXRoIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkCisqCisqIFdoZW4gdGhlIGNvcHlpbmcgc3RvcHMsIHRoZSByZWNlaXZlciBpcyBhY2snZWQsIHRodXMgZnJlZWluZyB0aGUgTklDIG1lbW9yeSB3aGVyZSB0aGUgZnJhbWUgaXMgc3RvcmVkCisqIEFzIGEgY29uc2VxdWVuY2UsIGhjZl9yY3ZfbXNnIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciBhbnkgcGFydGljdWxhciBSeCBmcmFtZS4KKyoKKyogRm9yIHRoZSB0aW1lIGJlaW5nIChQQ0kgQnVzIG1hc3RlcmluZyBub3QgeWV0IHN1cHBvcnRlZCksIG9ubHkgdGhlIGZvbGxvd2luZyBmaWVsZHMgb2YgZWFjaAorKiBvZiB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBtdXN0IGJlIHNldCBieSB0aGUgTVNGOgorKiBvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0KKyogbyAqbmV4dF9kZXNjX2FkZHIKKyogbyAqYnVmX2FkZHIKKyogQXQgcmV0dXJuIGZyb20gaGNmX3Jjdl9tc2csIHRoZSBmaWVsZCBidWZfY250bC5idWZfZGltWzBdIG9mIHRoZSB1c2VkIERlc2NyaXB0b3JzIHJlZmxlY3RzCisqIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIERlc2NyaXB0b3IuCisqIE9uIHRoZSBsYXN0IHVzZWQgRGVzY3JpcHRvciwgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBsZXNzIG9yIGVxdWFsIHRvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0uCisqIE9uIGFsbCBwcmVjZWRpbmcgRGVzY3JpcHRvcnMgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBlcXVhbCB0byBidWZfY250bC5idWZfZGltWzFdLgorKiBPbiBhbGwgc3VjY2VlZGluZyAodW51c2VkKSBEZXNjcmlwdG9ycywgYnVmX2NudGwuYnVmX2RpbVswXSBpcyB6ZXJvLgorKiBOb3RlOiB0aGlzIEkvRiBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbnMgaG93IHRoZSBJL0YgbmVlZGVkIGZvciBQQ0kgQnVzIG1hc3RlcmluZyB3aWxsCisqIGJlLCBzbyBpdCBtYXkgY2hhbmdlLgorKgorKiBUaGUgbW9zdCBsaWtlbHkgaGFuZGxpbmcgb2YgSENGX0VSUl9OT19OSUMgYnkgdGhlIE1TRiBpcyB0byBkcm9wIHRoZSBhbHJlYWR5IGNvcGllZAorKiBkYXRhIGFzIGVsZWdhbnRseSBhcyBwb3NzaWJsZSB1bmRlciB0aGUgY29uc3RyYWludHMgYW5kIHJlcXVpcmVtZW50cyBwb3NlZCBieSB0aGUgKE4pT1MuCisqIElmIG5vIHJlY2VpdmVkIEZyYW1lIFN0cnVjdHVyZSBpcyBwZW5kaW5nLCAiU3VjY2VzcyIgcmF0aGVyIHRoYW4gIlJlYWQgZXJyb3IiIGlzIHJldHVybmVkLgorKiBUaGlzIGVycm9yIGNvbnN0aXR1dGVzIGEgbG9naWMgZmxhdyBpbiB0aGUgTVNGCisqIFRoZSBIQ0YgY2FuIG9ubHkgY2F0Y2ggYSBtaW5vcml0eSBvZiB0aGlzCisqIHR5cGUgb2YgZXJyb3JzCisqIEJhc2VkIG9uIGNvbnNpc3RlbmN5IGlkZWFzLCB0aGUgSENGIGNhdGNoZXMgbm9uZSBvZiB0aGVzZSBlcnJvcnMuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQorKiAtIHRoZXJlIGlzIG5vIHVuYWNrbm93bGVkZ2VkIFJ4LW1lc3NhZ2UgYXZhaWxhYmxlCisqIC0gb2Zmc2V0IGlzIG91dCBvZiByYW5nZSAob3V0c2lkZSBsb29rIGFoZWFkIGJ1ZmZlcikKKyogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgorKiAtIGFueSBvZiB0aGUgZGVzY3JpcHRvcnMgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uCisqIAlhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyogLSBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKiAtIGJ5IHVzaW5nIHVuc2lnbmVkIGludCBhcyB0eXBlIGZvciBvZmZzZXQsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbmVnYXRpdmUgb2Zmc2V0cworKiAtIEFzc2VydGluZyBvbiBiZWluZyBlbmFibGVkL3ByZXNlbnQgaXMgc3VwZXJmbHVvdXMsIHNpbmNlIGEgbm9uLXplcm8gSUZCX2xhbCBpbXBsaWVzIHRoYXQgaGNmX3NlcnZpY2VfbmljCisqICAgd2FzIGNhbGxlZCBhbmQgZGV0ZWN0ZWQgYSBSeC1tZXNzYWdlLiBBIHplcm8gSUZCX2xhbCB3aWxsIHNldCB0aGUgQlVGX0NOVCBmaWVsZCBvZiBhdCBsZWFzdCB0aGUgZmlyc3QKKyogICBkZXNjcmlwdG9yIHRvIHplcm8uCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCit7CitpbnQJCQlyYyA9IEhDRl9TVUNDRVNTOword2NpX2J1ZnAJY3A7CQkJCQkJCQkJCS8vY2hhciBvcmllbnRlZCB3b3JraW5nIHBvaW50ZXIKK2hjZl8xNgkJaTsKK2ludAkJCXRvdF9sZW4gPSBpZmJwLT5JRkJfUnhMZW4gLSBvZmZzZXQ7CQkvL3RvdGFsIGxlbmd0aAord2NpX2J1ZnAJbGFwID0gaWZicC0+SUZCX2xhcCArIG9mZnNldDsJCQkvL3N0YXJ0IGFkZHJlc3MgaW4gTG9va0FoZWFkIEJ1ZmZlcgoraGNmXzE2CQlsYWwgPSBpZmJwLT5JRkJfbGFsIC0gb2Zmc2V0OwkJCS8vYXZhaWxhYmxlIGRhdGEgd2l0aGluIExvb2tBaGVhZCBCdWZmZXIKK2hjZl8xNgkJajsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfUkNWX01TRywgb2Zmc2V0ICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCUhDRkFTU0VSVCggZGVzY3AsIEhDRl9UUkFDRV9SQ1ZfTVNHICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeExlbiwgSENGX1RSQUNFX1JDVl9NU0cgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuID49IG9mZnNldCwgTUVSR0VfMiggb2Zmc2V0LCBpZmJwLT5JRkJfUnhMZW4gKSApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfbGFsID49IG9mZnNldCwgb2Zmc2V0ICkKKwlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQSApCisKKwlpZiAoIHRvdF9sZW4gPCAwICkgeworCQlsYWwgPSAwOyB0b3RfbGVuID0gMDsJCQkJLy9zdXBwcmVzcyBhbGwgY29weWluZyBhY3Rpdml0eSBpbiB0aGUgZG8tLXdoaWxlIGxvb3AKKwl9CisJZG8gewkJCQkJCQkJCS8vbG9vcCBvdmVyIGFsbCBhdmFpbGFibGUgZnJhZ21lbnRzCisJCS8vIG9ibm94aW91cyBoY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlcgorCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKQorCQljcCA9IGRlc2NwLT5idWZfYWRkcjsKKwkJaiA9IG1pbiggKGhjZl8xNil0b3RfbGVuLCBkZXNjcC0+QlVGX1NJWkUgKTsJLy9taW5pbXVtIG9mICJ3aGF0J3NgIGF2YWlsYWJsZSIgYW5kIGZyYWdtZW50IHNpemUKKwkJZGVzY3AtPkJVRl9DTlQgPSBqOworCQl0b3RfbGVuIC09IGo7CQkJCQkJLy9hZGp1c3QgbGVuZ3RoIHN0aWxsIHRvIGdvCisJCWlmICggbGFsICkgewkJCQkJCS8vaWYgbG9va2FoZWFkIEJ1ZmZlciBub3QgeWV0IGNvbXBsZXRlbHkgY29waWVkCisJCQlpID0gbWluKCBsYWwsIGogKTsJCQkJLy9taW5pbXVtIG9mICJ3aGF0J3MgYXZhaWxhYmxlIiBpbiBMb29rQWhlYWQgYW5kIGZyYWdtZW50IHNpemUKKwkJCWxhbCAtPSBpOwkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gTG9va0FoZWFkCisJCQlqIC09IGk7CQkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gY3VycmVudCBmcmFnbWVudAorCQkJLyo7PyB3aGlsZSBsb29wIGNvdWxkIGJlIGltcHJvdmVkIGJ5IG1vdmluZyB3b3JkcyBidXQgdGhhdCBpcyBjb21wbGljYXRlZCBvbiBwbGF0Zm9ybXMgd2l0aAorCQkJICogYWxpZ25tZW50IHJlcXVpcmVtZW50cyovCisJCQl3aGlsZSAoIGktLSApICpjcCsrID0gKmxhcCsrOworCQl9CisJCWlmICggaiApIHsJLy9pZiBMb29rQWhlYWQgQnVmZmVyIGV4aGF1c3RlZCBidXQgc3RpbGwgc3BhY2UgaW4gZnJhZ21lbnQsIGNvcHkgZGlyZWN0bHkgZnJvbSBOSUMgUkFNCisJCQlnZXRfZnJhZyggaWZicCwgY3AsIGogQkVfUEFSKDApICk7CisJCQlDQUxDX1JYX01JQyggY3AsIGogKTsKKwkJfQorCX0gd2hpbGUgKCAoIGRlc2NwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKwlpZiAoIGlmYnAtPklGQl9SeEZJRCApIHsKKwkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsJCQkJLy9wcmV2ZW50cyBNSUMgZXJyb3IgcmVwb3J0IGlmIGhjZl9zZXJ2aWNlX25pYyBhbHJlYWR5IGNvbnN1bWVkIGFsbAorCX0KKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKwkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJLy9vbmx5IDEgc2hvdCB0byBnZXQgdGhlIGRhdGEsIHNvIGZyZWUgdGhlIHJlc291cmNlcyBpbiB0aGUgTklDCisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9SQ1ZfTVNHICkKKwlyZXR1cm4gcmM7Cit9IC8vIGhjZl9yY3ZfbXNnCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLk1PRFVMRQkJaW50IGhjZl9zZW5kX21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaGNmXzE2IHR4X2NudGwgKQorKi5QVVJQT1NFCQlFbmNhcHN1bGF0ZSBhIG1lc3NhZ2UgYW5kIGFwcGVuZCBwYWRkaW5nIGFuZCBNSUMuCisqCQkJCW5vbi1VU0I6IFRyYW5zZmVycyB0aGUgcmVzdWx0aW5nIG1lc3NhZ2UgZnJvbSBIb3N0IHRvIE5JQyBhbmQgaW5pdGlhdGVzIHRyYW5zbWlzc2lvbi4KKyoJCQkJVVNCOiBUcmFuc2ZlciByZXN1bHRpbmcgbWVzc2FnZSBpbnRvIGEgZmxhdCBidWZmZXIuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJZGVzY3AJCXBvaW50ZXIgdG8gdGhlIERlc2NyaXB0b3JMaXN0IG9yIE5VTEwKKyoJdHhfY250bAkJaW5kaWNhdGVzIE1BQy1wb3J0IGFuZCAoSGVybWVzKSBvcHRpb25zCisqCQkJCQlIRlNfVFhfQ05UTF9TUEVDVFJBTElOSworKgkJCQkJSEZTX1RYX0NOVExfUFJJTworKgkJCQkJSEZTX1RYX0NOVExfVFhfT0sKKyoJCQkJCUhGU19UWF9DTlRMX1RYX0VYCisqCQkJCQlIRlNfVFhfQ05UTF9UWF9ERUxBWQorKgkJCQkJSEZTX1RYX0NOVExfVFhfQ09OVAorKgkJCQkJSENGX1BPUlRfMAkJCQkgTUFDIFBvcnQgMCAoZGVmYXVsdCkKKyoJCQkJCUhDRl9QT1JUXzEgKEFQIG9ubHkpCSBNQUMgUG9ydCAxCisqCQkJCQlIQ0ZfUE9SVF8yIChBUCBvbmx5KQkgTUFDIFBvcnQgMgorKgkJCQkJSENGX1BPUlRfMyAoQVAgb25seSkJIE1BQyBQb3J0IDMKKyoJCQkJCUhDRl9QT1JUXzQgKEFQIG9ubHkpCSBNQUMgUG9ydCA0CisqCQkJCQlIQ0ZfUE9SVF81IChBUCBvbmx5KQkgTUFDIFBvcnQgNQorKgkJCQkJSENGX1BPUlRfNiAoQVAgb25seSkJIE1BQyBQb3J0IDYKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX0RFRlVOQ1RfLi4KKyoJSENGX0VSUl9USU1FX09VVAorKgorKi5ERVNDUklQVElPTjoKKyogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBlbWJvZGllcyAyIGZ1bmN0aW9uczoKKyogbyB0cmFuc2ZlcnMgYSBtZXNzYWdlIChpbmNsdWRpbmcgTUFDIGhlYWRlcikgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyIHN0cnVjdHVyZSBpbiBIb3N0IG1lbW9yeSB0byB0aGUgVHJhbnNtaXQKKyogRnJhbWUgU3RydWN0dXJlIChUeEZTKSBpbiBOSUMgbWVtb3J5LgorKiBvIElzc3VlIGEgc2VuZCBjb21tYW5kIHRvIHRoZSBGL1cgdG8gYWN0dWFsbHkgdHJhbnNtaXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBUeEZTLgorKgorKiBDb250cm9sIGlzIGJhc2VkIG9uIHRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgSUZCX1JzY0luZC4KKyogVGhlIFJlc291cmNlIEluZGljYXRvciBpcyBtYWludGFpbmVkIGJ5IHRoZSBIQ0YgYW5kIHNob3VsZCBvbmx5IGJlIGludGVycHJldGVkIGJ1dCBub3QgY2hhbmdlZCBieSB0aGUgTVNGLgorKiBUaGUgTVNGIG11c3QgY2hlY2sgSUZCX1JzY0luZCB0byBiZSBub24temVybyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBjYWxsIHRvIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24uCisqIFdoZW4gbm8gcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUsIHRoZSBNU0YgbXVzdCBoYW5kbGUgdGhlIHF1ZXVpbmcgb2YgdGhlIFRyYW5zbWl0IGZyYW1lIGFuZCBjaGVjayB0aGUKKyogUmVzb3VyY2UgSW5kaWNhdG9yIHBlcmlvZGljYWxseSBhZnRlciBjYWxsaW5nIGhjZl9zZXJ2aWNlX25pYy4KKyoKKyogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbnMgdHJhbnNmZXJzIGEgbWVzc2FnZSB0byBOSUMgbWVtb3J5IHdoZW4gaXQgaXMgY2FsbGVkIHdpdGggYSBub24tTlVMTCBkZXNjcC4KKyogQmVmb3JlIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaXMgaW52b2tlZCB0aGlzIHdheSwgdGhlIFJlc291cmNlIEluZGljYXRvciAoSUZCX1JzY0luZCkgbXVzdCBiZSBjaGVja2VkLgorKiBJZiB0aGUgUmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSwgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGV4ZWN1dGlvbiBtdXN0IGJlIHBvc3Rwb25lZCB1bnRpbCBhZnRlciBwcm9jZXNzaW5nIG9mCisqIGEgbmV4dCBoY2Zfc2VydmljZV9uaWMgaXQgYXBwZWFycyB0aGF0IHRoZSBSZXNvdXJjZSBoYXMgYmVjb21lIGF2YWlsYWJsZS4KKyogVGhlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBzdHJ1Y3R1cmUgaWRlbnRpZmllZCBieSBkZXNjcCB0byB0aGUgTklDLgorKiBDb3B5aW5nIHN0b3BzIGlmIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkLgorKiBIY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgYmVjYXVzZSB0aGUgRi9XIGRvZXMgdGhpcyBwcm90ZWN0aW9uLgorKiBJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KKyoKKyogVGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBhY3RpdmF0ZXMgdGhlIEYvVyB0byBhY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBtZWRpdW0gd2hlbiB0aGUKKyogSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBpcyBub3Qgc2V0LgorKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgbm9uLU5VTEwsIHRoZSBtZXNzYWdlIGFzIHJlcHJlc2VudGVkIGJ5IGRlc2NwIGlzIHNlbmQuCisqIElmIHRoZSBkZXNjcCBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgY2FsbCBpcyBOVUxMLCBhbmQgaWYgdGhlIHByZWNlZGluZyBjYWxsIG9mIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gaGFkCisqIGEgbm9uLU5VTEwgZGVzY3AgYW5kIHRoZSBwcmVjZWRpbmcgY2FsbCBoYWQgdGhlIEhGU19UWF9DTlRMX1RYX0RFTEFZIGJpdCBvZiB0eF9jbnRsIHNldCwgdGhlbiB0aGUgbWVzc2FnZSBhcworKiByZXByZXNlbnRlZCBieSB0aGUgZGVzY3Agb2YgdGhlIHByZWNlZGluZyBjYWxsIGlzIHNlbmQuCisqCisqIEhjZl9zZW5kX21zZyBzdXBwb3J0cyBlbmNhcHN1bGF0aW9uIChzZWUgSENGX0VOQ0FQKSBvZiBFdGhlcm5ldC1JSSBmcmFtZXMuCisqIEFuIEV0aGVybmV0LUlJIGZyYW1lIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBUcmFuc21pdCBGcmFtZSBzdHJ1Y3R1cmUgYXMgYW4gODAyLjMgZnJhbWUuCisqIEhjZl9zZW5kX21zZyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYW4gODAyLjMgYW5kIGFuIEV0aGVybmV0LUlJIGZyYW1lIGJ5IGxvb2tpbmcgYXQgdGhlIGRhdGEgbGVuZ3RoL3R5cGUgZmllbGQKKyogb2YgdGhlIGZyYW1lLiBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMTUxNCwgdGhlIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gRXRoZXJuZXQtSUkKKyogZnJhbWUsIG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIGFuIDgwMi4zIGZyYW1lLgorKiBUbyBlYXNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBIQ0YsIHRoaXMgdHlwZS90eXBlIGZpZWxkIG11c3QgYmUgbG9jYXRlZCBpbiB0aGUgZmlyc3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUsCisqIGkuZS4gdGhlIDFzdCBmcmFnbWVudCBtdXN0IGhhdmUgYSBzaXplIG9mIGF0IGxlYXN0IDE0ICh0byBjb250YWluIERlc3RBZGRyLCBTcmNBZGRyIGFuZCBMZW4vVHlwZSBmaWVsZCkuCisqIEFuIEV0aGVybmV0LUlJIGZyYW1lIGlzIGVuY2Fwc3VsYXRlZCBieSBpbnNlcnRpbmcgYSBTTkFQIGhlYWRlciBiZXR3ZWVuIHRoZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCB0aGUKKyogdHlwZSBmaWVsZC4gIFRoaXMgaW5zZXJ0aW9uIGlzIHRyYW5zcGFyZW50IGZvciB0aGUgTVNGLgorKiBUaGUgSENGIGNvbnRhaW5zIGEgZml4ZWQgdGFibGUgdGhhdCBzdG9yZXMgYSBudW1iZXIgb2YgdHlwZXMuIElmIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHR5cGUvdHlwZSBmaWVsZAorKiBvY2N1cnMgaW4gdGhpcyB0YWJsZSwgQnJpZGdlIFR1bm5lbCBFbmNhcHN1bGF0aW9uIGlzIHVzZWQsIG90aGVyd2lzZSBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgdXNlZC4KKyogQnJpZGdlIFR1bm5lbCB1c2VzCUFBIEFBIDAzIDAwIDAwIEY4IGFzIFNOQVAgaGVhZGVyLAorKiBSRkMxMDQyIHVzZXMJQUEgQUEgMDMgMDAgMDAgMDAgYXMgU05BUCBoZWFkZXIuCisqIFRoZSB0YWJsZSBjdXJyZW50bHkgY29udGFpbnM6CisqIDAgMHg4MEYzCUFwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCisqIDAgMHg4MTM3CUlQWAorKgorKiBUaGUgYWxnb3JpdGhtIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gODAyLjMgYW5kIEV0aGVybmV0LUlJIGZyYW1lcyBsaW1pdHMgdGhlIG1heGltdW0gbGVuZ3RoIGZvciBmcmFtZXMgb2YKKyogODAyLjMgZnJhbWVzIHRvIDE1MTQgYnl0ZXMuCisqIEVuY2Fwc3VsYXRpb24gY2FuIGJlIHN1cHByZXNzZWQgYnkgbWVhbnMgb2YgdGhlIHN5c3RlbSBjb25zdGFudCBIQ0ZfRU5DQVAsIGUuZy4gdG8gc3VwcG9ydCBwcm9wcmlldGFyeQorKiBwcm90b2NvbHMgd2l0aCA4MDIuMyBsaWtlIGZyYW1lcyB3aXRoIGEgc2l6ZSBsYXJnZXIgdGhhbiAxNTE0IGJ5dGVzLgorKgorKiBJbiBjYXNlIHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGlzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGlzIGRldGVybWluZWQgYnkgdGhlCisqIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzLgorKiBJbiBjYXNlIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGUgdGhlIGZyYW1lLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXMgYWN0dWFsbHkgdHJhbnNtaXR0ZWQgaXMgbm90CisqIGRldGVybWluZWQgYnkgdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bREVTQ19DTlRMX0NOVF0gZmllbGRzIG9mIHRoZSBkZXNjX3N0cmN0J3MgYnV0IGJ5CisqIHRoZSBMZW5ndGggZmllbGQgb2YgdGhlIDgwMi4zIGZyYW1lLgorKiBJZiB0aGVyZSBpcyBhIGNvbmZsaWN0IGJldHdlZW4gdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGFuZCB0aGUKKyogODAyLjMgTGVuZ3RoIGZpZWxkIHRoZSA4MDIuMyBMZW5ndGggZmllbGQgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGJ5IHRoZSBOSUMgd2hpbGUKKyogdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gZmllbGRzIGRldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBNSUMsIGhlbmNlIGEgbWlzbWF0Y2gKKyogd2lsbCByZXN1bHQgaW4gTUlDIGVycm9ycyBvbiB0aGUgUmVjZWl2aW5nIHNpZGUuCisqIEN1cnJlbnRseSB0aGlzIHByb2JsZW0gaXMgZmxhZ2dlZCBvbiB0aGUgVHJhbnNtaXQgc2lkZSBieSBhbiBBc3NlcnQuCisqIFRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2ggb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgbXVzdCBiZSBzZXQgYnkgdGhlIE1TRjoKKyogbyBidWZfY250bC5idWZfZGltWzBdCisqIG8gKm5leHRfZGVzY19hZGRyCisqIG8gKmJ1Zl9hZGRyCisqCisqIEFsbCBiaXRzIG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBleGNlcHQgSEZTX1RYX0NOVExfVFhfREVMQVkgYW5kIHRoZSBIQ0ZfUE9SVCMgYml0cyBhcmUgcGFzc2VkIHRvIHRoZSBGL1cgdmlhCisqIHRoZSBIRlNfVFhfQ05UTCBmaWVsZCBvZiB0aGUgVHhGUy4KKyoKKyogTm90ZSB0aGF0IGhjZl9zZW5kX21zZyBkb2VzIG5vdCBkZXRlY3QgTklDIGFic2VuY2UuICBUaGUgTVNGIGlzIHN1cHBvc2VkIHRvIGhhdmUgaXRzIG93biAtcGxhdGZvcm0gZGVwZW5kZW50LQorKiB3YXkgdG8gcmVjb2duaXplIGNhcmQgcmVtb3ZhbC9pbnNlcnRpb24uCisqIFRoZSB0b3RhbCBzeXN0ZW0gbXVzdCBiZSByb2J1c3QgYWdhaW5zdCBjYXJkIHJlbW92YWwgYW5kIHRoZXJlIGlzIG5vIHByaW5jaXBhbCBkaWZmZXJlbmNlIGJldHdlZW4gY2FyZCByZW1vdmFsCisqIGp1c3QgYWZ0ZXIgaGNmX3NlbmRfbXNnIHJldHVybnMgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiB0b29rIHBsYWNlIG9yIHNvbWV0aW1lIGVhcmxpZXIuCisqCisqIEFzc2VydCBmYWlscyBpZgorKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQorKiAtIGRlc2NwIGlzIGEgTlVMTCBwb2ludGVyCisqIC0gbm8gcmVzb3VyY2VzIGZvciBQSUYgYXZhaWxhYmxlLgorKiAtIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCisqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgorKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyoKKyouRElBR1JBTQorKjQ6CWZvciB0aGUgbm9ybWFsIGNhc2UgKGkuZS4gbm8gSEZTX1RYX0NOVExfVFhfREVMQVkgb3B0aW9uIGFjdGl2ZSksIGEgZmlkIGlzIGFjcXVpcmVkIHZpYSB0aGUKKyoJcm91dGluZSBnZXRfZmlkLiAgSWYgbm8gRklEIGlzIGFjcXVpcmVkLCB0aGUgcmVtYWluZGVyIGlzIHNraXBwZWQgd2l0aG91dCBhbiBlcnJvciBub3RpZmljYXRpb24uICBBZnRlcgorKglhbGwsIHRoZSBNU0YgaXMgbm90IHN1cHBvc2VkIHRvIGNhbGwgaGNmX3NlbmRfbXNnIHdoZW4gbm8gUmVzb3VyY2UgaXMgYXZhaWxhYmxlLgorKjc6CVRoZSBDb250cm9sRmllbGQgb2YgdGhlIFR4RlMgaXMgd3JpdHRlbi4gIFNpbmNlIHB1dF9mcmFnIGNhbiBvbmx5IHJldHVybiB0aGUgZmF0YWwgRGVmdW5jdCBvciAiTm8gTklDIiwgdGhlCisqCXJldHVybiBzdGF0dXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSB3aGVuIGl0IGZhaWxzLCBjbWRfd2FpdCB3aWxsIGZhaWwgYXMgd2VsbC4gIChzZWUgYWxzbyB0aGUgbm90ZSBvbiB0aGUKKyoJbmVlZCBmb3IgYSByZXR1cm4gY29kZSBiZWxvdykuCisqCU5vdGUgdGhhdCBIRlNfVFhfQ05UTCBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgSC1JLCBILUkvU1NOIGFuZCBILUlJIGFuZCBIRlNfQUREUl9ERVNUIGhhcyBkaWZmZXJlbnQKKyoJdmFsdWVzIGZvciBILUkgKHJlZ2FyZGxlc3Mgb2YgU1NOKSBhbmQgSC1JSS4KKyoJQnkgd3JpdGluZyAxNywgMSBvciAyICggaW1wbHlpbmcgMTYsIDAgb3IgMSBnYXJiYWdlIHdvcmQgYWZ0ZXIgSEZTX1RYX0NOVEwpIHRoZSBCQVAganVzdCBnZXRzIHRvCisqCUhGU19BRERSX0RFU1QgZm9yIEgtSSwgSC1JL1NTTiBhbmQgSC1JSSByZXNwZWN0aXZlbHkuCisqMTA6IGlmIG5laXRoZXIgZW5jYXBzdWxhdGlvbiBub3IgTUlDIGNhbGN1bGF0aW9uIGlzIG5lZWRlZCwgc3BsaXR0aW5nIHRoZSBmaXJzdCBmcmFnbWVudCBpbiB0d28gZG9lcyBub3QKKyoJcmVhbGx5IGhlbHAgYnV0IGl0IG1ha2VzIHRoZSBmbG93IGVhc2llciB0byBmb2xsb3cgdG8gZG8gbm90IG9wdGltaXplIG9uIHRoaXMgZGlmZmVyZW5jZQorKgorKgloY2Zfc2VuZF9tc2cgY2hlY2tzIHdoZXRoZXIgdGhlIGZyYW1lIGlzIGFuIEV0aGVybmV0LUlJIHJhdGhlciB0aGFuIGFuICJvZmZpY2lhbCIgODAyLjMgZnJhbWUuCisqCVRoZSBFLUlJIGNoZWNrIGlzIGJhc2VkIG9uIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpbiB0aGUgTUFDIGhlYWRlci4gSWYgdGhpcyBmaWVsZCBoYXMgYSB2YWx1ZSBsYXJnZXIgdGhhbgorKgkxNTAwLCBFLUlJIGlzIGFzc3VtZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHRlc3QgZmFpbHMgaWYgdGhlIGxlbmd0aC90eXBlIGZpZWxkIGlzIG5vdCBpbiB0aGUgZmlyc3QKKyoJZGVzY3JpcHRvci4gIElmIEUtSUkgaXMgcmVjb2duaXplZCwgYSBTTkFQIGhlYWRlciBpcyBpbnNlcnRlZC4gVGhpcyBTTkFQIGhlYWRlciByZXByZXNlbnRzIGVpdGhlciBSRkMxMDQyCisqCW9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSByZXR1cm4gc3RhdHVzIG9mIHRoZSBzdXBwb3J0IHJvdXRpbmUgaGNmX2VuY2FwLgorKgorKi5OT1RJQ0UKKyoJaGNmX3NlbmRfbXNnIGxlYXZlcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gb25seSBzZW5kIG1lc3NhZ2VzIG9uIGVuYWJsZWQgcG9ydHMgYXQgdGhlIE1TRiBsZXZlbC4KKyoJVGhpcyBpcyBjb25zaWRlcmVkIHRoZSBzdHJhdGVneSB3aGljaCBpcyBzdWZmaWNpZW50bHkgYWRlcXVhdGUgZm9yIGFsbCAicm9idXN0IiBNU0ZzLCBoYXZlIHRoZSBsZWFzdAorKglwcm9jZXNzb3IgdXRpbGl6YXRpb24gYW5kIGJlaW5nIHN0aWxsIGFjY2VwdGFibGUgcm9idXN0IGF0IHRoZSBXQ0kgISEhISEKKyoKKyoJaGNmX3NlbmRfbXNnIGRvZXMgbm90IE5FRUQgYSByZXR1cm4gdmFsdWUgdG8gcmVwb3J0IE5JQyBhYnNlbmNlIG9yIHJlbW92YWwgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKKyoJaGNmX3NlbmRfbXNnKCksIGJlY2F1c2UgdGhlIE1TRiBhbmQgaGlnaGVyIGxheWVycyBtdXN0IGJlIGFibGUgdG8gY29wZSBhbnl3YXkgd2l0aCB0aGUgTklDIGJlaW5nIHJlbW92ZWQKKyoJYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgaGNmX3NlbmRfbXNnKCkgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiB0b29rIHBsYWNlLgorKglUbyBhY2NvbW1vZGF0ZSB1c2VyIGV4cGVjdGF0aW9ucyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIHJlcG9ydCBOSUMgYWJzZW5jZS4KKyoJRGVmdW5jdCBibG9ja3MgYWxsIE5JQyBhY2Nlc3MgYW5kIHdpbGwgKGFsc28pIGJlIHJlcG9ydGVkIG9uIGEgbnVtYmVyIG9mIG90aGVyIGNhbGxzLgorKgorKgloY2Zfc2VuZF9tc2cgZG9lcyBub3QgY2hlY2sgZm9yIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdyBiZWNhdXNlIHRoZSBIZXJtZXMgZG9lcyB0aGlzIHByb3RlY3Rpb24uCisqCUluIGNhc2Ugb2YgYSB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIHRoZSBzdXJwbHVzIHdoaWNoIGRvZXMgbm90IGZpdCBpbiB0aGUgYnVmZmVyIGlzIHNpbXBseSBkcm9wcGVkLgorKglOb3RlIHRoYXQgdGhpcyBwb3NzaWJseSByZXN1bHRzIGluIHRoZSB0cmFuc21pc3Npb24gb2YgaW5jb21wbGV0ZSBmcmFtZXMuCisqCisqCUFmdGVyIHNvbWUgZGVsaWJlcmF0aW9uIHdpdGggRi9XIHRlYW0sIGl0IGlzIGRlY2lkZWQgdGhhdCAtIGJlaW5nIGluIHRoZSB0d2lsaWdodCB6b25lIG9mIG5vdCBrbm93aW5nCisqCXdoZXRoZXIgdGhlIHByb2JsZW0gYXQgaGFuZCBpcyBhbiBNU0YgYnVnLCBIQ0YgYnVmLCBGL1cgYnVnLCBIL1cgbWFsZnVuY3Rpb24gb3IgZXZlbiBzb21ldGhpbmcgZWxzZSAtIHRoZXJlCisqCWlzIG5vICJiZXN0IHRoaW5nIHRvIGRvIiBpbiBjYXNlIG9mIGEgZmFpbGluZyBzZW5kLCBoZW5jZSB0aGUgSENGIGNvbnNpZGVycyB0aGUgVHhGSUQgb3duZXJzaGlwIHRvIGJlIHRha2VuCisqCW92ZXIgYnkgdGhlIEYvVyBhbmQgaG9wZXMgZm9yIGFuIEFsbG9jYXRlIGV2ZW50IGluIGR1ZSB0aW1lCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKK3sKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitERVNDX1NUUkNUCSpwIC8qID0gZGVzY3AqLzsJCS8vd29ya2luZyBwb2ludGVyCitoY2ZfMTYJCWxlbjsJCQkJCS8vIHRvdGFsIGJ5dGUgY291bnQKK2hjZl8xNgkJaTsKKworaGNmXzE2CQlmaWQgPSAwOworCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnNjSW5kIHx8IGRlc2NwID09IE5VTEwsIGlmYnAtPklGQl9Sc2NJbmQgKQorCUhDRkFTU0VSVCggKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgPT0gMCwgMHhEQURCICkKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfU0VORF9NU0csIHR4X2NudGwgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKKwlIQ0ZBU1NFUlRfSU5UCisJLyogb2Jub3hpb3VzIGM6L2hjZi9oY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlciwKKwkgKiBzbyBza2lwICovCisJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICkKKyNpZiBIQ0ZfQVNTRVJUCit7CWludCB4ID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQID8gdHhfY250bCAmIH5IRlNfVFhfQ05UTF9QT1JUIDogdHhfY250bDsKKwlIQ0ZBU1NFUlQoICh4ICYgfkhDRl9UWF9DTlRMX01BU0sgKSA9PSAwLCB0eF9jbnRsICkKK30KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisKKwlpZiAoIGRlc2NwICkgaWZicC0+SUZCX1R4RklEID0gMDsJCQkJLy9jYW5jZWwgYSBwcmUtcHV0IG1lc3NhZ2UKKworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVFhfQ09OVAkJCQkvLyBDb250aW51b3VzIHRyYW5zbWl0IHRlc3QKKwlpZiAoIHR4X2NudGwgPT0gSEZTX1RYX0NOVExfVFhfQ09OVCApIHsKKwkgCWlmICggKCBmaWQgPSBnZXRfZmlkKCBpZmJwICkgKSAhPSAwICkgeworCQkJCQkJCQkJCQkvL3NldHVwIEJBUCB0byBiZWdpbiBvZiBUeEZTCisJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fT1VUICk7CisJCQkJCQkJCQkJCS8vY29weSBhbGwgdGhlIGZyYWdtZW50cyBpbiBhIHRyYW5zcGFyZW50IGZhc2hpb24KKwkJIAlmb3IgKCBwID0gZGVzY3A7IHA7IHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApIHsKKwkJCS8qIG9ibm94aW91cyB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIgKi8KKwkJCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICkKKwkJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CisJCQl9CisJCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfVEhFU0VVUyB8IEhDTURfQlVTWSB8IEhDTURfU1RBUlRQUkVBTUJMRSwgZmlkICk7CisJCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKKwkJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOworCQkJfQorCQl9CisJCQkJCQkJCQkJCS8vIGVlbiBzbGVjaHQgdm9vcmJlZWxkIGRvZXQgZ29lZCB2b2xnZW4gOz8KKwkJSENGTE9HRVhJVCggSENGX1RSQUNFX1NFTkRfTVNHICkKKwkJcmV0dXJuIHJjOworCX0KKyNlbmRpZiAvLyBIQ0ZfRVhUX1RYX0NPTlQKKwkJCQkJCQkJCS8qIHRoZSBmb2xsb3dpbmcgaW5pdGlhbGl6YXRpb24gY29kZSBpcyByZWR1bmRhbnQgZm9yIGEgcHJlLXB1dCBtZXNzYWdlCisJCQkJCQkJCQkgKiBidXQgbW92aW5nIGl0IGluc2lkZSB0aGUgImlmIGZpZCIgbG9naWMgbWFrZXMgdGhlIG1lcmdpbmcgd2l0aCB0aGUKKwkJCQkJCQkJCSAqIFVTQiBmbG93IGF3a3dhcmQKKwkJCQkJCQkJCSAqLworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKwl0eF9jbnRsIHw9IGlmYnAtPklGQl9NSUNUeENudGw7CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisJaWYgKCAoZmlkID0gaWZicC0+SUZCX1R4RklEKSA9PSAwICYmICggZmlkID0gZ2V0X2ZpZCggaWZicCApICkgIT0gMCApIAkJLyogNCAqLworCQkJLyogc2tpcCB0aGUgbmV4dCBjb21wb3VuZCBzdGF0ZW1lbnQgaWY6CisJCQkgICAtIHByZS1wdXQgbWVzc2FnZSBvcgorCQkJICAgLSBubyBmaWQgYXZhaWxhYmxlICh3aGljaCBzaG91bGQgbmV2ZXIgb2NjdXIgaWYgdGhlIE1TRiBhZGhlcmVzIHRvIHRoZSBXQ0kpCisJCQkgKi8KKwl7CQkvLyB0byBtYXRjaCB0aGUgY2xvc2luZyBjdXJseSBicmFja2V0IG9mIGFib3ZlICJpZiIgaW4gY2FzZSBvZiBIQ0ZfVFlQRV9VU0IKKwkJCQkJCQkJCQkJLy9jYWxjdWxhdGUgdG90YWwgbGVuZ3RoIDs/IHN1cGVyZmx1b3VzIHVubGVzcyBDQ1ggb3IgRW5jYXBzdWxhdGlvbgorCQlsZW4gPSAwOworCQlwID0gZGVzY3A7CisJCWRvIGxlbiArPSBwLT5CVUZfQ05UOyB3aGlsZSAoICggcCA9IHAtPm5leHRfZGVzY19hZGRyICkgIT0gTlVMTCApOworCQlwID0gZGVzY3A7CisvLzs/CUhDRkFTU0VSVCggbGVuIDw9IEhDRl9NQVhfTVNHLCBsZW4gKQorLyo3Ki8JKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIEhGU19UWF9DTlRMLCBJT19PVVQgKTsKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfVFhfREVMQVkKKwkJSENGQVNTRVJUKCAoIGRlc2NwICE9IE5VTEwgKSBeICggdHhfY250bCAmIEhGU19UWF9DTlRMX1RYX0RFTEFZICksIHR4X2NudGwgKQorCQlpZiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApIHsKKwkJCXR4X2NudGwgJj0gfkhGU19UWF9DTlRMX1RYX0RFTEFZOwkJLy8hIUhGU19UWF9DTlRMX1RYX0RFTEFZIG5vIGxvbmdlciBhdmFpbGFibGUKKwkJCWlmYnAtPklGQl9UeEZJRCA9IGZpZDsKKwkJCWZpZCA9IDA7CQkJCQkJCQkvLyEhZmlkIG5vIGxvbmdlciBhdmFpbGFibGUsIGJlIGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgY29kZQorCQl9CisjZW5kaWYgLy8gSENGX1RZUEVfVFhfREVMQVkKKwkJT1BXKCBIUkVHX0RBVEFfMSwgdHhfY250bCApIDsKKwkJT1BXKCBIUkVHX0RBVEFfMSwgMCApOworI2lmICEgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYICkKKwkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICkKKwkJCQkJCQkJCQkJLyogYXNzdW1lIERlc3RBZGRyL1NyY0FkZHIvTGVuL1R5cGUgQUxXQVlTIGNvbnRhaW5lZCBpbiAxc3QgZnJhZ21lbnQKKwkJCQkJCQkJCQkJICogb3RoZXJ3aXNlIGxpZmUgZ2V0cyB0b28gY3VtYmVyc29tZSBmb3IgTUlDIGFuZCBFbmNhcHN1bGF0aW9uICEhISEhISEhCisJCWlmICggcC0+QlVGX0NOVCA+PSAxNCApIHsJYWx0ZXJuYXRpdmVseTogYWRkIGEgc2FmZXR5IGVzY2FwZSAhISEhISEhISEhISEgfQkqLworI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQlDQUxDX1RYX01JQyggTlVMTCwgLTEgKTsJCS8vaW5pdGlhbGl6ZSBNSUMKKy8qMTAqLwlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgQkVfUEFSKDApICk7CS8vd3JpdGUgREEsIFNBIHdpdGggTUlDIGNhbGN1bGF0aW9uCisJCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSApOwkJLy9NSUMgb3ZlciBEQSwgU0EKKwkJQ0FMQ19UWF9NSUMoIG51bGxfYWRkciwgNCApOwkJLy9NSUMgb3ZlciAodmlydHVhbCkgcHJpb3JpdHkgZmllbGQKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisJCS8vISFiZSBjYXJlZnVsIGRvIG5vdCB1c2UgcG9zaXRpdmUgdGVzdCBvbiBIQ0ZfQUNUX0NDWF9PRkYsIGJlY2F1c2UgSUZCX0NLSVBTdGF0IGlzIGluaXRpYWxseSAwCisJCWlmKCggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKKyAgICAgICAgICAgKChHRVRfQlVGX0NOVChwKSA+PSAyMCApICAgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKKyAgICAgICAgICAgIChwLT5idWZfYWRkclsxMl0gPT0gMHhBQSkgJiYgKHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBKSAmJgorICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzKSAmJiAocC0+YnVmX2FkZHJbMTVdID09IDB4MDApICYmCisgICAgICAgICAgICAocC0+YnVmX2FkZHJbMTZdID09IDB4NDApICYmIChwLT5idWZfYWRkclsxN10gPT0gMHg5NikgJiYKKyAgICAgICAgICAgIChwLT5idWZfYWRkclsxOF0gPT0gMHgwMCkgJiYgKHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSBIQ0ZfREFTQV9TSVpFOworCisgICAgICAgICAgICBPUFcoIEhSRUdfREFUQV8xLCBDTlZfU0hPUlRfVE9fQklHKCBsZW4gLSBpICkpOworCisgICAgICAgICAgICAvKiBuZWVkIHRvIHNlbmQgb3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIGZyYWdtZW50ICovCisJCQlwdXRfZnJhZyggaWZicCwgJnAtPmJ1Zl9hZGRyW2ldLCBHRVRfQlVGX0NOVChwKSAtIGkgQkVfUEFSKDApICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCQl7CisJCQkJCQkJCQkJCS8vaWYgZW5jYXBzdWxhdGlvbiBuZWVkZWQKKyNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCisJCQkJCQkJCQkJCS8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KKwkJCWlmICggKCBzbmFwX2hlYWRlcltzaXplb2Yoc25hcF9oZWFkZXIpLTFdID0gaGNmX2VuY2FwKCAmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKSApICE9IEVOQ19OT05FICkgeworCQkJCU9QVyggSFJFR19EQVRBXzEsIENOVl9FTkRfU0hPUlQoIGxlbiArIChzaXplb2Yoc25hcF9oZWFkZXIpICsgMikgLSAoIDIqNiArIDIgKSApICk7CisJCQkJCQkJCQkJCS8vd3JpdGUgc3BsaWNlIHdpdGggTUlDIGNhbGN1bGF0aW9uCisJCQkJcHV0X2ZyYWcoIGlmYnAsIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpIEJFX1BBUigwKSApOworCQkJCUNBTENfVFhfTUlDKCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSApOwkvL01JQyBvdmVyIDYgYnl0ZSBTTkFQCisJCQkJaSA9IEhDRl9EQVNBX1NJWkU7CisJCQl9IGVsc2UKKyNlbmRpZiAvLyBIQ0ZfRU5DCisJCQl7CisJCQkJT1BXKCBIUkVHX0RBVEFfMSwgKih3Y2lfcmVjb3JkcCkmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKTsKKwkJCQlpID0gMTQ7CisJCQl9CisJCQkJCQkJCQkJCS8vY29tcGxldGUgMXN0IGZyYWdtZW50IHN0YXJ0aW5nIHdpdGggVHlwZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgorCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgQkVfUEFSKDApICk7CisJCQlDQUxDX1RYX01JQyggJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSApOworCQl9CisJCQkJCQkJCQkJCS8vZG8gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMgd2l0aCBNSUMgY2FsY3VsYXRpb24KKwkJd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKSB7CisJCQkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAorCQkJICogc28gc2tpcCAqLworCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCisJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CisJCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgKTsKKwkJfQorCQkJCQkJCQkJCQkvL3BhZCBtZXNzYWdlLCBmaW5hbGl6ZSBNSUMgY2FsY3VsYXRpb24gYW5kIHdyaXRlIE1JQyB0byBOSUMKKwkJcHV0X2ZyYWdfZmluYWxpemUoIGlmYnAgKTsKKwl9CisJaWYgKCBmaWQgKSB7CisvKjE2Ki8JcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0JVU1kgfCBIQ01EX1RYIHwgSENNRF9SRUNMLCBmaWQgKTsKKwkJaWZicC0+SUZCX1R4RklEID0gMDsKKwkJCS8qIHByb2JhYmx5IHRoaXMgKGkuZS4gbm8gUnNjSW5kIEFORCAiSFJFR19FVl9BTExPQyIpIGF0IHRoaXMgcG9pbnQgaW4gdGltZSBvY2N1cnMgc28gaW5mcmVxdWVudCwKKwkJCSAqIHRoYXQgaXQgbWlnaHQganVzdCBhcyB3ZWxsIGJlIGFjY2VwdGFibGUgdG8gc2tpcCB0aGlzCisJCQkgKiAib3B0aW1pemF0aW9uIiBjb2RlIGFuZCBoYW5kbGUgdGhhdCBhZGRpdGlvbmFsIGludGVycnVwdCBvbmNlIGluIGEgd2hpbGUKKwkJCSAqLworLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKKy8qMjAqLwlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMCApIHsKKwkJCWlmYnAtPklGQl9Sc2NJbmQgPSBnZXRfZmlkKCBpZmJwICk7CisJCX0KKy8vICNlbmRpZiAvLyBBTExPQ18xNQorCX0KKy8vCUhDRkFTU0VSVCggbGV2ZWw6OmlmYnAtPklGQl9Sc2NJbmQsIGlmYnAtPklGQl9Sc2NJbmQgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCisJcmV0dXJuIHJjOworfSAvLyBoY2Zfc2VuZF9tc2cKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouTU9EVUxFCQlpbnQgaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQorKi5QVVJQT1NFCQlTZXJ2aWNlcyAobW9zdCkgTklDIGV2ZW50cy4KKyoJCQkJUHJvdmlkZXMgcmVjZWl2ZWQgbWVzc2FnZQorKgkJCQlQcm92aWRlcyBzdGF0dXMgaW5mb3JtYXRpb24uCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyogIEluIG5vbi1ETUEgbW9kZToKKyoJYnVmcAkJYWRkcmVzcyBvZiBjaGFyIGJ1ZmZlciwgc3VmZmljaWVudGx5IGxhcmdlIHRvIGhvbGQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFJ4RlMgdXAgdGhyb3VnaCBIRlNfVFlQRQorKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisqCQkJCXZhbHVlIGJldHdlZW4gSEZTX1RZUEUgKyAyIGFuZCBIRlNfQUREUl9ERVNUICsgSENGX01BWF9NU0cKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX01JQwltZXNzYWdlIGNvbnRhaW5zIGFuIGVycm9uZW91cyBNSUMgKG9ubHkgaWYgZnJhbWUgZml0cyBjb21wbGV0ZWx5IGluIGJ1ZnApCisqCisqLkRFU0NSSVBUSU9OCisqCisqIE1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2sKKyogLSBJRkJfUnhMZW4JCQkwIG9yIEZyYW1lIHNpemUuCisqIC0gSUZCX01CSW5mb0xlbgkJMCBvciB0aGUgTC1maWVsZCBvZiB0aGUgb2xkZXN0IE1CSUIuCisqIC0gSUZCX1JzY0luZAorKiAtIElGQl9IQ0ZfVGFsbGllcwkJdXBkYXRlZCBpZiBhIGNvcnJlc3BvbmRpbmcgZXZlbnQgb2NjdXJyZWQuCisqIC0gSUZCX05JQ19UYWxsaWVzCQl1cGRhdGVkIGlmIGEgVGFsbHkgSW5mbyBmcmFtZSByZWNlaXZlZCBmcm9tIHRoZSBOSUMuCisqIC0gSUZCX0RtYVBhY2tldHMKKyogLSBJRkJfVHhGc1N0YXQKKyogLSBJRkJfVHhGc1N3U3VwCisqIC0gSUZCX0xpbmtTdGF0CQlyZWZsZWN0cyBuZXcgbGluayBzdGF0dXMgb3IgMHgwMDAwIGlmIG5vIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KK29yCisqIC0gSUZCX0xpbmtTdGF0CQlsaW5rIHN0YXR1cywgMHg4MDAwIHJlZmxlY3RzIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KKyoKKyogV2hlbiBJRkJfTUJJbmZvTGVuIGlzIG5vbi16ZXJvLCBhdCBsZWFzdCBvbmUgTUJJQiBpcyBhdmFpbGFibGUuCisqCisqIElGQl9SeExlbglyZWZsZWN0cyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGluIDgwMi4zIHZpZXcgKEluY2x1ZGluZyBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuZ3RoLAorKiBleGNsdWRpbmcgTUlDLXBhZGRpbmcsIE1JQyBhbmQgc3VtIGNoZWNrKSBvZiBhY3RpdmUgUnggRnJhbWUgU3RydWN0dXJlLiBJZiBubyBSeCBEYXRhIHMgYXZhaWxhYmxlLCBJRkJfUnhMZW4KKyogZXF1YWxzIDB4MDAwMC4KKyogUmVwZWF0ZWQgZXhlY3V0aW9uIGNhdXNlcyB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBzdWJzZXF1ZW50bHkgcmVjZWl2ZWQKKyogbWVzc2FnZXMsIGlycmVzcGVjdGl2ZSB3aGV0aGVyIGEgaGNmX3Jjdl9tc2cgb3IgaGNmX2FjdGlvbihIQ0ZfQUNUX1JYKSBpcyBwZXJmb3JtZWQgaW4gYmV0d2Vlbi4KKyoKKyogV2hlbiBJRkJfUnhMZW4gaXMgbm9uLXplcm8sIGEgUmVjZWl2ZWQgRnJhbWUgU3RydWN0dXJlIGlzIGF2YWlsYWJsZSB0byBiZSByb3V0ZWQgdG8gdGhlIHByb3RvY29sIHN0YWNrLgorKiBXaGVuIE1vbml0b3IgTW9kZSBpcyBub3QgYWN0aXZlLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgYW4gZXJyb3ItZnJlZSBub24tV01QIGZyYW1lLgorKiBJbiBjYXNlIG9mIE1vbml0b3IgTW9kZSwgaXQgbWF5IGFsc28gYmUgYSBmcmFtZSB3aXRoIGFuIGVycm9yIG9yIGEgV01QIGZyYW1lLgorKiBFcnJvbmVvdXMgZnJhbWVzIGhhdmUgYSBub24temVybyBlcnJvci1zdWIgZmllbGQgaW4gdGhlIEhGU19TVEFUIGZpZWxkIGluIHRoZSBsb29rIGFoZWFkIGJ1ZmZlci4KKyoKKyogSWYgYSBSZWNlaXZlIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGluIE5JQyBSQU0sIHRoZSBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSBpcyAocGFydGx5KSBjb3BpZWQgZnJvbSB0aGUgTklDIHRvCisqIHRoZSBidWZmZXIgaWRlbnRpZmllZCBieSBidWZwLgorKiBDb3B5aW5nIHN0b3BzIGVpdGhlciBhZnRlciBsZW4gYnl0ZXMgb3Igd2hlbiB0aGUgY29tcGxldGUgODAyLjMgZnJhbWUgaXMgY29waWVkLgorKiBEdXJpbmcgdGhlIGNvcHlpbmcgdGhlIG1lc3NhZ2UgaXMgZGVjYXBzdWxhdGVkIChpZiBhcHByb3ByaWF0ZSkuCisqIElmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljIChpLmUuIHRoZSBmcmFtZSBmaXRzIGNvbXBsZXRlbHkgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIpLAorKiB0aGUgZnJhbWUgaXMgYXV0b21hdGljYWxseSBBQ0snZWQgdG8gdGhlIEYvVyBhbmQgc3RpbGwgYXZhaWxhYmxlIHZpYSB0aGUgbG9vayBhaGVhZCBidWZmZXIgYW5kIGhjZl9yY3ZfbXNnLgorKiBPbmx5IGlmIHRoZSBmcmFtZSBpcyByZWFkIGNvbXBsZXRlbHkgYnkgaGNmX3NlcnZpY2VfbmljLCBoY2Zfc2VydmljZV9uaWMgY2hlY2tzIHRoZSBNSUMgYW5kIHNldHMgdGhlIHJldHVybgorKiBzdGF0dXMgYWNjb3JkaW5nbHkuICBJbiB0aGlzIGNhc2UsIGhjZl9yY3ZfbXNnIGRvZXMgbm90IGNoZWNrIHRoZSBNSUMuCisqCisqIFRoZSBNSUMgY2FsY3VsYXRpb24gYWxnb3JpdGhtIHdvcmtzIG1vcmUgZWZmaWNpZW50IGlmIHRoZSBsZW5ndGggb2YgdGhlIGxvb2sgYWhlYWQgYnVmZmVyIGlzCisqIHN1Y2ggdGhhdCBpdCBmaXRzIGV4YWN0bHkgNCBuIGJ5dGVzIG9mIHRoZSA4MDIuMyBmcmFtZSwgaS5lLiBsZW4gPT0gSEZTX0FERFJfREVTVCArIDQqbi4KKyoKKyogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBOSUMgZXZlbnQgc2VydmljZSBoYW5kbGluZyBwcm9jZXNzLgorKiBJdCBwZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgYWN0aW9ucyB0byBzZXJ2aWNlIHRoZSBOSUMsIHN1Y2ggdGhhdCB0aGUgZXZlbnQgY2F1c2UgaXMgZWxpbWluYXRlZCBhbmQgcmVsYXRlZAorKiBpbmZvcm1hdGlvbiBpcyBzYXZlZC4KKyogVGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgSVNSIG9yIHBvbGxpbmcgcm91dGluZSBhcyBmaXJzdCBzdGVwIHRvIGRldGVybWluZSB0aGUgZXZlbnQKKyogY2F1c2UocykuICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBwZXJmb3JtIGFsbCBub3QgZGlyZWN0bHkgTklDIHJlbGF0ZWQgaW50ZXJydXB0IHNlcnZpY2UKKyogYWN0aW9ucywgZS5nLiBpbiBhIFBDIGVudmlyb25tZW50IHRoaXMgaW5jbHVkZXMgc2VydmljaW5nIHRoZSBQSUMsIGFuZCBtYW5hZ2luZyB0aGUgUHJvY2Vzc29yIEludGVycnVwdAorKiBFbmFibGluZy9EaXNhYmxpbmcuCisqIEluIGNhc2Ugb2YgYSBwb2xsZWQgYmFzZWQgc3lzdGVtLCB0aGUgU2VydmljZSBOSUMgRnVuY3Rpb24gbXVzdCBiZSBleGVjdXRlZCAiZnJlcXVlbnRseSIuCisqIFRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbiBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMgcmVsYXRlZCB0byB0aGUgTWFpbGJveCBhbmQgUmVzb3VyY2UgSW5kaWNhdG9yIChJRkJfUnNjSW5kKS4KKyoKKyogaGNmX3NlcnZpY2VfbmljIHJldHVybnM6CisqIC0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiB0aGUgYXZhaWxhYmxlIE1CSUIgKElGQl9NQkluZm9MZW4pCisqIC0gQ2hhbmdlcyBpbiB0aGUgbGluayBzdGF0dXMgKElGQl9MaW5rU3RhdCkKKyogLSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIHRoZSBhdmFpbGFibGUgUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgKElGQl9SeExlbikKKyogLSB1cGRhdGVkIElGQl9Sc2NJbmQKKyogLSBVcGRhdGVkIFRhbGxpZXMKKyoKKyogaGNmX3NlcnZpY2VfbmljIGlzIHByZXN1bWVkIHRvIG5laXRoZXIgaW50ZXJydXB0IG90aGVyIEhDRi10YXNrcyBub3IgdG8gYmUgaW50ZXJydXB0ZWQgYnkgb3RoZXIgSENGLXRhc2tzLgorKiBBIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gcHJlY2VkZSBoY2Zfc2VydmljZV9uaWMgYXMgd2VsbCBhcyBhbGwgb3RoZXIgSENGLXRhc2tzIHdpdGggYSBjYWxsIHRvCisqIGhjZl9hY3Rpb24gdG8gZGlzYWJsZSB0aGUgY2FyZCBpbnRlcnJ1cHRzIGFuZCwgYWZ0ZXIgYWxsIHdvcmsgaXMgY29tcGxldGVkLCB3aXRoIGEgY2FsbCB0byBoY2ZfYWN0aW9uIHRvCisqIHJlc3RvcmUgKHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyBlbmFibGluZykgdGhlIGNhcmQgaW50ZXJydXB0cy4KKyogSW4gY2FzZSBvZiBhIHBvbGxlZCBlbnZpcm9ubWVudCwgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBNU0YgcHJvZ3JhbW1lciBpcyBzdWZmaWNpZW50bHkgZmFtaWxpYXIgd2l0aCB0aGUKKyogc3BlY2lmaWMgcmVxdWlyZW1lbnRzIG9mIHRoYXQgZW52aXJvbm1lbnQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcnJ1cHQgc3RyYXRlZ3kgdG8gYSBwb2xsZWQgc3RyYXRlZ3kuCisqCisqIGhjZl9zZXJ2aWNlX25pYyBzZXJ2aWNlcyB0aGUgZm9sbG93aW5nIEhlcm1lcyBldmVudHM6CisqIC0gSFJFR19FVl9JTkZPCQlBc3luY2hyb25vdXMgSW5mb3JtYXRpb24gRnJhbWUKKyogLSBIUkVHX0VWX0lORk9fRFJPUAlXTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGljaXRlZCBJbmZvcm1hdGlvbiBGcmFtZQorKiAtIEhSRUdfRVZfVFhfRVhDCQkoaWYgYXBwbGljYWJsZSwgaS5lLiBzZWxlY3RlZCB2aWEgSENGX0VYVF9JTlRfVFhfRVggYml0IG9mIEhDRl9FWFQpCisqIC0gSFJFR19FVl9TTEVFUF9SRVEJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9ERFMvSENGX0NEUyBiaXQgb2YgSENGX1NMRUVQKQorKiAqKiBpbiBub25fRE1BIG1vZGUKKyogLSBIUkVHX0VWX0FMTE9DCQlBc3luY2hyb25vdXMgcGFydCBvZiBBbGxvY2F0aW9uL1JlY2xhaW0gY29tcGxldGVkIHdoaWxlIG91dCBvZiByZXNvdXJjZXMgYXQKKyogCQkJCQkJY29tcGxldGlvbiBvZiBoY2Zfc2VuZF9tc2cvbm90aWZ5CisqIC0gSFJFR19FVl9SWAkJCXRoZSBkZXRlY3Rpb24gb2YgdGhlIGF2YWlsYWJpbGl0eSBvZiByZWNlaXZlZCBtZXNzYWdlcworKiAJCQkJCQlpbmNsdWRpbmcgV2F2ZUxBTiBNYW5hZ2VtZW50IFByb3RvY29sIChXTVApIG1lc3NhZ2UgcHJvY2Vzc2luZworKiAqKiBpbiBETUEgbW9kZQorKiAtIEhSRUdfRVZfUkRNQUQKKyogLSBIUkVHX0VWX1RETUFECisqISEgaGNmX3NlcnZpY2VfbmljIGRvZXMgbm90IHNlcnZpY2UgdGhlIGZvbGxvd2luZyBIZXJtZXMgZXZlbnRzOgorKiEhIAlIUkVHX0VWX1RYIAkJCSh0aGUgIk9LIiBUeCBFdmVudCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUgV0NJLCBpZiBpdCBvY2N1cnMgaXQgaXMgdW5jbGVhcgorKiEhIAkJCQkJCXdoYXQgdGhlIGNhdXNlIGlzLCBzbyBubyBtZWFuaW5nZnVsIHN0cmF0ZWd5IGlzIGF2YWlsYWJsZS4gTm90IGFja2luZyB0aGUgYml0IGlzCisqISEgCQkJCQkJcHJvYmFibHkgdGhlIGJlc3QgaGVscCB0aGF0IGNhbiBiZSBnaXZlbiB0byB0aGUgZGVidWdnZXIuCisqISEgCUhSRUdfRVZfQ01ECQkJaGFuZGxlZCBpbiBjbWRfd2FpdC4KKyohISAJSFJFR19FVl9GV19ETUEgCQkoaS5lLiBIUkVHX0VWX1JYRE1BLCBIUkVHX0VWX1RYRE1BIGFuZF9FVl9MUEVTQykgYXJlIGVpdGhlciBub3QgdXNlZCBvciB1c2VkCisqISEgCQkJCQkJYmV0d2VlbiB0aGUgRi9XIGFuZCB0aGUgRE1BIGVuZ2luZS4KKyohISAJSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgSC1JSSAoaS5lLiBub3QgSElJLjUgYW5kIHVwLCBzZWUgREFXQSkKKyoKKyoJSWYsIGluIG5vbi1ETUEgbW9kZSwgYSBSeCBtZXNzYWdlIGlzIGF2YWlsYWJsZSwgaXRzIGxlbmd0aCBpcyByZWZsZWN0ZWQgYnkgdGhlIElGQl9SeExlbiBmaWVsZCBvZiB0aGUgSUZCLgorKglUaGlzIGxlbmd0aCByZWZsZWN0cyB0aGUgZGF0YSBpdHNlbGYgYW5kIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgRGF0YUxlbmd0aC9UeXBlIGZpZWxkCisqCWJ1dCBub3QgdGhlIFNOQVAtaGVhZGVyIGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGLiAgSWYgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUsIElGQl9SeExlbiBpcworKgl6ZXJvLiAgRm9ybWVyIHZlcnNpb25zIG9mIHRoZSBIQ0YgaGFuZGxlZCBXTVAgbWVzc2FnZXMgYW5kIHN1cHBvcnRlZCBhICJtb25pdG9yIiBtb2RlIGluIGhjZl9zZXJ2aWNlX25pYywKKyoJd2hpY2ggZGVwb3NpdGVkIGNlcnRhaW4gb3IgYWxsIFJ4IG1lc3NhZ2VzIGluIHRoZSBNYWlsQm94LiBUaGUgcmVzcG9uc2liaWxpdHkgdG8gaGFuZGxlIHRoZXNlIGZyYW1lcyBpcworKgltb3ZlZCB0byB0aGUgTVNGLiBUaGUgSENGIG9mZmVycyBhcyBzdXBwb3J0cyBoY2ZfcHV0X2luZm8gd2l0aCBDRkdfTUJfSU5GTyBhcyBwYXJhbWV0ZXIgdG8gZW11bGF0ZSB0aGUgb2xkCisqIAlpbXBsZW1lbnRhdGlvbiB1bmRlciBjb250cm9sIG9mIHRoZSBNU0YuCisqCisqICoqUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kKKyoJV2hlbiBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbm9uLURNQSBtZXNzYWdlLCB0aGUgTVNGIGNhbiBhY2Nlc3MgdGhhdCBtZXNzYWdlIGJ5CisqCW1lYW5zIG9mIGhjZl9yY3ZfbXNnLiBJdCBtdXN0IGJlIHByZXZlbnRlZCB0aGF0IHRoZSBMQU4gQ29udHJvbGxlciB3cml0ZXMgbmV3IGRhdGEgaW4gdGhlIE5JQyBidWZmZXIKKyoJYmVmb3JlIHRoZSBNU0YgaXMgZmluaXNoZWQgd2l0aCB0aGUgY3VycmVudCBtZXNzYWdlLiBUaGUgTklDIGJ1ZmZlciBpcyByZXR1cm5lZCB0byB0aGUgTEFOIENvbnRyb2xsZXIKKyoJd2hlbjoKKyoJIC0gdGhlIGNvbXBsZXRlIGZyYW1lIGZpdHMgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIgb3IKKyoJIC0gaGNmX3Jjdl9tc2cgaXMgY2FsbGVkIG9yCisqCSAtIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX1JYIGlzIGNhbGxlZCBvcgorKgkgLSBoY2Zfc2VydmljZV9uaWMgaXMgY2FsbGVkIGFnYWluCisqCUl0IGNhbiBiZSByZWFzb25lZCB0aGF0IGhjZl9hY3Rpb24oIElOVF9PTiApIHNob3VsZCBub3QgYmUgZ2l2ZW4gYmVmb3JlIHRoZSBNU0YgaGFzIGNvbXBsZXRlbHkgcHJvY2Vzc2VkCisqCWEgcmVwb3J0ZWQgUngtZnJhbWUuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgSU5UX09OIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGNhdXNlIGEgKFJ4LSlpbnRlcnJ1cHQgKHRoZQorKglNU0YgaXMgcHJvY2Vzc2luZyBhIFJ4LWZyYW1lLCBoZW5jZSB0aGUgUngtZXZlbnQgYml0IGluIHRoZSBIZXJtZXMgcmVnaXN0ZXIgbXVzdCBiZSBhY3RpdmUpLiBUaGlzCisqCWludGVycnVwdCB3aWxsIGNhdXNlIGhjZl9zZXJ2aWNlX25pYyB0byBiZSBjYWxsZWQsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIGFjay1pbmcgb2YgdGhlICJsYXN0IiBSeC1ldmVudAorKgl0byB0aGUgSGVybWVzLCBjYXVzaW5nIHRoZSBIZXJtZXMgdG8gZGlzY2FyZCB0aGUgYXNzb2NpYXRlZCBOSUMgUkFNIGJ1ZmZlci4KKyogQXNzZXJ0IGZhaWxzIGlmCisqIC0gaWZicCBpcyB6ZXJvIG9yIG90aGVyIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisqIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdC4KKyogLSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgorKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKyoJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisqCisqCisqLkRJQUdSQU0KKyoxOglJRkJfTGlua1N0YXQgaXMgY2xlYXJlZCwgaWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5CisqCWJ5IGlzcl9pbmZvLgorb3IKKyoxOglJRkJfTGlua1N0YXQgY2hhbmdlIGluZGljYXRpb24gaXMgY2xlYXJlZC4gSWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkCisqCWFjY29yZGluZ2x5IGJ5IGlzcl9pbmZvLgorKjI6IElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBOSUMgcHJlc2VuY2UgY2hlY2sgb3RoZXJ3aXNlOgorKgkgLQl0aGlzIHZhbHVlIG1heSBzdGF5IG5vbi16ZXJvIGlmIHRoZSBOSUMgaXMgcHVsbGVkIG91dCBhdCBhbiBpbmNvbnZlbmllbnQgbW9tZW50LgorKgkgLQl0aGUgUnhBY2sgb24gYSB6ZXJvLUZJRCBuZWVkcyBhIHplcm8tdmFsdWUgZm9yIElGQl9SeExlbiB0byB3b3JrCisqCSBOb3RlIHRoYXQgYXMgc2lkZS1lZmZlY3Qgb2YgdGhlIGhjZl9hY3Rpb24gY2FsbCwgdGhlIHJlbWFpbmRlciBvZiBSeCByZWxhdGVkIGluZm8gaXMgcmUtaW5pdGlhbGl6ZWQgYXMKKyoJIHdlbGwuCisqNDoJSW4gY2FzZSBvZiBEZWZ1bmN0IG1vZGUsIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBieSBIZXJtZXMgaXMgdW5yZWxpYWJsZSwgc28gdGhlIGJvZHkgb2YKKyoJaGNmX3NlcnZpY2VfbmljIGlzIHNraXBwZWQuIFNpbmNlIGhjZl9jbnRsIHR1cm5zIGludG8gYSBOT1AgaWYgUHJpbWFyeSBvciBTdGF0aW9uIEYvVyBpcyBpbmNvbXBhdGlibGUsCisqCWhjZl9zZXJ2aWNlX25pYyBpcyBhbHNvIHNraXBwZWQgaW4gdGhvc2UgY2FzZXMuCisqCVRvIHByZXZlbnQgdGhhdCBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyBib2d1cyBpbmZvcm1hdGlvbiB0byB0aGUgTVNGIHdpdGggYWxsIC0gcG9zc2libHkgZGlmZmljdWx0IHRvCisqCWRlYnVnIC0gdW5kZXNpcmFibGUgc2lkZSBlZmZlY3RzLCBpdCBpcyBwYXJhbW91bnQgdG8gY2hlY2sgdGhlIE5JQyBwcmVzZW5jZS4gSW4gZm9ybWVyIGRheXMgdGhlIHByZXNlbmNlCisqCXRlc3Qgd2FzIGJhc2VkIG9uIHRoZSBIZXJtZXMgcmVnaXN0ZXIgSFJFR19TV18wLiBTaW5jZSBpbiBIQ0ZfQUNUX0lOVF9PRkYgaXMgY2hvb3NlbiBmb3Igc3RyYXRlZ3kgYmFzZWQgb24KKyoJSFJFR19FVl9TVEFULCB0aGlzIGlzIG5vdyBhbHNvIHVzZWQgaW4gaGNmX3NlcnZpY2VfbmljLiBUaGUgbW90aXZhdGlvbiB0byBjaGFuZ2Ugc3RyYXRlZ3kgaXMgcGFydGx5CisqCWR1ZSB0byBpbmNvbnNpc3RlbnQgRi9XIGltcGxlbWVudGF0aW9ucyB3aXRoIHJlc3BlY3QgdG8gSFJFR19TV18wIG1hbmlwdWxhdGlvbiBhcm91bmQgcmVzZXQgYW5kIGRvd25sb2FkLgorKglOb3RlIHRoYXQgaW4gcG9sbGVkIGVudmlyb25tZW50cyBDYXJkIFJlbW92YWwgaXMgbm90IGRldGVjdGVkIGJ5IElOVF9PRkYgd2hpY2ggbWFrZXMgdGhlIGNoZWNrIGluCisqCWhjZl9zZXJ2aWNlX25pYyBldmVuIG1vcmUgaW1wb3J0YW50LgorKjg6CVRoZSBldmVudCBzdGF0dXMgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBpcyBzYW1wbGVkCisqCVRoZSBhc3NlcnQgY2hlY2tzIGZvciB1bmV4cGVjdGVkIGV2ZW50cyA7Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py4KKyoJIC0gSFJFR19FVl9JTkZPX0RST1AgaXMgZXhwbGljaXRseSBleGNsdWRlZCBmcm9tIHRoZSBhY2NlcHRhYmxlIEhSRUdfRVZfU1RBVCBiaXRzIGJlY2F1c2UgaXQgaW5kaWNhdGVzCisqCSAgIGEgdG9vIGhlYXZpbHkgbG9hZGVkIHN5c3RlbS4KKyoJIC0gSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIDB4MDAwMCBmb3IgSC1JIChhbmQgaG9wZWZ1bGx5IEgtSUkuNSkKKyoKKyoKKyoJSFJFR19FVl9UWF9FWEMgaXMgYWNjZXB0ZWQgKHZpYSBIUkVHX0VWX1RYX0VYVCkgaWYgYW5kIG9ubHkgaWYgSENGX0VYVF9JTlRfVFhfRVggc2V0IGluIHRoZSBIQ0ZfRVhUCisqCWRlZmluaXRpb24gYXQgY29tcGlsZSB0aW1lLgorKglUaGUgZm9sbG93aW5nIGFjdGl2aXRpZXMgYXJlIGhhbmRsZWQ6CisqCSAtCUFsbG9jIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBoY2Zfc2VuZF9tc2cgKGFuZCBub3RpZnkpLiBPbmx5IGlmIHRoZXJlIGlzIG5vICJzcGFyZSIgcmVzb3VyY2UsIHRoZQorKgkJYWxsb2MgZXZlbnQgaXMgc3VwZXJmaWNpYWxseSBzZXJ2aWNlZCBieSBoY2Zfc2VydmljZV9uaWMgdG8gY3JlYXRlIGEgcHNldWRvLXJlc291cmNlIHdpdGggdmFsdWUKKyoJCTB4MDAxLiBUaGlzIHZhbHVlIGlzIHJlY29nbml6ZWQgYnkgZ2V0X2ZpZCAoY2FsbGVkIGJ5IGhjZl9zZW5kX21zZyBhbmQgbm90aWZ5KSB3aGVyZSB0aGUgcmVhbAorKgkJVHhGaWQgaXMgcmV0cmlldmVkIGFuZCB0aGUgSGVybWVzIGlzIGFja2VkIGFuZCAtIGhvcGVmdWxseSAtIHRoZSAibm9ybWFsIiBjYXNlIHdpdGggYSBzcGFyZSBUeEZpZAorKgkJaW4gSUZCX1JzY0luZCBpcyByZXN0b3JlZC4KKyoJIC0JSW5mbyBkcm9wIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBpbmNyZW1lbnRpbmcgYSB0YWxseQorKgkgLQlMaW5rRXZlbnQgKGluY2x1ZGluZyBzb2xpY2l0ZWQgYW5kIHVuc29saWNpdGVkIHRhbGxpZXMpIGFyZSBoYW5kbGVkIGJ5IHByb2NlZHVyZSBpc3JfaW5mby4KKyoJLQlUeEV4IChpZiBzZWxlY3RlZCBhdCBjb21waWxlIHRpbWUpIGlzIGhhbmRsZWQgYnkgY29weWluZyB0aGUgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgVHhGUworKgkJaW50byB0aGUgSUZCIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgYnkgdGhlIE1TRi4KKyoJCU5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCisqCU5vdGUsIHRoZSBBY2sgb2YgYWxsIG9mIGFib3ZlIGV2ZW50cyBpcyBoYW5kbGVkIGF0IHRoZSBlbmQgb2YgaGNmX3NlcnZpY2VfbmljCisqMTY6IEluIGNhc2Ugb2YgIG5vbi1ETUEgKCBlaXRoZXIgbm90IGNvbXBpbGVkIGluIG9yIGR1ZSB0byBhIHJ1bi10aW1lIGNob2ljZSk6CisqCUlmIGFuIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSwgZmlyc3QgdGhlIEZJRCBvZiB0aGF0IGZyYW1lIGlzIHJlYWQsIGluY2x1ZGluZyB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZQorKgl6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4gTm90ZSB0aGF0IHN1Y2ggYSB6ZXJvLUZJRCBpcyBhY2tub3dsZWRnZWQgYXQgdGhlIGVuZCBvZgorKgloY2Zfc2VydmljZV9uaWMgYW5kIHRoYXQgdGhpcyBkZXBlbmRzIG9uIHRoZSBJRkJfUnhMZW4gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGJlZ2luIG9mIGhjZl9zZXJ2aWNlX25pYy4KKyoJVGhlIEFzc2VydCB2YWxpZGF0ZXMgdGhlIEhDRiBhc3N1bXB0aW9uIGFib3V0IEhlcm1lcyBpbXBsZW1lbnRhdGlvbiB1cG9uIHdoaWNoIHRoZSByYW5nZSBvZgorKglQc2V1ZG8tUklEcyBpcyBiYXNlZC4KKyoJVGhlbiB0aGUgY29udHJvbCBmaWVsZHMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSA4MDIuMyBmcmFtZSBhcmUgcmVhZCBmcm9tIHRoZSBOSUMgaW50byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KKyoJVGhlIHN0YXR1cyBmaWVsZCBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKyoJVGhlIGxlbmd0aCBpcywgYWZ0ZXIgaW1wbGljaXQgRW5kaWFuZXNzIGNvbnZlcnNpb24gaWYgbmVlZGVkLCBhbmQgYWRqdXN0bWVudCBmb3IgdGhlIDE0IGJ5dGVzIG9mIHRoZQorKgk4MDIuMyBNQUMgaGVhZGVyLCBzdG9yZWQgaW4gSUZCX1J4TGVuLgorKglJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIFRPVEFMIGxlbmd0aCBvZiAxNCBhcmUgcmVjZWl2ZWQsIHNvIHdpdGhvdXQgdGhpcworKglsZW5ndGggYWRqdXN0bWVudCwgSUZCX1J4TGVuIGNvdWxkIG5vdCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGZyYW1lcyBmcm9tICJubyBmcmFtZSIuCisqCU5vIE1JQyBjYWxjdWxhdGlvbiBwcm9jZXNzZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVhZGluZyBvZiB0aGVzZSBDb250cm9sIGZpZWxkcy4KKyoyNjogVGhpcyBsZW5ndGggdGVzdCBmZWVscyBsaWtlIHN1cGVyZmx1b3VzIHJvYnVzdG5lc3MgYWdhaW5zdCBtYWxmb3JtZWQgZnJhbWVzLCBidXQgaXQgdHVybmVkIG91dCB0byBiZQorKgluZWVkZWQgaW4gdGhlIHJlYWwgKGhvc3RpbGUpIHdvcmxkLgorKglUaGUgZGVjYXBzdWxhdGlvbiBjaGVjayBuZWVkcyBzdWZmaWNpZW50IGRhdGEgdG8gcmVwcmVzZW50IERBLCBTQSwgTCwgU05BUCBhbmQgVHlwZSB3aGljaCBhbW91bnRzIHRvCisqCTIyIGJ5dGVzLiBJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIHNtYWxsZXIgbGVuZ3RoIGFyZSByZWNlaXZlZC4gVG8gcHJldmVudAorKgl0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBnb2VzIGhheXdpcmUsIGEgY2hlY2sgb24gdGhlIGxlbmd0aCBpcyBuZWVkZWQuCisqCVRoZSBhY3R1YWwgZGVjYXBzdWxhdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGUgZmx5IGluIHRoZSBjb3B5aW5nIHByb2Nlc3MgYnkgb3ZlcndyaXRpbmcgdGhlIFNOQVAgaGVhZGVyLgorKglOb3RlIHRoYXQgaW4gY2FzZSBvZiBkZWNhcHN1bGF0aW9uIHRoZSBTTkFQIGhlYWRlciBpcyBub3QgcGFzc2VkIHRvIHRoZSBNU0YsIGhlbmNlIElGQl9SeExlbiBtdXN0IGJlCisqCWNvbXBlbnNhdGVkIGZvciB0aGUgU05BUCBoZWFkZXIgbGVuZ3RoLgorKglUaGUgMjIgYnl0ZXMgbmVlZGVkIGZvciBkZWNhcHN1bGF0aW9uIGFyZSAobW9yZSB0aGFuKSBzdWZmaWNpZW50IGZvciB0aGUgZXhjZXB0aW9uYWwgaGFuZGxpbmcgb2YgdGhlCisqCU1JQyBhbGdvcml0aG0gb2YgdGhlIEwtZmllbGQgKHJlcGxhY2luZyB0aGUgMiBieXRlIEwtZmllbGQgd2l0aCA0IDB4MDAgYnl0ZXMpLgorKjMwOiBUaGUgMTIgaW4gdGhlIG5vLVNTTiBicmFuY2ggY29ycmVzcG9uZHMgd2l0aCB0aGUgZ2V0X2ZyYWcsIHRoZSAyIHdpdGggdGhlIElQVyBvZiB0aGUgU1NOIGJyYW5jaAorKjMyOiBJZiBIZXJtZXMgcmVwb3J0ZWQgTUlDLXByZXNlbmNlLCB0aGFuIHRoZSBNSUMgZW5naW5lIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIG5vbi1kdW1teSBNSUMgY2FsY3VsYXRpb24KKyoJcm91dGluZSBhZGRyZXNzIGFuZCBhcHByb3ByaWF0ZSBrZXkuCisqMzQ6IFRoZSA4IGJ5dGVzIGFmdGVyIHRoZSBEQSwgU0EsIEwgYXJlIHJlYWQgYW5kIGl0IGlzIGNoZWNrZWQgd2hldGhlciBkZWNhcHN1bGF0aW9uIGlzIG5lZWRlZCBpLmUuOgorKgkgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCBUdW5uZWwgZW5jYXBzdWxhdGlvbiBvcgorKgkgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCAxMDQyIEVuY2Fwc3VsYXRpb24gYW5kIGhjZl9lbmNhcCByZXBvcnRzIHRoYXQgdGhlIEhDRiB3b3VsZCBub3QgaGF2ZSB1c2VkCisqCQkxMDQyIGFzIHRoZSBlbmNhcHN1bGF0aW9uIG1lY2hhbmlzbQorKglOb3RlIHRoYXQgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSBSeEZTIGluIGJ1ZnAgaGFzIE5hdGl2ZSBFbmRpYW5lc3MgZHVlIHRvIHRoZSBjb252ZXJzaW9uIGRvbmUgYnkgdGhlCisqCUJFX1BBUiBpbiBnZXRfZnJhZy4KKyozNjogVGhlIFR5cGUgZmllbGQgaXMgdGhlIG9ubHkgd29yZCBrZXB0IChhZnRlciBtb3ZpbmcpIG9mIHRoZSBqdXN0IHJlYWQgOCBieXRlcywgaXQgaXMgbW92ZWQgdG8gdGhlCisqCUwtZmllbGQuICBUaGUgb3JpZ2luYWwgTC1maWVsZCBhbmQgNiBieXRlIFNOQVAgaGVhZGVyIGFyZSBkaXNjYXJkZWQsIHNvIElGQl9SeExlbiBhbmQgYnVmX2FkZHIgbXVzdAorKgliZSBhZGp1c3RlZCBieSA4LgorKjQwOiBEZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGZyYW1lIChzdGFydGluZyB3aXRoIERBKSBmaXRzIGluIHRoZSBMb29rYWhlYWQgYnVmZmVyLCB0aGVuIHJlYWQgdGhlIG5vdC15ZXQKKyoJcmVhZCBkYXRhIGludG8gdGhlIGxvb2thaGVhZCBidWZmZXIuCisqCUlmIHRoZSBsb29rYWhlYWQgYnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBtZXNzYWdlLCBjaGVjayB0aGUgTUlDLiBUaGUgbWFqb3JpdHkgY29uc2lkZXJlZCB0aGlzCisqCUkvRiBtb3JlIGFwcHJvcHJpYXRlIHRoZW4gaGF2ZSB0aGUgTVNGIGNhbGwgaGNmX2dldF9kYXRhIG9ubHkgdG8gY2hlY2sgdGhlIE1JQy4KKyo0NDogU2luY2UgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgaXMgY29waWVkIGZyb20gTklDIFJBTSB0byBQQyBSQU0sIHRoZSBSeCBjYW4gYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMKKyoJdG8gb3B0aW1pemUgdGhlIGZsb3cgKCBhIGJldHRlciBjaGFuY2UgdG8gZ2V0IG5ldyBSeCBkYXRhIGluIHRoZSBuZXh0IHBhc3MgdGhyb3VnaCBoY2Zfc2VydmljZV9uaWMgKS4KKyoJVGhpcyBhY2tub3dsZWRnZW1lbnQgY2FuIG5vdCBiZSBkb25lIHZpYSBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX1JYX0FDSyApIGJlY2F1c2UgdGhpcyBhbHNvIGNsZWFycworKglJRkJfUnhMRU4gdGh1cyBjb3JydXB0aW5nIHRoZSBJL0YgdG8gdGhlIE1TRi4KKyo7PzogSW4gY2FzZSBvZiBETUEgKGNvbXBpbGVkIGluIGFuZCBhY3RpdmF0ZWQpOgorCisKKyo1NDogTGltaXRpbmcgdGhlIG51bWJlciBvZiBwbGFjZXMgd2hlcmUgdGhlIEYvVyBpcyBhY2tlZCAoZS5nLiB0aGUgbWVyZ2luZyBvZiB0aGUgUngtQUNLIHdpdGggdGhlIG90aGVyCisqCUFDS3MpLCBpcyBzdXBwb3NlZCB0byBkaW1pbmlzaCB0aGUgcG90ZW50aWFsIG9mIHJhY2UgY29uZGl0aW9ucyBpbiB0aGUgRi9XLgorKglOb3RlIDE6IFRoZSBDTUQgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGNtZF9jbXBsCisqCU5vdGUgMjogSFJFR19FVl9BQ0tfUkVHX1JFQURZIGlzIDB4MDAwMCBmb3IgSC1JIChhbmQgaG9wZWZ1bGx5IEgtSUkuNSkKKyoJTm90ZSAzOiBUaGUgQUxMT0MgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGdldF9maWQgKGV4Y2VwdCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZsb3cpCisqCisqLk5PVElDRQorKiBUaGUgTm9uLURNQSBIUkVHX0VWX1JYIGlzIGhhbmRsZWQgZGlmZmVyZW50IGNvbXBhcmVkIHdpdGggdGhlIG90aGVyIEYvVyBldmVudHMuCisqIFRoZSBIUkVHX0VWX1JYIGV2ZW50IGlzIGFja25vd2xlZGdlZCBieSB0aGUgZmlyc3QgaGNmX3NlcnZpY2VfbmljIGNhbGwgYWZ0ZXIgdGhlCisqIGhjZl9zZXJ2aWNlX25pYyBjYWxsIHRoYXQgcmVwb3J0ZWQgdGhlIG9jY3VycmVuY2Ugb2YgdGhpcyBldmVudC4KKyogVGhpcyBhY2tub3dsZWRnbWVudAorKiBtYWtlcyB0aGUgbmV4dCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSAoaWYgYW55KSBhdmFpbGFibGUuCisqIEFuIHVwZGF0ZWQgSUZCX1J4TGVuCisqIGZpZWxkIHJlZmxlY3RzIHRoaXMgYXZhaWxhYmlsaXR5LgorKgorKi5OT1RJQ0UKKyogVGhlIG1pbmltdW0gc2l6ZSBmb3IgTGVuIG11c3Qgc3VwcGx5IHNwYWNlIGZvcjoKKyogLQlhbiBGL1cgZGVwZW5kZW50IG51bWJlciBvZiBieXRlcyBvZiBDb250cm9sIEluZm8gZmllbGQgaW5jbHVkaW5nIHRoZSA4MDIuMTEgSGVhZGVyIGZpZWxkCisqIC0JRGVzdGluYXRpb24gQWRkcmVzcworKiAtCVNvdXJjZSBBZGRyZXNzCisqIC0JTGVuZ3RoIGZpZWxkCisqIC0JWyBTTkFQIEhlYWRlcl0KKyogLQlbIEV0aGVybmV0LUlJIFR5cGVdCisqIFRoaXMgcmVzdWx0cyBpbiA2OCBmb3IgSGVybWVzLUkgYW5kIDgwIGZvciBIZXJtZXMtSUkKKyogVGhpcyB3YXkgdGhlIG1pbmltdW0gYW1vdW50IG9mIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBuZWVkZWQgYnkgdGhlIEhDRiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZnJhbWUKKyogbXVzdCBiZSBkZWNhcHN1bGF0ZWQuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitoY2Zfc2VydmljZV9uaWMoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgdW5zaWduZWQgaW50IGxlbiApCit7CisKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMTYJCXN0YXQ7Cit3Y2lfYnVmcAlidWZfYWRkcjsKK2hjZl8xNiAJCWk7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1NFUlZJQ0VfTklDLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCisJSENGQVNTRVJUX0lOVAorCisJaWZicC0+SUZCX0xpbmtTdGF0ID0gMDsgLy8gOz8gdG8gYmUgb2Jzb2xldGVkIEFTQVAJCQkJCQkJCQkJCQkvKiAxKi8KKwlpZmJwLT5JRkJfRFNMaW5rU3RhdCAmPSB+Q0ZHX0xJTktfU1RBVF9DSEFOR0U7CQkJCQkJCQkJCQkJCS8qIDEqLworCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfUlhfQUNLICk7CQkJCQkJCQkJCQkJCQkvKiAyKi8KKwlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmICggc3RhdCA9IElQVyggSFJFR19FVl9TVEFUICkgKSAhPSAweEZGRkYgKSB7CQkJCQkvKiA0Ki8KKy8qCQlJRl9OT1RfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQorICoJCUlGX05PVF9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+SFJFR19FVl9CQVNJQ19NQVNLLCBzdGF0ICkgKQorICoJCUlGX1VTRV9ETUEoIEhDRkFTU0VSVCggISggc3RhdCAmIH4oIEhSRUdfRVZfQkFTSUNfTUFTSyBeICggSFJFR19FVl8uLi5ETUEuLi4uICksIHN0YXQgKSApCisgKi8KKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA4Ki8KKwkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgJiYgc3RhdCAmIEhSRUdfRVZfQUxMT0MgKSB7IC8vTm90ZTogSUZCX1JzY0luZCBpcyBBTFdBWVMgMSBmb3IgRE1BCisJCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsKKwkJfQorCQlJRl9UQUxMWSggaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPX0RST1AgKSBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZJbmZvKys7ICkKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLCisJCWlmICggc3RhdCAmIEhSRUdfRVZfVElDSyApIHsKKwkJCWlmYnAtPklGQl9UaWNrQ250Kys7CisJCX0KKyNpZiAwIC8vIChIQ0ZfU0xFRVApICYgSENGX0REUworCQlpZiAoIGlmYnAtPklGQl9UaWNrQ250ID09IDMgJiYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEICkgPT0gMCApIHsKK0NGR19ERFNfVElDS19USU1FX1NUUkNUIGx0djsKKwkJCS8vIDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkgaW4gbm90LWNvbm5lY3RlZCBtb2RlIC0tPmdvIGludG8gRFNfT09SCisJCQloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1NMRUVQICk7CisJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCB8PSBDRkdfTElOS19TVEFUX0RTX09PUjsgLy9zZXQgT3V0T2ZSYW5nZQorCQkJbHR2LmxlbiA9IDI7CisJCQlsdHYudHlwID0gQ0ZHX0REU19USUNLX1RJTUU7CisJCQlsdHYudGlja190aW1lID0gKCAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9USU1FUiApICsgMHgxMCApICo2NDsgLy83OCBpcyBtb3JlIHJpZ2h0CisJCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZsdHYgKTsKKwkJCXByaW50ayggIjw1PlByZXBhcmluZyBmb3Igc2xlZXAsIGxpbmtfc3RhdHVzOiAlMDRYLCB0aW1lciA6ICVkXG4iLAorCQkJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCwgbHR2LnRpY2tfdGltZSApOy8vOz9yZW1vdmUgbWUgMSBkYXkKKwkJCWlmYnAtPklGQl9UaWNrQ250Kys7IC8vOz9qdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3Qga2VlcCBvbiBwcmludGluZyBhYm92ZSBtZXNzYWdlCisJCQlpZiAoIGx0di50aWNrX3RpbWUgPCAzMDAgKiAxMjUgKSBpZmJwLT5JRkJfRFNMaW5rU3RhdCArPSAweDAwMTA7CisKKwkJfQorI2VuZGlmIC8vIEhDRl9ERFMKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLCisJCWlmICggc3RhdCAmIEhSRUdfRVZfSU5GTyApIHsKKwkJCWlzcl9pbmZvKCBpZmJwICk7CisJCX0KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9UWF9FWAorCQlpZiAoIHN0YXQgJiBIUkVHX0VWX1RYX0VYVCAmJiAoIGkgPSBJUFcoIEhSRUdfVFhfQ09NUExfRklEICkgKSAhPSAwIC8qREFXQSovICkgeworCQkJREFXQV9aRVJPX0ZJRCggSFJFR19UWF9DT01QTF9GSUQgKQorCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpLCAwLCBJT19JTiApOworCQkJZ2V0X2ZyYWcoIGlmYnAsICZpZmJwLT5JRkJfVHhGc1N0YXQsIEhGU19TV1NVUCBCRV9QQVIoMSkgKTsKKwkJfQorI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYCisvLyFybGF2IERNQSBlbmdpbmUgd2lsbCBoYW5kbGUgdGhlIHJ4IGV2ZW50LCBub3QgdGhlIGRyaXZlcgorI2lmIEhDRl9ETUEKKwkJaWYgKCAhKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSApIC8vISEgYmUgYXdhcmUgb2YgdGhlIGxvZ2ljYWwgaW5kZW50YXRpb25zCisjZW5kaWYgLy8gSENGX0RNQQorLyoxNiovCSAgaWYgKCBzdGF0ICYgSFJFR19FVl9SWCAmJiAoIGlmYnAtPklGQl9SeEZJRCA9IElQVyggSFJFR19SWF9GSUQgKSApICE9IDAgKSB7IC8vaWYgMCB0aGVuIERBV0FfQUNLCisJCQlIQ0ZBU1NFUlQoIGJ1ZnAsIGxlbiApCisJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiwgbGVuICkKKwkJCURBV0FfWkVST19GSUQoIEhSRUdfUlhfRklEICkKKwkJCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4RklEIDwgQ0ZHX1BST0RfREFUQSwgaWZicC0+SUZCX1J4RklEKQorCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpZmJwLT5JRkJfUnhGSUQsIDAsIElPX0lOICk7CisJCQlnZXRfZnJhZyggaWZicCwgYnVmcCwgSEZTX0FERFJfREVTVCBCRV9QQVIoMSkgKTsKKwkJCWlmYnAtPklGQl9sYXAgPSBidWZfYWRkciA9IGJ1ZnAgKyBIRlNfQUREUl9ERVNUOworCQkJaWZicC0+SUZCX1J4TGVuID0gKGhjZl8xNikoYnVmcFtIRlNfREFUX0xFTl0gKyAoYnVmcFtIRlNfREFUX0xFTisxXTw8OCkgKyAyKjYgKyAyKTsKKy8qMjYqLwkJaWYgKCBpZmJwLT5JRkJfUnhMZW4gPj0gMjIgKSB7CQkvLyBjb252ZW5pZW50IGZvciBNSUMgY2FsY3VsYXRpb24gKDUgRFdzICsgMSAic2tpcHBlZCIgVykKKwkJCQkJCQkJCQkJCS8vLiAgZ2V0IERBLFNBLExlbi9UeXBlIGFuZCAoU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKKy8qMzAqLwkJCWdldF9mcmFnKCBpZmJwLCBidWZfYWRkciwgMjIgQkVfUEFSKDApICk7CisvKjMyKi8JCQlDQUxDX1JYX01JQyggYnVmcCwgLTEgKTsJCS8vLiAgaW5pdGlhbGl6ZSBNSUMKKwkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsJLy8uICBNSUMgb3ZlciBEQSwgU0EKKwkJCQlDQUxDX1JYX01JQyggbnVsbF9hZGRyLCA0ICk7CS8vLiAgTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCisJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyKzE0LCA4ICk7CS8vLiAgc2tpcCBMZW4sIE1JQyBvdmVyIFNOQVAsVHlwZSBvciA4IGRhdGEgYnl0ZXMpCisJCQkJYnVmX2FkZHIgKz0gMjI7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorLy8hIWJlIGNhcmVmdWwgZG8gbm90IHVzZSBwb3NpdGl2ZSB0ZXN0IG9uIEhDRl9BQ1RfQ0NYX09GRiwgYmVjYXVzZSBJRkJfQ0tJUFN0YXQgaXMgaW5pdGlhbGx5IDAKKwkJCQlpZiggaWZicC0+SUZCX0NLSVBTdGF0ICE9IEhDRl9BQ1RfQ0NYX09OICApCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisJCQkJeworI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKKwkJCQkJSENGQVNTRVJUKCBsZW4gPj0gSEZTX0RBVCArIDIgKyBzaXplb2Yoc25hcF9oZWFkZXIpLCBsZW4gKQorLyozNCovIAkJCQlpID0gKih3Y2lfcmVjb3JkcCkmYnVmcFtIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CisJCQkJCWlmICggaSA9PSBIRlNfU1RBVF9UVU5ORUwgfHwKKwkJCQkJCSAoIGkgPT0gSEZTX1NUQVRfMTA0MiAmJiBoY2ZfZW5jYXAoICh3Y2lfYnVmcCkmYnVmcFtIRlNfVFlQRV0gKSAhPSBFTkNfVFVOTkVMICkgKSB7CisJCQkJCQkJCQkJCQkvLy4gIGNvcHkgRS1JSSBUeXBlIHRvIDgwMi4zIExFTiBmaWVsZAorLyozNiovCQkJCQlidWZwW0hGU19MRU4gIF0gPSBidWZwW0hGU19UWVBFICBdOworCQkJCQkJYnVmcFtIRlNfTEVOKzFdID0gYnVmcFtIRlNfVFlQRSsxXTsKKwkJCQkJCQkJCQkJCS8vLiAgZGlzY2FyZCBTbmFwIGJ5IG92ZXJ3cml0aW5nIHdpdGggZGF0YQorCQkJCQkJaWZicC0+SUZCX1J4TGVuIC09IChIRlNfVFlQRSAtIEhGU19MRU4pOworCQkJCQkJYnVmX2FkZHIgLT0gKCBIRlNfVFlQRSAtIEhGU19MRU4gKTsgLy8gdGhpcyBoYXBwZW5zIHRvIGJyaW5nIHVzIGF0IGEgRFcgYm91bmRhcnkgb2YgMzYKKwkJCQkJfQorI2VuZGlmIC8vIEhDRl9FTkMKKwkJCQl9CisJCQl9CisvKjQwKi8JCWlmYnAtPklGQl9sYWwgPSBtaW4oIChoY2ZfMTYpKGxlbiAtIEhGU19BRERSX0RFU1QpLCBpZmJwLT5JRkJfUnhMZW4gKTsKKwkJCWkgPSBpZmJwLT5JRkJfbGFsIC0gKCBidWZfYWRkciAtICggYnVmcCArIEhGU19BRERSX0RFU1QgKSApOworCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCBpIEJFX1BBUigwKSApOworCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBpICk7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorCQkJaWYgKCBpZmJwLT5JRkJfbGFsID09IGlmYnAtPklGQl9SeExlbiApIHsKKwkJCQlyYyA9IGNoZWNrX21pYyggaWZicCApOworCQkJfQorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorLyo0NCovCQlpZiAoIGxlbiAtIEhGU19BRERSX0RFU1QgPj0gaWZicC0+SUZCX1J4TGVuICkgeworCQkJCWlmYnAtPklGQl9SeEZJRCA9IDA7CisJCQl9IGVsc2UgeyAvKiBJRkJfUnhGSUQgaXMgY2xlYXJlZCwgc28gIHlvdSBkbyBub3QgZ2V0IGFub3RoZXIgUnhfQWNrIGF0IG5leHQgZW50cnkgb2YgaGNmX3NlcnZpY2VfbmljICovCisJCQkJc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYOwkvL2Rvbid0IGFjayBSeCBpZiBwcm9jZXNzaW5nIG5vdCB5ZXQgY29tcGxldGVkCisJCQl9CisJCX0KKwkJLy8gaW4gY2FzZSBvZiBETUE6IHNpZ25hbCBhdmFpbGFiaWxpdHkgb2YgcnggYW5kL29yIHR4IHBhY2tldHMgdG8gTVNGCisJCUlGX1VTRV9ETUEoIGlmYnAtPklGQl9EbWFQYWNrZXRzIHw9IHN0YXQgJiAoIEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEICk7ICkKKwkJLy8gcmxhdiA6IHBlbmRpbmcgSFJFR19FVl9SRE1BRCBvciBIUkVHX0VWX1RETUFEIGV2ZW50cyBnZXQgYWNrbm93bGVkZ2VkIGhlcmUuCisvKjU0Ki8Jc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKKy8vYSBwb3NpdGl2ZSBtYXNrIHdvdWxkIGJlIGVhc2llciB0byB1bmRlcnN0YW5kIC8qNTQqLwlzdGF0ICY9IChoY2ZfMTYpfiggSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX0NNRCB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSB8IEhSRUdfRVZfQUxMT0MgfCBIUkVHX0VWX0ZXX0RNQSApOworCQlJRl9VU0VfRE1BKCBzdGF0ICY9IChoY2ZfMTYpfkhSRUdfRVZfUlg7ICkKKwkJaWYgKCBzdGF0ICkgeworCQkJREFXQV9BQ0soIHN0YXQgKTsJLypEQVdBKi8KKwkJfQorCX0KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMgKQorCXJldHVybiByYzsKK30gLy8gaGNmX3NlcnZpY2VfbmljCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKiBIIEMgRiAgIFMgVSBQIFAgTyBSIFQgICBSIE8gVSBUIEkgTiBFIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQorKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgcXVhZCBieXRlLgorKgorKi5BUkdVTUVOVFMKKyoJcAkJCWFkZHJlc3Mgb2YgdGhlIE1JQworKgltCQkJMzIgYml0IHZhbHVlIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZQorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGNhbGNfbWljIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUlDIGFsZ29yaXRobS4gSXQgaXMgYSBtb25rZXktc2VlIG1vbmtleS1kbyBjb3B5IG9mCisqIE1pY2hhZWw6OmFwcGVuZEJ5dGUoKQorKiBvZiBBcHBlbmRpeCBDIG9mIC4uLi4uLi4uLi4KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisKKyNkZWZpbmUgUk9MMzIoIEEsIG4gKSAoICgoQSkgPDwgKG4pKSB8ICggKChBKT4+KDMyLShuKSkpICAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQorI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCisKKyNkZWZpbmUgTAkqcAorI2RlZmluZSBSCSoocCsxKQorCit2b2lkCitjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCit7CisjaWYgSENGX0JJR19FTkRJQU4KKwltID0gKG0gPj4gMTYpIHwgKG0gPDwgMTYpOworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisJTCBePSBtOworCVIgXj0gUk9MMzIoIEwsIDE3ICk7CisJTCArPSBSOworCVIgXj0gKChMICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKEwgJiAweDAwZmYwMGZmKSA8PCA4KTsKKwlMICs9IFI7CisJUiBePSBST0wzMiggTCwgMyApOworCUwgKz0gUjsKKwlSIF49IFJPUjMyKCBMLCAyICk7CisJTCArPSBSOworfSAvLyBjYWxjX21pYworI3VuZGVmIFIKKyN1bmRlZiBMCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKworCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKyouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGNhbGNfbWljX3J4X2ZyYWcgLi4uLi4uLi4KKyoKKyogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCisqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCisqIGhjZl9yY3ZfbXNnLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2NhbGNfbWljX3J4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCit7CitzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKK2ludCBpOworCisJaWYgKCBsZW4gPT0gLTEgKSB7CQkJCQkJCQkvL2luaXRpYWxpemUgTUlDIGhvdXNla2VlcGluZworCQlpID0gKih3Y2lfcmVjb3JkcCkmcFtIRlNfU1RBVF07CisJCS8qIGkgPSBDTlZfU0hPUlRQX1RPX0xJVFRMRSgmcFtIRlNfU1RBVF0pOyBzaG91bGQgbm90IGJlIG5lZWRlIHRvIHByZXZlbnQgYWxpZ25tZW50IHBvcm9ibGVtcworCQkgKiBzaW5jZSBsZW4gPT0gLTEgaWYgYW5kIG9ubHkgaWYgcCBpcyBsb29rYWhhZWFkIGJ1ZmZlciB3aGljaCBNVVNUIGJlIHdvcmQgYWxpZ25lZAorCQkgKiB0byBiZSByZS1pbnZlc3RpZ2F0ZWQgYnkgTnZSCisJCSAqLworCisJCWlmICggKCBpICYgSEZTX1NUQVRfTUlDICkgPT0gMCApIHsKKwkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gMHhGRkZGOwkJCS8vc3VwcHJlc3MgTUlDIGNhbGN1bGF0aW9uCisJCX0gZWxzZSB7CisJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDA7CisvLyoJTm90ZSB0aGF0ICJjb2luY2lkZW50YWxseSIgdGhlIGJpdCBwb3NpdGlvbnMgdXNlZCBpbiBIRlNfU1RBVAorLy8qCWNvcnJlc3BvbmQgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBrZXkgaW4gSUZCX01JQ0tleQorCQkJaSA9ICggaSAmIEhGU19TVEFUX01JQ19LRVlfSUQgKSA+PiAxMDsJLyogY29pbmNpZGVudGFsbHkgbm8gc2hpZnQgbmVlZGVkIGZvciBpIGl0c2VsZiAqLworCQkJaWZicC0+SUZCX01JQ1J4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpICBdKTsKKwkJCWlmYnAtPklGQl9NSUNSeFsxXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDAgKSB7CisJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7CisJCQlwICs9IDQ7CisJCQlpZiAoIGxlbiA8IDQgKSB7CisJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAoaGNmXzE2KWxlbjsKKwkJCX0gZWxzZSB7CisJCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSA0OworCQkJCWxlbiAtPSA0OworCQkJfQorCQl9IGVsc2Ugd2hpbGUgKCBpZmJwLT5JRkJfTUlDUnhDYXJyeSA8IDQgJiYgbGVuICkgewkJLy9ub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNAorCQkJeC54OFtpZmJwLT5JRkJfTUlDUnhDYXJyeSsrXSA9ICpwKys7CisJCQlsZW4tLTsKKwkJfQorCQl3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDQgKSB7CS8vY29udHJpdmVkIHNvIHdlIGhhdmUgb25seSAxIGNhbGwgdG8gY2FsY19taWMgc28gd2UgY291bGQgYnJpbmcgaXQgaW4tbGluZQorCQkJY2FsY19taWMoIGlmYnAtPklGQl9NSUNSeCwgeC54MzIgKTsKKwkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKKwkJCXAgKz0gNDsKKwkJCWlmICggbGVuIDwgNCApIHsKKwkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IChoY2ZfMTYpbGVuOworCQkJfQorCQkJbGVuIC09IDQ7CisJCX0KKwl9Cit9IC8vIGNhbGNfbWljX3J4X2ZyYWcKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKworCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKyouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGNhbGNfbWljX3R4X2ZyYWcgLi4uLi4uLi4KKyoKKyogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCisqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCisqIGhjZl9yY3ZfbXNnLgorKgorKgorKi5ESUFHUkFNCisqCisqLk5PVElDRQorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2NhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCit7CitzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKKworCQkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWxpemF0aW9uIHJlcXVlc3QKKwlpZiAoIGxlbiA9PSAtMSApIHsKKwkJCQkJCQkJCQkJCQkJLy8uICBwcmVzdW1lIE1JQyBjYWxjdWxhdGlvbiBkaXNhYmxlZAorCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDB4RkZGRjsKKwkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgY2FsY3VsYXRpb24gZW5hYmxlZAorCQlpZiAoIGlmYnAtPklGQl9NSUNUeENudGwgKSB7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgY2xlYXIgTUlDIGNhcnJ5CisJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDA7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaW5pdGlhbGl6ZSBNSUMtZW5naW5lCisJCQlpZmJwLT5JRkJfTUlDVHhbMF0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzBdKTsJLypUeCBhbHdheXMgdXNlcyBLZXkgMCAqLworCQkJaWZicC0+SUZCX01JQ1R4WzFdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVsxXSk7CisJCX0KKwkJCQkJCQkJCQkJCQkJLy9lbHNlCisJfSBlbHNlIHsKKwkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgZW5hYmxlZCAoVHgpIC8gaWYgTUlDIHByZXNlbnQgKFJ4KQorCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBubyBjYXJyeSBmcm9tIHByZXZpb3VzIGNhbGNfbWljX2ZyYWcKKwkJaWYgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSAwICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHByZXNldCBhY2N1IHdpdGggNCBieXRlcyBmcm9tIGJ1ZmZlcgorCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBwb2ludGVyIGFjY29yZGluZ2x5CisJCQlwICs9IDQ7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgaWYgYnVmZmVyIGNvbnRhaW5lZCBsZXNzIHRoZW4gNCBieXRlcworCQkJaWYgKCBsZW4gPCA0ICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHByb21vdGUgdmFsaWQgYnl0ZXMgaW4gYWNjdSB0byBjYXJyeQorCQkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGZsYWcgYWNjdSB0byBjb250YWluIGluY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IChoY2ZfMTYpbGVuOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGVsc2UKKwkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQlpZmJwLT5JRkJfTUlDVHhDYXJyeSA9IDQ7CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCisJCQkJbGVuIC09IDQ7CisJCQl9CisJCQkJCQkJCQkJCQkJCS8vLiAgZWxzZSBpZiBNSUMgZW5hYmxlZAorCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBpZiBjYXJyeSBieXRlcyBmcm9tIHByZXZpb3VzIGNhbGNfbWljX3R4X2ZyYWcKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBtb3ZlICgxLTMpIGJ5dGVzIGZyb20gY2FycnkgaW50byBhY2N1CisJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNUeENhcnJ5IDwgNCAmJiBsZW4gKSB7CQkvKiBub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNCAqLworCQkJeC54OFtpZmJwLT5JRkJfTUlDVHhDYXJyeSsrXSA9ICpwKys7CisJCQlsZW4tLTsKKwkJfQorCQkJCQkJCQkJCQkJCQkvLy4gIHdoaWxlIGFjY3UgY29udGFpbnMgY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQkJCQkJCQkJCQkJLy8uICBhbmQgTUlDIGVuYWJsZWQKKwkJd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSA0ICkgeworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHBhc3MgYWNjdSB0byBNSUMgZW5naW5lCisJCQljYWxjX21pYyggaWZicC0+SUZCX01JQ1R4LCB4LngzMiApOworCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgbmV4dCA0IGJ5dGVzIGZyb20gYnVmZmVyIHRvIGFjY3UKKwkJCXgueDMyID0gQ05WX0xPTkdQX1RPX0xJVFRMRShwKTsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIHBvaW50ZXIKKwkJCXAgKz0gNDsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcHJvbW90ZSB2YWxpZCBieXRlcyBpbiBhY2N1IHRvIGNhcnJ5CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gaW5jb21wbGV0ZSBkb3VibGUgd29yZAorCQkJaWYgKCBsZW4gPCA0ICkgeworCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47CisJCQl9CisJCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCisJCQlsZW4gLT0gNDsKKwkJfQorCX0KK30gLy8gY2FsY19taWNfdHhfZnJhZworI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisKKyNpZiBIQ0ZfUFJPVF9USU1FCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBjYWxpYnJhdGUoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCWNhbGlicmF0ZXMgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyIHRpY2suCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUwkJTi5BLgorKgorKi5ERVNDUklQVElPTgorKiBjYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrCisqIElGQl9UaWNrSW5pIGlzIHRoZSB2YWx1ZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFMvVyBwcm90ZWN0aW9uIGNvdW50ZXIgc3VjaCB0aGF0IHRoZSBleHBpcmF0aW9uIHBlcmlvZAorKiBtb3JlIG9yIGxlc3MgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2Nlc3NvciBzcGVlZC4gSWYgSUZCX1RpY2tJbmkgaXMgbm90IHlldCBjYWxpYnJhdGVkLCBpdCBpcyBkb25lIG5vdy4KKyogVGhpcyBjYWxpYnJhdGlvbiBpcyAicmVhc29uYWJseSIgYWNjdXJhdGUgYmVjYXVzZSB0aGUgSGVybWVzIGlzIGluIGEgcXVpZXQgc3RhdGUgYXMgYSByZXN1bHQgb2YgdGhlCisqIEluaXRpYWxpemUgY29tbWFuZC4KKyoKKyoKKyouRElBR1JBTQorKgorKjE6CUlGQl9UaWNrSW5pIGlzIGluaXRpYWxpemVkIGF0IElOSV9USUNLX0lOSSBieSBoY2ZfY29ubmVjdC4gSWYgY2FsaWJyYXRlIHN1Y2NlZWRzLCBJRkJfVGlja0luaSBpcworKglndWFyYW50ZWVkIHRvIGJlIGNoYW5nZWQuIEFzIGEgY29uc2VxdWVuY2UgdGhlcmUgd2lsbCBiZSBvbmx5IDEgc2hvdCBhdCBjYWxpYnJhdGlvbiAocmVnYXJkbGVzcyBvZiB0aGUKKyoJbnVtYmVyIG9mIGluaXQgY2FsbHMpIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLgorKjI6CUNhbGlicmF0aW9uIGlzIGRvbmUgSENGX1BST1RfVElNRV9DTlQgdGltZXMuIFRoaXMgZGltaW5pc2ggdGhlIGVmZmVjdHMgb2Ygaml0dGVyIGFuZCBpbnRlcmZlcmVuY2UsCisqCWVzcGVjaWFsbHkgaW4gYSBwcmUtZW1wdGl2ZSBlbnZpcm9ubWVudC4gSENGX1BST1RfVElNRV9DTlQgaXMgaW4gdGhlIHJhbmdlIG9mIDE2IHRocm91Z2ggMzIgYW5kIGRlcml2ZWQKKyoJZnJvbSB0aGUgSENGX1BST1RfVElNRSBzcGVjaWZpZWQgYnkgdGhlIE1TRiBwcm9ncmFtbWVyLiBUaGUgZGl2aXNvciBuZWVkZWQgdG8gc2NhbGUgSENGX1BST1RfVElNRSBpbnRvIHRoZQorKgkxNi0zMiByYW5nZSwgaXMgdXNlZCBhcyBhIG11bHRpcGxpY2F0b3IgYWZ0ZXIgdGhlIGNhbGlicmF0aW9uLCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUKKyoJcmVxdWVzdGVkIHJhbmdlLiBUaGlzIHdheSBhIGNvbXByb21pc2UgaXMgYWNoaWV2ZWQgYmV0d2VlbiBhY2N1cmFjeSBhbmQgZHVyYXRpb24gb2YgdGhlIGNhbGlicmF0aW9uCisqCXByb2Nlc3MuCisqMzoJQWNrbm93bGVkZ2UgdGhlIFRpbWVyIFRpY2sgRXZlbnQuCisqCUVhY2ggY3ljbGUgaXMgbGltaXRlZCB0byBhdCBtb3N0IElOSV9USUNLX0lOSSBzYW1wbGVzIG9mIHRoZSBUaW1lclRpY2sgc3RhdHVzIG9mIHRoZSBIZXJtZXMuCisqCVNpbmNlIHRoZSBzdGFydCBvZiBjYWxpYnJhdGUgaXMgdW5yZWxhdGVkIHRvIHRoZSBIZXJtZXMgSW50ZXJuYWwgVGltZXIsIHRoZSBmaXJzdCBpbnRlcnZhbCBtYXkgbGFzdCBmcm9tIDAKKyoJdG8gdGhlIG5vcm1hbCBpbnRlcnZhbCwgYWxsIHN1YnNlcXVlbnQgaW50ZXJ2YWxzIHNob3VsZCBiZSB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIEhlcm1lcyBUaWNrIGludGVydmFsLgorKglUaGUgSGVybWVzIFRpbWVyIFRpY2sgaXMgbm90IHJlcHJvZ3JhbW1lZCBieSB0aGUgSENGLCBoZW5jZSBpdCBpcyBydW5uaW5nIGF0IHRoZSBkZWZhdWx0IG9mIDEwIGsKKyoJbWljcm9zZWNvbmRzLgorKjQ6CUlmIHRoZSBUaW1lciBUaWNrIEV2ZW50IGlzIGNvbnRpbnVvdXNseSB1cCAocHJvdF9jbnQgc3RpbGwgaGFzIHRoZSB2YWx1ZSBJTklfVElDS19JTkkpIG9yIG5vIFRpbWVyIFRpY2sKKyoJRXZlbnQgb2NjdXJyZWQgYmVmb3JlIHRoZSBwcm90ZWN0aW9uIGNvdW50ZXIgZXhwaXJlZCwgcmVzZXQgSUZCX1RpY2tJbmkgdG8gSU5JX1RJQ0tfSU5JLAorKglzZXQgdGhlIGRlZnVuY3QgYml0IG9mIElGQl9DYXJkU3RhdCAodGh1cyByZW5kZXJpbmcgdGhlIEhlcm1lcyBpbm9wZXJhYmxlKSBhbmQgZXhpdCB0aGUgY2FsaWJyYXRlIHJvdXRpbmUuCisqODoJaWZicC0+SUZCX1RpY2tJbmkgaXMgbXVsdGlwbGllZCB0byBzY2FsZSB0aGUgZm91bmQgdmFsdWUgYmFjayB0byB0aGUgcmVxdWVzdGVkIHJhbmdlIGFzIGV4cGxhaW5lZCB1bmRlciAyLgorKgorKi5OT1RJQ0UKKyogbyBBbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2Ygdmlld3BvaW50cyBwb3NzaWJsZSwgY2FsaWJyYXRlKCkgdXNlcyBhcyBlcnJvciBzdHJhdGVneSB0aGF0IGEgc2luZ2xlCisqCWZhaWx1cmUgb2YgdGhlIEhlcm1lcyBUaW1lclRpY2sgaXMgY29uc2lkZXJlZCBmYXRhbC4KKyogbyBUaGVyZSBpcyBubyBoYXJkIGFuZCBjb25jcmV0ZSB0aW1lLW91dCB2YWx1ZSBkZWZpbmVkIGZvciBIZXJtZXMgYWN0aXZpdGllcy4gVGhlIGRlZmF1bHQgMSBzZWNvbmRzIGlzCisqCWJlbGlldmVkIHRvIGJlIHN1ZmZpY2llbnRseSAicmVsYXhlZCIgZm9yIHJlYWwgbGlmZSBhbmQgdG8gYmUgc3VmZmljaWVudGx5IHNob3J0IHRvIGJlIHN0aWxsIHVzZWZ1bCBpbiBhbgorKgllbnZpcm9ubWVudCB3aXRoIGh1bWFucy4KKyogbyBOb3RlIHRoYXQgdmlhIElGQl9EZWZ1bmN0U3RhdCB0aW1lIG91dHMgaW4gY21kX3dhaXQgYW5kIGluIGhjZmlvX3N0cmluZyBibG9jayBhbGwgSGVybWVzIGFjY2VzcyB0aWxsIHRoZQorKgluZXh0IGluaXQgc28gZnVuY3Rpb25zIHdoaWNoIGNhbGwgYSBtaXggb2YgY21kX3dhaXQgYW5kIGhjZmlvX3N0cmluZyBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiBzdGF0dXMKKyoJb2YgdGhlIGxhc3QgY2FsbAorKiBvIFRoZSByZXR1cm4gY29kZSBpcyBwcmVzZXQgYXQgVGltZSBvdXQuCisqCVRoZSBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbiB0aGF0IG5vIGNhbGlicmF0ZWQgdmFsdWUgZm9yIHRoZSBwcm90ZWN0aW9uIGNvdW50IGNhbiBiZSBhc3N1bWVkIHNpbmNlCisqCWNhbGlicmF0ZSgpIGRvZXMgbm90IHlldCBoYXZlIGRldGVybWluZWQgYSBjYWxpYnJhdGVkIHZhbHVlIChhIGNhdGNoIDIyKSwgaXMgaGFuZGxlZCBieSBzZXR0aW5nIHRoZQorKglpbml0aWFsIHZhbHVlIGF0IElOSV9USUNLX0lOSSAoYnkgaGNmX2Nvbm5lY3QpLiBUaGlzIGFwcHJvYWNoIGlzIGNvbnNpZGVyZWQgc2FmZSwgYmVjYXVzZToKKyoJICAtIHRoZSBIQ0YgZG9lcyBub3QgdXNlIHRoZSBwaXBlbGluZSBtZWNoYW5pc20gb2YgSGVybWVzIGNvbW1hbmRzLgorKgkgIC0gdGhlIGxpa2VsaWhvb2Qgb2YgZmFpbHVyZSAodGhlIG9ubHkgdGltZSB3aGVuIHByb3RlY3Rpb24gY291bnQgaXMgcmVsZXZhbnQpIGlzIHNtYWxsLgorKgkgIC0gdGhlIHRpbWUgd2lsbCBiZSBzdWZmaWNpZW50bHkgbGFyZ2Ugb24gYSBmYXN0IG1hY2hpbmUgKGJ1c3kgYml0IGRyb3BzIG9uIGdvb2QgTklDIGJlZm9yZSBjb3VudGVyCisqCQlleHBpcmVzKQorKgkgIC0gdGhlIHRpbWUgd2lsbCBiZSBzdWZmaWNpZW50bHkgc21hbGwgb24gYSBzbG93IG1hY2hpbmUgKGNvdW50ZXIgZXhwaXJlcyBvbiBiYWQgTklDIGJlZm9yZSB0aGUgZW5kIHVzZXIKKyoJICAJc3dpdGNoZXMgdGhlIHBvd2VyIG9mZiBpbiBkZXNwYWlyCisqCVRoZSB0aW1lIG5lZWRlZCB0byB3cmFwIGEgMzIgYml0IGNvdW50ZXIgYXJvdW5kIGlzIGxvbmdlciB0aGFuIG1hbnkgaHVtYW5zIHdhbnQgdG8gd2FpdCwgaGVuY2UgdGhlIG1vcmUgb3IKKyoJbGVzcyBhcmJpdHJhcnkgdmFsdWUgb2YgMHg0MDAwMEwgaXMgY2hvc2VuLCBhc3N1bWluZyBpdCBkb2VzIG5vdCB0YWtlIHRvbyBsb25nIG9uIGFuIFhUIGFuZCBpcyBub3QgdG9vCisqCXNob3J0IG9uIGEgc2NyZWFtLW1hY2hpbmUuCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyB2b2lkCitjYWxpYnJhdGUoIElGQlAgaWZicCApCit7CitpbnQJCWNudCA9IEhDRl9QUk9UX1RJTUVfQ05UOworaGNmXzMyCXByb3RfY250OworCisJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9DQUxJQlJBVEUgKTsKKwlpZiAoIGlmYnAtPklGQl9UaWNrSW5pID09IElOSV9USUNLX0lOSSApIHsJCQkJCQkJCQkJCQkJLyoxKi8KKwkJaWZicC0+SUZCX1RpY2tJbmkgPSAwOwkJCQkJCQkJCQkJCQkJCQkJLyoyKi8KKwkJCXdoaWxlICggY250LS0gKSB7CisJCQkJcHJvdF9jbnQgPSBJTklfVElDS19JTkk7CisJCQkJT1BXKCBIUkVHX0VWX0FDSywgSFJFR19FVl9USUNLICk7CQkJCQkJCQkJCQkJLyozKi8KKwkJCQl3aGlsZSAoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9USUNLKSA9PSAwICYmIC0tcHJvdF9jbnQgKSB7CisJCQkJCWlmYnAtPklGQl9UaWNrSW5pKys7CisJCQkJfQorCQkJCWlmICggcHJvdF9jbnQgPT0gMCB8fCBwcm90X2NudCA9PSBJTklfVElDS19JTkkgKSB7CQkJCQkJCQkvKjQqLworCQkJCQlpZmJwLT5JRkJfVGlja0luaSA9IElOSV9USUNLX0lOSTsKKwkJCQkJaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVSOworCQkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CisJCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBwcm90X2NudCApCisJCQkJfQorCQkJfQorCQlpZmJwLT5JRkJfVGlja0luaSA8PD0gSENGX1BST1RfVElNRV9TSEZUOwkJCQkJCQkJCQkJCS8qOCovCisJfQorCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFIHwgSENGX1RSQUNFX0VYSVQgKTsKK30gLy8gY2FsaWJyYXRlCisjZW5kaWYgLy8gSENGX1BST1RfVElNRQorCisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IGNoZWNrX21pYyggSUZCUCBpZmJwICkKKyouUFVSUE9TRQkJdmVyaWZpZXMgdGhlIE1JQyBvZiBhIHJlY2VpdmVkIG5vbi1VU0IgZnJhbWUuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoKKyouUkVUVVJOUworKglIQ0ZfU1VDQ0VTUworKglIQ0ZfRVJSX01JQworKgorKi5ERVNDUklQVElPTgorKgorKgorKi5ESUFHUkFNCisqCisqNDoJdGVzdCB3aGV0aGVyIG9yIG5vdCBhIE1JQyBpcyByZXBvcnRlZCBieSB0aGUgSGVybWVzCisqMTQ6IHRoZSBjYWxjdWxhdGVkIE1JQyBhbmQgdGhlIHJlY2VpdmVkIE1JQyBhcmUgY29tcGFyZWQsIHRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCB3aGVuIHRoZXJlIGlzIGEgbWlzbWF0Y2gKKyoKKyouTk9USUNFCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50CitjaGVja19taWMoIElGQlAgaWZicCApCit7CitpbnQJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMzIgeDMyWzJdOwkJCQkvLyogYXJlYSB0byBzYXZlIHJjdmQgOCBieXRlcyBNSUMKKworCQkJCQkJCQkJCQkJCS8vaWYgTUlDIHByZXNlbnQgaW4gUnhGUworCWlmICggKih3Y2lfcmVjb3JkcCkmaWZicC0+SUZCX2xhcFstSEZTX0FERFJfREVTVF0gJiBIRlNfU1RBVF9NSUMgKSB7CisJLy9vciBpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ICE9IDB4RkZGRiApCisJCUNBTENfUlhfTUlDKCBtaWNfcGFkLCA4ICk7CQkJCQkvLy4gIHByb2Nlc3MgdXAgdG8gMyByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YSBhbmQgYXBwZW5kIDUgdG8gOCBieXRlcyBvZiBwYWRkaW5nIHRvIE1JQyBjYWxjdWxhdGlvbgorCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKXgzMiwgOCBCRV9QQVIoMCkpOy8vLiAgZ2V0IDggYnl0ZSBNSUMgZnJvbSBOSUMKKwkJCQkJCQkJCQkJCQkvLy4gIGlmIGNhbGN1bGF0ZWQgYW5kIHJlY2VpdmVkIE1JQyBkbyBub3QgbWF0Y2gKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCBzdGF0dXMgYXQgSENGX0VSUl9NSUMKKy8qMTQqLyAgaWYgKCB4MzJbMF0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFswXSkgfHwKKyAgICAgICAgCSB4MzJbMV0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFsxXSkJICApIHsKKwkJCXJjID0gSENGX0VSUl9NSUM7CisJCX0KKwl9CisJCQkJCQkJCQkJCQkJLy9yZXR1cm4gc3RhdHVzCisJcmV0dXJuIHJjOworfSAvLyBjaGVja19taWMKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgY21kX2NtcGwoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCXdhaXRzIGZvciBIZXJtZXMgQ29tbWFuZCBDb21wbGV0aW9uLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJSUZCX0RlZnVuY3RTdGF0CisqCUhDRl9FUlJfVElNRV9PVVQKKyoJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyoJSENGX1NVQ0NFU1MKKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKgorKjI6CU9uY2UgY21kX2NtcGwgaXMgY2FsbGVkLCB0aGUgQnVzeSBvcHRpb24gYml0IGluIElGQl9DbWQgbXVzdCBiZSBjbGVhcmVkCisqNDoJSWYgU3RhdHVzIHJlZ2lzdGVyIGFuZCBjb21tYW5kIGNvZGUgZG9uJ3QgbWF0Y2ggZWl0aGVyOgorKgkgLSB0aGUgSGVybWVzIGFuZCBIb3N0IGFyZSBvdXQgb2Ygc3luYyAoIGEgZmF0YWwgZXJyb3IpCisqCSAtIGVycm9yIGJpdHMgYXJlIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLgorKglPdXQgb2Ygc3luYyBpcyBjb25zaWRlcmVkIGZhdGFsIGFuZCBicmluZ3MgdGhlIEhDRiBpbiBEZWZ1bmN0IG1vZGUKKyoJRXJyb3JzIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyIHNob3VsZCBiZSBjYXVzZWQgYnkgc2VxdWVuY2UgdmlvbGF0aW9ucyBpbiBIZXJtZXMgY29tbWFuZAorKglzZXF1ZW5jZXMgYW5kIGhlbmNlIHRoZXNlIGJ1Z3Mgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZCBkdXJpbmcgZW5naW5lZXJpbmcgdGVzdGluZy4gU2luY2UgdGhlcmUgaXMgbm8KKyoJc3RyYXRlZ3kgdG8gY29wZSB3aXRoIHRoaXMgcHJvYmxlbSwgaXQgbWlnaHQgYXMgd2VsbCBiZSBpZ25vcmVkIGF0IHJ1biB0aW1lLiBOb3RlIHRoYXQgZm9yIGFueSBwYXJ0aWN1bGFyCisqCXNpdHVhdGlvbiB3aGVyZSBhIHN0cmF0ZWd5IGlzIGZvcm11bGF0ZWQgdG8gaGFuZGxlIHRoZSBjb25zZXF1ZW5jZXMgb2YgYSBwYXJ0aWN1bGFyIGJ1ZyBjYXVzaW5nIGEKKyoJcGFydGljdWxhciBFcnJvciBzaXR1YXRpb24gcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIsIHRoZSBidWcgc2hvdWxkIGJlIHJlbW92ZWQgcmF0aGVyIHRoYW4gYWRkaW5nCisqCWxvZ2ljIHRvIGNvcGUgd2l0aCB0aGUgY29uc2VxdWVuY2VzIG9mIHRoZSBidWcuCisqCVRoZXJlIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2hlcmUgYW4gZXJyb3IgcmVwb3J0IHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyIGV2ZW4gYnJvdWdodCB0aGUgSENGIGluIGRlZnVuY3QKKyoJbW9kZSAoYWx0aG91Z2ggaXQgd2FzIG5vdCB5ZXQgbmFtZWQgbGlrZSB0aGF0IGF0IHRoYXQgdGltZSkuIFRoaXMgaXMgcGFydGljdWxhciB1bmRlc2lyYWJsZSBiZWhhdmlvciBmb3IgYQorKglnZW5lcmFsIGxpYnJhcnkuCisqCVNpbXBseSByZXBvcnRpbmcgdGhlIGVycm9yIChhcyAiaW50ZXJlc3RpbmciKSBpcyBkZWJhdGFibGUuIFRoZXJlIGFsc28gaGF2ZSBiZWVuIEhDRiB2ZXJzaW9ucyB3aXRoIHRoaXMKKyoJc3RyYXRlZ3kgdXNpbmcgdGhlICJ2YWd1ZSIgSENGX0ZBSUxVUkUgY29kZS4KKyoJVGhlIGVycm9yIGlzIHJlcG9ydGVkIHZpYToKKyoJIC0gTWlzY0VyciB0YWxseSBvZiB0aGUgSENGIFRhbGx5IHNldAorKgkgLSB0aGUgKGluZm9ybWF0aXZlKSBmaWVsZHMgSUZCX0VyckNtZCBhbmQgSUZCX0VyclF1YWxpZmllcgorKgkgLSB0aGUgYXNzZXJ0IG1lY2hhbmlzbQorKjg6CUhlcmUgdGhlIERlZnVuY3QgY2FzZSBhbmQgdGhlIFN0YXR1cyBlcnJvciBhcmUgc2VwYXJhdGVseSB0cmVhdGVkCisqCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK2NtZF9jbXBsKCBJRkJQIGlmYnAgKQoreworCitQUk9UX0NOVF9JTkkKK2ludAkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK2hjZl8xNglzdGF0OworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfQ1BMLCBpZmJwLT5JRkJfQ21kICkKKwlpZmJwLT5JRkJfQ21kICY9IH5IQ01EX0JVU1k7CQkJCQkJCQkJCQkJLyogMiAqLworCUhDRl9XQUlUX1dISUxFKCAoSVBXKCBIUkVHX0VWX1NUQVQpICYgSFJFR19FVl9DTUQpID09IDAgKTsJCQkJCS8qIDQgKi8KKwlzdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKKyNpZiBIQ0ZfUFJPVF9USU1FCisJaWYgKCBwcm90X2NudCA9PSAwICkgeworCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQorCQlyYyA9IEhDRl9FUlJfVElNRV9PVVQ7CisJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBpZmJwLT5JRkJfQ21kICkKKwl9IGVsc2UKKyNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCisJeworCQlEQVdBX0FDSyggSFJFR19FVl9DTUQgKTsKKy8qNCovCWlmICggc3RhdCAhPSAoaWZicC0+SUZCX0NtZCAmIEhDTURfQ01EX0NPREUpICkgeworLyo4Ki8JCWlmICggKCAoc3RhdCBeIGlmYnAtPklGQl9DbWQgKSAmIEhDTURfQ01EX0NPREUpICE9IDAgKSB7CisJCQkJcmMgPSBpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUTsKKwkJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgfD0gQ0FSRF9TVEFUX0RFRlVOQ1Q7CisJCQl9CisJCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQorCQkJaWZicC0+SUZCX0VyckNtZCA9IHN0YXQ7CisJCQlpZmJwLT5JRkJfRXJyUXVhbGlmaWVyID0gSVBXKCBIUkVHX1JFU1BfMCApOworCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIElQVyggSFJFR19QQVJBTV8wICksIGlmYnAtPklGQl9DbWQgKSApCisJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggaWZicC0+SUZCX0VyclF1YWxpZmllciwgaWZicC0+SUZCX0VyckNtZCApICkKKwkJfQorCX0KKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYykKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0NQTCApCisJcmV0dXJuIHJjOworfSAvLyBjbWRfY21wbAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgY21kX2V4ZSggSUZCUCBpZmJwLCBpbnQgY21kX2NvZGUsIGludCBwYXJfMCApCisqLlBVUlBPU0UJCUV4ZWN1dGVzIHN5bmNocm9ub3VzIHBhcnQgb2YgSGVybWVzIENvbW1hbmQgYW5kIC0gb3B0aW9uYWxseSAtIHdhaXRzIGZvciBDb21tYW5kIENvbXBsZXRpb24uCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJY21kX2NvZGUKKyoJcGFyXzAKKyoKKyouUkVUVVJOUworKglJRkJfRGVmdW5jdFN0YXQKKyoJSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyoJSENGX1NVQ0NFU1MKKyoJSENGX0VSUl9UT19CRV9BRERFRAk8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAorKgorKi5ERVNDUklQVElPTgorKiBFeGVjdXRlcyBzeW5jaHJvbm91cyBIZXJtZXMgQ29tbWFuZCBhbmQgd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbgorKgorKiBUaGUgZ2VuZXJhbCBIQ0Ygc3RyYXRlZ3kgaXMgdG8gd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiBBcyBhIGNvbnNlcXVlbmNlOgorKiAtIHRoZSByZWFkIG9mIHRoZSBidXN5IGJpdCBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWFuZCByZWdpc3RlciBpcyBzdXBlcmZsdW91cworKiAtIHRoZSBIZXJtZXMgcmVxdWlyZW1lbnQgdGhhdCBubyBJbnF1aXJ5IGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkIGlmIHRoZXJlIGlzIHN0aWxsIGFuIHVuYWNrbm93bGVkZ2VkCisqCUlucXVpcnkgY29tbWFuZCBvdXRzdGFuZGluZywgaXMgYXV0b21hdGljYWxseSBtZXQuCisqIFRoZSBUeCBjb21tYW5kIHVzZXMgdGhlICJCdXN5IiBiaXQgaW4gdGhlIGNtZF9jb2RlIHBhcmFtZXRlciB0byBkZXZpYXRlIGZyb20gdGhpcyBnZW5lcmFsIEhDRiBzdHJhdGVneS4KKyogVGhlIGlkZWEgaXMgdGhhdCBieSBub3QgYnVzeS13YWl0aW5nIG9uIGNvbXBsZXRpb24gb2YgdGhpcyBmcmVxdWVudGx5IHVzZWQgY29tbWFuZCB0aGUgcHJvY2Vzc29yCisqIHV0aWxpemF0aW9uIGlzIGRpbWluaXNoZWQgd2hpbGUgdXNpbmcgdGhlIGJ1c3ktd2FpdCBvbiBhbGwgb3RoZXIgc2VsZG9tIHVzZWQgY29tbWFuZHMgdGhlIGZsb3cgaXMga2VwdAorKiBzaW1wbGUuCisqCisqCisqCisqLkRJQUdSQU0KKyoKKyoxOglza2lwIHRoZSBib2R5IG9mIGNtZF9leGUgd2hlbiBpbiBkZWZ1bmN0IG1vZGUgb3Igd2hlbiAtIGJhc2VkIG9uIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciB3cml0ZSBhbmQKKyoJcmVhZCBiYWNrIHRlc3QgLSB0aGVyZSBpcyBhcHBhcmVudGx5IG5vIE5JQy4KKyoJTm90ZTogd2UgZ2F2ZSB1cCBvbiB0aGUgIm9sZCIgc3RyYXRlZ3kgdG8gd3JpdGUgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIGF0IG1hZ2ljIG9ubHkgd2hlbiBuZWVkZWQuIER1ZSB0bworKgl0aGUgaW50cmljYXRlbmVzcyBvZiBIZXJtZXMgRi9XIHZhcmlldGllcyAoIHdoaWNoIGJlaGF2ZSBkaWZmZXJlbnRseSBhcyBmYXIgYXMgY29ycnVwdGlvbiBvZiB0aGUgUy9XCisqCVN1cHBvcnQgcmVnaXN0ZXIgaXMgaW52b2x2ZWQpLCB0aGUgaW5jcmVhc2luZyBudW1iZXIgb2YgSGVybWVzIGNvbW1hbmRzIHdoaWNoIGRvIGFuIGltcGxpY2l0IGluaXRpYWxpemUKKyoJKHRodXMgbW9kaWZ5aW5nIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlcikgYW5kIHRoZSB3b3JrYXJvdW5kcyBvZiBzb21lIE9TL1N1cHBvcnQgUy9XIGluZHVjZWQgYXNwZWN0cyAoZS5nLgorKgl0aGUgU3lzdGVtIFNvZnQgbGlicmFyeSBhdCBXaW5OVCB3aGljaCBwb3N0cG9uZXMgdGhlIGFjdHVhbCBtYXBwaW5nIG9mIEkvTyBzcGFjZSB1cCB0byAzMCBzZWNvbmRzIGFmdGVyCisqCWdpdmluZyB0aGUgZ28tYWhlYWQpLCB0aGUgIm1hZ2ljIiBzdHJhdGVneSBpcyBub3cgcmVkdWNlZCB0byBhIHNpbXBsZSB3cml0ZSBhbmQgcmVhZCBiYWNrLiBUaGlzIG1lYW5zIHRoYXQKKyoJcHJvYmxlbXMgbGlrZSBhIGJ1ZyB0cmFtcGluZyBvdmVyIHRoZSBtZW1vcnkgbWFwcGVkIEhlcm1lcyByZWdpc3RlcnMgd2lsbCBubyBsb25nZXIgYmUgbm90aWNlZCBhcyBzaWRlCisqCWVmZmVjdCBvZiB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgY2hlY2suCisqMjoJY2hlY2sgd2hldGhlciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQgc2tpcHBlZCB0aGUgYnVzeSB3YWl0IGFuZCBpZiBzbywgY2hlY2sgZm9yIGNvbW1hbmQgY29tcGxldGlvbgorKgorKi5OT1RJQ0UKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0hDRl9TVEFUSUMgaW50CitjbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICkJLy9pZiBIQ01EX0JVU1kgb2YgY21kX2NvZGUgc2V0LCB0aGVuIGRvIE5PVCB3YWl0IGZvciBjb21wbGV0aW9uCit7CitpbnQgcmM7CisKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NNRF9FWEUsIGNtZF9jb2RlICkKKwlIQ0ZBU1NFUlQoIChjbWRfY29kZSAmIEhDTURfQ01EX0NPREUpICE9IEhDTURfVFggfHwgY21kX2NvZGUgJiBIQ01EX0JVU1ksIGNtZF9jb2RlICkgLy9UeCBtdXN0IGhhdmUgQnVzeSBiaXQgc2V0CisJT1BXKCBIUkVHX1NXXzAsIEhDRl9NQUdJQyApOworCWlmICggSVBXKCBIUkVHX1NXXzAgKSA9PSBIQ0ZfTUFHSUMgKSB7CQkJCQkJCQkJCQkJCQkvKiAxICovCisJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0OworCX0KKwllbHNlIHJjID0gSENGX0VSUl9OT19OSUM7CisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJLy87P2lzIHRoaXMgYSBob3QgaWRlYSwgYmV0dGVyIE1FQVNVUkUgcGVyZm9ybWFuY2UgaW1wYWN0CisvKjIqLwlpZiAoIGlmYnAtPklGQl9DbWQgJiBIQ01EX0JVU1kgKSB7CisJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CisJCX0KKwkJT1BXKCBIUkVHX1BBUkFNXzAsIHBhcl8wICk7CisJCU9QVyggSFJFR19DTUQsIGNtZF9jb2RlICZ+SENNRF9CVVNZICk7CisJCWlmYnAtPklGQl9DbWQgPSBjbWRfY29kZTsKKwkJaWYgKCAoY21kX2NvZGUgJiBIQ01EX0JVU1kpID09IDAgKSB7CS8vOz9pcyB0aGlzIGEgaG90IGlkZWEsIGJldHRlciBNRUFTVVJFIHBlcmZvcm1hbmNlIGltcGFjdAorCQkJcmMgPSBjbWRfY21wbCggaWZicCApOworCQl9CisJfQorCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIE1FUkdFXzIoIHJjLCBjbWRfY29kZSApICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ01EX0VYRSApCisJcmV0dXJuIHJjOworfSAvLyBjbWRfZXhlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKQorKi5QVVJQT1NFCQlkb3dubG9hZHMgRi9XIGltYWdlIGludG8gTklDIGFuZCBpbml0aWF0ZXMgZXhlY3V0aW9uIG9mIHRoZSBkb3dubG9hZGVkIEYvVy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKglsdHZwCQlzcGVjaWZpZXMgdGhlIHBzZXVkby1SSUQgKGFzIGRlZmluZWQgYnkgV0NJKQorKgorKi5SRVRVUk5TCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoxOglGaXJzdCwgQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSkgYmxvY2tlZCBjbWQgcGlwZSBsaW5lCisqCU5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKKyoJcGVuZGluZworKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCisqCUhlcm1lcyBJbml0aWFsaXplCisqCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK2Rvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApCQkJCQkJLy9IZXJtZXMtSUkgZG93bmxvYWQgKHZvbGF0aWxlIG9ubHkpCit7CitoY2ZfMTYJCQkJaTsKK2ludAkJCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKK3djaV9idWZwCQkJY3A7CitoY2ZfaW8JCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOworCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETCwgbHR2cC0+dHlwICkKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVECisJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPm1vZGUgKQorI2Vsc2UKKwkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWwgInByb2dyYW0iIExUVgorCWlmICggaWZicC0+SUZCX0RMTW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKKwkJCQkJCQkJCQkJCQkvLy4gIHN3aXRjaCBIZXJtZXMgdG8gaW5pdGlhbCBtb2RlCisvKjEqLwlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKKwkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0lOSSwgMCApOwkvKiBIQ01EX0lOSSBjYW4gbm90IGJlIHBhcnQgb2YgaW5pdCgpIGJlY2F1c2UgdGhhdCBpcyBjYWxsZWQgb24KKwkJCQkJCQkJCQkJICogb3RoZXIgb2NjYXNpb25zIGFzIHdlbGwgKi8KKwkJcmMgPSBpbml0KCBpZmJwICk7CisJfQorCQkJCQkJCQkJCQkJCS8vaWYgZmluYWwgInByb2dyYW0iIExUVgorCWlmICggbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGlmYnAtPklGQl9ETE1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKKwkJCQkJCQkJCQkJCQkvLy4gIHN0YXJ0IHRlcnRpYXJ5IChvciBzZWNvbmRhcnkpCisJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKKwkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0VYRUNVVEUsIChoY2ZfMTYpIGx0dnAtPm5pY19hZGRyICk7CisJCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgeworCQkJcmMgPSBpbml0KCBpZmJwICk7CS8qOz8gZG8gd2UgcmVhbGx5IHdhbnQgdG8gc2tpcCBpbml0IGlmIGNtZF9leGUgZmFpbGVkLCBpLmUuCisJCQkJCQkJCSAqCSBJRkJfRldfQ29tcF9JZCBpcyB0aGFuIHBvc3NpYmx5IGluY29ycmVjdCAqLworCSAgCX0KKwkJCQkJCQkJCQkJCQkvL2Vsc2UgKG5vbi1maW5hbCkKKwl9IGVsc2UgeworCQkJCQkJCQkJCQkJCS8vLiAgaWYgbW9kZSA9PSBSZWFkYmFjayBTRUVQUk9NCisjaWYgMAkvLzs/IGFzIGxvbmcgYXMgdGhlIG5leHQgaWYgY29udGFpbnMgYSBoYXJkIGNvZGVkIDAsIG1pZ2h0IGFzIHdlbGwgbGVhdmUgaXQgb3V0IGV2ZW4gbW9yZSBvYnZpb3VzCisJCWlmICggMCAvKmxlbiBpcyBkZWZpbml0ZWx5IG5vdCB3YW50IHdlIHdhbnQ7PyovICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU0VFUFJPTV9SRUFEQkFDSyApIHsKKwkJCU9QVyggSFJFR19QQVJBTV8xLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNikgKTsKKwkJCU9QVyggSFJFR19QQVJBTV8yLCBNVUxfQllfMihsdHZwLT5sZW4gLSA0KSk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBwZXJmb3JtIEhlcm1lcyBwcm9nIGNtZCB3aXRoIGFwcHJvcHJpYXRlIG1vZGUgYml0cworCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX1BST0dSQU0gfCBsdHZwLT5tb2RlLCAoaGNmXzE2KWx0dnAtPm5pY19hZGRyICk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBzZXQgdXAgTklDIFJBTSBhZGRyZXNzYWJpbGl0eSBhY2NvcmRpbmcgUmVzcDAtMQorCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAgIElQVyggSFJFR19SRVNQXzEpICk7CisJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgSVBXKCBIUkVHX1JFU1BfMCkgKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCB1cCBMLWZpZWxkIG9mIExUViBhY2NvcmRpbmcgUmVzcDIKKwkJCWkgPSAoIElQVyggSFJFR19SRVNQXzIgKSArIDEgKSAvIDI7ICAvLyBpIGNvbnRhaW5zIG1heCBidWZmZXIgc2l6ZSBpbiB3b3JkcywgYSBwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwgcGllY2Ugb2YgaW5mb3JtYXRpb24gOz8KKy8qTmljbydzIGNvZGUgYmFzZWQgb24gaSBpcyB0aGUgInJlYWwgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIgorCQkJaWYgKCBsdHZwLT5sZW4gLSA0IDwgaSApIHJjID0gSENGX0VSUl9MRU47CisJCQllbHNlIGx0dnAtPmxlbiA9IGkgKyA0OworKi8KKy8qIFJvbGFuZHMgY29kZSBiYXNlZCBvbiB0aGUgaWRlYSB0aGF0IGEgTVNGIHNob3VsZCBub3QgYXNrIGZvciBtb3JlIHRoYW4gaXMgYXZhaWxhYmxlCisJCQkvLyBjaGVjayBpZiBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIGV4Y2VlZHMgbWF4IGJ1ZmZlciBzaXplCisJCQlpZiAoIGx0dnAtPmxlbiAtIDQgPiBpICkgeworCQkJCXJjID0gSENGX0VSUl9MRU47CisJCQkJbHR2cC0+bGVuID0gaSArIDQ7CisJCQl9CisqLworCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29weSBkYXRhIGZyb20gTklDIHZpYSBBVVggcG9ydCB0byBMVFYKKwkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvKklOX1BPUlRfU1RSSU5HXzhfMTYgbWFjcm8gbWF5IG1vZGlmeSBpdHMgcGFyYW1ldGVycyovCisJCQlpID0gbHR2cC0+bGVuIC0gNDsKKwkJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7CQkvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCS8vICQkIGNoYXIKKwkJCQkJCQkJCQkJCQkvLy4gIGVsc2UgKG5vbi1maW5hbCBwcm9ncmFtbWluZykKKwkJfSBlbHNlCisjZW5kaWYgLy87PyBhcyBsb25nIGFzIHRoZSBhYm92ZSBpZiBjb250YWlucyBhIGhhcmQgY29kZWQgMCwgbWlnaHQgYXMgd2VsbCBsZWF2ZSBpdCBvdXQgZXZlbiBtb3JlIG9idmlvdXMKKwkJewkJCQkJCQkJCQkJLy8uICAuICBnZXQgbnVtYmVyIG9mIHdvcmRzIHRvIHByb2dyYW0KKwkJCUhDRkFTU0VSVCggbHR2cC0+c2VnbWVudF9zaXplLCAqbHR2cC0+aG9zdF9hZGRyICkKKwkJCWkgPSBsdHZwLT5zZWdtZW50X3NpemUvMjsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgZGF0YSAod29yZHMpIGZyb20gTFRWIHZpYSBBVVggcG9ydCB0byBOSUMKKwkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvL09VVF9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIGlmIG1vZGUgPT0gdm9sYXRpbGUgcHJvZ3JhbW1pbmcKKwkJCWlmICggbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19WT0xBVElMRSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IHZpYSBBVVggcG9ydAorCQkJCU9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgPj4gMTYgPDwgOSB8IChsdHZwLT5uaWNfYWRkciAmIDB4RkZGRikgPj4gNyApICk7CisJCQkJT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyICYgMHgwMDdFKSApOworCQkJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOwkJLy8hISFXT1JEIGxlbmd0aCwgY3AgTVVTVCBiZSBhIGNoYXIgcG9pbnRlcgorCQkJfQorCQl9CisJfQorCWlmYnAtPklGQl9ETE1vZGUgPSBsdHZwLT5tb2RlOwkJCQkJLy9zYXZlIHN0YXRlIGluIElGQl9ETE1vZGUKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApCisJSENGTE9HRVhJVCggSENGX1RSQUNFX0RMICkKKwlyZXR1cm4gcmM7Cit9IC8vIGRvd25sb2FkCisKKworI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ2VydGFpbiBIZXJtZXMtSUkgZmlybXdhcmUgdmVyc2lvbnMgY2FuIGdlbmVyYXRlCisqIGRlYnVnIGluZm9ybWF0aW9uLiBUaGlzIGRlYnVnIGluZm9ybWF0aW9uIGlzCisqIGNvbnRhaW5lZCBpbiBhIGJ1ZmZlciBpbiBuaWMtUkFNLCBhbmQgY2FuIGJlIHJlYWQKKyogdmlhIHRoZSBhdXggcG9ydC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK2Z3X3ByaW50ZihJRkJQIGlmYnAsIENGR19GV19QUklOVEZfU1RSQ1QgRkFSICpsdHZwKQoreworICAgIGludCByYyA9IEhDRl9TVUNDRVNTOworICAgIGhjZl8xNiBmd19jbnQ7CisvLyAgICBoY2ZfMzIgRGJNc2dCdWZmZXIgPSAweDI5RDIsIERiTXNnQ291bnQ9IDB4MDAwMDI5RDA7CisvLyAgICBoY2ZfMTYgRGJNc2dTaXplPTB4MDAwMDAwODA7CisgICAgaGNmXzMyIERiTXNnQnVmZmVyOworICAgIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUICpwID0gJmlmYnAtPklGQl9Gd1BmQnVmZjsKKyAgICBsdHZwLT5sZW4gPSAxOworICAgIGlmICggcC0+RGJNc2dTaXplICE9IDAgKSB7CisgICAgICAgIC8vIGZpcnN0LCBjaGVjayB0aGUgY291bnRlciBpbiBuaWMtUkFNIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsYXRlc3QgY291bnRlciB2YWx1ZSBvZiB0aGUgSENGCisgICAgICAgIE9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikocC0+RGJNc2dDb3VudCA+PiA3KSApOworICAgICAgICBPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikocC0+RGJNc2dDb3VudCAmIDB4N0UpICk7CisgICAgICAgIGZ3X2NudCA9ICgoSVBXKCBIUkVHX0FVWF9EQVRBKSA+PjEgKSAmICgoaGNmXzE2KXAtPkRiTXNnU2l6ZSAtIDEpKTsKKyAgICAgICAgaWYgKCBmd19jbnQgIT0gaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKSB7CisvLyAgICBEYmdQcmludCgiZndfY250PSVkIElGQl9EYmdQcmludEZfQ250PSVkXG4iLCBmd19jbnQsIGlmYnAtPklGQl9EYmdQcmludEZfQ250KTsKKyAgICAgICAgICAgIERiTXNnQnVmZmVyID0gcC0+RGJNc2dCdWZmZXIgKyBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCAqIDY7IC8vIGVhY2ggZW50cnkgaXMgMyB3b3JkcworICAgICAgICAgICAgT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShEYk1zZ0J1ZmZlciA+PiA3KSApOworICAgICAgICAgICAgT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKERiTXNnQnVmZmVyICYgMHg3RSkgKTsKKyAgICAgICAgICAgIGx0dnAtPm1zZ19pZCAgICAgPSBJUFcoSFJFR19BVVhfREFUQSk7CisgICAgICAgICAgICBsdHZwLT5tc2dfcGFyICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOworICAgICAgICAgICAgbHR2cC0+bXNnX3RzdGFtcCA9IElQVyhIUkVHX0FVWF9EQVRBKTsKKyAgICAgICAgICAgIGx0dnAtPmxlbiA9IDQ7CisgICAgICAgICAgICBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCsrOworICAgICAgICAgICAgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgJj0gKHAtPkRiTXNnU2l6ZSAtIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK307CisjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKKworCisjaWYgKEhDRl9ETF9PTkxZKSA9PSAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaGNmXzE2IGdldF9maWQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCWdldCBhbGxvY2F0ZWQgRklEIGZvciBlaXRoZXIgdHJhbnNtaXQgb3Igbm90aWZ5LgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMKKyoJMAlubyBGSUQgYXZhaWxhYmxlCisqCTw+MAlGSUQgbnVtYmVyCisqCisqLkRFU0NSSVBUSU9OCisqCisqCisqLkRJQUdSQU0KKyoJVGhlIHByZWZlcmVuY2UgaXMgdG8gdXNlIGEgInBlbmRpbmciIGFsbG9jLiBJZiBubyBhbGxvYyBpcyBwZW5kaW5nLCB0aGVuIC0gaWYgYXZhaWxhYmxlIC0gdGhlICJzcGFyZSIgRklECisqCWlzIHVzZWQuCisqCUlmIHRoZSBzcGFyZSBGSUQgaXMgdXNlZCwgSUZCX1JzY0luZCAocmVwcmVzZW50aW5nIHRoZSBzcGFyZSBGSUQpIG11c3QgYmUgY2xlYXJlZAorKglJZiB0aGUgcGVuZGluZyBhbGxvYyBpcyB1c2VkLCB0aGUgYWxsb2MgZXZlbnQgbXVzdCBiZSBhY2tub3dsZWRnZWQgdG8gdGhlIEhlcm1lcy4KKyoJSW4gY2FzZSB0aGUgc3BhcmUgRklEIHdhcyBkZXBsZXRlZCBhbmQgdGhlIElGQl9Sc2NJbmQgaGFzIGJlZW4gImZha2VkIiBhcyBwc2V1ZG8gcmVzb3VyY2Ugd2l0aCBhIDB4MDAwMQorKgl2YWx1ZSBieSBoY2Zfc2VydmljZV9uaWMsIElGQl9Sc2NJbmQgaGFzIHRvIGJlICJjb3JyZWN0ZWQiIGFnYWluIHRvIGl0cyAweDAwMDAgdmFsdWUuCisqCisqCU5vdGUgdGhhdCBkdWUgdG8gdGhlIEhlcm1lcy1JSSBIL1cgcHJvYmxlbXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIHdvcmtlZCBhcm91bmQgYnkgREFXQSwgdGhlIEFsbG9jIGJpdAorKglpbiB0aGUgRXZlbnQgcmVnaXN0ZXIgaXMgbm8gbG9uZ2VyIGEgcmVsaWFibGUgaW5kaWNhdGlvbiBvZiB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiBhIEZJRC4gVGhlICJDbGVhciBGSUQiCisqCXBhcnQgb2YgdGhlIERBV0EgbG9naWMsIHRvZ2V0aGVyIHdpdGggdGhlIGNob2ljZSBvZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmV0dXJuIGluZm9ybWF0aW9uIGZyb20gZ2V0X2ZpZCwKKyoJaGFuZGxlIHRoaXMgYXV0b21hdGljYWxseSwgaS5lLiB3aXRob3V0IGFkZGl0aW9uYWwgY29kZSBpbiBnZXRfZmlkLgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaGNmXzE2CitnZXRfZmlkKCBJRkJQIGlmYnAgKQoreworCitoY2ZfMTYgZmlkID0gMDsKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAorUFJPVF9DTlRfSU5JCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCisJSUZfRE1BKCBIQ0ZBU1NFUlQoIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpLCBpZmJwLT5JRkJfQ250bE9wdCkgKQorCisJaWYgKCBJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0FMTE9DKSB7CisJCWZpZCA9IElQVyggSFJFR19BTExPQ19GSUQgKTsKKwkJSENGQVNTRVJUKCBmaWQsIGlmYnAtPklGQl9Sc2NJbmQgKQorCQlEQVdBX1pFUk9fRklEKCBIUkVHX0FMTE9DX0ZJRCApCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKKwkJSENGX1dBSVRfV0hJTEUoICggSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfQUNLX1JFR19SRUFEWSApID09IDAgKTsKKwkJSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApCisjZW5kaWYgLy8gSENGX1RZUEVfSElJNQorCQlEQVdBX0FDSyggSFJFR19FVl9BTExPQyApOwkJCS8vISFub3RlIHRoYXQgSFJFR19FVl9BTExPQyBpcyB3cml0dGVuIG9ubHkgb25jZQorLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKKwkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDEgKSB7CisJCQlpZmJwLT5JRkJfUnNjSW5kID0gMDsKKwkJfQorLy8jZW5kaWYgLy8gQUxMT0NfMTUKKwl9IGVsc2UgeworLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKKwkJZmlkID0gaWZicC0+SUZCX1JzY0luZDsKKy8vI2VuZGlmIC8vIEFMTE9DXzE1CisJCWlmYnAtPklGQl9Sc2NJbmQgPSAwOworCX0KKwlyZXR1cm4gZmlkOworfSAvLyBnZXRfZmlkCisjZW5kaWYgLy8gSENGX0RMX09OTFkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQorKi5QVVJQT1NFCQlyZWFkcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIE5JQyBSQU0gdG8gSG9zdCBtZW1vcnkuCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJYnVmcAkJKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCisqCWxlbgkJCWxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKyoJd29yZF9sZW4JQmlnIEVuZGlhbiBvbmx5OiBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB0byBzd2FwIGluIHBhaXJzCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyogcHJvY2VzcyB0aGUgc2luZ2xlIGJ5dGUgKGlmIGFwcGxpY2FibGUpIHJlYWQgYnkgdGhlIHByZXZpb3VzIGdldF9mcmFnIGFuZCBjb3B5IGxlbiAob3IgbGVuLTEpIGJ5dGVzIGZyb20KKyogTklDIHRvIGJ1ZnAuCisqIE9uIGEgQmlnIEVuZGlhbiBwbGF0Zm9ybSwgdGhlIHBhcmFtZXRlciB3b3JkX2xlbiBjb250cm9scyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgd2hvc2UgZW5kaWFuZXNzIGlzCisqIGNvbnZlcnRlZCAoaS5lLiBieXRlIHN3YXBwZWQpCisqCisqCisqLkRJQUdSQU0KKyoxMDogVGhlIFBDTUNJQSBjYXJkIGNhbiBiZSByZW1vdmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHRyYW5zZmVyLiBCeSBkZXBvc2l0aW5nIGEgIm1hZ2ljIG51bWJlciIgaW4gdGhlCisqCUhSRUdfU1dfMCByZWdpc3RlciBvZiB0aGUgSGVybWVzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUgYW5kIGJ5IHZlcmlmeWluZyB0aGlzIHJlZ2lzdGVyLCBpdCBjYW4gYmUKKyoJZGV0ZXJtaW5lZCB3aGV0aGVyIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuIFRoZSByZXR1cm4gc3RhdHVzIGlzIHNldCBhY2NvcmRpbmdseS4KKyoJQ2xlYXJpbmcgdGhlIGJ1ZmZlciBpcyBhIChyZWxhdGl2ZSkgY2hlYXAgd2F5IHRvIHByZXZlbnQgdGhhdCBmYWlsaW5nIEkvTyByZXN1bHRzIGluIHJ1bi1hd2F5IGJlaGF2aW9yCisqCWJlY2F1c2UgdGhlIGdhcmJhZ2UgaW4gdGhlIGJ1ZmZlciBpcyBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyIGlycmVzcGVjdGl2ZSBvZiB0aGUgcmV0dXJuIHN0YXR1cyAoZS5nLgorKgloY2Zfc2VydmljZV9uaWMgaGFzIHRoaXMgYmVoYXZpb3IpLgorKgorKi5OT1RJQ0UKKyoJSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKyoJQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAorZ2V0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICkKK3sKK2hjZl9pbwkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0RBVEFfMTsJLy9CQVAgZGF0YSByZWdpc3Rlcgord2NpX2J1ZnAJcCA9IGJ1ZnA7CQkJCQkJCQkJLy93b3JraW5nIHBvaW50ZXIKK2ludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KK2ludAkJCWo7CisKKwlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKKworLyoxOgloZXJlIHJlY292ZXJ5IGxvZ2ljIGZvciBpbnRlcnZlbmluZyBCQVAgYWNjZXNzIGJldHdlZW4gaGNmX3NlcnZpY2VfbmljIGFuZCBoY2ZfcmN2X21zZyBDT1VMRCBiZSBhZGRlZAorICogCWlmIGN1cnJlbnQgYWNjZXNzIGlzIFJ4SW5pdGlhbAorICogCS4gIHBlcnNpc3RlbnRfb2Zmc2V0ICs9IGxlbgorICovCisKKwlpID0gbGVuOworCQkJCQkJCQkJCQkJCS8vaWYgYnVmZmVyIGxlbmd0aCA+IDAgYW5kIGNhcnJ5IGZyb20gcHJldmlvdXMgZ2V0X2ZyYWcKKwlpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5SW4gKSB7CisJCQkJCQkJCQkJCQkJLy8uICBtb3ZlIGNhcnJ5IHRvIGJ1ZmZlcgorCQkJCQkJCQkJCQkJCS8vLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJKnArKyA9IChoY2ZfOCkoaWZicC0+SUZCX0NhcnJ5SW4+PjgpOworCQlpLS07CisJCQkJCQkJCQkJCQkJLy8uICBjbGVhciBjYXJyeSBmbGFnCisJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKKwl9CisjaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCisJLy9za2lwIHplcm8tbGVuZ3RoIEkvTywgc2luZ2xlIGJ5dGUgSS9PIGFuZCBJL08gbm90IHdvcnRod2hpbGUgKGkuZS4gbGVzcyB0aGFuIDYgYnl0ZXMpZm9yIERXIGxvZ2ljCisJCQkJCQkJCQkJCQkJLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKKwlpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKK2hjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KKwkJaWYgKCAoIChoY2ZfMzIpcCAmIDB4MSApID09IDAgKSB7CQkJLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCisJCQlpZiAoIChoY2ZfMzIpcCAmIDB4MiApIHsJCQkJLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIHJlYWQgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQkqKHdjaV9yZWNvcmRwKXAgPSBJTl9QT1JUX1dPUkQoIGlvX3BvcnQgKTsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CisJCQkJcCArPSAyOworCQkJCWkgLT0gMjsKKwkJCX0KKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgYXMgbWFueSBkb3VibGUgd29yZCBhcyBwb3NzaWJsZQorCQkJcDQgPSAoaGNmXzMyIEZBUiAqKXA7CisJCQlqID0gaS80OworCQkJSU5fUE9SVF9TVFJJTkdfMzIoIGlvX3BvcnQsIHA0LCBqICk7CisJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQorCQkJcCArPSBpICYgfjB4MDAwMzsKKwkJCWkgJj0gMHgwMDAzOworCQl9CisJfQorI2VuZGlmIC8vIEhDRl9JT18zMkJJVFMKKwkJCQkJCQkJCQkJCQkvL2lmIG5vIDMyLWJpdCBzdXBwb3J0IE9SIGJ5dGUgYWxpZ25lZCBPUiAxLTMgYnl0ZXMgbGVmdAorCWlmICggaSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIHJlYWQgYXMgbWFueSB3b3JkIGFzIHBvc3NpYmxlIGluICJhbGlnbm1lbnQgc2FmZSIgd2F5CisJCWogPSBpLzI7CisJCUlOX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIHAsIGogKTsKKwkJCQkJCQkJCQkJCQkvLy4gIGlmIDEgYnl0ZSBsZWZ0CisJCWlmICggaSAmIDB4MDAwMSApIHsKKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgMSB3b3JkCisJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IElOX1BPUlRfV09SRCggaW9fcG9ydCApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc3RvcmUgTFNCIGluIGxhc3QgY2hhciBvZiBidWZmZXIKKwkJCWJ1ZnBbbGVuLTFdID0gKGhjZl84KWlmYnAtPklGQl9DYXJyeUluOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBNU0IgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCisJCQlpZmJwLT5JRkJfQ2FycnlJbiB8PSAweDE7CisJCX0KKwl9CisjaWYgSENGX0JJR19FTkRJQU4KKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApCisJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8ICgoaGNmXzMyKWJ1ZnAgJiAxICkgPT0gMCwgKGhjZl8zMilidWZwICkKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0UyKCB3b3JkX2xlbiwgbGVuICkgKQorCS8vc2VlIHB1dF9mcmFnIGZvciBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGJlIGNhcmVmdWxsIGFib3V0IHdoYXQgYXJlIGludCdzIGFuZCB3aGF0IGFyZQorCS8vaGNmXzE2J3MKKwlpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJLy8uICBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CitoY2ZfOCBjOworCQljID0gYnVmcFsxXTsJCQkJCQkJCS8vLiAgLiAgY29udmVydCB0aGUgMXN0IGhjZl8xNgorCQlidWZwWzFdID0gYnVmcFswXTsKKwkJYnVmcFswXSA9IGM7CisJCWlmICggd29yZF9sZW4gPiAxICkgewkJCQkJCS8vLiAgLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQorCQkJYyA9IGJ1ZnBbM107CQkJCQkJCS8vLiAgLiAgLiAgY29udmVydCB0aGUgMm5kIGhjZl8xNgorCQkJYnVmcFszXSA9IGJ1ZnBbMl07CisJCQlidWZwWzJdID0gYzsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorfSAvLyBnZXRfZnJhZworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJaW50IGluaXQoIElGQlAgaWZicCApCisqLlBVUlBPU0UJCUhhbmRsZXMgY29tbW9uIGluaXRpYWxpemF0aW9uIGFzcGVjdHMgKEgtSSBpbml0LCBjYWxpYnJhdGlvbiwgY29uZmlnLm1uZ210LCBhbGxvY2F0aW9uKS4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCisqCUhDRl9FUlJfSU5DT01QX1BSSQorKglIQ0ZfRVJSX0lOQ09NUF9GVworKglIQ0ZfRVJSX1RJTUVfT1VUCisqCT4+aGNmX2dldF9pbmZvCisqCQlIQ0ZfRVJSX05PX05JQworKgkJSENGX0VSUl9MRU4KKyoKKyouREVTQ1JJUFRJT04KKyogaW5pdCB3aWxsIHN1Y2Nlc3NpdmVseToKKyogLSBpbiBjYXNlIG9mIGEgKG5vbi1wcmVsb2FkZWQpIEgtSSwgaW5pdGlhbGl6ZSB0aGUgTklDCisqIC0gY2FsaWJyYXRlIHRoZSBTL1cgcHJvdGVjdGlvbiB0aW1lciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIKKyogLSBjb2xsZWN0IEhTSSwgImFjdGl2ZSIgRi9XIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBJbmZvcm1hdGlvbgorKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBQcmltYXJ5IEYvVzogY29sbGVjdCBQcmltYXJ5IEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KKyogLSBjaGVjayBIU0kgYW5kIFByaW1hcnkgRi9XIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgSENGCisqIC0gaW4gY2FzZSBhY3RpdmUgRi9XIGlzIFN0YXRpb24gb3IgQVAgRi9XOiBjaGVjayBTdGF0aW9uIG9yIEFQIEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgorKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBub3QgUHJpbWFyeSBGL1c6IGFsbG9jYXRlIEZJRHMgdG8gYmUgdXNlZCBpbiB0cmFuc21pdC9ub3RpZnkgcHJvY2VzcworKgorKgorKi5ESUFHUkFNCisqMjoJZHJvcCBhbGwgZXJyb3Igc3RhdHVzIGJpdHMgaW4gSUZCX0NhcmRTdGF0IHNpbmNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHJlLWV2YWx1YXRlZC4KKyo0OglBY2sgZXZlcnl0aGluZyBleGNlcHQgSFJFR19FVl9TTEVFUF9SRVEuIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQKKyoJdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSBTZW5kIENtZCBldmVudCBpcyBwZW5kaW5nLiBBY2tpbmcgSFJFR19FVl9TTEVFUF9SRVEgaXMgaGFuZGxlZCBieSBoY2ZfYWN0aW9uKAorKglIQ0ZfQUNUX0lOVF9PTiApICEhIQorKjEwOiBDYWxpYnJhdGUgdGhlIFMvVyB0aW1lLW91dCBwcm90ZWN0aW9uIG1lY2hhbmlzbSBieSBjYWxsaW5nIGNhbGlicmF0ZSgpLiBOb3RlIHRoYXQgcG9zc2libGUgZXJyb3JzCisqCWluIHRoZSBjYWxpYnJhdGlvbiBwcm9jZXNzIGFyZSBub3IgcmVwb3J0ZWQgYnkgaW5pdCBidXQgd2lsbCBzaG93IHVwIHZpYSB0aGUgZGVmdW5jdCBtZWNoYW5pc20gaW4KKyoJc3Vic2VxdWVudCBoY2YtY2FsbHMuCisqMTQ6IHVzYl9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGhhdmUgdGhlIG1pbmltYWwgdmlzdWFsIGNsdXR0ZXIgZm9yIHRoZSBsZWdhY3kgSC1JIFVTQiBkb25nbGUKKyoJY29tcGF0aWJpbGl0eSBjaGVjay4KKyoxNjogVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgcmVsYXRlZCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgTklDOgorKgkgLSBIU0kgc3VwcGxpZXIKKyoJIC0gRi9XIElkZW50aXR5CisqCSAtIEYvVyBzdXBwbGllcgorKgkgaWYgYXBwcm9wcmlhdGU6CisqCSAtIFBSSSBJZGVudGl0eQorKgkgLSBQUkkgc3VwcGxpZXIKKyoJIGFwcHJvcHJpYXRlIG1lYW5zIG9uIEgtSTogYWx3YXlzCisqCSBhbmQgb24gSC1JSSBpZiBGL1cgc3VwcGxpZXIgcmVmbGVjdHMgYSBwcmltYXJ5IChpLmUuIG9ubHkgYWZ0ZXIgYW4gSGVybWVzIFJlc2V0IG9yIEluaXQKKyoJIGNvbW1hbmQpLgorKgkgUVVFU1RJT04gOz8gISEhISEhIHNob3VsZCwgRm9yIGVhY2ggb2YgdGhlIGFib3ZlIFJJRHMgdGhlIEVuZGlhbmVzcyBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKyoJIE9ubHkgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBmaXJzdCBoY2ZfZ2V0X2luZm8gaXMgdXNlZC4gQWxsIGhjZl9nZXRfaW5mbyBjYWxscyBhcmUgbWFkZSwgcmVnYXJkbGVzcyBvZgorKgkgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgMXN0IGhjZl9nZXRfaW5mby4gVGhlIGFzc3VtcHRpb25zIGFyZToKKyoJICAtIGlmIGFueSBjYWxsIGZhaWxzLCB0aGV5IGFsbCBmYWlsLCBzbyByZW1lbWJlcmluZyB0aGUgcmVzdWx0IG9mIHRoZSAxc3QgY2FsbCBpcyBhZGVxdWF0ZQorKgkgIC0gYSBmYWlsaW5nIGNhbGwgd2lsbCBvdmVyd3JpdGUgdGhlIEwtZmllbGQgd2l0aCBhIDB4MDAwMCB2YWx1ZSwgd2hpY2ggc2VydmljZXMgYm90aCBhcyBhbgorKgkJZXJyb3IgaW5kaWNhdGlvbiBmb3IgdGhlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIElGQiBhcyBtYWtpbmcgbW1kX2NoZWNrX2NvbXAgZmFpbC4KKyoJIEluIGNhc2Ugb2YgSC1JLCB3aGVuIGdldHRpbmcgdGhlIEYvVyBpZGVudGl0eSBmYWlscywgdGhlIEYvVyBpcyBhc3N1bWVkIHRvIGJlIEgtSSBBUCBGL1cgcHJlLWRhdGluZworKgkgdmVyc2lvbiA5LjAgYW5kIHRoZSBGL1cgSWRlbnRpdHkgYW5kIFN1cHBsaWVyIGFyZSBmYWtlZCBhY2NvcmRpbmdseS4KKyoJIEluIGNhc2Ugb2YgSC1JSSwgdGhlIFByaW1hcnksIFN0YXRpb24gYW5kIEFQIElkZW50aXR5IGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBGL1cgSWRlbnRpdHkuCisqCSBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBTdXBwbGllciBpbmZvcm1hdGlvbi4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgUFJJIGluZm9ybWF0aW9uIGNhbiBubyBsb25nZXIgYmUKKyoJIHJldHJpZXZlZCB3aGVuIGEgVGVydGlhcnkgcnVucy4gVG8gYWNjb21tb2RhdGUgTVNGcyBhbmQgVXRpbGl0aWVzIHdobyBkZXBlbmQgb24gUFJJIGluZm9ybWF0aW9uIGJlaW5nCisqCSBhdmFpbGFibGUgYXQgYW55IHRpbWUsIHRoaXMgaW5mb3JtYXRpb24gaXMgY2FjaGVkIGluIHRoZSBJRkIuIEluIHRoaXMgY2FjaGUgdGhlIGdlbmVyaWMgIkYvVyIgdmFsdWUgb2YKKyoJIHRoZSB0eXAtZmllbGRzIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHNwZWNpZmljIChsZWdhY3kpICJQUkkiIHZhbHVlcy4gVG8gYWN0dWFsbHkgcmUtcm91dGUgdGhlIChsZWdhY3kpCisqCSBQUkkgcmVxdWVzdCB2aWEgaGNmX2dldF9pbmZvLCB0aGUgeHh4eC10YWJsZSBtdXN0IGJlIHNldC4gIEluIGNhc2Ugb2YgSC1JLCB0aGlzIGNhY2hpbmcsIG1vZGlmeWluZyBhbmQKKyoJIHJlLXJvdXRpbmcgaXMgbm90IG5lZWRlZCBiZWNhdXNlIFBSSSBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIE5JQy4gRm9yCisqCSBjb25zaXN0ZW5jeSB0aGUgY2FjaGluZyBmaWVsZHMgaW4gdGhlIElGQiBhcmUgZmlsbGVkIHdpdGggdGhlIFBSSSBpbmZvcm1hdGlvbiBhbnl3YXkuCisqMTg6IG1kZF9jaGVja19jb21wKCkgaXMgY2FsbGVkIHRvIGNoZWNrIHRoZSBTdXBwbGllciBWYXJpYW50IGFuZCBSYW5nZSBvZiB0aGUgSG9zdC1TL1cgSS9GIChIU0kpIGFuZCB0aGUKKyoJUHJpbWFyeSBGaXJtd2FyZSBWYXJpYW50IGFuZCBSYW5nZSBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkgdGhpcyBIQ0YuICBJZiBlaXRoZXIgb2YKKyoJdGhlc2UgdGVzdHMgZmFpbHMsIHRoZSBDQVJEX1NUQVRfSU5DT01QX1BSSSBiaXQgb2YgSUZCX0NhcmRTdGF0IGlzIHNldAorKglOb3RlOiBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgcHJpbWFyeSBleGNlcHQgZHVyaW5nIHByb2R1Y3Rpb24sIHNvIHRoaXMgbWFrZXMgdGhlIEhDRiBpbiBpdHMgY3VycmVudCBmb3JtCisqCXVuc3VpdGFibGUgZm9yIG1hbnVmYWN0dXJpbmcgdGVzdCBzeXN0ZW1zIGxpa2UgdGhlIEZUUy4gVGhpcyBjYW4gYmUgcmVtZWRpZWQgYnkgYW4gYWRkaW5nIGEgdGVzdCBsaWtlCisqCWlmYnAtPklGQl9QUklTdXAuaWQgPT0gQ09NUF9JRF9QUkkKKyoyMDogSW4gY2FzZSB0aGVyZSBpcyBUZXJ0aWFyeSBGL1cgYW5kIHRoaXMgRi9XIGlzIFN0YXRpb24gRi9XLCB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIFN0YXRpb24KKyoJRmlybXdhcmUgZnVuY3Rpb24gYXMgcmV0cmlldmVkIGZyb20gdGhlIEhlcm1lcyBpcyBjaGVja2VkIGFnYWluc3QgdGhlIFRvcCBhbmQgQm90dG9tIGxldmVsIHN1cHBvcnRlZCBieQorKgl0aGlzIEhDRi4KKyoJTm90ZTogOz8gdGhlIHRlcnRpYXJ5IEYvVyBjb21wYXRpYmlsaXR5IGNoZWNrcyBjb3VsZCBiZSBtb3ZlZCB0byB0aGUgREhGLCB3aGljaCBhbHJlYWR5IGhhcyBjaGVja2VkIHRoZQorKglDRkkgYW5kIE1GSSBjb21wYXRpYmlsaXR5IG9mIHRoZSBpbWFnZSB3aXRoIHRoZSBOSUMgYmVmb3JlIHRoZSBpbWFnZSB3YXMgZG93bmxvYWRlZC4KKyoyODogSW4gY2FzZSBvZiBub24tUHJpbWFyeSBGL1c6IGFsbG9jYXRlcyBhbmQgYWNrbm93bGVkZ2UgYSAoVFggb3IgTm90aWZ5KSBGSUQgYW5kIGFsbG9jYXRlcyB3aXRob3V0CisqCWFja25vd2xlZGdlIGFub3RoZXIgKFRYIG9yIE5vdGlmeSkgRklEICh0aGUgc28tY2FsbGVkIDEuNSBhbGxvYyBzY2hlbWUpIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKKyoJLSBleGVjdXRlIHRoZSBhbGxvY2F0ZSBjb21tYW5kIGJ5IGNhbGxpbmcgY21kX2V4ZQorKgktIHdhaXQgdGlsbCBlaXRoZXIgdGhlIGFsbG9jIGV2ZW50IG9yIGEgdGltZS1vdXQgb2NjdXJzCisqCS0gcmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBhbGxvYyBldmVudCBvY2N1cnMsIGNhbGwgZ2V0X2ZpZCB0bworKgkgIC0gcmVhZCB0aGUgRklEIGFuZCBzYXZlIGl0IGluIElGQl9Sc2NJbmQgdG8gYmUgdXNlZCBhcyAic3BhcmUgRklEIgorKgkgIC0gYWNrbm93bGVkZ2UgdGhlIGFsbG9jIGV2ZW50CisqCSAgLSBkbyBhbm90aGVyICJoYWxmIiBhbGxvY2F0ZSB0byBjb21wbGV0ZSB0aGUgIjEuNSBBbGxvYyBzY2hlbWUiCisqCSAgTm90ZSB0aGF0IGFib3ZlIDMgc3RlcHMgZG8gbm90IGhhcm0gYW5kIHRodXMgZ2l2ZSB0aGUgImNoZWFwZXN0IiBhY2NlcHRhYmxlIHN0cmF0ZWd5LgorKgkgIElmIGEgdGltZS1vdXQgb2NjdXJyZWQsIHRoZW4gcmVwb3J0IHRpbWUgb3V0IHN0YXR1cyAoYWZ0ZXIgYWxsKQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50Citpbml0KCBJRkJQIGlmYnAgKQoreworCitpbnQJcmMgPSBIQ0ZfU1VDQ0VTUzsKKworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfSU5JVCwgMCApCisKKwlpZmJwLT5JRkJfQ2FyZFN0YXQgPSAwOwkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyKi8KKwlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsgCQkJCQkJCQkJCQkvKiA0Ki8KKwlJRl9QUk9UX1RJTUUoIGNhbGlicmF0ZSggaWZicCApOyApIAkJCQkJCQkJCQkJCQkvKjEwKi8KKyNpZiAwIC8vIE9PUgorCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IDI7CQkJCQkJCS8vbWlzdXNlIHRoZSBJRkIgc3BhY2UgZm9yIGEgcHV0CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkudHlwID0gQ0ZHX1RJQ0tfVElNRTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID0gKDEwMDAqMTAwMCkvMTAyNCArIDE7CS8vcm91Z2hseSAxIHNlY29uZAorCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiApOworI2VuZGlmIC8vIE9PUgorCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IHNpemVvZihDRkdfRldfSURFTlRJVFlfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfRldfSURFTlRJVFk7CisJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKKy8qIDs/IGNvbnZlcnNpb24gc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yIG1tZF9jaGVja19jb21wICovCisjaWYgSENGX0JJR19FTkRJQU4KKwlpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkICAgICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApOworCWlmYnAtPklGQl9GV0lkZW50aXR5LnZhcmlhbnQgICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52YXJpYW50ICk7CisJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9tYWpvciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgKTsKKwlpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciApOworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECQkJCQkJCQkJCQkJCQkJCQkJLyoxNCovCisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsJCQkJCQkJCQkJCQkJCQkJCQkvKjE2Ki8KKwkJaWZicC0+SUZCX0hTSVN1cC5sZW4gPSBzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxOworCQlpZmJwLT5JRkJfSFNJU3VwLnR5cCA9IENGR19OSUNfSFNJX1NVUF9SQU5HRTsKKwkJcmMgPSBoY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfSFNJU3VwLmxlbiApOworLyogOz8gY29udmVyc2lvbiBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IgbW1kX2NoZWNrX2NvbXAgLCBCVVQgYWNjb3JkaW5nIHRvIGEgcmVwb3J0IG9mIGEgQkUtdXNlciBpdCBpcworICogc2hvdWxkIGJlIHJlc29sdmVkIGluIHRoZSBXQVJQIHJlbGVhc2UKKyAqIHNpbmNlIHNvbWUgY29tcGlsZXJzIG1ha2UgdWdseSBidXQgdW5uZWNlc3NhcnkgY29kZSBvZiB0aGVzZSBpbnN0cnVjdGlvbnMgZXZlbiBmb3IgTEUsCisgKiBpdCBpcyBjb25kaXRpb25hbGx5IGNvbXBpbGVkICovCisjaWYgSENGX0JJR19FTkRJQU4KKwkJaWZicC0+SUZCX0hTSVN1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC5yb2xlICk7CisJCWlmYnAtPklGQl9IU0lTdXAuaWQgICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuaWQgKTsKKwkJaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0hTSVN1cC52YXJpYW50ICk7CisJCWlmYnAtPklGQl9IU0lTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAuYm90dG9tICk7CisJCWlmYnAtPklGQl9IU0lTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9IU0lTdXAudG9wICk7CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKwkJaWZicC0+SUZCX0ZXU3VwLmxlbiA9IHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CisJCWlmYnAtPklGQl9GV1N1cC50eXAgPSBDRkdfRldfU1VQX1JBTkdFOworCQkodm9pZCloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldTdXAubGVuICk7CisvKiA7PyBjb252ZXJzaW9uIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBtbWRfY2hlY2tfY29tcCAqLworI2lmIEhDRl9CSUdfRU5ESUFOCisJCWlmYnAtPklGQl9GV1N1cC5yb2xlICAgID0gQ05WX0xJVFRMRV9UT19TSE9SVCggaWZicC0+SUZCX0ZXU3VwLnJvbGUgKTsKKwkJaWZicC0+SUZCX0ZXU3VwLmlkICAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAuaWQgKTsKKwkJaWZicC0+SUZCX0ZXU3VwLnZhcmlhbnQgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudmFyaWFudCApOworCQlpZmJwLT5JRkJfRldTdXAuYm90dG9tICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC5ib3R0b20gKTsKKwkJaWZicC0+SUZCX0ZXU3VwLnRvcCAgICAgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldTdXAudG9wICk7CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworCQlpZiAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX1BSSSApIHsJCQkJCQkJCQkJCQkvKiAyMCovCitpbnQgaSA9IHNpemVvZiggQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKSArIHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUICk7CisJCQl3aGlsZSAoIGktLSApICgoaGNmXzgqKSgmaWZicC0+SUZCX1BSSUlkZW50aXR5KSlbaV0gPSAoKGhjZl84KikoJmlmYnAtPklGQl9GV0lkZW50aXR5KSlbaV07CisJCQlpZmJwLT5JRkJfUFJJSWRlbnRpdHkudHlwID0gQ0ZHX1BSSV9JREVOVElUWTsKKwkJCWlmYnAtPklGQl9QUklTdXAudHlwID0gQ0ZHX1BSSV9TVVBfUkFOR0U7CisJCQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSAmaWZicC0+SUZCX1BSSUlkZW50aXR5LmxlbjsKKwkJCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUKzFdID0gJmlmYnAtPklGQl9QUklTdXAubGVuOworCQl9CisJCWlmICggIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2ksICZpZmJwLT5JRkJfSFNJU3VwKQkJCQkgLyogMjIqLworI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAKKy8vOz8gdGhlIFBSSSBjb21wYXRpYmlsaXR5IGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9yIERIRgorCQkJIHx8ICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLCAmaWZicC0+SUZCX1BSSVN1cCkKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKKwkJICAgKSB7CisJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgPSBDQVJEX1NUQVRfSU5DT01QX1BSSTsKKwkJCXJjID0gSENGX0VSUl9JTkNPTVBfUFJJOworCQl9CisJCWlmICggKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9TVEEgJiYJIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEsICZpZmJwLT5JRkJfRldTdXApICkgfHwKKwkJCSAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX0FQRiAmJiAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiwgJmlmYnAtPklGQl9GV1N1cCkgKQorCQkgICApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyNCAqLworCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9JTkNPTVBfRlc7CisJCQlyYyA9IEhDRl9FUlJfSU5DT01QX0ZXOworCQl9CisJfQorI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKyNpZiAoSENGX0RMX09OTFkpID09IDAJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjggKi8KKwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICYmIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPj0gQ09NUF9JRF9GV19TVEEgKSB7CitQUk9UX0NOVF9JTkkKKwkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCSogcmxhdjogdGhlIERNQSBlbmdpbmUgbmVlZHMgdGhlIGhvc3QgdG8gY2F1c2UgYSAnaGFuZ2luZyBhbGxvYyBldmVudCcgZm9yIGl0IHRvIGNvbnN1bWUuCisJCSogbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgcmlnaHQgc3BvdCBpbiB0aGUgSENGLCB0aGlua2luZyBhYm91dCBoY2ZfZW5hYmxlLi4uCisJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKKy8vIDE4MCBkZWdyZWUgZXJyb3IgaW4gbG9naWMgOz8gI2lmIEFMTE9DXzE1CisvLwkJaWZicC0+SUZCX1JzY0luZCA9IDE7CS8vbGV0J3MgaG9wZSB0aGF0IGJ5IHRoZSB0aW1lIGhjZl9zZW5kX21zZyBpc2EgY2FsbGVkLCB0aGVyZSB3aWxsIGJlIGEgRklECisvLyNlbHNlCisJCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlIQ0ZfV0FJVF9XSElMRSggKElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX0FMTE9DKSA9PSAwICk7CisJCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVChwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApIC8qTk9QKi87KQorI2lmIEhDRl9ETUEKKwkJCWlmICggISAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkKKyNlbmRpZiAvLyBIQ0ZfRE1BCisJCQl7CisJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQsIDAgKQorCQkJCWNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKKwkJCQlJRl9QUk9UX1RJTUUoIGlmICggcHJvdF9jbnQgPT0gMCApIHJjID0gSENGX0VSUl9USU1FX09VVDsgKQorCQkJfQorCQl9CisvLyNlbmRpZiAvLyBBTExPQ18xNQorCX0KKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfSU5JVCApCisJcmV0dXJuIHJjOworfSAvLyBpbml0CisKKyNpZiAoSENGX0RMX09OTFkpID09IDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIGlzcl9pbmZvKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQloYW5kbGVzIGxpbmsgZXZlbnRzLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKjE6CUZpcnN0IHRoZSBGSUQgbnVtYmVyIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgSW5mb0V2ZW50IGlzIGRldGVybWluZWQuCisqCU5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCisqCU5leHQgdGhlIEwtZmllbGQgYW5kIHRoZSBULWZpZWxkIGFyZSBmZXRjaGVkIGludG8gc2NyYXRjaCBidWZmZXIgaW5mby4KKyoyOglJbiBjYXNlIG9mIHRhbGxpZXMsIHRoZSAxNiBiaXRzIEhlcm1lcyB2YWx1ZXMgYXJlIGFjY3VtdWxhdGVkIGluIHRoZSBJRkIgaW50byAzMiBiaXRzIHZhbHVlcy4gSW5mb1swXQorKglpcyAoZXhwZWN0ZWQgdG8gYmUpIEhDRl9OSUNfVEFMX0NOVCArIDEuIFRoZSBjb250cmFwdGlvbiAid2hpbGUgKCBpbmZvWzBdLS0gPjEgKSIgcmF0aGVyIHRoYW4KKyoJIndoaWxlICggLS1pbmZvWzBdICkiIGlzIHVzZWQgYmVjYXVzZSBpdCBpcyBkYW5nZXJvdXMgdG8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIFZhbHVlIGZpZWxkIGJ5CisqCWRlY3JlbWVudGluZyBpbmZvWzBdLiBBcyBhIHJlc3VsdCBvZiBhIGJ1ZyBpbiBzb21lIHZlcnNpb24gb2YgdGhlIEYvVywgaW5mb1swXSBtYXkgYmUgMCwgcmVzdWx0aW5nCisqCWluIGEgdmVyeSBsb25nIGxvb3AgaW4gdGhlIHByZS1kZWNyZW1lbnQgbG9naWMuCisqNDoJSW4gY2FzZSBvZiBhIGxpbmsgc3RhdHVzIGZyYW1lLCB0aGUgaW5mb3JtYXRpb24gaXMgY29waWVkIHRvIHRoZSBJRkIgZmllbGQgSUZCX2xpbmtTdGF0CisqNjoJQWxsIG90aGVyIHRoYW4gVGFsbGllcyAoaW5jbHVkaW5nICJ1bmtub3duIiBvbmVzKSBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzZWxlY3Rpb24gc2V0IGJ5IHRoZSBNU0YKKyoJdmlhIENGR19SSURfTE9HLiBJZiBhIG1hdGNoIGlzIGZvdW5kIG9yIHRoZSBzZWxlY3Rpb24gc2V0IGhhcyB0aGUgd2lsZC1jYXJkIHR5cGUgKGkuZSBub24tTlVMTCBidWZmZXIKKyoJcG9pbnRlciBhdCB0aGUgdGVybWluYXRpbmcgemVyby10eXBlKSwgdGhlIGZyYW1lIGlzIGNvcGllZCB0byB0aGUgKHR5cGUtc3BlY2lmaWMpIGxvZyBidWZmZXIuCisqCU5vdGUgdGhhdCB0byBhY2N1bXVsYXRlIHRhbGxpZXMgaW50byBJRkIgQU5EIHRvIGxvZyB0aGVtIG9yIHRvIGxvZyBhIGZyYW1lIHdoZW4gYSBzcGVjaWZpYyBtYXRjaCBvY2N1cmVzCisqCUFORCBiYXNlZCBvbiB0aGUgd2lsZC1jYXJkIHNlbGVjdGlvbiwgeW91IGhhdmUgdG8gY2FsbCBzZXR1cF9iYXAgYWdhaW4gYWZ0ZXIgdGhlIDFzdCBjb3B5LgorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAoraXNyX2luZm8oIElGQlAgaWZicCApCit7CitoY2ZfMTYJaW5mb1syXSwgZmlkOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKK1JJRF9MT0dQCXJpZHAgPSBpZmJwLT5JRkJfUklETG9ncDsJLy9OVUxMIG9yIHBvaW50ZXIgdG8gYXJyYXkgb2YgUklEX0xPRyBzdHJ1Y3R1cmVzICh0ZXJtaW5hdGVkIGJ5IHplcm8gdHlwKQorI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKworCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gKTsJCQkJCQkJCQkJCQkJCQkJLyogMSAqLworCWZpZCA9IElQVyggSFJFR19JTkZPX0ZJRCApOworCURBV0FfWkVST19GSUQoIEhSRUdfSU5GT19GSUQgKQorCWlmICggZmlkICkgeworCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMCwgSU9fSU4gKTsKKwkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpbmZvLCA0IEJFX1BBUigyKSApOworCQlIQ0ZBU1NFUlQoIGluZm9bMF0gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBpbmZvWzFdLCBpbmZvWzBdICkgKSAgLy87PyBhIHNtYWxsZXIgdmFsdWUgbWFrZXMgbW9yZSBzZW5zZQorI2lmIChIQ0ZfVEFMTElFUykgJiBIQ0ZfVEFMTElFU19OSUMJCS8vSGVybWVzIHRhbGx5IHN1cHBvcnQKKwkJaWYgKCBpbmZvWzFdID09IENGR19UQUxMSUVTICkgeworaGNmXzMyCSpwOworLyoyKi8JCWlmICggaW5mb1swXSA+IEhDRl9OSUNfVEFMX0NOVCApIHsKKwkJCQlpbmZvWzBdID0gSENGX05JQ19UQUxfQ05UICsgMTsKKwkJCX0KKwkJCXAgPSAoaGNmXzMyKikmaWZicC0+SUZCX05JQ19UYWxsaWVzOworCQkJd2hpbGUgKCBpbmZvWzBdLS0gPjEgKSAqcCsrICs9IElQVyggSFJFR19EQVRBXzEgKTsJLy9yZXF1ZXN0IG1heSByZXR1cm4gemVybyBsZW5ndGgKKwkJfQorCQllbHNlCisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCisJCXsKKy8qNCovCQlpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKKwkJCQlpZmJwLT5JRkJfTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICk7CisJCQl9CisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworLyo2Ki8JCXdoaWxlICggMSApIHsKKwkJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgeworCQkJCQlpZiAoIHJpZHAtPmJ1ZnAgKSB7CisJCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKQorCQkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbigoaGNmXzE2KShyaWRwLT5sZW4gLSAxKSwgaW5mb1swXSApOyAJLy9zYXZlIEwKKwkJCQkJCXJpZHAtPmJ1ZnBbMV0gPSBpbmZvWzFdOwkJCQkJCS8vc2F2ZSBUCisJCQkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzJdLCAocmlkcC0+YnVmcFswXSAtIDEpKjIgQkVfUEFSKDApICk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJpZHArKzsKKwkJCX0KKyNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCisJCX0KKwkJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7CisJfQorCXJldHVybjsKK30gLy8gaXNyX2luZm8KKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisvLworLy8KKy8vICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMKKy8vIC8qNCovCWlmICggaW5mb1sxXSA9PSBDRkdfTElOS19TVEFUICkgeworLy8gCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICkgfCBDRkdfTElOS19TVEFUX0NIQU5HRTsJLy9jb3JydXB0cyBCQVAgISEgOz8KKy8vIAkJCWlmYnAtPklGQl9MaW5rU3RhdCA9IGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsgLy87PyB0byBiZSBvYnNvbGV0ZWQKKy8vIAkJCXByaW50ayggIjw0PmxpbmtzdGF0dXM6ICUwNHhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisvLyAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCisvLyAJCQlpZiAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7IAkvL2V2ZW4gdmFsdWVzIGFyZSBkaXNjb25uZWN0ZWQgZXRjLgorLy8gCQkJCWlmYnAtPklGQl9UaWNrQ250ID0gMDsJCQkJLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCisvLyAJCQkJcHJpbnRrKCAiPDU+aXNyX2luZm86IEF3YWl0Q29ubmVjdGlvbiBwaGFzZSBzdGFydGVkLCBJRkJfVGlja0NudCA9IDBcbiIgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKKy8vIAkJCX0KKy8vICNlbmRpZiAvLyBIQ0ZfRERTCisvLyAJCX0KKy8vICNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCisvLyAvKjYqLwl3aGlsZSAoIDEgKSB7CisvLyAJCQlpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgeworLy8gCQkJCWlmICggcmlkcC0+YnVmcCApIHsKKy8vIAkJCQkJSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICkKKy8vIAkJCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDIsIElPX0lOICk7CQkJLy9yZXN0b3JlIEJBUCBmb3IgdGFsbGllcywgbGlua3N0YXQgYW5kIHNwZWNpZmljIHR5cGUgZm9sbG93ZWQgYnkgd2lsZCBjYXJkCisvLyAJCQkJCXJpZHAtPmJ1ZnBbMF0gPSBtaW4oIHJpZHAtPmxlbiAtIDEsIGluZm9bMF0gKTsgCS8vc2F2ZSBMCisvLyAJCQkJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApJnJpZHAtPmJ1ZnBbMV0sIHJpZHAtPmJ1ZnBbMF0qMiBCRV9QQVIoMCkgKTsKKy8vIAkJCQl9CisvLyAJCQkJYnJlYWs7IC8vOz90aGlzIGJyZWFrIGlzIG5vIGxvbmdlciBuZWVkZWQgZHVlIHRvIHNldHVwX2JhcCBidXQgbGV0cyBjb25jZW50cmF0ZSBvbiBERFMgZmlyc3QKKy8vIAkJCX0KKy8vIAkJCXJpZHArKzsKKy8vIAkJfQorLy8gI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKy8vIAl9CisvLyAJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9JU1JfSU5GTyB8IEhDRl9UUkFDRV9FWElUICk7CisvLworLy8KKy8vCisvLworLy8JcmV0dXJuOworLy99IC8vIGlzcl9pbmZvCisvLyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCisqLlBVUlBPU0UJCWZpbHRlcnMgYXNzZXJ0IG9uIGxldmVsIGFuZCBpbnRlcmZhY2VzIHRvIHRoZSBNU0Ygc3VwcGxpZWQgbXNmX2Fzc2VydCByb3V0aW5lLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWxpbmVfbnVtYmVyCWxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIHdoaWNoIGNhdXNlZCB0aGUgYXNzZXJ0CisqCXEJCQlxdWFsaWZpZXIsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGdpdmUgYSBjbHVlIGFib3V0IHRoZSBwcm9ibGVtCisqCisqLlJFVFVSTlMJCU4uQS4KKyoKKyouREVTQ1JJUFRJT04KKyoKKyoKKyouRElBR1JBTQorKgorKi5OT1RJQ0UKKyogbWRkX2Fzc2VydCBoYXMgYmVlbiB0aHJvdWdoIGEgdHVybW9pbCwgcmVuYW1pbmcgaGNmX2Fzc2VydCB0byBhc3NlcnQgYW5kIGhjZl9hc3NlcnQgYWdhaW4gYW5kIHN1cHBvcnRpbmcgb2ZmCisqIGFuZCBvbiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsIGFuZCBvdGhlciAoIGltbWF0dXJlICkgTW9kdWxhckRyaXZlckRldmVsb3BtZW50IG1vZHVsZXMgbGlrZSBESEYgYW5kCisqIE1NRC4KKyAqICEhISEgVGhlIGFzc2VydCByb3V0aW5lIGlzIG5vdCBhbiBoY2ZfLi4uLi4gcm91dGluZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBNU0YsCisgKgkJaG93ZXZlciBpdCBpcyBjYWxsZWQgZnJvbSBtbWQuYyBhbmQgZGhmLmMsIHNvIGl0IG11c3QgYmUgZXh0ZXJuYWwuCisgKgkJVG8gcHJldmVudCBuYW1lc3BhY2UgcG9sbHV0aW9uIGl0IG5lZWRzIGEgcHJlZml4LCB0byBwcmV2ZW50IHRoYXQgTVNGIHByb2dyYW1tZXJzIHRoaW5rIHRoYXQKKyAqCQl0aGV5IGFyZSBhbGxvd2VkIHRvIGNhbGwgdGhlIGFzc2VydCBsb2dpYywgdGhlIHByZWZpeCBIQ0YgY2FuJ3QgYmUgdXNlZCwgc28gTUREIGlzIHNlbGVjdGVkISEhIQorICoKKyogV2hlbiBjYWxsZWQgZnJvbSB0aGUgREhGIG1vZHVsZSB0aGUgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYnkgREhGX0ZJTEVfTkFNRV9PRkZTRVQgYW5kIHdoZW4gY2FsbGVkIGZyb20KKyogdGhlIE1NRCBtb2R1bGUgYnkgTU1EX0ZJTEVfTkFNRV9PRkZTRVQuCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIEhDRl9BU1NFUlQKK3ZvaWQKK21kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCit7CitoY2ZfMTYJcnVuX3RpbWVfZmxhZyA9IGlmYnAtPklGQl9Bc3NlcnRMdmw7CisKKwlpZiAoIHJ1bl90aW1lX2ZsYWcgLyogPiA7Pz8/Pz8/ICovICkgeyAvL3ByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yLCBsYXRlciB0byBiZSBleHRlbmRlZCB0byBsZXZlbCBmaWx0ZXJpbmcKKwkJaWZicC0+SUZCX0Fzc2VydFF1YWxpZmllciA9IHE7CisJCWlmYnAtPklGQl9Bc3NlcnRMaW5lID0gKGhjZl8xNilsaW5lX251bWJlcjsKKyNpZiAoSENGX0FTU0VSVCkgJiAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gKQorCQlpZiAoIGlmYnAtPklGQl9Bc3NlcnRSdG4gKSB7CisJCQlpZmJwLT5JRkJfQXNzZXJ0UnRuKCBsaW5lX251bWJlciwgaWZicC0+SUZCX0Fzc2VydFRyYWNlLCBxICk7CisJCX0KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIC8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9TV19TVVAKKwkJT1BXKCBIUkVHX1NXXzIsIGxpbmVfbnVtYmVyICk7CisJCU9QVyggSFJFR19TV18yLCBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgKTsKKwkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpcSApOworCQlPUFcoIEhSRUdfU1dfMiwgKGhjZl8xNikocSA+PiAxNiApICk7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9TV19TVVAKKworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgJiYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQgorCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gMDsJCQkJCQkJCQkvLyBwcmV2ZW50IHJlY3Vyc2l2ZSBiZWhhdmlvcgorCQloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfQXNzZXJ0U3RyY3QgKTsKKwkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IHJ1bl90aW1lX2ZsYWc7CQkJCQkJLy8gcmVzdG9yZSBhcHByb3ByaWF0ZSBmaWx0ZXIgbGV2ZWwKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CIC8gSENGX0FTU0VSVF9NQgorCX0KK30gLy8gbWRkX2Fzc2VydAorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQorKi5QVVJQT1NFCQl3cml0ZXMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBIb3N0IG1lbW9yeSB0byBOSUMgUkFNLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgorKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisqCXdvcmRfbGVuCUJpZyBFbmRpYW4gb25seTogbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gc3dhcCBpbiBwYWlycworKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSBub3QgeWV0IHdyaXR0ZW4gYnkgdGhlIHByZXZpb3VzIHB1dF9mcmFnIGFuZCBjb3B5IGxlbgorKiAob3IgbGVuLTEpIGJ5dGVzIGZyb20gYnVmcCB0byBOSUMuCisqCisqCisqLkRJQUdSQU0KKyoKKyouTk9USUNFCisqCUl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCisqCUFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitIQ0ZfU1RBVElDIHZvaWQKK3B1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCit7CitoY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKK2ludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KK2hjZl8xNgkJajsKKwlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKKyNpZiBIQ0ZfQklHX0VORElBTgorCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCB3b3JkX2xlbiA9PSAyIHx8IHdvcmRfbGVuID09IDQsIHdvcmRfbGVuICkKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKQorCUhDRkFTU0VSVCggd29yZF9sZW4gPD0gbGVuLCBNRVJHRV8yKCB3b3JkX2xlbiwgbGVuICkgKQorCisJaWYgKCB3b3JkX2xlbiApIHsJCQkJCQkJCQkvL2lmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKKyAJCQkJCQkJCQkJCQkJCS8vLiAgY29udmVydCBhbmQgd3JpdGUgdGhlIDFzdCBoY2ZfMTYKKwkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OworCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CisJCQkJCQkJCQkJCQkJCS8vLiAgdXBkYXRlIHBvaW50ZXIgYW5kIGNvdW50ZXIgYWNjb3JkaW5nbHkKKwkJbGVuIC09IDI7CisJCWJ1ZnAgKz0gMjsKKwkJaWYgKCB3b3JkX2xlbiA+IDEgKSB7CQkJCQkJCS8vLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQorIAkJCQkJCQkJCQkJCQkJLy8uICAuICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMm5kIGhjZl8xNgorCQkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OwkvKmJ1ZnAgaXMgYWxyZWFkeSBpbmNyZW1lbnRlZCBieSAyKi8KKwkJCU9VVF9QT1JUX1dPUkQoIGlvX3BvcnQsIGogKTsKKwkJCQkJCQkJCQkJCQkJLy8uICAuICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQorCQkJbGVuIC09IDI7CisJCQlidWZwICs9IDI7CisJCX0KKwl9CisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKwlpID0gbGVuOworCWlmICggaSAmJiBpZmJwLT5JRkJfQ2FycnlPdXQgKSB7CQkJCQkvL3NraXAgemVyby1sZW5ndGgKKwkJaiA9ICgoKmJ1ZnApPDw4KSArICggaWZicC0+SUZCX0NhcnJ5T3V0ICYgMHhGRiApOworCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CisJCWJ1ZnArKzsgaS0tOworCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAwOworCX0KKyNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKKwkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKKwkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAorCWlmICggIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV8xNkJJVCkgJiYgaSA+PSA2ICkgeworaGNmXzMyIEZBUgkqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybworCQlpZiAoICggKGhjZl8zMilidWZwICYgMHgxICkgPT0gMCApIHsJCQkvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKKwkJCWlmICggKGhjZl8zMilidWZwICYgMHgyICkgewkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvLy4gIC4gIC4gIHdyaXRlIGEgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQlqID0gKih3Y2lfcmVjb3JkcClidWZwOwkJLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CisJCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCQlidWZwICs9IDI7IGkgLT0gMjsKKwkJCX0KKwkJCQkJCQkJCQkJCQkvLy4gIC4gIHdyaXRlIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKKwkJCXA0ID0gKGhjZl8zMiBGQVIgKilidWZwOworCQkJaiA9IChoY2ZfMTYpaS80OworCQkJT1VUX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOworCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCWJ1ZnAgKz0gaSAmIH4weDAwMDM7CisJCQlpICY9IDB4MDAwMzsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCisJCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMSB3b3JkIGxlZnQKKwlpZiAoIGkgKSB7CisJCQkJCQkJCQkJCQkJLy8uICBpZiBvZGQgbnVtYmVyIG9mIGJ5dGVzIGxlZnQKKwkJaWYgKCBpICYgMHgwMDAxICkgeworCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBsZWZ0IG92ZXIgYnl0ZSAoYmVmb3JlIGJ1ZnAgaXMgY29ycnVwdGVkKSBpbiBjYXJyeSwgc2V0IGNhcnJ5IGZsYWcKKwkJCWlmYnAtPklGQl9DYXJyeU91dCA9IChoY2ZfMTYpYnVmcFtpLTFdIHwgMHgwMTAwOwkvL25vdGUgdGhhdCBpIGFuZCBidWZwIGFyZSBhbHdheXMgc2ltdWx0YW5lb3VzbHkgbW9kaWZpZWQsICZidWZwW2ktMV0gaXMgaW52YXJpYW50CisJCX0KKwkJCQkJCQkJCQkJCQkvLy4gIHdyaXRlIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQorCQlqID0gKGhjZl8xNilpLzI7CisJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBidWZwLCBqICk7CisJfQorfSAvLyBwdXRfZnJhZworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQl2b2lkIHB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQorKi5QVVJQT1NFCQljbGVhbnVwIGFmdGVyIHB1dF9mcmFnIGZvciB0cmFpbGluZyBvZGQgYnl0ZSBhbmQgTUlDIHRyYW5zZmVyIHRvIE5JQy4KKyoKKyouQVJHVU1FTlRTCisqCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworKgorKi5SRVRVUk5TCQlOLkEuCisqCisqLkRFU0NSSVBUSU9OCisqIGZpbmFsaXplIHRoZSBNSUMgY2FsY3VsYXRpb24gd2l0aCB0aGUgcGFkZGluZyBwYXR0ZXJuLCBvdXRwdXQgdGhlIGxhc3QgYnl0ZSAoaWYgYXBwbGljYWJsZSkKKyogb2YgdGhlIG1lc3NhZ2UgYW5kIHRoZSBNSUMgdG8gdGhlIFR4RlMKKyoKKyoKKyouRElBR1JBTQorKjI6CTEgYnl0ZSBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX0NhcnJ5T3V0ICggdGhlIHB1dF9mcmFnIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgorKgkxIC0gMyBieXRlcyBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX3R4XzMyICggdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCisqCVRoZSBjYWxsIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gcm91dGluZSBmZWVkcyB0aGVzZSByZW1haW5pbmcgYnl0ZXMgKGlmIGFueSkgb2YgcHV0X2ZyYWcgYW5kIHRoZQorKglqdXN0IGFzIG1hbnkgYnl0ZXMgb2YgdGhlIHBhZGRpbmcgYXMgbmVlZGVkIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gZW5naW5lLiBOb3RlIHRoYXQgdGhlICJ1bm5lZWRlZCIgcGFkCisqCWJ5dGVzIHNpbXBseSBlbmQgdXAgaW4gdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyIGFuZCBhcmUgbmV2ZXIgdXNlZC4KKyo4Ogl3cml0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBNSUMgYW5kIHBvc3NpYmxlIHNvbWUgZ2FyYmFnZSB0byBOSUMgUkFNCisqCU5vdGU6IGkgaXMgYWx3YXlzIDQgKGEgbG9vcC1pbnZhcmlhbnQgb2YgdGhlIHdoaWxlIGluIHBvaW50IDIpCisqCisqLk5PVElDRQorKgorKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgdm9pZAorcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCit7CisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgIT0gMHhGRkZGKSB7CQkvL2lmIE1JQyBjYWxjdWxhdGlvbiBhY3RpdmUKKwkJQ0FMQ19UWF9NSUMoIG1pY19wYWQsIDgpOwkJCQkvLy4gIGZlZWQgKHVwIHRvIDggYnl0ZXMgb2YpIHZpcnR1YWwgcGFkZGluZyB0byBNSUMgZW5naW5lCisJCQkJCQkJCQkJCQkvLy4gIHdyaXRlIChwb3NzaWJseSkgdHJhaWxpbmcgYnl0ZSArIChtb3N0IG9mKSBNSUMKKwkJcHV0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcClpZmJwLT5JRkJfTUlDVHgsIDggQkVfUEFSKDApICk7CisJfQorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCXB1dF9mcmFnKCBpZmJwLCBudWxsX2FkZHIsIDEgQkVfUEFSKDApICk7CS8vd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBkYXRhIG9yIE1JQyBieXRlCit9IC8vIHB1dF9mcmFnX2ZpbmFsaXplCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQorKi5QVVJQT1NFCQlzdXBwb3J0IHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAiYmFzaWMiIHRhc2sgb2YgaGNmX3B1dF9pbmZvIHRvIHBhc3MgUklEcyB0byB0aGUgTklDLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisqCWx0dnAJCWFkZHJlc3MgaW4gTklDIFJBTSB3aGVyZSBMVlQtcmVjb3JkcyBhcmUgbG9jYXRlZAorKgorKi5SRVRVUk5TCisqCUhDRl9TVUNDRVNTCisqCT4+cHV0X2ZyYWcKKyoJPj5jbWRfd2FpdAorKgorKi5ERVNDUklQVElPTgorKgorKgorKi5ESUFHUkFNCisqMjA6IGRvIG5vdCB3cml0ZSBSSURzIHRvIE5JQ3Mgd2hpY2ggaGF2ZSBpbmNvbXBhdGlibGUgRmlybXdhcmUKKyoyNDogSWYgdGhlIFJJRCBkb2VzIG5vdCBleGlzdCwgdGhlIEwtZmllbGQgaXMgc2V0IHRvIHplcm8uCisqCU5vdGUgdGhhdCBzb21lIFJJRHMgY2FuIG5vdCBiZSByZWFkLCBlLmcuIHRoZSBwc2V1ZG8gUklEcyBmb3IgZGlyZWN0IEhlcm1lcyBjb21tYW5kcyBhbmQgQ0ZHX0RFRkFVTFRfS0VZUworKjI4OiBJZiB0aGUgUklEIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bCwgcGFzcyBpdCB0byB0aGUgTklDIGJ5IG1lYW5zIG9mIGFuIEFjY2VzcyBXcml0ZSBjb21tYW5kCisqCisqLk5PVElDRQorKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKKyoJICAtCXNvbWUgY29kZXMgKGUuZy4gQ0ZHX1JFR19NQikgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcworKgkJYXJlIHZhbGlkLiBUaGVzZSBjb2RlcyBhcmUgYWxyZWFkeSBjb25zdW1lZCBieSBoY2ZfcHV0X2luZm8uCisqCSAgLSBhbGwgb3RoZXIgY29kZXMgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiBCZWZvcmUgdGhlIHB1dCBhY3Rpb24gaXMgZXhlY3V0ZWQsIGhjZl9nZXRfaW5mbyBpcyBjYWxsZWQKKyoJCXdpdGggYW4gTFRWIHJlY29yZCB3aXRoIGEgdmFsdWUgb2YgMSBpbgl0aGUgTC1maWVsZCBhbmQgdGhlIGludGVuZGVkIHB1dCBhY3Rpb24gdHlwZSBpbiB0aGUgVHlwLWNvZGUKKyoJCWZpZWxkLiBJZiB0aGUgcHV0IGFjdGlvbiB0eXBlIGlzIHZhbGlkLCBpdCBpcyBhbHNvIHZhbGlkIGFzIGEgZ2V0IGFjdGlvbiB0eXBlIGNvZGUgLSBleGNlcHQKKyoJCWZvciBDRkdfREVGQVVMVF9LRVlTIGFuZCBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgLSBzbyB0aGUgSENGX0FTU0VSVCBsb2dpYyBvZiBoY2ZfZ2V0X2luZm8gc2hvdWxkCisqCQlub3QgY2F0Y2guCisqCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBpbnQKK3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cAkpCit7CisKK2ludCByYyA9IEhDRl9TVUNDRVNTOworCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCwgTUVSR0VfMiggbHR2cC0+dHlwLCBpZmJwLT5JRkJfQ2FyZFN0YXQgKSApCisJSENGQVNTRVJUKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVgsIGx0dnAtPnR5cCApCisKKwlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmCQkJCQkJCQkJCQkJCQkJCS8qIDIwKi8KKwkJICggKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICAgICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVggKSB8fAorCQkgICAoIENGR19SSURfRU5HX01JTiA8PSBsdHZwLT50eXAgLyogJiYgbHR2cC0+dHlwIDw9IDB4RkZGRiAqLyAgICAgICApICAgICApICkgeworI2lmIEhDRl9BU1NFUlQgLy9GQ0M4LCBGQ0IwLCBGQ0I0LCBGQ0I2LCBGQ0I3LCBGQ0I4LCBGQ0MwLCBGQ0M0LCBGQ0JDLCBGQ0JELCBGQ0JFLCBGQ0JGCisgeworIGhjZl8xNgkJdCA9IGx0dnAtPnR5cDsKKyBMVFZfU1RSQ1QgCXggPSB7IDIsIHQsIHswfSB9OwkJCQkJCQkJCQkJCQkJCS8qMjQqLworCWhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApJnggKTsKKwlpZiAoIHgubGVuID09IDAgJiYKKwkJICggdCAhPSBDRkdfREVGQVVMVF9LRVlTICYmIHQgIT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZICYmCisJCSAgIHQgIT0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkgJiYgdCAhPSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSAmJgorCQkgICB0ICE9IENGR19IQU5ET1ZFUl9BRERSICYmIHQgIT0gQ0ZHX0RJU0FTU09DSUFURV9BRERSICYmCisJCSAgIHQgIT0gQ0ZHX0ZDQkMgJiYgdCAhPSBDRkdfRkNCRCAmJiB0ICE9IENGR19GQ0JFICYmIHQgIT0gQ0ZHX0ZDQkYgJiYKKwkJICAgdCAhPSBDRkdfREVBVVRIRU5USUNBVEVfQUREUgorCQkgKQorCQkpIHsKKwkJSENGQVNTRVJUKCBET19BU1NFUlQsIGx0dnAtPnR5cCApCisJCX0KKyB9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisJCXJjID0gc2V0dXBfYmFwKCBpZmJwLCBsdHZwLT50eXAsIDAsIElPX09VVCApOworCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWx0dnAsIDIqbHR2cC0+bGVuICsgMiBCRV9QQVIoMikgKTsKKy8qMjgqLwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0FDQ0VTUyArIEhDTURfQUNDRVNTX1dSSVRFLCBsdHZwLT50eXAgKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9IC8vIHB1dF9pbmZvCisKKworI2lmIChIQ0ZfRExfT05MWSkgPT0gMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICkKKyouUFVSUE9TRQkgCWFjY3VtdWxhdGVzIGEgKCBzZXJpZXMgb2YpIGJ1ZmZlcnMgaW50byBhIHNpbmdsZSBJbmZvIGJsb2NrIGludG8gdGhlIE1haWxCb3guCisqCisqLkFSR1VNRU5UUworKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyoJbHR2cAkJYWRkcmVzcyBvZiBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgInR5cGUiIGFuZCB0aGUgZnJhZ21lbnRzIG9mIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBzeW50aGVzaXplZAorKgkJCQlhcyBhbiBMVFYgaW50byB0aGUgTWFpbEJveAorKgorKi5SRVRVUk5TCisqCisqLkRFU0NSSVBUSU9OCisqIElmIHRoZSBkYXRhIGRvZXMgbm90IGZpdCAoaW5jbHVkaW5nIG5vIE1haWxCb3ggaXMgYXZhaWxhYmxlKSwgdGhlIElGQl9NQlRhbGx5IGlzIGluY3JlbWVudGVkIGFuZCBhbgorKiBlcnJvciBzdGF0dXMgaXMgcmV0dXJuZWQuCisqIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2guCisqIENhbGxpbmcgcHV0X2luZm9fbWIgd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IGF2YWlsYWJsZSwgaXMgY29uc2lkZXJlZCBhIGRlc2lnbiBlcnJvciBpbiB0aGUgTVNGLgorKgorKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IDEgd29yZCBvZiB1bnVzZWQgc3BhY2UgaW4gdGhlIG1haWwgYm94LgorKiBBcyBhIGNvbnNlcXVlbmNlOgorKiAtIG5vIHByb2JsZW0gaW4gcG9pbnRlciBhcml0aG1ldGljIChNQl9SUCA9PSBNQl9XUCBtZWFucyB1bmFtYmlndW91c2x5IG1haWwgYm94IGlzIGNvbXBsZXRlbHkgZW1wdHkKKyogLSBUaGVyZSBpcyBhbHdheXMgZnJlZSBzcGFjZSB0byB3cml0ZSBhbiBMIGZpZWxkIHdpdGggYSB2YWx1ZSBvZiB6ZXJvIGFmdGVyIGVhY2ggTUJfSW5mbyBibG9jay4gIFRoaXMKKyogICBhbGxvd3MgZm9yIGFuIGVhc3kgc2NhbiBtZWNoYW5pc20gaW4gdGhlICJnZXQgTUJfSW5mbyBibG9jayIgbG9naWMuCisqCisqCisqLkRJQUdSQU0KKyoxOglDYWxjdWxhdGUgTCBmaWVsZCBvZiB0aGUgTUJJQiwgaS5lLiAxIGZvciB0aGUgVC1maWVsZCArIHRoZSBjdW11bGF0aXZlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnRzLgorKjI6CVRoZSBmcmVlIHNwYWNlIGluIHRoZSBNYWlsQm94IGlzIGNhbGN1bGF0ZWQgKDJhOiBmcmVlIHBhcnQgZnJvbSBXcml0ZSBQdHIgdG8gUmVhZCBQdHIsIDJiOiBmcmVlIHBhcnQKKyoJdHVybnMgb3V0IHRvIHdyYXAgYXJvdW5kKSAuIElmIHRoaXMgc3BhY2Ugc3VmZmljZXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB3b3JkcyByZWZsZWN0ZWQgYnkgbGVuIChULWZpZWxkCisqCSsgVmFsdWUtZmllbGQpIHBsdXMgdGhlIGFkZGl0aW9uYWwgTWFpbEJveCBJbmZvIEwtZmllbGQgKyBhIHRyYWlsaW5nIDAgdG8gYWN0IGFzIHRoZSBMLWZpZWxkIG9mIGEgdHJhaWxpbmcKKyoJZHVtbXkgb3IgZW1wdHkgTFRWIHJlY29yZCwgdGhlbiBhIE1haWxCb3ggSW5mbyBibG9jayBpcyBidWlsZCBpbiB0aGUgTWFpbEJveCBjb25zaXN0aW5nIG9mCisqCSAgLSB0aGUgdmFsdWUgbGVuIGluIHRoZSBmaXJzdCB3b3JkCisqCSAgLSB0eXBlIGluIHRoZSBzZWNvbmQgd29yZAorKgkgIC0gYSBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhZ21lbnRzIGluIHRoZSBzZWNvbmQgYW5kIGhpZ2hlciB3b3JkCisqCisqNDoJU2luY2UgcHV0X2luZm9fbWIoKSBjYW4gbW9yZSBvciBsZXNzIGRpcmVjdGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBNU0YgbGV2ZWwsIHRoZSBJL0YgbXVzdCBiZSByb2J1c3QKKyoJYWdhaW5zdCBvdXQtb2YtcmFuZ2UgdmFyaWFibGVzLiBBcyBmYWlsc2FmZSBjb2RpbmcsIHRoZSBNQiB1cGRhdGUgaXMgc2tpcHBlZCBieSBjaGFuZ2luZyB0bGVuIHRvIDAgaWYKKyoJbGVuID09IDA7IFRoaXMgd2lsbCBpbmRpcmVjdGx5IGNhdXNlIGFuIGFzc2VydCBhcyByZXN1bHQgb2YgdGhlIHZpb2xhdGlvbiBvZiB0aGUgbmV4dCBpZiBjbGF1c2UuCisqNjoJQ2hlY2sgd2hldGhlciB0aGUgZnJlZSBzcGFjZSBpbiBNYWlsQm94IHN1ZmZpY2VzICh0aGlzIGNvdmVycyB0aGUgY29tcGxldGUgYWJzZW5jZSBvZiB0aGUgTWFpbEJveCkuCisqCU5vdGUgdGhhdCBsZW4gaXMgdW5zaWduZWQsIHNvIGV2ZW4gTVNGIEkvRiB2aW9sYXRpb24gd29ya3Mgb3V0IE8uSy4KKyoJVGhlICcyJyBpbiB0aGUgZXhwcmVzc2lvbiAibGVuKzIiIGlzIHVzZWQgYmVjYXVzZSAxIHdvcmQgaXMgbmVlZGVkIGZvciBMIGl0c2VsZiBhbmQgMSB3b3JkIGlzIG5lZWRlZAorKglmb3IgdGhlIHplcm8tc2VudGluZWwKKyo4Ogl1cGRhdGUgTWFpbEJveCBJbmZvIGxlbmd0aCByZXBvcnQgdG8gTVNGIHdpdGggIm9sZGVzdCIgTUIgSW5mbyBCbG9jayBzaXplLiBCZSBjYXJlZnVsbCBoZXJlLCBpZiB5b3UgZ2V0CisqCWhlcmUgYmVmb3JlIHRoZSBNYWlsQm94IGlzIHJlZ2lzdGVyZWQsIHlvdSBjYW4ndCByZWFkIGZyb20gdGhlIGJ1ZmZlciBhZGRyZXNzZWQgYnkgSUZCX01CcCAoaXQgaXMgdGhlCisqCU51bGwgYnVmZmVyKSBzbyBkb24ndCBtb3ZlIHRoaXMgY29kZSB0aWxsIHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIGJ1dCBrZWVwIGl0IHdoZXJlIHRoZXJlIGlzIGdhcnVhbnRlZWQKKyoJYSBidWZmZXIuCisqCisqLk5PVElDRQorKglib3VuZGFyeSB0ZXN0aW5nIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBJRkJfTUJTaXplIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyBpZiBubyBNYWlsQm94IGlzIHByZXNlbnQsCisqCWFuZCB0byBhIGxlc3NlciBkZWdyZWUsIHRoYXQgSUZCX01CV3AgPSBJRkJfTUJScCA9IDAKKyoKKyouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorCitIQ0ZfU1RBVElDIGludAorcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApCit7CisKK2ludAkJCXJjID0gSENGX1NVQ0NFU1M7CitoY2ZfMTYJCWk7CQkJCQkJLy93b3JrIGNvdW50ZXIKK2hjZl8xNgkJKmRwOwkJCQkJLy9kZXN0aW5hdGlvbiBwb2ludGVyIChpbiBNYWlsQm94KQord2NpX3JlY29yZHAJc3A7CQkJCQkJLy9zb3VyY2UgcG9pbnRlcgoraGNmXzE2CQlsZW47CQkJCQkvL3RvdGFsIGxlbmd0aCB0byBjb3B5IHRvIE1haWxCb3gKK2hjZl8xNgkJdGxlbjsJCQkJCS8vZnJlZSBsZW5ndGgvd29ya2luZyBsZW5ndGgvb2Zmc2V0IGluIFdNUCBmcmFtZQorCisJaWYgKCBpZmJwLT5JRkJfTUJwID09IE5VTEwgKSByZXR1cm4gcmM7ICAvLzs/bm90IHN1ZmZpY2llbnQKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NQnAgIT0gTlVMTCwgMCApCQkJCQkvLyEhIWJlIGNhcmVmdWwsIGRvbid0IGdldCBpbnRvIGFuIGVuZGxlc3MgcmVjdXJzaW9uCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplLCAwICkKKworCWxlbiA9IDE7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAxICovCisJZm9yICggaSA9IDA7IGkgPCBsdHZwLT5mcmFnX2NudDsgaSsrICkgeworCQlsZW4gKz0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19sZW47CisJfQorCWlmICggaWZicC0+SUZCX01CUnAgPiBpZmJwLT5JRkJfTUJXcCApIHsKKwkJdGxlbiA9IGlmYnAtPklGQl9NQlJwIC0gaWZicC0+SUZCX01CV3A7CQkJCQkJCQkJCQkJCQkJLyogMmEqLworCX0gZWxzZSB7CisJCWlmICggaWZicC0+SUZCX01CUnAgPT0gaWZicC0+SUZCX01CV3AgKSB7CisJCQlpZmJwLT5JRkJfTUJScCA9IGlmYnAtPklGQl9NQldwID0gMDsJLy8gb3B0aW1pemUgV3JhcHBpbmcKKwkJfQorCQl0bGVuID0gaWZicC0+SUZCX01CU2l6ZSAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJLyogMmIqLworCQlpZiAoICggdGxlbiA8PSBsZW4gKyAyICkgJiYgKCBsZW4gKyAyIDwgaWZicC0+SUZCX01CUnAgKSApIHsJLy9pZiB0cmFpbGluZyBzcGFjZSBpcyB0b28gc21hbGwgYnV0CisJCQkJCQkJCQkJCQkJCQkJCS8vCSBsZWFkaW5nIHNwYWNlIGlzIHN1ZmZpY2llbnRseSBsYXJnZQorCQkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAweEZGRkY7CQkJCQkvL2ZsYWcgZHVtbXkgTFRWIHRvIGZpbGwgdGhlIHRyYWlsaW5nIHNwYWNlCisJCQlpZmJwLT5JRkJfTUJXcCA9IDA7CQkJCQkJCQkJCS8vcmVzZXQgV3JpdGVQb2ludGVyIHRvIGJlZ2luIG9mIE1haWxCb3gKKwkJCXRsZW4gPSBpZmJwLT5JRkJfTUJScDsJCQkJCQkJCQkvL2dldCBuZXcgYXZhaWxhYmxlIHNwYWNlIHNpemUKKwkJfQorCX0KKwlkcCA9ICZpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXTsKKwlpZiAoIGxlbiA9PSAwICkgeworCQl0bGVuID0gMDsgLy87PyB3aGF0IGlzIHRoaXMgZ29vZCBmb3IKKwl9CisJaWYgKCBsZW4gKyAyID49IHRsZW4gKXsJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDYgKi8KKwkJLy9EbyBOb3QgQVNTRVJULCB0aGlzIGlzIGEgbm9ybWFsIGNvbmRpdGlvbgorCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk5vQnVmTUIrKzsgKSAvKk5PUCB0byBjb3ZlciBhZ2FpbnN0IGFuYWxvbWllcyB3aXRoIGVtcHR5IGNvbXBvdW5kKi87CisJCXJjID0gSENGX0VSUl9MRU47CisJfSBlbHNlIHsKKwkJKmRwKysgPSBsZW47CQkJCQkJCQkJLy93cml0ZSBMZW4gKD0gc2l6ZSBvZiBUK1YgaW4gd29yZHMgdG8gTUJfSW5mbyBibG9jaworCQkqZHArKyA9IGx0dnAtPmJhc2VfdHlwOwkJCQkJCQkvL3dyaXRlIFR5cGUgdG8gTUJfSW5mbyBibG9jaworCQlpZmJwLT5JRkJfTUJXcCArPSBsZW4gKyAxOwkJCQkJCS8vdXBkYXRlIFdyaXRlUG9pbnRlciBvZiBNYWlsQm94CisJCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsJCQkJLy8gcHJvY2VzcyBlYWNoIG9mIHRoZSBmcmFnbWVudHMKKwkJCXNwID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19hZGRyOworCQkJbGVuID0gbHR2cC0+ZnJhZ19idWZbaV0uZnJhZ19sZW47CisJCQl3aGlsZSAoIGxlbi0tICkgKmRwKysgPSAqc3ArKzsKKwkJfQorCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDA7CQkJCS8vdG8gYXNzdXJlIGdldF9pbmZvIGZvciBDRkdfTUJfSU5GTyBzdG9wcworCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF07CQkJCQkJCQkJCQkvKiA4ICovCisJfQorCXJldHVybiByYzsKK30gLy8gcHV0X2luZm9fbWIKKworI2VuZGlmIC8vIEhDRl9FWFRfTUIKKyNlbmRpZiAvLyBIQ0ZfRExfT05MWQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyouU1VCTU9EVUxFCQlpbnQgc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICkKKyouUFVSUE9TRQkJc2V0IHVwIGRhdGEgYWNjZXNzIHRvIE5JQyBSQU0gdmlhIEJBUF8xLgorKgorKi5BUkdVTUVOVFMKKyoJaWZicAkJCWFkZHJlc3Mgb2YgSS9GIEJsb2NrCisqCWZpZAkJCQlGSUQvUklECisqCW9mZnNldAkJCSEhZXZlbiEhIG9mZnNldCBpbiBGSUQvUklECisqCXR5cGUJCQlJT19JTiwgSU9fT1VUCisqCisqLlJFVFVSTlMKKyoJSENGX1NVQ0NFU1MJCQkJCU8uSworKglIQ0ZfRVJSX05PX05JQwkJCQljYXJkIGlzIHJlbW92ZWQKKyoJSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUCUZhdGFsIG1hbGZ1bmN0aW9uIGRldGVjdGVkCisqCUhDRl9FUlJfREVGVU5DVF8uLi4uLgkJaWYgYW5kIG9ubHkgaWYgSUZCX0RlZnVuY3RTdGF0IDw+IDAKKyoKKyouREVTQ1JJUFRJT04KKyoKKyogQSBub24temVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlczoKKyogLSB0aGUgTklDIGlzIGNvbnNpZGVyZWQgbm9ub3BlcmF0aW9uYWwsIGUuZy4gZHVlIHRvIGEgdGltZS1vdXQgb2Ygc29tZSBIZXJtZXMgYWN0aXZpdHkgaW4gdGhlIHBhc3QKKyogLSBCQVBfMSBjb3VsZCBub3QgcHJvcGVybHkgYmUgaW5pdGlhbGl6ZWQKKyogLSB0aGUgY2FyZCBpcyByZW1vdmVkIGJlZm9yZSBjb21wbGV0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCisqIEluIGFsbCBvdGhlciBjYXNlcywgYSB6ZXJvIGlzIHJldHVybmVkLgorKiBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBpbmRpY2F0ZXMgYW4gSC9XIGVycm9yIHdoaWNoIGlzIHZlcnkgbGlrZWx5IHRvIHNpZ25hbCBjb21wbGV0ZSBIL1cgZmFpbHVyZS4KKyogT25jZSBhIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGhhcyBvY2N1cnJlZCBhbGwgc3Vic2VxdWVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgSGVybWVzIHdpbGwgcmV0dXJuIGEKKyogImRlZnVuY3QiIHN0YXR1cyB0aWxsIHRoZSBIZXJtZXMgaXMgcmUtaW5pdGlhbGl6ZWQgYnkgbWVhbnMgb2YgYW4gaGNmX2Nvbm5lY3QuCisqCisqIEEgQkFQIGlzIGEgc2V0IG9mIHJlZ2lzdGVycyAoT2Zmc2V0LCBTZWxlY3QgYW5kIERhdGEpIG9mZmVyaW5nIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgcGFydGljdWxhciBGSUQgb3IKKyogUklELiBUaGlzIGFjY2VzcyBpcyBiYXNlZCBvbiBhIGF1dG8taW5jcmVtZW50IGZlYXR1cmUuCisqIFRoZXJlIGFyZSB0d28gQkFQcyBidXQgdGhlc2UgZGF5cyB0aGUgSENGIHVzZXMgb25seSBCQVBfMSBhbmQgbGVhdmVzIEJBUF8wIHRvIHRoZSBQQ0kgQnVzbWFzdGVyaW5nIEgvVy4KKyoKKyogVGhlIEJBUC1tZWNoYW5pc20gaXMgYmFzZWQgb24gdGhlIEJ1c3kgYml0IGluIHRoZSBPZmZzZXQgcmVnaXN0ZXIgKHNlZSB0aGUgSGVybWVzIGRlZmluaXRpb24pLiBUaGUgd2FpdGluZworKiBmb3IgQnVzeSBtdXN0IG9jY3VyIGJldHdlZW4gd3JpdGluZyB0aGUgT2Zmc2V0IHJlZ2lzdGVyIGFuZCBhY2Nlc3NpbmcgdGhlIERhdGEgcmVnaXN0ZXIuIFRoZQorKiBpbXBsZW1lbnRhdGlvbiB0byB3YWl0IGZvciB0aGUgQnVzeSBiaXQgZHJvcCBhZnRlciBlYWNoIHdyaXRlIHRvIHRoZSBPZmZzZXQgcmVnaXN0ZXIsIGltcGxpZXMgdGhhdCB0aGUKKyogcmVxdWlyZW1lbnQgdGhhdCB0aGUgQnVzeSBiaXQgaXMgbG93ICBiZWZvcmUgdGhlIFNlbGVjdCByZWdpc3RlciBpcyB3cml0dGVuLCBpcyBhdXRvbWF0aWNhbGx5IG1ldC4KKyogQkFQLXNldHVwIG1heSBiZSB0aW1lIGNvbnN1bWluZyAoZS5nLiAzODAgdXNlYyBmb3IgbGFyZ2Ugb2Zmc2V0cyBvY2N1cnMgZnJlcXVlbnRseSkuIFRoZSB3YWl0IGZvciBCdXN5IGJpdAorKiBkcm9wIGlzIHByb3RlY3RlZCBieSBhIGxvb3AgY291bnRlciwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBJRkJfVGlja0luaSwgd2hpY2ggaXMgY2FsaWJyYXRlZCBpbiBpbml0LgorKgorKiBUaGUgTklDIEkvRiBpcyBvcHRpbWl6ZWQgZm9yIHdvcmQgdHJhbnNmZXIgYW5kIGNhbiBvbmx5IGhhbmRsZSB3b3JkIHRyYW5zZmVyIGF0IGEgd29yZCBib3VuZGFyeSBpbiBOSUMKKyogUkFNLiBUaGUgaW50ZW5kZWQgc29sdXRpb24gZm9yIHRyYW5zZmVyIG9mIGEgc2luZ2xlIGJ5dGUgaGFzIG11bHRpcGxlIEgvVyBmbGF3cy4gVGhlcmUgaGF2ZSBiZWVuIGRpZmZlcmVudAorKiBTL1cgV29ya2Fyb3VuZCBzdHJhdGVnaWVzLiBSSUQgYWNjZXNzIGlzIGhjZl8xNiBiYXNlZCBieSAibmF0dXJlIiwgc28gbm8gYnl0ZSBhY2Nlc3MgcHJvYmxlbXMuICBGb3IgVHgvUngKKyogRklEIGFjY2VzcywgIHRoZSBieXRlIGxvZ2ljIGJlY2FtZSBvYnNvbGV0ZSBieSBhYnNvcmJpbmcgaXQgaW4gdGhlIGRvdWJsZSB3b3JkIG9yaWVudGVkIG5hdHVyZSBvZiB0aGUgTUlDCisqIGZlYXR1cmUuCisqCisqCisqLkRJQUdSQU0KKyoKKyoyOgl0aGUgdGVzdCBvbiByYyBjaGVja3Mgd2hldGhlciB0aGUgSENGIHdlbnQgaW50byAiZGVmdW5jdCIgbW9kZSAoIGUuZy4gQkFQIGluaXRpYWxpemF0aW9uIG9yIGEgY2FsbCB0bworKgljbWRfd2FpdCBkaWQgZXZlciBmYWlsKS4KKyo0Ogl0aGUgc2VsZWN0IHJlZ2lzdGVyIGFuZCBvZmZzZXQgcmVnaXN0ZXIgYXJlIHNldAorKgl0aGUgb2Zmc2V0IHJlZ2lzdGVyIGlzIG1vbml0b3JlZCB0aWxsIGEgc3VjY2Vzc2Z1bCBjb25kaXRpb24gKG5vIGJ1c3kgYml0KSBpcyBkZXRlY3RlZCBvciB0aWxsIHRoZQorKgkoY2FsaWJyYXRlZCkgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZXMKKyoJSWYgdGhlIGNvdW50ZXIgZXhwaXJlcywgdGhpcyBpcyByZWZsZWN0ZWQgaW4gSUZCX0RlZnVuY3RTdGF0LCBzbyBhbGwgc3Vic2VxdWVudCBjYWxscyB0byBzZXR1cF9iYXAgZmFpbAorKglpbW1lZGlhdGVseSAoIHNlZSAyKQorKjY6CWluaXRpYWxpemF0aW9uIG9mIHRoZSBjYXJyeSBhcyB1c2VkIGJ5IHBldC9nZXRfZnJhZworKjg6CUhSRUdfT0ZGU0VUX0VSUiBpcyBpZ25vcmVkIGFzIGVycm9yIGJlY2F1c2U6CisqCSBhOiB0aGUgSGVybWVzIGlzIHJvYnVzdCBhZ2FpbnN0IGl0CisqCSBiOiBpdCBpcyBub3Qga25vd24gd2hhdCBjYXVzZXMgaXQgKHByb2JhYmx5IGEgYnVnKSwgaGVuY2Ugbm8gc3RyYXRlZ3kgY2FuIGJlIHNwZWNpZmllZCB3aGljaCBsZXZlbCBpcworKgkJdG8gaGFuZGxlIHRoaXMgZXJyb3IgaW4gd2hpY2ggd2F5LiBJbiB0aGUgcGFzdCwgaXQgY291bGQgYmUgaW5kdWNlZCBieSB0aGUgTVNGIGxldmVsLCBlLmcuIGJ5IGNhbGxpbmcKKyoJCWhjZl9yY3ZfbXNnIHdoaWxlIHRoZXJlIHdhcyBubyBSeC1GSUQgYXZhaWxhYmxlLiBTaW5jZSB0aGlzIGlzIGFuIE1TRi1lcnJvciB3aGljaCBpcyBjYXVnaHQgYnkgQVNTRVJULAorKgkJdGhlcmUgaXMgbm8gcnVuLXRpbWUgYWN0aW9uIHJlcXVpcmVkIGJ5IHRoZSBIQ0YuCisqCUx1bXBpbmcgdGhlIE9mZnNldCBlcnJvciBpbiB3aXRoIHRoZSBCdXN5IGJpdCBlcnJvciwgYXMgaGFzIGJlZW4gZG9uZSBpbiB0aGUgcGFzdCB0dXJucyBvdXQgdG8gYmUgYQorKglkaXNhc3RlciBvciBhIGxpZmUgc2F2ZXIsIGp1c3QgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcy4gU2luY2Ugbm8gcHJlZGljdGlvbiBjYW4gYmUKKyoJZG9uZSBhYm91dCB0aGUgZnV0dXJlLCBpdCBpcyAiZmVsdCIgdG8gYmUgdGhlIGJlc3Qgc3RyYXRlZ3kgdG8gaWdub3JlIHRoaXMgZXJyb3IuIE9uZSBkYXkgdGhlIGNvZGUgd2FzCisqCWFjY29tcGFuaWVkIGJ5IHRoZSBmb2xsb3dpbmcgY29tbWVudDoKKyoJLy8JaWdub3JlIEhSRUdfT0ZGU0VUX0VSUiwgc29tZW9uZSwgc3VwcG9zZWRseSB0aGUgTVNGIHByb2dyYW1tZXIgOykgbWFkZSBhIGJ1Zy4gU2luY2Ugd2UgZG9uJ3Qga25vdworKgkvLwl3aGF0IGlzIGdvaW5nIG9uLCB3ZSBtaWdodCBhcyB3ZWxsIGdvIG9uIC0gdW5kZXIgbWFuYWdlbWVudCBwcmVzc3VyZSAtIGJ5IGlnbm9yaW5nIGl0CisqCisqLkVORERPQyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0hDRl9TVEFUSUMgaW50CitzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKQoreworUFJPVF9DTlRfSU5JCitpbnQJcmM7CisKKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX1NUUklPICk7CisJaWYgKCAoIHJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ICkgPT0gSENGX1NVQ0NFU1MgKSB7CQkJCQkJCQkJCS8qMiovCisJCU9QVyggSFJFR19TRUxFQ1RfMSwgZmlkICk7CQkJCQkJCQkJCQkJCQkJCS8qNCovCisJCU9QVyggSFJFR19PRkZTRVRfMSwgb2Zmc2V0ICk7CisJCWlmICggdHlwZSA9PSBJT19JTiApIHsKKwkJCWlmYnAtPklGQl9DYXJyeUluID0gMDsKKwkJfQorCQllbHNlIGlmYnAtPklGQl9DYXJyeU91dCA9IDA7CisJCUhDRl9XQUlUX1dISUxFKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSENNRF9CVVNZICk7CisJCUhDRkFTU0VSVCggISggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhSRUdfT0ZGU0VUX0VSUiApLCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICkJCQkvKjgqLworCQlpZiAoIHByb3RfY250ID09IDAgKSB7CisJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggZmlkLCBvZmZzZXQgKSApCisJCQlyYyA9IGlmYnAtPklGQl9EZWZ1bmN0U3RhdCA9IEhDRl9FUlJfREVGVU5DVF9USU1FX09VVDsKKwkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfREVGVU5DVDsKKwkJfQorCX0KKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX1NUUklPIHwgSENGX1RSQUNFX0VYSVQgKTsKKwlyZXR1cm4gcmM7Cit9IC8vIHNldHVwX2JhcAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDU3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuaApAQCAtMCwwICsxLDQwNSBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgSENGX0gKKyNkZWZpbmUgSENGX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZJTEUJIDogaGNmLmgKKyoKKyogREFURSAgIDogJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS43ICQKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTkgMDc6MjY6MDEgICAgUmV2aXNpb246IDEuNTYgICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA1LzEyIDA4OjQ3OjIzICAgIFJldmlzaW9uOiAxLjUzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjQ2ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjQ1ICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wNCAxMTowMzozOCAgICBSZXZpc2lvbjogMS4zNyAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAyIDE0OjUxOjIxICAgIFJldmlzaW9uOiAxLjM1ICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6IDIwMDQvMDIvMjQgMTM6MDA6MjggICAgUmV2aXNpb246IDEuMjggICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMi8wOSAxNDo1MDoxNCAgICBSZXZpc2lvbjogMS4yNiAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisqCisqIEFVVEhPUiA6IE5pY28gVmFsc3RlcgorKgorKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLi4uCisqCisqIERFU0MgICA6IERlZmluaXRpb25zIGFuZCBQcm90b3R5cGVzIGZvciBNU0YgYXMgd2VsbCBhcyBIQ0Ygc291cmNlcworKgorKgkJICAgQ3VzdG9taXphYmxlIHZpYSBIQ0ZDRkcuSAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgImhjZmNmZy5oIgkvLyBTeXN0ZW0gQ29uc3RhbnRzIHRvIGJlIGRlZmluZWQgYnkgdGhlIE1TRi1wcm9ncmFtbWVyIHRvIHRhaWxvciB0aGUgSENGCisjaW5jbHVkZSAibWRkLmgiCS8vIEluY2x1ZGUgZmlsZSBjb21tb24gZm9yIEhDRiwgTVNGCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTUFDUk9TICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExPRih4KSAJCQkoc2l6ZW9mKHgpL3NpemVvZihoY2ZfMTYpLTEpCisKKy8qCUVuZGlhbmVzcworICoJTGl0dGxlIEVuZGlhbiAoYS5rLmEuIEludGVsKSwgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAorICoJQmlnIEVuZGlhbiAoYS5rLmEuIE1vdG9yb2xhKSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisgKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHN1cHBsaWVkCisgKiAgbyBDTlZfTElUVExFX1RPX1NIT1JUKHcpCQkJaW50ZXJwcmV0cyB0aGUgMTYtYml0cyBpbnB1dCB2YWx1ZSBhcyBMaXR0bGUgRW5kaWFuLCByZXR1cm5zIGFuIGhjZl8xNgorICogCW8gQ05WX0JJR19UT19TSE9SVCh3KQkJCQlpbnRlcnByZXRzIHRoZSAxNi1iaXRzIGlucHV0IHZhbHVlIGFzIEJpZyBFbmRpYW4sIHJldHVybnMgYW4gaGNmXzE2CisgKgorICovCisKKy8qIFRvIGluY3JlYXNlIHBvcnRhYmlsaXR5LCB1c2UgdW5zaWduZWQgY2hhciBhbmQgdW5zaWduZWQgY2hhciAqIHdoZW4gYWNjZXNzaW5nIHBhcnRzIG9mIGxhcmdlcgorICogdHlwZXMgdG8gY29udmVydCB0aGVpciBFbmRpYW5lc3MKKyAqLworCisjZGVmaW5lIENOVl9FTkRfU0hPUlQodykgIChoY2ZfMTYpKCAoKGhjZl8xNikodykgJiAweDAwRkYpIDw8IDggfCAoKGhjZl8xNikodykgJiAweEZGMDApID4+IDggKQorI2RlZmluZSBDTlZfRU5EX0xPTkcoZHcpICAoaGNmXzMyKSggKGR3ID4+IDI0KSB8ICgoZHcgPj4gOCkgJiAweGZmMDApIHwgKChkdyA8PCA4KSAmIDB4ZmYwMDAwKSB8IChkdyA8PCAyNCkgKQorCisjaWYgSENGX0JJR19FTkRJQU4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQiBJIEcgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fU0hPUlQodykJQ05WX0VORF9TSE9SVCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19TSE9SVCh3KQkJKHcpCQkJCS8vIG5vIGVuZGlhbmVzcyBjb252ZXJzaW9uIG5lZWRlZAorI2RlZmluZSBDTlZfTElUVExFX1RPX0xPTkcoZHcpCUNOVl9FTkRfTE9ORyhkdykKKyNkZWZpbmUgQ05WX0xPTkdfVE9fTElUVExFKGR3KQlDTlZfRU5EX0xPTkcoZHcpCisjZWxzZQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTCBJIFQgVCBMIEUgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fU0hPUlQodykgCSh3KQkJCQkvLyBubyBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19TSE9SVCh3KQkJQ05WX0VORF9TSE9SVCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19MT05HKGR3KQkoZHcpCisjZGVmaW5lIENOVl9MT05HX1RPX0xJVFRMRShkdykJKGR3KQorCisjaWYgZGVmaW5lZCBIQ0ZfQUxJR04gJiYgSENGX0FMSUdOID4gMQorI2RlZmluZSBDTlZfU0hPUlRQX1RPX0xJVFRMRShwdykJKChoY2ZfMTYpKCooaGNmXzggKilwdykpIAkJCXwgKChoY2ZfMTYpKCooKGhjZl84ICopcHcrMSkpIDw8IDgpCisjZGVmaW5lIENOVl9MT05HUF9UT19MSVRUTEUocGR3KQkoKGhjZl8zMikoKihoY2ZfOCAqKXBkdykpIAkJCXwgKChoY2ZfMzIpKCooKGhjZl84ICopcGR3KzEpKSA8PCA4KSAJfCBcCisJCQkJCQkJCQkoKGhjZl8zMikoKigoaGNmXzggKilwZHcrMikpIDw8IDE2KSB8ICgoaGNmXzMyKSgqKChoY2ZfOCAqKXBkdyszKSkgPDwgMjQpCisjZWxzZQorI2RlZmluZSBDTlZfTE9OR1BfVE9fTElUVExFKHBkdykJKCooaGNmXzMyICopcGR3KQorI2RlZmluZSBDTlZfU0hPUlRQX1RPX0xJVFRMRShwdykJKCooaGNmXzE2ICopcHcpCisjZW5kaWYKKworI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisKKy8vIGNvbnZlcnNpb24gbWFjcm9zIHdoaWNoIGNhbiBiZSBleHByZXNzZWQgaW4gb3RoZXIgbWFjcm9zCisjZGVmaW5lIENOVl9TSE9SVF9UT19MSVRUTEUodykJQ05WX0xJVFRMRV9UT19TSE9SVCh3KQorI2RlZmluZSBDTlZfU0hPUlRfVE9fQklHKHcpCQlDTlZfQklHX1RPX1NIT1JUKHcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEVORCBPRiBNQUNST1MgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBvZmZzZXRzIFRyYW5zbWl0L1JlY2VpdmUgRnJhbWUgU3RydWN0dXJlCisjZGVmaW5lIEhGU19TVEFUCQkJCTB4MDAwMAorI2RlZmluZSBIRlNfU1dTVVAJCQkJMHgwMDA2CQkJCQkvL1NXIFN1cHBvcnQKKyNkZWZpbmUgSEZTX1FfSU5GTwkJCQkweDAwMDYJCQkJCS8vU2lnbmFsL1NpbGVuY2UgbGV2ZWwKKyNkZWZpbmUgSEZTX1JBVEUJCQkJMHgwMDA4CQkJCQkvL1J4Rmxvdy9SYXRlCisjZGVmaW5lIAlIRlNfU1RBVF9FUlIJCVJYX1NUQVRfRVJSCQkJCS8vbGluayAibmF0dXJhbCIgSENGIG5hbWUgdG8gIm5hdHVyYWwiIE1TRiBuYW1lCisjZGVmaW5lIEhGU19UWF9DTlRMCQkJCTB4MDAzNgorCQkJCQkJCQkJCQkJCQkvLyBILUkgICAgIEgtSUkKKyNkZWZpbmUgSEZTX0RBVF9MRU4JCQkJKEhGU19BRERSX0RFU1QgLSAyKQkJLy8gMHgwMDJDICAweDAwMzgKKyNkZWZpbmUgSEZTX0FERFJfREVTVAkJCTB4MDAzQQkJCQkJLy8gMHgwMDJFICAweDAwM0EKKyNkZWZpbmUgSEZTX0FERFJfU1JDCQkJKEhGU19BRERSX0RFU1QgKyA2KQkJLy8gMHgwMDM0ICAweDAwNDAKKyNkZWZpbmUgSEZTX0xFTgkJCQkJKEhGU19BRERSX1NSQyAgKyA2KQkJLy8gMHgwMDNBICAweDAwNDYKKyNkZWZpbmUgSEZTX0RBVAkJCQkJKEhGU19MRU4gICAgICAgKyAyKQkJLy8gMHgwMDNDICAweDAwNDgKKyNkZWZpbmUgSEZTX1RZUEUJCQkJKEhGU19EQVQgICAgICAgKyA2KQkJLy8gMHgwMDQyICAweDAwNEUKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICBEIEUgUyBDIFIgSSBQIFQgTyBSICAgUyBUIFIgVSBDIFQgVSBSIEUgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy87P01ERC5IIHN0dWZmIDs/CisKKyNpZiBIQ0ZfQklHX0VORElBTgorI2RlZmluZSBERVNDX1NUUkNUX0NOVAkJMAorI2RlZmluZSBERVNDX1NUUkNUX1NJWkUJCTEKKyNlbHNlCisjZGVmaW5lIERFU0NfU1RSQ1RfQ05UCQkxCisjZGVmaW5lIERFU0NfU1RSQ1RfU0laRQkJMAorI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCisKKyNkZWZpbmUJQlVGX0NOVAkJCQlidWZfZGltW0RFU0NfU1RSQ1RfQ05UXQorI2RlZmluZQlCVUZfU0laRQkJCWJ1Zl9kaW1bREVTQ19TVFJDVF9TSVpFXQorCit0eXBlZGVmIHN0cnVjdCBERVNDX1NUUkNUIHsKKwloY2ZfMTYJCQkJCWJ1Zl9kaW1bMl07CisJaGNmXzMyCQkJCQlidWZfcGh5c19hZGRyOworCWhjZl8zMgkJCQkJbmV4dF9kZXNjX3BoeXNfYWRkcjsJLy8gcGh5c2ljYWwgYWRkcmVzcyBvZiBuZXh0IGRlc2NyaXB0b3IKKwloY2ZfMzIJCQkJCWRlc2NfcGh5c19hZGRyOwkJCS8vIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBkZXNjcmlwdG9yCisJc3RydWN0IERFU0NfU1RSQ1QgCQkqbmV4dF9kZXNjX2FkZHI7CisJaGNmXzgJRkFSCQkJCSpidWZfYWRkcjsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0RFU0NfU1RSQ1QKKwl2b2lkIEZBUgkJCSAgICpERVNDX01TRlN1cDsJCQkvLyBwb2ludGVyIGZvciBhcmJpdHJhcnkgdXNlIGJ5IHRoZSBNU0YKKyNlbmRpZiAvLyBIQ0ZfREVTQ19TVFJDVF9FWFQKK30gREVTQ19TVFJDVDsKKworI2RlZmluZSBIQ0ZfREFTQV9TSVpFCQkJMTIJCQkJCQkJLy9zaXplIGluIGJ5dGVzIGZvciBEQS9TQQorCisjZGVmaW5lIERFU0NfQ05UX01BU0sgCQkJMHgwRkZGCisKKyNkZWZpbmUgR0VUX0JVRl9TSVpFKGRlc2NwKSAgICAgICAoKGRlc2NwKS0+QlVGX1NJWkUpCisjZGVmaW5lIEdFVF9CVUZfQ05UKGRlc2NwKSAgICAgICAgKChkZXNjcCktPkJVRl9DTlQpCisjZGVmaW5lIFNFVF9CVUZfU0laRShkZXNjcCwgc2l6ZSkgKGRlc2NwKS0+QlVGX1NJWkUgPSBzaXplOworI2RlZmluZSBTRVRfQlVGX0NOVChkZXNjcCwgY291bnQpIChkZXNjcCktPkJVRl9DTlQgPSBjb3VudDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgVCBBIEwgTCBJIEUgUyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3R5cGVkZWYgc3RydWN0ICB7ICAvL0hlcm1lcyBUYWxsaWVzIChJRkIgc3Vic3RydWN0dXJlKQorICBoY2ZfMzIJVHhVbmljYXN0RnJhbWVzOworICBoY2ZfMzIJVHhNdWx0aWNhc3RGcmFtZXM7CisgIGhjZl8zMglUeEZyYWdtZW50czsKKyAgaGNmXzMyCVR4VW5pY2FzdE9jdGV0czsKKyAgaGNmXzMyCVR4TXVsdGljYXN0T2N0ZXRzOworICBoY2ZfMzIJVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisgIGhjZl8zMglUeFNpbmdsZVJldHJ5RnJhbWVzOworICBoY2ZfMzIJVHhNdWx0aXBsZVJldHJ5RnJhbWVzOworICBoY2ZfMzIJVHhSZXRyeUxpbWl0RXhjZWVkZWQ7CisgIGhjZl8zMglUeERpc2NhcmRzOworICBoY2ZfMzIJUnhVbmljYXN0RnJhbWVzOworICBoY2ZfMzIJUnhNdWx0aWNhc3RGcmFtZXM7CisgIGhjZl8zMglSeEZyYWdtZW50czsKKyAgaGNmXzMyCVJ4VW5pY2FzdE9jdGV0czsKKyAgaGNmXzMyCVJ4TXVsdGljYXN0T2N0ZXRzOworICBoY2ZfMzIJUnhGQ1NFcnJvcnM7CisgIGhjZl8zMglSeERpc2NhcmRzTm9CdWZmZXI7CisgIGhjZl8zMglUeERpc2NhcmRzV3JvbmdTQTsKKyAgaGNmXzMyCVJ4V0VQVW5kZWNyeXB0YWJsZTsKKyAgaGNmXzMyCVJ4TXNnSW5Nc2dGcmFnbWVudHM7CisgIGhjZl8zMglSeE1zZ0luQmFkTXNnRnJhZ21lbnRzOworICBoY2ZfMzIJUnhEaXNjYXJkc1dFUElDVkVycm9yOworICBoY2ZfMzIJUnhEaXNjYXJkc1dFUEV4Y2x1ZGVkOworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVEFMTElFU19GVworICBoY2ZfMzIJVGFsbGllc0V4dHJhWzMyXTsKKyNlbmRpZiAvLyBIQ0ZfRVhUX1RBTExJRVNfRlcKK30gQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUOworCit0eXBlZGVmIHN0cnVjdCAgeyAgLy9IQ0YgVGFsbGllcyAoSUZCIHN1YnN0cnVjdHVyZSkKKyAgaGNmXzMyCU5vQnVmSW5mbzsgIAkJCQkvL05vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIHVuc29saWNpdGVkIE5vdGlmeSBmcmFtZQorICBoY2ZfMzIJTm9CdWZNQjsJCQkJCS8vTm8gc3BhY2UgYXZhaWxhYmxlIGluIE1haWxCb3gKKyAgaGNmXzMyCU1pc2NFcnI7CQkJCQkvKiBDb21tYW5kIGVycm9ycworICAJCQkJCQkJCQkJICogIC0gdGltZSBvdXQgb24gY29tcGxldGlvbiBzeW5jaHJvbm91cyBwYXJ0IEhlcm1lcyBDb21tYW5kCisgIAkJCQkJCQkJCQkgKiAgLSBjb21wbGV0ZWQgSGVybWVzIENvbW1hbmQgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBjb21tYW5kCisgIAkJCQkJCQkJCQkgKiAgLSBzdGF0dXMgb2YgY29tcGxldGVkIEhlcm1lcyBDb21tYW5kIGNvbnRhaW5zIGVycm9yIGJpdHMKKyAgCQkJCQkJCQkJCSAqLworI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfVEFMTElFU19GVworICBoY2ZfMzIJRW5nQ250WzhdOworI2VuZGlmIC8vIEhDRl9FWFRfVEFMTElFU19GVworfSBDRkdfSENGX1RBTExJRVNfU1RSQ1Q7CisKKy8vTm90ZSB0aGlzIHdheSB0byBkZWZpbmUgLi4uX1RBTF9DTlQgaW1wbGllcyB0aGF0IGFsbCB0YWxsaWVzIG11c3Qga2VlcCB0aGUgc2FtZSAoaGNmXzMyKSBzaXplCisjaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCS8vSGVybWVzIHRhbGx5IHN1cHBvcnQKKyNkZWZpbmUJCUhDRl9OSUNfVEFMX0NOVAkoc2l6ZW9mKENGR19IRVJNRVNfVEFMTElFU19TVFJDVCkvIHNpemVvZihoY2ZfMzIpKQorI2Vsc2UKKyNkZWZpbmUJCUhDRl9OSUNfVEFMX0NOVAkwCisjZW5kaWYgLy8gSENGX1RBTExJRVMKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfSENGCS8vSENGIHRhbGx5IHN1cHBvcnQKKyNkZWZpbmUJCUhDRl9IQ0ZfVEFMX0NOVAkoc2l6ZW9mKENGR19IQ0ZfVEFMTElFU19TVFJDVCkgICAvIHNpemVvZihoY2ZfMzIpKQorI2Vsc2UKKyNkZWZpbmUJCUhDRl9IQ0ZfVEFMX0NOVAkwCisjZW5kaWYgLy8gSENGX1RBTExJRVMKKyNkZWZpbmUgSENGX1RPVF9UQUxfQ05UICggSENGX05JQ19UQUxfQ05UICsgSENGX05JQ19UQUxfQ05UICkKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJIE4gVCBFIFIgRiBBIEMgRSAgIEIgTCBPIEMgSyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUZCX1ZFUlNJT04gMHgwRQkgCQkJLy8gaW5pdGlhbGx5IDAsIHRvIGJlIGluY3JlbWVudGVkIGJ5IGV2ZXJ5IElGQiBsYXlvdXQgY2hhbmdlCisKK3R5cGVkZWYgc3RydWN0ICB7CisgIGhjZl9pbwkJSUZCX0lPQmFzZTsJCQkJLy8gSS9PIGFkZHJlc3Mgb2YgSGVybWVzIGNoaXAgYXMgcGFzc2VkIGJ5IE1TRiBhdCBoY2ZfY29ubmVjdCBjYWxsCisgIGhjZl8xNgkJSUZCX0lPUmFuZ2U7CQkJLy8gSS9PIFJhbmdlIHVzZWQgYnkgSGVybWVzIGNoaXAKKyAgaGNmXzE2CQlJRkJfRExNb2RlOwkJCQkvLyBEb3dubG9hZCBNb2RlIHN0YXRlCisgIGhjZl8xNgkJSUZCX0NtZDsJCQkJLy8gY21kIGluIHByb2dyZXNzIGZsYWcsIHRvIGJlIGFjay1lZCBiZWZvcmUgbmV4dCBjbWQgY2FuIGJlIGlzc3VlZAorICBoY2ZfMTYJCUlGQl9SeEZJRDsJCQkJLy8gRklEIG9mICJjdXJyZW50IiBSeEZTIChub24tRE1BIG1vZGUpCisvLzs/I2lmIHR4X2RlbGF5IG9wdGlvbgorICBoY2ZfMTYJCUlGQl9UeEZJRDsJCQkJLy8gZmlkIHN0b3JhZ2UgZHVyaW5nICJkZWxheWVkIiBzZW5kCisvLzs/I2VuZGlmIHR4X2RlbGF5IG9wdGlvbgorICBoY2ZfMTYJCUlGQl9SeExlbjsJCQkJLy8KKyAgaGNmXzE2CQlJRkJfRGVmdW5jdFN0YXQ7CQkvLyBCQVAgaW5pdGlhbGl6YXRpb24gb3IgQ21kIENvbXBsZXRpb24gZmFpbGVkCisgIGhjZl8xNgkJSUZCX0VyckNtZDsJCQkJLy8gY29udGVudHMgU3RhdHVzIHJlZyB3aGVuIGVycm9yIGJpdHMgYW5kL29yIG1pc21hdGNoIGluIGNtZF93YWl0CisgIGhjZl8xNgkJSUZCX0VyclF1YWxpZmllcjsJCS8vIGNvbnRlbnRzIFJlc3AwICByZWcgd2hlbiBlcnJvciBiaXRzIGFuZC9vciBtaXNtYXRjaCBpbiBjbWRfd2FpdAorICBoY2ZfMTYJCUlGQl9sYWw7CQkJCS8vIExvb2tBaGVhZCBMZW5ndGgKKyAgd2NpX2J1ZnAJCUlGQl9sYXA7CQkJCS8vIExvb2tBaGVhZCBCdWZmZXIgcG9pbnRlcgorICBoY2ZfMTYJCUlGQl9MaW5rU3RhdDsJCQkvLyBMaW5rIFN0YXR1cworICBoY2ZfMTYJCUlGQl9EU0xpbmtTdGF0OwkJCS8vIExpbmsgU3RhdHVzLCBuZXcgc3RyYXRlZ3kgaW50cm9kdWNlZCBmb3IgRGVlcFNsZWVwCisgIGhjZl8xNgkJSUZCX0NhcnJ5SW47CQkJLy8gY2FycnkgYW5kIGNhcnJ5LWZsYWcgdG8gbW92ZSAxIGJ5dGUgZnJvbSBvbmUgZ2V0X2ZyYWcgdG8gdGhlIG5leHQKKyAgaGNmXzE2CQlJRkJfQ2FycnlPdXQ7CQkJLy8gY2FycnkgYW5kIGNhcnJ5LWZsYWcgdG8gbW92ZSAxIGJ5dGUgZnJvbSBvbmUgcHV0X2ZyYWcgdG8gdGhlIG5leHQKKyAgaGNmXzE2CQlJRkJfVmVyc2lvbjsJCQkvLyBJRkJfVkVSU0lPTiwgaW5jcmVtZW50ZWQgYnkgZXZlcnkgU0lHTklGSUNBTlQgSUZCIGxheW91dCBjaGFuZ2UKKyAgaGNmXzE2CQlJRkJfQ2FyZFN0YXQ7CQkJLy8gTklDIGVycm9yIC8gRi9XIGluY29tcGF0aWJpbGl0eSBzdGF0dXMKKyAgaGNmXzE2ICAJCUlGQl9Sc2NJbmQ7CQkJCS8vIG5vbi1ETUE6IFR4RklEIGF2YWlsYWJsZSwgRE1BOiBhbHdheXMgMQorICBoY2ZfMTYJCUlGQl9DbnRsT3B0OwkJCS8vIGZsYWdzOiAzMiBiaXRzIEkvTywgRE1BIGF2YWlsYWJsZSwgRE1BIGVuYWJsZWQKKyAgaGNmXzE2CQlJRkJfQnVzVHlwZTsJCQkvLyBCdXNUeXBlLCBkZXJpdmVkIHZpYSBDRkdfTklDX0JVU19UWVBFCisgIENGR19GV19JREVOVElUWV9TVFJDVAkgSUZCX0ZXSWRlbnRpdHk7IC8qIGtlZXAgRldJZGVudGl0eS9TdXAgYW5kIFBSSUlkZW50aXR5L1N1cCBpbiBzZXF1ZW5jZQorCQkJCQkJCQkJCSAgKiBiZWNhdXNlIG9mIHRoZSAoZHVtYikgY29weSBpbiBpbml0KCkgKi8KKyNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKyAgQ0ZHX1NVUF9SQU5HRV9TVFJDVAkgSUZCX0ZXU3VwOworICBDRkdfUFJJX0lERU5USVRZX1NUUkNUIElGQl9QUklJZGVudGl0eTsKKyAgQ0ZHX1NVUF9SQU5HRV9TVFJDVAkgSUZCX1BSSVN1cDsKKyAgQ0ZHX1NVUF9SQU5HRV9TVFJDVAkgSUZCX0hTSVN1cDsKKyNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lECisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRworICBSSURfTE9HUAkJSUZCX1JJRExvZ3A7CQkJLy8gcG9pbnRlciB0byBSSURfTE9HIHN0cnVjdHVyZQorI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKKyNpZiBIQ0ZfUFJPVF9USU1FCisgIGhjZl8zMgkgCUlGQl9UaWNrSW5pOwkJCS8vIGluaXRpYWxpemF0aW9uIG9mIFMvVyBjb3VudGVyIGJhc2VkIHByb3RlY3Rpb24gbG9vcAorI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLCisgIGludAkJCUlGQl9UaWNrQ250OwkJCS8vIEhlcm1lcyBUaW1lciBUaWNrIENvdW50ZXIKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9NQgorICBoY2ZfMTYgCSAgICpJRkJfTUJwOwkJCQkvLyBwb2ludGVyIHRvIHRoZSBNYWlsQm94CisgIGhjZl8xNgkJSUZCX01CU2l6ZTsJCQkJLy8gc2l6ZSBvZiB0aGUgTWFpbEJveAorICBoY2ZfMTYJCUlGQl9NQldwOwkJCQkvLyB6ZXJvLWJhc2VkIHdyaXRlIGluZGV4IGludG8gdGhlIE1haWxCb3gKKyAgaGNmXzE2CQlJRkJfTUJScDsJCQkJLy8gemVyby1iYXNlZCByZWFkICBpbmRleCBpbnRvIHRoZSBNYWlsQm94CisgIGhjZl8xNgkJSUZCX01CSW5mb0xlbjsJCQkvLyBjb250ZW50cyBvZiBMLWZpZWxkIG9mIHRoZSBvbGRlc3QgYXZhaWxhYmxlIE1haWxCb3hJbmZvQmxvY2sKKyNlbmRpZiAvLyBIQ0ZfRVhUX01CCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorICBoY2ZfMTYJCUlGQl9NSUNUeENudGw7CQkJLy8gTUlDIGJpdCBhbmQgS2V5IGluZGV4IGluIFR4Q29udHJvbCBmaWVsZCBvZiBUeEZTCisgIGhjZl8zMgkJSUZCX01JQ1R4S2V5WzJdOwkJLy8gY2FsY3VsYXRpbmcga2V5CisgIGhjZl8zMgkJSUZCX01JQ1R4WzJdOyAgIAkgIAkvLyBUeCBNSUMgY2FsY3VsYXRpb24gRW5naW5lIHN0YXRlCisgIGhjZl8xNgkJSUZCX01JQ1R4Q2Fycnk7CQkJLy8gdGVtcCBsZW5ndGgsIGNhcnJpZXMgb3ZlciBmcm9tIG9uZSBUeCBmcmFnbWVudCB0byBhbm90aGVyCisgIGhjZl8xNgkJSUZCX01JQ1J4Q2Fycnk7CQkJLy8gdGVtcCBsZW5ndGgsIGNhcnJpZXMgb3ZlciBmcm9tIG9uZSBSeCBmcmFnbWVudCB0byBhbm90aGVyCisgIGhjZl8zMgkJSUZCX01JQ1J4S2V5WzQqMl07CQkvLyA0IGNoZWNraW5nIGtleXMKKyAgaGNmXzMyCQlJRkJfTUlDUnhbMl07IAkgCQkvLyBSeCBNSUMgY2FsY3VsYXRpb24gRW5naW5lIHN0YXRlCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisjaWYgSENGX0FTU0VSVAorI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIKKyAgQ0ZHX01CX0lORk9fUkFOR0UxX1NUUkNUCUlGQl9Bc3NlcnRTdHJjdDsgLy8gQWRkIHNvbWUgY29tcGxpY2F0aW9uIHRvIHRoZSBIQ0YgYXMgcHJpemUgZm9yIHRoZSBuZXcgTVNGIEkvRgorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTUIKKyAgCQkJCQkJCQkJCS8vIHRhcmdldCBvZiBhYm92ZSBJRkJfQXNzZXJ0U3RyY3QKKyAgaGNmXzE2CQlJRkJfQXNzZXJ0TGluZTsJCQkvLyAgLSBsaW5lIG51bWJlciAoICsgZW5jb2RlZCBtb2R1bGUgbmFtZSApCisgIGhjZl8xNgkJSUZCX0Fzc2VydFRyYWNlOwkJLy8gIC0gYml0IGJhc2VkIHRyYWNlIG9mIGFsbCBoY2ZfLi4uLiBpbnZvY2F0aW9ucworICBoY2ZfMzIJCUlGQl9Bc3NlcnRRdWFsaWZpZXI7CS8vICAtIHF1YWxpZmllcgorICBoY2ZfMTYJCUlGQl9Bc3NlcnRMdmw7CQkJLy8gQXNzZXJ0IEZpbHRlcmluZywgTm90IHlldCBpbXBsZW1lbnRlZAorICBoY2ZfMTYJCUlGQl9Bc3NlcnRXaGVyZTsJCS8vIFdoZXJlIHBhcmFtZXRlciBvZiB0aGUgQXNzZXJ0IG1hY3JvCisjaWYgKEhDRl9BU1NFUlQpICYgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROICkKKyAgTVNGX0FTU0VSVF9SVE5QCUlGQl9Bc3NlcnRSdG47CQkvLyBNU0YgQXNzZXJ0IENhbGwgYmFjayByb3V0aW5lIChpbnNwaXJlZCBieSBHRUYsIERyRG9iYnMgTm92IDE5OTggKQorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgkvLyBlbmdpbmVlcmluZyBmYWNpbHR5IGludGVuZGVkIGFzIEYvVyBkZWJ1Z2dpbmcgYWlkCisgICBoY2ZfMTYgICAgICAgSUZCX0RiZ1ByaW50Rl9DbnQ7CisgICBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVCBJRkJfRndQZkJ1ZmY7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisjaWYgISBkZWZpbmVkIEhDRl9JTlRfT0ZGCisgIGhjZl8xNiB2b2xhdGlsZSBJRkJfSW50T2ZmQ250OwkJLy8gMHhGRkZGIGJhc2VkIEhDRl9BQ1RfSU5UX09GRiBuZXN0aW5nIGNvdW50ZXIsIERlZXBTbGVlcCBmbGFnCisjZW5kaWYgLy8gSENGX0lOVF9PRkYKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisgIGhjZl8xNiAgICAgICAgIElGQl9DS0lQU3RhdDsJCQkvLyBDS0lQIFN0YXR1cyBmbGFnCisjZW5kaWYgLy8gSENGX1RZUEVfQ0NYCisjaWYgKEhDRl9UQUxMSUVTKSAmICggSENGX1RBTExJRVNfTklDIHwgSENGX1RBTExJRVNfSENGICkJLy9IZXJtZXMgYW5kL29yIEhDRiB0YWxseSBzdXBwb3J0CisgIGhjZl8zMgkJSUZCX1NpbGx5X3lvdV9zaG91bGRfYWxpZ247CS8vOz8KKyAgaGNmXzE2CQlJRkJfVGFsbHlMZW47CQkJLy8gVGFsbHkgbGVuZ3RoICh0byBidWlsZCBhbiBMVFYpCisgIGhjZl8xNgkJSUZCX1RhbGx5VHlwOwkJCS8vIFRhbGx5IFR5cGUgKHRvIGJ1aWxkIGFuIExUVikKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKKyNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCQkvL0hlcm1lcyB0YWxseSBzdXBwb3J0CisgIENGR19IRVJNRVNfVEFMTElFU19TVFJDVAlJRkJfTklDX1RhbGxpZXM7CisjZW5kaWYgLy8gSENGX1RBTExJRVNfTklDCisjaWYgKEhDRl9UQUxMSUVTKSAmIEhDRl9UQUxMSUVTX0hDRgkJLy9IQ0YgdGFsbHkgc3VwcG9ydAorICBDRkdfSENGX1RBTExJRVNfU1RSQ1QJCUlGQl9IQ0ZfVGFsbGllczsKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19IQ0YKKyNpZiBIQ0ZfRE1BCisgIC8vdXNlZCBmb3IgYSBwb29sIG9mIGRlc3RpbmF0aW9uX2FkZHJlc3MgZGVzY3JpcHRvci9idWZmZXJzLCB1c2VkIGR1cmluZyB0eCBlbmNhcHN1bGF0aW9uIHBvaW50cyB0byB0aGUKKyAgLy9maXJzdC9sYXN0IGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgY2hhaW4sIHNvIHdlIGNhbiBlYXNpbHkgcmVtb3ZlIGFuZCBhcHBlbmQgYSBwYWNrZXQuCisgIERFU0NfU1RSQ1QJKklGQl9GaXJzdERlc2NbMl07CisgIERFU0NfU1RSQ1QJKklGQl9MYXN0RGVzY1syXTsKKyAgREVTQ19TVFJDVAkqSUZCX0NvbmZpbmVkRGVzY1syXTsJLy8gcG9pbnRlcnMgdG8gZGVzY3JpcHRvciB1c2VkIGZvciBob3N0IHJlY2xhaW0gcHVycG9zZXMuCisgIGhjZl8xNgkJSUZCX0RtYVBhY2tldHM7CQkJLy8gSFJFR19FVl9bVFgvUlhdRE1BX0RPTkUgZmxhZ3MsIHJlcG9ydHMgRE1BIEZyYW1lIGF2YWlsYWJpbGl0eSB0byBNU0YKKyNlbmRpZiAvLyBIQ0ZfRE1BCisjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTlRfVFhfRVgKKyAgaGNmXzE2CQlJRkJfVHhGc1N0YXQ7CQkJLy8gVHggbWVzc2FnZSBtb25pdG9yaW5nCisgIGhjZl8xNgkJSUZCX1R4RnNHYXBbMl07CQkJLy87P21ha2UgdGhpcyByb2J1c3QKKyAgaGNmXzE2CQlJRkJfVHhGc1N3U3VwOworI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RYX0VYCisgIGhjZl8xNgkJSUZCX01hZ2ljOwkJCQkvKiAiTWFnaWMiIHNpZ25hdHVyZSwgdG8gaGVscCB0aGUgZGVidWdnZXIgaW50ZXJwcmV0IGEgbWVtb3J5IGR1bXAKKwkJCQkJCQkJCQkgKiBhbHNvIHRoZSBsYXN0IGZpZWxkIGNsZWFyZWQgYXQgaGNmX2Nvbm5lY3QKKwkJCQkJCQkJCQkgKi8KKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lGQl9TVFJDVAkJLy8gZm9yIHVzYWdlIGJ5IHRoZSBNU0YKKyAgdm9pZCBGQVIJICAgKklGQl9NU0ZTdXA7CQkJCS8vIHBvaW50ZXIgZm9yIGFyYml0cmFyeSB1c2UgYnkgdGhlIE1TRgorI2VuZGlmIC8vIEhDRl9FWFRfSUZCX1NUUkNUX0VYVAorfSBJRkJfU1RSQ1Q7CisKK3R5cGVkZWYgSUZCX1NUUkNUKglJRkJQOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqICAgVyBDIEkgICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgUCBSIE8gVCBPIFQgWSBQIEUgUyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRVhURVJOX0MgaW50CQkgaGNmX2FjdGlvbgkJCShJRkJQIGlmYnAsIGhjZl8xNiBjbWQgKTsKK0VYVEVSTl9DIGludAkJIGhjZl9jb25uZWN0CQkoSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApOworI2lmIChIQ0ZfRU5DQVApICYgSENGX0VOQ19TVVAKK0VYVEVSTl9DIGhjZl84IAkJIGhjZl9lbmNhcAkJCSh3Y2lfYnVmcCB0eXBlICk7CisjZW5kaWYgLy8gSENGX0VOQ19TVVAKK0VYVEVSTl9DIGludAkJIGhjZl9nZXRfaW5mbwkJKElGQlAgaWZicCwgTFRWUCBsdHZwICk7CitFWFRFUk5fQyBpbnQJCSBoY2Zfc2VydmljZV9uaWMJKElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgdW5zaWduZWQgaW50IGxlbiApOworRVhURVJOX0MgaW50CQkgaGNmX2NudGwJCQkoSUZCUCBpZmJwLCBoY2ZfMTYgY21kICk7CitFWFRFUk5fQyBpbnQJCSBoY2ZfcHV0X2luZm8JCShJRkJQIGlmYnAsIExUVlAgbHR2cCApOworRVhURVJOX0MgaW50CQkgaGNmX3Jjdl9tc2cJCShJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICk7CitFWFRFUk5fQyBpbnQJCSBoY2Zfc2VuZF9tc2cgICAgICAgKElGQlAgaWZicCwgREVTQ19TVFJDVCAqZHAsIGhjZl8xNiB0eF9jbnRsICk7CisjaWYgSENGX0RNQQorRVhURVJOX0Mgdm9pZAkJIGhjZl9kbWFfdHhfcHV0IAkoSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkLCBoY2ZfMTYgdHhfY250bCApOworRVhURVJOX0MgREVTQ19TVFJDVCogaGNmX2RtYV90eF9nZXQJCShJRkJQIGlmYnAgKTsKK0VYVEVSTl9DIERFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0CQkoSUZCUCBpZmJwICk7CitFWFRFUk5fQyB2b2lkCQkgaGNmX2RtYV9yeF9wdXQJCShJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmQgKTsKKyNlbmRpZiAvLyBIQ0ZfRE1BCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9MTktfTVNGX1JUTgorRVhURVJOX0Mgdm9pZAkJIG1zZl9hc3NlcnQJIAkJKHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzE2IHRyYWNlLCBoY2ZfMzIgcXVhbCApOworI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KKworI2VuZGlmICAvLyBIQ0ZfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZjZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDc1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZjZmcuaApAQCAtMCwwICsxLDIzNDQgQEAKKworLy8gICB2aW06dHc9MTEwOnRzPTQ6CisjaWZuZGVmIEhDRkNGR19ICisjZGVmaW5lIEhDRkNGR19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgOiBoY2ZjZmcudHBsIC8vIGhjZmNmZy5oCisqCisqIERBVEUgICA6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuNiAkCisqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE2ICAgIFJldmlzaW9uOiAxLjQwICAgICAgVGFnOiB0MjAwNDA0MDhfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMzggICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjM0ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDMgMTQ6MTA6MTIgICAgUmV2aXNpb246IDEuMzIgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAwOToyNzoxMiAgICBSZXZpc2lvbjogMS4zMCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI4ICAgIFJldmlzaW9uOiAxLjI1ICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDIvMTggMTc6MTM6NTcgICAgUmV2aXNpb246IDEuMjMgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgOiBOaWNvIFZhbHN0ZXIKKyoKKyogREVTQyAgIDogSENGIEN1c3RvbWl6YXRpb24gTWFjcm9zCisqIGhjZmNmZy50cGwgbGlzdCBhbGwgI2RlZmluZXMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpZWQgdG86CisqICAgYWRqdXN0IHRoZSBIQ0YgZnVuY3Rpb25zIGRlZmluZWQgaW4gSENGLkMgdG8gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIHNwZWNpZmljIGVudmlyb25tZW50CisqCQlvIG1heGltdW0gc2l6ZXMgZm9yIG1lc3NhZ2VzCisqCQlvIEVuZGlhbmVzcworKglDb21waWxlciBzcGVjaWZpYyBtYWNyb3MKKyoJCW8gcG9ydCBJL08gbWFjcm9zCisqCQlvIHR5cGUgZGVmaW5pdGlvbnMKKyoKKyogQnkgY29weWluZyBIQ0ZDRkcuVFBMIHRvIEhDRkNGRy5IIGFuZCAtaWYgbmVlZGVkLSBtb2RpZnlpbmcgdGhlICNkZWZpbmVzIHRoZSBXQ0kgZnVuY3Rpb25hbGl0eSBjYW4gYmUKKyogdGFpbG9yZWQKKyoKKyogU3VwcG9ydGVkIGVudmlyb25tZW50czoKKyogV1ZMQU5fNDEJTWluaXBvcnQJCQkJCQkJCU5ESVMgMy4xCisqIFdWTEFOXzQyCVBhY2tldAkJCQkJCQkJCU1pY3Jvc29mdCBWaXN1YWwgQyAxLjUKKyogV1ZMQU5fNDMJMTYgYml0cyBET1MgT0RJCQkJCQkJCU1pY3Jvc29mdCBWaXN1YWwgQyAxLjUKKyogV1ZMQU5fNDQJMzIgYml0cyBPREkgKF9fTkVUV0FSRV8zODZfXykJCQlXQVRDT00KKyogV1ZMQU5fNDUJTUFDX09TCQkJCQkJCQkJTVBXPywgU3ltYW50ZWM/CisqIFdWTEFOXzQ2CVdpbmRvd3MgQ0UgKF9XSU4zMl9XQ0UpCQkJCQlNaWNyb3NvZnQgPworKiBXVkxBTl80NwlMSU5VWCAgKF9fTElOVVhfXykJCQkJCQlHQ0MsIGRpc2NhcmRlZCwgYmFzZWQgb24gR1BMJ2VkIEhDRi1saWdodAorKiBXVkxBTl80OAlNaW5pcG9ydAkJCQkJCQkJTkRJUyA1CisqIFdWTEFOXzQ5CUxJTlVYICAoX19MSU5VWF9fKQkJCQkJCUdDQywgb3JpZ2luYWxseSBiYXNlZCBvbiBwcmUtY29tcGlsZWQgSENGX2xpYnJhcnkKKyogCQkJCQkJCQkJCQkJCW1pZ3JhdGVkIHRvIHVzZSB0aGUgSENGIHNvdXJjZXMgd2hlbiBMdWNlbnQgVGVjaG5vbG9naWVzCisqIAkJCQkJCQkJCQkJCQlicm91Z2h0IHRoZSBIQ0YgbW9kdWxlIHVuZGVyIEdQTAorKiBXVkxBTl81MQlNaW5pcG9ydCBVU0IJCQkJCQkJTkRJUyA1CisqIFdWTEFOXzUyCU1pbmlwb3J0CQkJCQkJCQlORElTIDQKKyogV1ZMQU5fNTMJVnhXb3JrcyBFTkQgU3RhdGlvbiBkcml2ZXIKKyogV1ZMQU5fNTQJVnhXb3JrcyBFTkQgQWNjZXNzIFBvaW50IGRyaXZlcgorKiBXVkxBTl84MQlXYXZlUG9pbnQJCQkJCQkJCUJPUkxBTkQgQworKiBXQ0lUU1QJSW5ob3VzZSB0ZXN0IHRvb2wJCQkJCQlNaWNyb3NvZnQgVmlzdWFsIEMgMS41CisqIFdTVQkJV2F2ZUxBTiBTdGF0aW9uIFVwZGF0ZQkJCQkJTWljcm9zb2Z0IFZpc3VhbCBDID8/CisqIFNDTyBVTklYCW5vdCB5ZXQgYWN0dWFsbHkgdXNlZCA/CQkJCQk/CisqIF9fcHBjCQlPRU0gc3VwcGxpZWQJCQkJCQkJPworKiBfQU0yOUsJT0VNIHN1cHBsaWVkCQkJCQkJCT8KKyogPwkJCU9FTSBzdXBwbGllZAkJCQkJCQlNaWNyb3RlYyBSZXNlYXJjaCA4MFg4NiBDb21waWxlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCUFsaWdubWVudAorKglTb21lIHBsYXRmb3JtcyBjYW4gYWNjZXNzIHdvcmRzIG9uIG9kZCBib3VuZGFyaWVzICh3aXRoIHBvc3NpYmx5IGFuIHBlcmZvcm1hbmNlIGltcGFjdCksIGF0IG90aGVyCisqCXBsYXRmb3JtcyBzdWNoIGFuIGFjY2VzcyBtYXkgcmVzdWx0IGluIGEgbWVtb3J5IGFjY2VzcyB2aW9sYXRpb24uCisqCUl0IGlzIGFzc3VtZWQgdGhhdCBldmVyeXdoZXJlIHdoZXJlIHRoZSBIQ0YgY2FzdHMgYSBjaGFyIHBvaW50ZXIgaW50byBhIHdvcmQgcG9pbnRlciwgdGhlIGFsaWdubWVudAorKgljcml0ZXJpYSBhcmUgbWV0LiBUaGlzIHB1dCBzb21lIHJlc3RyaWN0aW9ucyBvbiB0aGUgTVNGLCB3aGljaCBhcmUgYXNzdW1lZCB0byBiZSAiYXV0b21hdGljYWxseSIgZnVsZmlsbGVkCisqCWF0IHRoZSBhcHBsaWNhYmxlIHBsYXRmb3JtcworKglUbyBhc3NlcnQgdGhpcyBhc3N1bXB0aW9uLCB0aGUgbWFjcm8gSENGX0FMSUdOIGNhbiBiZSBkZWZpbmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLCBtZWFuaW5nIGJ5dGUKKyoJYWxpZ25tZW50IChvciBubyBhbGlnbm1lbnQpLCBhIHZhbHVlIG9mIDIgbWVhbnMgd29yZCBhbGlnbm1lbnQsIGEgdmFsdWUgb2YgNCBtZWFucyBkb3VibGUgd29yZCBhbGlnbm1lbnQKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICBJTl9QT1JUX1NUUklOR184XzE2ICBTIGEgbSBwIGwgZSBzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBsZXQgdGhlIHByb2Nlc3NvciBoYW5kbGUgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pIHdoaWxlICggbi0tICkgCVwKKwl7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoKGhjZl84IEZBUiopYWRkcikrPTI7IH0KKworCQkvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkJIFwKKwl7IGhjZl8xNiBpID0gSU5fUE9SVF9XT1JEKHBvcnQpOyAqKChoY2ZfOCBGQVIqKWFkZHIpKysgPSAoaGNmXzgpaTsgKigoaGNmXzggRkFSKilhZGRyKSsrID0gKGhjZl84KShpPj44KTt9CisKKwkJLy8gQXNzZW1ibGVyIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JCVwKK3sJCQkJCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRpCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGVzCQkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbGVuCQkJCQkJCQkJXAorCV9fYXNtIGxlcyBkaSxhZGRyCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQkJXAorCV9fYXNtIHJlcCBpbnN3CQkJCQkJCQkJCVwKKwlfX2FzbSBwb3AgZXMJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkaQkJCQkJCQkJCQlcCit9CisKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICBPVVRfUE9SVF9TVFJJTkdfOF8xNiAgUyBhIG0gcCBsIGUgcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCQkvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGxldCB0aGUgcHJvY2Vzc29yIGhhbmRsZSB0aGUgd29yZC1hdC1ieXRlLWJvdW5kYXJ5IHByb2JsZW0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkgXAorCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoKGhjZl84IEZBUiopYWRkcikrPTI7IH0KKworCQkvLyBDIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhbmRsZXMgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApIFwKKwl7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooKGhjZl84IEZBUiopYWRkcikgfCAqKCgoaGNmXzggRkFSKilhZGRyKSsxKTw8OCAgKTsgKGhjZl84IEZBUiopYWRkcis9MjsgfQorCisJCS8vIEFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbgorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbGVuKSBfX2FzbQlcCit7CQkJCQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBzaQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBkcwkJCQkJCQkJCQlcCisJX19hc20gbW92IGN4LGxlbgkJCQkJCQkJCVwKKwlfX2FzbSBsZHMgc2ksYWRkcgkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgZHgscG9ydAkJCQkJCQkJCVwKKwlfX2FzbSByZXAgb3V0c3cJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkcwkJCQkJCQkJCQlcCisJX19hc20gcG9wIHNpCQkJCQkJCQkJCVwKK30KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKiAgQyBPIE0gUCBJIEwgRSBSICAgUyBQIEUgQyBJIEYgSSBDICAgTSBBIEMgUiBPIFMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgkJCSEhISEhISEhISEhISEhISEhISEhISEhISEgTm90ZSB0byB0aGUgSENGLWltcGxlbWVudG9yICEhISEhISEhISEhISEhISEhISEhISEhISEKKyoJCQkhISEhIERvIG5vdCBjYWxsIHRoZXNlIG1hY3JvcyB3aXRoIHBhcmFtZXRlcnMgd2hpY2ggaW50cm9kdWNlIHNpZGUgZWZmZWN0cyAhISEhCisqCQkJISEhISEhISEhISEhISEhISEhISEhISEhISBOb3RlIHRvIHRoZSBIQ0YtaW1wbGVtZW50b3IgISEhISEhISEhISEhISEhISEhISEhISEhIQorKgorKgorKiBCeSBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIE1hY3JvIGRlZmluaXRpb25zIGJ5IG1lYW5zIG9mIG1vZGlmeWluZyB0aGUgIiNpZmRlZiAwLzEiIGxpbmVzLCB0aGUgSENGIGNhbiBiZQorKiBhZGp1c3RlZCBmb3IgdGhlIEkvTyBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBzcGVjaWZpYyBjb21waWxlcgorKgorKiBJZiBuZWVkZWQgdGhlIG1hY3JvcyBjYW4gYmUgbW9kaWZpZWQgb3IgcmVwbGFjZWQgd2l0aCBkZWZpbml0aW9ucyBhcHByb3ByaWF0ZSBmb3IgeW91ciBwZXJzb25hbCBwbGF0Zm9ybS4KKyogSWYgeW91IG5lZWQgdG8gbWFrZSBzdWNoIGNoYW5nZXMgaXQgaXMgYXBwcmVjaWF0ZWQgaWYgeW91IGluZm9ybSBBZ2VyZSBTeXN0ZW1zCisqIFRoYXQgd2F5IHRoZSBjaGFuZ2VzIGNhbiBiZWNvbWUgcGFydCBvZiB0aGUgbmV4dCByZWxlYXNlIG9mIHRoZSBXQ0kKKyoKKyogRm9yIGNvbnZlbmllbmNlIG9mIHRoZSBNU0YtcHJvZ3JhbW1lciwgYWxsIG1hY3JvcyBhcmUgYWxsb3dlZCB0byBtb2RpZnkgdGhlaXIgcGFyYW1ldGVycyAoYWx0aG91Z2ggc29tZQorKiBtaWdodCBhcmd1ZSB0aGF0IHRoaXMgd291bGQgY29uc3RpdHV0ZSBiYWQgY29kaW5nIHByYWN0aWNlKS4gVGhpcyBoYXMgaXRzIGltcGxpY2F0aW9ucyBvbiB0aGUgSENGLCBlLmcuIGFzIGEKKyogY29uc2VxdWVuY2UgdGhlc2UgbWFjcm9zIHNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggcGFyYW1ldGVycyB3aGljaCBoYXZlIHNpZGUgZWZmZWN0cywgZS5nIGF1dG8taW5jcmVtZW50LgorKgorKiBpbiB0aGUgTWljcm9zb2Z0IGltcGxlbWVudGF0aW9uIG9mIGlubGluZSBhc3NlbWJseSBpdCBpcyBPLksuIHRvIGNvcnJ1cHQgYWxsIGZsYWdzIGV4Y2VwdCB0aGUgZGlyZWN0aW9uIGZsYWcKKyogYW5kIHRvIGNvcnJ1cHQgYWxsIHJlZ2lzdGVycyBleGNlcHQgdGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGFuZCBFREksIEVTSSwgRVNQIGFuZCBFQlAgKG9yIHRoZWlyIDE2IGJpdHMKKyogZXF1aXZhbGVudHMpLiAgT3RoZXIgZW52aXJvbm1lbnRzIG1heSBoYXZlIG90aGVyIGNvbnN0cmFpbnRzCisqCisqIGluIHRoZSBJbnRlbCBlbnZpcm9ubWVudCBpdCBpcyBPLksgdG8gaGF2ZSBhIHdvcmQgKGFzIGEgMTYgYml0cyBxdWFudGl0eSkgYXQgYSBieXRlIGJvdW5kYXJ5LCBoZW5jZQorKiBJTl8vT1VUX1BPUlRfU1RSSU5HXzhfMTYgY2FuIG1vdmUgd29yZHMgYmV0d2VlbiBQQy1tZW1vcnkgYW5kIE5JQy1tZW1vcnkgd2l0aCBhcyBvbmx5IGNvbnN0cmFpbnQgdGhhdCB0aGUKKyogd29yZHMgYXJlIG9uIGEgd29yZCBib3VuZGFyeSBpbiBOSUMtbWVtb3J5LiBUaGlzIGRvZXMgbm90IGhvbGQgdHJ1ZSBmb3IgYWxsIGNvbmNlaXZhYmxlIGVudmlyb25tZW50cywgZS5nLgorKiBhbiBNb3Rvcm9sYSA2OHh4eCBkb2VzIG5vdCBhbGxvdyB0aGlzLiBQcm9iYWJseS9ob3BlZnVsbHkgdGhlIGJvdW5kYXJ5IGNvbmRpdGlvbnMgaW1wb3NlZCBieSB0aGVzZSB0eXBlIG9mCisqIHBsYXRmb3JtcyBwcmV2ZW50IHRoaXMgY2FzZSBmcm9tIG1hdGVyaWFsaXppbmcuICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgT1VUX1BPUlRfU1RSSU5HXzhfMTYgbXVzdCBiZSBjb2RlZAorKiBieSBjb21iaW5pbmcgdHdvIEhvc3QgbWVtb3J5IGhjZl84IHZhbHVlcyBhdCBhIHRpbWUgdG8gYSBzaW5nbGUgaGNmXzE2IHZhbHVlIHRvIGJlIHBhc3NlZCB0byB0aGUgTklDIGFuZAorKiBJTl9QT1JUX1NUUklOR184XzE2IHRoZSBzaW5nbGUgaGNmXzE2IHJldHJpZXZlZCBmcm9tIHRoZSBOSUMgbXVzdCBiZSBzcGxpdCBpbiB0d28gaGNmXzggdmFsdWVzIHRvIGJlIHN0b3JlZAorKiBpbiBIb3N0IG1lbW9yeSAoc2VlIHRoZSBzYW1wbGUgY29kZSBhYm92ZSkKKyoKKyoJVGhlIHByb3RvdHlwZXMgYW5kIGZ1bmN0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1hY3JvcyBhcmU6CisqCisqCWhjZl8xNglJTl9QT1JUX1dPUkQoIGhjZl8xNiBwb3J0ICkKKyoJCQlSZWFkcyBhIHdvcmQgKDE2IGJpdHMpIGZyb20gdGhlIHNwZWNpZmllZCBwb3J0CisqCisqCXZvaWQJT1VUX1BPUlRfV09SRCggaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSkKKyoJCQlXcml0ZXMgYSB3b3JkICgxNiBiaXRzKSB0byB0aGUgc3BlY2lmaWVkIHBvcnQKKyoKKyoJaGNmXzE2CUlOX1BPUlRfRFdPUkQoIGhjZl8xNiBwb3J0ICkKKyoJCQlSZWFkcyBhIGR3b3JkICgzMiBiaXRzKSBmcm9tIHRoZSBzcGVjaWZpZWQgcG9ydAorKgorKgl2b2lkCU9VVF9QT1JUX0RXT1JEKCBoY2ZfMTYgcG9ydCwgaGNmXzMyIHZhbHVlKQorKgkJCVdyaXRlcyBhIGR3b3JkICgzMiBiaXRzKSB0byB0aGUgc3BlY2lmaWVkIHBvcnQKKyoKKyoJdm9pZAlJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBsZW4pCisqCQkJUmVhZHMgbGVuIG51bWJlciBvZiB3b3JkcyAoMTYgYml0cykgZnJvbSBOSUMgbWVtb3J5IHZpYSB0aGUgc3BlY2lmaWVkIHBvcnQgdG8gdGhlIChGQVIpCisqCQkJYnl0ZS1wb2ludGVyIGFkZHIgaW4gUEMtUkFNCisqCQkJTm90ZSB0aGF0IGxlbiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiB3b3JkcywgTk9UIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyoJCQkhISFOT1RFLCBhbHRob3VnaCBsZW4gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygd29yZHMsIGFkZHIgTVVTVCBiZSBhIGNoYXIgcG9pbnRlciBOT1RFISEhCisqCQkJU2VlIGFsc28gdGhlIGNvbW1vbiBub3RlcyBmb3IgSU5fUE9SVF9TVFJJTkdfOF8xNiBhbmQgT1VUX1BPUlRfU1RSSU5HXzhfMTYKKyoKKyoJdm9pZAlPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbGVuKQorKgkJCVdyaXRlcyBsZW4gbnVtYmVyIG9mIHdvcmRzICgxNiBiaXRzKSBmcm9tIHRoZSAoRkFSKSBieXRlLXBvaW50ZXIgYWRkciBpbiBQQy1SQU0gdmlhIHRoZSBzcGVjaWZpZWQKKyoJCQlwb3J0IHRvIE5JQyBtZW1vcnkKKyoJCQlOb3RlIHRoYXQgbGVuIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHdvcmRzLCBOT1QgdGhlIG51bWJlciBvZiBieXRlcy4KKyoJCQkhISFOT1RFLCBhbHRob3VnaCBsZW4gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygd29yZHMsIGFkZHIgTVVTVCBiZSBhIGNoYXIgcG9pbnRlciBOT1RFISEhCisqCisqCQkJVGhlIHBlY3VsaWFyIGNvbWJpbmF0aW9uIG9mIHdvcmQtbGVuZ3RoIGFuZCBjaGFyIHBvaW50ZXJzIGZvciBJTl9QT1JUX1NUUklOR184XzE2IGFzIHdlbGwgYXMKKyoJCQlPVVRfUE9SVF9TVFJJTkdfOF8xNiBpcyBqdXN0aWZpZWQgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBvZmZlcnMgYSBtb3JlIG9wdGltYWwgYWxnb3JpdGhtCisqCisqCXZvaWQJSU5fUE9SVF9TVFJJTkdfMzIoIHBvcnQsIGFkZHIsIGxlbikKKyoJCQlSZWFkcyBsZW4gbnVtYmVyIG9mIGRvdWJsZS13b3JkcyAoMzIgYml0cykgZnJvbSBOSUMgbWVtb3J5IHZpYSB0aGUgc3BlY2lmaWVkIHBvcnQgdG8gdGhlIChGQVIpCisqCQkJZG91YmxlLXdvcmQgYWRkcmVzcyBhZGRyIGluIFBDLVJBTQorKgorKgl2b2lkCU9VVF9QT1JUX1NUUklOR18zMiggcG9ydCwgYWRkciwgbGVuKQorKgkJCVdyaXRlcyBsZW4gbnVtYmVyIG9mIGRvdWJsZS13b3JkcyAoMzIgYml0cykgZnJvbSB0aGUgKEZBUikgZG91YmxlLXdvcmQgYWRkcmVzcyBhZGRyIGluIFBDLVJBTSB2aWEKKyoJCQl0aGUgc3BlY2lmaWVkIHBvcnQgdG8gTklDIG1lbW9yeQorKgorKgkJCSEhISEhISEhISEhISEhISEhISEhISEhISEgTm90ZSB0byB0aGUgSENGLWltcGxlbWVudG9yICEhISEhISEhISEhISEhISEhISEhISEhISEKKyoJCQkhISEhIERvIG5vdCBjYWxsIHRoZXNlIG1hY3JvcyB3aXRoIHBhcmFtZXRlcnMgd2hpY2ggaW50cm9kdWNlIHNpZGUgZWZmZWN0cyAhISEhCisqCQkJISEhISEhISEhISEhISEhISEhISEhISEhISBOb3RlIHRvIHRoZSBIQ0YtaW1wbGVtZW50b3IgISEhISEhISEhISEhISEhISEhISEhISEhIQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIGRlZmluZSBJTlQgVHlwZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhcgkJCWhjZl84OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCWhjZl8xNjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJCWhjZl8zMjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIGRlZmluZSBJL08gVHlwZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENGX0lPX01FTSAgICAgCQkJMHgwMDAxCS8vIG1lbW9yeSBtYXBwZWQgSS9PCSggMDogUG9ydCBJL08gKQorI2RlZmluZSBIQ0ZfSU9fMzJCSVRTICAgCSAgCTB4MDAwMiAJLy8gMzJCaXRzIHN1cHBvcnQJCSggMDogb25seSAxNiBCaXRzIEkvTykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjZGVmaW5lIEhDRl9UWVBFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfVFlQRV9OT05FCQkJMHgwMDAwCS8vIE5vIHR5cGUKKyNkZWZpbmUgSENGX1RZUEVfV1BBCQkJMHgwMDAxCS8vIFdQQSBzdXBwb3J0CisjZGVmaW5lIEhDRl9UWVBFX1VTQgkJCTB4MDAwMgkvLyByZXNlcnZlZCAoVVNCIERvbmdsZSBkcml2ZXIgc3VwcG9ydCkKKy8vI2RlZmluZSBIQ0ZfVFlQRV9ISUkJCQkweDAwMDQJLy8gSGVybWVzLUlJLCB0byBkaXNjcmltaW5hdGUgSC1JIGFuZCBILUlJIENGR19IQ0ZfT1BUX1NUUkNUCisjZGVmaW5lIEhDRl9UWVBFX1dBUlAJCQkweDAwMDgJLy8gV0FSUCBGL1cKKyNkZWZpbmUgSENGX1RZUEVfUFJFTE9BREVECQkweDAwNDAJLy8gcHJlLWxvYWRlZCBGL1cKKyNkZWZpbmUgSENGX1RZUEVfSElJNQkJCTB4MDA4MAkvLyBIZXJtZXMtMi41IEgvVworI2RlZmluZSBIQ0ZfVFlQRV9DQ1gJCQkweDAxMDAJLy8gQ0tJUAorI2RlZmluZSBIQ0ZfVFlQRV9CRUFHTEVfSElJNQkweDAyMDAJLy8gQmVhZ2xlIEhlcm1lcy0yLjUgSC9XCisjZGVmaW5lIEhDRl9UWVBFX1RYX0RFTEFZCQkweDQwMDAJLy8gRGVsYXllZCB0cmFuc21pc3Npb24gKCBub24tRE1BIG9ubHkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogI2RlZmluZSBIQ0ZfQVNTRVJUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENGX0FTU0VSVF9OT05FCQkJMHgwMDAwCS8vIE5vIGFzc2VydCBzdXBwb3J0CisjZGVmaW5lIEhDRl9BU1NFUlRfUFJJTlRGCQkweDAwMDEJLy8gSGVybWVzIGdlbmVyYXRlZCBkZWJ1ZyBpbmZvCisjZGVmaW5lIEhDRl9BU1NFUlRfU1dfU1VQCQkweDAwMDIJLy8gbG9nZ2luZyB2aWEgSGVybWVzIHN1cHBvcnQgcmVnaXN0ZXIKKyNkZWZpbmUgSENGX0FTU0VSVF9NQgkJCTB4MDAwNAkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CisjZGVmaW5lIEhDRl9BU1NFUlRfUlRfTVNGX1JUTgkweDQwMDAJLy8gZHluYW1pY2FsbHkgYmluZGluZyBvZiBtc2ZfYXNzZXJ0IHJvdXRpbmUKKyNkZWZpbmUgSENGX0FTU0VSVF9MTktfTVNGX1JUTgkweDgwMDAJLy8gc3RhdGljYWxseSBiaW5kaW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICNkZWZpbmUgSENGX0VOQ0FQICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9FTkNfTk9ORQkJCTB4MDAwMAkvLyBObyBlbmNhcHN1bGF0aW9uIHN1cHBvcnQKKyNkZWZpbmUgSENGX0VOQwkJCQkJMHgwMDAxCS8vIEhDRiBoYW5kbGVzIEVuLS9EZWNhcHN1bGF0aW9uCisjZGVmaW5lIEhDRl9FTkNfU1VQCQkJCTB4MDAwMgkvLyBIQ0Ygc3VwcG9ydHMgTVNGIHRvIGhhbmRsZSBFbi0vRGVjYXBzdWxhdGlvbgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICNkZWZpbmUgSENGX0VYVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9FWFRfTk9ORQkJCTB4MDAwMAkvLyBObyBleHBhbmRlZCBmZWF0dXJlcworI2RlZmluZSBIQ0ZfRVhUX0lORk9fTE9HCQkweDAwMDEJLy8gbG9nZ2luZyBvZiBIZXJtZXMgSW5mbyBmcmFtZXMKKy8vI2RlZmluZSBIQ0ZfRVhUX0lOVF9UWF9PSwkJMHgwMDAyCS8vIFJFU0VSVkVEISEhIG1vbml0b3Jpbmcgc3VjY2Vzc2Z1bCBUeCBtZXNzYWdlCisjZGVmaW5lIEhDRl9FWFRfSU5UX1RYX0VYCQkweDAwMDQJLy8gbW9uaXRvcmluZyB1bnN1Y2Nlc3NmdWwgVHggbWVzc2FnZQorLy8jZGVmaW5lIEhDRl9FWFRfTU9OX01PREUJCTB4MDAwOAkvLyBMRUdBQ1kKKyNkZWZpbmUgSENGX0VYVF9UQUxMSUVTX0ZXCQkweDAwMTAJLy8gc3VwcG9ydCBmb3IgdXAgdG8gMzIgSGVybWVzIEVuZ2luZWVyaW5nIHRhbGxpZXMKKyNkZWZpbmUgSENGX0VYVF9UQUxMSUVTX0hDRgkJMHgwMDIwCS8vIHN1cHBvcnQgZm9yIHVwIHRvIDggSENGIEVuZ2luZWVyaW5nIHRhbGxpZXMKKyNkZWZpbmUgSENGX0VYVF9OSUNfQUNDRVNTCQkweDAwNDAJLy8gZGlyZWN0IGFjY2VzcyB2aWEgQXV4LXBvcnRzIGFuZCB0byBIZXJtZXMgcmVnaXN0ZXJzIGFuZCBjb21tYW5kcworI2RlZmluZSBIQ0ZfRVhUX01CCQkJCTB4MDA4MAkvLyBNYWlsQm94IGNvZGUgZXhwYW5kZWQKKyNkZWZpbmUgSENGX0VYVF9JRkJfU1RSQ1QgCQkweDAxMDAJLy8gTVNGIGN1c3RvbSBwb2ludGVyIGluIElGQgorI2RlZmluZSBIQ0ZfRVhUX0RFU0NfU1RSQ1QgCQkweDAyMDAJLy8gTVNGIGN1c3RvbSBwb2ludGVyIGluIERlc2NyaXB0b3IKKyNkZWZpbmUgSENGX0VYVF9UWF9DT05UCQkJMHg0MDAwCS8vIENvbnRpbnVvdXMgdHJhbnNtaXQgdGVzdAorI2RlZmluZSBIQ0ZfRVhUX0lOVF9USUNLCQkweDgwMDAJLy8gZW5hYmxlcyBUaW1lclRpY2sgaW50ZXJydXB0IGdlbmVyYXRpb24KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAjZGVmaW5lIEhDRl9TTEVFUCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIQ0ZfRERTCQkJCQkweDAwMDEJLy8gRGlzY29ubmVjdGVkIERlZXAgU2xlZXAKKyNkZWZpbmUgSENGX0NEUwkJCQkJMHgwMDAyCS8vIENvbm5lY3RlZCBEZWVwIFNsZWVwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogI2RlZmluZSBIQ0ZfVEFMTElFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDRl9UQUxMSUVTX05PTkUJCTB4MDAwMAkvLyBObyB0YWxseSBzdXBwb3J0CisjZGVmaW5lIEhDRl9UQUxMSUVTX05JQwkJCTB4MDAwMQkvLyBIZXJtZXMgVGFsbGllcyBhY2N1bXVsYXRlZCBpbiBJRkIKKyNkZWZpbmUgSENGX1RBTExJRVNfSENGCQkJMHgwMDAyCS8vIEhDRiBUYWxsaWVzIGFjY3VtdWxhdGVkIGluIElGQgorI2RlZmluZSBIQ0ZfVEFMTElFU19SRVNFVAkJMHg4MDAwCS8vIFRhbGxpZXMgaW4gSUZCIGFyZSByZXNldCB3aGVuIHJlcG9ydGVkIHZpYSBoY2ZfZ2V0X2luZm8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTSBJIE4gSSBQIE8gUiBUICAgIE4gRCBJIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIFdWTEFOXzQxIHx8IGRlZmluZWQgV1ZMQU5fNDggfHwgZGVmaW5lZCBXVkxBTl81MiB8fCBkZWZpbmVkIF9XSU4zMl9XQ0UKKworI2lmbmRlZiBXVkxBTl80NgorI2RlZmluZSBIQ0ZfRVhUICAgKEhDRl9FWFRfSU5GT19MT0cgfCBIQ0ZfRVhUX01CIHwgSENGX0VYVF9OSUNfQUNDRVNTICkKKyNlbHNlCisjZGVmaW5lIEhDRl9FWFQgKCBIQ0ZfRVhUX1RYX0NPTlQgfCBIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9NQiB8IEhDRl9FWFRfTklDX0FDQ0VTUyApCisjZW5kaWYKKyNkZWZpbmUgSENGX0RMViAxCQkJLy9ILUkgbGVnYWN5LCBzdXBlcmZsdW91cyBmb3IgSC1JSQorCisjaWZkZWYgX1dJTjMyX1dDRQorI2RlZmluZSBIQ0ZfSU8gICAgIEhDRl9JT19NRU0KKyNkZWZpbmUgSENGX0RNQQkJMAkJCS8vIFRvIGVuYWJsZSBETUEKKyNlbmRpZgorCisjaWYgX1ZBUklBTlQgPT0gNworI2RlZmluZSBIQ0ZfU0xFRVAgSENGX0NEUworI2VuZGlmIC8vIF9WQVJJQU5UID09IDcKKworI2lmIF9WQVJJQU5UID09IDUgfHwgX1ZBUklBTlQgPT0gNgorI2RlZmluZSBfV0FSUAorI2RlZmluZSBfQUVTCisjZGVmaW5lIEhDRl9TTEVFUCBIQ0ZfQ0RTCisjaWYgX1ZBUklBTlQgPT0gNgorLy8hICNkZWZpbmUgX1JTTgorI2VuZGlmIC8vIF9WQVJJQU5UID09IDYKKyNpZm5kZWYgX1dJTjMyX1dDRQorI2RlZmluZSBIQ0ZfSU8gICAgIEhDRl9JT18zMkJJVFMKKyNkZWZpbmUgSENGX0RNQQkJMQkJCS8vIFRvIGVuYWJsZSBETUEKKyNlbmRpZgorI2VuZGlmIC8vIF9WQVJJQU5UID09IDUgfHwgX1ZBUklBTlQgPT0gNgorCisKKy8vSFdpIGZvciBtaWdyYXRpb24gcHVycG9zZXMgSSBkZWZpbmVkIGEgZGVmaW5lIHdoaWNoIHdpbGwgYmUgVFJVRSBmb3IgQUxMIGRyaXZlcnMKKy8vTWVhbmluZyB0aGF0IF9DQ1ggZGVmaW5lZCBjb2RlIHdoaWNoIHdlIHRoaW5rIHdpbGwgZ2V0IGEgYWxsIGRyaXZlciBPSyBmbGFnIGNhbiBiZSBkZWZpbmVkIGZyb20gX0NDWCB0byBfQ0NYX09LCisjaWYgZGVmaW5lZCBXVkxBTl80OCAvLyAmJiAhZGVmaW5lZCBfV0lOMzJfV0NFCisjaWYgX1ZBUklBTlQgPT0gNCB8fCBfVkFSSUFOVCA9PSA2CisjZGVmaW5lIF9DQ1hfT0sJCTEKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA0IHx8IF9WQVJJQU5UID09IDYKKyNlbmRpZiAvLyBXVkxBTl80OAorCisvLyNpZiAhZGVmaW5lZCBXVkxBTl80NgorI2lmIGRlZmluZWQgV1ZMQU5fNDgKKyNpZiBfVkFSSUFOVCA9PSA0IHx8IF9WQVJJQU5UID09IDYKKyNkZWZpbmUgX0NDWAorI2RlZmluZSBIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcgICAgODYgLy8sIHVzZSA4NiBmb3IgcnggZnJhZ21lbnRhdGlvbi4gMjggaXMgZW51ZiBmb3IgTUlDK1BQSyBlbmNhcHN1bGF0aW9uCisjZGVmaW5lIEhDRl9NQVhfTVNHCQkJCQkoIDE1MTQgKyBIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcgICkgLy8gbmVlZCBleHRyYSBwYWRkaW5nIGZvciBDS0lQIChuZWVkIHRvIHN1YnRyYWN0IDI4IGZvciBORElTKQorI2VuZGlmIC8vIF9WQVJJQU5UID09IDQgfHwgX1ZBUklBTlQgPT0gNgorI2VuZGlmIC8vIFdWTEFOXzQ4CisvLyNlbmRpZiAvLyBXVkxBTl80NgorCisjaWYgIWRlZmluZWQgV1ZMQU5fNDYKKyNkZWZpbmUgX1BFRUsKKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMl9XQ0UKKy8vIEFTU0VSVCBhbHJlYWR5IHVzZWQgYnkgV2luQ0UuLi4KKyNpZmRlZiBBU1NFUlQKKyN1bmRlZiBBU1NFUlQKKyNkZWZpbmUgIEFTU0VSVCh4KSBBU1NFUlRERUJVR01TRygoeCksIChURVhUKCJTSU1VTEFURSBBU1NFUlQ6IikpKQorI2VuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZCBXVkxBTl80MQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9NSU5JUE9SVF9ORElTXzMxCisjZW5kaWYgLy8gV1ZMQU5fNDEKKyNpZiBkZWZpbmVkIFdWTEFOXzQ4ICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfTUlOSVBPUlRfTkRJU181MAorI2VuZGlmIC8vIFdWTEFOXzQ4IC8gX1dJTjMyX1dDRQorI2lmIGRlZmluZWQgV1ZMQU5fNTIgJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9NSU5JUE9SVF9ORElTXzQwCisjZW5kaWYgLy8gV1ZMQU5fNTIgLyBfV0lOMzJfV0NFCisjaWYgZGVmaW5lZCBXVkxBTl80NgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJQ09NUF9JRF9XSU5fQ0UKKyNlbmRpZiAvLyBfV0lOMzJfV0NFCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQlfVkFSSUFOVAorCisjZGVmaW5lCVQxX19IQ0ZfVFlQRQkJCQkJKEhDRl9UWVBFX05PTkUpCisKKyNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQorCisjaWZkZWYgX1dBUlAKKyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfSElJNSB8IEhDRl9UWVBFX1dBUlAgKQorI2Vsc2UKKyNpZiBfVkFSSUFOVCA9PSA3CisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCisjZWxzZSAvLyBfVkFSSUFOVCA9PSA3CisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBfVkFSSUFOVCA9PSA3CisjZW5kaWYgLy8gX1dBUlAKKworI2lmZGVmIF9DQ1hfT0sKKyNkZWZpbmUgVDRfX0hDRl9UWVBFCQkJCQkoVDNfX0hDRl9UWVBFIHwgSENGX1RZUEVfQ0NYKQorI2Vsc2UKKyNkZWZpbmUgVDRfX0hDRl9UWVBFCQkJCQkoVDNfX0hDRl9UWVBFKQorI2VuZGlmIC8vIF9DQ1hfT0sKKworLy9ub3Qgc3VpdGFibGUgZm9yIEgtSUkgI2RlZmluZSBIQ0ZfQ0ZHX1NUQV8xX0JPVFRPTSAgICAgICAgCTE2CisKKy8vIERlZmF1bHQgV1BBIGluIE9OIGZvciBhbGwgZHJpdmVycyBleGNlcHQgZm9yIFdBUlAgZHJpdmVyCisjaWZkZWYgX1dBUlAKKyNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFKQorI2Vsc2UgLy8gX1dBUlAKKyNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFIHwgSENGX1RZUEVfV1BBKQorI2VuZGlmIC8vIF9XQVJQCisKKyNkZWZpbmUgSENGX1RZUEUJCQkJCQkoVDVfX0hDRl9UWVBFKQorCisvLyBUaGlzIGlzIG5lZWRlZCB0byBnZXQgYXV4X2N0cmwoKSBmcm9tIHRoZSBIQ0YgZm9yIFdsRnJlZXplQW5kRHVtcCgpCisjaWYgKGRlZmluZWQgREJHICYmIERCRyAhPSAwKQorI2lmbmRlZiBTVEFUSUMKKyNkZWZpbmUgU1RBVElDCisjZW5kaWYKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgU09GVFJPTklDU19DT0RFICYmICFkZWZpbmVkIF9BUElETEwgJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorI2luY2x1ZGUgPG5kaXMuaD4KKyNlbmRpZiAvLyBTT0ZUUk9OSUNTX0NPREUgLyBfQVBJRExMIC8gX1dJTjMyX1dDRQorI2lmIGRlZmluZWQgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5udC5oPgorI2VuZGlmICAvLyBfV0lOMzJfV0NFCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQlUUElfTUFKT1JfVkVSU0lPTgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJVFBJX01JTk9SX1ZFUlNJT04KKworI2lmICFkZWZpbmVkIF9BUElETEwgJiYgIWRlZmluZWQgX1dJTjMyX1dDRQorCitfX2lubGluZSBVQ0hBUiBORElTX0lOX0JZVEUoIFVMT05HIHBvcnQgKQoreworICAgIFVDSEFSIHZhbHVlOworICAgIE5kaXNSYXdSZWFkUG9ydFVjaGFyKHBvcnQgLCAmdmFsdWUpOworICAgIHJldHVybiAodmFsdWUpOworfQorCitfX2lubGluZSBVTE9ORyBORElTX0lOX0xPTkcoIFVMT05HIHBvcnQgKQoreworICAgIFVMT05HIHZhbHVlOworICAgIE5kaXNSYXdSZWFkUG9ydFVsb25nKHBvcnQgLCAmdmFsdWUpOworICAgIHJldHVybiAodmFsdWUpOworfQorX19pbmxpbmUgVVNIT1JUIE5ESVNfSU5fV09SRCggVUxPTkcgcG9ydCApCit7CisgICAgVVNIT1JUIHZhbHVlOworICAgIE5kaXNSYXdSZWFkUG9ydFVzaG9ydChwb3J0ICwgJnZhbHVlKTsKKyAgICByZXR1cm4gKHZhbHVlKTsKK30KKworI2RlZmluZSBJTl9QT1JUX0RXT1JEKHBvcnQpCQkJTkRJU19JTl9MT05HKCAoVUxPTkcpIChwb3J0KSApCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCU5ESVNfSU5fV09SRCggKFVMT05HKSAocG9ydCkgKQorI2RlZmluZSBPVVRfUE9SVF9EV09SRChwb3J0LCB2YWx1ZSkJTmRpc1Jhd1dyaXRlUG9ydFVsb25nKChVTE9ORykgKHBvcnQpICwgdmFsdWUpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCU5kaXNSYXdXcml0ZVBvcnRVc2hvcnQoKFVMT05HKSAocG9ydCkgLCAoVVNIT1JUKSAodmFsdWUpKQorCisjZGVmaW5lICBJTl9QT1JUX1NUUklOR184XzE2KHBvcnQsIGFkZHIsIGxlbikJSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorI2RlZmluZSAgT1VUX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzMyKHBvcnQsIGFkZHIsIGxlbikJCXsJCQkJCVwKKwlOZGlzUmF3UmVhZFBvcnRCdWZmZXJVbG9uZyhwb3J0LCBhZGRyLCAobGVuKSk7CQkJCQlcCit9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzMyKHBvcnQsIGFkZHIsIGxlbikJewkJCQkJCVwKKwlOZGlzUmF3V3JpdGVQb3J0QnVmZmVyVWxvbmcocG9ydCwgYWRkciwgKGxlbikpOwkJCQkJXAorfQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJTmRpc1Jhd1JlYWRQb3J0QnVmZmVyVXNob3J0KHBvcnQsIGFkZHIsIChsZW4pKTsKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJTmRpc1Jhd1dyaXRlUG9ydEJ1ZmZlclVzaG9ydChwb3J0LCBhZGRyLCAobGVuKSk7CisKKyNlbmRpZiAvLyAgX0FQSURMTCAvIF9XSU4zMl9XQ0UKKworI2lmIGRlZmluZWQgX1dJTjMyX1dDRQorCisjZGVmaW5lIEhDRl9BTElHTiAyCisjZGVmaW5lIEhDRl9NRU1fSU8JCQkJCTEgLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CisKKyNkZWZpbmUgIAkJSU5fUE9SVF9CWVRFCQkJQ0VfSU5fUE9SVF9CWVRFCisjZGVmaW5lICAJCU9VVF9QT1JUX0JZVEUJCQlDRV9PVVRfUE9SVF9CWVRFCisjZGVmaW5lICAJCUlOX1BPUlRfV09SRAkJCUNFX0lOX1BPUlRfV09SRAorI2RlZmluZSAgCQlPVVRfUE9SVF9XT1JECQkJQ0VfT1VUX1BPUlRfV09SRAorI2RlZmluZSAgCQlJTl9QT1JUX1NUUklOR18xNgkJQ0VfSU5fUE9SVF9TVFJJTkcKKyNkZWZpbmUgIAkJT1VUX1BPUlRfU1RSSU5HXzE2CQlDRV9PVVRfUE9SVF9TVFJJTkcKKworZXh0ZXJuIGhjZl84ICBDRV9JTl9QT1JUX0JZVEUoaGNmXzMyIHBvcnQpOworZXh0ZXJuIHZvaWQgICBDRV9PVVRfUE9SVF9CWVRFKGhjZl8zMiBwb3J0LCBoY2ZfOCB2YWx1ZSk7CitleHRlcm4gaGNmXzE2IENFX0lOX1BPUlRfV09SRChoY2ZfMzIgcG9ydCk7CitleHRlcm4gdm9pZCAgIENFX09VVF9QT1JUX1dPUkQoaGNmXzMyIHBvcnQsIGhjZl8xNiB2YWx1ZSk7CitleHRlcm4gdm9pZCAgIENFX0lOX1BPUlRfU1RSSU5HKGhjZl8zMiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKK2V4dGVybiB2b2lkICAgQ0VfT1VUX1BPUlRfU1RSSU5HKGhjZl8zMiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKKworCisjZW5kaWYKKworI2lmIGRlZmluZWQgX0RFQlVHIHx8IChkZWZpbmVkIERCRyAmJiBEQkcgIT0gMCkKKyNkZWZpbmUgSENGX0FTU0VSVCAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1BSSU5URiApIC8vMHhDMDAxCisvLyNkZWZpbmUgSENGX0FTU0VSVCAoIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gfCBIQ0ZfQVNTRVJUX1BSSU5URiB8IEhDRl9BU1NFUlRfTUIgKSAvL2p1c3QgdG8gdGVzdAorI2VuZGlmIC8vIF9ERUJVRyB8fCBEQkcKKworI2lmIGRlZmluZWQgREVCVUcgfHwgZGVmaW5lZCBfREVCVUcgfHwgKGRlZmluZWQgREJHICYmIERCRyAhPSAwKQorI2lmZGVmIF9XSU4zMl9XQ0UKKyNkZWZpbmUgREJHQTJXKERCR1NUUikJQ2VDb252ZXJ0QW5zaVRvVW5pY29kZUxlbigoY2hhciopREJHU1RSKQorI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkJCQkoKHZvaWQpKCghIFpPTkVfREVCVUcpID8gMDpjZV9kZWJ1Z19vdXQgZHByaW50Zl9leHApKQorI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkJCQkoKHZvaWQpKChjb25kKSA/IDA6Y2VfZGVidWdfb3V0IGRwcmludGZfZXhwKSkKKworI2RlZmluZSBaT05FX0VSUk9SICAgICAgREVCVUdaT05FKDApCisjZGVmaW5lIFpPTkVfV0FSTiAgICAgICBERUJVR1pPTkUoMSkKKyNkZWZpbmUgWk9ORV9GVU5DVElPTiAgIERFQlVHWk9ORSgyKQorI2RlZmluZSBaT05FX0lOSVQgICAgICAgREVCVUdaT05FKDMpCisjZGVmaW5lIFpPTkVfSU5UUiAgICAgICBERUJVR1pPTkUoNCkKKyNkZWZpbmUgWk9ORV9SQ1YgICAgICAgIERFQlVHWk9ORSg1KQorI2RlZmluZSBaT05FX1hNSVQJCURFQlVHWk9ORSg2KQorI2RlZmluZSBaT05FX0FTU0VSVCAJREVCVUdaT05FKDcpCisjZGVmaW5lIFpPTkVfREVCVUcgCQlERUJVR1pPTkUoOCkKKyNkZWZpbmUgWk9ORV9PRU0gCQlERUJVR1pPTkUoOSkKKyNkZWZpbmUgWk9ORV9IQ0YJCURFQlVHWk9ORSgxMCkKKyNkZWZpbmUgWk9ORV9QT1JUSU8JCURFQlVHWk9ORSgxMSkKKyNkZWZpbmUgWk9ORV9MT0dUT0ZJTEUJREVCVUdaT05FKDE1KQorCisjZWxzZSAvLyAhKF9XSU4zMl9XQ0UpCisKKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCQkJCQkoKHZvaWQpIChEYmdQcmludCBkcHJpbnRmX2V4cCkpCisvLyB0aGUgYXNzZXJ0ZGVidWdtc2cgbWFjcm8gd2lsbCBwcmludCBmaWxlbmFtZSwgbGluZSBmb2xsb3dlZCBieSBhIGNhbGxlci1kZWZpbmVkIHRleHQsIHdoZW4gY29uZCA9PSAwCisjZGVmaW5lIEFTU0VSVERFQlVHTVNHKGNvbmQsIHByaW50KQkoKHZvaWQpKChjb25kKSA/IDA6IChEYmdQcmludCgiJXMgJXM6JWQgLSAiLCBwcmludCwgX19GSUxFX18sIF9fTElORV9fKSkpKQorCisjZGVmaW5lIFpPTkVfRVJST1IgICAgICAxCisjZGVmaW5lIFpPTkVfV0FSTiAgICAgICAxCisjZGVmaW5lIFpPTkVfRlVOQ1RJT04gICAxCisjZGVmaW5lIFpPTkVfSU5JVCAgICAgICAxCisjZGVmaW5lIFpPTkVfSU5UUiAgICAgICAxCisjZGVmaW5lIFpPTkVfUkNWICAgICAgICAxCisjZGVmaW5lIFpPTkVfWE1JVAkJMQorI2RlZmluZSBaT05FX0FTU0VSVCAJMQorI2RlZmluZSBaT05FX0RFQlVHIAkJMQorI2RlZmluZSBaT05FX09FTSAJCTEKKyNkZWZpbmUgWk9ORV9IQ0YJCTEKKyNkZWZpbmUgWk9ORV9QT1JUSU8JCTEKKyNkZWZpbmUgWk9ORV9MT0dUT0ZJTEUJMQorCisjZW5kaWYgLy8gX1dJTjMyX1dDRQorI2lmbmRlZiBEQkdBMlcKKyNkZWZpbmUgREJHQTJXCisjZW5kaWYJLy8gREJHQTJXCisKKyNlbHNlIC8vICEoZGVmaW5lZCBERUJVRyB8fCBkZWZpbmVkIF9ERUJVRyB8fCAoZGVmaW5lZCBEQkcgJiYgREJHICE9IDApICkKKyNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCisjZGVmaW5lIEFTU0VSVERFQlVHTVNHKGNvbmQsIGRwcmludGZfZXhwKQorI2VuZGlmIC8vIERFQlVHIC8gREJHCisKKyNpZiAhZGVmaW5lZCBIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcKKyNkZWZpbmUgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HIDAKKyNlbmRpZiAvLyAJCUhDRl9NQVhfTVNHX0NLSVBfUEFERElORworCisjaWYgIWRlZmluZWQJSENGX01BWF9NU0cKKyNkZWZpbmUJCQlIQ0ZfTUFYX01TRwkJCQkxNTE0CisjZW5kaWYgLy8gCQlIQ0ZfTUFYX01TRworCisjZGVmaW5lCQkJSENGX0xFR0FDWQkJCTEJLy87P252IGplIG1vZXQgd2F0CisKKyNlbmRpZiAvL1dWTEFOXzQxIC8gV1ZMQU5fNDggLyBXVkxBTl81MiAvIF9XSU4zMl9XQ0UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFAgQSBDIEsgRSBUICAgRCBSIEkgViBFIFIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBEIE8gUyAgIE8gRCBJICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl80MiB8fCBkZWZpbmVkIFdWTEFOXzQzCisKKyNwcmFnbWEgd2FybmluZyAoIGRpc2FibGU6IDQwMDEgKQorI2RlZmluZSBGQVIgIF9fZmFyCQkJCQkJCQkJCS8vc2VnbWVudGVkIDE2IGJpdHMgbW9kZQorI2RlZmluZSBCQVNFRCBfX2Jhc2VkKF9fc2VnbmFtZSgiX0NPREUiKSkJCQkJLy9mb3JjZSBhbGwgdGhlICJjb25zdCIgc3RydWN0dXJlcyBpbiB0aGUgQ09ERSBzZWdtZW50CisKKy8vI2RlZmluZSBIQ0ZfSU8gICAgIDAJCQkJCQkJCQkvL25vIERNQSwgbm8gMzIgYml0cworCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjZGVmaW5lCUhDRl9FWFQJCQkJCQlIQ0ZfRVhUX01CCisjZGVmaW5lIEhDRl9QUk9UX1RJTUUJCQkJNDkJCQkJCS8vNDkqMTAyNDAgbWljcm9zZWNvbmRzIEgvVyBmYWlsdXJlIHByb3RlY3Rpb24gdGltZXIKKworLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVG8gZWFzZSB0ZXN0aW5nIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBDT05GSUdVUkFUSU9OIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV1ZMQU5fNDIKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfUEFDS0VUCisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJNgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMTIKKyNlbmRpZiAvLyBXVkxBTl80MgorCisjaWZkZWYgV1ZMQU5fNDMKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfT0RJXzE2CisjZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJNgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMTAKKyNlbmRpZiAvLyBXVkxBTl80MworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIElOUFVUIC8gT1VUUFVUICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEhfMl9JTkMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaWYgMSAvL3RlbW9yYXJ5IHVzZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiBoY2YuYworI2lmbmRlZiBfREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gX0RFQlVHCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpX2lucHcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCSgodm9pZClfb3V0cHcoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQorCisjaWYgMQkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBsZXQgdGhlIHByb2Nlc3NvciBoYW5kbGUgdGhlIHdvcmQtYXQtYnl0ZS1ib3VuZGFyeSBwcm9ibGVtCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCQl3aGlsZSAobi0tKSBcCisJeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKChoY2ZfOCBGQVIqKWFkZHIpKz0yOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAobi0tKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7ICgoaGNmXzggRkFSKilhZGRyKSs9MjsgfQorI2VsaWYgMAkJLy8gQyBpbXBsZW1lbnRhdGlvbiB3aGljaCBoYW5kbGVzIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQkJd2hpbGUgKCBuLS0gKSBcCisJeyBoY2ZfMTYgaSA9IElOX1BPUlRfV09SRChwb3J0KTsgKigoaGNmXzggRkFSKilhZGRyKSsrID0gKGhjZl84KWk7ICooKGhjZl84IEZBUiopYWRkcikrKyA9IChoY2ZfOCkoaT4+OCk7fQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKChoY2ZfOCBGQVIqKWFkZHIpIHwgKigoKGhjZl84IEZBUiopYWRkcikrMSk8PDggICk7IChoY2ZfOCBGQVIqKWFkZHIrPTI7IH0KKyNlbHNlCQkJCQkJCQkJCQkJLy8gQXNzZW1ibGVyIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pIF9fYXNtCVwKK3sJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZGkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBlcwkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbgkJCQkJCQkJCVwKKwlfX2FzbSBsZXMgZGksYWRkcgkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQlcCisJX19hc20gcmVwIGluc3cJCQkJCQkJCQlcCisJX19hc20gcG9wIGVzCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBkaQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikgX19hc20JXAorewkJCQkJCQkJCQkJCQlcCisJX19hc20gcHVzaCBzaQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRzCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBjeCxuCQkJCQkJCQkJXAorCV9fYXNtIGxkcyBzaSxhZGRyCQkJCQkJCQlcCisJX19hc20gbW92IGR4LHBvcnQJCQkJCQkJCVwKKwlfX2FzbSByZXAgb3V0c3cJCQkJCQkJCQlcCisJX19hc20gcG9wIGRzCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBzaQkJCQkJCQkJCVwKK30KKworI2VuZGlmIC8vIEFzbSBvciBDIGltcGxlbWVudGF0aW9uCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzMyKCBwb3J0LCBhZGRyLCBuKQl7IGludCBuMiA9IDIqbjsgSU5fUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBuMikgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMzIoIHBvcnQsIGFkZHIsIG4pCXsgaW50IG4yID0gMipuOyBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBuMikgfQorI2VuZGlmIC8vIDAgLy90ZW1vcmFyeSB1c2UgZnVuY3Rpb25zIGRlZmluZWQgaW4gaGNmLmMKKyNlbmRpZiAvLyBIXzJfSU5DCisKKyNlbmRpZgkvLyBXVkxBTl80MiAvIFdWTEFOXzQzCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEQgTyBTICBIIC0gSSAvIElJICBMIE8gQSBEIEUgUiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIEgwX0xEUiB8fCBkZWZpbmVkIEgxX0xEUiB8fCBkZWZpbmVkIEgyX0xEUiB8fCBkZWZpbmVkIEg1X0xEUgorCisjaWYgZGVmaW5lZCBIMF9MRFIJCQkJLy9pbXBsaWVzIEgtSQorI2RlZmluZSBIQ0ZfRExWCQkwCQkJLy9ILUkgbGVnYWN5LCBtZWFuaW5nbGVzcyB1bmRlciBILUlJCisjZGVmaW5lIEhDRl9ETE5WCTEJCQkvL0gtSSBsZWdhY3ksIG1lYW5pbmdsZXNzIHVuZGVyIEgtSUkKKyNlbmRpZiAvLyBIMF9MRFIKKworI2lmIGRlZmluZWQgSDFfTERSIAkJCQkvL2ltcGxpZXMgSC1JCisjZGVmaW5lIEhDRl9ETFYJCTEJCQkvL0gtSSBsZWdhY3ksIG1lYW5pbmdsZXNzIHVuZGVyIEgtSUkKKyNkZWZpbmUgSENGX0RMTlYJMAkJCS8vSC1JIGxlZ2FjeSwgbWVhbmluZ2xlc3MgdW5kZXIgSC1JSQorI2VuZGlmIC8vIEgxX0xEUiAvIEgyX0xEUgorCisvLyNpZiBkZWZpbmVkIEgyX0xEUiA6IG5vdCBuZWVkZWQsIEgtSUkgZGVmYXVsdHMgYXJlIE8uSyBmb3IgSDJfTERSCisKKyNpZmRlZiBINV9MRFIKKyNkZWZpbmUgSENGX1RZUEUJCQkoSENGX1RZUEVfSElJNSB8IEhDRl9UWVBFX1dBUlAgKQorLy87PyB3aHkgZG9lcyBvbmx5IHRoaXMgc3Vic2V0IG9mIHRoZSBIX0xEUnMgbmVlZCBIQ0ZfVFlQRSB0byBiZSBkZWZpbmVkIGhlcmUKKyNlbmRpZgorCisjZGVmaW5lIEhDRl9BU1NFUlQJCQlIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCS8vc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgb2YgbXNmX2Fzc2VydCByb3V0aW5lCisjZGVmaW5lIEhDRl9FTkNBUAkJCTAKKyNkZWZpbmUgSENGX0lOVF9PTgkJCTAKKyNkZWZpbmUgSENGX1RBTExJRVMJCQkwCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfT0RJXzE2IC8vOz9CeSBsYWNrIG9mIGFueSBiZXR0ZXIKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQkwCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkwCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNvbmlvLmg+CisjaWYgZGVmaW5lZCBOREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gTkRFQlVHCisKKyNpZiAwCQkJCQkJLy91c2UgMCB0byByZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyNlbmRpZgkJCQkJCS8vdXNlIDAgdG8gcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorCisjZW5kaWYJLy8gSDBfTERSIC8gSDFfTERSIC8gSDJfTERSCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEggQyBGICBEIEUgTSBPICBQIFIgTyBHIFIgQSBNICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIEhDRl9ERU1PCisKKyNkZWZpbmUgSENGX0RMVgkJMQkJCQkvLzs/c2hvdWxkIGJlY29tZSB0aGUgZGVmYXVsdCAhZGVmYXVsdHMgdG8gMSBhbnl3YXkgZm9yIEgtSUkKKy8vI2RlZmluZSBIQ0ZfRExOVgkwCQkJCS8vZGVmYXVsdHMgdG8gMCBhbnl3YXkgZm9yIEgtSUkKKworI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTE5LX01TRl9SVE4JCQkvL3N1cHBvcnQgZHluYW1pYyBsaW5raW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorCisjZGVmaW5lIEhDRl9FTkNBUAkJCTAKKyNkZWZpbmUgSENGX0lOVF9PTgkJCTAKKyNkZWZpbmUgSENGX1RBTExJRVMJCQkoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCisKKy8vI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQlOTyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y29uaW8uaD4KKyNpZiBkZWZpbmVkIE5ERUJVRworI3ByYWdtYSBpbnRyaW5zaWMoIF9pbnAsIF9pbnB3LCBfb3V0cCwgX291dHB3ICkKKyNlbmRpZiAvLyBOREVCVUcKKworI2lmIDAJCQkJCQkvL3VzZSAwIHRvIHJlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpX2lucHcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCSgodm9pZClfb3V0cHcoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgKihoY2ZfMTYgRkFSKilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2IEZBUiopYWRkciApIDsgKGNhc3QpYWRkciAgKz0gMjsgfQorI2VuZGlmCQkJCQkJLy91c2UgMCB0byByZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CisKKyNlbmRpZgkvLyBIQ0ZfREVNTworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTSBBIEMgIE8gUyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl80NQorCisjaW5jbHVkZSAiVmVyc2lvbi5oIgorCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQgICAgICAgICAgICBDT01QX0lEX01BQ19PUworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUiAgICAgICAgICAgVkFSSUFOVAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUiAgICAgVkVSU0lPTl9NQUpPUgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAgICAgVkVSU0lPTl9NSU5PUgorCisjZGVmaW5lIE1BQ19PUyAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gMSAgICAgICAJCS8vIHNlbGVjdHMgQmlnIEVuZGlhbiAoYS5rLmEuIE1vdG9yb2xhKSwgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0CisKKyNpZiBkZWZpbmVkIERFQlVHCisjZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9NQgkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CisjZW5kaWYgLy8gREVCVUcKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKK2V4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpNYWNJT2FkZHI7CitleHRlcm4gaGNmXzE2IElOX1BPUlRfV09SRChoY2ZfMTYgcG9ydCk7CitleHRlcm4gdm9pZCAgIE9VVF9QT1JUX1dPUkQoaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSk7CitleHRlcm4gdm9pZCAgIElOX1BPUlRfU1RSSU5HXzE2KGhjZl8xNiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKK2V4dGVybiB2b2lkICAgT1VUX1BPUlRfU1RSSU5HXzE2KGhjZl8xNiBwb3J0LCB2b2lkICphZGRyLCBoY2ZfMTYgbGVuKTsKKworI2RlZmluZSBTd2FwQnl0ZXModCkgICAgKCgodCkgPj4gOCkgKyAoKCh0KSAmIDB4ZmYpIDw8IDgpKQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmICAvLyBXVkxBTl80NQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIEwgSSBOIFUgWCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV1ZMQU5fNDkKKyNpbmNsdWRlIDxhc20vaW8uaD4KKy8vI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworLyogVGhlIGZvbGxvd2luZyBtYWNybyBlbnN1cmVzIHRoYXQgbm8gc3ltYm9scyBhcmUgZXhwb3J0ZWQsIG1pbmltaXppbmcgdGhlIGNoYW5jZSBvZiBhIHN5bWJvbAorICAgY29sbGlzaW9uIGluIHRoZSBrZXJuZWwgKi8KKy8vRVhQT1JUX05PX1NZTUJPTFM7ICAvLzs/dGhpcyBwbGFjZSBzZWVtcyBub3QgYXBwcm9wcmlhdGVseSB0byBtZQorCisvLyNkZWZpbmUgSENGX1NMRUVQIChIQ0ZfQ0RTIHwgSENGX0REUyApCisjZGVmaW5lIEhDRl9TTEVFUCAoSENGX0NEUykKKworLy8jZGVmaW5lIEhDRl9UWVBFICAgIChIQ0ZfVFlQRV9ISUk1fEhDRl9UWVBFX1NUQXxIQ0ZfVFlQRV9BUCkKKyNpZmRlZiBIRVJNRVMyNQorI2lmZGVmIFdBUlAKKyNkZWZpbmUgSENGX1RZUEUgICAgKCBIQ0ZfVFlQRV9XQVJQIHwgSENGX1RZUEVfSElJNSApCisjZWxzZQorI2RlZmluZSBIQ0ZfVFlQRSAgICBIQ0ZfVFlQRV9ISUk1CisjZW5kaWYgLy8gV0FSUAorI2Vsc2UKKyNkZWZpbmUgSENGX1RZUEUgICAgSENGX1RZUEVfTk9ORQorI2VuZGlmIC8vIEhFUk1FUzI1CisKKyNpZmRlZiBFTkFCTEVfRE1BCisjZGVmaW5lIEhDRl9ETUEJCTEKKyNlbmRpZiAvLyBFTkFCTEVfRE1BCisKKy8qIFdlIG5vdyBuZWVkIGEgc3dpdGNoIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIE1haWxib3ggYW5kIG90aGVyIG5lY2Vzc2FyeSBleHRlbnNpb25zICovCisjZGVmaW5lIEhDRl9FWFQgKCBIQ0ZfRVhUX01CIHwgSENGX0VYVF9JTkZPX0xPRyB8IEhDRl9FWFRfSU5UX1RJQ0sgKS8vZ2V0IGRlZXBzbGVlcCBleGVyY2lzZSBnb2luZworCisvKiA7PyBUaGUgTGludXggTVNGIHN0aWxsIHVzZXMgdGhlc2UgZGVmaW5pdGlvbnM7IGRlZmluZSBpdCBoZXJlIHVudGlsIGl0J3MgcmVtb3ZlZCAqLworI2lmbmRlZiBIQ0ZfVFlQRV9ISUkKKyNkZWZpbmUgSENGX1RZUEVfSElJIDB4MDAwNAorI2VuZGlmCisKKyNpZm5kZWYgSENGX1RZUEVfQVAKKyNkZWZpbmUgSENGX1RZUEVfQVAgIDB4MDAxMAorI2VuZGlmCisKKyNpZm5kZWYgSENGX1RZUEVfU1RBCisjZGVmaW5lIEhDRl9UWVBFX1NUQSAweDAwMjAKKyNlbmRpZiAgLy8gSENGX1RZUEVfU1RBCisKKy8qIEd1YXJhbnRlZXMgd29yZCBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgSENGX0FMSUdOCQkyCisKKy8qIEVuZGlhbiBtYWNyb3MgQ05WX0lOVF9UT19MSVRUTEUoKSBhbmQgQ05WX0xJVFRMRV9UT19JTlQoKSB3ZXJlIHJlbmFtZWQgdG8KKyAgIENOVl9TSE9SVF9UT19MSVRUTEUoKSBhbmQgQ05WX0xJVFRMRV9UT19TSE9SVCgpICovCisjaWZuZGVmIENOVl9JTlRfVE9fTElUVExFCisjZGVmaW5lIENOVl9JTlRfVE9fTElUVExFICAgQ05WX1NIT1JUX1RPX0xJVFRMRQorI2VuZGlmCisKKyNpZm5kZWYgQ05WX0xJVFRMRV9UT19JTlQKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19JTlQgICBDTlZfTElUVExFX1RPX1NIT1JUCisjZW5kaWYKKworI2RlZmluZQlIQ0ZfRVJSX0JVU1kJCQkweDA2CisKKy8qIFVJTCBkZWZpbmVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBIQ0YgKi8KKyNkZWZpbmUgVUlMX1NVQ0NFU1MJCQkJCUhDRl9TVUNDRVNTCisjZGVmaW5lIFVJTF9FUlJfVElNRV9PVVQJCQlIQ0ZfRVJSX1RJTUVfT1VUCisjZGVmaW5lIFVJTF9FUlJfTk9fTklDCQkJCUhDRl9FUlJfTk9fTklDCisjZGVmaW5lIFVJTF9FUlJfTEVOCQkJCQlIQ0ZfRVJSX0xFTgorI2RlZmluZSBVSUxfRVJSX01JTgkJCQkJSENGX0VSUl9NQVgJLyplbmQgb2YgSENGIGVycm9ycyB3aGljaCBhcmUgcGFzc2VkIHRocm91Z2ggdG8gVUlMCisJCQkJCQkJCQkJCQkgICoqKiAqKiAqKiogKioqKioqICoqKioqICoqKiAqKioqKiogKioqKioqKiAqKiAqKiogICovCisjZGVmaW5lIFVJTF9FUlJfSU5fVVNFCQkJCTB4NDQKKyNkZWZpbmUgVUlMX0VSUl9XUk9OR19JRkIJCQkweDQ2CisjZGVmaW5lIFVJTF9FUlJfTUFYCQkJCQkweDdGCQkvKnVwcGVyIGJvdW5kYXJ5IG9mIFVJTCBlcnJvcnMgd2l0aG91dCBIQ0YtcGVuZGFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiAqKioqKioqKiAqKiAqKiogKioqKioqICoqKioqKiogKioqICoqKioqKiogICovCisjZGVmaW5lIFVJTF9FUlJfQlVTWQkJCSAgICBIQ0ZfRVJSX0JVU1kKKyNkZWZpbmUgVUlMX0VSUl9ESUFHXzEJCQkgICAgSENGX0VSUl9ESUFHXzEKKyNkZWZpbmUgVUlMX0ZBSUxVUkUJCQkJCTB4RkYJLyogMjAwMTA3MDUgbnYgdGhpcyByZWxpY2sgc2hvdWxkIGJlIGVyaWRpY2F0ZWQgKi8KKyNkZWZpbmUgVUlMX0VSUl9QSUZfQ09ORkxJQ1QJCTB4NDAJLy9vYnNvbGV0ZQorI2RlZmluZSBVSUxfRVJSX0lOQ09NUF9EUlYJCQkweDQxCS8vb2Jzb2xldGUKKyNkZWZpbmUgVUlMX0VSUl9ET1NfQ0FMTAkJCTB4NDMJLy9vYnNvbGV0ZQorI2RlZmluZSBVSUxfRVJSX05PX0RSVgkJCQkweDQyCS8vb2Jzb2xldGUKKyNkZWZpbmUgVUlMX0VSUl9OU1RMCQkJCTB4NDUJLy9vYnNvbGV0ZQorCisKKworI2lmIDAgIC8vOz8gI2lmZGVmIGdldCB0aGlzIGdvaW5nIExBVEVSIEhFUk1FUzI1CisjZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgSENGX0lPXzMyQklUUworI2RlZmluZSBIQ0ZfRE1BICAgICAgICAgICAgIDEKKyNkZWZpbmUgSENGX0RFU0NfU1RSQ1RfRVhUICA0CisKKy8qIFN3aXRjaCBmb3IgQnVzTWFzdGVyIERNQSBzdXBwb3J0LiBOb3RlIHRoYXQgdGhlIGFib3ZlIGRlZmluZSBpbmNsdWRlcyB0aGUgRE1BLXNwZWNpZmljIEhDRgorICAgY29kZSBpbiB0aGUgYnVpbGQuIFRoaXMgZGVmaW5lIHNldHMgdGhlIE1TRiB0byB1c2UgRE1BOyBpZiBFTkFCTEVfRE1BIGlzIG5vdCBkZWZpbmVkLCB0aGVuCisgICBwb3J0IEkvTyB3aWxsIGJlIHVzZWQgaW4gdGhlIGJ1aWxkICovCisjaWZuZGVmIEJVU19QQ01DSUEKKyNkZWZpbmUgRU5BQkxFX0RNQQorI2VuZGlmICAvLyBVU0VfUENNQ0lBCisKKyNlbmRpZiAgLy8gSEVSTUVTMjUKKworCisvKiBPdmVycnVsZSBzdGFuZGFyZCBXYXZlTEFOIFBhY2tldCBTaXplIHdoZW4gaW4gRE1BIG1vZGUgKi8KKyNpZmRlZiBFTkFCTEVfRE1BCisjZGVmaW5lIEhDRl9NQVhfUEFDS0VUX1NJWkUgMjMwNAorI2Vsc2UKKyNkZWZpbmUgSENGX01BWF9QQUNLRVRfU0laRSAxNTE0CisjZW5kaWYgIC8vIEVOQUJMRV9ETUEKKworLyogVGhlIGZvbGxvd2luZyBzZXRzIHRoZSBjb21wb25lbnQgSUQsIGFzIHdlbGwgYXMgdGhlIHZlcnNpb25pbmcuIFNlZSBhbHNvIHdsX3ZlcnNpb24uaCAqLworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECUNPTVBfSURfTElOVVgKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCURSVl9WQVJJQU5UCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSICAgICBEUlZfTUFKT1JfVkVSU0lPTgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAgICAgRFJWX01JTk9SX1ZFUlNJT04KKworLyogRGVmaW5lIHRoZSBmb2xsb3dpbmcgdG8gdHVybiBvbiBhc3NlcnRpb25zIGluIHRoZSBIQ0YgKi8KKy8vI2RlZmluZSBIQ0ZfQVNTRVJUICAweDgwMDAKKyNkZWZpbmUgSENGX0FTU0VSVAkJCUhDRl9BU1NFUlRfTE5LX01TRl9SVE4JLy8gc3RhdGljYWxseSBiaW5kaW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQorCisjaWZkZWYgVVNFX0JJR19FTkRJQU4KKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gIDEKKyNlbHNlCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOICAwCisjZW5kaWYgIC8qIFVTRV9CSUdfRU5ESUFOICovCisKKy8qIERlZmluZSB0aGUgZm9sbG93aW5nIGlmIHlvdXIgc3lzdGVtIHVzZXMgbWVtb3J5LW1hcHBlZCBJTyAqLworLy8jZGVmaW5lIEhDRl9NRU1fSU8KKworLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSBzdGFuZGFyZCBtYWNyb3MgcmVxdWlyZWQgYnkgdGhlIEhDRiB0byBtb3ZlIGRhdGEgdG8vZnJvbSB0aGUgY2FyZCAqLworI2RlZmluZSBJTl9QT1JUX0JZVEUocG9ydCkJCQkoKGhjZl84KWluYiggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW53KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9CWVRFKHBvcnQsIHZhbHVlKQkob3V0YiggKGhjZl84KSAodmFsdWUpLCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkob3V0dygoaGNmXzE2KSAodmFsdWUpLCAoaGNmX2lvKShwb3J0KSApKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikgICAgaW5zdygoaGNmX2lvKShwb3J0KSwgZHN0LCBuKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgc3JjLCBuKSAgIG91dHN3KChoY2ZfaW8pKHBvcnQpLCBzcmMsIG4pCisvLyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdMKHBvcnQsIGRzdCwgbikgICBpbnNsKChwb3J0KSwgKGRzdCksIChuKSkKKy8vI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdMKHBvcnQsIHNyYywgbikgIG91dHNsKChwb3J0KSwgKHNyYyksIChuKSkKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMzIocG9ydCwgZHN0LCBuKSAgIGluc2woKHBvcnQpLCAoZHN0KSwgKG4pKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMzIocG9ydCwgc3JjLCBuKSAgb3V0c2woKHBvcnQpLCAoc3JjKSwgKG4pKQorI2RlZmluZSBJTl9QT1JUX0hDRjMyKHBvcnQpICAgICAgICAgIGlubCggKGhjZl9pbykocG9ydCkgKQorI2RlZmluZSBPVVRfUE9SVF9IQ0YzMihwb3J0LCB2YWx1ZSkgIG91dGwoKGhjZl8zMikodmFsdWUpLCAoaGNmX2lvKShwb3J0KSApCisKKyNkZWZpbmUgSU5fUE9SVF9EV09SRChwb3J0KSAgICAgICAgICBJTl9QT1JUX0hDRjMyKHBvcnQpCisjZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKSAgT1VUX1BPUlRfSENGMzIocG9ydCwgdmFsdWUpCisKKyNkZWZpbmUgIElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisjZGVmaW5lICBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCU9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisKKworI2lmbmRlZiBPVVRQVVRERUJVR01TRworI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKKyNlbmRpZgorCisKKyNpZm5kZWYgQVNTRVJUREVCVUdNU0cKKyNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCisjZW5kaWYKKworI2lmbmRlZiBDRkdfU0NBTl9DSEFOTkVMU18yR0haCisjZGVmaW5lIENGR19TQ0FOX0NIQU5ORUxTXzJHSFogMHhGQ0MyCisjZW5kaWYgLyogQ0ZHX1NDQU5fQ0hBTk5FTFNfMkdIWiAqLworCisjZGVmaW5lIEhDRl9NQVhfTVNHIDE2MDAgLy9nZXQgZ29pbmcgOz8KKyNlbmRpZgkvLyBXVkxBTl80OQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFEgTiBYICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCAgX19RTlhfXyB8fCBkZWZpbmVkIFdWTEFOXzUwCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMCAgIC8vQWx0aG91Z2ggdGhlcmUgaXMgbm8gRFVJIHN1cHBvcnQsIHdlIG5lZWQgdGhpcyB0byBnZXQgLi4uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCS8vLi4uY29tcGF0aWJpbHR5IGNoZWNrIHRvIGZ1bmN0aW9uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTAJLy8uLi47P3RoaXMgaXMgd29ydGggbG9va2luZyBpbnRvIHRvIG1ha2UgdGhpcyBhIG1vcmUKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAkvLy4uLiJkZWZpbmVkIiBJL0Ygc28gT0VNZXJzIGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KKworI2luY2x1ZGUgPGNvbmlvLmg+CisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW5wdyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKG91dHB3KCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikgKHZhbHVlKSApKQorLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisqLworCisjZW5kaWYJLy8gUU5YIC8gV1ZMQU5fNTAKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBCIEUgTyBTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgIF9fQkVPU19fCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMCAgIC8vQWx0aG91Z2ggdGhlcmUgaXMgbm8gRFVJIHN1cHBvcnQsIHdlIG5lZWQgdGhpcyB0byBnZXQgLi4uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCS8vLi4uY29tcGF0aWJpbHR5IGNoZWNrIHRvIGZ1bmN0aW9uCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTAJLy8uLi47P3RoaXMgaXMgd29ydGggbG9va2luZyBpbnRvIHRvIG1ha2UgdGhpcyBhIG1vcmUKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAkvLy4uLiJkZWZpbmVkIiBJL0Ygc28gT0VNZXJzIGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KKworI2luY2x1ZGUgPGRyaXZlcnMvRHJpdmVycy5oPgorI2luY2x1ZGUgPGRyaXZlcnMvS2VybmVsRXhwb3J0Lmg+CisKK3VpbnQ4IHJlYWRfaW9fOCAoaW50KTsKK3ZvaWQgd3JpdGVfaW9fOCAoaW50LCB1aW50OCk7Cit1aW50MTYgcmVhZF9pb18xNiAoaW50KTsKK3ZvaWQgd3JpdGVfaW9fMTYgKGludCwgdWludDE2KTsKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkoKGhjZl8xNilyZWFkX2lvXzE2KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkod3JpdGVfaW9fMTYoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSAodmFsdWUpICkpCisvKgorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgKihoY2ZfMTYqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKGNhc3QpYWRkciArPSAyOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAorCQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyovCisjZW5kaWYJLy8gX19CRU9TX18KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFUgUyBCICAgRCBPIE4gRyBMIEUgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgVVNCCisjaW5jbHVkZSAiZ3BpZi5oIgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQkwCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkxCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKEhlcm1lc19JT19SZWFkKCAoaGNmXzgpKHBvcnQpKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKEhlcm1lc19JT19Xcml0ZSggKGhjZl84KXBvcnQsIC8qKGhjZl8xNikqLyh2YWx1ZSkgKSApCisvKiAhISEhIE5PVEUgVVNCIHN1cHBvcnRzIG9ubHkgMTYtYml0cyBJL08gYW5kIG5vIDgtYml0cyBJL08KKyAqIGFzIGEgY29uc2VxdWVuY2UgdGhlIElOXy9PVVRfUE9SVF9TVFJJTkdfMTYgbWFjcm9zIHVzZSBoY2ZfMTYqIHJhdGhlciB0aGFuIGhjZl84IHBvaW50ZXJzCisgKiB0byBnZXQgbW9yZSBvcHRpbWFsIGNvZGUKKyAqIHRoZXJlZm9yZSB0aGUgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGJ5IDEgKHdoaWNoIG1lYW5zIHR3byAiYnl0ZXMiKSByYXRoZXIgdGhhbiBieSAyCisgKi8KKy8vI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSB7ICooKGhjZl8xNiopYWRkcikrKyA9IElOX1BPUlRfV09SRCggcG9ydCApOyB9CisvLyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKigoaGNmXzE2KilhZGRyKSsrICk7IH0KKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGRzdCwgbikJd2hpbGUgKCBuLS0gKSB7ICpkc3QrKyA9IElOX1BPUlRfV09SRCggcG9ydCApOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgc3JjLCBuKQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKnNyYysrICk7IH0KKworLy8jZGVmaW5lIEhDRl9UWVBFCSggSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9XUEEgKQorI2RlZmluZSBIQ0ZfVFlQRQlIQ0ZfVFlQRV9XUEEKKworI2VuZGlmCS8vIFVTQgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmVlQlNEICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgX19GUkVFX0JTRF9fCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfRnJlZUJTRAorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKKworI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaW5jbHVkZSA8bWFjaGluZS9jcHVmdW5jLmg+CisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW53KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkob3V0dygoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpKSkKKworLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9CisqLworI2VuZGlmCS8vIF9fRlJFRV9CU0RfXworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFcgQSBWIEUgUCBPIEkgTiBUICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBTl84MQkvKiBCT1JMQU5EQyAqLworCisjZGVmaW5lIEVYVEVSTl9DICBleHRlcm4JLy8gbmVlZGVkIGJlY2F1c2UgREhGIHVzZXMgdGhpcyBpbnN0ZWFkIG9mICdleHRlcm4nCisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX0FQMQorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTQKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKKworI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CS8vNDkqMTAyNDAgbWljcm9zZWNvbmRzIEgvVyBmYWlsdXJlIHByb3RlY3Rpb24gdGltZXIKKworLy8jZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9NQgkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CS8qIGRlYnVnIGJ1aWxkIG9ubHkgKi8KKworI2lmICFkZWZpbmVkIEZBUgorI2RlZmluZSBGQVIgIGZhcgkJCQkJCS8vIHNlZ21lbnRlZCAxNiBiaXRzIG1vZGUKKyNlbmRpZiAvLyBGQVIKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkJCShpbnBvcnQoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCQkJKG91dHBvcnQoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJXAorCWFzbSB7IHB1c2ggZGk7IHB1c2ggZXM7IG1vdiBjeCxsZW47IGxlcyBkaSxhZGRyOyBtb3YgZHgscG9ydDsgcmVwIGluc3c7IHBvcCBlczsgcG9wIGRpIH0KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQlcCisJYXNtIHsgcHVzaCBzaTsgcHVzaCBkczsgbW92IGN4LGxlbjsgbGRzIHNpLGFkZHI7IG1vdiBkeCxwb3J0OyByZXAgb3V0c3c7IHBvcCBkczsgcG9wIHNpIH0KKworI2VuZGlmIC8vIFdWTEFOXzgxCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBBIFYgRSBMIEEgVSBOIEMgSCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXVkxBVU5DSAorCisjaW5jbHVkZSAiRHJpdmVyWC5oIgorZXh0ZXJuIEhXREVWSUNFKglnX3BEZXZpY2U7CisKKy8vI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJMCAgLy87PyB0byBnZXQgYXJvdW5kIGJyb3dzZXIgcHJvYmxlbQorCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQlId0lucHcoIGdfcERldmljZSwgcG9ydCApCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCUh3T3V0cHcoIGdfcERldmljZSwgcG9ydCwgdmFsdWUgKQorCisKKy8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggbGV0IHRoZSBwcm9jZXNzb3IgaGFuZGxlIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQorLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKKwkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCisJCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KKyovCisjZW5kaWYgLy8gV1ZMQVVOQ0gKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBDIEkgVCBTIFQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV0NJVFNUCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCTAgICAvL0FsdGhvdWdoIHRoZXJlIGlzIG5vIERVSSBzdXBwb3J0LCB3ZSBuZWVkIHRoaXMgdG8gZ2V0IC4uLgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAkvLy4uLmNvbXBhdGliaWx0eSBjaGVjayB0byBmdW5jdGlvbgorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkwCS8vLi4uOz90aGlzIGlzIHdvcnRoIGxvb2tpbmcgaW50byB0byBtYWtlIHRoaXMgYSBtb3JlCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAJLy8uLi4iZGVmaW5lZCIgSS9GIHNvIE9FTWVycyBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvCisKKy8vI2RlZmluZSBIQ0ZfRU5DQVAJCQkJSENGX0VOQ19OT05FCS8vdG8gZ2V0IGdvaW5nCisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorI2RlZmluZSBIQ0ZfVFlQRSAoSENGX1RZUEVfV1BBIHwgSENGX1RZUEVfUFJFTE9BREVEKSAvLyBIZXJtZXMtSSBmb3IgSENGNiwgSUkgZm9yIEhDRjcKKyNkZWZpbmUgCQlIQ0ZfRE1BCQkJCTEKKy8vI2RlZmluZSBMTEIJLy8hISEhTUlDIERlYnVnIE9ubHkKKyNpZiBkZWZpbmVkIExMQiAmJiAhKChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEpCitlcnI6IG5vIExMQiB1bmxlc3MgU1NOOworI2VuZGlmIC8vIExMQiAvIEhDRl9UWVBFX1dQQQorLy8jZGVmaW5lIEhDRl9BTElHTiAyCisjZGVmaW5lIEhDRl9ETFYJCTEJCQkvL2p1c3QgdG8gY2hhbmdlIG1lbW9yeSBsYXlvdXQgPz8/Pzs/CisvL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9TV19TVVAJLy8gbG9nZ2luZyB2aWEgSGVybWVzIHN1cHBvcnQgcmVnaXN0ZXJyCisvLyNkZWZpbmUgSENGX0FTU0VSVAkJSENGX0FTU0VSVF9NQgkJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorCisjaWYgZGVmaW5lZCBfX0dOVUNfXworI2luY2x1ZGUgInN0ZGlvLmgiCisvLyNpbmNsdWRlICJ1bmlzdGQuaCIJLy9pb3Blcm0gICBsaWJjNQorI2luY2x1ZGUgInN5cy9pby5oIgkvL2lvcGVybSAgIGdsaWJjCisjZGVmaW5lIGV4dGVybgkJLy9zZWUgSU8gUG9ydCBQcm9ncmFtbWluZyBtaW5pLUhPV1RPCisvLyNpbmNsdWRlICJhc20vaW8uaCIJLy8KKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJaW53KCAoaGNmX2lvKShwb3J0KSApCisjZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkJCQlpbmwoIChoY2ZfaW8pKHBvcnQpICkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJb3V0dyggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApCisjZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKQlvdXRsKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKKyNlbHNlCisjcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlOiA0MDAxICkKKyNkZWZpbmUgRkFSICBfX2ZhcgkJCQkJLy8gc2VnbWVudGVkIDE2IGJpdHMgbW9kZQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjb25pby5oPgorI2lmbmRlZiBfREVCVUcKKyNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCisjZW5kaWYgLy8gX0RFQlVHCisKKyNpZmRlZiBMT0cKK2V4dGVybiBGSUxFKiB1dG1fbG9nZmlsZTsKK2hjZl8xNglpcHcoIGhjZl8xNiBwb3J0ICk7CitoY2ZfOAlpcGIoIGhjZl8xNiBwb3J0ICk7Cit2b2lkCW9wdyggaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSApOwordm9pZAlvcGIoIGhjZl8xNiBwb3J0LCBoY2ZfOCB2YWx1ZSApOworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCWlwdyggKGhjZl9pbykocG9ydCkgKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvcHcoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQorI2Vsc2UgLy8gTE9HCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKyNlbmRpZiAvLyBMT0cKKworI2lmIDEgLy9BU00gZXhhbXBsZQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSBfX2FzbQkJXAorewkJCQkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZGkJCQkJCQkJCQkJXAorCV9fYXNtIHB1c2ggZXMJCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBjeCxsZW4JCQkJCQkJCQlcCisJX19hc20gbGVzIGRpLGFkZHIJCQkJCQkJCQlcCisJX19hc20gbW92IGR4LHBvcnQJCQkJCQkJCQlcCisJX19hc20gcmVwIGluc3cJCQkJCQkJCQkJXAorCV9fYXNtIHBvcCBlcwkJCQkJCQkJCQlcCisJX19hc20gcG9wIGRpCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JCVwKK3sJCQkJCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIHNpCQkJCQkJCQkJCVwKKwlfX2FzbSBwdXNoIGRzCQkJCQkJCQkJCVwKKwlfX2FzbSBtb3YgY3gsbGVuCQkJCQkJCQkJXAorCV9fYXNtIGxkcyBzaSxhZGRyCQkJCQkJCQkJXAorCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQkJXAorCV9fYXNtIHJlcCBvdXRzdwkJCQkJCQkJCQlcCisJX19hc20gcG9wIGRzCQkJCQkJCQkJCVwKKwlfX2FzbSBwb3Agc2kJCQkJCQkJCQkJXAorfQorCisjZW5kaWYJLy8gYXNtIGV4YW1wbGUKKworI2VuZGlmIC8vIF9fR0NDX18KKworI2lmICEgZGVmaW5lZCBJTl9QT1JUX1NUUklOR18xNgorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikgIHdoaWxlIChuLS0pIFwKKwl7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoKGhjZl8xNiBGQVIqKWFkZHIpKys7IH0KKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKSB3aGlsZSAobi0tKSBcCisJeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKTsgKChoY2ZfMTYgRkFSKilhZGRyKSsrOyB9CisjZW5kaWYgLy8gSU5fUE9SVF9TVFJJTkdfMTYKKworI2VuZGlmCS8vIFdDSVRTVAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTW90b3JvbGEgUG93ZXIgUEMgODAwIGZhbWlseSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGtub3duIHVzZXJzOiBMSEBJCisgKi8KKworI2lmIGRlZmluZWQgSV9NUEM4WFgKKworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lECQkwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTEKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAorCisjZGVmaW5lIEhDRl9IU0lfVkFSCQkJCTEKKworI2RlZmluZSBIQ0ZfQklHX0VORElBTgkJCTEKKyNkZWZpbmUgSENGX0lPIAkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaW5jbHVkZSAib19wb3J0YmwuaCIKKyNpbmNsdWRlICJpcGNtY2lhLmgiCit0eXBlZGVmIG9fdWludDhfdCAgaGNmXzg7Cit0eXBlZGVmIG9fdWludDE2X3QgaGNmXzE2OwordHlwZWRlZiBvX3VpbnQzMl90IGhjZl8zMjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgX2xpbnQKKyNlbHNlCithc20gaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkKK3sKKyUgcmVnIHBvcnQKKyAgICBsaGJyeCByMyxyMCxwb3J0CisgICAgZWllaW8KK30KKyNlbmRpZiAvLyBfbGludAorCisKKyNpZmRlZiBfbGludAorI2Vsc2UKK2FzbSB2b2lkIE9VVF9QT1JUX1dPUkQoaW50IHBvcnQsIGhjZl8xNiB2YWx1ZSkKK3sKKyUgcmVnIHBvcnQsIHZhbHVlCisgICAgc3RoYnJ4IHZhbHVlLHIwLHBvcnQKKyAgICBlaWVpbworfQorI2VuZGlmIC8vIF9saW50CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKSAgICAgICAgICAgICAgIFwKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhjZl8xNiAqZCA9ICh2b2xhdGlsZSBoY2ZfMTYgKikoYWRkcik7ICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChsLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICpkKysgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgICAgICAgICAgIFwKKyAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKSAgICAgICAgICAgXAorICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgXAorICAgICAgd2hpbGUgKGwtLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCkgPSAqcysrOyAgICAgICAgICAgXAorICAgICAgICAgRUlFSU8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorCisjZW5kaWYJLy8gSV9NUEM4WFgKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIERpYWIgb3IgSGlnaCBDIDI5SyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGtub3duIHVzZXJzOiBHS0BDCisgKi8KKworI2lmIGRlZmluZWQgX0FNMjlLCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJQ09NUF9JRF9BUDEKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJMQorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkwCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkxCisjZGVmaW5lIEhDRl9JTyAJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2RlZmluZSBTd2FwQnl0ZXModCkgICAgLypsaW50IC1lNTcyKi8oKCh0KSA+PiA4KSArICgoKHQpICYgMHhmZikgPDwgOCkpLypsaW50ICtlNTcyKi8KKworI2lmIGRlZmluZWQgX19wcGMKKyAgICAjaWZuZGVmIF9fR05VQ19fCisgICAgICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCisgICAgI2VuZGlmCisKKyAgICAjaWYgISBkZWZpbmVkIF9saW50CisgICAgICAgICNkZWZpbmUgRUlFSU8oKSAgICAgX19hc21fXygiIGVpZWlvIikKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIEVJRUlPKCkKKyAgICAjZW5kaWYKKworICAgIHN0YXRpYyBoY2ZfMTYgSU5fUE9SVF9XT1JEKGludCBwb3J0KSB7CisgICAgICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOworICAgICAgICB2YWx1ZSA9IFN3YXBCeXRlcyh2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgXAorICAgICAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IFN3YXBCeXRlcyh2YWx1ZSk7IEVJRUlPKCk7IH0KKyNlbHNlCisgICAgI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgKCoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpKQorICAgICNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgKCoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gKHZhbHVlKSkKKyNlbmRpZiAvLyBfX3BwYworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdCwgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IElOX1BPUlRfV09SRChwb3J0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IFN3YXBCeXRlcyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdCwgKnMgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAqcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9QT1JUX1dPUkQocG9ydCwgU3dhcEJ5dGVzKHQpKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgUFJPRFVDVCA9PSA5MTUwCisgICAgI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorICAgICN1bmRlZiBNU0ZfQ09NUE9ORU5UX0lECisjZW5kaWYgLy8gOTE1MAorCisjZW5kaWYJLy8gX0FNMjlLCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEM4NjAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBrbm93biB1c2VyczogUlIKKyAqLworCisjaWYgZGVmaW5lZCBDUFUKKyNpZiBDUFUgPT0gUFBDODYwCisKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMAorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkxCisjZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAKKworI2RlZmluZSBIQ0ZfQklHX0VORElBTgkJCTEKKyNkZWZpbmUgSENGX0lPIAkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjZGVmaW5lIFN3YXBCeXRlcyh0KSAgICAvKmxpbnQgLWU1NzIqLygoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkvKmxpbnQgK2U1NzIqLworCisjaWZuZGVmIF9fR05VQ19fCisgICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIF9saW50CisgICAgI2RlZmluZSBFSUVJTygpICAgICBfX2FzbV9fKCIgZWllaW8iKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVJRUlPKCkKKyNlbmRpZgorCitzdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgeworICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOworICAgIHZhbHVlID0gU3dhcEJ5dGVzKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CisgICAgI2lmZGVmIF9fR05VQ19fCisgICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgc2VydmVzIHRvIGF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5ncyB0aGF0CisgICAgICAgICAqIElOX1BPUlRfV09SRCgpIGlzIG5vdCB1c2VkIGluIHNvbWUgZmlsZXMgKi8KKyAgICAgICAgKHZvaWQpSU5fUE9SVF9XT1JEOworICAgICNlbmRpZgorfQorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgXAorICAgICAgICB7ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gU3dhcEJ5dGVzKHZhbHVlKTsgRUlFSU8oKTsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBoY2ZfMTYgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IElOX1BPUlRfV09SRChwb3J0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IFN3YXBCeXRlcyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBoY2ZfMTYgKnMgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAqcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9QT1JUX1dPUkQocG9ydCwgU3dhcEJ5dGVzKHQpKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgUFJPRFVDVCA9PSA5MTUwCisgICAgI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAorICAgICN1bmRlZiBNU0ZfQ09NUE9ORU5UX0lECisjZW5kaWYKKworI2VuZGlmCS8qIFBQQzg2MCAqLworI2VuZGlmCS8qIENQVSAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNaWNyb3RlYyBSZXNlYXJjaCA4MFg4NiBDb21waWxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorCisvLyN1bmRlZiBIQ0ZfVFlQRQkJCQkJCQkJCS8vIEhlcm1lcy1JIFN0YXRpb24gRi9XIHdpdGhvdXQgU1NOIHN1cHBvcnQKKworI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUiAgICAgICAwCisjZGVmaW5lIE1TRl9DT01QT05FTlRfSUQgICAgICAgIDAKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIgMQorI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAwCisKK2V4dGVybiBpbnQgZmFyIGlucCggaW50ICk7CitleHRlcm4gdm9pZCBmYXIgb3V0cCggaW50LCBpbnQgKTsKK2V4dGVybiBpbnQgZmFyIGlucHcoIGludCApOworZXh0ZXJuIHZvaWQgZmFyIG91dHB3KCBpbnQsIGludCApOworCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJKChoY2ZfMTYpaW5wdyggKGhjZl9pbykocG9ydCkgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKCh2b2lkKW91dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2ICpkID0gKGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgKmQrKyA9ICBJTl9QT1JUX1dPUkQocG9ydCk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2ICpzID0gKGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIE9VVF9QT1JUX1dPUkQocG9ydCwgKnMrKyk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgkvKiBNaWNyb3RlYyA4MFg4NiBDIENvbXBpbGVyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBBIFYgRSBMIEEgTiAgRSBDICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBrbm93biB1c2VyczogS00KKyAqLworCisjaWZkZWYgbWM2ODMwMgorCisjZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX0VDCisKKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQlNQUpPUl9WRVJTSU9OCisjZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQlNSU5PUl9WRVJTSU9OCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkJMQorI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjZGVmaW5lIFN3YXBCeXRlcyh0KQkvKmxpbnQgLWU1NzIqLygoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkvKmxpbnQgK2U1NzIqLworCisjZGVmaW5lIFBDTUNJQV9BRERSRVNTIDB4YzgwMDAwVUwKKworI2RlZmluZSBJTl9QT1JUXzJCWVRFUyhwb3J0KQkJCSAoKihoY2ZfMTYgKikocG9ydCkpCisjaWYgMAorc3RhdGljIGhjZl8xNiBJTl9QT1JUX1dPUkQoaGNmXzMyIHBvcnQpIC8vIHNob3VsZCBiZSBoY2ZfaW8sIG5vdCBoY2ZfMzIKK3sKKyAgaGNmXzE2IHdvcmQgPSBJTl9QT1JUXzJCWVRFUyhwb3J0KTsKKyAgcmV0dXJuIFN3YXBCeXRlcyh3b3JkKTsKK30KKyNlbHNlCitzdGF0aWMgaGNmXzE2IHN3YXBfdmFyOworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgXAorICAoKChzd2FwX3ZhciA9IElOX1BPUlRfMkJZVEVTKHBvcnQpKSA+PiA4KSArICgoKHN3YXBfdmFyKSAmIDB4ZmYpIDw8IDgpKQorI2VuZGlmCisjZGVmaW5lIE9VVF9QT1JUXzJCWVRFUyhwb3J0LCB2YWx1ZSkJICgqKGhjZl8xNiAqKShwb3J0KSA9IChoY2ZfMTYpKHZhbHVlKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJCSBPVVRfUE9SVF8yQllURVMocG9ydCwgU3dhcEJ5dGVzKHZhbHVlKSkKKworLyoKKyNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQkgIFwKKwl3aGlsZSAoKGxlbiktLSkgeyooaGNmXzE2ICopKGFkZHIpID0gSU5fUE9SVF8yQllURVMocG9ydCk7ICgoY2FzdClhZGRyKSArPSAyOyB9CisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCSAgXAorCXdoaWxlICgobGVuKS0tKSB7T1VUX1BPUlRfMkJZVEVTKChwb3J0KSwgKihoY2ZfMTYgKikoYWRkcikpIDsgKChjYXN0KWFkZHIpICArPSAyOyB9CisqLworCisjZW5kaWYJLyogbWM2ODMwMiAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE5HQVAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBfX1ZYX1dPUktTX18JLyogVnhXb3JrcyAqLworCisjaWYgZGVmaW5lZCBXTENfU1RBVElPTgorLy8jdW5kZWYgSENGX1RZUEUgCQkJCS8qIEhlcm1lcy1JIFN0YXRpb24gRi9XIHdpdGhvdXQgU1NOIHN1cHBvcnQgKi8KKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX1ZYX1dPUktTX0VORFNUQQorI2Vsc2UKKyNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX1ZYX1dPUktTX0VOREFQCisjZW5kaWYJLy8gV0xDX1NUQVRJT04KKworI2RlZmluZSBIQ0ZfWUlFTEQgKHRhc2tEZWxheSgwKSA9PSAwKQorCisjZGVmaW5lICAgIE1TRl9DT01QT05FTlRfVkFSICAgICAgICAgICAgICAxCisjZGVmaW5lICAgIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSICAgICAgICAxCisjZGVmaW5lICAgIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSICAgICAgICAwCisKKy8vICNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX01CCS8vIGxvZ2dpbmcgdmlhIE1haWxib3gKKworI2lmIGRlZmluZWQgUEM0ODZCU1AKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgICAgICAgICAgICAoc3lzSW5Xb3JkICgoaGNmX2lvKShwb3J0KSkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgICAoc3lzT3V0V29yZCAoKGhjZl9pbykocG9ydCksIChoY2ZfMTYpICh2YWx1ZSkpKQorI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBuKSAgICAgICAgKHN5c0luV29yZFN0cmluZyAoKGhjZl9pbykocG9ydCksIGFkZHIsIG4pKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbikgICAgICAgIChzeXNPdXRXb3JkU3RyaW5nICgoaGNmX2lvKShwb3J0KSwgYWRkciwgbikpCisKKyNlbGlmIGRlZmluZWQgQVMyMDAwQlNQCisKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworLyogRGVmaW5lIFBDSSBzdHVmZiBoZXJlLiAqLwordW5zaWduZWQgc2hvcnQgc3lzUmVhZDE2KCB1bnNpZ25lZCBzaG9ydCAqcG9ydCApOwordm9pZCBzeXNXcml0ZTE2KCB1bnNpZ25lZCBzaG9ydCAqcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUgKTsKKworI2RlZmluZSBQQ0lfSU5fQllURSggcG9ydCApIFwKKwkqKHVuc2lnbmVkIGNoYXIgKikoIHBvcnQgKQorCisjZGVmaW5lIFBDSV9JTl9XT1JEKCBwb3J0ICkgXAorCXN5c1JlYWQxNiggKHVuc2lnbmVkIHNob3J0ICopKCBwb3J0ICkgKQorCisjZGVmaW5lIFBDSV9PVVRfQllURSggcG9ydCwgdmFsdWUgKSBcCisJKih1bnNpZ25lZCBjaGFyICopKCBwb3J0ICkgPSAodW5zaWduZWQgY2hhcikoIHZhbHVlICkKKworI2RlZmluZSBQQ0lfT1VUX1dPUkQoIHBvcnQsIHZhbHVlICkgXAorCXN5c1dyaXRlMTYoICh1bnNpZ25lZCBzaG9ydCAqKSggcG9ydCApLCAodW5zaWduZWQgc2hvcnQpKCB2YWx1ZSApICkKKworI2RlZmluZSBJTl9QT1JUX1dPUkQoIHBvcnQgKSBcCisJUENJX0lOX1dPUkQoIHBvcnQgKQorCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQoIHBvcnQsIHZhbHVlICkgXAorCVBDSV9PVVRfV09SRCggcG9ydCwgdmFsdWUgKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBidWYsIGxlbiApIFwKKwlkbyB7IFwKKwkJaGNmXzE2ICpwOyBcCisJIFwKKwkgCWZvciAoIHAgPSAoaGNmXzE2ICopKGJ1Zik7IHAgPCAmKCAoaGNmXzE2ICopKGJ1ZikgKVsgKGludClsZW4gXTsgcCsrICkgeyBcCisJCQkqcCA9IFBDSV9JTl9XT1JEKCBwb3J0ICk7IFwKKwkJfSBcCisJfSB3aGlsZSAoIDAgKQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYnVmLCBsZW4gKSBcCisJZG8geyBcCisJCWNvbnN0IGhjZl8xNiAqcDsgXAorCSBcCisJIAlmb3IgKCBwID0gKGNvbnN0IGhjZl8xNiAqKSggYnVmICk7IHAgPCAmKCAoY29uc3QgaGNmXzE2ICopKGJ1ZikgKVsgKGludClsZW4gXTsgcCsrICkgeyBcCisJCQlQQ0lfT1VUX1dPUkQoIHBvcnQsICpwICk7IFwKKwkJfSBcCisJfSB3aGlsZSAoIDAgKQorCisjZWxpZiBkZWZpbmVkIEZBRFM4NjBCU1AgLyogZWxpZiBkZWZpbmVkIEFTMjAwMEJTUCAqLworCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOIDEKKworI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTworCisjaWZuZGVmIF9fR05VQ19fCisgICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIF9saW50CisgICAgI2RlZmluZSBFSUVJTygpICAgICBfX2FzbV9fKCIgZWllaW8iKQorI2Vsc2UKKyAgICAjZGVmaW5lIEVJRUlPKCkKKyNlbmRpZgorCitzdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgeworICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOworICAgIHZhbHVlID0gKCh2YWx1ZSAmIDB4ZmYwMCkgPj4gOCkgKyAoKHZhbHVlICYgMHgwMGZmKSA8PCA4KTsKKy8qICB2YWx1ZSA9IENOVl9MSVRUTEVfVE9fU0hPUlQodmFsdWUpOyAqLworICAgIHJldHVybiB2YWx1ZTsKKyAgICAjaWZkZWYgX19HTlVDX18KKyAgICAgICAgLyogdGhlIGZvbGxvd2luZyBzZXJ2ZXMgdG8gYXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKKyAgICAgICAgICogSU5fUE9SVF9XT1JEKCkgaXMgbm90IHVzZWQgaW4gc29tZSBmaWxlcyAqLworICAgICAgICAodm9pZClJTl9QT1JUX1dPUkQ7CisgICAgI2VuZGlmCit9CisKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IENOVl9TSE9SVF9UT19MSVRUTEUodmFsdWUpOyBFSUVJTygpOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpkID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkKysgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9ICpzKys7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUVJTygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2VsaWYgZGVmaW5lZCBEQVlUT05BQlNQCisKKyNkZWZpbmUgSENGX0JJR19FTkRJQU4gMQorCisjZGVmaW5lIEhDRl9JTyAJCQkJCQlIQ0ZfSU9fTUVNCQkvLyBvdmVycnVsZSBzdGFuZGFyZCBQb3J0IEkvTyB3aXRoIE1lbW9yeSBtYXBwZWQgSS9PCisKKyNpZm5kZWYgX19HTlVDX18KKyAgICAjZGVmaW5lIF9fYXNtX18gICAgIGFzbQorI2VuZGlmCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpICAgICAgICAgICAgICAoc3lzT3Jpbm9jb0luV29yZCgodW5zaWduZWQgbG9uZykocG9ydCkpKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsdmFsdWUpICAgICAgIChzeXNPcmlub2NvT3V0V29yZCgodW5zaWduZWQgbG9uZykocG9ydCksICh1bnNpZ25lZCBzaG9ydCkodmFsdWUpKSkKKworI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LGFkZHIsbGVuKSAgIChzeXNPcmlub2NvSW5TdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29PdXRTdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgICAgc3lzT3Jpbm9jb0luQnl0ZSAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCAgIHN5c09yaW5vY29JbldvcmQgICAgKHVuc2lnbmVkIGxvbmcgcG9ydCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvSW5TdHJpbmcgICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbik7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRCeXRlICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgY2hhciB2YWx1ZSk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvT3V0V29yZCAgICh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRTdHJpbmcgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKKworI2VsaWYgZGVmaW5lZCBBTFBIQV9CU1AKKworI2RlZmluZSBIQ0ZfQklHX0VORElBTiAxCisKKyNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KKworI2lmbmRlZiBfX0dOVUNfXworICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCisjZW5kaWYKKworI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgICAgICAgICAgICAgIChzeXNPcmlub2NvSW5Xb3JkKCh1bnNpZ25lZCBsb25nKShwb3J0KSkpCisjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCx2YWx1ZSkgICAgICAgKHN5c09yaW5vY29PdXRXb3JkKCh1bnNpZ25lZCBsb25nKShwb3J0KSwgKHVuc2lnbmVkIHNob3J0KSh2YWx1ZSkpKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29JblN0cmluZygocG9ydCksIChhZGRyKSwgKGxlbikpKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCxhZGRyLGxlbikgICAoc3lzT3Jpbm9jb091dFN0cmluZygocG9ydCksIChhZGRyKSwgKGxlbikpKQorCitleHRlcm4gdW5zaWduZWQgY2hhciAgICBzeXNPcmlub2NvSW5CeXRlICAgICh1bnNpZ25lZCBsb25nIHBvcnQpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0ICAgc3lzT3Jpbm9jb0luV29yZCAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29JblN0cmluZyAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKKworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dEJ5dGUgICAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbHVlKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRXb3JkICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dFN0cmluZyAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4pOworCisjZWxzZQorCitlcnI6IC8qIGNvbW1lbnRlZCBoZXJlICovIC8qCSJCU1AgaXMgbm90IGRlZmluZWQuLi4iICovCisKKyNlbmRpZgkvKiBlbHNlIFBDNDg2QlNQICovCisKKyNlbmRpZgkvLyBfX1ZYX1dPUktTX18KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBWWFdPUktTLiBNb3Rvcm9sYSBTYW5kcG9pbnQgUG93ZXJQQyA4MjRYICoqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBfX1ZYX1dPUktTX1NBTkRQT0lOVF84MjRYX18KKworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNpbmNsdWRlIDxzeXNMaWIuaD4KKyNpbmNsdWRlIDx0YXNrTGliLmg+CisKKyNpZmRlZiBXVkxBTl81MworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKKyNlbmRpZiAvKiBXVkxBTl81MyAqLworCisjaWZkZWYgV1ZMQU5fNTQKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EQVAKKyNlbmRpZiAvKiBXVkxBTl81NCAqLworCisjaWZkZWYgV1ZMQU5fNTYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5ECisjZW5kaWYgLyogV1ZMQU5fNTYgKi8KKworI2lmICFkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKyNlcnJvciAieW91IG11c3QgZGVmaW5lIGFuIE1TRiBjb21wb25lbnQgSUQ6IFdWTEFOXzUzLCBXVkxBTl81NCwgV1ZMQU5fNTYiCisjZW5kaWYKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKworI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cKKyNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9DRFMgfCBIQ0ZfRERTICkKKy8vI2RlZmluZSBIQ0ZfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICggSENGX0REUyApCisKKyNpZm5kZWYgSENGX0FDVF9XQUtFVVAKKyNkZWZpbmUgSENGX0FDVF9XQUtFVVAgICAgICAgICAgICAgICAgICAweDFECisjZW5kaWYgLy8gSENGX0FDVF9XQUtFVVAKKworI2lmIGRlZmluZWQgRkFUTklDIHwgZGVmaW5lZCBCRUFHTEVfSDI1MworI2RlZmluZSBUMV9fSENGX1RZUEUgICAgICAgICAgICAgICAgICAgIEhDRl9UWVBFX1NUQQorI2Vsc2UKKyNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9BUCB8IEhDRl9UWVBFX1NUQQorI2VuZGlmCisKKyNpZmRlZiBIRVJNRVNfVVNCCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1VTQikKKyNlbHNlIC8vIEhFUk1FU19VU0IKKyNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQorI2VuZGlmIC8vIEhFUk1FU19VU0IKKworI2lmZGVmIF9XQVJQCisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9ISUkpCisjZW5kaWYgLy8gV0FSUAorCisjaWZkZWYgX0NDWAorI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUgfCBIQ0ZfVFlQRV9DQ1gpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUpCisjZW5kaWYgLy8gX0NDWAorCisjZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSkKKworLy8gRGVmYXVsdCB0byBUWVBFX0FQICsgU1NOIQorI2RlZmluZSBIQ0ZfVFlQRQkJCQkJCShUNV9fSENGX1RZUEUgKQorCisKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAorCisjZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgICAgICAgICBIQ0ZfSU9fTUVNCisjZGVmaW5lIEhDRl9ETUEgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhDRl9NRU1fSU8gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEhDRl9CSUdfRU5ESUFOICAgICAgICAgICAgICAxCisKKy8vI2RlZmluZSBzdXBwb3J0XzMyYml0cyAxCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJICAgICAgICAoc3lzSW5Xb3JkKCAoaGNmX2lvKShwb3J0KSApKQorI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkgICAgICAgIChzeXNPdXRXb3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkpCisjZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkJCQkgICAgICAgIChzeXNJbkxvbmcoIChoY2ZfaW8pKHBvcnQpICkpCisjZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKQkgICAgICAgIChzeXNPdXRMb25nKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkpCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikJICAgIChzeXNJbldvcmRTdHJpbmcoKGhjZl9pbykocG9ydCksIChoY2ZfMTYgKilkc3QsIG4pKQorI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgc3JjLCBuKSAgICAoc3lzT3V0V29yZFN0cmluZygoaGNmX2lvKShwb3J0KSwgKGhjZl8xNiAqKXNyYywgbikpCisKKyNpZmRlZiBXVkxBTl9ERUJVRworI2RlZmluZSBEQkcgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBfREVCVUcgICAgICAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisKKy8qIHdlJ2xsIG5lZWQgdG8gYWRkIHRoZXNlIHByaW50cyBzb21lZGF5ICovCisjZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQorI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkKKworI2RlZmluZSBIQ0ZfSU5URVJGQUNFX0NPTk5FQ1QoaWZicCkKKyNkZWZpbmUgSENGX0lOVEVSRkFDRV9ESVNDT05ORUNUKGlmYnApCisjZGVmaW5lIEhDRl9FTlRFUl9JTlRFUkZBQ0VfRlVOQ1QoaWJmYikKKyNkZWZpbmUgSENGX0xFQVZFX0lOVEVSRkFDRV9GVU5DVChpZmJwKQorCisjZGVmaW5lIENOVl9FTkRfSU5UKHcpICAgICggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKKyNkZWZpbmUgQ05WX0xJVFRMRV9UT19JTlQodykJQ05WX0VORF9JTlQodykKKyNkZWZpbmUgQ05WX0lOVF9UT19MSVRUTEUodykJQ05WX0xJVFRMRV9UT19JTlQodykKKworI2VuZGlmIC8qIF9fVlhfV09SS1NfU0FORFBPSU5UXzgyNFhfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFZYV09SS1MuIEFSTSBUODMwMCBJUFBob25lICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCggSVBUX1Q4MzAwICkgfHwgZGVmaW5lZCggSVBUX1Q4MzA3ICkKKworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNpbmNsdWRlIDxzeXNMaWIuaD4KKyNpbmNsdWRlIDx0YXNrTGliLmg+CisKKyNkZWZpbmUgSENGX0FMSUdOICAgICAgICAgICAgICAgICAgIDQgICAgICAgLyogZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50ICovCisKKyNkZWZpbmUgQkVBR0xFX0gyNTMJLyogSGVybWVzIDIuNS4zIGJ1aWxkLCBiZXR0ZXIgdG8gYmUgaW4gdGhlIHByb2plY3QgZmlsZSAqLworI2RlZmluZSBPT1JfRERTCQkvKiBIZXJtZXMgMi41LjMgYnVpbGQsIGJldHRlciB0byBiZSBpbiB0aGUgcHJvamVjdCBmaWxlICovCisjZGVmaW5lIEZBVE5JQworCisKKyNpZmRlZiBXVkxBTl81MworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKKyNlbmRpZiAvKiBXVkxBTl81MyAqLworCisjaWZkZWYgV1ZMQU5fNTQKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EQVAKKyNlbmRpZiAvKiBXVkxBTl81NCAqLworCisjaWZkZWYgV1ZMQU5fNTYKKyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5ECisjZW5kaWYgLyogV1ZMQU5fNTYgKi8KKworI2lmICFkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKKyNlcnJvciAieW91IG11c3QgZGVmaW5lIGFuIE1TRiBjb21wb25lbnQgSUQ6IFdWTEFOXzUzLCBXVkxBTl81NCwgV1ZMQU5fNTYiCisjZW5kaWYKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKKworI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cKKy8vI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cgfCBIQ0ZfRVhUX01CCisjZGVmaW5lIEhDRl9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgKCBIQ0ZfQ0RTIHwgSENGX0REUyApCisvLyNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9ERFMgKQorCisjaWZuZGVmIEhDRl9BQ1RfV0FLRVVQCisjZGVmaW5lIEhDRl9BQ1RfV0FLRVVQICAgICAgICAgICAgICAgICAgMHgxRAorI2VuZGlmIC8vIEhDRl9BQ1RfV0FLRVVQCisKKyNpZiBkZWZpbmVkIEZBVE5JQyB8fCBkZWZpbmVkIEJFQUdMRV9IMjUzCisjZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfU1RBCisjZWxzZQorLy8jZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9TVEEKKyNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9TVEEJCS8qIGR6LCBTdGF0aW9uIGNvZGUgb25seSAqLworI2VuZGlmCisKKyNpZmRlZiBIRVJNRVNfVVNCCisjZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1VTQikKKyNlbHNlIC8vIEhFUk1FU19VU0IKKyNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQorI2VuZGlmIC8vIEhFUk1FU19VU0IKKworI2lmZGVmIF9XQVJQCisjZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCisjZWxzZSAvLyBfV0FSUAorI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9ISUkpCisvLyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfSElJKQkvKiBkei4gbm8gV1BBIHN1cHBvcnQgYXQgdGhpcyB0aW1lLCB0ZXN0IGNvZGUgKi8KKyNlbmRpZiAvLyBXQVJQCisKKyNpZmRlZiBfQ0NYCisjZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0NDWCkKKyNlbHNlIC8vIF9XQVJQCisjZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSkKKyNlbmRpZiAvLyBfQ0NYCisKKyNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFKQorCisvLyBEZWZhdWx0IHRvIFRZUEVfQVAgKyBTU04hCisjZGVmaW5lIEhDRl9UWVBFCQkJCQkJKFQ1X19IQ0ZfVFlQRSApCisKKworI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMgorI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAorCisjZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgICAgICAgICBIQ0ZfSU9fTUVNCisjZGVmaW5lIEhDRl9ETUEgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhDRl9NRU1fSU8gICAgICAgICAgICAgICAgICAxCisKKworLyogRW5kaWFuIGlzIGRldGVybWluZWQgYnkgdnhXb3JrcyBwcm9qZWN0IGNvbXBpbGUgb3B0aW9uICovCisjaWYgKF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOKQorI3VuZGVmICBIQ0ZfTElUVExFX0VORElBTgorI2RlZmluZSBIQ0ZfQklHX0VORElBTiAgICAgICAgICAgICAgMQorI2VuZGlmCisKKworI2RlZmluZSBDTlZfRU5EKHcpICAgICggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKKyNpZiBkZWZpbmVkIEhDRl9CSUdfRU5ESUFOCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEIgSSBHICAgRSBOIEQgSSBBIE4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTlZfTElUVExFX1RPX0lOVCh3KSAgICBDTlZfRU5EKHcpCS8vICAgIGVuZGlhbmVzcyBjb252ZXJzaW9uIG5lZWRlZAorI2RlZmluZSBDTlZfQklHX1RPX0lOVCh3KQkJKHcpCQkJLy8gbm8gZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCisjZWxzZQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTCBJIFQgVCBMIEUgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENOVl9MSVRUTEVfVE9fSU5UKHcpIAkodykJCQkvLyBubyBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNkZWZpbmUgQ05WX0JJR19UT19JTlQodykgICAgICAgQ05WX0VORCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisvLyBjb252ZXJzaW9uIG1hY3JvcyB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIGluIG90aGVyIG1hY3JvcworI2RlZmluZSBDTlZfSU5UX1RPX0xJVFRMRSh3KQlDTlZfTElUVExFX1RPX0lOVCh3KQorI2RlZmluZSBDTlZfSU5UX1RPX0JJRyh3KQkJQ05WX0JJR19UT19JTlQodykKKworCisKKyNkZWZpbmUgSU5fUE9SVF9XT1JEKCBwb3J0ICkgICAgICAgICAgICAqKCh2b2xhdGlsZSBoY2ZfMTYgKikoIHBvcnQgKSkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRCggcG9ydCwgdmFsdWUgKSAgICAqKCh2b2xhdGlsZSBoY2ZfMTYgKikoIHBvcnQgKSkgPSAoKGhjZl8xNikoIHZhbHVlICkpCisvLyNkZWZpbmUgSU5fUE9SVF9CWVRFKCBwb3J0ICkgICAgICAgICAgICAqKCh2b2xhdGlsZSBoY2ZfOCAqKSggcG9ydCApKQorCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HKCBwb3J0LCBhZGRyLCBsZW4pIHsJCVwKKwl1bnNpZ25lZCBsID0gbGVuOwkJCQkJCQkJXAorCWhjZl8xNiAgKmQgPSAoaGNmXzE2ICopKGFkZHIpOwkJCQkJXAorCWhjZl8xNiAgIHQ7CQkJCQkJCQkJCVwKKwl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAorCQl0ID0gSU5fUE9SVF9XT1JEKHBvcnQpOwkJCQkJCVwKKwkJKmQrKyA9IENOVl9MSVRUTEVfVE9fSU5UKHQpOwkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30gLy8gSU5fUE9SVF9TVFJJTkcKKworI2RlZmluZSBPVVRfUE9SVF9TVFJJTkcoIHBvcnQsIGFkZHIsIGxlbikgewkJXAorCXVuc2lnbmVkIGwgPSAobGVuKTsJCQkJCQkJCVwKKwloY2ZfMTYgICpzID0gKGhjZl8xNiAqKShhZGRyKTsJCQkJCVwKKwloY2ZfMTYgICB0OwkJCQkJCQkJCQlcCisJd2hpbGUgKGwtLSkgewkJCQkJCQkJCVwKKwkJdCA9ICpzKys7CQkJCQkJCQkJXAorCQl0ID0gQ05WX0xJVFRMRV9UT19JTlQodCk7CQkJCQlcCisJCU9VVF9QT1JUX1dPUkQocG9ydCwgdCk7CQkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9IC8vIE9VVF9QT1JUX1NUUklORworCisjZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikJICAgIHsJXAorCXVuc2lnbmVkIGwgPSAobik7CQkJCQkJCQlcCisJaGNmXzE2ICAqZCA9IChoY2ZfMTYgKikoZHN0KTsJCQkJCVwKKwl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAorCQkqZCsrID0gSU5fUE9SVF9XT1JEKHBvcnQpOwkJCQkJXAorCX0JCQkJCQkJCQkJCQlcCit9IC8vIElOX1BPUlRfU1RSSU5HXzE2CisKKyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIHNyYywgbikJewlcCisJaGNmXzE2ICAgdDsJCQkJCQkJCQkJXAorCWludCBsID0gKG4pOwkJCQkJCQkJCVwKKwloY2ZfMTYgICpzID0gKGhjZl8xNiAqKShzcmMpOwkJCQkJXAorCXdoaWxlIChsLS0pIHsJCQkJCQkJCQlcCisJCXQgPSAqcysrOwkJCQkJCQkJCVwKKwkJT1VUX1BPUlRfV09SRChwb3J0LCB0KTsJCQkJCQlcCisJfQkJCQkJCQkJCQkJCVwKK30gLy8gT1VUX1BPUlRfU1RSSU5HXzE2CisKKy8qICNkZWZpbmUgSENGX1lJRUxEICAgICAgICAgICAgICAgICAgICAgICAodGFza0RlbGF5KDApID09IDApICovCisKKworCisjaWZkZWYgV1ZMQU5fREVCVUcKKyNkZWZpbmUgREJHICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisvKiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVzZSBwcmludHMgc29tZWRheSAqLworI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKKyNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCisKKyNkZWZpbmUgSENGX0lOVEVSRkFDRV9DT05ORUNUKGlmYnApCisjZGVmaW5lIEhDRl9JTlRFUkZBQ0VfRElTQ09OTkVDVChpZmJwKQorI2RlZmluZSBIQ0ZfRU5URVJfSU5URVJGQUNFX0ZVTkNUKGliZmIpCisjZGVmaW5lIEhDRl9MRUFWRV9JTlRFUkZBQ0VfRlVOQ1QoaWZicCkKKworI2RlZmluZSBzeXNJbldvcmQob2Zmc2V0QWRkcikgIElOX1BPUlRfV09SRChvZmZzZXRBZGRyKQorI2RlZmluZSBzeXNJbkJ5dGUob2Zmc2V0QWRkcikgIElOX1BPUlRfQllURShvZmZzZXRBZGRyKQorI2RlZmluZSBzeXNPdXRXb3JkKGFkZHIsIHZhbHVlKSBPVVRfUE9SVF9XT1JEKGFkZHIsIHZhbHVlKQorCisjZW5kaWYgLypJUFRfVDgzMDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmICEgZGVmaW5lZCAJSENGX0FMSUdOCisjZGVmaW5lIAkJSENGX0FMSUdOCQkJMQkJLy9kZWZhdWx0IHRvIG5vIGFsaWdubWVudAorI2VuZGlmIC8vIAkJSENGX0FMSUdOCisKKyNpZiAhIGRlZmluZWQgCUhDRl9BU1NFUlQKKyNkZWZpbmUgCQlIQ0ZfQVNTRVJUCQkJMAorI2VuZGlmIC8vCQlIQ0ZfQVNTRVJUCisKKyNpZiAhIGRlZmluZWQJSENGX0JJR19FTkRJQU4KKyNkZWZpbmUgCQlIQ0ZfQklHX0VORElBTgkJMAorI2VuZGlmIC8vIAkJSENGX0JJR19FTkRJQU4KKworI2lmICEgZGVmaW5lZAlIQ0ZfRExfT05MWQorI2RlZmluZSAJCUhDRl9ETF9PTkxZCQkJMAorI2VuZGlmIC8vIAkJSENGX0RMX09OTFkKKworI2lmICEgZGVmaW5lZAlIQ0ZfRE1BCisjZGVmaW5lIAkJSENGX0RNQQkJCQkwCisjZW5kaWYgLy8gCQlIQ0ZfRE1BCisKKyNpZiAhIGRlZmluZWQJSENGX0VOQ0FQCisjZGVmaW5lCQkJSENGX0VOQ0FQCQkJSENGX0VOQworI2VuZGlmIC8vCQlIQ0ZfRU5DQVAKKworI2lmICEgZGVmaW5lZAlIQ0ZfRU5UUlkKKyNkZWZpbmUJCQlIQ0ZfRU5UUlkoIGlmYnAgKQorI2VuZGlmIC8vCQlIQ0ZfRU5UUlkKKworI2lmICEgZGVmaW5lZAlIQ0ZfRVhJVAorI2RlZmluZQkJCUhDRl9FWElUKCBpZmJwICkKKyNlbmRpZiAvLwkJSENGX0VYSVQKKworI2lmICEgZGVmaW5lZAlIQ0ZfRVhUCisjZGVmaW5lCQkJSENGX0VYVAkJCQkwCisjZW5kaWYgLy8JCUhDRl9FWFQKKworI2lmICEgZGVmaW5lZAlIQ0ZfSU5UX09OCisjZGVmaW5lCQkJSENGX0lOVF9PTgkJCTEKKyNlbmRpZiAvLwkJSENGX0lOVF9PTgorCisjaWYgISBkZWZpbmVkCUhDRl9JTworI2RlZmluZQkJCUhDRl9JTwkJCQkwCQkvL2RlZmF1bHQgMTYgYml0cyBzdXBwb3J0IG9ubHksIHBvcnQgSS9PCisjZW5kaWYgLy8JCUhDRl9JTworCisjaWYgISBkZWZpbmVkCUhDRl9MRUdBQ1kKKyNkZWZpbmUJCQlIQ0ZfTEVHQUNZCQkJMAorI2VuZGlmIC8vCQlIQ0ZfTEVHQUNZCisKKyNpZiAhIGRlZmluZWQJSENGX01BWF9MVFYKKyNkZWZpbmUgCQlIQ0ZfTUFYX0xUVgkJCTEyMDAJLy8gc3VmZmljaWVudCBmb3IgYWxsIGtub3duIHB1cnBvc2VzCisjZW5kaWYgLy8JCUhDRl9NQVhfTFRWCisKKyNpZiAhIGRlZmluZWQJSENGX1BST1RfVElNRQorI2RlZmluZSAJCUhDRl9QUk9UX1RJTUUJCTEwMAkJLy8gbnVtYmVyIG9mIDEwSyBtaWNyb3NlYyBwcm90ZWN0aW9uIHRpbWVyIGFnYWluc3QgSC9XIG1hbGZ1bmN0aW9uCisjZW5kaWYgLy8gCQlIQ0ZfUFJPVF9USU1FCisKKyNpZiAhIGRlZmluZWQJSENGX1NMRUVQCisjZGVmaW5lCQkJSENGX1NMRUVQCQkJMAorI2VuZGlmIC8vCQlIQ0ZfU0xFRVAKKworI2lmICEgZGVmaW5lZAlIQ0ZfVEFMTElFUworI2RlZmluZQkJCUhDRl9UQUxMSUVTCQkJKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQorI2VuZGlmIC8vCQlIQ0ZfVEFMTElFUworCisjaWYgISBkZWZpbmVkIAlIQ0ZfVFlQRQorI2RlZmluZSAJCUhDRl9UWVBFIAkJCTAKKyNlbmRpZiAvLwkJSENGX1RZUEUKKworI2lmCQkJCUhDRl9CSUdfRU5ESUFOCisjdW5kZWYJCQlIQ0ZfQklHX0VORElBTgorI2RlZmluZQkJCUhDRl9CSUdfRU5ESUFOCQkxCQkvL2p1c3QgZm9yIGNvbnZlbmllbmNlIG9mIGdlbmVyYXRpbmcgY2ZnX2hjZl9vcHQKKyNlbmRpZiAvLwkgCUhDRl9CSUdfRU5ESUFOCisKKyNpZgkJCQlIQ0ZfRExfT05MWQorI3VuZGVmCQkJSENGX0RMX09OTFkKKyNkZWZpbmUJCQlIQ0ZfRExfT05MWQkJCTEJCS8vanVzdCBmb3IgY29udmVuaWVuY2Ugb2YgZ2VuZXJhdGluZyBjZmdfaGNmX29wdAorI2VuZGlmIC8vCQlIQ0ZfRExfT05MWQorCisjaWYJCQkJSENGX0RNQQorI3VuZGVmCQkJSENGX0RNQQorI2RlZmluZQkJCUhDRl9ETUEJCQkJMQkJLy9qdXN0IGZvciBjb252ZW5pZW5jZSBvZiBnZW5lcmF0aW5nIGNmZ19oY2Zfb3B0CisjZW5kaWYgLy8JCUhDRl9ETUEKKworI2lmCQkJCUhDRl9JTlRfT04KKyN1bmRlZgkJCUhDRl9JTlRfT04KKyNkZWZpbmUJCQlIQ0ZfSU5UX09OCQkJMQkJLy9qdXN0IGZvciBjb252ZW5pZW5jZSBvZiBnZW5lcmF0aW5nIGNmZ19oY2Zfb3B0CisjZW5kaWYgLy8JCUhDRl9JTlRfT04KKworCisjaWYgISBkZWZpbmVkIElOX1BPUlRfU1RSSU5HXzhfMTYKKyNkZWZpbmUgIElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisjZGVmaW5lICBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCU9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCisjZW5kaWYgLy8gSU5fUE9SVF9TVFJJTkdfOF8xNgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAhIGRlZmluZWQJRkFSCisjZGVmaW5lIAkJRkFSCQkJCQkJLy8gZGVmYXVsdCB0byBmbGF0IDMyLWJpdHMgY29kZQorI2VuZGlmIC8vIAkJRkFSCisKK3R5cGVkZWYgaGNmXzggIEZBUiAqd2NpX2J1ZnA7CQkJLy8gc2VnbWVudGVkIDE2LWJpdHMgb3IgZmxhdCAzMi1iaXRzIHBvaW50ZXIgdG8gOCBiaXRzIHVuaXQKK3R5cGVkZWYgaGNmXzE2IEZBUiAqd2NpX3JlY29yZHA7CQkvLyBzZWdtZW50ZWQgMTYtYml0cyBvciBmbGF0IDMyLWJpdHMgcG9pbnRlciB0byAxNiBiaXRzIHVuaXQKKworLyoJSS9PIEFkZHJlc3Mgc2l6ZQorKglQbGF0Zm9ybXMgd2hpY2ggdXNlIHBvcnQgbWFwcGVkIEkvTyB3aWxsIChpbiBnZW5lcmFsKSBoYXZlIGEgNjRrIEkvTyBzcGFjZSwgY29udmVuaWVudGx5IGV4cHJlc3NlZCBpbiBhCisqCTE2LWJpdHMgcXVhbnRpdHkKKyoJUGxhdGZvcm1zIHdoaWNoIHVzZSBtZW1vcnkgbWFwcGVkIEkvTyB3aWxsIChpbiBnZW5lcmFsKSBoYXZlIGFuIEkvTyBzcGFjZSBtdWNoIGxhcmdlciB0aGFuIDY0aywgYW5kIG5lZWQgYQorKgkzMi1iaXRzIHF1YW50aXR5IHRvIGV4cHJlc3MgdGhlIEkvTyBiYXNlCisqLworCisjaWYgSENGX0lPICYgSENGX0lPX01FTQordHlwZWRlZiBoY2ZfMzIgaGNmX2lvOworI2Vsc2UKK3R5cGVkZWYgaGNmXzE2IGhjZl9pbzsKKyNlbmRpZiAvL0hDRl9JTworCisjaWYgCUhDRl9QUk9UX1RJTUUgPiAxMjgKKyNkZWZpbmUgSENGX1BST1RfVElNRV9TSEZUCTMKKyNkZWZpbmUgSENGX1BST1RfVElNRV9ESVYJOAorI2VsaWYgCUhDRl9QUk9UX1RJTUUgPiA2NAorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX1NIRlQJMgorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0RJVgk0CisjZWxpZiAJSENGX1BST1RfVElNRSA+IDMyCisjZGVmaW5lIEhDRl9QUk9UX1RJTUVfU0hGVAkxCisjZGVmaW5lIEhDRl9QUk9UX1RJTUVfRElWCTIKKyNlbHNlIC8vSENGX1BST1RfVElNRSA+PSAxOQorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX1NIRlQJMAorI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0RJVgkxCisjZW5kaWYKKworI2RlZmluZSBIQ0ZfUFJPVF9USU1FX0NOVCAoSENGX1BST1RfVElNRSAvIEhDRl9QUk9UX1RJTUVfRElWKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAuIC4gLiAuIC4gLiAuIC4gLiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTVNGX0NPTVBPTkVOVF9JRCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQ0ZHX0lERU5USVRZX1NUUkNUIGluIEhDRi5DCisqIENGR19JREVOVElUWV9TVFJDVCBpcyBkZWZpbmVkIGluIEhDRi5DIHB1cmVseSBiYXNlZCBvbiBjb252ZW5pZW5jZSBhcmd1bWVudHMuCisqIFRoZSBIQ0YgY2FuIG5vdCBoYXZlIHRoZSBrbm93bGVkZ2UgdG8gZGV0ZXJtaW5lIHRoZSBDb21wb25lbnRJZCBmaWVsZCBvZiB0aGUgSWRlbnRpdHkgcmVjb3JkIChha2EgYXMKKyogVmVyc2lvbiBSZWNvcmQpLCB0aGVyZWZvcmUgdGhlIE1TRiBwYXJ0IG9mIHRoZSBEcml2ZXJzIG11c3Qgc3VwcGx5IHRoaXMgdmFsdWUgdmlhIHRoZSBTeXN0ZW0gQ29uc3RhbnQKKyogTVNGX0NPTVBPTkVOVF9JRC4KKyogVGhlcmUgaXMgYSBzZXQgb2YgdmFsdWVzIHByZWRlZmluZWQgaW4gTURELkggKGZvcm1hdCBDT01QX0lEXy4uLi4uKQorKgorKiBOb3RlIHRoYXQgdGFraW5nIE1TRl9DT01QT05FTlRfSUQgYXMgYSBkZWZhdWx0IHZhbHVlIGZvciBEVUlfQ09NUEFUX1ZBUiBpcyBwdXJlbHkgYW4gaW1wbGVtZW50YXRpb24KKyogY29udmVuaWVuY2UsIHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIHR3byBxdWFudGl0aWVzIGhhdmUgbm9uZSBmdW5jdGlvbmFsIHJlbGF0aW9uc2hpcCB3aGF0c29ldmVyLgorKi8KKworI2lmIGRlZmluZWQJTVNGX0NPTVBPTkVOVF9JRAorCisjaWYgISBkZWZpbmVkCURVSV9DT01QQVRfVkFSCisjZGVmaW5lCQkJRFVJX0NPTVBBVF9WQVIJCU1TRl9DT01QT05FTlRfSUQKKyNlbmRpZiAvLwkJRFVJX0NPTVBBVF9WQVIKKworI2lmICEgZGVmaW5lZAlEVUlfQ09NUEFUX0JPVAkJLy87P3RoaXMgd2F5IHV0aWxpdGllcyBjYW4gbG93ZXIgYXMgd2VsbCByYWlzZSB0aGUgYm90dG9tCisjZGVmaW5lCQkJRFVJX0NPTVBBVF9CT1QJCTgKKyNlbmRpZiAvLwkJRFVJX0NPTVBBVF9CT1QKKworI2lmICEgZGVmaW5lZAlEVUlfQ09NUEFUX1RPUAkJLy87P3RoaXMgd2F5IHV0aWxpdGllcyBjYW4gbG93ZXIgYXMgd2VsbCByYWlzZSB0aGUgdG9wCisjZGVmaW5lCQkJRFVJX0NPTVBBVF9UT1AgICAgICAgOAorI2VuZGlmIC8vCQlEVUlfQ09NUEFUX1RPUAorCisjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKworI2lmICEgZGVmaW5lZAlIQ0ZfSFNJX1ZBUl81CisjZGVmaW5lCQkJSENGX0hTSV9WQVJfNQorI2VuZGlmIC8vCQlIQ0ZfSFNJX1ZBUl81CisKKyNpZiAhIGRlZmluZWQJSENGX0FQRl9WQVJfNAorI2RlZmluZQkJCUhDRl9BUEZfVkFSXzQKKyNlbmRpZiAvLwkJSENGX0FQRl9WQVJfNAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyNpZiAhIGRlZmluZWQJSENGX1NUQV9WQVJfNAorI2RlZmluZQkJCUhDRl9TVEFfVkFSXzQKKyNlbmRpZiAvLwkJSENGX1NUQV9WQVJfNAorI2Vsc2UKKyNpZiAhIGRlZmluZWQJSENGX1NUQV9WQVJfMgorI2RlZmluZQkJCUhDRl9TVEFfVkFSXzIKKyNlbmRpZiAvLwkJSENGX1NUQV9WQVJfMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzQKK2VycjogSFNJIHZhcmlhbnRzIDQgY29ycmVzcG9uZCB3aXRoIEhJSTsKKyNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl80CisKKyNlbHNlCisKKyNpZiAhIGRlZmluZWQJSENGX0hTSV9WQVJfNAorI2RlZmluZQkJCUhDRl9IU0lfVkFSXzQJCS8vSGVybWVzLUlJIGFsbCB0eXBlcyAoZm9yIHRoZSB0aW1lIGJlaW5nISkKKyNlbmRpZiAvLwkJSENGX0hTSV9WQVJfNAorCisjaWYgISBkZWZpbmVkCUhDRl9BUEZfVkFSXzIKKyNkZWZpbmUgCQlIQ0ZfQVBGX1ZBUl8yCisjZW5kaWYgLy8JCUhDRl9BUEZfVkFSXzIKKworI2lmICEgZGVmaW5lZAlIQ0ZfU1RBX1ZBUl8yCisjZGVmaW5lCQkJSENGX1NUQV9WQVJfMgorI2VuZGlmIC8vCQlIQ0ZfU1RBX1ZBUl8yCisKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisKKyNpZiAhIGRlZmluZWQJSENGX1BSSV9WQVJfMworI2RlZmluZQkJSENGX1BSSV9WQVJfMworI2VuZGlmIC8vCQlIQ0ZfUFJJX1ZBUl8zCisKKyNpZiBkZWZpbmVkIEhDRl9IU0lfVkFSXzEgfHwgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl8yIHx8IGRlZmluZWQgSENGX0hTSV9WQVJfMworZXJyOiBIU0kgdmFyaWFudHMgMSwgMiBhbmQgMyBjb3JyZXNwb25kIHdpdGggSC1JIG9ubHk7CisjZW5kaWYgLy8gSENGX0hTSV9WQVJfMSwgSENGX0hTSV9WQVJfMiwgSENGX0hTSV9WQVJfMworCisjaWYgZGVmaW5lZCBIQ0ZfUFJJX1ZBUl8xIHx8IGRlZmluZWQgSENGX1BSSV9WQVJfMgorZXJyOiBwcmltYXJ5IHZhcmlhbnRzIDEgYW5kIDIgY29ycmVzcG9uZCB3aXRoIEgtSSBvbmx5OworI2VuZGlmIC8vIEhDRl9QUklfVkFSXzEgLyBIQ0ZfUFJJX1ZBUl8yCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC4gLiAuIC4gLiAuIC4gLiAuICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIFRoZSBCQVNFRCBjdXN0b21pemF0aW9uIG1hY3JvIGlzIHVzZWQgdG8gcmVzb2x2ZXMgdGhlIFNTIT1EUyBjb25mbGljdCBmb3IgdGhlIEludGVycnVwdCBTZXJ2aWNlIGxvZ2ljIGluCisgKiBET1MgRHJpdmVycy4gRHVlIHRvIHRoZSBjdW1iZXJzb21lbmVzcyBvZiBtaXhpbmcgQyBhbmQgYXNzZW1ibGVyIGxvY2FsIEJBU0VEIHZhcmlhYmxlcyBzdGlsbCBlbmQgdXAgaW4gdGhlCisgKiB3cm9uZyBzZWdtZW50LiBUaGUgd29ya2Fyb3VuZCBpcyB0aGF0IHRoZSBIQ0YgdXNlcyBvbmx5IGdsb2JhbCBCQVNFRCB2YXJpYWJsZXMgb3IgSUZCLWJhc2VkIHZhcmlhYmxlcy4KKyAqIFRoZSAiQkFTRUQiIGNvbnN0cnVjdGlvbiAoc3VwcG9zZWRseSkgb25seSBhbW91bnRzIHRvIHNvbWV0aGluZyBpbiB0aGUgc21hbGwgbWVtb3J5IG1vZGVsLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgd2hvbGUgQkFTRUQgcmlnbWFyb2xlIGlzIG5lZWRsZXNzbHkgY29tcGxpY2F0ZWQgYmVjYXVzZSBib3RoIHRoZSBNaWNyb3NvZnQgQ29tcGlsZXIgYW5kCisgKiBMaW5rZXIgYXJlIHVubmVjZXNzYXJ5IHJlc3RyaWN0aXZlIGluIHdoYXQgZmFyIHBvaW50ZXIgbWFuaXB1bGF0aW9uIHRoZXkgYWxsb3cKKyAqLworCisjaWYgISBkZWZpbmVkCUJBU0VECisjZGVmaW5lIAkJQkFTRUQKKyNlbmRpZiAvLwkJQkFTRUQKKworI2lmICEgZGVmaW5lZAlFWFRFUk5fQworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lCQkJRVhURVJOX0MgZXh0ZXJuICJDIgorI2Vsc2UKKyNkZWZpbmUJCQlFWFRFUk5fQworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisjZW5kaWYgLy8JCUVYVEVSTl9DCisKKyNpZiAhIGRlZmluZWQJTlVMTAorI2RlZmluZQkJCU5VTEwJKCh2b2lkICopIDApCisjZW5kaWYgLy8JCU5VTEwKKworI2lmICEgZGVmaW5lZAlURVhUCisjZGVmaW5lCQkJVEVYVCh4KQl4CisjZW5kaWYgLy8JCVRFWFQKKworI2lmICFkZWZpbmVkCV9UQ0hBUl9ERUZJTkVECisjZGVmaW5lIAkJVENIQVIJY2hhcgorI2VuZGlmIC8vCQlfVENIQVJfREVGSU5FRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqIEMgTyBOIEYgTCBJIEMgVCAgIEQgRSBUIEUgQyBUIEkgTyBOICAmICBSIEUgUyBPIEwgVSBUIEkgTyBOICoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZCBIQ0ZfTElUVExFX0VORElBTgorZXJyOiBIQ0ZfTElUVExFX0VORElBTiBpcyBvYnNvbGV0ZTsKKyNlbmRpZiAvLyAJSENGX0xJVFRMRV9FTkRJQU4KKworI2lmIGRlZmluZWQgSENGX0lOVF9PRkYKK2VycjogSENGX0lOVF9PRkYgaXMgb2Jzb2xldGU7CisjZW5kaWYgLy9IQ0ZfSU5UX09GRgorCisjaWYgSENGX0FMSUdOICE9IDEgJiYgSENGX0FMSUdOICE9IDIgJiYgSENGX0FMSUdOICE9IDQgJiYgSENGX0FMSUdOICE9IDgKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0FMSUdOOworI2VuZGlmIC8vIEhDRl9BTElHTgorCisjaWYgKEhDRl9BU1NFUlQpICYgfiggSENGX0FTU0VSVF9QUklOVEYgfCBIQ0ZfQVNTRVJUX1NXX1NVUCB8IEhDRl9BU1NFUlRfTUIgfCBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4gfCBcCisJCQkJCSAgSENGX0FTU0VSVF9MTktfTVNGX1JUTiApCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9BU1NFUlQ7CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9NQiAmJiAhICggKEhDRl9FWFQpICYgSENGX0VYVF9NQiApCQkvL2RldGVjdCBwb3RlbnRpYWwgY29uZmxpY3QKK2VycjogdGhlc2UgbWFjcm9zIGFyZSBub3QgdXNlZCBjb25zaXN0ZW50bHk7CisjZW5kaWYgLy8gSENGX0FTU0VSVF9NQiAvIEhDRl9FWFRfTUIKKworI2lmIEhDRl9CSUdfRU5ESUFOICE9IDAgJiYgSENGX0JJR19FTkRJQU4gIT0gMQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfQklHX0VORElBTjsKKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisjaWYgSENGX0RMX09OTFkgIT0gMCAmJiBIQ0ZfRExfT05MWSAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9ETF9PTkxZOworI2VuZGlmIC8vIEhDRl9ETF9PTkxZCisKKyNpZiBIQ0ZfRE1BICE9IDAgJiYgSENGX0RNQSAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9ETUE7CisjZW5kaWYgLy8gSENGX0RNQQorCisjaWYgKEhDRl9FTkNBUCkgJiB+KCBIQ0ZfRU5DIHwgSENGX0VOQ19TVVAgKQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfRU5DQVA7CisjZW5kaWYgLy8gSENGX0VOQ0FQCisKKyNpZiAoSENGX0VYVCkgJiB+KCBIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9JTlRfVFhfRVggfCBIQ0ZfRVhUX1RBTExJRVNfRlcgfCBIQ0ZfRVhUX1RBTExJRVNfSENGCXwgXAorCQkJCSAgIEhDRl9FWFRfTklDX0FDQ0VTUyB8IEhDRl9FWFRfTUIgfCBIQ0ZfRVhUX0lOVF9USUNLIHwgXAorCQkJCSAgIEhDRl9FWFRfSUZCX1NUUkNUIHwgSENGX0VYVF9ERVNDX1NUUkNUIHwgSENGX0VYVF9UWF9DT05UICkKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0VYVDsKKyNlbmRpZiAvLyBIQ0ZfRVhUCisKKyNpZiBIQ0ZfSU5UX09OICE9IDAgJiYgSENGX0lOVF9PTiAhPSAxCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9JTlRfT047CisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisjaWYgKEhDRl9JTykgJiB+KCBIQ0ZfSU9fTUVNIHwgSENGX0lPXzMyQklUUyApCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9JTzsKKyNlbmRpZiAvLyBIQ0ZfSU8KKworI2lmIEhDRl9MRUdBQ1kgIT0gMCAmJiBIQ0ZfTEVHQUNZICE9IDEKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0xFR0FDWTsKKyNlbmRpZiAvLyBIQ0ZfTEVHQUNZCisKKyNpZiBIQ0ZfTUFYX0xUViA8IDE2IHx8IEhDRl9NQVhfTFRWID4gMjMwNAorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfTUFYX0xUVjsKKyNlbmRpZiAvLyBIQ0ZfTUFYX0xUVgorCisjaWYgSENGX1BST1RfVElNRSAhPSAwICYmICggSENGX1BST1RfVElNRSA8IDE5IHx8IDI1NiA8IEhDRl9QUk9UX1RJTUUgKQorZXJyOiBiZWxvdyBtaW5pbXVtIC4wOCBzZWNvbmQgcmVxdWlyZWQgYnkgSGVybWVzIG9yIHBvc3NpYmx5IGFib3ZlIGhjZl8zMiBjYXBhY2l0eTsKKyNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCisKKyNpZiAoSENGX1NMRUVQKSAmIH4oIEhDRl9DRFMgfCBIQ0ZfRERTICkKK2VycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX1NMRUVQOworI2VuZGlmIC8vIEhDRl9TTEVFUAorCisjaWYgKEhDRl9TTEVFUCkgJiYgISAoSENGX0lOVF9PTikKK2VycjogdGhlc2UgbWFjcm9zIGFyZSBub3QgdXNlZCBjb25zaXN0ZW50bHk7CisjZW5kaWYgLy8gSENGX1NMRUVQIC8gSENGX0lOVF9PTgorCisjaWYgKEhDRl9TTEVFUCkgJiYgISAoIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RJQ0sgKQorLy87PyBlcnI6IHRoZXNlIG1hY3JvcyBhcmUgbm90IHVzZWQgY29uc2lzdGVudGx5OworI2VuZGlmIC8vIEhDRl9TTEVFUCAvIEhDRl9FWFRfSU5UX1RJQ0sKKworI2lmIChIQ0ZfVEFMTElFUykgJiB+KCBIQ0ZfVEFMTElFU19IQ0YgfCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19SRVNFVCApIHx8IFwKKwkoSENGX1RBTExJRVMpID09IEhDRl9UQUxMSUVTX1JFU0VUCitlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9UQUxMSUVTOworI2VuZGlmIC8vIEhDRl9UQUxMSUVTCisKKyNpZiAoSENGX1RZUEUpICYgfihIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9VU0IgfCBIQ0ZfVFlQRV9QUkVMT0FERUQgfCBIQ0ZfVFlQRV9ISUk1IHwgSENGX1RZUEVfV0FSUCB8IFwKKwkJSENGX1RZUEVfQ0NYIC8qIHwgSENGX1RZUEVfVFhfREVMQVkgKi8gKQorZXJyOiBpbnZhbGlkIHZhbHVlIGZvciBIQ0ZfVFlQRTsKKyNlbmRpZiAvL0hDRl9UWVBFCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV0FSUCAmJiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCitlcnI6IGF0IG1vc3QgMSBvZiB0aGVzZSBtYWNyb3Mgc2hvdWxkIGJlIGRlZmluZWQ7CisjZW5kaWYgLy9IQ0ZfVFlQRV9XQVJQIC8gSENGX1RZUEVfV1BBCisKKyNlbmRpZiAvL0hDRkNGR19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlNzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oCkBAIC0wLDAgKzEsODA5IEBACisKKy8vICAgdmltOnR3PTExMDp0cz00OgorI2lmbmRlZiBIQ0ZERUZDX0gKKyNkZWZpbmUgSENGREVGQ19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgOiBIQ0ZERUYuSAorKgorKiBEQVRFICAgOiAkRGF0ZTogMjAwNC8wOC8wNSAxMTo0NzoxMCAkICAgJFJldmlzaW9uOiAxLjggJAorKiBPcmlnaW5hbDogMjAwNC8wNS8yOCAxNDowNTozNSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTMgMTU6MzE6NDUgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA1MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMTUgMDk6MjQ6NDIgICAgUmV2aXNpb246IDEuNDQgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMTMgMTQ6MjI6NDUgICAgUmV2aXNpb246IDEuNDMgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzAxIDE1OjMyOjU1ICAgIFJldmlzaW9uOiAxLjQwICAgICAgVGFnOiB0N18yMDA0MDQwMV8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8xMCAxNTozOToyOCAgICBSZXZpc2lvbjogMS4zNiAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDE0OjEwOjEyICAgIFJldmlzaW9uOiAxLjM0ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDIgMDk6Mjc6MTIgICAgUmV2aXNpb246IDEuMzIgICAgICBUYWc6IHQyMDA0MDMwMl8wMworKiBPcmlnaW5hbDogMjAwNC8wMi8yNCAxMzowMDoyOSAgICBSZXZpc2lvbjogMS4yOSAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAyLzE4IDE3OjEzOjU3ICAgIFJldmlzaW9uOiAxLjI2ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SIDogTmljbyBWYWxzdGVyCisqCisqIFNQRUNJRklDQVRJT046IC4uLi4uLi4uLi4uCisqCisqIERFU0MgICA6IERlZmluaXRpb25zIGFuZCBQcm90b3R5cGVzIGZvciBIQ0Ygb25seQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUJYnkgQVQmVC4JCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0CWJ5IEFnZXJlIFN5c3RlbXMgSW5jLglBbGwgUmlnaHRzIFJlc2VydmVkCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisqICAgIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogRGlzY2xhaW1lcgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisqIERBTUFHRS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFAgUiBFIEYgSSBYIEUgUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy9JRkJfCQlJbnRlcmZhY2UgQmxvY2sKKy8vSENNRF8JCUhlcm1lcyBDb21tYW5kCisvL0hGU18JCUhlcm1lcyAoVHJhbnNtaXQvUmVjZWl2ZSkgRnJhbWUgU3RydWN0dXJlCisvL0hSRUdfCQlIZXJtZXMgUmVnaXN0ZXIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwIC8vCisjZGVmaW5lIEJJVDAgIDB4MDAwMQorI2RlZmluZSBCSVQxICAweDAwMDIKKyNkZWZpbmUgQklUMiAgMHgwMDA0CisjZGVmaW5lIEJJVDMgIDB4MDAwOAorI2RlZmluZSBCSVQ0ICAweDAwMTAKKyNkZWZpbmUgQklUNSAgMHgwMDIwCisjZGVmaW5lIEJJVDYgIDB4MDA0MAorI2RlZmluZSBCSVQ3ICAweDAwODAKKyNkZWZpbmUgQklUOCAgMHgwMTAwCisjZGVmaW5lIEJJVDkgIDB4MDIwMAorI2RlZmluZSBCSVQxMCAweDA0MDAKKyNkZWZpbmUgQklUMTEgMHgwODAwCisjZGVmaW5lIEJJVDEyIDB4MTAwMAorI2RlZmluZSBCSVQxMyAweDIwMDAKKyNkZWZpbmUgQklUMTQgMHg0MDAwCisjZGVmaW5lIEJJVDE1IDB4ODAwMAorI2RlZmluZSBCSVQxNiAweDAwMDEwMDAwCisjZGVmaW5lIEJJVDE3IDB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTggMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOSAweDAwMDgwMDAwCisjZGVmaW5lIEJJVDIwIDB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEgMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMiAweDAwNDAwMDAwCisjZGVmaW5lIEJJVDIzIDB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQgMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNSAweDAyMDAwMDAwCisjZGVmaW5lIEJJVDI2IDB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcgMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOCAweDEwMDAwMDAwCisjZGVmaW5lIEJJVDI5IDB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAgMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMSAweDgwMDAwMDAwCisjZW5kaWYgLy8gMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHRU5FUkFMIEVRVUFURVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBIQ0ZfTUFHSUMJCQkJMHg3RDM3CS8vICJ9NyIgSGFuZGxlIHZhbGlkYXRpb24KKworI2RlZmluZQlQTFVHX0RBVEFfT0ZGU0VUICAgICAgICAweDAwMDAwODAwCS8vbmVlZGVkIGJ5IHNvbWUgdGVzdCB0b29sIG9uIHRvcCBvZiBILUlJIE5ESVMgZHJpdmVyCisKKyNkZWZpbmUgSU5JX1RJQ0tfSU5JCQkJMHgwMDA0MDAwMEwKKworI2RlZmluZSBJT19JTgkJCQkJMAkJLy9oY2Zpb19pbl9zdHJpbmcKKyNkZWZpbmUgSU9fT1VUCQkJCQkxCQkvL2hjZmlvX291dF9zdHJpbmcKKworLy9ET19BU1NFUlQsIGNyZWF0ZSBhbiBhcnRpZmljaWFsIEZBTFNFIHRvIGZvcmNlIGFuIEFTU0VSVCB3aXRob3V0IHRoZSBuYXN0eSBjb21waWxlciB3YXJuaW5nCisjZGVmaW5lIERPX0FTU0VSVAkJCQkoIGFzc2VydF9pZmJwLT5JRkJfTWFnaWMgIT0gSENGX01BR0lDICYmIGFzc2VydF9pZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDICkKKyNkZWZpbmUgTlRfQVNTRVJUCQkJCTB4MDAwMAkJLy8sIE5FVkVSX1RFU1RFRAorI2RlZmluZSBORVZFUl9URVNURUQJCQlNRVJHRV8yKCAweEVGRkUsIDB4RkVFRiApCisjZGVmaW5lIFNFX0FTU0VSVAkJCQkweDVFRkYJCS8qIFNpZGUgRWZmZWN0LCBIQ0ZBU1NFUlQgaW52b2thdGlvbiB3aGljaCBhcmUgb25seSBjYWxsZWQgZm9yIHRoZQorCQkJCQkJCQkJCQkgKiBzaWRlIGVmZmVjdCBhbmQgd2hpY2ggc2hvdWxkIG5ldmVyIHRyaWdnZXIgKi8KKyNkZWZpbmUgREhGX0ZJTEVfTkFNRV9PRkZTRVQJMTAwMDAJCS8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyNkZWZpbmUgTU1EX0ZJTEVfTkFNRV9PRkZTRVQJMjAwMDAJCS8vdG8gZGlzdGluZ3Vpc2ggTU1EIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKworLy8gdHJhY2UgY29kZXMgdXNlZCB0bworLy8gMTogcHJvZmlsZSBleGVjdXRpb24gdGltZXMgdmlhIEhDRl9UUkFDRSBhbmQgSENGX1RSQUNFX1ZBTFVFCisvLyAyOiBoaWVyYXJjaGljYWwgZmxvdyBpbmZvcm1hdGlvbiB2aWEgSENGTE9HRU5UUlkgLyBIQ0ZMT0dFWElUCisKKy8vI2RlZmluZSBIQ0ZfVFJBQ0VfQ09OTkVDVAkJdXNlbGVzcworLy8jZGVmaW5lIEhDRl9UUkFDRV9ESVNDT05ORUNUCXVzZWxlc3MKKyNkZWZpbmUgSENGX1RSQUNFX0FDVElPTgkJMHgwMDAwICAvLyAweDAwMDEKKyNkZWZpbmUgSENGX1RSQUNFX0NOVEwJCQkweDAwMDEgIC8vIDB4MDAwMgorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1JYX0dFVAkweDAwMDIgIC8vIDB4MDAwNAorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1JYX1BVVAkweDAwMDMgIC8vIDB4MDAwOAorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1RYX0dFVAkweDAwMDQgIC8vIDB4MDAxMAorI2RlZmluZSBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVAkweDAwMDUgIC8vIDB4MDAyMAorI2RlZmluZSBIQ0ZfVFJBQ0VfR0VUX0lORk8JCTB4MDAwNiAgLy8gMHgwMDQwCisjZGVmaW5lIEhDRl9UUkFDRV9QVVRfSU5GTwkJMHgwMDA3ICAvLyAweDAwODAKKyNkZWZpbmUgSENGX1RSQUNFX1JDVl9NU0cJCTB4MDAwOCAgLy8gMHgwMTAwCisjZGVmaW5lIEhDRl9UUkFDRV9TRU5EX01TRwkJMHgwMDA5ICAvLyAweDAyMDAKKyNkZWZpbmUgSENGX1RSQUNFX1NFUlZJQ0VfTklDCTB4MDAwQSAgLy8gMHgwNDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwQyAgLy8gMHgxMDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRCAgLy8gMHgyMDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRSAgLy8gMHg0MDAwCisvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRiAgLy8gMHg4MDAwCisvLwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQ0ZfVFJBQ0VfLi4uIGNvZGVzIGJlbG93IDB4MDAxMCBhcmUgYXNzZXJ0ZWQgb24gcmUtZW50cnkKKyNkZWZpbmUgSENGX1RSQUNFX0FDVElPTl9LTFVER0UJMHgwMDEwICAvKiBvbmNlIHlvdSBzdGFydCBpbnRyb2R1Y2luZyBrbHVkZ2VzIHRoZXJlIGlzIG5vIGVuZCB0byBpdAorCQkJCQkJCQkJCSAqIHRoaXMgaXMgYW4gZXNjYXBlIHRvIGRvIG5vdCBhc3NlcnQgb24gcmUtZW50cmFuY3kgcHJvYmxlbSBjYXVzZWQKKwkJCQkJCQkJCQkgKiBieSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiB1c2VkIHRvIGdldCBNaWNyb3NvZnRzIE5ESVMgZHJpdmVycyBnb2luZworCQkJCQkJCQkJCSAqLworI2RlZmluZSBIQ0ZfVFJBQ0VfU1RSSU8JCQkweDAwMjAKKyNkZWZpbmUgSENGX1RSQUNFX0FMTE9DCQkJMFgwMDIxCisjZGVmaW5lIEhDRl9UUkFDRV9ETAkJCTBYMDAyMworI2RlZmluZSBIQ0ZfVFJBQ0VfSVNSX0lORk8JCTBYMDAyNAorI2RlZmluZSBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFCQkweDAwMjYKKworI2RlZmluZSBIQ0ZfVFJBQ0VfQ01EX0NQTCAJCTB4MDA0MAorI2RlZmluZSBIQ0ZfVFJBQ0VfQ01EX0VYRQkJMHgwMDQxCisjZGVmaW5lIEhDRl9UUkFDRV9HRVRfRklECQkweDAwNDIKKyNkZWZpbmUgSENGX1RSQUNFX0dFVF9GUkFHCQkweDAwNDMKKyNkZWZpbmUgSENGX1RSQUNFX0lOSVQJCQkweDAwNDQKKyNkZWZpbmUgSENGX1RSQUNFX1BVVF9GUkFHCQkweDAwNDUKKyNkZWZpbmUgSENGX1RSQUNFX1NFVFVQX0JBUAkJMHgwMDQ2CisKKyNkZWZpbmUJSENGX1RSQUNFX0VYSVQgCQkJMHg4MDAwCS8vIEtlaWwgQyB3YXJucyAibG9uZyBjb25zdGFudCB0cnVuY2F0ZWQgdG8gaW50IgorCisvLyNkZWZpbmUgQkFQXzAJCQkJCUhSRUdfREFUQV8wCQkvL1VzZWQgYnkgRE1BIGNvbnRyb2xsZXIgdG8gYWNjZXNzIE5JQyBSQU0KKyNkZWZpbmUgQkFQXzEJCQkJCUhSRUdfREFUQV8xCQkvL1VzZWQgYnkgSENGIHRvIGFjY2VzcyBOSUMgUkFNCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlcm1lcyBSZWNlaXZlL1RyYW5zbWl0IEZyYW1lIFN0cnVjdHVyZXMKKy8vSEZTX1NUQVQKKy8vc2VlIE1NRC5IIGZvciBIRlNfU1RBVF9FUlIKKyNkZWZpbmUgCUhGU19TVEFUX01TR19UWVBFCTB4RTAwMAkvL0hlcm1lcyByZXBvcnRlZCBNZXNzYWdlIFR5cGUKKyNkZWZpbmUgCUhGU19TVEFUX01JQ19LRVlfSUQJMHgxODAwCS8vTUlDIGtleSB1c2VkIChpZiBhbnkpCisjZGVmaW5lIAlIRlNfU1RBVF8xMDQyCQkweDIwMDAJLy9SRkMxMDQyIEVuY29kZWQKKyNkZWZpbmUgCUhGU19TVEFUX1RVTk5FTAkJMHg0MDAwCS8vQnJpZGdlLVR1bm5lbCBFbmNvZGVkCisjZGVmaW5lIAlIRlNfU1RBVF9XTVBfTVNHCTB4NjAwMAkvL1dhdmVMQU4tSUkgTWFuYWdlbWVudCBQcm90b2NvbCBGcmFtZQorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyNkZWZpbmUgCUhGU19TVEFUX01JQwkJMHgwMDEwCS8vRnJhbWUgY29udGFpbnMgTUlDICAvLzs/IHJlLWluc3RhdGUgd2hlbiBGL1cgcmVhZHkKKyNlbmRpZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogSGVybWVzIFJlZ2lzdGVyIE9mZnNldHMgYW5kIENvbW1hbmQgYml0cworI2RlZmluZSBIUkVHX0lPX1JBTkdFCQkJMHg4MAkJLy9JL08gUmFuZ2UgdXNlZCBieSBIZXJtZXMKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ29tbWFuZC9TdGF0dXMKKyNkZWZpbmUgSFJFR19DTUQJCQkJMHgwMAkJLy8KKyNkZWZpbmUgCUhDTURfQ01EX0NPREUJCQkweDNGCisjZGVmaW5lIEhSRUdfUEFSQU1fMAkJCTB4MDIJCS8vCisjZGVmaW5lIEhSRUdfUEFSQU1fMQkJCTB4MDQJCS8vCisjZGVmaW5lIEhSRUdfUEFSQU1fMgkJCTB4MDYJCS8vCisjZGVmaW5lIEhSRUdfU1RBVAkJCQkweDA4CQkvLworI2RlZmluZSAJSFJFR19TVEFUX0NNRF9DT0RFCQkweDAwM0YJLy8KKyNkZWZpbmUJCUhSRUdfU1RBVF9ESUFHX0VSUgkJMHgwMTAwCisjZGVmaW5lCQlIUkVHX1NUQVRfSU5RVUlSRV9FUlIJMHgwNTAwCisjZGVmaW5lIAlIUkVHX1NUQVRfQ01EX1JFU1VMVAkweDdGMDAJLy8KKyNkZWZpbmUgSFJFR19SRVNQXzAJCQkJMHgwQQkJLy8KKyNkZWZpbmUgSFJFR19SRVNQXzEJCQkJMHgwQwkJLy8KKyNkZWZpbmUgSFJFR19SRVNQXzIJCQkJMHgwRQkJLy8KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKiogRklEIE1hbmFnZW1lbnQKKyNkZWZpbmUgSFJFR19JTkZPX0ZJRAkJCTB4MTAJCS8vCisjZGVmaW5lIEhSRUdfUlhfRklECQkJCTB4MjAJCS8vCisjZGVmaW5lIEhSRUdfQUxMT0NfRklEICAJCTB4MjIJCS8vCisjZGVmaW5lIEhSRUdfVFhfQ09NUExfRklEICAJCTB4MjQJCS8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEJBUAorLy8yMDAzMTAzMCBIV2kgSW5zZXJ0ZWQgdGhpcyBhZ2FpbiBiZWNhdXNlIHRoZSBkb25nbGUgY29kZSB1c2VzIHRoaXMgKEdQSUYuQykKKy8vI2RlZmluZSBIUkVHX1NFTEVDVF8wCQkJMHgxOAkJLy8KKy8vI2RlZmluZSBIUkVHX09GRlNFVF8wCQkJMHgxQwkJLy8KKy8vI2RlZmluZSBIUkVHX0RBVEFfMAkJCTB4MzYJCS8vCisKKy8vI2RlZmluZSAJSFJFR19PRkZTRVRfQlVTWQkJMHg4MDAwCS8vIHVzZSBIQ01EX0JVU1kKKyNkZWZpbmUgCUhSRUdfT0ZGU0VUX0VSUgkJCTB4NDAwMAkvLworLy9yc3J2ZCAjZGVmaW5lIAlIUkVHX09GRlNFVF9EQVRBX09GRlNFVAkweDBGRkYJLy8KKworI2RlZmluZSBIUkVHX1NFTEVDVF8xCQkJMHgxQQkJLy8KKyNkZWZpbmUgSFJFR19PRkZTRVRfMQkJCTB4MUUJCS8vCisjZGVmaW5lIEhSRUdfREFUQV8xCQkJCTB4MzgJCS8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEV2ZW50CisjZGVmaW5lIEhSRUdfRVZfU1RBVAkJCTB4MzAJCS8vCisjZGVmaW5lIEhSRUdfSU5UX0VOCQkJCTB4MzIJCS8vCisjZGVmaW5lIEhSRUdfRVZfQUNLCQkJCTB4MzQJCS8vCisKKyNkZWZpbmUgICAgSFJFR19FVl9USUNLCQkJCTB4ODAwMAkvL0F1eGlsaWFyeSBUaW1lciBUaWNrCisvLyNkZWZpbmUgIEhSRUdfRVZfUkVTCQkJCTB4NDAwMAkvL0gtSSBvbmx5OiBIL1cgZXJyb3IgKFdhaXQgVGltZS1vdXQpCisjZGVmaW5lICAgIEhSRUdfRVZfSU5GT19EUk9QCQkweDIwMDAJLy9XTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGxpY2l0ZWQgRnJhbWUKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkJMHgwMDAwCisjZWxzZQorI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkJMHgxMDAwCS8vV29ya2Fyb3VuZCBLbHVkZ2UgYml0IGZvciBILUlJIChub3QgSC1JSS41KQorI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKKyNpZiAoSENGX1NMRUVQKSAmICggSENGX0NEUyB8IEhDRl9ERFMgKQorI2RlZmluZSAgICBIUkVHX0VWX1NMRUVQX1JFUQkJMHgwODAwCisjZWxzZQorI2RlZmluZSAgICBIUkVHX0VWX1NMRUVQX1JFUQkJMHgwMDAwCisjZW5kaWYgLy8gSENGX0NEUyAvIEhDRl9ERFMKKyNpZiBIQ0ZfRE1BCisvLyNkZWZpbmUgICAgSFJFR19FVl9MUEVTQwkJCTB4MDQwMCAvLyBmaXJtd2FyZSBzZXRzIHRoaXMgYml0IGFuZCBjbGVhcnMgaXQsIG5vdCBmb3IgaG9zdCB1c2FnZS4KKyNkZWZpbmUgICAgSFJFR19FVl9SRE1BRAkJCTB4MDIwMCAvLyByeCBmcmFtZSBpbiBob3N0IG1lbW9yeQorI2RlZmluZSAgICBIUkVHX0VWX1RETUFECQkJMHgwMTAwIC8vIHR4IGZyYW1lIGluIGhvc3QgbWVtb3J5IHByb2Nlc3NlZAorLy8jZGVmaW5lICAgIEhSRUdfRVZfUlhETUEJCQkweDAwNDAgLy8gZmlybXdhcmUga2lja3Mgb2ZmIERNQSBlbmdpbmUgKGJpdCBpcyBub3QgZm9yIGhvc3QgdXNhZ2UpCisvLyNkZWZpbmUgICAgSFJFR19FVl9UWERNQQkJCTB4MDAyMCAvLyBmaXJtd2FyZSBraWNrcyBvZmYgRE1BIGVuZ2luZSAoYml0IGlzIG5vdCBmb3IgaG9zdCB1c2FnZSkKKyNkZWZpbmUgICAgSFJFR19FVl9GV19ETUEJCQkweDA0NjAgLy8gZmlybXdhcmUgLyBETUEgZW5naW5lIEkvRiAoYml0cyBhcmUgbm90IGZvciBob3N0IHVzYWdlKQorI2Vsc2UKKyNkZWZpbmUgICAgSFJFR19FVl9GV19ETUEJCQkweDAwMDAKKyNlbmRpZiAvLyBIQ0ZfRE1BCisjZGVmaW5lICAgIEhSRUdfRVZfSU5GTwkJCQkweDAwODAJLy8gQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uIEZyYW1lCisjZGVmaW5lICAgIEhSRUdfRVZfQ01ECQkJCTB4MDAxMAkvLyBDb21tYW5kIGNvbXBsZXRlZCwgU3RhdHVzIGFuZCBSZXNwb25zZSBhdmFpbGFibGUKKyNkZWZpbmUgICAgSFJFR19FVl9BTExPQwkJCTB4MDAwOAkvLyBBc3luY2hyb25vdXMgcGFydCBvZiBBbGxvY2F0aW9uL1JlY2xhaW0gY29tcGxldGVkCisjZGVmaW5lICAgIEhSRUdfRVZfVFhfRVhDCQkJMHgwMDA0CS8vIEFzeW5jaHJvbm91cyBUcmFuc21pc3Npb24gdW5zdWNjZXNzZnVsIGNvbXBsZXRlZAorI2RlZmluZSAgICBIUkVHX0VWX1RYCQkJCTB4MDAwMgkvLyBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIHN1Y2Nlc3NmdWwgY29tcGxldGVkCisjZGVmaW5lICAgIEhSRUdfRVZfUlgJCQkJMHgwMDAxCS8vIEFzeW5jaHJvbm91cyBSZWNlaXZlIEZyYW1lCisKKyNkZWZpbmUgICAgSFJFR19FVl9UWF9FWFQgCQkJKCAoSENGX0VYVCkgJiAoSENGX0VYVF9JTlRfVFhfRVggfCBIQ0ZfRVhUX0lOVF9USUNLICkgKQorCQkJCQkJCQkJLyogSFJFR19FVl9UWF9FWFQgOj0gMHgwMDAwIG9yIEhSRUdfRVZfVFhfRVhDIGFuZC9vciBIUkVHX0VWX1RJQ0sKKwkJCQkJCQkJCSAqIGNvdWxkIGJlIGV4dGVuZGVkIHdpdGggSFJFR19FVl9UWCAqLworI2lmIEhDRl9FWFRfSU5UX1RYX0VYICE9IEhSRUdfRVZfVFhfRVhDCitlcnI6IHRoZXNlIHZhbHVlcyBzaG91bGQgbWF0Y2g7CisjZW5kaWYgLy8gSENGX0VYVF9JTlRfVFhfRVggLyBIUkVHX0VWX1RYX0VYQworCisjaWYgSENGX0VYVF9JTlRfVElDSyAhPSBIUkVHX0VWX1RJQ0sKK2VycjogdGhlc2UgdmFsdWVzIHNob3VsZCBtYXRjaDsKKyNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9USUNLIC8gSFJFR19FVl9USUNLCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKiBIb3N0IFNvZnR3YXJlCisjZGVmaW5lIEhSRUdfU1dfMAkJCQkweDI4CQkvLworI2RlZmluZSBIUkVHX1NXXzEJCQkJMHgyQQkJLy8KKyNkZWZpbmUgSFJFR19TV18yCQkJCTB4MkMJCS8vCisvL3JzcnZkICNkZWZpbmUgSFJFR19TV18zCQkweDJFCQkvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqIENvbnRyb2wgYW5kIEF1eGlsaWFyeSBQb3J0CisKKyNkZWZpbmUgSFJFR19JTwkJCQkJMHgxMgorI2RlZmluZQkJSFJFR19JT19TUkVTRVQJCQkweDAwMDEKKyNkZWZpbmUJCUhSRUdfSU9fV0FLRVVQX0FTWU5DCTB4MDAwMgorI2RlZmluZQkJSFJFR19JT19XT0tFTl9VUAkJMHgwMDA0CisjZGVmaW5lIEhSRUdfQ05UTAkJCQkweDE0CQkvLworLy8jZGVmaW5lCQlIUkVHX0NOVExfV0FLRVVQX1NZTkMJMHgwMDAxCisjZGVmaW5lCQlIUkVHX0NOVExfQVVYX0VOQV9TVEFUCTB4QzAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9ESVNfU1RBVAkweDAwMDAKKyNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRU5BX0NOVEwJMHg4MDAwCisjZGVmaW5lCQlIUkVHX0NOVExfQVVYX0RJU19DTlRMCTB4NDAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9EU0QJCTB4MjAwMAorI2RlZmluZQkJSFJFR19DTlRMX0FVWF9FTkEJCShIUkVHX0NOVExfQVVYX0VOQV9DTlRMIHwgSFJFR19DTlRMX0FVWF9ESVNfQ05UTCApCisjZGVmaW5lIEhSRUdfU1BBUkUJCQkJMHgxNgkJLy8KKyNkZWZpbmUgSFJFR19BVVhfUEFHRQkJCTB4M0EJCS8vCisjZGVmaW5lIEhSRUdfQVVYX09GRlNFVAkJCTB4M0MJCS8vCisjZGVmaW5lIEhSRUdfQVVYX0RBVEEJCQkweDNFCQkvLworCisjaWYgSENGX0RNQQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqIERNQSAoYnVzIG1hc3RlcmluZykKKwkvLyBCZSBjYXJlZnVsbCB0byB1c2UgdGhlc2UgcmVnaXN0ZXJzIG9ubHkgYXQgYSBnZW51aW5lIDMyIGJpdHMgTklDCisJLy8gT24gMTYgYml0cyBOSUNzLCB0aGVzZSBhZGRyZXNzZXMgYXJlIG1hcHBlZCBpbnRvIHRoZSByYW5nZSAweDAwIHRocm91Z2ggMHgzRiB3aXRoIGFsbCBjb25zZXF1ZW5jZXMKKwkvLyB0aGVyZW9mLCBlLmcuICBIUkVHX0RNQV9DVFJMIHJlZ2lzdGVyIG1hcHMgdG8gSFJFR19DTUQuCisjZGVmaW5lIEhSRUdfRE1BX0NUUkwJCQkJCQkweDAwNDAKKyNkZWZpbmUgSFJFR19UWERNQV9QVFIzMgkJCQkJMHgwMDQ0CisjZGVmaW5lIEhSRUdfVFhETUFfUFJJT19QVFIzMgkJCQkweDAwNDgKKyNkZWZpbmUgSFJFR19UWERNQV9ISVBSSU9fUFRSMzIJCQkJMHgwMDRDCisjZGVmaW5lIEhSRUdfUlhETUFfUFRSMzIJCQkJCTB4MDA1MAorI2RlZmluZSBIUkVHX0NBUkRERVRFQ1RfMQkJCQkJMHgwMDdDIC8vIGNvbnRhaW5zIDdEMzcKKyNkZWZpbmUgSFJFR19DQVJEREVURUNUXzIJCQkJCTB4MDA3RSAvLyBjb250YWlucyA3REU3CisjZGVmaW5lIEhSRUdfRlJFRVRJTUVSCQkJCQkJMHgwMDU4CisjZGVmaW5lIEhSRUdfRE1BX1JYX0NOVAkJCQkJCTB4MDAyNgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlZmluZXMgZm9yIHRoZSBiaXRzIGluIHRoZSBEbWFDb250cm9sIHJlZ2lzdGVyIChANDBoKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYSFdFTgkJCQkweDgwMDAwMDAwIC8vIGhpZ2ggd29yZCBlbmFibGUgYml0CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhSRVNFVAkJCQkweDQwMDAwMDAwIC8vIHR4IGRtYSBpbml0IGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQkFQMQkJCQlCSVQyOQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX1NUQUxMRUQJCQlCSVQyOAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19ETUFET05FCQlCSVQyNyAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFRETUFET05FIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0lORk8JCUJJVDI2IC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgYWxsb2MgZXZlbnQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfRE1BRU4JCTB4MDIwMDAwMDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBUeERNQWVuIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX1JYCQkJMHgwMTAwMDAwMCAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIHR4IGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfQlVTWQkJCQlCSVQyMyAvLyByZWFkIG9ubHkgYml0CisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9SQlVGQ09OVF9QTEFJTgkJMAkgIC8vIGJpdHMgMjEuLjIwCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX1BMQUlOX0RNQQkJMAkgIC8vIG1vZGUgMAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX01PREVfU0lOR0xFX1BBQ0tFVAkweDAwMDEwMDAwIC8vIG1vZGUgMQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX01PREVfTVVMVElfUEFDS0VUCTB4MDAwMjAwMDAgLy8gbW9kZSAyCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX0RJU0FCTEUJCSgweDAwMDIwMDAwfDB4MDAwMTAwMDApIC8vIGRpc2FibGUgdHggZG1hIGVuZ2luZQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYSFdFTgkJCQkweDgwMDAgLy8gbG93IHdvcmQgZW5hYmxlIGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYUkVTRVQJCQkJMHg0MDAwIC8vIHJ4IGRtYSBpbml0IGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQkFQMQkJCQlCSVQxMworI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFET05FCQlCSVQxMSAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFJ4RE1BRE9ORSBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFFTgkJMHgwMDAwMDQwMCAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFJ4RE1BZW4gZXZlbnQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BQUxMT0MJMHgwMDAwMDIwMCAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBpbmZvIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX1RYCQkJMHgwMDAwMDEwMCAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciByeCBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX0JVU1kJCQkJQklUNyAgLy8gcmVhZCBvbmx5IGJpdAorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfVEJVRkNPTlRfUExBSU4JCTAJICAvLyBiaXRzIDYuLjUKKy8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfUExBSU5fRE1BCQkwCSAgLy8gbW9kZSAwCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9TSU5HTEVfUEFDS0VUCUJJVDAgLy8gbW9kZSAxCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9NVUxUSV9QQUNLRVQJMHgwMDAwMDAwMiAvLyBtb2RlIDIKKy8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfRElTQUJMRQkJKDB4MDAwMDAwMDF8MHgwMDAwMDAwMikgLy8gZGlzYWJsZSB0eCBkbWEgZW5naW5lCisKKy8vY29uZmlndXJhdGlvbiBEV09SRCB0byBjb25maWd1cmUgRE1BIGZvciBtb2RlMiBvcGVyYXRpb24sIHVzaW5nIEJBUDAgYXMgdGhlIERNQSBCQVAuCisjZGVmaW5lIERNQV9DVFJMU1RBVF9HTyAoSFJFR19ETUFfQ1RSTF9SWEhXRU4gfCBIUkVHX0RNQV9DVFJMX1JYX01PREVfTVVMVElfUEFDS0VUIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0RNQUVOIHwgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfUlggfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgSFJFR19ETUFfQ1RSTF9UWEhXRU4gfCAvKjs/SFJFR19ETUFfQ1RSTF9UWF9UQlVGQ09OVF9QTEFJTiB8Ki8gXAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9NVUxUSV9QQUNLRVQgfCBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFFTiB8XAorICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX0RNQUFMTE9DKQorCisvL2NvbmZpZ3VyYXRpb24gRFdPUkQgdG8gcmVzZXQgYm90aCB0aGUgVHggYW5kIFJ4IERNQSBlbmdpbmVzCisjZGVmaW5lIERNQV9DVFJMU1RBVF9SRVNFVCAoSFJFR19ETUFfQ1RSTF9SWEhXRU4gfCBIUkVHX0RNQV9DVFJMX1JYUkVTRVQgfCBIUkVHX0RNQV9DVFJMX1RYSFdFTiB8IEhSRUdfRE1BX0NUUkxfVFhSRVNFVCkKKworLy8jZGVmaW5lIERFU0NfRE1BX09XTkVEICAgICAJCTB4ODAwMDAwMDAgCQkJCQkvLyBCSVQzMQorI2RlZmluZSBERVNDX0RNQV9PV05FRCAgICAgCQkweDgwMDAJIAkJCQkJLy8gQklUMzEKKyNkZWZpbmUgREVTQ19TT1AgICAJCQkgCTB4ODAwMCAJCQkJCQkvLyBCSVQxNQorI2RlZmluZSBERVNDX0VPUCAgIAkJCSAJMHg0MDAwIAkJCQkJCS8vIEJJVDE0CisKKyNkZWZpbmUgRE1BX1JYCQkJCTAKKyNkZWZpbmUgRE1BX1RYCQkJCTEKKworLy8gI2RlZmluZSBJRkJfUnhGaXJzdERlc2MJCUlGQl9GaXJzdERlc2NbRE1BX1JYXQorLy8gI2RlZmluZSBJRkJfVHhGaXJzdERlc2MJCUlGQl9GaXJzdERlc2NbRE1BX1RYXQorLy8gI2RlZmluZSBJRkJfUnhMYXN0RGVzYwkJSUZCX0xhc3REZXNjW0RNQV9SWF0KKy8vICNkZWZpbmUgSUZCX1R4TGFzdERlc2MJCUlGQl9MYXN0RGVzY1tETUFfVFhdCisKKyNlbmRpZiAvLyBIQ0ZfRE1BCisvLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBFUVVBVEVTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vIEhlcm1lcyBDb21tYW5kIENvZGVzIGFuZCBRdWFsaWZpZXIgYml0cworI2RlZmluZSAJSENNRF9CVVNZCQkJMHg4MDAwCS8vIEJ1c3kgYml0LCBhcHBsaWNhYmxlIGZvciBhbGwgY29tbWFuZHMKKyNkZWZpbmUgSENNRF9JTkkJCQkJMHgwMDAwCS8vCisjZGVmaW5lIEhDTURfRU5BQkxFCQkJCUhDRl9DTlRMX0VOQUJMRQkJLy8gMHgwMDAxCisjZGVmaW5lIEhDTURfRElTQUJMRQkJCUhDRl9DTlRMX0RJU0FCTEUJLy8gMHgwMDAyCisjZGVmaW5lIEhDTURfQ09OTkVDVAkJCUhDRl9DTlRMX0NPTk5FQ1QJLy8gMHgwMDAzCisjZGVmaW5lIEhDTURfRVhFQ1VURQkJCTB4MDAwNAkvLworI2RlZmluZSBIQ01EX0RJU0NPTk5FQ1QJCQlIQ0ZfQ05UTF9ESVNDT05ORUNUCS8vIDB4MDAwNQorI2RlZmluZSBIQ01EX1NMRUVQCQkJCTB4MDAwNgkvLworI2RlZmluZSBIQ01EX0NPTlRJTlVFCQkJSENGX0NOVExfQ09OVElOVUUJLy8gMHgwMDA3CisjZGVmaW5lIAlIQ01EX1JFVFJZCQkJMHgwMTAwCS8vIFJldHJ5IGJpdAorI2RlZmluZSBIQ01EX0FMTE9DCQkJCTB4MDAwQQkvLworI2RlZmluZSBIQ01EX1RYCQkJCQkweDAwMEIJLy8KKyNkZWZpbmUgCUhDTURfUkVDTAkJCTB4MDEwMAkvLyBSZWNsYWltIGJpdCwgYXBwbGljYWJsZSBmb3IgVHggYW5kIElucXVpcmUKKyNkZWZpbmUgSENNRF9JTlFVSVJFCQkJMHgwMDExCS8vCisjZGVmaW5lIEhDTURfQUNDRVNTCQkJCTB4MDAyMQkvLworI2RlZmluZSAJSENNRF9BQ0NFU1NfV1JJVEUJMHgwMTAwCS8vIFdyaXRlIGJpdAorI2RlZmluZSBIQ01EX1BST0dSQU0JCQkweDAwMjIJLy8KKyNkZWZpbmUgSENNRF9SRUFEX01JRgkJCTB4MDAzMAorI2RlZmluZSBIQ01EX1dSSVRFX01JRgkJCTB4MDAzMQorI2RlZmluZSBIQ01EX1RIRVNFVVMJCQkweDAwMzgKKyNkZWZpbmUgCUhDTURfU1RBUlRQUkVBTUJMRSAgMHgwRTAwCS8vIFN0YXJ0IGNvbnRpbnVvdXMgcHJlYW1ibGUgVHgKKyNkZWZpbmUgCUhDTURfU1RPUAkJCTB4MEYwMAkvLyBTdG9wIFRoZXNldXMgdGVzdCBtb2RlCisKKworLy9Db25maWd1cmF0aW9uIE1hbmFnZW1lbnQKKy8vCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEgvVyAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAkxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEgvVyAtIGRyaXZlciBJL0YKKworI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTQkxNgkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUCAgICAxNgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNlbHNlICAvLzs/IGlzIHRoaXMgUkVBTExZIE8uSy4KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTQkyCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QICAgIDIJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NCTYJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUCAgICA2CS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZWxzZSAvLyAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUCAgICAyCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKworI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX1RPUCAgICAxCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9UT1AgICAgMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQgSENGX0NGR19QUklfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX1BSSV8xX0JPVFRPTQorZXJyOiBQUklfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZW5kaWYgLy8gSENGX0NGR19QUklfMV9UT1AgLyBIQ0ZfQ0ZHX1BSSV8xX0JPVFRPTQorCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX1BSSV8yX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfUFJJXzJfQk9UVE9NCitlcnI6IFBSSV8yIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX1BSSV8yX1RPUCAvIEhDRl9DRkdfUFJJXzJfQk9UVE9NCisKKyNpZmRlZiBIQ0ZfQ0ZHX1BSSV8zX1RPUAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2lmIEhDRl9DRkdfUFJJXzNfVE9QID09IDAgfHwgXAorCUNGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00gPD0gSENGX0NGR19QUklfM19UT1AgJiYgSENGX0NGR19QUklfM19UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAlIQ0ZfQ0ZHX1BSSV8zX1RPUAorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19QUklfM19UT1AKKworI2lmZGVmIEhDRl9DRkdfUFJJXzNfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NIDw9IEhDRl9DRkdfUFJJXzNfQk9UVE9NICYmIEhDRl9DRkdfUFJJXzNfQk9UVE9NIDw9IENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00JSENGX0NGR19QUklfM19CT1RUT00KKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfUFJJXzNfQk9UVE9NCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkIEhDRl9DRkdfSFNJXzBfVE9QIHx8IGRlZmluZWQgSENGX0NGR19IU0lfMF9CT1RUT00KK2VycjogSFNJXzAgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjZW5kaWYgLy8gSENGX0NGR19IU0lfMF9UT1AgLyBIQ0ZfQ0ZHX0hTSV8wX0JPVFRPTQorCisjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8xX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfSFNJXzFfQk9UVE9NCitlcnI6IEhTSV8xIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzFfVE9QIC8gSENGX0NGR19IU0lfMV9CT1RUT00KKworI2lmIGRlZmluZWQgSENGX0NGR19IU0lfMl9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8yX0JPVFRPTQorZXJyOiBIU0lfMiBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV8yX1RPUCAvIEhDRl9DRkdfSFNJXzJfQk9UVE9NCisKKyNpZiBkZWZpbmVkIEhDRl9DRkdfSFNJXzNfVE9QIHx8IGRlZmluZWQgSENGX0NGR19IU0lfM19CT1RUT00KK2VycjogSFNJXzMgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjZW5kaWYgLy8gSENGX0NGR19IU0lfM19UT1AgLyBIQ0ZfQ0ZHX0hTSV8zX0JPVFRPTQorCisjaWZkZWYgSENGX0NGR19IU0lfNF9UT1AgCQkJCQkJCQkJLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNpZiBIQ0ZfQ0ZHX0hTSV80X1RPUCA9PSAwIHx8IFwKKwlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NIDw9IENGX0NGR19IU0lfNF9UT1AgJiYgSENGX0NGR19IU0lfNF9UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAlIQ0ZfQ0ZHX0hTSV80X1RPUAorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19IU0lfNF9UT1AKKworI2lmZGVmIEhDRl9DRkdfSFNJXzRfQk9UVE9NCQkJCQkJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2lmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00gPD0gSENGX0NGR19IU0lfNF9CT1RUT00gJiYgSENGX0NGR19IU0lfNF9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X0JPVFRPTQlIQ0ZfQ0ZHX0hTSV80X0JPVFRPTQorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19IU0lfNF9CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfSFNJXzVfVE9QIAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjaWYgSENGX0NGR19IU0lfNV9UT1AgPT0gMCB8fCBcCisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSA8PSBDRl9DRkdfSFNJXzVfVE9QICYmIEhDRl9DRkdfSFNJXzVfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AJSENGX0NGR19IU0lfNV9UT1AKKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzVfVE9QCisKKyNpZmRlZiBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTQkJCQkJCQkJLy8gQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKKyNpZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NIDw9IEhDRl9DRkdfSFNJXzVfQk9UVE9NICYmIEhDRl9DRkdfSFNJXzVfQk9UVE9NIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00JSENGX0NGR19IU0lfNV9CT1RUT00KKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzVfQk9UVE9NCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIGRlZmluZWQgSENGX0NGR19BUEZfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0FQRl8xX0JPVFRPTQorZXJyOiBBUEZfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfQVBGXzFfVE9QIC8gSENGX0NGR19BUEZfMV9CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfQVBGXzJfVE9QICAgICAgICAgICAgICAgICAgCQkJCQkvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgSENGX0NGR19BUEZfMl9UT1AgPT0gMCB8fCBcCisJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSA8PSBIQ0ZfQ0ZHX0FQRl8yX1RPUCAmJiBIQ0ZfQ0ZHX0FQRl8yX1RPUCA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCUhDRl9DRkdfQVBGXzJfVE9QCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0FQRl9UT1AKKworI2lmZGVmIEhDRl9DRkdfQVBGXzJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSA8PSBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSAmJiBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCisjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NCUhDRl9DRkdfQVBGXzJfQk9UVE9NCisjZWxzZQorZXJyOiA7CisjZW5kaWYKKyNlbmRpZiAvLyBIQ0ZfQ0ZHX0FQRl9CT1RUT00KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBkZWZpbmVkIEhDRl9DRkdfU1RBXzFfVE9QIHx8IGRlZmluZWQgSENGX0NGR19TVEFfMV9CT1RUT00KK2VycjogU1RBXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2VuZGlmIC8vIEhDRl9DRkdfU1RBXzFfVE9QIC8gSENGX0NGR19TVEFfMV9CT1RUT00KKworI2lmZGVmIEhDRl9DRkdfU1RBXzJfVE9QICAgICAgICAgICAgICAgICAgCQkJCQkvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBIQ0ZfQ0ZHX1NUQV8yX1RPUCA9PSAwIHx8IFwKKwlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NIDw9IEhDRl9DRkdfU1RBXzJfVE9QICYmIEhDRl9DRkdfU1RBXzJfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AKKyN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AJSENGX0NGR19TVEFfMl9UT1AKKyNlbHNlCitlcnI6IDsKKyNlbmRpZgorI2VuZGlmIC8vIEhDRl9DRkdfU1RBX1RPUAorCisjaWZkZWYgSENGX0NGR19TVEFfMl9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgIAkJCS8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2lmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00gPD0gSENGX0NGR19TVEFfMl9CT1RUT00gJiYgSENGX0NGR19TVEFfMl9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAorI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00KKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQlIQ0ZfQ0ZHX1NUQV8yX0JPVFRPTQorI2Vsc2UKK2VycjogOworI2VuZGlmCisjZW5kaWYgLy8gSENGX0NGR19TVEFfQk9UVE9NCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTUFDUk9TICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBtaW4gYW5kIG1heCBtYWNyb3MgKi8KKyNpZiAhIGRlZmluZWQgbWF4CisjZGVmaW5lIG1heChhLGIpICAJCSgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKyNlbmRpZgorI2lmICEgZGVmaW5lZCBtaW4KKyNkZWZpbmUgbWluKGEsYikgIAkJKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZmRlZiBIQ0ZfU0xFRVAKKyNpZiBkZWZpbmVkIE1TRl9XQUlUCitlcnI6IE1TRiBzaG91bGQgbm8gbG9uZ2VyIHN1cHBseSB0aGlzIG1hY3JvOworI2Vsc2UKKyNkZWZpbmUgTVNGX1dBSVQoeCkgCQkJCQkJCQkJCQkJCQkJCQkJCVwKKwl7IFBST1RfQ05UX0lOSQkJCQkJCQkJCQkJCQkJXAorCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfSU8gKSAmIEhSRUdfSU9fV09LRU5fVVAgKSA9PSAwICk7CQkJCQkJXAorCQlIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfSU8gKSApCQkJCQkJCVwKKwl9CisjZW5kaWYgLy8gTVNGX1dBSVQKKyNlbHNlCisjZGVmaW5lIE1TRl9XQUlUKHgpCS8qTk9QKi8KKyNlbmRpZiAvLyBIQ0ZfU0xFRVAKKworI2RlZmluZSBMT0YoeCkgCQkJKHNpemVvZih4KS9zaXplb2YoaGNmXzE2KS0xKQorCisjZGVmaW5lIE1VTF9CWV8yKCB4ICkJKCAoeCkgPDwgMSApCQkJCQkJLy91c2VkIHRvIG11bHRpcGx5IGJ5IDIKKyNkZWZpbmUgRElWX0JZXzIoIHggKQkoICh4KSA+PiAxICkJCQkJCQkvL3VzZWQgdG8gZGl2aWRlIGJ5IDIKKworLy9yZXNvbHZlIHByb2JsZW1zIG9uIGZvciBzb21lIDE2IGJpdHMgY29tcGlsZXJzIHRvIGNyZWF0ZSAzMiBiaXQgdmFsdWVzCisjZGVmaW5lIE1FUkdFXzIoIGh3LCBsdyApCSggKCAoKGhjZl8zMikoaHcpKSA8PCAxNiApIHwgKChoY2ZfMTYpKGx3KSkgKQorCisjaWYgISBkZWZpbmVkIEhDRl9TVEFUSUMKKyNkZWZpbmUJCSAgSENGX1NUQVRJQwlzdGF0aWMKKyNlbmRpZiAvLwkgIEhDRl9TVEFUSUMKKworI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCisjZGVmaW5lIERBV0FfQUNLKCBtYXNrKSB7CQkJCQkJCQkJCQkJCVwKKwlPUFcoIEhSRUdfRVZfQUNLLCBtYXNrIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7CQkJCQkJXAorCU9QVyggSFJFR19FVl9BQ0ssIChtYXNrICYgfkhSRUdfRVZfQUxMT0MpIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7IAl9CisjZGVmaW5lIERBV0FfWkVST19GSUQocmVnKSBPUFcoIHJlZywgMCApOworI2Vsc2UKKyNkZWZpbmUgREFXQV9BQ0soIG1hc2spICAgT1BXKCBIUkVHX0VWX0FDSywgbWFzayApOworI2RlZmluZSBEQVdBX1pFUk9fRklEKHJlZykKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisjZGVmaW5lCUNBTENfUlhfTUlDKCBwLCBsZW4gKSBjYWxjX21pY19yeF9mcmFnKCBpZmJwLCBwLCBsZW4gKQorI2RlZmluZQlDQUxDX1RYX01JQyggcCwgbGVuICkgY2FsY19taWNfdHhfZnJhZyggaWZicCwgcCwgbGVuICkKKyNkZWZpbmUgSUZfU1NOKHgpICB4CisjZGVmaW5lIElGX05PVF9TU04oeCkKKyNlbHNlCisjZGVmaW5lCUNBTENfUlhfTUlDKCBwLCBsZW4gKQorI2RlZmluZQlDQUxDX1RYX01JQyggcCwgbGVuICkKKyNkZWZpbmUgTUlDX1JYX1JUTiggbWljLCBkdyApCisjZGVmaW5lIE1JQ19UWF9SVE4oIG1pYywgZHcgKQorI2RlZmluZSBJRl9TU04oeCkKKyNkZWZpbmUgSUZfTk9UX1NTTih4KSB4CisjZW5kaWYgLy8gSENGX1RZUEVfV1BBCisKKyNpZiBIQ0ZfVEFMTElFUyAmIEhDRl9UQUxMSUVTX0hDRgkJLy9IQ0YgdGFsbHkgc3VwcG9ydAorI2RlZmluZSBJRl9UQUxMWSh4KSAgeAorI2Vsc2UKKyNkZWZpbmUgSUZfVEFMTFkoeCkKKyNlbmRpZiAvLyBIQ0ZfVEFMTElFU19IQ0YKKworCisjaWYgSENGX0RNQQorI2RlZmluZSBJRl9ETUEoeCkJCQl4CisjZGVmaW5lIElGX05PVF9ETUEoeCkKKyNkZWZpbmUgSUZfVVNFX0RNQSh4KSAJCWlmICggICBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgICkgeAorI2RlZmluZSBJRl9OT1RfVVNFX0RNQSh4KQlpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSApIHgKKyNlbHNlCisjZGVmaW5lIElGX0RNQSh4KQorI2RlZmluZSBJRl9OT1RfRE1BKHgpCQl4CisjZGVmaW5lIElGX1VTRV9ETUEoeCkKKyNkZWZpbmUgSUZfTk9UX1VTRV9ETUEoeCkgCXgKKyNlbmRpZiAvLyBIQ0ZfRE1BCisKKworI2RlZmluZSBJUFcoeCkgKChoY2ZfMTYpSU5fUE9SVF9XT1JEKCBpZmJwLT5JRkJfSU9CYXNlICsgKHgpICkgKQorI2RlZmluZSBPUFcoeCwgeSkgT1VUX1BPUlRfV09SRCggaWZicC0+SUZCX0lPQmFzZSArICh4KSwgeSApCisJLyogbWFrZSBzdXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBIQ0ZfV0FJVF9XSElMRSBpcyBzdWNoIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIEhDRl9XQUlUX1dISUxFIGNhbGxzCisJICogaW4gYSByb3cgYW5kIHRoYXQgd2hlbiBvbmUgZmFpbHMgYWxsIHN1YnNlcXVlbnQgZmFpbCBpbW1lZGlhdGVseSB3aXRob3V0IHJlaW5pdGlhbGl6YXRpb24gb2YgcHJvdF9jbnQKKwkgKi8KKyNpZiBIQ0ZfUFJPVF9USU1FID09IDAKKyNkZWZpbmUgUFJPVF9DTlRfSU5JCisjZGVmaW5lIElGX1BST1RfVElNRSh4KQorI2lmIGRlZmluZWQgSENGX1lJRUxECisjZGVmaW5lIEhDRl9XQUlUX1dISUxFKCB4ICkgd2hpbGUgKCAoeCkgJiYgKEhDRl9ZSUVMRCkgKSAvKk5PUCovOworI2Vsc2UKKyNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoIHggKSAvKk5PUCovOworI2VuZGlmIC8vIEhDRl9ZSUVMRAorI2Vsc2UKKyNkZWZpbmUgUFJPVF9DTlRfSU5JIAloY2ZfMzIgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaTsKKyNkZWZpbmUgSUZfUFJPVF9USU1FKHgpCXgKKyNpZiBkZWZpbmVkIEhDRl9ZSUVMRAorI2RlZmluZSBIQ0ZfV0FJVF9XSElMRSggeCApIHdoaWxlICggcHJvdF9jbnQgJiYgKHgpICYmIChIQ0ZfWUlFTEQpICkgcHJvdF9jbnQtLTsKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoIHByb3RfY250ICYmICh4KSApIHsgdWRlbGF5KDIpOyBwcm90X2NudC0tOyB9CisjZW5kaWYgLy8gSENGX1lJRUxECisjZW5kaWYgLy8gSENGX1BST1RfVElNRQorCisjaWYgZGVmaW5lZCBIQ0ZfRVhfSU5UCisvLyNpZiBIQ0ZfRVhfSU5UICYgfiggSENGX0VYX0lOVF9UWF9FWCB8IEhDRl9FWF9JTlRfVFhfT0sgfCBIQ0ZfRVhfSU5UX1RJQ0sgKQorOz8gb3V0IGRhdGVkIGNoZWNraW5nCitlcnI6IHlvdSB1c2VkIGFuIGludmFsaWQgYml0bWFzazsKKy8vICNlbmRpZiAvLyBIQ0ZfRVhfSU5UIHZhbGlkYXRpb24KKy8vICNlbHNlCisvLyAjZGVmaW5lIEhDRl9FWF9JTlQgMHgwMDAKKyNlbmRpZiAvLyBIQ0ZfRVhfSU5UCisKKyNpZiAwIC8vZ2V0IGNvbXBpbGVyIGdvaW5nCisjaWYgSENGX0VYX0lOVF9USUNLCSE9IEhSRUdfRVZfVElDSworOz8gb3V0IGRhdGVkIGNoZWNraW5nCitlcnI6IHNvbWVvbmUgcmVkZWZpbmVkIHRoZXNlIG1hY3JvcyB3aGlsZSB0aGUgaW1wbGVtZW5hdGlvbiBhc3N1bWVzIHRoZXkgYXJlIGVxdWFsOworI2VuZGlmCisjaWYgSENGX0VYX0lOVF9UWF9PSyAhPSBIRlNfVFhfQ05UTF9UWF9PSyB8fCBIRlNfVFhfQ05UTF9UWF9PSyAhPSBIUkVHX0VWX1RYX09LCis7PyBvdXQgZGF0ZWQgY2hlY2tpbmcKK2Vycjogc29tZW9uZSByZWRlZmluZWQgdGhlc2UgbWFjcm9zIHdoaWxlIHRoZSBpbXBsZW1lbmF0aW9uIGFzc3VtZXMgdGhleSBhcmUgZXF1YWw7CisjZW5kaWYKKyNpZiBIQ0ZfRVhfSU5UX1RYX0VYICE9IEhGU19UWF9DTlRMX1RYX0VYIHx8IEhGU19UWF9DTlRMX1RYX0VYICE9IEhSRUdfRVZfVFhfRVgKKzs/IG91dCBkYXRlZCBjaGVja2luZworZXJyOiBzb21lb25lIHJlZGVmaW5lZCB0aGVzZSBtYWNyb3Mgd2hpbGUgdGhlIGltcGxlbWVuYXRpb24gYXNzdW1lcyB0aGV5IGFyZSBlcXVhbDsKKyNlbmRpZgorI2VuZGlmIC8vIDAgZ2V0IGNvbXBpbGVyIGdvaW5nCisKKworLyogVGhlIGFzc2VydCBpbiBIQ0ZMT0dFTlRSWSBjaGVja3MgYWdhaW5zdCByZS1lbnRyYW5jeS4gUmUtZW50cmFuY3kgY291bGQgYmUgY2F1c2VkIGJ5IE1TRiBsb2dpYyBhdAorICogdGFzay1sZXZlbCBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBzaGllbGRpbmcgd2l0aCBIQ0ZfQUNUX09OL19PRkYuIFdoZW4gYW4gaW50ZXJydXB0IG9jY3VycywKKyAqIHRoZSBJU1IgY291bGQgKGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5KSBjYXVzZSByZS1lbnRlcmluZyBvZiB0aGUgaW50ZXJydXB0ZWQgSENGLXJvdXRpbmUuCisgKgorICogVGhlICIoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIiB0ZXN0IGluIEhDRkxPR0VOVFJZIHNlcnZpY2VzIEFMU08gYXMgYSBzdGF0ZW1lbnQgdG8gZ2V0IGFyb3VuZDoKKyAqICNwcmFnbWEgd2FybmluZzogY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudAorICogb24gdGhlIGlmLXN0YXRlbWVudAorICovCisjaWYgSENGX0FTU0VSVAorI2RlZmluZSBIQ0ZBU1NFUlQoeCxxKSB7aWYgKCEoeCkpIHttZGRfYXNzZXJ0KCAgICAgICAgaWZicCwgX19MSU5FX18gICAgICAgICAgICAgICAgICAgLCBxICk7fX0KKyNkZWZpbmUgTU1EQVNTRVJUKHgscSkge2lmICghKHgpKSB7bWRkX2Fzc2VydCggYXNzZXJ0X2lmYnAsIF9fTElORV9fICsgRklMRV9OQU1FX09GRlNFVCwgcSApO319CisKKyNkZWZpbmUgSENGTE9HRU5UUlkoIHdoZXJlLCB3aGF0ICkgCQkJCQkJCQkJCQkJCQlcCit7aWYgKCAoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIDw9IDE1ICkgewkJCQkJCQkJCQkJXAorCUhDRl9FTlRSWSggaWZicCApOyAJCQkJCQkJCQkJCQkJCQkJCVwKKwlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiAxPDwoKHdoZXJlKSYweEYpKSA9PSAwLCBpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgKTsJCVwKKwlpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgfD0gMTw8KCh3aGVyZSkmMHhGKTsJCQkJCQkJCQkJCQlcCisJfQkJCQkJCQkJCQkJCQkJCQkJCQkJCVwKK0hDRlRSQUNFKGlmYnAsIHdoZXJlICkJCQkJCQkJCQkJCQkJCQkJCVwKK0hDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApCQkJCQkJCQkJCQkJCQkJCVwKK30KKworI2RlZmluZSBIQ0ZMT0dFWElUKCB3aGVyZSApIAkJCQkJCQkJCQkJCQkJCVwKK3tpZiAoIChpZmJwLT5JRkJfQXNzZXJ0V2hlcmUgPSB3aGVyZSkgPD0gMTUgKSB7CQkJCQkJCQkJCQlcCisgIAlIQ0ZfRVhJVCggaWZicCApOyAJCQkJCQkJCQkJCQkJCQkJCVwKKwlpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJj0gfigxPDwoKHdoZXJlKSYweEYpKTsJCQkJCQkJCQkJCQlcCisJfQkJCQkJCSAJCQkJCQkJCQkJCQkJCQlcCitIQ0ZUUkFDRShpZmJwLCAod2hlcmUpfEhDRl9UUkFDRV9FWElUICkJCQkJCQkJCQkJCQkJXAorfQorCisjZWxzZSAvLyBIQ0ZfQVNTRVJUCisjZGVmaW5lIEhDRkFTU0VSVCggeCwgcSApCisjZGVmaW5lIE1NREFTU0VSVCggeCwgcSApCisjZGVmaW5lIEhDRkxPR0VOVFJZKCB3aGVyZSwgd2hhdCApIAkgIAl7SENGX0VOVFJZKCBpZmJwICk7fQorI2RlZmluZSBIQ0ZMT0dFWElUKCB3aGVyZSApIAkJICAJe0hDRl9FWElUKCBpZmJwICk7fQorI2VuZGlmIC8vIEhDRl9BU1NFUlQKKworI2lmIEhDRl9JTlRfT04KKy8qIDs/IEhDRkFTU0VSVF9JTlQKKyAqICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKKyAqICNkZWZpbmUgSENGQVNTRVJUX0lOVCBIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGICYmIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBcCisgKiAJCQkJCQkJCSBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKyAqICNlbHNlCisgKi8KKyNkZWZpbmUgSENGQVNTRVJUX0lOVCBIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKKy8vICNlbmRpZiAvLyBIQ0ZfRERTCisjZWxzZQorI2RlZmluZSBIQ0ZBU1NFUlRfSU5UCisjZW5kaWYgLy8gSENGX0lOVF9PTgorCisKKyNpZiBkZWZpbmVkIEhDRl9UUkFDRQorI2RlZmluZSBIQ0ZUUkFDRShpZmJwLCB3aGVyZSApCSAgIHtPUFcoIEhSRUdfU1dfMSwgd2hlcmUgKTt9CisvLyNkZWZpbmUgSENGVFJBQ0UoaWZicCwgd2hlcmUgKQkgICB7SENGQVNTRVJUKCBET19BU1NFUlQsIHdoZXJlICk7fQorI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKSB7T1BXKCBIUkVHX1NXXzIsIHdoYXQgICk7fQorLy8jZGVmaW5lIEhDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApIHtIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgd2hhdCAgKTt9CisjZWxzZQorI2RlZmluZSBIQ0ZUUkFDRShpZmJwLCB3aGVyZSApCisjZGVmaW5lIEhDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApCisjZW5kaWYgLy8gSENGX1RSQUNFCisKKworI2lmIEhDRl9CSUdfRU5ESUFOCisjZGVmaW5lIEJFX1BBUih4KQkJCQkseAorI2Vsc2UKKyNkZWZpbmUgQkVfUEFSKHgpCisjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRU5EIE9GIE1BQ1JPUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgUFJPVE9UWVBFUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBIQ0ZfQVNTRVJUCitleHRlcm4gSUZCUCBCQVNFRCBhc3NlcnRfaWZicDsJCQkvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgorRVhURVJOX0Mgdm9pZAkJIG1kZF9hc3NlcnQJCQkoSUZCUCBpZmJwLCB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXIsIGhjZl8zMiBxICk7CisjZW5kaWYgLy9IQ0ZfQVNTRVJUCisKKyNpZiAhICggKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTICkJCQkJLy8gZGVmaW5lZCAxNiBiaXRzIG9ubHkKKyN1bmRlZiBPVVRfUE9SVF9TVFJJTkdfMzIKKyN1bmRlZiBJTl9QT1JUX1NUUklOR18zMgorI2VuZGlmIC8vIEhDRl9JTworI2VuZGlmCS8vSENGREVGQ19ICisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21hbi93bGFnczQ5LjQgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tYW4vd2xhZ3M0OS40Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDU4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tYW4vd2xhZ3M0OS40CkBAIC0wLDAgKzEsNzM0IEBACisuXCIgdmltOnR3PTc4OgorLlwiIENvcHlyaWdodCAoYykgMTk5OS0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLiAtLSBodHRwOi8vd3d3LmFnZXJlLmNvbQorLlwiIHdsYWdzNDkuNCA3LjIwLWFiZyAwNC8yOC8yMDA0IDEzOjMwOjAwCisuXCIKKy5USCBXTEFHUzQ5IDQgIjA0LzI4LzIwMDQgMTM6MzA6MDAiICJwY21jaWEtY3MiCisuU0ggTkFNRQord2xhZ3M0OSBcLSBBZ2VyZSBTeXN0ZW1zIFdpcmVsZXNzIFBDIENhcmQgLyBQQ0kgZGV2aWNlIGRyaXZlcnMKKword2xhZ3M0OV9oMl9jcy5vIFwtIEhlcm1lcy1JSSBDYXJkIFNlcnZpY2VzIChQQ01DSUEvQ0YpIGRyaXZlcgorLmJyCit3bGFnczQ5X2gyLm8gICAgXC0gSGVybWVzLUlJIE1pbmlQQ0kgZHJpdmVyCisuYnIKK3dsYWdzNDlfaDI1Lm8gICBcLSBIZXJtZXMtSUkuNSBQQ0kvQ2FyZEJ1cyBkcml2ZXIKKy5icgord2xhZ3M0OV9oMjVfY3Mub1wtIEhlcm1lcy1JSS41IENhcmQgU2VydmljZXMgKFBDTUNJQS9DRikgZHJpdmVyCisKKy5TSCBTWU5PUFNJUworLm5oCisuZmkKKy5CIGluc21vZCB3bGFnczQ5X1toMSxoMl1fW2NzXS5vCisuYnIKKy5SQiBbIEF1dGhlbnRpY2F0aW9uPW4gXQorLlJCIFsgQXV0aEtleU1uZ210U3VpdGU9Pz8/PyBdCisuUkIgWyBCUlNDMkdIej1iIF1ccAorLlJCIFsgQlJTQzVHSHo9YiBdCisuUkIgWyBDb2V4aXN0ZW5jZT1uIF0KKy5SQiBbIENvbmZpZ3VyZWQ9Pz8/PyBdXHAKKy5SQiBbIENvbm5lY3Rpb25Db250cm9sPT8/Pz8gXQorLlJCIFsgQ3JlYXRlSUJTUz1zIF0KKy5SQiBbIERlYnVnRmxhZz1uIF1ccAorLlJCIFsgRGVzaXJlZFNTSUQ9cyBdCisuUkIgWyBEb3dubG9hZEZpcm13YXJlPW4gXQorLlJCIFsgRHJpdmVyRW5hYmxlPT8/Pz8gXVxwCisuUkIgWyBFbmFibGVFbmNyeXB0aW9uPXMgXQorLlJCIFsgRW5jcnlwdGlvbj0/Pz8/IF0KKy5SQiBbIEV4Y2x1ZGVVbmVuY3J5cHRlZD1zIF1ccAorLlJCIFsgSW50cmFCU1NSZWxheT1zIF0KKy5SQiBbIElycUxpc3Q9aSxqLC4uLiBdCisuUkIgWyBJcnFNYXNrPW4gXVxwCisuUkIgWyBLZXkxPXMgXQorLlJCIFsgS2V5Mj1zIF0KKy5SQiBbIEtleTM9cyBdCisuUkIgWyBLZXk0PXMgXVxwCisuUkIgWyBMb2FkQmFsYW5jaW5nPXMgXQorLlJCIFsgTWF4U2xlZXBEdXJhdGlvbj1uIF0KKy5SQiBbIE1lZGl1bURpc3RyaWJ1dGlvbj1zIF1ccAorLlJCIFsgTWljcm9XYXZlUm9idXN0bmVzcz1zIF0KKy5SQiBbIE11bHRpY2FzdFBNQnVmZmVyaW5nPXMgXQorLlJCIFsgTXVsdGljYXN0UmF0ZT1uIF1ccAorLlJCIFsgTXVsdGljYXN0UmVjZWl2ZT1zIF0KKy5SQiBbIE5ldHdvcmtBZGRyZXNzPW4sbixuLG4sbixuIF0KKy5SQiBbIE5ldHdvcmtUeXBlPT8/Pz8gXVxwCisuUkIgWyBPd25BVElNV2luZG93PW4gXQorLlJCIFsgT3duQmVhY29uSW50ZXJ2YWw9biBdCisuUkIgWyBPd25DaGFubmVsPW4gXVxwCisuUkIgWyBPd25EVElNUGVyaW9kPW4gXQorLlJCIFsgT3duTmFtZT1zIF0KKy5SQiBbIE93blNTSUQ9cyBdXHAKKy5SQiBbIHBjX2RlYnVnPW4gXQorLlJCIFsgUE1FbmFibGVkPWIgXQorLlJCIFsgUE1Ib2xkb3ZlckR1cmF0aW9uPW4gXVxwCisuUkIgWyBQb3J0VHlwZT1uIF0KKy5SQiBbIFBvd2VyTW9kZT0/Pz8/IF0KKy5SQiBbIFByb21pc2N1b3VzTW9kZT1zIF1ccAorLlJCIFsgUmVqZWN0QU5ZPXMgXQorLlJCIFsgUlRTVGhyZXNob2xkPW4gXVxwCisuUkIgWyBSVFNUaHJlc2hvbGQxPW4gXQorLlJCIFsgUlRTVGhyZXNob2xkMj1uIF0KKy5SQiBbIFJUU1RocmVzaG9sZDM9biBdXHAKKy5SQiBbIFJUU1RocmVzaG9sZDQ9biBdCisuUkIgWyBSVFNUaHJlc2hvbGQ1PW4gXQorLlJCIFsgUlRTVGhyZXNob2xkNj1uIF1ccAorLlJCIFsgU1JTQzJHSHo9YiBdCisuUkIgWyBTUlNDNUdIej1iIF0KKy5SQiBbIFN5c3RlbVNjYWxlPW4gXVxwCisuUkIgWyBUeEtleT1uIF0KKy5SQiBbIFR4UmF0ZUNvbnRyb2w9biBdXHAKKy5SQiBbIFR4UmF0ZUNvbnRyb2wxPW4gXQorLlJCIFsgVHhSYXRlQ29udHJvbDI9biBdCisuUkIgWyBUeFJhdGVDb250cm9sMz1uIF1ccAorLlJCIFsgVHhSYXRlQ29udHJvbDQ9biBdCisuUkIgWyBUeFJhdGVDb250cm9sNT1uIF0KKy5SQiBbIFR4UmF0ZUNvbnRyb2w2PW4gXVxwCisuUkIgWyBXRFNBZGRyZXNzPW4sbixuLG4sbixuIF1ccAorLlJCIFsgV0RTQWRkcmVzczE9bixuLG4sbixuLG4gXQorLlJCIFsgV0RTQWRkcmVzczI9bixuLG4sbixuLG4gXVxwCisuUkIgWyBXRFNBZGRyZXNzMz1uLG4sbixuLG4sbiBdCisuUkIgWyBXRFNBZGRyZXNzND1uLG4sbixuLG4sbiBdXHAKKy5SQiBbIFdEU0FkZHJlc3M1PW4sbixuLG4sbixuIF0KKy5SQiBbIFdEU0FkZHJlc3M2PW4sbixuLG4sbixuIF1ccAorLmZpCisKKworCisuU0ggREVTQ1JJUFRJT04KKy5JIHdsYWdzNDkKK2lzIHRoZSBsb3ctbGV2ZWwgQ2FyZCBTZXJ2aWNlcyAvIFBDSSBkcml2ZXIgZm9yIHRoZQorLkIgV2lyZWxlc3MgUEMgQ2FyZCwgV2lyZWxlc3MgSW50ZWdyYXRlZCBDYXJkLCBXaXJlbGVzcyBFbWJlZGRlZCBDYXJkCithbmQgb3RoZXIgd2lyZWxlc3MgYWRhcHRlcnMgYmFzZWQgb24gdGhlIEFnZXJlIFN5c3RlbXMgSGVybWVzLUlJLCBhbmQgSGVybWVzLUlJLjUgd2lyZWxlc3MgTUFDLiBXaGVuIHRoaXMgZHJpdmVyIGlzIGF0dGFjaGVkIHRvIGEgY2FyZCwgaXQKK2FsbG9jYXRlcyB0aGUgbmV4dCBhdmFpbGFibGUgZXRoZXJuZXQgZGV2aWNlIChldGgwLi5ldGgjKS4gVGhpcworZGV2aWNlIG5hbWUgd2lsbCBiZSBwYXNzZWQgb24gdG8KKy5JUiBjYXJkbWdyICg4KSwKK29yIHRoZSBQQ0kgc3Vic3lzdGVtLCBmb3IgdGhlIGNhcmQgY29uZmlndXJhdGlvbiwgYW5kIHJlcG9ydGVkIGluIHRoZSBrZXJuZWwgbG9nIGZpbGUKK3dpdGggdGhlIEkvTyBiYXNlIGFkZHJlc3MgYW5kIE1BQyBhZGRyZXNzIHVzZWQgYnkgdGhlIGNhcmQuCisuU0ggRkVBVFVSRVMKKyBcLSBIb3QgcGx1Zy91bnBsdWcKKyBcLSBBY2Nlc3MgUG9pbnQgYW5kIHBlZXItdG8tcGVlciBjb21tdW5pY2F0aW9uCisgXC0gQ2FyZCBwb3dlciBtYW5hZ2VtZW50CisgXC0gU3VwcG9ydCBmb3IgSGVybWVzLUlJICYgSGVybWVzLUlJLjUgYmFzZWQgUENNQ0lBLCBNaW5pIFBDSSwgYW5kIENhcmRCdXMgY2FyZHMKKyBcLSBXaXJlZCBFcXVpdmFsZW50IFByaXZhY3kgKFdFUCkKKyBcLSBXUEEtUFNLIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkKKyBcLSBEcml2ZXIgdXRpbGl0eSBpbnRlcmZhY2UgKFVJTCkKKyBcLSBXaXJlbGVzcyBFeHRlbnNpb25zCisgXC0gU29mdHdhcmUgQVAgbW9kZQorLlNIIFBBUkFNRVRFUlMKKy5UUAorLkIgQXV0aGVudGljYXRpb249bgorQWxnb3JpdGhtIHVzZWQgZm9yIEF1dGhlbnRpY2F0aW9uLgorLkJSCisgICAgMSBcLSBPcGVuIFN5c3RlbQorLkJSCisgICAgMiBcLSBTaGFyZWQgS2V5CisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIEF1dGhfa2V5X21nbXRfc3VpdGUKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBCUlNDMkdIej1iCitTZXRzIHRoZSBjYXJkXCdzIEJhc2ljIFJhdGUgU2V0IGluIHRoZSAyLjRHSHogYmFuZC4gU2VlIFNSU0MyR0h6Citmb3IgdGhlIHZhbHVlXCdzIGZvcm1hdC4KKy5CUgorICAgIERlZmF1bHQ6IDE1IChvciAweDAwMEYsIG9ubHkgMTFiIHJhdGVzIHRvIGFjY2VwdCBsZWdhY3kgMTFiIHN0YXRpb25zKQorLlRQCisuQiBCUlNDNUdIei1iCitTZXRzIHRoZSBjYXJkXCdzIEJhc2ljIFJhdGUgU2V0IGluIHRoZSA1LjBHSHogYmFuZC4gU2VlIFNSU0MyR0h6IGZvciB0aGUKK3ZhbHVlXCdzIGZvcm1hdAorLkJSCisgICAgRGVmYXVsdDogNDA4MCAob3IgMHgwRkYwLCBhbGwgMTFhIHJhdGVzKQorLlRQCisuQiBDb2V4aXN0ZW5jZT1uCitVc2VkIHRvIG1ha2UgdGhlIDgwMi4xMWEvYi9nIGNvZXhpc3RlbmNlIGJlaGF2aW9yIG1vcmUgc3RyaWN0LgorLkJSCisgICAgRGVmYXVsdCBcLSAwIChVc2Ugc3RhbmRhcmQgYmVoYXZpb3IpCisuVFAKKy5CIENvbm5lY3Rpb25Db250cm9sPW4KK0NvbmZpZ3VyZXMgdGhlIGNhcmRcJ3MgY29ubmVjdGlvbiBjb250cm9sIHByb2Nlc3MgaW4gZGVhbGluZyB3aXRoIG11bHRpcGxlCitiYW5kcyAoODAyLjExYi9nIHZzLiA4MDIuMTFhKS4KKy5CUgorICAgIDAgXC0gU2luZ2xlIEJhbmQgb3BlcmF0aW9uIGluIDJHSHoKKy5CUgorICAgIDEgXC0gU2luZ2xlIEJhbmQgb3BlcmF0aW9uIGluIDVHSHoKKy5CUgorICAgIDIgXC0gTXVsdGlwbGUgQmFuZCBvcGVyYXRpb24gc3RhcnRpbmcgd2l0aCAyR0h6CisuQlIKKyAgICAzIFwtIE11bHRpcGxlIEJhbmQgb3BlcmF0aW9uIHN0YXJ0aW5nIHdpdGggNUdIegorLkJSCisgICAgRGVmYXVsdCBcLSAyCisuVFAKKy5CIENvbmZpZ3VyZWQKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBDb25uZWN0aW9uQ29udHJvbAorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIENyZWF0ZUlCU1M9cworRW5hYmxlIG9yIGRpc2FibGUgSUJTUyBDcmVhdGlvbi4KK0ZvciBjb3JyZWN0IG9wZXJhdGlvbiwgc3BlY2lmaWNhdGlvbiBvZiBhIE93blNTSUQgaXMgcmVxdWlyZWQuCitUaGlzIG1vZGUgcmVxdWlyZXMgZmlybXdhcmUgNi4wNCBvciBoaWdoZXIuCisuQlIKKyAgICBOIFwtIERpc2FibGUKKy5CUgorICAgIFkgXC0gRW5hYmxlCisuQlIKKyAgICBEZWZhdWx0OiBOCisuVFAKKy5CIERlYnVnRmxhZz1uCitTZWxlY3RzIHRoZSBkcml2ZXIgZGVidWdnaW5nIGxldmVsLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IGF2YWlsYWJsZQoraWYgdGhlIG1vZHVsZSBpcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLiBSZWZlciB0byB0aGUKK2ZpbGUKKy5CIGRlYnVnLmgKK2luIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgZmxhZyB2YWx1ZXMuCisuQlIKKyAgICAweDAwMDAwMDAxTCBcLSBEQkdfRVJST1JfT04KKy5CUgorICAgIDB4MDAwMDAwMDJMIFwtIERCR19XQVJOSU5HX09OCisuQlIKKyAgICAweDAwMDAwMDA0TCBcLSBEQkdfTk9USUNFX09OCisuQlIKKyAgICAweDAwMDAwMDA4TCBcLSBEQkdfVFJBQ0VfT04KKy5CUgorICAgIDB4MDAwMDAwMTBMIFwtIERCR19WRVJCT1NFX09OCisuQlIKKyAgICAweDAwMDAwMDIwTCBcLSBEQkdfUEFSQU1fT04KKy5CUgorICAgIDB4MDAwMDAwNDBMIFwtIERCR19CUkVBS19PTgorLkJSCisgICAgMHgwMDAwMDEwMEwgXC0gREJHX1JYX09OCisuQlIKKyAgICAweDAwMDAwMjAwTCBcLSBEQkdfVFhfT04KKy5CUgorICAgIDB4MDAwMDA0MDBMIFwtIERCR19EU19PTgorLkJSCitJZiB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsIERlYnVnRmxhZworZGVmYXVsdHMgdG8gREJHX0VSUk9SX09OLCBEQkdfV0FSTklOR19PTiBhbmQgREJHX0JSRUFLX09OLgorRGVidWdGbGFnIG92ZXJydWxlcyBwY19kZWJ1Zy4KKy5UUAorLkIgRGVzaXJlZFNTSUQ9cworU2FtZSBhcyBPd25TU0lELgorLlRQCisuQiBEb3dubG9hZEZpcm13YXJlPW4KK1RoaXMgcmVsZWFzZSBvZiB0aGUgZHJpdmVyIGludHJvZHVjZXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBkb3dubG9hZHMgb2YgdGhlIFNUQS9BUAorZmlybXdhcmUuIEluIGZhY3QsIHRoaXMgaXMgcmVxdWlyZWQgZm9yIEhlcm1lcy1JSSBiYXNlZCBjYXJkcy4gVGhpcyBwYXJhbWV0ZXIgdGVsbHMKK3RoZSBkcml2ZXIgd2hpY2ggdmVyc2lvbiBvZiB0aGUgZmlybXdhcmUgdG8gZG93bmxvYWQgdG8gdGhlIGNhcmQuCisuQlIKKyAgICAwIFwtIE5vIGRvd25sb2FkIHBlcmZvcm1lZCAoSGVybWVzLUkgb25seSkKKy5CUgorICAgIDEgXC0gRG93bmxvYWQgU1RBIGZpcm13YXJlCisuQlIKKyAgICAyIFwtIERvd25sb2FkIEFQIGZpcm13YXJlCisuQlIKKyAgICBEZWZhdWx0OiAxLCB3aGVuIFNUQSBtb2RlIGZ1bmN0aW9uYWxpdHkgaXMKKyAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgYnVpbGQKKyAgICAgICAgICAgICAyLCB3aGVuIGNvZGUgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZm9yCisgICAgICAgICAgICAgICAgQVAgbW9kZQorLlRQCisuQiBEcml2ZXJFbmFibGUKKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBFbmFibGVFbmNyeXB0aW9uPW4KK1NldCB0aGUgbWV0aG9kIG9mIERhdGEgZW5jcnlwdGlvbi4KKy5CUgorICAgIDAgXC0gRGlzYWJsZQorLkJSCisgICAgMSBcLSBFbmFibGUgV0VQIEVuY3J5cHRpb24KKy5CUgorICAgIDIgXC0gRW5hYmxlIFdQQSB3aXRoIFRLSVAgZW5jcnlwdGlvbgorLkJSCisgICAgRGVmYXVsdDogMAorLlRQCisuQiBFbmNyeXB0aW9uCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgRXhjbHVkZVVuZW5jcnlwdGVkPXMKK0NvbnRyb2xzIGhvdyB0aGUgc3RhdGlvbnMgbXVzdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBUC4KKy5CUgorICAgIFkgXC0gU3RhdGlvbnMgbXVzdCBlbmFibGUgZW5jcnlwdGlvbiBhbmQgcHJvdmlkZQorICAgICAgICAgdGhlIHByb3BlciBlbmNyeXB0aW9uIGtleSB0byBjb21tdW5pY2F0ZQorICAgICAgICAgd2l0aCB0aGUgQVAuCisuQlIKKyAgICBOIFwtIFN0YXRpb25zIGRvIG5vdCBuZWVkIHRvIGVuYWJsZSBlbmNyeXB0aW9uCisgICAgICAgICB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBUC4KKy5CUgorICAgIERlZmF1bHQ6IE4KKy5UUAorLkIgSW50cmFCU1NSZWxheT1zCitDb250cm9scyB0aGUgYXV0b21hdGljIHJlbGF5IG9mIHJlY2VpdmVkIG1lc3NhZ2VzIHRoYXQgYXJlIGRlc3RpbmVkIGZvciBvdGhlcgorc3RhdGlvbnMgaW4gdGhlIEJTUy4KKy5CUgorICAgIFkgXC0gTWVzc2FnZXMgYXJlIHJlbGF5ZWQgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICBzdGF0aW9uKHMpLgorLkJSCisgICAgTiBcLSBNZXNzYWdlcyBhcmUgcGFzc2VkIHVwIHRvIHRoZSBob3N0LgorLkJSCisgICAgRGVmYXVsdDogWQorLlRQCisuQiBJcnFMaXN0PWksaiwuLi4KK1NwZWNpZmllcyB0aGUgc2V0IG9mIGludGVycnVwdHMgKHVwIHRvIDQpIHRoYXQgbWF5IGJlIGFsbG9jYXRlZCBieQordGhpcyBkcml2ZXIuIFRoaXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZXMgc2V0IGluIHRoZQorLkIgSXJxTWFzaworcGFyYW1ldGVyLiBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBmb3IgUENNQ0lBIG9ubHkuCisuVFAKKy5CIElycU1hc2s9bgorU3BlY2lmaWVzIGEgbWFzayBvZiB2YWxpZCBpbnRlcnJ1cHRzIHRoYXQgbWF5IGJlIGFsbG9jYXRlZCBieSB0aGlzIGRyaXZlci4KK0lmCisuQiBJcnFMaXN0CitpcyBhbHNvIHNwZWNpZmllZCwgdGhlIHZhbHVlcyBpbgorLkIgSXJxTGlzdAorYXJlIHVzZWQgaW5zdGVhZC4gTk9URTogVGhpcyBwYXJhbWV0ZXIgaXMgZm9yIFBDTUNJQSBvbmx5LgorLkJSCisgICAgRGVmYXVsdDogMHhkZWI4IChJUlEgMyw0LDUsNyw5LDEwLDExLDEyLDE0LDE1KQorLlRQCisuQiBLZXkxPXMKK1NwZWNpZmllcyBvbmUgb2YgNCBwb3NzaWJsZSBrZXlzIGZvciB0aGUgRGF0YSBlbmNyeXB0aW9uLgorT25lIG9mIHRoZXNlIGtleXMsIGlkZW50aWZpZWQgYnkgVHhLZXksCitpcyB1c2VkIGZvciB0aGUgZW5jaXBoZXJpbmcgb2YgRGF0YSB0aGF0IGlzIHRyYW5zbWl0dGVkIGJ5IHRoaXMgc3RhdGlvbi4KK0FsbCBrZXlzIHNwZWNpZmllZCBjYW4gYmUgdXNlZCBmb3IgdGhlIGRlY2lwaGVyaW5nIG9mIERhdGEgdGhhdCBpcyByZWNlaXZlZC4KKy5CUgorVGhlIGtleSB2YWx1ZSBjYW4gYmUgYW4gQVNDSUkgY2hhcmFjdGVyIHN0cmluZyBvciBhIGhleGFkZWNpbWFsIHZhbHVlLgorVGhlIGxlbmd0aCBvZiB0aGUga2V5IHZhbHVlIGNhbiBiZSA1IGNoYXJhY3RlcnMgb3IgMTAgaGV4YWRlY2ltYWwgZGlnaXRzIGZvcgordGhlIHN0YW5kYXJkIGVuY3J5cHRpb24gKFNpbHZlciBvciBHb2xkIGNhcmQpLCBvciAxMyBjaGFyYWN0ZXJzIG9yIDI2CitoZXhhZGVjaW1hbCBkaWdpdHMgZm9yIHRoZSBlbmNyeXB0aW9uIHdpdGggZXh0ZW5kZWQga2V5cyAoR29sZCBjYXJkIG9ubHkpLgorVGhlIGtleXMgZGVmaW5lZCBpbiB0aGUgc3RhdGlvbiBtdXN0IG1hdGNoIHRoZSBrZXlzIGRlZmluZWQgaW4gdGhlIGFjY2VzcworcG9pbnRzOyBib3RoIG9uIHZhbHVlIGFuZCBudW1iZXIgKDEgdGhyb3VnaCA0KS4KKy5CUgorSW4gMi4wIHNlcmllcyBMaW51eCBrZXJuZWwgbW9kdWxlcywgdmFsdWVzIHRoYXQgYmVnaW4gd2l0aCBhIG51bWJlciBhcmUKK2NvbnNpZGVyZWQgaW50ZWdlcnMuIEluIHRoaXMgY2FzZSBhIGhleGFkZWNpbWFsIHZhbHVlIHN0cmluZyBvciBhIGNoYXJhY3Rlcgorc3RyaW5nIHN0YXJ0aW5nIHdpdGggYSBudW1iZXIsIHdpbGwgbmVlZCB0byBiZSBzdXJyb3VuZGVkIGJ5IGVzY2FwZWQKK2RvdWJsZSBxdW90ZXMgKGllLiBLZXkxPVxcIjB4MTEyMjMzNDQ1NVxcIiBLZXkyPVxcIjEyeHl6XFwiKS4KKy5CUgorICAgIDUgb3IgMTMsIHByaW50YWJsZSBjaGFyYWN0ZXIgc3RyaW5nLCBvcgorLkJSCisgICAgMTAgb3IgMjYgaGV4IGRpZ2l0cyBpZiBwcmVjZWRlZCBieSAiMHgiLgorLkJSCisgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdGhlIGRlZmF1bHQgb2YgdGhlIE1BQyBpcyB1c2VkICggPSAwLWxlbmd0aCkuCisuVFAKKy5CIEtleTI9cworU2FtZSBhcyBLZXkxLgorLlRQCisuQiBLZXkzPXMKK1NhbWUgYXMgS2V5MS4KKy5UUAorLkIgS2V5ND1zCitTYW1lIGFzIEtleTEuCisuVFAKKy5CIExvYWRCYWxhbmNpbmc9cworQ29udHJvbCBmb3IgdGhlIExvYWQgQmFsYW5jaW5nIGFsZ29yaXRobSBmb3IgYm90aCBTVEFzIGFuZCBBUHMuIFRoZSBBUAoraW5jbHVkZXMgYSBsb2FkIGJhbGFuY2luZyBlbGVtZW50IGluIHRoZSBQcm9iZSBSZXNwb25zZSBhbmQgQmVhY29uIGZyYW1lcy4KK1RoZSBTVEEgdXNlcyB0aGlzIGluZm8gdG8gc2VsZWN0IGFuIEFQLCBub3Qgb25seSBiYXNlZCBvbiBjb21tcyBxdWFsaXR5LCBidXQKK2Fsc28gb24gdGhlIGxvYWQgb2YgdGhhdCBBUC4KKy5CUgorICAgIERlZmF1bHQ6IFkKKy5UUAorLkIgTWF4RGF0YUxlbmd0aAorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIE1heFNsZWVwRHVyYXRpb249bgorU2V0IHRoZSBtYXhpbXVtIFBvd2VyIE1hbmFnZW1lbnQgc2xlZXAgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorVmFsaWQgdmFsdWVzIGFyZSAwIHRvIDY1NTM1IG1pbGxpc2Vjb25kcy4KKy5CUgorICAgIERlZmF1bHQ6IDEwMAorLlRQCisuQiBNZWRpdW1EaXN0cmlidXRpb249cworQ29udHJvbCBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtZWRpdW0gcGFyYW1ldGVycywgbGlrZSBjb21tdW5pY2F0aW9uCit0aHJlc2hvbGRzLCBtaWNyb3dhdmUgcm9idXN0bmVzcywgUlRTL0NUUyB0aHJlc2hvbGRzLCBieSBBUHMuIFRoZSBhc3NvY2lhdGVkCitzdGF0aW9ucyByZXBsYWNlIHRoZWlyIG93biB2YWx1ZXMgd2l0aCB0aGUgcmVjZWl2ZWQgdmFsdWVzLgorLkJSCisgICAgRGVmYXVsdD1ZCisuVFAKKy5CIE1pY3JvV2F2ZVJvYnVzdG5lc3M9cworRW5hYmxlIG9yIGRpc2FibGUgTWljcm93YXZlIE92ZW4gUm9idXN0bmVzcy4KKy5CUgorICAgIE4gXC0gRGlzYWJsZQorLkJSCisgICAgWSBcLSBFbmFibGUKKy5CUgorICAgIERlZmF1bHQ6IE4KKy5UUAorLkIgTXVsdGljYXN0UE1CdWZmZXJpbmc9cworQ29udHJvbHMgYnVmZmVyaW5nIG9mIG11bHRpY2FzdCBNQUMgZnJhbWVzIGZvciB0cmFuc21pc3Npb24gYWZ0ZXIgRFRJTS4gSWYgbm8sCittdWx0aWNhc3QgTUFDIGZyYW1lcyBhcmUgZGlyZWN0bHkgcGxhY2VkIGluIHRoZSBvdXRwdXQgcXVldWUuCisuQlIKKyAgICBEZWZhdWx0OiBZCisuVFAKKy5CIE11bHRpY2FzdFJhdGU9bgorU2V0cyB0aGUgZGF0YSByYXRlIGZvciBtdWx0aWNhc3QgbWVzc2FnZSB0cmFuc21pc3Npb24uCisuQlIKKyAgICAxIFwtIEZpeGVkIDFNYi9zCisgICAgMiBcLSBGaXhlZCAyTWIvcworICAgIDMgXC0gRml4ZWQgNS41TWIvcworICAgIDQgXC0gRml4ZWQgMTFNYi9zCisuQlIKKyAgICBEZWZhdWx0OiAyCisKK0ZvciBIZXJtZXMtSUkuNSwgYW4gSU5URUdFUiBDT05WRVJURUQgYml0IG1hc2sgcmVwcmVzZW50aW5nIHRoZQorcmF0ZSB0byBtdWx0aWNhc3QsIHdoZXJlIHRoZSByYXRlcyBzdXBwb3J0ZWQgYXJlIGFzIGZvbGxvd3M6CisKK0JpdCAgOiAxNXwxNHwxM3wxMnwxMXwxMHwwOXwwOHwwN3wwNnwwNXwwNHwwM3wwMnwwMXwwMAorLmJyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5icgorUmF0ZSA6IFhYfFhYfFhYfFhYfDU0fDQ4fDM2fDI0fDE4fDEyfCA5fCA2fDExfDUuNXwyfCAxCisKKyAgICBEZWZhdWx0OiA0IChUcmFuc2xhdGVzIHRvIDB4MDAwNCA9IDUuNSBNYi9zZWMpCisKKy5UUAorLkIgTXVsdGljYXN0UmVjZWl2ZT1zCitFbmFibGUgb3IgZGlzYWJsZSByZWNlaXZpbmcgb2YgYWxsIG11bHRpY2FzdCBwYWNrZXRzIHdoZW4gQ2FyZCBQb3dlciBNYW5hZ2VtZW50CitpcyBlbmFibGVkLiBXaGVuIGVuYWJsZWQsIHRoZSBzdGF0aW9uIHdpbGwgd2FrZSB1cCBmcmVxdWVudGx5Cit0byByZWNlaXZlIHRoZSBtdWx0aWNhc3QgZnJhbWVzLiBUaGlzIGNhdXNlcyBsZXNzIG9wdGltYWwgcG93ZXIgc2F2aW5ncy4KKy5CUgorICAgIE4gXC0gRGlzYWJsZQorLkJSCisgICAgWSBcLSBFbmFibGUKKy5CUgorICAgIERlZmF1bHQ6IFkKKy5UUAorLkIgTmV0d29ya0FkZHJlc3M9bixuLG4sbixuLG4KK1NldHMgdGhlIGFkYXB0ZXIgaGFyZHdhcmUgZXRoZXJuZXQgYWRkcmVzcyAoTUFDIGFkZHJlc3MpIHRvIHRoZSB2YWx1ZQorc3BlY2lmaWVkLiBOb3RlIHRoYXQgdGhpcyBpcyB0byBiZSB1c2VkIHRvIHNwZWNpZnkgYSBMb2NhbCBNQUMgYWRkcmVzcy4gRG8KK25vdCBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyIGlmIHRoZSBjYXJkXCdzIHVuaXZlcnNhbCBhZGRyZXNzIGlzIHRvIGJlIHVzZWQuCitWYWxpZCB2YWx1ZXMgYXJlIHNpeCBoZXhhZGVjaW1hbCBkaWdpdC1wYWlycyAocHJlZml4ZWQgd2l0aCAweCkuCisuQlIKKyAgICBEZWZhdWx0OiA8ZmFjdG9yeSBhc3NpZ25lZCBhZGRyZXNzPgorLlRQCisuQiBOZXR3b3JrVHlwZQorPz8/Pz8/Pz8/Pz8/Pz8/CisuVFAKKy5CIE93bkFUSU1XaW5kb3c9bgorQVRJTSB3aW5kb3cgdGltZSB1c2VkIGZvciBjcmVhdGluZyBhbiBJQlNTLgorLkJSCisgICAgUmFuZ2U6IDAuLjEwMAorLkJSCisgICAgRGVmYXVsdDogMAorLlRQCisuQiBPd25CZWFjb25JbnRlcnZhbD1iCitCZWFjb24gSW50ZXJ2YWwgaW4gVFUKKy5CUgorICAgIFJhbmdlIDIwLi4yMDAKKy5CUgorICAgIERlZmF1bHQgXC0gMTAwCisuVFAKKy5CIGNoYW5uZWw9bgorU2FtZSBhcyBPd25DaGFubmVsLgorLlRQCisuQiBPd25DaGFubmVsPW4KK1NldHMgdGhlIGNoYW5uZWwgdGhlIEFkLUhvYyBvciBJQlNTIG1vZGUgd2lsbCB1c2UuCitUaGUgZGVmYXVsdCBjaGFubmVsIGZvciBBZC1Ib2MgbW9kZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBXaXJlbGVzcyBQQyBDYXJkLgorVGhlIGRlZmF1bHQgY2hhbm5lbCBmb3IgSUJTUyBpcyBzZXQgdG8gMTAgYnkgdGhlIGRyaXZlci4KK1RoaXMgdmFsdWUgaGFzIG5vIGVmZmVjdCB3aGVuIHRoZSBhZGFwdGVyIGlzIHVzZWQgd2l0aCBhbiBBY2Nlc3MgUG9pbnQKKyhCU1MgbmV0d29yaykgc2luY2UgdGhlIEFjY2VzcyBQb2ludCBhdXRvbWF0aWNhbGx5IGRldGVybWluZXMgdGhlIGNoYW5uZWwuCitWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMTQuIEhvd2V2ZXIgdGhlIGNoYW5uZWxzIGFsbG93ZWQgaW4KK3lvdXIgcmVnaW9uIGFyZSBzdWJqZWN0IHRvIGxvY2FsIHJlZ3VsYXRpb25zIGFuZCBhcmUgbGltaXRlZCBhdAorbWFudWZhY3R1cmluZyB0aW1lIG9mIHRoZSBXaXJlbGVzcyBQQyBDYXJkLiBXaGVuIHRoZSBwcm92aWRlZCB2YWx1ZSBpcworbm90IGFsbG93ZWQsIHRoZSB2YWx1ZSByZW1haW5zIHVuY2hhbmdlZC4KKy5CUgorICAgIDAgXC0gVXNlIGRlZmF1bHQgY2hhbm5lbAorLkJSCisgICAgRGVmYXVsdDogMAorLlRQCisuQiBPd25EVElNUGVyaW9kPW4KK1RoZSBudW1iZXIgb2YgYmVhY29uIGludGVydmFscyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgRGVsaXZlcnkgVHJhZmZpYyBJZGVudGlmaWNhdGlvbgorTWFwcyAoRFRJTXMpLgorLkJSCisgICAgUmFuZ2U6IDEuLjY1NTM1CisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIE93bk5hbWU9cworU2V0cyB0aGUgc3RhdGlvbiBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlLiBUaGlzIHBhcmFtZXRlcgoraXMgdXNlZCBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcywgYXMgYSB1c2VyXC1mcmllbmRseSBpZGVudGlmaWNhdGlvbgorb2YgdGhpcyBzeXN0ZW0uIFRoaXMgcGFyYW1ldGVyIGFjY2VwdHMgYSBtYXhpbXVtIG9mIDMyIGNoYXJhY3RlcnMuCisuQlIKKyAgICBEZWZhdWx0OiBMaW51eAorLlRQCisuQiBPd25TU0lEPXMKK1NldHMgdGhlIGNhcmQgbmV0d29yayBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlLiBUaGlzIHBhcmFtZXRlcgorYWNjZXB0cyBhIG1heGltdW0gb2YgMzIgY2hhcmFjdGVycy4gV2hpdGVzcGFjZSBpbiB0aGUgbmV0d29yayBuYW1lCit3aWxsIG5lZWQgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoIChpZS4gT3duU1NJRD1NeVxcIE5ldHdvcmspLgorLkJSCisgICAgRGVmYXVsdDogQU5ZCisuVFAKKy5CIHBjX2RlYnVnPW4KK1NlbGVjdHMgdGhlIFBDTUNJQSBkZWJ1Z2dpbmcgbGV2ZWwuIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgYXZhaWxhYmxlCitpZiB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQuIEEgbm9uXC16ZXJvIHZhbHVlCitlbmFibGVzIGRlYnVnZ2luZy4gSGlnaGVyIHZhbHVlcyB5aWVsZCBtb3JlIGluZm9ybWF0aW9uLCBpLmUuIGZvciBhbnkgdmFsdWUgYWxsCitsb3dlciB2YWx1ZXMgYXJlIGltcGxpZWQuCisuQlIKKyAgICA4IFwtIERCR19EU19PTgorLkJSCisgICAgNyBcLSBEQkdfUlhfT04gfCBEQkdfVFhfT04KKy5CUgorICAgIDYgXC0gREJHX1BBUkFNX09OCisuQlIKKyAgICA1IFwtIERCR19UUkFDRV9PTgorLkJSCisgICAgNCBcLSBEQkdfVkVSQk9TRV9PTgorLkJSCitJZiB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIGVuYWJsZWQsIHBjX2RlYnVnIGRlZmF1bHRzIHRvIDUuCitEZWJ1Z0ZsYWcgb3ZlcnJ1bGVzIHBjX2RlYnVnLgorLkJSCitUaGUgbmFtZSBwY19kZWJ1ZyByYXRoZXIgdGhhbiBQY0RlYnVnLCBzaW5jZSBwY19kZWJ1ZyBpcyB1c2VkIGJ5IG1hbnkgUENNQ0lBIGRyaXZlci4KKy5UUAorLkIgUE1FbmFibGVkPWIKK1NldHMgdGhlIGNhcmRcJ3MgUG93ZXIgTWFuYWdlbWVudCBzdGF0ZS4KKy5CUgorICAgIDAgXC0gRGlzYWJsZQorLkJSCisgICAgMSBcLSBFbmFibGUgRW5oYW5jZWQgTW9kZQorLkJSCisgICAgMiBcLSBFbmFibGVkIFN0YW5kYXJkIE1vZGUKKy5CUgorICAgIDB4ODAwMCBcLSBFbmhhbmNlZD8/Pz8/PyBNb2RlICh0byBiZSBjb21iaW5lZCB3aXRoIDB4MDAwMSBvciAweDAwMDIpCisKKyAgICBEZWZhdWx0OiAwIChEaXNhYmxlZCkKKy5UUAorLkIgUE1Ib2xkb3ZlckR1cmF0aW9uPW4KK1RpbWUgdGhhdCB0aGUgc3RhdGlvbiByZW1haW5zIGluIGFuIGF3YWtlIHN0YXRlIGFmdGVyIGEgTUFDIGZyYW1lIHRyYW5zZmVyIGlmCitFbmhhbmNlZCBQb3dlciBTYXZlIGlzIGFjdGl2ZS4KKy5CUgorICAgIFJhbmdlOiAxLi4xMDAwCisuQlIKKyAgICBEZWZhdWx0OiAxMDAKKy5UUAorLkIgUG93ZXJNb2RlCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgUG9ydFR5cGU9bgorU2VsZWN0cyB0aGUgdHlwZSBvZiBuZXR3b3JrIG9wZXJhdGlvbi4KKy5CUgorICAgIDEgXC0gTm9ybWFsIE9wZXJhdGlvbiAoQlNTIG9yIElCU1MpCisuQlIKKyAgICAzIFwtIEFkLUhvYyBEZW1vIE1vZGUKKy5CUgorICAgIERlZmF1bHQ6IDEKKy5UUAorLkIgUHJvbWlzY3VvdXNNb2RlPXMKK1N3aXRjaCBmb3IgcHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24uCisuQlIKKyAgICBEZWZhdWx0OiBOCisuVFAKKy5CIFJlamVjdEFOWT1zCitDb250cm9scyBob3cgc3RhdGlvbnMgYXNzb2NpYXRlIHRvIHRoZSBkZXZpY2UuCisuQlIKKyAgICBZIFwtIFN0YXRpb25zIG11c3QgcHJvdmlkZSB0aGUgY29ycmVjdCBTU0lEIHRvCisgICAgICAgICBhc3NvY2lhdGUgdG8gdGhlIEFQLgorLkJSCisgICAgTiBcLSBTdGF0aW9ucyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhlCisgICAgICAgICBjb3JyZWN0IFNTSUQgdG8gYXNzb2NpYXRlIHRvIHRoZSBBUC4KKyAgICAgICAgIEtub3duIGFzIGFuIFwnb3BlblwnIG5ldHdvcmsuCisuQlIKKyAgICBEZWZhdWx0IC0gTgorLlRQCisuQiBSVFNUaHJlc2hvbGQ9bgorQ29udHJvbHMgdGhlIFJUUy9DVFMgaGFuZHNoYWtlIHRocmVzaG9sZCBmb3IgdHJhbnNtaXNzaW9ucyBpbiBTdGF0aW9uIG1vZGUuCitWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMjM0Ny4KKy5CUgorICAgIDUwMCAgXC0gSGlkZGVuIFN0YXRpb25zCisuQlIKKyAgICAyMzQ3IFwtIE5vIFJUUy9DVFMKKy5CUgorICAgIERlZmF1bHQ6IDIzNDcKKy5UUAorLkIgUlRTVGhyZXNob2xkMT1uCitTYW1lIGFzIFJUU1RocmVzaG9sZCwgb25seSBmb3IgcG9ydCAxIG9mIGluIEFjY2Vzc1BvaW50IG1vZGUuCisuVFAKKy5CIFJUU1RocmVzaG9sZDI9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDIuCisuVFAKKy5CIFJUU1RocmVzaG9sZDM9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDMuCisuVFAKKy5CIFJUU1RocmVzaG9sZDQ9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDQuCisuVFAKKy5CIFJUU1RocmVzaG9sZDU9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDUuCisuVFAKKy5CIFJUU1RocmVzaG9sZDY9bgorU2FtZSBhcyBSVFNUaHJlc2hvbGQxLCBvbmx5IGZvciBwb3J0IDYuCisuVFAKKy5CIFNSU0MyR0h6PWIKK1NldHMgdGhlIGNhcmRcJ3MgU3VwcG9ydGVkIFJhdGUgU2V0IGluIHRoZSAyLjRHSHogYmFuZC4gVGhlIHZhbHVlCitpcyBhbiBJTlRFR0VSIENPTlZFUlRFRCBiaXQgbWFzayByZXByZXNlbnRpbmcgdGhlIHJhdGVzIHRvIHN1cHBvcnQsCit3aGVyZSB0aGUgcmF0ZXMgc3VwcG9ydGVkIGFyZSBhcyBmb2xsb3dzOgorCitCaXQgIDogMTV8MTR8MTN8MTJ8MTF8MTB8MDl8MDh8MDd8MDZ8MDV8MDR8MDN8MDJ8MDF8MDAKKy5icgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuYnIKK1JhdGUgOiBYWHxYWHxYWHxYWHw1NHw0OHwzNnwyNHwxOHwxMnwgOXwgNnwxMXw1LjV8MnwgMQorLkJSCisgICAgRGVmYXVsdDogNDA5NSAob3IgMHgwRkZGLCBhbGwgMTFiIGFuZCAxMWcgcmF0ZXMpCisuVFAKKy5CIFNSU0M1R0h6PWIKK1NldHMgdGhlIGNhcmRcJ3MgU3VwcG9ydGVkIFJhdGUgU2V0IGluIHRoZSA1LjBHSHogYmFuZC4gU2VlIFNSU0MyR0h6Citmb3IgdGhlIHZhbHVlXCdzIGZvcm1hdC4KKy5CUgorICAgIERlZmF1bHQ6IDQwODAgKG9yIDB4MEZGMCwgYWxsIDExYSByYXRlcykKKy5UUAorLkIgU3lzdGVtU2NhbGU9bgorU2V0cyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBBY2Nlc3MgUG9pbnRzIGluIHRoZSBuZXR3b3JrLiBUaGlzIHZhbHVlCitpbmZsdWVuY2VzIHRoZSBNb2RlbSBUaHJlc2hvbGRzIChFbmVyZ3lEZXRlY3RUaHJlc2hvbGQsCitDYXJyaWVyRGV0ZWN0VGhyZXNob2xkIGFuZCBEZWZlclRocmVzaG9sZCkgYW5kCit0aGUgUm9hbWluZyBUaHJlc2hvbGRzIChDZWxsU2VhcmNoVGhyZXNob2xkIGFuZCBPdXRPZlJhbmdlVGhyZXNob2xkKS4KKy5CUgorICAgIDEgXC0gTGFyZ2UKKy5CUgorICAgIDIgXC0gTWVkaXVtCisuQlIKKyAgICAzIFwtIFNtYWxsCisuQlIKKyAgICBEZWZhdWx0OiAxCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2w9bgorU2V0cyB0aGUgZGF0YSByYXRlIHRvIGJlIHVzZWQgYnkgdGhlIHRyYW5zbWl0dGVyLiBGb3IgSGVybWVzLUlJOgorLkJSCisgICAgMSBcLSBGaXhlZCBMb3cgKDEgTWIvc2VjKQorLkJSCisgICAgMiBcLSBGaXhlZCBTdGFuZGFyZCAoMiBNYi9zZWMpCisuQlIKKyAgICAzIFwtIEF1dG8gUmF0ZSBTZWxlY3QgSGlnaCAoMTEsIDUuNSwgMiwgMSBNYi9zZWMpCisuQlIKKyAgICA0IFwtIEZpeGVkIE1lZGl1bSAoNS41IE1iL3NlYykKKy5CUgorICAgIDUgXC0gRml4ZWQgSGlnaCAoMTEgTWIvc2VjKQorLkJSCisgICAgNiBcLSBBdXRvIFJhdGUgU2VsZWN0IFN0YW5kYXJkICgyLCAxIE1iL3NlYykKKy5CUgorICAgIDcgXC0gQXV0byBSYXRlIFNlbGVjdCBNZWRpdW0gKDUuNSwgMiwgMSBNYi9zZWMpCisuQlIKKyAgICBEZWZhdWx0OiAzCisKK0ZvciBIZXJtZXMtSUkuNSwgYW4gSU5URUdFUiBDT05WRVJURUQgYml0IG1hc2sgcmVwcmVzZW50aW5nIGFsbCBvZiB0aGUKK3JhdGVzIHRvIHN1cHBvcnQsIHdoZXJlIHRoZSByYXRlcyBzdXBwb3J0ZWQgYXJlIGFzIGZvbGxvd3M6CisKK0JpdCAgOiAxNXwxNHwxM3wxMnwxMXwxMHwwOXwwOHwwN3wwNnwwNXwwNHwwM3wwMnwwMXwwMAorLmJyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5icgorUmF0ZSA6IFhYfFhYfFhYfFhYfDU0fDQ4fDM2fDI0fDE4fDEyfCA5fCA2fDExfDUuNXwyfCAxCisuQlIKKyAgICBEZWZhdWx0OiA0MDk1IChUcmFuc2xhdGVzIHRvIDB4RkZGLCB3aGljaCBpcyBhbGwgcmF0ZXMpCisuVFAKKy5CIFJUU1RocmVzaG9sZD1uCitTZXRzIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIGEgbWVzc2FnZSBvciBmcmFnbWVudCBhYm92ZSB3aGljaCBhCitSVFMvQ1RTIGhhbmRzaGFrZSBpcyBwZXJmb3JtZWQuCitWYWxpZCB2YWx1ZXMgYXJlIDAgdG8gMjM0Ny4KKy5CUgorICAgIDUwMCAgXC0gSGlkZGVuIFN0YXRpb25zCisuQlIKKyAgICAyMzQ3IFwtIE5vIFJUUy9DVFMKKy5CUgorICAgIERlZmF1bHQ6IDIzNDcKKy5UUAorLkIgVHhLZXk9bgorRGVzaWduYXRlcyB3aGljaCBvZiB0aGUga2V5cyBpcyB0byBiZSB1c2VkIGZvciB0aGUgZW5jaXBoZXJpbmcgb2YgZGF0YSB0aGF0IGlzCit0cmFuc21pdHRlZCBieSB0aGlzIHN0YXRpb24uCisuQlIKKyAgICBJbnRlZ2VyIGluIHRoZSByYW5nZSAxLi40LgorLkJSCisgICAgRGVmYXVsdDogMQorLlRQCisuQiBUeFBvd0xldmVsCis/Pz8/Pz8/Pz8/Pz8/Pz8KKy5UUAorLkIgVHhSYXRlQ29udHJvbD1uCitTZXRzIHRoZSBkYXRhIHJhdGUgdG8gYmUgdXNlZCBieSB0aGUgdHJhbnNtaXR0ZXIgaW4gU3RhdGlvbiBtb2RlLgorLkJSCisgICAgMSBcLSBGaXhlZCBMb3cKKy5CUgorICAgIDIgXC0gRml4ZWQgU3RhbmRhcmQKKy5CUgorICAgIDMgXC0gQXV0byBSYXRlIFNlbGVjdCAoSGlnaCkKKy5CUgorICAgIDQgXC0gRml4ZWQgTWVkaXVtCisuQlIKKyAgICA1IFwtIEZpeGVkIEhpZ2gKKy5CUgorICAgIDYgXC0gQXV0byBSYXRlIFNlbGVjdCAoU3RhbmRhcmQpCisuQlIKKyAgICA3IFwtIEF1dG8gUmF0ZSBTZWxlY3QgKE1lZGl1bSkKKy5CUgorICAgIERlZmF1bHQ6IDMKKworRm9yIEhlcm1lcy1JSS41LCBhbiBJTlRFR0VSIENPTlZFUlRFRCBiaXQgbWFzayByZXByZXNlbnRpbmcgYWxsIG9mIHRoZQorcmF0ZXMgdG8gc3VwcG9ydCwgd2hlcmUgdGhlIHJhdGVzIHN1cHBvcnRlZCBhcmUgYXMgZm9sbG93czoKKworQml0ICA6IDE1fDE0fDEzfDEyfDExfDEwfDA5fDA4fDA3fDA2fDA1fDA0fDAzfDAyfDAxfDAwCisuYnIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLmJyCitSYXRlIDogWFh8WFh8WFh8WFh8NTR8NDh8MzZ8MjR8MTh8MTJ8IDl8IDZ8MTF8NS41fDJ8IDEKKy5CUgorICAgIERlZmF1bHQ6IDQwOTUgKFRyYW5zbGF0ZXMgdG8gMHhGRkYsIHdoaWNoIGlzIGFsbCByYXRlcykKKworLlRQCisuQiBUeFJhdGVDb250cm9sMT1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wsIG9ubHkgZm9yIHBvcnQgMSBpbiBBY2Nlc3NQb2ludCBtb2RlLgorLlRQCisuQiBUeFJhdGVDb250cm9sMj1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wxLCBvbmx5IGZvciBwb3J0IDIuCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2wzPW4KK1NhbWUgYXMgVHhSYXRlQ29udHJvbDEsIG9ubHkgZm9yIHBvcnQgMy4KKy5UUAorLkIgVHhSYXRlQ29udHJvbDQ9bgorU2FtZSBhcyBUeFJhdGVDb250cm9sMSwgb25seSBmb3IgcG9ydCA0LgorLlRQCisuQiBUeFJhdGVDb250cm9sNT1uCitTYW1lIGFzIFR4UmF0ZUNvbnRyb2wxLCBvbmx5IGZvciBwb3J0IDUuCisuVFAKKy5CIFR4UmF0ZUNvbnRyb2w2PW4KK1NhbWUgYXMgVHhSYXRlQ29udHJvbDEsIG9ubHkgZm9yIHBvcnQgNi4KKy5UUAorLkIgVmVuZG9yRGVzY3JpcHRpb24KKz8/Pz8/Pz8/Pz8/Pz8/PworLlRQCisuQiBXRFNBZGRyZXNzPW4sbixuLG4sbixuCitNQUMgYWRkcmVzcyB0aGF0IGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSBvZiB0aGUgV0RTIHBvcnQgaW4gU3RhdGlvbiBtb2RlLgorTm90ZSB0aGF0IGZvciBXRFMgdG8gd29yayBwcm9wZXJseSwgYSBicmlkZ2UgaW50ZXJmYWNlIG11c3QgYmUgc2V0dXAgYmV0d2VlbiB0aGUgZGV2aWNlIGFuZAordGhlIHdkcyBuZXR3b3JrIGRldmljZXMgY3JlYXRlZCBieSB0aGUgZHJpdmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBicmlkZ2UKK2ludGVyZmFjZXMsIHBsZWFzZSByZWZlciB0byB0aGUgbWFuIHBhZ2UgZm9yIFwnYnJjdGxcJy4KKy5CUgorICAgIERlZmF1bHQ6IDAwOjAwOjAwOjAwOjAwOjAwCisuVFAKKy5CIFdEU0FkZHJlc3MxPW4sbixuLG4sbixuCitTYW1lIGFzIFdEU0FkZHJlc3MsIG9ubHkgZm9yIHBvcnQgMSBpbiBBY2Nlc3NQb2ludCBtb2RlLgorLlRQCisuQiBXRFNBZGRyZXNzMj1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCAyLgorLlRQCisuQiBXRFNBZGRyZXNzMz1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCAzLgorLlRQCisuQiBXRFNBZGRyZXNzND1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCA0LgorLlRQCisuQiBXRFNBZGRyZXNzNT1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCA1LgorLlRQCisuQiBXRFNBZGRyZXNzNj1uLG4sbixuLG4sbgorU2FtZSBhcyBXRFNBZGRyZXNzMSwgb25seSBmb3IgcG9ydCA2LgorLlNIIFNFQ1VSSVRZCitPbiBhIG11bHRpLXVzZXIgc3lzdGVtIG9ubHkgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIG5lZWRzIGFjY2VzcyB0byB0aGUgV0VQCitlbmNyeXB0aW9uIGtleXMuIEluIHRoaXMgY2FzZSwgY29uc2lkZXIgcmVtb3ZpbmcgdGhlIHJlYWQgcGVybWlzc2lvbiBmb3IKK25vcm1hbCB1c2VycyBvZiB0aGUgUENNQ0lBIGNvbmZpZy5vcHRzIGZpbGUsIHRoZSBzeXN0ZW0gbG9nIGZpbGUsIGFuZCBhbnkKK0FnZXJlIHByb3ByaWV0YXJ5IGl3Y29uZmlnLWV0aDxuPiBzY3JpcHRzLgorLlNIIENPTlRBQ1QKK0lmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgd2hlbiBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoaXMgcHJvZHVjdCwgb3Igd291bGQgbGlrZQoraW5mb3JtYXRpb24gYWJvdXQgb3VyIG90aGVyICJXaXJlbGVzcyIgcHJvZHVjdHMsIHBsZWFzZSBjb250YWN0IHlvdXIgbG9jYWwKK0F1dGhvcml6ZWQgIldpcmVsZXNzIiBSZXNlbGxlciBvciBBZ2VyZSBTeXN0ZW1zIHNhbGVzIG9mZmljZS4KKworQWRkcmVzc2VzIGFuZCB0ZWxlcGhvbmUgbnVtYmVycyBvZiB0aGUgQWdlcmUgU3lzdGVtcyBzYWxlcyBvZmZpY2VzIGFyZQorbGlzdGVkIG9uIG91ciBBZ2VyZSBTeXN0ZW1zIHdlYiBzaXRlLgorLlRQCisuQiBXV1cKK2h0dHA6Ly93d3cuYWdlcmUuY29tCisuU0ggU0VFIEFMU08KKy5CUiBjYXJkbWdyICg4KSwKKy5CUiBwY21jaWEgKDUpLAorLkJSIGlmY29uZmlnICg4KSwKKy5CUiBpbnNtb2QgKDgpLAorLkJSIGJyY3RsICg4KS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbWRkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1YzdkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21kZC5oCkBAIC0wLDAgKzEsMTE1NiBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgTUREX0gKKyNkZWZpbmUgTUREX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFCQk6IG1kZC5oCisqCisqIERBVEUJCTogJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS42ICQKKyogT3JpZ2luYWwJCTogMjAwNC8wNS8yNSAwNTo1OTozNyAgICBSZXZpc2lvbjogMS41NyAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wNS8xMyAxNTozMTo0NSAgICBSZXZpc2lvbjogMS41NCAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzA0LzE1IDA5OjI0OjQxICAgIFJldmlzaW9uOiAxLjQ3ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDQvMTMgMTQ6MjI6NDUgICAgUmV2aXNpb246IDEuNDYgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNDIgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsCQk6IDIwMDQvMDMvMTAgMTU6Mzk6MjggICAgUmV2aXNpb246IDEuMzggICAgICBUYWc6IHQyMDA0MDMxMF8wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzAzLzA0IDExOjAzOjM3ICAgIFJldmlzaW9uOiAxLjM2ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyogT3JpZ2luYWwJCTogMjAwNC8wMy8wMiAwOToyNzoxMSAgICBSZXZpc2lvbjogMS4zNCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsCQk6IDIwMDQvMDIvMjQgMTM6MDA6MjcgICAgUmV2aXNpb246IDEuMjkgICAgICBUYWc6IHQyMDA0MDIyNF8wMQorKiBPcmlnaW5hbAkJOiAyMDA0LzAyLzE4IDE3OjEzOjU3ICAgIFJldmlzaW9uOiAxLjI2ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyoKKyogQVVUSE9SCTogTmljbyBWYWxzdGVyCisqCisqIERFU0MJCTogRGVmaW5pdGlvbnMgYW5kIFByb3RvdHlwZXMgZm9yIEhDRiwgREhGLCBNTUQgYW5kIE1TRgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqCisqIFNPRlRXQVJFIExJQ0VOU0UKKyoKKyogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisqCisqIENPUFlSSUdIVCCpIDE5OTQgLSAxOTk1CWJ5IEFUJlQuCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQ09QWVJJR0hUIKkgMTk5NiAtIDIwMDAgYnkgTHVjZW50IFRlY2hub2xvZ2llcy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBDT1BZUklHSFQgqSAyMDAxIC0gMjAwNAlieSBBZ2VyZSBTeXN0ZW1zIEluYy4JQWxsIFJpZ2h0cyBSZXNlcnZlZAorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqCisqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorKiAgICBkaXN0cmlidXRpb24uCisqCisqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIERpc2NsYWltZXIKKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorKiBEQU1BR0UuCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGUgbWFjcm9zIFhuKC4uLikgYW5kIFhYbiguLi4pIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgTFRWJ3MgKHNob3J0IGZvciBMZW5ndGggVHlwZSBWYWx1ZVsgXSkgLAorKiBha2EgUklEcywgcHJvY2Vzc2VkIGJ5IHRoZSBIZXJtZXMuCisqIFRoZSBuIGluIFhuIGFuZCBYWG4gcmVmbGVjdHMgdGhlIG51bWJlciBvZiAiVmFsdWUiIGZpZWxkcyBpbiB0aGVzZSBSSURzLgorKgorKiBYbiguLi4pIDogTWFjcm9zIHVzZWQgZm9yIFJJRHMgd2hpY2ggdXNlIG9ubHkgdHlwZSBoY2ZfMTYgZm9yIHRoZSAiViIgZmllbGRzIG9mIHRoZSBMVFYuCisqIFhuIHRha2VzIGFzIHBhcmFtZXRlcnMgYSBSSUQgbmFtZSBhbmQgIm4iIG5hbWUocyksIG9uZSBmb3IgZWFjaCBvZiB0aGUgIlYiIGZpZWxkcyBvZiB0aGUgTFRWLgorKgorKiBYWG4oLi4uKSA6IE1hY3JvcyB1c2VkIGZvciBSSURzIHdoaWNoIHVzZSBhdCBsZWFzdCBvbmUgb3RoZXIgdHlwZSB0aGVuIGhjZl8xNiBmb3IgYSAiViIgZmllbGQKKyogb2YgdGhlIExUVi4KKyogWFhuKC4uKSB0YWtlcyBhcyBwYXJhbWV0ZXJzIGEgUklEIG5hbWUgYW5kICJuIiBwYWlyKHMpIG9mIHR5cGUgYW5kIG5hbWUsIG9uZSBmb3IgZWFjaCAiViIgZmllbGQKKyogb2YgdGhlIExUVgorCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBlIHggYSBtIHAgbCBlIHMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyogWDEoUklEX05BTUUsIHBhcmFtZXRlcnMuLi4pIDogZXhwYW5kcyB0byA6CisqICAgIHR5cGVkZWYgc3RydWN0IFJJRF9OQU1FX1NUUkNUIHsKKyogICAgICAgICBoY2ZfMTYgIGxlbjsKKyogICAgICAgICBoY2ZfMTYgIHR5cDsKKyogICAgICAgICBoY2ZfMTYgIHBhcjE7CisqICAgIH0gUklEX05BTUVfU1RSQ1Q7CisKKyogWDIoUklEX05BTUUsIHBhcmFtZXRlcnMuLi4pIDogZXhwYW5kcyB0byA6CisqICAgIHR5cGVkZWYgc3RydWN0IFJJRF9OQU1FX1NUUkNUIHsKKyogICAgICAgICBoY2ZfMTYgIGxlbjsKKyogICAgICAgICBoY2ZfMTYgIHR5cDsKKyogICAgICAgICBoY2ZfMTYgIHBhcjE7CisqICAgICAgICAgaGNmXzE2ICBwYXIyOworKiAgICB9IFJJRF9OQU1FX1NUUkNUOworCisKKyogWFgxKFJJRF9OQU1FLCBwYXIxdHlwZSwgcGFyMW5hbWUsIC4uLikgOiBleHBhbmRzIHRvIDoKKyogICAgdHlwZWRlZiBzdHJ1Y3QgUklEX05BTUVfU1RSQ1QgeworKiAgICAgICBoY2ZfMTYgICAgbGVuOworKiAgICAgICBoY2ZfMTYgICAgdHlwOworKiAgICAgICBwYXIxdHlwZSAgcGFyMW5hbWU7CisqICAgIH0gUklEX05BTUVfU1RSQ1Q7CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogWFggU3ViLW1hY3JvIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhYMSggbmFtZSwgdHlwZTEsIHBhcjEgKQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJCSAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJdHlwZTEJcGFyMTsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWFgyKCBuYW1lLCB0eXBlMSwgcGFyMSwgdHlwZTIsIHBhcjIgKQlcCit0eXBlZGVmIHN0cnVjdCB7CQkJCSAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCXR5cGUxCXBhcjE7ICAgICAgICAgICAgICAgCVwKKwl0eXBlMglwYXIyOyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYWDMoIG5hbWUsIHR5cGUxLCBwYXIxLCB0eXBlMiwgcGFyMiwgdHlwZTMsIHBhcjMgKQlcCit0eXBlZGVmIHN0cnVjdCBuYW1lIyNfU1RSQ1QgeyAgIAlcCisJaGNmXzE2CWxlbjsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJdHlwOyAgICAgICAgICAgICAgICAJXAorCXR5cGUxCXBhcjE7ICAgICAgICAgICAgICAgCVwKKwl0eXBlMglwYXIyOyAgICAgICAgICAgICAgIAlcCisJdHlwZTMJcGFyMzsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWFg0KCBuYW1lLCB0eXBlMSwgcGFyMSwgdHlwZTIsIHBhcjIsIHR5cGUzLCBwYXIzLCB0eXBlNCwgcGFyNCApCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkJICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwl0eXBlMQlwYXIxOyAgICAgICAgICAgICAgIAlcCisJdHlwZTIJcGFyMjsgICAgICAgICAgICAgICAJXAorCXR5cGUzCXBhcjM7ICAgICAgICAgICAgICAgCVwKKwl0eXBlNAlwYXI0OyAgICAgICAgICAgICAgIAlcCit9IG5hbWUjI19TVFJDVDsKKworI2RlZmluZSBYMSggbmFtZSwgcGFyMSApCVwKK3R5cGVkZWYgc3RydWN0IG5hbWUjI19TVFJDVCB7ICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFgyKCBuYW1lLCBwYXIxLCBwYXIyICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDMoIG5hbWUsIHBhcjEsIHBhcjIsIHBhcjMgKQkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIyOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjM7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg0KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg1KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNTsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDYoIG5hbWUsIHBhcjEsIHBhcjIsIHBhcjMsIHBhcjQsIHBhcjUsIHBhcjYgKQkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIyOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjM7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNDsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI1OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjY7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisjZGVmaW5lIFg4KCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1LCBwYXI2LCBwYXI3LCBwYXI4ICkJCVwKK3R5cGVkZWYgc3RydWN0IHsJCQkgICAgCVwKKwloY2ZfMTYJbGVuOyAgICAgICAgICAgICAgICAJXAorCWhjZl8xNgl0eXA7ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjE7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMjsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIzOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjQ7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI2OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjc7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyODsgICAgICAgICAgICAgICAJXAorfSBuYW1lIyNfU1RSQ1Q7CisKKyNkZWZpbmUgWDExKCBuYW1lLCBwYXIxLCBwYXIyLCBwYXIzLCBwYXI0LCBwYXI1LCBwYXI2LCBwYXI3LCBwYXI4LCBwYXI5LCBwYXIxMCwgcGFyMTEgKQkJXAordHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAJXAorCWhjZl8xNglsZW47ICAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXR5cDsgICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXIyOyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjM7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNDsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI1OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjY7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyNzsgICAgICAgICAgICAgICAJXAorCWhjZl8xNglwYXI4OyAgICAgICAgICAgICAgIAlcCisJaGNmXzE2CXBhcjk7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTA7ICAgICAgICAgICAgICAgCVwKKwloY2ZfMTYJcGFyMTE7ICAgICAgICAgICAgICAgCVwKK30gbmFtZSMjX1NUUkNUOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTdWJzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vYXBwYXJlbnRseSBub3QgbmVlZGVkIChDRkdfQ05GX0NPVU5UUlkpCit0eXBlZGVmIHN0cnVjdCBDSEFOTkVMX1NFVCB7CQkJCS8vY2hhbm5lbCBzZXQgc3RydWN0dXJlIHVzZWQgaW4gdGhlIENGR19DTkZfQ09VTlRSWSBMVFYKKwloY2ZfMTYJZmlyc3RfY2hhbm5lbDsKKwloY2ZfMTYJbnVtYmVyX29mX2NoYW5uZWxzOworCWhjZl8xNgltYXhfdHhfb3V0cHV0X2xldmVsOworfSBDSEFOTkVMX1NFVDsKKwordHlwZWRlZiBzdHJ1Y3QgS0VZX1NUUkNUIHsJCQkJCS8vIGtleSBzdHJ1Y3R1cmUgdXNlZCBpbiB0aGUgQ0ZHX0RFRkFVTFRfS0VZUyBMVFYKKyAgICBoY2ZfMTYgIGxlbjsJICAgICAgICAgICAgICAJCQkJLy9sZW5ndGggb2Yga2V5CisgICAgaGNmXzggICBrZXlbMTRdOwkJCQkJCQkvL2VuY3J5cHRpb24ga2V5Cit9IEtFWV9TVFJDVDsKKwordHlwZWRlZiBzdHJ1Y3QgU0NBTl9SU19TVFJDVCB7CQkJCS8vIFNjYW4gUmVzdWx0IHN0cnVjdHVyZSB1c2VkIGluIHRoZSBDRkdfU0NBTiBMVFYKKwloY2ZfMTYJY2hhbm5lbF9pZDsKKwloY2ZfMTYJbm9pc2VfbGV2ZWw7CisJaGNmXzE2CXNpZ25hbF9sZXZlbDsKKwloY2ZfOAlic3NpZFs2XTsKKwloY2ZfMTYJYmVhY29uX2ludGVydmFsX3RpbWU7CisJaGNmXzE2CWNhcGFiaWxpdHk7CisJaGNmXzE2CXNzaWRfbGVuOworCWhjZl84CXNzaWRfdmFsWzMyXTsKK30gU0NBTl9SU19TVFJDVDsKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QgewkJLy8gcmFuZ2Ugc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgdXNlZCBpbiBDRkdfUkFOR0VTLCBDRkdfUkFOR0UxIGV0YworCWhjZl8xNgl2YXJpYW50OworCWhjZl8xNglib3R0b207CisJaGNmXzE2CXRvcDsKK30gQ0ZHX1JBTkdFX1NQRUNfU1RSQ1Q7CisKK3R5cGVkZWYgc3RydWN0IENGR19SQU5HRV9TUEVDX0JZVEVfU1RSQ1QgewkvLyBieXRlIG9yaWVudGVkIHJhbmdlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHVzZWQgaW4gQ0ZHX1JBTkdFX0IgTFRWCisJaGNmXzgJdmFyaWFudFsyXTsKKwloY2ZfOAlib3R0b21bMl07CisJaGNmXzgJdG9wWzJdOworfSBDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUOworCisvL3VzZWQgdG8gc2V0IHVwICJUIiBmdW5jdGlvbmFsaXR5IGZvciBJbmZvIGZyYW1lcywgaS5lLiBsb2cgaW5mbyBmcmFtZXMgaW4gTVNGIHN1cHBsaWVkIGJ1ZmZlciBhbmQgTWFpbEJveAorWFgxKCBSSURfTE9HLCB1bnNpZ25lZCBzaG9ydCBGQVIqLCBidWZwICkKK3R5cGVkZWYgUklEX0xPR19TVFJDVCAgRkFSICpSSURfTE9HUDsKK1hYMSggQ0ZHX1JJRF9MT0csIFJJRF9MT0dQLCByZWNvcmRwICkKKworIFgxKCBMVFYsCQl2YWxbMV0gKQkJCQkJCQkJCQkJCS8qbWluaW11bSBMVFYgcHJvdG8gdHlwCSovCisgWDEoIExUVl9NQVgsCXZhbFtIQ0ZfTUFYX0xUVl0gKQkJCQkJCQkJCQkvKm1heGltdW0gTFRWIHByb3RvIHR5cAkqLworWFgyKCBDRkdfUkVHX01CLCBoY2ZfMTYqICwgbWJfYWRkciwgaGNmXzE2LCBtYl9zaXplICkKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX01CX0lORk9fRlJBRyB7CS8vIHNwZWNpZmljYXRpb24gb2YgYnVmZmVyIGZyYWdtZW50CisJdW5zaWduZWQgc2hvcnQgRkFSKglmcmFnX2FkZHI7CisJaGNmXzE2CQkJCWZyYWdfbGVuOworfSBDRkdfTUJfSU5GT19GUkFHOworCisvKiBNYWlsIEJveCBJbmZvIEJsb2NrIHN0cnVjdHVyZXMsCisgKiB0aGUgYmFzZSBmb3JtOiBDRkdfTUJfSU5GT19TVFJDVAorICogYW5kIHRoZSBkZXJpdmVkIGZvcm1zOiBDRkdfTUJfSU5GT19SQU5HRTxuPl9TVFJDVCB3aXRoIG4gaXMgMSwgMiwgMyBvciAyMAorICogcHJlZGVmaW5lZCBmb3IgYSBwYXlsb2FkIG9mIDEsIGFuZCB1cCB0byAyLCAzIGFuZCAyMCBDRkdfTUJfSU5GT19GUkFHIGVsZW1lbnRzICovCitYWDMoIENGR19NQl9JTkZPLAkJICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgMV0gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTEsICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgMV0gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTIsICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgMl0gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTMsICBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsgM10gKQorWFgzKCBDRkdfTUJfSU5GT19SQU5HRTIwLCBoY2ZfMTYsIGJhc2VfdHlwLCBoY2ZfMTYsIGZyYWdfY250LCBDRkdfTUJfSU5GT19GUkFHLCBmcmFnX2J1ZlsyMF0gKQorCitYWDMoIENGR19NQl9BU1NFUlQsIGhjZl8xNiwgbGluZSwgaGNmXzE2LCB0cmFjZSwgaGNmXzMyLCBxdWFsaWZpZXIgKQkvKk1CSW5mb0Jsb2NrIGZvciBhc3NlcnRzCSovCisjaWYgKEhDRl9BU1NFUlQpICYgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROICkKK3R5cGVkZWYgdm9pZCAoTVNGX0FTU0VSVF9SVE4pKCB1bnNpZ25lZCBpbnQgLCBoY2ZfMTYsIGhjZl8zMiApOwordHlwZWRlZiBNU0ZfQVNTRVJUX1JUTiAvKmNhbid0IGxpbmsgRkFSKi8gKiBNU0ZfQVNTRVJUX1JUTlA7CisvKiBDRkdfUkVHX0FTU0VSVF9SVE5QICgweDA4MzIpCShkZS0pcmVnaXN0ZXIgTVNGIENhbGxiYWNrIHJvdXRpbmVzCisgKiBsdmw6ICBBc3NlcnQgbGV2ZWwgZmlsdGVyaW5nIChub3QgeWV0IGltcGxlbWVudGVkKQorICogcnRucDogYWRkcmVzcyBvZiBNU0ZfQVNTRVJUX1JUTiAobmF0aXZlIEVuZGlhbiBmb3JtYXQpICovCitYWDIoIENGR19SRUdfQVNTRVJUX1JUTlAsIGhjZl8xNiwgbHZsLCBNU0ZfQVNTRVJUX1JUTlAsIHJ0bnAgKQorI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4gLyBIQ0ZfQVNTRVJUX1JUX01TRl9SVE4KKworIFgxKCBDRkdfSENGX09QVCwgdmFsWzIwXSApCQkJCQkJCQkJCQkgIAkvKihDb21waWxlIHRpbWUpIG9wdGlvbnMJKi8KKyBYMyggQ0ZHX0NNRF9IQ0YsIGNtZCwgbW9kZSwgYWRkX2luZm8gKQkJCQkJCQkJCS8qSENGIEVuZ2luZWVyaW5nIGNvbW1hbmQJKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWhjZl8xNgkJbGVuOworCWhjZl8xNgkJdHlwOworCWhjZl8xNgkJbW9kZTsJCQkvLyBQUk9HX1NUT1AvVk9MQVRJTEUgW0ZMQVNIL1NFRVBST00vU0VFUFJPTV9SRUFEQkFDS10KKwloY2ZfMTYJCXNlZ21lbnRfc2l6ZTsgIAkvLyBzaXplIG9mIHRoZSBzZWdtZW50IGluIGJ5dGVzCisJaGNmXzMyCQluaWNfYWRkcjsgIAkJLy8gZGVzdGluYXRpb24gYWRkcmVzcyAoaW4gTklDIG1lbW9yeSkKKwloY2ZfMTYJCWZsYWdzOwkJCS8vIDB4MDAwMQk6IENSQyBZZXMvTm8KKy8vCWhjZl8zMgkJZmxhZ3M7CQkJLy8gMHgwMDAxCTogQ1JDIFllcy9ObworCS8qIDs/IHN0aWxsIG5vdCB0aGUgd2hvbGUgc3RvcnkKKwkgKiBmbGFncyBpcyBleHRlbmRlZCBmcm9tIDE2IHRvIDMyIGJpdHMgdG8gZm9yY2UgdGhhdCBjb21waWxpbmcgRlcuQyBwcm9kdWNlcyB0aGUgc2FtZSBzdHJ1Y3R1cmVzCisJICogaW4gbWVtb3J5IGFzIEZVUFU0IEJJTiBmaWxlcy4KKwkgKiBOb3RlIHRoYXQgdGhlIHByb2JsZW0gYXJpc2VzIGZyb20gdGhlIHZpb2xhdGlvbiBvZiB0aGUgY29uc3RyYWludCB0byB1c2UgcGFja2luZyBhdCBieXRlIGJvdW5kYXJpZXMKKwkgKiBhcyB3YXMgc3RpcHVsYXRlZCBpbiB0aGUgV0NJLXNwZWNpZmljYXRpb24KKwkgKiBUaGUgUGFjayBwcmFnbWEgY2FuJ3QgcmVzb2x2ZSB0aGlzIGlzc3VlLCBiZWNhdXNlIHRoYXQgaW1wYWN0cyBhbGwgbWVtYmVycyBvZiB0aGUgc3RydWN0dXJlIHdpdGgKKwkgKiBkaXNyZWdhcmQgb2YgdGhlaXIgYWN0dWFsIHNpemUsIHNvIGFsaWduaW5nIGhvc3RfYWRkciB1bmRlciBNU1ZDIDEuNSBhdCA0IGJ5dGVzLCBhbHNvIGFsaWducworCSAqIGxlbiwgdHlwIGV0YyBvbiA0IGJ5dGVzCisJICogKi8KKy8vCWhjZl8xNgkJcGFkOyAJIAkJLy8hISBiZSBjYXJlZnVsIGFsaWdubWVudCBwcm9ibGVtcyBmb3IgQmluIGRvd25sb2FkIHZlcnN1cyBDIGRvd25sb2FkCisJaGNmXzggRkFSICAgKmhvc3RfYWRkcjsgIAkvLyBzb3VyY2UgYWRkcmVzcyAoaW4gSG9zdCBtZW1vcnkpCit9IENGR19QUk9HX1NUUkNUOyAvLyBzZWdtZW50X2Rlc2NwOworCisvLyBhIHN0cnVjdHVyZSB1c2VkIGZvciB0cmFuc3BvcnRpbmcgZGVidWctcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIGZpcm13YXJlCisvLyB2aWEgdGhlIEhDRiwgaW50byB0aGUgTVNGCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaGNmXzE2ICAgICAgbGVuOworICAgIGhjZl8xNiAgICAgIHR5cDsKKyAgICBoY2ZfMTYgICAgICBtc2dfaWQsIG1zZ19wYXIsIG1zZ190c3RhbXA7Cit9IENGR19GV19QUklOVEZfU1RSQ1Q7CisKKy8vIGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBsb2NhdGlvbiBhbmQgc2l6ZSBvZiBhIGNlcnRhaW4gZGVidWctcmVsYXRlZAorLy8gYnVmZmVyIGluIG5pYy1yYW0uCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaGNmXzE2ICAgICAgbGVuOworICAgIGhjZl8xNiAgICAgIHR5cDsKKyAgICBoY2ZfMzIgICAgICBEYk1zZ0NvdW50LCAJLy8gZHMgKG5pY3JhbSkgYWRkcmVzcyBvZiBhIGNvdW50ZXIKKyAgICAgICAgICAgICAgICBEYk1zZ0J1ZmZlciwgCS8vIGRzIChuaWNyYW0pIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgIERiTXNnU2l6ZSwgCQkvLyBudW1iZXIgb2YgZW50cmllcyAoZWFjaCAzIHdvcmQgaW4gc2l6ZSkgaW4gdGhpcyBidWZmZXIKKyAgICAgICAgICAgICAgICBEYk1zZ0ludHJ2bDsJLy8gZHMgKG5pY3JhbSkgYWRkcmVzcyBvZiBpbnRlcnZhbCBmb3IgZ2VuZXJhdGluZyBJbmZEcm9wIGV2ZW50Cit9IENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUOworCitYWDMoIENGR19SQU5HRVMsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDFdICkgLypBY3Rvci9TdXBwbGllciByYW5nZSAoMSB2YXJpYW50KSovCitYWDMoIENGR19SQU5HRTEsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDFdICkgLypBY3Rvci9TdXBwbGllciByYW5nZSAoMSB2YXJpYW50KSovCitYWDMoIENGR19SQU5HRTIsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDJdICkgLypBY3RvciByYW5nZSAoIDIgdmFyaWFudHMpCQkqLworWFgzKCBDRkdfUkFOR0UzLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyAzXSApIC8qQWN0b3IgcmFuZ2UgKCAzIHZhcmlhbnRzKQkJKi8KK1hYMyggQ0ZHX1JBTkdFNCwJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1sgNF0gKSAvKkFjdG9yIHJhbmdlICggNCB2YXJpYW50cykJCSovCitYWDMoIENGR19SQU5HRTUsCWhjZl8xNiwgcm9sZSwgaGNmXzE2LCBpZCwgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QsIHZhcl9yZWNbIDVdICkgLypBY3RvciByYW5nZSAoIDUgdmFyaWFudHMpCQkqLworWFgzKCBDRkdfUkFOR0U2LAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWyA2XSApIC8qQWN0b3IgcmFuZ2UgKCA2IHZhcmlhbnRzKQkJKi8KK1hYMyggQ0ZHX1JBTkdFNywJaGNmXzE2LCByb2xlLCBoY2ZfMTYsIGlkLCBDRkdfUkFOR0VfU1BFQ19TVFJDVCwgdmFyX3JlY1sgN10gKSAvKkFjdG9yIHJhbmdlICggNyB2YXJpYW50cykJCSovCitYWDMoIENGR19SQU5HRTIwLAloY2ZfMTYsIHJvbGUsIGhjZl8xNiwgaWQsIENGR19SQU5HRV9TUEVDX1NUUkNULCB2YXJfcmVjWzIwXSApIC8qQWN0b3IgcmFuZ2UgKDIwIHZhcmlhbnRzKQkJKi8KKworLypGcmFtZXMgKi8KKyBYMyggQ0ZHX0FTU09DX1NUQVQsICBhc3NvY19zdGF0LCBzdGF0aW9uX2FkZHJbM10sIHZhbFs0Nl0gKSAJLypBc3NvY2lhdGlvbiBzdGF0dXMsIGJhc2ljCQkJCQkqLworIFgyKCBDRkdfQVNTT0NfU1RBVDMsIGFzc29jX3N0YXQsIHN0YXRpb25fYWRkclszXSApIAkJCQkJCQkJLyphc3NvY19zdGF0OjMJCQkqLworIFgzKCBDRkdfQVNTT0NfU1RBVDEsIGFzc29jX3N0YXQsIHN0YXRpb25fYWRkclszXSwgZnJhbWVfYm9keVs0M10gKQkJCQkJLyphc3NvY19zdGF0OjEJCQkqLworIFg0KCBDRkdfQVNTT0NfU1RBVDIsIGFzc29jX3N0YXQsIHN0YXRpb25fYWRkclszXSwgb2xkX2FwX2FkZHJbM10sIGZyYW1lX2JvZHlbNDNdICkJLyphc3NvY19zdGF0OjIJCQkqLworCisvKlN0YXRpYyBDb25maWd1cmF0aW9ucyAqLworIFgxKCBDRkdfQ05GX1BPUlRfVFlQRSwJCQkJcG9ydF90eXBlCQkJICkgLypbU1RBXSBDb25uZWN0aW9uIGNvbnRyb2wgY2hhcmFjdGVyaXN0aWNzCQkJCSovCisgWDEoIENGR19NQUNfQUREUiwJCQkJCW1hY19hZGRyWzNdIAkJICkgLypnZW5lcmFsOiBGQzAxLEZDMDgsRkMxMSxGQzEyLEZDMTMsRkMxNCxGQzE1LEZDMTYgCQkqLworIFgxKCBDRkdfQ05GX09XTl9NQUNfQUREUiwJCQltYWNfYWRkclszXQkJCSApCisgWDEoIENGR19JRCwJCQkJCQlzc2lkWzE3XQkJCSApIC8qMHhGQzAyLCAweEZDMDQsIDB4RkMwRSAJCQkJCQkJCSovCisvKglYMSggQ0ZHX0RFU0lSRURfU1NJRCwJCQlzc2lkWzE3XQkJCSApCXNlZSBEeW5hbWljIENvbmZpZ3VyYXRpb25zCQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX09XTl9DSEFOTkVMLAkJCWNoYW5uZWwJCQkJICkgLypDb21tdW5pY2F0aW9uIGNoYW5uZWwgZm9yIEJTUyBjcmVhdGlvbgkJCQkJKi8KKyBYMSggQ0ZHX0NORl9PV05fU1NJRCwJCQkJc3NpZFsxN10JCQkgKQorIFgxKCBDRkdfQ05GX09XTl9BVElNX1dJTkRPVywJCWF0aW1fd2luZG93CQkJICkKKyBYMSggQ0ZHX0NORl9TWVNURU1fU0NBTEUsCQkJc3lzdGVtX3NjYWxlCQkgKQorIFgxKCBDRkdfQ05GX01BWF9EQVRBX0xFTiwJCQltYXhfZGF0YV9sZW4JCSApCisgWDEoIENGR19DTkZfV0RTX0FERFIsCQkJCW1hY19hZGRyWzNdCQkJICkgLypbU1RBXSBNQUMgQWRkcmVzcyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUJCSovCisgWDEoIENGR19DTkZfUE1fRU5BQkxFRCwJCQlwbV9lbmFibGVkCQkJICkgLypbU1RBXSBTd2l0Y2ggZm9yIEVTUyBQb3dlciBNYW5hZ2VtZW50IChQTSkgT24vT2ZmCQkqLworIFgxKCBDRkdfQ05GX1BNX0VQUywJCQkJcG1fZXBzCQkJCSApIC8qW1NUQV0gU3dpdGNoIGZvciBFU1MgUE0gRVBTL1BTIE1vZGUJCQkJCSovCisgWDEoIENGR19DTkZfTUNBU1RfUlgsCQkJCW1jYXN0X3J4CQkJICkgLypbU1RBXSBTd2l0Y2ggZm9yIEVTUyBQTSBNdWx0aWNhc3QgcmVjZXB0aW9uIE9uL09mZgkJKi8KKyBYMSggQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT04sCWR1cmF0aW9uCQkJICkgLypbU1RBXSBNYXhpbXVtIHNsZWVwIHRpbWUgZm9yIEVTUyBQTQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9QTV9IT0xET1ZFUl9EVVJBVElPTiwJZHVyYXRpb24JCQkgKSAvKltTVEFdIEhvbGRvdmVyIHRpbWUgZm9yIEVTUyBQTQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX09XTl9OQU1FLAkJCQlzc2lkWzE3XQkJCSApIC8qSWRlbnRpZmljYXRpb24gdGV4dCBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcwkJCSovCisgWDEoIENGR19DTkZfT1dOX0RUSU1fUEVSSU9ELAkJcGVyaW9kCQkJCSApIC8qW0FQXSBCZWFjb24gaW50ZXJ2YWxzIGJldHdlZW4gc3VjY2Vzc2l2ZSBEVElNcwkJCSovCisgWDEoIENGR19DTkZfV0RTX0FERFIxLAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDEgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFIyLAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDIgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFIzLAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDMgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFI0LAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDQgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFI1LAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDUgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfV0RTX0FERFI2LAkJCQltYWNfYWRkclszXQkJCSApIC8qW0FQXSBQb3J0IDYgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCSovCisgWDEoIENGR19DTkZfTUNBU1RfUE1fQlVGLAkJCW1jYXN0X3BtX2J1ZgkJICkgLypbQVBdIFN3aXRjaCBmb3IgUE0gYnVmZmVyaW5nIG9mIE11bHRpY2FzdCBNZXNzYWdlcwkqLworIFgxKCBDRkdfQ05GX1JFSkVDVF9BTlksCQkJcmVqZWN0X2FueQkJCSApIC8qW0FQXSBTd2l0Y2ggZm9yIFBNIGJ1ZmZlcmluZyBvZiBNdWx0aWNhc3QgTWVzc2FnZXMJKi8KKy8vWDEoIENGR19DTkZfRU5DUllQVElPTl9FTkFCTEVELAllbmNyeXB0aW9uCQkJICkgLypzcGVjaWZ5IGVuY3J5cHRpb24gdHlwZSBvZiBUeC9SeCBtZXNzYWdlcwkJCQkqLworIFgxKCBDRkdfQ05GX0VOQ1JZUFRJT04sCQkJZW5jcnlwdGlvbgkJCSApIC8qc3BlY2lmeSBlbmNyeXB0aW9uIHR5cGUgb2YgVHgvUnggbWVzc2FnZXMJCQkJKi8KKyBYMSggQ0ZHX0NORl9BVVRIRU5USUNBVElPTiwJCWF1dGhlbnRpY2F0aW9uCQkgKSAvKnNlbGVjdHMgQXV0aGVudGljYXRpb24gYWxnb3JpdGhtCQkJCQkJKi8KKyBYMSggQ0ZHX0NORl9FWENMX1VORU5DUllQVEVELAkJZXhjbHVkZV91bmVuY3J5cHRlZAkgKSAvKltBUF0gU3dpdGNoIGZvciAnY2xlYXItdGV4dCcgcnggbWVzc2FnZSBhY2NlcHRhbmNlCQkqLworIFgxKCBDRkdfQ05GX01DQVNUX1JBVEUsCQkJbWNhc3RfcmF0ZQkJCSApIC8qVHJhbnNtaXQgRGF0YSByYXRlIGZvciBNdWx0aWNhc3QgZnJhbWVzCQkJCSovCisgWDEoIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZLAkJaW50cmFfYnNzX3JlbGF5CQkgKSAvKltBUF0gU3dpdGNoIGZvciBJbnRyYUJCUyByZWxheQkJCQkJCQkqLworIFgxKCBDRkdfQ05GX01JQ1JPX1dBVkUsCQkJbWljcm9fd2F2ZQkJCSApIC8qTWljcm9XYXZlIChSb2J1c3RuZXNzKQkJCQkJCQkJCSovCisgWDEoIENGR19DTkZfTE9BRF9CQUxBTkNJTkcsCQlsb2FkX2JhbGFuY2luZwkJICkgLypMb2FkIEJhbGFuY2luZwkgIChCb29sZWFuLCAwPU9GRiwgMT1PTiwgZGVmYXVsdD0xKQkJKi8KKyBYMSggQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OLAltZWRpdW1fZGlzdHJpYnV0aW9uCSApIC8qTWVkaXVtIERpc3RyaWJ1dGlvbiAoQm9vbGVhbiwgMD1PRkYsIDE9T04sIGRlZmF1bHQ9MSkJKi8KKyBYMSggQ0ZHX0NORl9HUk9VUF9BRERSX0ZJTFRFUiwJCWdyb3VwX2FkZHJfZmlsdGVyCSApIC8qR3JvdXAgQWRkcmVzcyBGaWx0ZXIJCQkJCQkJCSAgIAkqLworIFgxKCBDRkdfQ05GX1RYX1BPV19MVkwsCQkJdHhfcG93X2x2bAkJCSApIC8qVHggUG93ZXIgTGV2ZWwJCQkJCQkJCQkJICAgCSovCitYWDQoIENGR19DTkZfQ09VTlRSWV9JTkZPLAkJCQkJCQkJIFwKKwkJaGNmXzE2LCBuX2NoYW5uZWxfc2V0cywgaGNmXzE2LCBjb3VudHJ5X2NvZGVbMl0sIFwKKwkJaGNmXzE2LCBlbnZpcm9ubWVudCwgQ0hBTk5FTF9TRVQsIGNoYW5uZWxfc2V0WzFdICkgLypDdXJyZW50IENvdW50cnkgSW5mbyAgCQkJCQkJCQkJKi8KK1hYNCggQ0ZHX0NORl9DT1VOVFJZX0lORk9fTUFYLAkJCQkJCQkgXAorCQloY2ZfMTYsIG5fY2hhbm5lbF9zZXRzLCBoY2ZfMTYsIGNvdW50cnlfY29kZVsyXSwgXAorCQloY2ZfMTYsIGVudmlyb25tZW50LCBDSEFOTkVMX1NFVCwgY2hhbm5lbF9zZXRbMTRdKSAvKkN1cnJlbnQgQ291bnRyeSBJbmZvICAJCQkJCQkJCQkqLworCisvKkR5bmFtaWMgQ29uZmlndXJhdGlvbnMgKi8KKyBYMSggQ0ZHX0RFU0lSRURfU1NJRCwJCQlzc2lkWzE3XQkJCQkJICkJLypbU1RBXSBTZXJ2aWNlIFNldCBpZGVudGlmaWNhdGlvbiBmb3IgY29ubmVjdGlvbgkqLworI2RlZmluZSBHUk9VUF9BRERSX1NJWkUJCQkoMzIgKiA2KQkJCQkJCS8vMzIgNi1ieXRlIE1BQy1hZGRyZXNzZXMKKyBYMSggQ0ZHX0dST1VQX0FERFIsCQkJbWFjX2FkZHJbR1JPVVBfQUREUl9TSVpFLzJdCSApCS8qW1NUQV0gTXVsdGljYXN0IE1BQyBBZGRyZXNzZXMgZm9yIFJ4LW1lc3NhZ2UJCSovCisgWDEoIENGR19DUkVBVEVfSUJTUywJCQljcmVhdGVfaWJzcwkJCQkJICkJLypbU1RBXSBTd2l0Y2ggZm9yIElCU1MgY3JlYXRpb24gT24vT2ZmCQkJCSovCisgWDEoIENGR19SVFNfVEhSSCwJCQkJcnRzX3RocmgJCQkJCSApCS8qW1NUQV0gRnJhbWUgbGVuZ3RoIHVzZWQgZm9yIFJUUy9DVFMgaGFuZHNoYWtlCQkqLworIFgxKCBDRkdfVFhfUkFURV9DTlRMLAkJCXR4X3JhdGVfY250bAkJCQkgKQkvKltTVEFdIERhdGEgcmF0ZSBjb250cm9sIGZvciBtZXNzYWdlIHRyYW5zbWlzc2lvbgkqLworIFgxKCBDRkdfUFJPTUlTQ1VPVVNfTU9ERSwJCXByb21pc2N1b3VzX21vZGUJCQkgKQkvKltTVEFdIFN3aXRjaCBmb3IgUHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24gT24vT2YJKi8KKyBYMSggQ0ZHX1dPTCwJCQkJCXdha2Vfb25fbGFuCQkJCQkgKQkvKltTVEFdIFN3aXRjaCBmb3IgV2FrZS1Pbi1MQU4gbW9kZQkJCQkJKi8KKyBYMSggQ0ZHX1JUU19USFJIMCwJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDAgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfUlRTX1RIUkgxLAkJCQlydHNfdGhyaAkJCQkJICkJLypbQVBdIFBvcnQgMSBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCSovCisgWDEoIENGR19SVFNfVEhSSDIsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCAyIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1JUU19USFJIMywJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDMgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfUlRTX1RIUkg0LAkJCQlydHNfdGhyaAkJCQkJICkJLypbQVBdIFBvcnQgNCBmcmFtZSBsZW5ndGggZm9yIFJUUy9DVFMgaGFuZHNoYWtlCSovCisgWDEoIENGR19SVFNfVEhSSDUsCQkJCXJ0c190aHJoCQkJCQkgKQkvKltBUF0gUG9ydCA1IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UJKi8KKyBYMSggQ0ZHX1JUU19USFJINiwJCQkJcnRzX3RocmgJCQkJCSApCS8qW0FQXSBQb3J0IDYgZnJhbWUgbGVuZ3RoIGZvciBSVFMvQ1RTIGhhbmRzaGFrZQkqLworIFgxKCBDRkdfVFhfUkFURV9DTlRMMCwJCQlyYXRlX2NudGwgCQkJCQkgKQkvKltBUF0gUG9ydCAwIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDEsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCAxIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDIsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCAyIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDMsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCAzIGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDQsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCA0IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDUsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCA1IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KKyBYMSggQ0ZHX1RYX1JBVEVfQ05UTDYsCQkJcmF0ZV9jbnRsCQkJCQkgKQkvKltBUF0gUG9ydCA2IGRhdGEgcmF0ZSBjb250cm9sIGZvciB0cmFuc21pc3Npb24JKi8KK1hYMSggQ0ZHX0RFRkFVTFRfS0VZUywJCQlLRVlfU1RSQ1QsIGtleVs0XQkJCSApCS8qZGVmaW5lcyBzZXQgb2YgZW5jcnlwdGlvbiBrZXlzCQkJCQkqLworIFgxKCBDRkdfVFhfS0VZX0lELAkJCQl0eF9rZXlfaWQJCQkJCSApCS8qc2VsZWN0IGtleSBmb3IgZW5jcnlwdGlvbiBvZiBUeCBtZXNzYWdlcwkJCSovCisgWDEoIENGR19TQ0FOX1NTSUQsCQkJCXNzaWRbMTddCQkJCQkgKQkvKmlkZW50aWZpY2F0aW9uIGZvciBjb25uZWN0aW9uCQkJCQkJKi8KKyBYNSggQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZLAkJCQkJCQkJIFwKKwkJIHRraXBfa2V5X2lkX2luZm8sIHRraXBfa2V5X2l2X2luZm9bNF0sIHRraXBfa2V5WzhdLCBcCisJCSB0eF9taWNfa2V5WzRdLCByeF9taWNfa2V5WzRdIAkJCQkJCSApCS8qCQkJCQkJCQkJCSAgICAgICAJCSovCisgWDYoIENGR19BRERfVEtJUF9NQVBQRURfS0VZLAlic3NpZFszXSwgdGtpcF9rZXlbOF0sIAkJIFwKKwkJIHRzY1s0XSwgcnNjWzRdLCB0eF9taWNfa2V5WzRdLCByeF9taWNfa2V5WzRdIAkJICkJLyoJCQkJCQkJCQkJICAgICAgIAkJKi8KKyBYMSggQ0ZHX1NFVF9TU05fQVVUSEVOVElDQVRJT05fU1VJVEUsIAkJCQkJCSBcCisJCSBzc25fYXV0aGVudGljYXRpb25fc3VpdGUJCQkJCQkJICkJLyoJCQkJCQkJCQkJCSAgIAkJKi8KKyBYMSggQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZLHRraXBfa2V5X2lkCQkJCSApCS8qCQkJCQkJCQkJCQkgICAJCSovCisgWDEoIENGR19USUNLX1RJTUUsCQkJCXRpY2tfdGltZQkJCQkJICkJLypBdXhpbGlhcnkgVGltZXIgdGljayBpbnRlcnZhbAkJCQkJCSovCisgWDEoIENGR19ERFNfVElDS19USU1FLAkJCXRpY2tfdGltZQkJCQkJICkJLypEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIFRpbWVyIHRpY2sgaW50ZXJ2YWwJCSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEFkZGVkIGZvciBQYXR0ZXJuLW1hdGNoaW5nIFdha2VPbkxhbi4gKFNlZSBmaXJtd2FyZSBkZXNpZ24gbm90ZSBXTUROMjgxQykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdPTF9QQVRURVJOUwkJCQk1CQkvLyBtYXhpbXVtIG9mIDUgcGF0dGVybnMgaW4gZmlybXdhcmUKKyNkZWZpbmUgV09MX1BBVFRFUk5fTEVOCQkJCTEyNAkJLy8gbWF4aW11bSAxMjQgYnl0ZXMgcGF0dGVybiBsZW5ndGggcGVyIHBhdHRlcm4gaW4gZmlybXdhcmUKKyNkZWZpbmUgV09MX01BU0tfTEVOCQkJIAkzMAkJLy8gbWF4aW11bSAzMCBieXRlcyBtYXNrIGxlbmd0aCBwZXIgcGF0dGVybiBpbiBmaXJtd2FyZQorI2RlZmluZSBXT0xfQlVGX1NJWkUJKFdPTF9QQVRURVJOUyAqIChXT0xfUEFUVEVSTl9MRU4gKyBXT0xfTUFTS19MRU4gKyA2KSAvIDIpCitYMiggQ0ZHX1dPTF9QQVRURVJOUywgblBhdHRlcm5zLCBidWZmZXJbV09MX0JVRl9TSVpFXQkJICkgIC8qW1NUQV0gV2FrZU9uTGFuIHBhdHRlcm4gbWF0Y2gsIHJvb20gZm9yIDUgcGF0dGVybnMqLworCisgWDUoIENGR19TVVBfUkFOR0UsCQlyb2xlLCBpZCwgdmFyaWFudCwgYm90dG9tLCB0b3AJCQkJICAgKSAvKltQUkldIFByaW1hcnkgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZQkJKi8KKy8qIE5JQyBJbmZvcm1hdGlvbiAqLworIFg0KCBDRkdfSURFTlRJVFksCQkJY29tcF9pZCwgdmFyaWFudCwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vciApIC8qaWRlbnRpZmljYXRpb24gUHJvdG90eXBlCQkJCQkJCSovCisjZGVmaW5lIENGR19EUlZfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisjZGVmaW5lIENGR19QUklfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisjZGVmaW5lIENGR19OSUNfSURFTlRJVFlfU1RSQ1QJQ0ZHX0lERU5USVRZX1NUUkNUCisjZGVmaW5lIENGR19GV19JREVOVElUWV9TVFJDVAlDRkdfSURFTlRJVFlfU1RSQ1QKKyBYMSggQ0ZHX1JJRF9JTkZfTUlOLAkJeQkJCQkJCQkJCQkJICAgKSAvKmxvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gSW5mb3JtYXRpb24gUklECQkqLworIFgxKCBDRkdfTUFYX0xPQURfVElNRSwJCW1heF9sb2FkX3RpbWUJCQkJCQkJCSAgICkgLypbUFJJXSBNYXggcmVzcG9uc2UgdGltZSBvZiB0aGUgRG93bmxvYWQgY29tbWFuZAkqLworIFgzKCBDRkdfRExfQlVGLAkJCWJ1Zl9wYWdlLCBidWZfb2Zmc2V0LCBidWZfbGVuCQkJCSAgICkgLypbUFJJXSBEb3dubG9hZCBidWZmZXIgbG9jYXRpb24gYW5kIHNpemUJCQkqLworLy8gWDUoIENGR19QUklfU1VQX1JBTkdFLAkJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBQcmltYXJ5IFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UJCSovCisgWDUoIENGR19DRklfQUNUX1JBTkdFU19QUkkscm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBDb250cm9sbGVyIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzCQkqLworLy8gWDUoIENGR19OSUNfSFNJX1NVUF9SQU5HRSwJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypIL1cgLSBTL1cgSS9GIHN1cHBsaWVyIHJhbmdlCQkJCQkJKi8KKyBYMSggQ0ZHX05JQ19TRVJJQUxfTlVNQkVSLAlzZXJpYWxfbnVtYmVyWzE3XQkJCQkJCQkgICApIC8qW1BSSV0gTmV0d29yayBJL0YgQ2FyZCBzZXJpYWwgbnVtYmVyCQkJCSovCisgWDUoIENGR19OSUNfTUZJX1NVUF9SQU5HRSwJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbUFJJXSBNb2RlbSBJL0YgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZQkJKi8KKyBYNSggQ0ZHX05JQ19DRklfU1VQX1JBTkdFLAlyb2xlLCBpZCwgdmFyaWFudCwgYm90dG9tLCB0b3AJCQkJICAgKSAvKltQUkldIENvbnRyb2xsZXIgSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UqLworLy9ILUkgWDEoIENGR19DSEFOTkVMX0xJU1QsCQljaGFubmVsX2xpc3QJCQkJCQkJCSAgICkgLypBbGxvd2VkIGNvbW11bmljYXRpb24gY2hhbm5lbHMJCQkJCSovCisvL0gtSSBYWDIoIENGR19SRUdfRE9NQUlOUywJCWhjZl8xNiwgbnVtX2RvbWFpbiwgaGNmXzgsIHJlZ19kb21haW5zWzEwXQkgICApIC8qTGlzdCBvZiBpbnRlbmRlZCByZWd1bGF0b3J5IGRvbWFpbnMJCQkJKi8KKyBYMSggQ0ZHX05JQ19URU1QX1RZUEUsCQl0ZW1wX3R5cGUJCQkJCQkJCQkgICApIC8qSGFyZHdhcmUgdGVtcGVyYXR1cmUgcmFuZ2UgY29kZQkJCQkJKi8KKy8vSC1JIFgxKCBDRkdfQ0lTLAkJCQljaXNbMjQwXQkJCQkJCQkJCSAgICkgLypQQyBDYXJkIFN0YW5kYXJkIENhcmQgSW5mb3JtYXRpb24gU3RydWN0dXJlCQkqLworIFg1KCBDRkdfTklDX1BST0ZJTEUsCQkJCQkJCQkJCQkJCSAgIFwKKwkJIHByb2ZpbGVfY29kZSwgY2FwYWJpbGl0eV9vcHRpb25zLCBhbGxvd2VkX2RhdGFfcmF0ZXMsIHZhbDQsIHZhbDUgICkgLypDYXJkIFByb2ZpbGUJCQkJCQkJCQkJKi8KKy8vIFg1KCBDRkdfRldfU1VQX1JBTkdFLAkJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbU1RBXSBTdGF0aW9uIEkvRiBTdXBwbGllciBjb21wYXRpYmlsaXR5IHJhbmdlCSovCisgWDUoIENGR19NRklfQUNUX1JBTkdFUywJcm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbU1RBXSBNb2RlbSBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMJCSovCisgWDUoIENGR19DRklfQUNUX1JBTkdFU19TVEEscm9sZSwgaWQsIHZhcmlhbnQsIGJvdHRvbSwgdG9wCQkJCSAgICkgLypbU1RBXSBDb250cm9sbGVyIEkvRiBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcwkqLworIFg1KCBDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLHJvbGUsIGlkLCB2YXJpYW50LCBib3R0b20sIHRvcAkJCQkgICApIC8qW1NUQV0gQ29udHJvbGxlciBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMJKi8KKyBYMSggQ0ZHX05JQ19CVVNfVFlQRSwJCW5pY19idXNfdHlwZQkJCQkJCQkJICAgKSAvKk5JQyBidXN0eXBlIGRlcml2ZWQgZnJvbSBCVVNTRUwgaG9zdCBJL0Ygc2lnbmFscyAqLworCisvKglNQUMgSU5GT1JNQVRJT04JKi8KKyBYMSggQ0ZHX1BPUlRfU1RBVCwJCQkJcG9ydF9zdGF0CQkJCQkJCSApIC8qW1NUQV0gQWN0dWFsIE1BQyBQb3J0IGNvbm5lY3Rpb24gY29udHJvbCBzdGF0dXMJCSovCisgWDEoIENGR19DVVJfU1NJRCwJCQkJc3NpZFsxN10JCQkJCQkJICkgLypbU1RBXSBJZGVudGlmaWNhdGlvbiBvZiB0aGUgYWN0dWFsbHkgY29ubmVjdGVkIFNTCQkqLworIFgxKCBDRkdfQ1VSX0JTU0lELAkJCQltYWNfYWRkclszXQkJCQkJCQkgKSAvKltTVEFdIElkZW50aWZpY2F0aW9uIG9mIHRoZSBhY3R1YWxseSBjb25uZWN0ZWQgQlNTCQkqLworIFgzKCBDRkdfQ09NTVNfUVVBTElUWSwJCQljb21zX3F1YWwsIHNpZ25hbF9sdmwsIG5vaXNlX2x2bAkgKSAvKltTVEFdIFF1YWxpdHkgb2YgdGhlIEJhc2ljIFNlcnZpY2UgU2V0IGNvbm5lY3Rpb24JCSovCisgWDEoIENGR19DVVJfVFhfUkFURSwJCQlyYXRlCQkJCQkJCQkgKSAvKltTVEFdIEFjdHVhbCB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCQkqLworIFgxKCBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTCwJaW50ZXJ2YWwJCQkJCQkJICkgLypCZWFjb24gdHJhbnNtaXQgaW50ZXJ2YWwgdGltZSBmb3IgQlNTIGNyZWF0aW9uCQkJKi8KKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV0FSUAorIFgxMSggQ0ZHX0NVUl9TQ0FMRV9USFJILAkJCQkJCQkJCQkJIFwKKwkgY2Fycmllcl9kZXRlY3RfdGhyaF9jY2ssIGNhcnJpZXJfZGV0ZWN0X3Rocmhfb2ZkbSwgZGVmZXJfdGhyaCwJIFwKKwkgZW5lcmd5X2RldGVjdF90aHJoLCByc3NpX29uX3RocmhfZGV2aWF0aW9uLCAJCQkJCSBcCisJIHJzc2lfb2ZmX3RocmhfZGV2aWF0aW9uLCBjY2tfZHJvcF90aHJoLCBvZmRtX2Ryb3BfdGhyaCwgCQkgXAorCSBjZWxsX3NlYXJjaF90aHJoLCBvdXRfb2ZfcmFuZ2VfdGhyaCwgZGVsdGFfc25yCQkJCSApCisjZWxzZQorIFg2KCBDRkdfQ1VSX1NDQUxFX1RIUkgsCQkJCQkJCQkJCQkgXAorCSBlbmVyZ3lfZGV0ZWN0X3RocmgsIGNhcnJpZXJfZGV0ZWN0X3RocmgsIGRlZmVyX3RocmgsIAkJCSBcCisJIGNlbGxfc2VhcmNoX3RocmgsIG91dF9vZl9yYW5nZV90aHJoLCBkZWx0YV9zbnIJCQkJCSApIC8qQWN0dWFsIFN5c3RlbSBTY2FsZSB0aHJlc2hvbGRzIHNldHRpbmdzCQkJCSovCisjZW5kaWYgLy8gSENGX1RZUEVfV0FSUAorIFgxKCBDRkdfUFJPVE9DT0xfUlNQX1RJTUUsCQl0aW1lCQkJCQkJCQkgKSAvKk1heCB0aW1lIHRvIGF3YWl0IGEgcmVzcG9uc2UgdG8gYSByZXF1ZXN0IG1lc3NhZ2UJCSovCisgWDEoIENGR19DVVJfU0hPUlRfUkVUUllfTElNSVQsCWxpbWl0CQkJCQkJCQkgKSAvKk1heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgZm9yIHNob3J0IGZyYW1lcwkJKi8KKyBYMSggQ0ZHX0NVUl9MT05HX1JFVFJZX0xJTUlULAlsaW1pdAkJCQkJCQkJICkgLypNYXggbnVtYmVyIG9mIHRyYW5zbWl0IGF0dGVtcHRzIGZvciBsb25nIGZyYW1lcwkJKi8KKyBYMSggQ0ZHX01BWF9UWF9MSUZFVElNRSwJCXRpbWUJCQkJCQkJCSApIC8qTWF4IHRyYW5zbWl0IGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCQkJCQkqLworIFgxKCBDRkdfTUFYX1JYX0xJRkVUSU1FLAkJdGltZQkJCQkJCQkJICkgLypNYXggcmVjZWl2ZWQgZnJhbWUgaGFuZGxpbmcgZHVyYXRpb24JCQkJCSovCisgWDEoIENGR19DRl9QT0xMQUJMRSwJCQljZl9wb2xsYWJsZQkJCQkJCQkgKSAvKltTVEFdIENvbnRlbnRpb24gRnJlZSBwb2xsYWJsZSBjYXBhYmlsaXR5IGluZGljYXRpb24JKi8KKyBYMiggQ0ZHX0FVVEhFTlRJQ0FUSU9OX0FMR09SSVRITVMsYXV0aGVudGljYXRpb25fdHlwZSwgdHlwZV9lbmFibGVkICkgLypBdXRoZW50aWNhdGlvbiBBbGdvcml0aG0JCQkJCQkJCSovCisgWDEoIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRCxwcml2YWN5X29wdF9pbXBsZW1lbnRlZAkJCSApIC8qV0VQIE9wdGlvbiBhdmFpbGFiaWxpdHkgaW5kaWNhdGlvbgkJCQkJCSovCisgWDEoIENGR19DVVJfUkVNT1RFX1JBVEVTLAkJcmF0ZXMJCQkJCQkJCSApIC8qQ3VycmVudFJlbW90ZVJhdGVzCQkJCQkJCQkJCSovCisgWDEoIENGR19DVVJfVVNFRF9SQVRFUywJCXJhdGVzCQkJCQkJCQkgKSAvKkN1cnJlbnRVc2VkUmF0ZXMJCQkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9TWVNURU1fU0NBTEUsCQljdXJyZW50X3N5c3RlbV9zY2FsZQkJCQkgKSAvKkN1cnJlbnRVc2VkUmF0ZXMJCQkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFMSwJCQlyYXRlIAkJCQkJCQkJICkgLypbQVBdIEFjdHVhbCBQb3J0IDEgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkqLworIFgxKCBDRkdfQ1VSX1RYX1JBVEUyLAkJCXJhdGUJCQkJCQkJCSApIC8qW0FQXSBBY3R1YWwgUG9ydCAyIHRyYW5zbWl0IGRhdGEgcmF0ZQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFMywJCQlyYXRlCQkJCQkJCQkgKSAvKltBUF0gQWN0dWFsIFBvcnQgMyB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCSovCisgWDEoIENGR19DVVJfVFhfUkFURTQsCQkJcmF0ZQkJCQkJCQkJICkgLypbQVBdIEFjdHVhbCBQb3J0IDQgdHJhbnNtaXQgZGF0YSByYXRlCQkJCQkqLworIFgxKCBDRkdfQ1VSX1RYX1JBVEU1LAkJCXJhdGUJCQkJCQkJCSApIC8qW0FQXSBBY3R1YWwgUG9ydCA1IHRyYW5zbWl0IGRhdGEgcmF0ZQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9UWF9SQVRFNiwJCQlyYXRlCQkJCQkJCQkgKSAvKltBUF0gQWN0dWFsIFBvcnQgNiB0cmFuc21pdCBkYXRhIHJhdGUJCQkJCSovCisgWDEoIENGR19PV05fTUFDX0FERFIsCQkJbWFjX2FkZHJbM10JCQkJCQkJICkgLypbQVBdIFVuaXF1ZSBsb2NhbCBub2RlIE1BQyBBZGRyZXNzCQkJCQkJKi8KKyBYMyggQ0ZHX1BDRl9JTkZPLAkJCQltZWRpdW1fb2NjdXBhbmN5X2xpbWl0LCAJCQkgXAorCQkgCQkJCQkJY2ZwX3BlcmlvZCwgY2ZwX21heF9kdXJhdGlvbiAJCSApIC8qW0FQXSBQb2ludCBDb29yZGluYXRpb24gRnVuY3Rpb24gY2FwYWJpbGl0eSBpbmZvCQkqLworIFgxKCBDRkdfQ1VSX1NTTl9JTkZPX0VMRU1FTlQsIHNzbl9pbmZvX2VsZW1lbnRbMV0JCQkJIAkgKSAvKiAgICAJCQkJCQkJCQkJCQkJKi8KKyBYNCggQ0ZHX0NVUl9US0lQX0lWX0lORk8sIAkJCQkJCQkJCQkJIFwKKwkJIHRraXBfc2VxX2NudDBbNF0sIHRraXBfc2VxX2NudDFbNF0sIAkJCQkJCSBcCisJCSB0a2lwX3NlcV9jbnQyWzRdLCB0a2lwX3NlcV9jbnQzWzRdICAJCQkJCQkgKSAvKiAgICAJCQkJCQkJCQkJCQkJKi8KKyBYMiggQ0ZHX0NVUl9BU1NPQ19SRVFfSU5GTywJZnJhbWVfdHlwZSwgZnJhbWVfYm9keVsxXQkJCSApIC8qCTB4RkQ4QwkJCQkJCQkJCQkJCSovCisgWDIoIENGR19DVVJfQVNTT0NfUkVTUF9JTkZPLAlmcmFtZV90eXBlLCBmcmFtZV9ib2R5WzFdCQkJICkgLyoJMHhGRDhECQkJCQkJCQkJCQkJKi8KKworCisvKglNb2RlbSBJTkZPUk1BVElPTiAqLworIFgxKCBDRkdfUEhZX1RZUEUsCQkJCXBoeV90eXBlIAkJCQkJCQkgKSAvKlBoeXNpY2FsIGxheWVyIHR5cGUgaW5kaWNhdGlvbgkJCQkJCQkqLworIFgxKCBDRkdfQ1VSX0NIQU5ORUwsCQkJY3VycmVudF9jaGFubmVsCQkJCQkJICkgLypBY3R1YWwgZnJlcXVlbmN5IGNoYW5uZWwgdXNlZCBmb3IgdHJhbnNtaXNzaW9uCQkJKi8KKyBYMSggQ0ZHX0NVUl9QT1dFUl9TVEFURSwJCWN1cnJlbnRfcG93ZXJfc3RhdGUJCQkJCSApIC8qQWN0dWFsIHBvd2VyIGNvbnN1bXB0aW9uIHN0YXR1cwkJCQkJCSovCisgWDEoIENGR19DQ0FNT0RFLAkJCQljY2FfbW9kZQkJCQkJCQkgKSAvKkNsZWFyIGNoYW5uZWwgYXNzZXNzbWVudCBtb2RlIGluZGljYXRpb24JCQkJKi8KKyBYMSggQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTLAlyYXRlc1s1XQkJCQkJCQkgKSAvKkRhdGEgcmF0ZXMgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbgkJCQkJCSovCisKKworLyogRlJBTUVTICovCitYWDEoIENGR19TQ0FOLAkJCQkJU0NBTl9SU19TVFJDVCwgc2Nhbl9yZXN1bHRbMzJdCQkgKSAvKlNjYW4gcmVzdWx0cwkJCQkJCQkJCQkJKi8KKworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVJTCBtYW5hZ2VtZW50IGZ1bmN0aW9uIHRvIGJlIHBhc3NlZCB0byBXYXZlTEFOL0lFRUUgRHJpdmVycyBpbiBEVUlfU1RSQ1QgZmllbGQgZnVuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEhDRiBhbmQgVUlMIENvbW1vbgorI2RlZmluZSBNRERfQUNUX1NDQU4JCQkweDA2CQkJCQkvLyBIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kCisjZGVmaW5lIE1ERF9BQ1RfUFJTX1NDQU4gCQkweDA3CQkJCQkvLyBIZXJtZXMgUHJvYmUgUmVzcG9uc2UgU2NhbiAoRjEwMikgY29tbWFuZAorCisvLyBVSUwgU3BlY2lmaWMKKyNkZWZpbmUgVUlMX0ZVTl9DT05ORUNUCQkJMHgwMAkJCQkJLy8gUGVyZm9ybSBjb25uZWN0IGNvbW1hbmQKKyNkZWZpbmUgVUlMX0ZVTl9ESVNDT05ORUNUCQkweDAxCQkJCQkvLyBQZXJmb3JtIGRpc2Nvbm5lY3QgY29tbWFuZAorI2RlZmluZSBVSUxfRlVOX0FDVElPTgkJCTB4MDIJCQkJCS8vIFBlcmZvcm0gVUlMIEFjdGlvbiBjb21tYW5kLgorI2RlZmluZSBVSUxfRlVOX1NFTkRfRElBR19NU0cJMHgwMwkJCQkJLy8gU2VuZCBhIGRpYWdub3N0aWMgbWVzc2FnZS4KKyNkZWZpbmUgVUlMX0ZVTl9HRVRfSU5GTwkJMHgwNAkJCQkJLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSBOSUMuCisjZGVmaW5lIFVJTF9GVU5fUFVUX0lORk8JCTB4MDUJCQkJCS8vIFB1dCBpbmZvcm1hdGlvbiBvbiBOSUMuCisKKy8qCVVJTF9BQ1RfVEFMTElFUwkJCQkweDA1CQkgCQkJKiB0aGlzIHNob3VsZCBub3QgYmUgZXhwb3J0ZWQgdG8gdGhlIFVTRgorCQkJCQkJCQkJCQkgCQkJKiBpdCBpcyBzb2xlbHkgaW50ZW5kZWQgYXMgYSBzdHJhdGVnaWMgY2hvaWNlIGZvciB0aGUgTVNGIHRvIGVpdGhlcgorCQkJCQkJCQkJCQkgCQkJKiAtIHVzZSBIQ0ZfQUNUX1RBTExJRVMgYW5kIGRpcmVjdCBJRkIgYWNjZXNzCisJCQkJCQkJCQkJCQkJCSogLSB1c2UgQ0ZHX1RBTExJRVMKKwkJCQkJCQkJCQkJCQkJKi8KKyNkZWZpbmUgVUlMX0FDVF9TQ0FOCQkJTUREX0FDVF9TQ0FOCisjZGVmaW5lIFVJTF9BQ1RfUFJTX1NDQU4gCQlNRERfQUNUX1BSU19TQ0FOCisjZGVmaW5lIFVJTF9BQ1RfQkxPQ0sJIAkJMHgwQgorI2RlZmluZSBVSUxfQUNUX1VOQkxPQ0sJIAkJMHgwQworI2RlZmluZSBVSUxfQUNUX1JFU0VUCSAJCTB4ODAKKyNkZWZpbmUgVUlMX0FDVF9SRUJJTkQJIAkJMHg4MQorI2RlZmluZSBVSUxfQUNUX0FQUExZCSAJCTB4ODIKKyNkZWZpbmUgVUlMX0FDVF9ESVNDT05ORUNUCQkweDgzCS8vOz8wNDAxMDggcG9zc2libHkgb2Jzb2xldGUJLy9TcGVjaWFsIGZvciBXSU5DRQorCisvLyBIQ0YgU3BlY2lmaWMKKy8qIE5vdGUgdGhhdCBVSUxfQUNULWNvZGVzIG11c3QgbWF0Y2ggSENGX0FDVC1jb2RlcyBhY3Jvc3MgYSBydW4tdGltZSBib3VuZCBJL0YKKyAqIFRoZSBpbml0aWFsIG1hdGNoaW5nIGlzIGFjaGlldmVkIGJ5ICIjZGVmaW5lIEhDRl9BQ1RfeHh4IEhDRl9VSUxfQUNUX3h4eCIgd2hlcmUgYXBwcm9wcmlhdGUKKyAqIEluIG90aGVyIHdvcmRzLCB0aGVzZSBjb2RlcyBzaG91bGQgbmV2ZXIsIGV2ZXIgY2hhbmdlIHRvIG1pbmltaXplIG1pZ3JhdGlvbiBwcm9ibGVtcyBiZXR3ZWVuCisgKiBjb21iaW5hdGlvbnMgb2Ygb2xkIGRyaXZlcnMgYW5kIG5ldyB1dGlsaXRpZXMgYW5kIHZpY2UgdmVyc2EKKyAqLworI2RlZmluZSBIQ0ZfRElTQ09OTkVDVAkJCTB4MDEJCQkJCS8vZGlzY29ubmVjdCByZXF1ZXN0IGZvciBoY2ZfY29ubmVjdCAoaW52YWxpZCBhcyBJTyBBZGRyZXNzKQorI2RlZmluZSBIQ0ZfQUNUX1RBTExJRVMgCQkweDA1CQkJCQkvLyAhIFVJTF9BQ1RfVEFMTElFUyBkb2VzIG5vdCBleGlzdCAhIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApIGNtZAorI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAgKSA9PSAwCisjZGVmaW5lIEhDRl9BQ1RfU0NBTgkJCU1ERF9BQ1RfU0NBTgorI2VuZGlmIC8vIEhDRl9UWVBFX1dBUlAKKyNkZWZpbmUgSENGX0FDVF9QUlNfU0NBTgkJTUREX0FDVF9QUlNfU0NBTgorI2lmIEhDRl9JTlRfT04KKyNkZWZpbmUgSENGX0FDVF9JTlRfT0ZGIAkJMHgwRAkJCQkJLy8gRGlzYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorI2RlZmluZSBIQ0ZfQUNUX0lOVF9PTgkJCTB4MEUJCQkJCS8vIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorI2RlZmluZSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTgkweDBGCQkJCQkvLyBFbmZvcmNlIEVuYWJsZSBJbnRlcnJ1cHQgZ2VuZXJhdGlvbgorI2VuZGlmIC8vIEhDRl9JTlRfT04KKyNkZWZpbmUgSENGX0FDVF9SWF9BQ0sJCQkweDE1CQkJCQkvLyBSZWNlaWV2ZXIgQUNLIChvcHRpbWl6YXRpb24pCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAorI2RlZmluZSBIQ0ZfQUNUX0NDWF9PTgkJCTB4MUEJCQkJCS8vIGVuYWJsZSBDS0lQCisjZGVmaW5lIEhDRl9BQ1RfQ0NYX09GRgkJCTB4MUIJCQkJCS8vIGRpc2FibGUgQ0tJUAorI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUworI2RlZmluZSBIQ0ZfQUNUX1NMRUVQCQkJMHgxQwkJCQkJLy8gRERTIFNsZWVwIHJlcXVlc3QKKy8vI2RlZmluZSBIQ0ZfQUNUX1dBS0VVUAkJMHgxRAkJCQkJLy8gRERTIFdha2V1cCByZXF1ZXN0CisjZW5kaWYgLy8gSENGX0REUworCisvKglIQ0ZfQUNUX01BWAkJCQkJCQkvLyB4eHh4OiBzdGFydCB2YWx1ZSBmb3IgVUlMLXJhbmdlLCBOT1QgdG8gYmUgcGFzc2VkIHRvIEhDRgorICoJCQkJCQkJCQkJVG9vIGJhZCwgdGhlcmUgd2FzIG9yaWdpbmFsbHkgbm8gc3BhcmUgcm9vbSBjcmVhdGVkIHRvIHVzZQorICoJCQkJCQkJCQkJSENGX0FDVF9NQVggYXMgYW4gZXF1aXZhbGVudCBvZiBIQ0ZfRVJSX01BWC4gU2luY2UgY3JlYXRpbmcKKyAqCQkJCQkJCQkJCXRoaXMgcm9vbSBpbiByZXRyb3NwZWN0IHdvdWxkIGNyZWF0ZSBhIGJhY2t3YXJkIGluY29tcGF0aWJpbGl0eQorICoJCQkJCQkJCQkJd2Ugd2lsbCBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRoIHRoZSBoYXBoYXphcmQgc2VxdWVuY2Ugb2YKKyAqCQkJCQkJCQkJCVVJTC0gYW5kIEhDRiBzcGVjaWZpYyBjb2Rlcy4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlCisgKgkJCQkJCQkJCQljb3JyZWN0ZWQgd2hlbiBhbmQgaWYgdGhlcmUgd2lsbCBldmVyIGJlIGFuIG92ZXJhbGwKKyAqCQkJCQkJCQkJCWluY29tcGF0aWJpbGl0eSBpbnRyb2R1Y2VkIGZvciBhbm90aGVyIHJlYXNvbgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIRVJNRVMgUkVDT1JEUwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgQ0ZHX1JJRF9GV19NSU4JCQkJCQkJMHhGQTAwCS8vbG93ZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhIEhlcm1lcy1JSSBiYXNlZCBSSUQKKy8vICNkZWZpbmUgQ0ZHX1BEQV9CRUdJTgkJCQkJCTB4RkEJLy8KKy8vICNkZWZpbmUgQ0ZHX1BEQV9FTkQJCQkJCQkJMHhGQQkvLworLy8gI2RlZmluZSBDRkdfUERBX05JQ19UT1BfTFZMX0FTU0VNQkxZX05VTUJFUgkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfUENCX1RSQUNFUl9OVU1CRVIJCQkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfUk1NX1RSQUNFUl9OVU1CRVIJCQkweEZBCS8vCisvLyAjZGVmaW5lIENGR19QREFfUk1NX0NPTVBfSUQJCQkJCTB4RkEJLy8KKy8vICNkZWZpbmUgQ0ZHX1BEQV8JCQkJCQkJCTB4RkEJLy8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPTkZJR1VSQVRJT04gUkVDT1JEUwk9PT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IG1hc2sgMHhGQ3h4CQkJCT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19SSURfQ0ZHX01JTgkJCQkJMHhGQzAwCQkvL2xvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYSBIZXJtZXMgY29uZmlndXJhdGlvbiAgUklECisKKy8vCU5FVFdPUksgUEFSQU1FVEVSUywgU1RBVElDIENPTkZJR1VSQVRJT04gRU5USVRJRVMKKy8vRkMwNSwgRkMwQiwgRkMwQywgRkMwRDogU0VFIFcyRE4xNDkKKworI2RlZmluZSBDRkdfQ05GX1BPUlRfVFlQRQkJCQkweEZDMDAJCS8vW1NUQV0gQ29ubmVjdGlvbiBjb250cm9sIGNoYXJhY3RlcmlzdGljcworI2RlZmluZSBDRkdfQ05GX09XTl9NQUNfQUREUgkJCTB4RkMwMQkJLy9bU1RBXSBNQUMgQWRkcmVzcyBvZiB0aGlzIG5vZGUKKy8vCQkJCQkJCQkJCTB4RkMwMgkJc2VlIERZTkFNSUMgQ09ORklHVVJBVElPTiBFTlRJVElFUworI2RlZmluZSBDRkdfQ05GX09XTl9DSEFOTkVMCQkJCTB4RkMwMwkJLy9Db21tdW5pY2F0aW9uIGNoYW5uZWwgZm9yIEJTUyBjcmVhdGlvbgorI2RlZmluZSBDRkdfQ05GX09XTl9TU0lECQkJCTB4RkMwNAkJLy9JQlNTIGNyZWF0aW9uIChTVEEpIG9yIEVTUyAoQVApIFNlcnZpY2UgU2V0IElkZW50CisjZGVmaW5lIENGR19DTkZfT1dOX0FUSU1fV0lORE9XCQkJMHhGQzA1CQkvL1tTVEFdIEFUSU0gV2luZG93IHRpbWUgZm9yIElCU1MgY3JlYXRpb24KKyNkZWZpbmUgQ0ZHX0NORl9TWVNURU1fU0NBTEUJCQkweEZDMDYJCS8vU3lzdGVtIFNjYWxlIHRoYXQgc3BlY2lmaWVzIHRoZSBBUCBkZW5zaXR5CisjZGVmaW5lIENGR19DTkZfTUFYX0RBVEFfTEVOCQkJMHhGQzA3CQkvL01heGltdW0gbGVuZ3RoIG9mIE1BQyBGcmFtZSBCb2R5IGRhdGEKKyNkZWZpbmUgQ0ZHX0NORl9QTV9FTkFCTEVECQkJCTB4RkMwOQkJLy9bU1RBXSBTd2l0Y2ggZm9yIEVTUyBQb3dlciBNYW5hZ2VtZW50IChQTSkKKyNkZWZpbmUgQ0ZHX0NORl9NQ0FTVF9SWAkJCQkweEZDMEIJCS8vW1NUQV0gU3dpdGNoIGZvciBFU1MgUE0gTXVsdGljYXN0IHJlY2VwdGlvbiBPbi9PZmYKKyNkZWZpbmUgQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT04JCTB4RkMwQwkJLy9bU1RBXSBNYXhpbXVtIHNsZWVwIHRpbWUgZm9yIEVTUyBQTQorI2RlZmluZSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OCQkweEZDMEQJCS8vW1NUQV0gSG9sZG92ZXIgdGltZSBmb3IgRVNTIFBNCisjZGVmaW5lIENGR19DTkZfT1dOX05BTUUJCQkJMHhGQzBFCQkvL0lkZW50aWZpY2F0aW9uIHRleHQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMKKworI2RlZmluZSBDRkdfQ05GX09XTl9EVElNX1BFUklPRAkJCTB4RkMxMAkJLy9bQVBdIEJlYWNvbiBpbnRlcnZhbHMgYmV0d2VlbiBzdWNjZXNzaXZlIERUSU1zCisjZGVmaW5lIENGR19DTkZfV0RTX0FERFIxCQkJCTB4RkMxMQkJLy9bQVBdIFBvcnQgMSBNQUMgQWRycyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUKKyNkZWZpbmUgQ0ZHX0NORl9XRFNfQUREUjIJCQkJMHhGQzEyCQkvL1tBUF0gUG9ydCAyIE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQorI2RlZmluZSBDRkdfQ05GX1dEU19BRERSMwkJCQkweEZDMTMJCS8vW0FQXSBQb3J0IDMgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCisjZGVmaW5lIENGR19DTkZfV0RTX0FERFI0CQkJCTB4RkMxNAkJLy9bQVBdIFBvcnQgNCBNQUMgQWRycyBvZiBjb3JyZXNwb25kaW5nIFdEUyBMaW5rIG5vZGUKKyNkZWZpbmUgQ0ZHX0NORl9XRFNfQUREUjUJCQkJMHhGQzE1CQkvL1tBUF0gUG9ydCA1IE1BQyBBZHJzIG9mIGNvcnJlc3BvbmRpbmcgV0RTIExpbmsgbm9kZQorI2RlZmluZSBDRkdfQ05GX1dEU19BRERSNgkJCQkweEZDMTYJCS8vW0FQXSBQb3J0IDYgTUFDIEFkcnMgb2YgY29ycmVzcG9uZGluZyBXRFMgTGluayBub2RlCisjZGVmaW5lIENGR19DTkZfUE1fTUNBU1RfQlVGCQkJMHhGQzE3CQkvL1tBUF0gU3dpdGNoIGZvciBQTSBidWZmZXJlaW5nIG9mIE11bHRpY2FzdCBNZXNzYWdlcworI2RlZmluZSBDRkdfQ05GX01DQVNUX1BNX0JVRgkJCUNGR19DTkZfUE1fTUNBU1RfQlVGCS8vbmFtZSBkb2VzIG5vdCBtYXRjaCBILUlJIHNwZWMKKyNkZWZpbmUgQ0ZHX0NORl9SRUpFQ1RfQU5ZCQkJCTB4RkMxOAkJLy9bQVBdIFN3aXRjaCBmb3IgUE0gYnVmZmVyZWluZyBvZiBNdWx0aWNhc3QgTWVzc2FnZXMKKworI2RlZmluZSBDRkdfQ05GX0VOQ1JZUFRJT04JCQkJMHhGQzIwCQkvL3NlbGVjdCBlbi9kZS1jcnlwdGlvbiBvZiBUeC9SeCBtZXNzYWdlcworI2RlZmluZSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OCQkJMHhGQzIxCQkvL1tTVEFdIHNlbGVjdHMgQXV0aGVudGljYXRpb24gYWxnb3JpdGhtCisjZGVmaW5lIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRAkJMHhGQzIyCQkvL1tBUF0gU3dpdGNoIGZvciAnY2xlYXItdGV4dCcgcnggbWVzc2FnZSBhY2NlcHRhbmNlCisjZGVmaW5lIENGR19DTkZfTUNBU1RfUkFURQkJCQkweEZDMjMJCS8vVHJhbnNtaXQgRGF0YSByYXRlIGZvciBNdWx0aWNhc3QgZnJhbWVzCisjZGVmaW5lIENGR19DTkZfSU5UUkFfQlNTX1JFTEFZCQkJMHhGQzI0CQkvL1tBUF0gU3dpdGNoIGZvciBJbnRyYUJCUyByZWxheQorI2RlZmluZSBDRkdfQ05GX01JQ1JPX1dBVkUJCQkJMHhGQzI1CQkvL01pY3JvV2F2ZSAoUm9idXN0bmVzcykKKyNkZWZpbmUgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORwkJIAkweEZDMjYJCS8vTG9hZCBCYWxhbmNpbmcJCSAoQm9vbGVhbiwgMD1PRkYsIDE9T04sIGRlZmF1bHQ9MSkKKyNkZWZpbmUgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OCSAJMHhGQzI3CQkvL01lZGl1bSBEaXN0cmlidXRpb24JIChCb29sZWFuLCAwPU9GRiwgMT1PTiwgZGVmYXVsdD0xKQorI2RlZmluZSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSCQkweEZDMjgJCS8vW1NUQV0gR3JvdXAgQWRkcmVzcyBGaWx0ZXIKKyNkZWZpbmUgQ0ZHX0NORl9DT1VOVFJZX0lORk8JCQkweEZDMjkJCS8vQ291bnRyeSBJbmZvCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyNkZWZpbmUgQ0ZHX0NORl9UWF9QT1dfTFZMCQkJCTB4RkMyQQkJLy9UeFBvd2VyIExldmVsCisjZGVmaW5lIENGR19DTkZfQ09OTkVDVElPTl9DTlRMCQkJMHhGQzMwCQkvL1tTVEFdIENvbm5lY3Rpb24gQ29udHJvbAorI2RlZmluZSBDRkdfQ05GX09XTl9CRUFDT05fSU5URVJWQUwJCTB4RkMzMQkJLy9bQVBdCisjZGVmaW5lIENGR19DTkZfU0hPUlRfUkVUUllfTElNSVQJCTB4RkMzMgkJLy8KKyNkZWZpbmUgQ0ZHX0NORl9MT05HX1JFVFJZX0xJTUlUCQkweEZDMzMJCS8vCisjZGVmaW5lIENGR19DTkZfVFhfRVZFTlRfTU9ERQkJCTB4RkMzNAkJLy8KKyNkZWZpbmUgQ0ZHX0NORl9XSUZJX0NPTVBBVElCTEUJCQkweEZDMzUJCS8vW1NUQV0gV2lmaSBjb21wYXRpYmxlCisjZW5kaWYgLy8gSENGX1RZUEVfV0FSUAorI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9CRUFHTEVfSElJNQorI2RlZmluZSBDRkdfVk9JQ0VfUkVUUllfTElNSVQJCQkweEZDMzYJCS8qIFZvaWNlIGZyYW1lIHJldHJ5IGxpbWl0LiBSYW5nZTogMS0xNSwgZGVmYXVsdDogNCAqLworI2RlZmluZSBDRkdfVk9JQ0VfQ09OVEVOVElPTl9XSU5ET1cJCTB4RkMzNwkJLyogQ29udGVudGlvbiB3aW5kb3cgZm9yIHZvaWNlIGZyYW1lcy4gKi8KKyNlbmRpZgkvLyBCRUFHTEVfSElJNQorCisvLwlORVRXT1JLIFBBUkFNRVRFUlMsIERZTkFNSUMgQ09ORklHVVJBVElPTiBFTlRJVElFUworI2RlZmluZSBDRkdfREVTSVJFRF9TU0lECQkJCTB4RkMwMgkJLy9bU1RBXSBTZXJ2aWNlIFNldCBpZGVudGlmaWNhdGlvbiBmb3IgY29ubmVjdGlvbiBhbmQgc2NhbgorCisjZGVmaW5lIENGR19HUk9VUF9BRERSCQkJCQkweEZDODAJCS8vW1NUQV0gTXVsdGljYXN0IE1BQyBBZGRyZXNzZXMgZm9yIFJ4LW1lc3NhZ2UKKyNkZWZpbmUgQ0ZHX0NSRUFURV9JQlNTCQkJCQkweEZDODEJCS8vW1NUQV0gU3dpdGNoIGZvciBJQlNTIGNyZWF0aW9uIE9uL09mZgorI2RlZmluZSBDRkdfUlRTX1RIUkgJCQkJCTB4RkM4MwkJLy9GcmFtZSBsZW5ndGggdXNlZCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1RYX1JBVEVfQ05UTAkJCQkweEZDODQJCS8vW1NUQV0gRGF0YSByYXRlIGNvbnRyb2wgZm9yIG1lc3NhZ2UgdHJhbnNtaXNzaW9uCisjZGVmaW5lIENGR19QUk9NSVNDVU9VU19NT0RFCQkJMHhGQzg1CQkvL1tTVEFdIFN3aXRjaCBmb3IgUHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24gT24vT2ZmCisjZGVmaW5lIENGR19XT0wJCQkJCQkJMHhGQzg2CQkvL1tTVEFdIFN3aXRjaCBmb3IgV2FrZS1Pbi1MQU4gbW9kZQorI2RlZmluZSBDRkdfV09MX1BBVFRFUk5TCQkJCTB4RkM4NwkJLy9bU1RBXSBQYXR0ZXJucyBmb3IgV2FrZS1Pbi1MQU4KKyNkZWZpbmUgQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMCQkweEZDODgJCS8vCisjZGVmaW5lIENGR19CQVNJQ19SQVRFX1NFVF9DTlRMCQkJMHhGQzg5CQkvLworCisjZGVmaW5lIENGR19TT0ZUV0FSRV9BQ0tfTU9ERQkJCTB4RkM5MAkJLy8KKyNkZWZpbmUgQ0ZHX1JUU19USFJIMAkJCQkJMHhGQzk3CQkvL1tBUF0gUG9ydCAwIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJIMQkJCQkJMHhGQzk4CQkvL1tBUF0gUG9ydCAxIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJIMgkJCQkJMHhGQzk5CQkvL1tBUF0gUG9ydCAyIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJIMwkJCQkJMHhGQzlBCQkvL1tBUF0gUG9ydCAzIGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJINAkJCQkJMHhGQzlCCQkvL1tBUF0gUG9ydCA0IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJINQkJCQkJMHhGQzlDCQkvL1tBUF0gUG9ydCA1IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKyNkZWZpbmUgQ0ZHX1JUU19USFJINgkJCQkJMHhGQzlECQkvL1tBUF0gUG9ydCA2IGZyYW1lIGxlbmd0aCBmb3IgUlRTL0NUUyBoYW5kc2hha2UKKworI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMAkJCQkweEZDOUUJCS8vW0FQXSBQb3J0IDAgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMQkJCQkweEZDOUYJCS8vW0FQXSBQb3J0IDEgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMgkJCQkweEZDQTAJCS8vW0FQXSBQb3J0IDIgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMMwkJCQkweEZDQTEJCS8vW0FQXSBQb3J0IDMgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMNAkJCQkweEZDQTIJCS8vW0FQXSBQb3J0IDQgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMNQkJCQkweEZDQTMJCS8vW0FQXSBQb3J0IDUgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfVFhfUkFURV9DTlRMNgkJCQkweEZDQTQJCS8vW0FQXSBQb3J0IDYgZGF0YSByYXRlIGNvbnRyb2wgZm9yIHRyYW5zbWlzc2lvbgorCisjZGVmaW5lIENGR19ERUZBVUxUX0tFWVMJCQkJMHhGQ0IwCQkvL2RlZmluZXMgc2V0IG9mIGVuY3J5cHRpb24ga2V5cworI2RlZmluZSBDRkdfVFhfS0VZX0lECQkJCQkweEZDQjEJCS8vc2VsZWN0IGtleSBmb3IgZW5jcnlwdGlvbiBvZiBUeCBtZXNzYWdlcworI2RlZmluZSBDRkdfU0NBTl9TU0lECQkJCQkweEZDQjIJCS8vU2NhbiBTU0lECisjZGVmaW5lIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWQkJMHhGQ0I0CQkvL3NldCBLZXlJRCBhbmQgVHhLZXkgaW5kaWNhdGlvbgorI2RlZmluZSAJS0VZX0lECQkJCQkJCTB4MDAwMwkJLy9LZXlJRCBtYXNrIGZvciB0a2lwX2tleV9pZF9pbmZvIGZpZWxkCisjZGVmaW5lIAlUWF9LRVkJCQkJCQkJMHg4MDAwCQkvL0RlZmF1bHQgVHggS2V5IGZsYWcgb2YgdGtpcF9rZXlfaWRfaW5mbyBmaWVsZAorI2RlZmluZSBDRkdfU0VUX1dQQV9BVVRIX0tFWV9NR01UX1NVSVRFCTB4RkNCNQkJLy9BdXRoZW50aWNhdGVkIEtleSBNYW5hZ2VtZW50IFN1aXRlCisjZGVmaW5lIENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWQkJMHhGQ0I2CQkvL2ludmFsaWRhdGUgS2V5SUQgYW5kIFR4S2V5IGluZGljYXRpb24KKyNkZWZpbmUgQ0ZHX0FERF9US0lQX01BUFBFRF9LRVkJCQkweEZDQjcJCS8vc2V0IE1BQyBhZGRyZXNzIHBhaXJ3aXNlIHN0YXRpb24KKyNkZWZpbmUgQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkJCTB4RkNCOAkJLy9pbnZhbGlkYXRlIE1BQyBhZGRyZXNzIHBhaXJ3aXNlIHN0YXRpb24KKyNkZWZpbmUgQ0ZHX1NFVF9XUEFfQ0FQQUJJTElUSUVTX0lORk8JMHhGQ0I5CQkvL1dQQSBDYXBhYmlsaXRpZXMKKyNkZWZpbmUgQ0ZHX0NBQ0hFRF9QTUtfQUREUgkJCQkweEZDQkEJCS8vc2V0IE1BQyBhZGRyZXNzIG9mIHByZS1hdXRoZW50aWNhdGVkIEFQCisjZGVmaW5lIENGR19SRU1PVkVfQ0FDSEVEX1BNS19BRERSCQkweEZDQkIJCS8vaW52YWxpZGF0ZSBNQUMgYWRkcmVzcyBvZiBwcmUtYXV0aGVudGljYXRlZCBBUAorI2RlZmluZSBDRkdfRkNCQwkweEZDQkMJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworI2RlZmluZSBDRkdfRkNCRAkweEZDQkQJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworI2RlZmluZSBDRkdfRkNCRQkweEZDQkUJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworI2RlZmluZSBDRkdfRkNCRgkweEZDQkYJLy9GVyBjb2RlcyBhaGVhZCBvZiBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgc28gPz8/Pz8/PworCisjZGVmaW5lIENGR19IQU5ET1ZFUl9BRERSCQkJCTB4RkNDMAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkcnJlc3MgcmUtYXNzb2NpYXRlZCB3aXRoIG90aGVyIEFQCisjZGVmaW5lIENGR19TQ0FOX0NIQU5ORUwJCQkJMHhGQ0MyCQkvL0NoYW5uZWwgc2V0IGZvciBob3N0IHJlcXVlc3RlZCBzY2FuCisvLzs/I2RlZmluZSBDRkdfU0NBTl9DSEFOTkVMX01BU0sJCQkweEZDQzIJCS8vIGNvbnRhaW5zCisjZGVmaW5lIENGR19ESVNBU1NPQ0lBVEVfQUREUgkJCTB4RkNDNAkJLy9bQVBdIFN0YXRpb24gTUFDIEFkcnJlc3MgdG8gYmUgZGlzYXNzb2NpYXRlZAorI2RlZmluZSBDRkdfUFJPQkVfREFUQV9SQVRFCQkJCTB4RkNDNQkJLy9XQVJQIGNvbm5lY3Rpb24gY29udHJvbAorI2RlZmluZSBDRkdfRlJBTUVfQlVSU1RfTElNSVQJCQkweEZDQzYJCS8vCisjZGVmaW5lIENGR19DT0VYSVNURU5TRV9CRUhBVklPVVIJCTB4RkNDNwkJLy9bQVBdCisjZGVmaW5lIENGR19ERUFVVEhFTlRJQ0FURV9BRERSCQkJMHhGQ0M4CQkvL01BQyBhZGRyZXNzIG9mIFN0YXRpb24gdG8gYmUgZGVhdXRoZW50aWNhdGVkCisKKy8vCUJFSEFWSU9SIFBBUkFNRVRFUlMKKyNkZWZpbmUgQ0ZHX1RJQ0tfVElNRQkJCQkJMHhGQ0UwCQkvL0F1eGlsaWFyeSBUaW1lciB0aWNrIGludGVydmFsCisjZGVmaW5lIENGR19ERFNfVElDS19USU1FCQkJCTB4RkNFMQkJLy9EaXNjb25uZWN0ZWQgRGVlcFNsZWVwIFRpbWVyIHRpY2sgaW50ZXJ2YWwKKy8vI2RlZmluZSBDRkdfQ05GX0NPVU5UUlkJCQkJCTB4RkNGRQlhcHBhcmVudGx5IG5vdCBuZWVkZWQgOz8KKyNkZWZpbmUgQ0ZHX1JJRF9DRkdfTUFYCQkJCQkweEZDRkYJCS8vaGlnaGVzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gQ29uZmlndXJhdGlvbiBSSUQKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5GT1JNQVRJT04gUkVDT1JEUyAJPT09PT09PT09PT09PT09PT09PT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBtYXNrIDB4RkR4eAkJCQk9PT09PT09PT09PT09PT09PT09PT0qLworLy8JTklDIElORk9STUFUSU9OCisjZGVmaW5lIENGR19SSURfSU5GX01JTgkJCQkJMHhGRDAwCS8vbG93ZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhbiBJbmZvcm1hdGlvbiBSSUQKKyNkZWZpbmUgQ0ZHX01BWF9MT0FEX1RJTUUJCQkJMHhGRDAwCS8vW0lOVF0gTWF4aW11bSByZXNwb25zZSB0aW1lIG9mIHRoZSBEb3dubG9hZCBjb21tYW5kLgorI2RlZmluZSBDRkdfRExfQlVGCQkJCQkJMHhGRDAxCS8vW0lOVF0gRG93bmxvYWQgYnVmZmVyIGxvY2F0aW9uIGFuZCBzaXplLgorI2RlZmluZSBDRkdfUFJJX0lERU5USVRZCQkJCTB4RkQwMgkvL1tQUkldIFByaW1hcnkgRnVuY3Rpb25zIGZpcm13YXJlIGlkZW50aWZpY2F0aW9uLgorI2RlZmluZSBDRkdfUFJJX1NVUF9SQU5HRQkJCQkweEZEMDMJLy9bUFJJXSBQcmltYXJ5IEZ1bmN0aW9ucyBJL0YgU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZS4KKyNkZWZpbmUgQ0ZHX05JQ19IU0lfU1VQX1JBTkdFCQkJMHhGRDA5CS8vSC9XIC0gUy9XIEkvRiBzdXBwbGllciByYW5nZQorI2RlZmluZSBDRkdfTklDX1NFUklBTF9OVU1CRVIJCQkweEZEMEEJLy9bUFJJXSBOZXR3b3JrIEludGVyZmFjZSBDYXJkIHNlcmlhbCBudW1iZXIuCisjZGVmaW5lIENGR19OSUNfSURFTlRJVFkJCQkJMHhGRDBCCS8vW1BSSV0gTmV0d29yayBJbnRlcmZhY2UgQ2FyZCBpZGVudGlmaWNhdGlvbi4KKyNkZWZpbmUgQ0ZHX05JQ19NRklfU1VQX1JBTkdFCQkJMHhGRDBDCS8vW1BSSV0gTW9kZW0gSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19OSUNfQ0ZJX1NVUF9SQU5HRQkJCTB4RkQwRAkvL1tQUkldIENvbnRyb2xsZXIgSS9GIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19DSEFOTkVMX0xJU1QJCQkJMHhGRDEwCS8vQWxsb3dlZCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzLgorI2RlZmluZSBDRkdfTklDX1RFTVBfVFlQRSAgCQkJCTB4RkQxMgkvL0hhcmR3YXJlIHRlbXBlcmF0dXJlIHJhbmdlIGNvZGUuCisjZGVmaW5lIENGR19DSVMJCQkJCQkJMHhGRDEzCS8vUEMgQ2FyZCBTdGFuZGFyZCBDYXJkIEluZm9ybWF0aW9uIFN0cnVjdHVyZQorI2RlZmluZSBDRkdfTklDX1BST0ZJTEUJCQkJCTB4RkQxNAkvL0NhcmQgUHJvZmlsZQorI2RlZmluZSBDRkdfRldfSURFTlRJVFkJCQkJCTB4RkQyMAkvL2Zpcm13YXJlIGlkZW50aWZpY2F0aW9uLgorI2RlZmluZSBDRkdfRldfU1VQX1JBTkdFCQkJCTB4RkQyMQkvL2Zpcm13YXJlIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2UuCisjZGVmaW5lIENGR19NRklfQUNUX1JBTkdFU19TVEEJCQkweEZEMjIJLy9bU1RBXSBNb2RlbSBJL0YgQWN0b3IgY29tcGF0aWJpbGl0eSByYW5nZXMuCisjZGVmaW5lIENGR19DRklfQUNUX1JBTkdFU19TVEEJCQkweEZEMjMJLy9bU1RBXSBDb250cm9sbGVyIEkvRiBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcy4KKyNkZWZpbmUgQ0ZHX05JQ19CVVNfVFlQRQkJCQkweEZEMjQJLy9DYXJkIEJ1c3R5cGUKKyNkZWZpbmUgCUNGR19OSUNfQlVTX1RZUEVfUENDQVJEX0NGCQkweDAwMDAJLy8xNiBiaXQgUEMgQ2FyZCBvciBDb21wYWN0IEZsYXNoCisjZGVmaW5lIAlDRkdfTklDX0JVU19UWVBFX1VTQgkJCTB4MDAwMQkvL1VTQgorI2RlZmluZSAJQ0ZHX05JQ19CVVNfVFlQRV9DQVJEQlVTCQkweDAwMDIJLy9DYXJkQnVzCisjZGVmaW5lIAlDRkdfTklDX0JVU19UWVBFX1BDSQkJCTB4MDAwMwkvLyhtaW5pKVBDSQorI2RlZmluZSBDRkdfRE9NQUlOX0NPREUJCQkJCQkweEZEMjUKKworLy8JTUFDIElORk9STUFUSU9OCisjZGVmaW5lIENGR19QT1JUX1NUQVQJCQkJCTB4RkQ0MAkvL0FjdHVhbCBNQUMgUG9ydCBjb25uZWN0aW9uIGNvbnRyb2wgc3RhdHVzCisjZGVmaW5lIENGR19DVVJfU1NJRAkJCQkJMHhGRDQxCS8vW1NUQV0gSWRlbnRpZmljYXRpb24gb2YgdGhlIGFjdHVhbGx5IGNvbm5lY3RlZCBTUworI2RlZmluZSBDRkdfQ1VSX0JTU0lECQkJCQkweEZENDIJLy9bU1RBXSBJZGVudGlmaWNhdGlvbiBvZiB0aGUgYWN0dWFsbHkgY29ubmVjdGVkIEJTUworI2RlZmluZSBDRkdfQ09NTVNfUVVBTElUWQkJCQkweEZENDMJLy9bU1RBXSBRdWFsaXR5IG9mIHRoZSBCYXNpYyBTZXJ2aWNlIFNldCBjb25uZWN0aW9uCisjZGVmaW5lIENGR19DVVJfVFhfUkFURQkJCQkJMHhGRDQ0CS8vW1NUQV0gQWN0dWFsIHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTAkJCTB4RkQ0NQkvL0JlYWNvbiB0cmFuc21pdCBpbnRlcnZhbCB0aW1lIGZvciBCU1MgY3JlYXRpb24KKyNkZWZpbmUgQ0ZHX0NVUl9TQ0FMRV9USFJICQkJCTB4RkQ0NgkvL0FjdHVhbCBTeXN0ZW0gU2NhbGUgdGhyZXNob2xkcyBzZXR0aW5ncworI2RlZmluZSBDRkdfUFJPVE9DT0xfUlNQX1RJTUUJCQkweEZENDcJLy9NYXggdGltZSB0byBhd2FpdCBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCBtZXNzYWdlCisjZGVmaW5lIENGR19DVVJfU0hPUlRfUkVUUllfTElNSVQJCTB4RkQ0OAkvL01heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgZm9yIHNob3J0IGZyYW1lcworI2RlZmluZSBDRkdfQ1VSX0xPTkdfUkVUUllfTElNSVQJCTB4RkQ0OQkvL01heCBudW1iZXIgb2YgdHJhbnNtaXQgYXR0ZW1wdHMgZm9yIGxvbmcgZnJhbWVzCisjZGVmaW5lIENGR19NQVhfVFhfTElGRVRJTUUJCQkJMHhGRDRBCS8vTWF4IHRyYW5zbWl0IGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCisjZGVmaW5lIENGR19NQVhfUlhfTElGRVRJTUUJCQkJMHhGRDRCCS8vTWF4IHJlY2VpdmVkIGZyYW1lIGhhbmRsaW5nIGR1cmF0aW9uCisjZGVmaW5lIENGR19DRl9QT0xMQUJMRQkJCQkJMHhGRDRDCS8vW1NUQV0gQ29udGVudGlvbiBGcmVlIHBvbGxhYmxlIGNhcGFiaWxpdHkgaW5kaWNhdGlvbgorI2RlZmluZSBDRkdfQVVUSEVOVElDQVRJT05fQUxHT1JJVEhNUwkweEZENEQJLy9BdmFpbGFibGUgQXV0aGVudGljYXRpb24gQWxnb3JpdGhtcyBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRAkJMHhGRDRGCS8vV0VQIE9wdGlvbiBhdmFpbGFiaWxpdHkgaW5kaWNhdGlvbgorCisjZGVmaW5lIENGR19DVVJfUkVNT1RFX1JBVEVTCQkJMHhGRDUwCS8vW1NUQV0gQ3VycmVudFJlbW90ZVJhdGVzCisjZGVmaW5lIENGR19DVVJfVVNFRF9SQVRFUwkJCQkweEZENTEJLy9bU1RBXSBDdXJyZW50VXNlZFJhdGVzCisjZGVmaW5lIENGR19DVVJfU1lTVEVNX1NDQUxFCQkJMHhGRDUyCS8vW1NUQV0gQ3VycmVudFN5c3RlbVNjYWxlCisKKyNkZWZpbmUgQ0ZHX0NVUl9UWF9SQVRFMQkJCQkweEZEODAJLy9bQVBdIEFjdHVhbCBQb3J0IDEgdHJhbnNtaXQgZGF0YSByYXRlCisjZGVmaW5lIENGR19DVVJfVFhfUkFURTIJCQkJMHhGRDgxCS8vW0FQXSBBY3R1YWwgUG9ydCAyIHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEUzCQkJCTB4RkQ4MgkvL1tBUF0gQWN0dWFsIFBvcnQgMyB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX0NVUl9UWF9SQVRFNAkJCQkweEZEODMJLy9bQVBdIEFjdHVhbCBQb3J0IDQgdHJhbnNtaXQgZGF0YSByYXRlCisjZGVmaW5lIENGR19DVVJfVFhfUkFURTUJCQkJMHhGRDg0CS8vW0FQXSBBY3R1YWwgUG9ydCA1IHRyYW5zbWl0IGRhdGEgcmF0ZQorI2RlZmluZSBDRkdfQ1VSX1RYX1JBVEU2CQkJCTB4RkQ4NQkvL1tBUF0gQWN0dWFsIFBvcnQgNiB0cmFuc21pdCBkYXRhIHJhdGUKKyNkZWZpbmUgQ0ZHX05JQ19NQUNfQUREUgkJCQkweEZEODYJLy9VbmlxdWUgbG9jYWwgbm9kZSBNQUMgQWRkcmVzcworI2RlZmluZSBDRkdfUENGX0lORk8JCQkJCTB4RkQ4NwkvL1tBUF0gUG9pbnQgQ29vcmRpbmF0aW9uIEZ1bmN0aW9uIGNhcGFiaWxpdHkgaW5mbworLy8qUkVTRVJWRUQqICNkZWZpbmUgQ0ZHX0hJR0hFU1RfQkFTSUNfUkFURQkJCTB4RkQ4OAkvLworI2RlZmluZSBDRkdfQ1VSX0NPVU5UUllfSU5GTwkJCTB4RkQ4OQkvLworI2RlZmluZSBDRkdfQ1VSX1NTTl9JTkZPX0VMRU1FTlQJCTB4RkQ4QQkvLworI2RlZmluZSBDRkdfQ1VSX1RLSVBfSVZfSU5GTwkJCTB4RkQ4QgkvLworI2RlZmluZSBDRkdfQ1VSX0FTU09DX1JFUV9JTkZPCQkJMHhGRDhDCS8vCisjZGVmaW5lIENGR19DVVJfQVNTT0NfUkVTUF9JTkZPCQkJMHhGRDhECS8vCisjZGVmaW5lIENGR19DVVJfTE9BRAkJCQkJMHhGRDhFCS8vW0FQXSBjdXJyZW50IGxvYWQgb24gQVAncyBjaGFubmVsCisKKyNkZWZpbmUgQ0ZHX1NFQ1VSSVRZX0NBUEFCSUxJVElFUwkJMHhGRDkwCS8vQ29tYmluZWQgY2FwYWJpbGl0aWVzIGluZm9ybWF0aW9uCisKKy8vCU1PREVNIElORk9STUFUSU9OCisjZGVmaW5lIENGR19QSFlfVFlQRQkJCQkJMHhGREMwCS8vUGh5c2ljYWwgbGF5ZXIgdHlwZSBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19DVVJfQ0hBTk5FTAkJCQkJMHhGREMxCS8vQWN0dWFsIGZyZXF1ZW5jeSBjaGFubmVsIHVzZWQgZm9yIHRyYW5zbWlzc2lvbgorI2RlZmluZSBDRkdfQ1VSX1BPV0VSX1NUQVRFCQkJCTB4RkRDMgkvL0FjdHVhbCBwb3dlciBjb25zdW1wdGlvbiBzdGF0dXMKKyNkZWZpbmUgQ0ZHX0NDQV9NT0RFCQkJCQkweEZEQzMJLy9DbGVhciBjaGFubmVsIGFzc2Vzc21lbnQgbW9kZSBpbmRpY2F0aW9uCisjZGVmaW5lIENGR19TVVBQT1JURURfREFUQV9SQVRFUwkJMHhGREM2CS8vRGF0YSByYXRlcyBjYXBhYmlsaXR5IGluZm9ybWF0aW9uCisKKyNkZWZpbmUgQ0ZHX1JJRF9JTkZfTUFYCQkJCQkweEZERkYJLy9oaWdoZXN0IHZhbHVlIHJlcHJlc2VudGluZyBhbiBJbmZvcm1hdGlvbiBSSUQKKworLy8JRU5HSU5FRVJJTkcgSU5GT1JNQVRJT04KKyNkZWZpbmUgQ0ZHX1JJRF9FTkdfTUlOCQkJCQkweEZGRTAJLy9sb3dlc3QgdmFsdWUgcmVwcmVzZW50aW5nIGEgSGVybWVzIGVuZ2luZWVyaW5nIFJJRAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR2VuZXJhbCBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvL0lGQiBmaWVsZCByZWxhdGVkCisvLwkJSUZCX0NhcmRTdGF0CisjZGVmaW5lIENBUkRfU1RBVF9JTkNPTVBfUFJJCQkJMHgyMDAwVQkvLyBubyBjb21wYXRpYmxlIEhTSSAvIHByaW1hcnkgRi9XCisjZGVmaW5lIENBUkRfU1RBVF9JTkNPTVBfRlcJCQkJMHgxMDAwVQkvLyBubyBjb21wYXRpYmxlIHN0YXRpb24gLyB0ZXJ0aWFyeSBGL1cKKyNkZWZpbmUgQ0FSRF9TVEFUX0RFRlVOQ1QJCQkJMHgwMTAwVQkvLyBIQ0YgaXMgaW4gRGVmdW5jdCBtb2RlCisvLwkJSUZCX1J4U3RhdAorI2RlZmluZSBSWF9TVEFUX1BSSU8JCQkJCTB4MDBFMFUJLy9Qcmlvcml0eSBzdWJmaWVsZAorI2RlZmluZSBSWF9TVEFUX0VSUgkJCQkJCTB4MDAwRlUJLy9FcnJvciBtYXNrCisjZGVmaW5lIAlSWF9TVEFUX1VOREVDUgkJCQkweDAwMDJVCS8vTm9uLWRlY3J5cHRhYmxlIGVuY3J5cHRlZCBtZXNzYWdlCisjZGVmaW5lIAlSWF9TVEFUX0ZDU19FUlIJCQkJMHgwMDAxVQkvL0ZDUyBlcnJvcgorCisvLyBTTkFQIGhlYWRlciBmb3IgRS1JSSBFbmNhcHN1bGF0aW9uCisjZGVmaW5lIEVOQ19OT05FCQkJICAgICAgICAgICAgMHhGRgorI2RlZmluZSBFTkNfMTA0MiAgICAJCQkgICAgICAgIDB4MDAKKyNkZWZpbmUgRU5DX1RVTk5FTCAgICAgIAkgICAgCQkweEY4CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFh4eHh4eHh4ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBIQ0ZfU1VDQ0VTUwkJCQkJMHgwMAkvLyBPSworI2RlZmluZSBIQ0ZfRVJSX1RJTUVfT1VUCQkJMHgwNAkvLyBFeHBlY3RlZCBIZXJtZXMgZXZlbnQgZGlkIG5vdCBvY2N1cmUgaW4gZXhwZWN0ZWQgdGltZQorI2RlZmluZSBIQ0ZfRVJSX05PX05JQwkJCQkweDA1CS8qIGNhcmQgbm90IGZvdW5kICh1c3VhbGx5IHlhbmtlZCBhd2F5IGR1cmluZyBoY2Zpb19pbl9zdHJpbmcKKwkJCQkJCQkJCQkgIAkgKiBBbHNvOiBjYXJkIGlzIGVpdGhlciBhYnNlbnQgb3IgZGlzYWJsZWQgd2hpbGUgaXQgc2hvdWxkIGJlIG5laXRoZXIgKi8KKyNkZWZpbmUgSENGX0VSUl9MRU4JCQkJCTB4MDgJLyogYnVmZmVyIHNpemUgaW5zdWZmaWNpZW50CisJCSAJCQkJCQkJCSAgCSAqCQkgIC0JSUZCX0NvbmZpZ1RhYmxlIHRvbyBzbWFsbAorCQkgCQkJCQkJCQkgIAkgKgkJICAtCWhjZl9nZXRfaW5mbyBidWZmZXIgaGFzIGEgc2l6ZSBvZiAwIG9yIDEgb3IgbGVzcyB0aGFuIG5lZWRlZAorCQkgCQkJCQkJCSAgCQkgKgkJCXRvIGFjY29tb2RhdGUgYWxsIGRhdGEKKwkJIAkJCQkJCQkgIAkJICoJCSAgLQloY2ZfcHV0X2luZm86IENGR19ETE5WX0RBVEEgZXhjZWVkcyBpbnRlcm1lZGlhdGUKKwkJCQkJCQkJCQkJICoJCSAgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgSENGX0VSUl9JTkNPTVBfUFJJCQkJMHgwOQkvLyBwcmltYXJ5IGZ1bmN0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUKKyNkZWZpbmUgSENGX0VSUl9JTkNPTVBfRlcJCQkweDBBCS8vIHN0YXRpb24gZnVuY3Rpb25zIGFyZSBjb21wYXRpYmxlCisjZGVmaW5lIEhDRl9FUlJfTUlDCQkJCQkweDBECS8vIE1JQyBjaGVjayBmYWlscworI2RlZmluZSBIQ0ZfRVJSX1NMRUVQCQkJCTB4MEUJLy8gTklDIGluIHNsZWVwIG1vZGUKKyNkZWZpbmUgSENGX0VSUl9NQVgJCQkJCTB4M0YJLyogZW5kIG9mIEhDRiByYW5nZQorCQkJCQkJCQkJCQkgICAqKiogKiogKioqICoqKioqKiAqKiogKioqKioqKioqKioqKioqICovCisjZGVmaW5lIEhDRl9FUlJfREVGVU5DVAkJCQkweDgwCS8vIEJJVCwgcmVmbGVjdGluZyB0aGF0IHRoZSBIQ0YgaXMgaW4gZGVmdW5jdCBtb2RlIChiaXRzIDB4N0YgcmVmbGVjdCBjYXVzZSkKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX0FVWAkJCTB4ODIJLy8gVGltZW91dCBvbiBhY2tub3dsZWRnZW1lbnQgb24gZW4vZGlzYWJsaW5nIEFVWCByZWdpc3RlcnMKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX1RJTUVSCQkweDgzCS8vIFRpbWVvdXQgb24gdGltZXIgY2FsaWJyYXRpb24gZHVyaW5nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUCTB4ODQJLy8gVGltZW91dCBvbiBCdXN5IGJpdCBkcm9wIGR1cmluZyBCQVAgc2V0dXAKKyNkZWZpbmUgSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEJCTB4ODYJLy8gSGVybWVzIGFuZCBIQ0YgYXJlIG91dCBvZiBzeW5jIGluIGlzc3VpbmcvcHJvY2Vzc2luZyBjb21tYW5kcworCisjZGVmaW5lIEhDRl9JTlRfUEVORElORwkJCQkweDAxCS8vIHJldHVybiBzdGF0dXMgb2YgaGNmX2FjdCggSENGX0FDVF9JTlRfT0ZGICkKKworI2RlZmluZSBIQ0ZfUE9SVF8wIAkJCQkJMHgwMDAwCS8vIFN0YXRpb24gc3VwcG9ydHMgb25seSBzaW5nbGUgTUFDIFBvcnQKKyNkZWZpbmUgSENGX1BPUlRfMSAJCQkJCTB4MDEwMAkvLyBIQ0ZfUE9SVF8xIHRocm91Z2ggSENGX1BPUlRfNiBhcmUgb25seSBzdXBwb3J0ZWQgYnkgQVAgRi9XCisjZGVmaW5lIEhDRl9QT1JUXzIgCQkJCQkweDAyMDAKKyNkZWZpbmUgSENGX1BPUlRfMyAJCQkJCTB4MDMwMAorI2RlZmluZSBIQ0ZfUE9SVF80IAkJCQkJMHgwNDAwCisjZGVmaW5lIEhDRl9QT1JUXzUgCQkJCQkweDA1MDAKKyNkZWZpbmUgSENGX1BPUlRfNiAJCQkJCTB4MDYwMAorCisjZGVmaW5lIEhDRl9DTlRMX0VOQUJMRQkJCQkweDAxCisjZGVmaW5lIEhDRl9DTlRMX0RJU0FCTEUJCQkweDAyCisjZGVmaW5lIEhDRl9DTlRMX0NPTk5FQ1QJCQkweDAzCisjZGVmaW5lIEhDRl9DTlRMX0RJU0NPTk5FQ1QJCQkweDA1CisjZGVmaW5lIEhDRl9DTlRMX0NPTlRJTlVFCQkJMHgwNworCisjZGVmaW5lIFVTRV9ETUEgCQkJCQkweDAwMDEKKyNkZWZpbmUgVVNFXzE2QklUIAkJCQkJMHgwMDAyCisjZGVmaW5lIERNQV9FTkFCTEVECQkJCQkweDgwMDAJLy93ZWFrIG5hbWUsIGl0IHJlYWxseSBtZWFuczogRi9XIGVuYWJsZWQgYW5kIERNQSBzZWxlY3RlZAorCisvLyNkZWZpbmUgSENGX0RNQV9GRF9DTlQJIAkJKDIqMjkpIAkJCQkJCS8vc2l6ZSBpbiBieXRlcyBvZiBvbmUgVHgvUnhGUyBtaW51cyBEQS9TQQorLy87P3RoZSBNU0YgKCBIMlBDSS5DIHVzZXMgdGhlIG5leHQgMiBtbmVtb25pY3MgKQorI2RlZmluZSBIQ0ZfRE1BX1JYX0JVRjFfU0laRQkJKEhGU19BRERSX0RFU1QgKyA4KQkJCS8vZXh0cmEgYnl0ZXMgZm9yIExFTi9TTkFQIGlmIGRlY2Fwc3VsYXRpb24KKyNkZWZpbmUgSENGX0RNQV9UWF9CVUYxX1NJWkUJCShIRlNfQUREUl9ERVNUICsgMio2ICsgOCkJLy9leHRyYSBieXRlcyBmb3IgREEvU0EvTEVOL1NOQVAgaWYgZW5jYXBzdWxhdGlvbgorCisvL0hGU19UWF9DTlRMCisvKiBOb3RlIHRoYXQgdGhlIEhDRl8uLi4uIFN5c3RlbSBDb25zdGFudHMgaW5mbHVlbmNlIHRoZSBIRlNfLi4uLiB2YWx1ZXMgYmVsb3cKKyAqIAkJCQkJCQkJSC1JCQlILUkJIHwJSC1JSQlILUlJCUgtSUkuNQorICoJCQkJCQkJCQkJV1BBCSB8CQkJV1BBCisgKiBIRlNfVFhfQ05UTF9UWF9PSwkJCTAwMDIJMDAwMiB8CTAwMDIJMDAwMgkgTi9BCTw8PDw8PDw8ZGVwcmVjYXRlZAorICogSEZTX1RYX0NOVExfVFhfRVgJCQkwMDA0CTAwMDQgfAkwMDA0CTAwMDQJIE4vQQorICogSEZTX1RYX0NOVExfTUlDCQkJCSBOL0EJMDAxMCB8CSBOL0EJMDAxMAkgTi9BCisgKiBIRlNfVFhfQ05UTF9USUQJCQkJIE4vQQkgTi9BIHwJIE4vQQkgTi9BCTAwMEYKKyAqIEhGU19UWF9DTlRMX1NFUlZJQ0VfQ0xBU1MJIE4vQQkgTi9BIHwJIE4vQQkgTi9BCTAwQzAKKyAqIEhGU19UWF9DTlRMX1BPUlQJCQkJMDcwMAkwNzAwIHwJMDcwMAkwNzAwCTA3MDAKKyAqIEhGU19UWF9DTlRMX01JQ19LRVlfSUQJCTE4MDAJMTgwMCB8CTAwMDAJMTgwMAkgTi9BCisgKiBIRlNfVFhfQ05UTF9DS0lQCQkJCTAwMDAJMDAwMCB8CTAwMDAJMjAwMAkyMDAwCisgKiBIRlNfVFhfQ05UTF9UWF9ERUxBWQkJCTQwMDAJNDAwMCB8CTQwMDAJNDAwMAkgTi9BCisgKiBIRlNfVFhfQ05UTF9BQ1RJT04JCQkgTi9BCSBOL0EgfAkgTi9BCSBOL0EJNDAwMAorICogCQkJCQkJCQk9PT09CT09PT0gfAk9PT09CT09PT0JPT09PQorICogCQkJCQkJCQk1RjA2CTVGMTYgfAk0NzA2CTdGMDYJNjdDRgorICoKKyAqIEhDRl9UWF9DTlRMX01BU0sgc3BlY2lmaWVzIHRoZSBiaXRzIGFsbG93ZWQgb24gdGhlIEhvc3QgSS9GCisgKiBub3RlOiBiaXQgMHg0MDAwIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgSC1JSSBhbmQgSC1JSS41CisgKiBub3RlOiBbXSBpbmRpY2F0ZSBiaXRzIHdoaWNoIGFyZSBwb3NzaWJseSBhZGRlZCBieSB0aGUgSENGIHRvIFR4Q29udHJvbCBhdCB0aGUgSG9zdCBJL0YKKyAqIG5vdGU6ICgpIGluZGljYXRlIGJpdHMgd2hpY2ggYXJlIHN1cHBvc2VkbHkgbmV2ZXIgZXZlciB1c2VkIGluIGEgV0NJIGVudmlyb25tZW50CisgKiBub3RlOiA/IGRlbm90ZSBiaXRzIHdoaWNoIHNlZW0gbm90IHRvIGJlIGRvY3VtZW50ZWQgaW4gdGhlIGRvY3VtZW50cyBJIGhhdmUgYXZhaWxhYmxlCisgKi8KKy8vSC1JOiAgICAgSENGX1RYX0NOVExfTUFTSwkweDQ3RkUJLy9UWF9ERUxBWSwgTUFDUG9ydCwgUHJpb3JpdHksIChTdHJ1Y1R5cGUpLCBUeEV4LCBUeE9LCisvL0gtSSBXUEE6IEhDRl9UWF9DTlRMX01BU0sJMHg1RkU2CS8vVFhfREVMQVksIE1JQ0tleSwgTUFDUG9ydCwgUHJpb3JpdHksIChTdHJ1Y1R5cGUpLCBUeEV4LCBUeE9LCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dBUlAKKyNkZWZpbmUgIEhDRl9UWF9DTlRMX01BU0sJMHgyN0U3CS8vbm8gVFhfREVMQVk/LCBDQ1gsIE1BQ1BvcnQsIFByaW9yaXR5LCAoU3RydWNUeXBlKSwgVHhFeCwgVHhPSywgU3BlY3RyYWxpbmsKKy8vI2VsaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQorLy8jZGVmaW5lICBIQ0ZfVFhfQ05UTF9NQVNLCTB4N0YwNgkvL1RYX0RFTEFZLCBDS0lQPywgTUlDS2V5SUQsIE1BQ1BvcnQsIFtNSUNdLFR4RXgsIFR4T0sgKFRBUjQxOUQ3KQorI2Vsc2UKKyNkZWZpbmUgIEhDRl9UWF9DTlRMX01BU0sJMHg2N0U3CS8vVFhfREVMQVk/LCBDQ1gsIE1BQ1BvcnQsIFByaW9yaXR5LCAoU3RydWNUeXBlKSwgVHhFeCwgVHhPSywgU3BlY3RyYWxpbmsKKyNlbmRpZiAvLyBIQ0ZfVFlQRV9XQVJQCisKKyNkZWZpbmUgSEZTX1RYX0NOVExfVFhfRVgJCQkweDAwMDRVCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCisjZGVmaW5lIEhGU19UWF9DTlRMX01JQwkJCQkweDAwMTBVCS8vODAyLjMgZm9ybWF0IHdpdGggVEtJUAkJOz9jaGFuZ2VzIHRvIDB4MDAwOCBmb3IgSC1JSQorI2RlZmluZSBIRlNfVFhfQ05UTF9NSUNfS0VZX0lECQkweDE4MDBVCS8vTUlDIEtleSBJRCBzdWJmaWVsZAorI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQorCisjZGVmaW5lIEhGU19UWF9DTlRMX1BPUlQJCQkweDA3MDBVCS8vUG9ydCBzdWJmaWVsZCBvZiBUeENvbnRyb2wgZmllbGQgb2YgVHJhbnNtaXQgRnJhbWUgU3RydWN0dXJlCisKKyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCisjZGVmaW5lIEhGU19UWF9DTlRMX0NLSVAJCQkweDIwMDBVCS8vQ0tJUCBlbmNyeXB0ZWQgZmxhZworI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1RYX0RFTEFZCisjZGVmaW5lIEhGU19UWF9DTlRMX1RYX0RFTEFZCQkweDQwMDBVCS8vZGVjb3VwbGUgInB1dCBkYXRhIiBhbmQgc2VuZAorI2VuZGlmIC8vIEhDRl9UWVBFX1RYX0RFTEFZCisjZGVmaW5lIEhGU19UWF9DTlRMX1RYX0NPTlQJCQkweDQwMDB1CS8vZW5naW5lZXJpbmc6IGNvbnRpbnVvdXMgdHJhbnNtaXQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhDRiBEZWZpbmVkIFJFQ09SRFMJPT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19QUk9EX0RBVEEJCQkJCTB4MDgwMCAJCS8vUGx1ZyBEYXRhIChFbmdpbmVlcmluZyBUZXN0IHB1cnBvc2VzIG9ubHkpCisjZGVmaW5lIENGR19ETF9FRVBST00JCQkJCTB4MDgwNgkJLy9VcC9Eb3dubG9hZCBJMlBST00gZm9yIFVTQgorI2RlZmluZQkJQ0ZHX1BEQQkJCQkJCQkweDAwMDIJCS8vRG93bmxvYWQgUERBCisjZGVmaW5lCQlDRkdfTUVNX0kyUFJPTQkJCQkJMHgwMDA0CQkvL1VwL0Rvd25sb2FkIEVFUFJPTQorCisjZGVmaW5lCQlDRkdfTUVNX1JFQUQJCQkJCTB4MDAwMAorI2RlZmluZQkJQ0ZHX01FTV9XUklURQkJCQkJMHgwMDAxCisKKyNkZWZpbmUgQ0ZHX05VTEwJCQkJCQkweDA4MjAJCS8vRW1wdHkgTWFpbCBCb3ggSW5mbyBCbG9jaworI2RlZmluZSBDRkdfTUJfSU5GTwkJCQkJCTB4MDgyMAkJLy9NYWlsIEJveCBJbmZvIEJsb2NrCisjZGVmaW5lIENGR19XTVAJCQkJCQkJMHgwODIyCQkvL1dhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbAorCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lECisjZGVmaW5lIENGR19EUlZfSU5GTwkJCQkJMHgwODI1CQkvL0RyaXZlciBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgKHNlZSBDRkdfRFJWX0lORk9fU1RSQ1QgZm9yIGRldGFpbHMpCisjZGVmaW5lIENGR19EUlZfSURFTlRJVFkJCQkJMHgwODI2CQkvL2RyaXZlciBpZGVudGl0eSAoc2VlIENGR19EUlZfSURFTlRJVFlfU1RSQ1QgZm9yIGRldGFpbHMpCisjZGVmaW5lIENGR19EUlZfU1VQX1JBTkdFCQkJCTB4MDgyNyAgICAgIC8vU3VwcGxpZXIgcmFuZ2Ugb2YgZHJpdmVyIC0gdXRpbGl0eSBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSQkJCTB4MDgyOCAgICAgIC8vKEFjY2VwdGFibGUpIEFjdG9yIHJhbmdlIGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBCQkJMHgwODI5ICAgICAgLy8oQWNjZXB0YWJsZSkgQWN0b3IgcmFuZ2UgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0kgCQkJMHgwODJBICAgICAgLy8oQWNjZXB0YWJsZSkgQWN0b3IgcmFuZ2UgZm9yIEgvVyAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRgkJCTB4MDgyQgkJLy8oQWNjZXB0YWJsZSkgQWN0b3IgcmFuZ2UgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfSENGX09QVAkJCQkJCTB4MDgyQwkJLy9IQ0YgKENvbXBpbGUgdGltZSkgb3B0aW9ucworI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKKworI2RlZmluZSBDRkdfUkVHX01CCQkJCQkJMHgwODMwCQkvL1JlZ2lzdGVyIE1haWwgQm94CisjZGVmaW5lIENGR19NQl9BU1NFUlQJCQkJCTB4MDgzMQkJLy9Bc3NlcnQgaW5mb3JtYXRpb24KKyNkZWZpbmUgQ0ZHX1JFR19BU1NFUlRfUlROUAkJCQkweDA4MzIJCS8vKGRlLSlyZWdpc3RlciBNU0YgQXNzZXJ0IENhbGxiYWNrIHJvdXRpbmUKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lORk9fTE9HCisjZGVmaW5lIENGR19SRUdfSU5GT19MT0cJCQkJMHgwODM5CQkvLyhkZS0pcmVnaXN0ZXIgSW5mbyBmcmFtZXMgdG8gTG9nCisjZW5kaWYgLy8gSENGX0lORk9fTE9HCisjZGVmaW5lIENGR19DTlRMX09QVAkJCQkJMHgwODNBCQkvL0NvbnRyb2wgb3B0aW9ucworCisjZGVmaW5lIENGR19QUk9HCQkJCQkJMHgwODU3CQkvL1Byb2dyYW0gTklDIG1lbW9yeQorI2RlZmluZSAJQ0ZHX1BST0dfU1RPUAkJCQkJMHgwMDAwCisjZGVmaW5lIAlDRkdfUFJPR19WT0xBVElMRQkJCQkweDAxMDAKKy8vI2RlZmluZSAJQ0ZHX1BST0dfRkxBU0gJCQkJCTB4MDMwMAkJLy9yZXN0b3JlIGlmIEgtSUkgbm9uLXZvbGF0aWxlIGlzIGludHJvZHVjZWQKKy8vI2RlZmluZSAJQ0ZHX1BST0dfU0VFUFJPTQkJCQkweDEzMDAJCS8vcmVzdG9yZSBpZiBILUlJIG5vbi12b2xhdGlsZSBpcyBpbnRyb2R1Y2VkCisjZGVmaW5lIAlDRkdfUFJPR19TRUVQUk9NX1JFQURCQUNLIAkJMHgwNDAwCisKKyNkZWZpbmUgQ0ZHX0ZXX1BSSU5URiAgICAgICAgICAgICAgICAgICAgICAgMHgwODU4ICAgICAgLy9SZWxhdGVkIHRvIGZpcm13YXJlIGRlYnVnIHByaW50ZiBmdW5jdGlvbmFsaXR5CisjZGVmaW5lIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OICAgICAgIDB4MDg1OSAgICAgIC8vQWxzbyByZWxhdGVkIHRvIGZpcm13YXJlIGRlYnVnIHByaW50ZiBmdW5jdGlvbmFsaXR5CisKKyNkZWZpbmUgQ0ZHX0NNRF9OSUMJCQkJCQkweDA4NjAJCS8vSGVybWVzIEVuZ2luZWVyaW5nIGNvbW1hbmQKKyNkZWZpbmUgQ0ZHX0NNRF9IQ0YJCQkJCQkweDA4NjMJCS8vSENGIEVuZ2luZWVyaW5nIGNvbW1hbmQKKyNkZWZpbmUgCUNGR19DTURfSENGX1JFR19BQ0NFU1MJCQkweDAwMDAJLy9EaXJlY3QgcmVnaXN0ZXIgYWNjZXNzCisjZGVmaW5lIAlDRkdfQ01EX0hDRl9SWF9NT04JCQkJMHgwMDAxCS8vUngtbW9uaXRvcgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNU0YgRGVmaW5lZCBSRUNPUkRTCT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENGR19FTkNSWVBUX1NUUklORwkJCQkweDA5MDAJCS8vdHJhbnNmZXIgZW5jcnlwdGlvbiBpbmZvIGZyb20gQ1BMIHRvIE1TRgorI2RlZmluZSBDRkdfQVBfTU9ERQkJCQkJCTB4MDkwMQkJLy9jb250cm9sIG1vZGUgb2YgU1RBUCBkcml2ZXIgZnJvbSBDUEwKKyNkZWZpbmUgQ0ZHX0RSSVZFUl9FTkFCTEUJCQkJMHgwOTAyCQkvL2V4dGVuZCZleHBvcnQgRW4tL0Rpc2FibGUgZmFjaWxpdHkgdG8gVXRpbGl0eQorI2RlZmluZSBDRkdfUENJX0NPTU1BTkQJCQkJCTB4MDkwMwkJLy9QQ0kgYWRhcHRlciAoT29pZXZhYXIpIHN0cnVjdHVyZQorI2RlZmluZSBDRkdfV09MQVNfRU5BQkxFCQkJCTB4MDkwNAkJLy9leHRlbmQmZXhwb3J0IEVuLS9EaXNhYmxlIFdPTEFTIGZhY2lsaXR5IHRvIFV0aWxpdHkKKyNkZWZpbmUgQ0ZHX0NPVU5UUllfU1RSSU5HCQkJCTB4MDkwNQkJLy90cmFuc2ZlciBDb3VudHJ5SW5mbyBpbmZvIGZyb20gQ1BMIHRvIE1TRgorI2RlZmluZSBDRkdfRldfRFVNUAkJCQkJCTB4MDkwNgkJLy90cmFuc2ZlciBuaWMgbWVtb3J5IHRvIHV0aWxpdHkKKyNkZWZpbmUgQ0ZHX1BPV0VSX01PREUJCQkJCTB4MDkwNwkJLy9jb250cm9scyB0aGUgUE0gbW9kZSBvZiB0aGUgY2FyZAorI2RlZmluZSBDRkdfQ09OTkVDVElPTl9NT0RFCQkJCTB4MDkwOAkJLy9jb250cm9scyB0aGUgbW9kZSBvZiB0aGUgRlcgKEVTUy9BUC9JQlNTL0FESE9DKQorI2RlZmluZSBDRkdfSUZCCQkJCQkJCTB4MDkwOQkJLy9ieXRlIHdpc2UgY29weSBvZiBJRkIKKyNkZWZpbmUgQ0ZHX01TRl9UQUxMSUVTCQkJCQkweDA5MEEJCS8vTVNGIHRhbGxpZXMgKGludCdzLCByeCBhbmQgdHgpCisjZGVmaW5lIENGR19DVVJSRU5UX0xJTktfU1RBVFVTCQkJMHgwOTBCCQkvL0xhdGVzdCBsaW5rIHN0YXR1cyBnb3QgdHJvdWdoIDB4RjIwMCBMaW5rRXZlbnQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5GT1JNQVRJT04gRlJBTUVTID09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBDRkdfSU5GT19GUkFNRV9NSU4JCQkJMHhGMDAwCQkvL2xvd2VzdCB2YWx1ZSByZXByZXNlbnRpbmcgYW4gSW5mb3JtYXRpbyBGcmFtZQorCisjZGVmaW5lIENGR19UQUxMSUVTCQkJCQkJMHhGMTAwCQkvL0NvbW11bmljYXRpb25zIFRhbGxpZXMKKyNkZWZpbmUgQ0ZHX1NDQU4JCQkJCQkweEYxMDEJCS8vU2NhbiByZXN1bHRzCisjZGVmaW5lIENGR19QUlNfU0NBTgkJCQkJMHhGMTAyCQkvL1Byb2JlIFJlc3BvbnNlIFNjYW4gcmVzdWx0cworCisjZGVmaW5lIENGR19MSU5LX1NUQVQgCQkJCQkweEYyMDAJCS8vTGluayBTdGF0dXMKKwkvKiAxIHRocm91Z2ggNSBhcmUgRi9XIGRlZmluZWQgdmFsdWVzLCBwcm9kdWNlZCBieSBDRkdfTElOS19TVEFUIGZyYW1lCisJICogMSB0aHJvdWdoIDUgYXJlIHNoYXJlZCBieSBDRkdfTElOS19TVEFULCBJRkJfTGlua1N0YXQgYW5kIElGQl9EU0xpbmtTdGF0CisJICogMSBwbGF5cyBhIGRvdWJsZSByb2xlIGFzIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEIGFuZCBhcyBiaXQgcmVmbGVjdGluZzoKKwkgKgkgLSBjb25uZWN0ZWQ6IE9OCisJICoJIC0gZGlzY29ubmVjdGVkOiBPRkYKKwkgKi8KKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQ09OTkVDVEVECQkJMHgwMDAxCisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0RJU0NPTk5FQ1RFRAkJMHgwMDAyCisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0FQX0NIQU5HRQkJCTB4MDAwMworI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9BUF9PT1IJCQkweDAwMDQKKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQVBfSVIJCQkJMHgwMDA1CisjZGVmaW5lIAlDRkdfTElOS19TVEFUX0ZXCQkJCTB4MDAwRgkvL21hc2sgdG8gaXNvbGF0ZSBGL1cgZGVmaW5lZCBiaXRzCisvLyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfVElNRVIJCQkJMHgwRkYwCS8vbWFzayB0byBpc29sYXRlIE9PUiB0aW1lcgorLy8jZGVmaW5lIAlDRkdfTElOS19TVEFUX0RTX09PUgkJCTB4MjAwMAkvLzIwMDAgYW5kIHVwIGFyZSBJRkJfTGlua1N0YXQgc3BlY2lmaWMKKy8vI2RlZmluZSAJQ0ZHX0xJTktfU1RBVF9EU19JUgkJCQkweDQwMDAKKyNkZWZpbmUgCUNGR19MSU5LX1NUQVRfQ0hBTkdFCQkJMHg4MDAwCisjZGVmaW5lIENGR19BU1NPQ19TVEFUCQkJCQkweEYyMDEJCS8vQXNzb2NpYXRpb24gU3RhdHVzCisjZGVmaW5lIENGR19TRUNVUklUWV9TVEFUCQkJCTB4RjIwMgkJLy9TZWN1cml0eSBTdGF0dXMKKyNkZWZpbmUgQ0ZHX1VQREFURURfSU5GT19SRUNPUkQJCQkweEYyMDQJCS8vVXBkYXRlZCBJbmZvIFJlY29yZAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT05GSUdVUkFUSU9OIFJFQ09SRFMgPT09PT09PT09PT09PT09PT09PT09PSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUyBUIFIgVSBDIFQgVSBSIEUgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy9RdWljayZEaXJ0eSB0byBnZXQgZG93bmxvYWQgZm9yIERPUyBPREkgSGVybWVzLUlJIHJ1bm5pbmcgdHlwZWRlZiBMVFZfU1RSQ1QgRkFSICoJTFRWUDsKK3R5cGVkZWYgTFRWX1NUUkNUIEZBUiAqCUxUVlA7ICAgLy8gaS5zLm8gI2RlZmluZSBMVFZQIExUVl9TVFJDVCBGQVIgKgorCisjaWYgZGVmaW5lZCBXVkxBTl80MiB8fCBkZWZpbmVkIFdWTEFOXzQzIC8vOz9rZWVwdXAgd2l0aCBsZWdhY3kgYSBsaXR0bGUgd2hpbGUgbG9uZ2VyICg0YXVnMjAwMykKK3R5cGVkZWYgc3RydWN0IERVSV9TVFJDVCB7CQkJLyogImxlZ2FjeSIsIHN0aWxsIHVzZWQgYnkgV1ZMQU40Mi80MywgTkRJUyBkcml2ZXJzIHVzZSBXTEFQSQkJCSovCisJdm9pZCAgRkFSCSppZmJwOwkJCQkvKiBQb2ludGVyIHRvIElGQgorCQkJCQkJCQkJICoJcmV0dXJuZWQgZnJvbSBNU0YgdG8gVVNGIGJ5IHVpbF9jb25uZWN0CisJCQkJIAkJCQkJICoJcGFzc2VkIGZyb20gVVNGIHRvIE1TRiBhcyBhICJtYWdpYyBjb29raWUiIGJ5IGFsbCBvdGhlciBVSUwgZnVuY3Rpb24gY2FsbHMKKwkJCQkgCQkJCQkgKi8KKwloY2ZfMTYJCXN0YXQ7CQkJCS8vIHN0YXR1cyByZXR1cm5lZCBmcm9tIE1TRiB0byBVU0YKKwloY2ZfMTYJCWZ1bjsJCQkJLy8gY29tbWFuZCBjb2RlIGZyb20gVVNGIHRvIE1TRgorCUxUVl9TVFJDVAlsdHY7CQkJCS8qIExUViBzdHJ1Y3R1cmUKKwkJCSAJCQkJCQkgKioqIGR1cmluZyB1aWxfcHV0X2luZm86CisJCQkJCQkgCQkJICoJICB0aGUgTCwgVCBhbmQgVi1maWVsZHMgY2FycnkgaW5mb3JtYXRpb24gZnJvbSBVU0YgdG8gTVNGCisJCQkJCQkJCQkgKioqIGR1cmluZyB1aWxfZ2V0X2luZm86CisJCQkJCQkJCQkgKgkgIHRoZSBMIGFuZCBUIGZpZWxkcyBjYXJyeSBpbmZvcm1hdGlvbiBmcm9tIFVTRiB0byBNU0YKKwkJCQkJCQkJCSAqCSAgdGhlIEwgYW5kIFYtZmllbGRzIGNhcnJ5IGluZm9ybWF0aW9uIGZyb20gTVNGIHRvIFVTRgorCQkJIAkJCQkJCSAqLworfSBEVUlfU1RSQ1Q7Cit0eXBlZGVmIERVSV9TVFJDVCBGQVIgKglEVUlQOworI2VuZGlmIC8vZGVmaW5lZCBXVkxBTl80MiB8fCBkZWZpbmVkIFdWTEFOXzQzIC8vOz9rZWVwdXAgd2l0aCBsZWdhY3kgYSBsaWl0bGUgd2hpbGUgbG9uZ2VyICg0YXVnMjAwMykKKworCit0eXBlZGVmIHN0cnVjdCBDRkdfQ01EX05JQ19TVFJDVCB7CS8vIENGR19DTURfTklDICgweDA4NjApCQlIZXJtZXMgRW5naW5lZXJpbmcgY29tbWFuZAorCWhjZl8xNglsZW47CQkJCQkvL2RlZmF1bHQgbGVuZ3RoIG9mIFJJRAorCWhjZl8xNgl0eXA7CQkJCQkvL1JJRCBpZGVudGlmaWNhdGlvbiBhcyBkZWZpbmVkIGJ5IEhlcm1lcworCWhjZl8xNgljbWQ7CQkJCQkvL0NvbW1hbmQgY29kZSAoMHgwMDNGKSBhbmQgY29udHJvbCBiaXRzICgweEZGQzApCisJaGNmXzE2CXBhcm0wOwkJCQkJLy9wYXJhbWV0ZXJzIGZvciBIZXJtZXMgUGFyYW0wIHJlZ2lzdGVyCisJaGNmXzE2CXBhcm0xOwkJCQkJLy9wYXJhbWV0ZXJzIGZvciBIZXJtZXMgUGFyYW0xIHJlZ2lzdGVyCisJaGNmXzE2CXBhcm0yOwkJCQkJLy9wYXJhbWV0ZXJzIGZvciBIZXJtZXMgUGFyYW0yIHJlZ2lzdGVyCisJaGNmXzE2CXN0YXQ7CQkJCQkvL3Jlc3VsdCBjb2RlIGZyb20gSGVybWVzIFN0YXR1cyByZWdpc3RlcgorCWhjZl8xNglyZXNwMDsJCQkJCS8vcmVzcG9uc2VzIGZyb20gSGVybWVzIFJlc3AwIHJlZ2lzdGVyCisJaGNmXzE2CXJlc3AxOwkJCQkJLy9yZXNwb25zZXMgZnJvbSBIZXJtZXMgUmVzcDEgcmVnaXN0ZXIKKwloY2ZfMTYJcmVzcDI7CQkJCQkvL3Jlc3BvbnNlcyBmcm9tIEhlcm1lcyBSZXNwMiByZWdpc3RlcgorCWhjZl8xNgloY2Zfc3RhdDsJCQkJLy9yZXN1bHQgY29kZSBmcm9tIGNtZF9leGUgcm91dGluZQorCWhjZl8xNglpZmJfZXJyX2NtZDsJCQkvL0lGQl9FcnJDbWQKKwloY2ZfMTYJaWZiX2Vycl9xdWFsaWZpZXI7CQkvL0lGQl9FcnJRdWFsaWZpZXIKK30gQ0ZHX0NNRF9OSUNfU1RSQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ0ZHX0RSVl9JTkZPX1NUUkNUIHsJCS8vQ0ZHX0RSVl9JTkZPICgweDA4MjUpIGRyaXZlciBpbmZvcm1hdGlvbgorCWhjZl8xNglsZW47CQkJCQkvL2RlZmF1bHQgbGVuZ3RoIG9mIFJJRAorCWhjZl8xNgl0eXA7CQkJCQkvL1JJRCBpZGVudGlmaWNhdGlvbiBhcyBkZWZpbmVkIGJ5IEhlcm1lcworCWhjZl84CWRyaXZlcl9uYW1lWzhdOwkJCS8vRHJpdmVyIG5hbWUsIDggYnl0ZXMsIHJpZ2h0IHplcm8gcGFkZGVkCisJaGNmXzE2CWRyaXZlcl92ZXJzaW9uOwkJCS8vQkNEIDIgZGlnaXQgbWFqb3IgYW5kIDIgZGlnaXQgbWlub3IgZHJpdmVyIHZlcnNpb24KKwloY2ZfMTYJSENGX3ZlcnNpb247ICAgCQkJLy9CQ0QgMiBkaWdpdCBtYWpvciBhbmQgMiBkaWdpdCBtaW5vciBIQ0YgdmVyc2lvbgorCWhjZl8xNglkcml2ZXJfc3RhdDsJCQkvLworCWhjZl8xNglJT19hZGRyZXNzOwkJCQkvL2Jhc2UgSU8gYWRkcmVzcyB1c2VkIGJ5IE5JQworCWhjZl8xNglJT19yYW5nZTsJCQkJLy9yYW5nZSBvZiBJTyBhZGRyZXNzZXMgdXNlZCBieSBOSUMKKwloY2ZfMTYJSVJRX251bWJlcjsJCQkJLy9JbnRlcnJ1cHQgdXNlZCBieSBOSUMKKwloY2ZfMTYJY2FyZF9zdGF0OwkJCQkvKk5JQyBzdGF0dXMKKwkJCQkJCQkJCUAqCTB4ODAwMAlDYXJkIHByZXNlbnQKKwkJCQkJCQkJCUAqCTB4NDAwMAlDYXJkIEVuYWJsZWQKKwkJCQkJCQkJCUAqCTB4MjAwMAlEcml2ZXIgaW5jb21wYXRpYmxlIHdpdGggTklDIFByaW1hcnkgRnVuY3Rpb25zCisJCQkJCQkJCQlAKgkweDEwMDAJRHJpdmVyIGluY29tcGF0aWJsZSB3aXRoIE5JQyBTdGF0aW9uIEZ1bmN0aW9ucwkJCQkqLworCWhjZl8xNglmcmFtZV90eXBlOwkJCQkvKkZyYW1lIHR5cGUKKwkJCQkJCQkJCUAqCTB4MDAwCTgwMi4zCisJCQkJCQkJCQlAKgkweDAwOAk4MDIuMTEJCQkJCQkJCQkJCQkJCSovCisJaGNmXzMyCWRydl9pbmZvOwkJCQkvKmRyaXZlciBzcGVjaWZpYyBpbmZvCisJCQkJCQkJCQkgKiBDRTogdmlydHVhbCBJL08gYmFzZQkJCQkJCQkJCQkJCQkqLworfUNGR19EUlZfSU5GT19TVFJDVDsKKworI2RlZmluZSBDT01QX0lEX0ZXX1BSSQkJCQkJMjEJCS8vUHJpbWFyeSBGdW5jdGlvbnMgRmlybXdhcmUKKyNkZWZpbmUgQ09NUF9JRF9GV19JTlRFUk1FRElBVEUJCQkyMgkJLy9JbnRlcm1lZGlhdGUgRnVuY3Rpb25zIEZpcm13YXJlCisjZGVmaW5lIENPTVBfSURfRldfU1RBCQkJCQkzMQkJLy9TdGF0aW9uIEZ1bmN0aW9ucyBGaXJtd2FyZQorI2RlZmluZSBDT01QX0lEX0ZXX0FQCQkJCQkzMgkJLy9BUCBGdW5jdGlvbnMgRmlybXdhcmUKKyNkZWZpbmUgQ09NUF9JRF9GV19BUF9GQUtFCQkJICAgMzMxCQkvL0FQIEZ1bmN0aW9ucyBGaXJtd2FyZQorCisjZGVmaW5lIENPTVBfSURfTUlOSVBPUlRfTkRJU18zMQkJNDEJCS8vV2luZG93cyA5eC9OVCBNaW5pcG9ydCBORElTIDMuMQorI2RlZmluZSBDT01QX0lEX1BBQ0tFVAkJCQkJNDIJCS8vUGFja2V0CisjZGVmaW5lIENPTVBfSURfT0RJXzE2CQkJCQk0MwkJLy9ET1MgT0RJCisjZGVmaW5lIENPTVBfSURfT0RJXzMyCQkJCQk0NAkJLy8zMi1iaXRzIE9ESQorI2RlZmluZSBDT01QX0lEX01BQ19PUwkJCQkJNDUJCS8vTWFjaW50b3NoIE9TCisjZGVmaW5lIENPTVBfSURfV0lOX0NFCQkJCQk0NgkJLy9XaW5kb3dzIENFIE1pbmlwb3J0CisvLyNkZWZpbmUgQ09NUF9JRF9MSU5VWF9QRAkJCQk0NwkJLy9MaW51eCwgSENGLWxpZ2h0IGJhc2VkLCBNU0Ygc291cmNlIGNvZGUgaW4gUHVibGljIERvbWFpbgorI2RlZmluZSBDT01QX0lEX01JTklQT1JUX05ESVNfNTAJCTQ4CQkvL1dpbmRvd3MgOXgvTlQgTWluaXBvcnQgTkRJUyA1LjAKKyNkZWZpbmUgQ09NUF9JRF9MSU5VWAkJCQkJNDkJCS8qTGludXgsIEdQTCdlZCBIQ0YgYmFzZWQsIGZ1bGwgc291cmNlIGNvZGUgaW4gUHVibGljIERvbWFpbgorCQkJCQkJCQkJCSAgCQkgKnRoYW5rcyB0byBBbmRyZWFzIE5ldWhhdXMJCQkJCQkJCSovCisjZGVmaW5lIENPTVBfSURfUU5YCQkJCQkJNTAJCS8vUU5YCisjZGVmaW5lIENPTVBfSURfTUlOSVBPUlRfTkRJU181MF9VU0IJNTEJCS8vV2luZG93cyA5eC9OVCBNaW5pcG9ydCBORElTIDQuMAorI2RlZmluZSBDT01QX0lEX01JTklQT1JUX05ESVNfNDAJCTUyCQkvL1dpbmRvd3MgOXgvTlQgTWluaXBvcnQgTkRJUyA0LjAKKyNkZWZpbmUgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEJCQk1MwkJLy8gVnhXb3JrcyBFTkQgU3RhdGlvbiBkcml2ZXIKKyNkZWZpbmUgQ09NUF9JRF9WWF9XT1JLU19FTkRBUAkJCTU0CQkvLyBWeFdvcmtzIEVORCBBY2Nlc3MgUG9pbnQgZHJpdmVyCisvLzs/I2RlZmluZSBDT01QX0lEX01BQ19PU18/Pz8/CQkJNTUJCS8vOz9jaGVjayB3aXRoIEhNCisjZGVmaW5lIENPTVBfSURfVlhfV09SS1NfRU5ECQkJNTYJCS8vIFZ4V29ya3MgRU5EIFN0YXRpb24vQWNjZXNzIFBvaW50IGRyaXZlcgorLy8JCQkJCQkJCQkJNTcJCS8vTnVjbGV1c09TQEFSTSBEcml2ZXIuCisjZGVmaW5lIENPTVBfSURfV1NVCQkJCQkJNjMJCS8qIFdhdmVMQU4gU3RhdGlvbiBGaXJtd2FyZSBVcGRhdGUgdXRpbGl0eQorCQkJCQkJCQkJCQkJICoJdmFyaWFudCAxOiBXaW5kb3dzCisJCQkJCQkJCQkJCQkgKgl2YXJpYW50IDI6IERPUworCQkJCQkJCQkJCQkJICovCisjZGVmaW5lIENPTVBfSURfQVAxCQkJCQkJODEJCS8vV2F2ZUxBTi9JRUVFIEFQCisjZGVmaW5lIENPTVBfSURfRUMJCQkJCQk4MwkJLy9XYXZlTEFOL0lFRUUgRXRoZXJuZXQgQ29udmVydGVyCisjZGVmaW5lIENPTVBfSURfVUJMCQkJCQkJODcJCS8vVVNCIEJvb3QgTG9hZGVyCisKKyNkZWZpbmUgQ09NUF9ST0xFX1NVUEwJCQkJCTB4MDAJLy9zdXBwbGllcgorI2RlZmluZSBDT01QX1JPTEVfQUNUCQkJCQkweDAxCS8vYWN0b3IKKworCQkJCQkJCQkJCQkJLy9TdXBwbGllcgkJCSAgLSBhY3RvcgorI2RlZmluZSBDT01QX0lEX01GSQkJCQkJCTB4MDEJLy9Nb2RlbQkJIAkJICAtIEZpcm13YXJlCUkvRgorI2RlZmluZSBDT01QX0lEX0NGSQkJCQkJCTB4MDIJLy9Db250cm9sbGVyCQkgIC0gRmlybXdhcmUJSS9GCisjZGVmaW5lIENPTVBfSURfUFJJCQkJCQkJMHgwMwkvL1ByaW1hcnkgRmlybXdhcmUJICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfU1RBCQkJCQkJMHgwNAkvL1N0YXRpb24gRmlybXdhcmUJICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfRFVJCQkJCQkJMHgwNQkvL0RyaXZlcgkJCSAgLSBVdGlsaXR5CQlJL0YKKyNkZWZpbmUgQ09NUF9JRF9IU0kJCQkJCQkweDA2CS8vSC9XICAgICAgICAgICAgICAgICAtIERyaXZlcgkJSS9GCisjZGVmaW5lIENPTVBfSURfREFJCQkJCQkJMHgwNwkvL0FQSSAgICAgICAgICAgICAgICAgLSBEcml2ZXIJCUkvRgorI2RlZmluZSBDT01QX0lEX0FQRgkJCQkJCTB4MDgJLy9IL1cgICAgICAgICAgICAgICAgIC0gRHJpdmVyCQlJL0YKKyNkZWZpbmUgQ09NUF9JRF9JTlQJCQkJCQkweDA5CS8vSW50ZXJtZWRpYXRlIEZXICAgICAtIERyaXZlcgkJSS9GCisKKyNpZmRlZiBIQ0ZfTEVHQUNZCisjZGVmaW5lIEhDRl9BQ1RfQUNTX1NDQU4JCQkJSENGX0FDVF9QUlNfU0NBTgorI2RlZmluZSBVSUxfQUNUX0FDU19TQ0FOIAkJCQlVSUxfQUNUX1BSU19TQ0FOCisjZGVmaW5lIE1ERF9BQ1RfQUNTX1NDQU4JIAkJCU1ERF9BQ1RfUFJTX1NDQU4KKyNkZWZpbmUgQ0ZHX0FDU19TQ0FOCQkJCQlDRkdfUFJTX1NDQU4KKyNlbmRpZiAvLyBIQ0ZfTEVHQUNZCisKKyNlbmRpZiAvLyBNRERfSAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL21tZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTM4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuYwpAQCAtMCwwICsxLDI1MSBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRklMRQkgIDogbW1kLmMKKyoKKyogREFURSAgICA6ICREYXRlOiAyMDA0LzA3LzIzIDExOjU3OjQ1ICQgICAkUmV2aXNpb246IDEuNCAkCisqIE9yaWdpbmFsOiAyMDA0LzA1LzI4IDE0OjA1OjM1ICAgIFJldmlzaW9uOiAxLjMyICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorKiBPcmlnaW5hbDogMjAwNC8wNS8xMyAxNTozMTo0NSAgICBSZXZpc2lvbjogMS4zMCAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS4yNSAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wOCAxNToxODoxNyAgICBSZXZpc2lvbjogMS4yNCAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuMjIgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjE4ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDMgMTQ6MTA6MTIgICAgUmV2aXNpb246IDEuMTYgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAwOToyNzoxMiAgICBSZXZpc2lvbjogMS4xNCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI5ICAgIFJldmlzaW9uOiAxLjEyICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDEvMzAgMDk6NTk6MzMgICAgUmV2aXNpb246IDEuMTEgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgIDogTmljbyBWYWxzdGVyCisqCisqIERFU0MgICAgOiBDb21tb24gcm91dGluZXMgZm9yIEhDRiwgTVNGLCBVSUwgYXMgd2VsbCBhcyBVU0Ygc291cmNlcworKgorKiBOb3RlOiByZWxhdGl2ZSB0byBBc3NlcnRzLCB0aGUgZm9sbG93aW5nIGNhbiBiZSBvYnNlcnZlZDoKKyoJU2luY2UgdGhlIElGQiBpcyBub3Qga25vd24gaW5zaWRlIHRoZSByb3V0aW5lLCB0aGUgbWFjcm8gSENGQVNTRVJUIGlzIHJlcGxhY2VkIHdpdGggTUREQVNTRVJULgorKglBbHNvIHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBpbiB0aGUgYXNzZXJ0IGlzIHJhaXNlZCBieSBGSUxFX05BTUVfT0ZGU0VUICgyMDAwMCkgdG8gZGlzY3JpbWluYXRlIHRoZQorKglNTUQgQXNzZXJ0cyBmcm9tIEhDRiBhbmQgREhGIGFzc2VydHMuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyogICAgZGlzdHJpYnV0aW9uLgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBEaXNjbGFpbWVyCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyogREFNQUdFLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoY2YuaCIJCQkJLy8gTmVlZGVkIGFzIGxvbmcgYXMgd2UgZG8gbm90IHJlYWxseSBzb3J0IG91dCB0aGUgbWVzcworI2luY2x1ZGUgImhjZmRlZi5oIgkJCQkvLyBnZXQgQ05WX0xJVFRMRV9UT19TSE9SVAorI2luY2x1ZGUgIm1tZC5oIgkJCQkvLyBNb3JlTW9kdWxhckRyaXZlciBjb21tb24gaW5jbHVkZSBmaWxlCisKKy8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyN1bmRlZglGSUxFX05BTUVfT0ZGU0VUCisjZGVmaW5lIEZJTEVfTkFNRV9PRkZTRVQgREhGX0ZJTEVfTkFNRV9PRkZTRVQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKi5NT0RVTEUJCUNGR19SQU5HRV9TUEVDX1NUUkNUKiBtbWRfY2hlY2tfY29tcCggQ0ZHX1JBTkdFU19TVFJDVCAqYWN0cCwgQ0ZHX1NVUF9SQU5HRV9TVFJDVCAqc3VwcCApCisqLlBVUlBPU0UJCUNoZWNrcyBjb21wYXRpYmlsaXR5IGJldHdlZW4gYW4gYWN0b3IgYW5kIGEgc3VwcGxpZXIuCisqCisqLkFSR1VNRU5UUworKglhY3RwCisqCXN1cHAKKyoKKyouUkVUVVJOUworKglOVUxMCWluY29tcGF0aWJsZQorKgk8Pk5VTEwJcG9pbnRlciB0byBtYXRjaGluZyBDRkdfUkFOR0VfU1BFQ19TVFJDVCBzdWJzdHJ1Y3R1cmUgaW4gYWN0b3Itc3RydWN0dXJlIG1hdGNoaW5nIHRoZSBzdXBwbGllcgorKgorKi5OQVJSQVRJVkUKKyoKKyogIFBhcmFtZXRlcnM6CisqCWFjdHAJYWRkcmVzcyBvZiB0aGUgYWN0b3Igc3BlY2lmaWNhdGlvbgorKglzdXBwCWFkZHJlc3Mgb2YgdGhlIHN1cHBsaWVyIHNwZWNpZmljYXRpb24KKyoKKyoJRGVzY3JpcHRpb246IG1tZF9jaGVja19jb21wIGlzIGEgc3VwcG9ydCByb3V0aW5lIHRvIGNoZWNrIHRoZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gYW4gYWN0b3IgYW5kIGEKKyoJc3VwcGxpZXIuICBtbWRfY2hlY2tfY29tcCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZSBhY3RwIGFuZCBzdXBwIHN0cnVjdHVyZXMuIFRoaXMgaXMKKyoJYWNoaWV2ZWQgYnkgY2hlY2tpbmcgdGhlICJib3R0b20iIG9yICJyb2xlIiBmaWVsZHMgb2YgdGhlc2Ugc3RydWN0dXJlcy4gU2luY2UgdGhlc2UgZmllbGRzIGFyZSByZXN0cmljdGVkCisqCXRvIGEgbGltaXRlZCByYW5nZSwgY29tcGFyaW5nIHRoZSBjb250ZW50cyB0byBhIHZhbHVlIHdpdGggYSBrbm93biBlbmRpYW4tZXNzIGdpdmVzIGEgY2x1ZSB0byB0aGVpciBhY3R1YWwKKyoJZW5kaWFuZXNzLgorKgorKi5ESUFHUkFNCisqMWE6IFRoZSByb2xlLWZpZWxkIG9mIHRoZSBhY3RvciBzdHJ1Y3R1cmUgaGFzIGEga25vd24gbm9uLXplcm8sIG5vdCAiYnl0ZSBzeW1tZXRyaWMiIHZhbHVlIChuYW1lbHkKKyoJQ09NUF9ST0xFX0FDVCBvciAweDAwMDEpLCBzbyBpZiBhbmQgb25seSB0aGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBtYXRjaGVzIENPTVBfUk9MRV9BQ1QgKGluIE5hdGl2ZQorKglFbmRpYW4gZm9ybWF0KSwgdGhlIGFjdG9yIHN0cnVjdHVyZSBpcyBOYXRpdmUgRW5kaWFuLgorKjJhOiBTaW5jZSB0aGUgcm9sZS1maWVsZCBvZiB0aGUgc3VwcGxpZXIgc3RydWN0dXJlIGlzIDB4MDAwMCwgdGhlIHRlc3QgYXMgdXNlZCBmb3IgdGhlIGFjdG9yIGRvZXMgbm90IHdvcmsKKyoJZm9yIGEgc3VwcGxpZXIuIEEgc3VwcGxpZXIgaGFzIGFsd2F5cyBleGFjdGx5IDEgdmFyaWFudCx0b3AsYm90dG9tIHJlY29yZCB3aXRoIChvZmZpY2lhbGx5LCBidXQgc2VlIHRoZQorKglub3RlIGJlbG93KSBlYWNoIG9mIHRoZXNlIDMgdmFsdWVzIGluIHRoZSByYW5nZSAxIHRocm91Z2ggOTksIHNvIG9uZSBieXRlIG9mIHRoZSB3b3JkIHZhbHVlIG9mIHZhcmlhbnQsCisqCXRvcCBhbmQgYm90dG9tIHdvcmRzIGlzIDB4MDAgYW5kIHRoZSBvdGhlciBieXRlIGlzIG5vbi16ZXJvLiBXaGV0aGVyIHRoZSBsb3dlc3QgYWRkcmVzcyBieXRlIG9yIHRoZQorKgloaWdoZXN0IGFkZHJlc3MgYnl0ZSBpcyBub24temVybyBkZXBlbmRzIG9uIHRoZSBFbmRpYW5lc3Mgb2YgdGhlIExUVi4gSWYgYW5kIG9ubHkgaWYgdGhlIHdvcmQgdmFsdWUgb2YKKyoJYm90dG9tIGlzIGxlc3MgdGhhbiAweDAxMDAsIHRoZSBzdXBwbGllciBpcyBOYXRpdmUgRW5kaWFuLgorKglOT1RFOiB0aGUgdmFyaWFudCBmaWVsZCBvZiB0aGUgc3VwcGxpZXIgc3RydWN0dXJlIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhlIEVuZGlhbiBEZXRlY3Rpb24gQWxnb3JpdGhtLAorKgliZWNhdXNlIGEgYSB6ZXJvLXZhbHVlZCB2YXJpYW50IGhhcyBiZWVuIHVzZWQgYXMgQ29udHJvbGxlZCBEZXBsb3ltZW50IGluZGljYXRpb24gaW4gdGhlIHBhc3QuCisqCU5vdGU6IEFuIGFjdG9yIG1heSBoYXZlIG11bHRpcGxlIHNldHMgb2YgdmFyaWFudCx0b3AsYm90dG9tIHJlY29yZHMsIGluY2x1ZGluZyBkdW1teSBzZXRzIHdpdGggdmFyaWFudCwKKyoJdG9wIGFuZCBib3R0b20gZmllbGRzIHdpdGggYSB6ZXJvLXZhbHVlLiBBcyBhIGNvbnNlcXVlbmNlIHRoZSBlbmRpYW5lc3Mgb2YgdGhlIGFjdG9yIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAorKgliYXNlZCBvbiBpdHMgdmFyaWFudCx0b3AsYm90dG9tIHZhbHVlcy4KKyoKKyoJTm90ZTogdGhlIEwgYW5kIFQgZmllbGQgb2YgdGhlIHN0cnVjdHVyZXMgYXJlIGFsd2F5cyBpbiBOYXRpdmUgRW5kaWFuIGZvcm1hdCwgc28geW91IGNhbiBub3QgZHJhdworKgljb25jbHVzaW9ucyBjb25jZXJuaW5nIHRoZSBFbmRpYW5lc3Mgb2YgdGhlIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGVzZSB0d28gZmllbGRzLgorKgorKjFiLzJiCisqCVRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIENGR19SQU5HRV9TUEVDX0JZVEVfU1RSQ1QgaXMgdG8gZ2l2ZSBlYXN5IGFjY2VzcyB0byB0aGUgbm9uLXplcm8gYnl0ZSBvZiB0aGUgd29yZAorKgl2YWx1ZSBvZiB2YXJpYW50LCB0b3AgYW5kIGJvdHRvbS4gVGhlIHZhcmlhYmxlcyBzdXBfZW5kaWFuIGFuZCBhY3RfZW5kaWFuIGFyZSB1c2VkIGZvciB0aGUgc3VwcGxpZXIgYW5kCisqCWFjdG9yIHN0cnVjdHVyZSByZXNwZWN0aXZlbHkuIFRoZXNlIHZhcmlhYmxlcyBtdXN0IGJlIDAgd2hlbiB0aGUgc3RydWN0dXJlIGhhcyBMRSBmb3JtYXQgYW5kIDEgaWYgdGhlCisqCXN0cnVjdHVyZSBoYXMgQkUgZm9ybWF0LiBUaGlzIGNhbiBiZSBwaHJhc2VkIGFzOgorKgl0aGUgdmFyaWFibGUgaXMgZmFsc2UgKGkuZSAweDAwMDApIGlmIGVpdGhlcgorKgkJKHRoZSBwbGF0Zm9ybSBpcyBMRSBhbmQgdGhlIExUViBpcyB0aGUgc2FtZSBhcyB0aGUgcGxhdGZvcm0pCisqCW9yCisqCQkodGhlIHBsYXRmb3JtIGlzIEJFIGFuZCB0aGUgTFRWIGRpZmZlcnMgZnJvbSB0aGUgcGxhdGZvcm0pLgorKgl0aGUgdmFyaWFibGUgaXMgdHJ1ZSAoaS5lIDB4MDAwMSkgaWYgZWl0aGVyCisqCQkodGhlIHBsYXRmb3JtIGlzIEJFIGFuZCB0aGUgTFRWIGlzIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSkKKyoJb3IKKyoJCSh0aGUgcGxhdGZvcm0gaXMgTEUgYW5kIHRoZSBMVFYgZGlmZmVycyBmcm9tIHRoZSBwbGF0Zm9ybSkuCisqCisqCUFsdGVybmF0aXZlbHkgdGhpcyBjYW4gYmUgcGhyYXNlZCBhczoKKyoJaWYgdGhlIHBsYXRmb3JtIGlzIExFCisqCQlpZiB0aGUgTFRWIGlzIExFIChpLmUgdGhlIHNhbWUgYXMgdGhlIHBsYXRmb3JtKSwgdGhlbiB0aGUgdmFyaWFibGUgPSAwCisqCQllbHNlICh0aGUgTFRWIGlzIEJFIChpLmUuIGRpZmZlcmVudCBmcm9tIHRoZSBwbGF0Zm9ybSkgKSwgdGhlbiB0aGUgdmFyaWFibGUgPSAxCisqCWlmIHRoZSBwbGF0Zm9ybSBpcyBCRQorKgkJaWYgdGhlIExUViBpcyBCRSAoaS5lIHRoZSBzYW1lIGFzIHRoZSBwbGF0Zm9ybSksIHRoZW4gdGhlIHZhcmlhYmxlID0gMQorKgkJZWxzZSAodGhlIExUViBpcyBMRSAoaS5lLiBkaWZmZXJlbnQgZnJvbSB0aGUgcGxhdGZvcm0pICksIHRoZW4gdGhlIHZhcmlhYmxlID0gMAorKgorKglUaGlzIGlzIGltcGxlbWVudGVkIGFzOgorKgkjaWYgSENGX0JJR19FTkRJQU4gPT0gMAkvL3BsYXRmb3JtIGlzIExFCisqCQlzdXAvYWN0X2VuZGlhbiBiZWNvbWVzIHJldmVyc2Ugb2Ygc3RydWN0dXJlLWVuZGlhbmVzcyBhcyBkZXRlcm1pbmVkIGluIDFhLzFiCisqCSNlbmRpZgorKjY6CUVhY2ggb2YgdGhlIGFjdG9yIHZhcmlhbnQtYm90dG9tLXRvcCByZWNvcmRzIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgKHNpbmdsZSkgc3VwcGxpZXIgdmFyaWFudC1ib3R0b20tdG9wCisqCXJhbmdlIHRpbGwgZWl0aGVyIGFuIGFjY2VwdGFibGUgbWF0Y2ggaXMgZm91bmQgb3IgYWxsIGFjdG9yIHJlY29yZHMgYXJlIHRyaWVkLiBBcyBleHBsYWluZWQgYWJvdmUsIGR1ZSB0bworKgl0aGUgbGltaXRlZCByYW5nZXMgb2YgdGhlc2UgdmFsdWVzLCBjaGVja2luZyBhIGJ5dGUgaXMgYWNjZXB0YWJsZSBhbmQgc3VpdGFibGUuCisqODoJZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBtYXRjaCB3YXMgZm91bmQgb3Igbm90IChhcyByZWZsZWN0ZWQgYnkgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHZhcmlhYmxlIG9mIHRoZQorKglmb3IgbG9vcCksIHRoZSBOVUxMIHBvaW50ZXIgb3IgYSBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBOdW1iZXIvQm90dG9tL1RvcCByZWNvcmQgb2YgdGhlIEFjdG9yIHN0cnVjdHVyZQorKglpcyByZXR1cm5lZC4KKyoJQXMgYW4gYWRkaXRpb25hbCBzYWZldHksIGNoZWNraW5nIHRoZSBzdXBwbGllciBsZW5ndGggcHJvdGVjdHMgYWdhaW5zdCBpbnZhbGlkIFN1cHBsaWVyIHN0cnVjdHVyZXMsIHdoaWNoCisqCW1heSBiZSBjYXVzZWQgYnkgZmFpbGluZyBoY2ZfZ2V0X2luZm8gKGluIHdoaWNoIGNhc2UgdGhlIGxlbi1maWVsZCBpcyB6ZXJvKS4gTm90ZSB0aGF0IHRoZSBjb250cmFwdGlvbgorKgkic3VwcC0+bGVuICE9IHNpemVvZihDRkdfU1VQX1JBTkdFX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDEiCisqCWRpZCB0dXJuIG91dCBub3QgdG8gd29yayBmb3IgYSBjb21waWxlciB3aGljaCBwYWRkZWQgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorKgorKiBOb3RlOiB3aGVuIGNvbnN1bHRpbmcgcmVmZXJlbmNlcyBsaWtlIERlc2lnbk5vdGVzIGFuZCBBcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbnMgdGhlcmUgaXMgYSBjb25mdXNpbmcgdXNlCisqCW9mIHRoZSBub3Rpb25zIG51bWJlciBhbmQgdmFyaWFudC4gVGhpcyByZXN1bHRlZCBpbiBhbiBpbmNvbnNpc3RlbnQgdXNlIGluIHRoZSBIQ0Ygbm9tZW5jbGF0dXJlIGFzIHdlbGwuCisqCVRoaXMgbWFrZXMgdGhlIGxvZ2ljIGhhcmQgdG8gZm9sbG93IGFuZCBvbmUgaGFzIHRvIGJlIHZlcnkgbXVjaCBhd2FyZSBvZiB0aGUgY29udGV4dCB3aGVuIHdhbGtpbmcgdGhyb3VnaAorKgl0aGUgY29kZS4KKyogTk9URTogVGhlIEVuZGlhbiBEZXRlY3Rpb24gQWxnb3JpdGhtIHBsYWNlcyBsaW1pdGF0aW9ucyBvbiBmdXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgZmllbGRzLCBpLmUuIHRoZXkgc2hvdWxkCisqCXN0YXkgd2l0aGluIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBib3VuZGFyaWVzIG9mIDEgdGhyb3VnaCA5OSAoYWx0aG91Z2ggMSB0aHJvdWdoIDI1NSkgd291bGQgd29yayBhcyB3ZWxsCisqCWFuZCB0aGVyZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBhIHplcm8gdmFsdWUgZm9yIHRoZSBib3R0b20gb2YgYSB2YWxpZCBzdXBwbGllci4KKyogTm90ZTogcmVsYXRpdmUgdG8gQXNzZXJ0cywgdGhlIGZvbGxvd2luZyBjYW4gYmUgb2JzZXJ2ZWQ6CisqCTE6IFN1cHBsaWVyIHZhcmlhbnQgMHgwMDAwIGhhcyBiZWVuIHVzZWQgZm9yIENvbnRyb2xsZWQgRGVwbG95bWVudAorKgkyOiBBbiBhY3RvciBtYXkgaGF2ZSBvbmUgb3IgbW9yZSB2YXJpYW50IHJlY29yZCBzcGVjaWZpY2F0aW9ucyB3aXRoIGEgdG9wIG9mIHplcm8gYW5kIGEgbm9uLXplcm8gYm90dG9tCisqCXRvIG92ZXJyaWRlIHRoZSBIQ0YgZGVmYXVsdCBzdXBwb3J0IG9mIGEgcGFydGljdWxhciB2YXJpYW50IGJ5IHRoZSBNU0YgcHJvZ3JhbW1lciB2aWEgaGNmY2ZnLmgKKyoJMzoJQW4gYWN0b3IgcmFuZ2UgY2FuIGJlIHNwZWNpZmllZCBhcyBhbGwgemVyb3MsIGUuZy4gYXMgcGFkZGluZyBpbiB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlybXdhcmUKKyoJaW1hZ2UgZmlsZXMuCisqLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NGR19SQU5HRV9TUEVDX1NUUkNUKgorbW1kX2NoZWNrX2NvbXAoIENGR19SQU5HRVNfU1RSQ1QgKmFjdHAsIENGR19TVVBfUkFOR0VfU1RSQ1QgKnN1cHAgKQoreworCitDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUICAqYWN0cSA9IChDRkdfUkFOR0VfU1BFQ19CWVRFX1NUUkNUKilhY3RwLT52YXJfcmVjOworQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVCAgKnN1cHEgPSAoQ0ZHX1JBTkdFX1NQRUNfQllURV9TVFJDVCopJihzdXBwLT52YXJpYW50KTsKK2hjZl8xNglpOworaW50CQlhY3RfZW5kaWFuOwkJCQkJLy9hY3RvciBlbmRpYW4gZmxhZworaW50CQlzdXBfZW5kaWFuOwkJCQkJLy9zdXBwbGllciBlbmRpYW4gZmxhZworCisJYWN0X2VuZGlhbiA9IGFjdHAtPnJvbGUgPT0gQ09NUF9ST0xFX0FDVDsJLy90cnVlIGlmIG5hdGl2ZSBlbmRpYW4JCQkJLyogMWEgKi8KKwlzdXBfZW5kaWFuID0gc3VwcC0+Ym90dG9tIDwgMHgwMTAwOwkJIAkvL3RydWUgaWYgbmF0aXZlIGVuZGlhbgkJCQkvKiAyYSAqLworCisjaWYgSENGX0FTU0VSVAorCU1NREFTU0VSVCggc3VwcC0+bGVuID09IDYsIAkJCQkJCQkJCQkJCQkJCQlzdXBwLT5sZW4gKQorCU1NREFTU0VSVCggYWN0cC0+bGVuID49IDYgJiYgYWN0cC0+bGVuJTMgPT0gMCwgCQkJCQkJCQkJCQlhY3RwLT5sZW4gKQorCisJaWYgKCBhY3RfZW5kaWFuICkgewkJCQkJCQkvL25hdGl2ZSBlbmRpYW4KKwkJTU1EQVNTRVJUKCBhY3RwLT5yb2xlID09IENPTVBfUk9MRV9BQ1QsCQkJCQkJCQkJCQkJYWN0cC0+cm9sZSApCisJCU1NREFTU0VSVCggMSA8PSBhY3RwLT5pZCAmJiBhY3RwLT5pZCA8PSA5OSwgIAkJCQkJCQkJCQlhY3RwLT5pZCApCisJfSBlbHNlIHsJCQkJCQkJCQkvL25vbi1uYXRpdmUgZW5kaWFuCisJCU1NREFTU0VSVCggYWN0cC0+cm9sZSA9PSBDTlZfRU5EX1NIT1JUKENPTVBfUk9MRV9BQ1QpLAkgCQkJCQkJCWFjdHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChhY3RwLT5pZCkgJiYgQ05WX0VORF9TSE9SVChhY3RwLT5pZCkgPD0gOTksCQkJCWFjdHAtPmlkICkKKwl9CisJaWYgKCBzdXBfZW5kaWFuICkgewkJCQkJCQkvL25hdGl2ZSBlbmRpYW4KKwkJTU1EQVNTRVJUKCBzdXBwLT5yb2xlID09IENPTVBfUk9MRV9TVVBMLCAJCQkJCQkJCQkJCXN1cHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gc3VwcC0+aWQgICAgICAmJiBzdXBwLT5pZCA8PSA5OSwgIAkJCQkJCQkJCXN1cHAtPmlkICkKKwkJTU1EQVNTRVJUKCAxIDw9IHN1cHAtPnZhcmlhbnQgJiYgc3VwcC0+dmFyaWFudCA8PSA5OSwgIAkJCQkJCQkJc3VwcC0+dmFyaWFudCApCisJCU1NREFTU0VSVCggMSA8PSBzdXBwLT5ib3R0b20gICYmIHN1cHAtPmJvdHRvbSA8PSA5OSwgCQkJCQkJCQlzdXBwLT5ib3R0b20gKQorCQlNTURBU1NFUlQoIDEgPD0gc3VwcC0+dG9wICAgICAmJiBzdXBwLT50b3AgPD0gOTksIAkJIAkJCQkJCQlzdXBwLT50b3AgKQorCQlNTURBU1NFUlQoIHN1cHAtPmJvdHRvbSA8PSBzdXBwLT50b3AsCQkJCQkJCXN1cHAtPmJvdHRvbSA8PCA4IHwgc3VwcC0+dG9wICkKKwl9IGVsc2UgewkJCQkJCQkJCS8vbm9uLW5hdGl2ZSBlbmRpYW4KKwkJTU1EQVNTRVJUKCBzdXBwLT5yb2xlID09IENOVl9FTkRfU0hPUlQoQ09NUF9ST0xFX1NVUEwpLCAJCQkJCQkJCXN1cHAtPnJvbGUgKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChzdXBwLT5pZCkgJiYgQ05WX0VORF9TSE9SVChzdXBwLT5pZCkgPD0gOTksCQkJCXN1cHAtPmlkICkKKwkJTU1EQVNTRVJUKCAxIDw9IENOVl9FTkRfU0hPUlQoc3VwcC0+dmFyaWFudCkgJiYgQ05WX0VORF9TSE9SVChzdXBwLT52YXJpYW50KSA8PSA5OSwJCXN1cHAtPnZhcmlhbnQgKQorCQlNTURBU1NFUlQoIDEgPD0gQ05WX0VORF9TSE9SVChzdXBwLT5ib3R0b20pICAmJiBDTlZfRU5EX1NIT1JUKHN1cHAtPmJvdHRvbSkgPD05OSwJCXN1cHAtPmJvdHRvbSApCisJCU1NREFTU0VSVCggMSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCkgICAgICYmIENOVl9FTkRfU0hPUlQoc3VwcC0+dG9wKSA8PTk5LCAgCQlzdXBwLT50b3AgKQorCQlNTURBU1NFUlQoIENOVl9FTkRfU0hPUlQoc3VwcC0+Ym90dG9tKSA8PSBDTlZfRU5EX1NIT1JUKHN1cHAtPnRvcCksCXN1cHAtPmJvdHRvbSA8PCA4IHwJc3VwcC0+dG9wICkKKwl9CisjZW5kaWYgLy8gSENGX0FTU0VSVAorCisjaWYgSENGX0JJR19FTkRJQU4gPT0gMAorCWFjdF9lbmRpYW4gPSAhYWN0X2VuZGlhbjsJCQkJCQkJCQkJCQkJCQkJCQkvKiAxYiovCisJc3VwX2VuZGlhbiA9ICFzdXBfZW5kaWFuOwkJCQkJCQkJCQkJCQkJCQkJCS8qIDJiKi8KKyNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgorCisJZm9yICggaSA9IGFjdHAtPmxlbiA7IGkgPiAzOyBhY3RxKyssIGkgLT0gMyApIHsJCQkJCQkJCQkJCQkJLyogNiAqLworCQlNTURBU1NFUlQoIGFjdHEtPnZhcmlhbnRbYWN0X2VuZGlhbl0gPD0gOTksIGk8PDggfCBhY3RxLT52YXJpYW50W2FjdF9lbmRpYW5dICkKKwkJTU1EQVNTRVJUKCBhY3RxLT5ib3R0b21bYWN0X2VuZGlhbl0gPD0gOTkgLCBpPDw4IHwgYWN0cS0+Ym90dG9tW2FjdF9lbmRpYW5dICkKKwkJTU1EQVNTRVJUKCBhY3RxLT50b3BbYWN0X2VuZGlhbl0gPD0gOTkJICAsIGk8PDggfCBhY3RxLT50b3BbYWN0X2VuZGlhbl0gKQorCQlNTURBU1NFUlQoIGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSA8PSBhY3RxLT50b3BbYWN0X2VuZGlhbl0sIGk8PDggfCBhY3RxLT5ib3R0b21bYWN0X2VuZGlhbl0gKQorCQlpZiAoIGFjdHEtPnZhcmlhbnRbYWN0X2VuZGlhbl0gPT0gc3VwcS0+dmFyaWFudFtzdXBfZW5kaWFuXSAmJgorCQkJIGFjdHEtPmJvdHRvbVthY3RfZW5kaWFuXSAgPD0gc3VwcS0+dG9wW3N1cF9lbmRpYW5dICYmCisJCQkgYWN0cS0+dG9wW2FjdF9lbmRpYW5dICAgICA+PSBzdXBxLT5ib3R0b21bc3VwX2VuZGlhbl0KKwkJICAgKSBicmVhazsKKwl9CisJaWYgKCBpIDw9IDMgfHwgc3VwcC0+bGVuICE9IDYgLypzaXplb2YoQ0ZHX1NVUF9SQU5HRV9TVFJDVCkvc2l6ZW9mKGhjZl8xNikgLSAxICovICkgeworCSAgIGFjdHEgPSBOVUxMOwkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDggKi8KKwl9CisjaWYgSENGX0FTU0VSVAorCWlmICggYWN0cSA9PSBOVUxMICkgeworCQlmb3IgKCBpID0gMDsgaSA8PSBzdXBwLT5sZW47IGkgKz0gMiApIHsKKwkJCU1NREFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCAoKGhjZl8xNiopc3VwcClbaV0sICgoaGNmXzE2KilzdXBwKVtpKzFdICkgKTsKKwkJfQorCQlmb3IgKCBpID0gMDsgaSA8PSBhY3RwLT5sZW47IGkgKz0gMiApIHsKKwkJCU1NREFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCAoKGhjZl8xNiopYWN0cClbaV0sICgoaGNmXzE2KilhY3RwKVtpKzFdICkgKTsKKwkJfQorCX0KKyNlbmRpZiAvLyBIQ0ZfQVNTRVJUCisJcmV0dXJuIChDRkdfUkFOR0VfU1BFQ19TVFJDVCopYWN0cTsKK30gLy8gbW1kX2NoZWNrX2NvbXAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg5MGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbW1kLmgKQEAgLTAsMCArMSw3OCBAQAorCisvLyAgIHZpbTp0dz0xMTA6dHM9NDoKKyNpZm5kZWYgTU1EX0gKKyNkZWZpbmUgTU1EX0ggMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGSUxFCSAgOiBtbWQuaAorKgorKiBEQVRFICAgIDogJERhdGU6IDIwMDQvMDcvMTkgMDg6MTY6MTQgJCAgICRSZXZpc2lvbjogMS4yICQKKyogT3JpZ2luYWw6IDIwMDQvMDUvMTcgMDc6MzM6MTQgICAgUmV2aXNpb246IDEuMTggICAgICBUYWc6IGhjZjdfdDIwMDQwNjAyXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA1LzExIDA2OjIyOjU5ICAgIFJldmlzaW9uOiAxLjE3ICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzE1IDA5OjI0OjQyICAgIFJldmlzaW9uOiAxLjEzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNDE1XzAxCisqIE9yaWdpbmFsOiAyMDA0LzA0LzA4IDE1OjE4OjE3ICAgIFJldmlzaW9uOiAxLjEyICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorKiBPcmlnaW5hbDogMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS4xMCAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyogT3JpZ2luYWw6IDIwMDQvMDMvMDQgMTY6NDc6NTAgICAgUmV2aXNpb246IDEuNyAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDEyOjQ3OjA1ICAgIFJldmlzaW9uOiAxLjYgICAgICBUYWc6IHQyMDA0MDMwNF8wMQorKiBPcmlnaW5hbDogMjAwNC8wMi8yNSAxNDoxNDozOSAgICBSZXZpc2lvbjogMS41ICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyogT3JpZ2luYWw6IDIwMDQvMDIvMjQgMTM6MDA6MjkgICAgUmV2aXNpb246IDEuNCAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisqIE9yaWdpbmFsOiAyMDA0LzAxLzMwIDA5OjU5OjMzICAgIFJldmlzaW9uOiAxLjMgICAgICBUYWc6IHQyMDA0MDIxOV8wMQorKgorKiBBVVRIT1IgIDogTmljbyBWYWxzdGVyCisqCisqIERFU0MgICAgOiBEZWZpbml0aW9ucyBhbmQgUHJvdG90eXBlcyBmb3IgSENGLCBNU0YsIFVJTCBhcyB3ZWxsIGFzIFVTRiBzb3VyY2VzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyoKKyogU09GVFdBUkUgTElDRU5TRQorKgorKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyoKKyogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKKyogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyogICAgZGlzdHJpYnV0aW9uLgorKgorKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyoKKyogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBEaXNjbGFpbWVyCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyogREFNQUdFLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEhDRl9ICisjaW5jbHVkZSAiaGNmLmgiCS8vanVzdCB0byBnZXQgZ29pbmcgd2l0aCBzd2lnCisjZW5kaWYKKworRVhURVJOX0MgQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QqIG1tZF9jaGVja19jb21wKCBDRkdfUkFOR0VTX1NUUkNUICphY3RwLCBDRkdfU1VQX1JBTkdFX1NUUkNUICpzdXBwICk7CisKKyNlbmRpZiAvLyBNTURfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9zdGFfaDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWEzODUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyLmMKQEAgLTAsMCArMSw0NDgwIEBACisvKgorICogRmlsZToJc3RhX2gyNC4yMzYKKyAqCisgKiBBYnN0cmFjdDoJVGhpcyBmaWxlIGNvbnRhaW5zIG1lbW9yeSBpbWFnZSAnZndfaW1hZ2UnLgorICoKKyAqIENvbnRlbnRzOglUb3RhbCBzaXplIG9mIHRoZSBtZW1vcnkgaW1hZ2U6IDY5Mjk0IGJ5dGVzLgorICoJCVRvdGFsIG51bWJlciBvZiBibG9ja3M6IDQgYmxvY2tzLgorICoJCUJsb2NrICAxIDogbG9hZCBhZGRyZXNzIDAwMDAwMDYwLCAzOTAgYnl0ZXMuCisgKgkJQmxvY2sgIDIgOiBsb2FkIGFkZHJlc3MgMDAwMDBDMTYsIDk0OTYgYnl0ZXMuCisgKgkJQmxvY2sgIDMgOiBsb2FkIGFkZHJlc3MgMDAxRTMxMkUsIDE1Nzg2IGJ5dGVzLgorICoJCUJsb2NrICA0IDogbG9hZCBhZGRyZXNzIDAwMUY0MDAwLCA0MzYyMiBieXRlcy4KKyAqCisgKiBJZGVudGl0eToJY29tcG9uZW50IGlkOiAzMSAodmFyaWFudCAzKSB2ZXJzaW9uIDIuMzYKKyAqCisgKiBDb21wYXRpYmlsaXR5OgorICoJCXN1cHBseWluZyBpbnRlcmZhY2UgNCAodmFyaWFudCAyKSA6IDIgLSA1CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAxICh2YXJpYW50IDQpIDogNiAtIDcKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNSkgOiA2IC0gNworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA2KSA6IDYgLSA3CisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAyICh2YXJpYW50IDIpIDogMSAtIDIKKyAqCisgKiBHZW5lcmF0ZWQ6CWJ5IGc6XGZ3XGZ1cHUzLmV4ZSB2ZXJzaW9uIDQuMjYKKyAqCisgKiBDb21tYW5kbGluZToJZzpcZndcZnVwdTMuZXhlIC9mPTQgL249ZndfaW1hZ2UgL2k9cjMwMjM2MDAuaGV4CisgKi8KKworCisjaW5jbHVkZSAiaGNmY2ZnLmgiCQkJCS8vIHRvIGdldCBoY2ZfMTYgZXRjIGRlZmluZWQgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBzZXR0aW5ncyB3aGljaCBpbmx1ZW5jZSBtZGQuaCBvciBkaGYuaAorI2luY2x1ZGUgIm1kZC5oIiAgIAkJCQkvL3RvIGdldCBDT01QX0lEX1NUQSBldGMgZGVmaW5lZAorI2luY2x1ZGUgImRoZi5oIiAgIAkJCQkvL3VzZWQgdG8gYmUgImZoZm1lbS5oIiwgdG8gZ2V0IG1lbWJsb2NrLHBsdWdyZWNvcmQsCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8xX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQywgMHgwRCwgMHgwMCwgMHgwMCwKKwkgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg4NiwgMHgxOSwgMHg4NiwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwNywgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgxMCwgMHgyNywgMHgxMCwgMHgyNywKKwkgMHgxNCwgMHgwMCwgMHhEMCwgMHgwNywgMHhEMCwgMHgwNywgMHgxMCwgMHgyNywgMHgyRiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwNSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgyNywgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHgzMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwOSwgMHgyQiwgMHgwOSwgMHgyQiwgMHgwOSwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2RSwgMHgwMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwKKwkgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzFfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMl9kYXRhW10gPSB7CisJIDB4NEIsIDB4QTMsIDB4MDAsIDB4MEEsIDB4MTAsIDB4MDEsIDB4NjgsIDB4QTQsIDB4QjAsIDB4MDEsIDB4ODQsIDB4MDEsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsCisJIDB4NDQsIDB4NDQsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzAsIDB4MzMsIDB4MzEsIDB4MzMsIDB4MzIsIDB4MzMsIDB4MzIsIDB4MzMsIDB4OTAsIDB4MDAsCisJIDB4NzgsIDB4MDQsIDB4QUUsIDB4RTQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsCisJIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QzYsIDB4ODQsIDB4RjgsIDB4OTksIDB4RUUsCisJIDB4OEQsIDB4RjYsIDB4MEQsIDB4RkYsIDB4QkQsIDB4RDYsIDB4QjEsIDB4REUsIDB4NTQsIDB4OTEsIDB4NTAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4QTksIDB4Q0UsCisJIDB4N0QsIDB4NTYsIDB4MTksIDB4RTcsIDB4NjIsIDB4QjUsIDB4RTYsIDB4NEQsIDB4OUEsIDB4RUMsIDB4NDUsIDB4OEYsIDB4OUQsIDB4MUYsIDB4NDAsIDB4ODksCisJIDB4ODcsIDB4RkEsIDB4MTUsIDB4RUYsIDB4RUIsIDB4QjIsIDB4QzksIDB4OEUsIDB4MEIsIDB4RkIsIDB4RUMsIDB4NDEsIDB4NjcsIDB4QjMsIDB4RkQsIDB4NUYsCisJIDB4RUEsIDB4NDUsIDB4QkYsIDB4MjMsIDB4RjcsIDB4NTMsIDB4OTYsIDB4RTQsIDB4NUIsIDB4OUIsIDB4QzIsIDB4NzUsIDB4MUMsIDB4RTEsIDB4QUUsIDB4M0QsCisJIDB4NkEsIDB4NEMsIDB4NUEsIDB4NkMsIDB4NDEsIDB4N0UsIDB4MDIsIDB4RjUsIDB4NEYsIDB4ODMsIDB4NUMsIDB4NjgsIDB4RjQsIDB4NTEsIDB4MzQsIDB4RDEsCisJIDB4MDgsIDB4RjksIDB4OTMsIDB4RTIsIDB4NzMsIDB4QUIsIDB4NTMsIDB4NjIsIDB4M0YsIDB4MkEsIDB4MEMsIDB4MDgsIDB4NTIsIDB4OTUsIDB4NjUsIDB4NDYsCisJIDB4NUUsIDB4OUQsIDB4MjgsIDB4MzAsIDB4QTEsIDB4MzcsIDB4MEYsIDB4MEEsIDB4QjUsIDB4MkYsIDB4MDksIDB4MEUsIDB4MzYsIDB4MjQsIDB4OUIsIDB4MUIsCisJIDB4M0QsIDB4REYsIDB4MjYsIDB4Q0QsIDB4NjksIDB4NEUsIDB4Q0QsIDB4N0YsIDB4OUYsIDB4RUEsIDB4MUIsIDB4MTIsIDB4OUUsIDB4MUQsIDB4NzQsIDB4NTgsCisJIDB4MkUsIDB4MzQsIDB4MkQsIDB4MzYsIDB4QjIsIDB4REMsIDB4RUUsIDB4QjQsIDB4RkIsIDB4NUIsIDB4RjYsIDB4QTQsIDB4NEQsIDB4NzYsIDB4NjEsIDB4QjcsCisJIDB4Q0UsIDB4N0QsIDB4N0IsIDB4NTIsIDB4M0UsIDB4REQsIDB4NzEsIDB4NUUsIDB4OTcsIDB4MTMsIDB4RjUsIDB4QTYsIDB4NjgsIDB4QjksIDB4MDAsIDB4MDAsCisJIDB4MkMsIDB4QzEsIDB4NjAsIDB4NDAsIDB4MUYsIDB4RTMsIDB4QzgsIDB4NzksIDB4RUQsIDB4QjYsIDB4QkUsIDB4RDQsIDB4NDYsIDB4OEQsIDB4RDksIDB4NjcsCisJIDB4NEIsIDB4NzIsIDB4REUsIDB4OTQsIDB4RDQsIDB4OTgsIDB4RTgsIDB4QjAsIDB4NEEsIDB4ODUsIDB4NkIsIDB4QkIsIDB4MkEsIDB4QzUsIDB4RTUsIDB4NEYsCisJIDB4MTYsIDB4RUQsIDB4QzUsIDB4ODYsIDB4RDcsIDB4OUEsIDB4NTUsIDB4NjYsIDB4OTQsIDB4MTEsIDB4Q0YsIDB4OEEsIDB4MTAsIDB4RTksIDB4MDYsIDB4MDQsCisJIDB4ODEsIDB4RkUsIDB4RjAsIDB4QTAsIDB4NDQsIDB4NzgsIDB4QkEsIDB4MjUsIDB4RTMsIDB4NEIsIDB4RjMsIDB4QTIsIDB4RkUsIDB4NUQsIDB4QzAsIDB4ODAsCisJIDB4OEEsIDB4MDUsIDB4QUQsIDB4M0YsIDB4QkMsIDB4MjEsIDB4NDgsIDB4NzAsIDB4MDQsIDB4RjEsIDB4REYsIDB4NjMsIDB4QzEsIDB4NzcsIDB4NzUsIDB4QUYsCisJIDB4NjMsIDB4NDIsIDB4MzAsIDB4MjAsIDB4MUEsIDB4RTUsIDB4MEUsIDB4RkQsIDB4NkQsIDB4QkYsIDB4NEMsIDB4ODEsIDB4MTQsIDB4MTgsIDB4MzUsIDB4MjYsCisJIDB4MkYsIDB4QzMsIDB4RTEsIDB4QkUsIDB4QTIsIDB4MzUsIDB4Q0MsIDB4ODgsIDB4MzksIDB4MkUsIDB4NTcsIDB4OTMsIDB4RjIsIDB4NTUsIDB4ODIsIDB4RkMsCisJIDB4NDcsIDB4N0EsIDB4QUMsIDB4QzgsIDB4RTcsIDB4QkEsIDB4MkIsIDB4MzIsIDB4OTUsIDB4RTYsIDB4QTAsIDB4QzAsIDB4OTgsIDB4MTksIDB4RDEsIDB4OUUsCisJIDB4N0YsIDB4QTMsIDB4NjYsIDB4NDQsIDB4N0UsIDB4NTQsIDB4QUIsIDB4M0IsIDB4ODMsIDB4MEIsIDB4Q0EsIDB4OEMsIDB4MjksIDB4QzcsIDB4RDMsIDB4NkIsCisJIDB4M0MsIDB4MjgsIDB4NzksIDB4QTcsIDB4RTIsIDB4QkMsIDB4MUQsIDB4MTYsIDB4NzYsIDB4QUQsIDB4M0IsIDB4REIsIDB4NTYsIDB4NjQsIDB4NEUsIDB4NzQsCisJIDB4MUUsIDB4MTQsIDB4REIsIDB4OTIsIDB4MEEsIDB4MEMsIDB4NkMsIDB4NDgsIDB4RTQsIDB4QjgsIDB4NUQsIDB4OUYsIDB4NkUsIDB4QkQsIDB4RUYsIDB4NDMsCisJIDB4QTYsIDB4QzQsIDB4QTgsIDB4MzksIDB4QTQsIDB4MzEsIDB4MzcsIDB4RDMsIDB4OEIsIDB4RjIsIDB4MzIsIDB4RDUsIDB4NDMsIDB4OEIsIDB4NTksIDB4NkUsCisJIDB4QjcsIDB4REEsIDB4OEMsIDB4MDEsIDB4NjQsIDB4QjEsIDB4RDIsIDB4OUMsIDB4RTAsIDB4NDksIDB4QjQsIDB4RDgsIDB4RkEsIDB4QUMsIDB4MDcsIDB4RjMsCisJIDB4MjUsIDB4Q0YsIDB4QUYsIDB4Q0EsIDB4OEUsIDB4RjQsIDB4RTksIDB4NDcsIDB4MTgsIDB4MTAsIDB4RDUsIDB4NkYsIDB4ODgsIDB4RjAsIDB4NkYsIDB4NEEsCisJIDB4NzIsIDB4NUMsIDB4MjQsIDB4MzgsIDB4RjEsIDB4NTcsIDB4QzcsIDB4NzMsIDB4NTEsIDB4OTcsIDB4MjMsIDB4Q0IsIDB4N0MsIDB4QTEsIDB4OUMsIDB4RTgsCisJIDB4MjEsIDB4M0UsIDB4REQsIDB4OTYsIDB4REMsIDB4NjEsIDB4ODYsIDB4MEQsIDB4ODUsIDB4MEYsIDB4OTAsIDB4RTAsIDB4NDIsIDB4N0MsIDB4QzQsIDB4NzEsCisJIDB4QUEsIDB4Q0MsIDB4RDgsIDB4OTAsIDB4MDUsIDB4MDYsIDB4MDEsIDB4RjcsIDB4MTIsIDB4MUMsIDB4QTMsIDB4QzIsIDB4NUYsIDB4NkEsIDB4RjksIDB4QUUsCisJIDB4RDAsIDB4NjksIDB4OTEsIDB4MTcsIDB4NTgsIDB4OTksIDB4MjcsIDB4M0EsIDB4QjksIDB4MjcsIDB4MzgsIDB4RDksIDB4MTMsIDB4RUIsIDB4QjMsIDB4MkIsCisJIDB4MzMsIDB4MjIsIDB4QkIsIDB4RDIsIDB4NzAsIDB4QTksIDB4ODksIDB4MDcsIDB4QTcsIDB4MzMsIDB4QjYsIDB4MkQsIDB4MjIsIDB4M0MsIDB4OTIsIDB4MTUsCisJIDB4MjAsIDB4QzksIDB4NDksIDB4ODcsIDB4RkYsIDB4QUEsIDB4NzgsIDB4NTAsIDB4N0EsIDB4QTUsIDB4OEYsIDB4MDMsIDB4RjgsIDB4NTksIDB4ODAsIDB4MDksCisJIDB4MTcsIDB4MUEsIDB4REEsIDB4NjUsIDB4MzEsIDB4RDcsIDB4QzYsIDB4ODQsIDB4QjgsIDB4RDAsIDB4QzMsIDB4ODIsIDB4QjAsIDB4MjksIDB4NzcsIDB4NUEsCisJIDB4MTEsIDB4MUUsIDB4Q0IsIDB4N0IsIDB4RkMsIDB4QTgsIDB4RDYsIDB4NkQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzMsCisJIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4M0EsIDB4MDAsIDB4M0IsCisJIDB4MDAsIDB4M0MsIDB4MDAsIDB4M0QsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0YsIDB4MDAsIDB4M0YsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MEEsIDB4MDIsIDB4MTQsCisJIDB4MDUsIDB4MzIsIDB4MEIsIDB4MzcsIDB4MDgsIDB4NTAsIDB4MEIsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4M0YsIDB4MDAsCisJIDB4MEMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MEYsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjMsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MjAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTAsIDB4MTAsCisJIDB4RUUsIDB4MTAsIDB4QTYsIDB4MTAsIDB4RTgsIDB4MTAsIDB4QUMsIDB4MTAsIDB4RTIsIDB4MTAsIDB4QjIsIDB4MTAsIDB4REMsIDB4MTAsIDB4QjgsIDB4MTAsCisJIDB4RDYsIDB4MTAsIDB4QkUsIDB4MTAsIDB4RDAsIDB4MTAsIDB4QzQsIDB4MTAsIDB4Q0EsIDB4MTAsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjIsCisJIDB4MDAsIDB4MDQsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MjYsIDB4MDAsIDB4MDQsIDB4MDksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkEsCisJIDB4MDAsIDB4MDQsIDB4MEEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MkUsIDB4MDAsIDB4MDQsIDB4MEIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjQsCisJIDB4MDQsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjgsIDB4MDQsIDB4MDQsIDB4MEQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MkMsCisJIDB4MDQsIDB4MDQsIDB4MEUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MDQsIDB4MEYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzQsCisJIDB4MDgsIDB4MDQsIDB4MTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MzgsIDB4MDgsIDB4MDQsIDB4MTEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4M0MsCisJIDB4MDgsIDB4MDQsIDB4MTIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4NDAsIDB4MDgsIDB4MDQsIDB4MTMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjQsCisJIDB4MEMsIDB4MEIsIDB4MTQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjgsIDB4MEMsIDB4MEIsIDB4MTUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NkMsCisJIDB4MEMsIDB4MEIsIDB4MTYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzAsIDB4MEMsIDB4MEIsIDB4MTcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzQsCisJIDB4MEMsIDB4MEIsIDB4MTgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzgsIDB4MEMsIDB4MEIsIDB4MTksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4N0MsCisJIDB4MEMsIDB4MEIsIDB4MUEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODAsIDB4MEMsIDB4MEIsIDB4MUIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODQsCisJIDB4MEMsIDB4MEIsIDB4MUMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODgsIDB4MEMsIDB4MEIsIDB4MUQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4OEMsCisJIDB4MEMsIDB4MEIsIDB4MUUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTUsIDB4MTcsIDB4MDQsIDB4MUYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OTksCisJIDB4MTcsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4OUQsIDB4MTcsIDB4MDQsIDB4MjEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MUQsIDB4QTEsCisJIDB4MTcsIDB4MDQsIDB4MjIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsIDB4MzAsIDB4MTEsIDB4NTAsIDB4MTEsCisJIDB4NzAsIDB4MTEsIDB4QzgsIDB4MTEsIDB4MTgsIDB4MTEsIDB4MzgsIDB4MTEsIDB4NTgsIDB4MTEsIDB4NzgsIDB4MTEsIDB4RDAsIDB4MTEsIDB4MjAsIDB4MTEsCisJIDB4NDAsIDB4MTEsIDB4NjAsIDB4MTEsIDB4ODAsIDB4MTEsIDB4RDgsIDB4MTEsIDB4MjgsIDB4MTEsIDB4NDgsIDB4MTEsIDB4NjgsIDB4MTEsIDB4ODgsIDB4MTEsCisJIDB4RTAsIDB4MTEsIDB4OTAsIDB4MTEsIDB4OTgsIDB4MTEsIDB4QTAsIDB4MTEsIDB4QTgsIDB4MTEsIDB4QjAsIDB4MTEsIDB4QjgsIDB4MTEsIDB4QzAsIDB4MTEsCisJIDB4RTgsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkUsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MzYsIDB4MjUsIDB4NEYsIDB4MjUsIDB4NzIsIDB4MjUsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4QUMsIDB4MjUsCisJIDB4MDIsIDB4MkIsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RjMsIDB4MkQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4OEIsIDB4MjcsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTUsIDB4MjcsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4NTksIDB4MjcsIDB4NzMsIDB4MjcsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4RTEsIDB4MjQsIDB4NDcsIDB4MjMsIDB4Q0UsIDB4MjUsIDB4RTEsIDB4MjUsIDB4OTEsIDB4MjYsIDB4OTUsIDB4MjYsIDB4RTEsIDB4MjQsIDB4RTEsIDB4MjQsCisJIDB4NDQsIDB4MjcsIDB4NTEsIDB4RUEsIDB4RkYsIDB4RTksIDB4MDAsIDB4MDAsIDB4NDgsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4RUEsCisJIDB4NjUsIDB4MjUsIDB4ODksIDB4MjUsIDB4MDAsIDB4MDAsIDB4RjgsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MkIsIDB4RTAsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4QzYsIDB4MkEsIDB4NUEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjksIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MDAsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NTAsIDB4MjgsIDB4MDYsIDB4MDAsIDB4RjAsIDB4RkYsIDB4NEMsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4RjYsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NkMsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4RjQsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4RjUsIDB4RkYsIDB4NEMsIDB4MjgsIDB4Q0YsIDB4MkEsCisJIDB4NDIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4RTAsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0UsIDB4MkQsIDB4MDIsIDB4MDAsIDB4RTEsIDB4RkYsCisJIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDAsIDB4MkQsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDIsIDB4MkQsCisJIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0EsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MDMsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4MTcsIDB4MkEsIDB4MTYsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MDQsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NUMsIDB4MjgsIDB4NTgsIDB4MjgsIDB4MjIsIDB4MDAsCisJIDB4MDYsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NDAsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4OUMsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4MjksIDB4MkEsIDB4QTYsIDB4MjgsIDB4MjIsIDB4MDAsIDB4QjEsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4MUQsIDB4MkIsIDB4QTIsIDB4MjksIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0MsIDB4MjgsCisJIDB4MDIsIDB4MDAsIDB4MjUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDYsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MjYsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NjIsIDB4MjgsIDB4RDgsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MjcsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4REEsIDB4MjgsIDB4MDIsIDB4MDAsCisJIDB4QjIsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NUMsIDB4MjgsIDB4QzYsIDB4MjksIDB4MjIsIDB4MDAsIDB4QzEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4NUEsIDB4MkQsIDB4MjAsIDB4MDAsIDB4QjAsIDB4RkMsIDB4MUYsIDB4MjgsIDB4MjIsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RkMsCisJIDB4MUYsIDB4MjgsIDB4RTcsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QzgsIDB4RkMsIDB4MUYsIDB4MjgsIDB4RTIsIDB4MkEsIDB4MDAsIDB4MDAsCisJIDB4MDgsIDB4MDAsIDB4QjQsIDB4RkMsIDB4MUYsIDB4MjgsIDB4NjAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4RkMsIDB4MUYsIDB4MjgsCisJIDB4MTEsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RkMsIDB4MUYsIDB4MjgsIDB4M0IsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QjgsIDB4RkMsIDB4MUYsIDB4MjgsIDB4OTgsIDB4MkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4QzYsIDB4MkQsIDB4MDIsIDB4MDAsIDB4QjksIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QzgsIDB4MkQsIDB4MDIsIDB4MDAsIDB4OTAsIDB4RkQsCisJIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4Q0MsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MjMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4RDIsIDB4MjgsCisJIDB4MDIsIDB4MDAsIDB4MjksIDB4RkMsIDB4NDQsIDB4MjksIDB4RjEsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NjIsIDB4MjgsIDB4MEUsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MzIsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTAsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4MzMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4NTYsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MDEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NTAsIDB4MjgsIDB4MDYsIDB4MDAsIDB4MDIsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4REMsIDB4MjgsIDB4QTQsIDB4MjksIDB4MjIsIDB4MDAsIDB4MDUsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NDYsIDB4MjgsCisJIDB4MDIsIDB4MDAsIDB4MDgsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4NEEsIDB4MjgsIDB4MDYsIDB4MDAsIDB4MDksIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NjIsIDB4MjgsIDB4OUUsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MEIsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTAsIDB4MjgsIDB4MDIsIDB4MDAsCisJIDB4MEMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTIsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MEQsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4QTQsIDB4MjgsIDB4MDIsIDB4MDAsIDB4MjEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4Q0UsIDB4MjgsIDB4MDIsIDB4MDAsIDB4ODAsIDB4RkMsCisJIDB4QjgsIDB4MjgsIDB4QzgsIDB4MjgsIDB4RTIsIDB4MjgsIDB4QzAsIDB4MDAsIDB4ODEsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QTgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4ODMsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4QUMsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODUsIDB4RkMsIDB4NEMsIDB4MjgsCisJIDB4NDksIDB4MkEsIDB4QTYsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODYsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NUIsIDB4MkEsIDB4QjIsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4MjgsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4REMsIDB4MjgsIDB4MDIsIDB4MDAsIDB4ODcsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsCisJIDB4RUMsIDB4MjksIDB4MjIsIDB4MDMsIDB4ODQsIDB4RkMsIDB4NEMsIDB4MjgsIDB4NzAsIDB4MkEsIDB4QjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MkIsIDB4RkMsCisJIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MTQsIDB4MzEsIDB4MDIsIDB4MDAsIDB4RjgsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MEUsIDB4MzEsCisJIDB4MDIsIDB4MDAsIDB4RjMsIDB4RkYsIDB4NEMsIDB4MjgsIDB4NjIsIDB4MjgsIDB4MTYsIDB4MzEsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkQsIDB4N0QsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4MjMsIDB4MzQsIDB4MDgsIDB4MDAsIDB4MjEsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4MjcsIDB4MzQsIDB4MEEsIDB4MDAsCisJIDB4MjIsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4MkMsIDB4MzQsIDB4MTYsIDB4MDAsIDB4MjMsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4MzcsIDB4MzQsIDB4MEEsIDB4MDAsIDB4MTAsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4NzQsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDUsIDB4RkQsCisJIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDcsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4NzgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4NDgsIDB4RkQsIDB4OUEsIDB4MjksIDB4MjksIDB4MjgsIDB4QTAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDksIDB4RkQsIDB4OUEsIDB4MjksCisJIDB4MjksIDB4MjgsIDB4QTIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4OTgsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4NEIsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4OUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEQsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4M0MsIDB4MzQsIDB4MDQsIDB4MDAsIDB4NEYsIDB4RkQsIDB4QUUsIDB4MjksIDB4MjksIDB4MjgsIDB4MUEsIDB4MkQsIDB4MDIsIDB4MDAsIDB4QzAsIDB4RkQsCisJIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4M0UsIDB4MzQsIDB4MDIsIDB4MDAsIDB4QzIsIDB4RkQsIDB4QTQsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4QzMsIDB4RkQsIDB4N0QsIDB4MjgsIDB4MjksIDB4MjgsIDB4M0YsIDB4MzQsIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkQsIDB4NzUsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4QjgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkQsIDB4Q0IsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4OTEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4MjAsIDB4MjQsIDB4MDIsIDB4MDAsIDB4OTMsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4MjYsIDB4MjQsIDB4MDIsIDB4MDAsIDB4QzEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RkUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QzYsIDB4RkQsCisJIDB4QUEsIDB4MjgsIDB4MjksIDB4MjgsIDB4MjgsIDB4MkQsIDB4MEEsIDB4MDAsIDB4ODksIDB4RkQsIDB4NUIsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4OEEsIDB4RkQsIDB4OUEsIDB4MjgsIDB4MjksIDB4MjgsIDB4QTAsIDB4MkQsIDB4MjQsIDB4MDAsIDB4NDEsIDB4RkQsIDB4NEMsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4N0EsIDB4MkQsIDB4MjIsIDB4MDAsIDB4NDIsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4MDIsIDB4MDEsIDB4MDYsIDB4MDAsCisJIDB4NDMsIDB4RkQsIDB4RDgsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NDQsIDB4RkQsIDB4QjgsIDB4MjksIDB4MjksIDB4MjgsCisJIDB4QjQsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDYsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4QkEsIDB4MDEsIDB4MEMsIDB4MDAsIDB4NEMsIDB4RkQsCisJIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RUEsIDB4MjksIDB4MDIsIDB4MDAsIDB4NTAsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RjQsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4NTEsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4RjYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NTIsIDB4RkQsIDB4NEMsIDB4MjgsCisJIDB4MjksIDB4MjgsIDB4QzYsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OEYsIDB4RkQsIDB4RUIsIDB4MjksIDB4MjksIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCisJIDB4OTIsIDB4RkQsIDB4NEMsIDB4MjgsIDB4MjksIDB4MjgsIDB4NTQsIDB4MkQsIDB4MDIsIDB4MDAsIDB4OEMsIDB4RkQsIDB4M0YsIDB4MjgsIDB4MjksIDB4MjgsCisJIDB4MDgsIDB4MkUsIDB4NTYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4M0YsIDB4MjgsIDB4MjksIDB4MjgsIDB4NjIsIDB4MkUsIDB4MTQsIDB4MDAsIDB4MDAsIDB4RjEsCisJIDB4NDYsIDB4MDAsIDB4RTMsIDB4MjcsIDB4M0EsIDB4MDEsIDB4MDEsIDB4RjEsIDB4NDQsIDB4MDcsIDB4RTEsIDB4MjcsIDB4M0MsIDB4MDEsIDB4MDAsIDB4MDMsCisJIDB4MkEsIDB4NjgsIDB4MUUsIDB4MDAsIDB4NzYsIDB4MDEsIDB4RkUsIDB4MDAsIDB4RDYsIDB4MDEsIDB4MDIsIDB4MDEsIDB4M0UsIDB4MDEsIDB4QjgsIDB4MDEsCisJIDB4NzQsIDB4MjcsIDB4NUEsIDB4MDEsIDB4MjAsIDB4MjQsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4MUMsIDB4MDAsIDB4MDAsIDB4QkUsIDB4MUUsCisJIDB4NTQsIDB4MDEsIDB4MEIsIDB4MDAsIDB4QkEsIDB4MDAsIDB4RTQsIDB4MDAsIDB4M0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4QUYsIDB4MzcsIDB4QUYsIDB4NDMsIDB4QjAsCisJIDB4NEMsIDB4QjAsIDB4NDgsIDB4QUYsIDB4REUsIDB4QUYsIDB4QjYsIDB4QUYsIDB4MUMsIDB4MzMsIDB4N0YsIDB4MzIsIDB4MUMsIDB4MzMsIDB4RjMsIDB4MzIsCisJIDB4ODksIDB4MzIsIDB4N0QsIDB4MzIsIDB4M0IsIDB4MzMsIDB4NEMsIDB4MzMsIDB4NEMsIDB4MzMsIDB4NEMsIDB4MzMsIDB4NTUsIDB4MzMsIDB4NzAsIDB4MzMsCisJIDB4Q0QsIDB4MzMsIDB4RTksIDB4MzMsIDB4RjQsIDB4MzIsIDB4MDcsIDB4MzMsIDB4REIsIDB4MzIsIDB4MTAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTMsIDB4MDAsCisJIDB4MjAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsCisJIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4MDAsIDB4M0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDEsCisJIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4RjMsIDB4MDIsCisJIDB4QUQsIDB4MDMsIDB4NjAsIDB4MDQsIDB4MDQsIDB4MDUsIDB4MDcsIDB4MDYsIDB4MDgsIDB4MDcsIDB4MEEsIDB4MDgsIDB4MTYsIDB4MDksIDB4NDQsIDB4MEEsCisJIDB4MDQsIDB4MEIsIDB4NDAsIDB4MEMsIDB4ODAsIDB4MEQsIDB4MDAsIDB4MEUsIDB4ODQsIDB4MEYsIDB4MDEsIDB4MTAsIDB4MTAsIDB4MTEsIDB4MDIsIDB4MTQsCisJIDB4NDAsIDB4MjAsIDB4MzIsIDB4MjEsIDB4MzIsIDB4MjIsIDB4MDQsIDB4MjMsIDB4MDEsIDB4MjQsIDB4MEYsIDB4MjUsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MjcsCisJIDB4MDAsIDB4MjgsIDB4MDAsIDB4MjksIDB4MDAsIDB4MkEsIDB4MDEsIDB4MkIsIDB4MDYsIDB4MkMsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzksIDB4RDYsIDB4M0EsCisJIDB4MDAsIDB4M0IsIDB4MDAsIDB4M0MsIDB4MTQsIDB4M0QsIDB4N0YsIDB4M0UsIDB4MDAsIDB4M0YsIDB4NjgsIDB4NDAsIDB4NzUsIDB4NDEsIDB4MDcsIDB4NDIsCisJIDB4MDcsIDB4NDMsIDB4MDAsIDB4NDUsIDB4M0IsIDB4NEEsIDB4MDAsIDB4NEIsIDB4MDAsIDB4NEMsIDB4MEYsIDB4NEQsIDB4MDIsIDB4NzUsIDB4MDAsIDB4NzYsCisJIDB4ODAsIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDksIDB4MDEsIDB4MDksIDB4MDEsIDB4MEEsIDB4MDEsIDB4MEEsIDB4MDEsIDB4MEIsIDB4MDEsIDB4MEIsIDB4MDEsCisJIDB4MEMsIDB4MDEsIDB4MEMsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEQsIDB4MDEsIDB4MEUsIDB4MDEsIDB4MEUsIDB4MDEsIDB4MEYsIDB4MDEsIDB4MEYsIDB4MDEsCisJIDB4MTAsIDB4MDEsIDB4MTAsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTEsIDB4MDEsIDB4MTIsIDB4MDEsIDB4MTIsIDB4MDEsIDB4MTMsIDB4MDEsIDB4MTMsIDB4MDEsCisJIDB4MTQsIDB4MDEsIDB4MTQsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTUsIDB4MDEsIDB4MTYsIDB4MDEsIDB4MTYsIDB4MDEsIDB4MTcsIDB4MDEsIDB4MTcsIDB4MDEsCisJIDB4MTgsIDB4MDEsIDB4MTgsIDB4MDEsIDB4MTksIDB4MDEsIDB4MTksIDB4MDEsIDB4NEQsIDB4MDEsIDB4NEQsIDB4MDEsIDB4NEUsIDB4MDEsIDB4NEUsIDB4MDEsCisJIDB4NEYsIDB4MDEsIDB4NEYsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTAsIDB4MDEsIDB4NTEsIDB4MDEsIDB4NTEsIDB4MDEsIDB4NTIsIDB4MDEsIDB4NTIsIDB4MDEsCisJIDB4NTMsIDB4MDEsIDB4NTMsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NTQsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjUsIDB4MDEsIDB4NjYsIDB4MDEsIDB4NjYsIDB4MDEsCisJIDB4NjcsIDB4MDEsIDB4NjcsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjgsIDB4MDEsIDB4NjksIDB4MDEsIDB4NjksIDB4MDEsIDB4NkEsIDB4MDEsIDB4NkEsIDB4MDEsCisJIDB4NkIsIDB4MDEsIDB4NkIsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkMsIDB4MDEsIDB4NkQsIDB4MDEsIDB4NkQsIDB4MDEsIDB4NkUsIDB4MDEsIDB4NkUsIDB4MDEsCisJIDB4NkYsIDB4MDEsIDB4NkYsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzAsIDB4MDEsIDB4NzEsIDB4MDEsIDB4NzEsIDB4MDEsIDB4NzIsIDB4MDEsIDB4NzIsIDB4MDEsCisJIDB4NzMsIDB4MDEsIDB4NzMsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzQsIDB4MDEsIDB4NzUsIDB4MDEsIDB4NzUsIDB4MDEsIDB4NzYsIDB4MDEsIDB4NzYsIDB4MDEsCisJIDB4NzcsIDB4MDEsIDB4NzcsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzgsIDB4MDEsIDB4NzksIDB4MDEsIDB4NzksIDB4MDEsIDB4N0EsIDB4MDEsIDB4N0EsIDB4MDEsCisJIDB4N0IsIDB4MDEsIDB4N0IsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0MsIDB4MDEsIDB4N0QsIDB4MDEsIDB4N0QsIDB4MDEsIDB4N0UsIDB4MDEsIDB4N0UsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsIDB4N0YsIDB4MDEsCisJIDB4N0YsIDB4MDEsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsCisJIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTIsIDB4ODAsIDB4MTMsCisJIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsCisJIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4ODAsIDB4MTMsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsCisJIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4NTEsIDB4NDQsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsCisJIDB4MjMsIDB4NDYsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUQsIDB4NDcsIDB4OUEsIDB4NDgsCisJIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsCisJIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4MzMsIDB4NDgsIDB4NzgsIDB4NDksIDB4NzgsIDB4NDksIDB4NzksIDB4NDksCisJIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0IsIDB4NDksCisJIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0MsIDB4NDksIDB4MzIsIDB4MDAsIDB4NDYsIDB4MDAsIDB4NUEsIDB4MDAsIDB4NkUsIDB4MDAsIDB4ODIsIDB4MDAsCisJIDB4OTYsIDB4MDAsIDB4QUEsIDB4MDAsIDB4QkUsIDB4MDAsIDB4RDIsIDB4MDAsIDB4RTYsIDB4MDAsIDB4RkEsIDB4MDAsIDB4MEUsIDB4MDEsIDB4MjIsIDB4MDEsCisJIDB4NTIsIDB4MDEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsCisJIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDMsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsCisJIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4NDYsIDB4NjksIDB4NzIsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTcsIDB4NjEsIDB4NzYsIDB4NjUsIDB4NEMsIDB4NDEsIDB4NEUsIDB4MjAsIDB4NDksIDB4NDksCisJIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MTksIDB4MDAsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUUsIDB4ODUsIDB4MDAsIDB4MDEsCisJIDB4N0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsCisJIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NDMsIDB4NzUsIDB4NzIsIDB4NzIsIDB4NjUsIDB4NkUsIDB4NzQsIDB4MjAsIDB4NTMsCisJIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjksIDB4NjMsIDB4NjUsIDB4MjAsIDB4NTMsIDB4NjUsIDB4NzQsIDB4MjAsIDB4NDksIDB4NjQsIDB4NjUsIDB4NkUsIDB4NzQsCisJIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NzIsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4REQsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsCisJIDB4MDEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDQsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MTUsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTQsIDB4MDAsCisJIDB4MTEsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4N0EsIDB4MkQsIDB4MjgsIDB4MkQsIDB4MEMsIDB4MkYsIDB4MTAsIDB4MkYsCisJIDB4MTQsIDB4MkYsIDB4QTAsIDB4MkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzYsIDB4MjksIDB4MjgsIDB4MkQsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4N0EsIDB4MkQsIDB4MjgsIDB4MkQsIDB4MEMsIDB4MkYsIDB4MTAsIDB4MkYsIDB4MTQsIDB4MkYsIDB4QTAsIDB4MkQsCisJIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N0EsIDB4MkQsIDB4MjgsIDB4MkQsIDB4RkYsIDB4RkYsIDB4RTYsIDB4MkQsCisJIDB4MzQsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDcsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8yX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzNfZGF0YVtdID0geworCSAweDAwLCAweEUxLCAweDMwLCAweDQwLCAweDAyLCAweDM2LCAweEExLCAweEZGLCAweDgzLCAweEZGLCAweDhELCAweEZGLCAweDVDLCAweDQ0LCAweDVDLCAweDQzLAorCSAweDVDLCAweDQyLCAweDVDLCAweDQxLCAweDVDLCAweDQwLCAweEFDLCAweEZGLCAweEFELCAweEZGLCAweEU3LCAweEUxLCAweEFELCAweDYwLCAweDA4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAzLCAweDAyLCAweDI4LCAweEUyLCAweDQwLCAweEZGLCAweEExLCAweEZGLAorCSAweDg0LCAweEZGLCAweEJCLCAweDYwLCAweDE4LCAweDY0LCAweDQwLCAweDQyLCAweEIwLCAweDYwLCAweDk3LCAweDY0LCAweDQwLCAweDQwLCAweEJELCAweEYzLAorCSAweDgwLCAweEZCLCAweDBGLCAweDYwLCAweDlBLCAweDYzLCAweENBLCAweEYzLCAweEJELCAweERCLCAweDAwLCAweDYwLCAweDlBLCAweDY0LCAweEJELCAweERCLAorCSAweDAyLCAweDY0LCAweEJELCAweERCLCAweDA0LCAweDY0LCAweEEzLCAweERCLCAweDVDLCAweDQ5LCAweDBBLCAweDY0LCAweDQwLCAweDRCLCAweDVDLCAweDVDLAorCSAweDAxLCAweDYwLCAweDM5LCAweEUyLCAweDA0LCAweDYwLCAweDAwLCAweDdBLCAweDg5LCAweEZGLCAweDAzLCAweDYwLCAweEZGLCAweDczLCAweDg4LCAweEZGLAorCSAweEIwLCAweDYwLCAweDk3LCAweDc4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDA2LCAweDAyLCAweDQwLCAweEZGLAorCSAweDQyLCAweEZGLCAweDQzLCAweEZGLCAweDQ0LCAweEZGLCAweDQ1LCAweEZGLCAweEExLCAweEZGLCAweDg4LCAweEZGLCAweDg1LCAweEZGLCAweDIxLCAweEUxLAorCSAweDVDLCAweDQwLCAweEJCLCAweDYwLCAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLAorCSAweDAxLCAweDAyLCAweEExLCAweEZGLCAweDg2LCAweEZGLCAweDg4LCAweEZGLCAweDVDLCAweDQ2LCAweDVDLCAweDQ5LCAweDVDLCAweDQwLCAweEU3LCAweDYwLAorCSAweDU4LCAweDRGLCAweDMxLCAweDc4LCAweEZGLCAweEZGLCAweEM3LCAweDYwLCAweDU4LCAweDRGLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweENBLCAweDYwLAorCSAweDU4LCAweDRGLCAweDgzLCAweDc4LCAweEZGLCAweEZGLCAweERELCAweDYwLCAweDU4LCAweDRGLCAweDNELCAweDc4LCAweEZGLCAweEZGLCAweDFCLCAweDYwLAorCSAweDU4LCAweDRGLCAweDM3LCAweDc4LCAweEZGLCAweEZGLCAweEVDLCAweDYwLCAweDU4LCAweDRGLCAweDc1LCAweDc4LCAweEZGLCAweEZGLCAweEUwLCAweDYwLAorCSAweDU4LCAweDRGLCAweDFCLCAweDc4LCAweEZGLCAweEZGLCAweEU0LCAweDYwLCAweDU4LCAweDRGLCAweERDLCAweDc4LCAweEZGLCAweEZGLCAweEYzLCAweDYwLAorCSAweDU4LCAweDRGLCAweEVCLCAweDc4LCAweEZGLCAweEZGLCAweDEzLCAweEUxLCAweEEzLCAweEZGLCAweEJGLCAweDYwLCAweEU3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAzLCAweEUxLCAweEEzLCAweEZGLCAweEZFLCAweEZDLCAweEZGLCAweEZDLCAweDIzLCAweDYwLCAweEY0LCAweDYzLCAweDE3LCAweEZELCAweEFFLCAweEZGLAorCSAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweDFBLCAweDAwLAorCSAweDgwLCAweDNBLCAweDE1LCAweDAwLCAweDgxLCAweEYxLCAweDMyLCAweEYyLCAweDMzLCAweEYyLCAweEQwLCAweDgwLCAweDgyLCAweEYxLCAweDBGLCAweDAyLAorCSAweEQwLCAweDgwLCAweDM0LCAweEYyLCAweDgzLCAweEYxLCAweDBCLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweERGLCAweDYwLAorCSAweDU4LCAweDRGLCAweDI4LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRGLCAweEJGLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLAorCSAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEY0LCAweEFBLCAweDYwLCAweEFBLCAweDY1LCAweDA5LCAweEYyLCAweDVBLCAweEQwLCAweEQ0LCAweDgwLAorCSAweDAzLCAweDY0LCAweDEyLCAweDAyLCAweEQwLCAweDgwLCAweDFELCAweDYwLCAweDYwLCAweDY1LCAweDBFLCAweDAyLCAweDVBLCAweEQyLCAweEZGLCAweEZGLAorCSAweEQ0LCAweDgwLCAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweDA4LCAweDAyLCAweDVBLCAweEQyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDAzLCAweDAyLCAweDE5LCAweDYwLCAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweEQ2LCAweDY1LCAweEE1LCAweEQxLCAweDVBLCAweEQxLAorCSAweDQ0LCAweDQ4LCAweDVBLCAweEQxLCAweDQ0LCAweDRBLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDQ0LCAweDRDLCAweEQ4LCAweDgzLAorCSAweDcwLCAweDYxLCAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDBFLCAweDA4LCAweEYyLCAweDA4LCAweDAwLCAweDY4LCAweDY1LAorCSAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDBFLCAweDAzLCAweDAwLCAweDE5LCAweDYwLCAweEZFLCAweDc4LCAweEZGLCAweEZGLCAweDU4LCAweDRGLAorCSAweDc5LCAweDAwLCAweDlDLCAweDgwLCAweDAxLCAweDY1LCAweDAyLCAweDAyLCAweDAwLCAweDY1LCAweDAyLCAweDAwLCAweEZGLCAweDNCLCAweEY3LCAweDAxLAorCSAweDU4LCAweDRGLCAweDcwLCAweDAwLCAweDlDLCAweDgwLCAweDQ1LCAweDQyLCAweEVBLCAweDAyLCAweDU4LCAweDRGLCAweDZCLCAweDAwLCAweDlDLCAweDgwLAorCSAweEZGLCAweEZGLCAweEU1LCAweDAyLCAweDU4LCAweDRGLCAweDY2LCAweDAwLCAweDlDLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDAwLCAweDY1LAorCSAweDQ1LCAweDQyLCAweEY4LCAweDAxLCAweEZGLCAweDNBLCAweDI5LCAweDAwLCAweDYwLCAweDQ3LCAweEZGLCAweEI1LCAweDI4LCAweDQ0LCAweEZGLCAweEI0LAorCSAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweEQ0LCAweDAyLCAweDYwLCAweDQ1LCAweDI4LCAweDQ3LCAweDJBLCAweDVGLCAweDQwLCAweDQ4LCAweDJBLCAweDQ3LAorCSAweDJDLCAweDVGLCAweDQwLCAweDRBLCAweDJDLCAweDQ3LCAweDY1LCAweDVGLCAweDQwLCAweDRDLCAweDEwLCAweDY0LCAweDQwLCAweDQyLCAweDI4LCAweDQ1LAorCSAweDA1LCAweDAwLCAweDU4LCAweDRGLCAweDQ3LCAweDAwLCAweDk0LCAweDgwLCAweDI4LCAweDQ1LCAweDI2LCAweDAyLCAweDU4LCAweDRGLCAweDQyLCAweDAwLAorCSAweDk0LCAweDgwLCAweDJBLCAweDQ1LCAweDIxLCAweDAyLCAweDU4LCAweDRGLCAweDNELCAweDAwLCAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweDFDLCAweDAyLAorCSAweDIyLCAweDQ0LCAweDRDLCAweDgyLCAweDJDLCAweDQ1LCAweDMxLCAweDAzLCAweEVDLCAweDAxLCAweDEwLCAweDY1LCAweDQ1LCAweDQyLCAweDI4LCAweDQ1LAorCSAweDk0LCAweDgwLCAweDJBLCAweDQ1LCAweDIxLCAweDAyLCAweDU4LCAweDRGLCAweDJELCAweDAwLCAweDk0LCAweDgwLCAweDJDLCAweDQ1LCAweDFDLCAweDAyLAorCSAweDU4LCAweDRGLCAweDI4LCAweDAwLCAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDAyLCAweDIyLCAweDQ0LCAweDRDLCAweDgyLCAweDI4LCAweDQ1LAorCSAweDFDLCAweDAzLCAweDU4LCAweDRGLCAweDFGLCAweDAwLCAweEVDLCAweDAxLCAweDQwLCAweDRCLCAweDI4LCAweDQ3LCAweDQwLCAweDQ4LCAweDJBLCAweDQ3LAorCSAweDQwLCAweDRBLCAweDJDLCAweDQ3LCAweDYwLCAweDQ1LCAweDJBLCAweDVFLCAweDQwLCAweDRDLCAweDJBLCAweDQ0LCAweDI4LCAweDVFLCAweDQwLCAweDRBLAorCSAweDI4LCAweDQ0LCAweDY1LCAweDVFLCAweDQwLCAweDQ4LCAweDJCLCAweDQ0LCAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDBFLAorCSAweDkwLCAweDAxLCAweDI2LCAweDQ2LCAweEM1LCAweDYwLCAweDVCLCAweDc4LCAweEZGLCAweEZGLCAweEI5LCAweEZGLCAweDI2LCAweDQ2LCAweEM1LCAweDYwLAorCSAweDVCLCAweDc4LCAweEZGLCAweEZGLCAweEM5LCAweDgxLCAweENCLCAweDgzLCAweDA3LCAweDFDLCAweDAxLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweEY0LAorCSAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEI0LCAweEQ4LCAweDgxLCAweDVBLCAweEQyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweEM1LCAweDYwLCAweDU4LCAweDRGLCAweDc4LCAweDc4LCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDAwLCAweEY0LCAweDg0LCAweDY1LAorCSAweDc4LCAweDYxLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweEYwLCAweDAyLCAweDFDLCAweDYwLCAweEFDLCAweDYzLCAweDI5LCAweDYwLCAweEVDLCAweDY0LCAweDA4LCAweDY1LCAweEM0LCAweDgxLCAweDYxLCAweDQ0LAorCSAweEEzLCAweERCLCAweDFDLCAweDYwLCAweEFBLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDI5LCAweDYwLCAweEVDLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDFDLCAweDYwLCAweEIwLCAweDYxLCAweEExLCAweERELCAweDFDLCAweDYwLCAweEIwLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDFDLCAweDYwLCAweEFBLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDAzLCAweDAzLCAweDAwLCAweDFBLCAweDYwLCAweEQ2LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEE4LCAweDYxLCAweDAxLCAweDY0LAorCSAweEExLCAweERCLCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDQxLCAweDRDLCAweDAzLCAweDYwLCAweDAwLCAweDYxLCAweDQxLCAweDRBLCAweDFDLCAweDYwLAorCSAweEFDLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDQ4LCAweDFDLCAweDYwLCAweEIyLCAweDYzLCAweDI4LCAweDQxLCAweDA2LCAweDY1LAorCSAweEQ1LCAweDgxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAxLCAweEE0LCAweDYwLCAweDQxLCAweEEzLCAweERCLAorCSAweDJBLCAweDQzLCAweDI4LCAweDQ1LCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweEY0LCAweDAyLCAweDI4LCAweDQxLCAweDFDLCAweDYwLAorCSAweEIyLCAweDYzLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDQ1LCAweDhCLCAweDFDLCAweDYwLCAweEFFLCAweDYxLCAweDJCLCAweEQzLAorCSAweEExLCAweERCLCAweDJDLCAweDQxLCAweDI4LCAweDQyLCAweDRBLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDQ1LCAweDhDLCAweDAwLCAweDdGLAorCSAweDAxLCAweDdFLCAweDQwLCAweDQ4LCAweDFDLCAweDYwLCAweEIyLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDAwLCAweDY0LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDQzLCAweDAzLCAweDY1LCAweDQ0LCAweEZGLCAweEE0LCAweEExLCAweERCLCAweDFDLCAweDYwLCAweEFFLCAweDYxLAorCSAweEExLCAweEQzLCAweDI4LCAweDQ1LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDJDLCAweEQzLCAweDJBLCAweEQzLCAweDYwLCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweDE0LCAweDAwLCAweDI4LCAweDQ0LCAweEUwLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDI0LAorCSAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDJCLCAweDQ0LCAweDU4LCAweDhCLCAweDFDLCAweDYwLCAweEFFLCAweDYzLCAweDJCLCAweEQzLCAweEEzLCAweERCLAorCSAweDAwLCAweDdGLCAweDAxLCAweDdFLCAweDQwLCAweDQ4LCAweDJBLCAweDQ0LCAweDU4LCAweDhBLCAweDJDLCAweDQ0LCAweDU4LCAweDhDLCAweEQyLCAweDAxLAorCSAweDFDLCAweDYwLCAweEE4LCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDFDLCAweDYwLCAweEFDLCAweDYxLCAweEExLCAweEQzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ1LCAweEZBLCAweEE0LCAweDYwLCAweDQxLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEM1LCAweDgxLCAweDA2LCAweEExLAorCSAweDQxLCAweDQ4LCAweDY1LCAweDQxLCAweEZDLCAweEExLCAweEExLCAweEQzLCAweDI4LCAweDQxLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDAxLCAweEE0LAorCSAweDYwLCAweDQ1LCAweEM1LCAweDgxLCAweDYxLCAweDQzLCAweDFDLCAweDYwLCAweEFDLCAweDYxLCAweEExLCAweERELCAweDFDLCAweDYwLCAweEE4LCAweDYxLAorCSAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDBELCAweDAwLCAweDFDLCAweDYwLCAweEFBLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAxLCAweEE0LCAweEExLCAweERCLCAweEZGLCAweEZGLCAweDFBLCAweDYwLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLAorCSAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweEVDLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY2LCAweDAxLCAweDYwLCAweEJBLCAweDYxLAorCSAweDFGLCAweDYwLCAweDA4LCAweDYzLCAweEExLCAweEQzLCAweDA0LCAweEExLCAweDIwLCAweDdGLCAweEJELCAweERCLCAweDMyLCAweDdFLCAweDIxLCAweDdGLAorCSAweEJELCAweERCLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDIyLCAweDdGLCAweEEzLCAweERCLCAweDEwLCAweDAwLCAweDAxLCAweDYwLCAweEJBLCAweDYxLAorCSAweDFGLCAweDYwLCAweDA4LCAweDYzLCAweEExLCAweEQzLCAweDAwLCAweDY2LCAweDIwLCAweDdGLCAweEJELCAweERCLCAweDU5LCAweEQzLCAweEZGLCAweEZGLAorCSAweDIxLCAweDdGLCAweEJELCAweERCLCAweDU5LCAweEQzLCAweEZGLCAweEZGLCAweDIyLCAweDdGLCAweEEzLCAweERCLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDlGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBCLCAweDA0LCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFBLCAweDYwLCAweEZELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDlBLCAweDYyLCAweDFGLCAweDYwLCAweDA2LCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLAorCSAweDFCLCAweDYwLCAweDI1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDlGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDBGLCAweDYwLCAweEQwLCAweDYyLAorCSAweEEyLCAweEQxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweDEwLCAweDYwLCAweDFFLCAweDYyLCAweDFFLCAweDYwLCAweEY0LCAweDY0LCAweEEyLCAweERCLCAweDFBLCAweDYwLCAweDhBLCAweDYyLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDQwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLAorCSAweDFBLCAweDYwLCAweDk2LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDQ0LCAweDY0LCAweEEyLCAweERCLAorCSAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLCAweDFBLCAweDYwLCAweEEyLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweEEyLAorCSAweDEwLCAweDYwLCAweDQ4LCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLCAweEMwLCAweEYxLCAweDFBLCAweDYwLAorCSAweEE2LCAweDYyLCAweEEyLCAweEQ5LCAweDEwLCAweDYwLCAweDNFLCAweDYyLCAweDIwLCAweDYwLCAweDk5LCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLAorCSAweDQyLCAweDYyLCAweDIwLCAweDYwLCAweEEzLCAweDY0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDQ2LCAweDYyLCAweDIwLCAweDYwLCAweEFELCAweDY0LAorCSAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDcwLCAweDYxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEM0LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDYzLCAweEZCLCAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweEE5LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLAorCSAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEyLCAweERCLCAweDFCLCAweDYwLCAweDhBLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LAorCSAweDZBLCAweEZCLCAweDBGLCAweDRFLCAweEUwLCAweDYwLCAweDU4LCAweDRGLCAweDhFLCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDAwLCAweDY0LAorCSAweDZDLCAweEZCLCAweDYzLCAweEY1LCAweEVCLCAweEYzLCAweDJGLCAweEZBLCAweEVDLCAweEYzLCAweDMwLCAweEZBLCAweEVELCAweEYzLCAweDMxLCAweEZBLAorCSAweDgxLCAweEYzLCAweDJDLCAweEZBLCAweDMyLCAweEZBLCAweDgyLCAweEYzLCAweDJELCAweEZBLCAweDMzLCAweEZBLCAweDgzLCAweEYzLCAweDJFLCAweEZBLAorCSAweDM0LCAweEZBLCAweEJDLCAweEYzLCAweDE5LCAweEZBLCAweDA2LCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweDIwLCAweDYwLCAweDU4LCAweDRFLAorCSAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweEY3LCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDBGLCAweDYwLCAweEQwLCAweDYyLAorCSAweEEyLCAweEQxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweDhGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEMxLCAweEYxLCAweDFBLCAweDYwLCAweDlBLCAweDYyLAorCSAweEEyLCAweEQ5LCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDZDLCAweEZCLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDc0LCAweDY0LAorCSAweEEyLCAweERCLCAweDFCLCAweDYwLCAweERFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLAorCSAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEUwLCAweDAxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDExLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweEQ2LCAweDAxLCAweEFGLCAweEYzLCAweEZGLCAweEZGLAorCSAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweEQxLCAweDA2LCAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LAorCSAweEEyLCAweERCLCAweENBLCAweDAxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweENFLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDAwLCAweDAwLCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLCAweDZDLCAweEYzLCAweDAzLCAweDA0LCAweDFDLCAweDYwLAorCSAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweEZGLCAweEZGLCAweDAzLCAweDA0LCAweDFDLCAweDYwLCAweDU1LCAweDc4LCAweEZGLCAweEZGLAorCSAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDY0LCAweDY0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDJBLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEQyLCAweDAxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEU0LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLAorCSAweDUwLCAweDI3LCAweERGLCAweDAxLCAweEFGLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweEMzLCAweDA2LCAweDZDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweEJDLCAweDAxLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDQwLCAweDJCLCAweDBCLCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDU1LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY1LCAweDAxLCAweDY0LCAweEE1LCAweERCLCAweEMyLCAweEYxLCAweDFBLCAweDYwLCAweDlBLCAweDYyLCAweEEyLCAweEQ5LAorCSAweDBDLCAweDY0LCAweDUzLCAweEZCLCAweDFDLCAweDYwLCAweDc3LCAweDY0LCAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDcyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDg4LCAweEYxLCAweDE5LCAweDYwLCAweDg2LCAweDYzLCAweEQzLCAweDgwLCAweDY4LCAweEZELCAweDVGLCAweDAzLCAweDY4LCAweEYzLCAweEUyLCAweEYxLAorCSAweDYwLCAweDQzLCAweDI5LCAweDQ0LCAweEEzLCAweEQzLCAweEMwLCAweDg1LCAweEQ0LCAweDgwLCAweDVCLCAweEQzLCAweDU2LCAweDA2LCAweDYwLCAweDQzLAorCSAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgzLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLCAweDgyLCAweEYxLCAweDA1LCAweDAyLCAweEJGLCAweEQzLAorCSAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLCAweDJCLCAweDAyLCAweDFDLCAweDYwLCAweEFCLCAweDY0LAorCSAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDI5LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweDg0LCAweEYzLCAweDNFLCAweDAzLCAweDYzLCAweEY1LAorCSAweDQ4LCAweDdFLCAweDJBLCAweEZBLCAweDI0LCAweDYwLCAweDc0LCAweDYyLCAweDI0LCAweDYwLCAweDI4LCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDBGLCAweDYwLCAweERBLCAweDYyLAorCSAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweEM4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDFDLCAweDAwLCAweDJELCAweDYwLCAweDdBLCAweDY1LCAweEE1LCAweEQzLCAweDY1LCAweDQxLCAweDEwLCAweEEzLCAweDAxLCAweEE0LCAweEZFLCAweEI0LAorCSAweEM0LCAweDg1LCAweEZFLCAweEExLCAweEJELCAweEQzLCAweDU5LCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEQ1LCAweDgwLCAweDA1LCAweDAyLAorCSAweDAxLCAweDAzLCAweEY4LCAweDAxLCAweDFFLCAweDYwLCAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDY4LCAweEYzLCAweDg4LCAweEYxLCAweDA0LCAweEE0LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDY4LCAweEZCLCAweEExLCAweDAxLCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLAorCSAweEZGLCAweEZGLCAweDBDLCAweDA3LCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFCLCAweDYwLCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweEUxLCAweEYzLCAweDI5LCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDA2LCAweDA0LCAweDY1LCAweEU5LCAweDYwLCAweDU4LCAweDRFLCAweDdCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA1LCAweDY0LCAweERDLCAweEZCLCAweEYyLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLCAweEYyLCAweEZCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLAorCSAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFELCAweDYwLAorCSAweDZELCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDc0LCAweDY0LCAweEEyLCAweERCLCAweDFELCAweDYwLAorCSAweDI0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFFLCAweDYwLAorCSAweEY0LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDg3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDE3LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweEE3LCAweDAxLCAweEFGLCAweEYzLCAweDZDLCAweEYzLAorCSAweEZFLCAweEEwLCAweEY2LCAweEEwLCAweDBBLCAweDA2LCAweDAzLCAweDA0LCAweDAwLCAweDY0LCAweDU1LCAweEZCLCAweDQwLCAweDQ5LCAweDZDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEY2LCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDg3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEM2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI0LCAweDYwLAorCSAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDFDLCAweDYwLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEVDLCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDQwLCAweDJCLCAweDBCLCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFELCAweDYwLCAweDZELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDFDLCAweDYwLCAweDkyLCAweDY1LCAweDAwLCAweDY0LCAweEE1LCAweERCLCAweEMzLCAweEYxLCAweDFBLCAweDYwLCAweDlBLCAweDYyLCAweEEyLCAweEQ5LAorCSAweDFGLCAweDYwLCAweDgwLCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweDA4LCAweEI0LCAweDAxLCAweEJDLCAweDI5LCAweDAyLCAweEEyLCAweERCLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDBGLCAweDRFLCAweEU0LCAweDYwLCAweDU4LCAweDRGLCAweEZCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFELCAweDYwLAorCSAweEE0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDgwLCAweDY0LCAweEEwLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDBDLCAweDI2LCAweDBDLCAweDAwLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LAorCSAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFFLCAweDYwLCAweDk3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDY0LCAweDMxLCAweDYwLCAweDJBLCAweDYyLCAweEEyLCAweERCLCAweDBELCAweDY0LCAweDUzLCAweEZCLCAweDFELCAweDYwLCAweEMzLCAweDY0LAorCSAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDcyLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LAorCSAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLAorCSAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDg4LCAweEYxLCAweDE5LCAweDYwLCAweDg2LCAweDYzLCAweEQzLCAweDgwLAorCSAweDY4LCAweEZELCAweDAxLCAweDAyLCAweDQzLCAweDAwLCAweDY4LCAweEYzLCAweDI5LCAweDQxLCAweEEwLCAweEQxLCAweDU4LCAweEQzLCAweEQxLCAweDgwLAorCSAweDY0LCAweDQ1LCAweDYwLCAweDQzLCAweDBGLCAweDA1LCAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgzLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLAorCSAweDgyLCAweEYxLCAweDA1LCAweDAyLCAweEJGLCAweEQzLCAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLAorCSAweDA3LCAweDAyLCAweDQ1LCAweDQ5LCAweDFFLCAweDYwLCAweDJBLCAweDY0LCAweDZCLCAweEZCLCAweDFGLCAweDYwLCAweDI5LCAweDc4LCAweEZGLCAweEZGLAorCSAweDJELCAweDYwLCAweDdBLCAweDY1LCAweEE1LCAweEQzLCAweDY1LCAweDQxLCAweDEwLCAweEEzLCAweDAxLCAweEE0LCAweEZFLCAweEI0LCAweEM0LCAweDg1LAorCSAweEZFLCAweEExLCAweEJELCAweEQzLCAweDU5LCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEQ1LCAweDgwLCAweDBGLCAweDAyLCAweEY5LCAweDAyLAorCSAweDA1LCAweDY1LCAweEU5LCAweDYwLCAweDU4LCAweDRFLCAweDdCLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDY0LCAweERDLCAweEZCLCAweEYyLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYyLCAweEZCLCAweDFFLCAweDYwLCAweEU4LCAweDc4LCAweEZGLCAweEZGLCAweDY4LCAweEYzLCAweDg4LCAweEYxLAorCSAweDA0LCAweEE0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDY4LCAweEZCLCAweEJELCAweDAxLCAweEUxLCAweEYzLCAweDI5LCAweDQ1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDc1LCAweDA1LCAweDFFLCAweDYwLCAweDJBLCAweDYzLCAweDZCLCAweEZELCAweDFBLCAweDYwLCAweDRDLCAweDYzLAorCSAweDFGLCAweDYwLCAweDI5LCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLAorCSAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA1LCAweDY1LCAweEU5LCAweDYwLCAweDU4LCAweDRFLCAweDdCLCAweDc4LAorCSAweEZGLCAweEZGLCAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDA0LCAweDY0LCAweERDLCAweEZCLCAweEYyLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYyLCAweEZCLCAweDg0LCAweEYzLCAweDYzLCAweEY1LCAweDQ4LCAweDdFLCAweDJBLCAweEZBLCAweDAyLCAweDYwLAorCSAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDI0LCAweDYwLCAweDc0LCAweDYyLCAweDI0LCAweDYwLCAweDI4LCAweDY0LCAweEEyLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweDYxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFBLCAweDYwLCAweDlBLCAweDYyLCAweDAwLCAweDYwLCAweDMyLCAweDY0LCAweEEyLCAweERCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLAorCSAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweDgxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweEZELCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDBGLCAweDYwLCAweEQwLCAweDYyLCAweEEyLCAweEQxLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDFCLCAweDYwLCAweEIxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDc0LCAweDY0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEEyLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFFLCAweDYwLCAweEY0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFELCAweDYwLAorCSAweEQzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE3LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweERELCAweDAxLCAweEFGLCAweEYzLCAweDZDLCAweEYzLCAweEZFLCAweEEwLCAweEY2LCAweEEwLAorCSAweDBBLCAweDA2LCAweDAzLCAweDA0LCAweDAwLCAweDY0LCAweDU1LCAweEZCLCAweDQwLCAweDQ5LCAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweEY2LCAweEEwLAorCSAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweDFELCAweDYwLCAweEQzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEM2LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLAorCSAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFELCAweDYwLCAweDZELCAweDc4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLAorCSAweDhBLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI0LCAweDYwLCAweEFBLCAweDYyLAorCSAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI0LCAweDYwLAorCSAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDVBLCAweERCLCAweDAwLCAweDY0LCAweDZBLCAweEZCLCAweDBGLCAweDYwLAorCSAweEQwLCAweDYyLCAweEEyLCAweEQxLCAweDAyLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBGLCAweDYwLAorCSAweERBLCAweDYyLCAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEEyLCAweERCLCAweDFCLCAweDYwLCAweDhBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEEzLCAweEQzLCAweDdGLCAweEYxLCAweDdFLCAweEZCLCAweEQwLCAweDgwLCAweDAwLCAweDY0LCAweDQwLCAweDAzLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEJGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweERFLCAweEZFLAorCSAweDBCLCAweDA0LCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLCAweDJGLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweERGLCAweDYwLAorCSAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDdFLCAweEYxLCAweDdGLCAweEY5LCAweDI0LCAweDYwLCAweDlBLCAweDYyLCAweEEyLCAweEQ5LAorCSAweDFFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDIwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEEyLCAweERCLCAweDFGLCAweDYwLCAweDVFLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweERGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDBGLCAweDYwLAorCSAweEQwLCAweDYyLCAweEEyLCAweEQxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDY0LAorCSAweDZCLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDBGLCAweDYwLAorCSAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUxLCAweDIzLAorCSAweDBCLCAweDAwLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLCAweDc2LCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDdGLCAweDYwLAorCSAweEZGLCAweDYxLCAweEExLCAweDg0LCAweDVBLCAweEQxLCAweDRBLCAweERCLCAweEExLCAweDg0LCAweDVBLCAweERCLCAweDQwLCAweDYwLCAweDAwLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDAyLCAweDY0LCAweDhDLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDhDLCAweEYzLCAweDAwLCAweDY1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDEyLCAweDAzLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LAorCSAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLAorCSAweDk5LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDdBLCAweDY0LCAweDU0LCAweEZCLAorCSAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEVGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFBLCAweDYwLAorCSAweDU4LCAweDRFLCAweERDLCAweDc4LCAweEZGLCAweEZGLCAweDBGLCAweDRFLCAweEVDLCAweDYwLCAweDU4LCAweDRGLCAweEI5LCAweDc4LCAweEZGLCAweEZGLAorCSAweDBFLCAweDRGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDFGLCAweDYwLCAweEQzLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFBLCAweDYwLCAweDU4LCAweDRFLCAweEVELCAweDc4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDk2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweEVGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDAxLCAweDY0LCAweDhDLCAweEZCLCAweEJGLCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDAxLCAweDYwLCAweDE0LCAweDYyLAorCSAweEEyLCAweEQxLCAweDEyLCAweDYwLCAweDQ2LCAweDYzLCAweEMzLCAweDg1LCAweEM2LCAweEEzLCAweDNBLCAweEEzLCAweEQ3LCAweDgwLCAweEFGLCAweEYzLAorCSAweDA5LCAweDA0LCAweEZFLCAweEEwLCAweDZDLCAweEYzLCAweDNBLCAweDA2LCAweEY2LCAweEEwLCAweDAwLCAweDY0LCAweDM3LCAweDA0LCAweDU1LCAweEZCLAorCSAweDQwLCAweDQ5LCAweDM0LCAweDAwLCAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgzLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLCAweDgyLCAweEYxLAorCSAweDA1LCAweDAyLCAweEJGLCAweEQzLCAweEQwLCAweDgwLCAweDgxLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLCAweEU1LCAweDAyLAorCSAweEJFLCAweEQzLCAweDVBLCAweEQxLCAweDYwLCAweDQ3LCAweDQwLCAweDRBLCAweDY0LCAweDQ3LCAweDQwLCAweDQ4LCAweDIwLCAweDYwLCAweDU4LCAweDRFLAorCSAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLAorCSAweDU4LCAweDRFLCAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDJFLCAweDY1LCAweDZDLCAweEYzLCAweEE1LCAweEQzLCAweEY2LCAweEEwLAorCSAweDQwLCAweEJDLCAweDA2LCAweDA0LCAweEE1LCAweERCLCAweDZBLCAweEYxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LCAweDZBLCAweEZCLAorCSAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEI4LCAweENDLCAweDg0LCAweDAxLCAweDAzLCAweEEyLCAweERCLCAweEZELCAweDYwLCAweEZGLCAweDY1LAorCSAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDBGLCAweDYwLCAweEQwLCAweDYyLCAweEEyLCAweEQxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweEMxLCAweEZFLCAweDZCLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDU1LCAweEYxLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LCAweEEyLCAweERCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDU2LCAweEYxLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLAorCSAweEMwLCAweDg0LCAweDVDLCAweEYxLCAweDU2LCAweEZCLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA1LCAweDY0LCAweDQ0LCAweDUyLCAweEZCLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDUyLCAweEYxLCAweDAwLCAweDY1LCAweDIwLCAweDQwLCAweDIwLCAweDJBLCAweDA2LCAweDAwLCAweDVDLCAweEYzLAorCSAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDY0LCAweDQ1LCAweDAxLCAweDA2LCAweDYwLCAweDQ1LCAweDJGLCAweDY3LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDA2LCAweDYwLCAweDQ1LCAweDU1LCAweEYxLCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDY0LCAweDQxLAorCSAweEQ1LCAweDg0LCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LCAweDQwLCAweDQ5LCAweDIwLCAweDQwLAorCSAweDIwLCAweDJBLCAweDA2LCAweDAwLCAweDJFLCAweDQzLCAweEYzLCAweDYwLCAweDU4LCAweDRFLCAweEE4LCAweDc4LCAweEZGLCAweEZGLCAweDQzLCAweDRFLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLAorCSAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDBGLCAweDYwLCAweEY2LCAweDYyLAorCSAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDQ2LCAweDI3LCAweEYyLCAweDcwLCAweDYzLCAweDYwLCAweDQwLCAweDBBLCAweDM2LCAweDA2LCAweDAwLCAweDE0LCAweDM2LCAweDBBLCAweDAwLAorCSAweDM3LCAweDM2LCAweDA0LCAweDAwLCAweDZFLCAweDM2LCAweDA0LCAweDAwLCAweEQwLCAweDYzLCAweDA0LCAweDAwLCAweDMzLCAweDYzLCAweDAyLCAweDAwLAorCSAweDIxLCAweDYzLCAweDAwLCAweDAwLCAweDFGLCAweDYwLCAweDVBLCAweDYxLCAweEExLCAweERELCAweDI2LCAweDQ2LCAweEJGLCAweEYyLCAweDAxLCAweDYwLAorCSAweDAwLCAweDY1LCAweEY0LCAweEExLCAweEQ1LCAweDgwLCAweDAwLCAweEY0LCAweDAyLCAweDI0LCAweDY1LCAweDQxLCAweDQxLCAweDQ4LCAweDFFLCAweDY1LAorCSAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LAorCSAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLAorCSAweEJELCAweERCLCAweEYwLCAweDAyLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEZELCAweEEwLAorCSAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEQxLCAweDgxLCAweEZFLCAweEExLCAweEM3LCAweDgzLCAweEY1LCAweDBELAorCSAweDA0LCAweDAwLCAweDFBLCAweDYwLCAweDRDLCAweDYxLCAweEEzLCAweEQzLCAweEExLCAweERCLCAweDMxLCAweDQwLCAweDA2LCAweDI2LCAweDU4LCAweDAwLAorCSAweDAwLCAweDY0LCAweDcwLCAweEZCLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEZDLCAweEEwLAorCSAweEZCLCAweEEwLCAweDA4LCAweDAzLCAweDI4LCAweDAzLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEQxLCAweDgxLCAweEZFLCAweEExLCAweEM3LCAweDgzLAorCSAweEY0LCAweDBELCAweDQ2LCAweDAwLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDAwLCAweEI4LCAweDcwLCAweEZCLCAweDZGLCAweEZCLCAweEJELCAweEQzLAorCSAweDNGLCAweDAyLCAweEEzLCAweEQzLCAweDYwLCAweDQ1LCAweDYwLCAweDQ3LCAweEI0LCAweDg0LCAweDYwLCAweDQxLCAweDNGLCAweEI1LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDcyLCAweEZCLCAweDY1LCAweDQ3LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweDcxLCAweEZCLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEZBLCAweEEzLCAweEM3LCAweDgzLCAweDFBLCAweDYwLCAweDQ0LCAweDYyLAorCSAweDYxLCAweDQ0LCAweEEyLCAweERCLCAweEQyLCAweDAxLCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAwLCAweEI4LCAweDZFLCAweEZCLCAweDc0LCAweEZCLAorCSAweDFGLCAweDAyLCAweDg3LCAweEYxLCAweDcwLCAweEYzLCAweDZELCAweEY5LCAweDA0LCAweDY1LCAweDYwLCAweDQwLCAweDAwLCAweDNBLCAweDA2LCAweDY1LAorCSAweDMxLCAweDQ0LCAweEI0LCAweDg0LCAweDQwLCAweDUxLCAweDAyLCAweDJBLCAweDBCLCAweDAwLCAweDA4LCAweEJDLCAweDQwLCAweDUxLCAweDcyLCAweEYzLAorCSAweDcxLCAweEYxLCAweDAwLCAweEI4LCAweDY0LCAweDQ1LCAweDAxLCAweDAzLCAweDY3LCAweDQ1LCAweDY1LCAweDUwLCAweENDLCAweDg0LCAweDczLCAweEZCLAorCSAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDBGLCAweDYwLCAweEVDLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJBLCAweDg0LCAweDAwLCAweDFGLCAweDYwLAorCSAweDUyLCAweDYxLCAweDAxLCAweDY0LCAweEExLCAweERCLCAweDIyLCAweDYwLCAweDU4LCAweDRFLCAweDNFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LAorCSAweDAwLCAweEY0LCAweDBELCAweEYyLCAweDgwLCAweEZCLCAweDAwLCAweDY0LCAweDg2LCAweEZCLCAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LAorCSAweDFFLCAweDY1LCAweEY0LCAweEE0LCAweEQ0LCAweEEwLCAweDYwLCAweDQxLCAweDAxLCAweDA2LCAweDJDLCAweDYxLCAweDQxLCAweDQ4LCAweDAyLCAweDYwLAorCSAweDAwLCAweDYzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweEYwLCAweDAyLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweDAxLCAweEE4LCAweEM5LCAweDgxLAorCSAweDA2LCAweDAzLCAweDY0LCAweDQ0LCAweEQxLCAweDgxLCAweEUwLCAweDg1LCAweDQyLCAweDA2LCAweEM3LCAweDgzLCAweEY1LCAweDAxLCAweDQzLCAweDQ4LAorCSAweDJELCAweDYwLCAweDJBLCAweDYzLCAweDQzLCAweDRBLCAweDY0LCAweDQxLCAweDI4LCAweDQzLCAweDAwLCAweDY1LCAweDQ1LCAweDRDLCAweDY1LCAweDVDLAorCSAweEJELCAweEQzLCAweDYxLCAweDQwLCAweDAwLCAweDM2LCAweDI3LCAweDAwLCAweENELCAweDgxLCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDYwLCAweDQ1LAorCSAweDA0LCAweDM2LCAweDYwLCAweDQ1LCAweDgyLCAweDM2LCAweDYwLCAweDQ1LCAweDg0LCAweDM2LCAweDYwLCAweDQ1LCAweDBCLCAweDM2LCAweDYwLCAweDQ1LAorCSAweDhCLCAweDM2LCAweDYwLCAweDQ1LCAweDE2LCAweDM2LCAweDYwLCAweDQ1LCAweDk2LCAweDM2LCAweDYwLCAweDQ1LCAweDY1LCAweDQwLCAweDAwLCAweDM2LAorCSAweEU3LCAweDAxLCAweDY0LCAweDQ0LCAweERDLCAweDlDLCAweDJDLCAweDQ0LCAweDAwLCAweDNBLCAweDAyLCAweDAwLCAweDQ1LCAweDRDLCAweEUwLCAweDAxLAorCSAweDJDLCAweDVFLCAweDY1LCAweDVGLCAweDAwLCAweDY1LCAweDQ1LCAweDRDLCAweDQzLCAweDQ4LCAweDJBLCAweDQzLCAweEJELCAweERCLCAweEZGLCAweEZGLAorCSAweDQzLCAweDRBLCAweDI4LCAweDQzLCAweEQ1LCAweDAxLCAweDJELCAweDYwLCAweDI4LCAweDY0LCAweDYwLCAweEZFLCAweEEwLCAweEQ5LCAweEZGLCAweEZGLAorCSAweDIwLCAweEZFLCAweDY0LCAweDQwLCAweDAxLCAweDNBLCAweDM5LCAweDAwLCAweDJBLCAweDQzLCAweDY1LCAweDQ0LCAweEEzLCAweERCLCAweDM1LCAweDAwLAorCSAweDIzLCAweDYwLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweERDLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweEE4LCAweDAyLCAweEE4LCAweDAyLCAweDAzLAorCSAweDQxLCAweDAyLCAweEY2LCAweDAxLCAweDBGLCAweDYwLCAweEVBLCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLCAweDY2LCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LCAweDRBLCAweERCLAorCSAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDI2LCAweDQ2LCAweDFGLCAweDYwLCAweDVBLCAweDYxLCAweEExLCAweEQzLCAweDI1LCAweEYyLCAweDYwLCAweDQ1LAorCSAweDI0LCAweEYwLCAweDAwLCAweEY0LCAweDY0LCAweDQzLCAweEM3LCAweDgzLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDAxLCAweEExLCAweDBBLCAweEYwLAorCSAweDA5LCAweEYyLCAweEQxLCAweDgwLCAweEZGLCAweEZGLCAweDA5LCAweDA3LCAweDA0LCAweDA0LCAweDYzLCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDA0LCAweDA2LCAweDIyLCAweDYwLCAweDU4LCAweDRFLCAweDNFLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweEYwLCAweEZGLCAweDY3LAorCSAweDIwLCAweDg4LCAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LAorCSAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDcxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDYwLCAweERBLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDIyLAorCSAweEFGLCAweDAxLCAweDAxLCAweDYwLCAweDJFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweEJGLCAweEI0LCAweEEyLCAweERCLCAweDFGLCAweDYwLAorCSAweDVBLCAweDYxLCAweEExLCAweEQzLCAweDI2LCAweDQ2LCAweDYwLCAweDQ1LCAweDFFLCAweDYwLCAweEZFLCAweDYzLCAweDAwLCAweEY0LCAweDA5LCAweEYyLAorCSAweEJELCAweERCLCAweEZGLCAweEZGLCAweDBBLCAweEYyLCAweEJELCAweERCLCAweDBCLCAweEYyLCAweEZGLCAweEZGLCAweEJELCAweERCLCAweDBDLCAweEYyLAorCSAweEEzLCAweERCLCAweEZBLCAweEEzLCAweDI2LCAweDQ2LCAweEEzLCAweEQzLCAweDI0LCAweEYwLCAweDAwLCAweDYxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLAorCSAweEQ0LCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LCAweDI1LCAweEYwLCAweDQyLCAweEZFLAorCSAweDA1LCAweDAzLCAweEZELCAweEExLCAweENDLCAweDg0LCAweDAxLCAweDAyLCAweENDLCAweDg0LCAweDAwLCAweDYxLCAweEYxLCAweDgxLCAweEQwLCAweDg0LAorCSAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LCAweDI4LCAweEYwLCAweDQyLCAweEZFLCAweDAxLCAweDAzLAorCSAweENDLCAweDg0LCAweEYxLCAweDgxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LAorCSAweDI5LCAweEYwLCAweDAxLCAweDAzLCAweENDLCAweDg0LCAweEQwLCAweDg0LCAweEEzLCAweERCLCAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAyLCAweEE4LCAweEZGLCAweEZGLCAweDAyLCAweDAyLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweEY1LCAweEZFLCAweDFFLCAweDYwLAorCSAweEZFLCAweDY0LCAweEEwLCAweEQxLCAweDA2LCAweEE0LCAweEEwLCAweEQzLCAweDY0LCAweDQ1LCAweDYwLCAweDQwLCAweDgwLCAweDJCLCAweDAzLCAweDAwLAorCSAweEZGLCAweDYwLCAweEZGLCAweDY0LCAweDk0LCAweDg1LCAweDAwLCAweDYwLCAweDk2LCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBCLCAweDA2LAorCSAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweEExLCAweEQzLCAweDZBLCAweEYzLCAweDAwLCAweEE4LCAweDA0LCAweEIwLCAweDA0LCAweDAyLCAweDAzLCAweDAzLAorCSAweDIzLCAweDYwLCAweDEwLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweDVBLCAweEQyLCAweDQwLCAweDQ4LAorCSAweDQwLCAweDRBLCAweDVBLCAweEQyLCAweDVBLCAweEQyLCAweDQwLCAweDRDLCAweDYwLCAweDQxLCAweDVBLCAweEQwLCAweDgwLCAweEY5LCAweDQwLCAweDYzLAorCSAweEFELCAweDgwLCAweEYwLCAweEEzLCAweDA5LCAweDAyLCAweDNDLCAweDAzLCAweDJDLCAweDQxLCAweDJBLCAweDQ0LCAweDQwLCAweDRDLCAweDI4LCAweDQ0LAorCSAweDQwLCAweDRBLCAweDAwLCAweDY0LCAweDQwLCAweDQ4LCAweEY0LCAweDAxLCAweEQxLCAweDgwLCAweDAxLCAweDAyLCAweDMxLCAweDA0LCAweDEwLCAweEEzLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweEE1LCAweDgwLCAweENGLCAweDgzLCAweDA4LCAweDAyLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LCAweDJBLCAweDQ0LAorCSAweDcwLCAweDhBLCAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEY1LCAweDAxLCAweEU3LCAweEEzLCAweDY0LCAweDQ0LCAweDAwLCAweEE4LAorCSAweDAwLCAweDYyLCAweDAyLCAweDAyLCAweDAwLCAweDYxLCAweDFDLCAweDAwLCAweEUwLCAweDg0LCAweERFLCAweDgyLCAweEZELCAweDA0LCAweDQyLCAweEZFLAorCSAweEY4LCAweDg0LCAweDYyLCAweDQ1LCAweEM3LCAweDgzLCAweDYwLCAweDQ1LCAweDAyLCAweEZFLCAweEQ1LCAweDg0LCAweDAyLCAweDA1LCAweDAxLCAweDA1LAorCSAweDYxLCAweDQ0LCAweENGLCAweDgzLCAweDYwLCAweDQxLCAweDA4LCAweDAzLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LCAweDJBLCAweDQ0LCAweDcwLCAweDhBLAorCSAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEYxLCAweDAxLCAweENFLCAweDgyLCAweEU5LCAweDgxLCAweEZELCAweDAyLCAweEYxLCAweDgxLAorCSAweDA5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDVBLCAweEQyLCAweDNGLCAweEI1LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEI0LCAweDg0LCAweDYxLCAweDQ1LCAweEQ0LCAweDg0LAorCSAweEMwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDkzLCAweDFGLCAweDYwLCAweDUyLCAweDYxLCAweEExLCAweEQzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweEZGLCAweEZGLCAweDAyLCAweDAzLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDY1LCAweDczLCAweDQ0LAorCSAweEQ0LCAweDkzLCAweDZBLCAweEYzLCAweDI2LCAweDQ2LCAweDA0LCAweEJDLCAweEEyLCAweERCLCAweDI2LCAweEYwLCAweEZGLCAweDY3LCAweDIwLCAweDg4LAorCSAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LCAweDIwLCAweDYwLAorCSAweDU4LCAweDRFLCAweDU1LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRFLCAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweDZDLCAweEYzLAorCSAweEZGLCAweEZGLCAweDAwLCAweEI4LCAweENDLCAweDg0LCAweDAxLCAweDAzLCAweEEyLCAweERCLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLCAweEEyLCAweEQxLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDI0LCAweDYwLCAweEFBLCAweDYyLCAweDFBLCAweDYwLAorCSAweEEyLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDBGLCAweDYwLCAweEQ4LCAweDYyLAorCSAweEEyLCAweEQxLCAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI4LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDBGLCAweEI0LCAweDU5LCAweDAwLCAweEZGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDA0LCAweDY0LCAweEE1LCAweERCLCAweDEyLCAweDAwLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDBDLCAweDY0LAorCSAweEE1LCAweERCLCAweDBELCAweDAwLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDA2LCAweDY0LCAweEE1LCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDA4LCAweDY0LCAweEE1LCAweERCLCAweDIzLCAweDYwLAorCSAweEExLCAweDY0LCAweEExLCAweEZCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweEYzLAorCSAweDdGLCAweEZCLCAweEE0LCAweEZCLCAweDAyLCAweDYwLCAweEVFLCAweDY0LCAweEEzLCAweEZCLCAweDA3LCAweDY0LCAweEE1LCAweEZCLCAweDIzLCAweDYwLAorCSAweEExLCAweDY0LCAweEExLCAweEZCLCAweEZGLCAweEZGLCAweERGLCAweEZFLCAweDAwLCAweDY0LCAweDE5LCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDBELCAweDYzLCAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweDIzLCAweDYwLAorCSAweDhFLCAweDYzLCAweEExLCAweEZELCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweDYwLAorCSAweDRCLCAweDYzLCAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweDI5LCAweEY1LCAweDI0LCAweDYwLCAweDdBLCAweDYzLAorCSAweDI0LCAweDYwLCAweDRDLCAweDY0LCAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDY0LCAweEEzLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweEY5LCAweEZFLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEE3LCAweDAxLCAweDAwLCAweDM2LCAweEE4LCAweDAxLAorCSAweDAxLCAweDM2LCAweEFCLCAweDAxLCAweDAyLCAweDM2LCAweEFFLCAweDAxLCAweDAzLCAweDM2LCAweEI1LCAweDAxLCAweDA0LCAweDM2LCAweEQxLCAweDAxLAorCSAweDA1LCAweDM2LCAweENGLCAweDAxLCAweDA2LCAweDM2LCAweEYxLCAweDAxLCAweDA3LCAweDM2LCAweENCLCAweDAxLCAweDA4LCAweDM2LCAweEI3LCAweDAxLAorCSAweDA5LCAweDM2LCAweDBDLCAweDAwLCAweDBBLCAweDM2LCAweDBELCAweDAwLCAweDBCLCAweDM2LCAweDBFLCAweDAwLCAweDBDLCAweDM2LCAweDE3LCAweDAwLAorCSAweDBELCAweDM2LCAweDBELCAweDAwLCAweDBFLCAweDM2LCAweDFFLCAweDAwLCAweDBGLCAweDM2LCAweDMyLCAweDAwLCAweDAyLCAweDYwLCAweDAwLCAweDY0LAorCSAweDA4LCAweDAwLCAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweDA1LCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDAyLCAweDAwLCAweDIwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDMyLCAweDQ1LCAweEI0LCAweDg1LCAweDQ1LCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLAorCSAweEQxLCAweDYzLCAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDA1LCAweDAwLCAweDkwLCAweDYwLCAweDAwLCAweEU4LCAweDI0LCAweDYwLAorCSAweDBELCAweDYzLCAweDA0LCAweDAwLCAweDkxLCAweDYwLCAweDAwLCAweEU4LCAweDI0LCAweDYwLCAweEJCLCAweDYzLCAweDI4LCAweEU4LCAweDBDLCAweDYwLAorCSAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDkxLCAweDYwLCAweDAwLCAweEU4LCAweDI4LCAweEU4LCAweEQ5LCAweDYwLCAweEZFLCAweDY0LCAweDMyLCAweDQ1LCAweEE0LCAweDg1LCAweDQ1LCAweDUyLAorCSAweDk5LCAweEZGLCAweEE1LCAweDRGLCAweEZGLCAweEI0LCAweDA3LCAweEZCLCAweDk4LCAweEZGLCAweEEzLCAweDYwLCAweDRCLCAweDYzLCAweDBDLCAweDYwLAorCSAweDE2LCAweDY0LCAweEEwLCAweERELCAweDYyLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDI4LCAweEYzLCAweDQ3LCAweEZGLCAweDYwLCAweDQwLCAweDA3LCAweDM3LAorCSAweDRCLCAweDAwLCAweDA1LCAweDNCLCAweDA0LCAweDAwLCAweEZGLCAweDBBLCAweDgwLCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDI5LCAweEY1LAorCSAweDJBLCAweEYzLCAweDQ3LCAweEZGLCAweDNGLCAweEYwLCAweDAxLCAweDFCLCAweDAxLCAweDY0LCAweDYwLCAweDU2LCAweEFELCAweEUyLCAweEI1LCAweEZGLAorCSAweDZDLCAweDQwLCAweDQwLCAweEUxLCAweEExLCAweEZGLCAweDAwLCAweEY0LCAweDZFLCAweDYxLCAweDEyLCAweDYyLCAweDY0LCAweDQzLCAweDAxLCAweEUxLAorCSAweDAzLCAweDY0LCAweEUyLCAweEQwLCAweEM5LCAweDgxLCAweDY0LCAweDRDLCAweENDLCAweDg0LCAweERBLCAweDgyLCAweEZBLCAweDAyLCAweDAxLCAweDYwLAorCSAweDAwLCAweDZCLCAweDlBLCAweEZGLCAweENBLCAweDgyLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLCAweEZGLCAweEZGLCAweDdBLCAweEQwLAorCSAweEExLCAweEZGLCAweDY0LCAweDRDLCAweEZDLCAweDFDLCAweEY4LCAweDFELCAweDAwLCAweEI5LCAweDA2LCAweDFFLCAweDAyLCAweDAyLCAweDAwLCAweEY0LAorCSAweERBLCAweDgyLCAweDVBLCAweEQyLCAweEExLCAweEZGLCAweDYwLCAweDRELCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDA4LCAweDAwLCAweDI4LCAweEYzLAorCSAweEE1LCAweDYwLCAweEM0LCAweDY1LCAweDYwLCAweDQwLCAweDBFLCAweDNCLCAweDAyLCAweDAwLCAweDgwLCAweDRDLCAweEZFLCAweDAxLCAweEExLCAweEZGLAorCSAweDg3LCAweDRFLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDY3LCAweDRDLCAweEZGLCAweEZGLCAweEJDLCAweEZGLAorCSAweDAwLCAweEUxLCAweEQ1LCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQwLCAweDQ2LCAweDYwLCAweDQxLCAweEI1LCAweEZGLAorCSAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweDI5LCAweEY1LCAweDNGLCAweEYwLCAweDI0LCAweEYyLCAweDQ0LCAweDQzLCAweDQwLCAweDQ0LCAweDAwLCAweEY0LAorCSAweEYzLCAweDYwLCAweEEwLCAweDY1LCAweDEwLCAweDYyLCAweDVBLCAweEQyLCAweEQ5LCAweDgxLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweEZCLCAweDAyLAorCSAweDYxLCAweDQ1LCAweDI0LCAweDQ0LCAweEQ0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEZELCAweEE1LCAweDQ4LCAweDYwLAorCSAweDAwLCAweDY0LCAweEM0LCAweDlELCAweDBELCAweDYwLCAweDAwLCAweDZCLCAweDI0LCAweDQ0LCAweEMwLCAweDgzLCAweEJCLCAweEZGLCAweDI5LCAweEY1LAorCSAweDAxLCAweEUxLCAweDAwLCAweEY0LCAweDZDLCAweDYxLCAweDEwLCAweDYyLCAweDA1LCAweDAwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQxLCAweDA0LCAweDYyLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDEwLCAweDFBLCAweDAwLCAweDI2LCAweDQ0LCAweDAxLCAweDI2LAorCSAweDBDLCAweDAwLCAweDI0LCAweDQ0LCAweEM4LCAweDg0LCAweDQwLCAweDQ0LCAweDAyLCAweDAzLCAweDZDLCAweDQ1LCAweEYzLCAweDAxLCAweDAzLCAweDE1LAorCSAweDAxLCAweDY0LCAweDA1LCAweEZBLCAweDE1LCAweDAwLCAweDZDLCAweDQ1LCAweEVELCAweDAxLCAweDIzLCAweDQ0LCAweEM4LCAweDg0LCAweDQwLCAweDQzLAorCSAweDAyLCAweDAzLCAweDZDLCAweDQ1LCAweEU3LCAweDAxLCAweDAwLCAweDY0LCAweDAxLCAweDE1LCAweDAxLCAweDY0LCAweDZDLCAweDQ1LCAweDA1LCAweEZCLAorCSAweEUyLCAweEQyLCAweERBLCAweDgyLCAweEM5LCAweDgxLCAweDYwLCAweDRDLCAweERELCAweDFDLCAweEQ3LCAweDAzLCAweEJDLCAweEZGLCAweERBLCAweDAxLAorCSAweDAwLCAweEUxLCAweEQ1LCAweEZFLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweDY3LCAweDRDLCAweDQzLCAweEZGLAorCSAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDAxLCAweEUxLCAweDAxLCAweDYwLCAweDY5LCAweDZCLCAweEE1LCAweDYwLAorCSAweEM0LCAweDY0LCAweDYwLCAweDRDLCAweEJCLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDRDLCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDYwLCAweDRDLCAweEZDLCAweDAxLCAweDI5LCAweEYzLCAweDJBLCAweEYxLCAweDA3LCAweEI1LCAweDA0LCAweEUxLCAweDY1LCAweDQxLCAweDY0LCAweDU0LAorCSAweENELCAweEUyLCAweDk1LCAweDgxLCAweEExLCAweDVELCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDAxLCAweDYxLCAweDQ0LCAweEZFLCAweEZCLAorCSAweEZGLCAweEZELCAweEZGLCAweDAxLCAweDdGLCAweDY3LCAweDAxLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEIxLCAweEZFLCAweDA4LCAweDA1LAorCSAweEIwLCAweEZFLCAweDA5LCAweDA1LCAweEIyLCAweEZFLCAweEIzLCAweEZFLCAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LAorCSAweDJELCAweDYwLCAweDVELCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweEYzLCAweDI5LCAweEYxLCAweDQwLCAweDQ0LCAweDQ0LCAweDQ1LCAweDJBLCAweEYxLAorCSAweDJCLCAweEYxLCAweDQ0LCAweDQ2LCAweDQ0LCAweDQ3LCAweDNGLCAweEI0LCAweEUwLCAweDg1LCAweDFGLCAweDYwLCAweDg4LCAweDY0LCAweDQ0LCAweEQ3LAorCSAweDU4LCAweDQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDFDLCAweDYwLCAweEI0LCAweDdDLCAweEE0LCAweEQzLCAweDYxLCAweDQzLCAweDA0LCAweEI0LAorCSAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLCAweDA2LCAweDAwLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LCAweDA1LCAweEZELAorCSAweDA0LCAweEZCLCAweDEwLCAweDc1LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg2LCAweDNFLCAweEI0LCAweEZFLCAweDBCLCAweDA1LCAweEI1LCAweEZFLAorCSAweDAyLCAweDI0LCAweEExLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEI3LCAweEZFLCAweDA3LCAweDA1LCAweDc4LCAweDQzLCAweDAxLCAweDYxLAorCSAweDI0LCAweDYwLCAweERELCAweDc4LCAweDJELCAweDYwLCAweDk4LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ0LCAweDAwLCAweDdGLCAweEYyLCAweEEwLAorCSAweDYwLCAweDQ1LCAweDA1LCAweDA1LCAweDIwLCAweDYwLCAweDE2LCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDc4LCAweDQzLAorCSAweDAxLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LCAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LCAweDdGLCAweDYwLAorCSAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEwLCAweDAyLCAweDEwLCAweDY0LCAweDQwLCAweDQwLAorCSAweDAyLCAweDY0LCAweDQwLCAweDUwLCAweDYxLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA0LCAweDAwLCAweDEwLCAweEUwLCAweDQ2LCAweDYwLAorCSAweDA5LCAweEUwLCAweDAwLCAweDAwLCAweDI3LCAweEYxLCAweDAwLCAweDY2LCAweDIwLCAweDc4LCAweDQyLCAweEZFLCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDFBLCAweDAyLCAweDFDLCAweDYwLAorCSAweEI0LCAweDYzLCAweEEzLCAweEQzLCAweDA3LCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LCAweDA0LCAweDAzLCAweDAzLCAweDAyLCAweERDLCAweEY5LAorCSAweDAwLCAweDY3LCAweDBGLCAweDAwLCAweDAwLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEFDLCAweDAxLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLAorCSAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDA0LCAweDAwLCAweDIwLCAweDQ0LCAweDgwLCAweEJDLCAweDQwLCAweDQwLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LAorCSAweDAyLCAweDYxLCAweDMxLCAweDAyLCAweDFDLCAweDYwLCAweEI0LCAweDYzLCAweEEzLCAweEQzLCAweDAxLCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LAorCSAweDAzLCAweDAzLCAweDAyLCAweDAyLCAweERDLCAweEY5LCAweEZGLCAweEZGLCAweDAyLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDI1LCAweDYwLAorCSAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDlGLCAweEYxLCAweDIwLCAweDQ0LCAweDY0LCAweDQwLCAweEZGLCAweDI2LCAweDFCLCAweDAwLCAweDdGLCAweEI0LAorCSAweDQwLCAweDQwLCAweDVDLCAweDVFLCAweDgyLCAweEZGLCAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDQwLCAweDQ2LCAweDVDLCAweDQxLCAweDg3LCAweEZGLAorCSAweDYyLCAweEZGLCAweDAwLCAweDYzLCAweDI0LCAweDYwLCAweDVFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LAorCSAweDA0LCAweDAzLCAweDA5LCAweEYyLCAweDBGLCAweEZDLCAweEFDLCAweDg2LCAweEZCLCAweDAxLCAweDI0LCAweDYwLCAweDlFLCAweDYyLCAweDA2LCAweDY0LAorCSAweEEyLCAweERCLCAweDJELCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIwLCAweDQwLCAweDgwLCAweDJBLAorCSAweDAyLCAweDAwLCAweDdGLCAweDY3LCAweDA2LCAweDYxLCAweDYwLCAweDQ1LCAweDFDLCAweDYwLCAweEI0LCAweDdDLCAweEE0LCAweEQzLCAweDYxLCAweDQzLAorCSAweDA0LCAweEI0LCAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLCAweDU1LCAweDAxLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LAorCSAweDA1LCAweEZELCAweDA0LCAweEZCLCAweDIwLCAweDQwLCAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDEwLCAweDc1LCAweDA3LCAweDAwLCAweDJELCAweDYwLAorCSAweDlDLCAweDYyLCAweDAxLCAweDY0LCAweEEyLCAweERCLCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDEwLCAweDc1LCAweDQzLCAweDAxLCAweDI1LCAweDQ2LAorCSAweDAxLCAweEYyLCAweDA4LCAweEYwLCAweDYwLCAweDQ3LCAweDAzLCAweEI0LCAweDAzLCAweEFDLCAweDdGLCAweDY3LCAweDAzLCAweDYxLCAweDA4LCAweDAyLAorCSAweDI0LCAweDYwLCAweDdBLCAweDY0LCAweDQwLCAweDRCLCAweDJDLCAweDYwLCAweDU4LCAweDRELCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDJCLCAweDQ5LCAweDAwLCAweDI1LCAweDQ0LCAweDFGLCAweEI0LCAweEUwLCAweDg1LAorCSAweDI1LCAweDYwLCAweEVCLCAweDY0LCAweEM0LCAweDk4LCAweEZGLCAweEZGLCAweEMwLCAweEZFLCAweDNELCAweDAwLCAweEMxLCAweEZFLCAweDNCLCAweDAwLAorCSAweEMyLCAweEZFLCAweDM5LCAweDAwLCAweEMzLCAweEZFLCAweDM3LCAweDAwLCAweEM0LCAweEZFLCAweDM1LCAweDAwLCAweEM1LCAweEZFLCAweDMzLCAweDAwLAorCSAweEM2LCAweEZFLCAweDMxLCAweDAwLCAweEM3LCAweEZFLCAweDJGLCAweDAwLCAweEM4LCAweEZFLCAweDJELCAweDAwLCAweEM5LCAweEZFLCAweDJCLCAweDAwLAorCSAweENBLCAweEZFLCAweDI5LCAweDAwLCAweENCLCAweEZFLCAweDI3LCAweDAwLCAweENDLCAweEZFLCAweDI1LCAweDAwLCAweENELCAweEZFLCAweDIzLCAweDAwLAorCSAweENFLCAweEZFLCAweDIxLCAweDAwLCAweENGLCAweEZFLCAweDFGLCAweDAwLCAweEQwLCAweEZFLCAweDFELCAweDAwLCAweEQxLCAweEZFLCAweDFCLCAweDAwLAorCSAweEQyLCAweEZFLCAweDE5LCAweDAwLCAweEQzLCAweEZFLCAweDE3LCAweDAwLCAweEQ0LCAweEZFLCAweDE1LCAweDAwLCAweEQ1LCAweEZFLCAweDEzLCAweDAwLAorCSAweEQ2LCAweEZFLCAweDExLCAweDAwLCAweEQ3LCAweEZFLCAweDBGLCAweDAwLCAweEQ4LCAweEZFLCAweDBELCAweDAwLCAweEQ5LCAweEZFLCAweDBCLCAweDAwLAorCSAweERBLCAweEZFLCAweDA5LCAweDAwLCAweERCLCAweEZFLCAweDA3LCAweDAwLCAweERDLCAweEZFLCAweDA1LCAweDAwLCAweERELCAweEZFLCAweDAzLCAweDAwLAorCSAweERFLCAweEZFLCAweDAxLCAweDAwLCAweERGLCAweEZFLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDlGLCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlELCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDlDLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlBLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDk5LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk4LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk3LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk1LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDk0LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkyLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDkxLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkwLCAweEZFLCAweEYwLCAweDg0LCAweDA2LCAweEZCLCAweDhGLCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhELCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDhDLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhBLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDg5LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg4LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg3LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg1LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDg0LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgyLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDgxLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgwLCAweEZFLCAweEYwLCAweDg0LCAweDA1LCAweEZCLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDVDLCAweDVDLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDI3LAorCSAweDU1LCAweDAwLCAweDA1LCAweDYwLCAweDAwLCAweDYzLCAweDA1LCAweEZELCAweDMwLCAweDQ0LCAweEJELCAweERCLCAweDMxLCAweDQ0LCAweEJELCAweERCLAorCSAweDMyLCAweDQ0LCAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLCAweDM1LCAweDQ0LCAweEJELCAweERCLAorCSAweDM2LCAweDQ0LCAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLCAweDM5LCAweDQ0LCAweEJELCAweERCLAorCSAweDNBLCAweDQ0LCAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLCAweDNELCAweDQ0LCAweEJELCAweERCLAorCSAweDNFLCAweDQ0LCAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDYxLCAweDYxLCAweDQ0LCAweDAyLCAweDM2LCAweDgyLCAweEZGLAorCSAweDAzLCAweDM2LCAweDgzLCAweEZGLCAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLAorCSAweDA3LCAweDM2LCAweDg3LCAweEZGLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLAorCSAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLAorCSAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLAorCSAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLAorCSAweDJGLCAweDQ0LCAweEJELCAweERCLCAweERELCAweDgxLCAweDA4LCAweDNBLCAweEQwLCAweDAxLCAweDU0LCAweDAwLCAweDI3LCAweDQwLCAweDEwLCAweDI2LAorCSAweDMwLCAweDAwLCAweDI2LCAweDQ0LCAweDAxLCAweDM2LCAweDJELCAweDAwLCAweDAyLCAweDM2LCAweDgyLCAweEZGLCAweDAzLCAweDM2LCAweDgzLCAweEZGLAorCSAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLCAweDI1LCAweDQ0LCAweDAwLCAweDM2LAorCSAweDQ0LCAweDQwLCAweDAxLCAweDM2LCAweDQ0LCAweDQxLCAweDAyLCAweDM2LCAweDQ0LCAweDQyLCAweDAzLCAweDM2LCAweDQ0LCAweDQzLCAweDA0LCAweDM2LAorCSAweDQ0LCAweDQ0LCAweDA1LCAweDM2LCAweDQ0LCAweDQ1LCAweDA2LCAweDM2LCAweDQ0LCAweDQ2LCAweDA3LCAweDM2LCAweDQ0LCAweDQ3LCAweDA4LCAweDM2LAorCSAweDQ0LCAweDQ4LCAweDA5LCAweDM2LCAweDQ0LCAweDQ5LCAweDBBLCAweDM2LCAweDQ0LCAweDRBLCAweDBCLCAweDM2LCAweDQ0LCAweDRCLCAweDBDLCAweDM2LAorCSAweDQ0LCAweDRDLCAweDBELCAweDM2LCAweDQ0LCAweDRELCAweDBFLCAweDM2LCAweDQ0LCAweDRFLCAweDBGLCAweDM2LCAweDQ0LCAweDRGLCAweDg3LCAweEZGLAorCSAweDIxLCAweDAwLCAweDI1LCAweDQ0LCAweDEwLCAweDM2LCAweDQ0LCAweDUwLCAweDExLCAweDM2LCAweDQ0LCAweDUxLCAweDEyLCAweDM2LCAweDQ0LCAweDUyLAorCSAweDEzLCAweDM2LCAweDQ0LCAweDUzLCAweDE0LCAweDM2LCAweDQ0LCAweDU0LCAweDE1LCAweDM2LCAweDQ0LCAweDU1LCAweDE2LCAweDM2LCAweDQ0LCAweDU2LAorCSAweDE3LCAweDM2LCAweDQ0LCAweDU3LCAweDE4LCAweDM2LCAweDQ0LCAweDU4LCAweDE5LCAweDM2LCAweDQ0LCAweDU5LCAweDFBLCAweDM2LCAweDQ0LCAweDVBLAorCSAweDFCLCAweDM2LCAweDQ0LCAweDVCLCAweDFDLCAweDM2LCAweDQ0LCAweDVDLCAweDFELCAweDM2LCAweDQ0LCAweDVELCAweDFFLCAweDM2LCAweDQ0LCAweDVFLAorCSAweDFGLCAweDM2LCAweDQ0LCAweDVGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweEFFLCAweDYwLCAweDU4LCAweDRGLAorCSAweDZGLCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweDYxLCAweDdGLCAweDY3LCAweDBCLCAweDAyLCAweDAwLCAweEYwLCAweDI0LCAweDYwLCAweDdBLCAweDYyLAorCSAweDA0LCAweDY0LCAweEEyLCAweERCLCAweDVBLCAweEQ5LCAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLAorCSAweDExLCAweDAyLCAweDI0LCAweDYwLCAweDlFLCAweDYyLCAweDFBLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDUwLCAweDYzLCAweDVBLCAweERELAorCSAweDI3LCAweDYwLCAweDZFLCAweDY0LCAweEExLCAweEZCLCAweDJELCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYzLAorCSAweDA1LCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBGLCAweDAyLCAweDI0LCAweDYwLCAweDlFLCAweDYyLCAweDFDLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLAorCSAweDUwLCAweDYzLCAweDVBLCAweERELCAweDI3LCAweDYwLCAweDg4LCAweDY0LCAweEExLCAweEZCLCAweDJELCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDAyLCAweDYxLCAweDNFLCAweDAyLCAweDI1LCAweDQ1LCAweDIwLCAweDQ0LCAweDgwLCAweDJBLCAweDNBLCAweDAwLCAweEYxLCAweDYwLCAweDAwLCAweDY0LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweEYxLCAweDYwLCAweDAxLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAzLAorCSAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDMwLCAweDAzLCAweDI5LCAweDAwLCAweDJELCAweDYwLCAweDBFLCAweDYyLAorCSAweEEyLCAweEQxLCAweEJBLCAweEYzLCAweDFGLCAweDYwLCAweDgyLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweERCLCAweDI1LCAweDQ1LCAweDIzLCAweDYwLAorCSAweEU0LCAweDYzLCAweDAyLCAweDYxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEQ0LCAweDgwLCAweEJELCAweEQzLCAweEJELCAweEQ1LCAweENELCAweDgxLAorCSAweDAyLCAweDAzLCAweDE1LCAweDAzLCAweEY3LCAweDAxLCAweEEyLCAweEZGLCAweEE2LCAweEQzLCAweDQwLCAweDRDLCAweDAwLCAweEE4LCAweDY3LCAweDQzLAorCSAweDBDLCAweDAyLCAweEEyLCAweERELCAweDQyLCAweDQ4LCAweDY0LCAweDQxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEM0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDY2LCAweDQ0LCAweDI4LCAweERCLCAweDAyLCAweDAzLCAweDJDLCAweDU4LCAweEEzLCAweEZGLCAweDBDLCAweDYxLCAweDAzLCAweDAwLCAweDA0LCAweDYxLAorCSAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDBFLCAweDYyLCAweEEyLCAweEQxLAorCSAweEJBLCAweEYzLCAweDFGLCAweDYwLCAweDgyLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweERCLCAweDFGLCAweDYwLCAweDg2LCAweDYxLCAweDAxLCAweDY0LAorCSAweEExLCAweERCLCAweEZGLCAweEZGLCAweEM0LCAweEZFLCAweEVFLCAweDAxLCAweEM2LCAweEZFLCAweEVDLCAweDAxLCAweDdFLCAweDYwLCAweEMwLCAweDY0LAorCSAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDAyLCAweDYxLCAweDNGLCAweDAyLCAweDI1LCAweDQ1LCAweEY4LCAweDJCLCAweDNCLCAweDAwLCAweDJFLCAweEY1LAorCSAweDY3LCAweDQ0LCAweEQ0LCAweDgwLCAweDIwLCAweDYwLCAweDI0LCAweDYzLCAweDM5LCAweDAzLCAweDYwLCAweDYxLCAweDI0LCAweDQ0LCAweDAxLCAweDI3LAorCSAweDI5LCAweDAwLCAweEEzLCAweEZDLCAweEE0LCAweEY4LCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LAorCSAweDY0LCAweDU4LCAweDA4LCAweEEzLCAweEY4LCAweDAyLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEZFLCAweEEwLAorCSAweEZBLCAweDYwLCAweDAwLCAweDY0LCAweEQwLCAweDgwLCAweDE0LCAweDAyLCAweDEzLCAweDAyLCAweDA0LCAweEEzLCAweEJFLCAweEQzLCAweEJELCAweEQxLAorCSAweDBGLCAweDE4LCAweEQ0LCAweDgwLCAweDBELCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDY0LCAweDQxLAorCSAweERELCAweDgxLCAweEUxLCAweDgxLCAweENCLCAweDgzLCAweDQ2LCAweDY1LCAweDJGLCAweDYwLCAweDU4LCAweDRGLCAweDAxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY3LCAweDBBLCAweDAwLCAweEJELCAweEQzLCAweEJFLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LCAweDY0LCAweDU4LAorCSAweDA4LCAweEEzLCAweEY4LCAweDAyLCAweDA0LCAweDYxLCAweDdGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDY0LCAweDIzLCAweEZBLAorCSAweDY3LCAweDQ0LCAweDI0LCAweEZBLCAweDYyLCAweDQxLCAweDNDLCAweDYwLCAweDAwLCAweDY1LCAweDFBLCAweDYzLCAweDY4LCAweDYwLCAweDI4LCAweDY0LAorCSAweDY1LCAweDQ2LCAweDU4LCAweEQwLCAweDJFLCAweEY1LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweENCLCAweDgzLCAweEJGLCAweEQxLCAweDRBLCAweDY1LCAweDY0LCAweDQzLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDAxLCAweDI2LAorCSAweERDLCAweDgxLCAweEU5LCAweDg0LCAweERDLCAweDg0LCAweDIzLCAweEZBLCAweDA5LCAweDAwLCAweDRCLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLAorCSAweEU4LCAweDg0LCAweERDLCAweDg0LCAweDIzLCAweEZBLCAweEJGLCAweEQxLCAweDRBLCAweDY1LCAweDY0LCAweDQzLCAweDJGLCAweDYwLCAweDU4LCAweDRGLAorCSAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweEZGLCAweEZGLCAweEUwLCAweEEwLAorCSAweDIwLCAweDY0LCAweDAxLCAweDA2LCAweDI1LCAweEZBLCAweDIzLCAweEYyLCAweERGLCAweEQxLCAweENDLCAweDg0LCAweEUwLCAweDg1LCAweDBCLCAweDA2LAorCSAweEJGLCAweEQxLCAweDY0LCAweDQxLCAweEQ1LCAweDgwLCAweDY0LCAweDQzLCAweDAxLCAweDA2LCAweDY1LCAweDQxLCAweDRBLCAweDY1LCAweDI5LCAweDYwLAorCSAweDU4LCAweDRGLCAweDgzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweERDLCAweEYzLCAweDAyLCAweDYzLAorCSAweDIzLCAweEZDLCAweDA3LCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDRCLCAweEQzLCAweEJGLCAweEQzLAorCSAweDYwLCAweDQxLCAweEM5LCAweDgzLCAweEU5LCAweDgxLCAweERELCAweDgxLCAweEEzLCAweEZBLCAweEUwLCAweDgxLCAweDNDLCAweDYwLCAweDAwLCAweDY3LAorCSAweDAyLCAweDI0LCAweDAyLCAweEE0LCAweDYwLCAweDQ3LCAweDQwLCAweDRCLCAweEM5LCAweDgxLCAweDRBLCAweDY1LCAweEFCLCAweDQ2LCAweDU5LCAweEQwLAorCSAweEFCLCAweDQ2LCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY2LCAweDFGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLAorCSAweDYwLCAweDQ3LCAweDI1LCAweEZBLCAweDAwLCAweDdFLCAweDYwLCAweDQ3LCAweDAxLCAweDI2LCAweERDLCAweDg0LCAweDYwLCAweDQxLCAweEU4LCAweDg0LAorCSAweEQ4LCAweDg0LCAweDIzLCAweEZBLCAweEFCLCAweDAxLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLAorCSAweDAwLCAweDdGLCAweDI1LCAweEZBLCAweDYwLCAweDQxLCAweDAxLCAweDI2LCAweERELCAweDgxLCAweEU5LCAweDg0LCAweEQ4LCAweDg0LCAweDIzLCAweEZBLAorCSAweDlELCAweDAxLCAweDI4LCAweDYwLCAweEUyLCAweDYzLCAweEJGLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweERDLCAweDg0LAorCSAweDIzLCAweEZBLCAweDRBLCAweDY1LCAweDJGLCAweDYwLCAweDU4LCAweDRGLCAweDAxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI4LCAweDYwLCAweEUyLCAweDYzLCAweDIzLCAweEYyLCAweEMwLCAweDY1LCAweENDLCAweDg0LCAweEUwLCAweDgxLCAweDBBLCAweDA0LAorCSAweEJGLCAweERCLCAweEQ1LCAweDgwLCAweDA3LCAweDAzLCAweDAxLCAweDA2LCAweDY1LCAweDQxLCAweDYxLCAweDQ0LCAweEJGLCAweERCLCAweDRBLCAweDY1LAorCSAweDU4LCAweDRGLCAweEFBLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAzLCAweDRFLCAweDI4LCAweDYwLCAweDU4LCAweDQzLAorCSAweDVDLCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDYwLCAweEM2LCAweDYxLCAweDI5LCAweDYwLCAweEE0LCAweDYyLCAweEEyLCAweEQzLCAweEExLCAweERCLAorCSAweENDLCAweDg0LCAweEE4LCAweDgzLCAweDA1LCAweDA0LCAweDI5LCAweDYwLCAweEE0LCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLAorCSAweDBFLCAweDQzLCAweDgxLCAweDAxLCAweDIzLCAweEYyLCAweDFDLCAweDYwLCAweDhFLCAweDY1LCAweDYwLCAweDQxLCAweDFDLCAweDYwLCAweDJBLCAweDYzLAorCSAweEEzLCAweERCLCAweEZGLCAweEExLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLCAweDdFLCAweEE4LCAweDVCLCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LAorCSAweDAyLCAweDY0LCAweEZGLCAweEExLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweDAxLCAweDAzLCAweEY1LCAweDAxLCAweDJFLCAweEY1LCAweDAwLCAweDYwLAorCSAweDJGLCAweDY1LCAweDI1LCAweEYyLCAweDAwLCAweDYzLCAweENDLCAweDg0LCAweDAzLCAweEEzLCAweEZELCAweDA1LCAweDRBLCAweDY0LCAweEQ3LCAweDgwLAorCSAweDFCLCAweDYwLCAweEM2LCAweDYxLCAweDJGLCAweDA1LCAweEExLCAweERELCAweEUzLCAweDgzLCAweEZFLCAweEEzLCAweDU4LCAweEQwLCAweDdFLCAweEE4LAorCSAweDU5LCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDJFLCAweEY1LAorCSAweDFCLCAweDYwLCAweEM2LCAweDY0LCAweDI1LCAweEYwLCAweEEwLCAweEQzLCAweEQzLCAweDgwLCAweDAxLCAweEIwLCAweDA0LCAweDAzLCAweDAxLCAweEE0LAorCSAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDAxLCAweDAwLCAweEEyLCAweERELCAweDFCLCAweDYwLCAweENFLCAweDYzLCAweDEwLCAweDYwLCAweDVBLCAweDY1LAorCSAweEJELCAweEQzLCAweEJELCAweEQxLCAweEUwLCAweDg0LCAweEM0LCAweDgyLCAweDEwLCAweDYwLCAweDdBLCAweDY1LCAweDA3LCAweDY0LCAweDY0LCAweDQxLAorCSAweDVBLCAweERCLCAweEQ2LCAweDgwLCAweENELCAweDgxLCAweDA2LCAweDAzLCAweEZCLCAweDAyLCAweDI1LCAweEYyLCAweDAyLCAweEEzLCAweENDLCAweDg0LAorCSAweEEyLCAweERBLCAweEVDLCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweDJBLCAweDYxLCAweEExLCAweEQzLAorCSAweDIzLCAweEZBLCAweEUwLCAweDgzLCAweDRBLCAweDY1LCAweDA0LCAweDAyLCAweDAyLCAweDYzLCAweDIzLCAweEZDLCAweEE1LCAweEZDLCAweDA5LCAweDAwLAorCSAweERCLCAweDgzLCAweDU5LCAweEQxLCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LAorCSAweEY4LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDFCLCAweDYwLCAweEM2LCAweDYyLCAweEEyLCAweEQzLCAweDAwLCAweDYxLAorCSAweDAyLCAweEE0LCAweEZFLCAweEEwLCAweDIzLCAweEZBLCAweDFCLCAweDAzLCAweEZBLCAweEE0LCAweEZELCAweEE0LCAweDAxLCAweEExLCAweEZELCAweDA3LAorCSAweDYxLCAweDQzLCAweDIzLCAweEYyLCAweDI1LCAweEZDLCAweEUwLCAweDgzLCAweDAyLCAweEEzLCAweDFCLCAweDYwLCAweEM2LCAweDYxLCAweDAwLCAweDYwLAorCSAweDRBLCAweDY0LCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweDdFLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLAorCSAweDI1LCAweEYyLCAweDIzLCAweEYyLCAweDAxLCAweEIwLCAweENDLCAweDg0LCAweDA0LCAweDAyLCAweDIzLCAweEZBLCAweDAyLCAweDAwLCAweDAwLCAweDY0LAorCSAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQxLCAweDRCLCAweDY1LCAweDQyLCAweDgwLCAweDY0LCAweEQ0LCAweDg1LAorCSAweDJCLCAweDQxLCAweDAwLCAweEExLCAweDU1LCAweDhCLCAweDBELCAweDAzLCAweDAyLCAweDA0LCAweDY1LCAweDQxLCAweDAyLCAweDAwLCAweDAwLCAweDY0LAorCSAweDQwLCAweDRCLCAweENBLCAweDg0LCAweDU4LCAweEQwLCAweEM5LCAweDgxLCAweEJELCAweEQ5LCAweEZDLCAweDAyLCAweDAwLCAweEY0LCAweDA0LCAweDY1LAorCSAweEVDLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQzLCAweDAyLCAweDdDLCAweEEwLCAweEQzLCAweDIzLCAweEY4LAorCSAweERDLCAweDg0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDAxLCAweDY0LAorCSAweDlELCAweEZFLCAweDAyLCAweDI4LCAweDAyLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLAorCSAweDFBLCAweDYyLCAweEEyLCAweEQzLCAweDAyLCAweDdDLCAweDIzLCAweEY4LCAweDAxLCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweEE0LCAweEQzLCAweDAwLCAweDYzLCAweDYwLCAweDQwLAorCSAweDBBLCAweDM3LCAweDAxLCAweDYzLCAweDE0LCAweDM3LCAweDAyLCAweDYzLCAweDM3LCAweDM3LCAweDA2LCAweDYzLCAweDZFLCAweDM3LCAweDBCLCAweDYzLAorCSAweDI1LCAweEZDLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDg4LCAweEZGLCAweDc1LCAweDQ0LAorCSAweDhELCAweEZGLCAweEU4LCAweDg3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDAzLCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA0LCAweDY0LCAweDIzLCAweEZBLCAweDg2LCAweEZGLCAweDI5LCAweDQ0LCAweDg3LCAweEZGLCAweDI1LCAweEZBLCAweDU1LCAweEYzLAorCSAweDUyLCAweEYxLCAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAwLCAweDdGLCAweDI2LCAweEZBLCAweDY0LCAweDQ0LCAweEM0LCAweDg3LCAweDAwLCAweDdGLAorCSAweDI3LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA1LCAweDY0LCAweDIzLCAweEZBLCAweDUyLCAweDYzLCAweEI3LCAweEYzLAorCSAweDRCLCAweERBLCAweEI2LCAweEYzLCAweDRCLCAweERBLCAweEI1LCAweEYzLCAweDRCLCAweERBLCAweDYwLCAweDQxLCAweDg4LCAweEZGLCAweDcyLCAweDVDLAorCSAweDg5LCAweEZGLCAweDRBLCAweEQ4LCAweEEyLCAweDQ4LCAweDIwLCAweDIzLCAweDBFLCAweDAwLCAweDY0LCAweDQwLCAweDgwLCAweDI3LCAweDE1LCAweDAwLAorCSAweERDLCAweDg0LCAweEJELCAweERBLCAweEJELCAweEQyLCAweDExLCAweDA0LCAweERDLCAweDg0LCAweEEyLCAweERBLCAweEEzLCAweEQyLCAweDBELCAweDA0LAorCSAweERDLCAweDg0LCAweEEzLCAweERBLCAweDBBLCAweDAwLCAweDUyLCAweDYzLCAweEI3LCAweEYzLCAweDRCLCAweERBLCAweEI2LCAweEYzLCAweDRCLCAweERBLAorCSAweEI1LCAweEYzLCAweDRCLCAweERBLCAweDU0LCAweDkwLCAweDRDLCAweDYzLCAweEUwLCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI1LCAweEYwLCAweDJELCAweDYwLCAweDE2LCAweDY1LCAweDIzLCAweEYyLCAweEE1LCAweEQ5LCAweDAyLCAweEE4LCAweDY0LCAweDQ0LCAweDA3LCAweDAyLAorCSAweDAwLCAweEJDLCAweEYyLCAweEE0LCAweDA0LCAweDAzLCAweDAzLCAweDA3LCAweDI4LCAweDYwLCAweDQ0LCAweDYyLCAweEEyLCAweEQ5LCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweDYzLCAweDI4LCAweDYwLCAweEE0LCAweDYxLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDI1LCAweEYwLCAweDIwLCAweDY0LCAweEQwLCAweDgxLCAweEZGLCAweEZGLCAweDAyLCAweDA3LCAweDI1LCAweEZBLCAweDBGLCAweDAwLAorCSAweDI4LCAweDYwLCAweEE4LCAweDYzLCAweEMzLCAweDgzLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweENGLCAweDgzLCAweEEzLCAweEQzLCAweENELCAweDgxLAorCSAweDAwLCAweDdGLCAweEJELCAweERCLCAweDA0LCAweDAzLCAweDAwLCAweDY0LCAweEM5LCAweDgxLCAweEJELCAweERCLCAweEZELCAweDAyLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLCAweEE2LCAweDYyLCAweDA5LCAweDAyLAorCSAweEEyLCAweEQ5LCAweDY0LCAweDQxLCAweDMyLCAweDQ0LCAweDAyLCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LCAweDA4LCAweDI4LCAweDAyLCAweEJDLAorCSAweDQwLCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLAorCSAweEIyLCAweDYyLCAweDBDLCAweDAyLCAweEEyLCAweEQ5LCAweDY0LCAweDQxLCAweDMyLCAweDQ0LCAweDQwLCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LAorCSAweDA4LCAweDI0LCAweDAzLCAweDAwLCAweDQwLCAweEJDLCAweDAyLCAweEI1LCAweEQ0LCAweDg0LCAweDQwLCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAxLCAweDYwLCAweEIwLCAweDYzLCAweEEzLCAweEQ5LCAweEE5LCAweEYxLCAweDIwLCAweDYxLAorCSAweDQxLCAweDRCLCAweDY0LCAweDQzLCAweEQ4LCAweEYzLCAweDYzLCAweDQ1LCAweDY2LCAweDQxLCAweDY1LCAweDQ2LCAweDhDLCAweEZBLCAweDYwLCAweDQwLAorCSAweDAxLCAweDM2LCAweDA2LCAweDAwLCAweDAyLCAweDM2LCAweDA0LCAweDAwLCAweDA0LCAweDM2LCAweDAyLCAweDAwLCAweDA1LCAweDNBLCAweDAyLCAweDAwLAorCSAweDAwLCAweDY0LCAweDAxLCAweDAwLCAweDAxLCAweDY0LCAweDZGLCAweEZBLCAweDc5LCAweEYzLCAweDdBLCAweEYxLCAweEZGLCAweEZGLCAweEEwLCAweDg0LAorCSAweDY1LCAweDQzLCAweDAyLCAweDAyLCAweDc5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDBGLCAweDYwLCAweEFFLCAweDY1LCAweEQ4LCAweEYzLAorCSAweEZGLCAweEZGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDYxLCAweDQ1LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAyLCAweEU4LCAweDg0LAorCSAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweEZDLCAweDAzLCAweEE0LCAweDg0LCAweDdCLCAweEZCLCAweDZGLCAweEYwLCAweDYwLCAweDQ3LCAweDkwLCAweDg0LAorCSAweDZGLCAweEZBLCAweDYwLCAweDQ3LCAweDYwLCAweDQ1LCAweDgwLCAweDY0LCAweEU4LCAweDg0LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweEZDLCAweDAzLAorCSAweEE0LCAweDg0LCAweDcwLCAweEYwLCAweDcwLCAweEZBLCAweDAwLCAweDYxLCAweEU4LCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDA1LCAweERELCAweDgxLAorCSAweEZCLCAweDAxLCAweEUxLCAweDgxLCAweDBGLCAweDYwLCAweEEyLCAweDY1LCAweDQ1LCAweEQzLCAweDBFLCAweEZBLCAweDY2LCAweDQzLCAweDBDLCAweEY0LAorCSAweDJCLCAweDQxLCAweDRELCAweDhCLCAweDAyLCAweEEzLCAweEI2LCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLAorCSAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDAyLCAweDAyLCAweDJELCAweEY5LCAweDJDLCAweEY5LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI4LCAweDYwLCAweDQyLCAweDYxLCAweDIzLCAweEYyLCAweDI1LCAweEYyLCAweDAyLCAweEE4LCAweDAwLCAweEE4LCAweDA5LCAweDAyLCAweDA3LCAweDAzLAorCSAweEQwLCAweEEwLCAweDMwLCAweDY1LCAweDAzLCAweDA0LCAweEE3LCAweEEwLCAweDU5LCAweDY1LCAweDAxLCAweDA2LCAweDY1LCAweDQ0LCAweEExLCAweERCLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDMxLCAweDYwLCAweDJDLCAweDYxLCAweDAxLCAweDY0LCAweEExLCAweERCLCAweDA0LCAweDAwLAorCSAweDMxLCAweDYwLCAweDJDLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBFLCAweDAyLCAweDA2LCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDI1LCAweDYwLCAweDExLCAweDc4LAorCSAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LAorCSAweDAyLCAweDYxLCAweDEyLCAweDAyLCAweDJELCAweDYwLCAweDU4LCAweDYxLCAweDY1LCAweDQzLCAweEExLCAweERELCAweDBDLCAweDYxLCAweDQxLCAweDU2LAorCSAweEM3LCAweEZFLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLAorCSAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYwLCAweDI5LCAweDYwLAorCSAweEEyLCAweDYyLCAweEEyLCAweEQ5LCAweDE5LCAweDAwLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LCAweDBDLCAweDYwLAorCSAweDM4LCAweDYyLCAweDQwLCAweDYzLCAweDAwLCAweDY0LCAweDVBLCAweERCLCAweEZFLCAweDFGLCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDBDLCAweDAwLAorCSAweDA0LCAweDY1LCAweDBDLCAweDYwLCAweDM4LCAweDYxLCAweDQ4LCAweDY0LCAweDNFLCAweDYzLCAweDdDLCAweEE4LCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDI5LCAweDYwLCAweEEyLCAweDYyLCAweEEyLCAweEQxLCAweDBELCAweDYwLAorCSAweDFDLCAweDY1LCAweDAyLCAweEZFLCAweDY0LCAweDQ0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg3LCAweDYwLCAweDQxLCAweDY0LCAweDQ0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDNFLCAweEZCLCAweDYwLCAweDQyLCAweDYxLCAweDQ0LCAweDAzLCAweEEyLCAweDYwLCAweEZFLAorCSAweEEyLCAweERCLCAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDY0LCAweDQ0LCAweDBDLCAweDYwLCAweDNBLCAweDY1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDQwLCAweEZCLCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LCAweDAwLCAweDY0LCAweDQwLCAweDQxLCAweDY0LCAweDQwLAorCSAweDAxLCAweDJBLCAweEE0LCAweDAwLCAweDRBLCAweDY0LCAweEEwLCAweEQyLCAweEZGLCAweEZGLCAweDQwLCAweDQyLCAweDgwLCAweDJCLCAweDA0LCAweDAwLAorCSAweEZGLCAweEI0LCAweDQwLCAweDQyLCAweDAxLCAweDY0LCAweDQwLCAweDQxLCAweEE5LCAweEYzLCAweDQ2LCAweDRCLCAweDYwLCAweDQ2LCAweDIwLCAweDYzLAorCSAweEUzLCAweDgzLCAweEFCLCAweDQ2LCAweDI2LCAweEYwLCAweEFCLCAweDQ2LCAweDU1LCAweEY4LCAweEFCLCAweDQ2LCAweDI3LCAweEYwLCAweEFCLCAweDQ2LAorCSAweDU2LCAweEY4LCAweEFCLCAweDQ2LCAweDI4LCAweEYwLCAweEFCLCAweDQ2LCAweDU3LCAweEY4LCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEYxLCAweDFGLAorCSAweEE5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEFCLCAweDQ2LCAweDBDLCAweDYwLCAweDdBLCAweDY1LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDUyLCAweDY0LCAweDBFLCAweDYzLAorCSAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEYwLCAweEExLAorCSAweDZFLCAweDY0LCAweDBFLCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDBDLCAweDYwLCAweERDLCAweDY1LCAweEM0LCAweDgxLCAweDYwLCAweDQ1LCAweEM5LCAweDgxLAorCSAweDYyLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLAorCSAweEFCLCAweDQ2LCAweEY4LCAweEExLCAweEFFLCAweDY0LCAweDA2LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LAorCSAweDY1LCAweDQ0LCAweDBDLCAweDYwLCAweEZDLCAweDY1LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDZBLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLAorCSAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg0LCAweDBDLCAweDYwLAorCSAweEMyLCAweDY1LCAweEM0LCAweDgxLCAweDcyLCAweDY0LCAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEFCLCAweDQ2LAorCSAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweEZBLCAweEExLCAweDg4LCAweDY0LCAweDA0LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LAorCSAweEZELCAweDFGLCAweDM3LCAweEYwLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDEzLCAweDAwLCAweDIyLCAweDQ0LCAweDNELCAweEZCLCAweDYwLCAweDQxLAorCSAweDAyLCAweEZFLCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweDNDLCAweEZCLCAweDBDLCAweDYwLCAweEJFLCAweDYzLCAweDg4LCAweEZGLAorCSAweENELCAweDgxLCAweDA2LCAweEEzLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDNCLCAweEZELCAweDY0LCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDVDLAorCSAweDIyLCAweDQzLCAweDgwLCAweDYxLCAweDg4LCAweEZGLCAweENGLCAweDgzLCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LAorCSAweDMxLCAweDkxLCAweEIxLCAweDg0LCAweDM3LCAweEZBLCAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweDM3LCAweEYwLAorCSAweDY2LCAweDQ0LCAweEIxLCAweDlDLCAweDM3LCAweEY4LCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDIyLCAweDAyLCAweDNELCAweEYxLAorCSAweDY0LCAweDQ0LCAweDAzLCAweEI0LCAweDQwLCAweDQyLCAweEQwLCAweDgwLCAweEE5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEI3LCAweEY0LAorCSAweDgwLCAweDYxLCAweDAyLCAweDAyLCAweEUzLCAweDgzLCAweEVCLCAweDgzLCAweDIyLCAweDQ0LCAweDg4LCAweEZGLCAweENDLCAweDg0LCAweEUxLCAweDgxLAorCSAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweDlELCAweDg1LCAweEE3LCAweDgzLCAweDM3LCAweEZDLCAweDFGLCAweDYzLAorCSAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEI3LCAweEYyLCAweDY2LCAweDQ0LCAweEE1LCAweDgxLCAweEI3LCAweEZBLCAweDAyLCAweEE2LAorCSAweEZBLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LAorCSAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDRFLCAweDAwLCAweDI3LCAweEYyLCAweDFDLCAweDYwLCAweEJBLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LAorCSAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE5LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLAorCSAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDJBLCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDM3LCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDdDLAorCSAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDRFLCAweDYxLCAweDZFLCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LAorCSAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDg4LCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LAorCSAweEZCLCAweDFGLCAweEQ5LCAweDgxLCAweDk4LCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LAorCSAweEZCLCAweDFGLCAweEQ5LCAweDgxLCAweEFFLCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LAorCSAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDJELCAweDYwLCAweDFBLCAweDY0LCAweEEwLCAweEQxLCAweEEwLCAweEY5LCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDMxLCAweDAwLAorCSAweDI3LCAweEYyLCAweDFDLCAweDYwLCAweEJBLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLAorCSAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLAorCSAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLAorCSAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE5LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDBELCAweDAwLAorCSAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDM3LCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDYxLCAweDlELCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERBLAorCSAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDQ2LCAweDQ1LCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweDAwLCAweEY0LAorCSAweDAxLCAweEYyLCAweDY2LCAweDVDLCAweDI1LCAweDQ2LCAweDU2LCAweDAyLCAweDcwLCAweDI3LCAweDU0LCAweDAwLCAweDEyLCAweDY0LCAweDAzLCAweEZBLAorCSAweDA0LCAweEY4LCAweDBFLCAweEYyLCAweDg3LCAweEZDLCAweDhELCAweEZDLCAweDhFLCAweEZDLCAweERBLCAweDgyLCAweDE2LCAweDYxLCAweDAwLCAweDYzLAorCSAweEM5LCAweDgxLCAweDVBLCAweERDLCAweEZELCAweDAyLCAweDYwLCAweDQwLCAweEYwLCAweDNCLCAweDE2LCAweDAwLCAweDMyLCAweDQ0LCAweEFGLCAweEYzLAorCSAweDAxLCAweEIwLCAweEZBLCAweEEwLCAweDA4LCAweDI0LCAweDJDLCAweDA1LCAweERDLCAweDgzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI0LCAweDYwLAorCSAweDVFLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEFGLCAweEZELCAweDJCLCAweEZGLAorCSAweEZFLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDRGLCAweDAwLCAweEIwLCAweEYzLCAweDA2LCAweDY1LCAweEQ0LCAweDgwLCAweERDLCAweDgzLAorCSAweDE3LCAweDA1LCAweEIwLCAweEZELCAweDk4LCAweEZFLCAweDA0LCAweDA0LCAweDAwLCAweDdGLCAweDA4LCAweDdFLCAweDBFLCAweEZBLCAweDNCLCAweEZGLAorCSAweDI0LCAweDYwLCAweDUyLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweDBFLCAweEYyLAorCSAweDJCLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweEY3LCAweEZFLCAweEZELCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDMyLCAweDAwLAorCSAweEFDLCAweEYzLCAweEZGLCAweEZGLCAweEQ4LCAweEEwLCAweEZGLCAweEZGLCAweDBELCAweDA0LCAweDI0LCAweDYwLCAweDZBLCAweDY0LCAweDJCLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZDLCAweDY0LCAweDNCLCAweDQyLAorCSAweDRBLCAweERCLCAweDIxLCAweDAwLCAweDQ2LCAweDQ1LCAweDAwLCAweDY0LCAweDJCLCAweERCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEEyLCAweEZGLCAweDAwLCAweEY0LCAweDAxLCAweEYwLCAweDBBLCAweDE4LCAweDcwLCAweDY3LAorCSAweEEwLCAweDgwLCAweEYwLCAweDY3LCAweDA2LCAweDAzLCAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDI1LCAweDQ2LCAweDI1LCAweDQ0LCAweDgwLCAweEZDLAorCSAweDA1LCAweEZBLCAweEFGLCAweDYwLCAweDU4LCAweDRFLCAweDk1LCAweDc4LCAweEZGLCAweEZGLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweEZGLCAweDY0LAorCSAweDNCLCAweDQyLCAweDRBLCAweERCLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDU4LCAweDY0LAorCSAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDBELCAweDAwLCAweDI0LCAweDYwLCAweDRDLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDE4LCAweDAwLAorCSAweDI0LCAweDYwLCAweDY0LCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDAzLCAweDAwLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDBCLCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweDI0LCAweDYwLCAweDdBLCAweDY0LAorCSAweDQwLCAweDRCLCAweDJDLCAweDYwLCAweDU4LCAweDRELCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweEYyLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDE0LCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDExLCAweDAwLCAweDAyLCAweEYwLCAweDA5LCAweDYwLAorCSAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEEyLCAweEZGLCAweEIwLCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LCAweEIwLCAweEZCLCAweDI0LCAweDYwLAorCSAweDdBLCAweDY0LCAweDQwLCAweDRCLCAweDJDLCAweDYwLCAweDU4LCAweDRELCAweEQ4LCAweDc4LCAweEZGLCAweEZGLCAweEU5LCAweDAxLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZCLCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLCAweEEyLCAweEZGLCAweEIzLCAweEYzLCAweEFGLCAweEYzLCAweENDLCAweDgwLAorCSAweEZELCAweEEwLCAweDAxLCAweDE0LCAweDFFLCAweDA1LCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweDlCLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLAorCSAweDE4LCAweDAzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDVFLCAweDY0LCAweEEyLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY2LCAweDY0LCAweDNBLCAweDQyLAorCSAweDRBLCAweERCLCAweEIzLCAweEYzLCAweEFGLCAweEYzLCAweENDLCAweDgzLCAweERDLCAweDg0LCAweDAxLCAweDE1LCAweEIzLCAweEZELCAweEFGLCAweEZCLAorCSAweEQ0LCAweEZFLCAweEIyLCAweEYzLCAweEIwLCAweEYzLCAweDAwLCAweEE4LCAweEIxLCAweEYxLCAweDAzLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDI3LCAweDA1LCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweDlCLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDIxLCAweDAzLCAweDAwLCAweDYzLAorCSAweEIyLCAweEYzLCAweDBFLCAweEZDLCAweENDLCAweDg0LCAweEZGLCAweDNBLCAweEIyLCAweEZCLCAweDk4LCAweEZFLCAweDAzLCAweDA0LCAweDA4LCAweEJCLAorCSAweDBFLCAweEZDLCAweDNCLCAweEZGLCAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDUyLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY3LCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLAorCSAweEIwLCAweEYzLCAweDBFLCAweEYyLCAweERDLCAweDgzLCAweDA4LCAweEIwLCAweEIwLCAweEZELCAweDA4LCAweDI4LCAweEY3LCAweEZFLCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweEI5LCAweEZFLCAweDEzLCAweEZGLCAweDI0LCAweDQwLCAweDgwLCAweDJCLAorCSAweDBCLCAweDAwLCAweEEyLCAweEZGLCAweDI1LCAweDQ2LCAweDA5LCAweEY0LCAweDBFLCAweEYyLCAweDA1LCAweDE4LCAweDA4LCAweEJDLCAweDBFLCAweEZBLAorCSAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweDAxLCAweDAwLCAweEQ4LCAweEZFLCAweEEzLCAweEZGLCAweDI1LCAweDQ2LCAweDNFLCAweEYyLCAweDAwLCAweEY0LAorCSAweDA4LCAweEYwLCAweDI1LCAweDQ2LCAweDA2LCAweEI0LCAweEZGLCAweDdGLCAweDEwLCAweEJDLCAweDA2LCAweDI2LCAweEZELCAweDdGLCAweDBFLCAweEZBLAorCSAweDNFLCAweEYyLCAweDNGLCAweEYyLCAweDYwLCAweDQxLCAweDA4LCAweDJBLCAweDY0LCAweDQ3LCAweDNGLCAweEZBLCAweDYwLCAweDQ1LCAweDI3LCAweDYwLAorCSAweEZDLCAweDYyLCAweEEyLCAweEQzLCAweEEzLCAweEZDLCAweEFCLCAweEZDLCAweDkxLCAweEZDLCAweEQ0LCAweDgwLCAweEMwLCAweDYwLCAweEUxLCAweDY1LAorCSAweEE1LCAweDgwLCAweDAxLCAweDA0LCAweDA3LCAweDAzLCAweDIzLCAweEYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDJFLCAweDYwLAorCSAweEM1LCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDYwLCAweDU4LCAweDRGLCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDE0LCAweDA0LCAweDIzLCAweEYwLAorCSAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweEI4LCAweEYxLCAweDI3LCAweDYwLCAweDk2LCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweERDLCAweDgwLCAweEQwLCAweDgwLCAweDA0LCAweDAzLCAweEEyLCAweERCLCAweDA4LCAweDI0LCAweEM2LCAweEZFLCAweDAyLCAweDAwLAorCSAweDIwLCAweDYwLCAweDAwLCAweDc1LCAweDgzLCAweDAwLCAweERDLCAweEYzLCAweEE5LCAweEYxLCAweDA3LCAweEI0LCAweDY0LCAweDQzLCAweEZELCAweEEwLAorCSAweDJDLCAweEYyLCAweDcxLCAweDAyLCAweDAxLCAweEIwLCAweDY0LCAweDQzLCAweDc4LCAweDAyLCAweDJFLCAweEYyLCAweDFDLCAweDYwLCAweEJBLCAweDY1LAorCSAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLAorCSAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LAorCSAweDJELCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDJDLCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE5LCAweEYzLAorCSAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDUxLCAweDAzLCAweDYzLCAweDQ2LCAweDgwLCAweEY2LCAweDI1LCAweDQ2LCAweDQzLCAweDE4LAorCSAweDJFLCAweEYyLCAweDY2LCAweDQxLCAweDFDLCAweDYwLCAweEJBLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEE5LCAweEYxLCAweEUwLCAweDg0LAorCSAweDQ0LCAweEQzLCAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLCAweEZDLCAweDFCLCAweDY2LCAweDQ0LAorCSAweDY0LCAweDQ2LCAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLCAweDgwLCAweEYwLCAweDAxLCAweEZBLAorCSAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLCAweDAwLCAweEYyLCAweEEzLCAweERCLAorCSAweDYwLCAweDQ2LCAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDYwLCAweDQzLCAweDYxLCAweDQ2LAorCSAweDQzLCAweDRCLCAweDJDLCAweEYwLCAweEFELCAweEYwLCAweDJFLCAweEYyLCAweEFCLCAweDQ2LCAweDAzLCAweEY4LCAweDg0LCAweEY4LCAweDA1LCAweEZBLAorCSAweDAzLCAweDY0LCAweDA2LCAweEZBLCAweEFCLCAweDQ2LCAweDFFLCAweDYwLCAweEJDLCAweDYxLCAweEExLCAweEQzLCAweDFFLCAweDYwLCAweEZFLCAweDdDLAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweEEwLCAweERELCAweERBLCAweDlDLCAweEExLCAweEQ5LCAweDQ5LCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweEExLCAweERCLCAweDBBLCAweDAwLCAweERDLCAweEYzLCAweDAyLCAweEEzLCAweEZFLCAweEEwLCAweEY5LCAweEEwLCAweDAxLCAweDA2LAorCSAweDA0LCAweDAyLCAweDIzLCAweEYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDA3LCAweEZDLCAweDIzLCAweEYyLCAweEZGLCAweEZGLAorCSAweDI3LCAweDFCLCAweDI3LCAweDYwLCAweEZFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAwLCAweDNBLCAweDEwLCAweDAwLAorCSAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDIyLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEMxLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDFGLCAweDAwLAorCSAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDM0LCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEM4LCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDBGLCAweDAwLAorCSAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLCAweDQ2LCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweENFLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDI1LCAweDYwLAorCSAweDExLCAweDc4LCAweEZGLCAweEZGLCAweENCLCAweDg0LCAweEM5LCAweDgzLCAweEZGLCAweEZGLCAweDA4LCAweDA0LCAweDU4LCAweEQxLCAweEE1LCAweEQ4LAorCSAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDNFLCAweEYyLCAweENDLCAweEYxLCAweDA4LCAweEIwLCAweDE5LCAweEY4LCAweDNCLCAweDAyLCAweEVCLCAweEYxLCAweDJGLCAweEY4LCAweEVDLCAweEYzLAorCSAweDMwLCAweEZBLCAweDYwLCAweDQ1LCAweEVELCAweEYzLCAweDMxLCAweEZBLCAweDQ2LCAweDRBLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweDA1LCAweEYyLAorCSAweDA2LCAweEYyLCAweEQwLCAweDgwLCAweDA3LCAweEYwLCAweDA1LCAweDAyLCAweEQ0LCAweDgwLCAweEQzLCAweDgwLCAweDAyLCAweDAyLCAweERDLCAweEYzLAorCSAweDAzLCAweDAzLCAweEFBLCAweDQ2LCAweDQyLCAweEZFLCAweDI1LCAweDAwLCAweDYwLCAweDQwLCAweDAzLCAweDJBLCAweDEwLCAweDAwLCAweDAyLCAweEYyLAorCSAweDAzLCAweEYwLCAweDA0LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDJDLCAweEZDLCAweDJELCAweEY4LCAweDJFLCAweEZBLCAweDgxLCAweEYxLAorCSAweDMyLCAweEY4LCAweDgyLCAweEYxLCAweDMzLCAweEY4LCAweDgzLCAweEYxLCAweDM0LCAweEY4LCAweDA4LCAweDY0LCAweDEwLCAweDAwLCAweDAyLCAweEYyLAorCSAweDAzLCAweEYwLCAweDA0LCAweEYyLCAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDMyLCAweEZDLCAweDMzLCAweEY4LCAweDM0LCAweEZBLCAweDgxLCAweEYxLAorCSAweDJDLCAweEY4LCAweDgyLCAweEYxLCAweDJELCAweEY4LCAweDgzLCAweEYxLCAweDJFLCAweEY4LCAweDAxLCAweDYwLCAweDA4LCAweDY0LCAweDJBLCAweEZBLAorCSAweDAyLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAzLCAweDAyLCAweDQyLCAweEZGLAorCSAweDQ3LCAweEZGLCAweEExLCAweEZGLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk4LCAweEZGLCAweDg4LCAweEZGLCAweDg0LCAweEUxLCAweEZGLCAweEZGLAorCSAweDAwLCAweDAwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLCAweDJELCAweDYwLCAweDlDLCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLAorCSAweDAxLCAweDFCLCAweEY3LCAweDAxLCAweDg3LCAweEZGLCAweDIwLCAweDQ0LCAweDgwLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDI2LCAweEYxLCAweDAxLAorCSAweEMwLCAweDYwLCAweDQwLCAweEVDLCAweEMwLCAweDYwLCAweDAwLCAweEVELCAweEMwLCAweDYwLCAweDgwLCAweEVFLCAweEFDLCAweDRGLCAweEJGLCAweEI0LAorCSAweEEwLCAweDVDLCAweDJELCAweDYwLCAweDFBLCAweDYyLCAweEEyLCAweEQxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAyLCAweDI3LCAweDA2LCAweDAwLAorCSAweDI4LCAweEUyLCAweDI0LCAweEUyLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweDc1LCAweDQwLCAweDEwLCAweDAwLCAweDI4LCAweEUyLCAweDI0LCAweEUyLAorCSAweDAwLCAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYwLCAweDk0LCAweEUwLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEExLCAweDUwLCAweDc1LCAweDQwLAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweEUwLCAweDJELCAweDYwLCAweDlDLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAxLCAweDYwLCAweDM5LCAweEUyLCAweDA0LCAweDYwLCAweDAwLCAweDdBLCAweEFDLCAweDRGLCAweDQwLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweEQ5LCAweEVDLCAweEMwLCAweDYwLCAweDBGLCAweEVELCAweEMwLCAweDYwLCAweDhGLCAweEVFLAorCSAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDI2LCAweDYxLCAweENELCAweDgxLCAweEZGLCAweEZGLCAweEZELCAweDAyLAorCSAweEFFLCAweDRGLCAweEZCLCAweEI0LCAweEEwLCAweDVFLCAweEFELCAweDAxLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk4LCAweEZGLCAweDJGLCAweDYwLAorCSAweDU0LCAweDYzLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LAorCSAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LAorCSAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LAorCSAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LAorCSAweEJELCAweERCLCAweDJGLCAweDYwLCAweDQ4LCAweDY0LCAweEEwLCAweERELCAweDMwLCAweDYwLCAweDc0LCAweDYzLCAweDJGLCAweDYwLCAweDRBLCAweDY0LAorCSAweEEwLCAweERELCAweDJGLCAweDYwLCAweDRDLCAweDYzLCAweDMwLCAweDQ0LCAweEEzLCAweERCLCAweDJGLCAweDYwLCAweDRFLCAweDYzLCAweDMxLCAweDQ0LAorCSAweEEzLCAweERCLCAweDJGLCAweDYwLCAweDUwLCAweDYzLCAweDMyLCAweDQ0LCAweEEzLCAweERCLCAweDJGLCAweDYwLCAweDUyLCAweDYzLCAweDMzLCAweDQ0LAorCSAweEEzLCAweERCLCAweDgxLCAweEZGLCAweDkxLCAweEZGLCAweDU4LCAweDUxLCAweDRCLCAweDAwLCAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDU4LCAweDUxLAorCSAweDQ3LCAweDAwLCAweDgzLCAweEZGLCAweDkzLCAweEZGLCAweDU4LCAweDUxLCAweDQzLCAweDAwLCAweDg0LCAweEZGLCAweDk0LCAweEZGLCAweDU4LCAweDUxLAorCSAweDNGLCAweDAwLCAweDg1LCAweEZGLCAweDk1LCAweEZGLCAweDU4LCAweDUxLCAweDNCLCAweDAwLCAweDg2LCAweEZGLCAweDk2LCAweEZGLCAweDU4LCAweDUxLAorCSAweDM3LCAweDAwLCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDU4LCAweDUxLCAweDMzLCAweDAwLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk5LCAweEZGLAorCSAweDJGLCAweDYwLCAweDQ4LCAweDY0LCAweEEwLCAweEQxLCAweDMwLCAweDQ0LCAweDY0LCAweDQzLCAweEJELCAweERCLCAweDMxLCAweDQ0LCAweEJELCAweERCLAorCSAweDMyLCAweDQ0LCAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLCAweDM1LCAweDQ0LCAweEJELCAweERCLAorCSAweDM2LCAweDQ0LCAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLCAweDM5LCAweDQ0LCAweEJELCAweERCLAorCSAweDNBLCAweDQ0LCAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLCAweDNELCAweDQ0LCAweEJELCAweERCLAorCSAweDNFLCAweDQ0LCAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweEVGLCAweDYwLCAweDQ4LCAweDY0LCAweDBBLCAweEZCLCAweDQwLCAweDIxLAorCSAweEZFLCAweDAxLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk4LCAweEZGLCAweDg4LCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLAorCSAweDQyLCAweDUwLCAweDQwLCAweDUzLCAweDJGLCAweDYwLCAweDRBLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDMzLCAweDQ0LAorCSAweDMyLCAweDQyLCAweEEyLCAweERCLCAweERBLCAweDgyLCAweEEyLCAweERELCAweERBLCAweDgzLCAweDY1LCAweDQ0LCAweEJELCAweERCLCAweDYxLCAweDQ0LAorCSAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweEJELCAweEQ5LCAweDMwLCAweDQ0LCAweEJELCAweERCLCAweDk5LCAweEZGLCAweEE0LCAweDRDLAorCSAweEJELCAweERCLCAweEE1LCAweDRDLCAweEJELCAweERCLCAweEEwLCAweDRDLCAweEJELCAweERCLCAweEExLCAweDRDLCAweEJELCAweERCLCAweDk4LCAweEZGLAorCSAweDJGLCAweDYwLCAweDRBLCAweDY0LCAweEEwLCAweERELCAweDJGLCAweDYwLCAweDRDLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUwLAorCSAweDJGLCAweDYwLCAweDUwLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDJGLCAweDYwLCAweDUyLCAweDYyLCAweEEyLCAweEQzLAorCSAweEZGLCAweEZGLCAweDQwLCAweDUzLCAweDMxLCAweDQxLCAweDJGLCAweDYwLCAweDRFLCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDQwLCAweDUxLAorCSAweDJGLCAweDYwLCAweDQ4LCAweDYyLCAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LAorCSAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LAorCSAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LAorCSAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LAorCSAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDYwLCAweDQ4LCAweDY0LCAweEEwLCAweERELAorCSAweDYxLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweEUyLCAweDJELCAweEYzLCAweDJDLCAweEYzLCAweDAwLCAweEJELCAweENDLCAweDg0LCAweDA4LCAweDAzLAorCSAweDJDLCAweEZCLCAweDA2LCAweDAyLCAweDY1LCAweDQ0LCAweDJDLCAweEZCLCAweDhBLCAweEZGLCAweDgwLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLAorCSAweEYyLCAweEYzLCAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDQ0LCAweDAwLCAweDYwLCAweDQzLCAweDA0LCAweEIwLCAweDAyLCAweEIwLCAweDA4LCAweDI0LAorCSAweDE2LCAweDAyLCAweDI5LCAweDQ0LCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweENDLCAweDgxLCAweDBFLCAweDAzLCAweDQxLCAweDQ5LCAweDM3LCAweDAyLAorCSAweDYzLCAweDQwLCAweDA4LCAweDJBLCAweDA5LCAweDAwLCAweEY3LCAweEIzLCAweDMxLCAweDYwLCAweDFFLCAweDdDLCAweEE0LCAweEQxLCAweEFELCAweDRGLAorCSAweEZELCAweEI0LCAweEEwLCAweDVELCAweDQ0LCAweDQ5LCAweDJCLCAweDAwLCAweDYzLCAweDQwLCAweDAyLCAweDJBLCAweDE0LCAweDAwLCAweDMxLCAweDYwLAorCSAweDIwLCAweDY0LCAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFDLCAweDdDLCAweEE0LCAweERCLCAweDQwLCAweDQ5LCAweDMxLCAweDYwLCAweDIyLCAweDY0LAorCSAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFFLCAweDdDLCAweEE0LCAweERCLCAweDBDLCAweEJCLCAweEZELCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDE0LCAweDAwLCAweDMxLCAweDYwLCAweDI0LCAweDY0LCAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFDLCAweDdDLAorCSAweDBFLCAweDE4LCAweEE0LCAweERCLCAweDQwLCAweDQ5LCAweDMxLCAweDYwLCAweDI2LCAweDY0LCAweEEwLCAweEQzLCAweDMxLCAweDYwLCAweDFFLCAweDdDLAorCSAweEE0LCAweERCLCAweDA4LCAweEJCLCAweEZCLCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweEYyLCAweEZELAorCSAweDAxLCAweDYwLCAweDRFLCAweDYxLCAweEExLCAweEQzLCAweDYxLCAweDQzLCAweDE3LCAweDE4LCAweDU4LCAweEQzLCAweDYyLCAweDQxLCAweDAzLCAweDE4LAorCSAweENDLCAweDg0LCAweEExLCAweERCLCAweDExLCAweDAwLCAweDQ5LCAweEQzLCAweEEzLCAweERCLCAweDA2LCAweEExLCAweEExLCAweEQzLCAweDU5LCAweEQxLAorCSAweDYwLCAweDQ1LCAweEE1LCAweEQzLCAweDU5LCAweEQxLCAweEIwLCAweDg0LCAweEE1LCAweERCLCAweDY0LCAweDQ0LCAweDA2LCAweDM2LCAweENELCAweEZFLAorCSAweDA3LCAweDM2LCAweEQ2LCAweEZFLCAweEU1LCAweDAxLCAweDIzLCAweDQ2LCAweEIwLCAweDYwLCAweEE0LCAweDc4LCAweEZGLCAweEZGLCAweDQ2LCAweDQzLAorCSAweDI0LCAweDYwLCAweEE0LCAweDYxLCAweEExLCAweEQzLCAweDU5LCAweEQxLCAweDA2LCAweDFCLCAweDU5LCAweEQzLCAweDU5LCAweEQxLCAweDAzLCAweDFCLAorCSAweDU5LCAweEQzLCAweDU5LCAweEQxLCAweEYwLCAweDE4LCAweDAwLCAweDYzLCAweDQ5LCAweERELCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDExLCAweDAwLAorCSAweDAzLCAweDM2LCAweDMyLCAweDAwLCAweDAxLCAweDM2LCAweDA4LCAweDAwLCAweDA1LCAweDNBLCAweEVBLCAweDAxLCAweEE0LCAweEQzLCAweDVBLCAweEQzLAorCSAweDlDLCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERCLCAweEU0LCAweDAxLCAweDAxLCAweDYwLCAweDRFLCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLAorCSAweERGLCAweDAxLCAweDMxLCAweDYwLCAweDNDLCAweDY0LCAweDQwLCAweDQ1LCAweDIyLCAweDAwLCAweDAxLCAweDYwLCAweDRFLCAweDY2LCAweEE2LCAweEQzLAorCSAweDA0LCAweEExLCAweDYwLCAweDQzLCAweEExLCAweEQzLCAweEM5LCAweDgxLCAweDYwLCAweDQ1LCAweDAwLCAweEJCLCAweEExLCAweERCLCAweEJFLCAweEQzLAorCSAweDA5LCAweDAzLCAweEQ0LCAweDg0LCAweDlDLCAweDg0LCAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDBFLCAweEEzLCAweEQxLCAweDYzLCAweDQ2LAorCSAweDY0LCAweDQzLCAweEYyLCAweDAxLCAweDlDLCAweDg0LCAweERDLCAweDg1LCAweDQ5LCAweERELCAweDYxLCAweDQ0LCAweDAwLCAweEJCLCAweEE2LCAweERCLAorCSAweDAyLCAweDAzLCAweDY1LCAweDQ0LCAweEJFLCAweERCLCAweEJDLCAweDAxLCAweDMxLCAweDYwLCAweDE3LCAweDY0LCAweDQwLCAweDQ1LCAweDAxLCAweDYwLAorCSAweDRFLCAweDY2LCAweEE2LCAweEQzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDBGLCAweDE4LCAweDAyLCAweDAzLCAweDYwLCAweDQ2LCAweEY5LCAweDAxLAorCSAweDU4LCAweEQzLCAweEE0LCAweEQzLCAweDYwLCAweDQ1LCAweDAwLCAweDYzLCAweEE0LCAweERELCAweDA1LCAweDE4LCAweDU4LCAweEQzLCAweEZGLCAweEZGLAorCSAweEM0LCAweDgzLCAweEEyLCAweERELCAweENBLCAweDg0LCAweEE2LCAweERCLCAweDI1LCAweDU4LCAweDY0LCAweDQxLCAweDAwLCAweDYwLCAweDQ2LCAweDc0LAorCSAweENELCAweEUyLCAweDA0LCAweEUxLCAweDAyLCAweDYwLCAweDAwLCAweEUxLCAweDNGLCAweDQ0LCAweDQwLCAweDI2LCAweDBCLCAweDAwLCAweDAxLCAweDJBLAorCSAweDA1LCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweEUwLCAweDYwLCAweDYwLCAweDFDLCAweEUwLCAweDA0LCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweEUwLAorCSAweDgwLCAweDYwLCAweDFDLCAweEUwLCAweDA0LCAweDI5LCAweEZFLCAweDAxLCAweEM0LCAweEUyLCAweDQzLCAweDY0LCAweDNBLCAweERCLCAweEE0LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDNGLCAweDQ0LCAweDAyLCAweDI3LCAweDg0LCAweDAwLCAweDIwLCAweDJCLCAweEZGLCAweDAxLCAweDgwLCAweEUxLAorCSAweDk1LCAweDYwLCAweDgwLCAweEU3LCAweDYxLCAweDQwLCAweDQwLCAweDJCLCAweDBELCAweDAwLCAweDA1LCAweDYzLCAweDMyLCAweDYwLCAweDU4LCAweDRGLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweDYzLCAweEZGLCAweEZGLCAweEZFLCAweDFGLCAweDAxLCAweDYzLCAweDMyLCAweDYwLCAweDU4LCAweDRGLAorCSAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEZGLCAweEIxLCAweENELCAweDgxLCAweEUxLCAweDg1LCAweDI3LCAweDYwLCAweDNDLCAweDY0LCAweDQ0LCAweEQxLAorCSAweEZGLCAweEZGLCAweDY0LCAweDQzLCAweDMyLCAweDYwLCAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDAwLCAweDYzLAorCSAweDMyLCAweDYwLCAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDYwLCAweDU4LCAweDYxLCAweDI5LCAweDYwLCAweEU4LCAweDYyLAorCSAweEEyLCAweEQzLCAweDQ1LCAweEQxLCAweDQ3LCAweEJDLCAweEUwLCAweDg0LCAweDYyLCAweDQ1LCAweDY0LCAweDVGLCAweEU4LCAweDgzLCAweDMyLCAweDYwLAorCSAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEYzLCAweENELCAweEUyLCAweDYwLCAweDU0LCAweDA0LCAweEUxLCAweDA0LCAweDI5LAorCSAweEZFLCAweDAxLCAweEM0LCAweEUyLCAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDM4LCAweDY5LCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDE2LAorCSAweEZELCAweDAxLCAweDAxLCAweDJBLCAweDM2LCAweDAwLCAweDAzLCAweDYwLCAweDgwLCAweDdDLCAweEEzLCAweDgzLCAweDI5LCAweDYwLCAweEU4LCAweDYyLAorCSAweEEyLCAweEQxLCAweDQzLCAweEJCLCAweEIzLCAweDgzLCAweDk1LCAweDYwLCAweDgwLCAweEU3LCAweDMyLCAweDYwLCAweDU4LCAweDRGLCAweDZBLCAweDc4LAorCSAweEZGLCAweEZGLCAweEUzLCAweDgzLCAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDM4LCAweDY5LCAweEZGLCAweEZGLCAweDY4LCAweDQxLCAweDAxLCAweDE2LAorCSAweEZELCAweDAxLCAweDYzLCAweDQ3LCAweDYxLCAweDQwLCAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDAwLCAweDNBLCAweENDLCAweDg0LCAweDAyLCAweDAwLAorCSAweDA3LCAweDNBLCAweERDLCAweDg0LCAweEZGLCAweEI0LCAweEE1LCAweERCLCAweDYwLCAweDQ3LCAweEU4LCAweDg0LCAweDQ3LCAweDY1LCAweDI5LCAweDYwLAorCSAweEU4LCAweDYyLCAweEEyLCAweEQzLCAweEI0LCAweDg1LCAweEI0LCAweDgzLCAweDgwLCAweEUxLCAweDk1LCAweDYwLCAweDgwLCAweEU3LCAweDMyLCAweDYwLAorCSAweDU4LCAweDRGLCAweDZBLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEYzLCAweENELCAweEUyLCAweDYwLCAweDU0LCAweDA0LCAweDI5LCAweEZFLCAweDAxLAorCSAweEM0LCAweEUyLCAweEE0LCAweEYzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweDMyLCAweDYwLCAweDQzLCAweDc4LAorCSAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweEE0LCAweEYzLCAweDgwLCAweEUxLCAweENDLCAweDg0LCAweEUwLCAweDg1LCAweDE1LCAweDYwLCAweEEyLCAweEU3LAorCSAweDI2LCAweDYwLCAweDc4LCAweDY0LCAweDU4LCAweDRGLCAweDRGLCAweDAwLCAweDI2LCAweDYwLCAweDk0LCAweDY0LCAweDU4LCAweDRGLCAweDRCLCAweDAwLAorCSAweDI2LCAweDYwLCAweEIwLCAweDY0LCAweDU4LCAweDRGLCAweDQ3LCAweDAwLCAweDI2LCAweDYwLCAweENDLCAweDY0LCAweDU4LCAweDRGLCAweDQzLCAweDAwLAorCSAweDI2LCAweDYwLCAweEU4LCAweDY0LCAweDU4LCAweDRGLCAweDNGLCAweDAwLCAweDI3LCAweDYwLCAweDA0LCAweDY0LCAweDU4LCAweDRGLCAweDNCLCAweDAwLAorCSAweDI3LCAweDYwLCAweDIwLCAweDY0LCAweDU4LCAweDRGLCAweDM3LCAweDAwLCAweDAxLCAweDY4LCAweEZGLCAweDZBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDNGLCAweDQ0LCAweDIwLCAweDI3LCAweDAwLCAweDAwLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA4LCAweDAwLCAweDAwLCAweDYwLAorCSAweDE4LCAweDY0LCAweDAwLCAweDYwLCAweDAwLCAweDY1LCAweDk0LCAweDg0LCAweEEwLCAweDUwLCAweDFELCAweDYwLCAweDE5LCAweEUyLCAweEM0LCAweEUyLAorCSAweDAwLCAweDYzLCAweEEzLCAweEZELCAweDMyLCAweDdCLCAweDRELCAweEUyLCAweEJGLCAweEZFLCAweEM0LCAweEUyLCAweDQxLCAweEZGLCAweEUwLCAweEZFLAorCSAweEUxLCAweEZFLCAweEUyLCAweEZFLCAweDQzLCAweEZGLCAweDQ0LCAweEZGLCAweDQ2LCAweEZGLCAweEE1LCAweEYzLCAweDYyLCAweEZGLCAweDYwLCAweDQwLAorCSAweDA1LCAweDM2LCAweDJELCAweEZGLCAweDA3LCAweDM2LCAweEQ1LCAweEZFLCAweDA4LCAweEUxLCAweDg4LCAweDYwLCAweDg1LCAweDcxLCAweDhELCAweEUyLAorCSAweEEyLCAweDYwLCAweDE2LCAweDc4LCAweEZGLCAweEZGLCAweDUwLCAweEVDLCAweDYzLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDQwLCAweEVDLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQ0LCAweEQzLCAweDgwLCAweDdDLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEIwLCAweDhBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDQyLCAweEZGLCAweDQwLCAweEZGLAorCSAweERELCAweEZFLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweDAxLCAweEJDLCAweEEwLCAweDVELCAweDAwLCAweEVFLCAweDE5LCAweDYxLCAweENELCAweDgxLAorCSAweEZGLCAweEZGLCAweEZELCAweDAyLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDYwLCAweEJDLCAweDQwLCAweDQwLCAweDAyLCAweDYwLCAweEVFLCAweDYzLAorCSAweDdGLCAweEYzLCAweEEzLCAweEZELCAweDQwLCAweDdGLCAweEE0LCAweEZCLCAweDA1LCAweDY0LCAweEE1LCAweEZCLCAweERGLCAweEZFLCAweDE5LCAweEZGLAorCSAweDI0LCAweDYwLCAweERELCAweDY0LCAweDNGLCAweDQwLCAweDAxLCAweDJCLCAweDAyLCAweDAwLCAweDMyLCAweDYwLCAweEEyLCAweDY0LCAweEE2LCAweEZCLAorCSAweEJCLCAweDYwLCAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweEVFLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweDAxLCAweEJDLCAweEEwLCAweDVELAorCSAweDE5LCAweDYxLCAweENELCAweDgxLCAweEZGLCAweEZGLCAweEZELCAweDAyLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweDAxLCAweEJDLCAweEEwLCAweDVELAorCSAweDAwLCAweEVFLCAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDI1LCAweDYwLCAweDAyLCAweDYzLCAweDI1LCAweDYwLCAweDc2LCAweDY1LCAweERGLCAweEZFLAorCSAweDgwLCAweEUxLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLAorCSAweEQ3LCAweDgwLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweDAyLCAweDI1LCAweDYwLCAweDc2LCAweDYzLCAweDI2LCAweDYwLCAweDc4LCAweDY1LAorCSAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLCAweEQ3LCAweDgwLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY1LCAweDAyLCAweDNGLCAweDQwLCAweDIwLCAweDJCLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweEZGLCAweDZBLAorCSAweEJGLCAweEZFLCAweDMzLCAweDYwLCAweDhBLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDIwLCAweDJCLCAweEFELCAweDAwLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDM4LCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDJBLCAweEE1LCAweDAwLCAweDI3LCAweDYwLAorCSAweEI0LCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA4LCAweDI4LCAweEEyLCAweERCLCAweDdGLCAweEYxLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDlDLCAweDAxLCAweDAwLCAweDdGLCAweEYxLCAweERELCAweEZFLCAweEFELCAweDRGLCAweDAwLCAweDdGLAorCSAweDAxLCAweEJDLCAweEEwLCAweDVELCAweDAwLCAweEVFLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDAyLCAweDYwLAorCSAweEVFLCAweDY0LCAweEEzLCAweEZCLCAweEE0LCAweEY5LCAweDA1LCAweDY0LCAweEE1LCAweEZCLCAweERGLCAweEZFLCAweDE5LCAweEZGLCAweDgzLCAweDAwLAorCSAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDQzLCAweDQ1LCAweEE0LCAweEQxLCAweERBLCAweDgzLCAweEMzLCAweDg1LCAweDgwLCAweEUxLAorCSAweERGLCAweEZFLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLAorCSAweEQ3LCAweDgwLCAweEExLCAweEZGLCAweEY2LCAweDAyLCAweEJGLCAweEZFLCAweDZFLCAweDAwLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDEzLCAweDAwLAorCSAweDBCLCAweDYwLCAweEY4LCAweDYyLCAweEEyLCAweEQxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweDkwLCAweDg0LCAweEEwLCAweDUwLCAweEY4LCAweEEyLAorCSAweEEyLCAweEQxLCAweDBBLCAweDYwLCAweDE5LCAweDY0LCAweDkwLCAweDg0LCAweEEwLCAweDUyLCAweDA2LCAweEEyLCAweEEyLCAweEQxLCAweDQ2LCAweDYwLAorCSAweDA5LCAweDY0LCAweDkwLCAweDg0LCAweEEwLCAweDUwLCAweEFELCAweDRGLCAweEZFLCAweEI0LCAweEEwLCAweDVELCAweEFELCAweDRGLCAweEZELCAweEI0LAorCSAweEEwLCAweDVELCAweDAyLCAweEVFLCAweEJELCAweEZFLCAweDUwLCAweDAwLCAweDgwLCAweEUxLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY0LCAweDQ4LAorCSAweDkyLCAweDZBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQwLCAweDI3LCAweDYwLCAweEEyLCAweDY0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLAorCSAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA4LCAweDI4LCAweEEyLCAweERCLCAweDNGLCAweDAwLCAweDgwLCAweEUxLCAweDAxLCAweDE2LCAweEZFLCAweDAxLAorCSAweDAxLCAweDY4LCAweEE3LCAweDZBLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQwLCAweDM2LCAweDAwLCAweDIwLCAweDQ0LCAweDIwLCAweEJDLAorCSAweDQwLCAweDQwLCAweDgwLCAweEUxLCAweDY0LCAweDQ2LCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDIxLCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLAorCSAweDY4LCAweDVFLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDIyLCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDVGLCAweDI2LCAweEZBLAorCSAweDFDLCAweEYyLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDNBLCAweDY5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDVGLCAweDI3LCAweEZBLAorCSAweDFCLCAweDAwLCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDQzLCAweDQ1LCAweEJFLCAweEQ1LCAweEE0LCAweEQyLCAweDVBLCAweDg2LAorCSAweEVGLCAweEEwLCAweDExLCAweDYxLCAweDAxLCAweDA2LCAweDYwLCAweDQxLCAweDI0LCAweDYwLCAweEUwLCAweDYzLCAweDgwLCAweEUxLCAweEJELCAweEQzLAorCSAweDI2LCAweDQyLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDYwLCAweDQ5LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweENELCAweDgxLAorCSAweEEyLCAweERBLCAweDVBLCAweDg2LCAweEY0LCAweDAyLCAweDI1LCAweDQzLCAweDIxLCAweEUxLCAweDAwLCAweDY0LCAweEJGLCAweERCLCAweDIwLCAweDQ0LAorCSAweDIwLCAweDJBLCAweDA3LCAweDAwLCAweDA3LCAweEI0LCAweDA0LCAweDM2LCAweEMzLCAweEZFLCAweDA2LCAweDM2LCAweENDLCAweEZFLCAweDA3LCAweDM2LAorCSAweEQ1LCAweEZFLCAweDIwLCAweDQ0LCAweEQ4LCAweEI0LCAweDQwLCAweDQwLCAweDIwLCAweDQ0LCAweDQwLCAweDJBLCAweDA3LCAweDAwLCAweDlGLCAweEZFLAorCSAweDFFLCAweDA1LCAweEJGLCAweEI0LCAweDQwLCAweDQwLCAweEE2LCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDgwLCAweDYzLAorCSAweEJELCAweEQzLCAweDAyLCAweDYxLCAweDE3LCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDAyLCAweDYxLCAweDEzLCAweDFCLCAweDA0LCAweEEzLAorCSAweEJELCAweEQzLCAweDAyLCAweDYxLCAweDBGLCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDA0LCAweDYxLCAweDBCLCAweDFCLCAweDA0LCAweEEzLAorCSAweEJELCAweEQzLCAweDA2LCAweDYxLCAweDA3LCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDA3LCAweDYxLCAweDAzLCAweDFCLCAweEJCLCAweDYwLAorCSAweDIwLCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEQxLCAweDQwLCAweDQ0LCAweDIwLCAweDQ0LCAweDA3LCAweEI1LCAweEQ0LCAweDg1LCAweDM1LCAweDgwLAorCSAweDI0LCAweDQ1LCAweDI0LCAweDYwLCAweEJDLCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDgwLCAweEUxLCAweDQzLCAweDQ1LAorCSAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQzLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweDQwLCAweDQ0LCAweDEwLCAweDI3LAorCSAweDEwLCAweDAwLCAweEZGLCAweDYwLCAweDdGLCAweDY1LCAweDE1LCAweDYwLCAweEEyLCAweDY0LCAweDI0LCAweDQwLCAweDA4LCAweDJCLCAweEE0LCAweDg0LAorCSAweEEwLCAweDU3LCAweEZGLCAweEZGLCAweDY0LCAweDQ5LCAweEZGLCAweEZGLCAweDY4LCAweDQ0LCAweDAxLCAweDE2LCAweEZELCAweDAxLCAweDAwLCAweDdGLAorCSAweEEzLCAweERCLCAweEExLCAweDAxLCAweDgwLCAweEUxLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQzLAorCSAweEJELCAweEQzLCAweEJELCAweEQxLCAweDQwLCAweDQ0LCAweDEwLCAweDJCLCAweDExLCAweDAwLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDE1LCAweDYwLAorCSAweDgwLCAweEU3LCAweDI0LCAweDQwLCAweDA3LCAweDI3LCAweDAyLCAweDAwLCAweDUwLCAweEVDLCAweDAwLCAweDAwLCAweDYwLCAweDRBLCAweEZGLCAweEZGLAorCSAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDI0LCAweDQwLCAweDIwLCAweDJCLCAweDQwLCAweEVDLCAweDBGLCAweDAwLCAweDE1LCAweDYwLCAweDIyLCAweDY0LAorCSAweDI0LCAweDQwLCAweDA4LCAweDI3LCAweDgwLCAweEJDLCAweEEzLCAweEQzLCAweEEwLCAweDU3LCAweDYwLCAweDQ4LCAweDY0LCAweDQ0LCAweDgwLCAweEJDLAorCSAweEZGLCAweEI0LCAweDYwLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDc1LCAweDAxLCAweDQyLCAweDZGLCAweDZGLCAweDc0LAorCSAweDYzLCAweDZGLCAweDY0LCAweDY1LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDAwLCAweDUzLCAweDU0LCAweDQxLCAweDJGLCAweDQxLCAweDUwLAorCSAweDIwLCAweDQ2LCAweDc1LCAweDZFLCAweDYzLCAweDI3LCAweDczLCAweDAwLCAweDFGLCAweDAwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDI0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLAorCSAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA2LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLAorCSAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAyLCAweDAwLCAweDQwLCAweDAwLCAweDMyLCAweDAwLCAweDMyLCAweDAwLCAweDBBLCAweDAwLCAweDAyLCAweDAwLCAweDA2LCAweDAwLCAweDQwLCAweDAwLAorCSAweDMyLCAweDAwLCAweDM2LCAweDAwLCAweDBBLCAweDAwLCAweDAyLCAweDAwLCAweDA2LCAweDAwLCAweDQwLCAweDAwLCAweDNCLCAweDAwLCAweDQwLCAweDAwLAorCSAweDE3LCAweDAwLCAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDRBLCAweDAwLCAweDQwLCAweDAwLCAweDRBLCAweDAwLCAweDFFLCAweDAwLCAweDBDLCAweDAwLAorCSAweDA4LCAweDAwLCAweDU3LCAweDAwLCAweDRELCAweDAwLCAweDU3LCAweDAwLCAweDJCLCAweDAwLCAweDE5LCAweDAwLCAweDA4LCAweDAwLCAweDVELCAweDAwLAorCSAweDUzLCAweDAwLCAweDVELCAweDAwLCAweDMxLCAweDAwLCAweDFGLCAweDAwLCAweDA4LCAweDAwLCAweEE5LCAweEYzLCAweDIxLCAweDYxLCAweDAwLCAweDdDLAorCSAweDAxLCAweDAwLCAweDAwLCAweEZBLCAweDYwLCAweDQ2LCAweEZFLCAweDYzLCAweEEzLCAweEQ4LCAweEZFLCAweDFGLCAweENELCAweDgxLCAweEQ4LCAweDg0LAorCSAweEY4LCAweDAyLCAweDIxLCAweDYxLCAweDgwLCAweDY3LCAweDQwLCAweDRBLCAweEE5LCAweEY1LCAweDE0LCAweDYwLCAweDAyLCAweDY1LCAweDAxLCAweDdDLAorCSAweDA3LCAweDE4LCAweDJBLCAweDQzLCAweDAyLCAweEZDLCAweDVGLCAweDhBLCAweDhFLCAweEY4LCAweDcwLCAweEY4LCAweDAwLCAweEY0LCAweEY4LCAweDAxLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDBBLCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweEUwLCAweDNGLCAweDQwLAorCSAweDAxLCAweDJBLCAweDAzLCAweDAwLCAweDYwLCAweDYwLCAweDFDLCAweEUwLCAweDAyLCAweDAwLCAweDgwLCAweDYwLCAweDFDLCAweEUwLCAweDQwLCAweEVDLAorCSAweDAwLCAweEVELCAweDAyLCAweEVFLCAweDgwLCAweDYwLCAweDU4LCAweEVDLCAweDgwLCAweDYwLCAweDAwLCAweEVELCAweDgwLCAweDYwLCAweDgyLCAweEVFLAorCSAweEMwLCAweDYwLCAweDU5LCAweEVDLCAweEMwLCAweDYwLCAweDA3LCAweEVELCAweEFELCAweDRGLCAweEZFLCAweEI0LCAweEEwLCAweDVELCAweDAwLCAweEYzLAorCSAweDI4LCAweEZCLCAweDQwLCAweDQ0LCAweDJGLCAweDYwLCAweDUyLCAweDdDLCAweDIwLCAweEY5LCAweEEyLCAweDYwLCAweDAwLCAweDdDLCAweDIxLCAweEY5LAorCSAweEEyLCAweDYwLCAweEUwLCAweDdDLCAweDIyLCAweEY5LCAweDE4LCAweDYwLCAweDk3LCAweDdDLCAweDIzLCAweEY5LCAweDE4LCAweDYwLCAweEE4LCAweDdDLAorCSAweDI0LCAweEY5LCAweDE4LCAweDYwLCAweEQyLCAweDdDLCAweDI1LCAweEY5LCAweDE4LCAweDYwLCAweEUzLCAweDdDLCAweDI2LCAweEY5LCAweDkxLCAweDYwLAorCSAweDAwLCAweEU4LCAweDI4LCAweEU4LCAweDQ0LCAweDYwLCAweDAyLCAweEU2LCAweDEwLCAweDY3LCAweDQwLCAweDUyLCAweDEwLCAweDYwLCAweDA0LCAweEU2LAorCSAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLAorCSAweDRBLCAweDAyLCAweDQ5LCAweDAyLCAweERCLCAweDgzLCAweEZBLCAweDYwLCAweDI3LCAweDY1LCAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDFBLCAweDE4LAorCSAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweERCLCAweDgzLCAweEQzLCAweDgzLCAweEQzLCAweDg2LCAweDY0LCAweDQxLAorCSAweENELCAweDgxLCAweEE2LCAweEQxLCAweERBLCAweDg2LCAweDI1LCAweDYwLCAweDAyLCAweDY1LCAweDAwLCAweDYwLCAweDcyLCAweDYzLCAweEE1LCAweEQzLAorCSAweERBLCAweDg1LCAweDkwLCAweDg0LCAweEZGLCAweDI3LCAweDAyLCAweDAwLCAweEEyLCAweEQ5LCAweDAxLCAweDAwLCAweEY4LCAweDFGLCAweENELCAweDgxLAorCSAweEZGLCAweEZGLCAweEVGLCAweDAyLCAweDA4LCAweDYwLCAweDA2LCAweDYzLCAweEZBLCAweDYwLCAweDI4LCAweDY1LCAweDVCLCAweEQzLCAweEJGLCAweEQxLAorCSAweDBCLCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEJGLCAweEQzLCAweDI5LCAweDYwLCAweEU4LCAweDYyLAorCSAweDBFLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDA2LCAweDYzLCAweEZELCAweDYwLCAweDBDLCAweDY1LAorCSAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDEwLCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEZBLCAweEEzLAorCSAweEEzLCAweEQzLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweEY3LCAweEEwLCAweEZDLCAweEEwLCAweDBELCAweDA1LCAweDA0LCAweDA1LCAweDc4LCAweDQzLAorCSAweDAyLCAweDYxLCAweDI0LCAweDYwLCAweERELCAweDc4LCAweDIxLCAweDYwLCAweDAwLCAweDY1LCAweDNGLCAweDQzLCAweDNGLCAweDQzLCAweDIxLCAweDYwLAorCSAweDAwLCAweDY1LCAweEMwLCAweDYwLCAweDhGLCAweEVFLCAweEI3LCAweDg0LCAweDQwLCAweDVGLCAweDAwLCAweDYwLCAweDMwLCAweEUyLCAweDAwLCAweDYwLAorCSAweDUwLCAweEUyLCAweDAwLCAweDYwLCAweDc5LCAweEUyLCAweDAwLCAweDYwLCAweDkwLCAweEUyLCAweDAxLCAweDYwLCAweEQwLCAweEUyLCAweDAxLCAweDYwLAorCSAweEYwLCAweEUyLCAweDAxLCAweDYwLCAweEIwLCAweEUyLCAweDI2LCAweDY0LCAweDM1LCAweEZCLCAweDAxLCAweDYwLCAweDMwLCAweDY0LCAweDBBLCAweEE0LAorCSAweDM4LCAweEZCLCAweDYwLCAweDQ1LCAweDAwLCAweDYwLCAweEY4LCAweDY0LCAweDBBLCAweEE0LCAweDM5LCAweEZCLCAweDM1LCAweEYxLCAweDBBLCAweDY0LAorCSAweEM0LCAweDg0LCAweDM2LCAweEZCLCAweEMwLCAweDg0LCAweDBBLCAweEE0LCAweDM3LCAweEZCLCAweDA5LCAweDYwLCAweDJBLCAweDY0LCAweEI5LCAweEZCLAorCSAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDVDLCAweDQxLCAweDVDLCAweDQ2LCAweDVDLCAweDQ3LCAweDAwLCAweEUxLCAweEEzLCAweDYwLCAweDRCLCAweDYzLAorCSAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDBDLCAweDYwLCAweDAyLCAweDY0LCAweDQwLCAweDVBLAorCSAweDA2LCAweEE0LCAweDQwLCAweDVCLCAweDVDLCAweDVFLCAweDVDLCAweDUxLCAweDI4LCAweDYwLCAweDQ0LCAweDYyLCAweEEyLCAweEQzLCAweDdGLCAweEZCLAorCSAweDJELCAweDYwLCAweENDLCAweDYxLCAweDI3LCAweDdDLCAweEExLCAweEQ5LCAweDZELCAweDYwLCAweDFDLCAweDYzLCAweDdGLCAweEEzLCAweEUzLCAweDg3LAorCSAweDAwLCAweDdGLCAweEFBLCAweEZCLCAweDAyLCAweDYwLCAweDdGLCAweDY0LCAweDAwLCAweDYwLCAweDQyLCAweDY1LCAweEQ0LCAweDg0LCAweEFCLCAweEZCLAorCSAweERDLCAweDg0LCAweEE5LCAweEZCLCAweDI0LCAweDYwLCAweDBFLCAweDYyLCAweEEyLCAweERCLCAweDM0LCAweDYwLCAweDU4LCAweDRFLCAweDY0LCAweDc4LAorCSAweEZGLCAweEZGLCAweEFCLCAweEYxLCAweEFBLCAweEYzLCAweDdDLCAweDYzLCAweEFELCAweEZCLCAweDYwLCAweDQ2LCAweDAxLCAweEZDLCAweERDLCAweDg0LAorCSAweEQwLCAweDgwLCAweDAwLCAweEZBLCAweEZBLCAweDA0LCAweEFFLCAweEZCLCAweDYwLCAweDQ2LCAweDAwLCAweDY0LCAweDAwLCAweEZBLCAweDYzLCAweDQ0LAorCSAweDgwLCAweDdGLCAweDAxLCAweEZBLCAweEFCLCAweEYzLCAweEFBLCAweEYxLCAweERDLCAweDg0LCAweEQwLCAweDg0LCAweEFDLCAweEZCLCAweDAzLCAweDYwLAorCSAweDI2LCAweDYxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDJFLCAweEZCLCAweDgyLCAweEZGLAorCSAweDQwLCAweDQyLCAweDg3LCAweEZGLCAweEFDLCAweEYzLCAweEI0LCAweEZCLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LAorCSAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDI0LCAweDAyLCAweDIzLCAweDAyLCAweDJELCAweDYwLCAweDFBLCAweDYyLAorCSAweEEyLCAweEQxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDgwLCAweDI2LCAweDFDLCAweDAwLCAweDA0LCAweEEzLCAweEZELCAweDYwLCAweDBELCAweDY1LAorCSAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDE2LCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEJGLCAweEQzLAorCSAweEFELCAweDQ5LCAweEZFLCAweEEwLCAweDAwLCAweDY0LCAweDBFLCAweDA0LCAweDA4LCAweEIxLCAweDIwLCAweEJDLCAweDA4LCAweDI4LCAweDE4LCAweEJDLAorCSAweDFDLCAweDYwLCAweEI4LCAweDYzLCAweDA3LCAweDdDLCAweEEzLCAweEQ5LCAweDFDLCAweDYwLCAweEI2LCAweDYzLCAweDA1LCAweDdDLCAweEEzLCAweEQ5LAorCSAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweDFDLCAweDYwLCAweEI0LCAweDYzLCAweEEzLCAweERCLCAweDAwLCAweDY0LCAweDQwLCAweDUwLCAweDYzLCAweEZGLAorCSAweDYwLCAweEZGLCAweDY2LCAweEZGLCAweDY1LCAweEZGLCAweDY0LCAweEZGLCAweDYxLCAweEZGLCAweDYyLCAweEZGLCAweDQ5LCAweDYwLCAweDAyLCAweEUxLAorCSAweDUyLCAweDYwLCAweDAyLCAweEUxLCAweDVCLCAweDYwLCAweDAyLCAweEUxLCAweDY1LCAweDYwLCAweDAyLCAweEUxLCAweDZDLCAweDYwLCAweDAyLCAweEUxLAorCSAweDc2LCAweDYwLCAweDAyLCAweEUxLCAweDQxLCAweDYwLCAweDAyLCAweEUxLCAweDA0LCAweDY1LCAweDJELCAweDYwLCAweDE4LCAweDY0LCAweDQ0LCAweEQzLAorCSAweEVGLCAweDYwLCAweDU4LCAweDRFLCAweEJELCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDlFLCAweDY1LCAweDBDLCAweDY0LCAweEE1LCAweERCLAorCSAweDM2LCAweDYwLCAweDFFLCAweDY0LCAweEExLCAweEZCLCAweDJELCAweEZGLCAweDA2LCAweDYxLCAweDQxLCAweDRCLCAweDA5LCAweDYwLCAweDA4LCAweDYxLAorCSAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI0LCAweDYwLCAweDdBLCAweDYyLAorCSAweDI0LCAweDYwLCAweDVFLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweDJCLCAweDQxLCAweDRELCAweDhCLCAweEZGLCAweEZGLCAweEU5LCAweDAyLCAweDA2LCAweDYxLCAweDQxLCAweDRCLCAweDA5LCAweDYwLAorCSAweDA4LCAweDYxLCAweEFFLCAweDYwLCAweDU4LCAweDRELCAweEIxLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDdBLCAweDYyLCAweDI0LCAweDYwLAorCSAweDUyLCAweDY0LCAweEEyLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDJCLCAweDQxLCAweDRELCAweDhCLCAweEZGLCAweEZGLCAweEVCLCAweDAyLCAweDE5LCAweDYwLCAweDE3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEVBLAorCSAweDAwLCAweEVCLCAweDUwLCAweDYwLCAweDAzLCAweEVBLCAweDUxLCAweDYwLCAweDEzLCAweEVBLCAweDUyLCAweDYwLCAweDMwLCAweEVBLCAweDUzLCAweDYwLAorCSAweDQwLCAweEVBLCAweDU0LCAweDYwLCAweDUyLCAweEVBLCAweDU1LCAweDYwLCAweDZELCAweEVBLCAweDU2LCAweDYwLCAweDcxLCAweEVBLCAweDU3LCAweDYwLAorCSAweDhCLCAweEVBLCAweDU4LCAweDYwLCAweDQ3LCAweEVBLCAweDU5LCAweDYwLCAweEEwLCAweEVBLCAweDVBLCAweDYwLCAweEIyLCAweEVBLCAweDVCLCAweDYwLAorCSAweEMxLCAweEVBLCAweDVDLCAweDYwLCAweEQ3LCAweEVBLCAweDVELCAweDYwLCAweEVCLCAweEVBLCAweDVFLCAweDYwLCAweEEwLCAweEVBLCAweDUwLCAweDYwLAorCSAweDM2LCAweEVCLCAweDUxLCAweDYwLCAweDM3LCAweEVCLCAweDUyLCAweDYwLCAweDIwLCAweEVCLCAweDUzLCAweDYwLCAweEU0LCAweEVCLCAweDU0LCAweDYwLAorCSAweDM0LCAweEVCLCAweDU1LCAweDYwLCAweDU4LCAweEVCLCAweDU2LCAweDYwLCAweDQ4LCAweEVCLCAweDU3LCAweDYwLCAweEQwLCAweEVCLCAweDU4LCAweDYwLAorCSAweEMzLCAweEVCLCAweDU5LCAweDYwLCAweEZDLCAweEVCLCAweDVBLCAweDYwLCAweDM0LCAweEVCLCAweDVCLCAweDYwLCAweDU4LCAweEVCLCAweDVDLCAweDYwLAorCSAweEMwLCAweEVCLCAweDVELCAweDYwLCAweEQwLCAweEVCLCAweDVFLCAweDYwLCAweDkxLCAweEVCLCAweDAwLCAweEVBLCAweDAwLCAweEVCLCAweEUwLCAweDYwLAorCSAweDAyLCAweEVBLCAweEUwLCAweDYwLCAweDAzLCAweEVCLCAweEEwLCAweDYwLCAweDAwLCAweEVCLCAweEIwLCAweDYwLCAweDAwLCAweEVCLCAweEFCLCAweDQ4LAorCSAweDQwLCAweDNCLCAweDAxLCAweDAwLCAweEZDLCAweDAxLCAweDAwLCAweEVCLCAweDAzLCAweDYwLCAweDAyLCAweDYyLCAweDYyLCAweDQ0LCAweEEyLCAweERCLAorCSAweDBGLCAweDY0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLCAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLAorCSAweDAwLCAweEVBLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA4LCAweDAwLCAweDAwLCAweDYwLCAweDE4LCAweDY0LCAweDAwLCAweDYwLCAweDAwLCAweDY1LAorCSAweDk0LCAweDg0LCAweEEwLCAweDUwLCAweDFELCAweDYwLCAweDE5LCAweEUyLCAweDI0LCAweDQ0LCAweEZGLCAweEI0LCAweDA0LCAweEZCLCAweDUwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA1LCAweEZCLCAweDEwLCAweDYwLCAweDEwLCAweDc1LCAweDI1LCAweDYwLCAweDExLCAweDc4LCAweEZGLCAweEZGLCAweDNGLCAweDQxLAorCSAweEE1LCAweDRDLCAweDUwLCAweDM3LCAweDA0LCAweDAwLCAweDAxLCAweEI5LCAweDQxLCAweDVGLCAweEI1LCAweDYwLCAweDU1LCAweEUwLCAweDBDLCAweDYwLAorCSAweDEwLCAweDYyLCAweEEyLCAweEQzLCAweDAxLCAweDYwLCAweDAxLCAweDY1LCAweEQ0LCAweDgwLCAweDVBLCAweEQxLCAweDBGLCAweDAyLCAweDVBLCAweEQzLAorCSAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDY4LCAweDYwLCAweDI4LCAweDYxLCAweDY0LCAweDQ0LCAweEM4LCAweDg0LAorCSAweDBDLCAweDYzLCAweEFBLCAweDQ2LCAweDU4LCAweEQwLCAweEFBLCAweDQ2LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDA4LCAweDYwLCAweDAwLCAweDYzLAorCSAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDYxLCAweDAyLCAweDYwLCAweDAyLAorCSAweDZFLCAweDYwLCAweDU4LCAweDYxLCAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDZFLCAweDYwLCAweEEwLCAweDdDLAorCSAweEQxLCAweDgwLCAweEExLCAweEQyLCAweDI1LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LAorCSAweDQwLCAweDRBLCAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLAorCSAweEVDLCAweDE4LCAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDY3LCAweDQ0LAorCSAweEMwLCAweDg0LCAweEUwLCAweDg1LCAweDJDLCAweDQ0LCAweEQ0LCAweDgwLCAweDYzLCAweDQxLCAweDAxLCAweDA2LCAweDY1LCAweDQ0LCAweEM4LCAweDgzLAorCSAweEFBLCAweDQ2LCAweDU5LCAweEQxLCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZDLCAweDFGLCAweEFBLCAweDQ2LCAweDJCLCAweDQxLCAweEQ1LCAweDAxLAorCSAweDZFLCAweDYwLCAweEEwLCAweDYxLCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDZFLCAweDYwLCAweEQ4LCAweDdDLCAweEQxLCAweDgwLCAweEExLCAweEQyLAorCSAweDI3LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDU5LCAweEQyLAorCSAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLCAweEVDLCAweDE4LCAweEQ0LCAweDgwLAorCSAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDA0LCAweEEzLCAweEEzLCAweEQxLCAweDVBLCAweDg4LAorCSAweDJDLCAweDQzLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA2LCAweDY0LCAweDQzLCAweENGLCAweDgzLCAweEFBLCAweDQ2LCAweDYwLCAweEZFLAorCSAweDI4LCAweEQxLCAweDVFLCAweDg4LCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZCLCAweDFGLCAweDIwLCAweEZFLCAweEFBLCAweDQ2LCAweEQzLCAweDAxLAorCSAweEI4LCAweEZFLCAweEI5LCAweEZFLCAweEJBLCAweEZFLCAweEJCLCAweEZFLCAweEJELCAweEZFLCAweEJGLCAweEZFLCAweDJELCAweDYwLCAweDFBLCAweDYyLAorCSAweEEyLCAweEQzLCAweDEyLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA1LCAweDAwLCAweDBCLCAweDYwLCAweEVBLCAweDYyLCAweDAwLCAweDY0LAorCSAweDVBLCAweERCLCAweEZFLCAweDFGLCAweDM0LCAweDYwLCAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweEYxLCAweEZGLCAweEY2LCAweDZDLCAweDFFLCAweDAwLAorCSAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweEZBLCAweDZDLCAweDFFLCAweDAwLCAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweDAyLCAweDZELCAweDFFLCAweDAwLAorCSAweDA0LCAweDAwLCAweEYxLCAweEZGLCAweDhDLCAweDY0LCAweDFFLCAweDAwLCAweDA0LCAweDAwLCAweEYyLCAweEZGLCAweDkwLCAweDY0LCAweDFFLCAweDAwLAorCSAweDA0LCAweDAwLCAweEZCLCAweEZGLCAweDk4LCAweDY0LCAweDFFLCAweDAwLCAweDA0LCAweDAwLCAweDg2LCAweEZELCAweDUwLCAweDI4LCAweDAwLCAweDAwLAorCSAweDA2LCAweDAwLCAweDEwLCAweEZELCAweDc0LCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDE0LCAweEZELCAweDE4LCAweDJELCAweDAwLCAweDAwLAorCSAweDBBLCAweDAwLCAweDIwLCAweEZBLCAweDk0LCAweDI2LCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIxLCAweEZBLCAweDc4LCAweDI2LCAweDAwLCAweDAwLAorCSAweDBFLCAweDAwLCAweDIyLCAweEZBLCAweEIwLCAweDI2LCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDIzLCAweEZBLCAweDY0LCAweDI1LCAweDAwLCAweDAwLAorCSAweDAxLCAweDAwLCAweDI0LCAweEZBLCAweDU4LCAweDI3LCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweDI1LCAweEZBLCAweDc4LCAweDI1LCAweDAwLCAweDAwLAorCSAweDgwLCAweDAwLCAweDI2LCAweEZBLCAweDVFLCAweDI1LCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfM19kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV80X2RhdGFbXSA9IHsKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhDMywgMHg3OCwgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhDOSwgMHg3OCwgMHhDNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHgxOSwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0NCwgMHhGRiwgMHgyMCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhBMiwgMHg2MCwgMHhEQiwgMHg3OCwgMHgwOCwgMHhFMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBOCwgMHg2MCwgMHg3MywgMHg3OCwgMHg0QywgMHg0RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNywgMHg2MCwgMHhGQiwgMHg3OCwgMHg0QywgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhFMiwgMHg4NCwgMHhGRiwgMHgyMiwgMHg1OCwgMHg4MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHg2MCwgMHg3RSwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFNCwgMHhFMiwgMHhBOCwgMHg2MCwgMHgxNCwgMHg3OCwgMHhCNSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCQSwgMHg2MCwgMHhDRSwgMHg3OCwgMHg2NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBOCwgMHg2MCwgMHg4NywgMHg3OCwgMHhBNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBOCwgMHg2MCwgMHg1NSwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRSwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRSwgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg2MCwgMHhEOCwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRiwgMHg2MCwgMHhDMCwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4MywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHhBRCwgMHg2MCwgMHhFNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMSwgMHg2MCwgMHgxNiwgMHg3OCwgMHg0MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg2MCwgMHhBMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCOSwgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCOCwgMHg2MCwgMHhCQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMCwgMHg2MCwgMHg4OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCQiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg0MCwgMHhGRiwgMHg0MywgMHhGRiwgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCQiwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHgzMywgMHg2MCwgMHg5QiwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCQiwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCRiwgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFQiwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHgyNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhFOSwgMHg2MCwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMywgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgzMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHgyOCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4NywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHg0NywgMHhGRiwgMHgyNSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyRiwgMHg2MCwgMHg2MywgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgyRiwgMHg2MCwgMHhCMywgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwNywgMHgwMiwgMHg2MiwgMHhGRiwgMHg2MywgMHhGRiwgMHg2NCwgMHhGRiwgMHg2NSwgMHhGRiwKKwkgMHg2NiwgMHhGRiwgMHhCRiwgMHhGRSwgMHhBMSwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwgMHg2QywgMHg0MCwgMHg0MSwgMHhGRiwgMHhDNCwgMHhFMiwKKwkgMHg0MywgMHhGRiwgMHg1QywgMHg0OSwgMHgwOCwgMHhFMSwgMHhBMiwgMHg2MCwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHg4MCwgMHgzRSwgMHg5RiwgMHhGRSwgMHgwMywgMHgwNCwgMHgzMSwgMHg2MCwgMHg3NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHhGRSwgMHg0MCwgMHgwNSwKKwkgMHhFMCwgMHhGRSwgMHg1QiwgMHgwNSwgMHhFMSwgMHhGRSwgMHhGMiwgMHgwNCwgMHgyOSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhFRiwgMHgwMSwgMHg3MiwgMHg0NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhCNSwgMHhGMywgMHhFOCwgMHg4NSwgMHhGRiwgMHhCNywKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NSwgMHg3MywgMHg0NCwgMHhENCwgMHg4NCwgMHgxMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHgwNCwgMHgzRiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxMywgMHgwMCwgMHgwQiwgMHg2MCwgMHhGOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGOCwgMHhBMiwgMHhBMiwgMHhEMSwgMHgwQSwgMHg2MCwgMHgxOSwgMHg2NCwgMHg5MCwgMHg4NCwKKwkgMHhBMCwgMHg1MiwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwgMHg0NiwgMHg2MCwgMHgwOSwgMHg2NCwgMHg5MCwgMHg4NCwgMHhBMCwgMHg1MCwgMHhGMiwgMHhGNCwKKwkgMHgzMSwgMHg2MCwgMHgxOCwgMHg3QywgMHg2MywgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhBRCwgMHg0RiwgMHhGRSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgwMiwgMHhFRSwgMHhCRCwgMHhGRSwgMHhCRSwgMHgwMSwKKwkgMHgyMSwgMHg0NiwgMHg1RSwgMHg2MiwgMHg5QSwgMHhGRiwgMHgwNywgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgyNSwgMHgxMCwgMHgwMCwKKwkgMHhBMiwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg2MiwgMHg2MiwgMHgwMSwgMHg1RCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg0NCwgMHhGRiwgMHgwNiwgMHgyNSwgMHgwNCwgMHgwMCwgMHgwRSwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg5RSwgMHgwMSwKKwkgMHg2MiwgMHhGRiwgMHhDNCwgMHhFMiwgMHg0MSwgMHhGRiwgMHgwQSwgMHhFMSwgMHg5OSwgMHgwMSwgMHhDOCwgMHg3NCwgMHhDRCwgMHhFMiwgMHgyOSwgMHg0NCwKKwkgMHgwOCwgMHhCQywgMHg0MCwgMHg0OSwgMHgwNSwgMHhFMSwgMHgzMSwgMHg2MCwgMHgxQSwgMHg2MywgMHhBMywgMHhEMywgMHhGMiwgMHhGMywgMHgwNiwgMHgxOCwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHg0OCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwMiwgMHhCQywgMHhGMiwgMHhGQiwKKwkgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NywgMHg0QywgMHgwNiwgMHg2MSwgMHhDRCwgMHg4MSwgMHgwNCwgMHgyNSwKKwkgMHgzMCwgMHgwMCwgMHg4NywgMHg0QywgMHhGQiwgMHgwMiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwgMHgxNSwgMHg2MCwgMHg2RiwgMHg2QiwKKwkgMHhGMywgMHg2MCwgMHhBMCwgMHg2NCwgMHgwNCwgMHgyNSwgMHgyNSwgMHgwMCwgMHg4MCwgMHg0QywgMHgzMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg0NCwgMHhGRiwKKwkgMHgwNCwgMHgyNSwgMHgxRiwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyNSwgMHg0NCwgMHgzNywgMHgzNiwgMHhCNCwgMHg4NCwgMHg2RSwgMHgzNiwKKwkgMHhCNCwgMHg4NCwgMHg4MCwgMHg0RSwgMHgyNCwgMHg0MSwgMHgwNCwgMHgyNSwgMHgxNCwgMHgwMCwgMHg2MSwgMHg0QywgMHg2NCwgMHhBMSwgMHg2MSwgMHg1NCwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNSwgMHgwRCwgMHgwMCwgMHg2NywgMHg0RSwgMHgwNywgMHg2NCwgMHgxQywgMHhGQiwgMHgwMCwgMHhFMSwKKwkgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHg1MywgMHgwMSwgMHgzMywgMHhGMywgMHhGRCwgMHgxMSwgMHhGQywgMHgxOCwgMHg0MCwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwQSwgMHgwMCwgMHhDNCwgMHhFMiwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2NywgMHg0QywKKwkgMHgwMiwgMHgwMCwgMHg0MSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2MiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhFMiwgMHhGRSwgMHg3MiwgMHg1MiwgMHg1QywgMHg0OSwKKwkgMHgzMiwgMHg3QiwgMHg0RCwgMHhFMiwgMHgzQiwgMHgwMSwgMHgwOCwgMHhFMSwgMHgzOSwgMHgwMSwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwKKwkgMHgzMCwgMHg0NCwgMHgwMiwgMHhBOCwgMHgwMCwgMHhFMSwgMHgwMiwgMHgwMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHg4OCwgMHhGRiwKKwkgMHg0OCwgMHhFMiwgMHgwMSwgMHg3MCwgMHhDRSwgMHhGMSwgMHgwMCwgMHg2QiwgMHg4OSwgMHhGRiwgMHg2NCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg5RiwgMHhGRSwKKwkgMHgwMiwgMHgwNSwgMHg2NCwgMHg0NCwgMHg2MCwgMHg1NCwgMHhDRCwgMHhFMiwgMHhDMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCNCwgMHg0MCwgMHg0NiwgMHgzQywgMHg0NCwgMHgwMCwgMHhCQywgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMywKKwkgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg1QywgMHg0RCwgMHgyNywgMHg0NCwgMHgxOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMCwgMHhFMSwgMHg2QywgMHg0MCwgMHg0NCwgMHhFMiwgMHhDNCwgMHhFMiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwKKwkgMHgzMiwgMHhGMSwgMHgwOCwgMHgyOSwgMHgwOSwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNiwgMHgwMCwgMHg0MywgMHhGRiwgMHgyNywgMHg0NCwKKwkgMHgxMCwgMHhCQywgMHg0MCwgMHg0NywgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHgzMSwgMHg0MSwgMHgzQywgMHg0NCwgMHgwMSwgMHhCMSwgMHgwMCwgMHhCQywKKwkgMHgwQSwgMHgwMiwgMHgwOSwgMHgwMywgMHgzMiwgMHhGMywgMHgwMCwgMHg3QywgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHgzMiwgMHhGOSwKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgwMCwgMHg2NCwKKwkgMHgzMywgMHhGQiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMiwgMHhGMywgMHgwOCwgMHgyOSwKKwkgMHgwQSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNywgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMiwgMHhGQiwgMHgyNywgMHg0NCwgMHgxMCwgMHhCQywKKwkgMHhGNywgMHhCNCwgMHg0MCwgMHg0NywgMHg0MywgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHhFNSwgMHhGRSwgMHgxRCwgMHgwNSwKKwkgMHgyNywgMHg0NCwgMHgxMCwgMHgyNiwgMHgxRCwgMHgwMCwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNCwgMHgwMiwgMHhFMSwgMHgxMCwgMHgwMCwgMHgzRSwgMHhFMSwKKwkgMHgzMSwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHgwRSwgMHgwQSwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNywgMHgwMCwgMHhENCwgMHgzNiwKKwkgMHgwNSwgMHgwMCwgMHhDNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHhCRiwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHhBQiwgMHg2MCwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHg0NCwgMHgwOCwgMHgyNiwgMHhGRiwgMHhGRiwgMHhCQSwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHhGMywgMHgzMiwgMHhGMSwKKwkgMHgwMCwgMHg2MywgMHg2NCwgMHg0MCwgMHgwMywgMHgyMiwgMHg2NiwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhFMiwKKwkgMHg4NCwgMHhFMSwgMHg3MCwgMHg0MSwgMHhBRCwgMHg4MCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhFRCwgMHgxMiwgMHgwMywgMHgwMywgMHhCQSwgMHg2MCwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgzMiwgMHhGRCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHhERiwgMHgwMSwgMHgwMCwgMHg2MywgMHgzMiwgMHhGRCwgMHg2QywgMHg0MCwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgyNywgMHg0MSwKKwkgMHg0NCwgMHg0OCwgMHgyMCwgMHhCOSwgMHgwMSwgMHhCNCwgMHhGNywgMHhCMSwgMHgwQSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyNywgMHgwNywgMHgwMCwKKwkgMHgwRiwgMHg2MCwgMHg5MiwgMHg2MywgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHg0NiwgMHhGQiwgMHhCRCwgMHhEQiwgMHhBMywgMHhEQiwgMHhDQiwgMHgwQSwKKwkgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgxNywgMHgxOCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzNiwgMHgxNCwgMHgwMCwKKwkgMHhBQywgMHg0QywgMHg4MCwgMHgyQSwgMHgxMSwgMHgwMCwgMHgzMSwgMHg2MCwgMHgxNCwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwQywgMHgxOCwKKwkgMHgzMSwgMHg2MCwgMHgxNiwgMHg3QywgMHhBNCwgMHhEMywgMHgzMSwgMHg2MCwgMHgxMCwgMHg3QywgMHhBNCwgMHhEMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwKKwkgMHhEQywgMHg4NCwgMHgwMiwgMHgwMywgMHhBNCwgMHhEQiwgMHhBRiwgMHgwMSwgMHgzMSwgMHg2MCwgMHgxMCwgMHg3QywgMHgwMCwgMHg2NCwgMHhBNCwgMHhEQiwKKwkgMHg0MSwgMHg0NywgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwRCwgMHgwMCwgMHhGNiwgMHhGRSwgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwKKwkgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwKKwkgMHhBMCwgMHg1RSwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHhGMCwgMHhGRSwgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwKKwkgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhFNSwgMHhGRSwgMHgwMywgMHgwNCwgMHhBOCwgMHg2MCwgMHgyNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNCwgMHhGRSwKKwkgMHgwQSwgMHgwNCwgMHgxRCwgMHhGRiwgMHgwMCwgMHhFQiwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg0MywgMHhGRiwgMHhFNiwgMHhGRSwgMHgwMywgMHgwNSwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHg2MCwgMHg0NiwgMHgwRiwgMHhGMCwgMHg0MCwgMHg0MiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhBNiwgMHg2MCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgxMywgMHhGMiwKKwkgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NywgMHgyQSwgMHhGMiwgMHg0MCwgMHg0NSwgMHg0MCwgMHg0OCwgMHgwNCwgMHgyQiwgMHgxNywgMHgwMCwgMHgxNiwgMHhGMiwKKwkgMHgxRCwgMHhGMiwgMHg0MCwgMHg0MywgMHgwRiwgMHhGMiwgMHg0MCwgMHg0NCwgMHgyNSwgMHg1RSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHg0MCwgMHg0NSwKKwkgMHgwRiwgMHg2NCwgMHgxNCwgMHhGMCwgMHgzNSwgMHhGMiwgMHhBMCwgMHg4MiwgMHgwRiwgMHhCNCwgMHhDQSwgMHg4NSwgMHhENCwgMHg4MCwgMHgxMCwgMHhGMiwKKwkgMHgwMSwgMHgwMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0NywgMHgxMywgMHgwMCwgMHgxNywgMHhGMiwgMHgyQywgMHhGMCwKKwkgMHg0MCwgMHg0MywgMHgxQiwgMHhGMiwgMHgxRCwgMHhGQSwgMHg0MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhBQiwgMHhGQywKKwkgMHgwNSwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgxMSwgMHhGMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHhCRiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHhGRiwgMHhGRiwgMHhBQiwgMHg2MCwgMHg0QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg0NiwKKwkgMHgyQywgMHhGMCwgMHgyNywgMHg0NCwgMHhERiwgMHhCNCwgMHg0MCwgMHg0NywgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNSwgMHgwMCwgMHhENCwgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHgxQiwgMHgwMCwgMHgyQSwgMHhGMCwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNCwgMHg2NSwgMHgyNywgMHg0NCwgMHgzNCwgMHg4NywKKwkgMHgzNiwgMHhGMywgMHhCNCwgMHhGRiwgMHg2MCwgMHg1QiwgMHg0RCwgMHhFMiwgMHgwNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwKKwkgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNSwgMHgwMCwgMHhENCwgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHgyQiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHgwNiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMiwgMHg0NiwgMHgwMSwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhCQSwgMHg2MCwgMHhGMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCNSwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwKKwkgMHgzRiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMywgMHgwMCwgMHg2NywgMHg0QywgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwMiwgMHhFMSwgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHhDNCwgMHhFMiwgMHgwOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhGMCwgMHhGRSwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHg2MSwgMHg0NSwKKwkgMHhENCwgMHg5RSwgMHgyMSwgMHg0NiwgMHgxNiwgMHhGQSwgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHhCNSwgMHhGMywgMHgwNiwgMHgwNCwKKwkgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHhCNSwgMHhGOSwgMHgyNSwgMHhGQSwgMHhCNiwgMHhGMywKKwkgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNiwgMHhGQiwgMHgyOCwgMHhGQSwgMHhCNywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNywgMHhGQiwKKwkgMHgyOSwgMHhGQSwgMHgyRCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBNSwgMHg2MCwKKwkgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0MywgMHg4NCwgMHhCQiwgMHhGQywgMHhCMywgMHgyMSwgMHg0NiwgMHgwMSwgMHg1RCwgMHgwRiwgMHhGQywKKwkgMHg1QywgMHg0NiwgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwgMHg1MCwgMHhGRSwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgxMiwgMHgwMCwgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHg2MCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyMiwgMHg0NiwKKwkgMHg2NCwgMHg0MSwgMHgyQywgMHhGMCwgMHgyRCwgMHhGMCwgMHhEMywgMHg4MCwgMHgyRSwgMHhGMCwgMHhEMSwgMHg4MCwgMHhEMCwgMHg4MCwgMHgyNywgMHg0NCwKKwkgMHgwOSwgMHgwQywgMHgwMywgMHgwMCwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhCOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhENCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgwRCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgzMSwgMHg2MCwgMHgxMiwgMHg3QywKKwkgMHg3QywgMHg0NCwgMHhBNCwgMHhEQiwgMHgyMSwgMHg0NiwgMHgxQywgMHhGMiwgMHg3QywgMHhGMSwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwKKwkgMHgwQiwgMHg2NCwgMHg0MCwgMHg0NCwgMHgwMCwgMHg2MywgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwOSwgMHgwMCwKKwkgMHgzMCwgMHhGMywgMHgyNCwgMHg0NSwgMHhENCwgMHg4NCwgMHhDQSwgMHg2NSwgMHhENCwgMHg4MywgMHgzMSwgMHg2MCwgMHgxMiwgMHg3QywgMHgwMSwgMHg2NCwKKwkgMHhBNCwgMHhEQiwgMHhENCwgMHg2NCwgMHgxQSwgMHgwMCwgMHgwRiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHg3MCwgMHg2MywgMHgxQywgMHhGMiwKKwkgMHhDQSwgMHg2NSwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwMywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwKKwkgMHg0MCwgMHg0NCwgMHgyQiwgMHhGMiwgMHhDNCwgMHg4NSwgMHhENCwgMHg4MywgMHhDNCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyRiwgMHhGMCwgMHhCMCwgMHhGMCwKKwkgMHhCMSwgMHhGMiwgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg4NCwgMHg0QywKKwkgMHg4NSwgMHg0QywgMHg4MSwgMHg0QywgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwKKwkgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwgMHhDNCwgMHhFMiwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwgMHg4OSwgMHhGRiwgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwKKwkgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHgyOCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwOCwgMHgwMCwgMHgzMSwgMHg2MCwgMHgxMiwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgxQiwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHhGRSwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHhBNCwgMHg2MCwgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg0MCwKKwkgMHhCNCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg5MCwgMHgwMSwgMHgyOCwgMHg0NCwgMHhENCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBNiwgMHg2MCwgMHg5OCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHhGQiwgMHhCNCwgMHg0MCwgMHg0NywgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywKKwkgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHhGQiwgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgyQSwgMHhGMCwKKwkgMHhGNywgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHhDQywgMHgwMCwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg0MiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHhDMiwgMHgwMCwgMHgwNCwgMHgyQiwgMHhDMCwgMHgwMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMSwgMHgwMCwgMHgwNywgMHhGNCwKKwkgMHg0NywgMHhGMiwgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwgMHhCRSwgMHg2MCwKKwkgMHg3OCwgMHg0NCwgMHgwMiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywKKwkgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgyMiwgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwKKwkgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHgyMiwgMHg0NiwgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwKKwkgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4NSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwKKwkgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywKKwkgMHhERSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywKKwkgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywKKwkgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwKKwkgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwQywgMHhGMCwgMHgwNCwgMHgwMiwKKwkgMHg2NCwgMHg0NiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2NCwgMHgyMiwgMHg0NiwgMHgwMywgMHhGQSwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwKKwkgMHhGQywgMHhBMSwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2MywgMHg2NCwgMHg0NiwKKwkgMHgwMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgwMywgMHhGQywgMHgwMiwgMHgwMCwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgzNSwgMHhGMiwKKwkgMHgwNCwgMHhGOCwgMHhEQywgMHg4NCwgMHgzNSwgMHhGQSwgMHgxNCwgMHhGMiwgMHgwRiwgMHhCNSwgMHgwRiwgMHhCNCwgMHhDQywgMHg4NCwgMHg5NCwgMHg4MCwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgwMSwgMHgwMiwgMHg5NCwgMHg4NCwgMHgyQSwgMHhGQSwgMHg5NSwgMHhGQywgMHgwNiwgMHgwMCwKKwkgMHhDNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgyNywgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHg0OCwgMHhFMiwgMHhBNCwgMHg2MCwgMHgwQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHg2OCwgMHgzQSwgMHgwMywgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMCwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzQywgMHg0NiwgMHgyQSwgMHhGMiwgMHgxMywgMHhGMCwKKwkgMHhBNCwgMHg4NCwgMHhCNCwgMHhCQywgMHg0MCwgMHg0OCwgMHg3QywgMHhGMSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg0NSwgMHhEMCwgMHg4MCwKKwkgMHg3MCwgMHg2MSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwKKwkgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0MCwgMHg0RSwgMHhBMCwgMHg2MywgMHgwQSwgMHg2NCwgMHg2NSwgMHg0MCwgMHgwQSwgMHgzNiwKKwkgMHgwMywgMHgwMCwgMHgzOCwgMHg2MSwgMHgxNCwgMHg2NCwgMHhFQiwgMHg4MywgMHg0MCwgMHg0NSwgMHg0MywgMHg0NCwgMHgwMiwgMHg2MCwgMHg1RSwgMHg2NSwKKwkgMHgyQSwgMHhGMiwgMHgyQiwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgyRSwgMHg0NSwgMHhENCwgMHg4NSwgMHhDNSwgMHg4NCwKKwkgMHgwNSwgMHgwMCwgMHgxQiwgMHhGMCwgMHhDNSwgMHg4NCwgMHhDMCwgMHg4NCwgMHgyRSwgMHg0NSwgMHhDNCwgMHg4NCwgMHg2MCwgMHg0MywgMHgyOCwgMHg0NCwKKwkgMHgwMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg4MCwgMHg0RSwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHg1NiwgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwKKwkgMHg3QSwgMHhENCwgMHg1QywgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4NywgMHg0RiwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg4NywgMHg0QywKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NywgMHgzNiwgMHhGMywgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwKKwkgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHg2MCwgMHg1QiwgMHg0RCwgMHhFMiwgMHhBNCwgMHg2MCwgMHg2QywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwOSwgMHgwMCwgMHhENCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHgyMiwKKwkgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyNiwgMHg0MywgMHgyNSwgMHg0NCwKKwkgMHgwNiwgMHhGQSwgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwgMHhCNSwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywKKwkgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHhCNSwgMHhGOSwgMHgyNSwgMHhGQSwgMHhCNiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwKKwkgMHhCNiwgMHhGQiwgMHgyOCwgMHhGQSwgMHhCNywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNywgMHhGQiwgMHgyOSwgMHhGQSwgMHgyRCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwRSwgMHgwMCwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwKKwkgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgzMCwgMHhGMSwgMHg3NiwgMHgwMCwKKwkgMHhGQywgMHhCMywgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHhDQiwgMHhGRSwgMHhBMywgMHg2MCwKKwkgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgwRiwgMHhGQywgMHgwNSwgMHhGRiwgMHhEQywgMHhGMywKKwkgMHgyOCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgyMiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgxRiwgMHgwMCwgMHgzMiwgMHhGMiwgMHg4MSwgMHhGMSwKKwkgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgxOSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwgMHgxNSwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHgzQywgMHg0NCwgMHgxMiwgMHgwMiwgMHhBQywgMHg4NiwgMHhCQiwgMHhGRSwgMHgwRiwgMHgwMywgMHgyQSwgMHhGMiwgMHgyMSwgMHg0NiwKKwkgMHg2MCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgwQSwgMHgwMCwgMHgwMSwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwKKwkgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHgzMCwgMHhGMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwKKwkgMHgyRCwgMHgwMCwgMHhGQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgyRCwgMHg0NCwgMHgxMCwgMHgyQSwgMHgyNCwgMHgwMCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzQSwKKwkgMHgyMSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwKKwkgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHgxQywgMHg2MCwgMHg5QSwgMHg2MywgMHgxRCwgMHhGMCwgMHhDMCwgMHg2NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEMSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMywgMHhEQiwgMHhBNCwgMHg2MCwKKwkgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwKKwkgMHhBNCwgMHgzQSwgMHgwNCwgMHgwMCwgMHgzOSwgMHhGMSwgMHgyNSwgMHg0NCwgMHgwQSwgMHgzNiwgMHgzOCwgMHhGMSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgwMCwgMHg3QywgMHgyQiwgMHg0NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHgyOCwgMHg0MCwgMHhFNCwgMHgzNiwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHhBMywgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHhBRSwgMHg0RiwKKwkgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhFNywgMHgwMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwgMHgwOSwgMHgwMCwgMHhCQSwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHgzQywgMHg0NiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwKKwkgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGNCwgMHgwMSwKKwkgMHhGMywgMHgwQSwgMHg3QywgMHg1MCwgMHg2RCwgMHhFMiwgMHhGMCwgMHgwMSwgMHg3MiwgMHg0NSwgMHhEQywgMHg4NCwgMHhCNSwgMHhGQiwgMHgxMSwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhCNiwgMHhGMywgMHgwNiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNiwgMHhGQiwgMHhCNywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwKKwkgMHhCNywgMHhGQiwgMHhBMywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgxMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgxRSwgMHg2MCwKKwkgMHhGRSwgMHg2MywgMHhCRCwgMHhEMywgMHg3MiwgMHg0NSwgMHg0NCwgMHg4QSwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwKKwkgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwgMHhCRCwgMHhEMywgMHhCNSwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwKKwkgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhDNCwgMHg4NCwgMHg2MCwgMHg1NSwgMHgyQSwgMHg1MiwgMHhCNSwgMHhGQiwgMHgwMiwgMHgyNCwKKwkgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHhCNiwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwKKwkgMHhDNCwgMHg4NCwgMHhCNiwgMHhGQiwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHhCNywgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwKKwkgMHhDNCwgMHg4NCwgMHhCNywgMHhGQiwgMHhBMywgMHg2MCwgMHhFRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwgMHgwNCwgMHgwQSwgMHhBRSwgMHg0RiwKKwkgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgwOSwgMHgwMCwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwKKwkgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHg5RiwgMHgwMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNSwKKwkgMHgwOSwgMHgwMCwgMHgwNCwgMHgyNSwgMHgwMywgMHgwMCwgMHg0NywgMHhGRiwgMHgzMiwgMHg3NCwgMHg5NiwgMHgwMSwgMHhDNCwgMHhFMiwgMHhBQiwgMHg2MCwKKwkgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0QywgMHg0RSwgMHg0NywgMHhGRiwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgzMiwgMHg3NCwgMHhDRCwgMHhFMiwgMHhBOCwgMHg2MCwKKwkgMHg4QSwgMHg3OCwgMHgwMCwgMHg2MSwgMHgxMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg2MCwKKwkgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHg0RCwgMHgyNiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgwQywgMHgwMCwgMHgzRSwgMHg0NiwgMHgwOSwgMHhGMiwKKwkgMHgxRSwgMHg0MSwgMHgwMywgMHgxQiwgMHhBQSwgMHg2MCwgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg1RSwgMHhGRCwgMHhGQiwgMHgyMSwgMHg0NCwKKwkgMHgwMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHg0MSwgMHg1RCwgMHgyMSwgMHg0NiwgMHgwMCwgMHhGMiwgMHg0NiwgMHg0NSwgMHg4NywgMHhGQywgMHg0QywgMHhFMiwKKwkgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwRSwgMHhFMSwgMHgwMywgMHhFMSwgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMCwgMHgwMCwKKwkgMHgyMSwgMHg2OSwgMHhCNiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg1RSwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHg2MCwgMHg1QywgMHgyMCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHg2OCwgMHg0MywgMHgyNiwgMHhGQywgMHgyMiwgMHg2OSwgMHg2NCwgMHg0NCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg1RiwKKwkgMHg2MCwgMHg0MywgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2OCwgMHg1RiwgMHgyNiwgMHhGQSwgMHgzQSwgMHg2OSwgMHgxRCwgMHhGQywgMHgyRSwgMHg0NCwKKwkgMHgzNiwgMHhGMSwgMHgxQywgMHhGQSwgMHhDMywgMHg5NCwgMHhDRCwgMHhFMiwgMHgyRSwgMHg0NCwgMHgxNCwgMHgzNiwgMHgxMiwgMHgwMCwgMHgwQSwgMHgzNiwKKwkgMHgwRiwgMHgwMCwgMHg2MywgMHg0NSwgMHhFMywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhGRiwgMHhGRiwKKwkgMHgzNywgMHgzNiwgMHgwNSwgMHgwMCwgMHg2RSwgMHgzNiwgMHgwNCwgMHgwMCwgMHhBQSwgMHg2MCwgMHhGMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNywgMHhDRiwgMHg4MywgMHgxQiwgMHhGQywgMHgwMSwgMHg2NCwKKwkgMHg1MSwgMHhGQiwgMHhBMSwgMHhGRiwgMHgxQywgMHhGMiwgMHgyOSwgMHg0MSwgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHg2OCwgMHg1RiwKKwkgMHgyNywgMHhGQSwgMHg2QywgMHg0MCwgMHgwMywgMHgxNSwgMHhBQiwgMHg2MCwgMHgwNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4OCwgMHg2MCwgMHg4NSwgMHg3MSwKKwkgMHg4RCwgMHhFMiwgMHhCOSwgMHhGMSwgMHhGQywgMHhBMywgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwNCwgMHhBQSwgMHg2MCwgMHhGQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHg0QywgMHgwMCwgMHg5QSwgMHhGRiwgMHgyMywgMHg0MywgMHgxOCwgMHg2MSwgMHhBMSwgMHhGRiwKKwkgMHg4QywgMHg0NCwgMHhDQiwgMHg4MywgMHgyQSwgMHhGQSwgMHg0MCwgMHg0OCwgMHg0MCwgMHgyNywgMHgwNCwgMHhBMSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwKKwkgMHgwMSwgMHgwMCwgMHgwNiwgMHhBMSwgMHg4OCwgMHhCMCwgMHg4OCwgMHgzNiwgMHhEOSwgMHg4MSwgMHg2MiwgMHg0NSwgMHgyMywgMHg0NCwgMHg1NCwgMHg5NCwKKwkgMHgyOCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHhDOSwgMHg4MSwgMHg2NSwgMHg0MiwgMHg3QSwgMHhEQywgMHgwMCwgMHhCOSwKKwkgMHhGRCwgMHgxQywgMHgwMCwgMHhGNCwgMHg2RSwgMHg2MSwgMHgxMCwgMHg2MiwgMHgxNCwgMHgwMiwgMHgwNSwgMHgxRCwgMHgxMiwgMHgxRSwgMHgwQywgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHg3QywgMHg2MSwgMHgwMiwgMHg2MiwgMHg3QSwgMHhEQywgMHg2MywgMHg0MCwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwKKwkgMHgwOCwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4MSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHhBMSwgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHg4NCwgMHhCQywgMHgwMSwgMHgxNSwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0NiwgMHhBMSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMSwgMHgwMSwgMHgwMCwgMHhGRCwgMHgxRiwgMHhBQSwgMHg2MCwgMHg2RSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg5QSwgMHhGRiwgMHg1NCwgMHg2MywgMHgxMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHgwMCwgMHg2NCwgMHgwRiwgMHhGQSwgMHhBMSwgMHhGRiwgMHhFQiwgMHhGMSwKKwkgMHgxMiwgMHg2MSwgMHg1MCwgMHhGRSwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwQiwgMHgwMCwgMHg4QywgMHg0NSwgMHg5OCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGQSwgMHgzQywgMHhGQSwgMHgzRCwgMHhGQSwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMSwgMHgwMCwgMHg4QywgMHg0NCwgMHhFQywgMHhGMCwgMHhCRCwgMHhEQSwgMHg0MCwgMHg0OCwKKwkgMHgwNCwgMHgyNiwgMHg0MCwgMHgwMCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHgzMCwgMHhGQiwgMHg2QywgMHg0NCwgMHhCRCwgMHhEQSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHgyNCwgMHgwMCwgMHhEMCwgMHg4MCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg2QywgMHg1QywgMHhGMiwgMHhGRSwKKwkgMHhCRCwgMHhEQSwgMHhFRCwgMHhGMywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEOCwgMHgyRCwgMHg0NCwgMHgxNSwgMHgwQywgMHgzMiwgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg0MiwgMHgwQywgMHhCMiwgMHgwOCwgMHgzQSwgMHgwMywgMHgwMCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0RCwKKwkgMHg0RCwgMHgwMCwgMHgwMywgMHgwQSwgMHhBQiwgMHg2MCwgMHgwOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMSwgMHhCQywgMHg0MCwgMHg0RCwgMHgyOCwgMHg0NSwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHgyNCwgMHg4OCwgMHg0MiwgMHgwMCwgMHgzMCwgMHhCQywgMHg0MCwgMHg0RCwgMHgzRiwgMHgwMCwgMHgyMCwgMHhCOSwKKwkgMHg1QywgMHg4RSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEQywgMHg5QywgMHg2QywgMHg0NCwgMHhGMiwgMHhGRSwgMHhCRCwgMHhEQSwKKwkgMHgwOCwgMHgyOCwgMHg0NCwgMHg0RSwgMHhEQywgMHg4NCwgMHgyRSwgMHg1QywgMHhCMCwgMHg4NCwgMHhFRiwgMHhCMSwgMHgwOCwgMHgyNCwgMHg0MCwgMHhCOSwKKwkgMHg0MSwgMHg0NiwgMHgyQywgMHgwMCwgMHg4QywgMHg0NCwgMHgwNCwgMHg2MSwgMHhCRCwgMHhEQSwgMHg1MCwgMHhGRSwgMHg4MCwgMHgyNywgMHgwMCwgMHg2NCwKKwkgMHgzMCwgMHhGQiwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHg4QywgMHg0NCwgMHhCRCwgMHhEQSwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NSwKKwkgMHg4QywgMHg0NCwgMHhFRCwgMHhGMSwgMHhCRCwgMHhEQSwgMHhEMCwgMHg4MCwgMHgyOCwgMHg0NCwgMHgwMywgMHgwQywgMHhBMCwgMHgyQSwgMHgwQSwgMHgwMCwKKwkgMHgxMSwgMHgwMCwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHhENCwgMHgzQSwgMHgwOCwgMHgwMCwgMHgyNywgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgzMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHg0NiwgMHg0RSwgMHgzNSwgMHg4RCwgMHg1RiwgMHgwMCwgMHg0MCwgMHgyNiwKKwkgMHhGOSwgMHgwMSwgMHgzMCwgMHg2NSwgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywgMHg5RCwgMHhEQywgMHhGNCwgMHgwMSwgMHgwMCwgMHhFMSwgMHgyMywgMHg0MywKKwkgMHhFOCwgMHhBMywgMHg2QSwgMHg2MiwgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwgMHg4OCwgMHgyQSwgMHgwMywgMHgwMCwgMHg3MCwgMHg2MiwgMHg3QSwgMHhEQywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHgyQiwgMHgxMywgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhEQywgMHgwNCwgMHhFNiwgMHg3QSwgMHhEQywgMHgzQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhGQywgMHhBMywgMHgyNSwgMHhGRiwgMHgzRiwgMHhGQywgMHgwNCwgMHhBMywgMHhCMCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgzRiwgMHhGQywgMHhDRiwgMHg4MywKKwkgMHhERiwgMHg4MywgMHgwNCwgMHgwMiwgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgxRiwgMHgwMCwgMHgyNywgMHgwMywgMHhDQiwgMHg4MywKKwkgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwRSwgMHhBMywgMHhBNywgMHg4NCwgMHhGMiwgMHhBMywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwKKwkgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHgwMywgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHgwQSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwKKwkgMHhBNywgMHg4NCwgMHg3QSwgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHhGOSwgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhGNiwgMHgwMywKKwkgMHhGRiwgMHhCMSwgMHgwQywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBMSwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwKKwkgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHgwMCwgMHhFNiwKKwkgMHg3QywgMHg0NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQywgMHhFMSwgMHg4MywgMHhFMSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg0NiwgMHg0NSwKKwkgMHhBMSwgMHhGRiwgMHgxNCwgMHg2MywgMHgwMSwgMHgxMCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgwQSwgMHg2NCwgMHg2MCwgMHg1NCwKKwkgMHg0NywgMHhGRiwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwgMHg2QSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMSwgMHgxNSwgMHgyOSwgMHgwMCwKKwkgMHg2QywgMHg0MCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyNiwgMHgxNSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwRiwgMHgwMCwgMHgyRCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwQywgMHgwMCwgMHgyQiwgMHg0NCwgMHhBQywgMHg4MCwgMHgyOCwgMHg0MCwKKwkgMHhCNCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMywgMHgzMCwgMHhGQiwgMHgwNCwgMHgwMCwgMHgyQiwgMHg1MCwgMHhBNCwgMHg2MCwgMHg4NSwgMHg3OCwKKwkgMHgwNCwgMHhFMSwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMSwgMHgyNiwgMHg0NCwgMHg2NCwgMHg1NCwgMHhDRCwgMHhFMiwgMHg4NCwgMHhCQywKKwkgMHgyRCwgMHg0MCwgMHgwQywgMHgyMiwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHgyMywgMHg2NCwgMHgzQSwgMHhEQiwgMHhBNywgMHg2MCwgMHgxOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGRiwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHgzNywgMHhGMywKKwkgMHgyQiwgMHg0NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyOCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg1MCwgMHhBMCwgMHg0QywgMHgyMCwgMHhCQywKKwkgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzNSwgMHhGMSwgMHg3NCwgMHg0NCwgMHhDMCwgMHg5NCwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxOCwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHhCNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgzNiwgMHgxMSwgMHgwMCwgMHgyNiwgMHg0MywKKwkgMHhGRCwgMHhCMywgMHgwNCwgMHhCQiwgMHg0MywgMHg0NiwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0NywgMHg0MCwgMHhCRiwgMHg0MCwgMHg0OCwKKwkgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHgwMCwgMHg2NCwgMHgzMCwgMHhGQiwgMHgwNSwgMHhGRiwgMHhDNiwgMHgwMSwKKwkgMHgyNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwNiwgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHhBMywgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHhGRiwgMHg0OCwgMHhFMiwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyNiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxOCwgMHgwMCwKKwkgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwRSwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHhBNywgMHg2MCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg1QywgMHg0MSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgwMiwgMHgwMCwgMHgyOSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4NywgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHgxMSwgMHgwMCwgMHgyNywgMHg2MCwgMHhBNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhGMSwgMHgwMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyMSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg2QywgMHg0MCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgzMiwgMHg3NCwgMHg0MCwgMHg2MywKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg2OCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgwMCwgMHhBNywgMHg2QSwgMHgyMiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwMywgMHg2MCwgMHhDOSwgMHg2MywgMHgwMSwgMHgxMSwgMHgwMiwgMHgwMCwgMHg2QywgMHg0MCwgMHhGQywgMHgxRiwgMHg2QywgMHg0MCwgMHhCNSwgMHhGRiwKKwkgMHg2QywgMHg0MCwgMHhCQywgMHhGRiwgMHg2QywgMHg0MCwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHg0OCwgMHg2MCwgMHgyRCwgMHg3RCwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2QiwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgwMywgMHgwQSwgMHhBMywgMHg2MCwgMHg0QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHg1MSwgMHhGQiwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwKKwkgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNiwgMHgwMCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHg0OCwgMHhFMiwgMHgyNywgMHg2NCwgMHgzQSwgMHhEQiwgMHhCMywgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg1NCwgMHg2MiwgMHgyMiwgMHg0NiwgMHhBMiwgMHhEMCwgMHgxNiwgMHg2MywgMHg3QywgMHg0MSwgMHg0NCwgMHg0OCwKKwkgMHg4MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHg0MSwgMHg0RSwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwKKwkgMHgwRSwgMHg2MywgMHgxQywgMHg2MCwgMHg5QywgMHg2MiwgMHhBMiwgMHhEMSwgMHgyNCwgMHg0NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5QSwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgxOCwgMHhGMiwgMHhBQSwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHhCNCwgMHg4NCwgMHgwOCwgMHgzNiwgMHgyQSwgMHhGQSwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0MCwgMHg4MCwgMHg0RSwKKwkgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxRCwgMHg3OCwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg2QSwgMHg0MCwgMHg3MCwgMHg2MiwgMHgyOCwgMHg0NCwgMHg4OCwgMHhCMCwKKwkgMHg4OCwgMHgzNiwgMHg3QSwgMHhENCwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwQiwgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwKKwkgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg3QSwgMHhENCwgMHg3QSwgMHhENCwgMHg0NiwgMHgwMCwKKwkgMHgyMywgMHg0MywgMHhDRiwgMHg4MywgMHhERiwgMHg4MywgMHgwMiwgMHgwMywgMHg1NSwgMHgwMywgMHgwNCwgMHgwMCwgMHgwMywgMHhGMCwgMHgwNCwgMHhGNCwKKwkgMHg2NCwgMHg0MiwgMHgzNywgMHgwMCwgMHgyRSwgMHg0MCwgMHgwNCwgMHgyQSwgMHgyMSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgwMiwgMHhGRSwgMHgxMCwgMHgyNSwKKwkgMHg0MiwgMHhGRSwgMHg3MiwgMHg0NSwgMHg2NSwgMHg0QywgMHhCNSwgMHhGMywgMHgwMywgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg4NCwgMHhCNSwgMHhGQiwKKwkgMHhBMSwgMHhGRiwgMHg4MCwgMHg0QywgMHhCNiwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNiwgMHhGQiwgMHg4MCwgMHg0QywgMHhCNywgMHhGMywKKwkgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNywgMHhGQiwgMHg4MCwgMHg0QywgMHg1QywgMHg0RSwgMHhGOCwgMHhBMywgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwKKwkgMHgwNCwgMHhGNCwgMHhGRiwgMHhCMSwgMHhGOCwgMHhBMSwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MiwgMHgwOSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwKKwkgMHgwNCwgMHhGNCwgMHhDOCwgMHg4MiwgMHhGRiwgMHhCMSwgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhCMSwgMHg3QSwgMHhENCwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgxNywgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwKKwkgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhBMSwgMHhGRiwgMHgwOSwgMHg3NCwgMHg4MCwgMHg0RCwgMHgwRSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwKKwkgMHgwNCwgMHhGNCwgMHgyMywgMHg0MywgMHhBMSwgMHhGRiwgMHhBMCwgMHhEMiwgMHhGRSwgMHhBMSwgMHhDQiwgMHg4MywgMHg4MCwgMHg0RSwgMHhBRiwgMHg4MywKKwkgMHgwMiwgMHgxRCwgMHgwMiwgMHgwMywgMHhFRCwgMHgwMSwgMHhFMywgMHgwMSwgMHhBMSwgMHhGRiwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMiwgMHgwMCwKKwkgMHg5QywgMHg0RSwgMHg5QywgMHg0QywgMHhBMSwgMHhGRiwgMHhEQSwgMHg4MywgMHg2NiwgMHg0NCwgMHgyMiwgMHg0NiwgMHgwQywgMHhGQSwgMHgwQiwgMHhGQywKKwkgMHg4NywgMHg0RiwgMHg4NywgMHg0QywgMHg4NywgMHg0RiwgMHg4NywgMHg0RCwgMHg4NywgMHg0QywgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwKKwkgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHg4NywgMHg0QywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHhCQywgMHhGRiwKKwkgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgwQywgMHg3NCwgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzNSwgMHhGMywgMHhDNCwgMHhFMiwgMHg2MCwgMHg1NCwKKwkgMHg4OSwgMHhGRiwgMHgxMywgMHg3NCwgMHg4OCwgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHgzNCwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgwNiwgMHhFMSwgMHg0NywgMHhGRiwgMHhBNCwgMHg2MCwgMHg0NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHg2MSwgMHg3RiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgyNiwgMHgwMiwgMHg5OCwgMHhGRSwgMHgxQSwgMHgwNSwgMHgyNCwgMHg2MCwKKwkgMHg1MiwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwKKwkgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NywKKwkgMHgwQSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGQSwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywgMHgwMywgMHgwNSwKKwkgMHg0NSwgMHg0MCwgMHgwMCwgMHg2NywgMHhEOCwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwQSwgMHg3RSwgMHgwNCwgMHhGQiwgMHg2MSwgMHg1NSwKKwkgMHg0QSwgMHgwMCwgMHgyOCwgMHhGQiwgMHgwMSwgMHhGMywgMHgyOSwgMHhGQiwgMHg0NCwgMHg0NiwgMHg0MCwgMHg0NSwgMHgxMCwgMHg2MSwgMHg3RSwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgzMSwgMHgwMiwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2RiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywgMHgwMywgMHg2MywgMHgyQSwgMHgwMiwgMHgyNiwgMHg0MCwgMHgwMSwgMHgyQiwgMHgyNCwgMHgwMCwgMHg5OCwgMHhGRSwKKwkgMHgxOSwgMHgwNSwgMHgyNCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhENSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwKKwkgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywKKwkgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwKKwkgMHgwRSwgMHhGQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGQSwgMHhBMCwgMHg3RiwgMHg2NywgMHgwNywgMHg2MywKKwkgMHgwNSwgMHgwNSwgMHg0NSwgMHg0MCwgMHhEOCwgMHhGRSwgMHgwMCwgMHg2NywgMHhEMCwgMHhGRSwgMHhEOSwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwKKwkgMHgwQiwgMHg3RSwgMHgwNCwgMHhGQiwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwgMHg4MCwgMHhCQywKKwkgMHgwOCwgMHgyOCwgMHhBMywgMHhEQiwgMHg2MSwgMHg1NSwgMHg2MywgMHgwMCwgMHgwNCwgMHhCNSwgMHg4MiwgMHhCNSwgMHgyNSwgMHgwMiwgMHgwNCwgMHgwMywKKwkgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHhBMywgMHhEMywgMHg5OSwgMHhGRSwgMHgwNCwgMHgwNCwgMHgwMiwgMHhCQywgMHhGRSwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHg1NiwgMHgwMCwgMHhEQywgMHhGMywgMHgyMCwgMHg0MCwgMHg4MCwgMHgyNiwgMHg1MiwgMHgwMCwgMHhBMywgMHhEMywgMHhGRiwgMHhBMCwKKwkgMHhGOCwgMHhCNCwgMHgwMiwgMHgwMiwgMHhBMywgMHhEQiwgMHgxQywgMHgwMCwgMHgwNCwgMHhCQywgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgwOCwgMHhCMCwKKwkgMHgwMSwgMHg2NCwgMHgwOCwgMHgyNCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhGQiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhEMCwgMHhGRSwKKwkgMHgzRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgzQywgMHgwMCwgMHg0MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMiwgMHhGOCwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHgwOCwgMHhCNSwgMHgwNywgMHg3QywgMHgwMSwgMHgwMiwgMHhEQywgMHhGOSwgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwKKwkgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCNSwgMHgwNywgMHhCNSwgMHgwOCwgMHgyOCwgMHhDNCwgMHgwMiwKKwkgMHg5OSwgMHhGRSwgMHgyNiwgMHgwNSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyMywgMHgwMCwgMHgyMCwgMHgyQSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgyQSwKKwkgMHgxRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgwOSwgMHgwMCwgMHhBOCwgMHhGRiwgMHgyMCwgMHg0NCwgMHg5OSwgMHhGRSwgMHgwMiwgMHgwNSwKKwkgMHg4MCwgMHgyQSwgMHgwMywgMHgwMCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgxMywgMHgwMCwgMHgwMCwgMHhGMSwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwQSwgMHgzNiwgMHgyOSwgMHgwMSwgMHgwQiwgMHgzNiwgMHg1QSwgMHgwMSwgMHgyOCwgMHhGQiwKKwkgMHgwMSwgMHhGMSwgMHgyOSwgMHhGOSwgMHgwMiwgMHhGMSwgMHgyQSwgMHhGOSwgMHgwMywgMHhGMSwgMHgyQiwgMHhGOSwgMHhEMCwgMHhGRSwgMHhBRSwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHgzRSwgMHg3NSwgMHg0NCwgMHgwMiwgMHhCMCwgMHgwMSwgMHhCMCwgMHgyOSwgMHgwMiwgMHhEQywgMHgwMiwKKwkgMHgwNCwgMHhCMCwgMHgwOCwgMHhCMCwgMHgwQiwgMHgwMiwgMHgyMCwgMHgwMiwgMHg0MCwgMHgyNiwgMHhBNywgMHhGRiwgMHg4QywgMHhGRiwgMHg3NSwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgwMSwgMHgwMCwgMHhBQiwgMHhGRiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFQSwgMHgwMSwgMHgwQSwgMHhGMywgMHhBQSwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg2MCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwgMHhDMCwgMHg2MCwKKwkgMHgwMCwgMHg3QywgMHhBMCwgMHg4NCwgMHg4MCwgMHgzQiwgMHgwMiwgMHgwMCwgMHhDMCwgMHg2NywgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHg2NywgMHgwQSwgMHhGQiwgMHhENSwgMHgwMSwgMHhENCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgzOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEMCwgMHgwMSwKKwkgMHg3OSwgMHg2MywgMHhGRiwgMHhGRiwgMHhGRiwgMHgxRiwgMHhBOSwgMHhGRiwgMHg3NywgMHg0NCwgMHg2MCwgMHg1NywgMHgxMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg0MCwgMHg0QSwgMHgwMSwgMHgyQSwgMHgxQywgMHgwMCwgMHgyNCwgMHg0NCwgMHhBQywgMHg4NiwgMHgwOCwgMHhGMiwgMHgxOCwgMHgwMywgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg2NSwgMHhENCwgMHg4MCwgMHgwRSwgMHhGMiwgMHgwMiwgMHgwMywgMHhBNSwgMHhENSwgMHgwNCwgMHgwMCwgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwKKwkgMHgwOSwgMHhGNCwgMHhEMSwgMHhGRSwgMHg0NiwgMHg0NCwgMHgwQiwgMHgxOCwgMHg2NiwgMHg0NCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NywgMHgyMCwgMHhCRiwKKwkgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwgMHgwMSwgMHg3NSwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHgyQSwgMHg0NCwKKwkgMHgwOCwgMHgyQSwgMHgxOCwgMHgwMCwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHg1QywgMHg0MywgMHgxNCwgMHgwMywgMHgyNCwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHhBMiwgMHhENSwgMHgwMSwgMHgwMCwgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwgMHgwRCwgMHgxOCwgMHgwOCwgMHhCMCwgMHgxOCwgMHhBQywgMHhGQSwgMHgwMywKKwkgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgxMSwgMHhGRCwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgwNiwgMHgyMiwgMHgyRCwgMHgwMCwgMHgyMiwgMHg0NCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRSwgMHhGMiwgMHgyOCwgMHgwMywgMHgxMCwgMHhCMCwgMHgwMSwgMHhCQywgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyMiwgMHgwMCwKKwkgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgyNCwgMHg2MCwgMHg0QywgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg4NCwgMHgwMCwgMHg0NiwgMHg0MiwKKwkgMHgxOSwgMHgwMiwgMHgyMiwgMHg0NywgMHg0MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMiwgMHg2NiwgMHg0MywKKwkgMHgwMCwgMHhBOCwgMHgwRSwgMHhGMiwgMHgwOCwgMHgwMiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHhFNCwgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwMiwgMHg3NSwgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHhEQywgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwNCwgMHg3NSwgMHgyQSwgMHg0NCwgMHg4MCwgMHgyQSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg0NCwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwKKwkgMHg1QSwgMHgwMCwgMHg0NiwgMHg0MSwgMHgwQiwgMHgwMiwgMHgyMSwgMHg0NywgMHgxMCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwKKwkgMHgwRSwgMHhGMiwgMHg2NiwgMHg0MywgMHgwOCwgMHhGRCwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHg4MCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgxMCwgMHhCMCwKKwkgMHgyMCwgMHg0NCwgMHgxNSwgMHgwMywgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhCMCwgMHg4MCwgMHhCMCwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHg0MCwgMHhCQywgMHg3RiwgMHhCNCwgMHgwNCwgMHhCMCwgMHhBMywgMHhEQiwKKwkgMHgwMywgMHgwMywgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHhBQywgMHg2MCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHg0MCwKKwkgMHgwOCwgMHgyQiwgMHgwMSwgMHgwMCwgMHgxMCwgMHhGRiwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOCwgMHhGRSwgMHgxNCwgMHgwNSwKKwkgMHhFQSwgMHhGRSwgMHgyNCwgMHgwNSwgMHhFOSwgMHhGRSwgMHgxQywgMHgwNSwgMHhFNywgMHhGRSwgMHgwOSwgMHgwNSwgMHg0NywgMHhGRiwgMHgyMCwgMHg0NCwKKwkgMHgwRiwgMHgyMiwgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg0MCwgMHg0MCwgMHgwRiwgMHgyMiwgMHhCOCwgMHhGRSwgMHhFQywgMHgwMSwgMHgyMywgMHg0MSwKKwkgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhFOCwgMHgwMiwgMHg2QSwgMHgwMSwgMHgyNCwgMHg0MSwgMHgwMCwgMHhCOSwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NSwKKwkgMHg0NSwgMHg0NywgMHhFMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgwRiwgMHgwMCwgMHhERSwgMHgwMiwgMHg1QywgMHg0QSwgMHg0NiwgMHg0NCwgMHg0QywgMHgwMSwKKwkgMHgyMiwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHgwOCwgMHgyNCwgMHg3RCwgMHgwMSwgMHhENSwgMHgwMSwgMHgyMSwgMHg0MSwgMHgwMCwgMHhCOSwKKwkgMHg1QywgMHg0QSwgMHhBMiwgMHgwMywgMHhEMCwgMHgwMSwgMHgyNywgMHhEMywgMHgwMywgMHgwMCwgMHgxMCwgMHhCMCwgMHgwOSwgMHhGMiwgMHgwNCwgMHgwMywKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwOCwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMywgMHgwRiwgMHg2MCwKKwkgMHhGRSwgMHg2NSwgMHgwQywgMHhGMywgMHgyNCwgMHg4NiwgMHgyNCwgMHg0NiwgMHg2MCwgMHg0MCwgMHhGQiwgMHgzQiwgMHgwNywgMHgwMCwgMHg4MCwgMHgyNiwKKwkgMHgwMiwgMHgwMCwgMHgyMywgMHg0NiwgMHgwMywgMHg0QywgMHg0NiwgMHg2MSwgMHgzQSwgMHg2NSwgMHgwQywgMHgwMCwgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwKKwkgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwgMHgzOSwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwKKwkgMHg0NSwgMHgwMCwgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwKKwkgMHgwRSwgMHhGQiwgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHhBQywgMHhGRiwKKwkgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRiwgMHgwRiwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgyNCwgMHg4NiwKKwkgMHgwRCwgMHhGMywgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwKKwkgMHgxNiwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHgyMiwgMHgwMCwgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwKKwkgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRiwgMHhGQiwgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwKKwkgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHg4RCwgMHhGRiwgMHhBRCwgMHhGRiwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwKKwkgMHhBQSwgMHhGMSwgMHhBQiwgMHhGMSwgMHhEMCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNywgMHgwNCwgMHgwMSwgMHgwNiwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwKKwkgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHhBMCwgMHg4NSwgMHg5NCwgMHg4MCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgyNiwgMHg0MSwKKwkgMHg0NiwgMHg2MywgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwgMHhENSwgMHg4MSwgMHgwMCwgMHhGMiwgMHgwNSwgMHgwNCwgMHgwNCwgMHg2MywKKwkgMHg2MCwgMHg0NiwgMHhGNywgMHgxQiwgMHg0MiwgMHhGRSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0NCwgMHhDNSwgMHg4MSwgMHg2MywgMHg0NSwgMHhDNSwgMHg4MSwKKwkgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHgwMSwgMHhGMiwgMHhGMCwgMHg4NSwgMHhGMCwgMHg4MCwgMHg2NSwgMHg0NCwgMHhGOCwgMHg4NSwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNywgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwOCwgMHhGRSwgMHgxNywgMHgwMCwgMHhBQywgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwgMHgwMCwgMHhCNCwgMHgxMiwgMHgwNiwgMHgwOSwgMHg2MCwKKwkgMHgwOCwgMHg2MSwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgwNiwgMHgwMywgMHgyQSwgMHg0MywgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgyQSwgMHg0MywgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHgwNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHgwRCwgMHgwMCwgMHgyNCwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNiwgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBRCwgMHhGMywgMHg3QywgMHg2MywgMHgwMCwgMHhCRSwgMHg0MCwgMHg0NSwKKwkgMHgxQSwgMHgwMywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NCwgMHhEQywgMHg4NSwgMHg4NCwgMHhBMSwgMHgwMCwgMHhGMiwgMHgwNiwgMHgwNiwgMHgwMSwgMHhGQywKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhGNywgMHgwMiwgMHg0MCwgMHg0NSwgMHgwRSwgMHgwMCwgMHhBQywgMHhGMywgMHgwMCwgMHg2MywgMHhENCwgMHg4NCwKKwkgMHhBQywgMHhGQiwgMHg4MCwgMHg2MCwgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHhGMCwgMHgwMCwgMHhGQywgMHhEMywgMHg4MCwgMHhBRCwgMHhGOSwKKwkgMHgwMiwgMHgwMiwgMHhBRSwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyNSwgMHg0NiwgMHgwNSwgMHhGQSwKKwkgMHgwNiwgMHhGQSwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHgwMiwgMHhGQywgMHhCMCwgMHg4NCwgMHgzQSwgMHg3RSwgMHgwMSwgMHhGQSwgMHgxMiwgMHg2NCwKKwkgMHgwMywgMHhGQSwgMHgwMCwgMHhGMCwgMHgwNCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgwQywgMHg2MSwgMHgxMCwgMHg2MywgMHg1OSwgMHhEQSwgMHhGRSwgMHgxRiwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwKKwkgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhCRSwgMHhEMiwKKwkgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHhGQSwKKwkgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwNywgMHg0QiwgMHgwQywgMHgwMywgMHg1OCwgMHg0RiwgMHgzMywgMHgwMCwgMHgwQiwgMHg0NywgMHgyNCwgMHg2MCwgMHg1RSwgMHg2NSwKKwkgMHgyNywgMHg0NCwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMiwgMHgwRiwgMHhGQSwgMHg1OCwgMHg0RiwgMHhEMywgMHgwMSwgMHg3MCwgMHgwMCwKKwkgMHgyNSwgMHg0MywgMHhFMywgMHg4NCwgMHg3QywgMHg0MSwgMHgwMiwgMHgwNCwgMHhFOCwgMHg4MSwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhBMywgMHhEMiwKKwkgMHgwMCwgMHg3QywgMHg0MCwgMHg0NSwgMHhCRiwgMHhEOCwgMHhBMywgMHhEOCwgMHhCRSwgMHhEOCwgMHgyNywgMHg0MiwgMHg1QSwgMHhEMywgMHgyNSwgMHg1QywKKwkgMHg2MCwgMHg0MSwgMHgwMiwgMHgxQiwgMHgyNywgMHhEOSwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyNSwgMHg0NCwKKwkgMHgwOSwgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNywgMHg0MywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwOSwgMHhGMiwgMHgwOCwgMHhGQywgMHgwMCwgMHhBOCwKKwkgMHhERCwgMHg4MSwgMHhGQSwgMHgwMiwgMHhCRiwgMHhEMSwgMHg2NiwgMHg0NCwgMHhCRSwgMHhEQiwgMHhDMSwgMHg4NCwgMHhCRiwgMHhEQiwgMHg0OCwgMHgwMCwKKwkgMHgyNSwgMHg0NiwgMHhFNCwgMHg2MywgMHgwOCwgMHhGMiwgMHg4OSwgMHhGMiwgMHgxRSwgMHgxOCwgMHg0MCwgMHg0NywgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHgwMiwgMHgwNSwgMHhFOCwgMHg4MywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NiwgMHhCRiwgMHhEMiwgMHg2MSwgMHg1QywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHgyNSwgMHg0NiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NiwgMHgwOCwgMHgyNCwgMHhCRSwgMHhEQSwgMHgwMiwgMHgxQiwgMHhBMywgMHhEOCwKKwkgMHgwMiwgMHgwMCwgMHg2MCwgMHg0NiwgMHg4OSwgMHhGQSwgMHgwMCwgMHhCOSwgMHg2MSwgMHg0NiwgMHgwOCwgMHgyOCwgMHgwQSwgMHhGQSwgMHgyNSwgMHg0NiwKKwkgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywgMHg4OCwgMHhGQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgyOCwgMHg2NSwgMHgyNSwgMHg0MywKKwkgMHhBRSwgMHhGMywgMHhBRiwgMHg4MywgMHgwMCwgMHhCRSwgMHgxOCwgMHgwMywgMHgwMiwgMHgwMywgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHhBRCwgMHhGRCwKKwkgMHg2MywgMHg0NiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHgwMCwgMHhGMiwgMHgwNywgMHgwMiwgMHhBRSwgMHhGNSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwKKwkgMHhERSwgMHg2MCwgMHhBRiwgMHg2NCwgMHgwOSwgMHhGQiwgMHgwOCwgMHgwMCwgMHg2NiwgMHg0MywgMHgwMCwgMHhCRSwgMHhERCwgMHg4MSwgMHhGMSwgMHgwMiwKKwkgMHhBQywgMHhGMSwgMHhBRSwgMHhGRCwgMHhDMSwgMHg4NCwgMHhBQywgMHhGQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NSwKKwkgMHgyOSwgMHg0MywgMHhGQywgMHhBMywgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwMywgMHg2MSwgMHgwRSwgMHg2NSwgMHgyNCwgMHg2MCwgMHg3MiwgMHg2MywgMHg0MywgMHg0OSwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHgwMCwgMHhBOCwKKwkgMHhDRCwgMHg4MSwgMHgwNCwgMHgwMiwgMHhGOSwgMHgwMiwgMHhBRCwgMHg2MCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHhFNiwgMHgwMSwKKwkgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHhFMywgMHgwNSwgMHhGNiwgMHhBMywgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMSwgMHg0NCwgMHg0NywgMHg0NCwgMHg0OCwKKwkgMHg0NCwgMHg0NSwgMHgyNCwgMHg2MCwgMHhCMCwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2MywKKwkgMHgwRCwgMHg2NSwgMHgwMCwgMHg2MSwgMHg0MSwgMHg0OCwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHhBQywgMHg4NiwgMHgwMCwgMHg2MSwgMHgwOSwgMHgwMywKKwkgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwKKwkgMHhGNiwgMHgwMSwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg2NSwgMHg0NCwgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHhDQywgMHg4NSwKKwkgMHg1QSwgMHg4NywgMHhFOSwgMHgwMiwgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHhEQSwgMHg1QSwgMHg4NywgMHhBOSwgMHhGMywgMHhBOCwgMHhGMSwKKwkgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHgxRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwKKwkgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwKKwkgMHg2NCwgMHg0NCwgMHhDQywgMHg5QywgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMiwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywKKwkgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgwNiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBRCwgMHhGMywKKwkgMHgwMSwgMHg2MSwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwMywgMHgwMywgMHhENSwgMHg4MCwgMHhERCwgMHg4MSwgMHhGQSwgMHgwNCwgMHhDRCwgMHg4NCwKKwkgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHgyOCwgMHg0NSwgMHhDNCwgMHg4NCwgMHg1QSwgMHhEQSwgMHhEQSwgMHg4MSwgMHhBQywgMHhGMSwgMHg1OSwgMHhEOCwKKwkgMHgyNCwgMHg2MCwgMHgyMCwgMHg2NCwgMHgxOCwgMHg2MywgMHhBMCwgMHhEMSwgMHgwNiwgMHhBNCwgMHg1OSwgMHhEOCwgMHhGQywgMHgxRiwgMHgwMCwgMHg2NCwKKwkgMHg1OSwgMHhEQSwgMHg1OSwgMHhEQSwgMHgwMSwgMHg2MCwgMHg1QywgMHg2NCwgMHgwQSwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwKKwkgMHhEQywgMHhGMSwgMHg1OSwgMHhEOCwgMHg3NSwgMHgwMSwgMHgwNywgMHg0QiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHg0NywgMHg1OCwgMHg0RiwgMHgyMSwgMHgwMCwgMHg2QywgMHgwMSwgMHgwNywgMHg0QiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3MCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHgyNywgMHg0NCwgMHgwMCwgMHhCRSwgMHgwOCwgMHhGMCwgMHgxNSwgMHgwMywgMHg2NCwgMHg0MiwgMHg0QSwgMHhEMywKKwkgMHgwOSwgMHhGMiwgMHhEQywgMHg4MywgMHhBMiwgMHhERCwgMHgyNSwgMHg0MywgMHgwOSwgMHhGQywgMHg2MywgMHg0NiwgMHgyNywgMHg0MywgMHgwQSwgMHhGQywKKwkgMHgwOSwgMHhGQSwgMHgwOCwgMHhGOCwgMHgwMCwgMHhBOCwgMHg2NiwgMHg0MywgMHgwMywgMHgwMiwgMHg2NCwgMHg0NCwgMHg1OCwgMHhERCwgMHgwMywgMHgwMCwKKwkgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHg0QywgMHgwMSwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwKKwkgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFNCwgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwKKwkgMHgwNCwgMHgwMCwgMHgwOSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRSwgMHgwNywgMHgwNSwgMHhBMywgMHhGRSwgMHgwNywgMHgwNSwgMHhBMSwgMHhGRSwgMHg1MiwgMHgwNSwgMHg2MCwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgxMiwgMHgwMCwgMHgyMCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwKKwkgMHhCOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwgMHhBMCwgMHg0QywgMHg1OSwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHg0MCwgMHg2MCwKKwkgMHgwQiwgMHg2NSwgMHgyQiwgMHg0NCwgMHgwMCwgMHg2MywgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgwMiwgMHgyNCwgMHg5NCwgMHg4NCwgMHhGMywgMHg4MywKKwkgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGOCwgMHgwMiwgMHhERiwgMHg4MywgMHgyRiwgMHg1OCwgMHg0MCwgMHg0QiwgMHgwMCwgMHg2MiwgMHgwMSwgMHg2NCwKKwkgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxQSwgMHgwMywgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxNSwgMHgwMywgMHg2MSwgMHg0NCwgMHgxMSwgMHg2MSwKKwkgMHhFMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwMSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhGMiwgMHg4MiwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwKKwkgMHhDNiwgMHg4MiwgMHgwMiwgMHgyOCwgMHhENiwgMHg4MiwgMHhFMiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhCQywgMHhGNCwgMHgwMiwKKwkgMHgwMSwgMHgyQSwgMHhDNiwgMHg4MiwgMHgwMywgMHgwMCwgMHhFOSwgMHg4MSwgMHhGMiwgMHg4MiwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHgxMCwgMHg2MSwgMHgwNCwgMHgwMywgMHhGMCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHhGRiwgMHhGRiwgMHhCRCwgMHgwMiwgMHg4QiwgMHhGMywKKwkgMHg4QywgMHhGMywgMHgwMiwgMHhBOCwgMHgwMiwgMHhBOCwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg4RCwgMHhGQiwgMHg4QiwgMHhGQiwgMHg4QywgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg4RSwgMHhGQiwgMHhDQSwgMHhGRSwgMHgyRCwgMHgwMCwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg4QywgMHhGQiwgMHhDQSwgMHhGRSwKKwkgMHgwMSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgxNCwgMHgwMywgMHhEQywgMHhGMywgMHgyQSwgMHhGMiwgMHhGRCwgMHhBMCwgMHg2MCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgyOSwgMHgwMCwgMHgyOCwgMHgwMiwKKwkgMHg5QiwgMHhGRSwgMHgyNiwgMHgwNSwgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRiwgMHgwMiwgMHg4NiwgMHhGRiwgMHgyMCwgMHg0MCwgMHg1MiwgMHgyNywgMHgwNywgMHgwMCwgMHg5QSwgMHhGRSwgMHgwNSwgMHgwNCwgMHg5RCwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhGMSwgMHhGRSwgMHgxMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHg4NCwgMHhGRiwgMHhCMCwgMHg2MCwgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0NCwgMHhGQywgMHhGQiwgMHg0NiwgMHg1QywgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgxMSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHg5RCwgMHhGRSwgMHgwQiwgMHgwNSwgMHgyNCwgMHg2MCwgMHg5MiwgMHg2NSwgMHgwOCwgMHg2NCwgMHhBNSwgMHhEQiwgMHhCMSwgMHg2MCwgMHg0RCwgMHg2NCwKKwkgMHg0RiwgMHhGQiwgMHgyRCwgMHhGRiwgMHhCMCwgMHg2MCwgMHhBNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhBOSwgMHhGMywgMHgwNywgMHgwMiwgMHgyMywgMHhGMCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhCOCwgMHg2MCwgMHgzNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhEOCwgMHhGMywgMHg0MCwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgzRCwgMHgwMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg2NCwgMHg0MSwgMHg0RCwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgzNCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHhGRiwgMHgyMiwgMHgzMSwgMHgwMCwgMHgwNSwgMHg3RSwgMHg2NiwgMHg0NSwgMHg2MSwgMHg0NiwgMHg2RiwgMHhGQSwgMHg2NSwgMHg0NiwKKwkgMHgwNywgMHhGMCwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwKKwkgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywKKwkgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwKKwkgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0RCwgMHhGQiwgMHg0QywgMHhGQiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MywgMHg0MCwgMHg0NywgMHg1MCwgMHgzNiwKKwkgMHgwNSwgMHgwMCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHg4MCwgMHgzNiwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2MywgMHg0OCwgMHhGRCwgMHg0MCwgMHg0NywKKwkgMHgwOCwgMHgyQSwgMHgwQSwgMHgwMCwgMHgwMywgMHgyRiwgMHgwOCwgMHgwMCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHhGRiwgMHhGRiwgMHg0QSwgMHhGMywgMHgzNSwgMHhGQSwgMHgxMCwgMHhBNCwgMHg0QSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgxNiwgMHhGQSwgMHgwRiwgMHhGQSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHgwRSwgMHhGMCwgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhEQiwgMHhGQiwKKwkgMHgwNywgMHhGMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEQiwgMHhGMywgMHhEQSwgMHhGQiwKKwkgMHg2MCwgMHg0MSwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGQywgMHhBNSwgMHgwMCwgMHg3RiwgMHhENCwgMHg4NCwgMHgyNywgMHg0NSwKKwkgMHgzQywgMHg0NiwgMHgxQSwgMHhGQSwgMHgyMiwgMHg2MywgMHg3QiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMywgMHgyQiwgMHgxQywgMHg2MywKKwkgMHgyQSwgMHhGQSwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgxNCwgMHg2MywgMHg0MywgMHg0QywgMHgwMCwgMHg3QywgMHgyMiwgMHhGOCwgMHg2NCwgMHg0MSwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgzNiwgMHhGMiwgMHg2MywgMHg0NiwgMHhGRiwgMHhCNCwgMHgyMiwgMHhGQSwgMHg2MCwgMHg0MCwKKwkgMHgwMCwgMHgzNiwgMHg3NiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHhBNSwgMHgwMCwgMHgwMywgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHhBMCwgMHhEMiwgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwQSwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwgMHgwNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHg3RiwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywKKwkgMHgwMSwgMHgwMiwgMHgwMSwgMHg2MSwgMHg2MiwgMHg0MywgMHg0NiwgMHg0MywgMHgzQywgMHg0NiwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg1QywgMHgwMCwgMHg2MCwgMHg0NSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHhDRCwgMHg4MSwKKwkgMHgzQywgMHg0NiwgMHgxNCwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwgMHgxMSwgMHgwMCwgMHg4RSwgMHgzQiwgMHgwRiwgMHgwMCwgMHg2NSwgMHg0NCwKKwkgMHgwMSwgMHgyNiwgMHg3QSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgyRCwgMHgwMCwgMHhBMywgMHg0NiwKKwkgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg2RiwgMHgwMCwgMHg1NiwgMHgwMCwgMHhBMywgMHg0NiwgMHg2NSwgMHg0NCwKKwkgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgzNywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHg0OCwgMHgwMCwgMHgxNywgMHgwMCwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwKKwkgMHgzNiwgMHhGMiwgMHg2NiwgMHg0MywgMHhGRiwgMHhCNCwgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg2MCwgMHg0NywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwKKwkgMHg2MywgMHg0NiwgMHgzNywgMHhGMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHgxMCwgMHgyNywgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzQywgMHg0NiwgMHgwMiwgMHg2NSwgMHhCNywgMHg2MCwgMHg2NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHgzQywgMHg0NiwgMHgyNiwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwKKwkgMHgyMywgMHgwMCwgMHg3NywgMHgzNywgMHgzOSwgMHgwMCwgMHg3OCwgMHgzNywgMHgzNywgMHgwMCwgMHg4RSwgMHgzNywgMHgzNSwgMHgwMCwgMHhGMSwgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyRCwgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhFMiwgMHgwMSwgMHgzQywgMHg0NiwKKwkgMHgzRSwgMHhGMiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGMCwgMHg4NCwgMHhBNCwgMHg4NCwgMHgxOCwgMHhGQSwgMHgyQSwgMHhGMiwgMHhCRiwgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgxOCwgMHgwMCwgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgzRSwgMHhGMCwgMHgwOCwgMHhBNCwgMHg2MCwgMHg0MSwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg2MSwgMHg0NCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgzRiwgMHhGQSwgMHgzQywgMHg0NiwgMHgyQywgMHhGMiwgMHgyNywgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgzMiwgMHhGMiwgMHhENSwgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg1MywgMHgwMCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgzRiwgMHhGMiwgMHgwOSwgMHgwNiwgMHgyQywgMHg0NSwgMHhDNCwgMHg4NCwgMHhEMCwgMHg4MCwgMHg0MCwgMHg0QSwgMHg0MCwgMHgwNiwgMHg2MCwgMHg0MywKKwkgMHg2NCwgMHg0NCwgMHg1NCwgMHg4OCwgMHgxOCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgyOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHhBMCwgMHhEMywgMHhEQiwgMHhGMywKKwkgMHgwMCwgMHhCQywgMHg2MCwgMHg0NywgMHhFQywgMHhBMCwgMHgzMywgMHgwMywgMHgzMiwgMHgwNywgMHgyQywgMHg0NCwgMHhDNCwgMHg4MSwgMHgwMiwgMHg2MCwKKwkgMHgxQywgMHg2NSwgMHg0NSwgMHg0QSwgMHhENSwgMHg4MCwgMHgyQywgMHg0NSwgMHgyQSwgMHgwNiwgMHgyNywgMHg0MCwgMHgwNCwgMHgyNywgMHgzMCwgMHgwMCwKKwkgMHgyQSwgMHg0MywgMHhENywgMHg4NSwgMHg0NSwgMHg0OCwgMHhENiwgMHhGMSwgMHgwRiwgMHhGMiwgMHhEMywgMHg4MCwgMHgwMSwgMHg2NSwgMHgwMSwgMHgwNywKKwkgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgwRiwgMHhGQSwgMHgwMCwgMHg2MywgMHgzRiwgMHhGMiwgMHgyOCwgMHg0NSwgMHg2MCwgMHg0MSwgMHhENCwgMHg4NCwKKwkgMHhERiwgMHg4MywgMHhGQywgMHgwNywgMHgxNCwgMHhGQywgMHg2MSwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwOSwgMHgzQSwgMHgwNiwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHg0OCwgMHg4OCwgMHgyQSwgMHg0NCwgMHhDOCwgMHg4MywgMHg0MywgMHg0QSwgMHhFNSwgMHgwMSwgMHgxNywgMHhGQSwgMHgwNCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgyNywgMHg0NSwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyOCwgMHg0MywgMHgxNiwgMHhGQywgMHgwRCwgMHgwMCwgMHgzRiwgMHhGMiwKKwkgMHgyQywgMHg0NSwgMHhENiwgMHhGMSwgMHhDNCwgMHg4MSwgMHhEMSwgMHg4MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMSwgMHhCQywgMHgwRiwgMHhGQSwKKwkgMHgzRiwgMHhGMiwgMHgxNywgMHhGQSwgMHgwMSwgMHg2NCwgMHgxNCwgMHhGQSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHgwMCwgMHg3RiwgMHg2NCwgMHg1RSwgMHg0QiwgMHhGQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RSwgMHhEQiwgMHhGQiwgMHg3QywgMHhGMSwKKwkgMHg2MCwgMHg0MywgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhDMCwgMHg2NSwgMHgwMSwgMHgwNiwgMHg2NCwgMHg0NCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwKKwkgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHg0NCwgMHg4NiwgMHgyQSwgMHhGMiwKKwkgMHgwNywgMHhGMCwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwQywgMHhCNCwKKwkgMHgwOCwgMHgzQSwgMHg1NSwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg1MCwgMHgwMCwgMHgxNywgMHhGMiwKKwkgMHgyMiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwgMHg0NywgMHgwMywKKwkgMHg0NiwgMHgwMywgMHgzQywgMHg0NiwgMHgyQSwgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0NSwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwQSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwNCwgMHgyNywgMHgwNywgMHgwMCwgMHg2NSwgMHg0NCwgMHgyQSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyNCwgMHg2NSwgMHg0NSwgMHg0QywKKwkgMHgyRSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyOCwgMHg2NSwgMHg0NSwgMHg0QywgMHgwNywgMHhGMCwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwMywgMHgwMywgMHg2MywgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwKKwkgMHgzRCwgMHhGMSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwOCwgMHhCMCwgMHgzRSwgMHhGMiwgMHgxOSwgMHgwMywgMHg2MCwgMHg0NywgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwMywgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwgMHhCMCwgMHg2MCwgMHhFMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMSwKKwkgMHgyQywgMHg0NSwgMHg2NCwgMHg0MywgMHgxNywgMHhGMiwgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwKKwkgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwKKwkgMHg2MywgMHg0NCwgMHg4MCwgMHg3RSwgMHhEQiwgMHhGQiwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgyQiwgMHhGMCwgMHgxQiwgMHhGQSwgMHg2NCwgMHg0NCwKKwkgMHg4MCwgMHgyNywgMHgzNCwgMHgwMCwgMHgxNiwgMHhGMiwgMHgwRiwgMHhGMCwgMHhBQywgMHg4NCwgMHgyQywgMHg0NSwgMHgyOSwgMHgwMywgMHg0QiwgMHhGMSwKKwkgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwKKwkgMHgwRiwgMHhGMCwgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywKKwkgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwgMHgwRiwgMHhGQSwKKwkgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgxRCwgMHhGQSwgMHhERSwgMHg2NSwgMHhDNCwgMHg4NSwgMHgyNiwgMHg0MSwgMHhFMSwgMHg4MSwgMHhDNSwgMHg4NCwKKwkgMHgyQiwgMHhGQSwgMHgxQiwgMHhGMCwgMHhERSwgMHg2NCwgMHhDMCwgMHg4NSwgMHgyNiwgMHg0NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHgxMCwgMHhGQSwKKwkgMHgyNiwgMHg0NCwgMHgyQywgMHhGMCwgMHgwQSwgMHhBNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMCwgMHg2NCwgMHgxMSwgMHhGQSwgMHhEQiwgMHhGMywKKwkgMHgxMywgMHhGQSwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHgzRSwgMHhGMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2NCwgMHg0MSwgMHgwMSwgMHhCMSwKKwkgMHgwMSwgMHg2MywgMHgxRCwgMHgwMiwgMHg2MCwgMHg0MSwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MiwgMHhBMiwgMHhEMywgMHhCMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMSwgMHg2MywgMHg2MSwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwKKwkgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHg5NCwgMHg2NCwgMHhBMCwgMHhERCwgMHgyQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgwMywgMHgwMCwgMHhCNSwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwKKwkgMHg0NiwgMHg0MywgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHg4QiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwQywgMHgwMCwKKwkgMHhCNSwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHhCNSwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMiwgMHgwMCwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgyQSwgMHhGMiwKKwkgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzQiwgMHgwMCwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwKKwkgMHgwOCwgMHgwMywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMiwgMHgwMCwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHgzNywgMHhGQSwKKwkgMHgyNCwgMHgwMCwgMHgzRCwgMHhGMywgMHgwMSwgMHg2MSwgMHg2MCwgMHg0MywgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHhFOSwgMHg4MSwKKwkgMHhBMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg5MSwgMHg4NCwgMHgzNywgMHhGQSwgMHgxNywgMHgwMCwgMHg0NywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhEQywgMHg4NCwgMHg0NywgMHhGQSwgMHg0NiwgMHhGMiwKKwkgMHgxNiwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NiwgMHhGQSwgMHg0NSwgMHhGMiwgMHgwOCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0NSwgMHhGQSwgMHgwNSwgMHgwNCwKKwkgMHgzNywgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgzNywgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwKKwkgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhCRSwgMHg2MCwgMHg2NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHgwRCwgMHg2MCwKKwkgMHgzRSwgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhCRSwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgzQywgMHg0NiwKKwkgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0NywgMHhGMCwgMHg2NCwgMHg0MSwKKwkgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHhBMywgMHg0NiwKKwkgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHhBMywgMHg0NiwgMHg0NiwgMHhGMiwgMHg0NSwgMHhGMCwKKwkgMHhBMywgMHg0NiwgMHgzQywgMHhGQSwgMHgzRCwgMHhGOCwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4QSwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzNSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgyNywgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHhERSwgMHg4MiwgMHhBMiwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwKKwkgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwKKwkgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwKKwkgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwKKwkgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywKKwkgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwKKwkgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwKKwkgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHgwMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCOCwgMHg2MCwgMHhCRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHhGQywgMHhGQiwKKwkgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBOSwgMHhGMywgMHgxNywgMHgwMywgMHhEMCwgMHg4MCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHg2RiwgMHhGMiwgMHg2MSwgMHg0NiwgMHg3QiwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg3OCwgMHgwMCwgMHg0NywgMHhGMSwgMHgwNywgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHgwMywgMHgxMiwgMHhCNiwgMHg2MCwgMHgzOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgwQSwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg2MSwgMHg0NiwgMHgxMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNiwgMHg1QywgMHgwMCwgMHgwMiwgMHgzNiwgMHg1RCwgMHgwMCwgMHgwMywgMHgzNiwgMHgzNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHg0NSwgMHgwMCwKKwkgMHg2NywgMHgwMCwgMHgwMCwgMHg2NCwgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNSwgMHg3RSwKKwkgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwKKwkgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwKKwkgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwKKwkgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhBMCwgMHg3RSwKKwkgMHg0RSwgMHhGQiwgMHgyNCwgMHgwMCwgMHg0QywgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0QywgMHhGQiwgMHhDQiwgMHhGMywgMHg2MCwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQiwgMHgwMiwgMHgyNCwgMHg2MCwgMHhBNiwgMHg2MiwgMHgwRiwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhCQywgMHgwMSwgMHg0QywgMHhGMywgMHg2NiwgMHg0MSwgMHhEQywgMHg4NCwKKwkgMHg0QywgMHhGQiwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhBNCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhGRiwgMHhBOCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhFRSwgMHgwMSwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHgwOCwgMHgxOCwKKwkgMHhFNCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhGQiwgMHgwNCwgMHgwMSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwQywgMHhGNCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHhERCwgMHgwMiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NywgMHg3MCwgMHhGMiwgMHhGRiwgMHhCNSwgMHg2MSwgMHg0NiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgyOSwgMHgwMywgMHhFMCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMSwgMHg2NSwKKwkgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwKKwkgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg5NSwgMHgwMSwKKwkgMHg5NCwgMHgwMSwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHhBMSwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwMSwgMHgwMCwgMHg5RSwgMHgwMSwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMCwgMHg2NSwKKwkgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwKKwkgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhEMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHgyMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHg2NSwgMHg0NCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgxQSwgMHgwMCwgMHgwMywgMHgzNiwgMHg1MywgMHgwMCwgMHgwNCwgMHgzNiwKKwkgMHg3MCwgMHgwMCwgMHgwNSwgMHgzNiwgMHgxNCwgMHgwMCwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhCMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwKKwkgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QywgMHhGRCwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhCNCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgyNCwgMHg2MCwgMHhBNiwgMHg2MiwKKwkgMHgwRiwgMHg2MCwgMHg5NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhCNywgMHg2MCwKKwkgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg0QywgMHhGMywgMHgwMiwgMHhCMCwgMHg2MSwgMHg0NiwKKwkgMHhDQywgMHg4NCwgMHgwNSwgMHgwMywgMHgwNCwgMHgyOCwgMHg0QywgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwKKwkgMHg0QywgMHhGQiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhCOCwgMHg3RSwgMHg0RSwgMHhGQiwgMHhCNywgMHg2MCwgMHg1NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwKKwkgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgzNSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwKKwkgMHhGQiwgMHgwNCwgMHgyRiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHgwMSwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwKKwkgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwKKwkgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwKKwkgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwKKwkgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwgMHg2RiwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMywgMHg3RSwgMHg2RiwgMHhGQSwKKwkgMHgzQywgMHg0NiwgMHg0QywgMHhGRCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhDMCwgMHg3RSwgMHg0RSwgMHhGQiwKKwkgMHg1RCwgMHgwMCwgMHg1QywgMHgwMCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHgwMCwgMHgwMiwgMHgzNiwgMHgxOCwgMHgwMCwKKwkgMHg1NSwgMHgwMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHg0RSwgMHgwMiwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhFMCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgzRiwgMHgwMCwgMHgzRSwgMHgwMCwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg2RiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHg2MSwgMHg0NiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHhGMSwgMHgwNiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHhFQiwgMHgwMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgwMCwgMHg2NSwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHg3MCwgMHhGMiwgMHg4QywgMHhGQSwgMHgwMCwgMHhBOCwgMHg2RiwgMHhGMiwKKwkgMHgxNSwgMHgwMywgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHg3MCwgMHhGMiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhBMCwgMHgwNywgMHgwMywgMHgwRSwgMHgwNiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhGQiwgMHgwNCwgMHgwOCwgMHgwMCwgMHhCOSwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhEOSwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHgwQywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MSwgMHg0NiwgMHhFNCwgMHg3RSwgMHg0RSwgMHhGQiwgMHgwMywgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHhDQSwgMHhGRSwgMHg0NywgMHhGMSwgMHgwMSwgMHg2NSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNywgMHgwOCwgMHgwMCwgMHgyQywgMHhGMiwgMHg2NCwgMHg0NSwKKwkgMHgwMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMSwgMHgwMCwgMHhFMywgMHgwMCwgMHgxNCwgMHhGMiwgMHg2NSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHgxRCwgMHgwMCwgMHg2MCwgMHg0NSwgMHgwNSwgMHg2NCwgMHgzQiwgMHhEQiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg3OCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhBRiwgMHgwMCwgMHg2MCwgMHg0MSwKKwkgMHgyQSwgMHhGMCwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMSwgMHgwMCwKKwkgMHhBNSwgMHgwMCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3OCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg2MSwgMHg0MCwgMHgwOCwgMHgzNiwgMHgwMSwgMHgwMCwgMHg4OCwgMHgwMCwgMHgxNCwgMHhGMiwgMHgxQywgMHg2NSwKKwkgMHg2MCwgMHg0MSwgMHgwMCwgMHg2MywgMHhDRCwgMHg4MSwgMHhDNywgMHg4MywgMHhGRCwgMHgwMiwgMHgzRiwgMHhGMCwgMHgyQywgMHhGMiwgMHhDMywgMHg4MywKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyOSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3NiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg1MiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3NCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHg2MywgMHg0NSwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwRiwgMHhCNCwgMHgwMCwgMHhBOCwKKwkgMHgwMSwgMHhBOCwgMHgyNCwgMHgwMywgMHgxMiwgMHgwMywgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwNCwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzQywgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwgMHhCMCwgMHg2MCwgMHhFMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHgxNSwgMHhGMiwgMHg2NCwgMHg0MSwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhEMSwgMHhGMSwgMHgwMiwgMHgwMCwKKwkgMHhEMCwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgxNSwgMHhGQSwgMHgzMCwgMHgwNywgMHg2MSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwgMHgyNywgMHg2MCwgMHhBOCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgwOCwgMHgwMCwgMHgyNywgMHg2MCwgMHhBQSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwMCwgMHg2NCwKKwkgMHg0OCwgMHhGQiwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwKKwkgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGMCwgMHg4NCwgMHhBNCwgMHg4NCwgMHgxOCwgMHhGQSwgMHgyQSwgMHhGMiwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHhCMiwgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg0OSwgMHhGQiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4NCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg3QiwgMHgwMSwgMHhCOSwgMHg2MCwgMHg0MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgzMSwgMHhGMywgMHgwMSwgMHg2MywgMHhDNCwgMHhCNCwgMHgzMSwgMHhGQiwgMHgzMiwgMHhGRCwgMHhCOCwgMHg2MCwgMHhFRiwgMHg2MiwgMHg0MiwgMHg0MCwKKwkgMHhBMCwgMHg0QywgMHg0MCwgMHhCQywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMCwgMHhGRSwgMHgxQSwgMHhGRiwgMHgyNCwgMHg2MCwgMHgzQSwgMHg2NCwKKwkgMHgwOCwgMHhGMCwgMHgwNywgMHhGMCwgMHhEMCwgMHg4MCwgMHgyNCwgMHg2MCwgMHg0MCwgMHg2MiwgMHgxNCwgMHgwMiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MywKKwkgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwgMHgwRiwgMHgwMywgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgyMywgMHhGQywgMHgyNCwgMHg2MCwKKwkgMHg2RSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgzQywgMHg0NiwgMHgwNiwgMHg2NCwgMHhBMSwgMHhGRiwgMHg0OSwgMHhGQiwgMHg4MywgMHgzRSwgMHgzMSwgMHhGMywKKwkgMHg4NywgMHg2MCwgMHg4MCwgMHg2MSwgMHgxRCwgMHhGMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHgwMSwgMHg2NCwgMHg0NywgMHhGQiwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3MSwgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHg0MCwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHhCOSwgMHg2MCwgMHg0MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyQSwgMHgxQiwgMHgwMCwgMHhEMSwgMHg5MSwgMHg4RCwgMHhFMiwgMHg0MSwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgyRCwgMHg2MCwgMHg2MiwgMHg2MywgMHhGRCwgMHhCNCwgMHgzMSwgMHhGQiwgMHhBMywgMHhEMywgMHhCMCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MywgMHg2MCwgMHg1QywgMHgwRCwgMHhGMiwgMHg0NywgMHhGRCwgMHhGRiwgMHhCNSwKKwkgMHg2MCwgMHg0NywgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwgMHgxRiwgMHgwMywgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHgwRCwgMHhGQSwgMHgxQiwgMHgwMCwKKwkgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGNywgMHhCNCwgMHgzMSwgMHhGQiwKKwkgMHgxMiwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwOSwgMHgwMCwgMHg0MywgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwKKwkgMHgzMSwgMHhGQiwgMHhCOCwgMHg2MCwgMHhCRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhERiwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgyQSwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCMCwgMHg2MCwgMHg5NywgMHg2NCwgMHg0MCwgMHg0MCwKKwkgMHhCNSwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhCOCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwKKwkgMHgwNCwgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHhCQSwgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NiwgMHhGRiwgMHgyMCwgMHg0NCwKKwkgMHg4NCwgMHhGRiwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyNiwgMHgxNywgMHgwMCwgMHhBMCwgMHg0QywgMHg0OSwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgxQywgMHg2MCwgMHhCOCwgMHg2MywKKwkgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwgMHgwNCwgMHhCQywgMHgwOSwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhFRCwgMHhFMiwKKwkgMHhGRSwgMHhCNCwgMHhBMywgMHhEQiwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHgwMywgMHgwMCwgMHhBMCwgMHg0QywgMHg2RCwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRCwgMHhBMCwgMHhGRiwgMHhGRiwgMHg0OCwgMHgwMywgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwKKwkgMHgzRSwgMHgwMCwgMHg2RCwgMHhGMywgMHg3NCwgMHhGMywgMHhDQywgMHg4MywgMHg2RCwgMHhGRCwgMHhDQywgMHg4NCwgMHg3NCwgMHhGQiwgMHgxRiwgMHgwMiwKKwkgMHgzMSwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxMiwgMHgwMCwgMHg2RiwgMHhGMywgMHg3MCwgMHhGMSwgMHhDQywgMHg4NCwgMHg2RiwgMHhGQiwgMHgwRCwgMHgwMiwKKwkgMHg2RiwgMHhGOSwgMHgzMSwgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg1MSwgMHg3MiwgMHhGMywgMHg3MSwgMHhGMSwgMHgwMCwgMHhCOCwgMHg2NCwgMHg0NSwKKwkgMHgwMSwgMHgwMywgMHg2NywgMHg0NSwgMHg2NSwgMHg1MCwgMHhDQywgMHg4NCwgMHg3MywgMHhGQiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHg2RSwgMHhGMSwgMHgwMCwgMHhCOCwgMHg3NCwgMHhGOSwgMHgwMywgMHgwMywgMHg4NywgMHhGMywgMHg2RCwgMHhGQiwgMHgwNCwgMHgwMCwgMHg2RCwgMHhGMywKKwkgMHg4NywgMHhGMSwgMHgxNSwgMHgxQiwgMHg2RCwgMHhGOSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMSwgMHgwMCwgMHhERCwgMHhGRSwgMHgwRiwgMHgwNSwKKwkgMHhCQSwgMHhGRSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHgwMSwgMHhCQywgMHhBMCwgMHg1RCwgMHgwMCwgMHhFRSwgMHg3RiwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHhFRSwgMHg2NCwgMHhBMywgMHhGQiwgMHhBNCwgMHhGOSwgMHgwNCwgMHg2NCwgMHhBNSwgMHhGQiwgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgxQSwgMHg2MCwKKwkgMHg0MiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhGRiwgMHgyQiwgMHhBMiwgMHhEQiwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgyOSwgMHgwMCwgMHg5RCwgMHhGRSwgMHgyNywgMHgwNCwgMHgyNiwgMHgwQSwgMHg5RiwgMHhGRSwgMHgyNCwgMHgwNSwgMHg4NSwgMHhGRiwgMHgyMCwgMHg0NCwKKwkgMHg4NCwgMHhGRiwgMHg0MCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgzRiwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxQywgMHgwMCwgMHgzOCwgMHg2OSwgMHhGRiwgMHhGRiwKKwkgMHg2OCwgMHg0NCwgMHgwMSwgMHgxNiwgMHhGRCwgMHgwMSwgMHgwMSwgMHgyQSwgMHgxNSwgMHgwMCwgMHgyNywgMHg2MCwgMHhCNCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHg3RiwgMHhGMSwgMHgwMiwgMHg2MCwgMHhFRSwgMHg2NCwKKwkgMHhBMywgMHhGQiwgMHhGRiwgMHhGRiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBNCwgMHhGQiwgMHgwNCwgMHg2NCwgMHhBNSwgMHhGQiwKKwkgMHhERiwgMHhGRSwgMHgxOSwgMHhGRiwgMHgxMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHg4MCwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHhDOSwgMHhGRSwgMHg0OSwgMHhGMywgMHgzQywgMHg0NiwgMHgyNywgMHgxOCwgMHhDQywgMHg4NCwKKwkgMHg0OSwgMHhGQiwgMHgyNCwgMHgwMiwgMHhCQiwgMHg2MCwgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHhGQywgMHhGQywgMHgwMCwgMHg2NCwgMHg1QywgMHg1QywKKwkgMHgzMiwgMHhGQiwgMHg4MiwgMHhGRiwgMHg1QywgMHg0NywgMHg4NCwgMHhGRiwgMHg2MiwgMHhGRiwgMHgyNywgMHg2MCwgMHhBNCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHgyNCwgMHg2MCwgMHg2RSwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRSwgMHhGRSwgMHg2QSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHhGRCwgMHhCNCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwgMHgwMSwgMHhCMCwgMHgwMiwgMHhCMCwgMHgwQywgMHgwMywgMHgwQiwgMHgwMiwKKwkgMHg5RCwgMHhGRSwgMHgwOSwgMHgwNCwgMHgyNCwgMHg2MCwgMHhBNiwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwNywgMHgwMCwgMHg4MCwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywgMHhBMywgMHhEMywgMHhBRCwgMHg0OSwgMHgyMCwgMHhCNSwKKwkgMHgwOCwgMHhCMSwgMHgyMywgMHgwMywgMHhFMSwgMHg4MSwgMHgxMCwgMHhCNSwgMHg5NSwgMHg4MSwgMHg2MCwgMHg0MSwgMHgxOCwgMHgwMiwgMHgxQywgMHg2MCwKKwkgMHhCNiwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhBNCwgMHhEQiwgMHgxNywgMHgwMiwgMHgwNSwgMHg2NCwgMHhBNCwgMHhEQiwKKwkgMHg2MSwgMHg0NCwgMHgwNywgMHhCNCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMiwgMHgwOCwgMHhCMSwgMHhFMSwgMHg4MSwgMHg5NSwgMHg4MSwgMHhBMywgMHhEMywKKwkgMHgwQywgMHgwMywgMHgwOCwgMHhBQywgMHgwMSwgMHhCQywgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwgMHgxMywgMHhGRiwgMHgwNiwgMHgwMCwgMHgxMCwgMHhBQywKKwkgMHhBMywgMHhEQiwgMHgxQywgMHg2MCwgMHhCNiwgMHg2MywgMHgwNSwgMHg3QywgMHhBMywgMHhEOSwgMHhCMCwgMHg2MCwgMHhBNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0NiwgMHhGMywgMHg0NSwgMHhGMSwgMHgwNSwgMHgxQiwgMHg2NCwgMHg0NCwgMHgwMywgMHgxQiwgMHgwRiwgMHg2MCwgMHg5MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHg0NSwgMHhGQiwgMHgwMCwgMHg2MywgMHg0NiwgMHhGRCwgMHg2MCwgMHg0MSwgMHgyNSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgyNywgMHg0NCwgMHhFRiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMCwgMHhCOSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwMSwgMHgxMiwgMHgyQiwgMHgwMywgMHhCQSwgMHg2MCwgMHg5MywgMHg2MiwKKwkgMHg4NCwgMHhGRiwgMHg0MiwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzMSwgMHgwQSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHgyQiwgMHgwQSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywKKwkgMHhGNywgMHgxMiwgMHg0NSwgMHhGMywgMHg0QywgMHgwMiwgMHgxNSwgMHgxOCwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHgxOCwgMHgzMSwgMHg2MCwgMHgxMCwgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwNiwgMHgxOCwgMHhBQywgMHg0QywgMHg4MCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHgwNSwgMHgwMCwgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHg0NSwgMHhGQiwKKwkgMHhERiwgMHgwMiwgMHgwNiwgMHgwQSwgMHhBMCwgMHg0QywgMHhGQiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMywgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NCwgMHhGRiwgMHhCQSwgMHg2MCwgMHg3MCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHhBQiwgMHg2MCwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHgzMiwgMHhGMSwgMHgyNSwgMHgwMywKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwgMHgyMiwgMHgwMCwgMHhBMywgMHg2MCwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxQywgMHhCQywKKwkgMHhERiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyQSwgMHhFRiwgMHgwMSwgMHg3MywgMHhGMywgMHg3MSwgMHhGMSwgMHgwMCwgMHhBMCwKKwkgMHhEQywgMHg4MCwgMHgwNSwgMHgwMywgMHgwOCwgMHgwMywgMHhDQywgMHg4NCwgMHg3MywgMHhGQiwgMHg2NywgMHg1MCwgMHgwOCwgMHgwMCwgMHhDQywgMHg4NCwKKwkgMHg3MywgMHhGQiwgMHg2NCwgMHg1MCwgMHgwNCwgMHgwMCwgMHgzMSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg1MSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBMCwgMHg0QywgMHgzMCwgMHhCQywgMHhGMywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwKKwkgMHgyOCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgwRiwgMHg2MCwgMHg5NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxNiwgMHgwMCwKKwkgMHg0NiwgMHhGQiwgMHgxNCwgMHgxOCwgMHhCQiwgMHg2MCwgMHgwNiwgMHg2NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywKKwkgMHgxNCwgMHhCQywgMHhGNywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwKKwkgMHg0NiwgMHhGMywgMHhCNywgMHgwQSwgMHhEQywgMHgwMiwgMHhDQywgMHg4NCwgMHg0NiwgMHhGQiwgMHhGNSwgMHgwMiwgMHg4NCwgMHhGRiwgMHhCQiwgMHg2MCwKKwkgMHgxOCwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg0NywgMHhCQiwgMHhFMSwgMHgwNCwgMHgwMCwKKwkgMHgzQSwgMHhFMSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhCQiwgMHhFMSwgMHhBMywgMHg2MCwgMHg2RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwKKwkgMHgzOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NCwgMHgzRSwgMHhGQiwgMHgwMSwgMHhBMCwgMHg0QywgMHgzRCwgMHg0NiwgMHgyQSwgMHhGMiwKKwkgMHg0NiwgMHg0RCwgMHgxMCwgMHgyNSwgMHgwRSwgMHgwMCwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2NiwgMHg0MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgyOSwKKwkgMHgwMiwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwQSwgMHhCQywgMHhBMiwgMHhEQSwgMHgwOCwgMHgyNSwgMHhFOSwgMHgwMSwgMHhDQiwgMHhGRSwgMHg1QywgMHg1RCwKKwkgMHhFNywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywKKwkgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHgwNywgMHhGQywgMHgzRiwgMHhGMiwgMHgwOSwgMHg2MCwgMHhCMCwgMHg2NSwgMHhENCwgMHg4MCwgMHgyQSwgMHhGMiwgMHhDNCwgMHgwNSwgMHgwOCwgMHgyNSwKKwkgMHhCNiwgMHgwMSwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHg0MCwgMHg0QiwgMHhBMSwgMHhEQiwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMiwKKwkgMHhBOSwgMHhGMSwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxMiwgMHgwMCwgMHhEMywgMHg4MCwgMHgyQywgMHhGMCwgMHhCMywgMHgwMywKKwkgMHgwNywgMHhGNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhBOSwgMHhGNSwgMHhCNiwgMHhGNCwgMHgyRCwgMHg0NiwgMHgwNCwgMHg2NCwgMHgwNCwgMHhCMywKKwkgMHgyMiwgMHhGQSwgMHgwNCwgMHgwMywgMHhCQywgMHg2MCwgMHg3MiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHhERSwgMHgwMCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHgwQywgMHg2MCwgMHgzQSwgMHg2NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMywgMHgxQiwgMHhCQywgMHg2MCwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NSwgMHg0NCwgMHhEOCwgMHg4NCwgMHgwOCwgMHgyNSwgMHg3NiwgMHgwMCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQiwgMHgzRiwgMHhGMiwgMHgwNCwgMHg2NSwgMHhDNCwgMHg4MywKKwkgMHgwQSwgMHhFMSwgMHhCMywgMHhGRiwgMHg5QSwgMHhGRiwgMHhDQiwgMHg4MywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgwRSwgMHhBMywKKwkgMHhBQiwgMHg4NCwgMHhGMiwgMHhBMywgMHhBMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHgwMiwgMHg2MiwgMHhDOSwgMHg4MSwKKwkgMHhBQiwgMHg4NCwgMHhBMSwgMHhGRiwgMHgwMSwgMHgwMCwgMHhBMiwgMHhEQywgMHg3QSwgMHhENCwgMHhGRCwgMHgxQywgMHhBMiwgMHhEQywgMHgwOCwgMHgyNSwKKwkgMHg1MiwgMHgwMCwgMHhGMiwgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhFRiwgMHgwMywgMHhGRiwgMHhCMSwgMHgwOSwgMHgxRSwgMHgwMiwgMHgwMiwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHg1QSwgMHhEMiwgMHg4OSwgMHhGRiwgMHg4MCwgMHg0RiwgMHg2RiwgMHg0NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHgzRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHgzRCwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwRiwgMHhGMCwKKwkgMHgwQSwgMHg2NCwgMHhCMCwgMHg4NCwgMHgxNiwgMHgxNCwgMHhGNywgMHhCNCwgMHhBMiwgMHhEQSwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHhGMSwgMHhGNSwgMHhGMCwgMHhGNCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwKKwkgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwKKwkgMHgwRCwgMHgwMSwgMHhBMiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxOCwgMHgwMCwKKwkgMHhGMSwgMHhGNSwgMHhCNywgMHhGMCwgMHgyQSwgMHg0NCwgMHhBNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgyNiwgMHgxMCwgMHgwMCwgMHgyRCwgMHg0NiwKKwkgMHg2NCwgMHg0NCwgMHgzQSwgMHhGMCwgMHhCQywgMHhGMCwgMHg2NCwgMHg1RiwgMHgzRCwgMHhGMCwgMHgwNywgMHhGNCwgMHhGMCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHhBMywgMHg1QiwgMHhEOCwgMHg2NSwgMHg1QywgMHg1QiwgMHhEOCwgMHg1QiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgwMSwgMHgwMCwgMHgyRCwgMHg0NiwKKwkgMHhCQiwgMHg2MCwgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MywgMHhGRiwgMHg0MCwgMHhGRiwgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwKKwkgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywgMHgyRCwgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwKKwkgMHhGMSwgMHhGNSwgMHhGMCwgMHhGNCwgMHg1OSwgMHhEMSwgMHgzNywgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwKKwkgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwgMHhCQiwgMHg2MCwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgzRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHhFMCwgMHgwMSwgMHgwRiwgMHhGMiwgMHg0MCwgMHhGRiwgMHgwMiwgMHhCQywgMHhBMiwgMHhEQSwgMHhCQiwgMHg2MCwKKwkgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwRCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgwNCwgMHg2NCwgMHgyMiwgMHhGQSwKKwkgMHg4NywgMHhGNCwgMHhBOSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzQiwgMHhGMiwgMHhFNywgMHgwMywgMHg2MCwgMHg0NywgMHhDMCwgMHhCNywKKwkgMHgwMiwgMHhGRSwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMCwgMHhBOCwgMHg0MCwgMHg0QSwgMHgxNiwgMHgwMywgMHhFMCwgMHg4MSwKKwkgMHg2MSwgMHg0MywgMHg0MiwgMHhGRSwgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0QSwgMHhFMSwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHgyRCwgMHg0NiwgMHgwNywgMHhGNCwgMHhFMCwgMHg4MSwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NywgMHgwQywgMHg2MCwgMHg3QSwgMHg2MywgMHhBMCwgMHg4NCwKKwkgMHg0NywgMHg5QywgMHgxMCwgMHgwMywgMHg3QywgMHg0NCwgMHhBMCwgMHg2MywgMHgxMSwgMHgwMCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MywgMHg0NiwKKwkgMHgzNywgMHhGMCwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHgwMCwgMHg2MCwKKwkgMHg5MCwgMHg2MywgMHgwNCwgMHgwMCwgMHgyRCwgMHg0NiwgMHhCQywgMHg2MCwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NiwgMHhFRSwgMHhGQiwKKwkgMHhFRiwgMHhGOSwgMHhGMCwgMHhGRCwgMHgwNywgMHhGMiwgMHhGMSwgMHhGQiwgMHg2MCwgMHg0NiwgMHgzNywgMHhGMCwgMHgyQSwgMHg0NCwgMHgwRCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHg1QSwgMHhEOSwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgzRiwgMHgyMiwgMHgwNSwgMHgwMCwKKwkgMHg5MCwgMHg4NCwgMHgzNywgMHhGQSwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyMSwgMHgwMCwgMHhBRCwgMHg0NiwgMHgwQSwgMHhBMywgMHgzRCwgMHhGMiwKKwkgMHhBRCwgMHg0NiwgMHhBMywgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQywgMHhGMiwgMHhBRCwgMHg0NiwgMHgwMiwgMHgwMywgMHgxNiwgMHgwNywKKwkgMHgxNCwgMHgwNCwgMHg1QiwgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQiwgMHhGMiwgMHgwMywgMHgwMywgMHhBRCwgMHg0NiwgMHgwRSwgMHgwNywKKwkgMHgwQywgMHgwNCwgMHgzQSwgMHhGMCwgMHhBRCwgMHg0NiwgMHg1QiwgMHhEMCwgMHg2NCwgMHg1RiwgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgxOCwgMHgwNywKKwkgMHgwNCwgMHgwMywgMHhEMCwgMHg4NCwgMHgxMCwgMHhBNCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwNywgMHg3RiwgMHgwMSwgMHgwMSwgMHg2NCwgMHgwRCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwKKwkgMHhBMiwgMHhEQiwgMHhCRCwgMHg2MCwgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg1MywgMHgwMSwKKwkgMHgyRCwgMHg0NiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhCRCwgMHg2MCwKKwkgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg0NSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwRiwgMHg2NCwKKwkgMHhCQiwgMHg2MCwgMHhEMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGNCwgMHg2NiwgMHg0MSwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMiwgMHg0MCwgMHg0MiwKKwkgMHgwNSwgMHhGMiwgMHg0MCwgMHg0MywgMHg0MCwgMHg0NCwgMHg2MSwgMHg0NiwgMHgzQywgMHhGMiwgMHgzRCwgMHhGMiwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MSwKKwkgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHhFRiwgMHhGMSwgMHhFRSwgMHhGNSwgMHg0NCwgMHg0QywgMHgyQywgMHg1QywgMHhFOSwgMHg4MCwKKwkgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4NCwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgwRCwgMHg2MCwKKwkgMHgyRSwgMHg2MSwgMHgwNSwgMHg2NCwgMHhGMCwgMHhGNCwgMHhGMSwgMHhGNSwgMHhGRSwgMHhBMywgMHg1QiwgMHhEMCwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOSwKKwkgMHhGQywgMHgwMiwgMHhGMCwgMHhGMywgMHhGMSwgMHhGNSwgMHg2MCwgMHg0MiwgMHgyMCwgMHg0NCwgMHhBMiwgMHhEQSwgMHgyMSwgMHg0NCwgMHg1QSwgMHhEQSwKKwkgMHgyMiwgMHg0NCwgMHg1QSwgMHhEQSwgMHgyMywgMHg0NCwgMHg1QSwgMHhEQSwgMHgyNCwgMHg0NCwgMHg1QSwgMHhEQSwgMHg2MSwgMHg0NiwgMHgwRCwgMHg2MCwKKwkgMHgzQywgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHhGMCwgMHhGMywgMHhGMSwgMHhGNSwgMHhBMCwgMHhEMiwKKwkgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MCwgMHg0NCwgMHg0MSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MiwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHhCQSwgMHhGMCwgMHgzQiwgMHhGMiwgMHg0NCwgMHg0NCwgMHg2NSwgMHg1RiwgMHg0MCwgMHg4NSwgMHhFRiwgMHhGNCwgMHhFRSwgMHhGNSwKKwkgMHg0MywgMHg0QywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwKKwkgMHg0MCwgMHg4MSwgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwKKwkgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhCRCwgMHhEMiwKKwkgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHg0MCwgMHg4NCwgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNSwgMHg0NCwgMHg0MCwgMHg4NSwgMHg2MSwgMHg0NiwgMHgzQSwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFRSwgMHhGNSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyMCwgMHg1QywgMHg0MCwgMHg4MCwgMHgyMCwgMHg0NCwgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMCwgMHg0NywgMHhFNSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMSwgMHg1QywgMHg0MCwgMHg4MSwKKwkgMHgyMSwgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NywgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyMiwgMHg1QywgMHg0MCwgMHg4MiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NywgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMywgMHg1QywgMHg0MCwgMHg4MywgMHgyMywgMHg0NCwgMHhFQSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyMywgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNCwgMHg1QywKKwkgMHg0MCwgMHg4NCwgMHgyNCwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNSwgMHg1QywgMHg0MCwgMHg4NSwgMHgyNSwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNSwgMHg0NywKKwkgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyQywgMHg0MywgMHhBMywgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgwRCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQiwgMHhGMywgMHg1QSwgMHhEMywKKwkgMHg0MCwgMHg0OCwgMHg1QSwgMHhEMywgMHg0MCwgMHg0OSwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg3QywgMHg0NCwgMHg0RCwgMHg0NSwgMHhGMiwKKwkgMHg0NiwgMHhGMiwgMHg0MCwgMHg0NywgMHg0MCwgMHg0NiwgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHgyRCwgMHg1QywgMHhFOSwgMHg4MCwKKwkgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4QSwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgyNiwgMHg0NCwKKwkgMHg0MCwgMHhGQSwgMHgyNywgMHg0NCwgMHg0MSwgMHhGQSwgMHgyOCwgMHg0NCwgMHg0MiwgMHhGQSwgMHgyOSwgMHg0NCwgMHg0MywgMHhGQSwgMHgyQSwgMHg0NCwKKwkgMHg0NCwgMHhGQSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg3QywKKwkgMHg0NCwgMHg0RCwgMHgyRCwgMHg0MiwgMHhBMiwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0NiwgMHg0NCwgMHg0NywgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwKKwkgMHg0MCwgMHg0OCwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0OSwgMHg0NywgMHhGMiwgMHg0NCwgMHg0QSwgMHg0MCwgMHg4QiwgMHg2MCwgMHg1QywgMHg2NCwgMHg0NywKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHhGRiwgMHhCNCwgMHgyMCwgMHhCQywgMHg3RiwgMHhCNCwgMHhFMSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg3MCwgMHg2MywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwKKwkgMHg0MCwgMHg4QSwgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQiwgMHg0NCwgMHg0MCwgMHg4QiwKKwkgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNiwgMHg1QywgMHg0MCwgMHg4NiwgMHgyNiwgMHg0NCwKKwkgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNiwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg4NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNywgMHg1QywgMHg0MCwgMHg4NywgMHgyNywgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NywKKwkgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOCwgMHg1QywgMHg0MCwgMHg4OCwgMHgyOCwgMHg0NCwKKwkgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyOSwgMHg1QywgMHg0MCwgMHg4OSwgMHgyOSwgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyOSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQSwgMHg1QywgMHg0MCwgMHg4QSwgMHgyQSwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyQSwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQiwgMHg1QywgMHg0MCwgMHg4QiwKKwkgMHgyQiwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQiwgMHg0NywgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgzOCwgMHhGMCwgMHgyQiwgMHg0NCwKKwkgMHg5MCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHgwRCwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhENywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhFNCwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgzMiwgMHgwMCwgMHhEQywgMHhGMywgMHgzMSwgMHg0MSwgMHgwMSwgMHhCMSwKKwkgMHgwMywgMHhBOCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMiwgMHgyMCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwQywgMHgwMCwgMHhCQiwgMHhGRSwgMHhDQSwgMHhGRSwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHgwMCwgMHhBOSwgMHhGRSwgMHhEOCwgMHgwNSwgMHhBQiwgMHhGRSwgMHgwQywgMHgwNSwgMHhBOCwgMHhGRSwKKwkgMHhDOCwgMHgwNSwgMHhBQSwgMHhGRSwgMHhDOSwgMHgwNSwgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NSwgMHgzRSwgMHgyNCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NSwgMHhENCwgMHg4MCwgMHgwRiwgMHhGMCwKKwkgMHhGOSwgMHgwMywgMHg2NCwgMHg0NCwgMHg3MCwgMHhCMCwgMHg3MCwgMHgyQSwgMHgxNCwgMHgwMCwgMHgyNywgMHg2MCwgMHhCMiwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHhBMiwgMHhGRiwgMHhBRiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwgMHhBRiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwgMHgwOSwgMHhGNCwgMHgwRiwgMHhGMiwgMHgwMiwgMHgxOCwKKwkgMHg2NSwgMHg0NiwgMHhFMywgMHgxQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHhDQSwgMHgwMSwgMHhBMiwgMHhGRiwgMHhBRiwgMHhGMywgMHg0NiwgMHg0NiwKKwkgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwgMHhBRiwgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgwRiwgMHhGMCwgMHhBMywgMHhGQywKKwkgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyMiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5MiwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwKKwkgMHgwMSwgMHg2NCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhDNSwgMHg2MCwKKwkgMHg2NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNiwgMHgzRiwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHg2MCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NiwgMHg2MywgMHhCRSwgMHhEMiwgMHg4MywgMHhGMSwgMHhBMywgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MiwgMHhGMSwgMHgxOCwgMHgwMiwgMHhCRiwgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MSwgMHhGMSwgMHgxNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHgwMiwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5RSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDNSwgMHg2MCwgMHg2NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHhDMSwgMHg2MCwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHg0QSwgMHgwMCwgMHgyOCwgMHg2MCwgMHhFMiwgMHg2MywgMHhCRiwgMHhEMywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4MSwgMHhEQiwgMHg4MywgMHgzRCwgMHgwMywKKwkgMHhCRiwgMHhEMywgMHhBMywgMHhEMywgMHg0MCwgMHg0OCwgMHhCRSwgMHhEMywgMHg0MCwgMHg0QSwgMHgyRSwgMHhGMCwgMHg0MCwgMHg0QywgMHhEMCwgMHg4MCwKKwkgMHgyRCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyQywgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHgwMywgMHgzMSwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwKKwkgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMywgMHgzNCwgMHhGMCwKKwkgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMiwgMHhGMCwgMHgwNCwgMHgwMiwKKwkgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgzOCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwKKwkgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMywgMHhGQSwgMHhBMSwgMHgwNiwgMHhBMywgMHhCNywgMHgwMywgMHhDMywgMHgwMSwgMHgwNywgMHg2MCwgMHgwMCwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHhDNSwgMHg2MCwgMHg2NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgwRiwgMHhGMCwgMHg2MCwgMHg0NSwgMHhBNCwgMHgzNiwgMHgwOCwgMHgwMCwKKwkgMHgwQywgMHhCNCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwNiwgMHgwMCwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDMiwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHg2NSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyMiwgMHgwMCwgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyNiwgMHgxRiwgMHgwMCwgMHgwNywgMHhGNCwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgzNywgMHhCNCwgMHgyNiwgMHg0NiwgMHgxOSwgMHgwMiwKKwkgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5OCwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgyNiwgMHgwMywgMHgwMCwgMHhDMiwgMHg2MCwgMHhBRiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHg2MSwgMHg0NCwgMHg4MCwgMHgzQSwgMHgwNiwgMHgwMCwgMHhFNSwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgxMCwgMHgwMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgzQSwgMHgwRCwgMHgwMCwgMHhEQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHgzQSwgMHhFMiwgMHgwMSwgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhERCwgMHgwMiwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHhEMSwgMHgwMCwgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NCwgMHg2MywKKwkgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMiwgMHg4MSwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MywgMHhGMSwgMHgyQSwgMHhGMiwgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgwNywgMHgwMCwgMHgwMSwgMHgwQywgMHhDNiwgMHgwMSwKKwkgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCOCwgMHgwMCwgMHgyNiwgMHgwQywgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQiwgMHgwMiwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHgwMiwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg1QSwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHgwMSwgMHg5MSwgMHgwMCwgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGQSwgMHgwMiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgzMSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHhBOSwgMHhGMSwgMHg0MywgMHg0MywKKwkgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhDNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHg4MCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEOCwgMHhGMywKKwkgMHg2MywgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywKKwkgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywKKwkgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwKKwkgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwKKwkgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwKKwkgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4QywgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwKKwkgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgxMiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHgyQSwgMHhGMiwgMHgyOCwgMHg0MSwgMHg0MCwgMHhBOCwgMHgwMSwgMHhCMSwKKwkgMHgwMiwgMHgwMiwgMHg2MiwgMHgwMiwgMHg5MiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwKKwkgMHg4QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwKKwkgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwKKwkgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgwRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMiwgMHgyNiwKKwkgMHgyNSwgMHgwMCwgMHgxMCwgMHgyQiwgMHgyOSwgMHgwMCwgMHgyOCwgMHg2MCwgMHhFMiwgMHg2MywgMHhCRiwgMHhEMywgMHgyQywgMHhGMCwgMHgwMCwgMHhBOCwKKwkgMHg2MCwgMHg0MSwgMHgwRCwgMHgwMywgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMywgMHgyRCwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyRSwgMHhGMCwKKwkgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyQywgMHhGMCwgMHhEMCwgMHg4MCwgMHhGQSwgMHhBMSwgMHgxMCwgMHgwQywgMHhGMywgMHgwMiwgMHg1MCwgMHhGRSwKKwkgMHg2MCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgxRCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRSwgMHhGMCwgMHgwMSwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwQywgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgxOSwgMHg2MCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNSwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHhGNywgMHgwMSwgMHgyQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQSwgMHgwMCwgMHhEQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxRCwgMHgwMCwKKwkgMHgwMywgMHg2NywgMHhBMCwgMHg4NCwgMHgwMCwgMHgzNywgMHg2NCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNywgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNywgMHg1OCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMywgMHgzNywgMHgwRCwgMHgwMCwgMHhCRCwgMHhEMiwgMHg4MSwgMHhGMSwgMHhCRCwgMHhEMiwKKwkgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgwNywgMHgwMiwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMiwgMHg4MywgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhERSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGRSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNiwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhDNSwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGNCwgMHhBOSwgMHhGMSwgMHgyNywgMHgxQiwgMHgzMSwgMHhGMiwKKwkgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwKKwkgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwKKwkgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMywgMHgwMCwgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhENiwgMHgwMywgMHg0MywgMHg0MywgMHhEQywgMHhGMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwNCwgMHgwMCwgMHgwNywgMHhCNCwgMHgwMywgMHhBOCwKKwkgMHgyQSwgMHhGMiwgMHg1RiwgMHgwMiwgMHhBOSwgMHhGMSwgMHgyMywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHg1QSwgMHgwMiwgMHhDNSwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHgwMiwgMHg2NCwKKwkgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHg0RSwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHg4MCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEOCwgMHhGMywgMHg2MywgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwKKwkgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwKKwkgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywKKwkgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwKKwkgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywKKwkgMHgwQywgMHhGNCwgMHgwNywgMHhGQywgMHg0MywgMHg0MywgMHgwMiwgMHhGRSwgMHgxRCwgMHhGMCwgMHgxQywgMHg2MCwgMHg5QSwgMHg2MiwgMHhDMCwgMHg2NCwKKwkgMHhDMCwgMHg4NCwgMHhBMiwgMHhEMSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhDMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyQSwgMHhGMiwgMHg2MywgMHg0NSwgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHgwQSwgMHgwMCwgMHhEQywgMHhGMywgMHgyMywgMHg0NiwKKwkgMHgwNywgMHhCNCwgMHhGRCwgMHhBMCwgMHgwNiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwRCwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHgzNSwgMHhGMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgyQiwgMHgwQywgMHgwMCwgMHgyMywgMHg0NiwKKwkgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhDNSwgMHg2MCwgMHg1NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0NCwgMHg0QywgMHgwRiwgMHgyNiwKKwkgMHgxRCwgMHgwMCwgMHgwMCwgMHhCQywgMHg0MCwgMHg0NSwgMHgwQiwgMHgwMywgMHgwMCwgMHg2NCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGQSwgMHgyNiwgMHg0NiwKKwkgMHhBMiwgMHhGRiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMCwKKwkgMHgyQywgMHg0NCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwQSwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHhDNCwgMHg2MCwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMiwgMHhGQSwKKwkgMHhBMiwgMHhGRiwgMHgxNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNiwgMHhEQywgMHg5QywgMHhCMywgMHhGMywgMHgyQSwgMHhGMiwKKwkgMHhEQywgMHg4MywgMHhCMywgMHhGRCwgMHgwNiwgMHhGNCwgMHgwMSwgMHhGOCwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxOCwgMHgwMCwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg2NSwgMHhGRiwgMHhCNCwgMHhGQywgMHhBNCwgMHgwNiwgMHhGMCwgMHgwMywgMHgwMywgMHg2NCwgMHg0NiwgMHgwQywgMHgwRCwKKwkgMHgwMiwgMHg2NSwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwKKwkgMHhGOSwgMHgwMSwgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4NCwgMHgwMSwgMHhGQSwgMHg2NiwgMHg0NCwgMHgyNiwgMHg0NiwgMHgwNiwgMHhGQSwKKwkgMHgwNiwgMHhGNCwgMHgwMCwgMHhGMiwgMHg4MCwgMHhGQywgMHg0MCwgMHg0NSwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQywgMHg0NCwgMHgwRiwgMHgyNiwgMHgxNCwgMHgwMCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NCwKKwkgMHgxRSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHg2RiwgMHgwMCwgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgyMiwgMHhGQSwgMHhBMywgMHg0NiwKKwkgMHg2QywgMHgwMiwgMHgyQSwgMHhGMCwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMiwgMHhBMywgMHg0NiwgMHgwMCwgMHhCQywgMHgwMCwgMHhGMiwgMHgwMSwgMHgwMiwKKwkgMHg2NCwgMHgwMCwgMHg0NCwgMHg0QywgMHgzRiwgMHhGMCwgMHg2MCwgMHg0MywgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgzRiwgMHhGMiwgMHgyNiwgMHg0NiwgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHg1NywgMHgwNywgMHg4MCwgMHhGQywgMHgxQiwgMHhGMiwKKwkgMHgwNiwgMHhGMiwgMHg2MCwgMHg0MSwgMHgyMywgMHg0NiwgMHgxRSwgMHhGNCwgMHgxQiwgMHhGMCwgMHgwNiwgMHhGMCwgMHhDMSwgMHg4MSwgMHgwNiwgMHhGQSwKKwkgMHgwNSwgMHhGQSwgMHg5QiwgMHhGQSwgMHg2NSwgMHg0NCwgMHgzRiwgMHhGQSwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGQywgMHg2MywgMHg0NiwgMHgwMSwgMHhGMiwKKwkgMHgxMCwgMHg2MSwgMHhGMiwgMHhBNCwgMHgwMSwgMHhGQSwgMHhDOCwgMHg4MywgMHgwMiwgMHg2NCwgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwKKwkgMHgwNiwgMHg0NSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywKKwkgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywKKwkgMHgwNSwgMHhGQSwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyQywgMHg0NCwKKwkgMHgwNCwgMHgyNywgMHgxNiwgMHgwMCwgMHgyMywgMHg0NiwgMHgxRSwgMHhGMiwgMHg5RSwgMHhGQywgMHg2MCwgMHg0NiwgMHg0NiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgyNiwgMHg0NiwgMHgyQywgMHg0MywgMHgyQSwgMHhGQywgMHgwNiwgMHhGNCwgMHgwMCwgMHg2NCwKKwkgMHgwMCwgMHhGQSwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxRCwgMHgwMCwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgxRSwgMHhGMCwgMHg5RSwgMHhGQywKKwkgMHgwMCwgMHg2MywgMHgzMywgMHg4NSwgMHhBMywgMHg0NiwgMHgwRCwgMHgwMywgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgwRiwgMHg2NSwgMHhBNCwgMHg4NSwKKwkgMHhENCwgMHg4NCwgMHgyMiwgMHhGQSwgMHhBMywgMHg0NiwgMHhBMiwgMHhGRiwgMHhBRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHhDNSwgMHg2MCwgMHg1QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgzMiwgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHg1QywgMHgwMCwgMHgwMSwgMHgyQiwgMHgyRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyQywgMHgwMCwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg4QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwKKwkgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwKKwkgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHhCOCwgMHhGMSwKKwkgMHgyNywgMHg2MCwgMHg4RSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwKKwkgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwRiwgMHhCNCwgMHhEQywgMHg4NSwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg4QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQiwgMHgwMywgMHgwNywgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywKKwkgMHhBMiwgMHhEQiwgMHgwOSwgMHgwNCwgMHhDNiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCOCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QSwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgxMiwgMHgwMCwKKwkgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5QSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMiwgMHgzQiwgMHgxMSwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHg5QywgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwKKwkgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDNiwgMHg2MCwgMHg4NSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhCRiwgMHg2MCwgMHhFQiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHhGMiwgMHg1OCwgMHg2MywgMHg2MCwgMHg0NywgMHgwMSwgMHgyNywgMHg2NCwgMHg2MywgMHgzMSwgMHg2MCwgMHgyOCwgMHg2MiwgMHg2MSwgMHg1QywKKwkgMHhBMiwgMHhEOSwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHhGOCwKKwkgMHg4MywgMHhGQSwgMHg4MiwgMHhGOCwgMHhBNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHg1RSwgMHg2MywgMHgwNCwgMHgwMywgMHg2NCwgMHg2MywgMHgwMywgMHhCMCwKKwkgMHgwMiwgMHgzQSwgMHg2QywgMHg2MywgMHgzRiwgMHhGMiwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwKKwkgMHhBNiwgMHg0NiwgMHgwNywgMHhGOCwgMHg4NiwgMHhGQSwgMHg4NSwgMHhGOCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgzMSwgMHg2MCwgMHgyOCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBOSwgMHhGNSwgMHgwMCwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHgzMSwgMHhGMCwgMHgzOSwgMHgxOCwgMHg2NiwgMHg0MSwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwKKwkgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwKKwkgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwKKwkgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHgxRSwgMHg2MCwgMHhCQywgMHg2MSwgMHhBMSwgMHhEMywgMHgxRSwgMHg2MCwgMHhGRSwgMHg3QywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHgwMywgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHg0OSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMSwgMHhEQiwKKwkgMHhDNiwgMHg2MCwgMHg0MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg3QywgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNCwgMHhEMCwgMHg4NCwgMHhGQiwgMHgwMSwgMHhFMCwgMHg4MywgMHhBOSwgMHhGMywgMHgwMiwgMHhBMywgMHg0MywgMHg5MywgMHhBOSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNSwgMHhENywgMHg4MCwgMHgwNCwgMHhBNSwgMHgwOCwgMHgyNCwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwKKwkgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxQywgMHg2MCwKKwkgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwKKwkgMHhBOSwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwKKwkgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgzMSwgMHhGMCwgMHg2NiwgMHg0MSwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwKKwkgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHgzMSwgMHhGMCwgMHg2NCwgMHg0NSwgMHg0NiwgMHg0MywgMHg2MywgMHg0NiwgMHgwMywgMHhGQSwgMHgwNiwgMHhGMiwKKwkgMHg4NCwgMHhGOCwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGOCwgMHhBMywgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhEQywgMHhGMywKKwkgMHgyQSwgMHhGMiwgMHgwNywgMHhCMCwgMHgwMywgMHgzQSwgMHgyQSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg4MCwgMHgzQSwKKwkgMHgwNSwgMHgwMCwgMHgwRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHhCMCwgMHgwRiwgMHhGMiwgMHgyMCwgMHgwMywgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwKKwkgMHgxRCwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwMCwgMHgzNiwgMHgxMywgMHgwMCwgMHhEQSwgMHg4NSwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2MywgMHhCRCwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHhEMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMiwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhBNSwgMHhEMCwgMHhERSwgMHg4NSwKKwkgMHhEMCwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwQiwgMHgwMiwgMHhGOSwgMHgwMiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NCwgMHgwQSwgMHgwMCwgMHgyNiwgMHg0NiwKKwkgMHg0OCwgMHhGRSwgMHg2NSwgMHg0MCwgMHg0MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgwMywgMHgwMCwgMHgwOCwgMHhGRSwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyNiwgMHg0NiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHgxOCwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgyQSwgMHhGQSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHhDNywgMHg2MCwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMCwgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgyMCwgMHgwMCwKKwkgMHgyQywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgxQiwgMHgwMCwgMHhDRCwgMHg4MSwgMHhERCwgMHg4MSwgMHgxOCwgMHgwMywKKwkgMHgxNywgMHgwMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxNCwgMHgwMCwgMHgwMSwgMHg2MSwgMHgxMywgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwKKwkgMHhBMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHgyMywgMHgwMCwKKwkgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgxOCwgMHgzNiwgMHgxRiwgMHgwMCwgMHhDNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHhGMCwgMHhFQiwgMHhGMSwgMHg2NCwgMHg0NCwgMHg2MCwgMHgyMiwgMHgxOSwgMHgwMCwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwKKwkgMHhGRCwgMHhBMCwgMHgyQSwgMHhGMiwgMHgwMywgMHgwMiwgMHgwOCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMiwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHhFQywgMHhGMSwgMHgwQiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHgwOCwgMHgwMiwgMHhFRCwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHgwRiwgMHhGMCwgMHgwMywgMHgwMiwgMHhDNywgMHg2MCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHhBQSwgMHg2MCwKKwkgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHg0RiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEMCwgMHg0QiwgMHgwMiwgMHg2NCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGOCwgMHg3RiwgMHgwOCwgMHgwMiwgMHg1QSwgMHhEMCwgMHgyNiwgMHg0NiwKKwkgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHgyMCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwQiwgMHgwMCwgMHhENCwgMHg4MCwgMHgxRCwgMHg2MCwKKwkgMHg2MCwgMHg2NCwgMHgxNiwgMHgwMiwgMHg1QSwgMHhEMCwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHg2NSwgMHg0NCwgMHg4OCwgMHgzQSwgMHgwNywgMHgwMCwgMHg3NywgMHgzNywgMHgwOCwgMHgwMCwgMHg3OCwgMHgzNywgMHgwNiwgMHgwMCwKKwkgMHg4RSwgMHgzNywgMHgwNCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg4MSwgMHgzQSwgMHgyOCwgMHgwMCwgMHg4MCwgMHgzNywgMHgwMCwgMHg2MSwgMHgyNSwgMHgwMCwKKwkgMHhENCwgMHg4MCwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwgMHgyMCwgMHgwMiwgMHhEMCwgMHg4MCwgMHg1QSwgMHhEMCwgMHgxRCwgMHgwMiwKKwkgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NywgMHg3RiwgMHhCNCwgMHhGRCwgMHhBMCwgMHgwOSwgMHgwMywgMHgxNywgMHgwNywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwKKwkgMHg0NywgMHgwMCwgMHgyMywgMHhGMCwgMHg2MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0MiwgMHgwMCwgMHgwRiwgMHhGMiwgMHgzMiwgMHg0MCwKKwkgMHgwMiwgMHgyNiwgMHgzRSwgMHgwMCwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMiwgMHhGQiwgMHhFQiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNywgMHg2MCwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgxMiwgMHgwMCwgMHhCOCwgMHhGMSwgMHgyNywgMHg2MCwgMHhBMCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwNCwgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHgwNCwgMHgwMCwgMHg4QSwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHg2RSwgMHgwMCwgMHgwRiwgMHhGMiwgMHg4MSwgMHhGMSwgMHgyQSwgMHhGMiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwKKwkgMHgxMiwgMHgwMCwgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NCwgMHg2MywgMHhCRCwgMHhEMiwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MiwgMHhGMSwgMHgwOCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhBMywgMHhEMiwgMHg4MywgMHhGMSwgMHgwNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHg1NiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0OCwgMHgzNiwgMHg1MSwgMHgwMCwKKwkgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMiwgMHhGQiwgMHg1OSwgMHgwMCwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgyNiwgMHg0NiwgMHgwMCwgMHhCMCwgMHgzNiwgMHgxNSwgMHgwMCwgMHgxMCwgMHgzNiwgMHgxMywgMHgwMCwgMHgzMCwgMHgzNiwKKwkgMHgxMSwgMHgwMCwgMHhDMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHhBMCwgMHgzQSwgMHgxMiwgMHgwMCwgMHg4MSwgMHhGMSwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgzNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwgMHgzMiwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMiwgMHhEQiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHgwMCwgMHg1MCwgMHgzQSwKKwkgMHgwNSwgMHgwMCwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MCwgMHgzQSwgMHgwNSwgMHgwMCwKKwkgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg4MCwgMHgzQSwgMHgxNSwgMHgwMCwgMHg4MSwgMHhGMSwKKwkgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MiwgMHhGMSwgMHgxNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MywgMHhGMSwKKwkgMHgxMCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRCwgMHgwMiwgMHhERiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHgwMywgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDNSwgMHg2MCwgMHg1OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxRSwgMHgwMCwgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxOSwgMHgwMCwKKwkgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNiwgMHg0NiwKKwkgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgyMywgMHhGMiwgMHgxMCwgMHhCRCwgMHhCNCwgMHg5QywgMHgzRiwgMHhGMiwKKwkgMHgyMywgMHhGOCwgMHgzRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHhDQiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MCwgMHhGQiwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1RiwgMHhGQiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NiwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyNiwgMHg2MiwKKwkgMHhDOSwgMHg2MCwgMHhDNywgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwMSwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHgxNCwgMHg2MywgMHgwMSwgMHg2MCwgMHhDNCwgMHg2MSwgMHgyOCwgMHg2MCwgMHgzRSwgMHg2NCwKKwkgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMCwgMHg2MCwgMHg4OCwgMHg2MywgMHgyNywgMHg2MCwgMHhCNCwgMHg2MSwgMHgyOCwgMHg2MCwKKwkgMHg1NCwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NSwgMHhBOSwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgzNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgyMiwgMHg2NCwgMHgzNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMiwgMHg0NSwgMHgyOCwgMHg2MCwgMHgzQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2NywKKwkgMHhCNCwgMHg4NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg5NCwgMHg4NSwgMHg0NSwgMHg1MiwgMHhGRiwgMHg2MCwgMHhFNywgMHg2NSwgMHgzMiwgMHg0MSwKKwkgMHhBNSwgMHg4MSwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwRCwgMHgwMCwgMHgwOCwgMHg2NSwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgwOCwgMHgwMCwgMHgyOCwgMHg2MCwKKwkgMHgzMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhCNSwgMHg4MSwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhCNSwgMHg4MSwgMHg0MSwgMHg1MiwKKwkgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgzMSwgMHg2MCwgMHgxOCwgMHg2MywgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwKKwkgMHgwMSwgMHhCNSwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMywgMHhCNCwgMHg2NSwgMHg1QywgMHhBMywgMHhEOSwgMHgzMSwgMHg2MCwgMHgxQSwgMHg2MywKKwkgMHgwMiwgMHhBOCwgMHhBMywgMHhEQiwgMHgxQiwgMHgwMiwgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgxQywgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgzMSwgMHg2MCwgMHgyNCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHhDOCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgxRSwgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgzMSwgMHg2MCwgMHgyNiwgMHg2MywgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyMCwgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgwMSwgMHg2MCwgMHg5MCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyMiwgMHg2MywgMHhBMywgMHhEQiwgMHgwOCwgMHgwMCwgMHgwQSwgMHg2NCwgMHgzMSwgMHg2MCwKKwkgMHgyMCwgMHg2MywgMHhBMywgMHhEQiwgMHgwMSwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyMiwgMHg2MywgMHhBMywgMHhEQiwgMHgyRCwgMHg2MCwgMHgxQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMSwgMHg2NCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQSwgMHgwMywgMHgwMCwgMHgzMSwgMHg2MCwgMHgwRSwgMHg3QywgMHhBNCwgMHhEQiwKKwkgMHgxMiwgMHg2MCwgMHgyOCwgMHg2MywgMHhCQSwgMHhGMywgMHgwRSwgMHg2MSwgMHg2MCwgMHg0NSwgMHg2NSwgMHg0NCwgMHhFOCwgMHg4NSwgMHgwNSwgMHg2NCwKKwkgMHhDRCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhGOCwgMHgwMiwgMHgyRCwgMHg2MCwgMHg3OCwgMHg2MSwgMHgyNywgMHg2MCwKKwkgMHhCNiwgMHg2NCwgMHgyMCwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHhCRCwgMHhGMSwgMHg4MCwgMHhGOSwgMHgxQSwgMHg2MywKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0MCwgMHgwMSwgMHg2NCwgMHg4NywgMHhGQiwKKwkgMHgyOCwgMHg2MCwgMHhDQywgMHg2MSwgMHhBMSwgMHhEMywgMHgyRSwgMHg2MCwgMHg5NiwgMHg2MSwgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwgMHgwNCwgMHgyNCwKKwkgMHgwRiwgMHgwMCwgMHhFMCwgMHg4NCwgMHg0MSwgMHg5MSwgMHgyRCwgMHg2MCwgMHhDQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwKKwkgMHhDNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHg1OSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwKKwkgMHhFNSwgMHhGMywgMHg3RiwgMHhGQiwgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgxMCwgMHg2MCwKKwkgMHg1QywgMHg2NSwgMHgwRCwgMHgwMywgMHgxQiwgMHg2MCwgMHhDRSwgMHg2MywgMHhFNSwgMHhGMywgMHhBMywgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHhFNSwgMHhGOSwgMHg3RiwgMHhGOSwgMHhFNSwgMHhGMywKKwkgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHhCQSwgMHhGMywgMHg2MSwgMHg0NSwKKwkgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwOCwgMHgwMywgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgyNCwgMHgwMiwgMHgwMCwgMHhERiwgMHg4MywgMHhGQSwgMHgwMSwgMHhFNSwgMHhGRCwgMHg3RiwgMHhGRCwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDOCwgMHg2MCwgMHhGNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGMSwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwQywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwNywgMHg2NCwKKwkgMHhEMCwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHgzNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhFMywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwKKwkgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBRSwgMHg2MSwKKwkgMHgwQywgMHgwMCwgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBMiwgMHg2MSwgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHg2OCwgMHg2MCwgMHg5NiwgMHg2MSwgMHgwMiwgMHgwMCwgMHg2OCwgMHg2MCwgMHg4QSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwKKwkgMHhCOCwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhCRSwgMHg2MSwgMHhFNCwgMHhGMywKKwkgMHgwMCwgMHg2NiwgMHgwMCwgMHhBOCwgMHgwNCwgMHg2NSwgMHgwMSwgMHgwMywgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHg1NSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHg3QiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHhBMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhDNSwgMHhGRSwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwOCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg4QiwgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgxQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHhERiwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBOCwgMHg2MywgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwgMHhGMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QiwgMHhGMywgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDOSwgMHg2MCwKKwkgMHhGMywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhERSwgMHhGRSwgMHgwRSwgMHgwNCwgMHgwOSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGMiwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwKKwkgMHgxRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgwNiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGMCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHhEQSwgMHhGRSwgMHgyNCwgMHg2MCwgMHgzNCwgMHg2MSwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg0NiwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg0QywgMHg2MSwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg1OCwgMHg2MSwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDNSwgMHhGRSwgMHgwRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEMywKKwkgMHgwRSwgMHg1NywgMHgyNCwgMHgwMCwgMHgwRSwgMHhGMiwgMHg0NCwgMHg0QywgMHg4MCwgMHhCMCwgMHgxMCwgMHhCMCwgMHgwQiwgMHgwMywgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgxMywgMHgwMCwgMHgxMiwgMHgwMiwgMHhGMCwgMHgzNywgMHgwOSwgMHgwMCwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHhBMiwgMHhGRiwgMHhCMCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhCMCwgMHhGQiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQywgMHg0NCwgMHhBQywgMHg4NiwgMHgwOSwgMHhGMCwKKwkgMHhEOSwgMHgwMiwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywKKwkgMHgxMCwgMHg2MCwgMHg0QywgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MywgMHgxMCwgMHg2MCwKKwkgMHg5RSwgMHg2MiwgMHhBMiwgMHhERCwgMHgxMCwgMHg2MCwgMHg0QSwgMHg2MiwgMHhDRiwgMHg2MCwgMHgxNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgyNCwgMHg2MiwgMHhDRSwgMHg2MCwgMHhFMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwgMHhGQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2OCwgMHg2MCwKKwkgMHg3RSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHhCOCwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwKKwkgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhCRSwgMHg2MSwgMHhFNCwgMHhGMywgMHgwMCwgMHg2NiwgMHgwMCwgMHhBOCwgMHgwNCwgMHg2NSwgMHgwMSwgMHgwMywKKwkgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHg1NSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHg2MCwgMHhFQywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCQSwgMHhGRSwgMHgyNywgMHg2MCwgMHhCNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHhBOCwKKwkgMHgwMiwgMHhBOCwgMHgwNCwgMHgwMywgMHgwRiwgMHgwMiwgMHhDRSwgMHg2MCwgMHhCMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHhFRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGMywgMHhCNCwgMHhBNSwgMHhEQiwgMHhDQiwgMHg2MCwKKwkgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHgxQSwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHhERCwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwMCwgMHg2MywgMHhBMCwgMHhERCwgMHgxMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhCQSwgMHhGRSwgMHgwMiwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywgMHhGMiwgMHhGQiwKKwkgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg4MSwgMHhGQiwgMHg4MiwgMHhGQiwgMHg4MywgMHhGQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgwNCwgMHgyQiwKKwkgMHgxOSwgMHgwMCwgMHg5QiwgMHhGRSwgMHgwOSwgMHgwNCwgMHhCQiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwRCwgMHg2NCwgMHg1MywgMHhGQiwKKwkgMHgyOSwgMHg2MCwgMHhBNCwgMHg2NCwgMHg1NCwgMHhGQiwgMHgxMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNywgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwMiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBMiwgMHhEMywKKwkgMHhBNSwgMHhEMSwgMHg2MCwgMHg0MCwgMHgwQywgMHgyMiwgMHgwNCwgMHgwMCwgMHgwNCwgMHg2MSwgMHhEMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwNSwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwKKwkgMHg5NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQywgMHgyNiwgMHgxMSwgMHgwMCwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwgMHhDMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwKKwkgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg4OCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHhEMywgMHg4MCwgMHgyMCwgMHg0NCwgMHgwNSwgMHgwMywgMHgxMCwgMHhCQywgMHg0MCwgMHg0MCwgMHhDRCwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4OSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgyMCwgMHg0NCwgMHgwNiwgMHgwMiwgMHhENCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMiwgMHg3MiwgMHgwMCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MiwgMHg1QSwgMHhEMSwgMHgwNiwgMHg2MywKKwkgMHhBNCwgMHhEMSwgMHhDMywgMHg4MywgMHg3RiwgMHhGOSwgMHhCRCwgMHhEMSwgMHg4MSwgMHhGOSwgMHhCRCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGOSwKKwkgMHhCRCwgMHhEMSwgMHg4MywgMHhGOSwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMSwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwKKwkgMHhGRSwgMHhCMSwgMHhBMCwgMHhEOSwgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDOSwgMHg4MSwgMHg1OCwgMHhEOSwgMHhGQywgMHgwMiwgMHgxRSwgMHgwMCwKKwkgMHhFNSwgMHhGMywgMHg3RiwgMHhGQiwgMHgyOSwgMHg2MCwgMHhBNCwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHgyRCwgMHg2MCwKKwkgMHg3QSwgMHg2MywgMHgwMiwgMHgwMiwgMHgyNywgMHg2MCwgMHhCOCwgMHg2MSwgMHhBMSwgMHhEMywgMHhCRCwgMHhEQiwgMHhEQywgMHg4NCwgMHhGRSwgMHhCNCwKKwkgMHg1OSwgMHhEMSwgMHhDOCwgMHg4NCwgMHhCRCwgMHhEOSwgMHhGQywgMHgwMiwgMHhFRCwgMHhGMywgMHg3MiwgMHg0NSwgMHhFQywgMHhGMywgMHg5NCwgMHg4MywKKwkgMHg4MywgMHhGRCwgMHg5NCwgMHg4MywgMHg4MiwgMHhGRCwgMHg2NSwgMHg1RiwgMHgwMiwgMHg2NCwgMHg4MSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDQywgMHg2MCwgMHgyNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxOCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQywgMHg2MCwKKwkgMHg0RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDQywgMHg2MCwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywKKwkgMHhGMiwgMHhGQiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgxQSwgMHg2MCwgMHg0MCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwKKwkgMHgyMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHg0MCwgMHg2MSwgMHg3NSwgMHg2MCwgMHgzMCwgMHg2NSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhFMCwgMHg4NCwgMHgwMiwgMHgwMiwgMHgwMywgMHg2MCwgMHhFOCwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwNCwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OSwgMHhGMywgMHg3QSwgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHg1MiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhCRiwgMHhGMSwKKwkgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgxMCwgMHgyNiwgMHg2NywgMHgwMCwgMHgwMCwgMHg2NCwgMHhCNSwgMHhGQiwgMHhCNiwgMHhGQiwgMHhCNywgMHhGQiwgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwKKwkgMHhCRCwgMHhGMSwgMHg4MCwgMHhGOSwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhFNiwgMHhGMSwKKwkgMHg4NiwgMHhGOSwgMHgyOCwgMHg2MCwgMHhEMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwKKwkgMHgwMSwgMHg2MCwgMHhCMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHgwMiwgMHg2NCwKKwkgMHg2MCwgMHg0MSwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2MywgMHhCRCwgMHhEMywgMHhBMywgMHhEMywgMHhGRiwgMHhCNSwgMHg2NSwgMHg1QywgMHhDRCwgMHg4MSwKKwkgMHg4MCwgMHhCRiwgMHgwRSwgMHgwMywgMHg4MCwgMHhCRiwgMHhCRCwgMHhEQiwgMHg2NSwgMHg0NCwgMHhDOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywKKwkgMHg2MCwgMHg0NSwgMHhDRCwgMHg4MSwgMHhBMywgMHhEMywgMHgwNywgMHgwMywgMHhDRCwgMHg4MSwgMHg4MCwgMHhCRiwgMHgwMSwgMHgwMywgMHg4MCwgMHhCQywKKwkgMHg2MCwgMHg0NywgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MSwgMHgyRCwgMHg2MCwgMHgyQSwgMHg2MywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0NywgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywKKwkgMHg2MCwgMHg0NSwgMHhDOSwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGMiwgMHgwMiwgMHg2NSwgMHg0NCwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwQSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgzMiwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHg1MCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg3QywgMHhGQiwKKwkgMHgyOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHg4NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRCwgMHg2MCwgMHg0MCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRCwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2MSwgMHhBMSwgMHg4NCwKKwkgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHgwMCwgMHhCQiwgMHhGRSwgMHhDQiwgMHg2MCwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHgwNywgMHgzNiwgMHgwMSwgMHg2NSwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywgMHg2MCwgMHg0NiwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywKKwkgMHhCNiwgMHhGOCwgMHgwMiwgMHhBNiwgMHg2NiwgMHg0NCwgMHhGQywgMHgxRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwNywgMHgzQSwgMHgwNCwgMHgwMCwgMHhBOSwgMHhGMywgMHgwNCwgMHg2NSwgMHg2MCwgMHg0NiwgMHhCNiwgMHhGOCwgMHg2NCwgMHg0NiwKKwkgMHhBOSwgMHhGMywgMHgzMiwgMHg0MSwgMHg2MCwgMHg0NSwgMHgwOCwgMHhCMSwgMHg2NiwgMHg0MSwgMHgxNywgMHgwMywgMHg2NSwgMHg0NiwgMHgyOSwgMHg2MCwKKwkgMHhBMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwKKwkgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwKKwkgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMiwgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg1MiwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MiwgMHgwMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFNywgMHg2MCwgMHg1OCwgMHg0RiwgMHg1MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQiwgMHg2MCwgMHgxMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHhCQiwgMHhGRSwgMHgyMCwgMHg0NCwgMHgwNCwgMHgyNywgMHgxMiwgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMiwgMHgwMCwgMHhEQiwgMHhGRSwgMHgxNiwgMHgwMCwKKwkgMHgwRiwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwKKwkgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwMywgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHhDMSwgMHhGRSwgMHgxRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxNSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhCQiwgMHhGRSwgMHhDRiwgMHg2MCwgMHhENiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NSwgMHhBOSwgMHhGMywgMHg2NiwgMHg1QywKKwkgMHg2MCwgMHg0NiwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHhCNiwgMHhGOCwgMHgwMiwgMHhBNiwgMHg2NiwgMHg0NCwgMHhGQywgMHgxRiwgMHg2NCwgMHg0NiwKKwkgMHg3OSwgMHhGMSwgMHhBOSwgMHhGMywgMHg3QSwgMHhGOSwgMHgwMiwgMHhBNCwgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwKKwkgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwKKwkgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwKKwkgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhBOSwgMHhGMSwgMHgwMiwgMHg2NCwgMHhDMCwgMHg4NSwgMHgwQywgMHg2MSwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgxNSwgMHgwMCwgMHgyOSwgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhEMywgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwgMHhCMCwgMHg4MywgMHgwNiwgMHhGQywgMHg2NiwgMHg0MiwgMHhGRSwgMHhBMiwKKwkgMHg2MiwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgxRCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwQiwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgwMSwgMHg2NSwKKwkgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDRSwgMHg2MCwgMHg3NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGMSwKKwkgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRSwgMHg2MCwgMHg5QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgxRSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwNiwgMHg2NCwgMHhEQywgMHhGQiwKKwkgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHhFNSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHhBOSwgMHhGMSwgMHg2NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwKKwkgMHgwNCwgMHg2MywgMHgwNCwgMHg2MSwgMHgwMSwgMHg2MCwgMHhDRSwgMHg2NCwgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHg2NSwgMHg0NiwKKwkgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHg2OSwgMHhGQiwKKwkgMHhBOSwgMHhGMSwgMHgwRSwgMHg2NCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0MiwgMHgwMiwgMHhBMiwgMHg2MiwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwKKwkgMHhGQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhBOCwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2NCwgMHgwNywgMHgwMywgMHhBMCwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MywKKwkgMHhBMCwgMHhERCwgMHgwMSwgMHg2NCwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhDQSwgMHg2MCwgMHhGQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHg2MCwgMHgzQSwgMHg2NCwgMHhBMCwgMHhEMywgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQSwgMHg0MiwgMHgwMCwgMHgxOCwgMHg2NSwKKwkgMHgyMiwgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGMCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMSwgMHhBOCwKKwkgMHhFMCwgMHg4NSwgMHgyNywgMHgwMiwgMHhDNywgMHg4MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg4MSwgMHhBOCwgMHgwRCwgMHhBOCwgMHgyMSwgMHgwMiwKKwkgMHgyMCwgMHgwMiwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHgwMCwgMHhBOCwgMHg2MCwgMHhBOCwgMHgxQiwgMHgwMiwgMHhCRCwgMHhEMywgMHgxOSwgMHgwMiwKKwkgMHgxRCwgMHhBOCwgMHhBMywgMHhEMSwgMHgxNiwgMHgwMiwgMHhFMywgMHhGOSwgMHgwMSwgMHg2MCwgMHhCOCwgMHg2NCwgMHg2MywgMHg0MSwgMHgwQSwgMHg2MywKKwkgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHg1OSwgMHhEMSwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg2NCwgMHg1RSwKKwkgMHhENiwgMHhGQiwgMHg1OSwgMHhEMSwgMHgyOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHhBMCwgMHhEOSwgMHgyOCwgMHg2MCwgMHhENiwgMHg2NCwgMHhBMCwgMHhEOSwKKwkgMHgyMywgMHgwMCwgMHgyOCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhFMywgMHhGQiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHg2OCwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxMSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBRSwgMHg2MSwgMHgwQywgMHgwMCwKKwkgMHgwMywgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwgMHhBMiwgMHg2MSwgMHgwNywgMHgwMCwgMHgwMiwgMHgzQSwgMHgwMywgMHgwMCwgMHg2OCwgMHg2MCwKKwkgMHg5NiwgMHg2MSwgMHgwMiwgMHgwMCwgMHg2OCwgMHg2MCwgMHg4QSwgMHg2MSwgMHgzQywgMHg2MCwgMHgwMCwgMHg2NiwgMHgwMSwgMHg2MCwgMHhCOCwgMHg2NCwKKwkgMHgwQSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMSwgMHg2MCwgMHhCRSwgMHg2MSwgMHhFNCwgMHhGMywgMHgwMCwgMHg2NiwKKwkgMHgwMCwgMHhBOCwgMHgwNCwgMHg2NSwgMHgwMSwgMHgwMywgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHg1NSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhBMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHg2MCwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2MCwgMHhEMCwgMHg2MywgMHgxOSwgMHg2MCwKKwkgMHg4NCwgMHg2NCwgMHhBMywgMHhEQiwgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg4MSwgMHhGQiwgMHg4MiwgMHhGQiwgMHg4MywgMHhGQiwgMHgzMSwgMHg0NCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMCwgMHg2MCwgMHhEMCwgMHg2MywgMHgwMSwgMHg2MCwgMHgxMCwgMHg2NSwgMHhBMywgMHhEMywgMHhBNSwgMHhEMSwKKwkgMHgwNCwgMHhBNCwgMHhBMywgMHhEQiwgMHhEMCwgMHg4MCwgMHhBMCwgMHhEMSwgMHgwQSwgMHgwNiwgMHg0MSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDQywgMHg2MCwgMHg1RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHg0NywKKwkgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwNywgMHgwRSwgMHg2MSwKKwkgMHg0MSwgMHhEMywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhEMywgMHgwMiwgMHg0MiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHgyMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhEMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHg0NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMywgMHg4MSwgMHhGQiwgMHhCRCwgMHhEMywgMHg4MiwgMHhGQiwKKwkgMHhBMywgMHhEMywgMHg4MywgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwKKwkgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMCwgMHg2MCwgMHg3OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHhGRSwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwKKwkgMHg1RiwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHhCQywgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHg4MCwgMHg3RSwgMHhGOCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwKKwkgMHgyQiwgMHhGQSwgMHhCMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwNiwgMHg2MywgMHgzRiwgMHhGQywKKwkgMHgxRiwgMHg2MCwgMHg1NCwgMHg2MSwgMHhEQywgMHhGMywgMHhBMSwgMHhEMywgMHgwMywgMHhBOCwgMHhBQywgMHg4MywgMHgwRiwgMHgwMiwgMHgwRSwgMHgwMywKKwkgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHhBMSwgMHhEMSwgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGQywgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwKKwkgMHgwQiwgMHhGOCwgMHgxRiwgMHg2MCwgMHg1NCwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyOCwgMHgwMCwgMHgyOCwgMHg2MCwgMHgyRSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgxNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHhDNywgMHgwMCwKKwkgMHgwMywgMHgzNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgzNiwgMHgxMCwgMHgwMCwgMHgwNSwgMHgzNiwgMHhDMSwgMHgwMCwgMHgwNiwgMHgzNiwgMHgwMSwgMHgwMCwKKwkgMHgwQiwgMHgwMCwgMHg4MCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwMSwgMHg2MywgMHgwQSwgMHhGQywgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgyRCwgMHg2MCwKKwkgMHg1NCwgMHg2MiwgMHgwMywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwQSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwMSwgMHg2MywgMHgwQSwgMHhGQywKKwkgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgyRCwgMHg2MCwgMHg1NCwgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQywgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHg2OSwgMHhGQiwgMHg0MywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2NCwgMHhBNCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwKKwkgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEMSwgMHg2MCwgMHgyRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1NiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgxNiwgMHgwMiwgMHgwMCwgMHhBOCwKKwkgMHgxQSwgMHgwMiwgMHgxOSwgMHgwMiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEMywgMHg2MCwKKwkgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOSwgMHg2MCwgMHg2OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHg4MCwgMHhBOCwKKwkgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHhFNCwgMHgwMywgMHg0NCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwKKwkgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywKKwkgMHgwOSwgMHhGQywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxQSwgMHgwMCwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHgwMywgMHgwMCwgMHhEMCwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyRCwgMHg2MCwgMHg1NiwgMHg2MiwgMHgwQiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHg1NCwgMHg2MiwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhBOSwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgyMiwgMHg2NCwgMHgzNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgwMSwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQywgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwKKwkgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhEMSwgMHg2MCwgMHhFRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQiwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwKKwkgMHgwMSwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgwNCwgMHgwMiwgMHgwMCwgMHhBOCwgMHgwMiwgMHgwMiwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwMCwKKwkgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwKKwkgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwKKwkgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgyRiwgMHhGMCwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMywgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHgzNCwgMHhGQSwKKwkgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgxQywgMHhGMCwgMHgxMywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMywgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgwQiwgMHhGQSwgMHgwMSwgMHg2MywgMHg2OSwgMHhGRCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQywgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEMiwgMHg2MCwgMHg4RSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1MSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHgwMSwgMHhBOCwKKwkgMHgwQiwgMHhGMiwgMHgwNCwgMHhBOCwgMHgxQSwgMHgwMiwgMHgwMCwgMHhBOCwgMHgxOCwgMHgwMiwgMHgxNywgMHgwMiwgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEMywgMHg2MCwKKwkgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOSwgMHg2MCwgMHg2OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwKKwkgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwKKwkgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1NiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQiwgMHgzQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHgwQiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHg1NiwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHg2MSwgMHg0MywgMHhBNSwgMHhEMiwgMHg2MCwgMHg0MCwgMHgwQiwgMHgyQSwgMHgzMCwgMHgwMCwgMHg4NSwgMHgzQSwgMHgzMCwgMHgwMCwKKwkgMHg2MCwgMHg0MSwgMHg2NSwgMHg0NCwgMHgwQSwgMHhBNCwgMHhBMCwgMHhEMCwgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHg2NCwgMHg0MCwgMHgxOCwgMHgyNiwKKwkgMHgwNiwgMHgwMCwgMHhBMiwgMHhERiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2MSwgMHg0NCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgwMiwgMHhBNCwgMHgyRSwgMHg2MCwgMHg2MiwgMHg2MSwgMHhBMSwgMHhEMSwKKwkgMHhERiwgMHg4MywgMHhDMCwgMHg4NCwgMHhBMSwgMHhEQiwgMHhEMCwgMHg4MSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwKKwkgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwKKwkgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhERiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNiwgMHgwMSwKKwkgMHg0NSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRSwgMHg2MCwgMHhFQSwgMHg3QywgMHgyRSwgMHg2MCwgMHhERSwgMHg2MywgMHhBMywgMHhEOSwKKwkgMHg2NCwgMHg0MSwgMHgyOSwgMHg2MCwgMHhBNCwgMHg2MywgMHhCRCwgMHhEMywgMHgwMCwgMHg3QywgMHgwMywgMHgxQiwgMHgyNywgMHg0MywgMHgxMCwgMHhBMywKKwkgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg1RiwgMHhBMSwgMHhEQiwgMHg2NSwgMHg0NCwgMHhCRCwgMHhEMSwgMHhDOCwgMHg4NCwKKwkgMHg1OSwgMHhEOCwgMHhGQywgMHgwNSwgMHgyNywgMHg0MSwgMHgxMCwgMHhBMSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHgwMSwgMHgyNiwKKwkgMHhERCwgMHg4MSwgMHg0MSwgMHg0QywgMHg1OSwgMHhEMSwgMHg3QywgMHg0NCwgMHhCMCwgMHg4NCwgMHg1OSwgMHhEMSwgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwKKwkgMHhCMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMiwgMHg2NywgMHg0NCwgMHg1RCwgMHgwMCwgMHgyRCwgMHg2MCwgMHhFNiwgMHg2MywgMHhERCwgMHg2MCwKKwkgMHgxOCwgMHg2NCwgMHhCRCwgMHhEQSwgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQSwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEQSwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQSwgMHgyQywgMHg0MSwgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywKKwkgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwRSwgMHgwMCwKKwkgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwKKwkgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgwNCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhCRCwgMHhEQSwKKwkgMHgyRCwgMHg2MCwgMHhFNiwgMHg2NCwgMHgyRSwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2MCwgMHhGNSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHhCRCwgMHhEMSwKKwkgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwKKwkgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwKKwkgMHgxMCwgMHhCQiwgMHgwOSwgMHhGQywgMHgyNywgMHg0MiwgMHgwQywgMHhBMiwgMHgyOCwgMHg2MCwgMHgwMiwgMHg2MywgMHhBMiwgMHhEMywgMHhBMywgMHhEMywKKwkgMHgwMCwgMHhCRCwgMHgwMSwgMHg2MywgMHhBQywgMHg4MSwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwMSwgMHgwMywgMHg2MCwgMHg0MywgMHgxQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHhBMCwgMHhERCwKKwkgMHgxMiwgMHg2MSwgMHg1OSwgMHhEQywgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHg2MCwgMHhGRiwgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwQiwgMHgyQSwgMHgwMiwgMHgwMCwgMHgyRCwgMHg2MCwgMHgzMiwgMHg3QywgMHgyRSwgMHg2MCwgMHhFNiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyRSwgMHg2MCwKKwkgMHhERSwgMHg2NCwgMHg0MCwgMHg0OCwgMHhEOSwgMHg4MSwgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNSwgMHgzRiwgMHhGQywgMHhEQiwgMHg4MywgMHgyRSwgMHg2MCwgMHgwOCwgMHg2MiwgMHhBMiwgMHhERCwgMHgwMCwgMHg3QywKKwkgMHg1QSwgMHhEOSwgMHg2MywgMHg0MSwgMHgyRSwgMHg2MCwgMHgwQywgMHg2MywgMHgxMiwgMHg2NSwgMHgwMCwgMHhGNCwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwKKwkgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwKKwkgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywKKwkgMHg2MCwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgwNiwgMHg2NCwKKwkgMHg2OSwgMHhGQiwgMHg0NiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgxQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhENCwgMHg2MCwgMHg2OCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMCwgMHhBOCwgMHg2OSwgMHhGRCwgMHg1QSwgMHgwMywgMHgwQSwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwKKwkgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwNSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhDRiwgMHg2MCwKKwkgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgyMSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0OSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhEMCwgMHg2MCwgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0QSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0OCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwOSwgMHhGMCwgMHgyRSwgMHg2MCwgMHg2NCwgMHg2MywgMHgxMCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHhCRCwgMHhEOSwgMHgwQSwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQywgMHhGMiwgMHhCRCwgMHhEQiwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNCwgMHgwQSwgMHhBNSwgMHgyRSwgMHg2MCwgMHg2MiwgMHg2MSwgMHg2NSwgMHg1QywgMHhBMSwgMHhEOSwgMHg2MCwgMHg0MSwgMHgxQSwgMHg2NSwKKwkgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywKKwkgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHhEMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgwNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg2MSwgMHg0NCwgMHg5NiwgMHhGQiwKKwkgMHgyNywgMHg0NSwgMHgwMiwgMHg2MiwgMHg0NiwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywgMHg1NiwgMHhGQiwgMHg2NCwgMHg0NywgMHg1NSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHg1QywgMHhGQiwgMHgwQywgMHg2MiwgMHg0NiwgMHhEMywgMHg4MCwgMHhGQiwgMHgwQiwgMHhGMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHhBMCwgMHg4NCwgMHg4NSwgMHhGQiwgMHgyNiwgMHg0NiwgMHgzMiwgMHhGMCwgMHg4MSwgMHhGOSwgMHgzMywgMHhGMCwgMHgwRSwgMHg2MywgMHhDNywgMHg4MSwKKwkgMHg4MiwgMHhGOSwgMHgzNCwgMHhGMCwgMHg4MywgMHhGOSwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHgwMSwgMHgyQSwgMHhDOCwgMHg4NCwKKwkgMHg2MCwgMHg0MywgMHgyRCwgMHg2MCwgMHg3OCwgMHg2NCwgMHg1OCwgMHhEOSwgMHg1OSwgMHhEMSwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyOCwgMHg2MCwKKwkgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHg1OSwgMHhEMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHg1MCwgMHg5NCwgMHhBOSwgMHhGMSwgMHhGRiwgMHhGRiwgMHg0NCwgMHg0NywgMHhBNywgMHg0NiwgMHgzNiwgMHhGQSwgMHhCNywgMHhGQywgMHhBNywgMHg0NiwKKwkgMHgxQSwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NywgMHhGQiwgMHgzMSwgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwKKwkgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywgMHgwOCwgMHhGRSwKKwkgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHhBOSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzMSwgMHhGMiwgMHgyNywgMHgwMiwgMHg2NiwgMHg0MSwKKwkgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBOSwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywKKwkgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwKKwkgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg0MywgMHg0NywgMHgwMCwgMHhGNCwKKwkgMHgxOCwgMHg2NSwgMHgwQywgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwKKwkgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwKKwkgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwKKwkgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwKKwkgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhDRiwgMHg4MywgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwgMHg3QSwgMHhGQiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywKKwkgMHg2MCwgMHg0NSwgMHhDRiwgMHg4MywgMHg2NSwgMHg0NCwgMHhGNywgMHgwMiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwKKwkgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2NCwKKwkgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg1MCwgMHg2NCwKKwkgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg3QywgMHhGQiwgMHgyNywgMHg0NCwKKwkgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNiwgMHgwMCwKKwkgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywgMHgwMiwgMHgwMiwKKwkgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwgMHg2MCwgMHg0NywKKwkgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3MCwgMHhGMCwKKwkgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwgMHhFMSwgMHg4MSwKKwkgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg2MCwgMHg0NywgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHhCMCwgMHg4NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg1MCwgMHg5NCwgMHhBNywgMHg0NiwKKwkgMHgzNiwgMHhGQSwgMHhCNywgMHhGQywgMHhBNywgMHg0NiwgMHg4MCwgMHg2MCwgMHgwMywgMHg2NSwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHg2NSwKKwkgMHhBNywgMHg0NiwgMHgwNiwgMHhGMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhGQSwgMHhCNywgMHhGQywKKwkgMHhBNywgMHg0NiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMCwgMHgzMCwgMHhGMCwgMHg2NCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyNywgMHg0NiwgMHgwMywgMHhGQywKKwkgMHgwNCwgMHhGOCwgMHgwNSwgMHhGQSwgMHgyNiwgMHg0NiwgMHhDRiwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwgMHgyOCwgMHg2MCwgMHgzOCwgMHg2MiwgMHhBMiwgMHhEMywgMHgyMCwgMHg0MSwgMHgwMCwgMHhCQywKKwkgMHgyMCwgMHhCOSwgMHgwMSwgMHgwMywgMHg0MSwgMHg0MCwgMHgxRiwgMHg2MCwgMHg1MiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHg2NCwKKwkgMHhDMSwgMHhGRSwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMiwgMHhGQiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHg2NCwKKwkgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgzMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg2MCwgMHhDNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxMCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgzMSwgMHg2MCwgMHgyQywgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwKKwkgMHhEQywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHg2NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwKKwkgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHhBOSwgMHhGMywgMHg2MywgMHg0NSwKKwkgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwKKwkgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QiwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHgyRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2QSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHg0NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHhENywgMHg2MCwgMHg1OCwgMHg0RSwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHgwMiwgMHg2NCwgMHhDMSwgMHhGRSwgMHhEQywgMHhGQiwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhCQywgMHhGMiwgMHhGQiwgMHgwMiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwKKwkgMHhFOCwgMHg2MywgMHgxQSwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHhERCwgMHhDQiwgMHg2MCwgMHgxQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHg1NCwgMHgwMSwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2MywgMHg2OSwgMHhGRCwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxNSwgMHgwMCwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QywgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgyRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwKKwkgMHg4RiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHg3RiwgMHhGMSwgMHg3RSwgMHhGOSwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg4QywgMHhGMywKKwkgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMywgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHhCMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1MSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxOSwgMHg2MCwgMHg4NCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxQSwgMHg2MCwgMHg0NiwgMHg2MywgMHg4MSwgMHhGMywKKwkgMHhCRCwgMHhEQiwgMHg4MiwgMHhGMywgMHhCRCwgMHhEQiwgMHg4MywgMHhGMywgMHhBMywgMHhEQiwgMHgwMSwgMHg2MCwgMHgxMCwgMHg2NSwgMHg2OCwgMHhGMywKKwkgMHhBNSwgMHhEMSwgMHgwNCwgMHhBNCwgMHg2OCwgMHhGQiwgMHhEMCwgMHg4MCwgMHhBMCwgMHhEMywgMHgyMCwgMHgwNywgMHg0MCwgMHg0NywgMHg2MCwgMHg0MSwKKwkgMHgwRSwgMHg2NSwgMHg0NSwgMHhEMywgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgxMCwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHhFQiwgMHgwMiwgMHgyNywgMHg0NCwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MSwgMHhBMSwgMHhEMSwgMHg4MSwgMHhGMywgMHg4MiwgMHhGMSwKKwkgMHhEMCwgMHg4MCwgMHg1OSwgMHhEMywgMHgwOCwgMHgwMiwgMHhEMCwgMHg4MCwgMHg4MywgMHhGMywgMHg1OSwgMHhEMSwgMHgwNCwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHhEOCwgMHg2MCwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHg4MSwgMHhGQiwgMHhCRCwgMHhEMywgMHg4MiwgMHhGQiwgMHhBMywgMHhEMywgMHg4MywgMHhGQiwgMHg1MywgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg1NCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgzMSwgMHg0NCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMSwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMSwgMHg3RiwgMHhCRCwgMHhEQiwKKwkgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwKKwkgMHgwNiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHg4OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhENiwgMHg2MCwgMHhCNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NSwgMHhBNSwgMHhEMywgMHg2NSwgMHg0MSwgMHgxMCwgMHhBMywgMHgwMSwgMHhBNCwKKwkgMHhGRSwgMHhCNCwgMHhDNCwgMHg4NSwgMHhGRSwgMHhBMSwgMHhCRCwgMHhEMywgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENSwgMHg4MCwKKwkgMHgwMiwgMHgwMiwgMHgwNCwgMHgwMywgMHhGOCwgMHgwMSwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwKKwkgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHhCMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhEMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhEOCwgMHg2MCwgMHhENiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2MCwgMHhCQSwgMHg2MSwgMHgxRiwgMHg2MCwgMHgwOCwgMHg2MywgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgyMSwgMHg2MCwgMHgzMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHhBMSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHg3RiwgMHhBMywgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOCwgMHg2MCwgMHhGMywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHgxRiwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOSwgMHg2MCwgMHgxOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHgwNywgMHg2MCwKKwkgMHhEMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMywgMHg4MSwgMHhGQiwgMHhCRCwgMHhEMywKKwkgMHg4MiwgMHhGQiwgMHhBMywgMHhEMywgMHg4MywgMHhGQiwgMHgzMSwgMHg0NCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEOSwgMHg2MCwKKwkgMHg0RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQywgMHhGMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwKKwkgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHg0MiwgMHgwQywgMHhBMiwgMHgyOCwgMHg2MCwgMHgwMiwgMHg2MywgMHhBMiwgMHhEMywgMHhBMywgMHhEMywgMHgwMCwgMHhCRCwgMHgwMSwgMHg2MywKKwkgMHhBQywgMHg4MSwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHhCMCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhCNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwKKwkgMHgwMSwgMHg2MywgMHgwMSwgMHgwMywgMHg2MCwgMHg0MywgMHgxQSwgMHg2MCwgMHgzRSwgMHg2NCwgMHhBMCwgMHhERCwgMHg2MCwgMHhGNSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhGQSwgMHgyMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwRSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQiwgMHgwOSwgMHhGQywgMHgxQSwgMHg2MCwgMHgzRSwgMHg2NCwKKwkgMHhBMCwgMHhEMywgMHgxMiwgMHg2MSwgMHg1OSwgMHhEQSwgMHgxQSwgMHg2MCwgMHg0NiwgMHg2MywgMHhCRCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhCRCwgMHhEMSwKKwkgMHg1OSwgMHhEOCwgMHhBMywgMHhEMSwgMHg1OSwgMHhEOCwgMHgyRSwgMHg2MCwgMHhERSwgMHg2NCwgMHg0MCwgMHg0OCwgMHhEOSwgMHg4MSwgMHhGRiwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNSwgMHgzRiwgMHhGQywgMHhEQiwgMHg4MywKKwkgMHgyRSwgMHg2MCwgMHgwOCwgMHg2MiwgMHhBMiwgMHhERCwgMHgyMCwgMHg3QywgMHg1QSwgMHhEOSwgMHg2MywgMHg0MSwgMHgyRSwgMHg2MCwgMHgwQywgMHg2MywKKwkgMHgxMiwgMHg2NSwgMHgwMCwgMHhGNCwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwKKwkgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwKKwkgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHg2MCwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgxNCwgMHg2NCwgMHg2OSwgMHhGQiwgMHg1NiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHg2NCwgMHhBNCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg0NCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwKKwkgMHgxQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQSwgMHg2MCwgMHgxMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1NywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg1OCwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQiwgMHg2MCwKKwkgMHhDQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg2NiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgyQywgMHgxOCwgMHg1OSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwQSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwKKwkgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwNSwgMHg2NSwgMHhFOSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHhBQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1QSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg3OCwgMHg0MywgMHgwMiwgMHg2MSwgMHgyNCwgMHg2MCwgMHhERCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1QiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwOSwgMHhGMCwgMHgyRSwgMHg2MCwgMHg2NCwgMHg2MywgMHgzMCwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHhCRCwgMHhEOSwgMHgwQSwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwQywgMHhGMiwgMHhCRCwgMHhEQiwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgwQSwgMHhBNSwgMHgyRSwgMHg2MCwgMHg2MiwgMHg2MiwgMHg2NSwgMHg1QywgMHhBMiwgMHhEOSwgMHg2MCwgMHg0MSwKKwkgMHgxQSwgMHg2NSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwKKwkgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHhEMywgMHg2MCwgMHg1OCwgMHg0RCwgMHgwNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg2MSwgMHg0NCwKKwkgMHg5NiwgMHhGQiwgMHgyNywgMHg0NSwgMHgwMiwgMHg2MiwgMHg0NiwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywgMHg1NiwgMHhGQiwgMHg2NCwgMHg0NywKKwkgMHg1NSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg1QywgMHhGQiwgMHgwQywgMHg2MiwgMHg0NiwgMHhEMywgMHg4MCwgMHhGQiwgMHgwQiwgMHhGMCwgMHgwRiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg4NSwgMHhGQiwgMHgxQSwgMHg2MCwgMHgzRSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NywgMHhGQiwgMHgyNiwgMHg0NiwKKwkgMHgzMiwgMHhGMCwgMHg4MSwgMHhGOSwgMHgzMywgMHhGMCwgMHg4MiwgMHhGOSwgMHgzNCwgMHhGMCwgMHg4MywgMHhGOSwgMHgwMCwgMHhGNCwgMHgxOCwgMHg2NSwKKwkgMHgwQywgMHg2MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwKKwkgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwKKwkgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxNSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwRCwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgwNSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHhDRiwgMHg4MywgMHhCNCwgMHg4NSwgMHhFMSwgMHgwMiwgMHg2NSwgMHg0NCwgMHg3QSwgMHhGQiwgMHgwMiwgMHg2MCwgMHgwMiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHgwMCwgMHg2NSwgMHg2MCwgMHg0MywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHg2MCwgMHg0NSwKKwkgMHhDRiwgMHg4MywgMHg2NSwgMHg0NCwgMHhGNywgMHgwMiwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwgMHgxNSwgMHgwMCwKKwkgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgxMSwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzMiwgMHg2NCwgMHgwRCwgMHgwMCwKKwkgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgzNywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg1MCwgMHg2NCwgMHgwNSwgMHgwMCwKKwkgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHg2RSwgMHg2NCwgMHgwMSwgMHgwMCwgMHgxNCwgMHg2NCwgMHg3QywgMHhGQiwgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhBNCwgMHhEOCwgMHhGMywgMHg2MCwgMHg0NSwgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHg4QywgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwNiwgMHgwMCwgMHgwMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHg2RiwgMHhGQSwgMHg3OSwgMHhGMywgMHg3QSwgMHhGMSwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2NSwgMHg0MywKKwkgMHgwMiwgMHgwMiwgMHg3OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhBRSwgMHg2NSwgMHhEOCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMiwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwgMHg3QiwgMHhGQiwgMHg2RiwgMHhGMCwgMHg2MCwgMHg0NywgMHg5MCwgMHg4NCwgMHg2RiwgMHhGQSwKKwkgMHg2MCwgMHg0NywgMHg2MCwgMHg0NSwgMHg4MCwgMHg2NCwgMHhFOCwgMHg4NCwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMywgMHhBNCwgMHg4NCwKKwkgMHg3MCwgMHhGMCwgMHg3MCwgMHhGQSwgMHgwMCwgMHg2MSwgMHhFOCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwgMHhERCwgMHg4MSwgMHhGQiwgMHgwMSwKKwkgMHhFMSwgMHg4MSwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHg0NSwgMHhEMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywgMHgwQywgMHhGNCwgMHhBOSwgMHhGMywKKwkgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHgwNSwgMHhGMCwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHgwMCwgMHg3QywgMHg0NCwgMHhEOSwgMHgyNiwgMHg0NiwgMHgzMSwgMHhGMiwgMHg2MSwgMHg1QywgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwMywgMHhGOCwgMHgyNiwgMHg0NiwgMHgzMCwgMHhGMCwKKwkgMHg2MSwgMHg0NiwgMHgwNCwgMHhGOCwgMHgyNiwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwNSwgMHhGOCwgMHgyNiwgMHg0NiwgMHhDRiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwRiwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg1QywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHhENiwgMHg2MCwgMHhCNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNywgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhEMCwgMHg2MCwKKwkgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRCwgMHhBMCwgMHgyQSwgMHhGMiwgMHgwMywgMHgwMywgMHhEQywgMHg2MCwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzNiwgMHgxMSwgMHgwMCwgMHhDMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwKKwkgMHgwQSwgMHhGMiwgMHgwQiwgMHhGMiwgMHhGRSwgMHhBMCwgMHhGMywgMHhBMCwgMHg2RiwgMHgwMiwgMHg2MCwgMHg0MSwgMHgwOSwgMHhGMiwgMHgyMCwgMHgwMywKKwkgMHgwMCwgMHhBMCwgMHhGRiwgMHhBMCwgMHg1MywgMHgwMywgMHg2NSwgMHgwMywgMHgwMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHg0RiwgMHgwMywgMHgxRiwgMHg2MCwKKwkgMHg1NCwgMHg2MSwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwRCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwKKwkgMHg1OCwgMHg2MSwgMHgwMywgMHg2NCwgMHhBMSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHg2MCwgMHgyRSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgxRiwgMHg2MCwgMHg1NCwgMHg2MSwgMHgxNywgMHgwMiwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1OCwgMHg2MSwKKwkgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1NiwgMHg2MSwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1OCwgMHg2MSwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NiwgMHgwNywgMHhGNCwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2NSwgMHg0NiwgMHgyNiwgMHg0NiwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhEMiwgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHhGQywgMHhBMCwgMHhGRiwgMHhBMCwKKwkgMHgxMSwgMHgwMiwgMHgwQSwgMHgwMiwgMHgwQiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwQSwgMHgxQiwgMHg2NiwgMHg0MSwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NiwgMHg2OSwgMHhGMSwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwgMHhBMCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwOCwgMHhCMSwgMHgwNCwgMHgwMCwgMHhDMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgwNCwgMHhCMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHgwMywKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgxNywgMHgwMCwgMHhCMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NSwgMHgwNywgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NSwKKwkgMHgwMywgMHgwMCwgMHgzMCwgMHgzQSwgMHgwRCwgMHgwMCwgMHgxMCwgMHg2NSwgMHhBNSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwMywgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyRSwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGQywgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgxNiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhEQywgMHg2MCwgMHhCQywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg2MCwgMHg1OCwgMHg2NSwgMHhBNSwgMHhEMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEMCwgMHg2MCwgMHg5OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhDRiwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0RSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwgMHgxQywgMHg2MCwgMHhCQSwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwKKwkgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwKKwkgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBOSwgMHhGMywKKwkgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMiwgMHgyNiwgMHhGMCwgMHhBNywgMHhGMiwgMHhBOCwgMHhGMCwgMHg2NiwgMHhGNSwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg4OSwgMHhGOCwgMHg2NiwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGQywgMHgyQywgMHhGQSwKKwkgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwKKwkgMHg4MSwgMHhGMywgMHgzMiwgMHhGQSwgMHg4MiwgMHhGMywgMHgzMywgMHhGQSwgMHg4MywgMHhGMywgMHgzNCwgMHhGQSwgMHgzMSwgMHg2MCwgMHgyQywgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHgwMiwgMHg2MywgMHgzRiwgMHhGQywgMHhBQiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg2MCwgMHhDMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MiwgMHhGQiwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHgwQywgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwKKwkgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MSwgMHhGQiwgMHhBOSwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHgwQywgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwKKwkgMHgzRiwgMHhGQSwgMHgxMCwgMHg2MCwgMHgyMCwgMHg2MiwgMHhERSwgMHg2MCwgMHhEQywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHg3MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNywgMHg2MCwgMHhCNiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhBOCwgMHgwMywgMHhBOCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHhERSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHhGRSwKKwkgMHgwMywgMHgwNSwgMHgyMCwgMHg0MCwgMHg0QiwgMHgyMywgMHgwRSwgMHgwMCwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHg4MywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4NiwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwNywgMHgwMCwgMHg5MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwMCwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNCwgMHgwMCwKKwkgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg4QywgMHhGMywgMHg1OCwgMHhGQiwgMHg4NCwgMHhGMSwgMHhCQSwgMHhGRSwKKwkgMHgwMSwgMHhBOCwgMHg1OSwgMHhGOSwgMHgwNCwgMHgwMiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg2NCwgMHg0NywKKwkgMHhEQywgMHhGMywgMHgxMCwgMHhCMCwgMHgwNCwgMHhBOCwgMHgzMywgMHgwMiwgMHgzMiwgMHgwMiwgMHg2MiwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwKKwkgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgxMCwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyMiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHhFQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2NywgMHg4NCwgMHhGQiwgMHg4QywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHhFRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQiwgMHg2MCwgMHhDNiwgMHg2NSwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywKKwkgMHgwNSwgMHg3QywgMHgwOCwgMHhCMCwgMHhBNSwgMHhEMywgMHgwNSwgMHgwMiwgMHgwMCwgMHhCOCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHgxNSwgMHg3QywKKwkgMHgwQiwgMHgwMCwgMHhEQywgMHhGMywgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MywgMHgwMywgMHhBOCwgMHg3RiwgMHhGMywgMHgwNSwgMHgwMiwgMHhFMCwgMHg4NSwKKwkgMHg0NywgMHhEMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCQywgMHhBMiwgMHhEQiwgMHg1MywgMHhGOSwgMHgyOSwgMHg2MCwgMHhDNiwgMHg2NCwgMHg1NCwgMHhGQiwKKwkgMHgyNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRSwgMHg0RiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHg2MCwgMHgzNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHg1OSwgMHhGMywgMHg4NCwgMHhGQiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNywgMHhEQSwgMHhGRSwgMHhEQywgMHhGMywgMHgwMCwgMHhBOCwgMHgwNCwgMHhBOCwKKwkgMHgyNywgMHgwMiwgMHgyNiwgMHgwMiwgMHg2MSwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHhBNCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHg4NSwgMHhGMSwgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgyNiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHg5RSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwNywgMHgxQiwgMHgyMCwgMHg0MCwgMHg4MCwgMHgyQiwgMHg1QywgMHgwMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg0MSwgMHhGQiwgMHhGMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgyNCwgMHhGQSwgMHhEQSwgMHg4NSwKKwkgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywgMHg4OSwgMHhGMSwgMHg0MywgMHg0QywgMHhEMywgMHg4MCwgMHhCRSwgMHhEMSwgMHgxNCwgMHgwNSwgMHg2NSwgMHg0MCwKKwkgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0MywgMHgzMiwgMHg2MSwgMHgwRiwgMHg0RSwgMHgyRiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgwMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHgyQywgMHg0MywgMHgwNCwgMHhBMywgMHg0MSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgzMiwgMHhBNCwgMHg0MSwgMHhGQiwgMHhFNywgMHgwMSwgMHgyMCwgMHg0NywgMHgyMCwgMHhCMCwgMHgyMCwgMHhBRiwgMHgwRiwgMHgwMywgMHg0MCwgMHg0MCwKKwkgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHg2MCwgMHhBMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg5RSwgMHhGMSwgMHg0MSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwgMHhFOCwgMHg4NCwgMHg2NCwgMHg0NiwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEOSwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg5RSwgMHhGQiwgMHhGQSwgMHhGRSwgMHhFQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg1OCwgMHhGMywgMHg4QywgMHhGQiwKKwkgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERCwgMHg2MCwgMHg3MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg5RSwgMHhGMSwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NiwgMHg5RSwgMHhGQiwgMHgwNywgMHgwMywgMHgyNCwgMHg2MCwgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwKKwkgMHhERSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERCwgMHg2MCwgMHg3MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5NywgMHhGMywgMHgyNiwgMHg0NiwKKwkgMHg2MCwgMHg0MywgMHgwMSwgMHgyQSwgMHgyMiwgMHgwMCwgMHgwRiwgMHhGMiwgMHgyQSwgMHhGMCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMCwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgxQSwgMHgwMCwgMHhGRCwgMHhCMywgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNywgMHgwMiwgMHhCQiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHgwMCwKKwkgMHhGQiwgMHhCMywgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNywgMHgwNCwgMHhCQiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg5NywgMHhGRCwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHhGMywgMHgzRiwgMHhGMiwgMHgwNCwgMHhBOCwgMHg1NywgMHhGQiwgMHgwMiwgMHgwMywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwKKwkgMHgxRSwgMHg2MywgMHgwOCwgMHg2NCwgMHg0MCwgMHg0OCwgMHhCRCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwNSwgMHgzNiwgMHgwQiwgMHgwMCwKKwkgMHhGRiwgMHhCNSwgMHhDNywgMHg4MywgMHgwMSwgMHgyQSwgMHhGNywgMHgwMSwgMHg0RiwgMHhEMiwgMHg1QiwgMHhEMiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNywKKwkgMHgwOCwgMHgwMCwgMHhERiwgMHg4MywgMHhGNSwgMHgwMSwgMHhGRiwgMHhCNSwgMHg2NSwgMHg0MSwgMHg0NywgMHg4QSwgMHg1QiwgMHhEMiwgMHhERiwgMHg4MywKKwkgMHgwNywgMHgwMCwgMHgwMCwgMHg3RiwgMHhEQywgMHg4NSwgMHg0NywgMHg4QSwgMHg2MCwgMHg0MSwgMHg1QiwgMHhEMiwgMHhEQiwgMHg4MywgMHg2MCwgMHg0NywKKwkgMHgwMSwgMHhCMCwgMHhGRSwgMHhCNSwgMHgwMiwgMHgwMywgMHgwMiwgMHg2NCwgMHg0MCwgMHg0OCwgMHg4NSwgMHhGMSwgMHg2NSwgMHg0NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBMSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhDNCwgMHg4MSwgMHhEMCwgMHg4NCwKKwkgMHhEMSwgMHg4MCwgMHgyQSwgMHgwNywgMHgyOSwgMHgwNiwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHg5NiwgMHhGMywgMHhDNywgMHg4MywgMHgwMSwgMHgyNiwgMHg2MCwgMHg0NywgMHhBQiwgMHg4MywgMHhGQywgMHhBMywgMHgwMiwgMHgwMCwgMHgwMywgMHgwNCwKKwkgMHgwMCwgMHhGNCwgMHg4NCwgMHhBMywgMHhGQywgMHgwMSwgMHg4MCwgMHg2NSwgMHg0NywgMHhEMCwgMHgyOCwgMHg0MSwgMHhBMCwgMHg4MCwgMHhGRSwgMHhBMSwKKwkgMHgxNiwgMHgwMywgMHgwOSwgMHgwMiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxRSwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxNSwgMHgwMCwgMHgyOCwgMHg0MSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwMywKKwkgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwOCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHg1OCwgMHgwMCwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwKKwkgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywKKwkgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwKKwkgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwKKwkgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwKKwkgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywKKwkgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHgwOCwgMHgyNCwgMHgxMSwgMHgwMCwgMHhCRCwgMHhEMywgMHgwNiwgMHg2NSwgMHhENCwgMHg4MCwgMHhCRCwgMHhEMywgMHgwQywgMHgwMiwKKwkgMHg2MCwgMHg0MCwgMHg2MCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgxRCwgMHgzQiwgMHgwNywgMHgwMCwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwKKwkgMHgwMCwgMHg3RSwgMHg1QywgMHhGQiwgMHg2NSwgMHg0NCwgMHg1QiwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywgMHg5NywgMHhGRCwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHhFMCwgMHg2MCwgMHgwNywgMHg2NCwgMHhBMiwgMHhEQiwgMHhEMiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg3NiwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHgxQSwgMHg2MCwgMHg3RSwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg1NCwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHg1MiwgMHg2MiwgMHhFMCwgMHg2MCwgMHgxMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgwNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg4MiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwMCwgMHg2MCwKKwkgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NCwgMHhGQiwgMHhBOSwgMHhGMywKKwkgMHgwNywgMHhGQSwgMHhCQywgMHhGMywgMHgxOSwgMHhGQSwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwKKwkgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg2NSwgMHhGQiwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHhCQywgMHhGMywgMHgxOSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgyOCwgMHg2MiwgMHhFMCwgMHg2MCwgMHg3NywgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywKKwkgMHg5NywgMHhGRCwgMHhCQSwgMHhGRSwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHg4NCwgMHhGRCwgMHgwRiwgMHg2MCwKKwkgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgwNCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwgMHg4MiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgwQSwgMHgxQiwgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwgMHhCQSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCQSwgMHhGRSwgMHg5NywgMHhGMywgMHgwMCwgMHg2MywgMHg4NCwgMHhGRCwgMHgxMCwgMHhCQywKKwkgMHg5NywgMHhGQiwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2MywgMHgxQSwgMHg2MCwKKwkgMHg0MiwgMHg2NCwgMHhBMCwgMHhERCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwKKwkgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMywgMHgwMSwgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwgMHhFMywgMHgwMSwgMHgyMCwgMHg0MCwKKwkgMHg1MiwgMHgyMywgMHgxMiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHg4MSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwKKwkgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhEQiwgMHgwMSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg2NSwgMHhGNSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MSwgMHhGMSwKKwkgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwKKwkgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHgyMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHhGNSwgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxOCwgMHg3QiwgMHgwMSwKKwkgMHgxMCwgMHg2NywgMHg4NCwgMHhGQiwgMHgwMywgMHg2NCwgMHg5OCwgMHhGQiwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHg4MSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHg0NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0MSwgMHg4RSwgMHhGMywgMHhBNSwgMHg4MCwKKwkgMHgwMSwgMHhCMCwgMHgwMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHg0MiwgMHg2NSwgMHhBNSwgMHhEMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgyNywgMHgxQiwgMHgwMCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg2NSwgMHhGNSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHg5NywgMHhGMywgMHgzMiwgMHg0MCwKKwkgMHgwMiwgMHgyNiwgMHgwMiwgMHgwMCwgMHg0MCwgMHgyQSwgMHhEQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMSwgMHg2MCwgMHg4MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHhBNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhCQSwgMHhGRSwgMHhFMywgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHhCQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMSwgMHg2MCwgMHg0NiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHhENywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgzQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgzNCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHg5NywgMHhGMywgMHgwMCwgMHg2MSwgMHhEMSwgMHg4MCwgMHhGNywgMHhCNCwgMHhGMCwgMHgwMywgMHg5NywgMHhGQiwgMHgzNSwgMHgwMCwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHg5NywgMHhGMywgMHgwMCwgMHg2MSwgMHhEMSwgMHg4MCwgMHgwOCwgMHhCQywgMHgwMywgMHgwMiwgMHhFMiwgMHg2MCwgMHhFOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg5NywgMHhGQiwgMHgyMSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHg2MCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDNSwgMHgwMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMywgMHg2MCwKKwkgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MywgMHg5NywgMHhGMywgMHg4QywgMHhGRCwgMHgwMSwgMHhCQywKKwkgMHhDMSwgMHhGRSwgMHg5NywgMHhGQiwgMHhEMiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg3NiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwKKwkgMHgwMSwgMHg2MCwgMHgzNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHg2MCwgMHg2MiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwMSwgMHgwMCwgMHhEMiwgMHgwMSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHg0RCwgMHgwMCwgMHg1NCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHhCQywgMHg5NywgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMywgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHg5NywgMHhGQiwgMHhFMSwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhFMywgMHg2MCwKKwkgMHhEMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NywgMHhGMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgyMSwgMHhCQywgMHg5NywgMHhGQiwgMHg2NCwgMHhGNSwKKwkgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHg4NSwgMHhGMSwgMHhDMCwgMHg2NywKKwkgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwKKwkgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhDMSwgMHhGRSwgMHgxQSwgMHg2MCwgMHg3NiwgMHg2MiwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhGOCwgMHg2MiwgMHgwMSwgMHg2MCwgMHgyQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMywgMHg2MCwgMHgzQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4RCwgMHgwMSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHg0RSwgMHgwMywgMHg3RCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg0NSwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNiwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMywgMHg5NywgMHhGMywgMHgwMCwgMHhBOCwKKwkgMHhGNywgMHhCNCwgMHgyRSwgMHgwMywgMHg5NywgMHhGQiwgMHhFMiwgMHg2MCwgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyOCwgMHg2MCwgMHgwMCwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHg5NywgMHhGMywgMHgwMCwgMHhBOCwgMHgwOCwgMHhCQywgMHgwMSwgMHgwMiwgMHg0MiwgMHgwMSwgMHg5NywgMHhGQiwgMHhFMiwgMHg2MCwKKwkgMHgzQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHgwMCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3MiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHg5NywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHg5NywgMHhGQiwgMHhFMSwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg5NywgMHhGMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwMSwgMHhCQywgMHg5NywgMHhGQiwgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwgMHhDMSwgMHhGRSwKKwkgMHgyOSwgMHgwMCwgMHg5NywgMHhGMywgMHgwMSwgMHg2MywgMHg4QywgMHhGRCwgMHgwMSwgMHhCQywgMHg5NywgMHhGQiwgMHgwMCwgMHg2NCwgMHg4NCwgMHhGQiwKKwkgMHg2NCwgMHhGNSwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHg4NSwgMHhGMSwKKwkgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwKKwkgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgwMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwKKwkgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgxNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMywgMHg2MCwgMHgwRSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFNCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg3RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhFMCwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwQSwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDNiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4QiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQywgMHgwMSwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhBRCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2NywgMHg4NCwgMHhGQiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgxNCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NSwgMHhGNSwgMHhCQywgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHg4MiwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg5NywgMHhGMywgMHhDMSwgMHhGRSwgMHhGRSwgMHhCNCwKKwkgMHg5NywgMHhGQiwgMHgwRiwgMHg2MCwgMHhGOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNCwgMHg2MCwgMHg5NCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyOSwgMHgwMSwgMHg2NSwgMHhGNSwKKwkgMHgyMywgMHhGMiwgMHg5OCwgMHhGMywgMHgwNCwgMHgxOCwgMHhDQywgMHg4NCwgMHg5OCwgMHhGQiwgMHgwMSwgMHgwMywgMHgyMSwgMHgwMSwgMHhFMSwgMHg2MCwKKwkgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg2MCwgMHhGRSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NCwgMHhGMSwgMHgwMiwgMHhBOCwgMHgyQSwgMHhGMiwKKwkgMHgwMywgMHgwMiwgMHhCMCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGNiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgyNCwgMHg2MCwgMHgzNCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhEQiwgMHgwMiwgMHhCRiwgMHg2MCwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHhBRSwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg1QywgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHg1QSwgMHg2MiwgMHhFNCwgMHg2MCwgMHhEMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRiwgMHg2MCwgMHg1QywgMHg2MiwgMHhBMiwgMHhEMSwgMHgxQSwgMHg2MCwKKwkgMHhCMiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHhFNCwgMHg2MCwgMHhGOSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywKKwkgMHhGMywgMHhCNCwgMHgwMSwgMHhCMCwgMHhBNSwgMHhEQiwgMHgwQywgMHgwMiwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MSwgMHgwMCwgMHg2NCwgMHgxQSwgMHg2MywKKwkgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgxRiwgMHg2MCwgMHg1QywgMHg2MSwgMHgwQSwgMHg2NCwgMHgxQSwgMHg2MywgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwKKwkgMHg3RiwgMHhGMywgMHg3RSwgMHhGQiwgMHgwMSwgMHg2NCwgMHg3RiwgMHhGQiwgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywKKwkgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHhCQSwgMHhGMywgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHg2OSwgMHgwMywgMHgwRiwgMHg2MCwKKwkgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHgxRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHg0MywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHgwMCwgMHg2MCwgMHgxQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHg2NCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNiwgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwKKwkgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhBRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgxMiwgMHg2MCwgMHgyNiwgMHg2NSwgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhBNCwgMHhGMiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNiwKKwkgMHhGMSwgMHhBNCwgMHgwMSwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwNCwgMHhBNCwgMHg2MCwgMHg0MSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NCwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHg2MSwgMHg0NCwgMHhFRiwgMHgwMiwgMHg3NSwgMHgwMSwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwKKwkgMHhBNSwgMHhEMywgMHg3RSwgMHhGMSwgMHhGQywgMHhCNCwgMHhBNSwgMHhEQiwgMHg3RiwgMHhGOSwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFNSwgMHg2MCwgMHhBNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhGRSwgMHg2MiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFNSwgMHg2MCwgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhFNiwgMHg2MCwgMHhFOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNiwgMHg2MCwgMHhFRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwKKwkgMHg4MCwgMHg2MywgMHhBMywgMHhEMywgMHgyNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHgzRiwgMHhGMiwgMHhGNiwgMHgwMywgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHhENCwgMHg4MCwgMHgwMCwgMHhGNCwgMHgwMiwgMHgyNCwgMHg2NSwgMHg0NCwgMHgxMiwgMHg2NSwgMHg2MCwgMHg0MSwKKwkgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGMCwgMHgwMiwKKwkgMHgwMiwgMHg2MCwgMHgxNCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwgMHhGRiwgMHhGRiwgMHgzNywgMHgwMiwgMHgyOSwgMHg2MCwKKwkgMHhBNCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgxRiwgMHg2MCwgMHgwRSwgMHg2MywgMHgzMSwgMHgxOCwgMHg2NCwgMHg0MSwgMHg0NCwgMHg0QiwgMHgyOSwgMHg2MCwKKwkgMHhBNiwgMHg2NSwgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHgwNSwgMHgwMywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwgMHhGNCwgMHgwMiwgMHgwMiwgMHg2MCwgMHgxQSwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHgyQiwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxQSwgMHgwMCwgMHgwMSwgMHgzNiwgMHgxOCwgMHgwMCwgMHhENCwgMHg4MCwgMHg2NSwgMHg0MywKKwkgMHhCMCwgMHgwMiwgMHgxRiwgMHg2MCwgMHgwQywgMHg2NCwgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OSwgMHhEMSwgMHg1OCwgMHhEMywgMHg0MCwgMHg0QiwKKwkgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgwMiwgMHgwMiwgMHhGOSwgMHgxRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHg2MCwgMHgxQSwgMHg2MSwgMHg2NSwgMHg0MywKKwkgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5QywgMHgxQiwgMHhGQywgMHgxRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg2NCwgMHg0MSwgMHgwMSwgMHgwNSwgMHg2MCwgMHg0MSwgMHhGNCwgMHhBMSwgMHgwMiwgMHg2MCwKKwkgMHgxOCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhGRCwgMHhBMCwgMHhGOSwgMHhBMCwgMHgwOCwgMHgwMywgMHgzNSwgMHgwMywgMHhGRSwgMHhBMSwKKwkgMHg2NCwgMHg0MiwgMHhFMiwgMHg4NSwgMHhEMSwgMHg4MSwgMHhDNywgMHg4MywgMHg4NCwgMHgwNiwgMHhGMywgMHgwMSwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2NSwKKwkgMHhCRCwgMHhEMywgMHhGRCwgMHhBMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgwNSwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwKKwkgMHhBNSwgMHhEMywgMHg0MSwgMHg0OCwgMHgwNCwgMHhCQywgMHhBNSwgMHhEQiwgMHgxMiwgMHg2MCwgMHgyOCwgMHg2NSwgMHgxMiwgMHg2MCwgMHg0NCwgMHg2MSwKKwkgMHg0OSwgMHhEMywgMHhENiwgMHg4MCwgMHgwMCwgMHhCOCwgMHgwRSwgMHgwMywgMHhGQiwgMHgwMywgMHg2MiwgMHg0NSwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MSwKKwkgMHg1OSwgMHhEMywgMHhENiwgMHg4MCwgMHgwMCwgMHhCOCwgMHgwNiwgMHgwMywgMHhGQiwgMHgwMywgMHgwNSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg4MCwKKwkgMHgwMiwgMHhBMiwgMHhGQywgMHgwMiwgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyOCwgMHg0MSwgMHhDNSwgMHgwMSwgMHg2MywgMHg0NSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2MywgMHhENywgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhEMywgMHg4MCwgMHg2NSwgMHg0MywgMHgwMSwgMHgwNSwgMHg1NCwgMHgwMCwgMHhGRSwgMHhBMywgMHg0MywgMHg0QiwgMHhBMywgMHhEMywKKwkgMHg2MywgMHg0MSwgMHg2MCwgMHg0MywgMHgxQiwgMHg2MCwgMHhDNiwgMHg2NCwgMHhBMCwgMHhERCwgMHhFMywgMHg4MywgMHhGRSwgMHhBMywgMHg1OSwgMHhEMSwKKwkgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgwMCwgMHg2MywgMHg1OCwgMHhERCwgMHgyQiwgMHg0MywgMHhCRCwgMHhEMSwgMHgxRiwgMHg2MCwgMHg3OCwgMHg2NCwKKwkgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMSwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEMSwgMHhGQywgMHhBMSwgMHg0MSwgMHg0QiwgMHg1OCwgMHhEOSwgMHhCRCwgMHhEMSwKKwkgMHhBMCwgMHhEOSwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MSwgMHgxMiwgMHg2MCwgMHg0MiwgMHg2NSwgMHgwMCwgMHg2NCwgMHhENSwgMHg4MCwgMHg1OSwgMHhEQiwKKwkgMHhGRCwgMHgwMiwgMHgxMiwgMHg2MCwgMHgyNCwgMHg2NSwgMHhCRCwgMHhEMywgMHhBMywgMHhEMSwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4MiwgMHgxMiwgMHg2MCwKKwkgMHg0NCwgMHg2NSwgMHgwNSwgMHg2NCwgMHg2NCwgMHg0MSwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgyMiwgMHgwMywgMHhGQiwgMHgwMiwKKwkgMHgxRiwgMHg2MCwgMHg1QSwgMHg2MSwgMHg0QiwgMHhEMSwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGNiwgMHhBMCwgMHhDMSwgMHg4MiwKKwkgMHgwNSwgMHgwNSwgMHg2NCwgMHg0MSwgMHg1QSwgMHhEQiwgMHhDRCwgMHg4MSwgMHhGRiwgMHhGRiwgMHhGQywgMHgwMiwgMHgyQiwgMHg0MSwgMHhGRCwgMHhBMSwKKwkgMHg0MSwgMHg0QiwgMHhERiwgMHgwNywgMHgwRiwgMHg2MCwgMHhGQywgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwOCwgMHhCQywgMHhBNSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg5QSwgMHhGRiwgMHg1QywgMHg2MSwKKwkgMHgzRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg4MywgMHhBMCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyOCwgMHgzOSwgMHgwMCwgMHhGNCwgMHhBNCwgMHg2MCwgMHg0MywKKwkgMHgwMCwgMHhGNCwgMHgxRSwgMHg2MiwgMHg2MCwgMHhGRSwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4NSwgMHgzNiwgMHgxMCwgMHgwMCwKKwkgMHhERSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhGRiwgMHhCNCwgMHgwMiwgMHhBNCwgMHg1MywgMHg5MywgMHg1MSwgMHg5MSwKKwkgMHgwNSwgMHgwRSwgMHhGRiwgMHhBNCwgMHg0MiwgMHg5MiwgMHg2MywgMHg0MCwgMHg2MSwgMHg0MCwgMHhFQywgMHgxQywgMHg5OCwgMHhGRiwgMHhEOSwgMHgwMSwKKwkgMHgyMCwgMHhGRSwgMHgwNSwgMHg2NCwgMHgwMCwgMHg3QywgMHg0MiwgMHg5MiwgMHg2MCwgMHhGRSwgMHhERSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhERSwgMHg4MiwKKwkgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhERSwgMHg4MiwgMHhBMiwgMHhEMiwKKwkgMHhERSwgMHg4MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHg5OCwgMHhGRiwgMHgwMSwgMHhBMywgMHgwMSwgMHhBNCwKKwkgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MiwgMHhBMiwgMHhERCwgMHgyRCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEQiwgMHhCQSwgMHgwMSwgMHg5OCwgMHhGRiwKKwkgMHhCOCwgMHgwMSwgMHgwMCwgMHg2MCwgMHhBMCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg1RCwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg4MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwKKwkgMHgzRSwgMHhGQSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwgMHg2NywgMHg0NCwgMHgyQywgMHhGQSwKKwkgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgxMCwgMHg2MCwgMHgxQywgMHg2MiwgMHhFOCwgMHg2MCwgMHhERiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHg4MSwgMHhGMSwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQywKKwkgMHgyRiwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyOCwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHgwMiwgMHgxOCwgMHgyNywgMHg2MCwgMHhEQSwgMHg2NCwgMHgyRSwgMHg2MCwgMHhBRSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRSwgMHg2MCwgMHhDQSwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhBNiwgMHg2MSwgMHgyOCwgMHg2MCwgMHhDQywgMHg2MiwgMHhBMiwgMHhEMywgMHgyRSwgMHg2MCwgMHg5NiwgMHg2NSwKKwkgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwgMHgwMiwgMHgwNSwgMHg2NywgMHg0NCwgMHg5OSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgyRCwgMHg2MCwKKwkgMHhDQywgMHg2MiwgMHhBMiwgMHhEMywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHgyRCwgMHg2MCwgMHhDNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwKKwkgMHhBNSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHgyRCwgMHg2MCwgMHhBMCwgMHg2MSwgMHhERCwgMHg2MCwKKwkgMHgwNiwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwNiwgMHhBMSwgMHgyRCwgMHg2MCwgMHhDQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwKKwkgMHg2MCwgMHg0MCwgMHhGRCwgMHhBMCwgMHhBMiwgMHhEMywgMHg3NCwgMHgwMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHgwNSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyRCwgMHg2MCwgMHhDQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwKKwkgMHhDNCwgMHg2MiwgMHhGRSwgMHhBMCwgMHhBMiwgMHhEMywgMHg1NCwgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg2MSwgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHgwNCwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwKKwkgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHhENSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyRCwgMHg2MCwKKwkgMHhDQSwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhDNiwgMHg2MiwgMHhGRiwgMHhBMCwgMHhBMiwgMHhEMywgMHgyMSwgMHgwMywgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2MywKKwkgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwKKwkgMHg1OSwgMHhERCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwKKwkgMHhENSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBNSwgMHhERCwgMHgyRCwgMHg2MCwgMHhDOCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg1OSwgMHhEOSwKKwkgMHgyRCwgMHg2MCwgMHhBMCwgMHg2NSwgMHhENSwgMHg4NCwgMHhERCwgMHg3RiwgMHhBNSwgMHhEQiwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2MCwgMHhCOCwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRSwgMHg2MCwgMHhENCwgMHg2MiwgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhENCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhFOCwgMHg2MCwgMHgyRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg3RiwgMHhGMSwgMHgyRiwgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyRSwgMHg2MCwKKwkgMHhCNiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHgwMCwgMHhGNCwgMHg4MCwgMHhGMSwKKwkgMHgwNiwgMHhGOCwgMHgyRiwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwgMHgyRSwgMHg2MCwgMHhBRSwgMHg2NCwgMHg0MCwgMHg0OCwKKwkgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwKKwkgMHgzRiwgMHhGQywgMHhEQiwgMHhGRSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHhGMywgMHg5QiwgMHhGRSwgMHhGRCwgMHhBMCwgMHgyNSwgMHgwNCwgMHgyNCwgMHgwMiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHgwMCwgMHhGNCwKKwkgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2MCwgMHg0MywgMHgwMCwgMHgzNiwgMHgxQywgMHgwMCwKKwkgMHhFMCwgMHhBMCwgMHhEQSwgMHg4NSwgMHgxNiwgMHgwNywgMHgyRCwgMHg2MCwgMHg3QSwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwKKwkgMHhDQiwgMHg4MywgMHgwRiwgMHgwMiwgMHgwNywgMHgwRSwgMHg1OSwgMHhEMywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgwMiwgMHhGOSwgMHgxRiwgMHgxMywgMHgxRSwgMHhBNSwgMHhEMCwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwgMHhGRiwgMHgyMiwKKwkgMHgwRCwgMHgwMCwgMHhFOCwgMHg2MCwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyNywgMHg2MCwgMHhEQSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyRCwgMHg2MCwgMHg3QSwgMHg2NCwKKwkgMHgyRSwgMHg2MCwgMHhDQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwKKwkgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHg4MSwgMHhGMSwgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHg1MCwgMHg2MywgMHgyQSwgMHhGQywKKwkgMHhDQywgMHhGMywgMHgxOSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBOSwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHg4MCwgMHhGMSwKKwkgMHgwNiwgMHhGOCwgMHgyRiwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwNywgMHhGQSwgMHgyRSwgMHg2MCwgMHhEMiwgMHg2NSwgMHhFOSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHg2MCwgMHhDQSwgMHg2NCwgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhFOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHhFOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwKKwkgMHhEMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg5NCwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEQiwgMHhDRCwgMHg4MSwgMHgyOCwgMHhEMywgMHg1QSwgMHg4OCwgMHhEQywgMHg4MywgMHgzOSwgMHgxOCwKKwkgMHhGQiwgMHgwMywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwNywgMHgwMCwgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwKKwkgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEOCwgMHg2MSwgMHg0MCwKKwkgMHg3RiwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhDRiwgMHg4MywgMHhBMywgMHhEMywgMHhERCwgMHg4MSwgMHhBMSwgMHhEQSwgMHhGRiwgMHhCNCwKKwkgMHgwMCwgMHg3RiwgMHgxNSwgMHgwMywgMHhEQiwgMHg4MywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwQiwgMHgwMCwgMHgyMCwgMHhGRSwgMHg2MCwgMHg0NSwKKwkgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgwMCwgMHhGNCwKKwkgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhERiwgMHg4MywgMHhERCwgMHg4MSwgMHhDQywgMHg4NCwgMHhBMSwgMHhEOCwgMHhFQywgMHgwMiwgMHgyMCwgMHhGRSwKKwkgMHhDMywgMHgwMSwgMHgyRiwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRCwgMHhBMSwgMHhGRiwgMHhCMSwgMHhDMSwgMHg4MywgMHhBMiwgMHhERCwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NywgMHg1QywgMHgxQiwgMHg2MCwgMHhDNiwgMHg2MSwgMHhBMSwgMHhEMywgMHhBNSwgMHhEOSwgMHgxMiwgMHgxOCwKKwkgMHg2MCwgMHg0MywgMHgyRiwgMHg2MCwgMHgxNCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhBMCwgMHhERCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHhEQywgMHg4NCwgMHhDRiwgMHg4MywgMHhFMywgMHg4MywgMHg1OSwgMHhEMSwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEOSwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHhGOSwgMHgxRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOSwgMHgwMCwKKwkgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHgwMywKKwkgMHhGMiwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMCwgMHg2MCwgMHg0OCwgMHg2MSwgMHgyOCwgMHg0NCwgMHg1OSwgMHhEQSwgMHgwMywgMHg2NCwKKwkgMHgzOCwgMHg0MywgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgzOSwgMHg0NCwgMHg1OSwgMHhEQSwgMHgyOCwgMHg2MCwKKwkgMHgyRSwgMHg2NCwgMHhBMCwgMHhEMywgMHg1OSwgMHhEQSwgMHgwNywgMHg2NCwgMHgyMywgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxQywgMHgwMCwgMHg0NSwgMHg0OCwKKwkgMHgwMCwgMHg2MCwgMHgwNiwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMywgMHgwMiwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHhGMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgyOCwgMHg0NCwgMHg1QSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHgzRSwgMHgwMCwgMHg5RCwgMHhGMywgMHg2NywgMHg0MywgMHhEQywgMHg4NCwgMHhDQywgMHg4NCwgMHgzOSwgMHgwMywgMHg2MCwgMHg0NiwgMHgwQSwgMHgwMiwKKwkgMHg5RCwgMHhGRCwgMHgwMCwgMHg2MCwgMHg0NiwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg5RCwgMHhGQiwgMHgyRSwgMHgwMywgMHg0NiwgMHg0QiwgMHgyNywgMHg2MCwgMHg3MiwgMHg2MSwgMHgxOCwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgyNCwgMHhGQSwgMHg0QSwgMHg2NSwgMHhBMiwgMHhGRiwgMHgyQywgMHg2MywgMHgwMCwgMHg2NCwgMHg1OSwgMHhEMSwgMHhBMiwgMHhEQiwKKwkgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNywgMHgxRiwgMHgxMiwgMHg2MywKKwkgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyQiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhBNiwgMHhGRSwgMHgwMCwgMHg2NCwgMHg5RCwgMHhGQiwgMHhBMywgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGRSwgMHhCOCwgMHgwNSwgMHhBNywgMHhGRSwgMHgxMiwgMHgwNSwgMHhBNSwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhFQSwgMHg2MCwgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRSwgMHhGMiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhERSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NSwgMHgyMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHgwMCwgMHg2NCwgMHg0MSwgMHgwMywgMHg5RiwgMHhGQiwgMHgzMSwgMHg0NCwgMHhFOCwgMHhCNCwgMHg0MCwgMHg1MSwKKwkgMHg2QSwgMHg0NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNiwgMHhGQywgMHgwMSwgMHg2MSwgMHhGRiwgMHg2MiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgxQSwgMHg2MiwKKwkgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg2NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRSwgMHg2MCwgMHhCQywgMHg2MiwgMHgxRSwgMHg2MCwgMHhCRSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MywgMHgxQywgMHg2MCwgMHhCOCwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwKKwkgMHgxQywgMHg2MywgMHgxMCwgMHg2MCwgMHg1QywgMHg2NCwgMHg1OCwgMHhEMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgxQiwgMHhGQywgMHgxRiwgMHgwMCwgMHg2MCwKKwkgMHg2MiwgMHg2MywgMHgxQiwgMHg2MCwgMHhDNCwgMHg2NCwgMHgwMCwgMHg3QywgMHg1OCwgMHhEOSwgMHhGRSwgMHgxRiwgMHgxQywgMHg2MCwgMHhCNCwgMHg2MywKKwkgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMywgMHgwMiwgMHg2NSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQSwgMHg2MCwgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg3NCwgMHgwMCwgMHgyOCwgMHg2MCwgMHg1MCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHg4QywgMHhGQiwgMHgzMSwgMHg0NCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwRCwgMHg2NCwgMHgwNSwgMHhGQiwKKwkgMHg2NCwgMHgwMCwgMHgyOCwgMHhGMywgMHg5RiwgMHhGMSwgMHg2MCwgMHg0NywgMHg2NCwgMHg0MSwgMHgwNywgMHhCMSwgMHgwNywgMHhCNCwgMHgwOCwgMHgyNCwKKwkgMHg2NywgMHg0QywgMHg1MCwgMHhGQiwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhBMSwgMHg4MCwKKwkgMHhCMSwgMHg4MywgMHg1MywgMHgwMiwgMHg5RiwgMHhGRCwgMHgyOCwgMHg2MCwgMHg0NCwgMHg2MiwgMHhBMiwgMHhEMywgMHhFNSwgMHhGQiwgMHg3RiwgMHhGQiwKKwkgMHgyNCwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwgMHgzMSwgMHg0NCwKKwkgMHgwMSwgMHhCQywgMHg0MCwgMHg1MSwgMHhEOCwgMHhGMywgMHgwMSwgMHg2MywgMHgwMywgMHhBOCwgMHg0RSwgMHhGRCwgMHgwNSwgMHgwMiwgMHgwMiwgMHg2MywKKwkgMHgxNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEQiwgMHhGQiwgMHgwQywgMHgwMCwgMHgwMiwgMHhBOCwgMHgwMSwgMHg2MywgMHgwMywgMHgwMywgMHgwQSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MywgMHgxNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhEQiwgMHhGQiwgMHgwMCwgMHg2NCwgMHg0RSwgMHhGQiwKKwkgMHg0QiwgMHhGRCwgMHhBOSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMCwgMHgwRiwgMHg2MCwgMHhBMiwgMHg2NSwgMHgyOCwgMHg2MCwgMHhEMiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgwMywgMHhBOCwgMHgxMSwgMHgwNiwgMHg3OSwgMHhGMSwgMHgwNiwgMHgwMiwgMHg2NCwgMHg0NCwKKwkgMHgwOCwgMHgyQSwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2NCwgMHg0NCwgMHhEMywgMHgwRCwgMHgwMCwgMHg2NCwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwQSwgMHg2NCwgMHg0NCwgMHhEMywgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwgMHg0NCwgMHhEMywgMHgwNCwgMHgwMCwgMHhFOCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwRSwgMHhGQSwgMHhFRCwgMHhFMiwgMHgwRiwgMHg0RSwgMHhDOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhENywgMHhGRSwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhGMywgMHgwMSwgMHgyNCwgMHg2MCwgMHg0NiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwRSwgMHhGMiwgMHg0RCwgMHgwMywgMHg2MCwgMHg0MCwgMHhGMCwgMHgzNywgMHgzQSwgMHgwMCwgMHhGRiwgMHgzNywgMHgyRiwgMHgwMCwgMHhGRCwgMHgzNywKKwkgMHgyNywgMHgwMCwgMHhGOCwgMHgzNywgMHgwQSwgMHgwMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2MiwgMHg0NiwgMHhEMSwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhEQSwgMHgwMSwKKwkgMHgwNiwgMHhCNCwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHg0QywgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHhDQSwgMHgwMSwKKwkgMHgyMywgMHhGMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHhFQywgMHgxQiwgMHgwMiwgMHgyNiwgMHhFQSwgMHgxOCwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwKKwkgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhCMCwgMHhGMywgMHgwMiwgMHgwMiwgMHhDQywgMHg4NCwgMHhCMCwgMHhGQiwgMHgyNCwgMHg2MCwKKwkgMHg3NCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCMywgMHgwMSwgMHhBQywgMHhGRSwKKwkgMHgwOSwgMHgwNSwgMHhBRCwgMHhGRSwgMHgxMCwgMHgwNSwgMHhBRSwgMHhGRSwgMHhBRCwgMHgwNSwgMHhBRiwgMHhGRSwgMHgzQSwgMHgwNSwgMHhCRiwgMHg2MCwKKwkgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhGNCwgMHgwMSwgMHgxMCwgMHg2MCwgMHgzMiwgMHg2NSwgMHgwQiwgMHg2MSwgMHgwNywgMHgwMCwgMHhBMiwgMHhERCwKKwkgMHg1OCwgMHg0RiwgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgwMCwgMHg2MywgMHhBNSwgMHhEMSwKKwkgMHg1QSwgMHhEMywgMHhEQSwgMHg4NSwgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHhGMiwgMHgwMiwgMHhGOCwgMHgwMiwgMHhFMCwgMHgwMSwgMHgwRiwgMHg2MCwKKwkgMHhDRSwgMHg2MiwgMHgxMCwgMHg2MCwgMHgxMiwgMHg2NSwgMHhFQiwgMHg2MCwgMHg1RiwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHg1QSwgMHhEQiwgMHg1QSwgMHhEQiwgMHg1QSwgMHhERCwgMHhGOSwgMHgwMSwgMHgxMCwgMHg2MCwgMHgzMCwgMHg2NSwKKwkgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg1QSwgMHhERCwgMHhGQiwgMHgwMSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhEMiwgMHg2NCwgMHg0MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgwQiwgMHg2MSwgMHgwOCwgMHgwMywgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhDRCwgMHg4MSwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHhGOSwgMHgwMiwgMHgxMCwgMHg2MCwgMHgxQSwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgwQywgMHg2MSwgMHgxOSwgMHgwMywgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMywgMHhDRCwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhFMywgMHgwMywgMHgwMiwgMHgwNSwgMHhFMSwgMHgwMywgMHhGOSwgMHgwMSwgMHg5OSwgMHhGQiwgMHg5QiwgMHhGRCwgMHg2MSwgMHg1QywgMHhBMywgMHhEMywKKwkgMHg5QSwgMHhGOSwgMHgwMywgMHgxOCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5QiwgMHhGMywgMHg5QSwgMHhGMSwgMHg2MCwgMHg0MywKKwkgMHg5OSwgMHhGMywgMHg2NCwgMHg0MSwgMHhFQSwgMHgwMSwgMHgyMSwgMHg0MywgMHgxMCwgMHg2MCwgMHgxNCwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMywgMHgwMywgMHgwMiwgMHhCRiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhCRCwgMHhEMSwgMHg0MywgMHg0MSwKKwkgMHhGNSwgMHgwMywgMHhFQiwgMHg2MCwgMHg2NCwgMHg2NCwgMHg2NCwgMHg1OCwgMHg0MCwgMHg0RiwgMHgyQSwgMHhGMCwgMHg4MywgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHg2NCwgMHg0NywgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMywgMHgyNiwgMHgwMywgMHhBQywgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwKKwkgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHg2NCwgMHg0MSwKKwkgMHhFQiwgMHhGMywgMHgyRiwgMHhGQSwgMHg2MCwgMHg0MywgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHgxOSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwKKwkgMHgyRSwgMHhGQSwgMHgzNiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzNywgMHhGMiwgMHgzMywgMHhGQSwgMHgzOCwgMHhGMiwgMHgzNCwgMHhGQSwgMHhFQiwgMHhGMywKKwkgMHgyRiwgMHhGQSwgMHgzNiwgMHhGQSwgMHhFQywgMHhGMywgMHgzMCwgMHhGQSwgMHgzNywgMHhGQSwgMHhFRCwgMHhGMywgMHgzMSwgMHhGQSwgMHgzOCwgMHhGQSwKKwkgMHg2NCwgMHg0MSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgxOCwgMHgwMCwgMHg4MSwgMHg2NywgMHhBMiwgMHhEQSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RSwgMHg1QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgzRiwgMHhGQywgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwgMHg0MiwgMHg2NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRiwgMHhGQSwKKwkgMHgwNywgMHhGMiwgMHhBOSwgMHhGMSwgMHgwMSwgMHgxQiwgMHgwNywgMHhGOCwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgyNiwgMHhGMiwgMHgyNywgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHhGNCwgMHgxRiwgMHhGQSwgMHg2NCwgMHg0NywgMHgyMCwgMHhGQSwgMHg2MSwgMHg0NCwgMHgyMSwgMHhGQSwgMHgwMSwgMHg2NywKKwkgMHgwRCwgMHhGQSwgMHgxMCwgMHg2MSwgMHgyOCwgMHg2MCwgMHgwNiwgMHg2NCwgMHgxRSwgMHg2MywgMHg1OCwgMHhEMSwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEOCwKKwkgMHhGQywgMHgwMiwgMHhCQiwgMHhGMSwgMHhEOCwgMHhGMSwgMHg2NCwgMHg1RSwgMHg2NCwgMHg1RiwgMHg0NCwgMHg2MywgMHhCRCwgMHhEQSwgMHgyOCwgMHg2MCwKKwkgMHgwMCwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0QSwgMHhEMywgMHg2MCwgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMywgMHg2NCwgMHgwMiwgMHgzNiwgMHgwMSwgMHg2NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwKKwkgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywgMHhCRCwgMHhEQSwgMHhENSwgMHhGMywgMHhENiwgMHhGMSwgMHg2MCwgMHg0NywgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywKKwkgMHhFMywgMHhGMSwgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NCwgMHhCRCwgMHhEQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgyMywgMHhGMCwgMHgzQiwgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgxMCwgMHhCQywgMHgzRSwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgzNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCNCwgMHhGMywgMHgxRiwgMHhGQSwgMHgzMiwgMHg0NywgMHgwNywgMHhGQSwgMHgyNCwgMHg3RSwgMHgwMiwgMHg3RiwKKwkgMHgwOCwgMHhGQSwgMHhEOCwgMHhGMSwgMHgwOSwgMHhGOCwgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMSwgMHg2NCwgMHgwQiwgMHhGQSwKKwkgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgxOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1MiwgMHg2MywgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyQSwgMHg2MSwgMHhBRSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1RSwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg2NywgMHg0NCwKKwkgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgzMiwgMHhGQSwgMHgzMywgMHhGQSwgMHgzNCwgMHhGQSwgMHgxMiwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHhBOSwgMHhGMSwgMHgwRSwgMHhGQSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2MywgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgzOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHhFRiwgMHg2MCwgMHhBOSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHg1QSwgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHgzQywgMHg2NCwgMHhCRCwgMHhEQiwgMHgwOCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgxMCwgMHg2MCwgMHgzQSwgMHg2MiwgMHhFRiwgMHg2MCwgMHhCMywgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyMiwgMHg2MiwKKwkgMHhFRiwgMHg2MCwgMHg5MywgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg1RSwgMHhGNSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwgMHgzMCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MywgMHg4QSwgMHhGRCwgMHgxQywgMHg2MCwgMHg5NiwgMHg2NSwgMHhBNSwgMHhERCwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHg4OCwgMHhGRCwgMHg4OSwgMHhGRCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgxRiwgMHg2MCwgMHg4MiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg1OSwgMHgxOCwgMHg1RSwgMHhGNSwgMHg0MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg1NCwgMHhGMywgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhCRCwgMHhEMSwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0NywgMHhBNSwgMHhEQSwgMHg2NCwgMHg0MSwgMHhERCwgMHg4MSwgMHhFOSwgMHg4MSwgMHg2MiwgMHg0NCwKKwkgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHg1OCwgMHg4QiwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2MywKKwkgMHhBMywgMHhEMSwgMHgyQiwgMHg0NCwgMHhDOCwgMHg4NCwgMHg2NCwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MSwgMHg0NSwgMHgwMywgMHhBMSwgMHhFOSwgMHg4MSwKKwkgMHg0MSwgMHg0QywgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwgMHg1OCwgMHhEOCwgMHhGQywgMHgwMiwgMHgyQiwgMHhEMiwgMHgyQiwgMHg0MywgMHg2MCwgMHg0NywKKwkgMHgwMSwgMHg3RSwgMHg1NCwgMHhGMSwgMHhBMywgMHhEQSwgMHhBNCwgMHhEMywgMHhDQiwgMHg4MywgMHg0NCwgMHg4QiwgMHhGOCwgMHg4NCwgMHgyQywgMHg0MSwKKwkgMHgwQywgMHgwNCwgMHhCRSwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhCRSwgMHhEQSwgMHgwMCwgMHg3RSwgMHhBMywgMHhEMiwgMHg2MCwgMHg0NSwKKwkgMHgwMCwgMHg3RiwgMHhCNCwgMHg4NCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQSwgMHhGNCwgMHgwMiwgMHg1RSwgMHhGNSwgMHgyQiwgMHg0NCwgMHgwNCwgMHhBNCwKKwkgMHgzRiwgMHhGQSwgMHg3RiwgMHhGMywgMHg3RSwgMHhGQiwgMHgxRiwgMHg2MCwgMHg4NCwgMHg2MSwgMHgwMSwgMHg2NCwgMHg1NCwgMHhGMSwgMHhBMSwgMHhEQiwKKwkgMHg3RiwgMHhGQiwgMHhBNCwgMHhEMywgMHgwNCwgMHg2NSwgMHg1MywgMHhGMywgMHgwMSwgMHgxOCwgMHgwQywgMHg2NSwgMHhGMywgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHg1MywgMHhGQiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMywgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwRiwgMHhCNCwKKwkgMHg3RiwgMHhGQiwgMHgwMSwgMHgwMywgMHgwRiwgMHgwMCwgMHhFRSwgMHg2MCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MywgMHhGMSwgMHg3RiwgMHhGMywKKwkgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHhGOCwgMHgwMSwgMHhGMywgMHhBMCwgMHgwNCwgMHhBNCwgMHgwMSwgMHgwNCwgMHhGMSwgMHhBNCwgMHgxMCwgMHgzNiwKKwkgMHhGMiwgMHgwMSwgMHg3RiwgMHhGQiwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgxMiwgMHgwMCwgMHg3RiwgMHhGMywgMHgxRiwgMHg2MCwgMHg4MiwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHhDQywgMHg4NCwgMHgwMSwgMHg2MSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhFMSwgMHg4MSwgMHhDQywgMHg4NCwgMHhGQiwgMHgwMSwKKwkgMHhBMSwgMHg4NCwgMHg1MywgMHhGMSwgMHhFNCwgMHgwMywgMHgxRiwgMHg2MCwgMHg4NCwgMHg2MSwgMHhBMSwgMHhEQiwgMHgxOSwgMHgwMCwgMHg1MywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwgMHgxMiwgMHg2MCwgMHgyNiwgMHg2MywgMHgwMiwgMHgwMywgMHgxMCwgMHg2MCwgMHg1QywgMHg2MywgMHgzMSwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHgwQywgMHgxQiwgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NSwgMHg0NywgMHhEMywKKwkgMHg1MywgMHhGMSwgMHgwMSwgMHhCMCwgMHgwNiwgMHhCMCwgMHhDQiwgMHgwMywgMHg2NCwgMHg0MCwgMHgwMywgMHgyNiwgMHgwMSwgMHgwMCwgMHhDNywgMHgwMywKKwkgMHg3RiwgMHhGMywgMHgwMSwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwgMHhGQiwgMHgwMSwgMHhCQSwgMHhGMywKKwkgMHg2MSwgMHg0NSwgMHhBNCwgMHg4MCwgMHhGRiwgMHhGRiwgMHhCQiwgMHgwMywgMHgzMSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQiwgMHgwNCwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHg3MCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RiwgMHhGMSwgMHgyNCwgMHg2MCwgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHhBMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg1RSwgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHhDRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwKKwkgMHgzMywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzNCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhDNiwgMHhGMSwgMHgxQSwgMHg2MCwgMHg1MiwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhDNywgMHhGMSwgMHgxQSwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgyNCwgMHg2MCwgMHhBOCwgMHg2MiwgMHhBMiwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFRCwgMHg2MCwgMHhGRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MSwgMHhGMSwgMHgwRiwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwMywgMHgwMCwgMHhFRCwgMHg2MCwgMHgzNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHgwQSwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwgMHhDOCwgMHhGMSwgMHgxQSwgMHg2MCwgMHg1RSwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRSwgMHg2MCwgMHgyNCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg1QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg1QSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxNCwgMHgwMCwKKwkgMHhGRiwgMHg2MCwgMHhGNywgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1MSwgMHhGMywgMHhEQiwgMHgwQSwgMHgwMCwgMHhBMCwgMHgwMCwgMHg2NCwKKwkgMHgwMiwgMHgwMywgMHg1MSwgMHhGQiwgMHhENiwgMHgwMSwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFRCwgMHg2MCwgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNSwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHhFMywgMHhCNCwgMHg1MywgMHhGQiwgMHgxRiwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgzMSwgMHg2MCwgMHgyQSwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwRSwgMHgwNCwgMHgzMiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRSwgMHg2MCwKKwkgMHg2OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGMSwgMHg3RiwgMHhGOSwgMHgyNCwgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNiwgMHg2MiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFRSwgMHg2MCwgMHg5MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQSwgMHg2MCwgMHgwNiwgMHg2MywgMHgxQywgMHg2MSwgMHgwMCwgMHg2NCwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEQiwKKwkgMHhGRCwgMHgwMiwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MSwgMHg4QSwgMHhGMywgMHg2MSwgMHg0MywgMHhDNiwgMHhBNSwgMHg0NywgMHhEMSwgMHgwRiwgMHgwNCwKKwkgMHhCRSwgMHhENSwgMHgxQSwgMHg2MCwgMHgwMiwgMHg2MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHg0MywgMHhEMywgMHhCRSwgMHhEMSwKKwkgMHhEQywgMHg4NCwgMHhBMywgMHhEQiwgMHg2NiwgMHg0NCwgMHhDMCwgMHg4NCwgMHhCRSwgMHhEQiwgMHg2NSwgMHg0NCwgMHhFRCwgMHgwMSwgMHgxQSwgMHg2MCwKKwkgMHgwNiwgMHg2MywgMHgwRSwgMHg2MSwgMHg0MSwgMHg0QiwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHgwMCwgMHhCRCwgMHg2NCwgMHg0MSwgMHgxOSwgMHgwMywKKwkgMHgwMSwgMHhBOCwgMHg2MSwgMHg0NCwgMHgwMiwgMHhBOCwgMHgxNSwgMHgwMywgMHgwMiwgMHgwMiwgMHhFOSwgMHg4NCwgMHgxMiwgMHgwMCwgMHg2NSwgMHg0NywKKwkgMHg2MCwgMHg0NSwgMHg2MSwgMHg0NCwgMHgwOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhFMCwgMHg4NCwgMHhGRiwgMHgyMywgMHhGQywgMHgwMSwgMHgwMiwgMHgyNCwKKwkgMHhDNCwgMHg4NCwgMHgwMiwgMHgyOCwgMHhENCwgMHg4NCwgMHhDRCwgMHg4MSwgMHgwMSwgMHgwRSwgMHgwMSwgMHhCQywgMHgwMiwgMHgwMywgMHhFMCwgMHg4NCwKKwkgMHhGNiwgMHgwMSwgMHgwMCwgMHg3RiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhCRiwgMHhEQiwgMHhERCwgMHgwMiwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MSwKKwkgMHg4QSwgMHhGMywgMHg2MSwgMHg0MywgMHhDNiwgMHhBNSwgMHg0NywgMHhEMSwgMHgwQSwgMHgwNCwgMHhEQSwgMHg4NiwgMHgxQSwgMHg2MCwgMHgwNCwgMHg2MywKKwkgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHg0MywgMHhEMSwgMHhBNiwgMHhEOSwgMHg2NSwgMHg0NCwgMHhGMiwgMHgwMSwgMHgzNiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHg1MywgMHhGMywgMHg4QSwgMHhGMSwgMHhGMywgMHhCNCwgMHg1MywgMHhGQiwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHhDMywgMHg4NSwgMHg0NSwgMHg0QSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2NSwgMHg4OSwgMHhGMywgMHg0NSwgMHg0QywgMHg0MCwgMHg0OCwgMHgyMCwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NSwgMHg0NSwgMHg0QiwgMHgyQSwgMHg0NSwgMHhENywgMHg4MCwgMHgwMiwgMHg2NSwgMHgyMywgMHgwNSwKKwkgMHg0NywgMHhEMSwgMHgwMiwgMHg2NSwgMHg0NywgMHhEMywgMHgwQSwgMHg2NSwgMHhEMCwgMHg4MSwgMHg0NywgMHhEMywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2MSwKKwkgMHhGMiwgMHhBMywgMHgwMSwgMHhCMCwgMHg2MSwgMHg0NCwgMHgxMSwgMHgwMywgMHgyMCwgMHg0MCwgMHgyMCwgMHgyQSwgMHgwOCwgMHgwMCwgMHhGMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQiwgMHg0NCwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0QiwgMHg2MSwgMHg0NCwgMHgyQywgMHg0MiwKKwkgMHhBMiwgMHhEQiwgMHg1QSwgMHhERCwgMHg1QSwgMHg4QywgMHgzQSwgMHhBMywgMHhERiwgMHgwMSwgMHgyOCwgMHg0MiwgMHg0QSwgMHhERCwgMHg0QSwgMHhEQiwKKwkgMHg0MiwgMHg0OCwgMHgzQSwgMHhBMywgMHhEOSwgMHgwMSwgMHgyOCwgMHg0NCwgMHg4OCwgMHhGQiwgMHg4OCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg4NiwgMHg2MywKKwkgMHg0NCwgMHg0OCwgMHgyOCwgMHg0NSwgMHhENywgMHg4MCwgMHhBMywgMHhEMSwgMHgxNSwgMHgwNSwgMHgwNCwgMHg2NSwgMHg0NiwgMHhEMywgMHgyOCwgMHg0NSwKKwkgMHhENiwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMiwgMHgwNCwgMHgwNCwgMHhBMywgMHhGNSwgMHgwMSwgMHhGNywgMHgwNiwgMHg2MiwgMHg0NiwgMHhBMiwgMHhEOSwKKwkgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHg2NiwgMHg0MiwgMHg1QSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBMywgMHhEOSwgMHhGRSwgMHhBMywgMHhBMywgMHhEMSwKKwkgMHg2NiwgMHg0MiwgMHhFQiwgMHgwMSwgMHg4OCwgMHhGMywgMHg4OSwgMHhGMSwgMHg2MCwgMHg0MywgMHg0NCwgMHg0OCwgMHgyOCwgMHg0NSwgMHhENywgMHg4MCwKKwkgMHhBMywgMHhEMSwgMHgxNSwgMHgwNSwgMHgwNCwgMHg2NSwgMHg0NiwgMHhEMywgMHgyOCwgMHg0NSwgMHhENiwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMiwgMHgwNCwKKwkgMHgwNCwgMHhBMywgMHhGNSwgMHgwMSwgMHhGNywgMHgwNiwgMHg2MiwgMHg0NiwgMHhBMiwgMHhEOSwgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHg2NiwgMHg0MiwKKwkgMHg1QSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBMywgMHhEOSwgMHhGRSwgMHhBMywgMHhBMywgMHhEMSwgMHg2NiwgMHg0MiwgMHhFQiwgMHgwMSwgMHgwRiwgMHg2MCwKKwkgMHhEMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyMCwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgxNywgMHgwMCwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2MSwgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHgzRSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwKKwkgMHgxQSwgMHg2MCwgMHg0RSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg1MywgMHhGQiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OSwgMHhGQiwgMHhBQywgMHg4NSwgMHg2MCwgMHg0MSwKKwkgMHgyMCwgMHgwMywgMHgwMSwgMHg2MCwgMHgwMCwgMHg2MywgMHgwOCwgMHg2NCwgMHhFOSwgMHg4MSwgMHhDQywgMHg4NCwgMHgwMiwgMHgyNCwgMHhERiwgMHg4MywKKwkgMHhGQiwgMHgwMiwgMHgyRCwgMHg2MCwgMHgyOCwgMHg2NCwgMHhBMCwgMHhERCwgMHg2NSwgMHg0MSwgMHgyRCwgMHg2MCwgMHgyQSwgMHg2MywgMHgwRiwgMHg2MCwKKwkgMHhDMCwgMHg2NCwgMHhFOSwgMHg4MSwgMHg1OCwgMHhEMSwgMHhGRCwgMHgwNCwgMHhBMywgMHhEOSwgMHgwQiwgMHgwMywgMHg1OCwgMHhEMSwgMHhFOSwgMHg4MSwKKwkgMHg2MCwgMHg0NSwgMHhGQywgMHgwNCwgMHhBMywgMHhEMSwgMHg2NCwgMHg0NywgMHhCMCwgMHg4NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NCwKKwkgMHhGMCwgMHgwMiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgyMCwgMHg0MCwgMHg5MCwgMHgyQiwKKwkgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhFNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MywgMHhGMywgMHg4QSwgMHhGMSwgMHgwNCwgMHhCMCwgMHgwNywgMHg2MCwKKwkgMHg0MCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyMSwgMHgwMywgMHgyMCwgMHgwNiwgMHgyNiwgMHg0NiwgMHg4QSwgMHhGMSwgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywKKwkgMHhDMywgMHg4MywgMHg3RiwgMHhGMywgMHgyNiwgMHhGMCwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgzMiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgzMywgMHhGMCwgMHhCRCwgMHhEOSwgMHgzNCwgMHhGMCwgMHhCRCwgMHhEOSwKKwkgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwRSwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwMCwgMHg2NCwgMHgwRiwgMHhGMCwgMHhBMywgMHhEQiwKKwkgMHg2NCwgMHg0NywgMHg2MCwgMHg0NSwgMHgwMCwgMHgzNywgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhERiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCRCwgMHhEQiwKKwkgMHhFMCwgMHhBMCwgMHgxRiwgMHg2MSwgMHgwMCwgMHhCOCwgMHhGOCwgMHgwNywgMHhGNywgMHgwMywgMHg2MCwgMHhGRSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhDQywgMHg4NCwgMHhCRCwgMHhEOSwgMHhGQiwgMHgwMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhERiwgMHg4MywgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwKKwkgMHhFNCwgMHg2MiwgMHhBMiwgMHhERCwgMHg2MCwgMHhGRSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwKKwkgMHgwNCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgwMywgMHgzNiwgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhERiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOSwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgyMCwgMHhGRSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhGMiwgMHg2MCwgMHhERiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwKKwkgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywKKwkgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwKKwkgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2MywgMHg0NiwgMHg0OCwKKwkgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwKKwkgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwKKwkgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHg0NSwgMHgwMywgMHg2MCwgMHhGRSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgzRSwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgzQSwgMHgzOCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgxRCwgMHgzQSwgMHgzMiwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhGRiwgMHhCNCwgMHgxQywgMHg2MCwKKwkgMHg5NiwgMHg2NSwgMHhBNSwgMHhEMywgMHg2MCwgMHg1QywgMHgwMiwgMHhBNCwgMHhBNSwgMHhEQiwgMHhGRSwgMHhBNSwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2NCwKKwkgMHg0NCwgMHhEOSwgMHgwMCwgMHg3QywgMHg2MCwgMHhGRSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgxQiwgMHg2MCwKKwkgMHgwNiwgMHg2NCwgMHhDNCwgMHg4MiwgMHg2NCwgMHg0NCwgMHhGRiwgMHhCNCwgMHhBMiwgMHhEQiwgMHgxMiwgMHg2MCwgMHg0OCwgMHg2NSwgMHg4QSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhDNCwgMHg4MiwgMHg2NCwgMHg0NCwgMHhBMiwgMHhEMywgMHhGRiwgMHhCNSwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNSwKKwkgMHg2NSwgMHg0NCwgMHhBMiwgMHhEQiwgMHgwOSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyOCwgMHg0NiwgMHgyQSwgMHg0MSwgMHhGRiwgMHhCMSwgMHg2MCwgMHhGRSwKKwkgMHg4MiwgMHg2NCwgMHhBMSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHhERCwgMHg2NSwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwKKwkgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyRCwgMHgwMywKKwkgMHgxNywgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwgMHg4MCwgMHhBMCwgMHgyOCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMiwgMHhDRiwgMHg4MywgMHg4MSwgMHhBMSwgMHgyMCwgMHgwMywgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwKKwkgMHhERCwgMHg4MSwgMHhFNCwgMHgwMywgMHhGNywgMHgwMSwgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwgMHgwNCwgMHg2MSwgMHhFNCwgMHgwMywgMHhGMiwgMHgwMSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHg0NiwgMHg0OCwgMHg0MSwgMHg0QSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwKKwkgMHg2NCwgMHg0NCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMCwgMHhERiwgMHg4MywgMHhBMywgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywKKwkgMHg3RiwgMHhBMSwgMHhGNywgMHgwNCwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHhGNCwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHhCQiwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgwOCwgMHgyNCwgMHhBNiwgMHgwMCwgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MiwKKwkgMHhBMiwgMHhERiwgMHgyRCwgMHg2MCwgMHhEQSwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhERiwgMHg2MCwgMHhGRSwKKwkgMHhERCwgMHg2NCwgMHhBMSwgMHhEQiwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGQSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgzNCwKKwkgMHg5QSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHg5NCwgMHgwMSwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg1MCwgMHgzQSwgMHg4RSwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHg4OCwgMHgwMSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwKKwkgMHhEQywgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHhENiwgMHgwMCwgMHhERCwgMHg4MSwKKwkgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHhEMCwgMHgwMCwgMHg2MCwgMHg1QywgMHgwMCwgMHgzNiwgMHgzOSwgMHgwMCwKKwkgMHgwMCwgMHg2NCwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNywgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgzMSwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywKKwkgMHhERCwgMHg4MSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNSwgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgyNywgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMywKKwkgMHhERCwgMHg4MSwgMHhGMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg1NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNSwgMHgwMSwKKwkgMHgyRCwgMHg2MCwgMHhEQSwgMHg2MiwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxRCwgMHgwMCwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHgyRCwgMHg2MCwgMHhEQywgMHg2MiwgMHhBMiwgMHhEOSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhERCwgMHg2MiwgMHhBMiwgMHhEOSwKKwkgMHgxOCwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwKKwkgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhEQSwgMHg2MiwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhEQywgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyRCwgMHg2MCwgMHg5RSwgMHg2MywgMHhENSwgMHg4NCwgMHhEQywgMHg4NCwKKwkgMHhCRCwgMHhEQiwgMHg2MCwgMHg0MSwgMHg2NiwgMHg0NCwgMHg2MywgMHg0NiwgMHhDRCwgMHg4MywgMHhDNywgMHg4MSwgMHg2MCwgMHg0NSwgMHg2MCwgMHhGRSwKKwkgMHg1RCwgMHg5MywgMHhBMywgMHhEMywgMHg1RCwgMHg5MywgMHhBNiwgMHhEQiwgMHhERSwgMHg4NiwgMHhGQSwgMHgxRiwgMHg2NiwgMHg0MywgMHg2NSwgMHg0NiwKKwkgMHgyMCwgMHhGRSwgMHgyMCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhFNCwgMHg2MiwgMHhBMiwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MywgMHgwMCwgMHg2NCwKKwkgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEQiwgMHgyRCwgMHg2MCwgMHhDMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRCwgMHg2MCwgMHhENiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHgyMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHg0OCwgMHgwMCwgMHgxMCwgMHg3QywgMHgwNSwgMHgwMCwgMHgwNCwgMHg3QywKKwkgMHgwMywgMHgwMCwgMHgyMCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMiwgMHg3QywgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEOSwgMHg1MCwgMHg5NCwKKwkgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MSwgMHhBMSwgMHhEQiwgMHgyRCwgMHg2MCwgMHhDNCwgMHg2MSwgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwgMHhEOCwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNSwgMHgwMCwKKwkgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgxMCwgMHg3QywgMHgwNiwgMHgwMCwgMHg2NCwgMHg0MCwKKwkgMHgxMCwgMHgyNiwgMHgyMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMSwgMHg3QywgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MSwgMHhBMSwgMHhEOSwKKwkgMHg1MCwgMHg5NCwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MSwgMHhBMSwgMHhEQiwgMHgyRCwgMHg2MCwgMHhDNiwgMHg2MSwgMHhBMSwgMHhEMSwgMHgyRCwgMHg2MCwKKwkgMHhEQSwgMHg2MSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwNSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMiwgMHg3QywgMHgwMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwKKwkgMHgyMCwgMHg3QywgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MSwgMHhBMSwgMHhEOSwgMHgwRCwgMHgwMCwgMHg1MCwgMHg5NCwgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MiwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhEMCwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MiwgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwKKwkgMHhENCwgMHg2MiwgMHhBMiwgMHhEQiwgMHg3QywgMHg0NCwgMHgyRCwgMHg2MCwgMHhDRSwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCRCwgMHhEOSwgMHgyRCwgMHg2MCwKKwkgMHhEMCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgyRCwgMHg2MCwgMHhEMiwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCMCwgMHg4NCwKKwkgMHhCRCwgMHhEOSwgMHgyRCwgMHg2MCwgMHhDOCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgwOCwgMHgyOCwgMHg2OCwgMHgwMCwKKwkgMHgyOCwgMHg2MCwgMHgyQywgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwQywgMHgyNCwgMHg2MCwgMHgwMCwKKwkgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHg1RCwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywgMHg1QSwgMHgwMCwgMHg4OCwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHg2NSwgMHg2MCwgMHhGRSwgMHgyRCwgMHg2MCwgMHhERSwgMHg2MiwgMHhBMiwgMHhEQiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwOCwgMHgyMCwKKwkgMHgwMywgMHgwMCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHgwMiwgMHhBNSwgMHg2NCwgMHg0NCwgMHhENCwgMHg5QywgMHhENCwgMHg4MCwKKwkgMHgyRCwgMHg2MCwgMHhFMCwgMHg2MiwgMHgwMiwgMHgwNSwgMHgwOCwgMHg2NSwgMHg0MSwgMHgwMCwgMHhBMiwgMHhEOSwgMHg3QywgMHg0NCwgMHgyRCwgMHg2MCwKKwkgMHhFMiwgMHg2MiwgMHhBMiwgMHhEQiwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwMSwgMHg2NSwKKwkgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg1MCwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHgwMSwgMHg2NSwgMHhERCwgMHg4MSwgMHhBMSwgMHhEMSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwKKwkgMHgxOCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwMiwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwNCwgMHgzNiwgMHgxMCwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwNSwgMHgzNiwgMHgyMCwgMHg2NSwgMHg2NSwgMHg1QywgMHgyRCwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgyRCwgMHg2MCwgMHhERSwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2NSwgMHhGRiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMiwKKwkgMHgyRCwgMHg2MCwgMHhFMiwgMHg2MiwgMHhBMiwgMHhEMywgMHgyRCwgMHg2MCwgMHhFMCwgMHg2MiwgMHhBMiwgMHhEMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHg4QSwgMHhGMywgMHhGRiwgMHhGRiwgMHgzQSwgMHhBNCwgMHg4QSwgMHhGQiwgMHgzRCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHg4OSwgMHhGMywgMHg3RiwgMHhGMSwgMHgwNCwgMHhBNCwgMHg4OSwgMHhGQiwgMHgxMiwgMHg2MCwgMHgyMiwgMHg2MywgMHg1MywgMHhGMywgMHg2NCwgMHg0MSwKKwkgMHgwOCwgMHhCMCwgMHhFMSwgMHg4NSwgMHgxQywgMHgwMywgMHhGRSwgMHhBMSwgMHg0NywgMHhEMywgMHgwMiwgMHgwNiwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwKKwkgMHhERCwgMHg4MSwgMHg1QiwgMHhEMywgMHgwQywgMHgyNCwgMHgwMiwgMHgwMCwgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHhERCwgMHg4MSwKKwkgMHgwMiwgMHhCQywgMHhBMywgMHhEQiwgMHgwRSwgMHg2NSwgMHhERCwgMHg4MSwgMHhENSwgMHg4MCwgMHg1QiwgMHhEMywgMHgwOCwgMHgwNSwgMHhGQiwgMHhCNCwKKwkgMHhBMywgMHhEQiwgMHhERCwgMHg4MSwgMHhENSwgMHg4MCwgMHg1QiwgMHhEMywgMHgwMiwgMHgwMywgMHhGQiwgMHhCNCwgMHhBMywgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyMCwgMHhGRSwgMHgyNiwgMHg0NiwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgxOCwgMHgwMCwgMHgzRiwgMHhGMiwgMHg0NywgMHg2NSwgMHhDNCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwKKwkgMHg2NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxNiwgMHg2MywgMHgxQywgMHg2MCwgMHg4QywgMHg2MiwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHg1QiwgMHhGQiwgMHg1QywgMHhGQiwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2MywgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2MiwgMHgzRSwgMHg2MywgMHgwMCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHg5OCwgMHg2MiwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MywKKwkgMHhGOCwgMHhBMCwgMHgwMSwgMHhBNCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhERCwgMHgxQywgMHg2MCwKKwkgMHg5QSwgMHg2MiwgMHhBMiwgMHhEMSwgMHhBMiwgMHhERCwgMHg1QSwgMHhEMywgMHhBMiwgMHhERCwgMHhDMCwgMHg4MSwgMHg2MSwgMHg0NCwgMHgwMiwgMHgyNCwKKwkgMHhGRiwgMHhGRiwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHg1QSwgMHhEMywgMHhFOSwgMHg4MSwgMHhFOCwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4NSwgMHhENCwgMHg4NSwgMHhDNSwgMHg4MywgMHhBMiwgMHhERCwgMHgxQywgMHg2MCwKKwkgMHg4RSwgMHg2MiwgMHg2MywgMHg0NywgMHgwMCwgMHg3RiwgMHhBMiwgMHhEQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBMCwgMHg2NSwKKwkgMHhBNSwgMHhERCwgMHgxQiwgMHg2MCwgMHg0NiwgMHg2NSwgMHg2MSwgMHg0NCwgMHgyQiwgMHg0MSwgMHg0NSwgMHhEQiwgMHg2MCwgMHg0MSwgMHgxQiwgMHg2MCwKKwkgMHg4NiwgMHg2NSwgMHgwQSwgMHhBMywgMHhBMywgMHhEMSwgMHgyQiwgMHg0NCwgMHg0NCwgMHhEOSwgMHgxQywgMHg2MCwgMHhBMCwgMHg2NSwgMHhBNSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHg0QywgMHgwMywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHg4MSwgMHhGMywKKwkgMHg4MiwgMHhGMSwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyMiwgMHgwMiwgMHg4MywgMHhGMywgMHhEMCwgMHg4MCwgMHhBMywgMHhEMSwgMHgxRSwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQiwgMHgwMiwgMHg4QSwgMHhGMywgMHgxMiwgMHg2MCwgMHg0NiwgMHg2MywgMHhDNiwgMHhBNSwgMHg0NywgMHhEMSwKKwkgMHg3RiwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyOCwgMHhGRiwgMHg2MSwgMHg2MSwgMHg0MywgMHgxQSwgMHg2MCwKKwkgMHhDNiwgMHg2NSwgMHgyQiwgMHg0NCwgMHg0NCwgMHhEMSwgMHgxQywgMHg2MCwgMHg4RSwgMHg2NSwgMHhBNSwgMHhEMSwgMHg2NCwgMHg0NCwgMHhEMCwgMHg4MSwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHgwMSwgMHgwNSwgMHgwMCwgMHg2MSwgMHhBNSwgMHhEMywgMHgxNSwgMHgwMCwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2NSwKKwkgMHgyQiwgMHg0NCwgMHg0NCwgMHhEMSwgMHgxQywgMHg2MCwgMHg4RSwgMHg2NSwgMHg2NCwgMHg0MywgMHhBNSwgMHhEMSwgMHg2NCwgMHg2NSwgMHg2MywgMHg0NCwKKwkgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNiwgMHgwMCwgMHg2MSwgMHgxMywgMHgwMCwgMHg2MSwgMHg0MywgMHhEMCwgMHg4MSwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHhBNSwgMHhEMywgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhDQywgMHg4NCwgMHhDQywgMHg4NCwgMHgwMiwgMHgwMywKKwkgMHgwMiwgMHgwMywgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4MSwgMHhFOSwgMHg4NSwgMHhENywgMHg4NCwgMHg2MCwgMHg0MSwgMHgwMSwgMHgwNSwKKwkgMHgwMCwgMHg2MSwgMHgxQywgMHg2MCwgMHhBMCwgMHg2NSwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxQywgMHg2MCwgMHg5NCwgMHg2NSwgMHhBNSwgMHhEMSwgMHg1QiwgMHhGMywgMHg2NCwgMHg0MSwgMHhDRCwgMHg4MSwgMHhDRCwgMHg4MSwgMHgwMiwgMHgwMywKKwkgMHgwMiwgMHgwMywgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgyOSwgMHg0NCwgMHg1NCwgMHg4OSwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhFRCwgMHhGMywgMHgxQSwgMHg2MCwgMHhCRSwgMHg2MywgMHgwRiwgMHhCNCwgMHgwMSwgMHhBNCwgMHhFMCwgMHg4NywgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhCRCwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhCQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHhCRSwgMHg2MywgMHhFQSwgMHg2MCwgMHg2MCwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1OCwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwMiwgMHg2NCwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwgMHhCQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MywgMHgxQywgMHg2MCwgMHg4QywgMHg2MiwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRSwgMHgxRiwgMHg1QiwgMHhGQiwgMHg1QywgMHhGQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2MywgMHgwMiwgMHg2NCwgMHhBMywgMHhEQiwgMHgxQSwgMHg2MCwKKwkgMHhDNiwgMHg2MiwgMHgzRSwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgxMCwgMHg2MCwgMHg1NiwgMHg2MiwgMHhGNSwgMHg2MCwKKwkgMHgyOSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyQywgMHg2MiwgMHhGNSwgMHg2MCwgMHgxNSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgwMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhGNCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0NCwgMHg0MCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHhGNCwgMHg2MCwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHg1MiwgMHgyMywgMHgwNywgMHgwMCwgMHg1QSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhBNCwgMHg1QSwgMHhGQiwgMHhGNCwgMHg2MCwgMHhENywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NSwgMHgwMiwgMHg2NCwgMHhBNSwgMHhEQiwgMHgxQSwgMHg2MCwgMHhDNCwgMHg2MiwKKwkgMHg3RSwgMHg2MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRSwgMHgxRiwgMHgxQywgMHg2MCwgMHg5NiwgMHg2MiwgMHhBMiwgMHhERCwgMHg4QywgMHhGMywKKwkgMHg1OCwgMHhGQiwgMHgwMiwgMHg2NCwgMHg4QywgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg4QywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwKKwkgMHgzRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2NCwgMHg1MywgMHhGQiwgMHgyOSwgMHg2MCwKKwkgMHhBNCwgMHg2NCwgMHg1NCwgMHhGQiwgMHgwRiwgMHg0RSwgMHhFQywgMHg2MCwgMHg1OCwgMHg0RiwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwKKwkgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwgMHg2NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1OCwgMHhGMywKKwkgMHg4QywgMHhGQiwgMHhDQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgxQywgMHg2MCwgMHhBMiwgMHg2MiwgMHg2NiwgMHg0NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhERCwKKwkgMHg2MSwgMHg0NCwgMHg1QSwgMHhEQiwgMHg2NywgMHhGNSwgMHhDQywgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHhBOSwgMHhGMSwgMHgwNywgMHhGOCwgMHgwMSwgMHg2MCwgMHg2MCwgMHg2NywgMHgyQywgMHhGQSwgMHgxRCwgMHg2NCwgMHgyRCwgMHhGQSwgMHgwMSwgMHg2NCwKKwkgMHgyRSwgMHhGQSwgMHhFQiwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMCwgMHhGOCwgMHhFRCwgMHhGMSwgMHgzMSwgMHhGOCwgMHg4MSwgMHhGMSwKKwkgMHgzMiwgMHhGOCwgMHg4MiwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MywgMHhGMSwgMHgzNCwgMHhGOCwgMHgwOCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg0MCwgMHg2MywKKwkgMHgzRiwgMHhGQywgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhDQiwgMHg4MywgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHhGRSwgMHgxRiwgMHgxQywgMHg2MCwKKwkgMHg4RSwgMHg2NSwgMHhBNSwgMHhEMywgMHgwMiwgMHhGQSwgMHgxOSwgMHg2MCwgMHg4OCwgMHg2NCwgMHhBMCwgMHhEMSwgMHgwQSwgMHg2MSwgMHg0MSwgMHhEMywKKwkgMHgwMywgMHhGQSwgMHgwNiwgMHg2MSwgMHgwNiwgMHg2MywgMHgwMCwgMHg2NSwgMHgxQiwgMHg2MCwgMHg4NiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwKKwkgMHgxQiwgMHg2MCwgMHg0NiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwgMHgxQSwgMHg2MCwgMHhDNiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwKKwkgMHgxQiwgMHg2MCwgMHgwNiwgMHg2NCwgMHg0NCwgMHhEMSwgMHg1OSwgMHhEOCwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NSwgMHhFQywgMHgxRiwKKwkgMHg2NywgMHhGNSwgMHgyNCwgMHg2MCwgMHg3NCwgMHg2MiwgMHgyNCwgMHg2MCwgMHgyMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBMiwgMHg2MiwgMHhBMiwgMHhENSwgMHg1QSwgMHhEMywKKwkgMHg1QSwgMHhEMywgMHg2MCwgMHg0MywgMHg2MCwgMHg0MSwgMHgwRiwgMHg2MCwgMHhFQSwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhGMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgwNCwgMHg2MiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHhBNCwgMHg2MywgMHg2NiwgMHg0NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2MSwKKwkgMHhBRSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NywgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwKKwkgMHgxQywgMHg2MCwgMHhBNCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHg2NCwgMHg0NiwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwNCwgMHg2MiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNCwgMHg2MCwKKwkgMHgxNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwgMHhBQSwgMHg2MiwgMHgxQSwgMHg2MCwKKwkgMHhCQSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1QSwgMHhEQiwgMHhGRiwgMHg2MCwgMHg5RiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwMiwgMHg2MiwgMHhBMiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKworfTsgIC8qIGZ3X2ltYWdlXzRfZGF0YSAqLworCitzdGF0aWMgY29uc3QgQ0ZHX0lERU5USVRZX1NUUkNUIGZ3X2ltYWdlX2luZm9pZGVudGl0eVtdID0geworCXsKKwkJc2l6ZW9mKCBDRkdfSURFTlRJVFlfU1RSQ1QgKSAvIHNpemVvZihoY2ZfMTYpIC0gMSwKKwkJQ0ZHX0ZXX0lERU5USVRZLAorCQlDT01QX0lEX0ZXX1NUQSwKKwkJMywJCQkJCQkJLy9WYXJpYW50CisJCTIsCQkJCQkJCS8vTWFqb3IKKwkJMzYJCQkJCQkJLy9NaW5vcgorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwIH0JCS8vZW5kc2VudGluZWwKK307CisKK3N0YXRpYyBjb25zdCBDRkdfUFJPR19TVFJDVCBmd19pbWFnZV9jb2RlW10gPSB7CisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxODYsCQkvLyBzaXplb2YoZndfaW1hZ2VfMV9kYXRhKSwKKwkJMHgwMDAwMDA2MCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMV9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MjUxOCwJCS8vIHNpemVvZihmd19pbWFnZV8yX2RhdGEpLAorCQkweDAwMDAwQzE2LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8yX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHgzZGFhLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzNfZGF0YSksCisJCTB4MDAxRTMxMkUsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzNfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweGFhNjYsCQkvLyBzaXplb2YoZndfaW1hZ2VfNF9kYXRhKSwKKwkJMHgwMDFGNDAwMCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfNF9kYXRhCisJfSwKKwl7CisJCTUsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19TVE9QLAkJCQkvLyBtb2RlCisJCTAwMDAsCisgCTB4MDAwRjM2OEUsCQkJCQkvLyBTdGFydCBleGVjdXRpb24gYWRkcmVzcworCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1JBTkdFMjBfU1RSQ1QgZndfaW1hZ2VfaW5mb2NvbXBhdFtdID0geworCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0ZXX1NVUF9SQU5HRSwKKwkJQ09NUF9ST0xFX1NVUEwsCisJCUNPTVBfSURfU1RBLAorCQl7CisJCQl7IDIsIDIsIDUgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX01GSSwKKwkJeworCQkJeyA0LCA2LCA3IH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDUsIDYsIDcgfSwgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJCXsgNiwgNiwgNyB9ICAJCQkJLy92YXJpYW50LCBib3R0b20sIHRvcAorCQl9CisJfSwKKwl7CTMgKyAoKDIwICogc2l6ZW9mKENGR19SQU5HRV9TUEVDX1NUUkNUKSkgLyBzaXplb2YoaGNmXzE2KSksCisJCUNGR19DRklfQUNUX1JBTkdFU19TVEEsCisJCUNPTVBfUk9MRV9BQ1QsCisJCUNPTVBfSURfQ0ZJLAorCQl7CisJCQl7IDIsIDEsIDIgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCB7IHsgMDAwMCwgMDAwMCwgMDAwMCB9IH0gfQkvL2VuZHNlbnRpbmVsCit9OworCittZW1pbWFnZSBmd19pbWFnZSA9IHsKKwkiRlVQVTdEMzdkaGZ3Y2lcMDAxQyIsCQkJLy9zaWduYXR1cmUsIDxmb3JtYXQgbnVtYmVyPiwgQy9CaW4gdHlwZQorCShDRkdfUFJPR19TVFJDVCAqKSBmd19pbWFnZV9jb2RlLAorCTB4MDAwRjM2OEUsCisJMDAwMDAwMDAsCQkJCQkvLyhkdW1teSkgcGRhcGx1ZworCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHByaXBsdWcKKwkoQ0ZHX1JBTkdFMjBfU1RSQ1QgKikgZndfaW1hZ2VfaW5mb2NvbXBhdCwKKwkoQ0ZHX0lERU5USVRZX1NUUkNUICopIGZ3X2ltYWdlX2luZm9pZGVudGl0eSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3N0YV9oMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNhMWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvc3RhX2gyNS5jCkBAIC0wLDAgKzEsNTI1NSBAQAorLyoKKyAqIEZpbGU6CXN0YV9oNTQuMTM2CisgKgorICogQWJzdHJhY3Q6CVRoaXMgZmlsZSBjb250YWlucyBtZW1vcnkgaW1hZ2UgJ2Z3X2ltYWdlJy4KKyAqCisgKiBDb250ZW50czoJVG90YWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGltYWdlOiA4MTc0MiBieXRlcy4KKyAqCQlUb3RhbCBudW1iZXIgb2YgYmxvY2tzOiA0IGJsb2Nrcy4KKyAqCQlCbG9jayAgMSA6IGxvYWQgYWRkcmVzcyAwMDAwMDA2MCwgMzg4IGJ5dGVzLgorICoJCUJsb2NrICAyIDogbG9hZCBhZGRyZXNzIDAwMDAwQzE2LCAxMTI3OCBieXRlcy4KKyAqCQlCbG9jayAgMyA6IGxvYWQgYWRkcmVzcyAwMDFFMzgyNCwgMjE3MjYgYnl0ZXMuCisgKgkJQmxvY2sgIDQgOiBsb2FkIGFkZHJlc3MgMDAxRjQwMDAsIDQ4MzUwIGJ5dGVzLgorICoKKyAqIElkZW50aXR5Ogljb21wb25lbnQgaWQ6IDMxICh2YXJpYW50IDQpIHZlcnNpb24gMS4zNgorICoKKyAqIENvbXBhdGliaWxpdHk6CisgKgkJc3VwcGx5aW5nIGludGVyZmFjZSA0ICh2YXJpYW50IDQpIDogMSAtIDIKKyAqCQlhY3Rpbmcgb24gaW50ZXJmYWNlIDEgKHZhcmlhbnQgNykgOiAzIC0gMworICoJCWFjdGluZyBvbiBpbnRlcmZhY2UgMSAodmFyaWFudCA4KSA6IDEgLSAxCisgKgkJYWN0aW5nIG9uIGludGVyZmFjZSAyICh2YXJpYW50IDQpIDogMSAtIDIKKyAqCisgKiBHZW5lcmF0ZWQ6CWJ5IGc6XGZ3XGZ1cHUzLmV4ZSB2ZXJzaW9uIDQuMjYKKyAqCisgKiBDb21tYW5kbGluZToJZzpcZndcZnVwdTMuZXhlIC9mPTQgL249ZndfaW1hZ2UgL2k9cjQwMTM2MDAuaGV4CisgKi8KKworCisjaW5jbHVkZSAiaGNmY2ZnLmgiCQkJCS8vIHRvIGdldCBoY2ZfMTYgZXRjIGRlZmluZWQgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBzZXR0aW5ncyB3aGljaCBpbmx1ZW5jZSBtZGQuaCBvciBkaGYuaAorI2luY2x1ZGUgIm1kZC5oIiAgIAkJCQkvL3RvIGdldCBDT01QX0lEX1NUQSBldGMgZGVmaW5lZAorI2luY2x1ZGUgImRoZi5oIiAgIAkJCQkvL3VzZWQgdG8gYmUgImZoZm1lbS5oIiwgdG8gZ2V0IG1lbWJsb2NrLHBsdWdyZWNvcmQsCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV8xX2RhdGFbXSA9IHsKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHgwQywgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHg2NSwgMHgzNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxQiwgMHgwMCwgMHgxQiwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHgxQiwgMHhCMiwgMHgxQiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHhGRiwgMHgwNywKKwkgMHgwMSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgxMCwgMHgyNywgMHgxMCwgMHgyNywgMHgxNCwgMHgwMCwgMHhEMCwgMHgwNywgMHhEMCwgMHgwNywKKwkgMHgxMCwgMHgyNywgMHgyRiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgyNywKKwkgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHgzMiwgMHgwMCwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwOSwgMHgyQiwgMHgwOSwgMHgyQiwgMHgwOSwgMHhGRiwgMHgwRiwgMHhGMCwgMHgwRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMSwgMHgwMCwgMHg0MCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMiwgMHgwMCwgMHgwQSwgMHgwMCwKKwkgMHgwMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworfTsgIC8qIGZ3X2ltYWdlXzFfZGF0YSAqLworCitzdGF0aWMgY29uc3QgaGNmXzggZndfaW1hZ2VfMl9kYXRhW10gPSB7CisJIDB4RjQsIDB4QTMsIDB4MDAsIDB4MTYsIDB4MDgsIDB4NDAsIDB4MEYsIDB4RDIsIDB4RTEsIDB4MjgsIDB4QTUsIDB4N0MsIDB4NTAsIDB4MzAsIDB4RjEsIDB4ODQsCisJIDB4NDQsIDB4MDgsIDB4QUIsIDB4QUUsIDB4QTUsIDB4QjgsIDB4RkMsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsCisJIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QzYsIDB4ODQsIDB4RjgsIDB4OTksIDB4RUUsCisJIDB4OEQsIDB4RjYsIDB4MEQsIDB4RkYsIDB4QkQsIDB4RDYsIDB4QjEsIDB4REUsIDB4NTQsIDB4OTEsIDB4NTAsIDB4NjAsIDB4MDMsIDB4MDIsIDB4QTksIDB4Q0UsCisJIDB4N0QsIDB4NTYsIDB4MTksIDB4RTcsIDB4NjIsIDB4QjUsIDB4RTYsIDB4NEQsIDB4OUEsIDB4RUMsIDB4NDUsIDB4OEYsIDB4OUQsIDB4MUYsIDB4NDAsIDB4ODksCisJIDB4ODcsIDB4RkEsIDB4MTUsIDB4RUYsIDB4RUIsIDB4QjIsIDB4QzksIDB4OEUsIDB4MEIsIDB4RkIsIDB4RUMsIDB4NDEsIDB4NjcsIDB4QjMsIDB4RkQsIDB4NUYsCisJIDB4RUEsIDB4NDUsIDB4QkYsIDB4MjMsIDB4RjcsIDB4NTMsIDB4OTYsIDB4RTQsIDB4NUIsIDB4OUIsIDB4QzIsIDB4NzUsIDB4MUMsIDB4RTEsIDB4QUUsIDB4M0QsCisJIDB4NkEsIDB4NEMsIDB4NUEsIDB4NkMsIDB4NDEsIDB4N0UsIDB4MDIsIDB4RjUsIDB4NEYsIDB4ODMsIDB4NUMsIDB4NjgsIDB4RjQsIDB4NTEsIDB4MzQsIDB4RDEsCisJIDB4MDgsIDB4RjksIDB4OTMsIDB4RTIsIDB4NzMsIDB4QUIsIDB4NTMsIDB4NjIsIDB4M0YsIDB4MkEsIDB4MEMsIDB4MDgsIDB4NTIsIDB4OTUsIDB4NjUsIDB4NDYsCisJIDB4NUUsIDB4OUQsIDB4MjgsIDB4MzAsIDB4QTEsIDB4MzcsIDB4MEYsIDB4MEEsIDB4QjUsIDB4MkYsIDB4MDksIDB4MEUsIDB4MzYsIDB4MjQsIDB4OUIsIDB4MUIsCisJIDB4M0QsIDB4REYsIDB4MjYsIDB4Q0QsIDB4NjksIDB4NEUsIDB4Q0QsIDB4N0YsIDB4OUYsIDB4RUEsIDB4MUIsIDB4MTIsIDB4OUUsIDB4MUQsIDB4NzQsIDB4NTgsCisJIDB4MkUsIDB4MzQsIDB4MkQsIDB4MzYsIDB4QjIsIDB4REMsIDB4RUUsIDB4QjQsIDB4RkIsIDB4NUIsIDB4RjYsIDB4QTQsIDB4NEQsIDB4NzYsIDB4NjEsIDB4QjcsCisJIDB4Q0UsIDB4N0QsIDB4N0IsIDB4NTIsIDB4M0UsIDB4REQsIDB4NzEsIDB4NUUsIDB4OTcsIDB4MTMsIDB4RjUsIDB4QTYsIDB4NjgsIDB4QjksIDB4MDAsIDB4MDAsCisJIDB4MkMsIDB4QzEsIDB4NjAsIDB4NDAsIDB4MUYsIDB4RTMsIDB4QzgsIDB4NzksIDB4RUQsIDB4QjYsIDB4QkUsIDB4RDQsIDB4NDYsIDB4OEQsIDB4RDksIDB4NjcsCisJIDB4NEIsIDB4NzIsIDB4REUsIDB4OTQsIDB4RDQsIDB4OTgsIDB4RTgsIDB4QjAsIDB4NEEsIDB4ODUsIDB4NkIsIDB4QkIsIDB4MkEsIDB4QzUsIDB4RTUsIDB4NEYsCisJIDB4MTYsIDB4RUQsIDB4QzUsIDB4ODYsIDB4RDcsIDB4OUEsIDB4NTUsIDB4NjYsIDB4OTQsIDB4MTEsIDB4Q0YsIDB4OEEsIDB4MTAsIDB4RTksIDB4MDYsIDB4MDQsCisJIDB4ODEsIDB4RkUsIDB4RjAsIDB4QTAsIDB4NDQsIDB4NzgsIDB4QkEsIDB4MjUsIDB4RTMsIDB4NEIsIDB4RjMsIDB4QTIsIDB4RkUsIDB4NUQsIDB4QzAsIDB4ODAsCisJIDB4OEEsIDB4MDUsIDB4QUQsIDB4M0YsIDB4QkMsIDB4MjEsIDB4NDgsIDB4NzAsIDB4MDQsIDB4RjEsIDB4REYsIDB4NjMsIDB4QzEsIDB4NzcsIDB4NzUsIDB4QUYsCisJIDB4NjMsIDB4NDIsIDB4MzAsIDB4MjAsIDB4MUEsIDB4RTUsIDB4MEUsIDB4RkQsIDB4NkQsIDB4QkYsIDB4NEMsIDB4ODEsIDB4MTQsIDB4MTgsIDB4MzUsIDB4MjYsCisJIDB4MkYsIDB4QzMsIDB4RTEsIDB4QkUsIDB4QTIsIDB4MzUsIDB4Q0MsIDB4ODgsIDB4MzksIDB4MkUsIDB4NTcsIDB4OTMsIDB4RjIsIDB4NTUsIDB4ODIsIDB4RkMsCisJIDB4NDcsIDB4N0EsIDB4QUMsIDB4QzgsIDB4RTcsIDB4QkEsIDB4MkIsIDB4MzIsIDB4OTUsIDB4RTYsIDB4QTAsIDB4QzAsIDB4OTgsIDB4MTksIDB4RDEsIDB4OUUsCisJIDB4N0YsIDB4QTMsIDB4NjYsIDB4NDQsIDB4N0UsIDB4NTQsIDB4QUIsIDB4M0IsIDB4ODMsIDB4MEIsIDB4Q0EsIDB4OEMsIDB4MjksIDB4QzcsIDB4RDMsIDB4NkIsCisJIDB4M0MsIDB4MjgsIDB4NzksIDB4QTcsIDB4RTIsIDB4QkMsIDB4MUQsIDB4MTYsIDB4NzYsIDB4QUQsIDB4M0IsIDB4REIsIDB4NTYsIDB4NjQsIDB4NEUsIDB4NzQsCisJIDB4MUUsIDB4MTQsIDB4REIsIDB4OTIsIDB4MEEsIDB4MEMsIDB4NkMsIDB4NDgsIDB4RTQsIDB4QjgsIDB4NUQsIDB4OUYsIDB4NkUsIDB4QkQsIDB4RUYsIDB4NDMsCisJIDB4QTYsIDB4QzQsIDB4QTgsIDB4MzksIDB4QTQsIDB4MzEsIDB4MzcsIDB4RDMsIDB4OEIsIDB4RjIsIDB4MzIsIDB4RDUsIDB4NDMsIDB4OEIsIDB4NTksIDB4NkUsCisJIDB4QjcsIDB4REEsIDB4OEMsIDB4MDEsIDB4NjQsIDB4QjEsIDB4RDIsIDB4OUMsIDB4RTAsIDB4NDksIDB4QjQsIDB4RDgsIDB4RkEsIDB4QUMsIDB4MDcsIDB4RjMsCisJIDB4MjUsIDB4Q0YsIDB4QUYsIDB4Q0EsIDB4OEUsIDB4RjQsIDB4RTksIDB4NDcsIDB4MTgsIDB4MTAsIDB4RDUsIDB4NkYsIDB4ODgsIDB4RjAsIDB4NkYsIDB4NEEsCisJIDB4NzIsIDB4NUMsIDB4MjQsIDB4MzgsIDB4RjEsIDB4NTcsIDB4QzcsIDB4NzMsIDB4NTEsIDB4OTcsIDB4MjMsIDB4Q0IsIDB4N0MsIDB4QTEsIDB4OUMsIDB4RTgsCisJIDB4MjEsIDB4M0UsIDB4REQsIDB4OTYsIDB4REMsIDB4NjEsIDB4ODYsIDB4MEQsIDB4ODUsIDB4MEYsIDB4OTAsIDB4RTAsIDB4NDIsIDB4N0MsIDB4QzQsIDB4NzEsCisJIDB4QUEsIDB4Q0MsIDB4RDgsIDB4OTAsIDB4MDUsIDB4MDYsIDB4MDEsIDB4RjcsIDB4MTIsIDB4MUMsIDB4QTMsIDB4QzIsIDB4NUYsIDB4NkEsIDB4RjksIDB4QUUsCisJIDB4RDAsIDB4NjksIDB4OTEsIDB4MTcsIDB4NTgsIDB4OTksIDB4MjcsIDB4M0EsIDB4QjksIDB4MjcsIDB4MzgsIDB4RDksIDB4MTMsIDB4RUIsIDB4QjMsIDB4MkIsCisJIDB4MzMsIDB4MjIsIDB4QkIsIDB4RDIsIDB4NzAsIDB4QTksIDB4ODksIDB4MDcsIDB4QTcsIDB4MzMsIDB4QjYsIDB4MkQsIDB4MjIsIDB4M0MsIDB4OTIsIDB4MTUsCisJIDB4MjAsIDB4QzksIDB4NDksIDB4ODcsIDB4RkYsIDB4QUEsIDB4NzgsIDB4NTAsIDB4N0EsIDB4QTUsIDB4OEYsIDB4MDMsIDB4RjgsIDB4NTksIDB4ODAsIDB4MDksCisJIDB4MTcsIDB4MUEsIDB4REEsIDB4NjUsIDB4MzEsIDB4RDcsIDB4QzYsIDB4ODQsIDB4QjgsIDB4RDAsIDB4QzMsIDB4ODIsIDB4QjAsIDB4MjksIDB4NzcsIDB4NUEsCisJIDB4MTEsIDB4MUUsIDB4Q0IsIDB4N0IsIDB4RkMsIDB4QTgsIDB4RDYsIDB4NkQsIDB4M0EsIDB4MkMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MzMsCisJIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzcsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzgsIDB4MDAsIDB4M0EsIDB4MDAsIDB4M0IsCisJIDB4MDAsIDB4M0MsIDB4MDAsIDB4M0QsIDB4MDAsIDB4M0UsIDB4MDAsIDB4M0YsIDB4MDAsIDB4M0YsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4MjgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MEEsIDB4MDIsIDB4MTQsIDB4MDUsIDB4MzIsIDB4MEIsIDB4MzcsIDB4MDgsIDB4NTAsIDB4MEIsIDB4NkUsCisJIDB4MDIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MTYsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MjQsIDB4MDAsCisJIDB4MzAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4NjAsIDB4MDAsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzksIDB4MDAsIDB4MzksIDB4MDAsIDB4MjAsIDB4MDAsIDB4MzksIDB4MDAsIDB4MzksIDB4MDAsIDB4MjAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4MTAsCisJIDB4M0UsIDB4MTEsIDB4RjYsIDB4MTAsIDB4MzgsIDB4MTEsIDB4RkMsIDB4MTAsIDB4MzIsIDB4MTEsIDB4MDIsIDB4MTEsIDB4MkMsIDB4MTEsIDB4MDgsIDB4MTEsCisJIDB4MjYsIDB4MTEsIDB4MEUsIDB4MTEsIDB4MjAsIDB4MTEsIDB4MTQsIDB4MTEsIDB4MUEsIDB4MTEsIDB4MDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MjIsCisJIDB4MDAsIDB4MDQsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MjYsIDB4MDAsIDB4MDQsIDB4MDksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MkEsCisJIDB4MDAsIDB4MDQsIDB4MEEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTYsIDB4MkUsIDB4MDAsIDB4MDQsIDB4MEIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjQsCisJIDB4MDQsIDB4MDQsIDB4MEMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MjgsIDB4MDQsIDB4MDQsIDB4MEQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MkMsCisJIDB4MDQsIDB4MDQsIDB4MEUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MzAsIDB4MDQsIDB4MDQsIDB4MEYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MzQsCisJIDB4MDgsIDB4ODQsIDB4MTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MzgsIDB4MDgsIDB4ODQsIDB4MTEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTQsIDB4M0MsCisJIDB4MDgsIDB4ODQsIDB4MTIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTQsIDB4NDAsIDB4MDgsIDB4ODQsIDB4MTMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjQsCisJIDB4MEMsIDB4OEIsIDB4MTQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NjgsIDB4MEMsIDB4OEIsIDB4MTUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NkMsCisJIDB4MEMsIDB4OEIsIDB4MTYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzAsIDB4MEMsIDB4OEIsIDB4MTcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzQsCisJIDB4MEMsIDB4OEIsIDB4MTgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4NzgsIDB4MEMsIDB4OEIsIDB4MTksIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4N0MsCisJIDB4MEMsIDB4OEIsIDB4MUEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODAsIDB4MEMsIDB4OEIsIDB4MUIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODQsCisJIDB4MEMsIDB4OEIsIDB4MUMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4ODgsIDB4MEMsIDB4OEIsIDB4MUQsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MTcsIDB4OEMsCisJIDB4MEMsIDB4OEIsIDB4MUUsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4OTUsIDB4MTcsIDB4MDQsIDB4MUYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4OTksCisJIDB4MTcsIDB4MDQsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4OUQsIDB4MTcsIDB4MDQsIDB4MjEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4QTEsCisJIDB4MTcsIDB4MDQsIDB4MjIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MEUsIDB4QTUsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MTEsIDB4ODAsIDB4MTEsIDB4QTAsIDB4MTEsCisJIDB4QzAsIDB4MTEsIDB4MTgsIDB4MTIsIDB4NjgsIDB4MTEsIDB4ODgsIDB4MTEsIDB4QTgsIDB4MTEsIDB4QzgsIDB4MTEsIDB4MjAsIDB4MTIsIDB4NzAsIDB4MTEsCisJIDB4OTAsIDB4MTEsIDB4QjAsIDB4MTEsIDB4RDAsIDB4MTEsIDB4MjgsIDB4MTIsIDB4NzgsIDB4MTEsIDB4OTgsIDB4MTEsIDB4QjgsIDB4MTEsIDB4RDgsIDB4MTEsCisJIDB4MzAsIDB4MTIsIDB4RTAsIDB4MTEsIDB4RTgsIDB4MTEsIDB4RjAsIDB4MTEsIDB4RjgsIDB4MTEsIDB4MDAsIDB4MTIsIDB4MDgsIDB4MTIsIDB4MTAsIDB4MTIsCisJIDB4MzgsIDB4MTIsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MEEsIDB4MEEsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MUUsIDB4MUUsIDB4MUUsIDB4MUUsCisJIDB4MUUsIDB4MUUsIDB4MUUsIDB4MUUsIDB4MUUsIDB4MUUsIDB4MUUsIDB4MEEsIDB4MEEsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MTAsIDB4MTAsCisJIDB4MTAsIDB4MTAsIDB4MTcsIDB4MTcsIDB4MTcsIDB4MTcsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTYsIDB4MTYsCisJIDB4MTYsIDB4MTYsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsCisJIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4MEEsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MEEsCisJIDB4MEEsIDB4MEEsIDB4MEEsIDB4N0YsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4N0YsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MEEsIDB4MEEsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsCisJIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4N0YsIDB4OUQsIDB4OUQsIDB4QTEsIDB4QjQsCisJIDB4MTAsIDB4MTAsIDB4MDAsIDB4OUQsIDB4MDgsIDB4MDIsIDB4MDYsIDB4MDAsIDB4QTUsIDB4QTUsIDB4QUEsIDB4QjQsIDB4MTAsIDB4MTAsIDB4MDAsIDB4QTIsCisJIDB4MTUsIDB4MDUsIDB4MDcsIDB4MDAsIDB4QUEsIDB4QUEsIDB4QjQsIDB4QjQsIDB4MTAsIDB4MTAsIDB4MDAsIDB4QTcsIDB4MUMsIDB4MEEsIDB4MDgsIDB4MDAsCisJIDB4QjcsIDB4QjcsIDB4QzEsIDB4QzEsIDB4MTAsIDB4MTAsIDB4MDAsIDB4QjQsIDB4MjksIDB4MTcsIDB4MDgsIDB4MDAsIDB4QkQsIDB4QkQsIDB4QzcsIDB4QzcsCisJIDB4MTAsIDB4MTAsIDB4MDAsIDB4QkEsIDB4MkYsIDB4MUQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4MUYsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4NDIsIDB4MkEsIDB4NUIsIDB4MkEsIDB4N0UsIDB4MkEsIDB4NzEsIDB4MzAsIDB4RUUsIDB4MjksIDB4ODgsIDB4MzAsIDB4QjgsIDB4MkEsCisJIDB4OUYsIDB4MzAsIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4MjEsIDB4MzUsIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4OTMsIDB4MkMsIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4REUsIDB4MkMsIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4RUUsIDB4MjksIDB4NjEsIDB4MkMsIDB4N0MsIDB4MkMsIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4RUUsIDB4MjksIDB4RTEsIDB4MjcsIDB4RDcsIDB4MkEsIDB4RUEsIDB4MkEsIDB4OUEsIDB4MkIsIDB4OUUsIDB4MkIsIDB4RUUsIDB4MjksIDB4RUUsIDB4MjksCisJIDB4NEQsIDB4MkMsIDB4QTEsIDB4RjIsIDB4NjIsIDB4RjIsIDB4MDAsIDB4MDAsIDB4OTksIDB4RjIsIDB4RUUsIDB4RjIsIDB4MTIsIDB4RjMsIDB4NDgsIDB4RjMsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MkEsIDB4OTQsIDB4MkEsIDB4MDAsIDB4MDAsIDB4NjcsIDB4MzAsIDB4N0UsIDB4MzAsIDB4OTUsIDB4MzAsCisJIDB4QUYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RkMsIDB4NDUsIDB4MkQsIDB4RjcsIDB4MkYsIDB4NUEsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4RjksIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RkMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsCisJIDB4QUEsIDB4MkQsIDB4MDYsIDB4MDAsIDB4RjAsIDB4RkYsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4RjYsIDB4RkYsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NkMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RjQsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QTYsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4RjUsIDB4RkYsIDB4NDUsIDB4MkQsIDB4MDAsIDB4MzAsIDB4OUMsIDB4MkQsIDB4MDIsIDB4MDAsIDB4RUQsIDB4RkYsIDB4NDUsIDB4MkQsCisJIDB4MTIsIDB4MzAsIDB4OTgsIDB4MzIsIDB4MDIsIDB4MDAsIDB4RUMsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NDAsIDB4MzAsIDB4OUEsIDB4MzIsIDB4MDIsIDB4MDAsCisJIDB4RUIsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NDYsIDB4MzAsIDB4OUMsIDB4MzIsIDB4MDIsIDB4MDAsIDB4RUUsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NEMsIDB4MzAsCisJIDB4MTIsIDB4MzMsIDB4MDIsIDB4MDAsIDB4REEsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RjIsIDB4MTMsIDB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsCisJIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4NEMsIDB4MzMsIDB4MDYsIDB4MDAsIDB4RTksIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NTIsIDB4MzMsCisJIDB4MDIsIDB4MDAsIDB4RTgsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NTQsIDB4MzMsIDB4MDIsIDB4MDAsIDB4RTcsIDB4RkYsIDB4NDUsIDB4MkQsCisJIDB4NUIsIDB4MkQsIDB4NTYsIDB4MzMsIDB4MDIsIDB4MDAsIDB4RTYsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NTgsIDB4MzMsIDB4MDIsIDB4MDAsCisJIDB4RTUsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NUEsIDB4MzMsIDB4MTAsIDB4MDAsIDB4RTQsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsCisJIDB4NkEsIDB4MzMsIDB4MTgsIDB4MDAsIDB4REIsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4ODIsIDB4MzMsIDB4MDIsIDB4MDAsIDB4REMsIDB4RkYsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4ODQsIDB4MzMsIDB4MDIsIDB4MDAsIDB4RTEsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NUEsIDB4MzQsCisJIDB4MDIsIDB4MDAsIDB4RTAsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NTgsIDB4MzQsIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4NDUsIDB4MkQsCisJIDB4NUIsIDB4MkQsIDB4M0MsIDB4MzQsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsIDB4OTMsIDB4MkQsIDB4MjIsIDB4MkQsIDB4RjIsIDB4MzMsIDB4MjQsIDB4MDAsCisJIDB4MDMsIDB4RkMsIDB4NDUsIDB4MkQsIDB4MDEsIDB4MkYsIDB4OEMsIDB4MzIsIDB4MDIsIDB4MDAsIDB4MDQsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NTUsIDB4MkQsCisJIDB4QjQsIDB4MkQsIDB4MjIsIDB4MDAsIDB4MDYsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4OUEsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MDcsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RjgsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MEUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4MkEsIDB4MkYsIDB4MDIsIDB4MkUsCisJIDB4MjIsIDB4MDAsIDB4QjEsIDB4RkMsIDB4NDUsIDB4MkQsIDB4MzksIDB4MzEsIDB4MDAsIDB4MkYsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkMsIDB4NDUsIDB4MkQsCisJIDB4NUIsIDB4MkQsIDB4MjgsIDB4MkUsIDB4MDIsIDB4MDAsIDB4MjUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4MzQsIDB4MkUsIDB4MDIsIDB4MDAsCisJIDB4MjYsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4MzYsIDB4MkUsIDB4MDIsIDB4MDAsIDB4MjcsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsCisJIDB4MzgsIDB4MkUsIDB4MDIsIDB4MDAsIDB4QjIsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NTUsIDB4MkQsIDB4MjQsIDB4MkYsIDB4MjIsIDB4MDAsIDB4QzEsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4OUUsIDB4MzMsIDB4MjAsIDB4MDAsIDB4QjAsIDB4RkMsIDB4MTgsIDB4MkQsIDB4M0QsIDB4MzEsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4QzQsIDB4RkMsIDB4MTgsIDB4MkQsIDB4NTcsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QzgsIDB4RkMsIDB4MTgsIDB4MkQsCisJIDB4NTUsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QjQsIDB4RkMsIDB4MTgsIDB4MkQsIDB4NzEsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4QjYsIDB4RkMsIDB4MTgsIDB4MkQsIDB4MTksIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RkMsIDB4MTgsIDB4MkQsIDB4NDMsIDB4MzIsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RkMsIDB4MTgsIDB4MkQsIDB4OTksIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RkMsCisJIDB4MTgsIDB4MkQsIDB4RDIsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RkMsIDB4MTgsIDB4MkQsIDB4NTgsIDB4MzMsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4QkUsIDB4RkMsIDB4MTgsIDB4MkQsIDB4ODIsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4RkMsIDB4MTgsIDB4MkQsCisJIDB4Q0YsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QTAsIDB4MEYsIDB4MTAsIDB4MDAsCisJIDB4QjUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4MzgsIDB4MzQsIDB4MDIsIDB4MDAsIDB4QjksIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsCisJIDB4M0EsIDB4MzQsIDB4MDIsIDB4MDAsIDB4OTAsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4M0UsIDB4MzQsIDB4MDIsIDB4MDAsIDB4ODgsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NzIsIDB4MzIsIDB4MDQsIDB4MDAsIDB4ODksIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4NzYsIDB4MzIsCisJIDB4MDQsIDB4MDAsIDB4QzUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4N0EsIDB4MzIsIDB4MDQsIDB4MDAsIDB4MjMsIDB4RkMsIDB4NDUsIDB4MkQsCisJIDB4NUIsIDB4MkQsIDB4MkUsIDB4MkUsIDB4MDQsIDB4MDAsIDB4MkEsIDB4RkMsIDB4NDUsIDB4MkQsIDB4RTksIDB4MkQsIDB4QjAsIDB4MkQsIDB4MDIsIDB4MDAsCisJIDB4QzcsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4QTAsIDB4MzIsIDB4MEEsIDB4MDAsIDB4MjksIDB4RkMsIDB4M0MsIDB4MkUsIDB4MDAsIDB4MkUsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4ODAsIDB4MzIsIDB4MDgsIDB4MDAsIDB4MzIsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4OTgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MzMsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4OUEsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4MzUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4ODgsIDB4MzIsIDB4MDIsIDB4MDAsIDB4QzcsIDB4RkMsIDB4NDUsIDB4MkQsCisJIDB4RDMsIDB4MkYsIDB4OEEsIDB4MzIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QjIsIDB4MkQsIDB4MDIsIDB4MDAsCisJIDB4MDEsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QUEsIDB4MkQsIDB4MDYsIDB4MDAsIDB4MDIsIDB4RkMsIDB4NDUsIDB4MkQsIDB4RDUsIDB4MkQsCisJIDB4MDIsIDB4MkYsIDB4MjIsIDB4MDAsIDB4MDUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QTAsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MDgsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QTQsIDB4MkQsIDB4MDYsIDB4MDAsIDB4MDksIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RkEsIDB4MkQsCisJIDB4MDIsIDB4MDAsIDB4MEIsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RkMsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MEMsIDB4RkMsIDB4NDUsIDB4MkQsCisJIDB4NUIsIDB4MkQsIDB4RkUsIDB4MkQsIDB4MDIsIDB4MDAsIDB4MEQsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4MDAsIDB4MkUsIDB4MDIsIDB4MDAsCisJIDB4MjEsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4MkEsIDB4MkUsIDB4MDIsIDB4MDAsIDB4ODAsIDB4RkMsIDB4QjEsIDB4MkQsIDB4QzEsIDB4MkQsCisJIDB4NDAsIDB4MkUsIDB4QzAsIDB4MDAsIDB4ODEsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QTQsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODMsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4QTgsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODUsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NEEsIDB4MkYsIDB4QTAsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4ODYsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NkUsIDB4MkYsIDB4QjAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MjgsIDB4RkMsIDB4NDUsIDB4MkQsCisJIDB4NUIsIDB4MkQsIDB4M0EsIDB4MkUsIDB4MDIsIDB4MDAsIDB4OTAsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUMsIDB4MkYsIDB4QTIsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4ODcsIDB4RkMsIDB4NDUsIDB4MkQsIDB4OEMsIDB4MkYsIDB4NTAsIDB4MkYsIDB4MjIsIDB4MDMsIDB4MzAsIDB4RkMsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsCisJIDB4M0MsIDB4MkUsIDB4MDIsIDB4MDAsIDB4ODQsIDB4RkMsIDB4NDUsIDB4MkQsIDB4OTIsIDB4MkYsIDB4QUMsIDB4MDEsIDB4MDQsIDB4MDAsIDB4MkIsIDB4RkMsCisJIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RTIsIDB4MzcsIDB4MDIsIDB4MDAsIDB4RjgsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4REMsIDB4MzcsCisJIDB4MDIsIDB4MDAsIDB4RjMsIDB4RkYsIDB4NDUsIDB4MkQsIDB4NUIsIDB4MkQsIDB4RTQsIDB4MzcsIDB4MDIsIDB4MDAsIDB4MjAsIDB4RkQsIDB4NzYsIDB4MkQsCisJIDB4MjIsIDB4MkQsIDB4NUUsIDB4NDAsIDB4MDgsIDB4MDAsIDB4MjEsIDB4RkQsIDB4NzYsIDB4MkQsIDB4MjIsIDB4MkQsIDB4NjIsIDB4NDAsIDB4MEEsIDB4MDAsCisJIDB4MjIsIDB4RkQsIDB4NzYsIDB4MkQsIDB4MjIsIDB4MkQsIDB4NjcsIDB4NDAsIDB4MTYsIDB4MDAsIDB4MjMsIDB4RkQsIDB4NzYsIDB4MkQsIDB4MjIsIDB4MkQsCisJIDB4NzIsIDB4NDAsIDB4MEEsIDB4MDAsIDB4NDUsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4RkMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NDcsIDB4RkQsCisJIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4NzIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDgsIDB4RkQsIDB4OTEsIDB4MkUsIDB4MjIsIDB4MkQsIDB4OTgsIDB4MDEsCisJIDB4MDIsIDB4MDAsIDB4NDksIDB4RkQsIDB4OTEsIDB4MkUsIDB4MjIsIDB4MkQsIDB4OUEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEEsIDB4RkQsIDB4NDUsIDB4MkQsCisJIDB4MjIsIDB4MkQsIDB4OTIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NEIsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4OTQsIDB4MDEsIDB4MDIsIDB4MDAsCisJIDB4NEQsIDB4RkQsIDB4NzYsIDB4MkQsIDB4MjIsIDB4MkQsIDB4NzcsIDB4NDAsIDB4MEMsIDB4MDAsIDB4NEYsIDB4RkQsIDB4QTUsIDB4MkUsIDB4MjIsIDB4MkQsCisJIDB4OTAsIDB4MzIsIDB4MDIsIDB4MDAsIDB4QzIsIDB4RkQsIDB4OUIsIDB4MkUsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NDAsIDB4RkQsCisJIDB4NkUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4QjYsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MjQsIDB4RkQsIDB4QjUsIDB4MkUsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4OTEsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4QzYsIDB4MjUsIDB4MDIsIDB4MDAsIDB4OTMsIDB4RkQsIDB4NDUsIDB4MkQsCisJIDB4MjIsIDB4MkQsIDB4Q0MsIDB4MjUsIDB4MDIsIDB4MDAsIDB4OEYsIDB4RkQsIDB4RDUsIDB4MkUsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCisJIDB4QzEsIDB4RkQsIDB4MDAsIDB4MzEsIDB4MjIsIDB4MkQsIDB4RkEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4QzYsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsCisJIDB4RjgsIDB4MzcsIDB4MDQsIDB4MDAsIDB4MjUsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4OUUsIDB4MDEsIDB4MDIsIDB4MDAsIDB4ODksIDB4RkQsCisJIDB4QjksIDB4MzAsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RkQsIDB4OTMsIDB4MkQsIDB4MjIsIDB4MkQsIDB4MTIsIDB4MzQsCisJIDB4MjQsIDB4MDAsIDB4NDEsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4QkUsIDB4MzMsIDB4MjIsIDB4MDAsIDB4NDIsIDB4RkQsIDB4NDUsIDB4MkQsCisJIDB4MjIsIDB4MkQsIDB4RkUsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NDMsIDB4RkQsIDB4QzIsIDB4MkUsIDB4MjIsIDB4MkQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsCisJIDB4NDQsIDB4RkQsIDB4QUMsIDB4MkUsIDB4MjIsIDB4MkQsIDB4QjIsIDB4MDEsIDB4MDIsIDB4MDAsIDB4NDYsIDB4RkQsIDB4MjEsIDB4MzEsIDB4MjIsIDB4MkQsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NEMsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4NDYsIDB4MkYsIDB4MDIsIDB4MDAsIDB4NTAsIDB4RkQsCisJIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4RjIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NTEsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4RjQsIDB4MDAsCisJIDB4MDIsIDB4MDAsIDB4NTIsIDB4RkQsIDB4NDUsIDB4MkQsIDB4MjIsIDB4MkQsIDB4QzQsIDB4MDEsIDB4MDIsIDB4MDAsIDB4OEMsIDB4RkQsIDB4MzgsIDB4MkQsCisJIDB4MjIsIDB4MkQsIDB4OTgsIDB4MzQsIDB4NTYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4MzgsIDB4MkQsIDB4MjIsIDB4MkQsIDB4RjIsIDB4MzQsIDB4MTQsIDB4MDAsCisJIDB4MDAsIDB4RjEsIDB4NDYsIDB4MDAsIDB4REMsIDB4MkMsIDB4MzYsIDB4MDEsIDB4MDEsIDB4RjEsIDB4ODQsIDB4MDcsIDB4REEsIDB4MkMsIDB4MzgsIDB4MDEsCisJIDB4MDAsIDB4MDMsIDB4QTAsIDB4ODAsIDB4MUUsIDB4MDAsIDB4NzAsIDB4MDEsIDB4RkEsIDB4MDAsIDB4RDQsIDB4MDEsIDB4RkUsIDB4MDAsIDB4M0EsIDB4MDEsCisJIDB4QjYsIDB4MDEsIDB4Q0MsIDB4MkMsIDB4NTQsIDB4MDEsIDB4QzYsIDB4MjUsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MUQsIDB4MDAsIDB4MDAsCisJIDB4QzQsIDB4MUYsIDB4NEUsIDB4MDEsIDB4MEIsIDB4MDAsIDB4QjgsIDB4MDAsIDB4RUMsIDB4MDAsIDB4NDQsIDB4MDAsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUMsIDB4MDksIDB4MDgsIDB4MjQsIDB4MjgsIDB4MDYsIDB4MEMsIDB4MTgsIDB4MDgsIDB4MzAsIDB4MTQsIDB4MEMsCisJIDB4MDgsIDB4MzYsIDB4MTAsIDB4MTIsIDB4MjQsIDB4QjcsIDB4OTcsIDB4QjYsIDB4QTMsIDB4QjcsIDB4QUMsIDB4QjcsIDB4QTgsIDB4QjYsIDB4M0UsIDB4QjcsCisJIDB4MTYsIDB4QjcsIDB4NzksIDB4M0UsIDB4NTcsIDB4M0QsIDB4NzksIDB4M0UsIDB4RjksIDB4M0QsIDB4NUYsIDB4M0QsIDB4NTIsIDB4M0QsIDB4MzMsIDB4M0UsCisJIDB4NTUsIDB4M0UsIDB4NkEsIDB4M0UsIDB4QUMsIDB4M0UsIDB4RDgsIDB4M0UsIDB4RjgsIDB4M0QsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsIDB4MjIsIDB4NDYsCisJIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MjMsIDB4NDYsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsIDB4MUMsIDB4NDcsCisJIDB4MUQsIDB4NDcsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsCisJIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4REEsIDB4NDgsIDB4MUEsIDB4NDgsIDB4NUEsIDB4NDgsIDB4OUEsIDB4NDgsIDB4MzMsIDB4NDgsIDB4NzgsIDB4NDksCisJIDB4NzgsIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4NzksIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksIDB4N0EsIDB4NDksCisJIDB4N0EsIDB4NDksIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0IsIDB4NDksIDB4N0MsIDB4NDksIDB4RDgsIDB4MDMsIDB4REMsIDB4MDMsIDB4RTAsIDB4MDMsCisJIDB4RTQsIDB4MDMsIDB4RjAsIDB4MDMsIDB4RjQsIDB4MDMsIDB4RjgsIDB4MDMsIDB4MEEsIDB4MDQsIDB4MEUsIDB4MDQsIDB4MTIsIDB4MDQsIDB4MTYsIDB4MDQsCisJIDB4MEMsIDB4MDQsIDB4MTAsIDB4MDQsIDB4MTQsIDB4MDQsIDB4MTgsIDB4MDQsIDB4MUMsIDB4MDQsIDB4MjAsIDB4MDQsIDB4MjQsIDB4MDQsIDB4MjgsIDB4MDQsCisJIDB4NEMsIDB4MDQsIDB4NTAsIDB4MDQsIDB4NTQsIDB4MDQsIDB4NTgsIDB4MDQsIDB4NUMsIDB4MDQsIDB4NjAsIDB4MDQsIDB4NjQsIDB4MDQsIDB4NjgsIDB4MDQsCisJIDB4NkMsIDB4MDQsIDB4NzAsIDB4MDQsIDB4NzQsIDB4MDQsIDB4N0QsIDB4MDQsIDB4ODEsIDB4MDQsIDB4ODUsIDB4MDQsIDB4ODksIDB4MDQsIDB4OEQsIDB4MDQsCisJIDB4MTAsIDB4MDAsIDB4OEUsIDB4MTksIDB4QUMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4M0MsIDB4MEMsIDB4MDAsIDB4MDAsCisJIDB4RkYsIDB4M0YsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4RDMsIDB4MjIsIDB4NDQsIDB4MDQsIDB4OUMsIDB4MDIsIDB4Q0IsIDB4NTQsIDB4NDQsIDB4MDQsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MEMsIDB4NzEsIDB4MDAsIDB4MzAsIDB4NTAsCisJIDB4MjAsIDB4MDAsIDB4ODAsIDB4QkYsIDB4MUYsIDB4QTYsIDB4MjgsIDB4MDAsIDB4MEIsIDB4MDIsIDB4NjAsIDB4ODQsIDB4NEMsIDB4MDAsIDB4MDIsIDB4MDAsCisJIDB4NEIsIDB4MUMsIDB4OTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MEIsIDB4MzQsIDB4MDQsIDB4RkQsIDB4MzQsIDB4MzQsIDB4MDAsIDB4MzgsIDB4MDQsCisJIDB4RkQsIDB4MzQsIDB4MzQsIDB4MDAsIDB4M0MsIDB4MDQsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NTIsIDB4MTQsIDB4MDAsCisJIDB4MDQsIDB4MDgsIDB4MEUsIDB4MzIsIDB4MDAsIDB4QTYsIDB4MTAsIDB4MDgsIDB4QzQsIDB4MDMsIDB4NTAsIDB4NjAsIDB4MTgsIDB4MDgsIDB4RjAsIDB4M0YsCisJIDB4RkMsIDB4MDEsIDB4MTAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MTQsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDEsIDB4MjAsIDB4MEMsCisJIDB4QjAsIDB4MDAsIDB4QjAsIDB4QjgsIDB4MjQsIDB4MEMsIDB4MDAsIDB4MDAsIDB4QUIsIDB4MDUsIDB4MkMsIDB4MEMsIDB4ODAsIDB4MDUsIDB4MDAsIDB4RkYsCisJIDB4MzAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4QjAsIDB4MDQsIDB4MzQsIDB4MEMsIDB4MDMsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NDQsIDB4MEMsIDB4MDQsIDB4MDAsCisJIDB4RkYsIDB4MEYsIDB4MDAsIDB4MTAsIDB4MkUsIDB4MDAsIDB4MEMsIDB4RTMsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDQsIDB4NDQsIDB4MDQsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDQsCisJIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDMsIDB4NDgsIDB4MEMsIDB4MDAsIDB4MDAsIDB4N0YsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDgsIDB4NDgsCisJIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDgsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4NzEsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsCisJIDB4NUUsIDB4NDAsIDB4MDEsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MzYsIDB4QzAsIDB4RTgsIDB4MEUsIDB4MUMsIDB4MDAsIDB4NzgsIDB4QzgsIDB4QTUsIDB4NDAsCisJIDB4MjQsIDB4MDAsIDB4OUUsIDB4QjAsIDB4QjksIDB4OTUsIDB4MDgsIDB4MDgsIDB4MDAsIDB4RUEsIDB4NDAsIDB4MDEsIDB4MEMsIDB4MDgsIDB4MDAsIDB4RUEsCisJIDB4MDAsIDB4MDAsIDB4MUMsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDIsIDB4MDcsIDB4MjAsIDB4MDgsIDB4N0IsIDB4MDAsIDB4RDQsIDB4MDksIDB4MkMsIDB4MDQsCisJIDB4MTQsIDB4MDAsIDB4NTAsIDB4MTQsIDB4MzAsIDB4MDQsIDB4MjgsIDB4MEYsIDB4MjgsIDB4N0YsIDB4MTgsIDB4MDgsIDB4MjAsIDB4MDAsIDB4RkMsIDB4MDEsCisJIDB4MDQsIDB4MTAsIDB4NjksIDB4MDAsIDB4RkQsIDB4QzMsIDB4MDgsIDB4MTAsIDB4NjksIDB4MDAsIDB4RkQsIDB4QzMsIDB4MDgsIDB4MEMsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4NDgsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MEMsIDB4MDAsIDB4MDAsIDB4N0YsIDB4MDAsIDB4MDQsIDB4MDQsCisJIDB4MDgsIDB4NDgsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUUsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDgsIDB4NDAsIDB4MDIsIDB4MDAsCisJIDB4MDAsIDB4MEMsIDB4NzEsIDB4MDAsIDB4MzAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4NUUsIDB4NDgsIDB4MDEsIDB4MDAsIDB4MTgsIDB4MDAsIDB4M0EsIDB4QzAsCisJIDB4RTgsIDB4MDQsIDB4MUMsIDB4MDAsIDB4NzgsIDB4RDAsIDB4QTUsIDB4NDAsIDB4MjQsIDB4MDAsIDB4OUUsIDB4QjAsIDB4QjksIDB4ODUsIDB4MkMsIDB4MDQsCisJIDB4MTQsIDB4MDAsIDB4NTAsIDB4MTQsIDB4MzAsIDB4MDQsIDB4MjgsIDB4MEYsIDB4MjgsIDB4N0YsIDB4MDgsIDB4MDgsIDB4MDAsIDB4RUEsIDB4NDAsIDB4MDEsCisJIDB4MEMsIDB4MDgsIDB4MDAsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MUMsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NDIsIDB4MDcsIDB4MjAsIDB4MDgsIDB4N0IsIDB4MDAsCisJIDB4RDQsIDB4MDksIDB4MTgsIDB4MDgsIDB4RjAsIDB4M0YsIDB4RkMsIDB4MDEsIDB4MDQsIDB4MTAsIDB4NjksIDB4MDAsIDB4REQsIDB4Q0QsIDB4MDgsIDB4MTAsCisJIDB4NjksIDB4MDAsIDB4REQsIDB4Q0QsIDB4MDgsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDgsIDB4MDQsIDB4NDAsIDB4MDEsIDB4NDEsIDB4MDEsIDB4MEMsIDB4MDQsIDB4NDAsIDB4MDQsIDB4NDEsIDB4MDQsIDB4MTAsIDB4MDQsIDB4RDYsIDB4MDgsCisJIDB4NTYsIDB4MEEsIDB4MTQsIDB4MDQsIDB4NDIsIDB4MDIsIDB4NTYsIDB4MEEsIDB4MTgsIDB4MDQsIDB4NTYsIDB4MEEsIDB4NDAsIDB4MDIsIDB4MUMsIDB4MDQsCisJIDB4NDIsIDB4MEEsIDB4NDIsIDB4MkEsIDB4MjAsIDB4MDQsIDB4QzIsIDB4MDAsIDB4RDYsIDB4MDgsIDB4MjQsIDB4MDQsIDB4RDYsIDB4MDgsIDB4QzAsIDB4MDAsCisJIDB4MjgsIDB4MDQsIDB4QzIsIDB4MDgsIDB4QzIsIDB4MjgsIDB4MDgsIDB4MDQsIDB4NDAsIDB4MDEsIDB4NDEsIDB4MDEsIDB4MEMsIDB4MDQsIDB4MDAsIDB4MDEsCisJIDB4MDEsIDB4MDEsIDB4MTAsIDB4MDQsIDB4NTYsIDB4MEEsIDB4NTYsIDB4MEEsIDB4MTQsIDB4MDQsIDB4NDIsIDB4MDIsIDB4NTYsIDB4MEEsIDB4MTgsIDB4MDQsCisJIDB4NTYsIDB4MEEsIDB4NDAsIDB4MDIsIDB4MUMsIDB4MDQsIDB4NDIsIDB4MEEsIDB4NDIsIDB4MkEsIDB4MjAsIDB4MDQsIDB4NDIsIDB4MDIsIDB4NTYsIDB4MEEsCisJIDB4MjQsIDB4MDQsIDB4NTYsIDB4MEEsIDB4NDAsIDB4MDIsIDB4MjgsIDB4MDQsIDB4NDIsIDB4MEEsIDB4NDIsIDB4MkEsIDB4MDgsIDB4MDQsIDB4NDAsIDB4MDEsCisJIDB4NDEsIDB4MDEsIDB4MEMsIDB4MDQsIDB4NDAsIDB4MDQsIDB4NDEsIDB4MDQsIDB4MTAsIDB4MDQsIDB4Q0UsIDB4MDgsIDB4NEUsIDB4MEEsIDB4MTQsIDB4MDQsCisJIDB4NDIsIDB4MDIsIDB4NEUsIDB4MEEsIDB4MTgsIDB4MDQsIDB4NEUsIDB4MEEsIDB4NDAsIDB4MDIsIDB4MUMsIDB4MDQsIDB4NDIsIDB4MEEsIDB4NDIsIDB4MkEsCisJIDB4MjAsIDB4MDQsIDB4QzIsIDB4MDAsIDB4Q0UsIDB4MDgsIDB4MjQsIDB4MDQsIDB4Q0UsIDB4MDgsIDB4QzAsIDB4MDAsIDB4MjgsIDB4MDQsIDB4QzIsIDB4MDgsCisJIDB4QzIsIDB4MjgsIDB4MDgsIDB4MDQsIDB4NDAsIDB4MDEsIDB4NDEsIDB4MDEsIDB4MEMsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTAsIDB4MDQsCisJIDB4NEUsIDB4MEEsIDB4NEUsIDB4MEEsIDB4MTQsIDB4MDQsIDB4NDIsIDB4MDIsIDB4NEUsIDB4MEEsIDB4MTgsIDB4MDQsIDB4NEUsIDB4MEEsIDB4NDAsIDB4MDIsCisJIDB4MUMsIDB4MDQsIDB4NDIsIDB4MEEsIDB4NDIsIDB4MkEsIDB4MjAsIDB4MDQsIDB4NDIsIDB4MDIsIDB4NEUsIDB4MEEsIDB4MjQsIDB4MDQsIDB4NEUsIDB4MEEsCisJIDB4NDAsIDB4MDIsIDB4MjgsIDB4MDQsIDB4NDIsIDB4MEEsIDB4NDIsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDUsIDB4MDAsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsCisJIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsCisJIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsCisJIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsCisJIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTYsIDB4QTAsIDB4MTcsIDB4QTAsIDB4MTcsIDB4QTAsIDB4MTcsIDB4QTAsIDB4MTgsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsCisJIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsCisJIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsCisJIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsCisJIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4RkYsIDB4MDYsIDB4MDAsIDB4MDAsIDB4NjUsIDB4MDAsCisJIDB4NjUsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NUQsIDB4MDAsIDB4NTIsIDB4MDAsIDB4NDgsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzgsIDB4MDAsCisJIDB4MzEsIDB4MDAsIDB4MkMsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MjMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NjUsIDB4MDAsCisJIDB4NjUsIDB4MDAsIDB4NjUsIDB4MDAsIDB4NUQsIDB4MDAsIDB4NTIsIDB4MDAsIDB4NDgsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MzgsIDB4MDAsIDB4MzEsIDB4MDAsCisJIDB4MkMsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MjMsIDB4MDAsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsCisJIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsCisJIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsCisJIDB4MEMsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTUsIDB4MDAsIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsCisJIDB4NzMsIDB4NzAsIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsCisJIDB4MjEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsCisJIDB4MjAsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MTUsIDB4MDAsCisJIDB4NkUsIDB4NkYsIDB4NkUsIDB4MkQsIDB4NzMsIDB4NzAsIDB4NjUsIDB4NjMsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NjQsIDB4MjAsIDB4NTMsIDB4NTMsCisJIDB4NDksIDB4NDQsIDB4MjAsIDB4MjEsIDB4MjEsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MDEsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NjQsIDB4MDAsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsCisJIDB4NTIsIDB4NEQsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzIsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4NjksCisJIDB4NzIsIDB4NzMsIDB4NzQsIDB4MjAsIDB4NTcsIDB4NjEsIDB4NzYsIDB4NjUsIDB4NEMsIDB4NDEsIDB4NEUsIDB4MjAsIDB4NDksIDB4NDksIDB4MjAsIDB4NTMsCisJIDB4NTMsIDB4NDksIDB4NDQsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4MEYsIDB4RjAsIDB4MEYsCisJIDB4MEYsIDB4MDAsIDB4NTAsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsCisJIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MTQsIDB4MDAsCisJIDB4MTQsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MjQsIDB4MDAsIDB4RkYsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDksIDB4MDAsIDB4MDksIDB4MDAsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4MEEsIDB4MDAsCisJIDB4MEIsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsCisJIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4ODIsIDB4ODQsIDB4OEIsIDB4OTYsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MUMsIDB4ODUsIDB4MDAsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MUIsIDB4MDAsIDB4MTcsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MEIsIDB4MDAsCisJIDB4MEIsIDB4MDAsIDB4MDksIDB4MDAsIDB4MTcsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MEIsIDB4MDAsIDB4MDksIDB4MDAsCisJIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MEQsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsCisJIDB4RDgsIDB4MEMsIDB4QzAsIDB4MDgsIDB4OTAsIDB4MEQsIDB4NjAsIDB4MDksIDB4NDgsIDB4MEUsIDB4MzAsIDB4MEEsIDB4MjQsIDB4MEYsIDB4MTgsIDB4MEIsCisJIDB4MEIsIDB4NkUsIDB4MEIsIDB4MzcsIDB4MDIsIDB4MTQsIDB4MDEsIDB4MEEsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsCisJIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4NDMsIDB4NzUsIDB4NzIsIDB4NzIsIDB4NjUsCisJIDB4NkUsIDB4NzQsIDB4MjAsIDB4NTMsIDB4NjUsIDB4NzIsIDB4NzYsIDB4NjksIDB4NjMsIDB4NjUsIDB4MjAsIDB4NTMsIDB4NjUsIDB4NzQsIDB4MjAsIDB4NDksCisJIDB4NjQsIDB4NjUsIDB4NkUsIDB4NzQsIDB4NjksIDB4NjYsIDB4NjksIDB4NjUsIDB4NzIsIDB4MjAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MzAsIDB4MDEsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4REQsIDB4MDAsIDB4NTAsCisJIDB4RjIsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDIsIDB4MDAsIDB4NTAsCisJIDB4RjIsIDB4MDQsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDAsIDB4MDAsIDB4NTAsIDB4RjIsIDB4MDEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MTUsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTUsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTQsIDB4MDAsCisJIDB4MTEsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4QkUsIDB4MzMsIDB4MUUsIDB4MzMsIDB4Q0MsIDB4MzUsIDB4RDAsIDB4MzUsIDB4RDQsIDB4MzUsIDB4MTIsIDB4MzQsCisJIDB4MDQsIDB4MzYsIDB4MDgsIDB4MzYsIDB4RjIsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MkYsIDB4MTQsIDB4MzMsIDB4MDgsIDB4MzYsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4QkUsIDB4MzMsIDB4MUUsIDB4MzMsIDB4Q0MsIDB4MzUsIDB4RDAsIDB4MzUsIDB4RDQsIDB4MzUsIDB4MTIsIDB4MzQsCisJIDB4MDQsIDB4MzYsIDB4MDgsIDB4MzYsIDB4RjIsIDB4MzMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4MDAsIDB4MDAsIDB4QkUsIDB4MzMsIDB4MTQsIDB4MzMsIDB4MDgsIDB4MzYsIDB4NUMsIDB4MzQsIDB4MkEsIDB4MzMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDcsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MkEsCisJIDB4MDAsIDB4MDAsIDB4MDgsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDUsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUQsIDB4RkEsCisJIDB4RjksIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MTksIDB4MEEsCisJIDB4MDksIDB4NDYsIDB4MUMsIDB4NjAsIDB4MTgsIDB4MDAsIDB4MTksIDB4MUQsIDB4MDksIDB4NDIsIDB4MUMsIDB4NjAsIDB4MDAsIDB4MDAsCisKK307ICAvKiBmd19pbWFnZV8yX2RhdGEgKi8KKworc3RhdGljIGNvbnN0IGhjZl84IGZ3X2ltYWdlXzNfZGF0YVtdID0geworCSAweDJBLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LCAweDFBLCAweDAwLCAweDgwLCAweDNBLCAweDE1LCAweDAwLCAweDdGLCAweEYxLAorCSAweDMyLCAweEYyLCAweDMzLCAweEYyLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDBGLCAweDAyLCAweEQwLCAweDgwLCAweDM0LCAweEYyLCAweDgxLCAweEYxLAorCSAweDBCLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweEU5LCAweDYwLCAweDU4LCAweDRGLCAweDMwLCAweDc4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDYwLCAweDU4LCAweDRGLCAweEUzLCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEQ3LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEY0LAorCSAweEFBLCAweDYwLCAweEFBLCAweDY1LCAweDA5LCAweEYyLCAweDVBLCAweEQwLCAweEQ0LCAweDgwLCAweDAzLCAweDY0LCAweDEyLCAweDAyLCAweEQwLCAweDgwLAorCSAweDFELCAweDYwLCAweDYwLCAweDY1LCAweDBFLCAweDAyLCAweDVBLCAweEQyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweDAxLCAweDYwLCAweDAwLCAweDY1LAorCSAweDA4LCAweDAyLCAweDVBLCAweEQyLCAweEZGLCAweEZGLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDFDLCAweDYwLCAweEQ3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweEVBLCAweEYxLCAweDVBLCAweEQxLCAweDQ0LCAweDQ4LCAweDVBLCAweEQxLCAweDQ0LCAweDRBLCAweDI2LCAweDQ2LAorCSAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDQ0LCAweDRDLCAweEQ4LCAweDgzLCAweDcwLCAweDYxLCAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLAorCSAweDA3LCAweDBFLCAweDA4LCAweEYyLCAweDA4LCAweDAwLCAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDBFLCAweDAzLCAweDAwLAorCSAweDFDLCAweDYwLCAweEVELCAweDc4LCAweEZGLCAweEZGLCAweDU4LCAweDRGLCAweDc5LCAweDAwLCAweDlDLCAweDgwLCAweDAxLCAweDY1LCAweDAyLCAweDAyLAorCSAweDAwLCAweDY1LCAweDAyLCAweDAwLCAweEZGLCAweDNCLCAweEY3LCAweDAxLCAweDU4LCAweDRGLCAweDcwLCAweDAwLCAweDlDLCAweDgwLCAweDQ1LCAweDQyLAorCSAweEVBLCAweDAyLCAweDU4LCAweDRGLCAweDZCLCAweDAwLCAweDlDLCAweDgwLCAweEZGLCAweEZGLCAweEU1LCAweDAyLCAweDU4LCAweDRGLCAweDY2LCAweDAwLAorCSAweDlDLCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDAwLCAweDY1LCAweDQ1LCAweDQyLCAweEY4LCAweDAxLCAweEZGLCAweDNBLCAweDI5LCAweDAwLAorCSAweDYwLCAweDQ3LCAweEZGLCAweEI1LCAweDI4LCAweDQ0LCAweEZGLCAweEI0LCAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweEQ0LCAweDAyLCAweDYwLCAweDQ1LAorCSAweDI4LCAweDQ3LCAweDJBLCAweDVGLCAweDQwLCAweDQ4LCAweDJBLCAweDQ3LCAweDJDLCAweDVGLCAweDQwLCAweDRBLCAweDJDLCAweDQ3LCAweDY1LCAweDVGLAorCSAweDQwLCAweDRDLCAweDEwLCAweDY0LCAweDQwLCAweDQyLCAweDI4LCAweDQ1LCAweDA1LCAweDAwLCAweDU4LCAweDRGLCAweDQ3LCAweDAwLCAweDk0LCAweDgwLAorCSAweDI4LCAweDQ1LCAweDI2LCAweDAyLCAweDU4LCAweDRGLCAweDQyLCAweDAwLCAweDk0LCAweDgwLCAweDJBLCAweDQ1LCAweDIxLCAweDAyLCAweDU4LCAweDRGLAorCSAweDNELCAweDAwLCAweDk0LCAweDgwLCAweEZGLCAweEZGLCAweDFDLCAweDAyLCAweDIyLCAweDQ0LCAweDRDLCAweDgyLCAweDJDLCAweDQ1LCAweDMxLCAweDAzLAorCSAweEVDLCAweDAxLCAweDEwLCAweDY1LCAweDQ1LCAweDQyLCAweDI4LCAweDQ1LCAweDk0LCAweDgwLCAweDJBLCAweDQ1LCAweDIxLCAweDAyLCAweDU4LCAweDRGLAorCSAweDJELCAweDAwLCAweDk0LCAweDgwLCAweDJDLCAweDQ1LCAweDFDLCAweDAyLCAweDU4LCAweDRGLCAweDI4LCAweDAwLCAweDk0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDE3LCAweDAyLCAweDIyLCAweDQ0LCAweDRDLCAweDgyLCAweDI4LCAweDQ1LCAweDFDLCAweDAzLCAweDU4LCAweDRGLCAweDFGLCAweDAwLCAweEVDLCAweDAxLAorCSAweDQwLCAweDRCLCAweDI4LCAweDQ3LCAweDQwLCAweDQ4LCAweDJBLCAweDQ3LCAweDQwLCAweDRBLCAweDJDLCAweDQ3LCAweDYwLCAweDQ1LCAweDJBLCAweDVFLAorCSAweDQwLCAweDRDLCAweDJBLCAweDQ0LCAweDI4LCAweDVFLCAweDQwLCAweDRBLCAweDI4LCAweDQ0LCAweDY1LCAweDVFLCAweDQwLCAweDQ4LCAweDJCLCAweDQ0LAorCSAweDY4LCAweDY1LCAweEQ3LCAweDgwLCAweEZGLCAweEZGLCAweDE3LCAweDBFLCAweDkwLCAweDAxLCAweDI2LCAweDQ2LCAweEQwLCAweDYwLCAweEI1LCAweDc4LAorCSAweEZGLCAweEZGLCAweEI5LCAweEZGLCAweDI2LCAweDQ2LCAweEQwLCAweDYwLCAweEI1LCAweDc4LCAweEZGLCAweEZGLCAweEM5LCAweDgxLCAweENCLCAweDgzLAorCSAweDA3LCAweDFDLCAweDAxLCAweDFELCAweDA4LCAweDAwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweEZGLCAweEI0LCAweEQ4LCAweDgxLAorCSAweDVBLCAweEQyLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweEQwLCAweDYwLCAweDU4LCAweDRGLCAweEQxLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDYwLCAweEZFLCAweDYxLCAweDAwLCAweEY0LCAweDEyLCAweDYzLCAweDZBLCAweDY0LCAweDAxLCAweDY1LCAweEJELCAweEQwLCAweEM4LCAweDg0LAorCSAweDU5LCAweEQ5LCAweEZDLCAweDAyLCAweDY1LCAweDQwLCAweDAxLCAweDNBLCAweDA1LCAweDAwLCAweDAwLCAweEY0LCAweDAwLCAweDY1LCAweDBFLCAweDY0LAorCSAweDA0LCAweDYzLCAweEY0LCAweDAxLCAweDJGLCAweDYwLCAweDU4LCAweDY0LCAweDBFLCAweDYwLCAweEQ5LCAweEZCLCAweDFELCAweDYwLCAweEIwLCAweDY0LAorCSAweEEwLCAweERGLCAweDE3LCAweDYwLCAweEE4LCAweEYzLCAweDBFLCAweDYwLCAweERCLCAweEZCLCAweDBFLCAweDYwLCAweERCLCAweEYzLCAweDBFLCAweDYwLAorCSAweEQ4LCAweEYzLCAweDYwLCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDFELCAweDYwLCAweDdCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDY0LCAweDBFLCAweDYwLCAweEQ3LCAweEZCLCAweDBFLCAweDYwLCAweEQ5LCAweEYzLCAweDAyLCAweDYwLCAweDAwLCAweDYxLCAweDQwLCAweDQ4LAorCSAweDQwLCAweDRBLCAweEZBLCAweEE0LCAweEEwLCAweEQzLCAweDQxLCAweDRDLCAweERDLCAweDg0LCAweEE4LCAweDg0LCAweDBFLCAweDYwLCAweERDLCAweEZCLAorCSAweDI4LCAweDQ1LCAweDQ0LCAweDhCLCAweDJCLCAweEQzLCAweDBFLCAweDYwLCAweERBLCAweEZCLCAweDI4LCAweDQyLCAweDRBLCAweEQzLCAweDJDLCAweDQ1LAorCSAweDQ0LCAweDhDLCAweDAxLCAweDY0LCAweDQwLCAweDQ4LCAweDBFLCAweDYwLCAweERDLCAweEYzLCAweEZGLCAweEZGLCAweDM2LCAweDE4LCAweENDLCAweDg0LAorCSAweEEyLCAweERCLCAweDBFLCAweDYwLCAweERBLCAweEYzLCAweDI4LCAweDQ1LCAweEE0LCAweDgwLCAweEZGLCAweEZGLCAweDA4LCAweDAzLCAweDYwLCAweEZFLAorCSAweDJDLCAweEQzLCAweDJBLCAweEQzLCAweDYwLCAweDQ1LCAweEQ0LCAweDgwLCAweDIwLCAweEZFLCAweDAxLCAweDAzLCAweDEyLCAweDAwLCAweDI4LCAweDQ0LAorCSAweEUwLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDI0LCAweDAxLCAweDAwLCAweDA2LCAweDAwLCAweDJCLCAweDQ0LCAweDU4LCAweDhCLCAweDJCLCAweEQzLAorCSAweDBFLCAweDYwLCAweERBLCAweEZCLCAweDAxLCAweDY0LCAweDQwLCAweDQ4LCAweDJBLCAweDQ0LCAweDVDLCAweDhBLCAweDJDLCAweDQ0LCAweDVDLCAweDhDLAorCSAweERBLCAweDAxLCAweDAwLCAweDY0LCAweDBFLCAweDYwLCAweEQ3LCAweEZCLCAweDBFLCAweDYwLCAweEQ5LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LAorCSAweEZBLCAweEE0LCAweEEwLCAweEQzLCAweEZGLCAweEZGLCAweEM0LCAweDgxLCAweDY1LCAweDQ0LCAweEZDLCAweEE0LCAweEEwLCAweEQzLCAweDA2LCAweEExLAorCSAweERDLCAweDg0LCAweEE4LCAweDg0LCAweDQ0LCAweDk0LCAweDBFLCAweDYwLCAweEQ5LCAweEZCLCAweDBFLCAweDYwLCAweEQ3LCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDI2LCAweDA5LCAweDAwLCAweDBFLCAweDYwLCAweEQ4LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweEEyLCAweERCLAorCSAweDk0LCAweDAxLCAweDFDLCAweDYwLCAweEQ3LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweERCLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDJFLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDI1LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDVGLCAweEZCLCAweDAxLCAweDYwLAorCSAweDA1LCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDI1LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDVFLCAweEZCLCAweDAwLCAweDYwLAorCSAweDAyLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDI1LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDY1LCAweEZCLCAweDFGLCAweDYwLAorCSAweDZELCAweDY0LCAweDA4LCAweDYwLCAweDM2LCAweEZCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLCAweDEwLCAweDYwLCAweDMwLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAwLCAweDYwLAorCSAweDE0LCAweDYzLCAweDAxLCAweDYwLCAweEMyLCAweDYxLCAweDJELCAweDYwLCAweDk4LCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLAorCSAweDAwLCAweDYwLCAweDhBLCAweDYzLCAweDJELCAweDYwLCAweDBDLCAweDYxLCAweDJELCAweDYwLCAweEIwLCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweDE5LCAweDYwLCAweDQ4LCAweEYxLCAweEZGLCAweEI1LCAweDY0LCAweDQwLCAweDAyLCAweDJCLAorCSAweDBCLCAweDAwLCAweDYwLCAweDQwLCAweDAzLCAweDJFLCAweDA4LCAweDAwLCAweDgwLCAweDJCLCAweDA2LCAweDAwLCAweDMyLCAweDQ0LCAweDAwLCAweDYwLAorCSAweDgwLCAweDYzLCAweDNDLCAweDk0LCAweDQwLCAweDUyLCAweDA1LCAweDAwLCAweDMyLCAweDQ0LCAweEZGLCAweDYwLCAweDdGLCAweDYzLCAweDJDLCAweDk0LAorCSAweDQwLCAweDUyLCAweDY1LCAweDQzLCAweDE2LCAweDYwLCAweEFCLCAweEZELCAweDE2LCAweDYwLCAweEMyLCAweEYxLCAweDY2LCAweDQxLCAweEE2LCAweEY1LAorCSAweDNBLCAweEYyLCAweDY0LCAweDQwLCAweDAxLCAweDM2LCAweDIyLCAweDY0LCAweDNBLCAweEZBLCAweDYxLCAweDQ2LCAweDMyLCAweDQ1LCAweDE2LCAweDYwLAorCSAweENCLCAweEYxLCAweDEwLCAweDY3LCAweEI0LCAweDg1LCAweDY0LCAweDQwLCAweDAxLCAweDJBLCAweDk0LCAweDg1LCAweDQ1LCAweDUyLCAweEZGLCAweDYwLAorCSAweEU3LCAweDY1LCAweDMyLCAweDQxLCAweEE1LCAweDgxLCAweDE2LCAweDYwLCAweEMyLCAweEYzLCAweDA4LCAweDY1LCAweEZGLCAweEEwLCAweEZGLCAweEZGLAorCSAweDAxLCAweDAzLCAweDA3LCAweDAwLCAweDE2LCAweDYwLCAweEM0LCAweEYzLCAweEI1LCAweDgxLCAweDEwLCAweDY1LCAweDYwLCAweDQwLCAweDAxLCAweDI2LAorCSAweEI1LCAweDgxLCAweDQxLCAweDUyLCAweDE5LCAweDYwLCAweDQ4LCAweEYzLCAweDM3LCAweDYwLCAweEU2LCAweDYzLCAweEYwLCAweDg0LCAweEYwLCAweDg0LAorCSAweEYwLCAweDg0LCAweDAzLCAweEI1LCAweEYwLCAweDg0LCAweEYwLCAweDg0LCAweDAzLCAweEI0LCAweDY1LCAweDVDLCAweEEzLCAweEQ5LCAweDM3LCAweDYwLAorCSAweEU4LCAweDYzLCAweDAyLCAweEE4LCAweEEzLCAweERCLCAweDE1LCAweDAyLCAweDAwLCAweDYwLCAweEM4LCAweDY0LCAweDFCLCAweDYwLCAweEY1LCAweEZCLAorCSAweDFCLCAweDYwLCAweEY5LCAweEZCLCAweDA3LCAweDYwLCAweEQwLCAweDY0LCAweDFCLCAweDYwLCAweEY2LCAweEZCLCAweDFCLCAweDYwLCAweEZBLCAweEZCLAorCSAweDAxLCAweDYwLCAweDkwLCAweDY0LCAweDFCLCAweDYwLCAweEY3LCAweEZCLCAweDAwLCAweDYwLCAweDY0LCAweDY0LCAweDFCLCAweDYwLCAweEY4LCAweEZCLAorCSAweDA2LCAweDAwLCAweDY0LCAweDY0LCAweDFCLCAweDYwLCAweEY3LCAweEZCLCAweDY0LCAweDY0LCAweDFCLCAweDYwLCAweEY4LCAweEZCLCAweDE5LCAweDYwLAorCSAweDQ4LCAweEYxLCAweDAxLCAweDY0LCAweDY0LCAweDQwLCAweDQwLCAweDJBLCAweDAyLCAweDAwLCAweDFCLCAweDYwLCAweEVFLCAweEZCLCAweDMzLCAweDYwLAorCSAweEJDLCAweDYxLCAweDJELCAweDYwLCAweDBFLCAweDY0LCAweDIwLCAweDYzLCAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEJBLCAweEYxLAorCSAweDdFLCAweEY5LCAweDFBLCAweDYzLCAweDAwLCAweDYwLCAweEZDLCAweDYxLCAweDAwLCAweDY0LCAweDU5LCAweERCLCAweEZFLCAweDFGLCAweDQwLCAweDQwLAorCSAweDAxLCAweDY0LCAweDg1LCAweEZCLCAweDE3LCAweDYwLCAweDE0LCAweEYzLCAweDM1LCAweDYwLCAweDM2LCAweDYxLCAweEZFLCAweEE0LCAweEUwLCAweDg0LAorCSAweDA0LCAweDI0LCAweDBDLCAweDAwLCAweEUwLCAweDg0LCAweDQxLCAweDkxLCAweDFBLCAweDYwLCAweDFGLCAweEYzLCAweEExLCAweEQxLCAweDU5LCAweEQxLAorCSAweEEwLCAweDgzLCAweDFBLCAweDYwLCAweDFCLCAweEZELCAweEEwLCAweDgzLCAweDFBLCAweDYwLCAweDFBLCAweEZELCAweEU0LCAweEYzLCAweDdELCAweEZCLAorCSAweENGLCAweEYxLCAweDEwLCAweDYwLCAweEVDLCAweDYzLCAweDJGLCAweDE4LCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDEyLCAweDAwLCAweENDLCAweDg0LAorCSAweDA2LCAweEEzLCAweEZELCAweDAyLCAweEEzLCAweEQzLCAweDEwLCAweDYwLCAweEYyLCAweDYzLCAweDI1LCAweDFCLCAweDExLCAweDYwLCAweDQ0LCAweDY1LAorCSAweEEzLCAweEQzLCAweDA2LCAweEEzLCAweEQ3LCAweDgwLCAweDAyLCAweDFCLCAweEZCLCAweDA0LCAweDFELCAweDAwLCAweEY4LCAweEEzLCAweEEzLCAweEQzLAorCSAweDE4LCAweDAwLCAweDExLCAweDYwLCAweDYwLCAweDYzLCAweDEyLCAweDYwLCAweDQwLCAweDY1LCAweEEzLCAweEQxLCAweDA4LCAweEEzLCAweEQwLCAweDgwLAorCSAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweEZBLCAweDA0LCAweDBGLCAweDAwLCAweEZBLCAweEEzLCAweEEzLCAweEQzLCAweDExLCAweDYwLCAweDYyLCAweDYzLAorCSAweDBBLCAweDFCLCAweEEzLCAweEQzLCAweDA4LCAweEEzLCAweEQ3LCAweDgwLCAweDAyLCAweDFCLCAweEZCLCAweDA0LCAweDA0LCAweDAwLCAweEY2LCAweEEzLAorCSAweEEzLCAweEQzLCAweEU0LCAweEZCLCAweDdELCAweEZCLCAweDJFLCAweDYwLCAweDJFLCAweDY0LCAweDJELCAweDYwLCAweDhBLCAweDYzLCAweEEwLCAweEQxLAorCSAweEEzLCAweEQ5LCAweDY0LCAweDQxLCAweDU4LCAweEQxLCAweDVCLCAweEQ5LCAweDdELCAweEYzLCAweDY2LCAweDQ1LCAweEE2LCAweEY1LCAweDYwLCAweDQwLAorCSAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDkxLCAweEZBLCAweDYxLCAweDQ0LCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLAorCSAweDEyLCAweEZBLCAweDA3LCAweDAwLCAweDExLCAweEY4LCAweDY0LCAweDQ0LCAweEZELCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLAorCSAweDEyLCAweEZBLCAweDY1LCAweDQ2LCAweDQ2LCAweDQ4LCAweEUyLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDA1LCAweDNBLCAweDAzLCAweDAwLAorCSAweDE0LCAweDYwLCAweDIyLCAweDY2LCAweDExLCAweDAwLCAweDA0LCAweDNBLCAweDAzLCAweDAwLCAweDE0LCAweDYwLCAweDE2LCAweDY2LCAweDBDLCAweDAwLAorCSAweDAzLCAweDNBLCAweDAzLCAweDAwLCAweDE0LCAweDYwLCAweDBBLCAweDY2LCAweDA3LCAweDAwLCAweDAyLCAweDNBLCAweDAzLCAweDAwLCAweDEzLCAweDYwLAorCSAweEZFLCAweDY2LCAweDAyLCAweDAwLCAweDEzLCAweDYwLCAweEYyLCAweDY2LCAweDYwLCAweEZFLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDEzLCAweDYwLAorCSAweERDLCAweEZCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDI4LCAweDYwLCAweDI5LCAweDYzLCAweEEzLCAweERCLCAweDI4LCAweDYwLCAweEExLCAweDYzLAorCSAweEEzLCAweERCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDEzLCAweDYwLCAweERCLCAweEZCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDI3LCAweDYwLAorCSAweEI5LCAweDYzLCAweEEzLCAweERCLCAweDIwLCAweEZFLCAweEE2LCAweEQzLCAweERBLCAweDg2LCAweDYwLCAweDQzLCAweDFGLCAweEIzLCAweDYzLCAweDVDLAorCSAweDFGLCAweDYwLCAweDAwLCAweEI0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEIwLCAweDg1LCAweDE0LCAweDYwLCAweDEyLCAweEYzLAorCSAweEZGLCAweEZGLCAweEZDLCAweDYwLCAweDAwLCAweEI0LCAweEI0LCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDRFLCAweEZCLCAweDI4LCAweDYwLAorCSAweEM0LCAweDYzLCAweEEzLCAweEQzLCAweEE2LCAweEQxLCAweERFLCAweDg2LCAweDgwLCAweDYwLCAweDdGLCAweEI1LCAweDY0LCAweDQ0LCAweDYwLCAweDQ3LAorCSAweEU4LCAweDg0LCAweDdGLCAweDYwLCAweDgwLCAweEI0LCAweEI0LCAweDg0LCAweEEzLCAweERCLCAweDYwLCAweEZFLCAweEE2LCAweEQzLCAweERFLCAweDg2LAorCSAweDEzLCAweDYwLCAweERGLCAweEZCLCAweEE2LCAweEQzLCAweERFLCAweDg2LCAweDAwLCAweDYwLCAweERGLCAweEZCLCAweEE2LCAweEQzLCAweERFLCAweDg2LAorCSAweDAwLCAweDYwLCAweEUwLCAweEZCLCAweEE2LCAweEQzLCAweDAwLCAweDYwLCAweEUxLCAweEZCLCAweDIwLCAweEZFLCAweDI4LCAweDQ2LCAweDE5LCAweDYwLAorCSAweDRELCAweEYxLCAweDAwLCAweDYwLCAweENGLCAweEYzLCAweDY0LCAweDQwLCAweDAwLCAweDNBLCAweDBGLCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDM2LAorCSAweDA1LCAweDAwLCAweDAyLCAweDM2LCAweDAzLCAweDAwLCAweDA3LCAweDM2LCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDEwLCAweDYwLCAweEYwLCAweDY0LAorCSAweDAwLCAweDdDLCAweDQ0LCAweEE0LCAweEEwLCAweEQ5LCAweDA2LCAweEE0LCAweEEwLCAweEQ5LCAweDM2LCAweDQwLCAweDA4LCAweDNBLCAweDAzLCAweDAwLAorCSAweEYzLCAweDYwLCAweDBBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYzLCAweDEwLCAweDYwLCAweDEwLCAweEZELCAweDEwLCAweDYwLCAweDMwLCAweDYyLAorCSAweDAwLCAweDY0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE5LCAweEZCLAorCSAweDFFLCAweDYwLCAweDhELCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDdELCAweEYxLCAweDEzLCAweDYwLAorCSAweDFBLCAweEY5LCAweDBDLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDA3LCAweDY0LCAweENDLCAweEZCLCAweDIwLCAweDYwLAorCSAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE5LCAweEZCLCAweDFGLCAweDYwLCAweDUzLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDMwLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDA4LCAweEYxLAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweEM1LCAweEZFLCAweDA4LCAweDYwLCAweDE1LCAweEYxLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE4LCAweEZCLAorCSAweDVBLCAweERCLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDMwLCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAyLCAweDY0LAorCSAweDg5LCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLCAweDA4LCAweDYwLCAweDMwLCAweEYxLCAweDAwLCAweDYwLCAweERGLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAxLCAweDY0LCAweDEzLCAweDYwLCAweDIxLCAweEZCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA4LCAweDYwLAorCSAweDE4LCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDAwLCAweDYwLCAweDA4LCAweDY0LAorCSAweDA4LCAweDYwLCAweDE5LCAweEZCLCAweDFGLCAweDYwLCAweDkyLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDE4LCAweEYxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDg5LCAweEYzLCAweDAwLCAweDY1LAorCSAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBBLCAweDAzLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE5LCAweEZCLCAweDFGLCAweDYwLAorCSAweDkyLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDdGLCAweEI0LAorCSAweDk1LCAweEZCLCAweERFLCAweEZFLCAweDBBLCAweDA0LCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE5LCAweEZCLCAweDFGLCAweDYwLAorCSAweEI3LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI2LCAweDYwLCAweDM0LCAweDYyLCAweDA2LCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDE4LCAweEZCLCAweDVBLCAweERCLCAweEJFLCAweEZFLAorCSAweERBLCAweEZFLCAweDI1LCAweDYwLCAweERBLCAweDYxLCAweDFGLCAweDYwLCAweDU4LCAweDRFLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLAorCSAweEM4LCAweDYxLCAweDFGLCAweDYwLCAweDU4LCAweDRFLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweENFLCAweDYxLCAweDFGLCAweDYwLAorCSAweDU4LCAweDRFLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEVDLCAweDYxLCAweDFGLCAweDYwLCAweDU4LCAweDRFLCAweEVBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEYyLCAweDYxLCAweDFGLCAweDYwLCAweDU4LCAweDRFLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLAorCSAweEZFLCAweDYxLCAweDFGLCAweDYwLCAweDU4LCAweDRFLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweEM1LCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweEExLCAweEQzLCAweDBFLCAweDU3LCAweDIzLCAweDAwLCAweDBFLCAweEYyLCAweDQ0LCAweDRDLCAweDgwLCAweEIwLCAweDEwLCAweEIwLCAweDBBLCAweDAzLAorCSAweDAwLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweDEzLCAweDAwLCAweDEyLCAweDAyLCAweEYwLCAweDM3LCAweDA5LCAweDAwLCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LAorCSAweEQwLCAweDgwLCAweEEyLCAweEZGLCAweEFELCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LCAweEFELCAweEZCLCAweDI2LCAweDYwLCAweDFBLCAweDY0LAorCSAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDJDLCAweDQ0LCAweEFDLCAweDg2LCAweDA5LCAweEYwLAorCSAweERBLCAweDAyLCAweDM3LCAweDU4LCAweEZGLCAweEZGLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweDYwLAorCSAweDg1LCAweDY0LCAweDA4LCAweDYwLCAweDMyLCAweEZCLCAweDFDLCAweDYwLCAweEI2LCAweDYyLCAweEEyLCAweERGLCAweDA2LCAweEEyLCAweDEwLCAweDYwLAorCSAweDg4LCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLCAweDFDLCAweDYwLCAweEMyLCAweDYyLCAweEEyLCAweERGLAorCSAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDhDLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLCAweDVBLCAweERCLCAweDFDLCAweDYwLAorCSAweENFLCAweDYyLCAweEEyLCAweERGLCAweDA2LCAweEEyLCAweDEwLCAweDYwLCAweDkwLCAweDY0LCAweEEyLCAweERCLCAweDA2LCAweDY0LCAweDVBLCAweERCLAorCSAweDVBLCAweERCLCAweEJELCAweEYxLCAweDBFLCAweDYwLCAweDY5LCAweEY5LCAweDI0LCAweDYwLCAweEMxLCAweDY0LCAweDA4LCAweDYwLCAweDQzLCAweEZCLAorCSAweDI0LCAweDYwLCAweENBLCAweDY0LCAweDA4LCAweDYwLCAweDQ1LCAweEZCLCAweDI0LCAweDYwLCAweEQzLCAweDY0LCAweDA4LCAweDYwLCAweDQ3LCAweEZCLAorCSAweDAwLCAweDYwLCAweDNBLCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LCAweDYyLCAweEZCLAorCSAweDA0LCAweDY0LCAweDAzLCAweEZBLCAweEE2LCAweEYzLCAweDA3LCAweEZBLCAweDAwLCAweDY0LCAweDNFLCAweEZBLCAweDNGLCAweEZBLCAweDAwLCAweDYwLAorCSAweDAyLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIwLCAweDYwLCAweDYzLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDEwLCAweDYwLCAweDE4LCAweDYyLCAweDAwLCAweDY0LCAweEEyLCAweERCLCAweDAzLCAweDY0LCAweDY5LCAweEZCLCAweDBGLCAweDRFLAorCSAweEVBLCAweDYwLCAweDU4LCAweDRGLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDBFLCAweDRGLCAweDAwLCAweDY0LCAweDZCLCAweEZCLCAweDYyLCAweEY1LAorCSAweEVBLCAweEYzLCAweDJGLCAweEZBLCAweEVCLCAweEYzLCAweDMwLCAweEZBLCAweEVDLCAweEYzLCAweDMxLCAweEZBLCAweDdGLCAweEYzLCAweDJDLCAweEZBLAorCSAweDMyLCAweEZBLCAweDgwLCAweEYzLCAweDJELCAweEZBLCAweDMzLCAweEZBLCAweDgxLCAweEYzLCAweDJFLCAweEZBLCAweDM0LCAweEZBLCAweEI5LCAweEYzLAorCSAweDE5LCAweEZBLCAweDA2LCAweDYwLCAweDgwLCAweDY0LCAweDBFLCAweEZBLCAweEY3LCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLAorCSAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA4LCAweDYwLAorCSAweDBDLCAweEYxLCAweEZGLCAweDYwLCAweDhGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEJFLCAweEYxLCAweDBFLCAweDYwLCAweDYzLCAweEY5LAorCSAweDFDLCAweDYwLCAweEMyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDAwLCAweDY0LCAweDZCLCAweEZCLCAweDAwLCAweDYwLCAweDc0LCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIwLCAweDYwLCAweEFFLCAweDY0LAorCSAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIzLCAweDYwLCAweDg1LCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEUyLCAweDAxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDExLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLAorCSAweDUwLCAweDI3LCAweEQ4LCAweDAxLCAweEFDLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweDBGLCAweDA2LCAweDZCLCAweEYzLAorCSAweEZGLCAweEZGLCAweEVDLCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweENDLCAweDAxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweENGLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAxLCAweDAwLCAweEMzLCAweDAxLCAweDAxLCAweDY0LAorCSAweDE5LCAweDYwLCAweEYzLCAweEZCLCAweERGLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLCAweDZCLCAweEYzLCAweDAzLCAweDA0LCAweDIxLCAweDYwLAorCSAweDI4LCAweDc4LCAweEZGLCAweEZGLCAweEVDLCAweEEwLCAweDAwLCAweDY0LCAweDA0LCAweDA0LCAweDQwLCAweDQ5LCAweDIxLCAweDYwLCAweDI4LCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDY0LCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIwLCAweDYwLCAweEZELCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLAorCSAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIzLCAweDYwLCAweDg1LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweEQwLCAweDAxLCAweDAwLCAweDYwLAorCSAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweEU1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LAorCSAweEUwLCAweDAxLCAweEFDLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEEwLCAweEZGLCAweEZGLCAweDA3LCAweDA2LCAweDZCLCAweEYzLCAweEZGLCAweEZGLAorCSAweEVDLCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweEJBLCAweDAxLCAweEI5LCAweDAxLCAweDMzLCAweDYwLCAweEU2LCAweDY1LAorCSAweEE1LCAweERGLCAweEJGLCAweEYxLCAweDBFLCAweDYwLCAweDYzLCAweEY5LCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweDAzLCAweEE0LCAweEQ0LCAweDgwLAorCSAweDAxLCAweDYzLCAweDAxLCAweDA1LCAweDAwLCAweDYzLCAweDUzLCAweEZELCAweDdELCAweEYzLCAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweEE0LCAweDgwLAorCSAweDI0LCAweDQ0LCAweEZFLCAweEI0LCAweDAxLCAweDAzLCAweDAxLCAweEJDLCAweDQwLCAweDQ0LCAweDIxLCAweDYwLCAweDQ1LCAweDY0LCAweDZBLCAweEZCLAorCSAweDIzLCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEZGLCAweDYwLCAweERGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDg2LCAweEYxLCAweDFCLCAweDYwLCAweEIyLCAweDYzLCAweEQzLCAweDgwLCAweDY3LCAweEZELCAweDQzLCAweDAzLCAweDY3LCAweEYzLAorCSAweEUxLCAweEYxLCAweDYwLCAweDQzLCAweDI5LCAweDQ0LCAweEEzLCAweEQzLCAweEMwLCAweDg1LCAweEQ0LCAweDgwLCAweDVCLCAweEQzLCAweDNBLCAweDA2LAorCSAweDYwLCAweDQzLCAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgxLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDA1LCAweDAyLAorCSAweEJGLCAweEQzLCAweEQwLCAweDgwLCAweDdGLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLCAweDI4LCAweDAyLCAweDIxLCAweDYwLAorCSAweDc3LCAweDY0LCAweDZBLCAweEZCLCAweDIzLCAweDYwLCAweEI0LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweEIwLCAweDgyLCAweEYzLCAweDIyLCAweDAzLAorCSAweDYyLCAweEY1LCAweDQ4LCAweDdFLCAweDJBLCAweEZBLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDYwLCAweDAxLCAweDY0LAorCSAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIxLCAweDYwLCAweDkyLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAzLCAweDAwLCAweDIzLCAweDYwLAorCSAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDZCLCAweEYzLCAweEZGLCAweEZGLCAweEVDLCAweEEwLCAweDAwLCAweDY0LCAweDAyLCAweDA0LCAweDQwLCAweDQ5LAorCSAweDE1LCAweDAwLCAweERGLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDBCLCAweDA3LCAweDFDLCAweDYwLCAweEMyLCAweDY0LAorCSAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDIwLCAweDYwLCAweDg2LCAweDc4LAorCSAweEZGLCAweEZGLCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDE2LCAweDA2LCAweDA0LCAweDY1LCAweEYxLCAweDYwLAorCSAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDA1LCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweEJDLAorCSAweEYxLCAweEZCLCAweDFDLCAweDYwLCAweEMyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDIyLCAweDYwLCAweDFCLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDc0LCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLAorCSAweDIxLCAweDYwLCAweEQ4LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLAorCSAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIzLCAweDYwLAorCSAweDg1LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDAzLCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweEIwLCAweDAxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDE1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweEE2LCAweDAxLCAweEFDLCAweEYzLCAweDZCLCAweEYzLCAweEZFLCAweEEwLCAweEVDLCAweEEwLAorCSAweDBBLCAweDA2LCAweDAzLCAweDA0LCAweDAwLCAweDY0LCAweDU1LCAweEZCLCAweDQwLCAweDQ5LCAweDZCLCAweEYzLCAweEZGLCAweEZGLCAweEVDLCAweEEwLAorCSAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweDk2LCAweDAxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDBELCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDIxLCAweDYwLCAweDI4LCAweDc4LCAweEZGLCAweEZGLCAweDIxLCAweDYwLCAweDlDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDdELCAweEYzLCAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweEE0LCAweDgwLCAweDI0LCAweDQ0LCAweEZFLCAweEI0LCAweDAxLCAweDAzLAorCSAweDAxLCAweEJDLCAweDAyLCAweEIwLCAweEZCLCAweEI0LCAweDAxLCAweDAzLCAweDA0LCAweEJDLCAweDQwLCAweDQ0LCAweEMwLCAweEYxLCAweDBFLCAweDYwLAorCSAweDYzLCAweEY5LCAweENGLCAweEYzLCAweDIwLCAweDYwLCAweDIwLCAweDY1LCAweDMwLCAweDFCLCAweEE1LCAweEQzLCAweDI0LCAweDQwLCAweDAxLCAweDI2LAorCSAweDE2LCAweDAwLCAweDYwLCAweDQwLCAweDIwLCAweDI2LCAweDI5LCAweDAwLCAweDAxLCAweEJDLCAweEE1LCAweERCLCAweDA4LCAweDYwLCAweDFFLCAweEYxLAorCSAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDBELCAweEZCLCAweDIyLCAweDYwLCAweDVGLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDEwLCAweDI2LCAweDEzLCAweDAwLCAweDAxLCAweEJDLCAweEE1LCAweERCLCAweDA4LCAweDYwLCAweDFFLCAweEYxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIyLCAweDYwLAorCSAweDVGLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDBELCAweDY0LCAweDUzLCAweEZCLCAweDIyLCAweDYwLAorCSAweDY3LCAweDY0LCAweDZBLCAweEZCLCAweDIzLCAweDYwLCAweEY2LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEZGLCAweDYwLAorCSAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDg2LCAweEYxLCAweDFCLCAweDYwLCAweEIyLCAweDYzLCAweEQzLCAweDgwLCAweDY3LCAweEZELAorCSAweDA3LCAweDAyLCAweDI0LCAweDQ0LCAweDA0LCAweEIwLCAweEZGLCAweEZGLCAweDM2LCAweDAzLCAweDA1LCAweEFDLCAweDQwLCAweDQ0LCAweEE2LCAweDAxLAorCSAweDY3LCAweEYzLCAweDI5LCAweDQxLCAweEEwLCAweEQxLCAweDU4LCAweEQzLCAweEQxLCAweDgwLCAweDY0LCAweDQ1LCAweDYwLCAweDQzLCAweDJCLCAweDA1LAorCSAweDA4LCAweEEzLCAweEJFLCAweEQzLCAweDgxLCAweEYxLCAweEEzLCAweEQzLCAweEQwLCAweDgwLCAweDgwLCAweEYxLCAweDA1LCAweDAyLCAweEJGLCAweEQzLAorCSAweEQwLCAweDgwLCAweDdGLCAweEYxLCAweDAxLCAweDAyLCAweEQwLCAweDgwLCAweEY4LCAweEEzLCAweDA3LCAweDAyLCAweDQ1LCAweDQ5LCAweDIyLCAweDYwLAorCSAweENELCAweDY0LCAweDZBLCAweEZCLCAweDIzLCAweDYwLCAweEI0LCAweDc4LCAweEZGLCAweEZGLCAweDA1LCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLAorCSAweEMzLCAweDc4LCAweEZGLCAweEZGLCAweDA0LCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LCAweEYxLCAweEZCLAorCSAweDIzLCAweDYwLCAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDY3LCAweEYzLCAweDg2LCAweEYxLCAweDA0LCAweEE0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAyLCAweDAzLCAweDY3LCAweEZCLCAweENELCAweDAxLCAweDZCLCAweEYzLCAweEZGLCAweEZGLCAweEVDLCAweEEwLCAweEZGLCAweEZGLCAweDAxLCAweDA0LAorCSAweDc1LCAweDAwLCAweEUwLCAweEYzLCAweDI5LCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDcwLCAweDA1LCAweDdELCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA4LCAweDAwLCAweDIyLCAweDYwLCAweENELCAweDYzLCAweDZBLCAweEZELCAweDFDLCAweDYwLCAweDc4LCAweDYzLAorCSAweDIzLCAweDYwLCAweEI0LCAweDc4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEMyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA1LCAweDY1LCAweEYxLCAweDYwLCAweDU4LCAweDRFLCAweEMzLCAweDc4LCAweEZGLCAweEZGLAorCSAweDIwLCAweDYwLCAweDE0LCAweDYxLCAweEExLCAweERGLCAweDA0LCAweDY0LCAweERCLCAweEZCLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEZFLCAweEI0LAorCSAweEYxLCAweEZCLCAweDgyLCAweEYzLCAweDYyLCAweEY1LCAweDQ4LCAweDdFLCAweDJBLCAweEZBLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LAorCSAweDM0LCAweDgwLCAweDI1LCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDBELCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEMxLCAweEZFLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLAorCSAweDIzLCAweDYwLCAweDAwLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLAorCSAweEZGLCAweDYwLCAweEZFLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDAwLCAweDYwLCAweDMyLCAweDY0LCAweDBFLCAweDYwLCAweDYzLCAweEZCLAorCSAweDFDLCAweDYwLCAweEMyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLAorCSAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIzLCAweDYwLCAweDFDLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEZGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweEZELCAweDYwLCAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDIwLCAweDYwLCAweDg2LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDc0LCAweDY0LAorCSAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIzLCAweDYwLCAweDNBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDA0LCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweDA1LCAweDAzLCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDIzLCAweDYwLCAweDg1LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDAzLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDY3LCAweDAxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEEwLCAweDgwLCAweDlDLCAweDg0LAorCSAweDE1LCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUwLCAweDI3LCAweEUwLCAweDAxLCAweEFDLCAweEYzLCAweDZCLCAweEYzLAorCSAweEZFLCAweEEwLCAweEVDLCAweEEwLCAweDBBLCAweDA2LCAweDAzLCAweDA0LCAweDAwLCAweDY0LCAweDU1LCAweEZCLCAweDQwLCAweDQ5LCAweDZCLCAweEYzLAorCSAweEZGLCAweEZGLCAweEVDLCAweEEwLCAweERDLCAweDg0LCAweDAxLCAweDA1LCAweEEyLCAweERCLCAweDRELCAweDAxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LAorCSAweEEwLCAweDgwLCAweDlDLCAweDg0LCAweENCLCAweDAzLCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDFDLCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDIyLCAweDYwLCAweDFCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDFDLCAweDYwLCAweEI2LCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFDLCAweDYwLCAweEMyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDFDLCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAzLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBDLCAweEZCLCAweDVBLCAweERCLCAweDAwLCAweDY0LAorCSAweDY5LCAweEZCLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDAyLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIwLCAweDYwLCAweDYzLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEEzLCAweEQzLCAweDdELCAweEYxLCAweDdDLCAweEZCLCAweEQwLCAweDgwLCAweDAwLCAweDY0LCAweDM5LCAweDAzLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEJGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweERFLCAweEZFLCAweDBBLCAweDA0LAorCSAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIzLCAweDYwLCAweEJBLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweERGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLAorCSAweDdDLCAweEYxLCAweDdELCAweEY5LCAweDEzLCAweDYwLCAweDFBLCAweEY5LCAweDBFLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDJELCAweEZGLAorCSAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIzLCAweDYwLCAweEU0LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLAorCSAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEJFLCAweEZFLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweERGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDQwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDAxLCAweDY0LCAweDZBLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweDIwLCAweDQ0LCAweDM0LCAweDgwLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDdGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDIwLCAweDQwLCAweDUxLCAweDIzLAorCSAweDBBLCAweDAwLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDIzLCAweDYwLCAweEZBLCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDdGLCAweDYwLCAweEZGLCAweDYxLCAweEExLCAweDg0LAorCSAweDVBLCAweEQxLCAweDRBLCAweERCLCAweEExLCAweDg0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDhBLCAweEZCLCAweEZGLCAweEZGLCAweEMxLCAweEZFLAorCSAweDhBLCAweEYzLCAweDAwLCAweDY1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDEwLCAweDAzLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDdGLCAweDYwLAorCSAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDI0LCAweDYwLAorCSAweDE2LCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDMzLCAweDYwLCAweEJFLCAweDY0LCAweDU0LCAweEZCLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEVGLCAweDYwLCAweEZGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI0LCAweDQ0LCAweDAxLCAweEIwLAorCSAweEZGLCAweEZGLCAweDA4LCAweDAyLCAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDA3LCAweDAwLCAweDA4LCAweDYwLCAweDEyLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweENGLCAweEZFLCAweDEwLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDYwLCAweDBELCAweEZCLCAweDI0LCAweDYwLCAweDU1LCAweDY0LCAweDVBLCAweERCLAorCSAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLCAweEMyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LAorCSAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEVGLCAweDYwLCAweEVGLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDAxLCAweDY0LCAweDhBLCAweEZCLCAweDZCLCAweEYzLCAweDAwLCAweDYwLCAweDk1LCAweEYzLCAweEVDLCAweEEwLCAweDQwLCAweEJDLAorCSAweDA2LCAweDA0LCAweEEyLCAweERCLCAweDY5LCAweEYxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LCAweDY5LCAweEZCLCAweEZELCAweDYwLAorCSAweEZGLCAweDY1LCAweDIwLCAweDQ0LCAweDI0LCAweDgwLCAweDA4LCAweDYwLCAweDA4LCAweEYxLCAweDgwLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweENGLCAweEZFLCAweEMxLCAweEZFLCAweDZBLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDU1LCAweEYxLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDAzLCAweEE0LCAweDAzLCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDA0LCAweDAwLCAweEZBLCAweEE0LCAweEU4LCAweDg0LAorCSAweEU4LCAweDg3LCAweEMwLCAweEJGLCAweEMwLCAweDg0LCAweEEyLCAweERCLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDU2LCAweEYxLCAweDI4LCAweDQ0LAorCSAweEQwLCAweDg0LCAweDFGLCAweEE0LCAweDA2LCAweDBFLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LAorCSAweDA3LCAweDAwLCAweEMyLCAweEE0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg3LCAweEY4LCAweEJGLAorCSAweEMwLCAweDg0LCAweDVCLCAweEYxLCAweDU2LCAweEZCLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA1LCAweDY0LCAweDQ0LCAweDUyLCAweEZCLAorCSAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDUyLCAweEYxLCAweDJGLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQ1LCAweDAyLCAweDI4LCAweDY0LCAweDQ1LAorCSAweDU1LCAweEYxLCAweDhCLCAweDY3LCAweEQwLCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDY0LCAweDQxLCAweEQ1LCAweDg0LCAweDgwLCAweDY1LAorCSAweEM0LCAweDg3LCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweEZGLCAweEI0LCAweDQwLCAweDQ5LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLAorCSAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDA4LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDEwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweDAwLCAweDYwLCAweDIwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDA4LCAweDYwLCAweDFCLCAweEYxLCAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI3LCAweEYyLCAweDcwLCAweDYzLCAweDYwLCAweDQwLCAweDBBLCAweDM2LCAweDEwLCAweDAwLCAweDE0LCAweDM2LAorCSAweDE0LCAweDAwLCAweDM3LCAweDM2LCAweDBFLCAweDAwLCAweDZFLCAweDM2LCAweDBFLCAweDAwLCAweDA2LCAweDM2LCAweDA0LCAweDAwLCAweDA5LCAweDM2LAorCSAweDA0LCAweDAwLCAweDE4LCAweDYzLCAweDBBLCAweDAwLCAweDMwLCAweDYzLCAweDA4LCAweDAwLCAweDI2LCAweDYzLCAweDA2LCAweDAwLCAweEQwLCAweDYzLAorCSAweDA0LCAweDAwLCAweDMzLCAweDYzLCAweDAyLCAweDAwLCAweDIxLCAweDYzLCAweDAwLCAweDAwLCAweDEwLCAweDYwLCAweDBFLCAweEZELCAweDI2LCAweDQ2LAorCSAweDNGLCAweEYyLCAweDg3LCAweEYwLCAweDAwLCAweEY0LCAweDQ1LCAweDQzLCAweDAzLCAweDRCLCAweDYwLCAweDQzLCAweEY0LCAweEEzLCAweDAwLCAweDYwLAorCSAweDFELCAweDYxLCAweDAwLCAweDYwLCAweDAxLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDAwLCAweDAyLCAweDAwLCAweDY0LCAweDQwLCAweDRBLCAweDYwLCAweEZFLAorCSAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLCAweDU4LCAweDRFLCAweDJDLCAweDc4LAorCSAweEZGLCAweEZGLCAweDIwLCAweEZFLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY0LCAweEEzLCAweDAwLCAweDYwLAorCSAweDFELCAweDYxLCAweDAwLCAweDYwLCAweDMyLCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDBCLCAweDAzLCAweDYwLCAweEZFLCAweDAyLCAweDYwLCAweDAwLCAweDYzLAorCSAweEJELCAweEQzLCAweEJELCAweEQzLCAweDYwLCAweDQxLCAweEZFLCAweDYwLCAweDU4LCAweDRFLCAweDJDLCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweEZFLAorCSAweDJBLCAweDQ0LCAweEZDLCAweDYwLCAweDU4LCAweDRFLCAweDM0LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAxLCAweDYwLAorCSAweDAwLCAweDY1LCAweEY0LCAweEE0LCAweEQ0LCAweDgwLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDY1LCAweDQxLCAweDQxLCAweDQ4LCAweDAwLCAweEY0LAorCSAweDFFLCAweDY1LCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweEE1LCAweEQwLCAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LAorCSAweDA0LCAweDY1LCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLAorCSAweENELCAweDgxLCAweEJELCAweERCLCAweEYwLCAweDAyLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLAorCSAweEZELCAweEEwLCAweEZFLCAweEExLCAweDA3LCAweDAzLCAweDA5LCAweDA2LCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEQxLCAweDgxLCAweEM3LCAweDgzLAorCSAweEY1LCAweDA3LCAweDAzLCAweDAwLCAweEEzLCAweEQzLCAweDBFLCAweDYwLCAweDNDLCAweEZCLCAweDMxLCAweDQwLCAweDA2LCAweDI2LCAweDU3LCAweDAwLAorCSAweDAwLCAweDY0LCAweDZGLCAweEZCLCAweDAyLCAweDYwLCAweDAwLCAweDYzLCAweDI4LCAweDQxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEZDLCAweEEwLAorCSAweEZCLCAweEEwLCAweDA5LCAweDAzLCAweDI4LCAweDAzLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEM3LCAweDgzLCAweEQxLCAweDgxLCAweEZFLCAweEExLAorCSAweDQ2LCAweDA2LCAweEYzLCAweDA3LCAweDQ0LCAweDAwLCAweEJELCAweEQzLCAweEJELCAweEQzLCAweDAwLCAweEI4LCAweDZGLCAweEZCLCAweDZFLCAweEZCLAorCSAweEJELCAweEQzLCAweDNELCAweDAyLCAweEEzLCAweEQzLCAweDYwLCAweDQ1LCAweDYwLCAweDQ3LCAweEI0LCAweDg0LCAweDYwLCAweDQxLCAweDNGLCAweEI1LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDcxLCAweEZCLCAweDY1LCAweDQ3LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDcwLCAweEZCLCAweDY0LCAweDQ0LCAweEUwLCAweDg1LCAweEZBLCAweEEzLCAweEM3LCAweDgzLCAweDYxLCAweDQ0LAorCSAweDBFLCAweDYwLCAweDM4LCAweEZCLCAweEQyLCAweDAxLCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAwLCAweEI4LCAweDZELCAweEZCLCAweDczLCAweEZCLAorCSAweDFFLCAweDAyLCAweDg1LCAweEYxLCAweDZGLCAweEYzLCAweDZDLCAweEY5LCAweDA0LCAweDY1LCAweDYwLCAweDQwLCAweDAwLCAweDNBLCAweDA2LCAweDY1LAorCSAweDMxLCAweDQ0LCAweEI0LCAweDg0LCAweDQwLCAweDUxLCAweDAyLCAweDJBLCAweDBCLCAweDAwLCAweDA4LCAweEJDLCAweDQwLCAweDUxLCAweDcxLCAweEYzLAorCSAweDcwLCAweEYxLCAweDAwLCAweEI4LCAweDY0LCAweDQ1LCAweDAxLCAweDAzLCAweDY3LCAweDQ1LCAweDY1LCAweDUwLCAweENDLCAweDg0LCAweDcyLCAweEZCLAorCSAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAxLCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDA4LCAweDYwLAorCSAweDE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDgwLCAweDJBLCAweDNGLCAweDAwLCAweDAxLCAweDY0LCAweDEwLCAweDYwLCAweDBBLCAweEZCLAorCSAweDI2LCAweDYwLCAweDU4LCAweDRFLCAweDY1LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDBELCAweEYyLCAweDdFLCAweEZCLAorCSAweDAwLCAweDY0LCAweDg0LCAweEZCLCAweDI2LCAweDQ2LCAweDNGLCAweEYyLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweEY0LCAweEEzLCAweDAwLCAweDYwLAorCSAweDFELCAweDYxLCAweDAwLCAweDYwLCAweDA3LCAweDY1LCAweDAxLCAweDYwLCAweEZGLCAweDY0LCAweDQwLCAweDRDLCAweEZELCAweDYwLCAweDU4LCAweDRFLAorCSAweDdBLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEJCLCAweEZGLCAweEZGLCAweDE0LCAweDAzLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweEE1LCAweEQzLAorCSAweDFDLCAweDYwLCAweEU2LCAweDYzLCAweEZGLCAweEI0LCAweDAxLCAweEE0LCAweDYwLCAweDQxLCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLCAweDA1LCAweDAzLCAweDY0LCAweDQ3LCAweDAwLCAweDdGLCAweENELCAweDgxLCAweEJELCAweERCLAorCSAweEY0LCAweDAyLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDAwLCAweDYwLCAweDgwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDMyLCAweDAwLCAweDI3LCAweDYwLCAweDU3LCAweDc4LCAweEZGLCAweEZGLCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweEE4LCAweDAyLCAweEE4LAorCSAweDAyLCAweDAzLCAweDNFLCAweDAyLCAweEY2LCAweDAxLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweEZGLCAweDYwLCAweEZCLCAweDY0LCAweEEwLCAweDg0LAorCSAweEEyLCAweERCLCAweDFDLCAweDYwLCAweDkyLCAweDY0LCAweDEzLCAweDYwLCAweDIyLCAweEZCLCAweDAyLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLAorCSAweDA0LCAweEZGLCAweDI2LCAweDQ2LCAweDEwLCAweDYwLCAweDBFLCAweEYzLCAweDI1LCAweEYyLCAweDYwLCAweDQ1LCAweDI0LCAweEYwLCAweDAwLCAweEY0LAorCSAweDY0LCAweDQzLCAweEM3LCAweDgzLCAweDYwLCAweDQxLCAweDAyLCAweDI0LCAweDAxLCAweEExLCAweDBBLCAweEYwLCAweDA5LCAweEYyLCAweEQxLCAweDgwLAorCSAweEZGLCAweEZGLCAweDA5LCAweDA3LCAweDA0LCAweDA0LCAweDYzLCAweDQ1LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDA2LCAweDI2LCAweDYwLAorCSAweDU4LCAweDRFLCAweDY1LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDI2LCAweEYwLCAweEZGLCAweDY3LCAweDIwLCAweDg4LCAweDY0LCAweDVGLAorCSAweDQwLCAweDRBLCAweDI0LCAweDYwLCAweDU4LCAweDRFLCAweDgwLCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LCAweDI0LCAweDYwLCAweDU4LCAweDRFLAorCSAweDkwLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA4LCAweDYwLCAweDBELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDQwLCAweDIyLCAweEIzLCAweDAxLCAweDAwLCAweDYwLCAweDk1LCAweEYzLAorCSAweEZGLCAweEZGLCAweEJGLCAweEI0LCAweEEyLCAweERCLCAweDEwLCAweDYwLCAweDBFLCAweEYzLCAweDI2LCAweDQ2LCAweDYwLCAweDQ1LCAweDIwLCAweDYwLAorCSAweDA0LCAweDYzLCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweEJELCAweERCLCAweEZGLCAweEZGLCAweDBBLCAweEYyLCAweEJELCAweERCLCAweDBCLCAweEYyLAorCSAweEZGLCAweEZGLCAweEJELCAweERCLCAweDBDLCAweEYyLCAweEEzLCAweERCLCAweEZBLCAweEEzLCAweDI2LCAweDQ2LCAweEEzLCAweEQzLCAweDI0LCAweEYwLAorCSAweDAwLCAweDYxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLCAweEQ0LCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLAorCSAweDAzLCAweEE5LCAweDI1LCAweEYwLCAweDQyLCAweEZFLCAweDA1LCAweDAzLCAweEZELCAweEExLCAweENDLCAweDg0LCAweDAxLCAweDAyLCAweENDLCAweDg0LAorCSAweDAwLCAweDYxLCAweEYxLCAweDgxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLCAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LAorCSAweDI4LCAweEYwLCAweDQyLCAweEZFLCAweDAxLCAweDAzLCAweENDLCAweDg0LCAweEYxLCAweDgxLCAweEQwLCAweDg0LCAweEYxLCAweDgxLCAweEJELCAweERCLAorCSAweEEzLCAweEQzLCAweDAzLCAweEIxLCAweDAzLCAweEE5LCAweDI5LCAweEYwLCAweDAxLCAweDAzLCAweENDLCAweDg0LCAweEQwLCAweDg0LCAweEEzLCAweERCLAorCSAweDEwLCAweDYwLCAweDBBLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEE4LCAweEZGLCAweEZGLCAweDAyLCAweDAyLCAweDJFLCAweDU4LCAweEZGLCAweEZGLAorCSAweEY1LCAweEZFLCAweDEwLCAweDYwLCAweDAyLCAweEYxLCAweDA2LCAweEEyLCAweEEyLCAweEQzLCAweDY0LCAweDQ1LCAweDYwLCAweDQwLCAweDgwLCAweDJCLAorCSAweDAzLCAweDAwLCAweEZGLCAweDYwLCAweEZGLCAweDY0LCAweDk0LCAweDg1LCAweDAwLCAweDYwLCAweDk2LCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLAorCSAweDBBLCAweDA2LCAweDEwLCAweDYwLCAweDBBLCAweEYzLCAweDY5LCAweEYzLCAweDAwLCAweEE4LCAweDA0LCAweEIwLCAweDA0LCAweDAyLCAweDAzLCAweDAzLAorCSAweDI3LCAweDYwLCAweDMzLCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDQ2LCAweDAwLCAweEY0LCAweDA5LCAweEYyLCAweDVBLCAweEQyLCAweDQwLCAweDQ4LAorCSAweDQwLCAweDRBLCAweDVBLCAweEQyLCAweDVBLCAweEQyLCAweDQwLCAweDRDLCAweDYwLCAweDQxLCAweDVBLCAweEQwLCAweDdFLCAweEY5LCAweDQwLCAweDYzLAorCSAweEFELCAweDgwLCAweEYwLCAweEEzLCAweDA5LCAweDAyLCAweDNDLCAweDAzLCAweDJDLCAweDQxLCAweDJBLCAweDQ0LCAweDQwLCAweDRDLCAweDI4LCAweDQ0LAorCSAweDQwLCAweDRBLCAweDAwLCAweDY0LCAweDQwLCAweDQ4LCAweEY0LCAweDAxLCAweEQxLCAweDgwLCAweDAxLCAweDAyLCAweDMxLCAweDA0LCAweDEwLCAweEEzLAorCSAweDgwLCAweDYwLCAweDAwLCAweDY1LCAweEE1LCAweDgwLCAweENGLCAweDgzLCAweDA4LCAweDAyLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LCAweDJBLCAweDQ0LAorCSAweDcwLCAweDhBLCAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEY1LCAweDAxLCAweEU3LCAweEEzLCAweDY0LCAweDQ0LCAweDAwLCAweEE4LAorCSAweDAwLCAweDYyLCAweDAyLCAweDAyLCAweDAwLCAweDYxLCAweDFDLCAweDAwLCAweEUwLCAweDg0LCAweERFLCAweDgyLCAweEZELCAweDA0LCAweDQyLCAweEZFLAorCSAweEY4LCAweDg0LCAweDYyLCAweDQ1LCAweEM3LCAweDgzLCAweDYwLCAweDQ1LCAweDAyLCAweEZFLCAweEQ1LCAweDg0LCAweDAyLCAweDA1LCAweDAxLCAweDA1LAorCSAweDYxLCAweDQ0LCAweENGLCAweDgzLCAweDYwLCAweDQxLCAweDA4LCAweDAzLCAweDI4LCAweDQ0LCAweDYwLCAweDg4LCAweDJBLCAweDQ0LCAweDcwLCAweDhBLAorCSAweDJDLCAweDQ0LCAweDcwLCAweDhDLCAweEYxLCAweDgxLCAweEYxLCAweDAxLCAweENFLCAweDgyLCAweEU5LCAweDgxLCAweEZELCAweDAyLCAweEYxLCAweDgxLAorCSAweDA5LCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDVBLCAweEQyLCAweDNGLCAweEI1LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEI0LCAweDg0LCAweDYxLCAweDQ1LCAweEQ0LCAweDg0LAorCSAweEMwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDkzLCAweDEwLCAweDYwLCAweDBBLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAyLCAweDE4LCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweDE2LCAweDY1LCAweDMyLCAweDQwLCAweDgwLCAweDI2LCAweDE2LCAweDY1LCAweDczLCAweDQ0LAorCSAweEQ0LCAweDkzLCAweDY5LCAweEYzLCAweDI2LCAweDQ2LCAweDA0LCAweEJDLCAweEEyLCAweERCLCAweDI2LCAweEYwLCAweEZGLCAweDY3LCAweDIwLCAweDg4LAorCSAweDY0LCAweDVGLCAweDQwLCAweDRBLCAweDI0LCAweDYwLCAweDU4LCAweDRFLCAweDgwLCAweDc4LCAweEZGLCAweEZGLCAweDBBLCAweDQ4LCAweDI0LCAweDYwLAorCSAweDU4LCAweDRFLCAweDkwLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweDYwLCAweDU4LCAweDRFLCAweEFDLCAweDc4LCAweEZGLCAweEZGLCAweDZCLCAweEYzLAorCSAweEZGLCAweEZGLCAweEM4LCAweDg0LCAweEZGLCAweEZGLCAweDAxLCAweDA1LCAweDAwLCAweDY0LCAweDZCLCAweEZCLCAweDA4LCAweDYwLCAweDBDLCAweEYxLAorCSAweDAwLCAweDYwLCAweDQwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDFDLCAweDYwLCAweENFLCAweDY0LCAweDEzLCAweDYwLAorCSAweDIyLCAweEZCLCAweDAzLCAweDY0LCAweDRBLCAweERCLCAweEZGLCAweEZGLCAweDA0LCAweEZGLCAweDA4LCAweDYwLCAweDBDLCAweEYxLCAweEZGLCAweDYwLAorCSAweERGLCAweDY0LCAweEEwLCAweDg0LCAweEEyLCAweERCLCAweDI2LCAweDQ2LCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDFFLCAweEYxLAorCSAweDAwLCAweDYwLCAweDAyLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDFDLCAweDYwLAorCSAweERBLCAweDYzLCAweEEzLCAweERGLCAweDA2LCAweEEzLCAweDEwLCAweDYwLCAweEE0LCAweDY0LCAweEJELCAweERCLCAweEJELCAweERCLCAweDA2LCAweDY0LAorCSAweEEzLCAweERCLCAweDI3LCAweDYwLCAweDY4LCAweDY0LCAweDA4LCAweDYwLCAweDUxLCAweEZCLCAweDEwLCAweDYwLCAweDBGLCAweEYxLCAweDBFLCAweDYwLAorCSAweDZGLCAweEY5LCAweDI3LCAweDYwLCAweENGLCAweDY0LCAweDA4LCAweDYwLCAweDM4LCAweEZCLCAweDExLCAweDYwLCAweDQ0LCAweDYzLCAweDA4LCAweDYwLAorCSAweDY2LCAweEZELCAweDEyLCAweDYwLCAweDQwLCAweDYzLCAweDA4LCAweDYwLCAweDY3LCAweEZELCAweENGLCAweEYzLCAweDAyLCAweDYzLCAweDAxLCAweDFCLAorCSAweENGLCAweEZELCAweENGLCAweEYzLCAweEZGLCAweEZGLCAweEY3LCAweEEwLCAweDAxLCAweDY0LCAweDAxLCAweDA2LCAweENGLCAweEZCLCAweENGLCAweEYzLAorCSAweENGLCAweEZCLCAweENGLCAweEYzLCAweDEyLCAweDYwLCAweDc4LCAweDYzLCAweDI2LCAweDE4LCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDAzLAorCSAweDJBLCAweEEzLCAweEZCLCAweDAxLCAweDYzLCAweDQ2LCAweDEwLCAweDYwLCAweEYyLCAweDYzLCAweDBFLCAweDYxLCAweDYwLCAweEZFLCAweEE2LCAweEQxLAorCSAweERFLCAweDg2LCAweDAxLCAweDY0LCAweDY0LCAweDQwLCAweDdGLCAweDM2LCAweDAwLCAweDY0LCAweEEzLCAweERCLCAweERCLCAweDgzLCAweEEzLCAweEQ5LAorCSAweENELCAweDgxLCAweDA0LCAweEEzLCAweEY0LCAweDAyLCAweDExLCAweDYwLCAweDYyLCAweDYzLCAweDFDLCAweDYxLCAweEE2LCAweEQxLCAweERFLCAweDg2LAorCSAweDAxLCAweDY0LCAweDY0LCAweDQwLCAweDdGLCAweDM2LCAweDAwLCAweDY0LCAweEEzLCAweERCLCAweERCLCAweDgzLCAweEEzLCAweEQ5LCAweENELCAweDgxLAorCSAweDA2LCAweEEzLCAweEY0LCAweDAyLCAweDIwLCAweEZFLCAweDAwLCAweDYwLCAweDYwLCAweDY0LCAweDA4LCAweDYwLCAweDFGLCAweEZCLCAweDI3LCAweDYwLAorCSAweEUxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDExLCAweDYwLCAweDQ0LCAweDYzLCAweDA4LCAweDYwLAorCSAweDY2LCAweEZELCAweDEyLCAweDYwLCAweDQwLCAweDYzLCAweDA4LCAweDYwLCAweDY3LCAweEZELCAweDAwLCAweDYwLCAweDYwLCAweDY0LCAweDA4LCAweDYwLAorCSAweDFGLCAweEZCLCAweDI3LCAweDYwLCAweEUxLCAweDY0LCAweDVBLCAweERCLCAweENGLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI4LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDBGLCAweEI0LCAweDk4LCAweDAwLCAweEZGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA0LCAweDY0LAorCSAweDEzLCAweDYwLCAweDFDLCAweEZCLCAweDI3LCAweDAwLCAweDBDLCAweDY0LCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDIzLCAweDAwLCAweDI5LCAweEYxLAorCSAweDEzLCAweDYwLCAweDFDLCAweEZCLCAweDVBLCAweEQ5LCAweDI3LCAweDYwLCAweEZELCAweDY0LCAweDlGLCAweEZCLCAweEZGLCAweEZGLCAweDJELCAweEZGLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweDYwLCAweDFDLCAweDYzLCAweDA5LCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELAorCSAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweDc1LCAweDAwLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDdGLCAweEI0LCAweDk1LCAweEZCLCAweDA2LCAweDY0LAorCSAweDEzLCAweDYwLCAweDFDLCAweEZCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA4LCAweDY0LAorCSAweDEzLCAweDYwLCAweDFDLCAweEZCLCAweDI4LCAweDYwLCAweDdBLCAweDY0LCAweDlGLCAweEZCLCAweEZGLCAweEZGLCAweDJELCAweEZGLCAweDJBLCAweDYwLAorCSAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDI5LCAweEYzLCAweDEyLCAweDYwLCAweDQ1LCAweDY1LCAweDYwLCAweDVDLCAweDNGLCAweDQwLCAweDAyLCAweDJCLAorCSAweDEzLCAweDAwLCAweDAwLCAweDM3LCAweDExLCAweDAwLCAweDAxLCAweDNCLCAweDUzLCAweDAwLCAweDExLCAweDYwLCAweDY1LCAweDYzLCAweEZGLCAweEI3LAorCSAweDYwLCAweDVDLCAweEEzLCAweEQzLCAweDA4LCAweEEzLCAweDAwLCAweDdFLCAweEQwLCAweDgwLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLCAweEY5LCAweDAyLAorCSAweDQ3LCAweDAwLCAweEY0LCAweEEzLCAweEEzLCAweEQzLCAweDA1LCAweDAwLCAweDAwLCAweEJDLCAweEYyLCAweEE0LCAweDQxLCAweDAzLCAweDQwLCAweDA3LAorCSAweDY0LCAweDQ0LCAweDdELCAweEZCLCAweEExLCAweEZCLCAweDA3LCAweDY0LCAweEEyLCAweEZCLCAweDI4LCAweDYwLCAweDdBLCAweDY0LCAweDlGLCAweEZCLAorCSAweEZGLCAweEZGLCAweERGLCAweEZFLCAweDAwLCAweDY0LCAweDE5LCAweEZGLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDg4LCAweEZGLAorCSAweEJBLCAweDYwLCAweDk4LCAweDcxLCAweDhELCAweEUyLCAweDAxLCAweDExLCAweDA5LCAweDAwLCAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweEZCLCAweDAxLAorCSAweDg4LCAweEUyLCAweEJBLCAweDYwLCAweEQwLCAweDY0LCAweDAzLCAweEZCLCAweDhELCAweEZGLCAweDE1LCAweDAwLCAweDhELCAweEZGLCAweDI4LCAweDYwLAorCSAweEZCLCAweDYzLCAweDA2LCAweDYwLCAweDBCLCAweEZELCAweEZGLCAweEZGLCAweDYyLCAweEZGLCAweDI4LCAweDYwLCAweDY3LCAweDYzLCAweDlGLCAweEZELAorCSAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweDYwLCAweEY0LCAweDYzLCAweDA2LCAweDYwLAorCSAweDBCLCAweEZELCAweEZGLCAweEZGLCAweDYyLCAweEZGLCAweDI5LCAweEY1LCAweDI2LCAweDYwLCAweDIwLCAweDYzLCAweDI1LCAweDYwLCAweEYyLCAweDY0LAorCSAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDY0LCAweEEzLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY5LCAweEZFLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDY4LCAweDAxLCAweDAwLCAweDM2LCAweDY5LCAweDAxLCAweDAxLCAweDM2LCAweDZCLCAweDAxLAorCSAweDAyLCAweDM2LCAweDgxLCAweDAxLCAweDAzLCAweDM2LCAweDhCLCAweDAxLCAweDA0LCAweDM2LCAweEMxLCAweDAxLCAweDA1LCAweDM2LCAweEJGLCAweDAxLAorCSAweDA2LCAweDM2LCAweEYxLCAweDAxLCAweDA3LCAweDM2LCAweEJCLCAweDAxLCAweDA4LCAweDM2LCAweDhDLCAweDAxLCAweDA5LCAweDM2LCAweDBDLCAweDAwLAorCSAweDBBLCAweDM2LCAweDBELCAweDAwLCAweDBCLCAweDM2LCAweDBFLCAweDAwLCAweDBDLCAweDM2LCAweDE3LCAweDAwLCAweDBELCAweDM2LCAweDBELCAweDAwLAorCSAweDBFLCAweDM2LCAweDFELCAweDAwLCAweDBGLCAweDM2LCAweDQxLCAweDAwLCAweDAyLCAweDYwLCAweDAwLCAweDY0LCAweDA4LCAweDAwLCAweDA0LCAweDYwLAorCSAweDAwLCAweDY0LCAweDA1LCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweDY0LCAweDAyLCAweDAwLCAweDIwLCAweDYwLCAweDAwLCAweDY0LCAweDMyLCAweDQ1LAorCSAweEI0LCAweDg1LCAweDQ1LCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI5LCAweDYwLCAweERFLCAweDYzLCAweDA2LCAweDYwLAorCSAweDBCLCAweEZELCAweDYyLCAweEZGLCAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDNGLCAweDQwLAorCSAweDAyLCAweDJCLCAweDE1LCAweDAwLCAweDg4LCAweEZGLCAweEJBLCAweDYwLCAweDk4LCAweDcxLCAweDhELCAweEUyLCAweDAxLCAweDExLCAweDA5LCAweDAwLAorCSAweDcxLCAweDQwLCAweDgwLCAweDI3LCAweEZCLCAweDAxLCAweDg4LCAweEUyLCAweEJBLCAweDYwLCAweEQwLCAweDY0LCAweDAzLCAweEZCLCAweDhELCAweEZGLAorCSAweDExLCAweDAwLCAweDhELCAweEZGLCAweDkwLCAweDYwLCAweDAwLCAweEU4LCAweDI4LCAweDYwLCAweEZCLCAweDYzLCAweDA0LCAweDAwLCAweDkxLCAweDYwLAorCSAweDAwLCAweEU4LCAweDI5LCAweDYwLCAweEM0LCAweDYzLCAweDJBLCAweEU4LCAweDA2LCAweDYwLCAweDBCLCAweEZELCAweEZGLCAweEZGLCAweDYyLCAweEZGLAorCSAweEZGLCAweEZGLCAweDFBLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweEVGLCAweEI0LAorCSAweEYxLCAweEZCLCAweEFELCAweDRGLCAweEZELCAweEI0LCAweEEwLCAweDVELCAweEQwLCAweDYwLCAweDAwLCAweEU4LCAweDJBLCAweEU4LCAweEQ5LCAweDYwLAorCSAweEZFLCAweDY0LCAweDMyLCAweDQ1LCAweEE0LCAweDg1LCAweDQ1LCAweDUyLCAweDk5LCAweEZGLCAweEE1LCAweDRGLCAweEZGLCAweEI0LCAweDA3LCAweEZCLAorCSAweDk4LCAweEZGLCAweEEzLCAweDYwLCAweEY0LCAweDYzLCAweDA2LCAweDYwLCAweDBCLCAweEZELCAweDYyLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDQzLCAweEZGLCAweDAxLCAweDYwLCAweDAwLCAweEUxLCAweDI4LCAweEYzLAorCSAweDQ3LCAweEZGLCAweDYwLCAweDQwLCAweDA3LCAweDM3LCAweDY2LCAweDAwLCAweDA1LCAweDNCLCAweDA0LCAweDAwLCAweEZGLCAweDBBLCAweDgwLCAweEUxLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDFCLCAweDYwLCAweEYzLCAweEYxLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLAorCSAweDdELCAweEYxLCAweDAyLCAweEIxLCAweDA0LCAweDY1LCAweDAyLCAweDAyLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LAorCSAweEEwLCAweDVELCAweDI5LCAweEY1LCAweDJBLCAweEYzLCAweDQ3LCAweEZGLCAweDNGLCAweEYwLCAweDAxLCAweDFCLCAweDAxLCAweDY0LCAweDYwLCAweDU2LAorCSAweEFELCAweEUyLCAweEI1LCAweEZGLCAweDZDLCAweDQwLCAweDQwLCAweEUxLCAweEExLCAweEZGLCAweDAwLCAweEY0LCAweDZFLCAweDYxLCAweDEyLCAweDYyLAorCSAweDY0LCAweDQzLCAweDAxLCAweEUxLCAweDAzLCAweDY0LCAweEUyLCAweEQwLCAweEM5LCAweDgxLCAweDY0LCAweDRDLCAweENDLCAweDg0LCAweERBLCAweDgyLAorCSAweEZBLCAweDAyLCAweDAxLCAweDYwLCAweDAwLCAweDZCLCAweDlBLCAweEZGLCAweENBLCAweDgyLCAweDAzLCAweDAwLCAweDAwLCAweEY0LCAweDgxLCAweEYyLAorCSAweEZGLCAweEZGLCAweDdBLCAweEQwLCAweEExLCAweEZGLCAweDY0LCAweDRDLCAweEZDLCAweDFDLCAweEY4LCAweDFELCAweDAwLCAweEI5LCAweDA2LCAweDFFLAorCSAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweERBLCAweDgyLCAweDVBLCAweEQyLCAweEExLCAweEZGLCAweDYwLCAweDRELCAweDNGLCAweDQwLCAweDAyLCAweDJCLAorCSAweDEwLCAweDAwLCAweDI4LCAweEYzLCAweEE1LCAweDYwLCAweEM0LCAweDY1LCAweDYwLCAweDQwLCAweDBFLCAweDNCLCAweDBBLCAweDAwLCAweEYxLCAweEYzLAorCSAweEZGLCAweEZGLCAweDEwLCAweEJDLCAweEYxLCAweEZCLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDg1LCAweDRDLAorCSAweEZFLCAweDAxLCAweEYxLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweEYxLCAweEZCLCAweEExLCAweEZGLCAweDg3LCAweDRFLCAweDg3LCAweDRDLAorCSAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDg3LCAweDRDLCAweDY3LCAweDRDLCAweEZGLCAweEZGLCAweEJDLCAweEZGLCAweDAwLCAweEUxLCAweEQ1LCAweEZFLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDQwLCAweDQ2LCAweDYwLCAweDQxLCAweEI1LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLAorCSAweDI5LCAweEY1LCAweDNGLCAweEYwLCAweDI0LCAweEYyLCAweDQ0LCAweDQzLCAweDQwLCAweDRELCAweDAwLCAweEY0LCAweEYzLCAweDYwLCAweEEwLCAweDY1LAorCSAweDEwLCAweDYyLCAweDVBLCAweEQyLCAweEQ5LCAweDgxLCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweEZCLCAweDAyLCAweDYxLCAweDQ1LCAweDJELCAweDQ0LAorCSAweEQ0LCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEZELCAweEE1LCAweDQ4LCAweDYwLCAweDAwLCAweDY0LCAweEM0LCAweDlELAorCSAweDBELCAweDYwLCAweDAwLCAweDZCLCAweDJELCAweDQ0LCAweEMwLCAweDgzLCAweEJCLCAweEZGLCAweDI5LCAweEY1LCAweDAxLCAweEUxLCAweDAwLCAweEY0LAorCSAweDZDLCAweDYxLCAweDEwLCAweDYyLCAweDA1LCAweDAwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDA0LCAweDYyLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDAxLCAweDEwLCAweDFBLCAweDAwLCAweDI2LCAweDQ0LCAweDAxLCAweDI2LCAweDBDLCAweDAwLCAweDJELCAweDQ0LAorCSAweEM4LCAweDg0LCAweDQwLCAweDRELCAweDAyLCAweDAzLCAweDZDLCAweDQ1LCAweEYzLCAweDAxLCAweDAzLCAweDE1LCAweDAxLCAweDY0LCAweDA1LCAweEZBLAorCSAweDE1LCAweDAwLCAweDZDLCAweDQ1LCAweEVELCAweDAxLCAweDIzLCAweDQ0LCAweEM4LCAweDg0LCAweDQwLCAweDQzLCAweDAyLCAweDAzLCAweDZDLCAweDQ1LAorCSAweEU3LCAweDAxLCAweDAwLCAweDY0LCAweDAxLCAweDE1LCAweDAxLCAweDY0LCAweDZDLCAweDQ1LCAweDA1LCAweEZCLCAweEUyLCAweEQyLCAweERBLCAweDgyLAorCSAweEM5LCAweDgxLCAweDYwLCAweDRDLCAweERELCAweDFDLCAweEQ3LCAweDAzLCAweEJDLCAweEZGLCAweERBLCAweDAxLCAweDAwLCAweEUxLCAweEQ1LCAweEZFLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDA4LCAweEUxLCAweEExLCAweEZGLCAweDY3LCAweDRDLCAweDQzLCAweEZGLCAweEYxLCAweEYzLCAweEZGLCAweEZGLAorCSAweDEwLCAweEJDLCAweEYxLCAweEZCLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDAxLCAweEUxLCAweDAxLCAweDYwLAorCSAweDY5LCAweDZCLCAweEE1LCAweDYwLCAweEM0LCAweDY0LCAweDYwLCAweDRDLCAweEJCLCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDRDLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDYwLCAweDRDLCAweEZDLCAweDAxLCAweDI5LCAweEYzLCAweDJBLCAweEYxLCAweDA3LCAweEI1LCAweDA0LCAweEUxLAorCSAweDY1LCAweDQxLCAweDY0LCAweDU0LCAweENELCAweEUyLCAweDk1LCAweDgxLCAweEExLCAweDVELCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweEY5LCAweDAxLAorCSAweDYxLCAweDQ0LCAweEZFLCAweEZCLCAweEZGLCAweEZELCAweEZGLCAweDAxLCAweDdGLCAweDY3LCAweDAxLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweEIxLCAweEZFLCAweDA4LCAweDA1LCAweEIwLCAweEZFLCAweDA5LCAweDA1LCAweEIyLCAweEZFLCAweEIzLCAweEZFLCAweDc4LCAweDQzLCAweDAxLCAweDYxLAorCSAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweDM0LCAweDYwLCAweDhELCAweDc4LCAweEZGLCAweEZGLCAweDI4LCAweEYzLCAweDI5LCAweEYxLCAweDQwLCAweDQ0LAorCSAweDQ0LCAweDQ1LCAweDJBLCAweEYxLCAweDJCLCAweEYxLCAweDQ0LCAweDQ2LCAweDQ0LCAweDQ3LCAweDNGLCAweEI0LCAweEUwLCAweDg1LCAweDIwLCAweDYwLAorCSAweDI4LCAweDY0LCAweDQ0LCAweEQ3LCAweDU4LCAweDQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ1LCAweDBFLCAweDYwLCAweERELCAweEYzLCAweDYxLCAweDQzLAorCSAweDA0LCAweEI0LCAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLCAweDA2LCAweDAwLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LAorCSAweDA1LCAweEZELCAweDA0LCAweEZCLCAweDEwLCAweDc1LCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg2LCAweDNFLCAweEI0LCAweEZFLCAweDBCLCAweDA1LAorCSAweEI1LCAweEZFLCAweDAyLCAweDI0LCAweDlGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEI3LCAweEZFLCAweDA3LCAweDA1LCAweDc4LCAweDQzLAorCSAweDAxLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweDM0LCAweDYwLCAweEM4LCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ0LCAweDAwLCAweDdGLAorCSAweEVFLCAweEEwLCAweDYwLCAweDQ1LCAweDA1LCAweDA1LCAweDIwLCAweDYwLCAweEJBLCAweDY0LCAweDQ0LCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweDc4LCAweDQzLCAweDAxLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LAorCSAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEwLCAweDAyLCAweDEwLCAweDY0LAorCSAweDQwLCAweDQwLCAweDAyLCAweDY0LCAweDQwLCAweDUwLCAweDYxLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA0LCAweDAwLCAweDEwLCAweEUwLAorCSAweDQ2LCAweDYwLCAweDA5LCAweEUwLCAweDAwLCAweDAwLCAweDI3LCAweEYxLCAweDAwLCAweDY2LCAweDIwLCAweDc4LCAweDQyLCAweEZFLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDFBLCAweDAyLAorCSAweDBFLCAweDYwLCAweERELCAweEYzLCAweDA3LCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LCAweDA0LCAweDAzLCAweDAzLCAweDAyLCAweERCLCAweEY5LAorCSAweDAwLCAweDY3LCAweDEwLCAweDAwLCAweDAwLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweEFELCAweDAxLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLAorCSAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDA1LCAweDAwLCAweDYyLCAweEZGLCAweDIwLCAweDQ0LCAweDgwLCAweEJDLAorCSAweDQwLCAweDQwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDMxLCAweDAyLCAweDBFLCAweDYwLCAweERELCAweEYzLCAweDAxLCAweDdDLCAweDIwLCAweEI1LCAweDBDLCAweEI1LAorCSAweDAzLCAweDAzLCAweDAyLCAweDAyLCAweERCLCAweEY5LCAweEZGLCAweEZGLCAweDAyLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDJBLCAweDYwLAorCSAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDlELCAweEYxLCAweDIwLCAweDQ0LCAweDY0LCAweDQwLCAweEZGLCAweDI2LCAweDFDLCAweDAwLCAweDdGLCAweEI0LAorCSAweDQwLCAweDQwLCAweDVDLCAweDVFLCAweDgyLCAweEZGLCAweDI2LCAweDQ0LCAweEZELCAweEI0LCAweDQwLCAweDQ2LCAweDVDLCAweDQxLCAweDg3LCAweEZGLAorCSAweDYyLCAweEZGLCAweDEzLCAweDYwLCAweDAyLCAweEYzLCAweEZGLCAweEZGLCAweDAwLCAweEE4LCAweDYwLCAweDQ2LCAweDA0LCAweDAzLCAweDA5LCAweEYyLAorCSAweDhGLCAweEZDLCAweEFDLCAweDg2LCAweEZCLCAweDAxLCAweDk1LCAweEYzLCAweEZGLCAweEZGLCAweDdGLCAweEI0LCAweDk1LCAweEZCLCAweDA2LCAweDY0LAorCSAweDEzLCAweDYwLCAweDFDLCAweEZCLCAweDJELCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIwLCAweDQwLAorCSAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDdGLCAweDY3LCAweDA2LCAweDYxLCAweDYwLCAweDQ1LCAweDBFLCAweDYwLCAweERELCAweEYzLCAweDYxLCAweDQzLAorCSAweDA0LCAweEI0LCAweDI0LCAweDQ0LCAweDAyLCAweDAzLCAweDEzLCAweEZGLCAweDU2LCAweDAxLCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEZGLCAweDI3LAorCSAweDA1LCAweEZELCAweDA0LCAweEZCLCAweDIwLCAweDQwLCAweDgwLCAweDJBLCAweDAyLCAweDAwLCAweDEwLCAweDc1LCAweDA1LCAweDAwLCAweDAxLCAweDY0LAorCSAweDE5LCAweDYwLCAweEY3LCAweEZCLCAweDA4LCAweDYwLCAweDEwLCAweDc1LCAweDQ2LCAweDAxLCAweDI1LCAweDQ2LCAweDAxLCAweEYyLCAweDA4LCAweEYwLAorCSAweDYwLCAweDQ3LCAweDAzLCAweEI0LCAweDAzLCAweEFDLCAweDdGLCAweDY3LCAweDAzLCAweDYxLCAweDA4LCAweDAyLCAweDI2LCAweDYwLCAweDIwLCAweDY0LAorCSAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI0LCAweDQwLCAweDAxLCAweDJCLCAweDQ5LCAweDAwLCAweDI1LCAweDQ0LCAweDFGLCAweEI0LCAweEUwLCAweDg1LCAweDJBLCAweDYwLCAweEY0LCAweDY0LAorCSAweEM0LCAweDk4LCAweEZGLCAweEZGLCAweEMwLCAweEZFLCAweDNELCAweDAwLCAweEMxLCAweEZFLCAweDNCLCAweDAwLCAweEMyLCAweEZFLCAweDM5LCAweDAwLAorCSAweEMzLCAweEZFLCAweDM3LCAweDAwLCAweEM0LCAweEZFLCAweDM1LCAweDAwLCAweEM1LCAweEZFLCAweDMzLCAweDAwLCAweEM2LCAweEZFLCAweDMxLCAweDAwLAorCSAweEM3LCAweEZFLCAweDJGLCAweDAwLCAweEM4LCAweEZFLCAweDJELCAweDAwLCAweEM5LCAweEZFLCAweDJCLCAweDAwLCAweENBLCAweEZFLCAweDI5LCAweDAwLAorCSAweENCLCAweEZFLCAweDI3LCAweDAwLCAweENDLCAweEZFLCAweDI1LCAweDAwLCAweENELCAweEZFLCAweDIzLCAweDAwLCAweENFLCAweEZFLCAweDIxLCAweDAwLAorCSAweENGLCAweEZFLCAweDFGLCAweDAwLCAweEQwLCAweEZFLCAweDFELCAweDAwLCAweEQxLCAweEZFLCAweDFCLCAweDAwLCAweEQyLCAweEZFLCAweDE5LCAweDAwLAorCSAweEQzLCAweEZFLCAweDE3LCAweDAwLCAweEQ0LCAweEZFLCAweDE1LCAweDAwLCAweEQ1LCAweEZFLCAweDEzLCAweDAwLCAweEQ2LCAweEZFLCAweDExLCAweDAwLAorCSAweEQ3LCAweEZFLCAweDBGLCAweDAwLCAweEQ4LCAweEZFLCAweDBELCAweDAwLCAweEQ5LCAweEZFLCAweDBCLCAweDAwLCAweERBLCAweEZFLCAweDA5LCAweDAwLAorCSAweERCLCAweEZFLCAweDA3LCAweDAwLCAweERDLCAweEZFLCAweDA1LCAweDAwLCAweERELCAweEZFLCAweDAzLCAweDAwLCAweERFLCAweEZFLCAweDAxLCAweDAwLAorCSAweERGLCAweEZFLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAwLCAweDY0LCAweDlGLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDlFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlELCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlDLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDlCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDlBLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk5LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk4LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk3LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDk2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk1LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDk0LCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDkzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkyLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkxLCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDkwLCAweEZFLCAweEYwLCAweDg0LCAweDA2LCAweEZCLCAweDhGLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDhFLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhELCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhDLCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDhCLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDhBLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg5LCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg4LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg3LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLAorCSAweDg2LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg1LCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDg0LCAweEZFLCAweEYwLCAweDg0LAorCSAweEZGLCAweEZGLCAweDgzLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgyLCAweEZFLCAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgxLCAweEZFLAorCSAweEYwLCAweDg0LCAweEZGLCAweEZGLCAweDgwLCAweEZFLCAweEYwLCAweDg0LCAweDA1LCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDVDLCAweDVDLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI0LCAweDQwLCAweDAxLCAweDI3LCAweDU1LCAweDAwLCAweDA1LCAweDYwLAorCSAweDAwLCAweDYzLCAweDA1LCAweEZELCAweDMwLCAweDQ0LCAweEJELCAweERCLCAweDMxLCAweDQ0LCAweEJELCAweERCLCAweDMyLCAweDQ0LCAweEJELCAweERCLAorCSAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLCAweDM1LCAweDQ0LCAweEJELCAweERCLCAweDM2LCAweDQ0LCAweEJELCAweERCLAorCSAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLCAweDM5LCAweDQ0LCAweEJELCAweERCLCAweDNBLCAweDQ0LCAweEJELCAweERCLAorCSAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLCAweDNELCAweDQ0LCAweEJELCAweERCLCAweDNFLCAweDQ0LCAweEJELCAweERCLAorCSAweDNGLCAweDQ0LCAweEJELCAweERCLCAweDAyLCAweDYxLCAweDYxLCAweDQ0LCAweDAyLCAweDM2LCAweDgyLCAweEZGLCAweDAzLCAweDM2LCAweDgzLCAweEZGLAorCSAweDA0LCAweDM2LCAweDg0LCAweEZGLCAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLCAweDA3LCAweDM2LCAweDg3LCAweEZGLAorCSAweDIwLCAweDQ0LCAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LCAweEJELCAweERCLAorCSAweDI0LCAweDQ0LCAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LCAweEJELCAweERCLAorCSAweDI4LCAweDQ0LCAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LCAweEJELCAweERCLAorCSAweDJDLCAweDQ0LCAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LCAweEJELCAweERCLAorCSAweERELCAweDgxLCAweDA4LCAweDNBLCAweEQwLCAweDAxLCAweDU0LCAweDAwLCAweDI3LCAweDQwLCAweDEwLCAweDI2LCAweDMwLCAweDAwLCAweDI2LCAweDQ0LAorCSAweDAxLCAweDM2LCAweDJELCAweDAwLCAweDAyLCAweDM2LCAweDgyLCAweEZGLCAweDAzLCAweDM2LCAweDgzLCAweEZGLCAweDA0LCAweDM2LCAweDg0LCAweEZGLAorCSAweDA1LCAweDM2LCAweDg1LCAweEZGLCAweDA2LCAweDM2LCAweDg2LCAweEZGLCAweDI1LCAweDQ0LCAweDAwLCAweDM2LCAweDQ0LCAweDQwLCAweDAxLCAweDM2LAorCSAweDQ0LCAweDQxLCAweDAyLCAweDM2LCAweDQ0LCAweDQyLCAweDAzLCAweDM2LCAweDQ0LCAweDQzLCAweDA0LCAweDM2LCAweDQ0LCAweDQ0LCAweDA1LCAweDM2LAorCSAweDQ0LCAweDQ1LCAweDA2LCAweDM2LCAweDQ0LCAweDQ2LCAweDA3LCAweDM2LCAweDQ0LCAweDQ3LCAweDA4LCAweDM2LCAweDQ0LCAweDQ4LCAweDA5LCAweDM2LAorCSAweDQ0LCAweDQ5LCAweDBBLCAweDM2LCAweDQ0LCAweDRBLCAweDBCLCAweDM2LCAweDQ0LCAweDRCLCAweDBDLCAweDM2LCAweDQ0LCAweDRDLCAweDBELCAweDM2LAorCSAweDQ0LCAweDRELCAweDBFLCAweDM2LCAweDQ0LCAweDRFLCAweDBGLCAweDM2LCAweDQ0LCAweDRGLCAweDg3LCAweEZGLCAweDIxLCAweDAwLCAweDI1LCAweDQ0LAorCSAweDEwLCAweDM2LCAweDQ0LCAweDUwLCAweDExLCAweDM2LCAweDQ0LCAweDUxLCAweDEyLCAweDM2LCAweDQ0LCAweDUyLCAweDEzLCAweDM2LCAweDQ0LCAweDUzLAorCSAweDE0LCAweDM2LCAweDQ0LCAweDU0LCAweDE1LCAweDM2LCAweDQ0LCAweDU1LCAweDE2LCAweDM2LCAweDQ0LCAweDU2LCAweDE3LCAweDM2LCAweDQ0LCAweDU3LAorCSAweDE4LCAweDM2LCAweDQ0LCAweDU4LCAweDE5LCAweDM2LCAweDQ0LCAweDU5LCAweDFBLCAweDM2LCAweDQ0LCAweDVBLCAweDFCLCAweDM2LCAweDQ0LCAweDVCLAorCSAweDFDLCAweDM2LCAweDQ0LCAweDVDLCAweDFELCAweDM2LCAweDQ0LCAweDVELCAweDFFLCAweDM2LCAweDQ0LCAweDVFLCAweDFGLCAweDM2LCAweDQ0LCAweDVGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDQ2LCAweEI1LCAweDYwLCAweDU4LCAweDRGLCAweENFLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAzLCAweDYxLCAweDdGLCAweDY3LCAweDBBLCAweDAyLCAweDAwLCAweEYwLCAweDA0LCAweDY0LCAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDVBLCAweEQ5LAorCSAweDBBLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLAorCSAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDEyLCAweDAyLCAweDE0LCAweDY0LCAweDEzLCAweDYwLAorCSAweDFDLCAweEZCLCAweDAwLCAweDYwLCAweDUwLCAweDYzLCAweDVBLCAweERELCAweDJDLCAweDYwLCAweDc1LCAweDY0LCAweDlGLCAweEZCLCAweDJELCAweEZGLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDJBLCAweEYzLCAweDA1LCAweEZCLCAweDJCLCAweEYzLCAweDA2LCAweEZCLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDQwLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLAorCSAweDBFLCAweDAyLCAweDE2LCAweDY0LCAweDEzLCAweDYwLCAweDFDLCAweEZCLCAweDAwLCAweDYwLCAweDUwLCAweDYzLCAweDVBLCAweERELCAweDJDLCAweDYwLAorCSAweDkwLCAweDY0LCAweDlGLCAweEZCLCAweDJELCAweEZGLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDAyLCAweDYxLCAweDM4LCAweDAyLCAweDI1LCAweDQ1LAorCSAweDIwLCAweDQ0LCAweDgwLCAweDJBLCAweDM0LCAweDAwLCAweEYxLCAweDYwLCAweDAwLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDA2LCAweDAzLAorCSAweEYxLCAweDYwLCAweDAyLCAweDY0LCAweEQ0LCAweDgwLCAweEZGLCAweEZGLCAweDJGLCAweDAzLCAweDI4LCAweDAwLCAweDE5LCAweDYwLCAweDQwLCAweEYxLAorCSAweEI3LCAweEYzLCAweDIwLCAweDYwLCAweDIyLCAweDYxLCAweEEwLCAweDg0LCAweEExLCAweERCLCAweDI1LCAweDQ1LCAweDI1LCAweDYwLCAweDg2LCAweDYzLAorCSAweDAyLCAweDYxLCAweEJELCAweEQzLCAweEJELCAweEQxLCAweEQ0LCAweDgwLCAweEJELCAweEQzLCAweEJELCAweEQ1LCAweENELCAweDgxLCAweDAyLCAweDAzLAorCSAweDE1LCAweDAzLCAweEY3LCAweDAxLCAweEEyLCAweEZGLCAweEE2LCAweEQzLCAweDQwLCAweDRDLCAweDAwLCAweEE4LCAweDY3LCAweDQzLCAweDBDLCAweDAyLAorCSAweEEyLCAweERELCAweDQyLCAweDQ4LCAweDY0LCAweDQxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDI1LCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDI4LCAweERCLCAweDAyLCAweDAzLCAweDJDLCAweDU4LCAweEEzLCAweEZGLCAweDBDLCAweDYxLCAweDAzLCAweDAwLCAweDA0LCAweDYxLCAweDdGLCAweDY3LAorCSAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDEwLCAweDYwLCAweDEzLCAweEZCLCAweEZGLCAweEZGLAorCSAweEM0LCAweEZFLCAweEY3LCAweDAxLCAweEM2LCAweEZFLCAweEY1LCAweDAxLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLAorCSAweDAyLCAweDYxLCAweDNGLCAweDAyLCAweDI1LCAweDQ1LCAweEY4LCAweDJCLCAweDNCLCAweDAwLCAweDJFLCAweEY1LCAweDY3LCAweDQ0LCAweEQ0LCAweDgwLAorCSAweDIwLCAweDYwLCAweENDLCAweDYzLCAweDM5LCAweDAzLCAweDc5LCAweDYxLCAweDI0LCAweDQ0LCAweDAxLCAweDI3LCAweDI5LCAweDAwLCAweEEzLCAweEZDLAorCSAweEE0LCAweEY4LCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LCAweDY0LCAweDU4LCAweDA4LCAweEEzLAorCSAweEY4LCAweDAyLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweEZFLCAweEEwLCAweEZBLCAweDYwLCAweDAwLCAweDY0LAorCSAweEQwLCAweDgwLCAweDE0LCAweDAyLCAweDEzLCAweDAyLCAweDA0LCAweEEzLCAweEJFLCAweEQzLCAweEJELCAweEQxLCAweDBGLCAweDE4LCAweEQ0LCAweDgwLAorCSAweDBELCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDY0LCAweDQxLCAweERELCAweDgxLCAweEUxLCAweDgxLAorCSAweENCLCAweDgzLCAweDQ2LCAweDY1LCAweDM2LCAweDYwLCAweDU4LCAweDRGLCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDBBLCAweDAwLAorCSAweEJELCAweEQzLCAweEJFLCAweEQxLCAweEQ0LCAweDgwLCAweENELCAweDgxLCAweDA4LCAweDI0LCAweDY0LCAweDU4LCAweDA4LCAweEEzLCAweEY4LCAweDAyLAorCSAweDA0LCAweDYxLCAweDdGLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDBGLCAweDY0LCAweDIzLCAweEZBLCAweDY3LCAweDQ0LCAweDI0LCAweEZBLAorCSAweDYyLCAweDQxLCAweDNDLCAweDYwLCAweDAwLCAweDY1LCAweDFBLCAweDYzLCAweDgwLCAweDYwLCAweDlFLCAweDY0LCAweDY1LCAweDQ2LCAweDU4LCAweEQwLAorCSAweDJFLCAweEY1LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweENCLCAweDgzLCAweEJGLCAweEQxLAorCSAweDRBLCAweDY1LCAweDY0LCAweDQzLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDAxLCAweDI2LCAweERDLCAweDgxLCAweEU5LCAweDg0LAorCSAweERDLCAweDg0LCAweDIzLCAweEZBLCAweDA5LCAweDAwLCAweDRCLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweERDLCAweDg0LAorCSAweDIzLCAweEZBLCAweEJGLCAweEQxLCAweDRBLCAweDY1LCAweDY0LCAweDQzLCAweDM2LCAweDYwLCAweDU4LCAweDRGLCAweDIyLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweEZGLCAweEZGLCAweEUwLCAweEEwLCAweDIwLCAweDY0LCAweDAxLCAweDA2LAorCSAweDI1LCAweEZBLCAweDIzLCAweEYyLCAweERGLCAweEQxLCAweENDLCAweDg0LCAweEUwLCAweDg1LCAweDBCLCAweDA2LCAweEJGLCAweEQxLCAweDY0LCAweDQxLAorCSAweEQ1LCAweDgwLCAweDY0LCAweDQzLCAweDAxLCAweDA2LCAweDY1LCAweDQxLCAweDRBLCAweDY1LCAweDJFLCAweDYwLCAweDU4LCAweDRGLCAweDdBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweERCLCAweEYzLCAweDAyLCAweDYzLCAweDIzLCAweEZDLCAweDA3LCAweEI0LAorCSAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDRCLCAweEQzLCAweEJGLCAweEQzLCAweDYwLCAweDQxLCAweEM5LCAweDgzLAorCSAweEU5LCAweDgxLCAweERELCAweDgxLCAweEEzLCAweEZBLCAweEUwLCAweDgxLCAweDNDLCAweDYwLCAweDAwLCAweDY3LCAweDAyLCAweDI0LCAweDAyLCAweEE0LAorCSAweDYwLCAweDQ3LCAweDQwLCAweDRCLCAweEM5LCAweDgxLCAweDRBLCAweDY1LCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweEE1LCAweEQ4LAorCSAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY2LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLCAweDYwLCAweDQ3LCAweDI1LCAweEZBLAorCSAweDAwLCAweDdFLCAweDYwLCAweDQ3LCAweDAxLCAweDI2LCAweERDLCAweDg0LCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweEQ4LCAweDg0LCAweDIzLCAweEZBLAorCSAweEFCLCAweDAxLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDRDLCAweDY1LCAweEE0LCAweEQzLCAweERBLCAweDgzLCAweDAwLCAweDdGLCAweDI1LCAweEZBLAorCSAweDYwLCAweDQxLCAweDAxLCAweDI2LCAweERELCAweDgxLCAweEU5LCAweDg0LCAweEQ4LCAweDg0LCAweDIzLCAweEZBLCAweDlELCAweDAxLCAweDJFLCAweDYwLAorCSAweDQwLCAweDYzLCAweEJGLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweEU4LCAweDg0LCAweERDLCAweDg0LCAweDIzLCAweEZBLCAweDRBLCAweDY1LAorCSAweDM2LCAweDYwLCAweDU4LCAweDRGLCAweDIyLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDJFLCAweDYwLAorCSAweDQwLCAweDYzLCAweDIzLCAweEYyLCAweEMwLCAweDY1LCAweENDLCAweDg0LCAweEUwLCAweDgxLCAweDBBLCAweDA0LCAweEJGLCAweERCLCAweEQ1LCAweDgwLAorCSAweDA3LCAweDAzLCAweDAxLCAweDA2LCAweDY1LCAweDQxLCAweDYxLCAweDQ0LCAweEJGLCAweERCLCAweDRBLCAweDY1LCAweDU4LCAweDRGLCAweEE4LCAweDAwLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAzLCAweDRFLCAweDJELCAweDYwLCAweDU4LCAweDQzLCAweDU1LCAweDc4LCAweEZGLCAweEZGLAorCSAweDJGLCAweDYwLCAweDI0LCAweDYxLCAweDE3LCAweDYwLCAweDgxLCAweEYzLCAweEExLCAweERCLCAweENDLCAweDg0LCAweEE4LCAweDgzLCAweDA1LCAweDA0LAorCSAweDJGLCAweDYwLCAweDAyLCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDBFLCAweDQzLCAweDgyLCAweDAxLCAweDIzLCAweEYyLAorCSAweDI1LCAweEYyLCAweDAyLCAweEE4LCAweEY4LCAweEEwLCAweDBGLCAweDAyLCAweEVDLCAweEEwLCAweDBELCAweDA0LCAweDBDLCAweDA3LCAweDE5LCAweDYwLAorCSAweDRGLCAweEYxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDA3LCAweDE5LCAweDYwLCAweDRGLCAweEZCLCAweDE5LCAweDYwLAorCSAweDUzLCAweEZCLCAweDE2LCAweDYwLCAweEQ4LCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDFELCAweDYwLAorCSAweEFFLCAweDY1LCAweDYwLCAweDQxLCAweDFELCAweDYwLCAweDRBLCAweDYzLCAweEEzLCAweERCLCAweEZGLCAweEExLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLAorCSAweDdFLCAweEE4LCAweDVCLCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEZGLCAweEExLCAweEQ3LCAweDgwLCAweDAyLCAweDAzLAorCSAweDAxLCAweDAzLCAweEY1LCAweDAxLCAweDJFLCAweEY1LCAweDAwLCAweDYwLCAweDJGLCAweDY1LCAweDI1LCAweEYyLCAweDAwLCAweDYzLCAweENDLCAweDg0LAorCSAweDAzLCAweEEzLCAweEZELCAweDA1LCAweDRBLCAweDY0LCAweEQ3LCAweDgwLCAweDFDLCAweDYwLCAweEU2LCAweDYxLCAweDE4LCAweDA1LCAweEExLCAweERELAorCSAweEUzLCAweDgzLCAweEZFLCAweEEzLCAweDU4LCAweEQwLCAweDdFLCAweEE4LCAweDU5LCAweEQ5LCAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LAorCSAweEY5LCAweDFGLCAweDAwLCAweDYzLCAweDU5LCAweERELCAweDJFLCAweEY1LCAweDI1LCAweEYwLCAweDBFLCAweDYwLCAweDczLCAweEYzLCAweEQzLCAweDgwLAorCSAweDAxLCAweEIwLCAweDA0LCAweDAzLCAweDAxLCAweEE0LCAweDAzLCAweDAzLCAweEEyLCAweERCLCAweDAxLCAweDAwLCAweEEyLCAweERELCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDFELCAweDYwLCAweDRBLCAweDYxLCAweEExLCAweEQzLCAweDIzLCAweEZBLCAweEUwLCAweDgzLCAweDRBLCAweDY1LAorCSAweDA0LCAweDAyLCAweDAyLCAweDYzLCAweDIzLCAweEZDLCAweEE1LCAweEZDLCAweDA5LCAweDAwLCAweERCLCAweDgzLCAweDU5LCAweEQxLCAweEE1LCAweEQ4LAorCSAweERBLCAweDg1LCAweDgwLCAweDNBLCAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDYwLCAweDczLCAweEYzLCAweDAwLCAweDYxLCAweDAyLCAweEE0LCAweEZFLCAweEEwLCAweDIzLCAweEZBLCAweDFCLCAweDAzLAorCSAweEZBLCAweEE0LCAweEZELCAweEE0LCAweDAxLCAweEExLCAweEZELCAweDA3LCAweDYxLCAweDQzLCAweDIzLCAweEYyLCAweDI1LCAweEZDLCAweEUwLCAweDgzLAorCSAweDAyLCAweEEzLCAweDFDLCAweDYwLCAweEU2LCAweDYxLCAweDAwLCAweDYwLCAweDRBLCAweDY0LCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweDdFLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDI1LCAweEYyLCAweDIzLCAweEYyLCAweDAxLCAweEIwLCAweENDLCAweDg0LAorCSAweDA0LCAweDAyLCAweDIzLCAweEZBLCAweDAyLCAweDAwLCAweDAwLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDQxLCAweDRCLCAweDY1LCAweDQyLCAweDgwLCAweDY0LCAweEQ0LCAweDg1LCAweDJCLCAweDQxLCAweDAwLCAweEExLCAweDU1LCAweDhCLCAweDBELCAweDAzLAorCSAweDAyLCAweDA0LCAweDY1LCAweDQxLCAweDAyLCAweDAwLCAweDAwLCAweDY0LCAweDQwLCAweDRCLCAweENBLCAweDg0LCAweDU4LCAweEQwLCAweEM5LCAweDgxLAorCSAweEJELCAweEQ5LCAweEZDLCAweDAyLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEVDLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLAorCSAweEEzLCAweEQzLCAweDAyLCAweDdDLCAweEEwLCAweEQzLCAweDIzLCAweEY4LCAweERDLCAweDg0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDAxLCAweDY0LCAweDlELCAweEZFLCAweDAyLCAweDI4LCAweDAyLCAweDY0LCAweDI1LCAweEZBLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDdDLCAweDIzLCAweEY4LCAweDAxLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEZDLCAweEEzLCAweEEzLCAweEQxLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweEE0LCAweEQzLCAweDI1LCAweEZBLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDY0LCAweDIzLCAweEZBLCAweDg4LCAweEZGLCAweDc1LCAweDQ0LCAweDhELCAweEZGLAorCSAweEU4LCAweDg3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDAzLCAweEI0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDA0LCAweDY0LCAweDIzLCAweEZBLCAweDg2LCAweEZGLCAweDI5LCAweDQ0LCAweDg3LCAweEZGLCAweDI1LCAweEZBLCAweDU1LCAweEYzLCAweDUyLCAweEYxLAorCSAweDgwLCAweDY1LCAweEM0LCAweDg3LCAweDAwLCAweDdGLCAweDI2LCAweEZBLCAweDY0LCAweDQ0LCAweEM0LCAweDg3LCAweDAwLCAweDdGLCAweDI3LCAweEZBLAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDA1LCAweDY0LCAweDIzLCAweEZBLCAweDUyLCAweDYzLCAweEI0LCAweEYzLCAweDRCLCAweERBLAorCSAweEIzLCAweEYzLCAweDRCLCAweERBLCAweEIyLCAweEYzLCAweDRCLCAweERBLCAweDYwLCAweDQxLCAweDg4LCAweEZGLCAweDcyLCAweDVDLCAweDg5LCAweEZGLAorCSAweDRBLCAweEQ4LCAweEEyLCAweDQ4LCAweDIwLCAweDIzLCAweDBFLCAweDAwLCAweDY0LCAweDQwLCAweDgwLCAweDI3LCAweDE1LCAweDAwLCAweERDLCAweDg0LAorCSAweEJELCAweERBLCAweEJELCAweEQyLCAweDExLCAweDA0LCAweERDLCAweDg0LCAweEEyLCAweERBLCAweEEzLCAweEQyLCAweDBELCAweDA0LCAweERDLCAweDg0LAorCSAweEEzLCAweERBLCAweDBBLCAweDAwLCAweDUyLCAweDYzLCAweEI0LCAweEYzLCAweDRCLCAweERBLCAweEIzLCAweEYzLCAweDRCLCAweERBLCAweEIyLCAweEYzLAorCSAweDRCLCAweERBLCAweDU0LCAweDkwLCAweDRDLCAweDYzLCAweEUwLCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYwLAorCSAweDIzLCAweEYyLCAweDE5LCAweDYwLCAweDQ2LCAweEY5LCAweDAyLCAweEE4LCAweDY0LCAweDQ0LCAweDFGLCAweDAyLCAweDNGLCAweDQwLCAweDAyLCAweDJCLAorCSAweDE2LCAweDAwLCAweDAwLCAweDM3LCAweDE0LCAweDAwLCAweDAxLCAweDNCLCAweDE4LCAweDAwLCAweDEyLCAweDYwLCAweDQ1LCAweDY1LCAweDExLCAweDYwLAorCSAweDY1LCAweDYzLCAweEZGLCAweEI3LCAweDYwLCAweDVDLCAweEEzLCAweEQzLCAweDA4LCAweEEzLCAweDAwLCAweDdFLCAweEQwLCAweDgwLCAweEQ3LCAweDgwLAorCSAweDAzLCAweDAzLCAweEY5LCAweDAyLCAweDdGLCAweDY3LCAweDBBLCAweDAwLCAweEY0LCAweEEzLCAweEEzLCAweEQxLCAweDA0LCAweDAwLCAweDAwLCAweEJDLAorCSAweEYyLCAweEE0LCAweDAzLCAweDAzLCAweDAyLCAweDA3LCAweDE2LCAweDYwLCAweENGLCAweEY5LCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDIwLCAweDYzLCAweDJFLCAweDYwLCAweDAwLCAweDYxLCAweDQ4LCAweDY0LCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDI1LCAweEYwLAorCSAweDIwLCAweDY0LCAweEQwLCAweDgxLCAweEZGLCAweEZGLCAweDAyLCAweDA3LCAweDI1LCAweEZBLCAweDBGLCAweDAwLCAweDJFLCAweDYwLCAweDA0LCAweDYzLAorCSAweEMzLCAweDgzLCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweENGLCAweDgzLCAweEEzLCAweEQzLCAweENELCAweDgxLCAweDAwLCAweDdGLCAweEJELCAweERCLAorCSAweDA0LCAweDAzLCAweDAwLCAweDY0LCAweEM5LCAweDgxLCAweEJELCAweERCLCAweEZELCAweDAyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLCAweEEwLCAweDYyLCAweDA5LCAweDAyLCAweEEyLCAweEQ5LCAweDY0LCAweDQxLAorCSAweDMyLCAweDQ0LCAweDAyLCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LCAweDA4LCAweDI4LCAweDAyLCAweEJDLCAweDQwLCAweDUyLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLCAweEEyLCAweDYyLCAweDA5LCAweDAyLAorCSAweEEyLCAweEQ5LCAweDY0LCAweDQxLCAweDMyLCAweDQ0LCAweDA0LCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LCAweDA4LCAweDI4LCAweDA0LCAweEJDLAorCSAweDQwLCAweDUyLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAxLCAweDYwLAorCSAweEIwLCAweDYyLCAweDE1LCAweDAyLCAweEEyLCAweEQ5LCAweDY0LCAweDQxLCAweDMyLCAweDQ0LCAweDQwLCAweEI1LCAweDAwLCAweEI5LCAweEQ0LCAweDg0LAorCSAweDA4LCAweDI0LCAweDBDLCAweDAwLCAweDQwLCAweEJDLCAweDAyLCAweEI1LCAweEQ0LCAweDg0LCAweDQzLCAweEY5LCAweDM3LCAweDYwLCAweDc2LCAweDYzLAorCSAweEQzLCAweDgwLCAweDJGLCAweDYwLCAweDUwLCAweDdDLCAweDAyLCAweDAzLCAweDQzLCAweEZELCAweEE0LCAweERGLCAweDQwLCAweDUyLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDM3LCAweDYwLCAweDc2LCAweDY0LCAweDQzLCAweEZCLCAweDJELCAweDYwLCAweDVCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAxLCAweDYwLCAweEFDLCAweDYzLCAweDdGLCAweDY3LCAweDM5LCAweDE4LCAweEEzLCAweEQ5LCAweDI2LCAweEYwLAorCSAweDdGLCAweDY3LCAweDM1LCAweDE4LCAweDVCLCAweEQ5LCAweDE2LCAweDYwLCAweDg3LCAweEYzLCAweDI1LCAweEYwLCAweDYwLCAweDQwLCAweDAzLCAweDNBLAorCSAweDJELCAweDAwLCAweEE2LCAweEYzLCAweDIwLCAweDYzLCAweEUzLCAweDgzLCAweDYwLCAweDQ2LCAweDBGLCAweEY4LCAweDMwLCAweDYxLCAweDk0LCAweEZBLAorCSAweDAxLCAweDYxLCAweDkxLCAweEZBLCAweDE2LCAweDY0LCAweDEyLCAweEZBLCAweDYwLCAweDQwLCAweDEwLCAweDM2LCAweDA1LCAweDAwLCAweDEyLCAweDM2LAorCSAweDA4LCAweDAwLCAweDBDLCAweDM2LCAweDBCLCAweDAwLCAweDBGLCAweDAwLCAweDQwLCAweDYxLCAweEExLCAweDgwLCAweDBBLCAweDY0LCAweDExLCAweDAyLAorCSAweEYzLCAweDAxLCAweDEwLCAweDYxLCAweEExLCAweDgwLCAweDBFLCAweDY0LCAweDBDLCAweDAyLCAweEVFLCAweDAxLCAweDA4LCAweDYxLCAweEExLCAweDgwLAorCSAweDEwLCAweDY0LCAweDA3LCAweDAyLCAweEU5LCAweDAxLCAweEUxLCAweDgxLCAweEExLCAweDgwLCAweDA1LCAweDA1LCAweEM4LCAweDg0LCAweDAxLCAweDAyLAorCSAweEUzLCAweDAxLCAweDEyLCAweEZBLCAweDkxLCAweEZBLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEQ3LCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE5LCAweDYwLCAweDQ1LCAweEZCLCAweDE5LCAweDYwLCAweDRDLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLAorCSAweDA4LCAweDI2LCAweDE4LCAweDAwLCAweDE5LCAweDYwLCAweDQ1LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDBBLCAweDAwLAorCSAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDAyLCAweEJDLCAweDYwLCAweDQ0LCAweEEyLCAweERCLCAweDE5LCAweDYwLCAweDQ1LCAweEYzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAyLCAweDJBLCAweDA2LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweEJDLAorCSAweDYwLCAweDQ0LCAweEEyLCAweERCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLCAweDAyLCAweEE4LAorCSAweDAwLCAweDY3LCAweDAyLCAweDAyLCAweDJELCAweEY5LCAweDJDLCAweEY5LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYyLAorCSAweDAyLCAweEE4LCAweDAwLCAweEE4LCAweDBBLCAweDAyLCAweDA3LCAweDAzLCAweEQwLCAweEEwLCAweDMwLCAweDY1LCAweDAzLCAweDA0LCAweEE3LCAweEEwLAorCSAweDU5LCAweDY1LCAweDAxLCAweDA2LCAweDY1LCAweDQ0LCAweDE2LCAweDYwLCAweENFLCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI1LCAweEYyLCAweDE5LCAweDYwLCAweDRDLCAweEZCLCAweEZGLCAweEZGLCAweDA4LCAweDJBLCAweDI1LCAweDAwLCAweDE5LCAweDYwLCAweDdCLCAweEYzLAorCSAweEZGLCAweEZGLCAweEU5LCAweEI0LCAweDYwLCAweDQ0LCAweDE5LCAweDYwLCAweDRDLCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAxLCAweDI2LAorCSAweDAyLCAweEJDLCAweDY0LCAweDQwLCAweDAyLCAweDJBLCAweDA0LCAweEJDLCAweDY0LCAweDQwLCAweDA0LCAweDI2LCAweDA4LCAweDAwLCAweDE5LCAweDYwLAorCSAweDdCLCAweEZCLCAweDEzLCAweDY0LCAweENCLCAweEZCLCAweDAxLCAweDYwLCAweDY3LCAweDY0LCAweDM3LCAweEZCLCAweDBDLCAweDAwLCAweDEwLCAweEJDLAorCSAweDE5LCAweDYwLCAweDdCLCAweEZCLCAweDA4LCAweDY0LCAweENCLCAweEZCLCAweEExLCAweEYzLCAweDAxLCAweDYwLCAweDY3LCAweDdDLCAweDYwLCAweDQwLAorCSAweDAxLCAweDI3LCAweDVCLCAweDdDLCAweDM3LCAweEY5LCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE5LCAweDYwLAorCSAweDRELCAweEZCLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE5LCAweDYwLCAweDRFLCAweEZCLCAweDAwLCAweDY3LAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYyLCAweDE5LCAweDYwLCAweDg5LCAweEZCLCAweEZGLCAweEZGLCAweDBGLCAweDIyLCAweDQxLCAweDc1LAorCSAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY0LCAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweDFCLCAweDYwLCAweEZFLCAweEZCLAorCSAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBFLCAweDAyLCAweDA2LCAweDYxLAorCSAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLAorCSAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLAorCSAweEMwLCAweDY0LCAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBFLCAweDAyLCAweDA4LCAweDYxLCAweDQxLCAweDU2LAorCSAweEM3LCAweEZFLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLAorCSAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdGLCAweDYwLCAweEMwLCAweDY0LAorCSAweDI0LCAweDQ1LCAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDBFLCAweDAyLCAweDBBLCAweDYxLCAweDQxLCAweDU2LCAweEM3LCAweEZFLAorCSAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLCAweDAwLCAweDdGLCAweDYwLCAweDQxLAorCSAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDdFLCAweDYwLCAweEMwLCAweDY0LCAweDI0LCAweDQ1LAorCSAweEE0LCAweDgwLCAweDdGLCAweDY3LCAweDAyLCAweDYxLCAweDExLCAweDAyLCAweDY1LCAweDQzLCAweDE5LCAweDYwLCAweEE1LCAweEZELCAweDBDLCAweDYxLAorCSAweDQxLCAweDU2LCAweEM3LCAweEZFLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDQ3LCAweEZGLCAweDIzLCAweDA0LCAweDAwLAorCSAweDAwLCAweDdGLCAweDYwLCAweDQxLCAweDdGLCAweDY3LCAweDAxLCAweDAwLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIwLCAweDY0LAorCSAweDIzLCAweEZBLCAweDRBLCAweDYxLCAweDEwLCAweDYwLCAweERBLCAweDY0LCAweEEwLCAweEQxLCAweEExLCAweEQ4LCAweDU4LCAweEQxLCAweDU5LCAweEQ4LAorCSAweDU4LCAweEQxLCAweDU5LCAweEQ4LCAweDAxLCAweEExLCAweDEwLCAweDYwLCAweEYyLCAweDYzLCAweDVELCAweDY1LCAweEEzLCAweEQzLCAweDAyLCAweEEzLAorCSAweDAyLCAweDFCLCAweDdGLCAweDY0LCAweDAxLCAweDAwLCAweEEzLCAweEQzLCAweDYwLCAweEZFLCAweDVELCAweERBLCAweDIwLCAweEZFLCAweEQ1LCAweDgwLAorCSAweDA0LCAweEEzLCAweEY0LCAweDAyLCAweDAxLCAweEExLCAweDEwLCAweDYwLCAweEUwLCAweDY0LCAweEEwLCAweEQxLCAweEExLCAweEQ4LCAweDU4LCAweEQxLAorCSAweDU5LCAweEQ4LCAweDU4LCAweEQxLCAweDU5LCAweEQ4LCAweDAxLCAweEExLCAweDYwLCAweEZFLCAweDA3LCAweDYzLCAweDdGLCAweDY0LCAweENGLCAweDgzLAorCSAweDVELCAweERBLCAweEZELCAweDAyLCAweDIwLCAweEZFLCAweDEyLCAweDYwLCAweDQwLCAweDdDLCAweDExLCAweDYwLCAweDYyLCAweDYzLCAweDdGLCAweDY1LAorCSAweEEzLCAweEQzLCAweDAyLCAweEEzLCAweDAyLCAweDFCLCAweDdGLCAweDY0LCAweDAxLCAweDAwLCAweEEzLCAweEQzLCAweDYwLCAweEZFLCAweDVELCAweERBLAorCSAweDIwLCAweEZFLCAweEQ1LCAweDgwLCAweDA2LCAweEEzLCAweDAzLCAweDAyLCAweDQ2LCAweDQ1LCAweDAwLCAweEY0LCAweDAzLCAweDYxLCAweEQzLCAweDgwLAorCSAweEZGLCAweEZGLCAweEVFLCAweDA0LCAweDI1LCAweDQ2LCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAyLCAweDYzLCAweDdELCAweEYzLAorCSAweDIzLCAweEZDLCAweDYwLCAweDQwLCAweDAxLCAweDIzLCAweDE3LCAweDAwLCAweDAxLCAweDYwLCAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDExLCAweDYwLAorCSAweDYwLCAweDYxLCAweDEyLCAweDYwLCAweDQwLCAweDY1LCAweEExLCAweEQxLCAweEQ1LCAweDgwLCAweEQwLCAweDgwLCAweDBCLCAweDAzLCAweDAyLCAweDAzLAorCSAweDA4LCAweEExLCAweEY5LCAweDAxLCAweDA0LCAweEExLCAweEExLCAweEQzLCAweDAxLCAweDYwLCAweDAwLCAweDY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LAorCSAweEI0LCAweDg0LCAweDAxLCAweDAwLCAweEZGLCAweDY0LCAweDI1LCAweEZBLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDBDLCAweDYzLAorCSAweDIzLCAweEZDLCAweEUyLCAweEYzLCAweDEzLCAweDYwLCAweEYyLCAweDYzLCAweENDLCAweDg0LCAweEZGLCAweEZGLCAweDAyLCAweDA2LCAweDBDLCAweEEzLAorCSAweEZCLCAweDAxLCAweDQ4LCAweDYxLCAweDYxLCAweDQ0LCAweDE4LCAweEE1LCAweDYwLCAweEZFLCAweEJELCAweEQzLCAweDIwLCAweEZFLCAweDAwLCAweDdGLAorCSAweDU5LCAweERBLCAweEQ1LCAweDgwLCAweEZGLCAweEZGLCAweEY4LCAweDA0LCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweEYwLAorCSAweDE3LCAweDYwLCAweDgwLCAweEY5LCAweDExLCAweDAwLCAweDBDLCAweDYwLCAweEZFLCAweDYyLCAweDQwLCAweDYzLCAweDVBLCAweERGLCAweEZFLCAweDFGLAorCSAweDA0LCAweDY1LCAweDBDLCAweDYwLCAweEZFLCAweDYxLCAweDQ4LCAweDY0LCAweDNFLCAweDYzLCAweDdDLCAweEE4LCAweDU4LCAweEQwLCAweDU5LCAweEQ5LAorCSAweDAyLCAweDAyLCAweDAwLCAweEY0LCAweDAyLCAweDY0LCAweEY5LCAweDFGLCAweDE3LCAweDYwLCAweDgwLCAweEYxLCAweDBDLCAweDYwLCAweERBLCAweDY1LAorCSAweDAyLCAweEZFLCAweDY0LCAweDQ0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg3LCAweDYwLCAweDQxLCAweDY0LCAweDQ0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDNFLCAweEZCLCAweDYwLCAweDQyLCAweDYxLCAweDQ0LCAweDAzLCAweEEyLCAweDYwLCAweEZFLCAweEEyLCAweERCLAorCSAweDIwLCAweEZFLCAweDY0LCAweDQ0LCAweDBELCAweDYwLCAweDAwLCAweDY1LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEM0LCAweDg0LCAweDQwLCAweEZCLCAweEZGLCAweEZGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDVDLCAweDQxLAorCSAweDI1LCAweEYyLCAweEZGLCAweEZGLCAweDQwLCAweDQyLCAweDgwLCAweDJCLCAweDA0LCAweDAwLCAweEZGLCAweEI0LCAweDQwLCAweDQyLCAweDAxLCAweDY0LAorCSAweDQwLCAweDQxLCAweEE2LCAweEYzLCAweDQ2LCAweDRCLCAweDYwLCAweDQ2LCAweDIwLCAweDYzLCAweEUzLCAweDgzLCAweEFCLCAweDQ2LCAweDI2LCAweEYwLAorCSAweEFCLCAweDQ2LCAweDU5LCAweEY4LCAweEFCLCAweDQ2LCAweDI3LCAweEYwLCAweEFCLCAweDQ2LCAweDVBLCAweEY4LCAweEFCLCAweDQ2LCAweDI4LCAweEYwLAorCSAweEFCLCAweDQ2LCAweDVCLCAweEY4LCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEYxLCAweDFGLCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LAorCSAweEFCLCAweDQ2LCAweDBDLCAweDYwLCAweDM4LCAweDY1LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDUyLCAweDY0LCAweDBFLCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLAorCSAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEYwLCAweEExLCAweDc2LCAweDY0LCAweDBFLCAweDYzLCAweDU5LCAweEQxLAorCSAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LAorCSAweDBDLCAweDYwLCAweDlBLCAweDY1LCAweEM0LCAweDgxLCAweDYwLCAweDQ1LCAweEM5LCAweDgxLCAweDYyLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLAorCSAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEY4LCAweEExLCAweEI2LCAweDY0LAorCSAweDA2LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDY1LCAweDQ0LCAweDBDLCAweDYwLCAweEJBLCAweDY1LAorCSAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDZBLCAweDY0LCAweDA2LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIyLCAweDQ0LAorCSAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg0LCAweDBDLCAweDYwLCAweDgwLCAweDY1LCAweEM0LCAweDgxLCAweDcyLCAweDY0LAorCSAweDA0LCAweDYzLCAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA2LCAweDAwLAorCSAweEZBLCAweEExLCAweDkwLCAweDY0LCAweDA0LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweDNCLCAweEYwLCAweDIxLCAweDQ0LAorCSAweDAxLCAweDJBLCAweDEzLCAweDAwLCAweDIyLCAweDQ0LCAweDNELCAweEZCLCAweDYwLCAweDQxLCAweDAyLCAweEZFLCAweEY4LCAweDg0LCAweEY4LCAweDg0LAorCSAweEY4LCAweDg0LCAweDNDLCAweEZCLCAweDBDLCAweDYwLCAweDdDLCAweDYzLCAweDg4LCAweEZGLCAweENELCAweDgxLCAweDA2LCAweEEzLCAweEZELCAweDBELAorCSAweDhELCAweEZGLCAweDNCLCAweEZELCAweDY0LCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDVDLCAweDIyLCAweDQzLCAweDgwLCAweDYxLCAweDg4LCAweEZGLAorCSAweENGLCAweDgzLCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweEIxLCAweDg0LCAweDNCLCAweEZBLAorCSAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweDNCLCAweEYwLCAweDY2LCAweDQ0LCAweEIxLCAweDlDLCAweDNCLCAweEY4LAorCSAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLAorCSAweDI1LCAweEYwLCAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDIyLCAweDAyLCAweDNELCAweEYxLCAweDY0LCAweDQ0LCAweDAzLCAweEI0LCAweDQwLCAweDQyLAorCSAweEQwLCAweDgwLCAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEJCLCAweEY0LCAweDgwLCAweDYxLCAweDAyLCAweDAyLCAweEUzLCAweDgzLAorCSAweEVCLCAweDgzLCAweDIyLCAweDQ0LCAweDg4LCAweEZGLCAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LAorCSAweDMxLCAweDkxLCAweDlELCAweDg1LCAweEE3LCAweDgzLCAweDNCLCAweEZDLCAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LAorCSAweEJCLCAweEYyLCAweDY2LCAweDQ0LCAweEE1LCAweDgxLCAweEJCLCAweEZBLCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLAorCSAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLAorCSAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LAorCSAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLAorCSAweDJBLCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDdDLCAweEIwLCAweDg0LCAweEEyLCAweERBLAorCSAweDRFLCAweDYxLCAweDc2LCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLAorCSAweDkwLCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweEQ5LCAweDgxLAorCSAweEEwLCAweDY0LCAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweEQ5LCAweDgxLAorCSAweEI2LCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LAorCSAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLAorCSAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LAorCSAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLAorCSAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LAorCSAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LAorCSAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDBELCAweDAwLCAweDQzLCAweDRCLAorCSAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDYxLCAweDlELCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERBLCAweEFCLCAweDQ2LAorCSAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDAwLCAweDY0LCAweDQwLCAweDQxLCAweDRBLCAweDY0LCAweEEwLCAweEQyLCAweEZGLCAweEZGLCAweDQwLCAweDQyLCAweDgwLCAweDJCLCAweDA0LCAweDAwLAorCSAweEZGLCAweEI0LCAweDQwLCAweDQyLCAweDAxLCAweDY0LCAweDQwLCAweDQxLCAweEE2LCAweEYzLCAweDQ2LCAweDRCLCAweDYwLCAweDQ2LCAweDIwLCAweDYzLAorCSAweEUzLCAweDgzLCAweEFCLCAweDQ2LCAweDMyLCAweEYwLCAweEFCLCAweDQ2LCAweDU5LCAweEY4LCAweEFCLCAweDQ2LCAweDMzLCAweEYwLCAweEFCLCAweDQ2LAorCSAweDVBLCAweEY4LCAweEFCLCAweDQ2LCAweDM0LCAweEYwLCAweEFCLCAweDQ2LCAweDVCLCAweEY4LCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEYxLCAweDFGLAorCSAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEFCLCAweDQ2LCAweDBDLCAweDYwLCAweDM4LCAweDY1LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDgxLCAweEM5LCAweDgxLCAweDRBLCAweDY0LCAweDBFLCAweDYzLAorCSAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweEFCLCAweDQ2LCAweEYwLCAweEExLAorCSAweDc2LCAweDY0LCAweDBFLCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIyLCAweDQ0LCAweEZGLCAweEI0LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEM0LCAweDg0LCAweDBDLCAweDYwLCAweDgwLCAweDY1LCAweEM0LCAweDgxLCAweDVBLCAweDY0LCAweDA0LCAweDYzLAorCSAweDU4LCAweEQwLCAweDU5LCAweEQ5LCAweEZELCAweDFGLCAweEFCLCAweDQ2LCAweDIxLCAweDQ0LCAweDAxLCAweDJBLCAweDA2LCAweDAwLCAweEZBLCAweEExLAorCSAweDkwLCAweDY0LCAweDA0LCAweDYzLCAweDU5LCAweEQxLCAweDU4LCAweEQ4LCAweEZELCAweDFGLCAweDNCLCAweEYwLCAweDIxLCAweDQ0LCAweDAxLCAweDJBLAorCSAweDEzLCAweDAwLCAweDIyLCAweDQ0LCAweDNELCAweEZCLCAweDYwLCAweDQxLCAweDAyLCAweEZFLCAweEY4LCAweDg0LCAweEY4LCAweDg0LCAweEY4LCAweDg0LAorCSAweDNDLCAweEZCLCAweDBDLCAweDYwLCAweDdDLCAweDYzLCAweDg4LCAweEZGLCAweENELCAweDgxLCAweDA2LCAweEEzLCAweEZELCAweDBELCAweDhELCAweEZGLAorCSAweDNCLCAweEZELCAweDY0LCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDVDLCAweDIyLCAweDQzLCAweDgwLCAweDYxLCAweDg4LCAweEZGLCAweENGLCAweDgzLAorCSAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLCAweEIxLCAweDg0LCAweDNCLCAweEZBLCAweDFGLCAweDYzLAorCSAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweDNCLCAweEYwLCAweDY2LCAweDQ0LCAweEIxLCAweDlDLCAweDNCLCAweEY4LCAweDAyLCAweEE2LAorCSAweEZBLCAweDFGLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDIzLCAweEYyLCAweDI1LCAweEYwLAorCSAweDAyLCAweEE4LCAweDAwLCAweDY3LCAweDIyLCAweDAyLCAweDNELCAweEYxLCAweDY0LCAweDQ0LCAweDAzLCAweEI0LCAweDQwLCAweDQyLCAweEQwLCAweDgwLAorCSAweEE2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQ2LCAweEJCLCAweEY0LCAweDgwLCAweDYxLCAweDAyLCAweDAyLCAweEUzLCAweDgzLCAweEVCLCAweDgzLAorCSAweDIyLCAweDQ0LCAweDg4LCAweEZGLCAweENDLCAweDg0LCAweEUxLCAweDgxLCAweEZELCAweDBELCAweDhELCAweEZGLCAweDYxLCAweDQ3LCAweDMxLCAweDkxLAorCSAweDlELCAweDg1LCAweEE3LCAweDgzLCAweDNCLCAweEZDLCAweDFGLCAweDYzLCAweEUzLCAweDgzLCAweDY2LCAweDQ0LCAweDAyLCAweEE2LCAweEJCLCAweEYyLAorCSAweDY2LCAweDQ0LCAweEE1LCAweDgxLCAweEJCLCAweEZBLCAweDAyLCAweEE2LCAweEZBLCAweDFGLCAweDAwLCAweDY3LCAweDIzLCAweDU4LCAweEZGLCAweEZGLAorCSAweDI3LCAweEYyLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLAorCSAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLAorCSAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLAorCSAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLAorCSAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDIxLCAweDAwLAorCSAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDNCLCAweEYyLCAweDgwLCAweDYwLCAweDMwLCAweDdDLCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDRFLCAweDYxLAorCSAweDc2LCAweDY0LCAweDBFLCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDkwLCAweDY0LAorCSAweDA0LCAweDYzLCAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweEEwLCAweDY0LCAweDA0LCAweDYzLAorCSAweEFCLCAweDQ2LCAweDU5LCAweEQwLCAweEFCLCAweDQ2LCAweDU4LCAweEQ4LCAweEZCLCAweDFGLCAweDAwLCAweDY3LCAweDAwLCAweDYxLCAweDIzLCAweDU4LAorCSAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEYyLCAweDFELCAweDYwLCAweEMwLCAweDY1LAorCSAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LCAweDYwLCAweDQzLCAweDA1LCAweEYyLAorCSAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDI3LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLCAweDBDLCAweDAyLCAweDYxLCAweDQ2LAorCSAweDI2LCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LCAweDI1LCAweEYwLCAweDYzLCAweDQ2LAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LCAweEU4LCAweDFCLCAweEE2LCAweEYzLAorCSAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDAxLCAweDAzLCAweDBELCAweDAwLCAweDQzLCAweDRCLCAweEFCLCAweDQ2LCAweDNCLCAweEYyLAorCSAweDgwLCAweDYwLCAweDMwLCAweDYxLCAweDlELCAweDg1LCAweEE0LCAweDg0LCAweEEyLCAweERBLCAweEFCLCAweDQ2LCAweDAwLCAweDY3LCAweDAwLCAweDYxLAorCSAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweDAxLCAweDY3LCAweDIwLCAweDYxLCAweDIzLCAweDU4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDQ2LCAweDQ1LAorCSAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweDAwLCAweEY0LCAweDAxLCAweEYyLCAweDY2LCAweDVDLCAweDI1LCAweDQ2LAorCSAweDU2LCAweDAyLCAweDcwLCAweDI3LCAweDU0LCAweDAwLCAweDEyLCAweDY0LCAweDAzLCAweEZBLCAweDA0LCAweEY4LCAweDBFLCAweEYyLCAweDg3LCAweEZDLAorCSAweDhELCAweEZDLCAweDhFLCAweEZDLCAweERBLCAweDgyLCAweDE2LCAweDYxLCAweDAwLCAweDYzLCAweEM5LCAweDgxLCAweDVBLCAweERDLCAweEZELCAweDAyLAorCSAweDYwLCAweDQwLCAweEYwLCAweDNCLCAweDE2LCAweDAwLCAweDMyLCAweDQ0LCAweEFDLCAweEYzLCAweDAxLCAweEIwLCAweEZBLCAweEEwLCAweDA4LCAweDI0LAorCSAweDJDLCAweDA1LCAweERDLCAweDgzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI2LCAweDYwLCAweDA0LCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LAorCSAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEFDLCAweEZELCAweDJCLCAweEZGLCAweEZFLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLAorCSAweDRGLCAweDAwLCAweEFELCAweEYzLCAweDA1LCAweDY1LCAweEQ0LCAweDgwLCAweERDLCAweDgzLCAweDE3LCAweDA1LCAweEFELCAweEZELCAweDk4LCAweEZFLAorCSAweDA0LCAweDA0LCAweDAwLCAweDdGLCAweDA4LCAweDdFLCAweDBFLCAweEZBLCAweDNCLCAweEZGLCAweDI1LCAweDYwLCAweEY4LCAweDY0LCAweDJCLCAweERCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweDBFLCAweEYyLCAweDJCLCAweEZGLCAweDYwLCAweDQwLCAweDA4LCAweDI2LAorCSAweEY3LCAweEZFLCAweEZELCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDMyLCAweDAwLCAweEE5LCAweEYzLCAweEZGLCAweEZGLCAweEQ4LCAweEEwLAorCSAweEZGLCAweEZGLCAweDBELCAweDA0LCAweDI2LCAweDYwLCAweDEwLCAweDY0LCAweDJCLCAweERCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEZDLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweDIxLCAweDAwLCAweDQ2LCAweDQ1LAorCSAweDAwLCAweDY0LCAweDJCLCAweERCLCAweDI1LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEEyLCAweEZGLCAweDAwLCAweEY0LCAweDAxLCAweEYwLCAweDBBLCAweDE4LCAweDcwLCAweDY3LCAweEEwLCAweDgwLCAweEYwLCAweDY3LCAweDA2LCAweDAzLAorCSAweEMwLCAweDg0LCAweDAxLCAweEZBLCAweDI1LCAweDQ2LCAweDI1LCAweDQ0LCAweDgwLCAweEZDLCAweDA1LCAweEZBLCAweEI2LCAweDYwLCAweDU4LCAweDRFLAorCSAweEY1LCAweDc4LCAweEZGLCAweEZGLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweEZGLCAweDY0LCAweDNCLCAweDQyLCAweDRBLCAweERCLCAweEQ0LCAweEZFLAorCSAweEEzLCAweEZGLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEZFLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDBELCAweDAwLAorCSAweDI1LCAweDYwLCAweEYyLCAweDY0LCAweDQwLCAweDQ3LCAweDU4LCAweDRGLCAweDE4LCAweDAwLCAweDI2LCAweDYwLCAweDBBLCAweDY0LCAweDQwLCAweDQ3LAorCSAweDU4LCAweDRGLCAweDAzLCAweDAwLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDBCLCAweDE4LAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDA4LCAweDAwLCAweDI2LCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLCAweDU4LCAweDRELAorCSAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweEYyLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDI3LCAweEQ1LCAweDBFLCAweEYyLCAweDE0LCAweDE4LAorCSAweDYwLCAweDQwLCAweDAxLCAweDJBLCAweDExLCAweDAwLCAweDAyLCAweEYwLCAweDA5LCAweDYwLCAweDA4LCAweDY0LCAweEQwLCAweDgwLCAweEEyLCAweEZGLAorCSAweEFELCAweEYzLCAweDAyLCAweDAyLCAweENDLCAweDg0LCAweEFELCAweEZCLCAweDI2LCAweDYwLCAweDIwLCAweDY0LCAweDQwLCAweDRCLCAweDM0LCAweDYwLAorCSAweDU4LCAweDRELCAweDA4LCAweDc4LCAweEZGLCAweEZGLCAweEU5LCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEZCLCAweDY0LCAweDNBLCAweDQyLAorCSAweDRBLCAweERCLCAweEEyLCAweEZGLCAweEIwLCAweEYzLCAweEFDLCAweEYzLCAweENDLCAweDgwLCAweEZELCAweEEwLCAweDAxLCAweDE0LCAweDFELCAweDA1LAorCSAweEI1LCAweDYwLCAweDU4LCAweDRELCAweEZBLCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDE3LCAweDAzLCAweEYwLCAweDY3LCAweDBFLCAweEZBLAorCSAweDI2LCAweDYwLCAweDA0LCAweDY0LCAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweEY2LCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLCAweEIwLCAweEYzLCAweEFDLCAweEYzLCAweENDLCAweDgzLAorCSAweERDLCAweDg0LCAweDAxLCAweDE1LCAweEIwLCAweEZELCAweEFDLCAweEZCLCAweEQ0LCAweEZFLCAweEFGLCAweEYzLCAweEFELCAweEYzLCAweDAwLCAweEE4LAorCSAweEFFLCAweEYxLCAweDAzLCAweDAyLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDI2LCAweDA1LCAweEI1LCAweDYwLCAweDU4LCAweDRELCAweEZBLCAweDc4LAorCSAweEZGLCAweEZGLCAweEEyLCAweEZGLCAweDIwLCAweDAzLCAweDAwLCAweDYzLCAweEFGLCAweEYzLCAweDBFLCAweEZDLCAweENDLCAweDg0LCAweEZGLCAweDNBLAorCSAweEFGLCAweEZCLCAweDk4LCAweEZFLCAweDAzLCAweDA0LCAweDA4LCAweEJCLCAweDBFLCAweEZDLCAweDNCLCAweEZGLCAweDI1LCAweDYwLCAweEY4LCAweDY0LAorCSAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweEY3LCAweDY0LCAweDNBLCAweDQyLCAweDRBLCAweERCLCAweEFELCAweEYzLCAweDBFLCAweEYyLCAweERDLCAweDgzLCAweDA4LCAweEIwLCAweEFELCAweEZELAorCSAweDA4LCAweDI4LCAweEY3LCAweEZFLCAweEQ0LCAweEZFLCAweEEzLCAweEZGLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweEI5LCAweEZFLAorCSAweDEzLCAweEZGLCAweDI0LCAweDQwLCAweDgwLCAweDJCLCAweDBCLCAweDAwLCAweEEyLCAweEZGLCAweDI1LCAweDQ2LCAweDA5LCAweEY0LCAweDBFLCAweEYyLAorCSAweDA1LCAweDE4LCAweDA4LCAweEJDLCAweDBFLCAweEZBLCAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweDAxLCAweDAwLCAweEQ4LCAweEZFLCAweEEzLCAweEZGLAorCSAweDI1LCAweDQ2LCAweDNFLCAweEYyLCAweDAwLCAweEY0LCAweDA4LCAweEYwLCAweDI1LCAweDQ2LCAweDA2LCAweEI0LCAweEZGLCAweDdGLCAweDEwLCAweEJDLAorCSAweDA2LCAweDI2LCAweEZELCAweDdGLCAweDBFLCAweEZBLCAweDNFLCAweEYyLCAweDNGLCAweEYyLCAweDYwLCAweDQxLCAweDA4LCAweDJBLCAweDY0LCAweDQ3LAorCSAweDNGLCAweEZBLCAweDYwLCAweDQ1LCAweEI5LCAweEZDLCAweDE2LCAweDYwLCAweEFBLCAweEYzLCAweEEzLCAweEZDLCAweEFCLCAweEZDLCAweDkxLCAweEZDLAorCSAweEQ0LCAweDgwLCAweDE4LCAweDYwLCAweDIxLCAweDY1LCAweEE1LCAweDgwLCAweDAxLCAweDA0LCAweDA3LCAweDAzLCAweDIzLCAweEYwLCAweDA4LCAweDY0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDM1LCAweDYwLCAweEVBLCAweDc4LCAweEZGLCAweEZGLCAweDM2LCAweDYwLCAweDU4LCAweDRGLCAweDMwLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBCLCAweDA0LCAweDIzLCAweEYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDJDLCAweDYwLCAweEVFLCAweDY0LAorCSAweEYxLCAweDYwLCAweDc4LCAweDQxLCAweEU0LCAweDc4LCAweEI1LCAweEYxLCAweDgzLCAweDAwLCAweERCLCAweEYzLCAweEE2LCAweEYxLCAweDA3LCAweEI0LAorCSAweDY0LCAweDQzLCAweEZELCAweEEwLCAweDJDLCAweEYyLCAweDcxLCAweDAyLCAweDAxLCAweEIwLCAweDY0LCAweDQzLCAweDc4LCAweDAyLCAweDJFLCAweEYyLAorCSAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY2LCAweDQxLCAweDYwLCAweDQ2LAorCSAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDE2LCAweDE4LCAweDYxLCAweDQ2LCAweDJFLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDA0LCAweEYyLAorCSAweDBDLCAweDAyLCAweDYxLCAweDQ2LCAweDJELCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweDAzLCAweEYyLCAweDA2LCAweDAyLCAweDYxLCAweDQ2LAorCSAweDJDLCAweEYwLCAweDYzLCAweDQ2LCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDgwLCAweEY0LCAweEZGLCAweEZGLCAweDYzLCAweDQ2LAorCSAweEU4LCAweDFCLCAweEE2LCAweEYzLCAweDA4LCAweEZFLCAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDUxLCAweDAzLCAweDYzLCAweDQ2LCAweDgwLCAweEY2LAorCSAweDI1LCAweDQ2LCAweDQzLCAweDE4LCAweDJFLCAweEYyLCAweDY2LCAweDQxLCAweDFELCAweDYwLCAweEMwLCAweDY1LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLAorCSAweEE2LCAweEYxLCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweDY0LCAweDQzLCAweDExLCAweDE4LCAweDYwLCAweDQ2LCAweDAwLCAweEYyLCAweEZGLCAweEZGLAorCSAweEZDLCAweDFCLCAweDY2LCAweDQ0LCAweDY0LCAweDQ2LCAweDgwLCAweEYwLCAweDYwLCAweDQ2LCAweDgwLCAweEY4LCAweDY1LCAweDQ2LCAweDY1LCAweDQzLAorCSAweDgwLCAweEYwLCAweDAxLCAweEZBLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LCAweDBCLCAweDAwLCAweDY0LCAweDQ2LCAweDYyLCAweDQzLAorCSAweDAwLCAweEYyLCAweEEzLCAweERCLCAweDYwLCAweDQ2LCAweDgwLCAweEYwLCAweDgxLCAweEZDLCAweDgwLCAweEZDLCAweDY0LCAweDQ2LCAweDgwLCAweEY4LAorCSAweDYwLCAweDQzLCAweDYxLCAweDQ2LCAweDQzLCAweDRCLCAweDJDLCAweEYwLCAweEFELCAweEYwLCAweDJFLCAweEYyLCAweEFCLCAweDQ2LCAweDAzLCAweEY4LAorCSAweDg0LCAweEY4LCAweDA1LCAweEZBLCAweDAzLCAweDY0LCAweDA2LCAweEZBLCAweEFCLCAweDQ2LCAweDFGLCAweDYwLCAweEMyLCAweDYxLCAweEExLCAweEQzLAorCSAweDIwLCAweDYwLCAweDA0LCAweDdDLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweEEwLCAweERELCAweERBLCAweDlDLCAweEExLCAweEQ5LAorCSAweDQ5LCAweEQzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweEExLCAweERCLCAweDBBLCAweDAwLCAweERCLCAweEYzLCAweDAyLCAweEEzLCAweEZFLCAweEEwLAorCSAweEY5LCAweEEwLCAweDAxLCAweDA2LCAweDA0LCAweDAyLCAweDIzLCAweEYwLCAweDA0LCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERBLCAweDA3LCAweEZDLAorCSAweDIzLCAweEYyLCAweEZGLCAweEZGLCAweDI0LCAweDFCLCAweDE2LCAweDYwLCAweEFCLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAwLCAweDNBLAorCSAweDBGLCAweDAwLCAweDI1LCAweDYwLCAweEM4LCAweDY0LCAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LAorCSAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEMxLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDFELCAweDAwLAorCSAweDI1LCAweDYwLCAweERBLCAweDY0LCAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLAorCSAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweEM4LCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDBFLCAweDAwLCAweDI1LCAweDYwLAorCSAweEVDLCAweDY0LCAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLAorCSAweDJCLCAweEZGLCAweDBFLCAweEYyLCAweENFLCAweEZFLCAweDEwLCAweEFDLCAweDBFLCAweEZBLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLAorCSAweENCLCAweDg0LCAweEM5LCAweDgzLCAweEZGLCAweEZGLCAweDA4LCAweDA0LCAweDU4LCAweEQxLCAweEE1LCAweEQ4LCAweERBLCAweDg1LCAweDgwLCAweDNBLAorCSAweDAyLCAweDAwLCAweDAwLCAweEY0LCAweDA0LCAweDY1LCAweEY4LCAweDFGLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDNFLCAweEYyLCAweEM5LCAweEYxLAorCSAweDA4LCAweEIwLCAweDE5LCAweEY4LCAweDU3LCAweDAyLCAweEVBLCAweEYxLCAweDJGLCAweEY4LCAweEVCLCAweEYzLCAweDMwLCAweEZBLCAweDYwLCAweDQ1LAorCSAweEVDLCAweEYzLCAweDMxLCAweEZBLCAweDQ2LCAweDRBLCAweDAwLCAweEY0LCAweDYwLCAweDQzLCAweDA1LCAweEYyLCAweDA2LCAweEYyLCAweEQwLCAweDgwLAorCSAweDA3LCAweEYwLCAweDA1LCAweDAyLCAweEQ0LCAweDgwLCAweEQzLCAweDgwLCAweDAyLCAweDAyLCAweERCLCAweEYzLCAweDAzLCAweDAzLCAweEFBLCAweDQ2LAorCSAweDQyLCAweEZFLCAweDQxLCAweDAwLCAweDYwLCAweDQwLCAweDAzLCAweDJBLCAweDIwLCAweDAwLCAweDAyLCAweEYyLCAweDAzLCAweEYwLCAweDA0LCAweEYyLAorCSAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDJDLCAweEZDLCAweDJELCAweEY4LCAweDJFLCAweEZBLCAweDdGLCAweEYxLCAweDMyLCAweEY4LCAweDgwLCAweEYxLAorCSAweDMzLCAweEY4LCAweDgxLCAweEYxLCAweDM0LCAweEY4LCAweDA4LCAweDY0LCAweDMyLCAweDQwLCAweDA0LCAweDJBLCAweDBELCAweDAwLCAweDJDLCAweEYwLAorCSAweDM5LCAweEYwLCAweDY0LCAweDQwLCAweDAxLCAweDI2LCAweDA4LCAweDAwLCAweDNFLCAweEYyLCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweEMwLCAweEI0LAorCSAweEU4LCAweDg0LCAweEIwLCAweDlDLCAweDM5LCAweEY4LCAweDg4LCAweDY0LCAweDFDLCAweDAwLCAweDAyLCAweEYyLCAweDAzLCAweEYwLCAweDA0LCAweEYyLAorCSAweDYwLCAweDQzLCAweEFBLCAweDQ2LCAweDMyLCAweEZDLCAweDMzLCAweEY4LCAweDM0LCAweEZBLCAweDdGLCAweEYxLCAweDJDLCAweEY4LCAweDgwLCAweEYxLAorCSAweDJELCAweEY4LCAweDgxLCAweEYxLCAweDJFLCAweEY4LCAweDAxLCAweDYwLCAweDA4LCAweDY0LCAweDMyLCAweDQwLCAweDA0LCAweDJBLCAweDA5LCAweDAwLAorCSAweDNFLCAweEYyLCAweDM5LCAweEYwLCAweDAwLCAweDYwLCAweEMwLCAweEI0LCAweEU4LCAweDg0LCAweEIwLCAweDlDLCAweDM5LCAweEY4LCAweDAxLCAweDYwLAorCSAweDg4LCAweDY0LCAweDJBLCAweEZBLCAweDAyLCAweEZFLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweDM2LCAweDYwLCAweDIyLCAweDYzLCAweDIwLCAweDQ0LAorCSAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LAorCSAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LAorCSAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LAorCSAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LCAweEJELCAweERCLCAweDFCLCAweDYwLAorCSAweDBCLCAweEZELCAweDM3LCAweDYwLCAweDQyLCAweDYzLCAweDFCLCAweDYwLCAweDBDLCAweEZELCAweDMwLCAweDQ0LCAweDFCLCAweDYwLCAweDBELCAweEZCLAorCSAweDMxLCAweDQ0LCAweDFCLCAweDYwLCAweDBFLCAweEZCLCAweDMyLCAweDQ0LCAweDFCLCAweDYwLCAweDBGLCAweEZCLCAweDMzLCAweDQ0LCAweDFCLCAweDYwLAorCSAweDEwLCAweEZCLCAweDgxLCAweEZGLCAweDkxLCAweEZGLCAweDU4LCAweDUxLCAweDQ0LCAweDAwLCAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDU4LCAweDUxLAorCSAweDQwLCAweDAwLCAweDgzLCAweEZGLCAweDkzLCAweEZGLCAweDU4LCAweDUxLCAweDNDLCAweDAwLCAweDg0LCAweEZGLCAweDk0LCAweEZGLCAweDU4LCAweDUxLAorCSAweDM4LCAweDAwLCAweDg1LCAweEZGLCAweDk1LCAweEZGLCAweDU4LCAweDUxLCAweDM0LCAweDAwLCAweDg2LCAweEZGLCAweDk2LCAweEZGLCAweDU4LCAweDUxLAorCSAweDMwLCAweDAwLCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDU4LCAweDUxLCAweDJDLCAweDAwLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDk5LCAweEZGLAorCSAweDFCLCAweDYwLCAweDBCLCAweEYxLCAweDMwLCAweDQ0LCAweDY0LCAweDQzLCAweEJELCAweERCLCAweDMxLCAweDQ0LCAweEJELCAweERCLCAweDMyLCAweDQ0LAorCSAweEJELCAweERCLCAweDMzLCAweDQ0LCAweEJELCAweERCLCAweDM0LCAweDQ0LCAweEJELCAweERCLCAweDM1LCAweDQ0LCAweEJELCAweERCLCAweDM2LCAweDQ0LAorCSAweEJELCAweERCLCAweDM3LCAweDQ0LCAweEJELCAweERCLCAweDM4LCAweDQ0LCAweEJELCAweERCLCAweDM5LCAweDQ0LCAweEJELCAweERCLCAweDNBLCAweDQ0LAorCSAweEJELCAweERCLCAweDNCLCAweDQ0LCAweEJELCAweERCLCAweDNDLCAweDQ0LCAweEJELCAweERCLCAweDNELCAweDQ0LCAweEJELCAweERCLCAweDNFLCAweDQ0LAorCSAweEJELCAweERCLCAweDNGLCAweDQ0LCAweEJELCAweERCLCAweEY2LCAweDYwLCAweDE2LCAweDY0LCAweDBBLCAweEZCLCAweDQwLCAweDIxLCAweEZFLCAweDAxLAorCSAweDc0LCAweDAwLCAweDQyLCAweDUwLCAweDQwLCAweDUzLCAweDFCLCAweDYwLCAweDBDLCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDMzLCAweDQ0LAorCSAweDMyLCAweDQyLCAweEEyLCAweERCLCAweERBLCAweDgyLCAweEEyLCAweERELCAweERBLCAweDgzLCAweDY1LCAweDQ0LCAweEJELCAweERCLCAweDYxLCAweDQ0LAorCSAweEJELCAweERCLCAweDY2LCAweDQ0LCAweEJELCAweERCLCAweEJELCAweEQ5LCAweDMwLCAweDQ0LCAweEJELCAweERCLCAweDk5LCAweEZGLCAweEE0LCAweDRDLAorCSAweEJELCAweERCLCAweEE1LCAweDRDLCAweEJELCAweERCLCAweEEwLCAweDRDLCAweEJELCAweERCLCAweEExLCAweDRDLCAweEJELCAweERCLCAweDk4LCAweEZGLAorCSAweDFCLCAweDYwLCAweDBDLCAweEZELCAweDFCLCAweDYwLCAweDBELCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDUwLCAweDFCLCAweDYwLCAweDBGLCAweEYzLAorCSAweEZGLCAweEZGLCAweDQwLCAweDUyLCAweDFCLCAweDYwLCAweDEwLCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDUzLCAweDMxLCAweDQxLCAweDFCLCAweDYwLAorCSAweDBFLCAweEYzLCAweEZGLCAweEZGLCAweDQwLCAweDUxLCAweDFCLCAweDYwLCAweDBCLCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQzLCAweDIwLCAweDQ0LAorCSAweEJELCAweERCLCAweDIxLCAweDQ0LCAweEJELCAweERCLCAweDIyLCAweDQ0LCAweEJELCAweERCLCAweDIzLCAweDQ0LCAweEJELCAweERCLCAweDI0LCAweDQ0LAorCSAweEJELCAweERCLCAweDI1LCAweDQ0LCAweEJELCAweERCLCAweDI2LCAweDQ0LCAweEJELCAweERCLCAweDI3LCAweDQ0LCAweEJELCAweERCLCAweDI4LCAweDQ0LAorCSAweEJELCAweERCLCAweDI5LCAweDQ0LCAweEJELCAweERCLCAweDJBLCAweDQ0LCAweEJELCAweERCLCAweDJCLCAweDQ0LCAweEJELCAweERCLCAweDJDLCAweDQ0LAorCSAweEJELCAweERCLCAweDJELCAweDQ0LCAweEJELCAweERCLCAweDJFLCAweDQ0LCAweEJELCAweERCLCAweDJGLCAweDQ0LCAweEJELCAweERCLCAweDFCLCAweDYwLAorCSAweDBCLCAweEZELCAweDYxLCAweDU4LCAweEZGLCAweEZGLCAweDJGLCAweDYwLCAweDRFLCAweDYzLCAweEEzLCAweEQzLCAweDMzLCAweDVDLCAweDAyLCAweEE0LAorCSAweEJELCAweERCLCAweEZFLCAweEI0LCAweEUwLCAweDg1LCAweEM0LCAweDg1LCAweDQ3LCAweEQ5LCAweDM0LCAweDQ0LCAweDVCLCAweERCLCAweDQ0LCAweEYzLAorCSAweDVCLCAweERCLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLCAweDg0LCAweEUxLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLAorCSAweEZGLCAweDAxLCAweDg2LCAweEUxLCAweDgwLCAweEZGLCAweDkwLCAweEZGLCAweDg4LCAweEZGLCAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDg3LCAweDNFLAorCSAweDE5LCAweDYwLCAweEY3LCAweEYzLCAweEZGLCAweEZGLCAweDEwLCAweDFCLCAweDMyLCAweDQwLCAweDgwLCAweDJBLCAweEY2LCAweDAxLCAweDlELCAweEZFLAorCSAweEY0LCAweDA1LCAweERCLCAweEYzLCAweEZGLCAweEZGLCAweDA0LCAweEE4LCAweDMzLCAweDYwLCAweEUyLCAweDYyLCAweDAxLCAweDAyLCAweEJELCAweDAwLAorCSAweEEyLCAweEQzLCAweEZGLCAweEZGLCAweDRBLCAweDFCLCAweEU5LCAweDAxLCAweDg3LCAweEZGLCAweDIwLCAweDQ0LCAweDgwLCAweEZGLCAweDYwLCAweDQwLAorCSAweDgwLCAweDI2LCAweEUzLCAweDAxLCAweEYxLCAweEZDLCAweEFELCAweDRGLCAweEZELCAweEI0LCAweEEwLCAweDVELCAweEMwLCAweDYwLCAweDQwLCAweEVDLAorCSAweEMwLCAweDYwLCAweDAwLCAweEVELCAweEMwLCAweDYwLCAweDgwLCAweEVFLCAweEFDLCAweDRGLCAweEJGLCAweEI0LCAweEEwLCAweDVDLCAweDE5LCAweDYwLAorCSAweDQ4LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDAyLCAweDI3LCAweDA2LCAweDAwLCAweDI4LCAweEUyLCAweDI0LCAweEUyLCAweDQwLCAweDIxLAorCSAweEZFLCAweDAxLCAweDc1LCAweDQwLCAweDBELCAweDAwLCAweDI4LCAweEUyLCAweDI0LCAweEUyLCAweDc1LCAweDQwLCAweDgwLCAweDJCLCAweEFCLCAweEZGLAorCSAweDE0LCAweEUwLCAweDk0LCAweEUwLCAweDQwLCAweDIxLCAweEZFLCAweDAxLCAweDEwLCAweEUwLCAweDc1LCAweDQwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCSAweDMzLCAweDYwLCAweEVFLCAweDYyLCAweEEyLCAweERGLCAweDAxLCAweDYwLCAweDM5LCAweEUyLCAweDA0LCAweDYwLCAweDAwLCAweDdBLCAweEFDLCAweDRGLAorCSAweDQwLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweDU5LCAweEVDLCAweEMwLCAweDYwLCAweDA3LCAweEVELCAweEMwLCAweDYwLAorCSAweDhGLCAweEVFLCAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDI2LCAweDYxLCAweENELCAweDgxLCAweEZGLCAweEZGLAorCSAweEZELCAweDAyLCAweEFFLCAweDRGLCAweEZCLCAweEI0LCAweEEwLCAweDVFLCAweEEwLCAweDAxLCAweEYxLCAweEZDLCAweEFELCAweDRGLCAweEZELCAweEI0LAorCSAweEEwLCAweDVELCAweDE1LCAweDYwLCAweDgwLCAweEU3LCAweEMwLCAweDYwLCAweDQwLCAweEVDLCAweEMwLCAweDYwLCAweDAwLCAweEVELCAweEFDLCAweDRGLAorCSAweEJGLCAweEI0LCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweDg0LCAweEVFLCAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLAorCSAweDAwLCAweDdBLCAweDBGLCAweDYwLCAweDE5LCAweEUyLCAweDBFLCAweDYwLCAweDM2LCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQxLCAweDc1LCAweDQ0LAorCSAweDgwLCAweDJCLCAweEFCLCAweEZGLCAweDgwLCAweDI3LCAweDA4LCAweDAwLCAweDE0LCAweEUwLCAweDk0LCAweEUwLCAweDM0LCAweEUyLCAweDYxLCAweDVBLAorCSAweDQ4LCAweDIxLCAweEZFLCAweDAxLCAweDAwLCAweEUwLCAweDc1LCAweDQwLCAweDBBLCAweDYwLCAweDE5LCAweEUyLCAweDAwLCAweDY0LCAweDE5LCAweDYwLAorCSAweEYxLCAweEZCLCAweDA4LCAweDYwLCAweDE1LCAweEYxLCAweDA4LCAweDYwLCAweDAwLCAweDY0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweENGLCAweEZFLAorCSAweDAxLCAweDY0LCAweDE5LCAweDYwLCAweEYyLCAweEZCLCAweEZGLCAweEZGLCAweDEwLCAweEUwLCAweDAxLCAweDYwLCAweDM0LCAweEUyLCAweEZGLCAweEZGLAorCSAweDA1LCAweDdBLCAweEFDLCAweDRGLCAweDQwLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweDU5LCAweEVDLCAweEMwLCAweDYwLAorCSAweDA3LCAweEVELCAweEMwLCAweDYwLCAweDhGLCAweEVFLCAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDFCLCAweDYwLAorCSAweEYzLCAweEYxLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLCAweDdELCAweEYxLCAweDAyLCAweEIxLCAweDA0LCAweDY1LAorCSAweDAyLCAweDAyLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDI2LCAweDYxLCAweENELCAweDgxLAorCSAweEZGLCAweEZGLCAweEZELCAweDAyLCAweEFFLCAweDRGLCAweEZCLCAweEI0LCAweEEwLCAweDVFLCAweDFCLCAweDYwLCAweEYzLCAweEYxLCAweEFELCAweDRGLAorCSAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLCAweDdELCAweEYxLCAweDAyLCAweEIxLCAweDA0LCAweDY1LCAweDAyLCAweDAyLCAweDY0LCAweDQwLAorCSAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDMwLCAweDAxLCAweDE5LCAweDYwLCAweEYzLCAweEYzLCAweEZGLCAweEZGLAorCSAweDAxLCAweDFCLCAweDJCLCAweDAxLCAweDMxLCAweDQ0LCAweDA0LCAweDJBLCAweDI4LCAweDAxLCAweDA4LCAweDI2LCAweDI2LCAweDAxLCAweDE5LCAweDYwLAorCSAweEY0LCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweDE4LCAweDIxLCAweDAxLCAweDdFLCAweEY1LCAweEYxLCAweEZDLCAweEFELCAweDRGLCAweEZELCAweEI0LAorCSAweEEwLCAweDVELCAweDE1LCAweDYwLCAweDgwLCAweEU3LCAweEMwLCAweDYwLCAweDQwLCAweEVDLCAweEMwLCAweDYwLCAweDAwLCAweEVELCAweEFDLCAweDRGLAorCSAweEJGLCAweEI0LCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweDg0LCAweEVFLCAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLAorCSAweDAwLCAweDdBLCAweDJELCAweDYwLCAweDVBLCAweDYzLCAweEEzLCAweEQxLCAweDA1LCAweDYwLCAweERDLCAweDY0LCAweEQwLCAweDgwLCAweDAwLCAweDY0LAorCSAweDAxLCAweDA2LCAweDAxLCAweDY0LCAweDQwLCAweDRFLCAweEIyLCAweEYxLCAweDY2LCAweDQxLCAweEUxLCAweDgxLCAweEUxLCAweDgxLCAweEUxLCAweDgxLAorCSAweEUxLCAweDgxLCAweDYxLCAweDQ2LCAweDczLCAweDQyLCAweDVBLCAweDkyLCAweDNGLCAweDY0LCAweEEwLCAweDg0LCAweDYwLCAweDQ3LCAweEUwLCAweDg0LAorCSAweEUwLCAweDg1LCAweDYyLCAweDQ3LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDNGLCAweEI0LCAweDYwLCAweDQxLCAweDY0LCAweDQ0LCAweDE0LCAweDkwLAorCSAweDNGLCAweDI2LCAweENDLCAweDg0LCAweDE0LCAweDkwLCAweDNGLCAweDI2LCAweENDLCAweDg0LCAweDYyLCAweDQxLCAweDYwLCAweDU1LCAweEIyLCAweEZCLAorCSAweDcyLCAweDVDLCAweDY3LCAweDQyLCAweEQyLCAweDgwLCAweEEyLCAweDQ4LCAweDIwLCAweDJCLCAweDA1LCAweDAwLCAweDAxLCAweDAyLCAweDdDLCAweDVDLAorCSAweDA0LCAweDYwLCAweDAwLCAweDY0LCAweEM0LCAweDg1LCAweEU4LCAweEUyLCAweEU0LCAweEUyLCAweDYxLCAweDQyLCAweDQ5LCAweDkxLCAweDY0LCAweDQ0LAorCSAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEI0LCAweDg0LCAweDYwLCAweDQ1LAorCSAweDUxLCAweDk0LCAweDA0LCAweDYwLCAweDAwLCAweDYxLCAweDAxLCAweDBELCAweDQ0LCAweDk0LCAweDYyLCAweDQxLCAweDE5LCAweDYwLCAweEY1LCAweEYxLAorCSAweDYxLCAweDQyLCAweDY0LCAweDQzLCAweENGLCAweDgzLCAweENGLCAweDgzLCAweDAzLCAweDAzLCAweEUzLCAweDgzLCAweDQ4LCAweDk0LCAweEZFLCAweDFGLAorCSAweDJFLCAweDQwLCAweDAxLCAweDI2LCAweEUwLCAweDg0LCAweDYwLCAweDQxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLAorCSAweDQ0LCAweDk0LCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweDU0LCAweDk0LCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweDQ0LCAweDk0LAorCSAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweEU5LCAweDgxLCAweDU0LCAweDk0LCAweDE5LCAweEUyLCAweDJFLCAweDQwLCAweDAxLCAweDI2LCAweEU4LCAweDg0LAorCSAweDI5LCAweDYxLCAweDU0LCAweDkxLCAweDYxLCAweDQzLCAweDExLCAweDA2LCAweDc1LCAweDQ0LCAweDgwLCAweDJCLCAweEFCLCAweEZGLCAweDgwLCAweDI3LAorCSAweDBDLCAweDAwLCAweDE0LCAweEUwLCAweDk0LCAweEUwLCAweDM0LCAweEUyLCAweDYxLCAweDVBLCAweDQ4LCAweDIxLCAweEZFLCAweDAxLCAweDAwLCAweEUwLAorCSAweDdBLCAweDQzLCAweDE1LCAweEExLCAweDc1LCAweDQwLCAweDgwLCAweDJCLCAweDA2LCAweEExLCAweDVELCAweDkxLCAweDYxLCAweDQ0LCAweDJFLCAweDQwLAorCSAweDAxLCAweDI2LCAweEUwLCAweDg0LCAweDYwLCAweDQzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweDg5LCAweEZGLCAweDEwLCAweEUwLAorCSAweDgwLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweDVDLCAweDk0LCAweEVCLCAweDgzLCAweDVDLCAweDk0LAorCSAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweEVCLCAweDgzLCAweDRDLCAweDk0LCAweDJFLCAweDQwLCAweDAxLCAweDI2LAorCSAweEU4LCAweDg0LCAweDYwLCAweDQzLCAweDY1LCAweDQxLCAweDYyLCAweDQ1LCAweEQ1LCAweDg1LCAweDA0LCAweDYwLCAweDAwLCAweDYxLCAweDAxLCAweDBELAorCSAweEM1LCAweDg1LCAweEM0LCAweDg0LCAweDYwLCAweDQzLCAweDYyLCAweDQxLCAweEUxLCAweDgxLCAweEUxLCAweDgxLCAweEUxLCAweDgxLCAweEUxLCAweDgxLAorCSAweEUxLCAweDgxLCAweEUxLCAweDlDLCAweDAwLCAweDYxLCAweERELCAweDgxLCAweDU4LCAweDk0LCAweDRBLCAweDkyLCAweEZDLCAweDA1LCAweDQxLCAweDRGLAorCSAweDAwLCAweDYxLCAweDYyLCAweDQ1LCAweDFDLCAweDYwLCAweDBBLCAweEYzLCAweEUzLCAweDgzLCAweEYxLCAweDgxLCAweEUzLCAweDgzLCAweEYxLCAweDgxLAorCSAweEUzLCAweDgzLCAweEYxLCAweDgxLCAweEUzLCAweDgzLCAweEYxLCAweDgxLCAweEUzLCAweDgzLCAweEYxLCAweDgxLCAweEUzLCAweDgzLCAweEYxLCAweDgxLAorCSAweEEwLCAweDUyLCAweEIyLCAweEYzLCAweEMzLCAweDlDLCAweDQ0LCAweDk0LCAweDAxLCAweDA0LCAweERDLCAweDg0LCAweDYwLCAweDU1LCAweEIyLCAweEZCLAorCSAweDY0LCAweDUyLCAweEU5LCAweEUyLCAweDY1LCAweDUzLCAweEIzLCAweEYzLCAweDA2LCAweDA0LCAweERDLCAweDg0LCAweEIzLCAweEZCLCAweEI0LCAweEYzLAorCSAweDAyLCAweDA0LCAweERDLCAweDg0LCAweEI0LCAweEZCLCAweDJGLCAweDQzLCAweENGLCAweDgzLCAweDZDLCAweEYzLCAweEZGLCAweEZGLCAweDVDLCAweDk0LAorCSAweEZGLCAweEZGLCAweDBDLCAweDI0LCAweDAxLCAweDY0LCAweDZDLCAweEZCLCAweDE2LCAweDYwLCAweEFDLCAweEYxLCAweEZGLCAweEZGLCAweDAzLCAweDFCLAorCSAweDMxLCAweDQwLCAweDAyLCAweDJBLCAweDA3LCAweDAwLCAweDczLCAweEYzLCAweEZGLCAweEZGLCAweDVDLCAweDk0LCAweEZGLCAweEZGLCAweDBDLCAweDI0LAorCSAweDAwLCAweDY0LCAweDczLCAweEZCLCAweDE5LCAweDYwLCAweEY1LCAweEYzLCAweDAxLCAweDdDLCAweDVDLCAweDk0LCAweDAwLCAweDM2LCAweDAxLCAweDY0LAorCSAweEEyLCAweERCLCAweDE5LCAweDYwLCAweEYyLCAweEY5LCAweDAxLCAweDYwLCAweDM0LCAweEUyLCAweDMyLCAweDdBLCAweEFDLCAweDRGLCAweDQwLCAweEJDLAorCSAweDAwLCAweDdGLCAweEEwLCAweDVDLCAweEMwLCAweDYwLCAweDU5LCAweEVDLCAweEMwLCAweDYwLCAweDA3LCAweEVELCAweEMwLCAweDYwLCAweDhGLCAweEVFLAorCSAweEFFLCAweDRGLCAweDA0LCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVFLCAweDBBLCAweDYxLCAweENELCAweDgxLCAweEZGLCAweEZGLCAweEZELCAweDAyLAorCSAweEFFLCAweDRGLCAweEZCLCAweEI0LCAweEEwLCAweDVFLCAweDFCLCAweDYwLCAweEYzLCAweEYxLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweEZBLCAweEI0LAorCSAweDY0LCAweDQxLCAweDdELCAweEYxLCAweDAyLCAweEIxLCAweDA0LCAweDY1LCAweDAyLCAweDAyLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDY1LAorCSAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDM3LCAweDYwLCAweDdGLCAweDc4LCAweEZGLCAweEZGLCAweDI0LCAweEUyLCAweDJELCAweEYzLCAweDJDLCAweEYzLAorCSAweDAwLCAweEJELCAweENDLCAweDg0LCAweDA4LCAweDAzLCAweDJDLCAweEZCLCAweDA2LCAweDAyLCAweDY1LCAweDQ0LCAweDJDLCAweEZCLCAweDhBLCAweEZGLAorCSAweDgwLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweDQ0LCAweEYzLCAweEZGLCAweEZGLCAweERDLCAweDg0LCAweDQ0LCAweEZCLCAweDJGLCAweDYwLAorCSAweDRBLCAweDY1LCAweDJGLCAweDYwLCAweDQ4LCAweDYxLCAweEE1LCAweEQzLCAweEExLCAweEQzLCAweDExLCAweDE4LCAweENDLCAweDg0LCAweEExLCAweERCLAorCSAweDBFLCAweDAyLCAweEE1LCAweEQzLCAweEExLCAweERCLCAweDE3LCAweDYwLCAweEE3LCAweEYzLCAweDE3LCAweDYwLCAweEE2LCAweEYxLCAweEEyLCAweERCLAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweDhBLCAweEZGLCAweDIwLCAweDYwLCAweDAwLCAweDc1LCAweDg4LCAweEZGLCAweEYxLCAweEYzLAorCSAweDMxLCAweDQwLCAweDAxLCAweDJBLCAweDNELCAweDAwLCAweDYwLCAweDQzLCAweDA0LCAweEIwLCAweDAyLCAweEIwLCAweDA4LCAweDI0LCAweDE2LCAweDAyLAorCSAweDEwLCAweEIwLCAweDI5LCAweDQ0LCAweDM0LCAweDAyLCAweDAwLCAweEE4LCAweENDLCAweDgxLCAweDBELCAweDAzLCAweDQxLCAweDQ5LCAweDJGLCAweDAyLAorCSAweDYzLCAweDQwLCAweDA4LCAweDJBLCAweDA4LCAweDAwLCAweEY3LCAweEIzLCAweDFCLCAweDYwLCAweEY2LCAweEYxLCAweEFELCAweDRGLCAweEZELCAweEI0LAorCSAweEEwLCAweDVELCAweDQ0LCAweDQ5LCAweDI0LCAweDAwLCAweDYzLCAweDQwLCAweDAyLCAweDJBLCAweDEwLCAweDAwLCAweDFCLCAweDYwLCAweEY3LCAweEYzLAorCSAweDFCLCAweDYwLCAweEY1LCAweEZCLCAweDQwLCAweDQ5LCAweDFCLCAweDYwLCAweEY4LCAweEYzLCAweDFCLCAweDYwLCAweEY2LCAweEZCLCAweDBDLCAweEJCLAorCSAweEZELCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweDExLCAweDAwLCAweDFCLCAweDYwLCAweEY5LCAweEYzLAorCSAweDM3LCAweDYwLCAweEVBLCAweDdDLCAweDBDLCAweDE4LCAweEE0LCAweERCLCAweDQwLCAweDQ5LCAweDFCLCAweDYwLCAweEZBLCAweEYzLCAweDFCLCAweDYwLAorCSAweEY2LCAweEZCLCAweDA4LCAweEJCLCAweEZCLCAweEIzLCAweEFELCAweDRGLCAweDAyLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVELCAweEYxLCAweEZELAorCSAweDAwLCAweDYwLCAweEE0LCAweEYzLCAweDYyLCAweDQzLCAweDE3LCAweDE4LCAweDU4LCAweEQzLCAweDYyLCAweDQxLCAweDAzLCAweDE4LCAweENDLCAweDg0LAorCSAweEExLCAweERCLCAweDExLCAweDAwLCAweDQ5LCAweEQzLCAweEEzLCAweERCLCAweDA2LCAweEExLCAweEExLCAweEQzLCAweDU5LCAweEQxLCAweDYwLCAweDQ1LAorCSAweEE1LCAweEQzLCAweDU5LCAweEQxLCAweEIwLCAweDg0LCAweEE1LCAweERCLCAweDY0LCAweDQ0LCAweDA2LCAweDM2LCAweENELCAweEZFLCAweDA3LCAweDM2LAorCSAweEQ2LCAweEZFLCAweEU2LCAweDAxLCAweDIzLCAweDQ2LCAweEI4LCAweDYwLCAweDAzLCAweDc4LCAweEZGLCAweEZGLCAweDQ2LCAweDQzLCAweDI2LCAweDYwLAorCSAweDNFLCAweDYxLCAweEExLCAweEQzLCAweDU5LCAweEQxLCAweDA2LCAweDFCLCAweDU5LCAweEQzLCAweDU5LCAweEQxLCAweDAzLCAweDFCLCAweDU5LCAweEQzLAorCSAweDU5LCAweEQxLCAweEYwLCAweDE4LCAweDAwLCAweDYzLCAweDQ5LCAweERELCAweDYwLCAweDQwLCAweDAyLCAweDM2LCAweDExLCAweDAwLCAweDAzLCAweDM2LAorCSAweDMyLCAweDAwLCAweDAxLCAweDM2LCAweDA4LCAweDAwLCAweDA1LCAweDNBLCAweEVBLCAweDAxLCAweEE0LCAweEQzLCAweDVBLCAweEQzLCAweDlDLCAweDg1LAorCSAweEE0LCAweDg0LCAweEEyLCAweERCLCAweEU0LCAweDAxLCAweDAxLCAweDYwLCAweDQ4LCAweDYxLCAweDAwLCAweDY0LCAweEExLCAweERCLCAweERGLCAweDAxLAorCSAweDNBLCAweDYwLCAweDNFLCAweDY0LCAweDQwLCAweDQ1LCAweDIyLCAweDAwLCAweDAxLCAweDYwLCAweDQ4LCAweDY2LCAweEE2LCAweEQzLCAweDA0LCAweEExLAorCSAweDYwLCAweDQzLCAweEExLCAweEQzLCAweEM5LCAweDgxLCAweDYwLCAweDQ1LCAweDAwLCAweEJCLCAweEExLCAweERCLCAweEJFLCAweEQzLCAweDA5LCAweDAzLAorCSAweEQ0LCAweDg0LCAweDlDLCAweDg0LCAweERDLCAweDg0LCAweEZGLCAweEZGLCAweDA0LCAweDBFLCAweEEzLCAweEQxLCAweDYzLCAweDQ2LCAweDY0LCAweDQzLAorCSAweEYyLCAweDAxLCAweDlDLCAweDg0LCAweERDLCAweDg1LCAweDQ5LCAweERELCAweDYxLCAweDQ0LCAweDAwLCAweEJCLCAweEE2LCAweERCLCAweDAyLCAweDAzLAorCSAweDY1LCAweDQ0LCAweEJFLCAweERCLCAweEJDLCAweDAxLCAweDNBLCAweDYwLCAweDE5LCAweDY0LCAweDQwLCAweDQ1LCAweDAxLCAweDYwLCAweDQ4LCAweDY2LAorCSAweEE2LCAweEQzLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDBGLCAweDE4LCAweDAyLCAweDAzLCAweDYwLCAweDQ2LCAweEY5LCAweDAxLCAweDU4LCAweEQzLAorCSAweEE0LCAweEQzLCAweDYwLCAweDQ1LCAweDAwLCAweDYzLCAweEE0LCAweERELCAweDA1LCAweDE4LCAweDU4LCAweEQzLCAweEZGLCAweEZGLCAweEM0LCAweDgzLAorCSAweEEyLCAweERELCAweENBLCAweDg0LCAweEE2LCAweERCLCAweDI1LCAweDU4LCAweDY0LCAweDQxLCAweDAwLCAweDYwLCAweDQ2LCAweDc0LCAweENELCAweEUyLAorCSAweDA0LCAweEUxLCAweDAyLCAweDYwLCAweDAwLCAweEUxLCAweDNGLCAweDQ0LCAweDQwLCAweDI2LCAweDA1LCAweDAwLCAweDFDLCAweDYwLCAweDBGLCAweEYzLAorCSAweDVBLCAweEQxLCAweEEwLCAweDUwLCAweEE0LCAweDUwLCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDAzLCAweDAwLCAweDNBLCAweDYwLCAweEI3LCAweDc4LAorCSAweEZGLCAweEZGLCAweDA0LCAweDI5LCAweEZFLCAweDAxLCAweEM0LCAweEUyLCAweDQzLCAweDY0LCAweDNBLCAweERCLCAweEExLCAweEYzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQxLCAweDNGLCAweDQ0LCAweEZGLCAweDAxLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA1LCAweDAwLCAweDFDLCAweDYwLCAweDBELCAweEYzLAorCSAweDVBLCAweEQxLCAweEEwLCAweDUwLCAweEE0LCAweDUyLCAweEM0LCAweEUyLCAweDMyLCAweDdCLCAweDRELCAweEUyLCAweEJGLCAweEZFLCAweEM0LCAweEUyLAorCSAweDQxLCAweEZGLCAweEUwLCAweEZFLCAweEUxLCAweEZFLCAweEUyLCAweEZFLCAweDQzLCAweEZGLCAweDQ0LCAweEZGLCAweDQ2LCAweEZGLCAweEEyLCAweEYzLAorCSAweDYyLCAweEZGLCAweDYwLCAweDQwLCAweDA1LCAweDM2LCAweDJELCAweEZGLCAweDA3LCAweDM2LCAweEQ1LCAweEZFLCAweDA4LCAweEUxLCAweDg4LCAweDYwLAorCSAweDg1LCAweDcxLCAweDhELCAweEUyLCAweEEyLCAweDYwLCAweDQxLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDYyLCAweDNELCAweDYwLAorCSAweDU4LCAweDRELCAweDNCLCAweDc4LCAweEZGLCAweEZGLCAweDY0LCAweDQxLCAweEE5LCAweDlDLCAweDYwLCAweDQ1LCAweDNELCAweDYwLCAweDU4LCAweDRELAorCSAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEYxLCAweDA5LCAweDYwLCAweEI0LCAweDYxLCAweDY0LCAweDQ0LCAweDAxLCAweDI3LCAweDI0LCAweDAwLAorCSAweDYwLCAweDQwLCAweDBFLCAweDNBLCAweDBELCAweDAwLCAweDAxLCAweDdDLCAweDE0LCAweDYwLCAweDZGLCAweEY5LCAweDQ0LCAweDYwLCAweDA4LCAweDdDLAorCSAweDE0LCAweDYwLCAweDQxLCAweEY5LCAweDE2LCAweDYwLCAweDYyLCAweEYxLCAweDAyLCAweDYwLCAweEIwLCAweDYxLCAweEIxLCAweDlDLCAweDI2LCAweDAwLAorCSAweDAwLCAweDdDLCAweDE0LCAweDYwLCAweDZGLCAweEY5LCAweDQwLCAweDYwLCAweDA4LCAweDdDLCAweDE0LCAweDYwLCAweDQxLCAweEY5LCAweDE2LCAweDYwLAorCSAweDYyLCAweEYxLCAweDAyLCAweDYwLCAweDkwLCAweDYxLCAweEIxLCAweDlDLCAweDA5LCAweDYwLCAweDY3LCAweDY1LCAweEZGLCAweEI0LCAweEM0LCAweDg1LAorCSAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEM0LCAweDgxLCAweDEyLCAweDAwLCAweEZGLCAweEI0LCAweEVELCAweEEwLCAweDJDLCAweDYwLCAweEM2LCAweDYxLAorCSAweDA0LCAweDA0LCAweEUyLCAweEEwLCAweEQ5LCAweDgxLCAweDAxLCAweDA0LCAweEQ5LCAweDgxLCAweEExLCAweEQxLCAweDAyLCAweDYwLCAweDUwLCAweDYxLAorCSAweDI2LCAweDYwLCAweEYwLCAweDY1LCAweEUwLCAweDg0LCAweDQ0LCAweEQzLCAweEIxLCAweDlDLCAweEM4LCAweDgxLCAweDYxLCAweDQ3LCAweDAwLCAweDdFLAorCSAweEU5LCAweDgxLCAweDA3LCAweDYwLCAweEYwLCAweDY1LCAweEE1LCAweDgxLCAweDBCLCAweEI5LCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEUwLCAweDg1LAorCSAweEI1LCAweDg1LCAweDA0LCAweDYwLCAweDQ0LCAweDYyLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEYzLAorCSAweEM4LCAweDYxLCAweDYxLCAweDU0LCAweENELCAweEUyLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDJFLCAweDAwLCAweENDLCAweDg0LCAweEUwLCAweDg1LAorCSAweDE1LCAweDYwLCAweEEyLCAweEU3LCAweDI2LCAweDYwLCAweDgwLCAweDY0LCAweDNELCAweDYwLCAweDU4LCAweDRGLCAweDA0LCAweDc4LCAweEZGLCAweEZGLAorCSAweDI2LCAweDYwLCAweDlDLCAweDY0LCAweDNELCAweDYwLCAweDU4LCAweDRGLCAweDA0LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDYwLCAweEI4LCAweDY0LAorCSAweDNELCAweDYwLCAweDU4LCAweDRGLCAweDA0LCAweDc4LCAweEZGLCAweEZGLCAweDI2LCAweDYwLCAweEQ0LCAweDY0LCAweDNELCAweDYwLCAweDU4LCAweDRGLAorCSAweDA0LCAweDc4LCAweEZGLCAweEZGLCAweDc1LCAweDY0LCAweDA2LCAweDYxLCAweDYxLCAweDQ4LCAweDYwLCAweDQ0LCAweDgwLCAweEJDLCAweEZGLCAweEI0LAorCSAweDYwLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDI4LCAweDYwLCAweEU2LCAweDdDLCAweDA3LCAweDYwLCAweEU4LCAweEY5LAorCSAweDI4LCAweDYwLCAweDZFLCAweDYzLCAweDE0LCAweDYxLCAweDIxLCAweDAwLCAweDE0LCAweDYwLCAweERGLCAweEYxLCAweEZGLCAweEI0LCAweEVELCAweEEwLAorCSAweDY0LCAweDQxLCAweDA0LCAweDA0LCAweEUyLCAweEEwLCAweEQ5LCAweDgxLCAweDAxLCAweDA0LCAweEQ5LCAweDgxLCAweEExLCAweEQxLCAweDE0LCAweDYwLAorCSAweDBFLCAweEYzLCAweDY0LCAweDQxLCAweEZGLCAweEIxLCAweEZGLCAweDYwLCAweDAwLCAweDY1LCAweEE0LCAweDg0LCAweDM0LCAweDk0LCAweEEyLCAweERCLAorCSAweDVBLCAweEQzLCAweDY0LCAweDQxLCAweEE1LCAweDgxLCAweEZGLCAweEI0LCAweDM0LCAweDk0LCAweEEyLCAweERCLCAweDI5LCAweDYwLCAweDUyLCAweDdDLAorCSAweDA3LCAweDYwLCAweEU4LCAweEY5LCAweDI3LCAweDYwLCAweEZDLCAweDYzLCAweDEzLCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LAorCSAweEZGLCAweEZGLCAweDA3LCAweDYwLCAweEU4LCAweEYzLCAweDMxLCAweDQwLCAweDgwLCAweDI2LCAweDM2LCAweEE0LCAweDA3LCAweDYwLCAweEU4LCAweEZCLAorCSAweDYwLCAweDQzLCAweDA5LCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweEExLCAweEYzLCAweDI5LCAweDYwLAorCSAweEJFLCAweDYxLCAweDAwLCAweDdDLCAweDdFLCAweDYzLCAweDU5LCAweEQ5LCAweEZFLCAweDFGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDAzLCAweDAwLAorCSAweDJBLCAweDYwLCAweDQwLCAweDY1LCAweDE1LCAweDAwLCAweEZGLCAweEI0LCAweEY5LCAweEEwLCAweDJBLCAweDYwLCAweDYyLCAweDY1LCAweDAxLCAweDdDLAorCSAweDBELCAweDA0LCAweEVELCAweEEwLCAweDJBLCAweDYwLCAweDg0LCAweDY1LCAweDExLCAweDdDLCAweDA4LCAweDA0LCAweEUyLCAweEEwLCAweDJBLCAweDYwLAorCSAweEE2LCAweDY1LCAweDIxLCAweDdDLCAweDAzLCAweDA0LCAweDJBLCAweDYwLCAweEM4LCAweDY1LCAweDMxLCAweDdDLCAweDY0LCAweDVGLCAweDdELCAweEZCLAorCSAweEE1LCAweEQzLCAweERBLCAweDg1LCAweEYwLCAweEEwLCAweDI5LCAweDYwLCAweEJFLCAweDYxLCAweDA4LCAweDA2LCAweDQwLCAweDU0LCAweDU4LCAweDUzLAorCSAweDA4LCAweEZGLCAweDM3LCAweDYwLCAweDdBLCAweDY0LCAweDQzLCAweEZCLCAweDA4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDQzLCAweDYwLCAweDQ2LAorCSAweEE1LCAweEQxLCAweERBLCAweDg1LCAweEE1LCAweEQzLCAweERBLCAweDg1LCAweDU5LCAweEQ5LCAweDU5LCAweERCLCAweDU5LCAweEQ5LCAweDU5LCAweERCLAorCSAweEZCLCAweDFGLCAweDBDLCAweDYzLCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweEE1LCAweEQzLCAweERBLCAweDg1LCAweDU5LCAweEQ5LCAweDU5LCAweERCLAorCSAweDU5LCAweEQ5LCAweDU5LCAweERCLCAweEY3LCAweDFGLCAweDY2LCAweDQ0LCAweDBFLCAweDYzLCAweDUzLCAweDkzLCAweDYwLCAweDQwLCAweDEwLCAweDM2LAorCSAweDA3LCAweDAwLCAweDY1LCAweDQ0LCAweDQ4LCAweEQzLCAweDU5LCAweEQ5LCAweDU5LCAweERCLCAweDU5LCAweEQ5LCAweDU5LCAweERCLCAweEZCLCAweDFGLAorCSAweDE2LCAweDYwLCAweDM5LCAweEYxLCAweDdELCAweEYzLCAweDY0LCAweDQzLCAweERCLCAweDgxLCAweDJDLCAweDYwLCAweDU0LCAweDY1LCAweDYwLCAweDQwLAorCSAweDAxLCAweDM3LCAweDEyLCAweDAwLCAweDExLCAweDM3LCAweDE3LCAweDAwLCAweDIxLCAweDM3LCAweDFELCAweDAwLCAweDMxLCAweDM3LCAweDIyLCAweDAwLAorCSAweEEzLCAweEQxLCAweDE2LCAweDYwLCAweDM0LCAweEY1LCAweDY0LCAweDQ0LCAweEZGLCAweEI0LCAweDE2LCAweDYwLCAweDMzLCAweEZCLCAweDY0LCAweDQ3LAorCSAweEZGLCAweEI0LCAweDE2LCAweDYwLCAweDJBLCAweEYxLCAweDFELCAweDAwLCAweEExLCAweEQzLCAweDE2LCAweDYwLCAweDM1LCAweEY1LCAweEZGLCAweEI0LAorCSAweDE2LCAweDYwLCAweDJCLCAweEYxLCAweDE2LCAweDAwLCAweEExLCAweEQzLCAweDE2LCAweDYwLCAweDM2LCAweEY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LAorCSAweDE2LCAweDYwLCAweDJDLCAweEYxLCAweDBFLCAweDAwLCAweDU5LCAweEQzLCAweDE2LCAweDYwLCAweDM3LCAweEY1LCAweEZGLCAweEI0LCAweDE2LCAweDYwLAorCSAweDJELCAweEYxLCAweDA3LCAweDAwLCAweDU5LCAweEQzLCAweDE2LCAweDYwLCAweDM4LCAweEY1LCAweDYwLCAweDQ3LCAweEZGLCAweEI0LCAweDE2LCAweDYwLAorCSAweDJFLCAweEYxLCAweDE2LCAweDYwLCAweDMyLCAweEZCLCAweDE2LCAweDYwLCAweDJGLCAweEY5LCAweDY2LCAweDQyLCAweEZDLCAweEEyLCAweEEyLCAweEQzLAorCSAweDJCLCAweDYwLCAweDQyLCAweDYzLCAweENDLCAweDg0LCAweEU4LCAweDg0LCAweENDLCAweDgxLCAweDYzLCAweDQ1LCAweEE2LCAweEQzLCAweERBLCAweDgyLAorCSAweEZGLCAweEI0LCAweEZGLCAweEZGLCAweDAzLCAweDAzLCAweDYwLCAweDQwLCAweDgwLCAweDJCLCAweDAzLCAweDAwLCAweERBLCAweDg2LCAweENELCAweDgxLAorCSAweEY1LCAweDAxLCAweDAwLCAweEI5LCAweEE2LCAweEQzLCAweDBCLCAweDAzLCAweDVBLCAweEQxLCAweERBLCAweDg2LCAweEZGLCAweEI0LCAweEUwLCAweDg0LAorCSAweEM0LCAweDg0LCAweDVDLCAweDkwLCAweEJELCAweEQ5LCAweEZELCAweDAyLCAweENELCAweDgxLCAweDY2LCAweDQyLCAweEYyLCAweDAyLCAweDVBLCAweEQzLAorCSAweDJCLCAweDYwLCAweDgwLCAweDY1LCAweEQ3LCAweDgwLCAweEJELCAweERCLCAweEZELCAweDAyLCAweDdELCAweEYzLCAweDE5LCAweDYwLCAweDdCLCAweEYxLAorCSAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA5LCAweDAwLCAweDY0LCAweDQwLCAweDEwLCAweDI2LCAweDA2LCAweDAwLCAweDEzLCAweDY0LCAweENCLCAweEZCLAorCSAweDAxLCAweDYwLCAweDY3LCAweDY0LCAweDM3LCAweEZCLCAweDA5LCAweDAwLCAweDA4LCAweDY0LCAweENCLCAweEZCLCAweEExLCAweEYzLCAweDAxLCAweDYwLAorCSAweDY3LCAweDdDLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDVCLCAweDdDLCAweDM3LCAweEY5LCAweDE5LCAweDYwLCAweDRELCAweEYxLCAweDdELCAweEYzLAorCSAweDY0LCAweDQwLCAweDAwLCAweDNBLCAweDFCLCAweDAwLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDBELCAweDAwLCAweDMyLCAweDYwLCAweEFCLCAweDYzLAorCSAweDRDLCAweDk0LCAweDBFLCAweEE1LCAweDYwLCAweEZFLCAweEEwLCAweEQxLCAweEE1LCAweEQzLCAweDE5LCAweDYwLCAweDcyLCAweEY5LCAweDE5LCAweDYwLAorCSAweDczLCAweEZCLCAweDIwLCAweEZFLCAweDBCLCAweDAwLCAweEZGLCAweEI0LCAweEY4LCAweEE0LCAweDMyLCAweDYwLCAweEM4LCAweDYzLCAweDRDLCAweDk0LAorCSAweDYwLCAweEZFLCAweEEwLCAweEQxLCAweEZGLCAweEZGLCAweDE5LCAweDYwLCAweDczLCAweEY5LCAweDIwLCAweEZFLCAweDE5LCAweDYwLCAweDc1LCAweEYzLAorCSAweDE2LCAweDYwLCAweEQ4LCAweEYxLCAweDYwLCAweDQzLCAweEQzLCAweDgwLCAweDE5LCAweDYwLCAweDc2LCAweEYzLCAweDAxLCAweDA3LCAweDYzLCAweDVDLAorCSAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA3LCAweDYwLCAweDVDLCAweDE5LCAweDYwLCAweDRGLCAweEY5LCAweDE5LCAweDYwLCAweDUzLCAweEY5LAorCSAweDdELCAweEYzLCAweEZGLCAweEZGLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDBBLCAweDAwLCAweEZGLCAweEI1LCAweDEwLCAweDYwLCAweEY0LCAweDYzLAorCSAweDY1LCAweDQxLCAweENELCAweDgxLCAweDA2LCAweEEzLCAweEZELCAweDAyLCAweEZBLCAweEEzLCAweEEzLCAweEQzLCAweDBGLCAweDAwLCAweDAxLCAweDYwLAorCSAweEZGLCAweDY1LCAweEE0LCAweDg0LCAweDExLCAweDYwLCAweDYwLCAweDYxLCAweEExLCAweEQxLCAweEZGLCAweEZGLCAweEQwLCAweDgwLCAweDA4LCAweEExLAorCSAweEZCLCAweDAyLCAweEZDLCAweEExLCAweEExLCAweEQzLCAweDE5LCAweDYwLCAweDRGLCAweEYxLCAweEZGLCAweEI0LCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDA0LCAweDA3LCAweDE5LCAweDYwLCAweDRGLCAweEZCLCAweDE5LCAweDYwLCAweDUzLCAweEZCLCAweDE5LCAweDYwLCAweDRGLCAweEYzLCAweDE5LCAweDYwLAorCSAweDcyLCAweEYxLCAweDE5LCAweDYwLCAweDc0LCAweEZCLCAweEQwLCAweDgwLCAweEZGLCAweEZGLCAweDAyLCAweDA0LCAweDE5LCAweDYwLCAweDc0LCAweEY5LAorCSAweDJDLCAweDYwLCAweDc0LCAweDYzLCAweDJCLCAweDYwLCAweDAyLCAweDY1LCAweDE2LCAweDYwLCAweDMzLCAweEYxLCAweDJBLCAweDYwLCAweEVBLCAweDYxLAorCSAweDJDLCAweDYwLCAweDYyLCAweDY0LCAweDQwLCAweDRGLCAweDA0LCAweDY0LCAweEMzLCAweDYwLCAweDU4LCAweDRELCAweDFBLCAweDc4LCAweEZGLCAweEZGLAorCSAweDE5LCAweDYwLCAweDRGLCAweEYzLCAweDE5LCAweDYwLCAweDczLCAweEYxLCAweDE5LCAweDYwLCAweDc0LCAweEZCLCAweEQwLCAweDgwLCAweEZGLCAweEZGLAorCSAweDAyLCAweDA0LCAweDE5LCAweDYwLCAweDc0LCAweEY5LCAweDJDLCAweDYwLCAweDdDLCAweDYzLCAweDE2LCAweDYwLCAweDMyLCAweEYxLCAweDJCLCAweDYwLAorCSAweDQyLCAweDY1LCAweDJDLCAweDYwLCAweDYwLCAweDY0LCAweDQwLCAweDRGLCAweDA4LCAweDY0LCAweEMzLCAweDYwLCAweDU4LCAweDRELCAweDFBLCAweDc4LAorCSAweEZGLCAweEZGLCAweDdELCAweEYzLCAweDA4LCAweDdDLCAweDM4LCAweEY5LCAweDJCLCAweDYwLCAweERBLCAweDYxLCAweDYwLCAweDQwLCAweDAxLCAweDJCLAorCSAweDBFLCAweDAwLCAweDAxLCAweDM3LCAweDA2LCAweDAwLCAweDExLCAweDM3LCAweDAzLCAweDAwLCAweDIxLCAweDNCLCAweDFFLCAweEExLCAweDFFLCAweEExLAorCSAweDFFLCAweEExLCAweDFDLCAweDYzLCAweDJCLCAweDYwLCAweEJDLCAweDY0LCAweDU5LCAweEQxLCAweDU4LCAweEQ5LCAweEZELCAweDFGLCAweDE2LCAweDYwLAorCSAweDJGLCAweEYzLCAweDAwLCAweDdDLCAweDYwLCAweDQ1LCAweDcwLCAweDYyLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLAorCSAweDA0LCAweDI5LCAweEZFLCAweDAxLCAweDAwLCAweDYwLCAweDEwLCAweDYyLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDNCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDAxLCAweDYxLCAweEIxLCAweDlDLCAweDYwLCAweDQ1LCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDNBLCAweDYwLAorCSAweDk1LCAweDc4LCAweEZGLCAweEZGLCAweDQ0LCAweEQzLCAweDgwLCAweDdDLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEIwLCAweDhBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDJGLCAweDU4LCAweEZGLCAweEZGLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweDYyLCAweDQ3LAorCSAweDgwLCAweEJGLCAweDYwLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY0LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LAorCSAweEZFLCAweDAxLCAweDY1LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDJELCAweDU4LAorCSAweEZGLCAweEZGLCAweDAwLCAweDdDLCAweEJELCAweEQzLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweDYwLCAweDQ3LCAweDgwLCAweEJGLCAweDYwLCAweDRBLAorCSAweEJELCAweEQzLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDkwLCAweDhBLCAweEJELCAweEQzLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDkwLCAweDhBLAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweENELCAweDgxLCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweEVCLCAweDAyLCAweDJELCAweDU4LAorCSAweEZGLCAweEZGLCAweEQ1LCAweDYwLCAweDg0LCAweEU3LCAweDYyLCAweDRBLCAweDAyLCAweDY0LCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweENDLCAweDg0LAorCSAweEZGLCAweEZGLCAweEZELCAweDAyLCAweDdDLCAweDQ5LCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY4LCAweDVDLCAweDdDLCAweDQ5LAorCSAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY4LCAweDQ0LCAweDk1LCAweDYwLCAweDg0LCAweEU3LCAweDJELCAweDU4LCAweEZGLCAweEZGLAorCSAweDQwLCAweEZGLCAweDIwLCAweDQ0LCAweEJGLCAweEI0LCAweDQwLCAweDQwLCAweDAzLCAweDAwLCAweDIwLCAweDQ0LCAweDQwLCAweEJDLCAweDQwLCAweDQwLAorCSAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDAyLCAweDAwLCAweDQzLCAweDQ1LCAweEY2LCAweDAxLCAweDAwLCAweDY0LAorCSAweDE5LCAweDYwLCAweEYyLCAweEZCLCAweDNGLCAweDQ0LCAweDQwLCAweDI2LCAweDA1LCAweDAwLCAweDFDLCAweDYwLCAweDBGLCAweEYzLCAweDVBLCAweEQxLAorCSAweEEwLCAweDUwLCAweEE0LCAweDUwLCAweEFFLCAweDRGLCAweEZELCAweEI0LCAweDA0LCAweEJDLCAweEEwLCAweDVFLCAweDAwLCAweDYwLCAweDAyLCAweDcxLAorCSAweDhELCAweEUyLCAweDQwLCAweEUxLCAweDQwLCAweDI5LCAweEZFLCAweDAxLCAweDA0LCAweEFDLCAweEEwLCAweDVFLCAweEZGLCAweEZGLCAweDAwLCAweDYwLAorCSAweDEwLCAweDYyLCAweDE5LCAweDYwLCAweDhFLCAweDdDLCAweDAwLCAweDYwLCAweEFDLCAweDY1LCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDYyLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDNCLCAweDc4LCAweEZGLCAweEZGLAorCSAweDYwLCAweDQwLCAweDE5LCAweDYwLCAweDhFLCAweDY0LCAweDY0LCAweDQwLCAweEQwLCAweDgwLCAweDE0LCAweDcxLCAweDA1LCAweDAzLCAweDhELCAweEUyLAorCSAweDQwLCAweEUxLCAweDQwLCAweDI5LCAweEZFLCAweDAxLCAweEUyLCAweDAxLCAweDNGLCAweDQ0LCAweDQwLCAweDI2LCAweDA1LCAweDAwLCAweDFDLCAweDYwLAorCSAweDBELCAweEYzLCAweDVBLCAweEQxLCAweEEwLCAweDUwLCAweEE0LCAweDUyLCAweDI3LCAweDYwLCAweDM2LCAweDYzLCAweDFFLCAweDYxLCAweDNELCAweDYwLAorCSAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDE0LCAweDcxLCAweDhELCAweEUyLCAweDQwLCAweEUxLCAweDQwLCAweDI5LAorCSAweEZFLCAweDAxLCAweDMxLCAweDQ0LCAweDQwLCAweDI2LCAweDAyLCAweDAwLCAweDgwLCAweDI2LCAweDE3LCAweDAwLCAweDI4LCAweDYwLCAweEU2LCAweDYzLAorCSAweDA3LCAweDYwLCAweEU4LCAweEZELCAweDA5LCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweDMxLCAweDQ0LAorCSAweDQwLCAweDJBLCAweDE0LCAweDAwLCAweDMxLCAweDQ0LCAweDdGLCAweEI0LCAweDQwLCAweDUxLCAweEFFLCAweDRDLCAweDEwLCAweDI2LCAweDBFLCAweDAwLAorCSAweDA3LCAweDYwLCAweEU5LCAweEZCLCAweDMxLCAweDQ0LCAweDgwLCAweEJDLCAweDQwLCAweDUxLCAweDI5LCAweDYwLCAweDFDLCAweDYzLCAweDA3LCAweDYwLAorCSAweEU4LCAweEZELCAweDA5LCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDYwLCAweEVBLCAweDYzLAorCSAweDAzLCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweDEwLCAweDYyLCAweDE5LCAweDYwLAorCSAweDhGLCAweDdDLCAweDAwLCAweDYwLCAweEFDLCAweDY1LCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDgwLCAweEUxLAorCSAweEJGLCAweEZFLCAweEExLCAweDRGLCAweDcwLCAweEI0LCAweDUwLCAweDM2LCAweDBDLCAweDAwLCAweDIwLCAweDM2LCAweDAzLCAweDAwLCAweDNBLCAweDYwLAorCSAweDc3LCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDYwLCAweDFBLCAweEUxLCAweERGLCAweEZFLCAweDE5LCAweEZGLCAweDAwLCAweEUxLCAweEExLCAweEZGLAorCSAweEZGLCAweEZGLCAweDIwLCAweDQ0LCAweDQwLCAweDJBLCAweDg1LCAweDAwLCAweDdELCAweEYxLCAweDNCLCAweDAwLCAweDgzLCAweDAwLCAweDE5LCAweDYwLAorCSAweEYyLCAweEYzLCAweEZGLCAweEZGLCAweDAxLCAweDE4LCAweDU5LCAweDAxLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLAorCSAweDFDLCAweDYwLCAweDBGLCAweEYzLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDAxLCAweDAwLCAweEEwLCAweDUwLCAweEFFLCAweDRGLCAweEZELCAweEI0LAorCSAweEEwLCAweDVFLCAweEFDLCAweDRGLCAweDEwLCAweEJDLCAweEEwLCAweDVDLCAweEZGLCAweEZGLCAweDEwLCAweEFDLCAweEEwLCAweDVDLCAweDAwLCAweDYwLAorCSAweEM4LCAweDcxLCAweDhELCAweEUyLCAweDQwLCAweEUxLCAweDQwLCAweDI5LCAweEZFLCAweDAxLCAweDdELCAweEYxLCAweDMwLCAweDYxLCAweDY0LCAweDQ0LAorCSAweDAxLCAweDJCLCAweDIwLCAweEExLCAweDMwLCAweDY0LCAweDYxLCAweDVGLCAweDYwLCAweDQ1LCAweDBDLCAweDYwLCAweDAwLCAweDYyLCAweDAwLCAweDYwLAorCSAweDcxLCAweDdDLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweDYwLCAweEM4LCAweDcxLCAweDhELCAweEUyLAorCSAweDQwLCAweEUxLCAweDQwLCAweDI5LCAweEZFLCAweDAxLCAweDAxLCAweDYwLCAweDA4LCAweEUxLCAweDdELCAweEYxLCAweDIwLCAweDQ0LCAweDQwLCAweEJDLAorCSAweDQwLCAweDQwLCAweDE5LCAweDYwLCAweEYyLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDE4LCAweDNELCAweDYwLCAweDU3LCAweDc4LCAweEZGLCAweEZGLAorCSAweDFCLCAweDYwLCAweEYzLCAweEYxLCAweEFELCAweDRGLCAweDAwLCAweDdGLCAweEZBLCAweEI0LCAweDY0LCAweDQxLCAweDdELCAweEYxLCAweDAyLCAweEIxLAorCSAweDA0LCAweDY1LCAweDAyLCAweDAyLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDAxLCAweDY1LCAweEI0LCAweDg0LCAweEEwLCAweDVELCAweDIwLCAweDQ0LAorCSAweDQwLCAweDJBLCAweDQzLCAweDQ1LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweEExLCAweEY5LCAweDA1LCAweDY0LCAweEEyLCAweEZCLCAweERGLCAweEZFLAorCSAweDE5LCAweEZGLCAweERELCAweEZFLCAweDI2LCAweDAwLCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDQzLCAweDQ1LCAweEE0LCAweEQxLAorCSAweERBLCAweDgzLCAweEMzLCAweDg1LCAweDgwLCAweEUxLCAweERGLCAweEZFLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ4LCAweDYwLCAweDQ3LAorCSAweDgwLCAweEJDLCAweDAwLCAweDdGLCAweDYwLCAweDRBLCAweEQ3LCAweDgwLCAweEExLCAweEZGLCAweEY2LCAweDAyLCAweEJGLCAweEZFLCAweDExLCAweDAwLAorCSAweDQzLCAweDQ1LCAweEE0LCAweEQxLCAweERBLCAweDgzLCAweDBELCAweDE4LCAweDY0LCAweDQ0LCAweDAwLCAweDYxLCAweEZBLCAweEE0LCAweERELCAweDgxLAorCSAweEZELCAweDAyLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweEJGLCAweEZFLCAweDAyLCAweDAwLCAweEYxLCAweEZFLAorCSAweDAxLCAweDAwLCAweDI1LCAweDQzLCAweDIxLCAweEUxLCAweDAwLCAweDY0LCAweEJGLCAweERCLCAweDIwLCAweDQ0LCAweDIwLCAweDJBLCAweDA3LCAweDAwLAorCSAweDA3LCAweEI0LCAweDA0LCAweDM2LCAweEMzLCAweEZFLCAweDA2LCAweDM2LCAweENDLCAweEZFLCAweDA3LCAweDM2LCAweEQ1LCAweEZFLCAweDIwLCAweDQ0LAorCSAweDk4LCAweEI0LCAweDQwLCAweDQwLCAweDI2LCAweDYwLCAweDI2LCAweDYzLCAweEJELCAweEQzLCAweDAzLCAweDYxLCAweDBGLCAweDFCLCAweDA0LCAweEEzLAorCSAweEJELCAweEQzLCAweDA0LCAweDYxLCAweDBCLCAweDFCLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDA2LCAweDYxLCAweDA3LCAweDFCLCAweDA0LCAweEEzLAorCSAweEJELCAweEQzLCAweDA3LCAweDYxLCAweDAzLCAweDFCLCAweEMzLCAweDYwLCAweDQ4LCAweDc4LCAweEZGLCAweEZGLCAweEEzLCAweEQxLCAweDQwLCAweDQ0LAorCSAweDIwLCAweDQ0LCAweDA3LCAweEI1LCAweEQ0LCAweDg1LCAweDM1LCAweDgwLCAweDI0LCAweDQ1LCAweDI2LCAweDYwLCAweDY2LCAweDY0LCAweDQ0LCAweEQ3LAorCSAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LCAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQzLCAweEJELCAweEQzLAorCSAweEJELCAweEQxLCAweDQwLCAweDQ0LCAweDEwLCAweDI3LCAweDE5LCAweDAwLCAweDNGLCAweDQwLCAweDAyLCAweDJCLCAweDA2LCAweDAwLCAweDI0LCAweDQ3LAorCSAweDA4LCAweDJCLCAweDEzLCAweDAwLCAweDA3LCAweEI0LCAweDAxLCAweDM2LCAweDExLCAweDAwLCAweEZGLCAweDYwLCAweDdGLCAweDY1LCAweDE1LCAweDYwLAorCSAweEEyLCAweDY0LCAweDI0LCAweDQwLCAweDA4LCAweDJCLCAweEE0LCAweDg0LCAweEEwLCAweDU3LCAweEZGLCAweEZGLCAweDY0LCAweDQ5LCAweEZGLCAweEZGLAorCSAweDY4LCAweDQ0LCAweDAxLCAweDE2LCAweEZELCAweDAxLCAweDAwLCAweDdGLCAweEEzLCAweERCLCAweEFCLCAweDAxLCAweDY0LCAweDQyLCAweDNELCAweDYwLAorCSAweDU4LCAweDRELCAweDNCLCAweDc4LCAweEZGLCAweEZGLCAweEJELCAweEQ5LCAweEEzLCAweERCLCAweEEzLCAweDAxLCAweDQzLCAweDQ1LCAweDIwLCAweDQ0LAorCSAweDIwLCAweEJDLCAweDQwLCAweDQwLCAweDY0LCAweDQzLCAweEJELCAweEQzLCAweEEzLCAweEQxLCAweDQwLCAweDQ0LCAweDEwLCAweDJCLCAweDE2LCAweDAwLAorCSAweEJFLCAweEQxLCAweEZGLCAweEZGLCAweDE1LCAweDYwLCAweDgwLCAweEU3LCAweDI0LCAweDQwLCAweDA3LCAweDI3LCAweDA0LCAweDAwLCAweEFDLCAweDRGLAorCSAweDEwLCAweEJDLCAweDAwLCAweDdGLCAweEEwLCAweDVDLCAweDY0LCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDI0LCAweDQwLAorCSAweDIwLCAweDI3LCAweDFELCAweDAwLCAweEFDLCAweDRGLCAweEVGLCAweEI0LCAweEEwLCAweDVDLCAweDE5LCAweDAwLCAweDNGLCAweDQwLCAweDAyLCAweDJCLAorCSAweDA2LCAweDAwLCAweDI0LCAweDQ3LCAweDA4LCAweDJCLCAweDEzLCAweDAwLCAweDA3LCAweEI0LCAweDAxLCAweDM2LCAweDExLCAweDAwLCAweDE1LCAweDYwLAorCSAweDIyLCAweDY0LCAweDI0LCAweDQwLCAweDA4LCAweDI3LCAweDgwLCAweEJDLCAweDdDLCAweDQ4LCAweEJFLCAweEQzLCAweEEwLCAweDU3LCAweDYwLCAweDQ4LAorCSAweDY0LCAweDQ0LCAweDgwLCAweEJDLCAweEZGLCAweEI0LCAweDYwLCAweDRBLCAweEZGLCAweEZGLCAweDAxLCAweDE2LCAweEZFLCAweDAxLCAweDY5LCAweDAxLAorCSAweDAxLCAweDYxLCAweDNELCAweDYwLCAweDU4LCAweDRELCAweDIzLCAweDc4LCAweEZGLCAweEZGLCAweDYzLCAweDAxLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LAorCSAweDAwLCAweEUxLCAweDA3LCAweDAyLCAweDYyLCAweEZGLCAweDYzLCAweEZGLCAweDY0LCAweEZGLCAweDY1LCAweEZGLCAweDY2LCAweEZGLCAweEJGLCAweEZFLAorCSAweEExLCAweEZGLCAweDgyLCAweEZGLCAweDg4LCAweEZGLCAweDZDLCAweDQwLCAweDQxLCAweEZGLCAweEM0LCAweEUyLCAweDQzLCAweEZGLCAweDVDLCAweDQ5LAorCSAweDA4LCAweEUxLCAweEEyLCAweDYwLCAweDQxLCAweDc4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAyLCAweDAyLAorCSAweEExLCAweEZGLCAweEZGLCAweEZGLCAweDgyLCAweEZGLCAweDg4LCAweEZGLCAweEE4LCAweEUyLCAweENCLCAweEYxLCAweDAwLCAweDZCLCAweDg5LCAweEZGLAorCSAweDY0LCAweDU0LCAweDg4LCAweEZGLCAweDlGLCAweEZFLCAweDAyLCAweDA1LCAweDY0LCAweDQ0LCAweDYwLCAweDU0LCAweENELCAweEUyLCAweEMyLCAweDY0LAorCSAweDNBLCAweERCLCAweEJDLCAweEZGLCAweEI1LCAweEZGLCAweDFELCAweEZGLCAweDI2LCAweDQ0LCAweDAyLCAweEI0LCAweDQwLCAweDQ2LCAweDNDLCAweDQ0LAorCSAweDAwLCAweEJDLCAweEZGLCAweEZGLCAweDA2LCAweDAzLCAweDI3LCAweDQwLCAweDI2LCAweDIyLCAweDAzLCAweDAwLCAweDAyLCAweDY0LCAweDMxLCAweEZCLAorCSAweEMwLCAweEZFLCAweDI3LCAweDQ0LCAweDIwLCAweDJBLCAweDA0LCAweDAwLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEIwLCAweDYwLCAweDAwLCAweEVBLAorCSAweDVDLCAweDQ0LCAweDI3LCAweDQ0LCAweDE4LCAweEI0LCAweDQwLCAweDQ3LCAweDAwLCAweEUxLCAweDI5LCAweDQwLCAweDUwLCAweDJCLCAweDM3LCAweDAwLAorCSAweEVGLCAweDYwLCAweEZGLCAweDY1LCAweDI5LCAweDQ0LCAweDI0LCAweDg5LCAweDMxLCAweDQwLCAweDA4LCAweDI2LCAweDBCLCAweDAwLCAweDIxLCAweDQ2LAorCSAweEE3LCAweEY0LCAweDFELCAweEYyLCAweEZGLCAweEIzLCAweDAwLCAweDdDLCAweDA1LCAweDAzLCAweDA2LCAweDYxLCAweDVELCAweDkxLCAweDA5LCAweDYwLAorCSAweDAyLCAweDY1LCAweDAyLCAweDAzLCAweDAwLCAweDYxLCAweDE1LCAweDAwLCAweEQ0LCAweDgwLCAweDYzLCAweDQ1LCAweEZCLCAweDA3LCAweDY1LCAweDQzLAorCSAweDgwLCAweDYwLCAweDAwLCAweDYyLCAweEY2LCAweDgyLCAweDUzLCAweDkwLCAweEUzLCAweDgzLCAweEZDLCAweDA0LCAweEVCLCAweDgzLCAweEVCLCAweDgzLAorCSAweEVBLCAweDgyLCAweDVDLCAweDk0LCAweEIyLCAweDlDLCAweEYzLCAweDA3LCAweDY0LCAweDQxLCAweERELCAweDgxLCAweEUxLCAweDgxLCAweEUxLCAweDgxLAorCSAweEUxLCAweDgxLCAweDJCLCAweDQ0LCAweDU0LCAweDkwLCAweDcwLCAweDQ1LCAweDAyLCAweDI4LCAweDYxLCAweDQ0LCAweEM0LCAweDg0LCAweEZGLCAweEZGLAorCSAweDA0LCAweDI0LCAweDAwLCAweEI0LCAweDYwLCAweDUwLCAweDA4LCAweDI4LCAweDAxLCAweDAwLCAweDIwLCAweDI5LCAweDZELCAweEUyLCAweEE0LCAweEUyLAorCSAweEM0LCAweEUyLCAweDQ3LCAweEZGLCAweEI2LCAweEZGLCAweEI3LCAweEZGLCAweEI0LCAweEZGLCAweDMyLCAweEYxLCAweDA4LCAweDI5LCAweDA5LCAweDAwLAorCSAweDY0LCAweDQwLCAweDA3LCAweDIyLCAweDA2LCAweDAwLCAweDQzLCAweEZGLCAweDI3LCAweDQ0LCAweDEwLCAweEJDLCAweDQwLCAweDQ3LCAweDAwLCAweDY0LAorCSAweDMyLCAweEZCLCAweDMxLCAweDQxLCAweDNDLCAweDQ0LCAweDAxLCAweEIxLCAweDAwLCAweEJDLCAweDBBLCAweDAyLCAweDA5LCAweDAzLCAweDMyLCAweEYzLAorCSAweDAwLCAweDdDLCAweDAxLCAweEI0LCAweEZGLCAweEZGLCAweDA0LCAweDAzLCAweDMyLCAweEY5LCAweDAyLCAweDY0LCAweDMxLCAweEZCLCAweEMwLCAweEZFLAorCSAweEM4LCAweDYwLCAweDA5LCAweDdELCAweDAwLCAweDYwLCAweDAwLCAweDZCLCAweDAwLCAweDY0LCAweDMzLCAweEZCLCAweDBDLCAweDYwLCAweDE2LCAweDY0LAorCSAweEEwLCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweEUxLCAweDMwLCAweDQwLCAweDAyLCAweDM2LCAweEExLCAweEZGLCAweDgzLCAweEZGLAorCSAweDhELCAweEZGLCAweDVDLCAweDQ0LCAweDVDLCAweDQzLCAweDVDLCAweDQyLCAweDVDLCAweDQxLCAweDVDLCAweDQwLCAweEFDLCAweEZGLCAweEFELCAweEZGLAorCSAweEU3LCAweEUxLCAweEIzLCAweDYwLCAweEZDLCAweDc4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAzLCAweDAyLAorCSAweDI4LCAweEUyLCAweDQwLCAweEZGLCAweEExLCAweEZGLCAweDg0LCAweEZGLCAweEMyLCAweDYwLCAweDQ1LCAweDY0LCAweDQwLCAweDQyLCAweEI3LCAweDYwLAorCSAweEY3LCAweDY0LCAweDQwLCAweDQwLCAweEJBLCAweEYzLCAweDdFLCAweEZCLCAweDBGLCAweDYwLCAweEUyLCAweDYzLCAweEM3LCAweEYzLCAweEJELCAweERCLAorCSAweDAwLCAweDYwLCAweDlBLCAweDY0LCAweEJELCAweERCLCAweDAyLCAweDY0LCAweEJELCAweERCLCAweDA0LCAweDY0LCAweEEzLCAweERCLCAweDVDLCAweDQ5LAorCSAweDBBLCAweDY0LCAweDQwLCAweDRCLCAweDVDLCAweDVDLCAweDAxLCAweDYwLCAweDM5LCAweEUyLCAweDA0LCAweDYwLCAweDAwLCAweDdBLCAweDg5LCAweEZGLAorCSAweDAzLCAweDYwLCAweEZGLCAweDczLCAweDg4LCAweEZGLCAweEI3LCAweDYwLCAweEY3LCAweDc4LCAweEZGLCAweEZGLCAweDMwLCAweDQ0LCAweDAyLCAweEE4LAorCSAweDAwLCAweEUxLCAweDA2LCAweDAyLCAweDQwLCAweEZGLCAweDQyLCAweEZGLCAweDQzLCAweEZGLCAweDQ0LCAweEZGLCAweDQ1LCAweEZGLCAweEExLCAweEZGLAorCSAweDg4LCAweEZGLCAweDg1LCAweEZGLCAweDIxLCAweEUxLCAweDVDLCAweDQwLCAweEMzLCAweDYwLCAweDQ4LCAweDc4LCAweEZGLCAweEZGLCAweEEyLCAweEZGLAorCSAweDMwLCAweDQ0LCAweDAyLCAweEE4LCAweDAwLCAweEUxLCAweDAxLCAweDAyLCAweEExLCAweEZGLCAweDg2LCAweEZGLCAweDg4LCAweEZGLCAweDVDLCAweDQ2LAorCSAweDVDLCAweDQ5LCAweDVDLCAweDQwLCAweEVGLCAweDYwLCAweDU4LCAweDRGLCAweDFCLCAweDc4LCAweEZGLCAweEZGLCAweDFELCAweDYwLCAweDU4LCAweDRGLAorCSAweDgxLCAweDc4LCAweEZGLCAweEZGLCAweEQzLCAweDYwLCAweDU4LCAweDRGLCAweDU4LCAweDc4LCAweEZGLCAweEZGLCAweEU3LCAweDYwLCAweDU4LCAweDRGLAorCSAweDk5LCAweDc4LCAweEZGLCAweEZGLCAweDIwLCAweDYwLCAweDU4LCAweDRGLCAweDE5LCAweDc4LCAweEZGLCAweEZGLCAweEY0LCAweDYwLCAweDU4LCAweDRGLAorCSAweEU5LCAweDc4LCAweEZGLCAweEZGLCAweEU5LCAweDYwLCAweDU4LCAweDRGLCAweENBLCAweDc4LCAweEZGLCAweEZGLCAweDI3LCAweDYwLCAweDU4LCAweDRGLAorCSAweDcxLCAweDc4LCAweEZGLCAweEZGLCAweEVFLCAweDYwLCAweDU4LCAweDRGLCAweDY5LCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweEUxLCAweEEzLCAweEZGLAorCSAweENBLCAweDYwLCAweEQ0LCAweDc4LCAweEZGLCAweEZGLCAweDAzLCAweEUxLCAweEEzLCAweEZGLCAweEZFLCAweEZDLCAweEZGLCAweEZDLCAweDI1LCAweDYwLAorCSAweDk2LCAweDYzLCAweDE3LCAweEZELCAweEFFLCAweEZGLCAweDJBLCAweDYwLCAweDFELCAweDc4LCAweEZGLCAweEZGLCAweDQyLCAweDZGLCAweDZGLCAweDc0LAorCSAweDYzLCAweDZGLCAweDY0LCAweDY1LCAweDIwLCAweDIxLCAweDIxLCAweDIwLCAweDIwLCAweDAwLCAweDUzLCAweDU0LCAweDQxLCAweDJGLCAweDQxLCAweDUwLAorCSAweDIwLCAweDQ2LCAweDc1LCAweDZFLCAweDYzLCAweDI3LCAweDczLCAweDAwLCAweDFGLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAwLCAweDI0LCAweDAwLAorCSAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDA0LCAweDAwLAorCSAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLCAweDA2LCAweDAwLCAweDA2LCAweDAwLCAweDA3LCAweDAwLAorCSAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAorCSAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDAwLCAweEE2LCAweEYzLCAweDIxLCAweDYxLCAweDAwLCAweDdDLCAweDAxLCAweDAwLCAweDAwLCAweEZBLAorCSAweDYwLCAweDQ2LCAweEZFLCAweDYzLCAweEEzLCAweEQ4LCAweEZFLCAweDFGLCAweENELCAweDgxLCAweEQ4LCAweDg0LCAweEY4LCAweDAyLCAweDIxLCAweDYxLAorCSAweDgwLCAweDY3LCAweDQwLCAweDRBLCAweEE2LCAweEY1LCAweDA1LCAweDE4LCAweDJBLCAweDQzLCAweDAyLCAweEZDLCAweDVGLCAweDhBLCAweDAwLCAweEY0LAorCSAweEZBLCAweDAxLCAweDJFLCAweDU4LCAweEZGLCAweEZGLCAweEE4LCAweEYxLCAweEE3LCAweEYzLCAweDdDLCAweDYzLCAweEFBLCAweEZCLCAweDYwLCAweDQ2LAorCSAweDAxLCAweEZDLCAweERDLCAweDg0LCAweEQwLCAweDgwLCAweDAwLCAweEZBLCAweEZBLCAweDA0LCAweEFCLCAweEZCLCAweDYwLCAweDQ2LCAweDAwLCAweDY0LAorCSAweDAwLCAweEZBLCAweDYzLCAweDQ0LCAweDgwLCAweDdGLCAweDAxLCAweEZBLCAweEE4LCAweEYzLCAweEE3LCAweEYxLCAweERDLCAweDg0LCAweEQwLCAweDg0LAorCSAweEE5LCAweEZCLCAweDAzLCAweDYwLCAweDI2LCAweDYxLCAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDY2LCAweDQ0LAorCSAweDJFLCAweEZCLCAweDgyLCAweEZGLCAweDQwLCAweDQyLCAweDg3LCAweEZGLCAweEE5LCAweEYzLCAweEIxLCAweEZCLCAweDAwLCAweDY0LCAweDQwLCAweDUwLAorCSAweDYzLCAweEZGLCAweDYwLCAweEZGLCAweDY2LCAweEZGLCAweDY1LCAweEZGLCAweDY0LCAweEZGLCAweDYxLCAweEZGLCAweDYyLCAweEZGLCAweDQ5LCAweDYwLAorCSAweDAyLCAweEUxLCAweDUyLCAweDYwLCAweDAyLCAweEUxLCAweDVDLCAweDYwLCAweDAyLCAweEUxLCAweDY1LCAweDYwLCAweDAyLCAweEUxLCAweDZCLCAweDYwLAorCSAweDAyLCAweEUxLCAweDc2LCAweDYwLCAweDAyLCAweEUxLCAweDQxLCAweDYwLCAweDAyLCAweEUxLCAweDBDLCAweDY0LCAweDEzLCAweDYwLCAweDFDLCAweEZCLAorCSAweDQxLCAweDYwLCAweDA3LCAweDY0LCAweDlGLCAweEZCLCAweDJELCAweEZGLCAweDA2LCAweDYxLCAweDQxLCAweDRCLCAweDA5LCAweDYwLCAweDA4LCAweDYxLAorCSAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweEYwLCAweDY3LCAweDBFLCAweEZBLCAweDI2LCAweDYwLCAweDA0LCAweDY0LAorCSAweDEzLCAweDYwLCAweDEwLCAweEZCLCAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLAorCSAweDJCLCAweDQxLCAweDRELCAweDhCLCAweEZGLCAweEZGLCAweEVBLCAweDAyLCAweDA1LCAweDYxLCAweDQxLCAweDRCLCAweDA5LCAweDYwLCAweDA4LCAweDYxLAorCSAweEI2LCAweDYwLCAweDU4LCAweDRELCAweDBGLCAweDc4LCAweEZGLCAweEZGLCAweDI1LCAweDYwLCAweEY4LCAweDY0LCAweDEzLCAweDYwLCAweDEwLCAweEZCLAorCSAweDY2LCAweDQ0LCAweDVBLCAweERCLCAweDAyLCAweDY0LCAweDVBLCAweERCLCAweEZGLCAweEZGLCAweDJCLCAweEZGLCAweDJCLCAweDQxLCAweDRELCAweDhCLAorCSAweEZGLCAweEZGLCAweEVDLCAweDAyLCAweDQwLCAweDYwLCAweDQ1LCAweDc4LCAweEZGLCAweEZGLCAweDAwLCAweEVBLCAweDAwLCAweEVCLCAweDUwLCAweDYwLAorCSAweDAzLCAweEVBLCAweDUxLCAweDYwLCAweDEzLCAweEVBLCAweDUyLCAweDYwLCAweDMwLCAweEVBLCAweDUzLCAweDYwLCAweDQwLCAweEVBLCAweDU0LCAweDYwLAorCSAweDUyLCAweEVBLCAweDU1LCAweDYwLCAweDZELCAweEVBLCAweDU2LCAweDYwLCAweDcxLCAweEVBLCAweDU3LCAweDYwLCAweDhCLCAweEVBLCAweDU4LCAweDYwLAorCSAweDQ3LCAweEVBLCAweDU5LCAweDYwLCAweEEwLCAweEVBLCAweDVBLCAweDYwLCAweEIyLCAweEVBLCAweDVCLCAweDYwLCAweEMxLCAweEVBLCAweDVDLCAweDYwLAorCSAweEQ3LCAweEVBLCAweDVELCAweDYwLCAweEVCLCAweEVBLCAweDVFLCAweDYwLCAweEEwLCAweEVBLCAweDUwLCAweDYwLCAweDM2LCAweEVCLCAweDUxLCAweDYwLAorCSAweDM3LCAweEVCLCAweDUyLCAweDYwLCAweDIwLCAweEVCLCAweDUzLCAweDYwLCAweEU0LCAweEVCLCAweDU0LCAweDYwLCAweDM0LCAweEVCLCAweDU1LCAweDYwLAorCSAweDU4LCAweEVCLCAweDU2LCAweDYwLCAweDQ4LCAweEVCLCAweDU3LCAweDYwLCAweEQwLCAweEVCLCAweDU4LCAweDYwLCAweEMzLCAweEVCLCAweDU5LCAweDYwLAorCSAweEZDLCAweEVCLCAweDVBLCAweDYwLCAweDM0LCAweEVCLCAweDVCLCAweDYwLCAweDU4LCAweEVCLCAweDVDLCAweDYwLCAweEMwLCAweEVCLCAweDVELCAweDYwLAorCSAweEQwLCAweEVCLCAweDVFLCAweDYwLCAweDkxLCAweEVCLCAweDAwLCAweEVBLCAweDAwLCAweEVCLCAweEUwLCAweDYwLCAweDAyLCAweEVBLCAweEUwLCAweDYwLAorCSAweDAzLCAweEVCLCAweEEwLCAweDYwLCAweDAwLCAweEVCLCAweEIwLCAweDYwLCAweDAwLCAweEVCLCAweEFCLCAweDQ4LCAweDQwLCAweDNCLCAweDAxLCAweDAwLAorCSAweEZDLCAweDAxLCAweDAwLCAweEVCLCAweDAzLCAweDYwLCAweDAyLCAweDY0LCAweEEwLCAweERCLCAweDBGLCAweDY0LCAweDYwLCAweDdGLCAweEEwLCAweDVBLAorCSAweDgwLCAweDYwLCAweDAwLCAweEVBLCAweEEwLCAweDYwLCAweDAwLCAweEVBLCAweEQxLCAweDYwLCAweDAwLCAweEVBLCAweDI0LCAweDQ0LCAweEZGLCAweEI0LAorCSAweDA0LCAweEZCLCAweDUwLCAweDYwLCAweDAwLCAweDY0LCAweDA1LCAweEZCLCAweDEwLCAweDYwLCAweDEwLCAweDc1LCAweDJBLCAweDYwLCAweDFELCAweDc4LAorCSAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDQwLCAweDAwLCAweDA1LCAweDYwLCAweEY5LCAweEYxLCAweDQyLCAweDYwLCAweDA4LCAweDY0LAorCSAweDA5LCAweDYwLCAweDE5LCAweDYzLCAweDY0LCAweDQwLCAweDAxLCAweDJCLCAweDA0LCAweDAwLCAweDQyLCAweDYwLCAweDA5LCAweDY0LCAweDBBLCAweDYwLAorCSAweDE5LCAweDYzLCAweDFDLCAweDYwLCAweDBGLCAweEZCLCAweDA0LCAweDYwLCAweDAwLCAweEJDLCAweDFDLCAweDYwLCAweDBCLCAweEZCLCAweDFDLCAweDYwLAorCSAweDBBLCAweEZELCAweDFELCAweDYwLCAweDE5LCAweDYzLCAweDFDLCAweDYwLCAweDBFLCAweEZELCAweDgwLCAweDYwLCAweDFDLCAweDY0LCAweDNGLCAweDQwLAorCSAweDAxLCAweDJBLCAweDAyLCAweDAwLCAweDYwLCAweDYwLCAweDFDLCAweDY0LCAweDFDLCAweDYwLCAweDEwLCAweEZCLCAweDFDLCAweDYwLCAweDBDLCAweEZCLAorCSAweDFDLCAweDYwLCAweDBGLCAweEYzLCAweEEwLCAweDUwLCAweEEwLCAweDUwLCAweDBCLCAweDYwLCAweEY4LCAweDYzLCAweEEzLCAweEQxLCAweDM4LCAweDYwLAorCSAweDEyLCAweDYxLCAweEExLCAweEQzLCAweEY4LCAweEEzLCAweDkwLCAweDg0LCAweEEyLCAweERCLCAweEEzLCAweEQxLCAweDU5LCAweEQzLCAweDA2LCAweEEzLAorCSAweDkwLCAweDg0LCAweEEyLCAweERCLCAweEEzLCAweEQxLCAweDU5LCAweEQzLCAweEZFLCAweEEzLCAweDkwLCAweDg0LCAweEEyLCAweERCLCAweEEzLCAweEQxLAorCSAweDU5LCAweEQzLCAweEZGLCAweEZGLCAweDkwLCAweDg0LCAweEEyLCAweERCLCAweDgwLCAweDYwLCAweDU4LCAweEVDLCAweDgwLCAweDYwLCAweDAwLCAweEVELAorCSAweDgwLCAweDYwLCAweDgwLCAweEVFLCAweDQwLCAweEVDLCAweDAwLCAweEVELCAweDAwLCAweEVFLCAweEMwLCAweDYwLCAweDU5LCAweEVDLCAweEMwLCAweDYwLAorCSAweDA3LCAweEVELCAweEMwLCAweDYwLCAweDhGLCAweEVFLCAweEFELCAweDRGLCAweEZBLCAweEI0LCAweEEwLCAweDVELCAweDAwLCAweEYzLCAweDI4LCAweEZCLAorCSAweDQwLCAweDQ0LCAweDM3LCAweDYwLCAweDdCLCAweDdDLCAweDIwLCAweEY5LCAweDNGLCAweDYwLCAweDE4LCAweDdDLCAweDIxLCAweEY5LCAweDNGLCAweDYwLAorCSAweDJFLCAweDdDLCAweDIyLCAweEY5LCAweDNGLCAweDYwLCAweEM1LCAweDdDLCAweDIzLCAweEY5LCAweDNGLCAweDYwLCAweEQ2LCAweDdDLCAweDI0LCAweEY5LAorCSAweDQwLCAweDYwLCAweDAwLCAweDdDLCAweDI1LCAweEY5LCAweDQwLCAweDYwLCAweDExLCAweDdDLCAweDI2LCAweEY5LCAweEQwLCAweDYwLCAweDAwLCAweEU4LAorCSAweDI4LCAweEU4LCAweDQ0LCAweDYwLCAweDAxLCAweEU2LCAweDEwLCAweDY3LCAweDQwLCAweDUyLCAweDEwLCAweDYwLCAweDA0LCAweEU2LCAweDA4LCAweDYwLAorCSAweDA2LCAweDYzLCAweEZELCAweDYwLCAweDBDLCAweDY1LCAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDEwLCAweDE4LCAweEMzLCAweDgzLCAweEQ0LCAweDgwLAorCSAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEZBLCAweEEzLCAweEEzLCAweEQzLCAweDAyLCAweDYwLCAweDAwLCAweDY1LCAweEY5LCAweEEwLCAweEZDLCAweEEwLAorCSAweDBELCAweDA1LCAweDA0LCAweDA1LCAweDc4LCAweDQzLCAweDAyLCAweDYxLCAweDI5LCAweDYwLCAweEVBLCAweDc4LCAweDIxLCAweDYwLCAweDAwLCAweDY1LAorCSAweDNGLCAweDQzLCAweDIxLCAweDYwLCAweDAwLCAweDY1LCAweEMwLCAweDYwLCAweDhGLCAweEVFLCAweDA4LCAweDAwLCAweDAyLCAweDYwLCAweDAwLCAweDY1LAorCSAweDAwLCAweDYwLCAweDAwLCAweDY0LCAweDE4LCAweEZCLCAweDNGLCAweDQzLCAweDExLCAweDYwLCAweDEwLCAweEU2LCAweEI3LCAweDg0LCAweDQwLCAweDVGLAorCSAweDM3LCAweDYwLCAweEY4LCAweDYzLCAweDNGLCAweDQwLCAweDIwLCAweDI3LCAweDA2LCAweDAwLCAweDBGLCAweDYwLCAweEZGLCAweDY0LCAweEJELCAweERCLAorCSAweDBGLCAweDYwLCAweEYwLCAweDY0LCAweDAzLCAweDAwLCAweDBGLCAweDY0LCAweEJELCAweERCLCAweDAwLCAweDY0LCAweEEzLCAweERCLCAweDAwLCAweDYwLAorCSAweDMwLCAweEUyLCAweDAwLCAweDYwLCAweDUwLCAweEUyLCAweDAwLCAweDYwLCAweDc5LCAweEUyLCAweDAwLCAweDYwLCAweDkwLCAweEUyLCAweDAxLCAweDYwLAorCSAweEQwLCAweEUyLCAweDAxLCAweDYwLCAweEYwLCAweEUyLCAweDAxLCAweDYwLCAweEIwLCAweEUyLCAweDEzLCAweDY0LCAweENCLCAweEZCLCAweDAxLCAweDYwLAorCSAweDY3LCAweDY0LCAweDM3LCAweEZCLCAweDAwLCAweDYwLCAweDI4LCAweDY0LCAweDM2LCAweEZCLCAweDA5LCAweDYwLCAweDJBLCAweDY0LCAweEI2LCAweEZCLAorCSAweDgyLCAweEZGLCAweDkyLCAweEZGLCAweDVDLCAweDQxLCAweDVDLCAweDQ2LCAweDVDLCAweDQ3LCAweDAwLCAweEUxLCAweEEzLCAweDYwLCAweEY0LCAweDYzLAorCSAweDBDLCAweDYwLCAweDE2LCAweDY0LCAweEEwLCAweERELCAweDg3LCAweEZGLCAweDk3LCAweEZGLCAweDBDLCAweDYwLCAweDAyLCAweDY0LCAweDQwLCAweDVBLAorCSAweDA2LCAweEE0LCAweDQwLCAweDVCLCAweDVDLCAweDVFLCAweDE2LCAweDYwLCAweENGLCAweEYzLCAweDdELCAweEZCLCAweDNGLCAweDQwLCAweDAxLCAweDIyLAorCSAweDAzLCAweDAwLCAweDgwLCAweDYwLCAweDM3LCAweDdDLCAweDAyLCAweDAwLCAweDgwLCAweDYwLCAweDI3LCAweDdDLCAweDFBLCAweDYwLCAweDFGLCAweEY5LAorCSAweDAxLCAweDYwLCAweDA2LCAweDY0LCAweEE3LCAweEZCLCAweDAyLCAweDYwLCAweDdGLCAweDY0LCAweDAwLCAweDYwLCAweDQyLCAweDY1LCAweEQ0LCAweDg0LAorCSAweEE4LCAweEZCLCAweERDLCAweDg0LCAweEE2LCAweEZCLCAweDEyLCAweDYwLCAweEQ4LCAweEZCLCAweDQwLCAweDYwLCAweDU4LCAweDRFLCAweDdELCAweDc4LAorCSAweEZGLCAweEZGLCAweDNGLCAweDQwLCAweDQwLCAweDI2LCAweDA1LCAweDAwLCAweDFDLCAweDYwLCAweDBELCAweEYzLCAweDVBLCAweEQxLCAweEEwLCAweDUwLAorCSAweEE0LCAweDUyLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLCAweEEzLCAweEQzLCAweDAyLCAweEE4LAorCSAweEQ0LCAweDgwLCAweDIxLCAweDAyLCAweDIwLCAweDAyLCAweDE5LCAweDYwLCAweDQ4LCAweEYxLCAweEZGLCAweEZGLCAweDY0LCAweDQwLCAweDgwLCAweDI2LAorCSAweDFBLCAweDAwLCAweDA0LCAweEEzLCAweEZELCAweDYwLCAweDBELCAweDY1LCAweDVCLCAweEQzLCAweEJGLCAweEQxLCAweDE0LCAweDE4LCAweEMzLCAweDgzLAorCSAweEQ0LCAweDgwLCAweEMzLCAweDgzLCAweEY5LCAweDAyLCAweEJGLCAweEQzLCAweEFELCAweDQ5LCAweEZFLCAweEEwLCAweDAwLCAweDY0LCAweDBDLCAweDA0LAorCSAweDA4LCAweEIxLCAweDIwLCAweEJDLCAweDA4LCAweDI4LCAweDE4LCAweEJDLCAweDA3LCAweDdDLCAweDBFLCAweDYwLCAweERGLCAweEY5LCAweDA1LCAweDdDLAorCSAweDBFLCAweDYwLCAweERFLCAweEY5LCAweDAxLCAweDAwLCAweDAwLCAweDY0LCAweDBFLCAweDYwLCAweERELCAweEZCLCAweDQwLCAweDYwLCAweDk1LCAweDc4LAorCSAweEZGLCAweEZGLCAweDVDLCAweDUxLCAweDNGLCAweDQxLCAweEE1LCAweDRDLCAweDUwLCAweDM3LCAweDBCLCAweDAwLCAweDAxLCAweEI5LCAweDQxLCAweDVGLAorCSAweEI1LCAweDYwLCAweDU1LCAweEUwLCAweDA1LCAweDYwLCAweEY5LCAweEYxLCAweEMwLCAweDY3LCAweDkwLCAweDg0LCAweDNGLCAweDQwLCAweDAxLCAweDI2LAorCSAweEEwLCAweDUwLCAweDA2LCAweDYwLCAweDA4LCAweEYzLCAweDAxLCAweDYwLCAweDAxLCAweDY1LCAweDAxLCAweDYwLCAweDAyLCAweDdDLCAweEQ0LCAweDgwLAorCSAweEQwLCAweDgwLCAweDAxLCAweDAzLCAweDEwLCAweDAyLCAweDVBLCAweEQxLCAweDVBLCAweEQzLCAweDNDLCAweDYwLCAweDAwLCAweDY2LCAweEUwLCAweDg3LAorCSAweDQwLCAweDRBLCAweDgwLCAweDYwLCAweDlFLCAweDYxLCAweDY0LCAweDQ0LCAweEM4LCAweDg0LCAweDBDLCAweDYzLCAweEFBLCAweDQ2LCAweDU4LCAweEQwLAorCSAweEFBLCAweDQ2LCAweDU5LCAweEQ4LCAweEZCLCAweDFGLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEZBLCAweDYwLCAweDAwLCAweDY1LCAweEJELCAweEQzLAorCSAweEEzLCAweEQzLCAweDAyLCAweEE4LCAweEQ0LCAweDgwLCAweDA3LCAweDAyLCAweDA2LCAweDAyLCAweDhDLCAweDYwLCAweEJBLCAweDYxLCAweDNDLCAweDYwLAorCSAweDAwLCAweDY2LCAweDQxLCAweDRCLCAweDAzLCAweDAwLCAweDQ2LCAweDYwLCAweDNCLCAweDc4LCAweEZGLCAweEZGLCAweDJCLCAweDQxLCAweDhELCAweDYwLAorCSAweDAyLCAweDdDLCAweEQxLCAweDgwLCAweEExLCAweEQyLCAweDI1LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LAorCSAweEUwLCAweDg3LCAweDQwLCAweDRBLCAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLAorCSAweEJELCAweEQxLCAweEVDLCAweDE4LCAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLAorCSAweDY3LCAweDQ0LCAweEMwLCAweDg0LCAweEUwLCAweDg1LCAweDJDLCAweDQ0LCAweEQ0LCAweDgwLCAweDYzLCAweDQxLCAweDAxLCAweDA2LCAweDY1LCAweDQ0LAorCSAweEM4LCAweDgzLCAweEFBLCAweDQ2LCAweDU5LCAweEQxLCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZDLCAweDFGLCAweEFBLCAweDQ2LCAweDJCLCAweDQxLAorCSAweEQ1LCAweDAxLCAweDhELCAweDYwLCAweDAyLCAweDYxLCAweDQxLCAweDRCLCAweDJCLCAweDQxLCAweDhELCAweDYwLCAweDAyLCAweDdDLCAweEQxLCAweDgwLAorCSAweEExLCAweEQyLCAweDI3LCAweDA1LCAweDU5LCAweEQwLCAweDYwLCAweDQ1LCAweDU5LCAweEQyLCAweDQ0LCAweDQ3LCAweEUwLCAweDg3LCAweDQwLCAweDRBLAorCSAweDU5LCAweEQyLCAweDU5LCAweDhCLCAweDQwLCAweDRDLCAweDA4LCAweDYwLCAweDAwLCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLCAweEVDLCAweDE4LAorCSAweEQ0LCAweDgwLCAweEVBLCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweDA0LCAweEEzLCAweEEzLCAweEQxLAorCSAweDVBLCAweDg4LCAweDJDLCAweDQzLCAweEQzLCAweDgwLCAweEZGLCAweEZGLCAweDAxLCAweDA2LCAweDY0LCAweDQzLCAweENGLCAweDgzLCAweEFBLCAweDQ2LAorCSAweDYwLCAweEZFLCAweDI4LCAweEQxLCAweDVFLCAweDg4LCAweDI3LCAweEQ4LCAweDVBLCAweDg3LCAweEZCLCAweDFGLCAweDIwLCAweEZFLCAweEFBLCAweDQ2LAorCSAweEQzLCAweDAxLCAweDA3LCAweDYwLCAweEVDLCAweEYzLCAweDIwLCAweDYwLCAweDAwLCAweDdDLCAweDA4LCAweEIwLCAweDEwLCAweEIwLCAweDA1LCAweDAyLAorCSAweDA0LCAweDAzLCAweDA3LCAweDYwLCAweEVCLCAweEY5LCAweDA3LCAweDYwLCAweEVBLCAweEY5LCAweDAyLCAweEIwLCAweDA0LCAweEIwLCAweDBGLCAweDAyLAorCSAweDEzLCAweDYwLCAweEQyLCAweEYzLCAweDBDLCAweDAzLCAweDAyLCAweEJDLCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDY1LCAweEYzLCAweDE0LCAweDYwLAorCSAweDI5LCAweEYzLCAweDAyLCAweEJELCAweDAyLCAweEJDLCAweEEyLCAweERCLCAweDY1LCAweDQ0LCAweDE0LCAweDYwLCAweDY1LCAweEZCLCAweDA3LCAweDYwLAorCSAweEVDLCAweEYzLCAweDMxLCAweDQxLCAweDYwLCAweDQwLCAweDIwLCAweDJBLCAweDQwLCAweEI5LCAweDQwLCAweDI2LCAweDAzLCAweDAwLCAweDYwLCAweDQwLAorCSAweDAxLCAweDI2LCAweDgwLCAweEI5LCAweDQxLCAweDUxLCAweEZBLCAweDYwLCAweDNBLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDAzLCAweDAyLCAweDQ0LCAweDYwLCAweEFELCAweDc4LCAweEZGLCAweEZGLCAweDVCLCAweEQzLCAweEY4LCAweDYwLCAweDNGLCAweDY1LAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDE0LCAweDYwLCAweDc0LCAweEYzLCAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweEJELCAweEQzLCAweEZGLCAweEZGLAorCSAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDE0LCAweDYwLCAweDc3LCAweEYzLCAweEUwLCAweDlDLCAweEE0LCAweDg0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDI4LCAweDYwLAorCSAweEY0LCAweDYxLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEExLCAweEQzLAorCSAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEExLCAweERCLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweDU5LCAweEQzLCAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEExLCAweERCLCAweDE0LCAweDYwLCAweDdELCAweEYzLAorCSAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDgwLCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLAorCSAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDgzLCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweEEzLCAweEQzLAorCSAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDE0LCAweDYwLCAweDg2LCAweEYzLCAweEUwLCAweDlDLAorCSAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweDE0LCAweDYwLCAweDg5LCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLAorCSAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDhDLCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDAyLCAweEEzLCAweEEzLCAweEQzLAorCSAweEY4LCAweDYwLCAweDNGLCAweDY1LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDE0LCAweDYwLCAweDhGLCAweEYzLCAweEUwLCAweDlDLAorCSAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweEJELCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDE0LCAweDYwLCAweDkyLCAweEYzLAorCSAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweDI5LCAweDYwLCAweDJBLCAweDYxLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LAorCSAweEUwLCAweDg0LCAweEExLCAweEQzLCAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEExLCAweERCLCAweEEzLCAweEQzLCAweEZGLCAweEZGLAorCSAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDU5LCAweEQzLCAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEExLCAweERCLAorCSAweDE0LCAweDYwLCAweDk4LCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLAorCSAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDlCLCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDlFLCAweEYzLAorCSAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LAorCSAweEEyLCAweERCLCAweEEzLCAweEQzLCAweEZGLCAweEZGLCAweDYwLCAweDQ3LCAweDAwLCAweDdGLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweDE0LCAweDYwLAorCSAweEExLCAweEYzLCAweEUwLCAweDlDLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LAorCSAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEE0LCAweEYzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEE3LCAweEYzLCAweEZGLCAweEZGLAorCSAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweEE0LCAweDg0LCAweEIwLCAweDg0LCAweEEyLCAweERCLAorCSAweDAwLCAweDYwLCAweDZBLCAweDYzLCAweDI5LCAweDYwLCAweDUwLCAweDYxLCAweDI4LCAweDYwLCAweEU0LCAweDY0LCAweDU4LCAweEQxLCAweDU5LCAweEQ5LAorCSAweEZELCAweDFGLCAweDE0LCAweDYwLCAweEIwLCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLAorCSAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEI0LCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLAorCSAweEI2LCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEJELCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLAorCSAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEJGLCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweENCLCAweEYzLAorCSAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDVBLCAweEQzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLAorCSAweENGLCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEQxLCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLAorCSAweEEyLCAweERCLCAweDE0LCAweDYwLCAweEQ4LCAweEYzLCAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweDE0LCAweDYwLCAweERBLCAweEYzLAorCSAweEZGLCAweEZGLCAweDE4LCAweEFDLCAweEEyLCAweERCLCAweEZBLCAweDYwLCAweDJDLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDBFLCAweDAzLCAweDYzLCAweDQ1LCAweDJBLCAweDYwLCAweEVBLCAweDYzLCAweDA2LCAweDYxLCAweEE1LCAweEQxLCAweERBLCAweDg1LAorCSAweDY0LCAweDQ0LCAweDBGLCAweEI0LCAweEJELCAweERCLCAweDY0LCAweDQ3LCAweDBGLCAweEI0LCAweENELCAweDgxLCAweEJELCAweERCLCAweEY2LCAweDAyLAorCSAweEZBLCAweDYwLCAweDMwLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDE0LCAweDAzLCAweEJELCAweEQzLAorCSAweDYzLCAweDQ2LCAweDJCLCAweDYwLCAweDgyLCAweDYzLCAweDE1LCAweDYwLCAweEQwLCAweEZCLCAweERBLCAweDg1LCAweEJELCAweERCLCAweDBFLCAweDYxLAorCSAweEE2LCAweEQxLCAweERBLCAweDg2LCAweDY0LCAweDQ0LCAweEZGLCAweEI0LCAweEE1LCAweERCLCAweERBLCAweDg1LCAweDY0LCAweDQ3LCAweEZGLCAweEI0LAorCSAweENELCAweDgxLCAweEJELCAweERCLCAweEY1LCAweDAyLCAweEZBLCAweDYwLCAweDMxLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDIyLCAweDAzLCAweEJELCAweEQzLCAweDE1LCAweDYwLCAweEVFLCAweEZCLCAweDVBLCAweDgxLCAweDE1LCAweDYwLCAweEZELCAweEZCLAorCSAweDVBLCAweDgyLCAweDE2LCAweDYwLCAweDBDLCAweEZCLCAweDVBLCAweDgzLCAweDE2LCAweDYwLCAweDFCLCAweEZCLCAweDVBLCAweDg0LCAweDBFLCAweDYxLAorCSAweEJELCAweEQxLCAweEJELCAweEQ1LCAweDY0LCAweDQ0LCAweEZGLCAweEI0LCAweDIxLCAweERCLCAweDVBLCAweDgxLCAweDY0LCAweDQ3LCAweEZGLCAweEI0LAorCSAweDIyLCAweERCLCAweDVBLCAweDgyLCAweDY2LCAweDQ0LCAweEZGLCAweEI0LCAweDIzLCAweERCLCAweDVBLCAweDgzLCAweDY2LCAweDQ3LCAweEZGLCAweEI0LAorCSAweDI0LCAweERCLCAweENELCAweDgxLCAweDVBLCAweDg0LCAweEVDLCAweDAyLCAweEZBLCAweDYwLCAweDQ3LCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELAorCSAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDExLCAweDAzLCAweDYzLCAweDQ1LCAweDJDLCAweDYwLCAweDU0LCAweDYzLCAweEE1LCAweEQxLCAweERBLCAweDg1LAorCSAweEJELCAweEQ5LCAweDAyLCAweDYxLCAweEE1LCAweEQxLCAweERBLCAweDg1LCAweDY0LCAweDQ3LCAweDAwLCAweDdFLCAweEJELCAweERCLCAweDY0LCAweDQ0LAorCSAweDAwLCAweDdFLCAweENELCAweDgxLCAweEJELCAweERCLCAweEY2LCAweDAyLCAweEZBLCAweDYwLCAweDJFLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELAorCSAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDFGLCAweDAzLCAweDYzLCAweDQ2LCAweEZDLCAweEEzLCAweEEzLCAweEQzLCAweDJCLCAweDYwLCAweDAyLCAweDYzLAorCSAweENDLCAweDg0LCAweEU4LCAweDg0LCAweENDLCAweDgxLCAweDAwLCAweDM2LCAweDBELCAweDAwLCAweDYzLCAweDQ1LCAweEE2LCAweEQzLCAweDVBLCAweEQxLAorCSAweERBLCAweDg2LCAweEZGLCAweEI0LCAweEUwLCAweDg0LCAweEM0LCAweDg0LCAweDVDLCAweDkwLCAweEJELCAweEQ5LCAweEZELCAweDAyLCAweENELCAweDgxLAorCSAweDY2LCAweDQyLCAweEY0LCAweDAyLCAweDY2LCAweDQyLCAweDVBLCAweEQzLCAweDJCLCAweDYwLCAweDQyLCAweDY1LCAweEJELCAweERCLCAweEQ3LCAweDgwLAorCSAweEZGLCAweEZGLCAweEZDLCAweDAyLCAweDJDLCAweDYwLCAweDY4LCAweDYxLCAweEZBLCAweDYwLCAweDQ2LCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELAorCSAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweEExLCAweERELCAweEQ5LCAweDgxLCAweEZBLCAweDYwLCAweDJGLCAweDY1LCAweDQ2LCAweDYwLAorCSAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweEExLCAweERELCAweEQ5LCAweDgxLCAweEZBLCAweDYwLCAweDNFLCAweDY1LAorCSAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweEExLCAweERELCAweEQ5LCAweDgxLCAweEZBLCAweDYwLAorCSAweDNGLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweEExLCAweERELCAweEQ5LCAweDgxLAorCSAweEZBLCAweDYwLCAweDQwLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDAzLCAweEExLCAweERELAorCSAweEQ5LCAweDgxLCAweEZBLCAweDYwLCAweDNCLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDAxLCAweDAzLAorCSAweEExLCAweERELCAweEZBLCAweDYwLCAweDQ4LCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDEwLCAweDAzLAorCSAweEJELCAweEQzLCAweDJDLCAweDYwLCAweEM0LCAweDYxLCAweDBFLCAweEI0LCAweEJELCAweEQxLCAweEExLCAweERCLCAweDY0LCAweDQ3LCAweDBFLCAweEI0LAorCSAweEEzLCAweEQxLCAweDU5LCAweERCLCAweDY0LCAweDQ0LCAweDBFLCAweEI0LCAweDU5LCAweERCLCAweDY0LCAweDQ3LCAweDBFLCAweEI0LCAweDU5LCAweERCLAorCSAweEZBLCAweDYwLCAweDI5LCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDA0LCAweEEzLAorCSAweEEzLCAweEQzLCAweDIwLCAweDYwLCAweDAwLCAweDY1LCAweEI0LCAweDg0LCAweDEzLCAweDYwLCAweEE2LCAweEZCLCAweEZBLCAweDYwLCAweDJBLCAweDY1LAorCSAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDMwLCAweDAzLCAweDA0LCAweEEzLCAweEJELCAweEQxLCAweDE0LCAweDYwLAorCSAweDRBLCAweEYzLCAweDY0LCAweDQxLCAweDY0LCAweDVFLCAweEEyLCAweERCLCAweDY0LCAweDQ3LCAweDVBLCAweEQzLCAweDYwLCAweDVDLCAweDY0LCAweDVGLAorCSAweEEyLCAweERCLCAweDE0LCAweDYwLCAweDYwLCAweEYzLCAweEZGLCAweDYwLCAweEMwLCAweEI1LCAweDYxLCAweDQwLCAweDgwLCAweDI3LCAweDA1LCAweDAwLAorCSAweEU5LCAweDg3LCAweDNGLCAweEI0LCAweEI0LCAweDg0LCAweEEyLCAweERCLCAweDE1LCAweDAwLCAweDY1LCAweDQ0LCAweEEyLCAweERCLCAweEUxLCAweDgwLAorCSAweEY5LCAweDg3LCAweDAxLCAweDdGLCAweDE0LCAweDYwLCAweDYzLCAweEYzLCAweDYwLCAweDQxLCAweEUwLCAweDg0LCAweEUwLCAweDg0LCAweEU5LCAweDgxLAorCSAweEY4LCAweDg0LCAweEU5LCAweDgxLCAweEY4LCAweDg0LCAweEEyLCAweERCLCAweDRBLCAweEQzLCAweEZGLCAweDYwLCAweDgwLCAweDY1LCAweEE0LCAweDg0LAorCSAweDM0LCAweDk0LCAweEEyLCAweERCLCAweERCLCAweDgzLCAweDE0LCAweDYwLCAweERGLCAweEZELCAweEZBLCAweDYwLCAweDJCLCAweDY1LCAweDQ2LCAweDYwLAorCSAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDA3LCAweDAzLCAweDA0LCAweEEzLCAweEJELCAweEQzLCAweDE0LCAweDYwLCAweDRELCAweEZCLAorCSAweEEzLCAweEQzLCAweDE0LCAweDYwLCAweDExLCAweEZCLCAweEZBLCAweDYwLCAweDNDLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LAorCSAweEZGLCAweEZGLCAweDFGLCAweDAzLCAweEEzLCAweEQzLCAweEZDLCAweDYwLCAweEZDLCAweDY1LCAweEE0LCAweDg0LCAweDYwLCAweDVDLCAweDAwLCAweDdFLAorCSAweEMwLCAweDYwLCAweDAwLCAweEEwLCAweDYwLCAweDQzLCAweDA3LCAweDA0LCAweDE0LCAweDYwLCAweDUxLCAweEYzLCAweEZGLCAweEZGLCAweDAzLCAweDYwLAorCSAweEZGLCAweEI0LCAweDNDLCAweDk0LCAweEEyLCAweERCLCAweDI4LCAweDYwLCAweDJBLCAweDYxLCAweDY0LCAweDQ0LCAweDAwLCAweDdGLCAweEMwLCAweEEwLAorCSAweDYwLCAweDQ3LCAweDA3LCAweDA0LCAweDYwLCAweDQzLCAweEExLCAweEQzLCAweEZGLCAweEZGLCAweDAzLCAweDYwLCAweEZGLCAweEI0LCAweDNDLCAweDk0LAorCSAweEExLCAweERCLCAweEZBLCAweDYwLCAweDQ5LCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELCAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDFCLCAweDAzLAorCSAweDMyLCAweDYwLCAweEFCLCAweDYxLCAweDFDLCAweDdDLCAweDYwLCAweEZFLCAweEEzLCAweEQzLCAweDVELCAweEQzLCAweDBGLCAweEI1LCAweEQ0LCAweDg0LAorCSAweEExLCAweERCLCAweEJELCAweEQzLCAweEZGLCAweEZGLCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweEU4LCAweDg0LCAweDVELCAweEQzLAorCSAweDBGLCAweEI1LCAweEQ0LCAweDg0LCAweEExLCAweERCLCAweDY3LCAweDQ0LCAweEMwLCAweDlDLCAweDY0LCAweDQwLCAweDAwLCAweDM2LCAweDEwLCAweDAwLAorCSAweDY0LCAweDQwLCAweDBFLCAweDNBLCAweEU5LCAweDAxLCAweDIwLCAweEZFLCAweEZBLCAweDYwLCAweDRBLCAweDY1LCAweDQ2LCAweDYwLCAweDU4LCAweDRELAorCSAweDRFLCAweDc4LCAweEZGLCAweEZGLCAweDA1LCAweDAzLCAweDMyLCAweDYwLCAweEM3LCAweDYxLCAweDBFLCAweDdDLCAweDYwLCAweEZFLCAweERDLCAweDAxLAorCSAweDIwLCAweEZFLCAweEI4LCAweEZFLCAweEI5LCAweEZFLCAweEJBLCAweEZFLCAweEJCLCAweEZFLCAweEJELCAweEZFLCAweEJGLCAweEZFLCAweDE5LCAweDYwLAorCSAweDQ4LCAweEYzLCAweDEyLCAweDYzLCAweDYwLCAweDQwLCAweDAxLCAweDI3LCAweDA0LCAweDAwLCAweDBCLCAweDYwLCAweEVBLCAweDYyLCAweDVBLCAweERGLAorCSAweEZFLCAweDFGLCAweDQxLCAweDYwLCAweDZCLCAweDc4LCAweEZGLCAweEZGLCAweDA4LCAweDYwLCAweDA2LCAweDYzLCAweEJFLCAweEQzLCAweEJELCAweEQxLAorCSAweDA3LCAweDE4LCAweEQ0LCAweDgwLCAweDA1LCAweDE4LCAweDAzLCAweDAzLCAweEMzLCAweDgzLCAweEMzLCAweDgzLCAweEY3LCAweDAxLCAweERCLCAweDgzLAorCSAweDAwLCAweEJDLCAweDJELCAweDU4LCAweEZGLCAweEZGLCAweDg2LCAweEZELCAweEFBLCAweDJELCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDEwLCAweEZELAorCSAweDZFLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDE0LCAweEZELCAweDhFLCAweDMyLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDQxLCAweEZBLAorCSAweDQwLCAweDJBLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDQyLCAweEZBLCAweDYyLCAweDJBLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDQzLCAweEZBLAorCSAweDg0LCAweDJBLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDQ0LCAweEZBLCAweEE2LCAweDJBLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDQ1LCAweEZBLAorCSAweEM4LCAweDJBLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDI1LCAweEZELCAweDlFLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAorCit9OyAgLyogZndfaW1hZ2VfM19kYXRhICovCisKK3N0YXRpYyBjb25zdCBoY2ZfOCBmd19pbWFnZV80X2RhdGFbXSA9IHsKKwkgMHg2QywgMHg0MCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MSwgMHhGRiwgMHgzMywgMHhGMywgMHgwMiwgMHgxMSwgMHgzMSwgMHgxOCwgMHgxRSwgMHgwMCwgMHg0NCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhFMiwgMHgyNywgMHg0NCwgMHgyMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHg0MiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMywgMHgwMCwKKwkgMHg0MSwgMHhGRiwgMHhBMiwgMHg2MCwgMHg0NSwgMHg3OCwgMHhFMiwgMHhGRSwgMHg0MCwgMHg0OSwgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwgMHgxRCwgMHgwMCwKKwkgMHg0NCwgMHhGRiwgMHgxQiwgMHgwOSwgMHgyOSwgMHg0NCwgMHgxMCwgMHgyQSwgMHgwNCwgMHg3NCwgMHhDRCwgMHhFMiwgMHgxMCwgMHg2NSwgMHgwQiwgMHgwMCwKKwkgMHhBMywgMHg2MCwgMHhDMSwgMHg3OCwgMHhBNCwgMHhFMiwgMHgyOSwgMHg0NCwgMHgyMCwgMHgyQSwgMHgwRCwgMHgwMCwgMHgyMCwgMHhBQywgMHhFQywgMHgwMSwKKwkgMHhBMywgMHg2MCwgMHhDMSwgMHg3OCwgMHg0NiwgMHhGRiwgMHhCNCwgMHg4NCwgMHg0MCwgMHg0OSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MCwgMHgzRSwKKwkgMHhBMywgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwKKwkgMHhBQSwgMHg2MCwgMHhBNSwgMHg3OCwgMHg0QywgMHg0RSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQSwgMHg2MCwgMHhCMywgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDNCwgMHhFMiwgMHg4NCwgMHhGRiwgMHgyMiwgMHg1OCwgMHg4MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHg2MCwgMHgzOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFMSwgMHgwMSwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHgyOSwgMHhGQSwgMHgwMSwgMHhFNCwgMHhFMiwgMHhBQSwgMHg2MCwgMHg1RiwgMHg3OCwgMHhCMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMSwgMHg2MCwgMHhGQywgMHg3OCwgMHg2NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBQSwgMHg2MCwgMHg0NiwgMHg3OCwgMHhBQywgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg4MCwgMHgyOSwgMHhFMiwgMHgwMSwgMHhBQSwgMHg2MCwgMHhBMiwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNSwgMHg2MCwgMHg1QywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNSwgMHg2MCwgMHg5NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMywgMHg2MCwgMHhDOSwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHg0MywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNywgMHg2MCwgMHgyMCwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCMywgMHg2MCwgMHhGRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4MywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHhCNSwgMHg2MCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHgzQSwgMHg2MCwgMHgxOCwgMHg3OCwgMHg0MCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzOSwgMHg2MCwgMHg4RiwgMHg3OCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMCwgMHg2MCwgMHg2NywgMHg3OCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCRiwgMHg2MCwgMHhFMSwgMHg3OCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCNywgMHg2MCwgMHhFOSwgMHg3OCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MywgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDMywgMHg2MCwgMHg0RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwgMHg0MCwgMHhGRiwgMHg0MywgMHhGRiwgMHhDMywgMHg2MCwgMHg0OCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMywgMHg2MCwgMHg0RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHgzRSwgMHg2MCwgMHg4QywgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMywgMHg2MCwgMHg0OCwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDMywgMHg2MCwgMHg0NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwKKwkgMHhDQSwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGMywgMHg2MCwgMHg5QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NSwgMHgzRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHgyNCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhGMiwgMHg2MCwgMHg0NywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHg0NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHg4NCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhDQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyOSwgMHg2MCwgMHhGMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgyMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHgyOCwgMHhFMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHg0NCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHg0NSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHg0NiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHg4NywgMHg2NCwgMHg4MCwgMHgyOSwgMHgwOSwgMHhGQiwgMHg0NywgMHhGRiwgMHgyQSwgMHg2MCwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHg0MywgMHhGNywgMHhBNywgMHhGRiwgMHg0MSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgzNywgMHg2MCwgMHg4MiwgMHg3OCwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgzNiwgMHg2MCwgMHg4RiwgMHg3OCwgMHg0NywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHg0MSwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMywgMHhFMSwgMHgyMSwgMHg0NiwgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHgyRSwgMHg0NCwgMHgwOSwgMHhGQSwKKwkgMHg2QSwgMHg2MSwgMHg3RiwgMHg2MCwgMHhGRSwgMHg2MywgMHhBMSwgMHhGRiwgMHg5QSwgMHhGRiwgMHgwNSwgMHgxMSwgMHgwQSwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwMSwgMHhGMiwgMHgxNywgMHgxOCwgMHg3QSwgMHg2MSwgMHgwMiwgMHgyNSwgMHgwNCwgMHgwMCwgMHg2QywgMHg0NCwgMHg3QSwgMHhEQSwgMHhGQiwgMHgxQywKKwkgMHhGNiwgMHgxMSwgMHhEOSwgMHg4MSwgMHg0MSwgMHhGRiwgMHgwMiwgMHgxQywgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwgMHg0MSwgMHhGRiwgMHhDOSwgMHg4MSwKKwkgMHhDQiwgMHg4MywgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHgwMiwgMHgxQywgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwKKwkgMHhDQiwgMHg4MywgMHgwMiwgMHg3NCwgMHgwMiwgMHg2MCwgMHgwNCwgMHhFMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2MSwgMHg1RCwgMHg5MywgMHhCNSwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHg4NCwgMHhCQywgMHg0MCwgMHg0NiwgMHg2NSwgMHg0NiwgMHgwMCwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHgzRiwgMHhGQywgMHg2MywgMHg0NywgMHgwQSwgMHg2MywgMHgwRiwgMHhGQywgMHgwMCwgMHhGNCwgMHgwOCwgMHhGQSwgMHhDQiwgMHhGRSwgMHgxOCwgMHhFMSwKKwkgMHg0NCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHhFMiwgMHhGRSwgMHgwMywgMHgwNCwgMHhBMywgMHg2MCwgMHgwNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFMCwgMHhGRSwgMHgwMywgMHgwNCwgMHhBMywgMHg2MCwgMHgxQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMSwgMHhGRSwgMHgwNywgMHgwNSwKKwkgMHg5RiwgMHhGRSwgMHgwMywgMHgwNCwgMHgzQSwgMHg2MCwgMHg3NywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwgMHhBOSwgMHgwMSwgMHg5NSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg4MCwgMHhCNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHgxNiwgMHgwMCwgMHgyOSwgMHg0NCwgMHgwOCwgMHgyNiwgMHhFMSwgMHgwMSwKKwkgMHg3MiwgMHg0NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhCMiwgMHhGMywgMHhFOCwgMHg4NSwKKwkgMHhGRiwgMHhCNywgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhCNCwgMHg4NSwgMHg3MywgMHg0NCwgMHhENCwgMHg4NCwgMHgxMCwgMHg2NSwgMHhENCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNSwgMHg4RiwgMHgwMCwgMHg4MCwgMHg2MCwgMHgwMSwgMHhFMCwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHhBMSwgMHhGMywKKwkgMHg3QywgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHgwMiwgMHg2NSwgMHg4QywgMHg2MCwgMHg0OCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHg3RiwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4NCwgMHg2MCwgMHgwNCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg0OCwgMHg2MCwgMHgwOCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg4NCwgMHg2MCwgMHgwNCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg0MCwgMHg2MCwgMHgwOCwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwKKwkgMHg4NCwgMHhFNywgMHhCRCwgMHhGRSwgMHgwQywgMHg2MCwgMHgwMCwgMHg2MiwgMHgwMCwgMHg2MCwgMHg3MSwgMHg3QywgMHgwMCwgMHg2MCwgMHhCMSwgMHg2NSwKKwkgMHgzRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhFMSwgMHg2MiwgMHhGRiwgMHhBMywgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhBMiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwOCwgMHhFMSwgMHhBRSwgMHg0RiwgMHgwMiwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgzRiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgxQywgMHg2MCwgMHgwOSwgMHhGMywgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MiwgMHg1QSwgMHhEMywKKwkgMHg1QSwgMHhEMSwgMHhBMCwgMHg1MCwgMHhBNCwgMHg1MCwgMHhEQiwgMHhGMywgMHhGMSwgMHhGMSwgMHgwMSwgMHhBOCwgMHgwNywgMHhBOCwgMHgwQSwgMHgwMywKKwkgMHgwOSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOSwgMHgwMCwgMHgxQiwgMHg2MCwgMHhGMywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCNCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhBRCwgMHg0RiwgMHhGQSwgMHhCNCwgMHhBMCwgMHg1RCwgMHgxOSwgMHg2MCwgMHhGNiwgMHhGMSwgMHg4OSwgMHhGRiwKKwkgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwgMHgxRSwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxQiwgMHgwMCwgMHgxMiwgMHg2MCwgMHhGRiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNSwgMHgwMywgMHgwRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgxMCwgMHgwMCwgMHgxMywgMHg2MCwgMHgwMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMywgMHgwMywgMHgwRiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgxQiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg3NSwgMHgwMSwgMHgwMCwKKwkgMHgxMCwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBMiwgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHgwMSwgMHg1RCwgMHg1QywgMHg2MiwKKwkgMHgwMywgMHhFMSwgMHg0NCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5QSwgMHhGRiwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg2MiwgMHg2MiwKKwkgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHhBMSwgMHhGRiwgMHg1QSwgMHhEQywgMHgxMiwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwMSwgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMywgMHgwMCwgMHgyOSwgMHg0MCwgMHgyMCwgMHgyNywKKwkgMHhBMywgMHgwMCwgMHhDOCwgMHg3NCwgMHhDRCwgMHhFMiwgMHgyOSwgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg0OSwgMHg0NCwgMHhGRiwgMHgwNSwgMHhFMSwKKwkgMHhEQiwgMHhGMywgMHgzNywgMHg2MCwgMHhFOCwgMHg2MywgMHgwMywgMHhBOCwgMHgwNCwgMHhBOCwgMHgwNiwgMHgwMywgMHgwNSwgMHgwMywgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHgwNywgMHgxOCwgMHgwQSwgMHgwMywgMHgyOCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg0MCwKKwkgMHg0OCwgMHgzNiwgMHgwNCwgMHgwMCwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMSwgMHhGQiwgMHgyOSwgMHg0NCwgMHhGRiwgMHg2MCwKKwkgMHhFRiwgMHg2NSwgMHgyNCwgMHg4OSwgMHg0MCwgMHgyNywgMHgzRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwQiwgMHgwMCwKKwkgMHgwNywgMHg2MSwgMHhBMSwgMHhGRiwgMHhDRCwgMHg4MSwgMHgwNCwgMHgyNSwgMHg2MSwgMHgwMCwgMHg4NywgMHg0QywgMHhGQiwgMHgwMiwgMHhGMywgMHg2MCwKKwkgMHhBMCwgMHg2NCwgMHg4MCwgMHg0QywgMHgwNywgMHgwMCwgMHhBMSwgMHhGRiwgMHg5QywgMHg0QywgMHg5QywgMHg0QywgMHg5QywgMHg0RCwgMHgwNSwgMHg2MCwKKwkgMHhDRiwgMHg2NCwgMHg4MCwgMHg0QywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgyOSwgMHg0MCwgMHgyMCwgMHgyNywgMHgwMiwgMHgwMCwKKwkgMHgxNSwgMHg2MCwgMHg2RiwgMHg2QiwgMHgwNCwgMHgyNSwgMHg0QSwgMHgwMCwgMHgzMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg0NCwgMHhGRiwgMHgwNCwgMHgyNSwKKwkgMHg0NSwgMHgwMCwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyNSwgMHg0NCwgMHhCNCwgMHg4NCwgMHg4MCwgMHg0RSwgMHgyRCwgMHg0MSwgMHgwNCwgMHgyNSwKKwkgMHgzRCwgMHgwMCwgMHg2MSwgMHg0QywgMHgwMCwgMHg2MCwgMHg4QSwgMHg2NSwgMHhDNSwgMHg4MSwgMHg2MSwgMHg1NCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNSwgMHgzNCwgMHgwMCwgMHg2NywgMHg0RSwgMHgwNywgMHg2NCwgMHgxQywgMHhGQiwgMHgwMCwgMHhFMSwgMHgwMiwgMHg2MCwgMHgwNSwgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyNywgMHgwQSwgMHgwMCwgMHgxQywgMHg2NSwgMHgyOCwgMHg0MCwKKwkgMHhBNCwgMHgzNiwgMHgxNCwgMHg2NSwgMHgyMywgMHg0NCwgMHhDNCwgMHg4NCwgMHgyOCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwQywgMHgwMCwgMHgwNywgMHgwMCwKKwkgMHgyMywgMHg0NCwgMHgxQywgMHhBNCwgMHgyOSwgMHg0MCwgMHgyMCwgMHgyNywgMHgwMiwgMHgwMCwgMHgxMSwgMHg2MCwgMHgwRiwgMHg2QiwgMHgzQywgMHg0NiwKKwkgMHg5OCwgMHhGMCwgMHgyMywgMHg0NCwgMHhDNCwgMHg4NCwgMHgwNiwgMHg3NCwgMHgyNSwgMHg1QywgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhCMCwgMHg4NCwgMHg4MCwgMHg0QywgMHg5QywgMHg0QywgMHg0NCwgMHhGRiwgMHgxOCwgMHhFMSwgMHgwQSwgMHg2NCwgMHgxRSwgMHg3NCwKKwkgMHgwMiwgMHg2MCwgMHgwNSwgMHhFMSwgMHg0MCwgMHg0MCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHhDNCwgMHhFMiwgMHgyNywgMHg0NCwKKwkgMHgyMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2NywgMHg0QywgMHhCMSwgMHg2MCwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0MSwgMHg2NCwgMHgzQSwgMHhEQiwgMHg2MiwgMHhGRiwgMHgwOCwgMHhFMSwgMHhFMiwgMHhGRSwgMHg3MiwgMHg1MiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwKKwkgMHg4MCwgMHgzRSwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHgyOCwgMHg0MCwgMHgwOCwgMHgyNywgMHg1QSwgMHgwMSwgMHgzQywgMHg0NiwKKwkgMHg4QiwgMHhGRiwgMHg4NCwgMHg2MCwgMHgwMCwgMHhFNCwgMHgwRiwgMHg2MCwgMHg5MCwgMHg2NCwgMHhDOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg1NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMCwgMHg2MCwgMHgxOCwgMHg3MCwgMHgxOCwgMHg3MSwgMHgyMCwgMHg3MiwgMHgwMCwgMHhGMiwgMHg2MCwgMHg1MywKKwkgMHgyMCwgMHhFMSwgMHhBMSwgMHhGRiwgMHg4OCwgMHg3NSwgMHgwMCwgMHhFMSwgMHhGRiwgMHhGRiwgMHg2MCwgMHg1MCwgMHg3NSwgMHg0NCwgMHgxMiwgMHg3MSwKKwkgMHg2RSwgMHg3MiwgMHg4MSwgMHg3NSwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRiwgMHhBMywgMHg2MCwgMHgyMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHhGMywKKwkgMHgwOCwgMHgyOSwgMHgwQSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNywgMHgyMiwgMHgwNywgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMiwgMHhGQiwgMHgyNywgMHg0NCwKKwkgMHgxMCwgMHhCQywgMHhGNywgMHhCNCwgMHg0MCwgMHg0NywgMHg0MywgMHhGRiwgMHgwMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwKKwkgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwgMHgyNSwgMHgxMSwKKwkgMHgyNCwgMHgwQSwgMHhFNSwgMHhGRSwgMHgyRCwgMHgwNSwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgxOSwgMHg2MCwgMHhGMiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxOCwgMHgxNiwgMHgwMCwgMHg5RiwgMHhGRSwgMHgxNCwgMHgwNSwgMHg5RCwgMHhGRSwgMHgxMiwgMHgwNCwgMHgzMSwgMHg0MSwKKwkgMHg0MCwgMHgyQSwgMHgwRiwgMHgwMCwgMHgwNywgMHg2MCwgMHhFOSwgMHhGMSwgMHhBRSwgMHg0QywgMHg5MCwgMHg4MCwgMHgxMCwgMHgyQSwgMHgwOSwgMHgwMCwKKwkgMHg3RiwgMHhCMSwgMHgwNywgMHg2MCwgMHhFOSwgMHhGQiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHg4MCwgMHhCOSwgMHg0MSwgMHg1MSwgMHhERiwgMHhGRSwKKwkgMHgxOSwgMHhGRiwgMHg5RiwgMHhGRSwgMHgwMiwgMHgwNCwgMHg0MCwgMHhFMSwgMHgwOCwgMHgwMCwgMHg3QywgMHhFMSwgMHgzMSwgMHg0NCwgMHgwMSwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHhGRCwgMHhFMSwgMHgyNywgMHg0NCwgMHgxMCwgMHgyNiwgMHgwNiwgMHgwMCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwKKwkgMHhBQSwgMHg2MCwgMHg2RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwOCwgMHgyNiwgMHhGRiwgMHhGRiwgMHhDMSwgMHg2MCwgMHhBMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg0OCwgMHhGMywgMHgzMiwgMHhGMSwgMHgwMCwgMHg2MywgMHg2NCwgMHg0MCwgMHgwNywgMHgyNiwgMHgwMywgMHgwMCwgMHhBNSwgMHg2MCwKKwkgMHgwRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGMCwgMHgwMSwgMHhDRCwgMHhFMiwgMHg4NSwgMHhFMSwKKwkgMHg3MCwgMHg0MSwgMHhBRCwgMHg4MCwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhFOSwgMHgxMiwgMHgwMywgMHgwMywgMHhDMiwgMHg2MCwgMHgxNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgzMiwgMHhGRCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhEQiwgMHgwMSwKKwkgMHgwMCwgMHg2MywgMHgzMiwgMHhGRCwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHgyQSwgMHhGMCwgMHgyNywgMHg0MSwgMHg0NCwgMHg0OCwgMHgyMCwgMHhCOSwKKwkgMHgwMSwgMHhCNCwgMHhGNywgMHhCMSwgMHgwQSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwOCwgMHgyNywgMHgwNywgMHgwMCwgMHgwRiwgMHg2MCwgMHhEQSwgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHg0NSwgMHhGQiwgMHg0NiwgMHhGQiwgMHhCRCwgMHhEQiwgMHhBMywgMHhEQiwgMHhDOCwgMHgwQSwgMHhDNywgMHgxMSwgMHgxQiwgMHg2MCwKKwkgMHhFRSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxNCwgMHgxOCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzNiwgMHgxMSwgMHgwMCwgMHhBQywgMHg0QywgMHg4MCwgMHgyQSwKKwkgMHgwRSwgMHgwMCwgMHgxQiwgMHg2MCwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwQSwgMHgxOCwgMHgxQiwgMHg2MCwgMHhGMiwgMHhGMywgMHgxQiwgMHg2MCwKKwkgMHhFRiwgMHhGMywgMHg2MCwgMHg0NSwgMHhENCwgMHg4MCwgMHhEQywgMHg4NCwgMHgwMiwgMHgwMywgMHhBMiwgMHhEQiwgMHhBRiwgMHgwMSwgMHgwMCwgMHg2NCwKKwkgMHgxQiwgMHg2MCwgMHhFRiwgMHhGQiwgMHg0MSwgMHg0NywgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwNCwgMHgwMCwKKwkgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHgxMCwgMHgyQiwgMHgwMywgMHgwMCwgMHgyOSwgMHg0NywgMHgyMCwgMHhCRiwgMHg0MCwgMHg0OSwgMHgxQiwgMHg2MCwKKwkgMHhFRSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHgwNSwgMHhFMSwKKwkgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyQSwgMHhFOCwgMHgzQywgMHg0NiwgMHgwRiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHhBNywgMHg2MCwgMHhFMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgwRSwgMHgwMCwgMHgxRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwOSwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHhBOCwgMHg2MCwgMHhFQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHhGMiwKKwkgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBNCwgMHg5QywgMHgzRiwgMHg2MCwgMHhDRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHhBNCwgMHg4NCwgMHgzMCwgMHg4OSwKKwkgMHgxOSwgMHg2MCwgMHg3NywgMHhGMywgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg1NSwgMHhGQiwgMHgxRiwgMHhGMiwgMHgzOSwgMHhGMSwgMHhFMCwgMHg2MCwKKwkgMHhGRiwgMHhCNSwgMHgwQSwgMHgxOCwgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwgMHhEMCwgMHg4NCwgMHhFMCwgMHhBMCwgMHgwMiwgMHgwRCwgMHgwMCwgMHg2NCwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNCwgMHgxRiwgMHg2NCwgMHg2MCwgMHg0NywgMHhCNCwgMHg4MSwgMHgwNywgMHg2MCwgMHhFQSwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHhCMSwgMHg4QywgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxMCwgMHgwMCwgMHgyOSwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOSwgMHg2QiwKKwkgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHg2NCwgMHg0QywgMHgxNCwgMHgwMCwgMHgyOSwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwKKwkgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHg2NCwgMHg0QywgMHg3QywgMHg0NCwgMHgyOSwgMHg0MCwgMHg4MCwgMHgyQiwgMHg2NywgMHg0NCwgMHg2MCwgMHg0QywKKwkgMHgwMCwgMHhFMSwgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHgwRCwgMHgwMCwgMHhFNSwgMHhGRSwKKwkgMHgwMywgMHgwNCwgMHhBQSwgMHg2MCwgMHg2RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwKKwkgMHg0MywgMHhGRiwgMHhBMywgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwQSwgMHhFMSwKKwkgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgxMywgMHhGMiwgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NywgMHgyQSwgMHhGMiwgMHg0MCwgMHg0NSwgMHg0MCwgMHg0OCwKKwkgMHgwNCwgMHgyQiwgMHgxMywgMHgwMCwgMHgxNiwgMHhGMiwgMHgxRCwgMHhGMiwgMHg0MCwgMHg0MywgMHgwRiwgMHhGMiwgMHg0MCwgMHg0RCwgMHgwRiwgMHg2NCwKKwkgMHgxNCwgMHhGMCwgMHgzNSwgMHhGMiwgMHhBMCwgMHg4MiwgMHgwRiwgMHhCNCwgMHhDQSwgMHg4NSwgMHhENCwgMHg4MCwgMHgxMCwgMHhGMiwgMHgwMSwgMHgwMiwKKwkgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0NywgMHgxMywgMHgwMCwgMHgxNywgMHhGMiwgMHgyQywgMHhGMCwgMHg0MCwgMHg0MywKKwkgMHgxQiwgMHhGMiwgMHgxRCwgMHhGQSwgMHg0MCwgMHg0RCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhBQiwgMHhGQywgMHgwNSwgMHgwMCwKKwkgMHgyOCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgxMSwgMHhGMiwgMHgyQiwgMHhGQSwgMHgyNywgMHg0NCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHhGMCwgMHhGRSwgMHhCMCwgMHg2MCwgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHg0NiwgMHgyQywgMHhGMCwgMHgyNywgMHg0NCwgMHhERiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgzOSwgMHhGMCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwKKwkgMHgwRCwgMHgwMCwgMHg2NCwgMHg0NCwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwNSwgMHgwMCwKKwkgMHhENCwgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgxMSwgMHgwMCwgMHgyQSwgMHhGMCwgMHgwMSwgMHg2NSwKKwkgMHg2NCwgMHg0MCwgMHhBNCwgMHgzQSwgMHgwNCwgMHg2NSwgMHgyNywgMHg0NCwgMHgzNCwgMHg4NywgMHgzNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg1NiwKKwkgMHhBRCwgMHhFMiwgMHgwNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg0MSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHgwNiwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHgyMiwgMHg0NiwgMHgwMSwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhDMiwgMHg2MCwgMHgxRSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyOCwgMHg0MCwgMHhDNCwgMHgzQSwgMHgwQywgMHgwMCwgMHgyNywgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHhBOCwgMHhFMiwgMHgwNSwgMHhFMSwKKwkgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyQSwgMHhFOCwgMHgzQywgMHg0NiwgMHhBNCwgMHg2MCwgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgwNSwgMHgwMCwgMHg2NywgMHg0QywgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHgwNywgMHg2MCwKKwkgMHhFQiwgMHhGMSwgMHgxRiwgMHhGMiwgMHgyQSwgMHhFOCwgMHhCMCwgMHg4MSwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxNCwgMHgwMCwgMHg2MSwgMHg0QywKKwkgMHgyOSwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MSwgMHg0NywgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOSwgMHg2QiwgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwKKwkgMHg2NCwgMHg0QywgMHg0MCwgMHg0MywgMHgxOCwgMHgwMCwgMHgyOSwgMHg0NywgMHg4MCwgMHhCNywgMHgzNCwgMHg5NCwgMHg2MCwgMHg0QywgMHgyOSwgMHg2MCwKKwkgMHhDMCwgMHg2NSwgMHg2MSwgMHg0NywgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHhFMSwgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHg2NCwgMHg0QywgMHg3QywgMHg0NCwgMHgyOSwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHg2NywgMHg0NCwgMHg2MCwgMHg0QywgMHg0MCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgyOCwgMHg0NSwgMHhCRiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHgyNCwgMHg4OCwgMHhDNCwgMHhFMiwgMHgwOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMSwgMHg0NiwgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwKKwkgMHgyNCwgMHhGQSwgMHhCMiwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwKKwkgMHhCMiwgMHhGOSwgMHgyNSwgMHhGQSwgMHhCMywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCMywgMHhGQiwgMHgyOCwgMHhGQSwgMHhCNCwgMHhGMywKKwkgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNCwgMHhGQiwgMHgyOSwgMHhGQSwgMHgyNCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg0MCwKKwkgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBNiwgMHg2MCwgMHhCMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0MywgMHg4NCwgMHhCQiwgMHhGQywgMHhCMywKKwkgMHgyMSwgMHg0NiwgMHgwMSwgMHg1RCwgMHgwRiwgMHhGQywgMHg1QywgMHg0NiwgMHgwNSwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgxMywgMHgwMCwKKwkgMHg1MCwgMHhGRSwgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgxMiwgMHgwMCwgMHgyRiwgMHhGMiwgMHgzMCwgMHhGMCwgMHg2MCwgMHg0MywgMHgzMSwgMHhGMiwKKwkgMHgyMiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyQywgMHhGMCwgMHgyRCwgMHhGMCwgMHhEMywgMHg4MCwgMHgyRSwgMHhGMCwgMHhEMSwgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgyNywgMHg0NCwgMHgwOSwgMHgwQywgMHgwMywgMHgwMCwgMHgyNywgMHg0NCwgMHgwNiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhCOCwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhENCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgwRCwgMHg2NCwgMHgzQSwgMHhEQiwgMHg3QywgMHg0NCwKKwkgMHgxQiwgMHg2MCwgMHhGMCwgMHhGQiwgMHgyMSwgMHg0NiwgMHgxQywgMHhGMiwgMHgwMCwgMHhFMSwgMHhGMCwgMHhGRSwgMHgwMCwgMHg2MywgMHgyOCwgMHg0NCwKKwkgMHhBNCwgMHgzNiwgMHgwQSwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwOCwgMHgwMCwgMHgzMCwgMHhGMywgMHgyRCwgMHg0NSwgMHhENCwgMHg4NCwgMHhDQSwgMHg2NSwKKwkgMHhENCwgMHg4MywgMHgwMSwgMHg2NCwgMHgxQiwgMHg2MCwgMHhGMCwgMHhGQiwgMHhENCwgMHg2NCwgMHgzNSwgMHgwMCwgMHgwRiwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgyMSwgMHg0NiwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyNywgMHgxNSwgMHgwMCwgMHg4MCwgMHgyNywgMHgwMiwgMHgwMCwgMHhDQSwgMHg2NSwgMHgwMSwgMHgwMCwKKwkgMHg2QSwgMHg2NSwgMHgxQywgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwKKwkgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgxNywgMHgwMCwgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwKKwkgMHgxMywgMHgwMCwgMHgxQywgMHhGMiwgMHgxRSwgMHg2NSwgMHg0MCwgMHg0NSwgMHgwQiwgMHgzNiwgMHgxRSwgMHg2NCwgMHgwRiwgMHgzNiwgMHgxNiwgMHg2NCwKKwkgMHgwQSwgMHgzNiwgMHgxMiwgMHg2NCwgMHgwRSwgMHgzNiwgMHgwRSwgMHg2NCwgMHgwOSwgMHgzNiwgMHgwRSwgMHg2NCwgMHgwRCwgMHgzNiwgMHgwQSwgMHg2NCwKKwkgMHgwOCwgMHgzNiwgMHgwQSwgMHg2NCwgMHgwQywgMHgzNiwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0RCwgMHgwMCwgMHhFMSwgMHhGMCwgMHhGRSwgMHgyQiwgMHhGMiwKKwkgMHhDNCwgMHg4NSwgMHhENCwgMHg4MywgMHhDNCwgMHg2NCwgMHg0MCwgMHg0OCwgMHgyRiwgMHhGMCwgMHhCMCwgMHhGMCwgMHhCMSwgMHhGMiwgMHhBMSwgMHhGRiwKKwkgMHgxMiwgMHg3NCwgMHhDRCwgMHhFMiwgMHg4MCwgMHg0RSwgMHgxMiwgMHg3NCwgMHg4MywgMHg0QywgMHgxMiwgMHg3NCwgMHg5QSwgMHhGRiwgMHg4NCwgMHg0QywKKwkgMHgxMiwgMHg3NCwgMHg4NSwgMHg0QywgMHgxMiwgMHg3NCwgMHg4MSwgMHg0QywgMHgxMiwgMHg3NCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHhCMiwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHgzNSwgMHhGQiwKKwkgMHhCMiwgMHg2MCwgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHgyOCwgMHg0MCwgMHhDNCwgMHgzNiwKKwkgMHgwNywgMHgwMCwgMHgxQiwgMHg2MCwgMHhGMCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHgyNywgMHg0NCwgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg0NywgMHhBNSwgMHg2MCwgMHg3RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNiwgMHhDMSwgMHhGRSwgMHhBMywgMHg2MCwgMHhFNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0MCwgMHhCNCwgMHgzQSwgMHgwQiwgMHgwMCwgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhBNiwgMHg2MCwgMHgzRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwKKwkgMHhENCwgMHgzNiwgMHgwMywgMHgwMCwgMHhBNywgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBOCwgMHhFMiwgMHgyNywgMHg0NCwgMHhGQiwgMHhCNCwKKwkgMHg0MCwgMHg0NywgMHgxQywgMHg0MiwgMHgyMiwgMHg0NiwgMHgxOSwgMHg2MCwgMHhDRiwgMHhGMywgMHhGRiwgMHhGRiwgMHgzNCwgMHhGQiwgMHgyQSwgMHhGMCwKKwkgMHhGNywgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHhDNCwgMHgwMCwgMHgyMiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwgMHgzRiwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwKKwkgMHhCQSwgMHgwMCwgMHgwNCwgMHgyQiwgMHhCOCwgMHgwMCwgMHhBNiwgMHhGNSwgMHgwMSwgMHgwMCwgMHgwNywgMHhGNCwgMHg0QiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHg0QiwgMHhGQSwgMHgwQywgMHg2MCwgMHhGQywgMHg2MiwgMHg4MCwgMHhGRiwgMHhDOCwgMHg2MCwgMHg3OCwgMHg0NCwgMHgwMiwgMHhBNCwKKwkgMHhBMiwgMHhEQiwgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4MiwgMHhGRiwgMHhBNiwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywKKwkgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgyMiwgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwKKwkgMHgzQywgMHhGMSwgMHg0QiwgMHhGMCwgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywKKwkgMHg2MCwgMHg0NywgMHgyMiwgMHg0NiwgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwKKwkgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg4MCwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgyNCwgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywgMHg1RSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwKKwkgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwKKwkgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHg1QSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwKKwkgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHgzRSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg0MCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwKKwkgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwKKwkgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHgwQywgMHhGMCwgMHgwNCwgMHgwMiwKKwkgMHg2NCwgMHg0NiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2NCwgMHgyMiwgMHg0NiwgMHgwMywgMHhGQSwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwMSwgMHhGMiwKKwkgMHhGQywgMHhBMSwgMHg2MSwgMHg0NSwgMHhENCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHgwMCwgMHhGMCwgMHgwNCwgMHg2MywgMHg2NCwgMHg0NiwKKwkgMHgwMSwgMHhGMiwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgwMywgMHhGQywgMHgwMiwgMHgwMCwgMHgyMiwgMHg0NiwgMHgxQSwgMHhGQSwgMHgzNSwgMHhGMiwKKwkgMHgwNCwgMHhGOCwgMHhEQywgMHg4NCwgMHgzNSwgMHhGQSwgMHgxNCwgMHhGMiwgMHgwRiwgMHhCNSwgMHgwRiwgMHhCNCwgMHhDQywgMHg4NCwgMHg5NCwgMHg4MCwKKwkgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgwMSwgMHgwMiwgMHg5NCwgMHg4NCwgMHgyQSwgMHhGQSwgMHg5NSwgMHhGQywgMHgwNiwgMHgwMCwKKwkgMHhDNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgyNywgMHg0NCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHhBOCwgMHhFMiwgMHhBNSwgMHg2MCwgMHgxQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHg2OCwgMHgzQSwgMHgwMywgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMCwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHhBMywgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMywgMHg2MCwgMHhGNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwRSwgMHg2NCwgMHgzQSwgMHhEQiwgMHgzQywgMHg0NCwgMHg2MCwgMHg0NiwgMHgxRSwgMHhGMCwgMHg0MCwgMHg0MiwgMHg2NCwgMHg0MCwKKwkgMHg0MCwgMHgyNywgMHg0OCwgMHgwMCwgMHgxRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgzQywgMHgwMCwgMHg4MCwgMHgyQiwKKwkgMHgwQiwgMHgwMCwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyOSwgMHg0NCwKKwkgMHgzNCwgMHg4OSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2MywgMHgwNSwgMHgwMCwgMHgzRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwKKwkgMHgwMCwgMHg2MywgMHgxRSwgMHhGMiwgMHgzOSwgMHhGMSwgMHhDMCwgMHg2MCwgMHhGRiwgMHhCNSwgMHgwQSwgMHgxOCwgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwKKwkgMHhEMCwgMHg4NCwgMHhFMCwgMHhBMCwgMHgwMiwgMHgwRCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNCwgMHgxRiwgMHg2NCwgMHg2MCwgMHg0NywKKwkgMHhCNCwgMHg4NCwgMHgwNywgMHg2MCwgMHhFQSwgMHhGMSwgMHgzQywgMHg5NCwgMHhCMCwgMHg4NCwgMHg2MCwgMHg0QywgMHgyOSwgMHg2MCwgMHhDMCwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwKKwkgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHg2NCwgMHg0QywgMHg3QywgMHg0NCwgMHgyOSwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHg2NywgMHg0NCwgMHg2MCwgMHg0QywgMHgzMiwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwKKwkgMHhDQiwgMHgwMSwgMHhCRiwgMHgwMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyOSwgMHg0NCwgMHgzNCwgMHg4OSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHg5RiwgMHhGMiwgMHgxRSwgMHhGMiwgMHgzOSwgMHhGMSwgMHhDMCwgMHg2MCwgMHhGRiwgMHhCNSwgMHgwQSwgMHgxOCwgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwKKwkgMHhEMCwgMHg4NCwgMHhFMCwgMHhBMCwgMHgwMiwgMHgwRCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNCwgMHgxRiwgMHg2NCwgMHg2MCwgMHg0NywKKwkgMHhCNCwgMHg4NCwgMHgwNywgMHg2MCwgMHhFQSwgMHhGMSwgMHgzQywgMHg5NCwgMHhCMCwgMHg4MSwgMHg2MSwgMHg0QywgMHgyOSwgMHg2MCwgMHhDMCwgMHg2NSwKKwkgMHg2MSwgMHg0NywgMHgxRiwgMHhCNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwKKwkgMHgwMSwgMHg2MCwgMHgwOSwgMHg2QiwgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHg2NCwgMHg0QywgMHg0MCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwKKwkgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhBNCwgMHg4NCwgMHhCNCwgMHhCQywgMHgxRSwgMHhGMCwgMHg0MCwgMHg0OCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyNywgMHgxNywgMHgwMCwgMHgxQywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNiwgMHgwNiwgMHgwMCwgMHgxNCwgMHgzNiwgMHgwNywgMHgwMCwgMHgzNywgMHgzNiwgMHgwOCwgMHgwMCwKKwkgMHg2RSwgMHgzNiwgMHgwOSwgMHgwMCwgMHg3MCwgMHg3QywgMHhBMCwgMHg2MywgMHgwRiwgMHgwMCwgMHgzOCwgMHg3QywgMHg1MCwgMHg2MywgMHgwQywgMHgwMCwKKwkgMHgxNSwgMHg3QywgMHgxRSwgMHg2MywgMHgwOSwgMHgwMCwgMHgwQiwgMHg3QywgMHgwRiwgMHg2MywgMHgwNiwgMHgwMCwgMHg5QywgMHhGNCwgMHhGRiwgMHg2NSwKKwkgMHg2MywgMHg0NywgMHhBNCwgMHg5QywgMHhBNywgMHg4NCwgMHgyMywgMHgwMCwgMHg0MCwgMHg0NSwgMHg0MywgMHg0RCwgMHgwMCwgMHhFMSwgMHhGMCwgMHhGRSwKKwkgMHgyOSwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwMywgMHgwMCwgMHgwMCwgMHg2MCwgMHg2QSwgMHg2NSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDQSwgMHg2NSwKKwkgMHgxRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywgMHgwRSwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwNCwgMHgyNywgMHgwMywgMHgwMCwgMHg2NSwgMHg0NCwgMHhFMCwgMHg4NSwgMHgxMiwgMHgwMCwgMHgyQiwgMHhGMiwgMHgxMSwgMHhGMCwgMHhDMCwgMHg4NCwKKwkgMHhEMCwgMHg4NCwgMHhDNCwgMHg4MywgMHgxMSwgMHgwMCwgMHgxRSwgMHg2NCwgMHhDNCwgMHg4NCwgMHg2MCwgMHg0NSwgMHgwOCwgMHgwMCwgMHg0MCwgMHg0NSwKKwkgMHhGRiwgMHg2MCwgMHhGOCwgMHg2NCwgMHg0MCwgMHg0MywgMHgwMCwgMHhFMSwgMHhGMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHgzQywgMHg2NSwgMHg5MSwgMHhGNCwKKwkgMHgxQiwgMHhGMCwgMHhDMywgMHg4NCwgMHhDNCwgMHg4NCwgMHhDMCwgMHg4MywgMHgyOCwgMHg0NCwgMHhBMSwgMHhGRiwgMHgxMiwgMHg3NCwgMHg4MCwgMHg0RSwKKwkgMHgxMiwgMHg3NCwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHgxMiwgMHg3NCwgMHg1NiwgMHg2MiwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwKKwkgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg1QywgMHg2MiwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwKKwkgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHhCMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHg0NywgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NywKKwkgMHgzNiwgMHhGMywgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHg3QywgMHg0QiwgMHg2MCwgMHg1NiwKKwkgMHhBRCwgMHhFMiwgMHhBNSwgMHg2MCwgMHg3OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMywKKwkgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwNywgMHhCNCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwgMHgyOSwgMHg0NCwKKwkgMHhCRiwgMHg2MCwgMHhGRiwgMHhCNywgMHg4MCwgMHhCRiwgMHg0MCwgMHg0OSwgMHg4MCwgMHg2NywgMHgwNSwgMHgwMCwgMHgzRiwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgwMCwgMHg2NCwgMHgxNiwgMHg2MCwgMHg1MCwgMHhGMSwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg1NSwgMHhGOSwKKwkgMHgzOSwgMHhGMSwgMHgxNiwgMHg2MCwgMHgzQywgMHhGMSwgMHg2NCwgMHg0MSwgMHg2NCwgMHg1RSwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NywgMHgxRiwgMHhCNCwKKwkgMHg1NCwgMHg5NCwgMHhFMCwgMHhBMCwgMHgwMiwgMHgwRCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNCwgMHgxRiwgMHg2NCwgMHg2MCwgMHg0NywKKwkgMHgwNywgMHg2MCwgMHhFQSwgMHhGMSwgMHhCNCwgMHg4NCwgMHhCMCwgMHg4QywgMHgyOSwgMHg2MCwgMHhDMCwgMHg3QywgMHg2MCwgMHg0NywgMHgxRiwgMHhCNCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0MCwgMHhEMywgMHg1QSwgMHhEMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHhFMSwgMHgwNSwgMHg2MCwgMHg2OSwgMHg2QiwKKwkgMHg2MCwgMHg0QywgMHhCNSwgMHhGRiwgMHg2NCwgMHg0QywgMHg3QywgMHg0NCwgMHgyOSwgMHg0MCwgMHg4MCwgMHgyQiwgMHg2NywgMHg0NCwgMHg2MCwgMHg0QywKKwkgMHg0MCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwKKwkgMHgzQywgMHg0NCwgMHg2MCwgMHg0NiwgMHg0MCwgMHg0MiwgMHgxMywgMHg2NCwgMHgzQSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzQywgMHg0NiwKKwkgMHgyQSwgMHhGMiwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMSwgMHhBNCwgMHg4NCwgMHhDNCwgMHhCQywgMHg0MCwgMHg0OCwgMHg2NCwgMHg0NCwgMHgwNCwgMHgyNiwKKwkgMHgwOSwgMHgwMCwgMHgwMiwgMHgyNiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwQiwgMHg2MywKKwkgMHg2RSwgMHg2NCwgMHgwOCwgMHgwMCwgMHgxNSwgMHg2MywgMHgzNywgMHg2NCwgMHgwNSwgMHgwMCwgMHgzOCwgMHg2MywgMHgxNCwgMHg2NCwgMHgwMiwgMHgwMCwKKwkgMHg3MCwgMHg2MywgMHgwQSwgMHg2NCwgMHg0MywgMHg0RCwgMHg0MCwgMHg0NSwgMHgwMCwgMHhFMSwgMHhGMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHgxRSwgMHg2NCwKKwkgMHgxQiwgMHhGMCwgMHgxMSwgMHhGMCwgMHhDMCwgMHg4NCwgMHhDMCwgMHg4NCwgMHg2MCwgMHg0MywgMHgyOCwgMHg0NCwgMHhBMSwgMHhGRiwgMHgxMiwgMHg3NCwKKwkgMHg4MCwgMHg0RSwgMHgxMiwgMHg3NCwgMHg4MywgMHg0QywgMHg5QSwgMHhGRiwgMHgxMiwgMHg3NCwgMHg1QywgMHg2MiwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwKKwkgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHhCMiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHgzNSwgMHhGQiwgMHhCMiwgMHg2MCwKKwkgMHg3MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgwOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBNCwgMHg2MCwgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0MywgMHgyNCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwRSwgMHgwMCwgMHgxRCwgMHhGRiwgMHgyNiwgMHg0NCwgMHgwMiwgMHhCQywgMHg0MCwgMHg0NiwKKwkgMHgyNywgMHg0NCwgMHgwNywgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwKKwkgMHgzMCwgMHhGMSwgMHg4MSwgMHgwMCwgMHhGQywgMHhCMywgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwQSwgMHhCQiwgMHgwRiwgMHhGQywKKwkgMHhDQiwgMHhGRSwgMHhBMywgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0NCwgMHgwNCwgMHgyNiwgMHgyOSwgMHgwMCwgMHgwRiwgMHhGQywKKwkgMHgwNSwgMHhGRiwgMHhEQiwgMHhGMywgMHgyOCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgyMywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgyMCwgMHgwMCwKKwkgMHgzMiwgMHhGMiwgMHg3RiwgMHhGMSwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHgxQSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwKKwkgMHg4MSwgMHhGMSwgMHgxNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzQywgMHg0NCwgMHgxMywgMHgwMiwgMHhBQywgMHg4NiwgMHhCQiwgMHhGRSwgMHgxMCwgMHgwMywKKwkgMHgyQSwgMHhGMiwgMHgyMSwgMHg0NiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgwQiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwKKwkgMHgwMCwgMHg2NCwgMHgzMiwgMHhGQiwgMHg0MywgMHhGRiwgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwKKwkgMHgzMCwgMHhGMSwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwgMHgzNCwgMHgwMCwgMHhGQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgyNCwgMHg0NCwgMHgxMCwgMHgyQSwKKwkgMHgyQiwgMHgwMCwgMHgyOCwgMHg0MCwgMHhENCwgMHgzQSwgMHgyOCwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMCwgMHg3QywgMHgyOSwgMHg0MCwKKwkgMHg1MCwgMHgyQiwgMHgwRCwgMHgwMCwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgwNiwgMHgwMCwgMHgxQywgMHg2MCwgMHgxMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NSwgMHgyQiwgMHg0NCwgMHgwNSwgMHgwNSwgMHgyQiwgMHg0NCwKKwkgMHhGRiwgMHhBNCwgMHgwMSwgMHhBNCwgMHgwNCwgMHgyNCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NCwKKwkgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwgMHgyMCwgMHgyOSwKKwkgMHg2RCwgMHhFMiwgMHhBNSwgMHg2MCwgMHg3RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNywgMHgwMCwKKwkgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgwNSwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgwMSwgMHg2MCwgMHgwMiwgMHg3QywgMHgyNSwgMHg0NCwgMHgwQSwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHg2MCwgMHgzQSwgMHg3QywgMHgzMSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMCwgMHg3QywgMHgyOSwgMHg0MCwgMHg1MCwgMHgyQiwKKwkgMHgwRCwgMHgwMCwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNiwgMHgwMCwKKwkgMHgxQywgMHg2MCwgMHgxMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NSwgMHgyQiwgMHg0NCwgMHgwNSwgMHgwNSwgMHgyQiwgMHg0NCwgMHhGRiwgMHhBNCwKKwkgMHgwMSwgMHhBNCwgMHgwNCwgMHgyNCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHg3MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NCwgMHhDNCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHgyOCwgMHg0MCwgMHhFNCwgMHgzNiwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwKKwkgMHgwMSwgMHgwMCwgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwgMHhBMywgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwNSwgMHgyMiwKKwkgMHgwOSwgMHgwMCwgMHhCQSwgMHhCNCwgMHg0MCwgMHg0NywgMHgzQywgMHg0NiwgMHgwMiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhBMywgMHg2MCwKKwkgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0NCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NywgMHgwNiwgMHg2NCwKKwkgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHhGNCwgMHgwMSwgMHhGMywgMHgwQSwgMHg3QywgMHg1MCwgMHg2RCwgMHhFMiwgMHhGMCwgMHgwMSwgMHg3MiwgMHg0NSwKKwkgMHhEQywgMHg4NCwgMHhCMiwgMHhGQiwgMHgxMSwgMHg2NCwgMHgzQSwgMHhEQiwgMHhCMywgMHhGMywgMHgwNiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCMywgMHhGQiwKKwkgMHhCNCwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNCwgMHhGQiwgMHhBNCwgMHg2MCwgMHgwMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwKKwkgMHgxMiwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyMCwgMHg2MCwgMHgwNCwgMHg2MywgMHhCRCwgMHhEMywgMHg3MiwgMHg0NSwgMHg0NCwgMHg4QSwgMHgwMiwgMHgyOCwKKwkgMHgwMywgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwgMHgwNCwgMHgwMCwgMHgwMiwgMHgyOCwgMHgwMiwgMHgwMCwgMHhFNCwgMHhFMiwgMHhERCwgMHg4MSwKKwkgMHhCRCwgMHhEMywgMHhCMiwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhDNCwgMHg4NCwKKwkgMHg2MCwgMHg1NSwgMHgyQSwgMHg1MiwgMHhFNCwgMHhFMiwgMHhCMiwgMHhGQiwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHhCMywgMHhGMSwKKwkgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHgwMCwgMHg2MSwgMHgwMiwgMHgyNCwgMHgwMSwgMHhCOSwgMHhDNCwgMHg4NCwgMHhCMywgMHhGQiwgMHgwMiwgMHgyNCwKKwkgMHgwMSwgMHhCOSwgMHhCRCwgMHhEMywgMHhCNCwgMHhGMSwgMHg2MSwgMHg0NSwgMHhDMCwgMHg4NCwgMHhDNCwgMHg4NCwgMHhCNCwgMHhGQiwgMHhBNSwgMHg2MCwKKwkgMHgxNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg2MCwgMHg5RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NywgMHhGRiwgMHgxQiwgMHg2MCwgMHhFRSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHhDOCwgMHg3NCwgMHhDRCwgMHhFMiwKKwkgMHhBQSwgMHg2MCwgMHhCOSwgMHg3OCwgMHgwMCwgMHg2MSwgMHhBMywgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBQiwgMHg2MCwgMHhFOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMSwgMHg0NiwgMHg1QywgMHg0NCwgMHgyNiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgwMSwgMHgwMCwgMHgzRSwgMHg0NiwgMHgwOSwgMHhGMiwKKwkgMHg0NiwgMHg0MSwgMHg2NiwgMHg0MCwgMHhGMywgMHgxOCwgMHg0MCwgMHg1RSwgMHhGRCwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHg0MSwgMHg1RCwKKwkgMHgwMCwgMHg2NCwgMHgzMSwgMHhGQSwgMHgwMCwgMHhGMiwgMHg0NiwgMHg0NSwgMHg4NywgMHhGQywgMHhBQywgMHhFMiwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwKKwkgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyMSwgMHgwMCwgMHgxOSwgMHhGMywgMHgwMSwgMHg2MCwgMHgxRSwgMHhFMSwgMHgxRCwgMHgxOCwgMHg4MCwgMHg2NCwKKwkgMHg0MCwgMHg0OSwgMHgwMCwgMHhFMSwgMHgxOSwgMHhGRiwgMHgwOCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg1QSwgMHhEQSwgMHgyQywgMHhGQSwgMHg1QSwgMHhEQSwKKwkgMHg1QSwgMHhEQSwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMSwgMHhGQiwgMHg3MiwgMHg0NCwgMHgyNCwgMHhGQSwgMHhCMiwgMHhGMywKKwkgMHgyNSwgMHhGQSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwKKwkgMHg3QywgMHg0QiwgMHhBMywgMHg2MCwgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHhFMSwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHgzRiwgMHg2MCwKKwkgMHhDRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgyRSwgMHg0NCwgMHgwMCwgMHgzNiwgMHg0OCwgMHgwMCwgMHgwMSwgMHgzQSwgMHhFNSwgMHgwMCwKKwkgMHg4OCwgMHhGRiwgMHg0MCwgMHg2NywgMHgyOSwgMHg0NSwgMHgzNCwgMHg4OSwgMHgwNCwgMHg2NCwgMHg4OSwgMHhGRiwgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0NSwgMHg2NSwgMHg0NCwgMHgwRiwgMHhCNCwgMHg0MCwgMHg0NSwgMHgxQywgMHhGQSwgMHg2NSwgMHg0NCwgMHgyOSwgMHg0MSwKKwkgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4MywgMHgxRCwgMHhGQywKKwkgMHgxQiwgMHhGQywgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyOSwgMHg0NCwgMHgzNCwgMHg4OSwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwKKwkgMHhCNiwgMHhGMSwgMHhGQywgMHhBMywgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwNCwgMHhBQiwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwOSwgMHg3QywgMHhEMywgMHg4MCwgMHg5QSwgMHhGRiwgMHgwMywgMHgwNywgMHhBQiwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwKKwkgMHgwMSwgMHgyNiwgMHgwRiwgMHhBQywgMHgyNiwgMHg2MCwgMHg0QSwgMHg2NSwgMHg0NCwgMHhEMywgMHgxMiwgMHg2NSwgMHg0NSwgMHg0NiwgMHg2MCwgMHg0NywKKwkgMHg0MCwgMHg3RiwgMHgyNywgMHhGQSwgMHg4RiwgMHhGQywgMHgxOCwgMHg2MSwgMHhFQSwgMHhGMSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwgMHhEQywgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgyMSwgMHgwMywgMHg1MCwgMHhGRSwgMHhBQywgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwQiwgMHg3RCwKKwkgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwgMHhCNSwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhBQSwgMHg3NCwgMHhDRCwgMHhFMiwgMHgwMSwgMHg2NCwKKwkgMHg4OSwgMHhGRiwgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgwNSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHgyNSwgMHg4QiwgMHgwMCwgMHg2QywgMHg0NCwgMHgwQSwgMHgzNiwgMHgwNywgMHgwMCwgMHgxNCwgMHgzNiwgMHgwNSwgMHgwMCwgMHgzNywgMHgzNiwKKwkgMHgwMywgMHgwMCwgMHg2RSwgMHgzNiwgMHgwMSwgMHgwMCwgMHg4MSwgMHgwMCwgMHg0MCwgMHg0NSwgMHgzMiwgMHg3NCwgMHhBMSwgMHhGRiwgMHgxQywgMHhGQSwKKwkgMHg0MCwgMHg0RSwgMHg4QywgMHg0NCwgMHg2MCwgMHg0MywgMHgxRCwgMHhGQSwgMHgwMSwgMHhFMSwgMHgyMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyRSwgMHg0NCwKKwkgMHgxNCwgMHgzNiwgMHgxMiwgMHgwMCwgMHgwQSwgMHgzNiwgMHgwRiwgMHgwMCwgMHg2MywgMHg0NSwgMHhFMywgMHg4MywgMHhFMywgMHg4MywgMHhDNywgMHg4MywKKwkgMHhFMywgMHg4MywgMHhDNywgMHg4MywgMHhGRiwgMHhGRiwgMHgzNywgMHgzNiwgMHgwNSwgMHgwMCwgMHg2RSwgMHgzNiwgMHgwNCwgMHgwMCwgMHhBQywgMHg2MCwKKwkgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNywKKwkgMHhDRiwgMHg4MywgMHgxQiwgMHhGQywgMHgwMSwgMHg2NCwgMHg1MSwgMHhGQiwgMHhBMSwgMHhGRiwgMHgyOSwgMHg0MSwgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwKKwkgMHg3MSwgMHg4OSwgMHgyRSwgMHg0NCwgMHgyNywgMHhGQSwgMHhCNiwgMHhGMSwgMHhGQywgMHhBMywgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwNCwKKwkgMHhBQiwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5QSwgMHhGRiwgMHg1NCwgMHg2MywgMHgxMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHg4RiwgMHhGQywKKwkgMHgxOCwgMHg2MSwgMHhFQSwgMHhGMSwgMHg1MCwgMHhGRSwgMHg2QywgMHg0MCwgMHg5RSwgMHgxNSwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHg4MCwgMHhFMSwKKwkgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHgyOSwgMHg0MCwgMHg1MCwgMHgyQiwgMHgwRiwgMHgwMCwgMHgyQiwgMHg0NCwgMHg3MCwgMHg0NSwgMHhDNCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwgMHgwMCwgMHhCNCwgMHg2MCwgMHg1MCwgMHgwOCwgMHgyOCwgMHgwMSwgMHgwMCwgMHgyMCwgMHgyOSwgMHg2RCwgMHhFMiwKKwkgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHgwMSwgMHgxMSwgMHgxMiwgMHgwMCwKKwkgMHgyOSwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0OSwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHhCNiwgMHhGRiwgMHgwMCwgMHhFMSwgMHgwMSwgMHg2MCwKKwkgMHgxQSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg0MCwgMHhGQywgMHgxMSwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHhBRSwgMHg0RiwKKwkgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHhCNSwgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwKKwkgMHg3QywgMHg0QiwgMHgzNSwgMHhFMSwgMHhBQywgMHhFMiwgMHhBQSwgMHg2MCwgMHg0NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHg3RiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwgMHgyMSwgMHg2NCwgMHgzQSwgMHhEQiwgMHhCRCwgMHgwMSwKKwkgMHhBQywgMHhFMiwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHgwMSwgMHhFMSwgMHgzRiwgMHg2MCwgMHhDRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwKKwkgMHgyRSwgMHg0NCwgMHgwMCwgMHgzNiwgMHgyMSwgMHgwMCwgMHgwMSwgMHgzQSwgMHhGMCwgMHgwMSwgMHg4OCwgMHhGRiwgMHg0MCwgMHg2NywgMHgyOSwgMHg0NSwKKwkgMHgzNCwgMHg4OSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NSwgMHg2NSwgMHg0NCwgMHgwRiwgMHhCNCwgMHg0MCwgMHg0NSwgMHg2NSwgMHg0NCwgMHgyOSwgMHg0MSwKKwkgMHhGOSwgMHg4MSwgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4MywgMHgwRSwgMHg3QywKKwkgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhBQiwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwKKwkgMHhEQywgMHg4MCwgMHhGRiwgMHhGRiwgMHhEMiwgMHgwMywgMHg0MSwgMHgwMCwgMHhDOCwgMHg2MCwgMHgwQiwgMHg3RCwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2QiwKKwkgMHhCNSwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhBQSwgMHg3NCwgMHhDRCwgMHhFMiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgwNSwgMHhFMSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNSwgMHhDMSwgMHgwMSwgMHg2QywgMHg0NCwgMHgwQSwgMHgzNiwgMHgwNywgMHgwMCwgMHgxNCwgMHgzNiwKKwkgMHgwNSwgMHgwMCwgMHgzNywgMHgzNiwgMHgwMywgMHgwMCwgMHg2RSwgMHgzNiwgMHgwMSwgMHgwMCwgMHhCNywgMHgwMSwgMHg0MCwgMHg0NSwgMHgzMiwgMHg3NCwKKwkgMHhBMSwgMHhGRiwgMHg0MCwgMHg0RSwgMHg4QywgMHg0NCwgMHg2MCwgMHg0MywgMHgwMSwgMHhFMSwgMHgyMCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyRSwgMHg0NCwKKwkgMHgxNCwgMHgzNiwgMHgwOSwgMHgwMCwgMHgwQSwgMHgzNiwgMHgwNywgMHgwMCwgMHgzNywgMHgzNiwgMHgwNSwgMHgwMCwgMHg2RSwgMHgzNiwgMHgwMywgMHgwMCwKKwkgMHhBQywgMHg2MCwgMHhCRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHg1MSwgMHhGQiwgMHhBMSwgMHhGRiwgMHgyOSwgMHg0MSwgMHhGOSwgMHg4MSwKKwkgMHg1MiwgMHg0QSwgMHg3MSwgMHg4OSwgMHgwRSwgMHg3QywgMHhEMywgMHg4MCwgMHg0MywgMHg0MywgMHgwMywgMHgwMywgMHhBQiwgMHg2MCwgMHhERSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2QywgMHg0MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNSwgMHg5MCwgMHgwMSwgMHgxMiwgMHg2NCwgMHg0MCwgMHg0NiwgMHhFQSwgMHhGMSwKKwkgMHg1MCwgMHhGRSwgMHhBMSwgMHhGRiwgMHgxMiwgMHg2MSwgMHg4QywgMHg0NCwgMHhFQiwgMHhGMCwgMHg0MCwgMHg0OCwgMHg4QywgMHg0NCwgMHgzMCwgMHhGQiwKKwkgMHgwNCwgMHg2MSwgMHg1MCwgMHhGRSwgMHg4QywgMHg0NCwgMHhEMCwgMHg4MCwgMHg4QywgMHg0NCwgMHhENCwgMHg4MCwgMHg4QywgMHg0NCwgMHhFQywgMHhGMSwKKwkgMHgwMCwgMHg2NSwgMHhEMCwgMHg4MCwgMHgyOCwgMHg0NCwgMHgwMSwgMHgwQywgMHgxMywgMHgwMCwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHhDNCwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHhENCwgMHgzQSwgMHgwRCwgMHgwMCwgMHgyNywgMHg0MCwgMHg0MCwgMHgyNiwgMHgzMCwgMHg2NSwgMHgzNSwgMHg4NCwgMHhBMSwgMHhGRiwKKwkgMHg4QywgMHg0NCwgMHg0NywgMHhGRiwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwgMHg2QSwgMHg0NCwgMHg0MCwgMHgyQiwgMHgwOSwgMHgxNSwKKwkgMHgyQywgMHg2MCwgMHhFQywgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgyQSwgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHgxQywgMHgwMSwgMHgyOSwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwNCwgMHg3NCwgMHhDRCwgMHhFMiwgMHg4QywgMHg0NCwgMHhCNiwgMHhGRiwKKwkgMHhCNywgMHhGRiwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHgwNSwgMHhFMSwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwMywgMHgwMCwgMHhCNiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwKKwkgMHhBMSwgMHhGRiwgMHgwMiwgMHg3NCwgMHgyOSwgMHg0NCwgMHg0MCwgMHgyNywgMHgwNSwgMHg3NCwgMHhDRCwgMHhFMiwgMHhBMSwgMHhGRiwgMHhDQiwgMHhGMywKKwkgMHhDNCwgMHhFMiwgMHg4OSwgMHhGRiwgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwgMHhEQywgMHg4NCwgMHhFMCwgMHg5NCwgMHgyNiwgMHg0NCwgMHg4NCwgMHhCQywKKwkgMHg0MCwgMHg0NiwgMHgyMywgMHg2NCwgMHgzQSwgMHhEQiwgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHg3QywgMHg0QiwgMHhBOSwgMHg2MCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHhBMiwgMHhGQywgMHgzMiwgMHg0MCwgMHgwMSwgMHgyQSwgMHhCOSwgMHgwMCwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHgyMywgMHg0MywKKwkgMHhBMSwgMHhGRiwgMHhFQywgMHg0NCwgMHgyQSwgMHhGQSwgMHg0MCwgMHg0OCwgMHhBMSwgMHhGRiwgMHg3QSwgMHhEQywgMHg3RSwgMHgzNiwgMHgwNCwgMHhBMiwKKwkgMHhGQywgMHgxQywgMHgwMywgMHgxRCwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHgyRSwgMHgwMCwgMHgwMywgMHgyQiwgMHgwNCwgMHgwMCwgMHhBMSwgMHhGRiwKKwkgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHgwMywgMHgwMCwgMHg3MCwgMHg2MiwgMHhBMSwgMHhGRiwKKwkgMHg3QSwgMHhEQywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwNiwgMHgwMCwgMHg3MiwgMHg2MiwgMHhBMSwgMHhGRiwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywKKwkgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgzRiwgMHhGQywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHg2RSwgMHg2MSwgMHhBMSwgMHhGRiwgMHgwNSwgMHgxRCwKKwkgMHgxMiwgMHgxRSwgMHgwQywgMHgwMCwgMHgwMCwgMHhGNCwgMHg3QywgMHg2MSwgMHgwMiwgMHg2MiwgMHg3QSwgMHhEQywgMHg2MywgMHg0MCwgMHhGRCwgMHgxQywKKwkgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwgMHgwOCwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHg5OCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0MCwgMHhBMSwgMHhGRiwgMHg0NywgMHhGRiwKKwkgMHg3QywgMHg0NCwgMHgzMywgMHhGQiwgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHg4NCwgMHhCQywgMHgwMSwgMHgxNSwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0NiwKKwkgMHg2QywgMHg0MCwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NSwgMHhBMSwgMHhGRiwgMHg3RiwgMHg2MCwgMHg3RiwgMHg3QywKKwkgMHg2QywgMHg0NCwgMHhBMCwgMHg4NCwgMHgxNSwgMHhBNywgMHgxNSwgMHhBNCwgMHgyMSwgMHg0NiwgMHgyNiwgMHhGQSwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgwNywgMHgwMCwgMHhCNiwgMHhGRiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NCwgMHgxQSwgMHhGQSwgMHgwOSwgMHgwMCwKKwkgMHg2NSwgMHg0NCwgMHgwRiwgMHhCNCwgMHgwNiwgMHhBOCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgwOCwgMHgyOCwgMHg3QywgMHg0NSwgMHgyOSwgMHg0NCwKKwkgMHgzNCwgMHg4OSwgMHgyNywgMHhGMCwgMHg2NSwgMHg0NCwgMHg2NCwgMHg1RSwgMHgyNywgMHhGQSwgMHg4MSwgMHhFMSwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwKKwkgMHgwMSwgMHgxMSwgMHgxMiwgMHgwMCwgMHgyOSwgMHg0NCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0OSwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHhCNiwgMHhGRiwKKwkgMHgwMCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg0MCwgMHhGQywgMHgxMSwgMHgwMSwgMHg2MCwKKwkgMHgxOCwgMHhFMSwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgwMCwgMHg3MCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyMSwgMHg0NiwKKwkgMHhCNSwgMHhGRiwgMHhCQywgMHhGRiwgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwKKwkgMHg3QywgMHg0QiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyNywgMHgwOSwgMHgwMCwgMHhENCwgMHgzNiwgMHgwNCwgMHgwMCwgMHgwQywgMHgyMiwgMHgwMiwgMHgwMCwKKwkgMHgwQywgMHgzQSwgMHgwMywgMHgwMCwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwgMHgyQSwgMHg0NCwgMHg3MiwgMHg0NSwgMHgyNCwgMHhGQSwKKwkgMHhCMiwgMHhGMywgMHgwNiwgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg5QywgMHgyOSwgMHg0MCwgMHgwMSwgMHgyNiwgMHg2NCwgMHg0NCwgMHhCMiwgMHhGOSwKKwkgMHgyNSwgMHhGQSwgMHhCMywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCMywgMHhGQiwgMHgyOCwgMHhGQSwgMHhCNCwgMHhGMywgMHgwMiwgMHgwNCwKKwkgMHhEQywgMHg4NCwgMHhCNCwgMHhGQiwgMHgyOSwgMHhGQSwgMHhBOSwgMHg2MCwgMHg4OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHgxOSwgMHg2MCwKKwkgMHhBMywgMHhGMywgMHgxMiwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwOCwgMHgwMCwgMHgwMCwgMHg2NCwgMHgzQiwgMHhGQSwgMHhCRiwgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHg4QywgMHg0NCwgMHgzRCwgMHhGQSwgMHhBNCwgMHg4NCwgMHgwMSwgMHgwMCwgMHg4QywgMHg0NCwgMHhFQiwgMHhGMCwgMHgyQSwgMHhGQSwKKwkgMHg0MCwgMHg0OCwgMHgwNCwgMHgyNiwgMHg0OCwgMHgwMCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg1QSwgMHhEQSwgMHgzMCwgMHhGQiwgMHg2QywgMHg0NCwKKwkgMHgyQywgMHhGQSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHgyQiwgMHgwMCwgMHhEMCwgMHg4MCwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHg2QywgMHg1QywKKwkgMHgwMCwgMHhFMSwgMHhGMiwgMHhGRSwgMHgyRCwgMHhGQSwgMHhFQywgMHhGMywgMHhENCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgyRSwgMHhGOCwgMHgyNCwgMHg0NCwKKwkgMHgxNiwgMHgwQywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNywgMHgwMCwgMHgyOCwgMHg0MiwgMHgwQywgMHhCMiwgMHgwOCwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgxMCwgMHhCQywgMHg0MCwgMHg0NCwgMHg2MSwgMHgwMCwgMHgwNCwgMHgwQSwgMHhBMSwgMHhGRiwgMHhBQiwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMSwgMHhCQywgMHg0MCwgMHg0NCwgMHgyOCwgMHg0NSwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHgyNCwgMHg4OCwgMHg1NSwgMHgwMCwgMHgzMCwgMHhCQywKKwkgMHg0MCwgMHg0NCwgMHgyMiwgMHhGMCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg0RCwgMHgwMCwgMHgyMCwgMHhCOSwKKwkgMHg1QywgMHg4RSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHgyRCwgMHhGQSwgMHhEQywgMHg5QywgMHg2QywgMHg0NCwgMHgwMCwgMHhFMSwgMHhGMiwgMHhGRSwKKwkgMHgyRSwgMHhGQSwgMHgwOCwgMHgyOCwgMHg0NCwgMHg0RSwgMHhEQywgMHg4NCwgMHgyRSwgMHg1QywgMHhCMCwgMHg4NCwgMHhFRiwgMHhCMSwgMHgwOCwgMHgyNCwKKwkgMHg0MCwgMHhCOSwgMHg0MSwgMHg0NiwgMHgzOSwgMHgwMCwgMHgyMywgMHg0MSwgMHgxMywgMHg2NCwgMHg1MSwgMHg5MCwgMHg1NiwgMHg2MywgMHgwMywgMHgwNCwKKwkgMHhBQiwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4QywgMHg0NCwgMHgwNCwgMHg2MSwgMHgyQiwgMHhGQSwgMHg1MCwgMHhGRSwgMHg4MCwgMHgyNywKKwkgMHgwMCwgMHg2NCwgMHgzMCwgMHhGQiwgMHg4QywgMHg0NCwgMHgyQywgMHhGQSwgMHhEMCwgMHg4MCwgMHg4QywgMHg0NCwgMHgyRCwgMHhGQSwgMHhENCwgMHg4MCwKKwkgMHgwMCwgMHg2NSwgMHg4QywgMHg0NCwgMHhFQywgMHhGMSwgMHgyRSwgMHhGQSwgMHhEMCwgMHg4MCwgMHgyOCwgMHg0NCwgMHgwMywgMHgwQywgMHhBMCwgMHgyQSwKKwkgMHgwQSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxMCwgMHg2NSwgMHg2MCwgMHg0MCwgMHhDNCwgMHgzNiwgMHgwNCwgMHgwMCwgMHhENCwgMHgzQSwgMHgwOCwgMHgwMCwKKwkgMHgyNywgMHg0MCwgMHg0MCwgMHgyNiwgMHgzMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgzRiwgMHhGQSwgMHg0NiwgMHg0RSwgMHgzNSwgMHg4NCwgMHg2NCwgMHgwMCwKKwkgMHg0MCwgMHgyNiwgMHhGOSwgMHgwMSwgMHgzMCwgMHg2NSwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgwNCwgMHg2MSwgMHhGMywgMHgwMSwKKwkgMHhBMSwgMHhGRiwgMHhBQiwgMHg2MCwgMHhBNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgyMywgMHg0MywgMHhFOCwgMHhBMywKKwkgMHg4MCwgMHgyNywgMHhGNiwgMHgwMSwgMHgyMCwgMHhFNiwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQiwgMHgyOCwgMHg0NCwgMHgwMywgMHgyQiwgMHgwNSwgMHgwMCwKKwkgMHg2QSwgMHg2MiwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHg3MCwgMHg2MiwgMHg3QSwgMHhEQywgMHgyOCwgMHg0NCwgMHg0MCwgMHgyQiwgMHgwRCwgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhEQywgMHhBMSwgMHhGRiwKKwkgMHg2QywgMHg1QywgMHg1QSwgMHhEOCwgMHhFNCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMywgMHgwMCwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHhGOCwgMHhBMywKKwkgMHgyNSwgMHhGRiwgMHhCMCwgMHhGRiwgMHgzRiwgMHhGQywgMHgwMCwgMHhGNCwgMHgxMCwgMHg2MiwgMHgxMCwgMHg2MSwgMHg1NywgMHg5MCwgMHg2QywgMHg2MSwKKwkgMHhBMSwgMHhGRiwgMHgwOSwgMHgwNywgMHgwMiwgMHgxRCwgMHgyOCwgMHgxRSwgMHgxRiwgMHgwMCwgMHhDQiwgMHg4MywgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywKKwkgMHhEOSwgMHg4MSwgMHgyMiwgMHgxRSwgMHgxOSwgMHgwMCwgMHhDQiwgMHg4MywgMHgwRSwgMHhBMywgMHhBNywgMHg4NCwgMHhGMiwgMHhBMywgMHg3QSwgMHhEQywKKwkgMHhGRSwgMHgxQywgMHgwMywgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHgwQSwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBNywgMHg4NCwKKwkgMHg3QSwgMHg2MSwgMHg3QSwgMHhEQywgMHhGRSwgMHgxQywgMHhGOSwgMHgxRCwgMHg3QywgMHhBOCwgMHhEOSwgMHg4MSwgMHhGNiwgMHgwMywgMHhGRiwgMHhCMSwKKwkgMHgwQiwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwKKwkgMHg2QywgMHg0NCwgMHg1QSwgMHhEQSwgMHhDRCwgMHg4MSwgMHg2NCwgMHg0MCwgMHg0NiwgMHg0NSwgMHgyOCwgMHg0NCwgMHg0MCwgMHgyQiwgMHgwRSwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwQiwgMHgwMCwgMHgwMSwgMHhBMiwgMHg2MiwgMHg0NCwgMHg0NiwgMHg0NSwgMHgyMSwgMHg0NiwgMHgwMCwgMHhGNCwKKwkgMHgwMiwgMHg2MiwgMHg5QSwgMHhGRiwgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHg3QSwgMHhEQywgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwKKwkgMHgyNCwgMHg3NiwgMHhBRCwgMHhFMiwgMHg0MSwgMHhFMSwgMHg5OCwgMHhGRiwgMHgwMCwgMHhFNiwgMHgwMSwgMHhGMiwgMHg2MSwgMHg0NSwgMHhENCwgMHg5RSwKKwkgMHgyMSwgMHg0NiwgMHgxNiwgMHhGQSwgMHgyNSwgMHg0NCwgMHgwNiwgMHhGQSwgMHhBMSwgMHhGRiwgMHg4QywgMHg0NCwgMHhBMSwgMHhGRiwgMHg0NywgMHhGRiwKKwkgMHgyOSwgMHg0MCwgMHg1MCwgMHgyQiwgMHgwNiwgMHgwMCwgMHgyQiwgMHg0NCwgMHgxQywgMHg2MCwgMHgxMSwgMHhGQiwgMHg3MCwgMHg0NSwgMHg0NCwgMHg4QiwKKwkgMHgwMSwgMHgwMCwgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHg2OSwgMHhFMiwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMiwgMHg2MSwgMHg0NSwgMHhENCwgMHg5RSwKKwkgMHgyMSwgMHg0NiwgMHgxNiwgMHhGQSwgMHgyNSwgMHg0NSwgMHg4NiwgMHhGOCwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0NCwgMHg0MCwgMHgyQiwgMHgwMywgMHgxNSwKKwkgMHhBRiwgMHg2MCwgMHhGMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyOSwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwNCwgMHgwMCwgMHgwNCwgMHg3NCwgMHhDRCwgMHhFMiwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2QywgMHg0NCwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhDNCwgMHhFMiwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwKKwkgMHgwNSwgMHg3NiwgMHhBRCwgMHhFMiwgMHg0MSwgMHhFMSwgMHhBMSwgMHhGRiwgMHg2QywgMHg0NSwgMHhBMSwgMHhGRiwgMHg2NSwgMHg0MSwgMHg3RiwgMHg2MCwKKwkgMHg3RiwgMHg3QywgMHg2QywgMHg0NCwgMHhBMCwgMHg4NCwgMHgxNSwgMHhBNywgMHgxNSwgMHhBNCwgMHgyMSwgMHg0NiwgMHgyNiwgMHhGQSwgMHgyMiwgMHg0NiwKKwkgMHgxMCwgMHhGQSwgMHgyMSwgMHg0NiwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwNywgMHgwMCwgMHhCNiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHg2QywgMHg0NCwgMHgxQSwgMHhGQSwgMHgwOSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgwRiwgMHhCNCwgMHgwNiwgMHhBOCwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgwOCwgMHgyOCwgMHg3QywgMHg0NSwgMHgyOSwgMHg0NCwgMHgzNCwgMHg4OSwgMHgwMCwgMHg2NCwgMHgzMywgMHhGQiwgMHg0MCwgMHgyMSwKKwkgMHgwMCwgMHgwMCwgMHhBQywgMHhFMiwgMHgwNSwgMHhFMSwgMHgyNywgMHhGMCwgMHg2NSwgMHg0NCwgMHg2NCwgMHg1RSwgMHgyNywgMHhGQSwgMHgyOCwgMHg0NCwKKwkgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgzOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzQSwgMHgwNCwgMHgwMCwKKwkgMHgyNCwgMHg0NCwgMHhGRiwgMHg2MCwgMHhERiwgMHhCNCwgMHg0MCwgMHg0NCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyNiwgMHhFMiwgMHgwMCwgMHgzMSwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0MCwgMHg1MCwgMHgzQSwgMHhEQywgMHgwMCwgMHgyNCwgMHg0NCwgMHgyMCwgMHgyQSwgMHhEOSwgMHgwMCwKKwkgMHgyOSwgMHg0MCwgMHg1MCwgMHgyQiwgMHgwRCwgMHgwMCwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgzMSwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwNiwgMHgwMCwgMHgxQywgMHg2MCwgMHgxMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NSwgMHgyQiwgMHg0NCwgMHgwNiwgMHgwNSwKKwkgMHgyQiwgMHg0NCwgMHhGRiwgMHhBNCwgMHgwMSwgMHhBNCwgMHgwNCwgMHgyNCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QiwgMHhBQywgMHg4MCwgMHgyOCwgMHg0MCwKKwkgMHhCNCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMywgMHgzMCwgMHhGQiwgMHhCQywgMHgwMCwgMHgyOCwgMHg0NCwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHhBNCwgMHg4NCwgMHg0MCwgMHg0OCwgMHgyQiwgMHg1MCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgwOCwgMHhFMSwgMHgxQywgMHhGMiwKKwkgMHhDNCwgMHhFMiwgMHg0MCwgMHg0NSwgMHgyOCwgMHg0MCwgMHhDNCwgMHgzNiwgMHg5QywgMHgwMCwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHg0OCwgMHgwMCwKKwkgMHgzMiwgMHg2MCwgMHhGQSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHgyMCwgMHgwMCwgMHgwRiwgMHgzNiwgMHgxQiwgMHgwMCwgMHgwQSwgMHgzNiwKKwkgMHgxNiwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxMSwgMHgwMCwgMHgwOSwgMHgzNiwgMHgwQywgMHgwMCwgMHgwRCwgMHgzNiwgMHgwNywgMHgwMCwgMHgwOCwgMHgzNiwKKwkgMHgwMiwgMHgwMCwgMHhBMywgMHhEMywgMHgxNSwgMHgwMCwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywgMHgxMiwgMHgwMCwgMHgwNCwgMHhBMywgMHhBMywgMHhEMywKKwkgMHgwRiwgMHgwMCwgMHgwNiwgMHhBMywgMHhBMywgMHhEMywgMHgwQywgMHgwMCwgMHgwOCwgMHhBMywgMHhBMywgMHhEMywgMHgwOSwgMHgwMCwgMHgwQSwgMHhBMywKKwkgMHhBMywgMHhEMywgMHgwNiwgMHgwMCwgMHgwQywgMHhBMywgMHhBMywgMHhEMywgMHgwMywgMHgwMCwgMHgwRSwgMHhBMywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgyQywgMHg2MCwgMHg3QywgMHg2MywgMHg2MCwgMHg0MCwgMHgwQywgMHgzNiwgMHgxOSwgMHgwMCwgMHgwOCwgMHgzNiwgMHgxNSwgMHgwMCwgMHgwRCwgMHgzNiwKKwkgMHgxMSwgMHgwMCwgMHgwOSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgwRSwgMHgzNiwgMHgwOSwgMHgwMCwgMHgwQSwgMHgzNiwgMHgwNSwgMHgwMCwgMHgwRiwgMHgzNiwKKwkgMHgwMSwgMHgwMCwgMHgzOSwgMHgwMCwgMHgwMiwgMHhBMywgMHgzNywgMHgwMCwgMHgwNCwgMHhBMywgMHgzNSwgMHgwMCwgMHgwNiwgMHhBMywgMHgzMywgMHgwMCwKKwkgMHgwOCwgMHhBMywgMHgzMSwgMHgwMCwgMHgwQSwgMHhBMywgMHgyRiwgMHgwMCwgMHgwQywgMHhBMywgMHgyRCwgMHgwMCwgMHgwRSwgMHhBMywgMHgyQiwgMHgwMCwKKwkgMHgzMywgMHg2MCwgMHgwQSwgMHg2MywgMHgyNSwgMHg0NCwgMHgwQSwgMHgzNiwgMHgwQywgMHgwMCwgMHgxNCwgMHgzNiwgMHgwNywgMHgwMCwgMHgzNywgMHgzNiwKKwkgMHgwMiwgMHgwMCwgMHhBMywgMHhEMywgMHgwOSwgMHgwMCwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywgMHgwNiwgMHgwMCwgMHgwNCwgMHhBMywgMHhBMywgMHhEMywKKwkgMHgwMywgMHgwMCwgMHgwNiwgMHhBMywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg0MCwgMHg0NSwgMHgwQSwgMHgzNiwgMHgwRCwgMHgwMCwgMHgxNCwgMHgzNiwKKwkgMHgzOCwgMHg2NCwgMHgzNywgMHgzQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgxNSwgMHg2NCwgMHg2RSwgMHgzQSwgMHgwOSwgMHgwMCwKKwkgMHg4NCwgMHg3RiwgMHg0MCwgMHg0NSwgMHgwQiwgMHg2NCwgMHgwNSwgMHgwMCwgMHgyOSwgMHg0NCwgMHg3RiwgMHg2MCwgMHhGRiwgMHhCNCwgMHg0MCwgMHg0OSwKKwkgMHg3MCwgMHg2NCwgMHg0MCwgMHg0RCwgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwQSwgMHgwMCwgMHgyQywgMHg2MCwgMHg3NCwgMHg2MywgMHgwQSwgMHgzNiwKKwkgMHgwNiwgMHgwMCwgMHgxNCwgMHgzNiwgMHgwMiwgMHhBMywgMHgzNywgMHgzNiwgMHgwNCwgMHhBMywgMHg2RSwgMHgzNiwgMHgwNiwgMHhBMywgMHgyOCwgMHhBMywKKwkgMHhBMywgMHhEMSwgMHhEOCwgMHhBMywgMHgxOSwgMHg2MCwgMHg1NSwgMHhGOSwgMHgzOSwgMHhGMSwgMHhBMywgMHhEMSwgMHg2NCwgMHg0MSwgMHg2NCwgMHg1RSwKKwkgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NywgMHgxRiwgMHhCNCwgMHg1NCwgMHg5NCwgMHhFMCwgMHhBMCwgMHgwMiwgMHgwRCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMCwKKwkgMHgwMSwgMHgwNCwgMHgxRiwgMHg2NCwgMHg2MCwgMHg0NywgMHhCNCwgMHg4NSwgMHgyOSwgMHg0NCwgMHhDMCwgMHg2MCwgMHgwMCwgMHhCNCwgMHhCNCwgMHg4NCwKKwkgMHgxRiwgMHhGQSwgMHhCNSwgMHhGRiwgMHhBMSwgMHhGRiwgMHhDQiwgMHhGMywgMHhDNCwgMHhFMiwgMHg4OSwgMHhGRiwgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwKKwkgMHhEQywgMHg4NCwgMHhFMCwgMHg5NCwgMHhGRiwgMHg2MCwgMHhDRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHhBNSwgMHg2MCwgMHg4OCwgMHg3OCwKKwkgMHgwNCwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHhBMSwgMHhGRiwgMHhGRiwgMHg2MCwgMHhDRiwgMHg2NSwgMHgyOSwgMHg0NCwKKwkgMHgyNCwgMHg4OSwgMHhDQiwgMHhGMywgMHhDNCwgMHhFMiwgMHg4OSwgMHhGRiwgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwgMHhEQywgMHg4NCwgMHhFMCwgMHg5NCwKKwkgMHgyNiwgMHg0NCwgMHg4NCwgMHhCQywgMHgyNCwgMHg0MCwgMHgwQywgMHgyMiwgMHhGRCwgMHhCNCwgMHg0MCwgMHg0NiwgMHgyMywgMHg2NCwgMHgzQSwgMHhEQiwKKwkgMHhBRCwgMHg2MCwgMHg0RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MCwgMHgyNiwgMHgyMiwgMHgwNSwgMHgwMCwgMHhGOCwgMHhCNCwgMHg0MCwgMHg0NywKKwkgMHgwNiwgMHg2NCwgMHgzMSwgMHhGQiwgMHhDMCwgMHhGRSwgMHgyOSwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwNCwgMHg3NCwgMHhDRCwgMHhFMiwKKwkgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHgwMSwgMHgxMSwgMHgxMiwgMHgwMCwgMHgyOSwgMHg0NCwgMHgyMCwgMHhCQywKKwkgMHg0MCwgMHg0OSwgMHgwMSwgMHg2NCwgMHgzMywgMHhGQiwgMHhCNiwgMHhGRiwgMHgwMCwgMHhFMSwgMHgwMSwgMHg2MCwgMHgxQSwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHg2QywgMHg0MCwgMHhGQywgMHgxMSwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwgMHhBRSwgMHg0RiwgMHhGNywgMHhCNCwgMHhBMCwgMHg1RSwKKwkgMHhCNSwgMHhGRiwgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHg3QywgMHg0QiwKKwkgMHgyOSwgMHg0MCwgMHg1MCwgMHgyQiwgMHgxQiwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwRCwgMHgwMCwgMHgxQywgMHg2MCwgMHgxMSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NSwgMHgyQiwgMHg0NCwgMHgwNywgMHgwNCwgMHg3MCwgMHg0NSwgMHhDNCwgMHg4NCwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgxMSwgMHgwMCwgMHgyQiwgMHg0NCwgMHg3MCwgMHg0NSwgMHhDNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNCwKKwkgMHgwMCwgMHhCNCwgMHg0MCwgMHg0QiwgMHhFRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyOSwgMHg0NCwgMHgyNCwgMHg4OSwgMHgzNywgMHhGMywgMHgyQiwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyOCwgMHg2NSwgMHg0NCwgMHg2MCwgMHg1MCwgMHhBMCwgMHg0QywgMHgyMCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHgwMCwgMHg2MCwgMHgyRSwgMHg3QywgMHg3NCwgMHg0NCwgMHhDMCwgMHg5NCwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxOSwgMHgwMCwKKwkgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHgwQywgMHhCNCwgMHgwNCwgMHgzNiwgMHgxMywgMHgwMCwgMHgyNiwgMHg0MywgMHhGRCwgMHhCMywKKwkgMHgwNCwgMHhCQiwgMHg0MywgMHg0NiwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyOCwgMHg0NywgMHg0MCwgMHhCRiwgMHg0MCwgMHg0OCwgMHgwQSwgMHhCQiwKKwkgMHgwRiwgMHhGQywgMHg1MCwgMHg0QiwgMHg2NywgMHg1MCwgMHgwMCwgMHg2NCwgMHgzMCwgMHhGQiwgMHgwNSwgMHhGRiwgMHhBRCwgMHg2MCwgMHg0RiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNCwgMHg2NCwgMHgzQSwgMHhEQiwgMHgyOCwgMHg0NCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHhBMywgMHg2MCwgMHhFNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyQSwgMHgxQywgMHgwMCwgMHgyOCwgMHg0NCwgMHgwQywgMHhCMCwgMHgwOCwgMHgzQSwgMHgxOCwgMHgwMCwKKwkgMHgyQywgMHhGMCwgMHgyMiwgMHhGMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxMCwgMHgwMCwKKwkgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHgwRCwgMHgwMCwgMHgzOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzQSwgMHgwOCwgMHgwMCwKKwkgMHgyNiwgMHg0NCwgMHhGRCwgMHhCNCwgMHgwNCwgMHhCQywgMHg0MCwgMHg0NiwgMHhGQywgMHhCNCwgMHgwRiwgMHhGQSwgMHgwNSwgMHhGRiwgMHgwMSwgMHgwMCwKKwkgMHgxRCwgMHhGRiwgMHgwMSwgMHhFMiwgMHgyNiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNiwgMHgwMCwgMHgyQywgMHg2MCwgMHhFQSwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHhBMywgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwQSwgMHhBMywgMHg2MCwKKwkgMHhGNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHg1MSwgMHhGQiwgMHgxQiwgMHg2MCwgMHhFRSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwKKwkgMHhBRSwgMHg0RiwgMHgwOCwgMHhCQywgMHgwMCwgMHg3RiwgMHhBMCwgMHg1RSwgMHhFMSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwKKwkgMHg1NCwgMHg2MiwgMHgyMiwgMHg0NiwgMHhBMiwgMHhEMCwgMHgxNiwgMHg2MywgMHg3QywgMHg0MSwgMHg0NCwgMHg0OCwgMHg4MCwgMHgzNiwgMHgwNCwgMHg2MSwKKwkgMHgyOCwgMHg0MCwgMHg1MCwgMHgzNiwgMHgwNCwgMHg2MSwgMHg0MSwgMHg0RSwgMHgyOCwgMHg0NCwgMHhBNCwgMHgzNiwgMHgwRSwgMHg2MywgMHg5QSwgMHhGRiwKKwkgMHhBMSwgMHhGRiwgMHgxOSwgMHg2MCwgMHhBMywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHgzRCwgMHhGMiwKKwkgMHhBQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCNCwgMHg4NCwgMHgwOCwgMHgzNiwgMHgyQSwgMHhGQSwgMHgxMiwgMHg3NCwgMHhDRCwgMHhFMiwgMHg1NCwgMHg2MiwKKwkgMHhBMiwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2QSwgMHg0MCwgMHg4MCwgMHg0RSwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwKKwkgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwKKwkgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxRCwgMHhCMiwgMHgwMCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwKKwkgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHgyOCwgMHg0MCwgMHgwMywgMHgyQiwKKwkgMHgwNiwgMHgwMCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3MCwgMHg2MiwKKwkgMHgyOCwgMHg0NCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwKKwkgMHgxNiwgMHgwMCwgMHg3MiwgMHg2MiwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhEMiwgMHgxMiwgMHg3NCwgMHg4MCwgMHg0QywgMHgyMCwgMHgyQiwKKwkgMHgwNSwgMHgwMCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwNCwgMHgwMCwgMHgyNiwgMHgyNiwgMHg0RCwgMHgwMCwgMHgyNiwgMHgyNywgMHg0QiwgMHgwMCwgMHgyMywgMHg0MywKKwkgMHhGRiwgMHhGRiwgMHgwNiwgMHgxRCwgMHgyRSwgMHgxRSwgMHgwMCwgMHgwMCwgMHgwMywgMHhGMCwgMHgwNCwgMHhGNCwgMHg2NCwgMHg0MiwgMHgzRCwgMHgwMCwKKwkgMHgyRSwgMHg0MCwgMHgwNCwgMHgyQSwgMHgyNywgMHgwMCwgMHhBMSwgMHhGRiwgMHgwMiwgMHhGRSwgMHgxMCwgMHgyNSwgMHg0MiwgMHhGRSwgMHgxMiwgMHg3NCwKKwkgMHg3MiwgMHg0NSwgMHg2NSwgMHg0QywgMHhCMiwgMHhGMywgMHgwMywgMHgwNCwgMHhFNCwgMHhFMiwgMHhEQywgMHg4NCwgMHhCMiwgMHhGQiwgMHhBMSwgMHhGRiwKKwkgMHgxMiwgMHg3NCwgMHg4MCwgMHg0QywgMHgxMiwgMHg3NCwgMHhCMywgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCMywgMHhGQiwgMHg4MCwgMHg0QywKKwkgMHgxMiwgMHg3NCwgMHhCNCwgMHhGMywgMHgwMiwgMHgwNCwgMHhEQywgMHg4NCwgMHhCNCwgMHhGQiwgMHg4MCwgMHg0QywgMHgxMiwgMHg3NCwgMHg1QywgMHg0RSwKKwkgMHhGOCwgMHhBMywgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwgMHhGRiwgMHhCMSwgMHhGOCwgMHhBMSwgMHgwNiwgMHhBNCwgMHg2MCwgMHg0MiwKKwkgMHgwQSwgMHgwMCwgMHg0RSwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwgMHhDOCwgMHg4MiwgMHhGRiwgMHhCMSwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGRiwgMHhCMSwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHhGRCwgMHgxQywgMHhGOSwgMHgxRCwgMHhGRiwgMHhCMSwKKwkgMHgxQiwgMHgxRSwgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHhEQSwgMHg4MiwgMHhEQSwgMHg4MiwgMHhBMiwgMHhEMiwgMHhBMSwgMHhGRiwgMHgwOSwgMHg3NCwKKwkgMHg2MCwgMHg0RCwgMHgxMiwgMHgwMCwgMHgwMywgMHhGMiwgMHg5QSwgMHhGMiwgMHgwNCwgMHhGNCwgMHgyMywgMHg0MywgMHhBMSwgMHhGRiwgMHgxMiwgMHg3NCwKKwkgMHhBMCwgMHhEMiwgMHhGRSwgMHhBMSwgMHhDQiwgMHg4MywgMHg2MCwgMHg0RSwgMHhBRiwgMHg4MywgMHgwMywgMHgxRCwgMHgwNSwgMHgwMywgMHgxMiwgMHg3NCwKKwkgMHhFQiwgMHgwMSwgMHhBMSwgMHhGRiwgMHgxMiwgMHg3NCwgMHhERiwgMHgwMSwgMHgxMiwgMHg3NCwgMHhEQSwgMHg4MywgMHg2NiwgMHg0NCwgMHgyMiwgMHg0NiwKKwkgMHgwQywgMHhGQSwgMHgyMiwgMHhGMiwgMHgwQiwgMHhGQywgMHgyOCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxQSwgMHgwMCwgMHgxMCwgMHgyNiwgMHgwNCwgMHgwMCwKKwkgMHgyNiwgMHgyNiwgMHgwRiwgMHgwMCwgMHgyNiwgMHgyNywgMHgwRCwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHhBMSwgMHhGRiwgMHgxMiwgMHg3NCwKKwkgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwgMHg3QSwgMHhENCwgMHgxMiwgMHg3NCwKKwkgMHgwNywgMHgwMCwgMHhBMSwgMHhGRiwgMHgxMiwgMHg3NCwgMHg5QywgMHg0RSwgMHgxMiwgMHg3NCwgMHg5QywgMHg0QywgMHgxMiwgMHg3NCwgMHgwMCwgMHgwMCwKKwkgMHg4OCwgMHhGRiwgMHhBMSwgMHhGRiwgMHhCMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MCwgMHgxOCwgMHhFMSwKKwkgMHg3OCwgMHg0NCwgMHgwMiwgMHhBNCwgMHgzNSwgMHhGQiwgMHhDQywgMHgwMCwgMHgyOSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0OSwgMHgzNCwgMHg2NCwKKwkgMHgzQSwgMHhEQiwgMHg0NCwgMHhFMSwgMHhBNSwgMHg2MCwgMHg1NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2QiwgMHhCQywgMHhGRiwgMHgxNSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgxNSwgMHhGQiwgMHg3OCwgMHg1QywgMHgwNywgMHgwMCwgMHg3OCwgMHg1QywgMHgyRiwgMHgwMCwgMHg2MiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHg5OCwgMHhGRiwgMHg4MCwgMHgzRSwgMHg4MCwgMHg2MCwgMHgwMSwgMHhFMCwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywKKwkgMHhBMSwgMHhGMywgMHg0MCwgMHg2MCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHg0OCwgMHg2MCwgMHg1RSwgMHg2NSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4MCwgMHg2MCwgMHgwMSwgMHhFMCwKKwkgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHhBMSwgMHhGMywgMHg3QywgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHgwMiwgMHg2NSwgMHg4QywgMHg2MCwKKwkgMHg0OCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHg3RiwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4NCwgMHg2MCwgMHgwNCwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg0OCwgMHg2MCwgMHgwOCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4NCwgMHg2MCwgMHgwNCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg0MCwgMHg2MCwgMHgwOCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4QywgMHg2MCwgMHg0OCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHg3NCwgMHg2QSwgMHg0MCwgMHg4NywgMHg0RiwKKwkgMHgxMiwgMHg3NCwgMHg4NywgMHg0QywgMHgxMiwgMHg3NCwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwOCwgMHgwMCwgMHgwQSwgMHg2NCwgMHg4OSwgMHhGRiwKKwkgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg4NywgMHg0RCwgMHgxMiwgMHg3NCwgMHg4NywgMHg0RCwgMHgwOSwgMHgwMCwgMHgwMywgMHg2NCwgMHg4OSwgMHhGRiwKKwkgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwgMHg4NywgMHg0RiwgMHgxMiwgMHg3NCwgMHg4NywgMHg0RCwgMHgxMiwgMHg3NCwgMHg4NywgMHg0RCwgMHg3QywgMHg0NCwKKwkgMHgwMSwgMHgwOCwgMHgwMSwgMHgwMCwgMHg2NywgMHg0NCwgMHgxMiwgMHg3NCwgMHg4NywgMHg0QywgMHgxMiwgMHg3NCwgMHg4NywgMHg0QywgMHgxMiwgMHg3NCwKKwkgMHg4NywgMHg0QywgMHgxMiwgMHg3NCwgMHg4NywgMHg0RCwgMHgxMiwgMHg3NCwgMHg4NywgMHg0RCwgMHgxMiwgMHg3NCwgMHg4NywgMHg0RCwgMHgxMiwgMHg3NCwKKwkgMHgwNCwgMHgyMSwgMHgwNCwgMHgwMCwgMHhGRiwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwgMHgyQSwgMHgwRCwgMHgwMCwKKwkgMHgwQywgMHgwMCwgMHhCQywgMHhGRiwgMHg2MSwgMHhGRiwgMHg3OCwgMHg1QywgMHg1NywgMHgwMSwgMHg3OCwgMHg1QywgMHg3RiwgMHgwMSwgMHhCNiwgMHhGRiwKKwkgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHg3QywgMHg0QiwgMHg2QSwgMHg0NCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHg3NCwgMHhDNCwgMHhFMiwgMHgwNCwgMHhFMSwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHhCQywgMHhGRiwgMHgxNCwgMHg3NCwgMHgwMSwgMHgwMCwgMHgwNCwgMHg3NCwgMHhDNCwgMHhFMiwgMHgwNCwgMHhFMSwgMHhCQywgMHhGRiwgMHhCNSwgMHhGRiwKKwkgMHg0NywgMHhGRiwgMHhCNiwgMHhGRiwgMHhCNywgMHhGRiwgMHhCNCwgMHhGRiwgMHhDOCwgMHg2MCwgMHgwOSwgMHg3RCwgMHg3QywgMHg0QiwgMHgyOSwgMHg0MCwKKwkgMHg0MCwgMHgyNywgMHgwNCwgMHgwMCwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhCQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHgyOSwgMHg0MCwKKwkgMHgxMCwgMHgyNiwgMHg2RCwgMHgwMCwgMHg4MCwgMHg2MCwgMHgwMSwgMHhFMCwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHhBMSwgMHhGMywgMHg0MCwgMHg2MCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHg0OCwgMHg2MCwgMHg1RSwgMHg2NSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwKKwkgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHg4MCwgMHg2MCwgMHgwMSwgMHhFMCwgMHhENSwgMHg2MCwgMHg4NCwgMHhFNywgMHhBMSwgMHhGMywgMHg3QywgMHg0NSwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHgwMiwgMHg2NSwgMHg4QywgMHg2MCwgMHg0OCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHg3RiwgMHg2QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4NCwgMHg2MCwgMHgwNCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg0OCwgMHg2MCwKKwkgMHgwOCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHg4NCwgMHg2MCwgMHgwNCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg0MCwgMHg2MCwgMHgwOCwgMHg2QSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg2NSwgMHg0QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg4QywgMHg2MCwgMHg0OCwgMHg2QSwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwKKwkgMHgwMCwgMHg2MCwgMHgwMCwgMHg2QSwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxNiwgMHhGRSwgMHgwMSwgMHg5NSwgMHg2MCwgMHg4NCwgMHhFNywgMHgwMSwgMHg2MCwKKwkgMHgwOCwgMHhFMSwgMHhGRiwgMHhGRiwgMHhDNCwgMHhFMiwgMHgyOSwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwNCwgMHgwMCwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhCQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhDQiwgMHhGMywKKwkgMHhDNCwgMHhFMiwgMHg4OSwgMHhGRiwgMHg2MCwgMHg1NCwgMHg4OCwgMHhGRiwgMHhEQywgMHg4NCwgMHhFMCwgMHg5NCwgMHgzNSwgMHhGNywgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxMCwgMHg2MSwgMHg3RiwgMHg2MCwgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywKKwkgMHgyNSwgMHgwMiwgMHg5OCwgMHhGRSwgMHgxOSwgMHgwNSwgMHgxMiwgMHg2MCwgMHhGQywgMHhGNSwgMHgwRSwgMHhGMiwgMHgxNSwgMHgxOCwgMHgwMiwgMHgxOCwKKwkgMHgwOSwgMHhGNCwgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwgMHgxMSwgMHhGQiwKKwkgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyOCwgMHhCOSwgMHgxMCwgMHg3RSwKKwkgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NywgMHgwQSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGQiwgMHhBMCwKKwkgMHg3RiwgMHg2NywgMHgwNywgMHg2MywgMHgwMywgMHgwNSwgMHg0NSwgMHg0MCwgMHgwMCwgMHg2NywgMHhEOCwgMHhGRSwgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwKKwkgMHgwQSwgMHg3RSwgMHgwNCwgMHhGQiwgMHg2MSwgMHg1NSwgMHg0OCwgMHgwMCwgMHgyOCwgMHhGQiwgMHgwMSwgMHhGMywgMHgyOSwgMHhGQiwgMHg0NCwgMHg0NiwKKwkgMHg0MCwgMHg0NSwgMHgxMCwgMHg2MSwgMHg3RSwgMHg2MCwgMHhDMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg3RiwgMHg2NywgMHgwMiwgMHg2MywgMHgzMCwgMHgwMiwKKwkgMHhCNSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhDRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2NywgMHgwMywgMHg2MywgMHgyOSwgMHgwMiwgMHgyNiwgMHg0MCwKKwkgMHgwMSwgMHgyQiwgMHgyMywgMHgwMCwgMHg5OCwgMHhGRSwgMHgxOCwgMHgwNSwgMHgxMiwgMHg2MCwgMHhGQywgMHhGNSwgMHgwRSwgMHhGMiwgMHgxNCwgMHgxOCwKKwkgMHgwMiwgMHgxOCwgMHgwOSwgMHhGNCwgMHhGQiwgMHgwMSwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHgwOCwgMHg3RSwgMHgwQSwgMHgwMiwgMHg2NiwgMHg0NCwKKwkgMHgxMSwgMHhGQiwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwOCwgMHhCOSwKKwkgMHgxMCwgMHg3RSwgMHgwMCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgwOSwgMHgwMCwgMHgyMCwgMHg0NCwgMHhEQywgMHg4NSwgMHgwRiwgMHhCNCwgMHhGQiwgMHhBMCwKKwkgMHg3RiwgMHg2NywgMHgwNywgMHg2MywgMHgwNSwgMHgwNSwgMHg0NSwgMHg0MCwgMHhEOCwgMHhGRSwgMHgwMCwgMHg2NywgMHhEMCwgMHhGRSwgMHhEOSwgMHhGRSwKKwkgMHhGRiwgMHgyNywgMHgwNSwgMHhGRCwgMHgwQiwgMHg3RSwgMHgwNCwgMHhGQiwgMHgwRSwgMHg2MCwgMHhERCwgMHhGMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwKKwkgMHg4MCwgMHhCQywgMHgwOCwgMHgyOCwgMHhBMiwgMHhEQiwgMHg2MSwgMHg1NSwgMHg2NiwgMHgwMCwgMHgwNCwgMHhCNSwgMHg4MiwgMHhCNSwgMHgyNSwgMHgwMiwKKwkgMHgwNCwgMHgwMywgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHhBMywgMHhEMywgMHg5OSwgMHhGRSwgMHgwNCwgMHgwNCwgMHgwMiwgMHhCQywKKwkgMHhGRSwgMHhCNCwgMHhBMywgMHhEQiwgMHg1OSwgMHgwMCwgMHhEQiwgMHhGMywgMHgyMCwgMHg0MCwgMHg4MCwgMHgyNiwgMHg1NSwgMHgwMCwgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhBMCwgMHhGOCwgMHhCNCwgMHgwMiwgMHgwMiwgMHhBMywgMHhEQiwgMHgxQywgMHgwMCwgMHgwNCwgMHhCQywgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwKKwkgMHgwOCwgMHhCMCwgMHgwMSwgMHg2NCwgMHgwOCwgMHgyNCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhGQiwgMHgyMCwgMHg0NCwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHhEMCwgMHhGRSwgMHg0MiwgMHgwMCwgMHhCRiwgMHhCNCwgMHhBMywgMHhEQiwgMHgzRiwgMHgwMCwgMHg0MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHgwMiwKKwkgMHhGOCwgMHhCNCwgMHhBMywgMHhEQiwgMHgwOCwgMHhCNSwgMHgwNywgMHg3QywgMHgwMSwgMHgwMiwgMHhEQiwgMHhGOSwgMHgyMCwgMHg0NCwgMHg3RiwgMHhCNCwKKwkgMHg0MCwgMHg0MCwgMHgxRCwgMHg2MCwgMHhCQSwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCNSwgMHgwNywgMHhCNSwgMHgwOCwgMHgyOCwKKwkgMHhDNCwgMHgwMiwgMHg5OSwgMHhGRSwgMHgyOSwgMHgwNSwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgyNiwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhERiwgMHhCNCwgMHg0MCwgMHg0MCwgMHg3NCwgMHgwMCwgMHg0MCwgMHgyQSwgMHgxRiwgMHgwMCwgMHhCRiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgwOSwgMHgwMCwKKwkgMHhBOCwgMHhGRiwgMHgyMCwgMHg0NCwgMHg5OSwgMHhGRSwgMHgwMiwgMHgwNSwgMHg4MCwgMHgyQSwgMHgwMywgMHgwMCwgMHg0MCwgMHhCQywgMHg0MCwgMHg0MCwKKwkgMHgxMywgMHgwMCwgMHgwMCwgMHhGMSwgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwQSwgMHgzNiwKKwkgMHgyOSwgMHgwMSwgMHgwQiwgMHgzNiwgMHg1OSwgMHgwMSwgMHgyOCwgMHhGQiwgMHgwMSwgMHhGMSwgMHgyOSwgMHhGOSwgMHgwMiwgMHhGMSwgMHgyQSwgMHhGOSwKKwkgMHgwMywgMHhGMSwgMHgyQiwgMHhGOSwgMHhEMCwgMHhGRSwgMHhBRSwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MiwgMHgzRSwgMHg3NSwgMHg0NCwKKwkgMHgwMiwgMHhCMCwgMHgwMSwgMHhCMCwgMHg1NCwgMHgwMiwgMHhEQywgMHgwMiwgMHgwNCwgMHhCMCwgMHgwOCwgMHhCMCwgMHgxMCwgMHgwMiwgMHgyQSwgMHgwMiwKKwkgMHg0MCwgMHgyNiwgMHhBNywgMHhGRiwgMHg4QywgMHhGRiwgMHg3NSwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNiwgMHgwMCwgMHhBQiwgMHhGRiwgMHgxOSwgMHg2MCwKKwkgMHhGNiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHg3NSwgMHg0NCwgMHg4RCwgMHhGRiwgMHhFNSwgMHgwMSwgMHgwQSwgMHhGMywKKwkgMHhBQSwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMiwgMHgwMCwgMHgzOCwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwKKwkgMHhDMCwgMHg2MCwgMHgwMCwgMHg3QywgMHhBMCwgMHg4NCwgMHg4MCwgMHgzQiwgMHgwMiwgMHgwMCwgMHhDMCwgMHg2NywgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NywgMHgwQSwgMHhGQiwgMHhEMCwgMHgwMSwgMHgxOSwgMHg2MCwgMHhGNiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwKKwkgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMSwgMHgwQiwgMHhGMSwgMHhBQiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhGRiwgMHgyNywgMHgxRiwgMHgwMCwgMHgyMCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg3NSwgMHgxQSwgMHgwMCwgMHgxOSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgwNCwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHgwQSwgMHg2NCwgMHhDQywgMHg4NCwgMHgxOSwgMHhGQiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg3NSwgMHg2NCwgMHg0MCwgMHgwMywgMHgyMiwKKwkgMHgwRCwgMHgwMCwgMHgyMCwgMHg0NCwgMHg4MCwgMHgyQSwgMHgwMywgMHgwMCwgMHgyMCwgMHhCQywgMHg0MCwgMHg0MCwgMHgwNywgMHgwMCwgMHhEOSwgMHhGRSwKKwkgMHg4MSwgMHg2MCwgMHgwQiwgMHg2NCwgMHgyOCwgMHhGQiwgMHgyQywgMHg0NCwgMHgyOSwgMHhGQiwgMHhEMCwgMHhGRSwgMHhBNSwgMHgwMSwgMHhBOSwgMHhGRiwKKwkgMHg3NywgMHg0NCwgMHg2MCwgMHg1NywgMHg0MCwgMHg0QSwgMHgwMSwgMHgyQSwgMHgzMSwgMHgwMCwgMHgyNCwgMHg0NCwgMHhBQywgMHg4NiwgMHgwOCwgMHhGMiwKKwkgMHgyRCwgMHgwMywgMHgyNSwgMHg2MCwgMHhGRSwgMHg2NSwgMHhENCwgMHg4MCwgMHgwRSwgMHhGMiwgMHgwMiwgMHgwMywgMHhBNSwgMHhENSwgMHgwNCwgMHgwMCwKKwkgMHgwMSwgMHhCQywgMHgwRSwgMHhGQSwgMHgwOSwgMHhGNCwgMHhEMSwgMHhGRSwgMHg0NiwgMHg0NCwgMHgxMSwgMHgxQiwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwKKwkgMHgxRCwgMHgwMCwgMHg5RCwgMHhGRSwgMHgxQiwgMHgwNSwgMHgxMywgMHg2MCwgMHgwMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwMywgMHgwMywgMHgwRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgxMiwgMHgxQiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg3NSwgMHgwRiwgMHgwMCwgMHgzRiwgMHhGMiwKKwkgMHg0OCwgMHg2NSwgMHhDNCwgMHg4NCwgMHgxMywgMHhGQiwgMHg2NiwgMHg0NCwgMHgxMCwgMHhGQiwgMHg2NiwgMHg0NywgMHgyMCwgMHhCRiwgMHgzQiwgMHg0MiwKKwkgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwgMHg0MSwgMHg3NSwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHgyQSwgMHg0NCwgMHgwOCwgMHgyQSwKKwkgMHgxNywgMHgwMCwgMHgyMywgMHg0NCwgMHgwMCwgMHhBOCwgMHg1QywgMHg0MywgMHgxMywgMHgwMywgMHgxMiwgMHg2MCwgMHhGQywgMHhGNSwgMHgwMSwgMHgwMCwKKwkgMHgwOSwgMHhGNCwgMHgwRSwgMHhGMiwgMHgwRCwgMHgxOCwgMHgwOCwgMHhCMCwgMHgxOCwgMHhBQywgMHhGQSwgMHgwMywgMHgwRSwgMHhGQSwgMHg2NiwgMHg0MywKKwkgMHgxMSwgMHhGRCwgMHg0NiwgMHg0MywgMHgyMywgMHg0NywgMHg4MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyOCwgMHg3NSwKKwkgMHgyQSwgMHg0NCwgMHgwNiwgMHgyMiwgMHgyRCwgMHgwMCwgMHgyMiwgMHg0NCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwRSwgMHhGMiwgMHgyOCwgMHgwMywKKwkgMHgxMCwgMHhCMCwgMHgwMSwgMHhCQywgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MiwgMHgyMiwgMHgwMCwgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwKKwkgMHgyNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg5NCwgMHgwMCwgMHg0NiwgMHg0MiwgMHgxOSwgMHgwMiwgMHgyMiwgMHg0NywKKwkgMHg0MCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMiwgMHg2NiwgMHg0MywgMHgwMCwgMHhBOCwgMHgwRSwgMHhGMiwKKwkgMHgwOCwgMHgwMiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHhFNCwgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwMiwgMHg3NSwKKwkgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHhEQywgMHgwMSwgMHgxMiwgMHhGRCwgMHgxMCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwNCwgMHg3NSwKKwkgMHgyQSwgMHg0NCwgMHg4MCwgMHgyQSwgMHgxOSwgMHgwMCwgMHgyMSwgMHg0NCwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgxNSwgMHgwMywgMHgwMSwgMHhCQywKKwkgMHgwRSwgMHhGQSwgMHhEMSwgMHhGRSwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0NywgMHg1OCwgMHg0RiwgMHg2QSwgMHgwMCwgMHg0NiwgMHg0MSwKKwkgMHgwQiwgMHgwMiwgMHgyMSwgMHg0NywgMHgxMCwgMHhCRiwgMHgzQiwgMHg0MiwgMHgwNCwgMHhBMiwgMHhBMiwgMHhEQiwgMHgwRSwgMHhGMiwgMHg2NiwgMHg0MywKKwkgMHgwOCwgMHhGRCwgMHgxMCwgMHhCQywgMHgwRSwgMHhGQSwgMHg4MCwgMHg3NSwgMHgyQSwgMHg0NCwgMHgxMCwgMHhCMCwgMHgyMCwgMHg0NCwgMHgxOCwgMHgwMywKKwkgMHg3RiwgMHhCNCwgMHg0MCwgMHg0MCwgMHgxRCwgMHg2MCwgMHhCQSwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhCMCwgMHg4MCwgMHhCMCwKKwkgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHg0MCwgMHhCQywgMHg3RiwgMHhCNCwgMHgwNCwgMHhCMCwgMHhBMywgMHhEQiwgMHgwMywgMHgwMywgMHgyMCwgMHg0NCwKKwkgMHg4MCwgMHhCQywgMHg0MCwgMHg0MCwgMHgyQSwgMHg0MCwgMHgwOCwgMHgyNywgMHgwMywgMHgwMCwgMHhCMywgMHg2MCwgMHhDOSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHg0MCwgMHgwOCwgMHgyQiwgMHgwRiwgMHgwMCwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgxOSwgMHg2MCwgMHhGNywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgxQiwgMHgwNywgMHgwMCwgMHgxOSwgMHg2MCwgMHhGNiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywgMHhBMiwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhGRiwgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOCwgMHhGRSwgMHgxNCwgMHgwNSwgMHhFQSwgMHhGRSwKKwkgMHgyMywgMHgwNSwgMHhFOSwgMHhGRSwgMHgxQywgMHgwNSwgMHhFNywgMHhGRSwgMHgwOSwgMHgwNSwgMHg0NywgMHhGRiwgMHgyMCwgMHg0NCwgMHgwRiwgMHgyMiwKKwkgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHg0MCwgMHg0MCwgMHgwRiwgMHgyMiwgMHhCOCwgMHhGRSwgMHhFQywgMHgwMSwgMHgyMywgMHg0MSwgMHgwMCwgMHhCOSwKKwkgMHg1QywgMHg0QSwgMHhFOCwgMHgwMiwgMHg1QSwgMHgwMSwgMHgyNCwgMHg0MSwgMHgwMCwgMHhCOSwgMHgyNSwgMHg2MCwgMHhGRSwgMHg2NSwgMHg0NSwgMHg0NywKKwkgMHhFMSwgMHgwMiwgMHg1OCwgMHg0RiwgMHgwRSwgMHgwMCwgMHhERSwgMHgwMiwgMHg1QywgMHg0QSwgMHg0NiwgMHg0NCwgMHgzOCwgMHgwMSwgMHgyMiwgMHg0MSwKKwkgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHhENywgMHgwMiwgMHg2QywgMHgwMSwgMHgyMSwgMHg0MSwgMHgwMCwgMHhCOSwgMHg1QywgMHg0QSwgMHg5MiwgMHgwMywKKwkgMHhEMSwgMHgwMSwgMHgyNywgMHhEMywgMHgwMywgMHgwMCwgMHgxMCwgMHhCMCwgMHgwOSwgMHhGMiwgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwKKwkgMHhGQSwgMHgwMiwgMHgwOCwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwgMHgwQywgMHhGMywKKwkgMHgyNCwgMHg4NiwgMHgyNCwgMHg0NiwgMHg2MCwgMHg0MCwgMHhGQiwgMHgzQiwgMHgwNywgMHgwMCwgMHg4MCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgyMywgMHg0NiwKKwkgMHgwMywgMHg0QywgMHg0NiwgMHg2MSwgMHgzQSwgMHg2NSwgMHgwQywgMHgwMCwgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwgMHgwMiwgMHgwMCwKKwkgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwgMHg1QSwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHg2NiwgMHgwMCwgMHgwNCwgMHgwNSwKKwkgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRSwgMHhGQiwgMHgyRSwgMHhGNSwKKwkgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHhBQywgMHhGRiwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwOCwgMHgwMCwgMHgxOSwgMHg2MCwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHgwQywgMHg2NCwgMHgxMywgMHg2MCwgMHgxMywgMHhGQiwKKwkgMHgyRCwgMHhGRiwgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg4RSwgMHhGRiwgMHgwRiwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRSwgMHg2NSwKKwkgMHgyNCwgMHg4NiwgMHgwRCwgMHhGMywgMHgyNCwgMHg0NiwgMHg2MCwgMHg0MCwgMHhGQiwgMHgzQiwgMHgwNywgMHgwMCwgMHg4MCwgMHgyNiwgMHgwMiwgMHgwMCwKKwkgMHgyMywgMHg0NiwgMHgwMywgMHg0QywgMHg0NiwgMHg2MSwgMHgzQSwgMHg2NSwgMHgwQywgMHgwMCwgMHgyRSwgMHhGMywgMHg0MCwgMHg0NSwgMHhGOCwgMHgyQiwKKwkgMHgwMiwgMHgwMCwgMHg0MCwgMHg0NSwgMHgwMywgMHgwMCwgMHg1OCwgMHg0RiwgMHgyMSwgMHgwMCwgMHgwNywgMHgwMiwgMHg1OCwgMHg0RiwgMHgyRCwgMHgwMCwKKwkgMHgwNCwgMHgwNSwgMHg2NiwgMHg1MCwgMHg2NSwgMHg1MiwgMHg2MSwgMHg1MSwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NywgMHgwMCwgMHhCRiwgMHgwRiwgMHhGQiwKKwkgMHgyRSwgMHhGNSwgMHgwNSwgMHhGMCwgMHg4MCwgMHg2MCwgMHg2NCwgMHg1MCwgMHgwMCwgMHg3MiwgMHg3RSwgMHg3MSwgMHg4RCwgMHhGRiwgMHhBRCwgMHhGRiwKKwkgMHgzMSwgMHg0MCwgMHgwMSwgMHgyQSwgMHhDRSwgMHgwMSwgMHgxOSwgMHg2MCwgMHhGMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHgxOCwgMHgwQywgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgxMywgMHhGQiwgMHgyRCwgMHhGRiwgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwgMHhBNywgMHhGMSwKKwkgMHhBOCwgMHhGMSwgMHhEMCwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwNywgMHgwNCwgMHgwMSwgMHgwNiwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwgMHgwMSwgMHhGMCwKKwkgMHgwMywgMHg2NywgMHhBMCwgMHg4NSwgMHg5NCwgMHg4MCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NiwgMHgyNiwgMHg0MSwgMHg0NiwgMHg2MywKKwkgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCNSwgMHhENSwgMHg4MSwgMHgwMCwgMHhGMiwgMHgwNSwgMHgwNCwgMHgwNCwgMHg2MywgMHg2MCwgMHg0NiwKKwkgMHhGNywgMHgxQiwgMHg0MiwgMHhGRSwgMHgwRCwgMHgwMCwgMHg2MSwgMHg0NCwgMHhDNSwgMHg4MSwgMHg2MywgMHg0NSwgMHhDNSwgMHg4MSwgMHg5QywgMHg4NCwKKwkgMHhEQywgMHg4NCwgMHgwMSwgMHhGMiwgMHhGMCwgMHg4NSwgMHhGMCwgMHg4MCwgMHg2NSwgMHg0NCwgMHhGOCwgMHg4NSwgMHhGRiwgMHhGRiwgMHgwMiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgxMywgMHg2MCwgMHgwOCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwKKwkgMHgwNywgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwgMHgwOCwgMHhGRSwgMHgxNywgMHgwMCwKKwkgMHhBOSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEOCwgMHhBMCwgMHgwMCwgMHhCNCwgMHgxMiwgMHgwNiwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2MSwgMHg0MSwgMHg0QSwKKwkgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwgMHhBMiwgMHhGRiwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwKKwkgMHgwNiwgMHgwMywgMHgyQSwgMHg0MywgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MSwgMHg0QSwgMHg0MiwgMHhBMSwgMHgwMywgMHgwMCwgMHg0MSwgMHg0QSwgMHg3QywgMHhBMSwgMHgwRSwgMHhBMSwKKwkgMHhBMiwgMHhGRiwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHgyQSwgMHg0MywgMHhCNiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhGRSwgMHgwQywgMHgwMCwgMHgxMywgMHg2MCwgMHgwOCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhBQywgMHg4NiwgMHgwRSwgMHhGMiwgMHgwNiwgMHgwMywgMHgwMCwgMHhBOCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgwMSwgMHg2NywgMHgwRSwgMHhGQSwKKwkgMHgwOCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBQSwgMHhGMywgMHg3QywgMHg2MywgMHgwMCwgMHhCRSwgMHg0MCwgMHg0NSwKKwkgMHgxQSwgMHgwMywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NCwgMHhEQywgMHg4NSwgMHg4NCwgMHhBMSwgMHgwMCwgMHhGMiwgMHgwNiwgMHgwNiwgMHgwMSwgMHhGQywKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhGNywgMHgwMiwgMHg0MCwgMHg0NSwgMHgwRSwgMHgwMCwgMHhBOSwgMHhGMywgMHgwMCwgMHg2MywgMHhENCwgMHg4NCwKKwkgMHhBOSwgMHhGQiwgMHg4MCwgMHg2MCwgMHg3QywgMHg2NCwgMHgwMSwgMHhGQSwgMHgwMCwgMHhGMCwgMHgwMCwgMHhGQywgMHhEMywgMHg4MCwgMHhBQSwgMHhGOSwKKwkgMHgwMiwgMHgwMiwgMHhBQiwgMHhGOSwgMHgwOCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHgyNSwgMHg0NiwgMHgwNSwgMHhGQSwKKwkgMHgwNiwgMHhGQSwgMHgwMSwgMHhGMCwgMHgwMywgMHg2NywgMHgwMiwgMHhGQywgMHhCMCwgMHg4NCwgMHgzQSwgMHg3RSwgMHgwMSwgMHhGQSwgMHgxMiwgMHg2NCwKKwkgMHgwMywgMHhGQSwgMHgwMCwgMHhGMCwgMHgwNCwgMHhGOCwgMHgwMCwgMHg2NCwgMHgwQywgMHg2MSwgMHgxMCwgMHg2MywgMHg1OSwgMHhEQSwgMHhGRSwgMHgxRiwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwKKwkgMHgwMSwgMHgwMCwgMHhFQywgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQSwgMHhCRSwgMHhEMiwKKwkgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHhGQSwKKwkgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwOSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg0NCwKKwkgMHgwMCwgMHhBOCwgMHgwNywgMHg0QiwgMHgwQywgMHgwMywgMHg1OCwgMHg0RiwgMHgzMywgMHgwMCwgMHgwQiwgMHg0NywgMHgyNiwgMHg2MCwgMHgwNCwgMHg2NSwKKwkgMHgyNywgMHg0NCwgMHhENCwgMHg4MCwgMHgwMCwgMHg2NCwgMHgwMSwgMHgwMiwgMHgwRiwgMHhGQSwgMHg1OCwgMHg0RiwgMHhEMywgMHgwMSwgMHg3MCwgMHgwMCwKKwkgMHgyNSwgMHg0MywgMHhFMywgMHg4NCwgMHg3QywgMHg0MSwgMHgwMiwgMHgwNCwgMHhFOCwgMHg4MSwgMHhFQywgMHg2MywgMHg2MSwgMHg0NiwgMHhBMywgMHhEMiwKKwkgMHgwMCwgMHg3QywgMHg0MCwgMHg0NSwgMHhCRiwgMHhEOCwgMHhBMywgMHhEOCwgMHhCRSwgMHhEOCwgMHgyNywgMHg0MiwgMHg1QSwgMHhEMywgMHgyNSwgMHg1QywKKwkgMHg2MCwgMHg0MSwgMHgwMiwgMHgxQiwgMHgyNywgMHhEOSwgMHgwNSwgMHgwMCwgMHgyNSwgMHg0NiwgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyNSwgMHg0NCwKKwkgMHgwOSwgMHhGQSwgMHgyNSwgMHg0NCwgMHgyNywgMHg0MywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0NiwgMHgwOSwgMHhGMiwgMHgwOCwgMHhGQywgMHgwMCwgMHhBOCwKKwkgMHhERCwgMHg4MSwgMHhGQSwgMHgwMiwgMHhCRiwgMHhEMSwgMHg2NiwgMHg0NCwgMHhCRSwgMHhEQiwgMHhDMSwgMHg4NCwgMHhCRiwgMHhEQiwgMHg0OCwgMHgwMCwKKwkgMHgyNSwgMHg0NiwgMHhFQywgMHg2MywgMHgwOCwgMHhGMiwgMHg4OSwgMHhGMiwgMHgxRSwgMHgxOCwgMHg0MCwgMHg0NywgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NSwKKwkgMHgwMiwgMHgwNSwgMHhFOCwgMHg4MywgMHgwMCwgMHg2NSwgMHg2NSwgMHg0NiwgMHhCRiwgMHhEMiwgMHg2MSwgMHg1QywgMHhDQywgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHgyNSwgMHg0NiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhCOSwgMHg2NSwgMHg0NiwgMHgwOCwgMHgyNCwgMHhCRSwgMHhEQSwgMHgwMiwgMHgxQiwgMHhBMywgMHhEOCwKKwkgMHgwMiwgMHgwMCwgMHg2MCwgMHg0NiwgMHg4OSwgMHhGQSwgMHgwMCwgMHhCOSwgMHg2MSwgMHg0NiwgMHgwOCwgMHgyOCwgMHgwQSwgMHhGQSwgMHgyNSwgMHg0NiwKKwkgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywgMHg4OCwgMHhGQywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MSwgMHgyOCwgMHg2NSwgMHgyNSwgMHg0MywKKwkgMHhBQiwgMHhGMywgMHhBRiwgMHg4MywgMHgwMCwgMHhCRSwgMHgxOCwgMHgwMywgMHgwMiwgMHgwMywgMHgwMCwgMHhGQywgMHgwMSwgMHgwMCwgMHhBQSwgMHhGRCwKKwkgMHg2MywgMHg0NiwgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHgwMCwgMHhGMiwgMHgwNywgMHgwMiwgMHhBQiwgMHhGNSwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwKKwkgMHhERSwgMHg2MCwgMHhBRiwgMHg2NCwgMHgwOSwgMHhGQiwgMHgwOCwgMHgwMCwgMHg2NiwgMHg0MywgMHgwMCwgMHhCRSwgMHhERCwgMHg4MSwgMHhGMSwgMHgwMiwKKwkgMHhBOSwgMHhGMSwgMHhBQiwgMHhGRCwgMHhDMSwgMHg4NCwgMHhBOSwgMHhGQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NSwKKwkgMHgyOSwgMHg0MywgMHhGQywgMHhBMywgMHg2NiwgMHg0NCwgMHhCRCwgMHhEQiwgMHgyNSwgMHg0NCwgMHhCRCwgMHhEQiwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHgwMywgMHg2MSwgMHgwRSwgMHg2NSwgMHgyNiwgMHg2MCwgMHgxOCwgMHg2MywgMHg0MywgMHg0OSwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHgwMCwgMHhBOCwKKwkgMHhDRCwgMHg4MSwgMHgwNCwgMHgwMiwgMHhGOSwgMHgwMiwgMHhCMywgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgyNiwgMHhFNiwgMHgwMSwKKwkgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHhFMywgMHgwNSwgMHhGNiwgMHhBMywgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMSwgMHg0NCwgMHg0NywgMHg0NCwgMHg0OCwKKwkgMHg0NCwgMHg0NSwgMHgyNiwgMHg2MCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhDOCwgMHg2MywKKwkgMHgwRCwgMHg2NSwgMHgwMCwgMHg2MSwgMHg0MSwgMHg0OCwgMHhBMywgMHhEMywgMHgwNiwgMHhBMywgMHhBQywgMHg4NiwgMHgwMCwgMHg2MSwgMHgwOSwgMHgwMywKKwkgMHgwMCwgMHhGMiwgMHgwOSwgMHhGMCwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NCwgMHg0NCwgMHhBQywgMHg4NiwKKwkgMHhGNiwgMHgwMSwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg2NSwgMHg0NCwgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHhDQywgMHg4NSwKKwkgMHg1QSwgMHg4NywgMHhFOSwgMHgwMiwgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHhEQSwgMHg1QSwgMHg4NywgMHhBNiwgMHhGMywgMHhBNSwgMHhGMSwKKwkgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg2MSwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwKKwkgMHgwNCwgMHgwMywgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHhERCwgMHg4MSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNSwgMHg2NSwgMHg0NiwKKwkgMHg2NCwgMHg0NCwgMHhDQywgMHg5QywgMHhGRiwgMHhGRiwgMHhGMCwgMHgwMiwgMHg2MSwgMHg0NCwgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywKKwkgMHgyOCwgMHg0NSwgMHg0NSwgMHg4OCwgMHgwMCwgMHg2NCwgMHgyNywgMHhEQSwgMHg1QSwgMHg4NywgMHgwNiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBQSwgMHhGMywKKwkgMHgwMSwgMHg2MSwgMHhBQywgMHg4NiwgMHgwMCwgMHhGMiwgMHgwMywgMHgwMywgMHhENSwgMHg4MCwgMHhERCwgMHg4MSwgMHhGQSwgMHgwNCwgMHhDRCwgMHg4NCwKKwkgMHgyNSwgMHg0NiwgMHgyNywgMHhEQSwgMHgyOCwgMHg0NSwgMHhDNCwgMHg4NCwgMHg1QSwgMHhEQSwgMHhEQSwgMHg4MSwgMHhBOSwgMHhGMSwgMHg1OSwgMHhEOCwKKwkgMHgyNSwgMHg2MCwgMHhDNiwgMHg2NCwgMHgxOCwgMHg2MywgMHhBMCwgMHhEMSwgMHgwNiwgMHhBNCwgMHg1OSwgMHhEOCwgMHhGQywgMHgxRiwgMHgwMCwgMHg2NCwKKwkgMHg1OSwgMHhEQSwgMHg1OSwgMHhEQSwgMHgwMSwgMHg2MCwgMHg1NiwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwKKwkgMHhEQiwgMHhGMSwgMHg1OSwgMHhEOCwgMHg3NSwgMHgwMSwgMHgwNywgMHg0QiwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHg0NywgMHg1OCwgMHg0RiwgMHgyMSwgMHgwMCwgMHg2QywgMHgwMSwgMHgwNywgMHg0QiwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHhEMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHg0NywgMHgyNywgMHg0NCwgMHgwMCwgMHhCRSwgMHgwOCwgMHhGMCwgMHgxNSwgMHgwMywgMHg2NCwgMHg0MiwgMHg0QSwgMHhEMywKKwkgMHgwOSwgMHhGMiwgMHhEQywgMHg4MywgMHhBMiwgMHhERCwgMHgyNSwgMHg0MywgMHgwOSwgMHhGQywgMHg2MywgMHg0NiwgMHgyNywgMHg0MywgMHgwQSwgMHhGQywKKwkgMHgwOSwgMHhGQSwgMHgwOCwgMHhGOCwgMHgwMCwgMHhBOCwgMHg2NiwgMHg0MywgMHgwMywgMHgwMiwgMHg2NCwgMHg0NCwgMHg1OCwgMHhERCwgMHgwMywgMHgwMCwKKwkgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHg0QywgMHgwMSwgMHgyNywgMHg0MywgMHhFMywgMHg4MSwgMHhFOSwgMHg4MSwgMHgwMywgMHgwNSwKKwkgMHgxNiwgMHgwMywgMHgwMCwgMHg2MSwgMHgwMSwgMHgwMCwgMHhFQywgMHg2MywgMHg2MSwgMHg0NiwgMHhCRiwgMHhEMiwgMHgyNywgMHg0NSwgMHhEQywgMHg4NCwKKwkgMHhBMiwgMHhEQSwgMHhBMywgMHhEMiwgMHgyNSwgMHg0NiwgMHg4OCwgMHhGOCwgMHgwNCwgMHgxQiwgMHgyNSwgMHg0NCwgMHg2MSwgMHg0NiwgMHhCRSwgMHhEQSwKKwkgMHgwNCwgMHgwMCwgMHgwOSwgMHhGQSwgMHg2MCwgMHg0NiwgMHgyNSwgMHg0NCwgMHgwQSwgMHhGQSwgMHg2MSwgMHg0NiwgMHhBMywgMHhEQSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRSwgMHgwNywgMHgwNSwgMHhBMywgMHhGRSwgMHgwNywgMHgwNSwgMHhBMSwgMHhGRSwgMHg0OCwgMHgwNSwgMHg2MCwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgxMSwgMHgwMCwgMHgyMCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0RiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwRSwgMHg2MCwKKwkgMHhERiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGQiwgMHhCNCwgMHhBMiwgMHhEQiwgMHhBMCwgMHg0QywgMHg1OSwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwKKwkgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MywgMHgzRSwgMHg0MCwgMHg2MCwgMHgwQiwgMHg2NSwKKwkgMHgyQiwgMHg0NCwgMHgwMCwgMHg2MywgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgwMiwgMHgyNCwgMHg5NCwgMHg4NCwgMHhGMywgMHg4MywgMHhDRCwgMHg4MSwKKwkgMHhGRiwgMHhGRiwgMHhGOCwgMHgwMiwgMHhERiwgMHg4MywgMHgyRiwgMHg1OCwgMHg0MCwgMHg0QiwgMHgwMCwgMHg2MiwgMHgwMSwgMHg2NCwgMHhENCwgMHg4MCwKKwkgMHhFMCwgMHg4NCwgMHgxQSwgMHgwMywgMHhENCwgMHg4MCwgMHhFMCwgMHg4NCwgMHgxNSwgMHgwMywgMHg2MSwgMHg0NCwgMHgxMSwgMHg2MSwgMHhFMCwgMHg4NCwKKwkgMHhDRCwgMHg4MSwgMHhGRCwgMHgwNCwgMHgwMSwgMHgwMCwgMHhFMCwgMHg4NCwgMHhGMiwgMHg4MiwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyNCwgMHhDNiwgMHg4MiwKKwkgMHgwMiwgMHgyOCwgMHhENiwgMHg4MiwgMHhFMiwgMHg4MCwgMHhDRCwgMHg4MSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhCQywgMHhGNCwgMHgwMiwgMHgwMSwgMHgyQSwKKwkgMHhDNiwgMHg4MiwgMHgwMywgMHgwMCwgMHhFOSwgMHg4MSwgMHhGMiwgMHg4MiwgMHg2MSwgMHg0NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHhGRiwgMHhGRiwgMHhDNiwgMHgwMiwgMHg4OSwgMHhGMywgMHg4QSwgMHhGMywgMHgwMiwgMHhBOCwKKwkgMHgwMiwgMHhBOCwgMHgwOCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg4QiwgMHhGQiwgMHg4OSwgMHhGQiwgMHg4QSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg4QywgMHhGQiwKKwkgMHhDQSwgMHhGRSwgMHgyQSwgMHgwMCwgMHgwMywgMHgwMiwgMHgwMCwgMHg2NCwgMHg4QSwgMHhGQiwgMHhDQSwgMHhGRSwgMHgwMSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgxMiwgMHg2MCwgMHhFNywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgxMywgMHgwMywgMHhEQiwgMHhGMywgMHgyQSwgMHhGMiwKKwkgMHhGRCwgMHhBMCwgMHg2MCwgMHg0MCwgMHg4MCwgMHgzQSwgMHgzMywgMHgwMCwgMHgzMiwgMHgwMiwgMHg5QiwgMHhGRSwgMHgzMCwgMHgwNSwgMHgwMCwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgwQSwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhFNywgMHgwMSwgMHg4QSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHgxMiwgMHg2MCwgMHhFNCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgxQiwgMHgwMiwgMHg4NiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgxMiwgMHgyNywgMHgxMywgMHgwMCwKKwkgMHg5QSwgMHhGRSwgMHgxMSwgMHgwNCwgMHg5RCwgMHhGRSwgMHgwRiwgMHgwNCwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCQywgMHg5NSwgMHhGQiwKKwkgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHgwNiwgMHg2NCwgMHgxMywgMHg2MCwgMHgxNiwgMHhGQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHgxMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHg4NCwgMHhGRiwgMHhCNywgMHg2MCwgMHhGNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHhGQiwgMHg0NiwgMHg1QywgMHgxOSwgMHg2MCwgMHhDRiwgMHhGMywgMHgwRCwgMHhGMiwgMHg2MCwgMHg1QywgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwKKwkgMHgxMSwgMHg2NCwgMHgzQiwgMHhEQiwgMHg5RCwgMHhGRSwgMHgwNiwgMHgwNSwgMHgwOCwgMHg2NCwgMHgxMywgMHg2MCwgMHgxNiwgMHhGQiwgMHgyRCwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHhBMywgMHhGRSwgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHgyMywgMHhGMCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhCRiwgMHg2MCwgMHg3OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MywKKwkgMHg0MCwgMHg0NywgMHg1MCwgMHgzNiwgMHgwNSwgMHgwMCwgMHhBNCwgMHgzNiwgMHgwMywgMHgwMCwgMHg4MCwgMHgzNiwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2MywKKwkgMHg0OCwgMHhGRCwgMHg0MCwgMHg0NywgMHgwOCwgMHgyQSwgMHgwOCwgMHgwMCwgMHgwMywgMHgyRiwgMHgwNiwgMHgwMCwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwKKwkgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHg0QSwgMHhGMywgMHgzNSwgMHhGQSwgMHgxMCwgMHhBNCwgMHg0QSwgMHhGQiwKKwkgMHgwMCwgMHg2NCwgMHgxNSwgMHhGQSwgMHgxNiwgMHhGQSwgMHgwRiwgMHhGQSwgMHgwNywgMHhGMCwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMywgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgxMSwgMHhGMiwgMHhEOSwgMHhGQiwgMHg2MywgMHg0NiwgMHgwMywgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMiwgMHhGQywgMHhBNSwgMHgwMCwgMHg3RiwgMHhENCwgMHg4NCwgMHgyNywgMHg0NSwgMHgzQywgMHg0NiwgMHgxQSwgMHhGQSwKKwkgMHgyMiwgMHg2MywgMHg3QiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBNCwgMHg4NCwgMHgwMywgMHgyQiwgMHgxQywgMHg2MywgMHgyQSwgMHhGQSwgMHg4RiwgMHhCMCwKKwkgMHg4OCwgMHgzNiwgMHgwMiwgMHhBMywgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgxNCwgMHg2MywgMHg0MywgMHg0QywgMHgxOCwgMHhGQywgMHgwMCwgMHg3QywKKwkgMHgyMiwgMHhGOCwgMHg2NCwgMHg0MSwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgzQSwgMHhGMiwgMHg2MywgMHg0NiwgMHhGRiwgMHhCNCwKKwkgMHgyMiwgMHhGQSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg4MiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwQywgMHhCMCwgMHgwOCwgMHgzQSwKKwkgMHhBRCwgMHgwMCwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNiwgMHhBQSwgMHgwMCwgMHgwMywgMHhGMiwgMHgwMCwgMHhGNCwgMHhBMCwgMHhEMiwgMHhBQSwgMHg2MCwKKwkgMHhBQSwgMHg2NSwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwgMHgwQSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwKKwkgMHgwNiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGOCwgMHg3RiwgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwMSwgMHg2MSwgMHg2MiwgMHg0MywKKwkgMHg0NiwgMHg0MywgMHgzQywgMHg0NiwgMHgwNywgMHhGNCwgMHgzQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwKKwkgMHg2NCwgMHgwMCwgMHg2MCwgMHg0NSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwgMHhDRCwgMHg4MSwgMHgzQywgMHg0NiwgMHgxQiwgMHgwMiwgMHg2NCwgMHg0NCwKKwkgMHg4OCwgMHgzQSwgMHgxOCwgMHgwMCwgMHg4RSwgMHgzNywgMHgwMywgMHgwMCwgMHhDNywgMHgzNywgMHgwMSwgMHgwMCwgMHgxMywgMHgwMCwgMHg2NSwgMHg0NCwKKwkgMHgwMSwgMHgyNiwgMHg3QywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgzMSwgMHgwMCwgMHhBMywgMHg0NiwKKwkgMHgzQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHg1QiwgMHgwMCwgMHhBMywgMHg0NiwgMHgwMCwgMHg3QywgMHgyMiwgMHhGOCwKKwkgMHhBMywgMHg0NiwgMHg2QywgMHgwMCwgMHhBMywgMHg0NiwgMHg2NSwgMHg0NCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwMywgMHgwMCwKKwkgMHgxMCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgzQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHg0OCwgMHgwMCwKKwkgMHgxNywgMHgwMCwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgzQSwgMHhGMiwgMHg2NiwgMHg0MywgMHhGRiwgMHhCNCwgMHgzQywgMHg0NiwKKwkgMHgyMiwgMHhGMCwgMHg2MCwgMHg0NywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHg2MywgMHg0NiwgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHgxMCwgMHgyNywgMHgwMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkgMHgzQywgMHg0NiwgMHgwMiwgMHg2NSwgMHhCRiwgMHg2MCwgMHgxOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg4MSwgMHg2MywgMHg0MiwgMHg1QSwgMHhEMCwKKwkgMHgzQywgMHg0NiwgMHgyNiwgMHgwMiwgMHg2NCwgMHg0NCwgMHg4OCwgMHgzQSwgMHgyMywgMHgwMCwgMHg3NywgMHgzNywgMHgzNywgMHgwMCwgMHg3OCwgMHgzNywKKwkgMHgzNSwgMHgwMCwgMHg4RSwgMHgzNywgMHgzMywgMHgwMCwgMHhDNywgMHgzNywgMHgzMSwgMHgwMCwgMHgxQSwgMHgwMCwgMHgxOSwgMHg2MCwgMHhBMywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyQSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgxOSwgMHg2MCwgMHhBMywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHhFMiwgMHgwMSwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHhGMCwgMHg4NCwKKwkgMHhBNCwgMHg4NCwgMHgzRCwgMHhGQSwgMHgyQSwgMHhGMiwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgxNiwgMHgwMCwKKwkgMHgzQywgMHg0NiwgMHgyMiwgMHhGMCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgzRSwgMHhGMCwKKwkgMHgwOCwgMHhBNCwgMHg2MCwgMHg0MSwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMywgMHgwMCwgMHgwNCwgMHgyNiwKKwkgMHgwMywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwMiwgMHgwMCwgMHg2MSwgMHg0NCwgMHgzRiwgMHhGQSwgMHgzQywgMHg0NiwgMHgyQywgMHhGMiwKKwkgMHgyNywgMHg0MCwgMHgwMSwgMHgyNywgMHgzMiwgMHhGMiwgMHhEMywgMHhGMSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHg0NywgMHgwMCwgMHgwOSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgzRiwgMHhGMiwgMHgwOSwgMHgwNiwgMHgyQywgMHg0NSwgMHhDNCwgMHg4NCwgMHhEMCwgMHg4MCwgMHg0MCwgMHg0QSwKKwkgMHgzNCwgMHgwNiwgMHg2MCwgMHg0MywgMHg2NCwgMHg0NCwgMHg1NCwgMHg4OCwgMHgxNywgMHgwMCwgMHg2MCwgMHg0NSwgMHgxNiwgMHg2MCwgMHhDOCwgMHhGMywKKwkgMHhEQSwgMHhGMywgMHgwMCwgMHhCQywgMHg2MCwgMHg0NywgMHhFQywgMHhBMCwgMHgyOCwgMHgwMywgMHgyNywgMHgwNywgMHgyQywgMHg0NCwgMHhDNCwgMHg4MSwKKwkgMHgwMiwgMHg2MCwgMHgxQywgMHg2NSwgMHg0NSwgMHg0QSwgMHhENSwgMHg4MCwgMHgyQywgMHg0NSwgMHgxRiwgMHgwNiwgMHgyNywgMHg0MCwgMHgwNCwgMHgyNywKKwkgMHgyNSwgMHgwMCwgMHgyQSwgMHg0MywgMHhENywgMHg4NSwgMHg0NSwgMHg0OCwgMHhENCwgMHhGMSwgMHgwRiwgMHhGMiwgMHhEMywgMHg4MCwgMHgwMSwgMHg2NSwKKwkgMHgwMSwgMHgwNywgMHgwMCwgMHg2NSwgMHhCNCwgMHg4NCwgMHgwRiwgMHhGQSwgMHgwMCwgMHg2MywgMHgzRiwgMHhGMiwgMHgyOCwgMHg0NSwgMHg2MCwgMHg0MSwKKwkgMHhENCwgMHg4NCwgMHhERiwgMHg4MywgMHhGQywgMHgwNywgMHgxNCwgMHhGQywgMHgxNywgMHhGQSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNywgMHg0NSwKKwkgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyOCwgMHg0MywgMHgxNiwgMHhGQywgMHgwRCwgMHgwMCwgMHgzRiwgMHhGMiwgMHgyQywgMHg0NSwgMHhENCwgMHhGMSwKKwkgMHhDNCwgMHg4MSwgMHhEMSwgMHg4MCwgMHgwRiwgMHhGMiwgMHgwMSwgMHgwNiwgMHgwMSwgMHhCQywgMHgwRiwgMHhGQSwgMHgzRiwgMHhGMiwgMHgxNywgMHhGQSwKKwkgMHgwMSwgMHg2NCwgMHgxNCwgMHhGQSwgMHhBQSwgMHhGMiwgMHgxOSwgMHg2MCwgMHgzRiwgMHhGMywgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHg0NCwgMHg0NCwgMHg2MSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMiwgMHgwMCwgMHg2MSwgMHg0MCwgMHg4MCwgMHgzNiwgMHgxMiwgMHhGMiwgMHg2MywgMHg0NiwKKwkgMHgzMywgMHg2MCwgMHg4NiwgMHg2MSwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0NSwgMHg0NSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgwMCwgMHg3RiwKKwkgMHg0QiwgMHhGQiwgMHg2NSwgMHg0NCwgMHgwMCwgMHg3RSwgMHhEQSwgMHhGQiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgxMiwgMHhGMCwKKwkgMHg2MCwgMHg0NywgMHg2MywgMHg0NiwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxRSwgMHgwMCwgMHgzMywgMHg2MCwgMHgwQSwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwQSwgMHgzNiwgMHgwQywgMHgwMCwgMHgxNCwgMHgzNiwgMHgwNywgMHgwMCwgMHgzNywgMHgzNiwgMHgwMiwgMHgwMCwgMHhBMywgMHhEMywgMHgwOSwgMHgwMCwKKwkgMHgwMiwgMHhBMywgMHhBMywgMHhEMywgMHgwNiwgMHgwMCwgMHgwNCwgMHhBMywgMHhBMywgMHhEMywgMHgwMywgMHgwMCwgMHgwNiwgMHhBMywgMHhBMywgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNiwgMHg3MCwgMHg2NCwgMHgxNCwgMHgzNiwgMHgzOCwgMHg2NCwgMHgzNywgMHgzNiwgMHgxNSwgMHg2NCwKKwkgMHg2RSwgMHgzNiwgMHgwQiwgMHg2NCwgMHgzOSwgMHgwMCwgMHgzMiwgMHg2MCwgMHhGQSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHgyMCwgMHgwMCwKKwkgMHgwRiwgMHgzNiwgMHgxQiwgMHgwMCwgMHgwQSwgMHgzNiwgMHgxNiwgMHgwMCwgMHgwRSwgMHgzNiwgMHgxMSwgMHgwMCwgMHgwOSwgMHgzNiwgMHgwQywgMHgwMCwKKwkgMHgwRCwgMHgzNiwgMHgwNywgMHgwMCwgMHgwOCwgMHgzNiwgMHgwMiwgMHgwMCwgMHhBMywgMHhEMywgMHgxNSwgMHgwMCwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywKKwkgMHgxMiwgMHgwMCwgMHgwNCwgMHhBMywgMHhBMywgMHhEMywgMHgwRiwgMHgwMCwgMHgwNiwgMHhBMywgMHhBMywgMHhEMywgMHgwQywgMHgwMCwgMHgwOCwgMHhBMywKKwkgMHhBMywgMHhEMywgMHgwOSwgMHgwMCwgMHgwQSwgMHhBMywgMHhBMywgMHhEMywgMHgwNiwgMHgwMCwgMHgwQywgMHhBMywgMHhBMywgMHhEMywgMHgwMywgMHgwMCwKKwkgMHgwRSwgMHhBMywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNiwgMHgxRSwgMHg2NCwgMHgwRiwgMHgzNiwgMHgxNiwgMHg2NCwKKwkgMHgwQSwgMHgzNiwgMHgxMiwgMHg2NCwgMHgwRSwgMHgzNiwgMHgwRSwgMHg2NCwgMHgwOSwgMHgzNiwgMHgwRSwgMHg2NCwgMHgwRCwgMHgzNiwgMHgwQSwgMHg2NCwKKwkgMHgwOCwgMHgzNiwgMHgwQSwgMHg2NCwgMHgwQywgMHgzNiwgMHgwQSwgMHg2NCwgMHg0MCwgMHg0NiwgMHgyQSwgMHhGMiwgMHgwNywgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHhCMCwgMHgzQSwgMHgwMywgMHgwMCwgMHg0MCwgMHgzQiwgMHgwMSwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHg0NCwgMHgwMCwKKwkgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgzRiwgMHgwMCwgMHgxNywgMHhGMiwgMHgyMiwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgyMiwgMHgyMiwgMHgwNCwgMHgwMCwgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwgMHgzNiwgMHgwMywgMHgzNSwgMHgwMywgMHgzQywgMHg0NiwKKwkgMHgyQSwgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2MCwgMHg0NSwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgxRCwgMHgwMCwgMHgxMCwgMHgyNiwgMHgxMCwgMHgwMCwgMHgwNCwgMHgwMCwKKwkgMHgwNCwgMHgyNywgMHgxOCwgMHgwMCwgMHgxMCwgMHgyNywgMHgwQiwgMHgwMCwgMHg2NSwgMHg0NCwgMHgyQSwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwKKwkgMHgyNCwgMHg2MSwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzNiwgMHgwMiwgMHhBMSwgMHg0MSwgMHg0QywgMHg5OCwgMHhGQSwgMHgxNSwgMHgwMCwgMHg2NSwgMHg0NCwKKwkgMHgzMiwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyQywgMHg2MSwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzNiwgMHgwMiwgMHhBMSwgMHg0MSwgMHg0QywKKwkgMHg5OCwgMHhGQSwgMHgwQSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgyRSwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMywgMHgyQiwgMHgyOCwgMHg2MSwgMHg4RiwgMHhCMCwKKwkgMHg4OCwgMHgzNiwgMHgwMiwgMHhBMSwgMHg0MSwgMHg0QywgMHg5OCwgMHhGQSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHhCQywgMHg2MCwgMHg0NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwgMHg0NiwgMHg0MywgMHg2MCwgMHg0MCwgMHgyMiwgMHgyNiwKKwkgMHgwOSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwQSwgMHgwMCwgMHgwNCwgMHgyNiwgMHg0QiwgMHgwMCwgMHgxMCwgMHgyNiwgMHgxMCwgMHgwMCwgMHhCQywgMHg2MCwKKwkgMHg0NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQiwgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyNywgMHgzRCwgMHgwMCwgMHgxMCwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHhCQywgMHg2MCwgMHg0NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGMywgMHgzQywgMHhGMSwgMHgwMiwgMHgwMCwgMHgwNywgMHhGMiwKKwkgMHgwMCwgMHg3QywgMHg0MCwgMHg0MywgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgyMSwgMHgwMCwgMHhBMywgMHg0NiwKKwkgMHg0QiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHg0QiwgMHhGQSwgMHg0QSwgMHhGMiwgMHgwOCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0QSwgMHhGQSwKKwkgMHg0OSwgMHhGMiwgMHgwNCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0OSwgMHhGQSwgMHgwMSwgMHgwNCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGMywgMHg2NiwgMHg1QywKKwkgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwMSwgMHgwMiwgMHgzQywgMHhGMSwgMHg0QiwgMHhGMCwgMHg2NCwgMHg0NywgMHgyMCwgMHhCRiwgMHhBMywgMHg0NiwKKwkgMHgzQSwgMHhGOCwgMHgzQiwgMHhGQSwgMHhBMywgMHg0NiwgMHg0QSwgMHhGMiwgMHg0OSwgMHhGMCwgMHhBMywgMHg0NiwgMHgzQywgMHhGQSwgMHgzRCwgMHhGOCwKKwkgMHgwRiwgMHg2MCwgMHg5RSwgMHg2NCwgMHhBMywgMHg0NiwgMHg3NiwgMHg2MSwgMHgwRSwgMHg2MywgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwKKwkgMHhBMywgMHg0NiwgMHhCQywgMHg2MCwgMHg0NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NiwgMHgwMiwgMHgwMCwKKwkgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgyQSwgMHhGMiwgMHhBMywgMHg0NiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHg0OCwgMHgwMCwKKwkgMHhBNiwgMHhGMywgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgzQiwgMHhGMCwgMHgwOCwgMHgwMywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgxMiwgMHgwMCwKKwkgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHgzQiwgMHhGQSwgMHgyNCwgMHgwMCwgMHgzRCwgMHhGMywgMHgwMSwgMHg2MSwgMHg2MCwgMHg0MywKKwkgMHhDRiwgMHg4MywgMHhFMSwgMHg4MSwgMHhGRCwgMHgwRCwgMHhFOSwgMHg4MSwgMHhBMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHg5MSwgMHg4NCwKKwkgMHgzQiwgMHhGQSwgMHgxNywgMHgwMCwgMHg0QiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgxMCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHhGRiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhEQywgMHg4NCwgMHg0QiwgMHhGQSwgMHg0QSwgMHhGMiwgMHgxNiwgMHgwNCwgMHhEQywgMHg4NCwgMHg0QSwgMHhGQSwgMHg0OSwgMHhGMiwKKwkgMHgwOCwgMHgwNCwgMHhEQywgMHg4NCwgMHg0OSwgMHhGQSwgMHgwNSwgMHgwNCwgMHgzQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgzQiwgMHhGQSwgMHgwQywgMHg2MCwgMHhGQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDOCwgMHg2MCwKKwkgMHgxNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHgwNiwgMHg2MCwgMHgxNywgMHhFMSwgMHg3NywgMHg0MCwgMHg4QiwgMHhGRiwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHhDOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhBRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgwNiwgMHg2MCwgMHg3RiwgMHhGQiwKKwkgMHgwQywgMHg2MCwgMHhGQywgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDOCwgMHg2MCwgMHg4QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHgwMCwgMHg3QywgMHgwNiwgMHg2MCwgMHg3RiwgMHhGMywgMHhBMiwgMHhEOSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHhDOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NiwgMHgwNywgMHhGNCwgMHhBNiwgMHhGMywKKwkgMHg2NiwgMHg1QywgMHhEMCwgMHg4MCwgMHgwMCwgMHg3QywgMHgwNywgMHgwMywgMHg2NiwgMHg0MywgMHgzQywgMHg0NiwgMHgyMiwgMHhGMiwgMHg2MywgMHg0NiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgzQywgMHhGMSwgMHg0QiwgMHhGMCwgMHg2NCwgMHg0MSwgMHg2NCwgMHg0NywgMHhGRiwgMHhCNCwKKwkgMHg2MCwgMHg1RiwgMHgyMCwgMHhCQywgMHg4MCwgMHgyNiwgMHg4MCwgMHhBQywgMHg2MCwgMHg0NywgMHhBMywgMHg0NiwgMHgzQSwgMHhGQSwgMHg2NCwgMHg0NCwKKwkgMHgyMCwgMHg3RiwgMHgzNCwgMHg5NCwgMHgzQiwgMHhGQSwgMHhBMywgMHg0NiwgMHg0QSwgMHhGMiwgMHg0OSwgMHhGMCwgMHhBMywgMHg0NiwgMHgzQywgMHhGQSwKKwkgMHgzRCwgMHhGOCwgMHg4MCwgMHg2MCwgMHgxMCwgMHhFMCwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHgwRiwgMHg2NCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHhCQywgMHg2MCwgMHg0NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNywgMHgzMSwgMHgwMCwgMHgyQSwgMHhGMiwgMHgwMCwgMHg2MCwKKwkgMHg3QywgMHg2MiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyNCwgMHgwMCwgMHhBMiwgMHhEMywgMHgwMCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEMywKKwkgMHg1RSwgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg2NCwgMHg1RiwgMHhEQywgMHg4NCwgMHhGMSwgMHg4MSwgMHhDMCwgMHgyQiwgMHgwNCwgMHgwMCwKKwkgMHg4MCwgMHgyQSwgMHgwMiwgMHgwMCwgMHg3RiwgMHhBNCwgMHhEQywgMHg4NCwgMHhGRiwgMHgzQiwgMHgwMywgMHgwMCwgMHg2MCwgMHg0NywgMHhEQywgMHg4NywKKwkgMHgwMSwgMHg2MSwgMHhDMCwgMHg4MCwgMHgwMCwgMHgzNiwgMHhEQywgMHg4NCwgMHg0RSwgMHhEQiwgMHg2MCwgMHhGRSwgMHg1QSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhDMSwgMHg4NCwgMHhGMCwgMHgyMiwgMHgxMCwgMHhBNCwgMHhGMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHg2MCwgMHgzRSwgMHhGMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHg1QSwgMHhEMSwgMHgzQSwgMHhGQSwgMHgzQiwgMHhGOCwgMHg3NCwgMHg2MiwKKwkgMHhBMiwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwMCwgMHg2MCwgMHg0MCwgMHhGMywgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMSwKKwkgMHg1QSwgMHhEMSwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NSwgMHg0MCwgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwKKwkgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwKKwkgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwKKwkgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NywgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwKKwkgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgwOCwgMHg2MCwgMHgwMCwgMHhFQSwgMHg2NSwgMHg0NCwgMHgwMiwgMHhBNCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQSwgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQSwgMHg2NiwgMHg0NSwgMHhBQSwgMHhGMiwKKwkgMHgxOSwgMHg2MCwgMHgzRiwgMHhGMywgMHgyNCwgMHg0NiwgMHg2MSwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMiwgMHgwMCwgMHg2MSwgMHg0MCwgMHg4MCwgMHgzNiwKKwkgMHgxMiwgMHhGMiwgMHg2NSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgzNCwgMHgwMCwgMHgyQywgMHg0NSwgMHgxNywgMHhGMiwgMHg0QiwgMHhGMSwKKwkgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2NCwgMHg0NSwgMHgxNiwgMHhBMSwgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgxNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMSwgMHgwMSwgMHhBNCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwKKwkgMHgwNiwgMHhBNCwgMHgxQiwgMHhGQSwgMHhEQSwgMHhGMywgMHgyQywgMHg2MCwgMHg3QywgMHg2NSwgMHg2MCwgMHg0MCwgMHgwQiwgMHgzNywgMHgwMCwgMHg2MywKKwkgMHgwRiwgMHgzNywgMHgwMiwgMHg2MywgMHgwQSwgMHgzNywgMHgwNCwgMHg2MywgMHgwRSwgMHgzNywgMHgwNiwgMHg2MywgMHgwOSwgMHgzNywgMHgwOCwgMHg2MywKKwkgMHgwRCwgMHgzNywgMHgwQSwgMHg2MywgMHgwOCwgMHgzNywgMHgwQywgMHg2MywgMHgwQywgMHgzNywgMHgwRSwgMHg2MywgMHgyOCwgMHhBMywgMHg0NywgMHhEMSwKKwkgMHhEOCwgMHhBMywgMHhENywgMHg4MywgMHgxOSwgMHg2MCwgMHg3NywgMHhGOSwgMHg0NywgMHhEMSwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHgxRiwgMHhGQSwKKwkgMHg1OCwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgzNiwgMHgxOSwgMHgwMCwgMHg1MCwgMHgzNiwgMHgxNywgMHgwMCwKKwkgMHg0MCwgMHgzNiwgMHgxNSwgMHgwMCwgMHgwMCwgMHgzNiwgMHgxMywgMHgwMCwgMHgyMCwgMHgzNiwgMHgxMSwgMHgwMCwgMHhBMCwgMHgzNiwgMHgwRiwgMHgwMCwKKwkgMHhCMCwgMHgzNiwgMHgwRCwgMHgwMCwgMHhDMCwgMHgzNiwgMHgwQiwgMHgwMCwgMHhEQSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNywKKwkgMHgwNiwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHg4MCwgMHg2MCwgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHgwMCwgMHg2MSwKKwkgMHhEQSwgMHhGMywgMHgyQywgMHg2MCwgMHg3NCwgMHg2NSwgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNywgMHgwMCwgMHg2MywgMHgxNCwgMHgzNywgMHgwMiwgMHg2MywKKwkgMHgzNywgMHgzNywgMHgwNCwgMHg2MywgMHg2RSwgMHgzNywgMHgwNiwgMHg2MywgMHgyOCwgMHhBMywgMHg0NywgMHhEMSwgMHhEOCwgMHhBMywgMHhENywgMHg4MywKKwkgMHgxOSwgMHg2MCwgMHg3NywgMHhGOSwgMHg0NywgMHhEMSwgMHhGRiwgMHhGRiwgMHhCMSwgMHg4NCwgMHgxRiwgMHhGQSwgMHhEQSwgMHhGMSwgMHgyQywgMHg0NSwKKwkgMHg2NCwgMHg0MywgMHgxNywgMHhGMiwgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwKKwkgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgxNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwKKwkgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwgMHg2MywgMHg0NCwKKwkgMHg4MCwgMHg3RSwgMHhEQSwgMHhGQiwgMHg2MSwgMHg0NCwgMHhEQywgMHg4NCwgMHgyQiwgMHhGMCwgMHgxQiwgMHhGQSwgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNywKKwkgMHg1OCwgMHgwMCwgMHgwNywgMHhGMCwgMHg2NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHgxMiwgMHhGMiwgMHg2NSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwKKwkgMHgzMSwgMHgwMCwgMHgxNiwgMHhGMiwgMHgwRiwgMHhGMCwgMHhBQywgMHg4NCwgMHgyQywgMHg0NSwgMHgyQywgMHgwMywgMHg0QiwgMHhGMSwgMHhDNCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4MSwgMHg2MywgMHg0MCwgMHgzNywgMHgzNywgMHhFMSwgMHg4MSwgMHg2NCwgMHg0NSwgMHgwRiwgMHhGMCwKKwkgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgxNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBRSwgMHg4MiwgMHhGQywgMHhBMiwgMHgwQSwgMHgwMywgMHg2MywgMHg0MCwKKwkgMHg2RSwgMHgzQiwgMHgwNiwgMHgwMCwgMHg2MCwgMHg0MSwgMHgwNCwgMHgwRCwgMHg4MCwgMHg2NywgMHhCMCwgMHg4NCwgMHgwRiwgMHhGQSwgMHg2MSwgMHg0NCwKKwkgMHhEQywgMHg4NCwgMHgxRCwgMHhGQSwgMHgxRiwgMHhGMCwgMHgwMSwgMHg2MCwgMHgzRSwgMHg2NSwgMHg2NCwgMHg0MCwgMHg4MCwgMHgyNywgMHgwMiwgMHgwMCwKKwkgMHgwMiwgMHg2MCwgMHg1RSwgMHg2NSwgMHgxQiwgMHhGMCwgMHgyNiwgMHg0MSwgMHhFMSwgMHg4MSwgMHhDNSwgMHg4MSwgMHg0NCwgMHg5NCwgMHhDMSwgMHg4MSwKKwkgMHgyQiwgMHhGQSwgMHg5MCwgMHhGQSwgMHgyNiwgMHg0NCwgMHgyQywgMHhGMCwgMHgwQSwgMHhBNCwgMHg2NiwgMHg0NSwgMHgyNCwgMHg0NiwgMHg5MiwgMHhGMiwKKwkgMHg2NSwgMHg0NiwgMHg5RiwgMHhGMCwgMHg2MSwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MCwgMHhBNCwgMHg2NSwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHg2MCwgMHhBNCwgMHgwMSwgMHgwMCwgMHgxNCwgMHhBNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwMCwgMHg2NCwgMHg2MCwgMHg0NSwgMHgyQSwgMHhGMiwKKwkgMHgzOSwgMHhGMCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHgwNCwgMHgwMCwgMHg2NCwgMHg0NCwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzNiwgMHgwMCwgMHg2NSwKKwkgMHg2NSwgMHg0NCwgMHgxMSwgMHhGQSwgMHhEQSwgMHhGMywgMHgxMywgMHhGQSwgMHg3QywgMHg0NCwgMHgxRCwgMHhGQSwgMHgwRiwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHg2RiwgMHgwMCwgMHg3RCwgMHhGMSwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgxNCwgMHgwMCwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgxMiwgMHhGMCwKKwkgMHgxOSwgMHg2MCwgMHg3QywgMHhGMywgMHg2MywgMHg0NiwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgyMCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwKKwkgMHgwNywgMHgwMCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwOSwgMHgwMCwgMHgwNiwgMHg2MSwgMHg2RSwgMHg2MywgMHgwOCwgMHgwMCwKKwkgMHgwMiwgMHg2MSwgMHgxNCwgMHg2MywgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MSwgMHgwQSwgMHg2MywgMHgwMiwgMHgwMCwgMHgwNCwgMHg2MSwgMHgzNywgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHgyQywgMHg2MCwgMHg5QywgMHg2NSwgMHg0NSwgMHhEMSwgMHhENSwgMHg4MSwgMHgxOSwgMHg2MCwgMHg3OCwgMHhGOSwgMHgyQywgMHg2MCwKKwkgMHg3NCwgMHg2NSwgMHg0NSwgMHhEMSwgMHgxQywgMHhGQywgMHhCMCwgMHg4NCwgMHgxRSwgMHhGQSwgMHgzQywgMHgwMCwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwKKwkgMHgwNCwgMHgwMCwgMHgwOCwgMHg2MSwgMHgxRSwgMHg2MCwgMHgwQiwgMHg2MywgMHgyNywgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwQSwgMHg2MSwKKwkgMHgxNiwgMHg2MCwgMHgwRiwgMHg2MywgMHgyMSwgMHgwMCwgMHg0MCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwQywgMHg2MSwgMHgxMiwgMHg2MCwgMHgwQSwgMHg2MywKKwkgMHgxQiwgMHgwMCwgMHg4MCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwRSwgMHg2MSwgMHgwRSwgMHg2MCwgMHgwRSwgMHg2MywgMHgxNSwgMHgwMCwgMHgwMSwgMHgyQiwKKwkgMHgwNCwgMHgwMCwgMHgxMCwgMHg2MSwgMHgwRSwgMHg2MCwgMHgwOSwgMHg2MywgMHgwRiwgMHgwMCwgMHgwMiwgMHgyQiwgMHgwNCwgMHgwMCwgMHgxMiwgMHg2MSwKKwkgMHgwQSwgMHg2MCwgMHgwRCwgMHg2MywgMHgwOSwgMHgwMCwgMHgwNCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgxNCwgMHg2MSwgMHgwQSwgMHg2MCwgMHgwOCwgMHg2MywKKwkgMHgwMywgMHgwMCwgMHgxNiwgMHg2MSwgMHgwQSwgMHg2MCwgMHgwQywgMHg2MywgMHgxRSwgMHhGMCwgMHg0MCwgMHg2NywgMHgyQywgMHg2MCwgMHg5QywgMHg2NSwKKwkgMHg0NSwgMHhEMSwgMHhENSwgMHg4MSwgMHgxOSwgMHg2MCwgMHg3OCwgMHhGOSwgMHgyQywgMHg2MCwgMHg3NCwgMHg2NSwgMHg0NSwgMHhEMSwgMHgxQywgMHhGQywKKwkgMHhCMCwgMHg4NCwgMHgxRSwgMHhGQSwgMHhGRiwgMHhGRiwgMHgwRCwgMHhGMiwgMHgzRSwgMHhGMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHg2NCwgMHg0MSwKKwkgMHgwMSwgMHhCMSwgMHgwMSwgMHg2MywgMHgxNywgMHgwMiwgMHg2MCwgMHg0MSwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgwNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHg2MCwgMHhFRCwgMHhGRCwgMHgxOSwgMHg2MCwgMHhDRiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwKKwkgMHgwMSwgMHg2MywgMHg2MSwgMHg0MCwgMHhGRiwgMHgyMiwgMHgwNCwgMHgwMCwgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwNiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHg2MCwgMHhFRSwgMHhGRCwgMHgwMiwgMHg2NCwgMHgzQiwgMHhEQiwgMHhCRiwgMHg2MCwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHhGQiwgMHgwNywgMHhGMCwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBNiwgMHhGMywgMHgwRSwgMHgwMywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHgwMywgMHg0NywgMHhGMSwgMHgwNywgMHhGMCwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMywgMHgxMiwKKwkgMHhCRSwgMHg2MCwgMHhBMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGQywgMHgwQSwgMHhCRiwgMHg2MCwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGMCwKKwkgMHhBNiwgMHhGMywgMHgxMCwgMHhGMCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgzRCwgMHgwMywgMHg2NiwgMHg0MywgMHg2NSwgMHg0NiwgMHhGRiwgMHg2NywKKwkgMHgyMCwgMHg4NSwgMHg2NCwgMHg1RiwgMHg0MCwgMHg0NCwgMHgxNSwgMHhGMCwgMHgyNSwgMHg0NCwgMHhEMCwgMHg4NCwgMHgwMywgMHhBNCwgMHgwMywgMHgwRSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNCwgMHgwMCwgMHhGQSwgMHhBNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhDMCwgMHhCRiwgMHhDMCwgMHg4NCwKKwkgMHgxNSwgMHhGQSwgMHg0MCwgMHg0NSwgMHgxNCwgMHhGMCwgMHgyNCwgMHg0NCwgMHhEMCwgMHg4NCwgMHgxRiwgMHhBNCwgMHgwNiwgMHgwRSwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNywgMHgwMCwgMHhDMiwgMHhBNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhGOCwgMHhCRiwgMHhDMCwgMHg4NCwgMHgxNCwgMHhGQSwgMHg2MCwgMHg1QywgMHgyRiwgMHg2NywKKwkgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NSwgMHgyNSwgMHg1QywgMHg4QiwgMHg2NywgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MSwKKwkgMHgwMiwgMHgyNCwgMHg2NCwgMHg0MSwgMHhENSwgMHg4NCwgMHg4MCwgMHg2NSwgMHhDNCwgMHg4NywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2NCwgMHhGRiwgMHhCNCwKKwkgMHgwRSwgMHhGQSwgMHg2MywgMHg0NiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgxNywgMHhGMiwgMHg2MywgMHg0NiwgMHg2MCwgMHg0MCwKKwkgMHgwMCwgMHgzNiwgMHgyRSwgMHgwMCwgMHgwMSwgMHgzNiwgMHgxRSwgMHgwMCwgMHgwMywgMHgzQSwgMHgyNSwgMHgwMCwgMHg2NCwgMHg0NiwgMHgxMCwgMHhGMiwKKwkgMHgxMSwgMHhGQSwgMHgxMiwgMHhGMiwgMHgwMCwgMHg2MSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHgxMiwgMHhGQSwgMHg5NywgMHhGQSwgMHg0NiwgMHg0NCwKKwkgMHg2MywgMHg0NiwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwNCwgMHgwMCwKKwkgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHg5NiwgMHhGQywKKwkgMHg2MywgMHg0NiwgMHg0MywgMHgwMCwgMHg2NCwgMHg0NiwgMHgxNiwgMHhGMiwgMHgwMCwgMHg2MSwgMHgyMCwgMHgyOCwgMHhGRiwgMHhBNCwgMHg5NywgMHhGQSwKKwkgMHgxNiwgMHhGQSwgMHg2MywgMHg0NiwgMHgzQSwgMHgwMCwgMHg2NCwgMHg0NiwgMHgwMCwgMHg2MSwgMHg5NywgMHhGQSwgMHg2MywgMHg0NiwgMHgzNSwgMHgwMCwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgxNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgyMCwgMHgyOCwgMHhGRiwgMHhBNCwgMHgxNiwgMHhGQSwKKwkgMHg5MywgMHhGNCwgMHgxMiwgMHhGMiwgMHgyMCwgMHgyOCwgMHhGRiwgMHhBMywgMHgxMywgMHhGQywgMHg2MSwgMHg0NiwgMHg2MywgMHg0MCwgMHgwMCwgMHgzQSwKKwkgMHgyNCwgMHgwMCwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MSwgMHg0MCwgMHhGRiwgMHgzNiwgMHgxRCwgMHgwMCwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgxMiwgMHhGMiwgMHg5MywgMHhGNCwgMHg2MSwgMHg0NiwgMHgyMCwgMHgyOCwgMHgxNiwgMHgwMCwgMHg0NCwgMHg0NCwKKwkgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg1QywgMHg2NSwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwNiwgMHgwMCwKKwkgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgwMSwgMHg2NCwgMHgxNywgMHhGQSwgMHg2MSwgMHg0NiwgMHgwNywgMHgwMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwKKwkgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhCRiwgMHg2MCwgMHgwMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHhGMCwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHgxNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhGRiwgMHgyNywgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHgzNiwgMHgwNywgMHgwMCwgMHgwMSwgMHgzNiwgMHgxQywgMHgwMCwgMHgwMiwgMHgzNiwgMHgyNCwgMHgwMCwgMHgwMywgMHgzNiwgMHg0MywgMHgwMCwKKwkgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhBOSwgMHhGMSwgMHgxNiwgMHhGMiwgMHg0MywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMywgMHg2MCwgMHg4NCwgMHg2MSwKKwkgMHgwOSwgMHgwMywgMHhBMSwgMHhEMSwgMHgzMywgMHg2MCwgMHg4MiwgMHg2MywgMHhDMCwgMHg4NCwgMHgxNiwgMHhGQSwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHgxMywgMHhGQSwgMHgzOSwgMHgwMCwgMHg5NiwgMHhGQywgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwKKwkgMHg0MywgMHg0NCwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhDMSwgMHhGMywgMHg5NiwgMHhGQywKKwkgMHgxMywgMHhGQSwgMHgyOSwgMHgwMCwgMHg2MywgMHg0NiwgMHgzMywgMHg2MCwgMHg1NCwgMHg2MywgMHhBMywgMHhEMywgMHgxNSwgMHhGMiwgMHg2MCwgMHg0NSwKKwkgMHhENCwgMHg4MCwgMHgwNywgMHhGMCwgMHgwQywgMHgwMywgMHg2NiwgMHg0MSwgMHg0NCwgMHg0NCwgMHg2NCwgMHg0NiwgMHgxMiwgMHhGMiwgMHg2MSwgMHg0NiwKKwkgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxOSwgMHgwMCwgMHg2NiwgMHg0MywKKwkgMHgyNCwgMHg0NiwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGMiwgMHg5MSwgMHhGMiwgMHg5MCwgMHhGQSwKKwkgMHg2MCwgMHg1RiwgMHgxMiwgMHhGQSwgMHgwNCwgMHgwMCwgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg2NCwKKwkgMHgxNywgMHhGQSwgMHg2MywgMHg0NiwgMHgwNSwgMHgwMCwgMHgyNCwgMHg0MywgMHgwMiwgMHg2NCwgMHgxNywgMHhGQSwgMHg2MywgMHg0NiwgMHgwMCwgMHgwMCwKKwkgMHgwMywgMHg2NCwgMHgzQiwgMHhEQiwgMHhDQSwgMHhGRSwgMHg0NywgMHhGMSwgMHgwMSwgMHg2NSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNywgMHgxMSwgMHgwMCwKKwkgMHgyQywgMHhGMiwgMHg2NCwgMHg0NSwgMHgwMiwgMHgyMiwgMHgwRCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwQSwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHgzOSwgMHhGMCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwgMHg3NywgMHgwMCwgMHg2NCwgMHg0NCwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzNiwgMHgwMSwgMHgwMCwKKwkgMHg3MiwgMHgwMCwgMHgxNCwgMHhGMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwQywgMHgwMCwgMHg2MCwgMHg0NSwgMHgwNSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHg2NSwgMHg0NCwgMHhDQywgMHg4NSwgMHgyQywgMHg2MCwgMHhEMCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhGMCwgMHg3OCwgMHhCNSwgMHhGMSwKKwkgMHg1MCwgMHgwMCwgMHg2MCwgMHg0MSwgMHgyQSwgMHhGMCwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHgwQywgMHgzQSwgMHgwMSwgMHgwMCwgMHg0NiwgMHgwMCwgMHg2MSwgMHg0NSwgMHg2MCwgMHg0MywgMHgyQywgMHg2MCwgMHhEMCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhGMCwgMHg3OCwgMHhCNSwgMHhGMSwgMHg2MywgMHg0MCwgMHgwOCwgMHgzNiwgMHgwMSwgMHgwMCwgMHgzQSwgMHgwMCwgMHgxNCwgMHhGMiwKKwkgMHgxQywgMHg2NSwgMHg2MCwgMHg0MSwgMHgwMCwgMHg2MywgMHhDRCwgMHg4MSwgMHhDNywgMHg4MywgMHhGRCwgMHgwMiwgMHgzRiwgMHhGMCwgMHgyQywgMHhGMiwKKwkgMHhDMywgMHg4MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwRCwgMHgwMCwgMHgyQywgMHg2MCwgMHhDRSwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgyQywgMHg2MCwgMHhENCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFRiwgMHg3OCwgMHg2MywgMHg0NSwKKwkgMHgyMCwgMHgwMCwgMHgyQywgMHg2MCwgMHhDQywgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgyQywgMHg2MCwKKwkgMHhEMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFRiwgMHg3OCwgMHg2MywgMHg0NSwgMHgxNSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwRiwgMHhCNCwKKwkgMHgwMCwgMHhBOCwgMHgwMSwgMHhBOCwgMHgwRSwgMHgwMywgMHgwNywgMHgwMywgMHgyQywgMHg2MCwgMHhEQSwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgwNiwgMHgwMCwgMHgyQywgMHg2MCwgMHhEOCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwKKwkgMHhCNSwgMHhGMSwgMHgwNCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgyNSwgMHg2MCwgMHhFQywgMHg2NCwgMHgxMywgMHg2MCwgMHgwQSwgMHhGQiwgMHgzQywgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1QywgMHg1QywgMHhGQywgMHhGQywgMHhDRSwgMHhGRSwKKwkgMHhCOCwgMHg2MCwgMHgzNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg1MCwgMHhBOCwgMHgwMiwgMHg3QywgMHgwOSwgMHgwMywKKwkgMHgwRiwgMHhGMCwgMHgxNSwgMHhGMiwgMHg2NCwgMHg0MSwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHhDRCwgMHhGMSwgMHgwMiwgMHgwMCwgMHhDQywgMHhGMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgxNSwgMHhGQSwgMHgyRCwgMHgwNywgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwKKwkgMHgwOCwgMHgwMCwgMHgxNiwgMHg2MCwgMHg4MCwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwKKwkgMHgwNywgMHgwMCwgMHgxNiwgMHg2MCwgMHg4MSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwKKwkgMHgyQSwgMHhGMCwgMHgwOCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgwMCwgMHg2NCwgMHg0OCwgMHhGQiwgMHgxOSwgMHg2MCwgMHhBMywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHgzQywgMHg0NiwgMHgzRSwgMHhGMiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHhGMCwgMHg4NCwgMHhBNCwgMHg4NCwgMHgzRCwgMHhGQSwgMHgyQSwgMHhGMiwgMHhCRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHhCQSwgMHg2MCwgMHgwMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHgyQywgMHg2MCwgMHhEQSwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgyQywgMHg2MCwgMHhEQywgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwKKwkgMHhCNSwgMHhGMSwgMHgyNywgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg0NywgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHg5OCwgMHgwMSwgMHhDMCwgMHg2MCwgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMSwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHgwMSwgMHg2MywKKwkgMHhDNCwgMHhCNCwgMHgzMSwgMHhGQiwgMHgzMiwgMHhGRCwgMHhDMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHg0MiwgMHg0MCwgMHhBMCwgMHg0QywgMHg0MCwgMHhCQywKKwkgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMCwgMHhGRSwgMHgxQSwgMHhGRiwgMHgyNSwgMHg2MCwgMHhFMCwgMHg2NCwgMHgwOCwgMHhGMCwgMHgwNywgMHhGMCwKKwkgMHhEMCwgMHg4MCwgMHgyNSwgMHg2MCwgMHhFNiwgMHg2MiwgMHgxMywgMHgwMiwgMHhBMiwgMHhEMywgMHgwMSwgMHg2MywgMHhBQywgMHg4NiwgMHgwNywgMHhGMiwKKwkgMHgwRSwgMHgwMywgMHhEMCwgMHg4MCwgMHgwOSwgMHhGMiwgMHhGQSwgMHgwMiwgMHgyMywgMHhGQywgMHgyNSwgMHg2MCwgMHhFQywgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwQSwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgzQywgMHg0NiwKKwkgMHgwNiwgMHg2NCwgMHhBMSwgMHhGRiwgMHg0OSwgMHhGQiwgMHg4MywgMHgzRSwgMHgzMSwgMHhGMywgMHg4NywgMHg2MCwgMHg4MCwgMHg2MSwgMHgxRCwgMHhGMCwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwRiwgMHgwMCwgMHhGRSwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg0OSwgMHhGQiwgMHgwMSwgMHg2NCwKKwkgMHg0NywgMHhGQiwgMHgwMCwgMHg3MSwgMHgwNSwgMHg2NCwgMHg2NCwgMHg1RiwgMHgwRCwgMHhGQSwgMHg0MCwgMHg2NCwgMHgzQiwgMHhEQiwgMHhDMCwgMHg2MCwKKwkgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgyQSwgMHgxOCwgMHgwMCwgMHhEMSwgMHg5MSwgMHg4RCwgMHhFMiwgMHg0MSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgzMSwgMHhGMywgMHgzMywgMHg2MCwgMHhBNiwgMHg2MywgMHhGRCwgMHhCNCwgMHgzMSwgMHhGQiwgMHhBMywgMHhEMywgMHgwMiwgMHg2MywgMHg2MCwgMHg1QywKKwkgMHgwRCwgMHhGMiwgMHg0NywgMHhGRCwgMHhGRiwgMHhCNSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhEQywgMHg4NCwgMHgxRiwgMHgwMywKKwkgMHg2MCwgMHg0NywgMHhCNCwgMHg4NCwgMHgwRCwgMHhGQSwgMHgxQiwgMHgwMCwgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg0MiwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGNywgMHhCNCwgMHgzMSwgMHhGQiwgMHgxMiwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwOSwgMHgwMCwgMHg0MywgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwgMHgzMSwgMHhGQiwgMHhCRiwgMHg2MCwgMHhFNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg0NCwgMHg2NCwgMHgzQiwgMHhEQiwgMHgzMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhERiwgMHhCNCwgMHgzMSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgyQSwgMHg2NCwKKwkgMHgzQiwgMHhEQiwgMHhCNywgMHg2MCwgMHhGNywgMHg2NCwgMHg0MCwgMHg0MCwgMHhCRCwgMHg2MCwgMHhENywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg2MCwKKwkgMHhERiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwgMHgwNCwgMHhCNSwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHhDMSwgMHg2MCwgMHg3MCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxNiwgMHgwMCwgMHhBMCwgMHg0QywgMHg0OSwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwKKwkgMHgwRSwgMHg2MCwgMHhERiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCNSwgMHgwNCwgMHhCQywgMHgwOSwgMHgwMywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhFRCwgMHhFMiwgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHhBMCwgMHg0QywgMHg3RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHgwMywgMHgwMCwgMHhBMCwgMHg0QywKKwkgMHg2RCwgMHhCNCwgMHhBMCwgMHg1MSwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHg1OSwgMHgwMCwKKwkgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwgMHgzOCwgMHgwMCwgMHgwMSwgMHg2NCwgMHgxOSwgMHg2MCwgMHhGNCwgMHhGQiwgMHg2QywgMHhGMywgMHg3MywgMHhGMywKKwkgMHhDQywgMHg4MywgMHg2QywgMHhGRCwgMHhDQywgMHg4NCwgMHg3MywgMHhGQiwgMHgxRSwgMHgwMiwgMHgzMSwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxMiwgMHgwMCwKKwkgMHg2RSwgMHhGMywgMHg2RiwgMHhGMSwgMHhDQywgMHg4NCwgMHg2RSwgMHhGQiwgMHgwRCwgMHgwMiwgMHg2RSwgMHhGOSwgMHgzMSwgMHg0NCwgMHgwOCwgMHhCQywKKwkgMHg0MCwgMHg1MSwgMHg3MSwgMHhGMywgMHg3MCwgMHhGMSwgMHgwMCwgMHhCOCwgMHg2NCwgMHg0NSwgMHgwMSwgMHgwMywgMHg2NywgMHg0NSwgMHg2NSwgMHg1MCwKKwkgMHhDQywgMHg4NCwgMHg3MiwgMHhGQiwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMywgMHg2RCwgMHhGMSwgMHgwMCwgMHhCOCwgMHg3MywgMHhGOSwgMHgwMywgMHgwMywKKwkgMHg4NSwgMHhGMywgMHg2QywgMHhGQiwgMHgwNCwgMHgwMCwgMHg2QywgMHhGMywgMHg4NSwgMHhGMSwgMHgwRCwgMHgxQiwgMHg2QywgMHhGOSwgMHgzMSwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwOSwgMHgwMCwgMHg5RCwgMHhGRSwgMHgwNywgMHgwNSwgMHhCQSwgMHhGRSwgMHgwOCwgMHg2NCwgMHgxMywgMHg2MCwgMHgxNiwgMHhGQiwKKwkgMHgyRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRSwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwgMHgxMiwgMHgwMCwgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwKKwkgMHgwRiwgMHgwMCwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMywgMHg2QywgMHhGMSwgMHgwMywgMHgxQiwgMHgzMSwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwKKwkgMHg3MywgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNywgMHg2MCwgMHg1QywgMHgxOSwgMHg2MCwgMHhGNSwgMHhGOSwKKwkgMHgwMCwgMHg2NCwgMHgxOSwgMHg2MCwgMHhGNCwgMHhGQiwgMHgwRSwgMHg2MCwgMHgzNywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhGRiwgMHgyQiwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGMSwgMHgwNywgMHg2MCwgMHhFOSwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMiwgMHgzQSwgMHgzQSwgMHgwMCwgMHgwQSwgMHg2MCwKKwkgMHgxOCwgMHhGMSwgMHgxMCwgMHhCNCwgMHg5MCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgzNCwgMHgwMywgMHgwQSwgMHg2MCwgMHgxOCwgMHhGQiwgMHgwMSwgMHg2MywKKwkgMHg2MCwgMHg0MCwgMHgxMCwgMHgyMiwgMHgwMCwgMHg2MywgMHgwOCwgMHg2MCwgMHhDMSwgMHhGRCwgMHgwOCwgMHg2MCwgMHhDNSwgMHhGRCwgMHgwOCwgMHg2MCwKKwkgMHhDOSwgMHhGRCwgMHgwOCwgMHg2MCwgMHhDRCwgMHhGRCwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMywgMHgyMSwgMHgwMCwKKwkgMHgwQiwgMHgzNiwgMHgwNywgMHgwMCwgMHgwQywgMHgzNiwgMHgwNSwgMHgwMCwgMHgwRCwgMHgzNiwgMHgwMywgMHgwMCwgMHgwRSwgMHgzNiwgMHgwMSwgMHgwMCwKKwkgMHgxOCwgMHgwMCwgMHhEQiwgMHhGMywgMHgwMSwgMHg2MywgMHgwRSwgMHg2MCwgMHgzNiwgMHhGRCwgMHg2MCwgMHg0MCwgMHgwMywgMHgzQSwgMHgwOCwgMHgwMCwKKwkgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOSwgMHgwMCwKKwkgMHgwNCwgMHgzQSwgMHgwNywgMHgwMCwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgxMCwgMHg2NCwgMHgzQiwgMHhEQiwgMHg3RSwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHhDOSwgMHhGRSwgMHg0OSwgMHhGMywgMHgzQywgMHg0NiwgMHgyNSwgMHgxOCwgMHhDQywgMHg4NCwgMHg0OSwgMHhGQiwKKwkgMHgyMiwgMHgwMiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHhGQywgMHhGQywgMHgwMCwgMHg2NCwgMHg1QywgMHg1QywgMHgzMiwgMHhGQiwKKwkgMHg4MiwgMHhGRiwgMHg1QywgMHg0NywgMHg4NCwgMHhGRiwgMHg2MiwgMHhGRiwgMHgxNiwgMHg2MCwgMHg3RSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwKKwkgMHgwMCwgMHgzNiwgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwgMHgyMywgMHhGMCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHgyNSwgMHg2MCwKKwkgMHhFQywgMHg2NCwgMHgxMywgMHg2MCwgMHgwQSwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHhDRSwgMHhGRSwgMHg2OSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhGRCwgMHhCNCwgMHhBMiwgMHhEQiwKKwkgMHg2MSwgMHg0NCwgMHgwMSwgMHhCMCwgMHgwMiwgMHhCMCwgMHgwQiwgMHgwMywgMHgwQSwgMHgwMiwgMHg5RCwgMHhGRSwgMHgwOCwgMHgwNCwgMHgxQywgMHg2MCwKKwkgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMCwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwNywgMHgwMCwKKwkgMHg3RSwgMHhGMywgMHg3MywgMHg0NSwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg5MywgMHgxRCwgMHg2MCwKKwkgMHhCQSwgMHg2MywgMHhBMywgMHhEMywgMHhBRCwgMHg0OSwgMHgyMCwgMHhCNSwgMHgwOCwgMHhCMSwgMHgyMiwgMHgwMywgMHhFMSwgMHg4MSwgMHgxMCwgMHhCNSwKKwkgMHg5NSwgMHg4MSwgMHg2MCwgMHg0MSwgMHgxOCwgMHgwMiwgMHgxRCwgMHg2MCwgMHhCQywgMHg3QywgMHhBNCwgMHhEMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwKKwkgMHhBNCwgMHhEQiwgMHgxNiwgMHgwMiwgMHgwNSwgMHg2NCwgMHhBNCwgMHhEQiwgMHg2MSwgMHg0NCwgMHgwNywgMHhCNCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMiwKKwkgMHgwOCwgMHhCMSwgMHhFMSwgMHg4MSwgMHg5NSwgMHg4MSwgMHhBMywgMHhEMywgMHgwQiwgMHgwMywgMHgwOCwgMHhBQywgMHgwMSwgMHhCQywgMHhBMywgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgxMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgxMCwgMHhBQywgMHhBMywgMHhEQiwgMHgwNSwgMHg3QywgMHgwRSwgMHg2MCwgMHhERSwgMHhGOSwKKwkgMHhCOCwgMHg2MCwgMHgwMywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NiwgMHhGMywgMHg0NSwgMHhGMSwgMHgwNCwgMHgxQiwgMHg2NCwgMHg0NCwgMHgwMiwgMHgxQiwKKwkgMHgwNywgMHg2MCwgMHhFRCwgMHhGMywgMHg0NSwgMHhGQiwgMHgwMCwgMHg2MywgMHg0NiwgMHhGRCwgMHg2MCwgMHg0MSwgMHgyNSwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgyNywgMHg0NCwgMHhFRiwgMHhCNCwgMHg0MCwgMHg0NywgMHgwMCwgMHhCOSwgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHgwMSwgMHgxMiwgMHgyNywgMHgwMywKKwkgMHhDMSwgMHg2MCwgMHhDNSwgMHg2MiwgMHg4NCwgMHhGRiwgMHg0MiwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHgyRCwgMHgwQSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHgyNywgMHgwQSwKKwkgMHg3MSwgMHg0MCwgMHg4MCwgMHgyNywgMHhGNywgMHgxMiwgMHg0NSwgMHhGMywgMHg0OCwgMHgwMiwgMHgxMSwgMHgxOCwgMHgxQiwgMHg2MCwgMHhFRSwgMHhGMywKKwkgMHgxQiwgMHg2MCwgMHhFRiwgMHhGMywgMHgwNywgMHgxOCwgMHgwNiwgMHgxOCwgMHhBQywgMHg0QywgMHg4MCwgMHgyNiwgMHgwMywgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHg0NSwgMHhGQiwgMHgwNSwgMHgwMCwgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHg0NSwgMHhGQiwgMHhFMywgMHgwMiwgMHgwNiwgMHgwQSwKKwkgMHhBMCwgMHg0QywgMHhGQiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhBNCwgMHg2MCwgMHg1OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NCwgMHhGRiwgMHhDMSwgMHg2MCwKKwkgMHhBMywgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNCwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHhCMCwgMHg2MCwKKwkgMHg5RSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzQywgMHg0NCwgMHhBQywgMHg4MCwgMHgzMiwgMHhGMSwgMHgyNSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwNywgMHgyMiwKKwkgMHgyMiwgMHgwMCwgMHhBNCwgMHg2MCwgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxQywgMHhCQywgMHhERiwgMHhCNCwgMHhBMCwgMHg1MSwKKwkgMHgzMSwgMHg0MCwgMHgwOCwgMHgyQSwgMHhFRiwgMHgwMSwgMHg3MiwgMHhGMywgMHg3MCwgMHhGMSwgMHgwMCwgMHhBMCwgMHhEQywgMHg4MCwgMHgwNSwgMHgwMywKKwkgMHgwOCwgMHgwMywgMHhDQywgMHg4NCwgMHg3MiwgMHhGQiwgMHg2NywgMHg1MCwgMHgwOCwgMHgwMCwgMHhDQywgMHg4NCwgMHg3MiwgMHhGQiwgMHg2NCwgMHg1MCwKKwkgMHgwNCwgMHgwMCwgMHgzMSwgMHg0NCwgMHhGNywgMHhCNCwgMHg0MCwgMHg1MSwgMHgwNiwgMHgwMCwgMHgyOCwgMHg2NCwgMHgzQSwgMHhEQiwgMHhBMCwgMHg0QywKKwkgMHgzMCwgMHhCQywgMHhGMywgMHhCNCwgMHhBMCwgMHg1MSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHgyOCwgMHg2NCwgMHgzQiwgMHhEQiwKKwkgMHgwNywgMHg2MCwgMHhFRSwgMHhGMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNywgMHgxNiwgMHgwMCwgMHg0NiwgMHhGQiwgMHgxNCwgMHgxOCwgMHhDMiwgMHg2MCwKKwkgMHgzMywgMHg2NCwgMHg4NCwgMHhGRiwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwgMHhBMCwgMHg0QywgMHgxNSwgMHhCQywgMHhGNywgMHhCNCwgMHhBMCwgMHg1MSwKKwkgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4MSwgMHgzRSwgMHg3MCwgMHg0NCwgMHhBQywgMHg4MCwgMHg0NiwgMHhGMywgMHhCOCwgMHgwQSwgMHhERCwgMHgwMiwKKwkgMHhDQywgMHg4NCwgMHg0NiwgMHhGQiwgMHhGNSwgMHgwMiwgMHg4NCwgMHhGRiwgMHhDMiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0MCwgMHg0MiwgMHg4MiwgMHhGRiwKKwkgMHgyNywgMHg0NCwgMHgwOCwgMHhCQywgMHg0MCwgMHg0NywgMHhGOSwgMHhFMSwgMHgwNCwgMHgwMCwgMHg3OCwgMHhFMSwgMHgzMSwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHhGOSwgMHhFMSwgMHhBNCwgMHg2MCwgMHgyRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhBQiwgMHhGMSwgMHg2MCwgMHg0NSwgMHgzMywgMHg2MCwKKwkgMHg2QSwgMHg2MSwgMHhDNSwgMHg4MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHg2NiwgMHg0NSwgMHgyNCwgMHg0NiwgMHgwRSwgMHhGMiwKKwkgMHg2NSwgMHg0NiwgMHg2NCwgMHg0NSwgMHhENSwgMHg4MSwgMHg2MSwgMHg0NSwgMHgwMCwgMHg3RiwgMHhENCwgMHg4MCwgMHg2NCwgMHg0MywgMHgwOCwgMHgwNCwKKwkgMHhFMywgMHg4MywgMHg2MywgMHg0NSwgMHhDNSwgMHg4MSwgMHg2MSwgMHg0NSwgMHhENCwgMHg4MCwgMHgwMiwgMHg2NSwgMHgwMywgMHgwNywgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHg2NSwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MywgMHg2NCwgMHg0NiwgMHg4RiwgMHhGMCwKKwkgMHgxMiwgMHhGMiwgMHg5MSwgMHhGMiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgzNiwgMHgwNSwgMHgwMCwgMHgxMiwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwQywgMHgzNiwKKwkgMHgwQiwgMHgwMCwgMHgwRiwgMHgwMCwgMHg0MCwgMHg2MSwgMHhBNSwgMHg4MCwgMHgwQSwgMHg2NCwgMHgxMywgMHgwMiwgMHhGMywgMHgwMSwgMHgxMCwgMHg2MSwKKwkgMHhBNSwgMHg4MCwgMHgwRSwgMHg2NCwgMHgwRSwgMHgwMiwgMHhFRSwgMHgwMSwgMHgwOCwgMHg2MSwgMHhBNSwgMHg4MCwgMHgxMCwgMHg2NCwgMHgwOSwgMHgwMiwKKwkgMHhFOSwgMHgwMSwgMHhFMSwgMHg4MSwgMHhBNSwgMHg4MCwgMHgwMywgMHgwNSwgMHhDOCwgMHg4NCwgMHgwMywgMHgwMiwgMHhFMywgMHgwMSwgMHhGRiwgMHg2MSwKKwkgMHgwMiwgMHgwMCwgMHgxMiwgMHhGQSwgMHg5MSwgMHhGQSwgMHg2MywgMHg0NiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg4RiwgMHhGMCwgMHgxMiwgMHhGMiwKKwkgMHg5MSwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwQSwgMHgzNiwgMHgwNSwgMHgwMCwgMHgwRSwgMHgzNiwgMHgwOCwgMHgwMCwgMHgxMCwgMHgzNiwgMHgwQiwgMHgwMCwKKwkgMHgwRiwgMHgwMCwgMHgwOCwgMHg2MSwgMHhBNSwgMHg4MCwgMHgxMCwgMHg3RSwgMHgxMSwgMHgwMiwgMHhGMywgMHgwMSwgMHgwNCwgMHg2MSwgMHhBNSwgMHg4MCwKKwkgMHgxMiwgMHg3RSwgMHgwQywgMHgwMiwgMHhFRSwgMHgwMSwgMHgyMCwgMHg2MSwgMHhBNSwgMHg4MCwgMHgwQywgMHg3RSwgMHgwNywgMHgwMiwgMHhFOSwgMHgwMSwKKwkgMHhFOSwgMHg4MSwgMHhBNSwgMHg4MCwgMHgwNSwgMHgwNSwgMHhEOCwgMHg4NCwgMHgwMSwgMHgwMiwgMHhFMywgMHgwMSwgMHgxMiwgMHhGQSwgMHg5MSwgMHhGQSwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgwNiwgMHgwMCwgMHgwNCwgMHg2MCwgMHg0MCwgMHg2MiwgMHgzRCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHg1MCwgMHgwMCwKKwkgMHgyOCwgMHg0MCwgMHgwOCwgMHgzQSwgMHg0RCwgMHgwMCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgxOSwgMHg2MCwKKwkgMHg1MiwgMHhGQiwgMHg3RCwgMHhGMSwgMHgyQiwgMHg2MCwgMHg4MiwgMHg2MywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNywgMHgzQywgMHhBMywgMHgyOSwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgxRSwgMHhBMywgMHhCRCwgMHhEMSwgMHg2MywgMHg0NSwgMHg0NCwgMHg0RSwgMHgwRSwgMHg2MSwgMHhCRCwgMHhEMSwgMHhDRCwgMHg4MSwKKwkgMHhEMCwgMHg4MCwgMHgwMSwgMHgwMywgMHhGQiwgMHgwNCwgMHhDQiwgMHg4MywgMHgxOSwgMHg2MCwgMHg1NSwgMHhGMywgMHgzOSwgMHhGMSwgMHhENywgMHg4MywKKwkgMHhFQiwgMHg4MywgMHgyRSwgMHg0MSwgMHg1RCwgMHg5MywgMHhERiwgMHg4MywgMHgxOSwgMHg2MCwgMHg1MSwgMHhGRCwgMHgxOSwgMHg2MCwgMHg1MCwgMHhGQiwKKwkgMHg1MywgMHg5MywgMHhERiwgMHg4MCwgMHgxMCwgMHgwMywgMHgzOCwgMHhGMywgMHhDRiwgMHg4MywgMHgwOCwgMHgwMywgMHhERiwgMHg4MywgMHgwQiwgMHgwMiwKKwkgMHhERiwgMHg4MywgMHhEQywgMHg4NCwgMHhGMCwgMHhBMCwgMHgzOCwgMHhGQiwgMHgwNiwgMHgwMywgMHgwMywgMHgwMCwgMHhDQywgMHg4NCwgMHgzOCwgMHhGQiwKKwkgMHgwMiwgMHgwMywgMHgwMCwgMHg2MywgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgzOCwgMHhGQiwgMHhFMywgMHg4MCwgMHhGQiwgMHg4MywgMHhDMywgMHg4MywKKwkgMHg2MywgMHg0NCwgMHhGQywgMHhBMCwgMHgwMiwgMHgwRSwgMHgwOCwgMHgwNywgMHgwOCwgMHgwMCwgMHgwNCwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwRCwKKwkgMHhGQywgMHg2NCwgMHhGRiwgMHg3RiwgMHg2MCwgMHg0MywgMHgwMSwgMHgwMCwgMHgwNCwgMHg2MywgMHgzOSwgMHhGRCwgMHgxOSwgMHg2MCwgMHg1NCwgMHhGRCwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3NCwgMHhGMywgMHg0MCwgMHg0RSwgMHg2MCwgMHg0NiwgMHgyRiwgMHhEQiwgMHg0NCwgMHg0NCwKKwkgMHhBMSwgMHhEMywgMHhEOSwgMHg4MSwgMHg0OCwgMHg5NCwgMHgyNCwgMHg1QywgMHhEMCwgMHg5QywgMHg2NiwgMHg0MiwgMHgwNCwgMHgwNiwgMHhEMiwgMHg5QywKKwkgMHgyRiwgMHhEOSwgMHg2NCwgMHg0NiwgMHgyNCwgMHg0NCwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHhBMywgMHhEQiwgMHhGRiwgMHhCNCwgMHg2MCwgMHg1QywKKwkgMHg2NiwgMHg0NCwgMHgyMiwgMHhBNCwgMHhEMCwgMHg4NCwgMHhFMCwgMHhBMCwgMHgwMiwgMHgwRCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNCwKKwkgMHgxRiwgMHg2NCwgMHhBMiwgMHhEMywgMHg2MCwgMHg1QywgMHg2NCwgMHg1RSwgMHg2MCwgMHg0NywgMHgyRiwgMHhEMSwgMHgyOCwgMHhBMywgMHhBMywgMHhEOSwKKwkgMHhEOCwgMHhBMywgMHgyRSwgMHg0MiwgMHg0RSwgMHg4RSwgMHhCRCwgMHhEQiwgMHhEQiwgMHgwMiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg0MywgMHhGRiwKKwkgMHgzOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NCwgMHgzRSwgMHhGQiwgMHgwMSwgMHgzRCwgMHg0NCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwMiwgMHg0MCwgMHhGRiwgMHg0NCwgMHhGRiwgMHhGNCwgMHgwMSwgMHhBMCwgMHg0QywgMHgzRCwgMHg0NiwgMHgyQSwgMHhGMiwgMHg0NiwgMHg0RCwKKwkgMHg5MiwgMHhGQywgMHgxMCwgMHgyNSwgMHgxMiwgMHgwMCwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwRiwgMHhGMiwgMHgwMSwgMHgyOSwKKwkgMHgwNiwgMHgwMCwgMHgyQSwgMHhGMCwgMHg0MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgwOCwgMHhCQywgMHgwMiwgMHhCQywgMHgwRiwgMHhGQSwKKwkgMHgwOCwgMHgyNSwgMHhERCwgMHgwMSwgMHhDQiwgMHhGRSwgMHg1QywgMHg1RCwgMHhEQiwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMSwgMHhGMiwgMHgxRCwgMHg2MCwKKwkgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywKKwkgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwKKwkgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwNywgMHhGQywgMHgzRiwgMHhGMiwgMHgwOSwgMHg2MCwgMHhCMCwgMHg2NSwKKwkgMHhENCwgMHg4MCwgMHgyQSwgMHhGMiwgMHhDMCwgMHgwNSwgMHgwOCwgMHgyNSwgMHhBQSwgMHgwMSwgMHg1QywgMHg0QiwgMHgwQywgMHg2MCwgMHhFQSwgMHg2MSwKKwkgMHhBMSwgMHhERiwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMiwgMHhBNiwgMHhGMSwgMHg4NywgMHhGNCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHhDMSwgMHgwMCwKKwkgMHhEMywgMHg4MCwgMHgyQywgMHhGMCwgMHhCMCwgMHgwMywgMHgwNywgMHhGNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhBNiwgMHhGNSwgMHhCQSwgMHhGNCwKKwkgMHgyRCwgMHg0NiwgMHgwNCwgMHg2NCwgMHgwNCwgMHhCMywgMHgyMiwgMHhGMCwgMHgwMywgMHgwMywgMHhDNSwgMHg2MCwgMHhFMiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg5QywgMHgzQiwgMHhGMiwgMHgyMiwgMHhGOCwgMHg2MCwgMHg0NywgMHhDMCwgMHhCNywgMHgwMiwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMCwgMHhBOCwgMHg0MCwgMHg0QSwgMHgxNywgMHgwMywgMHhFMCwgMHg4MSwgMHg2MSwgMHg0MywgMHg0MiwgMHhGRSwKKwkgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0QSwgMHhFMSwgMHg4NCwgMHhFMCwgMHg4NCwgMHgyRCwgMHg0NiwgMHgwNywgMHhGNCwKKwkgMHhFMCwgMHg4MSwgMHgzQiwgMHhGMCwgMHgyQSwgMHg0NywgMHgwQywgMHg2MCwgMHgzOCwgMHg2MywgMHhBMCwgMHg4NCwgMHg0NywgMHg5QywgMHgxMCwgMHgwMywKKwkgMHg3QywgMHg0NCwgMHgwMCwgMHg2MCwgMHhCMiwgMHg2MywgMHgxQywgMHgwMCwgMHgwNywgMHhGNCwgMHgzQiwgMHhGMCwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0MCwKKwkgMHg4MCwgMHgyQiwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHg3OCwgMHg3QywgMHgwMCwgMHg2MCwgMHhBMiwgMHg2MywgMHg0MywgMHg0QywgMHgxMCwgMHgwMCwKKwkgMHgyRCwgMHg0NiwgMHhDNSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NiwgMHgyMiwgMHhGMiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg3QywKKwkgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNiwgMHgyNSwgMHgwMCwgMHhDNSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhFRCwgMHhGQiwgMHhFRSwgMHhGOSwgMHhFRiwgMHhGRCwgMHhBRCwgMHg0NiwgMHgzRCwgMHhGMiwgMHhBRCwgMHg0NiwgMHhBMywgMHhEMCwgMHhBRCwgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgzQywgMHhGMiwgMHhBRCwgMHg0NiwgMHgwMiwgMHgwMywgMHgxNSwgMHgwNywgMHhFNiwgMHgwNCwgMHg1QiwgMHhEMCwgMHhBRCwgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgzQSwgMHhGMiwgMHgwMywgMHgwMywgMHhBRCwgMHg0NiwgMHgwRCwgMHgwNywgMHhERSwgMHgwNCwgMHgzQSwgMHhGMCwgMHhBRCwgMHg0NiwKKwkgMHg1QiwgMHhEMCwgMHg2NCwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyQiwgMHg0NCwgMHgwNSwgMHgwNywgMHhENiwgMHgwMywgMHhEMCwgMHg4NCwgMHgxMCwgMHhBNCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHgwNywgMHhFRSwgMHhGMywgMHhFRCwgMHhGNSwgMHhGRSwgMHhBNCwgMHgwRiwgMHg2MCwgMHhCRSwgMHg2MSwgMHgwRSwgMHg2MywKKwkgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgyRCwgMHg0NiwgMHg4QiwgMHhGRiwgMHgyRCwgMHg0NiwgMHgyMiwgMHhGMiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg3QywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHgwRiwgMHg2MCwgMHhCMCwgMHg2NCwgMHhDOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg1NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMCwgMHg2MCwgMHgxOCwgMHg3MCwgMHgxOCwgMHg3MSwgMHgyMCwgMHg3MiwgMHg2MCwgMHg1MywgMHg4OCwgMHg3NSwKKwkgMHgwMCwgMHhGMiwgMHgwOSwgMHhFMSwgMHg2MCwgMHg1MCwgMHgxMiwgMHg3MSwgMHg2RSwgMHg3MiwgMHg4MywgMHg3NSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgyNSwgMHgxRCwgMHgwMCwgMHg0MCwgMHhGRiwgMHgwMiwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3NSwgMHg0MCwgMHgwMywgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHg4MCwgMHg3NSwgMHgwQSwgMHg2NCwgMHgwQiwgMHgwMCwgMHg4MCwgMHg3NSwgMHgxQiwgMHhGMywgMHg4QiwgMHhGRiwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg3NSwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg3NSwgMHhEQywgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHg5OCwgMHhGRiwKKwkgMHgyRCwgMHg0NiwgMHgwRiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwgMHgwQiwgMHgwMSwgMHg4QiwgMHhGRiwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg3NSwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhDNSwgMHg2MCwgMHhCQiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMCwgMHgyMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHgzQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwKKwkgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHg3QywgMHg1RiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NSwgMHgwRCwgMHg2MCwgMHgwMCwgMHg2NCwgMHg0NCwgMHhEMywKKwkgMHg1QSwgMHhEMSwgMHgwMywgMHgxQiwgMHhDNSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHg2NCwgMHg0NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFNCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NywgMHhFNiwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0MCwKKwkgMHgwRCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2NCwgMHg0NywgMHhFOCwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFQSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg2NCwgMHg0NywgMHhFQywgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywKKwkgMHhFRSwgMHg3RiwgMHg1QSwgMHhEMSwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NSwgMHg0NCwgMHhEOCwgMHg4NCwKKwkgMHgwOCwgMHgyNSwgMHgyNSwgMHgwMCwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHhEMSwgMHg2MCwgMHgwMCwgMHhFQiwgMHgyMiwgMHhGMiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg3QywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHgzRiwgMHhGMiwKKwkgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MywgMHhGQywgMHhBNCwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwNCwgMHgwMCwgMHgwOCwgMHhBNCwgMHgzRiwgMHhGQSwKKwkgMHgwOCwgMHhBMywgMHhGOCwgMHhBMywgMHgzRiwgMHhGQSwgMHgwQSwgMHhFMSwgMHhCMywgMHhGRiwgMHg5QSwgMHhGRiwgMHhDQiwgMHg4MywgMHgwMCwgMHhGNCwKKwkgMHgxMCwgMHg2MiwgMHg2QywgMHg2MSwgMHgwRSwgMHhBMywgMHhBQiwgMHg4NCwgMHhGMiwgMHhBMywgMHhBMSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhEQSwgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhGQywgMHgxOCwgMHgwMiwgMHg2MiwgMHhDOSwgMHg4MSwgMHhBQiwgMHg4NCwgMHgwMSwgMHgwMCwgMHhBMiwgMHhEQywKKwkgMHg3QSwgMHhENCwgMHhGRCwgMHgxQywgMHhBMiwgMHhEQywgMHgwOCwgMHgyNSwgMHhDRSwgMHgwMCwgMHhGMiwgMHgxRCwgMHg0MSwgMHg0NCwgMHg3QywgMHhBOCwKKwkgMHhEOSwgMHg4MSwgMHhFRSwgMHgwMywgMHhGRiwgMHhCMSwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHgyMCwgMHgyNywgMHgwNCwgMHgwMCwgMHgwOCwgMHgyNSwgMHhCRiwgMHgwMCwgMHg3QiwgMHgxRSwgMHg2RiwgMHgwMCwgMHgwOCwgMHgyNSwgMHhCQiwgMHgwMCwKKwkgMHg0MCwgMHhGRiwgMHg0MiwgMHg0MiwgMHg0NiwgMHg0MywgMHgwNiwgMHgxRSwgMHgwNCwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHg0MiwgMHg0MiwKKwkgMHg0NiwgMHg0MywgMHgwMSwgMHhBMiwgMHg2MywgMHg0NSwgMHgwMSwgMHhBMiwgMHg2MiwgMHg0MywgMHg0NiwgMHg0QywgMHhDNiwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHg4NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhFMSwgMHg5QSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgxMiwgMHhGMiwgMHgzQiwgMHhGMCwgMHgzMywgMHgxQiwKKwkgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgzOCwgMHgwMCwgMHgyRCwgMHg1QywgMHgyNCwgMHg0MSwgMHgwMiwgMHhBMSwgMHg2NSwgMHg0MywgMHgwOCwgMHhBMywKKwkgMHgyMywgMHg0NiwgMHgyMiwgMHg0MiwgMHg3RSwgMHgzQSwgMHgwQSwgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHhCOCwgMHgxOCwgMHgwMiwgMHg2MiwKKwkgMHhDOSwgMHg4MSwgMHhBQiwgMHg4NCwgMHgwMywgMHgwMCwgMHhBMiwgMHhEQywgMHg3RSwgMHgzNiwgMHhGNiwgMHgwMSwgMHgxNSwgMHgxMSwgMHg3QSwgMHhENCwKKwkgMHhGRiwgMHhGRiwgMHhGOSwgMHgxQywgMHhBMiwgMHhEQywgMHhGMCwgMHgxRCwgMHhEOSwgMHg4MSwgMHhGRiwgMHhCMSwgMHg0MSwgMHgxRSwgMHg2MiwgMHg0MCwKKwkgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHgwNywgMHgxMSwgMHg1QSwgMHhEMiwgMHg4OSwgMHhGRiwgMHg4MCwgMHg0RiwKKwkgMHg2RiwgMHg0NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwgMHgzNCwgMHgwMCwgMHg2MiwgMHg0NSwgMHgzMywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwKKwkgMHg2NSwgMHg0MiwgMHhFNSwgMHgxRCwgMHhGMiwgMHgwMSwgMHg5OCwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwMSwgMHg2NCwgMHgxMiwgMHhGQSwgMHgwRiwgMHhGMCwKKwkgMHgwQSwgMHg2NCwgMHhCMCwgMHg4NCwgMHg0MSwgMHgwMCwgMHgyNCwgMHg0MSwgMHgwMiwgMHhBMSwgMHg2NSwgMHg0MywgMHgwOCwgMHhBMywgMHgyMywgMHg0NiwKKwkgMHgyMiwgMHg0MiwgMHg3RSwgMHgzQSwgMHgwQSwgMHgwMCwgMHgwMCwgMHhGNCwgMHg4MSwgMHhGMiwgMHg1QywgMHgxOCwgMHgwMiwgMHg2MiwgMHhDOSwgMHg4MSwKKwkgMHhBQiwgMHg4NCwgMHgwMywgMHgwMCwgMHhBMiwgMHhEQywgMHg3RSwgMHgzNiwgMHhGNiwgMHgwMSwgMHg3QSwgMHhENCwgMHhGRiwgMHhGRiwgMHhGQSwgMHgxQywKKwkgMHhBMiwgMHhEQywgMHhGMSwgMHgxRCwgMHhEOSwgMHg4MSwgMHhGRiwgMHhCMSwgMHgwQiwgMHgxRSwgMHg2MiwgMHg0MCwgMHg3RSwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2MiwgMHg1QSwgMHhEMiwgMHg4OSwgMHhGRiwgMHg4MCwgMHg0RiwgMHg2RiwgMHg0NCwgMHhBMiwgMHhEQSwgMHg4OCwgMHhGRiwKKwkgMHg5OCwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwRiwgMHhGMCwgMHgwQSwgMHg2NCwgMHhCMCwgMHg4NCwgMHgxNiwgMHgxNCwgMHhGNywgMHhCNCwgMHhBMiwgMHhEQSwKKwkgMHgwNiwgMHg2MCwgMHg3NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQiwgMHgwMCwgMHhGMCwgMHhGNSwgMHhFRiwgMHhGNCwKKwkgMHgwQywgMHg2MCwgMHhFQSwgMHg2MSwgMHg1OSwgMHhEMSwgMHgzQiwgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwKKwkgMHhGQywgMHgwMiwgMHhDMywgMHg2MCwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhEQSwgMHgyRCwgMHg0NiwgMHgzQiwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgxQywgMHgwMCwgMHgwNywgMHhGNCwgMHhCQiwgMHhGMCwgMHgyQSwgMHg0NCwgMHhBNCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHgyNiwgMHgxNSwgMHgwMCwgMHgyRCwgMHg0NiwgMHg2NCwgMHg0NCwgMHgzQSwgMHhGMCwgMHhCQywgMHhGMCwgMHg2NCwgMHg1RiwgMHgzRCwgMHhGMCwKKwkgMHgwNywgMHhGNCwgMHhFRiwgMHhGNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHhBMywgMHg1QiwgMHhEOCwgMHg2NSwgMHg1QywgMHg1QiwgMHhEOCwgMHg1QiwgMHhEQSwKKwkgMHgyRCwgMHg0NiwgMHhFRCwgMHhGMywgMHgzQywgMHhGQSwgMHhFRSwgMHhGMywgMHgzRCwgMHhGQSwgMHgyQSwgMHg0NCwgMHgyMywgMHhGQSwgMHhDMywgMHg2MCwKKwkgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHg0MywgMHhGRiwgMHg0MCwgMHhGRiwgMHhCMCwgMHhGRiwgMHhCMSwgMHhGRiwKKwkgMHgyRCwgMHg0NiwgMHgwQywgMHg2MCwgMHhFQSwgMHg2MSwgMHhBMSwgMHhEMywgMHgyRCwgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwKKwkgMHhGMCwgMHhGNSwgMHhFRiwgMHhGNCwgMHg1OSwgMHhEMSwgMHgzQiwgMHhGOCwgMHgwNSwgMHg2NCwgMHg1OSwgMHhEMSwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOCwKKwkgMHhGQywgMHgwMiwgMHgyRCwgMHg0NiwgMHhDMywgMHg2MCwgMHg0OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5OCwgMHhGRiwgMHgwOSwgMHhFMSwgMHhBMSwgMHhGRiwKKwkgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHhFMCwgMHgwMSwgMHgwRiwgMHhGMiwgMHg0MCwgMHhGRiwgMHgwMiwgMHhCQywgMHhBMiwgMHhEQSwgMHhDMywgMHg2MCwKKwkgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHhBMCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhCMCwgMHg2MCwgMHgwMCwgMHhFQiwKKwkgMHgwMCwgMHg2MywgMHgzQiwgMHhGMiwgMHgwNiwgMHg2MCwgMHg3NSwgMHhGRCwgMHg2MCwgMHg0NywgMHhDMCwgMHhCNywgMHgwMiwgMHhGRSwgMHhGMCwgMHg4NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHgwMCwgMHhBOCwgMHg0MCwgMHg0QSwgMHgxNiwgMHgwMywgMHhFMCwgMHg4MSwgMHg2MSwgMHg0MywgMHg0MiwgMHhGRSwKKwkgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGRSwgMHgxRiwgMHg0MCwgMHg0QSwgMHhFMSwgMHg4NCwgMHhFMCwgMHg4NCwgMHgyRCwgMHg0NiwgMHgwNywgMHhGNCwKKwkgMHhFMCwgMHg4MSwgMHgzQiwgMHhGMCwgMHgyQSwgMHg0NywgMHgwQywgMHg2MCwgMHgzOCwgMHg2MywgMHhBMCwgMHg4NCwgMHg0NywgMHg5QywgMHgxMCwgMHgwMywKKwkgMHg3QywgMHg0NCwgMHhBOCwgMHg2MywgMHgwRiwgMHgwMCwgMHgwNywgMHhGNCwgMHgyMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHgzQiwgMHhGMCwgMHg2NiwgMHg0NCwKKwkgMHg2NCwgMHg0MCwgMHg4MCwgMHgyQiwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MCwgMHg3OCwgMHg3QywgMHgwMCwgMHg2MCwgMHg5OCwgMHg2MywgMHgwMiwgMHgwMCwKKwkgMHgyRCwgMHg0NiwgMHhCQiwgMHgwMSwgMHgyRCwgMHg0NiwgMHhFRCwgMHhGQiwgMHhFRSwgMHhGOSwgMHhFRiwgMHhGRCwgMHgwNywgMHhGMiwgMHhGMCwgMHhGQiwKKwkgMHg2MCwgMHg0NiwgMHgzQiwgMHhGMCwgMHgyQSwgMHg0NCwgMHgwNiwgMHg2MCwgMHg3NiwgMHhGOSwgMHg1QywgMHg0QiwgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgzRiwgMHgyMiwgMHgwNSwgMHgwMCwgMHg5MCwgMHg4NCwgMHgzQiwgMHhGQSwgMHgwMSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgyQywgMHgwMCwgMHhBRCwgMHg0NiwKKwkgMHgwQSwgMHhBMywgMHgzRCwgMHhGMiwgMHhBRCwgMHg0NiwgMHhBMywgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQywgMHhGMiwgMHhBRCwgMHg0NiwKKwkgMHgwMiwgMHgwMywgMHgyMSwgMHgwNywgMHgxNCwgMHgwNCwgMHg1QiwgMHhEMCwgMHhBRCwgMHg0NiwgMHhEMCwgMHg4MCwgMHgzQiwgMHhGMiwgMHgwMywgMHgwMywKKwkgMHhBRCwgMHg0NiwgMHgxOSwgMHgwNywgMHgwQywgMHgwNCwgMHgzQSwgMHhGMCwgMHhBRCwgMHg0NiwgMHg1QiwgMHhEMCwgMHg2NCwgMHg1RiwgMHhEMCwgMHg4MCwKKwkgMHgyQiwgMHg0NCwgMHgyMiwgMHgwNywgMHgwNCwgMHgwMywgMHhEMCwgMHg4NCwgMHgxMCwgMHhBNCwgMHhGRiwgMHhGRiwgMHgxRCwgMHgwNywgMHgyRCwgMHg0NiwKKwkgMHgyMiwgMHhGMiwgMHgxMCwgMHg2MCwgMHgwMCwgMHg3QywgMHhCMCwgMHg4NCwgMHgyMiwgMHhGQSwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyNiwgMHgxNCwgMHgwMCwKKwkgMHhDNSwgMHg2MCwgMHhENSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgwNiwgMHg2MCwgMHg3NSwgMHhGQiwgMHgyRCwgMHg0NiwgMHgwQywgMHg2MCwKKwkgMHhGQSwgMHg2MiwgMHg4MCwgMHhGRiwgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDNiwgMHg2MCwgMHhCQywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwgMHgwOCwgMHgyNSwgMHg0RiwgMHgwMSwgMHgyRCwgMHg0NiwgMHgwQywgMHg2MCwgMHhGQSwgMHg2MiwgMHg4MCwgMHhGRiwKKwkgMHg3OCwgMHg0NCwgMHgwMywgMHhBNCwgMHhBMiwgMHhEQiwgMHhDNywgMHg2MCwgMHg0NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NSwgMHhGRiwgMHgyRCwgMHg0NiwKKwkgMHgwOCwgMHgyNSwgMHg0MSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwRiwgMHg2NCwgMHgwOCwgMHgyNSwgMHgzQywgMHgwMSwgMHg2MCwgMHg3RiwgMHhBMCwgMHg1QiwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhFQiwgMHhEMywgMHg2MCwgMHgwMCwgMHhFQiwgMHhDNCwgMHg2MCwgMHhDMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg0NiwKKwkgMHgzQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgyMywgMHgwMCwgMHgwOCwgMHg2MSwgMHgyMywgMHgxMSwgMHgyRCwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwQSwgMHg2MiwgMHg1NiwgMHg5MiwgMHg1QSwgMHhEMCwgMHgyQywgMHg0NiwgMHg2NCwgMHg0NywgMHg2MywgMHg0MCwgMHg3RiwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MywgMHg0NiwgMHg0QywgMHg2MCwgMHhGRSwgMHhERSwgMHhEOCwgMHg3RiwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHhGNCwgMHgwMywgMHg2MywgMHg0NiwgMHg0QywgMHhERSwgMHhEQSwgMHhGRSwgMHhBMSwgMHgyMCwgMHhGRSwgMHhFNywgMHgwMiwgMHg2MywgMHg0MSwKKwkgMHhGRCwgMHhBMSwgMHg0NiwgMHg0QywgMHgwMSwgMHhGMiwgMHgyRCwgMHg0NiwgMHg2MSwgMHg1RSwgMHgxNiwgMHhGQSwgMHgyQywgMHg0NCwgMHgwNiwgMHhGQSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRCwgMHg1QywgMHgzRCwgMHg0NCwgMHgwMCwgMHhBOCwgMHhEMCwgMHg4MCwgMHhEOCwgMHgwMywgMHhENywgMHgwMywKKwkgMHgyRCwgMHg0NiwgMHgwMSwgMHg2NCwgMHgxMiwgMHhGQSwgMHhGNCwgMHgwMSwgMHgwNywgMHhGNCwgMHg2NiwgMHg0MSwgMHgwMywgMHhGMiwgMHgwNCwgMHhGMiwKKwkgMHg0MCwgMHg0MiwgMHgwNSwgMHhGMiwgMHg0MCwgMHg0MywgMHg0MCwgMHg0NCwgMHg2MSwgMHg0NiwgMHgzQywgMHhGMiwgMHgzRCwgMHhGMiwgMHg0MCwgMHg0MCwKKwkgMHg0MCwgMHg0MSwgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHhFRSwgMHhGMSwgMHhFRCwgMHhGNSwgMHg0NCwgMHg0QywgMHgyQywgMHg1QywKKwkgMHhFOSwgMHg4MCwgMHgwMCwgMHg2NCwgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwgMHg0MCwgMHg4MSwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyMywgMHg1QywgMHg5MCwgMHg5QywKKwkgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4NCwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwKKwkgMHgwQywgMHg2MCwgMHhFQywgMHg2MSwgMHgwNSwgMHg2NCwgMHhFRiwgMHhGNCwgMHhGMCwgMHhGNSwgMHhGRSwgMHhBMywgMHg1QiwgMHhEMCwgMHhDQywgMHg4NCwKKwkgMHg1OSwgMHhEOSwgMHhGQywgMHgwMiwgMHhFRiwgMHhGMywgMHhGMCwgMHhGNSwgMHg2MCwgMHg0MiwgMHgyMCwgMHg0NCwgMHhBMiwgMHhEQSwgMHgyMSwgMHg0NCwKKwkgMHg1QSwgMHhEQSwgMHgyMiwgMHg0NCwgMHg1QSwgMHhEQSwgMHgyMywgMHg0NCwgMHg1QSwgMHhEQSwgMHgyNCwgMHg0NCwgMHg1QSwgMHhEQSwgMHg2MSwgMHg0NiwKKwkgMHgwNiwgMHg2MCwgMHg3RCwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0MSwgMHhFRiwgMHhGMywgMHhGMCwgMHhGNSwgMHhBMCwgMHhEMiwKKwkgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MCwgMHg0NCwgMHg0MSwgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0MiwgMHg1QSwgMHhEMCwgMHg0NCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHhCQSwgMHhGMCwgMHgzQiwgMHhGMiwgMHg0NCwgMHg0NCwgMHg2NSwgMHg1RiwgMHg0MCwgMHg4NSwgMHhFRSwgMHhGNCwgMHhFRCwgMHhGNSwKKwkgMHg0MywgMHg0QywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyMCwgMHg0NCwgMHg0MCwgMHg4MCwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMSwgMHg0NCwKKwkgMHg0MCwgMHg4MSwgMHhCRCwgMHhEMiwgMHgyMSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMiwgMHg0NCwgMHg0MCwgMHg4MiwKKwkgMHhCRCwgMHhEMiwgMHgyMiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyMywgMHg0NCwgMHg0MCwgMHg4MywgMHhCRCwgMHhEMiwKKwkgMHgyMywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNCwgMHg0NCwgMHg0MCwgMHg4NCwgMHhCRCwgMHhEMiwgMHgyNCwgMHg1QywKKwkgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyNSwgMHg0NCwgMHg0MCwgMHg4NSwgMHg2MSwgMHg0NiwgMHgzQSwgMHhGMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFMSwgMHg3RiwgMHg1QSwgMHhEMCwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NCwKKwkgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QiwgMHg2NCwgMHg0NywgMHhFRCwgMHhGNSwgMHhCRCwgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyMCwgMHg1QywgMHg0MCwgMHg4MCwgMHgyMCwgMHg0NCwgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMCwgMHg0NywgMHhFNSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHhCRCwgMHhEMiwgMHgyMCwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMSwgMHg1QywgMHg0MCwgMHg4MSwKKwkgMHgyMSwgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NywgMHhFNywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMSwgMHg0NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyMiwgMHg1QywgMHg0MCwgMHg4MiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NywgMHhFOSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyMiwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyMywgMHg1QywgMHg0MCwgMHg4MywgMHgyMywgMHg0NCwgMHhFQSwgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgyMywgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyMywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNCwgMHg1QywKKwkgMHg0MCwgMHg4NCwgMHgyNCwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NywgMHhFRCwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNCwgMHg0NCwKKwkgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNSwgMHg1QywgMHg0MCwgMHg4NSwgMHgyNSwgMHg0NCwgMHhFRSwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyNSwgMHg0NywKKwkgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QiwgMHgyQywgMHg0MywgMHhBMywgMHhEMiwgMHgyNSwgMHg1QywgMHg5MCwgMHg4MSwgMHhFOSwgMHg4NCwgMHhFMywgMHg3RiwKKwkgMHhBMCwgMHg1QiwgMHgwNiwgMHg2MCwgMHg3RCwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFQSwgMHhGMywgMHg1QSwgMHhEMywgMHg0MCwgMHg0OCwKKwkgMHg1QSwgMHhEMywgMHg0MCwgMHg0OSwgMHg0MCwgMHg0QSwgMHgwMCwgMHg2MCwgMHg3OCwgMHg3QywgMHg0NCwgMHg0RCwgMHg0OSwgMHhGMiwgMHg0QSwgMHhGMiwKKwkgMHg0MCwgMHg0NywgMHg0MCwgMHg0NiwgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHgwMCwgMHg2MSwgMHgyRCwgMHg1QywgMHhFOSwgMHg4MCwgMHgwMCwgMHg2NCwKKwkgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NCwgMHhDMCwgMHg4MywgMHhCRCwgMHhEMiwgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOCwgMHg0NCwgMHg0MCwgMHg4OCwgMHhEQiwgMHg4MywgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwgMHhGMiwgMHhBMywgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyQSwgMHg0NCwgMHhDMCwgMHg5QywgMHg0MSwgMHg4QSwgMHhERCwgMHg4MSwgMHgwOCwgMHgyQSwgMHhBNywgMHgwMSwgMHgyNiwgMHg0NCwgMHg0NCwgMHhGQSwKKwkgMHgyNywgMHg0NCwgMHg0NSwgMHhGQSwgMHgyOCwgMHg0NCwgMHg0NiwgMHhGQSwgMHgyOSwgMHg0NCwgMHg0NywgMHhGQSwgMHgyQSwgMHg0NCwgMHg0OCwgMHhGQSwKKwkgMHgwNiwgMHg2MCwgMHg3RSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHg4OCwgMHg3QywgMHg0NCwgMHg0RCwgMHgyRCwgMHg0MiwKKwkgMHhBMiwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0NiwgMHg0NCwgMHg0NywgMHg1QSwgMHhEMiwgMHg1QSwgMHhEMCwgMHg0MCwgMHg0OCwgMHg1QSwgMHhEMCwKKwkgMHg0NCwgMHg0OSwgMHg0QiwgMHhGMiwgMHg0NCwgMHg0QSwgMHg0MCwgMHg4QiwgMHg2MCwgMHg1QywgMHg2NCwgMHg0NywgMHhFMCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHhGRiwgMHhCNCwgMHgyMCwgMHhCQywgMHg3RiwgMHhCNCwgMHhFMSwgMHg3RiwgMHhBMCwgMHg1QSwgMHg2NCwgMHg0NCwgMHhFMiwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgwMCwgMHg2MCwgMHg3OCwgMHg2MywgMHgwRCwgMHg2MCwgMHg3MCwgMHg2NSwgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywKKwkgMHg5MCwgMHg5QywgMHgyNiwgMHg0NCwgMHg0MCwgMHg4NiwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywKKwkgMHgyNywgMHg0NCwgMHg0MCwgMHg4NywgMHhCRCwgMHhEMiwgMHgyNywgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyOCwgMHg0NCwKKwkgMHg0MCwgMHg4OCwgMHhCRCwgMHhEMiwgMHgyOCwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwKKwkgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyOSwgMHg0NCwgMHg0MCwgMHg4OSwKKwkgMHhCRCwgMHhEMiwgMHgyOSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQSwgMHg0NCwgMHg0MCwgMHg4QSwgMHhCRCwgMHhEMiwKKwkgMHgyQSwgMHg1QywgMHg5MCwgMHg5QywgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NCwgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMSwgMHg2NCwgMHg0NywgMHg5MCwgMHg5QywgMHgyQiwgMHg0NCwgMHg0MCwgMHg4QiwgMHhCRCwgMHhEMiwgMHgyQiwgMHg1QywKKwkgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyNiwgMHg1QywgMHg0MCwgMHg4NiwgMHgyNiwgMHg0NCwgMHhFNCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyNiwgMHg0NywgMHhFNSwgMHg3RiwgMHhBMCwgMHg1QSwgMHhCRCwgMHhEMiwgMHgyNiwgMHg1QywgMHg5MCwgMHg4NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwKKwkgMHgyNywgMHg1QywgMHg0MCwgMHg4NywgMHgyNywgMHg0NCwgMHhFNiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyNywgMHg0NywgMHhFNywgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyNywgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOCwgMHg1QywgMHg0MCwgMHg4OCwgMHgyOCwgMHg0NCwgMHhFOCwgMHg3RiwgMHhBMCwgMHg1QSwKKwkgMHgyOCwgMHg0NywgMHhFOSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOCwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyOSwgMHg1QywgMHg0MCwgMHg4OSwKKwkgMHgyOSwgMHg0NCwgMHhFQSwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NywgMHhFQiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgyOSwgMHg0NCwgMHhFOCwgMHg4MCwKKwkgMHhGOCwgMHg4NCwgMHgyQSwgMHg1QywgMHg0MCwgMHg4QSwgMHgyQSwgMHg0NCwgMHhFQywgMHg3RiwgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NywgMHhFRCwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyQSwgMHg0NCwgMHhFOCwgMHg4MCwgMHhGOCwgMHg4NCwgMHgyQiwgMHg1QywgMHg0MCwgMHg4QiwgMHgyQiwgMHg0NCwgMHhFRSwgMHg3RiwKKwkgMHhBMCwgMHg1QSwgMHgyQiwgMHg0NywgMHhFRiwgMHg3RiwgMHhBMCwgMHg1QSwgMHgzQywgMHhGMCwgMHgyQiwgMHg0NCwgMHg5MCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFMywgMHg3RiwgMHhBMCwgMHg1QSwgMHgwNiwgMHg2MCwgMHg3RSwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgwMCwgMHhGMCwKKwkgMHg4NCwgMHg2MCwgMHgwMCwgMHhFMywgMHgwNCwgMHg3MSwgMHg2NCwgMHg1MCwgMHgwMSwgMHgyQSwgMHgwNCwgMHg3MSwgMHg1QywgMHg2MSwgMHgwNCwgMHg2MywKKwkgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgzRCwgMHhGMiwgMHg2MCwgMHg0MywgMHg2MCwgMHg0NywgMHg1QiwgMHhEQiwgMHgzQywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg1QiwgMHhEQiwgMHgzQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg1QiwgMHhEQiwgMHgzRiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg1QiwgMHhEQiwgMHg4MSwgMHg2MCwgMHgxOCwgMHhFMywgMHg2NSwgMHg0MywgMHhFMywgMHg4NCwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHg2MCwgMHg1MCwgMHg3RiwgMHg2NCwgMHgyMywgMHg5NCwgMHg2MCwgMHg1MSwgMHg3QywgMHg3MiwgMHgwNCwgMHg3NSwgMHgwQywgMHg2MCwKKwkgMHgxNiwgMHg2MSwgMHgxNiwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHgyQSwgMHhGMiwgMHg4NywgMHg2MCwgMHg4RiwgMHg2NSwgMHhBNCwgMHg4NywKKwkgMHg0MCwgMHhCRiwgMHg1OSwgMHhEQiwgMHg1NiwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHg2MiwgMHg2NCwKKwkgMHgwNCwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHgzNSwgMHhGMiwgMHgwRiwgMHg2NSwgMHhBNCwgMHg5QywgMHg1OSwgMHhEOSwKKwkgMHgwNiwgMHg2MywgMHg1OSwgMHhERiwgMHhGRSwgMHgxRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgwMywgMHgyQiwgMHgwNSwgMHgwMCwKKwkgMHg2QSwgMHg2NCwgMHgwNCwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHg2NSwgMHg0MCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgzOSwgMHhGMCwgMHg1OSwgMHhEOSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwQywgMHg2MCwgMHgxNiwgMHg2MSwgMHhBMywgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHg1OSwgMHhERiwgMHg1OSwgMHhERiwKKwkgMHhBMCwgMHg0QywgMHgwNCwgMHhCQywgMHhGRiwgMHhCNCwgMHhBMCwgMHg1MSwgMHgyMywgMHg0NCwgMHgwMSwgMHhBNywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1MCwKKwkgMHg4MCwgMHg2MCwgMHgzOCwgMHg3MSwgMHg4MCwgMHg2MCwgMHg3QywgMHg3MiwgMHgwMSwgMHg3NiwgMHhGRiwgMHhGRiwgMHg3NiwgMHg0NCwgMHgwMSwgMHgzQSwKKwkgMHhGRCwgMHgwMSwgMHg0MCwgMHg3NiwgMHg0MCwgMHg3NiwgMHg0MiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg3NiwgMHg4MCwgMHg2MCwgMHgxOCwgMHg3MCwKKwkgMHg4MCwgMHg2MCwgMHgxOCwgMHg3MSwgMHg4MCwgMHg2MCwgMHg3QywgMHg3MiwgMHg4MCwgMHg2MCwgMHgxMCwgMHg3MywgMHgwMiwgMHg3NiwgMHg3NiwgMHg0NCwKKwkgMHhGRiwgMHhGRiwgMHg3NiwgMHg0NCwgMHgwMiwgMHgzQSwgMHhGRCwgMHgwMSwgMHg0MCwgMHg3NiwgMHg0MiwgMHhGRiwgMHgzQywgMHg0NiwgMHgwMCwgMHhGMiwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHhCQywgMHg2MCwgMHg1MCwgMHg4MCwgMHg2MCwgMHgxMiwgMHg3MSwgMHg4MCwgMHg2MCwgMHg2RSwgMHg3MiwgMHgzRiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhGOCwgMHhBNywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1MywgMHgwNCwgMHg3NiwgMHhGRiwgMHhGRiwgMHg4OCwgMHhGRiwgMHgzQywgMHg0NiwKKwkgMHgwNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg0MCwgMHg0MywgMHhBMywgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3NywgMHg0MCwgMHg4QiwgMHhGRiwKKwkgMHhBMCwgMHg0QiwgMHgwNCwgMHhFMSwgMHhGRiwgMHhGRiwgMHg3NiwgMHg0NCwgMHgwNCwgMHgzQSwgMHhGRCwgMHgwMSwgMHg0MCwgMHg3NiwgMHg0MiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg3NiwgMHhGRiwgMHhGRiwgMHg3NiwgMHg0NCwgMHgyMCwgMHgzQSwgMHhGRCwgMHgwMSwgMHg0MCwgMHg3NiwgMHg0MiwgMHhGRiwKKwkgMHg2MywgMHg0NCwgMHgwMCwgMHg3RiwgMHhBMCwgMHg1MSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg3NSwgMHg4OCwgMHhGRiwgMHhBMCwgMHg0QywgMHhGQiwgMHhCNCwKKwkgMHhBMCwgMHg1MSwgMHgwNiwgMHg2MCwgMHgxRiwgMHhFMSwgMHgxNiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHhGOCwgMHhBNCwgMHgzRiwgMHhGQSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHhBMCwgMHg0OCwgMHgwOCwgMHgyNiwKKwkgMHgwNywgMHgwMCwgMHhBMCwgMHg0QywgMHgwNCwgMHhFMSwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RiwgMHhBMCwgMHg1MSwKKwkgMHg0MiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg4QiwgMHhGRiwgMHgwMiwgMHg2MCwgMHgwMCwgMHg3NSwgMHgzQywgMHhGMiwgMHg0MCwgMHg3NiwgMHgxNCwgMHgxQiwKKwkgMHgyNiwgMHg0NiwgMHgzQiwgMHhGMiwgMHgwQywgMHg2MCwgMHhCQSwgMHg2MywgMHg2MCwgMHg0NywgMHhDMCwgMHhCNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHg0MywgMHg5MywgMHhFMywgMHg5QywgMHg2NCwgMHg0NywgMHg4MCwgMHg3QywgMHg2NCwgMHg1RiwgMHg2MCwgMHg1MCwgMHg3RiwgMHg2NCwKKwkgMHgyMywgMHg5NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1MSwgMHgwNywgMHgwMCwgMHgwMSwgMHhBNywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1MCwgMHg4MCwgMHg2MCwKKwkgMHg0MCwgMHg3MSwgMHg4MCwgMHg2MCwgMHg3QywgMHg3MiwgMHgwMSwgMHg3NiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwQywgMHgyMSwKKwkgMHhGQywgMHgwMSwgMHgwNCwgMHgyNSwgMHhENSwgMHgwMSwgMHg0MCwgMHg3NiwgMHg0MywgMHhGRiwgMHgwQywgMHg2MCwgMHgyMiwgMHg2MSwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwMiwgMHg2NCwgMHgwQSwgMHg2MywgMHg1OCwgMHhEMCwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHg1OSwgMHhERiwgMHg1OSwgMHhERiwKKwkgMHg4MCwgMHg2MCwgMHgxOCwgMHg3MCwgMHg4MCwgMHg2MCwgMHgyNCwgMHg3MSwgMHg4MCwgMHg2MCwgMHg3QywgMHg3MiwgMHg4MCwgMHg2MCwgMHgxMCwgMHg3MywKKwkgMHgwMiwgMHg3NiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwQywgMHgyMSwgMHhGQywgMHgwMSwgMHgwNCwgMHgyNSwgMHhCOCwgMHgwMSwKKwkgMHg0MCwgMHg3NiwgMHg0MywgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1MCwKKwkgMHg4MCwgMHg2MCwgMHgxMiwgMHg3MSwgMHgzRiwgMHhGMiwgMHg4MCwgMHg2MCwgMHg2RSwgMHg3MiwgMHg2MCwgMHg0NywgMHg4MCwgMHhCRiwgMHg2MCwgMHg1MywKKwkgMHgwNCwgMHg3NiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwQywgMHgyMSwgMHhGQywgMHgwMSwgMHgwNCwgMHgyNSwgMHhBMCwgMHgwMSwKKwkgMHg0MCwgMHg3NiwgMHg0MywgMHhGRiwgMHgwOCwgMHg3NiwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwQywgMHgyMSwgMHhGQywgMHgwMSwKKwkgMHgwNCwgMHgyNSwgMHg5NiwgMHgwMSwgMHg3NiwgMHg1QywgMHhGRiwgMHhGRiwgMHg0MCwgMHg3NiwgMHg0MywgMHhGRiwgMHg4OCwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhFRSwgMHg2MCwgMHg2MCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHgwMCwgMHhEQiwgMHhGMywgMHgzMSwgMHg0MSwgMHgwMSwgMHhCMSwKKwkgMHgwMywgMHhBOCwgMHgyQSwgMHgwMywgMHgxNSwgMHgwMiwgMHgyMCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgwQiwgMHgwMCwgMHhCQiwgMHhGRSwgMHhDQSwgMHhGRSwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgwNywgMHgwMCwgMHgwOCwgMHg2MCwgMHgwOSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHgwMCwKKwkgMHhBOSwgMHhGRSwgMHhEQiwgMHgwNSwgMHhBQiwgMHhGRSwgMHgwQywgMHgwNSwgMHhBOCwgMHhGRSwgMHhDQywgMHgwNSwgMHhBQSwgMHhGRSwgMHhDRCwgMHgwNSwKKwkgMHg3OCwgMHg0MywgMHgwMSwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHhBMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4NSwgMHgzRSwKKwkgMHgxMywgMHg2MCwgMHgwMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwMywgMHgwMiwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NSwgMHhENCwgMHg4MCwgMHgwRiwgMHhGMCwgMHhGOSwgMHgwMywgMHg2NCwgMHg0NCwgMHg3MCwgMHhCMCwgMHg3MCwgMHgyQSwKKwkgMHgxMywgMHgwMCwgMHgxNiwgMHg2MCwgMHg4NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgzQiwgMHhBMiwgMHhEQiwKKwkgMHhBMiwgMHhGRiwgMHhBQywgMHhGMywgMHhGRiwgMHhGRiwgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwgMHhBQywgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwOSwgMHgwMCwgMHg2NiwgMHg0NSwKKwkgMHgwOSwgMHhGNCwgMHgwRiwgMHhGMiwgMHgwMiwgMHgxOCwgMHg2NSwgMHg0NiwgMHhFNCwgMHgxQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0NiwgMHhDQywgMHgwMSwKKwkgMHhBMiwgMHhGRiwgMHhBQywgMHhGMywgMHg0NiwgMHg0NiwgMHhDQywgMHg4NCwgMHhGRSwgMHhBMCwgMHhBQywgMHhGQiwgMHgwMSwgMHgwNywgMHhENCwgMHhGRSwKKwkgMHhBMywgMHhGRiwgMHgwRiwgMHhGMCwgMHhBMywgMHhGQywgMHg2NCwgMHg0NCwgMHg4MCwgMHgyNiwgMHgzNSwgMHgwMCwgMHgyQywgMHg2MCwgMHhFQSwgMHg2NCwKKwkgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNywgMHg2MCwKKwkgMHgwMSwgMHg2NCwgMHgyMiwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgxRCwgMHgwMCwgMHgwNCwgMHgyQSwKKwkgMHgxRiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwQywgMHhCMCwgMHgwOCwgMHgzQSwgMHgxQSwgMHgwMCwgMHgyQywgMHhGMCwgMHgyMiwgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxMiwgMHgwMCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwKKwkgMHgwRiwgMHgwMCwgMHgzOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzQSwgMHgwQSwgMHgwMCwgMHgyMywgMHhGMiwgMHgwMCwgMHg2MCwKKwkgMHgwMSwgMHg3QywgMHhCMCwgMHg4NCwgMHgyMywgMHhGQSwgMHgwQywgMHgwMCwgMHgyMywgMHhGQSwgMHhEMCwgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNywgMHhGOCwgMHgwMSwKKwkgMHgwRiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHgwOCwgMHgyNiwgMHg2NCwgMHgwMCwgMHgyQSwgMHhGMiwgMHg2MCwgMHg2MywgMHg2MCwgMHg0MCwKKwkgMHgwMiwgMHgyQiwgMHg2NiwgMHg2MywgMHhCRSwgMHhEMiwgMHg4MSwgMHhGMSwgMHhBMywgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHgwRCwgMHgwMiwKKwkgMHhCRiwgMHhEMiwgMHhEMCwgMHg4MCwgMHg3RiwgMHhGMSwgMHgwOSwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHgyQywgMHg2MCwKKwkgMHhGNiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwNywgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwNiwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwKKwkgMHhEMCwgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzQSwgMHgwNiwgMHgwMCwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhDQywgMHg2MCwgMHgzMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwNCwgMHgyQSwKKwkgMHgyRCwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwQywgMHhCMCwgMHgwOCwgMHgzQSwgMHgyOCwgMHgwMCwgMHgyQywgMHhGMCwgMHgyMiwgMHhGMCwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgyMCwgMHgwMCwgMHg4RiwgMHhCMCwgMHg4OCwgMHgzQSwKKwkgMHgxRCwgMHgwMCwgMHgzOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhCMCwgMHgyMCwgMHgzQSwgMHgxOCwgMHgwMCwgMHgyQywgMHhGMCwgMHg2NiwgMHg0NSwKKwkgMHgwNywgMHhGNCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHhBNiwgMHhGNSwgMHgzQSwgMHhGMiwgMHg2NSwgMHg0NiwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgwRCwgMHgwMCwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwOCwgMHgwMCwgMHgyMCwgMHgyQiwgMHgwNiwgMHgwMCwKKwkgMHgyMywgMHhGMiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg3QywgMHhCMCwgMHg4NCwgMHgyMywgMHhGQSwgMHgwMywgMHgwMCwgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzMiwgMHg0NCwgMHgwMSwgMHgyQSwgMHg0QSwgMHgwMCwgMHgyRSwgMHg2MCwgMHg0MCwgMHg2MywgMHhCRiwgMHhEMywgMHgwMCwgMHg2NSwKKwkgMHhCNCwgMHg4MSwgMHhEQiwgMHg4MywgMHgzRCwgMHgwMywgMHhCRiwgMHhEMywgMHhBMywgMHhEMywgMHg0MCwgMHg0OCwgMHhCRSwgMHhEMywgMHg0MCwgMHg0QSwKKwkgMHgyRSwgMHhGMCwgMHg0MCwgMHg0QywgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyQywgMHhGMCwKKwkgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgyQiwgMHgwMywgMHgzMSwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHgzMCwgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgyRiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMywgMHgzNCwgMHhGMCwgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzMywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwKKwkgMHhEMCwgMHg4MCwgMHgzMiwgMHhGMCwgMHgwNCwgMHgwMiwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgzOCwgMHhGMCwKKwkgMHgyQywgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNywgMHhGMCwgMHgwOCwgMHgwMiwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4MCwgMHgzNiwgMHhGMCwgMHgwNCwgMHgwMiwKKwkgMHgyOCwgMHg0NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHhGQSwgMHhBMSwgMHgwNiwgMHhBMywgMHhCNywgMHgwMywgMHhDMywgMHgwMSwKKwkgMHgwNywgMHg2MCwgMHgwMCwgMHg2NCwgMHgyMywgMHhGQSwgMHhEMCwgMHg2MCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgwRiwgMHhGMCwKKwkgMHg2MCwgMHg0NSwgMHhBNCwgMHgzNiwgMHgwOCwgMHgwMCwgMHgwQywgMHhCNCwgMHgwNCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwNiwgMHgwMCwKKwkgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRSwgMHg2MCwgMHg3QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHg2NSwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgxNywgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxNCwgMHgwMCwgMHgwNywgMHhGNCwgMHgzQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHgzNywgMHhCNCwgMHgyNiwgMHg0NiwgMHgwRSwgMHgwMiwgMHgyQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwNiwgMHgwMCwKKwkgMHgyQywgMHg2MCwgMHhGMCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg2NCwgMHg0MCwgMHg2MCwgMHgyNiwgMHgwMywgMHgwMCwgMHhDRSwgMHg2MCwgMHg0RSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MSwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHg2MSwgMHg0NCwgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyQSwgMHhGMiwgMHgxMiwgMHgwMCwKKwkgMHg2MCwgMHg0MCwgMHg0MCwgMHgzQSwgMHgwRiwgMHgwMCwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHgzQSwgMHhFNiwgMHgwMSwKKwkgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhBNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMSwgMHgwMiwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHhDRCwgMHg2MCwKKwkgMHhFMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NCwgMHg2MywgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMiwKKwkgMHg3RiwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwgMHg4MSwgMHhGMSwgMHgyQSwgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgzQSwgMHgwOSwgMHgwMCwgMHgwMSwgMHgwQywgMHhDOCwgMHgwMSwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg2MCwgMHhFMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMywgMHgwQywgMHhEMSwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhBNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhCQiwgMHgwMiwgMHgwMiwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQSwgMHhGQiwgMHgwMCwgMHg2NCwgMHgxMCwgMHg2MCwKKwkgMHgwRSwgMHhGQiwgMHgyNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgwNSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNywgMHgwNywgMHgwMCwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQSwgMHhGQiwgMHhBMCwgMHgwMSwgMHhDRCwgMHg2MCwgMHhFMSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHhGRCwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHgyMCwgMHg0MCwKKwkgMHgxMCwgMHgyMiwgMHhGNCwgMHgwMSwgMHgwOCwgMHg2MCwgMHgwNywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgzMSwgMHhGMiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwKKwkgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwKKwkgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHhBNiwgMHhGMSwgMHg0MywgMHg0MywKKwkgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhDRCwgMHg2MCwgMHhEOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMywgMHg0QiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwKKwkgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MCwgMHhGRSwKKwkgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGQiwgMHgwMiwgMHgwMCwgMHgyMCwgMHhGRSwKKwkgMHhGRiwgMHg2NSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHgyMCwgMHhGRSwKKwkgMHhDRCwgMHg4MSwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQSwgMHgzOSwgMHgwMCwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHgyRSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgyQSwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwKKwkgMHgyNiwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgyMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwKKwkgMHgxRSwgMHgwMCwgMHgxMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgxQSwgMHgwMCwgMHgxOCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg0MCwgMHg2NCwKKwkgMHgxNiwgMHgwMCwgMHgyNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg4MCwgMHg2NCwgMHgxMiwgMHgwMCwgMHgzMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NywKKwkgMHgwRSwgMHgwMCwgMHg0OCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NywgMHgwQSwgMHgwMCwgMHg2MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NywKKwkgMHgwNiwgMHgwMCwgMHg2QywgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NywgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg2MCwKKwkgMHgzQiwgMHhGMSwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGQiwgMHg2MSwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwNSwgMHgwMCwKKwkgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhCQiwgMHgwMSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxRSwgMHgwMCwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwKKwkgMHgzMiwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHg2MCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywKKwkgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg5MSwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NSwKKwkgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgwNCwgMHgwMCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgzNywgMHg2MCwgMHhGOCwgMHg2MSwKKwkgMHhBMSwgMHhEMSwgMHhBMSwgMHhGMywgMHgwMSwgMHg2MCwgMHhBQywgMHg2MywgMHg2MCwgMHg0NSwgMHgyQSwgMHg0NCwgMHg3OSwgMHhGQiwgMHhBMywgMHhENSwKKwkgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1QiwgMHhENSwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1OSwgMHhEMSwgMHg2NiwgMHg0MSwgMHhBMCwgMHg4NCwKKwkgMHgyNCwgMHg5NCwgMHgyQiwgMHg0NiwgMHgwRiwgMHhGQSwgMHg3QSwgMHhGQiwgMHgxNiwgMHg2NCwgMHgxMiwgMHhGQSwgMHgwMSwgMHg2NCwgMHgxMSwgMHhGQSwKKwkgMHg2NiwgMHg1QywgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgyOCwgMHgwMCwgMHgxOSwgMHg2MCwgMHg0NCwgMHhGMywgMHgzMiwgMHg2MCwgMHg4OCwgMHg2MywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQywgMHgwMCwgMHgwRiwgMHg2NCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHg2MCwgMHhGRiwgMHg2MywgMHgxQSwgMHg2MCwgMHhCMywgMHhGRCwgMHgxQSwgMHg2MCwgMHhDMywgMHhGRCwgMHgxQywgMHgwMCwgMHgxOSwgMHg2MCwKKwkgMHgzOSwgMHhGMywgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhGQywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwRiwgMHhCNCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQSwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhGQywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHg1OCwgMHg0RSwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyMywgMHg0MywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHg4MCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgyQywgMHg2MCwgMHhFNCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgyNywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgwNywgMHgwMCwgMHgyQywgMHg2MCwgMHhGMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgwOCwgMHgwMCwgMHgwMiwgMHgzQiwgMHgwNiwgMHgwMCwgMHgyQywgMHg2MCwgMHhGNCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHgyQSwgMHhGMiwKKwkgMHgyOCwgMHg0MSwgMHg0MCwgMHhBOCwgMHgwMSwgMHhCMSwgMHgwMiwgMHgwMiwgMHg0NiwgMHgwMiwgMHg3NiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgwRiwgMHgwMCwgMHgyQywgMHg2MCwgMHhFMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgxQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgyQywgMHg2MCwgMHhFOCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhGMCwgMHg3OCwgMHhCNSwgMHhGMSwKKwkgMHgwRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyNiwgMHgyOCwgMHgwMCwgMHgzMiwgMHg0NCwgMHgwMiwgMHgyNiwgMHgyNSwgMHgwMCwKKwkgMHgxMCwgMHgyQiwgMHgyOSwgMHgwMCwgMHgyRSwgMHg2MCwgMHg0MCwgMHg2MywgMHhCRiwgMHhEMywgMHgyQywgMHhGMCwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0MSwKKwkgMHgwRCwgMHgwMywgMHg1MCwgMHhGRSwgMHhCRCwgMHhEMywgMHgyRCwgMHhGMCwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMywgMHgyRSwgMHhGMCwgMHhEMCwgMHg4MCwKKwkgMHhCRCwgMHhEMywgMHgyQywgMHhGMCwgMHhEMCwgMHg4MCwgMHhGQSwgMHhBMSwgMHgxMCwgMHgwQywgMHhGMywgMHgwMiwgMHg1MCwgMHhGRSwgMHg2MCwgMHg2MCwKKwkgMHgwMSwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRCwgMHhGMCwgMHgxRCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyRSwgMHhGMCwgMHgwMSwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwQywgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgxQywgMHg2MCwgMHgxMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwKKwkgMHhGNywgMHgwMSwgMHgyQSwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyQSwgMHgwMCwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHhCNCwgMHgwMywgMHhBOCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgxRCwgMHgwMCwgMHgwMywgMHg2NywKKwkgMHhBMCwgMHg4NCwgMHgwMCwgMHgzNywgMHg2NCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNywgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNywKKwkgMHg1OCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMywgMHgzNywgMHgwRCwgMHgwMCwgMHhCRCwgMHhEMiwgMHg3RiwgMHhGMSwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MCwgMHhGMSwgMHgwNywgMHgwMiwgMHhEMCwgMHg4MCwgMHhCRCwgMHhEMiwgMHg4MSwgMHhGMSwgMHgwMywgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMywgMHgwMywgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNiwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgwMywgMHgwMCwKKwkgMHhEMCwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGNCwgMHhBNiwgMHhGMSwgMHgyNywgMHgxQiwgMHgzMSwgMHhGMiwgMHgxRCwgMHg2MCwKKwkgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywKKwkgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwKKwkgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwKKwkgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgwMywgMHgwMCwgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHhENiwgMHgwMywKKwkgMHg0MywgMHg0MywgMHhEQiwgMHhGMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwNCwgMHgwMCwgMHgwNywgMHhCNCwgMHgwMywgMHhBOCwgMHgyQSwgMHhGMiwKKwkgMHg0NSwgMHgwMiwgMHhBNiwgMHhGMSwgMHgyMywgMHg0MywgMHhEMywgMHg4MCwgMHhGRiwgMHhGRiwgMHg0MCwgMHgwMiwgMHhEMCwgMHg2MCwgMHg1OCwgMHg0RiwKKwkgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgzNCwgMHgwMCwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNSwgMHgwMCwgMHg2MywgMHg0NiwgMHg4MCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHgwNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHg0MywgMHg0MywgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOSwgMHgwMCwKKwkgMHgxOSwgMHg2MCwgMHg0NCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyMywgMHg0NiwgMHgwRiwgMHg2NCwKKwkgMHgxMCwgMHgwMCwgMHgzNywgMHg2MCwgMHhGOCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhBMSwgMHhGMywgMHgwMSwgMHg2MCwgMHhBQywgMHg2MywgMHg2MCwgMHg0NSwKKwkgMHhBMywgMHhEMywgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1QiwgMHhEMywgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1OSwgMHhEMSwgMHgyMywgMHg0NiwKKwkgMHhBMCwgMHg4NCwgMHgwRiwgMHhGQSwgMHg3QSwgMHhGQiwgMHg3OSwgMHhGQiwgMHgxNiwgMHg2NCwgMHgxMiwgMHhGQSwgMHgwMSwgMHg2NCwgMHgxMSwgMHhGQSwKKwkgMHg2NiwgMHg1QywgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwNywgMHhGQywgMHg0MywgMHg0MywKKwkgMHgyQSwgMHhGMiwgMHg2MywgMHg0NSwgMHgwQywgMHhCNCwgMHgwOCwgMHgzQSwgMHgwQSwgMHgwMCwgMHhEQiwgMHhGMywgMHgyMywgMHg0NiwgMHgwNywgMHhCNCwKKwkgMHhGRCwgMHhBMCwgMHgwNiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwMywgMHgwMywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwRCwgMHgwMCwgMHgyQSwgMHhGMiwKKwkgMHgzNSwgMHhGMCwgMHg2MCwgMHg0MCwgMHhBNCwgMHgzNiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgyQiwgMHgwQywgMHgwMCwgMHgyMywgMHg0NiwgMHgyNiwgMHhGMiwKKwkgMHgyNiwgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMiwgMHhEMCwgMHg2MCwgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMCwgMHg2MCwKKwkgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMywgMHg0NiwgMHgyMiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0NCwgMHg0QywgMHgwRiwgMHgyNiwgMHgxRCwgMHgwMCwKKwkgMHgwMCwgMHhCQywgMHg0MCwgMHg0NSwgMHgwQiwgMHgwMywgMHgwMCwgMHg2NCwgMHgyMywgMHg0NiwgMHgyMiwgMHhGQSwgMHgyNiwgMHg0NiwgMHhBMiwgMHhGRiwKKwkgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMCwgMHgyQywgMHg0NCwKKwkgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwQSwgMHgwMCwgMHgyMywgMHg0NiwgMHgyNiwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHhEMCwgMHg2MCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMiwgMHgwMiwgMHhGQSwgMHhBMiwgMHhGRiwKKwkgMHgxNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0NCwgMHgwMSwgMHgyNiwgMHhEQywgMHg5QywgMHhCMCwgMHhGMywgMHgyQSwgMHhGMiwgMHhEQywgMHg4MywKKwkgMHhCMCwgMHhGRCwgMHgwNiwgMHhGNCwgMHgwMSwgMHhGOCwgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MCwgMHg0MCwgMHgyQiwgMHgxOCwgMHgwMCwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg2NSwgMHhGRiwgMHhCNCwgMHhGQywgMHhBNCwgMHgwNiwgMHhGMCwgMHgwMywgMHgwMywgMHg2NCwgMHg0NiwgMHgwQywgMHgwRCwgMHgwMiwgMHg2NSwKKwkgMHgyNiwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg2MCwgMHg0NiwgMHhGOSwgMHgwMSwKKwkgMHgwMSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4NCwgMHgwMSwgMHhGQSwgMHg2NiwgMHg0NCwgMHgyNiwgMHg0NiwgMHgwNiwgMHhGQSwgMHgwNiwgMHhGNCwKKwkgMHgwMCwgMHhGMiwgMHg4MCwgMHhGQywgMHg0MCwgMHg0NSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgyQywgMHg0NCwgMHgwRiwgMHgyNiwgMHgxMywgMHgwMCwgMHgyMywgMHg0NiwgMHgyNiwgMHhGQSwgMHgyNiwgMHg0NCwgMHgyMiwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHhFNCwgMHhBNCwgMHgzRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg2RSwgMHgwMCwgMHhBMywgMHg0NiwKKwkgMHgyNiwgMHhGMiwgMHg2MCwgMHg0NSwgMHhEQywgMHg4NCwgMHhENCwgMHg4MCwgMHgyNiwgMHhGQSwgMHhBMywgMHg0NiwgMHg2QiwgMHgwMiwgMHgyQSwgMHhGMCwKKwkgMHhBMywgMHg0NiwgMHgyMiwgMHhGMiwgMHhBMywgMHg0NiwgMHgwMCwgMHhCQywgMHgwMCwgMHhGMiwgMHgwMSwgMHgwMiwgMHg2MywgMHgwMCwgMHg0NCwgMHg0QywKKwkgMHgzRiwgMHhGMCwgMHg2MCwgMHg0MywgMHgyMywgMHg0NiwgMHgyMiwgMHhGNCwgMHgwOSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgzRiwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHhDMCwgMHg4NCwgMHhENCwgMHg4MCwgMHg2MCwgMHg0NSwgMHg1NiwgMHgwNywgMHg4MCwgMHhGQywgMHgxQiwgMHhGMiwgMHgwNiwgMHhGMiwgMHg2MCwgMHg0MSwKKwkgMHgyMywgMHg0NiwgMHgyMiwgMHhGNCwgMHgxQiwgMHhGMCwgMHgwNiwgMHhGMCwgMHhDMSwgMHg4MSwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGQSwgMHg5QiwgMHhGQSwKKwkgMHg2NSwgMHg0NCwgMHgzRiwgMHhGQSwgMHg2NCwgMHg0NiwgMHgwMCwgMHhGQywgMHg2MywgMHg0NiwgMHgwMSwgMHhGMiwgMHgxMCwgMHg2MSwgMHhGMiwgMHhBNCwKKwkgMHgwMSwgMHhGQSwgMHhDOCwgMHg4MywgMHgwMiwgMHg2NCwgMHg1OSwgMHhEMCwgMHg1OCwgMHhEOCwgMHhGRCwgMHgxRiwgMHgwNiwgMHg0NSwgMHgwMCwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhBMiwgMHhGRiwgMHgwMCwgMHhGNCwgMHgwMSwgMHhGMCwgMHgwQSwgMHgxOCwgMHg3MCwgMHg2NywgMHhBMCwgMHg4MCwgMHhGMCwgMHg2NywgMHgwNiwgMHgwMywKKwkgMHhDMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNSwgMHg0NiwgMHgyNSwgMHg0NCwgMHg4MCwgMHhGQywgMHgwNSwgMHhGQSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhENCwgMHhGRSwgMHhBMywgMHhGRiwgMHgyQywgMHg0NCwgMHgwNCwgMHgyNywgMHgxNiwgMHgwMCwgMHgyMywgMHg0NiwKKwkgMHgyMiwgMHhGMiwgMHhBMiwgMHhGQywgMHg2MCwgMHg0NiwgMHg0NiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwKKwkgMHgyNiwgMHg0NiwgMHgyQywgMHg0MywgMHgyQSwgMHhGQywgMHgwNiwgMHhGNCwgMHgwMCwgMHg2NCwgMHgwMCwgMHhGQSwgMHgwMSwgMHhGMCwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHgwMSwgMHhGQSwgMHgyNiwgMHg0NiwgMHgxRCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDQSwgMHg2MCwKKwkgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHg0NiwgMHgyMiwgMHhGMCwgMHhBMiwgMHhGQywgMHgwMCwgMHg2MywgMHgzMywgMHg4NSwgMHhBMywgMHg0NiwKKwkgMHgwRCwgMHgwMywgMHhBMywgMHg0NiwgMHgyNiwgMHhGMiwgMHgwRiwgMHg2NSwgMHhBNCwgMHg4NSwgMHhENCwgMHg4NCwgMHgyNiwgMHhGQSwgMHhBMywgMHg0NiwKKwkgMHhBMiwgMHhGRiwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RSwgMHhGNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMywgMHhGRiwgMHgyNiwgMHg0NiwgMHhEMCwgMHg2MCwKKwkgMHhCNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgzMiwgMHhGMCwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgyNCwgMHgwMCwgMHgwMSwgMHgyQiwKKwkgMHgxMywgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgxMCwgMHgwMCwgMHgyQywgMHg2MCwgMHhFMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgyQywgMHg2MCwgMHhFOCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhGMCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgwRiwgMHgwMCwgMHgyQywgMHg2MCwgMHhFMCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgxQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NSwgMHgyQywgMHg2MCwgMHhFNiwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhGMCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgwNywgMHhGNCwgMHhGRiwgMHhGRiwgMHgyNiwgMHhGMiwgMHgyNiwgMHg0NiwgMHgwRiwgMHhCNCwKKwkgMHhEQywgMHg4NSwgMHgyQywgMHg2MCwgMHhFNCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwgMHhGMCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgyNywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQiwgMHgwNywgMHgwMCwgMHgyQywgMHg2MCwgMHhGMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgwOCwgMHgwMCwgMHgwMiwgMHgzQiwgMHgwNiwgMHgwMCwgMHgyQywgMHg2MCwgMHhGNCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg3OCwgMHg0MSwgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHgwNywgMHhGMiwgMHgyNiwgMHhGMCwgMHg0MSwgMHgxOCwgMHg2MCwgMHg0NiwgMHhGRiwgMHg2NywKKwkgMHgyMCwgMHg4OCwgMHg2NCwgMHg1RiwgMHg0MCwgMHg0QSwgMHgxNSwgMHhGMCwgMHgyOCwgMHg0NCwgMHhEMCwgMHg4NCwgMHgwMywgMHhBNCwgMHgwMywgMHgwRSwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNCwgMHgwMCwgMHhGQSwgMHhBNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhDMCwgMHhCRiwgMHhDMCwgMHg4NCwKKwkgMHgxNSwgMHhGQSwgMHg0MCwgMHg0OCwgMHgxNCwgMHhGMCwgMHgyQSwgMHg0NCwgMHhEMCwgMHg4NCwgMHgxRiwgMHhBNCwgMHgwNiwgMHgwRSwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgwNywgMHgwMCwgMHhDMiwgMHhBNCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NywgMHhGOCwgMHhCRiwgMHhDMCwgMHg4NCwgMHgxNCwgMHhGQSwgMHgzMywgMHg2MCwgMHg0QywgMHg2MywKKwkgMHhCRCwgMHhEQiwgMHg2MCwgMHg1QywgMHgyRiwgMHg2NywgMHhEMCwgMHg4MCwgMHg2MCwgMHg0NSwgMHgwMiwgMHgyOCwgMHg2NCwgMHg0NSwgMHgyOCwgMHg1QywKKwkgMHhCRCwgMHhEOSwgMHg4QiwgMHg2NywgMHhEMCwgMHg4MCwgMHg2MCwgMHg0MSwgMHgwMiwgMHgyNCwgMHg2NCwgMHg0MSwgMHhENSwgMHg4NCwgMHg4MCwgMHg2NSwKKwkgMHhDNCwgMHg4NywgMHgwMSwgMHgwNSwgMHgwMCwgMHg2NCwgMHhGRiwgMHhCNCwgMHgwRSwgMHhGQSwgMHhBMywgMHhEQiwgMHgyNiwgMHg0NiwgMHhEMSwgMHg2MCwKKwkgMHhEQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQSwgMHg2MCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDQSwgMHg2MCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDQSwgMHg2MCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHg1OCwgMHg2MywgMHg2MCwgMHg0NywgMHgwMSwgMHgyNywgMHg2NCwgMHg2MywgMHg2MSwgMHg1QywgMHgxQiwgMHg2MCwKKwkgMHhGQiwgMHhGOSwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHhGOCwKKwkgMHg4MywgMHhGQSwgMHg4MiwgMHhGOCwgMHhBNiwgMHg0NiwgMHgwMiwgMHhCMCwgMHg1RSwgMHg2MywgMHgwNCwgMHgwMywgMHg2NCwgMHg2MywgMHgwMywgMHhCMCwKKwkgMHgwMiwgMHgzQSwgMHg2QywgMHg2MywgMHgzRiwgMHhGMiwgMHhCRCwgMHhEMCwgMHhCRCwgMHhEMCwgMHg2NCwgMHg0NSwgMHg2NCwgMHg0MSwgMHhCRCwgMHhEMCwKKwkgMHhBNiwgMHg0NiwgMHgwNywgMHhGOCwgMHg4NiwgMHhGQSwgMHg4NSwgMHhGOCwgMHg2MCwgMHg0NywgMHgwOCwgMHhGQSwgMHgxQiwgMHg2MCwgMHhGQiwgMHhGMSwKKwkgMHgyNiwgMHg0NiwgMHg2NCwgMHg0MSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGNSwgMHgwMCwgMHhGMiwgMHgyNiwgMHg0NiwgMHgzMSwgMHhGMCwKKwkgMHgzOSwgMHgxOCwgMHg2NiwgMHg0MSwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBNiwgMHhGMSwgMHhFMCwgMHg4NCwKKwkgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwKKwkgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwKKwkgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwKKwkgMHgxRiwgMHg2MCwgMHhDMiwgMHg2MSwgMHhBMSwgMHhEMywgMHgyMCwgMHg2MCwgMHgwNCwgMHg3QywgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywKKwkgMHhBMCwgMHhERCwgMHhEQSwgMHg5QywgMHhBMSwgMHhEOSwgMHg0OSwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhBMSwgMHhEQiwgMHhEMSwgMHg2MCwKKwkgMHg5NywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg3QywgMHg3MiwgMHg0NCwgMHhGRiwgMHhCNCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwKKwkgMHhEMCwgMHg4NCwgMHhGQiwgMHgwMSwgMHhFMCwgMHg4MywgMHhBNiwgMHhGMywgMHgwMiwgMHhBMywgMHg0MywgMHg5MywgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHhBNSwgMHhENywgMHg4MCwgMHgwNCwgMHhBNSwgMHgwOCwgMHgyNCwgMHg2NSwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwKKwkgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHhBNiwgMHhGMywKKwkgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwKKwkgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwKKwkgMHg2NiwgMHg0MSwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBNiwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywKKwkgMHg2NCwgMHg0MywgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwKKwkgMHg4MCwgMHhGMCwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywKKwkgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwKKwkgMHg4MCwgMHhGMCwgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMiwKKwkgMHgzMCwgMHhGMCwgMHgzMSwgMHhGMCwgMHg2NCwgMHg0NSwgMHg0NiwgMHg0MywgMHg2MywgMHg0NiwgMHgwMywgMHhGQSwgMHgwNiwgMHhGMiwgMHg4NCwgMHhGOCwKKwkgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHgwNSwgMHhGOCwgMHhBMywgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMywgMHgyQSwgMHhGMiwKKwkgMHgwNywgMHhCMCwgMHgwMywgMHgzQSwgMHgyQSwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg4MCwgMHgzQSwgMHgwNSwgMHgwMCwKKwkgMHgwRSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMiwgMHhCMCwgMHgwRiwgMHhGMiwgMHgyMCwgMHgwMywgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgxRCwgMHgwMCwKKwkgMHg2MCwgMHg0MSwgMHgwMCwgMHgzNiwgMHgxMywgMHgwMCwgMHhEQSwgMHg4NSwgMHgzMywgMHg2MCwgMHhCRSwgMHg2MywgMHhCRCwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhEMSwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMiwgMHgwMiwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhBNSwgMHhEMCwgMHhERSwgMHg4NSwgMHhEMCwgMHg4MCwKKwkgMHhDRCwgMHg4MSwgMHgwQiwgMHgwMiwgMHhGOSwgMHgwMiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NCwgMHgwOSwgMHgwMCwgMHgyNiwgMHg0NiwgMHg0OCwgMHhGRSwKKwkgMHg2NSwgMHg0MCwgMHg0MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgwMiwgMHgwMCwgMHgyOCwgMHhGRSwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0OCwKKwkgMHgyNiwgMHg0NiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhBMywgMHhGMywgMHgzRCwgMHhGMiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgyQSwgMHhGQSwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwMywgMHgwMCwgMHhEMiwgMHg2MCwgMHhCNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgzRiwgMHhGMCwgMHgzMiwgMHg0MCwgMHgxMCwgMHgyQSwgMHgwRSwgMHgwMCwgMHgyQywgMHhGMCwgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwKKwkgMHg0MCwgMHgyNywgMHgwOSwgMHgwMCwgMHhDRCwgMHg4MSwgMHhERCwgMHg4MSwgMHgwNiwgMHgwMywgMHgwNSwgMHgwMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHg2MSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgxOCwgMHgzNiwgMHgxRiwgMHgwMCwgMHhEMCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhEMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRiwgMHhGMCwgMHhFQSwgMHhGMSwgMHg2NCwgMHg0NCwgMHg2MCwgMHgyMiwgMHgxOSwgMHgwMCwKKwkgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHhGRCwgMHhBMCwgMHgyQSwgMHhGMiwgMHgwMywgMHgwMiwgMHgwOCwgMHhCMCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHgwMiwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHhFQiwgMHhGMSwgMHgwQiwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwKKwkgMHgwOCwgMHgwMiwgMHhFQywgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHgwRiwgMHhGMCwgMHgwMywgMHgwMiwgMHhEMywgMHg2MCwgMHgxMCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwgMHhBQSwgMHg2MCwgMHhBQSwgMHg2NSwgMHgwOSwgMHhGMiwgMHg1QSwgMHhEMCwgMHhENCwgMHg4MCwgMHgwMywgMHg2NCwKKwkgMHg1NywgMHgwMiwgMHhEMCwgMHg4MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwgMHg1MywgMHgwMiwgMHg2NCwgMHg0NSwgMHhENCwgMHg4MCwgMHhGOCwgMHg3RiwKKwkgMHgwOCwgMHgwMiwgMHg1QSwgMHhEMCwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwgMHgyMywgMHhGMCwgMHgyMCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHgwQiwgMHgwMCwgMHhENCwgMHg4MCwgMHgxRCwgMHg2MCwgMHg2MCwgMHg2NCwgMHgxNiwgMHgwMiwgMHg1QSwgMHhEMCwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NSwKKwkgMHgyMywgMHhGMCwgMHg0MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwgMHg2NSwgMHg0NCwgMHg4OCwgMHgzQSwgMHgwNywgMHgwMCwgMHg3NywgMHgzNywKKwkgMHgwOCwgMHgwMCwgMHg3OCwgMHgzNywgMHgwNiwgMHgwMCwgMHg4RSwgMHgzNywgMHgwNCwgMHgwMCwgMHgzMiwgMHgwMCwgMHg4MSwgMHgzQSwgMHgzMCwgMHgwMCwKKwkgMHg4MCwgMHgzNywgMHgwMCwgMHg2MSwgMHgyRCwgMHgwMCwgMHhENCwgMHg4MCwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEMCwgMHgyOCwgMHgwMiwKKwkgMHhEMCwgMHg4MCwgMHg1QSwgMHhEMCwgMHgyNSwgMHgwMiwgMHgyNiwgMHg0NiwgMHg2NCwgMHg0NywgMHg3RiwgMHhCNCwgMHhGRCwgMHhBMCwgMHgwOSwgMHgwMywKKwkgMHgxRiwgMHgwNywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwgMHg0NCwgMHgwMCwgMHgyMywgMHhGMCwgMHg2MCwgMHg2NywgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQSwKKwkgMHgzRiwgMHgwMCwgMHgwRiwgMHhGMiwgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwgMHgzQiwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHg0OCwgMHgzNiwgMHgwNCwgMHgwMCwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywKKwkgMHhGMSwgMHhGQiwgMHhGNCwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHgxQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHg2MSwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNywgMHgwMCwgMHgyQywgMHg2MCwgMHhGOCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg3OCwgMHg0MSwKKwkgMHhFNCwgMHg3OCwgMHhCNSwgMHhGMSwgMHg4NSwgMHgwMCwgMHgwRiwgMHhGMiwgMHg3RiwgMHhGMSwgMHgyQSwgMHhGMiwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyQSwKKwkgMHgxMiwgMHgwMCwgMHg1RSwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQiwgMHg2NCwgMHg2MywgMHhCRCwgMHhEMiwgMHhCRCwgMHhEMiwgMHhEMCwgMHg4MCwKKwkgMHg4MCwgMHhGMSwgMHgwOCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhBMywgMHhEMiwgMHg4MSwgMHhGMSwgMHgwNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHg2RCwgMHgwMCwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg0OCwgMHgzNiwgMHg2OCwgMHgwMCwKKwkgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwNywgMHgwMCwgMHg2MCwgMHg0MCwgMHg0OCwgMHgzNiwgMHgwNCwgMHgwMCwKKwkgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhGMSwgMHhGQiwgMHg2OCwgMHgwMCwgMHgyNiwgMHg0NiwgMHgyQSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHhGRiwgMHhGRiwgMHgwQywgMHgyNiwgMHg1NSwgMHgwMCwgMHhCMCwgMHgzNiwgMHgxNSwgMHgwMCwgMHgxMCwgMHgzNiwgMHgxMywgMHgwMCwgMHgzMCwgMHgzNiwKKwkgMHgxMSwgMHgwMCwgMHhDMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHhBMCwgMHgzQSwgMHgxMiwgMHgwMCwgMHg3RiwgMHhGMSwgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwKKwkgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHg0NSwgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MSwgMHhGMSwgMHg0MSwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgzRSwgMHgwMiwgMHhFNiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzRCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNSwgMHgwMCwgMHg1MCwgMHgzQSwKKwkgMHgwNSwgMHgwMCwgMHhGOCwgMHg2MCwgMHg1OCwgMHg0RiwgMHhFMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0MCwgMHgzQSwgMHgwNSwgMHgwMCwKKwkgMHhGMCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg5OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHgwMCwgMHg4MCwgMHgzQSwgMHgyNCwgMHgwMCwgMHg3RiwgMHhGMSwKKwkgMHgzMiwgMHhGMiwgMHgzMywgMHhGMiwgMHhEMCwgMHg4MCwgMHg4MCwgMHhGMSwgMHgyMywgMHgwMiwgMHhEMCwgMHg4MCwgMHgzNCwgMHhGMiwgMHg4MSwgMHhGMSwKKwkgMHgxRiwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQywgMHgwMiwgMHhFOSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwQSwgMHgwMCwgMHgxOSwgMHg2MCwgMHg0QywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNCwgMHgwMCwgMHhFRSwgMHg2MCwgMHg1OCwgMHg0RiwgMHg4MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg2MCwKKwkgMHg1OCwgMHg0RiwgMHhFMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHg2NiwgMHg0NCwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMywKKwkgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEMCwgMHg2MCwgMHhCMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyQSwgMHhGMiwgMHgzQiwgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHg0MCwgMHgyQiwgMHgwNiwgMHgwMCwgMHhDMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHg2NCwgMHg0MCwgMHgyMCwgMHgyQiwgMHgwMSwgMHgwMCwgMHgwMywgMHgwMCwKKwkgMHhEMywgMHg2MCwgMHg0QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhCNCwgMHhGRiwgMHhGRiwgMHhGOCwgMHgwMywKKwkgMHgyMywgMHhGMiwgMHgwNywgMHhGNCwgMHhCQiwgMHhGMCwgMHgyNiwgMHg0NiwgMHhBNCwgMHg4NCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgyRiwgMHgyNiwKKwkgMHhENywgMHgwMSwgMHgxMiwgMHhGMCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgxQiwgMHhDQSwgMHg2MCwgMHg1OCwgMHg0RiwgMHgxNiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgxOCwgMHgzNiwgMHgwOSwgMHgwMCwgMHgwNCwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHhEMywgMHg2MCwgMHgxMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNSwgMHg2MCwgMHhGRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGOCwgMHhGRSwgMHhDMCwgMHgwMSwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg5NCwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHgwMCwgMHg2MywgMHgwOCwgMHg2MCwgMHg3NywgMHhGRCwgMHhEOSwgMHg2MCwgMHhBNSwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHg0OSwgMHhGQiwgMHhEOSwgMHg2MCwgMHg2QSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzNSwgMHhGQiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEMywgMHg2MCwgMHg5QywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RCwgMHhGMywgMHgzMywgMHg2MCwgMHgyMCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwMywgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMywKKwkgMHgwMiwgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQywgMHhGMywgMHgwOCwgMHg2MSwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHhBOCwgMHhFOCwgMHg4NCwgMHgwRiwgMHgwMywgMHg2MCwgMHhGRSwgMHgwMiwgMHgyOCwgMHhGNiwgMHgwMSwgMHg4MCwgMHg2MiwgMHhCMiwgMHg5QywKKwkgMHhCRCwgMHhEOSwgMHg3QiwgMHhGOSwgMHhDRCwgMHg4MSwgMHgwMCwgMHgzNiwgMHgwMSwgMHgwMCwgMHhFRSwgMHgwMSwgMHgzNiwgMHg2MCwgMHgwQSwgMHg2MywKKwkgMHgwOCwgMHg2MSwgMHhFQSwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhCQSwgMHhGRSwgMHgxNiwgMHg2MCwgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHhBOCwgMHgwMiwgMHhBOCwgMHgwNCwgMHgwMywgMHgyOCwgMHgwMiwKKwkgMHhEOSwgMHg2MCwgMHg0MSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEOCwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxMSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwNywgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwKKwkgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg2MCwgMHgyMCwgMHg2NSwKKwkgMHhBNSwgMHhERiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHhENCwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2MywgMHgwRSwgMHg2MCwgMHgzNiwgMHhGRCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNSwgMHhGQiwgMHg1QSwgMHhEQiwgMHhCQSwgMHhGRSwgMHgwMiwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHhCQywgMHhGMSwgMHhGQiwgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg3RiwgMHhGQiwgMHg4MCwgMHhGQiwgMHg4MSwgMHhGQiwgMHgwOCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHg3NywgMHhGMywgMHhGRiwgMHhGRiwgMHgxNSwgMHgxOCwgMHhBMiwgMHhERiwKKwkgMHg0MCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhDNCwgMHg2NCwgMHgwRiwgMHg2MCwgMHhFMSwgMHhGQiwKKwkgMHg0QSwgMHhERiwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MywgMHgxRCwgMHg2MCwgMHhCRSwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwKKwkgMHgxMCwgMHg2MCwgMHgwRSwgMHg2MiwgMHhBMiwgMHhERiwgMHg1QiwgMHgwMCwgMHhDRiwgMHhGMywgMHhGRiwgMHhGRiwgMHg1MiwgMHgxQiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg0MCwgMHgwMiwgMHgyMiwgMHgyNiwgMHgwMCwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHgxRiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHg1OSwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgxMSwgMHgwMCwgMHgwOCwgMHg2MCwKKwkgMHgxRSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHg1OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHg1OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGRCwgMHg2MCwgMHg4OSwgMHg2NSwgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHgyNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGQiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwKKwkgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCQiwgMHhGRSwgMHhGRCwgMHg2MCwKKwkgMHg0MCwgMHg2NSwgMHhGMywgMHg2MCwgMHg1OCwgMHg0RSwgMHgyNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgyOCwgMHhGQiwgMHhENCwgMHg2MCwgMHg4NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwKKwkgMHgyNywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHgwMSwgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHgyMCwgMHg0MCwgMHgwNCwgMHgyQiwgMHgxNCwgMHgwMCwKKwkgMHg5QiwgMHhGRSwgMHgwOCwgMHgwNCwgMHhCQiwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHg5NSwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwKKwkgMHgxNiwgMHg2MCwgMHhDQywgMHhGMywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhCOSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwMSwgMHhCOSwgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgwNiwgMHhCOSwgMHg2MCwgMHg0MCwgMHgwMywgMHgzNiwgMHgwNywgMHhCOSwgMHg0MSwgMHg0NCwKKwkgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHhDOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg3RCwgMHhGMSwgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwQywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENCwgMHg2MCwgMHhFOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg3NSwgMHgwMCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCQSwgMHhGRSwgMHgwMiwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywKKwkgMHhGMSwgMHhGQiwgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg3RiwgMHhGQiwgMHg4MCwgMHhGQiwgMHg4MSwgMHhGQiwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwKKwkgMHgwNCwgMHgyQiwgMHgxNCwgMHgwMCwgMHg5QiwgMHhGRSwgMHgwOCwgMHgwNCwgMHhCQiwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwKKwkgMHhENSwgMHg2MCwgMHgwNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwNywgMHhGMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNiwgMHgwMCwgMHhBMiwgMHhERiwgMHgwMiwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhDRiwgMHhGMywgMHgyMCwgMHg2MCwgMHgyMCwgMHg2NSwgMHgzNiwgMHgxQiwgMHhBNSwgMHhEMywgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgxNiwgMHgwMCwgMHg2MCwgMHg0MCwgMHgyMCwgMHgyNiwgMHgyRiwgMHgwMCwgMHgwMSwgMHhCQywgMHhBNSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxNiwgMHhGQiwgMHhENSwgMHg2MCwgMHg2NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgxMCwgMHgyNiwgMHgxOSwgMHgwMCwgMHgwMSwgMHhCQywgMHhBNSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxRSwgMHhGMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENSwgMHg2MCwKKwkgMHg2NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGRCwgMHg2MCwgMHg4OSwgMHg2NSwgMHhGMywgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgyNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGMSwgMHgwNywgMHg2MCwgMHhFOSwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMiwgMHgzQSwKKwkgMHgwQywgMHgwMCwgMHgwMSwgMHg2MywgMHg2MCwgMHg0MCwgMHgxMCwgMHgyMiwgMHgwMCwgMHg2MywgMHgwOCwgMHg2MCwgMHhDMSwgMHhGRCwgMHgwOCwgMHg2MCwKKwkgMHhDNSwgMHhGRCwgMHgwOCwgMHg2MCwgMHhDOSwgMHhGRCwgMHgwOCwgMHg2MCwgMHhDRCwgMHhGRCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg1MywgMHhGQiwgMHgyRiwgMHg2MCwgMHgwMiwgMHg2NCwgMHg1NCwgMHhGQiwgMHgyNCwgMHg0MCwgMHgwMSwgMHgyNiwKKwkgMHgxMSwgMHgwMCwgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENSwgMHg2MCwgMHhBQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENSwgMHg2MCwgMHhBQiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGRCwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwKKwkgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg4NiwgMHhGMSwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MywgMHhEMywgMHg4MCwgMHgyMCwgMHg0NCwgMHgwMywgMHgwMywKKwkgMHhEOCwgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxQiwgMHgwMiwKKwkgMHgyNCwgMHg0NCwgMHgwNCwgMHgyMiwgMHgxMiwgMHgwMCwgMHgyNCwgMHg0NCwgMHgwMSwgMHhBQywgMHhGQiwgMHhCNCwgMHg0MCwgMHg0NCwgMHhGNywgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhENCwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHgwMiwgMHg4NywgMHgwMCwgMHgyMCwgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg0MCwgMHg2NCwgMHg0MiwgMHg1QSwgMHhEMSwKKwkgMHgwNiwgMHg2MywgMHhBNCwgMHhEMSwgMHhDMywgMHg4MywgMHg3RCwgMHhGOSwgMHhCRCwgMHhEMSwgMHg3RiwgMHhGOSwgMHhCRCwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg4MCwgMHhGOSwgMHhCRCwgMHhEMSwgMHg4MSwgMHhGOSwgMHgwNCwgMHhBMywgMHhCRCwgMHhEMSwgMHgzMywgMHg2MCwgMHhCRSwgMHg2NCwgMHg2NCwgMHg0MSwKKwkgMHhERCwgMHg4MSwgMHhGRSwgMHhCMSwgMHhBMCwgMHhEOSwgMHgwNCwgMHgwMywgMHhCRCwgMHhEMSwgMHhDOSwgMHg4MSwgMHg1OCwgMHhEOSwgMHhGQywgMHgwMiwKKwkgMHgzOSwgMHgwMCwgMHhFNCwgMHhGMywgMHg3RCwgMHhGQiwgMHg2NiwgMHg0MSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNiwgMHgwMCwgMHgxMCwgMHg2MCwKKwkgMHhGMCwgMHg2MywgMHgxMSwgMHg2MCwgMHg0NCwgMHg2NSwgMHgwNiwgMHg2NiwgMHgwNSwgMHgwMCwgMHgxMSwgMHg2MCwgMHg2MCwgMHg2MywgMHgxMiwgMHg2MCwKKwkgMHg0MCwgMHg2NSwgMHgwOCwgMHg2NiwgMHhBMywgMHhEMSwgMHg0QiwgMHg5MywgMHhEMCwgMHg4MCwgMHhENywgMHg4MCwgMHgwMiwgMHgwMywgMHhGQSwgMHgwNCwKKwkgMHgwNCwgMHgwMCwgMHg1QiwgMHg5MywgMHgwMiwgMHhBMywgMHgwMSwgMHg2NCwgMHhBMywgMHhEQiwgMHg2MSwgMHg0NiwgMHgyRiwgMHg2MCwgMHgwMiwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHgzMywgMHg2MCwgMHhCRSwgMHg2MywgMHgwMiwgMHgwMiwgMHgyRCwgMHg2MCwgMHgxMCwgMHg2MSwKKwkgMHhBMSwgMHhEMywgMHhCRCwgMHhEQiwgMHhEQywgMHg4NCwgMHhGRSwgMHhCNCwgMHg1OSwgMHhEMSwgMHhDOCwgMHg4NCwgMHhCRCwgMHhEOSwgMHhGQywgMHgwMiwKKwkgMHhFQywgMHhGMywgMHg3MiwgMHg0NSwgMHhFQiwgMHhGMywgMHg5NCwgMHg4MywgMHg4MSwgMHhGRCwgMHg5NCwgMHg4MywgMHg4MCwgMHhGRCwgMHg2NSwgMHg1RiwKKwkgMHgwMiwgMHg2NCwgMHg3RiwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENiwgMHg2MCwgMHgzQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMSwgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENiwgMHg2MCwgMHg1QiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwKKwkgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhENywgMHg2MCwKKwkgMHg3QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwMiwgMHg2NCwgMHhEQiwgMHhGQiwKKwkgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywgMHhGMSwgMHhGQiwgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwKKwkgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNCwgMHg0NCwgMHgwMiwgMHgyMiwgMHgwMywgMHgwMCwgMHgwMSwgMHhBQywgMHgwNCwgMHhCQywKKwkgMHg0MCwgMHg0NCwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwgMHg4QywgMHgwMCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENiwgMHg2MCwgMHg4QywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg3RiwgMHhCNCwgMHg5NSwgMHhGQiwgMHgyNiwgMHg2MCwgMHgzNCwgMHg2MiwgMHgwNiwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhEQSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxMiwgMHg2MCwgMHhGRiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwNSwgMHgwMywgMHgwRSwgMHhGMiwgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgyMiwgMHgwMCwgMHgxMywgMHg2MCwgMHgwMiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwKKwkgMHgwMywgMHgwMywgMHgwRiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgxOSwgMHgxQiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwKKwkgMHhENiwgMHg2MCwgMHhFNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHgxOSwgMHg2MCwgMHhGMSwgMHhGQiwgMHgxOSwgMHg2MCwKKwkgMHhGNiwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHg4OSwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwMCwgMHg3NSwKKwkgMHg4OCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENiwgMHg2MCwKKwkgMHhFNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg3RCwgMHhGMSwgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwOCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwKKwkgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENywgMHg2MCwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCQSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxRSwgMHgwMCwKKwkgMHhEQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgwRSwgMHg2MCwgMHgzNiwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENywgMHg2MCwgMHg0RSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgyOCwgMHhGQiwgMHhENywgMHg2MCwgMHg1NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHg2QywgMHg2MSwKKwkgMHg3NSwgMHg2MCwgMHgzMCwgMHg2NSwgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhFMCwgMHg4NCwgMHgwMiwgMHgwMiwgMHgwMywgMHg2MCwKKwkgMHhFOCwgMHg2NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHg2NSwgMHg0NCwgMHhBMSwgMHhEQiwgMHgzMiwgMHg0MCwgMHg4MCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHhENCwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHhENCwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgwNiwgMHgyMywgMHgxMCwgMHgwMCwKKwkgMHgwOCwgMHg2MCwgMHgyNywgMHhGMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgyOCwgMHhGQiwgMHhENywgMHg2MCwgMHg1NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHhEMywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3OCwgMHhGMywgMHg3OSwgMHhGQiwgMHgyMCwgMHg2MCwgMHgxNCwgMHg2MiwgMHhBMiwgMHhERiwKKwkgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhCQywgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwgMHgxQywgMHg2MCwKKwkgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhGNywgMHg2MCwKKwkgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgxMCwgMHgyNiwgMHgzOCwgMHgwMCwgMHgwMCwgMHg2NCwgMHhCMiwgMHhGQiwgMHhCMywgMHhGQiwKKwkgMHhCNCwgMHhGQiwgMHgwMCwgMHg3NSwgMHgwMCwgMHg3MiwgMHhCQSwgMHhGMSwgMHg3RSwgMHhGOSwgMHg2NCwgMHg0NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg5MywgMHhFNSwgMHhGMSwgMHg4NCwgMHhGOSwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgxRSwgMHgwMCwgMHgxOSwgMHg2MCwgMHg0NCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwQSwgMHgwMCwgMHgwRiwgMHg2NCwKKwkgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NywgMHg0MywgMHgxQSwgMHg2MCwgMHhCMywgMHhGRCwgMHgxQSwgMHg2MCwKKwkgMHhDMywgMHhGRCwgMHhEMywgMHg2MCwgMHg1OCwgMHg0RSwgMHg3OCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NSwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRiwgMHg2NSwKKwkgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg4NCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhENywgMHg2MCwgMHhEQiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgyQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHhGRiwgMHg2MCwgMHg3RiwgMHg2MSwKKwkgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgyRSwgMHg2MCwgMHgyRSwgMHg2NCwgMHgyRCwgMHg2MCwKKwkgMHg4QSwgMHg2MywgMHhBMCwgMHhEMSwgMHhBMywgMHhEOSwgMHg2NCwgMHg0MSwgMHg1OCwgMHhEMSwgMHg1QiwgMHhEOSwgMHg3RCwgMHhGMywgMHg2NiwgMHg0NSwKKwkgMHhBNiwgMHhGNSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHg5MSwgMHhGQSwgMHg2MSwgMHg0NCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGQSwgMHgwNywgMHgwMCwgMHgxMSwgMHhGOCwgMHg2NCwgMHg0NCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGQSwgMHg2NSwgMHg0NiwgMHgwNCwgMHgwMCwgMHhCQiwgMHhGRSwgMHhENCwgMHg2MCwgMHhGNiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwNywgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwQSwgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwQiwgMHgzNiwgMHgyMiwgMHg2NSwKKwkgMHhBNiwgMHhGMywgMHg2NiwgMHg1QywgMHg2MCwgMHg0NiwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHhCQSwgMHhGOCwgMHgwMiwgMHhBNiwgMHg2NiwgMHg0NCwKKwkgMHhGQywgMHgxRiwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNywgMHgzNiwgMHgwMywgMHgwMCwgMHgwQSwgMHgzNiwKKwkgMHgwNiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhBNiwgMHhGMywgMHgwNCwgMHg2NSwgMHg2MCwgMHg0NiwgMHhCQSwgMHhGOCwgMHgwNCwgMHgwMCwgMHhBNiwgMHhGMywKKwkgMHgxMCwgMHg2NSwgMHg2MCwgMHg0NiwgMHhCQSwgMHhGOCwgMHg2NCwgMHg0NiwgMHhBNiwgMHhGMywgMHgzMiwgMHg0MSwgMHg2MCwgMHg0NSwgMHgwOCwgMHhCMSwKKwkgMHg2NiwgMHg0MSwgMHgxNiwgMHgwMywgMHg2NSwgMHg0NiwgMHgxNywgMHg2MCwgMHg4MCwgMHhGMywgMHgwNiwgMHhGMCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywgMHg2MywgMHg0NiwKKwkgMHgwNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgzMiwgMHg0NCwgMHgxMCwgMHhCQywgMHg0MCwgMHg1MiwKKwkgMHgwMSwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQSwgMHhGQiwgMHgwRiwgMHg0RSwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RiwgMHgzQSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwRSwgMHg0RiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEMywgMHg2MCwgMHhBRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwKKwkgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhCQiwgMHhGRSwKKwkgMHgyMCwgMHg0NCwgMHgwNCwgMHgyNywgMHgxMSwgMHgwMCwgMHgxMCwgMHgyNiwgMHgwMiwgMHgwMCwgMHhEQiwgMHhGRSwgMHgxNCwgMHgwMCwgMHgwOCwgMHg2MCwKKwkgMHgwNywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNywgMHgwMCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NSwKKwkgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHg2MCwgMHhFRiwgMHg2NSwgMHgyMCwgMHg0NCwKKwkgMHgyNCwgMHg4MCwgMHgwMywgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwgMHhDMSwgMHhGRSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyOCwgMHhGQiwgMHhEOCwgMHg2MCwgMHhBQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgwNiwgMHgyMywgMHgxMCwgMHgwMCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGMSwgMHg3RiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyOCwgMHhGQiwgMHhEOCwgMHg2MCwKKwkgMHhBQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhEMywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhCQiwgMHhGRSwgMHhEOSwgMHg2MCwgMHhCMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NSwgMHhBNiwgMHhGMywgMHg2NiwgMHg1QywgMHg2MCwgMHg0NiwgMHgxRiwgMHg2MywgMHhFMywgMHg4MywgMHhCQSwgMHhGOCwKKwkgMHgwMiwgMHhBNiwgMHg2NiwgMHg0NCwgMHhGQywgMHgxRiwgMHg2NCwgMHg0NiwgMHhBNiwgMHhGMSwgMHgwMiwgMHg2NCwgMHhDMCwgMHg4NSwgMHgwQywgMHg2MSwKKwkgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgxNCwgMHgwMCwgMHgxNywgMHg2MCwgMHg4MCwgMHhGMywgMHg2NiwgMHg0MSwgMHg2NSwgMHg0NiwgMHgwNiwgMHhGMCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg4MCwgMHhCRiwgMHhCMCwgMHg4MywgMHgwNiwgMHhGQywgMHg2NiwgMHg0MiwKKwkgMHhGRSwgMHhBMiwgMHg2MiwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHgwQiwgMHg2NCwKKwkgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwgMHgwMSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNCwgMHhGMSwgMHg3RCwgMHhGOSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEOSwgMHg2MCwgMHgwQywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMSwgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEOSwgMHg2MCwKKwkgMHgyRCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGQiwKKwkgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHg2MCwgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwNiwgMHg2NCwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwgMHhFNCwgMHhGMSwKKwkgMHg3RCwgMHhGOSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHg2MCwKKwkgMHhERiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhBNiwgMHhGMSwgMHg2NiwgMHg0NSwgMHg2NCwgMHg0NiwgMHg2NiwgMHg0MywgMHgwMiwgMHhBMywKKwkgMHg2MywgMHg0NiwgMHgwMiwgMHg2NCwgMHgwNiwgMHhGQSwgMHgwNCwgMHg2MywgMHgwNCwgMHg2MSwgMHgwMSwgMHg2MCwgMHhDQywgMHg2NCwgMHg1OCwgMHhEMSwKKwkgMHg1OSwgMHhEOCwgMHhGRCwgMHgxRiwgMHg2NSwgMHg0NiwgMHgwMSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2NywgMHhGQiwgMHg2OCwgMHhGQiwgMHhBNiwgMHhGMSwgMHgwRSwgMHg2NCwgMHg2NiwgMHg0MSwKKwkgMHg2NCwgMHg0MiwgMHgwMiwgMHhBMiwgMHg2MiwgMHg0NiwgMHgwNiwgMHhGMCwgMHhGRiwgMHg2MCwgMHhGQywgMHg2NCwgMHhBMCwgMHg4NCwgMHgwNiwgMHhGQSwKKwkgMHg2MSwgMHg0NiwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhBOCwgMHgxMCwgMHg2MCwgMHgwRSwgMHg2NCwgMHgwNywgMHgwMywgMHhBMCwgMHhEMSwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MywgMHhBMCwgMHhERCwgMHgwMSwgMHg2NCwgMHhEQiwgMHhGQiwKKwkgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwgMHgwMCwgMHg2MywgMHgwOCwgMHg2MCwgMHg3NywgMHhGRCwgMHgxMCwgMHg2MCwKKwkgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEMywgMHg2MCwKKwkgMHg5QywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg0MCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhCOSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwgMHg1RiwgMHhGNSwgMHhFQSwgMHhGMSwKKwkgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBNiwgMHhGMSwgMHgwNywgMHhGOCwgMHgxQiwgMHg2MCwgMHhCMCwgMHg2NCwKKwkgMHgwMCwgMHg2MCwgMHg2NywgMHhGQiwgMHg0NCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg3RiwgMHhGQiwgMHg4MCwgMHhGQiwgMHg4MSwgMHhGQiwgMHgzMSwgMHg0NCwKKwkgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwMCwgMHg2MCwgMHhDRSwgMHg2MywgMHgwMSwgMHg2MCwgMHgwQywgMHg2NSwgMHhBMywgMHhEMywgMHhBNSwgMHhEMSwKKwkgMHgwNCwgMHhBNCwgMHhBMywgMHhEQiwgMHhEMCwgMHg4MCwgMHhBMCwgMHhEMSwgMHgwQSwgMHgwNiwgMHg0MSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhENiwgMHg2MCwgMHg2QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NCwgMHg0NywKKwkgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwOSwgMHgwNywgMHgwRSwgMHg2MSwgMHg0MSwgMHhEMywKKwkgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgwNCwgMHgwMCwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMywgMHhEMywgMHgwMSwgMHg0MiwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwKKwkgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEOSwgMHg2MCwgMHhGQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhEMSwgMHg3RCwgMHhGOSwgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEQSwgMHg2MCwgMHgxQywgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwKKwkgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMywgMHg3RiwgMHhGQiwKKwkgMHhCRCwgMHhEMywgMHg4MCwgMHhGQiwgMHhBMywgMHhEMywgMHg4MSwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEQSwgMHg2MCwgMHg0QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCOSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHhGRSwgMHg2MCwKKwkgMHhGRiwgMHg2MSwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhEOSwgMHg2MCwKKwkgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg3RCwgMHhGMSwgMHgzMiwgMHg2MCwKKwkgMHg3QSwgMHg2MSwgMHhBMSwgMHhEMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1OSwgMHhEMywgMHgzMiwgMHg2MCwgMHg3RSwgMHg2MSwgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEQiwgMHg1RSwgMHhGNSwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwKKwkgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHg4MCwgMHg3RSwgMHhGOCwgMHg3RiwgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBNiwgMHhGMSwgMHgwNywgMHhGOCwgMHgyQiwgMHhGQSwgMHhCMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywKKwkgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwKKwkgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwNiwgMHg2MywgMHgzRiwgMHhGQywgMHgyMCwgMHg2MCwgMHgxNiwgMHg2MSwgMHhEQiwgMHhGMywgMHhBMSwgMHhEMywKKwkgMHgwMywgMHhBOCwgMHhBQywgMHg4MywgMHgwRSwgMHgwMiwgMHgwRCwgMHgwMywgMHgyMCwgMHg2MCwgMHgxOCwgMHg2MSwgMHhBMSwgMHhEMSwgMHg2NiwgMHg0NSwKKwkgMHgwMCwgMHhGNCwgMHgwOSwgMHhGQywgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwQiwgMHhGOCwgMHgyMCwgMHg2MCwgMHgxNiwgMHg2MSwgMHhBMSwgMHhERiwKKwkgMHgyNSwgMHgwMCwgMHgxNiwgMHg2MCwgMHhDMywgMHhGMywgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgxNSwgMHgwMCwKKwkgMHgwMiwgMHgzNiwgMHhCRCwgMHgwMCwgMHgwMywgMHgzNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgzNiwgMHgwRiwgMHgwMCwgMHgwNSwgMHgzNiwgMHhCNywgMHgwMCwKKwkgMHgwNiwgMHgzNiwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHg4MCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwMSwgMHg2MywgMHgwQSwgMHhGQywgMHgwMCwgMHg2NCwKKwkgMHgwQiwgMHhGQSwgMHg4MCwgMHg2MCwgMHhGNCwgMHg2MiwgMHhBMiwgMHhERiwgMHgwOSwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwOSwgMHhGQSwgMHgwMSwgMHg2MywKKwkgMHgwQSwgMHhGQywgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHg4MCwgMHg2MCwgMHhGNCwgMHg2MiwgMHhBMiwgMHhERiwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHhEQiwgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHg2NCwgMHg2OCwgMHhGQiwgMHg0MywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwRSwgMHg2MCwgMHgzOCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHhBNCwgMHhBMiwgMHhEQiwgMHgwRSwgMHg2MCwgMHgzOCwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEQiwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1NSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwKKwkgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHgwMCwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgxNiwgMHgwMiwgMHgwMCwgMHhBOCwKKwkgMHgxQSwgMHgwMiwgMHgxOSwgMHgwMiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEQywgMHg2MCwKKwkgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMywgMHg2MCwgMHg2OSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHg4MCwgMHhBOCwKKwkgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHhFNCwgMHgwMywgMHg0NCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwKKwkgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHhEOSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywKKwkgMHgwOSwgMHhGQywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxNCwgMHgwMCwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwQiwgMHgzNiwgMHgwMywgMHgwMCwgMHhEQSwgMHg2MCwgMHhDNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwQiwgMHg2NCwKKwkgMHgxOSwgMHg2MCwgMHhBNCwgMHhGQiwgMHhBNiwgMHhGMSwgMHg2NiwgMHg0MSwgMHg2NCwgMHg0NiwgMHgyMiwgMHg2NCwgMHgzQSwgMHhGQSwgMHg2MSwgMHg0NiwKKwkgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwQiwgMHhGQSwgMHgwMSwgMHg2NCwgMHg0MCwgMHg2MCwgMHg3QSwgMHhGQiwgMHgwMSwgMHg2NCwKKwkgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHg2NSwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHhEQiwgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwKKwkgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgwQywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEQiwgMHg2MCwgMHhCOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzQSwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwKKwkgMHgwMSwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwMiwgMHhBOCwgMHgwNCwgMHgwMiwgMHgwMCwgMHhBOCwgMHgwMiwgMHgwMiwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwMCwKKwkgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwKKwkgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwKKwkgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEOSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyQSwgMHhGMiwgMHgyRiwgMHhGMCwgMHhCNCwgMHg4NCwgMHgyQSwgMHhGQSwKKwkgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMywgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHgzNCwgMHhGQSwKKwkgMHhFQSwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQiwgMHhGMywgMHgzMCwgMHhGQSwgMHhFQywgMHhGMywgMHgzMSwgMHhGQSwgMHhDOSwgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHgxQywgMHhGMCwgMHgxMywgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMywgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMCwgMHg2NCwKKwkgMHgwQiwgMHhGQSwgMHgwMSwgMHg2MywgMHg2OCwgMHhGRCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyNSwgMHg2MCwKKwkgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwgMHhEQiwgMHhGMywgMHg0NiwgMHg0NiwgMHhGRCwgMHhBMCwgMHhDMSwgMHhGRSwgMHgwMiwgMHgwMiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhEQywgMHg2MCwgMHg1MywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHg1MCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwKKwkgMHgwOSwgMHhGMiwgMHgwQSwgMHhGMiwgMHgwMSwgMHhBOCwgMHgwQiwgMHhGMiwgMHgwNCwgMHhBOCwgMHgxQSwgMHgwMiwgMHgwMCwgMHhBOCwgMHgxOCwgMHgwMiwKKwkgMHgxNywgMHgwMiwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwKKwkgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyMCwgMHg0MCwKKwkgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEQywgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMywgMHg2MCwgMHg2OSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwKKwkgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhCOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwKKwkgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwgMHhEOSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhBNCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwQiwgMHgzQSwgMHgwNiwgMHgwMCwgMHgwQiwgMHg2NCwKKwkgMHgxNiwgMHg2MCwgMHhDMiwgMHhGQiwgMHgzMywgMHg2MCwgMHg0OCwgMHg2MiwgMHhBMiwgMHhERiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwKKwkgMHhDMiwgMHhGMSwgMHhBNSwgMHhEMiwgMHg2NCwgMHg0MCwgMHgwQiwgMHgyQSwgMHgyMCwgMHgwMCwgMHg4NSwgMHgzNiwgMHgwQiwgMHgwMCwgMHgzMiwgMHgzQSwKKwkgMHgxRSwgMHgwMCwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHgwMiwgMHhBNCwgMHhDNCwgMHg4NSwgMHhBNSwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHg4NSwgMHgzQSwgMHgxNSwgMHgwMCwgMHg2NSwgMHg0NCwgMHgwQSwgMHhBNCwgMHhBMCwgMHhEMCwgMHgzMywgMHg2MCwgMHg0NiwgMHg2MiwgMHg2NCwgMHg0MCwKKwkgMHgxOCwgMHgyNiwgMHgwOSwgMHgwMCwgMHhBMiwgMHhERiwgMHgwMSwgMHg2NCwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGQiwgMHgzMiwgMHg0MSwgMHgwOCwgMHg2NSwKKwkgMHhCNSwgMHg4MSwgMHg0MSwgMHg1MiwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMywgMHg2MCwKKwkgMHg0NiwgMHg2MiwgMHhBMiwgMHhERiwgMHgwMSwgMHg2NCwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGQiwgMHhGNywgMHgwMSwgMHg0NSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgzNSwgMHg2MCwgMHhBQSwgMHg3QywgMHgzNSwgMHg2MCwgMHg5OCwgMHg2MywgMHhBMywgMHhEOSwgMHg2NCwgMHg0MSwgMHgyRiwgMHg2MCwKKwkgMHgwMiwgMHg2MywgMHhCRCwgMHhEMywgMHgwMCwgMHg3QywgMHgwMywgMHgxQiwgMHgyNywgMHg0MywgMHgxMCwgMHhBMywgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0NSwgMHg2NCwgMHg1RiwgMHhBMSwgMHhEQiwgMHg2NSwgMHg0NCwgMHhCRCwgMHhEMSwgMHhDOCwgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwNSwKKwkgMHgyNywgMHg0MSwgMHgxMCwgMHhBMSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHgwMSwgMHgyNiwgMHhERCwgMHg4MSwgMHg0MSwgMHg0QywKKwkgMHg1OSwgMHhEMSwgMHg3QywgMHg0NCwgMHhCMCwgMHg4NCwgMHg1OSwgMHhEMSwgMHg1OSwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCMCwgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwMiwgMHg2NywgMHg0NCwgMHhDMiwgMHgwMCwgMHgzNCwgMHg2MCwgMHg1QywgMHg2MywgMHhEOSwgMHg4MSwgMHg1OSwgMHhEMywgMHgzOCwgMHg2MCwKKwkgMHgxMCwgMHg2MiwgMHgwMCwgMHhCQywgMHhBMiwgMHhERiwgMHgwOSwgMHgwMywgMHgwMSwgMHg3QywgMHhBMiwgMHhEOSwgMHgzMCwgMHg2MCwgMHgxNCwgMHg2NCwKKwkgMHhCRCwgMHhEQSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQSwgMHg1OCwgMHgwMCwgMHhERCwgMHg2MCwgMHgxOCwgMHg2NCwgMHhCRCwgMHhEQSwKKwkgMHg1MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCRCwgMHhEQSwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEQSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwKKwkgMHhCRCwgMHhEQSwgMHgyQywgMHg0MSwgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwKKwkgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywKKwkgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwKKwkgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwKKwkgMHg1OSwgMHhEMywgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg2MCwgMHhGMiwgMHg2NCwKKwkgMHgwOSwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhGMiwgMHg2NCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMiwgMHgwMCwKKwkgMHgwMiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHg0QiwgMHgwMCwgMHgyQywgMHg0MSwgMHg1OSwgMHhEMywgMHgwRiwgMHg2MCwKKwkgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwgMHhBQywgMHg2NCwgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhBQywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhBQywgMHg2NCwKKwkgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhBQywgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgwMSwgMHg2NCwKKwkgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHgwRiwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHhBQywgMHg2NCwgMHgwRSwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMiwgMHg2MCwgMHhBQywgMHg2NCwgMHgwOSwgMHgwMCwgMHgxMCwgMHgyQSwKKwkgMHgwMywgMHgwMCwgMHgwNCwgMHg2MCwgMHhBQywgMHg2NCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgyQSwgMHgwNCwgMHgwMCwgMHgwNSwgMHg2MCwgMHhBQywgMHg2NCwKKwkgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwgMHgwMSwgMHg2NCwgMHhCRCwgMHhEQiwgMHg1OSwgMHhEMywgMHgwRiwgMHg2MCwgMHgwMCwgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg2MCwgMHhBQywgMHg2NCwgMHgwOSwgMHgwMCwgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MCwKKwkgMHhBQywgMHg2NCwgMHgwNCwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2MCwgMHhBQywgMHg2NCwgMHhCRCwgMHhEOSwgMHhCRCwgMHhEQiwKKwkgMHgxQywgMHg2MCwgMHgwOCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxOCwgMHgxQSwgMHg2MCwgMHgyRCwgMHhGMywgMHgwMywgMHgwMCwgMHgxQSwgMHg2MCwKKwkgMHgxRCwgMHhGMywgMHhGRiwgMHhGRiwgMHhCRCwgMHhEQSwgMHgzNCwgMHg2MCwgMHg1QywgMHg2NCwgMHgxQSwgMHg2MCwgMHhDRiwgMHhGQiwgMHg1RiwgMHhGNSwKKwkgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgwMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwKKwkgMHgzMiwgMHhGOCwgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgwMCwgMHhGNCwKKwkgMHgwMSwgMHg2MywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQiwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwQSwgMHgwMCwgMHgxOSwgMHg2MCwKKwkgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyMiwgMHgyMCwgMHhCQiwgMHg2MywgMHg0NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RiwKKwkgMHg2MCwgMHg0MywgMHgwOSwgMHhGQywgMHgyNywgMHg0MiwgMHgwQywgMHhBMiwgMHgyRCwgMHg2MCwgMHg1QSwgMHg2MywgMHhBMiwgMHhEMywgMHhBMywgMHhEMywKKwkgMHgwMCwgMHhCRCwgMHgwMSwgMHg2MywgMHhBQywgMHg4MSwgMHgwOSwgMHgwMywgMHgwOCwgMHgwMywgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgxNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwMSwgMHgwMywgMHg2MCwgMHg0MywgMHgwRSwgMHg2MCwgMHgzNSwgMHhGRCwgMHgxMiwgMHg2MSwKKwkgMHg1OSwgMHhEQywgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMywgMHhGRiwgMHg2MCwgMHhGRiwgMHg3QywgMHg2MCwgMHg0MCwgMHgwQiwgMHgyQSwgMHgwMiwgMHgwMCwKKwkgMHgzMywgMHg2MCwgMHgyOCwgMHg3QywgMHgxQSwgMHg2MCwgMHhEMCwgMHhGOSwgMHgzNSwgMHg2MCwgMHg5OCwgMHg2NCwgMHg0MCwgMHg0OCwgMHhEOSwgMHg4MSwKKwkgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RiwgMHhGNSwgMHgzRiwgMHhGQywKKwkgMHhEQiwgMHg4MywgMHgxQSwgMHg2MCwgMHg0QywgMHhGRCwgMHgwMCwgMHg3QywgMHg1QSwgMHhEOSwgMHg2MywgMHg0MSwgMHgzNCwgMHg2MCwgMHg5QywgMHg2MywKKwkgMHgxMiwgMHg2NSwgMHgwMCwgMHhGNCwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwKKwkgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwKKwkgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHg1RiwgMHhGNSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgwNiwgMHg2NCwgMHg2OCwgMHhGQiwgMHg0NiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxQywgMHg2MCwKKwkgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgxQywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhERSwgMHg2MCwgMHg4NCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhERSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwMCwgMHg2MywgMHgwMCwgMHhBOCwgMHg2OCwgMHhGRCwgMHgwNiwgMHgwMiwKKwkgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHgwMSwgMHg3QywgMHg1QSwgMHgwMiwgMHgwQSwgMHhGOCwgMHgwQSwgMHhGMiwgMHgyNiwgMHg0NiwKKwkgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwKKwkgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwNSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0NywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhEOSwgMHg2MCwKKwkgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgyMCwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg0OSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhEQSwgMHg2MCwgMHg2MiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwKKwkgMHhGQiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg0QSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhEOSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0OCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhGRiwgMHhCMSwgMHhGRiwgMHhBMSwgMHg2MCwgMHg0NywKKwkgMHhGRiwgMHhCNCwgMHg5QiwgMHgwMiwgMHg5QSwgMHgwMywgMHgzNCwgMHg2MCwgMHhGNCwgMHg2MywgMHgxMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NSwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgzNCwgMHg2MCwgMHhGMiwgMHg2MSwgMHhDMiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRSwgMHg2NCwKKwkgMHg2NSwgMHg0NiwgMHgwMiwgMHhBNCwgMHhBMSwgMHhEQiwgMHhDOCwgMHg4MSwgMHgxMiwgMHg2NSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywKKwkgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywKKwkgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgwQywgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgxQSwgMHg2NSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDNCwgMHg4NSwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwKKwkgMHhGRCwgMHgwMiwgMHg2MSwgMHg0NCwgMHg5NCwgMHhGQiwgMHgyNywgMHg0NSwgMHgwMiwgMHg2MiwgMHg0NiwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywKKwkgMHg1NiwgMHhGQiwgMHg2NCwgMHg0NywgMHg1NSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg1QiwgMHhGQiwgMHgwQywgMHg2MiwgMHg0NiwgMHhEMywgMHg3RSwgMHhGQiwKKwkgMHgwQiwgMHhGMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg4MywgMHhGQiwgMHgyNiwgMHg0NiwgMHgzMiwgMHhGMCwgMHg3RiwgMHhGOSwKKwkgMHgzMywgMHhGMCwgMHgwRSwgMHg2MywgMHhDNywgMHg4MSwgMHg4MCwgMHhGOSwgMHgzNCwgMHhGMCwgMHg4MSwgMHhGOSwgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0NCwgMHgwMSwgMHgyQSwgMHhDOCwgMHg4NCwgMHg2MCwgMHg0MywgMHgzMywgMHg2MCwgMHhCQywgMHg2NCwgMHg1OCwgMHhEOSwgMHg1OSwgMHhEMSwKKwkgMHg1OCwgMHhEOSwgMHhGRCwgMHgxRiwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHg1OSwgMHhEMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg1MCwgMHg5NCwgMHhBNiwgMHhGMSwgMHhGRiwgMHhGRiwgMHg0NCwgMHg0NywgMHhBNywgMHg0NiwgMHgzQSwgMHhGQSwKKwkgMHhCQiwgMHhGQywgMHhBNywgMHg0NiwgMHgwRSwgMHg2MCwgMHgzNSwgMHhGMywgMHg4NSwgMHhGQiwgMHgyRSwgMHg2MCwgMHgyRSwgMHg2NCwgMHgyRCwgMHg2MCwKKwkgMHg4QSwgMHg2MywgMHhBMCwgMHhEMSwgMHhBMywgMHhEOSwgMHg2NCwgMHg0MSwgMHg1OCwgMHhEMSwgMHg1QiwgMHhEOSwgMHg3RCwgMHhGMywgMHg2NiwgMHg0NSwKKwkgMHhBNiwgMHhGNSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHg5MSwgMHhGQSwgMHg2MSwgMHg0NCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGQSwgMHgwNywgMHgwMCwgMHgxMSwgMHhGOCwgMHg2NCwgMHg0NCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGQSwgMHg2NSwgMHg0NiwgMHgzMSwgMHhGMiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwKKwkgMHg2MSwgMHg0NiwgMHgzMSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgzMCwgMHhGMCwKKwkgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyRiwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwKKwkgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHhBNiwgMHhGMSwgMHhGRiwgMHhGRiwgMHhEMywgMHg4MCwgMHgzMSwgMHhGMiwgMHgyNywgMHgwMiwgMHg2NiwgMHg0MSwKKwkgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhBNiwgMHhGMSwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NCwgMHg0MywKKwkgMHgxMSwgMHgxOCwgMHg2MCwgMHg0NiwgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhGQywgMHgxQiwgMHg2NiwgMHg0NCwgMHg2NCwgMHg0NiwgMHg4MCwgMHhGMCwKKwkgMHg2MCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHg2NSwgMHg0MywgMHg4MCwgMHhGMCwgMHgwMSwgMHhGQSwgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwKKwkgMHg4MCwgMHhGOCwgMHgwQiwgMHgwMCwgMHg2NCwgMHg0NiwgMHg2MiwgMHg0MywgMHgwMCwgMHhGMiwgMHhBMywgMHhEQiwgMHg2MCwgMHg0NiwgMHg4MCwgMHhGMCwKKwkgMHg4MSwgMHhGQywgMHg4MCwgMHhGQywgMHg2NCwgMHg0NiwgMHg4MCwgMHhGOCwgMHg2MCwgMHg0MywgMHg2MSwgMHg0NiwgMHg0MywgMHg0QiwgMHgwMSwgMHg2NSwKKwkgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg0MywgMHg0NywgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywKKwkgMHhGQSwgMHhBMywgMHgwMCwgMHg2MCwgMHgxNywgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywKKwkgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg2NCwKKwkgMHg0MCwgMHg0QSwgMHg2MCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGQiwKKwkgMHgwMiwgMHgwMCwgMHgyMCwgMHhGRSwgMHhGRiwgMHg2NSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywKKwkgMHg2MCwgMHg0MSwgMHgyMCwgMHhGRSwgMHhDRCwgMHg4MSwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQSwgMHgzOSwgMHgwMCwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgyRSwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgyQSwgMHgwMCwgMHgwQiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgyNiwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgyMiwgMHgwMCwgMHgwQywgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgxRSwgMHgwMCwgMHgxMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgxQSwgMHgwMCwgMHgxOCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHg0MCwgMHg2NCwgMHgxNiwgMHgwMCwgMHgyNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg4MCwgMHg2NCwgMHgxMiwgMHgwMCwgMHgzMCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NywgMHgwRSwgMHgwMCwgMHg0OCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NywgMHgwQSwgMHgwMCwgMHg2MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NywgMHgwNiwgMHgwMCwgMHg2QywgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NywgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwKKwkgMHgwMCwgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMSwgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGQiwgMHg2MSwgMHg0MCwKKwkgMHgwMCwgMHgzNiwgMHgwNSwgMHgwMCwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhCQiwgMHgwMSwgMHg2NSwgMHg0MCwKKwkgMHgwMCwgMHgzQSwgMHgxRSwgMHgwMCwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGQSwgMHhBMywgMHgwMCwgMHg2MCwKKwkgMHgxNywgMHg2MSwgMHgwMCwgMHg2MCwgMHgzMiwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwQiwgMHgwMywgMHg2MCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg5MSwgMHgwMSwKKwkgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NSwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNCwgMHgwMCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgzNywgMHg2MCwgMHhGOCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhBMSwgMHhGMywgMHgwMSwgMHg2MCwgMHhBQywgMHg2MywgMHg2MCwgMHg0NSwgMHgyQSwgMHg0NCwKKwkgMHg3OSwgMHhGQiwgMHhBMywgMHhENSwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1QiwgMHhENSwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1OSwgMHhEMSwKKwkgMHg2NiwgMHg0MSwgMHhBMCwgMHg4NCwgMHgyNCwgMHg5NCwgMHgyQiwgMHg0NiwgMHgwRiwgMHhGQSwgMHg3QSwgMHhGQiwgMHgxNiwgMHg2NCwgMHgxMiwgMHhGQSwKKwkgMHgwMSwgMHg2NCwgMHgxMSwgMHhGQSwgMHg2NiwgMHg1QywgMHhDMiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwKKwkgMHgyMiwgMHhGMywgMHgxQSwgMHg2MCwgMHgyMSwgMHhGMSwgMHg2MCwgMHg0NywgMHhCMCwgMHg4NCwgMHgxQywgMHg2MCwgMHgwOCwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxOCwgMHg4MCwgMHhCQywgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgyMiwgMHg2NCwKKwkgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHg1MCwgMHg5NCwgMHhBNywgMHg0NiwgMHgzQSwgMHhGQSwgMHhCQiwgMHhGQywgMHhBNywgMHg0NiwgMHg4MCwgMHg2MCwKKwkgMHgwMywgMHg2NSwgMHgzMiwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHg2NSwgMHhBNywgMHg0NiwgMHgwNiwgMHhGMCwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHhBMCwgMHg4NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhGQSwgMHhCQiwgMHhGQywgMHhBNywgMHg0NiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMCwgMHgzMCwgMHhGMCwKKwkgMHg2NCwgMHg0MywgMHgzMSwgMHhGMiwgMHgyNywgMHg0NiwgMHgwMywgMHhGQywgMHgwNCwgMHhGOCwgMHgwNSwgMHhGQSwgMHgyNiwgMHg0NiwgMHhEOSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwMSwgMHg2NCwgMHg4QSwgMHhGQiwgMHgxNiwgMHg2MCwKKwkgMHhDOSwgMHhGMywgMHgyMCwgMHg0MSwgMHgwMCwgMHhCQywgMHgyMCwgMHhCOSwgMHgwMSwgMHgwMywgMHg0MSwgMHg0MCwgMHgyMCwgMHg2MCwgMHgxNCwgMHg2MSwKKwkgMHhBMSwgMHhERiwgMHgwNCwgMHg2NCwgMHhDMSwgMHhGRSwgMHhEQiwgMHhGQiwgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhGMSwgMHhGQiwKKwkgMHhGNywgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgzMywgMHg2MCwgMHhFNiwgMHg2NSwgMHhBNSwgMHhERiwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwQywgMHg2NCwgMHg2OCwgMHhGQiwgMHgwMCwgMHg2MCwgMHgzMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwKKwkgMHhFMSwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyOCwgMHhGQiwKKwkgMHhFMSwgMHg2MCwgMHhGNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwRiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQiwgMHg2MCwgMHhGRSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHhFNywgMHg2MCwKKwkgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwgMHgyRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMSwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBNiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0MywgMHg2NiwgMHg0MSwgMHg2MywgMHg0NiwgMHgwNSwgMHhGMiwgMHgwMCwgMHhGMCwgMHg4MSwgMHhGMCwKKwkgMHgwMiwgMHgxOCwgMHg2NCwgMHg0NiwgMHg4MSwgMHhGOCwgMHgwNywgMHgxQiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgwMiwgMHgwMCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGOCwgMHhBNiwgMHhGMywgMHg2MywgMHg0NSwgMHg2MCwgMHg0NiwKKwkgMHgwMCwgMHhGMiwgMHhGRiwgMHhGRiwgMHhENCwgMHg4MCwgMHgwMSwgMHgxOCwgMHhGQSwgMHgwNCwgMHg4MCwgMHhGOCwgMHg2NSwgMHg0NiwgMHgwMCwgMHhGQSwKKwkgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMCwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHg0QiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMSwgMHg2MCwgMHg5QiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2OSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMSwgMHg2MCwgMHhCMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHhFMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgxMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg4QSwgMHhGQiwgMHgwMiwgMHg2NCwgMHhDMSwgMHhGRSwgMHhEQiwgMHhGQiwKKwkgMHhGMSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCQywgMHhGMSwgMHhGQiwgMHgwMiwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHg2MCwgMHhFOCwgMHg2MywgMHgwRSwgMHg2MCwgMHgzNiwgMHhGRCwgMHgwOCwgMHg2MCwgMHg3NywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgxMywgMHgxQiwgMHgxNiwgMHg2MCwgMHhDQywgMHhGMywgMHgwMCwgMHg2MSwgMHg2MCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMCwgMHhCOSwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNiwgMHgwMSwgMHhCOSwgMHg2MCwgMHg0MCwgMHgwMiwgMHgzNiwgMHgwNiwgMHhCOSwgMHg2MCwgMHg0MCwgMHgwMywgMHgzNiwgMHgwNywgMHhCOSwKKwkgMHg0MSwgMHg0NCwgMHhENCwgMHg2MCwgMHhGNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEMywgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHg0NiwgMHgwMSwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2MywgMHg2OCwgMHhGRCwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgzMCwgMHgwMCwgMHgyMCwgMHg0MCwKKwkgMHgwNiwgMHgyMywgMHgxMCwgMHgwMCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyOCwgMHhGQiwgMHhFMSwgMHg2MCwgMHhGNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg0NCwgMHgwMSwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMSwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg5NSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMywgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMiwgMHg2MCwKKwkgMHgyQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCOSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwKKwkgMHg3RCwgMHhGMSwgMHg3QywgMHhGOSwgMHgwMiwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHg4QSwgMHhGMywgMHgwMCwgMHg2NSwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwRSwgMHgwMywgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMiwgMHg2MCwgMHg0QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1MSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgxQiwgMHg2MCwgMHhCMCwgMHg2NCwgMHg2NywgMHhGQiwgMHgxQywgMHg2MCwgMHg3MiwgMHg2MywgMHg3RiwgMHhGMywgMHhCRCwgMHhEQiwgMHg4MCwgMHhGMywKKwkgMHhCRCwgMHhEQiwgMHg4MSwgMHhGMywgMHhBMywgMHhEQiwgMHg2NywgMHhGMywgMHgwMCwgMHg2MCwgMHg4NiwgMHhGMSwgMHgwNCwgMHhBNCwgMHg2NywgMHhGQiwKKwkgMHhEMCwgMHg4MCwgMHhBMCwgMHhEMywgMHgxRiwgMHgwNywgMHg0MCwgMHg0NywgMHg2MCwgMHg0MSwgMHgwRSwgMHg2NSwgMHg0NSwgMHhEMywgMHgxNiwgMHg2MCwKKwkgMHhDMiwgMHhGMSwgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwgMHgxMCwgMHhCMCwgMHhGRiwgMHhGRiwgMHhFRCwgMHgwMiwgMHgyNywgMHg0NCwgMHgwNiwgMHhBNCwKKwkgMHg2MCwgMHg0MSwgMHhBMSwgMHhEMSwgMHg3RiwgMHhGMywgMHg4MCwgMHhGMSwgMHhEMCwgMHg4MCwgMHg1OSwgMHhEMywgMHgwOCwgMHgwMiwgMHhEMCwgMHg4MCwKKwkgMHg4MSwgMHhGMywgMHg1OSwgMHhEMSwgMHgwNCwgMHgwMiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHhFMiwgMHg2MCwKKwkgMHhFNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHg3MiwgMHg2MywgMHhCRCwgMHhEMywgMHg3RiwgMHhGQiwgMHhCRCwgMHhEMywgMHg4MCwgMHhGQiwKKwkgMHhBMywgMHhEMywgMHg4MSwgMHhGQiwgMHg1MywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMiwgMHg2MCwKKwkgMHg5QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3QywgMHhGMSwgMHg3RCwgMHhGOSwgMHgxMywgMHg2MCwKKwkgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxNiwgMHhGQiwgMHhFMiwgMHg2MCwgMHhDNywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwKKwkgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMSwgMHg2MywgMHg4QSwgMHhGRCwgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHg1NCwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgzMSwgMHg0NCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHhFMSwgMHg2MCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNywgMHg0MywgMHgzMywgMHg2MCwKKwkgMHhCRSwgMHg2NSwgMHhBNSwgMHhEMywgMHg2NSwgMHg0MSwgMHgxMCwgMHhBMywgMHgwMSwgMHhBNCwgMHhGRSwgMHhCNCwgMHhDNCwgMHg4NSwgMHhGRSwgMHhBMSwKKwkgMHhCRCwgMHhEMywgMHg1OSwgMHhEMSwgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwgMHhENSwgMHg4MCwgMHgwMiwgMHgwMiwgMHgwNCwgMHgwMywgMHhGOCwgMHgwMSwKKwkgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1NSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwKKwkgMHhFMiwgMHg2MCwgMHhGRSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhEMSwgMHg3RCwgMHhGOSwKKwkgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMywgMHg2MCwgMHgyMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwNywgMHg2MCwgMHhEMCwgMHg2NCwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGQiwKKwkgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwKKwkgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMywgMHg3RiwgMHhGQiwgMHhCRCwgMHhEMywgMHg4MCwgMHhGQiwgMHhBMywgMHhEMywgMHg4MSwgMHhGQiwKKwkgMHgzMSwgMHg0NCwgMHhGOSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFMywgMHg2MCwgMHg1MSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhCOSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0QiwgMHhGOSwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2MSwKKwkgMHhBMSwgMHg4NCwgMHg1QSwgMHhEMSwgMHg0QSwgMHhEQiwgMHhBMSwgMHg4NCwgMHg1QSwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMSwgMHgzMiwgMHg2MCwgMHg3QSwgMHg2MSwgMHhBMSwgMHhEMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNywgMHg1OSwgMHhEMywKKwkgMHgzMiwgMHg2MCwgMHg3RSwgMHg2MSwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhEQiwgMHgyNywgMHg0MiwKKwkgMHgwQywgMHhBMiwgMHhBMiwgMHhEMywgMHgxNiwgMHg2MCwgMHhBRCwgMHhGMywgMHgwMCwgMHhCRCwgMHgwMSwgMHg2MywgMHhBQywgMHg4MSwgMHgwOSwgMHgwMywKKwkgMHgwOCwgMHgwMywgMHhCOCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgxNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOCwgMHgwMSwgMHg2MywgMHgwMSwgMHgwMywKKwkgMHg2MCwgMHg0MywgMHgwRSwgMHg2MCwgMHgzNSwgMHhGRCwgMHg1RiwgMHhGNSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgyMCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHgyNywgMHg0MywgMHgwNiwgMHhBMywgMHhCRCwgMHhEMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHhCRCwgMHhEMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwKKwkgMHhBMywgMHhEMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwMCwgMHhGNCwgMHgwMSwgMHg2MywKKwkgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQiwgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMSwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwKKwkgMHgxMCwgMHhCQiwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwQSwgMHgwMCwgMHgxOSwgMHg2MCwgMHg0NSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyMiwgMHgyMCwgMHhCQiwgMHg2MywgMHg0NCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg3RiwgMHg2MCwgMHg0MywKKwkgMHgwOSwgMHhGQywgMHgwRSwgMHg2MCwgMHgzNSwgMHhGMywgMHgxMiwgMHg2MSwgMHg1OSwgMHhEQSwgMHgxQywgMHg2MCwgMHg3MiwgMHg2MywgMHhCRCwgMHhEMSwKKwkgMHg1OSwgMHhEOCwgMHhCRCwgMHhEMSwgMHg1OSwgMHhEOCwgMHhBMywgMHhEMSwgMHg1OSwgMHhEOCwgMHgzNSwgMHg2MCwgMHg5OCwgMHg2NCwgMHg0MCwgMHg0OCwKKwkgMHhEOSwgMHg4MSwgMHhGRiwgMHg2MCwgMHhGMiwgMHg2NCwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RiwgMHhGNSwKKwkgMHgzRiwgMHhGQywgMHhEQiwgMHg4MywgMHgxQSwgMHg2MCwgMHg0QywgMHhGRCwgMHgyMCwgMHg3QywgMHg1QSwgMHhEOSwgMHg2MywgMHg0MSwgMHgzNCwgMHg2MCwKKwkgMHg5QywgMHg2MywgMHgxMiwgMHg2NSwgMHgwMCwgMHhGNCwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwKKwkgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywKKwkgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHg1RiwgMHhGNSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgxNiwgMHg2NCwgMHg2OCwgMHhGQiwgMHg1NiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwRSwgMHg2MCwgMHgzOCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2NCwgMHhBNCwgMHhBMiwgMHhEQiwgMHgwRSwgMHg2MCwgMHgzOCwgMHhGMSwgMHgwRSwgMHg2MCwKKwkgMHg0QiwgMHhGOSwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxQywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFNCwgMHg2MCwgMHgyMywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1NywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwKKwkgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwKKwkgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg1OCwgMHg2NCwKKwkgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhFNiwgMHg2MCwgMHgzNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgzRCwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5MiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg2OCwgMHhGQiwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwOSwgMHhGMiwgMHgwNCwgMHgxQiwgMHgwMSwgMHhCMCwgMHgwMSwgMHg3QywgMHgyRCwgMHgwMiwKKwkgMHgwQSwgMHhGOCwgMHg1OSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHgwQSwgMHhGMiwgMHgyNiwgMHg0NiwgMHg0MCwgMHg1OSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MSwgMHgyRiwgMHhGMiwgMHhBMSwgMHhEQiwgMHgzMCwgMHhGMiwgMHg0MSwgMHg1OCwgMHg1OSwgMHhEQiwgMHgzMSwgMHhGMiwgMHg1OSwgMHhEQiwKKwkgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgwNSwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFNywgMHg2MCwKKwkgMHgwQiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QSwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHg3OCwgMHg0MywgMHgwMiwgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QiwgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwKKwkgMHgwQywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHhGRiwgMHhCMSwgMHhGRiwgMHhBMSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDOCwgMHgwMiwKKwkgMHhDNywgMHgwMywgMHgzNCwgMHg2MCwgMHhGNCwgMHg2MywgMHgzMCwgMHg2NCwgMHhCRCwgMHhEQiwgMHg2NiwgMHg0NSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHgzNCwgMHg2MCwgMHhGMiwgMHg2MSwgMHhDMiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRSwgMHg2NCwgMHg2NSwgMHg0NiwgMHgwMiwgMHhBNCwKKwkgMHhBMSwgMHhEQiwgMHhDOCwgMHg4MSwgMHgxMiwgMHg2NSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwKKwkgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywKKwkgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgwQywgMHhGMiwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2NSwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhDNCwgMHg4NSwgMHhEQywgMHg2MCwgMHg1OCwgMHg0RCwgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQiwgMHhGMiwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHg2MSwgMHg0NCwKKwkgMHg5NCwgMHhGQiwgMHgyNywgMHg0NSwgMHgwMiwgMHg2MiwgMHg0NiwgMHhEMywgMHg1QSwgMHhEMSwgMHg2MCwgMHg0NywgMHg1NiwgMHhGQiwgMHg2NCwgMHg0NywKKwkgMHg1NSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg1QiwgMHhGQiwgMHgwQywgMHg2MiwgMHg0NiwgMHhEMywgMHg3RSwgMHhGQiwgMHgwQiwgMHhGMCwgMHgwRiwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHg4MywgMHhGQiwgMHgxQywgMHg2MCwgMHg2QSwgMHg2MiwgMHhBMiwgMHhEMywgMHg4NSwgMHhGQiwgMHgyNiwgMHg0NiwKKwkgMHgzMiwgMHhGMCwgMHg3RiwgMHhGOSwgMHgzMywgMHhGMCwgMHg4MCwgMHhGOSwgMHgzNCwgMHhGMCwgMHg4MSwgMHhGOSwgMHgyRSwgMHg2MCwgMHgyRSwgMHg2NCwKKwkgMHgyRCwgMHg2MCwgMHg4QSwgMHg2MywgMHhBMCwgMHhEMSwgMHhBMywgMHhEOSwgMHg2NCwgMHg0MSwgMHg1OCwgMHhEMSwgMHg1QiwgMHhEOSwgMHg3RCwgMHhGMywKKwkgMHg2NiwgMHg0NSwgMHhBNiwgMHhGNSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHg5MSwgMHhGQSwgMHg2MSwgMHg0NCwgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGQSwgMHgwNywgMHgwMCwgMHgxMSwgMHhGOCwgMHg2NCwgMHg0NCwgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHhGQSwgMHg2NSwgMHg0NiwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwKKwkgMHg0MCwgMHg0QiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGQSwgMHhBMywgMHgwMCwgMHg2MCwgMHgxNywgMHg2MSwgMHgwMCwgMHg2MCwKKwkgMHgwMSwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHg0QSwgMHg2MCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHgwMCwgMHg2NSwgMHgwMCwgMHg2NCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGQiwgMHgwMiwgMHgwMCwgMHgyMCwgMHhGRSwgMHhGRiwgMHg2NSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2MywgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHgyMCwgMHhGRSwgMHhDRCwgMHg4MSwgMHg2MCwgMHg0MCwKKwkgMHg4MCwgMHgyQSwgMHgzOSwgMHgwMCwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NCwgMHgyRSwgMHgwMCwgMHgwNCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgyQSwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgyNiwgMHgwMCwgMHgxNiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgyMiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgxRSwgMHgwMCwgMHgxMiwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgxQSwgMHgwMCwgMHgxOCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg0MCwgMHg2NCwgMHgxNiwgMHgwMCwgMHgyNCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHg4MCwgMHg2NCwgMHgxMiwgMHgwMCwgMHgzMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NywgMHgwRSwgMHgwMCwgMHg0OCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NywgMHgwQSwgMHgwMCwgMHg2MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NywgMHgwNiwgMHgwMCwgMHg2QywgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NywgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMSwgMHhGRiwgMHhGRiwKKwkgMHhCMCwgMHg4NCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGQiwgMHg2MSwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwNSwgMHgwMCwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHhCQiwgMHgwMSwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxRSwgMHgwMCwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwKKwkgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGQSwgMHhBMywgMHgwMCwgMHg2MCwgMHgxNywgMHg2MSwgMHgwMCwgMHg2MCwgMHgzMiwgMHg2NSwgMHgwMSwgMHg2MCwKKwkgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwKKwkgMHgwQiwgMHgwMywgMHg2MCwgMHhGRSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMywgMHg2MCwgMHg0MSwgMHhGRSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgyQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg5MSwgMHgwMSwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NSwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhDNywgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHgwNCwgMHgwMCwgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHgxMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgzNywgMHg2MCwgMHhGOCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhBMSwgMHhGMywKKwkgMHgwMSwgMHg2MCwgMHhBQywgMHg2MywgMHg2MCwgMHg0NSwgMHgyQSwgMHg0NCwgMHg3OSwgMHhGQiwgMHhBMywgMHhENSwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHg1QiwgMHhENSwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNywgMHg1OSwgMHhEMSwgMHg2NiwgMHg0MSwgMHhBMCwgMHg4NCwgMHgyNCwgMHg5NCwgMHgyQiwgMHg0NiwKKwkgMHgwRiwgMHhGQSwgMHg3QSwgMHhGQiwgMHgxNiwgMHg2NCwgMHgxMiwgMHhGQSwgMHgwMSwgMHg2NCwgMHgxMSwgMHhGQSwgMHg2NiwgMHg1QywgMHhDMiwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhBNCwgMHg0MCwgMHg0QiwgMHg2MCwgMHg0NiwKKwkgMHgwMCwgMHg2NCwgMHgxNywgMHhGQSwgMHgwMCwgMHg2NCwgMHgxNiwgMHhGQSwgMHgxMywgMHhGQSwgMHgwMCwgMHg2NSwgMHgyNiwgMHg0NiwgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGMywgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHgwMiwgMHhBNCwgMHg2MCwgMHg0NiwKKwkgMHgwNSwgMHhGMCwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHgwMCwgMHg3QywgMHg0NCwgMHhEOSwgMHgyNiwgMHg0NiwKKwkgMHgzMSwgMHhGMiwgMHg2MSwgMHg1QywgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwgMHhFMCwgMHg4NCwgMHg0NCwgMHhEOSwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMCwKKwkgMHg2MSwgMHg0NiwgMHgwMywgMHhGOCwgMHgyNiwgMHg0NiwgMHgzMCwgMHhGMCwgMHg2MSwgMHg0NiwgMHgwNCwgMHhGOCwgMHgyNiwgMHg0NiwgMHgzMSwgMHhGMCwKKwkgMHg2MSwgMHg0NiwgMHgwNSwgMHhGOCwgMHgyNiwgMHg0NiwgMHhEOSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBRSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHgwMywgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2MywgMHg4QSwgMHhGRCwKKwkgMHgwOCwgMHg2MCwgMHgwQywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwKKwkgMHg1QywgMHg2NCwgMHgzQiwgMHg0MiwgMHg1QSwgMHhEQiwgMHhFMSwgMHg2MCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGNywgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHhEQSwgMHg2MCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRCwgMHhBMCwKKwkgMHgyQSwgMHhGMiwgMHgwMywgMHgwMywgMHhFNiwgMHg2MCwgMHhERSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHhCMCwgMHgzNiwgMHgxMSwgMHgwMCwKKwkgMHhDMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEQSwgMHg2MCwgMHg3NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NSwgMHgwMCwgMHhGNCwgMHgwQSwgMHhGMiwgMHgwQiwgMHhGMiwgMHhGRSwgMHhBMCwgMHhGMywgMHhBMCwgMHg2NywgMHgwMiwKKwkgMHg2MCwgMHg0MSwgMHgwOSwgMHhGMiwgMHgxRCwgMHgwMywgMHgwMCwgMHhBMCwgMHhGRiwgMHhBMCwgMHg0QiwgMHgwMywgMHg1RCwgMHgwMywgMHgwMCwgMHhBMCwKKwkgMHhGRiwgMHhGRiwgMHg0NywgMHgwMywgMHgwMSwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQiwgMHhGQiwgMHgwRCwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQywgMHhGQiwKKwkgMHgwMywgMHg2NCwgMHgxMCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEQSwgMHg2MCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxNiwgMHg2MCwgMHhDMywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBMCwgMHgyMCwgMHg2MCwgMHgxNiwgMHg2MSwgMHgxNSwgMHgwMiwgMHgwMSwgMHg2NCwKKwkgMHhBMSwgMHhEQiwgMHgwMCwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwQywgMHhGQiwgMHgwMSwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NiwKKwkgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHhEQSwgMHg2MCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHhBMSwgMHhEQiwgMHgwMCwgMHg2NCwgMHgxMCwgMHg2MCwKKwkgMHgwQywgMHhGQiwgMHgwMSwgMHg2NCwgMHgxMCwgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwKKwkgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHhEQSwgMHg2MCwgMHg3NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NiwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2NSwgMHg0NiwKKwkgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhEQywgMHg2MCwgMHgwOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwQSwgMHhGMiwKKwkgMHgwOSwgMHhGMiwgMHhGQywgMHhBMCwgMHhGRiwgMHhBMCwgMHgxMSwgMHgwMiwgMHgwQSwgMHgwMiwgMHgwQiwgMHhGMiwgMHg2NSwgMHg0NiwgMHgwQSwgMHgxQiwKKwkgMHg2NiwgMHg0MSwgMHgwNywgMHhGNCwgMHgwNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHg3RSwgMHgwNiwgMHhGQSwgMHg2MSwgMHg0NiwgMHhEQSwgMHg2MCwKKwkgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0NiwgMHg2OCwgMHhGMSwgMHgyQSwgMHhGMiwKKwkgMHg2NCwgMHg0MSwgMHg2MCwgMHg0MCwgMHhBMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHhCMSwgMHgwNCwgMHgwMCwgMHhDMCwgMHgzQSwgMHgwQiwgMHgwMCwKKwkgMHgwNCwgMHhCMSwgMHhGRiwgMHhGRiwgMHgxRSwgMHgwMywgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxNiwgMHgwMCwgMHhCMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2NSwgMHgwNywgMHgwMCwgMHgxMCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NSwgMHgwMywgMHgwMCwgMHgzMCwgMHgzQSwgMHgwQywgMHgwMCwgMHgxMCwgMHg2NSwgMHhBNSwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHgwMywgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwMCwgMHg2NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhDMywgMHhGMywgMHhGRiwgMHhGRiwgMHhGQywgMHhBMCwgMHhGRiwgMHhGRiwKKwkgMHgxNCwgMHgwNCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxNiwgMHhGQiwgMHhFNywgMHg2MCwgMHgxQiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHhBNSwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhEQSwgMHg2MCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMywgMHgwMCwKKwkgMHhEOSwgMHg2MCwgMHhDQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFMiwgMHg2MCwgMHg3MywgMHg3OCwgMHhGRiwgMHhGRiwgMHg0RSwgMHg2NCwgMHgzQiwgMHg0MiwKKwkgMHg1QSwgMHhEQiwgMHgyRSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwgMHgxRCwgMHg2MCwgMHhDMCwgMHg2NSwgMHg2MCwgMHg0NywgMHgwMCwgMHg3RiwKKwkgMHhFMCwgMHg4NCwgMHg0NCwgMHhEMywgMHg2NiwgMHg0MSwgMHg2MCwgMHg0NiwgMHg2MCwgMHg0MywgMHgwNSwgMHhGMiwgMHgxNiwgMHgxOCwgMHg2MSwgMHg0NiwKKwkgMHgyNywgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHgwNCwgMHhGMiwgMHgwQywgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNiwgMHhGMCwgMHg2MywgMHg0NiwKKwkgMHhEMCwgMHg4MCwgMHgwMywgMHhGMiwgMHgwNiwgMHgwMiwgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMCwgMHg2MywgMHg0NiwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwKKwkgMHgwNywgMHgwMywgMHg4MCwgMHhGNCwgMHhGRiwgMHhGRiwgMHg2MywgMHg0NiwgMHhFOCwgMHgxQiwgMHhBNiwgMHhGMywgMHgwOCwgMHhGRSwgMHg2MCwgMHg0MywKKwkgMHg2MSwgMHg0NiwgMHgyNSwgMHhGMiwgMHgyNiwgMHhGMCwgMHhBNywgMHhGMiwgMHhBOCwgMHhGMCwgMHg2NSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwKKwkgMHhGRiwgMHhGRiwgMHg4OSwgMHhGOCwgMHg2NSwgMHhGNSwgMHhGRiwgMHhGRiwgMHgwNywgMHhGQywgMHgyQywgMHhGQSwgMHgyRCwgMHhGOCwgMHhBRSwgMHhGQSwKKwkgMHhFQSwgMHhGMywgMHgyRiwgMHhGQSwgMHhFQiwgMHhGMywgMHgzMCwgMHhGQSwgMHhFQywgMHhGMywgMHgzMSwgMHhGQSwgMHg3RiwgMHhGMywgMHgzMiwgMHhGQSwKKwkgMHg4MCwgMHhGMywgMHgzMywgMHhGQSwgMHg4MSwgMHhGMywgMHgzNCwgMHhGQSwgMHgxQiwgMHg2MCwgMHhGRSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMywgMHgxQiwKKwkgMHgwMCwgMHg2MCwgMHhBMCwgMHg2NCwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MCwgMHhDMCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMiwgMHg2MywgMHgzRiwgMHhGQywKKwkgMHhBQiwgMHhGQywgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhDOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NiwKKwkgMHg0NiwgMHg0NiwgMHhDMSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgyQSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhFMSwgMHg2MCwgMHgzNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg2MSwgMHhGQiwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHgwQywgMHg2MCwgMHg4MCwgMHg2NCwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2MCwgMHhGQiwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHgwQywgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHhFOCwgMHg2MCwgMHhFQSwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgzMywgMHhGQiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwgMHhFNywgMHg2MCwgMHhDQiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHg4NywgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwgMHgwMywgMHhBOCwKKwkgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHhFOCwgMHg2MCwgMHhEQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwKKwkgMHgzNCwgMHg4MCwgMHgxMCwgMHg2MCwgMHgxRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg5QiwgMHhGRSwgMHgwMywgMHgwNSwgMHgyMCwgMHg0MCwKKwkgMHg0QiwgMHgyMywgMHgwQSwgMHgwMCwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwgMHhFNywgMHg2MCwgMHhEOSwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgxMywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNywgMHgwMCwgMHg5MCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwNCwgMHgwMCwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg4QSwgMHhGMywgMHg1OCwgMHhGQiwgMHg4MiwgMHhGMSwKKwkgMHhCQSwgMHhGRSwgMHgwMSwgMHhBOCwgMHg1OSwgMHhGOSwgMHgwNCwgMHgwMiwgMHgwMiwgMHg2NCwgMHg4QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHg2NCwgMHg0NywgMHhEQiwgMHhGMywgMHgxMCwgMHhCMCwgMHgwNCwgMHhBOCwgMHgyQiwgMHgwMiwgMHgyQSwgMHgwMiwgMHg2MSwgMHhGNSwgMHhFQSwgMHhGMSwKKwkgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwKKwkgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHgxMCwgMHg2MCwgMHg0OCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwKKwkgMHhFOCwgMHg2MCwgMHgzNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2NywgMHg4MiwgMHhGQiwKKwkgMHg4QSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhGRiwgMHgwQSwgMHgwMywgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxMCwgMHhGQiwgMHhFOCwgMHg2MCwgMHgzOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwKKwkgMHgxRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNSwgMHg3QywgMHg1MywgMHhGOSwgMHgyRiwgMHg2MCwgMHgyNCwgMHg2NCwgMHg1NCwgMHhGQiwKKwkgMHgxOSwgMHg2MCwgMHg0MCwgMHhGMywgMHhGRiwgMHhGRiwgMHgxNSwgMHgxOCwgMHgxMCwgMHg2MCwgMHgxRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwgMHhFOCwgMHg2MCwgMHg2OSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg0MSwgMHhGMywgMHhGRiwgMHg2MCwgMHg4MCwgMHg2NSwgMHhBNCwgMHg4MCwgMHg1QSwgMHhEMywgMHgwNSwgMHgwMiwKKwkgMHgwNCwgMHgxQiwgMHg1QSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMSwgMHgxQiwgMHgxNSwgMHgwMCwgMHgxMCwgMHg2MCwgMHgxRSwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwgMHhFOCwgMHg2MCwgMHg4QSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg1OSwgMHhGMywgMHg4MiwgMHhGQiwgMHg2MCwgMHg0MCwgMHgxMCwgMHgyNywgMHhEQSwgMHhGRSwKKwkgMHhEQiwgMHhGMywgMHgwMCwgMHhBOCwgMHgwNCwgMHhBOCwgMHgyMywgMHgwMiwgMHgyMiwgMHgwMiwgMHg2MCwgMHhGNSwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwKKwkgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwKKwkgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg4MywgMHhGMSwgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwKKwkgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHhFQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwKKwkgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg1OCwgMHhGMywgMHg4QSwgMHhGQiwgMHhGRiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgxRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwgMHhFNywgMHg2MCwgMHhDQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5QywgMHhGMSwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NiwgMHg5QywgMHhGQiwgMHgwNywgMHgwMywgMHgyNiwgMHg2MCwKKwkgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhFQiwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgxMCwgMHg2MCwgMHgxRSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxMCwgMHhGQiwgMHhFNywgMHg2MCwgMHhDQiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHg5NSwgMHhGMywgMHgyNiwgMHg0NiwgMHg2MCwgMHg0MywgMHgwMSwgMHgyQSwgMHgyMCwgMHgwMCwgMHgwRiwgMHhGMiwgMHgyQSwgMHhGMCwgMHg2MCwgMHg0MCwKKwkgMHgxMCwgMHgyQSwgMHgwRiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgxOCwgMHgwMCwgMHhGRCwgMHhCMywgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNywKKwkgMHgwMiwgMHhCQiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgwQiwgMHgwMCwgMHhGQiwgMHhCMywgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNywgMHgwNCwgMHhCQiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg5NSwgMHhGRCwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhEQiwgMHhGMywgMHgzRiwgMHhGMiwgMHgwNCwgMHhBOCwgMHg1NywgMHhGQiwgMHgwMiwgMHgwMywgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhGNCwKKwkgMHgxRSwgMHg2MywgMHgwOCwgMHg2NCwgMHg0MCwgMHg0OCwgMHhCRCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwNSwgMHgzNiwgMHgwQiwgMHgwMCwKKwkgMHhGRiwgMHhCNSwgMHhDNywgMHg4MywgMHgwMSwgMHgyQSwgMHhGNywgMHgwMSwgMHg0RiwgMHhEMiwgMHg1QiwgMHhEMiwgMHg2MCwgMHg0MCwgMHgwNSwgMHgzNywKKwkgMHgwQiwgMHgwMCwgMHhERiwgMHg4MywgMHhGNSwgMHgwMSwgMHhGRiwgMHhCNSwgMHg2NSwgMHg0MSwgMHhBMywgMHhEMiwgMHg0NywgMHg4QSwgMHg2MCwgMHg0NywKKwkgMHg0MCwgMHg0QywgMHg1QiwgMHhEMiwgMHhERiwgMHg4MywgMHgwOCwgMHgwMCwgMHg0MCwgMHg0QywgMHgwMCwgMHg3RiwgMHhEQywgMHg4NSwgMHg0NywgMHg4QSwKKwkgMHg2MCwgMHg0MSwgMHg1QiwgMHhEMiwgMHhEQiwgMHg4MywgMHg2MCwgMHg0NywgMHgwMSwgMHhCMCwgMHhGRSwgMHhCNSwgMHgwMiwgMHgwMywgMHgwMiwgMHg2NCwKKwkgMHg0MCwgMHg0OCwgMHgyQywgMHg0NywgMHhGRiwgMHhCNCwgMHg3MywgMHhGMSwgMHgwOCwgMHgyOCwgMHg3MywgMHhGQiwgMHg4MywgMHhGMSwgMHg2NSwgMHg0NCwKKwkgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhGRCwgMHhBMSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4MSwgMHhFMSwgMHg4NSwgMHhDNCwgMHg4MSwKKwkgMHhEMCwgMHg4NCwgMHhEMSwgMHg4MCwgMHgyOCwgMHgwNywgMHgyNywgMHgwNiwgMHg5QywgMHg4NCwgMHhEQywgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NSwgMHg5NCwgMHhGMywgMHhDNywgMHg4MywgMHgwMSwgMHgyNiwgMHg2MCwgMHg0NywgMHhBQiwgMHg4MywgMHhGQywgMHhBMywgMHgwMiwgMHgwMCwKKwkgMHgwMywgMHgwNCwgMHgwMCwgMHhGNCwgMHg4NCwgMHhBMywgMHhGQywgMHgwMSwgMHg4MCwgMHg2NSwgMHg0NywgMHhEMCwgMHgyOCwgMHg0MSwgMHhBMCwgMHg4MCwKKwkgMHhGRSwgMHhBMSwgMHgxNCwgMHgwMywgMHgwOCwgMHgwMiwgMHgwOCwgMHg2MCwgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQiwgMHgwMCwgMHgwOCwgMHg2MCwgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMywgMHgwMCwgMHgyOCwgMHg0MSwgMHhGRSwgMHhBMSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywgMHgwOCwgMHg2MCwKKwkgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwNywgMHgwMCwgMHgwOCwgMHg2MCwKKwkgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywgMHg5NSwgMHhGRCwgMHgxQywgMHg2MCwgMHg5RSwgMHg2MywgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwKKwkgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg5OCwgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwgMHhBMywgMHhEQiwgMHhFOSwgMHg2MCwKKwkgMHhCOCwgMHg2NCwgMHgwOCwgMHg2MCwgMHg0QiwgMHhGQiwgMHhDRSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg1MSwgMHhGOSwgMHgxQywgMHg2MCwgMHhBQSwgMHg2MywKKwkgMHgwMCwgMHg2NCwgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHgxMCwgMHg2MCwgMHg5QywgMHg2NCwgMHhCRCwgMHhEQiwgMHhCRCwgMHhEQiwgMHgwNiwgMHg2NCwKKwkgMHhBMywgMHhEQiwgMHhFOSwgMHg2MCwgMHhDMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHg0RCwgMHhGQiwgMHgxNiwgMHg2MCwgMHhBRSwgMHhGMSwgMHgwRSwgMHg2MCwKKwkgMHg1NywgMHhGOSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg2MywgMHhGQiwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHhCOSwgMHhGMywgMHgxOSwgMHhGQSwgMHhGOCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwKKwkgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgwMCwgMHg2MCwgMHgzQSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg2NCwgMHhGQiwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHhCOSwgMHhGMywgMHgxOSwgMHhGQSwgMHgyNCwgMHg2MCwKKwkgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgzRiwgMHhGQSwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyRCwgMHhGQiwKKwkgMHg1QSwgMHhEQiwgMHhFQSwgMHg2MCwgMHgxRiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzNywgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MywKKwkgMHg5NSwgMHhGRCwgMHhCQSwgMHhGRSwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHg4MiwgMHhGRCwgMHgwOCwgMHg2MCwKKwkgMHgxNSwgMHhGMSwgMHgwNCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxQiwgMHhGQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMywgMHgxOSwgMHg2MCwgMHhGMCwgMHhGMSwgMHgwRSwgMHg2MCwgMHg1NywgMHhGOSwgMHgwNCwgMHgwMCwgMHgxNiwgMHg2MCwKKwkgMHhBRSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg1NywgMHhGOSwgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwOSwgMHgxQiwgMHgwMCwgMHg2NCwKKwkgMHg4MiwgMHhGQiwgMHhCQSwgMHhGRSwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGQiwgMHg1QSwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCQSwgMHhGRSwgMHg5NSwgMHhGMywgMHgwMCwgMHg2MywgMHg4MiwgMHhGRCwgMHgxMCwgMHhCQywgMHg5NSwgMHhGQiwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2MywgMHgwRSwgMHg2MCwgMHgzNywgMHhGRCwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgwNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQSwgMHg2MCwgMHg3MywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBMiwgMHgwMSwgMHgzMSwgMHg0MCwgMHgwNCwgMHgyQSwgMHhFNSwgMHgwMSwKKwkgMHgyMCwgMHg0MCwgMHgxMiwgMHgyMywgMHgxMSwgMHgwMCwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHg1QSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg4MSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQSwgMHg2MCwKKwkgMHg3MywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHhERCwgMHgwMSwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHg2NCwgMHhGNSwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHg3RiwgMHhGMSwKKwkgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwKKwkgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwKKwkgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2MCwKKwkgMHgwMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQSwgMHg2MCwgMHhDOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHhGNSwgMHgyMywgMHhGMiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgxOCwgMHg4MiwgMHgwMSwgMHgxMCwgMHg2NywgMHg4MiwgMHhGQiwKKwkgMHgwMywgMHg2NCwgMHg5NiwgMHhGQiwgMHhGRSwgMHg2MCwgMHhGRiwgMHg2NSwgMHgyMCwgMHg0NCwgMHgyNCwgMHg4MCwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwKKwkgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHg4MSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQSwgMHg2MCwgMHhFQSwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgwQywgMHgwMCwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFQSwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwNiwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0MSwgMHg4QywgMHhGMywgMHhBNSwgMHg4MCwgMHgwMSwgMHhCMCwgMHgwMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHg2RSwgMHg2NSwgMHhBNSwgMHhEMywgMHgwMSwgMHg2MywKKwkgMHg4QSwgMHhGRCwgMHgyNiwgMHgxQiwgMHgwMCwgMHg2MCwgMHg2NCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg2NCwgMHhGNSwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwKKwkgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwKKwkgMHgzNCwgMHhGOCwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwKKwkgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwNiwgMHgwMCwKKwkgMHg5NSwgMHhGMywgMHgzMiwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwMiwgMHgwMCwgMHg0MCwgMHgyQSwgMHhEQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgxMCwgMHg2MCwKKwkgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHg4MiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQiwgMHg2MCwKKwkgMHg0NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFQSwgMHg2MCwgMHgxRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhCQSwgMHhGRSwgMHhFRCwgMHg2MCwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2NCwgMHg4QSwgMHhGQiwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NSwKKwkgMHgyMCwgMHg0NCwgMHgzNCwgMHg4MCwgMHhCQSwgMHhGRSwgMHhDMSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHg1QSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHg0NiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwKKwkgMHhFQiwgMHg2MCwgMHg3NiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwKKwkgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFQSwgMHg2MCwKKwkgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg0NSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRiwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMSwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMSwKKwkgMHg5NSwgMHhGMywgMHgwMCwgMHg2MSwgMHhEMSwgMHg4MCwgMHhGNywgMHhCNCwgMHhGMSwgMHgwMywgMHg5NSwgMHhGQiwgMHgzMywgMHgwMCwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMSwKKwkgMHg5NSwgMHhGMywgMHgwMCwgMHg2MSwgMHhEMSwgMHg4MCwgMHgwOCwgMHhCQywgMHgwMywgMHgwMiwgMHhFQywgMHg2MCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg5NSwgMHhGQiwgMHgyMCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhFQywgMHg2MCwgMHg5QywgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDOCwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMiwgMHg2MywgMHg5NSwgMHhGMywgMHg4QSwgMHhGRCwgMHgwMSwgMHhCQywgMHhDMSwgMHhGRSwgMHg5NSwgMHhGQiwKKwkgMHhDRSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg1MSwgMHhGOSwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwKKwkgMHg1QSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwgMHgzNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQywgMHg2MCwKKwkgMHgwNSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFQSwgMHg2MCwgMHgxRiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgyMiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyQSwgMHgwMSwgMHgwMCwgMHhENSwgMHgwMSwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMSwgMHgwMCwgMHg2OCwgMHgwMCwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHg1OSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwOCwgMHhCQywgMHg5NSwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhBNCwgMHgwMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgwMCwgMHg2MCwKKwkgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxRSwgMHgwMCwgMHgwOCwgMHg2MCwKKwkgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwOCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgxNiwgMHgwMCwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhFRCwgMHg2MCwKKwkgMHg2RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwKKwkgMHg5NSwgMHhGQiwgMHhFQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhBOCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHhFRCwgMHg2MCwgMHg3NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGMywgMHgwMSwgMHg2MywgMHg4QSwgMHhGRCwKKwkgMHgyMSwgMHhCQywgMHg5NSwgMHhGQiwgMHg2MywgMHhGNSwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MSwgMHhGMSwKKwkgMHgyRSwgMHhGOCwgMHg4MywgMHhGMSwgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQSwgMHhGMSwKKwkgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwKKwkgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2MCwgMHg1MCwgMHg2NCwgMHgwRSwgMHg2MCwgMHg1MSwgMHhGQiwgMHgxQywgMHg2MCwKKwkgMHg5RSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMCwgMHg2MCwKKwkgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1QSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMSwgMHg2MCwKKwkgMHgyQywgMHg2NCwgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFQywgMHg2MCwgMHhFOSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRCwgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhFQSwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5NSwgMHgwMSwgMHgwOCwgMHg2MCwKKwkgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwOCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCMCwgMHhGRiwgMHhGRiwgMHg0OSwgMHgwMywgMHg4NiwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg0MCwgMHgwMCwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwKKwkgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMywgMHg5NSwgMHhGMywKKwkgMHgwMCwgMHhBOCwgMHhGNywgMHhCNCwgMHgyQiwgMHgwMywgMHg5NSwgMHhGQiwgMHhFQiwgMHg2MCwgMHhFMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgxNSwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMywKKwkgMHg5NSwgMHhGMywgMHgwMCwgMHhBOCwgMHgwOCwgMHhCQywgMHgwMSwgMHgwMiwgMHg0RiwgMHgwMSwgMHg5NSwgMHhGQiwgMHhFQiwgMHg2MCwgMHhFMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywKKwkgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwMiwgMHgwMCwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxQywgMHg2MCwgMHg5RSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg5NSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhGRSwgMHhCNCwgMHg5NSwgMHhGQiwgMHhFQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg5NSwgMHhGMywgMHgwMSwgMHg2MywgMHg4QSwgMHhGRCwKKwkgMHgwMSwgMHhCQywgMHg5NSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg4MiwgMHhGQiwgMHhDMSwgMHhGRSwgMHgyOCwgMHgwMCwgMHg5NSwgMHhGMywgMHgwMSwgMHg2MywKKwkgMHg4QSwgMHhGRCwgMHgwMSwgMHhCQywgMHg5NSwgMHhGQiwgMHgwMCwgMHg2NCwgMHg4MiwgMHhGQiwgMHg2MywgMHhGNSwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwKKwkgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHg4MywgMHhGMSwgMHhDMCwgMHg2NywgMHhCMCwgMHg4NCwgMHgyQiwgMHhGQSwKKwkgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHgwMCwgMHg2MCwgMHhBNCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgxQywgMHg2MCwgMHhBQSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1QSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMywgMHg2MCwgMHgwRSwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFRCwgMHg2MCwgMHhCOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwRCwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHhBQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHhFQSwgMHg2MCwgMHgxRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwQSwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDQSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwKKwkgMHgxNCwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2MCwgMHgyRCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg5MSwgMHgwMSwgMHgwMCwgMHg2MCwgMHgxMiwgMHg2NCwgMHhBMCwgMHg4MCwKKwkgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhCMSwgMHgwMSwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHhCMiwgMHgwMywgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2NywgMHg4MiwgMHhGQiwKKwkgMHgxMCwgMHg2MCwgMHgzNiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHg1QSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg2NCwgMHhGNSwgMHhCOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHg3RiwgMHhGMSwgMHgyQywgMHhGOCwgMHgzMiwgMHhGOCwgMHg4MCwgMHhGMSwgMHgyRCwgMHhGOCwKKwkgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgyRSwgMHhGOCwgMHgzNCwgMHhGOCwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwKKwkgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHgxMSwgMHg2MCwgMHg0OCwgMHg2NCwgMHgyQSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgyQiwgMHhGQSwgMHgyMywgMHhGQSwKKwkgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg5NSwgMHhGMywgMHhDMSwgMHhGRSwgMHhGRSwgMHhCNCwgMHg5NSwgMHhGQiwgMHgwMCwgMHg2MCwgMHgwMywgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxQywgMHhGQiwgMHhFRSwgMHg2MCwgMHgzMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgzMywgMHgwMSwgMHg2NCwgMHhGNSwgMHgyMywgMHhGMiwgMHg5NiwgMHhGMywgMHgwNCwgMHgxOCwgMHhDQywgMHg4NCwgMHg5NiwgMHhGQiwKKwkgMHgwMSwgMHgwMywgMHgyQiwgMHgwMSwgMHhFQSwgMHg2MCwgMHhEMCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhBQiwgMHhGMywgMHg4MiwgMHhGMSwKKwkgMHgwMiwgMHhBOCwgMHgyQSwgMHhGMiwgMHgwMywgMHgwMiwgMHhCMCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgwNywgMHgwMCwgMHgwOCwgMHg2MCwgMHgxQiwgMHhGMSwKKwkgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyNSwgMHg2MCwgMHhDOCwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgxMiwgMHg2MCwgMHhFRCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHhERiwgMHgwMiwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHg0OCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgyNSwgMHhGQiwgMHhFRSwgMHg2MCwgMHg3NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwKKwkgMHgxOCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNSwgMHhGQiwgMHhFRSwgMHg2MCwgMHg3NywgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgwMCwgMHhGNCwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHgzNiwgMHgxQiwgMHgwMCwKKwkgMHgwRSwgMHhGMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHhFRiwgMHhCNCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywKKwkgMHgwNywgMHgwMCwgMHhBMiwgMHhEQiwgMHgxMywgMHg2NCwgMHhDQiwgMHhGQiwgMHgwMSwgMHg2MCwgMHg2NywgMHg2NCwgMHgzNywgMHhGQiwgMHgwQiwgMHgwMCwKKwkgMHgxMCwgMHhCQywgMHhBMiwgMHhEQiwgMHgwOCwgMHg2NCwgMHhDQiwgMHhGQiwgMHhBMSwgMHhGMywgMHgwMSwgMHg2MCwgMHg2NywgMHg3QywgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHg1QiwgMHg3QywgMHgzNywgMHhGOSwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMiwgMHgwMCwgMHhGNCwgMHg2MCwgMHg0MywgMHhGNCwgMHhBMywKKwkgMHgwMCwgMHg2MCwgMHgxRCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgyQSwgMHg2NSwgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NCwgMHg0MCwgMHg0QywgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHg3QSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMiwgMHgzQiwgMHgwMCwgMHgwMiwgMHg2MCwKKwkgMHgwMSwgMHg2MywgMHhBMywgMHhEMSwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHgzNiwgMHgxRiwgMHgwMCwgMHgxOSwgMHg2MCwKKwkgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwOSwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhGRCwgMHhCNCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyNywgMHgwMiwgMHhCQywgMHhBMiwgMHhEQiwgMHgxOSwgMHg2MCwgMHg0NSwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgxQywgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGQiwgMHhCNCwKKwkgMHg2MCwgMHg0NCwgMHg2NCwgMHg0MCwgMHgwNCwgMHgyNywgMHgwNCwgMHhCQywgMHhBMiwgMHhEQiwgMHgxMiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMiwgMHgyQiwKKwkgMHgwNiwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHg2MCwgMHg0NCwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwKKwkgMHgwNCwgMHgyQiwgMHgwNiwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhCQywgMHg2MCwgMHg0NCwgMHhBMiwgMHhEQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHhGMCwgMHhEQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHgwMywgMHgzNiwgMHgxOCwgMHgwMCwKKwkgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHg2MCwgMHg0NCwgMHhGQiwgMHhCNCwgMHg2MCwgMHg0NCwgMHg2NCwgMHg0MCwKKwkgMHgyMCwgMHgyQSwgMHgwQSwgMHgwMCwgMHg2MCwgMHg0MywgMHgxOSwgMHg2MCwgMHg0NSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwKKwkgMHgwMiwgMHgwMCwgMHg2MywgMHg0NCwgMHgwMiwgMHgwMCwgMHg2MywgMHg0NCwgMHgwNCwgMHhCQywgMHgxOSwgMHg2MCwgMHg3QiwgMHhGQiwgMHgwOSwgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHgyMCwgMHgyNiwgMHgwNiwgMHgwMCwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhCQywgMHg2MCwgMHg0NCwKKwkgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHhCMCwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg1QywgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg4MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHhDOSwgMHhGMSwKKwkgMHgxOSwgMHhGOCwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHgwRSwgMHhGQSwgMHhBNiwgMHhGMSwgMHgwNywgMHhGOCwKKwkgMHg2NywgMHg0NCwgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHhGMSwgMHg2MCwgMHgyQywgMHg2NCwgMHgwOCwgMHg2MCwgMHgzMSwgMHhGQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1QywgMHhGNSwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwKKwkgMHgzMSwgMHhGOCwgMHg3RiwgMHhGMSwgMHgzMiwgMHhGOCwgMHg4MCwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgzNCwgMHhGOCwgMHgxNiwgMHg2MCwKKwkgMHhDMiwgMHhGMSwgMHgwMiwgMHg2NCwgMHg2NCwgMHg0MCwgMHhGRSwgMHgyNiwgMHgxMCwgMHhCQywgMHgzMiwgMHg0MCwgMHgwOCwgMHgyNiwgMHgxMCwgMHhCQywKKwkgMHgyMCwgMHhCQywgMHhGQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NCwgMHhBNCwgMHg4NCwgMHgxQiwgMHg2MCwgMHgwOSwgMHhGQiwgMHgxNiwgMHg2MCwKKwkgMHhDMSwgMHhGMSwgMHgzMywgMHg2MCwgMHhCRSwgMHg2NCwgMHgwMiwgMHgxOCwgMHgyRCwgMHg2MCwgMHgzMiwgMHg2NCwgMHgxQSwgMHg2MCwgMHhBRCwgMHhGQiwKKwkgMHgxQSwgMHg2MCwgMHhCRCwgMHhGQiwgMHgzNCwgMHg2MCwgMHgxOCwgMHg2MSwgMHgxNywgMHg2MCwgMHgxNCwgMHhGMywgMHgzNSwgMHg2MCwgMHgzNiwgMHg2NSwKKwkgMHhGRSwgMHhBNCwgMHhFMCwgMHg4NCwgMHgwNiwgMHgwNSwgMHg2NywgMHg0NCwgMHgxQSwgMHg2MCwgMHhCNSwgMHhGQiwgMHgxQSwgMHg2MCwgMHhDNSwgMHhGQiwKKwkgMHg0QiwgMHgwMCwgMHhFMCwgMHg4NCwgMHhDNCwgMHg4NSwgMHgxQSwgMHg2MCwgMHgxRiwgMHhGMywgMHhBNSwgMHhEMSwgMHhEQSwgMHg4NSwgMHhBMCwgMHg4MywKKwkgMHgxQSwgMHg2MCwgMHgxQiwgMHhGRCwgMHhBNSwgMHhEMSwgMHgzNCwgMHg2MCwgMHgzNCwgMHg2MiwgMHhBMCwgMHg4MywgMHhBMiwgMHhERCwgMHg2NywgMHg0NCwKKwkgMHgxQSwgMHg2MCwgMHhCNSwgMHhGQiwgMHgxQSwgMHg2MCwgMHhDNSwgMHhGQiwgMHgxQSwgMHg2MCwgMHgyQywgMHhGMywgMHhGRiwgMHhGRiwgMHgyMSwgMHgxOCwKKwkgMHgzMywgMHg2MCwgMHhGNCwgMHg2MSwgMHgwRiwgMHg2MCwgMHgwMCwgMHg3QywgMHgwMCwgMHg2MCwgMHhBQywgMHg2NSwgMHhFRiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHgyRCwgMHhGMSwgMHg1OSwgMHhEOSwgMHgzMywgMHg2MCwgMHhGMiwgMHg2NSwgMHhENSwgMHg4NCwKKwkgMHgzMCwgMHg3RiwgMHhBNSwgMHhEQiwgMHg2NSwgMHg0NCwgMHgxQSwgMHg2MCwgMHhCNSwgMHhGQiwgMHgxQSwgMHg2MCwgMHhDNSwgMHhGQiwgMHgxQSwgMHg2MCwKKwkgMHgyQywgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhGRiwgMHg2MCwgMHhGRiwgMHg2NCwKKwkgMHgxMywgMHgwMCwgMHgzNCwgMHg2MCwgMHgxOCwgMHg2MSwgMHg1MCwgMHg2MCwgMHgwMCwgMHg3QywgMHgwMCwgMHg2MCwgMHhGMiwgMHg2NSwgMHhFRiwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHhDMSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQSwgMHg2MCwgMHgxRCwgMHhGMSwgMHg1OSwgMHhEOSwgMHgzNCwgMHg2MCwgMHgxMiwgMHg2NSwKKwkgMHhENSwgMHg4NCwgMHhERCwgMHg3RiwgMHhBNSwgMHhEQiwgMHg2NSwgMHg0NCwgMHgxQSwgMHg2MCwgMHhCMiwgMHhGQiwgMHgxQSwgMHg2MCwgMHhDMiwgMHhGQiwKKwkgMHg3OSwgMHgwMCwgMHgxQSwgMHg2MCwgMHgxRSwgMHhGMywgMHgzNCwgMHg2MCwgMHgzNCwgMHg2MiwgMHhGRCwgMHhBMCwgMHhBMiwgMHhEMywgMHhFRSwgMHgwMywKKwkgMHg2MCwgMHg0MCwgMHgwMiwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMSwgMHg2MywgMHgwQiwgMHgwMCwgMHgwNCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2MywKKwkgMHgwNywgMHgwMCwgMHgxMCwgMHgyQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2MywgMHgwMywgMHgwMCwgMHgyMCwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwNSwgMHg2MywKKwkgMHg2MywgMHg0NywgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgxQSwgMHg2MCwgMHgxRSwgMHhGMywgMHgxQSwgMHg2MCwgMHgxQiwgMHhGMywKKwkgMHhGRSwgMHhBMCwgMHg0MCwgMHg0QywgMHhEMywgMHgwMywgMHgwMCwgMHg2MCwgMHgwMCwgMHg2MywgMHg1OSwgMHhERCwgMHg0MSwgMHg0QSwgMHgyQywgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MywgMHg2MywgMHg0NywgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQywgMHg0MCwKKwkgMHgwMiwgMHgyQSwgMHgwMywgMHgwMCwgMHgwMSwgMHg2MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQywgMHg0MCwgMHgwNCwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHgwMiwgMHg2MywgMHg2MywgMHg0NywgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQywgMHg0MCwgMHgxMCwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHgwNCwgMHg2MywgMHg2MywgMHg0NywgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQywgMHg0MCwgMHgyMCwgMHgyQSwgMHgwNSwgMHgwMCwKKwkgMHgwNSwgMHg2MywgMHg2MywgMHg0NywgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQSwgMHg0NCwgMHg1MSwgMHg5MywgMHhFQiwgMHg4MywKKwkgMHhFQiwgMHg4MywgMHhBMCwgMHhERCwgMHgxQSwgMHg2MCwgMHgxRSwgMHhGMywgMHgxQSwgMHg2MCwgMHgxQywgMHhGMywgMHhGRiwgMHhBMCwgMHg0MCwgMHg0QywKKwkgMHg5RCwgMHgwMywgMHg1OSwgMHhERiwgMHg0MSwgMHg0QSwgMHgyQywgMHg0MCwgMHgwMSwgMHgyQSwgMHgwNSwgMHgwMCwgMHgwMCwgMHg2MywgMHg2MywgMHg0NywKKwkgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQywgMHg0MCwgMHgwMiwgMHgyQSwgMHgwNSwgMHgwMCwgMHgwMSwgMHg2MywgMHg2MywgMHg0NywKKwkgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQywgMHg0MCwgMHgwNCwgMHgyQSwgMHgwNSwgMHgwMCwgMHgwMiwgMHg2MywgMHg2MywgMHg0NywKKwkgMHhCNCwgMHg4MywgMHg1OSwgMHhEOSwgMHg1OSwgMHhERCwgMHgyQSwgMHg0NCwgMHg1MSwgMHg5MywgMHhFQiwgMHg4MywgMHhFQiwgMHg4MywgMHhBMCwgMHhERCwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwQSwgMHhGQiwgMHhGMCwgMHg2MCwgMHg0NCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgxMiwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHg3RCwgMHhGMSwgMHgzNSwgMHg2MCwgMHhDQywgMHg2NCwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHgwMCwgMHg2NywgMHg0NCwgMHgxQSwgMHg2MCwKKwkgMHhBRiwgMHhGQiwgMHgxQSwgMHg2MCwgMHhCRiwgMHhGQiwgMHgxQSwgMHg2MCwgMHhFNywgMHhGOSwgMHgzNSwgMHg2MCwgMHg2MiwgMHg2NSwgMHhGMSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg3NCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwNSwgMHgwMCwKKwkgMHhGRiwgMHg2MCwgMHhGRiwgMHg2MywgMHgxQSwgMHg2MCwgMHhCMywgMHhGRCwgMHgwOCwgMHgwMCwgMHgzNiwgMHg2MCwgMHgwNCwgMHg2MywgMHgxQSwgMHg2MCwKKwkgMHhCMywgMHhGRCwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg4QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1QywgMHhGNSwgMHgwMCwgMHhGNCwgMHg3RSwgMHhGMSwKKwkgMHgwNiwgMHhGOCwgMHgxQiwgMHg2MCwgMHgwOSwgMHhGMywgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMSwgMHhGQiwgMHg2MCwgMHhGRiwgMHg2NSwgMHg2MCwgMHg0NCwKKwkgMHhBNCwgMHg4NCwgMHg2MCwgMHg0NywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgwNCwgMHhCQywgMHg2MCwgMHg0NywgMHgwNywgMHhGQSwgMHgzNSwgMHg2MCwKKwkgMHg1QSwgMHg2NCwgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1QywgMHhGNSwgMHgzRiwgMHhGQywgMHhEQiwgMHhGRSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhEQiwgMHhGMywgMHg5QiwgMHhGRSwgMHhGRCwgMHhBMCwgMHgyNSwgMHgwNCwgMHgyNCwgMHgwMiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwKKwkgMHgwMCwgMHhGNCwgMHgwOSwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHgwMCwgMHgzQSwgMHgxQywgMHgwMCwgMHg2MCwgMHg0MywgMHgwMCwgMHgzNiwKKwkgMHgxQywgMHgwMCwgMHhFMCwgMHhBMCwgMHhEQSwgMHg4NSwgMHgxNiwgMHgwNywgMHgzMywgMHg2MCwgMHhCRSwgMHg2MSwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHhEMywgMHg4MCwgMHhDQiwgMHg4MywgMHgwRiwgMHgwMiwgMHgwNywgMHgwRSwgMHg1OSwgMHhEMywgMHhBNSwgMHhEMCwgMHhEQSwgMHg4NSwgMHhEMCwgMHg4MCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMiwgMHhGOSwgMHgxRiwgMHgxMiwgMHgxRSwgMHhBNSwgMHhEMCwgMHg1OSwgMHhEMywgMHhGRiwgMHhGRiwgMHg5MCwgMHg4MCwKKwkgMHhGRiwgMHgyMiwgMHgwQywgMHgwMCwgMHhGMSwgMHg2MCwgMHgyQSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxNiwgMHg2MCwgMHhDMSwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHg2MCwgMHg0MCwgMHgwMSwgMHgyQSwgMHgwMywgMHgwMCwgMHgyRCwgMHg2MCwgMHgzMiwgMHg2NCwgMHgwMiwgMHgwMCwgMHgzMywgMHg2MCwgMHhCRSwgMHg2NCwKKwkgMHgxQSwgMHg2MCwgMHhCRCwgMHhGQiwgMHgyNiwgMHg0NiwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwKKwkgMHgyRSwgMHhGQSwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHg3RiwgMHhGMSwKKwkgMHgzMiwgMHhGOCwgMHg4MCwgMHhGMSwgMHgzMywgMHhGOCwgMHg4MSwgMHhGMSwgMHgzNCwgMHhGOCwgMHgwMCwgMHg2NSwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwKKwkgMHhERCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MSwgMHg0NCwgMHgxOSwgMHg2MCwgMHgzRiwgMHhGQiwgMHg1MCwgMHg2MywgMHgyQSwgMHhGQywgMHhDOSwgMHhGMywKKwkgMHgxOSwgMHhGQSwgMHgwMCwgMHg2NCwgMHgzRSwgMHhGQSwgMHhBNiwgMHhGMywgMHgwNywgMHhGQSwgMHgwMCwgMHhGNCwgMHg3RSwgMHhGMSwgMHgwNiwgMHhGOCwKKwkgMHgxQiwgMHg2MCwgMHgwOSwgMHhGMywgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMSwgMHhGQiwgMHg2MCwgMHhGRiwgMHhCNywgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwKKwkgMHgwNCwgMHhCQywgMHg2MCwgMHg0NywgMHgwNywgMHhGQSwgMHgzNSwgMHg2MCwgMHg4MiwgMHg2NSwgMHhGMSwgMHg2MCwgMHg1OCwgMHg0RCwgMHg3NCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMywgMHgzNiwgMHg2MCwgMHgwNCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywgMHg2NywgMHg0MywgMHgxQSwgMHg2MCwKKwkgMHhDMywgMHhGRCwgMHgzNSwgMHg2MCwgMHg3QSwgMHg2NCwgMHg0MCwgMHg0OCwgMHgxMCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgzRiwgMHhGQywgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwKKwkgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgwOSwgMHhGQiwgMHg1QSwgMHhEQiwKKwkgMHgwMCwgMHg2NCwgMHg5MiwgMHhGQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQiwgMHg2MCwgMHgwQSwgMHhGQiwgMHhDRCwgMHg4MSwgMHgyOCwgMHhEMywKKwkgMHg1QSwgMHg4OCwgMHhEQywgMHg4MywgMHgzMSwgMHgxOCwgMHhGQiwgMHgwMywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwNiwgMHgwMCwgMHgxQiwgMHg2MCwKKwkgMHgwQSwgMHhGMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhBMywgMHhEMSwgMHg1RCwgMHhEOCwKKwkgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwOCwgMHgwMCwgMHgyMCwgMHhGRSwgMHgxQiwgMHg2MCwgMHgwQSwgMHhGMywgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwKKwkgMHhBMiwgMHhEQiwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhCRiwgMHhEMywgMHg1RCwgMHhEQSwgMHhGRiwgMHhCNCwgMHgwMCwgMHg3RiwgMHgxMiwgMHgwMywKKwkgMHhERiwgMHg4MywgMHg2MSwgMHg0MCwgMHg3RiwgMHgzQSwgMHgwQSwgMHgwMCwgMHgyMCwgMHhGRSwgMHg2MCwgMHg0NSwgMHgxQiwgMHg2MCwgMHgwQSwgMHhGMywKKwkgMHgwMywgMHg2MSwgMHg3QywgMHhBNCwgMHhBMiwgMHhEQiwgMHg2NSwgMHg0NCwgMHgwMCwgMHhGNCwgMHg2MCwgMHhGRSwgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwKKwkgMHg1RCwgMHhEOCwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGRSwgMHhDQiwgMHgwMSwgMHgxQiwgMHg2MCwgMHgwQSwgMHhGMSwgMHhGRCwgMHhBMSwgMHhGRiwgMHhCMSwKKwkgMHhDMSwgMHg4MywgMHhBMiwgMHhERCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2NywgMHg1QywgMHgxQywgMHg2MCwgMHhFNiwgMHg2MSwgMHhBMSwgMHhEMywKKwkgMHhBNSwgMHhEOSwgMHgxMCwgMHgxOCwgMHg2MCwgMHg0MywgMHgzNSwgMHg2MCwgMHhENCwgMHg2NCwgMHhBNSwgMHhEQiwgMHg2MCwgMHhGRSwgMHhBMCwgMHhERCwKKwkgMHgyMCwgMHhGRSwgMHhEQywgMHg4NCwgMHhDRiwgMHg4MywgMHhFMywgMHg4MywgMHg1OSwgMHhEMSwgMHhEQywgMHg4NCwgMHg2MCwgMHhGRSwgMHhBMCwgMHhEOSwKKwkgMHgyMCwgMHhGRSwgMHhGQSwgMHgxRiwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3QiwgMHhGMywgMHgzNiwgMHg2MCwgMHgwNiwgMHg2MiwKKwkgMHgwNywgMHhCNCwgMHg2MCwgMHhGRSwgMHhBMiwgMHhEQiwgMHgyMCwgMHhGRSwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwKKwkgMHg0MCwgMHgyNiwgMHgyNywgMHgwMCwgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxRiwgMHgwMywgMHhGMiwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHgwMCwgMHg2MCwgMHg0OCwgMHg2MSwgMHgyOCwgMHg0NCwKKwkgMHg1OSwgMHhEQSwgMHgwMywgMHg2NCwgMHgzOCwgMHg0MywgMHhCRCwgMHhEMSwgMHhDQywgMHg4NCwgMHg1OSwgMHhEOCwgMHhGQywgMHgwMiwgMHgzOSwgMHg0NCwKKwkgMHg1OSwgMHhEQSwgMHgxNiwgMHg2MCwgMHhDMywgMHhGMywgMHg1OSwgMHhEQSwgMHgwNywgMHg2NCwgMHgyMywgMHhGQSwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwKKwkgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg1NywgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxQiwgMHgwMCwgMHg0NSwgMHg0OCwKKwkgMHgwMCwgMHg2MCwgMHgwNiwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwMiwgMHg2NCwKKwkgMHgyMywgMHhGQSwgMHhGMiwgMHg2MCwgMHgwMCwgMHg2NCwgMHg1QSwgMHhEQSwgMHgyOCwgMHg0NCwgMHg1QSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyNiwgMHg2MCwKKwkgMHgwQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEQywgMHg4NCwgMHhEQywgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwMywgMHgwMywgMHhBMiwgMHhEQiwgMHgwOCwgMHgyNCwgMHhDNiwgMHhGRSwgMHhERCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhCNSwgMHhGMSwKKwkgMHhBMCwgMHhEMywgMHhGRiwgMHhGRiwgMHhEOCwgMHg4MCwgMHhDNCwgMHg4NCwgMHgwQywgMHgwMywgMHgwOCwgMHgwNSwgMHhEQywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNSwgMHgwMywgMHhBMiwgMHhEQiwgMHgwMiwgMHgyNCwgMHhDNiwgMHhGRSwgMHhERCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGRSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERCwgMHg5OCwgMHhGRiwgMHhGRiwgMHhBMiwgMHhGRiwgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgzQywgMHgwMCwgMHg5QiwgMHhGMywKKwkgMHg2NywgMHg0MywgMHhEQywgMHg4NCwgMHhDQywgMHg4NCwgMHgzNywgMHgwMywgMHg2MCwgMHg0NiwgMHgwQSwgMHgwMiwgMHg5QiwgMHhGRCwgMHgwMCwgMHg2MCwKKwkgMHg0NiwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwgMHg5QiwgMHhGQiwgMHgyQywgMHgwMywKKwkgMHg0NiwgMHg0QiwgMHgyQywgMHg2MCwgMHhDQSwgMHg2MSwgMHgxOCwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMCwgMHg2NCwgMHgyNCwgMHhGQSwKKwkgMHg0QSwgMHg2NSwgMHhBMiwgMHhGRiwgMHgyQywgMHg2MywgMHg1OSwgMHhEMSwgMHhBMiwgMHhERiwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwgMHg4MCwgMHgzQSwKKwkgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGNywgMHgxRiwgMHgxMiwgMHg2MywgMHg1OSwgMHhEMSwgMHhBNSwgMHhEOCwgMHhEQSwgMHg4NSwKKwkgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHhGOCwgMHgxRiwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHgyQiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwKKwkgMHhBNiwgMHhGRSwgMHgwMCwgMHg2NCwgMHg5QiwgMHhGQiwgMHhBMywgMHhGRiwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBNiwgMHhGRSwKKwkgMHhCQSwgMHgwNSwgMHhBNywgMHhGRSwgMHgxMSwgMHgwNSwgMHhBNSwgMHhGRSwgMHgwMywgMHgwNCwgMHhGMiwgMHg2MCwgMHhEOCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhBNCwgMHhGRSwgMHhGMiwgMHgwNCwgMHgwOCwgMHg2MCwgMHgwRiwgMHhGMSwgMHgwMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgzNiwgMHg0NSwgMHgyMCwgMHg2MCwgMHhBOCwgMHg2NCwgMHg0NCwgMHhENywKKwkgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5RCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHgwMCwgMHg2NCwgMHgyRiwgMHgwMywgMHg5RCwgMHhGQiwKKwkgMHgzMSwgMHg0NCwgMHhFOCwgMHhCNCwgMHg0MCwgMHg1MSwgMHg2QSwgMHg0NCwgMHhGRiwgMHhGRiwgMHg4MCwgMHgyNiwgMHhGQywgMHgwMSwgMHg2MSwgMHhGRiwKKwkgMHg2MiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgzMCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgyMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHg0MCwgMHg2MCwgMHg1OCwgMHg0RSwgMHg3RCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxRiwgMHg2MCwgMHhDNCwgMHg2NCwgMHgwRiwgMHg2MCwgMHhFMSwgMHhGQiwKKwkgMHg0QSwgMHhERiwgMHgwMSwgMHg2MCwgMHhGRSwgMHg2MywgMHgxRCwgMHg2MCwgMHhCRSwgMHg2MSwgMHgwMCwgMHg2NCwgMHg1OSwgMHhEQiwgMHhGRSwgMHgxRiwKKwkgMHgwRSwgMHg2MCwgMHhERCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwNCwgMHhCMCwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMywgMHgwMiwgMHg2NSwgMHhGMSwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMiwgMHg2MCwgMHhEOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgzNywgMHgwMCwgMHgyRCwgMHg2MCwgMHhBQSwgMHg2MywgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHhCRCwgMHhEMSwgMHhCMCwgMHg4NCwgMHhCMCwgMHg4NCwKKwkgMHhGRiwgMHhGRiwgMHgwNywgMHgwMiwgMHg4QSwgMHhGQiwgMHgzMSwgMHg0NCwgMHhGRSwgMHhCNCwgMHg0MCwgMHg1MSwgMHgwRCwgMHg2NCwgMHgwNSwgMHhGQiwKKwkgMHgyNywgMHgwMCwgMHgyOCwgMHhGMywgMHg5RCwgMHhGMSwgMHg2MCwgMHg0NywgMHg2NCwgMHg0MSwgMHgwNywgMHhCMSwgMHgwNywgMHhCNCwgMHg1MCwgMHhGQiwKKwkgMHgwMSwgMHg2MSwgMHgwMywgMHgwMywgMHhDQywgMHg4NCwgMHhFMSwgMHg4MSwgMHhGRCwgMHgwMiwgMHhBMSwgMHg4MCwgMHhCMSwgMHg4MywgMHgxOCwgMHgwMiwKKwkgMHg5RCwgMHhGRCwgMHgxNiwgMHg2MCwgMHhDRiwgMHhGMywgMHhFNCwgMHhGQiwgMHg3RCwgMHhGQiwgMHgxMywgMHg2MCwgMHgwMiwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHg0NiwgMHg1RSwgMHgzMSwgMHg0NCwgMHgwMSwgMHhCQywgMHg0MCwgMHg1MSwgMHhFRCwgMHhFMiwgMHgwRiwgMHg0RSwKKwkgMHgxRCwgMHg2MCwgMHg1OCwgMHg0RiwgMHg5RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwRSwgMHg0RiwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHhENywgMHhGRSwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGMiwgMHg2MCwgMHhFNCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzQiwgMHhGQiwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgyNywgMHhGQiwgMHg1QSwgMHhEQiwKKwkgMHgxMCwgMHg2MCwgMHg0RSwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgyOCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHhCMCwgMHhGRiwgMHhGRiwgMHgxRCwgMHgwMywgMHgyMCwgMHg0MCwgMHgwNiwgMHgyMywgMHgxMCwgMHgwMCwgMHgwOCwgMHg2MCwKKwkgMHgyNywgMHhGMSwgMHg3RiwgMHg2MCwgMHhGRiwgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg4MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgyOCwgMHhGQiwgMHhGMiwgMHg2MCwgMHhGNCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxRCwgMHg2MCwKKwkgMHhBOSwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgyNywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhDNiwgMHgwMSwgMHgwOCwgMHg2MCwgMHgyNywgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhEQiwgMHhGMywgMHgwMSwgMHg2MywgMHhGRCwgMHhBMCwgMHgwOCwgMHg2MCwgMHg3NywgMHhGRCwgMHgwNywgMHgwMiwgMHgwOCwgMHg2MCwKKwkgMHgzMCwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhCMSwgMHgwMSwgMHgwRSwgMHg1NywKKwkgMHgzMiwgMHg0MCwgMHg0MCwgMHgyNiwgMHgxQiwgMHgwMCwgMHg0NSwgMHg0OCwgMHgwMCwgMHg2MCwgMHgwNiwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgyMiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMywgMHgwMiwgMHg2NCwgMHgyMywgMHhGQSwgMHhGMiwgMHg2MCwgMHgwNCwgMHg2NCwgMHg1QSwgMHhEQSwKKwkgMHgyOCwgMHg0NCwgMHg1QSwgMHhEQSwgMHhGRiwgMHhGRiwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwKKwkgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgzNywgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxNSwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg4OCwgMHgwMSwKKwkgMHgxMiwgMHg2MCwgMHhGNiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBOCwgMHg2MCwgMHg0NiwgMHgwRSwgMHhGMiwgMHg0QiwgMHgwMywgMHg2MCwgMHg0MCwKKwkgMHhGMCwgMHgzNywgMHgzOCwgMHgwMCwgMHhGRiwgMHgzNywgMHgyRCwgMHgwMCwgMHhGRCwgMHgzNywgMHgyNSwgMHgwMCwgMHhGOCwgMHgzNywgMHgwQSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhGRiwgMHhCNSwgMHgxMCwgMHg2MCwgMHgxMiwgMHg2MiwgMHg0NiwgMHhEMSwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHhCMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgwMCwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhEQywgMHgwMSwgMHgwNiwgMHhCNCwgMHhGRCwgMHg3RiwgMHgwRSwgMHhGQSwgMHgyNSwgMHg2MCwKKwkgMHhGMiwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgyQiwgMHhGRiwgMHhGOSwgMHhGRSwgMHhDRCwgMHgwMSwgMHgyMywgMHhGMCwgMHg2MCwgMHg0MCwgMHgwNCwgMHgyNiwgMHhFRCwgMHgxQiwgMHgwMiwgMHgyNiwKKwkgMHhFQiwgMHgxOCwgMHhBMiwgMHhGRiwgMHgwMiwgMHhGMCwgMHgwOSwgMHg2MCwgMHgwOCwgMHg2NCwgMHhEMCwgMHg4MCwgMHhBRCwgMHhGMywgMHgwMiwgMHgwMiwKKwkgMHhDQywgMHg4NCwgMHhBRCwgMHhGQiwgMHgyNiwgMHg2MCwgMHgxQSwgMHg2NCwgMHg0MCwgMHg0QiwgMHgzNCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgwOCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhCNiwgMHgwMSwgMHhBQywgMHhGRSwgMHgwOSwgMHgwNSwgMHhBRCwgMHhGRSwgMHgwRiwgMHgwNSwgMHhBRSwgMHhGRSwgMHhCMCwgMHgwNSwKKwkgMHhBRiwgMHhGRSwgMHgzNywgMHgwNSwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHgyMCwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHhGNSwgMHgwMSwgMHgxMCwgMHg2MCwgMHg3QSwgMHg2NSwgMHgwRCwgMHg2MSwKKwkgMHgwNywgMHgwMCwgMHhBMiwgMHhERCwgMHg1OCwgMHg0RiwgMHg2NCwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMCwgMHhCOSwgMHhGRiwgMHhGRiwgMHgwOCwgMHgwMywKKwkgMHgwMCwgMHg2MywgMHhBNSwgMHhEMSwgMHg1QSwgMHhEMywgMHhEQSwgMHg4NSwgMHgwMCwgMHhBOCwgMHhDRCwgMHg4MSwgMHhGMiwgMHgwMiwgMHhGOCwgMHgwMiwKKwkgMHhFMSwgMHgwMSwgMHgxMCwgMHg2MCwgMHgwRSwgMHg2MiwgMHgxMCwgMHg2MCwgMHg1OCwgMHg2NSwgMHhGMywgMHg2MCwgMHhENywgMHg2MywgMHg1QSwgMHhERiwKKwkgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMywgMHg1QSwgMHhERiwgMHg1QSwgMHhERiwgMHg1QSwgMHhERCwgMHhGOSwgMHgwMSwgMHgxMCwgMHg2MCwKKwkgMHg3OCwgMHg2NSwgMHg1QSwgMHhERiwgMHhENiwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHg1QSwgMHhERCwgMHhGQiwgMHgwMSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgxMiwgMHg2NCwgMHg0MCwgMHg0MSwgMHgxMCwgMHg2MCwgMHgxMCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwKKwkgMHhEMCwgMHg4MCwgMHgwQywgMHg2MSwgMHgwOCwgMHgwMywgMHhCRCwgMHhEQiwgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhDRCwgMHg4MSwKKwkgMHhBMywgMHhEQiwgMHgwNiwgMHhBMywgMHhGOSwgMHgwMiwgMHgxMCwgMHg2MCwgMHg2MCwgMHg2MywgMHhBMywgMHhEMSwgMHgwMCwgMHg2NCwgMHhEMCwgMHg4MCwKKwkgMHgwRCwgMHg2MSwgMHgxOSwgMHgwMywgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwgMHhGRSwgMHhBMywgMHgwMiwgMHhBMywgMHhDRCwgMHg4MSwgMHhFOCwgMHg4NCwKKwkgMHhFMywgMHgwMywgMHgwMiwgMHgwNSwgMHhFMSwgMHgwMywgMHhGOSwgMHgwMSwgMHg5NywgMHhGQiwgMHg5OSwgMHhGRCwgMHg2MSwgMHg1QywgMHhBMywgMHhEMywKKwkgMHg5OCwgMHhGOSwgMHgwMywgMHgxOCwgMHg1OCwgMHg0RiwgMHg2MCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg5OSwgMHhGMywgMHg5OCwgMHhGMSwgMHg2MCwgMHg0MywKKwkgMHg5NywgMHhGMywgMHg2NCwgMHg0MSwgMHhFQSwgMHgwMSwgMHgyMSwgMHg0MywgMHgxMCwgMHg2MCwgMHg1QSwgMHg2NSwgMHhENywgMHg4MCwgMHhCRCwgMHhEMSwKKwkgMHhCRCwgMHhEMywgMHgwMywgMHgwMiwgMHhDQSwgMHg2MCwgMHhENCwgMHg3OCwgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHhCRCwgMHhEMSwgMHg0MywgMHg0MSwKKwkgMHhGNSwgMHgwMywgMHhGMywgMHg2MCwgMHhEQywgMHg2NCwgMHg2NCwgMHg1OCwgMHg0MCwgMHg0RiwgMHgyQSwgMHhGMCwgMHg4MywgMHg2MCwgMHhGRiwgMHg2NSwKKwkgMHg2NCwgMHg0NywgMHgwMywgMHgyQiwgMHgwMSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMywgMHgyNiwgMHgwMywgMHhBQywgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwKKwkgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwgMHgyRSwgMHhGQSwgMHg2NCwgMHg0MSwKKwkgMHhFQSwgMHhGMywgMHgyRiwgMHhGQSwgMHg2MCwgMHg0MywgMHhFQiwgMHhGMywgMHgzMCwgMHhGQSwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwgMHgxOSwgMHgwMCwKKwkgMHg2MCwgMHg0NywgMHhBNCwgMHg4NCwgMHgyQSwgMHhGQSwgMHgyRiwgMHhGMiwgMHgyQywgMHhGQSwgMHgzMCwgMHhGMiwgMHgyRCwgMHhGQSwgMHgzMSwgMHhGMiwKKwkgMHgyRSwgMHhGQSwgMHgzNiwgMHhGMiwgMHgzMiwgMHhGQSwgMHgzNywgMHhGMiwgMHgzMywgMHhGQSwgMHgzOCwgMHhGMiwgMHgzNCwgMHhGQSwgMHhFQSwgMHhGMywKKwkgMHgyRiwgMHhGQSwgMHgzNiwgMHhGQSwgMHhFQiwgMHhGMywgMHgzMCwgMHhGQSwgMHgzNywgMHhGQSwgMHhFQywgMHhGMywgMHgzMSwgMHhGQSwgMHgzOCwgMHhGQSwKKwkgMHg2NCwgMHg0MSwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQiwKKwkgMHgxNywgMHgwMCwgMHg4MSwgMHg2NywgMHhBMiwgMHhEQSwgMHhGNCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhDRiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwKKwkgMHgzRiwgMHhGQywgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDMSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgyNiwgMHg0NiwgMHgzRiwgMHhGMCwgMHg0MiwgMHg2NCwgMHhEMCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgzRiwgMHhGQSwgMHgwNywgMHhGMiwKKwkgMHhBNiwgMHhGMSwgMHgwMSwgMHgxQiwgMHgwNywgMHhGOCwgMHgxQywgMHhGMiwgMHgxMywgMHhGQSwgMHgyNiwgMHhGMiwgMHgyNywgMHhGMCwgMHg2MCwgMHg0NywKKwkgMHgwMCwgMHhGNCwgMHgxRiwgMHhGQSwgMHg2NCwgMHg0NywgMHgyMCwgMHhGQSwgMHg2MSwgMHg0NCwgMHgyMSwgMHhGQSwgMHgwMSwgMHg2NywgMHgwRCwgMHhGQSwKKwkgMHgxMCwgMHg2MSwgMHgyRCwgMHg2MCwgMHg1RSwgMHg2NCwgMHgxRSwgMHg2MywgMHg1OCwgMHhEMSwgMHhDRCwgMHg4MSwgMHhCRCwgMHhEOCwgMHhGQywgMHgwMiwKKwkgMHhCOCwgMHhGMSwgMHhENiwgMHhGMSwgMHg2NCwgMHg1RSwgMHg2NCwgMHg1RiwgMHg0NCwgMHg2MywgMHhCRCwgMHhEQSwgMHgxNiwgMHg2MCwgMHhBQywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHg0QSwgMHhEMywgMHg2MCwgMHg0NSwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwKKwkgMHgwMywgMHg2NCwgMHgwMiwgMHgzNiwgMHgwMSwgMHg2NCwgMHhCNCwgMHg4NCwgMHgwNiwgMHhBMiwgMHhBMiwgMHhEMSwgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywKKwkgMHhCRCwgMHhEQSwgMHhEMywgMHhGMywgMHhENCwgMHhGMSwgMHg2MCwgMHg0NywgMHhCRCwgMHhEQSwgMHg2NCwgMHg0NywgMHhFMiwgMHhGMSwgMHhCRCwgMHhEQSwKKwkgMHg2NCwgMHg0NCwgMHhCRCwgMHhEQSwgMHgyNiwgMHg0NiwgMHgwMCwgMHg2NCwgMHgyMywgMHhGMCwgMHgzQiwgMHhGMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyQSwKKwkgMHgwNiwgMHgwMCwgMHhDMCwgMHg2NywgMHhBMCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHgxMCwgMHhCQywgMHgzRSwgMHhGQSwKKwkgMHgyNSwgMHg2MCwgMHhEQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhDOCwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCMSwgMHhGMywKKwkgMHgxRiwgMHhGQSwgMHgzMiwgMHg0NywgMHgwNywgMHhGQSwgMHgyNCwgMHg3RSwgMHgwMSwgMHg3RiwgMHgwOCwgMHhGQSwgMHhENiwgMHhGMSwgMHgwOSwgMHhGOCwKKwkgMHgwMSwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwQSwgMHhGQSwgMHgwMSwgMHg2NCwgMHgwQiwgMHhGQSwgMHgxOCwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwKKwkgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwQSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHg1MiwgMHg2MywgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgwMCwgMHg2MCwgMHgyQSwgMHg2MSwgMHhCNiwgMHg2MCwgMHg1OCwgMHg0RCwgMHgyNSwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NiwgMHg0NCwKKwkgMHg1RCwgMHhGQiwgMHgwNCwgMHg2NCwgMHgwMywgMHhGQSwgMHg2NywgMHg0NCwgMHgyQywgMHhGQSwgMHgyRCwgMHhGQSwgMHgyRSwgMHhGQSwgMHgzMiwgMHhGQSwKKwkgMHgzMywgMHhGQSwgMHgzNCwgMHhGQSwgMHgxMiwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBNiwgMHhGMSwgMHgwRSwgMHhGQSwgMHgwNywgMHhGOCwgMHgwMCwgMHg2NCwKKwkgMHgzRSwgMHhGQSwgMHgwRSwgMHg2MCwgMHgzRCwgMHhGQiwgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwgMHg4MCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwNCwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGOCwgMHg2MCwgMHhDRiwgMHg2NCwgMHgwOCwgMHg2MCwgMHgzRiwgMHhGQiwgMHgwMCwgMHg2NCwKKwkgMHgwRSwgMHg2MCwgMHg0MywgMHhGQiwgMHgwNiwgMHhBMiwgMHgxMCwgMHg2MCwgMHg4NCwgMHg2NCwgMHhBMiwgMHhEQiwgMHgwOCwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHgwNiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGOCwgMHg2MCwgMHhEOCwgMHg2NCwgMHgwOCwgMHg2MCwgMHg0MSwgMHhGQiwgMHhGOCwgMHg2MCwgMHhCNCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgzNCwgMHhGQiwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNSwgMHg2MCwgMHgzMSwgMHg2NCwKKwkgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhGNywgMHg2MCwgMHg2QywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHhFQSwgMHhGMSwgMHgyRiwgMHhGOCwgMHhFQiwgMHhGMSwgMHgzMCwgMHhGOCwgMHhFQywgMHhGMSwgMHgzMSwgMHhGOCwKKwkgMHhDOSwgMHhGMSwgMHgxOSwgMHhGOCwgMHgwMCwgMHg2MywgMHg4OCwgMHhGRCwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MywgMHg4NiwgMHhGRCwgMHg4NywgMHhGRCwKKwkgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgwMCwgMHgwMCwgMHg1RCwgMHhGNSwgMHg0MCwgMHg2NCwgMHgyQSwgMHhGQSwgMHg3RCwgMHhGMywgMHg3QywgMHhGQiwKKwkgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgxMCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwMywgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgwMywgMHgwMCwgMHhGNiwgMHg2MCwgMHhDNiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHgzRCwgMHhGMywgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHgzRiwgMHhGQiwgMHgxOSwgMHg2MCwgMHgzOSwgMHhGMywgMHgzRiwgMHg0MCwKKwkgMHgwMSwgMHgyNywgMHgwOCwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwRiwgMHhCNCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwKKwkgMHgzNSwgMHg2MCwgMHg3MCwgMHg2NCwgMHgwMCwgMHhGNCwgMHg0MCwgMHg0OCwgMHgyRiwgMHg2MCwgMHgyNCwgMHg2NCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywKKwkgMHgwMiwgMHgwMCwgMHgyRiwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhEQiwgMHgwNCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHgzRiwgMHhGQywgMHgwMSwgMHg2NCwgMHg1NCwgMHhGMSwgMHgxMCwgMHg2MCwKKwkgMHgxMiwgMHhGQiwgMHg3RCwgMHhGQiwgMHhBNCwgMHhEMywgMHgwNCwgMHg2NSwgMHg1MywgMHhGMywgMHgwMSwgMHgxOCwgMHgwQywgMHg2NSwgMHhGMywgMHhCNCwKKwkgMHhCNCwgMHg4NCwgMHg1MywgMHhGQiwgMHgwRCwgMHgwMCwgMHhGNywgMHg2MCwgMHg2QywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MywgMHhGMSwgMHg3RCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhGMywgMHhBMCwgMHgwNCwgMHhBNCwgMHgwMSwgMHgwNCwgMHhGMSwgMHhBNCwgMHgxMCwgMHgzNiwgMHhGNCwgMHgwMSwgMHg3RCwgMHhGQiwKKwkgMHgyMCwgMHg0MCwgMHgxMCwgMHgyQiwgMHgxMCwgMHgwMCwgMHg3RCwgMHhGMywgMHgzMiwgMHg2MCwgMHg4MCwgMHg2MSwgMHhBMSwgMHhEMSwgMHhDQywgMHg4NCwKKwkgMHgwMSwgMHg2MSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhFMSwgMHg4MSwgMHhDQywgMHg4NCwgMHhGQiwgMHgwMSwgMHhBMSwgMHg4NCwgMHg1MywgMHhGMSwKKwkgMHhFNiwgMHgwMywgMHgxMCwgMHg2MCwgMHgxMiwgMHhGQiwgMHg3RCwgMHhGMywgMHgxMCwgMHg2MCwgMHhGMiwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwMywgMHgwNiwgMHhBMSwgMHhGQiwgMHgwMSwgMHhBMSwgMHhEMywgMHg1MywgMHhGMSwgMHgwMSwgMHhCMCwgMHgwMiwgMHhCMCwgMHhENywgMHgwMywKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNiwgMHgwNSwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywgMHgwMiwgMHgwMCwgMHhEMCwgMHgwMywgMHgwMCwgMHgwMCwKKwkgMHg5RCwgMHhGRSwgMHgzRCwgMHgwNSwgMHhCQSwgMHhGRSwgMHgxMCwgMHg2MCwgMHgyNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwKKwkgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNSwgMHg2MCwgMHhDQiwgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg3RCwgMHhGMSwKKwkgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwOCwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNSwgMHg2MCwgMHhGMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgxQiwgMHg2MCwgMHhGMywgMHhGMSwgMHhBRCwgMHg0RiwgMHgwMCwgMHg3RiwgMHhGQSwgMHhCNCwgMHg2NCwgMHg0MSwgMHg3RCwgMHhGMSwgMHgwMiwgMHhCMSwKKwkgMHgwNCwgMHg2NSwgMHgwMiwgMHgwMiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgyQiwgMHgwMSwgMHg2NSwgMHhCNCwgMHg4NCwgMHhBMCwgMHg1RCwgMHgxMCwgMHg2MCwKKwkgMHgyNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxMywgMHhGQiwgMHhGNSwgMHg2MCwgMHhDOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3RCwgMHhGMSwKKwkgMHgxMywgMHg2MCwgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNiwgMHg2MCwgMHgyOCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHhCRSwgMHhGRSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgxMCwgMHg2MCwgMHgyNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg1RCwgMHhGNSwgMHgyNSwgMHg2MCwgMHhDRSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgwRCwgMHhGQiwgMHg2NiwgMHg0NCwgMHg1QSwgMHhEQiwgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHgwMCwgMHg2NCwKKwkgMHg1MSwgMHhGQiwgMHgwMCwgMHg2MCwgMHgwMSwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNiwgMHg2MCwgMHg0QywgMHg2NCwgMHg1QSwgMHhEQiwKKwkgMHhDRiwgMHhGRSwgMHhDMSwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHgyNCwgMHg2MiwgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwKKwkgMHhDMywgMHhGMSwgMHgwRSwgMHg2MCwgMHgzRiwgMHhGOSwgMHgxQywgMHg2MCwgMHg3QSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhDNCwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0NSwgMHhGOSwgMHgyNiwgMHg2MCwgMHg0MiwgMHg2MiwKKwkgMHhBMiwgMHhEMywgMHhGRiwgMHhGRiwgMHhGRCwgMHgxQiwgMHgxQywgMHg2MCwgMHg4NiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwKKwkgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNiwgMHg2MCwKKwkgMHg3NSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg1MSwgMHhGMSwgMHgxMCwgMHg2MCwgMHgyNCwgMHg2MiwKKwkgMHgwMCwgMHg2NCwgMHhBMiwgMHhEQiwgMHg2NCwgMHg0MCwgMHhGRiwgMHgyNiwgMHgwQiwgMHgwMCwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwKKwkgMHhGRiwgMHhGRiwgMHgwMywgMHgwMywgMHhGNywgMHg2MCwgMHg2NSwgMHg3OCwgMHhGRiwgMHhGRiwgMHhGNSwgMHg2MCwgMHg5NiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMiwgMHgwQSwgMHgwMCwgMHg2NCwgMHg1MSwgMHhGQiwgMHhDNSwgMHhGMSwgMHgwRSwgMHg2MCwgMHg0NSwgMHhGOSwgMHgwMCwgMHg2MCwgMHgwQywgMHg2NCwKKwkgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNiwgMHg2MCwgMHhBMCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgxQywgMHg2MCwgMHg4NiwgMHg2NCwKKwkgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhBMCwgMHg4MCwgMHg5QywgMHg4NCwgMHgwQiwgMHgwMywgMHhBMCwgMHg4NCwKKwkgMHhBMiwgMHhEQiwgMHgxQywgMHg2MCwgMHg4NiwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwKKwkgMHgwNCwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRiwgMHg2MCwgMHhGNywgMHg2NCwgMHhBMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHg1MSwgMHhGMywgMHhERSwgMHgwQSwKKwkgMHgwMCwgMHhBMCwgMHgwMCwgMHg2NCwgMHgwMiwgMHgwMywgMHg1MSwgMHhGQiwgMHhEOSwgMHgwMSwgMHgxQywgMHg2MCwgMHg3QSwgMHg2NCwgMHgxMywgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHhCNywgMHgwMSwgMHgxOSwgMHg2MCwgMHgzRSwgMHhGMywKKwkgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHgzRiwgMHhGQiwgMHgxOSwgMHg2MCwgMHgzQSwgMHhGMywKKwkgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwKKwkgMHgzNSwgMHg2MCwgMHg3MCwgMHg2NCwgMHgwMCwgMHhGNCwgMHg0MCwgMHg0OCwgMHgyRiwgMHg2MCwgMHgyNCwgMHg2NCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywKKwkgMHgwMiwgMHgwMCwgMHgyRiwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyOCwgMHhEQiwgMHgwNCwgMHg2MSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhGMSwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhGNSwgMHgzRiwgMHhGQywgMHg1MywgMHhGMywgMHgyMCwgMHg0MCwgMHgxMCwgMHgyMywKKwkgMHgwMiwgMHgwMCwgMHgyMCwgMHhCQywgMHgwNCwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgyMiwgMHg0MCwgMHhCQywgMHgwNCwgMHhCQywgMHg4MCwgMHhCQywKKwkgMHg1MywgMHhGQiwgMHgxMSwgMHg2MCwgMHg2MiwgMHg2NCwgMHgwOCwgMHg2MCwgMHg2QywgMHhGQiwgMHgwNiwgMHg2NCwgMHgwOCwgMHg2MCwgMHg3MywgMHhGQiwKKwkgMHgxOSwgMHg2MCwgMHg0MywgMHhGMywgMHhGRiwgMHhGRiwgMHgwNywgMHhCNCwgMHhBMiwgMHhEQiwgMHg1MywgMHhGMywgMHgwOCwgMHg2MCwgMHg2QywgMHhGMSwKKwkgMHg2MCwgMHg0MCwgMHgyMCwgMHgyNiwgMHgwMywgMHgwMCwgMHgwMSwgMHgyNiwgMHgzMiwgMHgwMCwgMHg0NSwgMHgwMCwgMHgwOCwgMHg2MCwgMHg3MywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhERCwgMHhBMCwgMHgwMSwgMHhBNCwgMHg1OCwgMHgwMywgMHhBMiwgMHhEQiwgMHgzMiwgMHg2MCwgMHg4MiwgMHg2MSwgMHhFMCwgMHhBMCwKKwkgMHhGMCwgMHhBMCwgMHgwNSwgMHgwNSwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwMCwgMHgwMiwgMHhBMSwgMHhGMCwgMHhBNCwgMHgwMiwgMHgwMCwgMHgwNCwgMHhBMSwKKwkgMHhFMCwgMHhBNCwgMHhBMSwgMHhEMSwgMHgwMSwgMHg2MSwgMHhEQywgMHg4NCwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHhFMSwgMHg4MSwKKwkgMHhGQiwgMHgwMSwgMHhBMSwgMHg4MCwgMHgxMCwgMHg2MCwgMHhFNiwgMHg2NCwgMHgwMSwgMHgwMiwgMHhFMCwgMHgwMSwgMHhBMCwgMHhEMywgMHgxMSwgMHg2MCwKKwkgMHg1QSwgMHg2MywgMHhGQSwgMHhBNCwgMHhDQywgMHg4NCwgMHgwOCwgMHhBMywgMHhGRCwgMHgwMiwgMHhDRiwgMHhGMSwgMHhBMywgMHhEMywgMHgwMSwgMHgxOCwKKwkgMHhENSwgMHgxOCwgMHhGRSwgMHhBMywgMHhBMywgMHhEMywgMHg3RCwgMHhGQiwgMHhGNSwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHg2MCwKKwkgMHg0MCwgMHg2NSwgMHg2NCwgMHg0MSwgMHhBMSwgMHhEMywgMHhENSwgMHg4MCwgMHgwMCwgMHhCOCwgMHgyNiwgMHgwNywgMHgwMiwgMHgwMiwgMHgwOCwgMHhBMSwKKwkgMHhGOSwgMHgwMSwgMHg2MSwgMHg0NCwgMHgwOCwgMHg2MCwgMHg2QywgMHhGQiwgMHgwMSwgMHg2NCwgMHhBMSwgMHhEQiwgMHg0OSwgMHhEMywgMHg3RCwgMHhGQiwKKwkgMHhGNSwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMiwgMHg2MCwgMHg0MCwgMHg2NSwgMHg2NCwgMHg0MSwgMHhBMSwgMHhEMywgMHhENSwgMHg4MCwKKwkgMHgwNCwgMHhCMCwgMHgxMiwgMHgwNywgMHgwMiwgMHgwMiwgMHgwOCwgMHhBMSwgMHhGOSwgMHgwMSwgMHg2MSwgMHg0NCwgMHgwOCwgMHg2MCwgMHg2QywgMHhGQiwKKwkgMHg0OSwgMHhEMywgMHg3RCwgMHhGQiwgMHhGNSwgMHg2MCwgMHhDOCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHg2MCwgMHhEOCwgMHg2NSwgMHhBNSwgMHhEMywKKwkgMHhGRiwgMHhGRiwgMHgwOCwgMHhBNCwgMHhBNSwgMHhEQiwgMHg5OSwgMHgwMSwgMHgxQywgMHg2MCwgMHg3QSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHhFMywgMHhCNCwgMHg1MywgMHhGQiwKKwkgMHgxMCwgMHg2MCwgMHgxMCwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRSwgMHhCNCwgMHhBMiwgMHhEQiwgMHgxMCwgMHg2MCwgMHgyNCwgMHg2MiwgMHgwMCwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHhERSwgMHhGRSwgMHgwQSwgMHgwNCwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNywgMHg2MCwKKwkgMHg3RCwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3QywgMHhGMSwgMHg3RCwgMHhGOSwgMHgxMywgMHg2MCwKKwkgMHgxQSwgMHhGOSwgMHgwRSwgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyRCwgMHhGRiwgMHgyMCwgMHg2MCwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxMywgMHhGQiwgMHhGNywgMHg2MCwgMHg5RiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRSwKKwkgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHg0MCwgMHg2MCwgMHgwMCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg1MywgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg4MCwgMHhCMCwgMHhGRiwgMHhGRiwgMHg1NCwgMHgwMiwgMHgxQywgMHg2MCwgMHgzMiwgMHg2MywgMHgxQywgMHg2MSwgMHhDRCwgMHg4MSwKKwkgMHhCRCwgMHhERiwgMHhGRCwgMHgwMiwgMHgxNCwgMHg2MCwgMHgzMiwgMHg2MSwgMHg4OCwgMHhGMywgMHg2MSwgMHg0MywgMHhDNCwgMHhBNSwgMHg0NywgMHhEMSwKKwkgMHgwRiwgMHgwNCwgMHhCRSwgMHhENSwgMHgxQywgMHg2MCwgMHgyRSwgMHg2MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHg0MywgMHhEMywKKwkgMHhCRSwgMHhEMSwgMHhEQywgMHg4NCwgMHhBMywgMHhEQiwgMHg2NiwgMHg0NCwgMHhDMCwgMHg4NCwgMHhCRSwgMHhEQiwgMHg2NSwgMHg0NCwgMHhFRCwgMHgwMSwKKwkgMHgxQywgMHg2MCwgMHgzMiwgMHg2MywgMHgwRSwgMHg2MSwgMHg0MSwgMHg0QiwgMHhCRCwgMHhEMywgMHhCRCwgMHhEMSwgMHgwMCwgMHhCRCwgMHg2NCwgMHg0MSwKKwkgMHgxOSwgMHgwMywgMHgwMSwgMHhBOCwgMHg2MSwgMHg0NCwgMHgwMiwgMHhBOCwgMHgxNSwgMHgwMywgMHgwMiwgMHgwMiwgMHhFOSwgMHg4NCwgMHgxMiwgMHgwMCwKKwkgMHg2NSwgMHg0NywgMHg2MCwgMHg0NSwgMHg2MSwgMHg0NCwgMHgwOSwgMHg2MSwgMHhDRCwgMHg4MSwgMHhFMCwgMHg4NCwgMHhGRiwgMHgyMywgMHhGQywgMHgwMSwKKwkgMHgwMiwgMHgyNCwgMHhDNCwgMHg4NCwgMHgwMiwgMHgyOCwgMHhENCwgMHg4NCwgMHhDRCwgMHg4MSwgMHgwMSwgMHgwRSwgMHgwMSwgMHhCQywgMHgwMiwgMHgwMywKKwkgMHhFMCwgMHg4NCwgMHhGNiwgMHgwMSwgMHgwMCwgMHg3RiwgMHgyQiwgMHg0MSwgMHg0RCwgMHg4QiwgMHhCRiwgMHhEQiwgMHhERCwgMHgwMiwgMHgxNCwgMHg2MCwKKwkgMHgzMiwgMHg2MSwgMHg4OCwgMHhGMywgMHg2MSwgMHg0MywgMHhDNCwgMHhBNSwgMHg0NywgMHhEMSwgMHgwQSwgMHgwNCwgMHhEQSwgMHg4NiwgMHgxQywgMHg2MCwKKwkgMHgzMCwgMHg2MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHhDMywgMHg4MywgMHg0MywgMHhEMSwgMHhBNiwgMHhEOSwgMHg2NSwgMHg0NCwgMHhGMiwgMHgwMSwKKwkgMHg1MywgMHhGMywgMHg4OCwgMHhGMSwgMHhGMywgMHhCNCwgMHg1MywgMHhGQiwgMHgxNCwgMHg2MCwgMHgzMiwgMHg2MywgMHhDMywgMHg4NSwgMHg0NSwgMHg0QSwKKwkgMHgxQiwgMHg2MCwgMHhCMiwgMHg2NSwgMHg4NywgMHhGMywgMHg0NSwgMHg0QywgMHg0MCwgMHg0OCwgMHgyQSwgMHg0NSwgMHhENywgMHg4MCwgMHgwMiwgMHg2NSwKKwkgMHgxNywgMHgwNSwgMHg0NywgMHhEMSwgMHgwMiwgMHg2NSwgMHg0NywgMHhEMywgMHgwQSwgMHg2NSwgMHhEMCwgMHg4MSwgMHg0NywgMHhEMywgMHgwMSwgMHgwNSwKKwkgMHgwMCwgMHg2MSwgMHhGMiwgMHhBMywgMHgwMSwgMHhCMCwgMHg2MSwgMHg0NCwgMHgwNSwgMHgwMywgMHgyQywgMHhEQiwgMHg1QSwgMHhERCwgMHg1QSwgMHg4QywKKwkgMHgzQywgMHhBMywgMHhFQiwgMHgwMSwgMHgyOCwgMHg0MiwgMHg0QSwgMHhERCwgMHg0QSwgMHhEQiwgMHg0MiwgMHg0OCwgMHgzQywgMHhBMywgMHhFNSwgMHgwMSwKKwkgMHgyOCwgMHg0NCwgMHg4NiwgMHhGQiwgMHg4NiwgMHhGMSwgMHgxQiwgMHg2MCwgMHhCMiwgMHg2MywgMHg0NCwgMHg0OCwgMHgyOCwgMHg0NSwgMHhENywgMHg4MCwKKwkgMHhBMywgMHhEMSwgMHgxNSwgMHgwNSwgMHgwNCwgMHg2NSwgMHg0NiwgMHhEMywgMHgyOCwgMHg0NSwgMHhENiwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMiwgMHgwNCwKKwkgMHgwNCwgMHhBMywgMHhGNSwgMHgwMSwgMHhGNywgMHgwNiwgMHg2MiwgMHg0NiwgMHhBMiwgMHhEOSwgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHg2NiwgMHg0MiwKKwkgMHg1QSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBMywgMHhEOSwgMHhGRSwgMHhBMywgMHhBMywgMHhEMSwgMHg2NiwgMHg0MiwgMHhFQiwgMHgwMSwgMHg4NiwgMHhGMywKKwkgMHg4NywgMHhGMSwgMHg2MCwgMHg0MywgMHg0NCwgMHg0OCwgMHgyOCwgMHg0NSwgMHhENywgMHg4MCwgMHhBMywgMHhEMSwgMHgxNSwgMHgwNSwgMHgwNCwgMHg2NSwKKwkgMHg0NiwgMHhEMywgMHgyOCwgMHg0NSwgMHhENiwgMHg4MCwgMHhEMCwgMHg4MCwgMHgwMiwgMHgwNCwgMHgwNCwgMHhBMywgMHhGNSwgMHgwMSwgMHhGNywgMHgwNiwKKwkgMHg2MiwgMHg0NiwgMHhBMiwgMHhEOSwgMHhBMywgMHhEQiwgMHg1QiwgMHhEMywgMHg2NiwgMHg0MiwgMHg1QSwgMHhEMSwgMHhBMiwgMHhEQiwgMHhBMywgMHhEOSwKKwkgMHhGRSwgMHhBMywgMHhBMywgMHhEMSwgMHg2NiwgMHg0MiwgMHhFQiwgMHgwMSwgMHgwOCwgMHg2MCwgMHgwOCwgMHhGMSwgMHgxMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHg3RCwgMHhGMSwgMHgxOSwgMHg2MCwgMHgzRCwgMHhGMywgMHg2NCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgyNywgMHgwMCwgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHgzRiwgMHhGQiwgMHgxOSwgMHg2MCwKKwkgMHgzOSwgMHhGMywgMHgzRiwgMHg0MCwgMHgwMSwgMHgyNywgMHgxNiwgMHgwMCwgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHg2MCwgMHg0MSwgMHhEQiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMywgMHgzNiwgMHgwNywgMHgwMCwgMHgxOSwgMHg2MCwgMHg0NCwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgyQSwgMHgwMSwgMHgwMCwgMHgwRiwgMHg2MSwgMHg2MSwgMHg0NCwgMHhBNCwgMHg4NCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxNiwgMHgwMCwgMHgwRiwgMHhCNCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwKKwkgMHg1QSwgMHhEMywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RSwgMHhBQywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHgzRiwgMHhGQiwgMHgxOSwgMHg2MCwKKwkgMHgzQSwgMHhGMywgMHgwRiwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHhGQywgMHg2MCwgMHg1OCwgMHg0RSwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgwMCwgMHg2MCwgMHgzMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNSwgMHg2MCwgMHgzMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwKKwkgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHg3QSwgMHg2NCwgMHgxMywgMHg2MCwgMHgyMiwgMHhGQiwKKwkgMHgwMywgMHg2NCwgMHg0QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgwNCwgMHhGRiwgMHgwMCwgMHg2NCwgMHg1MywgMHhGQiwgMHgwMCwgMHg2NCwgMHgwOCwgMHg2MCwKKwkgMHgxMiwgMHhGQiwgMHg1QSwgMHhEQiwgMHhCRSwgMHhGRSwgMHgwMCwgMHg2MCwgMHgzMCwgMHg2NCwgMHgwOCwgMHg2MCwgMHgxMywgMHhGQiwgMHhGNSwgMHg2MCwKKwkgMHgzMSwgMHg2NCwgMHg1QSwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwOCwgMHg2MCwKKwkgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwKKwkgMHgwOCwgMHg2MCwgMHgxMiwgMHhGMSwgMHgwMCwgMHg2MCwgMHgwOCwgMHg2NCwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHhDRiwgMHhGRSwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyMCwgMHg0MCwgMHg5MCwgMHgyQiwgMHgwMywgMHgwMCwgMHhGQiwgMHg2MCwgMHhGQywgMHg3OCwgMHhGRiwgMHhGRiwgMHg1MywgMHhGMywKKwkgMHg4OCwgMHhGMSwgMHgwNCwgMHhCMCwgMHgwNywgMHg2MCwgMHg4MCwgMHg2NCwgMHhEMCwgMHg4MCwgMHgyMCwgMHgwMywgMHgxRiwgMHgwNiwgMHgyNiwgMHg0NiwKKwkgMHg4OCwgMHhGMSwgMHgxNCwgMHg2MCwgMHgzMiwgMHg2MywgMHhDMywgMHg4MywgMHg3RCwgMHhGMywgMHgyNiwgMHhGMCwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NCwKKwkgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHg2NCwgMHg0NywgMHgwMCwgMHg3RiwgMHhCRCwgMHhEQiwgMHgzMiwgMHhGMCwgMHhCRCwgMHhEOSwgMHgzMywgMHhGMCwKKwkgMHhCRCwgMHhEOSwgMHgzNCwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwMCwgMHhGNCwgMHgwRCwgMHhGMCwgMHhCRCwgMHhEOSwgMHgwRSwgMHhGMCwgMHhCRCwgMHhEOSwKKwkgMHgwRiwgMHhGMCwgMHhBMywgMHhERiwgMHg2NCwgMHg0NywgMHg2MCwgMHg0NSwgMHgwMCwgMHgzNywgMHgwMywgMHgwMCwgMHhGQiwgMHg2MCwgMHhGNywgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHhCRCwgMHhEQiwgMHhFMCwgMHhBMCwgMHgxRiwgMHg2MSwgMHgwMCwgMHhCOCwgMHhGOCwgMHgwNywgMHhGNywgMHgwMywgMHg2MCwgMHhGRSwKKwkgMHg1RCwgMHhEMCwgMHhDQywgMHg4NCwgMHhCRCwgMHhEOSwgMHhGQywgMHgwMiwgMHg2NSwgMHg0MCwgMHgwMSwgMHgyNiwgMHhERiwgMHg4MywgMHg1RCwgMHhEMCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzQSwgMHgwMywgMHgwMCwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHg1RCwgMHhEMCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMywgMHgzNiwgMHgwNywgMHgwMCwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQSwKKwkgMHhERCwgMHgwMSwgMHhDRCwgMHg4MSwgMHgxMywgMHgwMCwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyQSwgMHgwNCwgMHgwMCwKKwkgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHhDMSwgMHg4MSwgMHgwQSwgMHgwMCwgMHg1OSwgMHhEMCwgMHg3RCwgMHhGMywgMHhGRiwgMHhGRiwgMHhEMCwgMHg4MCwKKwkgMHgyMCwgMHhGRSwgMHgwOCwgMHgyNCwgMHgwMywgMHgwMCwgMHhGQiwgMHg2MCwgMHhGNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg3QywgMHg0NCwgMHgxQSwgMHg2MCwKKwkgMHgyNCwgMHhGQiwgMHgxQSwgMHg2MCwgMHgyNSwgMHhGQiwgMHgxQSwgMHg2MCwgMHgyNiwgMHhGQiwgMHgxQSwgMHg2MCwgMHgyNywgMHhGQiwgMHgxQywgMHg2MCwKKwkgMHgwOCwgMHhGQiwgMHgxQywgMHg2MCwgMHgwNCwgMHhGQiwgMHgwMCwgMHg2NCwgMHgxQywgMHg2MCwgMHgwNCwgMHhGQiwgMHgyMCwgMHhGRSwgMHgzNywgMHg2MCwKKwkgMHhGRSwgMHg2NCwgMHg0MCwgMHg0QSwgMHhGOSwgMHg2MCwgMHg1OCwgMHg0RCwgMHhDMywgMHg3OCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNCwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHgwOSwgMHgxOCwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNiwgMHhGMywgMHgxQywgMHg2MCwgMHgwNywgMHhGNSwgMHg2MCwgMHg0MSwKKwkgMHgwMCwgMHg2NCwgMHgxQywgMHg2MCwgMHgwNCwgMHhGQiwgMHgyMCwgMHhGRSwgMHgyQSwgMHhEMSwgMHhEQSwgMHg4NSwgMHg2NCwgMHg0NCwgMHgwMSwgMHhBMCwKKwkgMHhGRiwgMHhGRiwgMHgwMSwgMHgwMiwgMHg3OSwgMHgwMCwgMHg0NSwgMHg0QSwgMHg3QywgMHg0NCwgMHg2MCwgMHhGRSwgMHhBMSwgMHhEMiwgMHhGRiwgMHhGRiwKKwkgMHhEMCwgMHg4MCwgMHgyMCwgMHhGRSwgMHgwMSwgMHgwMywgMHhFRiwgMHgwMSwgMHgxQywgMHg2MCwgMHgwNCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMiwgMHgxOCwKKwkgMHhERCwgMHg4MSwgMHgzNSwgMHgwMCwgMHg2MCwgMHhGRSwgMHg1RCwgMHhEMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg1QywgMHg0MSwgMHg5NCwgMHg4MSwgMHhBMCwKKwkgMHgyMCwgMHhGRSwgMHgyRCwgMHgwNCwgMHgwMSwgMHg2NCwgMHgxQywgMHg2MCwgMHgwNCwgMHhGQiwgMHhDMSwgMHg4NCwgMHg4NCwgMHhBNCwgMHgxQywgMHg2MCwKKwkgMHgwNiwgMHhGQiwgMHgwMCwgMHhGMiwgMHgxQywgMHg2MCwgMHgwNywgMHhGQiwgMHgxQywgMHg2MCwgMHgwNSwgMHhGRCwgMHgwMiwgMHg2MCwgMHgwMCwgMHg2MywKKwkgMHhDRCwgMHg4NSwgMHg2NCwgMHg0NCwgMHhEOCwgMHg4MSwgMHhDRCwgMHg4NCwgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwKKwkgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywKKwkgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwgMHhERiwgMHg4MywgMHgwMCwgMHg2MCwgMHgwMSwgMHg2MSwgMHgwMiwgMHg2MCwKKwkgMHgwMCwgMHg2NCwgMHhFMCwgMHg4NywgMHg2MCwgMHg0NiwgMHgxQywgMHg2MCwgMHgwNSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwKKwkgMHhDRCwgMHg4MSwgMHgyMCwgMHhGRSwgMHgyQSwgMHg0NCwgMHgzOCwgMHg2MCwgMHgwMCwgMHg3QywgMHhEMCwgMHg4NCwgMHgzOCwgMHg2MCwgMHgwNCwgMHg2NSwKKwkgMHg0NCwgMHhENywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQywgMHg2MCwgMHgwNCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwOCwgMHgxOCwgMHgxQywgMHg2MCwKKwkgMHgwNiwgMHhGMywgMHgxQywgMHg2MCwgMHgwNywgMHhGNSwgMHg2MCwgMHg0MSwgMHgwMCwgMHg2NCwgMHgxQywgMHg2MCwgMHgwNCwgMHhGQiwgMHgyNiwgMHg0NCwKKwkgMHgwMSwgMHhBNCwgMHg1OCwgMHg5MCwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMiwgMHg2MSwgMHg0NCwgMHgwQiwgMHhBNSwgMHgwNCwgMHgwMCwgMHg2MSwgMHg0NCwKKwkgMHhGQywgMHhBNCwgMHg4QiwgMHg3QywgMHhDMCwgMHg4NSwgMHhERCwgMHg4MSwgMHg2NiwgMHg0NCwgMHgxQywgMHg2MCwgMHgwNywgMHhGQiwgMHgyNiwgMHg0NiwKKwkgMHgxQiwgMHhGMCwgMHgxQywgMHg2MCwgMHgwNywgMHhGNSwgMHg2NCwgMHg0NCwgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNiwgMHgyRCwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHhGQSwgMHg2MCwgMHhFNywgMHg3OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGRSwgMHg1RCwgMHhEMiwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHhGRiwgMHhCNCwgMHg0MSwgMHg5NCwgMHg4MSwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwNCwgMHgwMCwgMHhGNCwgMHg4NCwgMHhBNCwgMHg2MCwgMHg0MSwKKwkgMHg1RCwgMHgwMSwgMHgxQSwgMHg2MCwgMHgyQywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzQSwgMHg2QywgMHgwMSwgMHg2MSwgMHg1QywKKwkgMHgxQSwgMHg2MCwgMHgyQiwgMHhGOSwgMHg2MCwgMHhGRSwgMHg1RCwgMHhEMiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyMCwKKwkgMHgwMiwgMHgwMCwgMHhGRiwgMHhBMSwgMHg2MCwgMHgwMSwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMiwgMHgwMCwKKwkgMHhGRSwgMHhBMSwgMHg1OSwgMHgwMSwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHhGRCwgMHhBMSwKKwkgMHg1MiwgMHgwMSwgMHgwMSwgMHg3QywgMHgxQywgMHg2MCwgMHgwOCwgMHhGOSwgMHg0QywgMHgwMCwgMHgxQSwgMHg2MCwgMHgyQywgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHgwMSwgMHgxOCwgMHg0OSwgMHgwMSwgMHgwMCwgMHg3QywgMHgxQywgMHg2MCwgMHgwOCwgMHhGOSwgMHg2MSwgMHg1QywgMHgxQSwgMHg2MCwgMHgyQiwgMHhGOSwKKwkgMHg2MCwgMHhGRSwgMHg1RCwgMHhEMiwgMHhGRiwgMHhGRiwgMHhGQSwgMHhBNCwgMHhGRiwgMHhGRiwgMHgwNCwgMHgyMCwgMHgwNCwgMHgwMCwgMHhGRiwgMHhBMSwKKwkgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwNCwgMHgwMCwKKwkgMHhDOSwgMHg4MSwgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHg1MCwgMHgzNiwKKwkgMHgwNCwgMHgwMCwgMHhGRCwgMHhBMSwgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwKKwkgMHhGMiwgMHgzNiwgMHgwNCwgMHgwMCwgMHhGQywgMHhBMSwgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwKKwkgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNCwgMHgwMCwgMHhGQiwgMHhBMSwgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg1RCwgMHhEMCwKKwkgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwNCwgMHgwMCwgMHhGQSwgMHhBMSwgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHg1RCwgMHhEMCwgMHhGRiwgMHhGRiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwNCwgMHgwMCwgMHhGOSwgMHhBMSwgMHhGOSwgMHg2MCwgMHg2QiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2MCwgMHg1QywgMHgwMCwgMHgzNiwgMHgzMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHhGQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNywgMHgwMSwgMHgxQSwgMHg2MCwgMHgyNCwgMHhGQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwKKwkgMHgyQSwgMHgwMCwgMHg1RCwgMHhEMiwgMHhERCwgMHg4MSwgMHhGQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwKKwkgMHgwOCwgMHgyNiwgMHhGNiwgMHgwMSwgMHgxQSwgMHg2MCwgMHgyNSwgMHhGQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgyMSwgMHgwMCwgMHg1RCwgMHhEMiwKKwkgMHhERCwgMHg4MSwgMHhGQiwgMHg2MCwgMHg1OCwgMHg0RSwgMHg2NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHg2NSwgMHg0MCwgMHgwOCwgMHgyNiwgMHhGNiwgMHgwMSwKKwkgMHgxQSwgMHg2MCwgMHgyNiwgMHhGQiwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgxOCwgMHgwMCwgMHg1RCwgMHhEMCwgMHgzNCwgMHg2MCwgMHg0RSwgMHg2MiwKKwkgMHhBMiwgMHhEOSwgMHg1RCwgMHhEMCwgMHgzNCwgMHg2MCwgMHg0RiwgMHg2MiwgMHhBMiwgMHhEOSwgMHgxNCwgMHgwMCwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwKKwkgMHgwNCwgMHg2NCwgMHgxQSwgMHg2MCwgMHgyNCwgMHhGQiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwNCwgMHg2NCwgMHgxQSwgMHg2MCwgMHgyNSwgMHhGQiwKKwkgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMiwgMHg2NCwgMHgxQSwgMHg2MCwgMHgyNiwgMHhGQiwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2MCwgMHgwMCwgMHg2NCwKKwkgMHgxQSwgMHg2MCwgMHgyNywgMHhGQiwgMHgyMCwgMHhGRSwgMHgxQywgMHg2MCwgMHgwOCwgMHhGMSwgMHhGRiwgMHhGRiwgMHgwMywgMHgxOCwgMHgwMSwgMHg3QywKKwkgMHgxQywgMHg2MCwgMHgwOCwgMHhGOSwgMHgxQSwgMHg2MCwgMHgyQiwgMHhGMSwgMHhBMiwgMHhERCwgMHg2MSwgMHg0NCwgMHgxQSwgMHg2MCwgMHgyOCwgMHhGQiwKKwkgMHhEMSwgMHg4NCwgMHhEQywgMHg4NCwgMHg2NCwgMHg0NSwgMHgzNCwgMHg2MCwgMHgxMCwgMHg2MywgMHhCRCwgMHhEQiwgMHg2MCwgMHg0MSwgMHhDRCwgMHg4NCwKKwkgMHg0QywgMHg5MSwgMHg2MCwgMHg0MywgMHg2MCwgMHhGRSwgMHhBNSwgMHhEMiwgMHhERSwgMHg4NSwgMHg3RiwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHhGNCwKKwkgMHgwNCwgMHg2NSwgMHg1RCwgMHg5MywgMHhBMywgMHhEQiwgMHg1RCwgMHg5MywgMHhBNSwgMHhEMiwgMHhGNiwgMHgxRiwgMHg1RCwgMHg5MywgMHgyMCwgMHhGRSwKKwkgMHhERiwgMHg4MywgMHgxQSwgMHg2MCwgMHgwOSwgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0NywgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHgyOCwgMHhGMywKKwkgMHgxQSwgMHg2MCwgMHgyQiwgMHhGMSwgMHg2MCwgMHg0MSwgMHg2NCwgMHg0MywgMHhGOSwgMHg2MCwgMHg1NiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwKKwkgMHg3QywgMHg0NCwgMHgxQSwgMHg2MCwgMHgyMCwgMHhGQiwgMHgxQSwgMHg2MCwgMHgxQSwgMHhGMSwgMHgxQSwgMHg2MCwgMHgyNCwgMHhGMywgMHhGRiwgMHhGRiwKKwkgMHhBMCwgMHg4NCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwNywgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNywgMHgwMCwgMHgyMCwgMHgyNiwgMHgwNywgMHgwMCwKKwkgMHgwMiwgMHgyNiwgMHgwNywgMHgwMCwgMHgzRiwgMHgwMCwgMHgxMCwgMHg3QywgMHgwNSwgMHgwMCwgMHgwNCwgMHg3QywgMHgwMywgMHgwMCwgMHgyMCwgMHg3QywKKwkgMHgwMSwgMHgwMCwgMHgwMiwgMHg3QywgMHgxQSwgMHg2MCwgMHgyMCwgMHhGOSwgMHg3QywgMHg0NCwgMHgxQSwgMHg2MCwgMHgyMSwgMHhGQiwgMHgxQSwgMHg2MCwKKwkgMHgxQiwgMHhGMSwgMHgxQSwgMHg2MCwgMHgyNSwgMHhGMywgMHgzNCwgMHg2MCwgMHg0MCwgMHg2MSwgMHhBMCwgMHg4NCwgMHhBMSwgMHhEMSwgMHhGRiwgMHhGRiwKKwkgMHgxMCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwMSwgMHgyNiwgMHgwOCwgMHgwMCwgMHgyMywgMHgwMCwgMHgxMCwgMHg3QywKKwkgMHgwNiwgMHgwMCwgMHg2NCwgMHg0MCwgMHgxMCwgMHgyNiwgMHgxRSwgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgwMSwgMHg3QywgMHgxQSwgMHg2MCwKKwkgMHgyMSwgMHhGOSwgMHg3QywgMHg0NCwgMHgxQSwgMHg2MCwgMHgyMiwgMHhGQiwgMHgxQSwgMHg2MCwgMHgxQywgMHhGMSwgMHgxQSwgMHg2MCwgMHgyNiwgMHhGMywKKwkgMHhGRiwgMHhGRiwgMHhBMCwgMHg4NCwgMHg2MCwgMHg0MCwgMHgwMiwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwNCwgMHgyNiwgMHgwNSwgMHgwMCwgMHgwMSwgMHgyNiwKKwkgMHgwNSwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMiwgMHg3QywgMHgwMywgMHgwMCwgMHgwNCwgMHg3QywgMHgwMSwgMHgwMCwgMHgyMCwgMHg3QywgMHgxQSwgMHg2MCwKKwkgMHgyMiwgMHhGOSwgMHgwOSwgMHgwMCwgMHg3QywgMHg0NCwgMHgxQSwgMHg2MCwgMHgyMCwgMHhGQiwgMHgxQSwgMHg2MCwgMHgyMSwgMHhGQiwgMHgxQSwgMHg2MCwKKwkgMHgyMiwgMHhGQiwgMHgxQSwgMHg2MCwgMHgyMywgMHhGQiwgMHg3QywgMHg0NCwgMHgxQSwgMHg2MCwgMHgyMCwgMHhGMSwgMHhCRCwgMHhEOSwgMHgxQSwgMHg2MCwKKwkgMHgyMSwgMHhGMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgxQSwgMHg2MCwgMHgyMiwgMHhGMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgxQSwgMHg2MCwKKwkgMHgxRCwgMHhGMSwgMHhCMCwgMHg4NCwgMHhCRCwgMHhEOSwgMHgwNCwgMHgwMywgMHgxQywgMHg2MCwgMHgwOCwgMHhGMSwgMHhCRCwgMHhEOSwgMHg3MiwgMHgwMCwKKwkgMHgxNiwgMHg2MCwgMHhDMiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhBMCwgMHhGRiwgMHhGRiwgMHgwQywgMHgyNCwgMHg2QiwgMHgwMCwgMHg2MCwgMHg0MCwKKwkgMHgwQiwgMHgzNiwgMHg2OCwgMHgwMCwgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywgMHg2NSwgMHgwMCwgMHg5MSwgMHgwMCwgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NSwKKwkgMHg2MCwgMHhGRSwgMHgxQSwgMHg2MCwgMHgyOCwgMHhGQiwgMHhFMCwgMHg4NCwgMHhFMCwgMHg4NCwgMHgwOCwgMHgyMCwgMHgwMywgMHgwMCwgMHgwMSwgMHg2NCwKKwkgMHhBMiwgMHhEQiwgMHgwMiwgMHg2NCwgMHgwMiwgMHhBNSwgMHg2NCwgMHg0NCwgMHhENCwgMHg5QywgMHhENCwgMHg4MCwgMHgzNCwgMHg2MCwgMHg1MiwgMHg2MiwKKwkgMHgwMiwgMHgwNSwgMHgwOCwgMHg2NSwgMHg0RCwgMHgwMCwgMHhBMiwgMHhEOSwgMHg3QywgMHg0NCwgMHgzNCwgMHg2MCwgMHg1NCwgMHg2MiwgMHhBMiwgMHhEQiwKKwkgMHgyMCwgMHhGRSwgMHgwMCwgMHg2NCwgMHg2MCwgMHhGRSwgMHgxQywgMHg2MCwgMHgwOCwgMHhGMywgMHhGRiwgMHhGRiwgMHgwMCwgMHhBMCwgMHg1RCwgMHhEMCwKKwkgMHgwMCwgMHg2NSwgMHgwNCwgMHgwMywgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwgMHgwMSwgMHg2NSwgMHgwMywgMHgwMCwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzQSwKKwkgMHgwMSwgMHg2NSwgMHg1RCwgMHhEMCwgMHgwNCwgMHgwMywgMHg2NCwgMHg0MCwgMHgwRiwgMHgzQSwgMHgwMSwgMHg2NSwgMHgwMywgMHgwMCwgMHg2NCwgMHg0MCwKKwkgMHg1MCwgMHgzQSwgMHgwMSwgMHg2NSwgMHg1RCwgMHhEMCwgMHgwNCwgMHgwMywgMHg2NCwgMHg0MCwgMHhBQywgMHgzQSwgMHgwMSwgMHg2NSwgMHgwMywgMHgwMCwKKwkgMHg2NCwgMHg0MCwgMHhGMiwgMHgzQSwgMHgwMSwgMHg2NSwgMHg1RCwgMHhEMCwgMHg2NSwgMHg0MCwgMHgwMCwgMHgzQSwgMHgxNywgMHgwMCwgMHgwMCwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMSwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwMiwgMHg2NSwgMHg2NCwgMHg0MCwKKwkgMHgwMiwgMHgzNiwgMHgwNCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwNCwgMHgzNiwgMHgxMCwgMHg2NSwgMHg2NCwgMHg0MCwgMHgwNSwgMHgzNiwgMHgyMCwgMHg2NSwKKwkgMHg2NSwgMHg1QywgMHgxQSwgMHg2MCwgMHgyQSwgMHhGMywgMHhGRiwgMHhGRiwgMHhCMCwgMHg4NCwgMHhBMiwgMHhEQiwgMHgxQSwgMHg2MCwgMHgyOCwgMHhGMywKKwkgMHgwMCwgMHg2NSwgMHhGRiwgMHhBNCwgMHhBMiwgMHhEQiwgMHhCQywgMHgwMiwgMHgxQSwgMHg2MCwgMHgyQSwgMHhGMywgMHgxQSwgMHg2MCwgMHgyOSwgMHhGMSwKKwkgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHg4OCwgMHhGMywgMHhGRiwgMHhGRiwgMHgzQywgMHhBNCwgMHg4OCwgMHhGQiwgMHg4NywgMHhGMywKKwkgMHg3RCwgMHhGMSwgMHgwNCwgMHhBNCwgMHg4NywgMHhGQiwgMHg1MywgMHhGMywgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwgMHg4MCwgMHgyNiwgMHgwRCwgMHgwMCwKKwkgMHg3RCwgMHhGMywgMHgxMCwgMHg2MCwgMHhGMiwgMHg2MSwgMHhDQywgMHg4NCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMywgMHgwNiwgMHhBMSwgMHhGQiwgMHgwMSwKKwkgMHhBMSwgMHhEMywgMHhGRiwgMHhGRiwgMHgwMiwgMHhCQywgMHhBMSwgMHhEQiwgMHgxMiwgMHgwMCwgMHg3RCwgMHhGMywgMHgxMSwgMHg2MCwgMHg2MCwgMHg2MywKKwkgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwgMHgxMiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBMywgMHhEMSwgMHhENywgMHg4MCwgMHhEMCwgMHg4MCwKKwkgMHgwNiwgMHgwMywgMHgwMiwgMHgwMywgMHgwOCwgMHhBMywgMHhGOSwgMHgwMSwgMHgwMiwgMHhBMywgMHgwNCwgMHg2NCwgMHhBMywgMHhEQiwgMHgyMCwgMHhGRSwKKwkgMHgyNiwgMHg0NiwgMHgzMSwgMHg0MCwgMHgyMCwgMHgyQSwgMHgzNSwgMHgwMCwgMHgzRiwgMHhGMiwgMHg0NywgMHg2NSwgMHhDNCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHgyMywgMHhGQSwgMHhGMSwgMHg2MCwgMHgwMiwgMHg2NCwgMHgyNCwgMHhGQSwgMHg3RCwgMHhGMywgMHgwMSwgMHg2MCwgMHhGRiwgMHg2NSwgMHhBNCwgMHg4NCwKKwkgMHgwMSwgMHgyMywgMHgxNCwgMHgwMCwgMHgxMSwgMHg2MCwgMHg2MCwgMHg2MSwgMHgxMiwgMHg2MCwgMHg0MCwgMHg2NSwgMHhBMSwgMHhEMSwgMHhENSwgMHg4MCwKKwkgMHhEMCwgMHg4MCwgMHgwQiwgMHgwMywgMHgwMiwgMHgwMywgMHgwOCwgMHhBMSwgMHhGOSwgMHgwMSwgMHgwNCwgMHhBMSwgMHhBMSwgMHhEMywgMHgwMSwgMHg2MCwKKwkgMHgwMCwgMHg2NSwgMHg2MCwgMHg0NywgMHhGRiwgMHhCNCwgMHhCNCwgMHg4NCwgMHgwMSwgMHgwMCwgMHgwMSwgMHg2NCwgMHgwMCwgMHhGNCwgMHgwOCwgMHhGQSwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyNiwgMHg2MCwgMHgwQSwgMHg2NCwgMHgxMywgMHg2MCwgMHgwRCwgMHhGQiwgMHgyNiwgMHg0NCwgMHg1QSwgMHhEQiwKKwkgMHgwMiwgMHg2NCwgMHg1QSwgMHhEQiwgMHhGRiwgMHhGRiwgMHgyQiwgMHhGRiwgMHhGQSwgMHhGRSwgMHgwMCwgMHg2NiwgMHg0NiwgMHg0NiwgMHgyRiwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgyNiwgMHg0NiwgMHgyRiwgMHg1OCwgMHhGRiwgMHhGRiwgMHg3OCwgMHhGQiwgMHhBQywgMHg4NSwgMHg2MCwgMHg0MSwgMHg1NSwgMHgwMywKKwkgMHgzMiwgMHg2MCwgMHgwMCwgMHg2MywgMHgxQiwgMHg2MCwgMHgwNCwgMHhGRCwgMHg2MiwgMHg0MywgMHgxQSwgMHg2MCwgMHhCNCwgMHhGRCwgMHgxQSwgMHg2MCwKKwkgMHhCQSwgMHhGRCwgMHgxQSwgMHg2MCwgMHhDNCwgMHhGRCwgMHgxQSwgMHg2MCwgMHhDRSwgMHhGRCwgMHgwMCwgMHg2MywgMHhFOSwgMHg4MSwgMHgwOCwgMHg2NCwKKwkgMHgwMiwgMHgyNCwgMHhERiwgMHg4MywgMHhGQiwgMHgwMiwgMHg1MywgMHg5NCwgMHgzMiwgMHg3RiwgMHgwMywgMHgwNiwgMHgxQiwgMHg2MCwgMHgwNCwgMHhGQiwKKwkgMHgwOCwgMHg2MywgMHg2MywgMHg1RSwgMHgwMSwgMHg3RiwgMHgxOSwgMHg2MCwgMHg4QSwgMHhGQiwgMHg2NSwgMHg0MSwgMHgzMywgMHg2MCwgMHgxNiwgMHg2NSwKKwkgMHgwRiwgMHg2MCwgMHhGNCwgMHg2NCwgMHhFOSwgMHg4MSwgMHg1OCwgMHhEMSwgMHhGRCwgMHgwNCwgMHhDRiwgMHg4MywgMHhBNSwgMHhEOSwgMHgwQywgMHgwMywKKwkgMHhFOSwgMHg4MSwgMHg1OCwgMHhEMSwgMHhGRCwgMHgwNCwgMHg0MCwgMHg0OCwgMHhBNSwgMHhEMSwgMHg2NCwgMHg1RiwgMHg2NCwgMHg1RSwgMHhBNSwgMHhEQiwKKwkgMHhEQSwgMHg4NSwgMHhDRiwgMHg4MywgMHgyOCwgMHg0NCwgMHhFRSwgMHgwMiwgMHgwMCwgMHhCOSwgMHhEOCwgMHg4MywgMHgxNSwgMHgwMywgMHgzNiwgMHg2MCwKKwkgMHgwQSwgMHg2NSwgMHhFOSwgMHg4MSwgMHhCRCwgMHhEMSwgMHgwMiwgMHgwNSwgMHhGQywgMHgwMiwgMHgxNywgMHgwMCwgMHhBNSwgMHhEOSwgMHgxNSwgMHgwMywKKwkgMHhFOSwgMHg4MSwgMHhCRCwgMHhEMSwgMHgwMiwgMHgwNSwgMHhGQywgMHgwMiwgMHgxMCwgMHgwMCwgMHhBNSwgMHhEMywgMHhGRiwgMHhGRiwgMHg2NCwgMHg1RiwKKwkgMHhBNSwgMHhEQiwgMHhEQSwgMHg4NSwgMHhFRSwgMHgwMiwgMHgwOSwgMHgwMCwgMHg2NywgMHg0MywgMHgxQSwgMHg2MCwgMHhCNCwgMHhGRCwgMHgxQSwgMHg2MCwKKwkgMHhCQSwgMHhGRCwgMHgxQSwgMHg2MCwgMHhDNCwgMHhGRCwgMHgxQSwgMHg2MCwgMHhDRSwgMHhGRCwgMHgyRSwgMHg0NSwgMHgyNSwgMHg2MCwgMHg0NiwgMHg2NCwKKwkgMHhENCwgMHg4MCwgMHhGRiwgMHhGRiwgMHgxMCwgMHgwMywgMHgyMCwgMHg0MCwgMHgxMCwgMHgyNywgMHgwRCwgMHgwMCwgMHgzMywgMHg2MCwgMHgxRSwgMHg2MSwKKwkgMHgxOSwgMHg2MCwgMHg4QSwgMHhGMywgMHhBMSwgMHhEQiwgMHhGRiwgMHhCNCwgMHhDQywgMHg4NCwgMHhBOCwgMHg4MywgMHgzMywgMHg2MCwgMHgxNCwgMHg2NCwKKwkgMHg1OCwgMHhEMSwgMHg1OSwgMHhEOSwgMHhGRCwgMHgxRiwgMHg3RCwgMHhGMywgMHgzMywgMHg2MCwgMHgyMCwgMHg2MywgMHg2MCwgMHg0MCwgMHgwMSwgMHgyNywKKwkgMHgwMywgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMywgMHgwMiwgMHgwMCwgMHgxOSwgMHg2MCwgMHgzQywgMHhGMywgMHgwOCwgMHg2MSwgMHg2MCwgMHhGRSwKKwkgMHhBMywgMHhEMSwgMHhGRiwgMHhGRiwgMHgyMCwgMHhGRSwgMHgwMCwgMHhBOCwgMHhFOCwgMHg4NCwgMHgwRiwgMHgwMywgMHg2MCwgMHhGRSwgMHgwMiwgMHgyOCwKKwkgMHhGNiwgMHgwMSwgMHg4MCwgMHg2MiwgMHhCMiwgMHg5QywgMHhCRCwgMHhEOSwgMHg3QiwgMHhGOSwgMHhDRCwgMHg4MSwgMHgwMCwgMHgzNiwgMHgwMSwgMHgwMCwKKwkgMHhFRSwgMHgwMSwgMHgzNiwgMHg2MCwgMHgwQSwgMHg2MywgMHgwOCwgMHg2MSwgMHhFQSwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgzMiwgMHg2MCwKKwkgMHg3NiwgMHg2MywgMHg2NSwgMHg0MCwgMHhGRiwgMHgzNiwgMHgwMiwgMHhBMywgMHhBMywgMHhEMywgMHhGRiwgMHhGRiwgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwKKwkgMHhFOCwgMHg4NCwgMHhFOCwgMHg4NCwgMHg0MCwgMHgyNiwgMHg3RiwgMHhCNCwgMHgyMCwgMHgyNiwgMHgzRiwgMHhCNCwgMHg2MCwgMHg0NSwgMHg4MCwgMHg2MywKKwkgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3RCwgMHhGQiwgMHg0MCwgMHg2MywgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3RSwgMHhGQiwgMHgyMCwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg3RiwgMHhGQiwgMHgxMCwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg4MCwgMHhGQiwgMHgwOCwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxOSwgMHg2MCwgMHg4MSwgMHhGQiwgMHgwNCwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwKKwkgMHg4MiwgMHhGQiwgMHgwMiwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg4MywgMHhGQiwKKwkgMHgwMSwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHgzNCwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg4NCwgMHhGQiwgMHgyRSwgMHg1OCwKKwkgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHgzQiwgMHhGMywgMHhGRiwgMHhGRiwgMHgwRiwgMHhCNCwgMHg2MCwgMHg0NSwgMHgwOCwgMHg2MywgMHhGRCwgMHg2MCwKKwkgMHg1OCwgMHg0RCwgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg4NSwgMHhGQiwgMHgwNCwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwKKwkgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg4NiwgMHhGQiwgMHgwMiwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg1RiwgMHg3OCwKKwkgMHhGRiwgMHhGRiwgMHgxOSwgMHg2MCwgMHg4NywgMHhGQiwgMHgwMSwgMHg2MywgMHhGRCwgMHg2MCwgMHg1OCwgMHg0RCwgMHg1RiwgMHg3OCwgMHhGRiwgMHhGRiwKKwkgMHgxOSwgMHg2MCwgMHg4OCwgMHhGQiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2MywgMHg1QywgMHhBNywgMHg4NCwgMHhFQiwgMHg4MywgMHgxNCwgMHgwMiwKKwkgMHgwMSwgMHgwMywgMHhGQiwgMHgwMSwgMHg2NCwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwQiwgMHg2NCwgMHgwMiwgMHgzNiwgMHgwQiwgMHg2NCwgMHgwNCwgMHgzNiwKKwkgMHgwQSwgMHg2NCwgMHgwOCwgMHgzNiwgMHgwQSwgMHg2NCwgMHgxMCwgMHgzNiwgMHgwOSwgMHg2NCwgMHgyMCwgMHgzNiwgMHgwOSwgMHg2NCwgMHg0MCwgMHgzNiwKKwkgMHgwOSwgMHg2NCwgMHg4MCwgMHgzNiwgMHgwOSwgMHg2NCwgMHgxMSwgMHgwMCwgMHg2MCwgMHg0MCwgMHgwMSwgMHgzNiwgMHgwQiwgMHg2NCwgMHgwMiwgMHgzNiwKKwkgMHgwRiwgMHg2NCwgMHgwNCwgMHgzNiwgMHgwQSwgMHg2NCwgMHgwOCwgMHgzNiwgMHgwRSwgMHg2NCwgMHgxMCwgMHgzNiwgMHgwOSwgMHg2NCwgMHgyMCwgMHgzNiwKKwkgMHgwRCwgMHg2NCwgMHg0MCwgMHgzNiwgMHgwOCwgMHg2NCwgMHg4MCwgMHgzNiwgMHgwQywgMHg2NCwgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2MywgMHg1QywKKwkgMHhBNywgMHg4NCwgMHhFQiwgMHg4MywgMHgwQywgMHgwMiwgMHgwMSwgMHgwMywgMHhGQiwgMHgwMSwgMHg2NCwgMHg0NCwgMHgwMSwgMHgzNiwgMHgwQSwgMHg2NCwKKwkgMHgwMiwgMHgzNiwgMHgxNCwgMHg2NCwgMHgwNCwgMHgzNiwgMHgzNywgMHg2NCwgMHgwOCwgMHgzNiwgMHg2RSwgMHg2NCwgMHgwOSwgMHgwMCwgMHg2MCwgMHg0MCwKKwkgMHgwMSwgMHgzNiwgMHgwQSwgMHg2NCwgMHgwMiwgMHgzNiwgMHgxNCwgMHg2NCwgMHgwNCwgMHgzNiwgMHgzNywgMHg2NCwgMHgwOCwgMHgzNiwgMHg2RSwgMHg2NCwKKwkgMHgyRCwgMHg1OCwgMHhGRiwgMHhGRiwgMHg2MCwgMHhGRSwgMHg4MSwgMHhBMSwgMHg3RiwgMHhBMSwgMHgwMiwgMHgwNiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHg1RCwgMHhEMiwgMHhDRiwgMHg4MywgMHhENCwgMHg4MCwgMHgyNSwgMHgwMywgMHgxNiwgMHgwMywgMHhDRiwgMHg4MywgMHg2MSwgMHg0NCwgMHg4MCwgMHhBMCwKKwkgMHgyMCwgMHgwMywgMHgwMiwgMHgwMiwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwgMHg1RCwgMHhEMiwgMHhDRiwgMHg4MywgMHg4MSwgMHhBMSwgMHgxOSwgMHgwMywKKwkgMHgwNSwgMHgwNywgMHg3RiwgMHhBMSwgMHhDQywgMHg4NCwgMHhERCwgMHg4MSwgMHhFNiwgMHgwMywgMHhGNywgMHgwMSwgMHgwMCwgMHhGNCwgMHgwMCwgMHhCOCwKKwkgMHgwNCwgMHg2MSwgMHhFNiwgMHgwMywgMHhGMiwgMHgwMSwgMHgyQywgMHg0MywgMHg1RCwgMHhEMCwgMHhERSwgMHhEOSwgMHg2NCwgMHg0NCwgMHg1RCwgMHhEMCwKKwkgMHhERSwgMHhEOSwgMHhDQywgMHg4NCwgMHg4MSwgMHhBMSwgMHgwNSwgMHgwMywgMHg3RiwgMHhBMSwgMHhGOSwgMHgwNCwgMHgwMCwgMHhGNCwgMHgwMywgMHg2MSwKKwkgMHhGNiwgMHgwMSwgMHgyMCwgMHhGRSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgwMSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNiwgMHg2NCwgMHgyQiwgMHgwMCwKKwkgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2NCwgMHgyNywgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMiwgMHg2NCwgMHgyMywgMHgwMCwKKwkgMHgwOCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2NCwgMHgxRiwgMHgwMCwgMHgxMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwRSwgMHg2NCwgMHgxQiwgMHgwMCwKKwkgMHgyMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQywgMHg2NCwgMHgxNywgMHgwMCwgMHg0MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2NCwgMHgxMywgMHgwMCwKKwkgMHg4MCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgwRiwgMHgwMCwgMHgwMSwgMHgzQiwgMHgwMiwgMHgwMCwgMHgwNiwgMHg2NCwgMHgwQiwgMHgwMCwKKwkgMHgwMiwgMHgzQiwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2NCwgMHgwNywgMHgwMCwgMHgwNCwgMHgzQiwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgwMywgMHgwMCwKKwkgMHgwOCwgMHgzQiwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NCwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHgyNywgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MCwKKwkgMHgzNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2MSwgMHgzMCwgMHgwMCwgMHgzMCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2MSwgMHgyQywgMHgwMCwKKwkgMHgyNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNCwgMHg2MSwgMHgyOCwgMHgwMCwgMHgxOCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwNiwgMHg2MSwgMHgyNCwgMHgwMCwKKwkgMHgxMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2MSwgMHgyMCwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQSwgMHg2MSwgMHgxQywgMHgwMCwKKwkgMHgwOSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwQywgMHg2MSwgMHgxOCwgMHgwMCwgMHgwNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwRSwgMHg2MSwgMHgxNCwgMHgwMCwKKwkgMHg2RSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMCwgMHg2MSwgMHgxMCwgMHgwMCwgMHgzNywgMHgzQSwgMHgwMiwgMHgwMCwgMHgxMiwgMHg2MSwgMHgwQywgMHgwMCwKKwkgMHgxNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNCwgMHg2MSwgMHgwOCwgMHgwMCwgMHgwQSwgMHgzQSwgMHgwMiwgMHgwMCwgMHgxNiwgMHg2MSwgMHgwNCwgMHgwMCwKKwkgMHg3OCwgMHg0MywgMHgwMywgMHg2MSwgMHgyOSwgMHg2MCwgMHhFQSwgMHg3OCwgMHg2NSwgMHg0MCwgMHgwMSwgMHgzQSwgMHgxMywgMHgwMCwgMHg2NiwgMHg0NSwKKwkgMHgyQiwgMHg0NiwgMHg5MiwgMHhGQSwgMHg2NSwgMHg0NiwgMHgyNiwgMHhGMiwgMHhGRiwgMHhGRiwgMHg2MCwgMHg0MSwgMHgwMCwgMHg3RiwgMHg2MCwgMHg0NSwKKwkgMHg2MSwgMHg0NywgMHgwMCwgMHg3RiwgMHhENCwgMHg4NCwgMHg2NiwgMHg0MSwgMHgyQiwgMHg0NiwgMHgwRSwgMHhGMiwgMHg2MCwgMHg0NSwgMHg2NSwgMHg1RSwKKwkgMHgwRSwgMHhGQSwgMHg2MSwgMHg0NiwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwgMHhDRCwgMHg4MSwgMHg3RiwgMHhCNCwgMHgwMiwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwMSwgMHg2NCwgMHgzMiwgMHgwMCwgMHgwNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwMiwgMHg2NCwgMHgyRSwgMHgwMCwgMHgwQiwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgwNCwgMHg2NCwgMHgyQSwgMHgwMCwgMHgxNiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgwOCwgMHg2NCwgMHgyNiwgMHgwMCwgMHgwQywgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHgxMCwgMHg2NCwgMHgyMiwgMHgwMCwgMHgxMiwgMHgzQSwgMHgwMiwgMHgwMCwgMHgyMCwgMHg2NCwgMHgxRSwgMHgwMCwgMHgxOCwgMHgzQSwgMHgwMiwgMHgwMCwKKwkgMHg0MCwgMHg2NCwgMHgxQSwgMHgwMCwgMHgyNCwgMHgzQSwgMHgwMiwgMHgwMCwgMHg4MCwgMHg2NCwgMHgxNiwgMHgwMCwgMHgzMCwgMHgzQSwgMHgwMywgMHgwMCwKKwkgMHgwMCwgMHg3RSwgMHgwMSwgMHg3RiwgMHgxMSwgMHgwMCwgMHg0OCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg3RSwgMHgwMiwgMHg3RiwgMHgwQywgMHgwMCwKKwkgMHg2MCwgMHgzQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg3RSwgMHgwNCwgMHg3RiwgMHgwNywgMHgwMCwgMHg2QywgMHgzQSwgMHgwMywgMHgwMCwgMHgwMCwgMHg3RSwKKwkgMHgwOCwgMHg3RiwgMHgwMiwgMHgwMCwgMHgwMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgyMCwgMHhGRSwgMHgyQSwgMHg0NSwgMHgzNCwgMHg4QSwgMHg2MCwgMHhGRSwKKwkgMHg2MSwgMHg0MCwgMHgwMCwgMHgzNiwgMHgwMiwgMHgwMCwgMHhCRCwgMHhEMywgMHhCRiwgMHgwMSwgMHgyRSwgMHg1OCwgMHhGRiwgMHhGRiwKKworfTsgIC8qIGZ3X2ltYWdlXzRfZGF0YSAqLworCitzdGF0aWMgY29uc3QgQ0ZHX0lERU5USVRZX1NUUkNUIGZ3X2ltYWdlX2luZm9pZGVudGl0eVtdID0geworCXsKKwkJc2l6ZW9mKCBDRkdfSURFTlRJVFlfU1RSQ1QgKSAvIHNpemVvZihoY2ZfMTYpIC0gMSwKKwkJQ0ZHX0ZXX0lERU5USVRZLAorCQlDT01QX0lEX0ZXX1NUQSwKKwkJNCwJCQkJCQkJLy9WYXJpYW50CisJCTEsCQkJCQkJCS8vTWFqb3IKKwkJMzYJCQkJCQkJLy9NaW5vcgorCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwIH0JCS8vZW5kc2VudGluZWwKK307CisKK3N0YXRpYyBjb25zdCBDRkdfUFJPR19TVFJDVCBmd19pbWFnZV9jb2RlW10gPSB7CisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweDAxODQsCQkvLyBzaXplb2YoZndfaW1hZ2VfMV9kYXRhKSwKKwkJMHgwMDAwMDA2MCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfMV9kYXRhCisJfSwKKwl7CisJCTgsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19WT0xBVElMRSwJCQkvLyBtb2RlCisJCTB4MmMwZSwJCS8vIHNpemVvZihmd19pbWFnZV8yX2RhdGEpLAorCQkweDAwMDAwQzE2LAkJCQkJLy8gVGFyZ2V0IGFkZHJlc3MgaW4gTklDIE1lbW9yeQorCQkweDAwMDAsCQkJCQkJLy8gQ1JDOiB5ZXMvbm8JVFlQRTogcHJpbWFyeS9zdGF0aW9uL3RlcnRpYXJ5CisJCShoY2ZfOCBGQVIgICAqKSBmd19pbWFnZV8yX2RhdGEKKwl9LAorCXsKKwkJOCwKKwkJQ0ZHX1BST0csCisJCUNGR19QUk9HX1ZPTEFUSUxFLAkJCS8vIG1vZGUKKwkJMHg1NGRlLAkJLy8gc2l6ZW9mKGZ3X2ltYWdlXzNfZGF0YSksCisJCTB4MDAxRTM4MjQsCQkJCQkvLyBUYXJnZXQgYWRkcmVzcyBpbiBOSUMgTWVtb3J5CisJCTB4MDAwMCwJCQkJCQkvLyBDUkM6IHllcy9ubwlUWVBFOiBwcmltYXJ5L3N0YXRpb24vdGVydGlhcnkKKwkJKGhjZl84IEZBUiAgICopIGZ3X2ltYWdlXzNfZGF0YQorCX0sCisJeworCQk4LAorCQlDRkdfUFJPRywKKwkJQ0ZHX1BST0dfVk9MQVRJTEUsCQkJLy8gbW9kZQorCQkweGJjZGUsCQkvLyBzaXplb2YoZndfaW1hZ2VfNF9kYXRhKSwKKwkJMHgwMDFGNDAwMCwJCQkJCS8vIFRhcmdldCBhZGRyZXNzIGluIE5JQyBNZW1vcnkKKwkJMHgwMDAwLAkJCQkJCS8vIENSQzogeWVzL25vCVRZUEU6IHByaW1hcnkvc3RhdGlvbi90ZXJ0aWFyeQorCQkoaGNmXzggRkFSICAgKikgZndfaW1hZ2VfNF9kYXRhCisJfSwKKwl7CisJCTUsCisJCUNGR19QUk9HLAorCQlDRkdfUFJPR19TVE9QLAkJCQkvLyBtb2RlCisJCTAwMDAsCisgCTB4MDAwRjQyOUIsCQkJCQkvLyBTdGFydCBleGVjdXRpb24gYWRkcmVzcworCX0sCisJeyAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwLCAwMDAwMDAwMCwgMDAwMCwgMDAwMDAwMDB9Cit9OworCitzdGF0aWMgY29uc3QgQ0ZHX1JBTkdFMjBfU1RSQ1QgZndfaW1hZ2VfaW5mb2NvbXBhdFtdID0geworCXsJMyArICgoMjAgKiBzaXplb2YoQ0ZHX1JBTkdFX1NQRUNfU1RSQ1QpKSAvIHNpemVvZihoY2ZfMTYpKSwKKwkJQ0ZHX0ZXX1NVUF9SQU5HRSwKKwkJQ09NUF9ST0xFX1NVUEwsCisJCUNPTVBfSURfU1RBLAorCQl7CisJCQl7IDQsIDEsIDIgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfTUZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX01GSSwKKwkJeworCQkJeyA3LCAzLCAzIH0sIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCQl7IDgsIDEsIDEgfSAgCQkJCS8vdmFyaWFudCwgYm90dG9tLCB0b3AKKwkJfQorCX0sCisJewkzICsgKCgyMCAqIHNpemVvZihDRkdfUkFOR0VfU1BFQ19TVFJDVCkpIC8gc2l6ZW9mKGhjZl8xNikpLAorCQlDRkdfQ0ZJX0FDVF9SQU5HRVNfU1RBLAorCQlDT01QX1JPTEVfQUNULAorCQlDT01QX0lEX0NGSSwKKwkJeworCQkJeyA0LCAxLCAyIH0gIAkJCQkvL3ZhcmlhbnQsIGJvdHRvbSwgdG9wCisJCX0KKwl9LAorCXsgMDAwMCwgMDAwMCwgMDAwMCwgMDAwMCwgeyB7IDAwMDAsIDAwMDAsIDAwMDAgfSB9IH0JLy9lbmRzZW50aW5lbAorfTsKKworbWVtaW1hZ2UgZndfaW1hZ2UgPSB7CisJIkZVUFU3RDM3ZGhmd2NpXDAwMUMiLAkJCS8vc2lnbmF0dXJlLCA8Zm9ybWF0IG51bWJlcj4sIEMvQmluIHR5cGUKKwkoQ0ZHX1BST0dfU1RSQ1QgKikgZndfaW1hZ2VfY29kZSwKKwkweDAwMEY0MjlCLAorCTAwMDAwMDAwLAkJCQkJLy8oZHVtbXkpIHBkYXBsdWcKKwkwMDAwMDAwMCwJCQkJCS8vKGR1bW15KSBwcmlwbHVnCisJKENGR19SQU5HRTIwX1NUUkNUICopIGZ3X2ltYWdlX2luZm9jb21wYXQsCisJKENGR19JREVOVElUWV9TVFJDVCAqKSBmd19pbWFnZV9pbmZvaWRlbnRpdHksCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTFhOGRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYwpAQCAtMCwwICsxLDcwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyBwcm9jZXNzaW5nIGFuZCBpbml0aWFsaXphdGlvbiBzcGVjaWZpYyB0byBDYXJkIFNlcnZpY2VzCisgKiAgIGRldmljZXMgKFBDTUNJQSwgQ0YpLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPGRlYnVnLmg+CisKKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxkaGYuaD4KKyNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfbWFpbi5oPgorI2luY2x1ZGUgPHdsX25ldGRldi5oPgorI2luY2x1ZGUgPHdsX2NzLmg+CisjaW5jbHVkZSA8d2xfc3lzZnMuaD4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIG1hY3JvIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IFwKKyAgICAgICAgICAgIH0gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2xvYmFsIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYgIC8qIERCRyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2F0dGFjaCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yCisgKiAgb25lIGRldmljZS4gVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIG5vbmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIHBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIGRldl9saW5rX3Qgc3RydWN0dXJlCisgKiAgICAgIE5VTEwgb24gZmFpbHVyZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdsX2FkYXB0ZXJfYXR0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldjsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZQkqbHA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2F0dGFjaCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIGRldiA9IHdsX2RldmljZV9hbGxvYygpOworICAgIGlmKGRldiA9PSBOVUxMKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIndsX2RldmljZV9hbGxvYyByZXR1cm5lZCBOVUxMXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgICAgICA9IEhDRl9OVU1fSU9fUE9SVFM7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgICAgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgICAgPSA2OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzICAgID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSAgICAgID0gSVJRX0lORk8yX1ZBTElEIHwgSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyICAgICAgID0gJndsX2lzcjsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgICA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgICAgICA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggID0gNTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgICAgICA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgbGluay0+cHJpdiA9IGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICBscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBscC0+bGluayA9IGxpbms7CisKKyAgICB3bF9hZGFwdGVyX2luc2VydChsaW5rKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9hZGFwdGVyX2F0dGFjaAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2RldGFjaCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aCBDYXJkCisgKiAgU2VydmljZXMuIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCB0aGVuIHRoZSBuZXQgZGV2aWNlIGlzIHVucmVnaXN0ZXJlZCwgYW5kCisgKiAgYWxsIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBhcmUgZnJlZWQuIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZQorICogIGZyZWVkIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxpbmsgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRldmljZSB0bworICogICAgICAgICAgICAgICAgZGV0YWNoCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2xfYWRhcHRlcl9kZXRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAqZGV2ID0gbGluay0+cHJpdjsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9kZXRhY2giICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAibGluayIsICIweCVwIiwgbGluayApOworCisgICAgd2xfYWRhcHRlcl9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGRldikgeworCXVucmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIH0KKworICAgIHdsX2RldmljZV9kZWFsbG9jKGRldik7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gd2xfYWRhcHRlcl9kZXRhY2gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfcmVsZWFzZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCB0aGlzIHJvdXRpbmUgd2lsbCByZWxlYXNlIHRoZSBQQ01DSUEKKyAqICBjb25maWd1cmF0aW9uLiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQKKyAqICBpcyBjbG9zZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBhcmcgLSBhIHVfbG9uZyByZXByZXNlbnRpbmcgYSBwb2ludGVyIHRvIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICBkZXZpY2UgdG8gYmUgcmVsZWFzZWQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9hZGFwdGVyX3JlbGVhc2UoIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rICkKK3sKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfcmVsZWFzZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJsaW5rIiwgIjB4JXAiLCBsaW5rKTsKKworICAgIC8qIFN0b3AgaGFyZHdhcmUgKi8KKyAgICB3bF9yZW1vdmUobGluay0+cHJpdik7CisKKyAgICBwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gd2xfYWRhcHRlcl9yZWxlYXNlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHdsX2FkYXB0ZXJfc3VzcGVuZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICAgIC8vaWYgKGxpbmstPm9wZW4pIHsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJd2xfc3VzcGVuZChkZXYpOworLy8vLyBDSEVDSyEgICAgICAgICAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgLy99CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfYWRhcHRlcl9zdXNwZW5kCisKK3N0YXRpYyBpbnQgd2xfYWRhcHRlcl9yZXN1bWUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwl3bF9yZXN1bWUoZGV2KTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goIGRldiApOworCisJcmV0dXJuIDA7Cit9IC8vIHdsX2FkYXB0ZXJfcmVzdW1lCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX2luc2VydCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIHdsX2FkYXB0ZXJfaW5zZXJ0KCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiAgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQorICogIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbGluayAgICAtIHBvaW50ZXIgdG8gdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgZGV2aWNlIHRvCisgKiAgICAgICAgICAgICAgICBpbnNlcnQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2FkYXB0ZXJfaW5zZXJ0KCBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayApCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKKyAgICBpbnQgaTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBsYXN0X2ZuLCBsYXN0X3JldDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5zZXJ0IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImxpbmsiLCAiMHglcCIsIGxpbmsgKTsKKworICAgIGRldiAgICAgPSBsaW5rLT5wcml2OworCisgICAgLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKworICAgIENTX0NIRUNLKFJlcXVlc3RJTywgcGNtY2lhX3JlcXVlc3RfaW8obGluaywgJmxpbmstPmlvKSk7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpKTsKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLCAmbGluay0+Y29uZikpOworCisKKyAgICBkZXYtPmlycSAgICAgICAgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgICAgZGV2LT5iYXNlX2FkZHIgID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihsaW5rKSk7CisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoIiVzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIsIE1PRFVMRV9OQU1FKTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgbGluay0+ZGV2X25vZGUgPSAmKCB3bF9wcml2KGRldikgKS0+bm9kZTsKKyAgICBzdHJjcHkoKCB3bF9wcml2KGRldikgKS0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKyAgICByZWdpc3Rlcl93bGFnc19zeXNmcyhkZXYpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdpcmVsZXNzLCBpb19hZGRyICUjMDNseCwgaXJxICVkLCAiIm1hY19hZGRyZXNzICIsCisgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisgICAgICAgIHByaW50aygiJTAyWCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpIDwgKEVUSF9BTEVOLTEpKSA/ICc6JyA6ICdcbicpKTsKKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47CisKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKCBsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCApOworCisKK2ZhaWxlZDoKKyAgICB3bF9hZGFwdGVyX3JlbGVhc2UoIGxpbmsgKTsKKworICAgIERCR19MRUFWRShEYmdJbmZvKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX2FkYXB0ZXJfaW5zZXJ0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9hZGFwdGVyX29wZW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBPcGVuIHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5ldHdvcmsKKyAqICAgICAgICAgICAgZGV2aWNlIHRvIG9wZW4uCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayA9IGxwLT5saW5rOworICAgIGludCAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgaW50ICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX29wZW4iICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX1BSSU5UKCAiJXNcbiIsIFZFUlNJT05fSU5GTyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisgICAgaWYoIXBjbWNpYV9kZXZfcHJlc2VudChsaW5rKSkKKyAgICB7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBsaW5rLT5vcGVuKys7CisKKyAgICBoY2Zfc3RhdHVzID0gd2xfb3BlbiggZGV2ICk7CisKKyAgICBpZiggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgbGluay0+b3Blbi0tOworICAgICAgICByZXN1bHQgPSAtRU5PREVWOworICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIHdsX2FkYXB0ZXJfb3BlbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9jbG9zZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENsb3NlIHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIG5ldHdvcmsKKyAqICAgICAgICAgICAgZGV2aWNlIHRvIGNsb3NlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfY2xvc2UiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2ICk7CisKKyAgICBpZiggbGluayA9PSBOVUxMICkgeworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiJXM6IFNodXR0aW5nIGRvd24gYWRhcHRlci5cbiIsIGRldi0+bmFtZSApOworICAgIHdsX2Nsb3NlKCBkZXYgKTsKKworICAgIGxpbmstPm9wZW4tLTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9hZGFwdGVyX2Nsb3NlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgd2xfYWRhcHRlcl9pZHNbXSA9IHsKKyNpZiAhICgoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSkKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNTYsIDB4MDAwMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFnZXJlIFN5c3RlbXMiLCAiV2lyZWxlc3MgUEMgQ2FyZCBNb2RlbCAwMTEwIiwKKwkJCSAgICAweDMzMTAzYTliLCAweGUxNzViMGRkKSwKKyNlbHNlCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMaW5rc3lzIiwgIldDRjU0R19XaXJlbGVzcy1HX0NvbXBhY3RGbGFzaF9DYXJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA3MzNjYzgxLCAweDk4YTU5OWUxKSwKKyNlbmRpZiAgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKKwlQQ01DSUFfREVWSUNFX05VTEwsCisJfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB3bF9hZGFwdGVyX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3bGFnczQ5X2RyaXZlciA9IHsKKyAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKKyAgICAuZHJ2ICAgICAgICAgICAgPSB7CisJLm5hbWUgICA9IERSSVZFUl9OQU1FLAorICAgIH0sCisgICAgLnByb2JlCT0gd2xfYWRhcHRlcl9hdHRhY2gsCisgICAgLnJlbW92ZQk9IHdsX2FkYXB0ZXJfZGV0YWNoLAorICAgIC5pZF90YWJsZQk9IHdsX2FkYXB0ZXJfaWRzLAorICAgIC5zdXNwZW5kCT0gd2xfYWRhcHRlcl9zdXNwZW5kLAorICAgIC5yZXN1bWUJPSB3bF9hZGFwdGVyX3Jlc3VtZSwKK307CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9pbml0X21vZHVsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSBpbml0X21vZHVsZSgpIHRvIHBlcmZvcm0gUENNQ0lBIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIC0xIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCB2b2lkICkKK3sKKyAgICBpbnQgcmV0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKSAtLSBQQ01DSUFcbiIgKTsKKworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJndsYWdzNDlfZHJpdmVyKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiByZXQ7Cit9IC8vIHdsX2FkYXB0ZXJfaW5pdF9tb2R1bGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgY2xlYW51cF9tb2R1bGUoKSB0byBwZXJmb3JtIGRyaXZlciB1bmluaXRpYWxpemF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICkKK3sKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpIC0tIFBDTUNJQVxuIiApOworCisKKyAgICBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsYWdzNDlfZHJpdmVyKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9pc19vcGVuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2hlY2sgd2l0aCBDYXJkIFNlcnZpY2VzIHRvIGRldGVybWluZSBpZiB0aGlzIGRldmljZSBpcyBvcGVuLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSB3aG9zZSBvcGVuIHN0YXR1cyB3aWxsIGJlCisgKiAgICAgICAgICAgIGNoZWNrZWQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIG5vbnplcm8gaWYgZGV2aWNlIGlzIG9wZW4KKyAqICAgICAgMCBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfaXNfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gbHAtPmxpbms7CisKKyAgICBpZighcGNtY2lhX2Rldl9wcmVzZW50KGxpbmspKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiggbGluay0+b3BlbiApOworfSAvLyB3bF9hZGFwdGVyX2lzX29wZW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworI2lmIERCRworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRGJnRXZlbnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDb252ZXJ0cyB0aGUgY2FyZCBzZXJpdmNlcyBldmVudHMgdG8gdGV4dCBmb3IgZGVidWdnaW5nLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbWFzayAgICAtIGEgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGVycm9yKHMpIGJlaW5nIHJlcG9ydGVkIGJ5IENhcmQKKyAqICAgICAgICAgICAgICAgIFNlcnZpY2VzLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yKHMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IGNoYXIqIERiZ0V2ZW50KCBpbnQgbWFzayApCit7CisgICAgc3RhdGljIGNoYXIgRGJnQnVmZmVyWzI1Nl07CisgICAgY2hhciAqcEJ1ZjsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIHBCdWYgICAgPSBEYmdCdWZmZXI7CisgICAgKnBCdWYgICA9ICdcMCc7CisKKworICAgIGlmKCBtYXNrICYgQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCApCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIldSSVRFX1BST1RFQ1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfTE9DSykKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9MT0NLICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9JTlNFUlRJT04gIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0FSRF9SRU1PVkFMICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9CQVRURVJZX0RFQUQpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkJBVFRFUllfREVBRCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9MT1cpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkJBVFRFUllfTE9XICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRUFEWV9DSEFOR0UpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlJFQURZX0NIQU5HRSAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfQ0FSRF9ERVRFQ1QpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfREVURUNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9SRVFVRVNUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJSRVNFVF9SRVFVRVNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVTRVRfUEhZU0lDQUwgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0NBUkRfUkVTRVQpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkNBUkRfUkVTRVQgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVHSVNUUkFUSU9OX0NPTVBMRVRFICIgKTsKKworICAgIC8vIGlmKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9DT01QTEVURSkKKyAgICAvLyAgICAgc3RyY2F0KCBwQnVmLCAiUkVTRVRfQ09NUExFVEUgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1BNX1NVU1BFTkQpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIlBNX1NVU1BFTkQgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX1BNX1JFU1VNRSkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUE1fUkVTVU1FICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9JTlNFUlRJT05fUkVRVUVTVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiSU5TRVJUSU9OX1JFUVVFU1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0VKRUNUSU9OX1JFUVVFU1QpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkVKRUNUSU9OX1JFUVVFU1QgIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX01URF9SRVFVRVNUKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJNVERfUkVRVUVTVCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfRVJBU0VfQ09NUExFVEUpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIkVSQVNFX0NPTVBMRVRFICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF9SRVFVRVNUX0FUVEVOVElPTikKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiUkVRVUVTVF9BVFRFTlRJT04gIiApOworCisgICAgaWYobWFzayAmIENTX0VWRU5UX0NCX0RFVEVDVCkKKyAgICAgICAgc3RyY2F0KCBwQnVmLCAiQ0JfREVURUNUICIgKTsKKworICAgIGlmKG1hc2sgJiBDU19FVkVOVF8zVkNBUkQpCisgICAgICAgIHN0cmNhdCggcEJ1ZiwgIjNWQ0FSRCAiICk7CisKKyAgICBpZihtYXNrICYgQ1NfRVZFTlRfWFZDQVJEKQorICAgICAgICBzdHJjYXQoIHBCdWYsICJYVkNBUkQgIiApOworCisKKyAgICBpZiggKnBCdWYgKSB7CisgICAgICAgIHBCdWZbc3RybGVuKHBCdWYpIC0gMV0gPSAnXDAnOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBtYXNrICE9IDB4MCApIHsKKyAgICAgICAgICAgIHNwcmludGYoIHBCdWYsICI8PDB4JTA4eD4+IiwgbWFzayApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBCdWY7Cit9IC8vIERiZ0V2ZW50CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgIC8qIERCRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwZTY3NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmgKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgUENNQ0lBLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9DU19IX18KKyNkZWZpbmUgX19XTF9DU19IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3lwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgd2xfYWRhcHRlcl9pbnNlcnQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspOworCit2b2lkIHdsX2FkYXB0ZXJfcmVsZWFzZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7CisKK2ludCB3bF9hZGFwdGVyX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzICk7CisKK2ludCB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCB2b2lkICk7CisKK3ZvaWQgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggdm9pZCApOworCitpbnQgd2xfYWRhcHRlcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgd2xfYWRhcHRlcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworaW50IHdsX2FkYXB0ZXJfaXNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKK3ZvaWQgY3NfZXJyb3IoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW50IGZ1bmMsIGludCByZXQpOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKkRiZ0V2ZW50KCBpbnQgbWFzayApOworCisKKworI2VuZGlmICAvLyBfX1dMX0NTX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM0NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfZW5jLmMKQEAgLTAsMCArMSwyMzEgQEAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9ucyByZWxhdGVkIHRvIFdFUCBrZXkgY29kaW5nL2RlY29kaW5nLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhjZi5oPgorCisjaW5jbHVkZSA8d2xfZW5jLmg+CisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2xvYmFsIGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKworI2VuZGlmICAvKiBEQkcgKi8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dlcF9jb2RlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIGEgc2V0IG9mIHdlcCBrZXlzIGZvciBwcml2YWN5CisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBzekNyeXB0IC0KKyAqICAgICAgc3pEZXN0ICAtCisgKiAgICAgIERhdGEgICAgLQorICogICAgICBuTGVuICAgIC0KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE9LCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF93ZXBfY29kZSggY2hhciAqc3pDcnlwdCwgY2hhciAqc3pEZXN0LCB2b2lkICpEYXRhLCBpbnQgbkxlbiApCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgdDsKKyAgICBpbnQgICAgIGsgOworICAgIGNoYXIgICAgYml0czsKKyAgICBjaGFyICAgICpzekRhdGEgPSAoY2hhciAqKSBEYXRhOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgZm9yKCBpID0gYml0cyA9IDAgOyBpIDwgTUFDQUREUkVTU19TVFJfTEVOOyBpKysgKSB7CisJICAgIGJpdHMgXj0gc3pDcnlwdFtpXTsKKwkgICAgYml0cyArPSBzekNyeXB0W2ldOworICAgIH0KKworICAgIGZvciggaSA9IHQgPSAqc3pEZXN0ID0gMDsgaSA8IG5MZW47IGkrKywgdCsrICkgeworCSAgICBrID0gc3pEYXRhW2ldIF4gKCBiaXRzICsgaSApOworCisKKyAgICAgICAgc3dpdGNoKCBpICUgMyApIHsKKworICAgICAgICBjYXNlIDAgOgorCisgICAgICAgICAgICBzekRlc3RbdF0gICA9ICgoayAmIDB4RkMpID4+IDIpICsgQ0hfU1RBUlQgOworCQkJc3pEZXN0W3QrMV0gPSAoKGsgJiAweDAzKSA8PCA0KSArIENIX1NUQVJUIDsKKwkgICAgICAgIHN6RGVzdFt0KzJdID0gJ1wwJzsKKworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIDEgOgorCisgICAgICAgICAgICBzekRlc3RbdF0gICs9ICgoIGsgJiAweEYwICkgPj4gNCApOworCQkJc3pEZXN0W3QrMV0gPSAoKCBrICYgMHgwRiApIDw8IDIgKSArIENIX1NUQVJUIDsKKwkgICAgICAgIHN6RGVzdFt0KzJdID0gJ1wwJzsKKworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIDIgOgorCisgICAgICAgICAgICBzekRlc3RbdF0gICs9ICgoIGsgJiAweEMwICkgPj4gNiApOworCQkJc3pEZXN0W3QrMV0gPSAoIGsgJiAweDNGICkgKyBDSF9TVEFSVCA7CisJICAgICAgICBzekRlc3RbdCsyXSA9ICdcMCc7CisJICAgICAgICB0Kys7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKCBzdHJsZW4oIHN6RGVzdCApKSA7CisKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXBfZGVjb2RlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGEgc2V0IG9mIFdFUCBrZXlzIGZvciB1c2UgYnkgdGhlIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBzekNyeXB0IC0KKyAqICAgICAgc3pEZXN0ICAtCisgKiAgICAgIERhdGEgICAgLQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgT0sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3dlcF9kZWNvZGUoIGNoYXIgKnN6Q3J5cHQsIHZvaWQgKkRlc3QsIGNoYXIgKnN6RGF0YSApCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgdDsKKyAgICBpbnQgICAgIG5MZW47CisgICAgY2hhciAgICBiaXRzOworICAgIGNoYXIgICAgKnN6RGVzdCA9IERlc3Q7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgIGZvciggaSA9IGJpdHMgPSAwIDsgaSA8IDEyOyBpKysgKSB7CisgICAgICBiaXRzIF49IHN6Q3J5cHRbaV0gOworICAgICAgYml0cyArPSBzekNyeXB0W2ldIDsKKyAgfQorCisgIG5MZW4gPSAoIHN0cmxlbiggc3pEYXRhICkgKiAzKSAvIDQgOworCisgIGZvciggaSA9IHQgPSAwOyBpIDwgbkxlbjsgaSsrLCB0KysgKSB7CisgICAgICBzd2l0Y2goIGkgJSAzICkgeworICAgICAgY2FzZSAwIDoKKworICAgICAgICAgIHN6RGVzdFtpXSA9ICgoKCBzekRhdGFbdF0tQ0hfU1RBUlQgKSAmIDB4M2YgKSA8PCAyICkgKworICAgICAgICAgICAgICAgICAgICAgICgoKCBzekRhdGFbdCsxXS1DSF9TVEFSVCApICYgMHgzMCApID4+IDQgKTsKKwkgICAgICBicmVhazsKKworCisgICAgICBjYXNlIDEgOgorICAgICAgICAgIHN6RGVzdFtpXSA9ICgoKCBzekRhdGFbdF0tQ0hfU1RBUlQgKSAmIDB4MGYgKSA8PCA0ICkgKworICAgICAgICAgICAgICAgICAgICAgICgoKCBzekRhdGFbdCsxXS1DSF9TVEFSVCApICYgMHgzYyApID4+IDIgKTsKKwkgICAgICBicmVhazsKKworCisgICAgICBjYXNlIDIgOgorICAgICAgICAgIHN6RGVzdFtpXSA9ICgoKCBzekRhdGFbdF0tQ0hfU1RBUlQgKSAmIDB4MDMgKSA8PCA2ICkgKworICAgICAgICAgICAgICAgICAgICAgICAoKCBzekRhdGFbdCsxXS1DSF9TVEFSVCApICYgMHgzZiApOworCSAgICAgIHQrKzsKKwkgICAgICBicmVhazsKKyAgICAgIH0KKworCXN6RGVzdFtpXSBePSAoIGJpdHMgKyBpICkgOworCisgIH0KKworICByZXR1cm4oIGkgKSA7CisKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2VuYy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmNTRkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2VuYy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgSGVhZGVyIGZvciBwZXJmb3JtaW5nIGNvZGluZy9kZWNvZGluZyBvZiB0aGUgV0VQIGtleXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dBVkVMQU4yX0VOQ1JZUFRJT05fSF9fCisjZGVmaW5lIF9fV0FWRUxBTjJfRU5DUllQVElPTl9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDUllQVF9DT0RFCQkJCQkiNTc2MTc2NjVBNUQ2IgorI2RlZmluZSBFTkNSWVBUSU9OX0xFTgkJCQkxMDIKKyNkZWZpbmUgRU5DUllQVElPTl9NQUdJQwkJCTB4NDg1NzY4NzdMCS8vIEhXaHcKKyNkZWZpbmUgREVGX0NSWVBUX1NUUgkJCQkiRz9USVVFQV1kNU1BZFpWJ2VVYiYmNi4pJyY6LCdWRi8oRlIyKTZeNSonKjgqVzY7K0dCPiw3TkEtJ1pELVgmRy5IMkovOD5NMChKUDBYVlMxSGJWMjkuWTMpOlxcM1lGXzRJUmI1NiIKKworI2RlZmluZSBERUZBVUxUX0NSWVBUX01BQwkJCSJXXHgwMVx4NkJceDY2XHhBNVx4NUEiCisjZGVmaW5lIENIX1NUQVJUCQkJCQknJicKKyNkZWZpbmUgTUFDQUREUkVTU19TVFJfTEVOCQkJMTIKKworI2RlZmluZSBLRVlfTEVOICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgTlVNX0tFWVMgICAgICAgICAgICAgICAgICAgIDQKKworI2RlZmluZSBLRVlfTEVOR1RIX05PTkVfQVNDSUkgICAgICAgMAorI2RlZmluZSBLRVlfTEVOR1RIXzY0X0JJVF9BU0NJSSAgICAgNQorI2RlZmluZSBLRVlfTEVOR1RIXzEyOF9CSVRfQVNDSUkgICAgMTMKKworI2RlZmluZSBLRVlfTEVOR1RIX05PTkVfSEVYICAgICAgICAgKCBLRVlfTEVOR1RIX05PTkVfQVNDSUkgICAgKiBzaXplb2YoIHVuc2lnbmVkIHNob3J0ICkpCisjZGVmaW5lIEtFWV9MRU5HVEhfNjRfQklUX0hFWCAgICAgICAoIEtFWV9MRU5HVEhfNjRfQklUX0FTQ0lJICAqIHNpemVvZiggdW5zaWduZWQgc2hvcnQgKSkKKyNkZWZpbmUgS0VZX0xFTkdUSF8xMjhfQklUX0hFWCAgICAgICggS0VZX0xFTkdUSF8xMjhfQklUX0FTQ0lJICogc2l6ZW9mKCB1bnNpZ25lZCBzaG9ydCApKQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdHlwZSBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IF9lbmNzdGN0Cit7CisJaGNmXzMyCSAgICAgICAgICAgICAgICAgICBkd01hZ2ljOworCWhjZl8xNgkgICAgICAgICAgICAgICAgICAgd1R4S2V5SUQ7CisJaGNmXzE2CSAgICAgICAgICAgICAgICAgICB3RW5hYmxlZDsKKwlDRkdfREVGQVVMVF9LRVlTX1NUUkNUICAgICBFbmNTdHI7Cit9CitFTkNTVFJDVCwgKlBFTkNTVFJDVDsKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZ1bmN0aW9uIHBycm90dHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfd2VwX2NvZGUoIGNoYXIgKnN6Q3J5cHQsIGNoYXIgKnN6RGVzdCwgdm9pZCAqRGF0YSwgaW50IG5MZW4gKTsKKworaW50IHdsX3dlcF9kZWNvZGUoIGNoYXIgKnN6Q3J5cHQsIHZvaWQgKkRlc3QsIGNoYXIgKnN6RGF0YSApOworCisKKworCisjZW5kaWYgIC8vIF9fV0FWRUxBTjJfRU5DUllQVElPTl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2lmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmI0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pZi5oCkBAIC0wLDAgKzEsMjM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgRHJpdmVyIGNvbW1vbiBoZWFkZXIgZm9yIGluZm8gbmVlZGVkIGJ5IGRyaXZlciBzb3VyY2UgYW5kIHVzZXItc3BhY2UKKyAqICAgcHJvY2Vzc2VzIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgZHJpdmVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XQVZFTEFOMl9JRl9IX18KKyNkZWZpbmUgX19XQVZFTEFOMl9JRl9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTUFYX0xUVl9CVUZfU0laRSAgICAgICAgICAgICg1MTIgLSAoc2l6ZW9mKGhjZl8xNikgKiAyKSkKKworI2RlZmluZSBIQ0ZfVEFMTElFU19TSVpFICAgICAgICAgICAgKHNpemVvZihDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoaGNmXzE2KSAqIDIpKQorCisjZGVmaW5lIEhDRl9NQVhfTVVMVElDQVNUICAgICAgICAgICAxNgorI2RlZmluZSBIQ0ZfTUFYX05BTUVfTEVOICAgICAgICAgICAgMzIKKyNkZWZpbmUgTUFYX0xJTkVfU0laRSAgIAkJCTI1NgorI2RlZmluZSBIQ0ZfTlVNX0lPX1BPUlRTICAgICAgICAgICAgMHg4MAorI2RlZmluZSBUWF9USU1FT1VUICAgICAgICAgICAgICAgICAgKCg4MDAgKiBIWikgLyAxMDAwKQorCisKKy8vI2RlZmluZSBIQ0ZfTUlOX0NPTU1fUVVBTElUWSAgICAgICAgMAorLy8jZGVmaW5lIEhDRl9NQVhfQ09NTV9RVUFMSVRZICAgICAgICA5MgorLy8jZGVmaW5lIEhDRl9NSU5fU0lHTkFMX0xFVkVMICAgICAgICA0NworLy8jZGVmaW5lIEhDRl9NQVhfU0lHTkFMX0xFVkVMICAgICAgICAxMzgKKy8vI2RlZmluZSBIQ0ZfTUlOX05PSVNFX0xFVkVMICAgICAgICAgNDcKKy8vI2RlZmluZSBIQ0ZfTUFYX05PSVNFX0xFVkVMICAgICAgICAgMTM4CisvLyNkZWZpbmUgSENGXzBEQk1fT0ZGU0VUICAgICAgICAgICAgIDE0OQorCisvLyBQRTFETk4KKy8vIEJldHRlciBkYXRhIGZyb20gdGhlIHJlYWwgd29ybGQuIE5vdCBzY2llbnRpZmljIGJ1dCBlbXBpcmljYWwgZGF0YSBnYXRoZXJlZAorLy8gZnJvbSBhIFRob21zb24gU3BlZWR0b3VjaCAxMTAgd2hpY2ggaXMgaWRlbnRpZmllZCBhczoKKy8vIFBDTUNJQSBJbmZvOiAiQWdlcmUgU3lzdGVtcyIgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIKKy8vICAgICAgICAgICAgICBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDAzCisvLyBMb3dlc3QgbWVhc3VybWVudCBmb3Igbm9pc2UgZmxvb3Igc2VlbiBpcyB2YWx1ZSA1NAorLy8gSGlnaGVzdCBzaWduYWwgc3RyZW5ndGggaW4gY2xvc2UgcHJveGltaXR5IHRvIHRoZSBBUCBzZWVuIGlzIHZhbHVlIDExOAorLy8gVmVyeSBnb29kIG11c3QgYmUgYXJyb3VuZCAxMDAgKG90aGVyd2lzZSBpdHMgbmV2ZXIgImZ1bGwgc2NhbGUiCisvLyBBbGwgb3RoZXIgY29uc3RhbnRzIGFyZSBkZXJyaXZlZCBmcm9tIHRoZXNlLiBUaGlzIG1ha2VzIHRoZSBzaWduYWwgZ2F1Z2UKKy8vIHdvcmsgZm9yIG1lLi4uCisjZGVmaW5lIEhDRl9NSU5fU0lHTkFMX0xFVkVMICAgICAgICA1NAorI2RlZmluZSBIQ0ZfTUFYX1NJR05BTF9MRVZFTCAgICAgICAgMTAwCisjZGVmaW5lIEhDRl9NSU5fTk9JU0VfTEVWRUwgICAgICAgICBIQ0ZfTUlOX1NJR05BTF9MRVZFTAorI2RlZmluZSBIQ0ZfTUFYX05PSVNFX0xFVkVMICAgICAgICAgSENGX01BWF9TSUdOQUxfTEVWRUwKKyNkZWZpbmUgSENGXzBEQk1fT0ZGU0VUICAgICAgICAgICAgIChIQ0ZfTUFYX1NJR05BTF9MRVZFTCArIDEpCisjZGVmaW5lIEhDRl9NSU5fQ09NTV9RVUFMSVRZICAgICAgICAwCisjZGVmaW5lIEhDRl9NQVhfQ09NTV9RVUFMSVRZICAgICAgICAoSENGX01BWF9TSUdOQUxfTEVWRUwgLSBIQ0ZfTUlOX05PSVNFX0xFVkVMICsgMSkKKworCisvKiBGb3IgZW5jcnlwdGlvbiAoV0VQKSAqLworI2RlZmluZSBNSU5fS0VZX1NJWkUgICAgICAgICAgICAgICAgNSAgICAgICAvLyA0MCBiaXRzIFJDNCAtIFdFUAorI2RlZmluZSBNQVhfS0VZX1NJWkUgICAgICAgICAgICAgICAgMTMgICAgICAvLyAxMDQgYml0cworI2RlZmluZSBNQVhfS0VZUyAgICAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIFJBRElPX0NIQU5ORUxTICAgICAgICAgICAgICAxNAorI2RlZmluZSBSQURJT19TRU5TSVRJVklUWV9MRVZFTFMgICAgMworI2RlZmluZSBSQURJT19UWF9QT1dFUl9NV0FUVCAgICAgICAgMzIKKyNkZWZpbmUgUkFESU9fVFhfUE9XRVJfREJNICAgICAgICAgIDE1CisKKyNkZWZpbmUgTUlOX1JUU19CWVRFUyAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFYX1JUU19CWVRFUyAgICAgICAgICAgICAgIDIzNDcKKworI2RlZmluZSBNQVhfUkFURVMgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBNRUdBQklUICAgICAgICAgICAgICAgICAgICAgMTAyNCoxMDI0CisKKyNkZWZpbmUgSENGX0ZBSUxVUkUgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgVUlMX0ZBSUxVUkUJCSAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgQ0ZHX1VJTF9DT05ORUNUICAgICAgICAgICAgIDB4QTEyMyAgICAgICAgICAvLyBEZWZpbmUgZGlmZmVyZW50bHk/CisjZGVmaW5lIENGR19VSUxfQ09OTkVDVF9BQ0tfQ09ERSAgICAweDU2NTM0MzVBICAgICAgLy8gVlNDWgorI2RlZmluZSBXVkxBTjJfVUlMX0NPTk5FQ1RFRCAgICAgICAgKDB4MDFMIDw8IDApCisjZGVmaW5lIFdWTEFOMl9VSUxfQlVTWSAgICAgICAgICAgICAoMHgwMUwgPDwgMSkKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRyaXZlciBpb2N0bCBpbnRlcmZhY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdWTEFOMl9JT0NUTF9VSUwgICAgICAgICAgICBTSU9DREVWUFJJVkFURQorCisvKiBUaGUgVUlMIEludGVyZmFjZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFdWTEFOMl9JT0NUTF9VSUwgY29kZSBhYm92ZQorICAgaXMgZGVmaW5lZCBpbiBtZGQuaC4gQSBxdWljayByZWZlcmVuY2Ugb2YgdGhlIFVJTCBjb2RlcyBpcyBsaXN0ZWQgYmVsb3cgKi8KKy8qCitVSUxfRlVOX0NPTk5FQ1QKK1VJTF9GVU5fRElTQ09OTkVDVAorVUlMX0ZVTl9BQ1RJT04KKyAgICBVSUxfQUNUX0JMT0NLCisgICAgVUlMX0FDVF9VTkJMT0NLCisgICAgVUlMX0FDVF9TQ0EKKyAgICBVSUxfQUNUX0RJQUcKKyAgICBVSUxfQUNUX0FQUExZCitVSUxfRlVOX1NFTkRfRElBR19NU0cKK1VJTF9GVU5fR0VUX0lORk8KK1VJTF9GVU5fUFVUX0lORk8KKyovCisKKyNkZWZpbmUgU0lPQ1NJV05FVE5BTUUgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzEKKyNkZWZpbmUgU0lPQ0dJV05FVE5BTUUgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzIKKyNkZWZpbmUgU0lPQ1NJV1NUQU5BTUUgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzMKKyNkZWZpbmUgU0lPQ0dJV1NUQU5BTUUgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzQKKyNkZWZpbmUgU0lPQ1NJV1BPUlRUWVBFICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzUKKyNkZWZpbmUgU0lPQ0dJV1BPUlRUWVBFICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzYKKworLyogSU9DVEwgY29kZSBmb3IgdGhlIFJUUyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgV0xfSU9DVExfUlRTICAgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzcKKworLyogSU9DVEwgc3ViY29kZXMgZm9yIFdMX0lPQ1RMX1JUUyAqLworI2RlZmluZSBXTF9JT0NUTF9SVFNfUkVBRCAgICAgICAgICAgMQorI2RlZmluZSBXTF9JT0NUTF9SVFNfV1JJVEUgICAgICAgICAgMgorI2RlZmluZSBXTF9JT0NUTF9SVFNfQkFUQ0hfUkVBRCAgICAgMworI2RlZmluZSBXTF9JT0NUTF9SVFNfQkFUQ0hfV1JJVEUgICAgNAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTVFJVQ1RVUkUgREVGSU5JVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAoreworICAgIF9fdTE2ICAgbGVuZ3RoOworICAgIF9fdTggICAgbmFtZVtIQ0ZfTUFYX05BTUVfTEVOXTsKK30KK3d2TmFtZV90OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaGNmXzE2ICAgICAgbGVuOworICAgIGhjZl8xNiAgICAgIHR5cDsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgaGNmXzggICAgICAgdThbTUFYX0xUVl9CVUZfU0laRSAvIHNpemVvZihoY2ZfOCldOworICAgICAgICBoY2ZfMTYgICAgICB1MTZbTUFYX0xUVl9CVUZfU0laRSAvIHNpemVvZihoY2ZfMTYpXTsKKyAgICAgICAgaGNmXzMyICAgICAgdTMyW01BWF9MVFZfQlVGX1NJWkUgLyBzaXplb2YoaGNmXzMyKV07CisgICAgfSB1OworfQorbHR2X3Q7CisKKworc3RydWN0IHVpbHJlcQoreworICAgIHVuaW9uCisgICAgeworICAgICAgICBjaGFyICAgIGlmcm5fbmFtZVtJRk5BTVNJWl07CisgICAgfSBpZnJfaWZybjsKKworICAgIElGQlAgICAgICAgIGhjZkN0eDsKKyAgICBfX3U4ICAgICAgICBjb21tYW5kOworICAgIF9fdTggICAgICAgIHJlc3VsdDsKKworICAgIC8qIFRoZSBkYXRhIGZpZWxkIGluIHRoaXMgc3RydWN0dXJlIGlzIHR5cGljYWxseSBhbiBMVFYgb2Ygc29tZSB0eXBlLiBUaGUKKyAgICAgICBsZW4gZmllbGQgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcywgYXMgb3Bwb3NlZCB0byB3b3JkcyAobGlrZQorICAgICAgIHRoZSBMLWZpZWxkIGluIHRoZSBMVFYgKi8KKyAgICBfX3UxNiAgICAgICBsZW47CisgICAgdm9pZCAgICAgICAqZGF0YTsKK307CisKKworc3RydWN0IHJ0c3JlcQoreworICAgIHVuaW9uCisgICAgeworICAgICAgICBjaGFyICAgIGlmcm5fbmFtZVtJRk5BTVNJWl07CisgICAgfQorICAgIGlmcl9pZnJuOworCisgICAgX191MTYgICB0eXA7CisgICAgX191MTYgICByZWc7CisgICAgX191MTYgICBsZW47CisgICAgX191MTYgICAqZGF0YTsKK307CisKKworI2VuZGlmICAvLyBfX1dBVkVMQU4yX0lGX0hfXworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZmYjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaApAQCAtMCwwICsxLDEwNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZm9yIGRlZmludGlvbnMgYW5kIG1hY3JvcyBpbnRlcm5hbCB0byB0aGUgZHJ2aWVyLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XQVZFTEFOMl9IX18KKyNkZWZpbmUgX19XQVZFTEFOMl9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZmRlZiBCVVNfUENNQ0lBCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI3KQorI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjZW5kaWYgIC8vIEJVU19QQ01DSUEKKworI2lmZGVmIEhBU19XSVJFTEVTU19FWFRFTlNJT05TCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpZiBXSVJFTEVTU19FWFQgPiAxMworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID4gMTMKKyNkZWZpbmUgVVNFX0RCTQorI2RlZmluZSBSRVRVUk5fQ1VSUkVOVF9ORVRXT1JLTkFNRQorI2RlZmluZSBVU0VfRlJFUVVFTkNZCisjZW5kaWYgLy8gSEFTX1dJUkVMRVNTX0VYVEVOU0lPTlMvCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgcF91OCAgICBfX3U4CisjZGVmaW5lIHBfczggICAgX19zOAorI2RlZmluZSBwX3UxNiAgIF9fdTE2CisjZGVmaW5lIHBfczE2ICAgX19zMTYKKyNkZWZpbmUgcF91MzIgICBfX3UzMgorI2RlZmluZSBwX3MzMiAgIF9fczMyCisjZGVmaW5lIHBfY2hhciAgY2hhcgorCisjZGVmaW5lIE1BWF9LRVlfTEVOICAgICAgICAgKDIgKyAoMTMgKiAyKSkgLy8gMHggcGx1cyAxMyBoZXggZGlnaXQgcGFpcnMKKyNkZWZpbmUgTUJfU0laRSAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIE1BWF9FTkNfTEVOICAgICAgICAgMTA0CisKKyNkZWZpbmUgTUFYX1NDQU5fVElNRV9TRUMgICA4CisjZGVmaW5lIE1BWF9OQVBTICAgICAgICAgICAgMzIKKworI2RlZmluZSBDRkdfTUJfSU5GTyAgICAgICAgIDB4MDgyMAkJLy9NYWlsIEJveCBJbmZvIEJsb2NrCisKKyNkZWZpbmUgTlVNX1dEU19QT1JUUyAgICAgICA2CisKKyNkZWZpbmUgV1ZMQU5fTUFYX0xPT0tBSEVBRCAoSENGX01BWF9NU0crNDYpIC8qIGFzIHBlciBzMDAwNU1JQ180LmRvYyAqLworCisKKy8qIE1pbi9NYXgvRGVmYXVsdCBQYXJhbWV0ZXIgVmFsdWVzICovCisjaWYgMCAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorLy87PyB3aHkgdGhpcyBkaWZmZXJlbmNlIGRlcGVuZGluZyBvbiBjb21waWxlIG9wdGlvbiwgc2VlbXMgdG8gbWUgaXQgc2hvdWxkIGRlcGVuZCBvbiBydW50aW1lIGlmIGFueXRoaW5nCisjZGVmaW5lIFBBUk1fREVGQVVMVF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAiTGludXhBUCIKKyNlbHNlCisjZGVmaW5lIFBBUk1fREVGQVVMVF9TU0lEICAgICAgICAgICAgICAgICAgICAgICAiQU5ZIgorI2VuZGlmIC8vIEhDRl9UWVBFX0FQCisKKyNkZWZpbmUgUEFSTV9NSU5fTkFNRV9MRU4gICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfTkFNRV9MRU4gICAgICAgICAgICAgICAgICAgICAgIDMyCisKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBwZXJ0YWluIHRvIG1vZHVsZSBhbmQgcHJvZmlsZSBwYXJhbWV0ZXJzICovCisvLyAjZGVmaW5lIFBBUk1fQVBfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUE1vZGUKKy8vICNkZWZpbmUgUEFSTV9OQU1FX0FQX01PREUJCQkJCQlURVhUKCJBUE1vZGUiKQorLy8gI2RlZmluZSBQQVJNX0RFRkFVTFRfQVBfTU9ERQkJCQkJRkFMU0UKKworI2RlZmluZSBQQVJNX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OCQkJCVRFWFQoIkF1dGhlbnRpY2F0aW9uIikKKyNkZWZpbmUgUEFSTV9NSU5fQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0FVVEhFTlRJQ0FUSU9OICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgICAgICAgICAgICAgICAgQXV0aEtleU1nbXRTdWl0ZQorI2RlZmluZSBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSAgICAgICAgICAgVEVYVCgiQXV0aEtleU1nbXRTdWl0ZSIpCisjZGVmaW5lIFBBUk1fTUlOX0FVVEhfS0VZX01HTVRfU1VJVEUgICAgICAgICAgICAwCisjZGVmaW5lIFBBUk1fTUFYX0FVVEhfS0VZX01HTVRfU1VJVEUgICAgICAgICAgICA0CisjZGVmaW5lIFBBUk1fREVGQVVMVF9BVVRIX0tFWV9NR01UX1NVSVRFICAgICAgICAwCisKKyNkZWZpbmUgUEFSTV9CUlNDXzJHSFogICAgICAgICAgICAgICAgICAgICAgICAgIEJSU0MyR0h6CisjZGVmaW5lIFBBUk1fTkFNRV9CUlNDXzJHSFogICAgICAgICAgICAgICAgICAgICBURVhUKCJCUlNDMkdIeiIpCisjZGVmaW5lIFBBUk1fTUlOX0JSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUEFSTV9NQVhfQlJTQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEZGRgorI2RlZmluZSBQQVJNX0RFRkFVTFRfQlJTQ18yR0haICAgICAgICAgICAgICAgICAgMHgwMDBGCisKKyNkZWZpbmUgUEFSTV9CUlNDXzVHSFogICAgICAgICAgICAgICAgICAgICAgICAgIEJSU0M1R0h6CisjZGVmaW5lIFBBUk1fTkFNRV9CUlNDXzVHSFogICAgICAgICAgICAgICAgICAgICBURVhUKCJCUlNDNUdIeiIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9CUlNDXzVHSFogICAgICAgICAgICAgICAgICAweDAxNTAKKworI2RlZmluZSBQQVJNX0NPRVhJU1RFTkNFICAgICAgICAgICAgICAgICAgICAgICAgQ29leGlzdGVuY2UKKyNkZWZpbmUgUEFSTV9OQU1FX0NPRVhJU1RFTkNFICAgICAgICAgICAgICAgICAgIFRFWFQoIkNvZXhpc3RlbmNlIikKKyNkZWZpbmUgUEFSTV9NSU5fQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQQVJNX01BWF9DT0VYSVNURU5DRSAgICAgICAgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIFBBUk1fREVGQVVMVF9DT0VYSVNURU5DRSAgICAgICAgICAgICAgICAweDAwMDAKKworI2RlZmluZSBQQVJNX0NPTkZJR1VSRUQgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJlZAorI2RlZmluZSBQQVJNX05BTUVfQ09ORklHVVJFRAkJCQkJVEVYVCgiQ29uZmlndXJlZCIpCisKKyNkZWZpbmUgUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25Db250cm9sCisjZGVmaW5lIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wgICAgICAgICAgICBURVhUKCJDb25uZWN0aW9uQ29udHJvbCIpCisjZGVmaW5lIFBBUk1fTUlOX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAgICAgICAgICAwCisjZGVmaW5lIFBBUk1fTUFYX0NPTk5FQ1RJT05fQ09OVFJPTCAgICAgICAgICAgICAzCisjZGVmaW5lIFBBUk1fREVGQVVMVF9DT05ORUNUSU9OX0NPTlRST0wgICAgICAgICAyCisKKyNkZWZpbmUgUEFSTV9DUkVBVEVfSUJTUyAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUlCU1MKKyNkZWZpbmUgUEFSTV9OQU1FX0NSRUFURV9JQlNTICAgICAgICAgICAgICAgICAgIFRFWFQoIkNyZWF0ZUlCU1MiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfQ1JFQVRFX0lCU1MgICAgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0NSRUFURV9JQlNTX1NUUiAgICAgICAgICAgICJOIgorCisjZGVmaW5lIFBBUk1fREVCVUdfRkxBRyAgICAgICAgICAgICAJICAgIAlEZWJ1Z0ZsYWcKKyNkZWZpbmUgUEFSTV9OQU1FX0RFQlVHX0ZMQUcgICAgICAgICAgICAJCVRFWFQoIkRlYnVnRmxhZyIpCisjZGVmaW5lIFBBUk1fTUlOX0RFQlVHX0ZMQUcgICAgICAgICAgICAgCQkwCisjZGVmaW5lIFBBUk1fTUFYX0RFQlVHX0ZMQUcgICAgICAgICAgICAgCQkweEZGRkYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0RFQlVHX0ZMQUcgICAgICAgICAJCTB4RkZGRgorCisjZGVmaW5lIFBBUk1fREVTSVJFRF9TU0lEICAgICAgICAgICAgICAgICAgICAgICBEZXNpcmVkU1NJRAorI2RlZmluZSBQQVJNX05BTUVfREVTSVJFRF9TU0lEICAgICAgICAgICAgICAgICAgVEVYVCgiRGVzaXJlZFNTSUQiKQorCisjZGVmaW5lIFBBUk1fRE9XTkxPQURfRklSTVdBUkUgICAgICAgICAgICAgICAgICBEb3dubG9hZEZpcm13YXJlCisjZGVmaW5lIFBBUk1fTkFNRV9ET1dOTE9BRF9GSVJNV0FSRSAgICAgICAgICAgICBURVhUKCJEb3dubG9hZEZpcm13YXJlIikKKworI2RlZmluZSBQQVJNX0RSSVZFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyRW5hYmxlCisjZGVmaW5lIFBBUk1fTkFNRV9EUklWRVJfRU5BQkxFCQkJCQlURVhUKCJEcml2ZXJFbmFibGUiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfRFJJVkVSX0VOQUJMRQkJCQlUUlVFCisKKyNkZWZpbmUgUEFSTV9FTkFCTEVfRU5DUllQVElPTiAgICAgICAgICAgICAgICAgIEVuYWJsZUVuY3J5cHRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OICAgICAgICAgICAgIFRFWFQoIkVuYWJsZUVuY3J5cHRpb24iKQorI2RlZmluZSBQQVJNX01JTl9FTkFCTEVfRU5DUllQVElPTiAgICAgICAgICAgICAgMAorI2RlZmluZSBQQVJNX01BWF9FTkFCTEVfRU5DUllQVElPTiAgICAgICAgICAgICAgNworI2RlZmluZSBQQVJNX0RFRkFVTFRfRU5BQkxFX0VOQ1JZUFRJT04gICAgICAgICAgMAorCisjZGVmaW5lIFBBUk1fRU5DUllQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgICBURVhUKCJFbmNyeXB0aW9uIikKKworI2RlZmluZSBQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQgICAgICAgICAgICAgICAgRXhjbHVkZVVuZW5jcnlwdGVkCisjZGVmaW5lIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVEICAgICAgICAgICBURVhUKCJFeGNsdWRlVW5lbmNyeXB0ZWQiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfRVhDTFVERV9VTkVOQ1JZUFRFRCAgICAgICAgVFJVRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfRVhDTFVERV9VTkVOQ1JZUFRFRF9TVFIgICAgIk4iCisKKyNkZWZpbmUgUEFSTV9JTlRSQV9CU1NfUkVMQVkgICAgICAgICAgICAgICAgICAgIEludHJhQlNTUmVsYXkKKyNkZWZpbmUgUEFSTV9OQU1FX0lOVFJBX0JTU19SRUxBWSAgICAgICAgICAgICAgIFRFWFQoIkludHJhQlNTUmVsYXkiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfSU5UUkFfQlNTX1JFTEFZICAgICAgICAgICAgVFJVRQorI2RlZmluZSBQQVJNX0RFRkFVTFRfSU5UUkFfQlNTX1JFTEFZX1NUUiAgICAgICAgIlkiCisKKyNkZWZpbmUgUEFSTV9LRVkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTEKKyNkZWZpbmUgUEFSTV9OQU1FX0tFWTEgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIktleTEiKQorI2RlZmluZSBQQVJNX0tFWTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MgorI2RlZmluZSBQQVJNX05BTUVfS0VZMiAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiS2V5MiIpCisjZGVmaW5lIFBBUk1fS0VZMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkzCisjZGVmaW5lIFBBUk1fTkFNRV9LRVkzICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJLZXkzIikKKyNkZWZpbmUgUEFSTV9LRVk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTQKKyNkZWZpbmUgUEFSTV9OQU1FX0tFWTQgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIktleTQiKQorCisvLzs/ICNkZWZpbmUgUEFSTV9LRVlfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgIEFzY2lpSGV4CisvLzs/ICNkZWZpbmUgUEFSTV9OQU1FX0tFWV9GT1JNQVQgICAgICAgICAgICAgICAgICAgIFRFWFQoIkFzY2lpSGV4IikKKworI2RlZmluZSBQQVJNX0xPQURfQkFMQU5DSU5HICAgICAgICAgICAgICAgICAgICAgTG9hZEJhbGFuY2luZworI2RlZmluZSBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcgICAgICAgICAgICAgICAgVEVYVCgiTG9hZEJhbGFuY2luZyIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9MT0FEX0JBTEFOQ0lORyAgICAgICAgICAgICBUUlVFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9MT0FEX0JBTEFOQ0lOR19TVFIgICAgICAgICAiWSIKKworI2RlZmluZSBQQVJNX01BWF9EQVRBX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgTWF4RGF0YUxlbmd0aAorI2RlZmluZSBQQVJNX05BTUVfTUFYX0RBVEFfTEVOR1RICQkJCVRFWFQoIk1heERhdGFMZW5ndGgiKQorCisjZGVmaW5lIFBBUk1fTUFYX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhTbGVlcER1cmF0aW9uCisjZGVmaW5lIFBBUk1fTkFNRV9NQVhfU0xFRVAgICAgICAgICAgICAgICAgICAgICBURVhUKCJNYXhTbGVlcER1cmF0aW9uIikKKyNkZWZpbmUgUEFSTV9NSU5fTUFYX1BNX1NMRUVQICAgICAgICAgICAgICAgICAgIDEJCQkJCQkJCS8vOz9uYW1lcyBuZWFybHkgcmlnaHQ/CisjZGVmaW5lIFBBUk1fTUFYX01BWF9QTV9TTEVFUCAgICAgICAgICAgICAgICAgICA2NTUzNQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTUFYX1BNX1NMRUVQICAgICAgICAgICAgICAgMTAwCisKKyNkZWZpbmUgUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OICAgICAgICAgICAgICAgIE1lZGl1bURpc3RyaWJ1dGlvbgorI2RlZmluZSBQQVJNX05BTUVfTUVESVVNX0RJU1RSSUJVVElPTiAgICAgICAgICAgVEVYVCgiTWVkaXVtRGlzdHJpYnV0aW9uIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01FRElVTV9ESVNUUklCVVRJT04gICAgICAgIFRSVUUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01FRElVTV9ESVNUUklCVVRJT05fU1RSICAgICJZIgorCisjZGVmaW5lIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgICAgICAgICAgICAgICBNaWNyb1dhdmVSb2J1c3RuZXNzCisjZGVmaW5lIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUyAgICAgICAgICBURVhUKCJNaWNyb1dhdmVSb2J1c3RuZXNzIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01JQ1JPV0FWRV9ST0JVU1RORVNTICAgICAgIEZBTFNFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NSUNST1dBVkVfUk9CVVNUTkVTU19TVFIgICAiTiIKKworI2RlZmluZSBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcgICAgICAgICAgICAgTXVsdGljYXN0UE1CdWZmZXJpbmcKKyNkZWZpbmUgUEFSTV9OQU1FX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcJICAgIFRFWFQoIk11bHRpY2FzdFBNQnVmZmVyaW5nIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcgICAgIFRSVUUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdfU1RSICJZIgorCisjZGVmaW5lIFBBUk1fTVVMVElDQVNUX1JBVEUgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RSYXRlCisjZGVmaW5lIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSAgICAgICAgICAgICAgICBURVhUKCJNdWx0aWNhc3RSYXRlIikKKyNpZmRlZiBXQVJQCisjZGVmaW5lIFBBUk1fTUlOX01VTFRJQ0FTVF9SQVRFICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUgICAgICAgICAgICAgICAgIDB4MGZmZgorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfMkdIWiAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV81R0haICAgICAgICAweDAwMTAKKyNlbHNlCisjZGVmaW5lIFBBUk1fTUlOX01VTFRJQ0FTVF9SQVRFICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgUEFSTV9NQVhfTVVMVElDQVNUX1JBVEUgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfMkdIWiAgICAgICAgMHgwMDAyCisjZGVmaW5lIFBBUk1fREVGQVVMVF9NVUxUSUNBU1RfUkFURV81R0haICAgICAgICAweDAwMDAKKyNlbmRpZiAgLy8gV0FSUAorCisjZGVmaW5lIFBBUk1fTVVMVElDQVNUX1JYICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RSZWNlaXZlCisjZGVmaW5lIFBBUk1fTkFNRV9NVUxUSUNBU1RfUlggICAgICAgICAgICAgICAgICBURVhUKCJNdWx0aWNhc3RSZWNlaXZlIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SWCAgICAgICAgICAgICAgIFRSVUUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SWF9TVFIgICAgICAgICAgICJZIgorCisjZGVmaW5lIFBBUk1fTkVUV09SS19BRERSICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrQWRkcmVzcworI2RlZmluZSBQQVJNX05BTUVfTkVUV09SS19BRERSICAgICAgICAgICAgICAgICAgVEVYVCgiTmV0d29ya0FkZHJlc3MiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSICAgICAgICAgICAgICAgeyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH0KKworI2RlZmluZSBQQVJNX05FVFdPUktfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1R5cGUKKyNkZWZpbmUgUEFSTV9OQU1FX05FVFdPUktfVFlQRQkJCQkJVEVYVCgiTmV0d29ya1R5cGUiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfTkVUV09SS19UWVBFICAgCQkJMAorCisjZGVmaW5lIFBBUk1fT1dOX0FUSU1fV0lORE9XICAgICAgICAgICAgICAgICAgICBPd25BVElNV2luZG93CisjZGVmaW5lIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1cJCQkJVEVYVCgiT3duQVRJTVdpbmRvdyIpCisjZGVmaW5lIFBBUk1fTUlOX09XTl9BVElNX1dJTkRPVyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBUk1fTUFYX09XTl9BVElNX1dJTkRPVyAgICAgICAgICAgICAgICAxMDAKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX09XTl9BVElNX1dJTkRPVyAgICAgICAgICAgIDAKKworI2RlZmluZSBQQVJNX09XTl9CRUFDT05fSU5URVJWQUwgICAgICAgICAgICAgICAgT3duQmVhY29uSW50ZXJ2YWwKKyNkZWZpbmUgUEFSTV9OQU1FX09XTl9CRUFDT05fSU5URVJWQUwgICAgICAgICAgIFRFWFQoIk93bkJlYWNvbkludGVydmFsIikKKyNkZWZpbmUgUEFSTV9NSU5fT1dOX0JFQUNPTl9JTlRFUlZBTCAgICAgICAgICAgIDIwCisjZGVmaW5lIFBBUk1fTUFYX09XTl9CRUFDT05fSU5URVJWQUwgICAgICAgICAgICAyMDAKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX09XTl9CRUFDT05fSU5URVJWQUwgICAgICAgIDEwMAorCisjZGVmaW5lIFBBUk1fT1dOX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgICAgICBPd25DaGFubmVsCisjZGVmaW5lIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCAgICAgICAgICAgICAgICAgICBURVhUKCJPd25DaGFubmVsIikKKyNkZWZpbmUgUEFSTV9NSU5fT1dOX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfT1dOX0NIQU5ORUwgICAgICAgICAgICAgICAgICAgIDE2MQorI2RlZmluZSBQQVJNX0RFRkFVTFRfT1dOX0NIQU5ORUwgICAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBQQVJNX09XTl9EVElNX1BFUklPRCAgICAgICAgICAgICAgICAgICAgT3duRFRJTVBlcmlvZAorI2RlZmluZSBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9ECSAgICAgICAgICAgIFRFWFQoIk93bkRUSU1QZXJpb2QiKQorI2RlZmluZSBQQVJNX01JTl9PV05fRFRJTV9QRVJJT0QgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9PV05fRFRJTV9QRVJJT0QgICAgICAgICAgICAgICAgNjU1MzUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX09XTl9EVElNX1BFUklPRCAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVJNX09XTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duTmFtZQorI2RlZmluZSBQQVJNX05BTUVfT1dOX05BTUUgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiT3duTmFtZSIpCisjZGVmaW5lIFBBUk1fREVGQVVMVF9PV05fTkFNRSAgICAgICAgICAgICAgICAgICAiTGludXgiCisKKyNkZWZpbmUgUEFSTV9PV05fU1NJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIE93blNTSUQKKyNkZWZpbmUgUEFSTV9OQU1FX09XTl9TU0lEICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIk93blNTSUQiKQorCisjZGVmaW5lIFBBUk1fUE1fRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICBQTUVuYWJsZWQKKyNkZWZpbmUgUEFSTV9OQU1FX1BNX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgIFRFWFQoIlBNRW5hYmxlZCIpCisjZGVmaW5lIFBBUk1fTUFYX1BNX0VOQUJMRUQJCQkJCQkzCisKKyNkZWZpbmUgUEFSTV9QTUVQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNRVBTCisjZGVmaW5lIFBBUk1fTkFNRV9QTUVQUyAgICAgICAgICAgICAgICAgICAgICAgICBURVhUKCJQTUVQUyIpCisKKyNkZWZpbmUgUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiAgICAgICAgICAgICAgIFBNSG9sZG92ZXJEdXJhdGlvbgorI2RlZmluZSBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04gICAgICAgICAgVEVYVCgiUE1Ib2xkb3ZlckR1cmF0aW9uIikKKyNkZWZpbmUgUEFSTV9NSU5fUE1fSE9MRE9WRVJfRFVSQVRJT04gICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfUE1fSE9MRE9WRVJfRFVSQVRJT04gICAgICAgICAgIDEwMDAKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1BNX0hPTERPVkVSX0RVUkFUSU9OICAgICAgIDEwMAorCisjZGVmaW5lIFBBUk1fUE1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlck1vZGUKKyNkZWZpbmUgUEFSTV9OQU1FX1BNX01PREUgICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlBvd2VyTW9kZSIpCisKKyNkZWZpbmUgUEFSTV9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRUeXBlCisjZGVmaW5lIFBBUk1fTkFNRV9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgICBURVhUKCJQb3J0VHlwZSIpCisjZGVmaW5lIFBBUk1fTUlOX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBUk1fTUFYX1BPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBBUk1fREVGQVVMVF9QT1JUX1RZUEUgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgUEFSTV9QUk9NSVNDVU9VU19NT0RFICAgICAgICAgICAgICAgICAgIFByb21pc2N1b3VzTW9kZQorI2RlZmluZSBQQVJNX05BTUVfUFJPTUlTQ1VPVVNfTU9ERSAgICAgICAgICAgICAgVEVYVCgiUHJvbWlzY3VvdXNNb2RlIikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1BST01JU0NVT1VTX01PREUgICAgICAgICAgIEZBTFNFCisjZGVmaW5lIFBBUk1fREVGQVVMVF9QUk9NSVNDVU9VU19NT0RFX1NUUiAgICAgICAiTiIKKworI2RlZmluZSBQQVJNX1JFSkVDVF9BTlkgICAgICAgICAgICAgICAgICAgICAgICAgUmVqZWN0QU5ZCisjZGVmaW5lIFBBUk1fTkFNRV9SRUpFQ1RfQU5ZCQkJCSAgICBURVhUKCJSZWplY3RBTlkiKQorI2RlZmluZSBQQVJNX0RFRkFVTFRfUkVKRUNUX0FOWSAgICAgICAgICAgICAgICAgRkFMU0UKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1JFSkVDVF9BTllfU1RSICAgICAgICAgICAgICJOIgorCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZCIpCisjZGVmaW5lIFBBUk1fTUlOX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBUk1fTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAgICAgICAgICAyMzQ3CisjZGVmaW5lIFBBUk1fREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAgICAgICAgICAyMzQ3CisKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xEMSAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDEKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZDEiKQorI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQyICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkMgorI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkMiIpCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRDMgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQzCisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMyAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQzIikKKyNkZWZpbmUgUEFSTV9SVFNfVEhSRVNIT0xENCAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDQKKyNkZWZpbmUgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0ICAgICAgICAgICAgICAgIFRFWFQoIlJUU1RocmVzaG9sZDQiKQorI2RlZmluZSBQQVJNX1JUU19USFJFU0hPTEQ1ICAgICAgICAgICAgICAgICAgICAgUlRTVGhyZXNob2xkNQorI2RlZmluZSBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUgICAgICAgICAgICAgICAgVEVYVCgiUlRTVGhyZXNob2xkNSIpCisjZGVmaW5lIFBBUk1fUlRTX1RIUkVTSE9MRDYgICAgICAgICAgICAgICAgICAgICBSVFNUaHJlc2hvbGQ2CisjZGVmaW5lIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiAgICAgICAgICAgICAgICBURVhUKCJSVFNUaHJlc2hvbGQ2IikKKworI2RlZmluZSBQQVJNX1NSU0NfMkdIWiAgICAgICAgICAgICAgICAgICAgICAgICAgU1JTQzJHSHoKKyNkZWZpbmUgUEFSTV9OQU1FX1NSU0NfMkdIWiAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlNSU0MyR0h6IikKKyNkZWZpbmUgUEFSTV9NSU5fU1JTQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBQQVJNX01BWF9TUlNDICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIFBBUk1fREVGQVVMVF9TUlNDXzJHSFogICAgICAgICAgICAgICAgICAweDBGRkYKKworI2RlZmluZSBQQVJNX1NSU0NfNUdIWiAgICAgICAgICAgICAgICAgICAgICAgICAgU1JTQzVHSHoKKyNkZWZpbmUgUEFSTV9OQU1FX1NSU0NfNUdIWiAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlNSU0M1R0h6IikKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1NSU0NfNUdIWiAgICAgICAgICAgICAgICAgIDB4MEZGMAorCisjZGVmaW5lIFBBUk1fU1lTVEVNX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1TY2FsZQorI2RlZmluZSBQQVJNX05BTUVfU1lTVEVNX1NDQUxFICAgICAgICAgICAgICAgICAgVEVYVCgiU3lzdGVtU2NhbGUiKQorI2RlZmluZSBQQVJNX01JTl9TWVNURU1fU0NBTEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9TWVNURU1fU0NBTEUgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBQQVJNX0RFRkFVTFRfU1lTVEVNX1NDQUxFICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFBBUk1fVFhfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeEtleQorI2RlZmluZSBQQVJNX05BTUVfVFhfS0VZICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhLZXkiKQorI2RlZmluZSBQQVJNX01JTl9UWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9UWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBQQVJNX0RFRkFVTFRfVFhfS0VZICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFBBUk1fVFhfUE9XX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICBUeFBvd0xldmVsCisjZGVmaW5lIFBBUk1fTkFNRV9UWF9QT1dfTEVWRUwgICAgICAgICAgICAgICAgICBURVhUKCJUeFBvd0xldmVsIikKKyNkZWZpbmUgUEFSTV9NSU5fVFhfUE9XX0xFVkVMICAgICAgICAgICAgICAgICAgIDEgICAvLyAyMCBkQm0KKyNkZWZpbmUgUEFSTV9NQVhfVFhfUE9XX0xFVkVMICAgICAgICAgICAgICAgICAgIDYgICAvLyAgOCBkQm0KKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1RYX1BPV19MRVZFTCAgICAgICAgICAgICAgIDMgICAvLyAxNSBkQm0KKworI2RlZmluZSBQQVJNX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbAorI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURSAgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbCIpCisjZGVmaW5lIFBBUk1fTUlOX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNpZmRlZiBXQVJQCisjZGVmaW5lIFBBUk1fTUFYX1RYX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWiAgICAgICAgICAgICAgIDB4MEZGRgorI2RlZmluZSBQQVJNX0RFRkFVTFRfVFhfUkFURV81R0haICAgICAgICAgICAgICAgMHgwRkYwCisjZWxzZQorI2RlZmluZSBQQVJNX01BWF9UWF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFogICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1RYX1JBVEVfNUdIWiAgICAgICAgICAgICAgIDB4MDAwMAorI2VuZGlmICAvLyBXQVJQCisKKyNkZWZpbmUgUEFSTV9UWF9SQVRFMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2wxCisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFMSAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sMSIpCisjZGVmaW5lIFBBUk1fVFhfUkFURTIgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sMgorI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURTIgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbDIiKQorI2RlZmluZSBQQVJNX1RYX1JBVEUzICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbDMKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEUzICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2wzIikKKyNkZWZpbmUgUEFSTV9UWF9SQVRFNCAgICAgICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2w0CisjZGVmaW5lIFBBUk1fTkFNRV9UWF9SQVRFNCAgICAgICAgICAgICAgICAgICAgICBURVhUKCJUeFJhdGVDb250cm9sNCIpCisjZGVmaW5lIFBBUk1fVFhfUkFURTUgICAgICAgICAgICAgICAgICAgICAgICAgICBUeFJhdGVDb250cm9sNQorI2RlZmluZSBQQVJNX05BTUVfVFhfUkFURTUgICAgICAgICAgICAgICAgICAgICAgVEVYVCgiVHhSYXRlQ29udHJvbDUiKQorI2RlZmluZSBQQVJNX1RYX1JBVEU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbDYKKyNkZWZpbmUgUEFSTV9OQU1FX1RYX1JBVEU2ICAgICAgICAgICAgICAgICAgICAgIFRFWFQoIlR4UmF0ZUNvbnRyb2w2IikKKworI2RlZmluZSBQQVJNX1ZFTkRPUkRFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgVmVuZG9yRGVzY3JpcHRpb24KKyNkZWZpbmUgUEFSTV9OQU1FX1ZFTkRPUkRFU0NSSVBUSU9OCQkJCVRFWFQoIlZlbmRvckRlc2NyaXB0aW9uIikKKworI2RlZmluZSBQQVJNX1dEU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgV0RTQWRkcmVzcworI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1MJCQkJCVRFWFQoIldEU0FkZHJlc3MiKQorCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1MxICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzMQorI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1MxCQkJCQlURVhUKCJXRFNBZGRyZXNzMSIpCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1MyICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzMgorI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1MyCQkJCQlURVhUKCJXRFNBZGRyZXNzMiIpCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1MzICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzMworI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1MzCQkJCQlURVhUKCJXRFNBZGRyZXNzMyIpCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1M0ICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzNAorI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1M0CQkJCQlURVhUKCJXRFNBZGRyZXNzNCIpCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1M1ICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzNQorI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1M1CQkJCQlURVhUKCJXRFNBZGRyZXNzNSIpCisjZGVmaW5lIFBBUk1fV0RTX0FERFJFU1M2ICAgICAgICAgICAgICAgICAgICAgICBXRFNBZGRyZXNzNgorI2RlZmluZSBQQVJNX05BTUVfV0RTX0FERFJFU1M2CQkJCQlURVhUKCJXRFNBZGRyZXNzNiIpCisKKy8qCisjZGVmaW5lIFBBUk1fTE9OR19SRVRSWV9MSU1JVCAgICAgICAgICAgICAgICAgICBMb25nUmV0cnlMaW1pdAorI2RlZmluZSBQQVJNX05BTUVfTE9OR19SRVRSWV9MSU1JVCAgICAgICAgICAgICAgVEVYVCgiTG9uZ1JldHJ5TGltaXQiKQorI2RlZmluZSBQQVJNX01JTl9MT05HX1JFVFJZX0xJTUlUICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQVJNX01BWF9MT05HX1JFVFJZX0xJTUlUICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX0xPTkdfUkVUUllfTElNSVQgICAgICAgICAgIDMKKworCisjZGVmaW5lIFBBUk1fUFJPQkVfREFUQV9SQVRFUyAgICAgICAgICAgICAgICAgICBQcm9iZURhdGFSYXRlcworI2RlZmluZSBQQVJNX05BTUVfUFJPQkVfREFUQV9SQVRFUyAgICAgICAgICAgICAgVEVYVCgiUHJvYmVEYXRhUmF0ZXMiKQorI2RlZmluZSBQQVJNX01JTl9QUk9CRV9EQVRBX1JBVEVTICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFBBUk1fTUFYX1BST0JFX0RBVEFfUkFURVMgICAgICAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgUEFSTV9ERUZBVUxUX1BST0JFX0RBVEFfUkFURVNfMkdIWiAgICAgIDB4MDAwMgorI2RlZmluZSBQQVJNX0RFRkFVTFRfUFJPQkVfREFUQV9SQVRFU181R0haICAgICAgMHgwMDEwCisKKyNkZWZpbmUgUEFSTV9TSE9SVF9SRVRSWV9MSU1JVCAgICAgICAgICAgICAgICAgIFNob3J0UmV0cnlMaW1pdAorI2RlZmluZSBQQVJNX05BTUVfU0hPUlRfUkVUUllfTElNSVQgICAgICAgICAgICAgVEVYVCgiU2hvcnRSZXRyeUxpbWl0IikKKyNkZWZpbmUgUEFSTV9NSU5fU0hPUlRfUkVUUllfTElNSVQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFSTV9NQVhfU0hPUlRfUkVUUllfTElNSVQgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFBBUk1fREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVCAgICAgICAgICA3CisKKworKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBzdGF0ZSBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSB1c2VkIHRvIHRyYWNrIHN0YXRlIHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgV0xfRlJJTVdBUkVfUFJFU0VOVCAgICAgMSAvLyBEb3dubG9hZCBpZiBuZWVkZWQKKyNkZWZpbmUgV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQJMCAvLyBTa2lwIG92ZXIgZG93bmxvYWQsIGFzc3VtZSBpdHMgYWxyZWFkeSB0aGVyZQorI2RlZmluZSBXTF9IQU5ETElOR19JTlQgICAgICAgICAxIC8vIEFjdHVhbGx5IGNhbGwgdGhlIEhDRiB0byBzd2l0Y2ggaW50ZXJydXB0cyBvbi9vZmYKKyNkZWZpbmUgV0xfTk9UX0hBTkRMSU5HX0lOVCAgICAgMCAvLyBOb3QgeWV0IGhhbmRsaW5nIGludGVycnVwdHMsIGRvIG5vdCBzd2l0Y2ggb24vb2ZmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgbWFjcm8gZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvIGVuc3VyZXMgdGhhdCBubyBzeW1ib2xzIGFyZSBleHBvcnRlZCwgbWluaW1pemluZyB0aGUKKyAgIGNoYW5jZSBvZiBhIHN5bWJvbCBjb2xsaXNpb24gaW4gdGhlIGtlcm5lbCAqLworLy8gRVhQT1JUX05PX1NZTUJPTFM7CisKKyNkZWZpbmUgTkVMRU0oYXJyKSAoc2l6ZW9mKGFycikgLyBzaXplb2YoYXJyWzBdKSkKKworI2RlZmluZSBXVkxBTl9WQUxJRF9NQUNfQUREUkVTUyggeCApIFwKKygoeFswXSE9MHhGRikgJiYgKHhbMV0hPTB4RkYpICYmICh4WzJdIT0weEZGKSAmJiAoeFszXSE9MHhGRikgJiYgKHhbNF0hPTB4RkYpICYmICh4WzVdIT0weEZGKSkKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHR5cGUgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjdW5kZWYgRkFMU0UKKyN1bmRlZiBUUlVFCisKK3R5cGVkZWYgZW51bQoreworCUZBTFNFID0gMCwKKwlUUlVFICA9IDEKK30KK2Jvb2xfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfU2NhblJlc3VsdAoreworCS8vaGNmXzE2ICAgICAgICBsZW47CisJLy9oY2ZfMTYgICAgICAgIHR5cDsKKwlpbnQgICAgICAgICAgICAgc2Nhbl9jb21wbGV0ZTsKKwlpbnQgICAgICAgICAgICAgbnVtX2FwczsKKwlTQ0FOX1JTX1NUUkNUICAgQVBUYWJsZSBbTUFYX05BUFNdOworfQorU2NhblJlc3VsdDsKKworCit0eXBlZGVmIHN0cnVjdCBfTElOS19TVEFUVVNfU1RSQ1QKK3sKKwloY2ZfMTYgIGxlbjsKKwloY2ZfMTYgIHR5cDsKKwloY2ZfMTYgIGxpbmtTdGF0dXM7ICAgICAvKiAxLi41ICovCit9CitMSU5LX1NUQVRVU19TVFJDVDsKKworCit0eXBlZGVmIHN0cnVjdCBfQVNTT0NfU1RBVFVTX1NUUkNUCit7CisJaGNmXzE2ICBsZW47CisJaGNmXzE2ICB0eXA7CisJaGNmXzE2ICBhc3NvY1N0YXR1czsgICAgICAgICAgICAvKiAxLi4zICovCisJaGNmXzggICBzdGFBZGRyW0VUSF9BTEVOXTsKKwloY2ZfOCAgIG9sZEFwQWRkcltFVEhfQUxFTl07Cit9CitBU1NPQ19TVEFUVVNfU1RSQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ1VSSVRZX1NUQVRVU19TVFJDVAoreworCWhjZl8xNiAgbGVuOworCWhjZl8xNiAgdHlwOworCWhjZl8xNiAgc2VjdXJpdHlTdGF0dXM7ICAgICAvKiAxLi4zICovCisJaGNmXzggICBzdGFBZGRyW0VUSF9BTEVOXTsKKwloY2ZfMTYgIHJlYXNvbjsKK30KK1NFQ1VSSVRZX1NUQVRVU19TVFJDVDsKKworI2RlZmluZSBXVkxBTl9XTVBfUERVX1RZUEVfTFRfUkVRICAgICAgIDB4MDAKKyNkZWZpbmUgV1ZMQU5fV01QX1BEVV9UWVBFX0xUX1JTUCAgICAgICAweDAxCisjZGVmaW5lIFdWTEFOX1dNUF9QRFVfVFlQRV9BUExfUkVRICAgICAgMHgwMgorI2RlZmluZSBXVkxBTl9XTVBfUERVX1RZUEVfQVBMX1JTUCAgICAgIDB4MDMKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fZXRoX2hkcgoreworCXVuc2lnbmVkIGNoYXIgICBkc3RbRVRIX0FMRU5dOyAgICAgICAgICAgLyogRGVzdGluYXRpb24gYWRkcmVzcy4gKi8KKwl1bnNpZ25lZCBjaGFyICAgc3JjW0VUSF9BTEVOXTsgICAgICAgICAgIC8qIFNvdXJjZSBhZGRyZXNzLiAqLworCXVuc2lnbmVkIHNob3J0ICBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIFBEVS4gKi8KK30KK1dWTEFOX0VUSF9IRFIsICpQV1ZMQU5fRVRIX0hEUjsKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbGxjX3NuYXAKK3sKKwl1bnNpZ25lZCBjaGFyICAgZHNhcDsgICAgICAgICAgICAgICAgICAgLyogRFNBUCAoMHhBQSkgKi8KKwl1bnNpZ25lZCBjaGFyICAgc3NhcDsgICAgICAgICAgICAgICAgICAgLyogU1NBUCAoMHhBQSkgKi8KKwl1bnNpZ25lZCBjaGFyICAgY3RybDsgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCAoMHgwMykgKi8KKwl1bnNpZ25lZCBjaGFyICAgb3VpWzNdOyAgICAgICAgICAgICAgICAgLyogT3JnYW5pemF0aW9uIFVuaXF1ZSBJRCAoMDAtNjAtMWQpLiAqLworCXVuc2lnbmVkIGNoYXIgICBzcGVjaWRbMl07ICAgICAgICAgICAgICAvKiBTcGVjaWZpYyBJRCBjb2RlICgwMC0wMSkuICovCit9CitXVkxBTl9MTENfU05BUCwgKlBXVkxBTl9MTENfU05BUDsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9sdF9oZHIKK3sKKwl1bnNpZ25lZCBjaGFyICAgdmVyc2lvbjsgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAoMHgwMCkgKi8KKwl1bnNpZ25lZCBjaGFyICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyogUERVIHR5cGU6IDAtcmVxLzEtcmVzcC4gKi8KKwl1bnNpZ25lZCBzaG9ydCAgaWQ7ICAgICAgICAgICAgICAgICAgICAgLyogSWRlbnRpZmllciB0byBhc3NvY2lhdGUgcmVzcCB0byByZXEuICovCit9CitXVkxBTl9MVF9IRFIsICpQV1ZMQU5fTFRfSERSOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX3dtcF9oZHIKK3sKKwl1bnNpZ25lZCBjaGFyICAgdmVyc2lvbjsgICAgICAgICAgICAgICAgLyogVmVyc2lvbiAgKi8KKwl1bnNpZ25lZCBjaGFyICAgdHlwZTsgICAgICAgICAgICAgICAgICAgLyogUERVIHR5cGUgKi8KK30KK1dWTEFOX1dNUF9IRFIsICpQV1ZMQU5fV01QX0hEUjsKKworCisjZGVmaW5lIEZJTExFUl9TSVpFICAgICAgICAgICAgIDE1NTQKKyNkZWZpbmUgVEVTVF9QQVRURVJOX1NJWkUgICAgICAgNTQKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9sdF9yZXEKK3sKKwl1bnNpZ25lZCBjaGFyICAgRmlsbGVyW1RFU1RfUEFUVEVSTl9TSVpFXTsgICAvKiBtaW5pbWFsIGxlbmd0aCBvZiA1NCBieXRlcyAqLworfQorV1ZMQU5fTFRfUkVRLCAqUFdWTEFOX0xUX1JFUTsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9sdF9yc3AKK3sKKwljaGFyICAgICAgICAgICBuYW1lWzMyXTsKKwkvKiBNZWFzdXJlZCBEYXRhICovCisJdW5zaWduZWQgY2hhciAgc2lnbmFsOworCXVuc2lnbmVkIGNoYXIgIG5vaXNlOworCXVuc2lnbmVkIGNoYXIgIHJ4RmxvdzsKKwl1bnNpZ25lZCBjaGFyICBkYXRhUmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBwcm90b2NvbDsKKwkvKiBDYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBjaGFyICBzdGF0aW9uOworCXVuc2lnbmVkIGNoYXIgIGRhdGFSYXRlQ2FwOworCXVuc2lnbmVkIGNoYXIgIHBvd2VyTWdtdFs0XTsKKwl1bnNpZ25lZCBjaGFyICByb2J1c3RuZXNzWzRdOworCXVuc2lnbmVkIGNoYXIgIHNjYWxpbmc7CisJdW5zaWduZWQgY2hhciAgcmVzZXJ2ZWRbNV07Cit9CitXVkxBTl9MVF9SU1AsICpQV1ZMQU5fTFRfUlNQOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX3J4X3dtcF9oZHIKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQxWzJdOworCXVuc2lnbmVkIGNoYXIgIHNpbGVuY2U7CisJdW5zaWduZWQgY2hhciAgc2lnbmFsOworCXVuc2lnbmVkIGNoYXIgIHJhdGU7CisJdW5zaWduZWQgY2hhciAgcnhGbG93OworCXVuc2lnbmVkIHNob3J0IHJlc2VydmVkMlsyXTsKKwl1bnNpZ25lZCBzaG9ydCBmcmFtZUNvbnRyb2w7CisJdW5zaWduZWQgc2hvcnQgZHVyYXRpb247CisJdW5zaWduZWQgc2hvcnQgYWRkcmVzczFbM107CisJdW5zaWduZWQgc2hvcnQgYWRkcmVzczJbM107CisJdW5zaWduZWQgc2hvcnQgYWRkcmVzczNbM107CisJdW5zaWduZWQgc2hvcnQgc2VxdWVuY2VDb250cm9sOworCXVuc2lnbmVkIHNob3J0IGFkZHJlc3M0WzNdOworI2lmbmRlZiBIRVJNRVMyNQkvLzs/anVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlIG9mIGluaGVyaXRlZCBidXQgbm90IGNvbXByZWhlbmRlZCBjb2RlICNpZmRlZiBIRVJNRVMyCisJdW5zaWduZWQgc2hvcnQgc2VlbXNfdG9fYmVfdW51c2VkX3Jlc2VydmVkM1s1XTsgIC8vOz8KKwl1bnNpZ25lZCBzaG9ydCBzZWVtc190b19iZV91bnVzZWRfcmVzZXJ2ZWQ0OwkgLy87PworI2VuZGlmIC8vIEhFUk1FUzI1CisJdW5zaWduZWQgc2hvcnQgSGVhZGVyRGF0YUxlbjsKK30KK1dWTEFOX1JYX1dNUF9IRFIsICpQV1ZMQU5fUlhfV01QX0hEUjsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9saW5rdGVzdF9yZXFfcGR1Cit7CisJV1ZMQU5fRVRIX0hEUiAgICAgZXRoSGRyOworCVdWTEFOX0xMQ19TTkFQICAgIGxsY1NuYXA7CisJV1ZMQU5fTFRfSERSICAgICAgbHRIZHI7CisJV1ZMQU5fTFRfUkVRICAgICAgbHRSZXE7Cit9CitXVkxBTl9MSU5LVEVTVF9SRVFfUERVLCAqUFdWTEFOX0xJTktURVNUX1JFUV9QRFU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fbGlua3Rlc3RfcnNwX3BkdQoreworCVdWTEFOX1JYX1dNUF9IRFIgIHdtcFJ4SGRyOworCVdWTEFOX0VUSF9IRFIgICAgIGV0aEhkcjsKKwlXVkxBTl9MTENfU05BUCAgICBsbGNTbmFwOworCVdWTEFOX0xUX0hEUiAgICAgIGx0SGRyOworCVdWTEFOX0xUX1JTUCAgICAgIGx0UnNwOworfQorV1ZMQU5fTElOS1RFU1RfUlNQX1BEVSwgKlBXVkxBTl9MSU5LVEVTVF9SU1BfUERVOworCisKK3R5cGVkZWYgc3RydWN0IF9MSU5LVEVTVF9SU1BfU1RSQ1QKK3sKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgbGVuOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICB0eXA7CisJV1ZMQU5fTElOS1RFU1RfUlNQX1BEVSAgIGx0UnNwOworfQorTElOS1RFU1RfUlNQX1NUUkNUOworCisKK3R5cGVkZWYgc3RydWN0IHd2bGFuX3dtcF9yc3BfcGR1Cit7CisJV1ZMQU5fUlhfV01QX0hEUiAgd21wUnhIZHI7CisJV1ZMQU5fRVRIX0hEUiAgICAgZXRoSGRyOworCVdWTEFOX0xMQ19TTkFQICAgIGxsY1NuYXA7CisJV1ZMQU5fV01QX0hEUiAgICAgd21wSGRyOworfQorV1ZMQU5fV01QX1JTUF9QRFUsICpQV1ZMQU5fV01QX1JTUF9QRFU7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1dNUF9SU1BfU1RSQ1QKK3sKKwloY2ZfMTYgICAgICAgICAgICAgIGxlbjsKKwloY2ZfMTYgICAgICAgICAgICAgIHR5cDsKKwlXVkxBTl9XTVBfUlNQX1BEVSAgIHdtcFJzcDsKK30KK1dNUF9SU1BfU1RSQ1Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgX1BST0JFX1JFU1AKK3sKKwkvLyBmaXJzdCBwYXJ0OiA4MDIuMTEKKwloY2ZfMTYJbGVuZ3RoOworCWhjZl8xNglpbmZvVHlwZTsKKwloY2ZfMTYJcmVzZXJ2ZWQwOworCS8vaGNmXzgJc2lnbmFsOworCWhjZl84CXNpbGVuY2U7CisJaGNmXzgJc2lnbmFsOyAgICAgLy8gTW92ZWQgc2lnbmFsIGhlcmUgYXMgc2lnbmFsL25vaXNlIHZhbHVlcyB3ZXJlIGZsaXBwZWQKKwloY2ZfOAlyeEZsb3c7CisJaGNmXzgJcmF0ZTsKKwloY2ZfMTYJcmVzZXJ2ZWQxWzJdOworCisJLy8gc2Vjb25kIHBhcnQ6CisJaGNmXzE2CWZyYW1lQ29udHJvbDsKKwloY2ZfMTYJZHVySUQ7CisJaGNmXzgJYWRkcmVzczFbNl07CisJaGNmXzgJYWRkcmVzczJbNl07CisJaGNmXzgJQlNTSURbNl07CQkJCQkvLyEgdGhpcyBpcyBjb3JyZWN0LCByaWdodCA/CisJaGNmXzE2CXNlcXVlbmNlOworCWhjZl84CWFkZHJlc3M0WzZdOworCisjaWZuZGVmIFdBUlAKKwloY2ZfOAlyZXNlcnZlZDJbMTJdOworI2VuZGlmIC8vIFdBUlAKKworCWhjZl8xNglkYXRhTGVuZ3RoOworCQkJCQkJCQkJCS8vIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbmV4dCAzIGZpZWxkcyAoREEvU0EvTGVuVHlwZSkgaXMgYWN0dWFsbHkgbm90IGZpbGxlZCBpbi4KKwloY2ZfOAlEQVs2XTsKKwloY2ZfOAlTQVs2XTsKKworI2lmZGVmIFdBUlAKKwloY2ZfOCAgIGNoYW5uZWw7CisJaGNmXzggICBiYW5kOworI2Vsc2UKKwloY2ZfMTYJbGVuVHlwZTsKKyNlbmRpZiAgLy8gV0FSUAorCisJaGNmXzgJdGltZVN0YW1wWzhdOworCWhjZl8xNgliZWFjb25JbnRlcnZhbDsKKwloY2ZfMTYJY2FwYWJpbGl0eTsKKwloY2ZfOAlyYXdEYXRhWzIwMF07CQkJCS8vISA8PDwgdGhpbmsgYWJvdXQgdGhpcyBudW1iZXIgIQorCWhjZl8xNglmbGFnczsKK30KK1BST0JFX1JFU1AsICpQUFJPQkVfUkVTUDsKKworCit0eXBlZGVmIHN0cnVjdCBfUHJvYmVSZXN1bHQKK3sKKwlpbnQgICAgICAgICBzY2FuX2NvbXBsZXRlOworCWludCAgICAgICAgIG51bV9hcHM7CisJUFJPQkVfUkVTUCAgUHJvYmVUYWJsZVtNQVhfTkFQU107Cit9CitQcm9iZVJlc3VsdDsKKworLyogRGVmaW5pdGlvbnMgdXNlZCB0byBwYXJzZSBjYXBhYmlsaXRpZXMgb3V0IG9mIHRoZSBwcm9iZSByZXNwb25zZXMgKi8KKyNkZWZpbmUgQ0FQQUJJTElUWV9FU1MgICAgICAweDAwMDEKKyNkZWZpbmUgQ0FQQUJJTElUWV9JQlNTICAgICAweDAwMDIKKyNkZWZpbmUgQ0FQQUJJTElUWV9QUklWQUNZICAweDAwMTAKKworLyogRGVmaW5pdGlvbnMgdXNlZCB0byBwYXJzZSB0aGUgSW5mb3JtYXRpb24gRWxlbWVudHMgb3V0IG9mIHByb2JlIHJlc3BvbnNlcyAqLworI2RlZmluZSBEU19JTkZPX0VMRU0gICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEdFTkVSSUNfSU5GT19FTEVNICAgICAgICAgICAgICAgICAgIDB4ZGQKKyNkZWZpbmUgV1BBX01BWF9JRV9MRU4gICAgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBXUEFfT1VJX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfQorI2RlZmluZSBXUEFfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVggICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9CisjZGVmaW5lIFdQQV9BVVRIX0tFWV9NR01UX1BTS19PVkVSXzgwMl8xWCAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMiB9CisjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfTk9ORSAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMCB9CisjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfV0VQNDAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9CisjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfVEtJUCAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMiB9CisjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfV1JBUCAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgMyB9CisjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUCAgICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgNCB9CisjZGVmaW5lIFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0ICAgICAgICAgICAgIHsgMHgwMCwgMHg1MCwgMHhmMiwgNSB9CisKK3R5cGVkZWYgZW51bSB3dmxhbl9kcnZfbW9kZQoreworCVdWTEFOX0RSVl9NT0RFX05PX0RPV05MT0FELCAgICAgLyogdGhpcyBpcyB0aGUgc2FtZSBhcyBTVEEgZm9yIEhlcm1lcyAxICAgICovCisJCQkJICAgICAgICAgICAgICAgICAgICAvKiBpdCBpcyBhbHNvIG9ubHkgYXBwbGljYWJsZSBmb3IgSGVybWVzIDEgKi8KKwlXVkxBTl9EUlZfTU9ERV9TVEEsCisJV1ZMQU5fRFJWX01PREVfQVAsCisJV1ZMQU5fRFJWX01PREVfTUFYCit9CitXVkxBTl9EUlZfTU9ERSwgKlBXVkxBTl9EUlZfTU9ERTsKKworCit0eXBlZGVmIGVudW0gd3ZsYW5fcG9ydF9zdGF0ZQoreworCVdWTEFOX1BPUlRfU1RBVEVfRU5BQkxFRCwKKwlXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVELAorCVdWTEFOX1BPUlRfU1RBVEVfQ09OTkVDVEVECit9CitXVkxBTl9QT1JUX1NUQVRFLCAqUFdWTEFOX1BPUlRfU1RBVEU7CisKKy8qCit0eXBlZGVmIGVudW0gd3ZsYW5fY29ubmVjdF9zdGF0ZQoreworCVdWTEFOX0NPTk5FQ1RfU1RBVEVfQ09OTkVDVEVELAorCVdWTEFOX0NPTk5FQ1RfU1RBVEVfRElTQ09OTkVDVEVECit9CitXVkxBTl9DT05ORUNUX1NUQVRFLCAqUFdWTEFOX0NPTk5FQ1RfU1RBVEU7CisqLworCit0eXBlZGVmIGVudW0gd3ZsYW5fcG1fc3RhdGUKK3sKKwlXVkxBTl9QTV9TVEFURV9ESVNBQkxFRCwKKwlXVkxBTl9QTV9TVEFURV9FTkhBTkNFRCwKKwlXVkxBTl9QTV9TVEFURV9TVEFOREFSRAorfQorV1ZMQU5fUE1fU1RBVEUsICpQV1ZMQU5fUE1fU1RBVEU7CisKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fZnJhbWUKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAgKnNrYjsgICAgICAgLyogc2tfYnVmZiBmb3IgZnJhbWUuICovCisJaGNmXzE2ICAgICAgICAgIHBvcnQ7ICAgICAgIC8qIE1BQyBwb3J0IGZvciB0aGUgZnJhbWUuICovCisJaGNmXzE2ICAgICAgICAgIGxlbjsgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgZnJhbWUuICovCit9CitXVkxBTl9GUkFNRSwgKlBXVkxBTl9GUkFNRTsKKworCit0eXBlZGVmIHN0cnVjdCB3dmxhbl9sZnJhbWUKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgIG5vZGU7ICAgLyogTm9kZSBpbiB0aGUgbGlzdCAqLworCVdWTEFOX0ZSQU1FCSAgICAgICAgZnJhbWU7ICAvKiBGcmFtZS4gKi8KK30KK1dWTEFOX0xGUkFNRSwgKlBXVkxBTl9MRlJBTUU7CisKKworCisjZGVmaW5lIERFRkFVTFRfTlVNX1RYX0ZSQU1FUyAgICAgICAgICAgNDgKKyNkZWZpbmUgVFhfUV9MT1dfV0FURVJfTUFSSyAgICAgICAgICAgICAoREVGQVVMVF9OVU1fVFhfRlJBTUVTLzMpCisKKyNkZWZpbmUgV1ZMQU5fTUFYX1RYX1FVRVVFUyAgICAgICAgICAgICAxCisKKworI2lmZGVmIFVTRV9XRFMKKwordHlwZWRlZiBzdHJ1Y3Qgd3ZsYW5fd2RzX2lmCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgICAgICpkZXY7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2lzdGVyZWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3F1ZXVlX29uOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICBzdGF0czsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgcnRzVGhyZXNob2xkOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICB0eFJhdGVDbnRsOworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICB3ZHNBZGRyZXNzW0VUSF9BTEVOXTsKK30gV1ZMQU5fV0RTX0lGLCAqUFdWTEFOX1dEU19JRjsKKworI2VuZGlmICAvLyBVU0VfV0RTCisKKworCisjZGVmaW5lIE5VTV9SWF9ERVNDIDUKKyNkZWZpbmUgTlVNX1RYX0RFU0MgNQorCit0eXBlZGVmIHN0cnVjdCBkbWFfc3RyY3QKK3sKKwlERVNDX1NUUkNUICAqdHhfcGFja2V0W05VTV9UWF9ERVNDXTsKKwlERVNDX1NUUkNUICAqcnhfcGFja2V0W05VTV9SWF9ERVNDXTsKKwlERVNDX1NUUkNUICAqcnhfcmVjbGFpbV9kZXNjLCAqdHhfcmVjbGFpbV9kZXNjOyAvLyBEZXNjcmlwdG9ycyBmb3IgaG9zdC1yZWNsYWltIHB1cnBvc2VzIChzZWUgSENGKQorCWludCAgICAgICAgIHR4X3JzY19pbmQ7IC8vIERNQSBUeCByZXNvdXJjZSBpbmRpY2F0b3IgaXMgbWFpbnRhaW5lZCBpbiB0aGUgTVNGLCBub3QgaW4gdGhlIEhDRgorCWludCAgICAgICAgIHJ4X3JzY19pbmQ7IC8vIEFsc28gYWRkZWQgcnggcnNvdXJjZSBpbmRpY2F0b3Igc28gdGhhdCBjbGVhbnVwIGNhbiBiZSBwZXJmb3JtZWQgaWYgYWxsb2MgZmFpbHMKKwlpbnQgICAgICAgICBzdGF0dXM7Cit9IERNQV9TVFJDVDsKKworCisvKiBNYWNyb3MgdXNlZCBpbiBETUEgc3VwcG9ydCAqLworLyogZ2V0IGJ1cyBhZGRyZXNzIG9mIHtyeCx0eH1kbWEgc3RydWN0dXJlIG1lbWJlciwgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyICovCisjZGVmaW5lIFdMX0RNQV9CVVNfQUREUl9MRShzdHIsIGksIG1lbSkgXAorCWNwdV90b19sZTMyKHN0ciMjX2RtYV9hZGRyWyhpKV0gKyAoKGhjZl84ICopJnN0clsoaSldLT5tZW0gLSAoaGNmXzggKilzdHJbKGkpXSkpCisKKworc3RydWN0IHdsX3ByaXZhdGUKK3sKKworI2lmZGVmIEJVU19QQ01DSUEKKwlkZXZfbm9kZV90ICAgICAgICAgICAgICAgICAgbm9kZTsKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZQkgICAgKmxpbms7CisjZW5kaWYgLy8gQlVTX1BDTUNJQQorCisKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICAgKmRldjsKKy8vCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICAqZGV2X25leHQ7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgIHNsb2NrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgICAgICB0YXNrOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICBzdGF0czsKKworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisJc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgICAgIHdzdGF0czsKKy8vCWludCAgICAgICAgICAgICAgICAgICAgICAgICBzcHlfbnVtYmVyOworLy8JdV9jaGFyICAgICAgICAgICAgICAgICAgICAgIHNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKKy8vCXN0cnVjdCBpd19xdWFsaXR5ICAgICAgICAgICBzcHlfc3RhdFtJV19NQVhfU1BZXTsKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEgICAgICAgICAgc3B5X2RhdGE7CisJc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUCisKKworCUlGQl9TVFJDVCAgICAgICAgICAgICAgICAgICBoY2ZDdHg7CisvLzs/IHN0cnVjdCB0aW1lcl9saXN0CQkJdGltZXJfb29yOworLy87PyBoY2ZfMTYJCQkJCQl0aW1lcl9vb3JfY250OworCXVfbG9uZwkJCQkJCXdsYWdzNDlfdHlwZTsJCS8vY29udHJvbHMgb3V0cHV0IGluIC9wcm9jL3dsYWdzNDkKKwl1X2xvbmcgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisJaGNmXzE2CQkJCQkJRGVidWdGbGFnOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdpc3RlcmVkOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBpc19oYW5kbGluZ19pbnQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX3ByZXNlbnQ7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIHN5c2ZzQ3JlYXRlZDsKKwlDRkdfRFJWX0lORk9fU1RSQ1QgICAgICAgICAgZHJpdmVySW5mbzsKKwlDRkdfSURFTlRJVFlfU1RSQ1QgICAgICAgICAgZHJpdmVySWRlbnRpdHk7CisJQ0ZHX0ZXX0lERU5USVRZX1NUUkNUICAgICAgIFN0YXRpb25JZGVudGl0eTsKKwlDRkdfUFJJX0lERU5USVRZX1NUUkNUICAgICAgUHJpbWFyeUlkZW50aXR5OworCUNGR19QUklfSURFTlRJVFlfU1RSQ1QgICAgICBOSUNJZGVudGl0eTsKKworCWx0dl90ICAgICAgICAgICAgICAgICAgICAgICBsdHZSZWNvcmQ7CisJdV9sb25nICAgICAgICAgICAgICAgICAgICAgIHR4Qnl0ZXM7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIG1heFBvcnQ7ICAgICAgICAvKiAwIGZvciBTVEEsIDYgZm9yIEFQICovCisKKwkvKiBFbGVtZW50cyB1c2VkIGZvciBhc3luYyBub3RpZmljYXRpb24gZnJvbSBoYXJkd2FyZSAqLworCVJJRF9MT0dfU1RSQ1QJCQkJUmlkTGlzdFsxMF07CisJbHR2X3QgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRSZWNvcmQ7CisJUFJPQkVfUkVTUAkJCQkgICAgUHJvYmVSZXNwOworCUFTU09DX1NUQVRVU19TVFJDVCAgICAgICAgICBhc3NvY19zdGF0OworCVNFQ1VSSVRZX1NUQVRVU19TVFJDVCAgICAgICBzZWNfc3RhdDsKKworCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWRCdWZbV1ZMQU5fTUFYX0xPT0tBSEVBRF07CisKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGU7ICAgICAgICAgICAvLyAxIC0gMyAoMSBbTm9ybWFsXSB8IDMgW0FkSG9jXSkKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbDsgICAgICAgICAgICAvLyAwIC0gMTQgKDApCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIFR4UmF0ZUNvbnRyb2xbMl07CisJaGNmXzggICAgICAgICAgICAgICAgICAgICAgIERpc3RhbmNlQmV0d2VlbkFQczsgLy8gMSAtIDMgKDEpCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIFJUU1RocmVzaG9sZDsgICAgICAgLy8gMCAtIDIzNDcgKDIzNDcpCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIFBNRW5hYmxlZDsgICAgICAgICAgLy8gMCAtIDIsIDgwMDEgLSA4MDAyICgwKQorCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBNaWNyb3dhdmVSb2J1c3RuZXNzOy8vIDAgLSAxICgwKQorCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVJQlNTOyAgICAgICAgIC8vIDAgLSAxICgwKQorCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RSZWNlaXZlOyAgIC8vIDAgLSAxICgxKQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBNYXhTbGVlcER1cmF0aW9uOyAgIC8vIDAgLSA2NTUzNSAoMTAwKQorCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBNQUNBZGRyZXNzW0VUSF9BTEVOXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya05hbWVbSENGX01BWF9OQU1FX0xFTisxXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGlvbk5hbWVbSENGX01BWF9OQU1FX0xFTisxXTsKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlRW5jcnlwdGlvbjsgICAvLyAwIC0gMSAoMCkKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5MVtNQVhfS0VZX0xFTisxXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5MltNQVhfS0VZX0xFTisxXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5M1tNQVhfS0VZX0xFTisxXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5NFtNQVhfS0VZX0xFTisxXTsKKwloY2ZfOCAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNtaXRLZXlJRDsgICAgICAvLyAxIC0gNCAoMSkKKwlDRkdfREVGQVVMVF9LRVlTX1NUUkNUCSAgICBEZWZhdWx0S2V5czsKKwl1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveFtNQl9TSVpFXTsKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgc3pFbmNyeXB0aW9uW01BWF9FTkNfTEVOXTsKKworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJFbmFibGU7CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHdvbGFzRW5hYmxlOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBhdGltV2luZG93OworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBob2xkb3ZlckR1cmF0aW9uOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RSYXRlWzJdOworCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uOyAvLyBpcyB0aGlzIEFQIHNwZWNpZmljPworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBwcm9taXNjdW91c01vZGU7CisJV1ZMQU5fRFJWX01PREUgICAgICAgICAgICAgIERvd25sb2FkRmlybXdhcmU7ICAgLy8gMCAtIDIgKDAgW05vbmVdIHwgMSBbU1RBXSB8IDIgW0FQXSkKKworCWNoYXIJCQkJCQlmd19pbWFnZV9maWxlbmFtZVtNQVhfTElORV9TSVpFKzFdOworCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIEF1dGhLZXlNZ210U3VpdGU7CisKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgbG9hZEJhbGFuY2luZzsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgbWVkaXVtRGlzdHJpYnV0aW9uOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICB0eFBvd0xldmVsOworCS8vaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHNob3J0UmV0cnlMaW1pdDsKKwkvL2hjZl8xNiAgICAgICAgICAgICAgICAgICAgICBsb25nUmV0cnlMaW1pdDsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgc3JzY1syXTsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgYnJzY1syXTsKKwloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRyb2w7CisJLy9oY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgcHJvYmVEYXRhUmF0ZXNbMl07CisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIG93bkJlYWNvbkludGVydmFsOworCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBjb2V4aXN0ZW5jZTsKKworCVdWTEFOX0ZSQU1FICAgICAgICAgICAgICAgICB0eEY7CisJV1ZMQU5fTEZSQU1FICAgICAgICAgICAgICAgIHR4TGlzdFtERUZBVUxUX05VTV9UWF9GUkFNRVNdOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICB0eEZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIHR4UVtXVkxBTl9NQVhfVFhfUVVFVUVTXTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcXVldWVfb247CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHR4UV9jb3VudDsKKwlERVNDX1NUUkNUICAgICAgICAgICAgICAgICAgZGVzY19yeDsKKwlERVNDX1NUUkNUICAgICAgICAgICAgICAgICAgZGVzY190eDsKKworCVdWTEFOX1BPUlRfU1RBVEUgICAgICAgICAgICBwb3J0U3RhdGU7CisKKwlTY2FuUmVzdWx0ICAgICAgICAgICAgICAgICAgc2Nhbl9yZXN1bHRzOworCVByb2JlUmVzdWx0ICAgICAgICAgICAgICAgICBwcm9iZV9yZXN1bHRzOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9udW1fYXBzOworCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9kbWE7CisJRE1BX1NUUkNUICAgICAgICAgICAgICAgICAgIGRtYTsKKyNpZmRlZiBVU0VfUlRTCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVJUUzsKKyNlbmRpZiAgLy8gVVNFX1JUUworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBEVElNUGVyaW9kOyAgICAgICAgIC8vIDEgLSAyNTUgKDEpCisJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdFBNQnVmZmVyaW5nOworCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBSZWplY3RBbnk7ICAgICAgICAgIC8vIDAgLSAxICgwKQorCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlVW5lbmNyeXB0ZWQ7IC8vIDAgLSAxICgxKQorCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBpbnRyYUJTU1JlbGF5OworI2lmZGVmIFVTRV9XRFMKKwlXVkxBTl9XRFNfSUYgICAgICAgICAgICAgICAgd2RzX3BvcnRbTlVNX1dEU19QT1JUU107CisjZW5kaWYgLy8gVVNFX1dEUworfTsgLy8gd2xfcHJpdmF0ZQorCisjaWZkZWYgSEFWRV9ORVRERVZfUFJJVgorI2RlZmluZSB3bF9wcml2KGRldikgKChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKSBuZXRkZXZfcHJpdihkZXYpKQorI2Vsc2UKK2V4dGVybiBpbmxpbmUgc3RydWN0IHdsX3ByaXZhdGUgKndsX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByZXR1cm4gZGV2LT5wcml2OworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExvY2tpbmcgYW5kIHN5bmNocm9uaXphdGlvbiBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlc2UgZnVuY3Rpb25zICptdXN0KiBiZSBpbmxpbmUgb3IgdGhleSB3aWxsIGJyZWFrIGhvcnJpYmx5IG9uCisgKiBTUEFSQywgZHVlIHRvIGl0cyB3ZWlyZCBzZW1hbnRpY3MgZm9yIHNhdmUvcmVzdG9yZSBmbGFncy4gZXh0ZXJuCisgKiBpbmxpbmUgc2hvdWxkIHByZXZlbnQgdGhlIGtlcm5lbCBmcm9tIGxpbmtpbmcgb3IgbW9kdWxlIGZyb20KKyAqIGxvYWRpbmcgaWYgdGhleSBhcmUgbm90IGlubGluZWQuICovCitleHRlcm4gaW5saW5lIHZvaWQgd2xfbG9jayhzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisJICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNsb2NrLCAqZmxhZ3MpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgd2xfdW5sb2NrKHN0cnVjdCB3bF9wcml2YXRlICpscCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zbG9jaywgKmZsYWdzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJydXB0IGVuYWJsZSBkaXNhYmxlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gaW5saW5lIHZvaWQgd2xfYWN0X2ludF9vbihzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCit7CisJLyoKKwkgKiBPbmx5IGRvIHNvbWV0aGluZyB3aGVuIHRoZSBkcml2ZXIgaXMgaGFuZGxpbmcKKwkgKiBpbnRlcnJ1cHRzLiBIYW5kbGluZyBzdGFydHMgYXQgd2xfb3BlbiBhbmQKKwkgKiBlbmRzIGF0IHdsX2Nsb3NlIHdoZW4gbm90IGluIFJUUyBtb2RlCisJICovCisJaWYobHAtPmlzX2hhbmRsaW5nX2ludCA9PSBXTF9IQU5ETElOR19JTlQpIHsKKwkJaGNmX2FjdGlvbiggJmxwLT5oY2ZDdHgsIEhDRl9BQ1RfSU5UX09OICk7CisJfQorfQorCitleHRlcm4gaW5saW5lIHZvaWQgd2xfYWN0X2ludF9vZmYoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQoreworCS8qCisJICogT25seSBkbyBzb21ldGhpbmcgd2hlbiB0aGUgZHJpdmVyIGlzIGhhbmRsaW5nCisJICogaW50ZXJydXB0cy4gSGFuZGxpbmcgc3RhcnRzIGF0IHdsX29wZW4gYW5kCisJICogZW5kcyBhdCB3bF9jbG9zZSB3aGVuIG5vdCBpbiBSVFMgbW9kZQorCSAqLworCWlmKGxwLT5pc19oYW5kbGluZ19pbnQgPT0gV0xfSEFORExJTkdfSU5UKSB7CisJCWhjZl9hY3Rpb24oICZscC0+aGNmQ3R4LCBIQ0ZfQUNUX0lOVF9PRkYgKTsKKwl9Cit9CisKKyNlbmRpZiAgLy8gX19XQVZFTEFOMl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjc2NGEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jCkBAIC0wLDAgKzEsMzg2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBkcml2ZXIgZW50cnkgcG9pbnRzIGFuZCBvdGhlciBhZGFwdGVyCisgKiAgIHNwZWNpZmljIHJvdXRpbmVzLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsbG93IHN1cHBvcnQgZm9yIGNhbGxpbmcgc3lzdGVtIGZjbnMgdG8gYWNjZXNzIEYvVyBpYW1nZSBmaWxlICovCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisvLyAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisvLyAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2luLmg+CisvLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKy8vICNpbmNsdWRlIDxhc20vaW8uaD4KKy8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisvLyAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjZGVmaW5lIEJJTl9ETCAwCisjaWYgQklOX0RMCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2VuZGlmIC8vIEJJTl9ETAorCisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorCisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8ZGhmLmg+CisvL2luIG9yZGVyIHRvIGdldCBhcm91bmQ6OiB3bF9tYWluLmM6MjIyOTogYEhSRUdfRVZfUkRNQUQnIHVuZGVjbGFyZWQgKGZpcnN0IHVzZSBpbiB0aGlzIGZ1bmN0aW9uKQorI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CisjaW5jbHVkZSA8d2xfd2V4dC5oPgorCisjaWZkZWYgVVNFX1BST0ZJTEUKKyNpbmNsdWRlIDx3bF9wcm9maWxlLmg+CisjZW5kaWYgIC8qIFVTRV9QUk9GSUxFICovCisKKyNpZmRlZiBCVVNfUENNQ0lBCisjaW5jbHVkZSA8d2xfY3MuaD4KKyNlbmRpZiAgLyogQlVTX1BDTUNJQSAqLworCisjaWZkZWYgQlVTX1BDSQorI2luY2x1ZGUgPHdsX3BjaS5oPgorI2VuZGlmICAvKiBCVVNfUENJICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJbWFjcm8gZGVmaW50aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVkFMSURfUEFSQU0oQykgXAorCXsgXAorCQlpZiAoIShDKSkgXAorCQl7IFwKKwkJCXByaW50ayhLRVJOX0lORk8gIldpcmVsZXNzLCBwYXJhbWV0ZXIgZXJyb3I6IFwiJXNcIlxuIiwgI0MpOyBcCisJCQlnb3RvIGZhaWxlZDsgXAorCQl9IFwKKwl9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJbG9jYWwgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9pc3JfaGFuZGxlciggdW5zaWduZWQgbG9uZyBwICk7CisKKyNpZiAwIC8vU0NVTExfVVNFX1BST0MgLyogZG9uJ3Qgd2FzdGUgc3BhY2UgaWYgdW51c2VkICovCisvL2ludCBzY3VsbF9yZWFkX3Byb2NtZW0oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50IHVudXNlZCk7CitpbnQgc2N1bGxfcmVhZF9wcm9jbWVtKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhICk7CitzdGF0aWMgaW50IHdyaXRlX2ludChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHByb2Nfd3JpdGUoY29uc3QgY2hhciAqbmFtZSwgd3JpdGVfcHJvY190ICp3LCB2b2lkICpkYXRhKTsKKworI2VuZGlmIC8qIFNDVUxMX1VTRV9QUk9DICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb2R1bGUgcGFyYW1ldGVyIGRlZmluaXRpb25zIC0gc2V0IHdpdGggJ2luc21vZCcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgcF91MTYgICAgaXJxX21hc2sgICAgICAgICAgICAgICAgPSAweGRlYjg7IC8vIElSUTMsNCw1LDcsOSwxMCwxMSwxMiwxNCwxNQorc3RhdGljIHBfczggICAgIGlycV9saXN0WzRdICAgICAgICAgICAgID0geyAtMSB9OworCisjaWYgMAorTU9EVUxFX1BBUk0oaXJxX21hc2ssICAgICAgICAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxX21hc2ssICAgICAgICAgICAgICAgIklSUSBtYXNrIFsweGRlYjhdIik7CitNT0RVTEVfUEFSTShpcnFfbGlzdCwgICAgICAgICAgICAgICAiMS00YiIpOworTU9EVUxFX1BBUk1fREVTQyhpcnFfbGlzdCwgICAgICAgICAgICAgICAiSVJRIGxpc3QgWzxpcnFfbWFzaz5dIik7CisjZW5kaWYKKworc3RhdGljIHBfdTggICAgIFBBUk1fQVVUSEVOVElDQVRJT04gICAgICAgIAk9IFBBUk1fREVGQVVMVF9BVVRIRU5USUNBVElPTjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0FVVEhfS0VZX01HTVRfU1VJVEUgICAJPSBQQVJNX0RFRkFVTFRfQVVUSF9LRVlfTUdNVF9TVUlURTsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0JSU0NfMkdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfQlJTQ18yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fQlJTQ181R0haICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9CUlNDXzVHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9DT0VYSVNURU5DRSAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0NPRVhJU1RFTkNFOworc3RhdGljIHBfdTE2ICAgIFBBUk1fQ09OTkVDVElPTl9DT05UUk9MICAgIAk9IFBBUk1fREVGQVVMVF9DT05ORUNUSU9OX0NPTlRST0w7ICAvLzs/cmVuYW1lIGFuZCBtb3ZlCitzdGF0aWMgcF9jaGFyICAqUEFSTV9DUkVBVEVfSUJTUyAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX0NSRUFURV9JQlNTX1NUUjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0RFU0lSRURfU1NJRCAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1NJRDsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICAgICAgPSAiIjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OICAgICAJPSBQQVJNX0RFRkFVTFRfRU5BQkxFX0VOQ1JZUFRJT047CitzdGF0aWMgcF9jaGFyICAqUEFSTV9FWENMVURFX1VORU5DUllQVEVEICAgCT0gUEFSTV9ERUZBVUxUX0VYQ0xVREVfVU5FTkNSWVBURURfU1RSOworc3RhdGljIHBfY2hhciAgKlBBUk1fSU5UUkFfQlNTX1JFTEFZICAgICAgIAk9IFBBUk1fREVGQVVMVF9JTlRSQV9CU1NfUkVMQVlfU1RSOworc3RhdGljIHBfY2hhciAgKlBBUk1fS0VZMSAgICAgICAgICAgICAgICAgIAk9ICIiOworc3RhdGljIHBfY2hhciAgKlBBUk1fS0VZMiAgICAgICAgICAgICAgICAgIAk9ICIiOworc3RhdGljIHBfY2hhciAgKlBBUk1fS0VZMyAgICAgICAgICAgICAgICAgIAk9ICIiOworc3RhdGljIHBfY2hhciAgKlBBUk1fS0VZNCAgICAgICAgICAgICAgICAgIAk9ICIiOworc3RhdGljIHBfY2hhciAgKlBBUk1fTE9BRF9CQUxBTkNJTkcgICAgICAgIAk9IFBBUk1fREVGQVVMVF9MT0FEX0JBTEFOQ0lOR19TVFI7CitzdGF0aWMgcF91MTYgICAgUEFSTV9NQVhfU0xFRVAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX01BWF9QTV9TTEVFUDsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX01FRElVTV9ESVNUUklCVVRJT04gICAJPSBQQVJNX0RFRkFVTFRfTUVESVVNX0RJU1RSSUJVVElPTl9TVFI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyAgCT0gUEFSTV9ERUZBVUxUX01JQ1JPV0FWRV9ST0JVU1RORVNTX1NUUjsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcJPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1BNX0JVRkZFUklOR19TVFI7CitzdGF0aWMgcF91MTYgICAgUEFSTV9NVUxUSUNBU1RfUkFURSAgICAgICAgCT0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzJHSFo7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9NVUxUSUNBU1RfUlggICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SWF9TVFI7CitzdGF0aWMgcF91OCAgICAgUEFSTV9ORVRXT1JLX0FERFJbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX09XTl9BVElNX1dJTkRPVyAgICAgICAJPSBQQVJNX0RFRkFVTFRfT1dOX0FUSU1fV0lORE9XOworc3RhdGljIHBfdTE2ICAgIFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCAgIAk9IFBBUk1fREVGQVVMVF9PV05fQkVBQ09OX0lOVEVSVkFMOworc3RhdGljIHBfdTggICAgIFBBUk1fT1dOX0NIQU5ORUwgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9PV05fQ0hBTk5FTDsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX09XTl9EVElNX1BFUklPRCAgICAgICAJPSBQQVJNX0RFRkFVTFRfT1dOX0RUSU1fUEVSSU9EOworc3RhdGljIHBfY2hhciAgKlBBUk1fT1dOX05BTUUgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9PV05fTkFNRTsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX09XTl9TU0lEICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1NJRDsKK3N0YXRpYyBwX3UxNglQQVJNX1BNX0VOQUJMRUQgICAgICAgICAgICAJPSBXVkxBTl9QTV9TVEFURV9ESVNBQkxFRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OICAJPSBQQVJNX0RFRkFVTFRfUE1fSE9MRE9WRVJfRFVSQVRJT047CitzdGF0aWMgcF91OCAgICAgUEFSTV9QT1JUX1RZUEUgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1BPUlRfVFlQRTsKK3N0YXRpYyBwX2NoYXIgICpQQVJNX1BST01JU0NVT1VTX01PREUgICAgICAJPSBQQVJNX0RFRkFVTFRfUFJPTUlTQ1VPVVNfTU9ERV9TVFI7CitzdGF0aWMgcF9jaGFyICAqUEFSTV9SRUpFQ1RfQU5ZICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JFSkVDVF9BTllfU1RSOworI2lmZGVmIFVTRV9XRFMKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQxICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQyICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQzICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ0ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ1ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1JUU19USFJFU0hPTEQ2ICAgICAgICAJPSBQQVJNX0RFRkFVTFRfUlRTX1RIUkVTSE9MRDsKKyNlbmRpZiAvLyBVU0VfV0RTCitzdGF0aWMgcF91MTYgICAgUEFSTV9SVFNfVEhSRVNIT0xEICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1JUU19USFJFU0hPTEQ7CitzdGF0aWMgcF91MTYgICAgUEFSTV9TUlNDXzJHSFogICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1NSU0NfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1NSU0NfNUdIWiAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfU1JTQ181R0haOworc3RhdGljIHBfdTggICAgIFBBUk1fU1lTVEVNX1NDQUxFICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9TWVNURU1fU0NBTEU7CitzdGF0aWMgcF91OCAgICAgUEFSTV9UWF9LRVkgICAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX0tFWTsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1BPV19MRVZFTCAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUE9XX0xFVkVMOworI2lmZGVmIFVTRV9XRFMKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEUxICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTIgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFMyAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKK3N0YXRpYyBwX3UxNiAgICBQQVJNX1RYX1JBVEU0ICAgICAgICAgICAgICAJPSBQQVJNX0RFRkFVTFRfVFhfUkFURV8yR0haOworc3RhdGljIHBfdTE2ICAgIFBBUk1fVFhfUkFURTUgICAgICAgICAgICAgIAk9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzJHSFo7CitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFNiAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKKyNlbmRpZiAvLyBVU0VfV0RTCitzdGF0aWMgcF91MTYgICAgUEFSTV9UWF9SQVRFICAgICAgICAgICAgICAgCT0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKKyNpZmRlZiBVU0VfV0RTCitzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzFbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTMltFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1MzW0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CitzdGF0aWMgcF91OCAgICAgUEFSTV9XRFNfQUREUkVTUzRbRVRIX0FMRU5dCT0gUEFSTV9ERUZBVUxUX05FVFdPUktfQUREUjsKK3N0YXRpYyBwX3U4ICAgICBQQVJNX1dEU19BRERSRVNTNVtFVEhfQUxFTl0JPSBQQVJNX0RFRkFVTFRfTkVUV09SS19BRERSOworc3RhdGljIHBfdTggICAgIFBBUk1fV0RTX0FERFJFU1M2W0VUSF9BTEVOXQk9IFBBUk1fREVGQVVMVF9ORVRXT1JLX0FERFI7CisjZW5kaWYgLy8gVVNFX1dEUworCisKKyNpZiAwCitNT0RVTEVfUEFSTShQQVJNX0RFU0lSRURfU1NJRCwgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9ERVNJUkVEX1NTSUQsICAgICAgICAgICAgICJOZXR3b3JrIE5hbWUgKDxzdHJpbmc+KSBbQU5ZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9PV05fU1NJRCwgICAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX1NTSUQsICAgICAgICAgICAgICAgICAiTmV0d29yayBOYW1lICg8c3RyaW5nPikgW0FOWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fT1dOX0NIQU5ORUwsICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9DSEFOTkVMLCAgICAgICAgICAgICAgIkNoYW5uZWwgKDAgLSAxNCkgWzBdIik7CitNT0RVTEVfUEFSTShQQVJNX1NZU1RFTV9TQ0FMRSwgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9TWVNURU1fU0NBTEUsICAgICAgICAgICAgICJEaXN0YW5jZSBCZXR3ZWVuIEFQcyAoMSAtIDMpIFsxXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFLCAgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURSwgICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQsICAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xELCAgICAgICAgICAgICJNZWRpdW0gUmVzZXJ2YXRpb24gKFJUUy9DVFMgRnJhZ21lbnQgTGVuZ3RoKSAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTLCAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUywgICAgICJNaWNyb3dhdmUgT3ZlbiBSb2J1c3RuZXNzIEVuYWJsZWQgKDxzdHJpbmc+IE4gb3IgWSkgW05dIik7CitNT0RVTEVfUEFSTShQQVJNX09XTl9OQU1FLCAgICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9PV05fTkFNRSwgICAgICAgICAgICAgICAgICJTdGF0aW9uIE5hbWUgKDxzdHJpbmc+KSBbTGludXhdIik7CisKK01PRFVMRV9QQVJNKFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04sICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0VOQUJMRV9FTkNSWVBUSU9OLCAgICAgICAgIkVuY3J5cHRpb24gTW9kZSAoMCAtIDcpIFswXSIpOworCitNT0RVTEVfUEFSTShQQVJNX0tFWTEsICAgICAgICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9LRVkxLCAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuY3J5cHRpb24gS2V5IDEgKDxzdHJpbmc+KSBbXSIpOworTU9EVUxFX1BBUk0oUEFSTV9LRVkyLCAgICAgICAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fS0VZMiwgICAgICAgICAgICAgICAgICAgICAiRGF0YSBFbmNyeXB0aW9uIEtleSAyICg8c3RyaW5nPikgW10iKTsKK01PRFVMRV9QQVJNKFBBUk1fS0VZMywgICAgICAgICAgICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0tFWTMsICAgICAgICAgICAgICAgICAgICAgIkRhdGEgRW5jcnlwdGlvbiBLZXkgMyAoPHN0cmluZz4pIFtdIik7CitNT0RVTEVfUEFSTShQQVJNX0tFWTQsICAgICAgICAgICAgICAgICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9LRVk0LCAgICAgICAgICAgICAgICAgICAgICJEYXRhIEVuY3J5cHRpb24gS2V5IDQgKDxzdHJpbmc+KSBbXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9LRVksICAgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfS0VZLCAgICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgS2V5IElEICgxIC0gNCkgWzFdIik7CitNT0RVTEVfUEFSTShQQVJNX01VTFRJQ0FTVF9SQVRFLCAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUkFURSwgICAgICAgICAgICJNdWx0aWNhc3QgUmF0ZSIpOworTU9EVUxFX1BBUk0oUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSwgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fRE9XTkxPQURfRklSTVdBUkUsICAgICAgICAiZmlsZW5hbWUgb2YgZmlybXdhcmUgaW1hZ2UiKTsKKworTU9EVUxFX1BBUk0oUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFLCAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSwgICAgICAiQXV0aGVudGljYXRpb24gS2V5IE1hbmFnZW1lbnQgc3VpdGUgKDAtNCkgWzBdIik7CisKK01PRFVMRV9QQVJNKFBBUk1fTE9BRF9CQUxBTkNJTkcsICAgICAgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0xPQURfQkFMQU5DSU5HLCAgICAgICAgICAgIkxvYWQgQmFsYW5jaW5nIEVuYWJsZWQgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7CitNT0RVTEVfUEFSTShQQVJNX01FRElVTV9ESVNUUklCVVRJT04sICAgInMiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NRURJVU1fRElTVFJJQlVUSU9OLCAgICAgICJNZWRpdW0gRGlzdHJpYnV0aW9uIEVuYWJsZWQgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1BPV19MRVZFTCwgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9QT1dfTEVWRUwsICAgICAgICAgICAgICJUcmFuc21pdCBQb3dlciAoMCAtIDYpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9TUlNDXzJHSFosICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fU1JTQ18yR0haLCAgICAgICAgICAgICAgICAiU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wgMi40IEdIeiIpOworTU9EVUxFX1BBUk0oUEFSTV9TUlNDXzVHSFosICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fU1JTQ181R0haLCAgICAgICAgICAgICAgICAiU3VwcG9ydGVkIFJhdGUgU2V0IENvbnRyb2wgNS4wIEdIeiIpOworTU9EVUxFX1BBUk0oUEFSTV9CUlNDXzJHSFosICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fQlJTQ18yR0haLCAgICAgICAgICAgICAgICAiQmFzaWMgUmF0ZSBTZXQgQ29udHJvbCAyLjQgR0h6Iik7CitNT0RVTEVfUEFSTShQQVJNX0JSU0NfNUdIWiwgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9CUlNDXzVHSFosICAgICAgICAgICAgICAgICJCYXNpYyBSYXRlIFNldCBDb250cm9sIDUuMCBHSHoiKTsKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CitNT0RVTEVfUEFSTShQQVJNX1BNX0VOQUJMRUQsICAgICAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9FTkFCTEVELCAgICAgICAgICAgICAgICJQb3dlciBNYW5hZ2VtZW50IFN0YXRlICgwIC0gMiwgODAwMSAtIDgwMDIpIFswXSIpOworTU9EVUxFX1BBUk0oUEFSTV9QT1JUX1RZUEUsICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUE9SVF9UWVBFLCAgICAgICAgICAgICAgICAiUG9ydCBUeXBlICgxIC0gMykgWzFdIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9DUkVBVEVfSUJTUywgICAgICAgICAgICJzIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0NSRUFURV9JQlNTLCAgICAgICAgICAgICAgIkNyZWF0ZSBJQlNTICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1JYLCAgICAgICAgICAicyIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9NVUxUSUNBU1RfUlgsICAgICAgICAgICAgICJNdWx0aWNhc3QgUmVjZWl2ZSBFbmFibGUgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9NQVhfU0xFRVAsICAgICAgICAgICAgICJoIik7CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX01BWF9TTEVFUCwgICAgICAgICAgICAgICAgIk1heGltdW0gUG93ZXIgTWFuYWdlbWVudCBTbGVlcCBEdXJhdGlvbiAoMCAtIDY1NTM1KSBbMTAwXSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAiNmIiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fTkVUV09SS19BRERSLCAgICAgICAgICAgICAiSGFyZHdhcmUgRXRoZXJuZXQgQWRkcmVzcyAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFs8ZmFjdG9yeSB2YWx1ZT5dIik7CisvLzs/TU9EVUxFX1BBUk0oUEFSTV9BVVRIRU5USUNBVElPTiwgICAgICAgICJiIik7CisvLworLy90cmFja2VyIDEyNDQ4CisvLzs/TU9EVUxFX1BBUk1fREVTQyhQQVJNX0FVVEhFTlRJQ0FUSU9OLCAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIFR5cGUgKDAtMikgWzBdIDA9T3BlbiAxPVNoYXJlZEtleSAyPUxFQVAiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKGF1dGhlbnRpY2F0aW9uLCAgICAgICAgICJBdXRoZW50aWNhdGlvbiBUeXBlICgxLTIpIFsxXSAxPU9wZW4gMj1TaGFyZWRLZXkiKTsKKy8vdHJhY2tlciAxMjQ0OAorLy8KKy8vOz9NT0RVTEVfUEFSTShQQVJNX09XTl9BVElNX1dJTkRPVywgICAgICAgImIiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0FUSU1fV0lORE9XLCAgICAgICAgICAiQVRJTSBXaW5kb3cgdGltZSBpbiBUVSBmb3IgSUJTUyBjcmVhdGlvbiAoMC0xMDApIFswXSIpOworLy87P01PRFVMRV9QQVJNKFBBUk1fUE1fSE9MRE9WRVJfRFVSQVRJT04sICAiYiIpOworLy87P01PRFVMRV9QQVJNX0RFU0MoUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTiwgICAgICJUaW1lIHN0YXRpb24gcmVtYWlucyBhd2FrZSBhZnRlciBNQUMgZnJhbWUgdHJhbnNmZXIgd2hlbiBQTSBpcyBvbiAoMC02NTUzNSkgWzEwMF0iKTsKKy8vOz9NT0RVTEVfUEFSTShQQVJNX1BST01JU0NVT1VTX01PREUsICAgICAgInMiKTsKKy8vOz9NT0RVTEVfUEFSTV9ERVNDKFBBUk1fUFJPTUlTQ1VPVVNfTU9ERSwgICAgICAgICAiUHJvbWlzY3VvdXMgTW9kZSBFbmFibGUgKDxzdHJpbmc+IFkgb3IgTiApIFtOXSIgKTsKKy8vOz8KK01PRFVMRV9QQVJNKFBBUk1fQ09OTkVDVElPTl9DT05UUk9MLCAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTCwgICAgICAgIkNvbm5lY3Rpb24gQ29udHJvbCAoMCAtIDMpIFsyXSIpOworI2VuZGlmIC8qIEhDRl9TVEEgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCQkJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorTU9EVUxFX1BBUk0oUEFSTV9PV05fRFRJTV9QRVJJT0QsICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fT1dOX0RUSU1fUEVSSU9ELCAgICAgICAgICAiRFRJTSBQZXJpb2QgKDAgLSAyNTUpIFsxXSIpOworTU9EVUxFX1BBUk0oUEFSTV9SRUpFQ1RfQU5ZLCAgICAgICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUkVKRUNUX0FOWSwgICAgICAgICAgICAgICAiQ2xvc2VkIFN5c3RlbSAoPHN0cmluZz4gTiBvciBZKSBbTl0iKTsKK01PRFVMRV9QQVJNKFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCwgICAicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0VYQ0xVREVfVU5FTkNSWVBURUQsICAgICAgIkRlbnkgbm9uLWVuY3J5cHRlZCAoPHN0cmluZz4gTiBvciBZKSBbWV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORywicyIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkcsICAgIkJ1ZmZlciBNQUMgZnJhbWVzIGZvciBUeCBhZnRlciBEVElNICg8c3RyaW5nPiBZIG9yIE4pIFtZXSIpOworTU9EVUxFX1BBUk0oUEFSTV9JTlRSQV9CU1NfUkVMQVksICAgICAgICJzIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fSU5UUkFfQlNTX1JFTEFZLCAgICAgICAgICAiSW50cmFCU1MgUmVsYXkgKDxzdHJpbmc+IE4gb3IgWSkgW1ldIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQxLCAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xEMSwgICAgICAgICAgICJSVFMgVGhyZXNob2xkLCBXRFMgUG9ydCAxICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDIsICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQyLCAgICAgICAgICAgIlJUUyBUaHJlc2hvbGQsIFdEUyBQb3J0IDIgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xEMywgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDMsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgMyAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX1JUU19USFJFU0hPTEQ0LCAgICAgICAgImgiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9SVFNfVEhSRVNIT0xENCwgICAgICAgICAgICJSVFMgVGhyZXNob2xkLCBXRFMgUG9ydCA0ICgyNTYgLSAyMzQ3KSBbMjM0N10iKTsKK01PRFVMRV9QQVJNKFBBUk1fUlRTX1RIUkVTSE9MRDUsICAgICAgICAiaCIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1JUU19USFJFU0hPTEQ1LCAgICAgICAgICAgIlJUUyBUaHJlc2hvbGQsIFdEUyBQb3J0IDUgKDI1NiAtIDIzNDcpIFsyMzQ3XSIpOworTU9EVUxFX1BBUk0oUEFSTV9SVFNfVEhSRVNIT0xENiwgICAgICAgICJoIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fUlRTX1RIUkVTSE9MRDYsICAgICAgICAgICAiUlRTIFRocmVzaG9sZCwgV0RTIFBvcnQgNiAoMjU2IC0gMjM0NykgWzIzNDddIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEUxLCAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFMSwgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wsIFdEUyBQb3J0IDEgKDEgLSA3KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTIsICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEUyLCAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCwgV0RTIFBvcnQgMiAoMSAtIDcpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFMywgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTMsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCAzICgxIC0gNykgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1RYX1JBVEU0LCAgICAgICAgICAgICAgImIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9UWF9SQVRFNCwgICAgICAgICAgICAgICAgICJUcmFuc21pdCBSYXRlIENvbnRyb2wsIFdEUyBQb3J0IDQgKDEgLSA3KSBbM10iKTsKK01PRFVMRV9QQVJNKFBBUk1fVFhfUkFURTUsICAgICAgICAgICAgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1RYX1JBVEU1LCAgICAgICAgICAgICAgICAgIlRyYW5zbWl0IFJhdGUgQ29udHJvbCwgV0RTIFBvcnQgNSAoMSAtIDcpIFszXSIpOworTU9EVUxFX1BBUk0oUEFSTV9UWF9SQVRFNiwgICAgICAgICAgICAgICJiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fVFhfUkFURTYsICAgICAgICAgICAgICAgICAiVHJhbnNtaXQgUmF0ZSBDb250cm9sLCBXRFMgUG9ydCA2ICgxIC0gNykgWzNdIik7CitNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTMSwgICAgICAgICAgIjZiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1MxLCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDEgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOworTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzIsICAgICAgICAgICI2YiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTMiwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCAyIChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1MzLCAgICAgICAgICAiNmIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzMsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgMyAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CitNT0RVTEVfUEFSTShQQVJNX1dEU19BRERSRVNTNCwgICAgICAgICAgIjZiIik7CitNT0RVTEVfUEFSTV9ERVNDKFBBUk1fV0RTX0FERFJFU1M0LCAgICAgICAgICAgICAiTUFDIEFkZHJlc3MsIFdEUyBQb3J0IDQgKFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdLFsweDAwLTB4ZmZdKSBbezB9XSIpOworTU9EVUxFX1BBUk0oUEFSTV9XRFNfQUREUkVTUzUsICAgICAgICAgICI2YiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX1dEU19BRERSRVNTNSwgICAgICAgICAgICAgIk1BQyBBZGRyZXNzLCBXRFMgUG9ydCA1IChbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSxbMHgwMC0weGZmXSkgW3swfV0iKTsKK01PRFVMRV9QQVJNKFBBUk1fV0RTX0FERFJFU1M2LCAgICAgICAgICAiNmIiKTsKK01PRFVMRV9QQVJNX0RFU0MoUEFSTV9XRFNfQUREUkVTUzYsICAgICAgICAgICAgICJNQUMgQWRkcmVzcywgV0RTIFBvcnQgNiAoWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0sWzB4MDAtMHhmZl0pIFt7MH1dIik7CisKK01PRFVMRV9QQVJNKFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCwgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX09XTl9CRUFDT05fSU5URVJWQUwsICAgICAgIk93biBCZWFjb24gSW50ZXJ2YWwgKDIwIC0gMjAwKSBbMTAwXSIpOworTU9EVUxFX1BBUk0oUEFSTV9DT0VYSVNURU5DRSwgICAiYiIpOworTU9EVUxFX1BBUk1fREVTQyhQQVJNX0NPRVhJU1RFTkNFLCAgICAgICJDb2V4aXN0ZW5jZSAoMC03KSBbMF0iKTsKKworI2VuZGlmIC8qIEhDRl9BUCAqLworI2VuZGlmCisKKy8qIEVORCBORVcgUEFSQU1FVEVSUyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRlYnVnZ2luZyBzcGVjaWZpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCisKK3N0YXRpYyBwX3UzMiAgICBwY19kZWJ1ZyA9IERCR19MVkw7CisvL01PRFVMRV9QQVJNKHBjX2RlYnVnLCAiaSIpOworLypzdGF0aWMgOz9jb25mbGljdHMgd2l0aCBteSB1bmRlcnN0YW5kaW5nIG9mIENMIHBhcmFtZXRlcnMgYW5kIGJyZWFrcyBub3cgSSBtb3ZlZAorICogdGhlIGNvcnJlc3BvbmRpZyBsb2dpYyB0byB3bF9wcm9maWxlCisgKi8gcF91MzIgICAgRGVidWdGbGFnID0gfjA7IC8vcmVjb2duaXphYmxlICJ1bmRlZmluZWQgdmFsdWUiIHJhdGhlciB0aGVuIERCR19ERUZBVUxUUzsKKy8vTU9EVUxFX1BBUk0oRGVidWdGbGFnLCAibCIpOworCitkYmdfaW5mb190ICAgd2xfaW5mbyA9IHsgREJHX01PRF9OQU1FLCAwLCAwIH07CitkYmdfaW5mb190ICAqRGJnSW5mbyA9ICZ3bF9pbmZvOworCisjZW5kaWYgLyogREJHICovCisjaWZkZWYgVVNFX1JUUworCitzdGF0aWMgcF9jaGFyICAqdXNlUlRTID0gIk4iOworTU9EVUxFX1BBUk0oIHVzZVJUUywgInMiICk7CitNT0RVTEVfUEFSTV9ERVNDKCB1c2VSVFMsICJVc2UgUlRTIHRlc3QgaW50ZXJmYWNlICg8c3RyaW5nPiBOIG9yIFkpIFtOXSIgKTsKKworI2VuZGlmICAvKiBVU0VfUlRTICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZmlybXdhcmUgZG93bmxvYWQgc3BlY2lmaWNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHN0cnVjdCBDRkdfUkFOR0UyX1NUUkNUIEJBU0VECisJY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaTsgCSAgICAvLyBkZXNjcmliZXMgcHJpbWFyeS1hY3RvciByYW5nZSBvZiBIQ0YKKworI2lmIDAgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKK2V4dGVybiBtZW1pbWFnZSBhcDsgICAgICAgICAgICAgICAgIC8vIEFQIGZpcm13YXJlIGltYWdlIHRvIGJlIGRvd25sb2FkZWQKKyNlbmRpZiAvKiBIQ0ZfQVAgKi8KKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisvL2V4dGVybiBtZW1pbWFnZSBzdGF0aW9uOyAgICAgICAgICAgIC8vIFNUQSBmaXJtd2FyZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkCitleHRlcm4gbWVtaW1hZ2UgZndfaW1hZ2U7ICAgICAgICAgICAgLy8gZmlybXdhcmUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZAorI2VuZGlmIC8qIEhDRl9TVEEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaW5zZXJ0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgd2xfaW5zZXJ0KCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiAgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQorICogIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUUlVFIG9yIEZBTFNFCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pbnNlcnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCWludCAgICAgICAgICAgICAgICAgICAgIGk7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3MgPSAwOworCXN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9pbnNlcnQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBhZGFwdGVyIGhhcmR3YXJlLiAqLworCW1lbXNldCggJiggbHAtPmhjZkN0eCApLCAwLCBzaXplb2YoIElGQl9TVFJDVCApKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycy4gKi8KKwlzcGluX2xvY2tfaW5pdCggJiggbHAtPnNsb2NrICkpOworCisJLyogSW50aWFsaXplIHN0YXRlcyAqLworCS8vbHAtPmxvY2tjb3VudCA9IDA7IC8vUEUxRE5OCisgICAgICAgIGxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9OT1RfSEFORExJTkdfSU5UOworCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQ7CisKKwlscC0+ZGV2ID0gZGV2OworCisJREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX21hc2siLCAiMHglMDR4IiwgaXJxX21hc2sgJiAweDBGRkZGICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCAiaXJxX2xpc3QiLCAiMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4IiwKKwkJCSAgIGlycV9saXN0WzBdICYgMHgwRkYsIGlycV9saXN0WzFdICYgMHgwRkYsCisJCQkgICBpcnFfbGlzdFsyXSAmIDB4MEZGLCBpcnFfbGlzdFszXSAmIDB4MEZGICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfREVTSVJFRF9TU0lELCAiXCIlc1wiIiwgUEFSTV9ERVNJUkVEX1NTSUQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fU1NJRCwgIlwiJXNcIiIsIFBBUk1fT1dOX1NTSUQgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCwgIiVkIiwgUEFSTV9PV05fQ0hBTk5FTCk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFLCAiJWQiLCBQQVJNX1NZU1RFTV9TQ0FMRSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUsICIlZCIsIFBBUk1fVFhfUkFURSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTLCAiXCIlc1wiIiwgUEFSTV9NSUNST1dBVkVfUk9CVVNUTkVTUyApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9OQU1FLCAiXCIlc1wiIiwgUEFSTV9PV05fTkFNRSApOworLy87PwkJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04sICJcIiVzXCIiLCBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZMSwgIlwiJXNcIiIsIFBBUk1fS0VZMSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0tFWTIsICJcIiVzXCIiLCBQQVJNX0tFWTIgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9LRVkzLCAiXCIlc1wiIiwgUEFSTV9LRVkzICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfS0VZNCwgIlwiJXNcIiIsIFBBUk1fS0VZNCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX0tFWSwgIiVkIiwgUEFSTV9UWF9LRVkgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSwgIiVkIiwgUEFSTV9NVUxUSUNBU1RfUkFURSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0RPV05MT0FEX0ZJUk1XQVJFLCAiXCIlc1wiIiwgUEFSTV9ET1dOTE9BRF9GSVJNV0FSRSApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUsICIlZCIsIFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSApOworLy87PyNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisJCQkJCS8vOz9zaG91bGQgd2UgbWFrZSB0aGlzIGNvZGUgY29uZGl0aW9uYWwgZGVwZW5kaW5nIG9uIGluIFNUQSBtb2RlCisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9QT1JUX1RZUEUsICIlZCIsIFBBUk1fUE9SVF9UWVBFICk7CisJCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BNX0VOQUJMRUQsICIlMDR4IiwgUEFSTV9QTV9FTkFCTEVEICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9DUkVBVEVfSUJTUywgIlwiJXNcIiIsIFBBUk1fQ1JFQVRFX0lCU1MgKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCwgIlwiJXNcIiIsIFBBUk1fTVVMVElDQVNUX1JYICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9NQVhfU0xFRVAsICIlZCIsIFBBUk1fTUFYX1NMRUVQICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9ORVRXT1JLX0FERFIsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fTkVUV09SS19BRERSICkpOworLy87PyAgICAgICAgREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfQVVUSEVOVElDQVRJT04sICIlZCIsIFBBUk1fQVVUSEVOVElDQVRJT04gKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX09XTl9BVElNX1dJTkRPVywgIiVkIiwgUEFSTV9PV05fQVRJTV9XSU5ET1cgKTsKKy8vOz8gICAgICAgIERCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OLCAiJWQiLCBQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OICk7CisvLzs/ICAgICAgICBEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9QUk9NSVNDVU9VU19NT0RFLCAiXCIlc1wiIiwgUEFSTV9QUk9NSVNDVU9VU19NT0RFICk7CisvLzs/I2VuZGlmIC8qIEhDRl9TVEEgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCQkvLzs/SSBndWVzczogbm8sIHNpbmNlIHRoaXMgaXMgRGVidWcgbW9kZSBvbmx5CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9ELCAiJWQiLCBQQVJNX09XTl9EVElNX1BFUklPRCApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JFSkVDVF9BTlksICJcIiVzXCIiLCBQQVJNX1JFSkVDVF9BTlkgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVELCAiXCIlc1wiIiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfTVVMVElDQVNUX1BNX0JVRkZFUklORywgIlwiJXNcIiIsIFBBUk1fTVVMVElDQVNUX1BNX0JVRkZFUklORyApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX0lOVFJBX0JTU19SRUxBWSwgIlwiJXNcIiIsIFBBUk1fSU5UUkFfQlNTX1JFTEFZICk7CisjaWZkZWYgVVNFX1dEUworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxLCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQxICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDIgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMywgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xEMyApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0LCAiJWQiLCBQQVJNX1JUU19USFJFU0hPTEQ0ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUsICIlZCIsIFBBUk1fUlRTX1RIUkVTSE9MRDUgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiwgIiVkIiwgUEFSTV9SVFNfVEhSRVNIT0xENiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEUxLCAiJWQiLCBQQVJNX1RYX1JBVEUxICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTIsICIlZCIsIFBBUk1fVFhfUkFURTIgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFMywgIiVkIiwgUEFSTV9UWF9SQVRFMyApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1RYX1JBVEU0LCAiJWQiLCBQQVJNX1RYX1JBVEU0ICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfVFhfUkFURTUsICIlZCIsIFBBUk1fVFhfUkFURTUgKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9UWF9SQVRFNiwgIiVkIiwgUEFSTV9UWF9SQVRFNiApOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTMSwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzEgKSk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1MyLCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTMiApKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1MzICkpOworCURCR19QQVJBTSggRGJnSW5mbywgUEFSTV9OQU1FX1dEU19BRERSRVNTNCwgIlwiJXNcIiIsIERiZ0h3QWRkciggUEFSTV9XRFNfQUREUkVTUzQgKSk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCBQQVJNX05BTUVfV0RTX0FERFJFU1M1LCAiXCIlc1wiIiwgRGJnSHdBZGRyKCBQQVJNX1dEU19BRERSRVNTNSApKTsKKwlEQkdfUEFSQU0oIERiZ0luZm8sIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYsICJcIiVzXCIiLCBEYmdId0FkZHIoIFBBUk1fV0RTX0FERFJFU1M2ICkpOworI2VuZGlmIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAvKiBIQ0ZfQVAgKi8KKworCVZBTElEX1BBUkFNKCAhUEFSTV9ERVNJUkVEX1NTSUQgfHwgKCBzdHJsZW4oIFBBUk1fREVTSVJFRF9TU0lEICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7CisJVkFMSURfUEFSQU0oICFQQVJNX09XTl9TU0lEIHx8ICggc3RybGVuKCBQQVJNX09XTl9TU0lEICkgPD0gUEFSTV9NQVhfTkFNRV9MRU4gKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX09XTl9DSEFOTkVMIDw9IFBBUk1fTUFYX09XTl9DSEFOTkVMICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9TWVNURU1fU0NBTEUgPj0gUEFSTV9NSU5fU1lTVEVNX1NDQUxFICkgJiYgKCBQQVJNX1NZU1RFTV9TQ0FMRSA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEUgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggUEFSTV9UWF9SQVRFIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1JUU19USFJFU0hPTEQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1MgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTUlDUk9XQVZFX1JPQlVTVE5FU1NbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oICFQQVJNX09XTl9OQU1FIHx8ICggc3RybGVuKCBQQVJNX05BTUVfT1dOX05BTUUgKSA8PSBQQVJNX01BWF9OQU1FX0xFTiApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fRU5BQkxFX0VOQ1JZUFRJT04gPD0gUEFSTV9NQVhfRU5BQkxFX0VOQ1JZUFRJT04gKSk7CisJVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZMSApKTsKKwlWQUxJRF9QQVJBTSggaXNfdmFsaWRfa2V5X3N0cmluZyggUEFSTV9LRVkyICkpOworCVZBTElEX1BBUkFNKCBpc192YWxpZF9rZXlfc3RyaW5nKCBQQVJNX0tFWTMgKSk7CisJVkFMSURfUEFSQU0oIGlzX3ZhbGlkX2tleV9zdHJpbmcoIFBBUk1fS0VZNCApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfS0VZID49IFBBUk1fTUlOX1RYX0tFWSApICYmICggUEFSTV9UWF9LRVkgPD0gUEFSTV9NQVhfVFhfS0VZICkpOworCisJVkFMSURfUEFSQU0oKCBQQVJNX01VTFRJQ0FTVF9SQVRFID49IFBBUk1fTUlOX01VTFRJQ0FTVF9SQVRFICkgJiYKKwkJCQkJKCBQQVJNX01VTFRJQ0FTVF9SQVRFIDw9IFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFICkpOworCisJVkFMSURfUEFSQU0oICFQQVJNX0RPV05MT0FEX0ZJUk1XQVJFIHx8ICggc3RybGVuKCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFICkgPD0gMjU1IC8qOz8qLyApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fQVVUSF9LRVlfTUdNVF9TVUlURSA8IFBBUk1fTUFYX0FVVEhfS0VZX01HTVRfU1VJVEUgKSk7CisKKwlWQUxJRF9QQVJBTSggIVBBUk1fTE9BRF9CQUxBTkNJTkcgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oICFQQVJNX01FRElVTV9ESVNUUklCVVRJT04gfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTUVESVVNX0RJU1RSSUJVVElPTlswXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUE9XX0xFVkVMIDw9IFBBUk1fTUFYX1RYX1BPV19MRVZFTCApKTsKKworIAlWQUxJRF9QQVJBTSgoIFBBUk1fUE9SVF9UWVBFID49IFBBUk1fTUlOX1BPUlRfVFlQRSApICYmICggUEFSTV9QT1JUX1RZUEUgPD0gUEFSTV9NQVhfUE9SVF9UWVBFICkpOworCVZBTElEX1BBUkFNKCBQQVJNX1BNX0VOQUJMRUQgPD0gV1ZMQU5fUE1fU1RBVEVfU1RBTkRBUkQgfHwKKwkJCQkgKCBQQVJNX1BNX0VOQUJMRUQgJiAweDdGRkYgKSA8PSBXVkxBTl9QTV9TVEFURV9TVEFOREFSRCApOworIAlWQUxJRF9QQVJBTSggIVBBUk1fQ1JFQVRFX0lCU1MgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fQ1JFQVRFX0lCU1NbMF0gKSAhPSBOVUxMICk7CisgCVZBTElEX1BBUkFNKCAhUEFSTV9NVUxUSUNBU1RfUlggfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fTVVMVElDQVNUX1JYWzBdICkgIT0gTlVMTCApOworIAlWQUxJRF9QQVJBTSgoIFBBUk1fTUFYX1NMRUVQIDw9IFBBUk1fTUFYX01BWF9QTV9TTEVFUCApKTsKKyAJVkFMSURfUEFSQU0oKCBQQVJNX0FVVEhFTlRJQ0FUSU9OIDw9IFBBUk1fTUFYX0FVVEhFTlRJQ0FUSU9OICkpOworIAlWQUxJRF9QQVJBTSgoIFBBUk1fT1dOX0FUSU1fV0lORE9XIDw9IFBBUk1fTUFYX09XTl9BVElNX1dJTkRPVyApKTsKKyAJVkFMSURfUEFSQU0oKCBQQVJNX1BNX0hPTERPVkVSX0RVUkFUSU9OIDw9IFBBUk1fTUFYX1BNX0hPTERPVkVSX0RVUkFUSU9OICkpOworIAlWQUxJRF9QQVJBTSggIVBBUk1fUFJPTUlTQ1VPVVNfTU9ERSB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9QUk9NSVNDVU9VU19NT0RFWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCggUEFSTV9DT05ORUNUSU9OX0NPTlRST0wgPD0gUEFSTV9NQVhfQ09OTkVDVElPTl9DT05UUk9MICkpOworCisJVkFMSURfUEFSQU0oKCBQQVJNX09XTl9EVElNX1BFUklPRCA+PSBQQVJNX01JTl9PV05fRFRJTV9QRVJJT0QgKSk7CisJVkFMSURfUEFSQU0oICFQQVJNX1JFSkVDVF9BTlkgfHwgc3RyY2hyKCAiTm5ZeSIsIFBBUk1fUkVKRUNUX0FOWVswXSApICE9IE5VTEwgKTsKKwlWQUxJRF9QQVJBTSggIVBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRCB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9FWENMVURFX1VORU5DUllQVEVEWzBdICkgIT0gTlVMTCApOworCVZBTElEX1BBUkFNKCAhUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HIHx8IHN0cmNociggIk5uWXkiLCBQQVJNX01VTFRJQ0FTVF9QTV9CVUZGRVJJTkdbMF0gKSAhPSBOVUxMICk7CisJVkFMSURfUEFSQU0oICFQQVJNX0lOVFJBX0JTU19SRUxBWSB8fCBzdHJjaHIoICJObll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICk7CisjaWZkZWYgVVNFX1dEUworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xEMSA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xEMiA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xEMyA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xENCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xENSA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9SVFNfVEhSRVNIT0xENiA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFMSA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKFBBUk1fVFhfUkFURTEgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTIgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEUyIDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEUzID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoUEFSTV9UWF9SQVRFMyA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9UWF9SQVRFNCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKFBBUk1fVFhfUkFURTQgPD0gUEFSTV9NQVhfVFhfUkFURSApKTsKKwlWQUxJRF9QQVJBTSgoIFBBUk1fVFhfUkFURTUgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmIChQQVJNX1RYX1JBVEU1IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSk7CisJVkFMSURfUEFSQU0oKCBQQVJNX1RYX1JBVEU2ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoUEFSTV9UWF9SQVRFNiA8PSBQQVJNX01BWF9UWF9SQVRFICkpOworI2VuZGlmIC8qIFVTRV9XRFMgKi8KKworCVZBTElEX1BBUkFNKCggUEFSTV9PV05fQkVBQ09OX0lOVEVSVkFMID49IFBBUk1fTUlOX09XTl9CRUFDT05fSU5URVJWQUwgKSAmJiAoIFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTCA8PSBQQVJNX01BWF9PV05fQkVBQ09OX0lOVEVSVkFMICkpOworCVZBTElEX1BBUkFNKCggUEFSTV9DT0VYSVNURU5DRSA8PSBQQVJNX0NPRVhJU1RFTkNFICkpOworCisJLyogU2V0IHRoZSBkcml2ZXIgcGFyYW1ldGVycyBmcm9tIHRoZSBwYXNzZWQgaW4gcGFyYW1ldGVycy4gKi8KKworCS8qIFRIRVNFIE1PRFVMRSBQQVJBTUVURVJTIEFSRSBUTyBCRSBERVBSRUNBVEVEIElOIEZBVk9SIE9GIEEgTkFNSU5HIENPTlZFTlRJT04KKwkgICBXSElDSCBJUyBJTkxJTkUgV0lUSCBUSEUgRk9SVEhDT01JTkcgV0FWRUxBTiBBUEkgKi8KKworCS8qIFNUQVJUIE5FVyBQQVJBTUVURVJTICovCisKKwlscC0+Q2hhbm5lbCAgICAgICAgICAgICA9IFBBUk1fT1dOX0NIQU5ORUw7CisJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyAgPSBQQVJNX1NZU1RFTV9TQ0FMRTsKKworCS8qIE5lZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdGhlIG5ldyBiYW5kcyBmb3IgNUdIeiAqLworCWxwLT5UeFJhdGVDb250cm9sWzBdICAgID0gUEFSTV9ERUZBVUxUX1RYX1JBVEVfMkdIWjsKKwlscC0+VHhSYXRlQ29udHJvbFsxXSAgICA9IFBBUk1fREVGQVVMVF9UWF9SQVRFXzVHSFo7CisKKwlscC0+UlRTVGhyZXNob2xkICAgICAgICA9IFBBUk1fUlRTX1RIUkVTSE9MRDsKKworCS8qIE5lZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBoYW5kbGUgdGhlIG5ldyBiYW5kcyBmb3IgNUdIeiAqLworCWxwLT5NdWx0aWNhc3RSYXRlWzBdICAgID0gUEFSTV9ERUZBVUxUX01VTFRJQ0FTVF9SQVRFXzJHSFo7CisJbHAtPk11bHRpY2FzdFJhdGVbMV0gICAgPSBQQVJNX0RFRkFVTFRfTVVMVElDQVNUX1JBVEVfNUdIWjsKKworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01JQ1JPV0FWRV9ST0JVU1RORVNTWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSAxOworCX0gZWxzZSB7CisJCWxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzID0gMDsKKwl9CisJaWYgKCBQQVJNX0RFU0lSRURfU1NJRCAmJiAoIHN0cmxlbiggUEFSTV9ERVNJUkVEX1NTSUQgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+TmV0d29ya05hbWUsIFBBUk1fREVTSVJFRF9TU0lEICk7CisJfQorCWlmICggUEFSTV9PV05fU1NJRCAmJiAoIHN0cmxlbiggUEFSTV9PV05fU1NJRCApIDw9IEhDRl9NQVhfTkFNRV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgUEFSTV9PV05fU1NJRCApOworCX0KKwlpZiAoIFBBUk1fT1dOX05BTUUgJiYgKCBzdHJsZW4oIFBBUk1fT1dOX05BTUUgKSA8PSBIQ0ZfTUFYX05BTUVfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+U3RhdGlvbk5hbWUsIFBBUk1fT1dOX05BTUUgKTsKKwl9CisJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSBQQVJNX0VOQUJMRV9FTkNSWVBUSU9OOworCWlmICggUEFSTV9LRVkxICYmICggc3RybGVuKCBQQVJNX0tFWTEgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJCXN0cmNweSggbHAtPktleTEsIFBBUk1fS0VZMSApOworCX0KKwlpZiAoIFBBUk1fS0VZMiAmJiAoIHN0cmxlbiggUEFSTV9LRVkyICkgPD0gTUFYX0tFWV9MRU4gKSkgeworCQlzdHJjcHkoIGxwLT5LZXkyLCBQQVJNX0tFWTIgKTsKKwl9CisJaWYgKCBQQVJNX0tFWTMgJiYgKCBzdHJsZW4oIFBBUk1fS0VZMyApIDw9IE1BWF9LRVlfTEVOICkpIHsKKwkJc3RyY3B5KCBscC0+S2V5MywgUEFSTV9LRVkzICk7CisJfQorCWlmICggUEFSTV9LRVk0ICYmICggc3RybGVuKCBQQVJNX0tFWTQgKSA8PSBNQVhfS0VZX0xFTiApKSB7CisJCXN0cmNweSggbHAtPktleTQsIFBBUk1fS0VZNCApOworCX0KKworCWxwLT5UcmFuc21pdEtleUlEID0gUEFSTV9UWF9LRVk7CisKKwlrZXlfc3RyaW5nMmtleSggbHAtPktleTEsICYobHAtPkRlZmF1bHRLZXlzLmtleVswXSApKTsKKwlrZXlfc3RyaW5nMmtleSggbHAtPktleTIsICYobHAtPkRlZmF1bHRLZXlzLmtleVsxXSApKTsKKwlrZXlfc3RyaW5nMmtleSggbHAtPktleTMsICYobHAtPkRlZmF1bHRLZXlzLmtleVsyXSApKTsKKwlrZXlfc3RyaW5nMmtleSggbHAtPktleTQsICYobHAtPkRlZmF1bHRLZXlzLmtleVszXSApKTsKKworCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gMSA7IC8vOz90byBiZSB1cGdyYWRlZCBQQVJNX0RPV05MT0FEX0ZJUk1XQVJFOworCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gUEFSTV9BVVRIX0tFWV9NR01UX1NVSVRFOworCisJaWYgKCBzdHJjaHIoICJZeSIsIFBBUk1fTE9BRF9CQUxBTkNJTkdbMF0gKSAhPSBOVUxMICkgeworCQlscC0+bG9hZEJhbGFuY2luZyA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPmxvYWRCYWxhbmNpbmcgPSAwOworCX0KKworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX01FRElVTV9ESVNUUklCVVRJT05bMF0gKSAhPSBOVUxMICkgeworCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gMTsKKwl9IGVsc2UgeworCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gMDsKKwl9CisKKwlscC0+dHhQb3dMZXZlbCA9IFBBUk1fVFhfUE9XX0xFVkVMOworCisJbHAtPnNyc2NbMF0gPSBQQVJNX1NSU0NfMkdIWjsKKwlscC0+c3JzY1sxXSA9IFBBUk1fU1JTQ181R0haOworCWxwLT5icnNjWzBdID0gUEFSTV9CUlNDXzJHSFo7CisJbHAtPmJyc2NbMV0gPSBQQVJNX0JSU0NfNUdIWjsKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorLy87P3NlZW1zIHJlYXNvbmFibGUgdGhhdCBldmVuIGFuIEFQLW9ubHkgZHJpdmVyIGNvdWxkIGFmZm9yZCB0aGlzIHNtYWxsIGFkZGl0aW9uYWwgZm9vdHByaW50CisJbHAtPlBvcnRUeXBlICAgICAgICAgICAgPSBQQVJNX1BPUlRfVFlQRTsKKwlscC0+TWF4U2xlZXBEdXJhdGlvbiAgICA9IFBBUk1fTUFYX1NMRUVQOworCWxwLT5hdXRoZW50aWNhdGlvbiAgICAgID0gUEFSTV9BVVRIRU5USUNBVElPTjsKKwlscC0+YXRpbVdpbmRvdyAgICAgICAgICA9IFBBUk1fT1dOX0FUSU1fV0lORE9XOworCWxwLT5ob2xkb3ZlckR1cmF0aW9uICAgID0gUEFSTV9QTV9IT0xET1ZFUl9EVVJBVElPTjsKKwlscC0+UE1FbmFibGVkICAgICAgICAgICA9IFBBUk1fUE1fRU5BQkxFRDsgIC8vOz8KKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9DUkVBVEVfSUJTU1swXSApICE9IE5VTEwgKSB7CisJCWxwLT5DcmVhdGVJQlNTID0gMTsKKwl9IGVsc2UgeworCQlscC0+Q3JlYXRlSUJTUyA9IDA7CisJfQorCWlmICggc3RyY2hyKCAiTm4iLCBQQVJNX01VTFRJQ0FTVF9SWFswXSApICE9IE5VTEwgKSB7CisJCWxwLT5NdWx0aWNhc3RSZWNlaXZlID0gMDsKKwl9IGVsc2UgeworCQlscC0+TXVsdGljYXN0UmVjZWl2ZSA9IDE7CisJfQorCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX1BST01JU0NVT1VTX01PREVbMF0gKSAhPSBOVUxMICkgeworCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gMTsKKwl9IGVsc2UgeworCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gMDsKKwl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJICAgbHAtPk1BQ0FkZHJlc3NbaV0gPSBQQVJNX05FVFdPUktfQUREUltpXTsKKwl9CisKKwlscC0+Y29ubmVjdGlvbkNvbnRyb2wgPSBQQVJNX0NPTk5FQ1RJT05fQ09OVFJPTDsKKworI2VuZGlmIC8qIEhDRl9TVEEgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisJbHAtPkRUSU1QZXJpb2QgPSBQQVJNX09XTl9EVElNX1BFUklPRDsKKworCWlmICggc3RyY2hyKCAiWXkiLCBQQVJNX1JFSkVDVF9BTllbMF0gKSAhPSBOVUxMICkgeworCQlscC0+UmVqZWN0QW55ID0gMTsKKwl9IGVsc2UgeworCQlscC0+UmVqZWN0QW55ID0gMDsKKwl9CisJaWYgKCBzdHJjaHIoICJObiIsIFBBUk1fRVhDTFVERV9VTkVOQ1JZUFRFRFswXSApICE9IE5VTEwgKSB7CisJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSAwOworCX0gZWxzZSB7CisJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSAxOworCX0KKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9NVUxUSUNBU1RfUE1fQlVGRkVSSU5HWzBdICkgIT0gTlVMTCApIHsKKwkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nID0gMTsKKwl9IGVsc2UgeworCQlscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgPSAwOworCX0KKwlpZiAoIHN0cmNociggIll5IiwgUEFSTV9JTlRSQV9CU1NfUkVMQVlbMF0gKSAhPSBOVUxMICkgeworCQlscC0+aW50cmFCU1NSZWxheSA9IDE7CisJfSBlbHNlIHsKKwkJbHAtPmludHJhQlNTUmVsYXkgPSAwOworCX0KKworCWxwLT5vd25CZWFjb25JbnRlcnZhbCA9IFBBUk1fT1dOX0JFQUNPTl9JTlRFUlZBTDsKKwlscC0+Y29leGlzdGVuY2UgICAgICAgPSBQQVJNX0NPRVhJU1RFTkNFOworCisjaWZkZWYgVVNFX1dEUworCWxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQxOworCWxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQyOworCWxwLT53ZHNfcG9ydFsyXS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQzOworCWxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQ0OworCWxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQ1OworCWxwLT53ZHNfcG9ydFs1XS5ydHNUaHJlc2hvbGQgICAgPSBQQVJNX1JUU19USFJFU0hPTEQ2OworCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEUxOworCWxwLT53ZHNfcG9ydFsxXS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEUyOworCWxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEUzOworCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEU0OworCWxwLT53ZHNfcG9ydFs0XS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEU1OworCWxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsICAgICAgPSBQQVJNX1RYX1JBVEU2OworCisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCWxwLT53ZHNfcG9ydFswXS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzFbaV07CisJfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1MyW2ldOworCX0KKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJbHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTM1tpXTsKKwl9CisJZm9yKCBpID0gMDsgaSA8IEVUSF9BTEVOOyBpKysgKSB7CisJCWxwLT53ZHNfcG9ydFszXS53ZHNBZGRyZXNzW2ldID0gUEFSTV9XRFNfQUREUkVTUzRbaV07CisJfQorCWZvciggaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrICkgeworCQlscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzc1tpXSA9IFBBUk1fV0RTX0FERFJFU1M1W2ldOworCX0KKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJbHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3NbaV0gPSBQQVJNX1dEU19BRERSRVNTNltpXTsKKwl9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAgLyogSENGX0FQICovCisjaWZkZWYgVVNFX1JUUworCWlmICggc3RyY2hyKCAiWXkiLCB1c2VSVFNbMF0gKSAhPSBOVUxMICkgeworCQlscC0+dXNlUlRTID0gMTsKKwl9IGVsc2UgeworCQlscC0+dXNlUlRTID0gMDsKKwl9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworCisJLyogRU5EIE5FVyBQQVJBTUVURVJTICovCisKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBvcnRTdGF0ZSB2YXJpYWJsZSAqLworCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOworCisJLyogSW5pdGlhbGl6ZSB0aGUgU2NhblJlc3VsdCBzdHJ1Y3QgKi8KKwltZW1zZXQoICYoIGxwLT5zY2FuX3Jlc3VsdHMgKSwgMCwgc2l6ZW9mKCBscC0+c2Nhbl9yZXN1bHRzICkpOworCWxwLT5zY2FuX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IEZBTFNFOworCisJLyogSW5pdGlhbGl6ZSB0aGUgUHJvYmVSZXN1bHQgc3RydWN0ICovCisJbWVtc2V0KCAmKCBscC0+cHJvYmVfcmVzdWx0cyApLCAwLCBzaXplb2YoIGxwLT5wcm9iZV9yZXN1bHRzICkpOworCWxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKKwlscC0+cHJvYmVfbnVtX2FwcyA9IDA7CisKKworCS8qIEluaXRpYWxpemUgVHggcXVldWUgc3R1ZmYgKi8KKwltZW1zZXQoIGxwLT50eExpc3QsIDAsIHNpemVvZiggbHAtPnR4TGlzdCApKTsKKworCUlOSVRfTElTVF9IRUFEKCAmKCBscC0+dHhGcmVlICkpOworCisJbHAtPnR4Ri5za2IgID0gTlVMTDsKKwlscC0+dHhGLnBvcnQgPSAwOworCisKKwlmb3IoIGkgPSAwOyBpIDwgREVGQVVMVF9OVU1fVFhfRlJBTUVTOyBpKysgKSB7CisJCWxpc3RfYWRkX3RhaWwoICYoIGxwLT50eExpc3RbaV0ubm9kZSApLCAmKCBscC0+dHhGcmVlICkpOworCX0KKworCisJZm9yKCBpID0gMDsgaSA8IFdWTEFOX01BWF9UWF9RVUVVRVM7IGkrKyApIHsKKwkJSU5JVF9MSVNUX0hFQUQoICYoIGxwLT50eFFbaV0gKSk7CisJfQorCisJbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKwlscC0+dHhRX2NvdW50ID0gMDsKKwkvKiBJbml0aWFsaXplIHRoZSB1c2VfZG1hIGVsZW1lbnQgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLiBOb3Qgc3VyZSBpZgorCSAgIHRoaXMgc2hvdWxkIGJlIGEgY29tcGlsZS10aW1lIG9yIHJ1bi10aW1lIGNvbmZpZ3VyYWJsZS4gU28gZm9yIG5vdywKKwkgICBpbXBsZW1lbnQgYXMgcnVuLXRpbWUgYW5kIGp1c3QgZGVmaW5lIGhlcmUgKi8KKyNpZmRlZiBXQVJQCisjaWZkZWYgRU5BQkxFX0RNQQorCURCR19UUkFDRSggRGJnSW5mbywgIkhFUk1FUyAyLjUgQlVTTUFTVEVSIERNQSBNT0RFXG4iICk7CisJbHAtPnVzZV9kbWEgPSAxOworI2Vsc2UKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJIRVJNRVMgMi41IFBPUlQgSS9PIE1PREVcbiIgKTsKKwlscC0+dXNlX2RtYSA9IDA7CisjZW5kaWYgLy8gRU5BQkxFX0RNQQorI2VuZGlmIC8vIFdBUlAKKworCS8qIFJlZ2lzdGVyIHRoZSBJU1IgaGFuZGxlciBpbmZvcm1hdGlvbiBoZXJlLCBzbyB0aGF0IGl0J3Mgbm90IGRvbmUKKwkgICByZXBlYXRlZGx5IGluIHRoZSBJU1IgKi8KKyAgICAgICAgdGFza2xldF9pbml0KCZscC0+dGFzaywgd2xfaXNyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKWxwKTsKKworICAgICAgICAvKiBDb25uZWN0IHRvIHRoZSBhZGFwdGVyICovCisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkNhbGxpbmcgaGNmX2Nvbm5lY3QoKS4uLlxuIiApOworICAgICAgICBoY2Zfc3RhdHVzID0gaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBkZXYtPmJhc2VfYWRkciApOworCS8vSENGX0VSUl9JTkNPTVBfRlcgaXMgYWNjZXB0YWJsZSwgYmVjYXVzZSBkb3dubG9hZCBtdXN0IHN0aWxsIHRha2UgcGxhY2UKKwkvL0hDRl9FUlJfSU5DT01QX1BSSSBpcyBub3QgYWNjZXB0YWJsZQorCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyAmJiBoY2Zfc3RhdHVzICE9IEhDRl9FUlJfSU5DT01QX0ZXICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJoY2ZfY29ubmVjdCgpIGZhaWxlZCwgc3RhdHVzOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisJCXdsX3VubG9jayggbHAsICZmbGFncyApOworCQlnb3RvIGhjZl9mYWlsZWQ7CisJfQorCisJLy87P3Nob3VsZCBzZXQgSENGX3ZlcnNpb24gYW5kIGhvdyBhYm91dCBkcml2ZXJfc3RhdAorCWxwLT5kcml2ZXJJbmZvLklPX2FkZHJlc3MgICAgICAgPSBkZXYtPmJhc2VfYWRkcjsKKwlscC0+ZHJpdmVySW5mby5JT19yYW5nZSAgICAgICAgID0gSENGX05VTV9JT19QT1JUUzsJLy87P2NvbmRpdGlvbmFsbHkgMHg0MCBvciAweDgwIHNlZW1zIGJldHRlcgorCWxwLT5kcml2ZXJJbmZvLklSUV9udW1iZXIgICAgICAgPSBkZXYtPmlycTsKKwlscC0+ZHJpdmVySW5mby5jYXJkX3N0YXQgICAgICAgID0gbHAtPmhjZkN0eC5JRkJfQ2FyZFN0YXQ7CisJLy87PyB3aGF0IGhhcHBlbmVkIHRvIGZyYW1lX3R5cGUKKworCS8qIEZpbGwgaW4gdGhlIGRyaXZlciBpZGVudGl0eSBzdHJ1Y3R1cmUgKi8KKwlscC0+ZHJpdmVySWRlbnRpdHkubGVuICAgICAgICAgICAgICA9ICggc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSAvIHNpemVvZiggaGNmXzE2ICkpIC0gMTsKKwlscC0+ZHJpdmVySWRlbnRpdHkudHlwICAgICAgICAgICAgICA9IENGR19EUlZfSURFTlRJVFk7CisJbHAtPmRyaXZlcklkZW50aXR5LmNvbXBfaWQgICAgICAgICAgPSBEUlZfSURFTlRJVFk7CisJbHAtPmRyaXZlcklkZW50aXR5LnZhcmlhbnQgICAgICAgICAgPSBEUlZfVkFSSUFOVDsKKwlscC0+ZHJpdmVySWRlbnRpdHkudmVyc2lvbl9tYWpvciAgICA9IERSVl9NQUpPUl9WRVJTSU9OOworCWxwLT5kcml2ZXJJZGVudGl0eS52ZXJzaW9uX21pbm9yICAgID0gRFJWX01JTk9SX1ZFUlNJT047CisKKworCS8qIFN0YXJ0IHRoZSBjYXJkIGhlcmUgLSBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgaW4gb3JkZXIgdG8gZ2V0IHRoZQorCSAgIE1BQyBhZGRyZXNzIGZvciB0aGUgbmV0d29yayBsYXllciAqLworCURCR19UUkFDRSggRGJnSW5mbywgIkNhbGxpbmcgd3ZsYW5fZ28oKSB0byBwZXJmb3JtIGEgY2FyZCByZXNldC4uLlxuIiApOworCWhjZl9zdGF0dXMgPSB3bF9nbyggbHAgKTsKKworCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfZ28oKSBmYWlsZWRcbiIgKTsKKwkJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJCWdvdG8gaGNmX2ZhaWxlZDsKKwl9CisKKwkvKiBDZXJ0YWluIFJJRHMgbXVzdCBiZSBzZXQgYmVmb3JlIGVuYWJsaW5nIHRoZSBwb3J0cyAqLworCXdsX3B1dF9sdHZfaW5pdCggbHAgKTsKKworI2lmIDAgLy87P3doeSB3YXMgdGhpcyBhbHJlYWR5IGNvbW1lbnRlZCBvdXQgaW4gd2xfbGttXzcyMAorCS8qIEVuYWJsZSB0aGUgcG9ydHMgKi8KKwlpZiAoIHdsX2FkYXB0ZXJfaXNfb3BlbiggbHAtPmRldiApKSB7CisJCS8qIEVuYWJsZSB0aGUgcG9ydHMgKi8KKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxpbmcgUG9ydCAwXG4iICk7CisJCWhjZl9zdGF0dXMgPSB3bF9lbmFibGUoIGxwICk7CisKKwkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxlIHBvcnQgMCBmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKwkJfQorCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFdEUyBQb3J0c1xuIiApOworCQkvL3dsX2VuYWJsZV93ZHNfcG9ydHMoIGxwICk7CisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisJfQorI2VuZGlmCisKKwkvKiBGaWxsIG91dCB0aGUgTUFDIGFkZHJlc3MgaW5mb3JtYXRpb24gaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCisJbWVtY3B5KCBscC0+ZGV2LT5kZXZfYWRkciwgbHAtPk1BQ0FkZHJlc3MsIEVUSF9BTEVOICk7CisJZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCisJbHAtPmlzX3JlZ2lzdGVyZWQgPSBUUlVFOworCisjaWZkZWYgVVNFX1BST0ZJTEUKKwkvKiBQYXJzZSB0aGUgY29uZmlnIGZpbGUgZm9yIHRoZSBzYWtlIG9mIGNyZWF0aW5nIFdEUyBwb3J0cyBpZiBXRFMgaXMKKwkgICBjb25maWd1cmVkIHRoZXJlIGJ1dCBub3QgaW4gdGhlIG1vZHVsZSBvcHRpb25zICovCisJcGFyc2VfY29uZmlnKCBkZXYgKTsKKyNlbmRpZiAgLyogVVNFX1BST0ZJTEUgKi8KKworCS8qIElmIHdlJ3JlIGdvaW5nIGludG8gQVAgTW9kZSwgcmVnaXN0ZXIgdGhlICJ2aXJ0dWFsIiBldGhlcm5ldCBkZXZpY2VzCisJICAgbmVlZGVkIGZvciBXRFMgKi8KKwlXTF9XRFNfTkVUREVWX1JFR0lTVEVSKCBscCApOworCisJLyogUmVzZXQgdGhlIERvd25sb2FkRmlybXdhcmUgdmFyaWFibGUgaW4gdGhlIHByaXZhdGUgc3RydWN0LiBJZiB0aGUKKwkgICBjb25maWcgZmlsZSBpcyBub3QgdXNlZCwgdGhpcyB3aWxsIG5vdCBtYXR0ZXI7IGlmIGl0IGlzIHVzZWQsIGl0CisJICAgd2lsbCBiZSByZXBhcnNlZCBpbiB3bF9vcGVuKCkuIFRoaXMgaXMgZG9uZSBiZWNhdXNlIGxvZ2ljIGluIHdsX29wZW4KKwkgICB1c2VkIHRvIGNoZWNrIGlmIGEgZmlybXdhcmUgZG93bmxvYWQgaXMgbmVlZGVkIGlzIGJyb2tlbiBieSBwYXJzaW5nCisJICAgdGhlIGZpbGUgaGVyZTsgaG93ZXZlciwgdGhpcyBwYXJzaW5nIGlzIG5lZWRlZCB0byByZWdpc3RlciBXRFMgcG9ydHMKKwkgICBpbiBBUCBtb2RlLCBpZiB0aGV5IGFyZSBjb25maWd1cmVkICovCisJbHAtPkRvd25sb2FkRmlybXdhcmUgPSBXVkxBTl9EUlZfTU9ERV9TVEE7IC8vOz9kb3dubG9hZF9maXJtd2FyZTsKKworI2lmZGVmIFVTRV9SVFMKKwlpZiAoIGxwLT51c2VSVFMgPT0gMSApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRU5URVJJTkcgUlRTIE1PREUuLi5cbiIgKTsKKyAgICAgICAgICAgICAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKKyAgICAgICAgICAgICAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsgLy8gTm90IGhhbmRsaW5nIGludGVycnVwdHMgYW55bW9yZQorCisJCXdsX2Rpc2FibGUoIGxwICk7CisKKyAgICAgICAgCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgSENGX0RJU0NPTk5FQ1QpOworCX0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICIlczogV2lyZWxlc3MsIGlvX2FkZHIgJSMwM2x4LCBpcnEgJWQsICIibWFjX2FkZHJlc3MgIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxICk7CisKKwlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJcHJpbnRrKCAiJTAyWCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgKCggaSA8ICggRVRIX0FMRU4tMSApKSA/ICc6JyA6ICdcbicgKSk7CisJfQorCisjaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoICJ3bGFncyIsIDAsIE5VTEwsIHNjdWxsX3JlYWRfcHJvY21lbSwgZGV2ICk7CisJcHJvY19ta2RpcigiZHJpdmVyL3dsYWdzNDkiLCAwKTsKKwlwcm9jX3dyaXRlKCJkcml2ZXIvd2xhZ3M0OS93bGFnczQ5X3R5cGUiLCB3cml0ZV9pbnQsICZscC0+d2xhZ3M0OV90eXBlKTsKKyNlbmRpZiAvKiBTQ1VMTF9VU0VfUFJPQyAqLworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKKworaGNmX2ZhaWxlZDoKKwl3bF9oY2ZfZXJyb3IoIGRldiwgaGNmX3N0YXR1cyApOworCitmYWlsZWQ6CisKKwlEQkdfRVJST1IoIERiZ0luZm8sICJ3bF9pbnNlcnQoKSBGQUlMRURcbiIgKTsKKworCWlmICggbHAtPmlzX3JlZ2lzdGVyZWQgPT0gVFJVRSApIHsKKwkJbHAtPmlzX3JlZ2lzdGVyZWQgPSBGQUxTRTsKKwl9CisKKwlXTF9XRFNfTkVUREVWX0RFUkVHSVNURVIoIGxwICk7CisKKwlyZXN1bHQgPSAtRUZBVUxUOworCisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3bF9pbnNlcnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Jlc2V0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVzZXQgdGhlIGFkYXB0ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0IG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOworCWludCAgICAgICAgICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3Jlc2V0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCURCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCURCR19QQVJBTSggRGJnSW5mbywgImRldi0+YmFzZV9hZGRyIiwgIiglIzAzbHgpIiwgZGV2LT5iYXNlX2FkZHIgKTsKKworCS8qCisgICAgICAgICAqIFRoZSBjYWxsZXIgc2hvdWxkIGFscmVhZHkgaGF2ZSBhIGxvY2sgYW5kCisgICAgICAgICAqIGRpc2FibGUgdGhlIGludGVycnVwdHMsIHdlIGRvIG5vdCBsb2NrIGhlcmUsCisgICAgICAgICAqIG5vciBkbyB3ZSBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzIQorICAgICAgICAgKi8KKworCURCR19UUkFDRSggRGJnSW5mbywgIkRldmljZSBCYXNlIEFkZHJlc3M6ICUjMDNseFxuIiwgZGV2LT5iYXNlX2FkZHIgKTsKKwlpZiAoIGRldi0+YmFzZV9hZGRyICkgeworCQkvKiBTaHV0ZG93biB0aGUgYWRhcHRlci4gKi8KKwkJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBIQ0ZfRElTQ09OTkVDVCApOworCisJCS8qIFJlc2V0IHRoZSBkcml2ZXIgaW5mb3JtYXRpb24uICovCisJCWxwLT50eEJ5dGVzID0gMDsKKworCQkvKiBDb25uZWN0IHRvIHRoZSBhZGFwdGVyLiAqLworICAgICAgICAJaGNmX3N0YXR1cyA9IGhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgZGV2LT5iYXNlX2FkZHIgKTsKKwkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICYmIGhjZl9zdGF0dXMgIT0gSENGX0VSUl9JTkNPTVBfRlcgKSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJoY2ZfY29ubmVjdCgpIGZhaWxlZCwgc3RhdHVzOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENoZWNrIGlmIGZpcm13YXJlIGlzIHByZXNlbnQsIGlmIG5vdCBjaGFuZ2Ugc3RhdGUgKi8KKwkJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9FUlJfSU5DT01QX0ZXICkgeworCQkJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVDsKKwkJfQorCisJCS8qIEluaXRpYWxpemUgdGhlIHBvcnRTdGF0ZSB2YXJpYWJsZSAqLworCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKKworCQkvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyLiAqLworCQloY2Zfc3RhdHVzID0gd2xfZ28oIGxwICk7CisJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIndsX2dvKCkgZmFpbGVkLCBzdGF0dXM6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogQ2VydGFpbiBSSURzIG11c3QgYmUgc2V0IGJlZm9yZSBlbmFibGluZyB0aGUgcG9ydHMgKi8KKwkJd2xfcHV0X2x0dl9pbml0KCBscCApOworCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIkRldmljZSBCYXNlIEFkZHJlc3MgSU5WQUxJRCEhIVxuIiApOworCX0KKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9yZXNldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ28oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXNldCB0aGUgYWRhcHRlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgbmV0X2RldmljZSBzdHJ1Y3Qgb2YgdGhlIHdpcmVsZXNzIGRldmljZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9nbyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgIAloY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJY2hhcgkqY3AgPSBOVUxMOwkJCS8vZndfaW1hZ2UKKwlpbnQJcmV0cmllcyA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfZ28iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwloY2Zfc3RhdHVzID0gd2xfZGlzYWJsZSggbHAgKTsKKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkRpc2FibGUgcG9ydCAwIGZhaWxlZDogMHgleFxuIiwgaGNmX3N0YXR1cyApOworCisJCXdoaWxlICgoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSAmJiAocmV0cmllcyA8IDEwKSkgeworCQkJcmV0cmllcysrOworCQkJaGNmX3N0YXR1cyA9IHdsX2Rpc2FibGUoIGxwICk7CisJCX0KKwkJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGlzYWJsZSBwb3J0IDAgc3VjY2VzIDogJWQgcmV0cmllc1xuIiwgcmV0cmllcyApOworCQl9IGVsc2UgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGlzYWJsZSBwb3J0IDAgZmFpbGVkIGFmdGVyOiAlZCByZXRyaWVzXG4iLCByZXRyaWVzICk7CisJCX0KKwl9CisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJEaXNhYmxpbmcgV0RTIFBvcnRzXG4iICk7CisJLy93bF9kaXNhYmxlX3dkc19wb3J0cyggbHAgKTsKKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisKKy8vOz93aGF0IHdhcyB0aGUgcHVycG9zZSBvZiB0aGlzCisvLyAJLyogbG9hZCB0aGUgYXBwcm9wcmlhdGUgZmlybXdhcmUgaW1hZ2UsIGRlcGVuZGluZyBvbiBkcml2ZXIgbW9kZSAqLworLy8gCWxwLT5sdHZSZWNvcmQubGVuICAgPSAoIHNpemVvZiggQ0ZHX1JBTkdFMjBfU1RSQ1QgKSAvIHNpemVvZiggaGNmXzE2ICkpIC0gMTsKKy8vIAlscC0+bHR2UmVjb3JkLnR5cCAgID0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSTsKKy8vIAloY2ZfZ2V0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisjaWYgQklOX0RMCisJaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgeworbW1fc2VnbWVudF90CWZzOworaW50CQkgICAgCWZpbGVfZGVzYzsKK2ludCAJCQlyYzsKKworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJGL1cgaW1hZ2U6JXM6XG4iLCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUgKTsKKwkJLyogT2J0YWluIGEgdXNlci1zcGFjZSBwcm9jZXNzIGNvbnRleHQsIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KKwkJZnMgPSBnZXRfZnMoICk7CisJCXNldF9mcyggZ2V0X2RzKCApKTsKKwkJZmlsZV9kZXNjID0gb3BlbiggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lLCBPX1JET05MWSwgMCApOworCQlpZiAoIGZpbGVfZGVzYyA9PSAtMSApIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIk5vIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKKwkJfSBlbHNlIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkYvVyBpbWFnZSBmaWxlIGZvdW5kXG4iICk7CisjZGVmaW5lIERIRl9BTExPQ19TSVpFIDk2MDAwCQkJLy9qdXN0IGJlbG93IDk2SywgbGV0J3MgaG9wZSBpdCBzdWZmaWNlcyBmb3Igbm93IGFuZCBmb3IgdGhlIGZ1dHVyZQorCQkJY3AgPSAoY2hhciopdm1hbGxvYyggREhGX0FMTE9DX1NJWkUgKTsKKwkJCWlmICggY3AgPT0gTlVMTCApIHsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJlcnJvciBpbiB2bWFsbG9jXG4iICk7CisJCQl9IGVsc2UgeworCQkJCXJjID0gcmVhZCggZmlsZV9kZXNjLCBjcCwgREhGX0FMTE9DX1NJWkUgKTsKKwkJCQlpZiAoIHJjID09IERIRl9BTExPQ19TSVpFICkgeworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJidWZmZXIgdG9vIHNtYWxsLCAlZFxuIiwgREhGX0FMTE9DX1NJWkUgKTsKKwkJCQl9IGVsc2UgaWYgKCByYyA+IDAgKSB7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgInJlYWQgTy5LLjogJWQgYnl0ZXMgICUuMTJzXG4iLCByYywgY3AgKTsKKwkJCQkJcmMgPSByZWFkKCBmaWxlX2Rlc2MsICZjcFtyY10sIDEgKTsKKwkJCQkJaWYgKCByYyA9PSAwICkgeyAvLzsvY2hhbmdlIHRvIGFuIHVudGlsLWxvb3AgYXQgcmM8PTAKKwkJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIm5vIG1vcmUgdG8gcmVhZFxuIiApOworCQkJCQl9CisJCQkJfQorCQkJCWlmICggcmMgIT0gMCApIHsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiZmlsZSBub3QgcmVhZCBpbiBvbmUgc3dvb3Agb3Igb3RoZXIgZXJyb3IiXAorCQkJCQkJCQkJCSIsIGdpdmUgdXAsIHRvbyBjb21wbGljYXRlZCwgcmMgPSAlMFhcbiIsIHJjICk7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgInN0aWxsIGhhdmUgdG8gY2hhbmdlIGNvZGUgdG8gZ2V0IGEgcmVhbCBkb3dubG9hZCBub3cgISEhISEhISFcbiIgKTsKKwkJCQl9IGVsc2UgeworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJiZWZvcmUgZGhmX2Rvd25sb2FkX2JpbmFyeVxuIiApOworCQkJCQloY2Zfc3RhdHVzID0gZGhmX2Rvd25sb2FkX2JpbmFyeSggKG1lbWltYWdlICopY3AgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiYWZ0ZXIgZGhmX2Rvd25sb2FkX2JpbmFyeSwgYmVmb3JlIGRoZl9kb3dubG9hZF9md1xuIiApOworCQkJCQkvLzs/aW1wcm92ZSBlcnJvciBmbG93L2hhbmRsaW5nCisJCQkJCWhjZl9zdGF0dXMgPSBkaGZfZG93bmxvYWRfZncoICZscC0+aGNmQ3R4LCAobWVtaW1hZ2UgKiljcCApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJhZnRlciBkaGZfZG93bmxvYWRfZndcbiIgKTsKKwkJCQl9CisJCQkJdmZyZWUoIGNwICk7CisJCQl9CisJCQljbG9zZSggZmlsZV9kZXNjICk7CisJCX0KKwkJc2V0X2ZzKCBmcyApOwkJCS8qIFJldHVybiB0byB0aGUgb3JpZ2luYWwgY29udGV4dCAqLworCX0KKyNlbmRpZiAvLyBCSU5fREwKKworCS8qIElmIGZpcm13YXJlIGlzIHByZXNlbnQgYnV0IHRoZSB0eXBlIGlzIHVua25vd24gdGhlbiBkb3dubG9hZCBhbnl3YXkgKi8KKwlpZiAoIChscC0+ZmlybXdhcmVfcHJlc2VudCA9PSBXTF9GUklNV0FSRV9QUkVTRU5UKQorCSAgICAgJiYKKwkgICAgICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApICE9IENPTVBfSURfRldfU1RBICkKKwkgICAgICYmCisJICAgICAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSAhPSBDT01QX0lEX0ZXX0FQICkgKSB7CisJCS8qIFVua25vd24gdHlwZSwgZG93bmxvYWQgbmVlZGVkLiAgKi8KKwkJbHAtPmZpcm13YXJlX3ByZXNlbnQgPSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVDsKKwl9CisKKwlpZihscC0+ZmlybXdhcmVfcHJlc2VudCA9PSBXTF9GUklNV0FSRV9OT1RfUFJFU0VOVCkKKwl7CisJCWlmICggY3AgPT0gTlVMTCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkRvd25sb2FkaW5nIFNUQSBmaXJtd2FyZS4uLlxuIiApOworLy8JCQloY2Zfc3RhdHVzID0gZGhmX2Rvd25sb2FkX2Z3KCAmbHAtPmhjZkN0eCwgJnN0YXRpb24gKTsKKwkJCWhjZl9zdGF0dXMgPSBkaGZfZG93bmxvYWRfZncoICZscC0+aGNmQ3R4LCAmZndfaW1hZ2UgKTsKKwkJfQorCQlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJGaXJtd2FyZSBEb3dubG9hZCBmYWlsZWRcbiIgKTsKKwkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJcmV0dXJuIGhjZl9zdGF0dXM7CisJCX0KKwl9CisJLyogUmVwb3J0IHRoZSBGVyB2ZXJzaW9ucyAqLworCS8vOz9vYnNvbGV0ZSwgdXNlIHRoZSBhdmFpbGFibGUgSUZCIGluZm86OiB3bF9nZXRfcHJpX3JlY29yZHMoIGxwICk7CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19TVEEgICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJkb3dubG9hZGVkIHN0YXRpb24gRi9XXG4iICk7CisJfSBlbHNlIGlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJkb3dubG9hZGVkIEFQIEYvV1xuIiApOworCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgInVua25vd24gRi9XIHR5cGVcbiIgKTsKKwl9CisKKwkvKgorICAgICAgICAgKiBEb3dubG9hZGVkLCBubyBuZWVkIHRvIHJlcGVhdCB0aGlzIG5leHQgdGltZSwgYXNzdW1lIHRoZQorICAgICAgICAgKiBjb250ZW50cyBzdGF5cyBpbiB0aGUgY2FyZCB1bnRpbCBpdCBpcyBwb3dlcmVkIG9mZi4gTm90ZSB3ZQorICAgICAgICAgKiBkbyBub3Qgc3dpdGNoIGZpcm13YXJlIG9uIHRoZSBmbHksIHRoZSBmaXJtd2FyZSBpcyBmaXhlZCBpbgorICAgICAgICAgKiB0aGUgZHJpdmVyIGZvciBub3cuCisgICAgICAgICAqLworCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfUFJFU0VOVDsKKworCURCR19UUkFDRSggRGJnSW5mbywgIkNvbXBvbmVudElEOiUwNHggdmFyaWFudDolMDR4IG1ham9yOiUwNHggbWlub3I6JTA0eFxuIiwKKwkJCQlDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICksCisJCQkJQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkudmFyaWFudCApLAorCQkJCUNOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgKSwKKwkJCQlDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21pbm9yICkpOworCisJLyogbm93IHdlIHdpbCBnZXQgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBjYXJkICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSA0OworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19OSUNfTUFDX0FERFI7CisJfSBlbHNlCisJeworCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX01BQ19BRERSOworCX0KKwloY2Zfc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZXRyaWV2ZSBNQUMgYWRkcmVzc1xuIiApOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIGhjZl9zdGF0dXM7CisJfQorCW1lbWNweSggbHAtPk1BQ0FkZHJlc3MsICZscC0+bHR2UmVjb3JkLnUudThbMF0sIEVUSF9BTEVOICk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FyZCBNQUMgQWRkcmVzczogJXNcbiIsIERiZ0h3QWRkciggbHAtPk1BQ0FkZHJlc3MgKSk7CisKKwkvKiBXcml0ZSBvdXQgY29uZmlndXJhdGlvbiB0byB0aGUgZGV2aWNlLCBlbmFibGUsIGFuZCByZWNvbm5lY3QuIEhvd2V2ZXIsCisJICAgb25seSByZWNvbm5lY3QgaWYgaW4gQVAgbW9kZS4gRm9yIFNUQSBtb2RlLCBuZWVkIHRvIHdhaXQgZm9yIHBhc3NpdmUgc2NhbgorCSAgIGNvbXBsZXRpb24gYmVmb3JlIGEgY29ubmVjdCBjYW4gYmUgaXNzdWVkICovCisJd2xfcHV0X2x0diggbHAgKTsKKwkvKiBFbmFibGUgdGhlIHBvcnRzICovCisJaGNmX3N0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKKworCWlmICggbHAtPkRvd25sb2FkRmlybXdhcmUgPT0gV1ZMQU5fRFJWX01PREVfQVAgKSB7CisjaWZkZWYgVVNFX1dEUworCQl3bF9lbmFibGVfd2RzX3BvcnRzKCBscCApOworI2VuZGlmIC8vIFVTRV9XRFMKKwkJaGNmX3N0YXR1cyA9IHdsX2Nvbm5lY3QoIGxwICk7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9nbworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfc2V0X3dlcF9rZXlzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgV3JpdGUgVHhLZXlJRCBhbmQgV0VQIGtleXMgdG8gdGhlIGFkYXB0ZXIuIFRoaXMgaXMgc2VwYXJhdGVkIGZyb20KKyAqICB3bF9hcHBseSgpIHRvIGFsbG93IGR5bmFtaWMgV0VQIGtleSB1cGRhdGVzIHRocm91Z2ggdGhlIHdpcmVsZXNzCisgKiAgZXh0ZW5zaW9ucy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgYWRhcHRlcidzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9zZXRfd2VwX2tleXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGNvdW50ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9zZXRfd2VwX2tleXMiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCAibHAiLCAiJXMgKDB4JXApIiwgbHAtPmRldi0+bmFtZSwgbHAgKTsKKwlpZiAoIGxwLT5FbmFibGVFbmNyeXB0aW9uICkgeworCQkvKiBOT1RFOiBDRkdfQ05GX0VOQ1JZUFRJT04gaXMgc2V0IGluIHdsX3B1dF9sdHYoKSBhcyBpdCdzIGEgc3RhdGljCisJCQkJIFJJRCAqLworCisJCS8qIHNldCBUeEtleUlEICovCisJCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfS0VZX0lEOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKGxwLT5UcmFuc21pdEtleUlEIC0gMSk7CisKKwkJaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJLZXkgMSBsZW46ICVkXG4iLCBscC0+RGVmYXVsdEtleXMua2V5WzBdLmxlbiApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJLZXkgMiBsZW46ICVkXG4iLCBscC0+RGVmYXVsdEtleXMua2V5WzFdLmxlbiApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJLZXkgMyBsZW46ICVkXG4iLCBscC0+RGVmYXVsdEtleXMua2V5WzJdLmxlbiApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJLZXkgNCBsZW46ICVkXG4iLCBscC0+RGVmYXVsdEtleXMua2V5WzNdLmxlbiApOworCisJCS8qIHdyaXRlIGtleXMgKi8KKwkJbHAtPkRlZmF1bHRLZXlzLmxlbiA9IHNpemVvZiggbHAtPkRlZmF1bHRLZXlzICkgLyBzaXplb2YoIGhjZl8xNiApIC0gMTsKKwkJbHAtPkRlZmF1bHRLZXlzLnR5cCA9IENGR19ERUZBVUxUX0tFWVM7CisKKwkJLyogZW5kaWFuIHRyYW5zbGF0ZSB0aGUgYXBwcm9wcmlhdGUga2V5IGluZm9ybWF0aW9uICovCisJCWZvciggY291bnQgPSAwOyBjb3VudCA8IE1BWF9LRVlTOyBjb3VudCsrICkgeworCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtjb3VudF0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5EZWZhdWx0S2V5cy5rZXlbY291bnRdLmxlbiApOworCQl9CisKKwkJaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPkRlZmF1bHRLZXlzICkpOworCisJCS8qIFJldmVyc2UgdGhlIGFib3ZlIGVuZGlhbiB0cmFuc2xhdGlvbiwgc2luY2UgdGhlc2Uga2V5cyBhcmUgYWNjZXNzZWQKKwkJICAgZWxzZXdoZXJlICovCisJCWZvciggY291bnQgPSAwOyBjb3VudCA8IE1BWF9LRVlTOyBjb3VudCsrICkgeworCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtjb3VudF0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5EZWZhdWx0S2V5cy5rZXlbY291bnRdLmxlbiApOworCQl9CisKKwkJREJHX05PVElDRSggRGJnSW5mbywgImVuY3J5cHQ6ICVkLCBJRDogJWRcbiIsIGxwLT5FbmFibGVFbmNyeXB0aW9uLCBscC0+VHJhbnNtaXRLZXlJRCApOworCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAic2V0IGtleTogJXMoJWQpIFslZF1cbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbbHAtPlRyYW5zbWl0S2V5SUQtMV0ua2V5LCBscC0+RGVmYXVsdEtleXMua2V5W2xwLT5UcmFuc21pdEtleUlELTFdLmxlbiwgbHAtPlRyYW5zbWl0S2V5SUQtMSApOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworfSAvLyB3bF9zZXRfd2VwX2tleXMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FwcGx5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgV3JpdGUgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGFkYXB0ZXIuIChyZS0pZW5hYmxlcyB0aGUgY2FyZCBpZiBkZXZpY2UgaXMKKyAqICBvcGVuLiBSZXR1cm5zIGhjZl9zdGF0dXMgb2YgaGNmX2VuYWJsZSgpLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyBhZGFwdGVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYXBwbHkoc3RydWN0IHdsX3ByaXZhdGUgKmxwKQoreworCWludCBoY2Zfc3RhdHVzID0gSENGX1NVQ0NFU1M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfYXBwbHkiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJREJHX0FTU0VSVCggbHAgIT0gTlVMTCk7CisJREJHX1BBUkFNKCBEYmdJbmZvLCAibHAiLCAiJXMgKDB4JXApIiwgbHAtPmRldi0+bmFtZSwgbHAgKTsKKworCWlmICggISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKwkJLyogVGhlIGFkYXB0ZXIgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQ6CisJCQkJZGlzYWJsZSBjYXJkCisJCQkJcmVsb2FkIHBhcmFtZXRlcnMKKwkJCQllbmFibGUgY2FyZAorCQkqLworCisJCWlmICggd2xfYWRhcHRlcl9pc19vcGVuKCBscC0+ZGV2ICkpIHsKKwkJCS8qIERpc2Nvbm5lY3QgYW5kIGRpc2FibGUgaWYgbmVjZXNzYXJ5ICovCisJCQloY2Zfc3RhdHVzID0gd2xfZGlzY29ubmVjdCggbHAgKTsKKwkJCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJEaXNjb25uZWN0IGZhaWxlZFxuIiApOworCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWhjZl9zdGF0dXMgPSB3bF9kaXNhYmxlKCBscCApOworCQkJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkRpc2FibGUgZmFpbGVkXG4iICk7CisJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXcml0ZSBvdXQgY29uZmlndXJhdGlvbiB0byB0aGUgZGV2aWNlLCBlbmFibGUsIGFuZCByZWNvbm5lY3QuCisJCQkJICAgSG93ZXZlciwgb25seSByZWNvbm5lY3QgaWYgaW4gQVAgbW9kZS4gRm9yIFNUQSBtb2RlLCBuZWVkIHRvCisJCQkJICAgd2FpdCBmb3IgcGFzc2l2ZSBzY2FuIGNvbXBsZXRpb24gYmVmb3JlIGEgY29ubmVjdCBjYW4gYmUKKwkJCQkgICBpc3N1ZWQgKi8KKwkJCQloY2Zfc3RhdHVzID0gd2xfcHV0X2x0diggbHAgKTsKKworCQkJCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCQkJaGNmX3N0YXR1cyA9IHdsX2VuYWJsZSggbHAgKTsKKworCQkJCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJCQkJCWhjZl9zdGF0dXMgPSB3bF9jb25uZWN0KCBscCApOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJ3bF9wdXRfbHR2KCkgZmFpbGVkXG4iICk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX2FwcGx5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wdXRfbHR2X2luaXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIHNldCBiYXNpYyBwYXJhbWV0ZXJzIGZvciBjYXJkIGluaXRpYWxpemF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyBhZGFwdGVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcHV0X2x0dl9pbml0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBpOworCWludCBoY2Zfc3RhdHVzOworCUNGR19SSURfTE9HX1NUUkNUICpSaWRMb2c7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcHV0X2x0dl9pbml0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCWlmICggbHAgPT0gTlVMTCApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAibHAgcG9pbnRlciBpcyBOVUxMXG4iICk7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gLTE7CisJfQorCS8qIERNQS9JTyAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTlRMX09QVDsKKworCS8qIFRoZSBDYXJkIFNlcnZpY2VzIGJ1aWxkIG11c3QgQUxXQVlTIGNvbmZpZ3VyZSBmb3IgMTYtYml0IEkvTy4gUENJIG9yCisJICAgQ2FyZEJ1cyBjYW4gYmUgc2V0IHRvIGVpdGhlciAxNi8zMiBiaXQgSS9PLCBvciBCdXMgTWFzdGVyIERNQSwgYnV0IG9ubHkKKwkgICBmb3IgSGVybWVzLTIuNSAqLworI2lmZGVmIEJVU19QQ01DSUEKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIFVTRV8xNkJJVCApOworI2Vsc2UKKwlpZiAoIGxwLT51c2VfZG1hICkgeworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIFVTRV9ETUEgKTsKKwl9IGVsc2UgeworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKwl9CisKKyNlbmRpZgorCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTlRMX09QVCAgICAgICAgICAgICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCSAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05UTF9PUFQgcmVzdWx0ICAgICAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCQkgICBoY2Zfc3RhdHVzICk7CisKKwkvKiBSZWdpc3RlciB0aGUgbGlzdCBvZiBSSURzIG9uIHdoaWNoIGFzeW5jaHJvbm91cyBub3RpZmljYXRpb24gaXMKKwkgICByZXF1aXJlZC4gTm90ZSB0aGF0IHRoaXMgbWVjaGFuaXNtIHJlcGxhY2VzIHRoZSBtYWlsYm94LCBzbyB0aGUgbWFpbGJveAorCSAgIGNhbiBiZSBxdWVyaWVkIGJ5IHRoZSBob3N0IChpZiBkZXNpcmVkKSB3aXRob3V0IGNvbnRlbnRpb24gZnJvbSB1cyAqLworCWk9MDsKKworCWxwLT5SaWRMaXN0W2ldLmxlbiAgICAgPSBzaXplb2YoIGxwLT5Qcm9iZVJlc3AgKTsKKwlscC0+UmlkTGlzdFtpXS50eXAgICAgID0gQ0ZHX0FDU19TQ0FOOworCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT5Qcm9iZVJlc3A7CisJLy9scC0+UHJvYmVSZXNwLmluZm9UeXBlID0gMHhGRkZGOworCWkrKzsKKworCWxwLT5SaWRMaXN0W2ldLmxlbiAgICAgPSBzaXplb2YoIGxwLT5hc3NvY19zdGF0ICk7CisJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IENGR19BU1NPQ19TVEFUOworCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT5hc3NvY19zdGF0OworCWxwLT5hc3NvY19zdGF0LmxlbiAgICAgPSAweEZGRkY7CisJaSsrOworCisJbHAtPlJpZExpc3RbaV0ubGVuICAgICA9IDQ7CisJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IENGR19VUERBVEVEX0lORk9fUkVDT1JEOworCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT51cGRhdGVkUmVjb3JkOworCWxwLT51cGRhdGVkUmVjb3JkLmxlbiAgPSAweEZGRkY7CisJaSsrOworCisJbHAtPlJpZExpc3RbaV0ubGVuICAgICA9IHNpemVvZiggbHAtPnNlY19zdGF0ICk7CisJbHAtPlJpZExpc3RbaV0udHlwICAgICA9IENGR19TRUNVUklUWV9TVEFUOworCWxwLT5SaWRMaXN0W2ldLmJ1ZnAgICAgPSAod2NpX3JlY29yZHApJmxwLT5zZWNfc3RhdDsKKwlscC0+c2VjX3N0YXQubGVuICAgICAgID0gMHhGRkZGOworCWkrKzsKKworCWxwLT5SaWRMaXN0W2ldLnR5cCAgICAgPSAwOyAgICAvLyBUZXJtaW5hdGUgTGlzdAorCisJUmlkTG9nID0gKENGR19SSURfTE9HX1NUUkNUICopJmxwLT5sdHZSZWNvcmQ7CisJUmlkTG9nLT5sZW4gICAgID0gMzsKKwlSaWRMb2ctPnR5cCAgICAgPSBDRkdfUkVHX0lORk9fTE9HOworCVJpZExvZy0+cmVjb3JkcCA9IChSSURfTE9HUCkmbHAtPlJpZExpc3RbMF07CisKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUkVHX0lORk9fTE9HXG4iICk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1JFR19JTkZPX0xPRyByZXN1bHQgICAgICAgICAgIDogMHglMDR4XG4iLAorCQkJICAgaGNmX3N0YXR1cyApOworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9wdXRfbHR2X2luaXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3B1dF9sdHYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIGJ5IHd2bGFuX2FwcGx5KCkgYW5kIHd2bGFuX2dvIHRvIHNldCB0aGUgY2FyZCdzIGNvbmZpZ3VyYXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIGFkYXB0ZXIncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wdXRfbHR2KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBsZW47CisJaW50IGhjZl9zdGF0dXM7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcHV0X2x0diIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmICggbHAgPT0gTlVMTCApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAibHAgcG9pbnRlciBpcyBOVUxMXG4iICk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCWxwLT5tYXhQb3J0ID0gNjsJCQkvLzs/d2h5IHNldCB0aGlzIGhlcmUgYW5kIG5vdCBhcyBwYXJ0IG9mIGRvd25sb2FkIHByb2Nlc3MKKwl9IGVsc2UgeworCQlscC0+bWF4UG9ydCA9IDA7CisJfQorCisJLyogU2VuZCBvdXIgY29uZmlndXJhdGlvbiB0byB0aGUgY2FyZC4gUGVyZm9ybSBhbnkgZW5kaWFuIHRyYW5zbGF0aW9uCisJICAgbmVjZXNzYXJ5ICovCisJLyogUmVnaXN0ZXIgdGhlIE1haWxib3g7IFZ4V29ya3MgZG9lcyB0aGlzIGVsc2V3aGVyZTsgd2h5Oz8gKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDQ7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUkVHX01COworCWxwLT5sdHZSZWNvcmQudS51MzJbMF0gID0gKHVfbG9uZykmKCBscC0+bWFpbGJveCApOworCWxwLT5sdHZSZWNvcmQudS51MTZbMl0gID0gKCBNQl9TSVpFIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBNYXggRGF0YSBMZW5ndGggKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01BWF9EQVRBX0xFTjsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBTeXN0ZW0gU2NhbGUgLyBEaXN0YW5jZSBiZXR3ZWVuIEFQcyAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfU1lTVEVNX1NDQUxFOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5EaXN0YW5jZUJldHdlZW5BUHMgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIENoYW5uZWwgKi8KKwlpZiAoIGxwLT5DcmVhdGVJQlNTICYmICggbHAtPkNoYW5uZWwgPT0gMCApKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNyZWF0ZSBJQlNTIiApOworCQlscC0+Q2hhbm5lbCA9IDEwOworCX0KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9DSEFOTkVMOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5DaGFubmVsICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBNaWNyb3dhdmUgUm9idXN0bmVzcyAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUlDUk9fV0FWRTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TWljcm93YXZlUm9idXN0bmVzcyApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLyogTG9hZCBCYWxhbmNpbmcgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0xPQURfQkFMQU5DSU5HOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sb2FkQmFsYW5jaW5nICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBNZWRpdW0gRGlzdHJpYnV0aW9uICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5tZWRpdW1EaXN0cmlidXRpb24gKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwkvKiBDb3VudHJ5IENvZGUgKi8KKworI2lmZGVmIFdBUlAKKwkvKiBUeCBQb3dlciBMZXZlbCAoZm9yIHN1cHBvcnRlZCBjYXJkcykgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1RYX1BPV19MVkw7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnR4UG93TGV2ZWwgKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIFNob3J0IFJldHJ5IExpbWl0ICovCisJLypscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSAweEZDMzI7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnNob3J0UmV0cnlMaW1pdCApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCSovCisKKwkvKiBMb25nIFJldHJ5IExpbWl0ICovCisJLypscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSAweEZDMzM7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmxvbmdSZXRyeUxpbWl0ICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJKi8KKworCS8qIFN1cHBvcnRlZCBSYXRlIFNldCBDb250cm9sICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NVUFBPUlRFRF9SQVRFX1NFVF9DTlRMOyAvLzB4RkM4ODsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+c3JzY1swXSApOworCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5zcnNjWzFdICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBCYXNpYyBSYXRlIFNldCBDb250cm9sICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0JBU0lDX1JBVEVfU0VUX0NOVEw7IC8vMHhGQzg5OworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5icnNjWzBdICk7CisJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmJyc2NbMV0gKTsKKwloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCS8qIEZyYW1lIEJ1cnN0IExpbWl0ICovCisJLyogRGVmaW5lZCwgYnV0IG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluIEZpcm13YXJlICovCisKKyNlbmRpZiAvLyBXQVJQCisKKyNpZmRlZiBXQVJQCisJLyogTXVsdGljYXN0IFJhdGUgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDM7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01DQVNUX1JBVEU7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk11bHRpY2FzdFJhdGVbMF0gKTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TXVsdGljYXN0UmF0ZVsxXSApOworI2Vsc2UKKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01DQVNUX1JBVEU7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPk11bHRpY2FzdFJhdGVbMF0gKTsKKyNlbmRpZiAvLyBXQVJQCisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBPd24gTmFtZSAoU3RhdGlvbiBOaWNrbmFtZSkgKi8KKwlpZiAoKCBsZW4gPSAoIHN0cmxlbiggbHAtPlN0YXRpb25OYW1lICkgKyAxICkgJiB+MHgwMSApICE9IDAgKSB7CisJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX0NORl9PV05fTkFNRSAgICAgICAgICAgICAgICAgIDogJXNcbiIsCisJCS8vICAgICAgICAgICBscC0+U3RhdGlvbk5hbWUgKTsKKworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDIgKyAoIGxlbiAvIHNpemVvZiggaGNmXzE2ICkpOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfT1dOX05BTUU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHN0cmxlbiggbHAtPlN0YXRpb25OYW1lICkpOworCisJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzJdICksIGxwLT5TdGF0aW9uTmFtZSwgbGVuICk7CisJfSBlbHNlIHsKKwkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9OQU1FICAgICAgICAgICAgICAgICAgOiBFTVBUWVxuIiApOworCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9OQU1FOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisJfQorCisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX05BTUUgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkvLyAgICAgICAgICAgaGNmX3N0YXR1cyApOworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgc2V0IGluIFNUQSBtb2RlIG9ubHkgKi8KKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisKKwkJLyogUlRTIFRocmVzaG9sZCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJIOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UlRTVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFBvcnQgVHlwZSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9QT1JUX1RZUEU7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5Qb3J0VHlwZSApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUeCBSYXRlIENvbnRyb2wgKi8KKyNpZmRlZiBXQVJQCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFsxXSApOworI2Vsc2UKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEw7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5UeFJhdGVDb250cm9sWzBdICk7CisjZW5kaWYgIC8vIFdBUlAKKworLy87P3NraXAgdGVtcG9yYXJpbHkgdG8gc2VlIHdoZXRoZXIgdGhlIFJJRCBvciBzb21ldGhpbmcgZWxzZSBpcyB0aGUgcHJvYmVsbSBoY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfVFhfUkFURV9DTlRMIDIuNEdIeiAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCQkJICAgbHAtPlR4UmF0ZUNvbnRyb2xbMF0gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1RYX1JBVEVfQ05UTCA1LjBHSHogICAgICAgICAgIDogMHglMDR4XG4iLAorCQkJCSAgIGxwLT5UeFJhdGVDb250cm9sWzFdICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19UWF9SQVRFX0NOVEwgcmVzdWx0ICAgICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkgICBoY2Zfc3RhdHVzICk7CisJCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUE1fRU5BQkxFRDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPlBNRW5hYmxlZCApOworLy8JCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4ODAwMSApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX1BNX0VOQUJMRUQgICAgICAgICAgICAgICAgOiAweCUwNHhcbiIsIGxwLT5QTUVuYWJsZWQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJCS8qIE11bHRpY2FzdCBSZWNlaXZlICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX01DQVNUX1JYOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TXVsdGljYXN0UmVjZWl2ZSApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBNYXggU2xlZXAgRHVyYXRpb24gKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfTUFYX1NMRUVQX0RVUkFUSU9OOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+TWF4U2xlZXBEdXJhdGlvbiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBDcmVhdGUgSUJTUyAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NSRUFURV9JQlNTOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+Q3JlYXRlSUJTUyApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBEZXNpcmVkIFNTSUQgKi8KKwkJaWYgKCgoIGxlbiA9ICggc3RybGVuKCBscC0+TmV0d29ya05hbWUgKSArIDEgKSAmIH4weDAxICkgIT0gMCApICYmCisJCQkgKCBzdHJjbXAoIGxwLT5OZXR3b3JrTmFtZSwgIkFOWSIgKSAhPSAwICkgJiYKKwkJCSAoIHN0cmNtcCggbHAtPk5ldHdvcmtOYW1lLCAiYW55IiApICE9IDAgKSkgeworCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfREVTSVJFRF9TU0lEICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkJCS8vICAgICAgICAgICBscC0+TmV0d29ya05hbWUgKTsKKworCQkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyICsgKGxlbiAvIHNpemVvZihoY2ZfMTYpKTsKKwkJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0RFU0lSRURfU1NJRDsKKwkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICkpOworCisJCQltZW1jcHkoICYoIGxwLT5sdHZSZWNvcmQudS51OFsyXSApLCBscC0+TmV0d29ya05hbWUsIGxlbiApOworCQl9IGVsc2UgeworCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfREVTSVJFRF9TU0lEICAgICAgICAgICAgICAgICAgOiBBTllcbiIgKTsKKworCQkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfREVTSVJFRF9TU0lEOworCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCQl9CisKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfREVTSVJFRF9TU0lEIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCS8vICAgICAgICAgICBoY2Zfc3RhdHVzICk7CisJCS8qIE93biBBVElNIHdpbmRvdyAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fQVRJTV9XSU5ET1c7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5hdGltV2luZG93ICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisKKwkJLyogSG9sZG92ZXIgRHVyYXRpb24gKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfSE9MRE9WRVJfRFVSQVRJT047CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5ob2xkb3ZlckR1cmF0aW9uICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+cHJvbWlzY3VvdXNNb2RlICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIEF1dGhlbnRpY2F0aW9uICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX0FVVEhFTlRJQ0FUSU9OOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+YXV0aGVudGljYXRpb24gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisjaWZkZWYgV0FSUAorCQkvKiBDb25uZWN0aW9uIENvbnRyb2wgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfQ09OTkVDVElPTl9DTlRMOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+Y29ubmVjdGlvbkNvbnRyb2wgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKworCisJCS8qIFByb2JlIGRhdGEgcmF0ZSAqLworCQkvKmxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMzsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPQkVfREFUQV9SQVRFOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+cHJvYmVEYXRhUmF0ZXNbMF0gKTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPnByb2JlRGF0YVJhdGVzWzFdICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19QUk9CRV9EQVRBX1JBVEUgMi40R0h6ICAgICAgICA6IDB4JTA0eFxuIiwKKwkJCQkgICBscC0+cHJvYmVEYXRhUmF0ZXNbMF0gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1BST0JFX0RBVEFfUkFURSA1LjBHSHogICAgICAgIDogMHglMDR4XG4iLAorCQkJCSAgIGxwLT5wcm9iZURhdGFSYXRlc1sxXSApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfUFJPQkVfREFUQV9SQVRFIHJlc3VsdCAgICAgICAgOiAweCUwNHhcbiIsCisJCQkJICAgaGNmX3N0YXR1cyApOyovCisjZW5kaWYgLy8gV0FSUAorCX0gZWxzZSB7CisJCS8qIFRoZSBmb2xsb3dpbmcgYXJlIHNldCBpbiBBUCBtb2RlIG9ubHkgKi8KKyNpZiAwIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCisJCS8qIERUSU0gUGVyaW9kICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX09XTl9EVElNX1BFUklPRDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPkRUSU1QZXJpb2QgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogTXVsdGljYXN0IFBNIEJ1ZmZlcmluZyAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9NQ0FTVF9QTV9CVUY7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5tdWx0aWNhc3RQTUJ1ZmZlcmluZyApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBSZWplY3QgQU5ZIC0gQ2xvc2VkIFN5c3RlbSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SRUpFQ1RfQU5ZOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+UmVqZWN0QW55ICk7CisKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogRXhjbHVkZSBVbmVuY3J5cHRlZCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9FWENMX1VORU5DUllQVEVEOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+RXhjbHVkZVVuZW5jcnlwdGVkICk7CisKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogSW50cmFCU1MgUmVsYXkgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfSU5UUkFfQlNTX1JFTEFZOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+aW50cmFCU1NSZWxheSApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBSVFMgVGhyZXNob2xkIDAgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDA7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5SVFNUaHJlc2hvbGQgKTsKKworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUeCBSYXRlIENvbnRyb2wgMCAqLworI2lmZGVmIFdBUlAKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAzOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwwOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFsxXSApOworI2Vsc2UKKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwwOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+VHhSYXRlQ29udHJvbFswXSApOworI2VuZGlmICAvLyBXQVJQCisKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogT3duIEJlYWNvbiBJbnRlcnZhbCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gMHhGQzMxOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+b3duQmVhY29uSW50ZXJ2YWwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogQ28tRXhpc3RlbmNlIEJlaGF2aW9yICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSAweEZDQzc7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5jb2V4aXN0ZW5jZSApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworI2lmZGVmIFVTRV9XRFMKKworCQkvKiBSVFMgVGhyZXNob2xkIDEgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19SVFNfVEhSSDE7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogUlRTIFRocmVzaG9sZCAyICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkgyOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisKKwkJLyogUlRTIFRocmVzaG9sZCAzICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkgzOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMl0ucnRzVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisKKwkJLyogUlRTIFRocmVzaG9sZCA0ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkg0OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbM10ucnRzVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisKKwkJLyogUlRTIFRocmVzaG9sZCA1ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUlRTX1RIUkg1OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFJUUyBUaHJlc2hvbGQgNiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1JUU19USFJINjsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzVdLnJ0c1RocmVzaG9sZCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKyNpZiAwCisJCS8qIFRYIFJhdGUgQ29udHJvbCAxICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMMTsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzBdLnR4UmF0ZUNudGwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVFggUmF0ZSBDb250cm9sIDIgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEwyOworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbMV0udHhSYXRlQ250bCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUWCBSYXRlIENvbnRyb2wgMyAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDM7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFsyXS50eFJhdGVDbnRsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFRYIFJhdGUgQ29udHJvbCA0ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfVFhfUkFURV9DTlRMNDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPndkc19wb3J0WzNdLnR4UmF0ZUNudGwgKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogVFggUmF0ZSBDb250cm9sIDUgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19UWF9SQVRFX0NOVEw1OworCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+d2RzX3BvcnRbNF0udHhSYXRlQ250bCApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBUWCBSYXRlIENvbnRyb2wgNiAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1RYX1JBVEVfQ05UTDY7CisJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT53ZHNfcG9ydFs1XS50eFJhdGVDbnRsICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisjZW5kaWYKKworCQkvKiBXRFMgYWRkcmVzc2VzLiAgSXQncyBva2F5IHRvIGJsaW5kbHkgc2VuZCB0aGVzZSBwYXJhbWV0ZXJzLCBiZWNhdXNlCisJCSAgIHRoZSBwb3J0IG5lZWRzIHRvIGJlIGVuYWJsZWQsIGJlZm9yZSBhbnl0aGluZyBpcyBkb25lIHdpdGggaXQuICovCisKKwkJLyogV0RTIEFkZHJlc3MgMSAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgID0gNDsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICA9IENGR19DTkZfV0RTX0FERFIxOworCisJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgbHAtPndkc19wb3J0WzBdLndkc0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFdEUyBBZGRyZXNzIDIgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICA9IDQ7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSMjsKKworCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sIGxwLT53ZHNfcG9ydFsxXS53ZHNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBXRFMgQWRkcmVzcyAzICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgID0gQ0ZHX0NORl9XRFNfQUREUjM7CisKKwkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbMl0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkJLyogV0RTIEFkZHJlc3MgNCAqLworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgID0gNDsKKwkJbHAtPmx0dlJlY29yZC50eXAgICAgICA9IENGR19DTkZfV0RTX0FERFI0OworCisJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgbHAtPndkc19wb3J0WzNdLndkc0FkZHJlc3MsIEVUSF9BTEVOICk7CisJCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCS8qIFdEUyBBZGRyZXNzIDUgKi8KKwkJbHAtPmx0dlJlY29yZC5sZW4gICAgICA9IDQ7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgPSBDRkdfQ05GX1dEU19BRERSNTsKKworCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sIGxwLT53ZHNfcG9ydFs0XS53ZHNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQkvKiBXRFMgQWRkcmVzcyA2ICovCisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgPSA0OworCQlscC0+bHR2UmVjb3JkLnR5cCAgICAgID0gQ0ZHX0NORl9XRFNfQUREUjY7CisKKwkJbWVtY3B5KCAmbHAtPmx0dlJlY29yZC51LnU4WzBdLCBscC0+d2RzX3BvcnRbNV0ud2RzQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyNlbmRpZiAgLyogKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQICovCisJfQorCisJLyogT3duIE1BQyBBZGRyZXNzICovCisJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJNQUMgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgOiAlc1xuIiwKKwkvLyAgICAgICAgICAgRGJnSHdBZGRyKCBscC0+TUFDQWRkcmVzcyApKTsKKworCWlmICggV1ZMQU5fVkFMSURfTUFDX0FERFJFU1MoIGxwLT5NQUNBZGRyZXNzICkpIHsKKwkJLyogTWFrZSB0aGUgTUFDIGFkZHJlc3MgdmFsaWQgYnk6CisJCQkJQ2xlYXJpbmcgdGhlIG11bHRpY2FzdCBiaXQKKwkJCQlTZXR0aW5nIHRoZSBsb2NhbCBNQUMgYWRkcmVzcyBiaXQKKwkJKi8KKwkJLy9scC0+TUFDQWRkcmVzc1swXSAmPSB+MHgwMzsgIC8vOz93aHkgaXMgdGhpcyBjb21tZW50ZWQgb3V0IGFscmVhZHkgaW4gNzIwCisJCS8vbHAtPk1BQ0FkZHJlc3NbMF0gfD0gMHgwMjsKKworCQlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIEVUSF9BTEVOIC8gc2l6ZW9mKCBoY2ZfMTYgKSk7CisJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfTklDX01BQ19BRERSXG4iICk7CisJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19OSUNfTUFDX0FERFI7CisJCX0gZWxzZSB7CisJCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX01BQ19BRERSXG4iICk7CisJCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX01BQ19BRERSOworCQl9CisJCS8qIE1BQyBhZGRyZXNzIGlzIGJ5dGUgYWxpZ25lZCwgbm8gZW5kaWFuIGNvbnZlcnNpb24gbmVlZGVkICovCisJCW1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4WzBdICksIGxwLT5NQUNBZGRyZXNzLCBFVEhfQUxFTiApOworCQloY2Zfc3RhdHVzID0gaGNmX3B1dF9pbmZvKCAmbHAtPmhjZkN0eCwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKwkJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfWFhYX01BQ19BRERSIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCisJCS8vICAgICAgICAgICBoY2Zfc3RhdHVzICk7CisKKwkJLyogVXBkYXRlIHRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgbmV0ZGV2aWNlIHN0cnVjdCAqLworCQltZW1jcHkoIGxwLT5kZXYtPmRldl9hZGRyLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsgLy87P3doYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWVtaW5nbHkgY29tcGxleCBsb2dpYworCX0KKwkvKiBPd24gU1NJRCAqLworCWlmICgoKCBsZW4gPSAoIHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICkgKyAxICkgJiB+MHgwMSApICE9IDAgKSAmJgorCQkJCSAoIHN0cmNtcCggbHAtPk5ldHdvcmtOYW1lLCAiQU5ZIiApICE9IDAgKSAmJgorCQkJCSAoIHN0cmNtcCggbHAtPk5ldHdvcmtOYW1lLCAiYW55IiApICE9IDAgKSkgeworCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX1NTSUQgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorCQkvLyAgICAgICAgICAgbHAtPk5ldHdvcmtOYW1lICk7CisJCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMiArIChsZW4gLyBzaXplb2YoaGNmXzE2KSk7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fU1NJRDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggc3RybGVuKCBscC0+TmV0d29ya05hbWUgKSk7CisKKwkJbWVtY3B5KCAmKCBscC0+bHR2UmVjb3JkLnUudThbMl0gKSwgbHAtPk5ldHdvcmtOYW1lLCBsZW4gKTsKKwl9IGVsc2UgeworCQkvL0RCR19UUkFDRSggRGJnSW5mbywgIkNGR19DTkZfT1dOX1NTSUQgICAgICAgICAgICAgICAgICA6IEFOWVxuIiApOworCQlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9PV05fU1NJRDsKKwkJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCX0KKworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLy9EQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQ05GX09XTl9TU0lEIHJlc3VsdCAgICAgICAgICAgOiAweCUwNHhcbiIsCisJLy8gICAgICAgICAgIGhjZl9zdGF0dXMgKTsKKwkvKiBlbmFibGUvZGlzYWJsZSBlbmNyeXB0aW9uICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9FTkNSWVBUSU9OOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5FbmFibGVFbmNyeXB0aW9uICk7CisJaGNmX3N0YXR1cyA9IGhjZl9wdXRfaW5mbyggJmxwLT5oY2ZDdHgsIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKwkvKiBTZXQgdGhlIEF1dGhlbnRpY2F0aW9uIEtleSBNYW5hZ2VtZW50IFN1aXRlICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NFVF9XUEFfQVVUSF9LRVlfTUdNVF9TVUlURTsKKwlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+QXV0aEtleU1nbXRTdWl0ZSApOworCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCS8qIFdFUCBLZXlzICovCisJd2xfc2V0X3dlcF9rZXlzKCBscCApOworCisJLyogQ291bnRyeSBDb2RlICovCisJLyogY291bnRyeUluZm8sIGx0dkNvdW50cnlJbmZvLCBDRkdfQ05GX0NPVU5UUllfSU5GTyAqLworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX3B1dF9sdHYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWluaXRfbW9kdWxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgTG9hZCB0aGUga2VybmVsIG1vZHVsZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGFuIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9faW5pdCB3bF9tb2R1bGVfaW5pdCggdm9pZCApCit7CisJaW50IHJlc3VsdDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggIndsX21vZHVsZV9pbml0IiApOworCisjaWYgREJHCisJLyogQ29udmVydCAic3RhbmRhcmQiIFBDTUNJQSBwYXJhbWV0ZXIgcGNfZGVidWcgdG8gYSByZWFzb25hYmxlIERlYnVnRmxhZyB2YWx1ZS4KKwkgKiBOT1RFOiBUaGUgdmFsdWVzIGFsbCBmYWxsIHRocm91Z2ggdG8gdGhlIGxvd2VyIHZhbHVlcy4gKi8KKwlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSAwOworCURiZ0luZm8tPkRlYnVnRmxhZyA9IERCR19UUkFDRV9PTjsJCS8vOz9nZXQgdGhpcyBtZXNzIHJlc29sdmVkIG9uZSBkYXkKKwlpZiAoIHBjX2RlYnVnICkgc3dpdGNoKCBwY19kZWJ1ZyApIHsKKwkgIGNhc2UgODoKKwkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19EU19PTjsKKwkgIGNhc2UgNzoKKwkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19SWF9PTiB8IERCR19UWF9PTjsKKwkgIGNhc2UgNjoKKwkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19QQVJBTV9PTjsKKwkgIGNhc2UgNToKKwkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19UUkFDRV9PTjsKKwkgIGNhc2UgNDoKKwkJRGJnSW5mby0+RGVidWdGbGFnIHw9IERCR19WRVJCT1NFX09OOworCSAgY2FzZSAxOgorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX0RFRkFVTFRTOworCSAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2VuZGlmIC8qIERCRyAqLworCisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIFZFUlNJT05fSU5GTyk7CisgICAgCXByaW50ayhLRVJOX0lORk8gIioqKiBNb2RpZmllZCBmb3Iga2VybmVsIDIuNiBieSBIZW5rIGRlIEdyb290IDxwZTFkbm5AYW1zYXQub3JnPlxuIik7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIioqKiBCYXNlZCBvbiA3LjE4IHZlcnNpb24gYnkgQW5kcmV5IEJvcnplbmtvdiA8YXJ2aWRqYWFyQG1haWwucnU+ICRSZXZpc2lvbjogMzkgJFxuIik7CisKKworLy8gOz8jaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisvLyAJREJHX1BSSU5UKCAiQWNjZXNzIFBvaW50IE1vZGUgKEFQKSBTdXBwb3J0OiBZRVNcbiIgKTsKKy8vICNlbHNlCisvLyAJREJHX1BSSU5UKCAiQWNjZXNzIFBvaW50IE1vZGUgKEFQKSBTdXBwb3J0OiBOT1xuIiApOworLy8gI2VuZGlmIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisJcmVzdWx0ID0gd2xfYWRhcHRlcl9pbml0X21vZHVsZSggKTsKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyBpbml0X21vZHVsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJY2xlYW51cF9tb2R1bGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVbmxvYWQgdGhlIGtlcm5lbCBtb2R1bGUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX2V4aXQgd2xfbW9kdWxlX2V4aXQoIHZvaWQgKQoreworCURCR19GVU5DKCAid2xfbW9kdWxlX2V4aXQiICk7CisJREJHX0VOVEVSKERiZ0luZm8pOworCisJd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggKTsKKyNpZiAwIC8vU0NVTExfVVNFX1BST0MgLyogZG9uJ3Qgd2FzdGUgc3BhY2UgaWYgdW51c2VkICovCisJcmVtb3ZlX3Byb2NfZW50cnkoICJ3bGFncyIsIE5VTEwgKTsJCS8vOz93aHkgc28gYS1zeW1tZXRyaWMgY29tcGFyZWQgdG8gbG9jYXRpb24gb2YgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeQorI2VuZGlmCisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIGNsZWFudXBfbW9kdWxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCittb2R1bGVfaW5pdCh3bF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCh3bF9tb2R1bGVfZXhpdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9pc3IoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBmb3IgdGhlIGRyaXZlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGlycSAgICAgLSAgIHRoZSBpcnEgdGhlIGludGVycnVwdCBjYW1lIGluIG9uCisgKiAgICAgIGRldl9pZCAgLSAgIGEgYnVmZmVyIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QKKyAqICAgICAgcmVncyAgICAtCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaXJxcmV0dXJuX3Qgd2xfaXNyKCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzICkKK3sKKwlpbnQgICAgICAgICAgICAgICAgIGV2ZW50czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gTlVMTDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJaWYgKCggZGV2ID09IE5VTEwgKSB8fCAoICFuZXRpZl9kZXZpY2VfcHJlc2VudCggZGV2ICkpKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBTZXQgdGhlIHdsX3ByaXZhdGUgcG9pbnRlciAobHApLCBub3cgdGhhdCB3ZSBrbm93IHRoYXQgZGV2IGlzIG5vbi1udWxsICovCisJbHAgPSB3bF9wcml2KGRldik7CisKKyNpZmRlZiBVU0VfUlRTCisJaWYgKCBscC0+dXNlUlRTID09IDEgKSB7CisJCURCR19QUklOVCggIkVYSVRJTkcgSVNSLCBJTiBSVFMgTU9ERS4uLlxuIiApOworCQlyZXR1cm47CisJCX0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisJLyogSWYgd2UgaGF2ZSBpbnRlcnJ1cHRzIHBlbmRpbmcsIHRoZW4gcHV0IHRoZW0gb24gYSBzeXN0ZW0gdGFzaworCSAgIHF1ZXVlLiBPdGhlcndpc2UgdHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gKi8KKwlldmVudHMgPSBoY2ZfYWN0aW9uKCAmbHAtPmhjZkN0eCwgSENGX0FDVF9JTlRfT0ZGICk7CisKKwlpZiAoIGV2ZW50cyA9PSBIQ0ZfSU5UX1BFTkRJTkcgKSB7CisJCS8qIFNjaGVkdWxlIHRoZSBJU1IgaGFuZGxlciBhcyBhIGJvdHRvbS1oYWxmIHRhc2sgaW4gdGhlCisJCSAgIHRxX2ltbWVkaWF0ZSBxdWV1ZSAqLworCQl0YXNrbGV0X3NjaGVkdWxlKCZscC0+dGFzayk7CisJfSBlbHNlIHsKKwkJLy9EQkdfUFJJTlQoICJOT1QgT1VSIElOVEVSUlVQVFxuIiApOworCQloY2ZfYWN0aW9uKCAmbHAtPmhjZkN0eCwgSENGX0FDVF9JTlRfT04gKTsKKwl9CisKKwlyZXR1cm4gSVJRX1JFVFZBTChldmVudHMgPT0gSENGX0lOVF9QRU5ESU5HKTsKK30gLy8gd2xfaXNyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9pc3JfaGFuZGxlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBJU1IgaGFuZGxlciwgc2NoZWR1bGVkIHRvIHJ1biBpbiBhIGRlZmVycmVkIGNvbnRleHQgYnkgdGhlIElTUi4gVGhpcworICogICAgICBpcyB3aGVyZSB0aGUgSVNSJ3Mgd29yayBhY3R1YWxseSBnZXRzIGRvbmUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdWTEFOX01BWF9JTlRfU0VSVklDRVMgIDUwCisKK3ZvaWQgd2xfaXNyX2hhbmRsZXIoIHVuc2lnbmVkIGxvbmcgcCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldjsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKwlib29sX3QgICAgICAgICAgICAgICAgICBzdG9wID0gVFJVRTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQ7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKXA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJaWYgKCBscCA9PSBOVUxMICkgeworCQlEQkdfUFJJTlQoICJ3bF9pc3JfaGFuZGxlciAgbHAgYWRhcHRlciBwb2ludGVyIGlzIE5VTEwhISFcbiIgKTsKKwl9IGVsc2UgeworCQl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbHAtPmRldjsKKwkJaWYgKCBkZXYgIT0gTlVMTCAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudCggZGV2ICkgKSBzdG9wID0gRkFMU0U7CisJCWZvciggY291bnQgPSAwOyBzdG9wID09IEZBTFNFICYmIGNvdW50IDwgV1ZMQU5fTUFYX0lOVF9TRVJWSUNFUzsgY291bnQrKyApIHsKKwkJCXN0b3AgPSBUUlVFOworCQkJcmVzdWx0ID0gaGNmX3NlcnZpY2VfbmljKCAmbHAtPmhjZkN0eCwKKwkJCQkJCQkJCSAgKHdjaV9idWZwKWxwLT5sb29rQWhlYWRCdWYsCisJCQkJCQkJCQkgIHNpemVvZiggbHAtPmxvb2tBaGVhZEJ1ZiApKTsKKwkJCWlmICggcmVzdWx0ID09IEhDRl9FUlJfTUlDICkgeworCQkJCXdsX3dleHRfZXZlbnRfbWljX2ZhaWxlZCggZGV2ICk7IAkvKiBTZW5kIGFuIGV2ZW50IHRoYXQgTUlDIGZhaWxlZCAqLworCQkJCS8vOz90aGlzIHNlZW1zIHdyb25nIGlmIEhDRl9FUlJfTUlDIGNvaW5jaWRlcyB3aXRoIGFub3RoZXIgZXZlbnQsIHN0b3AgZ2V0cyBGQUxTRQorCQkJCS8vc28gd2h5IG5vdCBkbyBpdCBhbHdheXMgOz8KKwkJCX0KKworI2lmbmRlZiBVU0VfTUJPWF9TWU5DCisJCQlpZiAoIGxwLT5oY2ZDdHguSUZCX01CSW5mb0xlbiAhPSAwICkgewkvKiBhbnl0aGluZyBpbiB0aGUgbWFpbGJveCAqLworCQkJCXdsX21ieCggbHAgKTsKKwkJCQlzdG9wID0gRkFMU0U7CisJCQl9CisjZW5kaWYKKwkJCS8qIENoZWNrIGZvciBhIExpbmsgc3RhdHVzIGV2ZW50ICovCisJCQlpZiAoICggbHAtPmhjZkN0eC5JRkJfTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0ZXICkgIT0gMCApIHsKKwkJCQl3bF9wcm9jZXNzX2xpbmtfc3RhdHVzKCBscCApOworCQkJCXN0b3AgPSBGQUxTRTsKKwkJCX0KKwkJCS8qIENoZWNrIGZvciBwcm9iZSByZXNwb25zZSBldmVudHMgKi8KKwkJCWlmICggbHAtPlByb2JlUmVzcC5pbmZvVHlwZSAhPSAwICYmCisJCQkJbHAtPlByb2JlUmVzcC5pbmZvVHlwZSAhPSAweEZGRkYgKSB7CisJCQkJd2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSggbHAgKTsKKwkJCQltZW1zZXQoICZscC0+UHJvYmVSZXNwLCAwLCBzaXplb2YoIGxwLT5Qcm9iZVJlc3AgKSk7CisJCQkJbHAtPlByb2JlUmVzcC5pbmZvVHlwZSA9IDB4RkZGRjsKKwkJCQlzdG9wID0gRkFMU0U7CisJCQl9CisJCQkvKiBDaGVjayBmb3IgdXBkYXRlZCByZWNvcmQgZXZlbnRzICovCisJCQlpZiAoIGxwLT51cGRhdGVkUmVjb3JkLmxlbiAhPSAweEZGRkYgKSB7CisJCQkJd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCggbHAgKTsKKwkJCQlscC0+dXBkYXRlZFJlY29yZC5sZW4gPSAweEZGRkY7CisJCQkJc3RvcCA9IEZBTFNFOworCQkJfQorCQkJLyogQ2hlY2sgZm9yIGFzc29jaWF0aW9uIHN0YXR1cyBldmVudHMgKi8KKwkJCWlmICggbHAtPmFzc29jX3N0YXQubGVuICE9IDB4RkZGRiApIHsKKwkJCQl3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cyggbHAgKTsKKwkJCQlscC0+YXNzb2Nfc3RhdC5sZW4gPSAweEZGRkY7CisJCQkJc3RvcCA9IEZBTFNFOworCQkJfQorCQkJLyogQ2hlY2sgZm9yIHNlY3VyaXR5IHN0YXR1cyBldmVudHMgKi8KKwkJCWlmICggbHAtPnNlY19zdGF0LmxlbiAhPSAweEZGRkYgKSB7CisJCQkJd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMoIGxwICk7CisJCQkJbHAtPnNlY19zdGF0LmxlbiA9IDB4RkZGRjsKKwkJCQlzdG9wID0gRkFMU0U7CisJCQl9CisKKyNpZmRlZiBFTkFCTEVfRE1BCisJCQlpZiAoIGxwLT51c2VfZG1hICkgeworCQkJCS8qIENoZWNrIGZvciBETUEgUnggcGFja2V0cyAqLworCQkJCWlmICggbHAtPmhjZkN0eC5JRkJfRG1hUGFja2V0cyAmIEhSRUdfRVZfUkRNQUQgKSB7CisJCQkJCXdsX3J4X2RtYSggZGV2ICk7CisJCQkJCXN0b3AgPSBGQUxTRTsKKwkJCQl9CisJCQkJLyogUmV0dXJuIFR4IERNQSBkZXNjcmlwdG9ycyB0byBob3N0ICovCisJCQkJaWYgKCBscC0+aGNmQ3R4LklGQl9EbWFQYWNrZXRzICYgSFJFR19FVl9URE1BRCApIHsKKwkJCQkJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCggbHAgKTsKKwkJCQkJc3RvcCA9IEZBTFNFOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKyNlbmRpZiAvLyBFTkFCTEVfRE1BCisJCQl7CisJCQkJLyogQ2hlY2sgZm9yIFJ4IHBhY2tldHMgKi8KKwkJCQlpZiAoIGxwLT5oY2ZDdHguSUZCX1J4TGVuICE9IDAgKSB7CisJCQkJCXdsX3J4KCBkZXYgKTsKKwkJCQkJc3RvcCA9IEZBTFNFOworCQkJCX0KKwkJCQkvKiBNYWtlIHN1cmUgdGhhdCBxdWV1ZWQgZnJhbWVzIGdldCBzZW50ICovCisJCQkJaWYgKCB3bF9zZW5kKCBscCApKSB7CisJCQkJCXN0b3AgPSBGQUxTRTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogV2UncmUgZG9uZSwgc28gdHVybiBpbnRlcnJ1cHRzIHdoaWNoIHdlcmUgdHVybmVkIG9mZiBpbiB3bF9pc3IsIGJhY2sgb24gKi8KKwkJaGNmX2FjdGlvbiggJmxwLT5oY2ZDdHgsIEhDRl9BQ1RfSU5UX09OICk7CisJCXdsX3VubG9jayggbHAsICZmbGFncyApOworCX0KKwlyZXR1cm47Cit9IC8vIHdsX2lzcl9oYW5kbGVyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9yZW1vdmUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBOb3RpZnkgdGhlIGFkYXB0ZXIgdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkLiBTaW5jZSB0aGUgYWRhcHRlciBpcyBnb25lLAorICogIHdlIHNob3VsZCBubyBsb25nZXIgdHJ5IHRvIHRhbGsgdG8gaXQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9yZW1vdmUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9yZW1vdmUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCS8qIHN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cyAqLworCXdsX2FjdF9pbnRfb2ZmKCBscCApOworICAgICAgICBscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfTk9UX0hBTkRMSU5HX0lOVDsKKworCS8qCisgICAgICAgICAqIERpc2FibGUgdGhlIHBvcnRzOiBqdXN0IGNoYW5nZSBzdGF0ZTogc2luY2UgdGhlCisgICAgICAgICAqIGNhcmQgaXMgZ29uZSBpdCBpcyB1c2VsZXNzIHRvIHRhbGsgdG8gaXQgYW5kIGF0CisgICAgICAgICAqIGRpc2Nvbm5lY3QgYWxsIHN0YXRlIGluZm9ybWF0aW9uIGlzIGxvc3QgYW55d2F5LgorICAgICAgICAgKi8KKwkvKiBSZXNldCBwb3J0U3RhdGUgKi8KKwlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKKworI2lmIDAgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKyNpZmRlZiBVU0VfV0RTCisJLy93bF9kaXNhYmxlX3dkc19wb3J0cyggbHAgKTsKKyNlbmRpZiAvLyBVU0VfV0RTCisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisJLyogTWFyayB0aGUgZGV2aWNlIGFzIHVucmVnaXN0ZXJlZCAqLworCWxwLT5pc19yZWdpc3RlcmVkID0gRkFMU0U7CisKKwkvKiBEZXJlZ2lzdGVyIHRoZSBXRFMgcG9ydHMgYXMgd2VsbCAqLworCVdMX1dEU19ORVRERVZfREVSRUdJU1RFUiggbHAgKTsKKyNpZmRlZiBVU0VfUlRTCisJaWYgKCBscC0+dXNlUlRTID09IDEgKSB7CisJCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm47CisJfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKwkvKiBJbmZvcm0gdGhlIEhDRiB0aGF0IHRoZSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQgKi8KKwloY2ZfY29ubmVjdCggJmxwLT5oY2ZDdHgsIEhDRl9ESVNDT05ORUNUICk7CisKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfcmVtb3ZlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9zdXNwZW5kKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUG93ZXItZG93biBhbmQgaGFsdCB0aGUgYWRhcHRlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3N1c3BlbmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3N1c3BlbmQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworCS8qIFRoZSBhZGFwdGVyIGlzIHN1c3BlbmRlZDoKKwkJCVN0b3AgdGhlIGFkYXB0ZXIKKwkJCVBvd2VyIGRvd24KKwkqLworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0IGhhbmRsaW5nICovCisJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBEaXNjb25uZWN0ICovCisJd2xfZGlzY29ubmVjdCggbHAgKTsKKworCS8qIERpc2FibGUgKi8KKwl3bF9kaXNhYmxlKCBscCApOworCisgICAgICAgIC8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgYWRhcHRlciAqLworCWhjZl9jb25uZWN0KCAmbHAtPmhjZkN0eCwgSENGX0RJU0NPTk5FQ1QgKTsKKworCS8qIFJlc2V0IHBvcnRTdGF0ZSB0byBiZSBzdXJlIChzaG91bGQgaGF2ZSBiZWVuIGRvbmUgYnkgd2xfZGlzYWJsZSAqLworCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEOworCisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3N1c3BlbmQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Jlc3VtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlc3VtZSBhIHByZXZpb3VzbHkgc3VzcGVuZGVkIGFkYXB0ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9yZXN1bWUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgICAgICAvKiBDb25uZWN0IHRvIHRoZSBhZGFwdGVyICovCisJaGNmX2Nvbm5lY3QoICZscC0+aGNmQ3R4LCBkZXYtPmJhc2VfYWRkciApOworCisJLyogUmVzZXQgcG9ydFN0YXRlICovCisJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQ7CisKKwkvKiBQb3dlciBtaWdodCBoYXZlIGJlZW4gb2ZmLCBhc3N1bWUgdGhlIGNhcmQgbG9zdCB0aGUgZmlybXdhcmUqLworCWxwLT5maXJtd2FyZV9wcmVzZW50ID0gV0xfRlJJTVdBUkVfTk9UX1BSRVNFTlQ7CisKKwkvKiBSZWxvYWQgdGhlIGZpcm13YXJlIGFuZCByZXN0YXJ0ICovCisJd2xfcmVzZXQoIGRldiApOworCisJLyogUmVzdW1lIGludGVycnVwdCBoYW5kbGluZyAqLworCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybjsKK30gLy8gd2xfcmVzdW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9yZWxlYXNlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmcm9tcyBhIGNoZWNrIG9uIHRoZSBkZXZpY2UgYW5kIGNhbGxzIHdsX3JlbW92ZSgpIGlmCisgKiAgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBhbGwgYnVzIHR5cGVzLCBidXQgZXhpc3RzIG1vc3RseQorICogIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUgQ2FyZCBTZXJ2aWNlcyBkcml2ZXIsIGFzIHRoZXJlIGFyZSB0aW1lcyB3aGVuCisgKiAgd2xfcmVtb3ZlKCkgZG9lcyBub3QgZ2V0IGNhbGxlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3JlbGVhc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCB3bF9wcml2YXRlICAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2xfcmVsZWFzZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCURCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCS8qIElmIHdsX3JlbW92ZSgpIGhhc24ndCBiZWVuIGNhbGxlZCAoaS5lLiB3aGVuIENhcmQgU2VydmljZXMgaXMgc2h1dAorCSAgIGRvd24gd2l0aCB0aGUgY2FyZCBpbiB0aGUgc2xvdCksIHRoZW4gY2FsbCBpdCAqLworCWlmICggbHAtPmlzX3JlZ2lzdGVyZWQgPT0gVFJVRSApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ2FsbGluZyB1bnJlZ2lzdGVyX25ldGRldigpLCBhcyBpdCB3YXNuJ3QgY2FsbGVkIHlldFxuIiApOworCQl3bF9yZW1vdmUoIGRldiApOworCisJCWxwLT5pc19yZWdpc3RlcmVkID0gRkFMU0U7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9yZWxlYXNlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nZXRfaXJxX21hc2soKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBY2Nlc3NvciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaXJxX21hc2sgbW9kdWxlIHBhcmFtZXRlcgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUaGUgaXJxX21hc2sgbW9kdWxlIHBhcmFtZXRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwX3UxNiB3bF9nZXRfaXJxX21hc2soIHZvaWQgKQoreworCXJldHVybiBpcnFfbWFzazsKK30gLy8gd2xfZ2V0X2lycV9tYXNrCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nZXRfaXJxX2xpc3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBY2Nlc3NvciBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaXJxX2xpc3QgbW9kdWxlIHBhcmFtZXRlcgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUaGUgaXJxX2xpc3QgbW9kdWxlIHBhcmFtZXRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwX3M4ICogd2xfZ2V0X2lycV9saXN0KCB2b2lkICkKK3sKKwlyZXR1cm4gaXJxX2xpc3Q7Cit9IC8vIHdsX2dldF9pcnFfbGlzdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9lbmFibGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIGVuYWJsZSBNQUMgcG9ydHMKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2VuYWJsZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX2VuYWJsZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmICggbHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIk5vIGFjdGlvbjogQ2FyZCBhbHJlYWR5IGVuYWJsZWRcbiIgKTsKKwl9IGVsc2UgaWYgKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfQ09OTkVDVEVEICkgeworCQkvLzs/c3VzcGljdW91cyBsb2dpYywgaG93IGNhbiB5b3UgYmUgY29ubmVjdGVkIHdpdGhvdXQgYmVpbmcgZW5hYmxlZCBzbyB0aGlzIGlzIHByb2JhYmx5IGRlYWQgY29kZQorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBhY3Rpb246IENhcmQgYWxyZWFkeSBjb25uZWN0ZWRcbiIgKTsKKwl9IGVsc2UgeworCQloY2Zfc3RhdHVzID0gaGNmX2NudGwoICZscC0+aGNmQ3R4LCBIQ0ZfQ05UTF9FTkFCTEUgKTsKKwkJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJLyogU2V0IHRoZSBzdGF0dXMgb2YgdGhlIE5JQyB0byBlbmFibGVkICovCisJCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9FTkFCTEVEOyAgIC8vOz9iYWQgbW5lbW9uaWMsIE5JQyBpc28gUE9SVAorI2lmZGVmIEVOQUJMRV9ETUEKKwkJCWlmICggbHAtPnVzZV9kbWEgKSB7CisJCQkJd2xfcGNpX2RtYV9oY2Zfc3VwcGx5KCBscCApOyAgLy87P2Fsd2F5cyBzdWNjZXM/CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKwlpZiAoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7ICAvLzs/bWFrZSB0aGlzIGFuIGFzc2VydAorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJmYWlsZWQ6IDB4JXhcbiIsIGhjZl9zdGF0dXMgKTsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIGhjZl9zdGF0dXM7Cit9IC8vIHdsX2VuYWJsZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjaWZkZWYgVVNFX1dEUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2VuYWJsZV93ZHNfcG9ydHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIGVuYWJsZSB0aGUgV0RTIE1BQyBwb3J0cyAxLTYKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9lbmFibGVfd2RzX3BvcnRzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqIGxwICkKK3sKKworCURCR19GVU5DKCAid2xfZW5hYmxlX3dkc19wb3J0cyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApeworCQlEQkdfRVJST1IoIERiZ0luZm8sICIhISEhOz8gc29tZW9uZSBtaXN1bmRlcnN0b29kIHNvbWV0aGluZyAhISEhIVxuIiApOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX2VuYWJsZV93ZHNfcG9ydHMKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfY29ubmVjdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gY29ubmVjdCBhIE1BQyBwb3J0CisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9jb25uZWN0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBoY2Zfc3RhdHVzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2xfY29ubmVjdCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmICggbHAtPnBvcnRTdGF0ZSAhPSBXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIk5vIGFjdGlvbjogTm90IGluIGVuYWJsZWQgc3RhdGVcbiIgKTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiBIQ0ZfU1VDQ0VTUzsKKwl9CisJaGNmX3N0YXR1cyA9IGhjZl9jbnRsKCAmbHAtPmhjZkN0eCwgSENGX0NOVExfQ09OTkVDVCApOworCWlmICggaGNmX3N0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJbHAtPnBvcnRTdGF0ZSA9IFdWTEFOX1BPUlRfU1RBVEVfQ09OTkVDVEVEOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfY29ubmVjdAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZGlzY29ubmVjdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gZGlzY29ubmVjdCBhIE1BQyBwb3J0CisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9kaXNjb25uZWN0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBoY2Zfc3RhdHVzOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2xfZGlzY29ubmVjdCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmICggbHAtPnBvcnRTdGF0ZSAhPSBXVkxBTl9QT1JUX1NUQVRFX0NPTk5FQ1RFRCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTm8gYWN0aW9uOiBOb3QgaW4gY29ubmVjdGVkIHN0YXRlXG4iICk7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gSENGX1NVQ0NFU1M7CisJfQorCWhjZl9zdGF0dXMgPSBoY2ZfY250bCggJmxwLT5oY2ZDdHgsIEhDRl9DTlRMX0RJU0NPTk5FQ1QgKTsKKwlpZiAoIGhjZl9zdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCWxwLT5wb3J0U3RhdGUgPSBXVkxBTl9QT1JUX1NUQVRFX0VOQUJMRUQ7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9kaXNjb25uZWN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9kaXNhYmxlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBkaXNhYmxlIE1BQyBwb3J0cworICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgICAgICAtIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqICAgICAgcG9ydCAgICAtIHRoZSBNQUMgcG9ydCB0byBkaXNhYmxlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2Rpc2FibGUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50IGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF9kaXNhYmxlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYgKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIk5vIGFjdGlvbjogUG9ydCBzdGF0ZSBpcyBkaXNhYmxlZFxuIiApOworCX0gZWxzZSB7CisJCWhjZl9zdGF0dXMgPSBoY2ZfY250bCggJmxwLT5oY2ZDdHgsIEhDRl9DTlRMX0RJU0FCTEUgKTsKKwkJaWYgKCBoY2Zfc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJLyogU2V0IHRoZSBzdGF0dXMgb2YgdGhlIHBvcnQgdG8gZGlzYWJsZWQgKi8gLy87P2JhZCBtbmVtb25pYyB1c2UgTklDIGlzbyBQT1JUCisJCQlscC0+cG9ydFN0YXRlID0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRDsKKworI2lmZGVmIEVOQUJMRV9ETUEKKwkJCWlmICggbHAtPnVzZV9kbWEgKSB7CisJCQkJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSggbHAgKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCWlmICggaGNmX3N0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiZmFpbGVkOiAweCV4XG4iLCBoY2Zfc3RhdHVzICk7CisJfQorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBoY2Zfc3RhdHVzOworfSAvLyB3bF9kaXNhYmxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNpZmRlZiBVU0VfV0RTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZGlzYWJsZV93ZHNfcG9ydHMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIGRpc2FibGUgdGhlIFdEUyBNQUMgcG9ydHMgMS02CisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfZGlzYWJsZV93ZHNfcG9ydHMoIHN0cnVjdCB3bF9wcml2YXRlICogbHAgKQoreworCisJREJHX0ZVTkMoICJ3bF9kaXNhYmxlX3dkc19wb3J0cyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICl7CisJCURCR19FUlJPUiggRGJnSW5mbywgIiEhISE7PyBzb21lb25lIG1pc3VuZGVyc3Rvb2Qgc29tZXRoaW5nICEhISEhXG4iICk7CisJfQorLy8gCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfMSApOworLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfMiApOworLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfMyApOworLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfNCApOworLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfNSApOworLy8gCQl3bF9kaXNhYmxlKCBscCwgSENGX1BPUlRfNiApOworLy8gCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX2Rpc2FibGVfd2RzX3BvcnRzCisjZW5kaWYgLy8gVVNFX1dEUworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjaWZuZGVmIFVTRV9NQk9YX1NZTkMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9tYngoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGFuZCBwcm9jZXNzIGEgbWFpbGJveCBtZXNzYWdlLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBhbiBIQ0Ygc3RhdHVzIGNvZGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX21ieCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX21ieCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJNYWlsYm94IEluZm86IElGQl9NQkluZm9MZW46ICVkXG4iLAorCQkJICAgbHAtPmhjZkN0eC5JRkJfTUJJbmZvTGVuICk7CisKKwltZW1zZXQoICYoIGxwLT5sdHZSZWNvcmQgKSwgMCwgc2l6ZW9mKCBsdHZfdCApKTsKKworCWxwLT5sdHZSZWNvcmQubGVuID0gTUJfU0laRTsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19NQl9JTkZPOworCWhjZl9zdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJaWYgKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJoY2ZfZ2V0X2luZm8gcmV0dXJuZWQgMHgleFxuIiwgaGNmX3N0YXR1cyApOworCisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gaGNmX3N0YXR1czsKKwl9CisKKwlpZiAoIGxwLT5sdHZSZWNvcmQudHlwID09IENGR19NQl9JTkZPICkgeworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIGhjZl9zdGF0dXM7CisJfQorCS8qIEVuZGlhbiB0cmFuc2xhdGUgdGhlIG1haWxib3ggZGF0YSwgdGhlbiBwcm9jZXNzIHRoZSBtZXNzYWdlICovCisJd2xfZW5kaWFuX3RyYW5zbGF0ZV9tYWlsYm94KCAmKCBscC0+bHR2UmVjb3JkICkpOworCXdsX3Byb2Nlc3NfbWFpbGJveCggbHAgKTsKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaGNmX3N0YXR1czsKK30gLy8gd2xfbWJ4CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3goKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSB0aGUgdGVkaW91cyB0YXNrIG9mIGVuZGlhbiB0cmFuc2xhdGluZyBhbGwKKyAqICBmaWVsZHMgd2l0aHRpbiBhIG1haWxib3ggbWVzc2FnZSB3aGljaCBuZWVkIHRyYW5zbGF0aW5nLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHR2IC0gcG9pbnRlciB0byB0aGUgTFRWIHRvIGVuZGlhbiB0cmFuc2xhdGUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIG5vbmUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3goIGx0dl90ICpsdHYgKQoreworCisJREJHX0ZVTkMoICJ3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3giICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJc3dpdGNoKCBsdHYtPnR5cCApIHsKKwkgIGNhc2UgQ0ZHX1RBTExJRVM6CisJCWJyZWFrOworCisJICBjYXNlIENGR19TQ0FOOgorCQl7CisJCQlpbnQgbnVtX2FwczsKKwkJCVNDQU5fUlNfU1RSQ1QgKmFwcyA9IChTQ0FOX1JTX1NUUkNUICopJmx0di0+dS51OFswXTsKKworCQkJbnVtX2FwcyA9IChoY2ZfMTYpKCggKHNpemVfdCkobHR2LT5sZW4gLSAxICkgKiAyICkgLworCQkJCQkJCQkgKCBzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSkpOworCisJCQl3aGlsZSggbnVtX2FwcyA+PSAxICkgeworCQkJCW51bV9hcHMtLTsKKworCQkJCWFwc1tudW1fYXBzXS5jaGFubmVsX2lkID0KKwkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5jaGFubmVsX2lkICk7CisKKwkJCQlhcHNbbnVtX2Fwc10ubm9pc2VfbGV2ZWwgPQorCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLm5vaXNlX2xldmVsICk7CisKKwkJCQlhcHNbbnVtX2Fwc10uc2lnbmFsX2xldmVsID0KKwkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5zaWduYWxfbGV2ZWwgKTsKKworCQkJCWFwc1tudW1fYXBzXS5iZWFjb25faW50ZXJ2YWxfdGltZSA9CisJCQkJCUNOVl9MSVRUTEVfVE9fSU5UKCBhcHNbbnVtX2Fwc10uYmVhY29uX2ludGVydmFsX3RpbWUgKTsKKworCQkJCWFwc1tudW1fYXBzXS5jYXBhYmlsaXR5ID0KKwkJCQkJQ05WX0xJVFRMRV9UT19JTlQoIGFwc1tudW1fYXBzXS5jYXBhYmlsaXR5ICk7CisKKwkJCQlhcHNbbnVtX2Fwc10uc3NpZF9sZW4gPQorCQkJCQlDTlZfTElUVExFX1RPX0lOVCggYXBzW251bV9hcHNdLnNzaWRfbGVuICk7CisKKwkJCQlhcHNbbnVtX2Fwc10uc3NpZF92YWxbYXBzW251bV9hcHNdLnNzaWRfbGVuXSA9IDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX0FDU19TQ0FOOgorCQl7CisJCQlQUk9CRV9SRVNQICpwcm9iZV9yZXNwID0gKFBST0JFX1JFU1AgKilsdHY7CisKKwkJCXByb2JlX3Jlc3AtPmZyYW1lQ29udHJvbCAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmZyYW1lQ29udHJvbCApOworCQkJcHJvYmVfcmVzcC0+ZHVySUQgICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZHVySUQgKTsKKwkJCXByb2JlX3Jlc3AtPnNlcXVlbmNlICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPnNlcXVlbmNlICk7CisJCQlwcm9iZV9yZXNwLT5kYXRhTGVuZ3RoICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5kYXRhTGVuZ3RoICk7CisjaWZuZGVmIFdBUlAKKwkJCXByb2JlX3Jlc3AtPmxlblR5cGUgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmxlblR5cGUgKTsKKyNlbmRpZiAvLyBXQVJQCisJCQlwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCApOworCQkJcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSApOworCQkJcHJvYmVfcmVzcC0+ZmxhZ3MgICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZmxhZ3MgKTsKKwkJfQorCQlicmVhazsKKworCSAgY2FzZSBDRkdfTElOS19TVEFUOgorI2RlZmluZSBscyAoKExJTktfU1RBVFVTX1NUUkNUICopbHR2KQorCQkJbHMtPmxpbmtTdGF0dXMgPSBDTlZfTElUVExFX1RPX0lOVCggbHMtPmxpbmtTdGF0dXMgKTsKKwkJYnJlYWs7CisjdW5kZWYgbHMKKworCSAgY2FzZSBDRkdfQVNTT0NfU1RBVDoKKwkJeworCQkJQVNTT0NfU1RBVFVTX1NUUkNUICphcyA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKilsdHY7CisKKwkJCWFzLT5hc3NvY1N0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBhcy0+YXNzb2NTdGF0dXMgKTsKKwkJfQorCQlicmVhazsKKworCSAgY2FzZSBDRkdfU0VDVVJJVFlfU1RBVDoKKwkJeworCQkJU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpzcyA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKilsdHY7CisKKwkJCXNzLT5zZWN1cml0eVN0YXR1cyAgPSBDTlZfTElUVExFX1RPX0lOVCggc3MtPnNlY3VyaXR5U3RhdHVzICk7CisJCQlzcy0+cmVhc29uICAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHNzLT5yZWFzb24gKTsKKwkJfQorCQlicmVhazsKKworCSAgY2FzZSBDRkdfV01QOgorCQlicmVhazsKKworCSAgY2FzZSBDRkdfTlVMTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX2VuZGlhbl90cmFuc2xhdGVfbWFpbGJveAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Byb2Nlc3NfbWFpbGJveCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9jZXNzIHRoZSBtYWlsYm94IGRhdGEuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBsdHYgLSBwb2ludGVyIHRvIHRoZSBMVFYgdG8gYmUgcHJvY2Vzc2VkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgbm9uZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3Byb2Nlc3NfbWFpbGJveCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlsdHZfdCAgICpsdHY7CisJaGNmXzE2ICBsdHZfdmFsID0gMHhGRkZGOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndsX3Byb2Nlc3NfbWFpbGJveCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlsdHYgPSAmKCBscC0+bHR2UmVjb3JkICk7CisKKwlzd2l0Y2goIGx0di0+dHlwICkgeworCisJICBjYXNlIENGR19UQUxMSUVTOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfVEFMTElFU1xuIiApOworCQlicmVhazsKKwkgIGNhc2UgQ0ZHX1NDQU46CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TQ0FOXG4iICk7CisKKwkJeworCQkJaW50IG51bV9hcHM7CisJCQlTQ0FOX1JTX1NUUkNUICphcHMgPSAoU0NBTl9SU19TVFJDVCAqKSZsdHYtPnUudThbMF07CisKKwkJCW51bV9hcHMgPSAoaGNmXzE2KSgoIChzaXplX3QpKGx0di0+bGVuIC0gMSApICogMiApIC8KKwkJCQkJCQkJICggc2l6ZW9mKCBTQ0FOX1JTX1NUUkNUICkpKTsKKworCQkJbHAtPnNjYW5fcmVzdWx0cy5udW1fYXBzID0gbnVtX2FwczsKKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTnVtYmVyIG9mIEFQczogJWRcbiIsIG51bV9hcHMgKTsKKworCQkJd2hpbGUoIG51bV9hcHMgPj0gMSApIHsKKwkJCQludW1fYXBzLS07CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBUCAgICAgICAgICAgICAgOiAlZFxuIiwgbnVtX2FwcyApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIj09PT09PT09PT09PT09PT09PT09PT09PT1cbiIgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDaGFubmVsIElEICAgICAgOiAweCUwNHhcbiIsCisJCQkJCQkgICBhcHNbbnVtX2Fwc10uY2hhbm5lbF9pZCApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIk5vaXNlIExldmVsICAgICA6IDB4JTA0eFxuIiwKKwkJCQkJCSAgIGFwc1tudW1fYXBzXS5ub2lzZV9sZXZlbCApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNpZ25hbCBMZXZlbCAgICA6IDB4JTA0eFxuIiwKKwkJCQkJCSAgIGFwc1tudW1fYXBzXS5zaWduYWxfbGV2ZWwgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJCZWFjb24gSW50ZXJ2YWwgOiAweCUwNHhcbiIsCisJCQkJCQkgICBhcHNbbnVtX2Fwc10uYmVhY29uX2ludGVydmFsX3RpbWUgKTsKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDYXBhYmlsaXR5ICAgICAgOiAweCUwNHhcbiIsCisJCQkJCQkgICBhcHNbbnVtX2Fwc10uY2FwYWJpbGl0eSApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNTSUQgTGVuZ3RoICAgICA6IDB4JTA0eFxuIiwKKwkJCQkJCSAgIGFwc1tudW1fYXBzXS5zc2lkX2xlbiApOworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkJTU0lEICAgICAgICAgICA6ICVzXG4iLAorCQkJCQkJICAgRGJnSHdBZGRyKCBhcHNbbnVtX2Fwc10uYnNzaWQgKSk7CisKKwkJCQlpZiAoIGFwc1tudW1fYXBzXS5zc2lkX2xlbiAhPSAwICkgeworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTU0lEICAgICAgICAgICAgOiAlcy5cbiIsCisJCQkJCQkJICAgYXBzW251bV9hcHNdLnNzaWRfdmFsICk7CisJCQkJfSBlbHNlIHsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU1NJRCAgICAgICAgICAgIDogJXMuXG4iLCAiQU5ZIiApOworCQkJCX0KKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlxuIiApOworCisJCQkJLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUKKwkJCQkgICBhZGFwdGVyIHN0cnVjdCAqLworCQkJCW1lbWNweSggJiggbHAtPnNjYW5fcmVzdWx0cy5BUFRhYmxlW251bV9hcHNdKSwgJiggYXBzW251bV9hcHNdICksCisJCQkJCQlzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSk7CisJCQl9CisKKwkJCS8qIFNldCBzY2FuIHJlc3VsdCB0byB0cnVlIHNvIHRoYXQgYW55IHNjYW4gcmVxdWVzdHMgd2lsbAorCQkJICAgY29tcGxldGUgKi8KKwkJCWxwLT5zY2FuX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IFRSVUU7CisJCX0KKworCQlicmVhazsKKwkgIGNhc2UgQ0ZHX0FDU19TQ0FOOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQUNTX1NDQU5cbiIgKTsKKworCQl7CisJCQlQUk9CRV9SRVNQICAqcHJvYmVfcnNwID0gKFBST0JFX1JFU1AgKilsdHY7CisJCQloY2ZfOCAgICAgICAqd3BhX2llID0gTlVMTDsKKwkJCWhjZl8xNiAgICAgIHdwYV9pZV9sZW4gPSAwOworCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpID09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsCisJCQkJCSAgIGxwLT5kZXYtPm5hbWUgKTsKKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBsZW5ndGggICAgICA6IDB4JTA0eC5cbiIsCisJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+bGVuZ3RoICk7CisKKwkJCWlmICggcHJvYmVfcnNwLT5sZW5ndGggPiAxICkgeworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgaW5mb1R5cGUgICAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5pbmZvVHlwZSApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWduYWwgICAgICA6IDB4JTAyeC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnNpZ25hbCApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBzaWxlbmNlICAgICA6IDB4JTAyeC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPnNpbGVuY2UgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgcnhGbG93ICAgICAgOiAweCUwMnguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5yeEZsb3cgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgcmF0ZSAgICAgICAgOiAweCUwMnguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5yYXRlICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGZyYW1lIGNudGwgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZnJhbWVDb250cm9sICk7CisKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGR1cklEICAgICAgIDogMHglMDR4LlxuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+ZHVySUQgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczEgICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzMSApKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYWRkcmVzczIgICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzMiApKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgQlNTSUQgICAgICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT5CU1NJRCApKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2VxdWVuY2UgICAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5zZXF1ZW5jZSApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzNCAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPmFkZHJlc3M0ICkpOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkYXRhbGVuZ3RoICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmRhdGFMZW5ndGggKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgREEgICAgICAgICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT5EQSApKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgU0EgICAgICAgICAgOiAlc1xuIiwKKwkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIERiZ0h3QWRkciggcHJvYmVfcnNwLT5TQSApKTsKKworCQkJCS8vREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBsZW5UeXBlICAgICA6IDB4JTA0eC5cbiIsCisJCQkJLy8gICAgICAgICAgIGxwLT5kZXYtPm5hbWUsIHByb2JlX3JzcC0+bGVuVHlwZSApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSB0aW1lU3RhbXAgICA6ICVzXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPnRpbWVTdGFtcCApKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgYmVhY29uSW50ICAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5iZWFjb25JbnRlcnZhbCApOworCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBjYXBhYmlsaXR5ICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmNhcGFiaWxpdHkgKTsKKworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCBsZW4gICAgOiAweCUwNHguXG4iLAorCQkJCQkJICAgbHAtPmRldi0+bmFtZSwgcHJvYmVfcnNwLT5yYXdEYXRhWzFdICk7CisKKwkJCQlpZiAoIHByb2JlX3JzcC0+cmF3RGF0YVsxXSA+IDAgKSB7CisJCQkJCWNoYXIgc3NpZFtIQ0ZfTUFYX05BTUVfTEVOXTsKKworCQkJCQltZW1zZXQoIHNzaWQsIDAsIHNpemVvZiggc3NpZCApKTsKKwkJCQkJc3RybmNweSggc3NpZCwgJnByb2JlX3JzcC0+cmF3RGF0YVsyXSwKKwkJCQkJCQkgcHJvYmVfcnNwLT5yYXdEYXRhWzFdICk7CisKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTU0lEICAgICAgICA6ICVzXG4iLAorCQkJCQkJCSAgIGxwLT5kZXYtPm5hbWUsIHNzaWQgKTsKKwkJCQl9CisKKwkJCQkvKiBQYXJzZSBvdXQgdGhlIFdQQS1JRSwgaWYgb25lIGV4aXN0cyAqLworCQkJCXdwYV9pZSA9IHdsX3BhcnNlX3dwYV9pZSggcHJvYmVfcnNwLCAmd3BhX2llX2xlbiApOworCQkJCWlmICggd3BhX2llICE9IE5VTEwgKSB7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIiglcykgV1BBLUlFICAgICAgOiAlc1xuIiwKKwkJCQkJbHAtPmRldi0+bmFtZSwgd2xfcHJpbnRfd3BhX2llKCB3cGFfaWUsIHdwYV9pZV9sZW4gKSk7CisJCQkJfQorCisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBmbGFncyAgICAgICA6IDB4JTA0eC5cbiIsCisJCQkJCQkgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmZsYWdzICk7CisJCQl9CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIlxuXG4iICk7CisJCQkvKiBJZiBwcm9iZSByZXNwb25zZSBsZW5ndGggaXMgMSwgdGhlbiB0aGUgc2NhbiBpcyBjb21wbGV0ZSAqLworCQkJaWYgKCBwcm9iZV9yc3AtPmxlbmd0aCA9PSAxICkgeworCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNDQU4gQ09NUExFVEVcbiIgKTsKKwkJCQlscC0+cHJvYmVfcmVzdWx0cy5udW1fYXBzID0gbHAtPnByb2JlX251bV9hcHM7CisJCQkJbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IFRSVUU7CisKKwkJCQkvKiBSZXNldCB0aGUgY291bnRlciBmb3IgdGhlIG5leHQgc2NhbiByZXF1ZXN0ICovCisJCQkJbHAtPnByb2JlX251bV9hcHMgPSAwOworCisJCQkJLyogU2VuZCBhIHdpcmVsZXNzIGV4dGVuc2lvbnMgZXZlbnQgdGhhdCB0aGUgc2NhbiBjb21wbGV0ZWQgKi8KKwkJCQl3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUoIGxwLT5kZXYgKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogT25seSBjb3B5IHRvIHRoZSB0YWJsZSBpZiB0aGUgZW50cnkgaXMgdW5pcXVlOyBBUHMgc29tZXRpbWVzCisJCQkJICAgcmVzcG9uZCBtb3JlIHRoYW4gb25jZSB0byBhIHByb2JlICovCisJCQkJaWYgKCBscC0+cHJvYmVfbnVtX2FwcyA9PSAwICkgeworCQkJCQkvKiBDb3B5IHRoZSBpbmZvIHRvIHRoZSBTY2FuUmVzdWx0IHN0cnVjdHVyZSBpbiB0aGUgcHJpdmF0ZQorCQkJCQlhZGFwdGVyIHN0cnVjdCAqLworCQkJCQltZW1jcHkoICYoIGxwLT5wcm9iZV9yZXN1bHRzLlByb2JlVGFibGVbbHAtPnByb2JlX251bV9hcHNdICksCisJCQkJCQkJcHJvYmVfcnNwLCBzaXplb2YoIFBST0JFX1JFU1AgKSk7CisKKwkJCQkJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgQVBzIGRldGVjdGVkICovCisJCQkJCWxwLT5wcm9iZV9udW1fYXBzKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGNvdW50OworCQkJCQlpbnQgdW5pcXVlID0gMTsKKworCQkJCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCBscC0+cHJvYmVfbnVtX2FwczsgY291bnQrKyApIHsKKwkJCQkJCWlmICggbWVtY21wKCAmKCBwcm9iZV9yc3AtPkJTU0lEICksCisJCQkJCQkJbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtjb3VudF0uQlNTSUQsCisJCQkJCQkJRVRIX0FMRU4gKSA9PSAwICkgeworCQkJCQkJCXVuaXF1ZSA9IDA7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoIHVuaXF1ZSApIHsKKwkJCQkJCS8qIENvcHkgdGhlIGluZm8gdG8gdGhlIFNjYW5SZXN1bHQgc3RydWN0dXJlIGluIHRoZQorCQkJCQkJcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdC4gT25seSBjb3B5IGlmIHRoZXJlJ3Mgcm9vbSBpbiB0aGUKKwkJCQkJCXRhYmxlICovCisJCQkJCQlpZiAoIGxwLT5wcm9iZV9udW1fYXBzIDwgTUFYX05BUFMgKQorCQkJCQkJeworCQkJCQkJCW1lbWNweSggJiggbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtscC0+cHJvYmVfbnVtX2Fwc10gKSwKKwkJCQkJCQkJCXByb2JlX3JzcCwgc2l6ZW9mKCBQUk9CRV9SRVNQICkpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiTnVtIG9mIHNjYW4gcmVzdWx0cyBleGNlZWRzIHN0b3JhZ2UsIHRydW5jYXRpbmdcbiIgKTsKKwkJCQkJCX0KKworCQkJCQkJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgQVBzIGRldGVjdGVkLiBOb3RlIEkgZG8gdGhpcworCQkJCQkJICAgaGVyZSBldmVuIHdoZW4gSSBkb24ndCBjb3B5IHRoZSBwcm9iZSByZXNwb25zZSB0byB0aGUKKwkJCQkJCSAgIGJ1ZmZlciBpbiBvcmRlciB0byBkZXRlY3QgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiAqLworCQkJCQkJbHAtPnByb2JlX251bV9hcHMrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWJyZWFrOworCisJICBjYXNlIENGR19MSU5LX1NUQVQ6CisjZGVmaW5lIGxzICgoTElOS19TVEFUVVNfU1RSQ1QgKilsdHYpCisJCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19MSU5LX1NUQVRcbiIgKTsKKworCQlzd2l0Y2goIGxzLT5saW5rU3RhdHVzICkgeworCQkgIGNhc2UgMToKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQ29ubmVjdGVkXG4iICk7CisJCQl3bF93ZXh0X2V2ZW50X2FwKCBscC0+ZGV2ICk7CisJCQlicmVhazsKKworCQkgIGNhc2UgMjoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogRGlzY29ubmVjdGVkXG4iICApOworCQkJYnJlYWs7CisKKwkJICBjYXNlIDM6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMaW5rIFN0YXR1cyA6IEFjY2VzcyBQb2ludCBDaGFuZ2VcbiIgKTsKKwkJCWJyZWFrOworCisJCSAgY2FzZSA0OgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBBY2Nlc3MgUG9pbnQgT3V0IG9mIFJhbmdlXG4iICk7CisJCQlicmVhazsKKworCQkgIGNhc2UgNToKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQWNjZXNzIFBvaW50IEluIFJhbmdlXG4iICk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBVTktOT1dOICgweCUwNHgpXG4iLAorCQkJCQkgICBscy0+bGlua1N0YXR1cyApOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKyN1bmRlZiBscworCisJICBjYXNlIENGR19BU1NPQ19TVEFUOgorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfQVNTT0NfU1RBVFxuIiApOworCisJCXsKKwkJCUFTU09DX1NUQVRVU19TVFJDVCAqYXMgPSAoQVNTT0NfU1RBVFVTX1NUUkNUICopbHR2OworCisJCQlzd2l0Y2goIGFzLT5hc3NvY1N0YXR1cyApIHsKKwkJCSAgY2FzZSAxOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBBc3NvY2lhdGVkXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCSAgY2FzZSAyOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkFzc29jaWF0aW9uIFN0YXR1cyA6IFNUQSBSZWFzc29jaWF0ZWRcbiIgKTsKKwkJCQlicmVhazsKKworCQkJICBjYXNlIDM6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIERpc2Fzc29jaWF0ZWRcbiIgKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBVTktOT1dOICgweCUwNHgpXG4iLAorCQkJCQkJICAgYXMtPmFzc29jU3RhdHVzICk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIlNUQSBBZGRyZXNzICAgICAgICA6ICVzXG4iLAorCQkJCQkgICBEYmdId0FkZHIoIGFzLT5zdGFBZGRyICkpOworCisJCQlpZiAoKCBhcy0+YXNzb2NTdGF0dXMgPT0gMiApICAmJiAoIGFzLT5sZW4gPT0gOCApKSB7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiT2xkIEFQIEFkZHJlc3MgICAgIDogJXNcbiIsCisJCQkJCQkgICBEYmdId0FkZHIoIGFzLT5vbGRBcEFkZHIgKSk7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCSAgY2FzZSBDRkdfU0VDVVJJVFlfU1RBVDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NFQ1VSSVRZX1NUQVRcbiIgKTsKKworCQl7CisJCQlTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKnNzID0gKFNFQ1VSSVRZX1NUQVRVU19TVFJDVCAqKWx0djsKKworCQkJc3dpdGNoKCBzcy0+c2VjdXJpdHlTdGF0dXMgKSB7CisJCQkgIGNhc2UgMToKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBEaXNzYXNzb2NpYXRlIFtBUF1cbiIgKTsKKwkJCQlicmVhazsKKworCQkJICBjYXNlIDI6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGVhdXRoZW50aWNhdGUgW0FQXVxuIiApOworCQkJCWJyZWFrOworCisJCQkgIGNhc2UgMzoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTZWN1cml0eSBTdGF0dXMgOiBBdXRoZW50aWNhdGUgRmFpbCBbU1RBXSBvciBbQVBdXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCSAgY2FzZSA0OgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IE1JQyBGYWlsXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCSAgY2FzZSA1OgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEFzc29jaWF0ZSBGYWlsXG4iICk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogVU5LTk9XTiAlZFxuIiwKKwkJCQkJCSAgIHNzLT5zZWN1cml0eVN0YXR1cyApOworCQkJCWJyZWFrOworCQkJfQorCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgOiAlc1xuIiwgRGJnSHdBZGRyKCBzcy0+c3RhQWRkciApKTsKKworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUmVhc29uICAgICAgICAgIDogMHglMDR4IFxuIiwgc3MtPnJlYXNvbiApOworCQl9CisKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX1dNUDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1dNUCwgc2l6ZSBpcyAlZCBieXRlc1xuIiwgbHR2LT5sZW4gKTsKKwkJeworCQkJV01QX1JTUF9TVFJDVCAqd21wX3JzcCA9IChXTVBfUlNQX1NUUkNUICopbHR2OworCisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJDRkdfV01QLCBwZHUgdHlwZSBpcyAweCV4XG4iLAorCQkJCQkgICB3bXBfcnNwLT53bXBSc3Aud21wSGRyLnR5cGUgKTsKKworCQkJc3dpdGNoKCB3bXBfcnNwLT53bXBSc3Aud21wSGRyLnR5cGUgKSB7CisJCQkgIGNhc2UgV1ZMQU5fV01QX1BEVV9UWVBFX0xUX1JTUDoKKwkJCQl7CisjaWYgREJHCisJCQkJCUxJTktURVNUX1JTUF9TVFJDVCAgKmx0X3JzcCA9IChMSU5LVEVTVF9SU1BfU1RSQ1QgKilsdHY7CisjZW5kaWYgLy8gREJHCisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIkxJTksgVEVTVCBSRVNVTFRcbiIgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiPT09PT09PT09PT09PT09PVxuIiApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJMZW5ndGggICAgICAgIDogJWQuXG4iLCAgICAgbHRfcnNwLT5sZW4gKTsKKworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJOYW1lICAgICAgICAgIDogJXMuXG4iLCAgICAgbHRfcnNwLT5sdFJzcC5sdFJzcC5uYW1lICk7CisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlNpZ25hbCBMZXZlbCAgOiAweCUwMnguXG4iLCBsdF9yc3AtPmx0UnNwLmx0UnNwLnNpZ25hbCApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJOb2lzZSAgTGV2ZWwgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5ub2lzZSApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJSZWNlaXZlIEZsb3cgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5yeEZsb3cgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRGF0YSBSYXRlICAgICA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3AuZGF0YVJhdGUgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUHJvdG9jb2wgICAgICA6IDB4JTA0eC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3AucHJvdG9jb2wgKTsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiU3RhdGlvbiAgICAgICA6IDB4JTAyeC5cbiIsIGx0X3JzcC0+bHRSc3AubHRSc3Auc3RhdGlvbiApOworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJEYXRhIFJhdGUgQ2FwIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5kYXRhUmF0ZUNhcCApOworCisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlBvd2VyIE1nbXQgICAgOiAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnguXG4iLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnBvd2VyTWdtdFswXSwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5wb3dlck1nbXRbMV0sCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3AucG93ZXJNZ210WzJdLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnBvd2VyTWdtdFszXSApOworCisJCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlJvYnVzdG5lc3MgICAgOiAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnguXG4iLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnJvYnVzdG5lc3NbMF0sCisJCQkJCQkJCWx0X3JzcC0+bHRSc3AubHRSc3Aucm9idXN0bmVzc1sxXSwKKwkJCQkJCQkJbHRfcnNwLT5sdFJzcC5sdFJzcC5yb2J1c3RuZXNzWzJdLAorCQkJCQkJCQlsdF9yc3AtPmx0UnNwLmx0UnNwLnJvYnVzdG5lc3NbM10gKTsKKworCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTY2FsaW5nICAgICAgIDogMHglMDJ4LlxuIiwgbHRfcnNwLT5sdFJzcC5sdFJzcC5zY2FsaW5nICk7CisJCQkJfQorCisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlicmVhazsKKworCSAgY2FzZSBDRkdfTlVMTDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX05VTExcbiIgKTsKKwkJYnJlYWs7CisKKwkgIGNhc2UgQ0ZHX1VQREFURURfSU5GT19SRUNPUkQ6ICAgICAgICAvLyBVcGRhdGVkIEluZm9ybWF0aW9uIFJlY29yZAorCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVUERBVEVEIElORk9STUFUSU9OIFJFQ09SRFxuIiApOworCisJCWx0dl92YWwgPSBDTlZfSU5UX1RPX0xJVFRMRSggbHR2LT51LnUxNlswXSApOworCisJCS8qIENoZWNrIGFuZCBzZWUgd2hpY2ggUklEIHdhcyB1cGRhdGVkICovCisJCXN3aXRjaCggbHR2X3ZhbCApIHsKKwkJICBjYXNlIENGR19DVVJfQ09VTlRSWV9JTkZPOiAgLy8gSW5kaWNhdGUgUGFzc2l2ZSBTY2FuIENvbXBsZXRpb24KKwkJCURCR19UUkFDRSggRGJnSW5mbywgIlVwZGF0ZWQgY291bnRyeSBpbmZvXG4iICk7CisKKwkJCS8qIERvIEkgbmVlZCB0byBob2xkIG9mZiBvbiB1cGRhdGluZyBSSURzIHVudGlsIHRoZSBwcm9jZXNzIGlzCisJCQkgICBjb21wbGV0ZT8gKi8KKwkJCXdsX2Nvbm5lY3QoIGxwICk7CisJCQlicmVhazsKKworCQkgIGNhc2UgQ0ZHX1BPUlRfU1RBVDogICAgLy8gV2FpdCBmb3IgQ29ubmVjdCBFdmVudAorCQkJLy93bF9jb25uZWN0KCBscCApOworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJVbmtub3duIFJJRDogMHglMDR4XG4iLCBsdHZfdmFsICk7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCURCR19UUkFDRSggRGJnSW5mbywgIlVOS05PV04gTUVTU0FHRTogMHglMDR4XG4iLCBsdHYtPnR5cCApOworCQlicmVhazsKKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF9wcm9jZXNzX21haWxib3gKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgIC8qIGlmbmRlZiBVU0VfTUJPWF9TWU5DICovCisKKyNpZmRlZiBVU0VfV0RTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGRldl9yZWdpc3RlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIG5ldF9kZXZpY2Ugc3RydWN0dXJlcyB3aXRoIHRoZSBzeXN0ZW0ncyBuZXR3b3JrCisgKiAgICAgIGxheWVyIGZvciB1c2Ugd2l0aCB0aGUgV0RTIHBvcnRzLgorICoKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBjb3VudDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCS8vOz93aHkgaXMgdGhlcmUgbm8gVVNFX1dEUyBjbGF1c2UgbGlrZSBpbiB3bF9lbmFibGVfd2RzX3BvcnRzCisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCWZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisJCQlpZiAoIFdWTEFOX1ZBTElEX01BQ19BRERSRVNTKCBscC0+d2RzX3BvcnRbY291bnRdLndkc0FkZHJlc3MgKSkgeworCQkJCWlmICggcmVnaXN0ZXJfbmV0ZGV2KCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApICE9IDAgKSB7CisJCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAibmV0IGRldmljZSBmb3IgV0RTIHBvcnQgJWQgY291bGQgbm90IGJlIHJlZ2lzdGVyZWRcbiIsCisJCQkJCQkJCSggY291bnQgKyAxICkpOworCQkJCX0KKwkJCQlscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgPSBUUlVFOworCisJCQkJLyogRmlsbCBvdXQgdGhlIG5ldF9kZXZpY2Ugc3RydWN0cyB3aXRoIHRoZSBNQUMgYWRkciAqLworCQkJCW1lbWNweSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYtPmRldl9hZGRyLCBscC0+TUFDQWRkcmVzcywgRVRIX0FMRU4gKTsKKwkJCQlscC0+d2RzX3BvcnRbY291bnRdLmRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKKwkJCX0KKwkJfQorCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHdsX3dkc19uZXRkZXZfcmVnaXN0ZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRkZXZfZGVyZWdpc3RlcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZGVyZWdpc3RlcnMgdGhlIFdEUyBuZXRfZGV2aWNlIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUKKyAqICAgICAgc3lzdGVtJ3MgbmV0d29yayBsYXllci4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgICAgIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBjb3VudDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJREJHX0ZVTkMoICJ3bF93ZHNfbmV0ZGV2X2RlcmVnaXN0ZXIiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisJaWYgKCBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUCAgKSB7CisJCWZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisJCQlpZiAoIFdWTEFOX1ZBTElEX01BQ19BRERSRVNTKCBscC0+d2RzX3BvcnRbY291bnRdLndkc0FkZHJlc3MgKSkgeworCQkJCXVucmVnaXN0ZXJfbmV0ZGV2KCBscC0+d2RzX3BvcnRbY291bnRdLmRldiApOworCQkJfQorCQkJbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkID0gRkFMU0U7CisJCX0KKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworfSAvLyB3bF93ZHNfbmV0ZGV2X2RlcmVnaXN0ZXIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworCisjaWYgMCAvL1NDVUxMX1VTRV9QUk9DIC8qIGRvbid0IHdhc3RlIHNwYWNlIGlmIHVudXNlZCAqLworLyoKKyAqIFRoZSBwcm9jIGZpbGVzeXN0ZW06IGZ1bmN0aW9uIHRvIHJlYWQgYW5kIGVudHJ5CisgKi8KK2ludCBwcmludGZfaGNmXzE2KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl8xNiogcCwgaW50IG4gKTsKK2ludCBwcmludGZfaGNmXzE2KCBjaGFyICpzLCBjaGFyICpidWYsIGhjZl8xNiogcCwgaW50IG4gKSB7CisKK2ludCBpLCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVzIiwgcyApOworCXdoaWxlICggbGVuIDwgMjAgKSBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICIgKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCI6ICIgKTsKKwlmb3IgKCBpID0gMDsgaSA8IG47IGkrKyApIHsKKwkJaWYgKCBsZW4gJSA4MCA+IDc1ICkgeworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CisJCX0KKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiJTA0WCAiLCBwW2ldICk7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOworCXJldHVybiBsZW47Cit9IC8vIHByaW50Zl9oY2ZfMTYKKworaW50IHByaW50Zl9oY2ZfOCggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfOCogcCwgaW50IG4gKTsKK2ludCBwcmludGZfaGNmXzgoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzgqIHAsIGludCBuICkgeworCitpbnQgaSwgbGVuOworCisJbGVuID0gc3ByaW50ZihidWYsICIlcyIsIHMgKTsKKwl3aGlsZSAoIGxlbiA8IDIwICkgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAiICk7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiOiAiICk7CisJZm9yICggaSA9IDA7IGkgPD0gbjsgaSsrICkgeworCQlpZiAoIGxlbiAlIDgwID4gNzcgKSB7CisJCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJcbiIgKTsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIlMDJYICIsIHBbaV0gKTsKKwl9CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CisJcmV0dXJuIGxlbjsKK30gLy8gcHJpbnRmX2hjZjgKKworaW50IHByaW50Zl9zdHJjdCggY2hhciAqcywgY2hhciAqYnVmLCBoY2ZfMTYqIHAgKTsKK2ludCBwcmludGZfc3RyY3QoIGNoYXIgKnMsIGNoYXIgKmJ1ZiwgaGNmXzE2KiBwICkgeworCitpbnQgaSwgbGVuOworCisJbGVuID0gc3ByaW50ZihidWYsICIlcyIsIHMgKTsKKwl3aGlsZSAoIGxlbiA8IDIwICkgbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAiICk7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiOiAiICk7CisJZm9yICggaSA9IDA7IGkgPD0gKnA7IGkrKyApIHsKKwkJaWYgKCBsZW4gJSA4MCA+IDc1ICkgeworCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiXG4iICk7CisJCX0KKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwiJTA0WCAiLCBwW2ldICk7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlxuIiApOworCXJldHVybiBsZW47Cit9IC8vIHByaW50Zl9zdHJjdAorCitpbnQgc2N1bGxfcmVhZF9wcm9jbWVtKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW4sIGludCAqZW9mLCB2b2lkICpkYXRhICkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZQkqbHAgPSBOVUxMOworCUlGQlAJCQkJaWZicDsKKyAgIAlDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKnA7CisKKyAgICAjZGVmaW5lIExJTUlUIChQQUdFX1NJWkUtODApIC8qIGRvbid0IHByaW50IGFueSBtb3JlIGFmdGVyIHRoaXMgc2l6ZSAqLworCisgICAgbGVuPTA7CisKKwlpZiAoICggbHAgPSAoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSktPnByaXYgKSA9PSBOVUxMICkgeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJObyB3bF9wcml2YXRlIGluIHNjdWxsX3JlYWRfcHJvY21lbVxuIiApOworCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgPT0gMCApeworICAgCSAgICBpZmJwID0gJmxwLT5oY2ZDdHg7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk1hZ2ljOiAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX01hZ2ljICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIklPQmFzZTogICAgICAgICAgICAgIDB4JTA0WFxuIiwgaWZicC0+SUZCX0lPQmFzZSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJMaW5rU3RhdDogICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9MaW5rU3RhdCApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJEU0xpbmtTdGF0OiAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlRpY2tJbmk6ICAgICAgICAgMHglMDhsWFxuIiwgaWZicC0+SUZCX1RpY2tJbmkgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVGlja0NudDogICAgICAgICAgICAgMHglMDRYXG4iLCBpZmJwLT5JRkJfVGlja0NudCApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJJbnRPZmZDbnQ6ICAgICAgICAgICAweCUwNFhcbiIsIGlmYnAtPklGQl9JbnRPZmZDbnQgKTsKKwkJbGVuICs9IHByaW50Zl9oY2ZfMTYoICJJRkJfRldJZGVudGl0eSIsICZidWZbbGVuXSwKKwkJCQkJCQkgICZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4sIGlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiArIDEgKTsKKwl9IGVsc2UgaWYgKCBscC0+d2xhZ3M0OV90eXBlID09IDEgKSB7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkNoYW5uZWw6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5DaGFubmVsICk7CisvKioqKioqIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInNsb2NrOiAgICAgICAgICAgICAgICAgICVkXG4iLCBscC0+c2xvY2sgKTsJCSovCisvL3gJCXN0cnVjdCB0cV9zdHJ1Y3QgICAgICAgICAgICAidGFzazogICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT50YXNrICk7CisvL3gJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICAic3RhdHM6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5zdGF0cyApOworI2lmZGVmIFdJUkVMRVNTX0VYVAorLy94CQlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAgICAgICAgIndzdGF0czogICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+d3N0YXRzICk7CisvL3ggICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInNweV9udW1iZXI6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5zcHlfbnVtYmVyICk7CisvL3gJCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBzcHlfYWRkcmVzc1tJV19NQVhfU1BZXVtFVEhfQUxFTl07CisvL3gJCXN0cnVjdCBpd19xdWFsaXR5ICAgICAgICAgICBzcHlfc3RhdFtJV19NQVhfU1BZXTsKKyNlbmRpZiAvLyBXSVJFTEVTU19FWFQKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiSUZCOiAgICAgICAgICAgICAgICAgIDB4JXBcbiIsICZscC0+aGNmQ3R4ICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImZsYWdzOiAgICAgICAgICAgICAgICAlIy44bFhcbiIsIGxwLT5mbGFncyApOyAgLy87P3VzZSB0aGlzIGZvcm1hdCBmcm9tIG5vdyBvbgorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJEZWJ1Z0ZsYWcod2xfcHJpdmF0ZSkgMHglMDRYXG4iLCBscC0+RGVidWdGbGFnICk7CisjaWYgREJHCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkRlYnVnRmxhZyAoRGJnSW5mbyk6ICAgMHglMDhsWFxuIiwgRGJnSW5mby0+RGVidWdGbGFnICk7CisjZW5kaWYgLy8gREJHCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImlzX3JlZ2lzdGVyZWQ6ICAgICAgICAweCUwNFhcbiIsIGxwLT5pc19yZWdpc3RlcmVkICk7CisvL3gJCUNGR19EUlZfSU5GT19TVFJDVCAgICAgICAgICAiZHJpdmVySW5mbzogICAgICAgICAweCUwNFhcbiIsIGxwLT5kcml2ZXJJbmZvICk7CisJCWxlbiArPSBwcmludGZfc3RyY3QoICJkcml2ZXJJbmZvIiwgJmJ1ZltsZW5dLCAoaGNmXzE2KikmbHAtPmRyaXZlckluZm8gKTsKKy8veAkJQ0ZHX0lERU5USVRZX1NUUkNUICAgICAgICAgICJkcml2ZXJJZGVudGl0eTogICAgIDB4JTA0WFxuIiwgbHAtPmRyaXZlcklkZW50aXR5ICk7CisJCWxlbiArPSBwcmludGZfc3RyY3QoICJkcml2ZXJJZGVudGl0eSIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5kcml2ZXJJZGVudGl0eSApOworLy94CQlDRkdfRldfSURFTlRJVFlfU1RSQ1QgICAgICAgIlN0YXRpb25JZGVudGl0eTogICAgMHglMDRYXG4iLCBscC0+U3RhdGlvbklkZW50aXR5ICk7CisJCWxlbiArPSBwcmludGZfc3RyY3QoICJTdGF0aW9uSWRlbnRpdHkiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+U3RhdGlvbklkZW50aXR5ICk7CisvL3gJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QgICAgICAiUHJpbWFyeUlkZW50aXR5OiAgICAweCUwNFhcbiIsIGxwLT5QcmltYXJ5SWRlbnRpdHkgKTsKKwkJbGVuICs9IHByaW50Zl9zdHJjdCggIlByaW1hcnlJZGVudGl0eSIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5oY2ZDdHguSUZCX1BSSUlkZW50aXR5ICk7CisJCWxlbiArPSBwcmludGZfc3RyY3QoICJQcmltYXJ5U3VwcGxpZXIiLCAmYnVmW2xlbl0sIChoY2ZfMTYqKSZscC0+aGNmQ3R4LklGQl9QUklTdXAgKTsKKy8veAkJQ0ZHX1BSSV9JREVOVElUWV9TVFJDVCAgICAgICJOSUNJZGVudGl0eTogICAgICAgIDB4JTA0WFxuIiwgbHAtPk5JQ0lkZW50aXR5ICk7CisJCWxlbiArPSBwcmludGZfc3RyY3QoICJOSUNJZGVudGl0eSIsICZidWZbbGVuXSwgKGhjZl8xNiopJmxwLT5OSUNJZGVudGl0eSApOworLy94CQlsdHZfdCAgICAgICAgICAgICAgICAgICAgICAgImx0dlJlY29yZDogICAgICAgICAgMHglMDRYXG4iLCBscC0+bHR2UmVjb3JkICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInR4Qnl0ZXM6ICAgICAgICAgICAgICAweCUwOGxYXG4iLCBscC0+dHhCeXRlcyApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJtYXhQb3J0OiAgICAgICAgICAgICAgMHglMDRYXG4iLCBscC0+bWF4UG9ydCApOyAgICAgICAgLyogMCBmb3IgU1RBLCA2IGZvciBBUCAqLworCS8qIEVsZW1lbnRzIHVzZWQgZm9yIGFzeW5jIG5vdGlmaWNhdGlvbiBmcm9tIGhhcmR3YXJlICovCisvL3gJCVJJRF9MT0dfU1RSQ1QJCQkJUmlkTGlzdFsxMF07CisvL3gJCWx0dl90ICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlZFJlY29yZDogICAgICAweCUwNFhcbiIsIGxwLT51cGRhdGVkUmVjb3JkICk7CisvL3gJCVBST0JFX1JFU1AJCQkJICAgICJQcm9iZVJlc3A6ICAgICAgICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5Qcm9iZVJlc3AgKTsKKy8veAkJQVNTT0NfU1RBVFVTX1NUUkNUICAgICAgICAgICJhc3NvY19zdGF0OiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmFzc29jX3N0YXQgKTsKKy8veAkJU0VDVVJJVFlfU1RBVFVTX1NUUkNUICAgICAgICJzZWNfc3RhdDogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnNlY19zdGF0ICk7CisvL3gJCXVfY2hhciAgICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWRCdWZbV1ZMQU5fTUFYX0xPT0tBSEVBRF07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlBvcnRUeXBlOiAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5Qb3J0VHlwZSApOyAgICAgICAgICAgLy8gMSAtIDMgKDEgW05vcm1hbF0gfCAzIFtBZEhvY10pCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkNoYW5uZWw6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5DaGFubmVsICk7ICAgICAgICAgICAgLy8gMCAtIDE0ICgwKQorLy94CQloY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgVHhSYXRlQ29udHJvbFsyXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhSYXRlQ29udHJvbFsyXTogICAgIDB4JTA0WCAweCUwNFhcbiIsCisJCQkJCQlscC0+VHhSYXRlQ29udHJvbFswXSwgbHAtPlR4UmF0ZUNvbnRyb2xbMV0gKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRGlzdGFuY2VCZXR3ZWVuQVBzOiAgIDB4JTA0WFxuIiwgbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyApOyAvLyAxIC0gMyAoMSkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUlRTVGhyZXNob2xkOiAgICAgICAgIDB4JTA0WFxuIiwgbHAtPlJUU1RocmVzaG9sZCApOyAgICAgICAvLyAwIC0gMjM0NyAoMjM0NykKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUE1FbmFibGVkOiAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPlBNRW5hYmxlZCApOyAgICAgICAgICAvLyAwIC0gMiwgODAwMSAtIDgwMDIgKDApCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk1pY3Jvd2F2ZVJvYnVzdG5lc3M6ICAweCUwNFhcbiIsIGxwLT5NaWNyb3dhdmVSb2J1c3RuZXNzICk7Ly8gMCAtIDEgKDApCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkNyZWF0ZUlCU1M6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5DcmVhdGVJQlNTICk7ICAgICAgICAgLy8gMCAtIDEgKDApCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk11bHRpY2FzdFJlY2VpdmU6ICAgICAweCUwNFhcbiIsIGxwLT5NdWx0aWNhc3RSZWNlaXZlICk7ICAgLy8gMCAtIDEgKDEpCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIk1heFNsZWVwRHVyYXRpb246ICAgICAweCUwNFhcbiIsIGxwLT5NYXhTbGVlcER1cmF0aW9uICk7ICAgLy8gMCAtIDY1NTM1ICgxMDApCisvL3gJCWhjZl84ICAgICAgICAgICAgICAgICAgICAgICBNQUNBZGRyZXNzW0VUSF9BTEVOXTsKKwkJbGVuICs9IHByaW50Zl9oY2ZfOCggIk1BQ0FkZHJlc3MiLCAmYnVmW2xlbl0sIGxwLT5NQUNBZGRyZXNzLCBFVEhfQUxFTiApOworLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya05hbWVbSENGX01BWF9OQU1FX0xFTisxXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiTmV0d29ya05hbWU6ICAgICAgICAgICUuMzJzXG4iLCBscC0+TmV0d29ya05hbWUgKTsKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpb25OYW1lW0hDRl9NQVhfTkFNRV9MRU4rMV07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkVuYWJsZUVuY3J5cHRpb246ICAgICAweCUwNFhcbiIsIGxwLT5FbmFibGVFbmNyeXB0aW9uICk7ICAgLy8gMCAtIDEgKDApCisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkxW01BWF9LRVlfTEVOKzFdOworCQlsZW4gKz0gcHJpbnRmX2hjZl84KCAiS2V5MSIsICZidWZbbGVuXSwgbHAtPktleTEsIE1BWF9LRVlfTEVOICk7CisvL3gJCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBLZXkyW01BWF9LRVlfTEVOKzFdOworLy94CQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgS2V5M1tNQVhfS0VZX0xFTisxXTsKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIEtleTRbTUFYX0tFWV9MRU4rMV07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlRyYW5zbWl0S2V5SUQ6ICAgICAgICAweCUwNFhcbiIsIGxwLT5UcmFuc21pdEtleUlEICk7ICAgICAgLy8gMSAtIDQgKDEpCisvL3gJCUNGR19ERUZBVUxUX0tFWVNfU1RSQ1QJICAgICJEZWZhdWx0S2V5czogICAgICAgICAweCUwNFhcbiIsIGxwLT5EZWZhdWx0S2V5cyApOworLy94CQl1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveFtNQl9TSVpFXTsKKy8veAkJY2hhciAgICAgICAgICAgICAgICAgICAgICAgIHN6RW5jcnlwdGlvbltNQVhfRU5DX0xFTl07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImRyaXZlckVuYWJsZTogICAgICAgICAweCUwNFhcbiIsIGxwLT5kcml2ZXJFbmFibGUgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwid29sYXNFbmFibGU6ICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPndvbGFzRW5hYmxlICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImF0aW1XaW5kb3c6ICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5hdGltV2luZG93ICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImhvbGRvdmVyRHVyYXRpb246ICAgICAweCUwNFhcbiIsIGxwLT5ob2xkb3ZlckR1cmF0aW9uICk7CisvL3gJCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RSYXRlWzJdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJhdXRoZW50aWNhdGlvbjogICAgICAgMHglMDRYXG4iLCBscC0+YXV0aGVudGljYXRpb24gKTsgLy8gaXMgdGhpcyBBUCBzcGVjaWZpYz8KKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwicHJvbWlzY3VvdXNNb2RlOiAgICAgIDB4JTA0WFxuIiwgbHAtPnByb21pc2N1b3VzTW9kZSApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJEb3dubG9hZEZpcm13YXJlOiAgICAgMHglMDRYXG4iLCBscC0+RG93bmxvYWRGaXJtd2FyZSApOyAgIC8vIDAgLSAyICgwIFtOb25lXSB8IDEgW1NUQV0gfCAyIFtBUF0pCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkF1dGhLZXlNZ210U3VpdGU6ICAgICAweCUwNFhcbiIsIGxwLT5BdXRoS2V5TWdtdFN1aXRlICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImxvYWRCYWxhbmNpbmc6ICAgICAgICAweCUwNFhcbiIsIGxwLT5sb2FkQmFsYW5jaW5nICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIm1lZGl1bURpc3RyaWJ1dGlvbjogICAweCUwNFhcbiIsIGxwLT5tZWRpdW1EaXN0cmlidXRpb24gKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwidHhQb3dMZXZlbDogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnR4UG93TGV2ZWwgKTsKKy8vICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJzaG9ydFJldHJ5TGltaXQ6ICAgIDB4JTA0WFxuIiwgbHAtPnNob3J0UmV0cnlMaW1pdCApOworLy8gICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sImxvbmdSZXRyeUxpbWl0OiAgICAgMHglMDRYXG4iLCBscC0+bG9uZ1JldHJ5TGltaXQgKTsKKy8veAkJaGNmXzE2ICAgICAgICAgICAgICAgICAgICAgIHNyc2NbMl07CisvL3gJCWhjZl8xNiAgICAgICAgICAgICAgICAgICAgICBicnNjWzJdOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJjb25uZWN0aW9uQ29udHJvbDogICAgMHglMDRYXG4iLCBscC0+Y29ubmVjdGlvbkNvbnRyb2wgKTsKKy8veAkJLy9oY2ZfMTYgICAgICAgICAgICAgICAgICAgICAgcHJvYmVEYXRhUmF0ZXNbMl07CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIm93bkJlYWNvbkludGVydmFsOiAgICAweCUwNFhcbiIsIGxwLT5vd25CZWFjb25JbnRlcnZhbCApOworICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJjb2V4aXN0ZW5jZTogICAgICAgICAgMHglMDRYXG4iLCBscC0+Y29leGlzdGVuY2UgKTsKKy8veAkJV1ZMQU5fRlJBTUUgICAgICAgICAgICAgICAgICJ0eEY6ICAgICAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnR4RiApOworLy94CQlXVkxBTl9MRlJBTUUgICAgICAgICAgICAgICAgdHhMaXN0W0RFRkFVTFRfTlVNX1RYX0ZSQU1FU107CisvL3gJCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAidHhGcmVlOiAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT50eEZyZWUgKTsKKy8veAkJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIHR4UVtXVkxBTl9NQVhfVFhfUVVFVUVTXTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwibmV0aWZfcXVldWVfb246ICAgICAgIDB4JTA0WFxuIiwgbHAtPm5ldGlmX3F1ZXVlX29uICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInR4UV9jb3VudDogICAgICAgICAgICAweCUwNFhcbiIsIGxwLT50eFFfY291bnQgKTsKKy8veAkJREVTQ19TVFJDVCAgICAgICAgICAgICAgICAgICJkZXNjX3J4OiAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRlc2NfcnggKTsKKy8veAkJREVTQ19TVFJDVCAgICAgICAgICAgICAgICAgICJkZXNjX3R4OiAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPmRlc2NfdHggKTsKKy8veAkJV1ZMQU5fUE9SVF9TVEFURSAgICAgICAgICAgICJwb3J0U3RhdGU6ICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPnBvcnRTdGF0ZSApOworLy94CQlTY2FuUmVzdWx0ICAgICAgICAgICAgICAgICAgInNjYW5fcmVzdWx0czogICAgICAgMHglMDRYXG4iLCBscC0+c2Nhbl9yZXN1bHRzICk7CisvL3gJCVByb2JlUmVzdWx0ICAgICAgICAgICAgICAgICAicHJvYmVfcmVzdWx0czogICAgICAweCUwNFhcbiIsIGxwLT5wcm9iZV9yZXN1bHRzICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInByb2JlX251bV9hcHM6ICAgICAgICAweCUwNFhcbiIsIGxwLT5wcm9iZV9udW1fYXBzICk7CisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInVzZV9kbWE6ICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT51c2VfZG1hICk7CisvL3gJCURNQV9TVFJDVCAgICAgICAgICAgICAgICAgICAiZG1hOiAgICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT5kbWEgKTsKKyNpZmRlZiBVU0VfUlRTCisgICAJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sInVzZVJUUzogICAgICAgICAgICAgICAweCUwNFhcbiIsIGxwLT51c2VSVFMgKTsKKyNlbmRpZiAgLy8gVVNFX1JUUworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisJCS8vOz9JIGd1ZXNzIG5vdC4gVGhpcyBzaG91bGQgYmUgYnJvdWdodCB1bmRlciBEZWJ1ZyBtb2RlIG9ubHkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRFRJTVBlcmlvZDogICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPkRUSU1QZXJpb2QgKTsgICAgICAgICAvLyAxIC0gMjU1ICgxKQorICAgCSAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJtdWx0aWNhc3RQTUJ1ZmZlcmluZzogMHglMDRYXG4iLCBscC0+bXVsdGljYXN0UE1CdWZmZXJpbmcgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUmVqZWN0QW55OiAgICAgICAgICAgIDB4JTA0WFxuIiwgbHAtPlJlamVjdEFueSApOyAgICAgICAgICAvLyAwIC0gMSAoMCkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiRXhjbHVkZVVuZW5jcnlwdGVkOiAgIDB4JTA0WFxuIiwgbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCApOyAvLyAwIC0gMSAoMSkKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiaW50cmFCU1NSZWxheTogICAgICAgIDB4JTA0WFxuIiwgbHAtPmludHJhQlNTUmVsYXkgKTsKKyAgIAkgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwid2xhZ3M0OV90eXBlOiAgICAgICAgICAgICAweCUwOGxYXG4iLCBscC0+d2xhZ3M0OV90eXBlICk7CisjaWZkZWYgVVNFX1dEUworLy94CQlXVkxBTl9XRFNfSUYgICAgICAgICAgICAgICAgd2RzX3BvcnRbTlVNX1dEU19QT1JUU107CisjZW5kaWYgLy8gVVNFX1dEUworI2VuZGlmIC8vIEhDRl9BUAorCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgPT0gMiApeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ0YWxsaWVzIHRvIGJlIGFkZGVkXG4iICk7CisvL0hlcm1lcyBUYWxsaWVzIChJRkIgc3Vic3RydWN0dXJlKSB7CisgICAJICAgIHAgPSAmbHAtPmhjZkN0eC5JRkJfTklDX1RhbGxpZXM7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlR4VW5pY2FzdEZyYW1lczogICAgICAgICAgJTA4bFhcbiIsIHAtPlR4VW5pY2FzdEZyYW1lcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeE11bHRpY2FzdEZyYW1lczogICAgICAgICUwOGxYXG4iLCBwLT5UeE11bHRpY2FzdEZyYW1lcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeEZyYWdtZW50czogICAgICAgICAgICAgICUwOGxYXG4iLCBwLT5UeEZyYWdtZW50cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeFVuaWNhc3RPY3RldHM6ICAgICAgICAgICUwOGxYXG4iLCBwLT5UeFVuaWNhc3RPY3RldHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhNdWx0aWNhc3RPY3RldHM6ICAgICAgICAlMDhsWFxuIiwgcC0+VHhNdWx0aWNhc3RPY3RldHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM6ICAlMDhsWFxuIiwgcC0+VHhEZWZlcnJlZFRyYW5zbWlzc2lvbnMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhTaW5nbGVSZXRyeUZyYW1lczogICAgICAlMDhsWFxuIiwgcC0+VHhTaW5nbGVSZXRyeUZyYW1lcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeE11bHRpcGxlUmV0cnlGcmFtZXM6ICAgICUwOGxYXG4iLCBwLT5UeE11bHRpcGxlUmV0cnlGcmFtZXMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhSZXRyeUxpbWl0RXhjZWVkZWQ6ICAgICAlMDhsWFxuIiwgcC0+VHhSZXRyeUxpbWl0RXhjZWVkZWQgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVHhEaXNjYXJkczogICAgICAgICAgICAgICAlMDhsWFxuIiwgcC0+VHhEaXNjYXJkcyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeFVuaWNhc3RGcmFtZXM6ICAgICAgICAgICUwOGxYXG4iLCBwLT5SeFVuaWNhc3RGcmFtZXMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhNdWx0aWNhc3RGcmFtZXM6ICAgICAgICAlMDhsWFxuIiwgcC0+UnhNdWx0aWNhc3RGcmFtZXMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhGcmFnbWVudHM6ICAgICAgICAgICAgICAlMDhsWFxuIiwgcC0+UnhGcmFnbWVudHMgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhVbmljYXN0T2N0ZXRzOiAgICAgICAgICAlMDhsWFxuIiwgcC0+UnhVbmljYXN0T2N0ZXRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4TXVsdGljYXN0T2N0ZXRzOiAgICAgICAgJTA4bFhcbiIsIHAtPlJ4TXVsdGljYXN0T2N0ZXRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4RkNTRXJyb3JzOiAgICAgICAgICAgICAgJTA4bFhcbiIsIHAtPlJ4RkNTRXJyb3JzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4RGlzY2FyZHNOb0J1ZmZlcjogICAgICAgJTA4bFhcbiIsIHAtPlJ4RGlzY2FyZHNOb0J1ZmZlciApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUeERpc2NhcmRzV3JvbmdTQTogICAgICAgICUwOGxYXG4iLCBwLT5UeERpc2NhcmRzV3JvbmdTQSApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeFdFUFVuZGVjcnlwdGFibGU6ICAgICAgICUwOGxYXG4iLCBwLT5SeFdFUFVuZGVjcnlwdGFibGUgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiUnhNc2dJbk1zZ0ZyYWdtZW50czogICAgICAlMDhsWFxuIiwgcC0+UnhNc2dJbk1zZ0ZyYWdtZW50cyApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeE1zZ0luQmFkTXNnRnJhZ21lbnRzOiAgICUwOGxYXG4iLCBwLT5SeE1zZ0luQmFkTXNnRnJhZ21lbnRzICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIlJ4RGlzY2FyZHNXRVBJQ1ZFcnJvcjogICAgJTA4bFhcbiIsIHAtPlJ4RGlzY2FyZHNXRVBJQ1ZFcnJvciApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJSeERpc2NhcmRzV0VQRXhjbHVkZWQ6ICAgICUwOGxYXG4iLCBwLT5SeERpc2NhcmRzV0VQRXhjbHVkZWQgKTsKKyNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX1RBTExJRVNfRlcKKyAgICAgICAgLy90byBiZSBhZGRlZCA7PworI2VuZGlmIC8vIEhDRl9FWFRfVEFMTElFU19GVworCX0gZWxzZSBpZiAoIGxwLT53bGFnczQ5X3R5cGUgJiAweDgwMDAgKSB7CS8vOz9rbHVkZ3kgYnV0IGl0IGlzIHVuY2xlYXIgdG8gbWUgd2VyZSBlbHNlIHRvIHBsYWNlIHRoaXMKKyNpZiBEQkcKKwkJRGJnSW5mby0+RGVidWdGbGFnID0gbHAtPndsYWdzNDlfdHlwZSAmIDB4N0ZGRjsKKyNlbmRpZiAvLyBEQkcKKwkJbHAtPndsYWdzNDlfdHlwZSA9IDA7CQkJCS8vZGVmYXVsdCB0byBJRkIgYWdhaW4gOz8KKwl9IGVsc2UgeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJ1bmtub3duIHZhbHVlIGZvciB3bGFnczQ5X3R5cGU6IDB4JTA4bFhcbiIsIGxwLT53bGFnczQ5X3R5cGUgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiMHgwMDAwIC0gSUZCXG4iICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIjB4MDAwMSAtIHdsX3ByaXZhdGVcbiIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiMHgwMDAyIC0gVGFsbGllc1xuIiApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCIweDh4eHggLSBDaGFuZ2UgZGVidWZmbGFnXG4iICk7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sIkVSUk9SICAgIDAwMDFcbldBUk5JTkcgIDAwMDJcbk5PVElDRSAgIDAwMDRcblRSQUNFICAgIDAwMDhcbiIgKTsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmK2xlbiwiVkVSQk9TRSAgMDAxMFxuUEFSQU0gICAgMDAyMFxuQlJFQUsgICAgMDA0MFxuUlggICAgICAgMDEwMFxuIiApOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCJUWCAgICAgICAwMjAwXG5EUyAgICAgICAwNDAwXG4iICk7CisJfQorICAgIHJldHVybiBsZW47Cit9IC8vIHNjdWxsX3JlYWRfcHJvY21lbQorCitzdGF0aWMgdm9pZCBwcm9jX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUsIHdyaXRlX3Byb2NfdCAqdywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBlbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZSRUcgfCBTX0lXVVNSLCBOVUxMKTsKKwlpZiAoZW50cnkpIHsKKwkJZW50cnktPndyaXRlX3Byb2MgPSB3OworCQllbnRyeS0+ZGF0YSA9IGRhdGE7CisJfQorfSAvLyBwcm9jX3dyaXRlCisKK3N0YXRpYyBpbnQgd3JpdGVfaW50KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJc3RhdGljIGNoYXIJCXByb2NfbnVtYmVyWzExXTsKKwl1bnNpZ25lZCBpbnQJbnIgPSAwOworCisJREJHX0ZVTkMoICJ3cml0ZV9pbnQiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiAoY291bnQgPiA5KSB7CisJCWNvdW50ID0gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCBjb3B5X2Zyb21fdXNlcihwcm9jX251bWJlciwgYnVmZmVyLCBjb3VudCkgKSB7CisJCWNvdW50ID0gLUVGQVVMVDsKKwl9CisJaWYgIChjb3VudCA+IDAgKSB7CisJCXByb2NfbnVtYmVyW2NvdW50XSA9IDA7CisJCW5yID0gd2xfYXRvaSggcHJvY19udW1iZXIgKTsKKyAJCSoodW5zaWduZWQgaW50ICopZGF0YSA9IG5yOworCQlpZiAoIG5yICYgMHg4MDAwICkgewkvLzs/a2x1ZGd5IGJ1dCBpdCBpcyB1bmNsZWFyIHRvIG1lIHdlcmUgZWxzZSB0byBwbGFjZSB0aGlzCisjaWYgREJHCisJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSBuciAmIDB4N0ZGRjsKKyNlbmRpZiAvLyBEQkcKKwkJfQorCX0KKwlEQkdfUFJJTlQoICJ2YWx1ZTogJTA4WFxuIiwgbnIgKTsKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gY291bnQ7Cit9IC8vIHdyaXRlX2ludAorCisjZW5kaWYgLyogU0NVTExfVVNFX1BST0MgKi8KKworI2lmZGVmIERONTU0CisjZGVmaW5lIFJVTl9BVCh4KQkJKGppZmZpZXMrKHgpKQkJLy8iYm9ycm93ZWQiIGZyb20gaW5jbHVkZS9wY21jaWEva19jb21wYXQuaAorI2RlZmluZSBEU19PT1IJMHg4MDAwCQkvL0RlZXBzbGVlcCBPdXRPZlJhbmdlIFN0YXR1cworCisJCWxwLT50aW1lcl9vb3JfY250ID0gRFNfT09SOworCQlpbml0X3RpbWVyKCAmbHAtPnRpbWVyX29vciApOworCQlscC0+dGltZXJfb29yLmZ1bmN0aW9uID0gdGltZXJfb29yOworCQlscC0+dGltZXJfb29yLmRhdGEgPSAodW5zaWduZWQgbG9uZylscDsKKwkJbHAtPnRpbWVyX29vci5leHBpcmVzID0gUlVOX0FUKCAzICogSFogKTsKKwkJYWRkX3RpbWVyKCAmbHAtPnRpbWVyX29vciApOworCQlwcmludGsoICI8NT53bF9lbmFibGU6ICVsZFxuIiwgamlmZmllcyApOwkJLy87P3JlbW92ZSBtZSAxIGRheQorI2VuZGlmIC8vRE41NTQKKyNpZmRlZiBETjU1NAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXRpbWVyX29vcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBhcmcgLSBhIHVfbG9uZyByZXByZXNlbnRpbmcgYSBwb2ludGVyIHRvIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICBkZXZpY2UgdG8gYmUgcmVsZWFzZWQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0aW1lcl9vb3IoIHVfbG9uZyBhcmcgKQoreworCXN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWFyZzsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAidGltZXJfb29yIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImFyZyIsICIweCUwOGx4IiwgYXJnICk7CisKKwlwcmludGsoICI8NT50aW1lcl9vb3I6ICVsZCAweCUwNFhcbiIsIGppZmZpZXMsIGxwLT50aW1lcl9vb3JfY250ICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisJbHAtPnRpbWVyX29vcl9jbnQgKz0gMTA7CisgICAgaWYgKCAobHAtPnRpbWVyX29vcl9jbnQgJiB+RFNfT09SKSA+IDMwMCApIHsKKwkJbHAtPnRpbWVyX29vcl9jbnQgPSAzMDA7CisJfQorCWxwLT50aW1lcl9vb3JfY250IHw9IERTX09PUjsKKwlpbml0X3RpbWVyKCAmbHAtPnRpbWVyX29vciApOworCWxwLT50aW1lcl9vb3IuZnVuY3Rpb24gPSB0aW1lcl9vb3I7CisJbHAtPnRpbWVyX29vci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpbHA7CisJbHAtPnRpbWVyX29vci5leHBpcmVzID0gUlVOX0FUKCAobHAtPnRpbWVyX29vcl9jbnQgJiB+RFNfT09SKSAqIEhaICk7CisJYWRkX3RpbWVyKCAmbHAtPnRpbWVyX29vciApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIHRpbWVyX29vcgorI2VuZGlmIC8vRE41NTQKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTNhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBkZXZpY2Ugc3BlY2lmaWMgcm91dGluZXMgYW5kIGRyaXZlciBpbml0L3VuLWluaXQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX01BSU5fSF9fCisjZGVmaW5lIF9fV0xfTUFJTl9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2luc2VydCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHdsX3NldF93ZXBfa2V5cyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9wdXRfbHR2X2luaXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfcHV0X2x0diggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK3BfdTE2IHdsX2dldF9pcnFfbWFzayggdm9pZCApOworCitwX3M4ICogd2xfZ2V0X2lycV9saXN0KCB2b2lkICk7CisKK2ludCB3bF9yZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfZ28oIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfYXBwbHkoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpcnFyZXR1cm5fdCB3bF9pc3IoIGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKTsKKwordm9pZCB3bF9yZW1vdmUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCB3bF9zdXNwZW5kKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgd2xfcmVzdW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgd2xfcmVsZWFzZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfZW5hYmxlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IHdsX2Nvbm5lY3QoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfZGlzYWJsZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK2ludCB3bF9kaXNjb25uZWN0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKwordm9pZCB3bF9lbmFibGVfd2RzX3BvcnRzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqIGxwICk7CisKK3ZvaWQgd2xfZGlzYWJsZV93ZHNfcG9ydHMoIHN0cnVjdCB3bF9wcml2YXRlICogbHAgKTsKKworI2lmbmRlZiBVU0VfTUJPWF9TWU5DCisKK2ludCB3bF9tYngoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF9lbmRpYW5fdHJhbnNsYXRlX21haWxib3goIGx0dl90ICpsdHYgKTsKK3ZvaWQgd2xfcHJvY2Vzc19tYWlsYm94KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworI2VuZGlmICAvKiBVU0VfTUJPWF9TWU5DICovCisKKworI2lmZGVmIFVTRV9XRFMKKwordm9pZCB3bF93ZHNfbmV0ZGV2X3JlZ2lzdGVyKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKworI2lmZGVmIFVTRV9XRFMKKworI2RlZmluZSBXTF9XRFNfTkVUREVWX1JFR0lTVEVSKCBBUkcgKSAgIHdsX3dkc19uZXRkZXZfcmVnaXN0ZXIoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRERVZfREVSRUdJU1RFUiggQVJHICkgd2xfd2RzX25ldGRldl9kZXJlZ2lzdGVyKCBBUkcgKQorCisjZWxzZQorCisjZGVmaW5lIFdMX1dEU19ORVRERVZfUkVHSVNURVIoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRERVZfREVSRUdJU1RFUiggQVJHICkKKworI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgIC8vIF9fV0xfTUFJTl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzODkwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCkBAIC0wLDAgKzEsMjA3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBjb250YWlucyBoYW5kbGVyIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHdpdGggdGhlIG5ldF9kZXZpY2UKKyAqICAgc3RydWN0dXJlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisvLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KKy8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorLy8gI2luY2x1ZGUgPGFzbS9pby5oPgorLy8gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKy8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKworI2luY2x1ZGUgPGRlYnVnLmg+CisKKyNpbmNsdWRlIDxoY2YuaD4KKyNpbmNsdWRlIDxkaGYuaD4KKy8vICNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfcHJpdi5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF9uZXRkZXYuaD4KKyNpbmNsdWRlIDx3bF93ZXh0Lmg+CisKKyNpZmRlZiBVU0VfUFJPRklMRQorI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KKyNlbmRpZiAgLyogVVNFX1BST0ZJTEUgKi8KKworI2lmZGVmIEJVU19QQ01DSUEKKyNpbmNsdWRlIDx3bF9jcy5oPgorI2VuZGlmICAvKiBCVVNfUENNQ0lBICovCisKKyNpZmRlZiBCVVNfUENJCisjaW5jbHVkZSA8d2xfcGNpLmg+CisjZW5kaWYgIC8qIEJVU19QQ0kgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmICAvKiBEQkcgKi8KKworCisjaWYgSENGX0VOQ0FQCisjZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4gLSA4KQorI2Vsc2UKKyNkZWZpbmUgTVRVX01BWCAoSENGX01BWF9NU0cgLSBFVEhfSExFTikKKyNlbmRpZgorCisvL3N0YXRpYyBpbnQgbXR1ID0gTVRVX01BWDsKKy8vTU9EVUxFX1BBUk0obXR1LCAiaSIpOworLy9NT0RVTEVfUEFSTV9ERVNDKG10dSwgIk1UVSIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAorICAgIGRlc2MtPmJ1Zl9hZGRyID0gYnVmOyBcCisgICAgZGVzYy0+QlVGX1NJWkUgPSBsZW47IFwKKyAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQorCisjZGVmaW5lIEJMT0NLX0lOUFVUX0RNQShidWYsIGxlbikgbWVtY3B5KCBidWYsIGRlc2NfbmV4dC0+YnVmX2FkZHIsIHBrdGxlbiApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaW5pdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFdlIG5ldmVyIG5lZWQgdG8gZG8gYW55dGhpbmcgd2hlbiBhICJXaXJlbGVzcyIgZGV2aWNlIGlzICJpbml0aWFsaXplZCIKKyAqICBieSB0aGUgbmV0IHNvZnR3YXJlLCBiZWNhdXNlIHdlIG9ubHkgcmVnaXN0ZXIgYWxyZWFkeS1mb3VuZCBjYXJkcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworLy8gICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKy8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfaW5pdCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworCisgICAgLyogTm90aGluZyB0byBkbywgYnV0IGdyYWIgdGhlIHNwaW5sb2NrIGFueXdheSBqdXN0IGluIGNhc2Ugd2UgZXZlciBuZWVkCisgICAgICAgdGhpcyByb3V0aW5lICovCisvLyAgd2xfbG9jayggbHAsICZmbGFncyApOworLy8gIHdsX3VubG9jayggbHAsICZmbGFncyApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2luaXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9jb25maWcoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBJbXBsZW1lbnQgdGhlIFNJT0NTSUZNQVAgaW50ZXJmYWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICogICAgICBtYXAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIGlmbWFwIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfY29uZmlnKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCApCit7CisgICAgREJHX0ZVTkMoICJ3bF9jb25maWciICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJtYXAiLCAiMHglcCIsIG1hcCApOworCisgICAgLyogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuIFNpbmNlIHRoaXMgbm90IG5lZWRlZCwKKyAgICAgICBpZ25vcmUgdGhlIHJlcXVlc3QuICovCisgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiJXM6ICVzIGNhbGxlZC5cbiIsIGRldi0+bmFtZSwgX19GVU5DX18gKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9jb25maWcKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9zdGF0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdGlzdGljcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Vfc3RhdHMgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5ldHdvcmsKKyAqICAgICAgc3RhdGlzdGljcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZmRlZiBVU0VfV0RTCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworI2VuZGlmICAvKiBVU0VfV0RTICovCisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgIGZsYWdzOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICAqcFN0YXRzOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLy9EQkdfRlVOQyggIndsX3N0YXRzIiApOworICAgIC8vREJHX0VOVEVSKCBEYmdJbmZvICk7CisgICAgLy9EQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworICAgIHBTdGF0cyA9IE5VTEw7CisKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworCS8vREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICAvKiBSZXR1cm4gdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgKi8KKyNpZmRlZiBVU0VfV0RTCisKKyAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworCWlmKCBkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSB7CisJICAgIHBTdGF0cyA9ICYoIGxwLT53ZHNfcG9ydFtjb3VudF0uc3RhdHMgKTsKKwl9CisgICAgfQorCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgIC8qIElmIHBTdGF0cyBpcyBzdGlsbCBOVUxMLCB0aGVuIHRoZSBkZXZpY2UgaXMgbm90IGEgV0RTIHBvcnQgKi8KKyAgICBpZiggcFN0YXRzID09IE5VTEwgKSB7CisgICAgICAgIHBTdGF0cyA9ICYoIGxwLT5zdGF0cyApOworICAgIH0KKworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCisgICAgLy9EQkdfTEVBVkUoIERiZ0luZm8gKTsKKworICAgIHJldHVybiBwU3RhdHM7Cit9IC8vIHdsX3N0YXRzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfb3BlbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIE9wZW4gdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhDRl9TVUNDRVNTOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9vcGVuIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisjaWZkZWYgVVNFX1JUUworICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgZGV2aWNlIG9wZW4sIGluIFJUUyBtb2RlXG4iICk7CisJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIC1FSU87CisgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyNpZmRlZiBVU0VfUFJPRklMRQorICAgIHBhcnNlX2NvbmZpZyggZGV2ICk7CisjZW5kaWYKKworICAgIGlmKCBscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQgKSB7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiRW5hYmxpbmcgUG9ydCAwXG4iICk7CisJc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOworCisgICAgICAgIGlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGUgcG9ydCAwIGZhaWxlZDogMHgleFxuIiwgc3RhdHVzICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcworICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBpZiAoIHN0cmxlbiggbHAtPmZ3X2ltYWdlX2ZpbGVuYW1lICkgKSB7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiOz8/Pz8gS2x1ZGd5IHdheSB0byBmb3JjZSBhIGRvd25sb2FkXG4iICk7CisJc3RhdHVzID0gd2xfZ28oIGxwICk7CisgICAgfSBlbHNlIHsKKwlzdGF0dXMgPSB3bF9hcHBseSggbHAgKTsKKyAgICB9CisKKyAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcworICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKyAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworCS8vIFVuc3VjY2VzZnVsbCwgdHJ5IHJlc2V0IG9mIHRoZSBjYXJkIHRvIHJlY292ZXIKKwlzdGF0dXMgPSB3bF9yZXNldCggZGV2ICk7CisgICAgfQorCisgICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKKyAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwluZXRpZl9jYXJyaWVyX29uKCBkZXYgKTsKKwlXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTiggbHAgKTsKKworCWxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9IQU5ETElOR19JTlQ7IC8vIFN0YXJ0IGhhbmRsaW5nIGludGVycnVwdHMKKyAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKwlXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUoIGxwICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2xfaGNmX2Vycm9yKCBkZXYsIHN0YXR1cyApOwkJLyogUmVwb3J0IHRoZSBlcnJvciAqLworICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKCBkZXYgKTsJCS8qIFN0b3AgdGhlIGRldmljZSBhbmQgcXVldWUgKi8KKyAgICB9CisKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX29wZW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9jbG9zZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENsb3NlIHRoZSBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyAgIGZsYWdzOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCJ3bF9jbG9zZSIpOworICAgIERCR19FTlRFUihEYmdJbmZvKTsKKyAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CisKKyAgICAvKiBNYXJrIHRoZSBhZGFwdGVyIGFzIGJ1c3kgKi8KKyAgICBuZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKKyAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKKworICAgIG5ldGlmX2NhcnJpZXJfb2ZmKCBkZXYgKTsKKyAgICBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PRkYoIGxwICk7CisKKyAgICAvKiBTaHV0ZG93biB0aGUgYWRhcHRlcjoKKyAgICAgICAgICAgIERpc2FibGUgYWRhcHRlciBpbnRlcnJ1cHRzCisgICAgICAgICAgICBTdG9wIFR4L1J4CisgICAgICAgICAgICBVcGRhdGUgc3RhdGlzdGljcworICAgICAgICAgICAgU2V0IGxvdyBwb3dlciBtb2RlCisgICAgKi8KKworICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOworICAgIGxwLT5pc19oYW5kbGluZ19pbnQgPSBXTF9OT1RfSEFORExJTkdfSU5UOyAvLyBTdG9wIGhhbmRsaW5nIGludGVycnVwdHMKKworI2lmZGVmIFVTRV9SVFMKKyAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgeworCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBjbG9zZSwgaW4gUlRTIG1vZGVcbiIgKTsKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgIC8qIERpc2FibGUgdGhlIHBvcnRzICovCisgICAgd2xfZGlzYWJsZSggbHAgKTsKKworICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX2Nsb3NlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB3bF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworICAgIHN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKKyAgICBzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OX1NUUiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pIC0gMSk7CisvLwlzdHJuY3B5KGluZm8uZndfdmVyc2lvbiwgcHJpdi0+ZndfbmFtZSwKKy8vCXNpemVvZihpbmZvLmZ3X3ZlcnNpb24pIC0gMSk7CisKKyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKSkKKyAgICBpZiAoZGV2LT5kZXYucGFyZW50KSB7CisgICAgCWRldl9zZXRfbmFtZShkZXYtPmRldi5wYXJlbnQsICIlcyIsIGluZm8tPmJ1c19pbmZvKTsKKwkvL3N0cm5jcHkoaW5mby0+YnVzX2luZm8sIGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkLAorCS8vCXNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxKTsKKyNlbHNlCisJICAgIGlmIChkZXYtPmNsYXNzX2Rldi5wYXJlbnQpIHsKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKwlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEsCisJCSJQQ01DSUEgRklYTUUiKTsKKy8vCQkgICAgIlBDTUNJQSAweCVseCIsIHByaXYtPmh3LmlvYmFzZSk7CisgICAgfQorfSAvLyB3bF9nZXRfZHJ2aW5mbworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHdsX2V0aHRvb2xfb3BzID0geworICAgIC5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvLAorICAgIC5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9pb2N0bCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBJT0NUTCBoYW5kbGVyIGZvciB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdC4KKyAqICAgICAgcnEgIC0gYSBwb2ludGVyIHRvIHRoZSBJT0NUTCByZXF1ZXN0IGJ1ZmZlci4KKyAqICAgICAgY21kIC0gdGhlIElPQ1RMIGNvbW1hbmQgY29kZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kICkKK3sKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9pb2N0bCIgKTsKKyAgICBEQkdfRU5URVIoRGJnSW5mbyk7CisgICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworICAgIERCR19QQVJBTShEYmdJbmZvLCAicnEiLCAiMHglcCIsIHJxKTsKKyAgICBEQkdfUEFSQU0oRGJnSW5mbywgImNtZCIsICIweCUwNHgiLCBjbWQpOworCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKwkvKiBIYW5kbGUgYW55IFJUUyBJT0NUTCBoZXJlICovCisJaWYoIGNtZCA9PSBXTF9JT0NUTF9SVFMgKSB7CisJICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXTF9JT0NUTF9SVFNcbiIgKTsKKwkgICAgcmV0ID0gd3ZsYW5fcnRzKCAoc3RydWN0IHJ0c3JlcSAqKXJxLCBkZXYtPmJhc2VfYWRkciApOworCX0gZWxzZSB7CisJICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMIG5vdCBzdXBwb3J0ZWQgaW4gUlRTIG1vZGU6IDB4JVhcbiIsIGNtZCApOworCSAgICByZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlnb3RvIG91dF9hY3RfaW50X29uX3VubG9jazsKKyAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgIC8qIE9ubHkgaGFuZGxlIFVJTCBJT0NUTCByZXF1ZXN0cyB3aGVuIHRoZSBVSUwgaGFzIHRoZSBzeXN0ZW0gYmxvY2tlZC4gKi8KKyAgICBpZiggISgoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApICYmICggY21kICE9IFdWTEFOMl9JT0NUTF9VSUwgKSkpIHsKKyNpZmRlZiBVU0VfVUlMCisJc3RydWN0IHVpbHJlcSAgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CisjZW5kaWYgLyogVVNFX1VJTCAqLworCisJc3dpdGNoKCBjbWQgKSB7CisJCS8vID09PT09PT09PT09PT09PT09PSBQcml2YXRlIElPQ1RMcyAodXAgdG8gMTYpID09PT09PT09PT09PT09PT09PQorI2lmZGVmIFVTRV9VSUwKKwljYXNlIFdWTEFOMl9JT0NUTF9VSUw6CisJICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTFxuIiApOworCSAgICAgcmV0ID0gd3ZsYW5fdWlsKCB1cnEsIGxwICk7CisJICAgICBicmVhazsKKyNlbmRpZiAgLyogVVNFX1VJTCAqLworCisJZGVmYXVsdDoKKwkgICAgIERCR19UUkFDRShEYmdJbmZvLCAiSU9DVEwgQ09ERSBOT1QgU1VQUE9SVEVEOiAweCVYXG4iLCBjbWQgKTsKKwkgICAgIHJldCA9IC1FT1BOT1RTVVBQOworCSAgICAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CisJREJHX1dBUk5JTkcoIERiZ0luZm8sICJERVZJQ0UgSVMgQlVTWSwgQ0FOTk9UIFBST0NFU1MgUkVRVUVTVFxuIiApOworCXJldCA9IC1FQlVTWTsKKyAgICB9CisKKyNpZmRlZiBVU0VfUlRTCitvdXRfYWN0X2ludF9vbl91bmxvY2s6CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKyAgICB3bF9hY3RfaW50X29uKCBscCApOworCisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gcmV0OworfSAvLyB3bF9pb2N0bAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCit2b2lkIHdsX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzdHJ1Y3QgcHRfcmVncyByZWdzOworCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworICAgIHdsX2lzcihkZXYtPmlycSwgZGV2LCAmcmVncyk7CisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3RpbWVvdXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciBjYWxsZWQgd2hlbiwgZm9yIHNvbWUgcmVhc29uLCBhIFR4IHJlcXVlc3QgaXMgbm90IGNvbXBsZXRlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3QuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF90eF90aW1lb3V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZmRlZiBVU0VfV0RTCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBTdGF0cyA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF90eF90aW1lb3V0IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlczogVHJhbnNtaXQgdGltZW91dC5cbiIsIGRldi0+bmFtZSApOworCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisjaWZkZWYgVVNFX1JUUworICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiU2tpcHBpbmcgdHhfdGltZW91dCBoYW5kbGVyLCBpbiBSVFMgbW9kZVxuIiApOworCXdsX3VubG9jayggbHAsICZmbGFncyApOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuOworICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgLyogRmlndXJlIG91dCB3aGljaCBkZXZpY2UgKHRoZSAicm9vdCIgZGV2aWNlIG9yIFdEUyBwb3J0KSB0aGlzIHRpbWVvdXQKKyAgICAgICBpcyBmb3IgKi8KKyNpZmRlZiBVU0VfV0RTCisKKyAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworCWlmKCBkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSB7CisJICAgIHBTdGF0cyA9ICYoIGxwLT53ZHNfcG9ydFtjb3VudF0uc3RhdHMgKTsKKworCSAgICAvKiBCcmVhayB0aGUgbG9vcCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlIGNvdW50ZXIgdG8gYWNjZXNzIFdEUworCSAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCisgICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgeworCXBTdGF0cyA9ICYoIGxwLT5zdGF0cyApOworICAgIH0KKworICAgIC8qIEFjY3VtdWxhdGUgdGhlIHRpbWVvdXQgZXJyb3IgKi8KKyAgICBwU3RhdHMtPnR4X2Vycm9ycysrOworCisgICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3R4X3RpbWVvdXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9zZW5kKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIHJvdXRpbmUgd2hpY2ggcGVyZm9ybXMgZGF0YSB0cmFuc21pdHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0LgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIDEgb24gZXJyb3IKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3NlbmQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBERVNDX1NUUkNUICAgICAgICAgICpkZXNjOworICAgIFdWTEFOX0xGUkFNRSAgICAgICAgKnR4RiA9IE5VTEw7CisgICAgc3RydWN0IGxpc3RfaGVhZCAgICAqZWxlbWVudDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3NlbmQiICk7CisKKyAgICBpZiggbHAgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBGSURzOyBpZiBub25lIGFyZSBhdmFpbGFibGUsIGRvbid0IHRha2UgYW55CisgICAgICAgZnJhbWVzIG9mZiB0aGUgdHhRICovCisgICAgaWYoIGxwLT5oY2ZDdHguSUZCX1JzY0luZCA9PSAwICkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogUmVjbGFpbSB0aGUgVHhRIEVsZW1lbnRzIGFuZCBwbGFjZSB0aGVtIGJhY2sgb24gdGhlIGZyZWUgcXVldWUgKi8KKyAgICBpZiggIWxpc3RfZW1wdHkoICYoIGxwLT50eFFbMF0gKSkpIHsKKyAgICAgICAgZWxlbWVudCA9IGxwLT50eFFbMF0ubmV4dDsKKworICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICogKWxpc3RfZW50cnkoIGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSApOworICAgICAgICBpZiggdHhGICE9IE5VTEwgKSB7CisgICAgICAgICAgICBscC0+dHhGLnNrYiAgPSB0eEYtPmZyYW1lLnNrYjsKKyAgICAgICAgICAgIGxwLT50eEYucG9ydCA9IHR4Ri0+ZnJhbWUucG9ydDsKKworICAgICAgICAgICAgdHhGLT5mcmFtZS5za2IgID0gTlVMTDsKKyAgICAgICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IDA7CisKKyAgICAgICAgICAgIGxpc3RfZGVsKCAmKCB0eEYtPm5vZGUgKSk7CisgICAgICAgICAgICBsaXN0X2FkZCggZWxlbWVudCwgJiggbHAtPnR4RnJlZSApKTsKKworICAgICAgICAgICAgbHAtPnR4UV9jb3VudC0tOworCisgICAgICAgICAgICBpZiggbHAtPnR4UV9jb3VudCA8IFRYX1FfTE9XX1dBVEVSX01BUksgKSB7CisgICAgICAgICAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKKyAgICAgICAgICAgICAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiS2lja3N0YXJ0aW5nIFE6ICVkXG4iLCBscC0+dHhRX2NvdW50ICk7CisgICAgICAgICAgICAgICAgICAgIG5ldGlmX3dha2VfcXVldWUoIGxwLT5kZXYgKTsKKyAgICAgICAgICAgICAgICAgICAgV0xfV0RTX05FVElGX1dBS0VfUVVFVUUoIGxwICk7CisgICAgICAgICAgICAgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGxwLT50eEYuc2tiID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgZGV2aWNlIGhhcyByZXNvdXJjZXMgKEZJRHMpIGF2YWlsYWJsZSwgdGhlbiBUeCB0aGUgcGFja2V0ICovCisgICAgLyogRm9ybWF0IHRoZSBUeFJlcXVlc3QgYW5kIHNlbmQgaXQgdG8gdGhlIGFkYXB0ZXIgKi8KKyAgICBsZW4gPSBscC0+dHhGLnNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IGxwLT50eEYuc2tiLT5sZW47CisKKyAgICBkZXNjICAgICAgICAgICAgICAgICAgICA9ICYoIGxwLT5kZXNjX3R4ICk7CisgICAgZGVzYy0+YnVmX2FkZHIgICAgICAgICAgPSBscC0+dHhGLnNrYi0+ZGF0YTsKKyAgICBkZXNjLT5CVUZfQ05UICAgICAgICAgICA9IGxlbjsKKyAgICBkZXNjLT5uZXh0X2Rlc2NfYWRkciAgICA9IE5VTEw7CisKKyAgICBzdGF0dXMgPSBoY2Zfc2VuZF9tc2coICYoIGxwLT5oY2ZDdHggKSwgZGVzYywgbHAtPnR4Ri5wb3J0ICk7CisKKyAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworICAgICAgICBscC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKyAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiVHJhbnNtaXQuLi5cbiIgKTsKKworICAgICAgICBpZiggbHAtPnR4Ri5wb3J0ID09IEhDRl9QT1JUXzAgKSB7CisgICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICAgICAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT50eEYuc2tiLT5sZW47CisgICAgICAgIH0KKworI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICBscC0+d2RzX3BvcnRbKCggbHAtPnR4Ri5wb3J0ID4+IDggKSAtIDEpXS5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhGLnNrYi0+bGVuOworICAgICAgICB9CisKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgICAgIC8qIEZyZWUgdGhlIHNrYiBhbmQgcGVyZm9ybSBxdWV1ZSBjbGVhbnVwLCBhcyB0aGUgYnVmZmVyIHdhcworICAgICAgICAgICAgdHJhbnNtaXR0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgICAgIGRldl9rZnJlZV9za2IoIGxwLT50eEYuc2tiICk7CisKKyAgICAgICAgbHAtPnR4Ri5za2IgPSBOVUxMOworICAgICAgICBscC0+dHhGLnBvcnQgPSAwOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfSAvLyB3bF9zZW5kCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHgoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgVHggaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIG5ldHdvcmsgbGF5ZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gdHJhbnNmZXIuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHgoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0ICkKK3sKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgV1ZMQU5fTEZSQU1FICAgICAgICAgICAgKnR4RiA9IE5VTEw7CisgICAgc3RydWN0IGxpc3RfaGVhZCAgICAgICAgKmVsZW1lbnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF90eCIgKTsKKworICAgIC8qIEdyYWIgdGhlIHNwaW5sb2NrICovCisgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgaWYoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApIHsKKyAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJVSUwgaGFzIGRldmljZSBibG9ja2VkXG4iICk7CisgICAgICAgIC8qIFN0YXJ0IGRyb3BwaW5nIHBhY2tldHMgaGVyZT8/PyAqLworCXdsX3VubG9jayggbHAsICZmbGFncyApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyNpZmRlZiBVU0VfUlRTCisgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKyAgICAgICAgREJHX1BSSU5UKCAiUlRTOiB3ZSdyZSBnZXR0aW5nIGEgVHguLi5cbiIgKTsKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmICAvKiBVU0VfUlRTICovCisKKyAgICBpZiggIWxwLT51c2VfZG1hICkgeworICAgICAgICAvKiBHZXQgYW4gZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSAqLworICAgICAgICBlbGVtZW50ID0gbHAtPnR4RnJlZS5uZXh0OworICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICopbGlzdF9lbnRyeSggZWxlbWVudCwgV1ZMQU5fTEZSQU1FLCBub2RlICk7CisgICAgICAgIGlmKCB0eEYgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByb2JsZW0gd2l0aCBsaXN0X2VudHJ5XG4iICk7CisJICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCisgICAgICAgIHR4Ri0+ZnJhbWUuc2tiID0gc2tiOworICAgICAgICB0eEYtPmZyYW1lLnBvcnQgPSBwb3J0OworICAgICAgICAvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCisgICAgICAgIC8qIE5PVEU6IEhlcmUncyB3aGVyZSB3ZSB3b3VsZCBkbyBwcmlvcml0eSBxdWV1ZWluZyAqLworICAgICAgICBsaXN0X2RlbCggJiggdHhGLT5ub2RlICkpOworICAgICAgICBsaXN0X2FkZCggJiggdHhGLT5ub2RlICksICYoIGxwLT50eFFbMF0gKSk7CisKKyAgICAgICAgbHAtPnR4UV9jb3VudCsrOworICAgICAgICBpZiggbHAtPnR4UV9jb3VudCA+PSBERUZBVUxUX05VTV9UWF9GUkFNRVMgKSB7CisgICAgICAgICAgICBEQkdfVFgoIERiZ0luZm8sICJRIEZ1bGw6ICVkXG4iLCBscC0+dHhRX2NvdW50ICk7CisgICAgICAgICAgICBpZiggbHAtPm5ldGlmX3F1ZXVlX29uID09IFRSVUUgKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPmRldiApOworICAgICAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworICAgICAgICAgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOyAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKworICAgIC8qIFNlbmQgdGhlIGRhdGEgdG8gdGhlIGhhcmR3YXJlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgKi8KKyNpZmRlZiBFTkFCTEVfRE1BCisgICAgaWYoIGxwLT51c2VfZG1hICkgeworICAgICAgICB3bF9zZW5kX2RtYSggbHAsIHNrYiwgcG9ydCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIHdsX3NlbmQoIGxwICk7CisgICAgfQorICAgIC8qIFJlLWVuYWJsZSBJbnRlcnJ1cHRzLCByZWxlYXNlIHRoZSBzcGlubG9jayBhbmQgcmV0dXJuICovCisgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKKyAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfdHgKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9yeCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgcmVjZXB0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICAxIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHBvcnQ7CisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICAgKnNrYjsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgIHBrdGxlbjsKKyAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICBoZnNfc3RhdDsKKyAgICBERVNDX1NUUkNUICAgICAgICAgICAgICAqZGVzYzsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQygid2xfcngiKQorICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKworICAgIGlmKCEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJSVFM6IFdlJ3JlIGdldHRpbmcgYW4gUnguLi5cbiIgKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCisgICAgICAgIGhmc19zdGF0ID0gKGhjZl8xNikoKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVQgKyAxXSA8PCA4ICkpOworCisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCisgICAgICAgIGlmKCggaGZzX3N0YXQgJiBIRlNfU1RBVF9FUlIgKSAhPSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXSApOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKworICAgICAgICAvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLworICAgICAgICBwb3J0ID0gKCBoZnNfc3RhdCA+PiA4ICkgJiAweDAwMDc7CisgICAgICAgIERCR19SWCggRGJnSW5mbywgIlJ4IGZyYW1lIGZvciBwb3J0ICVkXG4iLCBwb3J0ICk7CisKKyAgICAgICAgaWYoKCBwa3RsZW4gPSBscC0+aGNmQ3R4LklGQl9SeExlbiApICE9IDAgKSB7CisgICAgICAgICAgICBpZigoIHNrYiA9IEFMTE9DX1NLQiggcGt0bGVuICkpICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBuZXRkZXYgYmFzZWQgb24gdGhlIHBvcnQgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2goIHBvcnQgKSB7CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGxwLT53ZHNfcG9ydFtwb3J0LTFdLmRldjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVzYyA9ICYoIGxwLT5kZXNjX3J4ICk7CisKKyAgICAgICAgICAgICAgICBkZXNjLT5uZXh0X2Rlc2NfYWRkciA9IE5VTEw7CisKKy8qCisjZGVmaW5lIEJMT0NLX0lOUFVUKGJ1ZiwgbGVuKSBcCisgICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKKyAgICBkZXNjLT5CVUZfU0laRSA9IGxlbjsgXAorICAgIHN0YXR1cyA9IGhjZl9yY3ZfbXNnKCYobHAtPmhjZkN0eCksIGRlc2MsIDApCisqLworCisgICAgICAgICAgICAgICAgR0VUX1BBQ0tFVCggc2tiLT5kZXYsIHNrYiwgcGt0bGVuICk7CisKKyAgICAgICAgICAgICAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworICAgICAgICAgICAgICAgICAgICBuZXRpZl9yeCggc2tiICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAorI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgICAgICAgICAgICAgICAgICBpZiggbHAtPnNweWRhdGEuc3B5X251bWJlciA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzcmNhZGRyID0gc2tiLT5tYWMucmF3ICsgTUFDX0FERFJfU0laRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2xfc3B5X2dhdGhlciggZGV2LCBzcmNhZGRyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJSeCByZXF1ZXN0IHRvIGNhcmQgRkFJTEVEXG4iICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBVU0VfV0RTCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBza2JcbiIgKTsKKworICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfcngKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9tdWx0aWNhc3QoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGdW5jdGlvbiB0byBoYW5kbGUgbXVsdGljYXN0IHBhY2tldHMKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIE5FV19NVUxUSUNBU1QKKwordm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBIC8vOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlCisvLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKKworICAgIGludCAgICAgICAgICAgICAgICAgeDsKKyAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgICptY2xpc3Q7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX211bHRpY2FzdCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKKworICAgIGlmKCAhd2xfYWRhcHRlcl9pc19vcGVuKCBkZXYgKSkgeworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERCRworICAgIGlmKCBEQkdfRkxBR1MoIERiZ0luZm8gKSAmIERCR19QQVJBTV9PTiApIHsKKyAgICAgICAgREJHX1BSSU5UKCIgIGZsYWdzOiAlcyVzJXNcbiIsCisgICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApID8gIlByb21pc2NvdXMgIiA6ICIiLAorICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX01VTFRJQ0FTVCApID8gIk11bHRpY2FzdCAiIDogIiIsCisgICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiICk7CisKKyAgICAgICAgREJHX1BSSU5UKCAiICBtY19jb3VudDogJWRcbiIsIGRldi0+bWNfY291bnQgKTsKKworICAgICAgICBmb3IoIHggPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiB4IDwgZGV2LT5tY19jb3VudDsKKyAgICAgICAgICAgICB4KyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCApIHsKKyAgICAgICAgICAgIERCR19QUklOVCggIiAgICAlcyAoJWQpXG4iLCBEYmdId0FkZHIobWNsaXN0LT5kbWlfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgIG1jbGlzdC0+ZG1pX2FkZHJsZW4gKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBEQkcgKi8KKworICAgIGlmKCEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CisKKyNpZmRlZiBVU0VfUlRTCisgICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBtdWx0aWNhc3QsIGluIFJUUyBtb2RlXG4iICk7CisKKyAgICAgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9SVFMgKi8KKworICAgICAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CisgICAgICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKyAgICAgICAgICAgIGlmKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7CisgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgUHJvbWlzY3VvdXMgbW9kZSAoSUZGX1BST01JU0MpXG4iICk7CisgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCggZGV2LT5tY19jb3VudCA+IEhDRl9NQVhfTVVMVElDQVNUICkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkpIHsKKyAgICAgICAgICAgICAgICAvKiBTaHV0dGluZyBvZmYgdGhpcyBmaWx0ZXIgd2lsbCBlbmFibGUgYWxsIG11bHRpY2FzdCBmcmFtZXMgdG8KKyAgICAgICAgICAgICAgICAgICBiZSBzZW50IHVwIGZyb20gdGhlIGRldmljZTsgaG93ZXZlciwgdGhpcyBpcyBhIHN0YXRpYyBSSUQsIHNvCisgICAgICAgICAgICAgICAgICAgYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX0NORl9SWF9BTExfR1JPVVBfQUREUjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CisgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiRW5hYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7CisgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisgICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBkZXYtPm1jX2NvdW50ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAoIGRldi0+bWNfY291bnQgKiAzICkgKyAxOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0dST1VQX0FERFI7CisKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisgICAgICAgICAgICAgICAgKCB4IDwgZGV2LT5tY19jb3VudCApICYmICggbWNsaXN0ICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgeCsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQgKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggJiggbHAtPmx0dlJlY29yZC51LnU4W3ggKiBFVEhfQUxFTl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtY2xpc3QtPmRtaV9hZGRyLCBFVEhfQUxFTiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJTZXR0aW5nIG11bHRpY2FzdCBsaXN0XG4iICk7CisgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19QUk9NSVNDVU9VU19NT0RFOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKyAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgUHJvbWlzY3VvdXMgbW9kZVxuIiApOworICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisgICAgICAgICAgICAgICAgLyogRGlzYWJsZSBtdWx0aWNhc3QgbW9kZSAqLworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMjsKKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOworICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBNdWx0aWNhc3QgbW9kZVxuIiApOworICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisgICAgICAgICAgICAgICAgLyogVHVybmluZyBvbiB0aGlzIGZpbHRlciB3aWxsIHByZXZlbnQgYWxsIG11bHRpY2FzdCBmcmFtZXMgZnJvbQorICAgICAgICAgICAgICAgICAgIGJlaW5nIHNlbnQgdXAgZnJvbSB0aGUgZGV2aWNlOyBob3dldmVyLCB0aGlzIGlzIGEgc3RhdGljIFJJRCwKKyAgICAgICAgICAgICAgICAgICBzbyBhIGNhbGwgdG8gd2xfYXBwbHkoKSBpcyBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisgICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfQ05GX1JYX0FMTF9HUk9VUF9BRERSOworICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDEgKTsKKyAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7CisgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisgICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKKwl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKyAgICB9CisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisjZW5kaWYgLyogSENGX1NUQSAqLworfSAvLyB3bF9tdWx0aWNhc3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbHNlIC8qIE5FV19NVUxUSUNBU1QgKi8KKwordm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fYWRkcnMsIHZvaWQgKmFkZHJzICkKK3sKKyAgICBEQkdfRlVOQyggIndsX211bHRpY2FzdCIpOworICAgIERCR19FTlRFUihEYmdJbmZvKTsKKworICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgIm51bV9hZGRycyIsICIlZCIsIG51bV9hZGRycyApOworICAgIERCR19QQVJBTSggRGJnSW5mbywgImFkZHJzIiwgIjB4JXAiLCBhZGRycyApOworCisjZXJyb3IgT2Jzb2xldGUgc2V0IG11bHRpY2FzdCBpbnRlcmZhY2UhCisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gd2xfbXVsdGljYXN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgLyogTkVXX01VTFRJQ0FTVCAqLworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkpCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHdsX25ldGRldl9vcHMgPQoreworICAgIC5uZG9fc3RhcnRfeG1pdCAgICAgICAgID0gJndsX3R4X3BvcnQwLAorCisgICAgLm5kb19zZXRfY29uZmlnICAgICAgICAgPSAmd2xfY29uZmlnLAorICAgIC5uZG9fZ2V0X3N0YXRzICAgICAgICAgID0gJndsX3N0YXRzLAorICAgIC5uZG9fc2V0X211bHRpY2FzdF9saXN0ID0gJndsX211bHRpY2FzdCwKKworICAgIC5uZG9faW5pdCAgICAgICAgICAgICAgID0gJndsX2luc2VydCwKKyAgICAubmRvX29wZW4gICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX29wZW4sCisgICAgLm5kb19zdG9wICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9jbG9zZSwKKyAgICAubmRvX2RvX2lvY3RsICAgICAgICAgICA9ICZ3bF9pb2N0bCwKKworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIC5uZG9fdHhfdGltZW91dCAgICAgICAgID0gJndsX3R4X3RpbWVvdXQsCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgLm5kb19wb2xsX2NvbnRyb2xsZXIgICAgPSB3bF9wb2xsLAorI2VuZGlmCit9OworI2VuZGlmIC8vIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMzApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZGV2aWNlX2FsbG9jKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ3JlYXRlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIGFuZCB3bF9wcml2YXRlIGZvciB0aGUgbmV3IGFkYXB0ZXIKKyAqICBhbmQgcmVnaXN0ZXIgdGhlIGRldmljZSdzIGVudHJ5IHBvaW50cyBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBOL0EKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIG5ldF9kZXZpY2Ugc3RydWN0IGZvciB0aGlzCisgKiAgICAgIGRldmljZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG5ldF9kZXZpY2UgKiB3bF9kZXZpY2VfYWxsb2MoIHZvaWQgKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IE5VTEw7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfZGV2aWNlX2FsbG9jIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogQWxsb2MgYSBuZXRfZGV2aWNlIHN0cnVjdCAqLworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgd2xfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlICduZXh0JyBwb2ludGVyIGluIHRoZSBzdHJ1Y3QuIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFBDSSwKKyAgICAgICBidXQgZG8gaXQgaGVyZSBqdXN0IGluIGNhc2UgaXQncyB1c2VkIGZvciBvdGhlciBidXNlcyBpbiB0aGUgZnV0dXJlICovCisgICAgbHAgPSB3bF9wcml2KGRldik7CisKKworICAgIC8qIENoZWNrIE1UVSAqLworICAgIGlmKCBkZXYtPm10dSA+IE1UVV9NQVggKQorICAgIHsKKwkgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlczogTVRVIHNldCB0b28gaGlnaCwgbGltaXRpbmcgdG8gJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBNVFVfTUFYICk7CisgICAgCWRldi0+bXR1ID0gTVRVX01BWDsKKyAgICB9CisKKyAgICAvKiBTZXR1cCB0aGUgZnVuY3Rpb24gdGFibGUgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisKKyAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3bF9pd19oYW5kbGVyX2RlZjsKKyAgICBscC0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZscC0+c3B5X2RhdGE7CisgICAgZGV2LT53aXJlbGVzc19kYXRhID0gJmxwLT53aXJlbGVzc19kYXRhOworCisjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNiwzMCkpCisgICAgZGV2LT5uZXRkZXZfb3BzID0gJndsX25ldGRldl9vcHM7CisjZWxzZQorICAgIGRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gJndsX3R4X3BvcnQwOworCisgICAgZGV2LT5zZXRfY29uZmlnICAgICAgICAgPSAmd2xfY29uZmlnOworICAgIGRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gJndsX3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJndsX211bHRpY2FzdDsKKworICAgIGRldi0+aW5pdCAgICAgICAgICAgICAgID0gJndsX2luc2VydDsKKyAgICBkZXYtPm9wZW4gICAgICAgICAgICAgICA9ICZ3bF9hZGFwdGVyX29wZW47CisgICAgZGV2LT5zdG9wICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9jbG9zZTsKKyAgICBkZXYtPmRvX2lvY3RsICAgICAgICAgICA9ICZ3bF9pb2N0bDsKKworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCAgICAgICAgID0gJndsX3R4X3RpbWVvdXQ7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSB3bF9wb2xsOworI2VuZGlmCisKKyNlbmRpZiAvLyAoTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKSkKKworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKKyNlbmRpZgorCisgICAgZGV2LT5ldGh0b29sX29wcwkgICAgPSAmd2xfZXRodG9vbF9vcHM7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKKworICAgIC8qIEFsbG9jYXRlIHZpcnV0YWwgZGV2aWNlcyBmb3IgV0RTIHN1cHBvcnQgaWYgbmVlZGVkICovCisgICAgV0xfV0RTX0RFVklDRV9BTExPQyggbHAgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiBkZXY7Cit9IC8vIHdsX2RldmljZV9hbGxvYworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2RldmljZV9kZWFsbG9jKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnJlZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBhbmQgd2xfcHJpdmF0ZSBzdHJjdXRyZXMgZm9yIGFuIGFkYXB0ZXIKKyAqICBhbmQgcGVyZm9ybSBiYXNpYyBjbGVhbnVwLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKy8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfZGV2aWNlX2RlYWxsb2MiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBEZWFsbG9jIHRoZSBXRFMgcG9ydHMgKi8KKyAgICBXTF9XRFNfREVWSUNFX0RFQUxMT0MoIGxwICk7CisKKyAgICBmcmVlX25ldGRldiggZGV2ICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX2RldmljZV9kZWFsbG9jCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDAoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzAuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8wLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0MCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAwXG4iICk7CisKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CisjaWZkZWYgRU5BQkxFX0RNQQorICAgIHJldHVybiB3bF90eF9kbWEoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CisjZW5kaWYKK30gLy8gd2xfdHhfcG9ydDAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZmRlZiBVU0VfV0RTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0MSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfMS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzEuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQxKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDFcbiIgKTsKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8xICk7Cit9IC8vIHdsX3R4X3BvcnQxCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF8yLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0Miggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCAyXG4iICk7CisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfMiApOworfSAvLyB3bF90eF9wb3J0MgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8zLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMy4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDMoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgM1xuIiApOworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzMgKTsKK30gLy8gd2xfdHhfcG9ydDMKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF90eF9wb3J0NCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSBoYW5kbGVyIHJvdXRpbmUgZm9yIFR4IG92ZXIgSENGX1BPUlRfNC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3R4X3BvcnQ0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDRcbiIgKTsKKyAgICByZXR1cm4gd2xfdHgoIHNrYiwgZGV2LCBIQ0ZfUE9SVF80ICk7Cit9IC8vIHdsX3R4X3BvcnQ0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfdHhfcG9ydDUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyBIQ0ZfUE9SVF81LgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF90eF9wb3J0NSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgREJHX1RYKCBEYmdJbmZvLCAiVHggb24gUG9ydCA1XG4iICk7CisgICAgcmV0dXJuIHdsX3R4KCBza2IsIGRldiwgSENGX1BPUlRfNSApOworfSAvLyB3bF90eF9wb3J0NQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3R4X3BvcnQ2KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF82LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHRvIHRyYW5zbWl0LgorICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfNi4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfdHhfcG9ydDYoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgNlxuIiApOworICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzYgKTsKK30gLy8gd2xfdHhfcG9ydDYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfZGV2aWNlX2FsbG9jKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ3JlYXRlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIHRvIHJlcHJlc2VudCB0aGUgV0RTIHBvcnRzLCBhbmQgcmVnaXN0ZXIKKyAqICB0aGUgZGV2aWNlJ3MgZW50cnkgcG9pbnRzIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BLCBidXQgd2lsbCBwbGFjZSBwb2ludGVycyB0byB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBuZXRfZGV2aWNlCisgKiAgICAgIHN0cnVjdHMgaW4gdGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX2RldmljZV9hbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF93ZHNfZGV2aWNlX2FsbG9jIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogV0RTIHN1cHBvcnQgcmVxdWlyZXMgYWRkaXRpb25hbCBuZXRfZGV2aWNlIHN0cnVjdHMgdG8gYmUgYWxsb2NhdGVkLAorICAgICAgIHNvIHRoYXQgdXNlciBzcGFjZSBhcHBzIGNhbiB1c2UgdGhlc2UgdmlydHVhbCBkZXZpY2VzIHRvIHNwZWNpZnkgdGhlCisgICAgICAgcG9ydCBvbiB3aGljaCB0byBUeC9SeCAqLworICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfd2RzID0gTlVMTDsKKworICAgICAgICBkZXZfd2RzID0ga21hbGxvYyggc2l6ZW9mKCBzdHJ1Y3QgbmV0X2RldmljZSApLCBHRlBfS0VSTkVMICk7CisgICAgICAgIG1lbXNldCggZGV2X3dkcywgMCwgc2l6ZW9mKCBzdHJ1Y3QgbmV0X2RldmljZSApKTsKKworICAgICAgICBldGhlcl9zZXR1cCggZGV2X3dkcyApOworCisgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gZGV2X3dkczsKKworICAgICAgICAvKiBSZS11c2Ugd2xfaW5pdCBmb3IgYWxsIHRoZSBkZXZpY2VzLCBhcyBpdCBjdXJyZW50bHkgZG9lcyBub3RoaW5nLCBidXQKKyAgICAgICAgICAgaXMgcmVxdWlyZWQuIFJlLXVzZSB0aGUgc3RhdHMvdHhfdGltZW91dCBoYW5kbGVyIGZvciBhbGwgYXMgd2VsbDsgdGhlCisgICAgICAgICAgIFdEUyBwb3J0IHdoaWNoIGlzIHJlcXVlc3RpbmcgdGhlc2Ugb3BlcmF0aW9ucyBjYW4gYmUgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICB0aGUgbmV0X2RldmljZSBwb2ludGVyLiBTZXQgdGhlIHByaXZhdGUgbWVtYmVyIG9mIGFsbCBkZXZpY2VzIHRvIHBvaW50CisgICAgICAgICAgIHRvIHRoZSBzYW1lIG5ldF9kZXZpY2Ugc3RydWN0OyB0aGF0IHdheSwgYWxsIGluZm9ybWF0aW9uIGdldHMKKyAgICAgICAgICAgZnVubmVsbGVkIHRocm91Z2ggdGhlIG9uZSAicmVhbCIgbmV0X2RldmljZS4gTmFtZSB0aGUgV0RTIHBvcnRzCisgICAgICAgICAgICJ3ZHM8bj4iICovCisgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5pbml0ICAgICAgICAgICA9ICZ3bF9pbml0OworICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+Z2V0X3N0YXRzICAgICAgPSAmd2xfc3RhdHM7CisgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT50eF90aW1lb3V0ICAgICA9ICZ3bF90eF90aW1lb3V0OworICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+cHJpdiAgICAgICAgICAgPSBscDsKKworICAgICAgICBzcHJpbnRmKCBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+bmFtZSwgIndkcyVkIiwgY291bnQgKTsKKyAgICB9CisKKyAgICAvKiBSZWdpc3RlciB0aGUgVHggaGFuZGxlcnMgKi8KKyAgICBscC0+d2RzX3BvcnRbMF0uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDE7CisgICAgbHAtPndkc19wb3J0WzFdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQyOworICAgIGxwLT53ZHNfcG9ydFsyXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MzsKKyAgICBscC0+d2RzX3BvcnRbM10uZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmd2xfdHhfcG9ydDQ7CisgICAgbHAtPndkc19wb3J0WzRdLmRldi0+aGFyZF9zdGFydF94bWl0ID0gJndsX3R4X3BvcnQ1OworICAgIGxwLT53ZHNfcG9ydFs1XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NjsKKworICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF93ZHNfZGV2aWNlX2FsbG9jCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX2RldmljZV9kZWFsbG9jKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnJlZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBzdHJ1Y3R1cmVzIHVzZWQgdG8gc3VwcG9ydCBXRFMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19kZXZpY2VfZGVhbGxvYyggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF93ZHNfZGV2aWNlX2RlYWxsb2MiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CisKKyAgICAgICAgZGV2X3dkcyA9IGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2OworCisgICAgICAgIGlmKCBkZXZfd2RzICE9IE5VTEwgKSB7CisgICAgICAgICAgICBpZiggZGV2X3dkcy0+ZmxhZ3MgJiBJRkZfVVAgKSB7CisgICAgICAgICAgICAgICAgZGV2X2Nsb3NlKCBkZXZfd2RzICk7CisgICAgICAgICAgICAgICAgZGV2X3dkcy0+ZmxhZ3MgJj0gfiggSUZGX1VQIHwgSUZGX1JVTk5JTkcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAga2ZyZWUoIGRldl93ZHMgKTsKKyAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX2RldmljZV9kZWFsbG9jCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBzdGFydCB0aGUgbmV0aWYgcXVldWVzIG9mIGFsbCB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcworICogICAgICB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgorICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfc3RhcnRfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CisgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBzdG9wIHRoZSBuZXRpZiBxdWV1ZXMgb2YgYWxsIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzCisgKiAgICAgIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCBjb3VudDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKKyAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKKyAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IFRSVUUgKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKKyAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGlmX3dha2VfcXVldWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBVc2VkIHRvIHdha2UgdGhlIG5ldGlmIHF1ZXVlcyBvZiBhbGwgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMKKyAqICAgICAgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCAmJgorICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CisgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKKyAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX25ldGlmX3dha2VfcXVldWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZHNfbmV0aWZfY2Fycmllcl9vbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFVzZWQgdG8gc2lnbmFsIHRoZSBuZXR3b3JrIGxheWVyIHRoYXQgY2FycmllciBpcyBwcmVzZW50IG9uIGFsbCBvZiB0aGUKKyAqICAgICAgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcyB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vbiggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CisgICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICkgeworICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24oIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVXNlZCB0byBzaWduYWwgdGhlIG5ldHdvcmsgbGF5ZXIgdGhhdCBjYXJyaWVyIGlzIE5PVCBwcmVzZW50IG9uIGFsbCBvZgorICogICAgICB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcyB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGNvdW50OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgeworICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCApIHsKKyAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29mZiggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30gLy8gd2xfd2RzX25ldGlmX2NhcnJpZXJfb2ZmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworI2lmZGVmIEVOQUJMRV9ETUEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9zZW5kX2RtYSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgdHJhbnNtaXRzIHdoZW4gdXNpbmcgYnVzbWFzdGVyIERNQS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0LgorICogICAgICBza2IgIC0gYSBwb2ludGVyIHRvIHRoZSBuZXR3b3JrIGxheWVyJ3MgZGF0YSBidWZmZXIuCisgKiAgICAgIHBvcnQgLSB0aGUgSGVybWVzIHBvcnQgb24gd2hpY2ggdG8gdHJhbnNtaXQuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfc2VuZF9kbWEoIHN0cnVjdCB3bF9wcml2YXRlICpscCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBvcnQgKQoreworICAgIGludCAgICAgICAgIGxlbjsKKyAgICBERVNDX1NUUkNUICpkZXNjID0gTlVMTDsKKyAgICBERVNDX1NUUkNUICpkZXNjX25leHQgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfc2VuZF9kbWEiICk7CisKKyAgICBpZiggbHAgPT0gTlVMTCApCisgICAgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmKCBscC0+ZGV2ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBBR0FJTiwgQUxMIFRIRSBRVUVVRUlORyBET05FIEhFUkUgSU4gSS9PIE1PREUgSVMgTk9UIFBFUkZPUk1FRCAqLworCisgICAgaWYoIHNrYiA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIERCR19XQVJOSU5HIChEYmdJbmZvLCAiTm90aGluZyB0byBzZW5kLlxuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBsZW4gPSBza2ItPmxlbjsKKworICAgIC8qIEdldCBhIGZyZWUgZGVzY3JpcHRvciAqLworICAgIGRlc2MgPSB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoIGxwICk7CisKKyAgICBpZiggZGVzYyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKKyAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT5kZXYgKTsKKyAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOworICAgICAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CisKKyAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRVRfQlVGX0NOVCggZGVzYywgLypIQ0ZfRE1BX0ZEX0NOVCovSEZTX0FERFJfREVTVCApOworICAgIFNFVF9CVUZfU0laRSggZGVzYywgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKKworICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOworCisgICAgaWYoIGRlc2NfbmV4dC0+YnVmX2FkZHIgPT0gTlVMTCApCisgICAgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJETUEgZGVzY3JpcHRvciBidWZfYWRkciBpcyBOVUxMXG4iICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBDb3B5IHRoZSBwYXlsb2FkIGludG8gdGhlIERNQSBwYWNrZXQgKi8KKyAgICBtZW1jcHkoIGRlc2NfbmV4dC0+YnVmX2FkZHIsIHNrYi0+ZGF0YSwgbGVuICk7CisKKyAgICBTRVRfQlVGX0NOVCggZGVzY19uZXh0LCBsZW4gKTsKKyAgICBTRVRfQlVGX1NJWkUoIGRlc2NfbmV4dCwgSENGX01BWF9QQUNLRVRfU0laRSApOworCisgICAgaGNmX2RtYV90eF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYywgMCApOworCisgICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCisgICAgICAgICAgICB0cmFuc21pdHRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBkZXZfa2ZyZWVfc2tiKCBza2IgKTsKKworICAgIHJldHVybiBUUlVFOworfSAvLyB3bF9zZW5kX2RtYQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3J4X2RtYSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgcmVjZXB0aW9uIHdoZW4gdXNpbmcgYnVzbWFzdGVyIERNQS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgMSBvbiBlcnJvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcnhfZG1hKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcG9ydDsKKyAgICBoY2ZfMTYgICAgICAgICAgICAgICAgICAgcGt0bGVuOworICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBoZnNfc3RhdDsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOworICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IE5VTEw7CisgICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2MsICpkZXNjX25leHQ7CisgICAgLy9DRkdfTUJfSU5GT19SQU5HRTJfU1RSQ1QgeDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQygid2xfcngiKQorICAgIERCR19QQVJBTShEYmdJbmZvLCAiZGV2IiwgIiVzICgweCVwKSIsIGRldi0+bmFtZSwgZGV2KTsKKworICAgIGlmKCgoIGxwID0gKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2ICkgIT0gTlVMTCApICYmCisgICAgICAgICAgISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpIHsKKworI2lmZGVmIFVTRV9SVFMKKyAgICAgICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKKyAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyNlbmRpZiAgLyogVVNFX1JUUyAqLworCisgICAgICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQorICAgICAgICAvL3sKKyAgICAgICAgICAgIGRlc2MgPSBoY2ZfZG1hX3J4X2dldCggJiggbHAtPmhjZkN0eCApKTsKKworICAgICAgICAgICAgaWYoIGRlc2MgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2hlY2sgYW5kIHNlZSBpZiB3ZSByY3ZkLiBhIFdNUCBmcmFtZSAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgaWYoKCggKihoY2ZfOCAqKSZkZXNjLT5idWZfYWRkcltIRlNfU1RBVF0gKSAmCisgICAgICAgICAgICAgICAgICAgICggSEZTX1NUQVRfTVNHX1RZUEUgfCBIRlNfU1RBVF9FUlIgKSkgPT0gSEZTX1NUQVRfV01QX01TRyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJHb3QgYSBXTVAgZnJhbWVcbiIgKTsKKworICAgICAgICAgICAgICAgICAgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJCSAgICB4LnR5cCA9IENGR19NQl9JTkZPOworCQkJCSAgICB4LmJhc2VfdHlwID0gQ0ZHX1dNUDsKKwkJCQkgICAgeC5mcmFnX2NudCA9IDI7CisJCQkJICAgIHguZnJhZ19idWZbMF0uZnJhZ19sZW4gID0gR0VUX0JVRl9DTlQoIGRlc2NwICkgLyBzaXplb2YoIGhjZl8xNiApOworCQkJCSAgICB4LmZyYWdfYnVmWzBdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+YnVmX2FkZHIgOworCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKKwkJCQkgICAgeC5mcmFnX2J1ZlsxXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkciA7CisKKyAgICAgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSZ4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKKworICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzbid0IGVtcHR5ICovCisgICAgICAgICAgICAgICAgaWYoIEdFVF9CVUZfQ05UKCBkZXNjICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJCdWZmZXIgaXMgZW1wdHkhXG4iICk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KKyAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgaGZzX3N0YXQgPSAoaGNmXzE2KSggZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQvMl0gKTsKKworICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCisgICAgICAgICAgICAgICAgaWYoKCBoZnNfc3RhdCAmIEhGU19TVEFUX0VSUiApICE9IEhDRl9TVUNDRVNTICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+YnVmX2FkZHJbSEZTX1NUQVQvMl0gKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLworICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIERldGVybWluZSB3aGF0IHBvcnQgdGhpcyBwYWNrZXQgaXMgZm9yICovCisgICAgICAgICAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OworICAgICAgICAgICAgICAgIERCR19SWCggRGJnSW5mbywgIlJ4IGZyYW1lIGZvciBwb3J0ICVkXG4iLCBwb3J0ICk7CisKKyAgICAgICAgICAgICAgICBpZigoIHBrdGxlbiA9IEdFVF9CVUZfQ05UKCBkZXNjX25leHQgKSkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKCBza2IgPSBBTExPQ19TS0IoIHBrdGxlbiApKSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwb3J0ICkgeworI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IGxwLT53ZHNfcG9ydFtwb3J0LTFdLmRldjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBHRVRfUEFDS0VUX0RNQSggc2tiLT5kZXYsIHNrYiwgcGt0bGVuICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdpdmUgdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgSENGICovCisgICAgICAgICAgICAgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX3J4KCBza2IgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgVVNFX1dEUworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkKKwkgICAgICAgICAgICAgICAgICAgIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCSAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIFVTRV9XRFMKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgLy99CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8vIHdsX3J4X2RtYQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZiAgLy8gRU5BQkxFX0RNQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJhYjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgbmV0d29yayBsYXllcmVudHJ5IHBvaW50cworICogICBpbnRvIHRoZSBkcml2ZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX05FVERFVl9IX18KKyNkZWZpbmUgX19XTF9ORVRERVZfSF9fCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9pbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwICk7CisKK3N0cnVjdCBuZXRfZGV2aWNlICp3bF9kZXZpY2VfYWxsb2MoIHZvaWQgKTsKKwordm9pZCB3bF9kZXZpY2VfZGVhbGxvYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbnQgd2xfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kICk7CisKK2ludCB3bF90eCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnQgKTsKKworaW50IHdsX3NlbmQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgd2xfcngoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKwordm9pZCB3bF90eF90aW1lb3V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCisKKyNpZmRlZiBFTkFCTEVfRE1BCitpbnQgd2xfc2VuZF9kbWEoIHN0cnVjdCB3bF9wcml2YXRlICpscCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBvcnQgKTsKK2ludCB3bF9yeF9kbWEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKyNlbmRpZgorCisjaWZkZWYgTkVXX01VTFRJQ0FTVAordm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKyNlbHNlCit2b2lkIHdsX211bHRpY2FzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgdm9pZCAqYWRkcnMgKTsKKyNlbmRpZiAvLyBORVdfTVVMVElDQVNUCisKKworaW50IHdsX3R4X3BvcnQwKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKKworI2lmZGVmIFVTRV9XRFMKKworaW50IHdsX3R4X3BvcnQxKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitpbnQgd2xfdHhfcG9ydDIoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK2ludCB3bF90eF9wb3J0Myggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworaW50IHdsX3R4X3BvcnQ0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitpbnQgd2xfdHhfcG9ydDUoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK2ludCB3bF90eF9wb3J0Niggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCit2b2lkIHdsX3dkc19kZXZpY2VfYWxsb2MoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworCisjaWZkZWYgVVNFX1dEUworCisjZGVmaW5lIFdMX1dEU19ERVZJQ0VfQUxMT0MoIEFSRyApICAgICAgd2xfd2RzX2RldmljZV9hbGxvYyggQVJHICkKKyNkZWZpbmUgV0xfV0RTX0RFVklDRV9ERUFMTE9DKCBBUkcgKSAgICB3bF93ZHNfZGV2aWNlX2RlYWxsb2MoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9TVEFSVF9RVUVVRSggQVJHICkgd2xfd2RzX25ldGlmX3N0YXJ0X3F1ZXVlKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggQVJHICkgIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggQVJHICkgIHdsX3dkc19uZXRpZl93YWtlX3F1ZXVlKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTiggQVJHICkgIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PRkYoIEFSRyApIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZiggQVJHICkKKworI2Vsc2UKKworI2RlZmluZSBXTF9XRFNfREVWSUNFX0FMTE9DKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfREVWSUNFX0RFQUxMT0MoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9TVEFSVF9RVUVVRSggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIEFSRyApCisjZGVmaW5lIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBBUkcgKQorI2RlZmluZSBXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTiggQVJHICkKKyNkZWZpbmUgV0xfV0RTX05FVElGX0NBUlJJRVJfT0ZGKCBBUkcgKQorCisjZW5kaWYgIC8qIFVTRV9XRFMgKi8KKworCisjZW5kaWYgIC8vIF9fV0xfTkVUREVWX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2RiMTExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcGNpLmMKQEAgLTAsMCArMSwxNTgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNwZWNpZmljIHRvIFBDSS9taW5pUENJCisgKiAgIGRldmljZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKy8vI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlIDxoY2YvZGVidWcuaD4KKworI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGRoZi5oPgorI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfaWYuaD4KKyNpbmNsdWRlIDx3aXJlbGVzcy93bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdpcmVsZXNzL3dsX3V0aWwuaD4KKyNpbmNsdWRlIDx3aXJlbGVzcy93bF9tYWluLmg+CisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfbmV0ZGV2Lmg+CisjaW5jbHVkZSA8d2lyZWxlc3Mvd2xfcGNpLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgREJHCitleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKKyNlbmRpZiAgLy8gREJHCisKKy8qIGRlZmluZSB0aGUgUENJIGRldmljZSBUYWJsZSBDYXJkbmFtZSBhbmQgaWQgdGFibGVzICovCitlbnVtIGhlcm1lc19wY2lfdmVyc2lvbnMgeworCUNIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHdsX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgV0xfTEtNX1BDSV9WRU5ET1JfSUQsIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKKyAgICB7IFdMX0xLTV9QQ0lfVkVORE9SX0lELCBXTF9MS01fUENJX0RFVklDRV9JRF8xLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxIH0sCisgICAgeyBXTF9MS01fUENJX1ZFTkRPUl9JRCwgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfQWdlcmVfU3lzdGVtc19NaW5pX1BDSV9WMSB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgd2xfcGNpX3RibCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IF9fZGV2aW5pdCB3bF9wY2lfcHJvYmUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICk7Cit2b2lkIF9fZGV2ZXhpdCB3bF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK2ludCB3bF9wY2lfc2V0dXAoIHN0cnVjdCBwY2lfZGV2ICpwZGV2ICk7Cit2b2lkIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApOworCisjaWZkZWYgRU5BQkxFX0RNQQoraW50IHdsX3BjaV9kbWFfYWxsb2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3bF9wY2lfZG1hX2ZyZWUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOworaW50IHdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjLCBpbnQgc2l6ZSApOworaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKK2ludCB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CitpbnQgd2xfcGNpX2RtYV9hbGxvY19idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MsIGludCBzaXplICk7CitpbnQgd2xfcGNpX2RtYV9mcmVlX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYyApOworCit2b2lkIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworI2VuZGlmICAvLyBFTkFCTEVfRE1BCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQQ0kgbW9kdWxlIGZ1bmN0aW9uIHJlZ2lzdHJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB3bF9kcml2ZXIgPQoreworCW5hbWU6CQlNT0RVTEVfTkFNRSwKKyAgICBpZF90YWJsZToJd2xfcGNpX3RibCwKKwlwcm9iZToJCXdsX3BjaV9wcm9iZSwKKwlyZW1vdmU6CQlfX2RldmV4aXRfcCh3bF9wY2lfcmVtb3ZlKSwKKyAgICBzdXNwZW5kOiAgICBOVUxMLAorICAgIHJlc3VtZTogICAgIE5VTEwsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9pbml0X21vZHVsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSBpbml0X21vZHVsZSgpIHRvIHBlcmZvcm0gUENJLXNwZWNpZmljIGRyaXZlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9pbml0X21vZHVsZSggdm9pZCApCit7CisgICAgaW50IHJlc3VsdDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJ3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCkgLS0gUENJXG4iICk7CisKKyAgICByZXN1bHQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCAmd2xfZHJpdmVyICk7IC8vOz9yZXBsYWNlIHdpdGggcGNpX21vZHVsZV9pbml0LCBSdWJpbmkgcGcgNDkwCisJLy87PyB3aHkgbm90IGRvIHNvbWV0aGluZyB3aXRoIHRoZSByZXN1bHQKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9hZGFwdGVyX2luaXRfbW9kdWxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpIHRvIHBlcmZvcm0gUENJLXNwZWNpZmljIGRyaXZlciBjbGVhbnVwLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgTi9BCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCB2b2lkICkKK3sKKwkvLzs/aG93IGNvbWVzIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUgaXMgbG9jYXRlZCBpbiBhIHNlZW1pbmdseSBwY2kgc3BlY2lmaWMgbW9kdWxlCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisJLy87P0RCR19UUkFDRSBiZWxvdyBmZWVscyBsaWtlIG5lYXJseSByZWR1bmRhbnQgaW4gdGhlIGxpZ2h0IG9mIERCR19FTlRFUiBhYm92ZQorICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKSAtLSBQQ0lcbiIgKTsKKworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlciggJndsX2RyaXZlciApOworCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9pbnNlcnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDYWxsZWQgYnkgd2xfcGNpX3Byb2JlKCkgdG8gY29udGludWUgdGhlIHByb2Nlc3Mgb2YgZGV2aWNlIGluc2VydGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRSVUUgb3IgRkFMU0UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfaW5zZXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBpbnQgcmVzdWx0ID0gRkFMU0U7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9hZGFwdGVyX2luc2VydCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfaW5zZXJ0KCkgLS0gUENJXG4iICk7CisKKyAgICBpZiggZGV2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIm5ldF9kZXZpY2UgcG9pbnRlciBpcyBOVUxMISEhXG4iICk7CisgICAgfSBlbHNlIGlmKCBkZXYtPnByaXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfcHJpdmF0ZSBwb2ludGVyIGlzIE5VTEwhISFcbiIgKTsKKyAgICB9IGVsc2UgaWYoIHdsX2luc2VydCggZGV2ICkgKSB7IC8qIFBlcmZvcm0gcmVtYWluaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiAqLworCQlyZXN1bHQgPSBUUlVFOworCX0gZWxzZSB7CisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2luc2VydCgpIEZBSUxFRFxuIiApOworICAgIH0KKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyB3bF9hZGFwdGVyX2luc2VydAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfb3BlbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIE9wZW4gdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGFuIEhDRiBzdGF0dXMgY29kZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyAgICBpbnQgICAgICAgICByZXN1bHQgPSAwOworICAgIGludCAgICAgICAgIGhjZl9zdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfb3BlbiIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfb3BlbigpIC0tIFBDSVxuIiApOworCisgICAgaGNmX3N0YXR1cyA9IHdsX29wZW4oIGRldiApOworCisgICAgaWYoIGhjZl9zdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgIHJlc3VsdCA9IC1FTk9ERVY7CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gd2xfYWRhcHRlcl9vcGVuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYWRhcHRlcl9jbG9zZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENsb3NlIHRoZSBkZXZpY2UKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbG9zZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xvc2UoKSAtLSBQQ0lcbiIgKTsKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIlczogU2h1dHRpbmcgZG93biBhZGFwdGVyLlxuIiwgZGV2LT5uYW1lICk7CisKKyAgICB3bF9jbG9zZSggZGV2ICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfYWRhcHRlcl9jbG9zZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2FkYXB0ZXJfaXNfb3BlbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENoZWNrIHdoZXRoZXIgdGhpcyBkZXZpY2UgaXMgb3Blbi4gUmV0dXJucworICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgbm9uemVybyBpZiBkZXZpY2UgaXMgb3Blbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2FkYXB0ZXJfaXNfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisgICAgLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIFBDTUNJQSB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSAnb3BlbicgZmllbGQKKyAgICAgICBpbiB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGEgbmV0d29yayBkZXZpY2UuIFRoZXJlCisgICAgICAgZG9lc24ndCBzZWVtIHRvIGJlIGFuIGFuYWxvZyB0byB0aGlzIGZvciBQQ0ksIGFuZCBjaGVja2luZyB0aGUgc3RhdHVzCisgICAgICAgY29udGFpbmVkIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgZWZmZWN0LgorICAgICAgIEZvciBub3csIHJldHVybiBUUlVFLCBidXQgZmluZCBvdXQgaWYgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIFBDSS4gKi8KKworICAgIHJldHVybiBUUlVFOworfSAvLyB3bF9hZGFwdGVyX2lzX29wZW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfcHJvYmUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZWdpc3RlcmVkIGluIHRoZSBwY2lfZHJpdmVyIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKKyAqICBQQ0kgc3Vic3lzdGVtIGZpbmRzIGEgbmV3IFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb21hdGlvbiBjb250YWluZWQKKyAqICBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGVudCAgICAgLSB0aGlzIGRldmljZSdzIGVudHJ5IGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBfX2RldmluaXQgd2xfcGNpX3Byb2JlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCApCit7CisgICAgaW50IHJlc3VsdDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9wcm9iZSIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfUFJJTlQoICIlc1xuIiwgVkVSU0lPTl9JTkZPICk7CisKKyAgICByZXN1bHQgPSB3bF9wY2lfc2V0dXAoIHBkZXYgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gd2xfcGNpX3Byb2JlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX3JlbW92ZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQorICogIFBDSSBzdWJzeXN0ZW0gZGV0ZWN0cyB0aGF0IGEgUENJIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBpbmZvbWF0aW9uCisgKiAgY29udGFpbmVkIGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlIGhhcyBiZWVuIHJlbW92ZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgX19kZXZleGl0IHdsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldiA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfcmVtb3ZlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBwY2lfZGV2IHBvaW50ZXIgcGFzc2VkIGluIGlzIHZhbGlkICovCisgICAgaWYoIHBkZXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUENJIHN1YnN5cyBwYXNzZWQgaW4gYW4gaW52YWxpZCBwY2lfZGV2IHBvaW50ZXJcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXBjaV9nZXRfZHJ2ZGF0YSggcGRldiApOworICAgIGlmKCBkZXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IHJldHJpZXZlIG5ldF9kZXZpY2Ugc3RydWN0dXJlXG4iICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIGRldmljZSBjbGVhbnVwICovCisgICAgd2xfcmVtb3ZlKCBkZXYgKTsKKyAgICBmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOworCisjaWZkZWYgRU5BQkxFX0RNQQorICAgIHdsX3BjaV9kbWFfZnJlZSggcGRldiwgKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2ICk7CisjZW5kaWYKKworICAgIHdsX2RldmljZV9kZWFsbG9jKCBkZXYgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcGNpX3JlbW92ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9zZXR1cCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSB3bF9wY2lfcHJvYmUoKSB0byBiZWdpbiBhIGRldmljZSdzIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX3NldHVwKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IE5VTEw7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSBOVUxMOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIERCR19GVU5DKCAid2xfcGNpX3NldHVwIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLyogTWFrZSBzdXJlIHRoZSBwY2lfZGV2IHBvaW50ZXIgcGFzc2VkIGluIGlzIHZhbGlkICovCisgICAgaWYoIHBkZXYgPT0gTlVMTCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUENJIHN1YnN5cyBwYXNzZWQgaW4gYW4gaW52YWxpZCBwY2lfZGV2IHBvaW50ZXJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgcmVzdWx0ID0gcGNpX2VuYWJsZV9kZXZpY2UoIHBkZXYgKTsKKyAgICBpZiggcmVzdWx0ICE9IDAgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgInBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkXG4iICk7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qIFdlIGZvdW5kIG91ciBkZXZpY2UhIExldCdzIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHN5c3RlbSAqLworICAgIERCR19UUkFDRSggRGJnSW5mbywgIkZvdW5kIG91ciBkZXZpY2UsIG5vdyByZWdpc3RlcmluZ1xuIiApOworICAgIGRldiA9IHdsX2RldmljZV9hbGxvYyggKTsKKyAgICBpZiggZGV2ID09IE5VTEwgKSB7CisgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UhISFcbiIgKTsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHNwYWNlIHdhcyBhbGxvY2F0ZWQgZm9yIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCisgICAgaWYoIGRldi0+cHJpdiA9PSBOVUxMICkgeworICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IHdhcyBub3QgYWxsb2NhdGVkISEhXG4iICk7CisgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyNpZmRlZiBFTkFCTEVfRE1BCisgICAgLyogQWxsb2NhdGUgRE1BIERlc2NyaXB0b3JzICovCisgICAgaWYoIHdsX3BjaV9kbWFfYWxsb2MoIHBkZXYsIChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdiApIDwgMCApIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jYXRlIERNQSBkZXNjcmlwdG9yIG1lbW9yeSEhIVxuIiApOworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBSZWdpc3RlciBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSB3aXRoIFBDSSAqLworICAgIHBjaV9zZXRfZHJ2ZGF0YSggcGRldiwgZGV2ICk7CisKKyAgICAvKiBGaWxsIG91dCBidXMgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCisgICAgZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisgICAgU0VUX01PRFVMRV9PV05FUiggZGV2ICk7CisKKyAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJEZXZpY2UgQmFzZSBBZGRyZXNzOiAlIzAzbHhcbiIsIHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0ICk7CisJZGV2LT5iYXNlX2FkZHIgPSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKworICAgIC8qIEluaXRpYWxpemUgb3VyIGRldmljZSBoZXJlICovCisgICAgaWYoICF3bF9hZGFwdGVyX2luc2VydCggZGV2ICkpIHsKKyAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbnNlcnQoKSBGQUlMRUQhISFcbiIgKTsKKyAgICAgICAgd2xfZGV2aWNlX2RlYWxsb2MoIGRldiApOworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgb3VyIElTUiAqLworICAgIERCR19UUkFDRSggRGJnSW5mbywgIlJlZ2lzdGVyaW5nIElTUi4uLlxuIiApOworCisgICAgcmVzdWx0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHdsX2lzciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKyAgICBpZiggcmVzdWx0ICkgeworICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIkNvdWxkIG5vdCByZWdpc3RlciBJU1IhISFcbiIgKTsKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisJfQorCisgICAgLyogTWFrZSBzdXJlIGludGVycnVwdHMgYXJlIGVuYWJsZWQgcHJvcGVybHkgZm9yIENhcmRCdXMgKi8KKyAgICBscCA9IChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKworICAgIGlmKCBscC0+aGNmQ3R4LklGQl9CdXNUeXBlID09IENGR19OSUNfQlVTX1RZUEVfQ0FSREJVUyB8fAorCSAgICBscC0+aGNmQ3R4LklGQl9CdXNUeXBlID09IENGR19OSUNfQlVTX1RZUEVfUENJIAkJKSB7CisgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlRoaXMgaXMgYSBQQ0kvQ2FyZEJ1cyBjYXJkLCBlbmFibGUgaW50ZXJydXB0c1xuIiApOworICAgICAgICB3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cyggcGRldiApOworICAgIH0KKworICAgIC8qIEVuYWJsZSBidXMgbWFzdGVyaW5nICovCisgICAgcGNpX3NldF9tYXN0ZXIoIHBkZXYgKTsKKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiAwOworfSAvLyB3bF9wY2lfc2V0dXAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENhbGxlZCBieSB3bF9wY2lfc2V0dXAoKSB0byBlbmFibGUgaW50ZXJydXB0cyBvbiBhIENhcmRCdXMgZGV2aWNlLiBUaGlzCisgKiAgaXMgZG9uZSBieSB3cml0aW5nIGJpdCAxNSB0byB0aGUgZnVuY3Rpb24gZXZlbnQgbWFzayByZWdpc3Rlci4gVGhpcworICogIENhcmRCdXMtc3BlY2lmaWMgcmVnaXN0ZXIgaXMgbG9jYXRlZCBpbiBCQVIyIChjb3VudGluZyBmcm9tIEJBUjApLCBpbiBtZW1vcnkKKyAqICBzcGFjZSBhdCBieXRlIG9mZnNldCAxZjQgKDdmNCBmb3IgV0FSUCkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcGNpX2VuYWJsZV9jYXJkYnVzX2ludGVycnVwdHMoIHN0cnVjdCBwY2lfZGV2ICpwZGV2ICkKK3sKKyAgICB1MzIgICAgICAgICAgICAgICAgIGJhcjJfcmVnOworICAgIHUzMiAgICAgICAgICAgICAgICAgbWVtX2FkZHJfYnVzOworICAgIHUzMiAgICAgICAgICAgICAgICAgZnVuY19ldnRfbWFza19yZWc7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbWVtX2FkZHJfa2VybiA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgIC8qIEluaXRpYWxpemUgdG8ga25vd24gYmFkIHZhbHVlcyAqLworICAgIGJhcjJfcmVnID0gMHhkZWFkYmVlZjsKKyAgICBtZW1fYWRkcl9idXMgPSAweGRlYWRiZWVmOworCisgICAgLyogUmVhZCB0aGUgQkFSMiByZWdpc3RlcjsgdGhpcyByZWdpc3RlciBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZQorICAgICAgIG1lbW9yeSByZWdpb24gd2hlcmUgdGhlIGZ1bmN0aW9uIGV2ZW50IG1hc2sgcmVnaXN0ZXIgbGl2ZXMgKi8KKyAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoIHBkZXYsIFBDSV9CQVNFX0FERFJFU1NfMiwgJmJhcjJfcmVnICk7CisgICAgbWVtX2FkZHJfYnVzID0gYmFyMl9yZWcgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCisgICAgLyogT25jZSB0aGUgYmFzZSBhZGRyZXNzIGlzIG9idGFpbmVkLCByZW1hcCB0aGUgbWVtb3J5IHJlZ2lvbiB0byBrZXJuZWwKKyAgICAgICBzcGFjZSBzbyB3ZSBjYW4gcmV0cmlldmUgdGhlIHJlZ2lzdGVyICovCisgICAgbWVtX2FkZHJfa2VybiA9IGlvcmVtYXAoIG1lbV9hZGRyX2J1cywgMHgyMDAgKTsKKworI2lmZGVmIEhFUk1FUzI1CisjZGVmaW5lIFJFR19PRkZTRVQgIDB4MDdGNAorI2Vsc2UKKyNkZWZpbmUgUkVHX09GRlNFVCAgMHgwMUY0CisjZW5kaWYgLy8gSEVSTUVTMjUKKworI2RlZmluZSBCSVQxNSAgICAgICAweDgwMDAKKworICAgIC8qIFJldHJpZXZlIHRoZSBmdW5jdGlvbmFsIGV2ZW50IG1hc2sgcmVnaXN0ZXIsIGVuYWJsZSBpbnRlcnJ1cHRzIGJ5CisgICAgICAgc2V0dGluZyBCaXQgMTUsIGFuZCB3cml0ZSBiYWNrIHRoZSB2YWx1ZSAqLworICAgIGZ1bmNfZXZ0X21hc2tfcmVnID0gKih1MzIgKikoIG1lbV9hZGRyX2tlcm4gKyBSRUdfT0ZGU0VUICk7CisgICAgZnVuY19ldnRfbWFza19yZWcgfD0gQklUMTU7CisgICAgKih1MzIgKikoIG1lbV9hZGRyX2tlcm4gKyBSRUdfT0ZGU0VUICkgPSBmdW5jX2V2dF9tYXNrX3JlZzsKKworICAgIC8qIE9uY2UgY29tcGxldGUsIHVubWFwIHRoZSByZWdpb24gYW5kIGV4aXQgKi8KKyAgICBpb3VubWFwKCBtZW1fYWRkcl9rZXJuICk7CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgRU5BQkxFX0RNQQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfYWxsb2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgYWxsIHJlc291cmNlcyBuZWVkZWQgZm9yIFBDSS9DYXJkQnVzIERNQSBvcGVyYXRpb24KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2FsbG9jKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfYWxsb2MiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKy8vICAgICBscC0+ZG1hLnR4X3JzY19pbmQgPSBscC0+ZG1hLnJ4X3JzY19pbmQgPSAwOworLy8KKy8vICAgICAvKiBBbGxvYyBmb3IgdGhlIFR4IGNoYWluIGFuZCBpdHMgcmVjbGFpbSBkZXNjcmlwdG9yICovCisvLyAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcGFja2V0W2ldICk7CisvLyAgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcGFja2V0WyVkXSA6ICAgICAgICAgICAgICAgICAweCVwXG4iLCBpLCBscC0+ZG1hLnR4X3BhY2tldFtpXSApOworLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9wYWNrZXRbJWRdLT5uZXh0X2Rlc2NfYWRkciA6IDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldLT5uZXh0X2Rlc2NfYWRkciApOworLy8gICAgICAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kKys7CisvLyAgICAgICAgIH0gZWxzZSB7CisvLyAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2MgRE1BIFR4IFBhY2tldFxuIiApOworLy8gICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgIH0KKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKTsKKy8vICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CisvLyAgICAgfQorLy8gICAgIC8qIEFsbG9jIGZvciB0aGUgUnggY2hhaW4gYW5kIGl0cyByZWNsYWltIGRlc2NyaXB0b3IgKi8KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgeworLy8gICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKy8vICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF0gICAgICAgICAgICAgICAgIDogMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKy8vICAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3BhY2tldFslZF0tPm5leHRfZGVzY19hZGRyIDogMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0tPm5leHRfZGVzY19hZGRyICk7CisvLyAgICAgICAgICAgICAgICAgbHAtPmRtYS5yeF9yc2NfaW5kKys7CisvLyAgICAgICAgICAgICB9IGVsc2UgeworLy8gICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBhbGxvYyBETUEgUnggUGFja2V0XG4iICk7CisvLyAgICAgICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgICAgICB9CisvLyAgICAgICAgIH0KKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCAmbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKKy8vICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CisvLyAgICAgfQorLy8gICAgIC8qIFN0b3JlIHN0YXR1cywgYXMgaG9zdCBzaG91bGQgbm90IGNhbGwgSENGIGZ1bmN0aW9ucyBpZiB0aGlzIGZhaWxzICovCisvLyAgICAgbHAtPmRtYS5zdGF0dXMgPSBzdGF0dXM7ICAvLzs/YWxsIHVzZWFnZXMgb2YgZG1hLnN0YXR1cyBoYXZlIGJlZW4gY29tbWVudGVkIG91dAorLy8gICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfYWxsb2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2ZyZWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBEZWFsbG9jYXRlZCBhbGwgcmVzb3VyY2VzIG5lZWRlZCBmb3IgUENJL0NhcmRCdXMgRE1BIG9wZXJhdGlvbgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfZnJlZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGk7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2ZyZWUiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvKiBSZWNsYWltIGFsbCBSeCBwYWNrZXRzIHRoYXQgd2VyZSBoYW5kZWQgb3ZlciB0byB0aGUgSENGICovCisgICAgLyogRG8gSSBuZWVkIHRvIGRvIHRoaXM/IEJlZm9yZSB0aGlzIGZyZWUgaXMgY2FsbGVkLCBJJ3ZlIGFscmVhZHkgZGlzYWJsZWQKKyAgICAgICB0aGUgcG9ydCB3aGljaCB3aWxsIGNhbGwgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSAqLworICAgIC8vaWYoIGxwLT5kbWEuc3RhdHVzID09IDAgKQorICAgIC8veworICAgIC8vICAgIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW0oIGxwICk7CisgICAgLy99CisKKyAgICAvKiBGcmVlIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBETUEgUnggKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgaWYoIGxwLT5kbWEucnhfcGFja2V0W2ldICkgeworICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldCggcGRldiwgbHAsICZscC0+ZG1hLnJ4X3BhY2tldFtpXSApOworICAgICAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgeworICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBmcmVlaW5nIFJ4IHBhY2tldFxuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGxwLT5kbWEucnhfcnNjX2luZCA9IDA7CisKKyAgICBpZiggbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKSB7CisgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBmcmVlaW5nIFJ4IHJlY2xhaW0gZGVzY3JpcHRvclxuIiApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSBldmVyeXRoaW5nIG5lZWRlZCBmb3IgRE1BIFR4ICovCisgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CisgICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBUeCBwYWNrZXRcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBscC0+ZG1hLnR4X3JzY19pbmQgPSAwOworCisgICAgaWYoIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICkgeworICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggcGRldiwgbHAsICZscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOworICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBUeCByZWNsYWltIGRlc2NyaXB0b3JcbiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfZnJlZQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgYSBzaW5nbGUgVHggcGFja2V0LCBjb25zaXN0aW5nIG9mIHNldmVyYWwgZGVzY3JpcHRvcnMgYW5kCisgKiAgICAgIGJ1ZmZlcnMuIERhdGEgdG8gdHJhbnNtaXQgaXMgZmlyc3QgY29waWVkIGludG8gdGhlICdwYXlsb2FkJyBidWZmZXIKKyAqICAgICAgYmVmb3JlIGJlaW5nIHRyYW5zbWl0dGVkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgICAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisvLyAgICAgaW50IHN0YXR1cyA9IDA7CisvLyAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8KKy8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgeworLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgZGVzYywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7CisvLworLy8gICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiggKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQ0ZfTUFYX1BBQ0tFVF9TSVpFICk7CisvLyAgICAgICAgIH0KKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAoKmRlc2MpLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyOworLy8gICAgIH0KKy8vICAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGcmVlcyBhIHNpbmdsZSBUeCBwYWNrZXQsIGRlc2NyaWJlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBhbGxvYyBmdW5jdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoICpkZXNjID09IE5VTEwgKSB7CisgICAgICAgIERCR19QUklOVCggIk51bGwgZGVzY3JpcHRvclxuIiApOworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKwkvLzs/dGhlICJsaW1pdGVkIiBORElTIHN0cmF0ZWd5LCBhc3N1bWluZyBhIGZyYW1lIGNvbnNpc3RzIEFMV0FZUyBvdXQgb2YgMgorCS8vZGVzY3JpcHRvcnMsIG1ha2UgdGhpcyByb2J1c3QKKyAgICBpZiggc3RhdHVzID09IDAgJiYgKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgKSB7CisgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCAmKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgKTsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgZGVzYyApOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgYSBzaW5nbGUgUnggcGFja2V0LCBjb25zaXN0aW5nIG9mIHR3byBkZXNjcmlwdG9ycyBhbmQgb25lCisgKiAgICAgIGNvbnRpZ3VvdXMgYnVmZmVyLiBUSGUgYnVmZmVyIHN0YXJ0cyB3aXRoIHRoZSBoZXJtZXMtc3BlY2lmaWMgaGVhZGVyLgorICogICAgICBPbmUgZGVzY3JpcHRvciBwb2ludHMgYXQgdGhlIHN0YXJ0LCB0aGUgb3RoZXIgYXQgb2Zmc2V0IDB4M2Egb2YgdGhlCisgKiAgICAgIGJ1ZmZlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgREVTQ19TVFJDVCAgKnA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKy8vICAgICB9CisvLyAJLy87P3RoZSAibGltaXRlZCIgTkRJUyBzdHJhdGVneSwgYXNzdW1pbmcgYSBmcmFtZSBjb25zaXN0cyBBTFdBWVMgb3V0IG9mIDIKKy8vIAkvL2Rlc2NyaXB0b3JzLCBtYWtlIHRoaXMgcm9idXN0CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCBkZXNjICk7CisvLyAJfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19idWYoIHBkZXYsIGxwLCAqZGVzYywgSENGX01BWF9QQUNLRVRfU0laRSApOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsICZwICk7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgLyogU2l6ZSBvZiAxc3QgZGVzY3JpcHRvciBiZWNvbWVzIDB4M2EgYnl0ZXMgKi8KKy8vICAgICAgICAgU0VUX0JVRl9TSVpFKCAqZGVzYywgSENGX0RNQV9SWF9CVUYxX1NJWkUgKTsKKy8vCisvLyAgICAgICAgIC8qIE1ha2UgMm5kIGRlc2NyaXB0b3IgcG9pbnQgYXQgb2Zmc2V0IDB4M2Egb2YgdGhlIGJ1ZmZlciAqLworLy8gICAgICAgICBTRVRfQlVGX1NJWkUoIHAsICggSENGX01BWF9QQUNLRVRfU0laRSAtIEhDRl9ETUFfUlhfQlVGMV9TSVpFICkpOworLy8gICAgICAgICBwLT5idWZfYWRkciAgICAgICA9ICgqZGVzYyktPmJ1Zl9hZGRyICsgSENGX0RNQV9SWF9CVUYxX1NJWkU7CisvLyAgICAgICAgIHAtPmJ1Zl9waHlzX2FkZHIgID0gKCpkZXNjKS0+YnVmX3BoeXNfYWRkciArIEhDRl9ETUFfUlhfQlVGMV9TSVpFOworLy8gICAgICAgICBwLT5uZXh0X2Rlc2NfYWRkciA9IE5VTEw7CisvLworLy8gICAgICAgICAvKiBDaGFpbiAybmQgZGVzY3JpcHRvciB0byAxc3QgZGVzY3JpcHRvciAqLworLy8gICAgICAgICAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkciAgICAgID0gcDsKKy8vICAgICAgICAgKCpkZXNjKS0+bmV4dF9kZXNjX3BoeXNfYWRkciA9IHAtPmRlc2NfcGh5c19hZGRyOworLy8gICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZyZWVzIGEgc2luZ2xlIFJ4IHBhY2tldCwgZGVzY3JpYmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGFsbG9jIGZ1bmN0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgICAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfZnJlZV9yeF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBERVNDX1NUUkNUICpwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgeworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgIHAgPSAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkcjsKKworICAgICAgICAvKiBGcmVlIHRoZSAybmQgZGVzY3JpcHRvciAqLworICAgICAgICBpZiggcCAhPSBOVUxMICkgeworICAgICAgICAgICAgcC0+YnVmX2FkZHIgICAgICA9IE5VTEw7CisgICAgICAgICAgICBwLT5idWZfcGh5c19hZGRyID0gMDsKKworICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCAmcCApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgYnVmZmVyIGFuZCAxc3QgZGVzY3JpcHRvciAqLworICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgU0VUX0JVRl9TSVpFKCAqZGVzYywgSENGX01BWF9QQUNLRVRfU0laRSApOworICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgZGVzYyApOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBBbGxvY2F0ZXMgYSBETUEgZGVzY3JpcHRvciBhbmQgYnVmZmVyLCBhbmQgYXNzb2NpYXRlcyB0aGVtIHdpdGggb25lCisgKiAgICAgIGFub3RoZXIuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2ICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogICAgICBkZXNjICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MsIGludCBzaXplICkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgeworLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworLy8gICAgIH0KKy8vICAgICBpZiggc3RhdHVzID09IDAgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsIGRlc2MgKTsKKy8vCisvLyAgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfYnVmKCBwZGV2LCBscCwgKmRlc2MsIHNpemUgKTsKKy8vICAgICAgICAgfQorLy8gICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGcmVlcyBhIERNQSBkZXNjcmlwdG9yIGFuZCBhc3NvY2lhdGVkIGJ1ZmZlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiAgICAgIGRlc2MgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKK3sKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBpZiggZGVzYyA9PSBOVUxMICkgeworICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOworICAgIH0KKyAgICBpZiggc3RhdHVzID09IDAgJiYgKmRlc2MgPT0gTlVMTCApIHsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICkgeworICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfYnVmKCBwZGV2LCBscCwgKmRlc2MgKTsKKworICAgICAgICBpZiggc3RhdHVzID09IDAgKSB7CisgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggcGRldiwgbHAsIGRlc2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfSAvLyB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9hbGxvY19kZXNjKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQWxsb2NhdGVzIG9uZSBETUEgZGVzY3JpcHRvciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworLy8gICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CisvLyAgICAgZG1hX2FkZHJfdCAgcGE7CisvLyAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLy8KKy8vICAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfYWxsb2NfZGVzYyIgKTsKKy8vICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKy8vCisvLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgeworLy8gICAgICAgICAqZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KCBwZGV2LCBzaXplb2YoIERFU0NfU1RSQ1QgKSwgJnBhICk7CisvLyAgICAgfQorLy8gICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgeworLy8gICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZhaWxlZFxuIiApOworLy8gICAgICAgICBzdGF0dXMgPSAtRU5PTUVNOworLy8gICAgIH0gZWxzZSB7CisvLyAgICAgICAgIG1lbXNldCggKmRlc2MsIDAsIHNpemVvZiggREVTQ19TVFJDVCApKTsKKy8vICAgICAgICAgKCpkZXNjKS0+ZGVzY19waHlzX2FkZHIgPSBjcHVfdG9fbGUzMiggcGEgKTsKKy8vICAgICB9CisvLyAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisvLyAgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9hbGxvY19kZXNjCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9mcmVlX2Rlc2MoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBGcmVlcyBvbmUgRE1BIGRlc2NyaXB0b3IgaW4gY2FjaGUgY29oZXJlbnQgbWVtb3J5LgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQoreworICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoICpkZXNjID09IE5VTEwgKSB7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudCggcGRldiwgc2l6ZW9mKCBERVNDX1NUUkNUICksICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc2MpLT5kZXNjX3BoeXNfYWRkciApOworICAgIH0KKyAgICAqZGVzYyA9IE5VTEw7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gd2xfcGNpX2RtYV9mcmVlX2Rlc2MKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2FsbG9jX2J1ZigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBvbmUgRE1BIGJ1ZmZlciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnksIGFuZCBhc3NvY2lhdGVzIGEgRE1BCisgKiAgICAgIGRlc2NyaXB0b3Igd2l0aCB0aGlzIGJ1ZmZlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2FsbG9jX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYywgaW50IHNpemUgKQoreworICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgZG1hX2FkZHJfdCAgcGE7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvLyAgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2FsbG9jX2J1ZiIgKTsKKy8vICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKy8vCisvLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKy8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKy8vICAgICB9CisvLyAgICAgaWYoIHN0YXR1cyA9PSAwICYmIGRlc2MtPmJ1Zl9hZGRyICE9IE5VTEwgKSB7CisvLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisvLyAgICAgfQorLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKy8vICAgICAgICAgZGVzYy0+YnVmX2FkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudCggcGRldiwgc2l6ZSwgJnBhICk7CisvLyAgICAgfQorLy8gICAgIGlmKCBkZXNjLT5idWZfYWRkciA9PSBOVUxMICkgeworLy8gICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZhaWxlZFxuIiApOworLy8gICAgICAgICBzdGF0dXMgPSAtRU5PTUVNOworLy8gICAgIH0gZWxzZSB7CisvLyAgICAgICAgIGRlc2MtPmJ1Zl9waHlzX2FkZHIgPSBjcHVfdG9fbGUzMiggcGEgKTsKKy8vICAgICAgICAgU0VUX0JVRl9TSVpFKCBkZXNjLCBzaXplICk7CisvLyAgICAgfQorLy8gICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfYWxsb2NfYnVmCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9mcmVlX2J1ZigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEFsbG9jYXRlcyBvbmUgRE1BIGJ1ZmZlciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnksIGFuZCBhc3NvY2lhdGVzIGEgRE1BCisgKiAgICAgIGRlc2NyaXB0b3Igd2l0aCB0aGlzIGJ1ZmZlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3bF9wY2lfZG1hX2ZyZWVfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MgKQoreworICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKKyAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKKyAgICB9CisgICAgaWYoIHN0YXR1cyA9PSAwICYmIGRlc2MtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CisgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CisgICAgfQorICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudCggcGRldiwgR0VUX0JVRl9TSVpFKCBkZXNjICksIGRlc2MtPmJ1Zl9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5idWZfcGh5c19hZGRyICk7CisKKyAgICAgICAgZGVzYy0+YnVmX2FkZHIgPSAwOworICAgICAgICBkZXNjLT5idWZfcGh5c19hZGRyID0gMDsKKyAgICAgICAgU0VUX0JVRl9TSVpFKCBkZXNjLCAwICk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIHdsX3BjaV9kbWFfZnJlZV9idWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2hjZl9zdXBwbHkoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTdXBwbHkgSENGIHdpdGggRE1BLXJlbGF0ZWQgcmVzb3VyY2VzLiBUaGVzZSBjb25zaXN0IG9mOgorICogICAgICAgICAgLSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyBmb3IgcmVjZWl2ZSBwdXJwb3NlcworICogICAgICAgICAgLSBvbmUgJ3JlY2xhaW0nIGRlc2NyaXB0b3IgZm9yIHRoZSB0cmFuc21pdCBwYXRoLCB1c2VkIHRvIGZ1bGZpbGwgYQorICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CisgKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHJlY2VpdmUgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKKyAqICAgICAgICAgICAgY2VydGFpbiBIMjUgRE1BIGVuZ2luZSByZXF1aXJlbWVudAorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgc3RhcnQtb2YtZGF5IG9yIGF0IHJlLWluaXRpYWxpemF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wY2lfZG1hX2hjZl9zdXBwbHkoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9zdXBwbHkiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICk7CisgICAgLy97CisgICAgICAgIC8qIEhhbmQgb3ZlciB0aGUgUngvVHggcmVjbGFpbSBkZXNjcmlwdG9ycyB0byB0aGUgSENGICovCisgICAgICAgIGlmKCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApIHsKKyAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOworICAgICAgICAgICAgaGNmX2RtYV90eF9wdXQoICZscC0+aGNmQ3R4LCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYywgMCApOworICAgICAgICAgICAgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgPSBOVUxMOworICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICkgeworICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJmxwLT5oY2ZDdHgsIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CisgICAgICAgICAgICBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyA9IE5VTEw7CisgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKKyAgICAgICAgfQorICAgICAgICAvKiBIYW5kIG92ZXIgdGhlIFJ4IGRlc2NyaXB0b3IgY2hhaW4gdG8gdGhlIEhDRiAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcGFja2V0WyVkXTogICAgMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKyAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmbHAtPmhjZkN0eCwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKyAgICAgICAgICAgIGxwLT5kbWEucnhfcGFja2V0W2ldID0gTlVMTDsKKyAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcGFja2V0WyVkXTogICAgMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKKyAgICAgICAgfQorICAgIC8vfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wY2lfZG1hX2hjZl9zdXBwbHkKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJuIERNQS1yZWxhdGVkIHJlc291cmNlcyBmcm9tIHRoZSBIQ0YuIFRoZXNlIGNvbnNpc3Qgb2Y6CisgKiAgICAgICAgICAtIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGZvciByZWNlaXZlIHB1cnBvc2VzCisgKiAgICAgICAgICAtIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGZvciB0cmFuc21pdCBwdXJwb3NlcworICogICAgICAgICAgLSBvbmUgJ3JlY2xhaW0nIGRlc2NyaXB0b3IgZm9yIHRoZSB0cmFuc21pdCBwYXRoLCB1c2VkIHRvIGZ1bGZpbGwgYQorICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CisgKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHJlY2VpdmUgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKKyAqICAgICAgICAgICAgY2VydGFpbiBIMjUgRE1BIGVuZ2luZSByZXF1aXJlbWVudAorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgZW5kLW9mLWRheSBvciBhdCByZS1pbml0aWFsaXphdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW0iICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCBscCApOworICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgeworICAgICAgICBEQkdfUFJJTlQoICJyeF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CisvLyAgICAgICAgIGlmKCBscC0+ZG1hLnJ4X3BhY2tldFtpXSA9PSBOVUxMICkgeworLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbTogcnhfcGFja2V0WyVkXSBOVUxMXG4iLCBpICk7CisvLyAgICAgICAgIH0KKyAgICB9CisKKyAgICB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCBscCApOworICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgeworICAgICAgICBEQkdfUFJJTlQoICJ0eF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldICk7CisvLyAgICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSA9PSBOVUxMICkgeworLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbTogdHhfcGFja2V0WyVkXSBOVUxMXG4iLCBpICk7CisvLyAgICAgICAgIH0KKyAgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wY2lfZG1hX2hjZl9yZWNsYWltCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlY2xhaW0gUnggcGFja2V0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBieSB0aGUgSENGLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGludCAgICAgICAgIGk7CisgICAgREVTQ19TVFJDVCAqcDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW1fcngiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKKyAgICAvL3sKKyAgICAgICAgd2hpbGUgKCAoIHAgPSBoY2ZfZG1hX3J4X2dldCggJmxwLT5oY2ZDdHggKSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBpZiggcCAmJiBwLT5idWZfYWRkciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8qIEEgcmVjbGFpbSBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRi4gUmVjbGFpbQorICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGhhdmUgYSBOVUxMIGJ1Zl9hZGRyICovCisgICAgICAgICAgICAgICAgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgPSBwOworICAgICAgICAgICAgCURCR19QUklOVCggInJlY2xhaW1fZGVzY3JpcHRvcjogMHglcFxuIiwgcCApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CisgICAgICAgICAgICAgICAgaWYoIGxwLT5kbWEucnhfcGFja2V0W2ldID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEFuIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRiAqLworICAgICAgICAgICAgbHAtPmRtYS5yeF9wYWNrZXRbaV0gPSBwOworICAgICAgICAgICAgbHAtPmRtYS5yeF9yc2NfaW5kKys7CisgICAgICAgIAlEQkdfUFJJTlQoICJyeF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CisgICAgICAgIH0KKyAgICAvL30KKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKK30gLy8gd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIE9idGFpbnMgYSBUeCBkZXNjcmlwdG9yIGZyb20gdGhlIGNoYWluIHRvIHVzZSBmb3IgVHguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBscCAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgd2xfcHJpdmF0ZSBzdHJ1Y3R1cmUuCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBBIHBvaW50ZXIgdG8gdGhlIHJldHJpZXZlZCBkZXNjcmlwdG9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0RFU0NfU1RSQ1QgKiB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgaW50IGk7CisgICAgREVTQ19TVFJDVCAqZGVzYyA9IE5VTEw7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CisgICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGkgIT0gTlVNX1RYX0RFU0MgKSB7CisgICAgICAgIGRlc2MgPSBscC0+ZG1hLnR4X3BhY2tldFtpXTsKKworICAgICAgICBscC0+ZG1hLnR4X3BhY2tldFtpXSA9IE5VTEw7CisgICAgICAgIGxwLT5kbWEudHhfcnNjX2luZC0tOworCisgICAgICAgIG1lbXNldCggZGVzYy0+YnVmX2FkZHIsIDAsIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7CisgICAgfQorCisgICAgcmV0dXJuIGRlc2M7Cit9IC8vIHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BjaV9kbWFfcHV0X3R4X3BhY2tldCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybnMgYSBUeCBkZXNjcmlwdG9yIHRvIHRoZSBjaGFpbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0dXJlLgorICogICAgICBkZXNjIC0gYSBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIHRvIHJldHVybi4KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX3BjaV9kbWFfcHV0X3R4X3BhY2tldCggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBERVNDX1NUUkNUICpkZXNjICkKK3sKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldID09IE5VTEwgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBpICE9IE5VTV9UWF9ERVNDICkgeworICAgICAgICBscC0+ZG1hLnR4X3BhY2tldFtpXSA9IGRlc2M7CisgICAgICAgIGxwLT5kbWEudHhfcnNjX2luZCsrOworICAgIH0KK30gLy8gd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJlY2xhaW0gVHggcGFja2V0cyB0aGF0IGhhdmUgZWl0aGVyIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBIQ0YgZHVlIHRvIGEKKyAqICAgICAgcG9ydCBkaXNhYmxlIG9yIGEgVHggY29tcGxldGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV90eCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBpbnQgICAgICAgICBpOworICAgIERFU0NfU1RSQ1QgKnA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCisgICAgLy97CisgICAgICAgIHdoaWxlICggKCBwID0gaGNmX2RtYV90eF9nZXQoICZscC0+aGNmQ3R4ICkgKSAhPSBOVUxMICkgeworCisgICAgICAgICAgICBpZiggcCAhPSBOVUxMICYmIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLyogQSBSZWNsYWltIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGLiBSZWNsYWltCisgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgaGF2ZSBhIE5VTEwgYnVmX2FkZHIgKi8KKyAgICAgICAgICAgICAgICBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyA9IHA7CisgICAgICAgICAgICAJREJHX1BSSU5UKCAicmVjbGFpbV9kZXNjcmlwdG9yOiAweCVwXG4iLCBwICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQW4gUnggYnVmZmVyIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGICovCisgICAgICAgICAgICBscC0+ZG1hLnR4X3BhY2tldFtpXSA9IHA7CisgICAgICAgICAgICBscC0+ZG1hLnR4X3JzY19pbmQrKzsKKyAgICAgICAgCURCR19QUklOVCggInR4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKKyAgICAgICAgfQorICAgIC8vfQorCisgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKKyAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPmRldiApOworICAgICAgICBXTF9XRFNfTkVUSUZfV0FLRV9RVUVVRSggbHAgKTsKKyAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKKyAgICB9CisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2VuZGlmICAvLyBFTkFCTEVfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDdiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wY2kuaApAQCAtMCwwICsxLDEwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgZHJpdmVyIHRvIHN1cHBvcnQgUENJLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9QQ0lfSF9fCisjZGVmaW5lIF9fV0xfUENJX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGNvbnN0YW50IGRlZmluaXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXTF9MS01fUENJX1ZFTkRPUl9JRCAgICAweDExQzEgIC8vIEx1Y2VudCBNaWNyb2VsZWN0cm9uaWNzCisjZGVmaW5lIFdMX0xLTV9QQ0lfREVWSUNFX0lEXzAgIDB4QUIzMCAgLy8gTWluaSBQQ0kKKyNkZWZpbmUgV0xfTEtNX1BDSV9ERVZJQ0VfSURfMSAgMHhBQjM0ICAvLyBNaW5pIFBDSQorI2RlZmluZSBXTF9MS01fUENJX0RFVklDRV9JRF8yICAweEFCMTEgIC8vIFdBUlAgQ2FyZEJ1cworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfYWRhcHRlcl9pbml0X21vZHVsZSggdm9pZCApOworCit2b2lkIHdsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoIHZvaWQgKTsKKworaW50IHdsX2FkYXB0ZXJfaW5zZXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCB3bF9hZGFwdGVyX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2FkYXB0ZXJfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsX2FkYXB0ZXJfaXNfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCisKKyNpZmRlZiBFTkFCTEVfRE1BCisKK3ZvaWQgd2xfcGNpX2RtYV9oY2Zfc3VwcGx5KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKwordm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworREVTQ19TVFJDVCAqIHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKK3ZvaWQgd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsIERFU0NfU1RSQ1QgKmRlc2MgKTsKKwordm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworI2VuZGlmICAvLyBFTkFCTEVfRE1BCisKKworI2VuZGlmICAvLyBfX1dMX1BDSV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ByaXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ByaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTYxMGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJpdi5jCkBAIC0wLDAgKzEsMjA3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgcHJpdmF0ZSBJT0NUTHMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX2VuYy5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF9wcml2Lmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX25ldGRldi5oPgorCitpbnQgd3ZsYW5fdWlsX2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX2Rpc2Nvbm5lY3QoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX2FjdGlvbiggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCB3dmxhbl91aWxfYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX3VuYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CitpbnQgd3ZsYW5fdWlsX3B1dF9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworaW50IHd2bGFuX3VpbF9nZXRfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKworaW50IGNmZ19kcml2ZXJfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK2ludCBjZmdfZHJpdmVyX2lkZW50aXR5KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIERCRworZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CisjZW5kaWYgIC8vIERCRworCisKKworCisvKiBJZiBVU0VfVUlMIGlzIG5vdCBkZWZpbmVkLCB0aGVuIG5vbmUgb2YgdGhlIFVJTCBJbnRlcmZhY2UgY29kZSBiZWxvdyB3aWxsCisgICBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQgKi8KKyNpZmRlZiBVU0VfVUlMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWwoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGUgaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIFVJTCBpbnRlcmZhY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3VpbCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCBpb2N0bF9yZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid3ZsYW5fdWlsIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJc3dpdGNoKCB1cnEtPmNvbW1hbmQgKSB7CisJICBjYXNlIFVJTF9GVU5fQ09OTkVDVDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX0NPTk5FQ1RcbiIpOworCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfY29ubmVjdCggdXJxLCBscCApOworCQlicmVhazsKKwkgIGNhc2UgVUlMX0ZVTl9ESVNDT05ORUNUOgorCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMIC0tIFdWTEFOMl9VSUxfRElTQ09OTkVDVFxuIik7CisJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9kaXNjb25uZWN0KCB1cnEsIGxwICk7CisJCWJyZWFrOworCSAgY2FzZSBVSUxfRlVOX0FDVElPTjoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX0FDVElPTlxuIiApOworCQlpb2N0bF9yZXQgPSB3dmxhbl91aWxfYWN0aW9uKCB1cnEsIGxwICk7CisJCWJyZWFrOworCSAgY2FzZSBVSUxfRlVOX1NFTkRfRElBR19NU0c6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9TRU5EX0RJQUdfTVNHXG4iKTsKKwkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coIHVycSwgbHAgKTsKKwkJYnJlYWs7CisJICBjYXNlIFVJTF9GVU5fR0VUX0lORk86CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gV1ZMQU4yX1VJTF9HRVRfSU5GT1xuIik7CisJCWlvY3RsX3JldCA9IHd2bGFuX3VpbF9nZXRfaW5mbyggdXJxLCBscCApOworCQlicmVhazsKKwkgIGNhc2UgVUlMX0ZVTl9QVVRfSU5GTzoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1VJTCAtLSBXVkxBTjJfVUlMX1BVVF9JTkZPXG4iKTsKKwkJaW9jdGxfcmV0ID0gd3ZsYW5fdWlsX3B1dF9pbmZvKCB1cnEsIGxwICk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9VSUwgLS0gVU5TVVBQT1JURUQgVUlMIENPREU6IDB4JVgiLCB1cnEtPmNvbW1hbmQgKTsKKwkJaW9jdGxfcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gaW9jdGxfcmV0OworfSAvLyB3dmxhbl91aWwKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfY29ubmVjdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENvbm5lY3QgdG8gdGhlIFVJTCBpbiBvcmRlciB0byBtYWtlIGEgcmVxdWVzdC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfY29ubmVjdCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJaWYoICEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQ09OTkVDVEVEICkpIHsKKwkJbHAtPmZsYWdzIHw9IFdWTEFOMl9VSUxfQ09OTkVDVEVEOworCQl1cnEtPmhjZkN0eCA9ICYoIGxwLT5oY2ZDdHggKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlEQkdfV0FSTklORyggRGJnSW5mbywgIlVJTF9FUlJfSU5fVVNFXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9JTl9VU0U7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX2Nvbm5lY3QKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfZGlzY29ubmVjdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIERpc29ubmVjdCBmcm9tIHRoZSBVSUwgYWZ0ZXIgYSByZXF1ZXN0IGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfZGlzY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfZGlzY29ubmVjdCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQlpZiAobHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9DT05ORUNURUQpIHsKKwkJCWxwLT5mbGFncyAmPSB+V1ZMQU4yX1VJTF9DT05ORUNURUQ7CisJCQkvKgorCQkJaWYgKGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSkgeworCQkJCWxwLT5mbGFncyAmPSB+V1ZMQU4yX1VJTF9CVVNZOworCQkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGxwLT5kZXYpOworCQkJfQorCQkJKi8KKwkJfQorCisJCXVycS0+aGNmQ3R4ID0gTlVMTDsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9kaXNjb25uZWN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX2FjdGlvbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEhhbmRsZXIgZm9yIHRoZSBVSUxfQUNUX3h4eCBzdWJjb2RlcyBhc3NvY2lhdGVkIHdpdGggVUlMX0ZVTl9BQ1RJT04KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfYWN0aW9uKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisJaW50ICAgICByZXN1bHQgPSAwOworCWx0dl90ICAgKmx0djsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fdWlsX2FjdGlvbiIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQkvKiBNYWtlIHN1cmUgdGhlcmUncyBhbiBMVFYgaW4gdGhlIHJlcXVlc3QgYnVmZmVyICovCisJCWx0diA9IChsdHZfdCAqKXVycS0+ZGF0YTsKKwkJaWYoIGx0diAhPSBOVUxMICkgeworCQkJLyogU3dpdGNoIG9uIHRoZSBUeXBlIGZpZWxkIG9mIHRoZSBMVFYgY29udGFpbmVkIGluIHRoZSByZXF1ZXN0CisJCQkgICBidWZmZXIgKi8KKwkJCXN3aXRjaCggbHR2LT50eXAgKSB7CisJCQljYXNlIFVJTF9BQ1RfQkxPQ0s6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVUlMX0FDVF9CTE9DS1xuIiApOworCQkJCXJlc3VsdCA9IHd2bGFuX3VpbF9ibG9jayggdXJxLCBscCApOworCQkJCWJyZWFrOworCQkJY2FzZSBVSUxfQUNUX1VOQkxPQ0s6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiVUlMX0FDVF9VTkJMT0NLXG4iICk7CisJCQkJcmVzdWx0ID0gd3ZsYW5fdWlsX3VuYmxvY2soIHVycSwgbHAgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUlMX0FDVF9TQ0FOOgorCQkJCURCR19UUkFDRSggRGJnSW5mbywgIlVJTF9BQ1RfU0NBTlxuIiApOworCQkJCXVycS0+cmVzdWx0ID0gaGNmX2FjdGlvbiggJiggbHAtPmhjZkN0eCApLCBNRERfQUNUX1NDQU4gKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUlMX0FDVF9BUFBMWToKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVSUxfQUNUX0FQUExZXG4iICk7CisJCQkJdXJxLT5yZXN1bHQgPSB3bF9hcHBseSggbHAgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVUlMX0FDVF9SRVNFVDoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJVSUxfQUNUX1JFU0VUXG4iICk7CisJCQkJdXJxLT5yZXN1bHQgPSB3bF9nbyggbHAgKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICJVbmtub3duIGFjdGlvbiBjb2RlOiAweCV4XG4iLCBsdHYtPnR5cCApOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQmFkIExUViBmb3IgdGhpcyBhY3Rpb25cbiIgKTsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCX0KKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9hY3Rpb24KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfYmxvY2soKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXRzIGEgYmxvY2sgaW4gdGhlIGRyaXZlciB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgY2FyZCBieSBvdGhlcgorICogIHByb2Nlc3Nlcy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHd2bGFuX3VpbF9ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl91aWxfYmxvY2siICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJCWxwLT5mbGFncyB8PSBXVkxBTjJfVUlMX0JVU1k7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGxwLT5kZXYpOworCQkJV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRVBFUk1cbiIgKTsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF9ibG9jaworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF91bmJsb2NrKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVW5ibG9ja3MgdGhlIGRyaXZlciB0byByZXN0b3JlIGFjY2VzcyB0byB0aGUgY2FyZCBieSBvdGhlciBwcm9jZXNzZXMuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB1cnEgLSBhIHBvaW50ZXIgdG8gdGhlIFVJTCByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFVJTF9TVUNDRVNTCisgKiAgICAgIFVJTF9FUlJfeHh4IHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fdWlsX3VuYmxvY2soIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fdWlsX3VuYmxvY2siICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZiggdXJxLT5oY2ZDdHggPT0gJiggbHAtPmhjZkN0eCApKSB7CisJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJCWlmIChscC0+ZmxhZ3MgJiBXVkxBTjJfVUlMX0JVU1kpIHsKKwkJCQlscC0+ZmxhZ3MgJj0gfldWTEFOMl9VSUxfQlVTWTsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGxwLT5kZXYpOworCQkJCVdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBscCApOworCQkJfQorCQl9IGVsc2UgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRVBFUk1cbiIgKTsKKwkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQlyZXN1bHQgPSAtRVBFUk07CisJCX0KKwl9IGVsc2UgeworCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX1dST05HX0lGQlxuIiApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfV1JPTkdfSUZCOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXN1bHQ7Cit9IC8vIHd2bGFuX3VpbF91bmJsb2NrCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2coKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZW5kcyBhIGRpYWdub3N0aWMgbWVzc2FnZSB0byB0aGUgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfc2VuZF9kaWFnX21zZyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCAgICAgICAgIHJlc3VsdCA9IDA7CisJREVTQ19TVFJDVCAgRGVzY3BbMV07CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF9zZW5kX2RpYWdfbXNnIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQlpZiggY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCQlpZiAoKHVycS0+ZGF0YSAhPSBOVUxMKSAmJiAodXJxLT5sZW4gIT0gMCkpIHsKKwkJCQlpZiAobHAtPmhjZkN0eC5JRkJfUnNjSW5kICE9IDApIHsKKwkJCQkJdV9jaGFyICpkYXRhOworCisJCQkJCS8vIFZlcmlmeSB0aGUgdXNlciBidWZmZXIKKwkJCQkJcmVzdWx0ID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1JFQUQsIHVycS0+ZGF0YSwgdXJxLT5sZW4pOworCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKKwkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgInZlcmlmeV9hcmVhIGZhaWxlZCwgcmVzdWx0OiAlZFxuIiwgcmVzdWx0ICk7CisJCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisKKwkJCQkJaWYgKChkYXRhID0ga21hbGxvYyh1cnEtPmxlbiwgR0ZQX0tFUk5FTCkpICE9IE5VTEwpIHsKKwkJCQkJCW1lbXNldCggRGVzY3AsIDAsIHNpemVvZiggREVTQ19TVFJDVCApKTsKKwkJCQkJCW1lbWNweSggZGF0YSwgdXJxLT5kYXRhLCB1cnEtPmxlbiApOworCisJCQkJCQlEZXNjcFswXS5idWZfYWRkciAgICAgICA9ICh3Y2lfYnVmcClkYXRhOworCQkJCQkJRGVzY3BbMF0uQlVGX0NOVCAgICAgICAgPSB1cnEtPmxlbjsKKwkJCQkJCURlc2NwWzBdLm5leHRfZGVzY19hZGRyID0gMDsgICAgLy8gdGVybWluYXRlIGxpc3QKKworCQkJCQkJaGNmX3NlbmRfbXNnKCAmKGxwLT5oY2ZDdHgpLCAgJkRlc2NwWzBdLCBIQ0ZfUE9SVF8wICk7CisJCQkJCQlrZnJlZSggZGF0YSApOworCQkJCQl9IGVsc2UgeworCQkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiRU5PTUVNXG4iICk7CisJCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKwkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0JVU1k7CisJCQkJfQorCisJCQl9IGVsc2UgeworCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEQkdfRVJST1IoIERiZ0luZm8sICJFUEVSTVxuIiApOworCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCXJlc3VsdCA9IC1FUEVSTTsKKwkJfQorCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX3NlbmRfZGlhZ19tc2cKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3VpbF9wdXRfaW5mbygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNlbmRzIGEgc3BlY2lmaWMgUklEIGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgdG8gc2V0IGNvbmZpZ3VyYXRpb24gaW5mby4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfcHV0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOworCWx0dl90ICAgICAgICAgICAgICAgICAgICpwTHR2OworCWJvb2xfdCAgICAgICAgICAgICAgICAgIGx0dkFsbG9jYXRlZCA9IEZBTFNFOworCUVOQ1NUUkNUICAgICAgICAgICAgICAgIHNFbmNyeXB0aW9uOworCisjaWZkZWYgVVNFX1dEUworCWhjZl8xNiAgICAgICAgICAgICAgICAgIGhjZlBvcnQgID0gSENGX1BPUlRfMDsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggInd2bGFuX3VpbF9wdXRfaW5mbyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJaWYoIHVycS0+aGNmQ3R4ID09ICYoIGxwLT5oY2ZDdHggKSkgeworCQlpZiggY2FwYWJsZSggQ0FQX05FVF9BRE1JTiApKSB7CisJCQlpZigoIHVycS0+ZGF0YSAhPSBOVUxMICkgJiYgKCB1cnEtPmxlbiAhPSAwICkpIHsKKwkJCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IGEgY29tbWFuZCBhbmQgbGVuZ3RoIHRvIHNlbmQuICovCisJCQkJaWYoIHVycS0+bGVuIDwgKCBzaXplb2YoIGhjZl8xNiApICogMiApKSB7CisJCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CisJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIk5vIExlbmd0aC9UeXBlIGluIExUViEhIVxuIiApOworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX0xFTlxuIiApOworCQkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisKKwkJCQkvKiBWZXJpZnkgdGhlIHVzZXIgYnVmZmVyICovCisJCQkJcmVzdWx0ID0gdmVyaWZ5X2FyZWEoIFZFUklGWV9SRUFELCB1cnEtPmRhdGEsIHVycS0+bGVuICk7CisJCQkJaWYoIHJlc3VsdCAhPSAwICkgeworCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJ2ZXJpZnlfYXJlYSgpLCBWRVJJRllfUkVBRCBGQUlMRURcbiIgKTsKKwkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCisJCQkJLyogR2V0IG9ubHkgdGhlIGNvbW1hbmQgYW5kIGxlbmd0aCBpbmZvcm1hdGlvbi4gKi8KKwkJCQljb3B5X2Zyb21fdXNlciggJiggbHAtPmx0dlJlY29yZCApLCB1cnEtPmRhdGEsIHNpemVvZiggaGNmXzE2ICkgKiAyICk7CisKKwkJCQkvKiBNYWtlIHN1cmUgdGhlIGluY29taW5nIExUViByZWNvcmQgbGVuZ3RoIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZQorCQkJCSAgIElPQ1RMIGxlbmd0aCAqLworCQkJCWlmKCgoIGxwLT5sdHZSZWNvcmQubGVuICsgMSApICogc2l6ZW9mKCBoY2ZfMTYgKSkgPiB1cnEtPmxlbiApIHsKKwkJCQkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9MRU5cbiIgKTsKKwkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCisJCQkJLyogSWYgdGhlIHJlcXVlc3RlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIG91ciBsb2NhbAorCQkJCSAgIExUViByZWNvcmQsIHRyeSB0byBhbGxvY2F0ZSBpdCBmcm9tIHRoZSBrZXJuZWwgc3RhY2suCisJCQkJICAgT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSBvdXIgbG9jYWwgTFRWIHJlY29yZC4gKi8KKwkJCQlpZiggdXJxLT5sZW4gPiBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKSkgeworCQkJCQlpZigoIHBMdHYgPSAobHR2X3QgKilrbWFsbG9jKCB1cnEtPmxlbiwgR0ZQX0tFUk5FTCApKSAhPSBOVUxMICkgeworCQkJCQkJbHR2QWxsb2NhdGVkID0gVFJVRTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkFsbG9jIEZBSUxFRFxuIiApOworCQkJCQkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQkJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCQkJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcEx0diA9ICYoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQl9CisKKwkJCQkvKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHVzZXIncyBidWZmZXIgaW50byB0aGUgbG9jYWwgTFRWCisJCQkJICAgcmVjb3JkIGRhdGEgYXJlYS4gKi8KKwkJCQljb3B5X2Zyb21fdXNlciggcEx0diwgdXJxLT5kYXRhLCB1cnEtPmxlbiApOworCisKKwkJCQkvKiBXZSBuZWVkIHRvIHNub29wIHRoZSBjb21tYW5kcyB0byBzZWUgaWYgdGhlcmUgaXMgYW55dGhpbmcgd2UKKwkJCQkgICBuZWVkIHRvIHN0b3JlIGZvciB0aGUgcHVycG9zZXMgb2YgYSByZXNldCBvciBzdGFydC9zdG9wCisJCQkJICAgc2VxdWVuY2UuIFBlcmZvcm0gZW5kaWFuIHRyYW5zbGF0aW9uIGFzIG5lZWRlZCAqLworCQkJCXN3aXRjaCggcEx0di0+dHlwICkgeworCQkJCWNhc2UgQ0ZHX0NORl9QT1JUX1RZUEU6CisJCQkJCWxwLT5Qb3J0VHlwZSAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX09XTl9NQUNfQUREUjoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9PV05fQ0hBTk5FTDoKKwkJCQkJbHAtPkNoYW5uZWwgICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQkvKiBDRkdfQ05GX09XTl9TU0lEIGN1cnJlbnRseSBzYW1lIGFzIENORl9ERVNJUkVEX1NTSUQuIERvIHdlCisJCQkJICAgbmVlZCBzZXBlcmF0ZSBzdG9yYWdlIGZvciB0aGlzPyAqLworCQkJCS8vY2FzZSBDRkdfQ05GX09XTl9TU0lEOgorCQkJCWNhc2UgQ0ZHX0NORl9PV05fQVRJTV9XSU5ET1c6CisJCQkJCWxwLT5hdGltV2luZG93ICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX1NZU1RFTV9TQ0FMRToKKwkJCQkJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKworCQkJCWNhc2UgQ0ZHX0NORl9NQVhfREFUQV9MRU46CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQKKwkJCQkJICAgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfUE1fRU5BQkxFRDoKKwkJCQkJbHAtPlBNRW5hYmxlZCAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfTUNBU1RfUlg6CisJCQkJCWxwLT5NdWx0aWNhc3RSZWNlaXZlICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT046CisJCQkJCWxwLT5NYXhTbGVlcER1cmF0aW9uICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9IT0xET1ZFUl9EVVJBVElPTjoKKwkJCQkJbHAtPmhvbGRvdmVyRHVyYXRpb24gICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX09XTl9OQU1FOgorCQkJCQltZW1zZXQoIGxwLT5TdGF0aW9uTmFtZSwgMCwgc2l6ZW9mKCBscC0+U3RhdGlvbk5hbWUgKSk7CisJCQkJCW1lbWNweSggKHZvaWQgKilscC0+U3RhdGlvbk5hbWUsICh2b2lkICopJnBMdHYtPnUudThbMl0sIChzaXplX3QpcEx0di0+dS51MTZbMF0pOworCQkJCQlwTHR2LT51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CisJCQkJCWxwLT5sb2FkQmFsYW5jaW5nICAgICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgorCQkJCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNpZmRlZiBXQVJQCisJCQkJY2FzZSBDRkdfQ05GX1RYX1BPV19MVkw6CisJCQkJCWxwLT50eFBvd0xldmVsICAgICAgICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCS8vY2FzZSBDRkdfQ05GX1NIT1JUX1JFVFJZX0xJTUlUOiAgICAvLyBTaG9ydCBSZXRyeSBMaW1pdAorCQkJCS8vY2FzZSAweEZDMzM6ICAgIC8vIExvbmcgUmV0cnkgTGltaXQKKwkJCQljYXNlIENGR19TVVBQT1JURURfUkFURV9TRVRfQ05UTDogICAgICAgIC8vIFN1cHBvcnRlZCBSYXRlIFNldCBDb250cm9sCisJCQkJCWxwLT5zcnNjWzBdICAgICAgICAgICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCWxwLT5zcnNjWzFdICAgICAgICAgICAgID0gcEx0di0+dS51MTZbMV07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCXBMdHYtPnUudTE2WzFdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzFdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0JBU0lDX1JBVEVfU0VUX0NOVEw6ICAgICAgICAvLyBCYXNpYyBSYXRlIFNldCBDb250cm9sCisJCQkJCWxwLT5icnNjWzBdICAgICAgICAgICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCWxwLT5icnNjWzFdICAgICAgICAgICAgID0gcEx0di0+dS51MTZbMV07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCXBMdHYtPnUudTE2WzFdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzFdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9DT05ORUNUSU9OX0NOVEw6CisJCQkJCWxwLT5jb25uZWN0aW9uQ29udHJvbCAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCS8vY2FzZSBDRkdfUFJPQkVfREFUQV9SQVRFOgorI2VuZGlmICAvLyBIRVJNRVMyNQorCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKworCQkJCWNhc2UgQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0Q6CisJCQkJCWxwLT5EVElNUGVyaW9kICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgV0FSUAorCQkJCWNhc2UgQ0ZHX0NORl9PV05fQkVBQ09OX0lOVEVSVkFMOiAgICAgICAgLy8gT3duIEJlYWNvbiBJbnRlcnZhbAorCQkJCQlscC0+b3duQmVhY29uSW50ZXJ2YWwgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNlbmRpZiAvLyBXQVJQCisJCQkJY2FzZSBDRkdfQ09FWElTVEVOU0VfQkVIQVZJT1VSOiAgICAgICAgIC8vIENvZXhpc3RlbmNlIGJlaGF2aW9yCisJCQkJCWxwLT5jb2V4aXN0ZW5jZSAgICAgICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2lmZGVmIFVTRV9XRFMKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFIxOgorCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbMF0ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CisJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF8xOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFIyOgorCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbMV0ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CisJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF8yOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFIzOgorCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbMl0ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CisJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF8zOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFI0OgorCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbM10ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CisJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF80OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFI1OgorCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbNF0ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CisJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF81OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFI2OgorCQkJCQltZW1jcHkoICZscC0+d2RzX3BvcnRbNV0ud2RzQWRkcmVzcywgJnBMdHYtPnUudThbMF0sIEVUSF9BTEVOICk7CisJCQkJCWhjZlBvcnQgPSBIQ0ZfUE9SVF82OworCQkJCQlicmVhazsKKyNlbmRpZiAgLyogVVNFX1dEUyAqLworCisJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1BNX0JVRjoKKwkJCQkJbHAtPm11bHRpY2FzdFBNQnVmZmVyaW5nICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19DTkZfUkVKRUNUX0FOWToKKwkJCQkJbHAtPlJlamVjdEFueSAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNlbmRpZgorCisJCQkJY2FzZSBDRkdfQ05GX0VOQ1JZUFRJT046CisJCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9BVVRIRU5USUNBVElPTjoKKwkJCQkJbHAtPmF1dGhlbnRpY2F0aW9uICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAKKwkJLy87P3Nob3VsZCB3ZSByZXN0b3JlIHRoaXMgdG8gYWxsb3cgc21hbGxlciBtZW1vcnkgZm9vdHByaW50CisKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9FWENMX1VORU5DUllQVEVEOgorCQkJCQkvL2xwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgID0gcEx0di0+dS51MTZbMF07CisJCQkJCS8vcEx0di0+dS51MTZbMF0gICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJLy9icmVhazsKKwkJCQljYXNlIENGR19DTkZfTUNBU1RfUkFURToKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0NORl9JTlRSQV9CU1NfUkVMQVk6CisJCQkJCWxwLT5pbnRyYUJTU1JlbGF5ICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKyNlbmRpZgorCisJCQkJY2FzZSBDRkdfQ05GX01JQ1JPX1dBVkU6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCS8vYnJlYWs7CisJCQkJLy9jYXNlIENGR19DTkZfTUVESVVNX0RJU1RSSUJVVElPTjoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCS8vYnJlYWs7CisJCQkJLy9jYXNlIENGR19DTkZfUlhfQUxMX0dST1VQX0FERFJFU1M6CisJCQkJCS8vIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcworCQkJCQkvL2JyZWFrOworCQkJCS8vY2FzZSBDRkdfQ05GX0NPVU5UUllfSU5GTzoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCS8vYnJlYWs7CisJCQkJY2FzZSBDRkdfQ05GX09XTl9TU0lEOgorCQkJCS8vY2FzZSBDTkZfREVTSVJFRF9TU0lEOgorCQkJCWNhc2UgQ0ZHX0RFU0lSRURfU1NJRDoKKwkJCQkJbWVtc2V0KCBscC0+TmV0d29ya05hbWUsIDAsIHNpemVvZiggbHAtPk5ldHdvcmtOYW1lICkpOworCQkJCQltZW1jcHkoICh2b2lkICopbHAtPk5ldHdvcmtOYW1lLCAodm9pZCAqKSZwTHR2LT51LnU4WzJdLCAoc2l6ZV90KXBMdHYtPnUudTE2WzBdICk7CisJCQkJCXBMdHYtPnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisKKwkJCQkJLyogdGFrZSBjYXJlIG9mIHRoZSBzcGVjaWFsIG5ldHdvcmsgbmFtZSAiQU5ZIiBjYXNlICovCisJCQkJCWlmKCggc3RybGVuKCAmcEx0di0+dS51OFsyXSAgICAgICAgKSA9PSAwICkgfHwKKwkJCQkJICAgKCBzdHJjbXAoICZwTHR2LT51LnU4WzJdLCAiQU5ZIiApID09IDAgKSB8fAorCQkJCQkgICAoIHN0cmNtcCggJnBMdHYtPnUudThbMl0sICJhbnkiICkgPT0gMCApKSB7CisJCQkJCQkvKiBzZXQgdGhlIFNTSURfU1RSQ1QgbGxlbiBmaWVsZCAodTE2WzBdKSB0byB6ZXJvLCBhbmQgdGhlCisJCQkJCQllZmZlY3R1YWxseSBudWxsIHRoZSBzdHJpbmcgdThbMl0gKi8KKwkJCQkJCXBMdHYtPnUudTE2WzBdID0gMDsKKwkJCQkJCXBMdHYtPnUudThbMl0gID0gMDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19HUk9VUF9BRERSOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQ1JFQVRFX0lCU1M6CisJCQkJCWxwLT5DcmVhdGVJQlNTICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUlRTX1RIUkg6CisJCQkJCWxwLT5SVFNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw6CisJCQkJCWxwLT5UeFJhdGVDb250cm9sWzBdICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCWxwLT5UeFJhdGVDb250cm9sWzFdICAgID0gcEx0di0+dS51MTZbMV07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCXBMdHYtPnUudTE2WzFdICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzFdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1BST01JU0NVT1VTX01PREU6CisJCQkJCS8qIFRPRE86IGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgYW55dGhpbmcgYmFzZWQgb24gdGhpcyAqLworCQkJCQlicmVhazsKKwkJCQkvL2Nhc2UgQ0ZHX1dBS0VfT05fTEFOOgorCQkJCQkvKiBUT0RPOiBkZXRlcm1pbmUgaWYgd2UgYXJlIGdvaW5nIHRvIHN0b3JlIGFueXRoaW5nIGJhc2VkIG9uIHRoaXMgKi8KKwkJCQkJLy9icmVhazsKKyNpZiAxIC8vOz8gI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKwkJCQljYXNlIENGR19SVFNfVEhSSDA6CisJCQkJCWxwLT5SVFNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwwOgorLy87P25vIGlkZWEgd2hhdCB0aGlzIHNob3VsZCBiZSwgZ2V0IGdvaW5nIHNvIGNvbW1lbnQgaXQgb3V0CQkJCQlscC0+VHhSYXRlQ29udHJvbCAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJYnJlYWs7CisjaWZkZWYgVVNFX1dEUworCQkJCWNhc2UgQ0ZHX1JUU19USFJIMToKKwkJCQkJbHAtPndkc19wb3J0WzBdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8xOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SVFNfVEhSSDI6CisJCQkJCWxwLT53ZHNfcG9ydFsxXS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUlRTX1RIUkgzOgorCQkJCQlscC0+d2RzX3BvcnRbMl0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JUU19USFJINDoKKwkJCQkJbHAtPndkc19wb3J0WzNdLnJ0c1RocmVzaG9sZCAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF80OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19SVFNfVEhSSDU6CisJCQkJCWxwLT53ZHNfcG9ydFs0XS5ydHNUaHJlc2hvbGQgICAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfUlRTX1RIUkg2OgorCQkJCQlscC0+d2RzX3BvcnRbNV0ucnRzVGhyZXNob2xkICAgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzY7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDE6CisJCQkJCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMjoKKwkJCQkJbHAtPndkc19wb3J0WzFdLnR4UmF0ZUNudGwgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF8yOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEwzOgorCQkJCQlscC0+d2RzX3BvcnRbMl0udHhSYXRlQ250bCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzM7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDQ6CisJCQkJCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgICAgICAgICAgPSBDTlZfSU5UX1RPX0xJVFRMRSggcEx0di0+dS51MTZbMF0gKTsKKwkJCQkJaGNmUG9ydCAgICAgICAgICAgICAgICAgICAgID0gSENGX1BPUlRfNDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMNToKKwkJCQkJbHAtPndkc19wb3J0WzRdLnR4UmF0ZUNudGwgID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICAgICAgICAgICAgICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQloY2ZQb3J0ICAgICAgICAgICAgICAgICAgICAgPSBIQ0ZfUE9SVF81OworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19UWF9SQVRFX0NOVEw2OgorCQkJCQlscC0+d2RzX3BvcnRbNV0udHhSYXRlQ250bCAgPSBwTHR2LT51LnUxNlswXTsKKwkJCQkJcEx0di0+dS51MTZbMF0gICAgICAgICAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWhjZlBvcnQgICAgICAgICAgICAgICAgICAgICA9IEhDRl9QT1JUXzY7CisJCQkJCWJyZWFrOworI2VuZGlmICAvKiBVU0VfV0RTICovCisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworCisJCQkJY2FzZSBDRkdfREVGQVVMVF9LRVlTOgorCQkJCQl7CisJCQkJCQlDRkdfREVGQVVMVF9LRVlTX1NUUkNUICpwS2V5cyA9IChDRkdfREVGQVVMVF9LRVlTX1NUUkNUICopcEx0djsKKworCQkJCQkJcEtleXMtPmtleVswXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVswXS5sZW4gKTsKKwkJCQkJCXBLZXlzLT5rZXlbMV0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzLT5rZXlbMV0ubGVuICk7CisJCQkJCQlwS2V5cy0+a2V5WzJdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5cy0+a2V5WzJdLmxlbiApOworCQkJCQkJcEtleXMtPmtleVszXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXMtPmtleVszXS5sZW4gKTsKKworCQkJCQkJbWVtY3B5KCAodm9pZCAqKSYobHAtPkRlZmF1bHRLZXlzKSwgKHZvaWQgKilwS2V5cywKKwkJCQkJCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RYX0tFWV9JRDoKKwkJCQkJbHAtPlRyYW5zbWl0S2V5SUQgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1NDQU5fU1NJRDoKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1RJQ0tfVElNRToKKwkJCQkJLyogVE9ETzogZGV0ZXJtaW5lIGlmIHdlIGFyZSBnb2luZyB0byBzdG9yZSBhbnl0aGluZyBiYXNlZCBvbiB0aGlzICovCisJCQkJCWJyZWFrOworCQkJCS8qIHRoZXNlIFJJRFMgYXJlIEluZm8gUklEcywgYW5kIHNob3VsZCB0aGV5IGJlIGFsbG93ZWQgZm9yIHB1dHM/Pz8gKi8KKwkJCQljYXNlIENGR19NQVhfTE9BRF9USU1FOgorCQkJCWNhc2UgQ0ZHX0RMX0JVRjoKKwkJCQkvL2Nhc2UgQ0ZHX0hTSV9TVVBfUkFOR0U6CisJCQkJY2FzZSBDRkdfTklDX1NFUklBTF9OVU1CRVI6CisJCQkJY2FzZSBDRkdfTklDX0lERU5USVRZOgorCQkJCWNhc2UgQ0ZHX05JQ19NRklfU1VQX1JBTkdFOgorCQkJCWNhc2UgQ0ZHX05JQ19DRklfU1VQX1JBTkdFOgorCQkJCWNhc2UgQ0ZHX05JQ19URU1QX1RZUEU6CisJCQkJY2FzZSBDRkdfTklDX1BST0ZJTEU6CisJCQkJY2FzZSBDRkdfRldfSURFTlRJVFk6CisJCQkJY2FzZSBDRkdfRldfU1VQX1JBTkdFOgorCQkJCWNhc2UgQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQToKKwkJCQljYXNlIENGR19DRklfQUNUX1JBTkdFU19TVEE6CisJCQkJY2FzZSBDRkdfUE9SVF9TVEFUOgorCQkJCWNhc2UgQ0ZHX0NVUl9TU0lEOgorCQkJCWNhc2UgQ0ZHX0NVUl9CU1NJRDoKKwkJCQljYXNlIENGR19DT01NU19RVUFMSVRZOgorCQkJCWNhc2UgQ0ZHX0NVUl9UWF9SQVRFOgorCQkJCWNhc2UgQ0ZHX0NVUl9CRUFDT05fSU5URVJWQUw6CisJCQkJY2FzZSBDRkdfQ1VSX1NDQUxFX1RIUkg6CisJCQkJY2FzZSBDRkdfUFJPVE9DT0xfUlNQX1RJTUU6CisJCQkJY2FzZSBDRkdfQ1VSX1NIT1JUX1JFVFJZX0xJTUlUOgorCQkJCWNhc2UgQ0ZHX0NVUl9MT05HX1JFVFJZX0xJTUlUOgorCQkJCWNhc2UgQ0ZHX01BWF9UWF9MSUZFVElNRToKKwkJCQljYXNlIENGR19NQVhfUlhfTElGRVRJTUU6CisJCQkJY2FzZSBDRkdfQ0ZfUE9MTEFCTEU6CisJCQkJY2FzZSBDRkdfQVVUSEVOVElDQVRJT05fQUxHT1JJVEhNUzoKKwkJCQljYXNlIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRDoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfUkVNT1RFX1JBVEVTOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9VU0VEX1JBVEVTOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9TWVNURU1fU0NBTEU6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEUxOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMjoKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTM6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1RYX1JBVEU0OgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNToKKwkJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfVFhfUkFURTY6CisJCQkJY2FzZSBDRkdfTklDX01BQ19BRERSOgorCQkJCWNhc2UgQ0ZHX1BDRl9JTkZPOgorCQkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9DT1VOVFJZX0lORk86CisJCQkJY2FzZSBDRkdfUEhZX1RZUEU6CisJCQkJY2FzZSBDRkdfQ1VSX0NIQU5ORUw6CisJCQkJLy9jYXNlIENGR19DVVJSRU5UX1BPV0VSX1NUQVRFOgorCQkJCS8vY2FzZSBDRkdfQ0NBTU9ERToKKwkJCQljYXNlIENGR19TVVBQT1JURURfREFUQV9SQVRFUzoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDRkdfQVBfTU9ERToKKy8vOz8JCQkJbHAtPkRvd25sb2FkRmlybXdhcmUgPSAoIHBMdHYtPnUudTE2WzBdICkgKyAxOworCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJzZXQgQ0ZHX0FQX01PREUgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIiApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19FTkNSWVBUX1NUUklORzoKKwkJCQkJLyogVE9ETzogRU5ESUFOIFRSQU5TTEFUSU9OIEhFUkU/Pz8gKi8KKwkJCQkJbWVtc2V0KCBscC0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2YoIGxwLT5zekVuY3J5cHRpb24gKSk7CisJCQkJCW1lbWNweSggKHZvaWQgKilscC0+c3pFbmNyeXB0aW9uLCAgKHZvaWQgKikmcEx0di0+dS51OFswXSwKKwkJCQkJCQkoIHBMdHYtPmxlbiAqIHNpemVvZiggaGNmXzE2ICkpICk7CisJCQkJCXdsX3dlcF9kZWNvZGUoIENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwKKwkJCQkJCQkJICAgIGxwLT5zekVuY3J5cHRpb24gKTsKKworCQkJCQkvKiB0aGUgTGludXggZHJpdmVyIGxpa2VzIHRvIHVzZSAxLTQgZm9yIHRoZSBrZXkgSURzLCBhbmQgdGhlbgorCQkJCQljb252ZXJ0IHRvIDAtMyB3aGVuIHNlbmRpbmcgdG8gdGhlIGNhcmQuICBUaGUgV2luZG93cyBjb2RlCisJCQkJCWJhc2UgdXNlZCAwLTMgaW4gdGhlIEFQSSBETEwsIHdoaWNoIHdhcyBwb3J0ZWQgdG8gTGludXguICBGb3IKKwkJCQkJdGhlIHNha2Ugb2YgdGhlIHVzZXIgZXhwZXJpZW5jZSwgd2UgZGVjaWRlZCB0byBrZWVwIDAtMyBhcyB0aGUKKwkJCQkJbnVtYmVycyB1c2VkIGluIHRoZSBETEw7IGFuZCB3aWxsIHBlcmZvcm0gdGhlICsxIGNvbnZlcnNpb24gaGVyZS4KKwkJCQkJV2UgY291bGQgaGF2ZSBjb252ZXJ0ZWQgIHRoZSBlbnRpcmUgTGludXggZHJpdmVyLCBidXQgdGhpcyBpcworCQkJCQlsZXNzIG9idHJ1c2l2ZS4gIFRoaXMgbWF5IGJlIGEgInRvZG8iIHRvIGNvbnZlcnQgdGhlIHdob2xlIGRyaXZlciAqLworCQkJCQlscC0+VHJhbnNtaXRLZXlJRCAgICA9IHNFbmNyeXB0aW9uLndUeEtleUlEICsgMTsKKwkJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSBzRW5jcnlwdGlvbi53RW5hYmxlZDsKKworCQkJCQltZW1jcHkoICZscC0+RGVmYXVsdEtleXMsICZzRW5jcnlwdGlvbi5FbmNTdHIsCisJCQkJCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOworCQkJCQlicmVhazsKKwkJCQkvKmNhc2UgQ0ZHX0NPVU5UUllfU1RSSU5HOgorCQkJCQltZW1zZXQoIGxwLT5jb3VudHJ5U3RyaW5nLCAwLCBzaXplb2YoIGxwLT5jb3VudHJ5U3RyaW5nICkpOworCQkJCQltZW1jcHkoICh2b2lkICopbHAtPmNvdW50cnlTdHJpbmcsICh2b2lkICopJnBMdHYtPnUudThbMl0sIChzaXplX3QpcEx0di0+dS51MTZbMF0pOworCQkJCQlicmVhazsKKwkJCQkqLworCisJCQkJY2FzZSBDRkdfRFJJVkVSX0VOQUJMRToKKwkJCQkJbHAtPmRyaXZlckVuYWJsZSAgICA9IHBMdHYtPnUudTE2WzBdOworCQkJCQlwTHR2LT51LnUxNlswXSAgICAgID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1dPTEFTX0VOQUJMRToKKwkJCQkJbHAtPndvbGFzRW5hYmxlID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19TRVRfV1BBX0FVVEhfS0VZX01HTVRfU1VJVEU6CisJCQkJCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gcEx0di0+dS51MTZbMF07CisJCQkJCXBMdHYtPnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNlswXSApOworCQkJCQlicmVhazsKKwkJCQljYXNlIENGR19ESVNBU1NPQ0lBVEVfQUREUjoKKwkJCQkJcEx0di0+dS51MTZbRVRIX0FMRU4gLyAyXSA9IENOVl9JTlRfVE9fTElUVExFKCBwTHR2LT51LnUxNltFVEhfQUxFTiAvIDJdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZOgorCQkJCWNhc2UgQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZOgorCQkJCQkvKiBFbmRpYW4gY29udmVydCB0aGUgVHggS2V5IEluZm9ybWF0aW9uICovCisJCQkJCXBMdHYtPnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIHBMdHYtPnUudTE2WzBdICk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX0FERF9US0lQX01BUFBFRF9LRVk6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVk6CisJCQkJCWJyZWFrOworCQkJCS8qIHNvbWUgUklEcyBqdXN0IGNhbid0IGJlIHB1dCAqLworCQkJCWNhc2UgQ0ZHX01CX0lORk86CisJCQkJY2FzZSBDRkdfSUZCOgorCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIFRoaXMgY29kZSB3aWxsIHByZXZlbnQgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMgZnJvbQorCQkJCSAgIGJlaW5nIHNlbnQgdG8gdGhlIGNhcmQsIGFzIHRoZXkgcmVxdWlyZSBhIGNhbGwgdG8KKwkJCQkgICBVSUxfQUNUX0FQUExZIHRvIHRha2UgZWZmZWN0LiBEeW5hbWljIEVudGl0aWVzIHdpbGwgYmUgc2VudAorCQkJCSAgIGltbWVkaWF0ZWx5ICovCisJCQkJc3dpdGNoKCBwTHR2LT50eXAgKSB7CisJCQkJY2FzZSBDRkdfQ05GX1BPUlRfVFlQRToKKwkJCQljYXNlIENGR19DTkZfT1dOX01BQ19BRERSOgorCQkJCWNhc2UgQ0ZHX0NORl9PV05fQ0hBTk5FTDoKKwkJCQljYXNlIENGR19DTkZfT1dOX1NTSUQ6CisJCQkJY2FzZSBDRkdfQ05GX09XTl9BVElNX1dJTkRPVzoKKwkJCQljYXNlIENGR19DTkZfU1lTVEVNX1NDQUxFOgorCQkJCWNhc2UgQ0ZHX0NORl9NQVhfREFUQV9MRU46CisJCQkJY2FzZSBDRkdfQ05GX1BNX0VOQUJMRUQ6CisJCQkJY2FzZSBDRkdfQ05GX01DQVNUX1JYOgorCQkJCWNhc2UgQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT046CisJCQkJY2FzZSBDRkdfQ05GX0hPTERPVkVSX0RVUkFUSU9OOgorCQkJCWNhc2UgQ0ZHX0NORl9PV05fTkFNRToKKwkJCQljYXNlIENGR19DTkZfTE9BRF9CQUxBTkNJTkc6CisJCQkJY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CisjaWZkZWYgV0FSUAorCQkJCWNhc2UgQ0ZHX0NORl9UWF9QT1dfTFZMOgorCQkJCWNhc2UgQ0ZHX0NORl9DT05ORUNUSU9OX0NOVEw6CisJCQkJLy9jYXNlIENGR19QUk9CRV9EQVRBX1JBVEU6CisjZW5kaWYgLy8gSEVSTUVTMjUKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisJCS8vOz9zaG91bGQgd2UgcmVzdG9yZSB0aGlzIHRvIGFsbG93IHNtYWxsZXIgbWVtb3J5IGZvb3RwcmludAorCQkJCWNhc2UgQ0ZHX0NORl9PV05fRFRJTV9QRVJJT0Q6CisjaWZkZWYgV0FSUAorCQkJCWNhc2UgQ0ZHX0NORl9PV05fQkVBQ09OX0lOVEVSVkFMOiAgICAgICAgICAgICAgICAgICAgLy8gT3duIEJlYWNvbiBJbnRlcnZhbAorI2VuZGlmIC8vIFdBUlAKKyNpZmRlZiBVU0VfV0RTCisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMToKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFIyOgorCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjM6CisJCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNDoKKwkJCQljYXNlIENGR19DTkZfV0RTX0FERFI1OgorCQkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjY6CisjZW5kaWYKKwkJCQljYXNlIENGR19DTkZfTUNBU1RfUE1fQlVGOgorCQkJCWNhc2UgQ0ZHX0NORl9SRUpFQ1RfQU5ZOgorI2VuZGlmCisKKwkJCQljYXNlIENGR19DTkZfRU5DUllQVElPTjoKKwkJCQljYXNlIENGR19DTkZfQVVUSEVOVElDQVRJT046CisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKworCQkJCWNhc2UgQ0ZHX0NORl9FWENMX1VORU5DUllQVEVEOgorCQkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SQVRFOgorCQkJCWNhc2UgQ0ZHX0NORl9JTlRSQV9CU1NfUkVMQVk6CisjZW5kaWYKKworCQkJCWNhc2UgQ0ZHX0NORl9NSUNST19XQVZFOgorCQkJCS8vY2FzZSBDRkdfQ05GX0xPQURfQkFMQU5DSU5HOgorCQkJCS8vY2FzZSBDRkdfQ05GX01FRElVTV9ESVNUUklCVVRJT046CisJCQkJLy9jYXNlIENGR19DTkZfUlhfQUxMX0dST1VQX0FERFJFU1M6CisJCQkJLy9jYXNlIENGR19DTkZfQ09VTlRSWV9JTkZPOgorCQkJCS8vY2FzZSBDRkdfQ09VTlRSWV9TVFJJTkc6CisJCQkJY2FzZSBDRkdfQVBfTU9ERToKKwkJCQljYXNlIENGR19FTkNSWVBUX1NUUklORzoKKwkJCQkvL2Nhc2UgQ0ZHX0RSSVZFUl9FTkFCTEU6CisJCQkJY2FzZSBDRkdfV09MQVNfRU5BQkxFOgorCQkJCWNhc2UgQ0ZHX01CX0lORk86CisJCQkJY2FzZSBDRkdfSUZCOgorCQkJCQlicmVhazsKKwkJCQkvKiBEZWFsIHdpdGggdGhpcyBkeW5hbWljIE1TRiBSSUQsIGFzIGl0J3MgcmVxdWlyZWQgZm9yIFdQQSAqLworCQkJCWNhc2UgQ0ZHX0RSSVZFUl9FTkFCTEU6CisJCQkJCWlmKCBscC0+ZHJpdmVyRW5hYmxlICkgeworCQkJCQkJLy9oY2ZfY250bF9wb3J0KCAmKCBscC0+aGNmQ3R4ICksCisJCQkJCQkvLyAgICAgICAgICAgICAgIEhDRl9QT1JUX0VOQUJMRSB8IEhDRl9QT1JUXzAgKTsKKwkJCQkJCS8vIC8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwKKwkJCQkJCS8vIC8vICAgICAgICAgSENGX1BPUlRfRU5BQkxFIHwgSENGX1BPUlRfMCApOworCQkJCQkJLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9FTkFCTEUgKTsKKwkJCQkJCS8vIC8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfQ09OTkVDVCApOworCisJCQkJCQloY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9FTkFCTEUgfCBIQ0ZfUE9SVF8wICk7CisJCQkJCQloY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9DT05ORUNUICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvL2hjZl9jbnRsX3BvcnQoICYoIGxwLT5oY2ZDdHggKSwKKwkJCQkJCS8vICAgICAgICAgICAgICAgSENGX1BPUlRfRElTQUJMRSB8IEhDRl9QT1JUXzAgKTsKKwkJCQkJCS8vIC8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwKKwkJCQkJCS8vIC8vICAgICAgICAgSENGX1BPUlRfRElTQUJMRSB8IEhDRl9QT1JUXzAgKTsKKwkJCQkJCS8vaGNmX2NudGwoICYoIGxwLT5oY2ZDdHggKSwgSENGX0NOVExfRElTQUJMRSApOworCQkJCQkJLy8gLy9oY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9ESVNDT05ORUNUICk7CisKKwkJCQkJCWhjZl9jbnRsKCAmKCBscC0+aGNmQ3R4ICksIEhDRl9DTlRMX0RJU0FCTEUgfCBIQ0ZfUE9SVF8wICk7CisJCQkJCQloY2ZfY250bCggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQ05UTF9ESVNDT05ORUNUICk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKyAgICAJCQkJCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCQkJCQl1cnEtPnJlc3VsdCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkgcEx0dik7CisgICAgCQkJCQl3bF9hY3RfaW50X29uKCBscCApOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiggbHR2QWxsb2NhdGVkICkgeworCQkJCQlrZnJlZSggcEx0diApOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgIkVQRVJNXG4iICk7CisJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJcmVzdWx0ID0gLUVQRVJNOworCQl9CisJfSBlbHNlIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9XUk9OR19JRkJcbiIgKTsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX1dST05HX0lGQjsKKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyB3dmxhbl91aWxfcHV0X2luZm8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl91aWxfZ2V0X2luZm8oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZW5kcyBhIHNwZWNpZmljIFJJRCBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHRvIHJldHJpZXZlIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgaW5mby4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHVycSAtIGEgcG9pbnRlciB0byB0aGUgVUlMIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVUlMX1NVQ0NFU1MKKyAqICAgICAgVUlMX0VSUl94eHggdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl91aWxfZ2V0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgaTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlEQkdfRlVOQyggInd2bGFuX3VpbF9nZXRfaW5mbyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKCB1cnEtPmhjZkN0eCA9PSAmKCBscC0+aGNmQ3R4ICkpIHsKKwkJaWYoKCB1cnEtPmRhdGEgIT0gTlVMTCApICYmICggdXJxLT5sZW4gIT0gMCApKSB7CisJCQlsdHZfdCAgICAgICpwTHR2OworCQkJYm9vbF90ICAgICAgbHR2QWxsb2NhdGVkID0gRkFMU0U7CisKKwkJCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgYSBjb21tYW5kIGFuZCBsZW5ndGggKi8KKwkJCWlmKCB1cnEtPmxlbiA8ICggc2l6ZW9mKCBoY2ZfMTYgKSAqIDIgKSkgeworCQkJCXVycS0+bGVuID0gc2l6ZW9mKCBscC0+bHR2UmVjb3JkICk7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiTm8gTGVuZ3RoL1R5cGUgaW4gTFRWISEhXG4iICk7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiVUlMX0VSUl9MRU5cbiIgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCS8qIFZlcmlmeSB0aGUgdXNlcidzIExUViByZWNvcmQgaGVhZGVyLiAqLworCQkJcmVzdWx0ID0gdmVyaWZ5X2FyZWEoIFZFUklGWV9SRUFELCB1cnEtPmRhdGEsIHNpemVvZiggaGNmXzE2ICkgKiAyICk7CisJCQlpZiggcmVzdWx0ICE9IDAgKSB7CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAidmVyaWZ5X2FyZWEoKSwgVkVSSUZZX1JFQUQgRkFJTEVEXG4iICk7CisJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCisJCQkvKiBHZXQgb25seSB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIGluZm9ybWF0aW9uLiAqLworCQkJcmVzdWx0ID0gY29weV9mcm9tX3VzZXIoICYoIGxwLT5sdHZSZWNvcmQgKSwgdXJxLT5kYXRhLCBzaXplb2YoIGhjZl8xNiApICogMiApOworCisJCQkvKiBNYWtlIHN1cmUgdGhlIGluY29taW5nIExUViByZWNvcmQgbGVuZ3RoIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mCisJCQkgICB0aGUgSU9DVEwgbGVuZ3RoLiAqLworCQkJaWYoKCggbHAtPmx0dlJlY29yZC5sZW4gKyAxICkgKiBzaXplb2YoIGhjZl8xNiApKSA+IHVycS0+bGVuICkgeworCQkJCURCR19FUlJPUiggRGJnSW5mbywgIkluY29taW5nIExUViB0b28gYmlnXG4iICk7CisJCQkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisKKwkJCS8qIERldGVybWluZSBpZiBoY2ZfZ2V0X2luZm8oKSBpcyBuZWVkZWQgb3Igbm90ICovCisJCQlzd2l0Y2ggKCBscC0+bHR2UmVjb3JkLnR5cCApIHsKKwkJCWNhc2UgQ0ZHX05JQ19JREVOVElUWToKKwkJCQltZW1jcHkoICZscC0+bHR2UmVjb3JkLnUudThbMF0sICZscC0+TklDSWRlbnRpdHksIHNpemVvZiggbHAtPk5JQ0lkZW50aXR5ICkpOworCQkJCWJyZWFrOworCQkJY2FzZSBDRkdfUFJJX0lERU5USVRZOgorCQkJCW1lbWNweSggJmxwLT5sdHZSZWNvcmQudS51OFswXSwgJmxwLT5QcmltYXJ5SWRlbnRpdHksIHNpemVvZiggbHAtPlByaW1hcnlJZGVudGl0eSApKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0FQX01PREU6CisJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAic2V0IENGR19BUF9NT0RFIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHNvIGlzIGdldCB1c2VmdWwgPz8/P1xuIiApOworCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPQorCQkJCQlDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmhjZkN0eC5JRkJfRldJZGVudGl0eS5jb21wX2lkICkgPT0gQ09NUF9JRF9GV19BUDsKKwkJCQlicmVhazsKKwkJCS8vY2FzZSBDRkdfRFJWX0lORk86CisJCQljYXNlIENGR19FTkNSWVBUX1NUUklORzoKKwkJCWNhc2UgQ0ZHX0NPVU5UUllfU1RSSU5HOgorCQkJY2FzZSBDRkdfRFJJVkVSX0VOQUJMRToKKwkJCWNhc2UgQ0ZHX1dPTEFTX0VOQUJMRToKKwkJCQkvLyBUT0RPOiBkZXRlcm1pbmUgaWYgd2UncmUgZ29pbmcgdG8gc3VwcG9ydCB0aGVzZQorCQkJCXVycS0+cmVzdWx0ID0gVUlMX0ZBSUxVUkU7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19EUlZfSU5GTzoKKwkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJbnRlcmNlcHQgQ0ZHX0RSVl9JTkZPXG4iICk7CisJCQkJcmVzdWx0ID0gY2ZnX2RyaXZlcl9pbmZvKCB1cnEsIGxwICk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19EUlZfSURFTlRJVFk6CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSW50ZXJjZXB0IENGR19EUlZfSURFTlRJVFlcbiIgKTsKKwkJCQlyZXN1bHQgPSBjZmdfZHJpdmVyX2lkZW50aXR5KCB1cnEsIGxwICk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19JRkI6CisJCQkJLyogSUZCIGNhbiBiZSBhIHNlY3VyaXR5IGhvbGUgKi8KKwkJCQlpZiggIWNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQkJCQlyZXN1bHQgPSAtRVBFUk07CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0ICovCisKKwkJCWNhc2UgQ0ZHX0ZXX0lERU5USVRZOiAgIC8vIEZvciBIZXJtZXMtMSwgdGhpcyBpcyBjYWNoZWQKKwkJCWRlZmF1bHQ6CisKKwkJCQkvKiBWZXJpZnkgdGhlIHVzZXIgYnVmZmVyICovCisJCQkJcmVzdWx0ID0gdmVyaWZ5X2FyZWEoIFZFUklGWV9XUklURSwgdXJxLT5kYXRhLCB1cnEtPmxlbiApOworCQkJCWlmKCByZXN1bHQgIT0gMCApIHsKKwkJCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAidmVyaWZ5X2FyZWEoKSwgVkVSSUZZX1dSSVRFIEZBSUxFRFxuIiApOworCQkJCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQkvKiBJZiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2Ygb3VyIGxvY2FsCisJCQkJICAgTFRWIHJlY29yZCwgdHJ5IHRvIGFsbG9jYXRlIGl0IGZyb20gdGhlIGtlcm5lbCBzdGFjay4KKwkJCQkgICBPdGhlcndpc2UsIHdlIGp1c3QgdXNlIG91ciBsb2NhbCBMVFYgcmVjb3JkLiAqLworCQkJCWlmKCB1cnEtPmxlbiA+IHNpemVvZiggbHAtPmx0dlJlY29yZCApKSB7CisJCQkJCWlmKCggcEx0diA9IChsdHZfdCAqKWttYWxsb2MoIHVycS0+bGVuLCBHRlBfS0VSTkVMICkpICE9IE5VTEwgKSB7CisJCQkJCQlsdHZBbGxvY2F0ZWQgPSBUUlVFOworCisJCQkJCQkvKiBDb3B5IHRoZSBjb21tYW5kL2xlbmd0aCBpbmZvcm1hdGlvbiBpbnRvIHRoZSBuZXcgYnVmZmVyLiAqLworCQkJCQkJbWVtY3B5KCBwTHR2LCAmKCBscC0+bHR2UmVjb3JkICksIHNpemVvZiggaGNmXzE2ICkgKiAyICk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl1cnEtPmxlbiA9IHNpemVvZiggbHAtPmx0dlJlY29yZCApOworCQkJCQkJdXJxLT5yZXN1bHQgPSBVSUxfRVJSX0xFTjsKKwkJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImttYWxsb2MgRkFJTEVEXG4iICk7CisJCQkJCQlEQkdfRVJST1IoIERiZ0luZm8sICJVSUxfRVJSX0xFTlxuIiApOworCQkJCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcEx0diA9ICYoIGxwLT5sdHZSZWNvcmQgKTsKKwkJCQl9CisKKyAgICAJCQkJd2xfYWN0X2ludF9vZmYoIGxwICk7CisJCQkJdXJxLT5yZXN1bHQgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApIHBMdHYgKTsKKyAgICAJCQkJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCQkJCS8vIENvcHkgdGhlIExUViBpbnRvIHRoZSB1c2VyJ3MgYnVmZmVyLgorCQkJCS8vY29weV90b191c2VyKCB1cnEtPmRhdGEsIHBMdHYsIHVycS0+bGVuICk7CisKKwkJCQkvL2lmKCBsdHZBbGxvY2F0ZWQgKQorCQkJCS8veworCQkJCS8vICAgIGtmcmVlKCBwTHR2ICk7CisJCQkJLy99CisKKwkJCQkvL3VycS0+cmVzdWx0ID0gVUlMX1NVQ0NFU1M7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEhhbmRsZSBlbmRpYW4gY29udmVyc2lvbiBvZiBzcGVjaWFsIGZpZWxkcyAqLworCQkJc3dpdGNoKCBscC0+bHR2UmVjb3JkLnR5cCApIHsKKwkJCS8qIHNpbXBsZSBpbnQgZ2V0cyBqdXN0IG5lZWQgdGhlIGZpcnN0IGhjZl8xNiBieXRlIGZsaXBwZWQgKi8KKwkJCWNhc2UgQ0ZHX0NORl9QT1JUX1RZUEU6CisJCQljYXNlIENGR19DTkZfT1dOX0NIQU5ORUw6CisJCQljYXNlIENGR19DTkZfT1dOX0FUSU1fV0lORE9XOgorCQkJY2FzZSBDRkdfQ05GX1NZU1RFTV9TQ0FMRToKKwkJCWNhc2UgQ0ZHX0NORl9NQVhfREFUQV9MRU46CisJCQljYXNlIENGR19DTkZfUE1fRU5BQkxFRDoKKwkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SWDoKKwkJCWNhc2UgQ0ZHX0NORl9NQVhfU0xFRVBfRFVSQVRJT046CisJCQljYXNlIENGR19DTkZfSE9MRE9WRVJfRFVSQVRJT046CisJCQljYXNlIENGR19DTkZfT1dOX0RUSU1fUEVSSU9EOgorCQkJY2FzZSBDRkdfQ05GX01DQVNUX1BNX0JVRjoKKwkJCWNhc2UgQ0ZHX0NORl9SRUpFQ1RfQU5ZOgorCQkJY2FzZSBDRkdfQ05GX0VOQ1JZUFRJT046CisJCQljYXNlIENGR19DTkZfQVVUSEVOVElDQVRJT046CisJCQljYXNlIENGR19DTkZfRVhDTF9VTkVOQ1JZUFRFRDoKKwkJCWNhc2UgQ0ZHX0NORl9JTlRSQV9CU1NfUkVMQVk6CisJCQljYXNlIENGR19DTkZfTUlDUk9fV0FWRToKKwkJCWNhc2UgQ0ZHX0NORl9MT0FEX0JBTEFOQ0lORzoKKwkJCWNhc2UgQ0ZHX0NORl9NRURJVU1fRElTVFJJQlVUSU9OOgorI2lmZGVmIFdBUlAKKwkJCWNhc2UgQ0ZHX0NORl9UWF9QT1dfTFZMOgorCQkJY2FzZSBDRkdfQ05GX0NPTk5FQ1RJT05fQ05UTDoKKwkJCWNhc2UgQ0ZHX0NORl9PV05fQkVBQ09OX0lOVEVSVkFMOiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duIEJlYWNvbiBJbnRlcnZhbAorCQkJY2FzZSBDRkdfQ09FWElTVEVOU0VfQkVIQVZJT1VSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2V4aXN0ZW5jZSBCZWhhdmlvcgorCQkJLy9jYXNlIENGR19DTkZfUlhfQUxMX0dST1VQX0FERFJFU1M6CisjZW5kaWYgLy8gSEVSTUVTMjUKKwkJCWNhc2UgQ0ZHX0NSRUFURV9JQlNTOgorCQkJY2FzZSBDRkdfUlRTX1RIUkg6CisJCQljYXNlIENGR19QUk9NSVNDVU9VU19NT0RFOgorCQkJLy9jYXNlIENGR19XQUtFX09OX0xBTjoKKwkJCWNhc2UgQ0ZHX1JUU19USFJIMDoKKwkJCWNhc2UgQ0ZHX1JUU19USFJIMToKKwkJCWNhc2UgQ0ZHX1JUU19USFJIMjoKKwkJCWNhc2UgQ0ZHX1JUU19USFJIMzoKKwkJCWNhc2UgQ0ZHX1JUU19USFJINDoKKwkJCWNhc2UgQ0ZHX1JUU19USFJINToKKwkJCWNhc2UgQ0ZHX1JUU19USFJINjoKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDA6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEwxOgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMMjoKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDM6CisJCQljYXNlIENGR19UWF9SQVRFX0NOVEw0OgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMNToKKwkJCWNhc2UgQ0ZHX1RYX1JBVEVfQ05UTDY6CisJCQljYXNlIENGR19UWF9LRVlfSUQ6CisJCQljYXNlIENGR19USUNLX1RJTUU6CisJCQljYXNlIENGR19NQVhfTE9BRF9USU1FOgorCQkJY2FzZSBDRkdfTklDX1RFTVBfVFlQRToKKwkJCWNhc2UgQ0ZHX1BPUlRfU1RBVDoKKwkJCWNhc2UgQ0ZHX0NVUl9UWF9SQVRFOgorCQkJY2FzZSBDRkdfQ1VSX0JFQUNPTl9JTlRFUlZBTDoKKwkJCWNhc2UgQ0ZHX1BST1RPQ09MX1JTUF9USU1FOgorCQkJY2FzZSBDRkdfQ1VSX1NIT1JUX1JFVFJZX0xJTUlUOgorCQkJY2FzZSBDRkdfQ1VSX0xPTkdfUkVUUllfTElNSVQ6CisJCQljYXNlIENGR19NQVhfVFhfTElGRVRJTUU6CisJCQljYXNlIENGR19NQVhfUlhfTElGRVRJTUU6CisJCQljYXNlIENGR19DRl9QT0xMQUJMRToKKwkJCWNhc2UgQ0ZHX1BSSVZBQ1lfT1BUX0lNUExFTUVOVEVEOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1JFTU9URV9SQVRFUzoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9VU0VEX1JBVEVTOgorCQkJLy9jYXNlIENGR19DVVJSRU5UX1NZU1RFTV9TQ0FMRToKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMToKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMjoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFMzoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNDoKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNToKKwkJCS8vY2FzZSBDRkdfQ1VSUkVOVF9UWF9SQVRFNjoKKwkJCWNhc2UgQ0ZHX1BIWV9UWVBFOgorCQkJY2FzZSBDRkdfQ1VSX0NIQU5ORUw6CisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfUE9XRVJfU1RBVEU6CisJCQkvL2Nhc2UgQ0ZHX0NDQU1PREU6CisJCQkvLyAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCS8vICAgIGJyZWFrOworCQkJLyogbmFtZSBzdHJpbmcgZ2V0cyBqdXN0IG5lZWQgdGhlIGZpcnN0IGhjZl8xNiBieXRlIGZsaXBwZWQgKGxlbmd0aCBvZiBzdHJpbmcpICovCisJCQljYXNlIENGR19DTkZfT1dOX1NTSUQ6CisJCQljYXNlIENGR19DTkZfT1dOX05BTUU6CisJCQkvL2Nhc2UgQ05GX0RFU0lSRURfU1NJRDoKKwkJCWNhc2UgQ0ZHX0RFU0lSRURfU1NJRDoKKwkJCWNhc2UgQ0ZHX1NDQU5fU1NJRDoKKwkJCWNhc2UgQ0ZHX0NVUl9TU0lEOgorCQkJCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRSggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCQkJCWJyZWFrOworCQkJLyogbm9uLWxlbmd0aCBjb3VudGVkIHN0cmluZ3MgbmVlZCBubyBieXRlIGZsaXBwaW5nICovCisJCQljYXNlIENGR19DTkZfT1dOX01BQ19BRERSOgorCQkJLyogdGhpcyBjYXNlIGlzIG5vIGxvbmdlciB2YWxpZDogQ0ZHX0NORl9XRFNfQUREUiAqLworCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSMToKKwkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjI6CisJCQljYXNlIENGR19DTkZfV0RTX0FERFIzOgorCQkJY2FzZSBDRkdfQ05GX1dEU19BRERSNDoKKwkJCWNhc2UgQ0ZHX0NORl9XRFNfQUREUjU6CisJCQljYXNlIENGR19DTkZfV0RTX0FERFI2OgorCQkJY2FzZSBDRkdfR1JPVVBfQUREUjoKKwkJCWNhc2UgQ0ZHX05JQ19TRVJJQUxfTlVNQkVSOgorCQkJY2FzZSBDRkdfQ1VSX0JTU0lEOgorCQkJY2FzZSBDRkdfTklDX01BQ19BRERSOgorCQkJY2FzZSBDRkdfU1VQUE9SVEVEX0RBVEFfUkFURVM6ICAvKiBuZWVkIHRvIGVuc3VyZSB3ZSBjYW4gdHJlYXQgdGhpcyBhcyBhIHN0cmluZyAqLworCQkJCWJyZWFrOworCQkJLy9jYXNlIENGR19DTkZfQ09VTlRSWV9JTkZPOiAgICAgIC8qIHNwZWNpYWwgY2FzZSwgc2VlIHBhZ2UgNzUgIG9mIDAyMjQ4NiwgUmV2IEMuICovCisJCQkvL2Nhc2UgQ0ZHX0NVUlJFTlRfQ09VTlRSWV9JTkZPOiAgLyogc3BlY2lhbCBjYXNlLCBzZWUgcGFnZSAxMDEgb2YgMDIyNDg2LCBSZXYgQy4gKi8KKwkJCS8qCisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlszXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzNdICk7CisKKwkJCQlmb3IoIGkgPSA0OyBpIDwgbHAtPmx0dlJlY29yZC5sZW47IGkrKyApIHsKKwkJCQkJbHAtPmx0dlJlY29yZC51LnUxNltpXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2W2ldICk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJKi8KKworCQkJY2FzZSBDRkdfREVGQVVMVF9LRVlTOgorCQkJCXsKKwkJCQkJQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCAqcEtleXMgPSAoQ0ZHX0RFRkFVTFRfS0VZU19TVFJDVCAqKSZscC0+bHR2UmVjb3JkLnUudThbMF07CisKKwkJCQkJcEtleXNbMF0ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzWzBdLmxlbiApOworCQkJCQlwS2V5c1sxXS5sZW4gPSBDTlZfSU5UX1RPX0xJVFRMRSggcEtleXNbMV0ubGVuICk7CisJCQkJCXBLZXlzWzJdLmxlbiA9IENOVl9JTlRfVE9fTElUVExFKCBwS2V5c1syXS5sZW4gKTsKKwkJCQkJcEtleXNbM10ubGVuID0gQ05WX0lOVF9UT19MSVRUTEUoIHBLZXlzWzNdLmxlbiApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX0NORl9NQ0FTVF9SQVRFOgorCQkJY2FzZSBDRkdfVFhfUkFURV9DTlRMOgorCQkJY2FzZSBDRkdfU1VQUE9SVEVEX1JBVEVfU0VUX0NOVEw6ICAgIC8vIFN1cHBvcnRlZCBSYXRlIFNldCBDb250cm9sCisJCQljYXNlIENGR19CQVNJQ19SQVRFX1NFVF9DTlRMOiAgICAvLyBCYXNpYyBSYXRlIFNldCBDb250cm9sCisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzFdICk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19ETF9CVUY6CisJCQljYXNlIENGR19OSUNfSURFTlRJVFk6CisJCQljYXNlIENGR19DT01NU19RVUFMSVRZOgorCQkJY2FzZSBDRkdfUENGX0lORk86CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlswXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsxXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzFdICk7CisJCQkJbHAtPmx0dlJlY29yZC51LnUxNlsyXSA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+bHR2UmVjb3JkLnUudTE2WzJdICk7CisJCQkJYnJlYWs7CisJCQljYXNlIENGR19GV19JREVOVElUWToKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMV0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzJdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMl0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzNdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbM10gKTsKKwkJCQlicmVhazsKKwkJCS8vY2FzZSBDRkdfSFNJX1NVUF9SQU5HRToKKwkJCWNhc2UgQ0ZHX05JQ19NRklfU1VQX1JBTkdFOgorCQkJY2FzZSBDRkdfTklDX0NGSV9TVVBfUkFOR0U6CisJCQljYXNlIENGR19OSUNfUFJPRklMRToKKwkJCWNhc2UgQ0ZHX0ZXX1NVUF9SQU5HRToKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzFdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMV0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzJdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbMl0gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzNdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbM10gKTsKKwkJCQlscC0+bHR2UmVjb3JkLnUudTE2WzRdID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbNF0gKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX01GSV9BQ1RfUkFOR0VTX1NUQToKKwkJCWNhc2UgQ0ZHX0NGSV9BQ1RfUkFOR0VTX1NUQToKKwkJCWNhc2UgQ0ZHX0NVUl9TQ0FMRV9USFJIOgorCQkJY2FzZSBDRkdfQVVUSEVOVElDQVRJT05fQUxHT1JJVEhNUzoKKwkJCQlmb3IoIGkgPSAwOyBpIDwgKCBscC0+bHR2UmVjb3JkLmxlbiAtIDEgKTsgaSsrICkgeworCQkJCQlscC0+bHR2UmVjb3JkLnUudTE2W2ldID0gQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5sdHZSZWNvcmQudS51MTZbaV0gKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkvKiBkb25lIGF0IGluaXQgdGltZSwgYW5kIGVuZGlhbiBoYW5kbGVkIHRoZW4gKi8KKwkJCWNhc2UgQ0ZHX1BSSV9JREVOVElUWToKKwkJCQlicmVhazsKKwkJCWNhc2UgQ0ZHX01CX0lORk86CisJCQkJLy93dmxhbkVuZGlhblRyYW5zbGF0ZU1haWxib3goIHBMdHYgKTsKKwkJCQlicmVhazsKKwkJCS8qIE1TRiBhbmQgSENGIFJJRFMgKi8KKwkJCWNhc2UgQ0ZHX0lGQjoKKwkJCWNhc2UgQ0ZHX0RSVl9JTkZPOgorCQkJY2FzZSBDRkdfQVBfTU9ERToKKwkJCWNhc2UgQ0ZHX0VOQ1JZUFRfU1RSSU5HOgorCQkJY2FzZSBDRkdfQ09VTlRSWV9TVFJJTkc6CisJCQljYXNlIENGR19EUklWRVJfRU5BQkxFOgorCQkJY2FzZSBDRkdfV09MQVNfRU5BQkxFOgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLy8gQ29weSB0aGUgTFRWIGludG8gdGhlIHVzZXIncyBidWZmZXIuCisJCQljb3B5X3RvX3VzZXIoIHVycS0+ZGF0YSwgJiggbHAtPmx0dlJlY29yZCApLCB1cnEtPmxlbiApOworCisJCQlpZiggbHR2QWxsb2NhdGVkICkgeworCQkJCWtmcmVlKCAmKCBscC0+bHR2UmVjb3JkICkpOworCQkJfQorCisJCQl1cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJfQorCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIlVJTF9FUlJfV1JPTkdfSUZCXG4iICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9XUk9OR19JRkI7CisJfQorCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gd3ZsYW5fdWlsX2dldF9pbmZvCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgljZmdfZHJpdmVyX2luZm8oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXRyaWV2ZXMgZHJpdmVyIGluZm9ybWF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNmZ19kcml2ZXJfaW5mbyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworCWludCByZXN1bHQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJjZmdfZHJpdmVyX2luZm8iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHVzZXIgYnVmZmVyIGNhbiBoYW5kbGUgdGhlIGRyaXZlciBpbmZvcm1hdGlvbiBidWZmZXIgKi8KKwlpZiggdXJxLT5sZW4gPCBzaXplb2YoIGxwLT5kcml2ZXJJbmZvICkpIHsKKwkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5kcml2ZXJJbmZvICk7CisJCXVycS0+cmVzdWx0ID0gVUlMX0VSUl9MRU47CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIFZlcmlmeSB0aGUgdXNlciBidWZmZXIuICovCisJcmVzdWx0ID0gdmVyaWZ5X2FyZWEoIFZFUklGWV9XUklURSwgdXJxLT5kYXRhLCBzaXplb2YoIGxwLT5kcml2ZXJJbmZvICkpOworCWlmKCByZXN1bHQgIT0gMCApIHsKKwkJdXJxLT5yZXN1bHQgPSBVSUxfRkFJTFVSRTsKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJbHAtPmRyaXZlckluZm8uY2FyZF9zdGF0ID0gbHAtPmhjZkN0eC5JRkJfQ2FyZFN0YXQ7CisKKwkvLyBDb3B5IHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KKwl1cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCWNvcHlfdG9fdXNlciggdXJxLT5kYXRhLCAmKCBscC0+ZHJpdmVySW5mbyApLCBzaXplb2YoIGxwLT5kcml2ZXJJbmZvICkpOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJlc3VsdDsKK30gLy8gY2ZnX2RyaXZlcl9pbmZvCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJY2ZnX2RyaXZlcl9pZGVudGl0eSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHJpZXZlcyBJRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdXJxIC0gYSBwb2ludGVyIHRvIHRoZSBVSUwgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBVSUxfU1VDQ0VTUworICogICAgICBVSUxfRVJSX3h4eCB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNmZ19kcml2ZXJfaWRlbnRpdHkoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid3ZsYW5fZHJpdmVyX2lkZW50aXR5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisKKwkvKiBNYWtlIHN1cmUgdGhhdCB1c2VyIGJ1ZmZlciBjYW4gaGFuZGxlIHRoZSBkcml2ZXIgaWRlbnRpdHkgc3RydWN0dXJlLiAqLworCWlmKCB1cnEtPmxlbiA8IHNpemVvZiggbHAtPmRyaXZlcklkZW50aXR5ICkpIHsKKwkJdXJxLT5sZW4gPSBzaXplb2YoIGxwLT5kcml2ZXJJZGVudGl0eSApOworCQl1cnEtPnJlc3VsdCA9IFVJTF9FUlJfTEVOOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBWZXJpZnkgdGhlIHVzZXIgYnVmZmVyLiAqLworCXJlc3VsdCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfV1JJVEUsIHVycS0+ZGF0YSwgc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSk7CisJaWYoIHJlc3VsdCAhPSAwICkgeworCQl1cnEtPnJlc3VsdCA9IFVJTF9GQUlMVVJFOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBDb3B5IHRoZSBkcml2ZXIgaWRlbnRpdHkgaW50byB0aGUgdXNlcidzIGJ1ZmZlci4gKi8KKwl1cnEtPnJlc3VsdCA9IFVJTF9TVUNDRVNTOworCWNvcHlfdG9fdXNlciggdXJxLT5kYXRhLCAmKCBscC0+ZHJpdmVySWRlbnRpdHkgKSwgc2l6ZW9mKCBscC0+ZHJpdmVySWRlbnRpdHkgKSk7CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvLyBjZmdfZHJpdmVyX2lkZW50aXR5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNlbmRpZiAgLyogVVNFX1VJTCAqLworCisKKy8qIElmIFdJUkVMRVNTX0VYVCBpcyBub3QgZGVmaW5lZCwgdGhlbiB0aGUgZnVuY3Rpb25zIHRoYXQgZm9sbG93IHdpbGwgbm90IGJlCisgICBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuICovCisvKiBOT1RFOiBBcmUgdGhlc2Ugc3RpbGwgZXZlbiBuZWVkZWQ/ICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3NldF9uZXRuYW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0IHRoZSBFU1NJRCBvZiB0aGUgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIGEgcG9pbnRlciB0byB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9zZXRfbmV0bmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkgICAgICBjaGFyICpleHRyYSkKK3sKKyAgICAgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3dmxhbl9zZXRfbmV0bmFtZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgICAgICB3bF9sb2NrKGxwLCAmZmxhZ3MpOworCisgICAgICAgIG1lbXNldCggbHAtPk5ldHdvcmtOYW1lLCAwLCBzaXplb2YoIGxwLT5OZXR3b3JrTmFtZSApKTsKKyAgICAgICAgbWVtY3B5KCBscC0+TmV0d29ya05hbWUsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisKKwkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCXdsX2FwcGx5KGxwKTsKKyAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd3ZsYW5fc2V0X25ldG5hbWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9nZXRfbmV0bmFtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldCB0aGUgRVNTSUQgb2YgdGhlIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fZ2V0X25ldG5hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgaW50ICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaW50ICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgIHd2TmFtZV90ICAgKnBOYW1lOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgICAgIERCR19GVU5DKCAid3ZsYW5fZ2V0X25ldG5hbWUiICk7CisgICAgICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgICAgIHdsX2xvY2sobHAsICZmbGFncyk7CisKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IG5ldHdvcmsgbmFtZSAqLworICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZiggKnBOYW1lICkgLyBzaXplb2YoIGhjZl8xNiApKTsKKyAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX1NTSUQ7CisKKyAgICAgICAgc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyAgICAgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICBwTmFtZSA9ICh3dk5hbWVfdCAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCQltZW1zZXQoZXh0cmEsICdcMCcsIEhDRl9NQVhfTkFNRV9MRU4pOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBOYW1lLT5sZW5ndGg7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoZXh0cmEsIHBOYW1lLT5uYW1lLCBwTmFtZS0+bGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUZBVUxUOworCX0KKworICAgICAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiByZXQ7Cit9IC8vIHd2bGFuX2dldF9uZXRuYW1lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBTZXQgdGhlIGNhcmQncyBzdGF0aW9uIG5pY2tuYW1lLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gYSBwb2ludGVyIHRvIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCSAgICAgIGNoYXIgKmV4dHJhKQoreworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGludCAgICAgICAgIHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAgICAgREJHX0ZVTkMoICJ3dmxhbl9zZXRfc3RhdGlvbl9uaWNrbmFtZSIgKTsKKyAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAgICAgd2xfbG9jayhscCwgJmZsYWdzKTsKKworICAgICAgICBtZW1zZXQoIGxwLT5TdGF0aW9uTmFtZSwgMCwgc2l6ZW9mKCBscC0+U3RhdGlvbk5hbWUgKSk7CisKKyAgICAgICAgbWVtY3B5KCBscC0+U3RhdGlvbk5hbWUsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisKKyAgICAgICAgLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgd2xfYXBwbHkoIGxwICk7CisgICAgICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKKworICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30gLy8gd3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldCB0aGUgY2FyZCdzIHN0YXRpb24gbmlja25hbWUuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJICAgICAgY2hhciAqZXh0cmEpCit7CisgICAgICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgICAgICByZXQgPSAwOworCWludCAgICAgICAgIHN0YXR1cyA9IC0xOworCXd2TmFtZV90ICAgKnBOYW1lOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgICAgIERCR19GVU5DKCAid3ZsYW5fZ2V0X3N0YXRpb25fbmlja25hbWUiICk7CisgICAgICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlvbiBuYW1lICovCisgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcE5hbWUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX05BTUU7CisKKyAgICAgICAgc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisKKyAgICAgICAgaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICBwTmFtZSA9ICh3dk5hbWVfdCAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworCQltZW1zZXQoZXh0cmEsICdcMCcsIEhDRl9NQVhfTkFNRV9MRU4pOworCQl3cnF1LT5kYXRhLmxlbmd0aCA9IHBOYW1lLT5sZW5ndGg7CisJCW1lbWNweShleHRyYSwgcE5hbWUtPm5hbWUsIHBOYW1lLT5sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7CisgICAgICAgIH0KKworICAgICAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisKKy8vb3V0OgorICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3dmxhbl9nZXRfc3RhdGlvbl9uaWNrbmFtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3NldF9wb3J0dHlwZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFNldCB0aGUgY2FyZCdzIHBvcnR0eXBlCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fc2V0X3BvcnR0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCSAgICAgIGNoYXIgKmV4dHJhKQoreworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGludCAgICAgcmV0ID0gMDsKKwloY2ZfMTYgIHBvcnRUeXBlOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgICAgIERCR19GVU5DKCAid3ZsYW5fc2V0X3BvcnR0eXBlIiApOworICAgICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworICAgICAgICB3bF9sb2NrKGxwLCAmZmxhZ3MpOworCisgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgKi8KKyAgICAgICAgcG9ydFR5cGUgPSAqKChfX3UzMiAqKWV4dHJhKTsKKworICAgICAgICBpZiggISgoIHBvcnRUeXBlID09IDEgKSB8fCAoIHBvcnRUeXBlID09IDMgKSkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisgICAgICAgIH0KKworICAgICAgICBscC0+UG9ydFR5cGUgPSBwb3J0VHlwZTsKKworICAgICAgICAvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworICAgICAgICB3bF9hcHBseSggbHAgKTsKKworb3V0X3VubG9jazoKKyAgICAgICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisvL291dDoKKyAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX2dldF9wb3J0dHlwZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldCB0aGUgY2FyZCdzIHBvcnR0eXBlCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSBhIHBvaW50ZXIgdG8gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd3ZsYW5fZ2V0X3BvcnR0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCSAgICAgIGNoYXIgKmV4dHJhKQoreworICAgICAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGludCAgICAgcmV0ID0gMDsKKyAgICAgICAgaW50ICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgaGNmXzE2ICAqcFBvcnRUeXBlOworICAgICAgICBfX3UzMiAqcERhdGEgPSAoX191MzIgKilleHRyYTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgICAgICBEQkdfRlVOQyggInd2bGFuX2dldF9wb3J0dHlwZSIgKTsKKyAgICAgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKyAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBwb3J0IHR5cGUgKi8KKyAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwUG9ydFR5cGUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfUE9SVF9UWVBFOworCisgICAgICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisgICAgICAgICAgICAgICAgcFBvcnRUeXBlID0gKGhjZl8xNiAqKSYoIGxwLT5sdHZSZWNvcmQudS51MzIgKTsKKworICAgICAgICAgICAgICAgICpwRGF0YSA9IENOVl9MSVRUTEVfVE9fSU5UKCAqcFBvcnRUeXBlICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSAtRUZBVUxUOworCX0KKworICAgICAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CisKKy8vb3V0OgorICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICAgICAgcmV0dXJuIHJldDsKK30gLy8gd3ZsYW5fZ2V0X3BvcnR0eXBlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZW5kaWYgIC8vIFdJUkVMRVNTX0VYVAorCisKKworCisjaWZkZWYgVVNFX1JUUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXd2bGFuX3J0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIElPQ1RMIGhhbmRsZXIgZm9yIFJUUyBjb21tYW5kcworICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcnJxIC0gYSBwb2ludGVyIHRvIHRoZSBydHMgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB3dmxhbl9ydHMoIHN0cnVjdCBydHNyZXEgKnJycSwgX191MzIgaW9fYmFzZSApCit7CisJaW50IGlvY3RsX3JldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggInd2bGFuX3J0cyIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisJREJHX1BSSU5UKCAiaW9fYmFzZTogMHglMDh4XG4iLCBpb19iYXNlICk7CisKKwlzd2l0Y2goIHJycS0+dHlwICkgeworCSAgY2FzZSBXTF9JT0NUTF9SVFNfUkVBRDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1JUUyAtLSBXTF9JT0NUTF9SVFNfUkVBRFxuIik7CisJCXJycS0+ZGF0YVswXSA9IElOX1BPUlRfV09SRCggaW9fYmFzZSArIHJycS0+cmVnICk7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiAgcmVnIDB4JTA0eCA9PT4gMHglMDR4XG4iLCBycnEtPnJlZywgQ05WX0xJVFRMRV9UT19TSE9SVCggcnJxLT5kYXRhWzBdICkgKTsKKwkJYnJlYWs7CisJICBjYXNlIFdMX0lPQ1RMX1JUU19XUklURToKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1JUUyAtLSBXTF9JT0NUTF9SVFNfV1JJVEVcbiIpOworCQlPVVRfUE9SVF9XT1JEKCBpb19iYXNlICsgcnJxLT5yZWcsIHJycS0+ZGF0YVswXSApOworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIgIHJlZyAweCUwNHggPD09IDB4JTA0eFxuIiwgcnJxLT5yZWcsIENOVl9MSVRUTEVfVE9fU0hPUlQoIHJycS0+ZGF0YVswXSApICk7CisJCWJyZWFrOworCSAgY2FzZSBXTF9JT0NUTF9SVFNfQkFUQ0hfUkVBRDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTDogV1ZMQU4yX0lPQ1RMX1JUUyAtLSBXTF9JT0NUTF9SVFNfQkFUQ0hfUkVBRFxuIik7CisJCUlOX1BPUlRfU1RSSU5HXzE2KCBpb19iYXNlICsgcnJxLT5yZWcsIHJycS0+ZGF0YSwgcnJxLT5sZW4gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiICByZWcgMHglMDR4ID09PiAlZCBieXRlc1xuIiwgcnJxLT5yZWcsIHJycS0+bGVuICogc2l6ZW9mIChfX3UxNiApICk7CisJCWJyZWFrOworCSAgY2FzZSBXTF9JT0NUTF9SVFNfQkFUQ0hfV1JJVEU6CisJCURCR19UUkFDRShEYmdJbmZvLCAiSU9DVEw6IFdWTEFOMl9JT0NUTF9SVFMgLS0gV0xfSU9DVExfUlRTX0JBVENIX1dSSVRFXG4iKTsKKwkJT1VUX1BPUlRfU1RSSU5HXzE2KCBpb19iYXNlICsgcnJxLT5yZWcsIHJycS0+ZGF0YSwgcnJxLT5sZW4gKTsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiICByZWcgMHglMDR4IDw9PSAlZCBieXRlc1xuIiwgcnJxLT5yZWcsIHJycS0+bGVuICogc2l6ZW9mIChfX3UxNikgKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKworCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfUlRTIC0tIFVOU1VQUE9SVEVEIFJUUyBDT0RFOiAweCVYIiwgcnJxLT50eXAgKTsKKwkJaW9jdGxfcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiBpb2N0bF9yZXQ7Cit9IC8vIHd2bGFuX3J0cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmICAvKiBVU0VfUlRTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcml2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwMjU0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ByaXYuaApAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgcHJpdmF0ZSBJT0NUTCBoYW5kbGVycy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fV0xfUFJJVl9IX18KKyNkZWZpbmUgX19XTF9QUklWX0hfXworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgV0lSRUxFU1NfRVhUCisKKworaW50IHd2bGFuX3NldF9uZXRuYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLCB1bmlvbiBpd3JlcV9kYXRhICosIGNoYXIgKmV4dHJhICk7CisKK2ludCB3dmxhbl9nZXRfbmV0bmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwgdW5pb24gaXdyZXFfZGF0YSAqLCBjaGFyICpleHRyYSApOworCitpbnQgd3ZsYW5fc2V0X3N0YXRpb25fbmlja25hbWUoIHN0cnVjdCBuZXRfZGV2aWNlICosICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICosIHVuaW9uIGl3cmVxX2RhdGEgKiwgY2hhciAqZXh0cmEgKTsKKworaW50IHd2bGFuX2dldF9zdGF0aW9uX25pY2tuYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqLCB1bmlvbiBpd3JlcV9kYXRhICosIGNoYXIgKmV4dHJhICk7CisKK2ludCB3dmxhbl9zZXRfcG9ydHR5cGUoIHN0cnVjdCBuZXRfZGV2aWNlICosICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICosIHVuaW9uIGl3cmVxX2RhdGEgKiwgY2hhciAqZXh0cmEgKTsKKworaW50IHd2bGFuX2dldF9wb3J0dHlwZSggc3RydWN0IG5ldF9kZXZpY2UgKiwgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwgdW5pb24gaXdyZXFfZGF0YSAqLCBjaGFyICpleHRyYSApOworCisKKyNlbmRpZiAgLy8gV0lSRUxFU1NfRVhUCisKKworCisKKyNpZmRlZiBVU0VfVUlMCisKK2ludCB3dmxhbl91aWwoIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisKKy8vIGludCB3dmxhbl91aWxfY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfZGlzY29ubmVjdCggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfYWN0aW9uKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworLy8gaW50IHd2bGFuX3VpbF9ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfdW5ibG9jayggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfc2VuZF9kaWFnX21zZyggc3RydWN0IHVpbHJlcSAqdXJxLCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKKy8vIGludCB3dmxhbl91aWxfcHV0X2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvLyBpbnQgd3ZsYW5fdWlsX2dldF9pbmZvKCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisvL2ludCBjZmdfZHJpdmVyX2luZm8oIHN0cnVjdCB1aWxyZXEgKnVycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CisvL2ludCBjZmdfZHJpdmVyX2lkZW50aXR5KCBzdHJ1Y3QgdWlscmVxICp1cnEsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCisjZW5kaWYgIC8vIFVTRV9VSUwKKworCisjaWZkZWYgVVNFX1JUUworCitpbnQgd3ZsYW5fcnRzKCBzdHJ1Y3QgcnRzcmVxICpycnEsIF9fdTMyIGlvX2Jhc2UgKTsKK2ludCB3dmxhbl9ydHNfcmVhZCggX191MTYgcmVnLCBfX3UxNiAqdmFsLCBfX3UzMiBpb19iYXNlICk7CitpbnQgd3ZsYW5fcnRzX3dyaXRlKCBfX3UxNiByZWcsIF9fdTE2IHZhbCwgX191MzIgaW9fYmFzZSApOworaW50IHd2bGFuX3J0c19iYXRjaF9yZWFkKCBzdHJ1Y3QgcnRzcmVxICpycnEsIF9fdTMyIGlvX2Jhc2UgKTsKK2ludCB3dmxhbl9ydHNfYmF0Y2hfd3JpdGUoIHN0cnVjdCBydHNyZXEgKnJycSwgX191MzIgaW9fYmFzZSApOworCisjZW5kaWYgIC8vIFVTRV9SVFMKKworCisjZW5kaWYgIC8vIF9fV0xfUFJJVl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3Byb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVmMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5jCkBAIC0wLDAgKzEsMTExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIHJvdXRpbmVzIHJlcXVpcmVkIHRvIHBhcnNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogICBsaXN0ZWQgaW4gYSBjb25maWcgZmlsZSwgaWYgdGhhdCBjb25maWcgZmlsZSBleGlzdHMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogT25seSBpbmNsdWRlIHRoaXMgZmlsZSBpZiBVU0VfUFJPRklMRSBpcyBkZWZpbmVkICovCisjaWZkZWYgVVNFX1BST0ZJTEUKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBBbGxvdyBzdXBwb3J0IGZvciBjYWxsaW5nIHN5c3RlbSBmY25zIHRvIHBhcnNlIGNvbmZpZyBmaWxlICovCisjZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIEJJTl9ETCAxCisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhjZi5oPgorLy8jaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX2VuYy5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF9wcm9maWxlLmg+CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCB2YXJpYWJsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluaXRpb24gbmVlZGVkIHRvIHByZXZlbnQgdW5yZXNvbHZlZCBleHRlcm5hbCBpbiB1bmlzdGQuaCAqLworc3RhdGljIGludCBlcnJubzsKKworI2lmIERCRworZXh0ZXJuIHBfdTMyICAgIERlYnVnRmxhZzsKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmCisKK2ludCBwYXJzZV95ZXNfbm8oIGNoYXIqIHZhbHVlICk7CisKKworaW50IHBhcnNlX3llc19ubyggY2hhciogdmFsdWUgKSB7CitpbnQgcmMgPSAwOwkJCQkJCQkJCQkvL2RlZmF1bHQgdG8gTk8gZm9yIGludmFsaWQgcGFyYW1ldGVycworCisJaWYgKCBzdHJsZW4oIHZhbHVlICkgPT0gMSApIHsKKwkJaWYgKCAoIHZhbHVlWzBdIHwgKCdZJ14neScpICkgPT0gJ3knICkgcmMgPSAxOworLy8JfSBlbHNlIHsKKy8vCQl0aGlzIHNob3VsZCBub3QgYmUgZGVidWcgdGltZSBpbmZvLCBpdCBpcyBhbiBlbmR1c2VyIGRhdGEgZW50cnkgZXJyb3IgOz8KKy8vCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01JQ1JPV0FWRV9ST0JVU1RORVNTICk7CisJfQorCXJldHVybiByYzsKK30gLy8gcGFyc2VfeWVzX25vCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXBhcnNlX2NvbmZpZygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIGRldmljZSdzIGNvbmZpZyBmaWxlIGFuZCBwYXJzZXMgdGhlIG9wdGlvbnMgZnJvbQorICogICBpdCwgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgY29uZmlndXJlIGl0c2VsZi4gSWYgbm8gY29uZmlndXJhdGlvbiBmaWxlCisgKiAgIG9yIGNvbmZpZ3VyYXRpb24gaXMgcHJlc2VudCwgdGhlbiBjb250aW51ZSB0byB1c2UgdGhlIG9wdGlvbnMgYWxyZWFkeQorICogICBwYXJzZWQgZnJvbSBjb25maWcub3B0cyBvciB3aXJlbGVzcy5vcHRzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGFyc2VfY29uZmlnKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlpbnQJCQkJICAgIGZpbGVfZGVzYzsKKyNpZiAwIC8vIEJJTl9ETAorCWludCAJIAkJCXJjOworCWNoYXIJCQkJKmNwID0gTlVMTDsKKyNlbmRpZiAvLyBCSU5fREwKKwljaGFyICAgICAgICAgICAgICAgIGJ1ZmZlcltNQVhfTElORV9TSVpFXTsKKwljaGFyICAgICAgICAgICAgICAgIGZpbGVuYW1lW01BWF9MSU5FX1NJWkVdOworCW1tX3NlZ21lbnRfdAkgICAgZnM7CisJc3RydWN0IHdsX3ByaXZhdGUgICAqd3ZsYW5fY29uZmlnID0gTlVMTDsKKwlFTkNTVFJDVCAgICAgICAgICAgIHNFbmNyeXB0aW9uOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAicGFyc2VfY29uZmlnIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJLyogR2V0IHRoZSB3YXZlbGFuIHNwZWNpZmljIGluZm8gZm9yIHRoaXMgZGV2aWNlICovCisJd3ZsYW5fY29uZmlnID0gKHN0cnVjdCB3bF9wcml2YXRlICopZGV2LT5wcml2OworCWlmICggd3ZsYW5fY29uZmlnID09IE5VTEwgKSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIldhdmVsYW4gc3BlY2lmaWMgaW5mbyBzdHJ1Y3Qgbm90IHByZXNlbnQ/XG4iICk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzZXR1cCB0aGUgZGVmYXVsdCBlbmNyeXB0aW9uIHN0cmluZyAqLworCXN0cmNweSggd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sIERFRl9DUllQVF9TVFIgKTsKKworCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCisJZnMgPSBnZXRfZnMoICk7CisJc2V0X2ZzKCBnZXRfZHMoICkpOworCisJLyogRGV0ZXJtaW5lIHRoZSBmaWxlbmFtZSBmb3IgdGhpcyBkZXZpY2UgYW5kIGF0dGVtcHQgdG8gb3BlbiBpdCAqLworCXNwcmludGYoIGZpbGVuYW1lLCAiJXMlcyIsIFJPT1RfQ09ORklHX0ZJTEVOQU1FLCBkZXYtPm5hbWUgKTsKKwlmaWxlX2Rlc2MgPSBvcGVuKCBmaWxlbmFtZSwgT19SRE9OTFksIDAgKTsKKwlpZiAoIGZpbGVfZGVzYyAhPSAtMSApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiV2lyZWxlc3MgY29uZmlnIGZpbGUgZm91bmQuIFBhcnNpbmcgb3B0aW9ucy4uLlxuIiApOworCisJCS8qIFJlYWQgb3V0IHRoZSBvcHRpb25zICovCisJCXdoaWxlKCByZWFkbGluZSggZmlsZV9kZXNjLCBidWZmZXIgKSkgeworCQkJdHJhbnNsYXRlX29wdGlvbiggYnVmZmVyLCB3dmxhbl9jb25maWcgKTsKKwkJfQorCQkvKiBDbG9zZSB0aGUgZmlsZSAqLworCQljbG9zZSggZmlsZV9kZXNjICk7CS8vOz9ldmVuIGlmIGZpbGVfZGVzYyA9PSAtMSA/Pz8KKwl9IGVsc2UgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJObyBpd2NvbmZpZyBmaWxlIGZvdW5kIGZvciB0aGlzIGRldmljZTsgIgorCQkJCSAgICJjb25maWcub3B0cyBvciB3aXJlbGVzcy5vcHRzIHdpbGwgYmUgdXNlZFxuIiApOworCX0KKwkvKiBSZXR1cm4gdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgKi8KKwlzZXRfZnMoIGZzICk7CisKKwkvKiBjb252ZXJ0IHRoZSBXRVAga2V5cywgaWYgcmVhZCBpbiBhcyBrZXkxLCBrZXkyLCB0eXBlIG9mIGRhdGEgKi8KKwlpZiAoIHd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbiApIHsKKwkJbWVtc2V0KCAmc0VuY3J5cHRpb24sIDAsIHNpemVvZiggc0VuY3J5cHRpb24gKSk7CisKKwkJd2xfd2VwX2RlY29kZSggQ1JZUFRfQ09ERSwgJnNFbmNyeXB0aW9uLAorCQkJCQkJICAgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24gKTsKKworCQkvKiB0aGUgTGludXggZHJpdmVyIGxpa2VzIHRvIHVzZSAxLTQgZm9yIHRoZSBrZXkgSURzLCBhbmQgdGhlbgorCQkgICBjb252ZXJ0IHRvIDAtMyB3aGVuIHNlbmRpbmcgdG8gdGhlIGNhcmQuICBUaGUgV2luZG93cyBjb2RlCisJCSAgIGJhc2UgdXNlZCAwLTMgaW4gdGhlIEFQSSBETEwsIHdoaWNoIHdhcyBwb3J0ZWQgdG8gTGludXguICBGb3IKKwkJICAgdGhlIHNha2Ugb2YgdGhlIHVzZXIgZXhwZXJpZW5jZSwgd2UgZGVjaWRlZCB0byBrZWVwIDAtMyBhcyB0aGUKKwkJICAgbnVtYmVycyB1c2VkIGluIHRoZSBETEw7IGFuZCB3aWxsIHBlcmZvcm0gdGhlICsxIGNvbnZlcnNpb24gaGVyZS4KKwkJICAgV2UgY291bGQgaGF2ZSBjb252ZXJ0ZWQgIHRoZSBlbnRpcmUgTGludXggZHJpdmVyLCBidXQgdGhpcyBpcworCQkgICBsZXNzIG9idHJ1c2l2ZS4gIFRoaXMgbWF5IGJlIGEgInRvZG8iIHRvIGNvbnZlcnQgdGhlIHdob2xlIGRyaXZlciAqLworCQlzRW5jcnlwdGlvbi53RW5hYmxlZCA9IHd2bGFuX2NvbmZpZy0+RW5hYmxlRW5jcnlwdGlvbjsKKwkJc0VuY3J5cHRpb24ud1R4S2V5SUQgPSB3dmxhbl9jb25maWctPlRyYW5zbWl0S2V5SUQgLSAxOworCisJCW1lbWNweSggJnNFbmNyeXB0aW9uLkVuY1N0ciwgJnd2bGFuX2NvbmZpZy0+RGVmYXVsdEtleXMsCisJCQkJc2l6ZW9mKCBDRkdfREVGQVVMVF9LRVlTX1NUUkNUICkpOworCisJCW1lbXNldCggd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24sIDAsIHNpemVvZiggd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24gKSk7CisKKwkJd2xfd2VwX2NvZGUoIENSWVBUX0NPREUsIHd2bGFuX2NvbmZpZy0+c3pFbmNyeXB0aW9uLCAmc0VuY3J5cHRpb24sCisJCQkJCQkgc2l6ZW9mKCBzRW5jcnlwdGlvbiApKTsKKwl9CisKKwkvKiBkZWNvZGUgdGhlIGVuY3J5cHRpb24gc3RyaW5nIGZvciB0aGUgY2FsbCB0byB3bF9jb21taXQoKSAqLworCXdsX3dlcF9kZWNvZGUoIENSWVBUX0NPREUsICZzRW5jcnlwdGlvbiwgd3ZsYW5fY29uZmlnLT5zekVuY3J5cHRpb24gKTsKKworCXd2bGFuX2NvbmZpZy0+VHJhbnNtaXRLZXlJRCAgICA9IHNFbmNyeXB0aW9uLndUeEtleUlEICsgMTsKKwl3dmxhbl9jb25maWctPkVuYWJsZUVuY3J5cHRpb24gPSBzRW5jcnlwdGlvbi53RW5hYmxlZDsKKworCW1lbWNweSggJnd2bGFuX2NvbmZpZy0+RGVmYXVsdEtleXMsICZzRW5jcnlwdGlvbi5FbmNTdHIsCisJCQlzaXplb2YoIENGR19ERUZBVUxUX0tFWVNfU1RSQ1QgKSk7CisKKyNpZiAwIC8vQklOX0RMCisJCS8qIE9idGFpbiBhIHVzZXItc3BhY2UgcHJvY2VzcyBjb250ZXh0LCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCisJCWZzID0gZ2V0X2ZzKCApOworCQlzZXRfZnMoIGdldF9kcyggKSk7CisKKwkJLy87P2p1c3QgdG8gZmFrZSBzb21ldGhpbmcKKwkJc3RyY3B5KC8qd3ZsYW5fY29uZmlnLT5md19pbWFnZV8qL2ZpbGVuYW1lLCAiL2V0Yy9hZ2VyZS9mdy5iaW4iICk7CisJCWZpbGVfZGVzYyA9IG9wZW4oIC8qd3ZsYW5fY29uZmlnLT5md19pbWFnZV8qL2ZpbGVuYW1lLCAwLCAwICk7CisJCWlmICggZmlsZV9kZXNjID09IC0xICkgeworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAiTm8gaW1hZ2UgZmlsZSBmb3VuZFxuIiApOworCQl9IGVsc2UgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRi9XIGltYWdlIGZpbGUgZm91bmRcbiIgKTsKKyNkZWZpbmUgREhGX0FMTE9DX1NJWkUgOTYwMDAJCQkvL2p1c3QgYmVsb3cgOTZLLCBsZXQncyBob3BlIGl0IHN1ZmZpY2VzIGZvciBub3cgYW5kIGZvciB0aGUgZnV0dXJlCisJCQljcCA9IChjaGFyKil2bWFsbG9jKCBESEZfQUxMT0NfU0laRSApOworCQkJaWYgKCBjcCA9PSBOVUxMICkgeworCQkJCURCR19FUlJPUiggRGJnSW5mbywgImVycm9yIGluIHZtYWxsb2NcbiIgKTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSByZWFkKCBmaWxlX2Rlc2MsIGNwLCBESEZfQUxMT0NfU0laRSApOworCQkJCWlmICggcmMgPT0gREhGX0FMTE9DX1NJWkUgKSB7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImJ1ZmZlciB0b28gc21hbGwsICVkXG4iLCBESEZfQUxMT0NfU0laRSApOworCQkJCX0gZWxzZSBpZiAoIHJjID4gMCApIHsKKwkJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAicmVhZCBPLksuOiAlZCBieXRlcyAgJS4xMnNcbiIsIHJjLCBjcCApOworCQkJCQlyYyA9IHJlYWQoIGZpbGVfZGVzYywgJmNwW3JjXSwgMSApOworCQkJCQlpZiAoIHJjID09IDAgKSB7CisJCQkJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJubyBtb3JlIHRvIHJlYWRcbiIgKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIHJjICE9IDAgKSB7CisJCQkJCURCR19FUlJPUiggRGJnSW5mbywgImZpbGUgbm90IHJlYWQgaW4gb25lIHN3b29wIG9yIG90aGVyIGVycm9yIlwKKwkJCQkJCQkJCQkiLCBnaXZlIHVwLCB0b28gY29tcGxpY2F0ZWQsIHJjID0gJTBYXG4iLCByYyApOworCQkJCX0KKwkJCQl2ZnJlZSggY3AgKTsKKwkJCX0KKwkJCWNsb3NlKCBmaWxlX2Rlc2MgKTsKKwkJfQorCQlzZXRfZnMoIGZzICk7CQkJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0ICovCisjZW5kaWYgLy8gQklOX0RMCisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm47Cit9IC8vIHBhcnNlX2NvbmZpZworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJcmVhZGxpbmUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGluIGRhdGEgZnJvbSBhIGdpdmVuIGZpbGUgb25lIGxpbmUgYXQgYSB0aW1lLAorICogICBjb252ZXJ0aW5nIHRoZSBkZXRlY3RlZCBuZXdsaW5lIGNoYXJhY3RlciAnXG4nIHRvIGEgbnVsbCAnXDAnLiBOb3RlIHRoYXQKKyAqICAgdGhlIGZpbGUgZGVzY3JpcHRvciBtdXN0IGJlIHZhbGlkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBmaWxlZGVzYyAgICAtIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZQorICogICAgICBidWZmZXIgICAgICAtIGEgYnVmZmVyIHBvaW50ZXIsIHBhc3NlZCBpbiBieSB0aGUgY2FsbGVyLCB0byB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBsaW5lIHdpbGwgYmUgc3RvcmVkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCisgKiAgICAgIC0xIG9uIGVycm9yCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCByZWFkbGluZSggaW50IGZpbGVkZXNjLCBjaGFyICpidWZmZXIgKQoreworCWludCByZXN1bHQgPSAtMTsKKwlpbnQgYnl0ZXNfcmVhZCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJLyogTWFrZSBzdXJlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgZ29vZCAqLworCWlmICggZmlsZWRlc2MgIT0gLTEgKSB7CisJCS8qIFJlYWQgaW4gZnJvbSB0aGUgZmlsZSBieXRlIGJ5IGJ5dGUgdW50aWwgYSBuZXdsaW5lIGlzIHJlYWNoZWQgKi8KKwkJd2hpbGUoKCByZXN1bHQgPSByZWFkKCBmaWxlZGVzYywgJmJ1ZmZlcltieXRlc19yZWFkXSwgMSApKSA9PSAxICkgeworCQkJaWYgKCBidWZmZXJbYnl0ZXNfcmVhZF0gPT0gJ1xuJyApIHsKKwkJCQlidWZmZXJbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQkJCWJ5dGVzX3JlYWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJ5dGVzX3JlYWQrKzsKKwkJfQorCX0KKworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KKwlpZiAoIHJlc3VsdCA9PSAtMSApIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9IGVsc2UgeworCQlyZXR1cm4gYnl0ZXNfcmVhZDsKKwl9Cit9IC8vIHJlYWRsaW5lCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJdHJhbnNsYXRlX29wdGlvbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBsaW5lIHJlYWQgaW4gZnJvbSB0aGUgY29uZmlnIGZpbGUgYW5kIHBhcnNlcyBvdXQKKyAqICAgdGhlIGtleS92YWx1ZSBwYWlycy4gSXQgdGhlbiBkZXRlcm1pbmVzIHdoaWNoIGtleSBoYXMgYmVlbiBwYXJzZWQgYW5kIHNldHMKKyAqICAgdGhlIGNhcmQncyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSBnaXZlbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGJ1ZmZlciAtIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSBsaW5lIHRvIHRyYW5zbGF0ZQorICogICAgICBjb25maWcgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyYW5zbGF0ZV9vcHRpb24oIGNoYXIgKmJ1ZmZlciwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWVfY29udmVydCA9IDA7CisJaW50IHN0cmluZ19sZW5ndGggPSAwOworCWNoYXIgKmtleSA9IE5VTEw7CisJY2hhciAqdmFsdWUgPSBOVUxMOworCXVfY2hhciBtYWNfdmFsdWVbRVRIX0FMRU5dOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAidHJhbnNsYXRlX29wdGlvbiIgKTsKKworCWlmICggYnVmZmVyID09IE5VTEwgfHwgbHAgPT0gTlVMTCApIHsKKwkJREJHX0VSUk9SKCBEYmdJbmZvLCAiQ29uZmlnIGZpbGUgYnVmZmVyIGFuZC9vciB3YXZlbGFuIGJ1ZmZlciBwdHIgTlVMTFxuIiApOworCQlyZXR1cm47CisJfQorCisJUGFyc2VDb25maWdMaW5lKCBidWZmZXIsICZrZXksICZ2YWx1ZSApOworCisJaWYgKCBrZXkgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMICkgeworCQlyZXR1cm47CisJfQorCisJLyogRGV0ZXJtaW5lIHdoaWNoIGtleSBpdCBpcyBhbmQgcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uICovCisKKwkvKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdXNlZCBpbiBhbGwgc2NlbmFyaW9zICovCisjaWYgREJHCisJLyogaGFuZGxlIERlYnVnRmxhZyBhcyBlYXJseSBhcyBwb3NzaWJsZSBzbyBpdCBzdGFydHMgaXRzIGluZmx1ZW5jZSBhcyBlYXJseQorCSAqIGFzIHBvc3NpYmxlCisJICovCisJaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0RFQlVHX0ZMQUcgKSA9PSAwICkgeworCQlpZiAoIERlYnVnRmxhZyA9PSB+MCApIHsJCQkvL2lmIERlYnVnRmxhZyBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUKKwkJCWlmICggRGJnSW5mby0+RGVidWdGbGFnID09IDAgKSB7CS8qIGlmIHBjX2RlYnVnIGRpZCBub3Qgc2V0IERlYnVnRmxhZyAoaS5lLnBjX2RlYnVnIGlzCisJCQkJCQkJCQkJCSAqIG5vdCBzcGVjaWZpZWQgb3Igc3BlY2lmaWVkIG91dHNpZGUgdGhlIDQtOCByYW5nZQorCQkJCQkJCQkJCQkgKi8KKwkJCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgfD0gREJHX0RFRkFVTFRTOworCQkJfQorCQl9IGVsc2UgeworCQkJRGJnSW5mby0+RGVidWdGbGFnID0gd2xfYXRvaSggdmFsdWUgKTsgLy87P0RlYnVnRmxhZzsKKwkJfQorCQlEYmdJbmZvLT5EZWJ1Z0ZsYWcgPSB3bF9hdG9pKCB2YWx1ZSApOyAvLzs/RGVsZXRlIEFTQVAKKwl9CisjZW5kaWYgLyogREJHICovCisJaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0FVVEhfS0VZX01HTVRfU1VJVEUgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQVVUSF9LRVlfTUdNVF9TVUlURSwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9BVVRIX0tFWV9NR01UX1NVSVRFICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0FVVEhfS0VZX01HTVRfU1VJVEUgKSkgeworCQkJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9BVVRIX0tFWV9NR01UX1NVSVRFICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQlJTQ18yR0haICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0JSU0NfMkdIWiwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9CUlNDICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0JSU0MgKSkgeworCQkJbHAtPmJyc2NbMF0gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0JSU0NfMkdIWiApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0JSU0NfNUdIWiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9CUlNDXzVHSFosIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fQlJTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9CUlNDICkpIHsKKwkJCWxwLT5icnNjWzFdID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9CUlNDXzVHSFogKTsKKwkJfQorCX0KKwllbHNlIGlmICgoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfREVTSVJFRF9TU0lEICkgPT0gMCApIHx8ICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fU1NJRCApID09IDAgKSkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTU0lELCB2YWx1ZTogJXNcbiIsIHZhbHVlICk7CisKKwkJbWVtc2V0KCBscC0+TmV0d29ya05hbWUsIDAsICggUEFSTV9NQVhfTkFNRV9MRU4gKyAxICkpOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KKwkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKKwkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gUEFSTV9NQVhfTkFNRV9MRU4gKSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIlNTSUQgdG9vIGxvbmc7IHdpbGwgYmUgdHJ1bmNhdGVkXG4iICk7CisJCQlzdHJpbmdfbGVuZ3RoID0gUEFSTV9NQVhfTkFNRV9MRU47CisJCX0KKworCQltZW1jcHkoIGxwLT5OZXR3b3JrTmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGggKTsKKwl9CisjaWYgMAorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0RPV05MT0FEX0ZJUk1XQVJFICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiRE9XTkxPQURfRklSTVdBUkUsIHZhbHVlOiAlc1xuIiwgdmFsdWUgKTsKKwkJbWVtc2V0KCBscC0+ZndfaW1hZ2VfZmlsZW5hbWUsIDAsICggTUFYX0xJTkVfU0laRSArIDEgKSk7CisJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaXNuJ3QgdG9vIGxvbmcgKi8KKwkJc3RyaW5nX2xlbmd0aCA9IHN0cmxlbiggdmFsdWUgKTsKKwkJaWYgKCBzdHJpbmdfbGVuZ3RoID4gTUFYX0xJTkVfU0laRSApIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiRi9XIGltYWdlIGZpbGUgbmFtZSB0b28gbG9uZzsgd2lsbCBiZSBpZ25vcmVkXG4iICk7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoIGxwLT5md19pbWFnZV9maWxlbmFtZSwgdmFsdWUsIHN0cmluZ19sZW5ndGggKTsKKwkJfQorCX0KKyNlbmRpZgorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VOQUJMRV9FTkNSWVBUSU9OLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0VOQUJMRV9FTkNSWVBUSU9OICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0VOQUJMRV9FTkNSWVBUSU9OICkpIHsKKwkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfRU5BQkxFX0VOQ1JZUFRJT04gKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9FTkNSWVBUSU9OICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0VOQ1JZUFRJT04sIHZhbHVlICk7CisKKwkJbWVtc2V0KCBscC0+c3pFbmNyeXB0aW9uLCAwLCBzaXplb2YoIGxwLT5zekVuY3J5cHRpb24gKSk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLworCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworCQlpZiAoIHN0cmluZ19sZW5ndGggPiBzaXplb2YoIGxwLT5zekVuY3J5cHRpb24gKSApIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgdG9vIGxvbmc7IHdpbGwgYmUgdHJ1bmNhdGVkXG4iLCBQQVJNX05BTUVfRU5DUllQVElPTiApOworCQkJc3RyaW5nX2xlbmd0aCA9IHNpemVvZiggbHAtPnN6RW5jcnlwdGlvbiApOworCQl9CisKKwkJbWVtY3B5KCBscC0+c3pFbmNyeXB0aW9uLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCApOworCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVkxICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTEsIHZhbHVlICk7CisKKwkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CisJCQltZW1zZXQoIGxwLT5EZWZhdWx0S2V5cy5rZXlbMF0ua2V5LCAwLCBNQVhfS0VZX1NJWkUgKTsKKworCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVswXSApOworCQl9IGVsc2UgeworCQkJIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfS0VZMSApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0tFWTIgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfS0VZMiwgdmFsdWUgKTsKKworCQlpZiAoIGlzX3ZhbGlkX2tleV9zdHJpbmcoIHZhbHVlICkpIHsKKwkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVsxXS5rZXksIDAsIE1BWF9LRVlfU0laRSApOworCisJCQlrZXlfc3RyaW5nMmtleSggdmFsdWUsICZscC0+RGVmYXVsdEtleXMua2V5WzFdICk7CisJCX0gZWxzZSB7CisJCQkgREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9LRVkyICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfS0VZMyApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9LRVkzLCB2YWx1ZSApOworCisJCWlmICggaXNfdmFsaWRfa2V5X3N0cmluZyggdmFsdWUgKSkgeworCQkJbWVtc2V0KCBscC0+RGVmYXVsdEtleXMua2V5WzJdLmtleSwgMCwgTUFYX0tFWV9TSVpFICk7CisKKwkJCWtleV9zdHJpbmcya2V5KCB2YWx1ZSwgJmxwLT5EZWZhdWx0S2V5cy5rZXlbMl0gKTsKKwkJfSBlbHNlIHsKKwkJCSBEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0tFWTMgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9LRVk0ICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0tFWTQsIHZhbHVlICk7CisKKwkJaWYgKCBpc192YWxpZF9rZXlfc3RyaW5nKCB2YWx1ZSApKSB7CisJCQltZW1zZXQoIGxwLT5EZWZhdWx0S2V5cy5rZXlbM10ua2V5LCAwLCBNQVhfS0VZX1NJWkUgKTsKKworCQkJa2V5X3N0cmluZzJrZXkoIHZhbHVlLCAmbHAtPkRlZmF1bHRLZXlzLmtleVszXSApOworCQl9IGVsc2UgeworCQkJIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfS0VZNCApOworCQl9CisJfQorCS8qIE5ldyBQYXJhbWV0ZXJzIGZvciBXQVJQICovCisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTE9BRF9CQUxBTkNJTkcsIHZhbHVlICk7CisJCWxwLT5sb2FkQmFsYW5jaW5nID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTUVESVVNX0RJU1RSSUJVVElPTiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NRURJVU1fRElTVFJJQlVUSU9OLCB2YWx1ZSApOworCQlscC0+bWVkaXVtRGlzdHJpYnV0aW9uID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTUlDUk9XQVZFX1JPQlVTVE5FU1MpID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NSUNST1dBVkVfUk9CVVNUTkVTUywgdmFsdWUgKTsKKwkJbHAtPk1pY3Jvd2F2ZVJvYnVzdG5lc3MgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9NVUxUSUNBU1RfUkFURSwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX01VTFRJQ0FTVF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX01VTFRJQ0FTVF9SQVRFICkpIHsKKwkJCWxwLT5NdWx0aWNhc3RSYXRlWzBdID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1JBVEUgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQ0hBTk5FTCwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCB3bF9pc19hX3ZhbGlkX2NoYW4oIHZhbHVlX2NvbnZlcnQgKSkgeworCQkJaWYgKCB2YWx1ZV9jb252ZXJ0ID4gMTQgKSB7CisJCQkJdmFsdWVfY29udmVydCA9IHZhbHVlX2NvbnZlcnQgfCAweDEwMDsKKwkJCX0KKwkJCWxwLT5DaGFubmVsID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0NIQU5ORUwgKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9PV05fTkFNRSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fTkFNRSwgdmFsdWUgKTsKKworCQltZW1zZXQoIGxwLT5TdGF0aW9uTmFtZSwgMCwgKCBQQVJNX01BWF9OQU1FX0xFTiArIDEgKSk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBpc24ndCB0b28gbG9uZyAqLworCQlzdHJpbmdfbGVuZ3RoID0gc3RybGVuKCB2YWx1ZSApOworCQlpZiAoIHN0cmluZ19sZW5ndGggPiBQQVJNX01BWF9OQU1FX0xFTiApIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgdG9vIGxvbmc7IHdpbGwgYmUgdHJ1bmNhdGVkXG4iLCBQQVJNX05BTUVfT1dOX05BTUUgKTsKKwkJCXN0cmluZ19sZW5ndGggPSBQQVJNX01BWF9OQU1FX0xFTjsKKwkJfQorCisJCW1lbWNweSggbHAtPlN0YXRpb25OYW1lLCB2YWx1ZSwgc3RyaW5nX2xlbmd0aCApOworCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQsIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCWxwLT5SVFNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfU1JTQ18yR0haICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1NSU0NfMkdIWiwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9TUlNDICkgfHwgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1NSU0MgKSkgeworCQkJbHAtPnNyc2NbMF0gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NSU0NfMkdIWiApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1NSU0NfNUdIWiApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9TUlNDXzVHSFosIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fU1JTQyApIHx8ICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TUlNDICkpIHsKKwkJCWxwLT5zcnNjWzFdID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9TUlNDXzVHSFogKTsKKwkJfQorCX0KKwllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9TWVNURU1fU0NBTEUgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfU1lTVEVNX1NDQUxFLCB2YWx1ZSApOworCisJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1NZU1RFTV9TQ0FMRSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9TWVNURU1fU0NBTEUgKSkgeworCQkJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyA9IHZhbHVlX2NvbnZlcnQ7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1NZU1RFTV9TQ0FMRSApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX0tFWSApID09IDAgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9LRVksIHZhbHVlICk7CisKKwkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfS0VZICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX0tFWSApKSB7CisJCQlscC0+VHJhbnNtaXRLZXlJRCA9IHdsX2F0b2koIHZhbHVlICk7CisJCX0gZWxzZSB7CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX0tFWSApOworCQl9CisJfQorCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEUgKSA9PSAwICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURSwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSB2YWx1ZV9jb252ZXJ0OworCQl9IGVsc2UgeworCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFICk7CisJCX0KKwl9CisJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUE9XX0xFVkVMICkgPT0gMCApIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1BPV19MRVZFTCwgdmFsdWUgKTsKKworCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9QT1dfTEVWRUwgKSB8fCAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUE9XX0xFVkVMICkpIHsKKwkJCWxwLT50eFBvd0xldmVsID0gdmFsdWVfY29udmVydDsKKwkJfSBlbHNlIHsKKwkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUE9XX0xFVkVMICk7CisJCX0KKwl9CisKKwkvKiBOZWVkIHRvIGFkZD8gOiBDb3VudHJ5IGNvZGUsIFNob3J0L0xvbmcgcmV0cnkgKi8KKworCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byBTVEEgbW9kZSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisvLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisJCQkJCS8vOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlCisJCWlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9QT1JUX1RZUEUgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BPUlRfVFlQRSwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID09IFBBUk1fTUlOX1BPUlRfVFlQRSApIHx8ICggdmFsdWVfY29udmVydCA9PSBQQVJNX01BWF9QT1JUX1RZUEUgKSkgeworCQkJCWxwLT5Qb3J0VHlwZSA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUE9SVF9UWVBFICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUE1fRU5BQkxFRCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUE1fRU5BQkxFRCwgdmFsdWUgKTsKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCS8qIDs/IGhvdyBhYm91dCB3bF9tYWluLmMgY29udGFpbmluZworCSAqIFZBTElEX1BBUkFNKCBQQVJNX1BNX0VOQUJMRUQgPD0gV1ZMQU5fUE1fU1RBVEVfU1RBTkRBUkQgfHwKKwkgKgkJCQkJICggUEFSTV9QTV9FTkFCTEVEICYgMHg3RkZGICkgPD0gV1ZMQU5fUE1fU1RBVEVfU1RBTkRBUkQgKTsKKwkgKi8KKwkJCWlmICggKCB2YWx1ZV9jb252ZXJ0ICYgMHg3RkZGICkgPD0gUEFSTV9NQVhfUE1fRU5BQkxFRCkgeworCQkJCWxwLT5QTUVuYWJsZWQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1BNX0VOQUJMRUQgKTsKKwkJCQkvLzs/dGhpcyBpcyBhIGRhdGEgZW50cnkgZXJyb3IsIGhlbmNlIG5vdCBhIERCR19XQVJOSU5HCisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfQ1JFQVRFX0lCU1MgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NSRUFURV9JQlNTLCB2YWx1ZSApOworCQkJbHAtPkNyZWF0ZUlCU1MgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01VTFRJQ0FTVF9SWCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1JYLCB2YWx1ZSApOworCQkJbHAtPk11bHRpY2FzdFJlY2VpdmUgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX01BWF9TTEVFUCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTUFYX1NMRUVQLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gMCApICYmICggdmFsdWVfY29udmVydCA8PSA2NTUzNSApKSB7CisJCQkJbHAtPk1heFNsZWVwRHVyYXRpb24gPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX01BWF9TTEVFUCApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX05FVFdPUktfQUREUiApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTkVUV09SS19BRERSLCB2YWx1ZSApOworCisJCQlpZiAoIHBhcnNlX21hY19hZGRyZXNzKCB2YWx1ZSwgbWFjX3ZhbHVlICkgPT0gRVRIX0FMRU4gKSB7CisJCQkJbWVtY3B5KCBscC0+TUFDQWRkcmVzcywgbWFjX3ZhbHVlLCBFVEhfQUxFTiApOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX05FVFdPUktfQUREUiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9BVVRIRU5USUNBVElPTiwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0FVVEhFTlRJQ0FUSU9OICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX0FVVEhFTlRJQ0FUSU9OICkpIHsKKwkJCQlscC0+YXV0aGVudGljYXRpb24gPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX0FVVEhFTlRJQ0FUSU9OICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9PV05fQVRJTV9XSU5ET1csIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fQVRJTV9XSU5ET1cgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfT1dOX0FUSU1fV0lORE9XICkpIHsKKwkJCQlscC0+YXRpbVdpbmRvdyA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfT1dOX0FUSU1fV0lORE9XICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUE1fSE9MRE9WRVJfRFVSQVRJT04gKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BNX0hPTERPVkVSX0RVUkFUSU9OLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUE1fSE9MRE9WRVJfRFVSQVRJT04gKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUE1fSE9MRE9WRVJfRFVSQVRJT04gKSkgeworCQkJCWxwLT5ob2xkb3ZlckR1cmF0aW9uID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9QTV9IT0xET1ZFUl9EVVJBVElPTiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1BST01JU0NVT1VTX01PREUsIHZhbHVlICk7CisJCQlscC0+cHJvbWlzY3VvdXNNb2RlID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9DT05ORUNUSU9OX0NPTlRST0wgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX0NPTk5FQ1RJT05fQ09OVFJPTCwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0NPTk5FQ1RJT05fQ09OVFJPTCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9DT05ORUNUSU9OX0NPTlRST0wgKSkgeworCQkJCWxwLT5jb25uZWN0aW9uQ29udHJvbCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQ09OTkVDVElPTl9DT05UUk9MICk7CisJCQl9CisJCX0KKworCQkvKiBOZWVkIHRvIGFkZD8gOiBQcm9iZSBEYXRhIFJhdGUgKi8KKwl9CisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgKi8KKworCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBzcGVjaWZpYyB0byBBUCBtb2RlICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0RUSU1fUEVSSU9ELCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9PV05fRFRJTV9QRVJJT0QgKSB7CisJCQkJbHAtPkRUSU1QZXJpb2QgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9EVElNX1BFUklPRCApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JFSkVDVF9BTlkgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JFSkVDVF9BTlksIHZhbHVlICk7CisJCQlscC0+UmVqZWN0QW55ID0gcGFyc2VfeWVzX25vKHZhbHVlKTsKKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVEICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9FWENMVURFX1VORU5DUllQVEVELCB2YWx1ZSApOworCQkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfTVVMVElDQVNUX1BNX0JVRkZFUklORyApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfTVVMVElDQVNUX1BNX0JVRkZFUklORywgdmFsdWUgKTsKKwkJCWxwLT5FeGNsdWRlVW5lbmNyeXB0ZWQgPSBwYXJzZV95ZXNfbm8odmFsdWUpOworCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX0lOVFJBX0JTU19SRUxBWSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfSU5UUkFfQlNTX1JFTEFZLCB2YWx1ZSApOworCQkJbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZCA9IHBhcnNlX3llc19ubyh2YWx1ZSk7CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfT1dOX0JFQUNPTl9JTlRFUlZBTCwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fT1dOX0JFQUNPTl9JTlRFUlZBTCApIHsKKwkJCQlscC0+b3duQmVhY29uSW50ZXJ2YWwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX09XTl9CRUFDT05fSU5URVJWQUwgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9DT0VYSVNURU5DRSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfQ09FWElTVEVOQ0UsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX0NPRVhJU1RFTkNFICkgeworCQkJCWxwLT5jb2V4aXN0ZW5jZSA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfQ09FWElTVEVOQ0UgKTsKKwkJCX0KKwkJfQorCisjaWZkZWYgVVNFX1dEUworCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDEsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJCWxwLT53ZHNfcG9ydFswXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQxICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDIgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQyLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbMV0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMiApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQzICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xEMywgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQkJbHAtPndkc19wb3J0WzJdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDMgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDQsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9SVFNfVEhSRVNIT0xEICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1JUU19USFJFU0hPTEQgKSkgeworCQkJCWxwLT53ZHNfcG9ydFszXS5ydHNUaHJlc2hvbGQgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ0ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDUgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ1LCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fUlRTX1RIUkVTSE9MRCApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9SVFNfVEhSRVNIT0xEICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbNF0ucnRzVGhyZXNob2xkID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1JUU19USFJFU0hPTEQ2ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9SVFNfVEhSRVNIT0xENiwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1JUU19USFJFU0hPTEQgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfUlRTX1RIUkVTSE9MRCApKSB7CisJCQkJbHAtPndkc19wb3J0WzVdLnJ0c1RocmVzaG9sZCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfUlRTX1RIUkVTSE9MRDYgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFMSApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTEsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJCWxwLT53ZHNfcG9ydFswXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMSApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEUyICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFMiwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQkJbHAtPndkc19wb3J0WzFdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEUyICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTMgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEUzLCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbMl0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTMgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9UWF9SQVRFNCApID09IDAgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICIlcywgdmFsdWU6ICVzXG4iLCBQQVJNX05BTUVfVFhfUkFURTQsIHZhbHVlICk7CisKKwkJCXZhbHVlX2NvbnZlcnQgPSB3bF9hdG9pKCB2YWx1ZSApOworCQkJaWYgKCggdmFsdWVfY29udmVydCA+PSBQQVJNX01JTl9UWF9SQVRFICkgJiYgKCB2YWx1ZV9jb252ZXJ0IDw9IFBBUk1fTUFYX1RYX1JBVEUgKSkgeworCQkJCWxwLT53ZHNfcG9ydFszXS50eFJhdGVDbnRsID0gdmFsdWVfY29udmVydDsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNCApOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCBzdHJjbXAoIGtleSwgUEFSTV9OQU1FX1RYX1JBVEU1ICkgPT0gMCApIHsKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIiVzLCB2YWx1ZTogJXNcbiIsIFBBUk1fTkFNRV9UWF9SQVRFNSwgdmFsdWUgKTsKKworCQkJdmFsdWVfY29udmVydCA9IHdsX2F0b2koIHZhbHVlICk7CisJCQlpZiAoKCB2YWx1ZV9jb252ZXJ0ID49IFBBUk1fTUlOX1RYX1JBVEUgKSAmJiAoIHZhbHVlX2NvbnZlcnQgPD0gUEFSTV9NQVhfVFhfUkFURSApKSB7CisJCQkJbHAtPndkc19wb3J0WzRdLnR4UmF0ZUNudGwgPSB2YWx1ZV9jb252ZXJ0OworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIiVzIGludmFsaWQ7IHdpbGwgYmUgaWdub3JlZFxuIiwgUEFSTV9OQU1FX1RYX1JBVEU1ICk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIHN0cmNtcCgga2V5LCBQQVJNX05BTUVfVFhfUkFURTYgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1RYX1JBVEU2LCB2YWx1ZSApOworCisJCQl2YWx1ZV9jb252ZXJ0ID0gd2xfYXRvaSggdmFsdWUgKTsKKwkJCWlmICgoIHZhbHVlX2NvbnZlcnQgPj0gUEFSTV9NSU5fVFhfUkFURSApICYmICggdmFsdWVfY29udmVydCA8PSBQQVJNX01BWF9UWF9SQVRFICkpIHsKKwkJCQlscC0+d2RzX3BvcnRbNV0udHhSYXRlQ250bCA9IHZhbHVlX2NvbnZlcnQ7CisJCQl9IGVsc2UgeworCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXMgaW52YWxpZDsgd2lsbCBiZSBpZ25vcmVkXG4iLCBQQVJNX05BTUVfVFhfUkFURTYgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMSwgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPndkc19wb3J0WzBdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzEgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMiwgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPndkc19wb3J0WzFdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzIgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTMywgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPndkc19wb3J0WzJdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzMgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNCwgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPndkc19wb3J0WzNdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzQgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNSwgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPndkc19wb3J0WzRdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzUgKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICggc3RyY21wKCBrZXksIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYgKSA9PSAwICkgeworCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiJXMsIHZhbHVlOiAlc1xuIiwgUEFSTV9OQU1FX1dEU19BRERSRVNTNiwgdmFsdWUgKTsKKworCQkJaWYgKCBwYXJzZV9tYWNfYWRkcmVzcyggdmFsdWUsIG1hY192YWx1ZSApID09IEVUSF9BTEVOICkgeworCQkJCW1lbWNweSggbHAtPndkc19wb3J0WzVdLndkc0FkZHJlc3MsIG1hY192YWx1ZSwgRVRIX0FMRU4gKTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1dBUk5JTkcoIERiZ0luZm8sICIlcyBpbnZhbGlkOyB3aWxsIGJlIGlnbm9yZWRcbiIsIFBBUk1fTkFNRV9XRFNfQUREUkVTUzYgKTsKKwkJCX0KKwkJfQorI2VuZGlmICAvKiBVU0VfV0RTICovCisJfQorI2VuZGlmICAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworCXJldHVybjsKK30gLy8gdHJhbnNsYXRlX29wdGlvbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXBhcnNlX21hY19hZGRyZXNzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHBhcnNlIGEgbWFjIGFkZHJlc3Mgc3RyaW5nIGFuZCBjb252ZXJ0IGl0IHRvIGEgYnl0ZQorICogICBhcnJheS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHZhbHVlICAgICAgIC0gdGhlIE1BQyBhZGRyZXNzLCByZXByZXNlbnRlZCBhcyBhIHN0cmluZworICogICAgICBieXRlX2FycmF5ICAtIHRoZSBNQUMgYWRkcmVzcywgcmVwcmVzZW50ZWQgYXMgYSBieXRlIGFycmF5IG9mIGxlbmd0aAorICogICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBmaW5hbCBNQUMgYWRkcmVzcywgc2hvdWxkIGVxdWFsIHRvIEVUSF9BTEVOLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcGFyc2VfbWFjX2FkZHJlc3MoIGNoYXIgKnZhbHVlLCB1X2NoYXIgKmJ5dGVfYXJyYXkgKQoreworCWludCAgICAgdmFsdWVfb2Zmc2V0ID0gMDsKKwlpbnQgICAgIGFycmF5X29mZnNldCA9IDA7CisJaW50ICAgICBmaWVsZF9vZmZzZXQgPSAwOworCWNoYXIgICAgYnl0ZV9maWVsZFszXTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwltZW1zZXQoIGJ5dGVfZmllbGQsICdcMCcsIDMgKTsKKworCXdoaWxlKCB2YWx1ZVt2YWx1ZV9vZmZzZXRdICE9ICdcMCcgKSB7CisJCS8qIFNraXAgb3ZlciB0aGUgY29sb24gY2hhcnMgc2VwZXJhdGluZyB0aGUgYnl0ZXMsIGlmIHRoZXkgZXhpc3QgKi8KKwkJaWYgKCB2YWx1ZVt2YWx1ZV9vZmZzZXRdID09ICc6JyApIHsKKwkJCXZhbHVlX29mZnNldCsrOworCQkJY29udGludWU7CisJCX0KKworCQlieXRlX2ZpZWxkW2ZpZWxkX29mZnNldF0gPSB2YWx1ZVt2YWx1ZV9vZmZzZXRdOworCQlmaWVsZF9vZmZzZXQrKzsKKwkJdmFsdWVfb2Zmc2V0Kys7CisKKwkJLyogT25jZSB0aGUgYnl0ZV9maWVsZCBpcyBmaWxsZWQsIGNvbnZlcnQgaXQgYW5kIHN0b3JlIGl0ICovCisJCWlmICggZmllbGRfb2Zmc2V0ID09IDIgKSB7CisJCQlieXRlX2ZpZWxkW2ZpZWxkX29mZnNldF0gPSAnXDAnOworCQkJYnl0ZV9hcnJheVthcnJheV9vZmZzZXRdID0gc2ltcGxlX3N0cnRvdWwoIGJ5dGVfZmllbGQsIE5VTEwsIDE2ICk7CisJCQlmaWVsZF9vZmZzZXQgPSAwOworCQkJYXJyYXlfb2Zmc2V0Kys7CisJCX0KKwl9CisKKwkvKiBVc2UgdGhlIGFycmF5X29mZnNldCBhcyBhIGNoZWNrOyA2IGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIHRvIHRoZQorCSAgIGJ5dGVfYXJyYXkgKi8KKwlyZXR1cm4gYXJyYXlfb2Zmc2V0OworfSAvLyBwYXJzZV9tYWNfYWRkcmVzcworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVBhcnNlQ29uZmlnTGluZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFBhcnNlcyBhIGxpbmUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGludG8gYW4gTC12YWwgYW5kIGFuIFItdmFsLAorICogIHJlcHJlc2VudGluZyBhIGtleS92YWx1ZSBwYWlyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcHN6TGluZSAgICAgLSB0aGUgbGluZSBmcm9tIHRoZSBjb25maWcgZmlsZSB0byBwYXJzZQorICogICAgICBwcHN6TFZhbCAgICAtIHRoZSByZXN1bHRpbmcgTC12YWwgKEtleSkKKyAqICAgICAgcHBzelJWYWwgICAgLSB0aGUgcmVzdWx0aW5nIFItdmFsIChWYWx1ZSkKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBhcnNlQ29uZmlnTGluZSggY2hhciAqcHN6TGluZSwgY2hhciAqKnBwc3pMVmFsLCBjaGFyICoqcHBzelJWYWwgKQoreworCWludCBpOworCWludCBzaXplOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAiUGFyc2VDb25maWdMaW5lIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJLyogZ2V0IGEgc25hcHNob3Qgb2Ygb3VyIHN0cmluZyBzaXplICovCisJc2l6ZSAgICAgID0gc3RybGVuKCBwc3pMaW5lICk7CisJKnBwc3pMVmFsID0gTlVMTDsKKwkqcHBzelJWYWwgPSBOVUxMOworCisJaWYgKCBwc3pMaW5lWzBdICE9ICcjJyAmJgkJCQkJCQkvKiBza2lwIHRoZSBsaW5lIGlmIGl0IGlzIGEgY29tbWVudCAqLworCQkgcHN6TGluZVswXSAhPSAnXG4nJiYJCQkJCQkJLyogaWYgaXQncyBhbiBlbXB0eSBVTklYIGxpbmUsIGRvIG5vdGhpbmcgKi8KKwkJICEoIHBzekxpbmVbMF0gPT0gJ1xyJyAmJiBwc3pMaW5lWzFdID09ICdcbicgKQkvKiBpZiBpdCdzIGFuIGVtcHR5IE1TLURPUyBsaW5lLCBkbyBub3RoaW5nICovCisJICAgICkgeworCQkvKiBhZHZhbmNlIHBhc3QgYW55IHdoaXRlc3BhY2UsIGFuZCBhc3NpZ24gdGhlIEwtdmFsdWUgKi8KKwkJZm9yKCBpID0gMDsgaSA8IHNpemU7IGkrKyApIHsKKwkJCWlmICggcHN6TGluZVtpXSAhPSAnICcgKSB7CisJCQkJKnBwc3pMVmFsID0gJnBzekxpbmVbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogYWR2YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBsLXZhbHVlKi8KKwkJZm9yKCBpKys7IGkgPCBzaXplOyBpKysgKSB7CisJCQlpZiAoIHBzekxpbmVbaV0gPT0gJyAnIHx8IHBzekxpbmVbaV0gPT0gJz0nICkgeworCQkJCXBzekxpbmVbaV0gPSAnXDAnOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIG1ha2UgYW55IHdoaXRlc3BhY2UgYW5kIHRoZSBlcXVhbCBzaWduIGEgTlVMTCBjaGFyYWN0ZXIsIGFuZAorCQkgICBhZHZhbmNlIHRvIHRoZSBSLVZhbHVlICovCisJCWZvciggaSsrOyBpIDwgc2l6ZTsgaSsrICkgeworCQkJaWYgKCBwc3pMaW5lW2ldID09ICcgJyB8fCBwc3pMaW5lW2ldID09ICc9JyApIHsKKwkJCQlwc3pMaW5lW2ldID0gJ1wwJzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpwcHN6UlZhbCA9ICZwc3pMaW5lW2ldOworCQkJYnJlYWs7CisJCX0KKwkJLyogbWFrZSB0aGUgbGluZSBlbmRpbmcgY2hhcmFjdGVyKHMpIGEgTlVMTCAqLworCQlmb3IoIGkrKzsgaSA8IHNpemU7IGkrKyApIHsKKwkJCWlmICggcHN6TGluZVtpXSA9PSAnXG4nICkgeworCQkJCXBzekxpbmVbaV0gPSAnXDAnOworCQkJfQorCQkJaWYgKCggcHN6TGluZVtpXSA9PSAnXHInICkgJiYgKCBwc3pMaW5lW2krMV0gPT0gJ1xuJyApKSB7CisJCQkJcHN6TGluZVtpXSA9ICdcMCc7CisJCQl9CisJCX0KKwl9CisJREJHX0xFQVZFKCBEYmdJbmZvICk7Cit9IC8vIFBhcnNlQ29uZmlnTGluZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmICAvLyBVU0VfUFJPRklMRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGI4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9wcm9maWxlLmgKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgY29uZmlnIHBhcnNpbmcgcm91dGluZXMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX1BST0ZJTEVfSF9fCisjZGVmaW5lIF9fV0xfUFJPRklMRV9IX18KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjb25zdGFudCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUk9PVF9DT05GSUdfRklMRU5BTUUgIi9ldGMvYWdlcmUvaXdjb25maWctIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZnVuY3Rpb24gcHJvdG90eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGFyc2VfY29uZmlnKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2ludCByZWFkbGluZSggaW50IGZpbGVkZXNjLCBjaGFyICpidWZmZXIgKTsKKwordm9pZCB0cmFuc2xhdGVfb3B0aW9uKCBjaGFyICpidWZmZXIsIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCitpbnQgcGFyc2VfbWFjX2FkZHJlc3MoIGNoYXIgKnZhbHVlLCB1X2NoYXIgKmJ5dGVfYXJyYXkgKTsKKwordm9pZCBQYXJzZUNvbmZpZ0xpbmUoIGNoYXIgKnBzekxpbmUsIGNoYXIgKipwcHN6TFZhbCwgY2hhciAqKnBwc3pSVmFsICk7CisKKworI2VuZGlmICAvLyBfX1dMX1BST0ZJTEVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRlMDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGV4OiBzdz00CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhjZi5oPgorI2luY2x1ZGUgPGhjZmRlZi5oPgorCisjaW5jbHVkZSA8d2xfaWYuaD4KKyNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPHdsX3V0aWwuaD4KKyNpbmNsdWRlIDx3bF9tYWluLmg+CisjaW5jbHVkZSA8d2xfd2V4dC5oPgorI2luY2x1ZGUgPHdsX3ByaXYuaD4KKworc3RhdGljIGlubGluZSBpbnQgZGV2X2lzYWxpdmUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgICAgIHJldHVybiBkZXYtPnJlZ19zdGF0ZSA9PSBORVRSRUdfUkVHSVNURVJFRDsKK30KKworLyoKKyAqIGVtcGlyaWNhbGx5IGV2ZW4gaWYgdGFsbGllcyBhcmUgZGVmaW5lZCBhcyAzMiBiaXRzIGVudGl0aWVzLCBvbmx5CisgKiBoaWdoIDE2IGJpdHMgYXJlIHJlbGV2YW50OyBsb3cgaGFsZiBpcyBhbHdheXMgemVyby4gSXQgbWVhbnMgdGFsbGllcworICogYXJlIHByZXR0eSBtdWNoIHVzZWxlc3MgZm9yIHRyYWZmaWMgY291bnRpbmcgYnV0IGF0IGxlYXN0IGdpdmUgb3ZlcnZpZXcKKyAqIGFib3V0IHdoZXJlIGVycm9yIGNvbWUgZnJvbQorICovCitzdGF0aWMgc3NpemVfdCBzaG93X3RhbGxpZXMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGQpOworICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIENGR19IRVJNRVNfVEFMTElFU19TVFJDVCB0YWxsaWVzOworICAgIHNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKworICAgIHJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CisgICAgaWYgKGRldl9pc2FsaXZlKGRldikpIHsKKwl3bF9sb2NrKGxwLCAmZmxhZ3MpOworCisJaWYgKChyZXQgPSB3bF9nZXRfdGFsbGllcyhscCwgJnRhbGxpZXMpKSA9PSAwKSB7CisJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCSAgICAiVHhVbmljYXN0RnJhbWVzOiAgICAgICAgICAgJXVcbiIKKwkJICAgICJUeE11bHRpY2FzdEZyYW1lczogICAgICAgICAldVxuIgorCQkgICAgIlR4RnJhZ21lbnRzOiAgICAgICAgICAgICAgICV1XG4iCisJCSAgICAiVHhVbmljYXN0T2N0ZXRzOiAgICAgICAgICAgJXVcbiIKKwkJICAgICJUeE11bHRpY2FzdE9jdGV0czogICAgICAgICAldVxuIgorCQkgICAgIlR4RGVmZXJyZWRUcmFuc21pc3Npb25zOiAgICV1XG4iCisJCSAgICAiVHhTaW5nbGVSZXRyeUZyYW1lczogICAgICAgJXVcbiIKKwkJICAgICJUeE11bHRpcGxlUmV0cnlGcmFtZXM6ICAgICAldVxuIgorCQkgICAgIlR4UmV0cnlMaW1pdEV4Y2VlZGVkOiAgICAgICV1XG4iCisJCSAgICAiVHhEaXNjYXJkczogICAgICAgICAgICAgICAgJXVcbiIKKwkJICAgICJSeFVuaWNhc3RGcmFtZXM6ICAgICAgICAgICAldVxuIgorCQkgICAgIlJ4TXVsdGljYXN0RnJhbWVzOiAgICAgICAgICV1XG4iCisJCSAgICAiUnhGcmFnbWVudHM6ICAgICAgICAgICAgICAgJXVcbiIKKwkJICAgICJSeFVuaWNhc3RPY3RldHM6ICAgICAgICAgICAldVxuIgorCQkgICAgIlJ4TXVsdGljYXN0T2N0ZXRzOiAgICAgICAgICV1XG4iCisJCSAgICAiUnhGQ1NFcnJvcnM6ICAgICAgICAgICAgICAgJXVcbiIKKwkJICAgICJSeERpc2NhcmRzTm9CdWZmZXI6ICAgICAgICAldVxuIgorCQkgICAgIlR4RGlzY2FyZHNXcm9uZ1NBOiAgICAgICAgICV1XG4iCisJCSAgICAiUnhXRVBVbmRlY3J5cHRhYmxlOiAgICAgICAgJXVcbiIKKwkJICAgICJSeE1zZ0luTXNnRnJhZ21lbnRzOiAgICAgICAldVxuIgorCQkgICAgIlJ4TXNnSW5CYWRNc2dGcmFnbWVudHM6ICAgICV1XG4iCisJCSAgICAiUnhEaXNjYXJkc1dFUElDVkVycm9yOiAgICAgJXVcbiIKKwkJICAgICJSeERpc2NhcmRzV0VQRXhjbHVkZWQ6ICAgICAldVxuIgorCQkgICAgLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlR4VW5pY2FzdEZyYW1lcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeE11bHRpY2FzdEZyYW1lcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeEZyYWdtZW50cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeFVuaWNhc3RPY3RldHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhNdWx0aWNhc3RPY3RldHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhTaW5nbGVSZXRyeUZyYW1lcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeE11bHRpcGxlUmV0cnlGcmFtZXMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhSZXRyeUxpbWl0RXhjZWVkZWQsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuVHhEaXNjYXJkcywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeFVuaWNhc3RGcmFtZXMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhNdWx0aWNhc3RGcmFtZXMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhGcmFnbWVudHMsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhVbmljYXN0T2N0ZXRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4TXVsdGljYXN0T2N0ZXRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4RkNTRXJyb3JzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4RGlzY2FyZHNOb0J1ZmZlciwKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5UeERpc2NhcmRzV3JvbmdTQSwKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeFdFUFVuZGVjcnlwdGFibGUsCisJCSAgICAodW5zaWduZWQgaW50KXRhbGxpZXMuUnhNc2dJbk1zZ0ZyYWdtZW50cywKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeE1zZ0luQmFkTXNnRnJhZ21lbnRzLAorCQkgICAgKHVuc2lnbmVkIGludCl0YWxsaWVzLlJ4RGlzY2FyZHNXRVBJQ1ZFcnJvciwKKwkJICAgICh1bnNpZ25lZCBpbnQpdGFsbGllcy5SeERpc2NhcmRzV0VQRXhjbHVkZWQpOworCSAgICB9IGVsc2UgeworCQl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKKwkgICAgfQorICAgIH0KKworICAgIHJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGFsbGllcywgU19JUlVHTywgc2hvd190YWxsaWVzLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKndsYWdzX2F0dHJzW10gPSB7CisgICAgJmRldl9hdHRyX3RhbGxpZXMuYXR0ciwKKyAgICBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3bGFnc19ncm91cCA9IHsKKyAgICAubmFtZSA9ICJ3bGFncyIsCisgICAgLmF0dHJzID0gd2xhZ3NfYXR0cnMsCit9OworCit2b2lkIHJlZ2lzdGVyX3dsYWdzX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisgICAgc3RydWN0IGRldmljZSAqZGV2ID0gJihuZXQtPmRldik7CisgICAgc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihuZXQpOworCisgICAgbHAtPnN5c2ZzQ3JlYXRlZCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmd2xhZ3NfZ3JvdXApOworfQorCit2b2lkIHVucmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmKG5ldC0+ZGV2KTsKKyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KG5ldCk7CisKKyAgICBpZiAobHAtPnN5c2ZzQ3JlYXRlZCkKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJndsYWdzX2dyb3VwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTZkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5oCkBAIC0wLDAgKzEsNyBAQAorI2lmZGVmIENPTkZJR19TWVNGUworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfd2xhZ3Nfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX3dsYWdzX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICopOworI2Vsc2UKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3dsYWdzX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICopIHsgcmV0dXJuOyB9Oworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqKSB7IHJldHVybjsgfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWU3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmMKQEAgLTAsMCArMSwxNTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQorICoKKyAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KKyAqICAgaHR0cDovL3d3dy50cmlwbGVwb2ludC5jb20KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgVGhpcyBmaWxlIGRlZmluZXMgbWlzYyB1dGlsaXR5IGZ1bmN0aW9ucy4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFNPRlRXQVJFIExJQ0VOU0UKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKKyAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKKyAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KKyAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisvLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKy8vICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisvLyAjaW5jbHVkZSA8bGludXgvaW4uaD4KKy8vICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorLy8gI2luY2x1ZGUgPGFzbS9pby5oPgorLy8gI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKy8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxoY2YuaD4KKy8vICNpbmNsdWRlIDxoY2ZkZWYuaD4KKworI2luY2x1ZGUgPHdsX2lmLmg+CisjaW5jbHVkZSA8d2xfaW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx3bF91dGlsLmg+CisjaW5jbHVkZSA8d2xfd2V4dC5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBIG1hdHJpeCB3aGljaCBtYXBzIGNoYW5uZWxzIHRvIGZyZXF1ZW5jaWVzICovCisjZGVmaW5lIE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVMgICA1MAorc3RhdGljIGNvbnN0IGxvbmcgY2hhbl9mcmVxX2xpc3RbXVtNQVhfQ0hBTl9GUkVRX01BUF9FTlRSSUVTXSA9Cit7CisgICAgezEsMjQxMn0sCisgICAgezIsMjQxN30sCisgICAgezMsMjQyMn0sCisgICAgezQsMjQyN30sCisgICAgezUsMjQzMn0sCisgICAgezYsMjQzN30sCisgICAgezcsMjQ0Mn0sCisgICAgezgsMjQ0N30sCisgICAgezksMjQ1Mn0sCisgICAgezEwLDI0NTd9LAorICAgIHsxMSwyNDYyfSwKKyAgICB7MTIsMjQ2N30sCisgICAgezEzLDI0NzJ9LAorICAgIHsxNCwyNDg0fSwKKyAgICB7MzYsNTE4MH0sCisgICAgezQwLDUyMDB9LAorICAgIHs0NCw1MjIwfSwKKyAgICB7NDgsNTI0MH0sCisgICAgezUyLDUyNjB9LAorICAgIHs1Niw1MjgwfSwKKyAgICB7NjAsNTMwMH0sCisgICAgezY0LDUzMjB9LAorICAgIHsxNDksNTc0NX0sCisgICAgezE1Myw1NzY1fSwKKyAgICB7MTU3LDU3ODV9LAorICAgIHsxNjEsNTgwNX0KK307CisKKyNpZiBEQkcKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmICAvKiBEQkcgKi8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCWRibSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybiBhbiBlbmVyZ3kgdmFsdWUgaW4gZEJtLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgdmFsdWUgLSB0aGUgZW5lcmd5IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgdGhlIHZhbHVlIGluIGRCbQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZGJtKCBpbnQgdmFsdWUgKQoreworICAgIC8qIFRydW5jYXRlIHRoZSB2YWx1ZSB0byBiZSBiZXR3ZWVuIG1pbiBhbmQgbWF4LiAqLworICAgIGlmKCB2YWx1ZSA8IEhDRl9NSU5fU0lHTkFMX0xFVkVMICkKKyAgICAgICAgdmFsdWUgPSBIQ0ZfTUlOX1NJR05BTF9MRVZFTDsKKworICAgIGlmKCB2YWx1ZSA+IEhDRl9NQVhfU0lHTkFMX0xFVkVMICkKKyAgICAgICAgdmFsdWUgPSBIQ0ZfTUFYX1NJR05BTF9MRVZFTDsKKworICAgIC8qIFJldHVybiB0aGUgZW5lcmd5IHZhbHVlIGluIGRCbS4gKi8KKyAgICByZXR1cm4gKCB2YWx1ZSAtIEhDRl8wREJNX09GRlNFVCApOworfSAvLyBkYm0KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglwZXJjZW50KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJuIGEgdmFsdWUgYXMgYSBwZXJjZW50YWdlIG9mIG1pbiB0byBtYXguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB2YWx1ZSAgIC0gdGhlIHZhbHVlIGluIHF1ZXN0aW9uCisgKiAgICAgIG1pbiAgICAgLSB0aGUgbWluaW11bSByYW5nZSB2YWx1ZQorICogICAgICBtYXggICAgIC0gdGhlIG1heGltdW0gcmFuZ2UgdmFsdWUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIHRoZSBwZXJjZW50YWdlIHZhbHVlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBwZXJjZW50KCBpbnQgdmFsdWUsIGludCBtaW4sIGludCBtYXggKQoreworICAgIC8qIFRydW5jYXRlIHRoZSB2YWx1ZSB0byBiZSBiZXR3ZWVuIG1pbiBhbmQgbWF4LiAqLworICAgIGlmKCB2YWx1ZSA8IG1pbiApCisgICAgICAgIHZhbHVlID0gbWluOworCisgICAgaWYoIHZhbHVlID4gbWF4ICkKKyAgICAgICAgdmFsdWUgPSBtYXg7CisKKyAgICAvKiBSZXR1cm4gdGhlIHZhbHVlIGFzIGEgcGVyY2VudGFnZSBvZiBtaW4gdG8gbWF4LiAqLworICAgIHJldHVybiAoKCggdmFsdWUgLSBtaW4gKSAqIDEwMCApIC8gKCBtYXggLSBtaW4gKSk7Cit9IC8vIHBlcmNlbnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglpc192YWxpZF9rZXlfc3RyaW5nKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2hlY2tzIHRvIGRldGVybWluZSBpZiB0aGUgV0VQIGtleSBzdHJpbmcgaXMgdmFsaWQKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHMgLSB0aGUgc3RyaW5nIGluIHF1ZXN0aW9uCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBub24temVybyBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgdmFsaWQga2V5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpc192YWxpZF9rZXlfc3RyaW5nKCBjaGFyICpzICkKK3sKKyAgICBpbnQgbDsKKyAgICBpbnQgaTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGwgPSBzdHJsZW4oIHMgKTsKKworICAgIC8qIDB4IGZvbGxvd2VkIGJ5IDUgb3IgMTMgaGV4YWRlY2ltYWwgZGlnaXQgcGFpcnMgaXMgdmFsaWQgKi8KKyAgICBpZiggc1swXSA9PSAnMCcgJiYgKCBzWzFdID09ICd4JyB8fCBzWzFdID09ICdYJyApKSB7CisgICAgICAgIGlmKCBsID09IDEyIHx8IGwgPT0gMjggKSB7CisgICAgICAgICAgICBmb3IoIGkgPSAyOyBpIDwgbDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCAhaXN4ZGlnaXQoIHNbaV0gKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzdHJpbmcgd2l0aCAwLCA1LCBvciAxMyBjaGFyYWN0ZXJzIGlzIHZhbGlkICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuKCBsID09IDAgfHwgbCA9PSA1IHx8IGwgPT0gMTMgKTsKKyAgICB9Cit9IC8vIGlzX3ZhbGlkX2tleV9zdHJpbmcKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgloZXhkaWdpdDJpbnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDb252ZXJ0cyBhIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlciB0byBhbiBpbnRlZ2VyCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBjICAgLSB0aGUgaGV4YWRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICB0aGUgY29udmVydGVkIGludGVnZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGhleGRpZ2l0MmludCggY2hhciBjICkKK3sKKyAgIGlmKCBjID49ICcwJyAmJiBjIDw9ICc5JyApCisgICAgICAgcmV0dXJuIGMgLSAnMCc7CisKKyAgIGlmKCBjID49ICdBJyAmJiBjIDw9ICdGJyApCisgICAgICAgcmV0dXJuIGMgLSAnQScgKyAxMDsKKworICAgaWYoIGMgPj0gJ2EnICYmIGMgPD0gJ2YnICkKKyAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOworCisgICByZXR1cm4gMDsKK30gLy8gaGV4ZGlnaXQyaW50CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJa2V5X3N0cmluZzJrZXkoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDb252ZXJ0cyBhIGtleV9zdHJpbmcgdG8gYSBrZXksIEFzc3VtZXMgdGhlIGtleV9zdHJpbmcgaXMgdmFsaWRhdGVkIHdpdGgKKyAqICBpc192YWxpZF9rZXlfc3RyaW5nKCkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBrcyAgLSB0aGUgdmFsaWQga2V5IHN0cmluZworICogICAgICBrZXkgLSBhIHBvaW50ZXIgdG8gYSBLRVlfU1RSVUNUIHdoZXJlIHRoZSBjb252ZXJ0ZWQga2V5IGluZm9ybWF0aW9uIHdpbGwKKyAqICAgICAgICAgICAgYmUgc3RvcmVkLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQga2V5X3N0cmluZzJrZXkoIGNoYXIgKmtzLCBLRVlfU1RSQ1QgKmtleSApCit7CisgICAgaW50IGwsaSxuOworICAgIGNoYXIgKnA7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBsID0gc3RybGVuKCBrcyApOworCisgICAgLyogMHggZm9sbG93ZWQgYnkgaGV4YWRlY2ltYWwgZGlnaXQgcGFpcnMgKi8KKyAgICBpZigga3NbMF0gPT0gJzAnICYmICgga3NbMV0gPT0gJ3gnIHx8IGtzWzFdID09ICdYJyApKSB7CisgICAgICAgIG4gPSAwOworICAgICAgICBwID0gKGNoYXIgKilrZXktPmtleTsKKworICAgICAgICBmb3IoIGkgPSAyOyBpIDwgbDsgaSs9MiApIHsKKyAgICAgICAgICAgKnArKyA9ICggaGV4ZGlnaXQyaW50KCBrc1tpXSApIDw8IDQgKSArIGhleGRpZ2l0MmludCAoa3NbaSsxXSApOworICAgICAgICAgICBuKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3RlIHRoYXQgZW5kaWFuIHRyYW5zbGF0aW9uIG9mIHRoZSBsZW5ndGggZmllbGQgaXMgbm90IG5lZWRlZCBoZXJlCisgICAgICAgICAgYmVjYXVzZSBpdCdzIHBlcmZvcm1lZCBpbiB3bF9wdXRfbHR2KCkgKi8KKyAgICAgICAga2V5LT5sZW4gPSBuOworICAgIH0KKyAgICAvKiBjaGFyYWN0ZXIgc3RyaW5nICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyY3B5KCAoY2hhciAqKWtleS0+a2V5LCBrcyApOworICAgICAgICBrZXktPmxlbiA9IGw7CisgICAgfQorCisgICAgcmV0dXJuOworfSAvLyBrZXlfc3RyaW5nMmtleQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworI2lmIERCRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCURiZ0h3QWRkcigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENvbnZlcnQgYSBoYXJkd2FyZSBldGhlcm5ldCBhZGRyZXNzIHRvIGEgY2hhcmFjdGVyIHN0cmluZworICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgaHdBZGRyICAtIGFuIGV0aGVybmV0IGFkZHJlc3MKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIGEgcG9pbnRlciB0byBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV0aGVybmV0IGFkZHJlc3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgY2hhciAqRGJnSHdBZGRyKHVuc2lnbmVkIGNoYXIgKmh3QWRkcikKK3sKKyAgICBzdGF0aWMgY2hhciAgICAgYnVmZmVyWzE4XTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIHNwcmludGYoIGJ1ZmZlciwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKyAgICAgICAgICAgICBod0FkZHJbMF0sIGh3QWRkclsxXSwgaHdBZGRyWzJdLCBod0FkZHJbM10sIGh3QWRkcls0XSwgaHdBZGRyWzVdICk7CisKKyAgICByZXR1cm4gYnVmZmVyOworfSAvLyBEYmdId0FkZHIKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNlbmRpZiAvKiBEQkcgKi8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2hhc193ZXAoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgV0VQCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBpZmJwICAgIC0gdGhlIElGQiBwb2ludGVyIG9mIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24KKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDEgaWYgV0VQIGlzIGtub3duIGVuYWJsZWQsIGVsc2UgMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaGFzX3dlcCAoSUZCUCBpZmJwKQoreworICAgIENGR19QUklWQUNZX09QVF9JTVBMRU1FTlRFRF9TVFJDVCBsdHY7CisJaW50IHJjLCBwcml2YWN5OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJLyogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdXMgdG8gZGlzdGlndWlzaCBicm9uemUgY2FyZHMgZnJvbSBvdGhlciB0eXBlcywgdG8KKyAgICAgICBrbm93IGlmIFdFUCBleGlzdHMuIERvZXMgbm90IGRpc3Rpbmd1aXNoIChiZWNhdXNlIHRoZXJlJ3Mgbm8gd2F5IHRvKQorICAgICAgIGJldHdlZW4gc2lsdmVyIGFuZCBnb2xkIGNhcmRzLiAqLworICAgIGx0di5sZW4gPSAyOworICAgIGx0di50eXAgPSBDRkdfUFJJVkFDWV9PUFRfSU1QTEVNRU5URUQ7CisKKwlyYyA9IGhjZl9nZXRfaW5mbyggaWZicCwgKExUVlApICZsdHYgKTsKKworCXByaXZhY3kgPSBDTlZfTElUVExFX1RPX0lOVCggbHR2LnByaXZhY3lfb3B0X2ltcGxlbWVudGVkICk7CisKKwkvL3JldHVybiByYyA/IDAgOiBwcml2YWN5OworICAgIHJldHVybiAxOworfSAvLyB3bF9oYXNfd2VwCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaGNmX2Vycm9yKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmVwb3J0IHRoZSB0eXBlIG9mIEhDRiBlcnJvciBtZXNzYWdlCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBub25lCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBBIGRlc2NyaXB0aXZlIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBlcnJvciwgcXVpZXQgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdsX2hjZl9lcnJvciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGhjZlN0YXR1cyApCit7CisgICAgY2hhciAgICAgYnVmZmVyWzY0XSwgKnBNc2c7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBpZiggaGNmU3RhdHVzICE9IEhDRl9TVUNDRVNTICkgeworICAgICAgICBzd2l0Y2goIGhjZlN0YXR1cyApIHsKKworICAgICAgICBjYXNlIEhDRl9FUlJfVElNRV9PVVQ6CisKKyAgICAgICAgICAgIHBNc2cgPSAiRXhwZWN0ZWQgYWRhcHRlciBldmVudCBkaWQgbm90IG9jY3VyIGluIGV4cGVjdGVkIHRpbWUiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfTk9fTklDOgorCisgICAgICAgICAgICBwTXNnID0gIkNhcmQgbm90IGZvdW5kIChlamVjdGVkIHVuZXhwZWN0ZWRseSkiOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIEhDRl9FUlJfTEVOOgorCisgICAgICAgICAgICBwTXNnID0gIkNvbW1hbmQgYnVmZmVyIHNpemUgaW5zdWZmaWNpZW50IjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0lOQ09NUF9QUkk6CisKKyAgICAgICAgICAgIHBNc2cgPSAiUHJpbWFyeSBmdW5jdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0lOQ09NUF9GVzoKKworICAgICAgICAgICAgcE1zZyA9ICJQcmltYXJ5IGZ1bmN0aW9ucyBhcmUgY29tcGF0aWJsZSwgIgorICAgICAgICAgICAgICAgICJzdGF0aW9uL2FwIGZ1bmN0aW9ucyBhcmUgbm90IjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0JVU1k6CisKKyAgICAgICAgICAgIHBNc2cgPSAiSW5xdWlyZSBjbWQgd2hpbGUgYW5vdGhlciBJbnF1aXJlIGluIHByb2dyZXNzIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgLy9jYXNlIEhDRl9FUlJfU0VRX0JVRzoKKworICAgICAgICAvLyAgICBwTXNnID0gIlVuZXhwZWN0ZWQgY29tbWFuZCBjb21wbGV0ZWQiOworICAgICAgICAvLyAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX0FVWDoKKworICAgICAgICAgICAgcE1zZyA9ICJUaW1lb3V0IG9uIGFjayBmb3IgZW5hYmxlL2Rpc2FibGUgb2YgQVVYIHJlZ2lzdGVycyI7CisgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgSENGX0VSUl9ERUZVTkNUX1RJTUVSOgorICAgICAgICAgICAgcE1zZyA9ICJUaW1lb3V0IG9uIHRpbWVyIGNhbGlicmF0aW9uIGR1cmluZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0RFRlVOQ1RfVElNRV9PVVQ6CisgICAgICAgICAgICBwTXNnID0gIlRpbWVvdXQgb24gQnVzeSBiaXQgZHJvcCBkdXJpbmcgQkFQIHNldHVwIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUToKKyAgICAgICAgICAgIHBNc2cgPSAiSGVybWVzIGFuZCBIQ0YgYXJlIG91dCBvZiBzeW5jIjsKKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgZGVmYXVsdDoKKworICAgICAgICAgICAgc3ByaW50ZiggYnVmZmVyLCAiRXJyb3IgY29kZSAlZCIsIGhjZlN0YXR1cyApOworICAgICAgICAgICAgcE1zZyA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRrKCBLRVJOX0lORk8gIiVzOiBXaXJlbGVzcywgSENGIGZhaWx1cmU6IFwiJXNcIlxuIiwKKyAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHBNc2cgKTsKKyAgICB9Cit9IC8vIHdsX2hjZl9lcnJvcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBEZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBkYXRhIGlzIGluIHRoZSBtYWlsYm94IGFuZCBwZXJmb3JtcyB0aGUgcHJvcGVyCisgKiAgZW5kaWFuIHRyYW5zbGF0aW9uLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgcEx0diAtIGFuIExUViBwb2ludGVyCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCBsdHZfdCAqcEx0diApCit7CisgICAgREJHX0ZVTkMoICJ3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50IiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisKKyAgICBzd2l0Y2goIHBMdHYtPnR5cCApIHsKKyAgICBjYXNlIENGR19UQUxMSUVTOgorICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBDRkdfU0NBTjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG51bUFQczsKKyAgICAgICAgICAgIFNDQU5fUlNfU1RSQ1QgKnBBcHMgPSAoU0NBTl9SU19TVFJDVCopJnBMdHYtPnUudThbMF07CisKKyAgICAgICAgICAgIG51bUFQcyA9IChoY2ZfMTYpKCggKHNpemVfdCkoIHBMdHYtPmxlbiAtIDEgKSAqIDIgKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoIFNDQU5fUlNfU1RSQ1QgKSkpOworCisgICAgICAgICAgICB3aGlsZSggbnVtQVBzID49IDEgKSB7CisgICAgICAgICAgICAgICAgbnVtQVBzLS07CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uY2hhbm5lbF9pZCAgICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLmNoYW5uZWxfaWQgKTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5ub2lzZV9sZXZlbCAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10ubm9pc2VfbGV2ZWwgKTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5zaWduYWxfbGV2ZWwgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uc2lnbmFsX2xldmVsICk7CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uYmVhY29uX2ludGVydmFsX3RpbWUgPQorICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLmJlYWNvbl9pbnRlcnZhbF90aW1lICk7CisKKyAgICAgICAgICAgICAgICBwQXBzW251bUFQc10uY2FwYWJpbGl0eSAgICAgICAgICAgPQorICAgICAgICAgICAgICAgICAgICBDTlZfTElUVExFX1RPX0lOVCggcEFwc1tudW1BUHNdLmNhcGFiaWxpdHkgKTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5zc2lkX2xlbiAgICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIENOVl9MSVRUTEVfVE9fSU5UKCBwQXBzW251bUFQc10uc3NpZF9sZW4gKTsKKworICAgICAgICAgICAgICAgIHBBcHNbbnVtQVBzXS5zc2lkX3ZhbFtwQXBzW251bUFQc10uc3NpZF9sZW5dID0gMDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICBjYXNlIENGR19BQ1NfU0NBTjoKKyAgICAgICAgeworICAgICAgICAgICAgUFJPQkVfUkVTUCAqcHJvYmVfcmVzcCA9IChQUk9CRV9SRVNQICopcEx0djsKKworICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZnJhbWVDb250cm9sICk7CisgICAgICAgICAgICBwcm9iZV9yZXNwLT5kdXJJRCAgICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5kdXJJRCApOworICAgICAgICAgICAgcHJvYmVfcmVzcC0+c2VxdWVuY2UgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+c2VxdWVuY2UgKTsKKyAgICAgICAgICAgIHByb2JlX3Jlc3AtPmRhdGFMZW5ndGggICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHByb2JlX3Jlc3AtPmRhdGFMZW5ndGggKTsKKworI2lmbmRlZiBXQVJQCisgICAgICAgICAgICBwcm9iZV9yZXNwLT5sZW5UeXBlICAgICAgICA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5sZW5UeXBlICk7CisjZW5kaWYgLy8gV0FSUAorCisgICAgICAgICAgICBwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCA9IENOVl9MSVRUTEVfVE9fSU5UKCBwcm9iZV9yZXNwLT5iZWFjb25JbnRlcnZhbCApOworICAgICAgICAgICAgcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSApOworICAgICAgICAgICAgcHJvYmVfcmVzcC0+ZmxhZ3MgICAgICAgICAgPSBDTlZfTElUVExFX1RPX0lOVCggcHJvYmVfcmVzcC0+ZmxhZ3MgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBDRkdfTElOS19TVEFUOgorI2RlZmluZSBscyAoKExJTktfU1RBVFVTX1NUUkNUICopcEx0dikKKyAgICAgICAgICAgIGxzLT5saW5rU3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIGxzLT5saW5rU3RhdHVzICk7CisgICAgICAgIGJyZWFrOworI3VuZGVmIGxzCisKKyAgICBjYXNlIENGR19BU1NPQ19TVEFUOgorICAgICAgICB7CisgICAgICAgICAgICBBU1NPQ19TVEFUVVNfU1RSQ1QgKnBBcyA9IChBU1NPQ19TVEFUVVNfU1RSQ1QgKilwTHR2OworCisgICAgICAgICAgICBwQXMtPmFzc29jU3RhdHVzID0gQ05WX0xJVFRMRV9UT19JTlQoIHBBcy0+YXNzb2NTdGF0dXMgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworCisgICAgY2FzZSBDRkdfU0VDVVJJVFlfU1RBVDoKKyAgICAgICAgeworICAgICAgICAgICAgU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpwU3MgPSAoU0VDVVJJVFlfU1RBVFVTX1NUUkNUICopcEx0djsKKworICAgICAgICAgICAgcFNzLT5zZWN1cml0eVN0YXR1cyA9IENOVl9MSVRUTEVfVE9fSU5UKCBwU3MtPnNlY3VyaXR5U3RhdHVzICk7CisgICAgICAgICAgICBwU3MtPnJlYXNvbiAgICAgICAgID0gQ05WX0xJVFRMRV9UT19JTlQoIHBTcy0+cmVhc29uICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQ0ZHX1dNUDoKKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgQ0ZHX05VTEw6CisgICAgICAgIGJyZWFrOworCisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCW1zZl9hc3NlcnQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQcmludCBzdGF0ZW1lbnQgdXNlZCB0byBkaXNwbGF5IGFzc2VydHMgZnJvbSB3aXRoaW4gdGhlIEhDRi4gT25seSBjYWxsZWQKKyAqICB3aGVuIGFzc2VydHMgaW4gdGhlIEhDRiBhcmUgdHVybmVkIG9uLiBTZWUgaGNmY2ZnLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBmaWxlX25hbWVwICAtIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgYXNzZXJ0IG9jY3VycmVkLgorICogICAgICBsaW5lX251bWJlciAtIHRoZSBsaW5lIG51bWJlciBvbiB3aGljaCB0aGUgYXNzZXJ0IG9jY3VycmVkLgorICogICAgICB0cmFjZSAgICAgICAtIGEgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2VydC4KKyAqICAgICAgcXVhbCAgICAgICAgLSByZXR1cm4gY29kZSBvciBvdGhlciB2YWx1ZSByZWxhdGVkIHRvIHRoZSBhc3NlcnQKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1zZl9hc3NlcnQoIHVuc2lnbmVkIGludCBsaW5lX251bWJlciwgaGNmXzE2IHRyYWNlLCBoY2ZfMzIgcXVhbCApCit7CisgICAgREJHX1BSSU5UKCAiSENGIEFTU0VSVDogTGluZSAlZCwgVkFMOiAweCUuOHhcbiIsIGxpbmVfbnVtYmVyLCAvKjs/Ki8odTMyKXF1YWwgKTsKK30gLy8gbXNmX2Fzc2VydAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3BhcnNlX2RzX2llKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIERpcmVjdCBTZXF1ZW5jZSBQYXJhbWV0ZXIgU2V0IElFLCB1c2VkIHRvCisgKiAgICAgIGRldGVybWluZSBjaGFubmVsL2ZyZXF1ZW5jeSBpbmZvcm1hdGlvbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHByb2JlX3JzcCAtIGEgcG9pbnRlciB0byBhIFBST0JFX1JFU1Agc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHByb2JlCisgKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIEJTUyByZXByZXNlbnRlZCBieSB0aGlzIHByb2JlIHJlc3BvbnNlIGlzCisgKiAgICAgIHRyYW5zbWl0dGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaGNmXzggd2xfcGFyc2VfZHNfaWUoIFBST0JFX1JFU1AgKnByb2JlX3JzcCApCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgaWVfbGVuZ3RoID0gMDsKKyAgICBoY2ZfOCAgICpidWY7CisgICAgaGNmXzggICBidWZfc2l6ZTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGlmKCBwcm9iZV9yc3AgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYnVmICAgICAgPSBwcm9iZV9yc3AtPnJhd0RhdGE7CisgICAgYnVmX3NpemUgPSBzaXplb2YoIHByb2JlX3JzcC0+cmF3RGF0YSApOworCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKyApIHsKKyAgICAgICAgaWYoIGJ1ZltpXSA9PSBEU19JTkZPX0VMRU0gKSB7CisgICAgICAgICAgICAvKiBJbmNyZW1lbnQgYnkgMSB0byBnZXQgdGhlIGxlbmd0aCwgYW5kIHRlc3QgaXQ7IGluIGEgRFMgZWxlbWVudCwKKyAgICAgICAgICAgICAgIGxlbmd0aCBzaG91bGQgYWx3YXlzIGJlIDEgKi8KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGllX2xlbmd0aCA9IGJ1ZltpXTsKKworICAgICAgICAgICAgaWYoIGJ1ZltpXSA9PSAxICkgeworICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGRpZG4ndCBmaW5kIGEgRFMtSUUsIHdoaWNoIGlzIHN0cmFuZ2UgKi8KKyAgICByZXR1cm4gMDsKK30gLy8gd2xfcGFyc2VfZHNfaWUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcGFyc2Vfd3BhX2llKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIFByb2JlIFJlc3BvbnNlIGZvciBhIHZhbGlkIFdQQS1JRS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHByb2JlX3JzcCAtIGEgcG9pbnRlciB0byBhIFBST0JFX1JFU1Agc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHByb2JlCisgKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlCisgKiAgICAgIGxlbmd0aCAgICAtIGEgcG9pbnRlciB0byBhbiBoY2ZfMTYgaW4gd2hpY2ggdGhlIHNpemUgb2YgdGhlIFdQQS1JRSB3aWxsCisgKiAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZCAoaWYgZm91bmQpLgorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgcHJvYmUgcmVzcG9uc2UgYnVmZmVyIHdoZXJlIGEgdmFsaWQKKyAqICAgICAgV1BBLUlFIGxpdmVzLiBUaGUgbGVuZ3RoIG9mIHRoaXMgSUUgaXMgd3JpdHRlbiBiYWNrIHRvIHRoZSAnbGVuZ3RoJworICogICAgICBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitoY2ZfOCAqIHdsX3BhcnNlX3dwYV9pZSggUFJPQkVfUkVTUCAqcHJvYmVfcnNwLCBoY2ZfMTYgKmxlbmd0aCApCit7CisgICAgaW50ICAgICBpOworICAgIGludCAgICAgaWVfbGVuZ3RoID0gMDsKKyAgICBoY2ZfOCAgICpidWY7CisgICAgaGNmXzggICBidWZfc2l6ZTsKKyAgICBoY2ZfOCAgIHdwYV9vdWlbXSA9IFdQQV9PVUlfVFlQRTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGlmKCBwcm9iZV9yc3AgPT0gTlVMTCB8fCBsZW5ndGggPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYnVmICAgICAgPSBwcm9iZV9yc3AtPnJhd0RhdGE7CisgICAgYnVmX3NpemUgPSBzaXplb2YoIHByb2JlX3JzcC0+cmF3RGF0YSApOworICAgICpsZW5ndGggID0gMDsKKworCisgICAgZm9yKCBpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKysgKSB7CisgICAgICAgIGlmKCBidWZbaV0gPT0gR0VORVJJQ19JTkZPX0VMRU0gKSB7CisgICAgICAgICAgICAvKiBJbmNyZW1lbnQgYnkgb25lIHRvIGdldCB0aGUgSUUgbGVuZ3RoICovCisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZV9sZW5ndGggPSBwcm9iZV9yc3AtPnJhd0RhdGFbaV07CisKKyAgICAgICAgICAgIC8qIEluY3JlbWVudCBieSBvbmUgdG8gcG9pbnQgdG8gdGhlIElFIHBheWxvYWQgKi8KKyAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgLyogRG9lcyB0aGUgSUUgY29udGFpbiBhIFdQQSBPVUk/IElmIG5vdCwgaXQncyBhIHByb3ByaWV0YXJ5IElFICovCisgICAgICAgICAgICBpZiggbWVtY21wKCAmYnVmW2ldLCAmd3BhX291aSwgV1BBX1NFTEVDVE9SX0xFTiApID09IDAgKSB7CisgICAgICAgICAgICAgICAgLyogUGFzcyBiYWNrIGxlbmd0aCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgV1BBLUlFICovCisgICAgICAgICAgICAgICAgLyogTk9URTogTGVuZ3RoIGNvbnRhaW5lZCBpbiB0aGUgV1BBLUlFIGlzIG9ubHkgdGhlIGxlbmd0aCBvZgorICAgICAgICAgICAgICAgICAgIHRoZSBwYXlsb2FkLiBUaGUgZW50aXJlIFdQQS1JRSwgaW5jbHVkaW5nIHRoZSBJRSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBsZW5ndGgsIGlzIDIgYnl0ZXMgbGFyZ2VyICovCisgICAgICAgICAgICAgICAgKmxlbmd0aCA9IGllX2xlbmd0aCArIDI7CisKKyAgICAgICAgICAgICAgICAvKiBCYWNrIHVwIHRoZSBwb2ludGVyIDIgYnl0ZXMgdG8gaW5jbHVkZSB0aGUgSUUgaWRlbnRpZmllciBhbmQKKyAgICAgICAgICAgICAgICAgICB0aGUgbGVuZ3RoIGluIHRoZSBidWZmZXIgcmV0dXJuZWQgKi8KKyAgICAgICAgICAgICAgICBpIC09IDI7CisgICAgICAgICAgICAgICAgcmV0dXJuICZidWZbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEluY3JlbWVudCBwYXN0IHRoaXMgbm9uLVdQQSBJRSBhbmQgY29udGludWUgbG9va2luZyAqLworICAgICAgICAgICAgaSArPSAoIGllX2xlbmd0aCAtIDEgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIHdlJ3JlIGhlcmUsIHdlIGRpZG4ndCBmaW5kIGEgV1BBLUlFIGluIHRoZSBidWZmZXIgKi8KKyAgICByZXR1cm4gTlVMTDsKK30gLy8gd2xfcGFyc2Vfd3BhX2llCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3ByaW50X3dwYV9pZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEZ1bmN0aW9uIHVzZWQgdG8gdGFrZSBhIFdQQSBJbmZvcm1hdGlvbiBFbGVtZW50IChXUEEtSUUpIGJ1ZmZlciBhbmQKKyAqICAgICAgZGlzcGxheSBpdCBpbiBhIHJlYWRhYmxlIGZvcm1hdC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGJ1ZmZlciAtIHRoZSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBXUEEtSUUKKyAqICAgICAgbGVuZ3RoIC0gdGhlIGxlbmd0aCBvZiB0aGUgYWJvdmUgYnVmZmVyCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBBIHBvaW50ZXIgdG8gdGhlIGZvcm1hdHRlZCBXUEEtSUUgc3RyaW5nLiBOb3RlIHRoYXQgdGhlIGZvcm1hdCB1c2VkIGlzCisgKiAgICAgIGJ5dGUtYnktYnl0ZSBwcmludGluZyBhcyAlMDJ4IGhleCB2YWx1ZXMgd2l0aCBubyBzcGFjZXMuIFRoaXMgaXMKKyAqICAgICAgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24gd2l0aCBzb21lIFdQQSBzdXBwbGljYW50cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaGNmXzggKiB3bF9wcmludF93cGFfaWUoIGhjZl84ICpidWZmZXIsIGludCBsZW5ndGggKQoreworICAgIGludCBjb3VudDsKKyAgICBpbnQgcm93czsKKyAgICBpbnQgcmVtYWluZGVyOworICAgIGludCByb3dzaXplID0gNDsKKyAgICBoY2ZfOCByb3dfYnVmWzY0XTsKKyAgICBzdGF0aWMgaGNmXzggb3V0cHV0WzUxMl07CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICBtZW1zZXQoIG91dHB1dCwgMCwgc2l6ZW9mKCBvdXRwdXQgKSk7CisgICAgbWVtc2V0KCByb3dfYnVmLCAwLCBzaXplb2YoIHJvd19idWYgKSk7CisKKworICAgIC8qIERldGVybWluZSBob3cgbWFueSByb3dzIHdpbGwgYmUgbmVlZGVkLCBhbmQgdGhlIHJlbWFpbmRlciAqLworICAgIHJvd3MgPSBsZW5ndGggLyByb3dzaXplOworICAgIHJlbWFpbmRlciA9IGxlbmd0aCAlIHJvd3NpemU7CisKKworICAgIC8qIEZvcm1hdCB0aGUgcm93cyAqLworICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IHJvd3M7IGNvdW50KysgKSB7CisgICAgICAgIHNwcmludGYoIHJvd19idWYsICIlMDJ4JTAyeCUwMnglMDJ4IiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyW2NvdW50KnJvd3NpemVdLCBidWZmZXJbY291bnQqcm93c2l6ZSsxXSwKKyAgICAgICAgICAgICAgICAgYnVmZmVyW2NvdW50KnJvd3NpemUrMl0sIGJ1ZmZlcltjb3VudCpyb3dzaXplKzNdKTsKKyAgICAgICAgc3RyY2F0KCBvdXRwdXQsIHJvd19idWYgKTsKKyAgICB9CisKKyAgICBtZW1zZXQoIHJvd19idWYsIDAsIHNpemVvZiggcm93X2J1ZiApKTsKKworCisgICAgLyogRm9ybWF0IHRoZSByZW1haW5kZXIgKi8KKyAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCByZW1haW5kZXI7IGNvdW50KysgKSB7CisgICAgICAgIHNwcmludGYoIHJvd19idWYsICIlMDJ4IiwgYnVmZmVyWyhyb3dzKnJvd3NpemUpK2NvdW50XSk7CisgICAgICAgIHN0cmNhdCggb3V0cHV0LCByb3dfYnVmICk7CisgICAgfQorCisgICAgcmV0dXJuIG91dHB1dDsKK30gLy8gd2xfcHJpbnRfd3BhX2llCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfaXNfYV92YWxpZF9jaGFuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgQ2hlY2tzIGlmIGEgZ2l2ZW4gY2hhbm5lbCBpcyB2YWxpZAorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgY2hhbm5lbCAtIHRoZSBjaGFubmVsCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAxIGlmIFRSVUUKKyAqICAgICAgMCBpZiBGQUxTRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaXNfYV92YWxpZF9jaGFuKCBpbnQgY2hhbm5lbCApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAvKiBTdHJpcCBvdXQgdGhlIGhpZ2ggYml0IHNldCBieSB0aGUgRlcgZm9yIDgwMi4xMWEgY2hhbm5lbHMgKi8KKyAgICBpZiggY2hhbm5lbCAmIDB4MTAwICkgeworICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAmIDB4MEZGOworICAgIH0KKworICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgZnJlcXVlbmN5ICovCisgICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKKyAgICAgICAgaWYoIGNoYW5fZnJlcV9saXN0W2ldWzBdID09IGNoYW5uZWwgKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfSAvLyB3bF9pc19hX3ZhbGlkX2NoYW4KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9nZXRfY2hhbl9mcm9tX2ZyZXEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBDaGVja3MgaWYgYSBnaXZlbiBmcmVxdWVuY3kgaXMgdmFsaWQKKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGZyZXEgLSB0aGUgZnJlcXVlbmN5CisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAxIGlmIFRSVUUKKyAqICAgICAgMCBpZiBGQUxTRQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2xfaXNfYV92YWxpZF9mcmVxKCBsb25nIGZyZXF1ZW5jeSApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIG1hdHJpeCBhbmQgcmV0cmlldmUgdGhlIGNoYW5uZWwgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgTUFYX0NIQU5fRlJFUV9NQVBfRU5UUklFUzsgaSsrICkgeworICAgICAgICBpZiggY2hhbl9mcmVxX2xpc3RbaV1bMV0gPT0gZnJlcXVlbmN5ICkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfaXNfYV92YWxpZF9mcmVxCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ2V0X2ZyZXFfZnJvbV9jaGFuKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnVuY3Rpb24gdXNlZCB0byBsb29rIHVwIHRoZSBmcmVxdWVuY3kgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBvbiB3aGljaCB0aGUKKyAqICAgICAgYWRhcHRlciBpcyBUeC9SeC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGNoYW5uZWwgLSB0aGUgY2hhbm5lbAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgZnJlcXVlbmN5CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2xvbmcgd2xfZ2V0X2ZyZXFfZnJvbV9jaGFuKCBpbnQgY2hhbm5lbCApCit7CisgICAgaW50IGk7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyAgICAvKiBTdHJpcCBvdXQgdGhlIGhpZ2ggYml0IHNldCBieSB0aGUgRlcgZm9yIDgwMi4xMWEgY2hhbm5lbHMgKi8KKyAgICBpZiggY2hhbm5lbCAmIDB4MTAwICkgeworICAgICAgICBjaGFubmVsID0gY2hhbm5lbCAmIDB4MEZGOworICAgIH0KKworICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbWF0cml4IGFuZCByZXRyaWV2ZSB0aGUgZnJlcXVlbmN5ICovCisgICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKKyAgICAgICAgaWYoIGNoYW5fZnJlcV9saXN0W2ldWzBdID09IGNoYW5uZWwgKSB7CisgICAgICAgICAgICByZXR1cm4gY2hhbl9mcmVxX2xpc3RbaV1bMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLy8gd2xfZ2V0X2ZyZXFfZnJvbV9jaGFuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgRnVuY3Rpb24gdXNlZCB0byBsb29rIHVwIHRoZSBjaGFubmVsIGZvciBhIGdpdmVuIGZyZXF1ZW5jeSBvbiB3aGljaCB0aGUKKyAqICAgICAgYWRhcHRlciBpcyBUeC9SeC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGZyZXF1ZW5jeSAtIHRoZSBmcmVxdWVuY3kKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHdsX2dldF9jaGFuX2Zyb21fZnJlcSggbG9uZyBmcmVxdWVuY3kgKQoreworICAgIGludCBpOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXRyaXggYW5kIHJldHJpZXZlIHRoZSBjaGFubmVsICovCisgICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DSEFOX0ZSRVFfTUFQX0VOVFJJRVM7IGkrKyApIHsKKyAgICAgICAgaWYoIGNoYW5fZnJlcV9saXN0W2ldWzFdID09IGZyZXF1ZW5jeSApIHsKKyAgICAgICAgICAgIHJldHVybiBjaGFuX2ZyZXFfbGlzdFtpXVswXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfSAvLyB3bF9nZXRfY2hhbl9mcm9tX2ZyZXEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcm9jZXNzX2xpbmtfc3RhdHVzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUHJvY2VzcyB0aGUgbGluayBzdGF0dXMgbWVzc2FnZSBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wcm9jZXNzX2xpbmtfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIGhjZl8xNiBsaW5rX3N0YXQ7CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX2xpbmtfc3RhdHVzIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIC8vbGlua19zdGF0ID0gbHAtPmhjZkN0eC5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRlc7CisgICAgICAgIGxpbmtfc3RhdCA9IGxwLT5oY2ZDdHguSUZCX0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsKKyAgICAgICAgc3dpdGNoKCBsaW5rX3N0YXQgKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkxpbmsgU3RhdHVzIDogQ29ubmVjdGVkXG4iICk7CisgICAgICAgICAgICB3bF93ZXh0X2V2ZW50X2FwKCBscC0+ZGV2ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBEaXNjb25uZWN0ZWRcbiIgICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBBY2Nlc3MgUG9pbnQgQ2hhbmdlXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBBY2Nlc3MgUG9pbnQgT3V0IG9mIFJhbmdlXG4iICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBBY2Nlc3MgUG9pbnQgSW4gUmFuZ2VcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiTGluayBTdGF0dXMgOiBVTktOT1dOICgweCUwNHgpXG4iLCBsaW5rX3N0YXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIERCR19MRUFWRSggRGJnSW5mbyApOworICAgIHJldHVybjsKK30gLy8gd2xfcHJvY2Vzc19saW5rX3N0YXR1cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQcm9jZXNzIHRoZSBwcm9iZSByZXNwb25zZXMgcmV0dW5yZWQgYnkgdGhlIGRldmljZSBhcyBhIHJlc3VsdCBvZiBhbgorICogICAgICBhY3RpdmUgc2Nhbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKyAgICBQUk9CRV9SRVNQICAqcHJvYmVfcnNwOworICAgIGhjZl84ICAgICAgICp3cGFfaWUgPSBOVUxMOworICAgIGhjZl8xNiAgICAgIHdwYV9pZV9sZW4gPSAwOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlIiApOworICAgIERCR19FTlRFUiggRGJnSW5mbyApOworCisKKyAgICBpZiggbHAgIT0gTlVMTCApIHsKKyAgICAgICAgcHJvYmVfcnNwID0gKFBST0JFX1JFU1AgKikmbHAtPlByb2JlUmVzcDsKKworICAgICAgICB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCAobHR2X3QgKilwcm9iZV9yc3AgKTsKKworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpID09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGxwLT5kZXYtPm5hbWUgKTsKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBsZW5ndGggICAgICA6IDB4JTA0eC5cbiIsICBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+bGVuZ3RoICk7CisKKyAgICAgICAgaWYoIHByb2JlX3JzcC0+bGVuZ3RoID4gMSApIHsKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgaW5mb1R5cGUgICAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmluZm9UeXBlICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgc2lnbmFsICAgICAgOiAweCUwMnguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnNpZ25hbCApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNpbGVuY2UgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5zaWxlbmNlICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgcnhGbG93ICAgICAgOiAweCUwMnguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnJ4RmxvdyApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHJhdGUgICAgICAgIDogMHglMDJ4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yYXRlICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgZnJhbWUgY250bCAgOiAweCUwNHguXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPmZyYW1lQ29udHJvbCApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGR1cklEICAgICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5kdXJJRCApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3MxICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzMSApKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBhZGRyZXNzMiAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+YWRkcmVzczIgKSk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgQlNTSUQgICAgICAgOiAlc1xuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgRGJnSHdBZGRyKCBwcm9iZV9yc3AtPkJTU0lEICkpOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIHNlcXVlbmNlICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5zZXF1ZW5jZSApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIGFkZHJlc3M0ICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5hZGRyZXNzNCApKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBkYXRhbGVuZ3RoICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+ZGF0YUxlbmd0aCApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIERBICAgICAgICAgIDogJXNcbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggcHJvYmVfcnNwLT5EQSApKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBTQSAgICAgICAgICA6ICVzXG4iLCBscC0+ZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHByb2JlX3JzcC0+U0EgKSk7CisKKyNpZmRlZiBXQVJQCisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgY2hhbm5lbCAgICAgOiAlZFxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5jaGFubmVsICk7CisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgYmFuZCAgICAgICAgOiAlZFxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5iYW5kICk7CisjZWxzZQorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBsZW5UeXBlICAgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+bGVuVHlwZSApOworI2VuZGlmICAvLyBXQVJQCisKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgdGltZVN0YW1wICAgOiAlZC4lZC4lZC4lZC4lZC4lZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbMF0sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzFdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbM10sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzRdLAorICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnRpbWVTdGFtcFs1XSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT50aW1lU3RhbXBbNl0sCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+dGltZVN0YW1wWzddKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBiZWFjb25JbnQgICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+YmVhY29uSW50ZXJ2YWwgKTsKKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBjYXBhYmlsaXR5ICA6IDB4JTA0eC5cbiIsIGxwLT5kZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHByb2JlX3JzcC0+Y2FwYWJpbGl0eSApOworCisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICIoJXMpIFNTSUQgbGVuICAgIDogMHglMDR4LlxuIiwgbHAtPmRldi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLT5yYXdEYXRhWzFdICk7CisKKworICAgICAgICAgICAgaWYoIHByb2JlX3JzcC0+cmF3RGF0YVsxXSA+IDAgKSB7CisgICAgICAgICAgICAgICAgY2hhciBzc2lkW0hDRl9NQVhfTkFNRV9MRU5dOworCisgICAgICAgICAgICAgICAgbWVtc2V0KCBzc2lkLCAwLCBzaXplb2YoIHNzaWQgKSk7CisgICAgICAgICAgICAgICAgc3RybmNweSggc3NpZCwgJnByb2JlX3JzcC0+cmF3RGF0YVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AtPnJhd0RhdGFbMV0gKTsKKworICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgU1NJRCAgICAgICAgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+ZGV2LT5uYW1lLCBzc2lkICk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLyogUGFyc2Ugb3V0IHRoZSBXUEEtSUUsIGlmIG9uZSBleGlzdHMgKi8KKyAgICAgICAgICAgIHdwYV9pZSA9IHdsX3BhcnNlX3dwYV9pZSggcHJvYmVfcnNwLCAmd3BhX2llX2xlbiApOworICAgICAgICAgICAgaWYoIHdwYV9pZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIiglcykgV1BBLUlFICAgICAgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBscC0+ZGV2LT5uYW1lLCB3bF9wcmludF93cGFfaWUoIHdwYV9pZSwgd3BhX2llX2xlbiApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiKCVzKSBmbGFncyAgICAgICA6IDB4JTA0eC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+ZGV2LT5uYW1lLCBwcm9iZV9yc3AtPmZsYWdzICk7CisgICAgICAgIH0KKworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJcbiIgKTsKKworCisgICAgICAgIC8qIElmIHByb2JlIHJlc3BvbnNlIGxlbmd0aCBpcyAxLCB0aGVuIHRoZSBzY2FuIGlzIGNvbXBsZXRlICovCisgICAgICAgIGlmKCBwcm9iZV9yc3AtPmxlbmd0aCA9PSAxICkgeworICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU0NBTiBDT01QTEVURVxuIiApOworICAgICAgICAgICAgbHAtPnByb2JlX3Jlc3VsdHMubnVtX2FwcyA9IGxwLT5wcm9iZV9udW1fYXBzOworICAgICAgICAgICAgbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IFRSVUU7CisKKyAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBjb3VudGVyIGZvciB0aGUgbmV4dCBzY2FuIHJlcXVlc3QgKi8KKyAgICAgICAgICAgIGxwLT5wcm9iZV9udW1fYXBzID0gMDsKKworICAgICAgICAgICAgLyogU2VuZCBhIHdpcmVsZXNzIGV4dGVuc2lvbnMgZXZlbnQgdGhhdCB0aGUgc2NhbiBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgIHdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSggbHAtPmRldiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogT25seSBjb3B5IHRvIHRoZSB0YWJsZSBpZiB0aGUgZW50cnkgaXMgdW5pcXVlOyBBUHMgc29tZXRpbWVzCisgICAgICAgICAgICAgICAgcmVzcG9uZCBtb3JlIHRoYW4gb25jZSB0byBhIHByb2JlICovCisgICAgICAgICAgICBpZiggbHAtPnByb2JlX251bV9hcHMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBpbmZvIHRvIHRoZSBTY2FuUmVzdWx0IHN0cnVjdHVyZSBpbiB0aGUgcHJpdmF0ZQorICAgICAgICAgICAgICAgIGFkYXB0ZXIgc3RydWN0ICovCisgICAgICAgICAgICAgICAgbWVtY3B5KCAmKCBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2xwLT5wcm9iZV9udW1fYXBzXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfcnNwLCBzaXplb2YoIFBST0JFX1JFU1AgKSk7CisKKyAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBBUHMgZGV0ZWN0ZWQgKi8KKyAgICAgICAgICAgICAgICBscC0+cHJvYmVfbnVtX2FwcysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICAgICAgaW50IHVuaXF1ZSA9IDE7CisKKyAgICAgICAgICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBscC0+cHJvYmVfbnVtX2FwczsgY291bnQrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1lbWNtcCggJiggcHJvYmVfcnNwLT5CU1NJRCApLAorICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtjb3VudF0uQlNTSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBFVEhfQUxFTiApID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHVuaXF1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgaW5mbyB0byB0aGUgU2NhblJlc3VsdCBzdHJ1Y3R1cmUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QuIE9ubHkgY29weSBpZiB0aGVyZSdzIHJvb20gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgIGlmKCBscC0+cHJvYmVfbnVtX2FwcyA8IE1BWF9OQVBTICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAmKCBscC0+cHJvYmVfcmVzdWx0cy5Qcm9iZVRhYmxlW2xwLT5wcm9iZV9udW1fYXBzXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZV9yc3AsIHNpemVvZiggUFJPQkVfUkVTUCApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiTnVtIG9mIHNjYW4gcmVzdWx0cyBleGNlZWRzIHN0b3JhZ2UsIHRydW5jYXRpbmdcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIEFQcyBkZXRlY3RlZC4gTm90ZSBJIGRvIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgZXZlbiB3aGVuIEkgZG9uJ3QgY29weSB0aGUgcHJvYmUgcmVzcG9uc2UgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBvdmVyZmxvdyBjb25kaXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgbHAtPnByb2JlX251bV9hcHMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUHJvY2VzcyB0aGUgdXBkYXRlZCBpbmZvcm1hdGlvbiByZWNvcmQgbWVzc2FnZSBzaWduYWxlZCBieSB0aGUgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgbHAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQoreworICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdID0gQ05WX0xJVFRMRV9UT19JTlQoIGxwLT51cGRhdGVkUmVjb3JkLnUudTE2WzBdICk7CisKKyAgICAgICAgc3dpdGNoKCBscC0+dXBkYXRlZFJlY29yZC51LnUxNlswXSApIHsKKyAgICAgICAgY2FzZSBDRkdfQ1VSX0NPVU5UUllfSU5GTzoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlVwZGF0ZWQgUmVjb3JkOiBDRkdfQ1VSX0NPVU5UUllfSU5GT1xuIiApOworICAgICAgICAgICAgd2xfY29ubmVjdCggbHAgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ0ZHX1BPUlRfU1RBVDoKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlVwZGF0ZWQgUmVjb3JkOiBXQUlUX0ZPUl9DT05ORUNUICgweEZENDApXG4iICk7CisgICAgICAgICAgICAvL3dsX2Nvbm5lY3QoIGxwICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiVU5LTk9XTjogMHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBscC0+dXBkYXRlZFJlY29yZC51LnUxNlswXSApOworICAgICAgICB9CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wcm9jZXNzX3VwZGF0ZWRfcmVjb3JkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBQcm9jZXNzIHRoZSBhc3NvY2lhdGlvbiBzdGF0dXMgZXZlbnQgc2lnbmFsZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcHJvY2Vzc19hc3NvY19zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgQVNTT0NfU1RBVFVTX1NUUkNUICphc3NvY19zdGF0OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgREJHX0ZVTkMoICJ3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cyIgKTsKKyAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCisgICAgaWYoIGxwICE9IE5VTEwgKSB7CisgICAgICAgIGFzc29jX3N0YXQgPSAoQVNTT0NfU1RBVFVTX1NUUkNUICopJmxwLT5hc3NvY19zdGF0OworCisgICAgICAgIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIChsdHZfdCAqKWFzc29jX3N0YXQgKTsKKworICAgICAgICBzd2l0Y2goIGFzc29jX3N0YXQtPmFzc29jU3RhdHVzICkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBTVEEgQXNzb2NpYXRlZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIFJlYXNzb2NpYXRlZFxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiQXNzb2NpYXRpb24gU3RhdHVzIDogU1RBIERpc2Fzc29jaWF0ZWRcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJBc3NvY2lhdGlvbiBTdGF0dXMgOiBVTktOT1dOICgweCUwNHgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2Nfc3RhdC0+YXNzb2NTdGF0dXMgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU1RBIEFkZHJlc3MgICAgICAgIDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggYXNzb2Nfc3RhdC0+c3RhQWRkciApKTsKKworICAgICAgICBpZigoIGFzc29jX3N0YXQtPmFzc29jU3RhdHVzID09IDIgKSAgJiYgKCBhc3NvY19zdGF0LT5sZW4gPT0gOCApKSB7CisgICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJPbGQgQVAgQWRkcmVzcyAgICAgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERiZ0h3QWRkciggYXNzb2Nfc3RhdC0+b2xkQXBBZGRyICkpOworICAgICAgICB9CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisgICAgcmV0dXJuOworfSAvLyB3bF9wcm9jZXNzX2Fzc29jX3N0YXR1cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUHJvY2VzcyB0aGUgc2VjdXJpdHkgc3RhdHVzIG1lc3NhZ2Ugc2lnbmFsZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCit7CisgICAgU0VDVVJJVFlfU1RBVFVTX1NUUkNUICpzZWNfc3RhdDsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIERCR19GVU5DKCAid2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMiICk7CisgICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKworICAgIGlmKCBscCAhPSBOVUxMICkgeworICAgICAgICBzZWNfc3RhdCA9IChTRUNVUklUWV9TVEFUVVNfU1RSQ1QgKikmbHAtPnNlY19zdGF0OworCisgICAgICAgIHdsX2VuZGlhbl90cmFuc2xhdGVfZXZlbnQoIChsdHZfdCAqKXNlY19zdGF0ICk7CisKKyAgICAgICAgc3dpdGNoKCBzZWNfc3RhdC0+c2VjdXJpdHlTdGF0dXMgKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IERpc3Nhc3NvY2lhdGUgW0FQXVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogRGVhdXRoZW50aWNhdGUgW0FQXVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogQXV0aGVudGljYXRlIEZhaWwgW1NUQV0gb3IgW0FQXVxuIiApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogTUlDIEZhaWxcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNlY3VyaXR5IFN0YXR1cyA6IEFzc29jaWF0ZSBGYWlsXG4iICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiU2VjdXJpdHkgU3RhdHVzIDogVU5LTk9XTiAoMHglMDR4KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY19zdGF0LT5zZWN1cml0eVN0YXR1cyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJTVEEgQWRkcmVzcyAgICAgOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBEYmdId0FkZHIoIHNlY19zdGF0LT5zdGFBZGRyICkpOworICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJSZWFzb24gICAgICAgICAgOiAweCUwNHggXG4iLCBzZWNfc3RhdC0+cmVhc29uICk7CisKKyAgICB9CisKKyAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKKyAgICByZXR1cm47Cit9IC8vIHdsX3Byb2Nlc3Nfc2VjdXJpdHlfc3RhdHVzCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgd2xfZ2V0X3RhbGxpZXMoc3RydWN0IHdsX3ByaXZhdGUgKmxwLAorCQkgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKnRhbGxpZXMpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHN0YXR1czsKKyAgICBDRkdfSEVSTUVTX1RBTExJRVNfU1RSQ1QgKnBUYWxsaWVzOworCisgICAgREJHX0ZVTkMoICJ3bF9nZXRfdGFsbGllcyIgKTsKKyAgICBEQkdfRU5URVIoRGJnSW5mbyk7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdGFsbGllcyBmcm9tIHRoZSBhZGFwdGVyICovCisgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgSENGX1RPVF9UQUxfQ05UICogc2l6ZW9mKGhjZl8xNik7CisgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfVEFMTElFUzsKKworICAgIHN0YXR1cyA9IGhjZl9nZXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmKGxwLT5sdHZSZWNvcmQpKTsKKworICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJcFRhbGxpZXMgPSAoQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUICopJihscC0+bHR2UmVjb3JkLnUudTMyKTsKKwltZW1jcHkodGFsbGllcywgcFRhbGxpZXMsIHNpemVvZigqdGFsbGllcykpOworICAgIAlEQkdfVFJBQ0UoIERiZ0luZm8sICJHZXQgdGFsbGllcyBva2F5LCBkaXhlOiAlZFxuIiwgc2l6ZW9mKCp0YWxsaWVzKSApOworICAgIH0gZWxzZSB7CisgICAgCURCR19UUkFDRSggRGJnSW5mbywgIkdldCB0YWxsaWVzIGZhaWxlZFxuIiApOworCXJldCA9IC1FRkFVTFQ7CisgICAgfQorCisgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfYXRvaSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEJlbGlldmUgaXQgb3Igbm90LCB3ZSBuZWVkIG91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgYXRvaSBpbiB0aGUga2VybmVsLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgc3RyaW5nICAtIHRoZSBBU0NJSSBzdHJpbmcgdG8gY29udmVydCB0byBhbiBpbnRlZ2VyCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICB1bnNpZ25lZCBpbnRlZ2VyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCB3bF9hdG9pKCBjaGFyICpzdHJpbmcgKQorewordW5zaWduZWQgaW50IGJhc2UgPSAxMDsJCQkJLy9kZWZhdWx0IHRvIGRlY2ltYWwKK3Vuc2lnbmVkIGludCB2YWx1ZSA9IDA7Cit1bnNpZ25lZCBpbnQgYzsKK2ludCBpID0gc3RybGVuKCBzdHJpbmcgKTsKKworCWlmICggaSA+IDIgJiYgc3RyaW5nWzBdID09ICcwJyAmJiAoIHN0cmluZ1sxXSB8ICgnWCdeJ3gnKSApID09ICd4JyApIHsKKwkJYmFzZSA9IDE2OworCQlzdHJpbmcgKz0yOworCX0KKwl3aGlsZSAoICggYyA9ICpzdHJpbmcrKyApICE9ICdcMCcgKSB7CisJCWlmICggdmFsdWUgPiBVSU5UX01BWCAvIGJhc2UgKSB7CS8vdGVzdCBmb3Igb3ZlcnJ1bgorCQkJREJHX0ZVTkMoICJ3bF9hdG9pIiApOwkvL2Rvbid0IG92ZXJsb2FkIHRoZSBsb2cgZmlsZSB3aXRoIGdvb2QgbWVzc2FnZXMKKwkJCURCR19FTlRFUiggRGJnSW5mbyApOworCQkJREJHX0VSUk9SKCBEYmdJbmZvLCAic3RyaW5nIFwiJXNcIiwgbGVuZ2h0IGV4Y2VlZHMgZXhwZWN0YXRpb25zXG4iLCBzdHJpbmcgKTsKKwkJCXByaW50ayggIjwxPnN0cmluZyBcIiVzXCIsIGxlbmdodCBleGNlZWRzIGV4cGVjdGF0aW9uc1xuIiwgc3RyaW5nICk7CisJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCWJyZWFrOworCQl9CisJCWMgLT0gJzAnOworCQlpZiAoIDAgPD0gYyAmJiBjIDw9IDkgKSB2YWx1ZSA9IGJhc2UgKiB2YWx1ZSArIGM7CisJCWVsc2UgaWYgKCBiYXNlID09IDE2ICkgeworCQkJYyArPSAnMCc7CisJCQljIHw9ICdBJ14nYSc7CisJCQljID0gYyAtICdhJysgMTA7CisJCQlpZiAoIDEwIDw9IGMgJiYgYyA8PSAxNSApIHZhbHVlID0gYmFzZSAqIHZhbHVlICsgYzsKKwkJfQorCX0KKwlyZXR1cm4gdmFsdWU7Cit9IC8vIHdsX2F0b2kKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2Q2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF91dGlsLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBIZWFkZXIgZGVzY3JpYmluZyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZAorICogICB0aHJvdWdob3V0IHRoZSBkcml2ZXIuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX1VUSUxfSF9fCisjZGVmaW5lIF9fV0xfVVRJTF9IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRibSggaW50IHZhbHVlICk7CisKK2ludCBpc192YWxpZF9rZXlfc3RyaW5nKCBjaGFyICpzICk7CisKK3ZvaWQga2V5X3N0cmluZzJrZXkoIGNoYXIgKmtzLCBLRVlfU1RSQ1QgKmtleSApOworCitpbnQgaGV4ZGlnaXQyaW50KCBjaGFyIGMgKTsKKwordm9pZCB3bF9oY2ZfZXJyb3IoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBoY2ZTdGF0dXMgKTsKKwordm9pZCB3bF9lbmRpYW5fdHJhbnNsYXRlX2V2ZW50KCBsdHZfdCAqcEx0diApOworCitpbnQgd2xfaGFzX3dlcCggSUZCUCBpZmJwICk7CisKKworI2lmIERCRworY29uc3QgY2hhciAqRGJnSHdBZGRyKCB1bnNpZ25lZCBjaGFyICpod0FkZHIgKTsKKyNlbmRpZiAvLyBEQkcKKworaGNmXzggICB3bF9wYXJzZV9kc19pZSggUFJPQkVfUkVTUCAqcHJvYmVfcnNwICk7CitoY2ZfOCAqIHdsX3BhcnNlX3dwYV9pZSggUFJPQkVfUkVTUCAqcHJvYmVfcnNwLCBoY2ZfMTYgKmxlbmd0aCApOworaGNmXzggKiB3bF9wcmludF93cGFfaWUoIGhjZl84ICpidWZmZXIsIGludCBsZW5ndGggKTsKKworaW50IHdsX2dldF90YWxsaWVzKHN0cnVjdCB3bF9wcml2YXRlICosIENGR19IRVJNRVNfVEFMTElFU19TVFJDVCAqKTsKK2ludCB3bF9pc19hX3ZhbGlkX2NoYW4oIGludCBjaGFubmVsICk7CitpbnQgd2xfaXNfYV92YWxpZF9mcmVxKCBsb25nIGZyZXF1ZW5jeSApOworbG9uZyB3bF9nZXRfZnJlcV9mcm9tX2NoYW4oIGludCBjaGFubmVsICk7CitpbnQgd2xfZ2V0X2NoYW5fZnJvbV9mcmVxKCBsb25nIGZyZXF1ZW5jeSApOworCit2b2lkIHdsX3Byb2Nlc3NfbGlua19zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOwordm9pZCB3bF9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfcHJvY2Vzc191cGRhdGVkX3JlY29yZCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7Cit2b2lkIHdsX3Byb2Nlc3NfYXNzb2Nfc3RhdHVzKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKK3ZvaWQgd2xfcHJvY2Vzc19zZWN1cml0eV9zdGF0dXMoIHN0cnVjdCB3bF9wcml2YXRlICpscCApOworCit1bnNpZ25lZCBpbnQgd2xfYXRvaSggY2hhciAqc3RyaW5nICk7CisKKyNlbmRpZiAgLy8gX19XTF9VVElMX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTYwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF92ZXJzaW9uLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgorICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBjb2RlIGJhc2UsIGFzIHdlbGwgYXMKKyAqICAgc3BlY2lhbCBkZWZpbml0aW9ucyBhbmQgbWFjcm9zIG5lZWRlZCBieSBjZXJ0YWluIHZlcnNpb25zIG9mIHRoZSBjb2RlLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKKyAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCisgKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKKyAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCisgKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19XTF9WRVJTSU9OX0hfXworI2RlZmluZSBfX1dMX1ZFUlNJT05fSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmbmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKKyNkZWZpbmUgX19OT19WRVJTSU9OX18KKyNlbmRpZiAgLy8gQ09ORklHX01PRFZFUlNJT05TCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVkVORE9SX05BTUUgICAgICAgICAiQWdlcmUgU3lzdGVtcywgaHR0cDovL3d3dy5hZ2VyZS5jb20iCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgICAgICAgICAid2xhZ3M0OSIKKyNkZWZpbmUgRFJWX0lERU5USVRZICAgICAgICA0OQorCisjZGVmaW5lIERSVl9NQUpPUl9WRVJTSU9OICAgNworI2RlZmluZSBEUlZfTUlOT1JfVkVSU0lPTiAgIDIyCisjZGVmaW5lIERSVl9WRVJTSU9OX1NUUiAgICAgIjcuMjIiCisKKworI2lmIGRlZmluZWQgQlVTX1BDTUNJQQorI2RlZmluZSBCVVNfVFlQRSAgICAgICAgICAgICJQQ01DSUEiCisjZWxpZiBkZWZpbmVkIEJVU19QQ0kKKyNkZWZpbmUgQlVTX1RZUEUgICAgICAgICAgICAiUENJIgorI2Vsc2UKK2VycjogZGVmaW5lIGJ1cyB0eXBlOworI2VuZGlmICAvLyBCVVNfWFhYCisKKyNpZiBkZWZpbmVkIEhFUk1FUzI1CisjZGVmaW5lIEhXX1RZUEUJCQkJIkhJSS41IgorI2Vsc2UKKyNkZWZpbmUgSFdfVFlQRQkJCQkiSElJIgorI2VuZGlmIC8vIEhFUk1FUzI1CisKKyNpZiBkZWZpbmVkIFdBUlAKKyNkZWZpbmUgRldfVFlQRQkJCQkiV0FSUCIKKyNlbHNlCisjZGVmaW5lIEZXX1RZUEUJCQkJIkJFQUdMRSIKKyNlbmRpZiAvLyBXQVJQCisKKyNpZiBkZWZpbmVkIEhFUk1FUzI1CisjaWYgZGVmaW5lZCBXQVJQCisjZGVmaW5lIERSVl9WQVJJQU5UICAgICAgICAgMworI2Vsc2UKKyNkZWZpbmUgRFJWX1ZBUklBTlQgICAgICAgICA0CisjZW5kaWYgLy8gV0FSUAorI2Vsc2UKKyNkZWZpbmUgRFJWX1ZBUklBTlQgICAgICAgICAyCisjZW5kaWYgLy8gSEVSTUVTMjUKKworI2lmZGVmIEJVU19QQ01DSUEKKyNpZiBkZWZpbmVkIEhFUk1FUzI1CisjZGVmaW5lIE1PRFVMRV9OQU1FICAgICAgICAgRFJJVkVSX05BTUUgIl9oMjVfY3MiCisjZWxzZQorI2RlZmluZSBNT0RVTEVfTkFNRSAgICAgICAgIERSSVZFUl9OQU1FICJfaDJfY3MiCisjZW5kaWYgIC8qIEhFUk1FUzI1ICovCisjZWxpZiBkZWZpbmVkIEJVU19QQ0kKKyNpZiBkZWZpbmVkIEhFUk1FUzI1CisjZGVmaW5lIE1PRFVMRV9OQU1FICAgICAgICAgRFJJVkVSX05BTUUgIl9oMjUiCisjZWxzZQorI2RlZmluZSBNT0RVTEVfTkFNRSAgICAgICAgIERSSVZFUl9OQU1FICJfaDIiCisjZW5kaWYgIC8qIEhFUk1FUzI1ICovCisjZW5kaWYgIC8qIEJVU19YWFggKi8KKworI2lmZGVmIERCRworI2RlZmluZSBNT0RVTEVfREFURSAgICAgICAgIF9fREFURV9fICIgIiBfX1RJTUVfXworI2Vsc2UKKyNkZWZpbmUgTU9EVUxFX0RBVEUgICAgICAgICAiMDcvMTgvMjAwNCAxMzozMDowMCIKKyNlbmRpZiAvLyBEQkcKKworLy8jZGVmaW5lIFNUUjIobSkgI20KKy8vI2RlZmluZSBTVFIxKG0pIFNUUjIobSkKKy8vI2RlZmluZSBNT0RVTEVfTkFNRQkJCVNUUjEoIE1PRF9OQU1FICkKKworI2RlZmluZSBWRVJTSU9OX0lORk8gICAgICAgIE1PRFVMRV9OQU1FICIgdiIgRFJWX1ZFUlNJT05fU1RSIFwKKwkJCQkJCQkiIGZvciAiIEJVU19UWVBFICIsICIgCQkJCQkJCQkJCQkgICAJIFwKKwkJCQkJCQlNT0RVTEVfREFURSAiIGJ5ICIgVkVORE9SX05BTUUKKworI2RlZmluZSBXSVJFTEVTU19TVVBQT1JUICAgIDE1ICAvLyBUaGUgdmVyc2lvbiBvZiB3aXJlbGVzcyBleHRlbnNpb25zIHdlIHN1cHBvcnQKKworLy8jZGVmaW5lIERCR19NT0RfTkFNRSAgICAgICAgIERSSVZFUl9OQU1FICI6IiBCVVNfVFlQRSAiOiIgSFdfVFlQRSAiOiIgRldfVFlQRQorI2RlZmluZSBEQkdfTU9EX05BTUUgICAgICAgIE1PRFVMRV9OQU1FCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGJ1cyBhcmNoaXRlY2h0dXJlIHNwZWNpZmljIGRlZmluZXMsIGluY2x1ZGVzLCBldGMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGRpZmZlcmVuY2UgZm9yIFBDTUNJQSBhbmQgUENJIGFueW1vcmUsIGF0IGxlYXN0CisgKiBmb3IgUENNQ0lBIHRoZSBzYW1lIGRlZmluZXMgYXJlIG5lZWRlZCBub3cgYXMgcHJldmlvdXNseSBvbmx5IHVzZWQgZm9yIFBDSQorICovCisjaWYgVVNFX1dFWFQKKyNkZWZpbmUgSEFTX1dJUkVMRVNTX0VYVEVOU0lPTlMKKyNlbmRpZiAgLy8gVVNFX1dFWFQKKworI2RlZmluZSBORVdfTVVMVElDQVNUCisjZGVmaW5lIEFMTE9DX1NLQihsZW4pICAgZGV2X2FsbG9jX3NrYihsZW4rMikKKyNkZWZpbmUgR0VUX1BBQ0tFVChkZXYsIHNrYiwgY291bnQpXAorICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoKHNrYiksIDIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19JTlBVVChza2JfcHV0KChza2IpLCAoY291bnQpKSwgKGNvdW50KSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChza2IpLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKChza2IpLCAoZGV2KSkKKyNkZWZpbmUgR0VUX1BBQ0tFVF9ETUEoZGV2LCBza2IsIGNvdW50KVwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYl9yZXNlcnZlKChza2IpLCAyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfSU5QVVRfRE1BKHNrYl9wdXQoKHNrYiksIChjb3VudCkpLCAoY291bnQpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHNrYiktPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoKHNrYiksIChkZXYpKQorCisKKworCisjZW5kaWYgIC8vIF9fV0xfVkVSU0lPTl9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDM0ZTAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jCkBAIC0wLDAgKzEsNDEzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHdsX3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8aGNmLmg+CisjaW5jbHVkZSA8aGNmZGVmLmg+CisKKyNpbmNsdWRlIDx3bF9pZi5oPgorI2luY2x1ZGUgPHdsX2ludGVybmFsLmg+CisjaW5jbHVkZSA8d2xfdXRpbC5oPgorI2luY2x1ZGUgPHdsX21haW4uaD4KKyNpbmNsdWRlIDx3bF93ZXh0Lmg+CisjaW5jbHVkZSA8d2xfcHJpdi5oPgorCisKKworLyogSWYgV0lSRUxFU1NfRVhUIGlzIG5vdCBkZWZpbmVkIChhcyBhIHJlc3VsdCBvZiBIQVNfV0lSRUxFU1NfRVhURU5TSU9OUworICAgI2luY2x1ZGluZyBsaW51eC93aXJlbGVzcy5oKSwgdGhlbiB0aGVzZSBmdW5jdGlvbnMgZG8gbm90IG5lZWQgdG8gYmUgaW5jbHVkZWQKKyAgIGluIHRoZSBidWlsZC4gKi8KKyNpZmRlZiBXSVJFTEVTU19FWFQKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbGVuKSBcCisgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoYnVmLCBlbmQsIGl3ZSwgbGVuKQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGVuZCwgaXdlLCBtc2cpIFwKKyAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChidWYsIGVuZCwgaXdlLCBtc2cpCisjZWxzZQorI2RlZmluZSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGVuZCwgaXdlLCBsZW4pIFwKKyAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBidWYsIGVuZCwgaXdlLCBsZW4pCisjZGVmaW5lIElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgZW5kLCBpd2UsIG1zZykgXAorICAgIGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGJ1ZiwgZW5kLCBpd2UsIG1zZykKKyNlbmRpZgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdsb2JhbCBkZWZpbml0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBEQkcKK2V4dGVybiBkYmdfaW5mb190ICpEYmdJbmZvOworI2VuZGlmICAvLyBEQkcKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2NvbW1pdCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIENvbW1pdAorICogIHByb3RvY29sIHVzZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKnJxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19jb21taXQiICk7CisJREJHX0VOVEVSKERiZ0luZm8pOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJd2xfYXBwbHkobHApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19jb21taXQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcHJvdG9jb2woKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm5zIGEgdmVuZG9yLWRlZmluZWQgc3RyaW5nIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSB3aXJlbGVzcworICogIHByb3RvY29sIHVzZWQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIE4vQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9wcm90b2NvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpuYW1lLCBjaGFyICpleHRyYSkKK3sKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9wcm90b2NvbCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCS8qIE9yaWdpbmFsbHksIHRoZSBkcml2ZXIgd2FzIHBsYWNpbmcgdGhlIHN0cmluZyAiV2lyZWxlc3MiIGhlcmUuIEhvd2V2ZXIsCisJICAgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKC9saW51eC93aXJlbGVzcy5oKSBpbmRpY2F0ZSB0aGlzIHN0cmluZyBzaG91bGQKKwkgICBkZXNjcmliZSB0aGUgd2lyZWxlc3MgcHJvdG9jb2wuICovCisKKwlzdHJjcHkobmFtZSwgIklFRUUgODAyLjExYiIpOworCisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybiAwOworfSAvLyB3aXJlbGVzc19nZXRfcHJvdG9jb2wKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfZnJlcXVlbmN5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0cyB0aGUgZnJlcXVlbmN5IChjaGFubmVsKSBvbiB3aGljaCB0aGUgY2FyZCBzaG91bGQgVHgvUnguCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfZnJlcXVlbmN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY2hhbm5lbCA9IDA7CisJaW50IHJldCAgICAgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfZnJlcXVlbmN5IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYoICFjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKworCS8qIElmIGZyZXF1ZW5jeSBzcGVjaWZpZWQsIGxvb2sgdXAgY2hhbm5lbCAqLworCWlmKCBmcmVxLT5lID09IDEgKSB7CisJCWludCBmID0gZnJlcS0+bSAvIDEwMDAwMDsKKwkJY2hhbm5lbCA9IHdsX2dldF9jaGFuX2Zyb21fZnJlcSggZiApOworCX0KKworCisJLyogQ2hhbm5lbCBzcGVjaWZpZWQgKi8KKwlpZiggZnJlcS0+ZSA9PSAwICkgeworCQljaGFubmVsID0gZnJlcS0+bTsKKwl9CisKKworCS8qIElmIHRoZSBjaGFubmVsIGlzIGFuIDgwMi4xMWEgY2hhbm5lbCwgc2V0IEJpdCA4ICovCisJaWYoIGNoYW5uZWwgPiAxNCApIHsKKwkJY2hhbm5lbCA9IGNoYW5uZWwgfCAweDEwMDsKKwl9CisKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCWxwLT5DaGFubmVsID0gY2hhbm5lbDsKKworCisJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl3bF9hcHBseSggbHAgKTsKKworCS8qIFNlbmQgYW4gZXZlbnQgdGhhdCBjaGFubmVsL2ZyZXEgaGFzIGJlZW4gc2V0ICovCisJd2xfd2V4dF9ldmVudF9mcmVxKCBscC0+ZGV2ICk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9mcmVxdWVuY3kKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfZnJlcXVlbmN5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0cyB0aGUgZnJlcXVlbmN5IChjaGFubmVsKSBvbiB3aGljaCB0aGUgY2FyZCBpcyBUeC9SeC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gLTE7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9mcmVxdWVuY3kiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlscC0+bHR2UmVjb3JkLmxlbiA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX0NIQU5ORUw7CisKKwlyZXQgPSBoY2ZfZ2V0X2luZm8oICYobHAtPmhjZkN0eCksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYoIHJldCA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJaGNmXzE2IGNoYW5uZWwgPSBDTlZfTElUVExFX1RPX0lOVCggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOworCisjaWZkZWYgVVNFX0ZSRVFVRU5DWQorCisJCWZyZXEtPm0gPSB3bF9nZXRfZnJlcV9mcm9tX2NoYW4oIGNoYW5uZWwgKSAqIDEwMDAwMDsKKwkJZnJlcS0+ZSA9IDE7CisjZWxzZQorCisJCWZyZXEtPm0gPSBjaGFubmVsOworCQlmcmVxLT5lID0gMDsKKworI2VuZGlmIC8qIFVTRV9GUkVRVUVOQ1kgKi8KKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworCXJldCA9IChyZXQgPT0gSENGX1NVQ0NFU1MgPyAwIDogLUVGQVVMVCk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfZnJlcXVlbmN5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3JhbmdlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgbWlzYyBpbmZvIGFuZCBzdGF0aXN0aWNzIGFib3V0IHRoZQorICogIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nICAgICAgZmxhZ3M7CisJc3RydWN0IGl3X3JhbmdlICAgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwlpbnQgICAgICAgICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CisJaW50ICAgICAgICAgICAgICAgIGNvdW50OworCV9fdTE2ICAgICAgICAgICAgICpwVHhSYXRlOworCWludCAgICAgICAgICAgICAgICByZXRyaWVzID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3JhbmdlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJLyogU2V0IHJhbmdlIGluZm9ybWF0aW9uICovCisJZGF0YS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBTZXQgcmFuZ2UgaW5mb3JtYXRpb24gKi8KKwltZW1zZXQoIHJhbmdlLCAwLCBzaXplb2YoIHN0cnVjdCBpd19yYW5nZSApKTsKKworcmV0cnk6CisJLyogR2V0IHRoZSBjdXJyZW50IHRyYW5zbWl0IHJhdGUgZnJvbSB0aGUgYWRhcHRlciAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMSArIChzaXplb2YoKnBUeFJhdGUpIC8gc2l6ZW9mKGhjZl8xNikpOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9UWF9SQVRFOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYoIHN0YXR1cyAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJLyogUmVjb3ZlcnkgYWN0aW9uOiByZXNldCBhbmQgcmV0cnkgdXAgdG8gMTAgdGltZXMgKi8KKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiR2V0IENGR19DVVJfVFhfUkFURSBmYWlsZWQ6IDB4JXhcbiIsIHN0YXR1cyApOworCisJCWlmIChyZXRyaWVzIDwgMTApIHsKKwkJCXJldHJpZXMrKzsKKworCQkJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwkJCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKwkJCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCQkJc3RhdHVzID0gd2xfcmVzZXQoIGRldiApOworCQkJaWYgKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAicmVzZXQgZmFpbGVkOiAweCV4XG4iLCBzdGF0dXMgKTsKKworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCisJCQkvKiBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcyAqLworCQkJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCQkJd2xfbG9jayggbHAsICZmbGFncyApOworCisJCQlnb3RvIHJldHJ5OworCisJCX0gZWxzZSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJHZXQgQ0ZHX0NVUl9UWF9SQVRFIGZhaWxlZDogJWQgcmV0cmllc1xuIiwgcmV0cmllcyApOworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0KKworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCXBUeFJhdGUgPSAoX191MTYgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwlyYW5nZS0+dGhyb3VnaHB1dCA9IENOVl9MSVRUTEVfVE9fSU5UKCAqcFR4UmF0ZSApICogTUVHQUJJVDsKKworCWlmIChyZXRyaWVzID4gMCkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJHZXQgQ0ZHX0NVUl9UWF9SQVRFIHN1Y2NlczogJWQgcmV0cmllc1xuIiwgcmV0cmllcyApOworCX0KKworCS8vIE5XSUQgLSBOT1QgU1VQUE9SVEVECisKKworCS8qIENoYW5uZWwvRnJlcXVlbmN5IEluZm8gKi8KKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gUkFESU9fQ0hBTk5FTFM7CisKKworCS8qIFNpZ25hbCBMZXZlbCBUaHJlc2hvbGRzICovCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gUkFESU9fU0VOU0lUSVZJVFlfTEVWRUxTOworCisKKwkvKiBMaW5rIHF1YWxpdHkgKi8KKyNpZmRlZiBVU0VfREJNCisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCAgICAgPSAodV9jaGFyKUhDRl9NQVhfQ09NTV9RVUFMSVRZOworCisJLyogSWYgdGhlIHZhbHVlIHJldHVybmVkIGluIC9wcm9jL25ldC93aXJlbGVzcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmFuZ2UsCisJICAgaXdjb25maWcgYXNzdW1lcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbiBkQm0uIEJlY2F1c2UgYW4gdW5zaWduZWQgY2hhciBpcyB1c2VkLAorCSAgIGl0IHJlcXVpcmVzIGEgYml0IG9mIGNvbnRvcnNpb24uLi4gKi8KKworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCAgID0gKHVfY2hhcikoIGRibSggSENGX01JTl9TSUdOQUxfTEVWRUwgKSAtIDEgKTsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgICA9ICh1X2NoYXIpKCBkYm0oIEhDRl9NSU5fTk9JU0VfTEVWRUwgKSAtIDEgKTsKKyNlbHNlCisKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCAgICA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgICA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgICA9IDEwMDsKKworI2VuZGlmIC8qIFVTRV9EQk0gKi8KKworCisJLyogU2V0IGF2YWlsYWJsZSByYXRlcyAqLworCXJhbmdlLT5udW1fYml0cmF0ZXMgPSAwOworCisJbHAtPmx0dlJlY29yZC5sZW4gPSA2OworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTUFYX1JBVEVTOyBjb3VudCsrICkKKwkJCWlmKCBscC0+bHR2UmVjb3JkLnUudThbY291bnQrMl0gIT0gMCApIHsKKwkJCQlyYW5nZS0+Yml0cmF0ZVtjb3VudF0gPSBscC0+bHR2UmVjb3JkLnUudThbY291bnQrMl0gKiBNRUdBQklUIC8gMjsKKwkJCQlyYW5nZS0+bnVtX2JpdHJhdGVzKys7CisJCQl9CisJfSBlbHNlIHsKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NVUFBPUlRFRF9EQVRBX1JBVEVTOiAweCV4XG4iLCBzdGF0dXMgKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIFJUUyBUaHJlc2hvbGQgaW5mbyAqLworCXJhbmdlLT5taW5fcnRzICAgPSBNSU5fUlRTX0JZVEVTOworCXJhbmdlLT5tYXhfcnRzICAgPSBNQVhfUlRTX0JZVEVTOworCisJLy8gRnJhZyBUaHJlc2hvbGQgaW5mbyAtIE5PVCBTVVBQT1JURUQKKworCS8vIFBvd2VyIE1hbmFnZW1lbnQgaW5mbyAtIE5PVCBTVVBQT1JURUQKKworCS8qIEVuY3J5cHRpb24gKi8KKworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKworCS8qIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzICovCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCS8qIElzIFdFUCBzdXBwb3J0ZWQ/ICovCisKKwlpZiggd2xfaGFzX3dlcCggJiggbHAtPmhjZkN0eCApKSkgeworCQkvKiBXRVA6IFJDNCA0MCBiaXRzICovCisJCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdICAgICAgPSBNSU5fS0VZX1NJWkU7CisKKwkJLyogUkM0IH4xMjggYml0cyAqLworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSAgICAgID0gTUFYX0tFWV9TSVpFOworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzICAgID0gMjsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgICA9IE1BWF9LRVlTOworCX0KKworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCS8qIFR4IFBvd2VyIEluZm8gKi8KKwlyYW5nZS0+dHhwb3dlcl9jYXBhICA9IElXX1RYUE9XX01XQVRUOworCXJhbmdlLT5udW1fdHhwb3dlciAgID0gMTsKKwlyYW5nZS0+dHhwb3dlclswXSAgICA9IFJBRElPX1RYX1BPV0VSX01XQVRUOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKworCS8qIFdpcmVsZXNzIEV4dGVuc2lvbiBJbmZvICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgICA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgICAgID0gV0lSRUxFU1NfU1VQUE9SVDsKKworCS8vIFJldHJ5IExpbWl0cyBhbmQgTGlmZXRpbWUgLSBOT1QgU1VQUE9SVEVECisKKyNlbmRpZgorCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxMQorCisJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiY2FsbGluZyB3bF93aXJlbGVzc19zdGF0c1xuIiApOworCXdsX3dpcmVsZXNzX3N0YXRzKCBscC0+ZGV2ICk7CisJcmFuZ2UtPmF2Z19xdWFsID0gbHAtPndzdGF0cy5xdWFsOworCURCR19UUkFDRSggRGJnSW5mbywgIndsX3dpcmVsZXNzX3N0YXRzIGRvbmVcbiIgKTsKKworI2VuZGlmCisKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXQVApIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soU0lPQ0dJV1NDQU4pKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCXJhbmdlLT5ldmVudF9jYXBhWzRdID0gKElXX0VWRU5UX0NBUEFfTUFTSyhJV0VWUkVHSVNURVJFRCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhJV0VWQ1VTVE9NKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZFWFBJUkVEKSk7CisKKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUDsKKworb3V0X3VubG9jazoKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworCURCR19MRUFWRShEYmdJbmZvKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfcmFuZ2UKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9ic3NpZCgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldHMgdGhlIEJTU0lEIHRoZSB3aXJlbGVzcyBkZXZpY2UgaXMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9ic3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3Qgc29ja2FkZHIgKmFwX2FkZHIsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisJaW50IHN0YXR1cyA9IC0xOworI2VuZGlmIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEgKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2Jzc2lkIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbWVtc2V0KCAmYXBfYWRkci0+c2FfZGF0YSwgMCwgRVRIX0FMRU4gKTsKKworCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCS8qIEFzc3VtZSBBUCBtb2RlIGhlcmUsIHdoaWNoIG1lYW5zIHRoZSBCU1NJRCBpcyBvdXIgb3duIE1BQyBhZGRyZXNzLiBJbgorCSAgIFNUQSBtb2RlLCB0aGlzIGFkZHJlc3Mgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBhY3R1YWwgQlNTSUQgdXNpbmcKKwkgICB0aGUgY29kZSBiZWxvdy4gKi8KKwltZW1jcHkoJmFwX2FkZHItPnNhX2RhdGEsIGxwLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisJCQkJCS8vOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlCisKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisJCS8qIEdldCBDdXJyZW50IEJTU0lEICovCisJCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NVUl9CU1NJRDsKKwkJbHAtPmx0dlJlY29yZC5sZW4gPSA0OworCQlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJLyogQ29weSBpbmZvIGludG8gc29ja2FkZHIgc3RydWN0ICovCisJCQltZW1jcHkoJmFwX2FkZHItPnNhX2RhdGEsIGxwLT5sdHZSZWNvcmQudS51OCwgRVRIX0FMRU4pOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCX0KKworI2VuZGlmIC8vIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9TVEEKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9ic3NpZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9hcF9saXN0KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0cyB0aGUgcmVzdWx0cyBvZiBhIG5ldHdvcmsgc2Nhbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqICBOT1RFOiBTSU9DR0lXQVBMSVNUIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYnkgU0lPQ1NJV1NDQU4uIFRoaXMgZnVuY3Rpb24KKyAqICAgICAgIGltcGxlbWVudHMgU0lPQ0dJV0FQTElTVCBvbmx5IHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEZvcgorICogICAgICAgYWxsIHN5c3RlbXMgdXNpbmcgV0lSRUxFU1NfRVhUIHYxNCBhbmQgaGlnaGVyLCB1c2UgU0lPQ1NJV1NDQU4hCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2FwX2xpc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcJICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgICAgIHJldDsKKwlpbnQgICAgICAgICAgICAgICAgIG51bV9hcHMgPSAtMTsKKwlpbnQgICAgICAgICAgICAgICAgIHNlY19jb3VudCA9IDA7CisJaGNmXzMyICAgICAgICAgICAgICBjb3VudDsKKwlzdHJ1Y3Qgc29ja2FkZHIgICAgICpod2EgPSBOVUxMOworCXN0cnVjdCBpd19xdWFsaXR5ICAgKnF1YWwgPSBOVUxMOworI2lmZGVmIFdBUlAKKwlTY2FuUmVzdWx0CQkJKnAgPSAmbHAtPnNjYW5fcmVzdWx0czsKKyNlbHNlCisJUHJvYmVSZXN1bHQgICAgICAgICAqcCA9ICZscC0+cHJvYmVfcmVzdWx0czsKKyNlbmRpZiAgLy8gV0FSUAorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2FwX2xpc3QiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBTZXQgdGhlIGNvbXBsZXRpb24gc3RhdGUgdG8gRkFMU0UgKi8KKwlscC0+c2Nhbl9yZXN1bHRzLnNjYW5fY29tcGxldGUgPSBGQUxTRTsKKwlscC0+cHJvYmVfcmVzdWx0cy5zY2FuX2NvbXBsZXRlID0gRkFMU0U7CisJLyogQ2hhbm5lbHMgdG8gc2NhbiAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TQ0FOX0NIQU5ORUxTXzJHSFo7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHg3RkZGICk7CisJcmV0ID0gaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NDQU5fQ0hBTk5FTFNfMkdIWiByZXN1bHQ6IDB4JXhcbiIsIHJldCApOworCisJLyogU2V0IHRoZSBTQ0FOX1NTSUQgdG8gIkFOWSIuIFVzaW5nIHRoaXMgUklEIGZvciBzY2FuIHByZXZlbnRzIHRoZSBuZWVkIHRvCisJICAgZGlzYXNzb2NpYXRlIGZyb20gdGhlIG5ldHdvcmsgd2UgYXJlIGN1cnJlbnRseSBvbiAqLworCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TQ0FOX1NTSUQ7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCXJldCA9IGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TQ0FOX1NTSUQgdG8gJ2FueScgcmV0OiAweCV4XG4iLCByZXQgKTsKKworCS8qIEluaXRpYXRlIHRoZSBzY2FuICovCisjaWZkZWYgV0FSUAorCXJldCA9IGhjZl9hY3Rpb24oICYoIGxwLT5oY2ZDdHggKSwgTUREX0FDVF9TQ0FOICk7CisjZWxzZQorCXJldCA9IGhjZl9hY3Rpb24oICYoIGxwLT5oY2ZDdHggKSwgSENGX0FDVF9BQ1NfU0NBTiApOworI2VuZGlmICAvLyBXQVJQCisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCS8vOz8gdW5sb2NrPyB3aGF0IGFib3V0IHRoZSBhY2Nlc3MgdG8gbHAgYmVsb3c/IGlzIGl0IGJyb2tlbj8KKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKKwlpZiggcmV0ID09IEhDRl9TVUNDRVNTICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTVUNDRVNTRlVMTFkgSU5JVElBVEVEIFNDQU4uLi5cbiIgKTsKKwkJd2hpbGUoICgqcCkuc2Nhbl9jb21wbGV0ZSA9PSBGQUxTRSAmJiByZXQgPT0gSENGX1NVQ0NFU1MgKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJXYWl0aW5nIGZvciBzY2FuIHJlc3VsdHMuLi5cbiIgKTsKKwkJCS8qIEFib3J0IHRoZSBzY2FuIGlmIHdlJ3ZlIHdhaXRlZCBmb3IgbW9yZSB0aGFuIE1BWF9TQ0FOX1RJTUVfU0VDICovCisJCQlpZiggc2VjX2NvdW50KysgPiBNQVhfU0NBTl9USU1FX1NFQyApIHsKKwkJCQlyZXQgPSAtRUlPOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXYWl0IGZvciAxIHNlYyBpbiAxMG1zIGludGVydmFscywgc2NoZWR1bGluZyB0aGUga2VybmVsIHRvIGRvCisJCQkJICAgb3RoZXIgdGhpbmdzIGluIHRoZSBtZWFudGltZSwgVGhpcyBwcmV2ZW50cyBzeXN0ZW0gbG9ja3VwcyBieQorCQkJCSAgIGdpdmluZyBzb21lIHRpbWUgYmFjayB0byB0aGUga2VybmVsICovCisJCQkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCArKyApIHsKKwkJCQkJbWRlbGF5KCAxMCApOworCQkJCQlzY2hlZHVsZSggKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlybWIoKTsKKworCQlpZiAoIHJldCAhPSBIQ0ZfU1VDQ0VTUyApIHsKKwkJCURCR19FUlJPUiggRGJnSW5mbywgInRpbWVvdXQgd2FpdGluZyBmb3Igc2NhbiByZXN1bHRzXG4iICk7CisJCX0gZWxzZSB7CisJCQludW1fYXBzICAgICAgICAgICAgID0gKCpwKS8qbHAtPnByb2JlX3Jlc3VsdHMqLy5udW1fYXBzOworCQkJaWYgKG51bV9hcHMgPiBJV19NQVhfQVApIHsKKwkJCQludW1fYXBzID0gSVdfTUFYX0FQOworCQkJfQorCQkJZGF0YS0+bGVuZ3RoID0gbnVtX2FwczsKKwkJCWh3YSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilleHRyYTsKKwkJCXF1YWwgPSAoc3RydWN0IGl3X3F1YWxpdHkgKikgZXh0cmEgKworCQkJCQkoIHNpemVvZiggc3RydWN0IHNvY2thZGRyICkgKiBudW1fYXBzICk7CisKKwkJCS8qIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHRlbGwgdGhlIHVzZXIgaWYgd2UgcHJvdmlkZSBxdWFsaXR5CisJCQkgICBpbmZvcm1hdGlvbi4gU2luY2Ugd2UgcHJvdmlkZSBzaWduYWwvbm9pc2UgbGV2ZWxzIGJ1dCBubworCQkJICAgcXVhbGl0eSBpbmZvIG9uIGEgc2NhbiwgdGhpcyBpcyBzZXQgdG8gMC4gU2V0dGluZyB0byAxIGFuZAorCQkJICAgcHJvdmlkaW5nIGEgcXVhbGl0eSBvZiAwIHByb2R1Y2VzIHdlaXJkIHJlc3VsdHMuIElmIHdlIGV2ZXIKKwkJCSAgIHByb3ZpZGUgcXVhbGl0eSAob3IgY2FuIGNhbGN1bGF0ZSBpdCksIHRoaXMgY2FuIGJlIGNoYW5nZWQgKi8KKwkJCWRhdGEtPmZsYWdzID0gMDsKKworCQkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgbnVtX2FwczsgY291bnQrKyApIHsKKyNpZmRlZiBXQVJQCisJCQkJbWVtY3B5KCBod2FbY291bnRdLnNhX2RhdGEsCisJCQkJCQkoKnApLypscC0+c2Nhbl9yZXN1bHRzKi8uQVBUYWJsZVtjb3VudF0uYnNzaWQsIEVUSF9BTEVOICk7CisjZWxzZSAgLy87P3doeSB1c2UgQlNTSUQgYW5kIGJzc2lkIGFzIG5hbWVzIGluIHNlZW1pbmdseSB2ZXJ5IGNvbXBhcmFibGUgc2l0dWF0aW9ucworCQkJCURCR19QUklOVCggIkJTU0lEOiAlc1xuIiwgRGJnSHdBZGRyKCAoKnApLypscC0+cHJvYmVfcmVzdWx0cyovLlByb2JlVGFibGVbY291bnRdLkJTU0lEICkpOworCQkJCW1lbWNweSggaHdhW2NvdW50XS5zYV9kYXRhLAorCQkJCQkJKCpwKS8qbHAtPnByb2JlX3Jlc3VsdHMqLy5Qcm9iZVRhYmxlW2NvdW50XS5CU1NJRCwgRVRIX0FMRU4gKTsKKyNlbmRpZiAvLyBXQVJQCisJCQl9CisJCQkvKiBPbmNlIHRoZSBkYXRhIGlzIGNvcGllZCB0byB0aGUgd2lyZWxlc3Mgc3RydWN0LCBpbnZhbGlkYXRlIHRoZQorCQkJICAgc2NhbiByZXN1bHQgdG8gaW5pdGlhdGUgYSByZXNjYW4gb24gdGhlIG5leHQgcmVxdWVzdCAqLworCQkJKCpwKS8qbHAtPnByb2JlX3Jlc3VsdHMqLy5zY2FuX2NvbXBsZXRlID0gRkFMU0U7CisJCQkvKiBTZW5kIHRoZSB3aXJlbGVzcyBldmVudCB0aGF0IHRoZSBzY2FuIGhhcyBjb21wbGV0ZWQsIGp1c3QgaW4gY2FzZQorCQkJICAgaXQncyBuZWVkZWQgKi8KKwkJCXdsX3dleHRfZXZlbnRfc2Nhbl9jb21wbGV0ZSggbHAtPmRldiApOworCQl9CisJfQorb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9hcF9saXN0CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X3NlbnNpdGl2aXR5KCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0cyB0aGUgc2Vuc2l0aXZpdHkgKGRpc3RhbmNlIGJldHdlZW4gQVBzKSBvZiB0aGUgd2lyZWxlc3MgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9zZW5zaXRpdml0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnNlbnMsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCWludCBkZW5zID0gc2Vucy0+dmFsdWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9zZW5zaXRpdml0eSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmKCggZGVucyA8IDEgKSB8fCAoIGRlbnMgPiAzICkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbHAtPkRpc3RhbmNlQmV0d2VlbkFQcyA9IGRlbnM7CisJd2xfYXBwbHkoIGxwICk7CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9zZW5zaXRpdml0eQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9zZW5zaXRpdml0eSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEdldHMgdGhlIHNlbnNpdGl2aXR5IChkaXN0YW5jZSBiZXR3ZWVuIEFQcykgb2YgdGhlIHdpcmVsZXNzIGNhcmQuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfc2Vuc2l0aXZpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpzZW5zLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfc2Vuc2l0aXZpdHkiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBub3Qgd29ydGggbG9ja2luZyAuLi4gKi8KKwlzZW5zLT52YWx1ZSA9IGxwLT5EaXN0YW5jZUJldHdlZW5BUHM7CisJc2Vucy0+Zml4ZWQgPSAwOwkvKiBhdXRvICovCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3NlbnNpdGl2aXR5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X2Vzc2lkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0cyB0aGUgRVNTSUQgKG5ldHdvcmsgbmFtZSkgdGhhdCB0aGUgd2lyZWxlc3MgZGV2aWNlIHNob3VsZCBhc3NvY2lhdGUKKyAqICB3aXRoLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqc3NpZCkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X2Vzc2lkIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRhdGEtPmZsYWdzICE9IDAgJiYgZGF0YS0+bGVuZ3RoID4gSENGX01BWF9OQU1FX0xFTiArIDEpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJbWVtc2V0KCBscC0+TmV0d29ya05hbWUsIDAsIHNpemVvZiggbHAtPk5ldHdvcmtOYW1lICkpOworCisJLyogZGF0YS0+ZmxhZ3MgaXMgemVybyB0byBhc2sgZm9yICJhbnkiICovCisJaWYoIGRhdGEtPmZsYWdzID09IDAgKSB7CisJCS8qIE5lZWQgdGhpcyBiZWNhdXNlIGluIFNUQVAgYnVpbGQgUEFSTV9ERUZBVUxUX1NTSUQgaXMgIkxpbnV4QVAiCisJCSAqIDs/YnV0IHRoZXJlIGFpbid0IG5vIFNUQVAgYW55bW9yZSovCisJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfU1RBICApIHsKKwkJCXN0cmNweSggbHAtPk5ldHdvcmtOYW1lLCAiQU5ZIiApOworCQl9IGVsc2UgeworCQkJLy9zdHJjcHkoIGxwLT5OZXR3b3JrTmFtZSwgIkFOWSIgKTsKKwkJCXN0cmNweSggbHAtPk5ldHdvcmtOYW1lLCBQQVJNX0RFRkFVTFRfU1NJRCApOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5KCBscC0+TmV0d29ya05hbWUsIHNzaWQsIGRhdGEtPmxlbmd0aCApOworCX0KKworCURCR19OT1RJQ0UoIERiZ0luZm8sICJzZXQgTmV0d29ya05hbWU6ICVzXG4iLCBzc2lkICk7CisKKwkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCXdsX2FwcGx5KCBscCApOworCisJLyogU2VuZCBhbiBldmVudCB0aGF0IEVTU0lEIGhhcyBiZWVuIHNldCAqLworCXdsX3dleHRfZXZlbnRfZXNzaWQoIGxwLT5kZXYgKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X2Vzc2lkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X2Vzc2lkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0cyB0aGUgRVNTSUQgKG5ldHdvcmsgbmFtZSkgdGhhdCB0aGUgd2lyZWxlc3MgZGV2aWNlIGlzIGFzc29jaWF0ZWQKKyAqICB3aXRoLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXNzaWQpCisKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgICAgICByZXQgPSAwOworCWludCAgICAgICAgIHN0YXR1cyA9IC0xOworCXd2TmFtZV90ICAgICpwTmFtZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2Vzc2lkIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogR2V0IHRoZSBkZXNpcmVkIG5ldHdvcmsgbmFtZSAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcE5hbWUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworCisKKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorCQkJCQkvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQorCisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfREVTSVJFRF9TU0lEOworCisjZW5kaWYKKworCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKworCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DTkZfT1dOX1NTSUQ7CisJfQorCisjZW5kaWYgLy8gSENGX0FQCisKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCXBOYW1lID0gKHd2TmFtZV90ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJCS8qIEVuZGlhbiB0cmFuc2xhdGUgdGhlIHN0cmluZyBsZW5ndGggKi8KKwkJcE5hbWUtPmxlbmd0aCA9IENOVl9MSVRUTEVfVE9fSU5UKCBwTmFtZS0+bGVuZ3RoICk7CisKKwkJLyogQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIgKi8KKwkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aDsKKworCQkvKiBOT1RFOiBOdWxsIHRlcm1pbmF0aW5nIGlzIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGRpc3BsYXkgb2YgdGhlIFNTSUQgaW4KKwkJICAgdGhlIHdpcmVsZXNzIHRvb2xzICovCisJCWRhdGEtPmxlbmd0aCA9IHBOYW1lLT5sZW5ndGggKyAxOworCQlpZiggcE5hbWUtPmxlbmd0aCA8IEhDRl9NQVhfTkFNRV9MRU4gKSB7CisJCQlwTmFtZS0+bmFtZVtwTmFtZS0+bGVuZ3RoXSA9ICdcMCc7CisJCX0KKworCQlkYXRhLT5mbGFncyA9IDE7CisKKworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisJCQkJCS8vOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlCisjaWZkZWYgUkVUVVJOX0NVUlJFTlRfTkVUV09SS05BTUUKKworCQkvKiBpZiBkZXNpcmVkIGlzIG51bGwgKCJhbnkiKSwgcmV0dXJuIGN1cnJlbnQgb3IgImFueSIgKi8KKwkJaWYoIHBOYW1lLT5uYW1lWzBdID09ICdcMCcgKSB7CisJCQkvKiBHZXQgdGhlIGN1cnJlbnQgbmV0d29yayBuYW1lICovCisJCQlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZigqcE5hbWUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworCQkJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX1NTSUQ7CisKKwkJCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJCQlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJCXBOYW1lID0gKHd2TmFtZV90ICopJiggbHAtPmx0dlJlY29yZC51LnUzMiApOworCisJCQkJLyogRW5kaWFuIHRyYW5zbGF0ZSB0aGUgc3RyaW5nIGxlbmd0aCAqLworCQkJCXBOYW1lLT5sZW5ndGggPSBDTlZfTElUVExFX1RPX0lOVCggcE5hbWUtPmxlbmd0aCApOworCisJCQkJLyogQ29weSB0aGUgaW5mb3JtYXRpb24gaW50byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCQlkYXRhLT5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoICsgMTsKKwkJCQlpZiggcE5hbWUtPmxlbmd0aCA8IEhDRl9NQVhfTkFNRV9MRU4gKSB7CisJCQkJCXBOYW1lLT5uYW1lW3BOYW1lLT5sZW5ndGhdID0gJ1wwJzsKKwkJCQl9CisKKwkJCQlkYXRhLT5mbGFncyA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisKKyNlbmRpZiAvLyBSRVRVUk5fQ1VSUkVOVF9ORVRXT1JLTkFNRQorI2VuZGlmIC8vIEhDRl9TVEEKKworCQlkYXRhLT5sZW5ndGgtLTsKKworCQlpZiAocE5hbWUtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJbWVtY3B5KGVzc2lkLCBwTmFtZS0+bmFtZSwgcE5hbWUtPmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworb3V0X3VubG9jazoKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9lc3NpZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9lbmNvZGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIFNldHMgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgc3RhdHVzIChlbmFibGUgb3IgZGlzYWJsZSkuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXlidWYpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICByZXQgPSAwOworCisjaWYgMSAvLzs/ICNpZiBXSVJFTEVTU19FWFQgPiA4IC0gdXNlZCB1bmNvbmRpdGlvbmFsbHkgaW4gdGhlIHJlc3Qgb2YgdGhlIGNvZGUuLi4KKwloY2ZfOCAgIGVuY3J5cHRpb25fc3RhdGU7CisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID4gOAorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfZW5jb2RlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogSXMgZW5jcnlwdGlvbiBzdXBwb3J0ZWQ/ICovCisJaWYoICF3bF9oYXNfd2VwKCAmKCBscC0+aGNmQ3R4ICkpKSB7CisJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiV0VQIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2VcbiIgKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlEQkdfTk9USUNFKCBEYmdJbmZvLCAicG9pbnRlcjogJXAsIGxlbmd0aDogJWQsIGZsYWdzOiAlI3hcbiIsCisJCQkJa2V5YnVmLCBlcnEtPmxlbmd0aCwKKwkJCQllcnEtPmZsYWdzKTsKKworCS8qIFNhdmUgc3RhdGUgb2YgRW5jcnlwdGlvbiBzd2l0Y2ggKi8KKwllbmNyeXB0aW9uX3N0YXRlID0gbHAtPkVuYWJsZUVuY3J5cHRpb247CisKKwkvKiBCYXNpYyBjaGVja2luZzogZG8gd2UgaGF2ZSBhIGtleSB0byBzZXQ/ICovCisJaWYoKGVycS0+bGVuZ3RoKSAhPSAwKSB7CisJCWludCBpbmRleCAgID0gKCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYICkgLSAxOworCQlpbnQgdGsgICAgICA9IGxwLT5UcmFuc21pdEtleUlEIC0gMTsJCS8vIGN1cnJlbnQga2V5CisKKworCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUga2V5ICovCisJCXN3aXRjaChlcnEtPmxlbmd0aCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKworCQljYXNlIE1JTl9LRVlfU0laRToKKwkJY2FzZSBNQVhfS0VZX1NJWkU6CisKKwkJCS8qIENoZWNrIHRoZSBpbmRleCAqLworCQkJaWYoKCBpbmRleCA8IDAgKSB8fCAoIGluZGV4ID49IE1BWF9LRVlTICkpIHsKKwkJCQlpbmRleCA9IHRrOworCQkJfQorCisJCQkvKiBDbGVhbnVwICovCisJCQltZW1zZXQoIGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmtleSwgMCwgTUFYX0tFWV9TSVpFICk7CisKKwkJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCQltZW1jcHkoIGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmtleSwga2V5YnVmLCBlcnEtPmxlbmd0aCk7CisKKwkJCS8qIFNldCB0aGUgbGVuZ3RoICovCisJCQlscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW4gPSBlcnEtPmxlbmd0aDsKKworCQkJREJHX05PVElDRSggRGJnSW5mbywgImVuY29kaW5nLmxlbmd0aDogJWRcbiIsIGVycS0+bGVuZ3RoICk7CisJCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAic2V0IGtleTogJXMoJWQpIFslZF1cbiIsIGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmtleSwKKwkJCQkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbiwgaW5kZXggKTsKKworCQkJLyogRW5hYmxlIFdFUCAoaWYgcG9zc2libGUpICovCisJCQlpZigoIGluZGV4ID09IHRrICkgJiYgKCBscC0+RGVmYXVsdEtleXMua2V5W3RrXS5sZW4gPiAwICkpIHsKKwkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDE7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIkludmFsaWQgS2V5IGxlbmd0aFxuIiApOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCX0gZWxzZSB7CisJCWludCBpbmRleCA9ICggZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCApIC0gMTsKKworCisJCS8qIERvIHdlIHdhbnQgdG8ganVzdCBzZXQgdGhlIGN1cnJlbnQgdHJhbnNtaXQga2V5PyAqLworCQlpZigoIGluZGV4ID49IDAgKSAmJiAoIGluZGV4IDwgTUFYX0tFWVMgKSkgeworCQkJREJHX05PVElDRSggRGJnSW5mbywgImluZGV4OiAlZDsgbGVuOiAlZFxuIiwgaW5kZXgsCisJCQkJCQlscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5sZW4gKTsKKworCQkJaWYoIGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbiA+IDAgKSB7CisJCQkJbHAtPlRyYW5zbWl0S2V5SUQgICAgICAgPSBpbmRleCArIDE7CisJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gICAgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gc2V0dGluZyB0aGUgY3VycmVudCBUeEtleVxuIiApOworCQkJCURCR19MRUFWRSggRGJnSW5mbyApOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZWFkIHRoZSBmbGFncyAqLworCWlmKCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEICkgeworCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDA7CS8vIGRpc2FibGUgZW5jcnlwdGlvbgorCX0gZWxzZSB7CisJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMTsKKwl9CisKKwlpZiggZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEICkgeworCQlEQkdfV0FSTklORyggRGJnSW5mbywgIklXX0VOQ09ERV9SRVNUUklDVEVEIGludmFsaWRcbiIgKTsKKwkJcmV0ID0gLUVJTlZBTDsJCS8vIEludmFsaWQKKwl9CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJlbmNyeXB0aW9uX3N0YXRlIDogICAgICAgJWRcbiIsIGVuY3J5cHRpb25fc3RhdGUgKTsKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJscC0+RW5hYmxlRW5jcnlwdGlvbiA6ICAgJWRcbiIsIGxwLT5FbmFibGVFbmNyeXB0aW9uICk7CisJREJHX1RSQUNFKCBEYmdJbmZvLCAiZXJxLT5sZW5ndGggICAgICAgICAgICA6ICVkXG4iLAorCQkJICAgZXJxLT5sZW5ndGgpOworCURCR19UUkFDRSggRGJnSW5mbywgImVycS0+ZmxhZ3MgICAgICAgICAgICAgOiAweCV4XG4iLAorCQkJICAgZXJxLT5mbGFncyk7CisKKwkvKiBXcml0ZSB0aGUgY2hhbmdlcyB0byB0aGUgY2FyZCAqLworCWlmKCByZXQgPT0gMCApIHsKKwkJREJHX05PVElDRSggRGJnSW5mbywgImVuY3J5cHQ6ICVkLCBJRDogJWRcbiIsIGxwLT5FbmFibGVFbmNyeXB0aW9uLAorCQkJCQlscC0+VHJhbnNtaXRLZXlJRCApOworCisJCWlmKCBscC0+RW5hYmxlRW5jcnlwdGlvbiA9PSBlbmNyeXB0aW9uX3N0YXRlICkgeworCQkJaWYoIGVycS0+bGVuZ3RoICE9IDAgKSB7CisJCQkJLyogRHluYW1pYyBXRVAga2V5IHVwZGF0ZSAqLworCQkJCXdsX3NldF93ZXBfa2V5cyggbHAgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFRvIHN3aXRjaCBlbmNyeXB0aW9uIG9uL29mZiwgc29mdCByZXNldCBpcyByZXF1aXJlZCAqLworCQkJd2xfYXBwbHkoIGxwICk7CisJCX0KKwl9CisKKwkvKiBTZW5kIGFuIGV2ZW50IHRoYXQgRW5jcnlwdGlvbiBoYXMgYmVlbiBzZXQgKi8KKwl3bF93ZXh0X2V2ZW50X2VuY29kZSggZGV2ICk7CisKK291dF91bmxvY2s6CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9lbmNvZGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfZW5jb2RlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBHZXRzIHRoZSBlbmNyeXB0aW9uIGtleXMgYW5kIHN0YXR1cy4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleSkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCWludCBpbmRleDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2VuY29kZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlEQkdfTk9USUNFKERiZ0luZm8sICJHSVdFTkNPREU6IGVuY3J5cHQ6ICVkLCBJRDogJWRcbiIsIGxwLT5FbmFibGVFbmNyeXB0aW9uLCBscC0+VHJhbnNtaXRLZXlJRCk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIHNlZSBXRVAga2V5ICovCisJaWYoICFjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBJcyBpdCBzdXBwb3J0ZWQ/ICovCisJaWYoICF3bF9oYXNfd2VwKCAmKCBscC0+aGNmQ3R4ICkpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyogQmFzaWMgY2hlY2tpbmcgKi8KKwlpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYICkgLSAxOworCisKKwkvKiBTZXQgdGhlIGZsYWdzICovCisJZXJxLT5mbGFncyA9IDA7CisKKwlpZiggbHAtPkVuYWJsZUVuY3J5cHRpb24gPT0gMCApIHsKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJfQorCisJLyogV2hpY2gga2V5IGRvIHdlIHdhbnQgKi8KKwlpZigoIGluZGV4IDwgMCApIHx8ICggaW5kZXggPj0gTUFYX0tFWVMgKSkgeworCQlpbmRleCA9IGxwLT5UcmFuc21pdEtleUlEIC0gMTsKKwl9CisKKwllcnEtPmZsYWdzIHw9IGluZGV4ICsgMTsKKworCS8qIENvcHkgdGhlIGtleSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwllcnEtPmxlbmd0aCA9IGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbjsKKworCW1lbWNweShrZXksIGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmtleSwgZXJxLT5sZW5ndGgpOworCitvdXRfdW5sb2NrOgorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfZW5jb2RlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X25pY2tuYW1lKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBTZXRzIHRoZSBuaWNrbmFtZSwgb3Igc3RhdGlvbiBuYW1lLCBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X25pY2tuYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqbmlja25hbWUpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9uaWNrbmFtZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworI2lmIDAgLy87PyBOZWVkZWQsIHdhcyBwcmVzZW50IGluIG9yaWdpbmFsIGNvZGUgYnV0IG5vdCBpbiA3LjE4IExpbnV4IDIuNiBrZXJuZWwgdmVyc2lvbgorCWlmKCAhY2FwYWJsZShDQVBfTkVUX0FETUlOICkpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKworCS8qIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgKi8KKwlpZihkYXRhLT5sZW5ndGggPiBIQ0ZfTUFYX05BTUVfTEVOKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCW1lbXNldCggbHAtPlN0YXRpb25OYW1lLCAwLCBzaXplb2YoIGxwLT5TdGF0aW9uTmFtZSApKTsKKworCW1lbWNweSggbHAtPlN0YXRpb25OYW1lLCBuaWNrbmFtZSwgZGF0YS0+bGVuZ3RoICk7CisKKwkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCXdsX2FwcGx5KCBscCApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfbmlja25hbWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfbmlja25hbWUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIEdldHMgdGhlIG5pY2tuYW1lLCBvciBzdGF0aW9uIG5hbWUsIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfbmlja25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpuaWNrbmFtZSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgICAgICByZXQgPSAwOworCWludCAgICAgICAgIHN0YXR1cyA9IC0xOworCXd2TmFtZV90ICAgICpwTmFtZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X25pY2tuYW1lIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpb24gbmFtZSAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcE5hbWUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9PV05fTkFNRTsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJcE5hbWUgPSAod3ZOYW1lX3QgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwkJLyogRW5kaWFuIHRyYW5zbGF0ZSB0aGUgbGVuZ3RoICovCisJCXBOYW1lLT5sZW5ndGggPSBDTlZfTElUVExFX1RPX0lOVCggcE5hbWUtPmxlbmd0aCApOworCisJCWlmICggcE5hbWUtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFICkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCS8qIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyICovCisJCQlkYXRhLT5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoOworCQkJbWVtY3B5KG5pY2tuYW1lLCBwTmFtZS0+bmFtZSwgcE5hbWUtPmxlbmd0aCk7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSAtRUZBVUxUOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9uaWNrbmFtZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9wb3J0dHlwZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgU2V0cyB0aGUgcG9ydCB0eXBlIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfcG9ydHR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCWhjZl8xNiAgcG9ydFR5cGU7CisJaGNmXzE2CWNyZWF0ZUlCU1M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfcG9ydHR5cGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBWYWxpZGF0ZSB0aGUgbmV3IHZhbHVlICovCisJc3dpdGNoKCAqbW9kZSApIHsKKwljYXNlIElXX01PREVfQURIT0M6CisKKwkJLyogV2hlbiB1c2VyIHJlcXVlc3RzIGFkLWhvYywgc2V0IElCU1MgbW9kZSEgKi8KKwkJcG9ydFR5cGUgICAgICAgICA9IDE7CisJCWNyZWF0ZUlCU1MgICAgICAgPSAxOworCisJCWxwLT5Eb3dubG9hZEZpcm13YXJlID0gV1ZMQU5fRFJWX01PREVfU1RBOyAvLzE7CisKKwkJYnJlYWs7CisKKworCWNhc2UgSVdfTU9ERV9BVVRPOgorCWNhc2UgSVdfTU9ERV9JTkZSQToKKworCQkvKiBCb3RoIGF1dG9tYXRpYyBhbmQgaW5mcmFzdHJ1Y3R1cmUgc2V0IHBvcnQgdG8gQlNTL1NUQSBtb2RlICovCisJCXBvcnRUeXBlICAgICAgICAgPSAxOworCQljcmVhdGVJQlNTICAgICAgID0gMDsKKworCQlscC0+RG93bmxvYWRGaXJtd2FyZSA9IFdWTEFOX0RSVl9NT0RFX1NUQTsgLy8xOworCisJCWJyZWFrOworCisKKyNpZiAwIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisKKwljYXNlIElXX01PREVfTUFTVEVSOgorCisJCS8qIFNldCBCU1MvQVAgbW9kZSAqLworCQlwb3J0VHlwZSAgICAgICAgICAgICA9IDE7CisKKwkJbHAtPkNyZWF0ZUlCU1MgICAgICAgPSAwOworCQlscC0+RG93bmxvYWRGaXJtd2FyZSA9IFdWTEFOX0RSVl9NT0RFX0FQOyAvLzI7CisKKwkJYnJlYWs7CisKKyNlbmRpZiAvKiAoSENGX1RZUEUpICYgSENGX1RZUEVfQVAgKi8KKworCisJZGVmYXVsdDoKKworCQlwb3J0VHlwZSAgID0gMDsKKwkJY3JlYXRlSUJTUyA9IDA7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaWYoIHBvcnRUeXBlICE9IDAgKSB7CisJCS8qIE9ubHkgZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIGEgbW9kZSBjaGFuZ2UgKi8KKwkJaWYoICggbHAtPlBvcnRUeXBlICE9IHBvcnRUeXBlICkgfHwgKGxwLT5DcmVhdGVJQlNTICE9IGNyZWF0ZUlCU1MpKSB7CisJCQlscC0+UG9ydFR5cGUgICA9IHBvcnRUeXBlOworCQkJbHAtPkNyZWF0ZUlCU1MgPSBjcmVhdGVJQlNTOworCisJCQkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCQkJd2xfZ28oIGxwICk7CisKKwkJCS8qIFNlbmQgYW4gZXZlbnQgdGhhdCBtb2RlIGhhcyBiZWVuIHNldCAqLworCQkJd2xfd2V4dF9ldmVudF9tb2RlKCBscC0+ZGV2ICk7CisJCX0KKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9wb3J0dHlwZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9wb3J0dHlwZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgR2V0cyB0aGUgcG9ydCB0eXBlIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfcG9ydHR5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgX191MzIgKm1vZGUsIGNoYXIgKmV4dHJhKQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICByZXQgPSAwOworCWludCAgICAgc3RhdHVzID0gLTE7CisJaGNmXzE2ICAqcFBvcnRUeXBlOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcG9ydHR5cGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgcG9ydCB0eXBlICovCisJbHAtPmx0dlJlY29yZC5sZW4gPSAxICsgKCBzaXplb2YoICpwUG9ydFR5cGUgKSAvIHNpemVvZiggaGNmXzE2ICkpOworCWxwLT5sdHZSZWNvcmQudHlwID0gQ0ZHX0NORl9QT1JUX1RZUEU7CisKKwlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CisJCXBQb3J0VHlwZSA9IChoY2ZfMTYgKikmKCBscC0+bHR2UmVjb3JkLnUudTMyICk7CisKKwkJKnBQb3J0VHlwZSA9IENOVl9MSVRUTEVfVE9fSU5UKCAqcFBvcnRUeXBlICk7CisKKwkJc3dpdGNoKCAqcFBvcnRUeXBlICkgeworCQljYXNlIDE6CisKKyNpZiAwCisjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0FQCisKKwkJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQkJCSptb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCQl9IGVsc2UgeworCQkJCSptb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkJCX0KKworI2Vsc2UKKworCQkJKm1vZGUgPSBJV19NT0RFX0lORlJBOworCisjZW5kaWYgIC8qIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUCAqLworI2VuZGlmCisKKwkJCWlmICggQ05WX0lOVF9UT19MSVRUTEUoIGxwLT5oY2ZDdHguSUZCX0ZXSWRlbnRpdHkuY29tcF9pZCApID09IENPTVBfSURfRldfQVAgICkgeworCQkJCSptb2RlID0gIElXX01PREVfTUFTVEVSOworCQkJfSBlbHNlIHsKKwkJCQlpZiggbHAtPkNyZWF0ZUlCU1MgKSB7CisJCQkJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJCQl9IGVsc2UgeworCQkJCQkqbW9kZSA9IElXX01PREVfSU5GUkE7CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKworCisJCWNhc2UgMzoKKwkJCSptb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSAtRUZBVUxUOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3BvcnR0eXBlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X3Bvd2VyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBTZXRzIHRoZSBwb3dlciBtYW5hZ2VtZW50IHNldHRpbmdzIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICp3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfcG93ZXIiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlEQkdfUFJJTlQoICJUSElTIENPUlJVUFRTIFBNRW5hYmxlZCA7PyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhXG4iICk7CisKKyNpZiAwIC8vOz8gTmVlZGVkLCB3YXMgcHJlc2VudCBpbiBvcmlnaW5hbCBjb2RlIGJ1dCBub3QgaW4gNy4xOCBMaW51eCAyLjYga2VybmVsIHZlcnNpb24KKwlpZiggIWNhcGFibGUoIENBUF9ORVRfQURNSU4gKSkgeworCQlyZXQgPSAtRVBFUk07CisKKwkJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKiBTZXQgdGhlIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgYmFzZWQgb24gdGhlICdkaXNhYmxlZCcgdmFsdWUgKi8KKwlpZiggd3JxLT5kaXNhYmxlZCApIHsKKwkJbHAtPlBNRW5hYmxlZCA9IDA7CisJfSBlbHNlIHsKKwkJbHAtPlBNRW5hYmxlZCA9IDE7CisJfQorCisJLyogQ29tbWl0IHRoZSBhZGFwdGVyIHBhcmFtZXRlcnMgKi8KKwl3bF9hcHBseSggbHAgKTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3Nfc2V0X3Bvd2VyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3Bvd2VyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBHZXRzIHRoZSBwb3dlciBtYW5hZ2VtZW50IHNldHRpbmdzIG9mIHRoZSB3aXJlbGVzcyBkZXZpY2UuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3Bvd2VyIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJREJHX1BSSU5UKCAiVEhJUyBJUyBQUk9CQUJMWSBBTiBPVkVSLVNJTVBMSUZJQ0FUSU9OIDs/ISEhISEhISEhISEhISEhISEhISEhISEhISEhISFcbiIgKTsKKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCXJycS0+ZmxhZ3MgPSAwOworCXJycS0+dmFsdWUgPSAwOworCisJaWYoIGxwLT5QTUVuYWJsZWQgKSB7CisJCXJycS0+ZGlzYWJsZWQgPSAwOworCX0gZWxzZSB7CisJCXJycS0+ZGlzYWJsZWQgPSAxOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3Bvd2VyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3R4X3Bvd2VyKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBHZXRzIHRoZSB0cmFuc21pdCBwb3dlciBvZiB0aGUgd2lyZWxlc3MgZGV2aWNlJ3MgcmFkaW8uCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB3aXJlbGVzc19nZXRfdHhfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BhcmFtICpycnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF90eF9wb3dlciIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworI2lmZGVmIFVTRV9QT1dFUl9EQk0KKwlycnEtPnZhbHVlID0gUkFESU9fVFhfUE9XRVJfREJNOworCXJycS0+ZmxhZ3MgPSBJV19UWFBPV19EQk07CisjZWxzZQorCXJycS0+dmFsdWUgPSBSQURJT19UWF9QT1dFUl9NV0FUVDsKKwlycnEtPmZsYWdzID0gSVdfVFhQT1dfTVdBVFQ7CisjZW5kaWYKKwlycnEtPmZpeGVkID0gMTsKKwlycnEtPmRpc2FibGVkID0gMDsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3R4X3Bvd2VyCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3Nfc2V0X3J0c190aHJlc2hvbGQoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgIFNldHMgdGhlIFJUUyB0aHJlc2hvbGQgZm9yIHRoZSB3aXJlbGVzcyBjYXJkLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X3J0c190aHJlc2hvbGQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqcnRzLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnRociA9IHJ0cy0+dmFsdWU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9ydHNfdGhyZXNob2xkIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYocnRzLT5maXhlZCA9PSAwKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwlpZiggcnRzLT5kaXNhYmxlZCApIHsKKwkJcnRociA9IDIzNDc7CisJfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCWlmKCggcnRociA8IDI1NiApIHx8ICggcnRociA+IDIzNDcgKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwlscC0+UlRTVGhyZXNob2xkID0gcnRocjsKKworCXdsX2FwcGx5KCBscCApOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9ydHNfdGhyZXNob2xkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICBHZXRzIHRoZSBSVFMgdGhyZXNob2xkIGZvciB0aGUgd2lyZWxlc3MgY2FyZC4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9ydHNfdGhyZXNob2xkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBzdHJ1Y3QgaXdfcGFyYW0gKnJ0cywgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcnRzX3RocmVzaG9sZCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCXJ0cy0+dmFsdWUgPSBscC0+UlRTVGhyZXNob2xkOworCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCisJcnRzLT5kaXNhYmxlZCA9ICggcnRzLT52YWx1ZSA9PSAyMzQ3ICk7CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlydHMtPmZpeGVkID0gMTsKKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHJldDsKK30gLy8gd2lyZWxlc3NfZ2V0X3J0c190aHJlc2hvbGQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX3NldF9yYXRlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgU2V0IHRoZSBkZWZhdWx0IGRhdGEgcmF0ZSBzZXR0aW5nIHVzZWQgYnkgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKyNpZmRlZiBXQVJQCisJaW50IHN0YXR1cyA9IC0xOworCWludCBpbmRleCA9IDA7CisjZW5kaWYgIC8vIFdBUlAKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X3JhdGUiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKyNpZmRlZiBXQVJQCisKKwkvKiBEZXRlcm1pbmUgaWYgdGhlIGNhcmQgaXMgb3BlcmF0aW5nIGluIHRoZSAyLjQgb3IgNS4wIEdIeiBiYW5kOyBjaGVjaworCSAgIGlmIEJpdCA5IGlzIHNldCBpbiB0aGUgY3VycmVudCBjaGFubmVsIFJJRCAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gMjsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfQ0hBTk5FTDsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJaW5kZXggPSAoIENOVl9MSVRUTEVfVE9fSU5UKCBscC0+bHR2UmVjb3JkLnUudTE2WzBdICkgJiAweDEwMCApID8gMSA6IDA7CisKKwkJREJHX1BSSU5UKCAiSW5kZXg6ICVkXG4iLCBpbmRleCApOworCX0gZWxzZSB7CisJCURCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCBkZXRlcm1pbmUgcmFkaW8gZnJlcXVlbmN5XG4iICk7CisJCURCR19MRUFWRSggRGJnSW5mbyApOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYoIHJycS0+dmFsdWUgPiAwICYmCisJCXJycS0+dmFsdWUgPD0gMSAqIE1FR0FCSVQgKSB7CisJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAwMTsKKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDEgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDIgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDAyOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDAzOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiAyICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSA1ICogTUVHQUJJVCApIHsKKwkJaWYoIHJycS0+Zml4ZWQgPT0gMSApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAwNDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sW2luZGV4XSA9IDB4MDAwNzsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gNSAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gNiAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMTA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMTc7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDYgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDkgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCA9PSAxICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDIwOworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbaW5kZXhdID0gMHgwMDM3OworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiA5ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAxMSAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwMDg7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwM0Y7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDExICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAxMiAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwNDA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwN0Y7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDEyICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAxOCAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwODA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAwRkY7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDE4ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAyNCAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAxMDA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAxRkY7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDI0ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAzNiAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAyMDA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDAzRkY7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDM2ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSA0OCAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDA0MDA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDA3RkY7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDQ4ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSA1NCAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkID09IDEgKSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDA4MDA7CisJCX0gZWxzZSB7CisJCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSAweDBGRkY7CisJCX0KKwl9CisJZWxzZSBpZiggcnJxLT5maXhlZCA9PSAwICkgeworCQkvKiBJbiB0aGlzIGNhc2UsIHRoZSB1c2VyIGhhcyBub3Qgc3BlY2lmaWVkIGEgYml0cmF0ZSwgb25seSB0aGUgImF1dG8iCisJCSAgIG1vbmlrZXIuIFNvLCBzZXQgdG8gYWxsIHN1cHBvcnRlZCByYXRlcyAqLworCQlscC0+VHhSYXRlQ29udHJvbFtpbmRleF0gPSBQQVJNX01BWF9UWF9SQVRFOworCX0gZWxzZSB7CisJCXJycS0+dmFsdWUgPSAwOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisKKyNlbHNlCisKKwlpZiggcnJxLT52YWx1ZSA+IDAgJiYKKwkJCXJycS0+dmFsdWUgPD0gMSAqIE1FR0FCSVQgKSB7CisJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gMTsKKwl9CisJZWxzZSBpZiggcnJxLT52YWx1ZSA+IDEgKiBNRUdBQklUICYmCisJCQlycnEtPnZhbHVlIDw9IDIgKiBNRUdBQklUICkgeworCQlpZiggcnJxLT5maXhlZCApIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gMjsKKwkJfSBlbHNlIHsKKwkJCWxwLT5UeFJhdGVDb250cm9sWzBdID0gNjsKKwkJfQorCX0KKwllbHNlIGlmKCBycnEtPnZhbHVlID4gMiAqIE1FR0FCSVQgJiYKKwkJCXJycS0+dmFsdWUgPD0gNSAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkICkgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSA0OworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSA3OworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+dmFsdWUgPiA1ICogTUVHQUJJVCAmJgorCQkJcnJxLT52YWx1ZSA8PSAxMSAqIE1FR0FCSVQgKSB7CisJCWlmKCBycnEtPmZpeGVkKSAgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSA1OworCQl9IGVsc2UgeworCQkJbHAtPlR4UmF0ZUNvbnRyb2xbMF0gPSAzOworCQl9CisJfQorCWVsc2UgaWYoIHJycS0+Zml4ZWQgPT0gMCApIHsKKwkJLyogSW4gdGhpcyBjYXNlLCB0aGUgdXNlciBoYXMgbm90IHNwZWNpZmllZCBhIGJpdHJhdGUsIG9ubHkgdGhlICJhdXRvIgorCQkgICBtb25pa2VyLiBTbywgc2V0IHRoZSByYXRlIHRvIDExTWIgYXV0byAqLworCQlscC0+VHhSYXRlQ29udHJvbFswXSA9IDM7CisJfSBlbHNlIHsKKwkJcnJxLT52YWx1ZSA9IDA7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKyNlbmRpZiAgLy8gV0FSUAorCisKKwkvKiBDb21taXQgdGhlIGFkYXB0ZXIgcGFyYW1ldGVycyAqLworCXdsX2FwcGx5KCBscCApOworCitvdXRfdW5sb2NrOgorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19zZXRfcmF0ZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdpcmVsZXNzX2dldF9yYXRlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgR2V0IHRoZSBkZWZhdWx0IGRhdGEgcmF0ZSBzZXR0aW5nIHVzZWQgYnkgdGhlIHdpcmVsZXNzIGRldmljZS4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wYXJhbSAqcnJxLCBjaGFyICpleHRyYSkKKworeworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgICAgcmV0ID0gMDsKKwlpbnQgICAgIHN0YXR1cyA9IC0xOworCWhjZl8xNiAgdHhSYXRlOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19nZXRfcmF0ZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCS8qIEdldCB0aGUgY3VycmVudCB0cmFuc21pdCByYXRlIGZyb20gdGhlIGFkYXB0ZXIgKi8KKwlscC0+bHR2UmVjb3JkLmxlbiA9IDEgKyAoIHNpemVvZih0eFJhdGUpL3NpemVvZihoY2ZfMTYpKTsKKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfVFhfUkFURTsKKworCXN0YXR1cyA9IGhjZl9nZXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKyNpZmRlZiBXQVJQCisKKwkJdHhSYXRlID0gQ05WX0xJVFRMRV9UT19JTlQoIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gKTsKKworCQlpZiggdHhSYXRlICYgMHgwMDAxICkgeworCQkJdHhSYXRlID0gMTsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMDIgKSB7CisJCQl0eFJhdGUgPSAyOworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwNCApIHsKKwkJCXR4UmF0ZSA9IDU7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDA4ICkgeworCQkJdHhSYXRlID0gMTE7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDAxMCApIHsKKwkJCXR4UmF0ZSA9IDY7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDAyMCApIHsKKwkJCXR4UmF0ZSA9IDk7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDA0MCApIHsKKwkJCXR4UmF0ZSA9IDEyOworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDAwODAgKSB7CisJCQl0eFJhdGUgPSAxODsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwMTAwICkgeworCQkJdHhSYXRlID0gMjQ7CisJCX0KKwkJZWxzZSBpZiggdHhSYXRlICYgMHgwMDIwMCApIHsKKwkJCXR4UmF0ZSA9IDM2OworCQl9CisJCWVsc2UgaWYoIHR4UmF0ZSAmIDB4MDA0MDAgKSB7CisJCQl0eFJhdGUgPSA0ODsKKwkJfQorCQllbHNlIGlmKCB0eFJhdGUgJiAweDAwODAwICkgeworCQkJdHhSYXRlID0gNTQ7CisJCX0KKworI2Vsc2UKKworCQl0eFJhdGUgPSAoaGNmXzE2KUNOVl9MSVRUTEVfVE9fTE9ORyggbHAtPmx0dlJlY29yZC51LnUzMlswXSApOworCisjZW5kaWYgIC8vIFdBUlAKKworCQlycnEtPnZhbHVlID0gdHhSYXRlICogTUVHQUJJVDsKKwl9IGVsc2UgeworCQlycnEtPnZhbHVlID0gMDsKKwkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9yYXRlCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisjaWYgMCAvLzs/IE5vdCB1c2VkIGFueW1vcmUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19nZXRfcHJpdmF0ZV9pbnRlcmZhY2UoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBSZXR1cm5zIHRoZSBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zJyBjb21wYXRpYmxlIHByaXZhdGUgaW50ZXJmYWNlIG9mCisgKiAgdGhlIGRyaXZlci4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgd2lyZWxlc3NfZ2V0X3ByaXZhdGVfaW50ZXJmYWNlKCBzdHJ1Y3QgaXdyZXEgKndycSwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKK3sKKwlpbnQgcmV0ID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X3ByaXZhdGVfaW50ZXJmYWNlIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYoIHdycS0+dS5kYXRhLnBvaW50ZXIgIT0gTlVMTCApIHsKKwkJc3RydWN0IGl3X3ByaXZfYXJncyBwcml2W10gPQorCQl7CisJCQl7IFNJT0NTSVdORVROQU1FLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sIDAsICJzbmV0d29ya19uYW1lIiB9LAorCQkJeyBTSU9DR0lXTkVUTkFNRSwgMCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAiZ25ldHdvcmtfbmFtZSIgfSwKKwkJCXsgU0lPQ1NJV1NUQU5BTUUsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgMCwgInNzdGF0aW9uX25hbWUiIH0sCisJCQl7IFNJT0NHSVdTVEFOQU1FLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sICJnc3RhdGlvbl9uYW1lIiB9LAorCQkJeyBTSU9DU0lXUE9SVFRZUEUsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNwb3J0X3R5cGUiIH0sCisJCQl7IFNJT0NHSVdQT1JUVFlQRSwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ3BvcnRfdHlwZSIgfSwKKwkJfTsKKworCQkvKiBWZXJpZnkgdGhlIHVzZXIgYnVmZmVyICovCisJCXJldCA9IHZlcmlmeV9hcmVhKCBWRVJJRllfV1JJVEUsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZiggcHJpdiApKTsKKworCQlpZiggcmV0ICE9IDAgKSB7CisJCQlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBDb3B5IHRoZSBkYXRhIGludG8gdGhlIHVzZXIncyBidWZmZXIgKi8KKwkJd3JxLT51LmRhdGEubGVuZ3RoID0gTkVMRU0oIHByaXYgKTsKKwkJY29weV90b191c2VyKCB3cnEtPnUuZGF0YS5wb2ludGVyLCAmcHJpdiwgc2l6ZW9mKCBwcml2ICkpOworCX0KKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX2dldF9wcml2YXRlX2ludGVyZmFjZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZgorCisKKworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3aXJlbGVzc19zZXRfc2NhbigpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIEluc3RydWN0cyB0aGUgZHJpdmVyIHRvIGluaXRpYXRlIGEgbmV0d29yayBzY2FuLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgICAgICAgICAgICAgICAgIHJldCA9IDA7CisJaW50ICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKwlpbnQJCSAgICByZXRyaWVzID0gMDsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvLzs/IE5vdGU6IHNob3dzIHJlc3VsdHMgYXMgdHJhY2UsIHJldHJ1bnMgYWx3YXlzIDAgdW5sZXNzIEJVU1kKKworCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X3NjYW4iICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKyAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisKKwkvKgorICAgICAgICAgKiBUaGlzIGxvb2tzIGxpa2UgYSBuaWNlIHBsYWNlIHRvIHRlc3QgaWYgdGhlIEhDRiBpcyBzdGlsbAorICAgICAgICAgKiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGNhcmQuIEl0IHNlZW1zIHRoYXQgc29tZXRpbWVzIEJBUF8xCisgICAgICAgICAqIGdldHMgY29ycnVwdGVkLiBCeSBsb29raW5nIGF0IHRoZSBjb21tZW50cyBpbiBIQ0YgdGhlCisgICAgICAgICAqIGNhdXNlIGlzIHN0aWxsIGEgbWlzdGVyeS4gT2theSwgdGhlIGNvbW11bmljYXRpb24gdG8gdGhlCisgICAgICAgICAqIGNhcmQgaXMgZGVhZCwgcmVzZXQgdGhlIGNhcmQgdG8gcmV2aXZlLgorICAgICAgICAgKi8KKwlpZigobHAtPmhjZkN0eC5JRkJfQ2FyZFN0YXQgJiBDQVJEX1NUQVRfREVGVU5DVCkgIT0gMCkKKwl7CisJCURCR19UUkFDRSggRGJnSW5mbywgIkNBUkQgaXMgaW4gREVGVU5DVCBtb2RlLCByZXNldCBpdCB0byBicmluZyBpdCBiYWNrIHRvIGxpZmVcbiIgKTsKKwkJd2xfcmVzZXQoIGRldiApOworCX0KKworcmV0cnk6CisJLyogU2V0IHRoZSBjb21wbGV0aW9uIHN0YXRlIHRvIEZBTFNFICovCisJbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSA9IEZBTFNFOworCisKKwkvKiBDaGFubmVscyB0byBzY2FuICovCisjaWZkZWYgV0FSUAorCWxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gNTsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TQ0FOX0NIQU5ORUw7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMHgzRkZGICk7ICAvLyAyLjQgR0h6IEJhbmQKKwlscC0+bHR2UmVjb3JkLnUudTE2WzFdICA9IENOVl9JTlRfVE9fTElUVExFKCAweEZGRkYgKTsgIC8vIDUuMCBHSHogQmFuZAorCWxwLT5sdHZSZWNvcmQudS51MTZbMl0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4RkZGRiApOyAgLy8gICAgICAuLgorCWxwLT5sdHZSZWNvcmQudS51MTZbM10gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4MDAwNyApOyAgLy8gICAgICAuLgorI2Vsc2UKKwlscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CisJbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfU0NBTl9DSEFOTkVMOworCWxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDB4N0ZGRiApOworI2VuZGlmICAvLyBXQVJQCisKKwlzdGF0dXMgPSBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCURCR19UUkFDRSggRGJnSW5mbywgIkNGR19TQ0FOX0NIQU5ORUwgcmVzdWx0ICAgICAgOiAweCV4XG4iLCBzdGF0dXMgKTsKKworCS8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworCWlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CisJCS8vUmVjb3ZlcnkKKwkJcmV0cmllcysrOworCQlpZihyZXRyaWVzIDw9IDEwKSB7CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJSZXNldCBjYXJkIHRvIHJlY292ZXIsIGF0dGVtcHQ6ICVkXG4iLCByZXRyaWVzICk7CisJCQl3bF9yZXNldCggZGV2ICk7CisKKwkJCS8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCisJCQl3bF91bmxvY2sobHAsICZmbGFncyk7CisJCQl3bF9sb2NrKCBscCwgJmZsYWdzICk7CisKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIFNDQU5fU1NJRCB0byAiQU5ZIi4gVXNpbmcgdGhpcyBSSUQgZm9yIHNjYW4gcHJldmVudHMgdGhlIG5lZWQgdG8KKwkgICBkaXNhc3NvY2lhdGUgZnJvbSB0aGUgbmV0d29yayB3ZSBhcmUgY3VycmVudGx5IG9uICovCisJbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAxODsKKwlscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19TQ0FOX1NTSUQ7CisJbHAtPmx0dlJlY29yZC51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRSggMCApOworCWxwLT5sdHZSZWNvcmQudS51MTZbMV0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDAgKTsKKworCXN0YXR1cyA9IGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOworCisJLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisJd2xfbG9jayggbHAsICZmbGFncyApOworCisJREJHX1RSQUNFKCBEYmdJbmZvLCAiQ0ZHX1NDQU5fU1NJRCB0byAnYW55JyBzdGF0dXM6IDB4JXhcbiIsIHN0YXR1cyApOworCisJLyogSW5pdGlhdGUgdGhlIHNjYW4gKi8KKwkvKiBOT1RFOiBVc2luZyBIQ0ZfQUNUX1NDQU4gaGFzIGJlZW4gcmVtb3ZlZCwgYXMgdXNpbmcgSENGX0FDVF9BQ1NfU0NBTiB0bworCSAgIHJldHJpZXZlIHByb2JlIHJlc3BvbnNlcyBtdXN0IGFsd2F5cyBiZSB1c2VkIHRvIHN1cHBvcnQgV1BBICovCisJc3RhdHVzID0gaGNmX2FjdGlvbiggJiggbHAtPmhjZkN0eCApLCBIQ0ZfQUNUX0FDU19TQ0FOICk7CisKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJTVUNDRVNTRlVMTFkgSU5JVElBVEVEIFNDQU4uLi5cbiIgKTsKKwl9IGVsc2UgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJTklUSUFURSBTQ0FOIEZBSUxFRC4uLlxuIiApOworCX0KKworICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCitvdXQ6CisJREJHX0xFQVZFKERiZ0luZm8pOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9zY2FuCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2lyZWxlc3NfZ2V0X3NjYW4oKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBJbnN0cnVjdHMgdGhlIGRyaXZlciB0byBnYXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0cyBvZiBhIG5ldHdvcmsgc2Nhbi4KKyAqCisgKiAgUEFSQU1FVEVSUzoKKyAqCisgKiAgICAgIHdycSAtIHRoZSB3aXJlbGVzcyByZXF1ZXN0IGJ1ZmZlcgorICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgICAgICAgICAgICAgICByZXQgPSAwOworCWludCAgICAgICAgICAgICAgICAgY291bnQ7CisJY2hhciAgICAgICAgICAgICAgICAqYnVmOworCWNoYXIgICAgICAgICAgICAgICAgKmJ1Zl9lbmQ7CisJc3RydWN0IGl3X2V2ZW50ICAgICBpd2U7CisJUFJPQkVfUkVTUCAgICAgICAgICAqcHJvYmVfcmVzcDsKKwloY2ZfOCAgICAgICAgICAgICAgIG1zZ1s1MTJdOworCWhjZl84ICAgICAgICAgICAgICAgKndwYV9pZTsKKwloY2ZfMTYgICAgICAgICAgICAgIHdwYV9pZV9sZW47CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9zY2FuIiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisJLyogSWYgdGhlIHNjYW4gaXMgbm90IGRvbmUsIHRlbGwgdGhlIGNhbGxpbmcgcHJvY2VzcyB0byB0cnkgYWdhaW4gbGF0ZXIgKi8KKwlpZiggIWxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlEQkdfVFJBQ0UoIERiZ0luZm8sICJTQ0FOIENPTVBMRVRFLCBOdW0gb2YgQVBzOiAlZFxuIiwKKwkJCSAgIGxwLT5wcm9iZV9yZXN1bHRzLm51bV9hcHMgKTsKKworCWJ1ZiAgICAgPSBleHRyYTsKKwlidWZfZW5kID0gZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBOworCisJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgbHAtPnByb2JlX3Jlc3VsdHMubnVtX2FwczsgY291bnQrKyApIHsKKwkJLyogUmVmZXJlbmNlIHRoZSBwcm9iZSByZXNwb25zZSBmcm9tIHRoZSB0YWJsZSAqLworCQlwcm9iZV9yZXNwID0gKFBST0JFX1JFU1AgKikmbHAtPnByb2JlX3Jlc3VsdHMuUHJvYmVUYWJsZVtjb3VudF07CisKKworCQkvKiBGaXJzdCBlbnRyeSBNVVNUIGJlIHRoZSBNQUMgYWRkcmVzcyAqLworCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCisJCWl3ZS5jbWQgICAgICAgICAgICAgICAgID0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KCBpd2UudS5hcF9hZGRyLnNhX2RhdGEsIHByb2JlX3Jlc3AtPkJTU0lELCBFVEhfQUxFTik7CisJCWl3ZS5sZW4gICAgICAgICAgICAgICAgID0gSVdfRVZfQUREUl9MRU47CisKKwkJYnVmID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKworCQkvKiBVc2UgdGhlIG1vZGUgdG8gaW5kaWNhdGUgaWYgaXQncyBhIHN0YXRpb24gb3IgQVAgKi8KKwkJLyogV29uJ3QgYWx3YXlzIGJlIGFuIEFQIGlmIGluIElCU1MgbW9kZSAqLworCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKworCQlpZiggcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSAmIENBUEFCSUxJVFlfSUJTUyApIHsKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworCQl9IGVsc2UgeworCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworCQl9CisKKwkJaXdlLmxlbiA9IElXX0VWX1VJTlRfTEVOOworCisJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCisKKwkJLyogQW55IHF1YWxpdHkgaW5mb3JtYXRpb24gKi8KKwkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKworCQlpd2UuY21kICAgICAgICAgICAgID0gSVdFVlFVQUw7CisJCWl3ZS51LnF1YWwubGV2ZWwgICAgPSBkYm0ocHJvYmVfcmVzcC0+c2lnbmFsKTsKKwkJaXdlLnUucXVhbC5ub2lzZSAgICA9IGRibShwcm9iZV9yZXNwLT5zaWxlbmNlKTsKKwkJaXdlLnUucXVhbC5xdWFsICAgICA9IGl3ZS51LnF1YWwubGV2ZWwgLSBpd2UudS5xdWFsLm5vaXNlOworCQlpd2UudS5xdWFsLnVwZGF0ZWQgID0gbHAtPnByb2JlX3Jlc3VsdHMuc2Nhbl9jb21wbGV0ZSB8IElXX1FVQUxfREJNOworCQlpd2UubGVuICAgICAgICAgICAgID0gSVdfRVZfUVVBTF9MRU47CisKKwkJYnVmID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7CisKKworCQkvKiBFU1NJRCBpbmZvcm1hdGlvbiAqLworCQlpZiggcHJvYmVfcmVzcC0+cmF3RGF0YVsxXSA+IDAgKSB7CisJCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCisJCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwcm9iZV9yZXNwLT5yYXdEYXRhWzFdOworCQkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CisKKwkJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgJnByb2JlX3Jlc3AtPnJhd0RhdGFbMl0pOworCQl9CisKKworCQkvKiBFbmNyeXB0aW9uIEluZm9ybWF0aW9uICovCisJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisKKwkJaXdlLmNtZCAgICAgICAgICAgICA9IFNJT0NHSVdFTkNPREU7CisJCWl3ZS51LmRhdGEubGVuZ3RoICAgPSAwOworCisJCS8qIENoZWNrIHRoZSBjYXBhYmlsaXRpZXMgZmllbGQgb2YgdGhlIFByb2JlIFJlc3BvbnNlIHRvIHNlZSBpZgorCQkgICAncHJpdmFjeScgaXMgc3VwcG9ydGVkIG9uIHRoZSBBUCBpbiBxdWVzdGlvbiAqLworCQlpZiggcHJvYmVfcmVzcC0+Y2FwYWJpbGl0eSAmIENBUEFCSUxJVFlfUFJJVkFDWSApIHsKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCX0gZWxzZSB7CisJCQlpd2UudS5kYXRhLmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJfQorCisJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgTlVMTCk7CisKKworCQkvKiBGcmVxdWVuY3kgSW5mbyAqLworCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaXdlLmxlbiA9IElXX0VWX0ZSRVFfTEVOOworCQlpd2UudS5mcmVxLm0gPSB3bF9wYXJzZV9kc19pZSggcHJvYmVfcmVzcCApOworCQlpd2UudS5mcmVxLmUgPSAwOworCisJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorCQkvKiBDdXN0b20gaW5mbyAoQmVhY29uIEludGVydmFsKSAqLworCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOworCQltZW1zZXQoIG1zZywgMCwgc2l6ZW9mKCBtc2cgKSk7CisKKwkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCXNwcmludGYoIG1zZywgImJlYWNvbl9pbnRlcnZhbD0lZCIsIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsICk7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKCBtc2cgKTsKKworCQlidWYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIG1zZyk7CisKKworCQkvKiBDdXN0b20gaW5mbyAoV1BBLUlFKSAqLworCQl3cGFfaWUgPSBOVUxMOworCQl3cGFfaWVfbGVuID0gMDsKKworCQl3cGFfaWUgPSB3bF9wYXJzZV93cGFfaWUoIHByb2JlX3Jlc3AsICZ3cGFfaWVfbGVuICk7CisJCWlmKCB3cGFfaWUgIT0gTlVMTCApIHsKKwkJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7CisJCQltZW1zZXQoIG1zZywgMCwgc2l6ZW9mKCBtc2cgKSk7CisKKwkJCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCQkJc3ByaW50ZiggbXNnLCAid3BhX2llPSVzIiwgd2xfcHJpbnRfd3BhX2llKCB3cGFfaWUsIHdwYV9pZV9sZW4gKSk7CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbiggbXNnICk7CisKKwkJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgbXNnKTsKKwkJfQorCisJCS8qIEFkZCBvdGhlciBjdXN0b20gaW5mbyBpbiBmb3JtYXR0ZWQgc3RyaW5nIGZvcm1hdCBhcyBuZWVkZWQuLi4gKi8KKyNlbmRpZgorCX0KKworCWRhdGEtPmxlbmd0aCA9IGJ1ZiAtIGV4dHJhOworCitvdXRfdW5sb2NrOgorCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfSAvLyB3aXJlbGVzc19nZXRfc2NhbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2VuZGlmICAvLyBXSVJFTEVTU19FWFQgPiAxMworCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNworCitzdGF0aWMgaW50IHdpcmVsZXNzX3NldF9hdXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50CQkJICAgICAgcmV0OworCWludAkJCSAgICAgIGl3YV9pZHggPSBkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVg7CisJaW50CQkJICAgICAgaXdhX3ZhbCA9IGRhdGEtPnZhbHVlOworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfYXV0aCIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCXN3aXRjaCAoaXdhX2lkeCkgeworCQljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1dQQV9WRVJTSU9OXG4iKTsKKwkJCS8qIFdlIGRvIHN1cHBvcnQgV1BBIG9ubHk7IGhvdyBzaG91bGQgRElTQUJMRUQgYmUgdHJlYXRlZD8gKi8KKwkJCWlmIChpd2FfdmFsID09IElXX0FVVEhfV1BBX1ZFUlNJT05fV1BBKQorCQkJCXJldCA9IDA7CisJCQllbHNlCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfV1BBX0VOQUJMRUQ6IHZhbCA9ICVkXG4iLCBpd2FfdmFsKTsKKwkJCWlmIChpd2FfdmFsKQorCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMjsKKwkJCWVsc2UKKwkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDA7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFU1xuIik7CisJCQlscC0+ZHJpdmVyRW5hYmxlID0gIWl3YV92YWw7CisJCQlpZihscC0+ZHJpdmVyRW5hYmxlKQorCQkJCWhjZl9jbnRsKCYobHAtPmhjZkN0eCksIEhDRl9DTlRMX0VOQUJMRSB8IEhDRl9QT1JUXzApOworCQkJZWxzZQorCQkJCWhjZl9jbnRsKCYobHAtPmhjZkN0eCksIEhDRl9DTlRMX0RJU0FCTEUgfCBIQ0ZfUE9SVF8wKTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRFxuIik7CisJCQkvKiBXZSBkbyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgaGVyZSwganVzdCB0byBzaWxlbmNlCisJCQkgKiB3cGFfc3VwcGxpY2FudCAqLworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX0NJUEhFUl9QQUlSV0lTRVxuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX0NJUEhFUl9HUk9VUFxuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKKwkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfS0VZX01HTVRcbiIpOworCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIXzgwMjExX0FVVEhfQUxHXG4iKTsKKwkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBJV19BVVRIX1JYX1VORU5DUllQVEVEX0VBUE9MOgorCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTFxuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9ST0FNSU5HX0NPTlRST0w6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1JPQU1JTkdfQ09OVFJPTFxuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1BSSVZBQ1lfSU5WT0tFRFxuIik7CisJCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIXz8/ICglZCkgdW5rbm93blxuIiwgaXdhX2lkeCk7CisJCQkvKiByZXR1cm4gYW4gZXJyb3IgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9hdXRoCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworc3RhdGljIGludCBoZXJtZXNfc2V0X2tleShsdHZfdCAqbHR2LCBpbnQgYWxnLCBpbnQga2V5X2lkeCwgdTggKmFkZHIsCisJCQkgIGludCBzZXRfdHgsIHU4ICpzZXEsIHU4ICprZXksIHNpemVfdCBrZXlfbGVuKQoreworCWludCByZXQgPSAtRUlOVkFMOworCS8vIGludCAgIGNvdW50ID0gMDsKKwlpbnQgICBidWZfaWR4ID0gMDsKKwloY2ZfOCB0c2NbSVdfRU5DT0RFX1NFUV9NQVhfU0laRV0gPQorCQl7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCURCR19GVU5DKCAiaGVybWVzX3NldF9rZXkiICk7CisJREJHX0VOVEVSKCBEYmdJbmZvICk7CisKKwkvKgorICAgICAgICAgKiBDaGVjayB0aGUga2V5IGluZGV4IGhlcmU7IGlmIDAsIGxvYWQgYXMgUGFpcndpc2UgS2V5LCBvdGhlcndpc2UsCisgICAgICAgICAqIGxvYWQgYXMgYSBncm91cCBrZXkuIE5vdGUgdGhhdCBmb3IgdGhlIEhlcm1lcywgdGhlIFJJRHMgZm9yCisgICAgICAgICAqIGdyb3VwL3Bhcml3aXNlIGtleXMgYXJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIgYW5kIGRpZmZlcmVudAorICAgICAgICAgKiB0aGFuIHRoZSBkZWZhdWx0IFdFUCBrZXlzIGFzIHdlbGwuCisgICAgICAgICAqLworCXN3aXRjaCAoYWxnKQorCXsKKwljYXNlIElXX0VOQ09ERV9BTEdfVEtJUDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfRU5DT0RFX0FMR19US0lQOiBrZXkoJWQpXG4iLCBrZXlfaWR4KTsKKyNpZiAwCisJCS8qCisgICAgICAgICAgICAgICAgICogTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gZGF0YSBxdWV1ZWQgdXAgaW4gdGhlIGZpcm13YXJlCisgICAgICAgICAgICAgICAgICogYmVmb3JlIHNldHRpbmcgdGhlIFRLSVAga2V5cy4gSWYgdGhpcyBjaGVjayBpcyBub3QKKyAgICAgICAgICAgICAgICAgKiBwZXJmb3JtZWQsIHNvbWUgZGF0YSBtYXkgYmUgc2VudCBvdXQgd2l0aCBpbmNvcnJlY3QgTUlDCisgICAgICAgICAgICAgICAgICogYW5kIGNhdXNlIHN5bmNocm9uaXphcmlvbiBlcnJvcnMgd2l0aCB0aGUgQVAKKyAgICAgICAgICAgICAgICAgKi8KKwkJLyogQ2hlY2sgZXZlcnkgMW1zIGZvciAxMDBtcyAqLworCQlmb3IoIGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KysgKQorCQl7CisJCQl1c2xlZXAoIDEwMDAgKTsKKworCQkJbHR2LmxlbiA9IDI7CisJCQlsdHYudHlwID0gMHhGRDkxOyAgLy8gVGhpcyBSSUQgbm90IGRlZmluZWQgaW4gSENGIHlldCEhIQorCQkJbHR2LnUudTE2WzBdID0gMDsKKworCQkJd2xfZ2V0X2luZm8oIHNvY2ssICZsdHYsIGlmbmFtZSApOworCisJCQlpZiggbHR2LnUudTE2WzBdID09IDAgKQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoIGNvdW50ID09IDEwMCApCisJCXsKKwkJCXdwYV9wcmludGYoIE1TR19ERUJVRywgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBUeFEhIiApOworCQl9CisjZW5kaWYKKworCQlzd2l0Y2ggKGtleV9pZHgpIHsKKwkJY2FzZSAwOgorCQkJbHR2LT5sZW4gPSAyODsKKwkJCWx0di0+dHlwID0gQ0ZHX0FERF9US0lQX01BUFBFRF9LRVk7CisKKwkJCS8qIExvYWQgdGhlIEJTU0lEICovCisJCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgYWRkciwgRVRIX0FMRU4pOworCQkJYnVmX2lkeCArPSBFVEhfQUxFTjsKKworCQkJLyogTG9hZCB0aGUgVEtJUCBrZXkgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCAma2V5WzBdLCAxNik7CisJCQlidWZfaWR4ICs9IDE2OworCisJCQkvKiBMb2FkIHRoZSBUU0MgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCB0c2MsIElXX0VOQ09ERV9TRVFfTUFYX1NJWkUpOworCQkJYnVmX2lkeCArPSBJV19FTkNPREVfU0VRX01BWF9TSVpFOworCisJCQkvKiBMb2FkIHRoZSBSU0MgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBzZXEsIElXX0VOQ09ERV9TRVFfTUFYX1NJWkUpOworCQkJYnVmX2lkeCArPSBJV19FTkNPREVfU0VRX01BWF9TSVpFOworCisJCQkvKiBMb2FkIHRoZSBUeE1JQyBrZXkgKi8KKwkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCAma2V5WzE2XSwgOCk7CisJCQlidWZfaWR4ICs9IDg7CisKKwkJCS8qIExvYWQgdGhlIFJ4TUlDIGtleSAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sICZrZXlbMjRdLCA4KTsKKworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJbHR2LT5sZW4gPSAyNjsKKwkJCWx0di0+dHlwID0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZOworCisJCQkvKiBMb2FkIHRoZSBrZXkgSW5kZXggKi8KKwkJCWx0di0+dS51MTZbYnVmX2lkeF0gPSBrZXlfaWR4OworCQkJLyogSWYgdGhpcyBpcyBhIFR4IEtleSwgc2V0IGJpdCA4MDAwICovCisJCQlpZihzZXRfdHgpCisJCQkJbHR2LT51LnUxNltidWZfaWR4XSB8PSAweDgwMDA7CisJCQlidWZfaWR4ICs9IDI7CisKKwkJCS8qIExvYWQgdGhlIFJTQyAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHNlcSwgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisJCQlidWZfaWR4ICs9IElXX0VOQ09ERV9TRVFfTUFYX1NJWkU7CisKKwkJCS8qIExvYWQgdGhlIFRLSVAsIFR4TUlDLCBhbmQgUnhNSUMga2V5cyBpbiBvbmUgc2hvdCwgYmVjYXVzZSBpbgorCQkJICAgQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIHRoZXkgYXJlIGJhY2stdG8tYmFjayAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIGtleSwga2V5X2xlbik7CisJCQlidWZfaWR4ICs9IGtleV9sZW47CisKKwkJCS8qIExvYWQgdGhlIFRTQyAqLworCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHRzYywgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisKKwkJCWx0di0+dS51MTZbMF0gPSBDTlZfSU5UX1RPX0xJVFRMRShsdHYtPnUudTE2WzBdKTsKKworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0VOQ09ERV9BTEdfV0VQOiBrZXkoJWQpXG4iLCBrZXlfaWR4KTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0VOQ09ERV9BTEdfQ0NNUDoKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfRU5DT0RFX0FMR19DQ01QOiBrZXkoJWQpXG4iLCBrZXlfaWR4KTsKKwkJYnJlYWs7CisKKwljYXNlIElXX0VOQ09ERV9BTEdfTk9ORToKKwkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfRU5DT0RFX0FMR19OT05FOiBrZXkoJWQpXG4iLCBrZXlfaWR4KTsKKwkJc3dpdGNoIChrZXlfaWR4KSB7CisJCWNhc2UgMDoKKwkJCWlmIChtZW1jbXAoYWRkciwgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIsIEVUSF9BTEVOKSAhPSAwKSB7CisJCQkvL2lmIChhZGRyICE9IE5VTEwpIHsKKwkJCQlsdHYtPmxlbiA9IDc7CisJCQkJbHR2LT50eXAgPSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWTsKKwkJCQltZW1jcHkoJmx0di0+dS51OFswXSwgYWRkciwgRVRIX0FMRU4pOworCQkJCXJldCA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJCS8qIENsZWFyIHRoZSBHcm91cCBUS0lQIGtleXMgYnkgaW5kZXggKi8KKwkJCWx0di0+bGVuID0gMjsKKwkJCWx0di0+dHlwID0gQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZOworCQkJbHR2LT51LnUxNlswXSA9IGtleV9pZHg7CisKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0VOQ09ERV8/Pzoga2V5KCVkKVxuIiwga2V5X2lkeCk7CisJCWJyZWFrOworCX0KKworCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIGhlcm1lc19zZXRfa2V5CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworc3RhdGljIGludCB3aXJlbGVzc19zZXRfZW5jb2RlZXh0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludAkJCSAgICAgIHJldDsKKwlpbnQga2V5X2lkeCA9IChlcnEtPmZsYWdzJklXX0VOQ09ERV9JTkRFWCkgLSAxOworCWx0dl90IGx0djsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopa2V5YnVmOworCisJREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfZW5jb2RlZXh0IiApOworCURCR19FTlRFUiggRGJnSW5mbyApOworCisJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHNpemVvZihleHQtPnJ4X3NlcSkgIT0gOCkgeworCQlEQkdfVFJBQ0UoRGJnSW5mbywgInJ6X3NlcSBzaXplIG1pc21hdGNoXG4iKTsKKwkJREJHX0xFQVZFKERiZ0luZm8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBIYW5kbGUgV0VQIGtleXMgdmlhIHRoZSBvbGQgc2V0IGVuY29kZSBwcm9jZWR1cmUgKi8KKwlpZihleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworCQlzdHJ1Y3QgaXdfcG9pbnQgIHdlcF9lcnE7CisJCWNoYXIgICAgICAgICAgICAqd2VwX2tleWJ1ZjsKKworCQkvKiBCdWlsZCByZXF1ZXN0IHN0cnVjdHVyZSAqLworCQl3ZXBfZXJxLmZsYWdzICA9IGVycS0+ZmxhZ3M7ICAgLy8gdGFrZSBvdmVyIGZsYWdzIHdpdGgga2V5IGluZGV4CisJCXdlcF9lcnEubGVuZ3RoID0gZXh0LT5rZXlfbGVuOyAvLyB0YWtlIGxlbmd0aCBmcm9tIGV4dGVuZGVkIGtleSBpbmZvCisJCXdlcF9rZXlidWYgICAgID0gZXh0LT5rZXk7ICAgICAvLyBwb2ludGVyIHRvIHRoZSBrZXkgdGV4dAorCisJCS8qIENhbGwgd2lyZWxlc3Nfc2V0X2VuY29kZSB0b3QgaGFuZGxlIHRoZSBXRVAga2V5ICovCisJCXJldCA9IHdpcmVsZXNzX3NldF9lbmNvZGUoZGV2LCBpbmZvLCAmd2VwX2VycSwgd2VwX2tleWJ1Zik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFByb2NlZWQgZm9yIGV4dGVuZGVkIGVuY29kZSBmdW5jdGlvbnMgZm9yIFdBUCBhbmQgTk9ORSAqLworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCW1lbXNldCgmbHR2LCAwLCBzaXplb2YobHR2KSk7CisJcmV0ID0gaGVybWVzX3NldF9rZXkoJmx0diwgZXh0LT5hbGcsIGtleV9pZHgsIGV4dC0+YWRkci5zYV9kYXRhLAorCQkJCWV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZLAorCQkJCWV4dC0+cnhfc2VxLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKKworCWlmIChyZXQgIT0gMCkgeworCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJoZXJtZXNfc2V0X2tleSByZXR1cm5lZCAhPSAwLCBrZXkgbm90IHNldFxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBQdXQgdGhlIGtleSBpbiBIQ0YgKi8KKwlyZXQgPSBoY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwgKExUVlApJmx0dik7CisKK291dF91bmxvY2s6CisJaWYocmV0ID09IEhDRl9TVUNDRVNTKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIlB1dCBrZXkgaW5mbyBzdWNjZXNcbiIpOworCX0gZWxzZSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIlB1dCBrZXkgaW5mbyBmYWlsZWQsIGtleSBub3Qgc2V0XG4iKTsKKwl9CisKKyAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKworCXdsX3VubG9jayhscCwgJmZsYWdzKTsKKworb3V0OgorCURCR19MRUFWRSggRGJnSW5mbyApOworCXJldHVybiByZXQ7Cit9IC8vIHdpcmVsZXNzX3NldF9lbmNvZGVleHQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCitzdGF0aWMgaW50IHdpcmVsZXNzX2dldF9nZW5pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCit7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICAgcmV0ID0gMDsKKwlsdHZfdCBsdHY7CisKKwlEQkdfRlVOQyggIndpcmVsZXNzX2dldF9nZW5pZSIgKTsKKwlEQkdfRU5URVIoIERiZ0luZm8gKTsKKworCWlmKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKworICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKKworCW1lbXNldCgmbHR2LCAwLCBzaXplb2YobHR2KSk7CisJbHR2LmxlbiA9IDI7CisJbHR2LnR5cCA9IENGR19TRVRfV1BBX0FVVEhfS0VZX01HTVRfU1VJVEU7CisJbHAtPkF1dGhLZXlNZ210U3VpdGUgPSBsdHYudS51MTZbMF0gPSA0OworCWx0di51LnUxNlswXSAgPSBDTlZfSU5UX1RPX0xJVFRMRShsdHYudS51MTZbMF0pOworCisJcmV0ID0gaGNmX3B1dF9pbmZvKCYobHAtPmhjZkN0eCksIChMVFZQKSZsdHYpOworCisgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CisKKwl3bF91bmxvY2sobHAsICZmbGFncyk7CisKK291dDoKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcmV0OworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUID4gMTcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dpcmVsZXNzX3N0YXRzKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IGRldmljZSB3aXJlbGVzcyBzdGF0aXN0aWNzLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBpd19zdGF0aXN0aWNzICogd2xfd2lyZWxlc3Nfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCBpd19zdGF0aXN0aWNzICAgICpwU3RhdHM7CisJc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJREJHX0ZVTkMoICJ3bF93aXJlbGVzc19zdGF0cyIgKTsKKwlEQkdfRU5URVIoRGJnSW5mbyk7CisJREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOworCisJcFN0YXRzID0gTlVMTDsKKworCS8qIEluaXRpYWxpemUgdGhlIHN0YXRpc3RpY3MgKi8KKwlwU3RhdHMJCQk9ICYoIGxwLT53c3RhdHMgKTsKKwlwU3RhdHMtPnF1YWwudXBkYXRlZCAgICA9IDB4MDA7CisKKwlpZiggISggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkpCisJeworCQlDRkdfQ09NTVNfUVVBTElUWV9TVFJDVCAqcFF1YWw7CisJCUNGR19IRVJNRVNfVEFMTElFU19TVFJDVCB0YWxsaWVzOworCQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOworCisJCS8qIFVwZGF0ZSBkcml2ZXIgc3RhdHVzICovCisJCXBTdGF0cy0+c3RhdHVzID0gMDsKKworCQkvKiBHZXQgdGhlIGN1cnJlbnQgbGluayBxdWFsaXR5IGluZm9ybWF0aW9uICovCisJCWxwLT5sdHZSZWNvcmQubGVuID0gMSArICggc2l6ZW9mKCAqcFF1YWwgKSAvIHNpemVvZiggaGNmXzE2ICkpOworCQlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DT01NU19RVUFMSVRZOworCQlzdGF0dXMgPSBoY2ZfZ2V0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKKworCQlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQkJcFF1YWwgPSAoQ0ZHX0NPTU1TX1FVQUxJVFlfU1RSQ1QgKikmKCBscC0+bHR2UmVjb3JkICk7CisKKyNpZmRlZiBVU0VfREJNCisJCQlwU3RhdHMtPnF1YWwucXVhbCAgPSAodV9jaGFyKSBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPmNvbXNfcXVhbCApOworCQkJcFN0YXRzLT5xdWFsLmxldmVsID0gKHVfY2hhcikgZGJtKCBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPnNpZ25hbF9sdmwgKSk7CisJCQlwU3RhdHMtPnF1YWwubm9pc2UgPSAodV9jaGFyKSBkYm0oIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+bm9pc2VfbHZsICkpOworCisJCQlwU3RhdHMtPnF1YWwudXBkYXRlZCB8PSAoSVdfUVVBTF9RVUFMX1VQREFURUQgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX0xFVkVMX1VQREFURUQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX1FVQUxfTk9JU0VfVVBEQVRFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9EQk0pOworI2Vsc2UKKwkJCXBTdGF0cy0+cXVhbC5xdWFsID0gcGVyY2VudCggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5jb21zX3F1YWwgKSwKKwkJCQkJCSAgICAgSENGX01JTl9DT01NX1FVQUxJVFksCisJCQkJCQkgICAgIEhDRl9NQVhfQ09NTV9RVUFMSVRZICk7CisKKwkJCXBTdGF0cy0+cXVhbC5sZXZlbCA9IHBlcmNlbnQoIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+c2lnbmFsX2x2bCApLAorCQkJCQkJICAgICAgSENGX01JTl9TSUdOQUxfTEVWRUwsCisJCQkJCQkgICAgICBIQ0ZfTUFYX1NJR05BTF9MRVZFTCApOworCisJCQlwU3RhdHMtPnF1YWwubm9pc2UgPSBwZXJjZW50KCBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPm5vaXNlX2x2bCApLAorCQkJCQkJICAgICAgSENGX01JTl9OT0lTRV9MRVZFTCwKKwkJCQkJCSAgICAgIEhDRl9NQVhfTk9JU0VfTEVWRUwgKTsKKworCQkJcFN0YXRzLT5xdWFsLnVwZGF0ZWQgfD0gKElXX1FVQUxfUVVBTF9VUERBVEVEICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9MRVZFTF9VUERBVEVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX05PSVNFX1VQREFURUQpOworI2VuZGlmIC8qIFVTRV9EQk0gKi8KKwkJfSBlbHNlIHsKKwkJCW1lbXNldCggJiggcFN0YXRzLT5xdWFsICksIDAsIHNpemVvZiggcFN0YXRzLT5xdWFsICkpOworCQl9CisKKwkJLyogR2V0IHRoZSBjdXJyZW50IHRhbGxpZXMgZnJvbSB0aGUgYWRhcHRlciAqLworICAgICAgICAgICAgICAgIC8qIE9ubHkgcG9zc2libGUgd2hlbiB0aGUgZGV2aWNlIGlzIG9wZW4gKi8KKwkJaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJCQlpZiggd2xfZ2V0X3RhbGxpZXMoIGxwLCAmdGFsbGllcyApID09IDAgKSB7CisJCQkJLyogTm8gZW5kaWFuIHRyYW5zbGF0aW9uIGlzIG5lZWRlZCBoZXJlLCBhcyBDRkdfVEFMTElFUyBpcyBhbgorCQkJCSAgIE1TRiBSSUQ7IGFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgb24gdGhlIGhvc3QsIG5vdCB0aGUgY2FyZCEgKi8KKwkJCQlwU3RhdHMtPmRpc2NhcmQubndpZCA9IDBMOworCQkJCXBTdGF0cy0+ZGlzY2FyZC5jb2RlID0gdGFsbGllcy5SeFdFUFVuZGVjcnlwdGFibGU7CisJCQkJcFN0YXRzLT5kaXNjYXJkLm1pc2MgPSB0YWxsaWVzLlR4RGlzY2FyZHMgKworCQkJCQkJICAgICAgIHRhbGxpZXMuUnhGQ1NFcnJvcnMgKworCQkJCQkJICAgICAgIC8vdGFsbGllcy5SeERpc2NhcmRzTm9CdWZmZXIgKworCQkJCQkJICAgICAgIHRhbGxpZXMuVHhEaXNjYXJkc1dyb25nU0E7CisJCQkJLy87PyBFeHRyYSB0YWtlbiBvdmVyIGZyb20gTGludXggZHJpdmVyIGJhc2VkIG9uIDcuMTggdmVyc2lvbgorCQkJCXBTdGF0cy0+ZGlzY2FyZC5yZXRyaWVzID0gdGFsbGllcy5UeFJldHJ5TGltaXRFeGNlZWRlZDsKKwkJCQlwU3RhdHMtPmRpc2NhcmQuZnJhZ21lbnQgPSB0YWxsaWVzLlJ4TXNnSW5CYWRNc2dGcmFnbWVudHM7CisJCQl9IGVsc2UgeworCQkJCW1lbXNldCggJiggcFN0YXRzLT5kaXNjYXJkICksIDAsIHNpemVvZiggcFN0YXRzLT5kaXNjYXJkICkpOworCQkJfQorCQl9IGVsc2UgeworCQkJbWVtc2V0KCAmKCBwU3RhdHMtPmRpc2NhcmQgKSwgMCwgc2l6ZW9mKCBwU3RhdHMtPmRpc2NhcmQgKSk7CisJCX0KKwl9CisKKwlEQkdfTEVBVkUoIERiZ0luZm8gKTsKKwlyZXR1cm4gcFN0YXRzOworfSAvLyB3bF93aXJlbGVzc19zdGF0cworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX2dldF93aXJlbGVzc19zdGF0cygpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugd2lyZWxlc3Mgc3RhdGlzdGljcy4gVGhpcyBmdW5jdGlvbiBjYWxscworICogICAgICB3bF93aXJlbGVzc19zdGF0cywgYnV0IGFjcXVpcmVzIHNwaW5sb2NrcyBmaXJzdCBhcyBpdCBjYW4gYmUgY2FsbGVkCisgKiAgICAgIGRpcmVjdGx5IGJ5IHRoZSBuZXR3b3JrIGxheWVyLgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgd3JxIC0gdGhlIHdpcmVsZXNzIHJlcXVlc3QgYnVmZmVyCisgKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBpd19zdGF0aXN0aWNzICogd2xfZ2V0X3dpcmVsZXNzX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSB3bF9wcml2KGRldik7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgICAgKnBTdGF0cyA9IE5VTEw7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJREJHX0ZVTkMoICJ3bF9nZXRfd2lyZWxlc3Nfc3RhdHMiICk7CisJREJHX0VOVEVSKERiZ0luZm8pOworCisJd2xfbG9jayggbHAsICZmbGFncyApOworCisgICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOworCisjaWZkZWYgVVNFX1JUUworCWlmKCBscC0+dXNlUlRTID09IDEgKSB7CisJCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIHdpcmVsZXNzIHN0YXRzLCBpbiBSVFMgbW9kZVxuIiApOworCX0gZWxzZQorI2VuZGlmCisJeworCQlwU3RhdHMgPSB3bF93aXJlbGVzc19zdGF0cyggZGV2ICk7CisJfQorICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCisJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOworCisJREJHX0xFQVZFKCBEYmdJbmZvICk7CisJcmV0dXJuIHBTdGF0czsKK30gLy8gd2xfZ2V0X3dpcmVsZXNzX3N0YXRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3NweV9nYXRoZXIoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBHYXRoZXIgd2lyZWxlc3Mgc3B5IHN0YXRpc3RpY3MuCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICB3cnEgLSB0aGUgd2lyZWxlc3MgcmVxdWVzdCBidWZmZXIKKyAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiAgUkVUVVJOUzoKKyAqCisgKiAgICAgIDAgb24gc3VjY2VzcworICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW5saW5lIHZvaWQgd2xfc3B5X2dhdGhlciggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICptYWMgKQoreworCXN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJdV9jaGFyICAgICAgICAgICAgICAgICAgc3RhdHNbMl07CisJREVTQ19TVFJDVCAgICAgICAgICAgICAgZGVzY1sxXTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkvKiBzaG9ydGN1dCAqLworCWlmICghbHAtPnNweV9kYXRhLnNweV9udW1iZXIpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIEdhdGhlciB3aXJlbGVzcyBzcHkgc3RhdGlzdGljczogZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKwkgICBhZGRyZXNzIHdpdGggb3V0IGxpc3QsIGFuZCBpZiBtYXRjaCwgZ2V0IHRoZSBzdGF0cy4gKi8KKwltZW1zZXQoIHN0YXRzLCAwLCBzaXplb2Yoc3RhdHMpKTsKKwltZW1zZXQoIGRlc2MsIDAsIHNpemVvZihERVNDX1NUUkNUKSk7CisKKwlkZXNjWzBdLmJ1Zl9hZGRyCT0gc3RhdHM7CisJZGVzY1swXS5CVUZfU0laRQk9IHNpemVvZihzdGF0cyk7CisJZGVzY1swXS5uZXh0X2Rlc2NfYWRkciAgPSAwOwkJLy8gdGVybWluYXRlIGxpc3QKKworCXN0YXR1cyA9IGhjZl9yY3ZfbXNnKCAmKCBscC0+aGNmQ3R4ICksICZkZXNjWzBdLCAwICk7CisKKwlpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgeworCQl3c3RhdHMubGV2ZWwgPSAodV9jaGFyKSBkYm0oc3RhdHNbMV0pOworCQl3c3RhdHMubm9pc2UgPSAodV9jaGFyKSBkYm0oc3RhdHNbMF0pOworCQl3c3RhdHMucXVhbCAgPSB3c3RhdHMubGV2ZWwgPiB3c3RhdHMubm9pc2UgPyB3c3RhdHMubGV2ZWwgLSB3c3RhdHMubm9pc2UgOiAwOworCisJCXdzdGF0cy51cGRhdGVkID0gKElXX1FVQUxfUVVBTF9VUERBVEVEICB8CisJCQkJICBJV19RVUFMX0xFVkVMX1VQREFURUQgfAorCQkJCSAgSVdfUVVBTF9OT0lTRV9VUERBVEVEIHwKKwkJCQkgIElXX1FVQUxfREJNKTsKKworCQl3aXJlbGVzc19zcHlfdXBkYXRlKCBkZXYsIG1hYywgJndzdGF0cyApOworCX0KK30gLy8gd2xfc3B5X2dhdGhlcgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfZnJlcSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgdGhlIGNoYW5uZWwvZnJlcQorICogICAgICBjb25maWd1cmF0aW9uIGZvciBhIHNwZWNpZmljIGRldmljZSBoYXMgY2hhbmdlZC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X2ZyZXEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCXdycXUuZnJlcS5tID0gbHAtPkNoYW5uZWw7CisJd3JxdS5mcmVxLmUgPSAwOworCisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXRlJFUSwgJndycXUsIE5VTEwgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X2ZyZXEKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X21vZGUoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IHRoZSBtb2RlIG9mIG9wZXJhdGlvbgorICogICAgICBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgaGFzIGNoYW5nZWQuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9tb2RlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CisJCXdycXUubW9kZSA9IElXX01PREVfSU5GUkE7CisJfSBlbHNlIHsKKwkJd3JxdS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJfQorCisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXTU9ERSwgJndycXUsIE5VTEwgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X21vZGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X2Vzc2lkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCB0aGUgRVNTSUQgY29uZmlndXJhdGlvbiBmb3IKKyAqICAgICAgYSBzcGVjaWZpYyBkZXZpY2UgaGFzIGNoYW5nZWQuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9lc3NpZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTMKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJLyogRmlsbCBvdXQgdGhlIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBidWZmZXIgZG9lc24ndCBhY3R1YWxseSBjb250YWluIHRoZQorCSAgIEVTU0lELCBidXQgYSBwb2ludGVyIHRvIHRoZSBjb250ZW50cy4gSW4gYWRkaXRpb24sIHRoZSAnZXh0cmEnIGZpZWxkIG9mCisJICAgdGhlIGNhbGwgdG8gd2lyZWxlc3Nfc2VuZF9ldmVudCgpIG11c3QgYWxzbyBwb2ludCB0byB3aGVyZSB0aGUgRVNTSUQKKwkgICBsaXZlcyAqLworCXdycXUuZXNzaWQubGVuZ3RoICA9IHN0cmxlbiggbHAtPk5ldHdvcmtOYW1lICk7CisJd3JxdS5lc3NpZC5wb2ludGVyID0gKGNhZGRyX3QpbHAtPk5ldHdvcmtOYW1lOworCXdycXUuZXNzaWQuZmxhZ3MgICA9IDE7CisKKwl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NTSVdFU1NJRCwgJndycXUsIGxwLT5OZXR3b3JrTmFtZSApOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfZXNzaWQKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X2VuY29kZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgdGhlIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbgorICogICAgICBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgaGFzIGNoYW5nZWQuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9lbmNvZGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDEzCisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgaW5kZXggPSAwOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJaWYoIGxwLT5FbmFibGVFbmNyeXB0aW9uID09IDAgKSB7CisJCXdycXUuZW5jb2RpbmcuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJfSBlbHNlIHsKKwkJd3JxdS5lbmNvZGluZy5mbGFncyB8PSBscC0+VHJhbnNtaXRLZXlJRDsKKworCQlpbmRleCA9IGxwLT5UcmFuc21pdEtleUlEIC0gMTsKKworCQkvKiBPbmx5IHNldCBJV19FTkNPREVfUkVTVFJJQ1RFRC9PUEVOIGZsYWcgdXNpbmcgbHAtPkV4Y2x1ZGVVbmVuY3J5cHRlZAorCQkgICBpZiB3ZSdyZSBpbiBBUCBtb2RlICovCisjaWYgMSAvLzs/IChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9BUAorCQkvLzs/c2hvdWxkIHdlIHJlc3RvcmUgdGhpcyB0byBhbGxvdyBzbWFsbGVyIG1lbW9yeSBmb290cHJpbnQKKworCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX0FQICApIHsKKwkJCWlmKCBscC0+RXhjbHVkZVVuZW5jcnlwdGVkICkgeworCQkJCXdycXUuZW5jb2RpbmcuZmxhZ3MgfD0gSVdfRU5DT0RFX1JFU1RSSUNURUQ7CisJCQl9IGVsc2UgeworCQkJCXdycXUuZW5jb2RpbmcuZmxhZ3MgfD0gSVdfRU5DT0RFX09QRU47CisJCQl9CisJCX0KKworI2VuZGlmICAvLyBIQ0ZfVFlQRV9BUAorCisJCS8qIE9ubHkgcHJvdmlkZSB0aGUga2V5IGlmIHBlcm1pc3Npb25zIGFsbG93ICovCisJCWlmKCBjYXBhYmxlKCBDQVBfTkVUX0FETUlOICkpIHsKKwkJCXdycXUuZW5jb2RpbmcucG9pbnRlciA9IChjYWRkcl90KWxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmtleTsKKwkJCXdycXUuZW5jb2RpbmcubGVuZ3RoICA9IGxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbjsKKwkJfSBlbHNlIHsKKwkJCXdycXUuZW5jb2RpbmcuZmxhZ3MgfD0gSVdfRU5DT0RFX05PS0VZOworCQl9CisJfQorCisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXRU5DT0RFLCAmd3JxdSwKKwkJCQkJCSBscC0+RGVmYXVsdEtleXMua2V5W2luZGV4XS5rZXkgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X2VuY29kZQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCXdsX3dleHRfZXZlbnRfYXAoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IHRoZSBkZXZpY2UgaGFzIGJlZW4KKyAqICAgICAgYXNzb2NpYXRlZCB0byBhIG5ldyBBUC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X2FwKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJaW50IHN0YXR1czsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCS8qIFJldHJpZXZlIHRoZSBXUEEtSUVzIHVzZWQgYnkgdGhlIGZpcm13YXJlIGFuZCBzZW5kIGFuIGV2ZW50LiBXZSBtdXN0IHNlbmQKKwkgICB0aGlzIGV2ZW50IEJFRk9SRSBzZW5kaW5nIHRoZSBhc3NvY2lhdGlvbiBldmVudCwgYXMgdGhlcmUgYXJlIHRpbWluZworCSAgIGlzc3VlcyB3aXRoIHRoZSBob3N0YXAgc3VwcGxpY2FudC4gVGhlIHN1cHBsaWNhbnQgd2lsbCBhdHRlbXB0IHRvIHByb2Nlc3MKKwkgICBhbiBFQVBPTC1LZXkgZnJhbWUgZnJvbSBhbiBBUCBiZWZvcmUgcmVjZWl2aW5nIHRoaXMgaW5mb3JtYXRpb24sIHdoaWNoCisJICAgaXMgcmVxdWlyZWQgcHJvcGVybHkgcHJvY2VzcyB0aGUgc2FpZCBmcmFtZS4gKi8KKwl3bF93ZXh0X2V2ZW50X2Fzc29jX2llKCBkZXYgKTsKKworCS8qIEdldCB0aGUgQlNTSUQgKi8KKwlscC0+bHR2UmVjb3JkLnR5cCA9IENGR19DVVJfQlNTSUQ7CisJbHAtPmx0dlJlY29yZC5sZW4gPSA0OworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApIHsKKwkJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCisJCW1lbWNweSggd3JxdS5hZGRyLnNhX2RhdGEsIGxwLT5sdHZSZWNvcmQudS51OCwgRVRIX0FMRU4gKTsKKworCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCApOworCX0KKworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCisKKwlyZXR1cm47Cit9IC8vIHdsX3dleHRfZXZlbnRfYXAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCBhIHJlcXVlc3QgZm9yIGEgbmV0d29yayBzY2FuCisgKiAgICAgIGhhcyBjb21wbGV0ZWQuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxMworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X3NjYW5fY29tcGxldGUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgl3bF93ZXh0X2V2ZW50X25ld19zdGEoKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgREVTQ1JJUFRJT046CisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhbiBldmVudCB0aGF0IGFuIEFQIGhhcyByZWdpc3RlcmVkIGEgbmV3CisgKiAgICAgIHN0YXRpb24uCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9uZXdfc3RhKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKyNpZiBXSVJFTEVTU19FWFQgPiAxNAorCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKworCS8qIFNlbmQgdGhlIHN0YXRpb24ncyBtYWMgYWRkcmVzcyBoZXJlICovCisJbWVtY3B5KCB3cnF1LmFkZHIuc2FfZGF0YSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4gKTsKKwl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cnF1LCBOVUxMICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTQgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9uZXdfc3RhCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9leHBpcmVkX3N0YSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IHRoYXQgYW4gQVAgaGFzIGRlcmVnaXN0ZXJlZCBhCisgKiAgICAgIHN0YXRpb24uCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9leHBpcmVkX3N0YSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7CisKKwltZW1jcHkoIHdycXUuYWRkci5zYV9kYXRhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTiApOworCXdycXUuYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBJV0VWRVhQSVJFRCwgJndycXUsIE5VTEwgKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNCAqLworCisJcmV0dXJuOworfSAvLyB3bF93ZXh0X2V2ZW50X2V4cGlyZWRfc3RhCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkKCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERFU0NSSVBUSU9OOgorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYW4gZXZlbnQgdGhhdCBNSUMgY2FsY3VsYXRpb25zIGZhaWxlZC4KKyAqCisgKgorICogIFBBUkFNRVRFUlM6CisgKgorICogICAgICBkZXYgLSB0aGUgbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgdG8gYmUgaXNzdWVkCisgKgorICogIFJFVFVSTlM6CisgKgorICogICAgICBOL0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3bF93ZXh0X2V2ZW50X21pY19mYWlsZWQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDE0CisJY2hhciAgICAgICAgICAgICAgIG1zZ1s1MTJdOworCXVuaW9uIGl3cmVxX2RhdGEgICB3cnF1OworCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKKwlpbnQgICAgICAgICAgICAgICAga2V5X2lkeDsKKwljaGFyICAgICAgICAgICAgICAqYWRkcjE7CisJY2hhciAgICAgICAgICAgICAgKmFkZHIyOworCVdWTEFOX1JYX1dNUF9IRFIgICpoZHI7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKwlrZXlfaWR4ID0gbHAtPmxvb2tBaGVhZEJ1ZltIRlNfU1RBVCsxXSA+PiAzOworCWtleV9pZHggJj0gMHgwMzsKKworCS8qIENhc3QgdGhlIGxvb2thaGVhZCBidWZmZXIgaW50byBhIFJGUyBmb3JtYXQgKi8KKwloZHIgPSAoV1ZMQU5fUlhfV01QX0hEUiAqKSZscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUXTsKKworCS8qIENhc3QgdGhlIGFkZHJlc3NlcyB0byBieXRlIGJ1ZmZlcnMsIGFzIGluIHRoZSBhYm92ZSBSRlMgdGhleSBhcmUgd29yZAorCSAgIGxlbmd0aCAqLworCWFkZHIxID0gKGNoYXIgKiloZHItPmFkZHJlc3MxOworCWFkZHIyID0gKGNoYXIgKiloZHItPmFkZHJlc3MyOworCisJREJHX1BSSU5UKCAiTUlDIEZBSUwgLSBLRVkgVVNFRCA6ICVkLCBTVEFUVVMgOiAweCUwNHhcbiIsIGtleV9pZHgsCisJCQkgICBoZHItPnN0YXR1cyApOworCisJbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOworCW1lbXNldCggbXNnLCAwLCBzaXplb2YoIG1zZyApKTsKKworCisJLyogQmVjdWFzZSBNSUMgZmFpbHVyZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zIHlldCwgdGhleQorCSAgIG11c3QgYmUgcGFzc2VkIGFzIGEgc3RyaW5nIHVzaW5nIGFuIElXRVZDVVNUT00gZXZlbnQuIEluIG9yZGVyIGZvciB0aGUKKwkgICBldmVudCB0byBiZSBlZmZlY3RpdmUsIHRoZSBzdHJpbmcgZm9ybWF0IG11c3QgYmUga25vd24gYnkgYm90aCB0aGUKKwkgICBkcml2ZXIgYW5kIHRoZSBzdXBwbGljYW50LiBUaGUgZm9sbG93aW5nIGlzIHRoZSBzdHJpbmcgZm9ybWF0IHVzZWQgYnkgdGhlCisJICAgaG9zdGFwIHByb2plY3QncyBXUEEgc3VwcGxpY2FudCwgYW5kIHdpbGwgYmUgdXNlZCBoZXJlIHVudGlsIHRoZSBXaXJlbGVzcworCSAgIEV4dGVuc2lvbnMgaW50ZXJmYWNlIGFkZHMgdGhpcyBzdXBwb3J0OgorCisJICAgTUxNRS1NSUNIQUVMTUlDRkFJTFVSRS5pbmRpY2F0aW9uKGtleWlkPSMgYnJvYWRjYXN0L3VuaWNhc3QgYWRkcj1hZGRyMikKKyAgICovCisKKwkvKiBOT1RFOiBGb3JtYXQgb2YgTUFDIGFkZHJlc3MgKHVzaW5nIGNvbG9ucyB0byBzZXBlcmF0ZSBieXRlcykgbWF5IGNhdXNlCisJCQkgYSBwcm9ibGVtIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgc3VwcGxpY2FudCwgaWYgdGhleSBldmVyCisJCQkgYWN0dWFsbHkgcGFyc2UgdGhlc2UgcGFyYW1ldGVycyAqLworI2lmIERCRworCXNwcmludGYoIG1zZywgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbihrZXlpZD0lZCAlc2Nhc3QgYWRkcj0iCisJCQkgIiVzKSIsIGtleV9pZHgsIGFkZHIxWzBdICYgMHgwMSA/ICJicm9hZCIgOiAidW5pIiwKKwkJCSBEYmdId0FkZHIoIGFkZHIyICkpOworI2VuZGlmCisJd3JxdS5kYXRhLmxlbmd0aCA9IHN0cmxlbiggbXNnICk7CisJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgbXNnICk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTQgKi8KKworCXJldHVybjsKK30gLy8gd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJd2xfd2V4dF9ldmVudF9hc3NvY19pZSgpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBERVNDUklQVElPTjoKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIFdQQS1JRSBnZW5lcmF0ZWQKKyAqICAgICAgYnkgdGhlIGZpcm13YXJlIGluIGFuIGFzc29jaWF0aW9uIHJlcXVlc3QuCisgKgorICoKKyAqICBQQVJBTUVURVJTOgorICoKKyAqICAgICAgZGV2IC0gdGhlIG5ldHdvcmsgZGV2aWNlIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIHRvIGJlIGlzc3VlZAorICoKKyAqICBSRVRVUk5TOgorICoKKyAqICAgICAgTi9BCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2xfd2V4dF9ldmVudF9hc3NvY19pZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisjaWYgV0lSRUxFU1NfRVhUID4gMTQKKwljaGFyICAgICAgICAgICAgICAgbXNnWzUxMl07CisJdW5pb24gaXdyZXFfZGF0YSAgIHdycXU7CisJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOworCWludCBzdGF0dXM7CisJUFJPQkVfUkVTUCAgICAgICAgIGRhdGE7CisJaGNmXzE2ICAgICAgICAgICAgIGxlbmd0aDsKKwloY2ZfOCAgICAgICAgICAgICAgKndwYV9pZTsKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCW1lbXNldCggJndycXUsIDAsIHNpemVvZiggd3JxdSApKTsKKwltZW1zZXQoIG1zZywgMCwgc2l6ZW9mKCBtc2cgKSk7CisKKwkvKiBSZXRyaWV2ZSB0aGUgQXNzb2NpYXRpb24gUmVxdWVzdCBJRSAqLworCWxwLT5sdHZSZWNvcmQubGVuID0gNDU7CisJbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfQ1VSX0FTU09DX1JFUV9JTkZPOworCisJc3RhdHVzID0gaGNmX2dldF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CisJaWYoIHN0YXR1cyA9PSBIQ0ZfU1VDQ0VTUyApCisJeworCQlsZW5ndGggPSAwOworCQltZW1jcHkoICZkYXRhLnJhd0RhdGEsICYoIGxwLT5sdHZSZWNvcmQudS51OFsxXSApLCA4OCApOworCQl3cGFfaWUgPSB3bF9wYXJzZV93cGFfaWUoICZkYXRhLCAmbGVuZ3RoICk7CisKKwkJLyogQmVjdWFzZSB0aGlzIGV2ZW50IChBc3NvY2lhdGlvbiBXUEEtSUUpIGlzIG5vdCBwYXJ0IG9mIHRoZSBXaXJlbGVzcworCQlFeHRlbnNpb25zIHlldCwgaXQgbXVzdCBiZSBwYXNzZWQgYXMgYSBzdHJpbmcgdXNpbmcgYW4gSVdFVkNVU1RPTSBldmVudC4KKwkJSW4gb3JkZXIgZm9yIHRoZSBldmVudCB0byBiZSBlZmZlY3RpdmUsIHRoZSBzdHJpbmcgZm9ybWF0IG11c3QgYmUga25vd24KKwkJYnkgYm90aCB0aGUgZHJpdmVyIGFuZCB0aGUgc3VwcGxpY2FudC4gVGhlIGZvbGxvd2luZyBpcyB0aGUgc3RyaW5nIGZvcm1hdAorCQl1c2VkIGJ5IHRoZSBob3N0YXAgcHJvamVjdCdzIFdQQSBzdXBwbGljYW50LCBhbmQgd2lsbCBiZSB1c2VkIGhlcmUgdW50aWwKKwkJdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgaW50ZXJmYWNlIGFkZHMgdGhpcyBzdXBwb3J0OgorCisJCUFTU09DSU5GTyhSZXFJRXM9V1BBLUlFIFJlc3BJRXM9V1BBLUlFKQorCQkqLworCisJCWlmKCBsZW5ndGggIT0gMCApCisJCXsKKwkJCXNwcmludGYoIG1zZywgIkFTU09DSU5GTyhSZXFJRXM9JXMpIiwgd2xfcHJpbnRfd3BhX2llKCB3cGFfaWUsIGxlbmd0aCApKTsKKwkJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgbXNnICk7CisJCX0KKwl9CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTQgKi8KKworCXJldHVybjsKK30gIC8vIHdsX3dleHRfZXZlbnRfYXNzb2NfaWUKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgd2xfaGFuZGxlcltdID0KK3sKKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfY29tbWl0LCAgICAgICAgICAgLyogU0lPQ1NJV0NPTU1JVCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcHJvdG9jb2wsICAgICAvKiBTSU9DR0lXTkFNRSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTldJRCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfZnJlcXVlbmN5LCAgICAvKiBTSU9DU0lXRlJFUSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfZnJlcXVlbmN5LCAgICAvKiBTSU9DR0lXRlJFUSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcG9ydHR5cGUsICAgICAvKiBTSU9DU0lXTU9ERSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcG9ydHR5cGUsICAgICAvKiBTSU9DR0lXTU9ERSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfc2Vuc2l0aXZpdHksICAvKiBTSU9DU0lXU0VOUyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfc2Vuc2l0aXZpdHksICAvKiBTSU9DR0lXU0VOUyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMICwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkFOR0UgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3JhbmdlLCAgICAgICAgLyogU0lPQ0dJV1JBTkdFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwgLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdQUklWICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwgLyoga2VybmVsIGNvZGUgKi8sICAgIC8qIFNJT0NHSVdQUklWICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwgLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTVEFUUyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXU1RBVFMgKi8KKyAgICAgICAgICAgICAgICBpd19oYW5kbGVyX3NldF9zcHksICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLworICAgICAgICAgICAgICAgIGl3X2hhbmRsZXJfZ2V0X3NweSwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXU1BZICovCisgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdUSFJTUFkgKi8KKyAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RIUlNQWSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQVAgKi8KKyNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfYnNzaWQsICAgICAgICAvKiBTSU9DR0lXQVAgKi8KKyNlbHNlCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUCAqLworI2VuZGlmCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9hcF9saXN0LCAgICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3NjYW4sICAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3NjYW4sICAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2Vzc2lkLCAgICAgICAgLyogU0lPQ1NJV0VTU0lEICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9lc3NpZCwgICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfbmlja25hbWUsICAgICAvKiBTSU9DU0lXTklDS04gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X25pY2tuYW1lLCAgICAgLyogU0lPQ0dJV05JQ0tOICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcmF0ZSwgICAgICAgICAvKiBTSU9DU0lXUkFURSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcmF0ZSwgICAgICAgICAvKiBTSU9DR0lXUkFURSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZCwvKiBTSU9DU0lXUlRTICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9ydHNfdGhyZXNob2xkLC8qIFNJT0NHSVdSVFMgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0ZSQUcgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF90eF9wb3dlciwgICAgIC8qIFNJT0NHSVdUWFBPVyAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9lbmNvZGUsICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2VuY29kZSwgICAgICAgLyogU0lPQ0dJV0VOQ09ERSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcG93ZXIsICAgICAgICAvKiBTSU9DU0lXUE9XRVIgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3Bvd2VyLCAgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfZ2VuaWUsICAgICAgICAvKiBTSU9DU0lXR0VOSUUgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0dFTklFICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9hdXRoLCAgICAgICAgIC8qIFNJT0NTSVdBVVRIICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBVVRIICovCisgICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9lbmNvZGVleHQsICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0VOQ09ERUVYVCAqLworICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgKi8KKyAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgd2xfcHJpdmF0ZV9oYW5kbGVyW10gPQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DSVdGSVJTVFBSSVYgKyAqLworICAgICAgICAgICAgICAgIHd2bGFuX3NldF9uZXRuYW1lLCAgICAgICAgICAgICAgICAgICAgICAvKiAwOiBTSU9DU0lXTkVUTkFNRSAqLworICAgICAgICAgICAgICAgIHd2bGFuX2dldF9uZXRuYW1lLCAgICAgICAgICAgICAgICAgICAgICAvKiAxOiBTSU9DR0lXTkVUTkFNRSAqLworICAgICAgICAgICAgICAgIHd2bGFuX3NldF9zdGF0aW9uX25pY2tuYW1lLCAgICAgICAgICAgICAvKiAyOiBTSU9DU0lXU1RBTkFNRSAqLworICAgICAgICAgICAgICAgIHd2bGFuX2dldF9zdGF0aW9uX25pY2tuYW1lLCAgICAgICAgICAgICAvKiAzOiBTSU9DR0lXU1RBTkFNRSAqLworI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCisgICAgICAgICAgICAgICAgd3ZsYW5fc2V0X3BvcnR0eXBlLCAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IFNJT0NTSVdQT1JUVFlQRSAqLworICAgICAgICAgICAgICAgIHd2bGFuX2dldF9wb3J0dHlwZSwgICAgICAgICAgICAgICAgICAgICAvKiA1OiBTSU9DR0lXUE9SVFRZUEUgKi8KKyNlbmRpZgorfTsKKworc3RydWN0IGl3X3ByaXZfYXJncyB3bF9wcml2X2FyZ3NbXSA9IHsKKyAgICAgICAge1NJT0NTSVdORVROQU1FLCAgICBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sIDAsICJzbmV0d29ya19uYW1lIiB9LAorICAgICAgICB7U0lPQ0dJV05FVE5BTUUsIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSENGX01BWF9OQU1FX0xFTiwgICAgImduZXR3b3JrX25hbWUiIH0sCisgICAgICAgIHtTSU9DU0lXU1RBTkFNRSwgICAgSVdfUFJJVl9UWVBFX0NIQVIgfCBIQ0ZfTUFYX05BTUVfTEVOLCAwLCAic3N0YXRpb25fbmFtZSIgfSwKKyAgICAgICAge1NJT0NHSVdTVEFOQU1FLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IEhDRl9NQVhfTkFNRV9MRU4sICAgICJnc3RhdGlvbl9uYW1lIiB9LAorI2lmIDEgLy87PyAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQQorICAgICAgICB7U0lPQ1NJV1BPUlRUWVBFLCAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNwb3J0X3R5cGUiIH0sCisgICAgICAgIHtTSU9DR0lXUE9SVFRZUEUsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAgICAiZ3BvcnRfdHlwZSIgfSwKKyNlbmRpZgorfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHdsX2l3X2hhbmRsZXJfZGVmID0KK3sKKyAgICAgICAgLm51bV9wcml2YXRlICAgICAgICA9IHNpemVvZih3bF9wcml2YXRlX2hhbmRsZXIpIC8gc2l6ZW9mKGl3X2hhbmRsZXIpLAorICAgICAgICAucHJpdmF0ZSAgICAgICAgICAgID0gKGl3X2hhbmRsZXIgKikgd2xfcHJpdmF0ZV9oYW5kbGVyLAorICAgICAgICAucHJpdmF0ZV9hcmdzICAgICAgID0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgd2xfcHJpdl9hcmdzLAorICAgICAgICAubnVtX3ByaXZhdGVfYXJncyAgID0gc2l6ZW9mKHdsX3ByaXZfYXJncykgLyBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisgICAgICAgIC5udW1fc3RhbmRhcmQgICAgICAgPSBzaXplb2Yod2xfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisgICAgICAgIC5zdGFuZGFyZCAgICAgICAgICAgPSAoaXdfaGFuZGxlciAqKSB3bF9oYW5kbGVyLAorICAgICAgICAuZ2V0X3dpcmVsZXNzX3N0YXRzID0gd2xfZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKworI2VuZGlmIC8vIFdJUkVMRVNTX0VYVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDM5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmgKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFnZXJlIFN5c3RlbXMgSW5jLgorICogV2lyZWxlc3MgZGV2aWNlIGRyaXZlciBmb3IgTGludXggKHdsYWdzNDkpLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KKyAqCisgKiBJbml0aWFsbHkgZGV2ZWxvcGVkIGJ5IFRyaXBsZVBvaW50LCBJbmMuCisgKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIEhlYWRlciBkZXNjcmliaW5nIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciB0aGUgd2lyZWxlc3MgSU9DVEwgaGFuZGxlcnMuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcworICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKKyAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogRGlzY2xhaW1lcgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQorICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KKyAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX1dMX1dFWFRfSF9fCisjZGVmaW5lIF9fV0xfV0VYVF9IX18KKworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBmdW5jdGlvbiBwcm90b3lwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBpd19zdGF0aXN0aWNzICp3bF93aXJlbGVzc19zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqIHdsX2dldF93aXJlbGVzc19zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCitpbmxpbmUgdm9pZCB3bF9zcHlfZ2F0aGVyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgKm1hYyk7CisKK3ZvaWQgd2xfd2V4dF9ldmVudF9mcmVxKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfbW9kZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X2Vzc2lkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfZW5jb2RlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfYXAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3ZvaWQgd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfbmV3X3N0YSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X2V4cGlyZWRfc3RhKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7Cit2b2lkIHdsX3dleHRfZXZlbnRfbWljX2ZhaWxlZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwordm9pZCB3bF93ZXh0X2V2ZW50X2Fzc29jX2llKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgd2xfaXdfaGFuZGxlcl9kZWY7CisKKyNlbHNlCisjZXJyb3IgV0lSRUxFU1NfRVhUCisjZW5kaWYgLy8gV0lSRUxFU1NfRVhUCisKKworI2VuZGlmICAvLyBfX1dMX1dFWFRfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGE4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvS2NvbmZpZwpAQCAtMCwwICsxLDkgQEAKK2NvbmZpZyBXTEFHUzQ5X0gyNQorCXRyaXN0YXRlICJMaW5rc3lzIEhFUk1FUyBJSS41IFdDRjU0R19XaXJlbGVzcy1HX0NvbXBhY3RGbGFzaF9DYXJkIgorCWRlcGVuZHMgb24gV0xBTl84MDIxMSAmJiBXSVJFTEVTU19FWFQgJiYgUENNQ0lBCisJc2VsZWN0IFdFWFRfU1BZCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciB3aXJlbGVzcyBjYXJkcyB1c2luZyBBZ2VyZSdzIEhFUk1FUyBJSS41IGNoaXBzZXQKKwkgIHdoaWNoIGFyZSBpZGVudGlmaWVkIHdpdGggTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwNAorCSAgVGhlIHNvZnR3YXJlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB3bF9sa21fNzIyX2FiZy50YXIuZ3oKKwkgIGZyb20gdGhlIEFnZXJlIFN5c3RlbXMgd2Vic2l0ZSwgYWRkYXB0ZWQgZm9yIFVidW50dSA5LjA0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjIzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvTWFrZWZpbGUKQEAgLTAsMCArMSw4MSBAQAorIworIyBNYWtlZmlsZSBmb3Igd2xhZ3M0OV9oMl9jcy5rbyBhbmQgd2xhZ3M0OV9oMjVfY3Mua28KKyMKKyMgRGVmYXVsdCBidWlsZCBmb3IgSGVybWVzLUlJIGJhc2UgY2FyZHMgKHBvc3NpYmx5IGlkZW50aWZpZWQgd2l0aAorIyAibWFuZmlkOiAweDAxNTYsIDB4MDAwMyIgaW4gInBjY2FyZGN0bCBpZGVudCIgb3V0cHV0KSwgY29tbWVudAorIyAtREhFUk1FUzI1IGJlbG93CisjCisjIElmIHlvdSB3YW50IHRvIGJ1aWxkIGZvciBIZXJtZXMtSUkuNSBiYXNlIGNhcmRzIChwb3NzaWJseSBpZGVudGlmaWVkIHdpdGgKKyMgIm1hbmZpZDogMHgwMTU2LCAweDAwMDQiIGluICJwY2NhcmRjdGwgaWRlbnQiIG91dHB1dCksIHVuY29tbWVudAorIyAtREhFUk1FUzI1IGJlbG93CisjCisjICBJZiB5b3Ugd2FudCB0byBidWlsZCBBUCBzdXBwb3J0ICh1bnRlc3RlZCksIGNvbW1lbnQgb3V0IC1EU1RBX09OTFkKKworSU5TVEFMTERJUiA6PSAvbGliL21vZHVsZXMvJChzaGVsbCB1bmFtZSAtcikva2VybmVsL2RyaXZlcnMvbmV0L3dpcmVsZXNzCitFWFRSQV9DRkxBR1MgKz0gLUkkKEtFUk5FTERJUikvaW5jbHVkZQorRVhUUkFfQ0ZMQUdTICs9IC1JJChzcmMpIFwKKwkJLURCVVNfUENNQ0lBIFwKKwkJLURVU0VfV1BBIFwKKwkJLURVU0VfV0VYVCBcCisJCS1EU1RBX09OTFkgXAorCQktRFdWTEFOXzQ5IFwKKwkJLURIRVJNRVMyNSBcCisjCQktRERCRyBcCisjCQktRERCR19MVkw9NSBcCisjCQktRFVTRV9VSUwgXAorIwkJLURVU0VfUFJPRklMRSBcCisKK2lmZXEgKCQoZmluZHN0cmluZyBIRVJNRVMyNSwkKEVYVFJBX0NGTEFHUykpLCkKK1dMTkFNRSA6PSB3bGFnczQ5X2gyX2NzCiskKFdMTkFNRSkteSA6PSBzdGFfaDIubworaWZlcSAoJChmaW5kc3RyaW5nIFNUQV9PTkxZLCQoRVhUUkFfQ0ZMQUdTKSksKQorJChXTE5BTUUpLXkgKz0gYXBfaDIubworZW5kaWYKK2Vsc2UKK1dMTkFNRT13bGFnczQ5X2gyNV9jcworJChXTE5BTUUpLXkgOj0gc3RhX2gyNS5vCitpZmVxICgkKGZpbmRzdHJpbmcgU1RBX09OTFksJChFWFRSQV9DRkxBR1MpKSwpCiskKFdMTkFNRSkteSArPSBhcF9oMjUubworZW5kaWYKK2VuZGlmCisKKyMgSWYgS0VSTkVMUkVMRUFTRSBpcyBkZWZpbmVkLCB3ZSd2ZSBiZWVuIGludm9rZWQgZnJvbSB0aGUKKyMga2VybmVsIGJ1aWxkIHN5c3RlbSBhbmQgY2FuIHVzZSBpdHMgbGFuZ3VhZ2UuCitpZm5lcSAoJChLRVJORUxSRUxFQVNFKSwpCisKK29iai1tCQkrPSAkKFdMTkFNRSkubworCiskKFdMTkFNRSkteSArPQl3bF9wcm9maWxlLm8gXAorCQl3bF93ZXh0Lm8gXAorCQl3bF9wcml2Lm8gXAorCQl3bF9tYWluLm8gXAorCQl3bF9lbmMubyBcCisJCXdsX3V0aWwubyBcCisJCXdsX25ldGRldi5vIFwKKwkJd2xfY3MubyBcCisJCW1tZC5vIFwKKwkJaGNmLm8gXAorCQlkaGYubworCiskKFdMTkFNRSktJChDT05GSUdfU1lTRlMpCSs9IHdsX3N5c2ZzLm8KKworIyBPdGhlcndpc2Ugd2Ugd2VyZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZAorIyBsaW5lOyBpbnZva2UgdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uCitlbHNlCisJS0VSTkVMRElSID89IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZAorCVBXRCA6PSAkKHNoZWxsIHB3ZCkKKworZGVmYXVsdDoKKwkkKE1BS0UpIC1DICQoS0VSTkVMRElSKSBNPSQoUFdEKSBtb2R1bGVzCitlbmRpZgorCitjbGVhbjoKKwlybSAtZnIgKi5vICoua28gKi5tb2QuYyAqLm1vZC5vIC4qLiouY21kIE1vZHVsZS5zeW12ZXJzIFwKKwkJTW9kdWxlLm1hcmtlcnMgbW9kdWxlcy5vcmRlciAudG1wX3ZlcnNpb25zCisKK2luc3RhbGw6IGRlZmF1bHQKKwktcm1tb2QgJChXTE5BTUUpCisJaW5zdGFsbCAtZCAkKElOU1RBTExESVIpCisJaW5zdGFsbCAtbSAwNjQ0IC1vIHJvb3QgLWcgcm9vdCAkKFdMTkFNRSkua28gJChJTlNUQUxMRElSKQorCS9zYmluL2RlcG1vZCAtYXEKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L1JFQURNRS50eHQgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdhODM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L1JFQURNRS50eHQKQEAgLTAsMCArMSwzMCBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1dMQU4gZHJpdmVyIGZvciBjYXJkcyB1c2luZyB0aGUgSEVSTUVTIElJIGFuZCBIRVJNRVMgSUkuNSBjaGlwc2V0CisKK0hFUk1FUyBJSSBDYXJkCisKK1BDTUNJQSBJbmZvOiAiQWdlcmUgU3lzdGVtcyIgIldpcmVsZXNzIFBDIENhcmQgTW9kZWwgMDExMCIKKyAgICAgICAgICAgICBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDAzCisKK0hFUk1FUyBJSS41IENhcmQKKworUENNQ0lBIEluZm86ICJMaW5rc3lzIiAiV0NGNTRHX1dpcmVsZXNzLUdfQ29tcGFjdEZsYXNoX0NhcmQiCisgICAgICAgICAgICAgTWFudWZhY3R1cmUgSUQ6IDAxNTYsMDAwNAorCitCYXNlZCBvbiBBZ2VyZSBTeXN0ZW1zIExpbnV4IExLTSBXaXJlbGVzcyBEcml2ZXIgU291cmNlIENvZGUsCitWZXJzaW9uIDcuMjI7IGNvbXBsaWVzIHdpdGggT3BlbiBTb3VyY2UgQlNEIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitERVNDUklQVElPTgorCitUaGlzIGRpcmVjdG9yeSBvbmx5IGNvbnRhaW5zIGZpbGVzIHRoYXQgcmVmZXIgdG8gdGhlIHNvdXJjZSBpbiB3bGFnczQ5X2gyLgorT25seSByZWFsIHNvdXJjZWZpbGVzIGFyZSB0aGUgTWFrZWZpbGUgd2hpY2ggaGFzIGJlZW4gY29uZmlndXJlZCB0byBidWlsZAordGhlIGRyaXZlciBmb3IgdGhlIEhFUk1FUyBJSS41IGNoaXBzZXQgYW5kIEtjb25maWcgdG8gZGVzY3JpYmUgdGhlIGRyaXZlci4KKworVGhlIHdsYWdzNDlfaDIgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBmdWxsIHNvdXJjZSwgaW5jbHVkaW5nIHRoZSBmaWxlcworZXhjbHVzaXZlbHkgdXNlZCBieSB0aGlzIGRyaXZlci4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRyaXZlciBsb29rIGF0IHRoZSB3bGFnczQ5X2gyIGRpcmVjb3J5LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWE0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvVE9ETwpAQCAtMCwwICsxLDMzIEBACitGaXJzdCBvZiBhbGwsIHRoZSBiZXN0IHRoaW5nIHdvdWxkIGJlIHRoYXQgdGhpcyBkcml2ZXIgYmVjb21lcyBvYnNvbHRlIGJ5CithZGRpbmcgc3VwcG9ydCBmb3IgSGVybWVzIElJIGFuZCBIZXJtZXMgSUkuNSBjYXJkcyB0byB0aGUgZXhpc3Rpbmcgb3Jpbm9jbworZHJpdmVyLiBUaGUgb3Jpbm9jbyBkcml2ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgSGVybWVzIEkgYmFzZWQgY2FyZHMuCitTaW5jZSB0aGlzIHdpbGwgbm90IGhhcHBlbiBieSBtYWdpYyBhbmQgaGFzIG5vdCBoYXBwZW5kIHVudGlsIG5vdyB0aGlzCitkcml2ZXIgcHJvdmlkZXMgYSBzdG9wLWdhcCBzb2x1dGlvbiBmb3IgdGhlc2UgdHlwZSBvZiBjYXJkcy4KKworSGF2aW5nIHNhaWQgdGhhdCwgdGhlIGZvbGxvd2luZyB3aXNobGlzdCBjb21lcyB0byBtaW5kIHRvIG1ha2UgdGhlIGRyaXZlcgorc3VpdGFibGUgYXMgZnVsbHkgc3VwcG9ydGVkIGtlcm5lbCBkcml2ZXIuIEZlZWwgZnJlZSB0byBleHBhbmQvZW5oYW5jZSB0aGUKK2xpc3QuCisKK1RPRE86CisJLSB2ZXJpZnkgYWdhaW5zdCBhIEhlcm1lcyBJSS41IGNhcmQKKwktIHZlcmlmeSB3aXRoIFdQQSBlbmNyaXB0aW9uIChib3RoIHdpdGggSDIgYW5kIEgyLjUgY2FyZHMpCisJLSBzb21ldGltZXMgdGhlIGNhcmQgZG9lcyBub3QgaW5pdGlhbGl6ZSBjb3JyZWN0bHksIHJldHJ5IG1lY2hhbmlzbXMKKwkgIGFyZSBidWlsZCBpbiB0byBjYXRjaCBtb3N0IGNhc2VzIGJ1dCBub3QgYWxsCisJLSBvbmNlIHRoZSBkcml2ZXIgcnVucyBpdCBpcyB2ZXJ5IHN0YWJsZSwgYnV0IEkgaGF2ZSB0aGUgaW1wcmVzc2lvbgorCSAgc29tZSB0aGUgY3JpdHRpY2FsIHNlY3Rpb25zIHRha2UgdG8gbG9uZworCS0gdGhlIGRyaXZlciBpcyBzcGxpdCBpbnRvIGEgSGVybWVzIElJIGFuZCBhIEhlcm1lcyBJSS41IHBhcnQsIGl0CisJICB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBib3RoIHdpdGggb25lIG1vZHVsZSBpbnN0ZWFkIG9mIHR3bworCS0gcmV2aWV3IGJ5IHRoZSB3aXJlbGVzcyBkZXZlbG9wZXIgY29tbXVuaXR5CisJLSB2ZXJpZnkgdGhlIGNvZGUgYWdhaW5zdCB0aGUgY29kaW5nIHN0YW5kYXJkcyBmb3IgYSBwcm9wcGVyIGxpbnV4CisJICBkcml2ZXIKKwktIHJlc29sdmUgbGljZW5zZSBpc3N1ZXMgKD8pCisKK0RPTkU6CisJLSB2ZXJpZmllZCBhZ2FpbnN0IGEgSGVybWVzIElJIGNhcmQgKFRob21zb24gU3BlZWR0b3VjaCAxMTAgUENNQ0lBCisJICBjYXJkKQorCS0gdmVyaWZpZWQgd2l0aCBXRVAgZW5jcmlwdGlvbgorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyBvciBjb21wbGFpbnRzIGFib3V0IHRoaXMgZHJpdmVyIHRvIEdyZWcKK0tyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgQ2M6IEhlbmsgZGUgR3Jvb3QgPHBlMWRubkBhbXNhdC5vcmc+CitEb24ndCBib3RoZXIgdGhlIHVwc3RyZWFtIHdpcmVsZXNzIGtlcm5lbCBkZXZlbG9wZXJzIGFib3V0IGl0LCB0aGV5Cit3YW50IG5vdGhpbmcgdG8gZG8gd2l0aCBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9hcF9oMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9hcF9oMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ0ZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2FwX2gyNS5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9hcF9oMjUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmYjEzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9kZWJ1Zy5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi9kZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzYyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2RoZi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTgxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2RoZi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZmNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2RoZmNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ODZlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvZGhmY2ZnLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2RoZmNmZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZWJhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2hjZi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTQzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2hjZi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZmNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZmNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OGM0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmY2ZnLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2hjZmNmZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZmRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L2hjZmRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTAwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvaGNmZGVmLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL2hjZmRlZi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21kZC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21kZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOGUxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbWRkLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL21kZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21tZC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21tZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDc4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbW1kLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL21tZC5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21tZC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L21tZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODRkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvbW1kLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL21tZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3N0YV9oMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9zdGFfaDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNzZiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9zdGFfaDI1LmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3N0YV9oMjUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlMWYxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9jcy5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9jcy5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2NzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdhY2VlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2NzLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX2NzLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfZW5jLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1OWRmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9lbmMuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfZW5jLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfZW5jLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlODYwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9lbmMuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfZW5jLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfaWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZDg2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfaWYuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfaWYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2ODdhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjMDZhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9tYWluLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX21haW4uYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9tYWluLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODM3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbWFpbi5oCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9tYWluLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1MTJjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9uZXRkZXYuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbmV0ZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfbmV0ZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5Y2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9uZXRkZXYuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfbmV0ZGV2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJpdi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ByaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBjODAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ByaXYuYwpAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfcHJpdi5jIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0OTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcml2LmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3ByaXYuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9wcm9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYWEyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJvZmlsZS5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF9wcm9maWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfcHJvZmlsZS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3Byb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI1M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3Byb2ZpbGUuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfcHJvZmlsZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU4ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3N5c2ZzLmMKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3N5c2ZzLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF9zeXNmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODE5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfc3lzZnMuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfc3lzZnMuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWJlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdXRpbC5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF91dGlsLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfdXRpbC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q3NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3V0aWwuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfdXRpbC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzOGU4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF92ZXJzaW9uLmgKQEAgLTAsMCArMSwyIEBACisvKiBVc2UgY29tbW9uIHNvdXJjZSBmcm9tIHdsYWdzNDlfaDIgKi8KKyNpbmNsdWRlICIuLi93bGFnczQ5X2gyL3dsX3ZlcnNpb24uaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS93bF93ZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfd2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfd2V4dC5jCkBAIC0wLDAgKzEsMiBAQAorLyogVXNlIGNvbW1vbiBzb3VyY2UgZnJvbSB3bGFnczQ5X2gyICovCisjaW5jbHVkZSAiLi4vd2xhZ3M0OV9oMi93bF93ZXh0LmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvd2xfd2V4dC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3dleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQ2Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L3dsX3dleHQuaApAQCAtMCwwICsxLDIgQEAKKy8qIFVzZSBjb21tb24gc291cmNlIGZyb20gd2xhZ3M0OV9oMiAqLworI2luY2x1ZGUgIi4uL3dsYWdzNDlfaDIvd2xfd2V4dC5oIgo=